[
  {
    "path": "CNAME",
    "content": "officetohtml.js.org\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 Tady\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "officeToHtml\n==========\n[![MIT License][license-image]][license-url]\n\n[license-image]: http://img.shields.io/badge/license-MIT-blue.svg?style=flat\n[license-url]: LICENSE\n\njQuery plugin written in pure javascript for converting modern microsoft office files, pptx,docx,xlsx and pdf to html.\n\nThe plugin integrates other libraries like PPTXjs, mammoth.js,SheetJs Combined with handsontable and PDF.js, designed to convert Office files and pdf file to HTML.\n\nThis project replaces my older project called <a href=\"https://github.com/meshesha/OfficeJs\">OfficeJs</a> so the version does not start from 1.0.0.\n\n### Version:\n* 1.2.1\n\n### Support:\n* pdf viewer\n* docx viewer\n* pptx viewer\n* Excel sheet viewer\n* image viewer\n\n### Demo\n* See demo <a href=\"https://officetohtml.js.org/pages/demos.html\" target=\"_blank\">here</a>.\n\n###  usage:\n* See page <a href=\"https://officetohtml.js.org/pages/docs.html\" target=\"_blank\">here</a>.\n\n### LICENSE:\n* MIT\n"
  },
  {
    "path": "example/images/index.html",
    "content": ""
  },
  {
    "path": "example/index.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n<title>OfficeToHtml</title>\r\n<meta charset=\"utf-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\">\r\n<link href=\"layout/styles/layout.css\" rel=\"stylesheet\" type=\"text/css\" media=\"all\">\r\n<script src=\"layout/scripts/jquery.min.js\"></script>\r\n</head>\r\n<body id=\"top\">\r\n<div class=\"wrapper bgded\" style=\"background-image:url('images/office2html2.png');background-size: 75%;\">\r\n  <div id=\"pageintro\" class=\"hoc split clear\">\r\n    <article class=\"box bg-coloured clear\"> \r\n      <h2 class=\"heading\">OfficeToHtml</h2>\r\n      <p>jQuery plugin for convertation pptx,docx,xlsx and pdf to html using pure javascript.</p>\r\n      <footer>\r\n        <ul class=\"nospace inline pushright\">\r\n          <li><a class=\"btn inverse\" href=\"https://github.com/meshesha/officeToHtml\">GitHub</a></li>\r\n        </ul>\r\n      </footer>\r\n    </article>\r\n  </div>\r\n</div>\r\n<div class=\"wrapper row1\">\r\n  <header id=\"header\" class=\"hoc clear\">\r\n    <div id=\"logo\" class=\"fl_left\">\r\n      <h1><a href=\"index.html\">Office To Html</a></h1>\r\n    </div>\r\n    <nav id=\"mainav\" class=\"fl_right\">\r\n      <ul class=\"clear\">\r\n        <li class=\"active\"><a href=\"index.html\">Home</a></li>\r\n        <li><a href=\"pages/docs.html\">Docs</a></li>\r\n        <li><a href=\"pages/demos.html\">Demos</a></li>\r\n        <li><a href=\"https://github.com/meshesha/officeToHtml\">GitHub</a></li>\r\n        <li><a href=\"https://github.com/meshesha\">About</a></li>\r\n      </ul>\r\n    </nav>\r\n  </header>\r\n</div>\r\n<div class=\"wrapper row3\">\r\n  <main class=\"hoc container clear\"> \r\n    <!-- main body -->\r\n    <!-- ################################################################################################ -->\r\n    <div class=\"one_half first clear btmspace-80\">\r\n      <h3 class=\"font-x2\">Description</h3>\r\n      <p class=\"font-x1\">jQuery plugin written in pure javascript for converting modern microsoft office files,\r\n          pptx,docx,xlsx and pdf to html.</p>\r\n      <p class=\"font-x1\">In fact it is an application that integrates other libraries like <a href=\"https://meshesha.github.io/pptxjs/\" target=\"_blank\">PPTXjs</a>,\r\n        <a href=\"https://github.com/mwilliamson/mammoth.js\" target=\"_blank\">mammoth.js</a>,<a href=\"https://github.com/sheetjs/js-xlsx\" target=\"_blank\">SheetJs</a> Combined with \r\n        <a href=\"https://handsontable.com/\" target=\"_blank\">handsontable</a>\r\n        and <a href=\"https://mozilla.github.io/pdf.js/\" target=\"_blank\">PDF.js</a>, \r\n        designed to convert Office files and pdf file to HTML.</p>\r\n    </div>\r\n    <div class=\"group\">\r\n      <article class=\"one_quarter first\">\r\n        <h4>Supported browsers</h4>\r\n        <p>Supports modern browsers such as FireFox, Chrome, Edge etc.\r\n            But I have not checked in all browsers.For more information, read the support for each of the above libraries.</p>\r\n      </article>\r\n      <article class=\"one_quarter\">\r\n        <h4>LICENSE </h4>\r\n        <span>OfficeToHtml and PPTXjs : <a href=\"https://github.com/meshesha/PPTXjs/blob/master/LICENSE\" target=\"_blank\">MIT.</a></span>\r\n        <span>mammoth.js : <a href=\"https://github.com/mwilliamson/mammoth.js/blob/master/LICENSE\" target=\"_blank\">BSD 2.</a></span><br>\r\n        <span>SheetJs : <a href=\"https://github.com/SheetJS/js-xlsx/blob/master/LICENSE\" target=\"_blank\">Apache 2.0.</a></span><br>\r\n        <span>pdf.js: <a href=\"https://github.com/mozilla/pdf.js/blob/master/LICENSE\" target=\"_blank\">Apache 2.0.</a></span><br>\r\n        <span>handsontable : <a href=\"https://github.com/handsontable/handsontable/blob/master/LICENSE\" target=\"_blank\">MIT.</a></span>\r\n      </article>\r\n      <article class=\"one_quarter\">\r\n          <h4>DOCS</h4>\r\n          <p>See Demos.</p>\r\n      </article>\r\n      <article class=\"one_quarter\">\r\n        <h4>issues</h4>\r\n        <p>.doc and .ppt files not supported.</p>\r\n      </article>\r\n    </div>\r\n    <!-- ################################################################################################ -->\r\n    <!-- / main body -->\r\n    <div class=\"clear\"></div>\r\n  </main>\r\n</div>\r\n\r\n<div class=\"wrapper row5\">\r\n  <div id=\"copyright\" class=\"hoc clear\"> \r\n    <p class=\"fl_left\">Copyright &copy; 2017 - All Rights Reserved - <a href=\"https://github.com/meshesha/\">Tady Meshesha</a></p>\r\n    <p class=\"fl_right\">Template by <a target=\"_blank\" href=\"http://www.os-templates.com/\" title=\"Free Website Templates\">OS Templates</a></p>\r\n  </div>\r\n</div>\r\n<a id=\"backtotop\" href=\"#top\"><i class=\"fa fa-chevron-up\"></i></a>\r\n<!-- JAVASCRIPTS -->\r\n</body>\r\n</html>"
  },
  {
    "path": "example/layout/index.html",
    "content": ""
  },
  {
    "path": "example/layout/scripts/index.html",
    "content": ""
  },
  {
    "path": "example/layout/scripts/jquery.backtotop.js",
    "content": "/*\r\nTemplate Name: Epigosha\r\nAuthor: <a href=\"http://www.os-templates.com/\">OS Templates</a>\r\nAuthor URI: http://www.os-templates.com/\r\nLicence: Free to use under our free template licence terms\r\nLicence URI: http://www.os-templates.com/template-terms\r\nFile: Back to Top JS\r\n*/\r\n\r\njQuery(\"#backtotop\").click(function () {\r\n    jQuery(\"body,html\").animate({\r\n        scrollTop: 0\r\n    }, 600);\r\n});\r\njQuery(window).scroll(function () {\r\n    if (jQuery(window).scrollTop() > 150) {\r\n        jQuery(\"#backtotop\").addClass(\"visible\");\r\n    } else {\r\n        jQuery(\"#backtotop\").removeClass(\"visible\");\r\n    }\r\n});"
  },
  {
    "path": "example/layout/scripts/jquery.mobilemenu.js",
    "content": "/*\r\nTemplate Name: Epigosha\r\nAuthor: <a href=\"http://www.os-templates.com/\">OS Templates</a>\r\nAuthor URI: http://www.os-templates.com/\r\nLicence: Free to use under our free template licence terms\r\nLicence URI: http://www.os-templates.com/template-terms\r\nFile: Mobile Menu JS\r\n\r\nThanks to:\r\n\"Convert a Menu to a Dropdown for Small Screens\" from Chris Collier - http://css-tricks.com/convert-menu-to-dropdown/\r\n\"Submenu's with a dash\" Daryn St. Pierre - http://jsfiddle.net/bloqhead/Kq43X/\r\n*/\r\n\r\n$('<form action=\"#\"><select /></form>').appendTo(\"#mainav\");$(\"<option />\",{selected:\"selected\",value:\"\",text:\"MENU\"}).appendTo(\"#mainav select\");$(\"#mainav a\").each(function(){var e=$(this);if($(e).parents(\"ul ul ul\").length>=1){$(\"<option />\",{value:e.attr(\"href\"),text:\"- - - \"+e.text()}).appendTo(\"#mainav select\")}else if($(e).parents(\"ul ul\").length>=1){$(\"<option />\",{value:e.attr(\"href\"),text:\"- - \"+e.text()}).appendTo(\"#mainav select\")}else if($(e).parents(\"ul\").length>=1){$(\"<option />\",{value:e.attr(\"href\"),text:\"\"+e.text()}).appendTo(\"#mainav select\")}else{$(\"<option />\",{value:e.attr(\"href\"),text:e.text()}).appendTo(\"#mainav select\")}});$(\"#mainav select\").change(function(){if($(this).find(\"option:selected\").val()!==\"#\"){window.location=$(this).find(\"option:selected\").val()}})"
  },
  {
    "path": "example/layout/styles/fonts/index.html",
    "content": ""
  },
  {
    "path": "example/layout/styles/framework.css",
    "content": "@charset \"utf-8\";\r\n/*\r\nTemplate Name: Epigosha\r\nAuthor: <a href=\"http://www.os-templates.com/\">OS Templates</a>\r\nAuthor URI: http://www.os-templates.com/\r\nLicence: Free to use under our free template licence terms\r\nLicence URI: http://www.os-templates.com/template-terms\r\nFile: Framework CSS\r\n*/\r\n\r\nhtml{overflow-y:scroll; overflow-x:hidden;} /* overflow-x:hidden; is required to prevent a horizontal scrollbar when using the split box elements */\r\nhtml, body{margin:0; padding:0; font-size:14px; line-height:1.6em;}\r\n\r\n*, *::before, *::after{box-sizing:border-box;}\r\n\r\n.bold{font-weight:bold;}\r\n.center{text-align:center;}\r\n.right{text-align:right;}\r\n.uppercase{text-transform:uppercase;}\r\n.capitalise{text-transform:capitalize;}\r\n.hidden{display:none;}\r\n.nospace{margin:0; padding:0; list-style:none;}\r\n.block{display:block;}\r\n.inline *{display:inline-block;}\r\n.inline *:last-child{margin-right:0;}\r\n.pushright li{margin-right:20px;}\r\n.pushright li:last-child{margin-right:0;}\r\n.borderedbox{border:1px solid;}\r\n.overlay{position:relative; z-index:1;}\r\n.overlay::after{display:block; position:absolute; top:0; left:0; width:100%; height:100%; content:\"\"; z-index:-1;}\r\n.bgded{background-position:top center; background-repeat:no-repeat; background-size:cover;}\r\n.circle{border-radius:50%; background-clip:padding-box;}\r\n\r\n.btn{display:inline-block; padding:15px 25px 17px; text-transform:uppercase; border:1px solid;}\r\n.btn.medium{padding:10px 20px 12px;}\r\n.btn.small{padding:8px 18px 10px; text-transform:none;}\r\n\r\n.split{background-position:top right; background-repeat:no-repeat; background-size:cover;}\r\n.split .box{display:block; position:relative; float:right; width:65%; padding:80px 0 80px 50px;}\r\n.split .box::after{display:block; position:absolute; top:0; right:-1000%; bottom:0; left:100%; content:\"\";}\r\n.split .box.left{float:left; padding-right:50px; padding-left:0;}\r\n.split .box.left::after{left:-1000%; right:100%;}\r\n\r\n.clear, .group{display:block;}\r\n.clear::before, .clear::after, .group::before, .group::after{display:table; content:\"\";}\r\n.clear, .clear::after, .group, .group::after{clear:both;}\r\n\r\na{outline:none; text-decoration:none;}\r\n\r\n.fl_left, .imgl{float:left;}\r\n.fl_right, .imgr{float:right;}\r\n\r\n.imgl{margin:0 15px 10px 0; clear:left;}\r\n.imgr{margin:0 0 10px 15px; clear:right;}\r\n\r\n\r\n/* Fonts\r\n--------------------------------------------------------------------------------------------------------------- */\r\nbody, input, textarea, select{font-family:Verdana, Geneva, sans-serif;}\r\nh1, h2, h3, h4, h5, h6, .heading{font-family:Georgia, \"Times New Roman\", Times, serif;}\r\n\r\n\r\n/* Forms\r\n--------------------------------------------------------------------------------------------------------------- */\r\nform, fieldset, legend{margin:0; padding:0; border:none;}\r\nlegend{display:none;}\r\nlabel, input, textarea, select, button{display:block; resize:none; outline:none; color:inherit; font-size:inherit; font-family:inherit; vertical-align:middle;}\r\nlabel{margin-bottom:5px;}\r\n:required, :invalid{outline:none; box-shadow:none;}\r\n\r\n\r\n/* Generalise\r\n--------------------------------------------------------------------------------------------------------------- */\r\nh1, h2, h3, h4, h5, h6, .heading{margin:0 0 20px 0; font-size:22px; line-height:normal; font-weight:normal; text-transform:capitalize; font-variant:small-caps;}\r\n\r\naddress{font-style:normal; font-weight:normal;}\r\nhr{display:block; width:100%; height:1px; border:solid; border-width:1px 0 0 0;}\r\n\r\n.font-xs{font-size:.8rem;}\r\n.font-x1{font-size:1.2rem;}\r\n.font-x2{font-size:1.8rem; line-height:normal;}\r\n.font-x3{font-size:2.8rem; line-height:normal;}\r\n\r\n.wrapper{display:block; width:100%; margin:0; padding:0; text-align:left; word-wrap:break-word;}\r\n/*\r\nThe \"hoc\" class is a generic class used to centre a containing element horizontally\r\nIt should be used in conjunction with a second class or ID\r\n*/\r\n.hoc{display:block; margin:0 auto;}\r\n\r\n\r\n/* HTML 5 Overrides\r\n--------------------------------------------------------------------------------------------------------------- */\r\naddress, article, aside, figcaption, figure, footer, header, main, nav, section{display:block; margin:0; padding:0;}\r\n\r\n\r\n/* Grid\r\n--------------------------------------------------------------------------------------------------------------- */\r\n.one_half, .one_third, .two_third, .one_quarter, .two_quarter, .three_quarter{display:inline-block; float:left; margin:0 0 0 3.06748466257669%; list-style:none;}\r\n\r\n.first{margin-left:0; clear:left;}\r\n\r\n.one_quarter{width:22.69938650306748%;}\r\n.one_third{width:31.28834355828221%;}\r\n.one_half, .two_quarter{width:48.46625766871166%;}\r\n.two_third{width:65.6441717791411%;}\r\n.three_quarter{width:74.23312883435584%;}\r\n\r\n\r\n/* Spacing\r\n--------------------------------------------------------------------------------------------------------------- */\r\n.btmspace-10{margin-bottom:10px;}\r\n.btmspace-15{margin-bottom:15px;}\r\n.btmspace-30{margin-bottom:30px;}\r\n.btmspace-50{margin-bottom:50px;}\r\n.btmspace-80{margin-bottom:80px;}\r\n\r\n.inspace-5{padding:5px;}\r\n.inspace-10{padding:10px;}\r\n.inspace-15{padding:15px;}\r\n.inspace-30{padding:30px;}\r\n.inspace-50{padding:50px;}\r\n.inspace-80{padding:80px;}"
  },
  {
    "path": "example/layout/styles/index.html",
    "content": ""
  },
  {
    "path": "example/layout/styles/layout.css",
    "content": "@charset \"utf-8\";\r\n/*\r\nTemplate Name: Epigosha\r\nAuthor: <a href=\"http://www.os-templates.com/\">OS Templates</a>\r\nAuthor URI: http://www.os-templates.com/\r\nLicence: Free to use under our free template licence terms\r\nLicence URI: http://www.os-templates.com/template-terms\r\nFile: Layout CSS\r\n*/\r\n\r\n@import url(\"fontawesome-4.5.0.min.css\");\r\n@import url(\"framework.css\");\r\n\r\n/* Rows\r\n--------------------------------------------------------------------------------------------------------------- */\r\n.row1{border-bottom:1px solid;}\r\n.row2, .row2 a{}\r\n.row3, .row3 a{}\r\n.row4, .row4 a{}\r\n.row5{border-top:1px solid;}\r\n\r\n\r\n/* Page Intro\r\n--------------------------------------------------------------------------------------------------------------- */\r\n#pageintro .box{padding-top:150px; padding-bottom:150px;}\r\n\r\n#pageintro article{}\r\n#pageintro article .heading{margin-bottom:30px; font-size:36px;}\r\n#pageintro article p{font-size:16px;}\r\n#pageintro article footer{margin-top:50px;}\r\n\r\n\r\n/* Header\r\n--------------------------------------------------------------------------------------------------------------- */\r\n#header{}\r\n\r\n#header #logo{margin:29px 0 0 0;}\r\n#header #logo h1{margin:0; padding:0; font-size:22px; line-height:1; text-transform:uppercase;}\r\n\r\n\r\n/* Content Area\r\n--------------------------------------------------------------------------------------------------------------- */\r\n.container{padding:80px 0;}\r\n\r\n/* Content */\r\n.container .content{}\r\n\r\n#stats{text-align:center;}\r\n#stats li *{margin:0; padding:0;}\r\n#stats li:last-child{margin-bottom:0;}/* Used in mobile devices when elements stack */\r\n#stats li i{margin-bottom:30px;}\r\n#stats li p:first-of-type{margin-bottom:30px; font-size:32px; font-weight:700;}\r\n#stats li p:last-of-type{text-transform:uppercase;}\r\n\r\n.latest{}\r\n.latest figure{display:inline-block; position:relative; max-width:100%; margin-bottom:30px;}\r\n.latest figure figcaption{display:block; position:absolute; top:10px; left:10px; width:60px; height:auto; padding:8px 0; border:1px solid; text-align:center;}\r\n.latest figure figcaption *{display:block; margin:0; padding:0;}\r\n.latest figure figcaption strong{margin-bottom:-5px;}\r\n.latest .heading, .latest p{margin:0; padding:0;}\r\n.latest .heading{margin-bottom:10px;}\r\n.latest p:last-of-type{margin:20px 0 0 0;}\r\n\r\n/* Comments */\r\n#comments ul{margin:0 0 40px 0; padding:0; list-style:none;}\r\n#comments li{margin:0 0 10px 0; padding:15px;}\r\n#comments .avatar{float:right; margin:0 0 10px 10px; padding:3px; border:1px solid;}\r\n#comments address{font-weight:bold;}\r\n#comments time{font-size:smaller;}\r\n#comments .comcont{display:block; margin:0; padding:0;}\r\n#comments .comcont p{margin:10px 5px 10px 0; padding:0;}\r\n\r\n#comments form{display:block; width:100%;}\r\n#comments input, #comments textarea{width:100%; padding:10px; border:1px solid;}\r\n#comments textarea{overflow:auto;}\r\n#comments div{margin-bottom:15px;}\r\n#comments input[type=\"submit\"], #comments input[type=\"reset\"]{display:inline-block; width:auto; min-width:150px; margin:0; padding:8px 5px; cursor:pointer;}\r\n\r\n/* Sidebar */\r\n.container .sidebar{}\r\n\r\n.sidebar .sdb_holder{margin-bottom:50px;}\r\n.sidebar .sdb_holder:last-child{margin-bottom:0;}\r\n\r\n\r\n/* Elements\r\n--------------------------------------------------------------------------------------------------------------- */\r\n#elements{}\r\n\r\n#elements article{display:block; position:relative; min-height:80px; margin:0 0 30px 0; padding:0 0 0 40px;}\r\n#elements article:last-child{margin:0;}\r\n#elements article *{margin:0;}\r\n#elements article i{display:block; position:absolute; top:0; left:0; font-size:24px;}\r\n#elements article .heading{margin-bottom:10px; font-size:1.2rem;}\r\n#elements article p{margin-bottom:10px;}\r\n\r\n\r\n/* CTA - Click To Action\r\n--------------------------------------------------------------------------------------------------------------- */\r\n#cta{text-align:center;}\r\n\r\n#cta *{margin:0;}\r\n#cta .heading{margin-bottom:50px;}\r\n\r\n\r\n/* Footer\r\n--------------------------------------------------------------------------------------------------------------- */\r\n#footer{padding:80px 0 50px;}\r\n\r\n#footer .title{margin:0 0 50px 0; padding:0; font-size:1.2rem;}\r\n\r\n#footer .linklist li{display:block; margin-bottom:15px; padding:0 0 15px 0; border-bottom:1px solid;}\r\n#footer .linklist li:last-child{margin:0; padding:0; border:none;}\r\n#footer .linklist li::before, #footer .linklist li::after{display:table; content:\"\";}\r\n#footer .linklist li, #footer .linklist li::after{clear:both;}\r\n\r\n#footer .contact{}\r\n#footer .contact.linklist li, #footer .contact.linklist li:last-child{position:relative; padding-left:40px;}\r\n#footer .contact li *{margin:0; padding:0; line-height:1.6;}\r\n#footer .contact li i{display:block; position:absolute; top:0; left:0; width:30px; font-size:16px; text-align:center;}\r\n\r\n\r\n/* Copyright\r\n--------------------------------------------------------------------------------------------------------------- */\r\n#copyright{padding:30px 0;}\r\n#copyright *{margin:0; padding:0;}\r\n\r\n\r\n/* Transition Fade\r\n--------------------------------------------------------------------------------------------------------------- \r\n*, *::before, *::after{transition:all .3s ease-in-out;}\r\n#mainav form *{transition:none !important;}\r\n*/\r\n\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n\r\n\r\n/* Navigation\r\n--------------------------------------------------------------------------------------------------------------- */\r\nnav ul, nav ol{margin:0; padding:0; list-style:none;}\r\n\r\n#mainav, #breadcrumb, .sidebar nav{line-height:normal;}\r\n#mainav .drop::after, #mainav li li .drop::after, #breadcrumb li a::after, .sidebar nav a::after{position:absolute; font-family:\"FontAwesome\"; font-size:10px; line-height:10px;}\r\n\r\n/* Top Navigation */\r\n#mainav{}\r\n#mainav ul.clear{}\r\n#mainav ul{text-transform:uppercase;}\r\n#mainav ul ul{z-index:9999; position:absolute; width:180px; text-transform:none;}\r\n#mainav ul ul ul{left:180px; top:0;}\r\n#mainav li{display:inline-block; position:relative; margin:0 15px 0 0; padding:0;}\r\n#mainav li:last-child{margin-right:0;}\r\n#mainav li li{width:100%; margin:0;}\r\n#mainav li a{display:block; padding:30px 0;}\r\n#mainav li li a{border:solid; border-width:0 0 1px 0;}\r\n#mainav .drop{padding-left:15px;}\r\n#mainav li li a, #mainav li li .drop{display:block; margin:0; padding:10px 15px;}\r\n#mainav .drop::after, #mainav li li .drop::after{content:\"\\f0d7\";}\r\n#mainav .drop::after{top:35px; left:5px;}\r\n#mainav li li .drop::after{top:15px; left:5px;}\r\n#mainav ul ul{visibility:hidden; opacity:0;}\r\n#mainav ul li:hover > ul{visibility:visible; opacity:1;}\r\n\r\n#mainav form{display:none; margin:0; padding:0;}\r\n#mainav form select, #mainav form select option{display:block; cursor:pointer; outline:none;}\r\n#mainav form select{width:100%; padding:5px; border:none;}\r\n#mainav form select option{margin:5px; padding:0; border:none;}\r\n\r\n/* Breadcrumb */\r\n#breadcrumb{padding:50px 0 20px;}\r\n#breadcrumb ul{margin:0; padding:0; list-style:none; font-variant:small-caps;}\r\n#breadcrumb li{display:inline-block; margin:0 6px 0 0; padding:0;}\r\n#breadcrumb li a{display:block; position:relative; margin:0; padding:0 12px 0 0; font-size:12px;}\r\n#breadcrumb li a::after{top:3px; right:0; content:\"\\f101\";}\r\n#breadcrumb li:last-child a{margin:0; padding:0;}\r\n#breadcrumb li:last-child a::after{display:none;}\r\n\r\n/* Sidebar Navigation */\r\n.sidebar nav{display:block; width:100%;}\r\n.sidebar nav li{margin:0 0 3px 0; padding:0;}\r\n.sidebar nav a{display:block; position:relative; margin:0; padding:5px 10px 5px 15px; text-decoration:none; border:solid; border-width:0 0 1px 0;}\r\n.sidebar nav a::after{top:9px; left:5px; content:\"\\f101\";}\r\n.sidebar nav ul ul a{padding-left:35px;}\r\n.sidebar nav ul ul a::after{left:25px;}\r\n.sidebar nav ul ul ul a{padding-left:55px;}\r\n.sidebar nav ul ul ul a::after{left:45px;}\r\n\r\n/* Pagination */\r\n.pagination{display:block; width:100%; text-align:center; clear:both;}\r\n.pagination li{display:inline-block; margin:0 2px 0 0;}\r\n.pagination li:last-child{margin-right:0;}\r\n.pagination a, .pagination strong{display:block; padding:8px 11px; border:1px solid; background-clip:padding-box; font-weight:normal;}\r\n\r\n/* Back to Top */\r\n#backtotop{z-index:999; display:inline-block; position:fixed; visibility:hidden; bottom:20px; right:20px; width:36px; height:36px; line-height:36px; font-size:16px; text-align:center; opacity:.2;}\r\n#backtotop i{display:block; width:100%; height:100%; line-height:inherit;}\r\n#backtotop.visible{visibility:visible; opacity:.5;}\r\n#backtotop:hover{opacity:1;}\r\n\r\n\r\n/* Tables\r\n--------------------------------------------------------------------------------------------------------------- */\r\ntable, th, td{border:1px solid; border-collapse:collapse; vertical-align:top;}\r\ntable, th{table-layout:auto;}\r\ntable{width:100%; margin-bottom:15px;}\r\nth, td{padding:5px 8px;}\r\ntd{border-width:0 1px;}\r\n\r\n\r\n/* Gallery\r\n--------------------------------------------------------------------------------------------------------------- */\r\n#gallery{display:block; width:100%; margin-bottom:50px;}\r\n#gallery figure figcaption{display:block; width:100%; clear:both;}\r\n#gallery li{margin-bottom:30px;}\r\n\r\n\r\n/* Font Awesome Social Icons\r\n--------------------------------------------------------------------------------------------------------------- */\r\n.faico{margin:0; padding:0; list-style:none;}\r\n.faico li{display:inline-block; margin:8px 5px 0 0; padding:0; line-height:normal;}\r\n.faico li:last-child{margin-right:0;}\r\n.faico a{display:inline-block; width:36px; height:36px; line-height:36px; font-size:18px; text-align:center;}\r\n\r\n.faico a{color:#050505; background-color:#0F84AA;}\r\n.faico a:hover{color:#FFFFFF;}\r\n\r\n.faicon-dribble:hover{background-color:#EA4C89;}\r\n.faicon-facebook:hover{background-color:#3B5998;}\r\n.faicon-google-plus:hover{background-color:#DB4A39;}\r\n.faicon-linkedin:hover{background-color:#0E76A8;}\r\n.faicon-twitter:hover{background-color:#00ACEE;}\r\n.faicon-vk:hover{background-color:#4E658E;}\r\n\r\n\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n\r\n\r\n/* Colours\r\n--------------------------------------------------------------------------------------------------------------- */\r\nbody{color:#FFFFFF; background-color:#232323;}\r\na{color:#0F84AA;}\r\na:active, a:focus{background:transparent;}/* IE10 + 11 Bugfix - prevents grey background */\r\nhr, .borderedbox{border-color:#D7D7D7;}\r\nlabel span{color:#FF0000; background-color:inherit;}\r\ninput:focus, textarea:focus, *:required:focus{border-color:#0F84AA;}\r\n.overlay{color:#FFFFFF; background-color:inherit;}\r\n.overlay::after{color:inherit; background-color:rgba(0,0,0,.55);}\r\n\r\n.btn, .btn.inverse:hover{color:#FFFFFF; background-color:#0F84AA; border-color:#0F84AA;}\r\n.btn:hover, .btn.inverse{color:inherit; background-color:transparent; border-color:inherit;}\r\n\r\n.split .box, .split .box::after{color:#9B9B9B; background-color:rgba(35,35,35,.8);/* #232323 */}\r\n.split .box.bg-light, .split .box.bg-light::after{color:#232323; background-color:rgba(250,250,250,.85);/* #FAFAFA */}\r\n.split .box.bg-coloured, .split .box.bg-coloured::after{color:#FFFFFF; background-color:rgba(15,132,170,.65);/* #0F84AA */}\r\n\r\n\r\n/* Rows */\r\n.row1{color:#232323; background-color:#FAFAFA; border-color:#EBEBEB;}\r\n.row2{color:#232323; background-color:#EBEBEB;}\r\n.row3{color:#232323; background-color:#FFFFFF;}\r\n.row4{color:#9B9B9B; background-color:#232323;}\r\n.row5, .row5 a{color:#9B9B9B; background-color:#232323;}\r\n.row5{border-color:#404040;}\r\n\r\n\r\n/* Header */\r\n#header #logo a{color:inherit;}\r\n\r\n\r\n/* Content Area */\r\n.latest figure figcaption{color:#FFFFFF; background-color:rgba(0,0,0,.2); border-color:#FFFFFF;}\r\n\r\n\r\n/* Footer */\r\n#footer .title{color:#FFFFFF;}\r\n#footer .linklist li{border-color:#404040;}\r\n\r\n\r\n/* Navigation */\r\n#mainav li a{color:inherit;}\r\n#mainav .active a, #mainav a:hover, #mainav li:hover > a{color:#0F84AA; background-color:inherit;}\r\n#mainav li li a, #mainav .active li a{color:#FFFFFF; background-color:rgba(0,0,0,.6); border-color:rgba(0,0,0,.6);}\r\n#mainav li li:hover > a, #mainav .active .active > a{color:#FFFFFF; background-color:#0F84AA;}\r\n#mainav form select{color:#232323; background-color:#EBEBEB;}\r\n\r\n#breadcrumb a{color:inherit; background-color:inherit;}\r\n#breadcrumb li:last-child a{color:#0F84AA;}\r\n\r\n.container .sidebar nav a{color:inherit; border-color:#D7D7D7;}\r\n.container .sidebar nav a:hover{color:#0F84AA;}\r\n.container .sidebar .active a, .container .sidebar a:hover, .container .sidebar li:hover > a{color:#0F84AA; background-color:inherit;}\r\n\r\n.pagination a, .pagination strong{border-color:#D7D7D7;}\r\n.pagination .current *{color:#FFFFFF; background-color:#0F84AA;}\r\n\r\n#backtotop{color:#FFFFFF; background-color:#0F84AA;}\r\n\r\n\r\n/* Tables + Comments */\r\ntable, th, td, #comments .avatar, #comments input, #comments textarea{border-color:#D7D7D7;}\r\n#comments input:focus, #comments textarea:focus, #comments *:required:focus{border-color:#0F84AA;}\r\nth{color:#FFFFFF; background-color:#373737;}\r\ntr, #comments li, #comments input[type=\"submit\"], #comments input[type=\"reset\"]{color:inherit; background-color:#FBFBFB;}\r\ntr:nth-child(even), #comments li:nth-child(even){color:inherit; background-color:#F7F7F7;}\r\ntable a, #comments a{background-color:inherit;}\r\n\r\n\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n\r\n\r\n/* Media Queries\r\n--------------------------------------------------------------------------------------------------------------- */\r\n@-ms-viewport{width:device-width;}\r\n\r\n\r\n/* Max Wrapper Width - Laptop, Desktop etc.\r\n--------------------------------------------------------------------------------------------------------------- */\r\n@media screen and (min-width:978px){\r\n\t.hoc{max-width:978px;}\r\n}\r\n\r\n\r\n/* Mobile Devices\r\n--------------------------------------------------------------------------------------------------------------- */\r\n@media screen and (max-width:900px){\r\n\t.hoc{max-width:90%;}\r\n\r\n\t#header{padding:30px 0;}\r\n\t#header #logo{margin:7px 0 0 0;}\r\n\r\n\t#mainav{}\r\n\t#mainav ul{display:none;}\r\n\t#mainav form{display:block;}\r\n\r\n\t#breadcrumb{}\r\n\r\n\t.container{}\r\n\t#comments input[type=\"reset\"]{margin-top:10px;}\r\n\t.pagination li{display:inline-block; margin:0 5px 5px 0;}\r\n\r\n\t#footer{}\r\n\r\n\t#copyright{}\r\n\t#copyright p:first-of-type{margin-bottom:10px;}\r\n}\r\n\r\n\r\n@media screen and (max-width:750px){\r\n\t.imgl, .imgr{display:inline-block; float:none; margin:0 0 10px 0;}\r\n\t.fl_left, .fl_right{display:block; float:none;}\r\n\t.one_half, .one_third, .two_third, .one_quarter, .two_quarter, .three_quarter{display:block; float:none; width:auto; margin:0 0 30px 0; padding:0;}\r\n\r\n\t#header{text-align:center;}\r\n\t#header #logo{margin:0 0 15px 0;}\r\n}\r\n\r\n\r\n/* Other\r\n--------------------------------------------------------------------------------------------------------------- */\r\n@media screen and (max-width:650px){\r\n\t.scrollable{display:block; width:100%; margin:0 0 30px 0; padding:0 0 15px 0; overflow:auto; overflow-x:scroll;}\r\n\t.scrollable table{margin:0; padding:0; white-space:nowrap;}\r\n\r\n\t.inline li{display:block; margin-bottom:10px;}\r\n\t.pushright li{margin-right:0;}\r\n\r\n\t.hoc.split{max-width:none; width:100%;}\r\n\t.split .box, .split .box.left{float:none; width:100%; padding:5%;}\r\n\r\n\t.font-x2{font-size:1.4rem;}\r\n\t.font-x3{font-size:1.6rem;}\r\n\r\n\t#pageintro .box{padding:100px 5%;}\r\n}"
  },
  {
    "path": "example/pages/demos.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n  <title>OfficeJs | Demos </title>\n  <meta charset=\"utf-8\">\n  <link href=\"./layout/styles/layout.css\" rel=\"stylesheet\" type=\"text/css\">\n  <link rel=\"stylesheet\" href=\"./include/jquery_ui/themes/start/jquery-ui.min.css\">\n  <script src=\"./include/jquery/jquery-1.12.4.min.js\"></script>\n  <script src=\"./include/jquery_ui/jquery-ui.min.js\"></script>\n  <!-- ################################ For files reder ###############################-->\n  <!--PDF-->\n  <link rel=\"stylesheet\" href=\"./include/pdf/pdf.viewer.css\">\n  <script src=\"./include/pdf/pdf.js\"></script>\n  <!--Docs-->\n  <script src=\"./include/docx/jszip-utils.js\"></script>\n  <script src=\"./include/docx/mammoth.browser.min.js\"></script>\n  <!--PPTX-->\n  <link rel=\"stylesheet\" href=\"./include/PPTXjs/css/pptxjs.css\">\n  <link rel=\"stylesheet\" href=\"./include/PPTXjs/css/nv.d3.min.css\">\n  <script type=\"text/javascript\" src=\"./include/PPTXjs/js/filereader.js\"></script>\n  <script type=\"text/javascript\" src=\"./include/PPTXjs/js/d3.min.js\"></script>\n  <script type=\"text/javascript\" src=\"./include/PPTXjs/js/nv.d3.min.js\"></script>\n  <script type=\"text/javascript\" src=\"./include/PPTXjs/js/pptxjs.js\"></script>\n  <script type=\"text/javascript\" src=\"./include/PPTXjs/js/divs2slides.js\"></script>\n  <!--All Spreadsheet -->\n  <link rel=\"stylesheet\" href=\"./include/SheetJS/handsontable.full.min.css\">\n  <script type=\"text/javascript\" src=\"./include/SheetJS/handsontable.full.min.js\"></script>\n  <script type=\"text/javascript\" src=\"./include/SheetJS/xlsx.full.min.js\"></script>\n  <!--Image viewer-->\n  <link rel=\"stylesheet\" href=\"./include/verySimpleImageViewer/css/jquery.verySimpleImageViewer.css\">\n  <script type=\"text/javascript\" src=\"./include/verySimpleImageViewer/js/jquery.verySimpleImageViewer.js\"></script>\n  <!--officeToHtml-->\n  <script src=\"./include/officeToHtml/officeToHtml.js\"></script>\n  <link rel=\"stylesheet\" href=\"./include/officeToHtml/officeToHtml.css\">\n</head>\n\n<body id=\"top\">\n  <div class=\"wrapper row1\">\n    <header id=\"header\" class=\"hoc clear\">\n      <div id=\"logo\" class=\"fl_left\">\n        <h1><a href=\"../index.html\">Office To Html - Demos</a></h1>\n      </div>\n      <nav id=\"mainav\" class=\"fl_right\">\n        <ul class=\"clear\">\n          <li><a href=\"../index.html\">Home</a></li>\n          <li><a href=\"docs.html\">Docs</a></li>\n          <li class=\"active\"><a href=\"demos.html\">Demos</a></li>\n          <li><a href=\"https://github.com/meshesha/officeToHtml\">GitHub</a></li>\n          <li><a href=\"https://github.com/meshesha\">About</a></li>\n        </ul>\n      </nav>\n    </header>\n  </div>\n  <div class=\"wrapper row3\">\n    <main class=\"hoc container clear\">\n      <!-- main body -->\n      <div class=\"sidebar one_quarter first\">\n        <nav class=\"sdb_holder\">\n          <ul>\n            <li class=\"active\"><a href=\"demos.html\">Demos - Main</a></li>\n            <ul>\n              <li><a href=\"#\" id=\"demo_1\" class=\"demos\" data-file=\"demo.docx\">Demo1 - docx</a></li>\n              <li><a href=\"#\" id=\"demo_2\" class=\"demos\" data-file=\"demo.pptx\">Demo2 - pptx</a></li>\n              <li><a href=\"#\" id=\"demo_3\" class=\"demos\" data-file=\"demo.xlsx\">Demo3 - xlsx</a></li>\n              <li><a href=\"#\" id=\"demo_4\" class=\"demos\" data-file=\"demo.pdf\">Demo4 - pdf</a></li>\n              <li><a href=\"#\" id=\"demo_5\" class=\"demos\" data-file=\"demo.jpg\">Demo4 - image</a></li>\n              <li><a href=\"#\" id=\"demo_input\" class=\"demos\" data-file=\"\">Demo5 - Input</a></li>\n            </ul>\n          </ul>\n        </nav>\n      </div>\n      <!-- ################################################################################################ -->\n      <div class=\"content three_quarter\">\n        <div class=\"box bg-light clear\">\n          <h3 class=\"font-x2\" id=\"head-name\">Demos - Main</h3>\n          <p id=\"file_p\" style=\"display:none;\">File: <a href=\"#\" id=\"a_file\"></a><input type=\"file\" id=\"select_file\" />\n          </p>\n          <div id=\"description\">\n            <p>&lt;-- Select one of demos on left side</p>\n          </div>\n        </div>\n        <p id=\"resolte-text\" style=\"display:none\">Resolte:</p>\n        <!--<div id=\"resolte-contaniner\" style=\"display:none;\"></div>-->\n        <div style=\"overflow: hidden;width: 800px; \">\n          <div id=\"resolte-contaniner\" style=\"width: 100%; height:550px; overflow: auto;\"></div>\n        </div>\n        <script>\n          (function ($) {\n            $(\".demos\").on(\"click\", function (e) {\n              e.preventDefault();\n\n              $(\".sdb_holder li\").removeClass(\"active\");\n              $(this).parent().addClass(\"active\");\n              var id = $(this).attr(\"id\");\n              $(\"#head-name\").html($(this).html());\n              $(\"#description\").hide();\n              $(\"#resolte-contaniner\").html(\"\");\n              $(\"#resolte-contaniner\").show();\n              $(\"#resolte-text\").show();\n              if (id != \"demo_input\") {\n\n                $(\"#select_file\").hide();\n                var file_path = \"files\\\\\" + $(this).data(\"file\");\n                $(\"#a_file\").html($(this).data(\"file\")).attr(\"href\", file_path);\n                $(\"#a_file\").show();\n                $(\"#file_p\").show();\n\n                $(\"#resolte-contaniner\").officeToHtml({\n                  url: file_path,\n                  pdfSetting: {\n                    setLang: \"\",\n                    setLangFilesPath: \"\" /*\"include/pdf/lang/locale\" - relative to app path*/\n                  }\n                });\n              } else {\n\n                $(\"#select_file\").show();\n                $(\"#file_p\").show();\n                $(\"#a_file\").hide();\n\n                $(\"#resolte-contaniner\").officeToHtml({\n                  inputObjId: \"select_file\",\n                  pdfSetting: {\n                    setLang: \"\",\n                    setLangFilesPath: \"\" /*\"include/pdf/lang/locale\" - relative to app path*/\n                  }\n                });\n              }\n            });\n          }(jQuery));\n        </script>\n      </div>\n  </div>\n  <!-- / main body -->\n  <div class=\"clear\"></div>\n  </main>\n  </div>\n\n  <div class=\"wrapper row5\">\n    <div id=\"copyright\" class=\"hoc clear\">\n      <p class=\"fl_left\">Copyright &copy; 2017 - All Rights Reserved - <a href=\"https://github.com/meshesha/\">Tady\n          Meshesha</a></p>\n      <p class=\"fl_right\">Template by <a target=\"_blank\" href=\"http://www.os-templates.com/\"\n          title=\"Free Website Templates\">OS Templates</a></p>\n    </div>\n  </div>\n  <a id=\"backtotop\" href=\"#top\"><i class=\"fa fa-chevron-up\"></i></a>\n</body>\n\n</html>"
  },
  {
    "path": "example/pages/docs.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n<title>OfficeJs | Docs </title>\n<meta charset=\"utf-8\">\n<link href=\"../layout/styles/layout.css\" rel=\"stylesheet\" type=\"text/css\" media=\"all\">\n<link rel=\"stylesheet\" href=\"//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css\">\n<script src=\"//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js\"></script>\n<script>hljs.initHighlightingOnLoad();</script>\n<style>\n    .p_heads_1{\n        font-size: 18px;\n        color: rgb(4, 0, 255)\n    }\n    .p_heads_2{\n        font-size: 16px;\n        color: rgb(63, 60, 253)\n    }\n    .p_heads_3{\n        font-size: 14px;\n        color: rgb(98, 95, 255)\n    }\n</style>\n</head>\n<body id=\"top\">\n<div class=\"wrapper row1\">\n    <header id=\"header\" class=\"hoc clear\">\n        <div id=\"logo\" class=\"fl_left\">\n        <h1><a href=\"../index.html\">Office To Html - Docs</a></h1>\n        </div>\n        <nav id=\"mainav\" class=\"fl_right\">\n        <ul class=\"clear\">\n            <li><a href=\"../index.html\">Home</a></li>\n            <li class=\"active\"><a href=\"docs.html\">Docs</a></li>\n            <li><a href=\"demos.html\">Demos</a></li>\n            <li><a href=\"https://github.com/meshesha/officeToHtml\">GitHub</a></li>\n            <li><a href=\"https://github.com/meshesha\">About</a></li>\n        </ul>\n        </nav>\n    </header>\n</div>\n<div class=\"wrapper row3\">\n  <main class=\"hoc container clear\"> \n    <!-- main body -->\n    <!-- ################################################################################################ -->\n    <!-- using html encode (https://codebeautify.org/html-encode-string) -->\n    <div class=\"content three_quarter\"> \n        <div class=\"box bg-light clear\"> \n          <h3 class=\"font-x2\" id=\"head-name\">usage</h3>\n          <div id=\"description\">\n            <p class=\"p_heads_1\">1. Include all necessary .css and .js files in &lt;HEAD&gt; area:</p>\n            <pre>\n                <code>\n&lt;!--PDF--&gt; \n&lt;link rel=&quot;stylesheet&quot; href=&quot;./include/pdf/pdf.viewer.css&quot;&gt; \n&lt;script src=&quot;./include/pdf/pdf.js&quot;&gt;&lt;/script&gt; &lt;!--Docs--&gt;\n&lt;script src=&quot;./include/docx/jszip-utils.js&quot;&gt;&lt;/script&gt;\n&lt;script src=&quot;./include/docx/mammoth.browser.min.js&quot;&gt;&lt;/script&gt;\n&lt;!--PPTX--&gt;\n&lt;link rel=&quot;stylesheet&quot; href=&quot;./include/PPTXjs/css/pptxjs.css&quot;&gt;\n&lt;link rel=&quot;stylesheet&quot; href=&quot;./include/PPTXjs/css/nv.d3.min.css&quot;&gt;\n&lt;script type=&quot;text/javascript&quot; src=&quot;./include/PPTXjs/js/filereader.js&quot;&gt;&lt;/script&gt;\n&lt;script type=&quot;text/javascript&quot; src=&quot;./include/PPTXjs/js/d3.min.js&quot;&gt;&lt;/script&gt;\n&lt;script type=&quot;text/javascript&quot; src=&quot;./include/PPTXjs/js/nv.d3.min.js&quot;&gt;&lt;/script&gt;\n&lt;script type=&quot;text/javascript&quot; src=&quot;./include/PPTXjs/js/pptxjs.js&quot;&gt;&lt;/script&gt;\n&lt;script type=&quot;text/javascript&quot; src=&quot;./include/PPTXjs/js/divs2slides.js&quot;&gt;&lt;/script&gt;\n&lt;!--All Spreadsheet --&gt;\n&lt;link rel=&quot;stylesheet&quot; href=&quot;./include/SheetJS/handsontable.full.min.css&quot;&gt;\n&lt;script type=&quot;text/javascript&quot; src=&quot;./include/SheetJS/handsontable.full.min.js&quot;&gt;&lt;/script&gt;\n&lt;script type=&quot;text/javascript&quot; src=&quot;./include/SheetJS/xlsx.full.min.js&quot;&gt;&lt;/script&gt;\n&lt;!--Image viewer--&gt; \n&lt;link rel=&quot;stylesheet&quot; href=&quot;./include/verySimpleImageViewer/css/jquery.verySimpleImageViewer.css&quot;&gt;\n&lt;script type=&quot;text/javascript&quot; src=&quot;./include/verySimpleImageViewer/js/jquery.verySimpleImageViewer.js&quot;&gt;&lt;/script&gt;\n&lt;!--officeToHtml--&gt;\n&lt;script src=&quot;./include/officeToHtml.js&quot;&gt;&lt;/script&gt;\n&lt;link rel=&quot;stylesheet&quot; href=&quot;./include/officeToHtml.css&quot;&gt;\n                </code>\n            </pre>\n            <p class=\"p_heads_1\">2. Add &lt;Div&gt; with id in &lt;BODY&gt; area:</p>\n            <pre>\n                <code>\n&lt;div id=&quot;resolte-contaniner&quot;&gt;&lt;/div&gt;\n                </code>\n            </pre>\n            <p class=\"p_heads_1\">3.Use one or both javascript method to read file:</p>\n            <p class=\"p_heads_2\">a. For reading remote file :</p>\n            <pre>\n                <code>\nvar file_path = &quot;path/to/file.pptx&quot;; \n$(&quot;#resolte-contaniner&quot;).officeToHtml({\n   url: file_path\n});\n                </code>\n            </pre>\n            <p class=\"p_heads_2\">b. For reading local file using INPUT object :</p>\n            <p class=\"p_heads_3\">b1. First add &lt;Input&gt; with id in &lt;BODY&gt; area:</p>\n            <pre>\n                <code>\n&lt;input type=&quot;file&quot; id=&quot;select_file&quot; /&gt;                    \n                </code>\n            </pre>\n            <p class=\"p_heads_3\">b2. And then use next script:</p>\n            <pre>\n                <code>\n$(&quot;#resolte-contaniner&quot;).officeToHtml({\n  inputObjId: \"select_file\"\n});\n                </code>\n            </pre>\n            \n            <p class=\"p_heads_1\">4.options and settings:</p>\n            <pre>\n                <code>\n$(&quot;#resolte-contaniner&quot;).officeToHtml({\n    url: file_path,\n    inputObjId: &quot;select_file&quot;,\n    pdfSetting: {\n        // setting for pdf\n    },\n    docxSetting: {\n        // setting for docx\n    },\n    pptxSetting: {\n        // setting for pptx\n    },\n    sheetSetting: {\n        // setting for excel\n    },\n    imageSetting: {\n        // setting for  images\n    }\n});                    \n                </code>\n            </pre>  \n            <p class=\"p_heads_2\">a.pdfSetting:</p>\n            <pre>\n                <code>\n$(&quot;#resolte-contaniner&quot;).officeToHtml({\n    url: file_path,\n    inputObjId: &quot;select_file&quot;,\n    pdfSetting: {\n        setLang: \"he\",\n        thumbnailViewBtn: true,\n        searchBtn: true,\n        nextPreviousBtn: true,\n        pageNumberTxt: true,\n        totalPagesLabel: true,\n        zoomBtns: true,\n        scaleSelector: true,\n        presantationModeBtn: true,\n        openFileBtn: true,\n        printBtn: true,\n        downloadBtn: true,\n        bookmarkBtn: true,\n        secondaryToolbarBtn: true,\n        firstPageBtn: true,\n        lastPageBtn: true,\n        pageRotateCwBtn: true,\n        pageRotateCcwBtn: true,\n        cursorSelectTextToolbarBtn: true,\n        cursorHandToolbarBtn: true\n    }\n});                    \n                </code>\n            </pre>\n            <a href=\"pdfViewer.png\" target=\"_blank\"><img src=\"pdfViewer.png\" style=\"width:99%; height: 60%; \" /></a>\n            <style type=\"text/css\">\n                /*the tables genereted by web-site: https://www.tablesgenerator.com/html_tables */\n                .tg  {border-collapse:collapse;border-spacing:0;}\n                .tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}\n                .tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}\n                .tg .tg-jc4p{font-size:16px;background-color:#00009b;color:#ffffff;vertical-align:top}\n                .tg .tg-yw4l{vertical-align:top}\n                </style>\n                <table class=\"tg\">\n                  <tr>\n                    <th class=\"tg-jc4p\">#</th>\n                    <th class=\"tg-jc4p\">name</th>\n                    <th class=\"tg-jc4p\">description</th>\n                    <th class=\"tg-jc4p\">default value</th>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">1</td>\n                    <td class=\"tg-yw4l\">setLang<br></td>\n                    <td class=\"tg-yw4l\">set manually the interface language(short name code) -click here to see all supported languages:  <a href=\"lang.html\">link.</a>\n                        <br>if set to \"\" or not set at all then the language will be as the browser interface language or English if it is not\n                        supported.   \n                    </td>\n                    <td class=\"tg-yw4l\">\"\"</td>\n                  </tr><tr>\n                    <td class=\"tg-yw4l\">1</td>\n                    <td class=\"tg-yw4l\">thumbnailViewBtn<br></td>\n                    <td class=\"tg-yw4l\">Thumbnail viewer button (true - view button, false - hide button).<br></td>\n                    <td class=\"tg-yw4l\">true</td>\n                </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">2</td>\n                    <td class=\"tg-yw4l\">searchBtn<br></td>\n                    <td class=\"tg-yw4l\">Seraching button (true - view button, false - hide button).</td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">3</td>\n                    <td class=\"tg-yw4l\">nextPreviousBtn<br></td>\n                    <td class=\"tg-yw4l\">next and previous button (true - view button, false - hide button).</td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">4</td>\n                    <td class=\"tg-yw4l\">pageNumberTxt<br></td>\n                    <td class=\"tg-yw4l\">page number textbox&nbsp;&nbsp;(true - view text, false - hide text).</td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">5</td>\n                    <td class=\"tg-yw4l\">totalPagesLabel<br></td>\n                    <td class=\"tg-yw4l\">total pages label  (true - view label, false - hide label).</td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">6</td>\n                    <td class=\"tg-yw4l\">zoomBtns<br></td>\n                    <td class=\"tg-yw4l\">zoom&nbsp;&nbsp;buttons (true - view buttons, false - hide buttons).</td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">7</td>\n                    <td class=\"tg-yw4l\">scaleSelector<br></td>\n                    <td class=\"tg-yw4l\">scale selector (true - view selector, false - hide selector).</td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">8</td>\n                    <td class=\"tg-yw4l\">presantationModeBtn<br></td>\n                    <td class=\"tg-yw4l\">presentation mode&nbsp;&nbsp;button (true - view button, false - hide button).</td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">9</td>\n                    <td class=\"tg-yw4l\">openFileBtn<br></td>\n                    <td class=\"tg-yw4l\">open file&nbsp;&nbsp;button (true - view button, false - hide button).</td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">10</td>\n                    <td class=\"tg-yw4l\">printBtn<br></td>\n                    <td class=\"tg-yw4l\">print&nbsp;&nbsp;button (true - view button, false - hide button).</td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">11</td>\n                    <td class=\"tg-yw4l\">downloadBtn<br></td>\n                    <td class=\"tg-yw4l\">download&nbsp;&nbsp;button (true - view button, false - hide button).</td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">12</td>\n                    <td class=\"tg-yw4l\">bookmarkBtn<br></td>\n                    <td class=\"tg-yw4l\">bookmark&nbsp;&nbsp;button - open current view in new window (true - view button, false - hide button).</td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">13</td>\n                    <td class=\"tg-yw4l\">secondaryToolbarBtn<br></td>\n                    <td class=\"tg-yw4l\">secondary toolbar&nbsp;&nbsp;button (true - view button, false - hide button).</td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">14</td>\n                    <td class=\"tg-yw4l\">firstPageBtn<br></td>\n                    <td class=\"tg-yw4l\">go to first page&nbsp;&nbsp;button (true - view button, false - hide button).</td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">15</td>\n                    <td class=\"tg-yw4l\">lastPageBtn<br></td>\n                    <td class=\"tg-yw4l\">go to last page  button (true - view button, false - hide button).</td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">16</td>\n                    <td class=\"tg-yw4l\">pageRotateCwBtn<br></td>\n                    <td class=\"tg-yw4l\">rotate page clockwise button (true - view button, false - hide button).</td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">17</td>\n                    <td class=\"tg-yw4l\">pageRotateCcwBtn<br></td>\n                    <td class=\"tg-yw4l\">rotate page counter clockwise button (true - view button, false - hide button).</td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">18</td>\n                    <td class=\"tg-yw4l\">cursorSelectTextToolbarBtn<br></td>\n                    <td class=\"tg-yw4l\">select text button (true - view button, false - hide button).</td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                  <tr>\n                    <td class=\"tg-yw4l\">19</td>\n                    <td class=\"tg-yw4l\">cursorHandToolbarBtn<br></td>\n                    <td class=\"tg-yw4l\">cursor hand button (true - view button, false - hide button).<br></td>\n                    <td class=\"tg-yw4l\">true</td>\n                  </tr>\n                </table>\n            <p class=\"p_heads_2\">b.docxSetting:</p>\n            <pre>\n                <code>\n$(&quot;#resolte-contaniner&quot;).officeToHtml({\n    url: file_path,\n    inputObjId: &quot;select_file&quot;,\n    docxSetting: {\n        styleMap : null,\n        includeEmbeddedStyleMap: true,\n        includeDefaultStyleMap: true,\n        convertImage: null,\n        ignoreEmptyParagraphs: false,\n        idPrefix: \"\",\n        isRtl : \"auto\" \n    }\n});                    \n                </code>\n            </pre>\n            <table class=\"tg\">\n            <tr>\n                <th class=\"tg-jc4p\">#</th>\n                <th class=\"tg-jc4p\">name</th>\n                <th class=\"tg-jc4p\">description</th>\n                <th class=\"tg-jc4p\">default value</th>\n            </tr>\n            <tr>\n                <td class=\"tg-yw4l\">1</td>\n                <td class=\"tg-yw4l\">isRtl<br><br></td>\n                <td class=\"tg-yw4l\">set if the docx document is \"rtl\" (right to left) or \"ltr\" (left to right).<br>set \"auto\" for automatic detaction (work for hebrew only)<br></td>\n                <td class=\"tg-yw4l\">\"auto\"<br></td>\n            </tr>\n            <tr>\n                <td class=\"tg-yw4l\">2</td>\n                <td class=\"tg-yw4l\"></td>\n                <td class=\"tg-yw4l\">For the others options see <a href=\"https://github.com/mwilliamson/mammoth.js/\" target=\"_blank\">mammoth.js</a> github page</td>\n                <td class=\"tg-yw4l\"></td>\n            </tr>\n            </table>\n                  \n                  \n            <p class=\"p_heads_2\">c.pptxSetting:</p>\n            <pre>\n                <code>\n$(&quot;#resolte-contaniner&quot;).officeToHtml({\n    url: file_path,\n    inputObjId: &quot;select_file&quot;,\n    pptxSetting: {\n        slidesScale: \"50%\", //Change Slides scale by percent\n        slideMode: true, /** true,false*/\n        keyBoardShortCut: true,  /** true,false ,condition: slideMode: true*/\n        mediaProcess: true, /** true,false: if true then process video and audio files */\n        jsZipV2: false,\n        slideModeConfig: {\n            first: 1,\n            nav: true, /** true,false : show or not nav buttons*/\n            navTxtColor: \"black\", /** color */\n            keyBoardShortCut: false, /** true,false ,condition: */\n            showSlideNum: true, /** true,false */\n            showTotalSlideNum: true, /** true,false */\n            autoSlide:1, /** false or seconds , F8 to active ,keyBoardShortCut: true */\n            randomAutoSlide: false, /** true,false ,autoSlide:true */ \n            loop: true,  /** true,false */\n            background: false, /** false or color*/\n            transition: \"default\", /** transition type: \"slid\",\"fade\",\"default\",\"random\" , to show transition efects :transitionTime > 0.5 */\n            transitionTime: 1 /** transition time between slides in seconds */               \n        }\n    }\n});                    \n                </code>\n            </pre>\n            <table class=\"tg\">\n                <tr>\n                  <th class=\"tg-jc4p\">#</th>\n                  <th class=\"tg-jc4p\">name</th>\n                  <th class=\"tg-jc4p\">description</th>\n                  <th class=\"tg-jc4p\">default value</th>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">1</td>\n                  <td class=\"tg-yw4l\">slidesScale</td>\n                  <td class=\"tg-yw4l\">Change Slides scale by percent(%). for orginal size set this option to \"\" or \"100%\"</td>\n                  <td class=\"tg-yw4l\">\"\"</td>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">2</td>\n                  <td class=\"tg-yw4l\">slideMode</td>\n                  <td class=\"tg-yw4l\">If true, turn on presentation mode. The settings of the presentation mode are controlled by the variables \"slideModeConfig\" </td>\n                  <td class=\"tg-yw4l\">false</td>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">3</td>\n                  <td class=\"tg-yw4l\">keyBoardShortCut</td>\n                  <td class=\"tg-yw4l\">If true, enable to enter or exit from presentation mode by keyboard shortcut F5 </td>\n                  <td class=\"tg-yw4l\">false</td>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">4</td>\n                  <td class=\"tg-yw4l\">mediaProcess</td>\n                  <td class=\"tg-yw4l\">if true, then process video and audio files.If 'false', you can not play and see or hear the videos and audios embedded in the presentation.</td>\n                  <td class=\"tg-yw4l\">true</td>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">5</td>\n                  <td class=\"tg-yw4l\">jsZipV2</td>\n                  <td class=\"tg-yw4l\">url link to jsZip version 2. <br>This allows the ability to load jsZip v.2 in case jsZip v.3 is loaded for another use.</td>\n                  <td class=\"tg-yw4l\">false</td>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">6</td>\n                  <td class=\"tg-yw4l\">slideModeConfig</td>\n                  <td class=\"tg-yw4l\">settings of the presentation mode.<br> for more details click <a href=\"https://github.com/meshesha/divs2slides\" target=\"_blank\">here</a></td>\n                  <td class=\"tg-yw4l\">{}</td>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">7</td>\n                  <td class=\"tg-yw4l\">slideModeConfig.first</td>\n                  <td class=\"tg-yw4l\">The first slide that will be loaded.</td>\n                  <td class=\"tg-yw4l\">1</td>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">8</td>\n                  <td class=\"tg-yw4l\">slideModeConfig.nav</td>\n                  <td class=\"tg-yw4l\">show ('true') or hide ('false') navigator buttons.</td>\n                  <td class=\"tg-yw4l\">true</td>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">9</td>\n                  <td class=\"tg-yw4l\">slideModeConfig.navTxtColor</td>\n                  <td class=\"tg-yw4l\">color of slide number text and total slides number shown in navigator area.</td>\n                  <td class=\"tg-yw4l\">\"black\"</td>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">10</td>\n                  <td class=\"tg-yw4l\">slideModeConfig.keyBoardShortCut</td>\n                  <td class=\"tg-yw4l\">if true , enable to control presentation by keyboard shortcuts.<br> for keyboard shortcuts list click <a href=\"https://github.com/meshesha/divs2slides\" target=\"_blank\">here</a> </td>\n                  <td class=\"tg-yw4l\">false</td>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">11</td>\n                  <td class=\"tg-yw4l\">slideModeConfig.showSlideNum</td>\n                  <td class=\"tg-yw4l\">if true , show slide number in navigator area.</td>\n                  <td class=\"tg-yw4l\">true</td>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">12</td>\n                  <td class=\"tg-yw4l\">slideModeConfig.showTotalSlideNum</td>\n                  <td class=\"tg-yw4l\">if true , show total slides number in navigator area.</td>\n                  <td class=\"tg-yw4l\">true</td>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">13</td>\n                  <td class=\"tg-yw4l\">slideModeConfig.autoSlide</td>\n                  <td class=\"tg-yw4l\">options:'false' or number (seconds). if set 'false' it disable auto slide mode. if set number then auto slide mode will be enabled and the number will be the time between slides.</td>\n                  <td class=\"tg-yw4l\">1</td>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">14</td>\n                  <td class=\"tg-yw4l\">slideModeConfig.randomAutoSlide</td>\n                  <td class=\"tg-yw4l\">if true and autoSlide mode are enabled then The slides appear in random order.</td>\n                  <td class=\"tg-yw4l\">false</td>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">15</td>\n                  <td class=\"tg-yw4l\">slideModeConfig.loop</td>\n                  <td class=\"tg-yw4l\">if true, in presentation mode , after last slide will go to first slide. in auto slideMode, the presentation will play in loop.</td>\n                  <td class=\"tg-yw4l\">false</td>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">16</td>\n                  <td class=\"tg-yw4l\">slideModeConfig.background</td>\n                  <td class=\"tg-yw4l\">color of presentation background.</td>\n                  <td class=\"tg-yw4l\">false</td>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">17</td>\n                  <td class=\"tg-yw4l\">slideModeConfig.transition</td>\n                  <td class=\"tg-yw4l\">transition types options: \"slid\",\"fade\",\"default\",\"random\". </td>\n                  <td class=\"tg-yw4l\">\"default\"</td>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">18</td>\n                  <td class=\"tg-yw4l\">slideModeConfig.transitionTime</td>\n                  <td class=\"tg-yw4l\">Time delay in seconds between slides.</td>\n                  <td class=\"tg-yw4l\">1</td>\n                </tr>\n            </table>\n            <p class=\"p_heads_2\">d.sheetSetting:</p>\n            <pre>\n                <code>\n$(&quot;#resolte-contaniner&quot;).officeToHtml({\n    url: file_path,\n    inputObjId: &quot;select_file&quot;,\n    sheetSetting: {\n        jqueryui : false,\n        activeHeaderClassName: \"\",\n        allowEmpty: true,\n        autoColumnSize: true,\n        autoRowSize: false,\n        columns: false,\n        columnSorting: true,\n        contextMenu: false,\n        copyable: true,\n        customBorders: false,\n        fixedColumnsLeft: 0,\n        fixedRowsTop: 0,\n        language:'en-US',\n        search: false,\n        selectionMode: 'single',\n        sortIndicator: false,\n        readOnly: false,\n        startRows: 1,\n        startCols: 1,\n        rowHeaders: true,\n        colHeaders: true,\n        width: false,\n        height:false\n    }\n});                    \n                </code>\n            </pre>\n            <table class=\"tg\">\n              <tr>\n                <th class=\"tg-jc4p\">#</th>\n                <th class=\"tg-jc4p\">name</th>\n                <th class=\"tg-jc4p\">description</th>\n                <th class=\"tg-jc4p\">default value</th>\n              </tr>\n              <tr>\n                <td class=\"tg-yw4l\">1</td>\n                <td class=\"tg-yw4l\">jqueryui</td>\n                <td class=\"tg-yw4l\">if true , will use jQuery-ui interface.<br> To use this option, must include \"jquery-ui.js\" and \"jquery-ui.css\" in the HEAD area.</td>\n                <td class=\"tg-yw4l\">false</td>\n              </tr>\n              <tr>\n                <td class=\"tg-yw4l\">2</td>\n                <td class=\"tg-yw4l\"></td>\n                <td class=\"tg-yw4l\">For the others options see <a href=\"https://docs.handsontable.com/\" target=\"_blank\">handsontable tutorial</a></td>\n                <td class=\"tg-yw4l\"></td>\n              </tr>\n            </table>\n            <p class=\"p_heads_2\">e.imageSetting:</p>\n            <pre>\n                <code>\n$(&quot;#resolte-contaniner&quot;).officeToHtml({\n    url: file_path,\n    inputObjId: &quot;select_file&quot;,\n    imageSetting: {\n        frame: ['100%', '100%',false],\n        maxZoom: '900%',\n        zoomFactor: '10%',\n        mouse: true,\n        keyboard: true,\n        toolbar: true,\n        rotateToolbar: false\n    }\n});                    \n                </code>\n            </pre>\n            <table class=\"tg\">\n              <tr>\n                <th class=\"tg-jc4p\">#</th>\n                <th class=\"tg-jc4p\">name</th>\n                <th class=\"tg-jc4p\">description</th>\n                <th class=\"tg-jc4p\">default value</th>\n              </tr>\n              <tr>\n                <td class=\"tg-yw4l\">1</td>\n                <td class=\"tg-yw4l\"></td>\n                <td class=\"tg-yw4l\">For options see <a href=\"https://github.com/meshesha/verySimpleImageViewer\" target=\"_blank\">verySimpleImageViewer</a> github page</td>\n                <td class=\"tg-yw4l\"></td>\n              </tr>\n            </table>\n\n\n          </div>\n        </div>\n    </div>\n    <!-- / main body -->\n    <div class=\"clear\"></div>\n  </main>\n</div>\n\n<div class=\"wrapper row5\">\n        <div id=\"copyright\" class=\"hoc clear\"> \n          <p class=\"fl_left\">Copyright &copy; 2017 - All Rights Reserved - <a href=\"https://github.com/meshesha/\">Tady Meshesha</a></p>\n          <p class=\"fl_right\">Template by <a target=\"_blank\" href=\"http://www.os-templates.com/\" title=\"Free Website Templates\">OS Templates</a></p>\n        </div>\n      </div>\n<a id=\"backtotop\" href=\"#top\"><i class=\"fa fa-chevron-up\"></i></a>\n</body>\n</html>"
  },
  {
    "path": "example/pages/include/PPTXjs/css/pptxjs.css",
    "content": "\n\n.slide {\n\twidth: 100%;\n\t/*max-width: 920px;*/\n\theight: 690px;\n\tposition: relative;\n\tborder: 1px solid #333;\n\tbackground-color: #EFEFEF;\n\ttext-align: center;\n\tborder-radius: 10px;\n\tbox-shadow: 1px 1px 3px #AAA;\n\toverflow: hidden;\n\t/*transform: scale(0.85);*/\n}\n\n.slide div.block {\n\tposition: absolute;\n\ttop: 0px;\n\tleft: 0px;\n\twidth: 100%;\n}\n\n.slide div.content {\n\tdisplay: flex;\n\tflex-direction: column;\n\t/*\n\tjustify-content: center;\n\talign-items: flex-end;\n\t*/\n}\n\n.slide div.v-up {\n\tjustify-content: flex-start;\n}\n.slide div.v-mid {\n\tjustify-content: center;\n}\n.slide div.v-down {\n\tjustify-content: flex-end;\n}\n\n.slide div.h-left {\n\talign-items: flex-start;\n\ttext-align: left;\n}\n.slide div.h-mid {\n\talign-items: center;\n\ttext-align: center;\n}\n.slide div.h-right {\n\talign-items: flex-end;\n\ttext-align: right;\n}\n\n.slide div.up-left {\n\tjustify-content: flex-start;\n\talign-items: flex-start;\n\ttext-align: left;\n}\n.slide div.up-center {\n\tjustify-content: flex-start;\n\talign-items: center;\n}\n.slide div.up-right {\n\tjustify-content: flex-start;\n\talign-items: flex-end;\n}\n.slide div.center-left {\n\tjustify-content: center;\n\talign-items: flex-start;\n\ttext-align: left;\n}\n.slide div.center-center {\n\tjustify-content: center;\n\talign-items: center;\n}\n.slide div.center-right {\n\tjustify-content: center;\n\talign-items: flex-end;\n}\n.slide div.down-left {\n\tjustify-content: flex-end;\n\talign-items: flex-start;\n\ttext-align: left;\n}\n.slide div.down-center {\n\tjustify-content: flex-end;\n\talign-items: center;\n}\n.slide div.down-right {\n\tjustify-content: flex-end;\n\talign-items: flex-end;\n}\n\n\nli.slide {\n\tmargin: 10px 0px;\n\tfont-size: 18px;\n}\n\ndiv.footer {\n\ttext-align: center;\n}\n\n.slide table {\n\tposition: absolute;\n}\n\n.slide table, .slide th, .slide td {\n\tborder: 1px solid black;\n}\n\n.slide svg.drawing {\n\tposition: absolute;\n\toverflow: visible;\n}\n/*\n#pptx-thumb {\n\tmin-width: 240px;\n\theight: 180px;\n}\n*/"
  },
  {
    "path": "example/pages/include/PPTXjs/js/divs2slides.css",
    "content": ".jqvsiv_toolbar {\n\tdisplay: inline-block;\n\tposition: absolute;\n\tright: 3px;\n\ttop: 3px;\n\tz-index: 5;\n}\n.jqvsiv_toolbarButton {\n\tmargin: 0 2px;\n\tcursor: pointer;\n}\n"
  },
  {
    "path": "example/pages/include/PPTXjs/js/divs2slides.js",
    "content": "/**\n * divs2slides.js\n * Ver : 1.3.2\n * update: 14/05/2018\n * Author: meshesha , https://github.com/meshesha\n * LICENSE: MIT\n * url:https://github.com/meshesha/divs2slides\n * \n * New: \n *  - fixed fullscreen (fullscreen on div only insted all page)\n */\n(function( $ ){\n    \n    var orginalMainDivWidth,\n        orginalMainDivHeight,\n        orginalSlidesWarpperScale,\n        orginalSlideTop,\n        orginalSlideLeft,\n        orginalSlidesToolbarWidth,\n        orginalSlidesToolbarTop;\n    var pptxjslideObj = {\n        init: function(){\n            var data = pptxjslideObj.data;\n            var divId = data.divId;\n            var isInit = data.isInit;\n            $(\"#\"+divId+\" .slide\").hide();        \n            if(data.slctdBgClr != false){\n                var preBgClr = $(document.body).css(\"background-color\");\n                data.prevBgColor = preBgClr;\n                $(document.body).css(\"background-color\",data.slctdBgClr)\n            }\n            if (data.nav && !isInit){\n                data.isInit = true;\n                // Create navigators \n                $(\"#\"+divId).prepend(\n                    $(\"<div></div>\").attr({\n                        \"class\":\"slides-toolbar\",\n                        \"style\":\"width: 90%; padding: 10px; text-align: center;font-size:18px; color: \"+data.navTxtColor+\";\" ////New for Ver: 1.2.1\n                    })                \n                );\n                $(\"#\"+divId+\" .slides-toolbar\").prepend(\n                    $(\"<img></img>\").attr({\n                        \"id\":\"slides-next\",\n                        \"class\":\"slides-nav\",\n                        \"alt\":\"Next Slide\",\n                        \"src\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAADZ0lEQVRIiZ2Va2xTdRjGH5xEg0aXeInRqE00pKwfHAkydYMdlXFpiG5LYFFi0iBZFFeLrm50ZrbrYLeyneEFcHMMhxoksGUSTEw01UQz1ukO29quO11vXNZNwBI1gRDN4wfa0q3n1MKT/D697/s8//OenP8BspD2jSGNtmpISEVjcOZmM6sqjcGZm/f2sC2/+tfQpnYvdxwK0NwXpLkvyB2HAixr83C5eUTSGV2GmzZfVjVc+qxlNFb/dYRHh2Psdl7knpNzbDkxy5YTs9xzco7dzov88pdLtHwV5tM1v4W0VUNCVuZ5plO9r3b62O28wF2DURr7zmRk12CUvT9dYLnDw/99Gp3JJW7bL7Pj2zlW9kS4tTucFZU9EX743RwrOibVQ7RVQ0K5w8uG/hm+8knolmjon+Fa+zh12135aQEFtaMh6/HzLN8bSIMkmwajirWFWI6cpc7kcs5fjdFlWNPoYdneAF/qmE6DJP+++i+bBqOK9VQ2fRSkYBvnvJeeZxoeWNcqc2P7tCKp+t79Jys+Dqr2bmyfZkmzjzqTS0wGLH9vNKZ3+KnGQs1evsbaI+dU+/UOP596Z0RKBqy0nOb6VlkVNX3x8yXVmZWW0wQArDCPCIX14yxp8nFt85QimTQ9e5VvHgzP6y+2e24E5O+UNAV1YyyoG2PhBxMsbvDw+UYv1+yeTJJJf135h63fzLC4wcMi6wSfef+6V0HdGJMrKqyfoBKrrG6usrpVzeXoFRr2+RVnn6sfiyUDiqxuabXNTTWU1Pvj76r9q21uFlknBpIBgt0rvtDopRqpisausbIrqNqbQLB7blwZgm1SU9LsoxoJHXf9wTJRVu1L8OJuX0ywSfP/F+taZHFDm0wlSNI+MKNYU2J985Qt7S4SbFKu3uGXMn2h2aB3+KU084T0bXJ+qRiIlXUGeCu8LAaktNUsVKk4qdmyLyS9diDMm2HL/pCzVMxsvijObQByKj+dqjb2RS6bDp9lJoyfhyPbDvheB5ATn034JJUDYDGAOwHcDSAXwIMAHgWwdHPtZ+btnT/01/SMequ7XHJ118hUzUHJ/Van81iFpfddAE8AeATAAwDuBbAEwB0Abo8HXj9xSshd8ZD7ATwM4HEATwJYBkAXRxs3fgzAQwDuA3BPivniuOei/wDo+pj+wU2R5QAAAABJRU5ErkJggg==\",\n                        \"style\":\"float: right;cursor: pointer;opacity: 0.7;\"\n                    }).on(\"click\", pptxjslideObj.nextSlide)\n                );\n                if(data.showTotalSlideNum){\n                    $(\"#\"+divId+\" .slides-toolbar\").prepend(\n                        $(\"<span></span>\").attr({\n                            \"id\":\"slides-total-slides-num\"\n                        }).html(data.totalSlides)\n                    );\n                }\n                if(data.showSlideNum && data.showTotalSlideNum){\n                    $(\"#\"+divId+\" .slides-toolbar\").prepend(\n                        $(\"<span></span>\").attr({\n                            \"id\":\"slides-slides-num-separator\"\n                        }).html(\" / \")\n                    );\n        \n                }\n                if(data.showSlideNum){\n                    $(\"#\"+divId+\" .slides-toolbar\").prepend(\n                        $(\"<span></span>\").attr({\n                            \"id\":\"slides-slide-num\"\n                        }).html(data.slideCount)\n                    );\n                }\n                if(data.showFullscreenBtn){\n                    $(\"#\"+divId+\" .slides-toolbar\").prepend(\n                        $(\"<img></img>\").attr({\n                            \"id\":\"slides-full-screen\",\n                            \"class\":\"slides-nav-play\",\n                            \"alt\":\"fullscreen Slide\",\n                            \"src\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAGwUlEQVRIibWWW0zU+RWAR1eHgaJtN92kbXYTkjUtlW26u6m7cQsMFwsyzAAOMyBQVGCAhUFgUFirYlABgSAXB6MgcinoDCBR3IGxwhABg1wEZQYRMIg3arn9B7ft+vj1AcK2Tdq+tCf5Hn7nnPy+nKdzRKL/d5SVld9uaLxiN//xttDT2yf03xsQhu+PCGNWqzD+aEJ48mRGePbsufDq1ZywsLgoLAuCML+wILx4+VJ4+nRWeDw5LVhtNmF09IFwb2BQ6LJ0C0Zjs1BZWWUvKSm1iDIOH35TWFRMWfk5jh07xonjxzmVk0Nebi6FBQWcLS6mrLSUCr2eyosXuVRVxcULF9CfO0dpSQnFRUWcyc8n99QpcrKzOXLkCGcKCjl9OpfDWVl/EYWHhwupqWlER0Wx7Re/ZOfuENwDQvCUheAVqMRHrmSXQolfUCj+QcpVgkPxCwrFV7Fa9wpU4ilT4iFT8qHrR0RGRpKamkZERKRdFB6+V0hP1xGuViGP1WGwzXPt0SKm6WW6Zu30vfqGofm/Mbr0LVbhLTb7W6zCW0YWv2Xg9V+58+IN5hmB1olFasbm2B2dQpgqlNTUNCIjo+yisLBwIS0tHZUyhF0RSdQP/YnG4TmaxxZoe7SEeUrA8nSFO8/e0Pv8DX0vvqHn+Ru6Z1fofGLH9HiZZusClf0vKet9jpcqFpUy5LsJ1OowITU1jZAgBZ6hsVy6+5Lq3lnqh+YwPpin1bbIzYkl2ieXMU8JmKcFOqYETJPL3Hi0ROPIa873veBs1wzFlll2KqIIVsg5eDCV8PAIu2jPnlAhJeUgclkAn8kiOWeZQd85SWXPU2oGXtJ4/zWG0XmarQu0rNFsXcDwYJ7qgVec63nO2c4n5JsmyGuf5lM/NXJZAFptCmp12KpAm5JCgL8fv/JVUdT+mKKbY5SaJ6iwTFPZM0t1/wtqBl5RNzRH3dDc6sd3nnG2a4bCW1Pk3hwn+9oo2a3juEmD2O23i+RkLSqVelWQnKzFz9cHV3cFJ1secLJpkLzroxSZbJSYJyjvnELf/QR99wylndMUdEyS3z5B7s1xcq6PcdQ4TGZDP5lX7rPt8934+fp8J1AogoSkpGR8vb1w2eFPVv09smp6ONpwlxPGQU5du0/ejQfkt1nJuTZKdssqx5ru83vDEJkN90iv6SWlshvtpT4++NgbHy8piYlJKEND7SK5XCEkJCTiLfXk/Y990F7oRqu/RdrFLjIu3+Gruj6y6u+iq+kjo+7uOuk1vaReukNKZTeJFZ3ElrYTW97FT9w88PHyJCExkT17lKuC+PgEvKUe/NhNyv4iE/sLrhN39msSyjvQlHUQV9ZBvP4WiRWdJJ3vJLGikwT9bTTlZmJKTEQXtrE37xp7z9zkPdedeEs9iI9PWBUEBsqFuDgN3lIPfuTqTuiJZlTZVwk7aUR9somw0y1E5LcSVXCD6MK2daIKbhCR30r46RZCc4wEHW0kKLuZH277DC9PD+LiNAQHB9tFMlmgEBsbh5fUg+9/+Dl+GXX4plaxK72a3Zm1yI80EHT0CiHHr6I8YVgl20DI8asEHb1C4Ff1BGTWsiu9Gl9dHVtdfo3Uw52YmFgUiiC7KCBAJhw4EIPUw52tLjtwTzyPe3w5XskV+B68iH96FQEZ1cgyLxOYVbOOLPMyARnV+KdX4ZNyAWmSHqm2EucPPsHT/TccOBCDXK6wi/z8/IV9+/YjlUoRiURscnDmHbHTOpscnNdw+qf8au1f386IRCI8PaVER+9DJgu0i4KD99g1mngCA+WIxWLEmzfjIBYjcXDAQSxmg0jEOxs34iiR4OzktIqzE06OjjhKJEgkDuu94s2bEYvFyOUKNJp4VCr1iqjuD43LDQ1XMBibMDY1c/1GG+3tHXR2WbB0d2MwGDGZTIyMjDI1Nc3MzFMeT04yZrUyNDTM3f5+LJZuzOZbtLV9TVNzC1cNRq4ajNTW1QsiNze3d7ds2fKz7du3F8dpNAsxsXErcZr4lfiEJHuyNkXQ6TKWdRmHl9N1h5Z0hzKXDmVmLekOZS7pdBnLaem65YOpafZkbYo94cukFU18gv3LZO2fXV2350kkEhe1Wv3u+up0cXGR6PX6n9bW1roajcZPTSbTFxaLxWdwcDBweHhY9fDhw9/ZbLbY8fFxjc1mi7NarQdGRkai+vv71RaLRWE2m31bW1t3GAwGl5KSEsd/u6OBjcD3gPcAF+AjYAfgAfgCv13DG/gC+AT4OfA+8APAAdjwnwQb1iSbADHguCbcAmz9B7YAzoATIFnr3QRs/B/eJP89/g4EWvXUVw2aogAAAABJRU5ErkJggg==\",\n                            \"style\":\"float: left;cursor: pointer;opacity: 0.7; padding: 0 10px 0 10px\"\n                        }).bind(\"click\", function(){ \n                            pptxjslideObj.fullscreen();\n                        })\n                    )\n                }\n                if(data.showPlayPauseBtn){\n                    $(\"#\"+divId+\" .slides-toolbar\").prepend(\n                        $(\"<img></img>\").attr({\n                            \"id\":\"slides-play-pause\",\n                            \"class\":\"slides-nav-play\",\n                            \"alt\":\"Play/Pause Slide\",\n                            \"src\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAF4UlEQVRIibWW+3NU9RnGz4ZR+5t0qjOVXmZ6M9b+0LEyuFRDjCEElMhEZlCSaWcohWgQoZE9e3Zdwg4Xd1FjJBQxlmgxbcm0NWNMJ6vBJuQCLCYxl92w2Vz3vtmTy2ZzOUnO7vrpDyklMEjbmfb9A97n+7zP+z7PVxBuU2KRqNXr9JIkSTUmo8lrNBgTRoMxYTKavJIk1eh1ekksErW363HL0ul0aZIolVst1pCtzobT4USWZVRVRVVVZFnG6XBiq7NhtVhDkiiV63S6tP+ouSiKheZic5fdbkdRFPrlODW9KmUXVV6pVzlYr/LbFpVah8pQJI6iKNjtdszF5i5RFAtv3/yAaKg6VxWWZZmrYZXfd8R58W8qOZXzPPHOHGknpkkvmSLz9SibS6fY/d40lS3z9IeWWFWdqwqLB0TDV7686lxVOB6PY3MtcvDvCTa8P8/qk7OsKZlm7fEpHnt1kvTD4zx+aIx0k0y6IUKWKYL43hSNXQvE4/ElkJuZ6HS6NHOxuUuWZWyuBXbVqDxyWuGh0lnWHI+hPRYl/fAE6SaZdVKETClClhhigxhiw4EQWS8HyTsSoaFjHlmWMRebu27QRBKlcrvdjiu8iL4+gfb0HNq3ZsksjfLUG2NsPBLhccMomfowG3R+Hi30kb0/yKb9AZ7c52fzvgCbX/JTVDLGgHcRu92OJErlS6MpErVWizWkKAoVbXEyKhRWl87w1IkJukeiBEfH6XGH2fSyi+KKMP3ecQxlg2TsHCB7t5cte3xsKfSSu8fHMy/6qPhwCkVRsFqsIbFI1Ap6nV6y1dkYlFV+8aHK2pMzPGKdYlvpKH6/n0hwhJGhfnJ/8zllf/SiTAcIhzz8pXaA7UX9bCzw8qwuSL4UJE8KssscZsi3iK3Ohl6nlwRJkmqcDifVjgWyziikl8Z49EiUba8F6HZcpdfRxRedX7D1pSsce9uNs6ed5uYmLrWcx1bfxK8PdfKtzX386DkfaXuDPGMM8dGFWZwOJ5Ik1Qgmo8kryzKvN6mkl82w/rUo6w6Nk2/xcdnezuVLTTQ0NvDDtTby97RS/0k11dXV1NZ+TGODjfb2Vk5UdnLflm6E9EHu2uLjl5YJZFnGZDR5BaPBmFBVlb0fLfLEmzGyLRNkFY+zzeyhobGZ5ubzXGhu5Js//Zj8fXau2M/TcvECbR2X6XZ04HJ3I0dcePw+cg66EHI8pBaMo6oqRoMx8S+A5/+8QPYbUZ62jvOTXSFSt/bSctlOX187Pb2drNLWscPUhWekE1e/gyFvH77gMKNyAHV+guhkkK2HLyLkeUkVY9cBro3oVds8OSWTpBaEELRD/GBTD73uPiLyMCPeIe5b9wkFFhexmIfQaICxyQgLC9Mk43NUX3Bx/wufIfzKjUYXI/dt5fqIron818/n+F5hBGH9CMKaAe7f2IPHH2R+YZLImMyq9fXsKR0imYwxvzAHfIk3PMHOt1rR7LAjGKbQHFPRHFawfLp4XeRra9o9PM/K5yJosoYRfubmgaxuxqOzAEzPzPHtJ+vZfzrAUiU495mL7+9tQCjyIpQmEcq+RDiRYOWpBFc8ietruvzQCt6cJCVzCOEhN999rIsrXTLB0Sk6egPcm9PI9pIAVz1jbLc2IexsQzg6i/AOrPgd3HEG7qiAgkZuPLTlVnGpZ4bU/BAr1rhJ+XEP9z7cxHcy6rknuxFNrpu7dvj4+q5OhBeGEY4nEE7DnRVw99kE36hMsroWWgPJG63iZrM7VTXJ134+yIoHexEe7EXQDiBke0nJG0XYPYFQNI3myCJCaYKUd+Hus0lW/SnOA9UJyq8mb212N9v1qcoxUrOHWPFwHykZg6Tk+EjJC6N5fhyNfgbNUQWhLMGdZ+CePyTJ+DTJ++7EV9v1rQLnYts0Ba+EWbnJi+ZpPyn5/wQQY0sAJ5OsrITCVrCHE/8+cJYzWR6Zbc45LB9EyT0WJVUfI/WoQu5ZFUtzgrZg8r+LzOWa/N9C/wY2/4Nvyz8A92FZT9kSnHgAAAAASUVORK5CYII=\",\n                            \"style\":\"float: left;cursor: pointer;opacity: 0.7;  padding: 0 10px 0 10px\"\n                        }).html(\"<span style='font-size:80%;'>&#x23ef;</span>\").bind(\"click\", function(){ \n                            if(data.isSlideMode){\n                                pptxjslideObj.startAutoSlide();\n                            }\n                        })\n                    );\n                }\n                $(\"#\"+divId+\" .slides-toolbar\").prepend(\n                    $(\"<img></img>\").attr({\n                        \"id\":\"slides-prev\",\n                        \"class\":\"slides-nav\",\n                        \"alt\":\"Prev. Slide\",\n                        \"src\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAADXklEQVRIiZ2Ve2hTZxjGH+tE0bEFdGNM1IBj1PYPKzjr1roeN6tdEW0LWpwMgpMytVncGttF6ZKm2lu0qXdtrdV6wY3ZUsXBYCMbOGrTrce2SZqeNrc5m9bLIjpQxPHsD5PYpMkx+sAPDnzv+zwf3+0ACUipsiiSizuFCL7oVCbSK6tUtVW1SNst5tfZuf2Ui9pWN7Wtbm4/5eK6fQ6mlfzhSfmyy6BUWRQvZJxc3Cm8V/qnR3fey3O/32WT5Q73XhljzeVR1lwe5d4rY2yy3OH3XQGWf+fj+7qewILirryEZ11gsrPlt9vc3eGnuvUvWXZ3+Nlkuc1PG5xM0Vxrea55Yf0AD/w0xqJmHzc1eROiqNnH+h/HuPmoxFSN1RzbfKs1baWxjxVtI9xw2PNSVLSNsMDkYHJxpzAxQGO16C7cYMF+13Op6vCTZMwx/cWbTC/r8UzYVMHQx3UH3VxTPyxLVYef/z76jyRjjufvd3FFpZ2paqtq/OzN2dVOrt43HJfCQ27+bLvP8YpXu6pWYoqmqz0csPCrbjHXNMR4lF34m6P3HjNacj2LdvQEwgFLdNeZUyvF5OzVuxOMQ4rXk1MrcYnuOiMCsox2rqweDLPlpJfDo4/impOMqB9PdpWTGeV9XKztfnqa0nf2Mn1nL5fu6mWmvp9ZFXbWXhrhg4dPZANW7BkIs7zSwawKOzO+7WfIL+0bUQkA+KC8N5BR3s9oVEeGKPkfxg1Yprdxmd42oS9EeIky9f3tHxpsjEfLr7diBsj1ZOptYjhAMNpVH1U6KEdRo5v+QORJkqsXjI5nT4ZgEBUf73EGsqudlCPfLPGi9Z9wgFytYBhQRtzmnOpBwyd1EhPB2D5CknHHV9VIsR+8XNOQKHebEyHXNCQKBjH2D0gwiIq1ZpeY3+Diy5BndgVy66S0mOYh5ZlFxcajHstnx7x8ETYe8Yh55qh1j9KkIEkAJm8+5vxcfdrr05y5QTnUrb57RccHSwBMDvaGfMJKAvAKgKkApgN4HcAbAGYDmF+oa/l6W4Plh9KToq2ksXuwpNEqlTb3OLY2/NK2vuyEFsC7AOYAeBOAAsCrAKYBmBIMxaTgx5RxIa8BmAngLQBzAcwHkAwgNcgCAO8AmAfgbQCzguYzosyT/gcSaJj+/BZ/OQAAAABJRU5ErkJggg==\",\n                        \"style\":\"float: left;cursor: pointer; opacity: 0.7;\",\n                    }).bind(\"click\", pptxjslideObj.prevSlide)\n                );\n\n                $(\".slides-nav, .slides-nav-play\").on(\"mouseover\",function(){\n                    $(this).css({\n                        \"opacity\":1\n                    });\n                });\n                $(\".slides-nav, .slides-nav-play\").on(\"mouseout\",function(){\n                    $(this).css({\n                        \"opacity\": 0.7\n                    });\n                });\n                if(data.slideCount == 1){\n                    $(\"#\"+divId+\" #slides-prev\").hide();\n                }else if(data.slideCount == data.totalSlides){\n                    $(\"#\"+divId+\" #slides-next\").hide();\n                }else{\n                    $(\"#\"+divId+\" #slides-next\").show();\n                }\n            }else{\n                $(\"#\"+divId+\" .slides-toolbar\").show();\n                data.isEnbleNextBtn = true;\n                data.isEnblePrevBtn = true;\n            }\n            if(document.getElementById(\"all_slides_warpper\") === null){\n                $(\"#\"  + divId + \" .slide\").wrapAll(\"<div id='all_slides_warpper'></div>\");\n            }\n            // Go to first slide\n            pptxjslideObj.gotoSlide(1);\n        },\n        nextSlide: function(){\n            var data = pptxjslideObj.data;\n            var isLoop = data.isLoop;\n            var isAutoMode = data.isAutoSlideMode;\n            if (data.slideCount < data.totalSlides){\n                    pptxjslideObj.gotoSlide(data.slideCount+1);\n                    if(!isAutoMode) $(\"#slides-next\").show();\n            }else{\n                if(isLoop){\n                    pptxjslideObj.gotoSlide(1);\n                }else{\n                    if(!isAutoMode) $(\"#slides-next\").hide();\n                }\n            }\n            if(!isAutoMode){\n                if(data.slideCount > 1){\n                    $(\"#slides-prev\").show();\n                }else{\n                    $(\"#slides-prev\").hide();\n                }\n                if(data.slideCount == data.totalSlides && !isLoop){\n                    $(\"#slides-next\").hide();\n                }\n            }\n            //return this;\n        },\n        prevSlide: function(){\n            var data = pptxjslideObj.data;\n            var isAutoMode = data.isAutoSlideMode;\n            if (data.slideCount > 1){\n                pptxjslideObj.gotoSlide(data.slideCount-1);\n            }\n            if(!isAutoMode){\n                if(data.slideCount == 1){\n                    $(\"#slides-prev\").hide();\n                }else{\n                    $(\"#slides-prev\").show();\n                }\n                $(\"#slides-next\").show();\n            }\n            return this;\n        },\n        gotoSlide: function(idx){\n            var index = idx - 1;\n            var data = pptxjslideObj.data;\n            var slides = data.slides;\n            var prevSlidNum = data.prevSlide;\n            var transType = data.transition; /*\"slid\",\"fade\",\"default\" */\n            if(transType==\"random\"){\n                var tType = [\"\",\"default\",\"fade\",\"slid\"];\n                var randomNum = Math.floor(Math.random() * 3) + 1; //random number between 1 to 3\n                transType = tType[randomNum];\n            }\n            var transTime = 1000*(data.transitionTime);\n            if (slides[index]){\n                var nextSlide = $(slides[index]);\n                if ($(slides[prevSlidNum]).is(\":visible\")){ //remove \"index >= 1 &&\" bugFix to ver. 1.2.1\n                    if(transType==\"default\"){\n                        $(slides[prevSlidNum]).hide(transTime);\n                    }else if(transType==\"fade\"){\n                        $(slides[prevSlidNum]).fadeOut(transTime);\n                    }else if(transType==\"slid\"){\n                        $(slides[prevSlidNum]).slideUp(transTime);\n                    }\n                }\n                if(transType==\"default\"){\n                    nextSlide.show(transTime); \n                }else if(transType==\"fade\"){\n                    nextSlide.fadeIn(transTime);\n                }else if(transType==\"slid\"){\n                    nextSlide.slideDown(transTime);\n                }\n                data.prevSlide = index;\n                pptxjslideObj.data.slideCount = idx;\n                $(\"#slides-slide-num\").html(idx);\n            }\n            return this;\n        },\n        keyDown: function(event){\n            event.preventDefault();\n            var key = event.keyCode;\n            //console.log(key);\n            var data = pptxjslideObj.data;\n            switch(key){\n                case(37): // Left arrow\n                case(8): // Backspace\n                    if(data.isSlideMode && data.isEnblePrevBtn){\n                        pptxjslideObj.prevSlide();\n                    }\n                    break;\n                case(39): // Right arrow\n                case(32): // Space \n                case(13): // Enter \n                    if(data.isSlideMode  && data.isEnbleNextBtn){\n                        pptxjslideObj.nextSlide();\n                    }\n                    break; \n                case(46): //Delete\n                    //if in auto mode , stop auto mode TODO\n                    if(data.isSlideMode){\n                        var div_id = data.divId;\n                        $(\"#\"+div_id+\" .slide\").hide();\n                        pptxjslideObj.gotoSlide(1);               //bugFix to ver. 1.2.1\n                    }\n                    break;\n                case(27): //Esc\n                    if(data.isSlideMode){\n                        pptxjslideObj.closeSileMode();\n                        data.isSlideMode = false;\n                    }\n                    break;\n                case(116): //F5\n                    if(!data.isSlideMode){\n                        pptxjslideObj.startSlideMode();\n                        data.isSlideMode = true;\n                        if(data.isAutoSlideMode || data.isLoopMode){\n                            clearInterval(data.loopIntrval);\n                            data.isAutoSlideMode = false;\n                            data.isLoopMode = false;\n                        }\n                        \n                    }\n                    break;\n                case(113): // F2\n                    if(data.isSlideMode){\n                        pptxjslideObj.fullscreen();\n                    }\n                    break;\n                case(119): // F8\n                    if(data.isSlideMode){\n                        pptxjslideObj.startAutoSlide();\n                    }\n                break;\n            }\n            return true;\n        },\n        startSlideMode: function(){\n            pptxjslideObj.init();\n        },\n        closeSileMode: function(){\n            var data = pptxjslideObj.data;\n            data.isSlideMode = false;\n            var div_id= data.divId;\n            $(\"#\"+div_id+\" .slides-toolbar\").hide();\n            $(\"#\"+div_id+\" .slide\").show();\n            $(document.body).css(\"background-color\",pptxjslideObj.data.prevBgColor);\n            if(data.isLoopMode){\n                clearInterval(data.loopIntrval);\n                data.isLoopMode = false;\n            }\n            pptxjslideObj.exitFullscreenMod();\n        },\n        startAutoSlide: function(){\n            var data = pptxjslideObj.data;\n            var isAutoSlideOption = data.timeBetweenSlides\n            var isAutoSlideMode = data.isAutoSlideMode;\n            if(!isAutoSlideMode && isAutoSlideOption !== false){\n                data.isAutoSlideMode = true;\n                //var isLoopOption = data.isLoop;\n                var isStrtLoop =  data.isLoopMode;\n                //hide and disable next and prev btn\n                if(data.nav){\n                    var div_Id = data.divId;\n                    $(\"#\"+div_Id+\" .slides-toolbar .slides-nav\").hide();\n                    $(\"#\"+div_Id + \" #slides-play-pause\").attr(\"src\" , \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAF00lEQVRIibWW7U+b5xXGb02TWu3DwodqW7R2XdVpbFW1hiBEAJu0iCSQqgloQ2oaLYhNSdos2xoSP37wGHHTD7Cp/YboIqVSAylBnZRCSu125IVAgh8wL8Zv2NjgF+LH8PAWE3BiQ/rbhywLydJsk7bzB1znPuc613XdQjympGppi9FglGVZ7qg11UZMNaY1U41prdZUG5FlucNoMMpStbTlcRiPLIPBoJcl+WRDfYNqtVhxu9xomkY6nSadTqNpGm6XG6vFSkN9gypL8kmDwaD/j8AlSTpkrjM7FEUhmUyS9nhYOXWKxNu/Z37XLubKylg8epTl06dJ+Xwkk0kURcFcZ3ZIknTo8eDHpJq2s21xTdNIOUZYOn6c2cJCpnNyUHNzmcrLI1pQQFinI6TXEykpYeHPf+K2x4OmabSdbYtLx6Sar31529m2+OrqKiutrczv3s1MTg7xfwBH8vMJ63RM6vVMbN1K8OWXCRYVESwuJrpvH0vnz7O6unq3ycOTGAwGvbnO7NA0jZXWVmbz84lv3kz0xRcJbdrERFYWgexs/Dk5+HJz8eXl4SsowKfT4SssZHzbNoKvvUai8zM0TcNcZ3Y8wIksyScVRSE1OspCeTnx7GzUqipmPvmEWGsrUx9/TOTMGcJnzjDZ0sJESwvB5mYCLS2MNzfjrqzEX1pK5MBBkj4fiqIgS/LJu6uplrY01DeoyWSSmydOMJOfT/Sll1A//JB5YHppidjCAtHZWULxOMFYDH80indyElcwiCsaZeDddxh7dQcTFeXMf9BIMpmkob5BlaqlLcJoMMpWi5WU18tscTGqXk8oO5twUxNhTSMYDOL3+xkbG8Pj8eB0OhkZGcFut6MoCgOOUZT6EwT2lBH99R6uv1XF7ckJrBYrRoNRFrIsd7hdblY++ojpwkKmtm5lMjeXYGMj3lAIt9vN6Ogodrudnp4eurq6sFgsfP55J1arhcu2Pr781V5cP3uOUEku4Tde5aa1HbfLjSzLHaLWVBvRNI2EUSL2yitEioqYKCjA39jIkNdLb28vVquV9vZ2zp07R0dHOxZrJ10XvuRy9wVso8N0VpQyvEHg/77A94NvMH34l2iaRq2pNiJMNaa1dDrN/OuvEy0uJrR9OxNFRTjff4/Oixf59NNznP+sA+sXFi5c6uJK72X6bL0MDNoYdgzgDQf4W+UuXM8IJn4qCGYKorpM0uk0phrT2j8bzO3dS6SkhNDOnbiefpq+Q2/xxbUeLl7uoudqN31KL/YhGyNOO27vCL5xF4FJL5E5lUv7y/D+WBDdLAhvEqjb1zW4t6LF43WES0pxb9xIvxAM/PYw/V4ng8MKDtcg7jEHvoCLYGiMcDRANDaJGo+iLSe4criCQNY3UfUbuJ7/LebfLr+/onskJ86exfPUUwwJgSIEw0ePMKZO4g+6CYZ8hKMBpmIh1OkoM7MqcwszLN6YZ3ltlWvVlYR030ErfZ7pbc+w1Pz+fZLvnenyiANPRgZDQmATAqfxGFNLs0ypYdTpKWZm48wtaNy4Mc/N5QTJWyuk0inuAIr8JtHSF1ioyOHGnjxu+Z33z3S90GIHDzIoBH1CMGauIwEkUiusrKa4/dUaq8Ad/rX63zGg/kLHUlUpt/5S/6DQ1ltFwmbDm5mJIgRDu3cR6u0h1NNN5Go3U31XuK70EBvoQR28RnxIIT5iJzbUj/3IARb3V5A2HyEVGHvQKh42u5mmJoafeII+IbjwpOBihqD7e4KrPxTYMgUDWU8yrNuIc8cLeMrz8b9RivabSu788RipnkuPNruH7Xq6qQlvZibObwvGvisIPCsI/UQwlSWI6zOYLf0RixW53Kzaye3f7eOr994lbev7ert+VOAk+vu5/uZBxp/LwP/sXRFFNgti+g3MlD7Pws9zWDlQRvr0B6TDk/8+cNZPsj4yl50jzDXWE99fjrojk5nyTBb/sI/lv54iHRr/7yJzPSf/t9B/YJr/wbfl7/GTWKgJirhoAAAAAElFTkSuQmCC\");\n\n                }\n                data.isEnbleNextBtn = false;\n                data.isEnblePrevBtn = false;\n                ///////////////////////////////\n                \n                var t = isAutoSlideOption + data.transitionTime;\n                \n                var slideNums = data.totalSlides;\n                var isRandomSlide = data.randomAutoSlide;\n                \n                if(!isStrtLoop){\n                    var timeBtweenSlides = t*1000; //milisecons\n                    data.isLoopMode = true;\n                    data.loopIntrval = setInterval(function(){\n                        if(isRandomSlide){\n                            var randomSlideNum = Math.floor(Math.random() * slideNums) + 1;\n                            pptxjslideObj.gotoSlide(randomSlideNum);\n                        }else{\n                            pptxjslideObj.nextSlide();\n                        }\n                    }, timeBtweenSlides);\n                }else{\n                    clearInterval(data.loopIntrval);\n                    data.isLoopMode = false;                \n                }\n            }else{\n                clearInterval(data.loopIntrval);\n                data.isAutoSlideMode = false;\n                data.isLoopMode = false;\n                //show and enable next and prev btn\n                if(data.nav){\n                    var div_Id = data.divId;\n                    $(\"#\"+div_Id + \" .slides-toolbar .slides-nav\").show();\n                    $(\"#\"+div_Id + \" #slides-play-pause\").attr(\"src\",\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAF4UlEQVRIibWW+3NU9RnGz4ZR+5t0qjOVXmZ6M9b+0LEyuFRDjCEElMhEZlCSaWcohWgQoZE9e3Zdwg4Xd1FjJBQxlmgxbcm0NWNMJ6vBJuQCLCYxl92w2Vz3vtmTy2ZzOUnO7vrpDyklMEjbmfb9A97n+7zP+z7PVxBuU2KRqNXr9JIkSTUmo8lrNBgTRoMxYTKavJIk1eh1ekksErW363HL0ul0aZIolVst1pCtzobT4USWZVRVRVVVZFnG6XBiq7NhtVhDkiiV63S6tP+ouSiKheZic5fdbkdRFPrlODW9KmUXVV6pVzlYr/LbFpVah8pQJI6iKNjtdszF5i5RFAtv3/yAaKg6VxWWZZmrYZXfd8R58W8qOZXzPPHOHGknpkkvmSLz9SibS6fY/d40lS3z9IeWWFWdqwqLB0TDV7686lxVOB6PY3MtcvDvCTa8P8/qk7OsKZlm7fEpHnt1kvTD4zx+aIx0k0y6IUKWKYL43hSNXQvE4/ElkJuZ6HS6NHOxuUuWZWyuBXbVqDxyWuGh0lnWHI+hPRYl/fAE6SaZdVKETClClhhigxhiw4EQWS8HyTsSoaFjHlmWMRebu27QRBKlcrvdjiu8iL4+gfb0HNq3ZsksjfLUG2NsPBLhccMomfowG3R+Hi30kb0/yKb9AZ7c52fzvgCbX/JTVDLGgHcRu92OJErlS6MpErVWizWkKAoVbXEyKhRWl87w1IkJukeiBEfH6XGH2fSyi+KKMP3ecQxlg2TsHCB7t5cte3xsKfSSu8fHMy/6qPhwCkVRsFqsIbFI1Ap6nV6y1dkYlFV+8aHK2pMzPGKdYlvpKH6/n0hwhJGhfnJ/8zllf/SiTAcIhzz8pXaA7UX9bCzw8qwuSL4UJE8KssscZsi3iK3Ohl6nlwRJkmqcDifVjgWyziikl8Z49EiUba8F6HZcpdfRxRedX7D1pSsce9uNs6ed5uYmLrWcx1bfxK8PdfKtzX386DkfaXuDPGMM8dGFWZwOJ5Ik1Qgmo8kryzKvN6mkl82w/rUo6w6Nk2/xcdnezuVLTTQ0NvDDtTby97RS/0k11dXV1NZ+TGODjfb2Vk5UdnLflm6E9EHu2uLjl5YJZFnGZDR5BaPBmFBVlb0fLfLEmzGyLRNkFY+zzeyhobGZ5ubzXGhu5Js//Zj8fXau2M/TcvECbR2X6XZ04HJ3I0dcePw+cg66EHI8pBaMo6oqRoMx8S+A5/+8QPYbUZ62jvOTXSFSt/bSctlOX187Pb2drNLWscPUhWekE1e/gyFvH77gMKNyAHV+guhkkK2HLyLkeUkVY9cBro3oVds8OSWTpBaEELRD/GBTD73uPiLyMCPeIe5b9wkFFhexmIfQaICxyQgLC9Mk43NUX3Bx/wufIfzKjUYXI/dt5fqIron818/n+F5hBGH9CMKaAe7f2IPHH2R+YZLImMyq9fXsKR0imYwxvzAHfIk3PMHOt1rR7LAjGKbQHFPRHFawfLp4XeRra9o9PM/K5yJosoYRfubmgaxuxqOzAEzPzPHtJ+vZfzrAUiU495mL7+9tQCjyIpQmEcq+RDiRYOWpBFc8ietruvzQCt6cJCVzCOEhN999rIsrXTLB0Sk6egPcm9PI9pIAVz1jbLc2IexsQzg6i/AOrPgd3HEG7qiAgkZuPLTlVnGpZ4bU/BAr1rhJ+XEP9z7cxHcy6rknuxFNrpu7dvj4+q5OhBeGEY4nEE7DnRVw99kE36hMsroWWgPJG63iZrM7VTXJ134+yIoHexEe7EXQDiBke0nJG0XYPYFQNI3myCJCaYKUd+Hus0lW/SnOA9UJyq8mb212N9v1qcoxUrOHWPFwHykZg6Tk+EjJC6N5fhyNfgbNUQWhLMGdZ+CePyTJ+DTJ++7EV9v1rQLnYts0Ba+EWbnJi+ZpPyn5/wQQY0sAJ5OsrITCVrCHE/8+cJYzWR6Zbc45LB9EyT0WJVUfI/WoQu5ZFUtzgrZg8r+LzOWa/N9C/wY2/4Nvyz8A92FZT9kSnHgAAAAASUVORK5CYII=\");\n                }\n                data.isEnbleNextBtn = true;\n                data.isEnblePrevBtn = true;    \n            }\n        },\n        fullscreen: function(){\n            if (!document.fullscreenElement &&    \n                !document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement ) {  // current working methods\n                var data = pptxjslideObj.data;\n                var div_Id = data.divId;\n                if (document.documentElement.requestFullscreen) {\n                    document.getElementById(div_Id).requestFullscreen();\n                } else if (document.documentElement.msRequestFullscreen) {\n                    document.getElementById(div_Id).msRequestFullscreen();\n                } else if (document.documentElement.mozRequestFullScreen) {\n                    document.getElementById(div_Id).mozRequestFullScreen();\n                } else if (document.documentElement.webkitRequestFullscreen) {\n                    document.getElementById(div_Id).webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);\n                }\n                var winWidth = $(window).width();\n                var winHeight = $(window).height();\n                //Need to save:\n                orginalMainDivWidth = $(\"#\"+div_Id).width();\n                orginalMainDivHeight = $(\"#\"+div_Id).height();\n                var m = $(\"#\"+div_Id +\" #all_slides_warpper\").css('transform');\n                orginalSlidesWarpperScale = m.substring(m.indexOf('(') + 1, m.indexOf(')')).split(\",\")\n                orginalSlideTop = $(\"#\"+div_Id +\" #all_slides_warpper .slide\").offset().top;\n                orginalSlideLeft = $(\"#\"+div_Id +\" #all_slides_warpper .slide\").offset().left;\n                orginalSlidesToolbarWidth = $(\"#\"+div_Id+\" .slides-toolbar\").width();\n                orginalSlidesToolbarTop = $(\"#\"+div_Id+\" .slides-toolbar\").offset().top;\n\n                $(\"#\"+div_Id).attr({\n                    style: \"width: \" + (winWidth - 10) + \"px; height: \" + (winHeight - 10) + \"px;\"\n                });\n\n                $(\"#\"+div_Id +\" #all_slides_warpper\").css({\n                    \"transform\":\"scale(1)\"\n                });\n\n                var slideWidth = $(\"#\"+div_Id +\" #all_slides_warpper .slide\").width();\n                var sildeHeight = $(\"#\"+div_Id +\" #all_slides_warpper .slide\").height();\n                $(\"#\"+div_Id +\" #all_slides_warpper .slide\").css({\n                    \"top\": ((winHeight - sildeHeight)/2) + \"px\",\n                    \"left\": ((winWidth - slideWidth)/2) + \"px\"\n                });\n\n                if(data.nav){\n                    $(\"#\"+div_Id+\" .slides-toolbar\").css({\n                        \"width\": \"99%\",\n                        \"top\": \"20px\"\n                    });\n                }\n                //change fullscreen icon to other icon (red color)\n                $(\"#\"+div_Id + \" #slides-full-screen\").attr(\"src\",\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAAGXcA1uAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAXASURBVDhPtVVpTFRXFH42plVbraVtmjT9YZOm+sPUtKlpY9I2au1mxaogorY1okWttGpVIi6ICyDiiojiQuvCJm64gsswKjCgzM5sMAwMMDMwM/cNiyx/PD3nzIzapH/6oy/5cu+7975z7z3n+74n/eMx7Jor/Nrb4K0pBUmT/J2oiB4FiqiREJoPPZ2qyxAwVULdhskghZfcnTUMJGPmAtHdWAf9HgcMBjqhz9UI9Xt/Akm3c7ZwFKdBy4U94Cw9CM3nd0P1ivHBwO2KvHFdVtX03mbDkoClJtpdfXEMT/zrY9w9H3pbjDAo3DDgd0FPkxZsx/8ASZsyg08u198Hv6YcPMoCsB79HST1pmnQXJIBLZf2gfPyfmgq2AaWwyuCE3T28B0Ipv2LQVIkfzHMX3t1Uo9ds7DLoVvkrbs+lTdvzEvsar2SBU35W6H5XDqHa712GNrLT2CbDS0X94KjOBXspzdhmwaSIWOe0KdGgdArOGfdjWrAe0Kvsx56mvUQsKjA9+g66LbPBNuxNZSpOUKz+WuO6LqVB557hdBReR48FfngVpzBsZO8U82qj8GSsxKvvW2moItYc1fhdX+DhpProPGvDdB4aiO3DSfW8njl0vfAnPULSG7FaX/H/WLwqkpB6O4A9bvtGujzNAWPZK4Gv7oMOh6U4O5Fz4oPAEMQQ588eTIcMRIxilocG4F4EfFCaOl/fIgW9rPJ4CjcgRTJBCemuL3sGLTdzA3SBavXlJ/CtMES9Eh0KdOBOD734zYrDPjaYFDuYPR7nfC41Qxd1howZMRC/Z4fZYkYok+LxgvfxYlaZI2OWUQgBlEifHU3QJ86B4y7F8gSpZPS2ll1ASdugmxQcgFl4z0uGNcEa6NN+R6MGbH4Aea4ds0nfG4qVDB9hcHC3TkFbTeOMlXUm78Cw64YWSIKqlZOYL4Qb1gblw8wwjyihNApDOn4gflQPFTFjwXrkQRmfENeYrDKp5K4T2NEePXGqYCCkyXKEOkyzO3neR7uU6ve+CUSMFKW6KwdD85xJoixdNHH7TZMsQW6Gh7xmLf2CtPCdftPESxe+fG3O5XnP5KNyinddl1Ur0O/GCkeF7BrFgjt7Rne2tKJzqqi4bw4/BBXiDPIn5dDPBqF768ghiGGhpZJUuuVQ+VuZYHsU98SwqgUWFXRZXsosGii12kSfS6bQLsR/T6XGJA7xGC3TwwIj+j3tok+j10gO0RvsxFtSY3f1pK/Cc+DEtF+M1d2lh64w55Fmavft4jLod06nYtKdkKq1G3/AXQ7ZlFGn4JYwn0ap3lcp90Wyd+oVn6AnvczV8OYuVBGw4oVNuQrFh2pNZ9ZFDBXcULDNCQO97ka2DD73HZuKfF4Q9YkmaowVKCv3QJ9ejTHeroB2bbt2Go+CZ2c6EqVIysnMyRBkxgoyPMgHRCdKajv4TWk+kXorL4Emi3fcCySAB44uAERS5P8LTxK/Jyd1V1xlqlCH5Dr0oa0MTkHB8OfBM2RTshh3HdPs3chbeDh2kkci2KydjCXwpLzK1OdjI0slmTQevUQ66a97DgbIvkB6SsMmmu7nsOGyLJB7yDpUB1JZxSTpaPdMVuYs5fxBvTfIX8m6djPbGGQnzcVbgdH0c6g7sLAdxqnefuZzSHJJUHVsnGsGoqJ9i5LmpRIYcpaytoLO63p4BJcsJxtmq5KNaKiERmegt5xnObptBSQvqmMexfqkqYAxUSWyRKal0wTRLnntVsx91VuWeezR+D7aFDOiwgi9nWoiHmNx3hdaG34W6IwxcSfVECqWv1pxL2YN95XJUzINGUv66w/uCRgyooPmHNWyMgEgf8Vf0Peej9arw/7iPWhdp0fb+G35q6WLUcSZEtOQsB8eDn1PdUJE3YqYt4aY9wTFxHS87OHLCAk/zexPwbb8YiJiM8QUxHTQpiMmIT4EDEW8Q6uH43tS9gOCYX7vx9J+hsvJPGPOaYclwAAAABJRU5ErkJggg==\")\n            } else {\n                if (document.exitFullscreen) {\n                    document.exitFullscreen();\n                } else if (document.msExitFullscreen) {\n                    document.msExitFullscreen();\n                } else if (document.mozCancelFullScreen) {\n                    document.mozCancelFullScreen();\n                } else if (document.webkitExitFullscreen) {\n                    document.webkitExitFullscreen();\n                }\n\n                pptxjslideObj.exitFullscreenMod();\n            }\n            \n        },\n        exitFullscreenMod: function(){\n            var data = pptxjslideObj.data;\n            var div_Id = data.divId;\n            //saved:\n            /*\n            orginalMainDivWidth\n            orginalMainDivHeight\n            orginalSlidesWarpperScale\n            orginalSlideTop\n            orginalSlideLeft\n            orginalSlidesToolbarWidth\n            orginalSlidesToolbarTop\n            */\n            $(\"#\"+div_Id).attr({\n                style: \"width: \" + orginalMainDivWidth + \"px; height: \" + orginalMainDivHeight + \"px;\"\n            });\n            console.log(orginalSlidesWarpperScale[0])\n            $(\"#\"+div_Id +\" #all_slides_warpper\").css({\n                \"transform\":\"scale(\" + orginalSlidesWarpperScale[0] + \")\"\n            });\n\n            $(\"#\"+div_Id +\" #all_slides_warpper .slide\").css({\n                \"top\": \"0px\", /**orginalSlideTop +  */\n                \"left\": \"0px\" /**orginalSlideLeft +  */\n            });\n\n            if(data.nav){\n                $(\"#\"+div_Id+\" .slides-toolbar\").css({\n                    \"width\": orginalSlidesToolbarWidth + \"px\",\n                    \"top\": orginalSlidesToolbarTop + \"px\"\n                });\n            }\n\n             //change fullscreen icon to orginal icon - TODO\n             $(\"#\"+div_Id + \" #slides-full-screen\").attr(\"src\",\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAGwUlEQVRIibWWW0zU+RWAR1eHgaJtN92kbXYTkjUtlW26u6m7cQsMFwsyzAAOMyBQVGCAhUFgUFirYlABgSAXB6MgcinoDCBR3IGxwhABg1wEZQYRMIg3arn9B7ft+vj1AcK2Tdq+tCf5Hn7nnPy+nKdzRKL/d5SVld9uaLxiN//xttDT2yf03xsQhu+PCGNWqzD+aEJ48mRGePbsufDq1ZywsLgoLAuCML+wILx4+VJ4+nRWeDw5LVhtNmF09IFwb2BQ6LJ0C0Zjs1BZWWUvKSm1iDIOH35TWFRMWfk5jh07xonjxzmVk0Nebi6FBQWcLS6mrLSUCr2eyosXuVRVxcULF9CfO0dpSQnFRUWcyc8n99QpcrKzOXLkCGcKCjl9OpfDWVl/EYWHhwupqWlER0Wx7Re/ZOfuENwDQvCUheAVqMRHrmSXQolfUCj+QcpVgkPxCwrFV7Fa9wpU4ilT4iFT8qHrR0RGRpKamkZERKRdFB6+V0hP1xGuViGP1WGwzXPt0SKm6WW6Zu30vfqGofm/Mbr0LVbhLTb7W6zCW0YWv2Xg9V+58+IN5hmB1olFasbm2B2dQpgqlNTUNCIjo+yisLBwIS0tHZUyhF0RSdQP/YnG4TmaxxZoe7SEeUrA8nSFO8/e0Pv8DX0vvqHn+Ru6Z1fofGLH9HiZZusClf0vKet9jpcqFpUy5LsJ1OowITU1jZAgBZ6hsVy6+5Lq3lnqh+YwPpin1bbIzYkl2ieXMU8JmKcFOqYETJPL3Hi0ROPIa873veBs1wzFlll2KqIIVsg5eDCV8PAIu2jPnlAhJeUgclkAn8kiOWeZQd85SWXPU2oGXtJ4/zWG0XmarQu0rNFsXcDwYJ7qgVec63nO2c4n5JsmyGuf5lM/NXJZAFptCmp12KpAm5JCgL8fv/JVUdT+mKKbY5SaJ6iwTFPZM0t1/wtqBl5RNzRH3dDc6sd3nnG2a4bCW1Pk3hwn+9oo2a3juEmD2O23i+RkLSqVelWQnKzFz9cHV3cFJ1secLJpkLzroxSZbJSYJyjvnELf/QR99wylndMUdEyS3z5B7s1xcq6PcdQ4TGZDP5lX7rPt8934+fp8J1AogoSkpGR8vb1w2eFPVv09smp6ONpwlxPGQU5du0/ejQfkt1nJuTZKdssqx5ru83vDEJkN90iv6SWlshvtpT4++NgbHy8piYlJKEND7SK5XCEkJCTiLfXk/Y990F7oRqu/RdrFLjIu3+Gruj6y6u+iq+kjo+7uOuk1vaReukNKZTeJFZ3ElrYTW97FT9w88PHyJCExkT17lKuC+PgEvKUe/NhNyv4iE/sLrhN39msSyjvQlHUQV9ZBvP4WiRWdJJ3vJLGikwT9bTTlZmJKTEQXtrE37xp7z9zkPdedeEs9iI9PWBUEBsqFuDgN3lIPfuTqTuiJZlTZVwk7aUR9somw0y1E5LcSVXCD6MK2daIKbhCR30r46RZCc4wEHW0kKLuZH277DC9PD+LiNAQHB9tFMlmgEBsbh5fUg+9/+Dl+GXX4plaxK72a3Zm1yI80EHT0CiHHr6I8YVgl20DI8asEHb1C4Ff1BGTWsiu9Gl9dHVtdfo3Uw52YmFgUiiC7KCBAJhw4EIPUw52tLjtwTzyPe3w5XskV+B68iH96FQEZ1cgyLxOYVbOOLPMyARnV+KdX4ZNyAWmSHqm2EucPPsHT/TccOBCDXK6wi/z8/IV9+/YjlUoRiURscnDmHbHTOpscnNdw+qf8au1f386IRCI8PaVER+9DJgu0i4KD99g1mngCA+WIxWLEmzfjIBYjcXDAQSxmg0jEOxs34iiR4OzktIqzE06OjjhKJEgkDuu94s2bEYvFyOUKNJp4VCr1iqjuD43LDQ1XMBibMDY1c/1GG+3tHXR2WbB0d2MwGDGZTIyMjDI1Nc3MzFMeT04yZrUyNDTM3f5+LJZuzOZbtLV9TVNzC1cNRq4ajNTW1QsiNze3d7ds2fKz7du3F8dpNAsxsXErcZr4lfiEJHuyNkXQ6TKWdRmHl9N1h5Z0hzKXDmVmLekOZS7pdBnLaem65YOpafZkbYo94cukFU18gv3LZO2fXV2350kkEhe1Wv3u+up0cXGR6PX6n9bW1roajcZPTSbTFxaLxWdwcDBweHhY9fDhw9/ZbLbY8fFxjc1mi7NarQdGRkai+vv71RaLRWE2m31bW1t3GAwGl5KSEsd/u6OBjcD3gPcAF+AjYAfgAfgCv13DG/gC+AT4OfA+8APAAdjwnwQb1iSbADHguCbcAmz9B7YAzoATIFnr3QRs/B/eJP89/g4EWvXUVw2aogAAAABJRU5ErkJggg==\");\n        }\n\n    };\n    $.fn.divs2slides = function( options ) {\n        var target = $(this);\n        var divId = target.attr(\"id\");\n        var slides = $(\"#\" + divId + \" .slide\");//target.children();\n        //console.log(slides)\n        var totalSlides = slides.length;\n        var prevBgColor;\n        var settings = $.extend(true, {\n            // These are the defaults.\n            first: 1,\n            nav: true, /** true,false : show or not nav buttons*/\n            showPlayPauseBtn: true, /** true,false */\n            showFullscreenBtn: true, /** true,false */\n            navTxtColor: \"black\", /** color */\n            keyBoardShortCut: true, /** true,false */\n            showSlideNum: true, /** true,false */\n            showTotalSlideNum: true, /** true,false */\n            autoSlide:1, /** false or seconds (the pause time between slides) , F8 to active(condition: keyBoardShortCut: true) */\n            randomAutoSlide: false, /** true,false ,(condition: autoSlide:true */ \n            loop: false,  /** true,false */\n            background: false, /** false or color*/\n            transition: \"default\", /** transition type: \"slid\",\"fade\",\"default\",\"random\" , to show transition efects :transitionTime > 0.5 */\n            transitionTime: 1 /** transition time in seconds */\n        }, options );\n        var slideCount = settings.first\n        pptxjslideObj.data = {\n            nav: settings.nav,\n            navTxtColor: settings.navTxtColor,\n            showPlayPauseBtn: settings.showPlayPauseBtn,\n            showFullscreenBtn: settings.showFullscreenBtn,\n            showSlideNum: settings.showSlideNum,\n            showTotalSlideNum: settings.showTotalSlideNum,\n            target: target,\n            divId: divId,\n            slides:slides,\n            isSlideMode: true,\n            totalSlides:totalSlides,\n            slideCount: slideCount,\n            prevSlide: 0,\n            transition: settings.transition,\n            transitionTime: settings.transitionTime,\n            slctdBgClr: settings.background,\n            prevBgColor: prevBgColor,\n            timeBetweenSlides: settings.autoSlide,\n            isLoop: settings.loop,\n            isLoopMode: false,\n            isAutoSlideMode: false,\n            randomAutoSlide: settings.randomAutoSlide,\n            isEnbleNextBtn: true,\n            isEnblePrevBtn: true,\n            isInit: false\n        }\n\n        // Keyboard shortcuts\n        if (settings.keyBoardShortCut){\n            $(document).bind(\"keydown\",pptxjslideObj.keyDown);\n        }\n        if (document.addEventListener){\n            document.addEventListener('webkitfullscreenchange', exitHandler, false);\n            document.addEventListener('mozfullscreenchange', exitHandler, false);\n            document.addEventListener('fullscreenchange', exitHandler, false);\n            document.addEventListener('MSFullscreenChange', exitHandler, false);\n        }\n        \n        function exitHandler(){\n            if (document.webkitIsFullScreen ===false || document.mozFullScreen === false || document.msFullscreenElement === null){\n                pptxjslideObj.exitFullscreenMod();\n            }\n        }\n        pptxjslideObj.init();\n    }\n})(jQuery);\n"
  },
  {
    "path": "example/pages/include/PPTXjs/js/filereader.js",
    "content": "/*!\nFileReader.js - v0.99\nA lightweight wrapper for common FileReader usage.\nCopyright 2014 Brian Grinstead - MIT License.\nSee http://github.com/bgrins/filereader.js for documentation.\n*/\n\n(function(window, document) {\n\n    var FileReader = window.FileReader;\n    var FileReaderSyncSupport = false;\n    var workerScript = \"self.addEventListener('message', function(e) { var data=e.data; try { var reader = new FileReaderSync; postMessage({ result: reader[data.readAs](data.file), extra: data.extra, file: data.file})} catch(e){ postMessage({ result:'error', extra:data.extra, file:data.file}); } }, false);\";\n    var syncDetectionScript = \"onmessage = function(e) { postMessage(!!FileReaderSync); };\";\n    var fileReaderEvents = ['loadstart', 'progress', 'load', 'abort', 'error', 'loadend'];\n    var sync = false;\n    var FileReaderJS = window.FileReaderJS = {\n        enabled: false,\n        setupInput: setupInput,\n        setupBlob: setupBlob,\n        setupDrop: setupDrop,\n        setupClipboard: setupClipboard,\n        setSync: function (value) {\n            sync = value;\n\n            if (sync && !FileReaderSyncSupport) {\n                checkFileReaderSyncSupport();\n            }\n        },\n        getSync: function() {\n            return sync && FileReaderSyncSupport;\n        },\n        output: [],\n        opts: {\n            dragClass: \"drag\",\n            accept: false,\n            readAsDefault: 'DataURL',\n            readAsMap: {\n            },\n            on: {\n                loadstart: noop,\n                progress: noop,\n                load: noop,\n                abort: noop,\n                error: noop,\n                loadend: noop,\n                skip: noop,\n                groupstart: noop,\n                groupend: noop,\n                beforestart: noop\n            }\n        }\n    };\n\n    // Setup jQuery plugin (if available)\n    if (typeof(jQuery) !== \"undefined\") {\n        jQuery.fn.fileReaderJS = function(opts) {\n            return this.each(function() {\n                if (jQuery(this).is(\"input\")) {\n                    setupInput(this, opts);\n                }\n                else {\n                    setupDrop(this, opts);\n                }\n            });\n        };\n\n        jQuery.fn.fileClipboard = function(opts) {\n            return this.each(function() {\n                setupClipboard(this, opts);\n            });\n        };\n    }\n\n    // Not all browsers support the FileReader interface. Return with the enabled bit = false.\n    if (!FileReader) {\n        return;\n    }\n\n\n    // makeWorker is a little wrapper for generating web workers from strings\n    function makeWorker(script) {\n        var URL = window.URL || window.webkitURL;\n        var Blob = window.Blob;\n        var Worker = window.Worker;\n\n        if (!URL || !Blob || !Worker || !script) {\n            return null;\n        }\n\n        var blob = new Blob([script]);\n        var worker = new Worker(URL.createObjectURL(blob));\n        return worker;\n    }\n\n    // setupClipboard: bind to clipboard events (intended for document.body)\n    function setupClipboard(element, opts) {\n\n        if (!FileReaderJS.enabled) {\n            return;\n        }\n        var instanceOptions = extend(extend({}, FileReaderJS.opts), opts);\n\n        element.addEventListener(\"paste\", onpaste, false);\n\n        function onpaste(e) {\n            var files = [];\n            var clipboardData = e.clipboardData || {};\n            var items = clipboardData.items || [];\n\n            for (var i = 0; i < items.length; i++) {\n                var file = items[i].getAsFile();\n\n                if (file) {\n\n                    // Create a fake file name for images from clipboard, since this data doesn't get sent\n                    var matches = new RegExp(\"/\\(.*\\)\").exec(file.type);\n                    if (!file.name && matches) {\n                        var extension = matches[1];\n                        file.name = \"clipboard\" + i + \".\" + extension;\n                    }\n\n                    files.push(file);\n                }\n            }\n\n            if (files.length) {\n                processFileList(e, files, instanceOptions);\n                e.preventDefault();\n                e.stopPropagation();\n            }\n        }\n    }\n\n    // setupInput: bind the 'change' event to an input[type=file]\n    function setupInput(input, opts) {\n\n        if (!FileReaderJS.enabled) {\n            return;\n        }\n        var instanceOptions = extend(extend({}, FileReaderJS.opts), opts);\n\n        input.addEventListener(\"change\", inputChange, false);\n        input.addEventListener(\"drop\", inputDrop, false);\n\n        function inputChange(e) {\n            processFileList(e, input.files, instanceOptions);\n        }\n\n        function inputDrop(e) {\n            e.stopPropagation();\n            e.preventDefault();\n            processFileList(e, e.dataTransfer.files, instanceOptions);\n        }\n    }\n    // setupFile: bind the 'change' event to an input[type=file]\n    function setupBlob(blob, opts) {\n       \n        if (!FileReaderJS.enabled) {\n            return;\n        }\n\n        if(blob.constructor !== Array && blob.constructor !== Function){\n            if(blob.name === undefined){\n                blob.name = \"blob\";\n            }          \n            blob = [blob];\n        }else{\n\n            if(blob[0].name === undefined){\n                blob[0].name = \"blob\";\n            }    \n        }\n        \n        var instanceOptions = extend(extend({}, FileReaderJS.opts), opts);\n\n        processFileList(null, blob, instanceOptions);\n\n    }\n    // setupDrop: bind the 'drop' event for a DOM element\n    function setupDrop(dropbox, opts) {\n\n        if (!FileReaderJS.enabled) {\n            return;\n        }\n        var instanceOptions = extend(extend({}, FileReaderJS.opts), opts);\n        var dragClass = instanceOptions.dragClass;\n        var initializedOnBody = false;\n\n        // Bind drag events to the dropbox to add the class while dragging, and accept the drop data transfer.\n        dropbox.addEventListener(\"dragenter\", onlyWithFiles(dragenter), false);\n        dropbox.addEventListener(\"dragleave\", onlyWithFiles(dragleave), false);\n        dropbox.addEventListener(\"dragover\", onlyWithFiles(dragover), false);\n        dropbox.addEventListener(\"drop\", onlyWithFiles(drop), false);\n\n        // Bind to body to prevent the dropbox events from firing when it was initialized on the page.\n        document.body.addEventListener(\"dragstart\", bodydragstart, true);\n        document.body.addEventListener(\"dragend\", bodydragend, true);\n        document.body.addEventListener(\"drop\", bodydrop, false);\n\n        function bodydragend(e) {\n            initializedOnBody = false;\n        }\n\n        function bodydragstart(e) {\n            initializedOnBody = true;\n        }\n\n        function bodydrop(e) {\n            if (e.dataTransfer.files && e.dataTransfer.files.length ){\n                e.stopPropagation();\n                e.preventDefault();\n            }\n        }\n\n        function onlyWithFiles(fn) {\n            return function() {\n                if (!initializedOnBody) {\n                    fn.apply(this, arguments);\n                }\n            };\n        }\n\n        function drop(e) {\n            e.stopPropagation();\n            e.preventDefault();\n            if (dragClass) {\n                removeClass(dropbox, dragClass);\n            }\n            processFileList(e, e.dataTransfer.files, instanceOptions);\n        }\n\n        function dragenter(e) {\n            e.stopPropagation();\n            e.preventDefault();\n            if (dragClass) {\n                addClass(dropbox, dragClass);\n            }\n        }\n\n        function dragleave(e) {\n            if (dragClass) {\n                removeClass(dropbox, dragClass);\n            }\n        }\n\n        function dragover(e) {\n            e.stopPropagation();\n            e.preventDefault();\n            if (dragClass) {\n                addClass(dropbox, dragClass);\n            }\n        }\n    }\n\n    // setupCustomFileProperties: modify the file object with extra properties\n    function setupCustomFileProperties(files, groupID) {\n        for (var i = 0; i < files.length; i++) {\n            var file = files[i];\n            file.extra = {\n                nameNoExtension: file.name.substring(0, file.name.lastIndexOf('.')),\n                extension: file.name.substring(file.name.lastIndexOf('.') + 1),\n                fileID: i,\n                uniqueID: getUniqueID(),\n                groupID: groupID,\n                prettySize: prettySize(file.size)\n            };\n        }\n    }\n\n    // getReadAsMethod: return method name for 'readAs*' - http://www.w3.org/TR/FileAPI/#reading-a-file\n    function getReadAsMethod(type, readAsMap, readAsDefault) {\n        for (var r in readAsMap) {\n            if (type.match(new RegExp(r))) {\n                return 'readAs' + readAsMap[r];\n            }\n        }\n        return 'readAs' + readAsDefault;\n    }\n\n    // processFileList: read the files with FileReader, send off custom events.\n    function processFileList(e, files, opts) {\n        var filesLeft = files.length;\n        var group = {\n            groupID: getGroupID(),\n            files: files,\n            started: new Date()\n        };\n\n        function groupEnd() {\n            group.ended = new Date();\n            opts.on.groupend(group);\n        }\n\n        function groupFileDone() {\n            if (--filesLeft === 0) {\n                groupEnd();\n            }\n        }\n\n        FileReaderJS.output.push(group);\n        setupCustomFileProperties(files, group.groupID);\n\n        opts.on.groupstart(group);\n\n        // No files in group - end immediately\n        if (!files.length) {\n            groupEnd();\n            return;\n        }\n\n        var supportsSync = sync && FileReaderSyncSupport;\n        var syncWorker;\n\n        // Only initialize the synchronous worker if the option is enabled - to prevent the overhead\n        if (supportsSync) {\n            syncWorker = makeWorker(workerScript);\n            syncWorker.onmessage = function(e) {\n                var file = e.data.file;\n                var result = e.data.result;\n\n                // Workers seem to lose the custom property on the file object.\n                if (!file.extra) {\n                    file.extra = e.data.extra;\n                }\n\n                file.extra.ended = new Date();\n\n                // Call error or load event depending on success of the read from the worker.\n                opts.on[result === \"error\" ? \"error\" : \"load\"]({ target: { result: result } }, file);\n                groupFileDone();\n            };\n        }\n\n        Array.prototype.forEach.call(files, function(file) {\n\n            file.extra.started = new Date();\n\n            if (opts.accept && !file.type.match(new RegExp(opts.accept))) {\n                opts.on.skip(file);\n                groupFileDone();\n                return;\n            }\n\n            if (opts.on.beforestart(file) === false) {\n                opts.on.skip(file);\n                groupFileDone();\n                return;\n            }\n\n            var readAs = getReadAsMethod(file.type, opts.readAsMap, opts.readAsDefault);\n\n            if (syncWorker) {\n                syncWorker.postMessage({\n                    file: file,\n                    extra: file.extra,\n                    readAs: readAs\n                });\n            }\n            else {\n\n                var reader = new FileReader();\n                reader.originalEvent = e;\n\n                fileReaderEvents.forEach(function(eventName) {\n                    reader['on' + eventName] = function(e) {\n                        if (eventName == 'load' || eventName == 'error') {\n                            file.extra.ended = new Date();\n                        }\n                        opts.on[eventName](e, file);\n                        if (eventName == 'loadend') {\n                            groupFileDone();\n                        }\n                    };\n                });\n                reader[readAs](file);\n            }\n        });\n    }\n\n    // checkFileReaderSyncSupport: Create a temporary worker and see if FileReaderSync exists\n    function checkFileReaderSyncSupport() {\n        var worker = makeWorker(syncDetectionScript);\n        if (worker) {\n            worker.onmessage =function(e) {\n                FileReaderSyncSupport = e.data;\n            };\n            worker.postMessage({});\n        }\n    }\n\n    // noop: do nothing\n    function noop() {\n\n    }\n\n    // extend: used to make deep copies of options object\n    function extend(destination, source) {\n        for (var property in source) {\n            if (source[property] && source[property].constructor &&\n                source[property].constructor === Object) {\n                destination[property] = destination[property] || {};\n                arguments.callee(destination[property], source[property]);\n            }\n            else {\n                destination[property] = source[property];\n            }\n        }\n        return destination;\n    }\n\n    // hasClass: does an element have the css class?\n    function hasClass(el, name) {\n        return new RegExp(\"(?:^|\\\\s+)\" + name + \"(?:\\\\s+|$)\").test(el.className);\n    }\n\n    // addClass: add the css class for the element.\n    function addClass(el, name) {\n        if (!hasClass(el, name)) {\n          el.className = el.className ? [el.className, name].join(' ') : name;\n        }\n    }\n\n    // removeClass: remove the css class from the element.\n    function removeClass(el, name) {\n        if (hasClass(el, name)) {\n          var c = el.className;\n          el.className = c.replace(new RegExp(\"(?:^|\\\\s+)\" + name + \"(?:\\\\s+|$)\", \"g\"), \" \").replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n        }\n    }\n\n    // prettySize: convert bytes to a more readable string.\n    function prettySize(bytes) {\n        var s = ['bytes', 'kb', 'MB', 'GB', 'TB', 'PB'];\n        var e = Math.floor(Math.log(bytes)/Math.log(1024));\n        return (bytes/Math.pow(1024, Math.floor(e))).toFixed(2)+\" \"+s[e];\n    }\n\n    // getGroupID: generate a unique int ID for groups.\n    var getGroupID = (function(id) {\n        return function() {\n            return id++;\n        };\n    })(0);\n\n    // getUniqueID: generate a unique int ID for files\n    var getUniqueID = (function(id) {\n        return function() {\n            return id++;\n        };\n    })(0);\n\n    // The interface is supported, bind the FileReaderJS callbacks\n    FileReaderJS.enabled = true;\n\n})(this, document);"
  },
  {
    "path": "example/pages/include/PPTXjs/js/pptxjs.js",
    "content": "/**\r\n * pptxjs.js\r\n * Ver. : 1.10.4\r\n * last update: 14/05/2020\r\n * Author: meshesha , https://github.com/meshesha\r\n * LICENSE: MIT\r\n * url:https://meshesha.github.io/pptxjs\r\n * New: \r\n *  - fixed security issue\r\n *  - new divs2slides (v.1.3.2)\r\n *  - fixed div width issue\r\n */\r\n\r\n(function ($) {\r\n    $.fn.pptxToHtml = function (options) {\r\n        //var worker;\r\n        var $result = $(this);\r\n        var divId = $result.attr(\"id\");\r\n\r\n        var isDone = false;\r\n\r\n        var MsgQueue = new Array();\r\n\r\n        var themeContent = null;\r\n\r\n        var slideLayoutClrOvride = \"\";\r\n\r\n        var chartID = 0;\r\n        var _order = 1;\r\n        var titleFontSize = 42;\r\n        var bodyFontSize = 20;\r\n        var otherFontSize = 16;\r\n        var isSlideMode = false;\r\n        var styleTable = {};\r\n        var settings = $.extend(true, {\r\n            // These are the defaults.\r\n            pptxFileUrl: \"\",\r\n            fileInputId: \"\",\r\n            slidesScale: \"\", //Change Slides scale by percent\r\n            slideMode: false, /** true,false*/\r\n            keyBoardShortCut: false,  /** true,false ,condition: slideMode: true XXXXX - need to remove - this is doublcated*/\r\n            mediaProcess: true, /** true,false: if true then process video and audio files */\r\n            jsZipV2: false,\r\n            slideModeConfig: {\r\n                first: 1,\r\n                nav: true, /** true,false : show or not nav buttons*/\r\n                navTxtColor: \"black\", /** color */\r\n                keyBoardShortCut: true, /** true,false ,condition: */\r\n                showSlideNum: true, /** true,false */\r\n                showTotalSlideNum: true, /** true,false */\r\n                autoSlide: true, /** false or seconds , F8 to active ,keyBoardShortCut: true */\r\n                randomAutoSlide: false, /** true,false ,autoSlide:true */\r\n                loop: false,  /** true,false */\r\n                background: false, /** false or color*/\r\n                transition: \"default\", /** transition type: \"slid\",\"fade\",\"default\",\"random\" , to show transition efects :transitionTime > 0.5 */\r\n                transitionTime: 1 /** transition time between slides in seconds */\r\n            }\r\n        }, options);\r\n        //\r\n        $(\"#\" + divId).prepend(\r\n            $(\"<span></span>\").attr({\r\n                \"class\": \"slides-loadnig-msg\",\r\n                \"style\": \"display:block; color:blue; font-size:20px; width:50%; margin:0 auto;\"\r\n            }).html(\"Loading...\")\r\n        );\r\n        if (settings.slideMode) {\r\n            if (!jQuery().divs2slides) {\r\n                jQuery.getScript('./js/divs2slides.js');\r\n            }\r\n        }\r\n        if (settings.jsZipV2 !== false) {\r\n            jQuery.getScript(settings.jsZipV2);\r\n            if (localStorage.getItem('isPPTXjsReLoaded') !== 'yes') {\r\n                localStorage.setItem('isPPTXjsReLoaded', 'yes');\r\n                location.reload();\r\n            }\r\n        }\r\n\r\n        if (settings.keyBoardShortCut) {\r\n            $(document).bind(\"keydown\", function (event) {\r\n                event.preventDefault();\r\n                var key = event.keyCode;\r\n                console.log(key, isDone)\r\n                if (key == 116 && !isSlideMode) { //F5\r\n                    isSlideMode = true;\r\n                    $(\"#\" + divId + \" .slide\").hide();\r\n                    setTimeout(function () {\r\n                        //if(isDone){\r\n                        var slideConf = settings.slideModeConfig;\r\n                        //console.log(key,isDone,slideConf)\r\n                        $(\".slides-loadnig-msg\").remove()\r\n                        $(\"#\" + divId).divs2slides({\r\n                            first: slideConf.first,\r\n                            nav: slideConf.nav,\r\n                            showPlayPauseBtn: settings.showPlayPauseBtn,\r\n                            navTxtColor: slideConf.navTxtColor,\r\n                            keyBoardShortCut: slideConf.keyBoardShortCut,\r\n                            showSlideNum: slideConf.showSlideNum,\r\n                            showTotalSlideNum: slideConf.showTotalSlideNum,\r\n                            autoSlide: slideConf.autoSlide,\r\n                            randomAutoSlide: slideConf.randomAutoSlide,\r\n                            loop: slideConf.loop,\r\n                            background: slideConf.background,\r\n                            transition: slideConf.transition,\r\n                            transitionTime: slideConf.transitionTime\r\n                        });\r\n                        //}\r\n\r\n                        var sScale = settings.slidesScale;\r\n                        var trnsfrmScl = \"\";\r\n                        if (sScale != \"\") {\r\n                            var numsScale = parseInt(sScale);\r\n                            var scaleVal = numsScale / 100;\r\n                            trnsfrmScl = 'transform:scale(' + scaleVal + '); transform-origin:top';\r\n                        }\r\n\r\n                        var numOfSlides = 1;\r\n                        var sScaleVal = (sScale != \"\") ? scaleVal : 1;\r\n                        var slidesHeight = $(\"#\" + divId + \" .slide\").height();\r\n                        //console.log(slidesHeight);\r\n                        $(\"#all_slides_warpper\").attr({\r\n                            style: trnsfrmScl  /*+ \";height: \" + (numOfSlides * slidesHeight * sScaleVal) + \"px\"*/\r\n                        })\r\n                    }, 1500);\r\n                } else if (key == 116 && isSlideMode) {\r\n                    //exit slide mode - TODO\r\n\r\n                }\r\n            });\r\n        }\r\n        if (settings.pptxFileUrl != \"\") {\r\n            JSZipUtils.getBinaryContent(settings.pptxFileUrl, function (err, content) {\r\n                var blob = new Blob([content]);\r\n                var file_name = settings.pptxFileUrl;\r\n                var fArry = file_name.split(\".\");\r\n                fArry.pop();\r\n                blob.name = fArry[0];\r\n                FileReaderJS.setupBlob(blob, {\r\n                    readAsDefault: \"ArrayBuffer\",\r\n                    on: {\r\n                        load: function (e, file) {\r\n                            //console.log(e.target.result);\r\n                            convertToHtml(e.target.result);\r\n                        }\r\n                    }\r\n                });\r\n            });\r\n        } else {\r\n            $(\".slides-loadnig-msg\").remove()\r\n        }\r\n        if (settings.fileInputId != \"\") {\r\n            $(\"#\" + settings.fileInputId).on(\"change\", function (evt) {\r\n                $result.html(\"\");\r\n                var file = evt.target.files[0];\r\n                // var fileName = file[0].name;\r\n                //var fileSize = file[0].size;\r\n                var fileType = file.type;\r\n                if (fileType == \"application/vnd.openxmlformats-officedocument.presentationml.presentation\") {\r\n                    FileReaderJS.setupBlob(file, {\r\n                        readAsDefault: \"ArrayBuffer\",\r\n                        on: {\r\n                            load: function (e, file) {\r\n                                //console.log(e.target.result);\r\n                                convertToHtml(e.target.result);\r\n                            }\r\n                        }\r\n                    });\r\n                } else {\r\n                    alert(\"This is not pptx file\");\r\n                }\r\n            });\r\n        }\r\n        function convertToHtml(file) {\r\n            //'use strict';\r\n            var zip = new JSZip(), s;\r\n            //if (typeof file === 'string') { // Load\r\n            zip = zip.load(file);  //zip.load(file, { base64: true });\r\n            var rslt_ary = processPPTX(zip);\r\n            //s = readXmlFile(zip, 'ppt/tableStyles.xml');\r\n\r\n            var slidesHeight = $(\"#\" + divId + \" .slide\").height();\r\n\r\n            for (var i = 0; i < rslt_ary.length; i++) {\r\n                switch (rslt_ary[i][\"type\"]) {\r\n                    case \"slide\":\r\n                        $result.append(rslt_ary[i][\"data\"]);\r\n                        break;\r\n                    case \"pptx-thumb\":\r\n                        //$(\"#pptx-thumb\").attr(\"src\", \"data:image/jpeg;base64,\" +rslt_ary[i][\"data\"]);\r\n                        break;\r\n                    case \"slideSize\":\r\n                        /*\r\n                        var slideWidth = rslt_ary[i][\"data\"].width;\r\n                        var slideHeight = rslt_ary[i][\"data\"].height;\r\n                        $(\"#\"+divId).css({\r\n                            'width': slideWidth + 80,\r\n                            'height': slideHeight + 60\r\n                        });\r\n                        */\r\n                        break;\r\n                    case \"globalCSS\":\r\n                        $result.append(\"<style>\" + rslt_ary[i][\"data\"] + \"</style>\");\r\n                        break;\r\n                    case \"ExecutionTime\":\r\n                        // $result.prepend(\"<div id='presentation_toolbar'></div>\");\r\n                        processMsgQueue(MsgQueue);\r\n                        setNumericBullets($(\".block\"));\r\n                        setNumericBullets($(\"table td\"));\r\n\r\n                        isDone = true;\r\n\r\n                        if (settings.slideMode && !isSlideMode) {\r\n                            isSlideMode = true;\r\n                            $(\"#\" + divId + \" .slide\").hide();\r\n                            setTimeout(function () {\r\n                                var slideConf = settings.slideModeConfig;\r\n                                $(\".slides-loadnig-msg\").remove();\r\n                                $(\"#\" + divId).divs2slides({\r\n                                    first: slideConf.first,\r\n                                    nav: slideConf.nav,\r\n                                    showPlayPauseBtn: settings.showPlayPauseBtn,\r\n                                    navTxtColor: slideConf.navTxtColor,\r\n                                    keyBoardShortCut: slideConf.keyBoardShortCut,\r\n                                    showSlideNum: slideConf.showSlideNum,\r\n                                    showTotalSlideNum: slideConf.showTotalSlideNum,\r\n                                    autoSlide: slideConf.autoSlide,\r\n                                    randomAutoSlide: slideConf.randomAutoSlide,\r\n                                    loop: slideConf.loop,\r\n                                    background: slideConf.background,\r\n                                    transition: slideConf.transition,\r\n                                    transitionTime: slideConf.transitionTime\r\n                                });\r\n\r\n                                var sScale = settings.slidesScale;\r\n                                var trnsfrmScl = \"\";\r\n                                if (sScale != \"\") {\r\n                                    var numsScale = parseInt(sScale);\r\n                                    var scaleVal = numsScale / 100;\r\n                                    trnsfrmScl = 'transform:scale(' + scaleVal + '); transform-origin:top';\r\n                                }\r\n\r\n                                var numOfSlides = 1;\r\n                                var sScaleVal = (sScale != \"\") ? scaleVal : 1;\r\n                                //console.log(slidesHeight);\r\n                                $(\"#all_slides_warpper\").attr({\r\n                                    style: trnsfrmScl + \";height: \" + (numOfSlides * slidesHeight * sScaleVal) + \"px\"\r\n                                })\r\n\r\n                            }, 1500);\r\n                        } else if (!settings.slideMode) {\r\n                            $(\".slides-loadnig-msg\").remove();\r\n                        }\r\n                        break;\r\n                    default:\r\n                }\r\n            }\r\n            if (!settings.slideMode) {\r\n                if (document.getElementById(\"all_slides_warpper\") === null) {\r\n                    $(\"#\" + divId + \" .slide\").wrapAll(\"<div id='all_slides_warpper'></div>\");\r\n                }\r\n            }\r\n            var sScale = settings.slidesScale;\r\n            var trnsfrmScl = \"\";\r\n            if (sScale != \"\") {\r\n                var numsScale = parseInt(sScale);\r\n                var scaleVal = numsScale / 100;\r\n                trnsfrmScl = 'transform:scale(' + scaleVal + '); transform-origin:top';\r\n            }\r\n\r\n            var slidesHeight = $(\"#\" + divId + \" .slide\").height();\r\n            var numOfSlides = $(\"#\" + divId + \" .slide\").length;\r\n            var sScaleVal = (sScale != \"\") ? scaleVal : 1;\r\n            //console.log(\"slidesHeight: \" + slidesHeight + \"\\nnumOfSlides: \" + numOfSlides + \"\\nScale: \" + sScaleVal)\r\n\r\n            $(\"#all_slides_warpper\").attr({\r\n                style: trnsfrmScl + \";height: \" + (numOfSlides * slidesHeight * sScaleVal) + \"px\"\r\n            })\r\n\r\n            //}\r\n        }\r\n        function processPPTX(zip) {\r\n            var post_ary = [];\r\n            var dateBefore = new Date();\r\n\r\n            if (zip.file(\"docProps/thumbnail.jpeg\") !== null) {\r\n                var pptxThumbImg = base64ArrayBuffer(zip.file(\"docProps/thumbnail.jpeg\").asArrayBuffer());\r\n                post_ary.push({\r\n                    \"type\": \"pptx-thumb\",\r\n                    \"data\": pptxThumbImg\r\n                });\r\n            }\r\n\r\n            var filesInfo = getContentTypes(zip);\r\n            var slideSize = getSlideSize(zip);\r\n            themeContent = loadTheme(zip);\r\n\r\n            tableStyles = readXmlFile(zip, \"ppt/tableStyles.xml\");\r\n\r\n            post_ary.push({\r\n                \"type\": \"slideSize\",\r\n                \"data\": slideSize\r\n            });\r\n\r\n            var numOfSlides = filesInfo[\"slides\"].length;\r\n            for (var i = 0; i < numOfSlides; i++) {\r\n                var filename = filesInfo[\"slides\"][i];\r\n                var slideHtml = processSingleSlide(zip, filename, i, slideSize);\r\n                post_ary.push({\r\n                    \"type\": \"slide\",\r\n                    \"data\": slideHtml\r\n                });\r\n                post_ary.push({\r\n                    \"type\": \"progress-update\",\r\n                    \"data\": (i + 1) * 100 / numOfSlides\r\n                });\r\n            }\r\n\r\n            post_ary.push({\r\n                \"type\": \"globalCSS\",\r\n                \"data\": genGlobalCSS()\r\n            });\r\n\r\n            var dateAfter = new Date();\r\n            post_ary.push({\r\n                \"type\": \"ExecutionTime\",\r\n                \"data\": dateAfter - dateBefore\r\n            });\r\n            return post_ary;\r\n        }\r\n\r\n        function readXmlFile(zip, filename) {\r\n            var xmlData = tXml(zip.file(filename).asText(), { simplify: 1 });\r\n            if (xmlData[\"?xml\"] !== undefined) {\r\n                return xmlData[\"?xml\"];\r\n            } else {\r\n                return xmlData;\r\n            }\r\n\r\n        }\r\n        function getContentTypes(zip) {\r\n            var ContentTypesJson = readXmlFile(zip, \"[Content_Types].xml\");\r\n\r\n            var subObj = ContentTypesJson[\"Types\"][\"Override\"];\r\n            var slidesLocArray = [];\r\n            var slideLayoutsLocArray = [];\r\n            for (var i = 0; i < subObj.length; i++) {\r\n                switch (subObj[i][\"attrs\"][\"ContentType\"]) {\r\n                    case \"application/vnd.openxmlformats-officedocument.presentationml.slide+xml\":\r\n                        slidesLocArray.push(subObj[i][\"attrs\"][\"PartName\"].substr(1));\r\n                        break;\r\n                    case \"application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml\":\r\n                        slideLayoutsLocArray.push(subObj[i][\"attrs\"][\"PartName\"].substr(1));\r\n                        break;\r\n                    default:\r\n                }\r\n            }\r\n            return {\r\n                \"slides\": slidesLocArray,\r\n                \"slideLayouts\": slideLayoutsLocArray\r\n            };\r\n        }\r\n\r\n        function getSlideSize(zip) {\r\n            // Pixel = EMUs * Resolution / 914400;  (Resolution = 96)\r\n            var rtenObj = {};\r\n            var content = readXmlFile(zip, \"ppt/presentation.xml\");\r\n            var sldSzAttrs = content[\"p:presentation\"][\"p:sldSz\"][\"attrs\"];\r\n            //var cWidth = settings.width,\r\n            //    cHeight = settings.height;\r\n            //if(cWidth === false && cHeight === false){\r\n            rtenObj = {\r\n                \"width\": parseInt(sldSzAttrs[\"cx\"]) * 96 / 914400,\r\n                \"height\": parseInt(sldSzAttrs[\"cy\"]) * 96 / 914400\r\n            };\r\n            /*    \r\n            }else if(cWidth !== false && cHeight === false){\r\n                rtenObj =  {\r\n                    \"width\": cWidth,\r\n                    \"height\": parseInt(sldSzAttrs[\"cy\"]) * 96 / 914400\r\n                };\r\n            }else if(cWidth === false && cHeight !== false){\r\n                rtenObj =  {\r\n                    \"width\":  parseInt(sldSzAttrs[\"cx\"]) * 96 / 914400,\r\n                    \"height\": cHeight\r\n                };\r\n            }else{\r\n                rtenObj =  {\r\n                    \"width\":  cWidth,\r\n                    \"height\": cHeight\r\n                };\r\n\r\n            }*/\r\n            return rtenObj;\r\n        }\r\n\r\n        function loadTheme(zip) {\r\n            var preResContent = readXmlFile(zip, \"ppt/_rels/presentation.xml.rels\");\r\n            var relationshipArray = preResContent[\"Relationships\"][\"Relationship\"];\r\n            var themeURI = undefined;\r\n            if (relationshipArray.constructor === Array) {\r\n                for (var i = 0; i < relationshipArray.length; i++) {\r\n                    if (relationshipArray[i][\"attrs\"][\"Type\"] === \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\") {\r\n                        themeURI = relationshipArray[i][\"attrs\"][\"Target\"];\r\n                        break;\r\n                    }\r\n                }\r\n            } else if (relationshipArray[\"attrs\"][\"Type\"] === \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\") {\r\n                themeURI = relationshipArray[\"attrs\"][\"Target\"];\r\n            }\r\n\r\n            if (themeURI === undefined) {\r\n                throw Error(\"Can't open theme file.\");\r\n            }\r\n\r\n            return readXmlFile(zip, \"ppt/\" + themeURI);\r\n        }\r\n\r\n        function processSingleSlide(zip, sldFileName, index, slideSize) {\r\n            /*\r\n            self.postMessage({\r\n                \"type\": \"INFO\",\r\n                \"data\": \"Processing slide\" + (index + 1)\r\n            });\r\n            */\r\n            // =====< Step 1 >=====\r\n            // Read relationship filename of the slide (Get slideLayoutXX.xml)\r\n            // @sldFileName: ppt/slides/slide1.xml\r\n            // @resName: ppt/slides/_rels/slide1.xml.rels\r\n            var resName = sldFileName.replace(\"slides/slide\", \"slides/_rels/slide\") + \".rels\";\r\n            var resContent = readXmlFile(zip, resName);\r\n            var RelationshipArray = resContent[\"Relationships\"][\"Relationship\"];\r\n            var layoutFilename = \"\";\r\n            var slideResObj = {};\r\n            if (RelationshipArray.constructor === Array) {\r\n                for (var i = 0; i < RelationshipArray.length; i++) {\r\n                    switch (RelationshipArray[i][\"attrs\"][\"Type\"]) {\r\n                        case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout\":\r\n                            layoutFilename = RelationshipArray[i][\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\");\r\n                            break;\r\n                        case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide\":\r\n                        case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\":\r\n                        case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\":\r\n                        case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\":\r\n                        default:\r\n                            slideResObj[RelationshipArray[i][\"attrs\"][\"Id\"]] = {\r\n                                \"type\": RelationshipArray[i][\"attrs\"][\"Type\"].replace(\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/\", \"\"),\r\n                                \"target\": RelationshipArray[i][\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\")\r\n                            };\r\n                    }\r\n                }\r\n            } else {\r\n                layoutFilename = RelationshipArray[\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\");\r\n            }\r\n            //console.log(slideResObj);\r\n            // Open slideLayoutXX.xml\r\n            var slideLayoutContent = readXmlFile(zip, layoutFilename);\r\n            var slideLayoutTables = indexNodes(slideLayoutContent);\r\n            var sldLayoutClrOvr = slideLayoutContent[\"p:sldLayout\"][\"p:clrMapOvr\"][\"a:overrideClrMapping\"];\r\n\r\n            //console.log(slideLayoutClrOvride);\r\n            if (sldLayoutClrOvr !== undefined) {\r\n                slideLayoutClrOvride = sldLayoutClrOvr[\"attrs\"];\r\n            }\r\n            // =====< Step 2 >=====\r\n            // Read slide master filename of the slidelayout (Get slideMasterXX.xml)\r\n            // @resName: ppt/slideLayouts/slideLayout1.xml\r\n            // @masterName: ppt/slideLayouts/_rels/slideLayout1.xml.rels\r\n            var slideLayoutResFilename = layoutFilename.replace(\"slideLayouts/slideLayout\", \"slideLayouts/_rels/slideLayout\") + \".rels\";\r\n            var slideLayoutResContent = readXmlFile(zip, slideLayoutResFilename);\r\n            RelationshipArray = slideLayoutResContent[\"Relationships\"][\"Relationship\"];\r\n            var masterFilename = \"\";\r\n            var layoutResObj = {};\r\n            if (RelationshipArray.constructor === Array) {\r\n                for (var i = 0; i < RelationshipArray.length; i++) {\r\n                    switch (RelationshipArray[i][\"attrs\"][\"Type\"]) {\r\n                        case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster\":\r\n                            masterFilename = RelationshipArray[i][\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\");\r\n                            break;\r\n                        default:\r\n                            layoutResObj[RelationshipArray[i][\"attrs\"][\"Id\"]] = {\r\n                                \"type\": RelationshipArray[i][\"attrs\"][\"Type\"].replace(\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/\", \"\"),\r\n                                \"target\": RelationshipArray[i][\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\")\r\n                            };\r\n                    }\r\n                }\r\n            } else {\r\n                masterFilename = RelationshipArray[\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\");\r\n            }\r\n            // Open slideMasterXX.xml\r\n            var slideMasterContent = readXmlFile(zip, masterFilename);\r\n            var slideMasterTextStyles = getTextByPathList(slideMasterContent, [\"p:sldMaster\", \"p:txStyles\"]);\r\n            var slideMasterTables = indexNodes(slideMasterContent);\r\n\r\n            /////////////////Amir/////////////\r\n            //Open slideMasterXX.xml.rels\r\n            var slideMasterResFilename = masterFilename.replace(\"slideMasters/slideMaster\", \"slideMasters/_rels/slideMaster\") + \".rels\";\r\n            var slideMasterResContent = readXmlFile(zip, slideMasterResFilename);\r\n            RelationshipArray = slideMasterResContent[\"Relationships\"][\"Relationship\"];\r\n            var themeFilename = \"\";\r\n            var masterResObj = {};\r\n            if (RelationshipArray.constructor === Array) {\r\n                for (var i = 0; i < RelationshipArray.length; i++) {\r\n                    switch (RelationshipArray[i][\"attrs\"][\"Type\"]) {\r\n                        case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\":\r\n                            themeFilename = RelationshipArray[i][\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\");\r\n                            break;\r\n                        default:\r\n                            masterResObj[RelationshipArray[i][\"attrs\"][\"Id\"]] = {\r\n                                \"type\": RelationshipArray[i][\"attrs\"][\"Type\"].replace(\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/\", \"\"),\r\n                                \"target\": RelationshipArray[i][\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\")\r\n                            };\r\n                    }\r\n                }\r\n            } else {\r\n                themeFilename = RelationshipArray[\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\");\r\n            }\r\n            //console.log(themeFilename)\r\n            //Load Theme file\r\n            if (themeFilename !== undefined) {\r\n                themeContent = readXmlFile(zip, themeFilename);\r\n            }\r\n            // =====< Step 3 >=====\r\n            var slideContent = readXmlFile(zip, sldFileName);\r\n            var nodes = slideContent[\"p:sld\"][\"p:cSld\"][\"p:spTree\"];\r\n            var warpObj = {\r\n                \"zip\": zip,\r\n                \"slideLayoutTables\": slideLayoutTables,\r\n                \"slideMasterTables\": slideMasterTables,\r\n                \"slideResObj\": slideResObj,\r\n                \"slideMasterTextStyles\": slideMasterTextStyles,\r\n                \"layoutResObj\": layoutResObj,\r\n                \"masterResObj\": masterResObj\r\n            };\r\n\r\n            var bgColor = getSlideBackgroundFill(slideContent, slideLayoutContent, slideMasterContent, warpObj);\r\n            var result = \"<div class='slide' style='width:\" + slideSize.width + \"px; height:\" + slideSize.height + \"px;\" + bgColor + \"'>\"\r\n            //result += \"<div>\"+getBackgroundShapes(slideContent, slideLayoutContent, slideMasterContent,warpObj) + \"</div>\" - TODO\r\n            for (var nodeKey in nodes) {\r\n                if (nodes[nodeKey].constructor === Array) {\r\n                    for (var i = 0; i < nodes[nodeKey].length; i++) {\r\n                        result += processNodesInSlide(nodeKey, nodes[nodeKey][i], warpObj);\r\n                    }\r\n                } else {\r\n                    result += processNodesInSlide(nodeKey, nodes[nodeKey], warpObj);\r\n                }\r\n            }\r\n\r\n            return result + \"</div>\";\r\n        }\r\n\r\n        function indexNodes(content) {\r\n\r\n            var keys = Object.keys(content);\r\n            var spTreeNode = content[keys[0]][\"p:cSld\"][\"p:spTree\"];\r\n\r\n            var idTable = {};\r\n            var idxTable = {};\r\n            var typeTable = {};\r\n\r\n            for (var key in spTreeNode) {\r\n\r\n                if (key == \"p:nvGrpSpPr\" || key == \"p:grpSpPr\") {\r\n                    continue;\r\n                }\r\n\r\n                var targetNode = spTreeNode[key];\r\n\r\n                if (targetNode.constructor === Array) {\r\n                    for (var i = 0; i < targetNode.length; i++) {\r\n                        var nvSpPrNode = targetNode[i][\"p:nvSpPr\"];\r\n                        var id = getTextByPathList(nvSpPrNode, [\"p:cNvPr\", \"attrs\", \"id\"]);\r\n                        var idx = getTextByPathList(nvSpPrNode, [\"p:nvPr\", \"p:ph\", \"attrs\", \"idx\"]);\r\n                        var type = getTextByPathList(nvSpPrNode, [\"p:nvPr\", \"p:ph\", \"attrs\", \"type\"]);\r\n\r\n                        if (id !== undefined) {\r\n                            idTable[id] = targetNode[i];\r\n                        }\r\n                        if (idx !== undefined) {\r\n                            idxTable[idx] = targetNode[i];\r\n                        }\r\n                        if (type !== undefined) {\r\n                            typeTable[type] = targetNode[i];\r\n                        }\r\n                    }\r\n                } else {\r\n                    var nvSpPrNode = targetNode[\"p:nvSpPr\"];\r\n                    var id = getTextByPathList(nvSpPrNode, [\"p:cNvPr\", \"attrs\", \"id\"]);\r\n                    var idx = getTextByPathList(nvSpPrNode, [\"p:nvPr\", \"p:ph\", \"attrs\", \"idx\"]);\r\n                    var type = getTextByPathList(nvSpPrNode, [\"p:nvPr\", \"p:ph\", \"attrs\", \"type\"]);\r\n\r\n                    if (id !== undefined) {\r\n                        idTable[id] = targetNode;\r\n                    }\r\n                    if (idx !== undefined) {\r\n                        idxTable[idx] = targetNode;\r\n                    }\r\n                    if (type !== undefined) {\r\n                        typeTable[type] = targetNode;\r\n                    }\r\n                }\r\n\r\n            }\r\n\r\n            return { \"idTable\": idTable, \"idxTable\": idxTable, \"typeTable\": typeTable };\r\n        }\r\n\r\n        function processNodesInSlide(nodeKey, nodeValue, warpObj) {\r\n\r\n            var result = \"\";\r\n\r\n            switch (nodeKey) {\r\n                case \"p:sp\":    // Shape, Text\r\n                    result = processSpNode(nodeValue, warpObj);\r\n                    break;\r\n                case \"p:cxnSp\":    // Shape, Text (with connection)\r\n                    result = processCxnSpNode(nodeValue, warpObj);\r\n                    break;\r\n                case \"p:pic\":    // Picture\r\n                    result = processPicNode(nodeValue, warpObj);\r\n                    break;\r\n                case \"p:graphicFrame\":    // Chart, Diagram, Table\r\n                    result = processGraphicFrameNode(nodeValue, warpObj);\r\n                    break;\r\n                case \"p:grpSp\":\r\n                    result = processGroupSpNode(nodeValue, warpObj);\r\n                    break;\r\n                case \"mc:AlternateContent\": //Equations and formulas as Image\r\n                    var mcFallbackNode = getTextByPathList(nodeValue, [\"mc:Fallback\", \"p:sp\"]);\r\n                    result = processSpNode(mcFallbackNode, warpObj);\r\n                    break;\r\n                default:\r\n            }\r\n\r\n            return result;\r\n\r\n        }\r\n\r\n        function processGroupSpNode(node, warpObj) {\r\n\r\n            var factor = 96 / 914400;\r\n\r\n            var xfrmNode = node[\"p:grpSpPr\"][\"a:xfrm\"];\r\n            var x = parseInt(xfrmNode[\"a:off\"][\"attrs\"][\"x\"]) * factor;\r\n            var y = parseInt(xfrmNode[\"a:off\"][\"attrs\"][\"y\"]) * factor;\r\n            var chx = parseInt(xfrmNode[\"a:chOff\"][\"attrs\"][\"x\"]) * factor;\r\n            var chy = parseInt(xfrmNode[\"a:chOff\"][\"attrs\"][\"y\"]) * factor;\r\n            var cx = parseInt(xfrmNode[\"a:ext\"][\"attrs\"][\"cx\"]) * factor;\r\n            var cy = parseInt(xfrmNode[\"a:ext\"][\"attrs\"][\"cy\"]) * factor;\r\n            var chcx = parseInt(xfrmNode[\"a:chExt\"][\"attrs\"][\"cx\"]) * factor;\r\n            var chcy = parseInt(xfrmNode[\"a:chExt\"][\"attrs\"][\"cy\"]) * factor;\r\n\r\n            var order = node[\"attrs\"][\"order\"];\r\n\r\n            var result = \"<div class='block group' style='z-index: \" + order + \"; top: \" + (y - chy) + \"px; left: \" + (x - chx) + \"px; width: \" + (cx - chcx) + \"px; height: \" + (cy - chcy) + \"px;'>\";\r\n\r\n            // Procsee all child nodes\r\n            for (var nodeKey in node) {\r\n                if (node[nodeKey].constructor === Array) {\r\n                    for (var i = 0; i < node[nodeKey].length; i++) {\r\n                        result += processNodesInSlide(nodeKey, node[nodeKey][i], warpObj);\r\n                    }\r\n                } else {\r\n                    result += processNodesInSlide(nodeKey, node[nodeKey], warpObj);\r\n                }\r\n            }\r\n\r\n            result += \"</div>\";\r\n\r\n            return result;\r\n        }\r\n\r\n        function processSpNode(node, warpObj) {\r\n\r\n            /*\r\n            *  958    <xsd:complexType name=\"CT_GvmlShape\">\r\n            *  959   <xsd:sequence>\r\n            *  960     <xsd:element name=\"nvSpPr\" type=\"CT_GvmlShapeNonVisual\"     minOccurs=\"1\" maxOccurs=\"1\"/>\r\n            *  961     <xsd:element name=\"spPr\"   type=\"CT_ShapeProperties\"        minOccurs=\"1\" maxOccurs=\"1\"/>\r\n            *  962     <xsd:element name=\"txSp\"   type=\"CT_GvmlTextShape\"          minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            *  963     <xsd:element name=\"style\"  type=\"CT_ShapeStyle\"             minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            *  964     <xsd:element name=\"extLst\" type=\"CT_OfficeArtExtensionList\" minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            *  965   </xsd:sequence>\r\n            *  966 </xsd:complexType>\r\n            */\r\n\r\n            var id = getTextByPathList(node, [\"p:nvSpPr\", \"p:cNvPr\", \"attrs\", \"id\"]);\r\n            var name = getTextByPathList(node, [\"p:nvSpPr\", \"p:cNvPr\", \"attrs\", \"name\"]);\r\n            var idx = (getTextByPathList(node, [\"p:nvSpPr\", \"p:nvPr\", \"p:ph\"]) === undefined) ? undefined : getTextByPathList(node, [\"p:nvSpPr\", \"p:nvPr\", \"p:ph\", \"attrs\", \"idx\"]);\r\n            var type = (getTextByPathList(node, [\"p:nvSpPr\", \"p:nvPr\", \"p:ph\"]) === undefined) ? undefined : getTextByPathList(node, [\"p:nvSpPr\", \"p:nvPr\", \"p:ph\", \"attrs\", \"type\"]);\r\n            var order = getTextByPathList(node, [\"attrs\", \"order\"]);\r\n\r\n            var slideLayoutSpNode = undefined;\r\n            var slideMasterSpNode = undefined;\r\n\r\n            if (type !== undefined) {\r\n                if (idx !== undefined) {\r\n                    slideLayoutSpNode = warpObj[\"slideLayoutTables\"][\"typeTable\"][type];\r\n                    slideMasterSpNode = warpObj[\"slideMasterTables\"][\"typeTable\"][type];\r\n                } else {\r\n                    slideLayoutSpNode = warpObj[\"slideLayoutTables\"][\"typeTable\"][type];\r\n                    slideMasterSpNode = warpObj[\"slideMasterTables\"][\"typeTable\"][type];\r\n                }\r\n            } else {\r\n                if (idx !== undefined) {\r\n                    slideLayoutSpNode = warpObj[\"slideLayoutTables\"][\"idxTable\"][idx];\r\n                    slideMasterSpNode = warpObj[\"slideMasterTables\"][\"idxTable\"][idx];\r\n                } else {\r\n                    // Nothing\r\n                }\r\n            }\r\n\r\n            if (type === undefined) {\r\n                type = getTextByPathList(slideLayoutSpNode, [\"p:nvSpPr\", \"p:nvPr\", \"p:ph\", \"attrs\", \"type\"]);\r\n                if (type === undefined) {\r\n                    type = getTextByPathList(slideMasterSpNode, [\"p:nvSpPr\", \"p:nvPr\", \"p:ph\", \"attrs\", \"type\"]);\r\n                }\r\n            }\r\n\r\n            return genShape(node, slideLayoutSpNode, slideMasterSpNode, id, name, idx, type, order, warpObj);\r\n        }\r\n\r\n        function processCxnSpNode(node, warpObj) {\r\n\r\n            var id = node[\"p:nvCxnSpPr\"][\"p:cNvPr\"][\"attrs\"][\"id\"];\r\n            var name = node[\"p:nvCxnSpPr\"][\"p:cNvPr\"][\"attrs\"][\"name\"];\r\n            //var idx = (node[\"p:nvCxnSpPr\"][\"p:nvPr\"][\"p:ph\"] === undefined) ? undefined : node[\"p:nvSpPr\"][\"p:nvPr\"][\"p:ph\"][\"attrs\"][\"idx\"];\r\n            //var type = (node[\"p:nvCxnSpPr\"][\"p:nvPr\"][\"p:ph\"] === undefined) ? undefined : node[\"p:nvSpPr\"][\"p:nvPr\"][\"p:ph\"][\"attrs\"][\"type\"];\r\n            //<p:cNvCxnSpPr>(<p:cNvCxnSpPr>, <a:endCxn>)\r\n            var order = node[\"attrs\"][\"order\"];\r\n\r\n            return genShape(node, undefined, undefined, id, name, undefined, undefined, order, warpObj);\r\n        }\r\n\r\n        function genShape(node, slideLayoutSpNode, slideMasterSpNode, id, name, idx, type, order, warpObj) {\r\n\r\n            var xfrmList = [\"p:spPr\", \"a:xfrm\"];\r\n            var slideXfrmNode = getTextByPathList(node, xfrmList);\r\n            var slideLayoutXfrmNode = getTextByPathList(slideLayoutSpNode, xfrmList);\r\n            var slideMasterXfrmNode = getTextByPathList(slideMasterSpNode, xfrmList);\r\n\r\n            var result = \"\";\r\n            var shpId = getTextByPathList(node, [\"attrs\", \"order\"]);\r\n            //console.log(\"shpId: \",shpId)\r\n            var shapType = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"attrs\", \"prst\"]);\r\n\r\n            //custGeom - Amir\r\n            var custShapType = getTextByPathList(node, [\"p:spPr\", \"a:custGeom\"]);\r\n\r\n            var isFlipV = false;\r\n            if (getTextByPathList(slideXfrmNode, [\"attrs\", \"flipV\"]) === \"1\" || getTextByPathList(slideXfrmNode, [\"attrs\", \"flipH\"]) === \"1\") {\r\n                isFlipV = true;\r\n            }\r\n            /////////////////////////Amir////////////////////////\r\n            //rotate\r\n            var rotate = angleToDegrees(getTextByPathList(slideXfrmNode, [\"attrs\", \"rot\"]));\r\n            //console.log(\"rotate: \"+rotate);\r\n            var txtRotate;\r\n            var txtXframeNode = getTextByPathList(node, [\"p:txXfrm\"]);\r\n            if (txtXframeNode !== undefined) {\r\n                var txtXframeRot = getTextByPathList(txtXframeNode, [\"attrs\", \"rot\"]);\r\n                if (txtXframeRot !== undefined) {\r\n                    txtRotate = angleToDegrees(txtXframeRot) + 90;\r\n                }\r\n            } else {\r\n                txtRotate = rotate;\r\n            }\r\n            //////////////////////////////////////////////////\r\n            if (shapType !== undefined || custShapType !== undefined) {\r\n                var off = getTextByPathList(slideXfrmNode, [\"a:off\", \"attrs\"]);\r\n                var x = parseInt(off[\"x\"]) * 96 / 914400;\r\n                var y = parseInt(off[\"y\"]) * 96 / 914400;\r\n\r\n                var ext = getTextByPathList(slideXfrmNode, [\"a:ext\", \"attrs\"]);\r\n                var w = parseInt(ext[\"cx\"]) * 96 / 914400;\r\n                var h = parseInt(ext[\"cy\"]) * 96 / 914400;\r\n\r\n                result += \"<svg class='drawing' _id='\" + id + \"' _idx='\" + idx + \"' _type='\" + type + \"' _name='\" + name +\r\n                    \"' style='\" +\r\n                    getPosition(slideXfrmNode, undefined, undefined) +\r\n                    getSize(slideXfrmNode, undefined, undefined) +\r\n                    \" z-index: \" + order + \";\" +\r\n                    \"transform: rotate(\" + rotate + \"deg);\" +\r\n                    \"'>\";\r\n                result += '<defs>'\r\n                // Fill Color\r\n                var fillColor = getShapeFill(node, true, warpObj);\r\n                var grndFillFlg = false;\r\n                var imgFillFlg = false;\r\n                var clrFillType = getFillType(getTextByPathList(node, [\"p:spPr\"]));\r\n                /////////////////////////////////////////                    \r\n                if (clrFillType == \"GRADIENT_FILL\") {\r\n                    grndFillFlg = true;\r\n                    var color_arry = fillColor.color;\r\n                    var angl = fillColor.rot;\r\n                    var svgGrdnt = getSvgGradient(w, h, angl, color_arry, shpId);\r\n                    //fill=\"url(#linGrd)\"\r\n                    result += svgGrdnt;\r\n                } else if (clrFillType == \"PIC_FILL\") {\r\n                    imgFillFlg = true;\r\n                    var svgBgImg = getSvgImagePattern(fillColor, shpId);\r\n                    //fill=\"url(#imgPtrn)\"\r\n                    //console.log(svgBgImg)\r\n                    result += svgBgImg;\r\n                } else {\r\n                    if (clrFillType != \"SOLID_FILL\" && clrFillType != \"PATTERN_FILL\" &&\r\n                        (shapType == \"arc\" ||\r\n                            shapType == \"bracketPair\" ||\r\n                            shapType == \"bracePair\" ||\r\n                            shapType == \"leftBracket\" ||\r\n                            shapType == \"leftBrace\" ||\r\n                            shapType == \"rightBrace\" ||\r\n                            shapType == \"rightBracket\")) { //Temp. solution  - TODO\r\n                        fillColor = \"none\";\r\n                    }\r\n                }\r\n                // Border Color\r\n                var border = getBorder(node, true, \"shape\");\r\n\r\n                var headEndNodeAttrs = getTextByPathList(node, [\"p:spPr\", \"a:ln\", \"a:headEnd\", \"attrs\"]);\r\n                var tailEndNodeAttrs = getTextByPathList(node, [\"p:spPr\", \"a:ln\", \"a:tailEnd\", \"attrs\"]);\r\n                // type: none, triangle, stealth, diamond, oval, arrow\r\n\r\n                if ((headEndNodeAttrs !== undefined && (headEndNodeAttrs[\"type\"] === \"triangle\" || headEndNodeAttrs[\"type\"] === \"arrow\")) ||\r\n                    (tailEndNodeAttrs !== undefined && (tailEndNodeAttrs[\"type\"] === \"triangle\" || tailEndNodeAttrs[\"type\"] === \"arrow\"))) {\r\n                    var triangleMarker = \"<marker id='markerTriangle_\" + shpId + \"' viewBox='0 0 10 10' refX='1' refY='5' markerWidth='5' markerHeight='5' stroke='\" + border.color + \"' fill='\" + border.color +\r\n                        \"' orient='auto-start-reverse' markerUnits='strokeWidth'><path d='M 0 0 L 10 5 L 0 10 z' /></marker>\";\r\n                    result += triangleMarker;\r\n                }\r\n                result += '</defs>'\r\n            }\r\n            if (shapType !== undefined && custShapType === undefined) {\r\n\r\n                switch (shapType) {\r\n                    case \"rect\":\r\n                    case \"flowChartProcess\":\r\n                    case \"flowChartPredefinedProcess\":\r\n                    case \"flowChartInternalStorage\":\r\n                    case \"actionButtonBlank\":\r\n                        result += \"<rect x='0' y='0' width='\" + w + \"' height='\" + h + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        if (shapType == \"flowChartPredefinedProcess\") {\r\n                            result += \"<rect x='\" + w * (1 / 8) + \"' y='0' width='\" + w * (6 / 8) + \"' height='\" + h + \"' fill='none' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        } else if (shapType == \"flowChartInternalStorage\") {\r\n                            result += \" <polyline points='\" + w * (1 / 8) + \" 0,\" + w * (1 / 8) + \" \" + h + \"' fill='none' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                            result += \" <polyline points='0 \" + h * (1 / 8) + \",\" + w + \" \" + h * (1 / 8) + \"' fill='none' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        }\r\n                        break;\r\n                    case \"flowChartCollate\":\r\n                        var d = \"M 0,0\" +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"flowChartDocument\":\r\n                        var y1, y2, y3, x1;\r\n                        x1 = w * 10800 / 21600;\r\n                        y1 = h * 17322 / 21600;\r\n                        y2 = h * 20172 / 21600;\r\n                        y3 = h * 23922 / 21600;\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + y1 +\r\n                            \" C\" + x1 + \",\" + y1 + \" \" + x1 + \",\" + y3 + \" \" + 0 + \",\" + y2 +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"flowChartMultidocument\":\r\n                        var y1, y2, y3, y4, y5, y6, y7, y8, y9, x1, x2, x3, x4, x5, x6, x7;\r\n                        y1 = h * 18022 / 21600;\r\n                        y2 = h * 3675 / 21600;\r\n                        y3 = h * 23542 / 21600;\r\n                        y4 = h * 1815 / 21600;\r\n                        y5 = h * 16252 / 21600;\r\n                        y6 = h * 16352 / 21600;\r\n                        y7 = h * 14392 / 21600;\r\n                        y8 = h * 20782 / 21600;\r\n                        y9 = h * 14467 / 21600;\r\n                        x1 = w * 1532 / 21600;\r\n                        x2 = w * 20000 / 21600;\r\n                        x3 = w * 9298 / 21600;\r\n                        x4 = w * 19298 / 21600;\r\n                        x5 = w * 18595 / 21600;\r\n                        x6 = w * 2972 / 21600;\r\n                        x7 = w * 20800 / 21600;\r\n                        var d = \"M\" + 0 + \",\" + y2 +\r\n                            \" L\" + x5 + \",\" + y2 +\r\n                            \" L\" + x5 + \",\" + y1 +\r\n                            \" C\" + x3 + \",\" + y1 + \" \" + x3 + \",\" + y3 + \" \" + 0 + \",\" + y8 +\r\n                            \" z\" +\r\n                            \"M\" + x1 + \",\" + y2 +\r\n                            \" L\" + x1 + \",\" + y4 +\r\n                            \" L\" + x2 + \",\" + y4 +\r\n                            \" L\" + x2 + \",\" + y5 +\r\n                            \" C\" + x4 + \",\" + y5 + \" \" + x5 + \",\" + y6 + \" \" + x5 + \",\" + y6 +\r\n                            \"M\" + x6 + \",\" + y4 +\r\n                            \" L\" + x6 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + y7 +\r\n                            \" C\" + x7 + \",\" + y7 + \" \" + x2 + \",\" + y9 + \" \" + x2 + \",\" + y9;\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"actionButtonBackPrevious\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, g11, g12;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        g11 = hc - dx2;\r\n                        g12 = hc + dx2;\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \"M\" + g11 + \",\" + vc +\r\n                            \" L\" + g12 + \",\" + g9 +\r\n                            \" L\" + g12 + \",\" + g10 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonBeginning\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, g11, g12, g13, g14, g15, g16, g17;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        g11 = hc - dx2;\r\n                        g12 = hc + dx2;\r\n                        g13 = ss * 3 / 4;\r\n                        g14 = g13 / 8;\r\n                        g15 = g13 / 4;\r\n                        g16 = g11 + g14;\r\n                        g17 = g11 + g15;\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \"M\" + g17 + \",\" + vc +\r\n                            \" L\" + g12 + \",\" + g9 +\r\n                            \" L\" + g12 + \",\" + g10 +\r\n                            \" z\" +\r\n                            \"M\" + g16 + \",\" + g9 +\r\n                            \" L\" + g11 + \",\" + g9 +\r\n                            \" L\" + g11 + \",\" + g10 +\r\n                            \" L\" + g16 + \",\" + g10 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonDocument\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, dx1, g11, g12, g13, g14, g15;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        dx1 = ss * 9 / 32;\r\n                        g11 = hc - dx1;\r\n                        g12 = hc + dx1;\r\n                        g13 = ss * 3 / 16;\r\n                        g14 = g12 - g13;\r\n                        g15 = g9 + g13;\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \"M\" + g11 + \",\" + g9 +\r\n                            \" L\" + g14 + \",\" + g9 +\r\n                            \" L\" + g12 + \",\" + g15 +\r\n                            \" L\" + g12 + \",\" + g10 +\r\n                            \" L\" + g11 + \",\" + g10 +\r\n                            \" z\" +\r\n                            \"M\" + g14 + \",\" + g9 +\r\n                            \" L\" + g14 + \",\" + g15 +\r\n                            \" L\" + g12 + \",\" + g15 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonEnd\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, g11, g12, g13, g14, g15, g16, g17;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        g11 = hc - dx2;\r\n                        g12 = hc + dx2;\r\n                        g13 = ss * 3 / 4;\r\n                        g14 = g13 * 3 / 4;\r\n                        g15 = g13 * 7 / 8;\r\n                        g16 = g11 + g14;\r\n                        g17 = g11 + g15;\r\n                        var d = \"M\" + 0 + \",\" + h +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + 0 + \",\" + 0 +\r\n                            \" z\" +\r\n                            \" M\" + g17 + \",\" + g9 +\r\n                            \" L\" + g12 + \",\" + g9 +\r\n                            \" L\" + g12 + \",\" + g10 +\r\n                            \" L\" + g17 + \",\" + g10 +\r\n                            \" z\" +\r\n                            \" M\" + g16 + \",\" + vc +\r\n                            \" L\" + g11 + \",\" + g9 +\r\n                            \" L\" + g11 + \",\" + g10 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonForwardNext\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, g11, g12;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        g11 = hc - dx2;\r\n                        g12 = hc + dx2;\r\n\r\n                        var d = \"M\" + 0 + \",\" + h +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + 0 + \",\" + 0 +\r\n                            \" z\" +\r\n                            \" M\" + g12 + \",\" + vc +\r\n                            \" L\" + g11 + \",\" + g9 +\r\n                            \" L\" + g11 + \",\" + g10 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonHelp\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g11, g13, g14, g15, g16, g19, g20, g21, g23, g24, g27, g29, g30, g31, g33, g36, g37, g41, g42;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g11 = hc - dx2;\r\n                        g13 = ss * 3 / 4;\r\n                        g14 = g13 / 7;\r\n                        g15 = g13 * 3 / 14;\r\n                        g16 = g13 * 2 / 7;\r\n                        g19 = g13 * 3 / 7;\r\n                        g20 = g13 * 4 / 7;\r\n                        g21 = g13 * 17 / 28;\r\n                        g23 = g13 * 21 / 28;\r\n                        g24 = g13 * 11 / 14;\r\n                        g27 = g9 + g16;\r\n                        g29 = g9 + g21;\r\n                        g30 = g9 + g23;\r\n                        g31 = g9 + g24;\r\n                        g33 = g11 + g15;\r\n                        g36 = g11 + g19;\r\n                        g37 = g11 + g20;\r\n                        g41 = g13 / 14;\r\n                        g42 = g13 * 3 / 28;\r\n                        var cX1 = g33 + g16;\r\n                        var cX2 = g36 + g14;\r\n                        var cY3 = g31 + g42;\r\n                        var cX4 = (g37 + g36 + g16) / 2;\r\n\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \"M\" + g33 + \",\" + g27 +\r\n                            shapeArc(cX1, g27, g16, g16, 180, 360, false).replace(\"M\", \"L\") +\r\n                            shapeArc(cX4, g27, g14, g15, 0, 90, false).replace(\"M\", \"L\") +\r\n                            shapeArc(cX4, g29, g41, g42, 270, 180, false).replace(\"M\", \"L\") +\r\n                            \" L\" + g37 + \",\" + g30 +\r\n                            \" L\" + g36 + \",\" + g30 +\r\n                            \" L\" + g36 + \",\" + g29 +\r\n                            shapeArc(cX2, g29, g14, g15, 180, 270, false).replace(\"M\", \"L\") +\r\n                            shapeArc(g37, g27, g41, g42, 90, 0, false).replace(\"M\", \"L\") +\r\n                            shapeArc(cX1, g27, g14, g14, 0, -180, false).replace(\"M\", \"L\") +\r\n                            \" z\" +\r\n                            \"M\" + hc + \",\" + g31 +\r\n                            shapeArc(hc, cY3, g42, g42, 270, 630, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonHome\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, g11, g12, g13, g14, g15, g16, g17, g18, g19, g20, g21, g22, g23, g24, g25, g26, g27, g28, g29, g30, g31, g32, g33;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        g11 = hc - dx2;\r\n                        g12 = hc + dx2;\r\n                        g13 = ss * 3 / 4;\r\n                        g14 = g13 / 16;\r\n                        g15 = g13 / 8;\r\n                        g16 = g13 * 3 / 16;\r\n                        g17 = g13 * 5 / 16;\r\n                        g18 = g13 * 7 / 16;\r\n                        g19 = g13 * 9 / 16;\r\n                        g20 = g13 * 11 / 16;\r\n                        g21 = g13 * 3 / 4;\r\n                        g22 = g13 * 13 / 16;\r\n                        g23 = g13 * 7 / 8;\r\n                        g24 = g9 + g14;\r\n                        g25 = g9 + g16;\r\n                        g26 = g9 + g17;\r\n                        g27 = g9 + g21;\r\n                        g28 = g11 + g15;\r\n                        g29 = g11 + g18;\r\n                        g30 = g11 + g19;\r\n                        g31 = g11 + g20;\r\n                        g32 = g11 + g22;\r\n                        g33 = g11 + g23;\r\n\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \" M\" + hc + \",\" + g9 +\r\n                            \" L\" + g11 + \",\" + vc +\r\n                            \" L\" + g28 + \",\" + vc +\r\n                            \" L\" + g28 + \",\" + g10 +\r\n                            \" L\" + g33 + \",\" + g10 +\r\n                            \" L\" + g33 + \",\" + vc +\r\n                            \" L\" + g12 + \",\" + vc +\r\n                            \" L\" + g32 + \",\" + g26 +\r\n                            \" L\" + g32 + \",\" + g24 +\r\n                            \" L\" + g31 + \",\" + g24 +\r\n                            \" L\" + g31 + \",\" + g25 +\r\n                            \" z\" +\r\n                            \" M\" + g29 + \",\" + g27 +\r\n                            \" L\" + g30 + \",\" + g27 +\r\n                            \" L\" + g30 + \",\" + g10 +\r\n                            \" L\" + g29 + \",\" + g10 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonInformation\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g11, g13, g14, g17, g18, g19, g20, g22, g23, g24, g25, g28, g29, g30, g31, g32, g34, g35, g37, g38;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g11 = hc - dx2;\r\n                        g13 = ss * 3 / 4;\r\n                        g14 = g13 / 32;\r\n                        g17 = g13 * 5 / 16;\r\n                        g18 = g13 * 3 / 8;\r\n                        g19 = g13 * 13 / 32;\r\n                        g20 = g13 * 19 / 32;\r\n                        g22 = g13 * 11 / 16;\r\n                        g23 = g13 * 13 / 16;\r\n                        g24 = g13 * 7 / 8;\r\n                        g25 = g9 + g14;\r\n                        g28 = g9 + g17;\r\n                        g29 = g9 + g18;\r\n                        g30 = g9 + g23;\r\n                        g31 = g9 + g24;\r\n                        g32 = g11 + g17;\r\n                        g34 = g11 + g19;\r\n                        g35 = g11 + g20;\r\n                        g37 = g11 + g22;\r\n                        g38 = g13 * 3 / 32;\r\n                        var cY1 = g9 + dx2;\r\n                        var cY2 = g25 + g38;\r\n\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \"M\" + hc + \",\" + g9 +\r\n                            shapeArc(hc, cY1, dx2, dx2, 270, 630, false).replace(\"M\", \"L\") +\r\n                            \" z\" +\r\n                            \"M\" + hc + \",\" + g25 +\r\n                            shapeArc(hc, cY2, g38, g38, 270, 630, false).replace(\"M\", \"L\") +\r\n                            \"M\" + g32 + \",\" + g28 +\r\n                            \" L\" + g35 + \",\" + g28 +\r\n                            \" L\" + g35 + \",\" + g30 +\r\n                            \" L\" + g37 + \",\" + g30 +\r\n                            \" L\" + g37 + \",\" + g31 +\r\n                            \" L\" + g32 + \",\" + g31 +\r\n                            \" L\" + g32 + \",\" + g30 +\r\n                            \" L\" + g34 + \",\" + g30 +\r\n                            \" L\" + g34 + \",\" + g29 +\r\n                            \" L\" + g32 + \",\" + g29 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonMovie\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, g11, g12, g13, g14, g15, g16, g17, g18, g19, g20, g21, g22, g23, g24, g25, g26, g27,\r\n                            g28, g29, g30, g31, g32, g33, g34, g35, g36, g37, g38, g39, g40, g41, g42, g43, g44, g45, g46, g47, g48;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        g11 = hc - dx2;\r\n                        g12 = hc + dx2;\r\n                        g13 = ss * 3 / 4;\r\n                        g14 = g13 * 1455 / 21600;\r\n                        g15 = g13 * 1905 / 21600;\r\n                        g16 = g13 * 2325 / 21600;\r\n                        g17 = g13 * 16155 / 21600;\r\n                        g18 = g13 * 17010 / 21600;\r\n                        g19 = g13 * 19335 / 21600;\r\n                        g20 = g13 * 19725 / 21600;\r\n                        g21 = g13 * 20595 / 21600;\r\n                        g22 = g13 * 5280 / 21600;\r\n                        g23 = g13 * 5730 / 21600;\r\n                        g24 = g13 * 6630 / 21600;\r\n                        g25 = g13 * 7492 / 21600;\r\n                        g26 = g13 * 9067 / 21600;\r\n                        g27 = g13 * 9555 / 21600;\r\n                        g28 = g13 * 13342 / 21600;\r\n                        g29 = g13 * 14580 / 21600;\r\n                        g30 = g13 * 15592 / 21600;\r\n                        g31 = g11 + g14;\r\n                        g32 = g11 + g15;\r\n                        g33 = g11 + g16;\r\n                        g34 = g11 + g17;\r\n                        g35 = g11 + g18;\r\n                        g36 = g11 + g19;\r\n                        g37 = g11 + g20;\r\n                        g38 = g11 + g21;\r\n                        g39 = g9 + g22;\r\n                        g40 = g9 + g23;\r\n                        g41 = g9 + g24;\r\n                        g42 = g9 + g25;\r\n                        g43 = g9 + g26;\r\n                        g44 = g9 + g27;\r\n                        g45 = g9 + g28;\r\n                        g46 = g9 + g29;\r\n                        g47 = g9 + g30;\r\n                        g48 = g9 + g31;\r\n\r\n                        var d = \"M\" + 0 + \",\" + h +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + 0 + \",\" + 0 +\r\n                            \" z\" +\r\n                            \"M\" + g11 + \",\" + g39 +\r\n                            \" L\" + g11 + \",\" + g44 +\r\n                            \" L\" + g31 + \",\" + g44 +\r\n                            \" L\" + g32 + \",\" + g43 +\r\n                            \" L\" + g33 + \",\" + g43 +\r\n                            \" L\" + g33 + \",\" + g47 +\r\n                            \" L\" + g35 + \",\" + g47 +\r\n                            \" L\" + g35 + \",\" + g45 +\r\n                            \" L\" + g36 + \",\" + g45 +\r\n                            \" L\" + g38 + \",\" + g46 +\r\n                            \" L\" + g12 + \",\" + g46 +\r\n                            \" L\" + g12 + \",\" + g41 +\r\n                            \" L\" + g38 + \",\" + g41 +\r\n                            \" L\" + g37 + \",\" + g42 +\r\n                            \" L\" + g35 + \",\" + g42 +\r\n                            \" L\" + g35 + \",\" + g41 +\r\n                            \" L\" + g34 + \",\" + g40 +\r\n                            \" L\" + g32 + \",\" + g40 +\r\n                            \" L\" + g31 + \",\" + g39 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonReturn\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, g11, g12, g13, g14, g15, g16, g17, g18, g19, g20, g21, g22, g23, g24, g25, g26, g27;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        g11 = hc - dx2;\r\n                        g12 = hc + dx2;\r\n                        g13 = ss * 3 / 4;\r\n                        g14 = g13 * 7 / 8;\r\n                        g15 = g13 * 3 / 4;\r\n                        g16 = g13 * 5 / 8;\r\n                        g17 = g13 * 3 / 8;\r\n                        g18 = g13 / 4;\r\n                        g19 = g9 + g15;\r\n                        g20 = g9 + g16;\r\n                        g21 = g9 + g18;\r\n                        g22 = g11 + g14;\r\n                        g23 = g11 + g15;\r\n                        g24 = g11 + g16;\r\n                        g25 = g11 + g17;\r\n                        g26 = g11 + g18;\r\n                        g27 = g13 / 8;\r\n                        var cX1 = g24 - g27;\r\n                        var cY2 = g19 - g27;\r\n                        var cX3 = g11 + g17;\r\n                        var cY4 = g10 - g17;\r\n\r\n                        var d = \"M\" + 0 + \",\" + h +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + 0 + \",\" + 0 +\r\n                            \" z\" +\r\n                            \" M\" + g12 + \",\" + g21 +\r\n                            \" L\" + g23 + \",\" + g9 +\r\n                            \" L\" + hc + \",\" + g21 +\r\n                            \" L\" + g24 + \",\" + g21 +\r\n                            \" L\" + g24 + \",\" + g20 +\r\n                            shapeArc(cX1, g20, g27, g27, 0, 90, false).replace(\"M\", \"L\") +\r\n                            \" L\" + g25 + \",\" + g19 +\r\n                            shapeArc(g25, cY2, g27, g27, 90, 180, false).replace(\"M\", \"L\") +\r\n                            \" L\" + g26 + \",\" + g21 +\r\n                            \" L\" + g11 + \",\" + g21 +\r\n                            \" L\" + g11 + \",\" + g20 +\r\n                            shapeArc(cX3, g20, g17, g17, 180, 90, false).replace(\"M\", \"L\") +\r\n                            \" L\" + hc + \",\" + g10 +\r\n                            shapeArc(hc, cY4, g17, g17, 90, 0, false).replace(\"M\", \"L\") +\r\n                            \" L\" + g22 + \",\" + g21 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonSound\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, g11, g12, g13, g14, g15, g16, g17, g18, g19, g20, g21, g22, g23, g24, g25, g26;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        g11 = hc - dx2;\r\n                        g12 = hc + dx2;\r\n                        g13 = ss * 3 / 4;\r\n                        g14 = g13 / 8;\r\n                        g15 = g13 * 5 / 16;\r\n                        g16 = g13 * 5 / 8;\r\n                        g17 = g13 * 11 / 16;\r\n                        g18 = g13 * 3 / 4;\r\n                        g19 = g13 * 7 / 8;\r\n                        g20 = g9 + g14;\r\n                        g21 = g9 + g15;\r\n                        g22 = g9 + g17;\r\n                        g23 = g9 + g19;\r\n                        g24 = g11 + g15;\r\n                        g25 = g11 + g16;\r\n                        g26 = g11 + g18;\r\n\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \" M\" + g11 + \",\" + g21 +\r\n                            \" L\" + g24 + \",\" + g21 +\r\n                            \" L\" + g25 + \",\" + g9 +\r\n                            \" L\" + g25 + \",\" + g10 +\r\n                            \" L\" + g24 + \",\" + g22 +\r\n                            \" L\" + g11 + \",\" + g22 +\r\n                            \" z\" +\r\n                            \" M\" + g26 + \",\" + g21 +\r\n                            \" L\" + g12 + \",\" + g20 +\r\n                            \" M\" + g26 + \",\" + vc +\r\n                            \" L\" + g12 + \",\" + vc +\r\n                            \" M\" + g26 + \",\" + g22 +\r\n                            \" L\" + g12 + \",\" + g23;\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"irregularSeal1\":\r\n                    case \"irregularSeal2\":\r\n                        if (shapType == \"irregularSeal1\") {\r\n                            var d = \"M\" + w * 10800 / 21600 + \",\" + h * 5800 / 21600 +\r\n                                \" L\" + w * 14522 / 21600 + \",\" + 0 +\r\n                                \" L\" + w * 14155 / 21600 + \",\" + h * 5325 / 21600 +\r\n                                \" L\" + w * 18380 / 21600 + \",\" + h * 4457 / 21600 +\r\n                                \" L\" + w * 16702 / 21600 + \",\" + h * 7315 / 21600 +\r\n                                \" L\" + w * 21097 / 21600 + \",\" + h * 8137 / 21600 +\r\n                                \" L\" + w * 17607 / 21600 + \",\" + h * 10475 / 21600 +\r\n                                \" L\" + w + \",\" + h * 13290 / 21600 +\r\n                                \" L\" + w * 16837 / 21600 + \",\" + h * 12942 / 21600 +\r\n                                \" L\" + w * 18145 / 21600 + \",\" + h * 18095 / 21600 +\r\n                                \" L\" + w * 14020 / 21600 + \",\" + h * 14457 / 21600 +\r\n                                \" L\" + w * 13247 / 21600 + \",\" + h * 19737 / 21600 +\r\n                                \" L\" + w * 10532 / 21600 + \",\" + h * 14935 / 21600 +\r\n                                \" L\" + w * 8485 / 21600 + \",\" + h +\r\n                                \" L\" + w * 7715 / 21600 + \",\" + h * 15627 / 21600 +\r\n                                \" L\" + w * 4762 / 21600 + \",\" + h * 17617 / 21600 +\r\n                                \" L\" + w * 5667 / 21600 + \",\" + h * 13937 / 21600 +\r\n                                \" L\" + w * 135 / 21600 + \",\" + h * 14587 / 21600 +\r\n                                \" L\" + w * 3722 / 21600 + \",\" + h * 11775 / 21600 +\r\n                                \" L\" + 0 + \",\" + h * 8615 / 21600 +\r\n                                \" L\" + w * 4627 / 21600 + \",\" + h * 7617 / 21600 +\r\n                                \" L\" + w * 370 / 21600 + \",\" + h * 2295 / 21600 +\r\n                                \" L\" + w * 7312 / 21600 + \",\" + h * 6320 / 21600 +\r\n                                \" L\" + w * 8352 / 21600 + \",\" + h * 2295 / 21600 +\r\n                                \" z\";\r\n                        } else if (shapType == \"irregularSeal2\") {\r\n                            var d = \"M\" + w * 11462 / 21600 + \",\" + h * 4342 / 21600 +\r\n                                \" L\" + w * 14790 / 21600 + \",\" + 0 +\r\n                                \" L\" + w * 14525 / 21600 + \",\" + h * 5777 / 21600 +\r\n                                \" L\" + w * 18007 / 21600 + \",\" + h * 3172 / 21600 +\r\n                                \" L\" + w * 16380 / 21600 + \",\" + h * 6532 / 21600 +\r\n                                \" L\" + w + \",\" + h * 6645 / 21600 +\r\n                                \" L\" + w * 16985 / 21600 + \",\" + h * 9402 / 21600 +\r\n                                \" L\" + w * 18270 / 21600 + \",\" + h * 11290 / 21600 +\r\n                                \" L\" + w * 16380 / 21600 + \",\" + h * 12310 / 21600 +\r\n                                \" L\" + w * 18877 / 21600 + \",\" + h * 15632 / 21600 +\r\n                                \" L\" + w * 14640 / 21600 + \",\" + h * 14350 / 21600 +\r\n                                \" L\" + w * 14942 / 21600 + \",\" + h * 17370 / 21600 +\r\n                                \" L\" + w * 12180 / 21600 + \",\" + h * 15935 / 21600 +\r\n                                \" L\" + w * 11612 / 21600 + \",\" + h * 18842 / 21600 +\r\n                                \" L\" + w * 9872 / 21600 + \",\" + h * 17370 / 21600 +\r\n                                \" L\" + w * 8700 / 21600 + \",\" + h * 19712 / 21600 +\r\n                                \" L\" + w * 7527 / 21600 + \",\" + h * 18125 / 21600 +\r\n                                \" L\" + w * 4917 / 21600 + \",\" + h +\r\n                                \" L\" + w * 4805 / 21600 + \",\" + h * 18240 / 21600 +\r\n                                \" L\" + w * 1285 / 21600 + \",\" + h * 17825 / 21600 +\r\n                                \" L\" + w * 3330 / 21600 + \",\" + h * 15370 / 21600 +\r\n                                \" L\" + 0 + \",\" + h * 12877 / 21600 +\r\n                                \" L\" + w * 3935 / 21600 + \",\" + h * 11592 / 21600 +\r\n                                \" L\" + w * 1172 / 21600 + \",\" + h * 8270 / 21600 +\r\n                                \" L\" + w * 5372 / 21600 + \",\" + h * 7817 / 21600 +\r\n                                \" L\" + w * 4502 / 21600 + \",\" + h * 3625 / 21600 +\r\n                                \" L\" + w * 8550 / 21600 + \",\" + h * 6382 / 21600 +\r\n                                \" L\" + w * 9722 / 21600 + \",\" + h * 1887 / 21600 +\r\n                                \" z\";\r\n                        }\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"flowChartTerminator\":\r\n                        var x1, x2, y1, cd2 = 180, cd4 = 90, c3d4 = 270;\r\n                        x1 = w * 3475 / 21600;\r\n                        x2 = w * 18125 / 21600;\r\n                        y1 = h * 10800 / 21600;\r\n                        //path attrs: w = 21600; h = 21600; \r\n                        var d = \"M\" + x1 + \",\" + 0 +\r\n                            \" L\" + x2 + \",\" + 0 +\r\n                            shapeArc(x2, h / 2, x1, y1, c3d4, c3d4 + cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + h +\r\n                            shapeArc(x1, h / 2, x1, y1, cd4, cd4 + cd2, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"flowChartPunchedTape\":\r\n                        var x1, x1, y1, y2, cd2 = 180;\r\n                        x1 = w * 5 / 20;\r\n                        y1 = h * 2 / 20;\r\n                        y2 = h * 18 / 20;\r\n                        var d = \"M\" + 0 + \",\" + y1 +\r\n                            shapeArc(x1, y1, x1, y1, cd2, 0, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w * (3 / 4), y1, x1, y1, cd2, 360, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w + \",\" + y2 +\r\n                            shapeArc(w * (3 / 4), y2, x1, y1, 0, -cd2, false).replace(\"M\", \"L\") +\r\n                            shapeArc(x1, y2, x1, y1, 0, cd2, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"flowChartOnlineStorage\":\r\n                        var x1, y1, c3d4 = 270, cd4 = 90;\r\n                        x1 = w * 1 / 6;\r\n                        y1 = h * 3 / 6;\r\n                        var d = \"M\" + x1 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            shapeArc(w, h / 2, x1, y1, c3d4, 90, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + h +\r\n                            shapeArc(x1, h / 2, x1, y1, cd4, 270, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"flowChartDisplay\":\r\n                        var x1, x2, y1, c3d4 = 270, cd2 = 180;\r\n                        x1 = w * 1 / 6;\r\n                        x2 = w * 5 / 6;\r\n                        y1 = h * 3 / 6;\r\n                        //path attrs: w = 6; h = 6; \r\n                        var d = \"M\" + 0 + \",\" + y1 +\r\n                            \" L\" + x1 + \",\" + 0 +\r\n                            \" L\" + x2 + \",\" + 0 +\r\n                            shapeArc(w, h / 2, x1, y1, c3d4, c3d4 + cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + h +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"flowChartDelay\":\r\n                        var wd2 = w / 2, hd2 = h / 2, cd2 = 180, c3d4 = 270, cd4 = 90;\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + wd2 + \",\" + 0 +\r\n                            shapeArc(wd2, hd2, wd2, hd2, c3d4, c3d4 + cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"flowChartMagneticTape\":\r\n                        var wd2 = w / 2, hd2 = h / 2, cd2 = 180, c3d4 = 270, cd4 = 90;\r\n                        var idy, ib, ang1;\r\n                        idy = hd2 * Math.sin(Math.PI / 4);\r\n                        ib = hd2 + idy;\r\n                        ang1 = Math.atan(h / w);\r\n                        var ang1Dg = ang1 * 180 / Math.PI;\r\n                        var d = \"M\" + wd2 + \",\" + h +\r\n                            shapeArc(wd2, hd2, wd2, hd2, cd4, cd2, false).replace(\"M\", \"L\") +\r\n                            shapeArc(wd2, hd2, wd2, hd2, cd2, c3d4, false).replace(\"M\", \"L\") +\r\n                            shapeArc(wd2, hd2, wd2, hd2, c3d4, 360, false).replace(\"M\", \"L\") +\r\n                            shapeArc(wd2, hd2, wd2, hd2, 0, ang1Dg, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w + \",\" + ib +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"ellipse\":\r\n                    case \"flowChartConnector\":\r\n                    case \"flowChartSummingJunction\":\r\n                    case \"flowChartOr\":\r\n                        result += \"<ellipse cx='\" + (w / 2) + \"' cy='\" + (h / 2) + \"' rx='\" + (w / 2) + \"' ry='\" + (h / 2) + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        if (shapType == \"flowChartOr\") {\r\n                            result += \" <polyline points='\" + w / 2 + \" \" + 0 + \",\" + w / 2 + \" \" + h + \"' fill='none' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                            result += \" <polyline points='\" + 0 + \" \" + h / 2 + \",\" + w + \" \" + h / 2 + \"' fill='none' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        } else if (shapType == \"flowChartSummingJunction\") {\r\n                            var idx, idy, il, ir, it, ib, hc = w / 2, vc = h / 2, wd2 = w / 2, hd2 = h / 2;\r\n                            var angVal = Math.PI / 4;\r\n                            idx = wd2 * Math.cos(angVal);\r\n                            idy = hd2 * Math.sin(angVal);\r\n                            il = hc - idx;\r\n                            ir = hc + idx;\r\n                            it = vc - idy;\r\n                            ib = vc + idy;\r\n                            result += \" <polyline points='\" + il + \" \" + it + \",\" + ir + \" \" + ib + \"' fill='none' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                            result += \" <polyline points='\" + ir + \" \" + it + \",\" + il + \" \" + ib + \"' fill='none' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        }\r\n                        break;\r\n                    case \"roundRect\":\r\n                    case \"round1Rect\":\r\n                    case \"round2DiagRect\":\r\n                    case \"round2SameRect\":\r\n                    case \"snip1Rect\":\r\n                    case \"snip2DiagRect\":\r\n                    case \"snip2SameRect\":\r\n                    case \"flowChartAlternateProcess\":\r\n                    case \"flowChartPunchedCard\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val;// = 0.33334;\r\n                        var sAdj2, sAdj2_val;// = 0.33334;\r\n                        var shpTyp, adjTyp;\r\n                        if (shapAdjst_ary !== undefined && shapAdjst_ary.constructor === Array) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = parseInt(sAdj1.substr(4)) / 50000;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj2_val = parseInt(sAdj2.substr(4)) / 50000;\r\n                                }\r\n                            }\r\n                        } else if (shapAdjst_ary !== undefined && shapAdjst_ary.constructor !== Array) {\r\n                            var sAdj = getTextByPathList(shapAdjst_ary, [\"attrs\", \"fmla\"]);\r\n                            sAdj1_val = parseInt(sAdj.substr(4)) / 50000;\r\n                            sAdj2_val = 0;\r\n                        }\r\n                        //console.log(\"shapType: \",shapType,\",node: \",node )\r\n                        var tranglRott = \"\";\r\n                        switch (shapType) {\r\n                            case \"roundRect\":\r\n                            case \"flowChartAlternateProcess\":\r\n                                shpTyp = \"round\";\r\n                                adjTyp = \"cornrAll\";\r\n                                if (sAdj1_val === undefined) sAdj1_val = 0.33334;\r\n                                sAdj2_val = 0;\r\n                                break;\r\n                            case \"round1Rect\":\r\n                                shpTyp = \"round\";\r\n                                adjTyp = \"cornr1\";\r\n                                if (sAdj1_val === undefined) sAdj1_val = 0.33334;\r\n                                sAdj2_val = 0;\r\n                                break;\r\n                            case \"round2DiagRect\":\r\n                                shpTyp = \"round\";\r\n                                adjTyp = \"diag\";\r\n                                if (sAdj1_val === undefined) sAdj1_val = 0.33334;\r\n                                if (sAdj2_val === undefined) sAdj2_val = 0;\r\n                                break;\r\n                            case \"round2SameRect\":\r\n                                shpTyp = \"round\";\r\n                                adjTyp = \"cornr2\";\r\n                                if (sAdj1_val === undefined) sAdj1_val = 0.33334;\r\n                                if (sAdj2_val === undefined) sAdj2_val = 0;\r\n                                break;\r\n                            case \"snip1Rect\":\r\n                            case \"flowChartPunchedCard\":\r\n                                shpTyp = \"snip\";\r\n                                adjTyp = \"cornr1\";\r\n                                if (sAdj1_val === undefined) sAdj1_val = 0.33334;\r\n                                sAdj2_val = 0;\r\n                                if (shapType == \"flowChartPunchedCard\") {\r\n                                    tranglRott = \"transform='translate(\" + w + \",0) scale(-1,1)'\";\r\n                                }\r\n                                break;\r\n                            case \"snip2DiagRect\":\r\n                                shpTyp = \"snip\";\r\n                                adjTyp = \"diag\";\r\n                                if (sAdj1_val === undefined) sAdj1_val = 0;\r\n                                if (sAdj2_val === undefined) sAdj2_val = 0.33334;\r\n                                break;\r\n                            case \"snip2SameRect\":\r\n                                shpTyp = \"snip\";\r\n                                adjTyp = \"cornr2\";\r\n                                if (sAdj1_val === undefined) sAdj1_val = 0.33334;\r\n                                if (sAdj2_val === undefined) sAdj2_val = 0;\r\n                                break;\r\n                        }\r\n                        var d_val = shapeSnipRoundRect(w, h, sAdj1_val, sAdj2_val, shpTyp, adjTyp);\r\n                        result += \"<path \" + tranglRott + \"  d='\" + d_val + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"snipRoundRect\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 0.33334;\r\n                        var sAdj2, sAdj2_val = 0.33334;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = parseInt(sAdj1.substr(4)) / 50000;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj2_val = parseInt(sAdj2.substr(4)) / 50000;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val = \"M0,\" + h + \" L\" + w + \",\" + h + \" L\" + w + \",\" + (h / 2) * sAdj2_val +\r\n                            \" L\" + (w / 2 + (w / 2) * (1 - sAdj2_val)) + \",0 L\" + (w / 2) * sAdj1_val + \",0 Q0,0 0,\" + (h / 2) * sAdj1_val + \" z\";\r\n\r\n                        result += \"<path   d='\" + d_val + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"bentConnector2\":\r\n                        var d = \"\";\r\n                        if (isFlipV) {\r\n                            d = \"M 0 \" + w + \" L \" + h + \" \" + w + \" L \" + h + \" 0\";\r\n                        } else {\r\n                            d = \"M \" + w + \" 0 L \" + w + \" \" + h + \" L 0 \" + h;\r\n                        }\r\n                        result += \"<path d='\" + d + \"' stroke='\" + border.color +\r\n                            \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' fill='none' \";\r\n                        if (headEndNodeAttrs !== undefined && (headEndNodeAttrs[\"type\"] === \"triangle\" || headEndNodeAttrs[\"type\"] === \"arrow\")) {\r\n                            result += \"marker-start='url(#markerTriangle_\" + shpId + \")' \";\r\n                        }\r\n                        if (tailEndNodeAttrs !== undefined && (tailEndNodeAttrs[\"type\"] === \"triangle\" || tailEndNodeAttrs[\"type\"] === \"arrow\")) {\r\n                            result += \"marker-end='url(#markerTriangle_\" + shpId + \")' \";\r\n                        }\r\n                        result += \"/>\";\r\n                        break;\r\n                    case \"rtTriangle\":\r\n                        result += \" <polygon points='0 0,0 \" + h + \",\" + w + \" \" + h + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"triangle\":\r\n                    case \"flowChartExtract\":\r\n                    case \"flowChartMerge\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var shapAdjst_val = 0.5;\r\n                        if (shapAdjst !== undefined) {\r\n                            shapAdjst_val = parseInt(shapAdjst.substr(4)) * 96 / 9144000;\r\n                            //console.log(\"w: \"+w+\"\\nh: \"+h+\"\\nshapAdjst: \"+shapAdjst+\"\\nshapAdjst_val: \"+shapAdjst_val);\r\n                        }\r\n                        var tranglRott = \"\";\r\n                        if (shapType == \"flowChartMerge\") {\r\n                            tranglRott = \"transform='rotate(180 \" + w / 2 + \",\" + h / 2 + \")'\";\r\n                        }\r\n                        result += \" <polygon \" + tranglRott + \" points='\" + (w * shapAdjst_val) + \" 0,0 \" + h + \",\" + w + \" \" + h + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"diamond\":\r\n                    case \"flowChartDecision\":\r\n                    case \"flowChartSort\":\r\n                        result += \" <polygon points='\" + (w / 2) + \" 0,0 \" + (h / 2) + \",\" + (w / 2) + \" \" + h + \",\" + w + \" \" + (h / 2) + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        if (shapType == \"flowChartSort\") {\r\n                            result += \" <polyline points='0 \" + h / 2 + \",\" + w + \" \" + h / 2 + \"' fill='none' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        }\r\n                        break;\r\n                    case \"trapezoid\":\r\n                    case \"flowChartManualOperation\":\r\n                    case \"flowChartManualInput\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adjst_val = 0.2;\r\n                        var max_adj_const = 0.7407;\r\n                        if (shapAdjst !== undefined) {\r\n                            var adjst = parseInt(shapAdjst.substr(4)) * 96 / 9144000;\r\n                            adjst_val = (adjst * 0.5) / max_adj_const;\r\n                            // console.log(\"w: \"+w+\"\\nh: \"+h+\"\\nshapAdjst: \"+shapAdjst+\"\\nadjst_val: \"+adjst_val);\r\n                        }\r\n                        var cnstVal = 0;\r\n                        var tranglRott = \"\";\r\n                        if (shapType == \"flowChartManualOperation\") {\r\n                            tranglRott = \"transform='rotate(180 \" + w / 2 + \",\" + h / 2 + \")'\";\r\n                        }\r\n                        if (shapType == \"flowChartManualInput\") {\r\n                            adjst_val = 0;\r\n                            cnstVal = h / 5;\r\n                        }\r\n                        result += \" <polygon \" + tranglRott + \" points='\" + (w * adjst_val) + \" \" + cnstVal + \",0 \" + h + \",\" + w + \" \" + h + \",\" + (1 - adjst_val) * w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"parallelogram\":\r\n                    case \"flowChartInputOutput\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adjst_val = 0.25;\r\n                        var max_adj_const;\r\n                        if (w > h) {\r\n                            max_adj_const = w / h;\r\n                        } else {\r\n                            max_adj_const = h / w;\r\n                        }\r\n                        if (shapAdjst !== undefined) {\r\n                            var adjst = parseInt(shapAdjst.substr(4)) / 100000;\r\n                            adjst_val = adjst / max_adj_const;\r\n                            //console.log(\"w: \"+w+\"\\nh: \"+h+\"\\nadjst: \"+adjst_val+\"\\nmax_adj_const: \"+max_adj_const);\r\n                        }\r\n                        result += \" <polygon points='\" + adjst_val * w + \" 0,0 \" + h + \",\" + (1 - adjst_val) * w + \" \" + h + \",\" + w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n\r\n                        break;\r\n                    case \"pentagon\":\r\n                        result += \" <polygon points='\" + (0.5 * w) + \" 0,0 \" + (0.375 * h) + \",\" + (0.15 * w) + \" \" + h + \",\" + 0.85 * w + \" \" + h + \",\" + w + \" \" + 0.375 * h + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"hexagon\":\r\n                    case \"flowChartPreparation\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 25000 * 96 / 914400;\r\n                        var vf = 115470 * 96 / 914400;;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var angVal1 = 60 * Math.PI / 180;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var maxAdj, a, shd2, x1, x2, dy1, y1, y2, vc = h / 2, hd2 = h / 2;\r\n                        var ss = Math.min(w, h);\r\n                        maxAdj = cnstVal1 * w / ss;\r\n                        a = (adj < 0) ? 0 : (adj > maxAdj) ? maxAdj : adj;\r\n                        shd2 = hd2 * vf / cnstVal2;\r\n                        x1 = ss * a / cnstVal2;\r\n                        x2 = w - x1;\r\n                        dy1 = shd2 * Math.sin(angVal1);\r\n                        y1 = vc - dy1;\r\n                        y2 = vc + dy1;\r\n\r\n                        var d = \"M\" + 0 + \",\" + vc +\r\n                            \" L\" + x1 + \",\" + y1 +\r\n                            \" L\" + x2 + \",\" + y1 +\r\n                            \" L\" + w + \",\" + vc +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" z\";\r\n\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"heptagon\":\r\n                        result += \" <polygon points='\" + (0.5 * w) + \" 0,\" + w / 8 + \" \" + h / 4 + \",0 \" + (5 / 8) * h + \",\" + w / 4 + \" \" + h + \",\" + (3 / 4) * w + \" \" + h + \",\" +\r\n                            w + \" \" + (5 / 8) * h + \",\" + (7 / 8) * w + \" \" + h / 4 + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"octagon\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj1 = 0.25;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj1 = parseInt(shapAdjst.substr(4)) / 100000;\r\n\r\n                        }\r\n                        var adj2 = (1 - adj1);\r\n                        //console.log(\"adj1: \"+adj1+\"\\nadj2: \"+adj2);\r\n                        result += \" <polygon points='\" + adj1 * w + \" 0,0 \" + adj1 * h + \",0 \" + adj2 * h + \",\" + adj1 * w + \" \" + h + \",\" + adj2 * w + \" \" + h + \",\" +\r\n                            w + \" \" + adj2 * h + \",\" + w + \" \" + adj1 * h + \",\" + adj2 * w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"decagon\":\r\n                        result += \" <polygon points='\" + (3 / 8) * w + \" 0,\" + w / 8 + \" \" + h / 8 + \",0 \" + h / 2 + \",\" + w / 8 + \" \" + (7 / 8) * h + \",\" + (3 / 8) * w + \" \" + h + \",\" +\r\n                            (5 / 8) * w + \" \" + h + \",\" + (7 / 8) * w + \" \" + (7 / 8) * h + \",\" + w + \" \" + h / 2 + \",\" + (7 / 8) * w + \" \" + h / 8 + \",\" + (5 / 8) * w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"dodecagon\":\r\n                        result += \" <polygon points='\" + (3 / 8) * w + \" 0,\" + w / 8 + \" \" + h / 8 + \",0 \" + (3 / 8) * h + \",0 \" + (5 / 8) * h + \",\" + w / 8 + \" \" + (7 / 8) * h + \",\" + (3 / 8) * w + \" \" + h + \",\" +\r\n                            (5 / 8) * w + \" \" + h + \",\" + (7 / 8) * w + \" \" + (7 / 8) * h + \",\" + w + \" \" + (5 / 8) * h + \",\" + w + \" \" + (3 / 8) * h + \",\" + (7 / 8) * w + \" \" + h / 8 + \",\" + (5 / 8) * w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"star4\":\r\n                    case \"star5\":\r\n                    case \"star6\":\r\n                    case \"star7\":\r\n                    case \"star8\":\r\n                    case \"star10\":\r\n                    case \"star12\":\r\n                    case \"star16\":\r\n                    case \"star24\":\r\n                    case \"star32\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);//[0][\"attrs\"][\"fmla\"];\r\n                        var starNum = shapType.substr(4);\r\n                        var shapAdjst1, adj;\r\n                        switch (starNum) {\r\n                            case \"4\":\r\n                                adj = 30;\r\n                                break;\r\n                            case \"5\":\r\n                                adj = 40;\r\n                                break;\r\n                            case \"6\":\r\n                                adj = 60;\r\n                                break;\r\n                            case \"7\":\r\n                                adj = 70;\r\n                                break;\r\n                            case \"8\":\r\n                                adj = 77;\r\n                                break;\r\n                            case \"10\":\r\n                                adj = 86;\r\n                                break;\r\n                            case \"12\":\r\n                            case \"16\":\r\n                            case \"24\":\r\n                            case \"32\":\r\n                                adj = 75;\r\n                                break;\r\n                        }\r\n                        if (shapAdjst !== undefined) {\r\n                            shapAdjst1 = getTextByPathList(shapAdjst, [\"attrs\", \"fmla\"]);\r\n                            if (shapAdjst1 === undefined) {\r\n                                shapAdjst1 = shapAdjst[0][\"attrs\"][\"fmla\"];\r\n                            }\r\n                            if (shapAdjst1 !== undefined) {\r\n                                adj = 2 * parseInt(shapAdjst1.substr(4)) / 1000;\r\n                            }\r\n                        }\r\n\r\n                        var points = shapeStar(adj, starNum);\r\n                        result += \" <polygon points='\" + points + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"pie\":\r\n                    case \"pieWedge\":\r\n                    case \"arc\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var adj1, adj2, H, shapAdjst1, shapAdjst2, isClose;\r\n                        if (shapType == \"pie\") {\r\n                            adj1 = 0;\r\n                            adj2 = 270;\r\n                            H = h;\r\n                            isClose = true;\r\n                        } else if (shapType == \"pieWedge\") {\r\n                            adj1 = 180;\r\n                            adj2 = 270;\r\n                            H = 2 * h;\r\n                            isClose = true;\r\n                        } else if (shapType == \"arc\") {\r\n                            adj1 = 270;\r\n                            adj2 = 0;\r\n                            H = h;\r\n                            isClose = false;\r\n                        }\r\n                        if (shapAdjst !== undefined) {\r\n                            shapAdjst1 = getTextByPathList(shapAdjst, [\"attrs\", \"fmla\"]);\r\n                            shapAdjst2 = shapAdjst1;\r\n                            if (shapAdjst1 === undefined) {\r\n                                shapAdjst1 = shapAdjst[0][\"attrs\"][\"fmla\"];\r\n                                shapAdjst2 = shapAdjst[1][\"attrs\"][\"fmla\"];\r\n                            }\r\n                            if (shapAdjst1 !== undefined) {\r\n                                adj1 = parseInt(shapAdjst1.substr(4)) / 60000;\r\n                            }\r\n                            if (shapAdjst2 !== undefined) {\r\n                                adj2 = parseInt(shapAdjst2.substr(4)) / 60000;\r\n                            }\r\n                        }\r\n                        var pieVals = shapePie(H, w, adj1, adj2, isClose);\r\n                        //console.log(\"shapType: \",shapType,\"\\nimgFillFlg: \",imgFillFlg,\"\\ngrndFillFlg: \",grndFillFlg,\"\\nshpId: \",shpId,\"\\nfillColor: \",fillColor);\r\n                        result += \"<path   d='\" + pieVals[0] + \"' transform='\" + pieVals[1] + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"chord\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 45;\r\n                        var sAdj2, sAdj2_val = 270;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = parseInt(sAdj1.substr(4)) / 60000;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj2_val = parseInt(sAdj2.substr(4)) / 60000;\r\n                                }\r\n                            }\r\n                        }\r\n                        var hR = h / 2;\r\n                        var wR = w / 2;\r\n                        var d_val = shapeArc(wR, hR, wR, hR, sAdj1_val, sAdj2_val, true);\r\n                        //console.log(\"shapType: \",shapType,\", sAdj1_val: \",sAdj1_val,\", sAdj2_val: \",sAdj2_val)\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"frame\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj1 = 12500 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj1 = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var a1, x1, x4, y4;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > cnstVal1) a1 = cnstVal1\r\n                        else a1 = adj1\r\n                        x1 = Math.min(w, h) * a1 / cnstVal2;\r\n                        x4 = w - x1;\r\n                        y4 = h - x1;\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \"M\" + x1 + \",\" + x1 +\r\n                            \" L\" + x1 + \",\" + y4 +\r\n                            \" L\" + x4 + \",\" + y4 +\r\n                            \" L\" + x4 + \",\" + x1 +\r\n                            \" z\";\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"donut\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var a, dr, iwd2, ihd2;\r\n                        if (adj < 0) a = 0\r\n                        else if (adj > cnstVal1) a = cnstVal1\r\n                        else a = adj\r\n                        dr = Math.min(w, h) * a / cnstVal2;\r\n                        iwd2 = w / 2 - dr;\r\n                        ihd2 = h / 2 - dr;\r\n                        var d = \"M\" + 0 + \",\" + h / 2 +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 180, 270, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 270, 360, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 0, 90, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 90, 180, false).replace(\"M\", \"L\") +\r\n                            \" z\" +\r\n                            \"M\" + dr + \",\" + h / 2 +\r\n                            shapeArc(w / 2, h / 2, iwd2, ihd2, 180, 90, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, iwd2, ihd2, 90, 0, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, iwd2, ihd2, 0, -90, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, iwd2, ihd2, 270, 180, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"noSmoking\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 18750 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var a, dr, iwd2, ihd2, ang, ang2rad, ct, st, m, n, drd2, dang, dang2, swAng, t3, stAng1, stAng2;\r\n                        if (adj < 0) a = 0\r\n                        else if (adj > cnstVal1) a = cnstVal1\r\n                        else a = adj\r\n                        dr = Math.min(w, h) * a / cnstVal2;\r\n                        iwd2 = w / 2 - dr;\r\n                        ihd2 = h / 2 - dr;\r\n                        ang = Math.atan(h / w);\r\n                        //ang2rad = ang*Math.PI/180;\r\n                        ct = ihd2 * Math.cos(ang);\r\n                        st = iwd2 * Math.sin(ang);\r\n                        m = Math.sqrt(ct * ct + st * st); //\"mod ct st 0\"\r\n                        n = iwd2 * ihd2 / m;\r\n                        drd2 = dr / 2;\r\n                        dang = Math.atan(drd2 / n);\r\n                        dang2 = dang * 2;\r\n                        swAng = -Math.PI + dang2;\r\n                        //t3 = Math.atan(h/w);\r\n                        stAng1 = ang - dang;\r\n                        stAng2 = stAng1 - Math.PI;\r\n                        var ct1, st1, m1, n1, dx1, dy1, x1, y1, y1, y2;\r\n                        ct1 = ihd2 * Math.cos(stAng1);\r\n                        st1 = iwd2 * Math.sin(stAng1);\r\n                        m1 = Math.sqrt(ct1 * ct1 + st1 * st1); //\"mod ct1 st1 0\"\r\n                        n1 = iwd2 * ihd2 / m1;\r\n                        dx1 = n1 * Math.cos(stAng1);\r\n                        dy1 = n1 * Math.sin(stAng1);\r\n                        x1 = w / 2 + dx1;\r\n                        y1 = h / 2 + dy1;\r\n                        x2 = w / 2 - dx1;\r\n                        y2 = h / 2 - dy1;\r\n                        var stAng1deg = stAng1 * 180 / Math.PI;\r\n                        var stAng2deg = stAng2 * 180 / Math.PI;\r\n                        var swAng2deg = swAng * 180 / Math.PI;\r\n                        var d = \"M\" + 0 + \",\" + h / 2 +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 180, 270, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 270, 360, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 0, 90, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 90, 180, false).replace(\"M\", \"L\") +\r\n                            \" z\" +\r\n                            \"M\" + x1 + \",\" + y1 +\r\n                            shapeArc(w / 2, h / 2, iwd2, ihd2, stAng1deg, (stAng1deg + swAng2deg), false).replace(\"M\", \"L\") +\r\n                            \" z\" +\r\n                            \"M\" + x2 + \",\" + y2 +\r\n                            shapeArc(w / 2, h / 2, iwd2, ihd2, stAng2deg, (stAng2deg + swAng2deg), false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        //console.log(\"adj: \",adj,\"x1:\",x1,\",y1:\",y1,\" x2:\",x2,\",y2:\",y2,\",stAng1:\",stAng1,\",stAng1deg:\",stAng1deg,\",stAng2:\",stAng2,\",stAng2deg:\",stAng2deg,\",swAng:\",swAng,\",swAng2deg:\",swAng2deg)\r\n\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"halfFrame\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 3.5;\r\n                        var sAdj2, sAdj2_val = 3.5;\r\n                        var cnsVal = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj2_val = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var minWH = Math.min(w, h);\r\n                        var maxAdj2 = (cnsVal * w) / minWH;\r\n                        var a1, a2;\r\n                        if (sAdj2_val < 0) a2 = 0\r\n                        else if (sAdj2_val > maxAdj2) a2 = maxAdj2\r\n                        else a2 = sAdj2_val\r\n                        var x1 = (minWH * a2) / cnsVal;\r\n                        var g1 = h * x1 / w;\r\n                        var g2 = h - g1;\r\n                        var maxAdj1 = (cnsVal * g2) / minWH;\r\n                        if (sAdj1_val < 0) a1 = 0\r\n                        else if (sAdj1_val > maxAdj1) a1 = maxAdj1\r\n                        else a1 = sAdj1_val\r\n                        var y1 = minWH * a1 / cnsVal;\r\n                        var dx2 = y1 * w / h;\r\n                        var x2 = w - dx2;\r\n                        var dy2 = x1 * h / w;\r\n                        var y2 = h - dy2;\r\n                        var d = \"M0,0\" +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + x2 + \",\" + y1 +\r\n                            \" L\" + x1 + \",\" + y1 +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" L0,\" + h + \" z\";\r\n\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        //console.log(\"w: \",w,\", h: \",h,\", sAdj1_val: \",sAdj1_val,\", sAdj2_val: \",sAdj2_val,\",maxAdj1: \",maxAdj1,\",maxAdj2: \",maxAdj2)\r\n                        break;\r\n                    case \"blockArc\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 180;\r\n                        var sAdj2, adj2 = 0;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) / 60000;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) / 60000;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        var stAng, istAng, a3, sw11, sw12, swAng, iswAng;\r\n                        var cd1 = 360;\r\n                        if (adj1 < 0) stAng = 0\r\n                        else if (adj1 > cd1) stAng = cd1\r\n                        else stAng = adj1 //180\r\n\r\n                        if (adj2 < 0) istAng = 0\r\n                        else if (adj2 > cd1) istAng = cd1\r\n                        else istAng = adj2 //0\r\n\r\n                        if (adj3 < 0) a3 = 0\r\n                        else if (adj3 > cnstVal1) a3 = cnstVal1\r\n                        else a3 = adj3\r\n\r\n                        sw11 = istAng - stAng; // -180\r\n                        sw12 = sw11 + cd1; //180\r\n                        swAng = (sw11 > 0) ? sw11 : sw12; //180\r\n                        iswAng = -swAng; //-180\r\n\r\n                        var endAng = stAng + swAng;\r\n                        var iendAng = istAng + iswAng;\r\n\r\n                        var wt1, ht1, dx1, dy1, x1, y1, stRd, istRd, wd2, hd2, hc, vc;\r\n                        stRd = stAng * (Math.PI) / 180;\r\n                        istRd = istAng * (Math.PI) / 180;\r\n                        wd2 = w / 2;\r\n                        hd2 = h / 2;\r\n                        hc = w / 2;\r\n                        vc = h / 2;\r\n                        if (stAng > 90 && stAng < 270) {\r\n                            wt1 = wd2 * (Math.sin((Math.PI) / 2 - stRd));\r\n                            ht1 = hd2 * (Math.cos((Math.PI) / 2 - stRd));\r\n\r\n                            dx1 = wd2 * (Math.cos(Math.atan(ht1 / wt1)));\r\n                            dy1 = hd2 * (Math.sin(Math.atan(ht1 / wt1)));\r\n\r\n                            x1 = hc - dx1;\r\n                            y1 = vc - dy1;\r\n                        } else {\r\n                            wt1 = wd2 * (Math.sin(stRd));\r\n                            ht1 = hd2 * (Math.cos(stRd));\r\n\r\n                            dx1 = wd2 * (Math.cos(Math.atan(wt1 / ht1)));\r\n                            dy1 = hd2 * (Math.sin(Math.atan(wt1 / ht1)));\r\n\r\n                            x1 = hc + dx1;\r\n                            y1 = vc + dy1;\r\n                        }\r\n                        var dr, iwd2, ihd2, wt2, ht2, dx2, dy2, x2, y2;\r\n                        dr = Math.min(w, h) * a3 / cnstVal2;\r\n                        iwd2 = wd2 - dr;\r\n                        ihd2 = hd2 - dr;\r\n                        //console.log(\"stAng: \",stAng,\" swAng: \",swAng ,\" endAng:\",endAng)\r\n                        if ((endAng <= 450 && endAng > 270) || ((endAng >= 630 && endAng < 720))) {\r\n                            wt2 = iwd2 * (Math.sin(istRd));\r\n                            ht2 = ihd2 * (Math.cos(istRd));\r\n                            dx2 = iwd2 * (Math.cos(Math.atan(wt2 / ht2)));\r\n                            dy2 = ihd2 * (Math.sin(Math.atan(wt2 / ht2)));\r\n                            x2 = hc + dx2;\r\n                            y2 = vc + dy2;\r\n                        } else {\r\n                            wt2 = iwd2 * (Math.sin((Math.PI) / 2 - istRd));\r\n                            ht2 = ihd2 * (Math.cos((Math.PI) / 2 - istRd));\r\n\r\n                            dx2 = iwd2 * (Math.cos(Math.atan(ht2 / wt2)));\r\n                            dy2 = ihd2 * (Math.sin(Math.atan(ht2 / wt2)));\r\n                            x2 = hc - dx2;\r\n                            y2 = vc - dy2;\r\n                        }\r\n                        var d = \"M\" + x1 + \",\" + y1 +\r\n                            shapeArc(wd2, hd2, wd2, hd2, stAng, endAng, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            shapeArc(wd2, hd2, iwd2, ihd2, istAng, iendAng, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"bracePair\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 8333 * 96 / 914400;\r\n                        var cnstVal1 = 25000 * 96 / 914400;\r\n                        var cnstVal2 = 50000 * 96 / 914400;\r\n                        var cnstVal3 = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var vc = h / 2, cd = 360, cd2 = 180, cd4 = 90, c3d4 = 270, a, x1, x2, x3, x4, y2, y3, y4;\r\n                        if (adj < 0) a = 0\r\n                        else if (adj > cnstVal1) a = cnstVal1\r\n                        else a = adj\r\n                        var minWH = Math.min(w, h);\r\n                        x1 = minWH * a / cnstVal3;\r\n                        x2 = minWH * a / cnstVal2;\r\n                        x3 = w - x2;\r\n                        x4 = w - x1;\r\n                        y2 = vc - x1;\r\n                        y3 = vc + x1;\r\n                        y4 = h - x1;\r\n                        //console.log(\"w:\",w,\" h:\",h,\" x1:\",x1,\" x2:\",x2,\" x3:\",x3,\" x4:\",x4,\" y2:\",y2,\" y3:\",y3,\" y4:\",y4)\r\n                        var d = \"M\" + x2 + \",\" + h +\r\n                            shapeArc(x2, y4, x1, x1, cd4, cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + y3 +\r\n                            shapeArc(0, y3, x1, x1, 0, (-cd4), false).replace(\"M\", \"L\") +\r\n                            shapeArc(0, y2, x1, x1, cd4, 0, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + x1 +\r\n                            shapeArc(x2, x1, x1, x1, cd2, c3d4, false).replace(\"M\", \"L\") +\r\n                            \" M\" + x3 + \",\" + 0 +\r\n                            shapeArc(x3, x1, x1, x1, c3d4, cd, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x4 + \",\" + y2 +\r\n                            shapeArc(w, y2, x1, x1, cd2, cd4, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w, y3, x1, x1, c3d4, cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x4 + \",\" + y4 +\r\n                            shapeArc(x3, y4, x1, x1, 0, cd4, false).replace(\"M\", \"L\");\r\n\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"leftBrace\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 8333 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, cd2 = 180, cd4 = 90, c3d4 = 270, a1, a2, q1, q2, q3, y1, y2, y3, y4;\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > cnstVal2) a2 = cnstVal2\r\n                        else a2 = adj2\r\n                        var minWH = Math.min(w, h);\r\n                        q1 = cnstVal2 - a2;\r\n                        if (q1 < a2) q2 = q1\r\n                        else q2 = a2\r\n                        q3 = q2 / 2;\r\n                        var maxAdj1 = q3 * h / minWH;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > maxAdj1) a1 = maxAdj1\r\n                        else a1 = adj1\r\n                        y1 = minWH * a1 / cnstVal2;\r\n                        y3 = h * a2 / cnstVal2;\r\n                        y2 = y3 - y1;\r\n                        y4 = y3 + y1;\r\n                        //console.log(\"w:\",w,\" h:\",h,\" q1:\",q1,\" q2:\",q2,\" q3:\",q3,\" y1:\",y1,\" y3:\",y3,\" y4:\",y4,\" maxAdj1:\",maxAdj1)\r\n                        var d = \"M\" + w + \",\" + h +\r\n                            shapeArc(w, h - y1, w / 2, y1, cd4, cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w / 2 + \",\" + y4 +\r\n                            shapeArc(0, y4, w / 2, y1, 0, (-cd4), false).replace(\"M\", \"L\") +\r\n                            shapeArc(0, y2, w / 2, y1, cd4, 0, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w / 2 + \",\" + y1 +\r\n                            shapeArc(w, y1, w / 2, y1, cd2, c3d4, false).replace(\"M\", \"L\");\r\n\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"rightBrace\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 8333 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, cd = 360, cd2 = 180, cd4 = 90, c3d4 = 270, a1, a2, q1, q2, q3, y1, y2, y3, y4;\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > cnstVal2) a2 = cnstVal2\r\n                        else a2 = adj2\r\n                        var minWH = Math.min(w, h);\r\n                        q1 = cnstVal2 - a2;\r\n                        if (q1 < a2) q2 = q1\r\n                        else q2 = a2\r\n                        q3 = q2 / 2;\r\n                        var maxAdj1 = q3 * h / minWH;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > maxAdj1) a1 = maxAdj1\r\n                        else a1 = adj1\r\n                        y1 = minWH * a1 / cnstVal2;\r\n                        y3 = h * a2 / cnstVal2;\r\n                        y2 = y3 - y1;\r\n                        y4 = h - y1;\r\n                        //console.log(\"w:\",w,\" h:\",h,\" q1:\",q1,\" q2:\",q2,\" q3:\",q3,\" y1:\",y1,\" y2:\",y2,\" y3:\",y3,\" y4:\",y4,\" maxAdj1:\",maxAdj1)\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            shapeArc(0, y1, w / 2, y1, c3d4, cd, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w / 2 + \",\" + y2 +\r\n                            shapeArc(w, y2, w / 2, y1, cd2, cd4, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w, y3 + y1, w / 2, y1, c3d4, cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w / 2 + \",\" + y4 +\r\n                            shapeArc(0, y4, w / 2, y1, 0, cd4, false).replace(\"M\", \"L\");\r\n\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"bracketPair\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 16667 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var r = w, b = h, cd2 = 180, cd4 = 90, c3d4 = 270, a, x1, x2, y2;\r\n                        if (adj < 0) a = 0\r\n                        else if (adj > cnstVal1) a = cnstVal1\r\n                        else a = adj\r\n                        x1 = Math.min(w, h) * a / cnstVal2;\r\n                        x2 = r - x1;\r\n                        y2 = b - x1;\r\n                        //console.log(\"w:\",w,\" h:\",h,\" x1:\",x1,\" x2:\",x2,\" y2:\",y2)\r\n                        var d = shapeArc(x1, x1, x1, x1, c3d4, cd2, false) +\r\n                            shapeArc(x1, y2, x1, x1, cd2, cd4, false).replace(\"M\", \"L\") +\r\n                            shapeArc(x2, x1, x1, x1, c3d4, (c3d4 + cd4), false) +\r\n                            shapeArc(x2, y2, x1, x1, 0, cd4, false).replace(\"M\", \"L\");\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"leftBracket\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 8333 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var maxAdj = cnstVal1 * h / Math.min(w, h);\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var r = w, b = h, cd2 = 180, cd4 = 90, c3d4 = 270, a, y1, y2;\r\n                        if (adj < 0) a = 0\r\n                        else if (adj > maxAdj) a = maxAdj\r\n                        else a = adj\r\n                        y1 = Math.min(w, h) * a / cnstVal2;\r\n                        if (y1 > w) y1 = w;\r\n                        y2 = b - y1;\r\n                        var d = \"M\" + r + \",\" + b +\r\n                            shapeArc(y1, y2, y1, y1, cd4, cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + 0 + \",\" + y1 +\r\n                            shapeArc(y1, y1, y1, y1, cd2, c3d4, false).replace(\"M\", \"L\") +\r\n                            \" L\" + r + \",\" + 0\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"rightBracket\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 8333 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var maxAdj = cnstVal1 * h / Math.min(w, h);\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var cd = 360, cd2 = 180, cd4 = 90, c3d4 = 270, a, y1, y2, y3;\r\n                        if (adj < 0) a = 0\r\n                        else if (adj > maxAdj) a = maxAdj\r\n                        else a = adj\r\n                        y1 = Math.min(w, h) * a / cnstVal2;\r\n                        y2 = h - y1;\r\n                        y3 = w - y1;\r\n                        //console.log(\"w:\",w,\" h:\",h,\" y1:\",y1,\" y2:\",y2,\" y3:\",y3)\r\n                        var d = \"M\" + 0 + \",\" + h +\r\n                            shapeArc(y3, y2, y1, y1, cd4, 0, false).replace(\"M\", \"L\") +\r\n                            //\" L\"+ r + \",\" + y2 +\r\n                            \" L\" + w + \",\" + h / 2 +\r\n                            shapeArc(y3, y1, y1, y1, cd, c3d4, false).replace(\"M\", \"L\") +\r\n                            \" L\" + 0 + \",\" + 0\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"moon\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 0.5;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) / 100000;//*96/914400;;\r\n                        }\r\n                        var hd2, cd2, cd4;\r\n\r\n                        hd2 = h / 2;\r\n                        cd2 = 180;\r\n                        cd4 = 90;\r\n\r\n                        var adj2 = (1 - adj) * w;\r\n                        var d = \"M\" + w + \",\" + h +\r\n                            shapeArc(w, hd2, w, hd2, cd4, (cd4 + cd2), false).replace(\"M\", \"L\") +\r\n                            shapeArc(w, hd2, adj2, hd2, (cd4 + cd2), cd4, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"corner\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 50000 * 96 / 914400;\r\n                        var sAdj2, sAdj2_val = 50000 * 96 / 914400;\r\n                        var cnsVal = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj2_val = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var minWH = Math.min(w, h);\r\n                        var maxAdj1 = cnsVal * h / minWH;\r\n                        var maxAdj2 = cnsVal * w / minWH;\r\n                        var a1, a2, x1, dy1, y1;\r\n                        if (sAdj1_val < 0) a1 = 0\r\n                        else if (sAdj1_val > maxAdj1) a1 = maxAdj1\r\n                        else a1 = sAdj1_val\r\n\r\n                        if (sAdj2_val < 0) a2 = 0\r\n                        else if (sAdj2_val > maxAdj2) a2 = maxAdj2\r\n                        else a2 = sAdj2_val\r\n                        x1 = minWH * a2 / cnsVal;\r\n                        dy1 = minWH * a1 / cnsVal;\r\n                        y1 = h - dy1;\r\n\r\n                        var d = \"M0,0\" +\r\n                            \" L\" + x1 + \",\" + 0 +\r\n                            \" L\" + x1 + \",\" + y1 +\r\n                            \" L\" + w + \",\" + y1 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L0,\" + h + \" z\";\r\n\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"diagStripe\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var sAdj1_val = 50000 * 96 / 914400;\r\n                        var cnsVal = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            sAdj1_val = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var a1, x2, y2;\r\n                        if (sAdj1_val < 0) a1 = 0\r\n                        else if (sAdj1_val > cnsVal) a1 = cnsVal\r\n                        else a1 = sAdj1_val\r\n                        x2 = w * a1 / cnsVal;\r\n                        y2 = h * a1 / cnsVal;\r\n                        var d = \"M\" + 0 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + 0 + \",\" + h + \" z\";\r\n\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"gear6\":\r\n                    case \"gear9\":\r\n                        txtRotate = 0;\r\n                        var gearNum = shapType.substr(4), d;\r\n                        if (gearNum == \"6\") {\r\n                            d = shapeGear(w, h / 3.5, parseInt(gearNum));\r\n                        } else { //gearNum==\"9\"\r\n                            d = shapeGear(w, h / 3.5, parseInt(gearNum));\r\n                        }\r\n                        result += \"<path   d='\" + d + \"' transform='rotate(20,\" + (3 / 7) * h + \",\" + (3 / 7) * h + \")' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"bentConnector3\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var shapAdjst_val = 0.5;\r\n                        if (shapAdjst !== undefined) {\r\n                            shapAdjst_val = parseInt(shapAdjst.substr(4)) / 100000;\r\n                            if (isFlipV) {\r\n                                result += \" <polyline points='\" + w + \" 0,\" + ((1 - shapAdjst_val) * w) + \" 0,\" + ((1 - shapAdjst_val) * w) + \" \" + h + \",0 \" + h + \"' fill='transparent'\" +\r\n                                    \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' \";\r\n                            } else {\r\n                                result += \" <polyline points='0 0,\" + (shapAdjst_val) * w + \" 0,\" + (shapAdjst_val) * w + \" \" + h + \",\" + w + \" \" + h + \"' fill='transparent'\" +\r\n                                    \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' \";\r\n                            }\r\n                            if (headEndNodeAttrs !== undefined && (headEndNodeAttrs[\"type\"] === \"triangle\" || headEndNodeAttrs[\"type\"] === \"arrow\")) {\r\n                                result += \"marker-start='url(#markerTriangle_\" + shpId + \")' \";\r\n                            }\r\n                            if (tailEndNodeAttrs !== undefined && (tailEndNodeAttrs[\"type\"] === \"triangle\" || tailEndNodeAttrs[\"type\"] === \"arrow\")) {\r\n                                result += \"marker-end='url(#markerTriangle_\" + shpId + \")' \";\r\n                            }\r\n                            result += \"/>\";\r\n                        }\r\n                        break;\r\n                    case \"plus\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj1 = 0.25;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj1 = parseInt(shapAdjst.substr(4)) / 100000;\r\n\r\n                        }\r\n                        var adj2 = (1 - adj1);\r\n                        result += \" <polygon points='\" + adj1 * w + \" 0,\" + adj1 * w + \" \" + adj1 * h + \",0 \" + adj1 * h + \",0 \" + adj2 * h + \",\" +\r\n                            adj1 * w + \" \" + adj2 * h + \",\" + adj1 * w + \" \" + h + \",\" + adj2 * w + \" \" + h + \",\" + adj2 * w + \" \" + adj2 * h + \",\" + w + \" \" + adj2 * h + \",\" +\r\n                            +w + \" \" + adj1 * h + \",\" + adj2 * w + \" \" + adj1 * h + \",\" + adj2 * w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"teardrop\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj1 = 100000 * 96 / 914400;\r\n                        var cnsVal1 = adj1;\r\n                        var cnsVal2 = 200000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj1 = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var a1, r2, tw, th, sw, sh, dx1, dy1, x1, y1, x2, y2, rd45;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > cnsVal2) a1 = cnsVal2\r\n                        else a1 = adj1\r\n                        r2 = Math.sqrt(2);\r\n                        tw = r2 * (w / 2);\r\n                        th = r2 * (h / 2);\r\n                        sw = (tw * a1) / cnsVal1;\r\n                        sh = (th * a1) / cnsVal1;\r\n                        rd45 = (45 * (Math.PI) / 180);\r\n                        dx1 = sw * (Math.cos(rd45));\r\n                        dy1 = sh * (Math.cos(rd45));\r\n                        x1 = (w / 2) + dx1;\r\n                        y1 = (h / 2) - dy1;\r\n                        x2 = ((w / 2) + x1) / 2;\r\n                        y2 = ((h / 2) + y1) / 2;\r\n\r\n                        var d_val = shapeArc(w / 2, h / 2, w / 2, h / 2, 180, 270, false) +\r\n                            \"Q \" + x2 + \",0 \" + x1 + \",\" + y1 +\r\n                            \"Q \" + w + \",\" + y2 + \" \" + w + \",\" + h / 2 +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 0, 90, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 90, 180, false).replace(\"M\", \"L\") + \" z\";\r\n                        result += \"<path   d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        // console.log(\"shapAdjst: \",shapAdjst,\", adj1: \",adj1);\r\n                        break;\r\n                    case \"plaque\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj1 = 16667 * 96 / 914400;\r\n                        var cnsVal1 = 50000 * 96 / 914400;\r\n                        var cnsVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj1 = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var a1, x1, x2, y2;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > cnsVal1) a1 = cnsVal1\r\n                        else a1 = adj1\r\n                        x1 = a1 * (Math.min(w, h)) / cnsVal2;\r\n                        x2 = w - x1;\r\n                        y2 = h - x1;\r\n\r\n                        var d_val = \"M0,\" + x1 +\r\n                            shapeArc(0, 0, x1, x1, 90, 0, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x2 + \",\" + 0 +\r\n                            shapeArc(w, 0, x1, x1, 180, 90, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w + \",\" + y2 +\r\n                            shapeArc(w, h, x1, x1, 270, 180, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + h +\r\n                            shapeArc(0, h, x1, x1, 0, -90, false).replace(\"M\", \"L\") + \" z\";\r\n                        result += \"<path   d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"sun\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var refr = 96 / 914400;\r\n                        var adj1 = 25000 * refr;\r\n                        var cnstVal1 = 12500 * refr;\r\n                        var cnstVal2 = 46875 * refr;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj1 = parseInt(shapAdjst.substr(4)) * refr;\r\n                        }\r\n                        var a1;\r\n                        if (adj1 < cnstVal1) a1 = cnstVal1\r\n                        else if (adj1 > cnstVal2) a1 = cnstVal2\r\n                        else a1 = adj1\r\n\r\n                        var cnstVa3 = 50000 * refr;\r\n                        var cnstVa4 = 100000 * refr;\r\n                        var g0 = cnstVa3 - a1,\r\n                            g1 = g0 * (30274 * refr) / (32768 * refr),\r\n                            g2 = g0 * (12540 * refr) / (32768 * refr),\r\n                            g3 = g1 + cnstVa3,\r\n                            g4 = g2 + cnstVa3,\r\n                            g5 = cnstVa3 - g1,\r\n                            g6 = cnstVa3 - g2,\r\n                            g7 = g0 * (23170 * refr) / (32768 * refr),\r\n                            g8 = cnstVa3 + g7,\r\n                            g9 = cnstVa3 - g7,\r\n                            g10 = g5 * 3 / 4,\r\n                            g11 = g6 * 3 / 4,\r\n                            g12 = g10 + 3662 * refr,\r\n                            g13 = g11 + 36620 * refr,\r\n                            g14 = g11 + 12500 * refr,\r\n                            g15 = cnstVa4 - g10,\r\n                            g16 = cnstVa4 - g12,\r\n                            g17 = cnstVa4 - g13,\r\n                            g18 = cnstVa4 - g14,\r\n                            ox1 = w * (18436 * refr) / (21600 * refr),\r\n                            oy1 = h * (3163 * refr) / (21600 * refr),\r\n                            ox2 = w * (3163 * refr) / (21600 * refr),\r\n                            oy2 = h * (18436 * refr) / (21600 * refr),\r\n                            x8 = w * g8 / cnstVa4,\r\n                            x9 = w * g9 / cnstVa4,\r\n                            x10 = w * g10 / cnstVa4,\r\n                            x12 = w * g12 / cnstVa4,\r\n                            x13 = w * g13 / cnstVa4,\r\n                            x14 = w * g14 / cnstVa4,\r\n                            x15 = w * g15 / cnstVa4,\r\n                            x16 = w * g16 / cnstVa4,\r\n                            x17 = w * g17 / cnstVa4,\r\n                            x18 = w * g18 / cnstVa4,\r\n                            x19 = w * a1 / cnstVa4,\r\n                            wR = w * g0 / cnstVa4,\r\n                            hR = h * g0 / cnstVa4,\r\n                            y8 = h * g8 / cnstVa4,\r\n                            y9 = h * g9 / cnstVa4,\r\n                            y10 = h * g10 / cnstVa4,\r\n                            y12 = h * g12 / cnstVa4,\r\n                            y13 = h * g13 / cnstVa4,\r\n                            y14 = h * g14 / cnstVa4,\r\n                            y15 = h * g15 / cnstVa4,\r\n                            y16 = h * g16 / cnstVa4,\r\n                            y17 = h * g17 / cnstVa4,\r\n                            y18 = h * g18 / cnstVa4;\r\n\r\n                        var d_val = \"M\" + w + \",\" + h / 2 +\r\n                            \" L\" + x15 + \",\" + y18 +\r\n                            \" L\" + x15 + \",\" + y14 +\r\n                            \"z\" +\r\n                            \" M\" + ox1 + \",\" + oy1 +\r\n                            \" L\" + x16 + \",\" + y17 +\r\n                            \" L\" + x13 + \",\" + y12 +\r\n                            \"z\" +\r\n                            \" M\" + w / 2 + \",\" + 0 +\r\n                            \" L\" + x18 + \",\" + y10 +\r\n                            \" L\" + x14 + \",\" + y10 +\r\n                            \"z\" +\r\n                            \" M\" + ox2 + \",\" + oy1 +\r\n                            \" L\" + x17 + \",\" + y12 +\r\n                            \" L\" + x12 + \",\" + y17 +\r\n                            \"z\" +\r\n                            \" M\" + 0 + \",\" + h / 2 +\r\n                            \" L\" + x10 + \",\" + y14 +\r\n                            \" L\" + x10 + \",\" + y18 +\r\n                            \"z\" +\r\n                            \" M\" + ox2 + \",\" + oy2 +\r\n                            \" L\" + x12 + \",\" + y13 +\r\n                            \" L\" + x17 + \",\" + y16 +\r\n                            \"z\" +\r\n                            \" M\" + w / 2 + \",\" + h +\r\n                            \" L\" + x14 + \",\" + y15 +\r\n                            \" L\" + x18 + \",\" + y15 +\r\n                            \"z\" +\r\n                            \" M\" + ox1 + \",\" + oy2 +\r\n                            \" L\" + x13 + \",\" + y16 +\r\n                            \" L\" + x16 + \",\" + y13 +\r\n                            \" z\" +\r\n                            \" M\" + x19 + \",\" + h / 2 +\r\n                            shapeArc(w / 2, h / 2, wR, hR, 180, 540, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        //console.log(\"adj1: \",adj1,d_val);\r\n                        result += \"<path   d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n\r\n                        break;\r\n                    case \"heart\":\r\n                        var dx1, dx2, x1, x2, x3, x4, y1;\r\n                        dx1 = w * 49 / 48;\r\n                        dx2 = w * 10 / 48\r\n                        x1 = w / 2 - dx1\r\n                        x2 = w / 2 - dx2\r\n                        x3 = w / 2 + dx2\r\n                        x4 = w / 2 + dx1\r\n                        y1 = -h / 3;\r\n                        var d_val = \"M\" + w / 2 + \",\" + h / 4 +\r\n                            \"C\" + x3 + \",\" + y1 + \" \" + x4 + \",\" + h / 4 + \" \" + w / 2 + \",\" + h +\r\n                            \"C\" + x1 + \",\" + h / 4 + \" \" + x2 + \",\" + y1 + \" \" + w / 2 + \",\" + h / 4 + \" z\";\r\n\r\n                        result += \"<path   d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"lightningBolt\":\r\n                        var x1 = w * 5022 / 21600,\r\n                            x2 = w * 11050 / 21600,\r\n                            x3 = w * 8472 / 21600,\r\n                            x4 = w * 8757 / 21600,\r\n                            x5 = w * 10012 / 21600,\r\n                            x6 = w * 14767 / 21600,\r\n                            x7 = w * 12222 / 21600,\r\n                            x8 = w * 12860 / 21600,\r\n                            x9 = w * 13917 / 21600,\r\n                            x10 = w * 7602 / 21600,\r\n                            x11 = w * 16577 / 21600,\r\n                            y1 = h * 3890 / 21600,\r\n                            y2 = h * 6080 / 21600,\r\n                            y3 = h * 6797 / 21600,\r\n                            y4 = h * 7437 / 21600,\r\n                            y5 = h * 12877 / 21600,\r\n                            y6 = h * 9705 / 21600,\r\n                            y7 = h * 12007 / 21600,\r\n                            y8 = h * 13987 / 21600,\r\n                            y9 = h * 8382 / 21600,\r\n                            y10 = h * 14277 / 21600,\r\n                            y11 = h * 14915 / 21600;\r\n\r\n                        var d_val = \"M\" + x3 + \",\" + 0 +\r\n                            \" L\" + x8 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + y3 +\r\n                            \" L\" + x11 + \",\" + y7 +\r\n                            \" L\" + x6 + \",\" + y5 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + x5 + \",\" + y11 +\r\n                            \" L\" + x7 + \",\" + y8 +\r\n                            \" L\" + x1 + \",\" + y6 +\r\n                            \" L\" + x10 + \",\" + y9 +\r\n                            \" L\" + 0 + \",\" + y1 + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"cube\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var refr = 96 / 914400;\r\n                        var adj = 25000 * refr;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * refr;\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal2 = 100000 * refr;\r\n                        var ss = Math.min(w, h);\r\n                        var a, y1, y4, x4;\r\n                        a = (adj < 0) ? 0 : (adj > cnstVal2) ? cnstVal2 : adj;\r\n                        y1 = ss * a / cnstVal2;\r\n                        y4 = h - y1;\r\n                        x4 = w - y1;\r\n                        d_val = \"M\" + 0 + \",\" + y1 +\r\n                            \" L\" + y1 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + y4 +\r\n                            \" L\" + x4 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \"M\" + 0 + \",\" + y1 +\r\n                            \" L\" + x4 + \",\" + y1 +\r\n                            \" M\" + x4 + \",\" + y1 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \"M\" + x4 + \",\" + y1 +\r\n                            \" L\" + x4 + \",\" + h;\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"bevel\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var refr = 96 / 914400;\r\n                        var adj = 12500 * refr;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * refr;\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 50000 * refr;\r\n                        var cnstVal2 = 100000 * refr;\r\n                        var ss = Math.min(w, h);\r\n                        var a, x1, x2, y2;\r\n                        a = (adj < 0) ? 0 : (adj > cnstVal1) ? cnstVal1 : adj;\r\n                        x1 = ss * a / cnstVal2;\r\n                        x2 = w - x1;\r\n                        y2 = h - x1;\r\n                        d_val = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \" M\" + x1 + \",\" + x1 +\r\n                            \" L\" + x2 + \",\" + x1 +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" z\" +\r\n                            \" M\" + 0 + \",\" + 0 +\r\n                            \" L\" + x1 + \",\" + x1 +\r\n                            \" M\" + 0 + \",\" + h +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" M\" + w + \",\" + 0 +\r\n                            \" L\" + x2 + \",\" + x1 +\r\n                            \" M\" + w + \",\" + h +\r\n                            \" L\" + x2 + \",\" + y2;\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"foldedCorner\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var refr = 96 / 914400;\r\n                        var adj = 16667 * refr;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * refr;\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 50000 * refr;\r\n                        var cnstVal2 = 100000 * refr;\r\n                        var ss = Math.min(w, h);\r\n                        var a, dy2, dy1, x1, x2, y2, y1;\r\n                        a = (adj < 0) ? 0 : (adj > cnstVal1) ? cnstVal1 : adj;\r\n                        dy2 = ss * a / cnstVal2;\r\n                        dy1 = dy2 / 5;\r\n                        x1 = w - dy2;\r\n                        x2 = x1 + dy1;\r\n                        y2 = h - dy2;\r\n                        y1 = y2 + dy1;\r\n                        d_val = \"M\" + x1 + \",\" + h +\r\n                            \" L\" + x2 + \",\" + y1 +\r\n                            \" L\" + w + \",\" + y2 +\r\n                            \" L\" + x1 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + y2;\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"cloud\":\r\n                    case \"cloudCallout\":\r\n                        var x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11,\r\n                            rx1, rx2, rx3, rx4, rx5, rx6, rx7, rx8, rx9, rx10, rx11, ry1, ry2, ry3, ry4, ry5, ry6, ry7, ry8, ry9, ry10, ry11;\r\n                        x0 = w * 3900 / 43200;;\r\n                        x1 = w * 4693 / 43200;\r\n                        x2 = w * 6928 / 43200;\r\n                        x3 = w * 16478 / 43200;\r\n                        x4 = w * 28827 / 43200;\r\n                        x5 = w * 34129 / 43200;\r\n                        x6 = w * 41798 / 43200;\r\n                        x7 = w * 38324 / 43200;\r\n                        x8 = w * 29078 / 43200;\r\n                        x9 = w * 22141 / 43200;\r\n                        x10 = w * 14000 / 43200;\r\n                        x11 = w * 4127 / 43200;\r\n                        y0 = h * 14370 / 43200;\r\n                        y1 = h * 26177 / 43200;\r\n                        y2 = h * 34899 / 43200;\r\n                        y3 = h * 39090 / 43200;\r\n                        y4 = h * 34751 / 43200;\r\n                        y5 = h * 22954 / 43200;\r\n                        y6 = h * 15354 / 43200;\r\n                        y7 = h * 5426 / 43200;\r\n                        y8 = h * 3952 / 43200;\r\n                        y9 = h * 4720 / 43200;\r\n                        y10 = h * 5192 / 43200;\r\n                        y11 = h * 15789 / 43200;\r\n                        //Path:\r\n                        //(path attrs: w = 43200; h = 43200; )\r\n                        var rX1 = w * 6753 / 43200, rY1 = h * 9190 / 43200, rX2 = w * 5333 / 43200, rY2 = h * 7267 / 43200, rX3 = w * 4365 / 43200,\r\n                            rY3 = h * 5945 / 43200, rX4 = w * 4857 / 43200, rY4 = h * 6595 / 43200, rY5 = h * 7273 / 43200, rX6 = w * 6775 / 43200,\r\n                            rY6 = h * 9220 / 43200, rX7 = w * 5785 / 43200, rY7 = h * 7867 / 43200, rX8 = w * 6752 / 43200, rY8 = h * 9215 / 43200,\r\n                            rX9 = w * 7720 / 43200, rY9 = h * 10543 / 43200, rX10 = w * 4360 / 43200, rY10 = h * 5918 / 43200, rX11 = w * 4345 / 43200;\r\n                        var sA1 = -11429249 / 60000, wA1 = 7426832 / 60000, sA2 = -8646143 / 60000, wA2 = 5396714 / 60000, sA3 = -8748475 / 60000,\r\n                            wA3 = 5983381 / 60000, sA4 = -7859164 / 60000, wA4 = 7034504 / 60000, sA5 = -4722533 / 60000, wA5 = 6541615 / 60000,\r\n                            sA6 = -2776035 / 60000, wA6 = 7816140 / 60000, sA7 = 37501 / 60000, wA7 = 6842000 / 60000, sA8 = 1347096 / 60000,\r\n                            wA8 = 6910353 / 60000, sA9 = 3974558 / 60000, wA9 = 4542661 / 60000, sA10 = -16496525 / 60000, wA10 = 8804134 / 60000,\r\n                            sA11 = -14809710 / 60000, wA11 = 9151131 / 60000;\r\n\r\n                        var cX0, cX1, cX2, cX3, cX4, cX5, cX6, cX7, cX8, cX9, cX10, cY0, cY1, cY2, cY3, cY4, cY5, cY6, cY7, cY8, cY9, cY10;\r\n                        var arc1, arc2, arc3, arc4, arc5, arc6, arc7, arc8, arc9, arc10, arc11;\r\n                        var lxy1, lxy2, lxy3, lxy4, lxy5, lxy6, lxy7, lxy8, lxy9, lxy10;\r\n\r\n                        cX0 = x0 - rX1 * Math.cos(sA1 * Math.PI / 180);\r\n                        cY0 = y0 - rY1 * Math.sin(sA1 * Math.PI / 180);\r\n                        arc1 = shapeArc(cX0, cY0, rX1, rY1, sA1, sA1 + wA1, false).replace(\"M\", \"L\");\r\n                        lxy1 = arc1.substr(arc1.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX1 = parseInt(lxy1[0]) - rX2 * Math.cos(sA2 * Math.PI / 180);\r\n                        cY1 = parseInt(lxy1[1]) - rY2 * Math.sin(sA2 * Math.PI / 180);\r\n                        arc2 = shapeArc(cX1, cY1, rX2, rY2, sA2, sA2 + wA2, false).replace(\"M\", \"L\");\r\n                        lxy2 = arc2.substr(arc2.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX2 = parseInt(lxy2[0]) - rX3 * Math.cos(sA3 * Math.PI / 180);\r\n                        cY2 = parseInt(lxy2[1]) - rY3 * Math.sin(sA3 * Math.PI / 180);\r\n                        arc3 = shapeArc(cX2, cY2, rX3, rY3, sA3, sA3 + wA3, false).replace(\"M\", \"L\");\r\n                        lxy3 = arc3.substr(arc3.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX3 = parseInt(lxy3[0]) - rX4 * Math.cos(sA4 * Math.PI / 180);\r\n                        cY3 = parseInt(lxy3[1]) - rY4 * Math.sin(sA4 * Math.PI / 180);\r\n                        arc4 = shapeArc(cX3, cY3, rX4, rY4, sA4, sA4 + wA4, false).replace(\"M\", \"L\");\r\n                        lxy4 = arc4.substr(arc4.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX4 = parseInt(lxy4[0]) - rX2 * Math.cos(sA5 * Math.PI / 180);\r\n                        cY4 = parseInt(lxy4[1]) - rY5 * Math.sin(sA5 * Math.PI / 180);\r\n                        arc5 = shapeArc(cX4, cY4, rX2, rY5, sA5, sA5 + wA5, false).replace(\"M\", \"L\");\r\n                        lxy5 = arc5.substr(arc5.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX5 = parseInt(lxy5[0]) - rX6 * Math.cos(sA6 * Math.PI / 180);\r\n                        cY5 = parseInt(lxy5[1]) - rY6 * Math.sin(sA6 * Math.PI / 180);\r\n                        arc6 = shapeArc(cX5, cY5, rX6, rY6, sA6, sA6 + wA6, false).replace(\"M\", \"L\");\r\n                        lxy6 = arc6.substr(arc6.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX6 = parseInt(lxy6[0]) - rX7 * Math.cos(sA7 * Math.PI / 180);\r\n                        cY6 = parseInt(lxy6[1]) - rY7 * Math.sin(sA7 * Math.PI / 180);\r\n                        arc7 = shapeArc(cX6, cY6, rX7, rY7, sA7, sA7 + wA7, false).replace(\"M\", \"L\");\r\n                        lxy7 = arc7.substr(arc7.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX7 = parseInt(lxy7[0]) - rX8 * Math.cos(sA8 * Math.PI / 180);\r\n                        cY7 = parseInt(lxy7[1]) - rY8 * Math.sin(sA8 * Math.PI / 180);\r\n                        arc8 = shapeArc(cX7, cY7, rX8, rY8, sA8, sA8 + wA8, false).replace(\"M\", \"L\");\r\n                        lxy8 = arc8.substr(arc8.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX8 = parseInt(lxy8[0]) - rX9 * Math.cos(sA9 * Math.PI / 180);\r\n                        cY8 = parseInt(lxy8[1]) - rY9 * Math.sin(sA9 * Math.PI / 180);\r\n                        arc9 = shapeArc(cX8, cY8, rX9, rY9, sA9, sA9 + wA9, false).replace(\"M\", \"L\");\r\n                        lxy9 = arc9.substr(arc9.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX9 = parseInt(lxy9[0]) - rX10 * Math.cos(sA10 * Math.PI / 180);\r\n                        cY9 = parseInt(lxy9[1]) - rY10 * Math.sin(sA10 * Math.PI / 180);\r\n                        arc10 = shapeArc(cX9, cY9, rX10, rY10, sA10, sA10 + wA10, false).replace(\"M\", \"L\");\r\n                        lxy10 = arc10.substr(arc10.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX10 = parseInt(lxy10[0]) - rX11 * Math.cos(sA11 * Math.PI / 180);\r\n                        cY10 = parseInt(lxy10[1]) - rY3 * Math.sin(sA11 * Math.PI / 180);\r\n                        arc11 = shapeArc(cX10, cY10, rX11, rY3, sA11, sA11 + wA11, false).replace(\"M\", \"L\");\r\n\r\n                        var d1 = \"M\" + x0 + \",\" + y0 +\r\n                            arc1 +\r\n                            arc2 +\r\n                            arc3 +\r\n                            arc4 +\r\n                            arc5 +\r\n                            arc6 +\r\n                            arc7 +\r\n                            arc8 +\r\n                            arc9 +\r\n                            arc10 +\r\n                            arc11 +\r\n                            \" z\";\r\n                        if (shapType == \"cloudCallout\") {\r\n                            var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                            var refr = 96 / 914400;\r\n                            var sAdj1, adj1 = -20833 * refr;\r\n                            var sAdj2, adj2 = 62500 * refr;\r\n                            if (shapAdjst_ary !== undefined) {\r\n                                for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                    var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                    if (sAdj_name == \"adj1\") {\r\n                                        sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                        adj1 = parseInt(sAdj1.substr(4)) * refr;\r\n                                    } else if (sAdj_name == \"adj2\") {\r\n                                        sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                        adj2 = parseInt(sAdj2.substr(4)) * refr;\r\n                                    }\r\n                                }\r\n                            }\r\n                            var d_val;\r\n                            var cnstVal2 = 100000 * refr;\r\n                            var ss = Math.min(w, h);\r\n                            var wd2 = w / 2, hd2 = h / 2;\r\n\r\n                            var dxPos, dyPos, xPos, yPos, ht, wt, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13, g14, g15, g16,\r\n                                g17, g18, g19, g20, g21, g22, g23, g24, g25, g26, x23, x24, x25;\r\n\r\n                            dxPos = w * adj1 / cnstVal2;\r\n                            dyPos = h * adj2 / cnstVal2;\r\n                            xPos = wd2 + dxPos;\r\n                            yPos = hd2 + dyPos;\r\n                            ht = hd2 * Math.cos(Math.atan(dyPos / dxPos));\r\n                            wt = wd2 * Math.sin(Math.atan(dyPos / dxPos));\r\n                            g2 = wd2 * Math.cos(Math.atan(wt / ht));\r\n                            g3 = hd2 * Math.sin(Math.atan(wt / ht));\r\n                            //console.log(\"adj1: \",adj1,\"adj2: \",adj2)\r\n                            if (adj1 >= 0) {\r\n                                g4 = wd2 + g2;\r\n                                g5 = hd2 + g3;\r\n                            } else {\r\n                                g4 = wd2 - g2;\r\n                                g5 = hd2 - g3;\r\n                            }\r\n                            g6 = g4 - xPos;\r\n                            g7 = g5 - yPos;\r\n                            g8 = Math.sqrt(g6 * g6 + g7 * g7);\r\n                            g9 = ss * 6600 / 21600;\r\n                            g10 = g8 - g9;\r\n                            g11 = g10 / 3;\r\n                            g12 = ss * 1800 / 21600;\r\n                            g13 = g11 + g12;\r\n                            g14 = g13 * g6 / g8;\r\n                            g15 = g13 * g7 / g8;\r\n                            g16 = g14 + xPos;\r\n                            g17 = g15 + yPos;\r\n                            g18 = ss * 4800 / 21600;\r\n                            g19 = g11 * 2;\r\n                            g20 = g18 + g19;\r\n                            g21 = g20 * g6 / g8;\r\n                            g22 = g20 * g7 / g8;\r\n                            g23 = g21 + xPos;\r\n                            g24 = g22 + yPos;\r\n                            g25 = ss * 1200 / 21600;\r\n                            g26 = ss * 600 / 21600;\r\n                            x23 = xPos + g26;\r\n                            x24 = g16 + g25;\r\n                            x25 = g23 + g12;\r\n\r\n                            d_val = //\" M\" + x23 + \",\" + yPos + \r\n                                shapeArc(x23 - g26, yPos, g26, g26, 0, 360, false) + //.replace(\"M\",\"L\") +\r\n                                \" z\" +\r\n                                \" M\" + x24 + \",\" + g17 +\r\n                                shapeArc(x24 - g25, g17, g25, g25, 0, 360, false).replace(\"M\", \"L\") +\r\n                                \" z\" +\r\n                                \" M\" + x25 + \",\" + g24 +\r\n                                shapeArc(x25 - g12, g24, g12, g12, 0, 360, false).replace(\"M\", \"L\") +\r\n                                \" z\";\r\n                            d1 += d_val;\r\n                        }\r\n                        result += \"<path d='\" + d1 + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"smileyFace\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var refr = 96 / 914400;\r\n                        var adj = 4653 * refr;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * refr;\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 50000 * refr;\r\n                        var cnstVal2 = 100000 * refr;\r\n                        var cnstVal3 = 4653 * refr;\r\n                        var ss = Math.min(w, h);\r\n                        var a, x1, x2, x3, x4, y1, y3, dy2, y2, y4, dy3, y5, wR, hR, wd2, hd2;\r\n                        wd2 = w / 2;\r\n                        hd2 = h / 2;\r\n                        a = (adj < -cnstVal3) ? -cnstVal3 : (adj > cnstVal3) ? cnstVal3 : adj;\r\n                        x1 = w * 4969 / 21699;\r\n                        x2 = w * 6215 / 21600;\r\n                        x3 = w * 13135 / 21600;\r\n                        x4 = w * 16640 / 21600;\r\n                        y1 = h * 7570 / 21600;\r\n                        y3 = h * 16515 / 21600;\r\n                        dy2 = h * a / cnstVal2;\r\n                        y2 = y3 - dy2;\r\n                        y4 = y3 + dy2;\r\n                        dy3 = h * a / cnstVal1;\r\n                        y5 = y4 + dy3;\r\n                        wR = w * 1125 / 21600;\r\n                        hR = h * 1125 / 21600;\r\n                        var cX1 = x2 - wR * Math.cos(Math.PI);\r\n                        var cY1 = y1 - hR * Math.sin(Math.PI);\r\n                        var cX2 = x3 - wR * Math.cos(Math.PI);\r\n                        d_val = //eyes\r\n                            shapeArc(cX1, cY1, wR, hR, 180, 540, false) +\r\n                            shapeArc(cX2, cY1, wR, hR, 180, 540, false) +\r\n                            //mouth\r\n                            \" M\" + x1 + \",\" + y2 +\r\n                            \" Q\" + wd2 + \",\" + y5 + \" \" + x4 + \",\" + y2 +\r\n                            \" Q\" + wd2 + \",\" + y5 + \" \" + x1 + \",\" + y2 +\r\n                            //head\r\n                            \" M\" + 0 + \",\" + hd2 +\r\n                            shapeArc(wd2, hd2, wd2, hd2, 180, 540, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"verticalScroll\":\r\n                    case \"horizontalScroll\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var refr = 96 / 914400;\r\n                        var adj = 12500 * refr;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * refr;\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 25000 * refr;\r\n                        var cnstVal2 = 100000 * refr;\r\n                        var ss = Math.min(w, h);\r\n                        var t = 0, l = 0, b = h, r = w;\r\n                        var a, ch, ch2, ch4;\r\n                        a = (adj < 0) ? 0 : (adj > cnstVal1) ? cnstVal1 : adj;\r\n                        ch = ss * a / cnstVal2;\r\n                        ch2 = ch / 2;\r\n                        ch4 = ch / 4;\r\n                        if (shapType == \"verticalScroll\") {\r\n                            var x3, x4, x6, x7, x5, y3, y4;\r\n                            x3 = ch + ch2;\r\n                            x4 = ch + ch;\r\n                            x6 = r - ch;\r\n                            x7 = r - ch2;\r\n                            x5 = x6 - ch2;\r\n                            y3 = b - ch;\r\n                            y4 = b - ch2;\r\n\r\n                            d_val = \"M\" + ch + \",\" + y3 +\r\n                                \" L\" + ch + \",\" + ch2 +\r\n                                shapeArc(x3, ch2, ch2, ch2, 180, 270, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x7 + \",\" + t +\r\n                                shapeArc(x7, ch2, ch2, ch2, 270, 450, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x6 + \",\" + ch +\r\n                                \" L\" + x6 + \",\" + y4 +\r\n                                shapeArc(x5, y4, ch2, ch2, 0, 90, false).replace(\"M\", \"L\") +\r\n                                \" L\" + ch2 + \",\" + b +\r\n                                shapeArc(ch2, y4, ch2, ch2, 90, 270, false).replace(\"M\", \"L\") +\r\n                                \" z\" +\r\n                                \" M\" + x3 + \",\" + t +\r\n                                shapeArc(x3, ch2, ch2, ch2, 270, 450, false).replace(\"M\", \"L\") +\r\n                                shapeArc(x3, x3 / 2, ch4, ch4, 90, 270, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x4 + \",\" + ch2 +\r\n                                \" M\" + x6 + \",\" + ch +\r\n                                \" L\" + x3 + \",\" + ch +\r\n                                \" M\" + ch + \",\" + y4 +\r\n                                shapeArc(ch2, y4, ch2, ch2, 0, 270, false).replace(\"M\", \"L\") +\r\n                                shapeArc(ch2, (y4 + y3) / 2, ch4, ch4, 270, 450, false).replace(\"M\", \"L\") +\r\n                                \" z\" +\r\n                                \" M\" + ch + \",\" + y4 +\r\n                                \" L\" + ch + \",\" + y3;\r\n                        } else if (shapType == \"horizontalScroll\") {\r\n                            var y3, y4, y6, y7, y5, x3, x4;\r\n                            y3 = ch + ch2;\r\n                            y4 = ch + ch;\r\n                            y6 = b - ch;\r\n                            y7 = b - ch2;\r\n                            y5 = y6 - ch2;\r\n                            x3 = r - ch;\r\n                            x4 = r - ch2;\r\n\r\n                            d_val = \"M\" + l + \",\" + y3 +\r\n                                shapeArc(ch2, y3, ch2, ch2, 180, 270, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x3 + \",\" + ch +\r\n                                \" L\" + x3 + \",\" + ch2 +\r\n                                shapeArc(x4, ch2, ch2, ch2, 180, 360, false).replace(\"M\", \"L\") +\r\n                                \" L\" + r + \",\" + y5 +\r\n                                shapeArc(x4, y5, ch2, ch2, 0, 90, false).replace(\"M\", \"L\") +\r\n                                \" L\" + ch + \",\" + y6 +\r\n                                \" L\" + ch + \",\" + y7 +\r\n                                shapeArc(ch2, y7, ch2, ch2, 0, 180, false).replace(\"M\", \"L\") +\r\n                                \" z\" +\r\n                                \"M\" + x4 + \",\" + ch +\r\n                                shapeArc(x4, ch2, ch2, ch2, 90, -180, false).replace(\"M\", \"L\") +\r\n                                shapeArc((x3 + x4) / 2, ch2, ch4, ch4, 180, 0, false).replace(\"M\", \"L\") +\r\n                                \" z\" +\r\n                                \" M\" + x4 + \",\" + ch +\r\n                                \" L\" + x3 + \",\" + ch +\r\n                                \" M\" + ch2 + \",\" + y4 +\r\n                                \" L\" + ch2 + \",\" + y3 +\r\n                                shapeArc(y3 / 2, y3, ch4, ch4, 180, 360, false).replace(\"M\", \"L\") +\r\n                                shapeArc(ch2, y3, ch2, ch2, 0, 180, false).replace(\"M\", \"L\") +\r\n                                \" M\" + ch + \",\" + y3 +\r\n                                \" L\" + ch + \",\" + y6;\r\n                        }\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"wedgeEllipseCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var refr = 96 / 914400;\r\n                        var sAdj1, adj1 = -20833 * refr;\r\n                        var sAdj2, adj2 = 62500 * refr;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * refr;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 100000 * 96 / 914400;\r\n                        var angVal1 = 11 * Math.PI / 180;\r\n                        var ss = Math.min(w, h);\r\n                        var dxPos, dyPos, xPos, yPos, sdx, sdy, pang, stAng, enAng, dx1, dy1, x1, y1, dx2, dy2,\r\n                            x2, y2, stAng1, enAng1, swAng1, swAng2, swAng,\r\n                            vc = h / 2, hc = w / 2;\r\n                        dxPos = w * adj1 / cnstVal1;\r\n                        dyPos = h * adj2 / cnstVal1;\r\n                        xPos = hc + dxPos;\r\n                        yPos = vc + dyPos;\r\n                        sdx = dxPos * h;\r\n                        sdy = dyPos * w;\r\n                        pang = Math.atan(sdy / sdx);\r\n                        stAng = pang + angVal1;\r\n                        enAng = pang - angVal1;\r\n                        console.log(\"dxPos: \", dxPos, \"dyPos: \", dyPos)\r\n                        dx1 = hc * Math.cos(stAng);\r\n                        dy1 = vc * Math.sin(stAng);\r\n                        dx2 = hc * Math.cos(enAng);\r\n                        dy2 = vc * Math.sin(enAng);\r\n                        if (dxPos >= 0) {\r\n                            x1 = hc + dx1;\r\n                            y1 = vc + dy1;\r\n                            x2 = hc + dx2;\r\n                            y2 = vc + dy2;\r\n                        } else {\r\n                            x1 = hc - dx1;\r\n                            y1 = vc - dy1;\r\n                            x2 = hc - dx2;\r\n                            y2 = vc - dy2;\r\n                        }\r\n                        /*\r\n                        //stAng = pang+angVal1;\r\n                        //enAng = pang-angVal1;\r\n                        //dx1 = hc*Math.cos(stAng);\r\n                        //dy1 = vc*Math.sin(stAng);\r\n                        x1 = hc+dx1;\r\n                        y1 = vc+dy1;\r\n                        dx2 = hc*Math.cos(enAng);\r\n                        dy2 = vc*Math.sin(enAng);\r\n                        x2 = hc+dx2;\r\n                        y2 = vc+dy2;\r\n                        stAng1 = Math.atan(dy1/dx1);\r\n                        enAng1 = Math.atan(dy2/dx2);\r\n                        swAng1 = enAng1-stAng1;\r\n                        swAng2 = swAng1+2*Math.PI;\r\n                        swAng = (swAng1 > 0)?swAng1:swAng2;\r\n                        var stAng1Dg = stAng1*180/Math.PI;\r\n                        var swAngDg = swAng*180/Math.PI;\r\n                        var endAng = stAng1Dg + swAngDg;\r\n                        */\r\n                        d_val = \"M\" + x1 + \",\" + y1 +\r\n                            \" L\" + xPos + \",\" + yPos +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            //\" z\" +\r\n                            shapeArc(hc, vc, hc, vc, 0, 360, true);// +\r\n                        //shapeArc(hc,vc,hc,vc,stAng1Dg,stAng1Dg+swAngDg,false).replace(\"M\",\"L\") +\r\n                        //\" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"wedgeRectCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var refr = 96 / 914400;\r\n                        var sAdj1, adj1 = -20833 * refr;\r\n                        var sAdj2, adj2 = 62500 * refr;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * refr;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 100000 * 96 / 914400;\r\n                        var dxPos, dyPos, xPos, yPos, dx, dy, dq, ady, adq, dz, xg1, xg2, x1, x2,\r\n                            yg1, yg2, y1, y2, t1, xl, t2, xt, t3, xr, t4, xb, t5, yl, t6, yt, t7, yr, t8, yb,\r\n                            vc = h / 2, hc = w / 2;\r\n                        dxPos = w * adj1 / cnstVal1;\r\n                        dyPos = h * adj2 / cnstVal1;\r\n                        xPos = hc + dxPos;\r\n                        yPos = vc + dyPos;\r\n                        dx = xPos - hc;\r\n                        dy = yPos - vc;\r\n                        dq = dxPos * h / w;\r\n                        ady = Math.abs(dyPos);\r\n                        adq = Math.abs(dq);\r\n                        dz = ady - adq;\r\n                        xg1 = (dxPos > 0) ? 7 : 2;\r\n                        xg2 = (dxPos > 0) ? 10 : 5;\r\n                        x1 = w * xg1 / 12;\r\n                        x2 = w * xg2 / 12;\r\n                        yg1 = (dyPos > 0) ? 7 : 2;\r\n                        yg2 = (dyPos > 0) ? 10 : 5;\r\n                        y1 = h * yg1 / 12;\r\n                        y2 = h * yg2 / 12;\r\n                        t1 = (dxPos > 0) ? 0 : xPos;\r\n                        xl = (dz > 0) ? 0 : t1;\r\n                        t2 = (dyPos > 0) ? x1 : xPos;\r\n                        xt = (dz > 0) ? t2 : x1;\r\n                        t3 = (dxPos > 0) ? xPos : w;\r\n                        xr = (dz > 0) ? w : t3;\r\n                        t4 = (dyPos > 0) ? xPos : x1;\r\n                        xb = (dz > 0) ? t4 : x1;\r\n                        t5 = (dxPos > 0) ? y1 : yPos;\r\n                        yl = (dz > 0) ? y1 : t5;\r\n                        t6 = (dyPos > 0) ? 0 : yPos;\r\n                        yt = (dz > 0) ? t6 : 0;\r\n                        t7 = (dxPos > 0) ? yPos : y1;\r\n                        yr = (dz > 0) ? y1 : t7;\r\n                        t8 = (dyPos > 0) ? yPos : h;\r\n                        yb = (dz > 0) ? t8 : h;\r\n\r\n                        d_val = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + x1 + \",\" + 0 +\r\n                            \" L\" + xt + \",\" + yt +\r\n                            \" L\" + x2 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + y1 +\r\n                            \" L\" + xr + \",\" + yr +\r\n                            \" L\" + w + \",\" + y2 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + x2 + \",\" + h +\r\n                            \" L\" + xb + \",\" + yb +\r\n                            \" L\" + x1 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + y2 +\r\n                            \" L\" + xl + \",\" + yl +\r\n                            \" L\" + 0 + \",\" + y1 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"wedgeRoundRectCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var refr = 96 / 914400;\r\n                        var sAdj1, adj1 = -20833 * refr;\r\n                        var sAdj2, adj2 = 62500 * refr;\r\n                        var sAdj3, adj3 = 16667 * refr;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * refr;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 100000 * 96 / 914400;\r\n                        var ss = Math.min(w, h);\r\n                        var dxPos, dyPos, xPos, yPos, dq, ady, adq, dz, xg1, xg2, x1, x2, yg1, yg2, y1, y2,\r\n                            t1, xl, t2, xt, t3, xr, t4, xb, t5, yl, t6, yt, t7, yr, t8, yb, u1, u2, v2,\r\n                            vc = h / 2, hc = w / 2;\r\n                        dxPos = w * adj1 / cnstVal1;\r\n                        dyPos = h * adj2 / cnstVal1;\r\n                        xPos = hc + dxPos;\r\n                        yPos = vc + dyPos;\r\n                        dq = dxPos * h / w;\r\n                        ady = Math.abs(dyPos);\r\n                        adq = Math.abs(dq);\r\n                        dz = ady - adq;\r\n                        xg1 = (dxPos > 0) ? 7 : 2;\r\n                        xg2 = (dxPos > 0) ? 10 : 5;\r\n                        x1 = w * xg1 / 12;\r\n                        x2 = w * xg2 / 12;\r\n                        yg1 = (dyPos > 0) ? 7 : 2;\r\n                        yg2 = (dyPos > 0) ? 10 : 5;\r\n                        y1 = h * yg1 / 12;\r\n                        y2 = h * yg2 / 12;\r\n                        t1 = (dxPos > 0) ? 0 : xPos;\r\n                        xl = (dz > 0) ? 0 : t1;\r\n                        t2 = (dyPos > 0) ? x1 : xPos;\r\n                        xt = (dz > 0) ? t2 : x1;\r\n                        t3 = (dxPos > 0) ? xPos : w;\r\n                        xr = (dz > 0) ? w : t3;\r\n                        t4 = (dyPos > 0) ? xPos : x1;\r\n                        xb = (dz > 0) ? t4 : x1;\r\n                        t5 = (dxPos > 0) ? y1 : yPos;\r\n                        yl = (dz > 0) ? y1 : t5;\r\n                        t6 = (dyPos > 0) ? 0 : yPos;\r\n                        yt = (dz > 0) ? t6 : 0;\r\n                        t7 = (dxPos > 0) ? yPos : y1;\r\n                        yr = (dz > 0) ? y1 : t7;\r\n                        t8 = (dyPos > 0) ? yPos : h;\r\n                        yb = (dz > 0) ? t8 : h;\r\n                        u1 = ss * adj3 / cnstVal1;\r\n                        u2 = w - u1;\r\n                        v2 = h - u1;\r\n                        d_val = \"M\" + 0 + \",\" + u1 +\r\n                            shapeArc(u1, u1, u1, u1, 180, 270, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + 0 +\r\n                            \" L\" + xt + \",\" + yt +\r\n                            \" L\" + x2 + \",\" + 0 +\r\n                            \" L\" + u2 + \",\" + 0 +\r\n                            shapeArc(u2, u1, u1, u1, 270, 360, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w + \",\" + y1 +\r\n                            \" L\" + xr + \",\" + yr +\r\n                            \" L\" + w + \",\" + y2 +\r\n                            \" L\" + w + \",\" + v2 +\r\n                            shapeArc(u2, v2, u1, u1, 0, 90, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x2 + \",\" + h +\r\n                            \" L\" + xb + \",\" + yb +\r\n                            \" L\" + x1 + \",\" + h +\r\n                            \" L\" + u1 + \",\" + h +\r\n                            shapeArc(u1, v2, u1, u1, 90, 180, false).replace(\"M\", \"L\") +\r\n                            \" L\" + 0 + \",\" + y2 +\r\n                            \" L\" + xl + \",\" + yl +\r\n                            \" L\" + 0 + \",\" + y1 +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"accentBorderCallout1\":\r\n                    case \"accentBorderCallout2\":\r\n                    case \"accentBorderCallout3\":\r\n                    case \"borderCallout1\":\r\n                    case \"borderCallout2\":\r\n                    case \"borderCallout3\":\r\n                    case \"accentCallout1\":\r\n                    case \"accentCallout2\":\r\n                    case \"accentCallout3\":\r\n                    case \"callout1\":\r\n                    case \"callout2\":\r\n                    case \"callout3\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var refr = 96 / 914400;\r\n                        var sAdj1, adj1 = 18750 * refr;\r\n                        var sAdj2, adj2 = -8333 * refr;\r\n                        var sAdj3, adj3 = 18750 * refr;\r\n                        var sAdj4, adj4 = -16667 * refr;\r\n                        var sAdj5, adj5 = 100000 * refr;\r\n                        var sAdj6, adj6 = -16667 * refr;\r\n                        var sAdj7, adj7 = 112963 * refr;\r\n                        var sAdj8, adj8 = -8333 * refr;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj5\") {\r\n                                    sAdj5 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj5 = parseInt(sAdj5.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj6\") {\r\n                                    sAdj6 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj6 = parseInt(sAdj6.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj7\") {\r\n                                    sAdj7 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj7 = parseInt(sAdj7.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj8\") {\r\n                                    sAdj8 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj8 = parseInt(sAdj8.substr(4)) * refr;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 100000 * refr;\r\n                        var isBorder = true;\r\n                        switch (shapType) {\r\n                            case \"borderCallout1\":\r\n                            case \"callout1\":\r\n                                if (shapType == \"borderCallout1\") {\r\n                                    isBorder = true;\r\n                                } else {\r\n                                    isBorder = false;\r\n                                }\r\n                                if (shapAdjst_ary === undefined) {\r\n                                    adj1 = 18750 * refr;\r\n                                    adj2 = -8333 * refr;\r\n                                    adj3 = 112500 * refr;\r\n                                    adj4 = -38333 * refr;\r\n                                }\r\n                                var y1, x1, y2, x2;\r\n                                y1 = h * adj1 / cnstVal1;\r\n                                x1 = w * adj2 / cnstVal1;\r\n                                y2 = h * adj3 / cnstVal1;\r\n                                x2 = w * adj4 / cnstVal1;\r\n                                d_val = \"M\" + 0 + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + h +\r\n                                    \" L\" + 0 + \",\" + h +\r\n                                    \" z\" +\r\n                                    \" M\" + x1 + \",\" + y1 +\r\n                                    \" L\" + x2 + \",\" + y2;\r\n                                break;\r\n                            case \"borderCallout2\":\r\n                            case \"callout2\":\r\n                                if (shapType == \"borderCallout2\") {\r\n                                    isBorder = true;\r\n                                } else {\r\n                                    isBorder = false;\r\n                                }\r\n                                if (shapAdjst_ary === undefined) {\r\n                                    adj1 = 18750 * refr;\r\n                                    adj2 = -8333 * refr;\r\n                                    adj3 = 18750 * refr;\r\n                                    adj4 = -16667 * refr;\r\n\r\n                                    adj5 = 112500 * refr;\r\n                                    adj6 = -46667 * refr;\r\n                                }\r\n                                var y1, x1, y2, x2, y3, x3;\r\n\r\n                                y1 = h * adj1 / cnstVal1;\r\n                                x1 = w * adj2 / cnstVal1;\r\n                                y2 = h * adj3 / cnstVal1;\r\n                                x2 = w * adj4 / cnstVal1;\r\n\r\n                                y3 = h * adj5 / cnstVal1;\r\n                                x3 = w * adj6 / cnstVal1;\r\n                                d_val = \"M\" + 0 + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + h +\r\n                                    \" L\" + 0 + \",\" + h +\r\n                                    \" z\" +\r\n\r\n                                    \" M\" + x1 + \",\" + y1 +\r\n                                    \" L\" + x2 + \",\" + y2 +\r\n\r\n                                    \" L\" + x3 + \",\" + y3 +\r\n                                    \" L\" + x2 + \",\" + y2;\r\n\r\n                                break;\r\n                            case \"borderCallout3\":\r\n                            case \"callout3\":\r\n                                if (shapType == \"borderCallout3\") {\r\n                                    isBorder = true;\r\n                                } else {\r\n                                    isBorder = false;\r\n                                }\r\n                                if (shapAdjst_ary === undefined) {\r\n                                    adj1 = 18750 * refr;\r\n                                    adj2 = -8333 * refr;\r\n                                    adj3 = 18750 * refr;\r\n                                    adj4 = -16667 * refr;\r\n\r\n                                    adj5 = 100000 * refr;\r\n                                    adj6 = -16667 * refr;\r\n\r\n                                    adj7 = 112963 * refr;\r\n                                    adj8 = -8333 * refr;\r\n                                }\r\n                                var y1, x1, y2, x2, y3, x3, y4, x4;\r\n\r\n                                y1 = h * adj1 / cnstVal1;\r\n                                x1 = w * adj2 / cnstVal1;\r\n                                y2 = h * adj3 / cnstVal1;\r\n                                x2 = w * adj4 / cnstVal1;\r\n\r\n                                y3 = h * adj5 / cnstVal1;\r\n                                x3 = w * adj6 / cnstVal1;\r\n\r\n                                y4 = h * adj7 / cnstVal1;\r\n                                x4 = w * adj8 / cnstVal1;\r\n                                d_val = \"M\" + 0 + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + h +\r\n                                    \" L\" + 0 + \",\" + h +\r\n                                    \" z\" +\r\n\r\n                                    \" M\" + x1 + \",\" + y1 +\r\n                                    \" L\" + x2 + \",\" + y2 +\r\n\r\n                                    \" L\" + x3 + \",\" + y3 +\r\n\r\n                                    \" L\" + x4 + \",\" + y4 +\r\n                                    \" L\" + x3 + \",\" + y3 +\r\n                                    \" L\" + x2 + \",\" + y2;\r\n                                break;\r\n                            case \"accentBorderCallout1\":\r\n                            case \"accentCallout1\":\r\n                                if (shapType == \"accentBorderCallout1\") {\r\n                                    isBorder = true;\r\n                                } else {\r\n                                    isBorder = false;\r\n                                }\r\n\r\n                                if (shapAdjst_ary === undefined) {\r\n                                    adj1 = 18750 * refr;\r\n                                    adj2 = -8333 * refr;\r\n                                    adj3 = 112500 * refr;\r\n                                    adj4 = -38333 * refr;\r\n                                }\r\n                                var y1, x1, y2, x2;\r\n                                y1 = h * adj1 / cnstVal1;\r\n                                x1 = w * adj2 / cnstVal1;\r\n                                y2 = h * adj3 / cnstVal1;\r\n                                x2 = w * adj4 / cnstVal1;\r\n                                d_val = \"M\" + 0 + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + h +\r\n                                    \" L\" + 0 + \",\" + h +\r\n                                    \" z\" +\r\n\r\n                                    \" M\" + x1 + \",\" + y1 +\r\n                                    \" L\" + x2 + \",\" + y2 +\r\n\r\n                                    \" M\" + x1 + \",\" + 0 +\r\n                                    \" L\" + x1 + \",\" + h;\r\n                                break;\r\n                            case \"accentBorderCallout2\":\r\n                            case \"accentCallout2\":\r\n                                if (shapType == \"accentBorderCallout2\") {\r\n                                    isBorder = true;\r\n                                } else {\r\n                                    isBorder = false;\r\n                                }\r\n                                if (shapAdjst_ary === undefined) {\r\n                                    adj1 = 18750 * refr;\r\n                                    adj2 = -8333 * refr;\r\n                                    adj3 = 18750 * refr;\r\n                                    adj4 = -16667 * refr;\r\n                                    adj5 = 112500 * refr;\r\n                                    adj6 = -46667 * refr;\r\n                                }\r\n                                var y1, x1, y2, x2, y3, x3;\r\n\r\n                                y1 = h * adj1 / cnstVal1;\r\n                                x1 = w * adj2 / cnstVal1;\r\n                                y2 = h * adj3 / cnstVal1;\r\n                                x2 = w * adj4 / cnstVal1;\r\n                                y3 = h * adj5 / cnstVal1;\r\n                                x3 = w * adj6 / cnstVal1;\r\n                                d_val = \"M\" + 0 + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + h +\r\n                                    \" L\" + 0 + \",\" + h +\r\n                                    \" z\" +\r\n\r\n                                    \" M\" + x1 + \",\" + y1 +\r\n                                    \" L\" + x2 + \",\" + y2 +\r\n                                    \" L\" + x3 + \",\" + y3 +\r\n                                    \" L\" + x2 + \",\" + y2 +\r\n\r\n                                    \" M\" + x1 + \",\" + 0 +\r\n                                    \" L\" + x1 + \",\" + h;\r\n\r\n                                break;\r\n                            case \"accentBorderCallout3\":\r\n                            case \"accentCallout3\":\r\n                                if (shapType == \"accentBorderCallout3\") {\r\n                                    isBorder = true;\r\n                                } else {\r\n                                    isBorder = false;\r\n                                }\r\n                                isBorder = true;\r\n                                if (shapAdjst_ary === undefined) {\r\n                                    adj1 = 18750 * refr;\r\n                                    adj2 = -8333 * refr;\r\n                                    adj3 = 18750 * refr;\r\n                                    adj4 = -16667 * refr;\r\n                                    adj5 = 100000 * refr;\r\n                                    adj6 = -16667 * refr;\r\n                                    adj7 = 112963 * refr;\r\n                                    adj8 = -8333 * refr;\r\n                                }\r\n                                var y1, x1, y2, x2, y3, x3, y4, x4;\r\n\r\n                                y1 = h * adj1 / cnstVal1;\r\n                                x1 = w * adj2 / cnstVal1;\r\n                                y2 = h * adj3 / cnstVal1;\r\n                                x2 = w * adj4 / cnstVal1;\r\n                                y3 = h * adj5 / cnstVal1;\r\n                                x3 = w * adj6 / cnstVal1;\r\n                                y4 = h * adj7 / cnstVal1;\r\n                                x4 = w * adj8 / cnstVal1;\r\n                                d_val = \"M\" + 0 + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + h +\r\n                                    \" L\" + 0 + \",\" + h +\r\n                                    \" z\" +\r\n\r\n                                    \" M\" + x1 + \",\" + y1 +\r\n                                    \" L\" + x2 + \",\" + y2 +\r\n                                    \" L\" + x3 + \",\" + y3 +\r\n                                    \" L\" + x4 + \",\" + y4 +\r\n                                    \" L\" + x3 + \",\" + y3 +\r\n                                    \" L\" + x2 + \",\" + y2 +\r\n\r\n                                    \" M\" + x1 + \",\" + 0 +\r\n                                    \" L\" + x1 + \",\" + h;\r\n                                break;\r\n                        }\r\n\r\n                        console.log(\"shapType: \", shapType, \",isBorder:\", isBorder)\r\n                        //if(isBorder){\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        //}else{\r\n                        //    result += \"<path d='\"+d_val+\"' fill='\" + (!imgFillFlg?(grndFillFlg?\"url(#linGrd_\"+shpId+\")\":fillColor):\"url(#imgPtrn_\"+shpId+\")\") + \r\n                        //        \"' stroke='none' />\";\r\n\r\n                        //}\r\n                        break;\r\n                    case \"leftRightRibbon\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var refr = 96 / 914400;\r\n                        var sAdj1, adj1 = 50000 * refr;\r\n                        var sAdj2, adj2 = 50000 * refr;\r\n                        var sAdj3, adj3 = 16667 * refr;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * refr;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 33333 * refr;\r\n                        var cnstVal2 = 100000 * refr;\r\n                        var cnstVal3 = 200000 * refr;\r\n                        var cnstVal4 = 400000 * refr;\r\n                        var ss = Math.min(w, h);\r\n                        var a3, maxAdj1, a1, w1, maxAdj2, a2, x1, x4, dy1, dy2, ly1, ry4, ly2, ry3, ly4, ry1,\r\n                            ly3, ry2, hR, x2, x3, y1, y2, wd32 = w / 32, vc = h / 2, hc = w / 2;\r\n\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > cnstVal1) ? cnstVal1 : adj3;\r\n                        maxAdj1 = cnstVal2 - a3;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        w1 = hc - wd32;\r\n                        maxAdj2 = cnstVal2 * w1 / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        x1 = ss * a2 / cnstVal2;\r\n                        x4 = w - x1;\r\n                        dy1 = h * a1 / cnstVal3;\r\n                        dy2 = h * a3 / -cnstVal3;\r\n                        ly1 = vc + dy2 - dy1;\r\n                        ry4 = vc + dy1 - dy2;\r\n                        ly2 = ly1 + dy1;\r\n                        ry3 = h - ly2;\r\n                        ly4 = ly2 * 2;\r\n                        ry1 = h - ly4;\r\n                        ly3 = ly4 - ly1;\r\n                        ry2 = h - ly3;\r\n                        hR = a3 * ss / cnstVal4;\r\n                        x2 = hc - wd32;\r\n                        x3 = hc + wd32;\r\n                        y1 = ly1 + hR;\r\n                        y2 = ry2 - hR;\r\n\r\n                        d_val = \"M\" + 0 + \",\" + ly2 +\r\n                            \"L\" + x1 + \",\" + 0 +\r\n                            \"L\" + x1 + \",\" + ly1 +\r\n                            \"L\" + hc + \",\" + ly1 +\r\n                            shapeArc(hc, y1, wd32, hR, 270, 450, false).replace(\"M\", \"L\") +\r\n                            shapeArc(hc, y2, wd32, hR, 270, 90, false).replace(\"M\", \"L\") +\r\n                            \"L\" + x4 + \",\" + ry2 +\r\n                            \"L\" + x4 + \",\" + ry1 +\r\n                            \"L\" + w + \",\" + ry3 +\r\n                            \"L\" + x4 + \",\" + h +\r\n                            \"L\" + x4 + \",\" + ry4 +\r\n                            \"L\" + hc + \",\" + ry4 +\r\n                            shapeArc(hc, ry4 - hR, wd32, hR, 90, 180, false).replace(\"M\", \"L\") +\r\n                            \"L\" + x2 + \",\" + ly3 +\r\n                            \"L\" + x1 + \",\" + ly3 +\r\n                            \"L\" + x1 + \",\" + ly4 +\r\n                            \" z\" +\r\n                            \"M\" + x3 + \",\" + y1 +\r\n                            \"L\" + x3 + \",\" + ry2 +\r\n                            \"M\" + x2 + \",\" + y2 +\r\n                            \"L\" + x2 + \",\" + ly3;\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"ribbon\":\r\n                    case \"ribbon2\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 16667 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 25000 * 96 / 914400;\r\n                        var cnstVal2 = 33333 * 96 / 914400;\r\n                        var cnstVal3 = 75000 * 96 / 914400;\r\n                        var cnstVal4 = 100000 * 96 / 914400;\r\n                        var cnstVal5 = 200000 * 96 / 914400;\r\n                        var cnstVal6 = 400000 * 96 / 914400;\r\n                        var hc = w / 2, t = 0, l = 0, b = h, r = w, wd8 = w / 8, wd32 = w / 32;\r\n                        var a1, a2, x10, dx2, x2, x9, x3, x8, x5, x6, x4, x7, y1, y2, y4, y3, hR, y6;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal2) ? cnstVal2 : adj1;\r\n                        a2 = (adj2 < cnstVal1) ? cnstVal1 : (adj2 > cnstVal3) ? cnstVal3 : adj2;\r\n                        x10 = r - wd8;\r\n                        dx2 = w * a2 / cnstVal5;\r\n                        x2 = hc - dx2;\r\n                        x9 = hc + dx2;\r\n                        x3 = x2 + wd32;\r\n                        x8 = x9 - wd32;\r\n                        x5 = x2 + wd8;\r\n                        x6 = x9 - wd8;\r\n                        x4 = x5 - wd32;\r\n                        x7 = x6 + wd32;\r\n                        hR = h * a1 / cnstVal6;\r\n                        if (shapType == \"ribbon2\") {\r\n                            var dy1, dy2, y7;\r\n                            dy1 = h * a1 / cnstVal5;\r\n                            y1 = b - dy1;\r\n                            dy2 = h * a1 / cnstVal4;\r\n                            y2 = b - dy2;\r\n                            y4 = t + dy2;\r\n                            y3 = (y4 + b) / 2;\r\n                            y6 = b - hR;///////////////////\r\n                            y7 = y1 - hR;\r\n\r\n                            d_val = \"M\" + l + \",\" + b +\r\n                                \" L\" + wd8 + \",\" + y3 +\r\n                                \" L\" + l + \",\" + y4 +\r\n                                \" L\" + x2 + \",\" + y4 +\r\n                                \" L\" + x2 + \",\" + hR +\r\n                                shapeArc(x3, hR, wd32, hR, 180, 270, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x8 + \",\" + t +\r\n                                shapeArc(x8, hR, wd32, hR, 270, 360, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x9 + \",\" + y4 +\r\n                                \" L\" + x9 + \",\" + y4 +\r\n                                \" L\" + r + \",\" + y4 +\r\n                                \" L\" + x10 + \",\" + y3 +\r\n                                \" L\" + r + \",\" + b +\r\n                                \" L\" + x7 + \",\" + b +\r\n                                shapeArc(x7, y6, wd32, hR, 90, 270, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x8 + \",\" + y1 +\r\n                                shapeArc(x8, y7, wd32, hR, 90, -90, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x3 + \",\" + y2 +\r\n                                shapeArc(x3, y7, wd32, hR, 270, 90, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x4 + \",\" + y1 +\r\n                                shapeArc(x4, y6, wd32, hR, 270, 450, false).replace(\"M\", \"L\") +\r\n                                \" z\" +\r\n                                \" M\" + x5 + \",\" + y2 +\r\n                                \" L\" + x5 + \",\" + y6 +\r\n                                \"M\" + x6 + \",\" + y6 +\r\n                                \" L\" + x6 + \",\" + y2 +\r\n                                \"M\" + x2 + \",\" + y7 +\r\n                                \" L\" + x2 + \",\" + y4 +\r\n                                \"M\" + x9 + \",\" + y4 +\r\n                                \" L\" + x9 + \",\" + y7;\r\n                        } else if (shapType == \"ribbon\") {\r\n                            var y5;\r\n                            y1 = h * a1 / cnstVal5;\r\n                            y2 = h * a1 / cnstVal4;\r\n                            y4 = b - y2;\r\n                            y3 = y4 / 2;\r\n                            y5 = b - hR; ///////////////////////\r\n                            y6 = y2 - hR;\r\n                            d_val = \"M\" + l + \",\" + t +\r\n                                \" L\" + x4 + \",\" + t +\r\n                                shapeArc(x4, hR, wd32, hR, 270, 450, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x3 + \",\" + y1 +\r\n                                shapeArc(x3, y6, wd32, hR, 270, 90, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x8 + \",\" + y2 +\r\n                                shapeArc(x8, y6, wd32, hR, 90, -90, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x7 + \",\" + y1 +\r\n                                shapeArc(x7, hR, wd32, hR, 90, 270, false).replace(\"M\", \"L\") +\r\n                                \" L\" + r + \",\" + t +\r\n                                \" L\" + x10 + \",\" + y3 +\r\n                                \" L\" + r + \",\" + y4 +\r\n                                \" L\" + x9 + \",\" + y4 +\r\n                                \" L\" + x9 + \",\" + y5 +\r\n                                shapeArc(x8, y5, wd32, hR, 0, 90, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x3 + \",\" + b +\r\n                                shapeArc(x3, y5, wd32, hR, 90, 180, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x2 + \",\" + y4 +\r\n                                \" L\" + l + \",\" + y4 +\r\n                                \" L\" + wd8 + \",\" + y3 +\r\n                                \" z\" +\r\n                                \" M\" + x5 + \",\" + hR +\r\n                                \" L\" + x5 + \",\" + y2 +\r\n                                \"M\" + x6 + \",\" + y2 +\r\n                                \" L\" + x6 + \",\" + hR +\r\n                                \"M\" + x2 + \",\" + y4 +\r\n                                \" L\" + x2 + \",\" + y6 +\r\n                                \"M\" + x9 + \",\" + y6 +\r\n                                \" L\" + x9 + \",\" + y4;\r\n                        }\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"doubleWave\":\r\n                    case \"wave\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = (shapType == \"doubleWave\") ? 6250 * 96 / 914400 : 12500 * 96 / 914400;\r\n                        var sAdj2, adj2 = 0;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal2 = -10000 * 96 / 914400;\r\n                        var cnstVal3 = 50000 * 96 / 914400;\r\n                        var cnstVal4 = 100000 * 96 / 914400;\r\n                        var hc = w / 2, t = 0, l = 0, b = h, r = w, wd8 = w / 8, wd32 = w / 32;\r\n                        if (shapType == \"doubleWave\") {\r\n                            var cnstVal1 = 12500 * 96 / 914400;\r\n                            var a1, a2, y1, dy2, y2, y3, y4, y5, y6, of2, dx2, x2, dx8, x8, dx3, x3, dx4, x4, x5, x6, x7, x9, x15, x10, x11, x12, x13, x14;\r\n                            a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal1) ? cnstVal1 : adj1;\r\n                            a2 = (adj2 < cnstVal2) ? cnstVal2 : (adj2 > cnstVal4) ? cnstVal4 : adj2;\r\n                            y1 = h * a1 / cnstVal4;\r\n                            dy2 = y1 * 10 / 3;\r\n                            y2 = y1 - dy2;\r\n                            y3 = y1 + dy2;\r\n                            y4 = b - y1;\r\n                            y5 = y4 - dy2;\r\n                            y6 = y4 + dy2;\r\n                            of2 = w * a2 / cnstVal3;\r\n                            dx2 = (of2 > 0) ? 0 : of2;\r\n                            x2 = l - dx2;\r\n                            dx8 = (of2 > 0) ? of2 : 0;\r\n                            x8 = r - dx8;\r\n                            dx3 = (dx2 + x8) / 6;\r\n                            x3 = x2 + dx3;\r\n                            dx4 = (dx2 + x8) / 3;\r\n                            x4 = x2 + dx4;\r\n                            x5 = (x2 + x8) / 2;\r\n                            x6 = x5 + dx3;\r\n                            x7 = (x6 + x8) / 2;\r\n                            x9 = l + dx8;\r\n                            x15 = r + dx2;\r\n                            x10 = x9 + dx3;\r\n                            x11 = x9 + dx4;\r\n                            x12 = (x9 + x15) / 2;\r\n                            x13 = x12 + dx3;\r\n                            x14 = (x13 + x15) / 2;\r\n\r\n                            d_val = \"M\" + x2 + \",\" + y1 +\r\n                                \" C\" + x3 + \",\" + y2 + \" \" + x4 + \",\" + y3 + \" \" + x5 + \",\" + y1 +\r\n                                \" C\" + x6 + \",\" + y2 + \" \" + x7 + \",\" + y3 + \" \" + x8 + \",\" + y1 +\r\n                                \" L\" + x15 + \",\" + y4 +\r\n                                \" C\" + x14 + \",\" + y6 + \" \" + x13 + \",\" + y5 + \" \" + x12 + \",\" + y4 +\r\n                                \" C\" + x11 + \",\" + y6 + \" \" + x10 + \",\" + y5 + \" \" + x9 + \",\" + y4 +\r\n                                \" z\";\r\n                        } else if (shapType == \"wave\") {\r\n                            var cnstVal5 = 20000 * 96 / 914400;\r\n                            var a1, a2, y1, dy2, y2, y3, y4, y5, y6, of2, dx2, x2, dx5, x5, dx3, x3, x4, x6, x10, x7, x8;\r\n                            a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal5) ? cnstVal5 : adj1;\r\n                            a2 = (adj2 < cnstVal2) ? cnstVal2 : (adj2 > cnstVal4) ? cnstVal4 : adj2;\r\n                            y1 = h * a1 / cnstVal4;\r\n                            dy2 = y1 * 10 / 3;\r\n                            y2 = y1 - dy2;\r\n                            y3 = y1 + dy2;\r\n                            y4 = b - y1;\r\n                            y5 = y4 - dy2;\r\n                            y6 = y4 + dy2;\r\n                            of2 = w * a2 / cnstVal3;\r\n                            dx2 = (of2 > 0) ? 0 : of2;\r\n                            x2 = l - dx2;\r\n                            dx5 = (of2 > 0) ? of2 : 0;\r\n                            x5 = r - dx5;\r\n                            dx3 = (dx2 + x5) / 3;\r\n                            x3 = x2 + dx3;\r\n                            x4 = (x3 + x5) / 2;\r\n                            x6 = l + dx5;\r\n                            x10 = r + dx2;\r\n                            x7 = x6 + dx3;\r\n                            x8 = (x7 + x10) / 2;\r\n\r\n                            d_val = \"M\" + x2 + \",\" + y1 +\r\n                                \" C\" + x3 + \",\" + y2 + \" \" + x4 + \",\" + y3 + \" \" + x5 + \",\" + y1 +\r\n                                \" L\" + x10 + \",\" + y4 +\r\n                                \" C\" + x8 + \",\" + y6 + \" \" + x7 + \",\" + y5 + \" \" + x6 + \",\" + y4 +\r\n                                \" z\";\r\n                        }\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"ellipseRibbon\":\r\n                    case \"ellipseRibbon2\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 12500 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 25000 * 96 / 914400;\r\n                        var cnstVal3 = 75000 * 96 / 914400;\r\n                        var cnstVal4 = 100000 * 96 / 914400;\r\n                        var cnstVal5 = 200000 * 96 / 914400;\r\n                        var hc = w / 2, t = 0, l = 0, b = h, r = w, wd8 = w / 8;\r\n                        var a1, a2, q10, q11, q12, minAdj3, a3, dx2, x2, x3, x4, x5, x6, dy1, f1, q1, q2,\r\n                            cx1, cx2, q1, dy3, q3, q4, q5, rh, q8, cx4, q9, cx5;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal4) ? cnstVal4 : adj1;\r\n                        a2 = (adj2 < cnstVal1) ? cnstVal1 : (adj2 > cnstVal3) ? cnstVal3 : adj2;\r\n                        q10 = cnstVal4 - a1;\r\n                        q11 = q10 / 2;\r\n                        q12 = a1 - q11;\r\n                        minAdj3 = (0 > q12) ? 0 : q12;\r\n                        a3 = (adj3 < minAdj3) ? minAdj3 : (adj3 > a1) ? a1 : adj3;\r\n                        dx2 = w * a2 / cnstVal5;\r\n                        x2 = hc - dx2;\r\n                        x3 = x2 + wd8;\r\n                        x4 = r - x3;\r\n                        x5 = r - x2;\r\n                        x6 = r - wd8;\r\n                        dy1 = h * a3 / cnstVal4;\r\n                        f1 = 4 * dy1 / w;\r\n                        q1 = x3 * x3 / w;\r\n                        q2 = x3 - q1;\r\n                        cx1 = x3 / 2;\r\n                        cx2 = r - cx1;\r\n                        q1 = h * a1 / cnstVal4;\r\n                        dy3 = q1 - dy1;\r\n                        q3 = x2 * x2 / w;\r\n                        q4 = x2 - q3;\r\n                        q5 = f1 * q4;\r\n                        rh = b - q1;\r\n                        q8 = dy1 * 14 / 16;\r\n                        cx4 = x2 / 2;\r\n                        q9 = f1 * cx4;\r\n                        cx5 = r - cx4;\r\n                        if (shapType == \"ellipseRibbon\") {\r\n                            var y1, cy1, y3, q6, q7, cy3, y2, y5, y6,\r\n                                cy4, cy6, y7, cy7, y8;\r\n                            y1 = f1 * q2;\r\n                            cy1 = f1 * cx1;\r\n                            y3 = q5 + dy3;\r\n                            q6 = dy1 + dy3 - y3;\r\n                            q7 = q6 + dy1;\r\n                            cy3 = q7 + dy3;\r\n                            y2 = (q8 + rh) / 2;\r\n                            y5 = q5 + rh;\r\n                            y6 = y3 + rh;\r\n                            cy4 = q9 + rh;\r\n                            cy6 = cy3 + rh;\r\n                            y7 = y1 + dy3;\r\n                            cy7 = q1 + q1 - y7;\r\n                            y8 = b - dy1;\r\n                            //\r\n                            d_val = \"M\" + l + \",\" + t +\r\n                                \" Q\" + cx1 + \",\" + cy1 + \" \" + x3 + \",\" + y1 +\r\n                                \" L\" + x2 + \",\" + y3 +\r\n                                \" Q\" + hc + \",\" + cy3 + \" \" + x5 + \",\" + y3 +\r\n                                \" L\" + x4 + \",\" + y1 +\r\n                                \" Q\" + cx2 + \",\" + cy1 + \" \" + r + \",\" + t +\r\n                                \" L\" + x6 + \",\" + y2 +\r\n                                \" L\" + r + \",\" + rh +\r\n                                \" Q\" + cx5 + \",\" + cy4 + \" \" + x5 + \",\" + y5 +\r\n                                \" L\" + x5 + \",\" + y6 +\r\n                                \" Q\" + hc + \",\" + cy6 + \" \" + x2 + \",\" + y6 +\r\n                                \" L\" + x2 + \",\" + y5 +\r\n                                \" Q\" + cx4 + \",\" + cy4 + \" \" + l + \",\" + rh +\r\n                                \" L\" + wd8 + \",\" + y2 +\r\n                                \" z\" +\r\n                                \"M\" + x2 + \",\" + y5 +\r\n                                \" L\" + x2 + \",\" + y3 +\r\n                                \"M\" + x5 + \",\" + y3 +\r\n                                \" L\" + x5 + \",\" + y5 +\r\n                                \"M\" + x3 + \",\" + y1 +\r\n                                \" L\" + x3 + \",\" + y7 +\r\n                                \"M\" + x4 + \",\" + y7 +\r\n                                \" L\" + x4 + \",\" + y1;\r\n                        } else if (shapType == \"ellipseRibbon2\") {\r\n                            var u1, y1, cu1, cy1, q3, q5, u3, y3, q6, q7, cu3, cy3, rh, q8, u2, y2,\r\n                                u5, y5, u6, y6, cu4, cy4, cu6, cy6, u7, y7, cu7, cy7;\r\n                            u1 = f1 * q2;\r\n                            y1 = b - u1;\r\n                            cu1 = f1 * cx1;\r\n                            cy1 = b - cu1;\r\n                            u3 = q5 + dy3;\r\n                            y3 = b - u3;\r\n                            q6 = dy1 + dy3 - u3;\r\n                            q7 = q6 + dy1;\r\n                            cu3 = q7 + dy3;\r\n                            cy3 = b - cu3;\r\n                            u2 = (q8 + rh) / 2;\r\n                            y2 = b - u2;\r\n                            u5 = q5 + rh;\r\n                            y5 = b - u5;\r\n                            u6 = u3 + rh;\r\n                            y6 = b - u6;\r\n                            cu4 = q9 + rh;\r\n                            cy4 = b - cu4;\r\n                            cu6 = cu3 + rh;\r\n                            cy6 = b - cu6;\r\n                            u7 = u1 + dy3;\r\n                            y7 = b - u7;\r\n                            cu7 = q1 + q1 - u7;\r\n                            cy7 = b - cu7;\r\n                            //\r\n                            d_val = \"M\" + l + \",\" + b +\r\n                                \" L\" + wd8 + \",\" + y2 +\r\n                                \" L\" + l + \",\" + q1 +\r\n                                \" Q\" + cx4 + \",\" + cy4 + \" \" + x2 + \",\" + y5 +\r\n                                \" L\" + x2 + \",\" + y6 +\r\n                                \" Q\" + hc + \",\" + cy6 + \" \" + x5 + \",\" + y6 +\r\n                                \" L\" + x5 + \",\" + y5 +\r\n                                \" Q\" + cx5 + \",\" + cy4 + \" \" + r + \",\" + q1 +\r\n                                \" L\" + x6 + \",\" + y2 +\r\n                                \" L\" + r + \",\" + b +\r\n                                \" Q\" + cx2 + \",\" + cy1 + \" \" + x4 + \",\" + y1 +\r\n                                \" L\" + x5 + \",\" + y3 +\r\n                                \" Q\" + hc + \",\" + cy3 + \" \" + x2 + \",\" + y3 +\r\n                                \" L\" + x3 + \",\" + y1 +\r\n                                \" Q\" + cx1 + \",\" + cy1 + \" \" + l + \",\" + b +\r\n                                \" z\" +\r\n                                \"M\" + x2 + \",\" + y3 +\r\n                                \" L\" + x2 + \",\" + y5 +\r\n                                \"M\" + x5 + \",\" + y5 +\r\n                                \" L\" + x5 + \",\" + y3 +\r\n                                \"M\" + x3 + \",\" + y7 +\r\n                                \" L\" + x3 + \",\" + y1 +\r\n                                \"M\" + x4 + \",\" + y1 +\r\n                                \" L\" + x4 + \",\" + y7;\r\n                        }\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"line\":\r\n                    case \"straightConnector1\":\r\n                    case \"bentConnector4\":\r\n                    case \"bentConnector5\":\r\n                    case \"curvedConnector2\":\r\n                    case \"curvedConnector3\":\r\n                    case \"curvedConnector4\":\r\n                    case \"curvedConnector5\":\r\n                        if (isFlipV) {\r\n                            result += \"<line x1='\" + w + \"' y1='0' x2='0' y2='\" + h + \"' stroke='\" + border.color +\r\n                                \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' \";\r\n                        } else {\r\n                            result += \"<line x1='0' y1='0' x2='\" + w + \"' y2='\" + h + \"' stroke='\" + border.color +\r\n                                \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' \";\r\n                        }\r\n                        if (headEndNodeAttrs !== undefined && (headEndNodeAttrs[\"type\"] === \"triangle\" || headEndNodeAttrs[\"type\"] === \"arrow\")) {\r\n                            result += \"marker-start='url(#markerTriangle_\" + shpId + \")' \";\r\n                        }\r\n                        if (tailEndNodeAttrs !== undefined && (tailEndNodeAttrs[\"type\"] === \"triangle\" || tailEndNodeAttrs[\"type\"] === \"arrow\")) {\r\n                            result += \"marker-end='url(#markerTriangle_\" + shpId + \")' \";\r\n                        }\r\n                        result += \"/>\";\r\n                        break;\r\n                    case \"rightArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 0.25;//0.5;\r\n                        var sAdj2, sAdj2_val = 0.5;\r\n                        var max_sAdj2_const = w / h;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = 0.5 - (parseInt(sAdj1.substr(4)) / 200000);\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    var sAdj2_val2 = parseInt(sAdj2.substr(4)) / 100000;\r\n                                    sAdj2_val = 1 - ((sAdj2_val2) / max_sAdj2_const);\r\n                                }\r\n                            }\r\n                        }\r\n                        //console.log(\"w: \"+w+\"\\nh: \"+h+\"\\nsAdj1: \"+sAdj1_val+\"\\nsAdj2: \"+sAdj2_val);\r\n\r\n                        result += \" <polygon points='\" + w + \" \" + h / 2 + \",\" + sAdj2_val * w + \" 0,\" + sAdj2_val * w + \" \" + sAdj1_val * h + \",0 \" + sAdj1_val * h +\r\n                            \",0 \" + (1 - sAdj1_val) * h + \",\" + sAdj2_val * w + \" \" + (1 - sAdj1_val) * h + \", \" + sAdj2_val * w + \" \" + h + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"leftArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 0.25;//0.5;\r\n                        var sAdj2, sAdj2_val = 0.5;\r\n                        var max_sAdj2_const = w / h;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = 0.5 - (parseInt(sAdj1.substr(4)) / 200000);\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    var sAdj2_val2 = parseInt(sAdj2.substr(4)) / 100000;\r\n                                    sAdj2_val = (sAdj2_val2) / max_sAdj2_const;\r\n                                }\r\n                            }\r\n                        }\r\n                        //console.log(\"w: \"+w+\"\\nh: \"+h+\"\\nsAdj1: \"+sAdj1_val+\"\\nsAdj2: \"+sAdj2_val);\r\n\r\n                        result += \" <polygon points='0 \" + h / 2 + \",\" + sAdj2_val * w + \" \" + h + \",\" + sAdj2_val * w + \" \" + (1 - sAdj1_val) * h + \",\" + w + \" \" + (1 - sAdj1_val) * h +\r\n                            \",\" + w + \" \" + sAdj1_val * h + \",\" + sAdj2_val * w + \" \" + sAdj1_val * h + \", \" + sAdj2_val * w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"downArrow\":\r\n                    case \"flowChartOffpageConnector\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 0.25;//0.5;\r\n                        var sAdj2, sAdj2_val = 0.5;\r\n                        var max_sAdj2_const = h / w;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = parseInt(sAdj1.substr(4)) / 200000;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    var sAdj2_val2 = parseInt(sAdj2.substr(4)) / 100000;\r\n                                    sAdj2_val = (sAdj2_val2) / max_sAdj2_const;\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        if (shapType == \"flowChartOffpageConnector\") {\r\n                            sAdj1_val = 0.5;\r\n                            sAdj2_val = 0.212;\r\n                        }\r\n                        result += \" <polygon points='\" + (0.5 - sAdj1_val) * w + \" 0,\" + (0.5 - sAdj1_val) * w + \" \" + (1 - sAdj2_val) * h + \",0 \" + (1 - sAdj2_val) * h + \",\" + (w / 2) + \" \" + h +\r\n                            \",\" + w + \" \" + (1 - sAdj2_val) * h + \",\" + (0.5 + sAdj1_val) * w + \" \" + (1 - sAdj2_val) * h + \", \" + (0.5 + sAdj1_val) * w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"upArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 0.25;//0.5;\r\n                        var sAdj2, sAdj2_val = 0.5;\r\n                        var max_sAdj2_const = h / w;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = parseInt(sAdj1.substr(4)) / 200000;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    var sAdj2_val2 = parseInt(sAdj2.substr(4)) / 100000;\r\n                                    sAdj2_val = (sAdj2_val2) / max_sAdj2_const;\r\n                                }\r\n                            }\r\n                        }\r\n                        result += \" <polygon points='\" + (w / 2) + \" 0,0 \" + sAdj2_val * h + \",\" + (0.5 - sAdj1_val) * w + \" \" + sAdj2_val * h + \",\" + (0.5 - sAdj1_val) * w + \" \" + h +\r\n                            \",\" + (0.5 + sAdj1_val) * w + \" \" + h + \",\" + (0.5 + sAdj1_val) * w + \" \" + sAdj2_val * h + \", \" + w + \" \" + sAdj2_val * h + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"leftRightArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 0.25;\r\n                        var sAdj2, sAdj2_val = 0.25;\r\n                        var max_sAdj2_const = w / h;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = 0.5 - (parseInt(sAdj1.substr(4)) / 200000);\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    var sAdj2_val2 = parseInt(sAdj2.substr(4)) / 100000;\r\n                                    sAdj2_val = (sAdj2_val2) / max_sAdj2_const;\r\n                                }\r\n                            }\r\n                        }\r\n                        //console.log(\"w: \"+w+\"\\nh: \"+h+\"\\nsAdj1: \"+sAdj1_val+\"\\nsAdj2: \"+sAdj2_val);\r\n\r\n                        result += \" <polygon points='0 \" + h / 2 + \",\" + sAdj2_val * w + \" \" + h + \",\" + sAdj2_val * w + \" \" + (1 - sAdj1_val) * h + \",\" + (1 - sAdj2_val) * w + \" \" + (1 - sAdj1_val) * h +\r\n                            \",\" + (1 - sAdj2_val) * w + \" \" + h + \",\" + w + \" \" + h / 2 + \", \" + (1 - sAdj2_val) * w + \" 0,\" + (1 - sAdj2_val) * w + \" \" + sAdj1_val * h + \",\" +\r\n                            sAdj2_val * w + \" \" + sAdj1_val * h + \",\" + sAdj2_val * w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"upDownArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 0.25;\r\n                        var sAdj2, sAdj2_val = 0.25;\r\n                        var max_sAdj2_const = h / w;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = 0.5 - (parseInt(sAdj1.substr(4)) / 200000);\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    var sAdj2_val2 = parseInt(sAdj2.substr(4)) / 100000;\r\n                                    sAdj2_val = (sAdj2_val2) / max_sAdj2_const;\r\n                                }\r\n                            }\r\n                        }\r\n                        //console.log(\"w: \"+w+\"\\nh: \"+h+\"\\nsAdj1: \"+sAdj1_val+\"\\nsAdj2: \"+sAdj2_val);\r\n\r\n                        result += \" <polygon points='\" + w / 2 + \" 0,0 \" + sAdj2_val * h + \",\" + sAdj1_val * w + \" \" + sAdj2_val * h + \",\" + sAdj1_val * w + \" \" + (1 - sAdj2_val) * h +\r\n                            \",0 \" + (1 - sAdj2_val) * h + \",\" + w / 2 + \" \" + h + \", \" + w + \" \" + (1 - sAdj2_val) * h + \",\" + (1 - sAdj1_val) * w + \" \" + (1 - sAdj2_val) * h + \",\" +\r\n                            (1 - sAdj1_val) * w + \" \" + sAdj2_val * h + \",\" + w + \" \" + sAdj2_val * h + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"quadArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 22500 * 96 / 914400;\r\n                        var sAdj2, adj2 = 22500 * 96 / 914400;\r\n                        var sAdj3, adj3 = 22500 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, a1, a2, a3, q1, x1, x2, dx2, x3, dx3, x4, x5, x6, y2, y3, y4, y5, y6, maxAdj1, maxAdj3;\r\n                        var minWH = Math.min(w, h);\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > cnstVal1) a2 = cnstVal1\r\n                        else a2 = adj2\r\n                        maxAdj1 = 2 * a2;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > maxAdj1) a1 = maxAdj1\r\n                        else a1 = adj1\r\n                        q1 = cnstVal2 - maxAdj1;\r\n                        maxAdj3 = q1 / 2;\r\n                        if (adj3 < 0) a3 = 0\r\n                        else if (adj3 > maxAdj3) a3 = maxAdj3\r\n                        else a3 = adj3\r\n                        x1 = minWH * a3 / cnstVal2;\r\n                        dx2 = minWH * a2 / cnstVal2;\r\n                        x2 = hc - dx2;\r\n                        x5 = hc + dx2;\r\n                        dx3 = minWH * a1 / cnstVal3;\r\n                        x3 = hc - dx3;\r\n                        x4 = hc + dx3;\r\n                        x6 = w - x1;\r\n                        y2 = vc - dx2;\r\n                        y5 = vc + dx2;\r\n                        y3 = vc - dx3;\r\n                        y4 = vc + dx3;\r\n                        y6 = h - x1;\r\n                        var d_val = \"M\" + 0 + \",\" + vc +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" L\" + x1 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + x1 +\r\n                            \" L\" + x2 + \",\" + x1 +\r\n                            \" L\" + hc + \",\" + 0 +\r\n                            \" L\" + x5 + \",\" + x1 +\r\n                            \" L\" + x4 + \",\" + x1 +\r\n                            \" L\" + x4 + \",\" + y3 +\r\n                            \" L\" + x6 + \",\" + y3 +\r\n                            \" L\" + x6 + \",\" + y2 +\r\n                            \" L\" + w + \",\" + vc +\r\n                            \" L\" + x6 + \",\" + y5 +\r\n                            \" L\" + x6 + \",\" + y4 +\r\n                            \" L\" + x4 + \",\" + y4 +\r\n                            \" L\" + x4 + \",\" + y6 +\r\n                            \" L\" + x5 + \",\" + y6 +\r\n                            \" L\" + hc + \",\" + h +\r\n                            \" L\" + x2 + \",\" + y6 +\r\n                            \" L\" + x3 + \",\" + y6 +\r\n                            \" L\" + x3 + \",\" + y4 +\r\n                            \" L\" + x1 + \",\" + y4 +\r\n                            \" L\" + x1 + \",\" + y5 + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"leftRightUpArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, a1, a2, a3, q1, x1, x2, dx2, x3, dx3, x4, x5, x6, y2, dy2, y3, y4, y5, maxAdj1, maxAdj3;\r\n                        var minWH = Math.min(w, h);\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > cnstVal1) a2 = cnstVal1\r\n                        else a2 = adj2\r\n                        maxAdj1 = 2 * a2;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > maxAdj1) a1 = maxAdj1\r\n                        else a1 = adj1\r\n                        q1 = cnstVal2 - maxAdj1;\r\n                        maxAdj3 = q1 / 2;\r\n                        if (adj3 < 0) a3 = 0\r\n                        else if (adj3 > maxAdj3) a3 = maxAdj3\r\n                        else a3 = adj3\r\n                        x1 = minWH * a3 / cnstVal2;\r\n                        dx2 = minWH * a2 / cnstVal2;\r\n                        x2 = hc - dx2;\r\n                        x5 = hc + dx2;\r\n                        dx3 = minWH * a1 / cnstVal3;\r\n                        x3 = hc - dx3;\r\n                        x4 = hc + dx3;\r\n                        x6 = w - x1;\r\n                        dy2 = minWH * a2 / cnstVal1;\r\n                        y2 = h - dy2;\r\n                        y4 = h - dx2;\r\n                        y3 = y4 - dx3;\r\n                        y5 = y4 + dx3;\r\n                        var d_val = \"M\" + 0 + \",\" + y4 +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" L\" + x1 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + x1 +\r\n                            \" L\" + x2 + \",\" + x1 +\r\n                            \" L\" + hc + \",\" + 0 +\r\n                            \" L\" + x5 + \",\" + x1 +\r\n                            \" L\" + x4 + \",\" + x1 +\r\n                            \" L\" + x4 + \",\" + y3 +\r\n                            \" L\" + x6 + \",\" + y3 +\r\n                            \" L\" + x6 + \",\" + y2 +\r\n                            \" L\" + w + \",\" + y4 +\r\n                            \" L\" + x6 + \",\" + h +\r\n                            \" L\" + x6 + \",\" + y5 +\r\n                            \" L\" + x1 + \",\" + y5 +\r\n                            \" L\" + x1 + \",\" + h + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"leftUpArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, a1, a2, a3, x1, x2, dx4, dx3, x3, x4, x5, y2, y3, y4, y5, maxAdj1, maxAdj3;\r\n                        var minWH = Math.min(w, h);\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > cnstVal1) a2 = cnstVal1\r\n                        else a2 = adj2\r\n                        maxAdj1 = 2 * a2;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > maxAdj1) a1 = maxAdj1\r\n                        else a1 = adj1\r\n                        maxAdj3 = cnstVal2 - maxAdj1;\r\n                        if (adj3 < 0) a3 = 0\r\n                        else if (adj3 > maxAdj3) a3 = maxAdj3\r\n                        else a3 = adj3\r\n                        x1 = minWH * a3 / cnstVal2;\r\n                        dx2 = minWH * a2 / cnstVal1;\r\n                        x2 = w - dx2;\r\n                        y2 = h - dx2;\r\n                        dx4 = minWH * a2 / cnstVal2;\r\n                        x4 = w - dx4;\r\n                        y4 = h - dx4;\r\n                        dx3 = minWH * a1 / cnstVal3;\r\n                        x3 = x4 - dx3;\r\n                        x5 = x4 + dx3;\r\n                        y3 = y4 - dx3;\r\n                        y5 = y4 + dx3;\r\n                        var d_val = \"M\" + 0 + \",\" + y4 +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" L\" + x1 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + x1 +\r\n                            \" L\" + x2 + \",\" + x1 +\r\n                            \" L\" + x4 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + x1 +\r\n                            \" L\" + x5 + \",\" + x1 +\r\n                            \" L\" + x5 + \",\" + y5 +\r\n                            \" L\" + x1 + \",\" + y5 +\r\n                            \" L\" + x1 + \",\" + h + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"bentUpArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, a1, a2, a3, dx1, x1, dx2, x2, dx3, x3, x4, y1, y2, dy2;\r\n                        var minWH = Math.min(w, h);\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > cnstVal1) a1 = cnstVal1\r\n                        else a1 = adj1\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > cnstVal1) a2 = cnstVal1\r\n                        else a2 = adj2\r\n                        if (adj3 < 0) a3 = 0\r\n                        else if (adj3 > maxAdj3) a3 = maxAdj3\r\n                        else a3 = adj3\r\n                        y1 = minWH * a3 / cnstVal2;\r\n                        dx1 = minWH * a2 / cnstVal1;\r\n                        x1 = w - dx1;\r\n                        dx3 = minWH * a2 / cnstVal2;\r\n                        x3 = w - dx3;\r\n                        dx2 = minWH * a1 / cnstVal3;\r\n                        x2 = x3 - dx2;\r\n                        x4 = x3 + dx2;\r\n                        dy2 = minWH * a1 / cnstVal2;\r\n                        y2 = h - dy2;\r\n                        var d_val = \"M\" + 0 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + y1 +\r\n                            \" L\" + x1 + \",\" + y1 +\r\n                            \" L\" + x3 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + y1 +\r\n                            \" L\" + x4 + \",\" + y1 +\r\n                            \" L\" + x4 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"bentArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var sAdj4, adj4 = 43750 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var a1, a2, a3, a4, x3, x4, y3, y4, y5, y6, maxAdj1, maxAdj4;\r\n                        var minWH = Math.min(w, h);\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > cnstVal1) a2 = cnstVal1\r\n                        else a2 = adj2\r\n                        maxAdj1 = 2 * a2;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > maxAdj1) a1 = maxAdj1\r\n                        else a1 = adj1\r\n                        if (adj3 < 0) a3 = 0\r\n                        else if (adj3 > cnstVal1) a3 = cnstVal1\r\n                        else a3 = adj3\r\n                        var th, aw2, th2, dh2, ah, bw, bh, bs, bd, bd3, bd2,\r\n                            th = minWH * a1 / cnstVal2;\r\n                        aw2 = minWH * a2 / cnstVal2;\r\n                        th2 = th / 2;\r\n                        dh2 = aw2 - th2;\r\n                        ah = minWH * a3 / cnstVal2;\r\n                        bw = w - ah;\r\n                        bh = h - dh2;\r\n                        bs = (bw < bh) ? bw : bh;\r\n                        maxAdj4 = cnstVal2 * bs / minWH;\r\n                        if (adj4 < 0) a4 = 0\r\n                        else if (adj4 > maxAdj4) a4 = maxAdj4\r\n                        else a4 = adj4\r\n                        bd = minWH * a4 / cnstVal2;\r\n                        bd3 = bd - th;\r\n                        bd2 = (bd3 > 0) ? bd3 : 0;\r\n                        x3 = th + bd2;\r\n                        x4 = w - ah;\r\n                        y3 = dh2 + th;\r\n                        y4 = y3 + dh2;\r\n                        y5 = dh2 + bd;\r\n                        y6 = y3 + bd2;\r\n\r\n                        var d_val = \"M\" + 0 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + y5 +\r\n                            shapeArc(bd, y5, bd, bd, 180, 270, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x4 + \",\" + dh2 +\r\n                            \" L\" + x4 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + aw2 +\r\n                            \" L\" + x4 + \",\" + y4 +\r\n                            \" L\" + x4 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + y3 +\r\n                            shapeArc(x3, y6, bd2, bd2, 270, 180, false).replace(\"M\", \"L\") +\r\n                            \" L\" + th + \",\" + h + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"uturnArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var sAdj4, adj4 = 43750 * 96 / 914400;\r\n                        var sAdj5, adj5 = 75000 * 96 / 914400;\r\n                        var cnstVal1 = 25000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj5\") {\r\n                                    sAdj5 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj5 = parseInt(sAdj5.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var a1, a2, a3, a4, a5, q1, q2, q3, x3, x4, x5, x6, x7, x8, x9, y4, y5, minAdj5, maxAdj1, maxAdj3, maxAdj4;\r\n                        var minWH = Math.min(w, h);\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > cnstVal1) a2 = cnstVal1\r\n                        else a2 = adj2\r\n                        maxAdj1 = 2 * a2;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > maxAdj1) a1 = maxAdj1\r\n                        else a1 = adj1\r\n                        q2 = a1 * minWH / h;\r\n                        q3 = cnstVal2 - q2;\r\n                        maxAdj3 = q3 * h / minWH;\r\n                        if (adj3 < 0) a3 = 0\r\n                        else if (adj3 > maxAdj3) a3 = maxAdj3\r\n                        else a3 = adj3\r\n                        q1 = a3 + a1;\r\n                        minAdj5 = q1 * minWH / h;\r\n                        if (adj5 < minAdj5) a5 = minAdj5\r\n                        else if (adj5 > cnstVal2) a5 = cnstVal2\r\n                        else a5 = adj5\r\n\r\n                        var th, aw2, th2, dh2, ah, bw, bs, bd, bd3, bd2,\r\n                            th = minWH * a1 / cnstVal2;\r\n                        aw2 = minWH * a2 / cnstVal2;\r\n                        th2 = th / 2;\r\n                        dh2 = aw2 - th2;\r\n                        y5 = h * a5 / cnstVal2;\r\n                        ah = minWH * a3 / cnstVal2;\r\n                        y4 = y5 - ah;\r\n                        x9 = w - dh2;\r\n                        bw = x9 / 2;\r\n                        bs = (bw < y4) ? bw : y4;\r\n                        maxAdj4 = cnstVal2 * bs / minWH;\r\n                        if (adj4 < 0) a4 = 0\r\n                        else if (adj4 > maxAdj4) a4 = maxAdj4\r\n                        else a4 = adj4\r\n                        bd = minWH * a4 / cnstVal2;\r\n                        bd3 = bd - th;\r\n                        bd2 = (bd3 > 0) ? bd3 : 0;\r\n                        x3 = th + bd2;\r\n                        x8 = w - aw2;\r\n                        x6 = x8 - aw2;\r\n                        x7 = x6 + dh2;\r\n                        x4 = x9 - bd;\r\n                        x5 = x7 - bd2;\r\n                        cx = (th + x7) / 2\r\n                        var cy = (y4 + th) / 2\r\n                        var d_val = \"M\" + 0 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + bd +\r\n                            shapeArc(bd, bd, bd, bd, 180, 270, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x4 + \",\" + 0 +\r\n                            shapeArc(x4, bd, bd, bd, 270, 360, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x9 + \",\" + y4 +\r\n                            \" L\" + w + \",\" + y4 +\r\n                            \" L\" + x8 + \",\" + y5 +\r\n                            \" L\" + x6 + \",\" + y4 +\r\n                            \" L\" + x7 + \",\" + y4 +\r\n                            \" L\" + x7 + \",\" + x3 +\r\n                            shapeArc(x5, x3, bd2, bd2, 0, -90, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x3 + \",\" + th +\r\n                            shapeArc(x3, x3, bd2, bd2, 270, 180, false).replace(\"M\", \"L\") +\r\n                            \" L\" + th + \",\" + h + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"stripedRightArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 50000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var cnstVal1 = 100000 * 96 / 914400;\r\n                        var cnstVal2 = 200000 * 96 / 914400;\r\n                        var cnstVal3 = 84375 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var a1, a2, x4, x5, dx5, x6, dx6, y1, dy1, y2, maxAdj2, vc = h / 2;\r\n                        var minWH = Math.min(w, h);\r\n                        maxAdj2 = cnstVal3 * w / minWH;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > cnstVal1) a1 = cnstVal1\r\n                        else a1 = adj1\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > maxAdj2) a2 = maxAdj2\r\n                        else a2 = adj2\r\n                        x4 = minWH * 5 / 32;\r\n                        dx5 = minWH * a2 / cnstVal1;\r\n                        x5 = w - dx5;\r\n                        dy1 = h * a1 / cnstVal2;\r\n                        y1 = vc - dy1;\r\n                        y2 = vc + dy1;\r\n                        //dx6 = dy1*dx5/hd2;\r\n                        //x6 = w-dx6;\r\n                        var ssd8 = minWH / 8,\r\n                            ssd16 = minWH / 16,\r\n                            ssd32 = minWH / 32;\r\n                        var d_val = \"M\" + 0 + \",\" + y1 +\r\n                            \" L\" + ssd32 + \",\" + y1 +\r\n                            \" L\" + ssd32 + \",\" + y2 +\r\n                            \" L\" + 0 + \",\" + y2 + \" z\" +\r\n                            \" M\" + ssd16 + \",\" + y1 +\r\n                            \" L\" + ssd8 + \",\" + y1 +\r\n                            \" L\" + ssd8 + \",\" + y2 +\r\n                            \" L\" + ssd16 + \",\" + y2 + \" z\" +\r\n                            \" M\" + x4 + \",\" + y1 +\r\n                            \" L\" + x5 + \",\" + y1 +\r\n                            \" L\" + x5 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + vc +\r\n                            \" L\" + x5 + \",\" + h +\r\n                            \" L\" + x5 + \",\" + y2 +\r\n                            \" L\" + x4 + \",\" + y2 + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"notchedRightArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 50000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var cnstVal1 = 100000 * 96 / 914400;\r\n                        var cnstVal2 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var a1, a2, x1, x2, dx2, y1, dy1, y2, maxAdj2, vc = h / 2, hd2 = vc;\r\n                        var minWH = Math.min(w, h);\r\n                        maxAdj2 = cnstVal1 * w / minWH;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > cnstVal1) a1 = cnstVal1\r\n                        else a1 = adj1\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > maxAdj2) a2 = maxAdj2\r\n                        else a2 = adj2\r\n                        dx2 = minWH * a2 / cnstVal1;\r\n                        x2 = w - dx2;\r\n                        dy1 = h * a1 / cnstVal2;\r\n                        y1 = vc - dy1;\r\n                        y2 = vc + dy1;\r\n                        x1 = dy1 * dx2 / hd2;\r\n                        var d_val = \"M\" + 0 + \",\" + y1 +\r\n                            \" L\" + x2 + \",\" + y1 +\r\n                            \" L\" + x2 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + vc +\r\n                            \" L\" + x2 + \",\" + h +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + 0 + \",\" + y2 +\r\n                            \" L\" + x1 + \",\" + vc + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"homePlate\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 50000 * 96 / 914400;\r\n                        var cnstVal1 = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var a, x1, dx1, maxAdj, vc = h / 2;\r\n                        var minWH = Math.min(w, h);\r\n                        maxAdj = cnstVal1 * w / minWH;\r\n                        if (adj < 0) a = 0\r\n                        else if (adj > maxAdj) a = maxAdj\r\n                        else a = adj\r\n                        dx1 = minWH * a / cnstVal1;\r\n                        x1 = w - dx1;\r\n                        var d_val = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + x1 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + vc +\r\n                            \" L\" + x1 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h + \" z\";\r\n\r\n                        result += \"<path  d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"chevron\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 50000 * 96 / 914400;\r\n                        var cnstVal1 = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var a, x1, dx1, x2, maxAdj, vc = h / 2;\r\n                        var minWH = Math.min(w, h);\r\n                        maxAdj = cnstVal1 * w / minWH;\r\n                        if (adj < 0) a = 0\r\n                        else if (adj > maxAdj) a = maxAdj\r\n                        else a = adj\r\n                        x1 = minWH * a / cnstVal1;\r\n                        x2 = w - x1;\r\n                        var d_val = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + x2 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + vc +\r\n                            \" L\" + x2 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" L\" + x1 + \",\" + vc + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n\r\n                        break;\r\n                    case \"rightArrowCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var sAdj4, adj4 = 64977 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var maxAdj2, a2, maxAdj1, a1, maxAdj3, a3, q2, maxAdj4, a4, dy1, dy2, y1, y2, y3, y4, dx3, x3, x2, x1;\r\n                        var vc = h / 2, r = w, b = h, l = 0, t = 0;\r\n                        var ss = Math.min(w, h);\r\n                        maxAdj2 = cnstVal1 * h / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        maxAdj1 = a2 * 2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        maxAdj3 = cnstVal2 * w / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        q2 = a3 * ss / w;\r\n                        maxAdj4 = cnstVal - q2;\r\n                        a4 = (adj4 < 0) ? 0 : (adj4 > maxAdj4) ? maxAdj4 : adj4;\r\n                        dy1 = ss * a2 / cnstVal2;\r\n                        dy2 = ss * a1 / cnstVal3;\r\n                        y1 = vc - dy1;\r\n                        y2 = vc - dy2;\r\n                        y3 = vc + dy2;\r\n                        y4 = vc + dy1;\r\n                        dx3 = ss * a3 / cnstVal2;\r\n                        x3 = r - dx3;\r\n                        x2 = w * a4 / cnstVal2;\r\n                        x1 = x2 / 2;\r\n                        var d_val = \"M\" + l + \",\" + t +\r\n                            \" L\" + x2 + \",\" + t +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + x3 + \",\" + y2 +\r\n                            \" L\" + x3 + \",\" + y1 +\r\n                            \" L\" + r + \",\" + vc +\r\n                            \" L\" + x3 + \",\" + y4 +\r\n                            \" L\" + x3 + \",\" + y3 +\r\n                            \" L\" + x2 + \",\" + y3 +\r\n                            \" L\" + x2 + \",\" + b +\r\n                            \" L\" + l + \",\" + b +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"downArrowCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var sAdj4, adj4 = 64977 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var maxAdj2, a2, maxAdj1, a1, maxAdj3, a3, q2, maxAdj4, a4, dx1, dx2, x1, x2, x3, x4, dy3, y3, y2, y1;\r\n                        var hc = w / 2, r = w, b = h, l = 0, t = 0;\r\n                        var ss = Math.min(w, h);\r\n\r\n                        maxAdj2 = cnstVal1 * w / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        maxAdj1 = a2 * 2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        maxAdj3 = cnstVal2 * h / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        q2 = a3 * ss / h;\r\n                        maxAdj4 = cnstVal2 - q2;\r\n                        a4 = (adj4 < 0) ? 0 : (adj4 > maxAdj4) ? maxAdj4 : adj4;\r\n                        dx1 = ss * a2 / cnstVal2;\r\n                        dx2 = ss * a1 / cnstVal3;\r\n                        x1 = hc - dx1;\r\n                        x2 = hc - dx2;\r\n                        x3 = hc + dx2;\r\n                        x4 = hc + dx1;\r\n                        dy3 = ss * a3 / cnstVal2;\r\n                        y3 = b - dy3;\r\n                        y2 = h * a4 / cnstVal2;\r\n                        y1 = y2 / 2;\r\n                        var d_val = \"M\" + l + \",\" + t +\r\n                            \" L\" + r + \",\" + t +\r\n                            \" L\" + r + \",\" + y2 +\r\n                            \" L\" + x3 + \",\" + y2 +\r\n                            \" L\" + x3 + \",\" + y3 +\r\n                            \" L\" + x4 + \",\" + y3 +\r\n                            \" L\" + hc + \",\" + b +\r\n                            \" L\" + x1 + \",\" + y3 +\r\n                            \" L\" + x2 + \",\" + y3 +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + l + \",\" + y2 +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"leftArrowCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var sAdj4, adj4 = 64977 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var maxAdj2, a2, maxAdj1, a1, maxAdj3, a3, q2, maxAdj4, a4, dy1, dy2, y1, y2, y3, y4, x1, dx2, x2, x3;\r\n                        var vc = h / 2, r = w, b = h, l = 0, t = 0;\r\n                        var ss = Math.min(w, h);\r\n\r\n                        maxAdj2 = cnstVal1 * h / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        maxAdj1 = a2 * 2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        maxAdj3 = cnstVal2 * w / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        q2 = a3 * ss / w;\r\n                        maxAdj4 = cnstVal2 - q2;\r\n                        a4 = (adj4 < 0) ? 0 : (adj4 > maxAdj4) ? maxAdj4 : adj4;\r\n                        dy1 = ss * a2 / cnstVal2;\r\n                        dy2 = ss * a1 / cnstVal3;\r\n                        y1 = vc - dy1;\r\n                        y2 = vc - dy2;\r\n                        y3 = vc + dy2;\r\n                        y4 = vc + dy1;\r\n                        x1 = ss * a3 / cnstVal2;\r\n                        dx2 = w * a4 / cnstVal2;\r\n                        x2 = r - dx2;\r\n                        x3 = (x2 + r) / 2;\r\n                        var d_val = \"M\" + l + \",\" + vc +\r\n                            \" L\" + x1 + \",\" + y1 +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + t +\r\n                            \" L\" + r + \",\" + t +\r\n                            \" L\" + r + \",\" + b +\r\n                            \" L\" + x2 + \",\" + b +\r\n                            \" L\" + x2 + \",\" + y3 +\r\n                            \" L\" + x1 + \",\" + y3 +\r\n                            \" L\" + x1 + \",\" + y4 +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"upArrowCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var sAdj4, adj4 = 64977 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var maxAdj2, a2, maxAdj1, a1, maxAdj3, a3, q2, maxAdj4, a4, dx1, dx2, x1, x2, x3, x4, y1, dy2, y2, y3;\r\n                        var hc = w / 2, r = w, b = h, l = 0, t = 0;\r\n                        var ss = Math.min(w, h);\r\n                        maxAdj2 = cnstVal1 * w / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        maxAdj1 = a2 * 2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        maxAdj3 = cnstVal2 * h / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        q2 = a3 * ss / h;\r\n                        maxAdj4 = cnstVal2 - q2;\r\n                        a4 = (adj4 < 0) ? 0 : (adj4 > maxAdj4) ? maxAdj4 : adj4;\r\n                        dx1 = ss * a2 / cnstVal2;\r\n                        dx2 = ss * a1 / cnstVal3;\r\n                        x1 = hc - dx1;\r\n                        x2 = hc - dx2;\r\n                        x3 = hc + dx2;\r\n                        x4 = hc + dx1;\r\n                        y1 = ss * a3 / cnstVal2;\r\n                        dy2 = h * a4 / cnstVal2;\r\n                        y2 = b - dy2;\r\n                        y3 = (y2 + b) / 2;\r\n\r\n                        var d_val = \"M\" + l + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + y1 +\r\n                            \" L\" + x1 + \",\" + y1 +\r\n                            \" L\" + hc + \",\" + t +\r\n                            \" L\" + x4 + \",\" + y1 +\r\n                            \" L\" + x3 + \",\" + y1 +\r\n                            \" L\" + x3 + \",\" + y2 +\r\n                            \" L\" + r + \",\" + y2 +\r\n                            \" L\" + r + \",\" + b +\r\n                            \" L\" + l + \",\" + b +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"leftRightArrowCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var sAdj4, adj4 = 48123 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var maxAdj2, a2, maxAdj1, a1, maxAdj3, a3, q2, maxAdj4, a4, dy1, dy2, y1, y2, y3, y4, x1, x4, dx2, x2, x3;\r\n                        var vc = h / 2, hc = w / 2, r = w, b = h, l = 0, t = 0;\r\n                        var ss = Math.min(w, h);\r\n                        maxAdj2 = cnstVal1 * h / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        maxAdj1 = a2 * 2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        maxAdj3 = cnstVal1 * w / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        q2 = a3 * ss / wd2;\r\n                        maxAdj4 = cnstVal2 - q2;\r\n                        a4 = (adj4 < 0) ? 0 : (adj4 > maxAdj4) ? maxAdj4 : adj4;\r\n                        dy1 = ss * a2 / cnstVal2;\r\n                        dy2 = ss * a1 / cnstVal3;\r\n                        y1 = vc - dy1;\r\n                        y2 = vc - dy2;\r\n                        y3 = vc + dy2;\r\n                        y4 = vc + dy1;\r\n                        x1 = ss * a3 / cnstVal2;\r\n                        x4 = r - x1;\r\n                        dx2 = w * a4 / cnstVal3;\r\n                        x2 = hc - dx2;\r\n                        x3 = hc + dx2;\r\n                        var d_val = \"M\" + l + \",\" + vc +\r\n                            \" L\" + x1 + \",\" + y1 +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + t +\r\n                            \" L\" + x3 + \",\" + t +\r\n                            \" L\" + x3 + \",\" + y2 +\r\n                            \" L\" + x4 + \",\" + y2 +\r\n                            \" L\" + x4 + \",\" + y1 +\r\n                            \" L\" + r + \",\" + vc +\r\n                            \" L\" + x4 + \",\" + y4 +\r\n                            \" L\" + x4 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + b +\r\n                            \" L\" + x2 + \",\" + b +\r\n                            \" L\" + x2 + \",\" + y3 +\r\n                            \" L\" + x1 + \",\" + y3 +\r\n                            \" L\" + x1 + \",\" + y4 +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"quadArrowCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 18515 * 96 / 914400;\r\n                        var sAdj2, adj2 = 18515 * 96 / 914400;\r\n                        var sAdj3, adj3 = 18515 * 96 / 914400;\r\n                        var sAdj4, adj4 = 48123 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, r = w, b = h, l = 0, t = 0;\r\n                        var ss = Math.min(w, h);\r\n                        var a2, maxAdj1, a1, maxAdj3, a3, q2, maxAdj4, a4, dx2, dx3, ah, dx1, dy1, x8, x2, x7, x3, x6, x4, x5, y8, y2, y7, y3, y6, y4, y5;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > cnstVal1) ? cnstVal1 : adj2;\r\n                        maxAdj1 = a2 * 2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        maxAdj3 = cnstVal1 - a2;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        q2 = a3 * 2;\r\n                        maxAdj4 = cnstVal2 - q2;\r\n                        a4 = (adj4 < a1) ? a1 : (adj4 > maxAdj4) ? maxAdj4 : adj4;\r\n                        dx2 = ss * a2 / cnstVal2;\r\n                        dx3 = ss * a1 / cnstVal3;\r\n                        ah = ss * a3 / cnstVal2;\r\n                        dx1 = w * a4 / cnstVal3;\r\n                        dy1 = h * a4 / cnstVal3;\r\n                        x8 = r - ah;\r\n                        x2 = hc - dx1;\r\n                        x7 = hc + dx1;\r\n                        x3 = hc - dx2;\r\n                        x6 = hc + dx2;\r\n                        x4 = hc - dx3;\r\n                        x5 = hc + dx3;\r\n                        y8 = b - ah;\r\n                        y2 = vc - dy1;\r\n                        y7 = vc + dy1;\r\n                        y3 = vc - dx2;\r\n                        y6 = vc + dx2;\r\n                        y4 = vc - dx3;\r\n                        y5 = vc + dx3;\r\n                        var d_val = \"M\" + l + \",\" + vc +\r\n                            \" L\" + ah + \",\" + y3 +\r\n                            \" L\" + ah + \",\" + y4 +\r\n                            \" L\" + x2 + \",\" + y4 +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + x4 + \",\" + y2 +\r\n                            \" L\" + x4 + \",\" + ah +\r\n                            \" L\" + x3 + \",\" + ah +\r\n                            \" L\" + hc + \",\" + t +\r\n                            \" L\" + x6 + \",\" + ah +\r\n                            \" L\" + x5 + \",\" + ah +\r\n                            \" L\" + x5 + \",\" + y2 +\r\n                            \" L\" + x7 + \",\" + y2 +\r\n                            \" L\" + x7 + \",\" + y4 +\r\n                            \" L\" + x8 + \",\" + y4 +\r\n                            \" L\" + x8 + \",\" + y3 +\r\n                            \" L\" + r + \",\" + vc +\r\n                            \" L\" + x8 + \",\" + y6 +\r\n                            \" L\" + x8 + \",\" + y5 +\r\n                            \" L\" + x7 + \",\" + y5 +\r\n                            \" L\" + x7 + \",\" + y7 +\r\n                            \" L\" + x5 + \",\" + y7 +\r\n                            \" L\" + x5 + \",\" + y8 +\r\n                            \" L\" + x6 + \",\" + y8 +\r\n                            \" L\" + hc + \",\" + b +\r\n                            \" L\" + x3 + \",\" + y8 +\r\n                            \" L\" + x4 + \",\" + y8 +\r\n                            \" L\" + x4 + \",\" + y7 +\r\n                            \" L\" + x2 + \",\" + y7 +\r\n                            \" L\" + x2 + \",\" + y5 +\r\n                            \" L\" + ah + \",\" + y5 +\r\n                            \" L\" + ah + \",\" + y6 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"curvedDownArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, wd2 = w / 2, r = w, b = h, l = 0, t = 0, c3d4 = 270, cd2 = 180, cd4 = 90;\r\n                        var ss = Math.min(w, h);\r\n                        var maxAdj2, a2, a1, th, aw, q1, wR, q7, q8, q9, q10, q11, idy, maxAdj3, a3, ah, x3, q2, q3, q4, q5, dx, x5, x7, q6, dh, x4, x8, aw2, x6, y1, swAng, mswAng, iy, ix, q12, dang2, stAng, stAng2, swAng2, swAng3;\r\n\r\n                        maxAdj2 = cnstVal1 * w / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal2) ? cnstVal2 : adj1;\r\n                        th = ss * a1 / cnstVal2;\r\n                        aw = ss * a2 / cnstVal2;\r\n                        q1 = (th + aw) / 4;\r\n                        wR = wd2 - q1;\r\n                        q7 = wR * 2;\r\n                        q8 = q7 * q7;\r\n                        q9 = th * th;\r\n                        q10 = q8 - q9;\r\n                        q11 = Math.sqrt(q10);\r\n                        idy = q11 * h / q7;\r\n                        maxAdj3 = cnstVal2 * idy / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        ah = ss * adj3 / cnstVal2;\r\n                        x3 = wR + th;\r\n                        q2 = h * h;\r\n                        q3 = ah * ah;\r\n                        q4 = q2 - q3;\r\n                        q5 = Math.sqrt(q4);\r\n                        dx = q5 * wR / h;\r\n                        x5 = wR + dx;\r\n                        x7 = x3 + dx;\r\n                        q6 = aw - th;\r\n                        dh = q6 / 2;\r\n                        x4 = x5 - dh;\r\n                        x8 = x7 + dh;\r\n                        aw2 = aw / 2;\r\n                        x6 = r - aw2;\r\n                        y1 = b - ah;\r\n                        swAng = Math.atan(dx / ah);\r\n                        var swAngDeg = swAng * 180 / Math.PI;\r\n                        mswAng = -swAngDeg;\r\n                        iy = b - idy;\r\n                        ix = (wR + x3) / 2;\r\n                        q12 = th / 2;\r\n                        dang2 = Math.atan(q12 / idy);\r\n                        var dang2Deg = dang2 * 180 / Math.PI;\r\n                        stAng = c3d4 + swAngDeg;\r\n                        stAng2 = c3d4 - dang2Deg;\r\n                        swAng2 = dang2Deg - cd4;\r\n                        swAng3 = cd4 + dang2Deg;\r\n                        //var cX = x5 - Math.cos(stAng*Math.PI/180) * wR;\r\n                        //var cY = y1 - Math.sin(stAng*Math.PI/180) * h;\r\n\r\n                        var d_val = \"M\" + x6 + \",\" + b +\r\n                            \" L\" + x4 + \",\" + y1 +\r\n                            \" L\" + x5 + \",\" + y1 +\r\n                            shapeArc(wR, h, wR, h, stAng, (stAng + mswAng), false).replace(\"M\", \"L\") +\r\n                            \" L\" + x3 + \",\" + t +\r\n                            shapeArc(x3, h, wR, h, c3d4, (c3d4 + swAngDeg), false).replace(\"M\", \"L\") +\r\n                            \" L\" + (x5 + th) + \",\" + y1 +\r\n                            \" L\" + x8 + \",\" + y1 +\r\n                            \" z\" +\r\n                            \"M\" + x3 + \",\" + t +\r\n                            shapeArc(x3, h, wR, h, stAng2, (stAng2 + swAng2), false).replace(\"M\", \"L\") +\r\n                            shapeArc(wR, h, wR, h, cd2, (cd2 + swAng3), false).replace(\"M\", \"L\");\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"curvedLeftArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, hd2 = h / 2, r = w, b = h, l = 0, t = 0, c3d4 = 270, cd2 = 180, cd4 = 90;\r\n                        var ss = Math.min(w, h);\r\n                        var maxAdj2, a2, a1, th, aw, q1, hR, q7, q8, q9, q10, q11, idx, maxAdj3, a3, ah, y3, q2, q3, q4, q5, dy, y5, y7, q6, dh, y4, y8, aw2, y6, x1, swAng, mswAng, ix, iy, q12, dang2, swAng2, swAng3, stAng3;\r\n\r\n                        maxAdj2 = cnstVal1 * h / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > a2) ? a2 : adj1;\r\n                        th = ss * a1 / cnstVal2;\r\n                        aw = ss * a2 / cnstVal2;\r\n                        q1 = (th + aw) / 4;\r\n                        hR = hd2 - q1;\r\n                        q7 = hR * 2;\r\n                        q8 = q7 * q7;\r\n                        q9 = th * th;\r\n                        q10 = q8 - q9;\r\n                        q11 = Math.sqrt(q10);\r\n                        idx = q11 * w / q7;\r\n                        maxAdj3 = cnstVal2 * idx / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        ah = ss * a3 / cnstVal2;\r\n                        y3 = hR + th;\r\n                        q2 = w * w;\r\n                        q3 = ah * ah;\r\n                        q4 = q2 - q3;\r\n                        q5 = Math.sqrt(q4);\r\n                        dy = q5 * hR / w;\r\n                        y5 = hR + dy;\r\n                        y7 = y3 + dy;\r\n                        q6 = aw - th;\r\n                        dh = q6 / 2;\r\n                        y4 = y5 - dh;\r\n                        y8 = y7 + dh;\r\n                        aw2 = aw / 2;\r\n                        y6 = b - aw2;\r\n                        x1 = l + ah;\r\n                        swAng = Math.atan(dy / ah);\r\n                        mswAng = -swAng;\r\n                        ix = l + idx;\r\n                        iy = (hR + y3) / 2;\r\n                        q12 = th / 2;\r\n                        dang2 = Math.atan(q12 / idx);\r\n                        swAng2 = dang2 - swAng;\r\n                        swAng3 = swAng + dang2;\r\n                        stAng3 = -dang2;\r\n                        var swAngDg, swAng2Dg, swAng3Dg, stAng3dg;\r\n                        swAngDg = swAng * 180 / Math.PI;\r\n                        swAng2Dg = swAng2 * 180 / Math.PI;\r\n                        swAng3Dg = swAng3 * 180 / Math.PI;\r\n                        stAng3dg = stAng3 * 180 / Math.PI;\r\n\r\n                        var d_val = \"M\" + r + \",\" + y3 +\r\n                            shapeArc(l, hR, w, hR, 0, -cd4, false).replace(\"M\", \"L\") +\r\n                            \" L\" + l + \",\" + t +\r\n                            shapeArc(l, y3, w, hR, c3d4, (c3d4 + cd4), false).replace(\"M\", \"L\") +\r\n                            \" L\" + r + \",\" + y3 +\r\n                            shapeArc(l, y3, w, hR, 0, swAngDg, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + y7 +\r\n                            \" L\" + x1 + \",\" + y8 +\r\n                            \" L\" + l + \",\" + y6 +\r\n                            \" L\" + x1 + \",\" + y4 +\r\n                            \" L\" + x1 + \",\" + y5 +\r\n                            shapeArc(l, hR, w, hR, swAngDg, (swAngDg + swAng2Dg), false).replace(\"M\", \"L\") +\r\n                            shapeArc(l, hR, w, hR, 0, -cd4, false).replace(\"M\", \"L\") +\r\n                            shapeArc(l, y3, w, hR, c3d4, (c3d4 + cd4), false).replace(\"M\", \"L\");\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"curvedRightArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, hd2 = h / 2, r = w, b = h, l = 0, t = 0, c3d4 = 270, cd2 = 180, cd4 = 90;\r\n                        var ss = Math.min(w, h);\r\n                        var maxAdj2, a2, a1, th, aw, q1, hR, q7, q8, q9, q10, q11, idx, maxAdj3, a3, ah, y3, q2, q3, q4, q5, dy, y5, y7, q6, dh, y4, y8, aw2, y6, x1, swAng, stAng, mswAng, ix, iy, q12, dang2, swAng2, swAng3, stAng3;\r\n\r\n                        maxAdj2 = cnstVal1 * h / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > a2) ? a2 : adj1;\r\n                        th = ss * a1 / cnstVal2;\r\n                        aw = ss * a2 / cnstVal2;\r\n                        q1 = (th + aw) / 4;\r\n                        hR = hd2 - q1;\r\n                        q7 = hR * 2;\r\n                        q8 = q7 * q7;\r\n                        q9 = th * th;\r\n                        q10 = q8 - q9;\r\n                        q11 = Math.sqrt(q10);\r\n                        idx = q11 * w / q7;\r\n                        maxAdj3 = cnstVal2 * idx / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        ah = ss * a3 / cnstVal2;\r\n                        y3 = hR + th;\r\n                        q2 = w * w;\r\n                        q3 = ah * ah;\r\n                        q4 = q2 - q3;\r\n                        q5 = Math.sqrt(q4);\r\n                        dy = q5 * hR / w;\r\n                        y5 = hR + dy;\r\n                        y7 = y3 + dy;\r\n                        q6 = aw - th;\r\n                        dh = q6 / 2;\r\n                        y4 = y5 - dh;\r\n                        y8 = y7 + dh;\r\n                        aw2 = aw / 2;\r\n                        y6 = b - aw2;\r\n                        x1 = r - ah;\r\n                        swAng = Math.atan(dy / ah);\r\n                        stAng = Math.PI + 0 - swAng;\r\n                        mswAng = -swAng;\r\n                        ix = r - idx;\r\n                        iy = (hR + y3) / 2;\r\n                        q12 = th / 2;\r\n                        dang2 = Math.atan(q12 / idx);\r\n                        swAng2 = dang2 - Math.PI / 2;\r\n                        swAng3 = Math.PI / 2 + dang2;\r\n                        stAng3 = Math.PI - dang2;\r\n\r\n                        var stAngDg, mswAngDg, swAngDg, swAng2dg;\r\n                        stAngDg = stAng * 180 / Math.PI;\r\n                        mswAngDg = mswAng * 180 / Math.PI;\r\n                        swAngDg = swAng * 180 / Math.PI;\r\n                        swAng2dg = swAng2 * 180 / Math.PI;\r\n\r\n                        var d_val = \"M\" + l + \",\" + hR +\r\n                            shapeArc(w, hR, w, hR, cd2, cd2 + mswAngDg, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + y5 +\r\n                            \" L\" + x1 + \",\" + y4 +\r\n                            \" L\" + r + \",\" + y6 +\r\n                            \" L\" + x1 + \",\" + y8 +\r\n                            \" L\" + x1 + \",\" + y7 +\r\n                            shapeArc(w, y3, w, hR, stAngDg, stAngDg + swAngDg, false).replace(\"M\", \"L\") +\r\n                            \" L\" + l + \",\" + hR +\r\n                            shapeArc(w, hR, w, hR, cd2, cd2 + cd4, false).replace(\"M\", \"L\") +\r\n                            \" L\" + r + \",\" + th +\r\n                            shapeArc(w, y3, w, hR, c3d4, c3d4 + swAng2dg, false).replace(\"M\", \"L\")\r\n                        \"\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"curvedUpArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, wd2 = w / 2, r = w, b = h, l = 0, t = 0, c3d4 = 270, cd2 = 180, cd4 = 90;\r\n                        var ss = Math.min(w, h);\r\n                        var maxAdj2, a2, a1, th, aw, q1, wR, q7, q8, q9, q10, q11, idy, maxAdj3, a3, ah, x3, q2, q3, q4, q5, dx, x5, x7, q6, dh, x4, x8, aw2, x6, y1, swAng, mswAng, iy, ix, q12, dang2, swAng2, mswAng2, stAng3, swAng3, stAng2;\r\n\r\n                        maxAdj2 = cnstVal1 * w / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal2) ? cnstVal2 : adj1;\r\n                        th = ss * a1 / cnstVal2;\r\n                        aw = ss * a2 / cnstVal2;\r\n                        q1 = (th + aw) / 4;\r\n                        wR = wd2 - q1;\r\n                        q7 = wR * 2;\r\n                        q8 = q7 * q7;\r\n                        q9 = th * th;\r\n                        q10 = q8 - q9;\r\n                        q11 = Math.sqrt(q10);\r\n                        idy = q11 * h / q7;\r\n                        maxAdj3 = cnstVal2 * idy / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        ah = ss * adj3 / cnstVal2;\r\n                        x3 = wR + th;\r\n                        q2 = h * h;\r\n                        q3 = ah * ah;\r\n                        q4 = q2 - q3;\r\n                        q5 = Math.sqrt(q4);\r\n                        dx = q5 * wR / h;\r\n                        x5 = wR + dx;\r\n                        x7 = x3 + dx;\r\n                        q6 = aw - th;\r\n                        dh = q6 / 2;\r\n                        x4 = x5 - dh;\r\n                        x8 = x7 + dh;\r\n                        aw2 = aw / 2;\r\n                        x6 = r - aw2;\r\n                        y1 = t + ah;\r\n                        swAng = Math.atan(dx / ah);\r\n                        mswAng = -swAng;\r\n                        iy = t + idy;\r\n                        ix = (wR + x3) / 2;\r\n                        q12 = th / 2;\r\n                        dang2 = Math.atan(q12 / idy);\r\n                        swAng2 = dang2 - swAng;\r\n                        mswAng2 = -swAng2;\r\n                        stAng3 = Math.PI / 2 - swAng;\r\n                        swAng3 = swAng + dang2;\r\n                        stAng2 = Math.PI / 2 - dang2;\r\n\r\n                        var stAng2dg, swAng2dg, swAngDg, swAng2dg;\r\n                        stAng2dg = stAng2 * 180 / Math.PI;\r\n                        swAng2dg = swAng2 * 180 / Math.PI;\r\n                        stAng3dg = stAng3 * 180 / Math.PI;\r\n                        swAngDg = swAng * 180 / Math.PI;\r\n\r\n                        var d_val = //\"M\" + ix + \",\" +iy + \r\n                            shapeArc(wR, 0, wR, h, stAng2dg, stAng2dg + swAng2dg, false) + //.replace(\"M\",\"L\") +\r\n                            \" L\" + x5 + \",\" + y1 +\r\n                            \" L\" + x4 + \",\" + y1 +\r\n                            \" L\" + x6 + \",\" + t +\r\n                            \" L\" + x8 + \",\" + y1 +\r\n                            \" L\" + x7 + \",\" + y1 +\r\n                            shapeArc(x3, 0, wR, h, stAng3dg, stAng3dg + swAngDg, false).replace(\"M\", \"L\") +\r\n                            \" L\" + wR + \",\" + b +\r\n                            shapeArc(wR, 0, wR, h, cd4, cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + th + \",\" + t +\r\n                            shapeArc(x3, 0, wR, h, cd2, cd4, false).replace(\"M\", \"L\") +\r\n                            \"\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"mathDivide\":\r\n                    case \"mathEqual\":\r\n                    case \"mathMinus\":\r\n                    case \"mathMultiply\":\r\n                    case \"mathNotEqual\":\r\n                    case \"mathPlus\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1;\r\n                        var sAdj2, adj2;\r\n                        var sAdj3, adj3;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            if (shapAdjst_ary.constructor === Array) {\r\n                                for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                    var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                    if (sAdj_name == \"adj1\") {\r\n                                        sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                        adj1 = parseInt(sAdj1.substr(4));\r\n                                    } else if (sAdj_name == \"adj2\") {\r\n                                        sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                        adj2 = parseInt(sAdj2.substr(4));\r\n                                    } else if (sAdj_name == \"adj3\") {\r\n                                        sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                        adj3 = parseInt(sAdj3.substr(4));\r\n                                    }\r\n                                }\r\n                            } else {\r\n                                sAdj1 = getTextByPathList(shapAdjst_ary, [\"attrs\", \"fmla\"]);\r\n                                adj1 = parseInt(sAdj1.substr(4));\r\n                            }\r\n                        }\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        var dVal;\r\n                        var hc = w / 2, vc = h / 2, hd2 = h / 2;\r\n                        if (shapType == \"mathNotEqual\") {\r\n                            if (shapAdjst_ary === undefined) {\r\n                                adj1 = 23520 * 96 / 914400;\r\n                                adj2 = 110 * Math.PI / 180;\r\n                                adj3 = 11760 * 96 / 914400;\r\n                            } else {\r\n                                adj1 = adj1 * 96 / 914400;\r\n                                adj2 = (adj2 / 60000) * Math.PI / 180;\r\n                                adj3 = adj3 * 96 / 914400;\r\n                            }\r\n                            var a1, crAng, a2a1, maxAdj3, a3, dy1, dy2, dx1, x1, x8, y2, y3, y1, y4,\r\n                                cadj2, xadj2, len, bhw, bhw2, x7, dx67, x6, dx57, x5, dx47, x4, dx37,\r\n                                x3, dx27, x2, rx7, rx6, rx5, rx4, rx3, rx2, dx7, rxt, lxt, rx, lx,\r\n                                dy3, dy4, ry, ly, dlx, drx, dly, dry, xC1, xC2, yC1, yC2, yC3, yC4;\r\n                            var angVal1 = 70 * Math.PI / 180, angVal2 = 110 * Math.PI / 180;\r\n                            var cnstVal4 = 73490 * 96 / 914400;\r\n                            //var cd4 = 90;\r\n                            a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal1) ? cnstVal1 : adj1;\r\n                            crAng = (adj2 < angVal1) ? angVal1 : (adj2 > angVal2) ? angVal2 : adj2;\r\n                            a2a1 = a1 * 2;\r\n                            maxAdj3 = cnstVal2 - a2a1;\r\n                            a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                            dy1 = h * a1 / cnstVal2;\r\n                            dy2 = h * a3 / cnstVal3;\r\n                            dx1 = w * cnstVal4 / cnstVal3;\r\n                            x1 = hc - dx1;\r\n                            x8 = hc + dx1;\r\n                            y2 = vc - dy2;\r\n                            y3 = vc + dy2;\r\n                            y1 = y2 - dy1;\r\n                            y4 = y3 + dy1;\r\n                            cadj2 = crAng - Math.PI / 2;\r\n                            xadj2 = hd2 * Math.tan(cadj2);\r\n                            len = Math.sqrt(xadj2 * xadj2 + hd2 * hd2);\r\n                            bhw = len * dy1 / hd2;\r\n                            bhw2 = bhw / 2;\r\n                            x7 = hc + xadj2 - bhw2;\r\n                            dx67 = xadj2 * y1 / hd2;\r\n                            x6 = x7 - dx67;\r\n                            dx57 = xadj2 * y2 / hd2;\r\n                            x5 = x7 - dx57;\r\n                            dx47 = xadj2 * y3 / hd2;\r\n                            x4 = x7 - dx47;\r\n                            dx37 = xadj2 * y4 / hd2;\r\n                            x3 = x7 - dx37;\r\n                            dx27 = xadj2 * 2;\r\n                            x2 = x7 - dx27;\r\n                            rx7 = x7 + bhw;\r\n                            rx6 = x6 + bhw;\r\n                            rx5 = x5 + bhw;\r\n                            rx4 = x4 + bhw;\r\n                            rx3 = x3 + bhw;\r\n                            rx2 = x2 + bhw;\r\n                            dx7 = dy1 * hd2 / len;\r\n                            rxt = x7 + dx7;\r\n                            lxt = rx7 - dx7;\r\n                            rx = (cadj2 > 0) ? rxt : rx7;\r\n                            lx = (cadj2 > 0) ? x7 : lxt;\r\n                            dy3 = dy1 * xadj2 / len;\r\n                            dy4 = -dy3;\r\n                            ry = (cadj2 > 0) ? dy3 : 0;\r\n                            ly = (cadj2 > 0) ? 0 : dy4;\r\n                            dlx = w - rx;\r\n                            drx = w - lx;\r\n                            dly = h - ry;\r\n                            dry = h - ly;\r\n                            xC1 = (rx + lx) / 2;\r\n                            xC2 = (drx + dlx) / 2;\r\n                            yC1 = (ry + ly) / 2;\r\n                            yC2 = (y1 + y2) / 2;\r\n                            yC3 = (y3 + y4) / 2;\r\n                            yC4 = (dry + dly) / 2;\r\n\r\n                            dVal = \"M\" + x1 + \",\" + y1 +\r\n                                \" L\" + x6 + \",\" + y1 +\r\n                                \" L\" + lx + \",\" + ly +\r\n                                \" L\" + rx + \",\" + ry +\r\n                                \" L\" + rx6 + \",\" + y1 +\r\n                                \" L\" + x8 + \",\" + y1 +\r\n                                \" L\" + x8 + \",\" + y2 +\r\n                                \" L\" + rx5 + \",\" + y2 +\r\n                                \" L\" + rx4 + \",\" + y3 +\r\n                                \" L\" + x8 + \",\" + y3 +\r\n                                \" L\" + x8 + \",\" + y4 +\r\n                                \" L\" + rx3 + \",\" + y4 +\r\n                                \" L\" + drx + \",\" + dry +\r\n                                \" L\" + dlx + \",\" + dly +\r\n                                \" L\" + x3 + \",\" + y4 +\r\n                                \" L\" + x1 + \",\" + y4 +\r\n                                \" L\" + x1 + \",\" + y3 +\r\n                                \" L\" + x4 + \",\" + y3 +\r\n                                \" L\" + x5 + \",\" + y2 +\r\n                                \" L\" + x1 + \",\" + y2 +\r\n                                \" z\";\r\n                        } else if (shapType == \"mathDivide\") {\r\n                            if (shapAdjst_ary === undefined) {\r\n                                adj1 = 23520 * 96 / 914400;\r\n                                adj2 = 5880 * 96 / 914400;\r\n                                adj3 = 11760 * 96 / 914400;\r\n                            } else {\r\n                                adj1 = adj1 * 96 / 914400;\r\n                                adj2 = adj2 * 96 / 914400;\r\n                                adj3 = adj3 * 96 / 914400;\r\n                            }\r\n                            var a1, ma1, ma3h, ma3w, maxAdj3, a3, m4a3, maxAdj2, a2, dy1, yg, rad, dx1,\r\n                                y3, y4, a, y2, y1, y5, x1, x3, x2;\r\n                            var cnstVal4 = 1000 * 96 / 914400;\r\n                            var cnstVal5 = 36745 * 96 / 914400;\r\n                            var cnstVal6 = 73490 * 96 / 914400;\r\n                            a1 = (adj1 < cnstVal4) ? cnstVal4 : (adj1 > cnstVal5) ? cnstVal5 : adj1;\r\n                            ma1 = -a1;\r\n                            ma3h = (cnstVal6 + ma1) / 4;\r\n                            ma3w = cnstVal5 * w / h;\r\n                            maxAdj3 = (ma3h < ma3w) ? ma3h : ma3w;\r\n                            a3 = (adj3 < cnstVal4) ? cnstVal4 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                            m4a3 = -4 * a3;\r\n                            maxAdj2 = cnstVal6 + m4a3 - a1;\r\n                            a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                            dy1 = h * a1 / cnstVal3;\r\n                            yg = h * a2 / cnstVal2;\r\n                            rad = h * a3 / cnstVal2;\r\n                            dx1 = w * cnstVal6 / cnstVal3;\r\n                            y3 = vc - dy1;\r\n                            y4 = vc + dy1;\r\n                            a = yg + rad;\r\n                            y2 = y3 - a;\r\n                            y1 = y2 - rad;\r\n                            y5 = h - y1;\r\n                            x1 = hc - dx1;\r\n                            x3 = hc + dx1;\r\n                            x2 = hc - rad;\r\n                            var cd4 = 90, c3d4 = 270;\r\n                            var cX1 = hc - Math.cos(c3d4 * Math.PI / 180) * rad;\r\n                            var cY1 = y1 - Math.sin(c3d4 * Math.PI / 180) * rad;\r\n                            var cX2 = hc - Math.cos(Math.PI / 2) * rad;\r\n                            var cY2 = y5 - Math.sin(Math.PI / 2) * rad;\r\n                            dVal = \"M\" + hc + \",\" + y1 +\r\n                                shapeArc(cX1, cY1, rad, rad, c3d4, c3d4 + 360, false).replace(\"M\", \"L\") +\r\n                                \" z\" +\r\n                                \" M\" + hc + \",\" + y5 +\r\n                                shapeArc(cX2, cY2, rad, rad, cd4, cd4 + 360, false).replace(\"M\", \"L\") +\r\n                                \" z\" +\r\n                                \" M\" + x1 + \",\" + y3 +\r\n                                \" L\" + x3 + \",\" + y3 +\r\n                                \" L\" + x3 + \",\" + y4 +\r\n                                \" L\" + x1 + \",\" + y4 +\r\n                                \" z\";\r\n                        } else if (shapType == \"mathEqual\") {\r\n                            if (shapAdjst_ary === undefined) {\r\n                                adj1 = 23520 * 96 / 914400;\r\n                                adj2 = 11760 * 96 / 914400;\r\n                            } else {\r\n                                adj1 = adj1 * 96 / 914400;\r\n                                adj2 = adj2 * 96 / 914400;\r\n                            }\r\n                            var cnstVal5 = 36745 * 96 / 914400;\r\n                            var cnstVal6 = 73490 * 96 / 914400;\r\n                            var a1, a2a1, mAdj2, a2, dy1, dy2, dx1, y2, y3, y1, y4, x1, x2, yC1, yC2;\r\n\r\n                            a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal5) ? cnstVal5 : adj1;\r\n                            a2a1 = a1 * 2;\r\n                            mAdj2 = cnstVal2 - a2a1;\r\n                            a2 = (adj2 < 0) ? 0 : (adj2 > mAdj2) ? mAdj2 : adj2;\r\n                            dy1 = h * a1 / cnstVal2;\r\n                            dy2 = h * a2 / cnstVal3;\r\n                            dx1 = w * cnstVal6 / cnstVal3;\r\n                            y2 = vc - dy2;\r\n                            y3 = vc + dy2;\r\n                            y1 = y2 - dy1;\r\n                            y4 = y3 + dy1;\r\n                            x1 = hc - dx1;\r\n                            x2 = hc + dx1;\r\n                            yC1 = (y1 + y2) / 2;\r\n                            yC2 = (y3 + y4) / 2;\r\n                            dVal = \"M\" + x1 + \",\" + y1 +\r\n                                \" L\" + x2 + \",\" + y1 +\r\n                                \" L\" + x2 + \",\" + y2 +\r\n                                \" L\" + x1 + \",\" + y2 +\r\n                                \" z\" +\r\n                                \"M\" + x1 + \",\" + y3 +\r\n                                \" L\" + x2 + \",\" + y3 +\r\n                                \" L\" + x2 + \",\" + y4 +\r\n                                \" L\" + x1 + \",\" + y4 +\r\n                                \" z\";\r\n                        } else if (shapType == \"mathMinus\") {\r\n                            if (shapAdjst_ary === undefined) {\r\n                                adj1 = 23520 * 96 / 914400;\r\n                            } else {\r\n                                adj1 = adj1 * 96 / 914400;\r\n                            }\r\n                            var cnstVal6 = 73490 * 96 / 914400;\r\n                            var a1, dy1, dx1, y1, y2, x1, x2;\r\n                            a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal2) ? cnstVal2 : adj1;\r\n                            dy1 = h * a1 / cnstVal3;\r\n                            dx1 = w * cnstVal6 / cnstVal3;\r\n                            y1 = vc - dy1;\r\n                            y2 = vc + dy1;\r\n                            x1 = hc - dx1;\r\n                            x2 = hc + dx1;\r\n\r\n                            dVal = \"M\" + x1 + \",\" + y1 +\r\n                                \" L\" + x2 + \",\" + y1 +\r\n                                \" L\" + x2 + \",\" + y2 +\r\n                                \" L\" + x1 + \",\" + y2 +\r\n                                \" z\";\r\n                        } else if (shapType == \"mathMultiply\") {\r\n                            if (shapAdjst_ary === undefined) {\r\n                                adj1 = 23520 * 96 / 914400;\r\n                            } else {\r\n                                adj1 = adj1 * 96 / 914400;\r\n                            }\r\n                            var cnstVal6 = 51965 * 96 / 914400;\r\n                            var a1, th, a, sa, ca, ta, dl, rw, lM, xM, yM, dxAM, dyAM,\r\n                                xA, yA, xB, yB, xBC, yBC, yC, xD, xE, yFE, xFE, xF, xL, yG, yH, yI, xC2, yC3;\r\n                            var ss = Math.min(w, h);\r\n                            a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal6) ? cnstVal6 : adj1;\r\n                            th = ss * a1 / cnstVal2;\r\n                            a = Math.atan(h / w);\r\n                            sa = 1 * Math.sin(a);\r\n                            ca = 1 * Math.cos(a);\r\n                            ta = 1 * Math.tan(a);\r\n                            dl = Math.sqrt(w * w + h * h);\r\n                            rw = dl * cnstVal6 / cnstVal2;\r\n                            lM = dl - rw;\r\n                            xM = ca * lM / 2;\r\n                            yM = sa * lM / 2;\r\n                            dxAM = sa * th / 2;\r\n                            dyAM = ca * th / 2;\r\n                            xA = xM - dxAM;\r\n                            yA = yM + dyAM;\r\n                            xB = xM + dxAM;\r\n                            yB = yM - dyAM;\r\n                            xBC = hc - xB;\r\n                            yBC = xBC * ta;\r\n                            yC = yBC + yB;\r\n                            xD = w - xB;\r\n                            xE = w - xA;\r\n                            yFE = vc - yA;\r\n                            xFE = yFE / ta;\r\n                            xF = xE - xFE;\r\n                            xL = xA + xFE;\r\n                            yG = h - yA;\r\n                            yH = h - yB;\r\n                            yI = h - yC;\r\n                            xC2 = w - xM;\r\n                            yC3 = h - yM;\r\n\r\n                            dVal = \"M\" + xA + \",\" + yA +\r\n                                \" L\" + xB + \",\" + yB +\r\n                                \" L\" + hc + \",\" + yC +\r\n                                \" L\" + xD + \",\" + yB +\r\n                                \" L\" + xE + \",\" + yA +\r\n                                \" L\" + xF + \",\" + vc +\r\n                                \" L\" + xE + \",\" + yG +\r\n                                \" L\" + xD + \",\" + yH +\r\n                                \" L\" + hc + \",\" + yI +\r\n                                \" L\" + xB + \",\" + yH +\r\n                                \" L\" + xA + \",\" + yG +\r\n                                \" L\" + xL + \",\" + vc +\r\n                                \" z\";\r\n                        } else if (shapType == \"mathPlus\") {\r\n                            if (shapAdjst_ary === undefined) {\r\n                                adj1 = 23520 * 96 / 914400;\r\n                            } else {\r\n                                adj1 = adj1 * 96 / 914400;\r\n                            }\r\n                            var cnstVal6 = 73490 * 96 / 914400;\r\n                            var ss = Math.min(w, h);\r\n                            var a1, dx1, dy1, dx2, x1, x2, x3, x4, y1, y2, y3, y4;\r\n\r\n                            a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal6) ? cnstVal6 : adj1;\r\n                            dx1 = w * cnstVal6 / cnstVal3;\r\n                            dy1 = h * cnstVal6 / cnstVal3;\r\n                            dx2 = ss * a1 / cnstVal3;\r\n                            x1 = hc - dx1;\r\n                            x2 = hc - dx2;\r\n                            x3 = hc + dx2;\r\n                            x4 = hc + dx1;\r\n                            y1 = vc - dy1;\r\n                            y2 = vc - dx2;\r\n                            y3 = vc + dx2;\r\n                            y4 = vc + dy1;\r\n\r\n                            dVal = \"M\" + x1 + \",\" + y2 +\r\n                                \" L\" + x2 + \",\" + y2 +\r\n                                \" L\" + x2 + \",\" + y1 +\r\n                                \" L\" + x3 + \",\" + y1 +\r\n                                \" L\" + x3 + \",\" + y2 +\r\n                                \" L\" + x4 + \",\" + y2 +\r\n                                \" L\" + x4 + \",\" + y3 +\r\n                                \" L\" + x3 + \",\" + y3 +\r\n                                \" L\" + x3 + \",\" + y4 +\r\n                                \" L\" + x2 + \",\" + y4 +\r\n                                \" L\" + x2 + \",\" + y3 +\r\n                                \" L\" + x1 + \",\" + y3 +\r\n                                \" z\";\r\n                        }\r\n                        result += \"<path d='\" + dVal + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        //console.log(shapType);\r\n                        break;\r\n                    case \"can\":\r\n                    case \"flowChartMagneticDisk\":\r\n                    case \"flowChartMagneticDrum\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 200000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var ss = Math.min(w, h);\r\n                        var maxAdj, a, y1, y2, y3, dVal;\r\n                        if (shapType == \"flowChartMagneticDisk\" || shapType == \"flowChartMagneticDrum\") {\r\n                            adj = 50000 * 96 / 914400;\r\n                        }\r\n                        maxAdj = cnstVal1 * h / ss;\r\n                        a = (adj < 0) ? 0 : (adj > maxAdj) ? maxAdj : adj;\r\n                        y1 = ss * a / cnstVal2;\r\n                        y2 = y1 + y1;\r\n                        y3 = h - y1;\r\n                        var cd2 = 180, wd2 = w / 2;\r\n\r\n                        var tranglRott = \"\";\r\n                        if (shapType == \"flowChartMagneticDrum\") {\r\n                            tranglRott = \"transform='rotate(90 \" + w / 2 + \",\" + h / 2 + \")'\";\r\n                        }\r\n                        dVal = shapeArc(wd2, y1, wd2, y1, 0, cd2, false) +\r\n                            shapeArc(wd2, y1, wd2, y1, cd2, cd2 + cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w + \",\" + y3 +\r\n                            shapeArc(wd2, y3, wd2, y1, 0, cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + 0 + \",\" + y1;\r\n\r\n                        result += \"<path \" + tranglRott + \" d='\" + dVal + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"swooshArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var refr = 96 / 914400;\r\n                        var sAdj1, adj1 = 25000 * refr;\r\n                        var sAdj2, adj2 = 16667 * refr;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * refr;\r\n                                }\r\n                            }\r\n                        }\r\n                        var cnstVal1 = 1 * refr;\r\n                        var cnstVal2 = 70000 * refr;\r\n                        var cnstVal3 = 75000 * refr;\r\n                        var cnstVal4 = 100000 * refr;\r\n                        var ss = Math.min(w, h);\r\n                        var ssd8 = ss / 8;\r\n                        var hd6 = h / 6;\r\n\r\n                        var a1, maxAdj2, a2, ad1, ad2, xB, yB, alfa, dx0, xC, dx1, yF, xF, xE, yE, dy2, dy22, dy3, yD, dy4, yP1, xP1, dy5, yP2, xP2;\r\n\r\n                        a1 = (adj1 < cnstVal1) ? cnstVal1 : (adj1 > cnstVal3) ? cnstVal3 : adj1;\r\n                        maxAdj2 = cnstVal2 * w / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        ad1 = h * a1 / cnstVal4;\r\n                        ad2 = ss * a2 / cnstVal4;\r\n                        xB = w - ad2;\r\n                        yB = ssd8;\r\n                        alfa = (Math.PI / 2) / 14;\r\n                        dx0 = ssd8 * Math.tan(alfa);\r\n                        xC = xB - dx0;\r\n                        dx1 = ad1 * Math.tan(alfa);\r\n                        yF = yB + ad1;\r\n                        xF = xB + dx1;\r\n                        xE = xF + dx0;\r\n                        yE = yF + ssd8;\r\n                        dy2 = yE - 0;\r\n                        dy22 = dy2 / 2;\r\n                        dy3 = h / 20;\r\n                        yD = dy22 - dy3;\r\n                        dy4 = hd6;\r\n                        yP1 = hd6 + dy4;\r\n                        xP1 = w / 6;\r\n                        dy5 = hd6 / 2;\r\n                        yP2 = yF + dy5;\r\n                        xP2 = w / 4;\r\n\r\n                        var dVal = \"M\" + 0 + \",\" + h +\r\n                            \" Q\" + xP1 + \",\" + yP1 + \" \" + xB + \",\" + yB +\r\n                            \" L\" + xC + \",\" + 0 +\r\n                            \" L\" + w + \",\" + yD +\r\n                            \" L\" + xE + \",\" + yE +\r\n                            \" L\" + xF + \",\" + yF +\r\n                            \" Q\" + xP2 + \",\" + yP2 + \" \" + 0 + \",\" + h +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + dVal + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"circularArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 12500 * 96 / 914400;\r\n                        var sAdj2, adj2 = (1142319 / 60000) * Math.PI / 180;\r\n                        var sAdj3, adj3 = (20457681 / 60000) * Math.PI / 180;\r\n                        var sAdj4, adj4 = (10800000 / 60000) * Math.PI / 180;\r\n                        var sAdj5, adj5 = 12500 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = (parseInt(sAdj2.substr(4)) / 60000) * Math.PI / 180;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = (parseInt(sAdj3.substr(4)) / 60000) * Math.PI / 180;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = (parseInt(sAdj4.substr(4)) / 60000) * Math.PI / 180;\r\n                                } else if (sAdj_name == \"adj5\") {\r\n                                    sAdj5 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj5 = parseInt(sAdj5.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, r = w, b = h, l = 0, t = 0, wd2 = w / 2, hd2 = h / 2;\r\n                        var ss = Math.min(w, h);\r\n                        var a5, maxAdj1, a1, enAng, stAng, th, thh, th2, rw1, rh1, rw2, rh2, rw3, rh3, wtH, htH, dxH,\r\n                            dyH, xH, yH, rI, u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15, u16, u17,\r\n                            u18, u19, u20, u21, maxAng, aAng, ptAng, wtA, htA, dxA, dyA, xA, yA, wtE, htE, dxE, dyE, xE, yE,\r\n                            dxG, dyG, xG, yG, dxB, dyB, xB, yB, sx1, sy1, sx2, sy2, rO, x1O, y1O, x2O, y2O, dxO, dyO, dO,\r\n                            q1, q2, DO, q3, q4, q5, q6, q7, q8, sdelO, ndyO, sdyO, q9, q10, q11, dxF1, q12, dxF2, adyO,\r\n                            q13, q14, dyF1, q15, dyF2, q16, q17, q18, q19, q20, q21, q22, dxF, dyF, sdxF, sdyF, xF, yF,\r\n                            x1I, y1I, x2I, y2I, dxI, dyI, dI, v1, v2, DI, v3, v4, v5, v6, v7, v8, sdelI, v9, v10, v11,\r\n                            dxC1, v12, dxC2, adyI, v13, v14, dyC1, v15, dyC2, v16, v17, v18, v19, v20, v21, v22, dxC, dyC,\r\n                            sdxC, sdyC, xC, yC, ist0, ist1, istAng, isw1, isw2, iswAng, p1, p2, p3, p4, p5, xGp, yGp,\r\n                            xBp, yBp, en0, en1, en2, sw0, sw1, swAng;\r\n                        var cnstVal1 = 25000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var rdAngVal1 = (1 / 60000) * Math.PI / 180;\r\n                        var rdAngVal2 = (21599999 / 60000) * Math.PI / 180;\r\n                        var rdAngVal3 = 2 * Math.PI;\r\n\r\n                        a5 = (adj5 < 0) ? 0 : (adj5 > cnstVal1) ? cnstVal1 : adj5;\r\n                        maxAdj1 = a5 * 2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        enAng = (adj3 < rdAngVal1) ? rdAngVal1 : (adj3 > rdAngVal2) ? rdAngVal2 : adj3;\r\n                        stAng = (adj4 < 0) ? 0 : (adj4 > rdAngVal2) ? rdAngVal2 : adj4; //////////////////////////////////////////\r\n                        th = ss * a1 / cnstVal2;\r\n                        thh = ss * a5 / cnstVal2;\r\n                        th2 = th / 2;\r\n                        rw1 = wd2 + th2 - thh;\r\n                        rh1 = hd2 + th2 - thh;\r\n                        rw2 = rw1 - th;\r\n                        rh2 = rh1 - th;\r\n                        rw3 = rw2 + th2;\r\n                        rh3 = rh2 + th2;\r\n                        wtH = rw3 * Math.sin(enAng);\r\n                        htH = rh3 * Math.cos(enAng);\r\n\r\n                        //dxH = rw3*Math.cos(Math.atan(wtH/htH));\r\n                        //dyH = rh3*Math.sin(Math.atan(wtH/htH));\r\n                        dxH = rw3 * Math.cos(Math.atan2(wtH, htH));\r\n                        dyH = rh3 * Math.sin(Math.atan2(wtH, htH));\r\n\r\n                        xH = hc + dxH;\r\n                        yH = vc + dyH;\r\n                        rI = (rw2 < rh2) ? rw2 : rh2;\r\n                        u1 = dxH * dxH;\r\n                        u2 = dyH * dyH;\r\n                        u3 = rI * rI;\r\n                        u4 = u1 - u3;\r\n                        u5 = u2 - u3;\r\n                        u6 = u4 * u5 / u1;\r\n                        u7 = u6 / u2;\r\n                        u8 = 1 - u7;\r\n                        u9 = Math.sqrt(u8);\r\n                        u10 = u4 / dxH;\r\n                        u11 = u10 / dyH;\r\n                        u12 = (1 + u9) / u11;\r\n\r\n                        //u13 = Math.atan(u12/1);\r\n                        u13 = Math.atan2(u12, 1);\r\n\r\n                        u14 = u13 + rdAngVal3;\r\n                        u15 = (u13 > 0) ? u13 : u14;\r\n                        u16 = u15 - enAng;\r\n                        u17 = u16 + rdAngVal3;\r\n                        u18 = (u16 > 0) ? u16 : u17;\r\n                        u19 = u18 - cd2;\r\n                        u20 = u18 - rdAngVal3;\r\n                        u21 = (u19 > 0) ? u20 : u18;\r\n                        maxAng = Math.abs(u21);\r\n                        aAng = (adj2 < 0) ? 0 : (adj2 > maxAng) ? maxAng : adj2;\r\n                        ptAng = enAng + aAng;\r\n                        wtA = rw3 * Math.sin(ptAng);\r\n                        htA = rh3 * Math.cos(ptAng);\r\n                        //dxA = rw3*Math.cos(Math.atan(wtA/htA));\r\n                        //dyA = rh3*Math.sin(Math.atan(wtA/htA));\r\n                        dxA = rw3 * Math.cos(Math.atan2(wtA, htA));\r\n                        dyA = rh3 * Math.sin(Math.atan2(wtA, htA));\r\n\r\n                        xA = hc + dxA;\r\n                        yA = vc + dyA;\r\n                        wtE = rw1 * Math.sin(stAng);\r\n                        htE = rh1 * Math.cos(stAng);\r\n\r\n                        //dxE = rw1*Math.cos(Math.atan(wtE/htE));\r\n                        //dyE = rh1*Math.sin(Math.atan(wtE/htE));\r\n                        dxE = rw1 * Math.cos(Math.atan2(wtE, htE));\r\n                        dyE = rh1 * Math.sin(Math.atan2(wtE, htE));\r\n\r\n                        xE = hc + dxE;\r\n                        yE = vc + dyE;\r\n                        dxG = thh * Math.cos(ptAng);\r\n                        dyG = thh * Math.sin(ptAng);\r\n                        xG = xH + dxG;\r\n                        yG = yH + dyG;\r\n                        dxB = thh * Math.cos(ptAng);\r\n                        dyB = thh * Math.sin(ptAng);\r\n                        xB = xH - dxB;\r\n                        yB = yH - dyB;\r\n                        sx1 = xB - hc;\r\n                        sy1 = yB - vc;\r\n                        sx2 = xG - hc;\r\n                        sy2 = yG - vc;\r\n                        rO = (rw1 < rh1) ? rw1 : rh1;\r\n                        x1O = sx1 * rO / rw1;\r\n                        y1O = sy1 * rO / rh1;\r\n                        x2O = sx2 * rO / rw1;\r\n                        y2O = sy2 * rO / rh1;\r\n                        dxO = x2O - x1O;\r\n                        dyO = y2O - y1O;\r\n                        dO = Math.sqrt(dxO * dxO + dyO * dyO);\r\n                        q1 = x1O * y2O;\r\n                        q2 = x2O * y1O;\r\n                        DO = q1 - q2;\r\n                        q3 = rO * rO;\r\n                        q4 = dO * dO;\r\n                        q5 = q3 * q4;\r\n                        q6 = DO * DO;\r\n                        q7 = q5 - q6;\r\n                        q8 = (q7 > 0) ? q7 : 0;\r\n                        sdelO = Math.sqrt(q8);\r\n                        ndyO = dyO * -1;\r\n                        sdyO = (ndyO > 0) ? -1 : 1;\r\n                        q9 = sdyO * dxO;\r\n                        q10 = q9 * sdelO;\r\n                        q11 = DO * dyO;\r\n                        dxF1 = (q11 + q10) / q4;\r\n                        q12 = q11 - q10;\r\n                        dxF2 = q12 / q4;\r\n                        adyO = Math.abs(dyO);\r\n                        q13 = adyO * sdelO;\r\n                        q14 = DO * dxO / -1;\r\n                        dyF1 = (q14 + q13) / q4;\r\n                        q15 = q14 - q13;\r\n                        dyF2 = q15 / q4;\r\n                        q16 = x2O - dxF1;\r\n                        q17 = x2O - dxF2;\r\n                        q18 = y2O - dyF1;\r\n                        q19 = y2O - dyF2;\r\n                        q20 = Math.sqrt(q16 * q16 + q18 * q18);\r\n                        q21 = Math.sqrt(q17 * q17 + q19 * q19);\r\n                        q22 = q21 - q20;\r\n                        dxF = (q22 > 0) ? dxF1 : dxF2;\r\n                        dyF = (q22 > 0) ? dyF1 : dyF2;\r\n                        sdxF = dxF * rw1 / rO;\r\n                        sdyF = dyF * rh1 / rO;\r\n                        xF = hc + sdxF;\r\n                        yF = vc + sdyF;\r\n                        x1I = sx1 * rI / rw2;\r\n                        y1I = sy1 * rI / rh2;\r\n                        x2I = sx2 * rI / rw2;\r\n                        y2I = sy2 * rI / rh2;\r\n                        dxI = x2I - x1I;\r\n                        dyI = y2I - y1I;\r\n                        dI = Math.sqrt(dxI * dxI + dyI * dyI);\r\n                        v1 = x1I * y2I;\r\n                        v2 = x2I * y1I;\r\n                        DI = v1 - v2;\r\n                        v3 = rI * rI;\r\n                        v4 = dI * dI;\r\n                        v5 = v3 * v4;\r\n                        v6 = DI * DI;\r\n                        v7 = v5 - v6;\r\n                        v8 = (v7 > 0) ? v7 : 0;\r\n                        sdelI = Math.sqrt(v8);\r\n                        v9 = sdyO * dxI;\r\n                        v10 = v9 * sdelI;\r\n                        v11 = DI * dyI;\r\n                        dxC1 = (v11 + v10) / v4;\r\n                        v12 = v11 - v10;\r\n                        dxC2 = v12 / v4;\r\n                        adyI = Math.abs(dyI);\r\n                        v13 = adyI * sdelI;\r\n                        v14 = DI * dxI / -1;\r\n                        dyC1 = (v14 + v13) / v4;\r\n                        v15 = v14 - v13;\r\n                        dyC2 = v15 / v4;\r\n                        v16 = x1I - dxC1;\r\n                        v17 = x1I - dxC2;\r\n                        v18 = y1I - dyC1;\r\n                        v19 = y1I - dyC2;\r\n                        v20 = Math.sqrt(v16 * v16 + v18 * v18);\r\n                        v21 = Math.sqrt(v17 * v17 + v19 * v19);\r\n                        v22 = v21 - v20;\r\n                        dxC = (v22 > 0) ? dxC1 : dxC2;\r\n                        dyC = (v22 > 0) ? dyC1 : dyC2;\r\n                        sdxC = dxC * rw2 / rI;\r\n                        sdyC = dyC * rh2 / rI;\r\n                        xC = hc + sdxC;\r\n                        yC = vc + sdyC;\r\n\r\n                        //ist0 = Math.atan(sdyC/sdxC);\r\n                        ist0 = Math.atan2(sdyC, sdxC);\r\n\r\n                        ist1 = ist0 + rdAngVal3;\r\n                        istAng = (ist0 > 0) ? ist0 : ist1;\r\n                        isw1 = stAng - istAng;\r\n                        isw2 = isw1 - rdAngVal3;\r\n                        iswAng = (isw1 > 0) ? isw2 : isw1;\r\n                        p1 = xF - xC;\r\n                        p2 = yF - yC;\r\n                        p3 = Math.sqrt(p1 * p1 + p2 * p2);\r\n                        p4 = p3 / 2;\r\n                        p5 = p4 - thh;\r\n                        xGp = (p5 > 0) ? xF : xG;\r\n                        yGp = (p5 > 0) ? yF : yG;\r\n                        xBp = (p5 > 0) ? xC : xB;\r\n                        yBp = (p5 > 0) ? yC : yB;\r\n\r\n                        //en0 = Math.atan(sdyF/sdxF);\r\n                        en0 = Math.atan2(sdyF, sdxF);\r\n\r\n                        en1 = en0 + rdAngVal3;\r\n                        en2 = (en0 > 0) ? en0 : en1;\r\n                        sw0 = en2 - stAng;\r\n                        sw1 = sw0 + rdAngVal3;\r\n                        swAng = (sw0 > 0) ? sw0 : sw1;\r\n\r\n                        var strtAng = stAng * 180 / Math.PI\r\n                        var endAng = strtAng + (swAng * 180 / Math.PI);\r\n                        var stiAng = istAng * 180 / Math.PI;\r\n                        var swiAng = iswAng * 180 / Math.PI;\r\n                        var ediAng = stiAng + swiAng;\r\n\r\n                        var d_val = shapeArc(w / 2, h / 2, rw1, rh1, strtAng, endAng, false) +\r\n                            \" L\" + xGp + \",\" + yGp +\r\n                            \" L\" + xA + \",\" + yA +\r\n                            \" L\" + xBp + \",\" + yBp +\r\n                            \" L\" + xC + \",\" + yC +\r\n                            shapeArc(w / 2, h / 2, rw2, rh2, stiAng, ediAng, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"leftCircularArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 12500 * 96 / 914400;\r\n                        var sAdj2, adj2 = (-1142319 / 60000) * Math.PI / 180;\r\n                        var sAdj3, adj3 = (1142319 / 60000) * Math.PI / 180;\r\n                        var sAdj4, adj4 = (10800000 / 60000) * Math.PI / 180;\r\n                        var sAdj5, adj5 = 12500 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = (parseInt(sAdj2.substr(4)) / 60000) * Math.PI / 180;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = (parseInt(sAdj3.substr(4)) / 60000) * Math.PI / 180;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = (parseInt(sAdj4.substr(4)) / 60000) * Math.PI / 180;\r\n                                } else if (sAdj_name == \"adj5\") {\r\n                                    sAdj5 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj5 = parseInt(sAdj5.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, r = w, b = h, l = 0, t = 0, wd2 = w / 2, hd2 = h / 2;\r\n                        var ss = Math.min(w, h);\r\n                        var cnstVal1 = 25000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var rdAngVal1 = (1 / 60000) * Math.PI / 180;\r\n                        var rdAngVal2 = (21599999 / 60000) * Math.PI / 180;\r\n                        var rdAngVal3 = 2 * Math.PI;\r\n                        var a5, maxAdj1, a1, enAng, stAng, th, thh, th2, rw1, rh1, rw2, rh2, rw3, rh3, wtH, htH, dxH, dyH, xH, yH, rI,\r\n                            u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15, u16, u17, u18, u19, u20, u21, u22,\r\n                            minAng, u23, a2, aAng, ptAng, wtA, htA, dxA, dyA, xA, yA, wtE, htE, dxE, dyE, xE, yE, wtD, htD, dxD, dyD,\r\n                            xD, yD, dxG, dyG, xG, yG, dxB, dyB, xB, yB, sx1, sy1, sx2, sy2, rO, x1O, y1O, x2O, y2O, dxO, dyO, dO,\r\n                            q1, q2, DO, q3, q4, q5, q6, q7, q8, sdelO, ndyO, sdyO, q9, q10, q11, dxF1, q12, dxF2, adyO, q13, q14, dyF1,\r\n                            q15, dyF2, q16, q17, q18, q19, q20, q21, q22, dxF, dyF, sdxF, sdyF, xF, yF, x1I, y1I, x2I, y2I, dxI, dyI, dI,\r\n                            v1, v2, DI, v3, v4, v5, v6, v7, v8, sdelI, v9, v10, v11, dxC1, v12, dxC2, adyI, v13, v14, dyC1, v15, dyC2, v16,\r\n                            v17, v18, v19, v20, v21, v22, dxC, dyC, sdxC, sdyC, xC, yC, ist0, ist1, istAng0, isw1, isw2, iswAng0, istAng,\r\n                            iswAng, p1, p2, p3, p4, p5, xGp, yGp, xBp, yBp, en0, en1, en2, sw0, sw1, swAng, stAng0;\r\n\r\n                        a5 = (adj5 < 0) ? 0 : (adj5 > cnstVal1) ? cnstVal1 : adj5;\r\n                        maxAdj1 = a5 * 2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        enAng = (adj3 < rdAngVal1) ? rdAngVal1 : (adj3 > rdAngVal2) ? rdAngVal2 : adj3;\r\n                        stAng = (adj4 < 0) ? 0 : (adj4 > rdAngVal2) ? rdAngVal2 : adj4;\r\n                        th = ss * a1 / cnstVal2;\r\n                        thh = ss * a5 / cnstVal2;\r\n                        th2 = th / 2;\r\n                        rw1 = wd2 + th2 - thh;\r\n                        rh1 = hd2 + th2 - thh;\r\n                        rw2 = rw1 - th;\r\n                        rh2 = rh1 - th;\r\n                        rw3 = rw2 + th2;\r\n                        rh3 = rh2 + th2;\r\n                        wtH = rw3 * Math.sin(enAng);\r\n                        htH = rh3 * Math.cos(enAng);\r\n                        dxH = rw3 * Math.cos(Math.atan2(wtH, htH));\r\n                        dyH = rh3 * Math.sin(Math.atan2(wtH, htH));\r\n                        xH = hc + dxH;\r\n                        yH = vc + dyH;\r\n                        rI = (rw2 < rh2) ? rw2 : rh2;\r\n                        u1 = dxH * dxH;\r\n                        u2 = dyH * dyH;\r\n                        u3 = rI * rI;\r\n                        u4 = u1 - u3;\r\n                        u5 = u2 - u3;\r\n                        u6 = u4 * u5 / u1;\r\n                        u7 = u6 / u2;\r\n                        u8 = 1 - u7;\r\n                        u9 = Math.sqrt(u8);\r\n                        u10 = u4 / dxH;\r\n                        u11 = u10 / dyH;\r\n                        u12 = (1 + u9) / u11;\r\n                        u13 = Math.atan2(u12, 1);\r\n                        u14 = u13 + rdAngVal3;\r\n                        u15 = (u13 > 0) ? u13 : u14;\r\n                        u16 = u15 - enAng;\r\n                        u17 = u16 + rdAngVal3;\r\n                        u18 = (u16 > 0) ? u16 : u17;\r\n                        u19 = u18 - cd2;\r\n                        u20 = u18 - rdAngVal3;\r\n                        u21 = (u19 > 0) ? u20 : u18;\r\n                        u22 = Math.abs(u21);\r\n                        minAng = u22 * -1;\r\n                        u23 = Math.abs(adj2);\r\n                        a2 = u23 * -1;\r\n                        aAng = (a2 < minAng) ? minAng : (a2 > 0) ? 0 : a2;\r\n                        ptAng = enAng + aAng;\r\n                        wtA = rw3 * Math.sin(ptAng);\r\n                        htA = rh3 * Math.cos(ptAng);\r\n                        dxA = rw3 * Math.cos(Math.atan2(wtA, htA));\r\n                        dyA = rh3 * Math.sin(Math.atan2(wtA, htA));\r\n                        xA = hc + dxA;\r\n                        yA = vc + dyA;\r\n                        wtE = rw1 * Math.sin(stAng);\r\n                        htE = rh1 * Math.cos(stAng);\r\n                        dxE = rw1 * Math.cos(Math.atan2(wtE, htE));\r\n                        dyE = rh1 * Math.sin(Math.atan2(wtE, htE));\r\n                        xE = hc + dxE;\r\n                        yE = vc + dyE;\r\n                        wtD = rw2 * Math.sin(stAng);\r\n                        htD = rh2 * Math.cos(stAng);\r\n                        dxD = rw2 * Math.cos(Math.atan2(wtD, htD));\r\n                        dyD = rh2 * Math.sin(Math.atan2(wtD, htD));\r\n                        xD = hc + dxD;\r\n                        yD = vc + dyD;\r\n                        dxG = thh * Math.cos(ptAng);\r\n                        dyG = thh * Math.sin(ptAng);\r\n                        xG = xH + dxG;\r\n                        yG = yH + dyG;\r\n                        dxB = thh * Math.cos(ptAng);\r\n                        dyB = thh * Math.sin(ptAng);\r\n                        xB = xH - dxB;\r\n                        yB = yH - dyB;\r\n                        sx1 = xB - hc;\r\n                        sy1 = yB - vc;\r\n                        sx2 = xG - hc;\r\n                        sy2 = yG - vc;\r\n                        rO = (rw1 < rh1) ? rw1 : rh1;\r\n                        x1O = sx1 * rO / rw1;\r\n                        y1O = sy1 * rO / rh1;\r\n                        x2O = sx2 * rO / rw1;\r\n                        y2O = sy2 * rO / rh1;\r\n                        dxO = x2O - x1O;\r\n                        dyO = y2O - y1O;\r\n                        dO = Math.sqrt(dxO * dxO + dyO * dyO);\r\n                        q1 = x1O * y2O;\r\n                        q2 = x2O * y1O;\r\n                        DO = q1 - q2;\r\n                        q3 = rO * rO;\r\n                        q4 = dO * dO;\r\n                        q5 = q3 * q4;\r\n                        q6 = DO * DO;\r\n                        q7 = q5 - q6;\r\n                        q8 = (q7 > 0) ? q7 : 0;\r\n                        sdelO = Math.sqrt(q8);\r\n                        ndyO = dyO * -1;\r\n                        sdyO = (ndyO > 0) ? -1 : 1;\r\n                        q9 = sdyO * dxO;\r\n                        q10 = q9 * sdelO;\r\n                        q11 = DO * dyO;\r\n                        dxF1 = (q11 + q10) / q4;\r\n                        q12 = q11 - q10;\r\n                        dxF2 = q12 / q4;\r\n                        adyO = Math.abs(dyO);\r\n                        q13 = adyO * sdelO;\r\n                        q14 = DO * dxO / -1;\r\n                        dyF1 = (q14 + q13) / q4;\r\n                        q15 = q14 - q13;\r\n                        dyF2 = q15 / q4;\r\n                        q16 = x2O - dxF1;\r\n                        q17 = x2O - dxF2;\r\n                        q18 = y2O - dyF1;\r\n                        q19 = y2O - dyF2;\r\n                        q20 = Math.sqrt(q16 * q16 + q18 * q18);\r\n                        q21 = Math.sqrt(q17 * q17 + q19 * q19);\r\n                        q22 = q21 - q20;\r\n                        dxF = (q22 > 0) ? dxF1 : dxF2;\r\n                        dyF = (q22 > 0) ? dyF1 : dyF2;\r\n                        sdxF = dxF * rw1 / rO;\r\n                        sdyF = dyF * rh1 / rO;\r\n                        xF = hc + sdxF;\r\n                        yF = vc + sdyF;\r\n                        x1I = sx1 * rI / rw2;\r\n                        y1I = sy1 * rI / rh2;\r\n                        x2I = sx2 * rI / rw2;\r\n                        y2I = sy2 * rI / rh2;\r\n                        dxI = x2I - x1I;\r\n                        dyI = y2I - y1I;\r\n                        dI = Math.sqrt(dxI * dxI + dyI * dyI);\r\n                        v1 = x1I * y2I;\r\n                        v2 = x2I * y1I;\r\n                        DI = v1 - v2;\r\n                        v3 = rI * rI;\r\n                        v4 = dI * dI;\r\n                        v5 = v3 * v4;\r\n                        v6 = DI * DI;\r\n                        v7 = v5 - v6;\r\n                        v8 = (v7 > 0) ? v7 : 0;\r\n                        sdelI = Math.sqrt(v8);\r\n                        v9 = sdyO * dxI;\r\n                        v10 = v9 * sdelI;\r\n                        v11 = DI * dyI;\r\n                        dxC1 = (v11 + v10) / v4;\r\n                        v12 = v11 - v10;\r\n                        dxC2 = v12 / v4;\r\n                        adyI = Math.abs(dyI);\r\n                        v13 = adyI * sdelI;\r\n                        v14 = DI * dxI / -1;\r\n                        dyC1 = (v14 + v13) / v4;\r\n                        v15 = v14 - v13;\r\n                        dyC2 = v15 / v4;\r\n                        v16 = x1I - dxC1;\r\n                        v17 = x1I - dxC2;\r\n                        v18 = y1I - dyC1;\r\n                        v19 = y1I - dyC2;\r\n                        v20 = Math.sqrt(v16 * v16 + v18 * v18);\r\n                        v21 = Math.sqrt(v17 * v17 + v19 * v19);\r\n                        v22 = v21 - v20;\r\n                        dxC = (v22 > 0) ? dxC1 : dxC2;\r\n                        dyC = (v22 > 0) ? dyC1 : dyC2;\r\n                        sdxC = dxC * rw2 / rI;\r\n                        sdyC = dyC * rh2 / rI;\r\n                        xC = hc + sdxC;\r\n                        yC = vc + sdyC;\r\n                        ist0 = Math.atan2(sdyC, sdxC);\r\n                        ist1 = ist0 + rdAngVal3;\r\n                        istAng0 = (ist0 > 0) ? ist0 : ist1;\r\n                        isw1 = stAng - istAng0;\r\n                        isw2 = isw1 + rdAngVal3;\r\n                        iswAng0 = (isw1 > 0) ? isw1 : isw2;\r\n                        istAng = istAng0 + iswAng0;\r\n                        iswAng = -iswAng0;\r\n                        p1 = xF - xC;\r\n                        p2 = yF - yC;\r\n                        p3 = Math.sqrt(p1 * p1 + p2 * p2);\r\n                        p4 = p3 / 2;\r\n                        p5 = p4 - thh;\r\n                        xGp = (p5 > 0) ? xF : xG;\r\n                        yGp = (p5 > 0) ? yF : yG;\r\n                        xBp = (p5 > 0) ? xC : xB;\r\n                        yBp = (p5 > 0) ? yC : yB;\r\n                        en0 = Math.atan2(sdyF, sdxF);\r\n                        en1 = en0 + rdAngVal3;\r\n                        en2 = (en0 > 0) ? en0 : en1;\r\n                        sw0 = en2 - stAng;\r\n                        sw1 = sw0 - rdAngVal3;\r\n                        swAng = (sw0 > 0) ? sw1 : sw0;\r\n                        stAng0 = stAng + swAng;\r\n\r\n                        var strtAng = stAng0 * 180 / Math.PI;\r\n                        var endAng = stAng * 180 / Math.PI;\r\n                        var stiAng = istAng * 180 / Math.PI;\r\n                        var swiAng = iswAng * 180 / Math.PI;\r\n                        var ediAng = stiAng + swiAng;\r\n\r\n                        var d_val = \"M\" + xE + \",\" + yE +\r\n                            \" L\" + xD + \",\" + yD +\r\n                            shapeArc(w / 2, h / 2, rw2, rh2, stiAng, ediAng, false).replace(\"M\", \"L\") +\r\n                            \" L\" + xBp + \",\" + yBp +\r\n                            \" L\" + xA + \",\" + yA +\r\n                            \" L\" + xGp + \",\" + yGp +\r\n                            \" L\" + xF + \",\" + yF +\r\n                            shapeArc(w / 2, h / 2, rw1, rh1, strtAng, endAng, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"leftRightCircularArrow\":\r\n                    case \"chartPlus\":\r\n                    case \"chartStar\":\r\n                    case \"chartX\":\r\n                    case \"cornerTabs\":\r\n                    case \"flowChartOfflineStorage\":\r\n                    case \"folderCorner\":\r\n                    case \"funnel\":\r\n                    case \"lineInv\":\r\n                    case \"nonIsoscelesTrapezoid\":\r\n                    case \"plaqueTabs\":\r\n                    case \"squareTabs\":\r\n                    case \"upDownArrowCallout\":\r\n                        console.log(shapType, \" -unsupported shape type.\");\r\n                        break;\r\n                    case undefined:\r\n                    default:\r\n                        console.warn(\"Undefine shape type.(\" + shapType + \")\");\r\n                }\r\n\r\n                result += \"</svg>\";\r\n\r\n                result += \"<div class='block content \" + getVerticalAlign(node, slideLayoutSpNode, slideMasterSpNode, type) +\r\n                    \"' _id='\" + id + \"' _idx='\" + idx + \"' _type='\" + type + \"' _name='\" + name +\r\n                    \"' style='\" +\r\n                    getPosition(slideXfrmNode, slideLayoutXfrmNode, slideMasterXfrmNode) +\r\n                    getSize(slideXfrmNode, slideLayoutXfrmNode, slideMasterXfrmNode) +\r\n                    \" z-index: \" + order + \";\" +\r\n                    \"transform: rotate(\" + txtRotate + \"deg);\" +\r\n                    \"'>\";\r\n\r\n                // TextBody\r\n                if (node[\"p:txBody\"] !== undefined) {\r\n                    result += genTextBody(node[\"p:txBody\"], node, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                }\r\n                result += \"</div>\";\r\n            } else if (custShapType !== undefined) {\r\n                //custGeom here - Amir ///////////////////////////////////////////////////////\r\n                //http://officeopenxml.com/drwSp-custGeom.php\r\n                var pathLstNode = getTextByPathList(custShapType, [\"a:pathLst\"]);\r\n                var pathNode = getTextByPathList(pathLstNode, [\"a:path\", \"attrs\"]);\r\n                var maxX = parseInt(pathNode[\"w\"]) * 96 / 914400;\r\n                var maxY = parseInt(pathNode[\"h\"]) * 96 / 914400;\r\n                //console.log(\"w = \"+w+\"\\nh = \"+h+\"\\nmaxX = \"+maxX +\"\\nmaxY = \" + maxY);\r\n                //cheke if it is close shape\r\n                var closeNode = getTextByPathList(pathLstNode, [\"a:path\", \"a:close\"]);\r\n                var startPoint = getTextByPathList(pathLstNode, [\"a:path\", \"a:moveTo\", \"a:pt\", \"attrs\"]);\r\n                var spX = parseInt(startPoint[\"x\"]) * 96 / 914400;\r\n                var spY = parseInt(startPoint[\"y\"]) * 96 / 914400;\r\n                var d = \"M\" + spX + \",\" + spY;\r\n                var pathNodes = getTextByPathList(pathLstNode, [\"a:path\"]);\r\n                var lnToNodes = pathNodes[\"a:lnTo\"];\r\n                var cubicBezToNodes = pathNodes[\"a:cubicBezTo\"];\r\n                var arcToNodes = pathNodes[\"a:arcTo\"];\r\n                var sortblAry = [];\r\n                if (lnToNodes !== undefined) {\r\n                    Object.keys(lnToNodes).forEach(function (key) {\r\n                        var lnToPtNode = lnToNodes[key][\"a:pt\"];\r\n                        if (lnToPtNode !== undefined) {\r\n                            Object.keys(lnToPtNode).forEach(function (key2) {\r\n                                var ptObj = {};\r\n                                var lnToNoPt = lnToPtNode[key2];\r\n                                var ptX = lnToNoPt[\"attrs\", \"x\"];\r\n                                var ptY = lnToNoPt[\"attrs\", \"y\"];\r\n                                var ptOrdr = lnToNoPt[\"attrs\", \"order\"];\r\n                                ptObj.type = \"lnto\";\r\n                                ptObj.order = ptOrdr;\r\n                                ptObj.x = ptX;\r\n                                ptObj.y = ptY;\r\n                                sortblAry.push(ptObj);\r\n                                //console.log(key2, lnToNoPt);\r\n\r\n                            });\r\n                        }\r\n                    });\r\n\r\n                }\r\n                if (cubicBezToNodes !== undefined) {\r\n                    Object.keys(cubicBezToNodes).forEach(function (key) {\r\n                        //console.log(\"cubicBezTo[\"+key+\"]:\");\r\n                        var cubicBezToPtNodes = cubicBezToNodes[key][\"a:pt\"];\r\n                        if (cubicBezToPtNodes !== undefined) {\r\n                            Object.keys(cubicBezToPtNodes).forEach(function (key2) {\r\n                                //console.log(\"cubicBezTo[\"+key+\"]pt[\"+key2+\"]:\");\r\n                                var cubBzPts = cubicBezToPtNodes[key2];\r\n                                Object.keys(cubBzPts).forEach(function (key3) {\r\n                                    //console.log(key3, cubBzPts[key3]);\r\n                                    var ptObj = {};\r\n                                    var cubBzPt = cubBzPts[key3];\r\n                                    var ptX = cubBzPt[\"attrs\", \"x\"];\r\n                                    var ptY = cubBzPt[\"attrs\", \"y\"];\r\n                                    var ptOrdr = cubBzPt[\"attrs\", \"order\"];\r\n                                    ptObj.type = \"cubicBezTo\";\r\n                                    ptObj.order = ptOrdr;\r\n                                    ptObj.x = ptX;\r\n                                    ptObj.y = ptY;\r\n                                    sortblAry.push(ptObj);\r\n                                });\r\n                            });\r\n                        }\r\n                    });\r\n                }\r\n                if (arcToNodes !== undefined) {\r\n                    var arcToNodesAttrs = arcToNodes[\"attrs\"];\r\n                    var arcOrder = arcToNodesAttrs[\"order\"];\r\n                    var hR = arcToNodesAttrs[\"hR\"];\r\n                    var wR = arcToNodesAttrs[\"wR\"];\r\n                    var stAng = arcToNodesAttrs[\"stAng\"];\r\n                    var swAng = arcToNodesAttrs[\"swAng\"];\r\n                    var shftX = 0;\r\n                    var shftY = 0;\r\n                    var arcToPtNode = getTextByPathList(arcToNodes, [\"a:pt\", \"attrs\"]);\r\n                    if (arcToPtNode !== undefined) {\r\n                        shftX = arcToPtNode[\"x\"];\r\n                        shftY = arcToPtNode[\"y\"];\r\n                        //console.log(\"shftX: \",shftX,\" shftY: \",shftY)\r\n                    }\r\n                    var ptObj = {};\r\n                    ptObj.type = \"arcTo\";\r\n                    ptObj.order = arcOrder;\r\n                    ptObj.hR = hR;\r\n                    ptObj.wR = wR;\r\n                    ptObj.stAng = stAng;\r\n                    ptObj.swAng = swAng;\r\n                    ptObj.shftX = shftX;\r\n                    ptObj.shftY = shftY;\r\n                    sortblAry.push(ptObj);\r\n\r\n                }\r\n                var sortByOrder = sortblAry.slice(0);\r\n                sortByOrder.sort(function (a, b) {\r\n                    return a.order - b.order;\r\n                });\r\n                //console.log(sortByOrder);\r\n                var k = 0;\r\n                while (k < sortByOrder.length) {\r\n                    if (sortByOrder[k].type == \"lnto\") {\r\n                        var Lx = parseInt(sortByOrder[k].x) * 96 / 914400;\r\n                        var Ly = parseInt(sortByOrder[k].y) * 96 / 914400;\r\n                        d += \"L\" + Lx + \",\" + Ly;\r\n                        k++;\r\n                    } else if (sortByOrder[k].type == \"cubicBezTo\") {\r\n                        var Cx1 = parseInt(sortByOrder[k].x) * 96 / 914400;\r\n                        var Cy1 = parseInt(sortByOrder[k].y) * 96 / 914400;\r\n                        var Cx2 = parseInt(sortByOrder[k + 1].x) * 96 / 914400;\r\n                        var Cy2 = parseInt(sortByOrder[k + 1].y) * 96 / 914400;\r\n                        var Cx3 = parseInt(sortByOrder[k + 2].x) * 96 / 914400;\r\n                        var Cy3 = parseInt(sortByOrder[k + 2].y) * 96 / 914400;\r\n\r\n                        d += \"C\" + Cx1 + \",\" + Cy1 + \" \" + Cx2 + \",\" + Cy2 + \" \" + Cx3 + \",\" + Cy3;\r\n                        k += 3;\r\n                    } else if (sortByOrder[k].type == \"arcTo\") {\r\n                        var hR = parseInt(sortByOrder[k].hR) * 96 / 914400;\r\n                        var wR = parseInt(sortByOrder[k].wR) * 96 / 914400;\r\n                        var stAng = parseInt(sortByOrder[k].stAng) / 60000;\r\n                        var swAng = parseInt(sortByOrder[k].swAng) / 60000;\r\n                        //var shftX = parseInt(sortByOrder[k].shftX) * 96 / 914400;\r\n                        //var shftY = parseInt(sortByOrder[k].shftY) * 96 / 914400;\r\n                        var endAng = stAng + swAng;\r\n\r\n                        d += shapeArc(wR, hR, wR, hR, stAng, endAng, false);\r\n                        k++;\r\n                    }\r\n                }\r\n                result += \"<path d='\" + d + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                    \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' \";\r\n                if (closeNode !== undefined) {\r\n                    //console.log(\"Close shape\");\r\n                    result += \"/>\";\r\n                } else {\r\n                    //console.log(\"Open shape\");\r\n                    //check and add \"marker-start\" and \"marker-end\"\r\n                    if (headEndNodeAttrs !== undefined && (headEndNodeAttrs[\"type\"] === \"triangle\" || headEndNodeAttrs[\"type\"] === \"arrow\")) {\r\n                        result += \"marker-start='url(#markerTriangle_\" + shpId + \")' \";\r\n                    }\r\n                    if (tailEndNodeAttrs !== undefined && (tailEndNodeAttrs[\"type\"] === \"triangle\" || tailEndNodeAttrs[\"type\"] === \"arrow\")) {\r\n                        result += \"marker-end='url(#markerTriangle_\" + shpId + \")' \";\r\n                    }\r\n                    result += \"/>\";\r\n\r\n                }\r\n\r\n                result += \"</svg>\";\r\n\r\n                result += \"<div class='block content \" + getVerticalAlign(node, slideLayoutSpNode, slideMasterSpNode, type) +\r\n                    \"' _id='\" + id + \"' _idx='\" + idx + \"' _type='\" + type + \"' _name='\" + name +\r\n                    \"' style='\" +\r\n                    getPosition(slideXfrmNode, slideLayoutXfrmNode, slideMasterXfrmNode) +\r\n                    getSize(slideXfrmNode, slideLayoutXfrmNode, slideMasterXfrmNode) +\r\n                    \" z-index: \" + order + \";\" +\r\n                    \"transform: rotate(\" + txtRotate + \"deg);\" +\r\n                    \"'>\";\r\n\r\n                // TextBody\r\n                if (node[\"p:txBody\"] !== undefined) {\r\n                    result += genTextBody(node[\"p:txBody\"], node, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                }\r\n                result += \"</div>\";\r\n\r\n                // result = \"\";\r\n            } else {\r\n\r\n                result += \"<div class='block content \" + getVerticalAlign(node, slideLayoutSpNode, slideMasterSpNode, type) +\r\n                    \"' _id='\" + id + \"' _idx='\" + idx + \"' _type='\" + type + \"' _name='\" + name +\r\n                    \"' style='\" +\r\n                    getPosition(slideXfrmNode, slideLayoutXfrmNode, slideMasterXfrmNode) +\r\n                    getSize(slideXfrmNode, slideLayoutXfrmNode, slideMasterXfrmNode) +\r\n                    getBorder(node, false, \"shape\") +\r\n                    getShapeFill(node, false, warpObj) +\r\n                    \" z-index: \" + order + \";\" +\r\n                    \"transform: rotate(\" + txtRotate + \"deg);\" +\r\n                    \"'>\";\r\n\r\n                // TextBody\r\n                if (node[\"p:txBody\"] !== undefined) {\r\n                    result += genTextBody(node[\"p:txBody\"], node, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                }\r\n                result += \"</div>\";\r\n\r\n            }\r\n\r\n            return result;\r\n        }\r\n        function shapeStar(adj, starNum) {\r\n            var innerRadius = adj; /*1-100*/\r\n            var outerRadius = 100;//star.outerRadius;\r\n            var numPoints = starNum;/*1-100*/\r\n            var center = Math.max(innerRadius, outerRadius);\r\n            var angle = Math.PI / numPoints;\r\n            var points = [];\r\n\r\n            for (var i = 0; i < numPoints * 2; i++) {\r\n                var radius = i & 1 ? innerRadius : outerRadius;\r\n                points.push(center + radius * Math.sin(i * angle));\r\n                points.push(center - radius * Math.cos(i * angle));\r\n            }\r\n\r\n            return points;\r\n        }\r\n        function shapePie(H, w, adj1, adj2, isClose) {\r\n            var pieVal = parseInt(adj2);\r\n            var piAngle = parseInt(adj1);\r\n            var size = parseInt(H),\r\n                radius = (size / 2),\r\n                value = pieVal - piAngle;\r\n            if (value < 0) {\r\n                value = 360 + value;\r\n            }\r\n            //console.log(\"value: \",value)      \r\n            value = Math.min(Math.max(value, 0), 360);\r\n\r\n            //calculate x,y coordinates of the point on the circle to draw the arc to. \r\n            var x = Math.cos((2 * Math.PI) / (360 / value));\r\n            var y = Math.sin((2 * Math.PI) / (360 / value));\r\n\r\n\r\n            //d is a string that describes the path of the slice.\r\n            var longArc, d, rot;\r\n            if (isClose) {\r\n                longArc = (value <= 180) ? 0 : 1;\r\n                d = \"M\" + radius + \",\" + radius + \" L\" + radius + \",\" + 0 + \" A\" + radius + \",\" + radius + \" 0 \" + longArc + \",1 \" + (radius + y * radius) + \",\" + (radius - x * radius) + \" z\";\r\n                rot = \"rotate(\" + (piAngle - 270) + \", \" + radius + \", \" + radius + \")\";\r\n            } else {\r\n                longArc = (value <= 180) ? 0 : 1;\r\n                var radius1 = radius;\r\n                var radius2 = w / 2;\r\n                d = \"M\" + radius1 + \",\" + 0 + \" A\" + radius2 + \",\" + radius1 + \" 0 \" + longArc + \",1 \" + (radius2 + y * radius2) + \",\" + (radius1 - x * radius1);\r\n                rot = \"rotate(\" + (piAngle + 90) + \", \" + radius + \", \" + radius + \")\";\r\n            }\r\n\r\n            return [d, rot];\r\n        }\r\n        function shapeGear(w, h, points) {\r\n            var innerRadius = h;//gear.innerRadius;\r\n            var outerRadius = 1.5 * innerRadius;\r\n            var cx = outerRadius;//Math.max(innerRadius, outerRadius),                   // center x\r\n            cy = outerRadius;//Math.max(innerRadius, outerRadius),                    // center y\r\n            notches = points,//gear.points,                      // num. of notches\r\n                radiusO = outerRadius,                    // outer radius\r\n                radiusI = innerRadius,                    // inner radius\r\n                taperO = 50,                     // outer taper %\r\n                taperI = 35,                     // inner taper %\r\n\r\n                // pre-calculate values for loop\r\n\r\n                pi2 = 2 * Math.PI,            // cache 2xPI (360deg)\r\n                angle = pi2 / (notches * 2),    // angle between notches\r\n                taperAI = angle * taperI * 0.005, // inner taper offset (100% = half notch)\r\n                taperAO = angle * taperO * 0.005, // outer taper offset\r\n                a = angle,                  // iterator (angle)\r\n                toggle = false;\r\n            // move to starting point\r\n            var d = \" M\" + (cx + radiusO * Math.cos(taperAO)) + \" \" + (cy + radiusO * Math.sin(taperAO));\r\n\r\n            // loop\r\n            for (; a <= pi2 + angle; a += angle) {\r\n                // draw inner to outer line\r\n                if (toggle) {\r\n                    d += \" L\" + (cx + radiusI * Math.cos(a - taperAI)) + \",\" + (cy + radiusI * Math.sin(a - taperAI));\r\n                    d += \" L\" + (cx + radiusO * Math.cos(a + taperAO)) + \",\" + (cy + radiusO * Math.sin(a + taperAO));\r\n                } else { // draw outer to inner line\r\n                    d += \" L\" + (cx + radiusO * Math.cos(a - taperAO)) + \",\" + (cy + radiusO * Math.sin(a - taperAO)); // outer line\r\n                    d += \" L\" + (cx + radiusI * Math.cos(a + taperAI)) + \",\" + (cy + radiusI * Math.sin(a + taperAI));// inner line\r\n\r\n                }\r\n                // switch level\r\n                toggle = !toggle;\r\n            }\r\n            // close the final line\r\n            d += \" \";\r\n            return d;\r\n        }\r\n        function shapeArc(cX, cY, rX, rY, stAng, endAng, isClose) {\r\n            var dData;\r\n            var angle = stAng;\r\n            if (endAng >= stAng) {\r\n                while (angle <= endAng) {\r\n                    var radians = angle * (Math.PI / 180);  // convert degree to radians\r\n                    var x = cX + Math.cos(radians) * rX;\r\n                    var y = cY + Math.sin(radians) * rY;\r\n                    if (angle == stAng) {\r\n                        dData = \" M\" + x + \" \" + y;\r\n                    }\r\n                    dData += \" L\" + x + \" \" + y;\r\n                    angle++;\r\n                }\r\n            } else {\r\n                while (angle > endAng) {\r\n                    var radians = angle * (Math.PI / 180);  // convert degree to radians\r\n                    var x = cX + Math.cos(radians) * rX;\r\n                    var y = cY + Math.sin(radians) * rY;\r\n                    if (angle == stAng) {\r\n                        dData = \" M \" + x + \" \" + y;\r\n                    }\r\n                    dData += \" L \" + x + \" \" + y;\r\n                    angle--;\r\n                }\r\n            }\r\n            dData += (isClose ? \" z\" : \"\");\r\n            return dData;\r\n        }\r\n        function shapeSnipRoundRect(w, h, adj1, adj2, shapeType, adjType) {\r\n            /* \r\n            shapeType: snip,round\r\n            adjType: cornr1,cornr2,cornrAll,diag\r\n            */\r\n            var adjA, adjB, adjC, adjD;\r\n            if (adjType == \"cornr1\") {\r\n                adjA = 0;\r\n                adjB = 0;\r\n                adjC = 0;\r\n                adjD = adj1;\r\n            } else if (adjType == \"cornr2\") {\r\n                adjA = adj1;\r\n                adjB = adj2;\r\n                adjC = adj2;\r\n                adjD = adj1;\r\n            } else if (adjType == \"cornrAll\") {\r\n                adjA = adj1;\r\n                adjB = adj1;\r\n                adjC = adj1;\r\n                adjD = adj1;\r\n            } else if (adjType == \"diag\") {\r\n                adjA = adj1;\r\n                adjB = adj2;\r\n                adjC = adj1;\r\n                adjD = adj2;\r\n            }\r\n            //d is a string that describes the path of the slice.\r\n            var d;\r\n            if (shapeType == \"round\") {\r\n                d = \"M0\" + \",\" + (h / 2 + (1 - adjB) * (h / 2)) + \" Q\" + 0 + \",\" + h + \" \" + adjB * (w / 2) + \",\" + h + \" L\" + (w / 2 + (1 - adjC) * (w / 2)) + \",\" + h +\r\n                    \" Q\" + w + \",\" + h + \" \" + w + \",\" + (h / 2 + (h / 2) * (1 - adjC)) + \"L\" + w + \",\" + (h / 2) * adjD +\r\n                    \" Q\" + w + \",\" + 0 + \" \" + (w / 2 + (w / 2) * (1 - adjD)) + \",0 L\" + (w / 2) * adjA + \",0\" +\r\n                    \" Q\" + 0 + \",\" + 0 + \" 0,\" + (h / 2) * (adjA) + \" z\";\r\n            } else if (shapeType == \"snip\") {\r\n                d = \"M0\" + \",\" + adjA * (h / 2) + \" L0\" + \",\" + (h / 2 + (h / 2) * (1 - adjB)) + \"L\" + adjB * (w / 2) + \",\" + h +\r\n                    \" L\" + (w / 2 + (w / 2) * (1 - adjC)) + \",\" + h + \"L\" + w + \",\" + (h / 2 + (h / 2) * (1 - adjC)) +\r\n                    \" L\" + w + \",\" + adjD * (h / 2) + \"L\" + (w / 2 + (w / 2) * (1 - adjD)) + \",0 L\" + ((w / 2) * adjA) + \",0 z\";\r\n            }\r\n            return d;\r\n        }\r\n        /*\r\n        function shapePolygon(sidesNum) {\r\n            var sides  = sidesNum;\r\n            var radius = 100;\r\n            var angle  = 2 * Math.PI / sides;\r\n            var points = []; \r\n            \r\n            for (var i = 0; i < sides; i++) {\r\n                points.push(radius + radius * Math.sin(i * angle));\r\n                points.push(radius - radius * Math.cos(i * angle));\r\n            }\r\n            \r\n            return points;\r\n        }\r\n        */\r\n        function processPicNode(node, warpObj) {\r\n            var rtrnData = \"\";\r\n            var mediaPicFlag = false;\r\n            var order = node[\"attrs\"][\"order\"];\r\n\r\n            var rid = node[\"p:blipFill\"][\"a:blip\"][\"attrs\"][\"r:embed\"];\r\n            var imgName = warpObj[\"slideResObj\"][rid][\"target\"];\r\n            var imgFileExt = extractFileExtension(imgName).toLowerCase();\r\n            var zip = warpObj[\"zip\"];\r\n            var imgArrayBuffer = zip.file(imgName).asArrayBuffer();\r\n            var mimeType = \"\";\r\n            var xfrmNode = node[\"p:spPr\"][\"a:xfrm\"];\r\n            ///////////////////////////////////////Amir//////////////////////////////\r\n            var rotate = 0;\r\n            var rotateNode = getTextByPathList(node, [\"p:spPr\", \"a:xfrm\", \"attrs\", \"rot\"]);\r\n            if (rotateNode !== undefined) {\r\n                rotate = angleToDegrees(rotateNode);\r\n            }\r\n            //video\r\n            var vdoNode = getTextByPathList(node, [\"p:nvPicPr\", \"p:nvPr\", \"a:videoFile\"]);\r\n            var vdoRid, vdoFile, vdoFileExt, vdoMimeType, uInt8Array, blob, vdoBlob, mediaSupportFlag = false;\r\n            var mediaProcess = settings.mediaProcess;\r\n            if (vdoNode !== undefined & mediaProcess) {\r\n                vdoRid = vdoNode[\"attrs\"][\"r:link\"];\r\n                vdoFile = warpObj[\"slideResObj\"][vdoRid][\"target\"];\r\n                uInt8Array = zip.file(vdoFile).asArrayBuffer();\r\n                vdoFileExt = extractFileExtension(vdoFile).toLowerCase();\r\n                if (vdoFileExt == \"mp4\" || vdoFileExt == \"webm\" || vdoFileExt == \"ogg\") {\r\n                    vdoMimeType = getMimeType(vdoFileExt);\r\n                    blob = new Blob([uInt8Array], {\r\n                        type: vdoMimeType\r\n                    });\r\n                    vdoBlob = URL.createObjectURL(blob);\r\n                    mediaSupportFlag = true;\r\n                    mediaPicFlag = true;\r\n                }\r\n            }\r\n            //Audio\r\n            var audioNode = getTextByPathList(node, [\"p:nvPicPr\", \"p:nvPr\", \"a:audioFile\"]);\r\n            var audioRid, audioFile, audioFileExt, audioMimeType, uInt8ArrayAudio, blobAudio, audioBlob;\r\n            var audioPlayerFlag = false;\r\n            var audioObjc;\r\n            if (audioNode !== undefined & mediaProcess) {\r\n                audioRid = audioNode[\"attrs\"][\"r:link\"];\r\n                audioFile = warpObj[\"slideResObj\"][audioRid][\"target\"];\r\n                audioFileExt = extractFileExtension(audioFile).toLowerCase();\r\n                if (audioFileExt == \"mp3\" || audioFileExt == \"wav\" || audioFileExt == \"ogg\") {\r\n                    uInt8ArrayAudio = zip.file(audioFile).asArrayBuffer();\r\n                    blobAudio = new Blob([uInt8ArrayAudio]);\r\n                    audioBlob = URL.createObjectURL(blobAudio);\r\n                    var cx = parseInt(xfrmNode[\"a:ext\"][\"attrs\"][\"cx\"]) * 20;\r\n                    var cy = xfrmNode[\"a:ext\"][\"attrs\"][\"cy\"];\r\n                    var x = parseInt(xfrmNode[\"a:off\"][\"attrs\"][\"x\"]) / 2.5;\r\n                    var y = xfrmNode[\"a:off\"][\"attrs\"][\"y\"];\r\n                    audioObjc = {\r\n                        \"a:ext\": {\r\n                            \"attrs\": {\r\n                                \"cx\": cx,\r\n                                \"cy\": cy\r\n                            }\r\n                        },\r\n                        \"a:off\": {\r\n                            \"attrs\": {\r\n                                \"x\": x,\r\n                                \"y\": y\r\n\r\n                            }\r\n                        }\r\n                    }\r\n                    audioPlayerFlag = true;\r\n                    mediaSupportFlag = true;\r\n                    mediaPicFlag = true;\r\n                }\r\n            }\r\n            //console.log(node)\r\n            //////////////////////////////////////////////////////////////////////////\r\n            mimeType = getMimeType(imgFileExt);\r\n            rtrnData = \"<div class='block content' style='\" +\r\n                ((mediaProcess && audioPlayerFlag) ? getPosition(audioObjc, undefined, undefined) : getPosition(xfrmNode, undefined, undefined)) +\r\n                ((mediaProcess && audioPlayerFlag) ? getSize(audioObjc, undefined, undefined) : getSize(xfrmNode, undefined, undefined)) +\r\n                \" z-index: \" + order + \";\" +\r\n                \"transform: rotate(\" + rotate + \"deg);'>\";\r\n            if ((vdoNode === undefined && audioNode === undefined) || !mediaProcess || !mediaSupportFlag) {\r\n                rtrnData += \"<img src='data:\" + mimeType + \";base64,\" + base64ArrayBuffer(imgArrayBuffer) + \"' style='width: 100%; height: 100%'/>\";\r\n            } else if ((vdoNode !== undefined || audioNode !== undefined) && mediaProcess && mediaSupportFlag) {\r\n                if (vdoNode !== undefined) {\r\n                    rtrnData += \"<video  src='\" + vdoBlob + \"' controls style='width: 100%; height: 100%'>Your browser does not support the video tag.</video>\";\r\n                }\r\n                if (audioNode !== undefined) {\r\n                    rtrnData += '<audio id=\"audio_player\" controls ><source src=\"' + audioBlob + '\"></audio>';\r\n                    //'<button onclick=\"audio_player.play()\">Play</button>'+\r\n                    //'<button onclick=\"audio_player.pause()\">Pause</button>';\r\n                }\r\n            }\r\n            if (!mediaSupportFlag && mediaPicFlag) {\r\n                rtrnData += \"<span style='color:red;font-size:40px;position: absolute;'>This media file Not supported by HTML5</span>\";\r\n            }\r\n            if ((vdoNode !== undefined || audioNode !== undefined) && !mediaProcess && mediaSupportFlag) {\r\n                console.log(\"Founded supported media file but media process disabled (mediaProcess=false)\");\r\n            }\r\n            rtrnData += \"</div>\";\r\n            //console.log(rtrnData)\r\n            return rtrnData;\r\n        }\r\n\r\n        function processGraphicFrameNode(node, warpObj) {\r\n\r\n            var result = \"\";\r\n            var graphicTypeUri = getTextByPathList(node, [\"a:graphic\", \"a:graphicData\", \"attrs\", \"uri\"]);\r\n\r\n            switch (graphicTypeUri) {\r\n                case \"http://schemas.openxmlformats.org/drawingml/2006/table\":\r\n                    result = genTable(node, warpObj);\r\n                    break;\r\n                case \"http://schemas.openxmlformats.org/drawingml/2006/chart\":\r\n                    result = genChart(node, warpObj);\r\n                    break;\r\n                case \"http://schemas.openxmlformats.org/drawingml/2006/diagram\":\r\n                    result = genDiagram(node, warpObj);\r\n                    break;\r\n                default:\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        function processSpPrNode(node, warpObj) {\r\n\r\n            /*\r\n            * 2241 <xsd:complexType name=\"CT_ShapeProperties\">\r\n            * 2242   <xsd:sequence>\r\n            * 2243     <xsd:element name=\"xfrm\" type=\"CT_Transform2D\"  minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            * 2244     <xsd:group   ref=\"EG_Geometry\"                  minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            * 2245     <xsd:group   ref=\"EG_FillProperties\"            minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            * 2246     <xsd:element name=\"ln\" type=\"CT_LineProperties\" minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            * 2247     <xsd:group   ref=\"EG_EffectProperties\"          minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            * 2248     <xsd:element name=\"scene3d\" type=\"CT_Scene3D\"   minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            * 2249     <xsd:element name=\"sp3d\" type=\"CT_Shape3D\"      minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            * 2250     <xsd:element name=\"extLst\" type=\"CT_OfficeArtExtensionList\" minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            * 2251   </xsd:sequence>\r\n            * 2252   <xsd:attribute name=\"bwMode\" type=\"ST_BlackWhiteMode\" use=\"optional\"/>\r\n            * 2253 </xsd:complexType>\r\n            */\r\n\r\n            // TODO:\r\n        }\r\n\r\n        function genTextBody(textBodyNode, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj) {\r\n\r\n\r\n            var text = \"\";\r\n            var slideMasterTextStyles = warpObj[\"slideMasterTextStyles\"];\r\n\r\n            if (textBodyNode === undefined) {\r\n                return text;\r\n            }\r\n            //rtl : <p:txBody>\r\n            //          <a:bodyPr wrap=\"square\" rtlCol=\"1\">\r\n\r\n            //var rtlStr = \"\";\r\n            if (textBodyNode[\"a:p\"].constructor === Array) {\r\n                // multi p\r\n                for (var i = 0; i < textBodyNode[\"a:p\"].length; i++) {\r\n                    var pNode = textBodyNode[\"a:p\"][i];\r\n                    var rNode = pNode[\"a:r\"];\r\n\r\n                    //var isRTL = getTextDirection(pNode, type, slideMasterTextStyles);\r\n                    //rtlStr = \"\";//\"dir='\"+isRTL+\"'\";\r\n\r\n                    text += \"<div  class='\" + getHorizontalAlign(pNode, slideLayoutSpNode, slideMasterSpNode, type, slideMasterTextStyles) + \"'>\";\r\n                    text += genBuChar(pNode, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n\r\n                    if (rNode === undefined) {\r\n                        // without r\r\n                        text += genSpanElement(pNode, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                    } else if (rNode.constructor === Array) {\r\n                        // with multi r\r\n                        for (var j = 0; j < rNode.length; j++) {\r\n                            text += genSpanElement(rNode[j], spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                            //////////////////Amir////////////\r\n                            if (pNode[\"a:br\"] !== undefined) {\r\n                                text += \"<br>\";\r\n                            }\r\n                            //////////////////////////////////                    \r\n                        }\r\n                    } else {\r\n                        // with one r\r\n                        text += genSpanElement(rNode, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                    }\r\n                    text += \"</div>\";\r\n                }\r\n            } else {\r\n                // one p\r\n                var pNode = textBodyNode[\"a:p\"];\r\n                var rNode = pNode[\"a:r\"];\r\n\r\n                //var isRTL = getTextDirection(pNode, type, slideMasterTextStyles);\r\n                //rtlStr = \"\";//\"dir='\"+isRTL+\"'\";\r\n\r\n                text += \"<div class='slide-prgrph \" + getHorizontalAlign(pNode, slideLayoutSpNode, slideMasterSpNode, type, slideMasterTextStyles) + \"'>\";\r\n                text += genBuChar(pNode, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                if (rNode === undefined) {\r\n                    // without r\r\n                    text += genSpanElement(pNode, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                } else if (rNode.constructor === Array) {\r\n                    // with multi r\r\n                    for (var j = 0; j < rNode.length; j++) {\r\n                        text += genSpanElement(rNode[j], spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                        //////////////////Amir////////////\r\n                        if (pNode[\"a:br\"] !== undefined) {\r\n                            text += \"<br>\";\r\n                        }\r\n                        //////////////////////////////////\r\n                    }\r\n                } else {\r\n                    // with one r\r\n                    text += genSpanElement(rNode, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                }\r\n                text += \"</div>\";\r\n            }\r\n\r\n            return text;\r\n        }\r\n\r\n        function genBuChar(node, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj) {\r\n            ///////////////////////////////////////Amir///////////////////////////////\r\n            var sldMstrTxtStyles = warpObj[\"slideMasterTextStyles\"];\r\n\r\n            var rNode = getTextByPathList(node, [\"a:r\"]);\r\n            if (rNode !== undefined && rNode.constructor === Array) {\r\n                rNode = rNode[0];\r\n            }\r\n            var dfltBultColor, dfltBultSize, bultColor, bultSize;\r\n            if (rNode !== undefined) {\r\n                dfltBultColor = getFontColorPr(rNode, spNode, type, sldMstrTxtStyles)[0];\r\n                dfltBultSize = getFontSize(rNode, slideLayoutSpNode, slideMasterSpNode, type, sldMstrTxtStyles);\r\n            } else {\r\n                dfltBultColor = getFontColorPr(node, spNode, type, sldMstrTxtStyles)[0];\r\n                dfltBultSize = getFontSize(node, slideLayoutSpNode, slideMasterSpNode, type, sldMstrTxtStyles);\r\n            }\r\n            //console.log(\"Bullet Size: \" + bultSize);\r\n\r\n            var bullet = \"\";\r\n            /////////////////////////////////////////////////////////////////\r\n\r\n\r\n            var pPrNode = node[\"a:pPr\"];\r\n\r\n            //////////////////cheke if is rtl ///Amir ////////////////////////////////////\r\n            var getRtlVal = getTextByPathList(pPrNode, [\"attrs\", \"rtl\"])\r\n            var isRTL = false;\r\n            if (getRtlVal !== undefined && getRtlVal == \"1\") {\r\n                isRTL = true;\r\n            }\r\n            ////////////////////////////////////////////////////////////\r\n\r\n            var lvl = parseInt(getTextByPathList(pPrNode, [\"attrs\", \"lvl\"]));\r\n            if (isNaN(lvl)) {\r\n                lvl = 0;\r\n            }\r\n\r\n            var buChar = getTextByPathList(pPrNode, [\"a:buChar\", \"attrs\", \"char\"]);\r\n            /////////////////////////////////Amir///////////////////////////////////\r\n            var buType = \"TYPE_NONE\";\r\n            var buNum = getTextByPathList(pPrNode, [\"a:buAutoNum\", \"attrs\", \"type\"]);\r\n            var buPic = getTextByPathList(pPrNode, [\"a:buBlip\"]);\r\n            if (buChar !== undefined) {\r\n                buType = \"TYPE_BULLET\";\r\n                // console.log(\"Bullet Chr to code: \" + buChar.charCodeAt(0));\r\n            }\r\n            if (buNum !== undefined) {\r\n                buType = \"TYPE_NUMERIC\";\r\n            }\r\n            if (buPic !== undefined) {\r\n                buType = \"TYPE_BULPIC\";\r\n            }\r\n\r\n            if (buType != \"TYPE_NONE\") {\r\n                var buFontAttrs = getTextByPathList(pPrNode, [\"a:buFont\", \"attrs\"]);\r\n            }\r\n            //console.log(\"Bullet Type: \" + buType);\r\n            //console.log(\"NumericTypr: \" + buNum);\r\n            //console.log(\"buChar: \" + (buChar === undefined?'':buChar.charCodeAt(0)));\r\n            //get definde bullet COLOR\r\n            var buClrNode = getTextByPathList(pPrNode, [\"a:buClr\"]);\r\n            var defBultColor = \"NoNe\";\r\n            if (buClrNode !== undefined) {\r\n                defBultColor = getSolidFill(buClrNode);\r\n            } else {\r\n                // console.log(\"buClrNode: \" + buClrNode);\r\n            }\r\n\r\n            if (defBultColor == \"NoNe\") {\r\n                bultColor = dfltBultColor;\r\n            } else {\r\n                bultColor = \"#\" + defBultColor;\r\n            }\r\n            //get definde bullet SIZE\r\n            var buFontSize;\r\n            buFontSize = getTextByPathList(pPrNode, [\"a:buSzPts\", \"attrs\", \"val\"]); //pt\r\n            if (buFontSize !== undefined) {\r\n                bultSize = parseInt(buFontSize) / 100 + \"pt\";\r\n            } else {\r\n                buFontSize = getTextByPathList(pPrNode, [\"a:buSzPct\", \"attrs\", \"val\"]);\r\n                if (buFontSize !== undefined) {\r\n                    var prcnt = parseInt(buFontSize) / 100000;\r\n                    //dfltBultSize = XXpt\r\n                    var dfltBultSizeNoPt = dfltBultSize.substr(0, dfltBultSize.length - 2);\r\n                    bultSize = prcnt * (parseInt(dfltBultSizeNoPt)) + \"pt\";\r\n                } else {\r\n                    bultSize = dfltBultSize;\r\n                }\r\n            }\r\n            ////////////////////////////////////////////////////////////////////////\r\n            if (buType == \"TYPE_BULLET\") {\r\n                //var buFontAttrs = getTextByPathList(pPrNode, [\"a:buFont\", \"attrs\"]);\r\n                if (buFontAttrs !== undefined) {\r\n                    var marginLeft = parseInt(getTextByPathList(pPrNode, [\"attrs\", \"marL\"])) * 96 / 914400;\r\n                    var marginRight = parseInt(buFontAttrs[\"pitchFamily\"]);\r\n                    if (isNaN(marginLeft)) {\r\n                        marginLeft = 328600 * 96 / 914400;\r\n                    }\r\n                    if (isNaN(marginRight)) {\r\n                        marginRight = 0;\r\n                    }\r\n                    var typeface = buFontAttrs[\"typeface\"];\r\n\r\n                    bullet = \"<span style='font-family: \" + typeface +\r\n                        \"; margin-left: \" + marginLeft * lvl + \"px\" +\r\n                        \"; margin-right: \" + marginRight + \"px\" +\r\n                        \";color:\" + bultColor +\r\n                        \";font-size:\" + bultSize + \";\";\r\n                    if (isRTL) {\r\n                        bullet += \" float: right;  direction:rtl\";\r\n                    }\r\n                    bullet += \"'>\" + buChar + \"</span>\";\r\n                } else {\r\n                    marginLeft = 328600 * 96 / 914400 * lvl;\r\n\r\n                    bullet = \"<span style='margin-left: \" + marginLeft + \"px;'>\" + buChar + \"</span>\";\r\n                }\r\n            } else if (buType == \"TYPE_NUMERIC\") { ///////////Amir///////////////////////////////\r\n                if (buFontAttrs !== undefined) {\r\n                    var marginLeft = parseInt(getTextByPathList(pPrNode, [\"attrs\", \"marL\"])) * 96 / 914400;\r\n                    var marginRight = parseInt(buFontAttrs[\"pitchFamily\"]);\r\n\r\n                    if (isNaN(marginLeft)) {\r\n                        marginLeft = 328600 * 96 / 914400;\r\n                    }\r\n                    if (isNaN(marginRight)) {\r\n                        marginRight = 0;\r\n                    }\r\n                    //var typeface = buFontAttrs[\"typeface\"];\r\n\r\n                    bullet = \"<span style='margin-left: \" + marginLeft * lvl + \"px\" +\r\n                        \"; margin-right: \" + marginRight + \"px\" +\r\n                        \";color:\" + bultColor +\r\n                        \";font-size:\" + bultSize + \";\";\r\n                    if (isRTL) {\r\n                        bullet += \" float: right; direction:rtl;\";\r\n                    } else {\r\n                        bullet += \" float: left; direction:ltr;\";\r\n                    }\r\n                    bullet += \"' data-bulltname = '\" + buNum + \"' data-bulltlvl = '\" + lvl + \"' class='numeric-bullet-style'></span>\";\r\n                } else {\r\n                    marginLeft = 328600 * 96 / 914400 * lvl;\r\n                    bullet = \"<span style='margin-left: \" + marginLeft + \"px;\";\r\n                    if (isRTL) {\r\n                        bullet += \" float: right; direction:rtl;\";\r\n                    } else {\r\n                        bullet += \" float: left; direction:ltr;\";\r\n                    }\r\n                    bullet += \"' data-bulltname = '\" + buNum + \"' data-bulltlvl = '\" + lvl + \"' class='numeric-bullet-style'></span>\";\r\n                }\r\n\r\n            } else if (buType == \"TYPE_BULPIC\") { //PIC BULLET\r\n                var marginLeft = parseInt(getTextByPathList(pPrNode, [\"attrs\", \"marL\"])) * 96 / 914400;\r\n                var marginRight = parseInt(getTextByPathList(pPrNode, [\"attrs\", \"marR\"])) * 96 / 914400;\r\n\r\n                if (isNaN(marginRight)) {\r\n                    marginRight = 0;\r\n                }\r\n                //console.log(\"marginRight: \"+marginRight)\r\n                //buPic\r\n                if (isNaN(marginLeft)) {\r\n                    marginLeft = 328600 * 96 / 914400;\r\n                } else {\r\n                    marginLeft = 0;\r\n                }\r\n                //var buPicId = getTextByPathList(buPic, [\"a:blip\",\"a:extLst\",\"a:ext\",\"asvg:svgBlip\" , \"attrs\", \"r:embed\"]);\r\n                var buPicId = getTextByPathList(buPic, [\"a:blip\", \"attrs\", \"r:embed\"]);\r\n                var svgPicPath = \"\";\r\n                var buImg;\r\n                if (buPicId !== undefined) {\r\n                    //svgPicPath = warpObj[\"slideResObj\"][buPicId][\"target\"];\r\n                    //buImg = warpObj[\"zip\"].file(svgPicPath).asText();\r\n                    //}else{\r\n                    //buPicId = getTextByPathList(buPic, [\"a:blip\", \"attrs\", \"r:embed\"]);\r\n                    var imgPath = warpObj[\"slideResObj\"][buPicId][\"target\"];\r\n                    //console.log(\"imgPath: \", imgPath);\r\n                    var imgArrayBuffer = warpObj[\"zip\"].file(imgPath).asArrayBuffer();\r\n                    var imgExt = imgPath.split(\".\").pop();\r\n                    var imgMimeType = getMimeType(imgExt);\r\n                    buImg = \"<img src='data:\" + imgMimeType + \";base64,\" + base64ArrayBuffer(imgArrayBuffer) + \"' style='width: 100%; height: 100%'/>\"\r\n                    //console.log(\"imgPath: \"+imgPath+\"\\nimgMimeType: \"+imgMimeType)\r\n                }\r\n                if (buPicId === undefined) {\r\n                    buImg = \"&#8227;\";\r\n                }\r\n                bullet = \"<span style='margin-left: \" + marginLeft * lvl + \"px\" +\r\n                    \"; margin-right: \" + marginRight + \"px\" +\r\n                    \";width:\" + bultSize + \";display: inline-block; \";\r\n                if (isRTL) {\r\n                    bullet += \" float: right;direction:rtl\";\r\n                }\r\n                bullet += \"'>\" + buImg + \"  </span>\";\r\n                //////////////////////////////////////////////////////////////////////////////////////\r\n            } else {\r\n                bullet = \"<span style='margin-left: \" + 328600 * 96 / 914400 * lvl + \"px\" +\r\n                    \"; margin-right: \" + 0 + \"px;'></span>\";\r\n            }\r\n\r\n            return bullet;\r\n        }\r\n\r\n        function genSpanElement(node, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj) {\r\n\r\n            var slideMasterTextStyles = warpObj[\"slideMasterTextStyles\"];\r\n\r\n            var text = node[\"a:t\"];\r\n            if (typeof text !== 'string') {\r\n                text = getTextByPathList(node, [\"a:fld\", \"a:t\"]);\r\n                if (typeof text !== 'string') {\r\n                    text = \"&nbsp;\";\r\n                }\r\n            }\r\n            //console.log(\"genSpanElement: \",node)\r\n            //getFontColor\r\n            var fontClrPr = getFontColorPr(node, spNode, type, slideMasterTextStyles);\r\n            var styleText =\r\n                \"color:\" + fontClrPr[0] + \";\" +\r\n                \"text-shadow:\" + fontClrPr[1] + \";\" +\r\n                \"font-size:\" + getFontSize(node, slideLayoutSpNode, slideMasterSpNode, type, slideMasterTextStyles) + \";\" +\r\n                \"font-family:\" + getFontType(node, type, slideMasterTextStyles) + \";\" +\r\n                \"font-weight:\" + getFontBold(node, type, slideMasterTextStyles) + \";\" +\r\n                \"font-style:\" + getFontItalic(node, type, slideMasterTextStyles) + \";\" +\r\n                \"text-decoration:\" + getFontDecoration(node, type, slideMasterTextStyles) + \";\" +\r\n                \"text-align:\" + getTextHorizontalAlign(node, type, slideMasterTextStyles) + \";\" +\r\n                \"vertical-align:\" + getTextVerticalAlign(node, type, slideMasterTextStyles) + \";\";\r\n            //////////////////Amir///////////////\r\n            var highlight = getTextByPathList(node, [\"a:rPr\", \"a:highlight\"]);\r\n            if (highlight !== undefined) {\r\n                styleText += \"background-color:#\" + getSolidFill(highlight) + \";\";\r\n                styleText += \"Opacity:\" + getColorOpacity(highlight) + \";\";\r\n            }\r\n            ///////////////////////////////////////////\r\n            var cssName = \"\";\r\n\r\n            if (styleText in styleTable) {\r\n                cssName = styleTable[styleText][\"name\"];\r\n            } else {\r\n                cssName = \"_css_\" + (Object.keys(styleTable).length + 1);\r\n                styleTable[styleText] = {\r\n                    \"name\": cssName,\r\n                    \"text\": styleText\r\n                };\r\n            }\r\n\r\n            var linkID = getTextByPathList(node, [\"a:rPr\", \"a:hlinkClick\", \"attrs\", \"r:id\"]);\r\n            //get link colors : TODO\r\n            if (linkID !== undefined) {\r\n                var linkURL = warpObj[\"slideResObj\"][linkID][\"target\"];\r\n                linkURL = escapeHtml(linkURL);\r\n                return \"<span class='text-block \" + cssName + \"'><a href='\" + linkURL + \"' target='_blank'>\" + text.replace(/\\s/i, \"&nbsp;\") + \"</a></span>\";\r\n            } else {\r\n                return \"<span class='text-block \" + cssName + \"'>\" + text.replace(/\\s/i, \"&nbsp;\") + \"</span>\";\r\n            }\r\n\r\n        }\r\n\r\n        function genGlobalCSS() {\r\n            var cssText = \"\";\r\n            for (var key in styleTable) {\r\n                cssText += \"div .\" + styleTable[key][\"name\"] + \"{\" + styleTable[key][\"text\"] + \"}\\n\"; //section > div\r\n            }\r\n            return cssText;\r\n        }\r\n\r\n        function genTable(node, warpObj) {\r\n\r\n            var order = node[\"attrs\"][\"order\"];\r\n            var tableNode = getTextByPathList(node, [\"a:graphic\", \"a:graphicData\", \"a:tbl\"]);\r\n            var xfrmNode = getTextByPathList(node, [\"p:xfrm\"]);\r\n            /////////////////////////////////////////Amir////////////////////////////////////////////////\r\n            var getTblPr = getTextByPathList(node, [\"a:graphic\", \"a:graphicData\", \"a:tbl\", \"a:tblPr\"]);\r\n            var getColsGrid = getTextByPathList(node, [\"a:graphic\", \"a:graphicData\", \"a:tbl\", \"a:tblGrid\", \"a:gridCol\"]);\r\n            var tblDir = \"\";\r\n            if (getTblPr !== undefined) {\r\n                var isRTL = getTblPr[\"attrs\"][\"rtl\"];\r\n                tblDir = (isRTL == 1 ? \"dir=rtl\" : \"dir=ltr\");\r\n            }\r\n            var firstRowAttr = getTblPr[\"attrs\"][\"firstRow\"]; //associated element <a:firstRow> in the table styles\r\n            var firstColAttr = getTblPr[\"attrs\"][\"firstCol\"]; //associated element <a:firstCol> in the table styles\r\n            var lastRowAttr = getTblPr[\"attrs\"][\"lastRow\"]; //associated element <a:lastRow> in the table styles\r\n            var lastColAttr = getTblPr[\"attrs\"][\"lastCol\"]; //associated element <a:lastCol> in the table styles\r\n            var bandRowAttr = getTblPr[\"attrs\"][\"bandRow\"]; //associated element <a:band1H>, <a:band2H> in the table styles\r\n            var bandColAttr = getTblPr[\"attrs\"][\"bandCol\"]; //associated element <a:band1V>, <a:band2V> in the table styles\r\n            //console.log(firstColAttr);\r\n            ////////////////////////////////////////////////////////////////////////////////////////////\r\n            var tableHtml = \"<table \" + tblDir + \" style='border-collapse: collapse;\" + getPosition(xfrmNode, undefined, undefined) + getSize(xfrmNode, undefined, undefined) + \" z-index: \" + order + \";'>\";\r\n\r\n            var trNodes = tableNode[\"a:tr\"];\r\n            if (trNodes.constructor === Array) {\r\n                for (var i = 0; i < trNodes.length; i++) {\r\n                    //////////////rows Style ////////////Amir\r\n                    var rowHeightParam = trNodes[i][\"attrs\"][\"h\"];\r\n                    var rowHeight = 0;\r\n                    var rowsStyl = \"\";\r\n                    if (rowHeightParam !== undefined) {\r\n                        rowHeight = parseInt(rowHeightParam) * 96 / 914400;\r\n                        rowsStyl += \"height:\" + rowHeight + \"px;\";\r\n                        //tableHtml += \"<tr style='height:\"+rowHeight+\"px;'>\";\r\n                    }\r\n\r\n                    //get from Theme (tableStyles.xml) TODO \r\n                    //get tableStyleId = a:tbl => a:tblPr => a:tableStyleId\r\n                    var thisTblStyle;\r\n                    var tbleStyleId = getTblPr[\"a:tableStyleId\"];\r\n                    if (tbleStyleId !== undefined) {\r\n                        //get Style from tableStyles.xml by {var tbleStyleId}\r\n                        //table style object : tableStyles\r\n                        var tbleStylList = tableStyles[\"a:tblStyleLst\"][\"a:tblStyle\"];\r\n                        if (tbleStylList.constructor === Array) {\r\n                            for (var k = 0; k < tbleStylList.length; k++) {\r\n                                if (tbleStylList[k][\"attrs\"][\"styleId\"] == tbleStyleId) {\r\n                                    thisTblStyle = tbleStylList[k];\r\n                                }\r\n                            }\r\n                        } else {\r\n                            if (tbleStylList[\"attrs\"][\"styleId\"] == tbleStyleId) {\r\n                                thisTblStyle = tbleStylList;\r\n                            }\r\n                        }\r\n                    }\r\n                    //console.log(thisTblStyle);\r\n                    if (i == 0 && firstRowAttr !== undefined) {\r\n                        var fillColor = \"fff\";\r\n                        var colorOpacity = 1;\r\n                        if (thisTblStyle[\"a:firstRow\"] !== undefined) {\r\n                            var bgFillschemeClr = getTextByPathList(thisTblStyle, [\"a:firstRow\", \"a:tcStyle\", \"a:fill\", \"a:solidFill\"]);\r\n                            if (bgFillschemeClr !== undefined) {\r\n                                fillColor = getSolidFill(bgFillschemeClr);\r\n                                colorOpacity = getColorOpacity(bgFillschemeClr);\r\n                            }\r\n                            //console.log(thisTblStyle[\"a:firstRow\"])\r\n\r\n                            //borders color\r\n                            //borders Width\r\n                            var borderStyl = getTextByPathList(thisTblStyle, [\"a:firstRow\", \"a:tcStyle\", \"a:tcBdr\"]);\r\n                            if (borderStyl !== undefined) {\r\n                                var row_borders = getTableBorders(borderStyl);\r\n                                rowsStyl += row_borders;\r\n                            }\r\n                            //console.log(thisTblStyle[\"a:firstRow\"])\r\n\r\n                            //Text Style - TODO\r\n                            var rowTxtStyl = getTextByPathList(thisTblStyle, [\"a:firstRow\", \"a:tcTxStyle\"]);\r\n                            if (rowTxtStyl !== undefined) {\r\n                                /*\r\n                            var fontClrPr = getFontColorPr(node, spNode, type, slideMasterTextStyles);\r\n                            var styleText = \r\n                                \"color:\" + fontClrPr[0] + \";\" +\r\n                                \"text-shadow:\" + fontClrPr[1] + \";\" +\r\n                                \"font-size:\" + getFontSize(node, slideLayoutSpNode, slideMasterSpNode, type, slideMasterTextStyles) + \";\" + \r\n                                \"font-family:\" + getFontType(node, type, slideMasterTextStyles) + \";\" + \r\n                                \"font-weight:\" + getFontBold(node, type, slideMasterTextStyles) + \";\" +\r\n                                \"font-style:\" + getFontItalic(node, type, slideMasterTextStyles) + \";\" +\r\n                                \"text-decoration:\" + getFontDecoration(node, type, slideMasterTextStyles) + \";\" +\r\n                                \"text-align:\" + getTextHorizontalAlign(node, type, slideMasterTextStyles) + \";\" +\r\n                                \"vertical-align:\" + getTextVerticalAlign(node, type, slideMasterTextStyles) + \";\";\r\n                                */\r\n                            }\r\n\r\n                        }\r\n                        rowsStyl += \" background-color:#\" + fillColor + \";\" +\r\n                            \" opacity:\" + colorOpacity + \";\";\r\n\r\n                    } else if (i > 0 && bandRowAttr !== undefined) {\r\n                        var fillColor = \"fff\";\r\n                        var colorOpacity = 1;\r\n                        if ((i % 2) == 0) {\r\n                            if (thisTblStyle[\"a:band2H\"] !== undefined) {\r\n                                //console.log(thisTblStyle[\"a:band2H\"]);\r\n                                var bgFillschemeClr = getTextByPathList(thisTblStyle, [\"a:band2H\", \"a:tcStyle\", \"a:fill\", \"a:solidFill\"]);\r\n                                if (bgFillschemeClr !== undefined) {\r\n                                    fillColor = getSolidFill(bgFillschemeClr);\r\n                                    colorOpacity = getColorOpacity(bgFillschemeClr);\r\n                                }\r\n                                //borders color\r\n                                //borders Width\r\n                                var borderStyl = getTextByPathList(thisTblStyle, [\"a:band2H\", \"a:tcStyle\", \"a:tcBdr\"]);\r\n                                if (borderStyl !== undefined) {\r\n                                    var row_borders = getTableBorders(borderStyl);\r\n                                    rowsStyl += row_borders;\r\n                                }\r\n                                //console.log(thisTblStyle[\"a:band2H\"])\r\n\r\n                                //Text Style - TODO\r\n                                var rowTxtStyl = getTextByPathList(thisTblStyle, [\"a:band2H\", \"a:tcTxStyle\"]);\r\n                                if (rowTxtStyl !== undefined) {\r\n\r\n                                }\r\n                                //console.log(i,thisTblStyle)\r\n                            }/*else{\r\n                                var bgFillschemeClr = thisTblStyle[\"a:wholeTbl\"][\"a:tcStyle\"][\"a:fill\"][\"a:solidFill\"];\r\n                                if(bgFillschemeClr !==undefined){\r\n                                    fillColor = getSolidFill(bgFillschemeClr);\r\n                                    colorOpacity = getColorOpacity(bgFillschemeClr);\r\n                                }\r\n                                //borders color\r\n                                //borders Width\r\n                                var borderStyl = thisTblStyle[\"a:wholeTbl\"][\"a:tcStyle\"][\"a:tcBdr\"];\r\n                                if(borderStyl !== undefined){\r\n                                    var row_borders = getTableBorders(borderStyl);\r\n                                    rowsStyl += row_borders;\r\n                                }\r\n                                //console.log(thisTblStyle[\"a:wholeTbl\"])\r\n                                \r\n                                //Text Style - TODO\r\n                                var rowTxtStyl = thisTblStyle[\"a:wholeTbl\"][\"a:tcTxStyle\"];\r\n                                if(rowTxtStyl !== undefined){\r\n                                    \r\n                                }                        \r\n                            }*/\r\n                        } else {\r\n                            if (thisTblStyle[\"a:band1H\"] !== undefined) {\r\n                                var bgFillschemeClr = getTextByPathList(thisTblStyle, [\"a:band1H\", \"a:tcStyle\", \"a:fill\", \"a:solidFill\"]);\r\n                                if (bgFillschemeClr !== undefined) {\r\n                                    fillColor = getSolidFill(bgFillschemeClr);\r\n                                    colorOpacity = getColorOpacity(bgFillschemeClr);\r\n                                }\r\n                                //borders color\r\n                                //borders Width\r\n                                var borderStyl = getTextByPathList(thisTblStyle, [\"a:band1H\", \"a:tcStyle\", \"a:tcBdr\"]);\r\n                                if (borderStyl !== undefined) {\r\n                                    var row_borders = getTableBorders(borderStyl);\r\n                                    rowsStyl += row_borders;\r\n                                }\r\n                                //console.log(thisTblStyle[\"a:band1H\"])\r\n\r\n                                //Text Style - TODO\r\n                                var rowTxtStyl = getTextByPathList(thisTblStyle, [\"a:band1H\", \"a:tcTxStyle\"]);\r\n                                if (rowTxtStyl !== undefined) {\r\n\r\n                                }\r\n                            }\r\n                        }\r\n                        rowsStyl += \" background-color:#\" + fillColor + \";\" +\r\n                            \" opacity:\" + colorOpacity + \";\";\r\n                    }\r\n                    tableHtml += \"<tr style='\" + rowsStyl + \"'>\";\r\n                    ////////////////////////////////////////////////\r\n\r\n                    var tcNodes = trNodes[i][\"a:tc\"];\r\n\r\n                    if (tcNodes.constructor === Array) {\r\n                        for (var j = 0; j < tcNodes.length; j++) {\r\n                            var text = genTextBody(tcNodes[j][\"a:txBody\"], node, undefined, undefined, undefined, warpObj);\r\n                            var rowSpan = getTextByPathList(tcNodes[j], [\"attrs\", \"rowSpan\"]);\r\n                            var colSpan = getTextByPathList(tcNodes[j], [\"attrs\", \"gridSpan\"]);\r\n                            var vMerge = getTextByPathList(tcNodes[j], [\"attrs\", \"vMerge\"]);\r\n                            var hMerge = getTextByPathList(tcNodes[j], [\"attrs\", \"hMerge\"]);\r\n                            //Cells Style : TODO /////////////Amir\r\n                            //console.log(tcNodes[j]);\r\n                            //if(j==0 && ())\r\n                            var colWidthParam = getColsGrid[j][\"attrs\"][\"w\"];\r\n                            var colStyl = \"\";\r\n                            if (colWidthParam !== undefined) {\r\n                                var colWidth = parseInt(colWidthParam) * 96 / 914400;\r\n                                colStyl += \"width:\" + colWidth + \"px;\"\r\n                            }\r\n                            var getFill = tcNodes[j][\"a:tcPr\"][\"a:solidFill\"];\r\n                            var fillColor = \"\";\r\n                            var colorOpacity = 1;\r\n                            if (getFill !== undefined) {\r\n                                //console.log(getFill);\r\n                                fillColor = getSolidFill(getFill);\r\n                                colorOpacity = getColorOpacity(getFill);\r\n                            } else {\r\n                                //get from Theme (tableStyles.xml) TODO \r\n                                //get tableStyleId = a:tbl => a:tblPr => a:tableStyleId\r\n                                var tbleStyleId = getTblPr[\"a:tableStyleId\"];\r\n                                if (tbleStyleId !== undefined) {\r\n                                    //get Style from tableStyles.xml by {var tbleStyleId}\r\n                                    //table style object : tableStyles\r\n                                    var tbleStylList = tableStyles[\"a:tblStyleLst\"][\"a:tblStyle\"];\r\n\r\n                                    for (var k = 0; k < tbleStylList.length; k++) {\r\n                                        if (tbleStylList[k][\"attrs\"][\"styleId\"] == tbleStyleId) {\r\n                                            //console.log(tbleStylList[k]);\r\n                                        }\r\n                                    }\r\n                                }\r\n                                //console.log(tbleStyleId);\r\n                            }\r\n                            if (fillColor != \"\") {\r\n                                colStyl += \" background-color:#\" + fillColor + \";\";\r\n                                colStyl += \" opacity\" + colorOpacity + \";\";\r\n                            }\r\n                            //console.log(fillColor);\r\n                            ////////////////////////////////////\r\n\r\n\r\n                            if (rowSpan !== undefined) {\r\n                                tableHtml += \"<td rowspan='\" + parseInt(rowSpan) + \"' style='\" + colStyl + \"'>\" + text + \"</td>\";\r\n                            } else if (colSpan !== undefined) {\r\n                                tableHtml += \"<td colspan='\" + parseInt(colSpan) + \"' style='\" + colStyl + \"'>\" + text + \"</td>\";\r\n                            } else if (vMerge === undefined && hMerge === undefined) {\r\n                                tableHtml += \"<td style='\" + colStyl + \"'>\" + text + \"</td>\";\r\n                            }\r\n                        }\r\n                    } else {\r\n                        var text = genTextBody(tcNodes[\"a:txBody\"]);\r\n                        //Cells Style : TODO /////////////Amir\r\n                        var colWidthParam = getColsGrid[0][\"attrs\"][\"w\"];\r\n                        var colStyl = \"\";\r\n                        if (colWidthParam !== undefined) {\r\n                            var colWidth = parseInt(colWidthParam) * 96 / 914400;\r\n                            colStyl += \"width:\" + colWidth + \"px;\"\r\n                        }\r\n                        var getFill = tcNodes[\"a:tcPr\"][\"a:solidFill\"];\r\n                        var fillColor = \"\";\r\n                        var colorOpacity = 1;\r\n                        if (getFill !== undefined) {\r\n                            //console.log(getFill);   \r\n                            fillColor = getSolidFill(getFill);\r\n                            colorOpacity = getColorOpacity(getFill);\r\n                        } else {\r\n                            //get from Theme TODO\r\n                        }\r\n                        if (fillColor != \"\") {\r\n                            colStyl += \" background-color:#\" + fillColor + \";\"\r\n                            colStyl += \" opacity\" + colorOpacity + \";\";\r\n                        }\r\n                        ////////////////////////////////////\r\n                        tableHtml += \"<td style='\" + colStyl + \"'>\" + text + \"</td>\";\r\n                    }\r\n                    tableHtml += \"</tr>\";\r\n                }\r\n            } else {\r\n                //////////////row height ////////////Amir\r\n                var rowHeightParam = trNodes[\"attrs\"][\"h\"];\r\n                var rowHeight = 0;\r\n                if (rowHeightParam !== undefined) {\r\n                    rowHeight = parseInt(rowHeightParam) * 96 / 914400;\r\n                    tableHtml += \"<tr style='height:\" + rowHeight + \"px;'>\";\r\n                } else {\r\n                    tableHtml += \"<tr>\";\r\n                }\r\n                ////////////////////////////////////////////////\r\n                var tcNodes = trNodes[\"a:tc\"];\r\n                if (tcNodes.constructor === Array) {\r\n                    for (var j = 0; j < tcNodes.length; j++) {\r\n                        var text = genTextBody(tcNodes[j][\"a:txBody\"]);\r\n                        //Cells Style : TODO /////////////Amir\r\n                        var colWidthParam = getColsGrid[j][\"attrs\"][\"w\"];\r\n                        var colStyl = \"\";\r\n                        if (colWidthParam !== undefined) {\r\n                            var colWidth = parseInt(colWidthParam) * 96 / 914400;\r\n                            colStyl += \"width:\" + colWidth + \"px;\"\r\n                        }\r\n                        var getFill = tcNodes[j][\"a:tcPr\"][\"a:solidFill\"];\r\n                        var fillColor = \"\";\r\n                        var colorOpacity = 1;\r\n                        if (getFill !== undefined) {\r\n                            fillColor = getSolidFill(getFill);\r\n                            colorOpacity = getColorOpacity(getFill);\r\n                        } else {\r\n                            //get from Theme TODO\r\n                            //get tableStyleId\r\n                            // a:tbl => a:tblPr => a:tableStyleId\r\n                        }\r\n                        if (fillColor != \"\") {\r\n                            colStyl += \" background-color:#\" + fillColor + \";\"\r\n                            colStyl += \" opacity\" + colorOpacity + \";\";\r\n                        }\r\n                        ////////////////////////////////////\r\n                        tableHtml += \"<td style='\" + colStyl + \"'>\" + text + \"</td>\";\r\n                    }\r\n                } else {\r\n                    var text = genTextBody(tcNodes[\"a:txBody\"]);\r\n                    //Cells Style : TODO /////////////Amir\r\n                    var colWidthParam = getColsGrid[0][\"attrs\"][\"w\"];\r\n                    var colStyl = \"\";\r\n                    if (colWidthParam !== undefined) {\r\n                        var colWidth = parseInt(colWidthParam) * 96 / 914400;\r\n                        colStyl += \"width:\" + colWidth + \"px;\"\r\n                    }\r\n                    var getFill = tcNodes[j][\"a:tcPr\"][\"a:solidFill\"];\r\n                    var fillColor = \"\";\r\n                    var colorOpacity = 1;\r\n                    if (getFill !== undefined) {\r\n                        //console.log(getFill);\r\n                        fillColor = getSolidFill(getFill);\r\n                        colorOpacity = getColorOpacity(getFill);\r\n                    } else {\r\n                        //get from Theme TODO\r\n                    }\r\n                    if (fillColor != \"\") {\r\n                        colStyl += \" background-color:#\" + fillColor + \";\"\r\n                        colStyl += \" opacity\" + colorOpacity + \";\";\r\n                    }\r\n                    ////////////////////////////////////\r\n                    tableHtml += \"<td style='\" + colStyl + \"'>\" + text + \"</td>\";\r\n                }\r\n                tableHtml += \"</tr>\";\r\n            }\r\n\r\n            return tableHtml;\r\n        }\r\n\r\n        function genChart(node, warpObj) {\r\n\r\n            var order = node[\"attrs\"][\"order\"];\r\n            var xfrmNode = getTextByPathList(node, [\"p:xfrm\"]);\r\n            var result = \"<div id='chart\" + chartID + \"' class='block content' style='\" +\r\n                getPosition(xfrmNode, undefined, undefined) + getSize(xfrmNode, undefined, undefined) +\r\n                \" z-index: \" + order + \";'></div>\";\r\n\r\n            var rid = node[\"a:graphic\"][\"a:graphicData\"][\"c:chart\"][\"attrs\"][\"r:id\"];\r\n            var refName = warpObj[\"slideResObj\"][rid][\"target\"];\r\n            var content = readXmlFile(warpObj[\"zip\"], refName);\r\n            var plotArea = getTextByPathList(content, [\"c:chartSpace\", \"c:chart\", \"c:plotArea\"]);\r\n\r\n            var chartData = null;\r\n            for (var key in plotArea) {\r\n                switch (key) {\r\n                    case \"c:lineChart\":\r\n                        chartData = {\r\n                            \"type\": \"createChart\",\r\n                            \"data\": {\r\n                                \"chartID\": \"chart\" + chartID,\r\n                                \"chartType\": \"lineChart\",\r\n                                \"chartData\": extractChartData(plotArea[key][\"c:ser\"])\r\n                            }\r\n                        };\r\n                        break;\r\n                    case \"c:barChart\":\r\n                        chartData = {\r\n                            \"type\": \"createChart\",\r\n                            \"data\": {\r\n                                \"chartID\": \"chart\" + chartID,\r\n                                \"chartType\": \"barChart\",\r\n                                \"chartData\": extractChartData(plotArea[key][\"c:ser\"])\r\n                            }\r\n                        };\r\n                        break;\r\n                    case \"c:pieChart\":\r\n                        chartData = {\r\n                            \"type\": \"createChart\",\r\n                            \"data\": {\r\n                                \"chartID\": \"chart\" + chartID,\r\n                                \"chartType\": \"pieChart\",\r\n                                \"chartData\": extractChartData(plotArea[key][\"c:ser\"])\r\n                            }\r\n                        };\r\n                        break;\r\n                    case \"c:pie3DChart\":\r\n                        chartData = {\r\n                            \"type\": \"createChart\",\r\n                            \"data\": {\r\n                                \"chartID\": \"chart\" + chartID,\r\n                                \"chartType\": \"pie3DChart\",\r\n                                \"chartData\": extractChartData(plotArea[key][\"c:ser\"])\r\n                            }\r\n                        };\r\n                        break;\r\n                    case \"c:areaChart\":\r\n                        chartData = {\r\n                            \"type\": \"createChart\",\r\n                            \"data\": {\r\n                                \"chartID\": \"chart\" + chartID,\r\n                                \"chartType\": \"areaChart\",\r\n                                \"chartData\": extractChartData(plotArea[key][\"c:ser\"])\r\n                            }\r\n                        };\r\n                        break;\r\n                    case \"c:scatterChart\":\r\n                        chartData = {\r\n                            \"type\": \"createChart\",\r\n                            \"data\": {\r\n                                \"chartID\": \"chart\" + chartID,\r\n                                \"chartType\": \"scatterChart\",\r\n                                \"chartData\": extractChartData(plotArea[key][\"c:ser\"])\r\n                            }\r\n                        };\r\n                        break;\r\n                    case \"c:catAx\":\r\n                        break;\r\n                    case \"c:valAx\":\r\n                        break;\r\n                    default:\r\n                }\r\n            }\r\n\r\n            if (chartData !== null) {\r\n                MsgQueue.push(chartData);\r\n            }\r\n\r\n            chartID++;\r\n            return result;\r\n        }\r\n\r\n        function genDiagram(node, warpObj) {\r\n            //console.log(warpObj)\r\n            //readXmlFile(zip, sldFileName)\r\n            /**files define the diagram:\r\n             * 1-colors#.xml,\r\n             * 2-data#.xml, \r\n             * 3-layout#.xml,\r\n             * 4-quickStyle#.xml.\r\n             * 5-drawing#.xml, which Microsoft added as an extension for persisting diagram layout information.\r\n             */\r\n            ///get colors#.xml, data#.xml , layout#.xml , quickStyle#.xml\r\n            var order = node[\"attrs\"][\"order\"];\r\n            var zip = warpObj[\"zip\"];\r\n            var xfrmNode = getTextByPathList(node, [\"p:xfrm\"]);\r\n            var dgmRelIds = getTextByPathList(node, [\"a:graphic\", \"a:graphicData\", \"dgm:relIds\", \"attrs\"]);\r\n            //console.log(dgmRelIds)\r\n            var dgmClrFileId = dgmRelIds[\"r:cs\"];\r\n            var dgmDataFileId = dgmRelIds[\"r:dm\"];\r\n            var dgmLayoutFileId = dgmRelIds[\"r:lo\"];\r\n            var dgmQuickStyleFileId = dgmRelIds[\"r:qs\"];\r\n            var dgmClrFileName = warpObj[\"slideResObj\"][dgmClrFileId].target,\r\n                dgmDataFileName = warpObj[\"slideResObj\"][dgmDataFileId].target,\r\n                dgmLayoutFileName = warpObj[\"slideResObj\"][dgmLayoutFileId].target;\r\n            dgmQuickStyleFileName = warpObj[\"slideResObj\"][dgmQuickStyleFileId].target;\r\n            //console.log(dgmClrFileName,\"\\n\",dgmDataFileName,\"\\n\",dgmLayoutFileName,\"\\n\",dgmQuickStyleFileName);\r\n            var dgmClr = readXmlFile(zip, dgmClrFileName);\r\n            var dgmData = readXmlFile(zip, dgmDataFileName);\r\n            var dgmLayout = readXmlFile(zip, dgmLayoutFileName);\r\n            var dgmQuickStyle = readXmlFile(zip, dgmQuickStyleFileName);\r\n            //console.log(dgmClr,dgmData,dgmLayout,dgmQuickStyle)\r\n            ///get drawing#.xml\r\n            var dgmDrwFileName = \"\";\r\n            var dataModelExt = getTextByPathList(dgmData, [\"dgm:dataModel\", \"dgm:extLst\", \"a:ext\", \"dsp:dataModelExt\", \"attrs\"]);\r\n            if (dataModelExt !== undefined) {\r\n                var dgmDrwFileId = dataModelExt[\"relId\"];\r\n                dgmDrwFileName = warpObj[\"slideResObj\"][dgmDrwFileId][\"target\"];\r\n            }\r\n            //console.log(\"dgmDrwFileName: \",dgmDrwFileName);\r\n            var dgmDrwFile = \"\";\r\n            if (dgmDrwFileName != \"\") {\r\n                dgmDrwFile = readXmlFile(zip, dgmDrwFileName);\r\n            }\r\n            //console.log(\"dgmDrwFile: \",dgmDrwFile);\r\n            //processSpNode(node, warpObj)\r\n            var dgmDrwSpArray = getTextByPathList(dgmDrwFile, [\"dsp:drawing\", \"dsp:spTree\", \"dsp:sp\"]);\r\n            var rslt = \"\";\r\n            if (dgmDrwSpArray !== undefined) {\r\n                var dgmDrwSpArrayLen = dgmDrwSpArray.length;\r\n                for (var i = 0; i < dgmDrwSpArrayLen; i++) {\r\n                    var dspSp = dgmDrwSpArray[i];\r\n                    var dspSpObjToStr = JSON.stringify(dspSp);\r\n                    var pSpStr = dspSpObjToStr.replace(/dsp:/g, \"p:\");\r\n                    var pSpStrToObj = JSON.parse(pSpStr);\r\n                    //console.log(\"pSpStrToObj[\"+i+\"]: \",pSpStrToObj);\r\n                    rslt += processSpNode(pSpStrToObj, warpObj)\r\n                    //console.log(\"rslt[\"+i+\"]: \",rslt);\r\n                }\r\n                // dgmDrwFile: \"dsp:\"-> \"p:\"\r\n            }\r\n\r\n            return \"<div class='block content' style='\" +\r\n                getPosition(xfrmNode, undefined, undefined) +\r\n                getSize(xfrmNode, undefined, undefined) +\r\n                \"'>\" + rslt + \"</div>\";\r\n        }\r\n\r\n        function getPosition(slideSpNode, slideLayoutSpNode, slideMasterSpNode) {\r\n\r\n            var off = undefined;\r\n            var x = -1, y = -1;\r\n\r\n            if (slideSpNode !== undefined) {\r\n                off = slideSpNode[\"a:off\"][\"attrs\"];\r\n            } else if (slideLayoutSpNode !== undefined) {\r\n                off = slideLayoutSpNode[\"a:off\"][\"attrs\"];\r\n            } else if (slideMasterSpNode !== undefined) {\r\n                off = slideMasterSpNode[\"a:off\"][\"attrs\"];\r\n            }\r\n\r\n            if (off === undefined) {\r\n                return \"\";\r\n            } else {\r\n                x = parseInt(off[\"x\"]) * 96 / 914400;\r\n                y = parseInt(off[\"y\"]) * 96 / 914400;\r\n                return (isNaN(x) || isNaN(y)) ? \"\" : \"top:\" + y + \"px; left:\" + x + \"px;\";\r\n            }\r\n\r\n        }\r\n\r\n        function getSize(slideSpNode, slideLayoutSpNode, slideMasterSpNode) {\r\n\r\n            var ext = undefined;\r\n            var w = -1, h = -1;\r\n\r\n            if (slideSpNode !== undefined) {\r\n                ext = slideSpNode[\"a:ext\"][\"attrs\"];\r\n            } else if (slideLayoutSpNode !== undefined) {\r\n                ext = slideLayoutSpNode[\"a:ext\"][\"attrs\"];\r\n            } else if (slideMasterSpNode !== undefined) {\r\n                ext = slideMasterSpNode[\"a:ext\"][\"attrs\"];\r\n            }\r\n\r\n            if (ext === undefined) {\r\n                return \"\";\r\n            } else {\r\n                w = parseInt(ext[\"cx\"]) * 96 / 914400;\r\n                h = parseInt(ext[\"cy\"]) * 96 / 914400;\r\n                return (isNaN(w) || isNaN(h)) ? \"\" : \"width:\" + w + \"px; height:\" + h + \"px;\";\r\n            }\r\n\r\n        }\r\n\r\n        function getHorizontalAlign(node, slideLayoutSpNode, slideMasterSpNode, type, slideMasterTextStyles) {\r\n\r\n            var algn = getTextByPathList(node, [\"a:pPr\", \"attrs\", \"algn\"]);\r\n            if (algn === undefined) {\r\n                algn = getTextByPathList(slideLayoutSpNode, [\"p:txBody\", \"a:p\", \"a:pPr\", \"attrs\", \"algn\"]);\r\n                if (algn === undefined) {\r\n                    algn = getTextByPathList(slideMasterSpNode, [\"p:txBody\", \"a:p\", \"a:pPr\", \"attrs\", \"algn\"]);\r\n                    if (algn === undefined) {\r\n                        switch (type) {\r\n                            case \"title\":\r\n                            case \"subTitle\":\r\n                            case \"ctrTitle\":\r\n                                algn = getTextByPathList(slideMasterTextStyles, [\"p:titleStyle\", \"a:lvl1pPr\", \"attrs\", \"alng\"]);\r\n                                break;\r\n                            default:\r\n                                algn = getTextByPathList(slideMasterTextStyles, [\"p:otherStyle\", \"a:lvl1pPr\", \"attrs\", \"alng\"]);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            // TODO:\r\n            if (algn === undefined) {\r\n                if (type == \"title\" || type == \"subTitle\" || type == \"ctrTitle\") {\r\n                    return \"h-mid\";\r\n                } else if (type == \"sldNum\") {\r\n                    return \"h-right\";\r\n                }\r\n            }\r\n            return algn === \"ctr\" ? \"h-mid\" : algn === \"r\" ? \"h-right\" : \"h-left\";\r\n        }\r\n\r\n        function getVerticalAlign(node, slideLayoutSpNode, slideMasterSpNode, type, slideMasterTextStyles) {\r\n\r\n            // 上中下對齊: X, <a:bodyPr anchor=\"ctr\">, <a:bodyPr anchor=\"b\">\r\n            var anchor = getTextByPathList(node, [\"p:txBody\", \"a:bodyPr\", \"attrs\", \"anchor\"]);\r\n            if (anchor === undefined) {\r\n                anchor = getTextByPathList(slideLayoutSpNode, [\"p:txBody\", \"a:bodyPr\", \"attrs\", \"anchor\"]);\r\n                if (anchor === undefined) {\r\n                    anchor = getTextByPathList(slideMasterSpNode, [\"p:txBody\", \"a:bodyPr\", \"attrs\", \"anchor\"]);\r\n                }\r\n            }\r\n\r\n            return anchor === \"ctr\" ? \"v-mid\" : anchor === \"b\" ? \"v-down\" : \"v-up\";\r\n        }\r\n\r\n        function getFontType(node, type, slideMasterTextStyles) {\r\n            var typeface = getTextByPathList(node, [\"a:rPr\", \"a:latin\", \"attrs\", \"typeface\"]);\r\n\r\n            if (typeface === undefined) {\r\n                var fontSchemeNode = getTextByPathList(themeContent, [\"a:theme\", \"a:themeElements\", \"a:fontScheme\"]);\r\n                if (type == \"title\" || type == \"subTitle\" || type == \"ctrTitle\") {\r\n                    typeface = getTextByPathList(fontSchemeNode, [\"a:majorFont\", \"a:latin\", \"attrs\", \"typeface\"]);\r\n                } else if (type == \"body\") {\r\n                    typeface = getTextByPathList(fontSchemeNode, [\"a:minorFont\", \"a:latin\", \"attrs\", \"typeface\"]);\r\n                } else {\r\n                    typeface = getTextByPathList(fontSchemeNode, [\"a:minorFont\", \"a:latin\", \"attrs\", \"typeface\"]);\r\n                }\r\n            }\r\n\r\n            return (typeface === undefined) ? \"inherit\" : typeface;\r\n        }\r\n\r\n        function getFontColorPr(node, spNode, type, slideMasterTextStyles) {\r\n            //text border using: text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;\r\n            //{getFontColor(..) return color} -> getFontColorPr(..) return array[color,textBordr/shadow]\r\n            //https://stackoverflow.com/questions/2570972/css-font-border\r\n            //https://www.w3schools.com/cssref/css3_pr_text-shadow.asp\r\n            //console.log(node)\r\n            var rPrNode = getTextByPathList(node, [\"a:rPr\"]);\r\n            var filTyp, color, textBordr;\r\n            if (rPrNode !== undefined) {\r\n                filTyp = getFillType(rPrNode);\r\n                if (filTyp == \"SOLID_FILL\") {\r\n                    var solidFillNode = getTextByPathList(node, [\"a:rPr\", \"a:solidFill\"]);\r\n                    color = getSolidFill(solidFillNode);\r\n                } else if (filTyp == \"PATTERN_FILL\") {\r\n                    var pattFill = getTextByPathList(node, [\"a:rPr\", \"a:pattFill\"]);\r\n                    color = getPatternFill(pattFill);\r\n                } else {\r\n                    var sPstyle = getTextByPathList(spNode, [\"p:style\", \"a:fontRef\"]);\r\n                    if (sPstyle !== undefined) {\r\n                        color = getSolidFill(sPstyle);\r\n                    }\r\n                }\r\n                //console.log(node,filTyp,color)\r\n            }\r\n            if (color === undefined || color === \"FFF\") {\r\n                color = \"#000\";\r\n            } else {\r\n                color = \"#\" + color;\r\n            }\r\n            //textBordr\r\n            var txtBrdrNode = getTextByPathList(node, [\"a:rPr\", \"a:ln\"]);\r\n            if (txtBrdrNode !== undefined) {\r\n                var txBrd = getBorder(node, false, \"text\");\r\n                var txBrdAry = txBrd.split(\" \");\r\n                var brdSize = (parseInt(txBrdAry[0].substring(0, txBrdAry[0].indexOf(\"pt\"))) * (4 / 3)) + \"px\";\r\n                var brdClr = txBrdAry[2];\r\n                //var brdTyp = txBrdAry[1]; //not in use\r\n                textBordr = \"-\" + brdSize + \" 0 \" + brdClr + \", 0 \" + brdSize + \" \" + brdClr + \", \" + brdSize + \" 0 \" + brdClr + \", 0 -\" + brdSize + \" \" + brdClr + \";\"\r\n                //console.log(node,\"txBrd: \",textBordr);\r\n            } else {\r\n                textBordr = \"none\";\r\n            }\r\n            return [color, textBordr];\r\n        }\r\n        function getFontSize(node, slideLayoutSpNode, slideMasterSpNode, type, slideMasterTextStyles) {\r\n            var fontSize = undefined;\r\n            if (node[\"a:rPr\"] !== undefined) {\r\n                fontSize = parseInt(node[\"a:rPr\"][\"attrs\"][\"sz\"]) / 100;\r\n            }\r\n\r\n            if ((isNaN(fontSize) || fontSize === undefined)) {\r\n                var sz = getTextByPathList(slideLayoutSpNode, [\"p:txBody\", \"a:lstStyle\", \"a:lvl1pPr\", \"a:defRPr\", \"attrs\", \"sz\"]);\r\n                fontSize = parseInt(sz) / 100;\r\n            }\r\n\r\n            if (isNaN(fontSize) || fontSize === undefined) {\r\n                if (type == \"title\" || type == \"subTitle\" || type == \"ctrTitle\") {\r\n                    var sz = getTextByPathList(slideMasterTextStyles, [\"p:titleStyle\", \"a:lvl1pPr\", \"a:defRPr\", \"attrs\", \"sz\"]);\r\n                } else if (type == \"body\") {\r\n                    var sz = getTextByPathList(slideMasterTextStyles, [\"p:bodyStyle\", \"a:lvl1pPr\", \"a:defRPr\", \"attrs\", \"sz\"]);\r\n                } else if (type == \"dt\" || type == \"sldNum\") {\r\n                    var sz = \"1200\";\r\n                } else if (type === undefined) {\r\n                    var sz = getTextByPathList(slideMasterTextStyles, [\"p:otherStyle\", \"a:lvl1pPr\", \"a:defRPr\", \"attrs\", \"sz\"]);\r\n                }\r\n                fontSize = parseInt(sz) / 100;\r\n            }\r\n\r\n            var baseline = getTextByPathList(node, [\"a:rPr\", \"attrs\", \"baseline\"]);\r\n            if (baseline !== undefined && !isNaN(fontSize)) {\r\n                fontSize -= 10;\r\n            }\r\n\r\n            return isNaN(fontSize) ? \"inherit\" : (fontSize + \"pt\");\r\n        }\r\n\r\n        function getFontBold(node, type, slideMasterTextStyles) {\r\n            return (node[\"a:rPr\"] !== undefined && node[\"a:rPr\"][\"attrs\"][\"b\"] === \"1\") ? \"bold\" : \"initial\";\r\n        }\r\n\r\n        function getFontItalic(node, type, slideMasterTextStyles) {\r\n            return (node[\"a:rPr\"] !== undefined && node[\"a:rPr\"][\"attrs\"][\"i\"] === \"1\") ? \"italic\" : \"normal\";\r\n        }\r\n\r\n        function getFontDecoration(node, type, slideMasterTextStyles) {\r\n            ///////////////////////////////Amir///////////////////////////////\r\n            if (node[\"a:rPr\"] !== undefined) {\r\n                var underLine = node[\"a:rPr\"][\"attrs\"][\"u\"] !== undefined ? node[\"a:rPr\"][\"attrs\"][\"u\"] : \"none\";\r\n                var strikethrough = node[\"a:rPr\"][\"attrs\"][\"strike\"] !== undefined ? node[\"a:rPr\"][\"attrs\"][\"strike\"] : 'noStrike';\r\n                //console.log(\"strikethrough: \"+strikethrough);\r\n\r\n                if (underLine != \"none\" && strikethrough == \"noStrike\") {\r\n                    return \"underline\";\r\n                } else if (underLine == \"none\" && strikethrough != \"noStrike\") {\r\n                    return \"line-through\";\r\n                } else if (underLine != \"none\" && strikethrough != \"noStrike\") {\r\n                    return \"underline line-through\";\r\n                } else {\r\n                    return \"initial\";\r\n                }\r\n            } else {\r\n                return \"initial\";\r\n            }\r\n            /////////////////////////////////////////////////////////////////\r\n            //return (node[\"a:rPr\"] !== undefined && node[\"a:rPr\"][\"attrs\"][\"u\"] === \"sng\") ? \"underline\" : \"initial\";\r\n        }\r\n        ////////////////////////////////////Amir/////////////////////////////////////\r\n        function getTextHorizontalAlign(node, type, slideMasterTextStyles) {\r\n            var getAlgn = getTextByPathList(node, [\"a:pPr\", \"attrs\", \"algn\"]);\r\n            var align = \"initial\";\r\n            if (getAlgn !== undefined) {\r\n                switch (getAlgn) {\r\n                    case \"l\":\r\n                        align = \"left\";\r\n                        break;\r\n                    case \"r\":\r\n                        align = \"right\";\r\n                        break;\r\n                    case \"ctr\":\r\n                        align = \"center\";\r\n                        break;\r\n                    case \"just\":\r\n                        align = \"justify\";\r\n                        break;\r\n                    case \"dist\":\r\n                        align = \"justify\";\r\n                        break;\r\n                    default:\r\n                        align = \"initial\";\r\n                }\r\n            }\r\n            return align;\r\n        }\r\n        /////////////////////////////////////////////////////////////////////\r\n        function getTextVerticalAlign(node, type, slideMasterTextStyles) {\r\n            var baseline = getTextByPathList(node, [\"a:rPr\", \"attrs\", \"baseline\"]);\r\n            return baseline === undefined ? \"baseline\" : (parseInt(baseline) / 1000) + \"%\";\r\n        }\r\n        ///////////////////////////////////Amir/////////////////////////////\r\n        function getTextDirection(node, type, slideMasterTextStyles) {\r\n            //get lvl\r\n            var pprLvl = getTextByPathList(node, [\"a:pPr\", \"attrs\", \"lvl\"]);\r\n            var pprLvlNum = pprLvl === undefined ? 1 : Number(pprLvl) + 1;\r\n            var lvlNode = \"a:lvl\" + pprLvlNum + \"pPr\";\r\n            var pprAlgn = getTextByPathList(node, [\"a:pPr\", \"attrs\", \"algn\"]);\r\n            var isDir = getTextByPathList(slideMasterTextStyles, [\"p:bodyStyle\", lvlNode, \"attrs\", \"rtl\"]);\r\n            //var tmp = getTextByPathList(node, [\"a:r\", \"a:t\"]);\r\n            var dir = \"\";\r\n            if (isDir !== undefined) {\r\n                if (isDir == \"1\" && (pprAlgn === undefined || pprAlgn == \"r\")) {\r\n                    dir = \"rtl\";\r\n                } else { //isDir ==\"0\"\r\n                    dir = \"ltr\";\r\n                }\r\n            }\r\n            //console.log(tmp,isDir,pprAlgn,dir)\r\n            return dir;\r\n        }\r\n        function getTableBorders(node) {\r\n            var borderStyle = \"\";\r\n            if (node[\"a:bottom\"] !== undefined) {\r\n                var obj = {\r\n                    \"p:spPr\": {\r\n                        \"a:ln\": node[\"a:bottom\"][\"a:ln\"]\r\n                    }\r\n                }\r\n                var borders = getBorder(obj, false, \"shape\");\r\n                borderStyle += borders.replace(\"border\", \"border-bottom\");\r\n            }\r\n            if (node[\"a:top\"] !== undefined) {\r\n                var obj = {\r\n                    \"p:spPr\": {\r\n                        \"a:ln\": node[\"a:top\"][\"a:ln\"]\r\n                    }\r\n                }\r\n                var borders = getBorder(obj, false, \"shape\");\r\n                borderStyle += borders.replace(\"border\", \"border-top\");\r\n            }\r\n            if (node[\"a:right\"] !== undefined) {\r\n                var obj = {\r\n                    \"p:spPr\": {\r\n                        \"a:ln\": node[\"a:right\"][\"a:ln\"]\r\n                    }\r\n                }\r\n                var borders = getBorder(obj, false, \"shape\");\r\n                borderStyle += borders.replace(\"border\", \"border-right\");\r\n            }\r\n            if (node[\"a:left\"] !== undefined) {\r\n                var obj = {\r\n                    \"p:spPr\": {\r\n                        \"a:ln\": node[\"a:left\"][\"a:ln\"]\r\n                    }\r\n                }\r\n                var borders = getBorder(obj, false, \"shape\");\r\n                borderStyle += borders.replace(\"border\", \"border-left\");\r\n            }\r\n\r\n            return borderStyle;\r\n        }\r\n        //////////////////////////////////////////////////////////////////\r\n        function getBorder(node, isSvgMode, bType) {\r\n            var cssText, lineNode;\r\n            if (bType == \"shape\") {\r\n                cssText = \"border: \";\r\n                lineNode = node[\"p:spPr\"][\"a:ln\"];\r\n            } else if (bType == \"text\") {\r\n                cssText = \"\";\r\n                lineNode = node[\"a:rPr\"][\"a:ln\"];\r\n\r\n            }\r\n\r\n            // Border width: 1pt = 12700, default = 0.75pt\r\n            var borderWidth = parseInt(getTextByPathList(lineNode, [\"attrs\", \"w\"])) / 12700;\r\n            if (isNaN(borderWidth) || borderWidth < 1) {\r\n                cssText += \"1pt \";\r\n            } else {\r\n                cssText += borderWidth + \"pt \";\r\n            }\r\n            // Border type\r\n            var borderType = getTextByPathList(lineNode, [\"a:prstDash\", \"attrs\", \"val\"]);\r\n            var strokeDasharray = \"0\";\r\n            switch (borderType) {\r\n                case \"solid\":\r\n                    cssText += \"solid\";\r\n                    strokeDasharray = \"0\";\r\n                    break;\r\n                case \"dash\":\r\n                    cssText += \"dashed\";\r\n                    strokeDasharray = \"5\";\r\n                    break;\r\n                case \"dashDot\":\r\n                    cssText += \"dashed\";\r\n                    strokeDasharray = \"5, 5, 1, 5\";\r\n                    break;\r\n                case \"dot\":\r\n                    cssText += \"dotted\";\r\n                    strokeDasharray = \"1, 5\";\r\n                    break;\r\n                case \"lgDash\":\r\n                    cssText += \"dashed\";\r\n                    strokeDasharray = \"10, 5\";\r\n                    break;\r\n                case \"lgDashDotDot\":\r\n                    cssText += \"dashed\";\r\n                    strokeDasharray = \"10, 5, 1, 5, 1, 5\";\r\n                    break;\r\n                case \"sysDash\":\r\n                    cssText += \"dashed\";\r\n                    strokeDasharray = \"5, 2\";\r\n                    break;\r\n                case \"sysDashDot\":\r\n                    cssText += \"dashed\";\r\n                    strokeDasharray = \"5, 2, 1, 5\";\r\n                    break;\r\n                case \"sysDashDotDot\":\r\n                    cssText += \"dashed\";\r\n                    strokeDasharray = \"5, 2, 1, 5, 1, 5\";\r\n                    break;\r\n                case \"sysDot\":\r\n                    cssText += \"dotted\";\r\n                    strokeDasharray = \"2, 5\";\r\n                    break;\r\n                case undefined:\r\n                //console.log(borderType);\r\n                default:\r\n                    cssText += \"solid\";\r\n                    strokeDasharray = \"0\";\r\n            }\r\n            // Border color\r\n            var borderColor = getTextByPathList(lineNode, [\"a:solidFill\", \"a:srgbClr\", \"attrs\", \"val\"]);\r\n            if (borderColor === undefined) {\r\n                var schemeClrNode = getTextByPathList(lineNode, [\"a:solidFill\", \"a:schemeClr\"]);\r\n                if (schemeClrNode !== undefined) {\r\n                    var schemeClr = \"a:\" + getTextByPathList(schemeClrNode, [\"attrs\", \"val\"]);\r\n                    var borderColor = getSchemeColorFromTheme(schemeClr, undefined);\r\n                }\r\n            }\r\n\r\n            // 2. drawingML namespace\r\n            if (borderColor === undefined) {\r\n                var schemeClrNode = getTextByPathList(node, [\"p:style\", \"a:lnRef\", \"a:schemeClr\"]);\r\n                if (schemeClrNode !== undefined) {\r\n                    var schemeClr = \"a:\" + getTextByPathList(schemeClrNode, [\"attrs\", \"val\"]);\r\n                    var borderColor = getSchemeColorFromTheme(schemeClr, undefined);\r\n                }\r\n\r\n                if (borderColor !== undefined) {\r\n                    var shade = getTextByPathList(schemeClrNode, [\"a:shade\", \"attrs\", \"val\"]);\r\n                    if (shade !== undefined) {\r\n                        shade = parseInt(shade) / 100000;\r\n                        var color = new colz.Color(\"#\" + borderColor);\r\n                        color.setLum(color.hsl.l * shade);\r\n                        borderColor = color.hex.replace(\"#\", \"\");\r\n                    }\r\n                }\r\n\r\n            }\r\n\r\n            if (borderColor === undefined) {\r\n                if (isSvgMode) {\r\n                    borderColor = \"none\";\r\n                } else {\r\n                    borderColor = \"#000\";\r\n                }\r\n            } else {\r\n                borderColor = \"#\" + borderColor;\r\n\r\n            }\r\n            cssText += \" \" + borderColor + \" \";\r\n\r\n\r\n\r\n            if (isSvgMode) {\r\n                return { \"color\": borderColor, \"width\": borderWidth, \"type\": borderType, \"strokeDasharray\": strokeDasharray };\r\n            } else {\r\n                return cssText + \";\";\r\n            }\r\n        }\r\n\r\n        function getSlideBackgroundFill(slideContent, slideLayoutContent, slideMasterContent, warpObj) {\r\n            //console.log(slideContent)\r\n            //getFillType(node)\r\n            var bgPr = getTextByPathList(slideContent, [\"p:sld\", \"p:cSld\", \"p:bg\", \"p:bgPr\"]);\r\n            var bgRef = getTextByPathList(slideContent, [\"p:sld\", \"p:cSld\", \"p:bg\", \"p:bgRef\"]);\r\n            var bgcolor;\r\n            if (bgPr !== undefined) {\r\n                //bgcolor = \"background-color: blue;\";\r\n                var bgFillTyp = getFillType(bgPr);\r\n\r\n                if (bgFillTyp == \"SOLID_FILL\") {\r\n                    var sldFill = bgPr[\"a:solidFill\"];\r\n                    var bgColor = getSolidFill(sldFill);\r\n                    var sldTint = getColorOpacity(sldFill);\r\n                    bgcolor = \"background: rgba(\" + hexToRgbNew(bgColor) + \",\" + sldTint + \");\";\r\n\r\n                } else if (bgFillTyp == \"GRADIENT_FILL\") {\r\n                    bgcolor = getBgGradientFill(bgPr, undefined, slideMasterContent);\r\n                } else if (bgFillTyp == \"PIC_FILL\") {\r\n                    bgcolor = getBgPicFill(bgPr, \"slideBg\", warpObj);\r\n\r\n                }\r\n                //console.log(slideContent,slideMasterContent,color_ary,tint_ary,rot,bgcolor)\r\n            } else if (bgRef !== undefined) {\r\n                //console.log(\"slideContent\",bgRef)\r\n                var phClr;\r\n                if (bgRef[\"a:srgbClr\"] !== undefined) {\r\n                    phClr = getTextByPathList(bgRef, [\"a:srgbClr\", \"attrs\", \"val\"]); //#...\r\n                } else if (bgRef[\"a:schemeClr\"] !== undefined) { //a:schemeClr\r\n                    var schemeClr = getTextByPathList(bgRef, [\"a:schemeClr\", \"attrs\", \"val\"]);\r\n                    phClr = getSchemeColorFromTheme(\"a:\" + schemeClr, slideMasterContent); //#...\r\n                    //console.log(\"schemeClr\",schemeClr,\"phClr=\",phClr)\r\n                }\r\n                var idx = Number(bgRef[\"attrs\"][\"idx\"]);\r\n\r\n\r\n                if (idx == 0 || idx == 1000) {\r\n                    //no background\r\n                } else if (idx > 0 && idx < 1000) {\r\n                    //fillStyleLst in themeContent\r\n                    //themeContent[\"a:fmtScheme\"][\"a:fillStyleLst\"]\r\n                    //bgcolor = \"background: red;\";\r\n                } else if (idx > 1000) {\r\n                    //bgFillStyleLst  in themeContent\r\n                    //themeContent[\"a:fmtScheme\"][\"a:bgFillStyleLst\"]\r\n                    var trueIdx = idx - 1000;\r\n                    var bgFillLst = themeContent[\"a:theme\"][\"a:themeElements\"][\"a:fmtScheme\"][\"a:bgFillStyleLst\"];\r\n                    var sortblAry = [];\r\n                    Object.keys(bgFillLst).forEach(function (key) {\r\n                        var bgFillLstTyp = bgFillLst[key];\r\n                        if (key != \"attrs\") {\r\n                            if (bgFillLstTyp.constructor === Array) {\r\n                                for (var i = 0; i < bgFillLstTyp.length; i++) {\r\n                                    var obj = {};\r\n                                    obj[key] = bgFillLstTyp[i];\r\n                                    obj[\"idex\"] = bgFillLstTyp[i][\"attrs\"][\"order\"];\r\n                                    sortblAry.push(obj)\r\n                                }\r\n                            } else {\r\n                                var obj = {};\r\n                                obj[key] = bgFillLstTyp;\r\n                                obj[\"idex\"] = bgFillLstTyp[\"attrs\"][\"order\"];\r\n                                sortblAry.push(obj)\r\n                            }\r\n                        }\r\n                    });\r\n                    var sortByOrder = sortblAry.slice(0);\r\n                    sortByOrder.sort(function (a, b) {\r\n                        return a.idex - b.idex;\r\n                    });\r\n                    var bgFillLstIdx = sortByOrder[trueIdx - 1];\r\n                    var bgFillTyp = getFillType(bgFillLstIdx);\r\n                    if (bgFillTyp == \"SOLID_FILL\") {\r\n                        var sldFill = bgFillLstIdx[\"a:solidFill\"];\r\n                        //var sldBgColor = getSolidFill(sldFill);\r\n                        var sldTint = getColorOpacity(sldFill);\r\n                        bgcolor = \"background: rgba(\" + hexToRgbNew(phClr) + \",\" + sldTint + \");\";\r\n                        //console.log(\"slideMasterContent - sldFill\",sldFill)\r\n                    } else if (bgFillTyp == \"GRADIENT_FILL\") {\r\n                        bgcolor = getBgGradientFill(bgFillLstIdx, phClr, slideMasterContent);\r\n                    }\r\n                }\r\n\r\n            } else {\r\n                bgPr = getTextByPathList(slideLayoutContent, [\"p:sldLayout\", \"p:cSld\", \"p:bg\", \"p:bgPr\"]);\r\n                bgRef = getTextByPathList(slideLayoutContent, [\"p:sldLayout\", \"p:cSld\", \"p:bg\", \"p:bgRef\"]);\r\n                //console.log(\"slideLayoutContent\",bgPr,bgRef)\r\n                if (bgPr !== undefined) {\r\n                    var bgFillTyp = getFillType(bgPr);\r\n                    if (bgFillTyp == \"SOLID_FILL\") {\r\n                        var sldFill = bgPr[\"a:solidFill\"];\r\n                        var bgColor = getSolidFill(sldFill);\r\n                        var sldTint = getColorOpacity(sldFill);\r\n                        bgcolor = \"background: rgba(\" + hexToRgbNew(bgColor) + \",\" + sldTint + \");\";\r\n                    } else if (bgFillTyp == \"GRADIENT_FILL\") {\r\n                        bgcolor = getBgGradientFill(bgPr, undefined, slideMasterContent);\r\n                    } else if (bgFillTyp == \"PIC_FILL\") {\r\n                        bgcolor = getBgPicFill(bgPr, \"layoutBg\", warpObj);\r\n\r\n                    }\r\n                    //console.log(\"slideLayoutContent\",bgcolor)\r\n                } else if (bgRef !== undefined) {\r\n                    bgcolor = \"background: red;\";\r\n                } else {\r\n                    bgPr = getTextByPathList(slideMasterContent, [\"p:sldMaster\", \"p:cSld\", \"p:bg\", \"p:bgPr\"]);\r\n                    bgRef = getTextByPathList(slideMasterContent, [\"p:sldMaster\", \"p:cSld\", \"p:bg\", \"p:bgRef\"]);\r\n\r\n                    //console.log(\"bgRef\",bgRef[\"a:schemeClr\"][\"attrs\"][\"val\"])\r\n                    if (bgPr !== undefined) {\r\n                        var bgFillTyp = getFillType(bgPr);\r\n                        if (bgFillTyp == \"SOLID_FILL\") {\r\n                            var sldFill = bgPr[\"a:solidFill\"];\r\n                            var bgColor = getSolidFill(sldFill);\r\n                            var sldTint = getColorOpacity(sldFill);\r\n                            bgcolor = \"background: rgba(\" + hexToRgbNew(bgColor) + \",\" + sldTint + \");\";\r\n                        } else if (bgFillTyp == \"GRADIENT_FILL\") {\r\n                            bgcolor = getBgGradientFill(bgPr, undefined, slideMasterContent);\r\n                        } else if (bgFillTyp == \"PIC_FILL\") {\r\n                            bgcolor = getBgPicFill(bgPr, \"masterBg\", warpObj);\r\n                        }\r\n                    } else if (bgRef !== undefined) {\r\n                        //var obj={\r\n                        //    \"a:solidFill\": bgRef\r\n                        //}\r\n                        //var phClr = getSolidFill(bgRef);\r\n                        var phClr;\r\n                        if (bgRef[\"a:srgbClr\"] !== undefined) {\r\n                            phClr = getTextByPathList(bgRef, [\"a:srgbClr\", \"attrs\", \"val\"]); //#...\r\n                        } else if (bgRef[\"a:schemeClr\"] !== undefined) { //a:schemeClr\r\n                            var schemeClr = getTextByPathList(bgRef, [\"a:schemeClr\", \"attrs\", \"val\"]);\r\n\r\n                            phClr = getSchemeColorFromTheme(\"a:\" + schemeClr, slideMasterContent); //#...\r\n                            //console.log(\"phClr\",phClr)\r\n                        }\r\n                        var idx = Number(bgRef[\"attrs\"][\"idx\"]);\r\n                        //console.log(\"phClr=\",phClr,\"idx=\",idx)\r\n\r\n                        if (idx == 0 || idx == 1000) {\r\n                            //no background\r\n                        } else if (idx > 0 && idx < 1000) {\r\n                            //fillStyleLst in themeContent\r\n                            //themeContent[\"a:fmtScheme\"][\"a:fillStyleLst\"]\r\n                            //bgcolor = \"background: red;\";\r\n                        } else if (idx > 1000) {\r\n                            //bgFillStyleLst  in themeContent\r\n                            //themeContent[\"a:fmtScheme\"][\"a:bgFillStyleLst\"]\r\n                            var trueIdx = idx - 1000;\r\n                            var bgFillLst = themeContent[\"a:theme\"][\"a:themeElements\"][\"a:fmtScheme\"][\"a:bgFillStyleLst\"];\r\n                            var sortblAry = [];\r\n                            Object.keys(bgFillLst).forEach(function (key) {\r\n                                //console.log(\"cubicBezTo[\"+key+\"]:\");\r\n                                var bgFillLstTyp = bgFillLst[key];\r\n                                if (key != \"attrs\") {\r\n                                    if (bgFillLstTyp.constructor === Array) {\r\n                                        for (var i = 0; i < bgFillLstTyp.length; i++) {\r\n                                            var obj = {};\r\n                                            obj[key] = bgFillLstTyp[i];\r\n                                            obj[\"idex\"] = bgFillLstTyp[i][\"attrs\"][\"order\"];\r\n                                            sortblAry.push(obj)\r\n                                        }\r\n                                    } else {\r\n                                        var obj = {};\r\n                                        obj[key] = bgFillLstTyp;\r\n                                        obj[\"idex\"] = bgFillLstTyp[\"attrs\"][\"order\"];\r\n                                        sortblAry.push(obj)\r\n                                    }\r\n                                }\r\n                            });\r\n                            var sortByOrder = sortblAry.slice(0);\r\n                            sortByOrder.sort(function (a, b) {\r\n                                return a.idex - b.idex;\r\n                            });\r\n                            var bgFillLstIdx = sortByOrder[trueIdx - 1];\r\n                            var bgFillTyp = getFillType(bgFillLstIdx);\r\n                            //console.log(\"bgFillLstIdx\",bgFillLstIdx);\r\n                            if (bgFillTyp == \"SOLID_FILL\") {\r\n                                var sldFill = bgFillLstIdx[\"a:solidFill\"];\r\n                                var sldTint = getColorOpacity(sldFill);\r\n                                bgcolor = \"background: rgba(\" + hexToRgbNew(phClr) + \",\" + sldTint + \");\";\r\n                            } else if (bgFillTyp == \"GRADIENT_FILL\") {\r\n                                bgcolor = getBgGradientFill(bgFillLstIdx, phClr, slideMasterContent);\r\n                            } else {\r\n                                console.log(bgFillTyp)\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            //console.log(\"bgcolor: \",bgcolor)   \r\n            return bgcolor;\r\n        }\r\n        function getBgGradientFill(bgPr, phClr, slideMasterContent) {\r\n            var bgcolor = \"\";\r\n            if (bgPr !== undefined) {\r\n                var grdFill = bgPr[\"a:gradFill\"];\r\n                var gsLst = grdFill[\"a:gsLst\"][\"a:gs\"];\r\n                var startColorNode, endColorNode;\r\n                var color_ary = [];\r\n                var tint_ary = [];\r\n                for (var i = 0; i < gsLst.length; i++) {\r\n                    var lo_tint;\r\n                    var lo_color = \"\";\r\n                    if (gsLst[i][\"a:srgbClr\"] !== undefined) {\r\n                        if (phClr === undefined) {\r\n                            lo_color = getTextByPathList(gsLst[i], [\"a:srgbClr\", \"attrs\", \"val\"]); //#...\r\n                        }\r\n                        lo_tint = getTextByPathList(gsLst[i], [\"a:srgbClr\", \"a:tint\", \"attrs\", \"val\"]);\r\n                    } else if (gsLst[i][\"a:schemeClr\"] !== undefined) { //a:schemeClr\r\n                        if (phClr === undefined) {\r\n                            var schemeClr = getTextByPathList(gsLst[i], [\"a:schemeClr\", \"attrs\", \"val\"]);\r\n                            lo_color = getSchemeColorFromTheme(\"a:\" + schemeClr, slideMasterContent); //#...\r\n                        }\r\n                        lo_tint = getTextByPathList(gsLst[i], [\"a:schemeClr\", \"a:tint\", \"attrs\", \"val\"]);\r\n                        //console.log(\"schemeClr\",schemeClr,slideMasterContent)\r\n                    }\r\n                    //console.log(\"lo_color\",lo_color)\r\n                    color_ary[i] = lo_color;\r\n                    tint_ary[i] = (lo_tint !== undefined) ? parseInt(lo_tint) / 100000 : 1;\r\n                }\r\n                //get rot\r\n                var lin = grdFill[\"a:lin\"];\r\n                var rot = 90;\r\n                if (lin !== undefined) {\r\n                    rot = angleToDegrees(lin[\"attrs\"][\"ang\"]) + 90;\r\n                }\r\n                bgcolor = \"background: linear-gradient(\" + rot + \"deg,\";\r\n                for (var i = 0; i < gsLst.length; i++) {\r\n                    if (i == gsLst.length - 1) {\r\n                        if (phClr === undefined) {\r\n                            bgcolor += \"rgba(\" + hexToRgbNew(color_ary[i]) + \",\" + tint_ary[i] + \")\" + \");\";\r\n                        } else {\r\n                            bgcolor += \"rgba(\" + hexToRgbNew(phClr) + \",\" + tint_ary[i] + \")\" + \");\";\r\n                        }\r\n                    } else {\r\n                        if (phClr === undefined) {\r\n                            bgcolor += \"rgba(\" + hexToRgbNew(color_ary[i]) + \",\" + tint_ary[i] + \")\" + \", \";\r\n                        } else {\r\n                            bgcolor += \"rgba(\" + hexToRgbNew(phClr) + \",\" + tint_ary[i] + \")\" + \", \";\r\n                        }\r\n                    }\r\n                }\r\n            } else {\r\n                if (phClr === undefined) {\r\n                    bgcolor = \"rgba(\" + hexToRgbNew(phClr) + \",0);\";\r\n                }\r\n            }\r\n            return bgcolor;\r\n        }\r\n        function getBgPicFill(bgPr, sorce, warpObj) {\r\n            var bgcolor;\r\n            var picFillBase64 = getPicFill(sorce, bgPr[\"a:blipFill\"], warpObj);\r\n            var ordr = bgPr[\"attrs\"][\"order\"];\r\n            //a:srcRect\r\n            //a:stretch => a:fillRect =>attrs (l:-17000, r:-17000)\r\n            bgcolor = \"background-image: url(\" + picFillBase64 + \");  z-index: \" + ordr + \";\";\r\n            return bgcolor;\r\n        }\r\n        function hexToRgbNew(hex) {\r\n            var arrBuff = new ArrayBuffer(4);\r\n            var vw = new DataView(arrBuff);\r\n            vw.setUint32(0, parseInt(hex, 16), false);\r\n            var arrByte = new Uint8Array(arrBuff);\r\n\r\n            return arrByte[1] + \",\" + arrByte[2] + \",\" + arrByte[3];\r\n        }\r\n        function getShapeFill(node, isSvgMode, warpObj) {\r\n\r\n            // 1. presentationML\r\n            // p:spPr/ [a:noFill, solidFill, gradFill, blipFill, pattFill, grpFill]\r\n            // From slide\r\n            //Fill Type:\r\n            //console.log(\"ShapeFill: \", node)\r\n            var fillType = getFillType(getTextByPathList(node, [\"p:spPr\"]));\r\n            var fillColor;\r\n            if (fillType == \"NO_FILL\") {\r\n                return isSvgMode ? \"none\" : \"background-color: initial;\";\r\n            } else if (fillType == \"SOLID_FILL\") {\r\n                var shpFill = node[\"p:spPr\"][\"a:solidFill\"];\r\n                fillColor = getSolidFill(shpFill);\r\n            } else if (fillType == \"GRADIENT_FILL\") {\r\n                var shpFill = node[\"p:spPr\"][\"a:gradFill\"];\r\n                // fillColor = getSolidFill(shpFill);\r\n                fillColor = getGradientFill(shpFill);\r\n                //console.log(\"shpFill\",shpFill,grndColor.color)\r\n            } else if (fillType == \"PATTERN_FILL\") {\r\n                var shpFill = node[\"p:spPr\"][\"a:pattFill\"];\r\n                fillColor = getPatternFill(shpFill);\r\n            } else if (fillType == \"PIC_FILL\") {\r\n                var shpFill = node[\"p:spPr\"][\"a:blipFill\"];\r\n                fillColor = getPicFill(\"slideBg\", shpFill, warpObj);\r\n            }\r\n\r\n\r\n            // 2. drawingML namespace\r\n            if (fillColor === undefined) {\r\n                var clrName = getTextByPathList(node, [\"p:style\", \"a:fillRef\"]);\r\n                fillColor = getSolidFill(clrName);\r\n            }\r\n\r\n            if (fillColor !== undefined) {\r\n                if (fillType == \"GRADIENT_FILL\") {\r\n                    if (isSvgMode) {\r\n                        // console.log(\"GRADIENT_FILL color\", fillColor.color[0])\r\n                        return fillColor;\r\n                    } else {\r\n                        var colorAry = fillColor.color;\r\n                        var rot = fillColor.rot;\r\n\r\n                        var bgcolor = \"background: linear-gradient(\" + rot + \"deg,\";\r\n                        for (var i = 0; i < colorAry.length; i++) {\r\n                            if (i == colorAry.length - 1) {\r\n                                bgcolor += colorAry[i] + \");\";\r\n                            } else {\r\n                                bgcolor += colorAry[i] + \", \";\r\n                            }\r\n\r\n                        }\r\n                        return bgcolor;\r\n                    }\r\n                } else if (fillType == \"PIC_FILL\") {\r\n                    if (isSvgMode) {\r\n                        return fillColor;\r\n                    } else {\r\n\r\n                        return \"background-image:url(\" + fillColor + \");\";\r\n                    }\r\n                } else {\r\n                    if (isSvgMode) {\r\n                        var color = new colz.Color(fillColor);\r\n                        fillColor = color.rgb.toString();\r\n\r\n                        return fillColor;\r\n                    } else {\r\n                        //console.log(node,\"fillColor: \",fillColor,\"fillType: \",fillType,\"isSvgMode: \",isSvgMode)\r\n                        return \"background-color: #\" + fillColor + \";\";\r\n                    }\r\n                }\r\n            } else {\r\n                if (isSvgMode) {\r\n                    return \"none\";\r\n                } else {\r\n                    return \"background-color: initial;\";\r\n                }\r\n\r\n            }\r\n\r\n        }\r\n        ///////////////////////Amir//////////////////////////////\r\n        function getFillType(node) {\r\n            //Need to test/////////////////////////////////////////////\r\n            //SOLID_FILL\r\n            //PIC_FILL\r\n            //GRADIENT_FILL\r\n            //PATTERN_FILL\r\n            //NO_FILL\r\n            var fillType = \"\";\r\n            if (node[\"a:noFill\"] !== undefined) {\r\n                fillType = \"NO_FILL\";\r\n            }\r\n            if (node[\"a:solidFill\"] !== undefined) {\r\n                fillType = \"SOLID_FILL\";\r\n            }\r\n            if (node[\"a:gradFill\"] !== undefined) {\r\n                fillType = \"GRADIENT_FILL\";\r\n            }\r\n            if (node[\"a:pattFill\"] !== undefined) {\r\n                fillType = \"PATTERN_FILL\";\r\n            }\r\n            if (node[\"a:blipFill\"] !== undefined) {\r\n                fillType = \"PIC_FILL\";\r\n            }\r\n\r\n            return fillType;\r\n        }\r\n        function getGradientFill(node) {\r\n            var gsLst = node[\"a:gsLst\"][\"a:gs\"];\r\n            //get start color\r\n            var color_ary = [];\r\n            var tint_ary = [];\r\n            for (var i = 0; i < gsLst.length; i++) {\r\n                var lo_tint;\r\n                var lo_color = getSolidFill(gsLst[i]);\r\n                if (gsLst[i][\"a:srgbClr\"] !== undefined) {\r\n                    var lumMod = parseInt(getTextByPathList(node, [\"a:srgbClr\", \"a:lumMod\", \"attrs\", \"val\"])) / 100000;\r\n                    var lumOff = parseInt(getTextByPathList(node, [\"a:srgbClr\", \"a:lumOff\", \"attrs\", \"val\"])) / 100000;\r\n                    if (isNaN(lumMod)) {\r\n                        lumMod = 1.0;\r\n                    }\r\n                    if (isNaN(lumOff)) {\r\n                        lumOff = 0;\r\n                    }\r\n                    //console.log([lumMod, lumOff]);\r\n                    lo_color = applyLumModify(lo_color, lumMod, lumOff);\r\n                } else if (gsLst[i][\"a:schemeClr\"] !== undefined) { //a:schemeClr\r\n                    var lumMod = parseInt(getTextByPathList(gsLst[i], [\"a:schemeClr\", \"a:lumMod\", \"attrs\", \"val\"])) / 100000;\r\n                    var lumOff = parseInt(getTextByPathList(gsLst[i], [\"a:schemeClr\", \"a:lumOff\", \"attrs\", \"val\"])) / 100000;\r\n                    if (isNaN(lumMod)) {\r\n                        lumMod = 1.0;\r\n                    }\r\n                    if (isNaN(lumOff)) {\r\n                        lumOff = 0;\r\n                    }\r\n                    //console.log([lumMod, lumOff]);\r\n                    lo_color = applyLumModify(lo_color, lumMod, lumOff);\r\n                }\r\n                //console.log(\"lo_color\",lo_color)\r\n                color_ary[i] = lo_color;\r\n            }\r\n            //get rot\r\n            var lin = node[\"a:lin\"];\r\n            var rot = 0;\r\n            if (lin !== undefined) {\r\n                rot = angleToDegrees(lin[\"attrs\"][\"ang\"]) + 90;\r\n            }\r\n            return {\r\n                \"color\": color_ary,\r\n                \"rot\": rot\r\n            }\r\n        }\r\n        function getPicFill(type, node, warpObj) {\r\n            //Need to test/////////////////////////////////////////////\r\n            //rId\r\n            //TODO - Image Properties - Tile, Stretch, or Display Portion of Image\r\n            //(http://officeopenxml.com/drwPic-tile.php)\r\n            var img;\r\n            var rId = node[\"a:blip\"][\"attrs\"][\"r:embed\"];\r\n            var imgPath;\r\n            if (type == \"slideBg\") {\r\n                imgPath = getTextByPathList(warpObj, [\"slideResObj\", rId, \"target\"]);\r\n            } else if (type == \"layoutBg\") {\r\n                imgPath = getTextByPathList(warpObj, [\"layoutResObj\", rId, \"target\"]);\r\n            } else if (type == \"masterBg\") {\r\n                imgPath = getTextByPathList(warpObj, [\"masterResObj\", rId, \"target\"]);\r\n            }\r\n            imgPath = escapeHtml(imgPath);\r\n\r\n            if (imgPath === undefined) {\r\n                return undefined;\r\n            }\r\n            var imgExt = imgPath.split(\".\").pop();\r\n            if (imgExt == \"xml\") {\r\n                return undefined;\r\n            }\r\n            var imgArrayBuffer = warpObj[\"zip\"].file(imgPath).asArrayBuffer();\r\n            var imgMimeType = getMimeType(imgExt);\r\n            img = \"data:\" + imgMimeType + \";base64,\" + base64ArrayBuffer(imgArrayBuffer);\r\n            return img;\r\n        }\r\n        function getPatternFill(node) {\r\n            var color = \"\";\r\n            var fgClr = node[\"a:fgClr\"];\r\n            color = getSolidFill(fgClr);\r\n            return color;\r\n        }\r\n\r\n        function getSolidFill(node) {\r\n\r\n            if (node === undefined) {\r\n                return undefined;\r\n            }\r\n\r\n            var color = \"FFF\";\r\n\r\n            if (node[\"a:srgbClr\"] !== undefined) {\r\n                color = getTextByPathList(node, [\"a:srgbClr\", \"attrs\", \"val\"]); //#...\r\n            } else if (node[\"a:schemeClr\"] !== undefined) { //a:schemeClr\r\n                var schemeClr = getTextByPathList(node, [\"a:schemeClr\", \"attrs\", \"val\"]);\r\n                //console.log(schemeClr)\r\n                color = getSchemeColorFromTheme(\"a:\" + schemeClr, undefined); //#...\r\n\r\n            } else if (node[\"a:scrgbClr\"] !== undefined) {\r\n                //<a:scrgbClr r=\"50%\" g=\"50%\" b=\"50%\"/>  //Need to test/////////////////////////////////////////////\r\n                var defBultColorVals = node[\"a:scrgbClr\"][\"attrs\"];\r\n                var red = (defBultColorVals[\"r\"].indexOf(\"%\") != -1) ? defBultColorVals[\"r\"].split(\"%\").shift() : defBultColorVals[\"r\"];\r\n                var green = (defBultColorVals[\"g\"].indexOf(\"%\") != -1) ? defBultColorVals[\"g\"].split(\"%\").shift() : defBultColorVals[\"g\"];\r\n                var blue = (defBultColorVals[\"b\"].indexOf(\"%\") != -1) ? defBultColorVals[\"b\"].split(\"%\").shift() : defBultColorVals[\"b\"];\r\n                var scrgbClr = red + \",\" + green + \",\" + blue;\r\n                color = toHex(255 * (Number(red) / 100)) + toHex(255 * (Number(green) / 100)) + toHex(255 * (Number(blue) / 100));\r\n                //console.log(\"scrgbClr: \" + scrgbClr);\r\n\r\n            } else if (node[\"a:prstClr\"] !== undefined) {\r\n                //<a:prstClr val=\"black\"/>  //Need to test/////////////////////////////////////////////\r\n                var prstClr = node[\"a:prstClr\"][\"attrs\"][\"val\"];\r\n                color = getColorName2Hex(prstClr);\r\n                //console.log(\"prstClr: \" + prstClr+\" => hexClr: \"+color);\r\n            } else if (node[\"a:hslClr\"] !== undefined) {\r\n                //<a:hslClr hue=\"14400000\" sat=\"100%\" lum=\"50%\"/>  //Need to test/////////////////////////////////////////////\r\n                var defBultColorVals = node[\"a:hslClr\"][\"attrs\"];\r\n                var hue = Number(defBultColorVals[\"hue\"]) / 100000;\r\n                var sat = Number((defBultColorVals[\"sat\"].indexOf(\"%\") != -1) ? defBultColorVals[\"sat\"].split(\"%\").shift() : defBultColorVals[\"sat\"]) / 100;\r\n                var lum = Number((defBultColorVals[\"lum\"].indexOf(\"%\") != -1) ? defBultColorVals[\"lum\"].split(\"%\").shift() : defBultColorVals[\"lum\"]) / 100;\r\n                var hslClr = defBultColorVals[\"hue\"] + \",\" + defBultColorVals[\"sat\"] + \",\" + defBultColorVals[\"lum\"];\r\n                var hsl2rgb = hslToRgb(hue, sat, lum);\r\n                color = toHex(hsl2rgb.r) + toHex(hsl2rgb.g) + toHex(hsl2rgb.b);\r\n                //defBultColor = cnvrtHslColor2Hex(hslClr); //TODO\r\n                // console.log(\"hslClr: \" + hslClr);\r\n            } else if (node[\"a:sysClr\"] !== undefined) {\r\n                //<a:sysClr val=\"windowText\" lastClr=\"000000\"/>  //Need to test/////////////////////////////////////////////\r\n                var sysClr = getTextByPathList(node, [\"a:sysClr\", \"attrs\", \"lastClr\"]);\r\n                if (sysClr !== undefined) {\r\n                    color = sysClr;\r\n                }\r\n            }\r\n            return color;\r\n        }\r\n        function toHex(n) {\r\n            var hex = n.toString(16);\r\n            while (hex.length < 2) { hex = \"0\" + hex; }\r\n            return hex;\r\n        }\r\n        function hslToRgb(hue, sat, light) {\r\n            var t1, t2, r, g, b;\r\n            hue = hue / 60;\r\n            if (light <= 0.5) {\r\n                t2 = light * (sat + 1);\r\n            } else {\r\n                t2 = light + sat - (light * sat);\r\n            }\r\n            t1 = light * 2 - t2;\r\n            r = hueToRgb(t1, t2, hue + 2) * 255;\r\n            g = hueToRgb(t1, t2, hue) * 255;\r\n            b = hueToRgb(t1, t2, hue - 2) * 255;\r\n            return { r: r, g: g, b: b };\r\n        }\r\n        function hueToRgb(t1, t2, hue) {\r\n            if (hue < 0) hue += 6;\r\n            if (hue >= 6) hue -= 6;\r\n            if (hue < 1) return (t2 - t1) * hue + t1;\r\n            else if (hue < 3) return t2;\r\n            else if (hue < 4) return (t2 - t1) * (4 - hue) + t1;\r\n            else return t1;\r\n        }\r\n        function getColorName2Hex(name) {\r\n            var hex;\r\n            var colorName = ['AliceBlue', 'AntiqueWhite', 'Aqua', 'Aquamarine', 'Azure', 'Beige', 'Bisque', 'Black', 'BlanchedAlmond', 'Blue', 'BlueViolet', 'Brown', 'BurlyWood', 'CadetBlue', 'Chartreuse', 'Chocolate', 'Coral', 'CornflowerBlue', 'Cornsilk', 'Crimson', 'Cyan', 'DarkBlue', 'DarkCyan', 'DarkGoldenRod', 'DarkGray', 'DarkGrey', 'DarkGreen', 'DarkKhaki', 'DarkMagenta', 'DarkOliveGreen', 'DarkOrange', 'DarkOrchid', 'DarkRed', 'DarkSalmon', 'DarkSeaGreen', 'DarkSlateBlue', 'DarkSlateGray', 'DarkSlateGrey', 'DarkTurquoise', 'DarkViolet', 'DeepPink', 'DeepSkyBlue', 'DimGray', 'DimGrey', 'DodgerBlue', 'FireBrick', 'FloralWhite', 'ForestGreen', 'Fuchsia', 'Gainsboro', 'GhostWhite', 'Gold', 'GoldenRod', 'Gray', 'Grey', 'Green', 'GreenYellow', 'HoneyDew', 'HotPink', 'IndianRed', 'Indigo', 'Ivory', 'Khaki', 'Lavender', 'LavenderBlush', 'LawnGreen', 'LemonChiffon', 'LightBlue', 'LightCoral', 'LightCyan', 'LightGoldenRodYellow', 'LightGray', 'LightGrey', 'LightGreen', 'LightPink', 'LightSalmon', 'LightSeaGreen', 'LightSkyBlue', 'LightSlateGray', 'LightSlateGrey', 'LightSteelBlue', 'LightYellow', 'Lime', 'LimeGreen', 'Linen', 'Magenta', 'Maroon', 'MediumAquaMarine', 'MediumBlue', 'MediumOrchid', 'MediumPurple', 'MediumSeaGreen', 'MediumSlateBlue', 'MediumSpringGreen', 'MediumTurquoise', 'MediumVioletRed', 'MidnightBlue', 'MintCream', 'MistyRose', 'Moccasin', 'NavajoWhite', 'Navy', 'OldLace', 'Olive', 'OliveDrab', 'Orange', 'OrangeRed', 'Orchid', 'PaleGoldenRod', 'PaleGreen', 'PaleTurquoise', 'PaleVioletRed', 'PapayaWhip', 'PeachPuff', 'Peru', 'Pink', 'Plum', 'PowderBlue', 'Purple', 'RebeccaPurple', 'Red', 'RosyBrown', 'RoyalBlue', 'SaddleBrown', 'Salmon', 'SandyBrown', 'SeaGreen', 'SeaShell', 'Sienna', 'Silver', 'SkyBlue', 'SlateBlue', 'SlateGray', 'SlateGrey', 'Snow', 'SpringGreen', 'SteelBlue', 'Tan', 'Teal', 'Thistle', 'Tomato', 'Turquoise', 'Violet', 'Wheat', 'White', 'WhiteSmoke', 'Yellow', 'YellowGreen'];\r\n            var colorHex = ['f0f8ff', 'faebd7', '00ffff', '7fffd4', 'f0ffff', 'f5f5dc', 'ffe4c4', '000000', 'ffebcd', '0000ff', '8a2be2', 'a52a2a', 'deb887', '5f9ea0', '7fff00', 'd2691e', 'ff7f50', '6495ed', 'fff8dc', 'dc143c', '00ffff', '00008b', '008b8b', 'b8860b', 'a9a9a9', 'a9a9a9', '006400', 'bdb76b', '8b008b', '556b2f', 'ff8c00', '9932cc', '8b0000', 'e9967a', '8fbc8f', '483d8b', '2f4f4f', '2f4f4f', '00ced1', '9400d3', 'ff1493', '00bfff', '696969', '696969', '1e90ff', 'b22222', 'fffaf0', '228b22', 'ff00ff', 'dcdcdc', 'f8f8ff', 'ffd700', 'daa520', '808080', '808080', '008000', 'adff2f', 'f0fff0', 'ff69b4', 'cd5c5c', '4b0082', 'fffff0', 'f0e68c', 'e6e6fa', 'fff0f5', '7cfc00', 'fffacd', 'add8e6', 'f08080', 'e0ffff', 'fafad2', 'd3d3d3', 'd3d3d3', '90ee90', 'ffb6c1', 'ffa07a', '20b2aa', '87cefa', '778899', '778899', 'b0c4de', 'ffffe0', '00ff00', '32cd32', 'faf0e6', 'ff00ff', '800000', '66cdaa', '0000cd', 'ba55d3', '9370db', '3cb371', '7b68ee', '00fa9a', '48d1cc', 'c71585', '191970', 'f5fffa', 'ffe4e1', 'ffe4b5', 'ffdead', '000080', 'fdf5e6', '808000', '6b8e23', 'ffa500', 'ff4500', 'da70d6', 'eee8aa', '98fb98', 'afeeee', 'db7093', 'ffefd5', 'ffdab9', 'cd853f', 'ffc0cb', 'dda0dd', 'b0e0e6', '800080', '663399', 'ff0000', 'bc8f8f', '4169e1', '8b4513', 'fa8072', 'f4a460', '2e8b57', 'fff5ee', 'a0522d', 'c0c0c0', '87ceeb', '6a5acd', '708090', '708090', 'fffafa', '00ff7f', '4682b4', 'd2b48c', '008080', 'd8bfd8', 'ff6347', '40e0d0', 'ee82ee', 'f5deb3', 'ffffff', 'f5f5f5', 'ffff00', '9acd32'];\r\n            var findIndx = colorName.indexOf(name);\r\n            if (findIndx != -1) {\r\n                hex = colorHex[findIndx];\r\n            }\r\n            return hex;\r\n        }\r\n        function getColorOpacity(solidFill) {\r\n\r\n            if (solidFill === undefined) {\r\n                return undefined;\r\n            }\r\n            var opcity = 1;\r\n\r\n            if (solidFill[\"a:srgbClr\"] !== undefined) {\r\n                var tint = getTextByPathList(solidFill, [\"a:srgbClr\", \"a:tint\", \"attrs\", \"val\"]);\r\n                if (tint !== undefined) {\r\n                    opcity = parseInt(tint) / 100000;\r\n                }\r\n            } else if (solidFill[\"a:schemeClr\"] !== undefined) {\r\n                var tint = getTextByPathList(solidFill, [\"a:schemeClr\", \"a:tint\", \"attrs\", \"val\"]);\r\n                if (tint !== undefined) {\r\n                    opcity = parseInt(tint) / 100000;\r\n                }\r\n            } else if (solidFill[\"a:scrgbClr\"] !== undefined) {\r\n                var tint = getTextByPathList(solidFill, [\"a:scrgbClr\", \"a:tint\", \"attrs\", \"val\"]);\r\n                if (tint !== undefined) {\r\n                    opcity = parseInt(tint) / 100000;\r\n                }\r\n\r\n            } else if (solidFill[\"a:prstClr\"] !== undefined) {\r\n                var tint = getTextByPathList(solidFill, [\"a:prstClr\", \"a:tint\", \"attrs\", \"val\"]);\r\n                if (tint !== undefined) {\r\n                    opcity = parseInt(tint) / 100000;\r\n                }\r\n            } else if (solidFill[\"a:hslClr\"] !== undefined) {\r\n                var tint = getTextByPathList(solidFill, [\"a:hslClr\", \"a:tint\", \"attrs\", \"val\"]);\r\n                if (tint !== undefined) {\r\n                    opcity = parseInt(tint) / 100000;\r\n                }\r\n            } else if (solidFill[\"a:sysClr\"] !== undefined) {\r\n                var tint = getTextByPathList(solidFill, [\"a:sysClr\", \"a:tint\", \"attrs\", \"val\"]);\r\n                if (tint !== undefined) {\r\n                    opcity = parseInt(tint) / 100000;\r\n                }\r\n            }\r\n\r\n            return opcity;\r\n        }\r\n        function getSchemeColorFromTheme(schemeClr, sldMasterNode) {\r\n            //<p:clrMap ...> in slide master\r\n            // e.g. tx2=\"dk2\" bg2=\"lt2\" tx1=\"dk1\" bg1=\"lt1\" slideLayoutClrOvride\r\n\r\n            if (slideLayoutClrOvride == \"\" || slideLayoutClrOvride === undefined) {\r\n                slideLayoutClrOvride = getTextByPathList(sldMasterNode, [\"p:sldMaster\", \"p:clrMap\", \"attrs\"])\r\n            }\r\n            //console.log(slideLayoutClrOvride);\r\n            var schmClrName = schemeClr.substr(2);\r\n            if (slideLayoutClrOvride !== undefined) {\r\n                switch (schmClrName) {\r\n                    case \"tx1\":\r\n                    case \"tx2\":\r\n                    case \"bg1\":\r\n                    case \"bg2\":\r\n                        schemeClr = \"a:\" + slideLayoutClrOvride[schmClrName];\r\n                        //console.log(schmClrName+ \"=> \"+schemeClr);\r\n                        break;\r\n                }\r\n            } else {\r\n                switch (schmClrName) {\r\n                    case \"tx1\":\r\n                        schemeClr = \"a:dk1\";\r\n                        break;\r\n                    case \"tx2\":\r\n                        schemeClr = \"a:dk2\";\r\n                        break;\r\n                    case \"bg1\":\r\n                        schemeClr = \"a:lt1\";\r\n                        break;\r\n                    case \"bg2\":\r\n                        schemeClr = \"a:lt2\";\r\n                        break;\r\n                }\r\n            }\r\n            var refNode = getTextByPathList(themeContent, [\"a:theme\", \"a:themeElements\", \"a:clrScheme\", schemeClr]);\r\n            var color = getTextByPathList(refNode, [\"a:srgbClr\", \"attrs\", \"val\"]);\r\n            if (color === undefined && refNode !== undefined) {\r\n                color = getTextByPathList(refNode, [\"a:sysClr\", \"attrs\", \"lastClr\"]);\r\n            }\r\n            //console.log(color)\r\n            return color;\r\n        }\r\n\r\n        function extractChartData(serNode) {\r\n\r\n            var dataMat = new Array();\r\n\r\n            if (serNode === undefined) {\r\n                return dataMat;\r\n            }\r\n\r\n            if (serNode[\"c:xVal\"] !== undefined) {\r\n                var dataRow = new Array();\r\n                eachElement(serNode[\"c:xVal\"][\"c:numRef\"][\"c:numCache\"][\"c:pt\"], function (innerNode, index) {\r\n                    dataRow.push(parseFloat(innerNode[\"c:v\"]));\r\n                    return \"\";\r\n                });\r\n                dataMat.push(dataRow);\r\n                dataRow = new Array();\r\n                eachElement(serNode[\"c:yVal\"][\"c:numRef\"][\"c:numCache\"][\"c:pt\"], function (innerNode, index) {\r\n                    dataRow.push(parseFloat(innerNode[\"c:v\"]));\r\n                    return \"\";\r\n                });\r\n                dataMat.push(dataRow);\r\n            } else {\r\n                eachElement(serNode, function (innerNode, index) {\r\n                    var dataRow = new Array();\r\n                    var colName = getTextByPathList(innerNode, [\"c:tx\", \"c:strRef\", \"c:strCache\", \"c:pt\", \"c:v\"]) || index;\r\n\r\n                    // Category (string or number)\r\n                    var rowNames = {};\r\n                    if (getTextByPathList(innerNode, [\"c:cat\", \"c:strRef\", \"c:strCache\", \"c:pt\"]) !== undefined) {\r\n                        eachElement(innerNode[\"c:cat\"][\"c:strRef\"][\"c:strCache\"][\"c:pt\"], function (innerNode, index) {\r\n                            rowNames[innerNode[\"attrs\"][\"idx\"]] = innerNode[\"c:v\"];\r\n                            return \"\";\r\n                        });\r\n                    } else if (getTextByPathList(innerNode, [\"c:cat\", \"c:numRef\", \"c:numCache\", \"c:pt\"]) !== undefined) {\r\n                        eachElement(innerNode[\"c:cat\"][\"c:numRef\"][\"c:numCache\"][\"c:pt\"], function (innerNode, index) {\r\n                            rowNames[innerNode[\"attrs\"][\"idx\"]] = innerNode[\"c:v\"];\r\n                            return \"\";\r\n                        });\r\n                    }\r\n\r\n                    // Value\r\n                    if (getTextByPathList(innerNode, [\"c:val\", \"c:numRef\", \"c:numCache\", \"c:pt\"]) !== undefined) {\r\n                        eachElement(innerNode[\"c:val\"][\"c:numRef\"][\"c:numCache\"][\"c:pt\"], function (innerNode, index) {\r\n                            dataRow.push({ x: innerNode[\"attrs\"][\"idx\"], y: parseFloat(innerNode[\"c:v\"]) });\r\n                            return \"\";\r\n                        });\r\n                    }\r\n\r\n                    dataMat.push({ key: colName, values: dataRow, xlabels: rowNames });\r\n                    return \"\";\r\n                });\r\n            }\r\n\r\n            return dataMat;\r\n        }\r\n\r\n        // ===== Node functions =====\r\n        /**\r\n         * getTextByPathStr\r\n         * @param {Object} node\r\n         * @param {string} pathStr\r\n         */\r\n        function getTextByPathStr(node, pathStr) {\r\n            return getTextByPathList(node, pathStr.trim().split(/\\s+/));\r\n        }\r\n\r\n        /**\r\n         * getTextByPathList\r\n         * @param {Object} node\r\n         * @param {string Array} path\r\n         */\r\n        function getTextByPathList(node, path) {\r\n\r\n            if (path.constructor !== Array) {\r\n                throw Error(\"Error of path type! path is not array.\");\r\n            }\r\n\r\n            if (node === undefined) {\r\n                return undefined;\r\n            }\r\n\r\n            var l = path.length;\r\n            for (var i = 0; i < l; i++) {\r\n                node = node[path[i]];\r\n                if (node === undefined) {\r\n                    return undefined;\r\n                }\r\n            }\r\n\r\n            return node;\r\n        }\r\n\r\n        /**\r\n         * eachElement\r\n         * @param {Object} node\r\n         * @param {function} doFunction\r\n         */\r\n        function eachElement(node, doFunction) {\r\n            if (node === undefined) {\r\n                return;\r\n            }\r\n            var result = \"\";\r\n            if (node.constructor === Array) {\r\n                var l = node.length;\r\n                for (var i = 0; i < l; i++) {\r\n                    result += doFunction(node[i], i);\r\n                }\r\n            } else {\r\n                result += doFunction(node, 0);\r\n            }\r\n            return result;\r\n        }\r\n\r\n        // ===== Color functions =====\r\n        /**\r\n         * applyShade\r\n         * @param {string} rgbStr\r\n         * @param {number} shadeValue\r\n         */\r\n        function applyShade(rgbStr, shadeValue) {\r\n            var color = new colz.Color(rgbStr);\r\n            color.setLum(color.hsl.l * shadeValue);\r\n            return color.rgb.toString();\r\n        }\r\n\r\n        /**\r\n         * applyTint\r\n         * @param {string} rgbStr\r\n         * @param {number} tintValue\r\n         */\r\n        function applyTint(rgbStr, tintValue) {\r\n            var color = new colz.Color(rgbStr);\r\n            color.setLum(color.hsl.l * tintValue + (1 - tintValue));\r\n            return color.rgb.toString();\r\n        }\r\n\r\n        /**\r\n         * applyLumModify\r\n         * @param {string} rgbStr\r\n         * @param {number} factor\r\n         * @param {number} offset\r\n         */\r\n        function applyLumModify(rgbStr, factor, offset) {\r\n            var color = new colz.Color(rgbStr);\r\n            //color.setLum(color.hsl.l * factor);\r\n            color.setLum(color.hsl.l * (1 + offset));\r\n            return color.rgb.toString();\r\n        }\r\n\r\n        ///////////////////////Amir////////////////\r\n        function angleToDegrees(angle) {\r\n            if (angle == \"\" || angle == null) {\r\n                return 0;\r\n            }\r\n            return Math.round(angle / 60000);\r\n        }\r\n        function getMimeType(imgFileExt) {\r\n            var mimeType = \"\";\r\n            //console.log(imgFileExt)\r\n            switch (imgFileExt.toLowerCase()) {\r\n                case \"jpg\":\r\n                case \"jpeg\":\r\n                    mimeType = \"image/jpeg\";\r\n                    break;\r\n                case \"png\":\r\n                    mimeType = \"image/png\";\r\n                    break;\r\n                case \"gif\":\r\n                    mimeType = \"image/gif\";\r\n                    break;\r\n                case \"emf\": // Not native support\r\n                    mimeType = \"image/x-emf\";\r\n                    break;\r\n                case \"wmf\": // Not native support\r\n                    mimeType = \"image/x-wmf\";\r\n                    break;\r\n                case \"svg\":\r\n                    mimeType = \"image/svg+xml\";\r\n                    break;\r\n                case \"mp4\":\r\n                    mimeType = \"video/mp4\";\r\n                    break;\r\n                case \"webm\":\r\n                    mimeType = \"video/webm\";\r\n                    break;\r\n                case \"ogg\":\r\n                    mimeType = \"video/ogg\";\r\n                    break;\r\n                case \"avi\":\r\n                    mimeType = \"video/avi\";\r\n                    break;\r\n                case \"mpg\":\r\n                    mimeType = \"video/mpg\";\r\n                    break;\r\n                case \"wmv\":\r\n                    mimeType = \"video/wmv\";\r\n                    break;\r\n                case \"mp3\":\r\n                    mimeType = \"audio/mpeg\";\r\n                    break;\r\n                case \"wav\":\r\n                    mimeType = \"audio/wav\";\r\n                    break;\r\n            }\r\n            return mimeType;\r\n        }\r\n        function getSvgGradient(w, h, angl, color_arry, shpId) {\r\n            var stopsArray = getMiddleStops(color_arry.length - 2);\r\n\r\n            var svgAngle = '',\r\n                svgHeight = h,\r\n                svgWidth = w,\r\n                svg = '',\r\n                xy_ary = SVGangle(angl, svgHeight, svgWidth),\r\n                x1 = xy_ary[0],\r\n                y1 = xy_ary[1],\r\n                x2 = xy_ary[2],\r\n                y2 = xy_ary[3];\r\n\r\n            var sal = stopsArray.length,\r\n                sr = sal < 20 ? 100 : 1000;\r\n            svgAngle = ' gradientUnits=\"userSpaceOnUse\" x1=\"' + x1 + '%\" y1=\"' + y1 + '%\" x2=\"' + x2 + '%\" y2=\"' + y2 + '%\"';\r\n            svgAngle = '<linearGradient id=\"linGrd_' + shpId + '\"' + svgAngle + '>\\n';\r\n            svg += svgAngle;\r\n\r\n            for (var i = 0; i < sal; i++) {\r\n                svg += '<stop offset=\"' + Math.round(parseFloat(stopsArray[i]) / 100 * sr) / sr + '\" stop-color=\"' + color_arry[i] + '\"';\r\n                svg += '/>\\n'\r\n            }\r\n\r\n            svg += '</linearGradient>\\n' + '';\r\n\r\n            return svg\r\n        }\r\n        function getMiddleStops(s) {\r\n            var sArry = ['0%', '100%'];\r\n            if (s == 0) {\r\n                return true\r\n            } else {\r\n                var i = s;\r\n                while (i--) {\r\n                    var middleStop = 100 - ((100 / (s + 1)) * (i + 1)), // AM: Ex - For 3 middle stops, progression will be 25%, 50%, and 75%, plus 0% and 100% at the ends.\r\n                        middleStopString = middleStop + \"%\";\r\n                    sArry.splice(-1, 0, middleStopString);\r\n                } // AM: add into stopsArray before 100%\r\n            }\r\n            return sArry\r\n        }\r\n        function SVGangle(deg, svgHeight, svgWidth) {\r\n            var w = parseFloat(svgWidth),\r\n                h = parseFloat(svgHeight),\r\n                ang = parseFloat(deg),\r\n                o = 2,\r\n                n = 2,\r\n                wc = w / 2,\r\n                hc = h / 2,\r\n                tx1 = 2,\r\n                ty1 = 2,\r\n                tx2 = 2,\r\n                ty2 = 2,\r\n                k = (((ang % 360) + 360) % 360),\r\n                j = (360 - k) * Math.PI / 180,\r\n                i = Math.tan(j),\r\n                l = hc - i * wc;\r\n\r\n            if (k == 0) {\r\n                tx1 = w,\r\n                    ty1 = hc,\r\n                    tx2 = 0,\r\n                    ty2 = hc\r\n            } else if (k < 90) {\r\n                n = w,\r\n                    o = 0\r\n            } else if (k == 90) {\r\n                tx1 = wc,\r\n                    ty1 = 0,\r\n                    tx2 = wc,\r\n                    ty2 = h\r\n            } else if (k < 180) {\r\n                n = 0,\r\n                    o = 0\r\n            } else if (k == 180) {\r\n                tx1 = 0,\r\n                    ty1 = hc,\r\n                    tx2 = w,\r\n                    ty2 = hc\r\n            } else if (k < 270) {\r\n                n = 0,\r\n                    o = h\r\n            } else if (k == 270) {\r\n                tx1 = wc,\r\n                    ty1 = h,\r\n                    tx2 = wc,\r\n                    ty2 = 0\r\n            } else {\r\n                n = w,\r\n                    o = h;\r\n            }\r\n            // AM: I could not quite figure out what m, n, and o are supposed to represent from the original code on visualcsstools.com.\r\n            var m = o + (n / i),\r\n                tx1 = tx1 == 2 ? i * (m - l) / (Math.pow(i, 2) + 1) : tx1,\r\n                ty1 = ty1 == 2 ? i * tx1 + l : ty1,\r\n                tx2 = tx2 == 2 ? w - tx1 : tx2,\r\n                ty2 = ty2 == 2 ? h - ty1 : ty2,\r\n                x1 = Math.round(tx2 / w * 100 * 100) / 100,\r\n                y1 = Math.round(ty2 / h * 100 * 100) / 100,\r\n                x2 = Math.round(tx1 / w * 100 * 100) / 100,\r\n                y2 = Math.round(ty1 / h * 100 * 100) / 100;\r\n            return [x1, y1, x2, y2];\r\n        }\r\n        function getSvgImagePattern(fillColor, shpId) {\r\n            var ptrn = '<pattern id=\"imgPtrn_' + shpId + '\"  patternContentUnits=\"objectBoundingBox\"  width=\"1\" height=\"1\">';\r\n            //console.log(\"fillColor: \", fillColor)\r\n            fillColor = escapeHtml(fillColor);\r\n            ptrn += '<image  xlink:href=\"' + fillColor + '\" preserveAspectRatio=\"none\" width=\"1\" height=\"1\"></image>';\r\n            ptrn += '</pattern>';\r\n            return ptrn;\r\n        }\r\n\r\n        function processMsgQueue(queue) {\r\n            for (var i = 0; i < queue.length; i++) {\r\n                processSingleMsg(queue[i].data);\r\n            }\r\n        }\r\n\r\n        function processSingleMsg(d) {\r\n\r\n            var chartID = d.chartID;\r\n            var chartType = d.chartType;\r\n            var chartData = d.chartData;\r\n\r\n            var data = [];\r\n\r\n            var chart = null;\r\n            switch (chartType) {\r\n                case \"lineChart\":\r\n                    data = chartData;\r\n                    chart = nv.models.lineChart()\r\n                        .useInteractiveGuideline(true);\r\n                    chart.xAxis.tickFormat(function (d) { return chartData[0].xlabels[d] || d; });\r\n                    break;\r\n                case \"barChart\":\r\n                    data = chartData;\r\n                    chart = nv.models.multiBarChart();\r\n                    chart.xAxis.tickFormat(function (d) { return chartData[0].xlabels[d] || d; });\r\n                    break;\r\n                case \"pieChart\":\r\n                case \"pie3DChart\":\r\n                    data = chartData[0].values;\r\n                    chart = nv.models.pieChart();\r\n                    break;\r\n                case \"areaChart\":\r\n                    data = chartData;\r\n                    chart = nv.models.stackedAreaChart()\r\n                        .clipEdge(true)\r\n                        .useInteractiveGuideline(true);\r\n                    chart.xAxis.tickFormat(function (d) { return chartData[0].xlabels[d] || d; });\r\n                    break;\r\n                case \"scatterChart\":\r\n\r\n                    for (var i = 0; i < chartData.length; i++) {\r\n                        var arr = [];\r\n                        for (var j = 0; j < chartData[i].length; j++) {\r\n                            arr.push({ x: j, y: chartData[i][j] });\r\n                        }\r\n                        data.push({ key: 'data' + (i + 1), values: arr });\r\n                    }\r\n\r\n                    //data = chartData;\r\n                    chart = nv.models.scatterChart()\r\n                        .showDistX(true)\r\n                        .showDistY(true)\r\n                        .color(d3.scale.category10().range());\r\n                    chart.xAxis.axisLabel('X').tickFormat(d3.format('.02f'));\r\n                    chart.yAxis.axisLabel('Y').tickFormat(d3.format('.02f'));\r\n                    break;\r\n                default:\r\n            }\r\n\r\n            if (chart !== null) {\r\n\r\n                d3.select(\"#\" + chartID)\r\n                    .append(\"svg\")\r\n                    .datum(data)\r\n                    .transition().duration(500)\r\n                    .call(chart);\r\n\r\n                nv.utils.windowResize(chart.update);\r\n                isDone = true;\r\n            }\r\n\r\n        }\r\n\r\n        function setNumericBullets(elem) {\r\n            var prgrphs_arry = elem;\r\n            for (var i = 0; i < prgrphs_arry.length; i++) {\r\n                var buSpan = $(prgrphs_arry[i]).find('.numeric-bullet-style');\r\n                if (buSpan.length > 0) {\r\n                    //console.log(\"DIV-\"+i+\":\");\r\n                    var prevBultTyp = \"\";\r\n                    var prevBultLvl = \"\";\r\n                    var buletIndex = 0;\r\n                    var tmpArry = new Array();\r\n                    var tmpArryIndx = 0;\r\n                    var buletTypSrry = new Array();\r\n                    for (var j = 0; j < buSpan.length; j++) {\r\n                        var bult_typ = $(buSpan[j]).data(\"bulltname\");\r\n                        var bult_lvl = $(buSpan[j]).data(\"bulltlvl\");\r\n                        //console.log(j+\" - \"+bult_typ+\" lvl: \"+bult_lvl );\r\n                        if (buletIndex == 0) {\r\n                            prevBultTyp = bult_typ;\r\n                            prevBultLvl = bult_lvl;\r\n                            tmpArry[tmpArryIndx] = buletIndex;\r\n                            buletTypSrry[tmpArryIndx] = bult_typ;\r\n                            buletIndex++;\r\n                        } else {\r\n                            if (bult_typ == prevBultTyp && bult_lvl == prevBultLvl) {\r\n                                prevBultTyp = bult_typ;\r\n                                prevBultLvl = bult_lvl;\r\n                                buletIndex++;\r\n                                tmpArry[tmpArryIndx] = buletIndex;\r\n                                buletTypSrry[tmpArryIndx] = bult_typ;\r\n                            } else if (bult_typ != prevBultTyp && bult_lvl == prevBultLvl) {\r\n                                prevBultTyp = bult_typ;\r\n                                prevBultLvl = bult_lvl;\r\n                                tmpArryIndx++;\r\n                                tmpArry[tmpArryIndx] = buletIndex;\r\n                                buletTypSrry[tmpArryIndx] = bult_typ;\r\n                                buletIndex = 1;\r\n                            } else if (bult_typ != prevBultTyp && Number(bult_lvl) > Number(prevBultLvl)) {\r\n                                prevBultTyp = bult_typ;\r\n                                prevBultLvl = bult_lvl;\r\n                                tmpArryIndx++;\r\n                                tmpArry[tmpArryIndx] = buletIndex;\r\n                                buletTypSrry[tmpArryIndx] = bult_typ;\r\n                                buletIndex = 1;\r\n                            } else if (bult_typ != prevBultTyp && Number(bult_lvl) < Number(prevBultLvl)) {\r\n                                prevBultTyp = bult_typ;\r\n                                prevBultLvl = bult_lvl;\r\n                                tmpArryIndx--;\r\n                                buletIndex = tmpArry[tmpArryIndx] + 1;\r\n                            }\r\n                        }\r\n                        //console.log(buletTypSrry[tmpArryIndx]+\" - \"+buletIndex);\r\n                        var numIdx = getNumTypeNum(buletTypSrry[tmpArryIndx], buletIndex);\r\n                        $(buSpan[j]).html(numIdx);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        function getNumTypeNum(numTyp, num) {\r\n            var rtrnNum = \"\";\r\n            switch (numTyp) {\r\n                case \"arabicPeriod\":\r\n                    rtrnNum = num + \". \";\r\n                    break;\r\n                case \"arabicParenR\":\r\n                    rtrnNum = num + \") \";\r\n                    break;\r\n                case \"alphaLcParenR\":\r\n                    rtrnNum = alphaNumeric(num, \"lowerCase\") + \") \";\r\n                    break;\r\n                case \"alphaLcPeriod\":\r\n                    rtrnNum = alphaNumeric(num, \"lowerCase\") + \". \";\r\n                    break;\r\n\r\n                case \"alphaUcParenR\":\r\n                    rtrnNum = alphaNumeric(num, \"upperCase\") + \") \";\r\n                    break;\r\n                case \"alphaUcPeriod\":\r\n                    rtrnNum = alphaNumeric(num, \"upperCase\") + \". \";\r\n                    break;\r\n\r\n                case \"romanUcPeriod\":\r\n                    rtrnNum = romanize(num) + \". \";\r\n                    break;\r\n                case \"romanLcParenR\":\r\n                    rtrnNum = romanize(num) + \") \";\r\n                    break;\r\n                case \"hebrew2Minus\":\r\n                    rtrnNum = hebrew2Minus.format(num) + \"-\";\r\n                    break;\r\n                default:\r\n                    rtrnNum = num;\r\n            }\r\n            return rtrnNum;\r\n        }\r\n        function romanize(num) {\r\n            if (!+num)\r\n                return false;\r\n            var digits = String(+num).split(\"\"),\r\n                key = [\"\", \"C\", \"CC\", \"CCC\", \"CD\", \"D\", \"DC\", \"DCC\", \"DCCC\", \"CM\",\r\n                    \"\", \"X\", \"XX\", \"XXX\", \"XL\", \"L\", \"LX\", \"LXX\", \"LXXX\", \"XC\",\r\n                    \"\", \"I\", \"II\", \"III\", \"IV\", \"V\", \"VI\", \"VII\", \"VIII\", \"IX\"],\r\n                roman = \"\",\r\n                i = 3;\r\n            while (i--)\r\n                roman = (key[+digits.pop() + (i * 10)] || \"\") + roman;\r\n            return Array(+digits.join(\"\") + 1).join(\"M\") + roman;\r\n        }\r\n        var hebrew2Minus = archaicNumbers([\r\n            [1000, ''],\r\n            [400, 'ת'],\r\n            [300, 'ש'],\r\n            [200, 'ר'],\r\n            [100, 'ק'],\r\n            [90, 'צ'],\r\n            [80, 'פ'],\r\n            [70, 'ע'],\r\n            [60, 'ס'],\r\n            [50, 'נ'],\r\n            [40, 'מ'],\r\n            [30, 'ל'],\r\n            [20, 'כ'],\r\n            [10, 'י'],\r\n            [9, 'ט'],\r\n            [8, 'ח'],\r\n            [7, 'ז'],\r\n            [6, 'ו'],\r\n            [5, 'ה'],\r\n            [4, 'ד'],\r\n            [3, 'ג'],\r\n            [2, 'ב'],\r\n            [1, 'א'],\r\n            [/יה/, 'ט״ו'],\r\n            [/יו/, 'ט״ז'],\r\n            [/([א-ת])([א-ת])$/, '$1״$2'],\r\n            [/^([א-ת])$/, \"$1׳\"]\r\n        ]);\r\n        function archaicNumbers(arr) {\r\n            var arrParse = arr.slice().sort(function (a, b) { return b[1].length - a[1].length });\r\n            return {\r\n                format: function (n) {\r\n                    var ret = '';\r\n                    jQuery.each(arr, function () {\r\n                        var num = this[0];\r\n                        if (parseInt(num) > 0) {\r\n                            for (; n >= num; n -= num) ret += this[1];\r\n                        } else {\r\n                            ret = ret.replace(num, this[1]);\r\n                        }\r\n                    });\r\n                    return ret;\r\n                }\r\n            }\r\n        }\r\n        function alphaNumeric(num, upperLower) {\r\n            num = Number(num) - 1;\r\n            var aNum = \"\";\r\n            if (upperLower == \"upperCase\") {\r\n                aNum = (((num / 26 >= 1) ? String.fromCharCode(num / 26 + 64) : '') + String.fromCharCode(num % 26 + 65)).toUpperCase();\r\n            } else if (upperLower == \"lowerCase\") {\r\n                aNum = (((num / 26 >= 1) ? String.fromCharCode(num / 26 + 64) : '') + String.fromCharCode(num % 26 + 65)).toLowerCase();\r\n            }\r\n            return aNum;\r\n        }\r\n        function base64ArrayBuffer(arrayBuffer) {\r\n            var base64 = '';\r\n            var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\n            var bytes = new Uint8Array(arrayBuffer);\r\n            var byteLength = bytes.byteLength;\r\n            var byteRemainder = byteLength % 3;\r\n            var mainLength = byteLength - byteRemainder;\r\n\r\n            var a, b, c, d;\r\n            var chunk;\r\n\r\n            for (var i = 0; i < mainLength; i = i + 3) {\r\n                chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];\r\n                a = (chunk & 16515072) >> 18;\r\n                b = (chunk & 258048) >> 12;\r\n                c = (chunk & 4032) >> 6;\r\n                d = chunk & 63;\r\n                base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d];\r\n            }\r\n\r\n            if (byteRemainder == 1) {\r\n                chunk = bytes[mainLength];\r\n                a = (chunk & 252) >> 2;\r\n                b = (chunk & 3) << 4;\r\n                base64 += encodings[a] + encodings[b] + '==';\r\n            } else if (byteRemainder == 2) {\r\n                chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1];\r\n                a = (chunk & 64512) >> 10;\r\n                b = (chunk & 1008) >> 4;\r\n                c = (chunk & 15) << 2;\r\n                base64 += encodings[a] + encodings[b] + encodings[c] + '=';\r\n            }\r\n\r\n            return base64;\r\n        }\r\n\r\n        function extractFileExtension(filename) {\r\n            return filename.substr((~-filename.lastIndexOf(\".\") >>> 0) + 2);\r\n        }\r\n\r\n        function escapeHtml(text) {\r\n            var map = {\r\n                '&': '&amp;',\r\n                '<': '&lt;',\r\n                '>': '&gt;',\r\n                '\"': '&quot;',\r\n                \"'\": '&#039;'\r\n            };\r\n            return text.replace(/[&<>\"']/g, function (m) { return map[m]; });\r\n        }\r\n        /////////////////////////////////////tXml///////////////////////////\r\n        /*\r\n        This is my custom tXml.js file\r\n        */\r\n        function tXml(t, r) { \"use strict\"; function e() { for (var r = []; t[l];)if (t.charCodeAt(l) == s) { if (t.charCodeAt(l + 1) === h) return l = t.indexOf(u, l), l + 1 && (l += 1), r; if (t.charCodeAt(l + 1) === v) { if (t.charCodeAt(l + 2) == m) { for (; -1 !== l && (t.charCodeAt(l) !== d || t.charCodeAt(l - 1) != m || t.charCodeAt(l - 2) != m || -1 == l);)l = t.indexOf(u, l + 1); -1 === l && (l = t.length) } else for (l += 2; t.charCodeAt(l) !== d && t[l];)l++; l++; continue } var e = a(); r.push(e) } else { var i = n(); i.trim().length > 0 && r.push(i), l++ } return r } function n() { var r = l; return l = t.indexOf(c, l) - 1, -2 === l && (l = t.length), t.slice(r, l + 1) } function i() { for (var r = l; -1 === A.indexOf(t[l]) && t[l];)l++; return t.slice(r, l) } function a() { var r = {}; l++, r.tagName = i(); for (var n = !1; t.charCodeAt(l) !== d && t[l];) { var a = t.charCodeAt(l); if (a > 64 && 91 > a || a > 96 && 123 > a) { for (var f = i(), c = t.charCodeAt(l); c && c !== p && c !== g && !(c > 64 && 91 > c || c > 96 && 123 > c) && c !== d;)l++, c = t.charCodeAt(l); if (n || (r.attributes = {}, n = !0), c === p || c === g) { var s = o(); if (-1 === l) return r } else s = null, l--; r.attributes[f] = s } l++ } if (t.charCodeAt(l - 1) !== h) if (\"script\" == r.tagName) { var u = l + 1; l = t.indexOf(\"</script>\", l), r.children = [t.slice(u, l - 1)], l += 8 } else if (\"style\" == r.tagName) { var u = l + 1; l = t.indexOf(\"</style>\", l), r.children = [t.slice(u, l - 1)], l += 7 } else -1 == C.indexOf(r.tagName) && (l++, r.children = e(f)); else l++; return r } function o() { var r = t[l], e = ++l; return l = t.indexOf(r, e), t.slice(e, l) } function f() { var e = new RegExp(\"\\\\s\" + r.attrName + \"\\\\s*=['\\\"]\" + r.attrValue + \"['\\\"]\").exec(t); return e ? e.index : -1 } r = r || {}; var l = r.pos || 0, c = \"<\", s = \"<\".charCodeAt(0), u = \">\", d = \">\".charCodeAt(0), m = \"-\".charCodeAt(0), h = \"/\".charCodeAt(0), v = \"!\".charCodeAt(0), p = \"'\".charCodeAt(0), g = '\"'.charCodeAt(0), A = \"\\n\t>/= \", C = [\"img\", \"br\", \"input\", \"meta\", \"link\"], y = null; if (void 0 !== r.attrValue) { r.attrName = r.attrName || \"id\"; for (var y = []; -1 !== (l = f());)l = t.lastIndexOf(\"<\", l), -1 !== l && y.push(a()), t = t.substr(l), l = 0 } else y = r.parseNode ? a() : e(); return r.filter && (y = tXml.filter(y, r.filter)), r.simplify && (y = tXml.simplify(y)), y.pos = l, y } var _order = 1; tXml.simplify = function (t) { var r = {}; if (void 0 === t) return {}; if (1 === t.length && \"string\" == typeof t[0]) return t[0]; t.forEach(function (t) { if (\"object\" == typeof t) { r[t.tagName] || (r[t.tagName] = []); var e = tXml.simplify(t.children || []); r[t.tagName].push(e), t.attributes && (e.attrs = t.attributes), void 0 === e.attrs ? e.attrs = { order: _order } : e.attrs.order = _order, _order++ } }); for (var e in r) 1 == r[e].length && (r[e] = r[e][0]); return r }, tXml.filter = function (t, r) { var e = []; return t.forEach(function (t) { if (\"object\" == typeof t && r(t) && e.push(t), t.children) { var n = tXml.filter(t.children, r); e = e.concat(n) } }), e }, tXml.stringify = function (t) { function r(t) { if (t) for (var r = 0; r < t.length; r++)\"string\" == typeof t[r] ? n += t[r].trim() : e(t[r]) } function e(t) { n += \"<\" + t.tagName; for (var e in t.attributes) n += null === t.attributes[e] ? \" \" + e : -1 === t.attributes[e].indexOf('\"') ? \" \" + e + '=\"' + t.attributes[e].trim() + '\"' : \" \" + e + \"='\" + t.attributes[e].trim() + \"'\"; n += \">\", r(t.children), n += \"</\" + t.tagName + \">\" } var n = \"\"; return r(t), n }, tXml.toContentString = function (t) { if (Array.isArray(t)) { var r = \"\"; return t.forEach(function (t) { r += \" \" + tXml.toContentString(t), r = r.trim() }), r } return \"object\" == typeof t ? tXml.toContentString(t.children) : \" \" + t }, tXml.getElementById = function (t, r, e) { var n = tXml(t, { attrValue: r, simplify: e }); return e ? n : n[0] }, tXml.getElementsByClassName = function (t, r, e) { return tXml(t, { attrName: \"class\", attrValue: \"[a-zA-Z0-9-s ]*\" + r + \"[a-zA-Z0-9-s ]*\", simplify: e }) }, tXml.parseStream = function (t, r) { if (\"function\" == typeof r && (cb = r, r = 0), \"string\" == typeof r && (r = r.length + 2), \"string\" == typeof t) { var e = require(\"fs\"); t = e.createReadStream(t, { start: r }), r = 0 } var n = r, i = \"\", a = 0; return t.on(\"data\", function (r) { a++, i += r; for (var e = 0; ;) { n = i.indexOf(\"<\", n) + 1; var o = tXml(i, { pos: n, parseNode: !0 }); if (n = o.pos, n > i.length - 1 || e > n) return void (e && (i = i.slice(e), n = 0, e = 0)); t.emit(\"xml\", o), e = n } i = i.slice(n), n = 0 }), t.on(\"end\", function () { console.log(\"end\") }), t }, \"object\" == typeof module && (module.exports = tXml);\r\n    };\r\n\r\n    /*!\r\n    JSZipUtils - A collection of cross-browser utilities to go along with JSZip.\r\n    <http://stuk.github.io/jszip-utils>\r\n    (c) 2014 Stuart Knightley, David Duponchel\r\n    Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip-utils/master/LICENSE.markdown.\r\n    */\r\n    !function (a) { \"object\" == typeof exports ? module.exports = a() : \"function\" == typeof define && define.amd ? define(a) : \"undefined\" != typeof window ? window.JSZipUtils = a() : \"undefined\" != typeof global ? global.JSZipUtils = a() : \"undefined\" != typeof self && (self.JSZipUtils = a()) }(function () { return function a(b, c, d) { function e(g, h) { if (!c[g]) { if (!b[g]) { var i = \"function\" == typeof require && require; if (!h && i) return i(g, !0); if (f) return f(g, !0); throw new Error(\"Cannot find module '\" + g + \"'\") } var j = c[g] = { exports: {} }; b[g][0].call(j.exports, function (a) { var c = b[g][1][a]; return e(c ? c : a) }, j, j.exports, a, b, c, d) } return c[g].exports } for (var f = \"function\" == typeof require && require, g = 0; g < d.length; g++)e(d[g]); return e }({ 1: [function (a, b) { \"use strict\"; function c() { try { return new window.XMLHttpRequest } catch (a) { } } function d() { try { return new window.ActiveXObject(\"Microsoft.XMLHTTP\") } catch (a) { } } var e = {}; e._getBinaryFromXHR = function (a) { return a.response || a.responseText }; var f = window.ActiveXObject ? function () { return c() || d() } : c; e.getBinaryContent = function (a, b) { try { var c = f(); c.open(\"GET\", a, !0), \"responseType\" in c && (c.responseType = \"arraybuffer\"), c.overrideMimeType && c.overrideMimeType(\"text/plain; charset=x-user-defined\"), c.onreadystatechange = function () { var d, f; if (4 === c.readyState) if (200 === c.status || 0 === c.status) { d = null, f = null; try { d = e._getBinaryFromXHR(c) } catch (g) { f = new Error(g) } b(f, d) } else b(new Error(\"Ajax error for \" + a + \" : \" + this.status + \" \" + this.statusText), null) }, c.send() } catch (d) { b(new Error(d), null) } }, b.exports = e }, {}] }, {}, [1])(1) });\r\n\r\n    /**\r\n     * Colorz (or Colz) is a Javascript \"library\" to help\r\n     * in color conversion between the usual color-spaces\r\n     * Hex - Rgb - Hsl / Hsv - Hsb\r\n     *\r\n     * It provides some helpers to output Canvas / CSS\r\n     * color strings.\r\n     *\r\n     * by Carlos Cabo 2013\r\n     * http://carloscabo.com\r\n     *\r\n     * Some formulas borrowed from Wikipedia or other authors.\r\n    */\r\n\r\n    (function (name, definition) {\r\n        if (typeof define === \"function\") {\r\n            define(definition);\r\n        } else if (typeof module !== \"undefined\" && module.exports) {\r\n            module.exports = definition();\r\n        } else {\r\n            var theModule = definition(),\r\n                global = this,\r\n                old = global[name];\r\n            theModule.noConflict = function () {\r\n                global[name] = old;\r\n                return theModule;\r\n            };\r\n            global[name] = theModule;\r\n        }\r\n    })(\"colz\", function () {\r\n        var round = Math.round,\r\n            toString = \"toString\",\r\n            colz = colz || {},\r\n            Rgb,\r\n            Rgba,\r\n            Hsl,\r\n            Hsla,\r\n            Color,\r\n            ColorScheme,\r\n            hexToRgb,\r\n            componentToHex,\r\n            rgbToHex,\r\n            rgbToHsl,\r\n            hue2rgb,\r\n            hslToRgb,\r\n            rgbToHsb,\r\n            hsbToRgb,\r\n            hsbToHsl,\r\n            hsvToHsl,\r\n            hsvToRgb,\r\n            randomColor;\r\n        Rgb = colz.Rgb = function (col) {\r\n            this.r = col[0];\r\n            this.g = col[1];\r\n            this.b = col[2];\r\n        };\r\n        Rgb.prototype[toString] = function () {\r\n            return \"rgb(\" + this.r + \",\" + this.g + \",\" + this.b + \")\";\r\n        };\r\n        Rgba = colz.Rgba = function (col) {\r\n            this.r = col[0];\r\n            this.g = col[1];\r\n            this.b = col[2];\r\n            this.a = col[3];\r\n        };\r\n        Rgba.prototype[toString] = function () {\r\n            return (\r\n                \"rgba(\" + this.r + \",\" + this.g + \",\" + this.b + \",\" + this.a + \")\"\r\n            );\r\n        };\r\n        Hsl = colz.Hsl = function (col) {\r\n            this.h = col[0];\r\n            this.s = col[1];\r\n            this.l = col[2];\r\n        };\r\n        Hsl.prototype[toString] = function () {\r\n            return \"hsl(\" + this.h + \",\" + this.s + \"%,\" + this.l + \"%)\";\r\n        };\r\n        Hsla = colz.Hsla = function (col) {\r\n            this.h = col[0];\r\n            this.s = col[1];\r\n            this.l = col[2];\r\n            this.a = col[3];\r\n        };\r\n        Hsla.prototype[toString] = function () {\r\n            return (\r\n                \"hsla(\" + this.h + \",\" + this.s + \"%,\" + this.l + \"%,\" + this.a + \")\"\r\n            );\r\n        };\r\n        Color = colz.Color = function () {\r\n            this.hex = this.r = this.g = this.b = this.h = this.s = this.l = this.a = this.hsl = this.hsla = this.rgb = this.rgba = null;\r\n            this.init(arguments);\r\n        };\r\n        var colorPrototype = Color.prototype;\r\n        colorPrototype.init = function (arg) {\r\n            var _this = this;\r\n            if (typeof arg[0] === \"string\") {\r\n                if (arg[0].charAt(0) !== \"#\") {\r\n                    arg[0] = \"#\" + arg[0];\r\n                }\r\n                if (arg[0].length < 7) {\r\n                    arg[0] =\r\n                        \"#\" +\r\n                        arg[0][1] +\r\n                        arg[0][1] +\r\n                        arg[0][2] +\r\n                        arg[0][2] +\r\n                        arg[0][3] +\r\n                        arg[0][3];\r\n                }\r\n                _this.hex = arg[0].toLowerCase();\r\n                _this.rgb = new Rgb(hexToRgb(_this.hex));\r\n                _this.r = _this.rgb.r;\r\n                _this.g = _this.rgb.g;\r\n                _this.b = _this.rgb.b;\r\n                _this.a = 1;\r\n                _this.rgba = new Rgba([_this.r, _this.g, _this.b, _this.a]);\r\n            }\r\n            if (typeof arg[0] === \"number\") {\r\n                _this.r = arg[0];\r\n                _this.g = arg[1];\r\n                _this.b = arg[2];\r\n                if (typeof arg[3] === \"undefined\") {\r\n                    _this.a = 1;\r\n                } else {\r\n                    _this.a = arg[3];\r\n                }\r\n                _this.rgb = new Rgb([_this.r, _this.g, _this.b]);\r\n                _this.rgba = new Rgba([_this.r, _this.g, _this.b, _this.a]);\r\n                _this.hex = rgbToHex([_this.r, _this.g, _this.b]);\r\n            }\r\n            if (arg[0] instanceof Array) {\r\n                _this.r = arg[0][0];\r\n                _this.g = arg[0][1];\r\n                _this.b = arg[0][2];\r\n                if (typeof arg[0][3] === \"undefined\") {\r\n                    _this.a = 1;\r\n                } else {\r\n                    _this.a = arg[0][3];\r\n                }\r\n                _this.rgb = new Rgb([_this.r, _this.g, _this.b]);\r\n                _this.rgba = new Rgba([_this.r, _this.g, _this.b, _this.a]);\r\n                _this.hex = rgbToHex([_this.r, _this.g, _this.b]);\r\n            }\r\n            _this.hsl = new Hsl(colz.rgbToHsl([_this.r, _this.g, _this.b]));\r\n            _this.h = _this.hsl.h;\r\n            _this.s = _this.hsl.s;\r\n            _this.l = _this.hsl.l;\r\n            _this.hsla = new Hsla([_this.h, _this.s, _this.l, _this.a]);\r\n        };\r\n        colorPrototype.setHue = function (newhue) {\r\n            var _this = this;\r\n            _this.h = newhue;\r\n            _this.hsl.h = newhue;\r\n            _this.hsla.h = newhue;\r\n            _this.updateFromHsl();\r\n        };\r\n        colorPrototype.setSat = function (newsat) {\r\n            var _this = this;\r\n            _this.s = newsat;\r\n            _this.hsl.s = newsat;\r\n            _this.hsla.s = newsat;\r\n            _this.updateFromHsl();\r\n        };\r\n        colorPrototype.setLum = function (newlum) {\r\n            var _this = this;\r\n            _this.l = newlum;\r\n            _this.hsl.l = newlum;\r\n            _this.hsla.l = newlum;\r\n            _this.updateFromHsl();\r\n        };\r\n        colorPrototype.setAlpha = function (newalpha) {\r\n            this.a = newalpha;\r\n            this.hsla.a = newalpha;\r\n            this.rgba.a = newalpha;\r\n        };\r\n        colorPrototype.updateFromHsl = function () {\r\n            this.rgb = null;\r\n            this.rgb = new Rgb(colz.hslToRgb([this.h, this.s, this.l]));\r\n            this.r = this.rgb.r;\r\n            this.g = this.rgb.g;\r\n            this.b = this.rgb.b;\r\n            this.rgba.r = this.rgb.r;\r\n            this.rgba.g = this.rgb.g;\r\n            this.rgba.b = this.rgb.b;\r\n            this.hex = null;\r\n            this.hex = rgbToHex([this.r, this.g, this.b]);\r\n        };\r\n        randomColor = colz.randomColor = function () {\r\n            var r = \"#\" + Math.random().toString(16).slice(2, 8);\r\n            return new Color(r);\r\n        };\r\n        hexToRgb = colz.hexToRgb = function (hex) {\r\n            var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n            return result\r\n                ? [\r\n                    parseInt(result[1], 16),\r\n                    parseInt(result[2], 16),\r\n                    parseInt(result[3], 16)\r\n                ]\r\n                : null;\r\n        };\r\n        componentToHex = colz.componentToHex = function (c) {\r\n            var hex = c.toString(16);\r\n            return hex.length === 1 ? \"0\" + hex : hex;\r\n        };\r\n        rgbToHex = colz.rgbToHex = function () {\r\n            var arg, r, g, b;\r\n            arg = arguments;\r\n            if (arg.length > 1) {\r\n                r = arg[0];\r\n                g = arg[1];\r\n                b = arg[2];\r\n            } else {\r\n                r = arg[0][0];\r\n                g = arg[0][1];\r\n                b = arg[0][2];\r\n            }\r\n            return \"#\" + componentToHex(r) + componentToHex(g) + componentToHex(b);\r\n        };\r\n        rgbToHsl = colz.rgbToHsl = function () {\r\n            var arg, r, g, b, h, s, l, d, max, min;\r\n            arg = arguments;\r\n            if (typeof arg[0] === \"number\") {\r\n                r = arg[0];\r\n                g = arg[1];\r\n                b = arg[2];\r\n            } else {\r\n                r = arg[0][0];\r\n                g = arg[0][1];\r\n                b = arg[0][2];\r\n            }\r\n            r /= 255;\r\n            g /= 255;\r\n            b /= 255;\r\n            max = Math.max(r, g, b);\r\n            min = Math.min(r, g, b);\r\n            l = (max + min) / 2;\r\n            if (max === min) {\r\n                h = s = 0;\r\n            } else {\r\n                d = max - min;\r\n                s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n                switch (max) {\r\n                    case r:\r\n                        h = (g - b) / d + (g < b ? 6 : 0);\r\n                        break;\r\n                    case g:\r\n                        h = (b - r) / d + 2;\r\n                        break;\r\n                    case b:\r\n                        h = (r - g) / d + 4;\r\n                        break;\r\n                }\r\n                h /= 6;\r\n            }\r\n            h = round(h * 360);\r\n            s = round(s * 100);\r\n            l = round(l * 100);\r\n            return [h, s, l];\r\n        };\r\n        hue2rgb = colz.hue2rgb = function (p, q, t) {\r\n            if (t < 0) {\r\n                t += 1;\r\n            }\r\n            if (t > 1) {\r\n                t -= 1;\r\n            }\r\n            if (t < 1 / 6) {\r\n                return p + (q - p) * 6 * t;\r\n            }\r\n            if (t < 1 / 2) {\r\n                return q;\r\n            }\r\n            if (t < 2 / 3) {\r\n                return p + (q - p) * (2 / 3 - t) * 6;\r\n            }\r\n            return p;\r\n        };\r\n        hslToRgb = colz.hslToRgb = function () {\r\n            var arg, r, g, b, h, s, l, q, p;\r\n            arg = arguments;\r\n            if (typeof arg[0] === \"number\") {\r\n                h = arg[0] / 360;\r\n                s = arg[1] / 100;\r\n                l = arg[2] / 100;\r\n            } else {\r\n                h = arg[0][0] / 360;\r\n                s = arg[0][1] / 100;\r\n                l = arg[0][2] / 100;\r\n            }\r\n            if (s === 0) {\r\n                r = g = b = l;\r\n            } else {\r\n                q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n                p = 2 * l - q;\r\n                r = colz.hue2rgb(p, q, h + 1 / 3);\r\n                g = colz.hue2rgb(p, q, h);\r\n                b = colz.hue2rgb(p, q, h - 1 / 3);\r\n            }\r\n            return [round(r * 255), round(g * 255), round(b * 255)];\r\n        };\r\n        rgbToHsb = colz.rgbToHsb = function (r, g, b) {\r\n            var max, min, h, s, v, d;\r\n            r = r / 255;\r\n            g = g / 255;\r\n            b = b / 255;\r\n            max = Math.max(r, g, b);\r\n            min = Math.min(r, g, b);\r\n            v = max;\r\n            d = max - min;\r\n            s = max === 0 ? 0 : d / max;\r\n            if (max === min) {\r\n                h = 0;\r\n            } else {\r\n                switch (max) {\r\n                    case r:\r\n                        h = (g - b) / d + (g < b ? 6 : 0);\r\n                        break;\r\n                    case g:\r\n                        h = (b - r) / d + 2;\r\n                        break;\r\n                    case b:\r\n                        h = (r - g) / d + 4;\r\n                        break;\r\n                }\r\n                h /= 6;\r\n            }\r\n            h = round(h * 360);\r\n            s = round(s * 100);\r\n            v = round(v * 100);\r\n            return [h, s, v];\r\n        };\r\n        hsbToRgb = colz.hsbToRgb = function (h, s, v) {\r\n            var r, g, b, i, f, p, q, t;\r\n            if (v === 0) {\r\n                return [0, 0, 0];\r\n            }\r\n            s = s / 100;\r\n            v = v / 100;\r\n            h = h / 60;\r\n            i = Math.floor(h);\r\n            f = h - i;\r\n            p = v * (1 - s);\r\n            q = v * (1 - s * f);\r\n            t = v * (1 - s * (1 - f));\r\n            if (i === 0) {\r\n                r = v;\r\n                g = t;\r\n                b = p;\r\n            } else if (i === 1) {\r\n                r = q;\r\n                g = v;\r\n                b = p;\r\n            } else if (i === 2) {\r\n                r = p;\r\n                g = v;\r\n                b = t;\r\n            } else if (i === 3) {\r\n                r = p;\r\n                g = q;\r\n                b = v;\r\n            } else if (i === 4) {\r\n                r = t;\r\n                g = p;\r\n                b = v;\r\n            } else if (i === 5) {\r\n                r = v;\r\n                g = p;\r\n                b = q;\r\n            }\r\n            r = Math.floor(r * 255);\r\n            g = Math.floor(g * 255);\r\n            b = Math.floor(b * 255);\r\n            return [r, g, b];\r\n        };\r\n        hsbToHsl = colz.hsbToHsl = function (h, s, b) {\r\n            return colz.rgbToHsl(colz.hsbToRgb(h, s, b));\r\n        };\r\n        hsvToHsl = colz.hsvToHsl = colz.hsbToHsl;\r\n        hsvToRgb = colz.hsvToRgb = colz.hsbToRgb;\r\n        ColorScheme = colz.ColorScheme = function (color_val, angle_array) {\r\n            this.palette = [];\r\n            if (angle_array === undefined && color_val instanceof Array) {\r\n                this.createFromColors(color_val);\r\n            } else {\r\n                this.createFromAngles(color_val, angle_array);\r\n            }\r\n        };\r\n        var colorSchemePrototype = ColorScheme.prototype;\r\n        colorSchemePrototype.createFromColors = function (color_val) {\r\n            for (var i in color_val) {\r\n                if (color_val.hasOwnProperty(i)) {\r\n                    this.palette.push(new Color(color_val[i]));\r\n                }\r\n            }\r\n            return this.palette;\r\n        };\r\n        colorSchemePrototype.createFromAngles = function (color_val, angle_array) {\r\n            this.palette.push(new Color(color_val));\r\n            for (var i in angle_array) {\r\n                if (angle_array.hasOwnProperty(i)) {\r\n                    var tempHue = (this.palette[0].h + angle_array[i]) % 360;\r\n                    this.palette.push(\r\n                        new Color(\r\n                            colz.hslToRgb([tempHue, this.palette[0].s, this.palette[0].l])\r\n                        )\r\n                    );\r\n                }\r\n            }\r\n            return this.palette;\r\n        };\r\n        ColorScheme.Compl = function (color_val) {\r\n            return new ColorScheme(color_val, [180]);\r\n        };\r\n        ColorScheme.Triad = function (color_val) {\r\n            return new ColorScheme(color_val, [120, 240]);\r\n        };\r\n        ColorScheme.Tetrad = function (color_val) {\r\n            return new ColorScheme(color_val, [60, 180, 240]);\r\n        };\r\n        ColorScheme.Analog = function (color_val) {\r\n            return new ColorScheme(color_val, [-45, 45]);\r\n        };\r\n        ColorScheme.Split = function (color_val) {\r\n            return new ColorScheme(color_val, [150, 210]);\r\n        };\r\n        ColorScheme.Accent = function (color_val) {\r\n            return new ColorScheme(color_val, [-45, 45, 180]);\r\n        };\r\n        return colz;\r\n    });\r\n}(jQuery));\r\n"
  },
  {
    "path": "example/pages/include/SheetJS/del/css/sheetjs.css",
    "content": "/* sheetjs.css (C) 2014-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n#drop{\n  border:2px dashed #bbb;\n  -moz-border-radius:5px;\n  -webkit-border-radius:5px;\n  border-radius:5px;\n  padding:25px;\n  text-align:center;\n  width:128px;\n  font:20pt bold,\"Vollkorn\";color:#bbb\n}\n\n#left {\n  width:188px;\n  position:absolute;\n  left:0;\n}\n#right {\n  position:absolute;\n  left:200px;\n}\n#logo {\n  padding:25px;\n}\n#header {\n  height:168px;\n}\n\n.winpt { width:98%; }\n.success { color: #468847; }\n.error { color: #b94a48; }\n.info { color: #3a87ad; }\npre { white-space: pre-wrap; }\n"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/dist/README.md",
    "content": "# Handsontable distributions\n\n## Full distribution (recommended)\n\nThe full distribution allows you to use Handsontable by including just 2 files:\n```html\n<script src=\"dist/handsontable.full.js\"></script>\n<link rel=\"stylesheet\" media=\"screen\" href=\"dist/handsontable.full.css\">\n```\nYou can also use minified files:  \n```html\n<script src=\"dist/handsontable.full.min.js\"></script>\n<link rel=\"stylesheet\" media=\"screen\" href=\"dist/handsontable.full.min.css\">\n```\n\nIf you use a date picker or numeric cell types, you will also have to include Pikaday, moment.js and numbro.js.\n\n**handsontable.full.js** and **handsontable.full.css** are compiled with ___all___ the needed dependencies (except language files - see below).\n\n## Bare distribution\n\nIf you are a \"Bob the Builder\" kind of hacker, you will need to load Handsontable JS, CSS and their dependencies:\n```html\n<!-- Required dependencies (as external scripts) -->\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.5.1/pikaday.min.js\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/numbro/1.11.0/numbro.min.js\"></script>\n\n<!-- Handsontable bare files -->\n<script src=\"dist/handsontable.js\"></script>\n<link rel=\"stylesheet\" media=\"screen\" href=\"https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.5.1/css/pikaday.min.css\">\n<link rel=\"stylesheet\" media=\"screen\" href=\"dist/handsontable.css\">\n```\n\n**handsontable.js** and **handsontable.css** are compiled ___without___ the needed dependencies.\n\n## Internationalization\nSince Handsontable [35.0.0](https://docs.handsontable.com/0.35.0/tutorial-release-notes.html) it is possible to include files which will register languages dictionaries. They allow to translate parts of Handsontable UI. You can either use only particular languages files or include all of them at once as a single file.\n\nAll the information about the API and additional options can be found at our [official documentation](https://docs.handsontable.com/0.35.0/tutorial-internationalization.html).\n\n```html\n<!-- Internationalization, Polish - Poland language-country file -->\n<script src=\"languages/pl-PL.js\"></script>\n\n<!-- Internationalization, all available language files in one file -->\n<script src=\"languages/all.js\"></script>\n```\n\n## Custom distribution\n\nIf you want to build your own custom Handsontable package distribution check out our [guide](https://docs.handsontable.com/tutorial-custom-build.html) covering all the details.\n"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/dist/handsontable.css",
    "content": "/*!\n * (The MIT License)\n * \n * Copyright (c) 2012-2014 Marcin Warpechowski\n * Copyright (c) 2015 Handsoncode sp. z o.o. <hello@handsoncode.net>\n * \n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * 'Software'), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n * \n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n * \n * Version: 2.0.0\n * Release date: 11/04/2018 (built at 10/04/2018 11:38:33)\n */\n/**\n * Fix for bootstrap styles\n */\n.handsontable .table th, .handsontable .table td {\n  border-top: none;\n}\n\n.handsontable tr {\n  background: #fff;\n}\n\n.handsontable td {\n  background-color: inherit;\n}\n\n.handsontable .table caption + thead tr:first-child th,\n.handsontable .table caption + thead tr:first-child td,\n.handsontable .table colgroup + thead tr:first-child th,\n.handsontable .table colgroup + thead tr:first-child td,\n.handsontable .table thead:first-child tr:first-child th,\n.handsontable .table thead:first-child tr:first-child td {\n  border-top: 1px solid #CCCCCC;\n}\n\n/* table-bordered */\n.handsontable .table-bordered {\n  border: 0;\n  border-collapse: separate;\n}\n\n.handsontable .table-bordered th,\n.handsontable .table-bordered td {\n  border-left: none;\n}\n\n.handsontable .table-bordered th:first-child,\n.handsontable .table-bordered td:first-child {\n  border-left: 1px solid #CCCCCC;\n}\n\n.handsontable .table > tbody > tr > td,\n.handsontable .table > tbody > tr > th,\n.handsontable .table > tfoot > tr > td,\n.handsontable .table > tfoot > tr > th,\n.handsontable .table > thead > tr > td,\n.handsontable .table > thead > tr > th {\n  line-height: 21px;\n  padding: 0 4px;\n}\n\n.col-lg-1.handsontable, .col-lg-10.handsontable, .col-lg-11.handsontable, .col-lg-12.handsontable,\n.col-lg-2.handsontable, .col-lg-3.handsontable, .col-lg-4.handsontable, .col-lg-5.handsontable, .col-lg-6.handsontable, .col-lg-7.handsontable, .col-lg-8.handsontable, .col-lg-9.handsontable,\n.col-md-1.handsontable, .col-md-10.handsontable, .col-md-11.handsontable, .col-md-12.handsontable,\n.col-md-2.handsontable, .col-md-3.handsontable, .col-md-4.handsontable, .col-md-5.handsontable, .col-md-6.handsontable, .col-md-7.handsontable, .col-md-8.handsontable, .col-md-9.handsontable\n.col-sm-1.handsontable, .col-sm-10.handsontable, .col-sm-11.handsontable, .col-sm-12.handsontable,\n.col-sm-2.handsontable, .col-sm-3.handsontable, .col-sm-4.handsontable, .col-sm-5.handsontable, .col-sm-6.handsontable, .col-sm-7.handsontable, .col-sm-8.handsontable, .col-sm-9.handsontable\n.col-xs-1.handsontable, .col-xs-10.handsontable, .col-xs-11.handsontable, .col-xs-12.handsontable,\n.col-xs-2.handsontable, .col-xs-3.handsontable, .col-xs-4.handsontable, .col-xs-5.handsontable, .col-xs-6.handsontable, .col-xs-7.handsontable, .col-xs-8.handsontable, .col-xs-9.handsontable {\n  padding-left: 0;\n  padding-right: 0;\n}\n\n.handsontable .table-striped > tbody > tr:nth-of-type(even) {\n  background-color: #FFF;\n}\n.handsontable {\n  position: relative;\n}\n\n.handsontable .hide{\n  display: none;\n}\n.handsontable .relative {\n  position: relative;\n}\n\n.handsontable.htAutoSize {\n  visibility: hidden;\n  left: -99000px;\n  position: absolute;\n  top: -99000px;\n}\n\n.handsontable .wtHider {\n  width: 0;\n}\n\n.handsontable .wtSpreader {\n  position: relative;\n  width: 0; /*must be 0, otherwise blank space appears in scroll demo after scrolling max to the right */\n  height: auto;\n}\n\n.handsontable table,\n.handsontable tbody,\n.handsontable thead,\n.handsontable td,\n.handsontable th,\n.handsontable input,\n.handsontable textarea,\n.handsontable div {\n  box-sizing: content-box;\n  -webkit-box-sizing: content-box;\n  -moz-box-sizing: content-box;\n}\n\n.handsontable input,\n.handsontable textarea {\n  min-height: initial;\n}\n\n.handsontable table.htCore {\n  border-collapse: separate;\n  /* it must be separate, otherwise there are offset miscalculations in WebKit: http://stackoverflow.com/questions/2655987/border-collapse-differences-in-ff-and-webkit */\n  /* this actually only changes appearance of user selection - does not make text unselectable */\n  /* -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -o-user-select: none;\n  -ms-user-select: none;\n  user-select: none; */ /* no browser supports unprefixed version */\n  border-spacing: 0;\n  margin: 0;\n  border-width: 0;\n  table-layout: fixed;\n  width: 0;\n  outline-width: 0;\n  /* reset bootstrap table style. for more info see: https://github.com/handsontable/handsontable/issues/224 */\n  max-width: none;\n  max-height: none;\n}\n\n.handsontable col {\n  width: 50px;\n}\n\n.handsontable col.rowHeader {\n  width: 50px;\n}\n\n.handsontable th,\n.handsontable td {\n  border-top-width: 0;\n  border-left-width: 0;\n  border-right: 1px solid #CCC;\n  border-bottom: 1px solid #CCC;\n  height: 22px;\n  empty-cells: show;\n  line-height: 21px;\n  padding: 0 4px 0 4px;\n  /* top, bottom padding different than 0 is handled poorly by FF with HTML5 doctype */\n  background-color: #FFF;\n  vertical-align: top;\n  overflow: hidden;\n  outline-width: 0;\n  white-space: pre-line;\n  /* preserve new line character in cell */\n  background-clip: padding-box;\n}\n\n.handsontable td.htInvalid {\n  background-color: #ff4c42 !important; /*gives priority over td.area selection background*/\n}\n\n.handsontable td.htNoWrap {\n  white-space: nowrap;\n}\n\n.handsontable th:last-child {\n  /*Foundation framework fix*/\n  border-right: 1px solid #CCC;\n  border-bottom: 1px solid #CCC;\n}\n\n.handsontable tr:first-child th.htNoFrame,\n.handsontable th:first-child.htNoFrame,\n.handsontable th.htNoFrame {\n  border-left-width: 0;\n  background-color: white;\n  border-color: #FFF;\n}\n\n.handsontable th:first-child,\n.handsontable th:nth-child(2),\n.handsontable td:first-of-type,\n.handsontable .htNoFrame + th,\n.handsontable .htNoFrame + td {\n  border-left: 1px solid #CCC;\n}\n\n.handsontable.htRowHeaders thead tr th:nth-child(2) {\n  border-left: 1px solid #CCC;\n}\n\n.handsontable tr:first-child th,\n.handsontable tr:first-child td {\n  border-top: 1px solid #CCC;\n}\n\n.ht_master:not(.innerBorderLeft):not(.emptyColumns) ~ .handsontable tbody tr th,\n.ht_master:not(.innerBorderLeft):not(.emptyColumns) ~ .handsontable:not(.ht_clone_top) thead tr th:first-child {\n  border-right-width: 0;\n}\n\n.ht_master:not(.innerBorderTop) thead tr:last-child th,\n.ht_master:not(.innerBorderTop) ~ .handsontable thead tr:last-child th,\n.ht_master:not(.innerBorderTop) thead tr.lastChild th,\n.ht_master:not(.innerBorderTop) ~ .handsontable thead tr.lastChild th {\n  border-bottom-width: 0;\n}\n\n.handsontable th {\n  background-color: #f3f3f3;\n  color: #222;\n  text-align: center;\n  font-weight: normal;\n  white-space: nowrap;\n}\n\n.handsontable thead th {\n  padding: 0;\n}\n\n.handsontable th.active {\n  background-color: #CCC;\n}\n.handsontable thead th .relative {\n  padding: 2px 4px;\n}\n\n#hot-display-license-info {\n  font-size: 9px;\n  color: #323232 ;\n  padding: 5px 0 3px 0;\n  font-family: Helvetica, Arial, sans-serif;\n  text-align: left;\n}\n\n/* plugins */\n\n/* row + column resizer*/\n.handsontable .manualColumnResizer {\n  position: fixed;\n  top: 0;\n  cursor: col-resize;\n  z-index: 110;\n  width: 5px;\n  height: 25px;\n}\n\n.handsontable .manualRowResizer {\n  position: fixed;\n  left: 0;\n  cursor: row-resize;\n  z-index: 110;\n  height: 5px;\n  width: 50px;\n}\n\n.handsontable .manualColumnResizer:hover,\n.handsontable .manualColumnResizer.active,\n.handsontable .manualRowResizer:hover,\n.handsontable .manualRowResizer.active {\n  background-color: #AAB;\n}\n\n.handsontable .manualColumnResizerGuide {\n  position: fixed;\n  right: 0;\n  top: 0;\n  background-color: #AAB;\n  display: none;\n  width: 0;\n  border-right: 1px dashed #777;\n  margin-left: 5px;\n}\n\n.handsontable .manualRowResizerGuide {\n  position: fixed;\n  left: 0;\n  bottom: 0;\n  background-color: #AAB;\n  display: none;\n  height: 0;\n  border-bottom: 1px dashed #777;\n  margin-top: 5px;\n}\n\n.handsontable .manualColumnResizerGuide.active,\n.handsontable .manualRowResizerGuide.active {\n  display: block;\n  z-index: 199;\n}\n\n.handsontable .columnSorting {\n  position: relative;\n}\n\n.handsontable .columnSorting:hover {\n  text-decoration: underline;\n  cursor: pointer;\n}\n\n.handsontable .columnSorting.ascending::after {\n  content: '\\25B2';\n  color: #5f5f5f;\n  position: absolute;\n  right: -15px;\n}\n\n.handsontable .columnSorting.descending::after {\n  content: '\\25BC';\n  color: #5f5f5f;\n  position: absolute;\n  right: -15px;\n}\n\n/* Selection */\n.handsontable .wtBorder {\n  position: absolute;\n  font-size: 0;\n}\n.handsontable .wtBorder.hidden{\n  display:none !important;\n}\n\n.handsontable td.area,\n.handsontable td.area-1,\n.handsontable td.area-2,\n.handsontable td.area-3,\n.handsontable td.area-4,\n.handsontable td.area-5,\n.handsontable td.area-6,\n.handsontable td.area-7 {\n  position: relative;\n}\n\n.handsontable td.area:before,\n.handsontable td.area-1:before,\n.handsontable td.area-2:before,\n.handsontable td.area-3:before,\n.handsontable td.area-4:before,\n.handsontable td.area-5:before,\n.handsontable td.area-6:before,\n.handsontable td.area-7:before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  bottom: -100%\\9; /* Fix for IE9 to spread the \":before\" pseudo element to 100% height of the parent element */\n  background: #005eff;\n}\n\n/* Fix for IE10 and IE11 to spread the \":before\" pseudo element to 100% height of the parent element */\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n  .handsontable td.area:before,\n  .handsontable td.area-1:before,\n  .handsontable td.area-2:before,\n  .handsontable td.area-3:before,\n  .handsontable td.area-4:before,\n  .handsontable td.area-5:before,\n  .handsontable td.area-6:before,\n  .handsontable td.area-7:before {\n    bottom: -100%;\n  }\n}\n\n.handsontable td.area:before {\n  opacity: 0.1;\n}\n.handsontable td.area-1:before {\n  opacity: 0.2;\n}\n.handsontable td.area-2:before {\n  opacity: 0.27;\n}\n.handsontable td.area-3:before {\n  opacity: 0.35;\n}\n.handsontable td.area-4:before {\n  opacity: 0.41;\n}\n.handsontable td.area-5:before {\n  opacity: 0.47;\n}\n.handsontable td.area-6:before {\n  opacity: 0.54;\n}\n.handsontable td.area-7:before {\n  opacity: 0.58;\n}\n\n.handsontable tbody th.ht__highlight,\n.handsontable thead th.ht__highlight {\n  background-color: #dcdcdc;\n}\n\n.handsontable tbody th.ht__active_highlight,\n.handsontable thead th.ht__active_highlight {\n  background-color: #8eb0e7;\n  color: #000;\n}\n\n/* fill handle */\n\n.handsontable .wtBorder.corner {\n  font-size: 0;\n  cursor: crosshair;\n}\n\n.handsontable .htBorder.htFillBorder {\n  background: red;\n  width: 1px;\n  height: 1px;\n}\n\n.handsontableInput {\n  border:none;\n  outline-width: 0;\n  margin: 0 ;\n  padding: 1px 5px 0 5px;\n  font-family: inherit;\n  line-height: 21px;\n  font-size: inherit;\n  box-shadow: 0 0 0 2px #5292F7 inset;\n  resize: none;\n  /*below are needed to overwrite stuff added by jQuery UI Bootstrap theme*/\n  display: block;\n  color: #000;\n  border-radius: 0;\n  background-color: #FFF;\n  /*overwrite styles potentionally made by a framework*/\n}\n\n.handsontableInputHolder {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 104;\n}\n\n.htSelectEditor {\n  -webkit-appearance: menulist-button !important;\n  position: absolute;\n  width: auto;\n}\n\n/*\nTextRenderer readOnly cell\n*/\n\n.handsontable .htDimmed {\n  color: #777;\n}\n\n.handsontable .htSubmenu {\n  position: relative;\n}\n\n.handsontable .htSubmenu :after{\n  content: '\\25B6';\n  color: #777;\n  position: absolute;\n  right: 5px;\n}\n\n\n/*\nTextRenderer horizontal alignment\n*/\n.handsontable .htLeft{\n  text-align: left;\n}\n.handsontable .htCenter{\n  text-align: center;\n}\n.handsontable .htRight{\n  text-align: right;\n}\n.handsontable .htJustify{\n  text-align: justify;\n}\n/*\nTextRenderer vertical alignment\n*/\n.handsontable .htTop{\n  vertical-align: top;\n}\n.handsontable .htMiddle{\n  vertical-align: middle;\n}\n.handsontable .htBottom{\n  vertical-align: bottom;\n}\n\n/*\nTextRenderer placeholder value\n*/\n\n.handsontable .htPlaceholder {\n  color: #999;\n}\n\n/*\nAutocompleteRenderer down arrow\n*/\n\n.handsontable .htAutocompleteArrow {\n  float: right;\n  font-size: 10px;\n  color: #EEE;\n  cursor: default;\n  width: 16px;\n  text-align: center;\n}\n\n.handsontable td .htAutocompleteArrow:hover {\n  color: #777;\n}\n\n.handsontable td.area .htAutocompleteArrow {\n  color: #d3d3d3;\n}\n\n/*\nCheckboxRenderer\n*/\n.handsontable .htCheckboxRendererInput {\n  display: inline-block;\n  vertical-align: middle;\n}\n.handsontable .htCheckboxRendererInput.noValue {\n  opacity: 0.5;\n}\n.handsontable .htCheckboxRendererLabel {\n  cursor: pointer;\n  display: inline-block;\n  width: 100%;\n}\n\n/**\n * Handsontable in Handsontable\n */\n\n.handsontable .handsontable.ht_clone_top .wtHider {\n  padding: 0 0 5px 0;\n}\n\n/**\n* Autocomplete Editor\n*/\n.handsontable .autocompleteEditor.handsontable {\n  padding-right: 17px;\n}\n.handsontable .autocompleteEditor.handsontable.htMacScroll {\n  padding-right: 15px;\n}\n\n\n/**\n * Handsontable listbox theme\n */\n\n.handsontable.listbox {\n  margin: 0;\n}\n\n.handsontable.listbox .ht_master table {\n  border: 1px solid #ccc;\n  border-collapse: separate;\n  background: white;\n}\n\n.handsontable.listbox th,\n.handsontable.listbox tr:first-child th,\n.handsontable.listbox tr:last-child th,\n.handsontable.listbox tr:first-child td,\n.handsontable.listbox td {\n  border-color: transparent;\n}\n\n.handsontable.listbox th,\n.handsontable.listbox td {\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.handsontable.listbox td.htDimmed {\n  cursor: default;\n  color: inherit;\n  font-style: inherit;\n}\n\n.handsontable.listbox .wtBorder {\n  visibility: hidden;\n}\n\n.handsontable.listbox tr td.current,\n.handsontable.listbox tr:hover td {\n  background: #eee;\n}\n\n.ht_clone_top {\n  z-index: 101;\n}\n\n.ht_clone_left {\n  z-index: 102;\n}\n\n.ht_clone_top_left_corner,\n.ht_clone_bottom_left_corner {\n  z-index: 103;\n}\n\n.ht_clone_debug {\n  z-index: 103;\n}\n\n.handsontable td.htSearchResult {\n  background: #fcedd9;\n  color: #583707;\n}\n\n/*\nCell borders\n*/\n.htBordered{\n  /*box-sizing: border-box !important;*/\n  border-width: 1px;\n}\n.htBordered.htTopBorderSolid {\n  border-top-style: solid;\n  border-top-color: #000;\n}\n.htBordered.htRightBorderSolid {\n  border-right-style: solid;\n  border-right-color: #000;\n}\n.htBordered.htBottomBorderSolid {\n  border-bottom-style: solid;\n  border-bottom-color: #000;\n}\n.htBordered.htLeftBorderSolid {\n  border-left-style: solid;\n  border-left-color: #000;\n}\n\n.handsontable tbody tr th:nth-last-child(2) {\n  border-right: 1px solid #CCC;\n}\n\n.handsontable thead tr:nth-last-child(2) th.htGroupIndicatorContainer {\n  border-bottom: 1px solid #CCC;\n  padding-bottom: 5px;\n}\n\n\n.ht_clone_top_left_corner thead tr th:nth-last-child(2) {\n  border-right: 1px solid #CCC;\n}\n\n.htCollapseButton {\n  width: 10px;\n  height: 10px;\n  line-height: 10px;\n  text-align: center;\n  border-radius: 5px;\n  border: 1px solid #f3f3f3;\n  -webkit-box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);\n  box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);\n  cursor: pointer;\n  margin-bottom: 3px;\n  position: relative;\n}\n\n.htCollapseButton:after {\n  content: \"\";\n  height: 300%;\n  width: 1px;\n  display: block;\n  background: #ccc;\n  margin-left: 4px;\n  position: absolute;\n  /*top: -300%;*/\n  bottom: 10px;\n}\n\n\nthead .htCollapseButton {\n  right: 5px;\n  position: absolute;\n  top: 5px;\n  background: #fff;\n}\n\nthead .htCollapseButton:after {\n  height: 1px;\n  width: 700%;\n  right: 10px;\n  top: 4px;\n}\n\n.handsontable tr th .htExpandButton {\n  position: absolute;\n  width: 10px;\n  height: 10px;\n  line-height: 10px;\n  text-align: center;\n  border-radius: 5px;\n  border: 1px solid #f3f3f3;\n  -webkit-box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);\n  box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);\n  cursor: pointer;\n  top: 0;\n  display: none;\n}\n\n.handsontable thead tr th .htExpandButton {\n  /*left: 5px;*/\n  top: 5px;\n}\n\n.handsontable tr th .htExpandButton.clickable {\n  display: block;\n}\n\n.collapsibleIndicator {\n  position: absolute;\n  top: 50%;\n  transform: translate(0% ,-50%);\n  right: 5px;\n  border: 1px solid #A6A6A6;\n  line-height: 10px;\n  color: #222;\n  border-radius: 10px;\n  font-size: 10px;\n  width: 10px;\n  height: 10px;\n  cursor: pointer;\n  -webkit-box-shadow: 0 0 0 6px rgba(238,238,238,1);\n  -moz-box-shadow: 0 0 0 6px rgba(238,238,238,1);\n  box-shadow: 0 0 0 6px rgba(238,238,238,1);\n  background: #eee;\n}\n\n.handsontable col.hidden {\n  width: 0 !important;\n}\n\n.handsontable table tr th.lightRightBorder {\n  border-right: 1px solid #E6E6E6;\n}\n\n.handsontable tr.hidden,\n.handsontable tr.hidden td,\n.handsontable tr.hidden th {\n  display: none;\n}\n\n.ht_master,\n.ht_clone_left,\n.ht_clone_top,\n.ht_clone_bottom {\n  overflow: hidden;\n}\n\n.ht_master .wtHolder {\n  overflow: auto;\n}\n\n.handsontable .ht_master thead,\n.handsontable .ht_master tr th,\n.handsontable .ht_clone_left thead {\n  visibility: hidden;\n}\n\n.ht_clone_top .wtHolder,\n.ht_clone_left .wtHolder,\n.ht_clone_bottom .wtHolder {\n  overflow: hidden;\n}\n/*\n\n Handsontable Mobile Text Editor stylesheet\n\n */\n\n.handsontable.mobile,\n.handsontable.mobile .wtHolder {\n  -webkit-touch-callout:none;\n  -webkit-user-select:none;\n  -khtml-user-select:none;\n  -moz-user-select:none;\n  -ms-user-select:none;\n  user-select:none;\n  -webkit-tap-highlight-color:rgba(0,0,0,0);\n  -webkit-overflow-scrolling: touch;\n}\n\n.htMobileEditorContainer {\n  display: none;\n  position: absolute;\n  top: 0;\n  width: 70%;\n  height: 54pt;\n  background: #f8f8f8;\n  border-radius: 20px;\n  border: 1px solid #ebebeb;\n  z-index: 999;\n  box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  -webkit-text-size-adjust: none;\n}\n\n.topLeftSelectionHandle:not(.ht_master .topLeftSelectionHandle),\n.topLeftSelectionHandle-HitArea:not(.ht_master .topLeftSelectionHandle-HitArea) {\n  z-index: 9999;\n}\n\n/* Initial left/top coordinates - overwritten when actual position is set */\n.topLeftSelectionHandle,\n.topLeftSelectionHandle-HitArea,\n.bottomRightSelectionHandle,\n.bottomRightSelectionHandle-HitArea {\n  left: -10000px;\n  top: -10000px;\n}\n\n.htMobileEditorContainer.active {\n  display: block;\n}\n\n.htMobileEditorContainer .inputs {\n  position: absolute;\n  right: 210pt;\n  bottom: 10pt;\n  top: 10pt;\n  left: 14px;\n  height: 34pt;\n}\n\n.htMobileEditorContainer .inputs textarea {\n  font-size: 13pt;\n  border: 1px solid #a1a1a1;\n  -webkit-appearance: none;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n  position: absolute;\n  left: 14px;\n  right: 14px;\n  top: 0;\n  bottom: 0;\n  padding: 7pt;\n}\n\n.htMobileEditorContainer .cellPointer {\n  position: absolute;\n  top: -13pt;\n  height: 0;\n  width: 0;\n  left: 30px;\n\n  border-left: 13pt solid transparent;\n  border-right: 13pt solid transparent;\n  border-bottom: 13pt solid #ebebeb;\n}\n\n.htMobileEditorContainer .cellPointer.hidden {\n  display: none;\n}\n\n.htMobileEditorContainer .cellPointer:before {\n  content: '';\n  display: block;\n  position: absolute;\n  top: 2px;\n  height: 0;\n  width: 0;\n  left: -13pt;\n\n  border-left: 13pt solid transparent;\n  border-right: 13pt solid transparent;\n  border-bottom: 13pt solid #f8f8f8;\n}\n\n.htMobileEditorContainer .moveHandle {\n  position: absolute;\n  top: 10pt;\n  left: 5px;\n  width: 30px;\n  bottom: 0px;\n  cursor: move;\n  z-index: 9999;\n}\n\n.htMobileEditorContainer .moveHandle:after {\n  content: \"..\\A..\\A..\\A..\";\n  white-space: pre;\n  line-height: 10px;\n  font-size: 20pt;\n  display: inline-block;\n  margin-top: -8px;\n  color: #ebebeb;\n}\n\n.htMobileEditorContainer .positionControls {\n  width: 205pt;\n  position: absolute;\n  right: 5pt;\n  top: 0;\n  bottom: 0;\n}\n\n.htMobileEditorContainer .positionControls > div {\n  width: 50pt;\n  height: 100%;\n  float: left;\n}\n\n.htMobileEditorContainer .positionControls > div:after {\n  content: \" \";\n  display: block;\n  width: 15pt;\n  height: 15pt;\n  text-align: center;\n  line-height: 50pt;\n}\n\n.htMobileEditorContainer .leftButton:after,\n.htMobileEditorContainer .rightButton:after,\n.htMobileEditorContainer .upButton:after,\n.htMobileEditorContainer .downButton:after {\n  transform-origin: 5pt 5pt;\n  -webkit-transform-origin: 5pt 5pt;\n  margin: 21pt 0 0 21pt;\n}\n\n.htMobileEditorContainer .leftButton:after {\n  border-top: 2px solid #288ffe;\n  border-left: 2px solid #288ffe;\n  -webkit-transform: rotate(-45deg);\n  /*margin-top: 17pt;*/\n  /*margin-left: 20pt;*/\n}\n.htMobileEditorContainer .leftButton:active:after {\n  border-color: #cfcfcf;\n}\n\n.htMobileEditorContainer .rightButton:after {\n  border-top: 2px solid #288ffe;\n  border-left: 2px solid #288ffe;\n  -webkit-transform: rotate(135deg);\n  /*margin-top: 17pt;*/\n  /*margin-left: 10pt;*/\n}\n.htMobileEditorContainer .rightButton:active:after {\n  border-color: #cfcfcf;\n}\n\n.htMobileEditorContainer .upButton:after {\n  /*border-top: 2px solid #cfcfcf;*/\n  border-top: 2px solid #288ffe;\n  border-left: 2px solid #288ffe;\n  -webkit-transform: rotate(45deg);\n  /*margin-top: 22pt;*/\n  /*margin-left: 15pt;*/\n}\n.htMobileEditorContainer .upButton:active:after {\n  border-color: #cfcfcf;\n}\n\n.htMobileEditorContainer .downButton:after {\n  border-top: 2px solid #288ffe;\n  border-left: 2px solid #288ffe;\n  -webkit-transform: rotate(225deg);\n  /*margin-top: 15pt;*/\n  /*margin-left: 15pt;*/\n}\n.htMobileEditorContainer .downButton:active:after {\n  border-color: #cfcfcf;\n}\n\n.handsontable.hide-tween {\n  -webkit-animation: opacity-hide 0.3s;\n  animation: opacity-hide 0.3s;\n  animation-fill-mode: forwards;\n  -webkit-animation-fill-mode: forwards;\n}\n\n.handsontable.show-tween {\n  -webkit-animation: opacity-show 0.3s;\n  animation: opacity-show 0.3s;\n  animation-fill-mode: forwards;\n  -webkit-animation-fill-mode: forwards;\n}\n.htCommentCell {\n    position: relative;\n}\n\n.htCommentCell:after {\n    content: '';\n    position: absolute;\n    top: 0;\n    right: 0;\n    border-left: 6px solid transparent;\n    border-top: 6px solid black;\n}\n\n.htComments {\n    display: none;\n    z-index: 1059;\n    position: absolute;\n}\n\n.htCommentTextArea {\n    box-shadow: rgba(0, 0, 0, 0.117647) 0 1px 3px, rgba(0, 0, 0, 0.239216) 0 1px 2px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n    border: none;\n    border-left: 3px solid #ccc;\n    background-color: #fff;\n    width: 215px;\n    height: 90px;\n    font-size: 12px;\n    padding: 5px;\n    outline: 0px !important;\n    -webkit-appearance: none;\n}\n\n.htCommentTextArea:focus {\n    box-shadow: rgba(0, 0, 0, 0.117647) 0 1px 3px, rgba(0, 0, 0, 0.239216) 0 1px 2px, inset 0 0 0 1px #5292f7;\n    border-left: 3px solid #5292f7;\n}\n/*!\n * Handsontable ContextMenu\n */\n\n.htContextMenu:not(.htGhostTable) {\n  display: none;\n  position: absolute;\n  z-index: 1060; /* needs to be higher than 1050 - z-index for Twitter Bootstrap modal (#1569) */\n}\n\n.htContextMenu .ht_clone_top,\n.htContextMenu .ht_clone_left,\n.htContextMenu .ht_clone_corner,\n.htContextMenu .ht_clone_debug {\n  display: none;\n}\n\n.htContextMenu table.htCore {\n  border: 1px solid #ccc;\n  border-bottom-width: 2px;\n  border-right-width: 2px;\n}\n\n.htContextMenu .wtBorder {\n  visibility: hidden;\n}\n\n.htContextMenu table tbody tr td {\n  background: white;\n  border-width: 0;\n  padding: 4px 6px 0 6px;\n  cursor: pointer;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.htContextMenu table tbody tr td:first-child {\n  border: 0;\n}\n\n.htContextMenu table tbody tr td.htDimmed {\n  font-style: normal;\n  color: #323232;\n}\n\n.htContextMenu table tbody tr td.current,\n.htContextMenu table tbody tr td.zeroclipboard-is-hover {\n  background: #f3f3f3;\n}\n\n.htContextMenu table tbody tr td.htSeparator {\n  border-top: 1px solid #bbb;\n  height: 0;\n  padding: 0;\n  cursor: default;\n}\n\n.htContextMenu table tbody tr td.htDisabled {\n  color: #999;\n  cursor: default;\n}\n\n.htContextMenu table tbody tr td.htDisabled:hover {\n  background: #fff;\n  color: #999;\n  cursor: default;\n}\n\n.htContextMenu table tbody tr.htHidden {\n  display: none;\n}\n\n.htContextMenu table tbody tr td .htItemWrapper {\n  margin-left: 10px;\n  margin-right: 6px;\n}\n\n.htContextMenu table tbody tr td div span.selected {\n  margin-top: -2px;\n  position: absolute;\n  left: 4px;\n}\n\n.htContextMenu .ht_master .wtHolder {\n  overflow: hidden;\n}\ntextarea#HandsontableCopyPaste {\n  position: fixed !important;\n  top: 0 !important;\n  right: 100% !important;\n  overflow: hidden;\n  opacity: 0;\n  outline: 0 none !important;\n}\n.htRowHeaders .ht_master.innerBorderLeft ~ .ht_clone_top_left_corner th:nth-child(2),\n.htRowHeaders .ht_master.innerBorderLeft ~ .ht_clone_left td:first-of-type {\n  border-left: 0 none;\n}\n.handsontable .wtHider {\n  position: relative;\n}\n.handsontable.ht__manualColumnMove.after-selection--columns thead th.ht__highlight {\n  cursor: move;\n  cursor: -moz-grab;\n  cursor: -webkit-grab;\n  cursor: grab;\n}\n.handsontable.ht__manualColumnMove.on-moving--columns,\n.handsontable.ht__manualColumnMove.on-moving--columns thead th.ht__highlight {\n  cursor: move;\n  cursor: -moz-grabbing;\n  cursor: -webkit-grabbing;\n  cursor: grabbing;\n}\n.handsontable.ht__manualColumnMove.on-moving--columns .manualColumnResizer {\n  display: none;\n}\n.handsontable .ht__manualColumnMove--guideline,\n.handsontable .ht__manualColumnMove--backlight {\n  position: absolute;\n  height: 100%;\n  display: none;\n}\n.handsontable .ht__manualColumnMove--guideline {\n  background: #757575;\n  width: 2px;\n  top: 0;\n  margin-left: -1px;\n  z-index: 105;\n}\n.handsontable .ht__manualColumnMove--backlight {\n  background: #343434;\n  background: rgba(52, 52, 52, 0.25);\n  display: none;\n  z-index: 105;\n  pointer-events: none;\n}\n.handsontable.on-moving--columns.show-ui .ht__manualColumnMove--guideline,\n.handsontable.on-moving--columns .ht__manualColumnMove--backlight {\n  display: block;\n}\n.handsontable .wtHider {\n  position: relative;\n}\n.handsontable.ht__manualRowMove.after-selection--rows tbody th.ht__highlight {\n  cursor: move;\n  cursor: -moz-grab;\n  cursor: -webkit-grab;\n  cursor: grab;\n}\n.handsontable.ht__manualRowMove.on-moving--rows,\n.handsontable.ht__manualRowMove.on-moving--rows tbody th.ht__highlight {\n  cursor: move;\n  cursor: -moz-grabbing;\n  cursor: -webkit-grabbing;\n  cursor: grabbing;\n}\n.handsontable.ht__manualRowMove.on-moving--rows .manualRowResizer {\n  display: none;\n}\n.handsontable .ht__manualRowMove--guideline,\n.handsontable .ht__manualRowMove--backlight {\n  position: absolute;\n  width: 100%;\n  display: none;\n}\n.handsontable .ht__manualRowMove--guideline {\n  background: #757575;\n  height: 2px;\n  left: 0;\n  margin-top: -1px;\n  z-index: 105;\n}\n.handsontable .ht__manualRowMove--backlight {\n  background: #343434;\n  background: rgba(52, 52, 52, 0.25);\n  display: none;\n  z-index: 105;\n  pointer-events: none;\n}\n.handsontable.on-moving--rows.show-ui .ht__manualRowMove--guideline,\n.handsontable.on-moving--rows .ht__manualRowMove--backlight {\n  display: block;\n}\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"]:not([class*=\"fullySelectedMergedCell\"]):before {\n    opacity: 0;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-multiple\"]:before {\n    opacity: 0.1;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-0\"]:before {\n    opacity: 0.1;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-1\"]:before {\n    opacity: 0.2;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-2\"]:before {\n    opacity: 0.27;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-3\"]:before {\n    opacity: 0.35;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-4\"]:before {\n    opacity: 0.41;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-5\"]:before {\n    opacity: 0.47;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-6\"]:before {\n    opacity: 0.54;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-7\"]:before {\n    opacity: 0.58;\n}\n\n/*# sourceMappingURL=handsontable.css.map*/"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/dist/handsontable.full.css",
    "content": "/*!\n * (The MIT License)\n * \n * Copyright (c) 2012-2014 Marcin Warpechowski\n * Copyright (c) 2015 Handsoncode sp. z o.o. <hello@handsoncode.net>\n * \n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * 'Software'), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n * \n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n * \n * Version: 2.0.0\n * Release date: 11/04/2018 (built at 10/04/2018 11:38:33)\n */\n/**\n * Fix for bootstrap styles\n */\n.handsontable .table th, .handsontable .table td {\n  border-top: none;\n}\n\n.handsontable tr {\n  background: #fff;\n}\n\n.handsontable td {\n  background-color: inherit;\n}\n\n.handsontable .table caption + thead tr:first-child th,\n.handsontable .table caption + thead tr:first-child td,\n.handsontable .table colgroup + thead tr:first-child th,\n.handsontable .table colgroup + thead tr:first-child td,\n.handsontable .table thead:first-child tr:first-child th,\n.handsontable .table thead:first-child tr:first-child td {\n  border-top: 1px solid #CCCCCC;\n}\n\n/* table-bordered */\n.handsontable .table-bordered {\n  border: 0;\n  border-collapse: separate;\n}\n\n.handsontable .table-bordered th,\n.handsontable .table-bordered td {\n  border-left: none;\n}\n\n.handsontable .table-bordered th:first-child,\n.handsontable .table-bordered td:first-child {\n  border-left: 1px solid #CCCCCC;\n}\n\n.handsontable .table > tbody > tr > td,\n.handsontable .table > tbody > tr > th,\n.handsontable .table > tfoot > tr > td,\n.handsontable .table > tfoot > tr > th,\n.handsontable .table > thead > tr > td,\n.handsontable .table > thead > tr > th {\n  line-height: 21px;\n  padding: 0 4px;\n}\n\n.col-lg-1.handsontable, .col-lg-10.handsontable, .col-lg-11.handsontable, .col-lg-12.handsontable,\n.col-lg-2.handsontable, .col-lg-3.handsontable, .col-lg-4.handsontable, .col-lg-5.handsontable, .col-lg-6.handsontable, .col-lg-7.handsontable, .col-lg-8.handsontable, .col-lg-9.handsontable,\n.col-md-1.handsontable, .col-md-10.handsontable, .col-md-11.handsontable, .col-md-12.handsontable,\n.col-md-2.handsontable, .col-md-3.handsontable, .col-md-4.handsontable, .col-md-5.handsontable, .col-md-6.handsontable, .col-md-7.handsontable, .col-md-8.handsontable, .col-md-9.handsontable\n.col-sm-1.handsontable, .col-sm-10.handsontable, .col-sm-11.handsontable, .col-sm-12.handsontable,\n.col-sm-2.handsontable, .col-sm-3.handsontable, .col-sm-4.handsontable, .col-sm-5.handsontable, .col-sm-6.handsontable, .col-sm-7.handsontable, .col-sm-8.handsontable, .col-sm-9.handsontable\n.col-xs-1.handsontable, .col-xs-10.handsontable, .col-xs-11.handsontable, .col-xs-12.handsontable,\n.col-xs-2.handsontable, .col-xs-3.handsontable, .col-xs-4.handsontable, .col-xs-5.handsontable, .col-xs-6.handsontable, .col-xs-7.handsontable, .col-xs-8.handsontable, .col-xs-9.handsontable {\n  padding-left: 0;\n  padding-right: 0;\n}\n\n.handsontable .table-striped > tbody > tr:nth-of-type(even) {\n  background-color: #FFF;\n}\n.handsontable {\n  position: relative;\n}\n\n.handsontable .hide{\n  display: none;\n}\n.handsontable .relative {\n  position: relative;\n}\n\n.handsontable.htAutoSize {\n  visibility: hidden;\n  left: -99000px;\n  position: absolute;\n  top: -99000px;\n}\n\n.handsontable .wtHider {\n  width: 0;\n}\n\n.handsontable .wtSpreader {\n  position: relative;\n  width: 0; /*must be 0, otherwise blank space appears in scroll demo after scrolling max to the right */\n  height: auto;\n}\n\n.handsontable table,\n.handsontable tbody,\n.handsontable thead,\n.handsontable td,\n.handsontable th,\n.handsontable input,\n.handsontable textarea,\n.handsontable div {\n  box-sizing: content-box;\n  -webkit-box-sizing: content-box;\n  -moz-box-sizing: content-box;\n}\n\n.handsontable input,\n.handsontable textarea {\n  min-height: initial;\n}\n\n.handsontable table.htCore {\n  border-collapse: separate;\n  /* it must be separate, otherwise there are offset miscalculations in WebKit: http://stackoverflow.com/questions/2655987/border-collapse-differences-in-ff-and-webkit */\n  /* this actually only changes appearance of user selection - does not make text unselectable */\n  /* -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -o-user-select: none;\n  -ms-user-select: none;\n  user-select: none; */ /* no browser supports unprefixed version */\n  border-spacing: 0;\n  margin: 0;\n  border-width: 0;\n  table-layout: fixed;\n  width: 0;\n  outline-width: 0;\n  /* reset bootstrap table style. for more info see: https://github.com/handsontable/handsontable/issues/224 */\n  max-width: none;\n  max-height: none;\n}\n\n.handsontable col {\n  width: 50px;\n}\n\n.handsontable col.rowHeader {\n  width: 50px;\n}\n\n.handsontable th,\n.handsontable td {\n  border-top-width: 0;\n  border-left-width: 0;\n  border-right: 1px solid #CCC;\n  border-bottom: 1px solid #CCC;\n  height: 22px;\n  empty-cells: show;\n  line-height: 21px;\n  padding: 0 4px 0 4px;\n  /* top, bottom padding different than 0 is handled poorly by FF with HTML5 doctype */\n  background-color: #FFF;\n  vertical-align: top;\n  overflow: hidden;\n  outline-width: 0;\n  white-space: pre-line;\n  /* preserve new line character in cell */\n  background-clip: padding-box;\n}\n\n.handsontable td.htInvalid {\n  background-color: #ff4c42 !important; /*gives priority over td.area selection background*/\n}\n\n.handsontable td.htNoWrap {\n  white-space: nowrap;\n}\n\n.handsontable th:last-child {\n  /*Foundation framework fix*/\n  border-right: 1px solid #CCC;\n  border-bottom: 1px solid #CCC;\n}\n\n.handsontable tr:first-child th.htNoFrame,\n.handsontable th:first-child.htNoFrame,\n.handsontable th.htNoFrame {\n  border-left-width: 0;\n  background-color: white;\n  border-color: #FFF;\n}\n\n.handsontable th:first-child,\n.handsontable th:nth-child(2),\n.handsontable td:first-of-type,\n.handsontable .htNoFrame + th,\n.handsontable .htNoFrame + td {\n  border-left: 1px solid #CCC;\n}\n\n.handsontable.htRowHeaders thead tr th:nth-child(2) {\n  border-left: 1px solid #CCC;\n}\n\n.handsontable tr:first-child th,\n.handsontable tr:first-child td {\n  border-top: 1px solid #CCC;\n}\n\n.ht_master:not(.innerBorderLeft):not(.emptyColumns) ~ .handsontable tbody tr th,\n.ht_master:not(.innerBorderLeft):not(.emptyColumns) ~ .handsontable:not(.ht_clone_top) thead tr th:first-child {\n  border-right-width: 0;\n}\n\n.ht_master:not(.innerBorderTop) thead tr:last-child th,\n.ht_master:not(.innerBorderTop) ~ .handsontable thead tr:last-child th,\n.ht_master:not(.innerBorderTop) thead tr.lastChild th,\n.ht_master:not(.innerBorderTop) ~ .handsontable thead tr.lastChild th {\n  border-bottom-width: 0;\n}\n\n.handsontable th {\n  background-color: #f3f3f3;\n  color: #222;\n  text-align: center;\n  font-weight: normal;\n  white-space: nowrap;\n}\n\n.handsontable thead th {\n  padding: 0;\n}\n\n.handsontable th.active {\n  background-color: #CCC;\n}\n.handsontable thead th .relative {\n  padding: 2px 4px;\n}\n\n#hot-display-license-info {\n  font-size: 9px;\n  color: #323232 ;\n  padding: 5px 0 3px 0;\n  font-family: Helvetica, Arial, sans-serif;\n  text-align: left;\n}\n\n/* plugins */\n\n/* row + column resizer*/\n.handsontable .manualColumnResizer {\n  position: fixed;\n  top: 0;\n  cursor: col-resize;\n  z-index: 110;\n  width: 5px;\n  height: 25px;\n}\n\n.handsontable .manualRowResizer {\n  position: fixed;\n  left: 0;\n  cursor: row-resize;\n  z-index: 110;\n  height: 5px;\n  width: 50px;\n}\n\n.handsontable .manualColumnResizer:hover,\n.handsontable .manualColumnResizer.active,\n.handsontable .manualRowResizer:hover,\n.handsontable .manualRowResizer.active {\n  background-color: #AAB;\n}\n\n.handsontable .manualColumnResizerGuide {\n  position: fixed;\n  right: 0;\n  top: 0;\n  background-color: #AAB;\n  display: none;\n  width: 0;\n  border-right: 1px dashed #777;\n  margin-left: 5px;\n}\n\n.handsontable .manualRowResizerGuide {\n  position: fixed;\n  left: 0;\n  bottom: 0;\n  background-color: #AAB;\n  display: none;\n  height: 0;\n  border-bottom: 1px dashed #777;\n  margin-top: 5px;\n}\n\n.handsontable .manualColumnResizerGuide.active,\n.handsontable .manualRowResizerGuide.active {\n  display: block;\n  z-index: 199;\n}\n\n.handsontable .columnSorting {\n  position: relative;\n}\n\n.handsontable .columnSorting:hover {\n  text-decoration: underline;\n  cursor: pointer;\n}\n\n.handsontable .columnSorting.ascending::after {\n  content: '\\25B2';\n  color: #5f5f5f;\n  position: absolute;\n  right: -15px;\n}\n\n.handsontable .columnSorting.descending::after {\n  content: '\\25BC';\n  color: #5f5f5f;\n  position: absolute;\n  right: -15px;\n}\n\n/* Selection */\n.handsontable .wtBorder {\n  position: absolute;\n  font-size: 0;\n}\n.handsontable .wtBorder.hidden{\n  display:none !important;\n}\n\n.handsontable td.area,\n.handsontable td.area-1,\n.handsontable td.area-2,\n.handsontable td.area-3,\n.handsontable td.area-4,\n.handsontable td.area-5,\n.handsontable td.area-6,\n.handsontable td.area-7 {\n  position: relative;\n}\n\n.handsontable td.area:before,\n.handsontable td.area-1:before,\n.handsontable td.area-2:before,\n.handsontable td.area-3:before,\n.handsontable td.area-4:before,\n.handsontable td.area-5:before,\n.handsontable td.area-6:before,\n.handsontable td.area-7:before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  bottom: -100%\\9; /* Fix for IE9 to spread the \":before\" pseudo element to 100% height of the parent element */\n  background: #005eff;\n}\n\n/* Fix for IE10 and IE11 to spread the \":before\" pseudo element to 100% height of the parent element */\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n  .handsontable td.area:before,\n  .handsontable td.area-1:before,\n  .handsontable td.area-2:before,\n  .handsontable td.area-3:before,\n  .handsontable td.area-4:before,\n  .handsontable td.area-5:before,\n  .handsontable td.area-6:before,\n  .handsontable td.area-7:before {\n    bottom: -100%;\n  }\n}\n\n.handsontable td.area:before {\n  opacity: 0.1;\n}\n.handsontable td.area-1:before {\n  opacity: 0.2;\n}\n.handsontable td.area-2:before {\n  opacity: 0.27;\n}\n.handsontable td.area-3:before {\n  opacity: 0.35;\n}\n.handsontable td.area-4:before {\n  opacity: 0.41;\n}\n.handsontable td.area-5:before {\n  opacity: 0.47;\n}\n.handsontable td.area-6:before {\n  opacity: 0.54;\n}\n.handsontable td.area-7:before {\n  opacity: 0.58;\n}\n\n.handsontable tbody th.ht__highlight,\n.handsontable thead th.ht__highlight {\n  background-color: #dcdcdc;\n}\n\n.handsontable tbody th.ht__active_highlight,\n.handsontable thead th.ht__active_highlight {\n  background-color: #8eb0e7;\n  color: #000;\n}\n\n/* fill handle */\n\n.handsontable .wtBorder.corner {\n  font-size: 0;\n  cursor: crosshair;\n}\n\n.handsontable .htBorder.htFillBorder {\n  background: red;\n  width: 1px;\n  height: 1px;\n}\n\n.handsontableInput {\n  border:none;\n  outline-width: 0;\n  margin: 0 ;\n  padding: 1px 5px 0 5px;\n  font-family: inherit;\n  line-height: 21px;\n  font-size: inherit;\n  box-shadow: 0 0 0 2px #5292F7 inset;\n  resize: none;\n  /*below are needed to overwrite stuff added by jQuery UI Bootstrap theme*/\n  display: block;\n  color: #000;\n  border-radius: 0;\n  background-color: #FFF;\n  /*overwrite styles potentionally made by a framework*/\n}\n\n.handsontableInputHolder {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 104;\n}\n\n.htSelectEditor {\n  -webkit-appearance: menulist-button !important;\n  position: absolute;\n  width: auto;\n}\n\n/*\nTextRenderer readOnly cell\n*/\n\n.handsontable .htDimmed {\n  color: #777;\n}\n\n.handsontable .htSubmenu {\n  position: relative;\n}\n\n.handsontable .htSubmenu :after{\n  content: '\\25B6';\n  color: #777;\n  position: absolute;\n  right: 5px;\n}\n\n\n/*\nTextRenderer horizontal alignment\n*/\n.handsontable .htLeft{\n  text-align: left;\n}\n.handsontable .htCenter{\n  text-align: center;\n}\n.handsontable .htRight{\n  text-align: right;\n}\n.handsontable .htJustify{\n  text-align: justify;\n}\n/*\nTextRenderer vertical alignment\n*/\n.handsontable .htTop{\n  vertical-align: top;\n}\n.handsontable .htMiddle{\n  vertical-align: middle;\n}\n.handsontable .htBottom{\n  vertical-align: bottom;\n}\n\n/*\nTextRenderer placeholder value\n*/\n\n.handsontable .htPlaceholder {\n  color: #999;\n}\n\n/*\nAutocompleteRenderer down arrow\n*/\n\n.handsontable .htAutocompleteArrow {\n  float: right;\n  font-size: 10px;\n  color: #EEE;\n  cursor: default;\n  width: 16px;\n  text-align: center;\n}\n\n.handsontable td .htAutocompleteArrow:hover {\n  color: #777;\n}\n\n.handsontable td.area .htAutocompleteArrow {\n  color: #d3d3d3;\n}\n\n/*\nCheckboxRenderer\n*/\n.handsontable .htCheckboxRendererInput {\n  display: inline-block;\n  vertical-align: middle;\n}\n.handsontable .htCheckboxRendererInput.noValue {\n  opacity: 0.5;\n}\n.handsontable .htCheckboxRendererLabel {\n  cursor: pointer;\n  display: inline-block;\n  width: 100%;\n}\n\n/**\n * Handsontable in Handsontable\n */\n\n.handsontable .handsontable.ht_clone_top .wtHider {\n  padding: 0 0 5px 0;\n}\n\n/**\n* Autocomplete Editor\n*/\n.handsontable .autocompleteEditor.handsontable {\n  padding-right: 17px;\n}\n.handsontable .autocompleteEditor.handsontable.htMacScroll {\n  padding-right: 15px;\n}\n\n\n/**\n * Handsontable listbox theme\n */\n\n.handsontable.listbox {\n  margin: 0;\n}\n\n.handsontable.listbox .ht_master table {\n  border: 1px solid #ccc;\n  border-collapse: separate;\n  background: white;\n}\n\n.handsontable.listbox th,\n.handsontable.listbox tr:first-child th,\n.handsontable.listbox tr:last-child th,\n.handsontable.listbox tr:first-child td,\n.handsontable.listbox td {\n  border-color: transparent;\n}\n\n.handsontable.listbox th,\n.handsontable.listbox td {\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.handsontable.listbox td.htDimmed {\n  cursor: default;\n  color: inherit;\n  font-style: inherit;\n}\n\n.handsontable.listbox .wtBorder {\n  visibility: hidden;\n}\n\n.handsontable.listbox tr td.current,\n.handsontable.listbox tr:hover td {\n  background: #eee;\n}\n\n.ht_clone_top {\n  z-index: 101;\n}\n\n.ht_clone_left {\n  z-index: 102;\n}\n\n.ht_clone_top_left_corner,\n.ht_clone_bottom_left_corner {\n  z-index: 103;\n}\n\n.ht_clone_debug {\n  z-index: 103;\n}\n\n.handsontable td.htSearchResult {\n  background: #fcedd9;\n  color: #583707;\n}\n\n/*\nCell borders\n*/\n.htBordered{\n  /*box-sizing: border-box !important;*/\n  border-width: 1px;\n}\n.htBordered.htTopBorderSolid {\n  border-top-style: solid;\n  border-top-color: #000;\n}\n.htBordered.htRightBorderSolid {\n  border-right-style: solid;\n  border-right-color: #000;\n}\n.htBordered.htBottomBorderSolid {\n  border-bottom-style: solid;\n  border-bottom-color: #000;\n}\n.htBordered.htLeftBorderSolid {\n  border-left-style: solid;\n  border-left-color: #000;\n}\n\n.handsontable tbody tr th:nth-last-child(2) {\n  border-right: 1px solid #CCC;\n}\n\n.handsontable thead tr:nth-last-child(2) th.htGroupIndicatorContainer {\n  border-bottom: 1px solid #CCC;\n  padding-bottom: 5px;\n}\n\n\n.ht_clone_top_left_corner thead tr th:nth-last-child(2) {\n  border-right: 1px solid #CCC;\n}\n\n.htCollapseButton {\n  width: 10px;\n  height: 10px;\n  line-height: 10px;\n  text-align: center;\n  border-radius: 5px;\n  border: 1px solid #f3f3f3;\n  -webkit-box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);\n  box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);\n  cursor: pointer;\n  margin-bottom: 3px;\n  position: relative;\n}\n\n.htCollapseButton:after {\n  content: \"\";\n  height: 300%;\n  width: 1px;\n  display: block;\n  background: #ccc;\n  margin-left: 4px;\n  position: absolute;\n  /*top: -300%;*/\n  bottom: 10px;\n}\n\n\nthead .htCollapseButton {\n  right: 5px;\n  position: absolute;\n  top: 5px;\n  background: #fff;\n}\n\nthead .htCollapseButton:after {\n  height: 1px;\n  width: 700%;\n  right: 10px;\n  top: 4px;\n}\n\n.handsontable tr th .htExpandButton {\n  position: absolute;\n  width: 10px;\n  height: 10px;\n  line-height: 10px;\n  text-align: center;\n  border-radius: 5px;\n  border: 1px solid #f3f3f3;\n  -webkit-box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);\n  box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);\n  cursor: pointer;\n  top: 0;\n  display: none;\n}\n\n.handsontable thead tr th .htExpandButton {\n  /*left: 5px;*/\n  top: 5px;\n}\n\n.handsontable tr th .htExpandButton.clickable {\n  display: block;\n}\n\n.collapsibleIndicator {\n  position: absolute;\n  top: 50%;\n  transform: translate(0% ,-50%);\n  right: 5px;\n  border: 1px solid #A6A6A6;\n  line-height: 10px;\n  color: #222;\n  border-radius: 10px;\n  font-size: 10px;\n  width: 10px;\n  height: 10px;\n  cursor: pointer;\n  -webkit-box-shadow: 0 0 0 6px rgba(238,238,238,1);\n  -moz-box-shadow: 0 0 0 6px rgba(238,238,238,1);\n  box-shadow: 0 0 0 6px rgba(238,238,238,1);\n  background: #eee;\n}\n\n.handsontable col.hidden {\n  width: 0 !important;\n}\n\n.handsontable table tr th.lightRightBorder {\n  border-right: 1px solid #E6E6E6;\n}\n\n.handsontable tr.hidden,\n.handsontable tr.hidden td,\n.handsontable tr.hidden th {\n  display: none;\n}\n\n.ht_master,\n.ht_clone_left,\n.ht_clone_top,\n.ht_clone_bottom {\n  overflow: hidden;\n}\n\n.ht_master .wtHolder {\n  overflow: auto;\n}\n\n.handsontable .ht_master thead,\n.handsontable .ht_master tr th,\n.handsontable .ht_clone_left thead {\n  visibility: hidden;\n}\n\n.ht_clone_top .wtHolder,\n.ht_clone_left .wtHolder,\n.ht_clone_bottom .wtHolder {\n  overflow: hidden;\n}\n/*\n\n Handsontable Mobile Text Editor stylesheet\n\n */\n\n.handsontable.mobile,\n.handsontable.mobile .wtHolder {\n  -webkit-touch-callout:none;\n  -webkit-user-select:none;\n  -khtml-user-select:none;\n  -moz-user-select:none;\n  -ms-user-select:none;\n  user-select:none;\n  -webkit-tap-highlight-color:rgba(0,0,0,0);\n  -webkit-overflow-scrolling: touch;\n}\n\n.htMobileEditorContainer {\n  display: none;\n  position: absolute;\n  top: 0;\n  width: 70%;\n  height: 54pt;\n  background: #f8f8f8;\n  border-radius: 20px;\n  border: 1px solid #ebebeb;\n  z-index: 999;\n  box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  -webkit-text-size-adjust: none;\n}\n\n.topLeftSelectionHandle:not(.ht_master .topLeftSelectionHandle),\n.topLeftSelectionHandle-HitArea:not(.ht_master .topLeftSelectionHandle-HitArea) {\n  z-index: 9999;\n}\n\n/* Initial left/top coordinates - overwritten when actual position is set */\n.topLeftSelectionHandle,\n.topLeftSelectionHandle-HitArea,\n.bottomRightSelectionHandle,\n.bottomRightSelectionHandle-HitArea {\n  left: -10000px;\n  top: -10000px;\n}\n\n.htMobileEditorContainer.active {\n  display: block;\n}\n\n.htMobileEditorContainer .inputs {\n  position: absolute;\n  right: 210pt;\n  bottom: 10pt;\n  top: 10pt;\n  left: 14px;\n  height: 34pt;\n}\n\n.htMobileEditorContainer .inputs textarea {\n  font-size: 13pt;\n  border: 1px solid #a1a1a1;\n  -webkit-appearance: none;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n  position: absolute;\n  left: 14px;\n  right: 14px;\n  top: 0;\n  bottom: 0;\n  padding: 7pt;\n}\n\n.htMobileEditorContainer .cellPointer {\n  position: absolute;\n  top: -13pt;\n  height: 0;\n  width: 0;\n  left: 30px;\n\n  border-left: 13pt solid transparent;\n  border-right: 13pt solid transparent;\n  border-bottom: 13pt solid #ebebeb;\n}\n\n.htMobileEditorContainer .cellPointer.hidden {\n  display: none;\n}\n\n.htMobileEditorContainer .cellPointer:before {\n  content: '';\n  display: block;\n  position: absolute;\n  top: 2px;\n  height: 0;\n  width: 0;\n  left: -13pt;\n\n  border-left: 13pt solid transparent;\n  border-right: 13pt solid transparent;\n  border-bottom: 13pt solid #f8f8f8;\n}\n\n.htMobileEditorContainer .moveHandle {\n  position: absolute;\n  top: 10pt;\n  left: 5px;\n  width: 30px;\n  bottom: 0px;\n  cursor: move;\n  z-index: 9999;\n}\n\n.htMobileEditorContainer .moveHandle:after {\n  content: \"..\\A..\\A..\\A..\";\n  white-space: pre;\n  line-height: 10px;\n  font-size: 20pt;\n  display: inline-block;\n  margin-top: -8px;\n  color: #ebebeb;\n}\n\n.htMobileEditorContainer .positionControls {\n  width: 205pt;\n  position: absolute;\n  right: 5pt;\n  top: 0;\n  bottom: 0;\n}\n\n.htMobileEditorContainer .positionControls > div {\n  width: 50pt;\n  height: 100%;\n  float: left;\n}\n\n.htMobileEditorContainer .positionControls > div:after {\n  content: \" \";\n  display: block;\n  width: 15pt;\n  height: 15pt;\n  text-align: center;\n  line-height: 50pt;\n}\n\n.htMobileEditorContainer .leftButton:after,\n.htMobileEditorContainer .rightButton:after,\n.htMobileEditorContainer .upButton:after,\n.htMobileEditorContainer .downButton:after {\n  transform-origin: 5pt 5pt;\n  -webkit-transform-origin: 5pt 5pt;\n  margin: 21pt 0 0 21pt;\n}\n\n.htMobileEditorContainer .leftButton:after {\n  border-top: 2px solid #288ffe;\n  border-left: 2px solid #288ffe;\n  -webkit-transform: rotate(-45deg);\n  /*margin-top: 17pt;*/\n  /*margin-left: 20pt;*/\n}\n.htMobileEditorContainer .leftButton:active:after {\n  border-color: #cfcfcf;\n}\n\n.htMobileEditorContainer .rightButton:after {\n  border-top: 2px solid #288ffe;\n  border-left: 2px solid #288ffe;\n  -webkit-transform: rotate(135deg);\n  /*margin-top: 17pt;*/\n  /*margin-left: 10pt;*/\n}\n.htMobileEditorContainer .rightButton:active:after {\n  border-color: #cfcfcf;\n}\n\n.htMobileEditorContainer .upButton:after {\n  /*border-top: 2px solid #cfcfcf;*/\n  border-top: 2px solid #288ffe;\n  border-left: 2px solid #288ffe;\n  -webkit-transform: rotate(45deg);\n  /*margin-top: 22pt;*/\n  /*margin-left: 15pt;*/\n}\n.htMobileEditorContainer .upButton:active:after {\n  border-color: #cfcfcf;\n}\n\n.htMobileEditorContainer .downButton:after {\n  border-top: 2px solid #288ffe;\n  border-left: 2px solid #288ffe;\n  -webkit-transform: rotate(225deg);\n  /*margin-top: 15pt;*/\n  /*margin-left: 15pt;*/\n}\n.htMobileEditorContainer .downButton:active:after {\n  border-color: #cfcfcf;\n}\n\n.handsontable.hide-tween {\n  -webkit-animation: opacity-hide 0.3s;\n  animation: opacity-hide 0.3s;\n  animation-fill-mode: forwards;\n  -webkit-animation-fill-mode: forwards;\n}\n\n.handsontable.show-tween {\n  -webkit-animation: opacity-show 0.3s;\n  animation: opacity-show 0.3s;\n  animation-fill-mode: forwards;\n  -webkit-animation-fill-mode: forwards;\n}\n@charset \"UTF-8\";\n\n/*!\n * Pikaday\n * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/\n */\n\n.pika-single {\n    z-index: 9999;\n    display: block;\n    position: relative;\n    color: #333;\n    background: #fff;\n    border: 1px solid #ccc;\n    border-bottom-color: #bbb;\n    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\n/*\nclear child float (pika-lendar), using the famous micro clearfix hack\nhttp://nicolasgallagher.com/micro-clearfix-hack/\n*/\n.pika-single:before,\n.pika-single:after {\n    content: \" \";\n    display: table;\n}\n.pika-single:after { clear: both }\n.pika-single { *zoom: 1 }\n\n.pika-single.is-hidden {\n    display: none;\n}\n\n.pika-single.is-bound {\n    position: absolute;\n    box-shadow: 0 5px 15px -5px rgba(0,0,0,.5);\n}\n\n.pika-lendar {\n    float: left;\n    width: 240px;\n    margin: 8px;\n}\n\n.pika-title {\n    position: relative;\n    text-align: center;\n}\n\n.pika-label {\n    display: inline-block;\n    *display: inline;\n    position: relative;\n    z-index: 9999;\n    overflow: hidden;\n    margin: 0;\n    padding: 5px 3px;\n    font-size: 14px;\n    line-height: 20px;\n    font-weight: bold;\n    background-color: #fff;\n}\n.pika-title select {\n    cursor: pointer;\n    position: absolute;\n    z-index: 9998;\n    margin: 0;\n    left: 0;\n    top: 5px;\n    filter: alpha(opacity=0);\n    opacity: 0;\n}\n\n.pika-prev,\n.pika-next {\n    display: block;\n    cursor: pointer;\n    position: relative;\n    outline: none;\n    border: 0;\n    padding: 0;\n    width: 20px;\n    height: 30px;\n    /* hide text using text-indent trick, using width value (it's enough) */\n    text-indent: 20px;\n    white-space: nowrap;\n    overflow: hidden;\n    background-color: transparent;\n    background-position: center center;\n    background-repeat: no-repeat;\n    background-size: 75% 75%;\n    opacity: .5;\n    *position: absolute;\n    *top: 0;\n}\n\n.pika-prev:hover,\n.pika-next:hover {\n    opacity: 1;\n}\n\n.pika-prev,\n.is-rtl .pika-next {\n    float: left;\n    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==');\n    *left: 0;\n}\n\n.pika-next,\n.is-rtl .pika-prev {\n    float: right;\n    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=');\n    *right: 0;\n}\n\n.pika-prev.is-disabled,\n.pika-next.is-disabled {\n    cursor: default;\n    opacity: .2;\n}\n\n.pika-select {\n    display: inline-block;\n    *display: inline;\n}\n\n.pika-table {\n    width: 100%;\n    border-collapse: collapse;\n    border-spacing: 0;\n    border: 0;\n}\n\n.pika-table th,\n.pika-table td {\n    width: 14.285714285714286%;\n    padding: 0;\n}\n\n.pika-table th {\n    color: #999;\n    font-size: 12px;\n    line-height: 25px;\n    font-weight: bold;\n    text-align: center;\n}\n\n.pika-button {\n    cursor: pointer;\n    display: block;\n    box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    outline: none;\n    border: 0;\n    margin: 0;\n    width: 100%;\n    padding: 5px;\n    color: #666;\n    font-size: 12px;\n    line-height: 15px;\n    text-align: right;\n    background: #f5f5f5;\n}\n\n.pika-week {\n    font-size: 11px;\n    color: #999;\n}\n\n.is-today .pika-button {\n    color: #33aaff;\n    font-weight: bold;\n}\n\n.is-selected .pika-button {\n    color: #fff;\n    font-weight: bold;\n    background: #33aaff;\n    box-shadow: inset 0 1px 3px #178fe5;\n    border-radius: 3px;\n}\n\n.is-inrange .pika-button {\n    background: #D5E9F7;\n}\n\n.is-startrange .pika-button {\n    color: #fff;\n    background: #6CB31D;\n    box-shadow: none;\n    border-radius: 3px;\n}\n\n.is-endrange .pika-button {\n    color: #fff;\n    background: #33aaff;\n    box-shadow: none;\n    border-radius: 3px;\n}\n\n.is-disabled .pika-button,\n.is-outside-current-month .pika-button {\n    pointer-events: none;\n    cursor: default;\n    color: #999;\n    opacity: .3;\n}\n\n.pika-button:hover {\n    color: #fff;\n    background: #ff8000;\n    box-shadow: none;\n    border-radius: 3px;\n}\n\n/* styling for abbr */\n.pika-table abbr {\n    border-bottom: none;\n    cursor: help;\n}\n\n.htCommentCell {\n    position: relative;\n}\n\n.htCommentCell:after {\n    content: '';\n    position: absolute;\n    top: 0;\n    right: 0;\n    border-left: 6px solid transparent;\n    border-top: 6px solid black;\n}\n\n.htComments {\n    display: none;\n    z-index: 1059;\n    position: absolute;\n}\n\n.htCommentTextArea {\n    box-shadow: rgba(0, 0, 0, 0.117647) 0 1px 3px, rgba(0, 0, 0, 0.239216) 0 1px 2px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n    border: none;\n    border-left: 3px solid #ccc;\n    background-color: #fff;\n    width: 215px;\n    height: 90px;\n    font-size: 12px;\n    padding: 5px;\n    outline: 0px !important;\n    -webkit-appearance: none;\n}\n\n.htCommentTextArea:focus {\n    box-shadow: rgba(0, 0, 0, 0.117647) 0 1px 3px, rgba(0, 0, 0, 0.239216) 0 1px 2px, inset 0 0 0 1px #5292f7;\n    border-left: 3px solid #5292f7;\n}\n/*!\n * Handsontable ContextMenu\n */\n\n.htContextMenu:not(.htGhostTable) {\n  display: none;\n  position: absolute;\n  z-index: 1060; /* needs to be higher than 1050 - z-index for Twitter Bootstrap modal (#1569) */\n}\n\n.htContextMenu .ht_clone_top,\n.htContextMenu .ht_clone_left,\n.htContextMenu .ht_clone_corner,\n.htContextMenu .ht_clone_debug {\n  display: none;\n}\n\n.htContextMenu table.htCore {\n  border: 1px solid #ccc;\n  border-bottom-width: 2px;\n  border-right-width: 2px;\n}\n\n.htContextMenu .wtBorder {\n  visibility: hidden;\n}\n\n.htContextMenu table tbody tr td {\n  background: white;\n  border-width: 0;\n  padding: 4px 6px 0 6px;\n  cursor: pointer;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.htContextMenu table tbody tr td:first-child {\n  border: 0;\n}\n\n.htContextMenu table tbody tr td.htDimmed {\n  font-style: normal;\n  color: #323232;\n}\n\n.htContextMenu table tbody tr td.current,\n.htContextMenu table tbody tr td.zeroclipboard-is-hover {\n  background: #f3f3f3;\n}\n\n.htContextMenu table tbody tr td.htSeparator {\n  border-top: 1px solid #bbb;\n  height: 0;\n  padding: 0;\n  cursor: default;\n}\n\n.htContextMenu table tbody tr td.htDisabled {\n  color: #999;\n  cursor: default;\n}\n\n.htContextMenu table tbody tr td.htDisabled:hover {\n  background: #fff;\n  color: #999;\n  cursor: default;\n}\n\n.htContextMenu table tbody tr.htHidden {\n  display: none;\n}\n\n.htContextMenu table tbody tr td .htItemWrapper {\n  margin-left: 10px;\n  margin-right: 6px;\n}\n\n.htContextMenu table tbody tr td div span.selected {\n  margin-top: -2px;\n  position: absolute;\n  left: 4px;\n}\n\n.htContextMenu .ht_master .wtHolder {\n  overflow: hidden;\n}\ntextarea#HandsontableCopyPaste {\n  position: fixed !important;\n  top: 0 !important;\n  right: 100% !important;\n  overflow: hidden;\n  opacity: 0;\n  outline: 0 none !important;\n}\n.htRowHeaders .ht_master.innerBorderLeft ~ .ht_clone_top_left_corner th:nth-child(2),\n.htRowHeaders .ht_master.innerBorderLeft ~ .ht_clone_left td:first-of-type {\n  border-left: 0 none;\n}\n.handsontable .wtHider {\n  position: relative;\n}\n.handsontable.ht__manualColumnMove.after-selection--columns thead th.ht__highlight {\n  cursor: move;\n  cursor: -moz-grab;\n  cursor: -webkit-grab;\n  cursor: grab;\n}\n.handsontable.ht__manualColumnMove.on-moving--columns,\n.handsontable.ht__manualColumnMove.on-moving--columns thead th.ht__highlight {\n  cursor: move;\n  cursor: -moz-grabbing;\n  cursor: -webkit-grabbing;\n  cursor: grabbing;\n}\n.handsontable.ht__manualColumnMove.on-moving--columns .manualColumnResizer {\n  display: none;\n}\n.handsontable .ht__manualColumnMove--guideline,\n.handsontable .ht__manualColumnMove--backlight {\n  position: absolute;\n  height: 100%;\n  display: none;\n}\n.handsontable .ht__manualColumnMove--guideline {\n  background: #757575;\n  width: 2px;\n  top: 0;\n  margin-left: -1px;\n  z-index: 105;\n}\n.handsontable .ht__manualColumnMove--backlight {\n  background: #343434;\n  background: rgba(52, 52, 52, 0.25);\n  display: none;\n  z-index: 105;\n  pointer-events: none;\n}\n.handsontable.on-moving--columns.show-ui .ht__manualColumnMove--guideline,\n.handsontable.on-moving--columns .ht__manualColumnMove--backlight {\n  display: block;\n}\n.handsontable .wtHider {\n  position: relative;\n}\n.handsontable.ht__manualRowMove.after-selection--rows tbody th.ht__highlight {\n  cursor: move;\n  cursor: -moz-grab;\n  cursor: -webkit-grab;\n  cursor: grab;\n}\n.handsontable.ht__manualRowMove.on-moving--rows,\n.handsontable.ht__manualRowMove.on-moving--rows tbody th.ht__highlight {\n  cursor: move;\n  cursor: -moz-grabbing;\n  cursor: -webkit-grabbing;\n  cursor: grabbing;\n}\n.handsontable.ht__manualRowMove.on-moving--rows .manualRowResizer {\n  display: none;\n}\n.handsontable .ht__manualRowMove--guideline,\n.handsontable .ht__manualRowMove--backlight {\n  position: absolute;\n  width: 100%;\n  display: none;\n}\n.handsontable .ht__manualRowMove--guideline {\n  background: #757575;\n  height: 2px;\n  left: 0;\n  margin-top: -1px;\n  z-index: 105;\n}\n.handsontable .ht__manualRowMove--backlight {\n  background: #343434;\n  background: rgba(52, 52, 52, 0.25);\n  display: none;\n  z-index: 105;\n  pointer-events: none;\n}\n.handsontable.on-moving--rows.show-ui .ht__manualRowMove--guideline,\n.handsontable.on-moving--rows .ht__manualRowMove--backlight {\n  display: block;\n}\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"]:not([class*=\"fullySelectedMergedCell\"]):before {\n    opacity: 0;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-multiple\"]:before {\n    opacity: 0.1;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-0\"]:before {\n    opacity: 0.1;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-1\"]:before {\n    opacity: 0.2;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-2\"]:before {\n    opacity: 0.27;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-3\"]:before {\n    opacity: 0.35;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-4\"]:before {\n    opacity: 0.41;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-5\"]:before {\n    opacity: 0.47;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-6\"]:before {\n    opacity: 0.54;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-7\"]:before {\n    opacity: 0.58;\n}\n"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/dist/handsontable.full.js",
    "content": "/*!\n * (The MIT License)\n * \n * Copyright (c) 2012-2014 Marcin Warpechowski\n * Copyright (c) 2015 Handsoncode sp. z o.o. <hello@handsoncode.net>\n * \n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * 'Software'), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n * \n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n * \n * Version: 2.0.0\n * Release date: 11/04/2018 (built at 10/04/2018 11:38:33)\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"Handsontable\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Handsontable\"] = factory();\n\telse\n\t\troot[\"Handsontable\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 326);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.HTML_CHARACTERS = undefined;\nexports.getParent = getParent;\nexports.closest = closest;\nexports.closestDown = closestDown;\nexports.isChildOf = isChildOf;\nexports.isChildOfWebComponentTable = isChildOfWebComponentTable;\nexports.polymerWrap = polymerWrap;\nexports.polymerUnwrap = polymerUnwrap;\nexports.index = index;\nexports.overlayContainsElement = overlayContainsElement;\nexports.hasClass = hasClass;\nexports.addClass = addClass;\nexports.removeClass = removeClass;\nexports.removeTextNodes = removeTextNodes;\nexports.empty = empty;\nexports.fastInnerHTML = fastInnerHTML;\nexports.fastInnerText = fastInnerText;\nexports.isVisible = isVisible;\nexports.offset = offset;\nexports.getWindowScrollTop = getWindowScrollTop;\nexports.getWindowScrollLeft = getWindowScrollLeft;\nexports.getScrollTop = getScrollTop;\nexports.getScrollLeft = getScrollLeft;\nexports.getScrollableElement = getScrollableElement;\nexports.getTrimmingContainer = getTrimmingContainer;\nexports.getStyle = getStyle;\nexports.getComputedStyle = getComputedStyle;\nexports.outerWidth = outerWidth;\nexports.outerHeight = outerHeight;\nexports.innerHeight = innerHeight;\nexports.innerWidth = innerWidth;\nexports.addEvent = addEvent;\nexports.removeEvent = removeEvent;\nexports.getCaretPosition = getCaretPosition;\nexports.getSelectionEndPosition = getSelectionEndPosition;\nexports.getSelectionText = getSelectionText;\nexports.setCaretPosition = setCaretPosition;\nexports.getScrollbarWidth = getScrollbarWidth;\nexports.hasVerticalScrollbar = hasVerticalScrollbar;\nexports.hasHorizontalScrollbar = hasHorizontalScrollbar;\nexports.setOverlayPosition = setOverlayPosition;\nexports.getCssTransform = getCssTransform;\nexports.resetCssTransform = resetCssTransform;\nexports.isInput = isInput;\nexports.isOutsideInput = isOutsideInput;\n\nvar _browser = __webpack_require__(27);\n\nvar _feature = __webpack_require__(40);\n\n/**\n * Get the parent of the specified node in the DOM tree.\n *\n * @param  {HTMLElement} element Element from which traversing is started.\n * @param  {Number} [level=0] Traversing deep level.\n * @return {HTMLElement|null}\n */\nfunction getParent(element) {\n  var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n  var iteration = -1;\n  var parent = null;\n\n  while (element != null) {\n    if (iteration === level) {\n      parent = element;\n      break;\n    }\n\n    if (element.host && element.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      element = element.host;\n    } else {\n      iteration++;\n      element = element.parentNode;\n    }\n  }\n\n  return parent;\n}\n\n/**\n * Goes up the DOM tree (including given element) until it finds an element that matches the nodes or nodes name.\n * This method goes up through web components.\n *\n * @param {HTMLElement} element Element from which traversing is started\n * @param {Array} nodes Array of elements or Array of elements name\n * @param {HTMLElement} [until]\n * @returns {HTMLElement|null}\n */\nfunction closest(element, nodes, until) {\n  while (element != null && element !== until) {\n    if (element.nodeType === Node.ELEMENT_NODE && (nodes.indexOf(element.nodeName) > -1 || nodes.indexOf(element) > -1)) {\n      return element;\n    }\n    if (element.host && element.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      element = element.host;\n    } else {\n      element = element.parentNode;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Goes \"down\" the DOM tree (including given element) until it finds an element that matches the nodes or nodes name.\n *\n * @param {HTMLElement} element Element from which traversing is started\n * @param {Array} nodes Array of elements or Array of elements name\n * @param {HTMLElement} [until]\n * @returns {HTMLElement|null}\n */\nfunction closestDown(element, nodes, until) {\n  var matched = [];\n\n  while (element) {\n    element = closest(element, nodes, until);\n\n    if (!element || until && !until.contains(element)) {\n      break;\n    }\n    matched.push(element);\n\n    if (element.host && element.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      element = element.host;\n    } else {\n      element = element.parentNode;\n    }\n  }\n  var length = matched.length;\n\n  return length ? matched[length - 1] : null;\n}\n\n/**\n * Goes up the DOM tree and checks if element is child of another element.\n *\n * @param child Child element\n * @param {Object|String} parent Parent element OR selector of the parent element.\n *                               If string provided, function returns `true` for the first occurrence of element with that class.\n * @returns {Boolean}\n */\nfunction isChildOf(child, parent) {\n  var node = child.parentNode;\n  var queriedParents = [];\n\n  if (typeof parent === 'string') {\n    queriedParents = Array.prototype.slice.call(document.querySelectorAll(parent), 0);\n  } else {\n    queriedParents.push(parent);\n  }\n\n  while (node != null) {\n    if (queriedParents.indexOf(node) > -1) {\n      return true;\n    }\n    node = node.parentNode;\n  }\n\n  return false;\n}\n\n/**\n * Check if an element is part of `hot-table` web component.\n *\n * @param {Element} element\n * @returns {Boolean}\n */\nfunction isChildOfWebComponentTable(element) {\n  var hotTableName = 'hot-table',\n      result = false,\n      parentNode;\n\n  parentNode = polymerWrap(element);\n\n  function isHotTable(element) {\n    return element.nodeType === Node.ELEMENT_NODE && element.nodeName === hotTableName.toUpperCase();\n  }\n\n  while (parentNode != null) {\n    if (isHotTable(parentNode)) {\n      result = true;\n      break;\n    } else if (parentNode.host && parentNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      result = isHotTable(parentNode.host);\n\n      if (result) {\n        break;\n      }\n      parentNode = parentNode.host;\n    }\n    parentNode = parentNode.parentNode;\n  }\n\n  return result;\n}\n\n/**\n * Wrap element into polymer/webcomponent container if exists\n *\n * @param element\n * @returns {*}\n */\nfunction polymerWrap(element) {\n  /* global Polymer */\n  return typeof Polymer !== 'undefined' && typeof wrap === 'function' ? wrap(element) : element;\n}\n\n/**\n * Unwrap element from polymer/webcomponent container if exists\n *\n * @param element\n * @returns {*}\n */\nfunction polymerUnwrap(element) {\n  /* global Polymer */\n  return typeof Polymer !== 'undefined' && typeof unwrap === 'function' ? unwrap(element) : element;\n}\n\n/**\n * Counts index of element within its parent\n * WARNING: for performance reasons, assumes there are only element nodes (no text nodes). This is true for Walkotnable\n * Otherwise would need to check for nodeType or use previousElementSibling\n *\n * @see http://jsperf.com/sibling-index/10\n * @param {Element} element\n * @return {Number}\n */\nfunction index(element) {\n  var i = 0;\n\n  if (element.previousSibling) {\n    /* eslint-disable no-cond-assign */\n    while (element = element.previousSibling) {\n      ++i;\n    }\n  }\n\n  return i;\n}\n\n/**\n * Check if the provided overlay contains the provided element\n *\n * @param {String} overlay\n * @param {HTMLElement} element\n * @returns {boolean}\n */\nfunction overlayContainsElement(overlayType, element) {\n  var overlayElement = document.querySelector('.ht_clone_' + overlayType);\n  return overlayElement ? overlayElement.contains(element) : null;\n}\n\nvar classListSupport = !!document.documentElement.classList;\nvar _hasClass, _addClass, _removeClass;\n\nfunction filterEmptyClassNames(classNames) {\n  var result = [];\n\n  if (!classNames || !classNames.length) {\n    return result;\n  }\n\n  var len = 0;\n\n  while (classNames[len]) {\n    result.push(classNames[len]);\n    len++;\n  }\n\n  return result;\n}\n\nif (classListSupport) {\n  var isSupportMultipleClassesArg = function () {\n    var element = document.createElement('div');\n\n    element.classList.add('test', 'test2');\n\n    return element.classList.contains('test2');\n  }();\n\n  _hasClass = function _hasClass(element, className) {\n    if (element.classList === void 0 || typeof className !== 'string' || className === '') {\n      return false;\n    }\n\n    return element.classList.contains(className);\n  };\n\n  _addClass = function _addClass(element, className) {\n    if (typeof className === 'string') {\n      className = className.split(' ');\n    }\n\n    className = filterEmptyClassNames(className);\n\n    if (className.length > 0) {\n      if (isSupportMultipleClassesArg) {\n        element.classList.add.apply(element.classList, className);\n      } else {\n        var len = 0;\n\n        while (className && className[len]) {\n          element.classList.add(className[len]);\n          len++;\n        }\n      }\n    }\n  };\n\n  _removeClass = function _removeClass(element, className) {\n    if (typeof className === 'string') {\n      className = className.split(' ');\n    }\n\n    className = filterEmptyClassNames(className);\n\n    if (className.length > 0) {\n      if (isSupportMultipleClassesArg) {\n        element.classList.remove.apply(element.classList, className);\n      } else {\n        var len = 0;\n\n        while (className && className[len]) {\n          element.classList.remove(className[len]);\n          len++;\n        }\n      }\n    }\n  };\n} else {\n  var createClassNameRegExp = function createClassNameRegExp(className) {\n    return new RegExp('(\\\\s|^)' + className + '(\\\\s|$)');\n  };\n\n  _hasClass = function _hasClass(element, className) {\n    // http://snipplr.com/view/3561/addclass-removeclass-hasclass/\n    return element.className !== void 0 && createClassNameRegExp(className).test(element.className);\n  };\n\n  _addClass = function _addClass(element, className) {\n    var len = 0,\n        _className = element.className;\n\n    if (typeof className === 'string') {\n      className = className.split(' ');\n    }\n    if (_className === '') {\n      _className = className.join(' ');\n    } else {\n      while (className && className[len]) {\n        if (!createClassNameRegExp(className[len]).test(_className)) {\n          _className += ' ' + className[len];\n        }\n        len++;\n      }\n    }\n    element.className = _className;\n  };\n\n  _removeClass = function _removeClass(element, className) {\n    var len = 0,\n        _className = element.className;\n\n    if (typeof className === 'string') {\n      className = className.split(' ');\n    }\n    while (className && className[len]) {\n      // String.prototype.trim is defined in polyfill.js\n      _className = _className.replace(createClassNameRegExp(className[len]), ' ').trim();\n      len++;\n    }\n    if (element.className !== _className) {\n      element.className = _className;\n    }\n  };\n}\n\n/**\n * Checks if element has class name\n *\n * @param {HTMLElement} element\n * @param {String} className Class name to check\n * @returns {Boolean}\n */\nfunction hasClass(element, className) {\n  return _hasClass(element, className);\n}\n\n/**\n * Add class name to an element\n *\n * @param {HTMLElement} element\n * @param {String|Array} className Class name as string or array of strings\n */\nfunction addClass(element, className) {\n  return _addClass(element, className);\n}\n\n/**\n * Remove class name from an element\n *\n * @param {HTMLElement} element\n * @param {String|Array} className Class name as string or array of strings\n */\nfunction removeClass(element, className) {\n  return _removeClass(element, className);\n}\n\nfunction removeTextNodes(element, parent) {\n  if (element.nodeType === 3) {\n    parent.removeChild(element); // bye text nodes!\n  } else if (['TABLE', 'THEAD', 'TBODY', 'TFOOT', 'TR'].indexOf(element.nodeName) > -1) {\n    var childs = element.childNodes;\n    for (var i = childs.length - 1; i >= 0; i--) {\n      removeTextNodes(childs[i], element);\n    }\n  }\n}\n\n/**\n * Remove childs function\n * WARNING - this doesn't unload events and data attached by jQuery\n * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/9\n * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/11 - no siginificant improvement with Chrome remove() method\n *\n * @param element\n * @returns {void}\n */\n//\nfunction empty(element) {\n  var child;\n  /* eslint-disable no-cond-assign */\n  while (child = element.lastChild) {\n    element.removeChild(child);\n  }\n}\n\nvar HTML_CHARACTERS = exports.HTML_CHARACTERS = /(<(.*)>|&(.*);)/;\n\n/**\n * Insert content into element trying avoid innerHTML method.\n * @return {void}\n */\nfunction fastInnerHTML(element, content) {\n  if (HTML_CHARACTERS.test(content)) {\n    element.innerHTML = content;\n  } else {\n    fastInnerText(element, content);\n  }\n}\n\n/**\n * Insert text content into element\n * @return {void}\n */\n\nvar textContextSupport = !!document.createTextNode('test').textContent;\n\nfunction fastInnerText(element, content) {\n  var child = element.firstChild;\n\n  if (child && child.nodeType === 3 && child.nextSibling === null) {\n    // fast lane - replace existing text node\n\n    if (textContextSupport) {\n      // http://jsperf.com/replace-text-vs-reuse\n      child.textContent = content;\n    } else {\n      // http://jsperf.com/replace-text-vs-reuse\n      child.data = content;\n    }\n  } else {\n    // slow lane - empty element and insert a text node\n    empty(element);\n    element.appendChild(document.createTextNode(content));\n  }\n}\n\n/**\n * Returns true if element is attached to the DOM and visible, false otherwise\n * @param elem\n * @returns {boolean}\n */\nfunction isVisible(elem) {\n  var next = elem;\n\n  while (polymerUnwrap(next) !== document.documentElement) {\n    // until <html> reached\n    if (next === null) {\n      // parent detached from DOM\n      return false;\n    } else if (next.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      if (next.host) {\n        // this is Web Components Shadow DOM\n        // see: http://w3c.github.io/webcomponents/spec/shadow/#encapsulation\n        // according to spec, should be if (next.ownerDocument !== window.document), but that doesn't work yet\n        if (next.host.impl) {\n          // Chrome 33.0.1723.0 canary (2013-11-29) Web Platform features disabled\n          return isVisible(next.host.impl);\n        } else if (next.host) {\n          // Chrome 33.0.1723.0 canary (2013-11-29) Web Platform features enabled\n          return isVisible(next.host);\n        }\n        throw new Error('Lost in Web Components world');\n      } else {\n        return false; // this is a node detached from document in IE8\n      }\n    } else if (next.style.display === 'none') {\n      return false;\n    }\n    next = next.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * Returns elements top and left offset relative to the document. Function is not compatible with jQuery offset.\n *\n * @param {HTMLElement} elem\n * @return {Object} Returns object with `top` and `left` props\n */\nfunction offset(elem) {\n  var offsetLeft, offsetTop, lastElem, docElem, box;\n\n  docElem = document.documentElement;\n\n  if ((0, _feature.hasCaptionProblem)() && elem.firstChild && elem.firstChild.nodeName === 'CAPTION') {\n    // fixes problem with Firefox ignoring <caption> in TABLE offset (see also export outerHeight)\n    // http://jsperf.com/offset-vs-getboundingclientrect/8\n    box = elem.getBoundingClientRect();\n\n    return {\n      top: box.top + (window.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\n      left: box.left + (window.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\n    };\n  }\n  offsetLeft = elem.offsetLeft;\n  offsetTop = elem.offsetTop;\n  lastElem = elem;\n\n  /* eslint-disable no-cond-assign */\n  while (elem = elem.offsetParent) {\n    // from my observation, document.body always has scrollLeft/scrollTop == 0\n    if (elem === document.body) {\n      break;\n    }\n    offsetLeft += elem.offsetLeft;\n    offsetTop += elem.offsetTop;\n    lastElem = elem;\n  }\n\n  // slow - http://jsperf.com/offset-vs-getboundingclientrect/6\n  if (lastElem && lastElem.style.position === 'fixed') {\n    // if(lastElem !== document.body) { //faster but does gives false positive in Firefox\n    offsetLeft += window.pageXOffset || docElem.scrollLeft;\n    offsetTop += window.pageYOffset || docElem.scrollTop;\n  }\n\n  return {\n    left: offsetLeft,\n    top: offsetTop\n  };\n}\n\n/**\n * Returns the document's scrollTop property.\n *\n * @returns {Number}\n */\nfunction getWindowScrollTop() {\n  var res = window.scrollY;\n\n  if (res === void 0) {\n    // IE8-11\n    res = document.documentElement.scrollTop;\n  }\n\n  return res;\n}\n\n/**\n * Returns the document's scrollLeft property.\n *\n * @returns {Number}\n */\nfunction getWindowScrollLeft() {\n  var res = window.scrollX;\n\n  if (res === void 0) {\n    // IE8-11\n    res = document.documentElement.scrollLeft;\n  }\n\n  return res;\n}\n\n/**\n * Returns the provided element's scrollTop property.\n *\n * @param element\n * @returns {Number}\n */\nfunction getScrollTop(element) {\n  if (element === window) {\n    return getWindowScrollTop();\n  }\n  return element.scrollTop;\n}\n\n/**\n * Returns the provided element's scrollLeft property.\n *\n * @param element\n * @returns {Number}\n */\nfunction getScrollLeft(element) {\n  if (element === window) {\n    return getWindowScrollLeft();\n  }\n  return element.scrollLeft;\n}\n\n/**\n * Returns a DOM element responsible for scrolling of the provided element.\n *\n * @param {HTMLElement} element\n * @returns {HTMLElement} Element's scrollable parent\n */\nfunction getScrollableElement(element) {\n  var el = element.parentNode,\n      props = ['auto', 'scroll'],\n      overflow,\n      overflowX,\n      overflowY,\n      computedStyle = '',\n      computedOverflow = '',\n      computedOverflowY = '',\n      computedOverflowX = '';\n\n  while (el && el.style && document.body !== el) {\n    overflow = el.style.overflow;\n    overflowX = el.style.overflowX;\n    overflowY = el.style.overflowY;\n\n    if (overflow == 'scroll' || overflowX == 'scroll' || overflowY == 'scroll') {\n      return el;\n    } else if (window.getComputedStyle) {\n      computedStyle = window.getComputedStyle(el);\n      computedOverflow = computedStyle.getPropertyValue('overflow');\n      computedOverflowY = computedStyle.getPropertyValue('overflow-y');\n      computedOverflowX = computedStyle.getPropertyValue('overflow-x');\n\n      if (computedOverflow === 'scroll' || computedOverflowX === 'scroll' || computedOverflowY === 'scroll') {\n        return el;\n      }\n    }\n\n    // The '+ 1' after the scrollHeight/scrollWidth is to prevent problems with zoomed out Chrome.\n    if (el.clientHeight <= el.scrollHeight + 1 && (props.indexOf(overflowY) !== -1 || props.indexOf(overflow) !== -1 || props.indexOf(computedOverflow) !== -1 || props.indexOf(computedOverflowY) !== -1)) {\n      return el;\n    }\n    if (el.clientWidth <= el.scrollWidth + 1 && (props.indexOf(overflowX) !== -1 || props.indexOf(overflow) !== -1 || props.indexOf(computedOverflow) !== -1 || props.indexOf(computedOverflowX) !== -1)) {\n      return el;\n    }\n    el = el.parentNode;\n  }\n\n  return window;\n}\n\n/**\n * Returns a DOM element responsible for trimming the provided element.\n *\n * @param {HTMLElement} base Base element\n * @returns {HTMLElement} Base element's trimming parent\n */\nfunction getTrimmingContainer(base) {\n  var el = base.parentNode;\n\n  while (el && el.style && document.body !== el) {\n    if (el.style.overflow !== 'visible' && el.style.overflow !== '') {\n      return el;\n    } else if (window.getComputedStyle) {\n      var computedStyle = window.getComputedStyle(el);\n\n      if (computedStyle.getPropertyValue('overflow') !== 'visible' && computedStyle.getPropertyValue('overflow') !== '') {\n        return el;\n      }\n    }\n\n    el = el.parentNode;\n  }\n\n  return window;\n}\n\n/**\n * Returns a style property for the provided element. (Be it an inline or external style).\n *\n * @param {HTMLElement} element\n * @param {String} prop Wanted property\n * @returns {String|undefined} Element's style property\n */\nfunction getStyle(element, prop) {\n  /* eslint-disable */\n  if (!element) {\n    return;\n  } else if (element === window) {\n    if (prop === 'width') {\n      return window.innerWidth + 'px';\n    } else if (prop === 'height') {\n      return window.innerHeight + 'px';\n    }\n\n    return;\n  }\n\n  var styleProp = element.style[prop],\n      computedStyle;\n\n  if (styleProp !== '' && styleProp !== void 0) {\n    return styleProp;\n  } else {\n    computedStyle = getComputedStyle(element);\n\n    if (computedStyle[prop] !== '' && computedStyle[prop] !== void 0) {\n      return computedStyle[prop];\n    }\n  }\n}\n\n/**\n * Returns a computed style object for the provided element. (Needed if style is declared in external stylesheet).\n *\n * @param element\n * @returns {IEElementStyle|CssStyle} Elements computed style object\n */\nfunction getComputedStyle(element) {\n  return element.currentStyle || document.defaultView.getComputedStyle(element);\n}\n\n/**\n * Returns the element's outer width.\n *\n * @param element\n * @returns {number} Element's outer width\n */\nfunction outerWidth(element) {\n  return element.offsetWidth;\n}\n\n/**\n * Returns the element's outer height\n *\n * @param elem\n * @returns {number} Element's outer height\n */\nfunction outerHeight(elem) {\n  if ((0, _feature.hasCaptionProblem)() && elem.firstChild && elem.firstChild.nodeName === 'CAPTION') {\n    // fixes problem with Firefox ignoring <caption> in TABLE.offsetHeight\n    // jQuery (1.10.1) still has this unsolved\n    // may be better to just switch to getBoundingClientRect\n    // http://bililite.com/blog/2009/03/27/finding-the-size-of-a-table/\n    // http://lists.w3.org/Archives/Public/www-style/2009Oct/0089.html\n    // http://bugs.jquery.com/ticket/2196\n    // http://lists.w3.org/Archives/Public/www-style/2009Oct/0140.html#start140\n    return elem.offsetHeight + elem.firstChild.offsetHeight;\n  }\n\n  return elem.offsetHeight;\n}\n\n/**\n * Returns the element's inner height.\n *\n * @param element\n * @returns {number} Element's inner height\n */\nfunction innerHeight(element) {\n  return element.clientHeight || element.innerHeight;\n}\n\n/**\n * Returns the element's inner width.\n *\n * @param element\n * @returns {number} Element's inner width\n */\nfunction innerWidth(element) {\n  return element.clientWidth || element.innerWidth;\n}\n\nfunction addEvent(element, event, callback) {\n  if (window.addEventListener) {\n    element.addEventListener(event, callback, false);\n  } else {\n    element.attachEvent('on' + event, callback);\n  }\n}\n\nfunction removeEvent(element, event, callback) {\n  if (window.removeEventListener) {\n    element.removeEventListener(event, callback, false);\n  } else {\n    element.detachEvent('on' + event, callback);\n  }\n}\n\n/**\n * Returns caret position in text input\n *\n * @author http://stackoverflow.com/questions/263743/how-to-get-caret-position-in-textarea\n * @return {Number}\n */\nfunction getCaretPosition(el) {\n  if (el.selectionStart) {\n    return el.selectionStart;\n  } else if (document.selection) {\n    // IE8\n    el.focus();\n\n    var r = document.selection.createRange();\n\n    if (r == null) {\n      return 0;\n    }\n    var re = el.createTextRange();\n    var rc = re.duplicate();\n\n    re.moveToBookmark(r.getBookmark());\n    rc.setEndPoint('EndToStart', re);\n\n    return rc.text.length;\n  }\n\n  return 0;\n}\n\n/**\n * Returns end of the selection in text input\n *\n * @return {Number}\n */\nfunction getSelectionEndPosition(el) {\n  if (el.selectionEnd) {\n    return el.selectionEnd;\n  } else if (document.selection) {\n    // IE8\n    var r = document.selection.createRange();\n\n    if (r == null) {\n      return 0;\n    }\n    var re = el.createTextRange();\n\n    return re.text.indexOf(r.text) + r.text.length;\n  }\n\n  return 0;\n}\n\n/**\n * Returns text under selection.\n *\n * @returns {String}\n */\nfunction getSelectionText() {\n  var text = '';\n\n  if (window.getSelection) {\n    text = window.getSelection().toString();\n  } else if (document.selection && document.selection.type !== 'Control') {\n    text = document.selection.createRange().text;\n  }\n\n  return text;\n}\n\n/**\n * Sets caret position in text input.\n *\n * @author http://blog.vishalon.net/index.php/javascript-getting-and-setting-caret-position-in-textarea/\n * @param {Element} element\n * @param {Number} pos\n * @param {Number} endPos\n */\nfunction setCaretPosition(element, pos, endPos) {\n  if (endPos === void 0) {\n    endPos = pos;\n  }\n  if (element.setSelectionRange) {\n    element.focus();\n\n    try {\n      element.setSelectionRange(pos, endPos);\n    } catch (err) {\n      var elementParent = element.parentNode;\n      var parentDisplayValue = elementParent.style.display;\n      elementParent.style.display = 'block';\n      element.setSelectionRange(pos, endPos);\n      elementParent.style.display = parentDisplayValue;\n    }\n  } else if (element.createTextRange) {\n    // IE8\n    var range = element.createTextRange();\n    range.collapse(true);\n    range.moveEnd('character', endPos);\n    range.moveStart('character', pos);\n    range.select();\n  }\n}\n\nvar cachedScrollbarWidth;\n\n// http://stackoverflow.com/questions/986937/how-can-i-get-the-browsers-scrollbar-sizes\nfunction walkontableCalculateScrollbarWidth() {\n  var inner = document.createElement('div');\n  inner.style.height = '200px';\n  inner.style.width = '100%';\n\n  var outer = document.createElement('div');\n  outer.style.boxSizing = 'content-box';\n  outer.style.height = '150px';\n  outer.style.left = '0px';\n  outer.style.overflow = 'hidden';\n  outer.style.position = 'absolute';\n  outer.style.top = '0px';\n  outer.style.width = '200px';\n  outer.style.visibility = 'hidden';\n  outer.appendChild(inner);\n\n  (document.body || document.documentElement).appendChild(outer);\n  var w1 = inner.offsetWidth;\n  outer.style.overflow = 'scroll';\n  var w2 = inner.offsetWidth;\n  if (w1 == w2) {\n    w2 = outer.clientWidth;\n  }\n\n  (document.body || document.documentElement).removeChild(outer);\n\n  return w1 - w2;\n}\n\n/**\n * Returns the computed width of the native browser scroll bar.\n *\n * @return {Number} width\n */\nfunction getScrollbarWidth() {\n  if (cachedScrollbarWidth === void 0) {\n    cachedScrollbarWidth = walkontableCalculateScrollbarWidth();\n  }\n\n  return cachedScrollbarWidth;\n}\n\n/**\n * Checks if the provided element has a vertical scrollbar.\n *\n * @param {HTMLElement} element\n * @returns {Boolean}\n */\nfunction hasVerticalScrollbar(element) {\n  return element.offsetWidth !== element.clientWidth;\n}\n\n/**\n * Checks if the provided element has a vertical scrollbar.\n *\n * @param {HTMLElement} element\n * @returns {Boolean}\n */\nfunction hasHorizontalScrollbar(element) {\n  return element.offsetHeight !== element.clientHeight;\n}\n\n/**\n * Sets overlay position depending on it's type and used browser\n */\nfunction setOverlayPosition(overlayElem, left, top) {\n  if ((0, _browser.isIE8)() || (0, _browser.isIE9)()) {\n    overlayElem.style.top = top;\n    overlayElem.style.left = left;\n  } else if ((0, _browser.isSafari)()) {\n    overlayElem.style['-webkit-transform'] = 'translate3d(' + left + ',' + top + ',0)';\n  } else {\n    overlayElem.style.transform = 'translate3d(' + left + ',' + top + ',0)';\n  }\n}\n\nfunction getCssTransform(element) {\n  var transform;\n\n  if (element.style.transform && (transform = element.style.transform) !== '') {\n    return ['transform', transform];\n  } else if (element.style['-webkit-transform'] && (transform = element.style['-webkit-transform']) !== '') {\n\n    return ['-webkit-transform', transform];\n  }\n\n  return -1;\n}\n\nfunction resetCssTransform(element) {\n  if (element.style.transform && element.style.transform !== '') {\n    element.style.transform = '';\n  } else if (element.style['-webkit-transform'] && element.style['-webkit-transform'] !== '') {\n    element.style['-webkit-transform'] = '';\n  }\n}\n\n/**\n * Determines if the given DOM element is an input field.\n * Notice: By 'input' we mean input, textarea and select nodes\n *\n * @param {HTMLElement} element - DOM element\n * @returns {Boolean}\n */\nfunction isInput(element) {\n  var inputs = ['INPUT', 'SELECT', 'TEXTAREA'];\n\n  return element && (inputs.indexOf(element.nodeName) > -1 || element.contentEditable === 'true');\n}\n\n/**\n * Determines if the given DOM element is an input field placed OUTSIDE of HOT.\n * Notice: By 'input' we mean input, textarea and select nodes\n *\n * @param {HTMLElement} element - DOM element\n * @returns {Boolean}\n */\nfunction isOutsideInput(element) {\n  return isInput(element) && element.className.indexOf('handsontableInput') == -1 && element.className.indexOf('copyPaste') == -1;\n}\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.to2dArray = to2dArray;\nexports.extendArray = extendArray;\nexports.pivot = pivot;\nexports.arrayReduce = arrayReduce;\nexports.arrayFilter = arrayFilter;\nexports.arrayMap = arrayMap;\nexports.arrayEach = arrayEach;\nexports.arraySum = arraySum;\nexports.arrayMax = arrayMax;\nexports.arrayMin = arrayMin;\nexports.arrayAvg = arrayAvg;\nexports.arrayFlatten = arrayFlatten;\nexports.arrayUnique = arrayUnique;\nfunction to2dArray(arr) {\n  var i = 0,\n      ilen = arr.length;\n\n  while (i < ilen) {\n    arr[i] = [arr[i]];\n    i++;\n  }\n}\n\nfunction extendArray(arr, extension) {\n  var i = 0,\n      ilen = extension.length;\n\n  while (i < ilen) {\n    arr.push(extension[i]);\n    i++;\n  }\n}\n\nfunction pivot(arr) {\n  var pivotedArr = [];\n\n  if (!arr || arr.length === 0 || !arr[0] || arr[0].length === 0) {\n    return pivotedArr;\n  }\n\n  var rowCount = arr.length;\n  var colCount = arr[0].length;\n\n  for (var i = 0; i < rowCount; i++) {\n    for (var j = 0; j < colCount; j++) {\n      if (!pivotedArr[j]) {\n        pivotedArr[j] = [];\n      }\n\n      pivotedArr[j][i] = arr[i][j];\n    }\n  }\n\n  return pivotedArr;\n}\n\n/**\n * A specialized version of `.reduce` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * {@link https://github.com/lodash/lodash/blob/master/lodash.js}\n *\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {Boolean} [initFromArray] Specify using the first element of `array` as the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initFromArray) {\n  var index = -1;\n  var iterable = array;\n\n  if (!Array.isArray(array)) {\n    iterable = Array.from(array);\n  }\n  var length = iterable.length;\n\n  if (initFromArray && length) {\n    accumulator = iterable[++index];\n  }\n  while (++index < length) {\n    accumulator = iteratee(accumulator, iterable[index], index, iterable);\n  }\n\n  return accumulator;\n}\n\n/**\n * A specialized version of `.filter` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * {@link https://github.com/lodash/lodash/blob/master/lodash.js}\n *\n * @param {Array} array The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1;\n  var iterable = array;\n\n  if (!Array.isArray(array)) {\n    iterable = Array.from(array);\n  }\n\n  var length = iterable.length;\n  var result = [];\n  var resIndex = -1;\n\n  while (++index < length) {\n    var value = iterable[index];\n\n    if (predicate(value, index, iterable)) {\n      result[++resIndex] = value;\n    }\n  }\n\n  return result;\n}\n\n/**\n * A specialized version of `.map` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1;\n  var iterable = array;\n\n  if (!Array.isArray(array)) {\n    iterable = Array.from(array);\n  }\n\n  var length = iterable.length;\n  var result = [];\n  var resIndex = -1;\n\n  while (++index < length) {\n    var value = iterable[index];\n\n    result[++resIndex] = iteratee(value, index, iterable);\n  }\n\n  return result;\n}\n\n/**\n * A specialized version of `.forEach` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * {@link https://github.com/lodash/lodash/blob/master/lodash.js}\n *\n * @param {Array|*} array The array to iterate over or an any element with implemented iterator protocol.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1;\n  var iterable = array;\n\n  if (!Array.isArray(array)) {\n    iterable = Array.from(array);\n  }\n\n  var length = iterable.length;\n\n  while (++index < length) {\n    if (iteratee(iterable[index], index, iterable) === false) {\n      break;\n    }\n  }\n\n  return array;\n}\n\n/**\n * Calculate sum value for each item of the array.\n *\n * @param {Array} array The array to process.\n * @returns {Number} Returns calculated sum value.\n */\nfunction arraySum(array) {\n  return arrayReduce(array, function (a, b) {\n    return a + b;\n  }, 0);\n}\n\n/**\n * Returns the highest value from an array. Can be array of numbers or array of strings.\n * NOTICE: Mixed values is not supported.\n *\n * @param {Array} array The array to process.\n * @returns {Number} Returns the highest value from an array.\n */\nfunction arrayMax(array) {\n  return arrayReduce(array, function (a, b) {\n    return a > b ? a : b;\n  }, Array.isArray(array) ? array[0] : void 0);\n}\n\n/**\n * Returns the lowest value from an array. Can be array of numbers or array of strings.\n * NOTICE: Mixed values is not supported.\n *\n * @param {Array} array The array to process.\n * @returns {Number} Returns the lowest value from an array.\n */\nfunction arrayMin(array) {\n  return arrayReduce(array, function (a, b) {\n    return a < b ? a : b;\n  }, Array.isArray(array) ? array[0] : void 0);\n}\n\n/**\n * Calculate average value for each item of the array.\n *\n * @param {Array} array The array to process.\n * @returns {Number} Returns calculated average value.\n */\nfunction arrayAvg(array) {\n  if (!array.length) {\n    return 0;\n  }\n\n  return arraySum(array) / array.length;\n}\n\n/**\n * Flatten multidimensional array.\n *\n * @param {Array} array Array of Arrays\n * @returns {Array}\n */\nfunction arrayFlatten(array) {\n  return arrayReduce(array, function (initial, value) {\n    return initial.concat(Array.isArray(value) ? arrayFlatten(value) : value);\n  }, []);\n}\n\n/**\n * Unique values in the array.\n *\n * @param {Array} array The array to process.\n * @returns {Array}\n */\nfunction arrayUnique(array) {\n  var unique = [];\n\n  arrayEach(array, function (value) {\n    if (unique.indexOf(value) === -1) {\n      unique.push(value);\n    }\n  });\n\n  return unique;\n}\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.duckSchema = duckSchema;\nexports.inherit = inherit;\nexports.extend = extend;\nexports.deepExtend = deepExtend;\nexports.deepClone = deepClone;\nexports.clone = clone;\nexports.mixin = mixin;\nexports.isObjectEqual = isObjectEqual;\nexports.isObject = isObject;\nexports.defineGetter = defineGetter;\nexports.objectEach = objectEach;\nexports.getProperty = getProperty;\nexports.deepObjectSize = deepObjectSize;\nexports.createObjectPropListener = createObjectPropListener;\nexports.hasOwnProperty = hasOwnProperty;\n\nvar _array = __webpack_require__(1);\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/**\n * Generate schema for passed object.\n *\n * @param {Array|Object} object\n * @returns {Array|Object}\n */\nfunction duckSchema(object) {\n  var schema;\n\n  if (Array.isArray(object)) {\n    schema = [];\n  } else {\n    schema = {};\n\n    objectEach(object, function (value, key) {\n      if (key === '__children') {\n        return;\n      }\n\n      if (value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && !Array.isArray(value)) {\n        schema[key] = duckSchema(value);\n      } else if (Array.isArray(value)) {\n        if (value.length && _typeof(value[0]) === 'object' && !Array.isArray(value[0])) {\n          schema[key] = [duckSchema(value[0])];\n        } else {\n          schema[key] = [];\n        }\n      } else {\n        schema[key] = null;\n      }\n    });\n  }\n\n  return schema;\n}\n\n/**\n * Inherit without without calling parent constructor, and setting `Child.prototype.constructor` to `Child` instead of `Parent`.\n * Creates temporary dummy function to call it as constructor.\n * Described in ticket: https://github.com/handsontable/handsontable/pull/516\n *\n * @param  {Object} Child  child class\n * @param  {Object} Parent parent class\n * @return {Object}        extended Child\n */\nfunction inherit(Child, Parent) {\n  Parent.prototype.constructor = Parent;\n  Child.prototype = new Parent();\n  Child.prototype.constructor = Child;\n\n  return Child;\n}\n\n/**\n * Perform shallow extend of a target object with extension's own properties.\n *\n * @param {Object} target An object that will receive the new properties.\n * @param {Object} extension An object containing additional properties to merge into the target.\n */\nfunction extend(target, extension) {\n  objectEach(extension, function (value, key) {\n    target[key] = value;\n  });\n\n  return target;\n}\n\n/**\n * Perform deep extend of a target object with extension's own properties.\n *\n * @param {Object} target An object that will receive the new properties.\n * @param {Object} extension An object containing additional properties to merge into the target.\n */\nfunction deepExtend(target, extension) {\n  objectEach(extension, function (value, key) {\n    if (extension[key] && _typeof(extension[key]) === 'object') {\n      if (!target[key]) {\n        if (Array.isArray(extension[key])) {\n          target[key] = [];\n        } else if (Object.prototype.toString.call(extension[key]) === '[object Date]') {\n          target[key] = extension[key];\n        } else {\n          target[key] = {};\n        }\n      }\n      deepExtend(target[key], extension[key]);\n    } else {\n      target[key] = extension[key];\n    }\n  });\n}\n\n/**\n * Perform deep clone of an object.\n * WARNING! Only clones JSON properties. Will cause error when `obj` contains a function, Date, etc.\n *\n * @param {Object} obj An object that will be cloned\n * @return {Object}\n */\nfunction deepClone(obj) {\n  if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object') {\n    return JSON.parse(JSON.stringify(obj));\n  }\n\n  return obj;\n}\n\n/**\n * Shallow clone object.\n *\n * @param {Object} object\n * @returns {Object}\n */\nfunction clone(object) {\n  var result = {};\n\n  objectEach(object, function (value, key) {\n    result[key] = value;\n  });\n\n  return result;\n}\n\n/**\n * Extend the Base object (usually prototype) of the functionality the `mixins` objects.\n *\n * @param {Object} Base Base object which will be extended.\n * @param {Object} mixins The object of the functionality will be \"copied\".\n * @returns {Object}\n */\nfunction mixin(Base) {\n  if (!Base.MIXINS) {\n    Base.MIXINS = [];\n  }\n\n  for (var _len = arguments.length, mixins = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    mixins[_key - 1] = arguments[_key];\n  }\n\n  (0, _array.arrayEach)(mixins, function (mixin) {\n    Base.MIXINS.push(mixin.MIXIN_NAME);\n\n    objectEach(mixin, function (value, key) {\n      if (Base.prototype[key] !== void 0) {\n        throw new Error('Mixin conflict. Property \\'' + key + '\\' already exist and cannot be overwritten.');\n      }\n      if (typeof value === 'function') {\n        Base.prototype[key] = value;\n      } else {\n        var getter = function _getter(propertyName, initialValue) {\n          propertyName = '_' + propertyName;\n\n          var initValue = function initValue(value) {\n            if (Array.isArray(value) || isObject(value)) {\n              value = deepClone(value);\n            }\n\n            return value;\n          };\n\n          return function () {\n            if (this[propertyName] === void 0) {\n              this[propertyName] = initValue(initialValue);\n            }\n\n            return this[propertyName];\n          };\n        };\n        var setter = function _setter(propertyName) {\n          propertyName = '_' + propertyName;\n\n          return function (value) {\n            this[propertyName] = value;\n          };\n        };\n        Object.defineProperty(Base.prototype, key, {\n          get: getter(key, value),\n          set: setter(key),\n          configurable: true\n        });\n      }\n    });\n  });\n\n  return Base;\n}\n\n/**\n * Checks if two objects or arrays are (deep) equal\n *\n * @param {Object|Array} object1\n * @param {Object|Array} object2\n * @returns {Boolean}\n */\nfunction isObjectEqual(object1, object2) {\n  return JSON.stringify(object1) === JSON.stringify(object2);\n}\n\n/**\n * Determines whether given object is a plain Object.\n * Note: String and Array are not plain Objects\n * @param {*} obj\n * @returns {boolean}\n */\nfunction isObject(obj) {\n  return Object.prototype.toString.call(obj) == '[object Object]';\n}\n\nfunction defineGetter(object, property, value, options) {\n  options.value = value;\n  options.writable = options.writable !== false;\n  options.enumerable = options.enumerable !== false;\n  options.configurable = options.configurable !== false;\n\n  Object.defineProperty(object, property, options);\n}\n\n/**\n * A specialized version of `.forEach` for objects.\n *\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction objectEach(object, iteratee) {\n  for (var key in object) {\n    if (!object.hasOwnProperty || object.hasOwnProperty && Object.prototype.hasOwnProperty.call(object, key)) {\n      if (iteratee(object[key], key, object) === false) {\n        break;\n      }\n    }\n  }\n\n  return object;\n}\n\n/**\n * Get object property by its name. Access to sub properties can be achieved by dot notation (e.q. `'foo.bar.baz'`).\n *\n * @param {Object} object Object which value will be exported.\n * @param {String} name Object property name.\n * @returns {*}\n */\nfunction getProperty(object, name) {\n  var names = name.split('.');\n  var result = object;\n\n  objectEach(names, function (name) {\n    result = result[name];\n\n    if (result === void 0) {\n      result = void 0;\n\n      return false;\n    }\n  });\n\n  return result;\n}\n\n/**\n * Return object length (recursively).\n *\n * @param {*} object Object for which we want get length.\n * @returns {Number}\n */\nfunction deepObjectSize(object) {\n  if (!isObject(object)) {\n    return 0;\n  }\n  var recursObjLen = function recursObjLen(obj) {\n    var result = 0;\n\n    if (isObject(obj)) {\n      objectEach(obj, function (key) {\n        result += recursObjLen(key);\n      });\n    } else {\n      result++;\n    }\n\n    return result;\n  };\n\n  return recursObjLen(object);\n}\n\n/**\n * Create object with property where its value change will be observed.\n *\n * @param {*} [defaultValue=undefined] Default value.\n * @param {String} [propertyToListen='value'] Property to listen.\n * @returns {Object}\n */\nfunction createObjectPropListener(defaultValue) {\n  var _holder;\n\n  var propertyToListen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'value';\n\n  var privateProperty = '_' + propertyToListen;\n  var holder = (_holder = {\n    _touched: false\n  }, _defineProperty(_holder, privateProperty, defaultValue), _defineProperty(_holder, 'isTouched', function isTouched() {\n    return this._touched;\n  }), _holder);\n\n  Object.defineProperty(holder, propertyToListen, {\n    get: function get() {\n      return this[privateProperty];\n    },\n    set: function set(value) {\n      this._touched = true;\n      this[privateProperty] = value;\n    },\n\n    enumerable: true,\n    configurable: true\n  });\n\n  return holder;\n}\n\n/**\n * Check if at specified `key` there is any value for `object`.\n *\n * @param {Object} object Object to search value at specyfic key.\n * @param {String} key String key to check.\n */\nfunction hasOwnProperty(object, key) {\n  return Object.prototype.hasOwnProperty.call(object, key);\n}\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar core = __webpack_require__(45);\nvar hide = __webpack_require__(31);\nvar redefine = __webpack_require__(30);\nvar ctx = __webpack_require__(32);\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n  var IS_FORCED = type & $export.F;\n  var IS_GLOBAL = type & $export.G;\n  var IS_STATIC = type & $export.S;\n  var IS_PROTO = type & $export.P;\n  var IS_BIND = type & $export.B;\n  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n  var key, own, out, exp;\n  if (IS_GLOBAL) source = name;\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    // export native or passed\n    out = (own ? target : source)[key];\n    // bind timers to global for call from export context\n    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // extend global\n    if (target) redefine(target, key, out, type & $export.U);\n    // export\n    if (exports[key] != out) hide(exports, key, exp);\n    if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n  }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1;   // forced\n$export.G = 2;   // global\n$export.S = 4;   // static\n$export.P = 8;   // proto\n$export.B = 16;  // bind\n$export.W = 32;  // wrap\n$export.U = 64;  // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.Viewport = exports.TableRenderer = exports.Table = exports.Settings = exports.Selection = exports.Scroll = exports.Overlays = exports.Event = exports.Core = exports.default = exports.Border = exports.TopLeftCornerOverlay = exports.TopOverlay = exports.LeftOverlay = exports.DebugOverlay = exports.RowFilter = exports.ColumnFilter = exports.CellRange = exports.CellCoords = exports.ViewportRowsCalculator = exports.ViewportColumnsCalculator = undefined;\n\n__webpack_require__(96);\n\n__webpack_require__(111);\n\n__webpack_require__(112);\n\n__webpack_require__(116);\n\n__webpack_require__(117);\n\n__webpack_require__(119);\n\n__webpack_require__(122);\n\n__webpack_require__(123);\n\n__webpack_require__(124);\n\n__webpack_require__(125);\n\n__webpack_require__(126);\n\n__webpack_require__(127);\n\n__webpack_require__(128);\n\n__webpack_require__(129);\n\n__webpack_require__(130);\n\n__webpack_require__(131);\n\n__webpack_require__(132);\n\n__webpack_require__(133);\n\n__webpack_require__(134);\n\n__webpack_require__(135);\n\n__webpack_require__(136);\n\n__webpack_require__(137);\n\n__webpack_require__(138);\n\n__webpack_require__(139);\n\n__webpack_require__(141);\n\n__webpack_require__(143);\n\n__webpack_require__(144);\n\n__webpack_require__(145);\n\n__webpack_require__(146);\n\n__webpack_require__(147);\n\n__webpack_require__(148);\n\n__webpack_require__(149);\n\n__webpack_require__(150);\n\n__webpack_require__(151);\n\n__webpack_require__(152);\n\n__webpack_require__(153);\n\n__webpack_require__(154);\n\n__webpack_require__(155);\n\n__webpack_require__(85);\n\n__webpack_require__(156);\n\n__webpack_require__(157);\n\n__webpack_require__(159);\n\n__webpack_require__(160);\n\n__webpack_require__(161);\n\n__webpack_require__(162);\n\n__webpack_require__(163);\n\n__webpack_require__(164);\n\n__webpack_require__(165);\n\n__webpack_require__(167);\n\n__webpack_require__(168);\n\n__webpack_require__(169);\n\n__webpack_require__(172);\n\n__webpack_require__(173);\n\n__webpack_require__(174);\n\nvar _viewportColumns = __webpack_require__(175);\n\nvar _viewportColumns2 = _interopRequireDefault(_viewportColumns);\n\nvar _viewportRows = __webpack_require__(176);\n\nvar _viewportRows2 = _interopRequireDefault(_viewportRows);\n\nvar _coords = __webpack_require__(55);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nvar _range = __webpack_require__(86);\n\nvar _range2 = _interopRequireDefault(_range);\n\nvar _column = __webpack_require__(177);\n\nvar _column2 = _interopRequireDefault(_column);\n\nvar _row = __webpack_require__(178);\n\nvar _row2 = _interopRequireDefault(_row);\n\nvar _debug = __webpack_require__(348);\n\nvar _debug2 = _interopRequireDefault(_debug);\n\nvar _left = __webpack_require__(351);\n\nvar _left2 = _interopRequireDefault(_left);\n\nvar _top = __webpack_require__(352);\n\nvar _top2 = _interopRequireDefault(_top);\n\nvar _topLeftCorner = __webpack_require__(353);\n\nvar _topLeftCorner2 = _interopRequireDefault(_topLeftCorner);\n\nvar _border = __webpack_require__(306);\n\nvar _border2 = _interopRequireDefault(_border);\n\nvar _core = __webpack_require__(179);\n\nvar _core2 = _interopRequireDefault(_core);\n\nvar _event = __webpack_require__(299);\n\nvar _event2 = _interopRequireDefault(_event);\n\nvar _overlays = __webpack_require__(300);\n\nvar _overlays2 = _interopRequireDefault(_overlays);\n\nvar _scroll = __webpack_require__(301);\n\nvar _scroll2 = _interopRequireDefault(_scroll);\n\nvar _selection = __webpack_require__(354);\n\nvar _selection2 = _interopRequireDefault(_selection);\n\nvar _settings = __webpack_require__(302);\n\nvar _settings2 = _interopRequireDefault(_settings);\n\nvar _table = __webpack_require__(303);\n\nvar _table2 = _interopRequireDefault(_table);\n\nvar _tableRenderer = __webpack_require__(304);\n\nvar _tableRenderer2 = _interopRequireDefault(_tableRenderer);\n\nvar _viewport = __webpack_require__(305);\n\nvar _viewport2 = _interopRequireDefault(_viewport);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.ViewportColumnsCalculator = _viewportColumns2.default;\nexports.ViewportRowsCalculator = _viewportRows2.default;\nexports.CellCoords = _coords2.default;\nexports.CellRange = _range2.default;\nexports.ColumnFilter = _column2.default;\nexports.RowFilter = _row2.default;\nexports.DebugOverlay = _debug2.default;\nexports.LeftOverlay = _left2.default;\nexports.TopOverlay = _top2.default;\nexports.TopLeftCornerOverlay = _topLeftCorner2.default;\nexports.Border = _border2.default;\nexports.default = _core2.default;\nexports.Core = _core2.default;\nexports.Event = _event2.default;\nexports.Overlays = _overlays2.default;\nexports.Scroll = _scroll2.default;\nexports.Selection = _selection2.default;\nexports.Settings = _settings2.default;\nexports.Table = _table2.default;\nexports.TableRenderer = _tableRenderer2.default;\nexports.Viewport = _viewport2.default;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.isNumeric = isNumeric;\nexports.rangeEach = rangeEach;\nexports.rangeEachReverse = rangeEachReverse;\nexports.valueAccordingPercent = valueAccordingPercent;\n/**\n * Checks if value of n is a numeric one\n * http://jsperf.com/isnan-vs-isnumeric/4\n * @param n\n * @returns {boolean}\n */\nfunction isNumeric(n) {\n  /* eslint-disable */\n  var t = typeof n === 'undefined' ? 'undefined' : _typeof(n);\n\n  return t == 'number' ? !isNaN(n) && isFinite(n) : t == 'string' ? !n.length ? false : n.length == 1 ? /\\d/.test(n) : /^\\s*[+-]?\\s*(?:(?:\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)|(?:0x[a-f\\d]+))\\s*$/i.test(n) : t == 'object' ? !!n && typeof n.valueOf() == 'number' && !(n instanceof Date) : false;\n}\n\n/**\n * A specialized version of `.forEach` defined by ranges.\n *\n * @param {Number} rangeFrom The number from start iterate.\n * @param {Number|Function} rangeTo The number where finish iterate or function as a iteratee.\n * @param {Function} [iteratee] The function invoked per iteration.\n */\nfunction rangeEach(rangeFrom, rangeTo, iteratee) {\n  var index = -1;\n\n  if (typeof rangeTo === 'function') {\n    iteratee = rangeTo;\n    rangeTo = rangeFrom;\n  } else {\n    index = rangeFrom - 1;\n  }\n  while (++index <= rangeTo) {\n    if (iteratee(index) === false) {\n      break;\n    }\n  }\n}\n\n/**\n * A specialized version of `.forEach` defined by ranges iterable in reverse order.\n *\n * @param {Number} rangeFrom The number from start iterate.\n * @param {Number|Function} rangeTo The number where finish iterate or function as a iteratee.\n * @param {Function} [iteratee] The function invoked per iteration.\n */\nfunction rangeEachReverse(rangeFrom, rangeTo, iteratee) {\n  var index = rangeFrom + 1;\n\n  if (typeof rangeTo === 'function') {\n    iteratee = rangeTo;\n    rangeTo = 0;\n  }\n  while (--index >= rangeTo) {\n    if (iteratee(index) === false) {\n      break;\n    }\n  }\n}\n\n/**\n * Calculate value from percent.\n *\n * @param {Number} value Base value from percent will be calculated.\n * @param {String|Number} percent Can be Number or String (eq. `'33%'`).\n * @returns {Number}\n */\nfunction valueAccordingPercent(value, percent) {\n  percent = parseInt(percent.toString().replace('%', ''), 10);\n  percent = parseInt(value * percent / 100, 10);\n\n  return percent;\n}\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.getListenersCounter = getListenersCounter;\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _feature = __webpack_require__(40);\n\nvar _event = __webpack_require__(12);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Counter which tracks unregistered listeners (useful for detecting memory leaks).\n *\n * @type {Number}\n */\nvar listenersCounter = 0;\n\n/**\n * Event DOM manager for internal use in Handsontable.\n *\n * @class EventManager\n * @util\n */\n\nvar EventManager = function () {\n  /**\n   * @param {Object} [context=null]\n   * @private\n   */\n  function EventManager() {\n    var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n    _classCallCheck(this, EventManager);\n\n    this.context = context || this;\n\n    if (!this.context.eventListeners) {\n      this.context.eventListeners = [];\n    }\n  }\n\n  /**\n   * Register specified listener (`eventName`) to the element.\n   *\n   * @param {Element} element Target element.\n   * @param {String} eventName Event name.\n   * @param {Function} callback Function which will be called after event occur.\n   * @returns {Function} Returns function which you can easily call to remove that event\n   */\n\n\n  _createClass(EventManager, [{\n    key: 'addEventListener',\n    value: function addEventListener(element, eventName, callback) {\n      var _this = this;\n\n      var context = this.context;\n\n      function callbackProxy(event) {\n        event = extendEvent(context, event);\n\n        callback.call(this, event);\n      }\n      this.context.eventListeners.push({\n        element: element,\n        event: eventName,\n        callback: callback,\n        callbackProxy: callbackProxy\n      });\n\n      if (window.addEventListener) {\n        element.addEventListener(eventName, callbackProxy, false);\n      } else {\n        element.attachEvent('on' + eventName, callbackProxy);\n      }\n      listenersCounter++;\n\n      return function () {\n        _this.removeEventListener(element, eventName, callback);\n      };\n    }\n\n    /**\n     * Remove the event listener previously registered.\n     *\n     * @param {Element} element Target element.\n     * @param {String} eventName Event name.\n     * @param {Function} callback Function to remove from the event target. It must be the same as during registration listener.\n     */\n\n  }, {\n    key: 'removeEventListener',\n    value: function removeEventListener(element, eventName, callback) {\n      var len = this.context.eventListeners.length;\n      var tmpEvent = void 0;\n\n      while (len--) {\n        tmpEvent = this.context.eventListeners[len];\n\n        if (tmpEvent.event == eventName && tmpEvent.element == element) {\n          if (callback && callback != tmpEvent.callback) {\n            /* eslint-disable no-continue */\n            continue;\n          }\n          this.context.eventListeners.splice(len, 1);\n\n          if (tmpEvent.element.removeEventListener) {\n            tmpEvent.element.removeEventListener(tmpEvent.event, tmpEvent.callbackProxy, false);\n          } else {\n            tmpEvent.element.detachEvent('on' + tmpEvent.event, tmpEvent.callbackProxy);\n          }\n          listenersCounter--;\n        }\n      }\n    }\n\n    /**\n     * Clear all previously registered events.\n     *\n     * @private\n     * @since 0.15.0-beta3\n     */\n\n  }, {\n    key: 'clearEvents',\n    value: function clearEvents() {\n      if (!this.context) {\n        return;\n      }\n      var len = this.context.eventListeners.length;\n\n      while (len--) {\n        var event = this.context.eventListeners[len];\n\n        if (event) {\n          this.removeEventListener(event.element, event.event, event.callback);\n        }\n      }\n    }\n\n    /**\n     * Clear all previously registered events.\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.clearEvents();\n    }\n\n    /**\n     * Destroy instance of EventManager.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.clearEvents();\n      this.context = null;\n    }\n\n    /**\n     * Trigger event at the specified target element.\n     *\n     * @param {Element} element Target element.\n     * @param {String} eventName Event name.\n     */\n\n  }, {\n    key: 'fireEvent',\n    value: function fireEvent(element, eventName) {\n      var options = {\n        bubbles: true,\n        cancelable: eventName !== 'mousemove',\n        view: window,\n        detail: 0,\n        screenX: 0,\n        screenY: 0,\n        clientX: 1,\n        clientY: 1,\n        ctrlKey: false,\n        altKey: false,\n        shiftKey: false,\n        metaKey: false,\n        button: 0,\n        relatedTarget: undefined\n      };\n      var event;\n\n      if (document.createEvent) {\n        event = document.createEvent('MouseEvents');\n        event.initMouseEvent(eventName, options.bubbles, options.cancelable, options.view, options.detail, options.screenX, options.screenY, options.clientX, options.clientY, options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, options.relatedTarget || document.body.parentNode);\n      } else {\n        event = document.createEventObject();\n      }\n\n      if (element.dispatchEvent) {\n        element.dispatchEvent(event);\n      } else {\n        element.fireEvent('on' + eventName, event);\n      }\n    }\n  }]);\n\n  return EventManager;\n}();\n\n/**\n * @param {Object} context\n * @param {Event} event\n * @private\n * @returns {*}\n */\n\n\nfunction extendEvent(context, event) {\n  var componentName = 'HOT-TABLE';\n  var isHotTableSpotted = void 0;\n  var fromElement = void 0;\n  var realTarget = void 0;\n  var target = void 0;\n  var len = void 0;\n  var nativeStopImmediatePropagation = void 0;\n\n  event.isTargetWebComponent = false;\n  event.realTarget = event.target;\n\n  nativeStopImmediatePropagation = event.stopImmediatePropagation;\n  event.stopImmediatePropagation = function () {\n    nativeStopImmediatePropagation.apply(this);\n    (0, _event.stopImmediatePropagation)(this);\n  };\n\n  if (!EventManager.isHotTableEnv) {\n    return event;\n  }\n  event = (0, _element.polymerWrap)(event);\n  len = event.path ? event.path.length : 0;\n\n  while (len--) {\n    if (event.path[len].nodeName === componentName) {\n      isHotTableSpotted = true;\n    } else if (isHotTableSpotted && event.path[len].shadowRoot) {\n      target = event.path[len];\n\n      break;\n    }\n    if (len === 0 && !target) {\n      target = event.path[len];\n    }\n  }\n  if (!target) {\n    target = event.target;\n  }\n  event.isTargetWebComponent = true;\n\n  if ((0, _feature.isWebComponentSupportedNatively)()) {\n    event.realTarget = event.srcElement || event.toElement;\n  } else if ((0, _object.hasOwnProperty)(context, 'hot') || context.isHotTableEnv || context.wtTable) {\n    // Polymer doesn't support `event.target` property properly we must emulate it ourselves\n    if ((0, _object.hasOwnProperty)(context, 'hot')) {\n      // Custom element\n      fromElement = context.hot ? context.hot.view.wt.wtTable.TABLE : null;\n    } else if (context.isHotTableEnv) {\n      // Handsontable.Core\n      fromElement = context.view.activeWt.wtTable.TABLE.parentNode.parentNode;\n    } else if (context.wtTable) {\n      // Walkontable\n      fromElement = context.wtTable.TABLE.parentNode.parentNode;\n    }\n    realTarget = (0, _element.closest)(event.target, [componentName], fromElement);\n\n    if (realTarget) {\n      event.realTarget = fromElement.querySelector(componentName) || event.target;\n    } else {\n      event.realTarget = event.target;\n    }\n  }\n\n  Object.defineProperty(event, 'target', {\n    get: function get() {\n      return (0, _element.polymerWrap)(target);\n    },\n\n    enumerable: true,\n    configurable: true\n  });\n\n  return event;\n}\n\nexports.default = EventManager;\nfunction getListenersCounter() {\n  return listenersCounter;\n};\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n/**\n * Constants for parts of translation.\n */\n\nvar CONTEXT_MENU_ITEMS_NAMESPACE = exports.CONTEXT_MENU_ITEMS_NAMESPACE = 'ContextMenu:items';\nvar CONTEXTMENU_ITEMS_ROW_ABOVE = exports.CONTEXTMENU_ITEMS_ROW_ABOVE = CONTEXT_MENU_ITEMS_NAMESPACE + '.insertRowAbove';\nvar CONTEXTMENU_ITEMS_ROW_BELOW = exports.CONTEXTMENU_ITEMS_ROW_BELOW = CONTEXT_MENU_ITEMS_NAMESPACE + '.insertRowBelow';\nvar CONTEXTMENU_ITEMS_INSERT_LEFT = exports.CONTEXTMENU_ITEMS_INSERT_LEFT = CONTEXT_MENU_ITEMS_NAMESPACE + '.insertColumnOnTheLeft';\nvar CONTEXTMENU_ITEMS_INSERT_RIGHT = exports.CONTEXTMENU_ITEMS_INSERT_RIGHT = CONTEXT_MENU_ITEMS_NAMESPACE + '.insertColumnOnTheRight';\nvar CONTEXTMENU_ITEMS_REMOVE_ROW = exports.CONTEXTMENU_ITEMS_REMOVE_ROW = CONTEXT_MENU_ITEMS_NAMESPACE + '.removeRow';\nvar CONTEXTMENU_ITEMS_REMOVE_COLUMN = exports.CONTEXTMENU_ITEMS_REMOVE_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.removeColumn';\nvar CONTEXTMENU_ITEMS_UNDO = exports.CONTEXTMENU_ITEMS_UNDO = CONTEXT_MENU_ITEMS_NAMESPACE + '.undo';\nvar CONTEXTMENU_ITEMS_REDO = exports.CONTEXTMENU_ITEMS_REDO = CONTEXT_MENU_ITEMS_NAMESPACE + '.redo';\nvar CONTEXTMENU_ITEMS_READ_ONLY = exports.CONTEXTMENU_ITEMS_READ_ONLY = CONTEXT_MENU_ITEMS_NAMESPACE + '.readOnly';\nvar CONTEXTMENU_ITEMS_CLEAR_COLUMN = exports.CONTEXTMENU_ITEMS_CLEAR_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.clearColumn';\n\nvar CONTEXTMENU_ITEMS_COPY = exports.CONTEXTMENU_ITEMS_COPY = CONTEXT_MENU_ITEMS_NAMESPACE + '.copy';\nvar CONTEXTMENU_ITEMS_CUT = exports.CONTEXTMENU_ITEMS_CUT = CONTEXT_MENU_ITEMS_NAMESPACE + '.cut';\n\nvar CONTEXTMENU_ITEMS_FREEZE_COLUMN = exports.CONTEXTMENU_ITEMS_FREEZE_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.freezeColumn';\nvar CONTEXTMENU_ITEMS_UNFREEZE_COLUMN = exports.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.unfreezeColumn';\n\nvar CONTEXTMENU_ITEMS_MERGE_CELLS = exports.CONTEXTMENU_ITEMS_MERGE_CELLS = CONTEXT_MENU_ITEMS_NAMESPACE + '.mergeCells';\nvar CONTEXTMENU_ITEMS_UNMERGE_CELLS = exports.CONTEXTMENU_ITEMS_UNMERGE_CELLS = CONTEXT_MENU_ITEMS_NAMESPACE + '.unmergeCells';\n\nvar CONTEXTMENU_ITEMS_ADD_COMMENT = exports.CONTEXTMENU_ITEMS_ADD_COMMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.addComment';\nvar CONTEXTMENU_ITEMS_EDIT_COMMENT = exports.CONTEXTMENU_ITEMS_EDIT_COMMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.editComment';\nvar CONTEXTMENU_ITEMS_REMOVE_COMMENT = exports.CONTEXTMENU_ITEMS_REMOVE_COMMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.removeComment';\nvar CONTEXTMENU_ITEMS_READ_ONLY_COMMENT = exports.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.readOnlyComment';\n\nvar CONTEXTMENU_ITEMS_ALIGNMENT = exports.CONTEXTMENU_ITEMS_ALIGNMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.align';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_LEFT = exports.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.left';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_CENTER = exports.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.center';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT = exports.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.right';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY = exports.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.justify';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_TOP = exports.CONTEXTMENU_ITEMS_ALIGNMENT_TOP = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.top';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE = exports.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.middle';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM = exports.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.bottom';\n\nvar CONTEXTMENU_ITEMS_BORDERS = exports.CONTEXTMENU_ITEMS_BORDERS = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders';\nvar CONTEXTMENU_ITEMS_BORDERS_TOP = exports.CONTEXTMENU_ITEMS_BORDERS_TOP = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.top';\nvar CONTEXTMENU_ITEMS_BORDERS_RIGHT = exports.CONTEXTMENU_ITEMS_BORDERS_RIGHT = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.right';\nvar CONTEXTMENU_ITEMS_BORDERS_BOTTOM = exports.CONTEXTMENU_ITEMS_BORDERS_BOTTOM = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.bottom';\nvar CONTEXTMENU_ITEMS_BORDERS_LEFT = exports.CONTEXTMENU_ITEMS_BORDERS_LEFT = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.left';\nvar CONTEXTMENU_ITEMS_REMOVE_BORDERS = exports.CONTEXTMENU_ITEMS_REMOVE_BORDERS = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.remove';\n\nvar CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD = exports.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD = CONTEXT_MENU_ITEMS_NAMESPACE + '.nestedHeaders.insertChildRow';\nvar CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD = exports.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD = CONTEXT_MENU_ITEMS_NAMESPACE + '.nestedHeaders.detachFromParent';\n\nvar CONTEXTMENU_ITEMS_HIDE_COLUMN = exports.CONTEXTMENU_ITEMS_HIDE_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.hideColumn';\nvar CONTEXTMENU_ITEMS_SHOW_COLUMN = exports.CONTEXTMENU_ITEMS_SHOW_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.showColumn';\n\nvar CONTEXTMENU_ITEMS_HIDE_ROW = exports.CONTEXTMENU_ITEMS_HIDE_ROW = CONTEXT_MENU_ITEMS_NAMESPACE + '.hideRow';\nvar CONTEXTMENU_ITEMS_SHOW_ROW = exports.CONTEXTMENU_ITEMS_SHOW_ROW = CONTEXT_MENU_ITEMS_NAMESPACE + '.showRow';\n\nvar FILTERS_NAMESPACE = exports.FILTERS_NAMESPACE = 'Filters:';\nvar FILTERS_CONDITIONS_NAMESPACE = exports.FILTERS_CONDITIONS_NAMESPACE = FILTERS_NAMESPACE + 'conditions';\nvar FILTERS_CONDITIONS_NONE = exports.FILTERS_CONDITIONS_NONE = FILTERS_CONDITIONS_NAMESPACE + '.none';\nvar FILTERS_CONDITIONS_EMPTY = exports.FILTERS_CONDITIONS_EMPTY = FILTERS_CONDITIONS_NAMESPACE + '.isEmpty';\nvar FILTERS_CONDITIONS_NOT_EMPTY = exports.FILTERS_CONDITIONS_NOT_EMPTY = FILTERS_CONDITIONS_NAMESPACE + '.isNotEmpty';\nvar FILTERS_CONDITIONS_EQUAL = exports.FILTERS_CONDITIONS_EQUAL = FILTERS_CONDITIONS_NAMESPACE + '.isEqualTo';\nvar FILTERS_CONDITIONS_NOT_EQUAL = exports.FILTERS_CONDITIONS_NOT_EQUAL = FILTERS_CONDITIONS_NAMESPACE + '.isNotEqualTo';\nvar FILTERS_CONDITIONS_BEGINS_WITH = exports.FILTERS_CONDITIONS_BEGINS_WITH = FILTERS_CONDITIONS_NAMESPACE + '.beginsWith';\nvar FILTERS_CONDITIONS_ENDS_WITH = exports.FILTERS_CONDITIONS_ENDS_WITH = FILTERS_CONDITIONS_NAMESPACE + '.endsWith';\nvar FILTERS_CONDITIONS_CONTAINS = exports.FILTERS_CONDITIONS_CONTAINS = FILTERS_CONDITIONS_NAMESPACE + '.contains';\nvar FILTERS_CONDITIONS_NOT_CONTAIN = exports.FILTERS_CONDITIONS_NOT_CONTAIN = FILTERS_CONDITIONS_NAMESPACE + '.doesNotContain';\nvar FILTERS_CONDITIONS_BY_VALUE = exports.FILTERS_CONDITIONS_BY_VALUE = FILTERS_CONDITIONS_NAMESPACE + '.byValue';\nvar FILTERS_CONDITIONS_GREATER_THAN = exports.FILTERS_CONDITIONS_GREATER_THAN = FILTERS_CONDITIONS_NAMESPACE + '.greaterThan';\nvar FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL = exports.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL = FILTERS_CONDITIONS_NAMESPACE + '.greaterThanOrEqualTo';\nvar FILTERS_CONDITIONS_LESS_THAN = exports.FILTERS_CONDITIONS_LESS_THAN = FILTERS_CONDITIONS_NAMESPACE + '.lessThan';\nvar FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL = exports.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL = FILTERS_CONDITIONS_NAMESPACE + '.lessThanOrEqualTo';\nvar FILTERS_CONDITIONS_BETWEEN = exports.FILTERS_CONDITIONS_BETWEEN = FILTERS_CONDITIONS_NAMESPACE + '.isBetween';\nvar FILTERS_CONDITIONS_NOT_BETWEEN = exports.FILTERS_CONDITIONS_NOT_BETWEEN = FILTERS_CONDITIONS_NAMESPACE + '.isNotBetween';\nvar FILTERS_CONDITIONS_AFTER = exports.FILTERS_CONDITIONS_AFTER = FILTERS_CONDITIONS_NAMESPACE + '.after';\nvar FILTERS_CONDITIONS_BEFORE = exports.FILTERS_CONDITIONS_BEFORE = FILTERS_CONDITIONS_NAMESPACE + '.before';\nvar FILTERS_CONDITIONS_TODAY = exports.FILTERS_CONDITIONS_TODAY = FILTERS_CONDITIONS_NAMESPACE + '.today';\nvar FILTERS_CONDITIONS_TOMORROW = exports.FILTERS_CONDITIONS_TOMORROW = FILTERS_CONDITIONS_NAMESPACE + '.tomorrow';\nvar FILTERS_CONDITIONS_YESTERDAY = exports.FILTERS_CONDITIONS_YESTERDAY = FILTERS_CONDITIONS_NAMESPACE + '.yesterday';\n\nvar FILTERS_DIVS_FILTER_BY_CONDITION = exports.FILTERS_DIVS_FILTER_BY_CONDITION = FILTERS_NAMESPACE + 'labels.filterByCondition';\nvar FILTERS_DIVS_FILTER_BY_VALUE = exports.FILTERS_DIVS_FILTER_BY_VALUE = FILTERS_NAMESPACE + 'labels.filterByValue';\n\nvar FILTERS_LABELS_CONJUNCTION = exports.FILTERS_LABELS_CONJUNCTION = FILTERS_NAMESPACE + 'labels.conjunction';\nvar FILTERS_LABELS_DISJUNCTION = exports.FILTERS_LABELS_DISJUNCTION = FILTERS_NAMESPACE + 'labels.disjunction';\n\nvar FILTERS_VALUES_BLANK_CELLS = exports.FILTERS_VALUES_BLANK_CELLS = FILTERS_NAMESPACE + 'values.blankCells';\n\nvar FILTERS_BUTTONS_SELECT_ALL = exports.FILTERS_BUTTONS_SELECT_ALL = FILTERS_NAMESPACE + 'buttons.selectAll';\nvar FILTERS_BUTTONS_CLEAR = exports.FILTERS_BUTTONS_CLEAR = FILTERS_NAMESPACE + 'buttons.clear';\nvar FILTERS_BUTTONS_OK = exports.FILTERS_BUTTONS_OK = FILTERS_NAMESPACE + 'buttons.ok';\nvar FILTERS_BUTTONS_CANCEL = exports.FILTERS_BUTTONS_CANCEL = FILTERS_NAMESPACE + 'buttons.cancel';\n\nvar FILTERS_BUTTONS_PLACEHOLDER_SEARCH = exports.FILTERS_BUTTONS_PLACEHOLDER_SEARCH = FILTERS_NAMESPACE + 'buttons.placeholder.search';\nvar FILTERS_BUTTONS_PLACEHOLDER_VALUE = exports.FILTERS_BUTTONS_PLACEHOLDER_VALUE = FILTERS_NAMESPACE + 'buttons.placeholder.value';\nvar FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE = exports.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE = FILTERS_NAMESPACE + 'buttons.placeholder.secondValue';\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getPluginName = exports.getRegistredPluginNames = exports.getPlugin = exports.registerPlugin = undefined;\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _object = __webpack_require__(2);\n\nvar _string = __webpack_require__(36);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar registeredPlugins = new WeakMap();\n\n/**\n * Registers plugin under given name\n *\n * @param {String} pluginName\n * @param {Function} PluginClass\n */\n/**\n * Utility to register plugins and common namespace for keeping reference to all plugins classes\n */\nfunction registerPlugin(pluginName, PluginClass) {\n  pluginName = (0, _string.toUpperCaseFirst)(pluginName);\n\n  _pluginHooks2.default.getSingleton().add('construct', function () {\n    var holder = void 0;\n\n    if (!registeredPlugins.has(this)) {\n      registeredPlugins.set(this, {});\n    }\n    holder = registeredPlugins.get(this);\n\n    if (!holder[pluginName]) {\n      holder[pluginName] = new PluginClass(this);\n    }\n  });\n  _pluginHooks2.default.getSingleton().add('afterDestroy', function () {\n    if (registeredPlugins.has(this)) {\n      var pluginsHolder = registeredPlugins.get(this);\n\n      (0, _object.objectEach)(pluginsHolder, function (plugin) {\n        return plugin.destroy();\n      });\n      registeredPlugins.delete(this);\n    }\n  });\n}\n\n/**\n * @param {Object} instance\n * @param {String|Function} pluginName\n * @returns {Function} pluginClass Returns plugin instance if exists or `undefined` if not exists.\n */\nfunction getPlugin(instance, pluginName) {\n  if (typeof pluginName != 'string') {\n    throw Error('Only strings can be passed as \"plugin\" parameter');\n  }\n  var _pluginName = (0, _string.toUpperCaseFirst)(pluginName);\n\n  if (!registeredPlugins.has(instance) || !registeredPlugins.get(instance)[_pluginName]) {\n    return void 0;\n  }\n\n  return registeredPlugins.get(instance)[_pluginName];\n}\n\n/**\n * Get all registred plugins names for concrete Handsontable instance.\n *\n * @param {Object} hotInstance\n * @returns {Array}\n */\nfunction getRegistredPluginNames(hotInstance) {\n  return registeredPlugins.has(hotInstance) ? Object.keys(registeredPlugins.get(hotInstance)) : [];\n}\n\n/**\n * Get plugin name.\n *\n * @param {Object} hotInstance\n * @param {Object} plugin\n * @returns {String|null}\n */\nfunction getPluginName(hotInstance, plugin) {\n  var pluginName = null;\n\n  if (registeredPlugins.has(hotInstance)) {\n    (0, _object.objectEach)(registeredPlugins.get(hotInstance), function (pluginInstance, name) {\n      if (pluginInstance === plugin) {\n        pluginName = name;\n      }\n    });\n  }\n\n  return pluginName;\n}\n\nexports.registerPlugin = registerPlugin;\nexports.getPlugin = getPlugin;\nexports.getRegistredPluginNames = getRegistredPluginNames;\nexports.getPluginName = getPluginName;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _recordTranslator = __webpack_require__(313);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar privatePool = new WeakMap();\nvar initializedPlugins = null;\n\n/**\n * @private\n */\n\nvar BasePlugin = function () {\n  /**\n   * @param {Object} hotInstance Handsontable instance.\n   */\n  function BasePlugin(hotInstance) {\n    var _this = this;\n\n    _classCallCheck(this, BasePlugin);\n\n    /**\n     * Handsontable instance.\n     *\n     * @type {Core}\n     */\n    (0, _object.defineGetter)(this, 'hot', hotInstance, {\n      writable: false\n    });\n    (0, _object.defineGetter)(this, 't', (0, _recordTranslator.getTranslator)(hotInstance), {\n      writable: false\n    });\n\n    privatePool.set(this, { hooks: {} });\n    initializedPlugins = null;\n\n    this.pluginName = null;\n    this.pluginsInitializedCallbacks = [];\n    this.isPluginsReady = false;\n    this.enabled = false;\n    this.initialized = false;\n\n    this.hot.addHook('afterPluginsInitialized', function () {\n      return _this.onAfterPluginsInitialized();\n    });\n    this.hot.addHook('afterUpdateSettings', function () {\n      return _this.onUpdateSettings();\n    });\n    this.hot.addHook('beforeInit', function () {\n      return _this.init();\n    });\n  }\n\n  _createClass(BasePlugin, [{\n    key: 'init',\n    value: function init() {\n      this.pluginName = (0, _plugins.getPluginName)(this.hot, this);\n\n      if (this.isEnabled && this.isEnabled()) {\n        this.enablePlugin();\n      }\n      if (!initializedPlugins) {\n        initializedPlugins = (0, _plugins.getRegistredPluginNames)(this.hot);\n      }\n      if (initializedPlugins.indexOf(this.pluginName) >= 0) {\n        initializedPlugins.splice(initializedPlugins.indexOf(this.pluginName), 1);\n      }\n      if (!initializedPlugins.length) {\n        this.hot.runHooks('afterPluginsInitialized');\n      }\n      this.initialized = true;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      this.enabled = true;\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      if (this.eventManager) {\n        this.eventManager.clear();\n      }\n      this.clearHooks();\n      this.enabled = false;\n    }\n\n    /**\n     * Add listener to plugin hooks system.\n     *\n     * @param {String} name\n     * @param {Function} callback\n     */\n\n  }, {\n    key: 'addHook',\n    value: function addHook(name, callback) {\n      privatePool.get(this).hooks[name] = privatePool.get(this).hooks[name] || [];\n\n      var hooks = privatePool.get(this).hooks[name];\n\n      this.hot.addHook(name, callback);\n      hooks.push(callback);\n      privatePool.get(this).hooks[name] = hooks;\n    }\n\n    /**\n     * Remove all hooks listeners by hook name.\n     *\n     * @param {String} name\n     */\n\n  }, {\n    key: 'removeHooks',\n    value: function removeHooks(name) {\n      var _this2 = this;\n\n      (0, _array.arrayEach)(privatePool.get(this).hooks[name] || [], function (callback) {\n        _this2.hot.removeHook(name, callback);\n      });\n    }\n\n    /**\n     * Clear all hooks.\n     */\n\n  }, {\n    key: 'clearHooks',\n    value: function clearHooks() {\n      var _this3 = this;\n\n      var hooks = privatePool.get(this).hooks;\n\n      (0, _object.objectEach)(hooks, function (callbacks, name) {\n        return _this3.removeHooks(name);\n      });\n      hooks.length = 0;\n    }\n\n    /**\n     * Register function which will be immediately called after all plugins initialized.\n     *\n     * @param {Function} callback\n     */\n\n  }, {\n    key: 'callOnPluginsReady',\n    value: function callOnPluginsReady(callback) {\n      if (this.isPluginsReady) {\n        callback();\n      } else {\n        this.pluginsInitializedCallbacks.push(callback);\n      }\n    }\n\n    /**\n     * On after plugins initialized listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterPluginsInitialized',\n    value: function onAfterPluginsInitialized() {\n      (0, _array.arrayEach)(this.pluginsInitializedCallbacks, function (callback) {\n        return callback();\n      });\n      this.pluginsInitializedCallbacks.length = 0;\n      this.isPluginsReady = true;\n    }\n\n    /**\n     * On update settings listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onUpdateSettings',\n    value: function onUpdateSettings() {\n      if (this.isEnabled) {\n        if (this.enabled && !this.isEnabled()) {\n          this.disablePlugin();\n        }\n        if (!this.enabled && this.isEnabled()) {\n          this.enablePlugin();\n        }\n        if (this.enabled && this.isEnabled()) {\n          this.updatePlugin();\n        }\n      }\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {}\n\n    /**\n     * Destroy plugin.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      var _this4 = this;\n\n      if (this.eventManager) {\n        this.eventManager.destroy();\n      }\n      this.clearHooks();\n\n      (0, _object.objectEach)(this, function (value, property) {\n        if (property !== 'hot' && property !== 't') {\n          _this4[property] = null;\n        }\n      });\n      delete this.t;\n      delete this.hot;\n    }\n  }]);\n\n  return BasePlugin;\n}();\n\nexports.default = BasePlugin;\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar store = __webpack_require__(77)('wks');\nvar uid = __webpack_require__(49);\nvar Symbol = __webpack_require__(14).Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n  return store[name] || (store[name] =\n    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.stopImmediatePropagation = stopImmediatePropagation;\nexports.isImmediatePropagationStopped = isImmediatePropagationStopped;\nexports.stopPropagation = stopPropagation;\nexports.pageX = pageX;\nexports.pageY = pageY;\nexports.isRightClick = isRightClick;\nexports.isLeftClick = isLeftClick;\n\nvar _element = __webpack_require__(0);\n\n/**\n * Prevent other listeners of the same event from being called.\n *\n * @param {Event} event\n */\nfunction stopImmediatePropagation(event) {\n  event.isImmediatePropagationEnabled = false;\n  event.cancelBubble = true;\n}\n\n/**\n * Check if event was stopped by `stopImmediatePropagation`.\n *\n * @param event {Event}\n * @returns {Boolean}\n */\nfunction isImmediatePropagationStopped(event) {\n  return event.isImmediatePropagationEnabled === false;\n}\n\n/**\n * Prevent further propagation of the current event (prevent bubbling).\n *\n * @param event {Event}\n */\nfunction stopPropagation(event) {\n  // ie8\n  // http://msdn.microsoft.com/en-us/library/ie/ff975462(v=vs.85).aspx\n  if (typeof event.stopPropagation === 'function') {\n    event.stopPropagation();\n  } else {\n    event.cancelBubble = true;\n  }\n}\n\n/**\n * Get horizontal coordinate of the event object relative to the whole document.\n *\n * @param {Event} event\n * @returns {Number}\n */\nfunction pageX(event) {\n  if (event.pageX) {\n    return event.pageX;\n  }\n\n  return event.clientX + (0, _element.getWindowScrollLeft)();\n}\n\n/**\n * Get vertical coordinate of the event object relative to the whole document.\n *\n * @param {Event} event\n * @returns {Number}\n */\nfunction pageY(event) {\n  if (event.pageY) {\n    return event.pageY;\n  }\n\n  return event.clientY + (0, _element.getWindowScrollTop)();\n}\n\n/**\n * Check if provided event was triggered by clicking the right mouse button.\n *\n * @param {Event} event DOM Event.\n * @returns {Boolean}\n */\nfunction isRightClick(event) {\n  return event.button === 2;\n}\n\n/**\n * Check if provided event was triggered by clicking the left mouse button.\n *\n * @param {Event} event DOM Event.\n * @returns {Boolean}\n */\nfunction isLeftClick(event) {\n  return event.button === 0;\n}\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getRegisteredRenderers = exports.getRegisteredRendererNames = exports.hasRenderer = exports.getRenderer = exports.registerRenderer = undefined;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _cellDecorator = __webpack_require__(364);\n\nvar _cellDecorator2 = _interopRequireDefault(_cellDecorator);\n\nvar _autocompleteRenderer = __webpack_require__(365);\n\nvar _autocompleteRenderer2 = _interopRequireDefault(_autocompleteRenderer);\n\nvar _checkboxRenderer = __webpack_require__(366);\n\nvar _checkboxRenderer2 = _interopRequireDefault(_checkboxRenderer);\n\nvar _htmlRenderer = __webpack_require__(367);\n\nvar _htmlRenderer2 = _interopRequireDefault(_htmlRenderer);\n\nvar _numericRenderer = __webpack_require__(368);\n\nvar _numericRenderer2 = _interopRequireDefault(_numericRenderer);\n\nvar _passwordRenderer = __webpack_require__(370);\n\nvar _passwordRenderer2 = _interopRequireDefault(_passwordRenderer);\n\nvar _textRenderer = __webpack_require__(371);\n\nvar _textRenderer2 = _interopRequireDefault(_textRenderer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _staticRegister = (0, _staticRegister3.default)('renderers'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem,\n    hasItem = _staticRegister.hasItem,\n    getNames = _staticRegister.getNames,\n    getValues = _staticRegister.getValues;\n\nregister('base', _cellDecorator2.default);\nregister('autocomplete', _autocompleteRenderer2.default);\nregister('checkbox', _checkboxRenderer2.default);\nregister('html', _htmlRenderer2.default);\nregister('numeric', _numericRenderer2.default);\nregister('password', _passwordRenderer2.default);\nregister('text', _textRenderer2.default);\n\n/**\n * Retrieve renderer function.\n *\n * @param {String} name Renderer identification.\n * @returns {Function} Returns renderer function.\n */\nfunction _getItem(name) {\n  if (typeof name === 'function') {\n    return name;\n  }\n  if (!hasItem(name)) {\n    throw Error('No registered renderer found under \"' + name + '\" name');\n  }\n\n  return getItem(name);\n}\n\nexports.registerRenderer = register;\nexports.getRenderer = _getItem;\nexports.hasRenderer = hasItem;\nexports.getRegisteredRendererNames = getNames;\nexports.getRegisteredRenderers = getValues;\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports) {\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self\n  // eslint-disable-next-line no-new-func\n  : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @description\n * Handsontable events are the common interface that function in 2 ways: as __callbacks__ and as __hooks__.\n *\n * @example\n *\n * ```js\n * // Using events as callbacks:\n * ...\n * var hot1 = new Handsontable(document.getElementById('example1'), {\n *   afterChange: function(changes, source) {\n *     $.ajax({\n *       url: \"save.php',\n *       data: change\n *     });\n *   }\n * });\n * ...\n * ```\n *\n * ```js\n * // Using events as plugin hooks:\n * ...\n * var hot1 = new Handsontable(document.getElementById('example1'), {\n *   myPlugin: true\n * });\n *\n * var hot2 = new Handsontable(document.getElementById('example2'), {\n *   myPlugin: false\n * });\n *\n * // global hook\n * Handsontable.hooks.add('afterChange', function() {\n *   // Fired twice - for hot1 and hot2\n *   if (this.getSettings().myPlugin) {\n *     // function body - will only run for hot1\n *   }\n * });\n *\n * // local hook (has same effect as a callback)\n * hot2.addHook('afterChange', function() {\n *   // function body - will only run in #example2\n * });\n * ```\n * ...\n */\n\n// @TODO: Move plugin description hooks to plugin?\nvar REGISTERED_HOOKS = [\n/**\n * Callback fired after resetting a cell's meta.\n *\n * @event Hooks#afterCellMetaReset\n * @since 0.11\n */\n'afterCellMetaReset',\n\n/**\n * @description\n * Callback fired after one or more cells has been changed. Its main use case is to save the input.\n *\n * __Note:__ For performance reasons, the `changes` array is null for `\"loadData\"` source.\n *\n * @event Hooks#afterChange\n * @param {Array} changes 2D array containing information about each of the edited cells `[[row, prop, oldVal, newVal], ...]`.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterChange',\n\n/**\n * @description\n * Fired after observing changes.\n *\n * @event Hooks#afterChangesObserved\n */\n'afterChangesObserved',\n\n/**\n * @description\n * Fired after setting up the Context Menu's default options. These options are a collection which user can select by setting\n * an array of keys or an array of objects in `contextMenu` option.\n *\n * @event Hooks#afterContextMenuDefaultOptions\n * @param {Array} predefinedItems Array of objects containing information about the pre-defined Context Menu items.\n */\n'afterContextMenuDefaultOptions',\n\n/**\n * @description\n * Fired before setting up the Context Menu's items but after filtering these options by user (`contextMenu` option). This hook\n * can by helpful to determine if user use specified menu item or to set up one of the menu item to by always visible.\n *\n * @event Hooks#beforeContextMenuSetItems\n * @param {Array} menuItems Array of objects containing information about to generated Context Menu items.\n */\n'beforeContextMenuSetItems',\n\n/**\n * @description\n * Fired after setting up the Context Menu's default options. These options are a collection which user can select by setting\n * an array of keys or an array of objects in `contextMenu` option.\n *\n * @pro\n * @event Hooks#afterDropdownMenuDefaultOptions\n * @param {Array} predefinedItems Array of objects containing information about the pre-defined Context Menu items.\n */\n'afterDropdownMenuDefaultOptions',\n\n/**\n * @description\n * Fired before setting up the Dropdown Menu's items but after filtering these options by user (`dropdownMenu` option). This hook\n * can by helpful to determine if user use specified menu item or to set up one of the menu item to by always visible.\n *\n * @pro\n * @event Hooks#beforeDropdownMenuSetItems\n * @param {Array} menuItems Array of objects containing information about to generated Dropdown Menu items.\n */\n'beforeDropdownMenuSetItems',\n\n/**\n * @description\n * Fired after hiding the Context Menu.\n *\n * @event Hooks#afterContextMenuHide\n * @param {Object} context The Context menu instance.\n */\n'afterContextMenuHide',\n\n/**\n * @description\n * Fired before opening the Context Menu.\n *\n * @event Hooks#beforeContextMenuShow\n * @param {Object} context The Context Menu instance.\n */\n'beforeContextMenuShow',\n\n/**\n * @description\n * Fired after opening the Context Menu.\n *\n * @event Hooks#afterContextMenuShow\n * @param {Object} context The Context Menu instance.\n */\n'afterContextMenuShow',\n\n/**\n * @description\n * Fired after reaching the copy limit while copying data.\n *\n * @event Hooks#afterCopyLimit\n * @param {Number} selectedRows Count of selected copyable rows.\n * @param {Number} selectedColumns Count of selected copyable columns.\n * @param {Number} copyRowsLimit Current copy rows limit.\n * @param {Number} copyColumnsLimit Current copy columns limit.\n */\n'afterCopyLimit',\n\n/**\n * Callback is fired before a new column was created.\n *\n * @since 0.28.0\n * @event Hooks#beforeCreateCol\n * @param {Number} index Represents the visual index of first newly created column in the data source array.\n * @param {Number} amount Number of newly created columns in the data source array.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'beforeCreateCol',\n\n/**\n * Callback is fired after a new column was created.\n *\n * @event Hooks#afterCreateCol\n * @param {Number} index Represents the visual index of first newly created column in the data source array.\n * @param {Number} amount Number of newly created columns in the data source array.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterCreateCol',\n\n/**\n * Callback is fired before a new row was created.\n *\n * @since 0.28.0\n * @event Hooks#beforeCreateRow\n * @param {Number} index Represents the visual index of first newly created row in the data source array.\n * @param {Number} amount Number of newly created rows in the data source array.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'beforeCreateRow',\n\n/**\n * Callback is fired after a new row was created.\n *\n * @event Hooks#afterCreateRow\n * @param {Number} index Represents the visual index of first newly created row in the data source array.\n * @param {Number} amount Number of newly created rows in the data source array.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterCreateRow',\n\n/**\n * Fired after the current cell is deselected.\n *\n * @event Hooks#afterDeselect\n */\n'afterDeselect',\n\n/**\n * Fired after destroying the Handsontable instance.\n *\n * @event Hooks#afterDestroy\n */\n'afterDestroy',\n\n/**\n * Fired on a `keydown` event on the document body.\n *\n * @event Hooks#afterDocumentKeyDown\n * @param {Event} event A `keydown` event.\n */\n'afterDocumentKeyDown',\n\n/**\n * Fired inside the Walkontable's selection `draw` method. Can be used to add additional class names to cells, depending on the current selection.\n *\n * @event Hooks#afterDrawSelection\n * @param {Number} currentRow Row index of the currently processed cell.\n * @param {Number} currentColumn Column index of the currently cell.\n * @param {Array} cornersOfSelection Array of the current selection in a form of `[startRow, startColumn, endRow, endColumn]`.\n * @param {Number|undefined} layerLevel Number indicating which layer of selection is currently processed.\n * @since 0.38.1\n * @returns {String|undefined} Can return a `String`, which will act as an additional `className` to be added to the currently processed cell.\n */\n'afterDrawSelection',\n/**\n * Fired inside the Walkontable's `refreshSelections` method. Can be used to remove additional class names from all cells in the table.\n *\n * @event Hooks#beforeRemoveCellClassNames\n * @since 0.38.1\n * @returns {String[]|undefined} Can return an `Array` of `String`s. Each of these strings will act like class names to be removed from all the cells in the table.\n */\n'beforeRemoveCellClassNames',\n/**\n * Callback fired after getting the cell settings.\n *\n * @event Hooks#afterGetCellMeta\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {Object} cellProperties Object containing the cell properties.\n */\n'afterGetCellMeta',\n\n/**\n * Callback fired after retrieving information about a column header and appending it to the table header.\n *\n * @event Hooks#afterGetColHeader\n * @param {Number} col Visual column index.\n * @param {Element} TH Header's TH element.\n */\n'afterGetColHeader',\n\n/**\n * Callback fired after retrieving information about a column header and appending it to the table header.\n *\n * @event Hooks#afterGetRowHeader\n * @param {Number} row Visual row index.\n * @param {Element} TH Header's TH element.\n */\n'afterGetRowHeader',\n\n/**\n * Callback fired after Handsontable instance is initiated.\n *\n * @event Hooks#afterInit\n */\n'afterInit',\n\n/**\n * Callback fired after new data is loaded (by `loadData` method) into the data source array.\n *\n * @event Hooks#afterLoadData\n * @param {Boolean} firstTime flag that determines whether the data has been loaded during the initialization.\n */\n'afterLoadData',\n\n/**\n * Fired after a scroll event, which is identified as a momentum scroll (e.g. on an iPad).\n *\n * @event Hooks#afterMomentumScroll\n */\n'afterMomentumScroll',\n\n/**\n * Fired after a `mousedown` event is triggered on the cell corner (the drag handle).\n *\n * @event Hooks#afterOnCellCornerMouseDown\n * @since 0.11\n * @param {Object} event `mousedown` event object.\n */\n'afterOnCellCornerMouseDown',\n\n/**\n * Fired after a `dblclick` event is triggered on the cell corner (the drag handle).\n *\n * @event Hooks#afterOnCellCornerDblClick\n * @since 0.30.0\n * @param {Object} event `dblclick` event object.\n */\n'afterOnCellCornerDblClick',\n\n/**\n * Callback fired after clicking on a cell or row/column header.\n * In case the row/column header was clicked, the index is negative.\n * For example clicking on the row header of cell (0, 0) results with `afterOnCellMouseDown` called\n * with coords `{row: 0, col: -1}`.\n *\n * @event Hooks#afterOnCellMouseDown\n * @since 0.11\n * @param {Object} event `mousedown` event object.\n * @param {Object} coords Coordinates object containing the visual row and visual column indexes of the clicked cell.\n * @param {Element} TD Cell's TD (or TH) element.\n */\n'afterOnCellMouseDown',\n\n/**\n * Callback fired after hovering a cell or row/column header with the mouse cursor.\n * In case the row/column header was hovered, the index is negative.\n * For example, hovering over the row header of cell (0, 0) results with `afterOnCellMouseOver` called\n * with coords `{row: 0, col: -1}`.\n *\n * @event Hooks#afterOnCellMouseOver\n * @since 0.11\n * @param {Object} event `mouseover` event object.\n * @param {Object} coords Hovered cell's visual coordinate object.\n * @param {Element} TD Cell's TD (or TH) element.\n */\n'afterOnCellMouseOver',\n\n/**\n * Callback fired after leaving a cell or row/column header with the mouse cursor.\n *\n * @event Hooks#afterOnCellMouseOut\n * @since 0.31.1\n * @param {Object} event `mouseout` event object.\n * @param {Object} coords Leaved cell's visual coordinate object.\n * @param {Element} TD Cell's TD (or TH) element.\n */\n'afterOnCellMouseOut',\n\n/**\n * Callback is fired when one or more columns are removed.\n *\n * @event Hooks#afterRemoveCol\n * @param {Number} index Is an visual index of starter column.\n * @param {Number} amount Is an amount of removed columns.\n */\n'afterRemoveCol',\n\n/**\n * Callback is fired when one or more rows are removed.\n *\n * @event Hooks#afterRemoveRow\n * @param {Number} index Is an visual index of starter row.\n * @param {Number} amount Is an amount of removed rows.\n */\n'afterRemoveRow',\n\n/**\n * Callback fired after the Handsontable table is rendered.\n *\n * @event Hooks#afterRender\n * @param {Boolean} isForced Is `true` if rendering was triggered by a change of settings or data; or `false` if\n *                           rendering was triggered by scrolling or moving selection.\n */\n'afterRender',\n\n/**\n * Fired before starting rendering the cell.\n *\n * @event Hooks#beforeRenderer\n * @since 0.24.2\n * @param {Element} TD Currently rendered cell's TD element.\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String|Number} prop Column property name or a column index, if datasource is an array of arrays.\n * @param {String} value Value of the rendered cell.\n * @param {Object} cellProperties Object containing the cell's properties.\n */\n'beforeRenderer',\n\n/**\n * Fired after finishing rendering the cell (after the renderer finishes).\n *\n * @event Hooks#afterRenderer\n * @since 0.11.0\n * @param {Element} TD Currently rendered cell's TD element.\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String|Number} prop Column property name or a column index, if datasource is an array of arrays.\n * @param {String} value Value of the rendered cell.\n * @param {Object} cellProperties Object containing the cell's properties.\n */\n'afterRenderer',\n\n/**\n * Fired after the horizontal scroll event.\n *\n * @event Hooks#afterScrollHorizontally\n * @since 0.11\n */\n'afterScrollHorizontally',\n\n/**\n * Fired after the vertical scroll event.\n *\n * @event Hooks#afterScrollVertically\n * @since 0.11\n */\n'afterScrollVertically',\n\n/**\n * Callback fired after one or more cells are selected (e.g. during mouse move).\n *\n * @event Hooks#afterSelection\n * @param {Number} r Selection start visual row index.\n * @param {Number} c Selection start visual column index.\n * @param {Number} r2 Selection end visual row index.\n * @param {Number} c2 Selection end visual column index.\n * @param {Object} preventScrolling Object with `value` property where its value change will be observed.\n * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n * @example\n * ```js\n * handsontable({\n *   afterSelection: function (r, c, r2, c2, preventScrolling, selectionLayerLevel) {\n *     // setting if prevent scrolling after selection\n *     preventScrolling.value = true;\n *   }\n * })\n * ```\n */\n'afterSelection',\n\n/**\n * Callback fired after one or more cells are selected. The `p` argument represents the source object property name instead of the column number.\n *\n * @event Hooks#afterSelectionByProp\n * @param {Number} r Selection start visual row index.\n * @param {String} p Selection start data source object property name.\n * @param {Number} r2 Selection end visual row index.\n * @param {String} p2 Selection end data source object property name.\n * @param {Object} preventScrolling Object with `value` property where its value change will be observed.\n * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n * @example\n * ```js\n * handsontable({\n *   afterSelectionByProp: function (r, c, r2, c2, preventScrolling, selectionLayerLevel) {\n *     // setting if prevent scrolling after selection\n *     preventScrolling.value = true;\n *   }\n * })\n * ```\n */\n'afterSelectionByProp',\n\n/**\n * Callback fired after one or more cells are selected (e.g. on mouse up).\n *\n * @event Hooks#afterSelectionEnd\n * @param {Number} r Selection start visual row index.\n * @param {Number} c Selection start visual column index.\n * @param {Number} r2 Selection end visual row index.\n * @param {Number} c2 Selection end visual column index.\n * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n */\n'afterSelectionEnd',\n\n/**\n * Callback fired after one or more cells are selected (e.g. on mouse up). The `p` argument represents the data source object\n * property name instead of the column number.\n *\n * @event Hooks#afterSelectionEndByProp\n * @param {Number} r Selection start visual row index.\n * @param {String} p Selection start data source object property index.\n * @param {Number} r2 Selection end visual row index.\n * @param {String} p2 Selection end data source object property index.\n * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n */\n'afterSelectionEndByProp',\n\n/**\n * Called after cell meta is changed.\n *\n * @event Hooks#afterSetCellMeta\n * @since 0.11.0\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String} key The updated meta key.\n * @param {*} value The updated meta value.\n */\n'afterSetCellMeta',\n\n/**\n * Called after cell meta is removed.\n *\n * @event Hooks#afterRemoveCellMeta\n * @since 0.33.1\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String} key The removed meta key.\n * @param {*} value Value which was under removed key of cell meta.\n */\n'afterRemoveCellMeta',\n\n/**\n * Called after cell data was changed.\n *\n * @event Hooks#afterSetDataAtCell\n * @since 0.28.0\n * @param {Array} changes An array of changes in format `[[row, col, oldValue, value], ...]`.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterSetDataAtCell',\n\n/**\n * Called after cell data was changed.\n *\n * @event Hooks#afterSetDataAtRowProp\n * @since 0.28.0\n * @param {Array} changes An array of changes in format `[[row, prop, oldValue, value], ...]`.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterSetDataAtRowProp',\n\n/**\n * Fired after calling the `updateSettings` method.\n *\n * @event Hooks#afterUpdateSettings\n * @param {Object} settings New settings object.\n */\n'afterUpdateSettings',\n\n/**\n * @description\n * A plugin hook executed after validator function, only if validator function is defined.\n * Validation result is the first parameter. This can be used to determinate if validation passed successfully or not.\n *\n * __Returning false from the callback will mark the cell as invalid.__\n *\n * @event Hooks#afterValidate\n * @since 0.9.5\n * @param {Boolean} isValid `true` if valid, `false` if not.\n * @param {*} value The value in question.\n * @param {Number} row Row index.\n * @param {String|Number} prop Property name / column index.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterValidate',\n\n/**\n * Fired before successful change of language (when proper language code was set)\n *\n * @event Hooks#beforeLanguageChange\n * @since 0.35.0\n * @param {String} languageCode New language code.\n */\n'beforeLanguageChange',\n\n/**\n * Fired after successful change of language (when proper language code was set)\n *\n * @event Hooks#afterLanguageChange\n * @since 0.35.0\n * @param {String} languageCode New language code.\n */\n'afterLanguageChange',\n\n/**\n * Fired before populating the data in the autofill feature.\n *\n * @event Hooks#beforeAutofill\n * @param {Object} start Object containing information about first filled cell: `{row: 2, col: 0}`.\n * @param {Object} end Object containing information about last filled cell: `{row: 4, col: 1}`.\n * @param {Array} data 2D array containing information about fill pattern: `[[\"1\", \"Ted\"], [\"1\", \"John\"]]`.\n * @param {Array} baseRange The coordinates of the base area for autofill.\n */\n'beforeAutofill',\n\n/**\n * Fired before aligning the cell contents.\n *\n * @event Hooks#beforeCellAlignment\n * @param stateBefore\n * @param range\n * @param {String} type Type of the alignment - either `horizontal` or `vertical`\n * @param {String} alignmentClass String defining the alignment class added to the cell.\n * Possible values:\n * * `htLeft`,\n * * `htCenter`,\n * * `htRight`,\n * * `htJustify`\n * for horizontal alignment,\n *\n *\n * * `htTop`,\n * * `htMiddle`,\n * * `htBottom`\n * for vertical alignment.\n */\n'beforeCellAlignment',\n\n/**\n * Callback fired before one or more cells is changed. Its main purpose is to alter changes silently before input.\n *\n * @event Hooks#beforeChange\n * @param {Array} changes 2D array containing information about each of the edited cells.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n * @example\n * ```js\n * // To disregard a single change, set changes[i] to null or remove it from array using changes.splice(i, 1).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeChange: function(changes, source) {\n *     // [[row, prop, oldVal, newVal], ...]\n *     changes[0] = null;\n *   }\n * });\n * ...\n *\n * // To alter a single change, overwrite the desired value to changes[i][3].\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeChange: function(changes, source) {\n *     // [[row, prop, oldVal, newVal], ...]\n *     changes[0][3] = 10;\n *   }\n * });\n * ...\n *\n * // To cancel all edit, return false from the callback or set array length to 0 (changes.length = 0).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeChange: function(changes, source) {\n *     // [[row, prop, oldVal, newVal], ...]\n *     return false;\n *   }\n * });\n * ...\n * ```\n */\n'beforeChange',\n\n/**\n * Fired right before rendering the changes.\n *\n * @event Hooks#beforeChangeRender\n * @since 0.11\n * @param {Array} changes Array in form of [row, prop, oldValue, newValue].\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'beforeChangeRender',\n\n/**\n * Fired before drawing the borders.\n *\n * @event Hooks#beforeDrawBorders\n * @param {Array} corners Array specifying the current selection borders.\n * @param {String} borderClassName Specifies the border class name.\n */\n'beforeDrawBorders',\n\n/**\n * Callback fired before getting cell settings.\n *\n * @event Hooks#beforeGetCellMeta\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {Object} cellProperties Object containing the cell's properties.\n */\n'beforeGetCellMeta',\n\n/**\n * Called before cell meta is removed.\n *\n * @event Hooks#beforeRemoveCellMeta\n * @since 0.33.1\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String} key The removed meta key.\n * @param {*} value Value which is under removed key of cell meta.\n */\n'beforeRemoveCellMeta',\n\n/**\n * @description\n * Callback fired before Handsontable instance is initiated.\n *\n * @event Hooks#beforeInit\n */\n'beforeInit',\n\n/**\n * Callback fired before Walkontable instance is initiated.\n *\n * @since 0.11\n * @event Hooks#beforeInitWalkontable\n * @param {Object} walkontableConfig Walkontable configuration object.\n */\n'beforeInitWalkontable',\n\n/**\n * Callback fired before keydown event is handled. It can be used to overwrite default key bindings.\n * Caution - in your `beforeKeyDown` handler you need to call `event.stopImmediatePropagation()` to prevent default key behavior.\n *\n * @event Hooks#beforeKeyDown\n * @since 0.9.0\n * @param {Event} event Original DOM event.\n */\n'beforeKeyDown',\n\n/**\n * Fired after the user clicked a cell, but before all the calculations related with it.\n *\n * @event Hooks#beforeOnCellMouseDown\n * @param {Event} event The `mousedown` event object.\n * @param {CellCoords} coords Cell coords object containing the visual coordinates of the clicked cell.\n * @param {Element} TD TD element.\n */\n'beforeOnCellMouseDown',\n\n/**\n * Fired after the user moved cursor over a cell, but before all the calculations related with it.\n *\n * @event Hooks#beforeOnCellMouseOver\n * @param {Event} event The `mouseover` event object.\n * @param {CellCoords} coords CellCoords object containing the visual coordinates of the clicked cell.\n * @param {Element} TD TD element.\n * @param {Object} blockCalculations Contain keys 'row' and 'column' with boolean value.\n */\n'beforeOnCellMouseOver',\n\n/**\n * Fired after the user moved cursor out from a cell, but before all the calculations related with it.\n *\n * @event Hooks#beforeOnCellMouseOut\n * @since 0.31.1\n * @param {Event} event The `mouseout` event object.\n * @param {WalkontableCellCoords} coords WalkontableCellCoords object containing the visual coordinates of the leaved cell.\n * @param {Element} TD TD element.\n */\n'beforeOnCellMouseOut',\n\n/**\n * Callback is fired when one or more columns are about to be removed.\n *\n * @event Hooks#beforeRemoveCol\n * @param {Number} index Visual index of starter column.\n * @param {Number} amount Amount of columns to be removed.\n * @param {Array} [visualCols] Consists of visual indexes of processed columns.\n */\n'beforeRemoveCol',\n\n/**\n * Callback is fired when one or more rows are about to be removed.\n *\n * @event Hooks#beforeRemoveRow\n * @param {Number} index Visual index of starter column.\n * @param {Number} amount Amount of columns to be removed.\n * @param {Array} [visualRows] Consists of visual indexes of processed rows.\n */\n'beforeRemoveRow',\n\n/**\n * Callback fired before Handsontable table is rendered.\n *\n * @event Hooks#beforeRender\n * @param {Boolean} isForced If `true` rendering was triggered by a change of settings or data; or `false` if\n *                           rendering was triggered by scrolling or moving selection.\n */\n'beforeRender',\n\n/**\n * Callback fired before setting range is started but not finished yet.\n *\n * @event Hooks#beforeSetRangeStartOnly\n * @param {CellCoords} coords CellCoords instance.\n */\n'beforeSetRangeStartOnly',\n\n/**\n * Callback fired before setting range is started.\n *\n * @event Hooks#beforeSetRangeStart\n * @param {CellCoords} coords CellCoords instance.\n */\n'beforeSetRangeStart',\n\n/**\n * Callback fired before setting range is ended.\n *\n * @event Hooks#beforeSetRangeEnd\n * @param {CellCoords} coords CellCoords instance.\n */\n'beforeSetRangeEnd',\n\n/**\n * Fired before the logic of handling a touch scroll, when user started scrolling on a touch-enabled device.\n *\n * @event Hooks#beforeTouchScroll\n */\n'beforeTouchScroll',\n\n/**\n * @description\n * A plugin hook executed before validator function, only if validator function is defined.\n * This can be used to manipulate the value of changed cell before it is applied to the validator function.\n *\n * __Notice:__ this will not affect values of changes. This will change value ONLY for validation!\n *\n * @event Hooks#beforeValidate\n * @since 0.9.5\n * @param {*} value Value of the cell.\n * @param {Number} row Row index.\n * @param {String|Number} prop Property name / column index.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'beforeValidate',\n\n/**\n * Callback fired before cell value is rendered into the DOM (through renderer function).\n *\n * @event Hooks#beforeValueRender\n * @since 0.29.0\n * @param {*} value Cell value to render.\n */\n'beforeValueRender',\n\n/**\n * Callback fired after Handsontable instance is constructed (via `new` operator).\n *\n * @event Hooks#construct\n * @since 0.16.1\n */\n'construct',\n\n/**\n * Callback fired after Handsontable instance is initiated but before table is rendered.\n *\n * @event Hooks#init\n * @since 0.16.1\n */\n'init',\n\n/**\n * Fired when a column index is about to be modified by a callback function.\n *\n * @event Hooks#modifyCol\n * @since 0.11\n * @param {Number} col Visual column index.\n */\n'modifyCol',\n\n/**\n * Fired when a column index is about to be de-modified by a callback function.\n *\n * @event Hooks#unmodifyCol\n * @since 0.23.0\n * @param {Number} col Physical column index.\n */\n'unmodifyCol',\n\n/**\n * Fired when a physical row index is about to be de-modified by a callback function.\n *\n * @event Hooks#unmodifyRow\n * @since 0.26.2\n * @param {Number} row Physical row index.\n */\n'unmodifyRow',\n/**\n * Fired when a column header index is about to be modified by a callback function.\n *\n * @event Hooks#modifyColHeader\n * @since 0.20.0\n * @param {Number} column Visual column header index.\n */\n'modifyColHeader',\n\n/**\n * Fired when a column width is about to be modified by a callback function.\n *\n * @event Hooks#modifyColWidth\n * @since 0.11\n * @param {Number} width Current column width.\n * @param {Number} col Column index.\n */\n'modifyColWidth',\n\n/**\n * Fired when a row index is about to be modified by a callback function.\n *\n * @event Hooks#modifyRow\n * @since 0.11\n * @param {Number} row Row index.\n */\n'modifyRow',\n\n/**\n * Fired when a row header index is about to be modified by a callback function.\n *\n * @event Hooks#modifyRowHeader\n * @since 0.20.0\n * @param {Number} row Row header index.\n */\n'modifyRowHeader',\n\n/**\n * Fired when a row height is about to be modified by a callback function.\n *\n * @event Hooks#modifyRowHeight\n * @since 0.11.0\n * @param {Number} height Row height.\n * @param {Number} row Row index.\n */\n'modifyRowHeight',\n\n/**\n * Fired when a data was retrieved or modified.\n *\n * @event Hooks#modifyData\n * @since 0.28.0\n * @param {Number} row Row height.\n * @param {Number} column Column index.\n * @param {Object} valueHolder Object which contains original value which can be modified by overwriting `.value` property.\n * @param {String} ioMode String which indicates for what operation hook is fired (`get` or `set`).\n */\n'modifyData',\n\n/**\n * Fired when a data was retrieved or modified.\n *\n * @event Hooks#modifyRowData\n * @since 0.28.0\n * @param {Number} row Physical row index.\n */\n'modifyRowData',\n\n/**\n * Used to modify the cell coordinates when using the `getCell` method.\n *\n * @event Hooks#modifyGetCellCoords\n * @since 0.36.0\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {Boolean} topmost If set to true, it returns the TD element from the topmost overlay. For example,\n * if the wanted cell is in the range of fixed rows, it will return a TD element from the `top` overlay.\n */\n'modifyGetCellCoords',\n\n/**\n * Fired after loading data using the Persistent State plugin.\n *\n * @event Hooks#persistentStateLoad\n * @param {String} key Key string.\n * @param {Object} valuePlaceholder Object containing the loaded data.\n */\n'persistentStateLoad',\n\n/**\n * Fired after resetting data using the Persistent State plugin.\n *\n * @event Hooks#persistentStateReset\n * @param {String} key Key string.\n */\n'persistentStateReset',\n\n/**\n * Fired after resetting data using the Persistent State plugin.\n *\n * @event Hooks#persistentStateSave\n * @param {String} key Key string.\n * @param {Mixed} value Value to save.\n */\n'persistentStateSave',\n\n/**\n * Fired before sorting the column. If you return `false` value then sorting will be not applied by\n * Handsontable (useful for server-side sorting).\n *\n * @event Hooks#beforeColumnSort\n * @param {Number} column Sorted visual column index.\n * @param {Boolean} order Soring order where:\n *  * `true` means ascending order,\n *  * `false` means descending order,\n *  * `undefined` means original order.\n */\n'beforeColumnSort',\n\n/**\n * Fired after sorting the column.\n *\n * @event Hooks#afterColumnSort\n * @param {Number} column Sorted visual column index.\n * @param {Boolean} order Soring order where:\n *  * `true` means ascending order\n *  * `false` means descending order\n *  * `undefined` means original order\n */\n'afterColumnSort',\n\n/**\n * @description\n * Fired after setting range of autofill.\n * Both arguments are provided in the following format:\n * ```js\n * [startRow, startColumn, endRow, endColumn]\n * ```\n *\n * @event Hooks#modifyAutofillRange\n * @param {Array} startArea Array of visual coordinates of the starting point for the drag-down operation.\n * @param {Array} entireArea Array of visual coordinates of the entire area of the drag-down operation.\n */\n'modifyAutofillRange',\n\n/**\n * Fired to allow modifying the copyable range with a callback function.\n *\n * @since 0.19.0\n * @event Hooks#modifyCopyableRange\n * @param {Array} copyableRanges Array of objects defining copyable cells.\n */\n'modifyCopyableRange',\n\n/**\n * Called before copying the values into clipboard and before clearing values of the selected cells.\n *\n * @event Hooks#beforeCut\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains data to cut.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       which will be cut out.\n * @returns {*} If returns `false` then operation of the cutting out is cancelled.\n *\n * @example\n * ```js\n * // To disregard a single row, remove it from array using data.splice(i, 1).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeCut: function(data, coords) {\n *     // data -> [[1, 2, 3], [4, 5, 6]]\n *     data.splice(0, 1);\n *     // data -> [[4, 5, 6]]\n *     // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n *   }\n * });\n * ...\n *\n * // To cancel cutting out, return false from the callback.\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeCut: function(data, coords) {\n *     return false;\n *   }\n * });\n * ...\n * ```\n */\n'beforeCut',\n\n/**\n * Fired after data are cutted out from the table.\n *\n * @event Hooks#afterCut\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains the cutted out data.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       which was cut out.\n */\n'afterCut',\n\n/**\n * Fired before values are copied into clipboard.\n *\n * @event Hooks#beforeCopy\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains data to copied.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       which will copied.\n * @returns {*} If returns `false` then copying is cancelled.\n *\n * @example\n * ```js\n * // To disregard a single row, remove it from array using data.splice(i, 1).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeCopy: function(data, coords) {\n *     // data -> [[1, 2, 3], [4, 5, 6]]\n *     data.splice(0, 1);\n *     // data -> [[4, 5, 6]]\n *     // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n *   }\n * });\n * ...\n *\n * // To cancel copying, return false from the callback.\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeCopy: function(data, coords) {\n *     return false;\n *   }\n * });\n * ...\n * ```\n */\n'beforeCopy',\n\n/**\n * Fired after data are pasted into table.\n *\n * @event Hooks#afterCopy\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains the copied data.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       which was copied.\n */\n'afterCopy',\n\n/**\n * Fired before values are pasted into table.\n *\n * @event Hooks#beforePaste\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains data to paste.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       that correspond to the previously selected area.\n * @returns {*} If returns `false` then pasting is cancelled.\n *\n * @example\n * ```js\n * // To disregard a single row, remove it from array using data.splice(i, 1).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforePaste: function(data, coords) {\n *     // data -> [[1, 2, 3], [4, 5, 6]]\n *     data.splice(0, 1);\n *     // data -> [[4, 5, 6]]\n *     // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n *   }\n * });\n * ...\n *\n * // To cancel pasting, return false from the callback.\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforePaste: function(data, coords) {\n *     return false;\n *   }\n * });\n * ...\n * ```\n */\n'beforePaste',\n\n/**\n * Fired after values are pasted into table.\n *\n * @event Hooks#afterPaste\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains the pasted data.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       that correspond to the previously selected area.\n */\n'afterPaste',\n\n/**\n * Fired before change order of the visual indexes.\n *\n * @event Hooks#beforeColumnMove\n * @param {Array} columns Array of visual column indexes to be moved.\n * @param {Number} target Visual column index being a target for moved columns.\n */\n'beforeColumnMove',\n\n/**\n * Fired after change order of the visual indexes.\n *\n * @event Hooks#afterColumnMove\n * @param {Array} columns Array of visual column indexes that were moved.\n * @param {Number} target Visual column index being a target for moved columns.\n */\n'afterColumnMove',\n\n/**\n * Fired before change order of the visual indexes.\n *\n * @event Hooks#beforeRowMove\n * @param {Array} rows Array of visual row indexes to be moved.\n * @param {Number} target Visual row index being a target for moved rows.\n */\n'beforeRowMove',\n\n/**\n * Fired after change order of the visual indexes.\n *\n * @event Hooks#afterRowMove\n * @param {Array} rows Array of visual row indexes that were moved.\n * @param {Number} target Visual row index being a target for moved rows.\n */\n'afterRowMove',\n\n/**\n * Fired before rendering the table with modified column sizes.\n *\n * @event Hooks#beforeColumnResize\n * @param {Number} currentColumn Visual index of the resized column.\n * @param {Number} newSize Calculated new column width.\n * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n * @returns {Number} Returns a new column size or `undefined`, if column size should be calculated automatically.\n */\n'beforeColumnResize',\n\n/**\n * Fired after rendering the table with modified column sizes.\n *\n * @event Hooks#afterColumnResize\n * @param {Number} currentColumn Visual index of the resized column.\n * @param {Number} newSize Calculated new column width.\n * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n */\n'afterColumnResize',\n\n/**\n * Fired before rendering the table with modified row sizes.\n *\n * @event Hooks#beforeRowResize\n * @param {Number} currentRow Visual index of the resized row.\n * @param {Number} newSize Calculated new row height.\n * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n * @returns {Number} Returns the new row size or `undefined` if row size should be calculated automatically.\n */\n'beforeRowResize',\n\n/**\n * Fired after rendering the table with modified row sizes.\n *\n * @event Hooks#afterRowResize\n * @param {Number} currentRow Visual index of the resized row.\n * @param {Number} newSize Calculated new row height.\n * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n */\n'afterRowResize',\n\n/**\n * Fired after getting the column header renderers.\n *\n * @event Hooks#afterGetColumnHeaderRenderers\n * @param {Array} array Array of the column header renderers.\n */\n'afterGetColumnHeaderRenderers',\n\n/**\n * Fired after getting the row header renderers.\n *\n * @event Hooks#afterGetRowHeaderRenderers\n * @param {Array} array Array of the row header renderers.\n */\n'afterGetRowHeaderRenderers',\n\n/**\n * Fired before applying stretched column width to column.\n *\n * @event Hooks#beforeStretchingColumnWidth\n * @param {Number} stretchedWidth Calculated width.\n * @param {Number} column Visual column index.\n * @returns {Number} Returns new width which will be applied to the column element.\n */\n'beforeStretchingColumnWidth',\n\n/**\n * Fired before applying [filtering]{@link http://docs.handsontable.com/pro/demo-filtering.html}.\n *\n * @pro\n * @event Hooks#beforeFilter\n * @param {Array} conditionsStack An array of objects with added formulas.\n * @returns {Boolean} If hook returns `false` value then filtering won't be applied on the UI side (server-side filtering).\n */\n'beforeFilter',\n\n/**\n * Fired after applying [filtering]{@link http://docs.handsontable.com/pro/demo-filtering.html}.\n *\n * @pro\n * @event Hooks#afterFilter\n * @param {Array} conditionsStack An array of objects with added formulas.\n */\n'afterFilter',\n\n/**\n * Used to modify the column header height.\n *\n * @event Hooks#modifyColumnHeaderHeight\n * @since 0.25.0\n * @param {Number} col Visual column index.\n */\n'modifyColumnHeaderHeight',\n\n/**\n * Fired before the undo action. Contains information about the action that is being undone.\n *\n * @event Hooks#beforeUndo\n * @since 0.26.2\n * @param {Object} action The action object. Contains information about the action being undone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n */\n'beforeUndo',\n\n/**\n * Fired after the undo action. Contains information about the action that is being undone.\n *\n * @event Hooks#afterUndo\n * @since 0.26.2\n * @param {Object} action The action object. Contains information about the action being undone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n */\n'afterUndo',\n\n/**\n * Fired before the redo action. Contains information about the action that is being redone.\n *\n * @event Hooks#beforeRedo\n * @since 0.26.2\n * @param {Object} action The action object. Contains information about the action being redone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n */\n'beforeRedo',\n\n/**\n * Fired after the redo action. Contains information about the action that is being redone.\n *\n * @event Hooks#afterRedo\n * @since 0.26.2\n * @param {Object} action The action object. Contains information about the action being redone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n */\n'afterRedo',\n\n/**\n * Used to modify the row header width.\n *\n * @event Hooks#modifyRowHeaderWidth\n * @param {Number} rowHeaderWidth Row header width.\n */\n'modifyRowHeaderWidth',\n\n/**\n * Fired from the `populateFromArray` method during the `autofill` process. Fired for each \"autofilled\" cell individually.\n *\n * @event Hooks#beforeAutofillInsidePopulate\n * @param {Object} index Object containing `row` and `col` properties, defining the number of rows/columns from the initial cell of the autofill.\n * @param {String} direction Declares the direction of the autofill. Possible values: `up`, `down`, `left`, `right`.\n * @param {Array} input Array of arrays. Contains an array of rows with data being used in the autofill.\n * @param {Array} deltas The deltas array passed to the `populateFromArray` method.\n */\n'beforeAutofillInsidePopulate',\n\n/**\n * Fired when the start of the selection is being modified. (e.g. moving the selection with the arrow keys).\n *\n * @event Hooks#modifyTransformStart\n * @param {CellCoords} delta Cell coords object declaring the delta of the new selection relative to the previous one.\n */\n'modifyTransformStart',\n\n/**\n * Fired when the end of the selection is being modified. (e.g. moving the selection with the arrow keys).\n *\n * @event Hooks#modifyTransformEnd\n * @param {CellCoords} delta Cell coords object declaring the delta of the new selection relative to the previous one.\n */\n'modifyTransformEnd',\n\n/**\n * Fired after the start of the selection is being modified. (e.g. moving the selection with the arrow keys).\n *\n * @event Hooks#afterModifyTransformStart\n * @param {CellCoords} coords Coords of the freshly selected cell.\n * @param {Number} rowTransformDir `-1` if trying to select a cell with a negative row index. `0` otherwise.\n * @param {Number} colTransformDir `-1` if trying to select a cell with a negative column index. `0` otherwise.\n */\n'afterModifyTransformStart',\n\n/**\n * Fired after the end of the selection is being modified. (e.g. moving the selection with the arrow keys).\n *\n * @event Hooks#afterModifyTransformEnd\n * @param {CellCoords} coords Visual coords of the freshly selected cell.\n * @param {Number} rowTransformDir `-1` if trying to select a cell with a negative row index. `0` otherwise.\n * @param {Number} colTransformDir `-1` if trying to select a cell with a negative column index. `0` otherwise.\n */\n'afterModifyTransformEnd',\n\n/**\n * Fired inside the `viewportRowCalculatorOverride` method. Allows modifying the row calculator parameters.\n *\n * @event Hooks#afterViewportRowCalculatorOverride\n * @param {Object} calc The row calculator.\n */\n'afterViewportRowCalculatorOverride',\n\n/**\n * Fired inside the `viewportColumnCalculatorOverride` method. Allows modifying the row calculator parameters.\n *\n * @event Hooks#afterViewportColumnCalculatorOverride\n * @param {Object} calc The row calculator.\n */\n'afterViewportColumnCalculatorOverride',\n\n/**\n * Fired after initializing all the plugins.\n *\n * @event Hooks#afterPluginsInitialized\n */\n'afterPluginsInitialized',\n\n/**\n * Used when saving/loading the manual row heights state.\n *\n * @event Hooks#manualRowHeights\n * @param {Array} state The current manual row heights state.\n */\n'manualRowHeights',\n\n/**\n * Used to skip the length cache calculation for a defined period of time.\n *\n * @event Hooks#skipLengthCache\n * @param {Number} delay The delay in milliseconds.\n */\n'skipLengthCache',\n\n/**\n * Fired after trimming rows in the TrimRows plugin.\n *\n * @pro\n * @event Hooks#afterTrimRow\n * @param {Array} rows Physical indexes of trimmed rows.\n */\n'afterTrimRow',\n\n/**\n * Fired after untrimming rows in the TrimRows plugin.\n *\n * @pro\n * @event Hooks#afterUntrimRow\n * @param {Array} rows Physical indexes of untrimmed rows.\n */\n'afterUntrimRow',\n\n/**\n * Fired before opening the dropdown menu.\n *\n * @pro\n * @event Hooks#beforeDropdownMenuShow\n * @param {DropdownMenu} instance The DropdownMenu instance.\n */\n'beforeDropdownMenuShow',\n\n/**\n * Fired after opening the dropdown menu.\n *\n * @pro\n * @event Hooks#afterDropdownMenuShow\n * @param {DropdownMenu} instance The DropdownMenu instance.\n */\n'afterDropdownMenuShow',\n\n/**\n * Fired after hiding the dropdown menu.\n *\n * @pro\n * @event Hooks#afterDropdownMenuHide\n * @param {DropdownMenu} instance The DropdownMenu instance.\n */\n'afterDropdownMenuHide',\n\n/**\n * Used to check whether the provided row index is hidden.\n *\n * @pro\n * @event Hooks#hiddenRow\n * @param {Number} row The visual row index in question.\n */\n'hiddenRow',\n\n/**\n * Used to check whether the provided column index is hidden.\n *\n * @pro\n * @event Hooks#hiddenColumn\n * @param {Number} column The visual column index in question.\n */\n'hiddenColumn',\n\n/**\n * Fired before adding a children to the NestedRows structure.\n *\n * @pro\n * @event Hooks#beforeAddChild\n * @param {Object} parent The parent object.\n * @param {Object|undefined} element The element added as a child. If `undefined`, a blank child was added.\n * @param {Number|undefined} index The index within the parent where the new child was added. If `undefined`, the element was added as the last child.\n */\n'beforeAddChild',\n\n/**\n * Fired after adding a children to the NestedRows structure.\n *\n * @pro\n * @event Hooks#afterAddChild\n * @param {Object} parent The parent object.\n * @param {Object|undefined} element The element added as a child. If `undefined`, a blank child was added.\n * @param {Number|undefined} index The index within the parent where the new child was added. If `undefined`, the element was added as the last child.\n */\n'afterAddChild',\n\n/**\n * Fired before detaching a child from its parent in the NestedRows plugin.\n *\n * @pro\n * @event Hooks#beforeDetachChild\n * @param {Object} parent An object representing the parent from which the element is to be detached.\n * @param {Object} element The detached element.\n */\n'beforeDetachChild',\n\n/**\n * Fired after detaching a child from its parent in the NestedRows plugin.\n *\n * @pro\n * @event Hooks#afterDetachChild\n * @param {Object} parent An object representing the parent from which the element was detached.\n * @param {Object} element The detached element.\n */\n'afterDetachChild',\n\n/**\n * Fired after the editor is opened and rendered.\n *\n * @event Hooks#afterBeginEditing\n * @param {Number} row Row index of the edited cell.\n * @param {Number} column Column index of the edited cell.\n */\n'afterBeginEditing',\n\n/**\n * Fired before cell merging.\n *\n * @event Hooks#beforeMergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'beforeMergeCells',\n\n/**\n * Fired after cell merging.\n *\n * @event Hooks#afterMergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {Object} mergeParent The parent collection of the provided cell range.\n * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'afterMergeCells',\n\n/**\n * Fired before unmerging the cells.\n *\n * @event Hooks#beforeUnmergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'beforeUnmergeCells',\n\n/**\n * Fired after unmerging the cells.\n *\n * @event Hooks#beforeUnmergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'afterUnmergeCells',\n\n/**\n * Fired after the listening is turned on.\n *\n * @event Hooks#afterListen\n * @since 0.34.5\n */\n'afterListen',\n\n/**\n * Fired after the listening is turned off.\n *\n * @event Hooks#afterUnlisten\n * @since 0.34.5\n */\n'afterUnlisten'];\n\nvar Hooks = function () {\n  _createClass(Hooks, null, [{\n    key: 'getSingleton',\n    value: function getSingleton() {\n      return globalSingleton;\n    }\n\n    /**\n     *\n     */\n\n  }]);\n\n  function Hooks() {\n    _classCallCheck(this, Hooks);\n\n    this.globalBucket = this.createEmptyBucket();\n  }\n\n  /**\n   * Returns a new object with empty handlers related to every registered hook name.\n   *\n   * @returns {Object} The empty bucket object.\n   *\n   * @example\n   * ```js\n   * Handsontable.hooks.createEmptyBucket();\n   * // Results:\n   * {\n   * ...\n   * afterCreateCol: [],\n   * afterCreateRow: [],\n   * beforeInit: [],\n   * ...\n   * }\n   * ```\n   */\n\n\n  _createClass(Hooks, [{\n    key: 'createEmptyBucket',\n    value: function createEmptyBucket() {\n      var bucket = Object.create(null);\n\n      // eslint-disable-next-line no-return-assign\n      (0, _array.arrayEach)(REGISTERED_HOOKS, function (hook) {\n        return bucket[hook] = [];\n      });\n\n      return bucket;\n    }\n\n    /**\n     * Get hook bucket based on the context of the object or if argument is `undefined`, get the global hook bucket.\n     *\n     * @param {Object} [context=null] A Handsontable instance.\n     * @returns {Object} Returns a global or Handsontable instance bucket.\n     */\n\n  }, {\n    key: 'getBucket',\n    value: function getBucket() {\n      var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      if (context) {\n        if (!context.pluginHookBucket) {\n          context.pluginHookBucket = this.createEmptyBucket();\n        }\n\n        return context.pluginHookBucket;\n      }\n\n      return this.globalBucket;\n    }\n\n    /**\n     * Adds a listener (globally or locally) to a specified hook name.\n     * If the `context` parameter is provided, the hook will be added only to the instance it references.\n     * Otherwise, the callback will be used everytime the hook fires on any Handsontable instance.\n     * You can provide an array of callback functions as the `callback` argument, this way they will all be fired\n     * once the hook is triggered.\n     *\n     * @see Core#addHook\n     * @param {String} key Hook name.\n     * @param {Function|Array} callback Callback function or an array of functions.\n     * @param {Object} [context=null] The context for the hook callback to be added - a Handsontable instance or leave empty.\n     * @returns {Hooks} Instance of Hooks.\n     *\n     * @example\n     * ```js\n     * // single callback, added locally\n     * Handsontable.hooks.add('beforeInit', myCallback, hotInstance);\n     *\n     * // single callback, added globally\n     * Handsontable.hooks.add('beforeInit', myCallback);\n     *\n     * // multiple callbacks, added locally\n     * Handsontable.hooks.add('beforeInit', [myCallback, anotherCallback], hotInstance);\n     *\n     * // multiple callbacks, added globally\n     * Handsontable.hooks.add('beforeInit', [myCallback, anotherCallback]);\n     * ```\n     */\n\n  }, {\n    key: 'add',\n    value: function add(key, callback) {\n      var _this = this;\n\n      var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n      if (Array.isArray(callback)) {\n        (0, _array.arrayEach)(callback, function (c) {\n          return _this.add(key, c, context);\n        });\n      } else {\n        var bucket = this.getBucket(context);\n\n        if (typeof bucket[key] === 'undefined') {\n          this.register(key);\n          bucket[key] = [];\n        }\n        callback.skip = false;\n\n        if (bucket[key].indexOf(callback) === -1) {\n          // only add a hook if it has not already been added (adding the same hook twice is now silently ignored)\n          var foundInitialHook = false;\n\n          if (callback.initialHook) {\n            (0, _array.arrayEach)(bucket[key], function (cb, i) {\n              if (cb.initialHook) {\n                bucket[key][i] = callback;\n                foundInitialHook = true;\n\n                return false;\n              }\n            });\n          }\n\n          if (!foundInitialHook) {\n            bucket[key].push(callback);\n          }\n        }\n      }\n\n      return this;\n    }\n\n    /**\n     * Adds a listener to a specified hook. After the hook runs this listener will be automatically removed from the bucket.\n     *\n     * @see Core#addHookOnce\n     * @param {String} key Hook/Event name.\n     * @param {Function|Array} callback Callback function.\n     * @param {Object} [context=null] A Handsontable instance.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.once('beforeInit', myCallback, hotInstance);\n     * ```\n     */\n\n  }, {\n    key: 'once',\n    value: function once(key, callback) {\n      var _this2 = this;\n\n      var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n      if (Array.isArray(callback)) {\n        (0, _array.arrayEach)(callback, function (c) {\n          return _this2.once(key, c, context);\n        });\n      } else {\n        callback.runOnce = true;\n        this.add(key, callback, context);\n      }\n    }\n\n    /**\n     * Removes a listener from a hook with a given name. If the `context` argument is provided, it removes a listener from a local hook assigned to the given Handsontable instance.\n     *\n     * @see Core#removeHook\n     * @param {String} key Hook/Event name.\n     * @param {Function} callback Callback function (needs the be the function that was previously added to the hook).\n     * @param {Object} [context=null] Handsontable instance.\n     * @return {Boolean} Returns `true` if hook was removed, `false` otherwise.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.remove('beforeInit', myCallback);\n     * ```\n     */\n\n  }, {\n    key: 'remove',\n    value: function remove(key, callback) {\n      var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n      var bucket = this.getBucket(context);\n\n      if (typeof bucket[key] !== 'undefined') {\n        if (bucket[key].indexOf(callback) >= 0) {\n          callback.skip = true;\n\n          return true;\n        }\n      }\n\n      return false;\n    }\n\n    /**\n     * Checks whether there are any registered listeners for the provided hook name.\n     * If the `context` parameter is provided, it only checks for listeners assigned to the given Handsontable instance.\n     *\n     * @param {String} key Hook name.\n     * @param {Object} [context=null] A Handsontable instance.\n     * @returns {Boolean} `true` for success, `false` otherwise.\n     */\n\n  }, {\n    key: 'has',\n    value: function has(key) {\n      var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n      var bucket = this.getBucket(context);\n\n      return !!(bucket[key] !== void 0 && bucket[key].length);\n    }\n\n    /**\n     * Runs all local and global callbacks assigned to the hook identified by the `key` parameter.\n     * It returns either a return value from the last called callback or the first parameter (`p1`) passed to the `run` function.\n     *\n     * @see Core#runHooks\n     * @param {Object} context Handsontable instance.\n     * @param {String} key Hook/Event name.\n     * @param {*} [p1] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p2] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p3] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p4] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p5] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p6] Parameter to be passed as an argument to the callback function.\n     * @returns {*} Either a return value from the last called callback or `p1`.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.run(hot, 'beforeInit');\n     * ```\n     */\n\n  }, {\n    key: 'run',\n    value: function run(context, key, p1, p2, p3, p4, p5, p6) {\n      {\n        var globalHandlers = this.globalBucket[key];\n        var index = -1;\n        var length = globalHandlers ? globalHandlers.length : 0;\n\n        if (length) {\n          // Do not optimise this loop with arrayEach or arrow function! If you do You'll decrease perf because of GC.\n          while (++index < length) {\n            if (!globalHandlers[index] || globalHandlers[index].skip) {\n              /* eslint-disable no-continue */\n              continue;\n            }\n            // performance considerations - http://jsperf.com/call-vs-apply-for-a-plugin-architecture\n            var res = globalHandlers[index].call(context, p1, p2, p3, p4, p5, p6);\n\n            if (res !== void 0) {\n              p1 = res;\n            }\n            if (globalHandlers[index] && globalHandlers[index].runOnce) {\n              this.remove(key, globalHandlers[index]);\n            }\n          }\n        }\n      }\n      {\n        var localHandlers = this.getBucket(context)[key];\n        var _index = -1;\n        var _length = localHandlers ? localHandlers.length : 0;\n\n        if (_length) {\n          // Do not optimise this loop with arrayEach or arrow function! If you do You'll decrease perf because of GC.\n          while (++_index < _length) {\n            if (!localHandlers[_index] || localHandlers[_index].skip) {\n              /* eslint-disable no-continue */\n              continue;\n            }\n            // performance considerations - http://jsperf.com/call-vs-apply-for-a-plugin-architecture\n            var _res = localHandlers[_index].call(context, p1, p2, p3, p4, p5, p6);\n\n            if (_res !== void 0) {\n              p1 = _res;\n            }\n            if (localHandlers[_index] && localHandlers[_index].runOnce) {\n              this.remove(key, localHandlers[_index], context);\n            }\n          }\n        }\n      }\n\n      return p1;\n    }\n\n    /**\n     * Destroy all listeners connected to the context. If no context is provided, the global listeners will be destroyed.\n     *\n     * @param {Object} [context=null] A Handsontable instance.\n     * @example\n     * ```js\n     * // destroy the global listeners\n     * Handsontable.hooks.destroy();\n     *\n     * // destroy the local listeners\n     * Handsontable.hooks.destroy(hotInstance);\n     * ```\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      // eslint-disable-next-line no-return-assign\n      (0, _object.objectEach)(this.getBucket(context), function (value, key, bucket) {\n        return bucket[key].length = 0;\n      });\n    }\n\n    /**\n     * Registers a hook name (adds it to the list of the known hook names). Used by plugins.\n     * It is not necessary to call register, but if you use it, your plugin hook will be used returned by\n     * the `getRegistered` method. (which itself is used in the demo http://docs.handsontable.com/tutorial-callbacks.html).\n     *\n     * @param key {String} The hook name.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.register('myHook');\n     * ```\n     */\n\n  }, {\n    key: 'register',\n    value: function register(key) {\n      if (!this.isRegistered(key)) {\n        REGISTERED_HOOKS.push(key);\n      }\n    }\n\n    /**\n     * Deregisters a hook name (removes it from the list of known hook names).\n     *\n     * @param key {String} Hook name.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.deregister('myHook');\n     * ```\n     */\n\n  }, {\n    key: 'deregister',\n    value: function deregister(key) {\n      if (this.isRegistered(key)) {\n        REGISTERED_HOOKS.splice(REGISTERED_HOOKS.indexOf(key), 1);\n      }\n    }\n\n    /**\n     * Returns a boolean depending on if a hook by such name has been registered.\n     *\n     * @param key {String} Hook name.\n     * @returns {Boolean} `true` for success, `false` otherwise.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.isRegistered('beforeInit');\n     *\n     * // Results:\n     * true\n     * ```\n     */\n\n  }, {\n    key: 'isRegistered',\n    value: function isRegistered(key) {\n      return REGISTERED_HOOKS.indexOf(key) >= 0;\n    }\n\n    /**\n     * Returns an array of registered hooks.\n     *\n     * @returns {Array} An array of registered hooks.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.getRegistered();\n     *\n     * // Results:\n     * [\n     * ...\n     *   'beforeInit',\n     *   'beforeRender',\n     *   'beforeSetRangeEnd',\n     *   'beforeDrawBorders',\n     *   'beforeChange',\n     * ...\n     * ]\n     * ```\n     */\n\n  }, {\n    key: 'getRegistered',\n    value: function getRegistered() {\n      return REGISTERED_HOOKS;\n    }\n  }]);\n\n  return Hooks;\n}();\n\nvar globalSingleton = new Hooks();\n\nexports.default = Hooks;\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _templateObject = _taggedTemplateLiteral(['\\n          Your license key of Handsontable Pro has expired.\\u200C\\u200C\\u200C\\u200C \\n          Renew your maintenance plan at https://handsontable.com or downgrade to the previous version of the software.\\n          '], ['\\n          Your license key of Handsontable Pro has expired.\\u200C\\u200C\\u200C\\u200C\\\\x20\\n          Renew your maintenance plan at https://handsontable.com or downgrade to the previous version of the software.\\n          ']);\n\nexports.stringify = stringify;\nexports.isDefined = isDefined;\nexports.isUndefined = isUndefined;\nexports.isEmpty = isEmpty;\nexports.isRegExp = isRegExp;\nexports._injectProductInfo = _injectProductInfo;\n\nvar _moment = __webpack_require__(41);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _templateLiteralTag = __webpack_require__(42);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\n/**\n * Converts any value to string.\n *\n * @param {*} value\n * @returns {String}\n */\nfunction stringify(value) {\n  var result = void 0;\n\n  switch (typeof value === 'undefined' ? 'undefined' : _typeof(value)) {\n    case 'string':\n    case 'number':\n      result = '' + value;\n      break;\n\n    case 'object':\n      result = value === null ? '' : value.toString();\n      break;\n    case 'undefined':\n      result = '';\n      break;\n    default:\n      result = value.toString();\n      break;\n  }\n\n  return result;\n}\n\n/**\n * Checks if given variable is defined.\n *\n * @param {*} variable Variable to check.\n * @returns {Boolean}\n */\nfunction isDefined(variable) {\n  return typeof variable !== 'undefined';\n}\n\n/**\n * Checks if given variable is undefined.\n *\n * @param {*} variable Variable to check.\n * @returns {Boolean}\n */\nfunction isUndefined(variable) {\n  return typeof variable === 'undefined';\n}\n\n/**\n * Check if given variable is null, empty string or undefined.\n *\n * @param {*} variable Variable to check.\n * @returns {Boolean}\n */\nfunction isEmpty(variable) {\n  return variable === null || variable === '' || isUndefined(variable);\n}\n\n/**\n * Check if given variable is a regular expression.\n *\n * @param {*} variable Variable to check.\n * @returns {Boolean}\n */\nfunction isRegExp(variable) {\n  return Object.prototype.toString.call(variable) === '[object RegExp]';\n}\n\n/* eslint-disable */\nvar _m = '\\x6C\\x65\\x6E\\x67\\x74\\x68';\nvar _hd = function _hd(v) {\n  return parseInt(v, 16);\n};\nvar _pi = function _pi(v) {\n  return parseInt(v, 10);\n};\nvar _ss = function _ss(v, s, l) {\n  return v['\\x73\\x75\\x62\\x73\\x74\\x72'](s, l);\n};\nvar _cp = function _cp(v) {\n  return v['\\x63\\x6F\\x64\\x65\\x50\\x6F\\x69\\x6E\\x74\\x41\\x74'](0) - 65;\n};\nvar _norm = function _norm(v) {\n  return ('' + v).replace(/\\-/g, '');\n};\nvar _extractTime = function _extractTime(v) {\n  return _hd(_ss(_norm(v), _hd('12'), _cp('\\x46'))) / (_hd(_ss(_norm(v), _cp('\\x42'), ~~![][_m])) || 9);\n};\nvar _ignored = function _ignored() {\n  return typeof location !== 'undefined' && /^([a-z0-9\\-]+\\.)?\\x68\\x61\\x6E\\x64\\x73\\x6F\\x6E\\x74\\x61\\x62\\x6C\\x65\\x2E\\x63\\x6F\\x6D$/i.test(location.host);\n};\nvar _notified = false;\n\nfunction _injectProductInfo(key, element) {\n  key = _norm(key || '');\n\n  var warningMessage = '';\n  var showDomMessage = true;\n  var schemaValidity = _checkKeySchema(key);\n  var ignored = _ignored();\n  var trial = isEmpty(key) || key === 'trial';\n\n  if (trial || schemaValidity) {\n    if (schemaValidity) {\n      var releaseTime = Math.floor((0, _moment2.default)('11/04/2018', 'DD/MM/YYYY').toDate().getTime() / 8.64e7);\n      var keyGenTime = _extractTime(key);\n\n      if (keyGenTime > 45000 || keyGenTime !== parseInt(keyGenTime, 10)) {\n        warningMessage = 'The license key provided to Handsontable Pro is invalid. Make sure you pass it correctly.';\n      }\n\n      if (!warningMessage) {\n        if (releaseTime > keyGenTime + 1) {\n          warningMessage = (0, _templateLiteralTag.toSingleLine)(_templateObject);\n        }\n        showDomMessage = releaseTime > keyGenTime + 15;\n      }\n    } else {\n      warningMessage = 'Evaluation version of Handsontable Pro. Not licensed for use in a production environment.';\n    }\n  } else {\n    warningMessage = 'The license key provided to Handsontable Pro is invalid. Make sure you pass it correctly.';\n  }\n  if (ignored) {\n    warningMessage = false;\n    showDomMessage = false;\n  }\n\n  if (warningMessage && !_notified) {\n    console[trial ? 'info' : 'warn'](warningMessage);\n    _notified = true;\n  }\n  if (showDomMessage && element.parentNode) {\n    var message = document.createElement('div');\n\n    message.id = 'hot-display-license-info';\n    message.appendChild(document.createTextNode('Evaluation version of Handsontable Pro.'));\n    message.appendChild(document.createElement('br'));\n    message.appendChild(document.createTextNode('Not licensed for production use.'));\n\n    element.parentNode.insertBefore(message, element.nextSibling);\n  }\n}\n\nfunction _checkKeySchema(v) {\n  var z = [][_m];\n  var p = z;\n\n  if (v[_m] !== _cp('\\x5A')) {\n    return false;\n  }\n\n  for (var c = '', i = '\\x42\\x3C\\x48\\x34\\x50\\x2B'.split(''), j = _cp(i.shift()); j; j = _cp(i.shift() || 'A')) {\n    --j < ''[_m] ? p = p | (_pi('' + _pi(_hd(c) + (_hd(_ss(v, Math.abs(j), 2)) + []).padStart(2, '0'))) % 97 || 2) >> 1 : c = _ss(v, j, !j ? 6 : i[_m] === 1 ? 9 : 8);\n  }\n\n  return p === z;\n}\n/* eslint-enable */\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getRegisteredEditors = exports.getRegisteredEditorNames = exports.hasEditor = exports.getEditorInstance = exports.getEditor = exports.registerEditor = undefined;\nexports.RegisteredEditor = RegisteredEditor;\nexports._getEditorInstance = _getEditorInstance;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _baseEditor = __webpack_require__(54);\n\nvar _baseEditor2 = _interopRequireDefault(_baseEditor);\n\nvar _autocompleteEditor = __webpack_require__(307);\n\nvar _autocompleteEditor2 = _interopRequireDefault(_autocompleteEditor);\n\nvar _checkboxEditor = __webpack_require__(356);\n\nvar _checkboxEditor2 = _interopRequireDefault(_checkboxEditor);\n\nvar _dateEditor = __webpack_require__(357);\n\nvar _dateEditor2 = _interopRequireDefault(_dateEditor);\n\nvar _dropdownEditor = __webpack_require__(360);\n\nvar _dropdownEditor2 = _interopRequireDefault(_dropdownEditor);\n\nvar _handsontableEditor = __webpack_require__(308);\n\nvar _handsontableEditor2 = _interopRequireDefault(_handsontableEditor);\n\nvar _numericEditor = __webpack_require__(361);\n\nvar _numericEditor2 = _interopRequireDefault(_numericEditor);\n\nvar _passwordEditor = __webpack_require__(362);\n\nvar _passwordEditor2 = _interopRequireDefault(_passwordEditor);\n\nvar _selectEditor = __webpack_require__(363);\n\nvar _selectEditor2 = _interopRequireDefault(_selectEditor);\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Utility to register editors and common namespace for keeping reference to all editor classes\n */\nvar registeredEditorClasses = new WeakMap();\n\nvar _staticRegister = (0, _staticRegister3.default)('editors'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem,\n    hasItem = _staticRegister.hasItem,\n    getNames = _staticRegister.getNames,\n    getValues = _staticRegister.getValues;\n\n_register('base', _baseEditor2.default);\n_register('autocomplete', _autocompleteEditor2.default);\n_register('checkbox', _checkboxEditor2.default);\n_register('date', _dateEditor2.default);\n_register('dropdown', _dropdownEditor2.default);\n_register('handsontable', _handsontableEditor2.default);\n_register('numeric', _numericEditor2.default);\n_register('password', _passwordEditor2.default);\n_register('select', _selectEditor2.default);\n_register('text', _textEditor2.default);\n\nfunction RegisteredEditor(editorClass) {\n  var instances = {};\n  var Clazz = editorClass;\n\n  this.getConstructor = function () {\n    return editorClass;\n  };\n\n  this.getInstance = function (hotInstance) {\n    if (!(hotInstance.guid in instances)) {\n      instances[hotInstance.guid] = new Clazz(hotInstance);\n    }\n\n    return instances[hotInstance.guid];\n  };\n\n  _pluginHooks2.default.getSingleton().add('afterDestroy', function () {\n    instances = {};\n  });\n}\n\n/**\n * Returns instance (singleton) of editor class.\n *\n * @param {String} name Name of an editor under which it has been stored.\n * @param {Object} hotInstance Instance of Handsontable.\n * @returns {Function} Returns instance of editor.\n */\nfunction _getEditorInstance(name, hotInstance) {\n  var editor = void 0;\n\n  if (typeof name === 'function') {\n    if (!registeredEditorClasses.get(name)) {\n      _register(null, name);\n    }\n    editor = registeredEditorClasses.get(name);\n  } else if (typeof name === 'string') {\n    editor = getItem(name);\n  } else {\n    throw Error('Only strings and functions can be passed as \"editor\" parameter');\n  }\n\n  if (!editor) {\n    throw Error('No editor registered under name \"' + name + '\"');\n  }\n\n  return editor.getInstance(hotInstance);\n}\n\n/**\n * Retrieve editor class.\n *\n * @param {String} name Editor identification.\n * @returns {Function} Returns editor class.\n */\nfunction _getItem(name) {\n  if (!hasItem(name)) {\n    throw Error('No registered editor found under \"' + name + '\" name');\n  }\n\n  return getItem(name).getConstructor();\n}\n\n/**\n * Register editor class under specified name.\n *\n * @param {String} name Editor identification.\n * @param {Function} editorClass Editor class.\n */\nfunction _register(name, editorClass) {\n  var editorWrapper = new RegisteredEditor(editorClass);\n\n  if (typeof name === 'string') {\n    register(name, editorWrapper);\n  }\n  registeredEditorClasses.set(editorClass, editorWrapper);\n}\n\nexports.registerEditor = _register;\nexports.getEditor = _getItem;\nexports.getEditorInstance = _getEditorInstance;\nexports.hasEditor = hasItem;\nexports.getRegisteredEditorNames = getNames;\nexports.getRegisteredEditors = getValues;\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.normalizeSelection = normalizeSelection;\nexports.isSeparator = isSeparator;\nexports.hasSubMenu = hasSubMenu;\nexports.isDisabled = isDisabled;\nexports.isSelectionDisabled = isSelectionDisabled;\nexports.getValidSelection = getValidSelection;\nexports.prepareVerticalAlignClass = prepareVerticalAlignClass;\nexports.prepareHorizontalAlignClass = prepareHorizontalAlignClass;\nexports.getAlignmentClasses = getAlignmentClasses;\nexports.align = align;\nexports.checkSelectionConsistency = checkSelectionConsistency;\nexports.markLabelAsSelected = markLabelAsSelected;\nexports.isItemHidden = isItemHidden;\nexports.filterSeparators = filterSeparators;\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _element = __webpack_require__(0);\n\nvar _separator = __webpack_require__(93);\n\nfunction normalizeSelection(selRanges) {\n  return (0, _array.arrayMap)(selRanges, function (range) {\n    return {\n      start: range.getTopLeftCorner(),\n      end: range.getBottomRightCorner()\n    };\n  });\n}\n\nfunction isSeparator(cell) {\n  return (0, _element.hasClass)(cell, 'htSeparator');\n}\n\nfunction hasSubMenu(cell) {\n  return (0, _element.hasClass)(cell, 'htSubmenu');\n}\n\nfunction isDisabled(cell) {\n  return (0, _element.hasClass)(cell, 'htDisabled');\n}\n\nfunction isSelectionDisabled(cell) {\n  return (0, _element.hasClass)(cell, 'htSelectionDisabled');\n}\n\nfunction getValidSelection(hot) {\n  var selected = hot.getSelected();\n\n  if (!selected) {\n    return null;\n  }\n  if (selected[0] < 0) {\n    return null;\n  }\n\n  return selected;\n}\n\nfunction prepareVerticalAlignClass(className, alignment) {\n  if (className.indexOf(alignment) != -1) {\n    return className;\n  }\n  className = className.replace('htTop', '').replace('htMiddle', '').replace('htBottom', '').replace('  ', '');\n\n  className += ' ' + alignment;\n\n  return className;\n}\n\nfunction prepareHorizontalAlignClass(className, alignment) {\n  if (className.indexOf(alignment) != -1) {\n    return className;\n  }\n  className = className.replace('htLeft', '').replace('htCenter', '').replace('htRight', '').replace('htJustify', '').replace('  ', '');\n\n  className += ' ' + alignment;\n\n  return className;\n}\n\nfunction getAlignmentClasses(ranges, callback) {\n  var classes = {};\n\n  (0, _array.arrayEach)(ranges, function (_ref) {\n    var from = _ref.from,\n        to = _ref.to;\n\n    for (var row = from.row; row <= to.row; row++) {\n      for (var col = from.col; col <= to.col; col++) {\n        if (!classes[row]) {\n          classes[row] = [];\n        }\n        classes[row][col] = callback(row, col);\n      }\n    }\n  });\n\n  return classes;\n}\n\nfunction align(ranges, type, alignment, cellDescriptor, propertySetter) {\n  (0, _array.arrayEach)(ranges, function (_ref2) {\n    var from = _ref2.from,\n        to = _ref2.to;\n\n    if (from.row == to.row && from.col == to.col) {\n      applyAlignClassName(from.row, from.col, type, alignment, cellDescriptor, propertySetter);\n    } else {\n      for (var row = from.row; row <= to.row; row++) {\n        for (var col = from.col; col <= to.col; col++) {\n          applyAlignClassName(row, col, type, alignment, cellDescriptor, propertySetter);\n        }\n      }\n    }\n  });\n}\n\nfunction applyAlignClassName(row, col, type, alignment, cellDescriptor, propertySetter) {\n  var cellMeta = cellDescriptor(row, col);\n  var className = alignment;\n\n  if (cellMeta.className) {\n    if (type === 'vertical') {\n      className = prepareVerticalAlignClass(cellMeta.className, alignment);\n    } else {\n      className = prepareHorizontalAlignClass(cellMeta.className, alignment);\n    }\n  }\n\n  propertySetter(row, col, 'className', className);\n}\n\nfunction checkSelectionConsistency(ranges, comparator) {\n  var result = false;\n\n  if (Array.isArray(ranges)) {\n    (0, _array.arrayEach)(ranges, function (range) {\n      range.forAll(function (row, col) {\n        if (comparator(row, col)) {\n          result = true;\n\n          return false;\n        }\n      });\n\n      return result;\n    });\n  }\n\n  return result;\n}\n\nfunction markLabelAsSelected(label) {\n  // workaround for https://github.com/handsontable/handsontable/issues/1946\n  return '<span class=\"selected\">' + String.fromCharCode(10003) + '</span>' + label;\n}\n\nfunction isItemHidden(item, instance) {\n  return !item.hidden || !(typeof item.hidden == 'function' && item.hidden.call(instance));\n}\n\nfunction shiftSeparators(items, separator) {\n  var result = items.slice(0);\n\n  for (var i = 0; i < result.length;) {\n    if (result[i].name === separator) {\n      result.shift();\n    } else {\n      break;\n    }\n  }\n  return result;\n}\n\nfunction popSeparators(items, separator) {\n  var result = items.slice(0);\n\n  result.reverse();\n  result = shiftSeparators(result, separator);\n  result.reverse();\n\n  return result;\n}\n\nfunction removeDuplicatedSeparators(items) {\n  var result = [];\n\n  (0, _array.arrayEach)(items, function (value, index) {\n    if (index > 0) {\n      if (result[result.length - 1].name !== value.name) {\n        result.push(value);\n      }\n    } else {\n      result.push(value);\n    }\n  });\n\n  return result;\n}\n\nfunction filterSeparators(items) {\n  var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _separator.KEY;\n\n  var result = items.slice(0);\n\n  result = shiftSeparators(result, separator);\n  result = popSeparators(result, separator);\n  result = removeDuplicatedSeparators(result);\n\n  return result;\n}\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(18);\nvar IE8_DOM_DEFINE = __webpack_require__(98);\nvar toPrimitive = __webpack_require__(73);\nvar dP = Object.defineProperty;\n\nexports.f = __webpack_require__(22) ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return dP(O, P, Attributes);\n  } catch (e) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY_CODES = undefined;\nexports.isPrintableChar = isPrintableChar;\nexports.isMetaKey = isMetaKey;\nexports.isCtrlKey = isCtrlKey;\nexports.isCtrlMetaKey = isCtrlMetaKey;\nexports.isKey = isKey;\n\nvar _array = __webpack_require__(1);\n\nvar KEY_CODES = exports.KEY_CODES = {\n  MOUSE_LEFT: 1,\n  MOUSE_RIGHT: 3,\n  MOUSE_MIDDLE: 2,\n  BACKSPACE: 8,\n  COMMA: 188,\n  INSERT: 45,\n  DELETE: 46,\n  END: 35,\n  ENTER: 13,\n  ESCAPE: 27,\n  CONTROL: 17,\n  COMMAND_LEFT: 91,\n  COMMAND_RIGHT: 93,\n  COMMAND_FIREFOX: 224,\n  ALT: 18,\n  HOME: 36,\n  PAGE_DOWN: 34,\n  PAGE_UP: 33,\n  PERIOD: 190,\n  SPACE: 32,\n  SHIFT: 16,\n  CAPS_LOCK: 20,\n  TAB: 9,\n  ARROW_RIGHT: 39,\n  ARROW_LEFT: 37,\n  ARROW_UP: 38,\n  ARROW_DOWN: 40,\n  F1: 112,\n  F2: 113,\n  F3: 114,\n  F4: 115,\n  F5: 116,\n  F6: 117,\n  F7: 118,\n  F8: 119,\n  F9: 120,\n  F10: 121,\n  F11: 122,\n  F12: 123,\n  A: 65,\n  X: 88,\n  C: 67,\n  V: 86\n};\n\n/**\n * Returns true if keyCode represents a printable character.\n *\n * @param {Number} keyCode\n * @returns {Boolean}\n */\nfunction isPrintableChar(keyCode) {\n  return keyCode == 32 || // space\n  keyCode >= 48 && keyCode <= 57 || // 0-9\n  keyCode >= 96 && keyCode <= 111 || // numpad\n  keyCode >= 186 && keyCode <= 192 || // ;=,-./`\n  keyCode >= 219 && keyCode <= 222 || // []{}\\|\"'\n  keyCode >= 226 || // special chars (229 for Asian chars)\n  keyCode >= 65 && keyCode <= 90; // a-z\n}\n\n/**\n * @param {Number} keyCode\n * @returns {Boolean}\n */\nfunction isMetaKey(keyCode) {\n  var metaKeys = [KEY_CODES.ARROW_DOWN, KEY_CODES.ARROW_UP, KEY_CODES.ARROW_LEFT, KEY_CODES.ARROW_RIGHT, KEY_CODES.HOME, KEY_CODES.END, KEY_CODES.DELETE, KEY_CODES.BACKSPACE, KEY_CODES.F1, KEY_CODES.F2, KEY_CODES.F3, KEY_CODES.F4, KEY_CODES.F5, KEY_CODES.F6, KEY_CODES.F7, KEY_CODES.F8, KEY_CODES.F9, KEY_CODES.F10, KEY_CODES.F11, KEY_CODES.F12, KEY_CODES.TAB, KEY_CODES.PAGE_DOWN, KEY_CODES.PAGE_UP, KEY_CODES.ENTER, KEY_CODES.ESCAPE, KEY_CODES.SHIFT, KEY_CODES.CAPS_LOCK, KEY_CODES.ALT];\n\n  return metaKeys.indexOf(keyCode) !== -1;\n}\n\n/**\n * Checks if passed key code is ctrl or cmd key. Depends on what OS the code runs it check key code based on\n * different meta key codes.\n *\n * @param {Number} keyCode Key code to check.\n * @returns {Boolean}\n */\nfunction isCtrlKey(keyCode) {\n  var keys = [];\n\n  if (window.navigator.platform.includes('Mac')) {\n    keys.push(KEY_CODES.COMMAND_LEFT, KEY_CODES.COMMAND_RIGHT, KEY_CODES.COMMAND_FIREFOX);\n  } else {\n    keys.push(KEY_CODES.CONTROL);\n  }\n\n  return keys.includes(keyCode);\n}\n\n/**\n * Checks if passed key code is ctrl or cmd key. This helper checks if the key code matches to meta keys\n * regardless of the OS on which it is running.\n *\n * @param {Number} keyCode Key code to check.\n * @returns {Boolean}\n */\nfunction isCtrlMetaKey(keyCode) {\n  return [KEY_CODES.CONTROL, KEY_CODES.COMMAND_LEFT, KEY_CODES.COMMAND_RIGHT, KEY_CODES.COMMAND_FIREFOX].includes(keyCode);\n}\n\n/**\n * @param {Number} keyCode\n * @param {String} baseCode\n * @returns {Boolean}\n */\nfunction isKey(keyCode, baseCode) {\n  var keys = baseCode.split('|');\n  var result = false;\n\n  (0, _array.arrayEach)(keys, function (key) {\n    if (keyCode === KEY_CODES[key]) {\n      result = true;\n\n      return false;\n    }\n  });\n\n  return result;\n}\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(23)(function () {\n  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(75);\nvar defined = __webpack_require__(38);\nmodule.exports = function (it) {\n  return IObject(defined(it));\n};\n\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.15 ToLength\nvar toInteger = __webpack_require__(59);\nvar min = Math.min;\nmodule.exports = function (it) {\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// most Object methods by ES6 should accept primitives\nvar $export = __webpack_require__(3);\nvar core = __webpack_require__(45);\nvar fails = __webpack_require__(23);\nmodule.exports = function (KEY, exec) {\n  var fn = (core.Object || {})[KEY] || Object[KEY];\n  var exp = {};\n  exp[KEY] = exec(fn);\n  $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.isIE8 = isIE8;\nexports.isIE9 = isIE9;\nexports.isSafari = isSafari;\nexports.isChrome = isChrome;\nexports.isMobileBrowser = isMobileBrowser;\nvar _isIE8 = !document.createTextNode('test').textContent;\n\nfunction isIE8() {\n  return _isIE8;\n}\n\nvar _isIE9 = !!document.documentMode;\n\nfunction isIE9() {\n  return _isIE9;\n}\n\nvar _isSafari = /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);\n\nfunction isSafari() {\n  return _isSafari;\n}\n\nvar _isChrome = /Chrome/.test(navigator.userAgent) && /Google/.test(navigator.vendor);\n\nfunction isChrome() {\n  return _isChrome;\n}\n\nfunction isMobileBrowser(userAgent) {\n  if (!userAgent) {\n    userAgent = navigator.userAgent;\n  }\n\n  return (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent)\n  );\n}\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getRegisteredValidators = exports.getRegisteredValidatorNames = exports.hasValidator = exports.getValidator = exports.registerValidator = undefined;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _autocompleteValidator = __webpack_require__(372);\n\nvar _autocompleteValidator2 = _interopRequireDefault(_autocompleteValidator);\n\nvar _dateValidator = __webpack_require__(373);\n\nvar _dateValidator2 = _interopRequireDefault(_dateValidator);\n\nvar _numericValidator = __webpack_require__(374);\n\nvar _numericValidator2 = _interopRequireDefault(_numericValidator);\n\nvar _timeValidator = __webpack_require__(375);\n\nvar _timeValidator2 = _interopRequireDefault(_timeValidator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _staticRegister = (0, _staticRegister3.default)('validators'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem,\n    hasItem = _staticRegister.hasItem,\n    getNames = _staticRegister.getNames,\n    getValues = _staticRegister.getValues;\n\nregister('autocomplete', _autocompleteValidator2.default);\nregister('date', _dateValidator2.default);\nregister('numeric', _numericValidator2.default);\nregister('time', _timeValidator2.default);\n\n/**\n * Retrieve validator function.\n *\n * @param {String} name Validator identification.\n * @returns {Function} Returns validator function.\n */\nfunction _getItem(name) {\n  if (typeof name === 'function') {\n    return name;\n  }\n  if (!hasItem(name)) {\n    throw Error('No registered validator found under \"' + name + '\" name');\n  }\n\n  return getItem(name);\n}\n\nexports.registerValidator = register;\nexports.getValidator = _getItem;\nexports.hasValidator = hasItem;\nexports.getRegisteredValidatorNames = getNames;\nexports.getRegisteredValidators = getValues;\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports) {\n\nvar hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar hide = __webpack_require__(31);\nvar has = __webpack_require__(29);\nvar SRC = __webpack_require__(49)('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\n__webpack_require__(45).inspectSource = function (it) {\n  return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n  var isFunction = typeof val == 'function';\n  if (isFunction) has(val, 'name') || hide(val, 'name', key);\n  if (O[key] === val) return;\n  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n  if (O === global) {\n    O[key] = val;\n  } else if (!safe) {\n    delete O[key];\n    hide(O, key, val);\n  } else if (O[key]) {\n    O[key] = val;\n  } else {\n    hide(O, key, val);\n  }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n  return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(20);\nvar createDesc = __webpack_require__(50);\nmodule.exports = __webpack_require__(22) ? function (object, key, value) {\n  return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// optional / simple context binding\nvar aFunction = __webpack_require__(62);\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n  switch (length) {\n    case 1: return function (a) {\n      return fn.call(that, a);\n    };\n    case 2: return function (a, b) {\n      return fn.call(that, a, b);\n    };\n    case 3: return function (a, b, c) {\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(38);\nmodule.exports = function (it) {\n  return Object(defined(it));\n};\n\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar META = __webpack_require__(49)('meta');\nvar isObject = __webpack_require__(9);\nvar has = __webpack_require__(29);\nvar setDesc = __webpack_require__(20).f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n  return true;\n};\nvar FREEZE = !__webpack_require__(23)(function () {\n  return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n  setDesc(it, META, { value: {\n    i: 'O' + ++id, // object ID\n    w: {}          // weak collections IDs\n  } });\n};\nvar fastKey = function (it, create) {\n  // return primitive with prefix\n  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return 'F';\n    // not necessary to add metadata\n    if (!create) return 'E';\n    // add missing metadata\n    setMeta(it);\n  // return object ID\n  } return it[META].i;\n};\nvar getWeak = function (it, create) {\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return true;\n    // not necessary to add metadata\n    if (!create) return false;\n    // add missing metadata\n    setMeta(it);\n  // return hash weak collections IDs\n  } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n  return it;\n};\nvar meta = module.exports = {\n  KEY: META,\n  NEED: false,\n  fastKey: fastKey,\n  getWeak: getWeak,\n  onFreeze: onFreeze\n};\n\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _core = __webpack_require__(179);\n\nvar _core2 = _interopRequireDefault(_core);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar registeredOverlays = {};\n\n/**\n * Creates an overlay over the original Walkontable instance. The overlay renders the clone of the original Walkontable\n * and (optionally) implements behavior needed for native horizontal and vertical scrolling.\n *\n * @class Overlay\n */\n\nvar Overlay = function () {\n  _createClass(Overlay, null, [{\n    key: 'registerOverlay',\n\n\n    /**\n     * Register overlay class.\n     *\n     * @param {String} type Overlay type, one of the CLONE_TYPES value\n     * @param {Overlay} overlayClass Overlay class extended from base overlay class {@link Overlay}\n     */\n    value: function registerOverlay(type, overlayClass) {\n      if (Overlay.CLONE_TYPES.indexOf(type) === -1) {\n        throw new Error('Unsupported overlay (' + type + ').');\n      }\n      registeredOverlays[type] = overlayClass;\n    }\n\n    /**\n     * Create new instance of overlay type.\n     *\n     * @param {String} type Overlay type, one of the CLONE_TYPES value\n     * @param {Walkontable} wot Walkontable instance\n     */\n\n  }, {\n    key: 'createOverlay',\n    value: function createOverlay(type, wot) {\n      return new registeredOverlays[type](wot);\n    }\n\n    /**\n     * Check if specified overlay was registered.\n     *\n     * @param {String} type Overlay type, one of the CLONE_TYPES value\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasOverlay',\n    value: function hasOverlay(type) {\n      return registeredOverlays[type] !== void 0;\n    }\n\n    /**\n     * Checks if overlay object (`overlay`) is instance of overlay type (`type`).\n     *\n     * @param {Overlay} overlay Overlay object\n     * @param {String} type Overlay type, one of the CLONE_TYPES value\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isOverlayTypeOf',\n    value: function isOverlayTypeOf(overlay, type) {\n      if (!overlay || !registeredOverlays[type]) {\n        return false;\n      }\n\n      return overlay instanceof registeredOverlays[type];\n    }\n\n    /**\n     * @param {Walkontable} wotInstance\n     */\n\n  }, {\n    key: 'CLONE_TOP',\n\n    /**\n     * @type {String}\n     */\n    get: function get() {\n      return 'top';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_BOTTOM',\n    get: function get() {\n      return 'bottom';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_LEFT',\n    get: function get() {\n      return 'left';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_TOP_LEFT_CORNER',\n    get: function get() {\n      return 'top_left_corner';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_BOTTOM_LEFT_CORNER',\n    get: function get() {\n      return 'bottom_left_corner';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_DEBUG',\n    get: function get() {\n      return 'debug';\n    }\n\n    /**\n     * List of all availables clone types\n     *\n     * @type {Array}\n     */\n\n  }, {\n    key: 'CLONE_TYPES',\n    get: function get() {\n      return [Overlay.CLONE_TOP, Overlay.CLONE_BOTTOM, Overlay.CLONE_LEFT, Overlay.CLONE_TOP_LEFT_CORNER, Overlay.CLONE_BOTTOM_LEFT_CORNER, Overlay.CLONE_DEBUG];\n    }\n  }]);\n\n  function Overlay(wotInstance) {\n    _classCallCheck(this, Overlay);\n\n    (0, _object.defineGetter)(this, 'wot', wotInstance, {\n      writable: false\n    });\n\n    // legacy support, deprecated in the future\n    this.instance = this.wot;\n\n    this.type = '';\n    this.mainTableScrollableElement = null;\n    this.TABLE = this.wot.wtTable.TABLE;\n    this.hider = this.wot.wtTable.hider;\n    this.spreader = this.wot.wtTable.spreader;\n    this.holder = this.wot.wtTable.holder;\n    this.wtRootElement = this.wot.wtTable.wtRootElement;\n    this.trimmingContainer = (0, _element.getTrimmingContainer)(this.hider.parentNode.parentNode);\n    this.areElementSizesAdjusted = false;\n    this.updateStateOfRendering();\n  }\n\n  /**\n   * Update internal state of object with an information about the need of full rendering of the overlay.\n   *\n   * @returns {Boolean} Returns `true` if the state has changed since the last check.\n   */\n\n\n  _createClass(Overlay, [{\n    key: 'updateStateOfRendering',\n    value: function updateStateOfRendering() {\n      var previousState = this.needFullRender;\n\n      this.needFullRender = this.shouldBeRendered();\n\n      var changed = previousState !== this.needFullRender;\n\n      if (changed && !this.needFullRender) {\n        this.reset();\n      }\n\n      return changed;\n    }\n\n    /**\n     * Checks if overlay should be fully rendered\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'shouldBeRendered',\n    value: function shouldBeRendered() {\n      return true;\n    }\n\n    /**\n     * Update the trimming container.\n     */\n\n  }, {\n    key: 'updateTrimmingContainer',\n    value: function updateTrimmingContainer() {\n      this.trimmingContainer = (0, _element.getTrimmingContainer)(this.hider.parentNode.parentNode);\n    }\n\n    /**\n     * Update the main scrollable element.\n     */\n\n  }, {\n    key: 'updateMainScrollableElement',\n    value: function updateMainScrollableElement() {\n      this.mainTableScrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);\n    }\n\n    /**\n     * Make a clone of table for overlay\n     *\n     * @param {String} direction Can be `Overlay.CLONE_TOP`, `Overlay.CLONE_LEFT`,\n     *                           `Overlay.CLONE_TOP_LEFT_CORNER`, `Overlay.CLONE_DEBUG`\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'makeClone',\n    value: function makeClone(direction) {\n      if (Overlay.CLONE_TYPES.indexOf(direction) === -1) {\n        throw new Error('Clone type \"' + direction + '\" is not supported.');\n      }\n      var clone = document.createElement('DIV');\n      var clonedTable = document.createElement('TABLE');\n\n      clone.className = 'ht_clone_' + direction + ' handsontable';\n      clone.style.position = 'absolute';\n      clone.style.top = 0;\n      clone.style.left = 0;  //.right = 0 for RTL\n      clone.style.overflow = 'hidden';\n\n      clonedTable.className = this.wot.wtTable.TABLE.className;\n      clone.appendChild(clonedTable);\n\n      this.type = direction;\n      this.wot.wtTable.wtRootElement.parentNode.appendChild(clone);\n\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (preventOverflow === true || preventOverflow === 'horizontal' && this.type === Overlay.CLONE_TOP || preventOverflow === 'vertical' && this.type === Overlay.CLONE_LEFT) {\n        this.mainTableScrollableElement = window;\n      } else {\n        this.mainTableScrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);\n      }\n\n      return new _core2.default({\n        cloneSource: this.wot,\n        cloneOverlay: this,\n        table: clonedTable\n      });\n    }\n\n    /**\n     * Refresh/Redraw overlay\n     *\n     * @param {Boolean} [fastDraw=false]\n     */\n\n  }, {\n    key: 'refresh',\n    value: function refresh() {\n      var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      // When hot settings are changed we allow to refresh overlay once before blocking\n      var nextCycleRenderFlag = this.shouldBeRendered();\n\n      if (this.clone && (this.needFullRender || nextCycleRenderFlag)) {\n        this.clone.draw(fastDraw);\n      }\n      this.needFullRender = nextCycleRenderFlag;\n    }\n\n    /**\n     * Reset overlay styles to initial values.\n     */\n\n  }, {\n    key: 'reset',\n    value: function reset() {\n      if (!this.clone) {\n        return;\n      }\n      var holder = this.clone.wtTable.holder;\n      var hider = this.clone.wtTable.hider;\n      var holderStyle = holder.style;\n      var hidderStyle = hider.style;\n      var rootStyle = holder.parentNode.style;\n\n      (0, _array.arrayEach)([holderStyle, hidderStyle, rootStyle], function (style) {\n        style.width = '';\n        style.height = '';\n      });\n    }\n\n    /**\n     * Destroy overlay instance\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      new _eventManager2.default(this.clone).destroy();\n    }\n  }]);\n\n  return Overlay;\n}();\n\nexports.default = Overlay;\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.toUpperCaseFirst = toUpperCaseFirst;\nexports.equalsIgnoreCase = equalsIgnoreCase;\nexports.randomString = randomString;\nexports.isPercentValue = isPercentValue;\nexports.substitute = substitute;\nexports.stripTags = stripTags;\n\nvar _mixed = __webpack_require__(16);\n\nvar _number = __webpack_require__(5);\n\n/**\n * Convert string to upper case first letter.\n *\n * @param {String} string String to convert.\n * @returns {String}\n */\nfunction toUpperCaseFirst(string) {\n  return string[0].toUpperCase() + string.substr(1);\n}\n\n/**\n * Compare strings case insensitively.\n *\n * @param {...String} strings Strings to compare.\n * @returns {Boolean}\n */\nfunction equalsIgnoreCase() {\n  var unique = [];\n\n  for (var _len = arguments.length, strings = Array(_len), _key = 0; _key < _len; _key++) {\n    strings[_key] = arguments[_key];\n  }\n\n  var length = strings.length;\n\n  while (length--) {\n    var string = (0, _mixed.stringify)(strings[length]).toLowerCase();\n\n    if (unique.indexOf(string) === -1) {\n      unique.push(string);\n    }\n  }\n\n  return unique.length === 1;\n}\n\n/**\n * Generates a random hex string. Used as namespace for Handsontable instance events.\n *\n * @return {String} Returns 16-long character random string (eq. `'92b1bfc74ec4'`).\n */\nfunction randomString() {\n  function s4() {\n    return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n  }\n\n  return s4() + s4() + s4() + s4();\n}\n\n/**\n * Checks if value is valid percent.\n *\n * @param {String} value\n * @returns {Boolean}\n */\nfunction isPercentValue(value) {\n  return (/^([0-9][0-9]?%$)|(^100%$)/.test(value)\n  );\n}\n\n/**\n * Substitute strings placed beetwen square brackets into value defined in `variables` object. String names defined in\n * square brackets must be the same as property name of `variables` object.\n *\n * @param {String} template Template string.\n * @param {Object} variables Object which contains all available values which can be injected into template.\n * @returns {String}\n */\nfunction substitute(template) {\n  var variables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  return ('' + template).replace(/(?:\\\\)?\\[([^[\\]]+)]/g, function (match, name) {\n    if (match.charAt(0) === '\\\\') {\n      return match.substr(1, match.length - 1);\n    }\n\n    return variables[name] === void 0 ? '' : variables[name];\n  });\n}\n\nvar STRIP_TAGS_REGEX = /<\\/?\\w+\\/?>|<\\w+[\\s|/][^>]*>/gi;\n\n/**\n * Strip any HTML tag from the string.\n *\n * @param  {String} string String to cut HTML from.\n * @return {String}\n */\nfunction stripTags(string) {\n  string += '';\n\n  return string.replace(STRIP_TAGS_REGEX, '');\n}\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(99);\nvar enumBugKeys = __webpack_require__(78);\n\nmodule.exports = Object.keys || function keys(O) {\n  return $keys(O, enumBugKeys);\n};\n\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports) {\n\n// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = staticRegister;\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar collection = exports.collection = new Map();\n\nfunction staticRegister() {\n  var namespace = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'common';\n\n  if (!collection.has(namespace)) {\n    collection.set(namespace, new Map());\n  }\n  var subCollection = collection.get(namespace);\n\n  /**\n   * Register an item to the collection. If the item under the same was exist earlier then this item will be replaced with new one.\n   *\n   * @param {String} name Identification of the item.\n   * @param {*} item Item to save in the collection.\n   */\n  function register(name, item) {\n    subCollection.set(name, item);\n  }\n\n  /**\n   * Retrieve the item from the collection.\n   *\n   * @param {String} name Identification of the item.\n   * @returns {*} Returns item which was saved in the collection.\n   */\n  function getItem(name) {\n    return subCollection.get(name);\n  }\n\n  /**\n   * Check if item under specyfied name is exists.\n   *\n   * @param {String} name Identification of the item.\n   * @returns {Boolean} Returns `true` or `false` depends on if element exists in the collection.\n   */\n  function hasItem(name) {\n    return subCollection.has(name);\n  }\n\n  /**\n   * Retrieve list of names registered from the collection.\n   *\n   * @returns {Array} Returns an array of strings with all names under which objects are stored.\n   */\n  function getNames() {\n    return [].concat(_toConsumableArray(subCollection.keys()));\n  }\n\n  /**\n   * Retrieve all registered values from the collection.\n   *\n   * @returns {Array} Returns an array with all values stored in the collection.\n   */\n  function getValues() {\n    return [].concat(_toConsumableArray(subCollection.values()));\n  }\n\n  return {\n    register: register,\n    getItem: getItem,\n    hasItem: hasItem,\n    getNames: getNames,\n    getValues: getValues\n  };\n}\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.requestAnimationFrame = requestAnimationFrame;\nexports.cancelAnimationFrame = cancelAnimationFrame;\nexports.isTouchSupported = isTouchSupported;\nexports.isWebComponentSupportedNatively = isWebComponentSupportedNatively;\nexports.hasCaptionProblem = hasCaptionProblem;\nexports.getComparisonFunction = getComparisonFunction;\n// https://gist.github.com/paulirish/1579671\nvar lastTime = 0;\nvar vendors = ['ms', 'moz', 'webkit', 'o'];\nvar _requestAnimationFrame = window.requestAnimationFrame;\nvar _cancelAnimationFrame = window.cancelAnimationFrame;\n\nfor (var x = 0; x < vendors.length && !_requestAnimationFrame; ++x) {\n  _requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\n  _cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!_requestAnimationFrame) {\n  _requestAnimationFrame = function _requestAnimationFrame(callback) {\n    var currTime = new Date().getTime();\n    var timeToCall = Math.max(0, 16 - (currTime - lastTime));\n    var id = window.setTimeout(function () {\n      callback(currTime + timeToCall);\n    }, timeToCall);\n    lastTime = currTime + timeToCall;\n\n    return id;\n  };\n}\n\nif (!_cancelAnimationFrame) {\n  _cancelAnimationFrame = function _cancelAnimationFrame(id) {\n    clearTimeout(id);\n  };\n}\n\n/**\n * Polyfill for requestAnimationFrame\n *\n * @param {Function} callback\n * @returns {Number}\n */\nfunction requestAnimationFrame(callback) {\n  return _requestAnimationFrame.call(window, callback);\n}\n\n/**\n * Polyfill for cancelAnimationFrame\n *\n * @param {Number} id\n */\nfunction cancelAnimationFrame(id) {\n  _cancelAnimationFrame.call(window, id);\n}\n\nfunction isTouchSupported() {\n  return 'ontouchstart' in window;\n}\n\n/**\n * Checks if browser is support web components natively\n *\n * @returns {Boolean}\n */\nfunction isWebComponentSupportedNatively() {\n  var test = document.createElement('div');\n\n  return !!(test.createShadowRoot && test.createShadowRoot.toString().match(/\\[native code\\]/));\n}\n\nvar _hasCaptionProblem;\n\nfunction detectCaptionProblem() {\n  var TABLE = document.createElement('TABLE');\n  TABLE.style.borderSpacing = 0;\n  TABLE.style.borderWidth = 0;\n  TABLE.style.padding = 0;\n  var TBODY = document.createElement('TBODY');\n  TABLE.appendChild(TBODY);\n  TBODY.appendChild(document.createElement('TR'));\n  TBODY.firstChild.appendChild(document.createElement('TD'));\n  TBODY.firstChild.firstChild.innerHTML = '<tr><td>t<br>t</td></tr>';\n\n  var CAPTION = document.createElement('CAPTION');\n  CAPTION.innerHTML = 'c<br>c<br>c<br>c';\n  CAPTION.style.padding = 0;\n  CAPTION.style.margin = 0;\n  TABLE.insertBefore(CAPTION, TBODY);\n\n  document.body.appendChild(TABLE);\n  _hasCaptionProblem = TABLE.offsetHeight < 2 * TABLE.lastChild.offsetHeight; // boolean\n  document.body.removeChild(TABLE);\n}\n\nfunction hasCaptionProblem() {\n  if (_hasCaptionProblem === void 0) {\n    detectCaptionProblem();\n  }\n\n  return _hasCaptionProblem;\n}\n\nvar comparisonFunction = void 0;\n\n/**\n * Get string comparison function for sorting purposes. It supports multilingual string comparison base on Internationalization API.\n *\n * @param {String} [language]\n * @param {Object} [options]\n * @returns {*}\n */\nfunction getComparisonFunction(language) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (comparisonFunction) {\n    return comparisonFunction;\n  }\n\n  if ((typeof Intl === 'undefined' ? 'undefined' : _typeof(Intl)) === 'object') {\n    comparisonFunction = new Intl.Collator(language, options).compare;\n  } else if (typeof String.prototype.localeCompare === 'function') {\n    comparisonFunction = function comparisonFunction(a, b) {\n      return ('' + a).localeCompare(b);\n    };\n  } else {\n    comparisonFunction = function comparisonFunction(a, b) {\n      if (a === b) {\n        return 0;\n      }\n\n      return a > b ? -1 : 1;\n    };\n  }\n\n  return comparisonFunction;\n}\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(module) {var require;//! moment.js\n//! version : 2.20.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n;(function (global, factory) {\n     true ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, (function () { 'use strict';\n\nvar hookCallback;\n\nfunction hooks () {\n    return hookCallback.apply(null, arguments);\n}\n\n// This is done to register the method called with moment()\n// without creating circular dependencies.\nfunction setHookCallback (callback) {\n    hookCallback = callback;\n}\n\nfunction isArray(input) {\n    return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n}\n\nfunction isObject(input) {\n    // IE8 will treat undefined and null as object if it wasn't for\n    // input != null\n    return input != null && Object.prototype.toString.call(input) === '[object Object]';\n}\n\nfunction isObjectEmpty(obj) {\n    if (Object.getOwnPropertyNames) {\n        return (Object.getOwnPropertyNames(obj).length === 0);\n    } else {\n        var k;\n        for (k in obj) {\n            if (obj.hasOwnProperty(k)) {\n                return false;\n            }\n        }\n        return true;\n    }\n}\n\nfunction isUndefined(input) {\n    return input === void 0;\n}\n\nfunction isNumber(input) {\n    return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n}\n\nfunction isDate(input) {\n    return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n}\n\nfunction map(arr, fn) {\n    var res = [], i;\n    for (i = 0; i < arr.length; ++i) {\n        res.push(fn(arr[i], i));\n    }\n    return res;\n}\n\nfunction hasOwnProp(a, b) {\n    return Object.prototype.hasOwnProperty.call(a, b);\n}\n\nfunction extend(a, b) {\n    for (var i in b) {\n        if (hasOwnProp(b, i)) {\n            a[i] = b[i];\n        }\n    }\n\n    if (hasOwnProp(b, 'toString')) {\n        a.toString = b.toString;\n    }\n\n    if (hasOwnProp(b, 'valueOf')) {\n        a.valueOf = b.valueOf;\n    }\n\n    return a;\n}\n\nfunction createUTC (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, true).utc();\n}\n\nfunction defaultParsingFlags() {\n    // We need to deep clone this object.\n    return {\n        empty           : false,\n        unusedTokens    : [],\n        unusedInput     : [],\n        overflow        : -2,\n        charsLeftOver   : 0,\n        nullInput       : false,\n        invalidMonth    : null,\n        invalidFormat   : false,\n        userInvalidated : false,\n        iso             : false,\n        parsedDateParts : [],\n        meridiem        : null,\n        rfc2822         : false,\n        weekdayMismatch : false\n    };\n}\n\nfunction getParsingFlags(m) {\n    if (m._pf == null) {\n        m._pf = defaultParsingFlags();\n    }\n    return m._pf;\n}\n\nvar some;\nif (Array.prototype.some) {\n    some = Array.prototype.some;\n} else {\n    some = function (fun) {\n        var t = Object(this);\n        var len = t.length >>> 0;\n\n        for (var i = 0; i < len; i++) {\n            if (i in t && fun.call(this, t[i], i, t)) {\n                return true;\n            }\n        }\n\n        return false;\n    };\n}\n\nfunction isValid(m) {\n    if (m._isValid == null) {\n        var flags = getParsingFlags(m);\n        var parsedParts = some.call(flags.parsedDateParts, function (i) {\n            return i != null;\n        });\n        var isNowValid = !isNaN(m._d.getTime()) &&\n            flags.overflow < 0 &&\n            !flags.empty &&\n            !flags.invalidMonth &&\n            !flags.invalidWeekday &&\n            !flags.weekdayMismatch &&\n            !flags.nullInput &&\n            !flags.invalidFormat &&\n            !flags.userInvalidated &&\n            (!flags.meridiem || (flags.meridiem && parsedParts));\n\n        if (m._strict) {\n            isNowValid = isNowValid &&\n                flags.charsLeftOver === 0 &&\n                flags.unusedTokens.length === 0 &&\n                flags.bigHour === undefined;\n        }\n\n        if (Object.isFrozen == null || !Object.isFrozen(m)) {\n            m._isValid = isNowValid;\n        }\n        else {\n            return isNowValid;\n        }\n    }\n    return m._isValid;\n}\n\nfunction createInvalid (flags) {\n    var m = createUTC(NaN);\n    if (flags != null) {\n        extend(getParsingFlags(m), flags);\n    }\n    else {\n        getParsingFlags(m).userInvalidated = true;\n    }\n\n    return m;\n}\n\n// Plugins that add properties should also add the key here (null value),\n// so we can properly clone ourselves.\nvar momentProperties = hooks.momentProperties = [];\n\nfunction copyConfig(to, from) {\n    var i, prop, val;\n\n    if (!isUndefined(from._isAMomentObject)) {\n        to._isAMomentObject = from._isAMomentObject;\n    }\n    if (!isUndefined(from._i)) {\n        to._i = from._i;\n    }\n    if (!isUndefined(from._f)) {\n        to._f = from._f;\n    }\n    if (!isUndefined(from._l)) {\n        to._l = from._l;\n    }\n    if (!isUndefined(from._strict)) {\n        to._strict = from._strict;\n    }\n    if (!isUndefined(from._tzm)) {\n        to._tzm = from._tzm;\n    }\n    if (!isUndefined(from._isUTC)) {\n        to._isUTC = from._isUTC;\n    }\n    if (!isUndefined(from._offset)) {\n        to._offset = from._offset;\n    }\n    if (!isUndefined(from._pf)) {\n        to._pf = getParsingFlags(from);\n    }\n    if (!isUndefined(from._locale)) {\n        to._locale = from._locale;\n    }\n\n    if (momentProperties.length > 0) {\n        for (i = 0; i < momentProperties.length; i++) {\n            prop = momentProperties[i];\n            val = from[prop];\n            if (!isUndefined(val)) {\n                to[prop] = val;\n            }\n        }\n    }\n\n    return to;\n}\n\nvar updateInProgress = false;\n\n// Moment prototype object\nfunction Moment(config) {\n    copyConfig(this, config);\n    this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n    if (!this.isValid()) {\n        this._d = new Date(NaN);\n    }\n    // Prevent infinite loop in case updateOffset creates new moment\n    // objects.\n    if (updateInProgress === false) {\n        updateInProgress = true;\n        hooks.updateOffset(this);\n        updateInProgress = false;\n    }\n}\n\nfunction isMoment (obj) {\n    return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n}\n\nfunction absFloor (number) {\n    if (number < 0) {\n        // -0 -> 0\n        return Math.ceil(number) || 0;\n    } else {\n        return Math.floor(number);\n    }\n}\n\nfunction toInt(argumentForCoercion) {\n    var coercedNumber = +argumentForCoercion,\n        value = 0;\n\n    if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n        value = absFloor(coercedNumber);\n    }\n\n    return value;\n}\n\n// compare two arrays, return the number of differences\nfunction compareArrays(array1, array2, dontConvert) {\n    var len = Math.min(array1.length, array2.length),\n        lengthDiff = Math.abs(array1.length - array2.length),\n        diffs = 0,\n        i;\n    for (i = 0; i < len; i++) {\n        if ((dontConvert && array1[i] !== array2[i]) ||\n            (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n            diffs++;\n        }\n    }\n    return diffs + lengthDiff;\n}\n\nfunction warn(msg) {\n    if (hooks.suppressDeprecationWarnings === false &&\n            (typeof console !==  'undefined') && console.warn) {\n        console.warn('Deprecation warning: ' + msg);\n    }\n}\n\nfunction deprecate(msg, fn) {\n    var firstTime = true;\n\n    return extend(function () {\n        if (hooks.deprecationHandler != null) {\n            hooks.deprecationHandler(null, msg);\n        }\n        if (firstTime) {\n            var args = [];\n            var arg;\n            for (var i = 0; i < arguments.length; i++) {\n                arg = '';\n                if (typeof arguments[i] === 'object') {\n                    arg += '\\n[' + i + '] ';\n                    for (var key in arguments[0]) {\n                        arg += key + ': ' + arguments[0][key] + ', ';\n                    }\n                    arg = arg.slice(0, -2); // Remove trailing comma and space\n                } else {\n                    arg = arguments[i];\n                }\n                args.push(arg);\n            }\n            warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n            firstTime = false;\n        }\n        return fn.apply(this, arguments);\n    }, fn);\n}\n\nvar deprecations = {};\n\nfunction deprecateSimple(name, msg) {\n    if (hooks.deprecationHandler != null) {\n        hooks.deprecationHandler(name, msg);\n    }\n    if (!deprecations[name]) {\n        warn(msg);\n        deprecations[name] = true;\n    }\n}\n\nhooks.suppressDeprecationWarnings = false;\nhooks.deprecationHandler = null;\n\nfunction isFunction(input) {\n    return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n}\n\nfunction set (config) {\n    var prop, i;\n    for (i in config) {\n        prop = config[i];\n        if (isFunction(prop)) {\n            this[i] = prop;\n        } else {\n            this['_' + i] = prop;\n        }\n    }\n    this._config = config;\n    // Lenient ordinal parsing accepts just a number in addition to\n    // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n    // TODO: Remove \"ordinalParse\" fallback in next major release.\n    this._dayOfMonthOrdinalParseLenient = new RegExp(\n        (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n            '|' + (/\\d{1,2}/).source);\n}\n\nfunction mergeConfigs(parentConfig, childConfig) {\n    var res = extend({}, parentConfig), prop;\n    for (prop in childConfig) {\n        if (hasOwnProp(childConfig, prop)) {\n            if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n                res[prop] = {};\n                extend(res[prop], parentConfig[prop]);\n                extend(res[prop], childConfig[prop]);\n            } else if (childConfig[prop] != null) {\n                res[prop] = childConfig[prop];\n            } else {\n                delete res[prop];\n            }\n        }\n    }\n    for (prop in parentConfig) {\n        if (hasOwnProp(parentConfig, prop) &&\n                !hasOwnProp(childConfig, prop) &&\n                isObject(parentConfig[prop])) {\n            // make sure changes to properties don't modify parent config\n            res[prop] = extend({}, res[prop]);\n        }\n    }\n    return res;\n}\n\nfunction Locale(config) {\n    if (config != null) {\n        this.set(config);\n    }\n}\n\nvar keys;\n\nif (Object.keys) {\n    keys = Object.keys;\n} else {\n    keys = function (obj) {\n        var i, res = [];\n        for (i in obj) {\n            if (hasOwnProp(obj, i)) {\n                res.push(i);\n            }\n        }\n        return res;\n    };\n}\n\nvar defaultCalendar = {\n    sameDay : '[Today at] LT',\n    nextDay : '[Tomorrow at] LT',\n    nextWeek : 'dddd [at] LT',\n    lastDay : '[Yesterday at] LT',\n    lastWeek : '[Last] dddd [at] LT',\n    sameElse : 'L'\n};\n\nfunction calendar (key, mom, now) {\n    var output = this._calendar[key] || this._calendar['sameElse'];\n    return isFunction(output) ? output.call(mom, now) : output;\n}\n\nvar defaultLongDateFormat = {\n    LTS  : 'h:mm:ss A',\n    LT   : 'h:mm A',\n    L    : 'MM/DD/YYYY',\n    LL   : 'MMMM D, YYYY',\n    LLL  : 'MMMM D, YYYY h:mm A',\n    LLLL : 'dddd, MMMM D, YYYY h:mm A'\n};\n\nfunction longDateFormat (key) {\n    var format = this._longDateFormat[key],\n        formatUpper = this._longDateFormat[key.toUpperCase()];\n\n    if (format || !formatUpper) {\n        return format;\n    }\n\n    this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n        return val.slice(1);\n    });\n\n    return this._longDateFormat[key];\n}\n\nvar defaultInvalidDate = 'Invalid date';\n\nfunction invalidDate () {\n    return this._invalidDate;\n}\n\nvar defaultOrdinal = '%d';\nvar defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\nfunction ordinal (number) {\n    return this._ordinal.replace('%d', number);\n}\n\nvar defaultRelativeTime = {\n    future : 'in %s',\n    past   : '%s ago',\n    s  : 'a few seconds',\n    ss : '%d seconds',\n    m  : 'a minute',\n    mm : '%d minutes',\n    h  : 'an hour',\n    hh : '%d hours',\n    d  : 'a day',\n    dd : '%d days',\n    M  : 'a month',\n    MM : '%d months',\n    y  : 'a year',\n    yy : '%d years'\n};\n\nfunction relativeTime (number, withoutSuffix, string, isFuture) {\n    var output = this._relativeTime[string];\n    return (isFunction(output)) ?\n        output(number, withoutSuffix, string, isFuture) :\n        output.replace(/%d/i, number);\n}\n\nfunction pastFuture (diff, output) {\n    var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n    return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n}\n\nvar aliases = {};\n\nfunction addUnitAlias (unit, shorthand) {\n    var lowerCase = unit.toLowerCase();\n    aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n}\n\nfunction normalizeUnits(units) {\n    return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n}\n\nfunction normalizeObjectUnits(inputObject) {\n    var normalizedInput = {},\n        normalizedProp,\n        prop;\n\n    for (prop in inputObject) {\n        if (hasOwnProp(inputObject, prop)) {\n            normalizedProp = normalizeUnits(prop);\n            if (normalizedProp) {\n                normalizedInput[normalizedProp] = inputObject[prop];\n            }\n        }\n    }\n\n    return normalizedInput;\n}\n\nvar priorities = {};\n\nfunction addUnitPriority(unit, priority) {\n    priorities[unit] = priority;\n}\n\nfunction getPrioritizedUnits(unitsObj) {\n    var units = [];\n    for (var u in unitsObj) {\n        units.push({unit: u, priority: priorities[u]});\n    }\n    units.sort(function (a, b) {\n        return a.priority - b.priority;\n    });\n    return units;\n}\n\nfunction zeroFill(number, targetLength, forceSign) {\n    var absNumber = '' + Math.abs(number),\n        zerosToFill = targetLength - absNumber.length,\n        sign = number >= 0;\n    return (sign ? (forceSign ? '+' : '') : '-') +\n        Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n}\n\nvar formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\nvar localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\nvar formatFunctions = {};\n\nvar formatTokenFunctions = {};\n\n// token:    'M'\n// padded:   ['MM', 2]\n// ordinal:  'Mo'\n// callback: function () { this.month() + 1 }\nfunction addFormatToken (token, padded, ordinal, callback) {\n    var func = callback;\n    if (typeof callback === 'string') {\n        func = function () {\n            return this[callback]();\n        };\n    }\n    if (token) {\n        formatTokenFunctions[token] = func;\n    }\n    if (padded) {\n        formatTokenFunctions[padded[0]] = function () {\n            return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n        };\n    }\n    if (ordinal) {\n        formatTokenFunctions[ordinal] = function () {\n            return this.localeData().ordinal(func.apply(this, arguments), token);\n        };\n    }\n}\n\nfunction removeFormattingTokens(input) {\n    if (input.match(/\\[[\\s\\S]/)) {\n        return input.replace(/^\\[|\\]$/g, '');\n    }\n    return input.replace(/\\\\/g, '');\n}\n\nfunction makeFormatFunction(format) {\n    var array = format.match(formattingTokens), i, length;\n\n    for (i = 0, length = array.length; i < length; i++) {\n        if (formatTokenFunctions[array[i]]) {\n            array[i] = formatTokenFunctions[array[i]];\n        } else {\n            array[i] = removeFormattingTokens(array[i]);\n        }\n    }\n\n    return function (mom) {\n        var output = '', i;\n        for (i = 0; i < length; i++) {\n            output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n        }\n        return output;\n    };\n}\n\n// format date using native date object\nfunction formatMoment(m, format) {\n    if (!m.isValid()) {\n        return m.localeData().invalidDate();\n    }\n\n    format = expandFormat(format, m.localeData());\n    formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n    return formatFunctions[format](m);\n}\n\nfunction expandFormat(format, locale) {\n    var i = 5;\n\n    function replaceLongDateFormatTokens(input) {\n        return locale.longDateFormat(input) || input;\n    }\n\n    localFormattingTokens.lastIndex = 0;\n    while (i >= 0 && localFormattingTokens.test(format)) {\n        format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n        localFormattingTokens.lastIndex = 0;\n        i -= 1;\n    }\n\n    return format;\n}\n\nvar match1         = /\\d/;            //       0 - 9\nvar match2         = /\\d\\d/;          //      00 - 99\nvar match3         = /\\d{3}/;         //     000 - 999\nvar match4         = /\\d{4}/;         //    0000 - 9999\nvar match6         = /[+-]?\\d{6}/;    // -999999 - 999999\nvar match1to2      = /\\d\\d?/;         //       0 - 99\nvar match3to4      = /\\d\\d\\d\\d?/;     //     999 - 9999\nvar match5to6      = /\\d\\d\\d\\d\\d\\d?/; //   99999 - 999999\nvar match1to3      = /\\d{1,3}/;       //       0 - 999\nvar match1to4      = /\\d{1,4}/;       //       0 - 9999\nvar match1to6      = /[+-]?\\d{1,6}/;  // -999999 - 999999\n\nvar matchUnsigned  = /\\d+/;           //       0 - inf\nvar matchSigned    = /[+-]?\\d+/;      //    -inf - inf\n\nvar matchOffset    = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\nvar matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\nvar matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n// any word (or two) characters or numbers including two/three word month in arabic.\n// includes scottish gaelic two word and hyphenated months\nvar matchWord = /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i;\n\n\nvar regexes = {};\n\nfunction addRegexToken (token, regex, strictRegex) {\n    regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n        return (isStrict && strictRegex) ? strictRegex : regex;\n    };\n}\n\nfunction getParseRegexForToken (token, config) {\n    if (!hasOwnProp(regexes, token)) {\n        return new RegExp(unescapeFormat(token));\n    }\n\n    return regexes[token](config._strict, config._locale);\n}\n\n// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\nfunction unescapeFormat(s) {\n    return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n        return p1 || p2 || p3 || p4;\n    }));\n}\n\nfunction regexEscape(s) {\n    return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nvar tokens = {};\n\nfunction addParseToken (token, callback) {\n    var i, func = callback;\n    if (typeof token === 'string') {\n        token = [token];\n    }\n    if (isNumber(callback)) {\n        func = function (input, array) {\n            array[callback] = toInt(input);\n        };\n    }\n    for (i = 0; i < token.length; i++) {\n        tokens[token[i]] = func;\n    }\n}\n\nfunction addWeekParseToken (token, callback) {\n    addParseToken(token, function (input, array, config, token) {\n        config._w = config._w || {};\n        callback(input, config._w, config, token);\n    });\n}\n\nfunction addTimeToArrayFromToken(token, input, config) {\n    if (input != null && hasOwnProp(tokens, token)) {\n        tokens[token](input, config._a, config, token);\n    }\n}\n\nvar YEAR = 0;\nvar MONTH = 1;\nvar DATE = 2;\nvar HOUR = 3;\nvar MINUTE = 4;\nvar SECOND = 5;\nvar MILLISECOND = 6;\nvar WEEK = 7;\nvar WEEKDAY = 8;\n\n// FORMATTING\n\naddFormatToken('Y', 0, 0, function () {\n    var y = this.year();\n    return y <= 9999 ? '' + y : '+' + y;\n});\n\naddFormatToken(0, ['YY', 2], 0, function () {\n    return this.year() % 100;\n});\n\naddFormatToken(0, ['YYYY',   4],       0, 'year');\naddFormatToken(0, ['YYYYY',  5],       0, 'year');\naddFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n// ALIASES\n\naddUnitAlias('year', 'y');\n\n// PRIORITIES\n\naddUnitPriority('year', 1);\n\n// PARSING\n\naddRegexToken('Y',      matchSigned);\naddRegexToken('YY',     match1to2, match2);\naddRegexToken('YYYY',   match1to4, match4);\naddRegexToken('YYYYY',  match1to6, match6);\naddRegexToken('YYYYYY', match1to6, match6);\n\naddParseToken(['YYYYY', 'YYYYYY'], YEAR);\naddParseToken('YYYY', function (input, array) {\n    array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n});\naddParseToken('YY', function (input, array) {\n    array[YEAR] = hooks.parseTwoDigitYear(input);\n});\naddParseToken('Y', function (input, array) {\n    array[YEAR] = parseInt(input, 10);\n});\n\n// HELPERS\n\nfunction daysInYear(year) {\n    return isLeapYear(year) ? 366 : 365;\n}\n\nfunction isLeapYear(year) {\n    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n// HOOKS\n\nhooks.parseTwoDigitYear = function (input) {\n    return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n};\n\n// MOMENTS\n\nvar getSetYear = makeGetSet('FullYear', true);\n\nfunction getIsLeapYear () {\n    return isLeapYear(this.year());\n}\n\nfunction makeGetSet (unit, keepTime) {\n    return function (value) {\n        if (value != null) {\n            set$1(this, unit, value);\n            hooks.updateOffset(this, keepTime);\n            return this;\n        } else {\n            return get(this, unit);\n        }\n    };\n}\n\nfunction get (mom, unit) {\n    return mom.isValid() ?\n        mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n}\n\nfunction set$1 (mom, unit, value) {\n    if (mom.isValid() && !isNaN(value)) {\n        if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {\n            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));\n        }\n        else {\n            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n        }\n    }\n}\n\n// MOMENTS\n\nfunction stringGet (units) {\n    units = normalizeUnits(units);\n    if (isFunction(this[units])) {\n        return this[units]();\n    }\n    return this;\n}\n\n\nfunction stringSet (units, value) {\n    if (typeof units === 'object') {\n        units = normalizeObjectUnits(units);\n        var prioritized = getPrioritizedUnits(units);\n        for (var i = 0; i < prioritized.length; i++) {\n            this[prioritized[i].unit](units[prioritized[i].unit]);\n        }\n    } else {\n        units = normalizeUnits(units);\n        if (isFunction(this[units])) {\n            return this[units](value);\n        }\n    }\n    return this;\n}\n\nfunction mod(n, x) {\n    return ((n % x) + x) % x;\n}\n\nvar indexOf;\n\nif (Array.prototype.indexOf) {\n    indexOf = Array.prototype.indexOf;\n} else {\n    indexOf = function (o) {\n        // I know\n        var i;\n        for (i = 0; i < this.length; ++i) {\n            if (this[i] === o) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\n\nfunction daysInMonth(year, month) {\n    if (isNaN(year) || isNaN(month)) {\n        return NaN;\n    }\n    var modMonth = mod(month, 12);\n    year += (month - modMonth) / 12;\n    return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);\n}\n\n// FORMATTING\n\naddFormatToken('M', ['MM', 2], 'Mo', function () {\n    return this.month() + 1;\n});\n\naddFormatToken('MMM', 0, 0, function (format) {\n    return this.localeData().monthsShort(this, format);\n});\n\naddFormatToken('MMMM', 0, 0, function (format) {\n    return this.localeData().months(this, format);\n});\n\n// ALIASES\n\naddUnitAlias('month', 'M');\n\n// PRIORITY\n\naddUnitPriority('month', 8);\n\n// PARSING\n\naddRegexToken('M',    match1to2);\naddRegexToken('MM',   match1to2, match2);\naddRegexToken('MMM',  function (isStrict, locale) {\n    return locale.monthsShortRegex(isStrict);\n});\naddRegexToken('MMMM', function (isStrict, locale) {\n    return locale.monthsRegex(isStrict);\n});\n\naddParseToken(['M', 'MM'], function (input, array) {\n    array[MONTH] = toInt(input) - 1;\n});\n\naddParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n    var month = config._locale.monthsParse(input, token, config._strict);\n    // if we didn't find a month name, mark the date as invalid.\n    if (month != null) {\n        array[MONTH] = month;\n    } else {\n        getParsingFlags(config).invalidMonth = input;\n    }\n});\n\n// LOCALES\n\nvar MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\nvar defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\nfunction localeMonths (m, format) {\n    if (!m) {\n        return isArray(this._months) ? this._months :\n            this._months['standalone'];\n    }\n    return isArray(this._months) ? this._months[m.month()] :\n        this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nvar defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\nfunction localeMonthsShort (m, format) {\n    if (!m) {\n        return isArray(this._monthsShort) ? this._monthsShort :\n            this._monthsShort['standalone'];\n    }\n    return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n        this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nfunction handleStrictParse(monthName, format, strict) {\n    var i, ii, mom, llc = monthName.toLocaleLowerCase();\n    if (!this._monthsParse) {\n        // this is not used\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n        for (i = 0; i < 12; ++i) {\n            mom = createUTC([2000, i]);\n            this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n            this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'MMM') {\n            ii = indexOf.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'MMM') {\n            ii = indexOf.call(this._shortMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._longMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeMonthsParse (monthName, format, strict) {\n    var i, mom, regex;\n\n    if (this._monthsParseExact) {\n        return handleStrictParse.call(this, monthName, format, strict);\n    }\n\n    if (!this._monthsParse) {\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n    }\n\n    // TODO: add sorting\n    // Sorting makes sure if one month (or abbr) is a prefix of another\n    // see sorting in computeMonthsParse\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        if (strict && !this._longMonthsParse[i]) {\n            this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n            this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n        }\n        if (!strict && !this._monthsParse[i]) {\n            regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n            this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (!strict && this._monthsParse[i].test(monthName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction setMonth (mom, value) {\n    var dayOfMonth;\n\n    if (!mom.isValid()) {\n        // No op\n        return mom;\n    }\n\n    if (typeof value === 'string') {\n        if (/^\\d+$/.test(value)) {\n            value = toInt(value);\n        } else {\n            value = mom.localeData().monthsParse(value);\n            // TODO: Another silent failure?\n            if (!isNumber(value)) {\n                return mom;\n            }\n        }\n    }\n\n    dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n    mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n    return mom;\n}\n\nfunction getSetMonth (value) {\n    if (value != null) {\n        setMonth(this, value);\n        hooks.updateOffset(this, true);\n        return this;\n    } else {\n        return get(this, 'Month');\n    }\n}\n\nfunction getDaysInMonth () {\n    return daysInMonth(this.year(), this.month());\n}\n\nvar defaultMonthsShortRegex = matchWord;\nfunction monthsShortRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsShortStrictRegex;\n        } else {\n            return this._monthsShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsShortRegex')) {\n            this._monthsShortRegex = defaultMonthsShortRegex;\n        }\n        return this._monthsShortStrictRegex && isStrict ?\n            this._monthsShortStrictRegex : this._monthsShortRegex;\n    }\n}\n\nvar defaultMonthsRegex = matchWord;\nfunction monthsRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsStrictRegex;\n        } else {\n            return this._monthsRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            this._monthsRegex = defaultMonthsRegex;\n        }\n        return this._monthsStrictRegex && isStrict ?\n            this._monthsStrictRegex : this._monthsRegex;\n    }\n}\n\nfunction computeMonthsParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom;\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        shortPieces.push(this.monthsShort(mom, ''));\n        longPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.monthsShort(mom, ''));\n    }\n    // Sorting makes sure if one month (or abbr) is a prefix of another it\n    // will match the longer piece.\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 12; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n    }\n    for (i = 0; i < 24; i++) {\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._monthsShortRegex = this._monthsRegex;\n    this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n}\n\nfunction createDate (y, m, d, h, M, s, ms) {\n    // can't just apply() to create a date:\n    // https://stackoverflow.com/q/181348\n    var date = new Date(y, m, d, h, M, s, ms);\n\n    // the date constructor remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n        date.setFullYear(y);\n    }\n    return date;\n}\n\nfunction createUTCDate (y) {\n    var date = new Date(Date.UTC.apply(null, arguments));\n\n    // the Date.UTC function remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n        date.setUTCFullYear(y);\n    }\n    return date;\n}\n\n// start-of-first-week - start-of-year\nfunction firstWeekOffset(year, dow, doy) {\n    var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n        fwd = 7 + dow - doy,\n        // first-week day local weekday -- which local weekday is fwd\n        fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n    return -fwdlw + fwd - 1;\n}\n\n// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\nfunction dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n    var localWeekday = (7 + weekday - dow) % 7,\n        weekOffset = firstWeekOffset(year, dow, doy),\n        dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n        resYear, resDayOfYear;\n\n    if (dayOfYear <= 0) {\n        resYear = year - 1;\n        resDayOfYear = daysInYear(resYear) + dayOfYear;\n    } else if (dayOfYear > daysInYear(year)) {\n        resYear = year + 1;\n        resDayOfYear = dayOfYear - daysInYear(year);\n    } else {\n        resYear = year;\n        resDayOfYear = dayOfYear;\n    }\n\n    return {\n        year: resYear,\n        dayOfYear: resDayOfYear\n    };\n}\n\nfunction weekOfYear(mom, dow, doy) {\n    var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n        week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n        resWeek, resYear;\n\n    if (week < 1) {\n        resYear = mom.year() - 1;\n        resWeek = week + weeksInYear(resYear, dow, doy);\n    } else if (week > weeksInYear(mom.year(), dow, doy)) {\n        resWeek = week - weeksInYear(mom.year(), dow, doy);\n        resYear = mom.year() + 1;\n    } else {\n        resYear = mom.year();\n        resWeek = week;\n    }\n\n    return {\n        week: resWeek,\n        year: resYear\n    };\n}\n\nfunction weeksInYear(year, dow, doy) {\n    var weekOffset = firstWeekOffset(year, dow, doy),\n        weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n    return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n}\n\n// FORMATTING\n\naddFormatToken('w', ['ww', 2], 'wo', 'week');\naddFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n// ALIASES\n\naddUnitAlias('week', 'w');\naddUnitAlias('isoWeek', 'W');\n\n// PRIORITIES\n\naddUnitPriority('week', 5);\naddUnitPriority('isoWeek', 5);\n\n// PARSING\n\naddRegexToken('w',  match1to2);\naddRegexToken('ww', match1to2, match2);\naddRegexToken('W',  match1to2);\naddRegexToken('WW', match1to2, match2);\n\naddWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n    week[token.substr(0, 1)] = toInt(input);\n});\n\n// HELPERS\n\n// LOCALES\n\nfunction localeWeek (mom) {\n    return weekOfYear(mom, this._week.dow, this._week.doy).week;\n}\n\nvar defaultLocaleWeek = {\n    dow : 0, // Sunday is the first day of the week.\n    doy : 6  // The week that contains Jan 1st is the first week of the year.\n};\n\nfunction localeFirstDayOfWeek () {\n    return this._week.dow;\n}\n\nfunction localeFirstDayOfYear () {\n    return this._week.doy;\n}\n\n// MOMENTS\n\nfunction getSetWeek (input) {\n    var week = this.localeData().week(this);\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\nfunction getSetISOWeek (input) {\n    var week = weekOfYear(this, 1, 4).week;\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\n// FORMATTING\n\naddFormatToken('d', 0, 'do', 'day');\n\naddFormatToken('dd', 0, 0, function (format) {\n    return this.localeData().weekdaysMin(this, format);\n});\n\naddFormatToken('ddd', 0, 0, function (format) {\n    return this.localeData().weekdaysShort(this, format);\n});\n\naddFormatToken('dddd', 0, 0, function (format) {\n    return this.localeData().weekdays(this, format);\n});\n\naddFormatToken('e', 0, 0, 'weekday');\naddFormatToken('E', 0, 0, 'isoWeekday');\n\n// ALIASES\n\naddUnitAlias('day', 'd');\naddUnitAlias('weekday', 'e');\naddUnitAlias('isoWeekday', 'E');\n\n// PRIORITY\naddUnitPriority('day', 11);\naddUnitPriority('weekday', 11);\naddUnitPriority('isoWeekday', 11);\n\n// PARSING\n\naddRegexToken('d',    match1to2);\naddRegexToken('e',    match1to2);\naddRegexToken('E',    match1to2);\naddRegexToken('dd',   function (isStrict, locale) {\n    return locale.weekdaysMinRegex(isStrict);\n});\naddRegexToken('ddd',   function (isStrict, locale) {\n    return locale.weekdaysShortRegex(isStrict);\n});\naddRegexToken('dddd',   function (isStrict, locale) {\n    return locale.weekdaysRegex(isStrict);\n});\n\naddWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n    var weekday = config._locale.weekdaysParse(input, token, config._strict);\n    // if we didn't get a weekday name, mark the date as invalid\n    if (weekday != null) {\n        week.d = weekday;\n    } else {\n        getParsingFlags(config).invalidWeekday = input;\n    }\n});\n\naddWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n    week[token] = toInt(input);\n});\n\n// HELPERS\n\nfunction parseWeekday(input, locale) {\n    if (typeof input !== 'string') {\n        return input;\n    }\n\n    if (!isNaN(input)) {\n        return parseInt(input, 10);\n    }\n\n    input = locale.weekdaysParse(input);\n    if (typeof input === 'number') {\n        return input;\n    }\n\n    return null;\n}\n\nfunction parseIsoWeekday(input, locale) {\n    if (typeof input === 'string') {\n        return locale.weekdaysParse(input) % 7 || 7;\n    }\n    return isNaN(input) ? null : input;\n}\n\n// LOCALES\n\nvar defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\nfunction localeWeekdays (m, format) {\n    if (!m) {\n        return isArray(this._weekdays) ? this._weekdays :\n            this._weekdays['standalone'];\n    }\n    return isArray(this._weekdays) ? this._weekdays[m.day()] :\n        this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n}\n\nvar defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\nfunction localeWeekdaysShort (m) {\n    return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n}\n\nvar defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\nfunction localeWeekdaysMin (m) {\n    return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n}\n\nfunction handleStrictParse$1(weekdayName, format, strict) {\n    var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._minWeekdaysParse = [];\n\n        for (i = 0; i < 7; ++i) {\n            mom = createUTC([2000, 1]).day(i);\n            this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n            this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n            this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'dddd') {\n            ii = indexOf.call(this._weekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'dddd') {\n            ii = indexOf.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeWeekdaysParse (weekdayName, format, strict) {\n    var i, mom, regex;\n\n    if (this._weekdaysParseExact) {\n        return handleStrictParse$1.call(this, weekdayName, format, strict);\n    }\n\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._minWeekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._fullWeekdaysParse = [];\n    }\n\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n\n        mom = createUTC([2000, 1]).day(i);\n        if (strict && !this._fullWeekdaysParse[i]) {\n            this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n        }\n        if (!this._weekdaysParse[i]) {\n            regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n            this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction getSetDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n    if (input != null) {\n        input = parseWeekday(input, this.localeData());\n        return this.add(input - day, 'd');\n    } else {\n        return day;\n    }\n}\n\nfunction getSetLocaleDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n    return input == null ? weekday : this.add(input - weekday, 'd');\n}\n\nfunction getSetISODayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n\n    // behaves the same as moment#day except\n    // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n    // as a setter, sunday should belong to the previous week.\n\n    if (input != null) {\n        var weekday = parseIsoWeekday(input, this.localeData());\n        return this.day(this.day() % 7 ? weekday : weekday - 7);\n    } else {\n        return this.day() || 7;\n    }\n}\n\nvar defaultWeekdaysRegex = matchWord;\nfunction weekdaysRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysStrictRegex;\n        } else {\n            return this._weekdaysRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            this._weekdaysRegex = defaultWeekdaysRegex;\n        }\n        return this._weekdaysStrictRegex && isStrict ?\n            this._weekdaysStrictRegex : this._weekdaysRegex;\n    }\n}\n\nvar defaultWeekdaysShortRegex = matchWord;\nfunction weekdaysShortRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysShortStrictRegex;\n        } else {\n            return this._weekdaysShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n            this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n        }\n        return this._weekdaysShortStrictRegex && isStrict ?\n            this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n    }\n}\n\nvar defaultWeekdaysMinRegex = matchWord;\nfunction weekdaysMinRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysMinStrictRegex;\n        } else {\n            return this._weekdaysMinRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n            this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n        }\n        return this._weekdaysMinStrictRegex && isStrict ?\n            this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n    }\n}\n\n\nfunction computeWeekdaysParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom, minp, shortp, longp;\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, 1]).day(i);\n        minp = this.weekdaysMin(mom, '');\n        shortp = this.weekdaysShort(mom, '');\n        longp = this.weekdays(mom, '');\n        minPieces.push(minp);\n        shortPieces.push(shortp);\n        longPieces.push(longp);\n        mixedPieces.push(minp);\n        mixedPieces.push(shortp);\n        mixedPieces.push(longp);\n    }\n    // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n    // will match the longer piece.\n    minPieces.sort(cmpLenRev);\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 7; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._weekdaysShortRegex = this._weekdaysRegex;\n    this._weekdaysMinRegex = this._weekdaysRegex;\n\n    this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n    this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n}\n\n// FORMATTING\n\nfunction hFormat() {\n    return this.hours() % 12 || 12;\n}\n\nfunction kFormat() {\n    return this.hours() || 24;\n}\n\naddFormatToken('H', ['HH', 2], 0, 'hour');\naddFormatToken('h', ['hh', 2], 0, hFormat);\naddFormatToken('k', ['kk', 2], 0, kFormat);\n\naddFormatToken('hmm', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('hmmss', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\naddFormatToken('Hmm', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('Hmmss', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\nfunction meridiem (token, lowercase) {\n    addFormatToken(token, 0, 0, function () {\n        return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n    });\n}\n\nmeridiem('a', true);\nmeridiem('A', false);\n\n// ALIASES\n\naddUnitAlias('hour', 'h');\n\n// PRIORITY\naddUnitPriority('hour', 13);\n\n// PARSING\n\nfunction matchMeridiem (isStrict, locale) {\n    return locale._meridiemParse;\n}\n\naddRegexToken('a',  matchMeridiem);\naddRegexToken('A',  matchMeridiem);\naddRegexToken('H',  match1to2);\naddRegexToken('h',  match1to2);\naddRegexToken('k',  match1to2);\naddRegexToken('HH', match1to2, match2);\naddRegexToken('hh', match1to2, match2);\naddRegexToken('kk', match1to2, match2);\n\naddRegexToken('hmm', match3to4);\naddRegexToken('hmmss', match5to6);\naddRegexToken('Hmm', match3to4);\naddRegexToken('Hmmss', match5to6);\n\naddParseToken(['H', 'HH'], HOUR);\naddParseToken(['k', 'kk'], function (input, array, config) {\n    var kInput = toInt(input);\n    array[HOUR] = kInput === 24 ? 0 : kInput;\n});\naddParseToken(['a', 'A'], function (input, array, config) {\n    config._isPm = config._locale.isPM(input);\n    config._meridiem = input;\n});\naddParseToken(['h', 'hh'], function (input, array, config) {\n    array[HOUR] = toInt(input);\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('Hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n});\naddParseToken('Hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n});\n\n// LOCALES\n\nfunction localeIsPM (input) {\n    // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n    // Using charAt should be more compatible.\n    return ((input + '').toLowerCase().charAt(0) === 'p');\n}\n\nvar defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\nfunction localeMeridiem (hours, minutes, isLower) {\n    if (hours > 11) {\n        return isLower ? 'pm' : 'PM';\n    } else {\n        return isLower ? 'am' : 'AM';\n    }\n}\n\n\n// MOMENTS\n\n// Setting the hour should keep the time, because the user explicitly\n// specified which hour he wants. So trying to maintain the same hour (in\n// a new timezone) makes sense. Adding/subtracting hours does not follow\n// this rule.\nvar getSetHour = makeGetSet('Hours', true);\n\n// months\n// week\n// weekdays\n// meridiem\nvar baseConfig = {\n    calendar: defaultCalendar,\n    longDateFormat: defaultLongDateFormat,\n    invalidDate: defaultInvalidDate,\n    ordinal: defaultOrdinal,\n    dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n    relativeTime: defaultRelativeTime,\n\n    months: defaultLocaleMonths,\n    monthsShort: defaultLocaleMonthsShort,\n\n    week: defaultLocaleWeek,\n\n    weekdays: defaultLocaleWeekdays,\n    weekdaysMin: defaultLocaleWeekdaysMin,\n    weekdaysShort: defaultLocaleWeekdaysShort,\n\n    meridiemParse: defaultLocaleMeridiemParse\n};\n\n// internal storage for locale config files\nvar locales = {};\nvar localeFamilies = {};\nvar globalLocale;\n\nfunction normalizeLocale(key) {\n    return key ? key.toLowerCase().replace('_', '-') : key;\n}\n\n// pick the locale from the array\n// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\nfunction chooseLocale(names) {\n    var i = 0, j, next, locale, split;\n\n    while (i < names.length) {\n        split = normalizeLocale(names[i]).split('-');\n        j = split.length;\n        next = normalizeLocale(names[i + 1]);\n        next = next ? next.split('-') : null;\n        while (j > 0) {\n            locale = loadLocale(split.slice(0, j).join('-'));\n            if (locale) {\n                return locale;\n            }\n            if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n                //the next array item is better than a shallower substring of this one\n                break;\n            }\n            j--;\n        }\n        i++;\n    }\n    return null;\n}\n\nfunction loadLocale(name) {\n    var oldLocale = null;\n    // TODO: Find a better way to register and load all the locales in Node\n    if (!locales[name] && (typeof module !== 'undefined') &&\n            module && module.exports) {\n        try {\n            oldLocale = globalLocale._abbr;\n            var aliasedRequire = require;\n            __webpack_require__(350)(\"./\" + name);\n            getSetGlobalLocale(oldLocale);\n        } catch (e) {}\n    }\n    return locales[name];\n}\n\n// This function will load locale and then set the global locale.  If\n// no arguments are passed in, it will simply return the current global\n// locale key.\nfunction getSetGlobalLocale (key, values) {\n    var data;\n    if (key) {\n        if (isUndefined(values)) {\n            data = getLocale(key);\n        }\n        else {\n            data = defineLocale(key, values);\n        }\n\n        if (data) {\n            // moment.duration._locale = moment._locale = data;\n            globalLocale = data;\n        }\n    }\n\n    return globalLocale._abbr;\n}\n\nfunction defineLocale (name, config) {\n    if (config !== null) {\n        var parentConfig = baseConfig;\n        config.abbr = name;\n        if (locales[name] != null) {\n            deprecateSimple('defineLocaleOverride',\n                    'use moment.updateLocale(localeName, config) to change ' +\n                    'an existing locale. moment.defineLocale(localeName, ' +\n                    'config) should only be used for creating a new locale ' +\n                    'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n            parentConfig = locales[name]._config;\n        } else if (config.parentLocale != null) {\n            if (locales[config.parentLocale] != null) {\n                parentConfig = locales[config.parentLocale]._config;\n            } else {\n                if (!localeFamilies[config.parentLocale]) {\n                    localeFamilies[config.parentLocale] = [];\n                }\n                localeFamilies[config.parentLocale].push({\n                    name: name,\n                    config: config\n                });\n                return null;\n            }\n        }\n        locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n        if (localeFamilies[name]) {\n            localeFamilies[name].forEach(function (x) {\n                defineLocale(x.name, x.config);\n            });\n        }\n\n        // backwards compat for now: also set the locale\n        // make sure we set the locale AFTER all child locales have been\n        // created, so we won't end up with the child locale set.\n        getSetGlobalLocale(name);\n\n\n        return locales[name];\n    } else {\n        // useful for testing\n        delete locales[name];\n        return null;\n    }\n}\n\nfunction updateLocale(name, config) {\n    if (config != null) {\n        var locale, tmpLocale, parentConfig = baseConfig;\n        // MERGE\n        tmpLocale = loadLocale(name);\n        if (tmpLocale != null) {\n            parentConfig = tmpLocale._config;\n        }\n        config = mergeConfigs(parentConfig, config);\n        locale = new Locale(config);\n        locale.parentLocale = locales[name];\n        locales[name] = locale;\n\n        // backwards compat for now: also set the locale\n        getSetGlobalLocale(name);\n    } else {\n        // pass null for config to unupdate, useful for tests\n        if (locales[name] != null) {\n            if (locales[name].parentLocale != null) {\n                locales[name] = locales[name].parentLocale;\n            } else if (locales[name] != null) {\n                delete locales[name];\n            }\n        }\n    }\n    return locales[name];\n}\n\n// returns locale data\nfunction getLocale (key) {\n    var locale;\n\n    if (key && key._locale && key._locale._abbr) {\n        key = key._locale._abbr;\n    }\n\n    if (!key) {\n        return globalLocale;\n    }\n\n    if (!isArray(key)) {\n        //short-circuit everything else\n        locale = loadLocale(key);\n        if (locale) {\n            return locale;\n        }\n        key = [key];\n    }\n\n    return chooseLocale(key);\n}\n\nfunction listLocales() {\n    return keys(locales);\n}\n\nfunction checkOverflow (m) {\n    var overflow;\n    var a = m._a;\n\n    if (a && getParsingFlags(m).overflow === -2) {\n        overflow =\n            a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :\n            a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n            a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n            a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :\n            a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :\n            a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n            -1;\n\n        if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n            overflow = DATE;\n        }\n        if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n            overflow = WEEK;\n        }\n        if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n            overflow = WEEKDAY;\n        }\n\n        getParsingFlags(m).overflow = overflow;\n    }\n\n    return m;\n}\n\n// Pick the first defined of two or three arguments.\nfunction defaults(a, b, c) {\n    if (a != null) {\n        return a;\n    }\n    if (b != null) {\n        return b;\n    }\n    return c;\n}\n\nfunction currentDateArray(config) {\n    // hooks is actually the exported moment object\n    var nowValue = new Date(hooks.now());\n    if (config._useUTC) {\n        return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n    }\n    return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n}\n\n// convert an array to a date.\n// the array should mirror the parameters below\n// note: all values past the year are optional and will default to the lowest possible value.\n// [year, month, day , hour, minute, second, millisecond]\nfunction configFromArray (config) {\n    var i, date, input = [], currentDate, expectedWeekday, yearToUse;\n\n    if (config._d) {\n        return;\n    }\n\n    currentDate = currentDateArray(config);\n\n    //compute day of the year from weeks and weekdays\n    if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n        dayOfYearFromWeekInfo(config);\n    }\n\n    //if the day of the year is set, figure out what it is\n    if (config._dayOfYear != null) {\n        yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n        if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n            getParsingFlags(config)._overflowDayOfYear = true;\n        }\n\n        date = createUTCDate(yearToUse, 0, config._dayOfYear);\n        config._a[MONTH] = date.getUTCMonth();\n        config._a[DATE] = date.getUTCDate();\n    }\n\n    // Default to current date.\n    // * if no year, month, day of month are given, default to today\n    // * if day of month is given, default month and year\n    // * if month is given, default only year\n    // * if year is given, don't default anything\n    for (i = 0; i < 3 && config._a[i] == null; ++i) {\n        config._a[i] = input[i] = currentDate[i];\n    }\n\n    // Zero out whatever was not defaulted, including time\n    for (; i < 7; i++) {\n        config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n    }\n\n    // Check for 24:00:00.000\n    if (config._a[HOUR] === 24 &&\n            config._a[MINUTE] === 0 &&\n            config._a[SECOND] === 0 &&\n            config._a[MILLISECOND] === 0) {\n        config._nextDay = true;\n        config._a[HOUR] = 0;\n    }\n\n    config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n    expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();\n\n    // Apply timezone offset from input. The actual utcOffset can be changed\n    // with parseZone.\n    if (config._tzm != null) {\n        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n    }\n\n    if (config._nextDay) {\n        config._a[HOUR] = 24;\n    }\n\n    // check for mismatching day of week\n    if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {\n        getParsingFlags(config).weekdayMismatch = true;\n    }\n}\n\nfunction dayOfYearFromWeekInfo(config) {\n    var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n    w = config._w;\n    if (w.GG != null || w.W != null || w.E != null) {\n        dow = 1;\n        doy = 4;\n\n        // TODO: We need to take the current isoWeekYear, but that depends on\n        // how we interpret now (local, utc, fixed offset). So create\n        // a now version of current config (take local/utc/offset flags, and\n        // create now).\n        weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n        week = defaults(w.W, 1);\n        weekday = defaults(w.E, 1);\n        if (weekday < 1 || weekday > 7) {\n            weekdayOverflow = true;\n        }\n    } else {\n        dow = config._locale._week.dow;\n        doy = config._locale._week.doy;\n\n        var curWeek = weekOfYear(createLocal(), dow, doy);\n\n        weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n        // Default to current week.\n        week = defaults(w.w, curWeek.week);\n\n        if (w.d != null) {\n            // weekday -- low day numbers are considered next week\n            weekday = w.d;\n            if (weekday < 0 || weekday > 6) {\n                weekdayOverflow = true;\n            }\n        } else if (w.e != null) {\n            // local weekday -- counting starts from begining of week\n            weekday = w.e + dow;\n            if (w.e < 0 || w.e > 6) {\n                weekdayOverflow = true;\n            }\n        } else {\n            // default to begining of week\n            weekday = dow;\n        }\n    }\n    if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n        getParsingFlags(config)._overflowWeeks = true;\n    } else if (weekdayOverflow != null) {\n        getParsingFlags(config)._overflowWeekday = true;\n    } else {\n        temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n        config._a[YEAR] = temp.year;\n        config._dayOfYear = temp.dayOfYear;\n    }\n}\n\n// iso 8601 regex\n// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\nvar extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\nvar basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n\nvar tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\nvar isoDates = [\n    ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n    ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n    ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n    ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n    ['YYYY-DDD', /\\d{4}-\\d{3}/],\n    ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n    ['YYYYYYMMDD', /[+-]\\d{10}/],\n    ['YYYYMMDD', /\\d{8}/],\n    // YYYYMM is NOT allowed by the standard\n    ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n    ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n    ['YYYYDDD', /\\d{7}/]\n];\n\n// iso time formats and regexes\nvar isoTimes = [\n    ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n    ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n    ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n    ['HH:mm', /\\d\\d:\\d\\d/],\n    ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n    ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n    ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n    ['HHmm', /\\d\\d\\d\\d/],\n    ['HH', /\\d\\d/]\n];\n\nvar aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n// date from iso format\nfunction configFromISO(config) {\n    var i, l,\n        string = config._i,\n        match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n        allowTime, dateFormat, timeFormat, tzFormat;\n\n    if (match) {\n        getParsingFlags(config).iso = true;\n\n        for (i = 0, l = isoDates.length; i < l; i++) {\n            if (isoDates[i][1].exec(match[1])) {\n                dateFormat = isoDates[i][0];\n                allowTime = isoDates[i][2] !== false;\n                break;\n            }\n        }\n        if (dateFormat == null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[3]) {\n            for (i = 0, l = isoTimes.length; i < l; i++) {\n                if (isoTimes[i][1].exec(match[3])) {\n                    // match[2] should be 'T' or space\n                    timeFormat = (match[2] || ' ') + isoTimes[i][0];\n                    break;\n                }\n            }\n            if (timeFormat == null) {\n                config._isValid = false;\n                return;\n            }\n        }\n        if (!allowTime && timeFormat != null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[4]) {\n            if (tzRegex.exec(match[4])) {\n                tzFormat = 'Z';\n            } else {\n                config._isValid = false;\n                return;\n            }\n        }\n        config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n        configFromStringAndFormat(config);\n    } else {\n        config._isValid = false;\n    }\n}\n\n// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\nvar rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/;\n\nfunction extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n    var result = [\n        untruncateYear(yearStr),\n        defaultLocaleMonthsShort.indexOf(monthStr),\n        parseInt(dayStr, 10),\n        parseInt(hourStr, 10),\n        parseInt(minuteStr, 10)\n    ];\n\n    if (secondStr) {\n        result.push(parseInt(secondStr, 10));\n    }\n\n    return result;\n}\n\nfunction untruncateYear(yearStr) {\n    var year = parseInt(yearStr, 10);\n    if (year <= 49) {\n        return 2000 + year;\n    } else if (year <= 999) {\n        return 1900 + year;\n    }\n    return year;\n}\n\nfunction preprocessRFC2822(s) {\n    // Remove comments and folding whitespace and replace multiple-spaces with a single space\n    return s.replace(/\\([^)]*\\)|[\\n\\t]/g, ' ').replace(/(\\s\\s+)/g, ' ').trim();\n}\n\nfunction checkWeekday(weekdayStr, parsedInput, config) {\n    if (weekdayStr) {\n        // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n        var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n            weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();\n        if (weekdayProvided !== weekdayActual) {\n            getParsingFlags(config).weekdayMismatch = true;\n            config._isValid = false;\n            return false;\n        }\n    }\n    return true;\n}\n\nvar obsOffsets = {\n    UT: 0,\n    GMT: 0,\n    EDT: -4 * 60,\n    EST: -5 * 60,\n    CDT: -5 * 60,\n    CST: -6 * 60,\n    MDT: -6 * 60,\n    MST: -7 * 60,\n    PDT: -7 * 60,\n    PST: -8 * 60\n};\n\nfunction calculateOffset(obsOffset, militaryOffset, numOffset) {\n    if (obsOffset) {\n        return obsOffsets[obsOffset];\n    } else if (militaryOffset) {\n        // the only allowed military tz is Z\n        return 0;\n    } else {\n        var hm = parseInt(numOffset, 10);\n        var m = hm % 100, h = (hm - m) / 100;\n        return h * 60 + m;\n    }\n}\n\n// date and time from ref 2822 format\nfunction configFromRFC2822(config) {\n    var match = rfc2822.exec(preprocessRFC2822(config._i));\n    if (match) {\n        var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);\n        if (!checkWeekday(match[1], parsedArray, config)) {\n            return;\n        }\n\n        config._a = parsedArray;\n        config._tzm = calculateOffset(match[8], match[9], match[10]);\n\n        config._d = createUTCDate.apply(null, config._a);\n        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n        getParsingFlags(config).rfc2822 = true;\n    } else {\n        config._isValid = false;\n    }\n}\n\n// date from iso format or fallback\nfunction configFromString(config) {\n    var matched = aspNetJsonRegex.exec(config._i);\n\n    if (matched !== null) {\n        config._d = new Date(+matched[1]);\n        return;\n    }\n\n    configFromISO(config);\n    if (config._isValid === false) {\n        delete config._isValid;\n    } else {\n        return;\n    }\n\n    configFromRFC2822(config);\n    if (config._isValid === false) {\n        delete config._isValid;\n    } else {\n        return;\n    }\n\n    // Final attempt, use Input Fallback\n    hooks.createFromInputFallback(config);\n}\n\nhooks.createFromInputFallback = deprecate(\n    'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n    'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n    'discouraged and will be removed in an upcoming major release. Please refer to ' +\n    'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n    function (config) {\n        config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n    }\n);\n\n// constant that refers to the ISO standard\nhooks.ISO_8601 = function () {};\n\n// constant that refers to the RFC 2822 form\nhooks.RFC_2822 = function () {};\n\n// date from string and format string\nfunction configFromStringAndFormat(config) {\n    // TODO: Move this to another part of the creation flow to prevent circular deps\n    if (config._f === hooks.ISO_8601) {\n        configFromISO(config);\n        return;\n    }\n    if (config._f === hooks.RFC_2822) {\n        configFromRFC2822(config);\n        return;\n    }\n    config._a = [];\n    getParsingFlags(config).empty = true;\n\n    // This array is used to make a Date, either with `new Date` or `Date.UTC`\n    var string = '' + config._i,\n        i, parsedInput, tokens, token, skipped,\n        stringLength = string.length,\n        totalParsedInputLength = 0;\n\n    tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n    for (i = 0; i < tokens.length; i++) {\n        token = tokens[i];\n        parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n        // console.log('token', token, 'parsedInput', parsedInput,\n        //         'regex', getParseRegexForToken(token, config));\n        if (parsedInput) {\n            skipped = string.substr(0, string.indexOf(parsedInput));\n            if (skipped.length > 0) {\n                getParsingFlags(config).unusedInput.push(skipped);\n            }\n            string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n            totalParsedInputLength += parsedInput.length;\n        }\n        // don't parse if it's not a known token\n        if (formatTokenFunctions[token]) {\n            if (parsedInput) {\n                getParsingFlags(config).empty = false;\n            }\n            else {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n            addTimeToArrayFromToken(token, parsedInput, config);\n        }\n        else if (config._strict && !parsedInput) {\n            getParsingFlags(config).unusedTokens.push(token);\n        }\n    }\n\n    // add remaining unparsed input length to the string\n    getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n    if (string.length > 0) {\n        getParsingFlags(config).unusedInput.push(string);\n    }\n\n    // clear _12h flag if hour is <= 12\n    if (config._a[HOUR] <= 12 &&\n        getParsingFlags(config).bigHour === true &&\n        config._a[HOUR] > 0) {\n        getParsingFlags(config).bigHour = undefined;\n    }\n\n    getParsingFlags(config).parsedDateParts = config._a.slice(0);\n    getParsingFlags(config).meridiem = config._meridiem;\n    // handle meridiem\n    config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n    configFromArray(config);\n    checkOverflow(config);\n}\n\n\nfunction meridiemFixWrap (locale, hour, meridiem) {\n    var isPm;\n\n    if (meridiem == null) {\n        // nothing to do\n        return hour;\n    }\n    if (locale.meridiemHour != null) {\n        return locale.meridiemHour(hour, meridiem);\n    } else if (locale.isPM != null) {\n        // Fallback\n        isPm = locale.isPM(meridiem);\n        if (isPm && hour < 12) {\n            hour += 12;\n        }\n        if (!isPm && hour === 12) {\n            hour = 0;\n        }\n        return hour;\n    } else {\n        // this is not supposed to happen\n        return hour;\n    }\n}\n\n// date from string and array of format strings\nfunction configFromStringAndArray(config) {\n    var tempConfig,\n        bestMoment,\n\n        scoreToBeat,\n        i,\n        currentScore;\n\n    if (config._f.length === 0) {\n        getParsingFlags(config).invalidFormat = true;\n        config._d = new Date(NaN);\n        return;\n    }\n\n    for (i = 0; i < config._f.length; i++) {\n        currentScore = 0;\n        tempConfig = copyConfig({}, config);\n        if (config._useUTC != null) {\n            tempConfig._useUTC = config._useUTC;\n        }\n        tempConfig._f = config._f[i];\n        configFromStringAndFormat(tempConfig);\n\n        if (!isValid(tempConfig)) {\n            continue;\n        }\n\n        // if there is any input that was not parsed add a penalty for that format\n        currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n        //or tokens\n        currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n        getParsingFlags(tempConfig).score = currentScore;\n\n        if (scoreToBeat == null || currentScore < scoreToBeat) {\n            scoreToBeat = currentScore;\n            bestMoment = tempConfig;\n        }\n    }\n\n    extend(config, bestMoment || tempConfig);\n}\n\nfunction configFromObject(config) {\n    if (config._d) {\n        return;\n    }\n\n    var i = normalizeObjectUnits(config._i);\n    config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n        return obj && parseInt(obj, 10);\n    });\n\n    configFromArray(config);\n}\n\nfunction createFromConfig (config) {\n    var res = new Moment(checkOverflow(prepareConfig(config)));\n    if (res._nextDay) {\n        // Adding is smart enough around DST\n        res.add(1, 'd');\n        res._nextDay = undefined;\n    }\n\n    return res;\n}\n\nfunction prepareConfig (config) {\n    var input = config._i,\n        format = config._f;\n\n    config._locale = config._locale || getLocale(config._l);\n\n    if (input === null || (format === undefined && input === '')) {\n        return createInvalid({nullInput: true});\n    }\n\n    if (typeof input === 'string') {\n        config._i = input = config._locale.preparse(input);\n    }\n\n    if (isMoment(input)) {\n        return new Moment(checkOverflow(input));\n    } else if (isDate(input)) {\n        config._d = input;\n    } else if (isArray(format)) {\n        configFromStringAndArray(config);\n    } else if (format) {\n        configFromStringAndFormat(config);\n    }  else {\n        configFromInput(config);\n    }\n\n    if (!isValid(config)) {\n        config._d = null;\n    }\n\n    return config;\n}\n\nfunction configFromInput(config) {\n    var input = config._i;\n    if (isUndefined(input)) {\n        config._d = new Date(hooks.now());\n    } else if (isDate(input)) {\n        config._d = new Date(input.valueOf());\n    } else if (typeof input === 'string') {\n        configFromString(config);\n    } else if (isArray(input)) {\n        config._a = map(input.slice(0), function (obj) {\n            return parseInt(obj, 10);\n        });\n        configFromArray(config);\n    } else if (isObject(input)) {\n        configFromObject(config);\n    } else if (isNumber(input)) {\n        // from milliseconds\n        config._d = new Date(input);\n    } else {\n        hooks.createFromInputFallback(config);\n    }\n}\n\nfunction createLocalOrUTC (input, format, locale, strict, isUTC) {\n    var c = {};\n\n    if (locale === true || locale === false) {\n        strict = locale;\n        locale = undefined;\n    }\n\n    if ((isObject(input) && isObjectEmpty(input)) ||\n            (isArray(input) && input.length === 0)) {\n        input = undefined;\n    }\n    // object construction must be done this way.\n    // https://github.com/moment/moment/issues/1423\n    c._isAMomentObject = true;\n    c._useUTC = c._isUTC = isUTC;\n    c._l = locale;\n    c._i = input;\n    c._f = format;\n    c._strict = strict;\n\n    return createFromConfig(c);\n}\n\nfunction createLocal (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, false);\n}\n\nvar prototypeMin = deprecate(\n    'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other < this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\nvar prototypeMax = deprecate(\n    'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other > this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\n// Pick a moment m from moments so that m[fn](other) is true for all\n// other. This relies on the function fn to be transitive.\n//\n// moments should either be an array of moment objects or an array, whose\n// first element is an array of moment objects.\nfunction pickBy(fn, moments) {\n    var res, i;\n    if (moments.length === 1 && isArray(moments[0])) {\n        moments = moments[0];\n    }\n    if (!moments.length) {\n        return createLocal();\n    }\n    res = moments[0];\n    for (i = 1; i < moments.length; ++i) {\n        if (!moments[i].isValid() || moments[i][fn](res)) {\n            res = moments[i];\n        }\n    }\n    return res;\n}\n\n// TODO: Use [].sort instead?\nfunction min () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isBefore', args);\n}\n\nfunction max () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isAfter', args);\n}\n\nvar now = function () {\n    return Date.now ? Date.now() : +(new Date());\n};\n\nvar ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\nfunction isDurationValid(m) {\n    for (var key in m) {\n        if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n            return false;\n        }\n    }\n\n    var unitHasDecimal = false;\n    for (var i = 0; i < ordering.length; ++i) {\n        if (m[ordering[i]]) {\n            if (unitHasDecimal) {\n                return false; // only allow non-integers for smallest unit\n            }\n            if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n                unitHasDecimal = true;\n            }\n        }\n    }\n\n    return true;\n}\n\nfunction isValid$1() {\n    return this._isValid;\n}\n\nfunction createInvalid$1() {\n    return createDuration(NaN);\n}\n\nfunction Duration (duration) {\n    var normalizedInput = normalizeObjectUnits(duration),\n        years = normalizedInput.year || 0,\n        quarters = normalizedInput.quarter || 0,\n        months = normalizedInput.month || 0,\n        weeks = normalizedInput.week || 0,\n        days = normalizedInput.day || 0,\n        hours = normalizedInput.hour || 0,\n        minutes = normalizedInput.minute || 0,\n        seconds = normalizedInput.second || 0,\n        milliseconds = normalizedInput.millisecond || 0;\n\n    this._isValid = isDurationValid(normalizedInput);\n\n    // representation for dateAddRemove\n    this._milliseconds = +milliseconds +\n        seconds * 1e3 + // 1000\n        minutes * 6e4 + // 1000 * 60\n        hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n    // Because of dateAddRemove treats 24 hours as different from a\n    // day when working around DST, we need to store them separately\n    this._days = +days +\n        weeks * 7;\n    // It is impossible to translate months into days without knowing\n    // which months you are are talking about, so we have to store\n    // it separately.\n    this._months = +months +\n        quarters * 3 +\n        years * 12;\n\n    this._data = {};\n\n    this._locale = getLocale();\n\n    this._bubble();\n}\n\nfunction isDuration (obj) {\n    return obj instanceof Duration;\n}\n\nfunction absRound (number) {\n    if (number < 0) {\n        return Math.round(-1 * number) * -1;\n    } else {\n        return Math.round(number);\n    }\n}\n\n// FORMATTING\n\nfunction offset (token, separator) {\n    addFormatToken(token, 0, 0, function () {\n        var offset = this.utcOffset();\n        var sign = '+';\n        if (offset < 0) {\n            offset = -offset;\n            sign = '-';\n        }\n        return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n    });\n}\n\noffset('Z', ':');\noffset('ZZ', '');\n\n// PARSING\n\naddRegexToken('Z',  matchShortOffset);\naddRegexToken('ZZ', matchShortOffset);\naddParseToken(['Z', 'ZZ'], function (input, array, config) {\n    config._useUTC = true;\n    config._tzm = offsetFromString(matchShortOffset, input);\n});\n\n// HELPERS\n\n// timezone chunker\n// '+10:00' > ['10',  '00']\n// '-1530'  > ['-15', '30']\nvar chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\nfunction offsetFromString(matcher, string) {\n    var matches = (string || '').match(matcher);\n\n    if (matches === null) {\n        return null;\n    }\n\n    var chunk   = matches[matches.length - 1] || [];\n    var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n    var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n    return minutes === 0 ?\n      0 :\n      parts[0] === '+' ? minutes : -minutes;\n}\n\n// Return a moment from input, that is local/utc/zone equivalent to model.\nfunction cloneWithOffset(input, model) {\n    var res, diff;\n    if (model._isUTC) {\n        res = model.clone();\n        diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n        // Use low-level api, because this fn is low-level api.\n        res._d.setTime(res._d.valueOf() + diff);\n        hooks.updateOffset(res, false);\n        return res;\n    } else {\n        return createLocal(input).local();\n    }\n}\n\nfunction getDateOffset (m) {\n    // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n    // https://github.com/moment/moment/pull/1871\n    return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n}\n\n// HOOKS\n\n// This function will be called whenever a moment is mutated.\n// It is intended to keep the offset in sync with the timezone.\nhooks.updateOffset = function () {};\n\n// MOMENTS\n\n// keepLocalTime = true means only change the timezone, without\n// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n// +0200, so we adjust the time as needed, to be valid.\n//\n// Keeping the time actually adds/subtracts (one hour)\n// from the actual represented time. That is why we call updateOffset\n// a second time. In case it wants us to change the offset again\n// _changeInProgress == true case, then we have to adjust, because\n// there is no such time in the given timezone.\nfunction getSetOffset (input, keepLocalTime, keepMinutes) {\n    var offset = this._offset || 0,\n        localAdjust;\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    if (input != null) {\n        if (typeof input === 'string') {\n            input = offsetFromString(matchShortOffset, input);\n            if (input === null) {\n                return this;\n            }\n        } else if (Math.abs(input) < 16 && !keepMinutes) {\n            input = input * 60;\n        }\n        if (!this._isUTC && keepLocalTime) {\n            localAdjust = getDateOffset(this);\n        }\n        this._offset = input;\n        this._isUTC = true;\n        if (localAdjust != null) {\n            this.add(localAdjust, 'm');\n        }\n        if (offset !== input) {\n            if (!keepLocalTime || this._changeInProgress) {\n                addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n            } else if (!this._changeInProgress) {\n                this._changeInProgress = true;\n                hooks.updateOffset(this, true);\n                this._changeInProgress = null;\n            }\n        }\n        return this;\n    } else {\n        return this._isUTC ? offset : getDateOffset(this);\n    }\n}\n\nfunction getSetZone (input, keepLocalTime) {\n    if (input != null) {\n        if (typeof input !== 'string') {\n            input = -input;\n        }\n\n        this.utcOffset(input, keepLocalTime);\n\n        return this;\n    } else {\n        return -this.utcOffset();\n    }\n}\n\nfunction setOffsetToUTC (keepLocalTime) {\n    return this.utcOffset(0, keepLocalTime);\n}\n\nfunction setOffsetToLocal (keepLocalTime) {\n    if (this._isUTC) {\n        this.utcOffset(0, keepLocalTime);\n        this._isUTC = false;\n\n        if (keepLocalTime) {\n            this.subtract(getDateOffset(this), 'm');\n        }\n    }\n    return this;\n}\n\nfunction setOffsetToParsedOffset () {\n    if (this._tzm != null) {\n        this.utcOffset(this._tzm, false, true);\n    } else if (typeof this._i === 'string') {\n        var tZone = offsetFromString(matchOffset, this._i);\n        if (tZone != null) {\n            this.utcOffset(tZone);\n        }\n        else {\n            this.utcOffset(0, true);\n        }\n    }\n    return this;\n}\n\nfunction hasAlignedHourOffset (input) {\n    if (!this.isValid()) {\n        return false;\n    }\n    input = input ? createLocal(input).utcOffset() : 0;\n\n    return (this.utcOffset() - input) % 60 === 0;\n}\n\nfunction isDaylightSavingTime () {\n    return (\n        this.utcOffset() > this.clone().month(0).utcOffset() ||\n        this.utcOffset() > this.clone().month(5).utcOffset()\n    );\n}\n\nfunction isDaylightSavingTimeShifted () {\n    if (!isUndefined(this._isDSTShifted)) {\n        return this._isDSTShifted;\n    }\n\n    var c = {};\n\n    copyConfig(c, this);\n    c = prepareConfig(c);\n\n    if (c._a) {\n        var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n        this._isDSTShifted = this.isValid() &&\n            compareArrays(c._a, other.toArray()) > 0;\n    } else {\n        this._isDSTShifted = false;\n    }\n\n    return this._isDSTShifted;\n}\n\nfunction isLocal () {\n    return this.isValid() ? !this._isUTC : false;\n}\n\nfunction isUtcOffset () {\n    return this.isValid() ? this._isUTC : false;\n}\n\nfunction isUtc () {\n    return this.isValid() ? this._isUTC && this._offset === 0 : false;\n}\n\n// ASP.NET json date format regex\nvar aspNetRegex = /^(\\-|\\+)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n// and further modified to allow for strings containing both week and day\nvar isoRegex = /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\nfunction createDuration (input, key) {\n    var duration = input,\n        // matching against regexp is expensive, do it on demand\n        match = null,\n        sign,\n        ret,\n        diffRes;\n\n    if (isDuration(input)) {\n        duration = {\n            ms : input._milliseconds,\n            d  : input._days,\n            M  : input._months\n        };\n    } else if (isNumber(input)) {\n        duration = {};\n        if (key) {\n            duration[key] = input;\n        } else {\n            duration.milliseconds = input;\n        }\n    } else if (!!(match = aspNetRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : 1;\n        duration = {\n            y  : 0,\n            d  : toInt(match[DATE])                         * sign,\n            h  : toInt(match[HOUR])                         * sign,\n            m  : toInt(match[MINUTE])                       * sign,\n            s  : toInt(match[SECOND])                       * sign,\n            ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n        };\n    } else if (!!(match = isoRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1;\n        duration = {\n            y : parseIso(match[2], sign),\n            M : parseIso(match[3], sign),\n            w : parseIso(match[4], sign),\n            d : parseIso(match[5], sign),\n            h : parseIso(match[6], sign),\n            m : parseIso(match[7], sign),\n            s : parseIso(match[8], sign)\n        };\n    } else if (duration == null) {// checks for null or undefined\n        duration = {};\n    } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n        diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n        duration = {};\n        duration.ms = diffRes.milliseconds;\n        duration.M = diffRes.months;\n    }\n\n    ret = new Duration(duration);\n\n    if (isDuration(input) && hasOwnProp(input, '_locale')) {\n        ret._locale = input._locale;\n    }\n\n    return ret;\n}\n\ncreateDuration.fn = Duration.prototype;\ncreateDuration.invalid = createInvalid$1;\n\nfunction parseIso (inp, sign) {\n    // We'd normally use ~~inp for this, but unfortunately it also\n    // converts floats to ints.\n    // inp may be undefined, so careful calling replace on it.\n    var res = inp && parseFloat(inp.replace(',', '.'));\n    // apply sign while we're at it\n    return (isNaN(res) ? 0 : res) * sign;\n}\n\nfunction positiveMomentsDifference(base, other) {\n    var res = {milliseconds: 0, months: 0};\n\n    res.months = other.month() - base.month() +\n        (other.year() - base.year()) * 12;\n    if (base.clone().add(res.months, 'M').isAfter(other)) {\n        --res.months;\n    }\n\n    res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n    return res;\n}\n\nfunction momentsDifference(base, other) {\n    var res;\n    if (!(base.isValid() && other.isValid())) {\n        return {milliseconds: 0, months: 0};\n    }\n\n    other = cloneWithOffset(other, base);\n    if (base.isBefore(other)) {\n        res = positiveMomentsDifference(base, other);\n    } else {\n        res = positiveMomentsDifference(other, base);\n        res.milliseconds = -res.milliseconds;\n        res.months = -res.months;\n    }\n\n    return res;\n}\n\n// TODO: remove 'name' arg after deprecation is removed\nfunction createAdder(direction, name) {\n    return function (val, period) {\n        var dur, tmp;\n        //invert the arguments, but complain about it\n        if (period !== null && !isNaN(+period)) {\n            deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n            'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n            tmp = val; val = period; period = tmp;\n        }\n\n        val = typeof val === 'string' ? +val : val;\n        dur = createDuration(val, period);\n        addSubtract(this, dur, direction);\n        return this;\n    };\n}\n\nfunction addSubtract (mom, duration, isAdding, updateOffset) {\n    var milliseconds = duration._milliseconds,\n        days = absRound(duration._days),\n        months = absRound(duration._months);\n\n    if (!mom.isValid()) {\n        // No op\n        return;\n    }\n\n    updateOffset = updateOffset == null ? true : updateOffset;\n\n    if (months) {\n        setMonth(mom, get(mom, 'Month') + months * isAdding);\n    }\n    if (days) {\n        set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n    }\n    if (milliseconds) {\n        mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n    }\n    if (updateOffset) {\n        hooks.updateOffset(mom, days || months);\n    }\n}\n\nvar add      = createAdder(1, 'add');\nvar subtract = createAdder(-1, 'subtract');\n\nfunction getCalendarFormat(myMoment, now) {\n    var diff = myMoment.diff(now, 'days', true);\n    return diff < -6 ? 'sameElse' :\n            diff < -1 ? 'lastWeek' :\n            diff < 0 ? 'lastDay' :\n            diff < 1 ? 'sameDay' :\n            diff < 2 ? 'nextDay' :\n            diff < 7 ? 'nextWeek' : 'sameElse';\n}\n\nfunction calendar$1 (time, formats) {\n    // We want to compare the start of today, vs this.\n    // Getting start-of-today depends on whether we're local/utc/offset or not.\n    var now = time || createLocal(),\n        sod = cloneWithOffset(now, this).startOf('day'),\n        format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n    var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n    return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n}\n\nfunction clone () {\n    return new Moment(this);\n}\n\nfunction isAfter (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() > localInput.valueOf();\n    } else {\n        return localInput.valueOf() < this.clone().startOf(units).valueOf();\n    }\n}\n\nfunction isBefore (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() < localInput.valueOf();\n    } else {\n        return this.clone().endOf(units).valueOf() < localInput.valueOf();\n    }\n}\n\nfunction isBetween (from, to, units, inclusivity) {\n    inclusivity = inclusivity || '()';\n    return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n        (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n}\n\nfunction isSame (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input),\n        inputMs;\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(units || 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() === localInput.valueOf();\n    } else {\n        inputMs = localInput.valueOf();\n        return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n    }\n}\n\nfunction isSameOrAfter (input, units) {\n    return this.isSame(input, units) || this.isAfter(input,units);\n}\n\nfunction isSameOrBefore (input, units) {\n    return this.isSame(input, units) || this.isBefore(input,units);\n}\n\nfunction diff (input, units, asFloat) {\n    var that,\n        zoneDelta,\n        delta, output;\n\n    if (!this.isValid()) {\n        return NaN;\n    }\n\n    that = cloneWithOffset(input, this);\n\n    if (!that.isValid()) {\n        return NaN;\n    }\n\n    zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n    units = normalizeUnits(units);\n\n    switch (units) {\n        case 'year': output = monthDiff(this, that) / 12; break;\n        case 'month': output = monthDiff(this, that); break;\n        case 'quarter': output = monthDiff(this, that) / 3; break;\n        case 'second': output = (this - that) / 1e3; break; // 1000\n        case 'minute': output = (this - that) / 6e4; break; // 1000 * 60\n        case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60\n        case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst\n        case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst\n        default: output = this - that;\n    }\n\n    return asFloat ? output : absFloor(output);\n}\n\nfunction monthDiff (a, b) {\n    // difference in months\n    var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n        // b is in (anchor - 1 month, anchor + 1 month)\n        anchor = a.clone().add(wholeMonthDiff, 'months'),\n        anchor2, adjust;\n\n    if (b - anchor < 0) {\n        anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor - anchor2);\n    } else {\n        anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor2 - anchor);\n    }\n\n    //check for negative zero, return zero if negative zero\n    return -(wholeMonthDiff + adjust) || 0;\n}\n\nhooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\nhooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\nfunction toString () {\n    return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n}\n\nfunction toISOString(keepOffset) {\n    if (!this.isValid()) {\n        return null;\n    }\n    var utc = keepOffset !== true;\n    var m = utc ? this.clone().utc() : this;\n    if (m.year() < 0 || m.year() > 9999) {\n        return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');\n    }\n    if (isFunction(Date.prototype.toISOString)) {\n        // native implementation is ~50x faster, use it when we can\n        if (utc) {\n            return this.toDate().toISOString();\n        } else {\n            return new Date(this._d.valueOf()).toISOString().replace('Z', formatMoment(m, 'Z'));\n        }\n    }\n    return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');\n}\n\n/**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\nfunction inspect () {\n    if (!this.isValid()) {\n        return 'moment.invalid(/* ' + this._i + ' */)';\n    }\n    var func = 'moment';\n    var zone = '';\n    if (!this.isLocal()) {\n        func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n        zone = 'Z';\n    }\n    var prefix = '[' + func + '(\"]';\n    var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n    var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n    var suffix = zone + '[\")]';\n\n    return this.format(prefix + year + datetime + suffix);\n}\n\nfunction format (inputString) {\n    if (!inputString) {\n        inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n    }\n    var output = formatMoment(this, inputString);\n    return this.localeData().postformat(output);\n}\n\nfunction from (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction fromNow (withoutSuffix) {\n    return this.from(createLocal(), withoutSuffix);\n}\n\nfunction to (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction toNow (withoutSuffix) {\n    return this.to(createLocal(), withoutSuffix);\n}\n\n// If passed a locale key, it will set the locale for this\n// instance.  Otherwise, it will return the locale configuration\n// variables for this instance.\nfunction locale (key) {\n    var newLocaleData;\n\n    if (key === undefined) {\n        return this._locale._abbr;\n    } else {\n        newLocaleData = getLocale(key);\n        if (newLocaleData != null) {\n            this._locale = newLocaleData;\n        }\n        return this;\n    }\n}\n\nvar lang = deprecate(\n    'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n    function (key) {\n        if (key === undefined) {\n            return this.localeData();\n        } else {\n            return this.locale(key);\n        }\n    }\n);\n\nfunction localeData () {\n    return this._locale;\n}\n\nfunction startOf (units) {\n    units = normalizeUnits(units);\n    // the following switch intentionally omits break keywords\n    // to utilize falling through the cases.\n    switch (units) {\n        case 'year':\n            this.month(0);\n            /* falls through */\n        case 'quarter':\n        case 'month':\n            this.date(1);\n            /* falls through */\n        case 'week':\n        case 'isoWeek':\n        case 'day':\n        case 'date':\n            this.hours(0);\n            /* falls through */\n        case 'hour':\n            this.minutes(0);\n            /* falls through */\n        case 'minute':\n            this.seconds(0);\n            /* falls through */\n        case 'second':\n            this.milliseconds(0);\n    }\n\n    // weeks are a special case\n    if (units === 'week') {\n        this.weekday(0);\n    }\n    if (units === 'isoWeek') {\n        this.isoWeekday(1);\n    }\n\n    // quarters are also special\n    if (units === 'quarter') {\n        this.month(Math.floor(this.month() / 3) * 3);\n    }\n\n    return this;\n}\n\nfunction endOf (units) {\n    units = normalizeUnits(units);\n    if (units === undefined || units === 'millisecond') {\n        return this;\n    }\n\n    // 'date' is an alias for 'day', so it should be considered as such.\n    if (units === 'date') {\n        units = 'day';\n    }\n\n    return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n}\n\nfunction valueOf () {\n    return this._d.valueOf() - ((this._offset || 0) * 60000);\n}\n\nfunction unix () {\n    return Math.floor(this.valueOf() / 1000);\n}\n\nfunction toDate () {\n    return new Date(this.valueOf());\n}\n\nfunction toArray () {\n    var m = this;\n    return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n}\n\nfunction toObject () {\n    var m = this;\n    return {\n        years: m.year(),\n        months: m.month(),\n        date: m.date(),\n        hours: m.hours(),\n        minutes: m.minutes(),\n        seconds: m.seconds(),\n        milliseconds: m.milliseconds()\n    };\n}\n\nfunction toJSON () {\n    // new Date(NaN).toJSON() === null\n    return this.isValid() ? this.toISOString() : null;\n}\n\nfunction isValid$2 () {\n    return isValid(this);\n}\n\nfunction parsingFlags () {\n    return extend({}, getParsingFlags(this));\n}\n\nfunction invalidAt () {\n    return getParsingFlags(this).overflow;\n}\n\nfunction creationData() {\n    return {\n        input: this._i,\n        format: this._f,\n        locale: this._locale,\n        isUTC: this._isUTC,\n        strict: this._strict\n    };\n}\n\n// FORMATTING\n\naddFormatToken(0, ['gg', 2], 0, function () {\n    return this.weekYear() % 100;\n});\n\naddFormatToken(0, ['GG', 2], 0, function () {\n    return this.isoWeekYear() % 100;\n});\n\nfunction addWeekYearFormatToken (token, getter) {\n    addFormatToken(0, [token, token.length], 0, getter);\n}\n\naddWeekYearFormatToken('gggg',     'weekYear');\naddWeekYearFormatToken('ggggg',    'weekYear');\naddWeekYearFormatToken('GGGG',  'isoWeekYear');\naddWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n// ALIASES\n\naddUnitAlias('weekYear', 'gg');\naddUnitAlias('isoWeekYear', 'GG');\n\n// PRIORITY\n\naddUnitPriority('weekYear', 1);\naddUnitPriority('isoWeekYear', 1);\n\n\n// PARSING\n\naddRegexToken('G',      matchSigned);\naddRegexToken('g',      matchSigned);\naddRegexToken('GG',     match1to2, match2);\naddRegexToken('gg',     match1to2, match2);\naddRegexToken('GGGG',   match1to4, match4);\naddRegexToken('gggg',   match1to4, match4);\naddRegexToken('GGGGG',  match1to6, match6);\naddRegexToken('ggggg',  match1to6, match6);\n\naddWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n    week[token.substr(0, 2)] = toInt(input);\n});\n\naddWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n    week[token] = hooks.parseTwoDigitYear(input);\n});\n\n// MOMENTS\n\nfunction getSetWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input,\n            this.week(),\n            this.weekday(),\n            this.localeData()._week.dow,\n            this.localeData()._week.doy);\n}\n\nfunction getSetISOWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input, this.isoWeek(), this.isoWeekday(), 1, 4);\n}\n\nfunction getISOWeeksInYear () {\n    return weeksInYear(this.year(), 1, 4);\n}\n\nfunction getWeeksInYear () {\n    var weekInfo = this.localeData()._week;\n    return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n}\n\nfunction getSetWeekYearHelper(input, week, weekday, dow, doy) {\n    var weeksTarget;\n    if (input == null) {\n        return weekOfYear(this, dow, doy).year;\n    } else {\n        weeksTarget = weeksInYear(input, dow, doy);\n        if (week > weeksTarget) {\n            week = weeksTarget;\n        }\n        return setWeekAll.call(this, input, week, weekday, dow, doy);\n    }\n}\n\nfunction setWeekAll(weekYear, week, weekday, dow, doy) {\n    var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n        date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n    this.year(date.getUTCFullYear());\n    this.month(date.getUTCMonth());\n    this.date(date.getUTCDate());\n    return this;\n}\n\n// FORMATTING\n\naddFormatToken('Q', 0, 'Qo', 'quarter');\n\n// ALIASES\n\naddUnitAlias('quarter', 'Q');\n\n// PRIORITY\n\naddUnitPriority('quarter', 7);\n\n// PARSING\n\naddRegexToken('Q', match1);\naddParseToken('Q', function (input, array) {\n    array[MONTH] = (toInt(input) - 1) * 3;\n});\n\n// MOMENTS\n\nfunction getSetQuarter (input) {\n    return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n}\n\n// FORMATTING\n\naddFormatToken('D', ['DD', 2], 'Do', 'date');\n\n// ALIASES\n\naddUnitAlias('date', 'D');\n\n// PRIOROITY\naddUnitPriority('date', 9);\n\n// PARSING\n\naddRegexToken('D',  match1to2);\naddRegexToken('DD', match1to2, match2);\naddRegexToken('Do', function (isStrict, locale) {\n    // TODO: Remove \"ordinalParse\" fallback in next major release.\n    return isStrict ?\n      (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :\n      locale._dayOfMonthOrdinalParseLenient;\n});\n\naddParseToken(['D', 'DD'], DATE);\naddParseToken('Do', function (input, array) {\n    array[DATE] = toInt(input.match(match1to2)[0]);\n});\n\n// MOMENTS\n\nvar getSetDayOfMonth = makeGetSet('Date', true);\n\n// FORMATTING\n\naddFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n// ALIASES\n\naddUnitAlias('dayOfYear', 'DDD');\n\n// PRIORITY\naddUnitPriority('dayOfYear', 4);\n\n// PARSING\n\naddRegexToken('DDD',  match1to3);\naddRegexToken('DDDD', match3);\naddParseToken(['DDD', 'DDDD'], function (input, array, config) {\n    config._dayOfYear = toInt(input);\n});\n\n// HELPERS\n\n// MOMENTS\n\nfunction getSetDayOfYear (input) {\n    var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n    return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n}\n\n// FORMATTING\n\naddFormatToken('m', ['mm', 2], 0, 'minute');\n\n// ALIASES\n\naddUnitAlias('minute', 'm');\n\n// PRIORITY\n\naddUnitPriority('minute', 14);\n\n// PARSING\n\naddRegexToken('m',  match1to2);\naddRegexToken('mm', match1to2, match2);\naddParseToken(['m', 'mm'], MINUTE);\n\n// MOMENTS\n\nvar getSetMinute = makeGetSet('Minutes', false);\n\n// FORMATTING\n\naddFormatToken('s', ['ss', 2], 0, 'second');\n\n// ALIASES\n\naddUnitAlias('second', 's');\n\n// PRIORITY\n\naddUnitPriority('second', 15);\n\n// PARSING\n\naddRegexToken('s',  match1to2);\naddRegexToken('ss', match1to2, match2);\naddParseToken(['s', 'ss'], SECOND);\n\n// MOMENTS\n\nvar getSetSecond = makeGetSet('Seconds', false);\n\n// FORMATTING\n\naddFormatToken('S', 0, 0, function () {\n    return ~~(this.millisecond() / 100);\n});\n\naddFormatToken(0, ['SS', 2], 0, function () {\n    return ~~(this.millisecond() / 10);\n});\n\naddFormatToken(0, ['SSS', 3], 0, 'millisecond');\naddFormatToken(0, ['SSSS', 4], 0, function () {\n    return this.millisecond() * 10;\n});\naddFormatToken(0, ['SSSSS', 5], 0, function () {\n    return this.millisecond() * 100;\n});\naddFormatToken(0, ['SSSSSS', 6], 0, function () {\n    return this.millisecond() * 1000;\n});\naddFormatToken(0, ['SSSSSSS', 7], 0, function () {\n    return this.millisecond() * 10000;\n});\naddFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n    return this.millisecond() * 100000;\n});\naddFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n    return this.millisecond() * 1000000;\n});\n\n\n// ALIASES\n\naddUnitAlias('millisecond', 'ms');\n\n// PRIORITY\n\naddUnitPriority('millisecond', 16);\n\n// PARSING\n\naddRegexToken('S',    match1to3, match1);\naddRegexToken('SS',   match1to3, match2);\naddRegexToken('SSS',  match1to3, match3);\n\nvar token;\nfor (token = 'SSSS'; token.length <= 9; token += 'S') {\n    addRegexToken(token, matchUnsigned);\n}\n\nfunction parseMs(input, array) {\n    array[MILLISECOND] = toInt(('0.' + input) * 1000);\n}\n\nfor (token = 'S'; token.length <= 9; token += 'S') {\n    addParseToken(token, parseMs);\n}\n// MOMENTS\n\nvar getSetMillisecond = makeGetSet('Milliseconds', false);\n\n// FORMATTING\n\naddFormatToken('z',  0, 0, 'zoneAbbr');\naddFormatToken('zz', 0, 0, 'zoneName');\n\n// MOMENTS\n\nfunction getZoneAbbr () {\n    return this._isUTC ? 'UTC' : '';\n}\n\nfunction getZoneName () {\n    return this._isUTC ? 'Coordinated Universal Time' : '';\n}\n\nvar proto = Moment.prototype;\n\nproto.add               = add;\nproto.calendar          = calendar$1;\nproto.clone             = clone;\nproto.diff              = diff;\nproto.endOf             = endOf;\nproto.format            = format;\nproto.from              = from;\nproto.fromNow           = fromNow;\nproto.to                = to;\nproto.toNow             = toNow;\nproto.get               = stringGet;\nproto.invalidAt         = invalidAt;\nproto.isAfter           = isAfter;\nproto.isBefore          = isBefore;\nproto.isBetween         = isBetween;\nproto.isSame            = isSame;\nproto.isSameOrAfter     = isSameOrAfter;\nproto.isSameOrBefore    = isSameOrBefore;\nproto.isValid           = isValid$2;\nproto.lang              = lang;\nproto.locale            = locale;\nproto.localeData        = localeData;\nproto.max               = prototypeMax;\nproto.min               = prototypeMin;\nproto.parsingFlags      = parsingFlags;\nproto.set               = stringSet;\nproto.startOf           = startOf;\nproto.subtract          = subtract;\nproto.toArray           = toArray;\nproto.toObject          = toObject;\nproto.toDate            = toDate;\nproto.toISOString       = toISOString;\nproto.inspect           = inspect;\nproto.toJSON            = toJSON;\nproto.toString          = toString;\nproto.unix              = unix;\nproto.valueOf           = valueOf;\nproto.creationData      = creationData;\n\n// Year\nproto.year       = getSetYear;\nproto.isLeapYear = getIsLeapYear;\n\n// Week Year\nproto.weekYear    = getSetWeekYear;\nproto.isoWeekYear = getSetISOWeekYear;\n\n// Quarter\nproto.quarter = proto.quarters = getSetQuarter;\n\n// Month\nproto.month       = getSetMonth;\nproto.daysInMonth = getDaysInMonth;\n\n// Week\nproto.week           = proto.weeks        = getSetWeek;\nproto.isoWeek        = proto.isoWeeks     = getSetISOWeek;\nproto.weeksInYear    = getWeeksInYear;\nproto.isoWeeksInYear = getISOWeeksInYear;\n\n// Day\nproto.date       = getSetDayOfMonth;\nproto.day        = proto.days             = getSetDayOfWeek;\nproto.weekday    = getSetLocaleDayOfWeek;\nproto.isoWeekday = getSetISODayOfWeek;\nproto.dayOfYear  = getSetDayOfYear;\n\n// Hour\nproto.hour = proto.hours = getSetHour;\n\n// Minute\nproto.minute = proto.minutes = getSetMinute;\n\n// Second\nproto.second = proto.seconds = getSetSecond;\n\n// Millisecond\nproto.millisecond = proto.milliseconds = getSetMillisecond;\n\n// Offset\nproto.utcOffset            = getSetOffset;\nproto.utc                  = setOffsetToUTC;\nproto.local                = setOffsetToLocal;\nproto.parseZone            = setOffsetToParsedOffset;\nproto.hasAlignedHourOffset = hasAlignedHourOffset;\nproto.isDST                = isDaylightSavingTime;\nproto.isLocal              = isLocal;\nproto.isUtcOffset          = isUtcOffset;\nproto.isUtc                = isUtc;\nproto.isUTC                = isUtc;\n\n// Timezone\nproto.zoneAbbr = getZoneAbbr;\nproto.zoneName = getZoneName;\n\n// Deprecations\nproto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\nproto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\nproto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);\nproto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\nproto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\nfunction createUnix (input) {\n    return createLocal(input * 1000);\n}\n\nfunction createInZone () {\n    return createLocal.apply(null, arguments).parseZone();\n}\n\nfunction preParsePostFormat (string) {\n    return string;\n}\n\nvar proto$1 = Locale.prototype;\n\nproto$1.calendar        = calendar;\nproto$1.longDateFormat  = longDateFormat;\nproto$1.invalidDate     = invalidDate;\nproto$1.ordinal         = ordinal;\nproto$1.preparse        = preParsePostFormat;\nproto$1.postformat      = preParsePostFormat;\nproto$1.relativeTime    = relativeTime;\nproto$1.pastFuture      = pastFuture;\nproto$1.set             = set;\n\n// Month\nproto$1.months            =        localeMonths;\nproto$1.monthsShort       =        localeMonthsShort;\nproto$1.monthsParse       =        localeMonthsParse;\nproto$1.monthsRegex       = monthsRegex;\nproto$1.monthsShortRegex  = monthsShortRegex;\n\n// Week\nproto$1.week = localeWeek;\nproto$1.firstDayOfYear = localeFirstDayOfYear;\nproto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n// Day of Week\nproto$1.weekdays       =        localeWeekdays;\nproto$1.weekdaysMin    =        localeWeekdaysMin;\nproto$1.weekdaysShort  =        localeWeekdaysShort;\nproto$1.weekdaysParse  =        localeWeekdaysParse;\n\nproto$1.weekdaysRegex       =        weekdaysRegex;\nproto$1.weekdaysShortRegex  =        weekdaysShortRegex;\nproto$1.weekdaysMinRegex    =        weekdaysMinRegex;\n\n// Hours\nproto$1.isPM = localeIsPM;\nproto$1.meridiem = localeMeridiem;\n\nfunction get$1 (format, index, field, setter) {\n    var locale = getLocale();\n    var utc = createUTC().set(setter, index);\n    return locale[field](utc, format);\n}\n\nfunction listMonthsImpl (format, index, field) {\n    if (isNumber(format)) {\n        index = format;\n        format = undefined;\n    }\n\n    format = format || '';\n\n    if (index != null) {\n        return get$1(format, index, field, 'month');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 12; i++) {\n        out[i] = get$1(format, i, field, 'month');\n    }\n    return out;\n}\n\n// ()\n// (5)\n// (fmt, 5)\n// (fmt)\n// (true)\n// (true, 5)\n// (true, fmt, 5)\n// (true, fmt)\nfunction listWeekdaysImpl (localeSorted, format, index, field) {\n    if (typeof localeSorted === 'boolean') {\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    } else {\n        format = localeSorted;\n        index = format;\n        localeSorted = false;\n\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    }\n\n    var locale = getLocale(),\n        shift = localeSorted ? locale._week.dow : 0;\n\n    if (index != null) {\n        return get$1(format, (index + shift) % 7, field, 'day');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 7; i++) {\n        out[i] = get$1(format, (i + shift) % 7, field, 'day');\n    }\n    return out;\n}\n\nfunction listMonths (format, index) {\n    return listMonthsImpl(format, index, 'months');\n}\n\nfunction listMonthsShort (format, index) {\n    return listMonthsImpl(format, index, 'monthsShort');\n}\n\nfunction listWeekdays (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n}\n\nfunction listWeekdaysShort (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n}\n\nfunction listWeekdaysMin (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n}\n\ngetSetGlobalLocale('en', {\n    dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (toInt(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    }\n});\n\n// Side effect imports\nhooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\nhooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\nvar mathAbs = Math.abs;\n\nfunction abs () {\n    var data           = this._data;\n\n    this._milliseconds = mathAbs(this._milliseconds);\n    this._days         = mathAbs(this._days);\n    this._months       = mathAbs(this._months);\n\n    data.milliseconds  = mathAbs(data.milliseconds);\n    data.seconds       = mathAbs(data.seconds);\n    data.minutes       = mathAbs(data.minutes);\n    data.hours         = mathAbs(data.hours);\n    data.months        = mathAbs(data.months);\n    data.years         = mathAbs(data.years);\n\n    return this;\n}\n\nfunction addSubtract$1 (duration, input, value, direction) {\n    var other = createDuration(input, value);\n\n    duration._milliseconds += direction * other._milliseconds;\n    duration._days         += direction * other._days;\n    duration._months       += direction * other._months;\n\n    return duration._bubble();\n}\n\n// supports only 2.0-style add(1, 's') or add(duration)\nfunction add$1 (input, value) {\n    return addSubtract$1(this, input, value, 1);\n}\n\n// supports only 2.0-style subtract(1, 's') or subtract(duration)\nfunction subtract$1 (input, value) {\n    return addSubtract$1(this, input, value, -1);\n}\n\nfunction absCeil (number) {\n    if (number < 0) {\n        return Math.floor(number);\n    } else {\n        return Math.ceil(number);\n    }\n}\n\nfunction bubble () {\n    var milliseconds = this._milliseconds;\n    var days         = this._days;\n    var months       = this._months;\n    var data         = this._data;\n    var seconds, minutes, hours, years, monthsFromDays;\n\n    // if we have a mix of positive and negative values, bubble down first\n    // check: https://github.com/moment/moment/issues/2166\n    if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n            (milliseconds <= 0 && days <= 0 && months <= 0))) {\n        milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n        days = 0;\n        months = 0;\n    }\n\n    // The following code bubbles up values, see the tests for\n    // examples of what that means.\n    data.milliseconds = milliseconds % 1000;\n\n    seconds           = absFloor(milliseconds / 1000);\n    data.seconds      = seconds % 60;\n\n    minutes           = absFloor(seconds / 60);\n    data.minutes      = minutes % 60;\n\n    hours             = absFloor(minutes / 60);\n    data.hours        = hours % 24;\n\n    days += absFloor(hours / 24);\n\n    // convert days to months\n    monthsFromDays = absFloor(daysToMonths(days));\n    months += monthsFromDays;\n    days -= absCeil(monthsToDays(monthsFromDays));\n\n    // 12 months -> 1 year\n    years = absFloor(months / 12);\n    months %= 12;\n\n    data.days   = days;\n    data.months = months;\n    data.years  = years;\n\n    return this;\n}\n\nfunction daysToMonths (days) {\n    // 400 years have 146097 days (taking into account leap year rules)\n    // 400 years have 12 months === 4800\n    return days * 4800 / 146097;\n}\n\nfunction monthsToDays (months) {\n    // the reverse of daysToMonths\n    return months * 146097 / 4800;\n}\n\nfunction as (units) {\n    if (!this.isValid()) {\n        return NaN;\n    }\n    var days;\n    var months;\n    var milliseconds = this._milliseconds;\n\n    units = normalizeUnits(units);\n\n    if (units === 'month' || units === 'year') {\n        days   = this._days   + milliseconds / 864e5;\n        months = this._months + daysToMonths(days);\n        return units === 'month' ? months : months / 12;\n    } else {\n        // handle milliseconds separately because of floating point math errors (issue #1867)\n        days = this._days + Math.round(monthsToDays(this._months));\n        switch (units) {\n            case 'week'   : return days / 7     + milliseconds / 6048e5;\n            case 'day'    : return days         + milliseconds / 864e5;\n            case 'hour'   : return days * 24    + milliseconds / 36e5;\n            case 'minute' : return days * 1440  + milliseconds / 6e4;\n            case 'second' : return days * 86400 + milliseconds / 1000;\n            // Math.floor prevents floating point math errors here\n            case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n            default: throw new Error('Unknown unit ' + units);\n        }\n    }\n}\n\n// TODO: Use this.as('ms')?\nfunction valueOf$1 () {\n    if (!this.isValid()) {\n        return NaN;\n    }\n    return (\n        this._milliseconds +\n        this._days * 864e5 +\n        (this._months % 12) * 2592e6 +\n        toInt(this._months / 12) * 31536e6\n    );\n}\n\nfunction makeAs (alias) {\n    return function () {\n        return this.as(alias);\n    };\n}\n\nvar asMilliseconds = makeAs('ms');\nvar asSeconds      = makeAs('s');\nvar asMinutes      = makeAs('m');\nvar asHours        = makeAs('h');\nvar asDays         = makeAs('d');\nvar asWeeks        = makeAs('w');\nvar asMonths       = makeAs('M');\nvar asYears        = makeAs('y');\n\nfunction clone$1 () {\n    return createDuration(this);\n}\n\nfunction get$2 (units) {\n    units = normalizeUnits(units);\n    return this.isValid() ? this[units + 's']() : NaN;\n}\n\nfunction makeGetter(name) {\n    return function () {\n        return this.isValid() ? this._data[name] : NaN;\n    };\n}\n\nvar milliseconds = makeGetter('milliseconds');\nvar seconds      = makeGetter('seconds');\nvar minutes      = makeGetter('minutes');\nvar hours        = makeGetter('hours');\nvar days         = makeGetter('days');\nvar months       = makeGetter('months');\nvar years        = makeGetter('years');\n\nfunction weeks () {\n    return absFloor(this.days() / 7);\n}\n\nvar round = Math.round;\nvar thresholds = {\n    ss: 44,         // a few seconds to seconds\n    s : 45,         // seconds to minute\n    m : 45,         // minutes to hour\n    h : 22,         // hours to day\n    d : 26,         // days to month\n    M : 11          // months to year\n};\n\n// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\nfunction substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n    return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n}\n\nfunction relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n    var duration = createDuration(posNegDuration).abs();\n    var seconds  = round(duration.as('s'));\n    var minutes  = round(duration.as('m'));\n    var hours    = round(duration.as('h'));\n    var days     = round(duration.as('d'));\n    var months   = round(duration.as('M'));\n    var years    = round(duration.as('y'));\n\n    var a = seconds <= thresholds.ss && ['s', seconds]  ||\n            seconds < thresholds.s   && ['ss', seconds] ||\n            minutes <= 1             && ['m']           ||\n            minutes < thresholds.m   && ['mm', minutes] ||\n            hours   <= 1             && ['h']           ||\n            hours   < thresholds.h   && ['hh', hours]   ||\n            days    <= 1             && ['d']           ||\n            days    < thresholds.d   && ['dd', days]    ||\n            months  <= 1             && ['M']           ||\n            months  < thresholds.M   && ['MM', months]  ||\n            years   <= 1             && ['y']           || ['yy', years];\n\n    a[2] = withoutSuffix;\n    a[3] = +posNegDuration > 0;\n    a[4] = locale;\n    return substituteTimeAgo.apply(null, a);\n}\n\n// This function allows you to set the rounding function for relative time strings\nfunction getSetRelativeTimeRounding (roundingFunction) {\n    if (roundingFunction === undefined) {\n        return round;\n    }\n    if (typeof(roundingFunction) === 'function') {\n        round = roundingFunction;\n        return true;\n    }\n    return false;\n}\n\n// This function allows you to set a threshold for relative time strings\nfunction getSetRelativeTimeThreshold (threshold, limit) {\n    if (thresholds[threshold] === undefined) {\n        return false;\n    }\n    if (limit === undefined) {\n        return thresholds[threshold];\n    }\n    thresholds[threshold] = limit;\n    if (threshold === 's') {\n        thresholds.ss = limit - 1;\n    }\n    return true;\n}\n\nfunction humanize (withSuffix) {\n    if (!this.isValid()) {\n        return this.localeData().invalidDate();\n    }\n\n    var locale = this.localeData();\n    var output = relativeTime$1(this, !withSuffix, locale);\n\n    if (withSuffix) {\n        output = locale.pastFuture(+this, output);\n    }\n\n    return locale.postformat(output);\n}\n\nvar abs$1 = Math.abs;\n\nfunction sign(x) {\n    return ((x > 0) - (x < 0)) || +x;\n}\n\nfunction toISOString$1() {\n    // for ISO strings we do not use the normal bubbling rules:\n    //  * milliseconds bubble up until they become hours\n    //  * days do not bubble at all\n    //  * months bubble up until they become years\n    // This is because there is no context-free conversion between hours and days\n    // (think of clock changes)\n    // and also not between days and months (28-31 days per month)\n    if (!this.isValid()) {\n        return this.localeData().invalidDate();\n    }\n\n    var seconds = abs$1(this._milliseconds) / 1000;\n    var days         = abs$1(this._days);\n    var months       = abs$1(this._months);\n    var minutes, hours, years;\n\n    // 3600 seconds -> 60 minutes -> 1 hour\n    minutes           = absFloor(seconds / 60);\n    hours             = absFloor(minutes / 60);\n    seconds %= 60;\n    minutes %= 60;\n\n    // 12 months -> 1 year\n    years  = absFloor(months / 12);\n    months %= 12;\n\n\n    // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n    var Y = years;\n    var M = months;\n    var D = days;\n    var h = hours;\n    var m = minutes;\n    var s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n    var total = this.asSeconds();\n\n    if (!total) {\n        // this is the same as C#'s (Noda) and python (isodate)...\n        // but not other JS (goog.date)\n        return 'P0D';\n    }\n\n    var totalSign = total < 0 ? '-' : '';\n    var ymSign = sign(this._months) !== sign(total) ? '-' : '';\n    var daysSign = sign(this._days) !== sign(total) ? '-' : '';\n    var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n    return totalSign + 'P' +\n        (Y ? ymSign + Y + 'Y' : '') +\n        (M ? ymSign + M + 'M' : '') +\n        (D ? daysSign + D + 'D' : '') +\n        ((h || m || s) ? 'T' : '') +\n        (h ? hmsSign + h + 'H' : '') +\n        (m ? hmsSign + m + 'M' : '') +\n        (s ? hmsSign + s + 'S' : '');\n}\n\nvar proto$2 = Duration.prototype;\n\nproto$2.isValid        = isValid$1;\nproto$2.abs            = abs;\nproto$2.add            = add$1;\nproto$2.subtract       = subtract$1;\nproto$2.as             = as;\nproto$2.asMilliseconds = asMilliseconds;\nproto$2.asSeconds      = asSeconds;\nproto$2.asMinutes      = asMinutes;\nproto$2.asHours        = asHours;\nproto$2.asDays         = asDays;\nproto$2.asWeeks        = asWeeks;\nproto$2.asMonths       = asMonths;\nproto$2.asYears        = asYears;\nproto$2.valueOf        = valueOf$1;\nproto$2._bubble        = bubble;\nproto$2.clone          = clone$1;\nproto$2.get            = get$2;\nproto$2.milliseconds   = milliseconds;\nproto$2.seconds        = seconds;\nproto$2.minutes        = minutes;\nproto$2.hours          = hours;\nproto$2.days           = days;\nproto$2.weeks          = weeks;\nproto$2.months         = months;\nproto$2.years          = years;\nproto$2.humanize       = humanize;\nproto$2.toISOString    = toISOString$1;\nproto$2.toString       = toISOString$1;\nproto$2.toJSON         = toISOString$1;\nproto$2.locale         = locale;\nproto$2.localeData     = localeData;\n\n// Deprecations\nproto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\nproto$2.lang = lang;\n\n// Side effect imports\n\n// FORMATTING\n\naddFormatToken('X', 0, 0, 'unix');\naddFormatToken('x', 0, 0, 'valueOf');\n\n// PARSING\n\naddRegexToken('x', matchSigned);\naddRegexToken('X', matchTimestamp);\naddParseToken('X', function (input, array, config) {\n    config._d = new Date(parseFloat(input, 10) * 1000);\n});\naddParseToken('x', function (input, array, config) {\n    config._d = new Date(toInt(input));\n});\n\n// Side effect imports\n\n\nhooks.version = '2.20.1';\n\nsetHookCallback(createLocal);\n\nhooks.fn                    = proto;\nhooks.min                   = min;\nhooks.max                   = max;\nhooks.now                   = now;\nhooks.utc                   = createUTC;\nhooks.unix                  = createUnix;\nhooks.months                = listMonths;\nhooks.isDate                = isDate;\nhooks.locale                = getSetGlobalLocale;\nhooks.invalid               = createInvalid;\nhooks.duration              = createDuration;\nhooks.isMoment              = isMoment;\nhooks.weekdays              = listWeekdays;\nhooks.parseZone             = createInZone;\nhooks.localeData            = getLocale;\nhooks.isDuration            = isDuration;\nhooks.monthsShort           = listMonthsShort;\nhooks.weekdaysMin           = listWeekdaysMin;\nhooks.defineLocale          = defineLocale;\nhooks.updateLocale          = updateLocale;\nhooks.locales               = listLocales;\nhooks.weekdaysShort         = listWeekdaysShort;\nhooks.normalizeUnits        = normalizeUnits;\nhooks.relativeTimeRounding  = getSetRelativeTimeRounding;\nhooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\nhooks.calendarFormat        = getCalendarFormat;\nhooks.prototype             = proto;\n\n// currently HTML5 input type only supports 24-hour formats\nhooks.HTML5_FMT = {\n    DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm',             // <input type=\"datetime-local\" />\n    DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss',  // <input type=\"datetime-local\" step=\"1\" />\n    DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS',   // <input type=\"datetime-local\" step=\"0.001\" />\n    DATE: 'YYYY-MM-DD',                             // <input type=\"date\" />\n    TIME: 'HH:mm',                                  // <input type=\"time\" />\n    TIME_SECONDS: 'HH:mm:ss',                       // <input type=\"time\" step=\"1\" />\n    TIME_MS: 'HH:mm:ss.SSS',                        // <input type=\"time\" step=\"0.001\" />\n    WEEK: 'YYYY-[W]WW',                             // <input type=\"week\" />\n    MONTH: 'YYYY-MM'                                // <input type=\"month\" />\n};\n\nreturn hooks;\n\n})));\n\n\n/*** EXPORTS FROM exports-to-window-loader ***/\nwindow['moment'] = __webpack_require__(41);\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(349)(module)))\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.toSingleLine = toSingleLine;\n\nvar _array = __webpack_require__(1);\n\n/**\n * Tags a multiline string and return new one without line break characters and following spaces.\n *\n * @param {Array} strings Parts of the entire string without expressions.\n * @param {...String} expressions Expressions converted to strings, which are added to the entire string.\n * @returns {String}\n */\nfunction toSingleLine(strings) {\n  for (var _len = arguments.length, expressions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    expressions[_key - 1] = arguments[_key];\n  }\n\n  var result = (0, _array.arrayReduce)(strings, function (previousValue, currentValue, index) {\n\n    var valueWithoutWhiteSpaces = currentValue.replace(/(?:\\r?\\n\\s+)/g, '');\n    var expressionForIndex = expressions[index] ? expressions[index] : '';\n\n    return previousValue + valueWithoutWhiteSpaces + expressionForIndex;\n  }, '');\n\n  return result.trim();\n} /* eslint-disable import/prefer-default-export */\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.isFunction = isFunction;\nexports.throttle = throttle;\nexports.throttleAfterHits = throttleAfterHits;\nexports.debounce = debounce;\nexports.pipe = pipe;\nexports.partial = partial;\nexports.curry = curry;\nexports.curryRight = curryRight;\n\nvar _array = __webpack_require__(1);\n\n/**\n * Checks if given variable is function.\n *\n * @param {*} func Variable to check.\n * @returns {Boolean}\n */\nfunction isFunction(func) {\n  return typeof func === 'function';\n}\n\n/**\n * Creates throttle function that enforces a maximum number of times a function (`func`) can be called over time (`wait`).\n *\n * @param {Function} func Function to invoke.\n * @param {Number} wait Delay in miliseconds.\n * @returns {Function}\n */\nfunction throttle(func) {\n  var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;\n\n  var lastCalled = 0;\n  var result = {\n    lastCallThrottled: true\n  };\n  var lastTimer = null;\n\n  function _throttle() {\n    var _this = this;\n\n    var args = arguments;\n    var stamp = Date.now();\n    var needCall = false;\n\n    result.lastCallThrottled = true;\n\n    if (!lastCalled) {\n      lastCalled = stamp;\n      needCall = true;\n    }\n    var remaining = wait - (stamp - lastCalled);\n\n    if (needCall) {\n      result.lastCallThrottled = false;\n      func.apply(this, args);\n    } else {\n      if (lastTimer) {\n        clearTimeout(lastTimer);\n      }\n      lastTimer = setTimeout(function () {\n        result.lastCallThrottled = false;\n        func.apply(_this, args);\n        lastCalled = 0;\n        lastTimer = void 0;\n      }, remaining);\n    }\n\n    return result;\n  }\n\n  return _throttle;\n}\n\n/**\n * Creates throttle function that enforces a maximum number of times a function (`func`) can be called over\n * time (`wait`) after specified hits.\n *\n * @param {Function} func Function to invoke.\n * @param {Number} wait Delay in miliseconds.\n * @param {Number} hits Number of hits after throttling will be applied.\n * @returns {Function}\n */\nfunction throttleAfterHits(func) {\n  var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;\n  var hits = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;\n\n  var funcThrottle = throttle(func, wait);\n  var remainHits = hits;\n\n  function _clearHits() {\n    remainHits = hits;\n  }\n  function _throttleAfterHits() {\n    if (remainHits) {\n      remainHits--;\n\n      return func.apply(this, arguments);\n    }\n\n    return funcThrottle.apply(this, arguments);\n  }\n  _throttleAfterHits.clearHits = _clearHits;\n\n  return _throttleAfterHits;\n}\n\n/**\n * Creates debounce function that enforces a function (`func`) not be called again until a certain amount of time (`wait`)\n * has passed without it being called.\n *\n * @param {Function} func Function to invoke.\n * @param {Number} wait Delay in milliseconds.\n * @returns {Function}\n */\nfunction debounce(func) {\n  var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;\n\n  var lastTimer = null;\n  var result = void 0;\n\n  function _debounce() {\n    var _this2 = this;\n\n    var args = arguments;\n\n    if (lastTimer) {\n      clearTimeout(lastTimer);\n    }\n    lastTimer = setTimeout(function () {\n      result = func.apply(_this2, args);\n    }, wait);\n\n    return result;\n  }\n\n  return _debounce;\n}\n\n/**\n * Creates the function that returns the result of calling the given functions. Result of the first function is passed to\n * the second as an argument and so on. Only first function in the chain can handle multiple arguments.\n *\n * @param {Function} functions Functions to compose.\n * @returns {Function}\n */\nfunction pipe() {\n  for (var _len = arguments.length, functions = Array(_len), _key = 0; _key < _len; _key++) {\n    functions[_key] = arguments[_key];\n  }\n\n  var firstFunc = functions[0],\n      restFunc = functions.slice(1);\n\n\n  return function _pipe() {\n    return (0, _array.arrayReduce)(restFunc, function (acc, fn) {\n      return fn(acc);\n    }, firstFunc.apply(this, arguments));\n  };\n}\n\n/**\n * Creates the function that returns the function with cached arguments.\n *\n * @param {Function} func Function to partialization.\n * @param {Array} params Function arguments to cache.\n * @returns {Function}\n */\nfunction partial(func) {\n  for (var _len2 = arguments.length, params = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n    params[_key2 - 1] = arguments[_key2];\n  }\n\n  return function _partial() {\n    for (var _len3 = arguments.length, restParams = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n      restParams[_key3] = arguments[_key3];\n    }\n\n    return func.apply(this, params.concat(restParams));\n  };\n}\n\n/**\n * Creates the functions that returns the function with cached arguments. If count if passed arguments will be matched\n * to the arguments defined in `func` then function will be invoked.\n * Arguments are added to the stack in direction from the left to the right.\n *\n * @example\n * ```\n * var replace = curry(function(find, replace, string) {\n *   return string.replace(find, replace);\n * });\n *\n * // returns function with bounded first argument\n * var replace = replace('foo')\n *\n * // returns replaced string - all arguments was passed so function was invoked\n * replace('bar', 'Some test with foo...');\n *\n * ```\n *\n * @param {Function} func Function to currying.\n * @returns {Function}\n */\nfunction curry(func) {\n  var argsLength = func.length;\n\n  function given(argsSoFar) {\n    return function _curry() {\n      for (var _len4 = arguments.length, params = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        params[_key4] = arguments[_key4];\n      }\n\n      var passedArgsSoFar = argsSoFar.concat(params);\n      var result = void 0;\n\n      if (passedArgsSoFar.length >= argsLength) {\n        result = func.apply(this, passedArgsSoFar);\n      } else {\n        result = given(passedArgsSoFar);\n      }\n\n      return result;\n    };\n  }\n\n  return given([]);\n}\n\n/**\n * Creates the functions that returns the function with cached arguments. If count if passed arguments will be matched\n * to the arguments defined in `func` then function will be invoked.\n * Arguments are added to the stack in direction from the right to the left.\n *\n * @example\n * ```\n * var replace = curry(function(find, replace, string) {\n *   return string.replace(find, replace);\n * });\n *\n * // returns function with bounded first argument\n * var replace = replace('Some test with foo...')\n *\n * // returns replaced string - all arguments was passed so function was invoked\n * replace('bar', 'foo');\n *\n * ```\n *\n * @param {Function} func Function to currying.\n * @returns {Function}\n */\nfunction curryRight(func) {\n  var argsLength = func.length;\n\n  function given(argsSoFar) {\n    return function _curry() {\n      for (var _len5 = arguments.length, params = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n        params[_key5] = arguments[_key5];\n      }\n\n      var passedArgsSoFar = argsSoFar.concat(params.reverse());\n      var result = void 0;\n\n      if (passedArgsSoFar.length >= argsLength) {\n        result = func.apply(this, passedArgsSoFar);\n      } else {\n        result = given(passedArgsSoFar);\n      }\n\n      return result;\n    };\n  }\n\n  return given([]);\n}\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports) {\n\nvar toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports) {\n\nvar core = module.exports = { version: '2.5.5' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nmodule.exports = function (it, TYPE) {\n  if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n  return it;\n};\n\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = __webpack_require__(11)('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(31)(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n  ArrayProto[UNSCOPABLES][key] = true;\n};\n\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.createClassName = createClassName;\nexports.createDefaultCustomBorder = createDefaultCustomBorder;\nexports.createSingleEmptyBorder = createSingleEmptyBorder;\nexports.createDefaultHtBorder = createDefaultHtBorder;\nexports.createEmptyBorders = createEmptyBorders;\nexports.extendDefaultBorder = extendDefaultBorder;\nexports.checkSelectionBorders = checkSelectionBorders;\nexports.markSelected = markSelected;\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\n/**\n * Create separated class name for borders for each cell.\n *\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @returns {String}\n */\nfunction createClassName(row, col) {\n  return 'border_row' + row + 'col' + col;\n}\n\n/**\n * Create default single border for each position (top/right/bottom/left).\n *\n * @returns {Object} `{{width: number, color: string}}`\n */\nfunction createDefaultCustomBorder() {\n  return {\n    width: 1,\n    color: '#000'\n  };\n}\n\n/**\n * Create default object for empty border.\n *\n * @returns {Object} `{{hide: boolean}}`\n */\nfunction createSingleEmptyBorder() {\n  return { hide: true };\n}\n\n/**\n * Create default Handsontable border object.\n *\n * @returns {Object} `{{width: number, color: string, cornerVisible: boolean}}`\n */\nfunction createDefaultHtBorder() {\n  return {\n    width: 1,\n    color: '#000',\n    cornerVisible: false\n  };\n}\n\n/**\n * Prepare empty border for each cell with all custom borders hidden.\n *\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @returns {Object} `{{className: *, border: *, row: *, col: *, top: {hide: boolean}, right: {hide: boolean}, bottom: {hide: boolean}, left: {hide: boolean}}}`\n */\nfunction createEmptyBorders(row, col) {\n  return {\n    className: createClassName(row, col),\n    border: createDefaultHtBorder(),\n    row: row,\n    col: col,\n    top: createSingleEmptyBorder(),\n    right: createSingleEmptyBorder(),\n    bottom: createSingleEmptyBorder(),\n    left: createSingleEmptyBorder()\n  };\n}\n\nfunction extendDefaultBorder(defaultBorder, customBorder) {\n  if ((0, _object.hasOwnProperty)(customBorder, 'border')) {\n    defaultBorder.border = customBorder.border;\n  }\n\n  if ((0, _object.hasOwnProperty)(customBorder, 'top')) {\n    defaultBorder.top = customBorder.top;\n  }\n\n  if ((0, _object.hasOwnProperty)(customBorder, 'right')) {\n    defaultBorder.right = customBorder.right;\n  }\n\n  if ((0, _object.hasOwnProperty)(customBorder, 'bottom')) {\n    defaultBorder.bottom = customBorder.bottom;\n  }\n\n  if ((0, _object.hasOwnProperty)(customBorder, 'left')) {\n    defaultBorder.left = customBorder.left;\n  }\n\n  return defaultBorder;\n}\n\n/**\n * Check if selection has border by className\n *\n * @param hot\n * @param direction\n */\nfunction checkSelectionBorders(hot, direction) {\n  var atLeastOneHasBorder = false;\n\n  (0, _array.arrayEach)(hot.getSelectedRange(), function (range) {\n    range.forAll(function (r, c) {\n      var metaBorders = hot.getCellMeta(r, c).borders;\n\n      if (metaBorders) {\n        if (direction) {\n          if (!(0, _object.hasOwnProperty)(metaBorders[direction], 'hide')) {\n            atLeastOneHasBorder = true;\n            return false; // breaks forAll\n          }\n        } else {\n          atLeastOneHasBorder = true;\n          return false; // breaks forAll\n        }\n      }\n    });\n  });\n\n  return atLeastOneHasBorder;\n}\n\n/**\n * Mark label in contextMenu as selected\n *\n * @param label\n * @returns {string}\n */\nfunction markSelected(label) {\n  return '<span class=\"selected\">' + String.fromCharCode(10003) + '</span>' + label; // workaround for https://github.com/handsontable/handsontable/issues/1946\n}\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports) {\n\nvar id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports) {\n\nmodule.exports = {};\n\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar def = __webpack_require__(20).f;\nvar has = __webpack_require__(29);\nvar TAG = __webpack_require__(11)('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports) {\n\nexports.f = {}.propertyIsEnumerable;\n\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.EditorState = undefined;\n\nvar _src = __webpack_require__(4);\n\nvar _mixed = __webpack_require__(16);\n\nvar EditorState = exports.EditorState = {\n  VIRGIN: 'STATE_VIRGIN', // before editing\n  EDITING: 'STATE_EDITING',\n  WAITING: 'STATE_WAITING', // waiting for async validation\n  FINISHED: 'STATE_FINISHED'\n};\n\nfunction BaseEditor(instance) {\n  this.instance = instance;\n  this.state = EditorState.VIRGIN;\n\n  this._opened = false;\n  this._fullEditMode = false;\n  this._closeCallback = null;\n\n  this.init();\n}\n\nBaseEditor.prototype._fireCallbacks = function (result) {\n  if (this._closeCallback) {\n    this._closeCallback(result);\n    this._closeCallback = null;\n  }\n};\n\nBaseEditor.prototype.init = function () {};\n\nBaseEditor.prototype.getValue = function () {\n  throw Error('Editor getValue() method unimplemented');\n};\n\nBaseEditor.prototype.setValue = function (newValue) {\n  throw Error('Editor setValue() method unimplemented');\n};\n\nBaseEditor.prototype.open = function () {\n  throw Error('Editor open() method unimplemented');\n};\n\nBaseEditor.prototype.close = function () {\n  throw Error('Editor close() method unimplemented');\n};\n\nBaseEditor.prototype.prepare = function (row, col, prop, td, originalValue, cellProperties) {\n  this.TD = td;\n  this.row = row;\n  this.col = col;\n  this.prop = prop;\n  this.originalValue = originalValue;\n  this.cellProperties = cellProperties;\n  this.state = EditorState.VIRGIN;\n};\n\nBaseEditor.prototype.extend = function () {\n  var baseClass = this.constructor;\n\n  function Editor() {\n    baseClass.apply(this, arguments);\n  }\n\n  function inherit(Child, Parent) {\n    function Bridge() {}\n    Bridge.prototype = Parent.prototype;\n    Child.prototype = new Bridge();\n    Child.prototype.constructor = Child;\n\n    return Child;\n  }\n\n  return inherit(Editor, baseClass);\n};\n\nBaseEditor.prototype.saveValue = function (value, ctrlDown) {\n  var selection = void 0;\n  var tmp = void 0;\n\n  // if ctrl+enter and multiple cells selected, behave like Excel (finish editing and apply to all cells)\n  if (ctrlDown) {\n    selection = this.instance.getSelectedLast();\n\n    if (selection[0] > selection[2]) {\n      tmp = selection[0];\n      selection[0] = selection[2];\n      selection[2] = tmp;\n    }\n    if (selection[1] > selection[3]) {\n      tmp = selection[1];\n      selection[1] = selection[3];\n      selection[3] = tmp;\n    }\n  } else {\n    selection = [this.row, this.col, null, null];\n  }\n\n  this.instance.populateFromArray(selection[0], selection[1], value, selection[2], selection[3], 'edit');\n};\n\nBaseEditor.prototype.beginEditing = function (newInitialValue, event) {\n  if (this.state !== EditorState.VIRGIN) {\n    return;\n  }\n  this.instance.view.scrollViewport(new _src.CellCoords(this.row, this.col));\n  this.instance.view.render();\n  this.state = EditorState.EDITING;\n\n  newInitialValue = typeof newInitialValue === 'string' ? newInitialValue : this.originalValue;\n  this.setValue((0, _mixed.stringify)(newInitialValue));\n\n  this.open(event);\n  this._opened = true;\n  this.focus();\n\n  // only rerender the selections (FillHandle should disappear when beginediting is triggered)\n  this.instance.view.render();\n\n  this.instance.runHooks('afterBeginEditing', this.row, this.col);\n};\n\nBaseEditor.prototype.finishEditing = function (restoreOriginalValue, ctrlDown, callback) {\n  var _this = this,\n      val;\n\n  if (callback) {\n    var previousCloseCallback = this._closeCallback;\n\n    this._closeCallback = function (result) {\n      if (previousCloseCallback) {\n        previousCloseCallback(result);\n      }\n\n      callback(result);\n      _this.instance.view.render();\n    };\n  }\n\n  if (this.isWaiting()) {\n    return;\n  }\n\n  if (this.state == EditorState.VIRGIN) {\n    this.instance._registerTimeout(setTimeout(function () {\n      _this._fireCallbacks(true);\n    }, 0));\n\n    return;\n  }\n\n  if (this.state == EditorState.EDITING) {\n    if (restoreOriginalValue) {\n      this.cancelChanges();\n      this.instance.view.render();\n\n      return;\n    }\n\n    var value = this.getValue();\n\n    if (this.instance.getSettings().trimWhitespace) {\n      // We trim only string values\n      val = [[typeof value === 'string' ? String.prototype.trim.call(value || '') : value]];\n    } else {\n      val = [[value]];\n    }\n\n    this.state = EditorState.WAITING;\n    this.saveValue(val, ctrlDown);\n\n    if (this.instance.getCellValidator(this.cellProperties)) {\n      this.instance.addHookOnce('postAfterValidate', function (result) {\n        _this.state = EditorState.FINISHED;\n        _this.discardEditor(result);\n      });\n    } else {\n      this.state = EditorState.FINISHED;\n      this.discardEditor(true);\n    }\n  }\n};\n\nBaseEditor.prototype.cancelChanges = function () {\n  this.state = EditorState.FINISHED;\n  this.discardEditor();\n};\n\nBaseEditor.prototype.discardEditor = function (result) {\n  if (this.state !== EditorState.FINISHED) {\n    return;\n  }\n  // validator was defined and failed\n  if (result === false && this.cellProperties.allowInvalid !== true) {\n    this.instance.selectCell(this.row, this.col);\n    this.focus();\n    this.state = EditorState.EDITING;\n    this._fireCallbacks(false);\n  } else {\n    this.close();\n    this._opened = false;\n    this._fullEditMode = false;\n    this.state = EditorState.VIRGIN;\n    this._fireCallbacks(true);\n  }\n};\n\n/**\n * Switch editor into full edit mode. In this state navigation keys don't close editor. This mode is activated\n * automatically after hit ENTER or F2 key on the cell or while editing cell press F2 key.\n */\nBaseEditor.prototype.enableFullEditMode = function () {\n  this._fullEditMode = true;\n};\n\n/**\n * Checks if editor is in full edit mode.\n *\n * @returns {Boolean}\n */\nBaseEditor.prototype.isInFullEditMode = function () {\n  return this._fullEditMode;\n};\n\nBaseEditor.prototype.isOpened = function () {\n  return this._opened;\n};\n\nBaseEditor.prototype.isWaiting = function () {\n  return this.state === EditorState.WAITING;\n};\n\nBaseEditor.prototype.checkEditorSection = function () {\n  var totalRows = this.instance.countRows();\n  var section = '';\n\n  if (this.row < this.instance.getSettings().fixedRowsTop) {\n    if (this.col < this.instance.getSettings().fixedColumnsLeft) {\n      section = 'top-left-corner';\n    } else {\n      section = 'top';\n    }\n  } else if (this.instance.getSettings().fixedRowsBottom && this.row >= totalRows - this.instance.getSettings().fixedRowsBottom) {\n    if (this.col < this.instance.getSettings().fixedColumnsLeft) {\n      section = 'bottom-left-corner';\n    } else {\n      section = 'bottom';\n    }\n  } else if (this.col < this.instance.getSettings().fixedColumnsLeft) {\n    section = 'left';\n  }\n\n  return section;\n};\n\nexports.default = BaseEditor;\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * CellCoords holds cell coordinates (row, column) and few method to validate them and\n * retrieve as an array or an object\n *\n * @class CellCoords\n */\nvar CellCoords = function () {\n  /**\n   * @param {Number} row Row index\n   * @param {Number} col Column index\n   */\n  function CellCoords(row, col) {\n    _classCallCheck(this, CellCoords);\n\n    if (typeof row !== 'undefined' && typeof col !== 'undefined') {\n      this.row = row;\n      this.col = col;\n    } else {\n      this.row = null;\n      this.col = null;\n    }\n  }\n\n  /**\n   * Checks if given set of coordinates is valid in context of a given Walkontable instance\n   *\n   * @param {Walkontable} wotInstance\n   * @returns {Boolean}\n   */\n\n\n  _createClass(CellCoords, [{\n    key: 'isValid',\n    value: function isValid(wotInstance) {\n      // is it a valid cell index (0 or higher)\n      if (this.row < 0 || this.col < 0) {\n        return false;\n      }\n      // is selection within total rows and columns\n      if (this.row >= wotInstance.getSetting('totalRows') || this.col >= wotInstance.getSetting('totalColumns')) {\n        return false;\n      }\n\n      return true;\n    }\n\n    /**\n     * Checks if this cell coords are the same as cell coords given as a parameter\n     *\n     * @param {CellCoords} cellCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isEqual',\n    value: function isEqual(cellCoords) {\n      if (cellCoords === this) {\n        return true;\n      }\n\n      return this.row === cellCoords.row && this.col === cellCoords.col;\n    }\n\n    /**\n     * Checks if tested coordinates are positioned in south-east from this cell coords\n     *\n     * @param {Object} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSouthEastOf',\n    value: function isSouthEastOf(testedCoords) {\n      return this.row >= testedCoords.row && this.col >= testedCoords.col;\n    }\n\n    /**\n     * Checks if tested coordinates are positioned in north-east from this cell coords\n     *\n     * @param {Object} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNorthWestOf',\n    value: function isNorthWestOf(testedCoords) {\n      return this.row <= testedCoords.row && this.col <= testedCoords.col;\n    }\n\n    /**\n     * Checks if tested coordinates are positioned in south-west from this cell coords\n     *\n     * @param {Object} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSouthWestOf',\n    value: function isSouthWestOf(testedCoords) {\n      return this.row >= testedCoords.row && this.col <= testedCoords.col;\n    }\n\n    /**\n     * Checks if tested coordinates are positioned in north-east from this cell coords\n     *\n     * @param {Object} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNorthEastOf',\n    value: function isNorthEastOf(testedCoords) {\n      return this.row <= testedCoords.row && this.col >= testedCoords.col;\n    }\n\n    /**\n     * Convert CellCoords to literal object.\n     *\n     * @return {Object} Returns a literal object with `row` and `col` properties.\n     */\n\n  }, {\n    key: 'toObject',\n    value: function toObject() {\n      return {\n        row: this.row,\n        col: this.col\n      };\n    }\n  }]);\n\n  return CellCoords;\n}();\n\nexports.default = CellCoords;\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.log = log;\nexports.warn = warn;\nexports.info = info;\nexports.error = error;\n\nvar _mixed = __webpack_require__(16);\n\n/**\n * Logs message to the console if the `console` object is exposed.\n *\n * @param {...*} args Values which will be logged.\n */\nfunction log() {\n  if ((0, _mixed.isDefined)(console)) {\n    var _console;\n\n    (_console = console).log.apply(_console, arguments);\n  }\n} /* eslint-disable no-console */\n/* eslint-disable no-restricted-globals */\n\n/**\n * \"In Internet Explorer 9 (and 8), the console object is only exposed when the developer tools are opened\n * for a particular tab.\"\n *\n * Source: https://stackoverflow.com/a/5473193\n */\n\n;\n\n/**\n * Logs warn to the console if the `console` object is exposed.\n *\n * @param {...*} args Values which will be logged.\n */\nfunction warn() {\n  if ((0, _mixed.isDefined)(console)) {\n    var _console2;\n\n    (_console2 = console).warn.apply(_console2, arguments);\n  }\n};\n\n/**\n * Logs info to the console if the `console` object is exposed.\n *\n * @param {...*} args Values which will be logged.\n */\nfunction info() {\n  if ((0, _mixed.isDefined)(console)) {\n    var _console3;\n\n    (_console3 = console).info.apply(_console3, arguments);\n  }\n};\n\n/**\n * Logs error to the console if the `console` object is exposed.\n *\n * @param {...*} args Values which will be logged.\n */\nfunction error() {\n  if ((0, _mixed.isDefined)(console)) {\n    var _console4;\n\n    (_console4 = console).error.apply(_console4, arguments);\n  }\n};\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _autoResize = __webpack_require__(355);\n\nvar _autoResize2 = _interopRequireDefault(_autoResize);\n\nvar _baseEditor = __webpack_require__(54);\n\nvar _baseEditor2 = _interopRequireDefault(_baseEditor);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _unicode = __webpack_require__(21);\n\nvar _event = __webpack_require__(12);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar TextEditor = _baseEditor2.default.prototype.extend();\n\n/**\n * @private\n * @editor TextEditor\n * @class TextEditor\n * @dependencies autoResize\n */\nTextEditor.prototype.init = function () {\n  var that = this;\n  this.createElements();\n  this.eventManager = new _eventManager2.default(this);\n  this.bindEvents();\n  this.autoResize = (0, _autoResize2.default)();\n\n  this.instance.addHook('afterDestroy', function () {\n    that.destroy();\n  });\n};\n\nTextEditor.prototype.getValue = function () {\n  return this.TEXTAREA.value;\n};\n\nTextEditor.prototype.setValue = function (newValue) {\n  this.TEXTAREA.value = newValue;\n};\n\nvar onBeforeKeyDown = function onBeforeKeyDown(event) {\n  var instance = this,\n      that = instance.getActiveEditor(),\n      ctrlDown;\n\n  // catch CTRL but not right ALT (which in some systems triggers ALT+CTRL)\n  ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey;\n\n  // Process only events that have been fired in the editor\n  if (event.target !== that.TEXTAREA || (0, _event.isImmediatePropagationStopped)(event)) {\n    return;\n  }\n\n  if (event.keyCode === 17 || event.keyCode === 224 || event.keyCode === 91 || event.keyCode === 93) {\n    // when CTRL or its equivalent is pressed and cell is edited, don't prepare selectable text in textarea\n    (0, _event.stopImmediatePropagation)(event);\n    return;\n  }\n\n  switch (event.keyCode) {\n    case _unicode.KEY_CODES.ARROW_RIGHT:\n      if (that.isInFullEditMode()) {\n        if (!that.isWaiting() && !that.allowKeyEventPropagation || !that.isWaiting() && that.allowKeyEventPropagation && !that.allowKeyEventPropagation(event.keyCode)) {\n          (0, _event.stopImmediatePropagation)(event);\n        }\n      }\n      break;\n    case _unicode.KEY_CODES.ARROW_LEFT:\n      if (that.isInFullEditMode()) {\n        if (!that.isWaiting() && !that.allowKeyEventPropagation || !that.isWaiting() && that.allowKeyEventPropagation && !that.allowKeyEventPropagation(event.keyCode)) {\n          (0, _event.stopImmediatePropagation)(event);\n        }\n      }\n      break;\n    case _unicode.KEY_CODES.ARROW_UP:\n    case _unicode.KEY_CODES.ARROW_DOWN:\n      if (that.isInFullEditMode()) {\n        if (!that.isWaiting() && !that.allowKeyEventPropagation || !that.isWaiting() && that.allowKeyEventPropagation && !that.allowKeyEventPropagation(event.keyCode)) {\n          (0, _event.stopImmediatePropagation)(event);\n        }\n      }\n      break;\n\n    case _unicode.KEY_CODES.ENTER:\n      {\n        var isMultipleSelection = this.selection.isMultiple();\n\n        if (ctrlDown && !isMultipleSelection || event.altKey) {\n          // if ctrl+enter or alt+enter, add new line\n          if (that.isOpened()) {\n            var caretPosition = (0, _element.getCaretPosition)(that.TEXTAREA);\n            var value = that.getValue();\n            var newValue = value.slice(0, caretPosition) + '\\n' + value.slice(caretPosition);\n\n            that.setValue(newValue);\n\n            (0, _element.setCaretPosition)(that.TEXTAREA, caretPosition + 1);\n          } else {\n            that.beginEditing(that.originalValue + '\\n');\n          }\n          (0, _event.stopImmediatePropagation)(event);\n        }\n        event.preventDefault(); // don't add newline to field\n        break;\n      }\n    case _unicode.KEY_CODES.A:\n    case _unicode.KEY_CODES.X:\n    case _unicode.KEY_CODES.C:\n    case _unicode.KEY_CODES.V:\n      if (ctrlDown) {\n        (0, _event.stopImmediatePropagation)(event); // CTRL+A, CTRL+C, CTRL+V, CTRL+X should only work locally when cell is edited (not in table context)\n      }\n      break;\n\n    case _unicode.KEY_CODES.BACKSPACE:\n    case _unicode.KEY_CODES.DELETE:\n    case _unicode.KEY_CODES.HOME:\n    case _unicode.KEY_CODES.END:\n      (0, _event.stopImmediatePropagation)(event); // backspace, delete, home, end should only work locally when cell is edited (not in table context)\n      break;\n    default:\n      break;\n  }\n\n  if ([_unicode.KEY_CODES.ARROW_UP, _unicode.KEY_CODES.ARROW_RIGHT, _unicode.KEY_CODES.ARROW_DOWN, _unicode.KEY_CODES.ARROW_LEFT].indexOf(event.keyCode) === -1) {\n    that.autoResize.resize(String.fromCharCode(event.keyCode));\n  }\n};\n\nTextEditor.prototype.open = function () {\n  this.refreshDimensions(); // need it instantly, to prevent https://github.com/handsontable/handsontable/issues/348\n\n  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);\n};\n\nTextEditor.prototype.close = function (tdOutside) {\n  this.textareaParentStyle.display = 'none';\n\n  this.autoResize.unObserve();\n\n  if (document.activeElement === this.TEXTAREA) {\n    this.instance.listen(); // don't refocus the table if user focused some cell outside of HT on purpose\n  }\n  this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n};\n\nTextEditor.prototype.focus = function () {\n  this.TEXTAREA.focus();\n  (0, _element.setCaretPosition)(this.TEXTAREA, this.TEXTAREA.value.length);\n};\n\nTextEditor.prototype.createElements = function () {\n  //    this.$body = $(document.body);\n\n  this.TEXTAREA = document.createElement('TEXTAREA');\n\n  (0, _element.addClass)(this.TEXTAREA, 'handsontableInput');\n\n  this.textareaStyle = this.TEXTAREA.style;\n  this.textareaStyle.width = 0;\n  this.textareaStyle.height = 0;\n\n  this.TEXTAREA_PARENT = document.createElement('DIV');\n  (0, _element.addClass)(this.TEXTAREA_PARENT, 'handsontableInputHolder');\n\n  this.textareaParentStyle = this.TEXTAREA_PARENT.style;\n  this.textareaParentStyle.top = 0;\n  this.textareaParentStyle.left = 0;\n  this.textareaParentStyle.display = 'none';\n\n  this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n\n  this.instance.rootElement.appendChild(this.TEXTAREA_PARENT);\n\n  var that = this;\n  this.instance._registerTimeout(setTimeout(function () {\n    that.refreshDimensions();\n  }, 0));\n};\n\nTextEditor.prototype.getEditedCell = function () {\n  var editorSection = this.checkEditorSection(),\n      editedCell;\n\n  switch (editorSection) {\n    case 'top':\n      editedCell = this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 101;\n      break;\n    case 'top-left-corner':\n      editedCell = this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 103;\n      break;\n    case 'bottom-left-corner':\n      editedCell = this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 103;\n      break;\n    case 'left':\n      editedCell = this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 102;\n      break;\n    case 'bottom':\n      editedCell = this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 102;\n      break;\n    default:\n      editedCell = this.instance.getCell(this.row, this.col);\n      this.textareaParentStyle.zIndex = '';\n      break;\n  }\n\n  return editedCell != -1 && editedCell != -2 ? editedCell : void 0;\n};\n\nTextEditor.prototype.refreshValue = function () {\n  var sourceData = this.instance.getSourceDataAtCell(this.row, this.prop);\n  this.originalValue = sourceData;\n\n  this.setValue(sourceData);\n  this.refreshDimensions();\n};\n\nTextEditor.prototype.refreshDimensions = function () {\n  if (this.state !== _baseEditor.EditorState.EDITING) {\n    return;\n  }\n  this.TD = this.getEditedCell();\n\n  // TD is outside of the viewport.\n  if (!this.TD) {\n    this.close(true);\n\n    return;\n  }\n\n  var currentOffset = (0, _element.offset)(this.TD);\n  var containerOffset = (0, _element.offset)(this.instance.rootElement);\n  var scrollableContainer = this.instance.view.wt.wtOverlays.topOverlay.mainTableScrollableElement;\n  var totalRowsCount = this.instance.countRows();\n  var containerScrollTop = scrollableContainer !== window ? scrollableContainer.scrollTop : 0;\n  var containerScrollLeft = scrollableContainer !== window ? scrollableContainer.scrollLeft : 0;\n\n  var editorSection = this.checkEditorSection();\n\n  var scrollTop = ['', 'left'].includes(editorSection) ? containerScrollTop : 0;\n  var scrollLeft = ['', 'top', 'bottom'].includes(editorSection) ? containerScrollLeft : 0;\n\n  // If colHeaders is disabled, cells in the first row have border-top\n  var editTopModifier = currentOffset.top === containerOffset.top ? 0 : 1;\n\n  var settings = this.instance.getSettings();\n  var rowHeadersCount = this.instance.hasRowHeaders();\n  var colHeadersCount = this.instance.hasColHeaders();\n  var backgroundColor = this.TD.style.backgroundColor;\n\n  var editTop = currentOffset.top - containerOffset.top - editTopModifier - scrollTop;\n  var editLeft = currentOffset.left - containerOffset.left - 1 - scrollLeft;\n  var cssTransformOffset = void 0;\n\n  // TODO: Refactor this to the new instance.getCell method (from #ply-59), after 0.12.1 is released\n  switch (editorSection) {\n    case 'top':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'left':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'top-left-corner':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'bottom-left-corner':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'bottom':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.holder.parentNode);\n      break;\n    default:\n      break;\n  }\n\n  if (colHeadersCount && this.instance.getSelectedLast()[0] === 0 || settings.fixedRowsBottom && this.instance.getSelectedLast()[0] === totalRowsCount - settings.fixedRowsBottom) {\n    editTop += 1;\n  }\n\n  if (this.instance.getSelectedLast()[1] === 0) {\n    editLeft += 1;\n  }\n\n  if (cssTransformOffset && cssTransformOffset != -1) {\n    this.textareaParentStyle[cssTransformOffset[0]] = cssTransformOffset[1];\n  } else {\n    (0, _element.resetCssTransform)(this.TEXTAREA_PARENT);\n  }\n\n  this.textareaParentStyle.top = editTop + 'px';\n  this.textareaParentStyle.left = editLeft + 'px';\n\n  var firstRowOffset = this.instance.view.wt.wtViewport.rowsRenderCalculator.startPosition;\n  var firstColumnOffset = this.instance.view.wt.wtViewport.columnsRenderCalculator.startPosition;\n  var horizontalScrollPosition = this.instance.view.wt.wtOverlays.leftOverlay.getScrollPosition();\n  var verticalScrollPosition = this.instance.view.wt.wtOverlays.topOverlay.getScrollPosition();\n  var scrollbarWidth = (0, _element.getScrollbarWidth)();\n\n  var cellTopOffset = this.TD.offsetTop + firstRowOffset - verticalScrollPosition;\n  var cellLeftOffset = this.TD.offsetLeft + firstColumnOffset - horizontalScrollPosition;\n\n  var width = (0, _element.innerWidth)(this.TD) - 8;\n  var actualVerticalScrollbarWidth = (0, _element.hasVerticalScrollbar)(scrollableContainer) ? scrollbarWidth : 0;\n  var actualHorizontalScrollbarWidth = (0, _element.hasHorizontalScrollbar)(scrollableContainer) ? scrollbarWidth : 0;\n  var maxWidth = this.instance.view.maximumVisibleElementWidth(cellLeftOffset) - 9 - actualVerticalScrollbarWidth;\n  var height = this.TD.scrollHeight + 1;\n  var maxHeight = Math.max(this.instance.view.maximumVisibleElementHeight(cellTopOffset) - actualHorizontalScrollbarWidth, 23);\n\n  var cellComputedStyle = (0, _element.getComputedStyle)(this.TD);\n\n  this.TEXTAREA.style.fontSize = cellComputedStyle.fontSize;\n  this.TEXTAREA.style.fontFamily = cellComputedStyle.fontFamily;\n  this.TEXTAREA.style.backgroundColor = ''; // RESET STYLE\n  this.TEXTAREA.style.backgroundColor = backgroundColor ? backgroundColor : (0, _element.getComputedStyle)(this.TEXTAREA).backgroundColor;\n\n  this.autoResize.init(this.TEXTAREA, {\n    minHeight: Math.min(height, maxHeight),\n    maxHeight: maxHeight, // TEXTAREA should never be wider than visible part of the viewport (should not cover the scrollbar)\n    minWidth: Math.min(width, maxWidth),\n    maxWidth: maxWidth // TEXTAREA should never be wider than visible part of the viewport (should not cover the scrollbar)\n  }, true);\n\n  this.textareaParentStyle.display = 'block';\n};\n\nTextEditor.prototype.bindEvents = function () {\n  var editor = this;\n\n  this.eventManager.addEventListener(this.TEXTAREA, 'cut', function (event) {\n    (0, _event.stopPropagation)(event);\n  });\n\n  this.eventManager.addEventListener(this.TEXTAREA, 'paste', function (event) {\n    (0, _event.stopPropagation)(event);\n  });\n\n  this.instance.addHook('afterScrollHorizontally', function () {\n    editor.refreshDimensions();\n  });\n\n  this.instance.addHook('afterScrollVertically', function () {\n    editor.refreshDimensions();\n  });\n\n  this.instance.addHook('afterColumnResize', function () {\n    editor.refreshDimensions();\n    editor.focus();\n  });\n\n  this.instance.addHook('afterRowResize', function () {\n    editor.refreshDimensions();\n    editor.focus();\n  });\n\n  this.instance.addHook('afterDestroy', function () {\n    editor.eventManager.destroy();\n  });\n};\n\nTextEditor.prototype.destroy = function () {\n  this.eventManager.destroy();\n};\n\nexports.default = TextEditor;\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar MIXIN_NAME = 'localHooks';\n\n/**\n * Mixin object to extend objects functionality for local hooks.\n *\n * @type {Object}\n */\nvar localHooks = {\n  /**\n   * Internal hooks storage.\n   */\n  _localHooks: Object.create(null),\n\n  /**\n   * Add hook to the collection.\n   *\n   * @param {String} key Hook name.\n   * @param {Function} callback Hook callback\n   */\n  addLocalHook: function addLocalHook(key, callback) {\n    if (!this._localHooks[key]) {\n      this._localHooks[key] = [];\n    }\n    this._localHooks[key].push(callback);\n  },\n\n\n  /**\n   * Run hooks.\n   *\n   * @param {String} key Hook name.\n   * @param {*} params\n   */\n  runLocalHooks: function runLocalHooks(key) {\n    var _this = this;\n\n    for (var _len = arguments.length, params = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      params[_key - 1] = arguments[_key];\n    }\n\n    if (this._localHooks[key]) {\n      (0, _array.arrayEach)(this._localHooks[key], function (callback) {\n        return callback.apply(_this, params);\n      });\n    }\n  },\n\n\n  /**\n   * Clear all added hooks.\n   */\n  clearLocalHooks: function clearLocalHooks() {\n    this._localHooks = {};\n  }\n};\n\n(0, _object.defineGetter)(localHooks, 'MIXIN_NAME', MIXIN_NAME, {\n  writable: false,\n  enumerable: false\n});\n\nexports.default = localHooks;\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports) {\n\n// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(59);\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar redefine = __webpack_require__(30);\nmodule.exports = function (target, src, safe) {\n  for (var key in src) redefine(target, key, src[key], safe);\n  return target;\n};\n\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it, Constructor, name, forbiddenField) {\n  if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n    throw TypeError(name + ': incorrect invocation!');\n  } return it;\n};\n\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ctx = __webpack_require__(32);\nvar call = __webpack_require__(102);\nvar isArrayIter = __webpack_require__(103);\nvar anObject = __webpack_require__(18);\nvar toLength = __webpack_require__(25);\nvar getIterFn = __webpack_require__(104);\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n  var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n  var f = ctx(fn, that, entries ? 2 : 1);\n  var index = 0;\n  var length, step, iterator, result;\n  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n  // fast case for arrays with default iterator\n  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n    if (result === BREAK || result === RETURN) return result;\n  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n    result = call(iterator, f, step.value, entries);\n    if (result === BREAK || result === RETURN) return result;\n  }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports) {\n\nmodule.exports = false;\n\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar global = __webpack_require__(14);\nvar $export = __webpack_require__(3);\nvar redefine = __webpack_require__(30);\nvar redefineAll = __webpack_require__(61);\nvar meta = __webpack_require__(34);\nvar forOf = __webpack_require__(64);\nvar anInstance = __webpack_require__(63);\nvar isObject = __webpack_require__(9);\nvar fails = __webpack_require__(23);\nvar $iterDetect = __webpack_require__(79);\nvar setToStringTag = __webpack_require__(52);\nvar inheritIfRequired = __webpack_require__(329);\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n  var Base = global[NAME];\n  var C = Base;\n  var ADDER = IS_MAP ? 'set' : 'add';\n  var proto = C && C.prototype;\n  var O = {};\n  var fixMethod = function (KEY) {\n    var fn = proto[KEY];\n    redefine(proto, KEY,\n      KEY == 'delete' ? function (a) {\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'has' ? function has(a) {\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'get' ? function get(a) {\n        return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n        : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n    );\n  };\n  if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n    new C().entries().next();\n  }))) {\n    // create collection constructor\n    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n    redefineAll(C.prototype, methods);\n    meta.NEED = true;\n  } else {\n    var instance = new C();\n    // early implementations not supports chaining\n    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n    // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false\n    var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n    // most early implementations doesn't supports iterables, most modern - not close it correctly\n    var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n    // for early implementations -0 and +0 not the same\n    var BUGGY_ZERO = !IS_WEAK && fails(function () {\n      // V8 ~ Chromium 42- fails only with 5+ elements\n      var $instance = new C();\n      var index = 5;\n      while (index--) $instance[ADDER](index, index);\n      return !$instance.has(-0);\n    });\n    if (!ACCEPT_ITERABLES) {\n      C = wrapper(function (target, iterable) {\n        anInstance(target, C, NAME);\n        var that = inheritIfRequired(new Base(), target, C);\n        if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n        return that;\n      });\n      C.prototype = proto;\n      proto.constructor = C;\n    }\n    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n      fixMethod('delete');\n      fixMethod('has');\n      IS_MAP && fixMethod('get');\n    }\n    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n    // weak collections should not contains .clear method\n    if (IS_WEAK && proto.clear) delete proto.clear;\n  }\n\n  setToStringTag(C, NAME);\n\n  O[NAME] = C;\n  $export($export.G + $export.W + $export.F * (C != Base), O);\n\n  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n  return C;\n};\n\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar pIE = __webpack_require__(53);\nvar createDesc = __webpack_require__(50);\nvar toIObject = __webpack_require__(24);\nvar toPrimitive = __webpack_require__(73);\nvar has = __webpack_require__(29);\nvar IE8_DOM_DEFINE = __webpack_require__(98);\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = __webpack_require__(22) ? gOPD : function getOwnPropertyDescriptor(O, P) {\n  O = toIObject(O);\n  P = toPrimitive(P, true);\n  if (IE8_DOM_DEFINE) try {\n    return gOPD(O, P);\n  } catch (e) { /* empty */ }\n  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = __webpack_require__(32);\nvar IObject = __webpack_require__(75);\nvar toObject = __webpack_require__(33);\nvar toLength = __webpack_require__(25);\nvar asc = __webpack_require__(330);\nmodule.exports = function (TYPE, $create) {\n  var IS_MAP = TYPE == 1;\n  var IS_FILTER = TYPE == 2;\n  var IS_SOME = TYPE == 3;\n  var IS_EVERY = TYPE == 4;\n  var IS_FIND_INDEX = TYPE == 6;\n  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n  var create = $create || asc;\n  return function ($this, callbackfn, that) {\n    var O = toObject($this);\n    var self = IObject(O);\n    var f = ctx(callbackfn, that, 3);\n    var length = toLength(self.length);\n    var index = 0;\n    var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n    var val, res;\n    for (;length > index; index++) if (NO_HOLES || index in self) {\n      val = self[index];\n      res = f(val, index, O);\n      if (TYPE) {\n        if (IS_MAP) result[index] = res;   // map\n        else if (res) switch (TYPE) {\n          case 3: return true;             // some\n          case 5: return val;              // find\n          case 6: return index;            // findIndex\n          case 2: result.push(val);        // filter\n        } else if (IS_EVERY) return false; // every\n      }\n    }\n    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n  };\n};\n\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports) {\n\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar hide = __webpack_require__(31);\nvar redefine = __webpack_require__(30);\nvar fails = __webpack_require__(23);\nvar defined = __webpack_require__(38);\nvar wks = __webpack_require__(11);\n\nmodule.exports = function (KEY, length, exec) {\n  var SYMBOL = wks(KEY);\n  var fns = exec(defined, SYMBOL, ''[KEY]);\n  var strfn = fns[0];\n  var rxfn = fns[1];\n  if (fails(function () {\n    var O = {};\n    O[SYMBOL] = function () { return 7; };\n    return ''[KEY](O) != 7;\n  })) {\n    redefine(String.prototype, KEY, strfn);\n    hide(RegExp.prototype, SYMBOL, length == 2\n      // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n      // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n      ? function (string, arg) { return rxfn.call(string, this, arg); }\n      // 21.2.5.6 RegExp.prototype[@@match](string)\n      // 21.2.5.9 RegExp.prototype[@@search](string)\n      : function (string) { return rxfn.call(string, this); }\n    );\n  }\n};\n\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.DEFAULT_LANGUAGE_CODE = exports.getLanguagesDictionaries = exports.getDefaultLanguageDictionary = exports.hasLanguageDictionary = exports.getLanguageDictionary = exports.registerLanguageDictionary = undefined;\n\nvar _object = __webpack_require__(2);\n\nvar _utils = __webpack_require__(317);\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _enUS = __webpack_require__(391);\n\nvar _enUS2 = _interopRequireDefault(_enUS);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar DEFAULT_LANGUAGE_CODE = _enUS2.default.languageCode;\n\nvar _staticRegister = (0, _staticRegister3.default)('languagesDictionaries'),\n    registerGloballyLanguageDictionary = _staticRegister.register,\n    getGlobalLanguageDictionary = _staticRegister.getItem,\n    hasGlobalLanguageDictionary = _staticRegister.hasItem,\n    getGlobalLanguagesDictionaries = _staticRegister.getValues;\n\n/**\n * Register language dictionary for specific language code.\n *\n * @param {String|Object} languageCodeOrDictionary Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE' or object representing dictionary.\n * @param {Object} dictionary Dictionary for specific language (optional if first parameter has already dictionary).\n */\n\n\nfunction registerLanguage(languageCodeOrDictionary, dictionary) {\n  var languageCode = languageCodeOrDictionary;\n\n  // Dictionary passed as first argument.\n  if ((0, _object.isObject)(languageCodeOrDictionary)) {\n    dictionary = languageCodeOrDictionary;\n    languageCode = dictionary.languageCode;\n  }\n\n  extendLanguageDictionary(languageCode, dictionary);\n  registerGloballyLanguageDictionary(languageCode, (0, _object.deepClone)(dictionary));\n\n  // We do not allow user to work with dictionary by reference, it can cause lot of bugs.\n  return (0, _object.deepClone)(dictionary);\n};\n\n/**\n * Get language dictionary for specific language code.\n *\n * @param {String} languageCode Language code.\n * @returns {Object} Object with constants representing identifiers for translation (as keys) and corresponding translation phrases (as values).\n */\nfunction getLanguage(languageCode) {\n  if (!hasLanguage(languageCode)) {\n    return null;\n  }\n\n  return (0, _object.deepClone)(getGlobalLanguageDictionary(languageCode));\n}\n\n/**\n *\n * Get if language with specified language code was registered.\n *\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n * @returns {Boolean}\n */\nfunction hasLanguage(languageCode) {\n  return hasGlobalLanguageDictionary(languageCode);\n}\n\n/**\n * Get default language dictionary.\n *\n * @returns {Object} Object with constants representing identifiers for translation (as keys) and corresponding translation phrases (as values).\n */\nfunction getDefaultLanguage() {\n  return _enUS2.default;\n}\n\n/**\n * Extend handled dictionary by default language dictionary. As result, if any dictionary key isn't defined for specific language, it will be filled with default language value (\"dictionary gaps\" are supplemented).\n *\n * @private\n * @param {String} languageCode Language code.\n * @param {Object} dictionary Dictionary which is extended.\n */\nfunction extendLanguageDictionary(languageCode, dictionary) {\n  if (languageCode !== DEFAULT_LANGUAGE_CODE) {\n    (0, _utils.extendNotExistingKeys)(dictionary, getGlobalLanguageDictionary(DEFAULT_LANGUAGE_CODE));\n  }\n}\n\n/**\n * Get registered language dictionaries.\n *\n * @returns {Array}\n */\nfunction getLanguages() {\n  return getGlobalLanguagesDictionaries();\n}\n\nexports.registerLanguageDictionary = registerLanguage;\nexports.getLanguageDictionary = getLanguage;\nexports.hasLanguageDictionary = hasLanguage;\nexports.getDefaultLanguageDictionary = getDefaultLanguage;\nexports.getLanguagesDictionaries = getLanguages;\nexports.DEFAULT_LANGUAGE_CODE = DEFAULT_LANGUAGE_CODE;\n\n/**\n * Automatically registers default dictionary.\n */\n\nregisterLanguage(_enUS2.default);\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nvar document = __webpack_require__(14).document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(9);\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(18);\nvar dPs = __webpack_require__(327);\nvar enumBugKeys = __webpack_require__(78);\nvar IE_PROTO = __webpack_require__(76)('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = __webpack_require__(72)('iframe');\n  var i = enumBugKeys.length;\n  var lt = '<';\n  var gt = '>';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  __webpack_require__(101).appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n  return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty();\n    Empty[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = createDict();\n  return Properties === undefined ? result : dPs(result, Properties);\n};\n\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(44);\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar shared = __webpack_require__(77)('keys');\nvar uid = __webpack_require__(49);\nmodule.exports = function (key) {\n  return shared[key] || (shared[key] = uid(key));\n};\n\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function (key) {\n  return store[key] || (store[key] = {});\n};\n\n\n/***/ }),\n/* 78 */\n/***/ (function(module, exports) {\n\n// IE 8- don't enum bug keys\nmodule.exports = (\n  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n\n\n/***/ }),\n/* 79 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ITERATOR = __webpack_require__(11)('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n  var riter = [7][ITERATOR]();\n  riter['return'] = function () { SAFE_CLOSING = true; };\n  // eslint-disable-next-line no-throw-literal\n  Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n  if (!skipClosing && !SAFE_CLOSING) return false;\n  var safe = false;\n  try {\n    var arr = [7];\n    var iter = arr[ITERATOR]();\n    iter.next = function () { return { done: safe = true }; };\n    arr[ITERATOR] = function () { return iter; };\n    exec(arr);\n  } catch (e) { /* empty */ }\n  return safe;\n};\n\n\n/***/ }),\n/* 80 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ctx = __webpack_require__(32);\nvar invoke = __webpack_require__(333);\nvar html = __webpack_require__(101);\nvar cel = __webpack_require__(72);\nvar global = __webpack_require__(14);\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n  var id = +this;\n  // eslint-disable-next-line no-prototype-builtins\n  if (queue.hasOwnProperty(id)) {\n    var fn = queue[id];\n    delete queue[id];\n    fn();\n  }\n};\nvar listener = function (event) {\n  run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n  setTask = function setImmediate(fn) {\n    var args = [];\n    var i = 1;\n    while (arguments.length > i) args.push(arguments[i++]);\n    queue[++counter] = function () {\n      // eslint-disable-next-line no-new-func\n      invoke(typeof fn == 'function' ? fn : Function(fn), args);\n    };\n    defer(counter);\n    return counter;\n  };\n  clearTask = function clearImmediate(id) {\n    delete queue[id];\n  };\n  // Node.js 0.8-\n  if (__webpack_require__(44)(process) == 'process') {\n    defer = function (id) {\n      process.nextTick(ctx(run, id, 1));\n    };\n  // Sphere (JS game engine) Dispatch API\n  } else if (Dispatch && Dispatch.now) {\n    defer = function (id) {\n      Dispatch.now(ctx(run, id, 1));\n    };\n  // Browsers with MessageChannel, includes WebWorkers\n  } else if (MessageChannel) {\n    channel = new MessageChannel();\n    port = channel.port2;\n    channel.port1.onmessage = listener;\n    defer = ctx(port.postMessage, port, 1);\n  // Browsers with postMessage, skip WebWorkers\n  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n    defer = function (id) {\n      global.postMessage(id + '', '*');\n    };\n    global.addEventListener('message', listener, false);\n  // IE8-\n  } else if (ONREADYSTATECHANGE in cel('script')) {\n    defer = function (id) {\n      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n        html.removeChild(this);\n        run.call(id);\n      };\n    };\n  // Rest old browsers\n  } else {\n    defer = function (id) {\n      setTimeout(ctx(run, id, 1), 0);\n    };\n  }\n}\nmodule.exports = {\n  set: setTask,\n  clear: clearTask\n};\n\n\n/***/ }),\n/* 81 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = __webpack_require__(99);\nvar hiddenKeys = __webpack_require__(78).concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return $keys(O, hiddenKeys);\n};\n\n\n/***/ }),\n/* 82 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = __webpack_require__(142);\nvar defined = __webpack_require__(38);\n\nmodule.exports = function (that, searchString, NAME) {\n  if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n  return String(defined(that));\n};\n\n\n/***/ }),\n/* 83 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar MATCH = __webpack_require__(11)('match');\nmodule.exports = function (KEY) {\n  var re = /./;\n  try {\n    '/./'[KEY](re);\n  } catch (e) {\n    try {\n      re[MATCH] = false;\n      return !'/./'[KEY](re);\n    } catch (f) { /* empty */ }\n  } return true;\n};\n\n\n/***/ }),\n/* 84 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $defineProperty = __webpack_require__(20);\nvar createDesc = __webpack_require__(50);\n\nmodule.exports = function (object, index, value) {\n  if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n  else object[index] = value;\n};\n\n\n/***/ }),\n/* 85 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar addToUnscopables = __webpack_require__(47);\nvar step = __webpack_require__(108);\nvar Iterators = __webpack_require__(51);\nvar toIObject = __webpack_require__(24);\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = __webpack_require__(106)(Array, 'Array', function (iterated, kind) {\n  this._t = toIObject(iterated); // target\n  this._i = 0;                   // next index\n  this._k = kind;                // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var kind = this._k;\n  var index = this._i++;\n  if (!O || index >= O.length) {\n    this._t = undefined;\n    return step(1);\n  }\n  if (kind == 'keys') return step(0, index);\n  if (kind == 'values') return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n\n/***/ }),\n/* 86 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _coords = __webpack_require__(55);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * A cell range is a set of exactly two CellCoords (that can be the same or different).\n *\n * @class CellRange\n */\nvar CellRange = function () {\n  /**\n   * @param {CellCoords} highlight Used to draw bold border around a cell where selection was\n   *                               started and to edit the cell when you press Enter.\n   * @param {CellCoords} [from] Usually the same as highlight, but in Excel there is distinction - one can change\n   *                            highlight within a selection.\n   * @param {CellCoords} [to] End selection.\n   */\n  function CellRange(highlight) {\n    var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : highlight;\n    var to = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : highlight;\n\n    _classCallCheck(this, CellRange);\n\n    this.highlight = highlight;\n    this.from = from;\n    this.to = to;\n  }\n\n  /**\n   * Set the new coordinates for highlighting selection.\n   *\n   * @param {CellCoords} coords Coordinates to use.\n   */\n\n\n  _createClass(CellRange, [{\n    key: 'setHighlight',\n    value: function setHighlight(coords) {\n      this.highlight = coords;\n\n      return this;\n    }\n\n    /**\n     * Set the new coordinates where selection starts from.\n     *\n     * @param {CellCoords} coords Coordinates to use.\n     */\n\n  }, {\n    key: 'setFrom',\n    value: function setFrom(coords) {\n      this.from = coords;\n\n      return this;\n    }\n\n    /**\n     * Set new coordinates where selection ends from.\n     *\n     * @param {CellCoords} coords Coordinates to use.\n     */\n\n  }, {\n    key: 'setTo',\n    value: function setTo(coords) {\n      this.to = coords;\n\n      return this;\n    }\n\n    /**\n     * Checks if given coords are valid in context of a given Walkontable instance\n     *\n     * @param {Walkontable} wotInstance\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isValid',\n    value: function isValid(wotInstance) {\n      return this.from.isValid(wotInstance) && this.to.isValid(wotInstance);\n    }\n\n    /**\n     * Checks if this cell range is restricted to one cell\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSingle',\n    value: function isSingle() {\n      return this.from.row === this.to.row && this.from.col === this.to.col;\n    }\n\n    /**\n     * Returns selected range height (in number of rows)\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getHeight',\n    value: function getHeight() {\n      return Math.max(this.from.row, this.to.row) - Math.min(this.from.row, this.to.row) + 1;\n    }\n\n    /**\n     * Returns selected range width (in number of columns)\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getWidth',\n    value: function getWidth() {\n      return Math.max(this.from.col, this.to.col) - Math.min(this.from.col, this.to.col) + 1;\n    }\n\n    /**\n     * Checks if given cell coords is within `from` and `to` cell coords of this range\n     *\n     * @param {CellCoords} cellCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'includes',\n    value: function includes(cellCoords) {\n      var row = cellCoords.row,\n          col = cellCoords.col;\n\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n\n      return topLeft.row <= row && bottomRight.row >= row && topLeft.col <= col && bottomRight.col >= col;\n    }\n\n    /**\n     * Checks if given range is within of this range\n     *\n     * @param {CellRange} testedRange\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'includesRange',\n    value: function includesRange(testedRange) {\n      return this.includes(testedRange.getTopLeftCorner()) && this.includes(testedRange.getBottomRightCorner());\n    }\n\n    /**\n     * Checks if given range is equal to this range\n     *\n     * @param {CellRange} testedRange\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isEqual',\n    value: function isEqual(testedRange) {\n      return Math.min(this.from.row, this.to.row) === Math.min(testedRange.from.row, testedRange.to.row) && Math.max(this.from.row, this.to.row) === Math.max(testedRange.from.row, testedRange.to.row) && Math.min(this.from.col, this.to.col) === Math.min(testedRange.from.col, testedRange.to.col) && Math.max(this.from.col, this.to.col) === Math.max(testedRange.from.col, testedRange.to.col);\n    }\n\n    /**\n     * Checks if tested range overlaps with the range.\n     * Range A is considered to to be overlapping with range B if intersection of A and B or B and A is not empty.\n     *\n     * @param {CellRange} testedRange\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'overlaps',\n    value: function overlaps(testedRange) {\n      return testedRange.isSouthEastOf(this.getTopLeftCorner()) && testedRange.isNorthWestOf(this.getBottomRightCorner());\n    }\n\n    /**\n     * @param {CellRange} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSouthEastOf',\n    value: function isSouthEastOf(testedCoords) {\n      return this.getTopLeftCorner().isSouthEastOf(testedCoords) || this.getBottomRightCorner().isSouthEastOf(testedCoords);\n    }\n\n    /**\n     * @param {CellRange} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNorthWestOf',\n    value: function isNorthWestOf(testedCoords) {\n      return this.getTopLeftCorner().isNorthWestOf(testedCoords) || this.getBottomRightCorner().isNorthWestOf(testedCoords);\n    }\n\n    /**\n     * Returns `true` if the provided range is overlapping the current range horizontally\n     * (e.g. the current range's last column is 5 and the provided range's first column is 3).\n     *\n     * @param {CellRange} range The range to check against.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isOverlappingHorizontally',\n    value: function isOverlappingHorizontally(range) {\n      return this.getTopRightCorner().col >= range.getTopLeftCorner().col && this.getTopRightCorner().col <= range.getTopRightCorner().col || this.getTopLeftCorner().col <= range.getTopRightCorner().col && this.getTopLeftCorner().col >= range.getTopLeftCorner().col;\n    }\n\n    /**\n     * Returns `true` if the provided range is overlapping the current range vertically\n     * (e.g. the current range's last row is 5 and the provided range's first row is 3).\n     *\n     * @param {CellRange} range The range to check against.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isOverlappingVertically',\n    value: function isOverlappingVertically(range) {\n      return this.getBottomRightCorner().row >= range.getTopRightCorner().row && this.getBottomRightCorner().row <= range.getBottomRightCorner().row || this.getTopRightCorner().row <= range.getBottomRightCorner().row && this.getTopRightCorner().row >= range.getTopRightCorner().row;\n    }\n\n    /**\n     * Adds a cell to a range (only if exceeds corners of the range). Returns information if range was expanded\n     *\n     * @param {CellCoords} cellCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'expand',\n    value: function expand(cellCoords) {\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n\n      if (cellCoords.row < topLeft.row || cellCoords.col < topLeft.col || cellCoords.row > bottomRight.row || cellCoords.col > bottomRight.col) {\n        this.from = new _coords2.default(Math.min(topLeft.row, cellCoords.row), Math.min(topLeft.col, cellCoords.col));\n        this.to = new _coords2.default(Math.max(bottomRight.row, cellCoords.row), Math.max(bottomRight.col, cellCoords.col));\n\n        return true;\n      }\n\n      return false;\n    }\n\n    /**\n     * @param {CellRange} expandingRange\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'expandByRange',\n    value: function expandByRange(expandingRange) {\n      if (this.includesRange(expandingRange) || !this.overlaps(expandingRange)) {\n        return false;\n      }\n\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n      var initialDirection = this.getDirection();\n\n      var expandingTopLeft = expandingRange.getTopLeftCorner();\n      var expandingBottomRight = expandingRange.getBottomRightCorner();\n\n      var resultTopRow = Math.min(topLeft.row, expandingTopLeft.row);\n      var resultTopCol = Math.min(topLeft.col, expandingTopLeft.col);\n      var resultBottomRow = Math.max(bottomRight.row, expandingBottomRight.row);\n      var resultBottomCol = Math.max(bottomRight.col, expandingBottomRight.col);\n\n      var finalFrom = new _coords2.default(resultTopRow, resultTopCol);\n      var finalTo = new _coords2.default(resultBottomRow, resultBottomCol);\n\n      this.from = finalFrom;\n      this.to = finalTo;\n\n      this.setDirection(initialDirection);\n\n      if (this.highlight.row === this.getBottomRightCorner().row && this.getVerticalDirection() === 'N-S') {\n        this.flipDirectionVertically();\n      }\n\n      if (this.highlight.col === this.getTopRightCorner().col && this.getHorizontalDirection() === 'W-E') {\n        this.flipDirectionHorizontally();\n      }\n\n      return true;\n    }\n\n    /**\n     * @returns {String}\n     */\n\n  }, {\n    key: 'getDirection',\n    value: function getDirection() {\n      if (this.from.isNorthWestOf(this.to)) {\n        // NorthWest - SouthEast\n        return 'NW-SE';\n      } else if (this.from.isNorthEastOf(this.to)) {\n        // NorthEast - SouthWest\n        return 'NE-SW';\n      } else if (this.from.isSouthEastOf(this.to)) {\n        // SouthEast - NorthWest\n        return 'SE-NW';\n      } else if (this.from.isSouthWestOf(this.to)) {\n        // SouthWest - NorthEast\n        return 'SW-NE';\n      }\n    }\n\n    /**\n     * Get the vertical direction of the range.\n     *\n     * @returns {String} Available options: `N-S` (north->south), `S-N` (south->north).\n     */\n\n  }, {\n    key: 'getVerticalDirection',\n    value: function getVerticalDirection() {\n      return ['NE-SW', 'NW-SE'].indexOf(this.getDirection()) > -1 ? 'N-S' : 'S-N';\n    }\n\n    /**\n     * Get the horizontal direction of the range.\n     *\n     * @returns {String} Available options: `W-E` (west->east), `E-W` (east->west).\n     */\n\n  }, {\n    key: 'getHorizontalDirection',\n    value: function getHorizontalDirection() {\n      return ['NW-SE', 'SW-NE'].indexOf(this.getDirection()) > -1 ? 'W-E' : 'E-W';\n    }\n\n    /**\n     * @param {String} direction\n     */\n\n  }, {\n    key: 'setDirection',\n    value: function setDirection(direction) {\n      switch (direction) {\n        case 'NW-SE':\n          var _ref = [this.getTopLeftCorner(), this.getBottomRightCorner()];\n          this.from = _ref[0];\n          this.to = _ref[1];\n\n          break;\n        case 'NE-SW':\n          var _ref2 = [this.getTopRightCorner(), this.getBottomLeftCorner()];\n          this.from = _ref2[0];\n          this.to = _ref2[1];\n\n          break;\n        case 'SE-NW':\n          var _ref3 = [this.getBottomRightCorner(), this.getTopLeftCorner()];\n          this.from = _ref3[0];\n          this.to = _ref3[1];\n\n          break;\n        case 'SW-NE':\n          var _ref4 = [this.getBottomLeftCorner(), this.getTopRightCorner()];\n          this.from = _ref4[0];\n          this.to = _ref4[1];\n\n          break;\n        default:\n          break;\n      }\n    }\n\n    /**\n     * Flip the direction vertically. (e.g. `NW-SE` changes to `SW-NE`)\n     */\n\n  }, {\n    key: 'flipDirectionVertically',\n    value: function flipDirectionVertically() {\n      var direction = this.getDirection();\n      switch (direction) {\n        case 'NW-SE':\n          this.setDirection('SW-NE');\n          break;\n        case 'NE-SW':\n          this.setDirection('SE-NW');\n          break;\n        case 'SE-NW':\n          this.setDirection('NE-SW');\n          break;\n        case 'SW-NE':\n          this.setDirection('NW-SE');\n          break;\n        default:\n          break;\n      }\n    }\n\n    /**\n     * Flip the direction horizontally. (e.g. `NW-SE` changes to `NE-SW`)\n     */\n\n  }, {\n    key: 'flipDirectionHorizontally',\n    value: function flipDirectionHorizontally() {\n      var direction = this.getDirection();\n      switch (direction) {\n        case 'NW-SE':\n          this.setDirection('NE-SW');\n          break;\n        case 'NE-SW':\n          this.setDirection('NW-SE');\n          break;\n        case 'SE-NW':\n          this.setDirection('SW-NE');\n          break;\n        case 'SW-NE':\n          this.setDirection('SE-NW');\n          break;\n        default:\n          break;\n      }\n    }\n\n    /**\n     * Get top left corner of this range\n     *\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getTopLeftCorner',\n    value: function getTopLeftCorner() {\n      return new _coords2.default(Math.min(this.from.row, this.to.row), Math.min(this.from.col, this.to.col));\n    }\n\n    /**\n     * Get bottom right corner of this range\n     *\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getBottomRightCorner',\n    value: function getBottomRightCorner() {\n      return new _coords2.default(Math.max(this.from.row, this.to.row), Math.max(this.from.col, this.to.col));\n    }\n\n    /**\n     * Get top right corner of this range\n     *\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getTopRightCorner',\n    value: function getTopRightCorner() {\n      return new _coords2.default(Math.min(this.from.row, this.to.row), Math.max(this.from.col, this.to.col));\n    }\n\n    /**\n     * Get bottom left corner of this range\n     *\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getBottomLeftCorner',\n    value: function getBottomLeftCorner() {\n      return new _coords2.default(Math.max(this.from.row, this.to.row), Math.min(this.from.col, this.to.col));\n    }\n\n    /**\n     * @param {CellCoords} coords\n     * @param {CellRange} expandedRange\n     * @returns {*}\n     */\n\n  }, {\n    key: 'isCorner',\n    value: function isCorner(coords, expandedRange) {\n      if (expandedRange && expandedRange.includes(coords) && (this.getTopLeftCorner().isEqual(new _coords2.default(expandedRange.from.row, expandedRange.from.col)) || this.getTopRightCorner().isEqual(new _coords2.default(expandedRange.from.row, expandedRange.to.col)) || this.getBottomLeftCorner().isEqual(new _coords2.default(expandedRange.to.row, expandedRange.from.col)) || this.getBottomRightCorner().isEqual(new _coords2.default(expandedRange.to.row, expandedRange.to.col)))) {\n        return true;\n      }\n\n      return coords.isEqual(this.getTopLeftCorner()) || coords.isEqual(this.getTopRightCorner()) || coords.isEqual(this.getBottomLeftCorner()) || coords.isEqual(this.getBottomRightCorner());\n    }\n\n    /**\n     * @param {CellCoords} coords\n     * @param {CellRange} expandedRange\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getOppositeCorner',\n    value: function getOppositeCorner(coords, expandedRange) {\n      if (!(coords instanceof _coords2.default)) {\n        return false;\n      }\n\n      if (expandedRange) {\n        if (expandedRange.includes(coords)) {\n          if (this.getTopLeftCorner().isEqual(new _coords2.default(expandedRange.from.row, expandedRange.from.col))) {\n            return this.getBottomRightCorner();\n          }\n          if (this.getTopRightCorner().isEqual(new _coords2.default(expandedRange.from.row, expandedRange.to.col))) {\n            return this.getBottomLeftCorner();\n          }\n          if (this.getBottomLeftCorner().isEqual(new _coords2.default(expandedRange.to.row, expandedRange.from.col))) {\n            return this.getTopRightCorner();\n          }\n          if (this.getBottomRightCorner().isEqual(new _coords2.default(expandedRange.to.row, expandedRange.to.col))) {\n            return this.getTopLeftCorner();\n          }\n        }\n      }\n\n      if (coords.isEqual(this.getBottomRightCorner())) {\n        return this.getTopLeftCorner();\n      } else if (coords.isEqual(this.getTopLeftCorner())) {\n        return this.getBottomRightCorner();\n      } else if (coords.isEqual(this.getTopRightCorner())) {\n        return this.getBottomLeftCorner();\n      } else if (coords.isEqual(this.getBottomLeftCorner())) {\n        return this.getTopRightCorner();\n      }\n    }\n\n    /**\n     * @param {CellRange} range\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getBordersSharedWith',\n    value: function getBordersSharedWith(range) {\n      if (!this.includesRange(range)) {\n        return [];\n      }\n\n      var thisBorders = {\n        top: Math.min(this.from.row, this.to.row),\n        bottom: Math.max(this.from.row, this.to.row),\n        left: Math.min(this.from.col, this.to.col),\n        right: Math.max(this.from.col, this.to.col)\n      };\n      var rangeBorders = {\n        top: Math.min(range.from.row, range.to.row),\n        bottom: Math.max(range.from.row, range.to.row),\n        left: Math.min(range.from.col, range.to.col),\n        right: Math.max(range.from.col, range.to.col)\n      };\n      var result = [];\n\n      if (thisBorders.top == rangeBorders.top) {\n        result.push('top');\n      }\n      if (thisBorders.right == rangeBorders.right) {\n        result.push('right');\n      }\n      if (thisBorders.bottom == rangeBorders.bottom) {\n        result.push('bottom');\n      }\n      if (thisBorders.left == rangeBorders.left) {\n        result.push('left');\n      }\n\n      return result;\n    }\n\n    /**\n     * Get inner selected cell coords defined by this range\n     *\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getInner',\n    value: function getInner() {\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n      var out = [];\n\n      for (var r = topLeft.row; r <= bottomRight.row; r++) {\n        for (var c = topLeft.col; c <= bottomRight.col; c++) {\n          if (!(this.from.row === r && this.from.col === c) && !(this.to.row === r && this.to.col === c)) {\n            out.push(new _coords2.default(r, c));\n          }\n        }\n      }\n      return out;\n    }\n\n    /**\n     * Get all selected cell coords defined by this range\n     *\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getAll',\n    value: function getAll() {\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n      var out = [];\n\n      for (var r = topLeft.row; r <= bottomRight.row; r++) {\n        for (var c = topLeft.col; c <= bottomRight.col; c++) {\n          if (topLeft.row === r && topLeft.col === c) {\n            out.push(topLeft);\n          } else if (bottomRight.row === r && bottomRight.col === c) {\n            out.push(bottomRight);\n          } else {\n            out.push(new _coords2.default(r, c));\n          }\n        }\n      }\n\n      return out;\n    }\n\n    /**\n     * Runs a callback function against all cells in the range. You can break the iteration by returning\n     * `false` in the callback function\n     *\n     * @param callback {Function}\n     */\n\n  }, {\n    key: 'forAll',\n    value: function forAll(callback) {\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n\n      for (var r = topLeft.row; r <= bottomRight.row; r++) {\n        for (var c = topLeft.col; c <= bottomRight.col; c++) {\n          var breakIteration = callback(r, c);\n\n          if (breakIteration === false) {\n            return;\n          }\n        }\n      }\n    }\n\n    /**\n     * Convert CellRange to literal object.\n     *\n     * @return {Object} Returns a literal object with `from` and `to` properties which each of that object\n     *                  contains `row` and `col` keys.\n     */\n\n  }, {\n    key: 'toObject',\n    value: function toObject() {\n      return {\n        from: this.from.toObject(),\n        to: this.to.toObject()\n      };\n    }\n  }]);\n\n  return CellRange;\n}();\n\nexports.default = CellRange;\n\n/***/ }),\n/* 87 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getRegisteredCellTypes = exports.getRegisteredCellTypeNames = exports.hasCellType = exports.getCellType = exports.registerCellType = undefined;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar _autocompleteType = __webpack_require__(376);\n\nvar _autocompleteType2 = _interopRequireDefault(_autocompleteType);\n\nvar _checkboxType = __webpack_require__(377);\n\nvar _checkboxType2 = _interopRequireDefault(_checkboxType);\n\nvar _dateType = __webpack_require__(378);\n\nvar _dateType2 = _interopRequireDefault(_dateType);\n\nvar _dropdownType = __webpack_require__(379);\n\nvar _dropdownType2 = _interopRequireDefault(_dropdownType);\n\nvar _handsontableType = __webpack_require__(380);\n\nvar _handsontableType2 = _interopRequireDefault(_handsontableType);\n\nvar _numericType = __webpack_require__(381);\n\nvar _numericType2 = _interopRequireDefault(_numericType);\n\nvar _passwordType = __webpack_require__(382);\n\nvar _passwordType2 = _interopRequireDefault(_passwordType);\n\nvar _textType = __webpack_require__(383);\n\nvar _textType2 = _interopRequireDefault(_textType);\n\nvar _timeType = __webpack_require__(384);\n\nvar _timeType2 = _interopRequireDefault(_timeType);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _staticRegister = (0, _staticRegister3.default)('cellTypes'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem,\n    hasItem = _staticRegister.hasItem,\n    getNames = _staticRegister.getNames,\n    getValues = _staticRegister.getValues;\n\n_register('autocomplete', _autocompleteType2.default);\n_register('checkbox', _checkboxType2.default);\n_register('date', _dateType2.default);\n_register('dropdown', _dropdownType2.default);\n_register('handsontable', _handsontableType2.default);\n_register('numeric', _numericType2.default);\n_register('password', _passwordType2.default);\n_register('text', _textType2.default);\n_register('time', _timeType2.default);\n\n/**\n * Retrieve cell type object.\n *\n * @param {String} name Cell type identification.\n * @returns {Object} Returns cell type object.\n */\nfunction _getItem(name) {\n  if (!hasItem(name)) {\n    throw Error('You declared cell type \"' + name + '\" as a string that is not mapped to a known object.\\n                 Cell type must be an object or a string mapped to an object registered by \"Handsontable.cellTypes.registerCellType\" method');\n  }\n\n  return getItem(name);\n}\n\n/**\n * Register cell type under specified name.\n *\n * @param {String} name Cell type identification.\n * @param {Object} type An object with contains keys (eq: `editor`, `renderer`, `validator`) which describes specified behaviour of the cell.\n */\nfunction _register(name, type) {\n  var editor = type.editor,\n      renderer = type.renderer,\n      validator = type.validator;\n\n\n  if (editor) {\n    (0, _editors.registerEditor)(name, editor);\n  }\n  if (renderer) {\n    (0, _renderers.registerRenderer)(name, renderer);\n  }\n  if (validator) {\n    (0, _validators.registerValidator)(name, validator);\n  }\n\n  register(name, type);\n}\n\nexports.registerCellType = _register;\nexports.getCellType = _getItem;\nexports.hasCellType = hasItem;\nexports.getRegisteredCellTypeNames = getNames;\nexports.getRegisteredCellTypes = getValues;\n\n/***/ }),\n/* 88 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['Deprecation warning: This method is going to be removed in the next release. \\n      If you want to select a cell using props, please use the `selectCell` method.'], ['Deprecation warning: This method is going to be removed in the next release.\\\\x20\\n      If you want to select a cell using props, please use the \\\\`selectCell\\\\` method.']);\n\nexports.default = Core;\n\nvar _element = __webpack_require__(0);\n\nvar _setting = __webpack_require__(89);\n\nvar _function = __webpack_require__(43);\n\nvar _console = __webpack_require__(56);\n\nvar _mixed = __webpack_require__(16);\n\nvar _browser = __webpack_require__(27);\n\nvar _dataMap = __webpack_require__(385);\n\nvar _dataMap2 = _interopRequireDefault(_dataMap);\n\nvar _editorManager = __webpack_require__(388);\n\nvar _editorManager2 = _interopRequireDefault(_editorManager);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _templateLiteralTag = __webpack_require__(42);\n\nvar _plugins = __webpack_require__(8);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar _string = __webpack_require__(36);\n\nvar _number = __webpack_require__(5);\n\nvar _tableView = __webpack_require__(389);\n\nvar _tableView2 = _interopRequireDefault(_tableView);\n\nvar _dataSource = __webpack_require__(390);\n\nvar _dataSource2 = _interopRequireDefault(_dataSource);\n\nvar _data = __webpack_require__(90);\n\nvar _recordTranslator = __webpack_require__(313);\n\nvar _rootInstance = __webpack_require__(314);\n\nvar _src = __webpack_require__(4);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _defaultSettings = __webpack_require__(315);\n\nvar _defaultSettings2 = _interopRequireDefault(_defaultSettings);\n\nvar _cellTypes = __webpack_require__(87);\n\nvar _i18n = __webpack_require__(316);\n\nvar _dictionariesManager = __webpack_require__(71);\n\nvar _utils = __webpack_require__(317);\n\nvar _keyStateObserver = __webpack_require__(318);\n\nvar _selection = __webpack_require__(394);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar activeGuid = null;\n\n/**\n * Handsontable constructor\n *\n * @core\n * @constructor Core\n * @description\n *\n * After Handsontable is constructed, you can modify the grid behavior using the available public methods.\n *\n * ---\n * ## How to call methods\n *\n * These are 2 equal ways to call a Handsontable method:\n *\n * ```js\n * // all following examples assume that you constructed Handsontable like this\n * var ht = new Handsontable(document.getElementById('example1'), options);\n *\n * // now, to use setDataAtCell method, you can either:\n * ht.setDataAtCell(0, 0, 'new value');\n * ```\n *\n * Alternatively, you can call the method using jQuery wrapper (__obsolete__, requires initialization using our jQuery guide\n * ```js\n *   $('#example1').handsontable('setDataAtCell', 0, 0, 'new value');\n * ```\n * ---\n */\nfunction Core(rootElement, userSettings) {\n  var _this = this;\n\n  var rootInstanceSymbol = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n  var priv,\n      datamap,\n      dataSource,\n      grid,\n      editorManager,\n      preventScrollingToCell = false,\n      instance = this,\n      GridSettings = function GridSettings() {},\n      eventManager = new _eventManager2.default(instance);\n\n  (0, _object.extend)(GridSettings.prototype, _defaultSettings2.default.prototype); // create grid settings as a copy of default settings\n  (0, _object.extend)(GridSettings.prototype, userSettings); // overwrite defaults with user settings\n  (0, _object.extend)(GridSettings.prototype, expandType(userSettings));\n\n  (0, _utils.applyLanguageSetting)(GridSettings.prototype, userSettings.language);\n\n  if ((0, _rootInstance.hasValidParameter)(rootInstanceSymbol)) {\n    (0, _rootInstance.registerAsRootInstance)(this);\n  }\n\n  (0, _keyStateObserver.startObserving)();\n\n  this.rootElement = rootElement;\n  this.isHotTableEnv = (0, _element.isChildOfWebComponentTable)(this.rootElement);\n  _eventManager2.default.isHotTableEnv = this.isHotTableEnv;\n\n  this.container = document.createElement('div');\n  this.renderCall = false;\n\n  rootElement.insertBefore(this.container, rootElement.firstChild);\n\n  if (false) {\n    (0, _mixed._injectProductInfo)(userSettings.licenseKey, rootElement);\n  }\n\n  this.guid = 'ht_' + (0, _string.randomString)(); // this is the namespace for global events\n\n  var recordTranslator = (0, _recordTranslator.getTranslator)(instance);\n\n  dataSource = new _dataSource2.default(instance);\n\n  if (!this.rootElement.id || this.rootElement.id.substring(0, 3) === 'ht_') {\n    this.rootElement.id = this.guid; // if root element does not have an id, assign a random id\n  }\n  priv = {\n    cellSettings: [],\n    columnSettings: [],\n    columnsSettingConflicts: ['data', 'width', 'language'],\n    settings: new GridSettings(), // current settings instance\n    selRange: null, // exposed by public method `getSelectedRange`\n    isPopulated: null,\n    scrollable: null,\n    firstRun: true\n  };\n\n  var selection = new _selection.Selection(priv.settings, {\n    countCols: function countCols() {\n      return instance.countCols();\n    },\n    countRows: function countRows() {\n      return instance.countRows();\n    },\n    propToCol: function propToCol(prop) {\n      return datamap.propToCol(prop);\n    },\n    isEditorOpened: function isEditorOpened() {\n      return instance.getActiveEditor() ? instance.getActiveEditor().isOpened() : false;\n    }\n  });\n\n  this.selection = selection;\n\n  this.selection.addLocalHook('beforeSetRangeStart', function (cellCoords) {\n    _this.runHooks('beforeSetRangeStart', cellCoords);\n  });\n\n  this.selection.addLocalHook('beforeSetRangeStartOnly', function (cellCoords) {\n    _this.runHooks('beforeSetRangeStartOnly', cellCoords);\n  });\n\n  this.selection.addLocalHook('beforeSetRangeEnd', function (cellCoords) {\n    _this.runHooks('beforeSetRangeEnd', cellCoords);\n\n    if (cellCoords.row < 0) {\n      cellCoords.row = _this.view.wt.wtTable.getFirstVisibleRow();\n    }\n    if (cellCoords.col < 0) {\n      cellCoords.col = _this.view.wt.wtTable.getFirstVisibleColumn();\n    }\n  });\n\n  this.selection.addLocalHook('afterSetRangeEnd', function (cellCoords) {\n    var preventScrolling = (0, _object.createObjectPropListener)(false);\n    var selectionRange = _this.selection.getSelectedRange();\n\n    var _selectionRange$curre = selectionRange.current(),\n        from = _selectionRange$curre.from,\n        to = _selectionRange$curre.to;\n\n    var selectionLayerLevel = selectionRange.size() - 1;\n\n    _this.runHooks('afterSelection', from.row, from.col, to.row, to.col, preventScrolling, selectionLayerLevel);\n    _this.runHooks('afterSelectionByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), preventScrolling, selectionLayerLevel);\n\n    var isSelectedByAnyHeader = _this.selection.isSelectedByAnyHeader();\n    var currentSelectedRange = _this.selection.selectedRange.current();\n\n    var scrollToCell = true;\n\n    if (preventScrollingToCell) {\n      scrollToCell = false;\n    }\n\n    if (preventScrolling.isTouched()) {\n      scrollToCell = !preventScrolling.value;\n    }\n\n    if (scrollToCell !== false && !isSelectedByAnyHeader) {\n      if (currentSelectedRange && !_this.selection.isMultiple()) {\n        _this.view.scrollViewport(currentSelectedRange.from);\n      } else {\n        _this.view.scrollViewport(cellCoords);\n      }\n    }\n\n    var isSelectedByRowHeader = _this.selection.isSelectedByRowHeader();\n    var isSelectedByColumnHeader = _this.selection.isSelectedByColumnHeader();\n\n    // @TODO: These CSS classes are no longer needed anymore. They are used only as a indicator of the selected\n    // rows/columns in the MergedCells plugin (via border.js#L520 in the walkontable module). After fixing\n    // the Border class this should be removed.\n    if (isSelectedByRowHeader && isSelectedByColumnHeader) {\n      (0, _element.addClass)(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);\n    } else if (isSelectedByRowHeader) {\n      (0, _element.removeClass)(_this.rootElement, 'ht__selection--columns');\n      (0, _element.addClass)(_this.rootElement, 'ht__selection--rows');\n    } else if (isSelectedByColumnHeader) {\n      (0, _element.removeClass)(_this.rootElement, 'ht__selection--rows');\n      (0, _element.addClass)(_this.rootElement, 'ht__selection--columns');\n    } else {\n      (0, _element.removeClass)(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);\n    }\n\n    _this._refreshBorders(null);\n  });\n\n  this.selection.addLocalHook('afterSelectionFinished', function (cellRanges) {\n    var selectionLayerLevel = cellRanges.length - 1;\n    var _cellRanges$selection = cellRanges[selectionLayerLevel],\n        from = _cellRanges$selection.from,\n        to = _cellRanges$selection.to;\n\n\n    _this.runHooks('afterSelectionEnd', from.row, from.col, to.row, to.col, selectionLayerLevel);\n    _this.runHooks('afterSelectionEndByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), selectionLayerLevel);\n  });\n\n  this.selection.addLocalHook('afterIsMultipleSelection', function (isMultiple) {\n    var changedIsMultiple = _this.runHooks('afterIsMultipleSelection', isMultiple.value);\n\n    if (isMultiple.value) {\n      isMultiple.value = changedIsMultiple;\n    }\n  });\n\n  this.selection.addLocalHook('beforeModifyTransformStart', function (cellCoordsDelta) {\n    _this.runHooks('modifyTransformStart', cellCoordsDelta);\n  });\n  this.selection.addLocalHook('afterModifyTransformStart', function (coords, rowTransformDir, colTransformDir) {\n    _this.runHooks('afterModifyTransformStart', coords, rowTransformDir, colTransformDir);\n  });\n  this.selection.addLocalHook('beforeModifyTransformEnd', function (cellCoordsDelta) {\n    _this.runHooks('modifyTransformEnd', cellCoordsDelta);\n  });\n  this.selection.addLocalHook('afterModifyTransformEnd', function (coords, rowTransformDir, colTransformDir) {\n    _this.runHooks('afterModifyTransformEnd', coords, rowTransformDir, colTransformDir);\n  });\n  this.selection.addLocalHook('afterDeselect', function () {\n    editorManager.destroyEditor();\n\n    _this._refreshBorders();\n    (0, _element.removeClass)(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);\n\n    _this.runHooks('afterDeselect');\n  });\n  this.selection.addLocalHook('insertRowRequire', function (totalRows) {\n    _this.alter('insert_row', totalRows, 1, 'auto');\n  });\n  this.selection.addLocalHook('insertColRequire', function (totalCols) {\n    _this.alter('insert_col', totalCols, 1, 'auto');\n  });\n\n  grid = {\n    /**\n     * Inserts or removes rows and columns.\n     *\n     * @memberof Core#\n     * @function alter\n     * @private\n     * @param {String} action Possible values: \"insert_row\", \"insert_col\", \"remove_row\", \"remove_col\".\n     * @param {Number|Array} index Row or column visual index which from the alter action will be triggered.\n     *                             Alter actions such as \"remove_row\" and \"remove_col\" support array indexes in the\n     *                             format `[[index, amount], [index, amount]...]` this can be used to remove\n     *                             non-consecutive columns or rows in one call.\n     * @param {Number} amount Ammount rows or columns to remove.\n     * @param {String} [source] Optional. Source of hook runner.\n     * @param {Boolean} [keepEmptyRows] Optional. Flag for preventing deletion of empty rows.\n     */\n    alter: function alter(action, index, amount, source, keepEmptyRows) {\n      var delta;\n\n      amount = amount || 1;\n\n      function spliceWith(data, index, count, toInject) {\n        var valueFactory = function valueFactory() {\n          var result = void 0;\n\n          if (toInject === 'array') {\n            result = [];\n          } else if (toInject === 'object') {\n            result = {};\n          }\n\n          return result;\n        };\n        var spliceArgs = (0, _array.arrayMap)(new Array(count), function () {\n          return valueFactory();\n        });\n\n        spliceArgs.unshift(index, 0);\n        data.splice.apply(data, _toConsumableArray(spliceArgs));\n      }\n\n      var normalizeIndexesGroup = function normalizeIndexesGroup(indexes) {\n        if (indexes.length === 0) {\n          return [];\n        }\n\n        var sortedIndexes = [].concat(_toConsumableArray(indexes));\n\n        // Sort the indexes in ascending order.\n        sortedIndexes.sort(function (_ref, _ref2) {\n          var _ref4 = _slicedToArray(_ref, 1),\n              indexA = _ref4[0];\n\n          var _ref3 = _slicedToArray(_ref2, 1),\n              indexB = _ref3[0];\n\n          if (indexA === indexB) {\n            return 0;\n          }\n\n          return indexA > indexB ? 1 : -1;\n        });\n\n        // Normalize the {index, amount} groups into bigger groups.\n        var normalizedIndexes = (0, _array.arrayReduce)(sortedIndexes, function (acc, _ref5) {\n          var _ref6 = _slicedToArray(_ref5, 2),\n              index = _ref6[0],\n              amount = _ref6[1];\n\n          var previousItem = acc[acc.length - 1];\n\n          var _previousItem = _slicedToArray(previousItem, 2),\n              prevIndex = _previousItem[0],\n              prevAmount = _previousItem[1];\n\n          var prevLastIndex = prevIndex + prevAmount;\n\n          if (index <= prevLastIndex) {\n            var amountToAdd = Math.max(amount - (prevLastIndex - index), 0);\n\n            previousItem[1] += amountToAdd;\n          } else {\n            acc.push([index, amount]);\n          }\n\n          return acc;\n        }, [sortedIndexes[0]]);\n\n        return normalizedIndexes;\n      };\n\n      /* eslint-disable no-case-declarations */\n      switch (action) {\n        case 'insert_row':\n\n          var numberOfSourceRows = instance.countSourceRows();\n\n          if (instance.getSettings().maxRows === numberOfSourceRows) {\n            return;\n          }\n\n          index = (0, _mixed.isDefined)(index) ? index : numberOfSourceRows;\n\n          delta = datamap.createRow(index, amount, source);\n          spliceWith(priv.cellSettings, index, amount, 'array');\n\n          if (delta) {\n            if (selection.isSelected() && selection.selectedRange.current().from.row >= index) {\n              selection.selectedRange.current().from.row += delta;\n              selection.transformEnd(delta, 0); // will call render() internally\n            } else {\n              instance._refreshBorders(); // it will call render and prepare methods\n            }\n          }\n          break;\n\n        case 'insert_col':\n          delta = datamap.createCol(index, amount, source);\n\n          for (var row = 0, len = instance.countSourceRows(); row < len; row++) {\n            if (priv.cellSettings[row]) {\n              spliceWith(priv.cellSettings[row], index, amount);\n            }\n          }\n\n          if (delta) {\n            if (Array.isArray(instance.getSettings().colHeaders)) {\n              var spliceArray = [index, 0];\n              spliceArray.length += delta; // inserts empty (undefined) elements at the end of an array\n              Array.prototype.splice.apply(instance.getSettings().colHeaders, spliceArray); // inserts empty (undefined) elements into the colHeader array\n            }\n\n            if (selection.isSelected() && selection.selectedRange.current().from.col >= index) {\n              selection.selectedRange.current().from.col += delta;\n              selection.transformEnd(0, delta); // will call render() internally\n            } else {\n              instance._refreshBorders(); // it will call render and prepare methods\n            }\n          }\n          break;\n\n        case 'remove_row':\n\n          var removeRow = function removeRow(indexes) {\n            var offset = 0;\n\n            (0, _array.arrayEach)(indexes, function (_ref7) {\n              var _ref8 = _slicedToArray(_ref7, 2),\n                  index = _ref8[0],\n                  amount = _ref8[1];\n\n              var calcIndex = (0, _mixed.isEmpty)(index) ? instance.countRows() - 1 : Math.max(index - offset, 0);\n\n              // If the 'index' is an integer decrease it by 'offset' otherwise pass it through to make the value\n              // compatible with datamap.removeCol method.\n              if (Number.isInteger(index)) {\n                index = Math.max(index - offset, 0);\n              }\n\n              // TODO: for datamap.removeRow index should be passed as it is (with undefined and null values). If not, the logic\n              // inside the datamap.removeRow breaks the removing functionality.\n              datamap.removeRow(index, amount, source);\n              priv.cellSettings.splice(calcIndex, amount);\n\n              var totalRows = instance.countRows();\n              var fixedRowsTop = instance.getSettings().fixedRowsTop;\n\n              if (fixedRowsTop >= calcIndex + 1) {\n                instance.getSettings().fixedRowsTop -= Math.min(amount, fixedRowsTop - calcIndex);\n              }\n\n              var fixedRowsBottom = instance.getSettings().fixedRowsBottom;\n\n              if (fixedRowsBottom && calcIndex >= totalRows - fixedRowsBottom) {\n                instance.getSettings().fixedRowsBottom -= Math.min(amount, fixedRowsBottom);\n              }\n\n              offset += amount;\n            });\n          };\n\n          if (Array.isArray(index)) {\n            removeRow(normalizeIndexesGroup(index));\n          } else {\n            removeRow([[index, amount]]);\n          }\n\n          grid.adjustRowsAndCols();\n          instance._refreshBorders(); // it will call render and prepare methods\n          break;\n\n        case 'remove_col':\n\n          var removeCol = function removeCol(indexes) {\n            var offset = 0;\n\n            (0, _array.arrayEach)(indexes, function (_ref9) {\n              var _ref10 = _slicedToArray(_ref9, 2),\n                  index = _ref10[0],\n                  amount = _ref10[1];\n\n              var calcIndex = (0, _mixed.isEmpty)(index) ? instance.countCols() - 1 : Math.max(index - offset, 0);\n\n              var visualColumnIndex = recordTranslator.toPhysicalColumn(calcIndex);\n\n              // If the 'index' is an integer decrease it by 'offset' otherwise pass it through to make the value\n              // compatible with datamap.removeCol method.\n              if (Number.isInteger(index)) {\n                index = Math.max(index - offset, 0);\n              }\n\n              // TODO: for datamap.removeCol index should be passed as it is (with undefined and null values). If not, the logic\n              // inside the datamap.removeCol breaks the removing functionality.\n              datamap.removeCol(index, amount, source);\n\n              for (var _row = 0, _len = instance.countSourceRows(); _row < _len; _row++) {\n                if (priv.cellSettings[_row]) {\n                  // if row hasn't been rendered it wouldn't have cellSettings\n                  priv.cellSettings[_row].splice(visualColumnIndex, amount);\n                }\n              }\n              var fixedColumnsLeft = instance.getSettings().fixedColumnsLeft;\n\n              if (fixedColumnsLeft >= calcIndex + 1) {\n                instance.getSettings().fixedColumnsLeft -= Math.min(amount, fixedColumnsLeft - calcIndex);\n              }\n\n              if (Array.isArray(instance.getSettings().colHeaders)) {\n                if (typeof visualColumnIndex === 'undefined') {\n                  visualColumnIndex = -1;\n                }\n                instance.getSettings().colHeaders.splice(visualColumnIndex, amount);\n              }\n\n              offset += amount;\n            });\n          };\n\n          if (Array.isArray(index)) {\n            removeCol(normalizeIndexesGroup(index));\n          } else {\n            removeCol([[index, amount]]);\n          }\n\n          grid.adjustRowsAndCols();\n          instance._refreshBorders(); // it will call render and prepare methods\n\n          break;\n        default:\n          throw new Error('There is no such action \"' + action + '\"');\n      }\n\n      if (!keepEmptyRows) {\n        grid.adjustRowsAndCols(); // makes sure that we did not add rows that will be removed in next refresh\n      }\n    },\n\n\n    /**\n     * Makes sure there are empty rows at the bottom of the table\n     */\n    adjustRowsAndCols: function adjustRowsAndCols() {\n      if (priv.settings.minRows) {\n        // should I add empty rows to data source to meet minRows?\n        var rows = instance.countRows();\n\n        if (rows < priv.settings.minRows) {\n          for (var r = 0, minRows = priv.settings.minRows; r < minRows - rows; r++) {\n            datamap.createRow(instance.countRows(), 1, 'auto');\n          }\n        }\n      }\n      if (priv.settings.minSpareRows) {\n        var emptyRows = instance.countEmptyRows(true);\n\n        // should I add empty rows to meet minSpareRows?\n        if (emptyRows < priv.settings.minSpareRows) {\n          for (; emptyRows < priv.settings.minSpareRows && instance.countSourceRows() < priv.settings.maxRows; emptyRows++) {\n            datamap.createRow(instance.countRows(), 1, 'auto');\n          }\n        }\n      }\n      {\n        var emptyCols = void 0;\n\n        // count currently empty cols\n        if (priv.settings.minCols || priv.settings.minSpareCols) {\n          emptyCols = instance.countEmptyCols(true);\n        }\n\n        // should I add empty cols to meet minCols?\n        if (priv.settings.minCols && !priv.settings.columns && instance.countCols() < priv.settings.minCols) {\n          for (; instance.countCols() < priv.settings.minCols; emptyCols++) {\n            datamap.createCol(instance.countCols(), 1, 'auto');\n          }\n        }\n        // should I add empty cols to meet minSpareCols?\n        if (priv.settings.minSpareCols && !priv.settings.columns && instance.dataType === 'array' && emptyCols < priv.settings.minSpareCols) {\n          for (; emptyCols < priv.settings.minSpareCols && instance.countCols() < priv.settings.maxCols; emptyCols++) {\n            datamap.createCol(instance.countCols(), 1, 'auto');\n          }\n        }\n      }\n      var rowCount = instance.countRows();\n      var colCount = instance.countCols();\n\n      if (rowCount === 0 || colCount === 0) {\n        selection.deselect();\n      }\n\n      if (selection.isSelected()) {\n        (0, _array.arrayEach)(selection.selectedRange, function (range) {\n          var selectionChanged = false;\n          var fromRow = range.from.row;\n          var fromCol = range.from.col;\n          var toRow = range.to.row;\n          var toCol = range.to.col;\n\n          // if selection is outside, move selection to last row\n          if (fromRow > rowCount - 1) {\n            fromRow = rowCount - 1;\n            selectionChanged = true;\n\n            if (toRow > fromRow) {\n              toRow = fromRow;\n            }\n          } else if (toRow > rowCount - 1) {\n            toRow = rowCount - 1;\n            selectionChanged = true;\n\n            if (fromRow > toRow) {\n              fromRow = toRow;\n            }\n          }\n          // if selection is outside, move selection to last row\n          if (fromCol > colCount - 1) {\n            fromCol = colCount - 1;\n            selectionChanged = true;\n\n            if (toCol > fromCol) {\n              toCol = fromCol;\n            }\n          } else if (toCol > colCount - 1) {\n            toCol = colCount - 1;\n            selectionChanged = true;\n\n            if (fromCol > toCol) {\n              fromCol = toCol;\n            }\n          }\n\n          if (selectionChanged) {\n            instance.selectCell(fromRow, fromCol, toRow, toCol);\n          }\n        });\n      }\n      if (instance.view) {\n        instance.view.wt.wtOverlays.adjustElementsSize();\n      }\n    },\n\n\n    /**\n     * Populate the data from the provided 2d array from the given cell coordinates.\n     *\n     * @private\n     * @param {Object} start Start selection position. Visual indexes.\n     * @param {Array} input 2d data array.\n     * @param {Object} [end] End selection position (only for drag-down mode). Visual indexes.\n     * @param {String} [source=\"populateFromArray\"] Source information string.\n     * @param {String} [method=\"overwrite\"] Populate method. Possible options: `shift_down`, `shift_right`, `overwrite`.\n     * @param {String} direction (left|right|up|down) String specifying the direction.\n     * @param {Array} deltas The deltas array. A difference between values of adjacent cells.\n     *                       Useful **only** when the type of handled cells is `numeric`.\n     * @returns {Object|undefined} ending td in pasted area (only if any cell was changed).\n     */\n    populateFromArray: function populateFromArray(start, input, end, source, method, direction, deltas) {\n      // TODO: either remove or implement the `direction` argument. Currently it's not working at all.\n      var r,\n          rlen,\n          c,\n          clen,\n          setData = [],\n          current = {};\n\n      rlen = input.length;\n\n      if (rlen === 0) {\n        return false;\n      }\n\n      var repeatCol,\n          repeatRow,\n          cmax,\n          rmax,\n          baseEnd = {\n        row: end === null ? null : end.row,\n        col: end === null ? null : end.col\n      };\n\n      /* eslint-disable no-case-declarations */\n      // insert data with specified pasteMode method\n      switch (method) {\n        case 'shift_down':\n          repeatCol = end ? end.col - start.col + 1 : 0;\n          repeatRow = end ? end.row - start.row + 1 : 0;\n          input = (0, _data.translateRowsToColumns)(input);\n          for (c = 0, clen = input.length, cmax = Math.max(clen, repeatCol); c < cmax; c++) {\n            if (c < clen) {\n              var _instance;\n\n              for (r = 0, rlen = input[c].length; r < repeatRow - rlen; r++) {\n                input[c].push(input[c][r % rlen]);\n              }\n              input[c].unshift(start.col + c, start.row, 0);\n              (_instance = instance).spliceCol.apply(_instance, _toConsumableArray(input[c]));\n            } else {\n              var _instance2;\n\n              input[c % clen][0] = start.col + c;\n              (_instance2 = instance).spliceCol.apply(_instance2, _toConsumableArray(input[c % clen]));\n            }\n          }\n          break;\n\n        case 'shift_right':\n          repeatCol = end ? end.col - start.col + 1 : 0;\n          repeatRow = end ? end.row - start.row + 1 : 0;\n          for (r = 0, rlen = input.length, rmax = Math.max(rlen, repeatRow); r < rmax; r++) {\n            if (r < rlen) {\n              var _instance3;\n\n              for (c = 0, clen = input[r].length; c < repeatCol - clen; c++) {\n                input[r].push(input[r][c % clen]);\n              }\n              input[r].unshift(start.row + r, start.col, 0);\n              (_instance3 = instance).spliceRow.apply(_instance3, _toConsumableArray(input[r]));\n            } else {\n              var _instance4;\n\n              input[r % rlen][0] = start.row + r;\n              (_instance4 = instance).spliceRow.apply(_instance4, _toConsumableArray(input[r % rlen]));\n            }\n          }\n          break;\n\n        case 'overwrite':\n        default:\n          // overwrite and other not specified options\n          current.row = start.row;\n          current.col = start.col;\n\n          var selected = { // selected range\n            row: end && start ? end.row - start.row + 1 : 1,\n            col: end && start ? end.col - start.col + 1 : 1\n          };\n          var skippedRow = 0;\n          var skippedColumn = 0;\n          var pushData = true;\n          var cellMeta = void 0;\n\n          var getInputValue = function getInputValue(row) {\n            var col = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n            var rowValue = input[row % input.length];\n\n            if (col !== null) {\n              return rowValue[col % rowValue.length];\n            }\n\n            return rowValue;\n          };\n          var rowInputLength = input.length;\n          var rowSelectionLength = end ? end.row - start.row + 1 : 0;\n\n          if (end) {\n            rlen = rowSelectionLength;\n          } else {\n            rlen = Math.max(rowInputLength, rowSelectionLength);\n          }\n          for (r = 0; r < rlen; r++) {\n            if (end && current.row > end.row && rowSelectionLength > rowInputLength || !priv.settings.allowInsertRow && current.row > instance.countRows() - 1 || current.row >= priv.settings.maxRows) {\n              break;\n            }\n            var visualRow = r - skippedRow;\n            var colInputLength = getInputValue(visualRow).length;\n            var colSelectionLength = end ? end.col - start.col + 1 : 0;\n\n            if (end) {\n              clen = colSelectionLength;\n            } else {\n              clen = Math.max(colInputLength, colSelectionLength);\n            }\n            current.col = start.col;\n            cellMeta = instance.getCellMeta(current.row, current.col);\n\n            if ((source === 'CopyPaste.paste' || source === 'Autofill.autofill') && cellMeta.skipRowOnPaste) {\n              skippedRow++;\n              current.row++;\n              rlen++;\n              /* eslint-disable no-continue */\n              continue;\n            }\n            skippedColumn = 0;\n\n            for (c = 0; c < clen; c++) {\n              if (end && current.col > end.col && colSelectionLength > colInputLength || !priv.settings.allowInsertColumn && current.col > instance.countCols() - 1 || current.col >= priv.settings.maxCols) {\n                break;\n              }\n              cellMeta = instance.getCellMeta(current.row, current.col);\n\n              if ((source === 'CopyPaste.paste' || source === 'Autofill.fill') && cellMeta.skipColumnOnPaste) {\n                skippedColumn++;\n                current.col++;\n                clen++;\n                continue;\n              }\n              if (cellMeta.readOnly) {\n                current.col++;\n                /* eslint-disable no-continue */\n                continue;\n              }\n              var visualColumn = c - skippedColumn;\n              var value = getInputValue(visualRow, visualColumn);\n              var orgValue = instance.getDataAtCell(current.row, current.col);\n              var index = {\n                row: visualRow,\n                col: visualColumn\n              };\n\n              if (source === 'Autofill.fill') {\n                var result = instance.runHooks('beforeAutofillInsidePopulate', index, direction, input, deltas, {}, selected);\n\n                if (result) {\n                  value = (0, _mixed.isUndefined)(result.value) ? value : result.value;\n                }\n              }\n              if (value !== null && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') {\n                if (orgValue === null || (typeof orgValue === 'undefined' ? 'undefined' : _typeof(orgValue)) !== 'object') {\n                  pushData = false;\n                } else {\n                  var orgValueSchema = (0, _object.duckSchema)(orgValue[0] || orgValue);\n                  var valueSchema = (0, _object.duckSchema)(value[0] || value);\n\n                  /* eslint-disable max-depth */\n                  if ((0, _object.isObjectEqual)(orgValueSchema, valueSchema)) {\n                    value = (0, _object.deepClone)(value);\n                  } else {\n                    pushData = false;\n                  }\n                }\n              } else if (orgValue !== null && (typeof orgValue === 'undefined' ? 'undefined' : _typeof(orgValue)) === 'object') {\n                pushData = false;\n              }\n              if (pushData) {\n                setData.push([current.row, current.col, value]);\n              }\n              pushData = true;\n              current.col++;\n            }\n            current.row++;\n          }\n          instance.setDataAtCell(setData, null, null, source || 'populateFromArray');\n          break;\n      }\n    }\n  };\n\n  /**\n   * Internal function to set `language` key of settings.\n   *\n   * @private\n   * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'\n   * @fires Hooks#afterLanguageChange\n   */\n  function setLanguage(languageCode) {\n    var normalizedLanguageCode = (0, _utils.normalizeLanguageCode)(languageCode);\n\n    if ((0, _dictionariesManager.hasLanguageDictionary)(normalizedLanguageCode)) {\n      instance.runHooks('beforeLanguageChange', normalizedLanguageCode);\n\n      GridSettings.prototype.language = normalizedLanguageCode;\n\n      instance.runHooks('afterLanguageChange', normalizedLanguageCode);\n    } else {\n      (0, _utils.warnUserAboutLanguageRegistration)(languageCode);\n    }\n  }\n\n  this.init = function () {\n    dataSource.setData(priv.settings.data);\n    instance.runHooks('beforeInit');\n\n    if ((0, _browser.isMobileBrowser)()) {\n      (0, _element.addClass)(instance.rootElement, 'mobile');\n    }\n\n    this.updateSettings(priv.settings, true);\n\n    this.view = new _tableView2.default(this);\n    editorManager = _editorManager2.default.getInstance(instance, priv, selection, datamap);\n\n    this.forceFullRender = true; // used when data was changed\n\n    instance.runHooks('init');\n    this.view.render();\n\n    if (_typeof(priv.firstRun) === 'object') {\n      instance.runHooks('afterChange', priv.firstRun[0], priv.firstRun[1]);\n      priv.firstRun = false;\n    }\n    instance.runHooks('afterInit');\n  };\n\n  function ValidatorsQueue() {\n    // moved this one level up so it can be used in any function here. Probably this should be moved to a separate file\n    var resolved = false;\n\n    return {\n      validatorsInQueue: 0,\n      valid: true,\n      addValidatorToQueue: function addValidatorToQueue() {\n        this.validatorsInQueue++;\n        resolved = false;\n      },\n      removeValidatorFormQueue: function removeValidatorFormQueue() {\n        this.validatorsInQueue = this.validatorsInQueue - 1 < 0 ? 0 : this.validatorsInQueue - 1;\n        this.checkIfQueueIsEmpty();\n      },\n      onQueueEmpty: function onQueueEmpty(valid) {},\n      checkIfQueueIsEmpty: function checkIfQueueIsEmpty() {\n        if (this.validatorsInQueue == 0 && resolved == false) {\n          resolved = true;\n          this.onQueueEmpty(this.valid);\n        }\n      }\n    };\n  }\n\n  /**\n   * Get parsed number from numeric string.\n   *\n   * @private\n   * @param {String} numericData Float (separated by a dot or a comma) or integer.\n   * @returns {Number} Number if we get data in parsable format, not changed value otherwise.\n   */\n  function getParsedNumber(numericData) {\n    // Unifying \"float like\" string. Change from value with comma determiner to value with dot determiner,\n    // for example from `450,65` to `450.65`.\n    var unifiedNumericData = numericData.replace(',', '.');\n\n    if (isNaN(parseFloat(unifiedNumericData)) === false) {\n      return parseFloat(unifiedNumericData);\n    }\n\n    return numericData;\n  }\n\n  function validateChanges(changes, source, callback) {\n    var waitingForValidator = new ValidatorsQueue();\n    var isNumericData = function isNumericData(value) {\n      return value.length > 0 && /^-?[\\d\\s]*(\\.|,)?\\d*$/.test(value);\n    };\n\n    waitingForValidator.onQueueEmpty = resolve;\n\n    for (var i = changes.length - 1; i >= 0; i--) {\n      if (changes[i] === null) {\n        changes.splice(i, 1);\n      } else {\n        var _changes$i = _slicedToArray(changes[i], 4),\n            row = _changes$i[0],\n            prop = _changes$i[1],\n            newValue = _changes$i[3];\n\n        var col = datamap.propToCol(prop);\n        var cellProperties = instance.getCellMeta(row, col);\n\n        if (cellProperties.type === 'numeric' && typeof newValue === 'string' && isNumericData(newValue)) {\n          changes[i][3] = getParsedNumber(newValue);\n        }\n\n        /* eslint-disable no-loop-func */\n        if (instance.getCellValidator(cellProperties)) {\n          waitingForValidator.addValidatorToQueue();\n          instance.validateCell(changes[i][3], cellProperties, function (i, cellProperties) {\n            return function (result) {\n              if (typeof result !== 'boolean') {\n                throw new Error('Validation error: result is not boolean');\n              }\n              if (result === false && cellProperties.allowInvalid === false) {\n                changes.splice(i, 1); // cancel the change\n                cellProperties.valid = true; // we cancelled the change, so cell value is still valid\n                var cell = instance.getCell(cellProperties.visualRow, cellProperties.visualCol);\n                (0, _element.removeClass)(cell, instance.getSettings().invalidCellClassName);\n                --i;\n              }\n              waitingForValidator.removeValidatorFormQueue();\n            };\n          }(i, cellProperties), source);\n        }\n      }\n    }\n    waitingForValidator.checkIfQueueIsEmpty();\n\n    function resolve() {\n      var beforeChangeResult;\n\n      if (changes.length) {\n        beforeChangeResult = instance.runHooks('beforeChange', changes, source || 'edit');\n        if ((0, _function.isFunction)(beforeChangeResult)) {\n          (0, _console.warn)('Your beforeChange callback returns a function. It\\'s not supported since Handsontable 0.12.1 (and the returned function will not be executed).');\n        } else if (beforeChangeResult === false) {\n          changes.splice(0, changes.length); // invalidate all changes (remove everything from array)\n        }\n      }\n      callback(); // called when async validators are resolved and beforeChange was not async\n    }\n  }\n\n  /**\n   * Internal function to apply changes. Called after validateChanges\n   *\n   * @private\n   * @param {Array} changes Array in form of [row, prop, oldValue, newValue]\n   * @param {String} source String that identifies how this change will be described in changes array (useful in onChange callback)\n   * @fires Hooks#beforeChangeRender\n   * @fires Hooks#afterChange\n   */\n  function applyChanges(changes, source) {\n    var i = changes.length - 1;\n\n    if (i < 0) {\n      return;\n    }\n\n    for (; i >= 0; i--) {\n      var skipThisChange = false;\n\n      if (changes[i] === null) {\n        changes.splice(i, 1);\n        /* eslint-disable no-continue */\n        continue;\n      }\n\n      if (changes[i][2] == null && changes[i][3] == null) {\n        /* eslint-disable no-continue */\n        continue;\n      }\n\n      if (priv.settings.allowInsertRow) {\n        while (changes[i][0] > instance.countRows() - 1) {\n          var numberOfCreatedRows = datamap.createRow(void 0, void 0, source);\n\n          if (numberOfCreatedRows === 0) {\n            skipThisChange = true;\n            break;\n          }\n        }\n      }\n\n      if (skipThisChange) {\n        /* eslint-disable no-continue */\n        continue;\n      }\n\n      if (instance.dataType === 'array' && (!priv.settings.columns || priv.settings.columns.length === 0) && priv.settings.allowInsertColumn) {\n        while (datamap.propToCol(changes[i][1]) > instance.countCols() - 1) {\n          datamap.createCol(void 0, void 0, source);\n        }\n      }\n\n      datamap.set(changes[i][0], changes[i][1], changes[i][3]);\n    }\n\n    instance.forceFullRender = true; // used when data was changed\n    grid.adjustRowsAndCols();\n    instance.runHooks('beforeChangeRender', changes, source);\n    editorManager.lockEditor();\n    instance._refreshBorders(null);\n    editorManager.unlockEditor();\n    instance.view.wt.wtOverlays.adjustElementsSize();\n    instance.runHooks('afterChange', changes, source || 'edit');\n\n    var activeEditor = instance.getActiveEditor();\n\n    if (activeEditor && (0, _mixed.isDefined)(activeEditor.refreshValue)) {\n      activeEditor.refreshValue();\n    }\n  }\n\n  /**\n   * Validate a single cell.\n   *\n   * @param {String|Number} value\n   * @param cellProperties\n   * @param callback\n   * @param source\n   */\n  this.validateCell = function (value, cellProperties, callback, source) {\n    var validator = instance.getCellValidator(cellProperties);\n\n    // the `canBeValidated = false` argument suggests, that the cell passes validation by default.\n    function done(valid) {\n      var canBeValidated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n      // Fixes GH#3903\n      if (!canBeValidated || cellProperties.hidden === true) {\n        callback(valid);\n        return;\n      }\n\n      var col = cellProperties.visualCol,\n          row = cellProperties.visualRow,\n          td = instance.getCell(row, col, true);\n\n      if (td && td.nodeName != 'TH') {\n        instance.view.wt.wtSettings.settings.cellRenderer(row, col, td);\n      }\n      callback(valid);\n    }\n\n    if ((0, _mixed.isRegExp)(validator)) {\n      validator = function (validator) {\n        return function (value, callback) {\n          callback(validator.test(value));\n        };\n      }(validator);\n    }\n\n    if ((0, _function.isFunction)(validator)) {\n\n      value = instance.runHooks('beforeValidate', value, cellProperties.visualRow, cellProperties.prop, source);\n\n      // To provide consistent behaviour, validation should be always asynchronous\n      instance._registerTimeout(setTimeout(function () {\n        validator.call(cellProperties, value, function (valid) {\n          valid = instance.runHooks('afterValidate', valid, value, cellProperties.visualRow, cellProperties.prop, source);\n          cellProperties.valid = valid;\n\n          done(valid);\n          instance.runHooks('postAfterValidate', valid, value, cellProperties.visualRow, cellProperties.prop, source);\n        });\n      }, 0));\n    } else {\n      // resolve callback even if validator function was not found\n      instance._registerTimeout(setTimeout(function () {\n        cellProperties.valid = true;\n        done(cellProperties.valid, false);\n      }, 0));\n    }\n  };\n\n  function setDataInputToArray(row, propOrCol, value) {\n    if ((typeof row === 'undefined' ? 'undefined' : _typeof(row)) === 'object') {\n      // is it an array of changes\n      return row;\n    }\n    return [[row, propOrCol, value]];\n  }\n\n  /**\n   * @description\n   * Set new value to a cell. To change many cells at once, pass an array of `changes` in format `[[row, col, value], ...]` as\n   * the only parameter. `col` is the index of a __visible__ column (note that if columns were reordered,\n   * the current visible order will be used). `source` is a flag for before/afterChange events. If you pass only array of\n   * changes then `source` could be set as second parameter.\n   *\n   * @memberof Core#\n   * @function setDataAtCell\n   * @param {Number|Array} row Visual row index or array of changes in format `[[row, col, value], ...]`.\n   * @param {Number} col Visual column index.\n   * @param {String} value New value.\n   * @param {String} [source] String that identifies how this change will be described in the changes array (useful in onAfterChange or onBeforeChange callback).\n   */\n  this.setDataAtCell = function (row, col, value, source) {\n    var input = setDataInputToArray(row, col, value),\n        i,\n        ilen,\n        changes = [],\n        prop;\n\n    for (i = 0, ilen = input.length; i < ilen; i++) {\n      if (_typeof(input[i]) !== 'object') {\n        throw new Error('Method `setDataAtCell` accepts row number or changes array of arrays as its first parameter');\n      }\n      if (typeof input[i][1] !== 'number') {\n        throw new Error('Method `setDataAtCell` accepts row and column number as its parameters. If you want to use object property name, use method `setDataAtRowProp`');\n      }\n      prop = datamap.colToProp(input[i][1]);\n      changes.push([input[i][0], prop, dataSource.getAtCell(recordTranslator.toPhysicalRow(input[i][0]), input[i][1]), input[i][2]]);\n    }\n\n    if (!source && (typeof row === 'undefined' ? 'undefined' : _typeof(row)) === 'object') {\n      source = col;\n    }\n\n    instance.runHooks('afterSetDataAtCell', changes, source);\n\n    validateChanges(changes, source, function () {\n      applyChanges(changes, source);\n    });\n  };\n\n  /**\n   * @description\n   * Set new value to a cell. To change many cells at once, pass an array of `changes` in format `[[row, prop, value], ...]` as\n   * the only parameter. `prop` is the name of the object property (e.g. `first.name`). `source` is a flag for before/afterChange events.\n   * If you pass only array of changes then `source` could be set as second parameter.\n   *\n   * @memberof Core#\n   * @function setDataAtRowProp\n   * @param {Number|Array} row Visual row index or array of changes in format `[[row, prop, value], ...]`.\n   * @param {String} prop Property name or the source string.\n   * @param {String} value Value to be set.\n   * @param {String} [source] String that identifies how this change will be described in changes array (useful in onChange callback).\n   */\n  this.setDataAtRowProp = function (row, prop, value, source) {\n    var input = setDataInputToArray(row, prop, value),\n        i,\n        ilen,\n        changes = [];\n\n    for (i = 0, ilen = input.length; i < ilen; i++) {\n      changes.push([input[i][0], input[i][1], dataSource.getAtCell(recordTranslator.toPhysicalRow(input[i][0]), input[i][1]), input[i][2]]);\n    }\n\n    if (!source && (typeof row === 'undefined' ? 'undefined' : _typeof(row)) === 'object') {\n      source = prop;\n    }\n\n    instance.runHooks('afterSetDataAtRowProp', changes, source);\n\n    validateChanges(changes, source, function () {\n      applyChanges(changes, source);\n    });\n  };\n\n  /**\n   * Listen to the keyboard input on document body.\n   *\n   * @memberof Core#\n   * @function listen\n   * @since 0.11\n   * @param {Boolean} [modifyDocumentFocus=true] If `true`, currently focused element will be blured (which returns focus\n   *                                             to the document.body). Otherwise the active element does not lose its focus.\n   */\n  this.listen = function () {\n    var modifyDocumentFocus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n    if (modifyDocumentFocus) {\n      var invalidActiveElement = !document.activeElement || document.activeElement && document.activeElement.nodeName === void 0;\n\n      if (document.activeElement && document.activeElement !== document.body && !invalidActiveElement) {\n        document.activeElement.blur();\n      } else if (invalidActiveElement) {\n        // IE\n        document.body.focus();\n      }\n    }\n\n    if (instance && !instance.isListening()) {\n      activeGuid = instance.guid;\n      instance.runHooks('afterListen');\n    }\n  };\n\n  /**\n   * Stop listening to keyboard input on the document body.\n   *\n   * @memberof Core#\n   * @function unlisten\n   * @since 0.11\n   */\n  this.unlisten = function () {\n    if (this.isListening()) {\n      activeGuid = null;\n      instance.runHooks('afterUnlisten');\n    }\n  };\n\n  /**\n   * Returns `true` if the current Handsontable instance is listening to keyboard input on document body.\n   *\n   * @memberof Core#\n   * @function isListening\n   * @since 0.11\n   * @returns {Boolean} `true` if the instance is listening, `false` otherwise.\n   */\n  this.isListening = function () {\n    return activeGuid === instance.guid;\n  };\n\n  /**\n   * Destroys the current editor, renders and selects the current cell.\n   *\n   * @memberof Core#\n   * @function destroyEditor\n   * @param {Boolean} [revertOriginal] If != `true`, edited data is saved. Otherwise the previous value is restored.\n   */\n  this.destroyEditor = function (revertOriginal) {\n    instance._refreshBorders(revertOriginal);\n  };\n\n  /**\n   * Populate cells at position with 2D input array (e.g. `[[1, 2], [3, 4]]`).\n   * Use `endRow`, `endCol` when you want to cut input when a certain row is reached.\n   * Optional `source` parameter (default value \"populateFromArray\") is used to identify this call in the resulting events (beforeChange, afterChange).\n   * Optional `populateMethod` parameter (default value \"overwrite\", possible values \"shift_down\" and \"shift_right\")\n   * has the same effect as pasteMode option {@link Options#pasteMode}\n   *\n   * @memberof Core#\n   * @function populateFromArray\n   * @since 0.9.0\n   * @param {Number} row Start visual row index.\n   * @param {Number} col Start visual column index.\n   * @param {Array} input 2d array\n   * @param {Number} [endRow] End visual row index (use when you want to cut input when certain row is reached).\n   * @param {Number} [endCol] End visual column index (use when you want to cut input when certain column is reached).\n   * @param {String} [source=\"populateFromArray\"] Source string.\n   * @param {String} [method=\"overwrite\"] Populate method. Possible options: `shift_down`, `shift_right`, `overwrite`.\n   * @param {String} direction Populate direction. (left|right|up|down)\n   * @param {Array} deltas Deltas array.\n   * @returns {Object|undefined} The ending TD element in pasted area (only if any cells were changed).\n   */\n  this.populateFromArray = function (row, col, input, endRow, endCol, source, method, direction, deltas) {\n    var c;\n\n    if (!((typeof input === 'undefined' ? 'undefined' : _typeof(input)) === 'object' && _typeof(input[0]) === 'object')) {\n      throw new Error('populateFromArray parameter `input` must be an array of arrays'); // API changed in 0.9-beta2, let's check if you use it correctly\n    }\n    c = typeof endRow === 'number' ? new _src.CellCoords(endRow, endCol) : null;\n\n    return grid.populateFromArray(new _src.CellCoords(row, col), input, c, source, method, direction, deltas);\n  };\n\n  /**\n   * Adds/removes data from the column. This function is modelled after Array.splice.\n   * Parameter `col` is the index of the column in which do you want to do splice.\n   * Parameter `index` is the row index at which to start changing the array.\n   * If negative, will begin that many elements from the end. Parameter `amount`, is the number of the old array elements to remove.\n   * If the amount is 0, no elements are removed. Fourth and further parameters are the `elements` to add to the array.\n   * If you don't specify any elements, spliceCol simply removes elements from the array.\n   * {@link DataMap#spliceCol}\n   *\n   * @memberof Core#\n   * @function spliceCol\n   * @since 0.9-beta2\n   * @param {Number} col Index of the column in which do you want to do splice.\n   * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end.\n   * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed.\n   * @param {*} [elements] The elements to add to the array. If you don't specify any elements, spliceCol simply removes elements from the array.\n   */\n  this.spliceCol = function (col, index, amount /* , elements... */) {\n    var _datamap;\n\n    return (_datamap = datamap).spliceCol.apply(_datamap, arguments);\n  };\n\n  /**\n   * Adds/removes data from the row. This function works is modelled after Array.splice.\n   * Parameter `row` is the index of row in which do you want to do splice.\n   * Parameter `index` is the column index at which to start changing the array.\n   * If negative, will begin that many elements from the end. Parameter `amount`, is the number of old array elements to remove.\n   * If the amount is 0, no elements are removed. Fourth and further parameters are the `elements` to add to the array.\n   * If you don't specify any elements, spliceCol simply removes elements from the array.\n   * {@link DataMap#spliceRow}\n   *\n   * @memberof Core#\n   * @function spliceRow\n   * @since 0.11\n   * @param {Number} row Index of column in which do you want to do splice.\n   * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end.\n   * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed.\n   * @param {*} [elements] The elements to add to the array. If you don't specify any elements, spliceCol simply removes elements from the array.\n   */\n  this.spliceRow = function (row, index, amount /* , elements... */) {\n    var _datamap2;\n\n    return (_datamap2 = datamap).spliceRow.apply(_datamap2, arguments);\n  };\n\n  /**\n   * Returns indexes of the currently selected cells as an array of arrays `[[startRow, startCol, endRow, endCol], ...]`.\n   *\n   * Start row and start col are the coordinates of the active cell (where the selection was started).\n   *\n   * The version 0.36.0 adds a non-consecutive selection feature. Since this version, the method returns an array of arrays.\n   * Additionally to collect the coordinates of the currently selected area (as it was previously done by the method)\n   * you need to use `getSelectedLast` method.\n   *\n   * @memberof Core#\n   * @function getSelected\n   * @returns {Array[]|undefined} An array of arrays of the selection's coordinates.\n   */\n  this.getSelected = function () {\n    // https://github.com/handsontable/handsontable/issues/44  //cjl\n    if (selection.isSelected()) {\n      return (0, _array.arrayMap)(selection.getSelectedRange(), function (_ref11) {\n        var from = _ref11.from,\n            to = _ref11.to;\n        return [from.row, from.col, to.row, to.col];\n      });\n    }\n  };\n\n  /**\n   * Returns the last coordinates applied to the table as a an array `[startRow, startCol, endRow, endCol]`.\n   *\n   * @since 0.36.0\n   * @memberof Core#\n   * @function getSelectedLast\n   * @returns {Array|undefined} An array of the selection's coordinates.\n   */\n  this.getSelectedLast = function () {\n    var selected = this.getSelected();\n    var result = void 0;\n\n    if (selected && selected.length > 0) {\n      result = selected[selected.length - 1];\n    }\n\n    return result;\n  };\n\n  /**\n   * Returns the current selection as an array of CellRange objects.\n   *\n   * The version 0.36.0 adds a non-consecutive selection feature. Since this version, the method returns an array of arrays.\n   * Additionally to collect the coordinates of the currently selected area (as it was previously done by the method)\n   * you need to use `getSelectedRangeLast` method.\n   *\n   * @memberof Core#\n   * @function getSelectedRange\n   * @since 0.11\n   * @returns {CellRange[]|undefined} Selected range object or undefined` if there is no selection.\n   */\n  this.getSelectedRange = function () {\n    // https://github.com/handsontable/handsontable/issues/44  //cjl\n    if (selection.isSelected()) {\n      return Array.from(selection.getSelectedRange());\n    }\n  };\n\n  /**\n  * Returns the last coordinates applied to the table as a CellRange object.\n  *\n  * @memberof Core#\n  * @function getSelectedRangeLast\n  * @since 0.36.0\n  * @returns {CellRange|undefined} Selected range object or undefined` if there is no selection.\n   */\n  this.getSelectedRangeLast = function () {\n    var selectedRange = this.getSelectedRange();\n    var result = void 0;\n\n    if (selectedRange && selectedRange.length > 0) {\n      result = selectedRange[selectedRange.length - 1];\n    }\n\n    return result;\n  };\n\n  /**\n   * Erases content from cells that have been selected in the table.\n   *\n   * @memberof Core#\n   * @function emptySelectedCells\n   * @since 0.36.0\n   */\n  this.emptySelectedCells = function () {\n    var _this2 = this;\n\n    if (!selection.isSelected()) {\n      return;\n    }\n    var changes = [];\n\n    (0, _array.arrayEach)(selection.getSelectedRange(), function (cellRange) {\n      var topLeft = cellRange.getTopLeftCorner();\n      var bottomRight = cellRange.getBottomRightCorner();\n\n      (0, _number.rangeEach)(topLeft.row, bottomRight.row, function (row) {\n        (0, _number.rangeEach)(topLeft.col, bottomRight.col, function (column) {\n          if (!_this2.getCellMeta(row, column).readOnly) {\n            changes.push([row, column, '']);\n          }\n        });\n      });\n    });\n\n    if (changes.length > 0) {\n      this.setDataAtCell(changes);\n    }\n  };\n\n  /**\n   * Rerender the table.\n   *\n   * @memberof Core#\n   * @function render\n   */\n  this.render = function () {\n    if (instance.view) {\n      instance.renderCall = true;\n      instance.forceFullRender = true; // used when data was changed\n      editorManager.lockEditor();\n      instance._refreshBorders(null);\n      editorManager.unlockEditor();\n    }\n  };\n\n  /**\n   * Reset all cells in the grid to contain data from the data array.\n   *\n   * @memberof Core#\n   * @function loadData\n   * @param {Array} data Array of arrays or array of objects containing data.\n   * @fires Hooks#afterLoadData\n   * @fires Hooks#afterChange\n   */\n  this.loadData = function (data) {\n    if (Array.isArray(priv.settings.dataSchema)) {\n      instance.dataType = 'array';\n    } else if ((0, _function.isFunction)(priv.settings.dataSchema)) {\n      instance.dataType = 'function';\n    } else {\n      instance.dataType = 'object';\n    }\n\n    if (datamap) {\n      datamap.destroy();\n    }\n    datamap = new _dataMap2.default(instance, priv, GridSettings);\n\n    if ((typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object' && data !== null) {\n      if (!(data.push && data.splice)) {\n        // check if data is array. Must use duck-type check so Backbone Collections also pass it\n        // when data is not an array, attempt to make a single-row array of it\n        data = [data];\n      }\n    } else if (data === null) {\n      data = [];\n      var row;\n      var r = 0;\n      var rlen = 0;\n      var dataSchema = datamap.getSchema();\n\n      for (r = 0, rlen = priv.settings.startRows; r < rlen; r++) {\n        if ((instance.dataType === 'object' || instance.dataType === 'function') && priv.settings.dataSchema) {\n          row = (0, _object.deepClone)(dataSchema);\n          data.push(row);\n        } else if (instance.dataType === 'array') {\n          row = (0, _object.deepClone)(dataSchema[0]);\n          data.push(row);\n        } else {\n          row = [];\n\n          for (var c = 0, clen = priv.settings.startCols; c < clen; c++) {\n            row.push(null);\n          }\n\n          data.push(row);\n        }\n      }\n    } else {\n      throw new Error('loadData only accepts array of objects or array of arrays (' + (typeof data === 'undefined' ? 'undefined' : _typeof(data)) + ' given)');\n    }\n\n    priv.isPopulated = false;\n    GridSettings.prototype.data = data;\n\n    if (Array.isArray(data[0])) {\n      instance.dataType = 'array';\n    }\n\n    datamap.dataSource = data;\n    dataSource.data = data;\n    dataSource.dataType = instance.dataType;\n    dataSource.colToProp = datamap.colToProp.bind(datamap);\n    dataSource.propToCol = datamap.propToCol.bind(datamap);\n\n    clearCellSettingCache();\n\n    grid.adjustRowsAndCols();\n    instance.runHooks('afterLoadData', priv.firstRun);\n\n    if (priv.firstRun) {\n      priv.firstRun = [null, 'loadData'];\n    } else {\n      instance.runHooks('afterChange', null, 'loadData');\n      instance.render();\n    }\n    priv.isPopulated = true;\n\n    function clearCellSettingCache() {\n      priv.cellSettings.length = 0;\n    }\n  };\n\n  /**\n   * Returns the current data object (the same one that was passed by `data` configuration option or `loadData` method,\n   * unless the `modifyRow` hook was used to trim some of the rows. If that's the case - use the {@link Core#getSourceData} method.).\n   * Optionally you can provide cell range by defining `row`, `col`, `row2`, `col2` to get only a fragment of grid data.\n   *\n   * Note: getData functionality changed with the release of version 0.20. If you're looking for the previous functionality,\n   * you should use the {@link Core#getSourceData} method.\n   *\n   * @memberof Core#\n   * @function getData\n   * @param {Number} [r] From visual row index.\n   * @param {Number} [c] From visual column index.\n   * @param {Number} [r2] To visual row index.\n   * @param {Number} [c2] To visual column index.\n   * @returns {Array} Array with the data.\n   */\n  this.getData = function (r, c, r2, c2) {\n    if ((0, _mixed.isUndefined)(r)) {\n      return datamap.getAll();\n    }\n    return datamap.getRange(new _src.CellCoords(r, c), new _src.CellCoords(r2, c2), datamap.DESTINATION_RENDERER);\n  };\n\n  /**\n   * Returns a string value of the selected range. Each column is separated by tab, each row is separated by a new line character.\n   * {@link DataMap#getCopyableText}\n   *\n   * @memberof Core#\n   * @function getCopyableText\n   * @since 0.11\n   * @param {Number} startRow From visual row index.\n   * @param {Number} startCol From visual column index.\n   * @param {Number} endRow To visual row index.\n   * @param {Number} endCol To visual column index.\n   * @returns {String}\n   */\n  this.getCopyableText = function (startRow, startCol, endRow, endCol) {\n    return datamap.getCopyableText(new _src.CellCoords(startRow, startCol), new _src.CellCoords(endRow, endCol));\n  };\n\n  /**\n   * Returns the data's copyable value at specified row and column index ({@link DataMap#getCopyable}).\n   *\n   * @memberof Core#\n   * @function getCopyableData\n   * @since 0.19.0\n   * @param {Number} row Visual row index.\n   * @param {Number} column Visual column index.\n   * @returns {String}\n   */\n  this.getCopyableData = function (row, column) {\n    return datamap.getCopyable(row, datamap.colToProp(column));\n  };\n\n  /**\n   * Returns schema provided by constructor settings. If it doesn't exist then it returns the schema based on the data\n   * structure in the first row.\n   *\n   * @memberof Core#\n   * @function getSchema\n   * @since 0.13.2\n   * @returns {Object} Schema object.\n   */\n  this.getSchema = function () {\n    return datamap.getSchema();\n  };\n\n  /**\n   * Use it if you need to change configuration after initialization. The `settings` parameter is an object containing the new\n   * settings, declared the same way as in the initial settings object.\n   * Note, that although the `updateSettings` method doesn't overwrite the previously declared settings, it might reset\n   * the settings made post-initialization. (for example - ignore changes made using the columnResize feature).\n   *\n   * @memberof Core#\n   * @function updateSettings\n   * @param {Object} settings New settings object.\n   * @param {Boolean} init Calls this method in the initialization mode. Internal use only.\n   *                       Used by API could be cause of the unexpected behaviour of the Handsontable.\n   * @example\n   * ```js\n   * hot.updateSettings({\n   *    contextMenu: true,\n   *    colHeaders: true,\n   *    fixedRowsTop: 2\n   * });\n   * ```\n   * @fires Hooks#afterCellMetaReset\n   * @fires Hooks#afterUpdateSettings\n   */\n  this.updateSettings = function (settings, init) {\n    var columnsAsFunc = false;\n    var i = void 0;\n    var j = void 0;\n    var clen = void 0;\n\n    if ((0, _mixed.isDefined)(settings.rows)) {\n      throw new Error('\"rows\" setting is no longer supported. do you mean startRows, minRows or maxRows?');\n    }\n    if ((0, _mixed.isDefined)(settings.cols)) {\n      throw new Error('\"cols\" setting is no longer supported. do you mean startCols, minCols or maxCols?');\n    }\n\n    for (i in settings) {\n      if (i === 'data') {\n        /* eslint-disable-next-line no-continue */\n        continue; // loadData will be triggered later\n      } else if (i === 'language') {\n        setLanguage(settings.language);\n\n        /* eslint-disable-next-line no-continue */\n        continue;\n      } else if (_pluginHooks2.default.getSingleton().getRegistered().indexOf(i) > -1) {\n        if ((0, _function.isFunction)(settings[i]) || Array.isArray(settings[i])) {\n          settings[i].initialHook = true;\n          instance.addHook(i, settings[i]);\n        }\n      } else if (!init && (0, _object.hasOwnProperty)(settings, i)) {\n        // Update settings\n        GridSettings.prototype[i] = settings[i];\n      }\n    }\n\n    // Load data or create data map\n    if (settings.data === void 0 && priv.settings.data === void 0) {\n      instance.loadData(null); // data source created just now\n    } else if (settings.data !== void 0) {\n      instance.loadData(settings.data); // data source given as option\n    } else if (settings.columns !== void 0) {\n      datamap.createMap();\n    }\n\n    clen = instance.countCols();\n\n    var columnSetting = settings.columns || GridSettings.prototype.columns;\n\n    // Init columns constructors configuration\n    if (columnSetting && (0, _function.isFunction)(columnSetting)) {\n      clen = instance.countSourceCols();\n      columnsAsFunc = true;\n    }\n\n    // Clear cellSettings cache\n    if (settings.cell !== void 0 || settings.cells !== void 0 || settings.columns !== void 0) {\n      priv.cellSettings.length = 0;\n    }\n\n    if (clen > 0) {\n      var proto = void 0;\n      var column = void 0;\n\n      for (i = 0, j = 0; i < clen; i++) {\n        if (columnsAsFunc && !columnSetting(i)) {\n          /* eslint-disable no-continue */\n          continue;\n        }\n        priv.columnSettings[j] = (0, _setting.columnFactory)(GridSettings, priv.columnsSettingConflicts);\n\n        // shortcut for prototype\n        proto = priv.columnSettings[j].prototype;\n\n        // Use settings provided by user\n        if (columnSetting) {\n          if (columnsAsFunc) {\n            column = columnSetting(i);\n          } else {\n            column = columnSetting[j];\n          }\n\n          if (column) {\n            (0, _object.extend)(proto, column);\n            (0, _object.extend)(proto, expandType(column));\n          }\n        }\n\n        j++;\n      }\n    }\n\n    if ((0, _mixed.isDefined)(settings.cell)) {\n      for (var key in settings.cell) {\n        if ((0, _object.hasOwnProperty)(settings.cell, key)) {\n          var cell = settings.cell[key];\n\n          instance.setCellMetaObject(cell.row, cell.col, cell);\n        }\n      }\n    }\n\n    instance.runHooks('afterCellMetaReset');\n\n    if ((0, _mixed.isDefined)(settings.className)) {\n      if (GridSettings.prototype.className) {\n        (0, _element.removeClass)(instance.rootElement, GridSettings.prototype.className);\n      }\n      if (settings.className) {\n        (0, _element.addClass)(instance.rootElement, settings.className);\n      }\n    }\n\n    var currentHeight = instance.rootElement.style.height;\n    if (currentHeight !== '') {\n      currentHeight = parseInt(instance.rootElement.style.height, 10);\n    }\n\n    var height = settings.height;\n    if ((0, _function.isFunction)(height)) {\n      height = height();\n    }\n\n    if (init) {\n      var initialStyle = instance.rootElement.getAttribute('style');\n\n      if (initialStyle) {\n        instance.rootElement.setAttribute('data-initialstyle', instance.rootElement.getAttribute('style'));\n      }\n    }\n\n    if (height === null) {\n      var _initialStyle = instance.rootElement.getAttribute('data-initialstyle');\n\n      if (_initialStyle && (_initialStyle.indexOf('height') > -1 || _initialStyle.indexOf('overflow') > -1)) {\n        instance.rootElement.setAttribute('style', _initialStyle);\n      } else {\n        instance.rootElement.style.height = '';\n        instance.rootElement.style.overflow = '';\n      }\n    } else if (height !== void 0) {\n      instance.rootElement.style.height = height + 'px';\n      instance.rootElement.style.overflow = 'hidden';\n    }\n\n    if (typeof settings.width !== 'undefined') {\n      var width = settings.width;\n\n      if ((0, _function.isFunction)(width)) {\n        width = width();\n      }\n\n      instance.rootElement.style.width = width + 'px';\n    }\n\n    if (!init) {\n      datamap.clearLengthCache(); // force clear cache length on updateSettings() #3416\n\n      if (instance.view) {\n        instance.view.wt.wtViewport.resetHasOversizedColumnHeadersMarked();\n      }\n\n      instance.runHooks('afterUpdateSettings', settings);\n    }\n\n    grid.adjustRowsAndCols();\n    if (instance.view && !priv.firstRun) {\n      instance.forceFullRender = true; // used when data was changed\n      editorManager.lockEditor();\n      instance._refreshBorders(null);\n      editorManager.unlockEditor();\n    }\n\n    if (!init && instance.view && (currentHeight === '' || height === '' || height === void 0) && currentHeight !== height) {\n      instance.view.wt.wtOverlays.updateMainScrollableElements();\n    }\n  };\n\n  /**\n   * Get value from the selected cell.\n   *\n   * @memberof Core#\n   * @function getValue\n   * @since 0.11\n   * @returns {*} Value of selected cell.\n   */\n  this.getValue = function () {\n    var sel = instance.getSelectedLast();\n\n    if (GridSettings.prototype.getValue) {\n      if ((0, _function.isFunction)(GridSettings.prototype.getValue)) {\n        return GridSettings.prototype.getValue.call(instance);\n      } else if (sel) {\n        return instance.getData()[sel[0][0]][GridSettings.prototype.getValue];\n      }\n    } else if (sel) {\n      return instance.getDataAtCell(sel[0], sel[1]);\n    }\n  };\n\n  function expandType(obj) {\n    if (!(0, _object.hasOwnProperty)(obj, 'type')) {\n      // ignore obj.prototype.type\n      return;\n    }\n\n    var type,\n        expandedType = {};\n\n    if (_typeof(obj.type) === 'object') {\n      type = obj.type;\n    } else if (typeof obj.type === 'string') {\n      type = (0, _cellTypes.getCellType)(obj.type);\n    }\n\n    for (var i in type) {\n      if ((0, _object.hasOwnProperty)(type, i) && !(0, _object.hasOwnProperty)(obj, i)) {\n        expandedType[i] = type[i];\n      }\n    }\n\n    return expandedType;\n  }\n\n  /**\n   * Returns the object settings.\n   *\n   * @memberof Core#\n   * @function getSettings\n   * @returns {Object} Object containing the current grid settings.\n   */\n  this.getSettings = function () {\n    return priv.settings;\n  };\n\n  /**\n   * Clears the data from the grid (the table settings remain intact).\n   *\n   * @memberof Core#\n   * @function clear\n   * @since 0.11.0\n   */\n  this.clear = function () {\n    this.selectAll();\n    this.emptySelectedCells();\n  };\n\n  /**\n   * @memberof Core#\n   * @function alter\n   * @param {String} action See grid.alter for possible values: `\"insert_row\"`, `\"insert_col\"`, `\"remove_row\"`, `\"remove_col\"`\n   * @param {Number} index Visual index of the row/column before which the new row/column will be inserted/removed.\n   * @param {Number} [amount = 1] Amound of rows/columns to be inserted/removed.\n   * @param {String} [source] Source indicator.\n   * @param {Boolean} [keepEmptyRows] Flag for preventing deletion of empty rows.\n   * @description\n   *\n   * Allows altering the table structure by either inserting/removing rows or inserting/removing columns:\n   *\n   * Insert new row(s) above the row with a given `index`. If index is `null` or `undefined`, the new row will be\n   * added after the last row.\n   * ```js\n   * var hot = new Handsontable(document.getElementById('example'));\n   * hot.alter('insert_row', 10);\n   * ```\n   *\n   * Insert new column(s) before the column with a given `index`. If index is `null` or `undefined`, the new column\n   * will be added after the last column.\n   * ```js\n   * var hot = new Handsontable(document.getElementById('example'));\n   * hot.alter('insert_col', 10);\n   * ```\n   *\n   * Remove the row(s) at the given `index`.\n   * ```js\n   * var hot = new Handsontable(document.getElementById('example'));\n   * hot.alter('remove_row', 10);\n   * ```\n   *\n   * Remove the column(s) at the given `index`.\n   * ```js\n   * var hot = new Handsontable(document.getElementById('example'));\n   * hot.alter('remove_col', 10);\n   * ```\n   */\n  this.alter = function (action, index, amount, source, keepEmptyRows) {\n    grid.alter(action, index, amount, source, keepEmptyRows);\n  };\n\n  /**\n   * Returns a TD element for the given `row` and `col` arguments, if it is rendered on screen.\n   * Returns `null` if the TD is not rendered on screen (probably because that part of the table is not visible).\n   *\n   * @memberof Core#\n   * @function getCell\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @param {Boolean} topmost If set to true, it returns the TD element from the topmost overlay. For example,\n   * if the wanted cell is in the range of fixed rows, it will return a TD element from the `top` overlay.\n   * @returns {Element} The cell's TD element.\n   */\n  this.getCell = function (row, col, topmost) {\n    return instance.view.getCellAtCoords(new _src.CellCoords(row, col), topmost);\n  };\n\n  /**\n   * Returns the coordinates of the cell, provided as a HTML Element.\n   *\n   * @memberof Core#\n   * @function getCoords\n   * @param {Element} elem The HTML Element representing the cell.\n   * @returns {CellCoords} Visual coordinates object.\n   */\n  this.getCoords = function (elem) {\n    return this.view.wt.wtTable.getCoords.call(this.view.wt.wtTable, elem);\n  };\n\n  /**\n   * Returns the property name that corresponds with the given column index. {@link DataMap#colToProp}\n   * If the data source is an array of arrays, it returns the columns index.\n   *\n   * @memberof Core#\n   * @function colToProp\n   * @param {Number} col Visual column index.\n   * @returns {String|Number} Column property or physical column index.\n   */\n  this.colToProp = function (col) {\n    return datamap.colToProp(col);\n  };\n\n  /**\n   * Returns column index that corresponds with the given property. {@link DataMap#propToCol}\n   *\n   * @memberof Core#\n   * @function propToCol\n   * @param {String|Number} prop Property name or physical column index.\n   * @returns {Number} Visual column index.\n   */\n  this.propToCol = function (prop) {\n    return datamap.propToCol(prop);\n  };\n\n  /**\n   * Translate physical row index into visual.\n   *\n   * @since 0.29.0\n   * @memberof Core#\n   * @function toVisualRow\n   * @param {Number} row Physical row index.\n   * @returns {Number} Returns visual row index.\n   */\n  this.toVisualRow = function (row) {\n    return recordTranslator.toVisualRow(row);\n  };\n\n  /**\n   * Translate physical column index into visual.\n   *\n   * @since 0.29.0\n   * @memberof Core#\n   * @function toVisualColumn\n   * @param {Number} column Physical column index.\n   * @returns {Number} Returns visual column index.\n   */\n  this.toVisualColumn = function (column) {\n    return recordTranslator.toVisualColumn(column);\n  };\n\n  /**\n   * Translate visual row index into physical.\n   * If displayed rows order is different than the order of rows stored in memory (i.e. sorting is applied)\n   * to retrieve valid physical row index you can use this method.\n   *\n   * @since 0.29.0\n   * @memberof Core#\n   * @function toPhysicalRow\n   * @param {Number} row Visual row index.\n   * @returns {Number} Returns physical row index.\n   */\n  this.toPhysicalRow = function (row) {\n    return recordTranslator.toPhysicalRow(row);\n  };\n\n  /**\n   * Translate visual column index into physical.\n   * If displayed columns order is different than the order of columns stored in memory (i.e. manual column move is applied)\n   * to retrieve valid physical column index you can use this method.\n   *\n   * @since 0.29.0\n   * @memberof Core#\n   * @function toPhysicalColumn\n   * @param {Number} column Visual column index.\n   * @returns {Number} Returns physical column index.\n   */\n  this.toPhysicalColumn = function (column) {\n    return recordTranslator.toPhysicalColumn(column);\n  };\n\n  /**\n   * @description\n   * Returns the cell value at `row`, `col`. `row` and `col` are the __visible__ indexes (note, that if columns were reordered or sorted,\n   * the currently visible order will be used).\n   *\n   * @memberof Core#\n   * @function getDataAtCell\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @returns {String|Boolean|null} Data at cell.\n   */\n  this.getDataAtCell = function (row, col) {\n    return datamap.get(row, datamap.colToProp(col));\n  };\n\n  /**\n   * Return value at `row`, `prop`. (Uses {@link DataMap#get})\n   *\n   * @memberof Core#\n   * @function getDataAtRowProp\n   * @param {Number} row Visual row index.\n   * @param {String} prop Property name.\n   * @returns {*} Cell value.\n   */\n  this.getDataAtRowProp = function (row, prop) {\n    return datamap.get(row, prop);\n  };\n\n  /**\n   * @description\n   * Returns array of column values from the data source. `col` is the __visible__ index of the column.\n   * Note, that if columns were reordered or sorted, the currently visible order will be used.\n   *\n   * @memberof Core#\n   * @function getDataAtCol\n   * @since 0.9-beta2\n   * @param {Number} col Visual column index.\n   * @returns {Array} Array of cell values.\n   */\n  this.getDataAtCol = function (col) {\n    var out = [];\n    return out.concat.apply(out, _toConsumableArray(datamap.getRange(new _src.CellCoords(0, col), new _src.CellCoords(priv.settings.data.length - 1, col), datamap.DESTINATION_RENDERER)));\n  };\n\n  /**\n   * Given the object property name (e.g. `'first.name'`), returns an array of column's values from the data source.\n   * You can also provide a column index as the first argument.\n   *\n   * @memberof Core#\n   * @function getDataAtProp\n   * @since 0.9-beta2\n   * @param {String|Number} prop Property name / physical column index.\n   * @returns {Array} Array of cell values.\n   */\n  // TODO: Getting data from `datamap` should work on visual indexes.\n  this.getDataAtProp = function (prop) {\n    var out = [],\n        range;\n\n    range = datamap.getRange(new _src.CellCoords(0, datamap.propToCol(prop)), new _src.CellCoords(priv.settings.data.length - 1, datamap.propToCol(prop)), datamap.DESTINATION_RENDERER);\n\n    return out.concat.apply(out, _toConsumableArray(range));\n  };\n\n  /**\n   * Returns the source data object (the same that was passed by `data` configuration option or `loadData` method).\n   * Optionally you can provide a cell range by using the `row`, `col`, `row2`, `col2` arguments, to get only a fragment of grid data.\n   *\n   * @memberof Core#\n   * @function getSourceData\n   * @since 0.20.0\n   * @param {Number} [r] From physical row index.\n   * @param {Number} [c] From physical column index (or visual index, if data type is an array of objects).\n   * @param {Number} [r2] To physical row index.\n   * @param {Number} [c2] To physical column index (or visual index, if data type is an array of objects).\n   * @returns {Array} Array of grid data.\n   */\n  this.getSourceData = function (r, c, r2, c2) {\n    var data = void 0;\n\n    if (r === void 0) {\n      data = dataSource.getData();\n    } else {\n      data = dataSource.getByRange(new _src.CellCoords(r, c), new _src.CellCoords(r2, c2));\n    }\n\n    return data;\n  };\n\n  /**\n   * Returns the source data object as an arrays of arrays format even when source data was provided in another format.\n   * Optionally you can provide a cell range by using the `row`, `col`, `row2`, `col2` arguments, to get only a fragment of grid data.\n   *\n   * @memberof Core#\n   * @function getSourceDataArray\n   * @since 0.28.0\n   * @param {Number} [r] From physical row index.\n   * @param {Number} [c] From physical column index (or visual index, if data type is an array of objects).\n   * @param {Number} [r2] To physical row index.\n   * @param {Number} [c2] To physical column index (or visual index, if data type is an array of objects).\n   * @returns {Array} An array of arrays.\n   */\n  this.getSourceDataArray = function (r, c, r2, c2) {\n    var data = void 0;\n\n    if (r === void 0) {\n      data = dataSource.getData(true);\n    } else {\n      data = dataSource.getByRange(new _src.CellCoords(r, c), new _src.CellCoords(r2, c2), true);\n    }\n\n    return data;\n  };\n\n  /**\n   * Returns an array of column values from the data source. `col` is the index of the row in the data source.\n   *\n   * @memberof Core#\n   * @function getSourceDataAtCol\n   * @since 0.11.0-beta3\n   * @param {Number} column Visual column index.\n   * @returns {Array} Array of the column's cell values.\n   */\n  // TODO: Getting data from `sourceData` should work always on physical indexes.\n  this.getSourceDataAtCol = function (column) {\n    return dataSource.getAtColumn(column);\n  };\n\n  /**\n   * Returns a single row of the data (array or object, depending on what you have). `row` is the index of the row in the data source.\n   *\n   * @memberof Core#\n   * @function getSourceDataAtRow\n   * @since 0.11.0-beta3\n   * @param {Number} row Physical row index.\n   * @returns {Array|Object} Single row of data.\n   */\n  this.getSourceDataAtRow = function (row) {\n    return dataSource.getAtRow(row);\n  };\n\n  /**\n   * Returns a single value from the data source.\n   *\n   * @memberof Core#\n   * @function getSourceDataAtCell\n   * @param {Number} row Physical row index.\n   * @param {Number} column Visual column index.\n   * @returns {*} Cell data.\n   * @since 0.20.0\n   */\n  // TODO: Getting data from `sourceData` should work always on physical indexes.\n  this.getSourceDataAtCell = function (row, column) {\n    return dataSource.getAtCell(row, column);\n  };\n\n  /**\n   * @description\n   * Returns a single row of the data. The `row` argument is the __visible__ index of the row.\n   *\n   * @memberof Core#\n   * @function getDataAtRow\n   * @param {Number} row Visual row index.\n   * @returns {Array} Array of row's cell data.\n   * @since 0.9-beta2\n   */\n  this.getDataAtRow = function (row) {\n    var data = datamap.getRange(new _src.CellCoords(row, 0), new _src.CellCoords(row, this.countCols() - 1), datamap.DESTINATION_RENDERER);\n\n    return data[0] || [];\n  };\n\n  /**\n   * @description\n   * Returns a data type defined in the Handsontable settings under the `type` key ([Options#type](http://docs.handsontable.com/Options.html#type)).\n   * If there are cells with different types in the selected range, it returns `'mixed'`.\n   *\n   * @since 0.18.1\n   * @memberof Core#\n   * @function getDataType\n   * @param {Number} rowFrom From visual row index.\n   * @param {Number} columnFrom From visual column index.\n   * @param {Number} rowTo To visual row index.\n   * @param {Number} columnTo To visual column index.\n   * @returns {String} Cell type (e.q: `'mixed'`, `'text'`, `'numeric'`, `'autocomplete'`).\n   */\n  this.getDataType = function (rowFrom, columnFrom, rowTo, columnTo) {\n    var _this3 = this;\n\n    var previousType = null;\n    var currentType = null;\n\n    if (rowFrom === void 0) {\n      rowFrom = 0;\n      rowTo = this.countRows();\n      columnFrom = 0;\n      columnTo = this.countCols();\n    }\n    if (rowTo === void 0) {\n      rowTo = rowFrom;\n    }\n    if (columnTo === void 0) {\n      columnTo = columnFrom;\n    }\n    var type = 'mixed';\n\n    (0, _number.rangeEach)(Math.min(rowFrom, rowTo), Math.max(rowFrom, rowTo), function (row) {\n      var isTypeEqual = true;\n\n      (0, _number.rangeEach)(Math.min(columnFrom, columnTo), Math.max(columnFrom, columnTo), function (column) {\n        var cellType = _this3.getCellMeta(row, column);\n\n        currentType = cellType.type;\n\n        if (previousType) {\n          isTypeEqual = previousType === currentType;\n        } else {\n          previousType = currentType;\n        }\n\n        return isTypeEqual;\n      });\n      type = isTypeEqual ? currentType : 'mixed';\n\n      return isTypeEqual;\n    });\n\n    return type;\n  };\n\n  /**\n   * Remove a property defined by the `key` argument from the cell meta object for the provided `row` and `col` coordinates.\n   *\n   * @memberof Core#\n   * @function removeCellMeta\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @param {String} key Property name.\n   * @fires Hooks#beforeRemoveCellMeta\n   * @fires Hooks#afterRemoveCellMeta\n   */\n  this.removeCellMeta = function (row, col, key) {\n    var _recordTranslator$toP = recordTranslator.toPhysical(row, col),\n        _recordTranslator$toP2 = _slicedToArray(_recordTranslator$toP, 2),\n        physicalRow = _recordTranslator$toP2[0],\n        physicalColumn = _recordTranslator$toP2[1];\n\n    var cachedValue = priv.cellSettings[physicalRow][physicalColumn][key];\n\n    var hookResult = instance.runHooks('beforeRemoveCellMeta', row, col, key, cachedValue);\n\n    if (hookResult !== false) {\n      delete priv.cellSettings[physicalRow][physicalColumn][key];\n\n      instance.runHooks('afterRemoveCellMeta', row, col, key, cachedValue);\n    }\n\n    cachedValue = null;\n  };\n\n  /**\n   * Remove one or more rows from the cell meta object.\n   *\n   * @since 0.30.0\n   * @param {Number} index An integer that specifies at what position to add/remove items, Use negative values to specify the position from the end of the array.\n   * @param {Number} deleteAmount The number of items to be removed. If set to 0, no items will be removed.\n   * @param {Array} items The new items to be added to the array.\n   */\n  this.spliceCellsMeta = function (index, deleteAmount) {\n    var _priv$cellSettings;\n\n    for (var _len2 = arguments.length, items = Array(_len2 > 2 ? _len2 - 2 : 0), _key = 2; _key < _len2; _key++) {\n      items[_key - 2] = arguments[_key];\n    }\n\n    (_priv$cellSettings = priv.cellSettings).splice.apply(_priv$cellSettings, [index, deleteAmount].concat(items));\n  };\n\n  /**\n   * Set cell meta data object defined by `prop` to the corresponding params `row` and `col`.\n   *\n   * @memberof Core#\n   * @function setCellMetaObject\n   * @since 0.11\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @param {Object} prop Meta object.\n   */\n  this.setCellMetaObject = function (row, col, prop) {\n    if ((typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) === 'object') {\n      for (var key in prop) {\n        if ((0, _object.hasOwnProperty)(prop, key)) {\n          var value = prop[key];\n          this.setCellMeta(row, col, key, value);\n        }\n      }\n    }\n  };\n\n  /**\n   * Sets a property defined by the `key` object to the meta object of a cell corresponding to params `row` and `col`.\n   *\n   * @memberof Core#\n   * @function setCellMeta\n   * @since 0.11\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @param {String} key Property name.\n   * @param {String} val Property value.\n   * @fires Hooks#afterSetCellMeta\n   */\n  this.setCellMeta = function (row, col, key, val) {\n    var _recordTranslator$toP3 = recordTranslator.toPhysical(row, col),\n        _recordTranslator$toP4 = _slicedToArray(_recordTranslator$toP3, 2),\n        physicalRow = _recordTranslator$toP4[0],\n        physicalColumn = _recordTranslator$toP4[1];\n\n    if (!priv.columnSettings[physicalColumn]) {\n      priv.columnSettings[physicalColumn] = (0, _setting.columnFactory)(GridSettings, priv.columnsSettingConflicts);\n    }\n\n    if (!priv.cellSettings[physicalRow]) {\n      priv.cellSettings[physicalRow] = [];\n    }\n    if (!priv.cellSettings[physicalRow][physicalColumn]) {\n      priv.cellSettings[physicalRow][physicalColumn] = new priv.columnSettings[physicalColumn]();\n    }\n    priv.cellSettings[physicalRow][physicalColumn][key] = val;\n    instance.runHooks('afterSetCellMeta', row, col, key, val);\n  };\n\n  /**\n   * Get all the cells meta settings at least once generated in the table (in order of cell initialization).\n   *\n   * @since 0.19.0\n   * @returns {Array} Returns Array of ColumnSettings object.\n   */\n  this.getCellsMeta = function () {\n    return (0, _array.arrayFlatten)(priv.cellSettings);\n  };\n\n  /**\n   * Returns the cell properties object for the given `row` and `col` coordinates.\n   *\n   * @memberof Core#\n   * @function getCellMeta\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @returns {Object} The cell properties object.\n   * @fires Hooks#beforeGetCellMeta\n   * @fires Hooks#afterGetCellMeta\n   */\n  this.getCellMeta = function (row, col) {\n    var prop = datamap.colToProp(col);\n    var cellProperties = void 0;\n\n    var _recordTranslator$toP5 = recordTranslator.toPhysical(row, col),\n        _recordTranslator$toP6 = _slicedToArray(_recordTranslator$toP5, 2),\n        physicalRow = _recordTranslator$toP6[0],\n        physicalColumn = _recordTranslator$toP6[1];\n\n    // Workaround for #11. Connected also with #3849. It should be fixed within #4497.\n\n\n    if (physicalRow === null) {\n      physicalRow = row;\n    }\n\n    if (!priv.columnSettings[physicalColumn]) {\n      priv.columnSettings[physicalColumn] = (0, _setting.columnFactory)(GridSettings, priv.columnsSettingConflicts);\n    }\n\n    if (!priv.cellSettings[physicalRow]) {\n      priv.cellSettings[physicalRow] = [];\n    }\n    if (!priv.cellSettings[physicalRow][physicalColumn]) {\n      priv.cellSettings[physicalRow][physicalColumn] = new priv.columnSettings[physicalColumn]();\n    }\n\n    cellProperties = priv.cellSettings[physicalRow][physicalColumn]; // retrieve cellProperties from cache\n\n    cellProperties.row = physicalRow;\n    cellProperties.col = physicalColumn;\n    cellProperties.visualRow = row;\n    cellProperties.visualCol = col;\n    cellProperties.prop = prop;\n    cellProperties.instance = instance;\n\n    instance.runHooks('beforeGetCellMeta', row, col, cellProperties);\n    (0, _object.extend)(cellProperties, expandType(cellProperties)); // for `type` added in beforeGetCellMeta\n\n    if (cellProperties.cells) {\n      var settings = cellProperties.cells.call(cellProperties, physicalRow, physicalColumn, prop);\n\n      if (settings) {\n        (0, _object.extend)(cellProperties, settings);\n        (0, _object.extend)(cellProperties, expandType(settings)); // for `type` added in cells\n      }\n    }\n\n    instance.runHooks('afterGetCellMeta', row, col, cellProperties);\n\n    return cellProperties;\n  };\n\n  /**\n   * Returns a row off the cell meta array.\n   *\n   * @memberof Core#\n   * @function getCellMetaAtRow\n   * @since 0.30.0\n   * @param {Number} row Physical index of the row to return cell meta for.\n   * @returns {Array}\n   */\n  this.getCellMetaAtRow = function (row) {\n    return priv.cellSettings[row];\n  };\n\n  /**\n   * Checks if the data format and config allows user to modify the column structure.\n   * @returns {boolean}\n   */\n  this.isColumnModificationAllowed = function () {\n    return !(instance.dataType === 'object' || instance.getSettings().columns);\n  };\n\n  var rendererLookup = (0, _data.cellMethodLookupFactory)('renderer');\n\n  /**\n   * Returns the cell renderer function by given `row` and `col` arguments.\n   *\n   * @memberof Core#\n   * @function getCellRenderer\n   * @since 0.11\n   * @param {Number|Object} row Visual row index or cell meta object.\n   * @param {Number} [col] Visual column index.\n   * @returns {Function} The renderer function.\n   */\n  this.getCellRenderer = function (row, col) {\n    return (0, _renderers.getRenderer)(rendererLookup.call(this, row, col));\n  };\n\n  /**\n   * Returns the cell editor by the provided `row` and `col` arguments.\n   *\n   * @memberof Core#\n   * @function getCellEditor\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @returns {Object} The Editor object.\n   */\n  this.getCellEditor = (0, _data.cellMethodLookupFactory)('editor');\n\n  var validatorLookup = (0, _data.cellMethodLookupFactory)('validator');\n\n  /**\n   * Returns the cell validator by `row` and `col`, provided a validator is defined. If not - it doesn't return anything.\n   *\n   * @memberof Core#\n   * @function getCellValidator\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @returns {Function|RegExp|undefined} The validator function.\n   */\n  this.getCellValidator = function (row, col) {\n    var validator = validatorLookup.call(this, row, col);\n\n    if (typeof validator === 'string') {\n      validator = (0, _validators.getValidator)(validator);\n    }\n\n    return validator;\n  };\n\n  /**\n   * Validates all cells using their validator functions and calls callback when finished.\n   *\n   * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`.\n   *\n   * @memberof Core#\n   * @function validateCells\n   * @param {Function} [callback] The callback function.\n   */\n  this.validateCells = function (callback) {\n    this._validateCells(callback);\n  };\n\n  /**\n   * Validates rows using their validator functions and calls callback when finished.\n   *\n   * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`.\n   *\n   * @memberof Core#\n   * @function validateRows\n   * @param {Array} [rows] Array of validation target visual row indexes.\n   * @param {Function} [callback] The callback function.\n   */\n  this.validateRows = function (rows, callback) {\n    if (!Array.isArray(rows)) {\n      throw new Error('validateRows parameter `rows` must be an array');\n    }\n    this._validateCells(callback, rows);\n  };\n\n  /**\n   * Validates columns using their validator functions and calls callback when finished.\n   *\n   * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`.\n   *\n   * @memberof Core#\n   * @function validateColumns\n   * @param {Array} [columns] Array of validation target visual columns indexes.\n   * @param {Function} [callback] The callback function.\n   */\n  this.validateColumns = function (columns, callback) {\n    if (!Array.isArray(columns)) {\n      throw new Error('validateColumns parameter `columns` must be an array');\n    }\n    this._validateCells(callback, undefined, columns);\n  };\n\n  /**\n   * Validates all cells using their validator functions and calls callback when finished.\n   *\n   * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`.\n   *\n   * Private use intended.\n   *\n   * @private\n   * @memberof Core#\n   * @function _validateCells\n   * @param {Function} [callback] The callback function.\n   * @param {Array} [rows] Optional. Array of validation target visual row indexes.\n   * @param {Array} [columns] Optional. Array of validation target visual column indexes.\n   */\n  this._validateCells = function (callback, rows, columns) {\n    var waitingForValidator = new ValidatorsQueue();\n\n    if (callback) {\n      waitingForValidator.onQueueEmpty = callback;\n    }\n\n    var i = instance.countRows() - 1;\n\n    while (i >= 0) {\n      if (rows !== undefined && rows.indexOf(i) === -1) {\n        i--;\n        continue;\n      }\n      var j = instance.countCols() - 1;\n\n      while (j >= 0) {\n        if (columns !== undefined && columns.indexOf(j) === -1) {\n          j--;\n          continue;\n        }\n        waitingForValidator.addValidatorToQueue();\n\n        instance.validateCell(instance.getDataAtCell(i, j), instance.getCellMeta(i, j), function (result) {\n          if (typeof result !== 'boolean') {\n            throw new Error('Validation error: result is not boolean');\n          }\n          if (result === false) {\n            waitingForValidator.valid = false;\n          }\n          waitingForValidator.removeValidatorFormQueue();\n        }, 'validateCells');\n        j--;\n      }\n      i--;\n    }\n    waitingForValidator.checkIfQueueIsEmpty();\n  };\n\n  /**\n   * Returns an array of row headers' values (if they are enabled). If param `row` was given, it returns the header of the given row as a string.\n   *\n   * @memberof Core#\n   * @function getRowHeader\n   * @param {Number} [row] Visual row index.\n   * @fires Hooks#modifyRowHeader\n   * @returns {Array|String} Array of header values / single header value.\n   */\n  this.getRowHeader = function (row) {\n    var rowHeader = priv.settings.rowHeaders;\n\n    if (row !== void 0) {\n      row = instance.runHooks('modifyRowHeader', row);\n    }\n    if (row === void 0) {\n      rowHeader = [];\n      (0, _number.rangeEach)(instance.countRows() - 1, function (i) {\n        rowHeader.push(instance.getRowHeader(i));\n      });\n    } else if (Array.isArray(rowHeader) && rowHeader[row] !== void 0) {\n      rowHeader = rowHeader[row];\n    } else if ((0, _function.isFunction)(rowHeader)) {\n      rowHeader = rowHeader(row);\n    } else if (rowHeader && typeof rowHeader !== 'string' && typeof rowHeader !== 'number') {\n      rowHeader = row + 1;\n    }\n\n    return rowHeader;\n  };\n\n  /**\n   * Returns information about if this table is configured to display row headers.\n   *\n   * @memberof Core#\n   * @function hasRowHeaders\n   * @returns {Boolean} `true` if the instance has the row headers enabled, `false` otherwise.\n   * @since 0.11\n   */\n  this.hasRowHeaders = function () {\n    return !!priv.settings.rowHeaders;\n  };\n\n  /**\n   * Returns information about if this table is configured to display column headers.\n   *\n   * @memberof Core#\n   * @function hasColHeaders\n   * @since 0.11\n   * @returns {Boolean} `True` if the instance has the column headers enabled, `false` otherwise.\n   */\n  this.hasColHeaders = function () {\n    if (priv.settings.colHeaders !== void 0 && priv.settings.colHeaders !== null) {\n      // Polymer has empty value = null\n      return !!priv.settings.colHeaders;\n    }\n    for (var i = 0, ilen = instance.countCols(); i < ilen; i++) {\n      if (instance.getColHeader(i)) {\n        return true;\n      }\n    }\n\n    return false;\n  };\n\n  /**\n   * Returns an array of column headers (in string format, if they are enabled). If param `col` is given, it returns the header at the given column as a string.\n   *\n   * @memberof Core#\n   * @function getColHeader\n   * @param {Number} [col] Visual column index.\n   * @fires Hooks#modifyColHeader\n   * @returns {Array|String} The column header(s).\n   */\n  this.getColHeader = function (col) {\n    var columnsAsFunc = priv.settings.columns && (0, _function.isFunction)(priv.settings.columns);\n    var result = priv.settings.colHeaders;\n\n    col = instance.runHooks('modifyColHeader', col);\n\n    if (col === void 0) {\n      var out = [];\n      var ilen = columnsAsFunc ? instance.countSourceCols() : instance.countCols();\n\n      for (var i = 0; i < ilen; i++) {\n        out.push(instance.getColHeader(i));\n      }\n\n      result = out;\n    } else {\n      var translateVisualIndexToColumns = function translateVisualIndexToColumns(col) {\n        var arr = [];\n        var columnsLen = instance.countSourceCols();\n        var index = 0;\n\n        for (; index < columnsLen; index++) {\n          if ((0, _function.isFunction)(instance.getSettings().columns) && instance.getSettings().columns(index)) {\n            arr.push(index);\n          }\n        }\n\n        return arr[col];\n      };\n      var baseCol = col;\n      col = instance.runHooks('modifyCol', col);\n\n      var prop = translateVisualIndexToColumns(col);\n\n      if (priv.settings.columns && (0, _function.isFunction)(priv.settings.columns) && priv.settings.columns(prop) && priv.settings.columns(prop).title) {\n        result = priv.settings.columns(prop).title;\n      } else if (priv.settings.columns && priv.settings.columns[col] && priv.settings.columns[col].title) {\n        result = priv.settings.columns[col].title;\n      } else if (Array.isArray(priv.settings.colHeaders) && priv.settings.colHeaders[col] !== void 0) {\n        result = priv.settings.colHeaders[col];\n      } else if ((0, _function.isFunction)(priv.settings.colHeaders)) {\n        result = priv.settings.colHeaders(col);\n      } else if (priv.settings.colHeaders && typeof priv.settings.colHeaders !== 'string' && typeof priv.settings.colHeaders !== 'number') {\n        result = (0, _data.spreadsheetColumnLabel)(baseCol); // see #1458\n      }\n    }\n\n    return result;\n  };\n\n  /**\n   * Return column width from settings (no guessing). Private use intended.\n   *\n   * @private\n   * @memberof Core#\n   * @function _getColWidthFromSettings\n   * @param {Number} col Visual col index.\n   * @returns {Number}\n   */\n  this._getColWidthFromSettings = function (col) {\n    var cellProperties = instance.getCellMeta(0, col);\n    var width = cellProperties.width;\n\n    if (width === void 0 || width === priv.settings.width) {\n      width = cellProperties.colWidths;\n    }\n    if (width !== void 0 && width !== null) {\n      switch (typeof width === 'undefined' ? 'undefined' : _typeof(width)) {\n        case 'object':\n          // array\n          width = width[col];\n          break;\n\n        case 'function':\n          width = width(col);\n          break;\n        default:\n          break;\n      }\n      if (typeof width === 'string') {\n        width = parseInt(width, 10);\n      }\n    }\n\n    return width;\n  };\n\n  /**\n   * Returns the width of the requested column.\n   *\n   * @memberof Core#\n   * @function getColWidth\n   * @since 0.11\n   * @param {Number} col Visual column index.\n   * @returns {Number} Column width.\n   * @fires Hooks#modifyColWidth\n   */\n  this.getColWidth = function (col) {\n    var width = instance._getColWidthFromSettings(col);\n\n    width = instance.runHooks('modifyColWidth', width, col);\n\n    if (width === void 0) {\n      width = _src.ViewportColumnsCalculator.DEFAULT_WIDTH;\n    }\n\n    return width;\n  };\n\n  /**\n   * Return row height from settings (no guessing). Private use intended.\n   *\n   * @private\n   * @memberof Core#\n   * @function _getRowHeightFromSettings\n   * @param {Number} row Visual row index.\n   * @returns {Number}\n   */\n  this._getRowHeightFromSettings = function (row) {\n    // let cellProperties = instance.getCellMeta(row, 0);\n    // let height = cellProperties.height;\n    //\n    // if (height === void 0 || height === priv.settings.height) {\n    //  height = cellProperties.rowHeights;\n    // }\n    var height = priv.settings.rowHeights;\n\n    if (height !== void 0 && height !== null) {\n      switch (typeof height === 'undefined' ? 'undefined' : _typeof(height)) {\n        case 'object':\n          // array\n          height = height[row];\n          break;\n\n        case 'function':\n          height = height(row);\n          break;\n        default:\n          break;\n      }\n      if (typeof height === 'string') {\n        height = parseInt(height, 10);\n      }\n    }\n\n    return height;\n  };\n\n  /**\n   * Returns the row height.\n   *\n   * @memberof Core#\n   * @function getRowHeight\n   * @since 0.11\n   * @param {Number} row Visual row index.\n   * @returns {Number} The given row's height.\n   * @fires Hooks#modifyRowHeight\n   */\n  this.getRowHeight = function (row) {\n    var height = instance._getRowHeightFromSettings(row);\n\n    height = instance.runHooks('modifyRowHeight', height, row);\n\n    return height;\n  };\n\n  /**\n   * Returns the total number of rows in the data source.\n   *\n   * @memberof Core#\n   * @function countSourceRows\n   * @since 0.20.0\n   * @returns {Number} Total number in rows in data source.\n   */\n  this.countSourceRows = function () {\n    var sourceLength = instance.runHooks('modifySourceLength');\n    return sourceLength || (instance.getSourceData() ? instance.getSourceData().length : 0);\n  };\n\n  /**\n   * Returns the total number of columns in the data source.\n   *\n   * @memberof Core#\n   * @function countSourceCols\n   * @since 0.26.1\n   * @returns {Number} Total number in columns in data source.\n   */\n  this.countSourceCols = function () {\n    var len = 0;\n    var obj = instance.getSourceData() && instance.getSourceData()[0] ? instance.getSourceData()[0] : [];\n\n    if ((0, _object.isObject)(obj)) {\n      len = (0, _object.deepObjectSize)(obj);\n    } else {\n      len = obj.length || 0;\n    }\n\n    return len;\n  };\n\n  /**\n   * Returns the total number of rows in the grid.\n   *\n   * @memberof Core#\n   * @function countRows\n   * @returns {Number} Total number in rows the grid.\n   */\n  this.countRows = function () {\n    return datamap.getLength();\n  };\n\n  /**\n   * Returns the total number of columns in the grid.\n   *\n   * @memberof Core#\n   * @function countCols\n   * @returns {Number} Total number of columns.\n   */\n  this.countCols = function () {\n    var maxCols = this.getSettings().maxCols;\n    var dataHasLength = false;\n    var dataLen = 0;\n\n    if (instance.dataType === 'array') {\n      dataHasLength = priv.settings.data && priv.settings.data[0] && priv.settings.data[0].length;\n    }\n\n    if (dataHasLength) {\n      dataLen = priv.settings.data[0].length;\n    }\n\n    if (priv.settings.columns) {\n      var columnsIsFunction = (0, _function.isFunction)(priv.settings.columns);\n\n      if (columnsIsFunction) {\n        if (instance.dataType === 'array') {\n          var columnLen = 0;\n\n          for (var i = 0; i < dataLen; i++) {\n            if (priv.settings.columns(i)) {\n              columnLen++;\n            }\n          }\n\n          dataLen = columnLen;\n        } else if (instance.dataType === 'object' || instance.dataType === 'function') {\n          dataLen = datamap.colToPropCache.length;\n        }\n      } else {\n        dataLen = priv.settings.columns.length;\n      }\n    } else if (instance.dataType === 'object' || instance.dataType === 'function') {\n      dataLen = datamap.colToPropCache.length;\n    }\n\n    return Math.min(maxCols, dataLen);\n  };\n\n  /**\n   * Returns an visual index of the first rendered row.\n   *\n   * @memberof Core#\n   * @function rowOffset\n   * @returns {Number} Visual index of first rendered row.\n   */\n  this.rowOffset = function () {\n    return instance.view.wt.wtTable.getFirstRenderedRow();\n  };\n\n  /**\n   * Returns the visual index of the first rendered column.\n   *\n   * @memberof Core#\n   * @function colOffset\n   * @returns {Number} Visual index of the first visible column.\n   */\n  this.colOffset = function () {\n    return instance.view.wt.wtTable.getFirstRenderedColumn();\n  };\n\n  /**\n   * Returns the number of rendered rows (including rows partially or fully rendered outside viewport).\n   *\n   * @memberof Core#\n   * @function countRenderedRows\n   * @returns {Number} Returns -1 if table is not visible.\n   */\n  this.countRenderedRows = function () {\n    return instance.view.wt.drawn ? instance.view.wt.wtTable.getRenderedRowsCount() : -1;\n  };\n\n  /**\n   * Returns the number of visible rows (rendered rows that fully fit inside viewport).\n   *\n   * @memberof Core#\n   * @function countVisibleRows\n   * @returns {Number} Number of visible rows or -1.\n   */\n  this.countVisibleRows = function () {\n    return instance.view.wt.drawn ? instance.view.wt.wtTable.getVisibleRowsCount() : -1;\n  };\n\n  /**\n   * Returns the number of rendered columns (including columns partially or fully rendered outside viewport).\n   *\n   * @memberof Core#\n   * @function countRenderedCols\n   * @returns {Number} Returns -1 if table is not visible.\n   */\n  this.countRenderedCols = function () {\n    return instance.view.wt.drawn ? instance.view.wt.wtTable.getRenderedColumnsCount() : -1;\n  };\n\n  /**\n   * Returns the number of visible columns. Returns -1 if table is not visible\n   *\n   * @memberof Core#\n   * @function countVisibleCols\n   * @return {Number} Number of visible columns or -1.\n   */\n  this.countVisibleCols = function () {\n    return instance.view.wt.drawn ? instance.view.wt.wtTable.getVisibleColumnsCount() : -1;\n  };\n\n  /**\n   * Returns the number of empty rows. If the optional ending parameter is `true`, returns the\n   * number of empty rows at the bottom of the table.\n   *\n   * @memberof Core#\n   * @function countEmptyRows\n   * @param {Boolean} [ending] If `true`, will only count empty rows at the end of the data source.\n   * @returns {Number} Count empty rows.\n   */\n  this.countEmptyRows = function (ending) {\n    var emptyRows = 0;\n\n    (0, _number.rangeEachReverse)(instance.countRows() - 1, function (visualIndex) {\n      if (instance.isEmptyRow(visualIndex)) {\n        emptyRows += 1;\n      } else if (ending === true) {\n        return false;\n      }\n    });\n\n    return emptyRows;\n  };\n\n  /**\n   * Returns the number of empty columns. If the optional ending parameter is `true`, returns the number of empty\n   * columns at right hand edge of the table.\n   *\n   * @memberof Core#\n   * @function countEmptyCols\n   * @param {Boolean} [ending] If `true`, will only count empty columns at the end of the data source row.\n   * @returns {Number} Count empty cols.\n   */\n  this.countEmptyCols = function (ending) {\n    if (instance.countRows() < 1) {\n      return 0;\n    }\n\n    var emptyColumns = 0;\n\n    (0, _number.rangeEachReverse)(instance.countCols() - 1, function (visualIndex) {\n      if (instance.isEmptyCol(visualIndex)) {\n        emptyColumns += 1;\n      } else if (ending === true) {\n        return false;\n      }\n    });\n\n    return emptyColumns;\n  };\n\n  /**\n   * Check if all cells in the row declared by the `row` argument are empty.\n   *\n   * @memberof Core#\n   * @function isEmptyRow\n   * @param {Number} row Visual row index.\n   * @returns {Boolean} `true` if the row at the given `row` is empty, `false` otherwise.\n   */\n  this.isEmptyRow = function (row) {\n    return priv.settings.isEmptyRow.call(instance, row);\n  };\n\n  /**\n   * Check if all cells in the the column declared by the `col` argument are empty.\n   *\n   * @memberof Core#\n   * @function isEmptyCol\n   * @param {Number} col Column index.\n   * @returns {Boolean} `true` if the column at the given `col` is empty, `false` otherwise.\n   */\n  this.isEmptyCol = function (col) {\n    return priv.settings.isEmptyCol.call(instance, col);\n  };\n\n  /**\n   * Select cell specified by `row` and `col` values or a range of cells finishing at `endRow`, `endCol`. If the table\n   * was configured to support data column properties that properties can be used to making a selection.\n   *\n   * By default, viewport will be scrolled to the selection. After the `selectCell` method had finished, the instance\n   * will be listening to keyboard input on the document.\n   *\n   * @example\n   * ```js\n   * // select a single cell\n   * hot.selectCell(2, 4);\n   * // select a single cell using column property\n   * hot.selectCell(2, 'address');\n   * // select a range of cells\n   * hot.selectCell(2, 4, 3, 5);\n   * // select a range of cells using column properties\n   * hot.selectCell(2, 'address', 3, 'phone_number');\n   * // select a range of cells without scrolling to them\n   * hot.selectCell(2, 'address', 3, 'phone_number', false);\n   * ```\n   *\n   * @memberof Core#\n   * @function selectCell\n   * @param {Number} row Visual row index.\n   * @param {Number|String} column Visual column index or column property.\n   * @param {Number} [endRow] Visual end row index (if selecting a range).\n   * @param {Number|String} [endColumn] Visual end column index or column property (if selecting a range).\n   * @param {Boolean} [scrollToCell=true] If `true`, the viewport will be scrolled to the selection.\n   * @param {Boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectCell = function (row, column, endRow, endColumn) {\n    var scrollToCell = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n    var changeListener = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n\n    if ((0, _mixed.isUndefined)(row) || (0, _mixed.isUndefined)(column)) {\n      return false;\n    }\n\n    return this.selectCells([[row, column, endRow, endColumn]], scrollToCell, changeListener);\n  };\n\n  /**\n   * Make multiple, non-contiguous selection specified by `row` and `column` values or a range of cells\n   * finishing at `endRow`, `endColumn`. The method supports two input formats which are the same as that\n   * produces by `getSelected` and `getSelectedRange` methods.\n   *\n   * By default, viewport will be scrolled to selection. After the `selectCells` method had finished, the instance\n   * will be listening to keyboard input on the document.\n   *\n   * @example\n   * ```js\n   * // using an array of arrays\n   * hot.selectCells([[1, 1, 2, 2], [3, 3], [6, 2, 0, 2]]);\n   * // using an array of arrays with defined columns as props\n   * hot.selectCells([[1, 'id', 2, 'first_name'], [3, 'full_name'], [6, 'last_name', 0, 'first_name']]);\n   * // or using an array of CellRange objects (produced by `.getSelectedRange()` method)\n   * const selected = hot.getSelectedRange();\n   *\n   * selected[0].from.row = 0;\n   * selected[0].from.col = 0;\n   *\n   * hot.selectCells(selected);\n   * ```\n   *\n   * @memberof Core#\n   * @since 0.38.0\n   * @function selectCells\n   * @param {Array[]|CellRange[]} coords Visual coords passed as an array of array (`[[rowStart, columnStart, rowEnd, columnEnd], ...]`)\n   *                                     the same format as `getSelected` method returns or as an CellRange objects\n   *                                     which is the same format what `getSelectedRange` method returns.\n   * @param {Boolean} [scrollToCell=true] If `true`, the viewport will be scrolled to the selection.\n   * @param {Boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectCells = function () {\n    var coords = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [[]];\n    var scrollToCell = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n    var changeListener = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n    if (scrollToCell === false) {\n      preventScrollingToCell = true;\n    }\n\n    var wasSelected = selection.selectCells(coords);\n\n    if (wasSelected && changeListener) {\n      instance.listen();\n    }\n    preventScrollingToCell = false;\n\n    return wasSelected;\n  };\n\n  /**\n   * Select the cell specified by the `row` and `prop` arguments, or a range finishing at `endRow`, `endProp`.\n   * By default, viewport will be scrolled to selection.\n   *\n   * @deprecated\n   * @memberof Core#\n   * @function selectCellByProp\n   * @param {Number} row Visual row index.\n   * @param {String} prop Property name.\n   * @param {Number} [endRow] visual end row index (if selecting a range).\n   * @param {String} [endProp] End property name (if selecting a range).\n   * @param {Boolean} [scrollToCell=true] If `true`, viewport will be scrolled to the selection.\n   * @param {Boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectCellByProp = function (row, prop, endRow, endProp) {\n    var scrollToCell = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n    var changeListener = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n\n    (0, _console.warn)((0, _templateLiteralTag.toSingleLine)(_templateObject));\n\n    return this.selectCells([[row, prop, endRow, endProp]], scrollToCell, changeListener);\n  };\n\n  /**\n   * Select column specified by `startColumn` visual index, column property or a range of columns finishing at `endColumn`.\n   *\n   * @example\n   * ```js\n   * // select column using visual index\n   * hot.selectColumns(1);\n   * // select column using column property\n   * hot.selectColumns('id');\n   * // select range of columns using visual indexes\n   * hot.selectColumns(1, 4);\n   * // select range of columns using column properties\n   * hot.selectColumns('id', 'last_name');\n   * ```\n   *\n   * @memberof Core#\n   * @since 0.38.0\n   * @function selectColumns\n   * @param {Number} startColumn The visual column index from which the selection starts.\n   * @param {Number} [endColumn=startColumn] The visual column index to which the selection finishes. If `endColumn`\n   *                                         is not defined the column defined by `startColumn` will be selected.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectColumns = function (startColumn) {\n    var endColumn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startColumn;\n\n    return selection.selectColumns(startColumn, endColumn);\n  };\n\n  /**\n   * Select row specified by `startRow` visual index or a range of rows finishing at `endRow`.\n   *\n   * @example\n   * ```js\n   * select row using visual index\n   * hot.selectRows(1);\n   * select range of rows using visual indexes\n   * hot.selectRows(1, 4);\n   * ```\n   *\n   * @memberof Core#\n   * @since 0.38.0\n   * @function selectRows\n   * @param {Number} startRow The visual row index from which the selection starts.\n   * @param {Number} [endRow=startRow] The visual row index to which the selection finishes. If `endRow`\n   *                                   is not defined the row defined by `startRow` will be selected.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectRows = function (startRow) {\n    var endRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startRow;\n\n    return selection.selectRows(startRow, endRow);\n  };\n\n  /**\n   * Deselects the current cell selection on grid.\n   *\n   * @memberof Core#\n   * @function deselectCell\n   */\n  this.deselectCell = function () {\n    selection.deselect();\n  };\n\n  /**\n   * Select the whole table. The previous selection will be overwritten.\n   *\n   * @since 0.38.2\n   * @memberof Core#\n   * @function selectAll\n   */\n  this.selectAll = function () {\n    preventScrollingToCell = true;\n    selection.selectAll();\n    preventScrollingToCell = false;\n  };\n\n  /**\n   * Scroll viewport to coords specified by the `row` and `column` arguments.\n   *\n   * @since 0.24.3\n   * @memberof Core#\n   * @function scrollViewportTo\n   * @param {Number} [row] Visual row index.\n   * @param {Number} [column] Visual column index.\n   * @param {Boolean} [snapToBottom = false] If `true`, viewport is scrolled to show the cell on the bottom of the table.\n   * @param {Boolean} [snapToRight = false] If `true`, viewport is scrolled to show the cell on the right side of the table.\n   * @returns {Boolean} `true` if scroll was successful, `false` otherwise.\n   */\n  this.scrollViewportTo = function (row, column) {\n    var snapToBottom = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n    var snapToRight = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n    if (row !== void 0 && (row < 0 || row >= instance.countRows())) {\n      return false;\n    }\n    if (column !== void 0 && (column < 0 || column >= instance.countCols())) {\n      return false;\n    }\n\n    var result = false;\n\n    if (row !== void 0 && column !== void 0) {\n      instance.view.wt.wtOverlays.topOverlay.scrollTo(row, snapToBottom);\n      instance.view.wt.wtOverlays.leftOverlay.scrollTo(column, snapToRight);\n\n      result = true;\n    }\n    if (typeof row === 'number' && typeof column !== 'number') {\n      instance.view.wt.wtOverlays.topOverlay.scrollTo(row, snapToBottom);\n\n      result = true;\n    }\n    if (typeof column === 'number' && typeof row !== 'number') {\n      instance.view.wt.wtOverlays.leftOverlay.scrollTo(column, snapToRight);\n\n      result = true;\n    }\n\n    return result;\n  };\n\n  /**\n   * Removes grid from the DOM.\n   *\n   * @memberof Core#\n   * @function destroy\n   * @fires Hooks#afterDestroy\n   */\n  this.destroy = function () {\n\n    instance._clearTimeouts();\n    if (instance.view) {\n      // in case HT is destroyed before initialization has finished\n      instance.view.destroy();\n    }\n    if (dataSource) {\n      dataSource.destroy();\n    }\n    dataSource = null;\n\n    (0, _keyStateObserver.stopObserving)();\n\n    if (false) {\n      var licenseInfo = document.querySelector('#hot-display-license-info');\n\n      if (licenseInfo) {\n        licenseInfo.parentNode.removeChild(licenseInfo);\n      }\n    }\n    (0, _element.empty)(instance.rootElement);\n    eventManager.destroy();\n\n    if (editorManager) {\n      editorManager.destroy();\n    }\n\n    instance.runHooks('afterDestroy');\n    _pluginHooks2.default.getSingleton().destroy(instance);\n\n    for (var i in instance) {\n      if ((0, _object.hasOwnProperty)(instance, i)) {\n        // replace instance methods with post mortem\n        if ((0, _function.isFunction)(instance[i])) {\n          instance[i] = postMortem;\n        } else if (i !== 'guid') {\n          // replace instance properties with null (restores memory)\n          // it should not be necessary but this prevents a memory leak side effects that show itself in Jasmine tests\n          instance[i] = null;\n        }\n      }\n    }\n\n    // replace private properties with null (restores memory)\n    // it should not be necessary but this prevents a memory leak side effects that show itself in Jasmine tests\n    if (datamap) {\n      datamap.destroy();\n    }\n    datamap = null;\n    priv = null;\n    grid = null;\n    selection = null;\n    editorManager = null;\n    instance = null;\n    GridSettings = null;\n  };\n\n  /**\n   * Replacement for all methods after Handsotnable was destroyed.\n   *\n   * @private\n   */\n  function postMortem() {\n    throw new Error('This method cannot be called because this Handsontable instance has been destroyed');\n  }\n\n  /**\n   * Returns the active editor object.\n   *\n   * @memberof Core#\n   * @function getActiveEditor\n   * @returns {Object} The active editor object.\n   */\n  this.getActiveEditor = function () {\n    return editorManager.getActiveEditor();\n  };\n\n  /**\n   * Returns plugin instance using the plugin name provided.\n   *\n   * @memberof Core#\n   * @function getPlugin\n   * @param {String} pluginName The plugin name.\n   * @returns {*} The plugin instance.\n   * @since 0.15.0\n   */\n  this.getPlugin = function (pluginName) {\n    return (0, _plugins.getPlugin)(this, pluginName);\n  };\n\n  /**\n   * Returns the Handsontable instance.\n   *\n   * @memberof Core#\n   * @function getInstance\n   * @returns {Handsontable} The Handsontable instance.\n   */\n  this.getInstance = function () {\n    return instance;\n  };\n\n  /**\n   * Adds listener to the specified hook name (only for this Handsontable instance).\n   *\n   * @memberof Core#\n   * @function addHook\n   * @see Hooks#add\n   * @param {String} key Hook name.\n   * @param {Function|Array} callback Function or array of Functions.\n   *\n   * @example\n   * ```js\n   * hot.addHook('beforeInit', myCallback);\n   * ```\n   */\n  this.addHook = function (key, callback) {\n    _pluginHooks2.default.getSingleton().add(key, callback, instance);\n  };\n\n  /**\n   * Check if for a specified hook name there are added listeners (only for this Handsontable instance).\n   *\n   * @memberof Core#\n   * @function hasHook\n   * @see Hooks#has\n   * @param {String} key Hook name\n   * @return {Boolean}\n   *\n   * @example\n   * ```js\n   * var hasBeforeInitListeners = hot.hasHook('beforeInit');\n   * ```\n   */\n  this.hasHook = function (key) {\n    return _pluginHooks2.default.getSingleton().has(key, instance);\n  };\n\n  /**\n   * Adds listener to specified hook name (only for this Handsontable instance).\n   * After the listener is triggered, it will be automatically removed.\n   *\n   * @memberof Core#\n   * @function addHookOnce\n   * @see Hooks#once\n   * @param {String} key Hook name.\n   * @param {Function|Array} callback Function or array of Functions.\n   *\n   * @example\n   * ```js\n   * hot.addHookOnce('beforeInit', myCallback);\n   * ```\n   */\n  this.addHookOnce = function (key, callback) {\n    _pluginHooks2.default.getSingleton().once(key, callback, instance);\n  };\n\n  /**\n   * Removes the hook listener previously registered with {@link Core#addHook}.\n   *\n   * @memberof Core#\n   * @function removeHook\n   * @see Hooks#remove\n   * @param {String} key Hook name.\n   * @param {Function} callback Function which have been registered via {@link Core#addHook}.\n   *\n   * @example\n   * ```js\n   * hot.removeHook('beforeInit', myCallback);\n   * ```\n   */\n  this.removeHook = function (key, callback) {\n    _pluginHooks2.default.getSingleton().remove(key, callback, instance);\n  };\n\n  /**\n   * Run the callbacks for the hook provided in the `key` argument using the parameters given in the other arguments.\n   *\n   * @memberof Core#\n   * @function runHooks\n   * @see Hooks#run\n   * @param {String} key Hook name.\n   * @param {*} [p1] Argument passed to the callback.\n   * @param {*} [p2] Argument passed to the callback.\n   * @param {*} [p3] Argument passed to the callback.\n   * @param {*} [p4] Argument passed to the callback.\n   * @param {*} [p5] Argument passed to the callback.\n   * @param {*} [p6] Argument passed to the callback.\n   * @returns {*}\n   *\n   * @example\n   * ```js\n   * hot.runHooks('beforeInit');\n   * ```\n   */\n  this.runHooks = function (key, p1, p2, p3, p4, p5, p6) {\n    return _pluginHooks2.default.getSingleton().run(instance, key, p1, p2, p3, p4, p5, p6);\n  };\n\n  /**\n   * Get phrase for specified dictionary key.\n   *\n   * @memberof Core#\n   * @function getTranslatedPhrase\n   * @since 0.35.0\n   * @param {String} dictionaryKey Constant which is dictionary key.\n   * @param {*} extraArguments Arguments which will be handled by formatters.\n   *\n   * @returns {String}\n   */\n  this.getTranslatedPhrase = function (dictionaryKey, extraArguments) {\n    return (0, _i18n.getTranslatedPhrase)(priv.settings.language, dictionaryKey, extraArguments);\n  };\n\n  this.timeouts = [];\n\n  /**\n   * Sets timeout. Purpose of this method is to clear all known timeouts when `destroy` method is called.\n   *\n   * @param {*} handle\n   * @private\n   */\n  this._registerTimeout = function (handle) {\n    this.timeouts.push(handle);\n  };\n\n  /**\n   * Clears all known timeouts.\n   *\n   * @private\n   */\n  this._clearTimeouts = function () {\n    for (var i = 0, ilen = this.timeouts.length; i < ilen; i++) {\n      clearTimeout(this.timeouts[i]);\n    }\n  };\n\n  /**\n   * Refresh selection borders. This is temporary method relic after selection rewrite.\n   *\n   * @private\n   * @param {Boolean} revertOriginal\n   */\n  this._refreshBorders = function (revertOriginal) {\n    editorManager.destroyEditor(revertOriginal);\n    instance.view.render();\n\n    if (selection.isSelected()) {\n      editorManager.prepareEditor();\n    }\n  };\n\n  _pluginHooks2.default.getSingleton().run(instance, 'construct');\n};\n\n/***/ }),\n/* 89 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.columnFactory = columnFactory;\n\nvar _object = __webpack_require__(2);\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Factory for columns constructors.\n *\n * @param {Object} GridSettings\n * @param {Array} conflictList\n * @return {Object} ColumnSettings\n */\nfunction columnFactory(GridSettings, conflictList) {\n  function ColumnSettings() {};\n\n  (0, _object.inherit)(ColumnSettings, GridSettings);\n\n  // Clear conflict settings\n  for (var i = 0, len = conflictList.length; i < len; i++) {\n    ColumnSettings.prototype[conflictList[i]] = void 0;\n  }\n\n  return ColumnSettings;\n}\n\n/***/ }),\n/* 90 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.spreadsheetColumnLabel = spreadsheetColumnLabel;\nexports.spreadsheetColumnIndex = spreadsheetColumnIndex;\nexports.createSpreadsheetData = createSpreadsheetData;\nexports.createSpreadsheetObjectData = createSpreadsheetObjectData;\nexports.createEmptySpreadsheetData = createEmptySpreadsheetData;\nexports.translateRowsToColumns = translateRowsToColumns;\nexports.cellMethodLookupFactory = cellMethodLookupFactory;\n\nvar _cellTypes = __webpack_require__(87);\n\nvar _object = __webpack_require__(2);\n\nvar COLUMN_LABEL_BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\nvar COLUMN_LABEL_BASE_LENGTH = COLUMN_LABEL_BASE.length;\n\n/**\n * Generates spreadsheet-like column names: A, B, C, ..., Z, AA, AB, etc.\n *\n * @param {Number} index Column index.\n * @returns {String}\n */\nfunction spreadsheetColumnLabel(index) {\n  var dividend = index + 1;\n  var columnLabel = '';\n  var modulo = void 0;\n\n  while (dividend > 0) {\n    modulo = (dividend - 1) % COLUMN_LABEL_BASE_LENGTH;\n    columnLabel = String.fromCharCode(65 + modulo) + columnLabel;\n    dividend = parseInt((dividend - modulo) / COLUMN_LABEL_BASE_LENGTH, 10);\n  }\n\n  return columnLabel;\n}\n\n/**\n * Generates spreadsheet-like column index from theirs labels: A, B, C ...., Z, AA, AB, etc.\n *\n * @param {String} label Column label.\n * @returns {Number}\n */\nfunction spreadsheetColumnIndex(label) {\n  var result = 0;\n\n  if (label) {\n    for (var i = 0, j = label.length - 1; i < label.length; i += 1, j -= 1) {\n      result += Math.pow(COLUMN_LABEL_BASE_LENGTH, j) * (COLUMN_LABEL_BASE.indexOf(label[i]) + 1);\n    }\n  }\n  --result;\n\n  return result;\n}\n\n/**\n * Creates 2D array of Excel-like values \"A1\", \"A2\", ...\n *\n * @param {Number} rows Number of rows to generate.\n * @param {Number} columns Number of columns to generate.\n * @returns {Array}\n */\nfunction createSpreadsheetData() {\n  var rows = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100;\n  var columns = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 4;\n\n  var _rows = [],\n      i,\n      j;\n\n  for (i = 0; i < rows; i++) {\n    var row = [];\n\n    for (j = 0; j < columns; j++) {\n      row.push(spreadsheetColumnLabel(j) + (i + 1));\n    }\n    _rows.push(row);\n  }\n\n  return _rows;\n}\n\n/**\n * Creates 2D array of Excel-like values \"A1\", \"A2\", as an array of objects.\n *\n * @param {Number} rows Number of rows to generate.\n * @param {Number} colCount Number of columns to generate.\n * @returns {Array}\n */\nfunction createSpreadsheetObjectData() {\n  var rows = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100;\n  var colCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 4;\n\n  var _rows = [],\n      i,\n      j;\n\n  for (i = 0; i < rows; i++) {\n    var row = {};\n\n    for (j = 0; j < colCount; j++) {\n      row['prop' + j] = spreadsheetColumnLabel(j) + (i + 1);\n    }\n    _rows.push(row);\n  }\n\n  return _rows;\n}\n\n/**\n * Generates an empty data object.\n *\n * @param {Number} rows Number of rows to generate.\n * @param {Number} columns Number of columns to generate\n * @returns {Array}\n */\nfunction createEmptySpreadsheetData(rows, columns) {\n  var data = [];\n  var row = void 0;\n\n  for (var i = 0; i < rows; i++) {\n    row = [];\n    for (var j = 0; j < columns; j++) {\n      row.push('');\n    }\n    data.push(row);\n  }\n\n  return data;\n}\n\nfunction translateRowsToColumns(input) {\n  var i,\n      ilen,\n      j,\n      jlen,\n      output = [],\n      olen = 0;\n\n  for (i = 0, ilen = input.length; i < ilen; i++) {\n    for (j = 0, jlen = input[i].length; j < jlen; j++) {\n      if (j == olen) {\n        output.push([]);\n        olen++;\n      }\n      output[j].push(input[i][j]);\n    }\n  }\n\n  return output;\n}\n\n/**\n * Factory that produces a function for searching methods (or any properties) which could be defined directly in\n * table configuration or implicitly, within cell type definition.\n *\n * For example: renderer can be defined explicitly using \"renderer\" property in column configuration or it can be\n * defined implicitly using \"type\" property.\n *\n * Methods/properties defined explicitly always takes precedence over those defined through \"type\".\n *\n * If the method/property is not found in an object, searching is continued recursively through prototype chain, until\n * it reaches the Object.prototype.\n *\n *\n * @param methodName {String} name of the method/property to search (i.e. 'renderer', 'validator', 'copyable')\n * @param allowUndefined {Boolean} [optional] if false, the search is continued if methodName has not been found in cell \"type\"\n * @returns {Function}\n */\nfunction cellMethodLookupFactory(methodName, allowUndefined) {\n\n  allowUndefined = typeof allowUndefined == 'undefined' ? true : allowUndefined;\n\n  return function cellMethodLookup(row, col) {\n    return function getMethodFromProperties(properties) {\n\n      if (!properties) {\n        return; // method not found\n      } else if ((0, _object.hasOwnProperty)(properties, methodName) && properties[methodName] !== void 0) {\n        // check if it is own and is not empty\n        return properties[methodName]; // method defined directly\n      } else if ((0, _object.hasOwnProperty)(properties, 'type') && properties.type) {\n        // check if it is own and is not empty\n        var type;\n\n        if (typeof properties.type != 'string') {\n          throw new Error('Cell type must be a string ');\n        }\n        type = (0, _cellTypes.getCellType)(properties.type);\n\n        if ((0, _object.hasOwnProperty)(type, methodName)) {\n          return type[methodName]; // method defined in type.\n        } else if (allowUndefined) {\n          return; // method does not defined in type (eg. validator), returns undefined\n        }\n      }\n\n      return getMethodFromProperties(Object.getPrototypeOf(properties));\n    }(typeof row == 'number' ? this.getCellMeta(row, col) : row);\n  };\n}\n\n/***/ }),\n/* 91 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.SELECTION_TYPES = exports.SELECTION_TYPE_OBJECT = exports.SELECTION_TYPE_ARRAY = exports.SELECTION_TYPE_EMPTY = exports.SELECTION_TYPE_UNRECOGNIZED = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.detectSelectionType = detectSelectionType;\nexports.normalizeSelectionFactory = normalizeSelectionFactory;\nexports.transformSelectionToColumnDistance = transformSelectionToColumnDistance;\nexports.transformSelectionToRowDistance = transformSelectionToRowDistance;\nexports.isValidCoord = isValidCoord;\n\nvar _src = __webpack_require__(4);\n\nvar _array = __webpack_require__(1);\n\nvar _mixed = __webpack_require__(16);\n\nvar SELECTION_TYPE_UNRECOGNIZED = exports.SELECTION_TYPE_UNRECOGNIZED = 0;\nvar SELECTION_TYPE_EMPTY = exports.SELECTION_TYPE_EMPTY = 1;\nvar SELECTION_TYPE_ARRAY = exports.SELECTION_TYPE_ARRAY = 2;\nvar SELECTION_TYPE_OBJECT = exports.SELECTION_TYPE_OBJECT = 3;\nvar SELECTION_TYPES = exports.SELECTION_TYPES = [SELECTION_TYPE_OBJECT, SELECTION_TYPE_ARRAY];\nvar ARRAY_TYPE_PATTERN = [['number'], ['number', 'string'], ['number', 'undefined'], ['number', 'string', 'undefined']];\nvar rootCall = Symbol('root');\nvar childCall = Symbol('child');\n\n/**\n * Detect selection schema structure.\n *\n * @param {*} selectionRanges The selected range or and array of selected ranges. This type of data is produced by\n *                            `hot.getSelected()`, `hot.getSelectedLast()`, `hot.getSelectedRange()`\n *                            and `hot.getSelectedRangeLast()` methods.\n * @returns {Number} Returns a number that specifies the type of detected selection schema. If selection schema type\n *                   is unrecognized than it returns `0`.\n */\nfunction detectSelectionType(selectionRanges) {\n  var _callSymbol = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : rootCall;\n\n  if (_callSymbol !== rootCall && _callSymbol !== childCall) {\n    throw new Error('The second argument is used internally only and cannot be overwritten.');\n  }\n\n  var isArray = Array.isArray(selectionRanges);\n  var isRootCall = _callSymbol === rootCall;\n  var result = SELECTION_TYPE_UNRECOGNIZED;\n\n  if (isArray) {\n    var firstItem = selectionRanges[0];\n\n    if (selectionRanges.length === 0) {\n      result = SELECTION_TYPE_EMPTY;\n    } else if (isRootCall && firstItem instanceof _src.CellRange) {\n      result = SELECTION_TYPE_OBJECT;\n    } else if (isRootCall && Array.isArray(firstItem)) {\n      result = detectSelectionType(firstItem, childCall);\n    } else if (selectionRanges.length >= 2 && selectionRanges.length <= 4) {\n      var isArrayType = !selectionRanges.some(function (value, index) {\n        return !ARRAY_TYPE_PATTERN[index].includes(typeof value === 'undefined' ? 'undefined' : _typeof(value));\n      });\n\n      if (isArrayType) {\n        result = SELECTION_TYPE_ARRAY;\n      }\n    }\n  }\n\n  return result;\n}\n\n/**\n * Factory function designed for normalization data schema from different data structures of the selection ranges.\n *\n * @param {String} type Selection type which will be processed.\n * @param {Object} [options]\n * @param {Boolean} [options.keepDirection=false] If `true`, the coordinates which contain the direction of the\n *                                                selected cells won't be changed. Otherwise, the selection will be\n *                                                normalized to values starting from top-left to bottom-right.\n * @param {Function} [options.propToCol] Pass the converting function (usually `datamap.propToCol`) if the column\n *                                       defined as props should be normalized to the numeric values.\n * @returns {Number[]} Returns normalized data about selected range as an array (`[rowStart, columnStart, rowEnd, columnEnd]`).\n */\nfunction normalizeSelectionFactory(type) {\n  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref$keepDirection = _ref.keepDirection,\n      keepDirection = _ref$keepDirection === undefined ? false : _ref$keepDirection,\n      propToCol = _ref.propToCol;\n\n  if (!SELECTION_TYPES.includes(type)) {\n    throw new Error('Unsupported selection ranges schema type was provided.');\n  }\n\n  return function (selection) {\n    var isObjectType = type === SELECTION_TYPE_OBJECT;\n    var rowStart = isObjectType ? selection.from.row : selection[0];\n    var columnStart = isObjectType ? selection.from.col : selection[1];\n    var rowEnd = isObjectType ? selection.to.row : selection[2];\n    var columnEnd = isObjectType ? selection.to.col : selection[3];\n\n    if (typeof propToCol === 'function') {\n      if (typeof columnStart === 'string') {\n        columnStart = propToCol(columnStart);\n      }\n      if (typeof columnEnd === 'string') {\n        columnEnd = propToCol(columnEnd);\n      }\n    }\n\n    if ((0, _mixed.isUndefined)(rowEnd)) {\n      rowEnd = rowStart;\n    }\n    if ((0, _mixed.isUndefined)(columnEnd)) {\n      columnEnd = columnStart;\n    }\n\n    if (!keepDirection) {\n      var origRowStart = rowStart;\n      var origColumnStart = columnStart;\n      var origRowEnd = rowEnd;\n      var origColumnEnd = columnEnd;\n\n      rowStart = Math.min(origRowStart, origRowEnd);\n      columnStart = Math.min(origColumnStart, origColumnEnd);\n      rowEnd = Math.max(origRowStart, origRowEnd);\n      columnEnd = Math.max(origColumnStart, origColumnEnd);\n    }\n\n    return [rowStart, columnStart, rowEnd, columnEnd];\n  };\n}\n\n/**\n * Function transform selection ranges (produced by `hot.getSelected()` and `hot.getSelectedRange()`) to normalized\n * data structure. It merges repeated ranges into consecutive coordinates. The returned structure\n * contains an array of arrays. The single item contains at index 0 visual column index from the selection was\n * started and at index 1 distance as a count of selected columns.\n *\n * @param {Array[]|CellRange[]} selectionRanges Selection ranges produced by Handsontable.\n * @return {Array[]} Returns an array of arrays with ranges defines in that schema:\n *                   `[[visualColumnStart, distance], [visualColumnStart, distance], ...]`.\n *                   The column distances are always created starting from the left (zero index) to the\n *                   right (the latest column index).\n */\nfunction transformSelectionToColumnDistance(selectionRanges) {\n  var selectionType = detectSelectionType(selectionRanges);\n\n  if (selectionType === SELECTION_TYPE_UNRECOGNIZED || selectionType === SELECTION_TYPE_EMPTY) {\n    return [];\n  }\n\n  var selectionSchemaNormalizer = normalizeSelectionFactory(selectionType);\n  var unorderedIndexes = new Set();\n\n  // Iterate through all ranges and collect all column indexes which are not saved yet.\n  (0, _array.arrayEach)(selectionRanges, function (selection) {\n    var _selectionSchemaNorma = selectionSchemaNormalizer(selection),\n        _selectionSchemaNorma2 = _slicedToArray(_selectionSchemaNorma, 4),\n        columnStart = _selectionSchemaNorma2[1],\n        columnEnd = _selectionSchemaNorma2[3];\n\n    var amount = columnEnd - columnStart + 1;\n\n    (0, _array.arrayEach)(Array.from(new Array(amount), function (_, i) {\n      return columnStart + i;\n    }), function (index) {\n      if (!unorderedIndexes.has(index)) {\n        unorderedIndexes.add(index);\n      }\n    });\n  });\n\n  // Sort indexes in ascending order to easily detecting non-consecutive columns.\n  var orderedIndexes = Array.from(unorderedIndexes).sort(function (a, b) {\n    return a - b;\n  });\n  var normalizedColumnRanges = (0, _array.arrayReduce)(orderedIndexes, function (acc, visualColumnIndex, index, array) {\n    if (index !== 0 && visualColumnIndex === array[index - 1] + 1) {\n      acc[acc.length - 1][1]++;\n    } else {\n      acc.push([visualColumnIndex, 1]);\n    }\n\n    return acc;\n  }, []);\n\n  return normalizedColumnRanges;\n}\n\n/**\n * Function transform selection ranges (produced by `hot.getSelected()` and `hot.getSelectedRange()`) to normalized\n * data structure. It merges repeated ranges into consecutive coordinates. The returned structure\n * contains an array of arrays. The single item contains at index 0 visual column index from the selection was\n * started and at index 1 distance as a count of selected columns.\n *\n * @param {Array[]|CellRange[]} selectionRanges Selection ranges produced by Handsontable.\n * @return {Array[]} Returns an array of arrays with ranges defines in that schema:\n *                   `[[visualColumnStart, distance], [visualColumnStart, distance], ...]`.\n *                   The column distances are always created starting from the left (zero index) to the\n *                   right (the latest column index).\n */\nfunction transformSelectionToRowDistance(selectionRanges) {\n  var selectionType = detectSelectionType(selectionRanges);\n\n  if (selectionType === SELECTION_TYPE_UNRECOGNIZED || selectionType === SELECTION_TYPE_EMPTY) {\n    return [];\n  }\n\n  var selectionSchemaNormalizer = normalizeSelectionFactory(selectionType);\n  var unorderedIndexes = new Set();\n\n  // Iterate through all ranges and collect all column indexes which are not saved yet.\n  (0, _array.arrayEach)(selectionRanges, function (selection) {\n    var _selectionSchemaNorma3 = selectionSchemaNormalizer(selection),\n        _selectionSchemaNorma4 = _slicedToArray(_selectionSchemaNorma3, 3),\n        rowStart = _selectionSchemaNorma4[0],\n        rowEnd = _selectionSchemaNorma4[2];\n\n    var amount = rowEnd - rowStart + 1;\n\n    (0, _array.arrayEach)(Array.from(new Array(amount), function (_, i) {\n      return rowStart + i;\n    }), function (index) {\n      if (!unorderedIndexes.has(index)) {\n        unorderedIndexes.add(index);\n      }\n    });\n  });\n\n  // Sort indexes in ascending order to easily detecting non-consecutive columns.\n  var orderedIndexes = Array.from(unorderedIndexes).sort(function (a, b) {\n    return a - b;\n  });\n  var normalizedRowRanges = (0, _array.arrayReduce)(orderedIndexes, function (acc, rowIndex, index, array) {\n    if (index !== 0 && rowIndex === array[index - 1] + 1) {\n      acc[acc.length - 1][1]++;\n    } else {\n      acc.push([rowIndex, 1]);\n    }\n\n    return acc;\n  }, []);\n\n  return normalizedRowRanges;\n}\n\n/**\n * Check if passed value can be treated as valid cell coordinate. The second argument is\n * used to check if the value doesn't exceed the defined max table rows/columns count.\n *\n * @param {*} coord\n * @param {Number} maxTableItemsCount The value that declares the maximum coordinate that is still validatable.\n * @return {Boolean}\n */\nfunction isValidCoord(coord) {\n  var maxTableItemsCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Infinity;\n\n  return typeof coord === 'number' && coord >= 0 && coord < maxTableItemsCount;\n};\n\n/***/ }),\n/* 92 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class GhostTable\n * @util\n */\nvar GhostTable = function () {\n  function GhostTable(hotInstance) {\n    _classCallCheck(this, GhostTable);\n\n    /**\n     * Handsontable instance.\n     *\n     * @type {Core}\n     */\n    this.hot = hotInstance;\n    /**\n     * Container element where every table will be injected.\n     *\n     * @type {HTMLElement|null}\n     */\n    this.container = null;\n    /**\n     * Flag which determine is table was injected to DOM.\n     *\n     * @type {Boolean}\n     */\n    this.injected = false;\n    /**\n     * Added rows collection.\n     *\n     * @type {Array}\n     */\n    this.rows = [];\n    /**\n     * Added columns collection.\n     *\n     * @type {Array}\n     */\n    this.columns = [];\n    /**\n     * Samples prepared for calculations.\n     *\n     * @type {Map}\n     * @default {null}\n     */\n    this.samples = null;\n    /**\n     * Ghost table settings.\n     *\n     * @type {Object}\n     * @default {Object}\n     */\n    this.settings = {\n      useHeaders: true\n    };\n  }\n\n  /**\n   * Add row.\n   *\n   * @param {Number} row Row index.\n   * @param {Map} samples Samples Map object.\n   */\n\n\n  _createClass(GhostTable, [{\n    key: 'addRow',\n    value: function addRow(row, samples) {\n      if (this.columns.length) {\n        throw new Error('Doesn\\'t support multi-dimensional table');\n      }\n      if (!this.rows.length) {\n        this.container = this.createContainer(this.hot.rootElement.className);\n      }\n      var rowObject = { row: row };\n      this.rows.push(rowObject);\n\n      this.samples = samples;\n      this.table = this.createTable(this.hot.table.className);\n      this.table.colGroup.appendChild(this.createColGroupsCol());\n      this.table.tr.appendChild(this.createRow(row));\n      this.container.container.appendChild(this.table.fragment);\n\n      rowObject.table = this.table.table;\n    }\n\n    /**\n     * Add a row consisting of the column headers.\n     */\n\n  }, {\n    key: 'addColumnHeadersRow',\n    value: function addColumnHeadersRow(samples) {\n      if (this.hot.getColHeader(0) != null) {\n        var rowObject = { row: -1 };\n        this.rows.push(rowObject);\n\n        this.container = this.createContainer(this.hot.rootElement.className);\n\n        this.samples = samples;\n        this.table = this.createTable(this.hot.table.className);\n        this.table.colGroup.appendChild(this.createColGroupsCol());\n        this.table.tHead.appendChild(this.createColumnHeadersRow());\n        this.container.container.appendChild(this.table.fragment);\n\n        rowObject.table = this.table.table;\n      }\n    }\n\n    /**\n     * Add column.\n     *\n     * @param {Number} column Column index.\n     * @param {Map} samples Samples Map object.\n     */\n\n  }, {\n    key: 'addColumn',\n    value: function addColumn(column, samples) {\n      if (this.rows.length) {\n        throw new Error('Doesn\\'t support multi-dimensional table');\n      }\n      if (!this.columns.length) {\n        this.container = this.createContainer(this.hot.rootElement.className);\n      }\n      var columnObject = { col: column };\n      this.columns.push(columnObject);\n\n      this.samples = samples;\n      this.table = this.createTable(this.hot.table.className);\n\n      if (this.getSetting('useHeaders') && this.hot.getColHeader(column) !== null) {\n        this.hot.view.appendColHeader(column, this.table.th);\n      }\n      this.table.tBody.appendChild(this.createCol(column));\n      this.container.container.appendChild(this.table.fragment);\n\n      columnObject.table = this.table.table;\n    }\n\n    /**\n     * Get calculated heights.\n     *\n     * @param {Function} callback Callback which will be fired for each calculated row.\n     */\n\n  }, {\n    key: 'getHeights',\n    value: function getHeights(callback) {\n      if (!this.injected) {\n        this.injectTable();\n      }\n      (0, _array.arrayEach)(this.rows, function (row) {\n        // -1 <- reduce border-top from table\n        callback(row.row, (0, _element.outerHeight)(row.table) - 1);\n      });\n    }\n\n    /**\n     * Get calculated widths.\n     *\n     * @param {Function} callback Callback which will be fired for each calculated column.\n     */\n\n  }, {\n    key: 'getWidths',\n    value: function getWidths(callback) {\n      if (!this.injected) {\n        this.injectTable();\n      }\n      (0, _array.arrayEach)(this.columns, function (column) {\n        callback(column.col, (0, _element.outerWidth)(column.table));\n      });\n    }\n\n    /**\n     * Set the Ghost Table settings to the provided object.\n     *\n     * @param {Object} settings New Ghost Table Settings\n     */\n\n  }, {\n    key: 'setSettings',\n    value: function setSettings(settings) {\n      this.settings = settings;\n    }\n\n    /**\n     * Set a single setting of the Ghost Table.\n     *\n     * @param {String} name Setting name.\n     * @param {*} value Setting value.\n     */\n\n  }, {\n    key: 'setSetting',\n    value: function setSetting(name, value) {\n      if (!this.settings) {\n        this.settings = {};\n      }\n\n      this.settings[name] = value;\n    }\n\n    /**\n     * Get the Ghost Table settings.\n     *\n     * @returns {Object|null}\n     */\n\n  }, {\n    key: 'getSettings',\n    value: function getSettings() {\n      return this.settings;\n    }\n\n    /**\n     * Get a single Ghost Table setting.\n     *\n     * @param {String} name\n     * @returns {Boolean|null}\n     */\n\n  }, {\n    key: 'getSetting',\n    value: function getSetting(name) {\n      if (this.settings) {\n        return this.settings[name];\n      }\n      return null;\n    }\n\n    /**\n     * Create colgroup col elements.\n     *\n     * @returns {DocumentFragment}\n     */\n\n  }, {\n    key: 'createColGroupsCol',\n    value: function createColGroupsCol() {\n      var _this = this;\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n\n      if (this.hot.hasRowHeaders()) {\n        fragment.appendChild(this.createColElement(-1));\n      }\n\n      this.samples.forEach(function (sample) {\n        (0, _array.arrayEach)(sample.strings, function (string) {\n          fragment.appendChild(_this.createColElement(string.col));\n        });\n      });\n\n      return fragment;\n    }\n\n    /**\n     * Create table row element.\n     *\n     * @param {Number} row Row index.\n     * @returns {DocumentFragment} Returns created table row elements.\n     */\n\n  }, {\n    key: 'createRow',\n    value: function createRow(row) {\n      var _this2 = this;\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n      var th = d.createElement('th');\n\n      if (this.hot.hasRowHeaders()) {\n        this.hot.view.appendRowHeader(row, th);\n\n        fragment.appendChild(th);\n      }\n\n      this.samples.forEach(function (sample) {\n        (0, _array.arrayEach)(sample.strings, function (string) {\n          var column = string.col;\n          var cellProperties = _this2.hot.getCellMeta(row, column);\n\n          cellProperties.col = column;\n          cellProperties.row = row;\n\n          var renderer = _this2.hot.getCellRenderer(cellProperties);\n          var td = d.createElement('td');\n\n          renderer(_this2.hot, td, row, column, _this2.hot.colToProp(column), string.value, cellProperties);\n          fragment.appendChild(td);\n        });\n      });\n\n      return fragment;\n    }\n  }, {\n    key: 'createColumnHeadersRow',\n    value: function createColumnHeadersRow() {\n      var _this3 = this;\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n\n      if (this.hot.hasRowHeaders()) {\n        var th = d.createElement('th');\n        this.hot.view.appendColHeader(-1, th);\n        fragment.appendChild(th);\n      }\n\n      this.samples.forEach(function (sample) {\n        (0, _array.arrayEach)(sample.strings, function (string) {\n          var column = string.col;\n\n          var th = d.createElement('th');\n\n          _this3.hot.view.appendColHeader(column, th);\n          fragment.appendChild(th);\n        });\n      });\n\n      return fragment;\n    }\n\n    /**\n     * Create table column elements.\n     *\n     * @param {Number} column Column index.\n     * @returns {DocumentFragment} Returns created column table column elements.\n     */\n\n  }, {\n    key: 'createCol',\n    value: function createCol(column) {\n      var _this4 = this;\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n\n      this.samples.forEach(function (sample) {\n        (0, _array.arrayEach)(sample.strings, function (string) {\n          var row = string.row;\n          var cellProperties = _this4.hot.getCellMeta(row, column);\n\n          cellProperties.col = column;\n          cellProperties.row = row;\n\n          var renderer = _this4.hot.getCellRenderer(cellProperties);\n          var td = d.createElement('td');\n          var tr = d.createElement('tr');\n\n          renderer(_this4.hot, td, row, column, _this4.hot.colToProp(column), string.value, cellProperties);\n          tr.appendChild(td);\n          fragment.appendChild(tr);\n        });\n      });\n\n      return fragment;\n    }\n\n    /**\n     * Remove table from document and reset internal state.\n     */\n\n  }, {\n    key: 'clean',\n    value: function clean() {\n      this.rows.length = 0;\n      this.rows[-1] = void 0;\n      this.columns.length = 0;\n\n      if (this.samples) {\n        this.samples.clear();\n      }\n      this.samples = null;\n      this.removeTable();\n    }\n\n    /**\n     * Inject generated table into document.\n     *\n     * @param {HTMLElement} [parent=null]\n     */\n\n  }, {\n    key: 'injectTable',\n    value: function injectTable() {\n      var parent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      if (!this.injected) {\n        (parent || this.hot.rootElement).appendChild(this.container.fragment);\n        this.injected = true;\n      }\n    }\n\n    /**\n     * Remove table from document.\n     */\n\n  }, {\n    key: 'removeTable',\n    value: function removeTable() {\n      if (this.injected && this.container.container.parentNode) {\n        this.container.container.parentNode.removeChild(this.container.container);\n        this.container = null;\n        this.injected = false;\n      }\n    }\n\n    /**\n     * Create col element.\n     *\n     * @param {Number} column Column index.\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createColElement',\n    value: function createColElement(column) {\n      var d = document;\n      var col = d.createElement('col');\n\n      col.style.width = this.hot.view.wt.wtTable.getStretchedColumnWidth(column) + 'px';\n\n      return col;\n    }\n\n    /**\n     * Create table element.\n     *\n     * @param {String} className\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'createTable',\n    value: function createTable() {\n      var className = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n      var table = d.createElement('table');\n      var tHead = d.createElement('thead');\n      var tBody = d.createElement('tbody');\n      var colGroup = d.createElement('colgroup');\n      var tr = d.createElement('tr');\n      var th = d.createElement('th');\n\n      if (this.isVertical()) {\n        table.appendChild(colGroup);\n      }\n      if (this.isHorizontal()) {\n        tr.appendChild(th);\n        tHead.appendChild(tr);\n        table.style.tableLayout = 'auto';\n        table.style.width = 'auto';\n      }\n      table.appendChild(tHead);\n\n      if (this.isVertical()) {\n        tBody.appendChild(tr);\n      }\n      table.appendChild(tBody);\n      (0, _element.addClass)(table, className);\n      fragment.appendChild(table);\n\n      return { fragment: fragment, table: table, tHead: tHead, tBody: tBody, colGroup: colGroup, tr: tr, th: th };\n    }\n\n    /**\n     * Create container for tables.\n     *\n     * @param {String} className\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'createContainer',\n    value: function createContainer() {\n      var className = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n      var container = d.createElement('div');\n\n      className = 'htGhostTable htAutoSize ' + className.trim();\n      (0, _element.addClass)(container, className);\n      fragment.appendChild(container);\n\n      return { fragment: fragment, container: container };\n    }\n\n    /**\n     * Checks if table is raised vertically (checking rows).\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isVertical',\n    value: function isVertical() {\n      return !!(this.rows.length && !this.columns.length);\n    }\n\n    /**\n     * Checks if table is raised horizontally (checking columns).\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isHorizontal',\n    value: function isHorizontal() {\n      return !!(this.columns.length && !this.rows.length);\n    }\n  }]);\n\n  return GhostTable;\n}();\n\nexports.default = GhostTable;\n\n/***/ }),\n/* 93 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = separatorItem;\nvar KEY = exports.KEY = '---------';\n\nfunction separatorItem() {\n  return {\n    name: KEY\n  };\n}\n\n/***/ }),\n/* 94 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.ITEMS = exports.UNDO = exports.SEPARATOR = exports.ROW_BELOW = exports.ROW_ABOVE = exports.REMOVE_ROW = exports.REMOVE_COLUMN = exports.REDO = exports.READ_ONLY = exports.COLUMN_RIGHT = exports.COLUMN_LEFT = exports.CLEAR_COLUMN = exports.ALIGNMENT = undefined;\n\nvar _predefinedItems2;\n\nvar _alignment = __webpack_require__(422);\n\nObject.defineProperty(exports, 'ALIGNMENT', {\n  enumerable: true,\n  get: function get() {\n    return _alignment.KEY;\n  }\n});\n\nvar _clearColumn = __webpack_require__(423);\n\nObject.defineProperty(exports, 'CLEAR_COLUMN', {\n  enumerable: true,\n  get: function get() {\n    return _clearColumn.KEY;\n  }\n});\n\nvar _columnLeft = __webpack_require__(424);\n\nObject.defineProperty(exports, 'COLUMN_LEFT', {\n  enumerable: true,\n  get: function get() {\n    return _columnLeft.KEY;\n  }\n});\n\nvar _columnRight = __webpack_require__(425);\n\nObject.defineProperty(exports, 'COLUMN_RIGHT', {\n  enumerable: true,\n  get: function get() {\n    return _columnRight.KEY;\n  }\n});\n\nvar _readOnly = __webpack_require__(426);\n\nObject.defineProperty(exports, 'READ_ONLY', {\n  enumerable: true,\n  get: function get() {\n    return _readOnly.KEY;\n  }\n});\n\nvar _redo = __webpack_require__(427);\n\nObject.defineProperty(exports, 'REDO', {\n  enumerable: true,\n  get: function get() {\n    return _redo.KEY;\n  }\n});\n\nvar _removeColumn = __webpack_require__(428);\n\nObject.defineProperty(exports, 'REMOVE_COLUMN', {\n  enumerable: true,\n  get: function get() {\n    return _removeColumn.KEY;\n  }\n});\n\nvar _removeRow = __webpack_require__(429);\n\nObject.defineProperty(exports, 'REMOVE_ROW', {\n  enumerable: true,\n  get: function get() {\n    return _removeRow.KEY;\n  }\n});\n\nvar _rowAbove = __webpack_require__(430);\n\nObject.defineProperty(exports, 'ROW_ABOVE', {\n  enumerable: true,\n  get: function get() {\n    return _rowAbove.KEY;\n  }\n});\n\nvar _rowBelow = __webpack_require__(431);\n\nObject.defineProperty(exports, 'ROW_BELOW', {\n  enumerable: true,\n  get: function get() {\n    return _rowBelow.KEY;\n  }\n});\n\nvar _separator = __webpack_require__(93);\n\nObject.defineProperty(exports, 'SEPARATOR', {\n  enumerable: true,\n  get: function get() {\n    return _separator.KEY;\n  }\n});\n\nvar _undo = __webpack_require__(432);\n\nObject.defineProperty(exports, 'UNDO', {\n  enumerable: true,\n  get: function get() {\n    return _undo.KEY;\n  }\n});\nexports.predefinedItems = predefinedItems;\nexports.addItem = addItem;\n\nvar _object = __webpack_require__(2);\n\nvar _alignment2 = _interopRequireDefault(_alignment);\n\nvar _clearColumn2 = _interopRequireDefault(_clearColumn);\n\nvar _columnLeft2 = _interopRequireDefault(_columnLeft);\n\nvar _columnRight2 = _interopRequireDefault(_columnRight);\n\nvar _readOnly2 = _interopRequireDefault(_readOnly);\n\nvar _redo2 = _interopRequireDefault(_redo);\n\nvar _removeColumn2 = _interopRequireDefault(_removeColumn);\n\nvar _removeRow2 = _interopRequireDefault(_removeRow);\n\nvar _rowAbove2 = _interopRequireDefault(_rowAbove);\n\nvar _rowBelow2 = _interopRequireDefault(_rowBelow);\n\nvar _separator2 = _interopRequireDefault(_separator);\n\nvar _undo2 = _interopRequireDefault(_undo);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar ITEMS = exports.ITEMS = [_rowAbove.KEY, _rowBelow.KEY, _columnLeft.KEY, _columnRight.KEY, _clearColumn.KEY, _removeRow.KEY, _removeColumn.KEY, _undo.KEY, _redo.KEY, _readOnly.KEY, _alignment.KEY, _separator.KEY];\n\nvar _predefinedItems = (_predefinedItems2 = {}, _defineProperty(_predefinedItems2, _separator.KEY, _separator2.default), _defineProperty(_predefinedItems2, _rowAbove.KEY, _rowAbove2.default), _defineProperty(_predefinedItems2, _rowBelow.KEY, _rowBelow2.default), _defineProperty(_predefinedItems2, _columnLeft.KEY, _columnLeft2.default), _defineProperty(_predefinedItems2, _columnRight.KEY, _columnRight2.default), _defineProperty(_predefinedItems2, _clearColumn.KEY, _clearColumn2.default), _defineProperty(_predefinedItems2, _removeRow.KEY, _removeRow2.default), _defineProperty(_predefinedItems2, _removeColumn.KEY, _removeColumn2.default), _defineProperty(_predefinedItems2, _undo.KEY, _undo2.default), _defineProperty(_predefinedItems2, _redo.KEY, _redo2.default), _defineProperty(_predefinedItems2, _readOnly.KEY, _readOnly2.default), _defineProperty(_predefinedItems2, _alignment.KEY, _alignment2.default), _predefinedItems2);\n\n/**\n * Gets new object with all predefined menu items.\n *\n * @returns {Object}\n */\nfunction predefinedItems() {\n  var items = {};\n\n  (0, _object.objectEach)(_predefinedItems, function (itemFactory, key) {\n    items[key] = itemFactory();\n  });\n\n  return items;\n}\n\n/**\n * Add new predefined menu item to the collection.\n *\n * @param {String} key Menu command id.\n * @param {Object} item Object command descriptor.\n */\nfunction addItem(key, item) {\n  if (ITEMS.indexOf(key) === -1) {\n    _predefinedItems[key] = item;\n  }\n}\n\n/***/ }),\n/* 95 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['The merged cell declared with {row: ', ', col: ', ', rowspan: \\n    ', ', colspan: ', '} contains negative values, which is not supported. It \\n    will not be added to the collection.'], ['The merged cell declared with {row: ', ', col: ', ', rowspan: \\n    ', ', colspan: ', '} contains negative values, which is not supported. It \\n    will not be added to the collection.']),\n    _templateObject2 = _taggedTemplateLiteral(['The merged cell declared at [', ', ', '] is positioned (or positioned partially) \\n       outside of the table range. It was not added to the table, please fix your setup.'], ['The merged cell declared at [', ', ', '] is positioned (or positioned partially) \\n       outside of the table range. It was not added to the table, please fix your setup.']),\n    _templateObject3 = _taggedTemplateLiteral(['The merged cell declared at [', ', ', '] has both \"rowspan\" \\n     and \"colspan\" declared as \"1\", which makes it a single cell. It cannot be added to the collection.'], ['The merged cell declared at [', ', ', '] has both \"rowspan\" \\n     and \"colspan\" declared as \"1\", which makes it a single cell. It cannot be added to the collection.']),\n    _templateObject4 = _taggedTemplateLiteral(['The merged cell declared at [', ', ', '] has \"rowspan\" or \"colspan\" declared as \\n      \"0\", which is not supported. It cannot be added to the collection.'], ['The merged cell declared at [', ', ', '] has \"rowspan\" or \"colspan\" declared as \\n      \"0\", which is not supported. It cannot be added to the collection.']);\n\nvar _index = __webpack_require__(4);\n\nvar _templateLiteralTag = __webpack_require__(42);\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * The `MergedCellCoords` class represents a single merged cell.\n *\n * @class MergedCellCoords\n * @plugin MergeCells\n */\nvar MergedCellCoords = function () {\n  function MergedCellCoords(row, column, rowspan, colspan) {\n    _classCallCheck(this, MergedCellCoords);\n\n    /**\n     * The index of the topmost merged cell row.\n     *\n     * @type {Number}\n     */\n    this.row = row;\n    /**\n     * The index of the leftmost column.\n     *\n     * @type {Number}\n     */\n    this.col = column;\n    /**\n     * The `rowspan` value of the merged cell.\n     *\n     * @type {Number}\n     */\n    this.rowspan = rowspan;\n    /**\n     * The `colspan` value of the merged cell.\n     *\n     * @type {Number}\n     */\n    this.colspan = colspan;\n    /**\n     * `true` only if the merged cell is bound to be removed.\n     *\n     * @type {Boolean}\n     */\n    this.removed = false;\n  }\n\n  /**\n   * Get a warning message for when the declared merged cell data contains negative values.\n   *\n   * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n   * @return {String}\n   */\n\n\n  _createClass(MergedCellCoords, [{\n    key: 'normalize',\n\n\n    /**\n     * Sanitize (prevent from going outside the boundaries) the merged cell.\n     *\n     * @param hotInstance\n     */\n    value: function normalize(hotInstance) {\n      var totalRows = hotInstance.countRows();\n      var totalColumns = hotInstance.countCols();\n\n      if (this.row < 0) {\n        this.row = 0;\n      } else if (this.row > totalRows - 1) {\n        this.row = totalRows - 1;\n      }\n\n      if (this.col < 0) {\n        this.col = 0;\n      } else if (this.col > totalColumns - 1) {\n        this.col = totalColumns - 1;\n      }\n\n      if (this.row + this.rowspan > totalRows - 1) {\n        this.rowspan = totalRows - this.row;\n      }\n\n      if (this.col + this.colspan > totalColumns - 1) {\n        this.colspan = totalColumns - this.col;\n      }\n    }\n\n    /**\n     * Returns `true` if the provided coordinates are inside the merged cell.\n     *\n     * @param {Number} row The row index.\n     * @param {Number} column The column index.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'includes',\n    value: function includes(row, column) {\n      return this.row <= row && this.col <= column && this.row + this.rowspan - 1 >= row && this.col + this.colspan - 1 >= column;\n    }\n\n    /**\n     * Returns `true` if the provided `column` property is within the column span of the merged cell.\n     *\n     * @param {Number} column The column index.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'includesHorizontally',\n    value: function includesHorizontally(column) {\n      return this.col <= column && this.col + this.colspan - 1 >= column;\n    }\n\n    /**\n     * Returns `true` if the provided `row` property is within the row span of the merged cell.\n     *\n     * @param {Number} row Row index.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'includesVertically',\n    value: function includesVertically(row) {\n      return this.row <= row && this.row + this.rowspan - 1 >= row;\n    }\n\n    /**\n     * Shift (and possibly resize, if needed) the merged cell.\n     *\n     * @param {Array} shiftVector 2-element array containing the information on the shifting in the `x` and `y` axis.\n     * @param {Number} indexOfChange Index of the preceding change.\n     * @returns {Boolean} Returns `false` if the whole merged cell was removed.\n     */\n\n  }, {\n    key: 'shift',\n    value: function shift(shiftVector, indexOfChange) {\n      var shiftValue = shiftVector[0] || shiftVector[1];\n      var shiftedIndex = indexOfChange + Math.abs(shiftVector[0] || shiftVector[1]) - 1;\n      var span = shiftVector[0] ? 'colspan' : 'rowspan';\n      var index = shiftVector[0] ? 'col' : 'row';\n      var changeStart = Math.min(indexOfChange, shiftedIndex);\n      var changeEnd = Math.max(indexOfChange, shiftedIndex);\n      var mergeStart = this[index];\n      var mergeEnd = this[index] + this[span] - 1;\n\n      if (mergeStart >= indexOfChange) {\n        this[index] += shiftValue;\n      }\n\n      // adding rows/columns\n      if (shiftValue > 0) {\n        if (indexOfChange <= mergeEnd && indexOfChange > mergeStart) {\n          this[span] += shiftValue;\n        }\n\n        // removing rows/columns\n      } else if (shiftValue < 0) {\n\n        // removing the whole merge\n        if (changeStart <= mergeStart && changeEnd >= mergeEnd) {\n          this.removed = true;\n          return false;\n\n          // removing the merge partially, including the beginning\n        } else if (mergeStart >= changeStart && mergeStart <= changeEnd) {\n          var removedOffset = changeEnd - mergeStart + 1;\n          var preRemovedOffset = Math.abs(shiftValue) - removedOffset;\n\n          this[index] -= preRemovedOffset + shiftValue;\n          this[span] -= removedOffset;\n\n          // removing the middle part of the merge\n        } else if (mergeStart <= changeStart && mergeEnd >= changeEnd) {\n          this[span] += shiftValue;\n\n          // removing the end part of the merge\n        } else if (mergeStart <= changeStart && mergeEnd >= changeStart && mergeEnd < changeEnd) {\n          var removedPart = mergeEnd - changeStart + 1;\n\n          this[span] -= removedPart;\n        }\n      }\n\n      return true;\n    }\n\n    /**\n     * Check if the second provided merged cell is \"farther\" in the provided direction.\n     *\n     * @param {MergedCellCoords} mergedCell The merged cell to check.\n     * @param {String} direction Drag direction.\n     * @return {Boolean|null} `true` if the second provided merged cell is \"farther\".\n     */\n\n  }, {\n    key: 'isFarther',\n    value: function isFarther(mergedCell, direction) {\n      if (!mergedCell) {\n        return true;\n      }\n\n      if (direction === 'down') {\n        return mergedCell.row + mergedCell.rowspan - 1 < this.row + this.rowspan - 1;\n      } else if (direction === 'up') {\n        return mergedCell.row > this.row;\n      } else if (direction === 'right') {\n        return mergedCell.col + mergedCell.colspan - 1 < this.col + this.colspan - 1;\n      } else if (direction === 'left') {\n        return mergedCell.col > this.col;\n      }\n      return null;\n    }\n\n    /**\n     * Get the bottom row index of the merged cell.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getLastRow',\n    value: function getLastRow() {\n      return this.row + this.rowspan - 1;\n    }\n\n    /**\n     * Get the rightmost column index of the merged cell.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getLastColumn',\n    value: function getLastColumn() {\n      return this.col + this.colspan - 1;\n    }\n\n    /**\n     * Get the range coordinates of the merged cell.\n     *\n     * @return {CellRange}\n     */\n\n  }, {\n    key: 'getRange',\n    value: function getRange() {\n      return new _index.CellRange(new _index.CellCoords(this.row, this.col), new _index.CellCoords(this.row, this.col), new _index.CellCoords(this.getLastRow(), this.getLastColumn()));\n    }\n  }], [{\n    key: 'NEGATIVE_VALUES_WARNING',\n    value: function NEGATIVE_VALUES_WARNING(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject, newMergedCell.row, newMergedCell.col, newMergedCell.rowspan, newMergedCell.colspan);\n    }\n\n    /**\n     * Get a warning message for when the declared merged cell data contains values exceeding the table limits.\n     *\n     * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n     * @return {String}\n     */\n\n  }, {\n    key: 'IS_OUT_OF_BOUNDS_WARNING',\n    value: function IS_OUT_OF_BOUNDS_WARNING(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject2, newMergedCell.row, newMergedCell.col);\n    }\n\n    /**\n     * Get a warning message for when the declared merged cell data represents a single cell.\n     *\n     * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n     * @return {String}\n     */\n\n  }, {\n    key: 'IS_SINGLE_CELL',\n    value: function IS_SINGLE_CELL(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject3, newMergedCell.row, newMergedCell.col);\n    }\n\n    /**\n     * Get a warning message for when the declared merged cell data contains \"colspan\" or \"rowspan\", that equals 0.\n     *\n     * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n     * @return {String}\n     */\n\n  }, {\n    key: 'ZERO_SPAN_WARNING',\n    value: function ZERO_SPAN_WARNING(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject4, newMergedCell.row, newMergedCell.col);\n    }\n\n    /**\n     * Check whether the values provided for a merged cell contain any negative values.\n     *\n     * @param {Object} mergedCellInfo Object containing the `row`, `col`, `rowspan` and `colspan` properties.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'containsNegativeValues',\n    value: function containsNegativeValues(mergedCellInfo) {\n      return mergedCellInfo.row < 0 || mergedCellInfo.col < 0 || mergedCellInfo.rowspan < 0 || mergedCellInfo.colspan < 0;\n    }\n\n    /**\n     * Check whether the provided merged cell information object represents a single cell.\n     *\n     * @private\n     * @param {Object} mergedCellInfo An object with `row`, `col`, `rowspan` and `colspan` properties.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSingleCell',\n    value: function isSingleCell(mergedCellInfo) {\n      return mergedCellInfo.colspan === 1 && mergedCellInfo.rowspan === 1;\n    }\n\n    /**\n     * Check whether the provided merged cell information object contains a rowspan or colspan of 0.\n     *\n     * @private\n     * @param {Object} mergedCellInfo An object with `row`, `col`, `rowspan` and `colspan` properties.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'containsZeroSpan',\n    value: function containsZeroSpan(mergedCellInfo) {\n      return mergedCellInfo.colspan === 0 || mergedCellInfo.rowspan === 0;\n    }\n\n    /**\n     * Check whether the provided merged cell object is to be declared out of bounds of the table.\n     *\n     * @param {Object} mergeCell Object containing the `row`, `col`, `rowspan` and `colspan` properties.\n     * @param {Number} rowCount Number of rows in the table.\n     * @param {Number} columnCount Number of rows in the table.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isOutOfBounds',\n    value: function isOutOfBounds(mergeCell, rowCount, columnCount) {\n      return mergeCell.row < 0 || mergeCell.col < 0 || mergeCell.row >= rowCount || mergeCell.row + mergeCell.rowspan - 1 >= rowCount || mergeCell.col >= columnCount || mergeCell.col + mergeCell.colspan - 1 >= columnCount;\n    }\n  }]);\n\n  return MergedCellCoords;\n}();\n\nexports.default = MergedCellCoords;\n\n/***/ }),\n/* 96 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar strong = __webpack_require__(97);\nvar validate = __webpack_require__(46);\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = __webpack_require__(66)(MAP, function (get) {\n  return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.1.3.6 Map.prototype.get(key)\n  get: function get(key) {\n    var entry = strong.getEntry(validate(this, MAP), key);\n    return entry && entry.v;\n  },\n  // 23.1.3.9 Map.prototype.set(key, value)\n  set: function set(key, value) {\n    return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n  }\n}, strong, true);\n\n\n/***/ }),\n/* 97 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar dP = __webpack_require__(20).f;\nvar create = __webpack_require__(74);\nvar redefineAll = __webpack_require__(61);\nvar ctx = __webpack_require__(32);\nvar anInstance = __webpack_require__(63);\nvar forOf = __webpack_require__(64);\nvar $iterDefine = __webpack_require__(106);\nvar step = __webpack_require__(108);\nvar setSpecies = __webpack_require__(109);\nvar DESCRIPTORS = __webpack_require__(22);\nvar fastKey = __webpack_require__(34).fastKey;\nvar validate = __webpack_require__(46);\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n  // fast case\n  var index = fastKey(key);\n  var entry;\n  if (index !== 'F') return that._i[index];\n  // frozen object case\n  for (entry = that._f; entry; entry = entry.n) {\n    if (entry.k == key) return entry;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      anInstance(that, C, NAME, '_i');\n      that._t = NAME;         // collection type\n      that._i = create(null); // index\n      that._f = undefined;    // first entry\n      that._l = undefined;    // last entry\n      that[SIZE] = 0;         // size\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.1.3.1 Map.prototype.clear()\n      // 23.2.3.2 Set.prototype.clear()\n      clear: function clear() {\n        for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n          entry.r = true;\n          if (entry.p) entry.p = entry.p.n = undefined;\n          delete data[entry.i];\n        }\n        that._f = that._l = undefined;\n        that[SIZE] = 0;\n      },\n      // 23.1.3.3 Map.prototype.delete(key)\n      // 23.2.3.4 Set.prototype.delete(value)\n      'delete': function (key) {\n        var that = validate(this, NAME);\n        var entry = getEntry(that, key);\n        if (entry) {\n          var next = entry.n;\n          var prev = entry.p;\n          delete that._i[entry.i];\n          entry.r = true;\n          if (prev) prev.n = next;\n          if (next) next.p = prev;\n          if (that._f == entry) that._f = next;\n          if (that._l == entry) that._l = prev;\n          that[SIZE]--;\n        } return !!entry;\n      },\n      // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n      // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n      forEach: function forEach(callbackfn /* , that = undefined */) {\n        validate(this, NAME);\n        var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n        var entry;\n        while (entry = entry ? entry.n : this._f) {\n          f(entry.v, entry.k, this);\n          // revert to the last existing entry\n          while (entry && entry.r) entry = entry.p;\n        }\n      },\n      // 23.1.3.7 Map.prototype.has(key)\n      // 23.2.3.7 Set.prototype.has(value)\n      has: function has(key) {\n        return !!getEntry(validate(this, NAME), key);\n      }\n    });\n    if (DESCRIPTORS) dP(C.prototype, 'size', {\n      get: function () {\n        return validate(this, NAME)[SIZE];\n      }\n    });\n    return C;\n  },\n  def: function (that, key, value) {\n    var entry = getEntry(that, key);\n    var prev, index;\n    // change existing entry\n    if (entry) {\n      entry.v = value;\n    // create new entry\n    } else {\n      that._l = entry = {\n        i: index = fastKey(key, true), // <- index\n        k: key,                        // <- key\n        v: value,                      // <- value\n        p: prev = that._l,             // <- previous entry\n        n: undefined,                  // <- next entry\n        r: false                       // <- removed\n      };\n      if (!that._f) that._f = entry;\n      if (prev) prev.n = entry;\n      that[SIZE]++;\n      // add to index\n      if (index !== 'F') that._i[index] = entry;\n    } return that;\n  },\n  getEntry: getEntry,\n  setStrong: function (C, NAME, IS_MAP) {\n    // add .keys, .values, .entries, [@@iterator]\n    // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n    $iterDefine(C, NAME, function (iterated, kind) {\n      this._t = validate(iterated, NAME); // target\n      this._k = kind;                     // kind\n      this._l = undefined;                // previous\n    }, function () {\n      var that = this;\n      var kind = that._k;\n      var entry = that._l;\n      // revert to the last existing entry\n      while (entry && entry.r) entry = entry.p;\n      // get next entry\n      if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n        // or finish the iteration\n        that._t = undefined;\n        return step(1);\n      }\n      // return step by kind\n      if (kind == 'keys') return step(0, entry.k);\n      if (kind == 'values') return step(0, entry.v);\n      return step(0, [entry.k, entry.v]);\n    }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n    // add [@@species], 23.1.2.2, 23.2.2.2\n    setSpecies(NAME);\n  }\n};\n\n\n/***/ }),\n/* 98 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = !__webpack_require__(22) && !__webpack_require__(23)(function () {\n  return Object.defineProperty(__webpack_require__(72)('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n/* 99 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar has = __webpack_require__(29);\nvar toIObject = __webpack_require__(24);\nvar arrayIndexOf = __webpack_require__(100)(false);\nvar IE_PROTO = __webpack_require__(76)('IE_PROTO');\n\nmodule.exports = function (object, names) {\n  var O = toIObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (has(O, key = names[i++])) {\n    ~arrayIndexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n\n\n/***/ }),\n/* 100 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = __webpack_require__(24);\nvar toLength = __webpack_require__(25);\nvar toAbsoluteIndex = __webpack_require__(60);\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIObject($this);\n    var length = toLength(O.length);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n      if (O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n\n\n/***/ }),\n/* 101 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar document = __webpack_require__(14).document;\nmodule.exports = document && document.documentElement;\n\n\n/***/ }),\n/* 102 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// call something on iterator step with safe closing on error\nvar anObject = __webpack_require__(18);\nmodule.exports = function (iterator, fn, value, entries) {\n  try {\n    return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n  // 7.4.6 IteratorClose(iterator, completion)\n  } catch (e) {\n    var ret = iterator['return'];\n    if (ret !== undefined) anObject(ret.call(iterator));\n    throw e;\n  }\n};\n\n\n/***/ }),\n/* 103 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// check on default Array iterator\nvar Iterators = __webpack_require__(51);\nvar ITERATOR = __webpack_require__(11)('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n\n\n/***/ }),\n/* 104 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar classof = __webpack_require__(105);\nvar ITERATOR = __webpack_require__(11)('iterator');\nvar Iterators = __webpack_require__(51);\nmodule.exports = __webpack_require__(45).getIteratorMethod = function (it) {\n  if (it != undefined) return it[ITERATOR]\n    || it['@@iterator']\n    || Iterators[classof(it)];\n};\n\n\n/***/ }),\n/* 105 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(44);\nvar TAG = __webpack_require__(11)('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n    // builtinTag case\n    : ARG ? cof(O)\n    // ES3 arguments fallback\n    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\n\n/***/ }),\n/* 106 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(65);\nvar $export = __webpack_require__(3);\nvar redefine = __webpack_require__(30);\nvar hide = __webpack_require__(31);\nvar Iterators = __webpack_require__(51);\nvar $iterCreate = __webpack_require__(328);\nvar setToStringTag = __webpack_require__(52);\nvar getPrototypeOf = __webpack_require__(107);\nvar ITERATOR = __webpack_require__(11)('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function (kind) {\n    if (!BUGGY && kind in proto) return proto[kind];\n    switch (kind) {\n      case KEYS: return function keys() { return new Constructor(this, kind); };\n      case VALUES: return function values() { return new Constructor(this, kind); };\n    } return function entries() { return new Constructor(this, kind); };\n  };\n  var TAG = NAME + ' Iterator';\n  var DEF_VALUES = DEFAULT == VALUES;\n  var VALUES_BUG = false;\n  var proto = Base.prototype;\n  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n  var $default = $native || getMethod(DEFAULT);\n  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n  var methods, key, IteratorPrototype;\n  // Fix native\n  if ($anyNative) {\n    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n      // Set @@toStringTag to native iterators\n      setToStringTag(IteratorPrototype, TAG, true);\n      // fix for some old engines\n      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n    }\n  }\n  // fix Array#{values, @@iterator}.name in V8 / FF\n  if (DEF_VALUES && $native && $native.name !== VALUES) {\n    VALUES_BUG = true;\n    $default = function values() { return $native.call(this); };\n  }\n  // Define iterator\n  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG] = returnThis;\n  if (DEFAULT) {\n    methods = {\n      values: DEF_VALUES ? $default : getMethod(VALUES),\n      keys: IS_SET ? $default : getMethod(KEYS),\n      entries: $entries\n    };\n    if (FORCED) for (key in methods) {\n      if (!(key in proto)) redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n\n\n/***/ }),\n/* 107 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(29);\nvar toObject = __webpack_require__(33);\nvar IE_PROTO = __webpack_require__(76)('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n  O = toObject(O);\n  if (has(O, IE_PROTO)) return O[IE_PROTO];\n  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  } return O instanceof Object ? ObjectProto : null;\n};\n\n\n/***/ }),\n/* 108 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (done, value) {\n  return { value: value, done: !!done };\n};\n\n\n/***/ }),\n/* 109 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar global = __webpack_require__(14);\nvar dP = __webpack_require__(20);\nvar DESCRIPTORS = __webpack_require__(22);\nvar SPECIES = __webpack_require__(11)('species');\n\nmodule.exports = function (KEY) {\n  var C = global[KEY];\n  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n    configurable: true,\n    get: function () { return this; }\n  });\n};\n\n\n/***/ }),\n/* 110 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = __webpack_require__(9);\nvar anObject = __webpack_require__(18);\nvar check = function (O, proto) {\n  anObject(O);\n  if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n    function (test, buggy, set) {\n      try {\n        set = __webpack_require__(32)(Function.call, __webpack_require__(67).f(Object.prototype, '__proto__').set, 2);\n        set(test, []);\n        buggy = !(test instanceof Array);\n      } catch (e) { buggy = true; }\n      return function setPrototypeOf(O, proto) {\n        check(O, proto);\n        if (buggy) O.__proto__ = proto;\n        else set(O, proto);\n        return O;\n      };\n    }({}, false) : undefined),\n  check: check\n};\n\n\n/***/ }),\n/* 111 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar strong = __webpack_require__(97);\nvar validate = __webpack_require__(46);\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = __webpack_require__(66)(SET, function (get) {\n  return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.2.3.1 Set.prototype.add(value)\n  add: function add(value) {\n    return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n  }\n}, strong);\n\n\n/***/ }),\n/* 112 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar each = __webpack_require__(68)(0);\nvar redefine = __webpack_require__(30);\nvar meta = __webpack_require__(34);\nvar assign = __webpack_require__(114);\nvar weak = __webpack_require__(115);\nvar isObject = __webpack_require__(9);\nvar fails = __webpack_require__(23);\nvar validate = __webpack_require__(46);\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n  return function WeakMap() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n};\n\nvar methods = {\n  // 23.3.3.3 WeakMap.prototype.get(key)\n  get: function get(key) {\n    if (isObject(key)) {\n      var data = getWeak(key);\n      if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n      return data ? data[this._i] : undefined;\n    }\n  },\n  // 23.3.3.5 WeakMap.prototype.set(key, value)\n  set: function set(key, value) {\n    return weak.def(validate(this, WEAK_MAP), key, value);\n  }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = __webpack_require__(66)(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n  InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n  assign(InternalMap.prototype, methods);\n  meta.NEED = true;\n  each(['delete', 'has', 'get', 'set'], function (key) {\n    var proto = $WeakMap.prototype;\n    var method = proto[key];\n    redefine(proto, key, function (a, b) {\n      // store frozen objects on internal weakmap shim\n      if (isObject(a) && !isExtensible(a)) {\n        if (!this._f) this._f = new InternalMap();\n        var result = this._f[key](a, b);\n        return key == 'set' ? this : result;\n      // store all the rest on native weakmap\n      } return method.call(this, a, b);\n    });\n  });\n}\n\n\n/***/ }),\n/* 113 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.2.2 IsArray(argument)\nvar cof = __webpack_require__(44);\nmodule.exports = Array.isArray || function isArray(arg) {\n  return cof(arg) == 'Array';\n};\n\n\n/***/ }),\n/* 114 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = __webpack_require__(37);\nvar gOPS = __webpack_require__(69);\nvar pIE = __webpack_require__(53);\nvar toObject = __webpack_require__(33);\nvar IObject = __webpack_require__(75);\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || __webpack_require__(23)(function () {\n  var A = {};\n  var B = {};\n  // eslint-disable-next-line no-undef\n  var S = Symbol();\n  var K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function (k) { B[k] = k; });\n  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n  var T = toObject(target);\n  var aLen = arguments.length;\n  var index = 1;\n  var getSymbols = gOPS.f;\n  var isEnum = pIE.f;\n  while (aLen > index) {\n    var S = IObject(arguments[index++]);\n    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n    while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n  } return T;\n} : $assign;\n\n\n/***/ }),\n/* 115 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar redefineAll = __webpack_require__(61);\nvar getWeak = __webpack_require__(34).getWeak;\nvar anObject = __webpack_require__(18);\nvar isObject = __webpack_require__(9);\nvar anInstance = __webpack_require__(63);\nvar forOf = __webpack_require__(64);\nvar createArrayMethod = __webpack_require__(68);\nvar $has = __webpack_require__(29);\nvar validate = __webpack_require__(46);\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n  return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n  this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n  return arrayFind(store.a, function (it) {\n    return it[0] === key;\n  });\n};\nUncaughtFrozenStore.prototype = {\n  get: function (key) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) return entry[1];\n  },\n  has: function (key) {\n    return !!findUncaughtFrozen(this, key);\n  },\n  set: function (key, value) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) entry[1] = value;\n    else this.a.push([key, value]);\n  },\n  'delete': function (key) {\n    var index = arrayFindIndex(this.a, function (it) {\n      return it[0] === key;\n    });\n    if (~index) this.a.splice(index, 1);\n    return !!~index;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      anInstance(that, C, NAME, '_i');\n      that._t = NAME;      // collection type\n      that._i = id++;      // collection id\n      that._l = undefined; // leak store for uncaught frozen objects\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.3.3.2 WeakMap.prototype.delete(key)\n      // 23.4.3.3 WeakSet.prototype.delete(value)\n      'delete': function (key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n        return data && $has(data, this._i) && delete data[this._i];\n      },\n      // 23.3.3.4 WeakMap.prototype.has(key)\n      // 23.4.3.4 WeakSet.prototype.has(value)\n      has: function has(key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n        return data && $has(data, this._i);\n      }\n    });\n    return C;\n  },\n  def: function (that, key, value) {\n    var data = getWeak(anObject(key), true);\n    if (data === true) uncaughtFrozenStore(that).set(key, value);\n    else data[that._i] = value;\n    return that;\n  },\n  ufstore: uncaughtFrozenStore\n};\n\n\n/***/ }),\n/* 116 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar weak = __webpack_require__(115);\nvar validate = __webpack_require__(46);\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\n__webpack_require__(66)(WEAK_SET, function (get) {\n  return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.4.3.1 WeakSet.prototype.add(value)\n  add: function add(value) {\n    return weak.def(validate(this, WEAK_SET), value, true);\n  }\n}, weak, false, true);\n\n\n/***/ }),\n/* 117 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(65);\nvar global = __webpack_require__(14);\nvar ctx = __webpack_require__(32);\nvar classof = __webpack_require__(105);\nvar $export = __webpack_require__(3);\nvar isObject = __webpack_require__(9);\nvar aFunction = __webpack_require__(62);\nvar anInstance = __webpack_require__(63);\nvar forOf = __webpack_require__(64);\nvar speciesConstructor = __webpack_require__(332);\nvar task = __webpack_require__(80).set;\nvar microtask = __webpack_require__(334)();\nvar newPromiseCapabilityModule = __webpack_require__(118);\nvar perform = __webpack_require__(335);\nvar promiseResolve = __webpack_require__(336);\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n  try {\n    // correct subclassing with @@species support\n    var promise = $Promise.resolve(1);\n    var FakePromise = (promise.constructor = {})[__webpack_require__(11)('species')] = function (exec) {\n      exec(empty, empty);\n    };\n    // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n    return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;\n  } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n  var then;\n  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n  if (promise._n) return;\n  promise._n = true;\n  var chain = promise._c;\n  microtask(function () {\n    var value = promise._v;\n    var ok = promise._s == 1;\n    var i = 0;\n    var run = function (reaction) {\n      var handler = ok ? reaction.ok : reaction.fail;\n      var resolve = reaction.resolve;\n      var reject = reaction.reject;\n      var domain = reaction.domain;\n      var result, then, exited;\n      try {\n        if (handler) {\n          if (!ok) {\n            if (promise._h == 2) onHandleUnhandled(promise);\n            promise._h = 1;\n          }\n          if (handler === true) result = value;\n          else {\n            if (domain) domain.enter();\n            result = handler(value); // may throw\n            if (domain) {\n              domain.exit();\n              exited = true;\n            }\n          }\n          if (result === reaction.promise) {\n            reject(TypeError('Promise-chain cycle'));\n          } else if (then = isThenable(result)) {\n            then.call(result, resolve, reject);\n          } else resolve(result);\n        } else reject(value);\n      } catch (e) {\n        if (domain && !exited) domain.exit();\n        reject(e);\n      }\n    };\n    while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n    promise._c = [];\n    promise._n = false;\n    if (isReject && !promise._h) onUnhandled(promise);\n  });\n};\nvar onUnhandled = function (promise) {\n  task.call(global, function () {\n    var value = promise._v;\n    var unhandled = isUnhandled(promise);\n    var result, handler, console;\n    if (unhandled) {\n      result = perform(function () {\n        if (isNode) {\n          process.emit('unhandledRejection', value, promise);\n        } else if (handler = global.onunhandledrejection) {\n          handler({ promise: promise, reason: value });\n        } else if ((console = global.console) && console.error) {\n          console.error('Unhandled promise rejection', value);\n        }\n      });\n      // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n      promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n    } promise._a = undefined;\n    if (unhandled && result.e) throw result.v;\n  });\n};\nvar isUnhandled = function (promise) {\n  return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n  task.call(global, function () {\n    var handler;\n    if (isNode) {\n      process.emit('rejectionHandled', promise);\n    } else if (handler = global.onrejectionhandled) {\n      handler({ promise: promise, reason: promise._v });\n    }\n  });\n};\nvar $reject = function (value) {\n  var promise = this;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  promise._v = value;\n  promise._s = 2;\n  if (!promise._a) promise._a = promise._c.slice();\n  notify(promise, true);\n};\nvar $resolve = function (value) {\n  var promise = this;\n  var then;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  try {\n    if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n    if (then = isThenable(value)) {\n      microtask(function () {\n        var wrapper = { _w: promise, _d: false }; // wrap\n        try {\n          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n        } catch (e) {\n          $reject.call(wrapper, e);\n        }\n      });\n    } else {\n      promise._v = value;\n      promise._s = 1;\n      notify(promise, false);\n    }\n  } catch (e) {\n    $reject.call({ _w: promise, _d: false }, e); // wrap\n  }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n  // 25.4.3.1 Promise(executor)\n  $Promise = function Promise(executor) {\n    anInstance(this, $Promise, PROMISE, '_h');\n    aFunction(executor);\n    Internal.call(this);\n    try {\n      executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n    } catch (err) {\n      $reject.call(this, err);\n    }\n  };\n  // eslint-disable-next-line no-unused-vars\n  Internal = function Promise(executor) {\n    this._c = [];             // <- awaiting reactions\n    this._a = undefined;      // <- checked in isUnhandled reactions\n    this._s = 0;              // <- state\n    this._d = false;          // <- done\n    this._v = undefined;      // <- value\n    this._h = 0;              // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n    this._n = false;          // <- notify\n  };\n  Internal.prototype = __webpack_require__(61)($Promise.prototype, {\n    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n    then: function then(onFulfilled, onRejected) {\n      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n      reaction.fail = typeof onRejected == 'function' && onRejected;\n      reaction.domain = isNode ? process.domain : undefined;\n      this._c.push(reaction);\n      if (this._a) this._a.push(reaction);\n      if (this._s) notify(this, false);\n      return reaction.promise;\n    },\n    // 25.4.5.1 Promise.prototype.catch(onRejected)\n    'catch': function (onRejected) {\n      return this.then(undefined, onRejected);\n    }\n  });\n  OwnPromiseCapability = function () {\n    var promise = new Internal();\n    this.promise = promise;\n    this.resolve = ctx($resolve, promise, 1);\n    this.reject = ctx($reject, promise, 1);\n  };\n  newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n    return C === $Promise || C === Wrapper\n      ? new OwnPromiseCapability(C)\n      : newGenericPromiseCapability(C);\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\n__webpack_require__(52)($Promise, PROMISE);\n__webpack_require__(109)(PROMISE);\nWrapper = __webpack_require__(45)[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n  // 25.4.4.5 Promise.reject(r)\n  reject: function reject(r) {\n    var capability = newPromiseCapability(this);\n    var $$reject = capability.reject;\n    $$reject(r);\n    return capability.promise;\n  }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n  // 25.4.4.6 Promise.resolve(x)\n  resolve: function resolve(x) {\n    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n  }\n});\n$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(79)(function (iter) {\n  $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n  // 25.4.4.1 Promise.all(iterable)\n  all: function all(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var resolve = capability.resolve;\n    var reject = capability.reject;\n    var result = perform(function () {\n      var values = [];\n      var index = 0;\n      var remaining = 1;\n      forOf(iterable, false, function (promise) {\n        var $index = index++;\n        var alreadyCalled = false;\n        values.push(undefined);\n        remaining++;\n        C.resolve(promise).then(function (value) {\n          if (alreadyCalled) return;\n          alreadyCalled = true;\n          values[$index] = value;\n          --remaining || resolve(values);\n        }, reject);\n      });\n      --remaining || resolve(values);\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  },\n  // 25.4.4.4 Promise.race(iterable)\n  race: function race(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var reject = capability.reject;\n    var result = perform(function () {\n      forOf(iterable, false, function (promise) {\n        C.resolve(promise).then(capability.resolve, reject);\n      });\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  }\n});\n\n\n/***/ }),\n/* 118 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = __webpack_require__(62);\n\nfunction PromiseCapability(C) {\n  var resolve, reject;\n  this.promise = new C(function ($$resolve, $$reject) {\n    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n    resolve = $$resolve;\n    reject = $$reject;\n  });\n  this.resolve = aFunction(resolve);\n  this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n  return new PromiseCapability(C);\n};\n\n\n/***/ }),\n/* 119 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// ECMAScript 6 symbols shim\nvar global = __webpack_require__(14);\nvar has = __webpack_require__(29);\nvar DESCRIPTORS = __webpack_require__(22);\nvar $export = __webpack_require__(3);\nvar redefine = __webpack_require__(30);\nvar META = __webpack_require__(34).KEY;\nvar $fails = __webpack_require__(23);\nvar shared = __webpack_require__(77);\nvar setToStringTag = __webpack_require__(52);\nvar uid = __webpack_require__(49);\nvar wks = __webpack_require__(11);\nvar wksExt = __webpack_require__(120);\nvar wksDefine = __webpack_require__(337);\nvar enumKeys = __webpack_require__(338);\nvar isArray = __webpack_require__(113);\nvar anObject = __webpack_require__(18);\nvar isObject = __webpack_require__(9);\nvar toIObject = __webpack_require__(24);\nvar toPrimitive = __webpack_require__(73);\nvar createDesc = __webpack_require__(50);\nvar _create = __webpack_require__(74);\nvar gOPNExt = __webpack_require__(121);\nvar $GOPD = __webpack_require__(67);\nvar $DP = __webpack_require__(20);\nvar $keys = __webpack_require__(37);\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n  return _create(dP({}, 'a', {\n    get: function () { return dP(this, 'a', { value: 7 }).a; }\n  })).a != 7;\n}) ? function (it, key, D) {\n  var protoDesc = gOPD(ObjectProto, key);\n  if (protoDesc) delete ObjectProto[key];\n  dP(it, key, D);\n  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n  sym._k = tag;\n  return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n  return typeof it == 'symbol';\n} : function (it) {\n  return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n  anObject(it);\n  key = toPrimitive(key, true);\n  anObject(D);\n  if (has(AllSymbols, key)) {\n    if (!D.enumerable) {\n      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n      it[HIDDEN][key] = true;\n    } else {\n      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n      D = _create(D, { enumerable: createDesc(0, false) });\n    } return setSymbolDesc(it, key, D);\n  } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n  anObject(it);\n  var keys = enumKeys(P = toIObject(P));\n  var i = 0;\n  var l = keys.length;\n  var key;\n  while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n  return it;\n};\nvar $create = function create(it, P) {\n  return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n  var E = isEnum.call(this, key = toPrimitive(key, true));\n  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n  it = toIObject(it);\n  key = toPrimitive(key, true);\n  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n  var D = gOPD(it, key);\n  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n  return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n  var names = gOPN(toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n  } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n  var IS_OP = it === ObjectProto;\n  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n  } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n  $Symbol = function Symbol() {\n    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n    var $set = function (value) {\n      if (this === ObjectProto) $set.call(OPSymbols, value);\n      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n      setSymbolDesc(this, tag, createDesc(1, value));\n    };\n    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n    return wrap(tag);\n  };\n  redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n    return this._k;\n  });\n\n  $GOPD.f = $getOwnPropertyDescriptor;\n  $DP.f = $defineProperty;\n  __webpack_require__(81).f = gOPNExt.f = $getOwnPropertyNames;\n  __webpack_require__(53).f = $propertyIsEnumerable;\n  __webpack_require__(69).f = $getOwnPropertySymbols;\n\n  if (DESCRIPTORS && !__webpack_require__(65)) {\n    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n  }\n\n  wksExt.f = function (name) {\n    return wrap(wks(name));\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n  // 19.4.2.1 Symbol.for(key)\n  'for': function (key) {\n    return has(SymbolRegistry, key += '')\n      ? SymbolRegistry[key]\n      : SymbolRegistry[key] = $Symbol(key);\n  },\n  // 19.4.2.5 Symbol.keyFor(sym)\n  keyFor: function keyFor(sym) {\n    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n  },\n  useSetter: function () { setter = true; },\n  useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n  // 19.1.2.2 Object.create(O [, Properties])\n  create: $create,\n  // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n  defineProperty: $defineProperty,\n  // 19.1.2.3 Object.defineProperties(O, Properties)\n  defineProperties: $defineProperties,\n  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n  // 19.1.2.7 Object.getOwnPropertyNames(O)\n  getOwnPropertyNames: $getOwnPropertyNames,\n  // 19.1.2.8 Object.getOwnPropertySymbols(O)\n  getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n  var S = $Symbol();\n  // MS Edge converts symbol values to JSON as {}\n  // WebKit converts symbol values to JSON as null\n  // V8 throws on boxed symbols\n  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n  stringify: function stringify(it) {\n    var args = [it];\n    var i = 1;\n    var replacer, $replacer;\n    while (arguments.length > i) args.push(arguments[i++]);\n    $replacer = replacer = args[1];\n    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n    if (!isArray(replacer)) replacer = function (key, value) {\n      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n      if (!isSymbol(value)) return value;\n    };\n    args[1] = replacer;\n    return _stringify.apply($JSON, args);\n  }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(31)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n\n\n/***/ }),\n/* 120 */\n/***/ (function(module, exports, __webpack_require__) {\n\nexports.f = __webpack_require__(11);\n\n\n/***/ }),\n/* 121 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = __webpack_require__(24);\nvar gOPN = __webpack_require__(81).f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n  ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n  try {\n    return gOPN(it);\n  } catch (e) {\n    return windowNames.slice();\n  }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n\n\n/***/ }),\n/* 122 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.5 Object.freeze(O)\nvar isObject = __webpack_require__(9);\nvar meta = __webpack_require__(34).onFreeze;\n\n__webpack_require__(26)('freeze', function ($freeze) {\n  return function freeze(it) {\n    return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n  };\n});\n\n\n/***/ }),\n/* 123 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.17 Object.seal(O)\nvar isObject = __webpack_require__(9);\nvar meta = __webpack_require__(34).onFreeze;\n\n__webpack_require__(26)('seal', function ($seal) {\n  return function seal(it) {\n    return $seal && isObject(it) ? $seal(meta(it)) : it;\n  };\n});\n\n\n/***/ }),\n/* 124 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = __webpack_require__(9);\nvar meta = __webpack_require__(34).onFreeze;\n\n__webpack_require__(26)('preventExtensions', function ($preventExtensions) {\n  return function preventExtensions(it) {\n    return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n  };\n});\n\n\n/***/ }),\n/* 125 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.12 Object.isFrozen(O)\nvar isObject = __webpack_require__(9);\n\n__webpack_require__(26)('isFrozen', function ($isFrozen) {\n  return function isFrozen(it) {\n    return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n  };\n});\n\n\n/***/ }),\n/* 126 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.13 Object.isSealed(O)\nvar isObject = __webpack_require__(9);\n\n__webpack_require__(26)('isSealed', function ($isSealed) {\n  return function isSealed(it) {\n    return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n  };\n});\n\n\n/***/ }),\n/* 127 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.11 Object.isExtensible(O)\nvar isObject = __webpack_require__(9);\n\n__webpack_require__(26)('isExtensible', function ($isExtensible) {\n  return function isExtensible(it) {\n    return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n  };\n});\n\n\n/***/ }),\n/* 128 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = __webpack_require__(24);\nvar $getOwnPropertyDescriptor = __webpack_require__(67).f;\n\n__webpack_require__(26)('getOwnPropertyDescriptor', function () {\n  return function getOwnPropertyDescriptor(it, key) {\n    return $getOwnPropertyDescriptor(toIObject(it), key);\n  };\n});\n\n\n/***/ }),\n/* 129 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = __webpack_require__(33);\nvar $getPrototypeOf = __webpack_require__(107);\n\n__webpack_require__(26)('getPrototypeOf', function () {\n  return function getPrototypeOf(it) {\n    return $getPrototypeOf(toObject(it));\n  };\n});\n\n\n/***/ }),\n/* 130 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 Object.keys(O)\nvar toObject = __webpack_require__(33);\nvar $keys = __webpack_require__(37);\n\n__webpack_require__(26)('keys', function () {\n  return function keys(it) {\n    return $keys(toObject(it));\n  };\n});\n\n\n/***/ }),\n/* 131 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.7 Object.getOwnPropertyNames(O)\n__webpack_require__(26)('getOwnPropertyNames', function () {\n  return __webpack_require__(121).f;\n});\n\n\n/***/ }),\n/* 132 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.1 Object.assign(target, source)\nvar $export = __webpack_require__(3);\n\n$export($export.S + $export.F, 'Object', { assign: __webpack_require__(114) });\n\n\n/***/ }),\n/* 133 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.10 Object.is(value1, value2)\nvar $export = __webpack_require__(3);\n$export($export.S, 'Object', { is: __webpack_require__(339) });\n\n\n/***/ }),\n/* 134 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = __webpack_require__(3);\n$export($export.S, 'Object', { setPrototypeOf: __webpack_require__(110).set });\n\n\n/***/ }),\n/* 135 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(20).f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || __webpack_require__(22) && dP(FProto, NAME, {\n  configurable: true,\n  get: function () {\n    try {\n      return ('' + this).match(nameRE)[1];\n    } catch (e) {\n      return '';\n    }\n  }\n});\n\n\n/***/ }),\n/* 136 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\nvar toIObject = __webpack_require__(24);\nvar toLength = __webpack_require__(25);\n\n$export($export.S, 'String', {\n  // 21.1.2.4 String.raw(callSite, ...substitutions)\n  raw: function raw(callSite) {\n    var tpl = toIObject(callSite.raw);\n    var len = toLength(tpl.length);\n    var aLen = arguments.length;\n    var res = [];\n    var i = 0;\n    while (len > i) {\n      res.push(String(tpl[i++]));\n      if (i < aLen) res.push(String(arguments[i]));\n    } return res.join('');\n  }\n});\n\n\n/***/ }),\n/* 137 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\nvar toAbsoluteIndex = __webpack_require__(60);\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n  // 21.1.2.2 String.fromCodePoint(...codePoints)\n  fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n    var res = [];\n    var aLen = arguments.length;\n    var i = 0;\n    var code;\n    while (aLen > i) {\n      code = +arguments[i++];\n      if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n      res.push(code < 0x10000\n        ? fromCharCode(code)\n        : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n      );\n    } return res.join('');\n  }\n});\n\n\n/***/ }),\n/* 138 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(3);\nvar $at = __webpack_require__(340)(false);\n$export($export.P, 'String', {\n  // 21.1.3.3 String.prototype.codePointAt(pos)\n  codePointAt: function codePointAt(pos) {\n    return $at(this, pos);\n  }\n});\n\n\n/***/ }),\n/* 139 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\n\n$export($export.P, 'String', {\n  // 21.1.3.13 String.prototype.repeat(count)\n  repeat: __webpack_require__(140)\n});\n\n\n/***/ }),\n/* 140 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar toInteger = __webpack_require__(59);\nvar defined = __webpack_require__(38);\n\nmodule.exports = function repeat(count) {\n  var str = String(defined(this));\n  var res = '';\n  var n = toInteger(count);\n  if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n  for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n  return res;\n};\n\n\n/***/ }),\n/* 141 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n\nvar $export = __webpack_require__(3);\nvar toLength = __webpack_require__(25);\nvar context = __webpack_require__(82);\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * __webpack_require__(83)(STARTS_WITH), 'String', {\n  startsWith: function startsWith(searchString /* , position = 0 */) {\n    var that = context(this, searchString, STARTS_WITH);\n    var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n    var search = String(searchString);\n    return $startsWith\n      ? $startsWith.call(that, search, index)\n      : that.slice(index, index + search.length) === search;\n  }\n});\n\n\n/***/ }),\n/* 142 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.2.8 IsRegExp(argument)\nvar isObject = __webpack_require__(9);\nvar cof = __webpack_require__(44);\nvar MATCH = __webpack_require__(11)('match');\nmodule.exports = function (it) {\n  var isRegExp;\n  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n\n\n/***/ }),\n/* 143 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n\nvar $export = __webpack_require__(3);\nvar toLength = __webpack_require__(25);\nvar context = __webpack_require__(82);\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * __webpack_require__(83)(ENDS_WITH), 'String', {\n  endsWith: function endsWith(searchString /* , endPosition = @length */) {\n    var that = context(this, searchString, ENDS_WITH);\n    var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n    var len = toLength(that.length);\n    var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n    var search = String(searchString);\n    return $endsWith\n      ? $endsWith.call(that, search, end)\n      : that.slice(end - search.length, end) === search;\n  }\n});\n\n\n/***/ }),\n/* 144 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n\nvar $export = __webpack_require__(3);\nvar context = __webpack_require__(82);\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * __webpack_require__(83)(INCLUDES), 'String', {\n  includes: function includes(searchString /* , position = 0 */) {\n    return !!~context(this, searchString, INCLUDES)\n      .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n\n/***/ }),\n/* 145 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 21.2.5.3 get RegExp.prototype.flags()\nif (__webpack_require__(22) && /./g.flags != 'g') __webpack_require__(20).f(RegExp.prototype, 'flags', {\n  configurable: true,\n  get: __webpack_require__(341)\n});\n\n\n/***/ }),\n/* 146 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// @@match logic\n__webpack_require__(70)('match', 1, function (defined, MATCH, $match) {\n  // 21.1.3.11 String.prototype.match(regexp)\n  return [function match(regexp) {\n    'use strict';\n    var O = defined(this);\n    var fn = regexp == undefined ? undefined : regexp[MATCH];\n    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n  }, $match];\n});\n\n\n/***/ }),\n/* 147 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// @@replace logic\n__webpack_require__(70)('replace', 2, function (defined, REPLACE, $replace) {\n  // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n  return [function replace(searchValue, replaceValue) {\n    'use strict';\n    var O = defined(this);\n    var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n    return fn !== undefined\n      ? fn.call(searchValue, O, replaceValue)\n      : $replace.call(String(O), searchValue, replaceValue);\n  }, $replace];\n});\n\n\n/***/ }),\n/* 148 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// @@split logic\n__webpack_require__(70)('split', 2, function (defined, SPLIT, $split) {\n  'use strict';\n  var isRegExp = __webpack_require__(142);\n  var _split = $split;\n  var $push = [].push;\n  var $SPLIT = 'split';\n  var LENGTH = 'length';\n  var LAST_INDEX = 'lastIndex';\n  if (\n    'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n    'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n    'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n    '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n    '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n    ''[$SPLIT](/.?/)[LENGTH]\n  ) {\n    var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n    // based on es5-shim implementation, need to rework it\n    $split = function (separator, limit) {\n      var string = String(this);\n      if (separator === undefined && limit === 0) return [];\n      // If `separator` is not a regex, use native split\n      if (!isRegExp(separator)) return _split.call(string, separator, limit);\n      var output = [];\n      var flags = (separator.ignoreCase ? 'i' : '') +\n                  (separator.multiline ? 'm' : '') +\n                  (separator.unicode ? 'u' : '') +\n                  (separator.sticky ? 'y' : '');\n      var lastLastIndex = 0;\n      var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n      // Make `global` and avoid `lastIndex` issues by working with a copy\n      var separatorCopy = new RegExp(separator.source, flags + 'g');\n      var separator2, match, lastIndex, lastLength, i;\n      // Doesn't need flags gy, but they don't hurt\n      if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n      while (match = separatorCopy.exec(string)) {\n        // `separatorCopy.lastIndex` is not reliable cross-browser\n        lastIndex = match.index + match[0][LENGTH];\n        if (lastIndex > lastLastIndex) {\n          output.push(string.slice(lastLastIndex, match.index));\n          // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n          // eslint-disable-next-line no-loop-func\n          if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {\n            for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;\n          });\n          if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n          lastLength = match[0][LENGTH];\n          lastLastIndex = lastIndex;\n          if (output[LENGTH] >= splitLimit) break;\n        }\n        if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n      }\n      if (lastLastIndex === string[LENGTH]) {\n        if (lastLength || !separatorCopy.test('')) output.push('');\n      } else output.push(string.slice(lastLastIndex));\n      return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n    };\n  // Chakra, V8\n  } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n    $split = function (separator, limit) {\n      return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n    };\n  }\n  // 21.1.3.17 String.prototype.split(separator, limit)\n  return [function split(separator, limit) {\n    var O = defined(this);\n    var fn = separator == undefined ? undefined : separator[SPLIT];\n    return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n  }, $split];\n});\n\n\n/***/ }),\n/* 149 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// @@search logic\n__webpack_require__(70)('search', 1, function (defined, SEARCH, $search) {\n  // 21.1.3.15 String.prototype.search(regexp)\n  return [function search(regexp) {\n    'use strict';\n    var O = defined(this);\n    var fn = regexp == undefined ? undefined : regexp[SEARCH];\n    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n  }, $search];\n});\n\n\n/***/ }),\n/* 150 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar ctx = __webpack_require__(32);\nvar $export = __webpack_require__(3);\nvar toObject = __webpack_require__(33);\nvar call = __webpack_require__(102);\nvar isArrayIter = __webpack_require__(103);\nvar toLength = __webpack_require__(25);\nvar createProperty = __webpack_require__(84);\nvar getIterFn = __webpack_require__(104);\n\n$export($export.S + $export.F * !__webpack_require__(79)(function (iter) { Array.from(iter); }), 'Array', {\n  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n  from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n    var O = toObject(arrayLike);\n    var C = typeof this == 'function' ? this : Array;\n    var aLen = arguments.length;\n    var mapfn = aLen > 1 ? arguments[1] : undefined;\n    var mapping = mapfn !== undefined;\n    var index = 0;\n    var iterFn = getIterFn(O);\n    var length, result, step, iterator;\n    if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n    // if object isn't iterable or it's array with default iterator - use simple case\n    if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n      for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n        createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n      }\n    } else {\n      length = toLength(O.length);\n      for (result = new C(length); length > index; index++) {\n        createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n      }\n    }\n    result.length = index;\n    return result;\n  }\n});\n\n\n/***/ }),\n/* 151 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(3);\nvar createProperty = __webpack_require__(84);\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * __webpack_require__(23)(function () {\n  function F() { /* empty */ }\n  return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n  // 22.1.2.3 Array.of( ...items)\n  of: function of(/* ...args */) {\n    var index = 0;\n    var aLen = arguments.length;\n    var result = new (typeof this == 'function' ? this : Array)(aLen);\n    while (aLen > index) createProperty(result, index, arguments[index++]);\n    result.length = aLen;\n    return result;\n  }\n});\n\n\n/***/ }),\n/* 152 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = __webpack_require__(3);\n\n$export($export.P, 'Array', { copyWithin: __webpack_require__(342) });\n\n__webpack_require__(47)('copyWithin');\n\n\n/***/ }),\n/* 153 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = __webpack_require__(3);\nvar $find = __webpack_require__(68)(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n  find: function find(callbackfn /* , that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n__webpack_require__(47)(KEY);\n\n\n/***/ }),\n/* 154 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = __webpack_require__(3);\nvar $find = __webpack_require__(68)(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n  findIndex: function findIndex(callbackfn /* , that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n__webpack_require__(47)(KEY);\n\n\n/***/ }),\n/* 155 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = __webpack_require__(3);\n\n$export($export.P, 'Array', { fill: __webpack_require__(343) });\n\n__webpack_require__(47)('fill');\n\n\n/***/ }),\n/* 156 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.2 Number.isFinite(number)\nvar $export = __webpack_require__(3);\nvar _isFinite = __webpack_require__(14).isFinite;\n\n$export($export.S, 'Number', {\n  isFinite: function isFinite(it) {\n    return typeof it == 'number' && _isFinite(it);\n  }\n});\n\n\n/***/ }),\n/* 157 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.3 Number.isInteger(number)\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', { isInteger: __webpack_require__(158) });\n\n\n/***/ }),\n/* 158 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.3 Number.isInteger(number)\nvar isObject = __webpack_require__(9);\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n  return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n\n\n/***/ }),\n/* 159 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = __webpack_require__(3);\nvar isInteger = __webpack_require__(158);\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n  isSafeInteger: function isSafeInteger(number) {\n    return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n  }\n});\n\n\n/***/ }),\n/* 160 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.4 Number.isNaN(number)\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', {\n  isNaN: function isNaN(number) {\n    // eslint-disable-next-line no-self-compare\n    return number != number;\n  }\n});\n\n\n/***/ }),\n/* 161 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.1 Number.EPSILON\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n\n\n/***/ }),\n/* 162 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n\n\n/***/ }),\n/* 163 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n\n\n/***/ }),\n/* 164 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/Array.prototype.includes\nvar $export = __webpack_require__(3);\nvar $includes = __webpack_require__(100)(true);\n\n$export($export.P, 'Array', {\n  includes: function includes(el /* , fromIndex = 0 */) {\n    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n__webpack_require__(47)('includes');\n\n\n/***/ }),\n/* 165 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-object-values-entries\nvar $export = __webpack_require__(3);\nvar $values = __webpack_require__(166)(false);\n\n$export($export.S, 'Object', {\n  values: function values(it) {\n    return $values(it);\n  }\n});\n\n\n/***/ }),\n/* 166 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getKeys = __webpack_require__(37);\nvar toIObject = __webpack_require__(24);\nvar isEnum = __webpack_require__(53).f;\nmodule.exports = function (isEntries) {\n  return function (it) {\n    var O = toIObject(it);\n    var keys = getKeys(O);\n    var length = keys.length;\n    var i = 0;\n    var result = [];\n    var key;\n    while (length > i) if (isEnum.call(O, key = keys[i++])) {\n      result.push(isEntries ? [key, O[key]] : O[key]);\n    } return result;\n  };\n};\n\n\n/***/ }),\n/* 167 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-object-values-entries\nvar $export = __webpack_require__(3);\nvar $entries = __webpack_require__(166)(true);\n\n$export($export.S, 'Object', {\n  entries: function entries(it) {\n    return $entries(it);\n  }\n});\n\n\n/***/ }),\n/* 168 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = __webpack_require__(3);\nvar ownKeys = __webpack_require__(344);\nvar toIObject = __webpack_require__(24);\nvar gOPD = __webpack_require__(67);\nvar createProperty = __webpack_require__(84);\n\n$export($export.S, 'Object', {\n  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n    var O = toIObject(object);\n    var getDesc = gOPD.f;\n    var keys = ownKeys(O);\n    var result = {};\n    var i = 0;\n    var key, desc;\n    while (keys.length > i) {\n      desc = getDesc(O, key = keys[i++]);\n      if (desc !== undefined) createProperty(result, key, desc);\n    }\n    return result;\n  }\n});\n\n\n/***/ }),\n/* 169 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = __webpack_require__(3);\nvar $pad = __webpack_require__(170);\nvar userAgent = __webpack_require__(171);\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n  padStart: function padStart(maxLength /* , fillString = ' ' */) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n  }\n});\n\n\n/***/ }),\n/* 170 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = __webpack_require__(25);\nvar repeat = __webpack_require__(140);\nvar defined = __webpack_require__(38);\n\nmodule.exports = function (that, maxLength, fillString, left) {\n  var S = String(defined(that));\n  var stringLength = S.length;\n  var fillStr = fillString === undefined ? ' ' : String(fillString);\n  var intMaxLength = toLength(maxLength);\n  if (intMaxLength <= stringLength || fillStr == '') return S;\n  var fillLen = intMaxLength - stringLength;\n  var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n  if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n  return left ? stringFiller + S : S + stringFiller;\n};\n\n\n/***/ }),\n/* 171 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n\n\n/***/ }),\n/* 172 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = __webpack_require__(3);\nvar $pad = __webpack_require__(170);\nvar userAgent = __webpack_require__(171);\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n  padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n  }\n});\n\n\n/***/ }),\n/* 173 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\nvar $task = __webpack_require__(80);\n$export($export.G + $export.B, {\n  setImmediate: $task.set,\n  clearImmediate: $task.clear\n});\n\n\n/***/ }),\n/* 174 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $iterators = __webpack_require__(85);\nvar getKeys = __webpack_require__(37);\nvar redefine = __webpack_require__(30);\nvar global = __webpack_require__(14);\nvar hide = __webpack_require__(31);\nvar Iterators = __webpack_require__(51);\nvar wks = __webpack_require__(11);\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n  CSSRuleList: true, // TODO: Not spec compliant, should be false.\n  CSSStyleDeclaration: false,\n  CSSValueList: false,\n  ClientRectList: false,\n  DOMRectList: false,\n  DOMStringList: false,\n  DOMTokenList: true,\n  DataTransferItemList: false,\n  FileList: false,\n  HTMLAllCollection: false,\n  HTMLCollection: false,\n  HTMLFormElement: false,\n  HTMLSelectElement: false,\n  MediaList: true, // TODO: Not spec compliant, should be false.\n  MimeTypeArray: false,\n  NamedNodeMap: false,\n  NodeList: true,\n  PaintRequestList: false,\n  Plugin: false,\n  PluginArray: false,\n  SVGLengthList: false,\n  SVGNumberList: false,\n  SVGPathSegList: false,\n  SVGPointList: false,\n  SVGStringList: false,\n  SVGTransformList: false,\n  SourceBufferList: false,\n  StyleSheetList: true, // TODO: Not spec compliant, should be false.\n  TextTrackCueList: false,\n  TextTrackList: false,\n  TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n  var NAME = collections[i];\n  var explicit = DOMIterables[NAME];\n  var Collection = global[NAME];\n  var proto = Collection && Collection.prototype;\n  var key;\n  if (proto) {\n    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n    Iterators[NAME] = ArrayValues;\n    if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n  }\n}\n\n\n/***/ }),\n/* 175 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar privatePool = new WeakMap();\n\n/**\n * Calculates indexes of columns to render OR columns that are visible.\n * To redo the calculation, you need to create a new calculator.\n *\n * @class ViewportColumnsCalculator\n */\n\nvar ViewportColumnsCalculator = function () {\n  _createClass(ViewportColumnsCalculator, null, [{\n    key: 'DEFAULT_WIDTH',\n\n    /**\n     * Default column width\n     *\n     * @type {Number}\n     */\n    get: function get() {\n      return 50;\n    }\n\n    /**\n     * @param {Number} viewportWidth Width of the viewport\n     * @param {Number} scrollOffset Current horizontal scroll position of the viewport\n     * @param {Number} totalColumns Total number of rows\n     * @param {Function} columnWidthFn Function that returns the width of the column at a given index (in px)\n     * @param {Function} overrideFn Function that changes calculated this.startRow, this.endRow (used by MergeCells plugin)\n     * @param {Boolean} onlyFullyVisible if `true`, only startRow and endRow will be indexes of rows that are fully in viewport\n     * @param {Boolean} stretchH\n     * @param {Function} [stretchingColumnWidthFn] Function that returns the new width of the stretched column.\n     */\n\n  }]);\n\n  function ViewportColumnsCalculator(viewportWidth, scrollOffset, totalColumns, columnWidthFn, overrideFn, onlyFullyVisible, stretchH) {\n    var stretchingColumnWidthFn = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : function (width) {\n      return width;\n    };\n\n    _classCallCheck(this, ViewportColumnsCalculator);\n\n    privatePool.set(this, {\n      viewportWidth: viewportWidth,\n      scrollOffset: scrollOffset,\n      totalColumns: totalColumns,\n      columnWidthFn: columnWidthFn,\n      overrideFn: overrideFn,\n      onlyFullyVisible: onlyFullyVisible,\n      stretchingColumnWidthFn: stretchingColumnWidthFn\n    });\n\n    /**\n     * Number of rendered/visible columns\n     *\n     * @type {Number}\n     */\n    this.count = 0;\n\n    /**\n     * Index of the first rendered/visible column (can be overwritten using overrideFn)\n     *\n     * @type {Number|null}\n     */\n    this.startColumn = null;\n\n    /**\n     * Index of the last rendered/visible column (can be overwritten using overrideFn)\n     *\n     * @type {null}\n     */\n    this.endColumn = null;\n\n    /**\n     * Position of the first rendered/visible column (in px)\n     *\n     * @type {Number|null}\n     */\n    this.startPosition = null;\n\n    this.stretchAllRatio = 0;\n    this.stretchLastWidth = 0;\n    this.stretch = stretchH;\n    this.totalTargetWidth = 0;\n    this.needVerifyLastColumnWidth = true;\n    this.stretchAllColumnsWidth = [];\n\n    this.calculate();\n  }\n\n  /**\n   * Calculates viewport\n   */\n\n\n  _createClass(ViewportColumnsCalculator, [{\n    key: 'calculate',\n    value: function calculate() {\n      var sum = 0;\n      var needReverse = true;\n      var startPositions = [];\n      var columnWidth = void 0;\n\n      var priv = privatePool.get(this);\n      var onlyFullyVisible = priv.onlyFullyVisible;\n      var overrideFn = priv.overrideFn;\n      var scrollOffset = priv.scrollOffset;\n      var totalColumns = priv.totalColumns;\n      var viewportWidth = priv.viewportWidth;\n\n      for (var i = 0; i < totalColumns; i++) {\n        columnWidth = this._getColumnWidth(i);\n\n        if (sum <= scrollOffset && !onlyFullyVisible) {\n          this.startColumn = i;\n        }\n\n        // +1 pixel for row header width compensation for horizontal scroll > 0\n        var compensatedViewportWidth = scrollOffset > 0 ? viewportWidth + 1 : viewportWidth;\n\n        if (sum >= scrollOffset && sum + columnWidth <= scrollOffset + compensatedViewportWidth) {\n          if (this.startColumn == null) {\n            this.startColumn = i;\n          }\n          this.endColumn = i;\n        }\n        startPositions.push(sum);\n        sum += columnWidth;\n\n        if (!onlyFullyVisible) {\n          this.endColumn = i;\n        }\n        if (sum >= scrollOffset + viewportWidth) {\n          needReverse = false;\n          break;\n        }\n      }\n\n      if (this.endColumn === totalColumns - 1 && needReverse) {\n        this.startColumn = this.endColumn;\n\n        while (this.startColumn > 0) {\n          var viewportSum = startPositions[this.endColumn] + columnWidth - startPositions[this.startColumn - 1];\n\n          if (viewportSum <= viewportWidth || !onlyFullyVisible) {\n            this.startColumn--;\n          }\n          if (viewportSum > viewportWidth) {\n            break;\n          }\n        }\n      }\n\n      if (this.startColumn !== null && overrideFn) {\n        overrideFn(this);\n      }\n      this.startPosition = startPositions[this.startColumn];\n\n      if (this.startPosition == void 0) {\n        this.startPosition = null;\n      }\n      if (this.startColumn !== null) {\n        this.count = this.endColumn - this.startColumn + 1;\n      }\n    }\n\n    /**\n     * Recalculate columns stretching.\n     *\n     * @param {Number} totalWidth\n     */\n\n  }, {\n    key: 'refreshStretching',\n    value: function refreshStretching(totalWidth) {\n      if (this.stretch === 'none') {\n        return;\n      }\n      this.totalTargetWidth = totalWidth;\n\n      var priv = privatePool.get(this);\n      var totalColumns = priv.totalColumns;\n      var sumAll = 0;\n\n      for (var i = 0; i < totalColumns; i++) {\n        var columnWidth = this._getColumnWidth(i);\n        var permanentColumnWidth = priv.stretchingColumnWidthFn(void 0, i);\n\n        if (typeof permanentColumnWidth === 'number') {\n          totalWidth -= permanentColumnWidth;\n        } else {\n          sumAll += columnWidth;\n        }\n      }\n      var remainingSize = totalWidth - sumAll;\n\n      if (this.stretch === 'all' && remainingSize > 0) {\n        this.stretchAllRatio = totalWidth / sumAll;\n        this.stretchAllColumnsWidth = [];\n        this.needVerifyLastColumnWidth = true;\n      } else if (this.stretch === 'last' && totalWidth !== Infinity) {\n        var _columnWidth = this._getColumnWidth(totalColumns - 1);\n        var lastColumnWidth = remainingSize + _columnWidth;\n\n        this.stretchLastWidth = lastColumnWidth >= 0 ? lastColumnWidth : _columnWidth;\n      }\n    }\n\n    /**\n     * Get stretched column width based on stretchH (all or last) setting passed in handsontable instance.\n     *\n     * @param {Number} column\n     * @param {Number} baseWidth\n     * @returns {Number|null}\n     */\n\n  }, {\n    key: 'getStretchedColumnWidth',\n    value: function getStretchedColumnWidth(column, baseWidth) {\n      var result = null;\n\n      if (this.stretch === 'all' && this.stretchAllRatio !== 0) {\n        result = this._getStretchedAllColumnWidth(column, baseWidth);\n      } else if (this.stretch === 'last' && this.stretchLastWidth !== 0) {\n        result = this._getStretchedLastColumnWidth(column);\n      }\n\n      return result;\n    }\n\n    /**\n     * @param {Number} column\n     * @param {Number} baseWidth\n     * @returns {Number}\n     * @private\n     */\n\n  }, {\n    key: '_getStretchedAllColumnWidth',\n    value: function _getStretchedAllColumnWidth(column, baseWidth) {\n      var sumRatioWidth = 0;\n      var priv = privatePool.get(this);\n      var totalColumns = priv.totalColumns;\n\n      if (!this.stretchAllColumnsWidth[column]) {\n        var stretchedWidth = Math.round(baseWidth * this.stretchAllRatio);\n        var newStretchedWidth = priv.stretchingColumnWidthFn(stretchedWidth, column);\n\n        if (newStretchedWidth === void 0) {\n          this.stretchAllColumnsWidth[column] = stretchedWidth;\n        } else {\n          this.stretchAllColumnsWidth[column] = isNaN(newStretchedWidth) ? this._getColumnWidth(column) : newStretchedWidth;\n        }\n      }\n\n      if (this.stretchAllColumnsWidth.length === totalColumns && this.needVerifyLastColumnWidth) {\n        this.needVerifyLastColumnWidth = false;\n\n        for (var i = 0; i < this.stretchAllColumnsWidth.length; i++) {\n          sumRatioWidth += this.stretchAllColumnsWidth[i];\n        }\n        if (sumRatioWidth !== this.totalTargetWidth) {\n          this.stretchAllColumnsWidth[this.stretchAllColumnsWidth.length - 1] += this.totalTargetWidth - sumRatioWidth;\n        }\n      }\n\n      return this.stretchAllColumnsWidth[column];\n    }\n\n    /**\n     * @param {Number} column\n     * @returns {Number|null}\n     * @private\n     */\n\n  }, {\n    key: '_getStretchedLastColumnWidth',\n    value: function _getStretchedLastColumnWidth(column) {\n      var priv = privatePool.get(this);\n      var totalColumns = priv.totalColumns;\n\n      if (column === totalColumns - 1) {\n        return this.stretchLastWidth;\n      }\n\n      return null;\n    }\n\n    /**\n     * @param {Number} column Column index.\n     * @returns {Number}\n     * @private\n     */\n\n  }, {\n    key: '_getColumnWidth',\n    value: function _getColumnWidth(column) {\n      var width = privatePool.get(this).columnWidthFn(column);\n\n      if (width === void 0) {\n        width = ViewportColumnsCalculator.DEFAULT_WIDTH;\n      }\n\n      return width;\n    }\n  }]);\n\n  return ViewportColumnsCalculator;\n}();\n\nexports.default = ViewportColumnsCalculator;\n\n/***/ }),\n/* 176 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar privatePool = new WeakMap();\n\n/**\n * Calculates indexes of rows to render OR rows that are visible.\n * To redo the calculation, you need to create a new calculator.\n *\n * @class ViewportRowsCalculator\n */\n\nvar ViewportRowsCalculator = function () {\n  _createClass(ViewportRowsCalculator, null, [{\n    key: \"DEFAULT_HEIGHT\",\n\n    /**\n     * Default row height\n     *\n     * @type {Number}\n     */\n    get: function get() {\n      return 23;\n    }\n\n    /**\n     * @param {Number} viewportHeight Height of the viewport\n     * @param {Number} scrollOffset Current vertical scroll position of the viewport\n     * @param {Number} totalRows Total number of rows\n     * @param {Function} rowHeightFn Function that returns the height of the row at a given index (in px)\n     * @param {Function} overrideFn Function that changes calculated this.startRow, this.endRow (used by MergeCells plugin)\n     * @param {Boolean} onlyFullyVisible if `true`, only startRow and endRow will be indexes of rows that are fully in viewport\n     * @param {Number} horizontalScrollbarHeight\n     */\n\n  }]);\n\n  function ViewportRowsCalculator(viewportHeight, scrollOffset, totalRows, rowHeightFn, overrideFn, onlyFullyVisible, horizontalScrollbarHeight) {\n    _classCallCheck(this, ViewportRowsCalculator);\n\n    privatePool.set(this, {\n      viewportHeight: viewportHeight,\n      scrollOffset: scrollOffset,\n      totalRows: totalRows,\n      rowHeightFn: rowHeightFn,\n      overrideFn: overrideFn,\n      onlyFullyVisible: onlyFullyVisible,\n      horizontalScrollbarHeight: horizontalScrollbarHeight\n    });\n\n    /**\n     * Number of rendered/visible rows\n     *\n     * @type {Number}\n     */\n    this.count = 0;\n\n    /**\n     * Index of the first rendered/visible row (can be overwritten using overrideFn)\n     *\n     * @type {Number|null}\n     */\n    this.startRow = null;\n\n    /**\n     * Index of the last rendered/visible row (can be overwritten using overrideFn)\n     *\n     * @type {null}\n     */\n    this.endRow = null;\n\n    /**\n     * Position of the first rendered/visible row (in px)\n     *\n     * @type {Number|null}\n     */\n    this.startPosition = null;\n\n    this.calculate();\n  }\n\n  /**\n   * Calculates viewport\n   */\n\n\n  _createClass(ViewportRowsCalculator, [{\n    key: \"calculate\",\n    value: function calculate() {\n      var sum = 0;\n      var needReverse = true;\n      var startPositions = [];\n\n      var priv = privatePool.get(this);\n      var onlyFullyVisible = priv.onlyFullyVisible;\n      var overrideFn = priv.overrideFn;\n      var rowHeightFn = priv.rowHeightFn;\n      var scrollOffset = priv.scrollOffset;\n      var totalRows = priv.totalRows;\n      var viewportHeight = priv.viewportHeight;\n      var horizontalScrollbarHeight = priv.horizontalScrollbarHeight || 0;\n      var rowHeight = void 0;\n\n      // Calculate the number (start and end index) of rows needed\n      for (var i = 0; i < totalRows; i++) {\n        rowHeight = rowHeightFn(i);\n\n        if (rowHeight === undefined) {\n          rowHeight = ViewportRowsCalculator.DEFAULT_HEIGHT;\n        }\n        if (sum <= scrollOffset && !onlyFullyVisible) {\n          this.startRow = i;\n        }\n\n        // the row is within the \"visible range\"\n        if (sum >= scrollOffset && sum + rowHeight <= scrollOffset + viewportHeight - horizontalScrollbarHeight) {\n          if (this.startRow === null) {\n            this.startRow = i;\n          }\n          this.endRow = i;\n        }\n        startPositions.push(sum);\n        sum += rowHeight;\n\n        if (!onlyFullyVisible) {\n          this.endRow = i;\n        }\n        if (sum >= scrollOffset + viewportHeight - horizontalScrollbarHeight) {\n          needReverse = false;\n          break;\n        }\n      }\n\n      // If the estimation has reached the last row and there is still some space available in the viewport,\n      // we need to render in reverse in order to fill the whole viewport with rows\n      if (this.endRow === totalRows - 1 && needReverse) {\n        this.startRow = this.endRow;\n\n        while (this.startRow > 0) {\n          // rowHeight is the height of the last row\n          var viewportSum = startPositions[this.endRow] + rowHeight - startPositions[this.startRow - 1];\n\n          if (viewportSum <= viewportHeight - horizontalScrollbarHeight || !onlyFullyVisible) {\n            this.startRow--;\n          }\n          if (viewportSum >= viewportHeight - horizontalScrollbarHeight) {\n            break;\n          }\n        }\n      }\n\n      if (this.startRow !== null && overrideFn) {\n        overrideFn(this);\n      }\n      this.startPosition = startPositions[this.startRow];\n\n      if (this.startPosition == void 0) {\n        this.startPosition = null;\n      }\n      if (this.startRow !== null) {\n        this.count = this.endRow - this.startRow + 1;\n      }\n    }\n  }]);\n\n  return ViewportRowsCalculator;\n}();\n\nexports.default = ViewportRowsCalculator;\n\n/***/ }),\n/* 177 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class ColumnFilter\n */\nvar ColumnFilter = function () {\n  /**\n   * @param {Number} offset\n   * @param {Number} total\n   * @param {Number} countTH\n   */\n  function ColumnFilter(offset, total, countTH) {\n    _classCallCheck(this, ColumnFilter);\n\n    this.offset = offset;\n    this.total = total;\n    this.countTH = countTH;\n  }\n\n  /**\n   * @param index\n   * @returns {Number}\n   */\n\n\n  _createClass(ColumnFilter, [{\n    key: \"offsetted\",\n    value: function offsetted(index) {\n      return index + this.offset;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"unOffsetted\",\n    value: function unOffsetted(index) {\n      return index - this.offset;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"renderedToSource\",\n    value: function renderedToSource(index) {\n      return this.offsetted(index);\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"sourceToRendered\",\n    value: function sourceToRendered(index) {\n      return this.unOffsetted(index);\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"offsettedTH\",\n    value: function offsettedTH(index) {\n      return index - this.countTH;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"unOffsettedTH\",\n    value: function unOffsettedTH(index) {\n      return index + this.countTH;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"visibleRowHeadedColumnToSourceColumn\",\n    value: function visibleRowHeadedColumnToSourceColumn(index) {\n      return this.renderedToSource(this.offsettedTH(index));\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"sourceColumnToVisibleRowHeadedColumn\",\n    value: function sourceColumnToVisibleRowHeadedColumn(index) {\n      return this.unOffsettedTH(this.sourceToRendered(index));\n    }\n  }]);\n\n  return ColumnFilter;\n}();\n\nexports.default = ColumnFilter;\n\n/***/ }),\n/* 178 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class RowFilter\n */\nvar RowFilter = function () {\n  /**\n   * @param {Number} offset\n   * @param {Number} total\n   * @param {Number} countTH\n   */\n  function RowFilter(offset, total, countTH) {\n    _classCallCheck(this, RowFilter);\n\n    this.offset = offset;\n    this.total = total;\n    this.countTH = countTH;\n  }\n\n  /**\n   * @param index\n   * @returns {Number}\n   */\n\n\n  _createClass(RowFilter, [{\n    key: \"offsetted\",\n    value: function offsetted(index) {\n      return index + this.offset;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"unOffsetted\",\n    value: function unOffsetted(index) {\n      return index - this.offset;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"renderedToSource\",\n    value: function renderedToSource(index) {\n      return this.offsetted(index);\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"sourceToRendered\",\n    value: function sourceToRendered(index) {\n      return this.unOffsetted(index);\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"offsettedTH\",\n    value: function offsettedTH(index) {\n      return index - this.countTH;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"unOffsettedTH\",\n    value: function unOffsettedTH(index) {\n      return index + this.countTH;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"visibleColHeadedRowToSourceRow\",\n    value: function visibleColHeadedRowToSourceRow(index) {\n      return this.renderedToSource(this.offsettedTH(index));\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"sourceRowToVisibleColHeadedRow\",\n    value: function sourceRowToVisibleColHeadedRow(index) {\n      return this.unOffsettedTH(this.sourceToRendered(index));\n    }\n  }]);\n\n  return RowFilter;\n}();\n\nexports.default = RowFilter;\n\n/***/ }),\n/* 179 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _string = __webpack_require__(36);\n\nvar _event = __webpack_require__(299);\n\nvar _event2 = _interopRequireDefault(_event);\n\nvar _overlays = __webpack_require__(300);\n\nvar _overlays2 = _interopRequireDefault(_overlays);\n\nvar _scroll = __webpack_require__(301);\n\nvar _scroll2 = _interopRequireDefault(_scroll);\n\nvar _settings = __webpack_require__(302);\n\nvar _settings2 = _interopRequireDefault(_settings);\n\nvar _table = __webpack_require__(303);\n\nvar _table2 = _interopRequireDefault(_table);\n\nvar _viewport = __webpack_require__(305);\n\nvar _viewport2 = _interopRequireDefault(_viewport);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Walkontable\n */\nvar Walkontable = function () {\n  /**\n   * @param {Object} settings\n   */\n  function Walkontable(settings) {\n    _classCallCheck(this, Walkontable);\n\n    var originalHeaders = [];\n\n    // this is the namespace for global events\n    this.guid = 'wt_' + (0, _string.randomString)();\n\n    // bootstrap from settings\n    if (settings.cloneSource) {\n      this.cloneSource = settings.cloneSource;\n      this.cloneOverlay = settings.cloneOverlay;\n      this.wtSettings = settings.cloneSource.wtSettings;\n      this.wtTable = new _table2.default(this, settings.table, settings.wtRootElement);\n      this.wtScroll = new _scroll2.default(this);\n      this.wtViewport = settings.cloneSource.wtViewport;\n      this.wtEvent = new _event2.default(this);\n      this.selections = this.cloneSource.selections;\n    } else {\n      this.wtSettings = new _settings2.default(this, settings);\n      this.wtTable = new _table2.default(this, settings.table);\n      this.wtScroll = new _scroll2.default(this);\n      this.wtViewport = new _viewport2.default(this);\n      this.wtEvent = new _event2.default(this);\n      this.selections = this.getSetting('selections');\n      this.wtOverlays = new _overlays2.default(this);\n      this.exportSettingsAsClassNames();\n    }\n\n    // find original headers\n    if (this.wtTable.THEAD.childNodes.length && this.wtTable.THEAD.childNodes[0].childNodes.length) {\n      for (var c = 0, clen = this.wtTable.THEAD.childNodes[0].childNodes.length; c < clen; c++) {\n        originalHeaders.push(this.wtTable.THEAD.childNodes[0].childNodes[c].innerHTML);\n      }\n      if (!this.getSetting('columnHeaders').length) {\n        this.update('columnHeaders', [function (column, TH) {\n          (0, _element.fastInnerText)(TH, originalHeaders[column]);\n        }]);\n      }\n    }\n    this.drawn = false;\n    this.drawInterrupted = false;\n  }\n\n  /**\n   * Force rerender of Walkontable\n   *\n   * @param {Boolean} [fastDraw=false] When `true`, try to refresh only the positions of borders without rerendering\n   *                                   the data. It will only work if Table.draw() does not force\n   *                                   rendering anyway\n   * @returns {Walkontable}\n   */\n\n\n  _createClass(Walkontable, [{\n    key: 'draw',\n    value: function draw() {\n      var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      this.drawInterrupted = false;\n\n      if (!fastDraw && !(0, _element.isVisible)(this.wtTable.TABLE)) {\n        // draw interrupted because TABLE is not visible\n        this.drawInterrupted = true;\n      } else {\n        this.wtTable.draw(fastDraw);\n      }\n\n      return this;\n    }\n\n    /**\n     * Returns the TD at coords. If topmost is set to true, returns TD from the topmost overlay layer,\n     * if not set or set to false, returns TD from the master table.\n     *\n     * @param {CellCoords} coords\n     * @param {Boolean} [topmost=false]\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'getCell',\n    value: function getCell(coords) {\n      var topmost = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (!topmost) {\n        return this.wtTable.getCell(coords);\n      }\n\n      var totalRows = this.wtSettings.getSetting('totalRows');\n      var fixedRowsTop = this.wtSettings.getSetting('fixedRowsTop');\n      var fixedRowsBottom = this.wtSettings.getSetting('fixedRowsBottom');\n      var fixedColumns = this.wtSettings.getSetting('fixedColumnsLeft');\n\n      if (coords.row < fixedRowsTop && coords.col < fixedColumns) {\n        return this.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell(coords);\n      } else if (coords.row < fixedRowsTop) {\n        return this.wtOverlays.topOverlay.clone.wtTable.getCell(coords);\n      } else if (coords.col < fixedColumns && coords.row >= totalRows - fixedRowsBottom) {\n        if (this.wtOverlays.bottomLeftCornerOverlay && this.wtOverlays.bottomLeftCornerOverlay.clone) {\n          return this.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.getCell(coords);\n        }\n      } else if (coords.col < fixedColumns) {\n        return this.wtOverlays.leftOverlay.clone.wtTable.getCell(coords);\n      } else if (coords.row < totalRows && coords.row > totalRows - fixedRowsBottom) {\n        if (this.wtOverlays.bottomOverlay && this.wtOverlays.bottomOverlay.clone) {\n          return this.wtOverlays.bottomOverlay.clone.wtTable.getCell(coords);\n        }\n      }\n\n      return this.wtTable.getCell(coords);\n    }\n\n    /**\n     * @param {Object} settings\n     * @param {*} value\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'update',\n    value: function update(settings, value) {\n      return this.wtSettings.update(settings, value);\n    }\n\n    /**\n     * Scroll the viewport to a row at the given index in the data source\n     *\n     * @param {Number} row\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'scrollVertical',\n    value: function scrollVertical(row) {\n      this.wtOverlays.topOverlay.scrollTo(row);\n      this.getSetting('onScrollVertically');\n\n      return this;\n    }\n\n    /**\n     * Scroll the viewport to a column at the given index in the data source\n     *\n     * @param {Number} column\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'scrollHorizontal',\n    value: function scrollHorizontal(column) {\n      this.wtOverlays.leftOverlay.scrollTo(column);\n      this.getSetting('onScrollHorizontally');\n\n      return this;\n    }\n\n    /**\n     * Scrolls the viewport to a cell (rerenders if needed)\n     *\n     * @param {CellCoords} coords\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'scrollViewport',\n    value: function scrollViewport(coords) {\n      this.wtScroll.scrollViewport(coords);\n\n      return this;\n    }\n\n    /**\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getViewport',\n    value: function getViewport() {\n      return [this.wtTable.getFirstVisibleRow(), this.wtTable.getFirstVisibleColumn(), this.wtTable.getLastVisibleRow(), this.wtTable.getLastVisibleColumn()];\n    }\n\n    /**\n     * Get overlay name\n     *\n     * @returns {String}\n     */\n\n  }, {\n    key: 'getOverlayName',\n    value: function getOverlayName() {\n      return this.cloneOverlay ? this.cloneOverlay.type : 'master';\n    }\n\n    /**\n     * Check overlay type of this Walkontable instance.\n     *\n     * @param {String} name Clone type @see {Overlay.CLONE_TYPES}.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isOverlayName',\n    value: function isOverlayName(name) {\n      if (this.cloneOverlay) {\n        return this.cloneOverlay.type === name;\n      }\n\n      return false;\n    }\n\n    /**\n     * Export settings as class names added to the parent element of the table.\n     */\n\n  }, {\n    key: 'exportSettingsAsClassNames',\n    value: function exportSettingsAsClassNames() {\n      var _this = this;\n\n      var toExport = {\n        rowHeaders: ['array'],\n        columnHeaders: ['array']\n      };\n      var allClassNames = [];\n      var newClassNames = [];\n\n      (0, _object.objectEach)(toExport, function (optionType, key) {\n        if (optionType.indexOf('array') > -1 && _this.getSetting(key).length) {\n          newClassNames.push('ht' + (0, _string.toUpperCaseFirst)(key));\n        }\n        allClassNames.push('ht' + (0, _string.toUpperCaseFirst)(key));\n      });\n      (0, _element.removeClass)(this.wtTable.wtRootElement.parentNode, allClassNames);\n      (0, _element.addClass)(this.wtTable.wtRootElement.parentNode, newClassNames);\n    }\n\n    /**\n     * Get/Set Walkontable instance setting\n     *\n     * @param {String} key\n     * @param {*} [param1]\n     * @param {*} [param2]\n     * @param {*} [param3]\n     * @param {*} [param4]\n     * @returns {*}\n     */\n\n  }, {\n    key: 'getSetting',\n    value: function getSetting(key, param1, param2, param3, param4) {\n      // this is faster than .apply - https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\n      return this.wtSettings.getSetting(key, param1, param2, param3, param4);\n    }\n\n    /**\n     * Checks if setting exists\n     *\n     * @param {String} key\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasSetting',\n    value: function hasSetting(key) {\n      return this.wtSettings.has(key);\n    }\n\n    /**\n     * Destroy instance\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.wtOverlays.destroy();\n      this.wtEvent.destroy();\n    }\n  }]);\n\n  return Walkontable;\n}();\n\nexports.default = Walkontable;\n\n/***/ }),\n/* 180 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 181 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 182 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 183 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 184 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 185 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 186 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 187 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 188 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 189 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 190 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 191 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 192 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 193 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 194 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 195 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 196 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 197 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 198 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 199 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 200 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 201 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 202 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 203 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 204 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 205 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 206 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 207 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 208 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 209 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 210 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 211 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 212 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 213 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 214 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 215 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 216 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 217 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 218 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 219 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 220 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 221 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 222 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 223 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 224 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 225 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 226 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 227 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 228 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 229 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 230 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 231 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 232 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 233 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 234 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 235 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 236 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 237 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 238 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 239 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 240 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 241 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 242 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 243 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 244 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 245 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 246 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 247 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 248 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 249 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 250 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 251 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 252 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 253 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 254 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 255 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 256 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 257 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 258 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 259 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 260 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 261 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 262 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 263 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 264 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 265 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 266 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 267 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 268 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 269 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 270 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 271 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 272 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 273 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 274 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 275 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 276 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 277 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 278 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 279 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 280 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 281 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 282 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 283 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 284 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 285 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 286 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 287 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 288 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 289 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 290 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 291 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 292 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 293 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 294 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 295 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 296 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 297 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 298 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 299 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _function = __webpack_require__(43);\n\nvar _browser = __webpack_require__(27);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n *\n */\nfunction Event(instance) {\n  var that = this;\n  var eventManager = new _eventManager2.default(instance);\n  var selectedCellBeforeTouchEnd = void 0;\n\n  this.instance = instance;\n\n  var dblClickOrigin = [null, null];\n  this.dblClickTimeout = [null, null];\n\n  var onMouseDown = function onMouseDown(event) {\n    var activeElement = document.activeElement;\n    var getParentNode = (0, _function.partial)(_element.getParent, event.realTarget);\n    var realTarget = event.realTarget;\n\n    // ignore focusable element from mouse down processing (https://github.com/handsontable/handsontable/issues/3555)\n    if (realTarget === activeElement || getParentNode(0) === activeElement || getParentNode(1) === activeElement) {\n      return;\n    }\n\n    var cell = that.parentCell(realTarget);\n\n    if ((0, _element.hasClass)(realTarget, 'corner')) {\n      that.instance.getSetting('onCellCornerMouseDown', event, realTarget);\n    } else if (cell.TD) {\n      if (that.instance.hasSetting('onCellMouseDown')) {\n        that.instance.getSetting('onCellMouseDown', event, cell.coords, cell.TD, that.instance);\n      }\n    }\n\n    if (event.button !== 2) {\n      // if not right mouse button\n      if (cell.TD) {\n        dblClickOrigin[0] = cell.TD;\n        clearTimeout(that.dblClickTimeout[0]);\n        that.dblClickTimeout[0] = setTimeout(function () {\n          dblClickOrigin[0] = null;\n        }, 1000);\n      }\n    }\n  };\n\n  var onTouchMove = function onTouchMove(event) {\n    that.instance.touchMoving = true;\n  };\n\n  var onTouchStart = function onTouchStart(event) {\n    eventManager.addEventListener(this, 'touchmove', onTouchMove);\n\n    // Prevent cell selection when scrolling with touch event - not the best solution performance-wise\n    that.checkIfTouchMove = setTimeout(function () {\n      if (that.instance.touchMoving === true) {\n        that.instance.touchMoving = void 0;\n\n        eventManager.removeEventListener('touchmove', onTouchMove, false);\n      }\n\n      onMouseDown(event);\n    }, 30);\n  };\n\n  var onMouseOver = function onMouseOver(event) {\n    var table, td, mainWOT;\n\n    if (that.instance.hasSetting('onCellMouseOver')) {\n      table = that.instance.wtTable.TABLE;\n      td = (0, _element.closestDown)(event.realTarget, ['TD', 'TH'], table);\n      mainWOT = that.instance.cloneSource || that.instance;\n\n      if (td && td !== mainWOT.lastMouseOver && (0, _element.isChildOf)(td, table)) {\n        mainWOT.lastMouseOver = td;\n\n        that.instance.getSetting('onCellMouseOver', event, that.instance.wtTable.getCoords(td), td, that.instance);\n      }\n    }\n  };\n\n  var onMouseOut = function onMouseOut(event) {\n    var table = void 0;\n    var lastTD = void 0;\n    var nextTD = void 0;\n\n    if (that.instance.hasSetting('onCellMouseOut')) {\n      table = that.instance.wtTable.TABLE;\n      lastTD = (0, _element.closestDown)(event.realTarget, ['TD', 'TH'], table);\n      nextTD = (0, _element.closestDown)(event.relatedTarget, ['TD', 'TH'], table);\n\n      if (lastTD && lastTD !== nextTD && (0, _element.isChildOf)(lastTD, table)) {\n        that.instance.getSetting('onCellMouseOut', event, that.instance.wtTable.getCoords(lastTD), lastTD, that.instance);\n      }\n    }\n  };\n\n  var onMouseUp = function onMouseUp(event) {\n    if (event.button !== 2) {\n      // if not right mouse button\n      var cell = that.parentCell(event.realTarget);\n\n      if (cell.TD === dblClickOrigin[0] && cell.TD === dblClickOrigin[1]) {\n        if ((0, _element.hasClass)(event.realTarget, 'corner')) {\n          that.instance.getSetting('onCellCornerDblClick', event, cell.coords, cell.TD, that.instance);\n        } else {\n          that.instance.getSetting('onCellDblClick', event, cell.coords, cell.TD, that.instance);\n        }\n\n        dblClickOrigin[0] = null;\n        dblClickOrigin[1] = null;\n      } else if (cell.TD === dblClickOrigin[0]) {\n        that.instance.getSetting('onCellMouseUp', event, cell.coords, cell.TD, that.instance);\n\n        dblClickOrigin[1] = cell.TD;\n        clearTimeout(that.dblClickTimeout[1]);\n        that.dblClickTimeout[1] = setTimeout(function () {\n          dblClickOrigin[1] = null;\n        }, 500);\n      } else if (cell.TD && that.instance.hasSetting('onCellMouseUp')) {\n        that.instance.getSetting('onCellMouseUp', event, cell.coords, cell.TD, that.instance);\n      }\n    }\n  };\n\n  var selectedCellWasTouched = function selectedCellWasTouched(touchTarget) {\n    var cellUnderFinger = that.parentCell(touchTarget);\n    var coordsOfCellUnderFinger = cellUnderFinger.coords;\n\n    if (selectedCellBeforeTouchEnd && coordsOfCellUnderFinger) {\n      var _ref = [coordsOfCellUnderFinger.row, selectedCellBeforeTouchEnd.from.row],\n          rowTouched = _ref[0],\n          rowSelected = _ref[1];\n      var _ref2 = [coordsOfCellUnderFinger.col, selectedCellBeforeTouchEnd.from.col],\n          colTouched = _ref2[0],\n          colSelected = _ref2[1];\n\n\n      return rowTouched === rowSelected && colTouched === colSelected;\n    }\n\n    return false;\n  };\n\n  var onTouchEnd = function onTouchEnd(event) {\n    var excludeTags = ['A', 'BUTTON', 'INPUT'];\n    var target = event.target;\n\n    // touched link which was placed inside a cell (a cell with DOM `a` element) WILL NOT trigger the below function calls\n    // and as consequence will behave as standard (open the link).\n    if (selectedCellWasTouched(target) === false || excludeTags.includes(target.tagName) === false) {\n      event.preventDefault();\n      onMouseUp(event);\n    }\n  };\n\n  eventManager.addEventListener(this.instance.wtTable.holder, 'mousedown', onMouseDown);\n  eventManager.addEventListener(this.instance.wtTable.TABLE, 'mouseover', onMouseOver);\n  eventManager.addEventListener(this.instance.wtTable.TABLE, 'mouseout', onMouseOut);\n  eventManager.addEventListener(this.instance.wtTable.holder, 'mouseup', onMouseUp);\n\n  // check if full HOT instance, or detached WOT AND run on mobile device\n  if (this.instance.wtTable.holder.parentNode.parentNode && (0, _browser.isMobileBrowser)() && !that.instance.wtTable.isWorkingOnClone()) {\n    var classSelector = '.' + this.instance.wtTable.holder.parentNode.className.split(' ').join('.');\n\n    eventManager.addEventListener(this.instance.wtTable.holder, 'touchstart', function (event) {\n      selectedCellBeforeTouchEnd = instance.selections.getCell().cellRange;\n\n      that.instance.touchApplied = true;\n      if ((0, _element.isChildOf)(event.target, classSelector)) {\n        onTouchStart.call(event.target, event);\n      }\n    });\n    eventManager.addEventListener(this.instance.wtTable.holder, 'touchend', function (event) {\n      that.instance.touchApplied = false;\n      if ((0, _element.isChildOf)(event.target, classSelector)) {\n        onTouchEnd.call(event.target, event);\n      }\n    });\n\n    if (!that.instance.momentumScrolling) {\n      that.instance.momentumScrolling = {};\n    }\n    eventManager.addEventListener(this.instance.wtTable.holder, 'scroll', function (event) {\n      clearTimeout(that.instance.momentumScrolling._timeout);\n\n      if (!that.instance.momentumScrolling.ongoing) {\n        that.instance.getSetting('onBeforeTouchScroll');\n      }\n      that.instance.momentumScrolling.ongoing = true;\n\n      that.instance.momentumScrolling._timeout = setTimeout(function () {\n        if (!that.instance.touchApplied) {\n          that.instance.momentumScrolling.ongoing = false;\n\n          that.instance.getSetting('onAfterMomentumScroll');\n        }\n      }, 200);\n    });\n  }\n\n  eventManager.addEventListener(window, 'resize', function () {\n    if (that.instance.getSetting('stretchH') !== 'none') {\n      that.instance.draw();\n    }\n  });\n\n  this.destroy = function () {\n    clearTimeout(this.dblClickTimeout[0]);\n    clearTimeout(this.dblClickTimeout[1]);\n\n    eventManager.destroy();\n  };\n}\n\nEvent.prototype.parentCell = function (elem) {\n  var cell = {};\n  var TABLE = this.instance.wtTable.TABLE;\n  var TD = (0, _element.closestDown)(elem, ['TD', 'TH'], TABLE);\n\n  if (TD) {\n    cell.coords = this.instance.wtTable.getCoords(TD);\n    cell.TD = TD;\n  } else if ((0, _element.hasClass)(elem, 'wtBorder') && (0, _element.hasClass)(elem, 'current')) {\n    cell.coords = this.instance.selections.getCell().cellRange.highlight;\n    cell.TD = this.instance.wtTable.getCell(cell.coords);\n  } else if ((0, _element.hasClass)(elem, 'wtBorder') && (0, _element.hasClass)(elem, 'area')) {\n    if (this.instance.selections.createOrGetArea().cellRange) {\n      cell.coords = this.instance.selections.createOrGetArea().cellRange.to;\n      cell.TD = this.instance.wtTable.getCell(cell.coords);\n    }\n  }\n\n  return cell;\n};\n\nexports.default = Event;\n\n/***/ }),\n/* 300 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _unicode = __webpack_require__(21);\n\nvar _browser = __webpack_require__(27);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Overlays\n */\nvar Overlays = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function Overlays(wotInstance) {\n    _classCallCheck(this, Overlays);\n\n    /**\n     * Sometimes `line-height` might be set to 'normal'. In that case, a default `font-size` should be multiplied by roughly 1.2.\n     * https://developer.mozilla.org/pl/docs/Web/CSS/line-height#Values\n     */\n    var BODY_LINE_HEIGHT = parseInt(getComputedStyle(document.body).lineHeight, 10);\n    var FALLBACK_BODY_LINE_HEIGHT = parseInt(getComputedStyle(document.body).fontSize, 10) * 1.2;\n\n    this.wot = wotInstance;\n\n    // legacy support\n    this.instance = this.wot;\n    this.eventManager = new _eventManager2.default(this.wot);\n\n    this.wot.update('scrollbarWidth', (0, _element.getScrollbarWidth)());\n    this.wot.update('scrollbarHeight', (0, _element.getScrollbarWidth)());\n\n    this.scrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);\n\n    this.prepareOverlays();\n\n    this.destroyed = false;\n    this.keyPressed = false;\n    this.spreaderLastSize = {\n      width: null,\n      height: null\n    };\n    this.overlayScrollPositions = {\n      master: {\n        top: 0,\n        left: 0\n      },\n      top: {\n        top: null,\n        left: 0\n      },\n      bottom: {\n        top: null,\n        left: 0\n      },\n      left: {\n        top: 0,\n        left: null\n      }\n    };\n\n    this.pendingScrollCallbacks = {\n      master: {\n        top: 0,\n        left: 0\n      },\n      top: {\n        left: 0\n      },\n      bottom: {\n        left: 0\n      },\n      left: {\n        top: 0\n      }\n    };\n\n    this.verticalScrolling = false;\n    this.horizontalScrolling = false;\n    this.delegatedScrollCallback = false;\n\n    this.registeredListeners = [];\n\n    this.browserLineHeight = BODY_LINE_HEIGHT || FALLBACK_BODY_LINE_HEIGHT;\n\n    this.registerListeners();\n  }\n\n  /**\n   * Prepare overlays based on user settings.\n   *\n   * @returns {Boolean} Returns `true` if changes applied to overlay needs scroll synchronization.\n   */\n\n\n  _createClass(Overlays, [{\n    key: 'prepareOverlays',\n    value: function prepareOverlays() {\n      var syncScroll = false;\n\n      if (this.topOverlay) {\n        syncScroll = this.topOverlay.updateStateOfRendering() || syncScroll;\n      } else {\n        this.topOverlay = _base2.default.createOverlay(_base2.default.CLONE_TOP, this.wot);\n      }\n\n      if (!_base2.default.hasOverlay(_base2.default.CLONE_BOTTOM)) {\n        this.bottomOverlay = {\n          needFullRender: false,\n          updateStateOfRendering: function updateStateOfRendering() {\n            return false;\n          }\n        };\n      }\n      if (!_base2.default.hasOverlay(_base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n        this.bottomLeftCornerOverlay = {\n          needFullRender: false,\n          updateStateOfRendering: function updateStateOfRendering() {\n            return false;\n          }\n        };\n      }\n\n      if (this.bottomOverlay) {\n        syncScroll = this.bottomOverlay.updateStateOfRendering() || syncScroll;\n      } else {\n        this.bottomOverlay = _base2.default.createOverlay(_base2.default.CLONE_BOTTOM, this.wot);\n      }\n\n      if (this.leftOverlay) {\n        syncScroll = this.leftOverlay.updateStateOfRendering() || syncScroll;\n      } else {\n        this.leftOverlay = _base2.default.createOverlay(_base2.default.CLONE_LEFT, this.wot);\n      }\n\n      if (this.topOverlay.needFullRender && this.leftOverlay.needFullRender) {\n        if (this.topLeftCornerOverlay) {\n          syncScroll = this.topLeftCornerOverlay.updateStateOfRendering() || syncScroll;\n        } else {\n          this.topLeftCornerOverlay = _base2.default.createOverlay(_base2.default.CLONE_TOP_LEFT_CORNER, this.wot);\n        }\n      }\n\n      if (this.bottomOverlay.needFullRender && this.leftOverlay.needFullRender) {\n        if (this.bottomLeftCornerOverlay) {\n          syncScroll = this.bottomLeftCornerOverlay.updateStateOfRendering() || syncScroll;\n        } else {\n          this.bottomLeftCornerOverlay = _base2.default.createOverlay(_base2.default.CLONE_BOTTOM_LEFT_CORNER, this.wot);\n        }\n      }\n\n      if (this.wot.getSetting('debug') && !this.debug) {\n        this.debug = _base2.default.createOverlay(_base2.default.CLONE_DEBUG, this.wot);\n      }\n\n      return syncScroll;\n    }\n\n    /**\n     * Refresh and redraw table\n     */\n\n  }, {\n    key: 'refreshAll',\n    value: function refreshAll() {\n      if (!this.wot.drawn) {\n        return;\n      }\n      if (!this.wot.wtTable.holder.parentNode) {\n        // Walkontable was detached from DOM, but this handler was not removed\n        this.destroy();\n\n        return;\n      }\n      this.wot.draw(true);\n\n      if (this.verticalScrolling) {\n        this.leftOverlay.onScroll();\n      }\n\n      if (this.horizontalScrolling) {\n        this.topOverlay.onScroll();\n      }\n\n      this.verticalScrolling = false;\n      this.horizontalScrolling = false;\n    }\n\n    /**\n     * Register all necessary event listeners.\n     */\n\n  }, {\n    key: 'registerListeners',\n    value: function registerListeners() {\n      var _this = this;\n\n      var topOverlayScrollable = this.topOverlay.mainTableScrollableElement;\n      var leftOverlayScrollable = this.leftOverlay.mainTableScrollableElement;\n\n      var listenersToRegister = [];\n      listenersToRegister.push([document.documentElement, 'keydown', function (event) {\n        return _this.onKeyDown(event);\n      }]);\n      listenersToRegister.push([document.documentElement, 'keyup', function () {\n        return _this.onKeyUp();\n      }]);\n      listenersToRegister.push([document, 'visibilitychange', function () {\n        return _this.onKeyUp();\n      }]);\n      listenersToRegister.push([topOverlayScrollable, 'scroll', function (event) {\n        return _this.onTableScroll(event);\n      }]);\n\n      if (topOverlayScrollable !== leftOverlayScrollable) {\n        listenersToRegister.push([leftOverlayScrollable, 'scroll', function (event) {\n          return _this.onTableScroll(event);\n        }]);\n      }\n\n      var isHighPixelRatio = window.devicePixelRatio && window.devicePixelRatio > 1;\n\n      if (isHighPixelRatio || !(0, _browser.isChrome)()) {\n        listenersToRegister.push([this.instance.wtTable.wtRootElement.parentNode, 'wheel', function (event) {\n          return _this.onCloneWheel(event);\n        }]);\n      } else {\n        if (this.topOverlay.needFullRender) {\n          listenersToRegister.push([this.topOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n\n        if (this.bottomOverlay.needFullRender) {\n          listenersToRegister.push([this.bottomOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n\n        if (this.leftOverlay.needFullRender) {\n          listenersToRegister.push([this.leftOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n\n        if (this.topLeftCornerOverlay && this.topLeftCornerOverlay.needFullRender) {\n          listenersToRegister.push([this.topLeftCornerOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n\n        if (this.bottomLeftCornerOverlay && this.bottomLeftCornerOverlay.needFullRender) {\n          listenersToRegister.push([this.bottomLeftCornerOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n      }\n\n      if (this.topOverlay.trimmingContainer !== window && this.leftOverlay.trimmingContainer !== window) {\n        // This is necessary?\n        // eventManager.addEventListener(window, 'scroll', (event) => this.refreshAll(event));\n        listenersToRegister.push([window, 'wheel', function (event) {\n          var overlay = void 0;\n          var deltaY = event.wheelDeltaY || event.deltaY;\n          var deltaX = event.wheelDeltaX || event.deltaX;\n\n          if (_this.topOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'top';\n          } else if (_this.bottomOverlay.clone && _this.bottomOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'bottom';\n          } else if (_this.leftOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'left';\n          } else if (_this.topLeftCornerOverlay && _this.topLeftCornerOverlay.clone && _this.topLeftCornerOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'topLeft';\n          } else if (_this.bottomLeftCornerOverlay && _this.bottomLeftCornerOverlay.clone && _this.bottomLeftCornerOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'bottomLeft';\n          }\n\n          if (overlay === 'top' && deltaY !== 0 || overlay === 'left' && deltaX !== 0 || overlay === 'bottom' && deltaY !== 0 || (overlay === 'topLeft' || overlay === 'bottomLeft') && (deltaY !== 0 || deltaX !== 0)) {\n\n            event.preventDefault();\n          }\n        }]);\n      }\n\n      while (listenersToRegister.length) {\n        var listener = listenersToRegister.pop();\n        this.eventManager.addEventListener(listener[0], listener[1], listener[2]);\n\n        this.registeredListeners.push(listener);\n      }\n    }\n\n    /**\n     * Deregister all previously registered listeners.\n     */\n\n  }, {\n    key: 'deregisterListeners',\n    value: function deregisterListeners() {\n      while (this.registeredListeners.length) {\n        var listener = this.registeredListeners.pop();\n        this.eventManager.removeEventListener(listener[0], listener[1], listener[2]);\n      }\n    }\n\n    /**\n     * Scroll listener\n     *\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onTableScroll',\n    value: function onTableScroll(event) {\n      // There was if statement which controlled flow of this function. It avoided the execution of the next lines\n      // on mobile devices. It was changed. Broader description of this case is included within issue #4856.\n\n      var masterHorizontal = this.leftOverlay.mainTableScrollableElement;\n      var masterVertical = this.topOverlay.mainTableScrollableElement;\n      var target = event.target;\n\n      // For key press, sync only master -> overlay position because while pressing Walkontable.render is triggered\n      // by hot.refreshBorder\n      if (this.keyPressed) {\n        if (masterVertical !== window && target !== window && !event.target.contains(masterVertical) || masterHorizontal !== window && target !== window && !event.target.contains(masterHorizontal)) {\n          return;\n        }\n      }\n\n      this.syncScrollPositions(event);\n    }\n\n    /**\n     * Wheel listener for cloned overlays.\n     *\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onCloneWheel',\n    value: function onCloneWheel(event) {\n      if (this.scrollableElement !== window) {\n        event.preventDefault();\n      }\n      // There was if statement which controlled flow of this function. It avoided the execution of the next lines\n      // on mobile devices. It was changed. Broader description of this case is included within issue #4856.\n\n      var masterHorizontal = this.leftOverlay.mainTableScrollableElement;\n      var masterVertical = this.topOverlay.mainTableScrollableElement;\n      var target = event.target;\n\n      // For key press, sync only master -> overlay position because while pressing Walkontable.render is triggered\n      // by hot.refreshBorder\n      var shouldNotWheelVertically = masterVertical !== window && target !== window && !event.target.contains(masterVertical);\n      var shouldNotWheelHorizontally = masterHorizontal !== window && target !== window && !event.target.contains(masterHorizontal);\n\n      if (this.keyPressed && (shouldNotWheelVertically || shouldNotWheelHorizontally)) {\n        return;\n      }\n\n      this.translateMouseWheelToScroll(event);\n    }\n\n    /**\n     * Key down listener\n     */\n\n  }, {\n    key: 'onKeyDown',\n    value: function onKeyDown(event) {\n      this.keyPressed = (0, _unicode.isKey)(event.keyCode, 'ARROW_UP|ARROW_RIGHT|ARROW_DOWN|ARROW_LEFT');\n    }\n\n    /**\n     * Key up listener\n     */\n\n  }, {\n    key: 'onKeyUp',\n    value: function onKeyUp() {\n      this.keyPressed = false;\n    }\n\n    /**\n     * Translate wheel event into scroll event and sync scroll overlays position\n     *\n     * @private\n     * @param {Event} event\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'translateMouseWheelToScroll',\n    value: function translateMouseWheelToScroll(event) {\n      var deltaY = isNaN(event.deltaY) ? -1 * event.wheelDeltaY : event.deltaY;\n      var deltaX = isNaN(event.deltaX) ? -1 * event.wheelDeltaX : event.deltaX;\n\n      if (event.deltaMode === 1) {\n        deltaX += deltaX * this.browserLineHeight;\n        deltaY += deltaY * this.browserLineHeight;\n      }\n\n      this.scrollVertically(deltaY);\n      this.scrollHorizontally(deltaX);\n\n      return false;\n    }\n  }, {\n    key: 'scrollVertically',\n    value: function scrollVertically(distance) {\n      if (distance === 0) {\n        return 0;\n      }\n      this.scrollableElement.scrollTop += distance;\n    }\n  }, {\n    key: 'scrollHorizontally',\n    value: function scrollHorizontally(distance) {\n      if (distance === 0) {\n        return 0;\n      }\n      this.scrollableElement.scrollLeft += distance;\n    }\n\n    /**\n     * Synchronize scroll position between master table and overlay table.\n     *\n     * @private\n     * @param {Event|Object} event\n     */\n\n  }, {\n    key: 'syncScrollPositions',\n    value: function syncScrollPositions(event) {\n      if (this.destroyed) {\n        return;\n      }\n\n      var topHolder = this.topOverlay.clone.wtTable.holder;\n      var leftHolder = this.leftOverlay.clone.wtTable.holder;\n\n      var _ref = [this.scrollableElement.scrollLeft, this.scrollableElement.scrollTop],\n          scrollLeft = _ref[0],\n          scrollTop = _ref[1];\n\n\n      this.horizontalScrolling = topHolder.scrollLeft !== scrollLeft;\n      this.verticalScrolling = leftHolder.scrollTop !== scrollTop;\n\n      if (this.horizontalScrolling) {\n        topHolder.scrollLeft = scrollLeft;\n      }\n\n      if (this.verticalScrolling) {\n        leftHolder.scrollTop = scrollTop;\n\n        if (this.bottomOverlay.needFullRender) {\n          this.bottomOverlay.clone.wtTable.holder.scrollLeft = scrollLeft;\n        }\n      }\n\n      this.refreshAll();\n    }\n\n    /**\n     * Synchronize overlay scrollbars with the master scrollbar\n     */\n\n  }, {\n    key: 'syncScrollWithMaster',\n    value: function syncScrollWithMaster() {\n      var master = this.topOverlay.mainTableScrollableElement;\n      var scrollLeft = master.scrollLeft,\n          scrollTop = master.scrollTop;\n\n\n      if (this.topOverlay.needFullRender) {\n        this.topOverlay.clone.wtTable.holder.scrollLeft = scrollLeft;\n      }\n      if (this.bottomOverlay.needFullRender) {\n        this.bottomOverlay.clone.wtTable.holder.scrollLeft = scrollLeft;\n      }\n      if (this.leftOverlay.needFullRender) {\n        this.leftOverlay.clone.wtTable.holder.scrollTop = scrollTop;\n      }\n    }\n\n    /**\n     * Update the main scrollable elements for all the overlays.\n     */\n\n  }, {\n    key: 'updateMainScrollableElements',\n    value: function updateMainScrollableElements() {\n      this.deregisterListeners();\n\n      this.leftOverlay.updateMainScrollableElement();\n      this.topOverlay.updateMainScrollableElement();\n\n      if (this.bottomOverlay.needFullRender) {\n        this.bottomOverlay.updateMainScrollableElement();\n      }\n\n      this.scrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);\n\n      this.registerListeners();\n    }\n\n    /**\n     *\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.eventManager.destroy();\n      this.topOverlay.destroy();\n\n      if (this.bottomOverlay.clone) {\n        this.bottomOverlay.destroy();\n      }\n      this.leftOverlay.destroy();\n\n      if (this.topLeftCornerOverlay) {\n        this.topLeftCornerOverlay.destroy();\n      }\n\n      if (this.bottomLeftCornerOverlay && this.bottomLeftCornerOverlay.clone) {\n        this.bottomLeftCornerOverlay.destroy();\n      }\n\n      if (this.debug) {\n        this.debug.destroy();\n      }\n      this.destroyed = true;\n    }\n\n    /**\n     * @param {Boolean} [fastDraw=false]\n     */\n\n  }, {\n    key: 'refresh',\n    value: function refresh() {\n      var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (this.topOverlay.areElementSizesAdjusted && this.leftOverlay.areElementSizesAdjusted) {\n        var container = this.wot.wtTable.wtRootElement.parentNode || this.wot.wtTable.wtRootElement;\n        var width = container.clientWidth;\n        var height = container.clientHeight;\n\n        if (width !== this.spreaderLastSize.width || height !== this.spreaderLastSize.height) {\n          this.spreaderLastSize.width = width;\n          this.spreaderLastSize.height = height;\n          this.adjustElementsSize();\n        }\n      }\n\n      if (this.bottomOverlay.clone) {\n        this.bottomOverlay.refresh(fastDraw);\n      }\n\n      this.leftOverlay.refresh(fastDraw);\n      this.topOverlay.refresh(fastDraw);\n\n      if (this.topLeftCornerOverlay) {\n        this.topLeftCornerOverlay.refresh(fastDraw);\n      }\n\n      if (this.bottomLeftCornerOverlay && this.bottomLeftCornerOverlay.clone) {\n        this.bottomLeftCornerOverlay.refresh(fastDraw);\n      }\n\n      if (this.debug) {\n        this.debug.refresh(fastDraw);\n      }\n    }\n\n    /**\n     * Adjust overlays elements size and master table size\n     *\n     * @param {Boolean} [force=false]\n     */\n\n  }, {\n    key: 'adjustElementsSize',\n    value: function adjustElementsSize() {\n      var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      var totalColumns = this.wot.getSetting('totalColumns');\n      var totalRows = this.wot.getSetting('totalRows');\n      var headerRowSize = this.wot.wtViewport.getRowHeaderWidth();\n      var headerColumnSize = this.wot.wtViewport.getColumnHeaderHeight();\n      var hiderStyle = this.wot.wtTable.hider.style;\n\n      hiderStyle.width = headerRowSize + this.leftOverlay.sumCellSizes(0, totalColumns) + 'px';\n      hiderStyle.height = headerColumnSize + this.topOverlay.sumCellSizes(0, totalRows) + 1 + 'px';\n\n      this.topOverlay.adjustElementsSize(force);\n      this.leftOverlay.adjustElementsSize(force);\n\n      if (this.bottomOverlay.clone) {\n        this.bottomOverlay.adjustElementsSize(force);\n      }\n    }\n\n    /**\n     *\n     */\n\n  }, {\n    key: 'applyToDOM',\n    value: function applyToDOM() {\n      if (!this.topOverlay.areElementSizesAdjusted || !this.leftOverlay.areElementSizesAdjusted) {\n        this.adjustElementsSize();\n      }\n      this.topOverlay.applyToDOM();\n\n      if (this.bottomOverlay.clone) {\n        this.bottomOverlay.applyToDOM();\n      }\n\n      this.leftOverlay.applyToDOM();\n    }\n\n    /**\n     * Get the parent overlay of the provided element.\n     *\n     * @param {HTMLElement} element\n     * @returns {Object|null}\n     */\n\n  }, {\n    key: 'getParentOverlay',\n    value: function getParentOverlay(element) {\n      if (!element) {\n        return null;\n      }\n\n      var overlays = [this.topOverlay, this.leftOverlay, this.bottomOverlay, this.topLeftCornerOverlay, this.bottomLeftCornerOverlay];\n      var result = null;\n\n      (0, _array.arrayEach)(overlays, function (elem, i) {\n        if (!elem) {\n          return;\n        }\n\n        if (elem.clone && elem.clone.wtTable.TABLE.contains(element)) {\n          result = elem.clone;\n        }\n      });\n\n      return result;\n    }\n  }]);\n\n  return Overlays;\n}();\n\nexports.default = Overlays;\n\n/***/ }),\n/* 301 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _number = __webpack_require__(5);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Scroll\n */\nvar Scroll = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function Scroll(wotInstance) {\n    _classCallCheck(this, Scroll);\n\n    this.wot = wotInstance;\n\n    // legacy support\n    this.instance = wotInstance;\n  }\n\n  /**\n   * Scrolls viewport to a cell by minimum number of cells\n   *\n   * @param {CellCoords} coords\n   */\n\n\n  _createClass(Scroll, [{\n    key: 'scrollViewport',\n    value: function scrollViewport(coords) {\n      if (!this.wot.drawn) {\n        return;\n      }\n\n      var _getVariables2 = this._getVariables(),\n          topOverlay = _getVariables2.topOverlay,\n          leftOverlay = _getVariables2.leftOverlay,\n          totalRows = _getVariables2.totalRows,\n          totalColumns = _getVariables2.totalColumns,\n          fixedRowsTop = _getVariables2.fixedRowsTop,\n          fixedRowsBottom = _getVariables2.fixedRowsBottom,\n          fixedColumnsLeft = _getVariables2.fixedColumnsLeft;\n\n      if (coords.row < 0 || coords.row > Math.max(totalRows - 1, 0)) {\n        throw new Error('row ' + coords.row + ' does not exist');\n      }\n\n      if (coords.col < 0 || coords.col > Math.max(totalColumns - 1, 0)) {\n        throw new Error('column ' + coords.col + ' does not exist');\n      }\n\n      if (coords.row >= fixedRowsTop && coords.row < this.getFirstVisibleRow()) {\n        topOverlay.scrollTo(coords.row);\n      } else if (coords.row > this.getLastVisibleRow() && coords.row < totalRows - fixedRowsBottom) {\n        topOverlay.scrollTo(coords.row, true);\n      }\n\n      if (coords.col >= fixedColumnsLeft && coords.col < this.getFirstVisibleColumn()) {\n        leftOverlay.scrollTo(coords.col);\n      } else if (coords.col > this.getLastVisibleColumn()) {\n        leftOverlay.scrollTo(coords.col, true);\n      }\n    }\n\n    /**\n     * Get first visible row based on virtual dom and how table is visible in browser window viewport.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getFirstVisibleRow',\n    value: function getFirstVisibleRow() {\n      var _getVariables3 = this._getVariables(),\n          topOverlay = _getVariables3.topOverlay,\n          wtTable = _getVariables3.wtTable,\n          wtViewport = _getVariables3.wtViewport,\n          totalRows = _getVariables3.totalRows,\n          fixedRowsTop = _getVariables3.fixedRowsTop;\n\n      var firstVisibleRow = wtTable.getFirstVisibleRow();\n\n      if (topOverlay.mainTableScrollableElement === window) {\n        var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);\n        var totalTableHeight = (0, _element.innerHeight)(wtTable.hider);\n        var windowHeight = (0, _element.innerHeight)(window);\n        var windowScrollTop = (0, _element.getScrollTop)(window);\n\n        // Only calculate firstVisibleRow when table didn't filled (from up) whole viewport space\n        if (rootElementOffset.top + totalTableHeight - windowHeight <= windowScrollTop) {\n          var rowsHeight = wtViewport.getColumnHeaderHeight();\n\n          rowsHeight += topOverlay.sumCellSizes(0, fixedRowsTop);\n\n          (0, _number.rangeEachReverse)(totalRows, 1, function (row) {\n            rowsHeight += topOverlay.sumCellSizes(row - 1, row);\n\n            if (rootElementOffset.top + totalTableHeight - rowsHeight <= windowScrollTop) {\n              // Return physical row + 1\n              firstVisibleRow = row;\n\n              return false;\n            }\n          });\n        }\n      }\n\n      return firstVisibleRow;\n    }\n\n    /**\n     * Get last visible row based on virtual dom and how table is visible in browser window viewport.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getLastVisibleRow',\n    value: function getLastVisibleRow() {\n      var _getVariables4 = this._getVariables(),\n          topOverlay = _getVariables4.topOverlay,\n          wtTable = _getVariables4.wtTable,\n          wtViewport = _getVariables4.wtViewport,\n          totalRows = _getVariables4.totalRows;\n\n      var lastVisibleRow = wtTable.getLastVisibleRow();\n\n      if (topOverlay.mainTableScrollableElement === window) {\n        var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);\n        var windowHeight = (0, _element.innerHeight)(window);\n        var windowScrollTop = (0, _element.getScrollTop)(window);\n\n        // Only calculate lastVisibleRow when table didn't filled (from bottom) whole viewport space\n        if (rootElementOffset.top > windowScrollTop) {\n          var rowsHeight = wtViewport.getColumnHeaderHeight();\n\n          (0, _number.rangeEach)(1, totalRows, function (row) {\n            rowsHeight += topOverlay.sumCellSizes(row - 1, row);\n\n            if (rootElementOffset.top + rowsHeight - windowScrollTop >= windowHeight) {\n              // Return physical row - 1 (-2 because rangeEach gives row index + 1 - sumCellSizes requirements)\n              lastVisibleRow = row - 2;\n\n              return false;\n            }\n          });\n        }\n      }\n\n      return lastVisibleRow;\n    }\n\n    /**\n     * Get first visible column based on virtual dom and how table is visible in browser window viewport.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getFirstVisibleColumn',\n    value: function getFirstVisibleColumn() {\n      var _getVariables5 = this._getVariables(),\n          leftOverlay = _getVariables5.leftOverlay,\n          wtTable = _getVariables5.wtTable,\n          wtViewport = _getVariables5.wtViewport,\n          totalColumns = _getVariables5.totalColumns,\n          fixedColumnsLeft = _getVariables5.fixedColumnsLeft;\n\n      var firstVisibleColumn = wtTable.getFirstVisibleColumn();\n\n      if (leftOverlay.mainTableScrollableElement === window) {\n        var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);\n        var totalTableWidth = (0, _element.innerWidth)(wtTable.hider);\n        var windowWidth = (0, _element.innerWidth)(window);\n        var windowScrollLeft = (0, _element.getScrollLeft)(window);\n\n        // Only calculate firstVisibleColumn when table didn't filled (from left) whole viewport space\n        if (rootElementOffset.left + totalTableWidth - windowWidth <= windowScrollLeft) {\n          var columnsWidth = wtViewport.getRowHeaderWidth();\n\n          (0, _number.rangeEachReverse)(totalColumns, 1, function (column) {\n            columnsWidth += leftOverlay.sumCellSizes(column - 1, column);\n\n            if (rootElementOffset.left + totalTableWidth - columnsWidth <= windowScrollLeft) {\n              // Return physical column + 1\n              firstVisibleColumn = column;\n\n              return false;\n            }\n          });\n        }\n      }\n\n      return firstVisibleColumn;\n    }\n\n    /**\n     * Get last visible column based on virtual dom and how table is visible in browser window viewport.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getLastVisibleColumn',\n    value: function getLastVisibleColumn() {\n      var _getVariables6 = this._getVariables(),\n          leftOverlay = _getVariables6.leftOverlay,\n          wtTable = _getVariables6.wtTable,\n          wtViewport = _getVariables6.wtViewport,\n          totalColumns = _getVariables6.totalColumns;\n\n      var lastVisibleColumn = wtTable.getLastVisibleColumn();\n\n      if (leftOverlay.mainTableScrollableElement === window) {\n        var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);\n        var windowWidth = (0, _element.innerWidth)(window);\n        var windowScrollLeft = (0, _element.getScrollLeft)(window);\n\n        // Only calculate lastVisibleColumn when table didn't filled (from right) whole viewport space\n        if (rootElementOffset.left > windowScrollLeft) {\n          var columnsWidth = wtViewport.getRowHeaderWidth();\n\n          (0, _number.rangeEach)(1, totalColumns, function (column) {\n            columnsWidth += leftOverlay.sumCellSizes(column - 1, column);\n\n            if (rootElementOffset.left + columnsWidth - windowScrollLeft >= windowWidth) {\n              // Return physical column - 1 (-2 because rangeEach gives column index + 1 - sumCellSizes requirements)\n              lastVisibleColumn = column - 2;\n\n              return false;\n            }\n          });\n        }\n      }\n\n      return lastVisibleColumn;\n    }\n\n    /**\n     * Returns collection of variables used to rows and columns visibility calculations.\n     *\n     * @returns {Object}\n     * @private\n     */\n\n  }, {\n    key: '_getVariables',\n    value: function _getVariables() {\n      var wot = this.wot;\n      var topOverlay = wot.wtOverlays.topOverlay;\n      var leftOverlay = wot.wtOverlays.leftOverlay;\n      var wtTable = wot.wtTable;\n      var wtViewport = wot.wtViewport;\n      var totalRows = wot.getSetting('totalRows');\n      var totalColumns = wot.getSetting('totalColumns');\n      var fixedRowsTop = wot.getSetting('fixedRowsTop');\n      var fixedRowsBottom = wot.getSetting('fixedRowsBottom');\n      var fixedColumnsLeft = wot.getSetting('fixedColumnsLeft');\n\n      return {\n        topOverlay: topOverlay,\n        leftOverlay: leftOverlay,\n        wtTable: wtTable,\n        wtViewport: wtViewport,\n        totalRows: totalRows,\n        totalColumns: totalColumns,\n        fixedRowsTop: fixedRowsTop,\n        fixedRowsBottom: fixedRowsBottom,\n        fixedColumnsLeft: fixedColumnsLeft\n      };\n    }\n  }]);\n\n  return Scroll;\n}();\n\nexports.default = Scroll;\n\n/***/ }),\n/* 302 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Settings\n */\nvar Settings = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   * @param {Object} settings\n   */\n  function Settings(wotInstance, settings) {\n    var _this = this;\n\n    _classCallCheck(this, Settings);\n\n    this.wot = wotInstance;\n\n    // legacy support\n    this.instance = wotInstance;\n\n    // default settings. void 0 means it is required, null means it can be empty\n    this.defaults = {\n      table: void 0,\n      debug: false, // shows WalkontableDebugOverlay\n\n      // presentation mode\n      externalRowCalculator: false,\n      stretchH: 'none', // values: all, last, none\n      currentRowClassName: null,\n      currentColumnClassName: null,\n      preventOverflow: function preventOverflow() {\n        return false;\n      },\n\n\n      // data source\n      data: void 0,\n      freezeOverlays: false,\n      fixedColumnsLeft: 0,\n      fixedRowsTop: 0,\n      fixedRowsBottom: 0,\n      minSpareRows: 0,\n\n      // this must be array of functions: [function (row, TH) {}]\n      rowHeaders: function rowHeaders() {\n        return [];\n      },\n\n\n      // this must be array of functions: [function (column, TH) {}]\n      columnHeaders: function columnHeaders() {\n        return [];\n      },\n\n      totalRows: void 0,\n      totalColumns: void 0,\n      cellRenderer: function cellRenderer(row, column, TD) {\n        var cellData = _this.getSetting('data', row, column);\n\n        (0, _element.fastInnerText)(TD, cellData === void 0 || cellData === null ? '' : cellData);\n      },\n\n      // columnWidth: 50,\n      columnWidth: function columnWidth(col) {\n        // return undefined means use default size for the rendered cell content\n      },\n      rowHeight: function rowHeight(row) {\n        // return undefined means use default size for the rendered cell content\n      },\n\n      defaultRowHeight: 23,\n      defaultColumnWidth: 50,\n      selections: null,\n      hideBorderOnMouseDownOver: false,\n      viewportRowCalculatorOverride: null,\n      viewportColumnCalculatorOverride: null,\n\n      // callbacks\n      onCellMouseDown: null,\n      onCellMouseOver: null,\n      onCellMouseOut: null,\n      onCellMouseUp: null,\n\n      //    onCellMouseOut: null,\n      onCellDblClick: null,\n      onCellCornerMouseDown: null,\n      onCellCornerDblClick: null,\n      beforeDraw: null,\n      onDraw: null,\n      onBeforeRemoveCellClassNames: null,\n      onAfterDrawSelection: null,\n      onBeforeDrawBorders: null,\n      onScrollVertically: null,\n      onScrollHorizontally: null,\n      onBeforeTouchScroll: null,\n      onAfterMomentumScroll: null,\n      onBeforeStretchingColumnWidth: function onBeforeStretchingColumnWidth(width) {\n        return width;\n      },\n      onModifyRowHeaderWidth: null,\n      onModifyGetCellCoords: null,\n\n      // constants\n      scrollbarWidth: 10,\n      scrollbarHeight: 10,\n\n      renderAllRows: false,\n      groups: false,\n      rowHeaderWidth: null,\n      columnHeaderHeight: null,\n      headerClassName: null\n    };\n\n    // reference to settings\n    this.settings = {};\n\n    for (var i in this.defaults) {\n      if ((0, _object.hasOwnProperty)(this.defaults, i)) {\n        if (settings[i] !== void 0) {\n          this.settings[i] = settings[i];\n        } else if (this.defaults[i] === void 0) {\n          throw new Error('A required setting \"' + i + '\" was not provided');\n        } else {\n          this.settings[i] = this.defaults[i];\n        }\n      }\n    }\n  }\n\n  /**\n   * Update settings\n   *\n   * @param {Object} settings\n   * @param {*} value\n   * @returns {Walkontable}\n   */\n\n\n  _createClass(Settings, [{\n    key: 'update',\n    value: function update(settings, value) {\n      if (value === void 0) {\n        // settings is object\n        for (var i in settings) {\n          if ((0, _object.hasOwnProperty)(settings, i)) {\n            this.settings[i] = settings[i];\n          }\n        }\n      } else {\n        // if value is defined then settings is the key\n        this.settings[settings] = value;\n      }\n      return this.wot;\n    }\n\n    /**\n     * Get setting by name\n     *\n     * @param {String} key\n     * @param {*} param1\n     * @param {*} param2\n     * @param {*} param3\n     * @param {*} param4\n     * @returns {*}\n     */\n\n  }, {\n    key: 'getSetting',\n    value: function getSetting(key, param1, param2, param3, param4) {\n      if (typeof this.settings[key] === 'function') {\n        // this is faster than .apply - https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\n        return this.settings[key](param1, param2, param3, param4);\n      } else if (param1 !== void 0 && Array.isArray(this.settings[key])) {\n        // perhaps this can be removed, it is only used in tests\n        return this.settings[key][param1];\n      }\n\n      return this.settings[key];\n    }\n\n    /**\n     * Checks if setting exists\n     *\n     * @param {Boolean} key\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'has',\n    value: function has(key) {\n      return !!this.settings[key];\n    }\n  }]);\n\n  return Settings;\n}();\n\nexports.default = Settings;\n\n/***/ }),\n/* 303 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _function = __webpack_require__(43);\n\nvar _coords = __webpack_require__(55);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nvar _range = __webpack_require__(86);\n\nvar _range2 = _interopRequireDefault(_range);\n\nvar _column = __webpack_require__(177);\n\nvar _column2 = _interopRequireDefault(_column);\n\nvar _row = __webpack_require__(178);\n\nvar _row2 = _interopRequireDefault(_row);\n\nvar _tableRenderer = __webpack_require__(304);\n\nvar _tableRenderer2 = _interopRequireDefault(_tableRenderer);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n *\n */\nvar Table = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   * @param {HTMLTableElement} table\n   */\n  function Table(wotInstance, table) {\n    var _this = this;\n\n    _classCallCheck(this, Table);\n\n    this.wot = wotInstance;\n\n    // legacy support\n    this.instance = this.wot;\n    this.TABLE = table;\n    this.TBODY = null;\n    this.THEAD = null;\n    this.COLGROUP = null;\n    this.tableOffset = 0;\n    this.holderOffset = 0;\n\n    (0, _element.removeTextNodes)(this.TABLE);\n\n    this.spreader = this.createSpreader(this.TABLE);\n    this.hider = this.createHider(this.spreader);\n    this.holder = this.createHolder(this.hider);\n\n    this.wtRootElement = this.holder.parentNode;\n    this.alignOverlaysWithTrimmingContainer();\n    this.fixTableDomTree();\n\n    this.colgroupChildrenLength = this.COLGROUP.childNodes.length;\n    this.theadChildrenLength = this.THEAD.firstChild ? this.THEAD.firstChild.childNodes.length : 0;\n    this.tbodyChildrenLength = this.TBODY.childNodes.length;\n\n    this.rowFilter = null;\n    this.columnFilter = null;\n    this.correctHeaderWidth = false;\n\n    var origRowHeaderWidth = this.wot.wtSettings.settings.rowHeaderWidth;\n\n    // Fix for jumping row headers (https://github.com/handsontable/handsontable/issues/3850)\n    this.wot.wtSettings.settings.rowHeaderWidth = function () {\n      return _this._modifyRowHeaderWidth(origRowHeaderWidth);\n    };\n  }\n\n  /**\n   *\n   */\n\n\n  _createClass(Table, [{\n    key: 'fixTableDomTree',\n    value: function fixTableDomTree() {\n      this.TBODY = this.TABLE.querySelector('tbody');\n\n      if (!this.TBODY) {\n        this.TBODY = document.createElement('tbody');\n        this.TABLE.appendChild(this.TBODY);\n      }\n      this.THEAD = this.TABLE.querySelector('thead');\n\n      if (!this.THEAD) {\n        this.THEAD = document.createElement('thead');\n        this.TABLE.insertBefore(this.THEAD, this.TBODY);\n      }\n      this.COLGROUP = this.TABLE.querySelector('colgroup');\n\n      if (!this.COLGROUP) {\n        this.COLGROUP = document.createElement('colgroup');\n        this.TABLE.insertBefore(this.COLGROUP, this.THEAD);\n      }\n\n      if (this.wot.getSetting('columnHeaders').length && !this.THEAD.childNodes.length) {\n        this.THEAD.appendChild(document.createElement('TR'));\n      }\n    }\n\n    /**\n     * @param table\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createSpreader',\n    value: function createSpreader(table) {\n      var parent = table.parentNode;\n      var spreader = void 0;\n\n      if (!parent || parent.nodeType !== 1 || !(0, _element.hasClass)(parent, 'wtHolder')) {\n        spreader = document.createElement('div');\n        spreader.className = 'wtSpreader';\n\n        if (parent) {\n          // if TABLE is detached (e.g. in Jasmine test), it has no parentNode so we cannot attach holder to it\n          parent.insertBefore(spreader, table);\n        }\n        spreader.appendChild(table);\n      }\n      spreader.style.position = 'relative';\n\n      return spreader;\n    }\n\n    /**\n     * @param spreader\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createHider',\n    value: function createHider(spreader) {\n      var parent = spreader.parentNode;\n      var hider = void 0;\n\n      if (!parent || parent.nodeType !== 1 || !(0, _element.hasClass)(parent, 'wtHolder')) {\n        hider = document.createElement('div');\n        hider.className = 'wtHider';\n\n        if (parent) {\n          // if TABLE is detached (e.g. in Jasmine test), it has no parentNode so we cannot attach holder to it\n          parent.insertBefore(hider, spreader);\n        }\n        hider.appendChild(spreader);\n      }\n\n      return hider;\n    }\n\n    /**\n     *\n     * @param hider\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createHolder',\n    value: function createHolder(hider) {\n      var parent = hider.parentNode;\n      var holder = void 0;\n\n      if (!parent || parent.nodeType !== 1 || !(0, _element.hasClass)(parent, 'wtHolder')) {\n        holder = document.createElement('div');\n        holder.style.position = 'relative';\n        holder.className = 'wtHolder';\n\n        if (parent) {\n          // if TABLE is detached (e.g. in Jasmine test), it has no parentNode so we cannot attach holder to it\n          parent.insertBefore(holder, hider);\n        }\n        if (!this.isWorkingOnClone()) {\n          holder.parentNode.className += 'ht_master handsontable';\n        }\n        holder.appendChild(hider);\n      }\n\n      return holder;\n    }\n  }, {\n    key: 'alignOverlaysWithTrimmingContainer',\n    value: function alignOverlaysWithTrimmingContainer() {\n      var trimmingElement = (0, _element.getTrimmingContainer)(this.wtRootElement);\n\n      if (!this.isWorkingOnClone()) {\n        this.holder.parentNode.style.position = 'relative';\n\n        if (trimmingElement === window) {\n          var preventOverflow = this.wot.getSetting('preventOverflow');\n\n          if (!preventOverflow) {\n            this.holder.style.overflow = 'visible';\n            this.wtRootElement.style.overflow = 'visible';\n          }\n        } else {\n          this.holder.style.width = (0, _element.getStyle)(trimmingElement, 'width');\n          this.holder.style.height = (0, _element.getStyle)(trimmingElement, 'height');\n          this.holder.style.overflow = '';\n        }\n      }\n    }\n  }, {\n    key: 'isWorkingOnClone',\n    value: function isWorkingOnClone() {\n      return !!this.wot.cloneSource;\n    }\n\n    /**\n     * Redraws the table\n     *\n     * @param {Boolean} fastDraw If TRUE, will try to avoid full redraw and only update the border positions. If FALSE or UNDEFINED, will perform a full redraw\n     * @returns {Table}\n     */\n\n  }, {\n    key: 'draw',\n    value: function draw(fastDraw) {\n      var _wot = this.wot,\n          wtOverlays = _wot.wtOverlays,\n          wtViewport = _wot.wtViewport;\n\n      var totalRows = this.instance.getSetting('totalRows');\n      var rowHeaders = this.wot.getSetting('rowHeaders').length;\n      var columnHeaders = this.wot.getSetting('columnHeaders').length;\n      var syncScroll = false;\n\n      if (!this.isWorkingOnClone()) {\n        this.holderOffset = (0, _element.offset)(this.holder);\n        fastDraw = wtViewport.createRenderCalculators(fastDraw);\n\n        if (rowHeaders && !this.wot.getSetting('fixedColumnsLeft')) {\n          var leftScrollPos = wtOverlays.leftOverlay.getScrollPosition();\n          var previousState = this.correctHeaderWidth;\n\n          this.correctHeaderWidth = leftScrollPos > 0;\n\n          if (previousState !== this.correctHeaderWidth) {\n            fastDraw = false;\n          }\n        }\n      }\n\n      if (!this.isWorkingOnClone()) {\n        syncScroll = wtOverlays.prepareOverlays();\n      }\n\n      if (fastDraw) {\n        if (!this.isWorkingOnClone()) {\n          // in case we only scrolled without redraw, update visible rows information in oldRowsCalculator\n          wtViewport.createVisibleCalculators();\n        }\n        if (wtOverlays) {\n          wtOverlays.refresh(true);\n        }\n      } else {\n        if (this.isWorkingOnClone()) {\n          this.tableOffset = this.wot.cloneSource.wtTable.tableOffset;\n        } else {\n          this.tableOffset = (0, _element.offset)(this.TABLE);\n        }\n        var startRow = void 0;\n\n        if (_base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_DEBUG) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_TOP) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_TOP_LEFT_CORNER)) {\n          startRow = 0;\n        } else if (_base2.default.isOverlayTypeOf(this.instance.cloneOverlay, _base2.default.CLONE_BOTTOM) || _base2.default.isOverlayTypeOf(this.instance.cloneOverlay, _base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n          startRow = Math.max(totalRows - this.wot.getSetting('fixedRowsBottom'), 0);\n        } else {\n          startRow = wtViewport.rowsRenderCalculator.startRow;\n        }\n        var startColumn = void 0;\n\n        if (_base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_DEBUG) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_LEFT) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_TOP_LEFT_CORNER) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n          startColumn = 0;\n        } else {\n          startColumn = wtViewport.columnsRenderCalculator.startColumn;\n        }\n        this.rowFilter = new _row2.default(startRow, totalRows, columnHeaders);\n        this.columnFilter = new _column2.default(startColumn, this.wot.getSetting('totalColumns'), rowHeaders);\n\n        this.alignOverlaysWithTrimmingContainer();\n        this._doDraw(); // creates calculator after draw\n      }\n      this.refreshSelections(fastDraw);\n\n      if (!this.isWorkingOnClone()) {\n        wtOverlays.topOverlay.resetFixedPosition();\n\n        if (wtOverlays.bottomOverlay.clone) {\n          wtOverlays.bottomOverlay.resetFixedPosition();\n        }\n\n        wtOverlays.leftOverlay.resetFixedPosition();\n\n        if (wtOverlays.topLeftCornerOverlay) {\n          wtOverlays.topLeftCornerOverlay.resetFixedPosition();\n        }\n\n        if (wtOverlays.bottomLeftCornerOverlay && wtOverlays.bottomLeftCornerOverlay.clone) {\n          wtOverlays.bottomLeftCornerOverlay.resetFixedPosition();\n        }\n      }\n      if (syncScroll) {\n        wtOverlays.syncScrollWithMaster();\n      }\n      this.wot.drawn = true;\n\n      return this;\n    }\n  }, {\n    key: '_doDraw',\n    value: function _doDraw() {\n      var wtRenderer = new _tableRenderer2.default(this);\n\n      wtRenderer.render();\n    }\n  }, {\n    key: 'removeClassFromCells',\n    value: function removeClassFromCells(className) {\n      var nodes = this.TABLE.querySelectorAll('.' + className);\n\n      for (var i = 0, len = nodes.length; i < len; i++) {\n        (0, _element.removeClass)(nodes[i], className);\n      }\n    }\n\n    /**\n     * Refresh the table selection by re-rendering Selection instances connected with that instance.\n     *\n     * @param {Boolean} fastDraw If fast drawing is enabled than additionally className clearing is applied.\n     */\n\n  }, {\n    key: 'refreshSelections',\n    value: function refreshSelections(fastDraw) {\n      if (!this.wot.selections) {\n        return;\n      }\n      var highlights = Array.from(this.wot.selections);\n      var len = highlights.length;\n\n      if (fastDraw) {\n        var classesToRemove = [];\n\n        for (var i = 0; i < len; i++) {\n          var _highlights$i$setting = highlights[i].settings,\n              highlightHeaderClassName = _highlights$i$setting.highlightHeaderClassName,\n              highlightRowClassName = _highlights$i$setting.highlightRowClassName,\n              highlightColumnClassName = _highlights$i$setting.highlightColumnClassName;\n\n          var classNames = highlights[i].classNames;\n          var classNamesLength = classNames.length;\n\n          for (var j = 0; j < classNamesLength; j++) {\n            if (!classesToRemove.includes(classNames[j])) {\n              classesToRemove.push(classNames[j]);\n            }\n          }\n\n          if (highlightHeaderClassName && !classesToRemove.includes(highlightHeaderClassName)) {\n            classesToRemove.push(highlightHeaderClassName);\n          }\n          if (highlightRowClassName && !classesToRemove.includes(highlightRowClassName)) {\n            classesToRemove.push(highlightRowClassName);\n          }\n          if (highlightColumnClassName && !classesToRemove.includes(highlightColumnClassName)) {\n            classesToRemove.push(highlightColumnClassName);\n          }\n        }\n\n        var additionalClassesToRemove = this.wot.getSetting('onBeforeRemoveCellClassNames');\n\n        if (Array.isArray(additionalClassesToRemove)) {\n          for (var _i = 0; _i < additionalClassesToRemove.length; _i++) {\n            classesToRemove.push(additionalClassesToRemove[_i]);\n          }\n        }\n\n        var classesToRemoveLength = classesToRemove.length;\n\n        for (var _i2 = 0; _i2 < classesToRemoveLength; _i2++) {\n          // there was no rerender, so we need to remove classNames by ourselves\n          this.removeClassFromCells(classesToRemove[_i2]);\n        }\n      }\n\n      for (var _i3 = 0; _i3 < len; _i3++) {\n        highlights[_i3].draw(this.wot, fastDraw);\n      }\n    }\n\n    /**\n     * Get cell element at coords.\n     *\n     * @param {CellCoords} coords\n     * @returns {HTMLElement|Number} HTMLElement on success or Number one of the exit codes on error:\n     *  -1 row before viewport\n     *  -2 row after viewport\n     */\n\n  }, {\n    key: 'getCell',\n    value: function getCell(coords) {\n      var row = coords.row;\n      var column = coords.col;\n      var hookResult = this.wot.getSetting('onModifyGetCellCoords', row, column);\n\n      if (hookResult && Array.isArray(hookResult)) {\n        var _hookResult = _slicedToArray(hookResult, 2);\n\n        row = _hookResult[0];\n        column = _hookResult[1];\n      }\n\n      if (this.isRowBeforeRenderedRows(row)) {\n        // row before rendered rows\n        return -1;\n      } else if (this.isRowAfterRenderedRows(row)) {\n        // row after rendered rows\n        return -2;\n      }\n\n      var TR = this.TBODY.childNodes[this.rowFilter.sourceToRendered(row)];\n\n      if (TR) {\n        return TR.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(column)];\n      }\n    }\n\n    /**\n     * getColumnHeader\n     *\n     * @param {Number} col Column index\n     * @param {Number} [level=0] Header level (0 = most distant to the table)\n     * @returns {Object} HTMLElement on success or undefined on error\n     */\n\n  }, {\n    key: 'getColumnHeader',\n    value: function getColumnHeader(col) {\n      var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n      var TR = this.THEAD.childNodes[level];\n\n      if (TR) {\n        return TR.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(col)];\n      }\n    }\n\n    /**\n     * getRowHeader\n     *\n     * @param {Number} row Row index\n     * @returns {HTMLElement} HTMLElement on success or Number one of the exit codes on error: `null table doesn't have row headers`\n     */\n\n  }, {\n    key: 'getRowHeader',\n    value: function getRowHeader(row) {\n      if (this.columnFilter.sourceColumnToVisibleRowHeadedColumn(0) === 0) {\n        return null;\n      }\n      var TR = this.TBODY.childNodes[this.rowFilter.sourceToRendered(row)];\n\n      if (TR) {\n        return TR.childNodes[0];\n      }\n    }\n\n    /**\n     * Returns cell coords object for a given TD (or a child element of a TD element).\n     *\n     * @param {HTMLTableCellElement} TD A cell DOM element (or a child of one).\n     * @returns {CellCoords|null} The coordinates of the provided TD element (or the closest TD element) or null, if the provided element is not applicable.\n     */\n\n  }, {\n    key: 'getCoords',\n    value: function getCoords(TD) {\n      if (TD.nodeName !== 'TD' && TD.nodeName !== 'TH') {\n        TD = (0, _element.closest)(TD, ['TD', 'TH']);\n      }\n\n      if (TD === null) {\n        return null;\n      }\n\n      var TR = TD.parentNode;\n      var CONTAINER = TR.parentNode;\n      var row = (0, _element.index)(TR);\n      var col = TD.cellIndex;\n\n      if ((0, _element.overlayContainsElement)(_base2.default.CLONE_TOP_LEFT_CORNER, TD) || (0, _element.overlayContainsElement)(_base2.default.CLONE_TOP, TD)) {\n        if (CONTAINER.nodeName === 'THEAD') {\n          row -= CONTAINER.childNodes.length;\n        }\n      } else if (CONTAINER === this.THEAD) {\n        row = this.rowFilter.visibleColHeadedRowToSourceRow(row);\n      } else {\n        row = this.rowFilter.renderedToSource(row);\n      }\n\n      if ((0, _element.overlayContainsElement)(_base2.default.CLONE_TOP_LEFT_CORNER, TD) || (0, _element.overlayContainsElement)(_base2.default.CLONE_LEFT, TD)) {\n        col = this.columnFilter.offsettedTH(col);\n      } else {\n        col = this.columnFilter.visibleRowHeadedColumnToSourceColumn(col);\n      }\n\n      return new _coords2.default(row, col);\n    }\n  }, {\n    key: 'getTrForRow',\n    value: function getTrForRow(row) {\n      return this.TBODY.childNodes[this.rowFilter.sourceToRendered(row)];\n    }\n  }, {\n    key: 'getFirstRenderedRow',\n    value: function getFirstRenderedRow() {\n      return this.wot.wtViewport.rowsRenderCalculator.startRow;\n    }\n  }, {\n    key: 'getFirstVisibleRow',\n    value: function getFirstVisibleRow() {\n      return this.wot.wtViewport.rowsVisibleCalculator.startRow;\n    }\n  }, {\n    key: 'getFirstRenderedColumn',\n    value: function getFirstRenderedColumn() {\n      return this.wot.wtViewport.columnsRenderCalculator.startColumn;\n    }\n\n    /**\n     * @returns {Number} Returns -1 if no row is visible\n     */\n\n  }, {\n    key: 'getFirstVisibleColumn',\n    value: function getFirstVisibleColumn() {\n      return this.wot.wtViewport.columnsVisibleCalculator.startColumn;\n    }\n\n    /**\n     * @returns {Number} Returns -1 if no row is visible\n     */\n\n  }, {\n    key: 'getLastRenderedRow',\n    value: function getLastRenderedRow() {\n      return this.wot.wtViewport.rowsRenderCalculator.endRow;\n    }\n  }, {\n    key: 'getLastVisibleRow',\n    value: function getLastVisibleRow() {\n      return this.wot.wtViewport.rowsVisibleCalculator.endRow;\n    }\n  }, {\n    key: 'getLastRenderedColumn',\n    value: function getLastRenderedColumn() {\n      return this.wot.wtViewport.columnsRenderCalculator.endColumn;\n    }\n\n    /**\n     * @returns {Number} Returns -1 if no column is visible\n     */\n\n  }, {\n    key: 'getLastVisibleColumn',\n    value: function getLastVisibleColumn() {\n      return this.wot.wtViewport.columnsVisibleCalculator.endColumn;\n    }\n  }, {\n    key: 'isRowBeforeRenderedRows',\n    value: function isRowBeforeRenderedRows(row) {\n      return this.rowFilter && this.rowFilter.sourceToRendered(row) < 0 && row >= 0;\n    }\n  }, {\n    key: 'isRowAfterViewport',\n    value: function isRowAfterViewport(row) {\n      return this.rowFilter && this.rowFilter.sourceToRendered(row) > this.getLastVisibleRow();\n    }\n  }, {\n    key: 'isRowAfterRenderedRows',\n    value: function isRowAfterRenderedRows(row) {\n      return this.rowFilter && this.rowFilter.sourceToRendered(row) > this.getLastRenderedRow();\n    }\n  }, {\n    key: 'isColumnBeforeViewport',\n    value: function isColumnBeforeViewport(column) {\n      return this.columnFilter && this.columnFilter.sourceToRendered(column) < 0 && column >= 0;\n    }\n  }, {\n    key: 'isColumnAfterViewport',\n    value: function isColumnAfterViewport(column) {\n      return this.columnFilter && this.columnFilter.sourceToRendered(column) > this.getLastVisibleColumn();\n    }\n  }, {\n    key: 'isLastRowFullyVisible',\n    value: function isLastRowFullyVisible() {\n      return this.getLastVisibleRow() === this.getLastRenderedRow();\n    }\n  }, {\n    key: 'isLastColumnFullyVisible',\n    value: function isLastColumnFullyVisible() {\n      return this.getLastVisibleColumn() === this.getLastRenderedColumn();\n    }\n  }, {\n    key: 'getRenderedColumnsCount',\n    value: function getRenderedColumnsCount() {\n      var columnsCount = this.wot.wtViewport.columnsRenderCalculator.count;\n      var totalColumns = this.wot.getSetting('totalColumns');\n\n      if (this.wot.isOverlayName(_base2.default.CLONE_DEBUG)) {\n        columnsCount = totalColumns;\n      } else if (this.wot.isOverlayName(_base2.default.CLONE_LEFT) || this.wot.isOverlayName(_base2.default.CLONE_TOP_LEFT_CORNER) || this.wot.isOverlayName(_base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n        return Math.min(this.wot.getSetting('fixedColumnsLeft'), totalColumns);\n      }\n\n      return columnsCount;\n    }\n  }, {\n    key: 'getRenderedRowsCount',\n    value: function getRenderedRowsCount() {\n      var rowsCount = this.wot.wtViewport.rowsRenderCalculator.count;\n      var totalRows = this.wot.getSetting('totalRows');\n\n      if (this.wot.isOverlayName(_base2.default.CLONE_DEBUG)) {\n        rowsCount = totalRows;\n      } else if (this.wot.isOverlayName(_base2.default.CLONE_TOP) || this.wot.isOverlayName(_base2.default.CLONE_TOP_LEFT_CORNER)) {\n        rowsCount = Math.min(this.wot.getSetting('fixedRowsTop'), totalRows);\n      } else if (this.wot.isOverlayName(_base2.default.CLONE_BOTTOM) || this.wot.isOverlayName(_base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n        rowsCount = Math.min(this.wot.getSetting('fixedRowsBottom'), totalRows);\n      }\n\n      return rowsCount;\n    }\n  }, {\n    key: 'getVisibleRowsCount',\n    value: function getVisibleRowsCount() {\n      return this.wot.wtViewport.rowsVisibleCalculator.count;\n    }\n  }, {\n    key: 'allRowsInViewport',\n    value: function allRowsInViewport() {\n      return this.wot.getSetting('totalRows') == this.getVisibleRowsCount();\n    }\n\n    /**\n     * Checks if any of the row's cells content exceeds its initial height, and if so, returns the oversized height\n     *\n     * @param {Number} sourceRow\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getRowHeight',\n    value: function getRowHeight(sourceRow) {\n      var height = this.wot.wtSettings.settings.rowHeight(sourceRow);\n      var oversizedHeight = this.wot.wtViewport.oversizedRows[sourceRow];\n\n      if (oversizedHeight !== void 0) {\n        height = height === void 0 ? oversizedHeight : Math.max(height, oversizedHeight);\n      }\n\n      return height;\n    }\n  }, {\n    key: 'getColumnHeaderHeight',\n    value: function getColumnHeaderHeight(level) {\n      var height = this.wot.wtSettings.settings.defaultRowHeight;\n      var oversizedHeight = this.wot.wtViewport.oversizedColumnHeaders[level];\n\n      if (oversizedHeight !== void 0) {\n        height = height ? Math.max(height, oversizedHeight) : oversizedHeight;\n      }\n\n      return height;\n    }\n  }, {\n    key: 'getVisibleColumnsCount',\n    value: function getVisibleColumnsCount() {\n      return this.wot.wtViewport.columnsVisibleCalculator.count;\n    }\n  }, {\n    key: 'allColumnsInViewport',\n    value: function allColumnsInViewport() {\n      return this.wot.getSetting('totalColumns') == this.getVisibleColumnsCount();\n    }\n  }, {\n    key: 'getColumnWidth',\n    value: function getColumnWidth(sourceColumn) {\n      var width = this.wot.wtSettings.settings.columnWidth;\n\n      if (typeof width === 'function') {\n        width = width(sourceColumn);\n      } else if ((typeof width === 'undefined' ? 'undefined' : _typeof(width)) === 'object') {\n        width = width[sourceColumn];\n      }\n\n      return width || this.wot.wtSettings.settings.defaultColumnWidth;\n    }\n  }, {\n    key: 'getStretchedColumnWidth',\n    value: function getStretchedColumnWidth(sourceColumn) {\n      var columnWidth = this.getColumnWidth(sourceColumn);\n      var width = columnWidth == null ? this.instance.wtSettings.settings.defaultColumnWidth : columnWidth;\n      var calculator = this.wot.wtViewport.columnsRenderCalculator;\n\n      if (calculator) {\n        var stretchedWidth = calculator.getStretchedColumnWidth(sourceColumn, width);\n\n        if (stretchedWidth) {\n          width = stretchedWidth;\n        }\n      }\n\n      return width;\n    }\n\n    /**\n     * Modify row header widths provided by user in class contructor.\n     *\n     * @private\n     */\n\n  }, {\n    key: '_modifyRowHeaderWidth',\n    value: function _modifyRowHeaderWidth(rowHeaderWidthFactory) {\n      var widths = (0, _function.isFunction)(rowHeaderWidthFactory) ? rowHeaderWidthFactory() : null;\n\n      if (Array.isArray(widths)) {\n        widths = [].concat(_toConsumableArray(widths));\n        widths[widths.length - 1] = this._correctRowHeaderWidth(widths[widths.length - 1]);\n      } else {\n        widths = this._correctRowHeaderWidth(widths);\n      }\n\n      return widths;\n    }\n\n    /**\n     * Correct row header width if necessary.\n     *\n     * @private\n     */\n\n  }, {\n    key: '_correctRowHeaderWidth',\n    value: function _correctRowHeaderWidth(width) {\n      if (typeof width !== 'number') {\n        width = this.wot.getSetting('defaultColumnWidth');\n      }\n      if (this.correctHeaderWidth) {\n        width++;\n      }\n\n      return width;\n    }\n  }]);\n\n  return Table;\n}();\n\nexports.default = Table;\n\n/***/ }),\n/* 304 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['Performance tip: Handsontable rendered more than 1000 visible rows. Consider limiting the number \\n          of rendered rows by specifying the table height and/or turning off the \"renderAllRows\" option.'], ['Performance tip: Handsontable rendered more than 1000 visible rows. Consider limiting the number \\n          of rendered rows by specifying the table height and/or turning off the \"renderAllRows\" option.']);\n\nvar _element = __webpack_require__(0);\n\nvar _console = __webpack_require__(56);\n\nvar _templateLiteralTag = __webpack_require__(42);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar performanceWarningAppeared = false;\n\n/**\n * @class TableRenderer\n */\n\nvar TableRenderer = function () {\n  /**\n   * @param {WalkontableTable} wtTable\n   */\n  function TableRenderer(wtTable) {\n    _classCallCheck(this, TableRenderer);\n\n    this.wtTable = wtTable;\n    this.wot = wtTable.instance;\n\n    // legacy support\n    this.instance = wtTable.instance;\n\n    this.rowFilter = wtTable.rowFilter;\n    this.columnFilter = wtTable.columnFilter;\n\n    this.TABLE = wtTable.TABLE;\n    this.THEAD = wtTable.THEAD;\n    this.TBODY = wtTable.TBODY;\n    this.COLGROUP = wtTable.COLGROUP;\n\n    this.rowHeaders = [];\n    this.rowHeaderCount = 0;\n    this.columnHeaders = [];\n    this.columnHeaderCount = 0;\n    this.fixedRowsTop = 0;\n    this.fixedRowsBottom = 0;\n  }\n\n  /**\n   *\n   */\n\n\n  _createClass(TableRenderer, [{\n    key: 'render',\n    value: function render() {\n      if (!this.wtTable.isWorkingOnClone()) {\n        var skipRender = {};\n        this.wot.getSetting('beforeDraw', true, skipRender);\n\n        if (skipRender.skipRender === true) {\n          return;\n        }\n      }\n\n      this.rowHeaders = this.wot.getSetting('rowHeaders');\n      this.rowHeaderCount = this.rowHeaders.length;\n      this.fixedRowsTop = this.wot.getSetting('fixedRowsTop');\n      this.fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');\n      this.columnHeaders = this.wot.getSetting('columnHeaders');\n      this.columnHeaderCount = this.columnHeaders.length;\n\n      var columnsToRender = this.wtTable.getRenderedColumnsCount();\n      var rowsToRender = this.wtTable.getRenderedRowsCount();\n      var totalColumns = this.wot.getSetting('totalColumns');\n      var totalRows = this.wot.getSetting('totalRows');\n      var workspaceWidth = void 0;\n      var adjusted = false;\n\n      if (_base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_BOTTOM) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n\n        // do NOT render headers on the bottom or bottom-left corner overlay\n        this.columnHeaders = [];\n        this.columnHeaderCount = 0;\n      }\n\n      if (totalColumns >= 0) {\n        // prepare COL and TH elements for rendering\n        this.adjustAvailableNodes();\n        adjusted = true;\n\n        // adjust column widths according to user widths settings\n        this.renderColumnHeaders();\n\n        // Render table rows\n        this.renderRows(totalRows, rowsToRender, columnsToRender);\n\n        if (!this.wtTable.isWorkingOnClone()) {\n          workspaceWidth = this.wot.wtViewport.getWorkspaceWidth();\n          this.wot.wtViewport.containerWidth = null;\n        }\n\n        this.adjustColumnWidths(columnsToRender);\n        this.markOversizedColumnHeaders();\n        this.adjustColumnHeaderHeights();\n      }\n\n      if (!adjusted) {\n        this.adjustAvailableNodes();\n      }\n      this.removeRedundantRows(rowsToRender);\n\n      if (!this.wtTable.isWorkingOnClone() || this.wot.isOverlayName(_base2.default.CLONE_BOTTOM)) {\n        this.markOversizedRows();\n      }\n      if (!this.wtTable.isWorkingOnClone()) {\n        this.wot.wtViewport.createVisibleCalculators();\n        this.wot.wtOverlays.refresh(false);\n\n        this.wot.wtOverlays.applyToDOM();\n\n        var hiderWidth = (0, _element.outerWidth)(this.wtTable.hider);\n        var tableWidth = (0, _element.outerWidth)(this.wtTable.TABLE);\n\n        if (hiderWidth !== 0 && tableWidth !== hiderWidth) {\n          // Recalculate the column widths, if width changes made in the overlays removed the scrollbar, thus changing the viewport width.\n          this.adjustColumnWidths(columnsToRender);\n        }\n\n        if (workspaceWidth !== this.wot.wtViewport.getWorkspaceWidth()) {\n          // workspace width changed though to shown/hidden vertical scrollbar. Let's reapply stretching\n          this.wot.wtViewport.containerWidth = null;\n\n          var firstRendered = this.wtTable.getFirstRenderedColumn();\n          var lastRendered = this.wtTable.getLastRenderedColumn();\n          var defaultColumnWidth = this.wot.getSetting('defaultColumnWidth');\n          var rowHeaderWidthSetting = this.wot.getSetting('rowHeaderWidth');\n\n          rowHeaderWidthSetting = this.instance.getSetting('onModifyRowHeaderWidth', rowHeaderWidthSetting);\n\n          if (rowHeaderWidthSetting != null) {\n            for (var i = 0; i < this.rowHeaderCount; i++) {\n              var width = Array.isArray(rowHeaderWidthSetting) ? rowHeaderWidthSetting[i] : rowHeaderWidthSetting;\n\n              width = width == null ? defaultColumnWidth : width;\n\n              this.COLGROUP.childNodes[i].style.width = width + 'px';\n            }\n          }\n\n          for (var _i = firstRendered; _i < lastRendered; _i++) {\n            var _width = this.wtTable.getStretchedColumnWidth(_i);\n            var renderedIndex = this.columnFilter.sourceToRendered(_i);\n\n            this.COLGROUP.childNodes[renderedIndex + this.rowHeaderCount].style.width = _width + 'px';\n          }\n        }\n\n        this.wot.getSetting('onDraw', true);\n      } else if (this.wot.isOverlayName(_base2.default.CLONE_BOTTOM)) {\n        this.wot.cloneSource.wtOverlays.adjustElementsSize();\n      }\n    }\n\n    /**\n     * @param {Number} renderedRowsCount\n     */\n\n  }, {\n    key: 'removeRedundantRows',\n    value: function removeRedundantRows(renderedRowsCount) {\n      while (this.wtTable.tbodyChildrenLength > renderedRowsCount) {\n        this.TBODY.removeChild(this.TBODY.lastChild);\n        this.wtTable.tbodyChildrenLength--;\n      }\n    }\n\n    /**\n     * @param {Number} totalRows\n     * @param {Number} rowsToRender\n     * @param {Number} columnsToRender\n     */\n\n  }, {\n    key: 'renderRows',\n    value: function renderRows(totalRows, rowsToRender, columnsToRender) {\n      var lastTD = void 0;\n      var TR = void 0;\n      var visibleRowIndex = 0;\n      var sourceRowIndex = this.rowFilter.renderedToSource(visibleRowIndex);\n      var isWorkingOnClone = this.wtTable.isWorkingOnClone();\n\n      while (sourceRowIndex < totalRows && sourceRowIndex >= 0) {\n        if (!performanceWarningAppeared && visibleRowIndex > 1000) {\n          performanceWarningAppeared = true;\n          (0, _console.warn)((0, _templateLiteralTag.toSingleLine)(_templateObject));\n        }\n        if (rowsToRender !== void 0 && visibleRowIndex === rowsToRender) {\n          // We have as much rows as needed for this clone\n          break;\n        }\n        TR = this.getOrCreateTrForRow(visibleRowIndex, TR);\n\n        // Render row headers\n        this.renderRowHeaders(sourceRowIndex, TR);\n        // Add and/or remove TDs to TR to match the desired number\n        this.adjustColumns(TR, columnsToRender + this.rowHeaderCount);\n\n        lastTD = this.renderCells(sourceRowIndex, TR, columnsToRender);\n\n        if (!isWorkingOnClone ||\n        // Necessary to refresh oversized row heights after editing cell in overlays\n        this.wot.isOverlayName(_base2.default.CLONE_BOTTOM)) {\n          // Reset the oversized row cache for this row\n          this.resetOversizedRow(sourceRowIndex);\n        }\n\n        if (TR.firstChild) {\n          // if I have 2 fixed columns with one-line content and the 3rd column has a multiline content, this is\n          // the way to make sure that the overlay will has same row height\n          var height = this.wot.wtTable.getRowHeight(sourceRowIndex);\n\n          if (height) {\n            // Decrease height. 1 pixel will be \"replaced\" by 1px border top\n            height--;\n            TR.firstChild.style.height = height + 'px';\n          } else {\n            TR.firstChild.style.height = '';\n          }\n        }\n        visibleRowIndex++;\n        sourceRowIndex = this.rowFilter.renderedToSource(visibleRowIndex);\n      }\n    }\n\n    /**\n     * Reset the oversized row cache for the provided index\n     *\n     * @param {Number} sourceRow Row index\n     */\n\n  }, {\n    key: 'resetOversizedRow',\n    value: function resetOversizedRow(sourceRow) {\n      if (this.wot.getSetting('externalRowCalculator')) {\n        return;\n      }\n      if (this.wot.wtViewport.oversizedRows && this.wot.wtViewport.oversizedRows[sourceRow]) {\n        this.wot.wtViewport.oversizedRows[sourceRow] = void 0;\n      }\n    }\n\n    /**\n     * Check if any of the rendered rows is higher than expected, and if so, cache them\n     */\n\n  }, {\n    key: 'markOversizedRows',\n    value: function markOversizedRows() {\n      if (this.wot.getSetting('externalRowCalculator')) {\n        return;\n      }\n      var rowCount = this.instance.wtTable.TBODY.childNodes.length;\n      var expectedTableHeight = rowCount * this.instance.wtSettings.settings.defaultRowHeight;\n      var actualTableHeight = (0, _element.innerHeight)(this.instance.wtTable.TBODY) - 1;\n      var previousRowHeight = void 0;\n      var rowInnerHeight = void 0;\n      var sourceRowIndex = void 0;\n      var currentTr = void 0;\n      var rowHeader = void 0;\n      var totalRows = this.instance.getSetting('totalRows');\n\n      if (expectedTableHeight === actualTableHeight && !this.instance.getSetting('fixedRowsBottom')) {\n        // If the actual table height equals rowCount * default single row height, no row is oversized -> no need to iterate over them\n        return;\n      }\n\n      while (rowCount) {\n        rowCount--;\n        sourceRowIndex = this.instance.wtTable.rowFilter.renderedToSource(rowCount);\n        previousRowHeight = this.instance.wtTable.getRowHeight(sourceRowIndex);\n        currentTr = this.instance.wtTable.getTrForRow(sourceRowIndex);\n        rowHeader = currentTr.querySelector('th');\n\n        if (rowHeader) {\n          rowInnerHeight = (0, _element.innerHeight)(rowHeader);\n        } else {\n          rowInnerHeight = (0, _element.innerHeight)(currentTr) - 1;\n        }\n\n        if (!previousRowHeight && this.instance.wtSettings.settings.defaultRowHeight < rowInnerHeight || previousRowHeight < rowInnerHeight) {\n          this.instance.wtViewport.oversizedRows[sourceRowIndex] = ++rowInnerHeight;\n        }\n      }\n    }\n\n    /**\n     * Check if any of the rendered columns is higher than expected, and if so, cache them.\n     */\n\n  }, {\n    key: 'markOversizedColumnHeaders',\n    value: function markOversizedColumnHeaders() {\n      var overlayName = this.wot.getOverlayName();\n\n      if (!this.columnHeaderCount || this.wot.wtViewport.hasOversizedColumnHeadersMarked[overlayName] || this.wtTable.isWorkingOnClone()) {\n        return;\n      }\n      var columnCount = this.wtTable.getRenderedColumnsCount();\n\n      for (var i = 0; i < this.columnHeaderCount; i++) {\n        for (var renderedColumnIndex = -1 * this.rowHeaderCount; renderedColumnIndex < columnCount; renderedColumnIndex++) {\n          this.markIfOversizedColumnHeader(renderedColumnIndex);\n        }\n      }\n      this.wot.wtViewport.hasOversizedColumnHeadersMarked[overlayName] = true;\n    }\n\n    /**\n     *\n     */\n\n  }, {\n    key: 'adjustColumnHeaderHeights',\n    value: function adjustColumnHeaderHeights() {\n      var columnHeaders = this.wot.getSetting('columnHeaders');\n      var children = this.wot.wtTable.THEAD.childNodes;\n      var oversizedColumnHeaders = this.wot.wtViewport.oversizedColumnHeaders;\n\n      for (var i = 0, len = columnHeaders.length; i < len; i++) {\n        if (oversizedColumnHeaders[i]) {\n          if (!children[i] || children[i].childNodes.length === 0) {\n            return;\n          }\n          children[i].childNodes[0].style.height = oversizedColumnHeaders[i] + 'px';\n        }\n      }\n    }\n\n    /**\n     * Check if column header for the specified column is higher than expected, and if so, cache it\n     *\n     * @param {Number} col Index of column\n     */\n\n  }, {\n    key: 'markIfOversizedColumnHeader',\n    value: function markIfOversizedColumnHeader(col) {\n      var sourceColIndex = this.wot.wtTable.columnFilter.renderedToSource(col);\n      var level = this.columnHeaderCount;\n      var defaultRowHeight = this.wot.wtSettings.settings.defaultRowHeight;\n      var previousColHeaderHeight = void 0;\n      var currentHeader = void 0;\n      var currentHeaderHeight = void 0;\n      var columnHeaderHeightSetting = this.wot.getSetting('columnHeaderHeight') || [];\n\n      while (level) {\n        level--;\n\n        previousColHeaderHeight = this.wot.wtTable.getColumnHeaderHeight(level);\n        currentHeader = this.wot.wtTable.getColumnHeader(sourceColIndex, level);\n\n        if (!currentHeader) {\n          /* eslint-disable no-continue */\n          continue;\n        }\n        currentHeaderHeight = (0, _element.innerHeight)(currentHeader);\n\n        if (!previousColHeaderHeight && defaultRowHeight < currentHeaderHeight || previousColHeaderHeight < currentHeaderHeight) {\n          this.wot.wtViewport.oversizedColumnHeaders[level] = currentHeaderHeight;\n        }\n\n        if (Array.isArray(columnHeaderHeightSetting)) {\n          if (columnHeaderHeightSetting[level] != null) {\n            this.wot.wtViewport.oversizedColumnHeaders[level] = columnHeaderHeightSetting[level];\n          }\n        } else if (!isNaN(columnHeaderHeightSetting)) {\n          this.wot.wtViewport.oversizedColumnHeaders[level] = columnHeaderHeightSetting;\n        }\n\n        if (this.wot.wtViewport.oversizedColumnHeaders[level] < (columnHeaderHeightSetting[level] || columnHeaderHeightSetting)) {\n          this.wot.wtViewport.oversizedColumnHeaders[level] = columnHeaderHeightSetting[level] || columnHeaderHeightSetting;\n        }\n      }\n    }\n\n    /**\n     * @param {Number} sourceRowIndex\n     * @param {HTMLTableRowElement} TR\n     * @param {Number} columnsToRender\n     * @returns {HTMLTableCellElement}\n     */\n\n  }, {\n    key: 'renderCells',\n    value: function renderCells(sourceRowIndex, TR, columnsToRender) {\n      var TD = void 0;\n      var sourceColIndex = void 0;\n\n      for (var visibleColIndex = 0; visibleColIndex < columnsToRender; visibleColIndex++) {\n        sourceColIndex = this.columnFilter.renderedToSource(visibleColIndex);\n\n        if (visibleColIndex === 0) {\n          TD = TR.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(sourceColIndex)];\n        } else {\n          TD = TD.nextSibling; // http://jsperf.com/nextsibling-vs-indexed-childnodes\n        }\n        // If the number of headers has been reduced, we need to replace excess TH with TD\n        if (TD.nodeName == 'TH') {\n          TD = replaceThWithTd(TD, TR);\n        }\n        if (!(0, _element.hasClass)(TD, 'hide')) {\n          TD.className = '';\n        }\n        TD.removeAttribute('style');\n        this.wot.wtSettings.settings.cellRenderer(sourceRowIndex, sourceColIndex, TD);\n      }\n\n      return TD;\n    }\n\n    /**\n     * @param {Number} columnsToRender Number of columns to render.\n     */\n\n  }, {\n    key: 'adjustColumnWidths',\n    value: function adjustColumnWidths(columnsToRender) {\n      var scrollbarCompensation = 0;\n      var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot;\n      var mainHolder = sourceInstance.wtTable.holder;\n      var defaultColumnWidth = this.wot.getSetting('defaultColumnWidth');\n      var rowHeaderWidthSetting = this.wot.getSetting('rowHeaderWidth');\n\n      if (mainHolder.offsetHeight < mainHolder.scrollHeight) {\n        scrollbarCompensation = (0, _element.getScrollbarWidth)();\n      }\n      this.wot.wtViewport.columnsRenderCalculator.refreshStretching(this.wot.wtViewport.getViewportWidth() - scrollbarCompensation);\n\n      rowHeaderWidthSetting = this.instance.getSetting('onModifyRowHeaderWidth', rowHeaderWidthSetting);\n\n      if (rowHeaderWidthSetting != null) {\n        for (var i = 0; i < this.rowHeaderCount; i++) {\n          var width = Array.isArray(rowHeaderWidthSetting) ? rowHeaderWidthSetting[i] : rowHeaderWidthSetting;\n\n          width = width == null ? defaultColumnWidth : width;\n\n          this.COLGROUP.childNodes[i].style.width = width + 'px';\n        }\n      }\n\n      for (var renderedColIndex = 0; renderedColIndex < columnsToRender; renderedColIndex++) {\n        var _width2 = this.wtTable.getStretchedColumnWidth(this.columnFilter.renderedToSource(renderedColIndex));\n\n        this.COLGROUP.childNodes[renderedColIndex + this.rowHeaderCount].style.width = _width2 + 'px';\n      }\n    }\n\n    /**\n     * @param {HTMLTableCellElement} TR\n     */\n\n  }, {\n    key: 'appendToTbody',\n    value: function appendToTbody(TR) {\n      this.TBODY.appendChild(TR);\n      this.wtTable.tbodyChildrenLength++;\n    }\n\n    /**\n     * @param {Number} rowIndex\n     * @param {HTMLTableRowElement} currentTr\n     * @returns {HTMLTableCellElement}\n     */\n\n  }, {\n    key: 'getOrCreateTrForRow',\n    value: function getOrCreateTrForRow(rowIndex, currentTr) {\n      var TR = void 0;\n\n      if (rowIndex >= this.wtTable.tbodyChildrenLength) {\n        TR = this.createRow();\n        this.appendToTbody(TR);\n      } else if (rowIndex === 0) {\n        TR = this.TBODY.firstChild;\n      } else {\n        // http://jsperf.com/nextsibling-vs-indexed-childnodes\n        TR = currentTr.nextSibling;\n      }\n      if (TR.className) {\n        TR.removeAttribute('class');\n      }\n\n      return TR;\n    }\n\n    /**\n     * @returns {HTMLTableCellElement}\n     */\n\n  }, {\n    key: 'createRow',\n    value: function createRow() {\n      var TR = document.createElement('TR');\n\n      for (var visibleColIndex = 0; visibleColIndex < this.rowHeaderCount; visibleColIndex++) {\n        TR.appendChild(document.createElement('TH'));\n      }\n\n      return TR;\n    }\n\n    /**\n     * @param {Number} row\n     * @param {Number} col\n     * @param {HTMLTableCellElement} TH\n     */\n\n  }, {\n    key: 'renderRowHeader',\n    value: function renderRowHeader(row, col, TH) {\n      TH.className = '';\n      TH.removeAttribute('style');\n      this.rowHeaders[col](row, TH, col);\n    }\n\n    /**\n     * @param {Number} row\n     * @param {HTMLTableCellElement} TR\n     */\n\n  }, {\n    key: 'renderRowHeaders',\n    value: function renderRowHeaders(row, TR) {\n      for (var TH = TR.firstChild, visibleColIndex = 0; visibleColIndex < this.rowHeaderCount; visibleColIndex++) {\n        // If the number of row headers increased we need to create TH or replace an existing TD node with TH\n        if (!TH) {\n          TH = document.createElement('TH');\n          TR.appendChild(TH);\n        } else if (TH.nodeName == 'TD') {\n          TH = replaceTdWithTh(TH, TR);\n        }\n        this.renderRowHeader(row, visibleColIndex, TH);\n        // http://jsperf.com/nextsibling-vs-indexed-childnodes\n        TH = TH.nextSibling;\n      }\n    }\n\n    /**\n     * Adjust the number of COL and TH elements to match the number of columns and headers that need to be rendered\n     */\n\n  }, {\n    key: 'adjustAvailableNodes',\n    value: function adjustAvailableNodes() {\n      this.adjustColGroups();\n      this.adjustThead();\n    }\n\n    /**\n     * Renders the column headers\n     */\n\n  }, {\n    key: 'renderColumnHeaders',\n    value: function renderColumnHeaders() {\n      if (!this.columnHeaderCount) {\n        return;\n      }\n      var columnCount = this.wtTable.getRenderedColumnsCount();\n\n      for (var i = 0; i < this.columnHeaderCount; i++) {\n        var TR = this.getTrForColumnHeaders(i);\n\n        for (var renderedColumnIndex = -1 * this.rowHeaderCount; renderedColumnIndex < columnCount; renderedColumnIndex++) {\n          var sourceCol = this.columnFilter.renderedToSource(renderedColumnIndex);\n\n          this.renderColumnHeader(i, sourceCol, TR.childNodes[renderedColumnIndex + this.rowHeaderCount]);\n        }\n      }\n    }\n\n    /**\n     * Adjusts the number of COL elements to match the number of columns that need to be rendered\n     */\n\n  }, {\n    key: 'adjustColGroups',\n    value: function adjustColGroups() {\n      var columnCount = this.wtTable.getRenderedColumnsCount();\n\n      while (this.wtTable.colgroupChildrenLength < columnCount + this.rowHeaderCount) {\n        this.COLGROUP.appendChild(document.createElement('COL'));\n        this.wtTable.colgroupChildrenLength++;\n      }\n      while (this.wtTable.colgroupChildrenLength > columnCount + this.rowHeaderCount) {\n        this.COLGROUP.removeChild(this.COLGROUP.lastChild);\n        this.wtTable.colgroupChildrenLength--;\n      }\n      if (this.rowHeaderCount) {\n        (0, _element.addClass)(this.COLGROUP.childNodes[0], 'rowHeader');\n      }\n    }\n\n    /**\n     * Adjusts the number of TH elements in THEAD to match the number of headers and columns that need to be rendered\n     */\n\n  }, {\n    key: 'adjustThead',\n    value: function adjustThead() {\n      var columnCount = this.wtTable.getRenderedColumnsCount();\n      var TR = this.THEAD.firstChild;\n\n      if (this.columnHeaders.length) {\n        for (var i = 0, len = this.columnHeaders.length; i < len; i++) {\n          TR = this.THEAD.childNodes[i];\n\n          if (!TR) {\n            TR = document.createElement('TR');\n            this.THEAD.appendChild(TR);\n          }\n          this.theadChildrenLength = TR.childNodes.length;\n\n          while (this.theadChildrenLength < columnCount + this.rowHeaderCount) {\n            TR.appendChild(document.createElement('TH'));\n            this.theadChildrenLength++;\n          }\n          while (this.theadChildrenLength > columnCount + this.rowHeaderCount) {\n            TR.removeChild(TR.lastChild);\n            this.theadChildrenLength--;\n          }\n        }\n        var theadChildrenLength = this.THEAD.childNodes.length;\n\n        if (theadChildrenLength > this.columnHeaders.length) {\n          for (var _i2 = this.columnHeaders.length; _i2 < theadChildrenLength; _i2++) {\n            this.THEAD.removeChild(this.THEAD.lastChild);\n          }\n        }\n      } else if (TR) {\n        (0, _element.empty)(TR);\n      }\n    }\n\n    /**\n     * @param {Number} index\n     * @returns {HTMLTableCellElement}\n     */\n\n  }, {\n    key: 'getTrForColumnHeaders',\n    value: function getTrForColumnHeaders(index) {\n      return this.THEAD.childNodes[index];\n    }\n\n    /**\n     * @param {Number} row\n     * @param {Number} col\n     * @param {HTMLTableCellElement} TH\n     * @returns {*}\n     */\n\n  }, {\n    key: 'renderColumnHeader',\n    value: function renderColumnHeader(row, col, TH) {\n      TH.className = '';\n      TH.removeAttribute('style');\n\n      return this.columnHeaders[row](col, TH, row);\n    }\n\n    /**\n     * Add and/or remove the TDs to match the desired number\n     *\n     * @param {HTMLTableCellElement} TR Table row in question\n     * @param {Number} desiredCount The desired number of TDs in the TR\n     */\n\n  }, {\n    key: 'adjustColumns',\n    value: function adjustColumns(TR, desiredCount) {\n      var count = TR.childNodes.length;\n\n      while (count < desiredCount) {\n        var TD = document.createElement('TD');\n\n        TR.appendChild(TD);\n        count++;\n      }\n      while (count > desiredCount) {\n        TR.removeChild(TR.lastChild);\n        count--;\n      }\n    }\n\n    /**\n     * @param {Number} columnsToRender\n     */\n\n  }, {\n    key: 'removeRedundantColumns',\n    value: function removeRedundantColumns(columnsToRender) {\n      while (this.wtTable.tbodyChildrenLength > columnsToRender) {\n        this.TBODY.removeChild(this.TBODY.lastChild);\n        this.wtTable.tbodyChildrenLength--;\n      }\n    }\n  }]);\n\n  return TableRenderer;\n}();\n\nfunction replaceTdWithTh(TD, TR) {\n  var TH = document.createElement('TH');\n\n  TR.insertBefore(TH, TD);\n  TR.removeChild(TD);\n\n  return TH;\n}\n\nfunction replaceThWithTd(TH, TR) {\n  var TD = document.createElement('TD');\n\n  TR.insertBefore(TD, TH);\n  TR.removeChild(TH);\n\n  return TD;\n}\n\nexports.default = TableRenderer;\n\n/***/ }),\n/* 305 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _viewportColumns = __webpack_require__(175);\n\nvar _viewportColumns2 = _interopRequireDefault(_viewportColumns);\n\nvar _viewportRows = __webpack_require__(176);\n\nvar _viewportRows2 = _interopRequireDefault(_viewportRows);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Viewport\n */\nvar Viewport = function () {\n  /**\n   * @param wotInstance\n   */\n  function Viewport(wotInstance) {\n    var _this = this;\n\n    _classCallCheck(this, Viewport);\n\n    this.wot = wotInstance;\n    // legacy support\n    this.instance = this.wot;\n\n    this.oversizedRows = [];\n    this.oversizedColumnHeaders = [];\n    this.hasOversizedColumnHeadersMarked = {};\n    this.clientHeight = 0;\n    this.containerWidth = NaN;\n    this.rowHeaderWidth = NaN;\n    this.rowsVisibleCalculator = null;\n    this.columnsVisibleCalculator = null;\n\n    this.eventManager = new _eventManager2.default(this.wot);\n    this.eventManager.addEventListener(window, 'resize', function () {\n      _this.clientHeight = _this.getWorkspaceHeight();\n    });\n  }\n\n  /**\n   * @returns {number}\n   */\n\n\n  _createClass(Viewport, [{\n    key: 'getWorkspaceHeight',\n    value: function getWorkspaceHeight() {\n      var trimmingContainer = this.instance.wtOverlays.topOverlay.trimmingContainer;\n      var elemHeight = void 0;\n      var height = 0;\n\n      if (trimmingContainer === window) {\n        height = document.documentElement.clientHeight;\n      } else {\n        elemHeight = (0, _element.outerHeight)(trimmingContainer);\n        // returns height without DIV scrollbar\n        height = elemHeight > 0 && trimmingContainer.clientHeight > 0 ? trimmingContainer.clientHeight : Infinity;\n      }\n\n      return height;\n    }\n  }, {\n    key: 'getWorkspaceWidth',\n    value: function getWorkspaceWidth() {\n      var width = void 0;\n      var totalColumns = this.wot.getSetting('totalColumns');\n      var trimmingContainer = this.instance.wtOverlays.leftOverlay.trimmingContainer;\n      var overflow = void 0;\n      var stretchSetting = this.wot.getSetting('stretchH');\n      var docOffsetWidth = document.documentElement.offsetWidth;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (preventOverflow) {\n        return (0, _element.outerWidth)(this.instance.wtTable.wtRootElement);\n      }\n\n      if (this.wot.getSetting('freezeOverlays')) {\n        width = Math.min(docOffsetWidth - this.getWorkspaceOffset().left, docOffsetWidth);\n      } else {\n        width = Math.min(this.getContainerFillWidth(), docOffsetWidth - this.getWorkspaceOffset().left, docOffsetWidth);\n      }\n\n      if (trimmingContainer === window && totalColumns > 0 && this.sumColumnWidths(0, totalColumns - 1) > width) {\n        // in case sum of column widths is higher than available stylesheet width, let's assume using the whole window\n        // otherwise continue below, which will allow stretching\n        // this is used in `scroll_window.html`\n        // TODO test me\n        return document.documentElement.clientWidth;\n      }\n\n      if (trimmingContainer !== window) {\n        overflow = (0, _element.getStyle)(this.instance.wtOverlays.leftOverlay.trimmingContainer, 'overflow');\n\n        if (overflow == 'scroll' || overflow == 'hidden' || overflow == 'auto') {\n          // this is used in `scroll.html`\n          // TODO test me\n          return Math.max(width, trimmingContainer.clientWidth);\n        }\n      }\n\n      if (stretchSetting === 'none' || !stretchSetting) {\n        // if no stretching is used, return the maximum used workspace width\n        return Math.max(width, (0, _element.outerWidth)(this.instance.wtTable.TABLE));\n      }\n\n      // if stretching is used, return the actual container width, so the columns can fit inside it\n      return width;\n    }\n\n    /**\n     * Checks if viewport has vertical scroll\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasVerticalScroll',\n    value: function hasVerticalScroll() {\n      return this.getWorkspaceActualHeight() > this.getWorkspaceHeight();\n    }\n\n    /**\n     * Checks if viewport has horizontal scroll\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasHorizontalScroll',\n    value: function hasHorizontalScroll() {\n      return this.getWorkspaceActualWidth() > this.getWorkspaceWidth();\n    }\n\n    /**\n     * @param from\n     * @param length\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'sumColumnWidths',\n    value: function sumColumnWidths(from, length) {\n      var sum = 0;\n\n      while (from < length) {\n        sum += this.wot.wtTable.getColumnWidth(from);\n        from++;\n      }\n\n      return sum;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getContainerFillWidth',\n    value: function getContainerFillWidth() {\n      if (this.containerWidth) {\n        return this.containerWidth;\n      }\n      var mainContainer = this.instance.wtTable.holder;\n      var fillWidth = void 0;\n      var dummyElement = void 0;\n\n      dummyElement = document.createElement('div');\n      dummyElement.style.width = '100%';\n      dummyElement.style.height = '1px';\n      mainContainer.appendChild(dummyElement);\n      fillWidth = dummyElement.offsetWidth;\n\n      this.containerWidth = fillWidth;\n      mainContainer.removeChild(dummyElement);\n\n      return fillWidth;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getWorkspaceOffset',\n    value: function getWorkspaceOffset() {\n      return (0, _element.offset)(this.wot.wtTable.TABLE);\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getWorkspaceActualHeight',\n    value: function getWorkspaceActualHeight() {\n      return (0, _element.outerHeight)(this.wot.wtTable.TABLE);\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getWorkspaceActualWidth',\n    value: function getWorkspaceActualWidth() {\n      return (0, _element.outerWidth)(this.wot.wtTable.TABLE) || (0, _element.outerWidth)(this.wot.wtTable.TBODY) || (0, _element.outerWidth)(this.wot.wtTable.THEAD); // IE8 reports 0 as <table> offsetWidth;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getColumnHeaderHeight',\n    value: function getColumnHeaderHeight() {\n      if (isNaN(this.columnHeaderHeight)) {\n        this.columnHeaderHeight = (0, _element.outerHeight)(this.wot.wtTable.THEAD);\n      }\n\n      return this.columnHeaderHeight;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getViewportHeight',\n    value: function getViewportHeight() {\n      var containerHeight = this.getWorkspaceHeight();\n      var columnHeaderHeight = void 0;\n\n      if (containerHeight === Infinity) {\n        return containerHeight;\n      }\n      columnHeaderHeight = this.getColumnHeaderHeight();\n\n      if (columnHeaderHeight > 0) {\n        containerHeight -= columnHeaderHeight;\n      }\n\n      return containerHeight;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getRowHeaderWidth',\n    value: function getRowHeaderWidth() {\n      var rowHeadersHeightSetting = this.instance.getSetting('rowHeaderWidth');\n      var rowHeaders = this.instance.getSetting('rowHeaders');\n\n      if (rowHeadersHeightSetting) {\n        this.rowHeaderWidth = 0;\n\n        for (var i = 0, len = rowHeaders.length; i < len; i++) {\n          this.rowHeaderWidth += rowHeadersHeightSetting[i] || rowHeadersHeightSetting;\n        }\n      }\n\n      if (this.wot.cloneSource) {\n        return this.wot.cloneSource.wtViewport.getRowHeaderWidth();\n      }\n\n      if (isNaN(this.rowHeaderWidth)) {\n\n        if (rowHeaders.length) {\n          var TH = this.instance.wtTable.TABLE.querySelector('TH');\n          this.rowHeaderWidth = 0;\n\n          for (var _i = 0, _len = rowHeaders.length; _i < _len; _i++) {\n            if (TH) {\n              this.rowHeaderWidth += (0, _element.outerWidth)(TH);\n              TH = TH.nextSibling;\n            } else {\n              // yes this is a cheat but it worked like that before, just taking assumption from CSS instead of measuring.\n              // TODO: proper fix\n              this.rowHeaderWidth += 50;\n            }\n          }\n        } else {\n          this.rowHeaderWidth = 0;\n        }\n      }\n\n      this.rowHeaderWidth = this.instance.getSetting('onModifyRowHeaderWidth', this.rowHeaderWidth) || this.rowHeaderWidth;\n\n      return this.rowHeaderWidth;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getViewportWidth',\n    value: function getViewportWidth() {\n      var containerWidth = this.getWorkspaceWidth();\n      var rowHeaderWidth = void 0;\n\n      if (containerWidth === Infinity) {\n        return containerWidth;\n      }\n      rowHeaderWidth = this.getRowHeaderWidth();\n\n      if (rowHeaderWidth > 0) {\n        return containerWidth - rowHeaderWidth;\n      }\n\n      return containerWidth;\n    }\n\n    /**\n     * Creates:\n     *  - rowsRenderCalculator (before draw, to qualify rows for rendering)\n     *  - rowsVisibleCalculator (after draw, to measure which rows are actually visible)\n     *\n     * @returns {ViewportRowsCalculator}\n     */\n\n  }, {\n    key: 'createRowsCalculator',\n    value: function createRowsCalculator() {\n      var _this2 = this;\n\n      var visible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      var height = void 0;\n      var pos = void 0;\n      var fixedRowsTop = void 0;\n      var scrollbarHeight = void 0;\n      var fixedRowsBottom = void 0;\n      var fixedRowsHeight = void 0;\n      var totalRows = void 0;\n\n      this.rowHeaderWidth = NaN;\n\n      if (this.wot.wtSettings.settings.renderAllRows && !visible) {\n        height = Infinity;\n      } else {\n        height = this.getViewportHeight();\n      }\n      pos = this.wot.wtOverlays.topOverlay.getScrollPosition() - this.wot.wtOverlays.topOverlay.getTableParentOffset();\n\n      if (pos < 0) {\n        pos = 0;\n      }\n      fixedRowsTop = this.wot.getSetting('fixedRowsTop');\n      fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');\n      totalRows = this.wot.getSetting('totalRows');\n\n      if (fixedRowsTop) {\n        fixedRowsHeight = this.wot.wtOverlays.topOverlay.sumCellSizes(0, fixedRowsTop);\n        pos += fixedRowsHeight;\n        height -= fixedRowsHeight;\n      }\n\n      if (fixedRowsBottom && this.wot.wtOverlays.bottomOverlay.clone) {\n        fixedRowsHeight = this.wot.wtOverlays.bottomOverlay.sumCellSizes(totalRows - fixedRowsBottom, totalRows);\n\n        height -= fixedRowsHeight;\n      }\n\n      if (this.wot.wtTable.holder.clientHeight === this.wot.wtTable.holder.offsetHeight) {\n        scrollbarHeight = 0;\n      } else {\n        scrollbarHeight = (0, _element.getScrollbarWidth)();\n      }\n\n      return new _viewportRows2.default(height, pos, this.wot.getSetting('totalRows'), function (sourceRow) {\n        return _this2.wot.wtTable.getRowHeight(sourceRow);\n      }, visible ? null : this.wot.wtSettings.settings.viewportRowCalculatorOverride, visible, scrollbarHeight);\n    }\n\n    /**\n     * Creates:\n     *  - columnsRenderCalculator (before draw, to qualify columns for rendering)\n     *  - columnsVisibleCalculator (after draw, to measure which columns are actually visible)\n     *\n     * @returns {ViewportRowsCalculator}\n     */\n\n  }, {\n    key: 'createColumnsCalculator',\n    value: function createColumnsCalculator() {\n      var _this3 = this;\n\n      var visible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      var width = this.getViewportWidth();\n      var pos = void 0;\n      var fixedColumnsLeft = void 0;\n\n      this.columnHeaderHeight = NaN;\n\n      pos = this.wot.wtOverlays.leftOverlay.getScrollPosition() - this.wot.wtOverlays.leftOverlay.getTableParentOffset();\n\n      if (pos < 0) {\n        pos = 0;\n      }\n      fixedColumnsLeft = this.wot.getSetting('fixedColumnsLeft');\n\n      if (fixedColumnsLeft) {\n        var fixedColumnsWidth = this.wot.wtOverlays.leftOverlay.sumCellSizes(0, fixedColumnsLeft);\n        pos += fixedColumnsWidth;\n        width -= fixedColumnsWidth;\n      }\n      if (this.wot.wtTable.holder.clientWidth !== this.wot.wtTable.holder.offsetWidth) {\n        width -= (0, _element.getScrollbarWidth)();\n      }\n\n      return new _viewportColumns2.default(width, pos, this.wot.getSetting('totalColumns'), function (sourceCol) {\n        return _this3.wot.wtTable.getColumnWidth(sourceCol);\n      }, visible ? null : this.wot.wtSettings.settings.viewportColumnCalculatorOverride, visible, this.wot.getSetting('stretchH'), function (stretchedWidth, column) {\n        return _this3.wot.getSetting('onBeforeStretchingColumnWidth', stretchedWidth, column);\n      });\n    }\n\n    /**\n     * Creates rowsRenderCalculator and columnsRenderCalculator (before draw, to determine what rows and\n     * cols should be rendered)\n     *\n     * @param fastDraw {Boolean} If `true`, will try to avoid full redraw and only update the border positions.\n     *                           If `false` or `undefined`, will perform a full redraw\n     * @returns fastDraw {Boolean} The fastDraw value, possibly modified\n     */\n\n  }, {\n    key: 'createRenderCalculators',\n    value: function createRenderCalculators() {\n      var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (fastDraw) {\n        var proposedRowsVisibleCalculator = this.createRowsCalculator(true);\n        var proposedColumnsVisibleCalculator = this.createColumnsCalculator(true);\n\n        if (!(this.areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator) && this.areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator))) {\n          fastDraw = false;\n        }\n      }\n\n      if (!fastDraw) {\n        this.rowsRenderCalculator = this.createRowsCalculator();\n        this.columnsRenderCalculator = this.createColumnsCalculator();\n      }\n      // delete temporarily to make sure that renderers always use rowsRenderCalculator, not rowsVisibleCalculator\n      this.rowsVisibleCalculator = null;\n      this.columnsVisibleCalculator = null;\n\n      return fastDraw;\n    }\n\n    /**\n     * Creates rowsVisibleCalculator and columnsVisibleCalculator (after draw, to determine what are\n     * the actually visible rows and columns)\n     */\n\n  }, {\n    key: 'createVisibleCalculators',\n    value: function createVisibleCalculators() {\n      this.rowsVisibleCalculator = this.createRowsCalculator(true);\n      this.columnsVisibleCalculator = this.createColumnsCalculator(true);\n    }\n\n    /**\n     * Returns information whether proposedRowsVisibleCalculator viewport\n     * is contained inside rows rendered in previous draw (cached in rowsRenderCalculator)\n     *\n     * @param {Object} proposedRowsVisibleCalculator\n     * @returns {Boolean} Returns `true` if all proposed visible rows are already rendered (meaning: redraw is not needed).\n     *                    Returns `false` if at least one proposed visible row is not already rendered (meaning: redraw is needed)\n     */\n\n  }, {\n    key: 'areAllProposedVisibleRowsAlreadyRendered',\n    value: function areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator) {\n      if (this.rowsVisibleCalculator) {\n        if (proposedRowsVisibleCalculator.startRow < this.rowsRenderCalculator.startRow || proposedRowsVisibleCalculator.startRow === this.rowsRenderCalculator.startRow && proposedRowsVisibleCalculator.startRow > 0) {\n          return false;\n        } else if (proposedRowsVisibleCalculator.endRow > this.rowsRenderCalculator.endRow || proposedRowsVisibleCalculator.endRow === this.rowsRenderCalculator.endRow && proposedRowsVisibleCalculator.endRow < this.wot.getSetting('totalRows') - 1) {\n          return false;\n        }\n        return true;\n      }\n\n      return false;\n    }\n\n    /**\n     * Returns information whether proposedColumnsVisibleCalculator viewport\n     * is contained inside column rendered in previous draw (cached in columnsRenderCalculator)\n     *\n     * @param {Object} proposedColumnsVisibleCalculator\n     * @returns {Boolean} Returns `true` if all proposed visible columns are already rendered (meaning: redraw is not needed).\n     *                    Returns `false` if at least one proposed visible column is not already rendered (meaning: redraw is needed)\n     */\n\n  }, {\n    key: 'areAllProposedVisibleColumnsAlreadyRendered',\n    value: function areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator) {\n      if (this.columnsVisibleCalculator) {\n        if (proposedColumnsVisibleCalculator.startColumn < this.columnsRenderCalculator.startColumn || proposedColumnsVisibleCalculator.startColumn === this.columnsRenderCalculator.startColumn && proposedColumnsVisibleCalculator.startColumn > 0) {\n          return false;\n        } else if (proposedColumnsVisibleCalculator.endColumn > this.columnsRenderCalculator.endColumn || proposedColumnsVisibleCalculator.endColumn === this.columnsRenderCalculator.endColumn && proposedColumnsVisibleCalculator.endColumn < this.wot.getSetting('totalColumns') - 1) {\n          return false;\n        }\n        return true;\n      }\n\n      return false;\n    }\n\n    /**\n     * Resets values in keys of the hasOversizedColumnHeadersMarked object after updateSettings.\n     */\n\n  }, {\n    key: 'resetHasOversizedColumnHeadersMarked',\n    value: function resetHasOversizedColumnHeadersMarked() {\n      (0, _object.objectEach)(this.hasOversizedColumnHeadersMarked, function (value, key, object) {\n        object[key] = void 0;\n      });\n    }\n  }]);\n\n  return Viewport;\n}();\n\nexports.default = Viewport;\n\n/***/ }),\n/* 306 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _event = __webpack_require__(12);\n\nvar _object = __webpack_require__(2);\n\nvar _browser = __webpack_require__(27);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _coords = __webpack_require__(55);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n *\n */\nvar Border = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   * @param {Object} settings\n   */\n  function Border(wotInstance, settings) {\n    _classCallCheck(this, Border);\n\n    if (!settings) {\n      return;\n    }\n    this.eventManager = new _eventManager2.default(wotInstance);\n    this.instance = wotInstance;\n    this.wot = wotInstance;\n    this.settings = settings;\n    this.mouseDown = false;\n    this.main = null;\n\n    this.top = null;\n    this.left = null;\n    this.bottom = null;\n    this.right = null;\n\n    this.topStyle = null;\n    this.leftStyle = null;\n    this.bottomStyle = null;\n    this.rightStyle = null;\n\n    this.cornerDefaultStyle = {\n      width: '6px',\n      height: '6px',\n      borderWidth: '1px',\n      borderStyle: 'solid',\n      borderColor: '#FFF'\n    };\n    this.corner = null;\n    this.cornerStyle = null;\n\n    this.createBorders(settings);\n    this.registerListeners();\n  }\n\n  /**\n   * Register all necessary events\n   */\n\n\n  _createClass(Border, [{\n    key: 'registerListeners',\n    value: function registerListeners() {\n      var _this2 = this;\n\n      this.eventManager.addEventListener(document.body, 'mousedown', function () {\n        return _this2.onMouseDown();\n      });\n      this.eventManager.addEventListener(document.body, 'mouseup', function () {\n        return _this2.onMouseUp();\n      });\n\n      var _loop = function _loop(c, len) {\n        _this2.eventManager.addEventListener(_this2.main.childNodes[c], 'mouseenter', function (event) {\n          return _this2.onMouseEnter(event, _this2.main.childNodes[c]);\n        });\n      };\n\n      for (var c = 0, len = this.main.childNodes.length; c < len; c++) {\n        _loop(c, len);\n      }\n    }\n\n    /**\n     * Mouse down listener\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseDown',\n    value: function onMouseDown() {\n      this.mouseDown = true;\n    }\n\n    /**\n     * Mouse up listener\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      this.mouseDown = false;\n    }\n\n    /**\n     * Mouse enter listener for fragment selection functionality.\n     *\n     * @private\n     * @param {Event} event Dom event\n     * @param {HTMLElement} parentElement Part of border element.\n     */\n\n  }, {\n    key: 'onMouseEnter',\n    value: function onMouseEnter(event, parentElement) {\n      if (!this.mouseDown || !this.wot.getSetting('hideBorderOnMouseDownOver')) {\n        return;\n      }\n      event.preventDefault();\n      (0, _event.stopImmediatePropagation)(event);\n\n      var _this = this;\n      var bounds = parentElement.getBoundingClientRect();\n      // Hide border to prevents selection jumping when fragmentSelection is enabled.\n      parentElement.style.display = 'none';\n\n      function isOutside(event) {\n        if (event.clientY < Math.floor(bounds.top)) {\n          return true;\n        }\n        if (event.clientY > Math.ceil(bounds.top + bounds.height)) {\n          return true;\n        }\n        if (event.clientX < Math.floor(bounds.left)) {\n          return true;\n        }\n        if (event.clientX > Math.ceil(bounds.left + bounds.width)) {\n          return true;\n        }\n      }\n\n      function handler(event) {\n        if (isOutside(event)) {\n          _this.eventManager.removeEventListener(document.body, 'mousemove', handler);\n          parentElement.style.display = 'block';\n        }\n      }\n\n      this.eventManager.addEventListener(document.body, 'mousemove', handler);\n    }\n\n    /**\n     * Create border elements\n     *\n     * @param {Object} settings\n     */\n\n  }, {\n    key: 'createBorders',\n    value: function createBorders(settings) {\n      this.main = document.createElement('div');\n\n      var borderDivs = ['top', 'left', 'bottom', 'right', 'corner'];\n      var style = this.main.style;\n      style.position = 'absolute';\n      style.top = 0;\n      style.left = 0;\n\n      for (var i = 0; i < 5; i++) {\n        var position = borderDivs[i];\n        var div = document.createElement('div');\n        div.className = 'wtBorder ' + (this.settings.className || ''); // + borderDivs[i];\n\n        if (this.settings[position] && this.settings[position].hide) {\n          div.className += ' hidden';\n        }\n        style = div.style;\n        style.backgroundColor = this.settings[position] && this.settings[position].color ? this.settings[position].color : settings.border.color;\n        style.height = this.settings[position] && this.settings[position].width ? this.settings[position].width + 'px' : settings.border.width + 'px';\n        style.width = this.settings[position] && this.settings[position].width ? this.settings[position].width + 'px' : settings.border.width + 'px';\n\n        this.main.appendChild(div);\n      }\n      this.top = this.main.childNodes[0];\n      this.left = this.main.childNodes[1];\n      this.bottom = this.main.childNodes[2];\n      this.right = this.main.childNodes[3];\n\n      this.topStyle = this.top.style;\n      this.leftStyle = this.left.style;\n      this.bottomStyle = this.bottom.style;\n      this.rightStyle = this.right.style;\n\n      this.corner = this.main.childNodes[4];\n      this.corner.className += ' corner';\n      this.cornerStyle = this.corner.style;\n      this.cornerStyle.width = this.cornerDefaultStyle.width;\n      this.cornerStyle.height = this.cornerDefaultStyle.height;\n      this.cornerStyle.border = [this.cornerDefaultStyle.borderWidth, this.cornerDefaultStyle.borderStyle, this.cornerDefaultStyle.borderColor].join(' ');\n\n      if ((0, _browser.isMobileBrowser)()) {\n        this.createMultipleSelectorHandles();\n      }\n      this.disappear();\n\n      if (!this.wot.wtTable.bordersHolder) {\n        this.wot.wtTable.bordersHolder = document.createElement('div');\n        this.wot.wtTable.bordersHolder.className = 'htBorders';\n        this.wot.wtTable.spreader.appendChild(this.wot.wtTable.bordersHolder);\n      }\n      this.wot.wtTable.bordersHolder.insertBefore(this.main, this.wot.wtTable.bordersHolder.firstChild);\n    }\n\n    /**\n     * Create multiple selector handler for mobile devices\n     */\n\n  }, {\n    key: 'createMultipleSelectorHandles',\n    value: function createMultipleSelectorHandles() {\n      this.selectionHandles = {\n        topLeft: document.createElement('DIV'),\n        topLeftHitArea: document.createElement('DIV'),\n        bottomRight: document.createElement('DIV'),\n        bottomRightHitArea: document.createElement('DIV')\n      };\n      var width = 10;\n      var hitAreaWidth = 40;\n\n      this.selectionHandles.topLeft.className = 'topLeftSelectionHandle';\n      this.selectionHandles.topLeftHitArea.className = 'topLeftSelectionHandle-HitArea';\n      this.selectionHandles.bottomRight.className = 'bottomRightSelectionHandle';\n      this.selectionHandles.bottomRightHitArea.className = 'bottomRightSelectionHandle-HitArea';\n\n      this.selectionHandles.styles = {\n        topLeft: this.selectionHandles.topLeft.style,\n        topLeftHitArea: this.selectionHandles.topLeftHitArea.style,\n        bottomRight: this.selectionHandles.bottomRight.style,\n        bottomRightHitArea: this.selectionHandles.bottomRightHitArea.style\n      };\n\n      var hitAreaStyle = {\n        position: 'absolute',\n        height: hitAreaWidth + 'px',\n        width: hitAreaWidth + 'px',\n        'border-radius': parseInt(hitAreaWidth / 1.5, 10) + 'px'\n      };\n\n      for (var prop in hitAreaStyle) {\n        if ((0, _object.hasOwnProperty)(hitAreaStyle, prop)) {\n          this.selectionHandles.styles.bottomRightHitArea[prop] = hitAreaStyle[prop];\n          this.selectionHandles.styles.topLeftHitArea[prop] = hitAreaStyle[prop];\n        }\n      }\n\n      var handleStyle = {\n        position: 'absolute',\n        height: width + 'px',\n        width: width + 'px',\n        'border-radius': parseInt(width / 1.5, 10) + 'px',\n        background: '#F5F5FF',\n        border: '1px solid #4285c8'\n      };\n\n      for (var _prop in handleStyle) {\n        if ((0, _object.hasOwnProperty)(handleStyle, _prop)) {\n          this.selectionHandles.styles.bottomRight[_prop] = handleStyle[_prop];\n          this.selectionHandles.styles.topLeft[_prop] = handleStyle[_prop];\n        }\n      }\n      this.main.appendChild(this.selectionHandles.topLeft);\n      this.main.appendChild(this.selectionHandles.bottomRight);\n      this.main.appendChild(this.selectionHandles.topLeftHitArea);\n      this.main.appendChild(this.selectionHandles.bottomRightHitArea);\n    }\n  }, {\n    key: 'isPartRange',\n    value: function isPartRange(row, col) {\n      var areaSelection = this.wot.selections.createOrGetArea();\n\n      if (areaSelection.cellRange) {\n        if (row != areaSelection.cellRange.to.row || col != areaSelection.cellRange.to.col) {\n          return true;\n        }\n      }\n\n      return false;\n    }\n  }, {\n    key: 'updateMultipleSelectionHandlesPosition',\n    value: function updateMultipleSelectionHandlesPosition(row, col, top, left, width, height) {\n      var handleWidth = parseInt(this.selectionHandles.styles.topLeft.width, 10);\n      var hitAreaWidth = parseInt(this.selectionHandles.styles.topLeftHitArea.width, 10);\n\n      this.selectionHandles.styles.topLeft.top = parseInt(top - handleWidth, 10) + 'px';\n      this.selectionHandles.styles.topLeft.left = parseInt(left - handleWidth, 10) + 'px';\n\n      this.selectionHandles.styles.topLeftHitArea.top = parseInt(top - hitAreaWidth / 4 * 3, 10) + 'px';\n      this.selectionHandles.styles.topLeftHitArea.left = parseInt(left - hitAreaWidth / 4 * 3, 10) + 'px';\n\n      this.selectionHandles.styles.bottomRight.top = parseInt(top + height, 10) + 'px';\n      this.selectionHandles.styles.bottomRight.left = parseInt(left + width, 10) + 'px';\n\n      this.selectionHandles.styles.bottomRightHitArea.top = parseInt(top + height - hitAreaWidth / 4, 10) + 'px';\n      this.selectionHandles.styles.bottomRightHitArea.left = parseInt(left + width - hitAreaWidth / 4, 10) + 'px';\n\n      if (this.settings.border.cornerVisible && this.settings.border.cornerVisible()) {\n        this.selectionHandles.styles.topLeft.display = 'block';\n        this.selectionHandles.styles.topLeftHitArea.display = 'block';\n\n        if (this.isPartRange(row, col)) {\n          this.selectionHandles.styles.bottomRight.display = 'none';\n          this.selectionHandles.styles.bottomRightHitArea.display = 'none';\n        } else {\n          this.selectionHandles.styles.bottomRight.display = 'block';\n          this.selectionHandles.styles.bottomRightHitArea.display = 'block';\n        }\n      } else {\n        this.selectionHandles.styles.topLeft.display = 'none';\n        this.selectionHandles.styles.bottomRight.display = 'none';\n        this.selectionHandles.styles.topLeftHitArea.display = 'none';\n        this.selectionHandles.styles.bottomRightHitArea.display = 'none';\n      }\n\n      if (row == this.wot.wtSettings.getSetting('fixedRowsTop') || col == this.wot.wtSettings.getSetting('fixedColumnsLeft')) {\n        this.selectionHandles.styles.topLeft.zIndex = '9999';\n        this.selectionHandles.styles.topLeftHitArea.zIndex = '9999';\n      } else {\n        this.selectionHandles.styles.topLeft.zIndex = '';\n        this.selectionHandles.styles.topLeftHitArea.zIndex = '';\n      }\n    }\n\n    /**\n     * Show border around one or many cells\n     *\n     * @param {Array} corners\n     */\n\n  }, {\n    key: 'appear',\n    value: function appear(corners) {\n      if (this.disabled) {\n        return;\n      }\n\n      var fromRow = void 0;\n      var toRow = void 0;\n      var fromColumn = void 0;\n      var toColumn = void 0;\n\n      var rowsCount = this.wot.wtTable.getRenderedRowsCount();\n\n      for (var i = 0; i < rowsCount; i += 1) {\n        var s = this.wot.wtTable.rowFilter.renderedToSource(i);\n\n        if (s >= corners[0] && s <= corners[2]) {\n          fromRow = s;\n          break;\n        }\n      }\n\n      for (var _i = rowsCount - 1; _i >= 0; _i -= 1) {\n        var _s = this.wot.wtTable.rowFilter.renderedToSource(_i);\n\n        if (_s >= corners[0] && _s <= corners[2]) {\n          toRow = _s;\n          break;\n        }\n      }\n\n      var columnsCount = this.wot.wtTable.getRenderedColumnsCount();\n\n      for (var _i2 = 0; _i2 < columnsCount; _i2 += 1) {\n        var _s2 = this.wot.wtTable.columnFilter.renderedToSource(_i2);\n\n        if (_s2 >= corners[1] && _s2 <= corners[3]) {\n          fromColumn = _s2;\n          break;\n        }\n      }\n\n      for (var _i3 = columnsCount - 1; _i3 >= 0; _i3 -= 1) {\n        var _s3 = this.wot.wtTable.columnFilter.renderedToSource(_i3);\n\n        if (_s3 >= corners[1] && _s3 <= corners[3]) {\n          toColumn = _s3;\n          break;\n        }\n      }\n      if (fromRow === void 0 || fromColumn === void 0) {\n        this.disappear();\n\n        return;\n      }\n      var fromTD = this.wot.wtTable.getCell(new _coords2.default(fromRow, fromColumn));\n      var isMultiple = fromRow !== toRow || fromColumn !== toColumn;\n      var toTD = isMultiple ? this.wot.wtTable.getCell(new _coords2.default(toRow, toColumn)) : fromTD;\n      var fromOffset = (0, _element.offset)(fromTD);\n      var toOffset = isMultiple ? (0, _element.offset)(toTD) : fromOffset;\n      var containerOffset = (0, _element.offset)(this.wot.wtTable.TABLE);\n      var minTop = fromOffset.top;\n      var minLeft = fromOffset.left;\n\n      var left = minLeft - containerOffset.left - 1;\n      var width = toOffset.left + (0, _element.outerWidth)(toTD) - minLeft;\n\n      if (this.isEntireColumnSelected(fromRow, toRow)) {\n        var modifiedValues = this.getDimensionsFromHeader('columns', fromColumn, toColumn, containerOffset);\n        var fromTH = null;\n\n        if (modifiedValues) {\n          var _modifiedValues = _slicedToArray(modifiedValues, 3);\n\n          fromTH = _modifiedValues[0];\n          left = _modifiedValues[1];\n          width = _modifiedValues[2];\n        }\n\n        if (fromTH) {\n          fromTD = fromTH;\n        }\n      }\n\n      var top = minTop - containerOffset.top - 1;\n      var height = toOffset.top + (0, _element.outerHeight)(toTD) - minTop;\n\n      if (this.isEntireRowSelected(fromColumn, toColumn)) {\n        var _modifiedValues2 = this.getDimensionsFromHeader('rows', fromRow, toRow, containerOffset);\n        var _fromTH = null;\n\n        if (_modifiedValues2) {\n          var _modifiedValues3 = _slicedToArray(_modifiedValues2, 3);\n\n          _fromTH = _modifiedValues3[0];\n          top = _modifiedValues3[1];\n          height = _modifiedValues3[2];\n        }\n\n        if (_fromTH) {\n          fromTD = _fromTH;\n        }\n      }\n\n      var style = (0, _element.getComputedStyle)(fromTD);\n\n      if (parseInt(style.borderTopWidth, 10) > 0) {\n        top += 1;\n        height = height > 0 ? height - 1 : 0;\n      }\n      if (parseInt(style.borderLeftWidth, 10) > 0) {\n        left += 1;\n        width = width > 0 ? width - 1 : 0;\n      }\n\n      this.topStyle.top = top + 'px';\n      this.topStyle.left = left + 'px';\n      this.topStyle.width = width + 'px';\n      this.topStyle.display = 'block';\n\n      this.leftStyle.top = top + 'px';\n      this.leftStyle.left = left + 'px';\n      this.leftStyle.height = height + 'px';\n      this.leftStyle.display = 'block';\n\n      var delta = Math.floor(this.settings.border.width / 2);\n\n      this.bottomStyle.top = top + height - delta + 'px';\n      this.bottomStyle.left = left + 'px';\n      this.bottomStyle.width = width + 'px';\n      this.bottomStyle.display = 'block';\n\n      this.rightStyle.top = top + 'px';\n      this.rightStyle.left = left + width - delta + 'px';\n      this.rightStyle.height = height + 1 + 'px';\n      this.rightStyle.display = 'block';\n\n      var cornerVisibleSetting = this.settings.border.cornerVisible;\n      cornerVisibleSetting = typeof cornerVisibleSetting === 'function' ? cornerVisibleSetting(this.settings.layerLevel) : cornerVisibleSetting;\n\n      var hookResult = this.wot.getSetting('onModifyGetCellCoords', toRow, toColumn);\n      var checkRow = toRow,\n          checkCol = toColumn;\n\n\n      if (hookResult && Array.isArray(hookResult)) {\n        var _hookResult = _slicedToArray(hookResult, 4);\n\n        checkRow = _hookResult[2];\n        checkCol = _hookResult[3];\n      }\n\n      if ((0, _browser.isMobileBrowser)() || !cornerVisibleSetting || this.isPartRange(checkRow, checkCol)) {\n        this.cornerStyle.display = 'none';\n      } else {\n        this.cornerStyle.top = top + height - 4 + 'px';\n        this.cornerStyle.left = left + width - 4 + 'px';\n        this.cornerStyle.borderRightWidth = this.cornerDefaultStyle.borderWidth;\n        this.cornerStyle.width = this.cornerDefaultStyle.width;\n\n        // Hide the fill handle, so the possible further adjustments won't force unneeded scrollbars.\n        this.cornerStyle.display = 'none';\n\n        var trimmingContainer = (0, _element.getTrimmingContainer)(this.wot.wtTable.TABLE);\n\n        if (toColumn === this.wot.getSetting('totalColumns') - 1) {\n          var cornerOverlappingContainer = toTD.offsetLeft + (0, _element.outerWidth)(toTD) + parseInt(this.cornerDefaultStyle.width, 10) / 2 >= (0, _element.innerWidth)(trimmingContainer);\n\n          if (cornerOverlappingContainer) {\n            this.cornerStyle.left = Math.floor(left + width - 3 - parseInt(this.cornerDefaultStyle.width, 10) / 2) + 'px';\n            this.cornerStyle.borderRightWidth = 0;\n          }\n        }\n\n        if (toRow === this.wot.getSetting('totalRows') - 1) {\n          var _cornerOverlappingContainer = toTD.offsetTop + (0, _element.outerHeight)(toTD) + parseInt(this.cornerDefaultStyle.height, 10) / 2 >= (0, _element.innerHeight)(trimmingContainer);\n\n          if (_cornerOverlappingContainer) {\n            this.cornerStyle.top = Math.floor(top + height - 3 - parseInt(this.cornerDefaultStyle.height, 10) / 2) + 'px';\n            this.cornerStyle.borderBottomWidth = 0;\n          }\n        }\n\n        this.cornerStyle.display = 'block';\n      }\n\n      if ((0, _browser.isMobileBrowser)()) {\n        this.updateMultipleSelectionHandlesPosition(toRow, toColumn, top, left, width, height);\n      }\n    }\n\n    /**\n     * Check whether an entire column of cells is selected.\n     *\n     * @private\n     * @param {Number} startRowIndex Start row index.\n     * @param {Number} endRowIndex End row index.\n     */\n\n  }, {\n    key: 'isEntireColumnSelected',\n    value: function isEntireColumnSelected(startRowIndex, endRowIndex) {\n      return startRowIndex === this.wot.wtTable.getFirstRenderedRow() && endRowIndex === this.wot.wtTable.getLastRenderedRow();\n    }\n\n    /**\n     * Check whether an entire row of cells is selected.\n     *\n     * @private\n     * @param {Number} startColumnIndex Start column index.\n     * @param {Number} endColumnIndex End column index.\n     */\n\n  }, {\n    key: 'isEntireRowSelected',\n    value: function isEntireRowSelected(startColumnIndex, endColumnIndex) {\n      return startColumnIndex === this.wot.wtTable.getFirstRenderedColumn() && endColumnIndex === this.wot.wtTable.getLastRenderedColumn();\n    }\n\n    /**\n     * Get left/top index and width/height depending on the `direction` provided.\n     *\n     * @private\n     * @param {String} direction `rows` or `columns`, defines if an entire column or row is selected.\n     * @param {Number} fromIndex Start index of the selection.\n     * @param {Number} toIndex End index of the selection.\n     * @param {Number} containerOffset offset of the container.\n     * @return {Array|Boolean} Returns an array of [headerElement, left, width] or [headerElement, top, height], depending on `direction` (`false` in case of an error getting the headers).\n     */\n\n  }, {\n    key: 'getDimensionsFromHeader',\n    value: function getDimensionsFromHeader(direction, fromIndex, toIndex, containerOffset) {\n      var _this3 = this;\n\n      var rootHotElement = this.wot.wtTable.wtRootElement.parentNode;\n      var getHeaderFn = null;\n      var dimensionFn = null;\n      var entireSelectionClassname = null;\n      var index = null;\n      var dimension = null;\n      var dimensionProperty = null;\n      var startHeader = null;\n      var endHeader = null;\n\n      switch (direction) {\n        case 'rows':\n          getHeaderFn = function getHeaderFn() {\n            var _wot$wtTable;\n\n            return (_wot$wtTable = _this3.wot.wtTable).getRowHeader.apply(_wot$wtTable, arguments);\n          };\n          dimensionFn = function dimensionFn() {\n            return _element.outerHeight.apply(undefined, arguments);\n          };\n          entireSelectionClassname = 'ht__selection--rows';\n          dimensionProperty = 'top';\n\n          break;\n\n        case 'columns':\n          getHeaderFn = function getHeaderFn() {\n            var _wot$wtTable2;\n\n            return (_wot$wtTable2 = _this3.wot.wtTable).getColumnHeader.apply(_wot$wtTable2, arguments);\n          };\n          dimensionFn = function dimensionFn() {\n            return _element.outerWidth.apply(undefined, arguments);\n          };\n          entireSelectionClassname = 'ht__selection--columns';\n          dimensionProperty = 'left';\n          break;\n        default:\n      }\n\n      if (rootHotElement.className.includes(entireSelectionClassname)) {\n        var columnHeaderLevelCount = this.wot.getSetting('columnHeaders').length;\n\n        startHeader = getHeaderFn(fromIndex, columnHeaderLevelCount - 1);\n        endHeader = getHeaderFn(toIndex, columnHeaderLevelCount - 1);\n\n        if (!startHeader || !endHeader) {\n          return false;\n        }\n\n        var startHeaderOffset = (0, _element.offset)(startHeader);\n        var endOffset = (0, _element.offset)(endHeader);\n\n        if (startHeader && endHeader) {\n          index = startHeaderOffset[dimensionProperty] - containerOffset[dimensionProperty] - 1;\n          dimension = endOffset[dimensionProperty] + dimensionFn(endHeader) - startHeaderOffset[dimensionProperty];\n        }\n\n        return [startHeader, index, dimension];\n      }\n\n      return false;\n    }\n\n    /**\n     * Hide border\n     */\n\n  }, {\n    key: 'disappear',\n    value: function disappear() {\n      this.topStyle.display = 'none';\n      this.leftStyle.display = 'none';\n      this.bottomStyle.display = 'none';\n      this.rightStyle.display = 'none';\n      this.cornerStyle.display = 'none';\n\n      if ((0, _browser.isMobileBrowser)()) {\n        this.selectionHandles.styles.topLeft.display = 'none';\n        this.selectionHandles.styles.bottomRight.display = 'none';\n      }\n    }\n  }]);\n\n  return Border;\n}();\n\nexports.default = Border;\n\n/***/ }),\n/* 307 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _unicode = __webpack_require__(21);\n\nvar _mixed = __webpack_require__(16);\n\nvar _string = __webpack_require__(36);\n\nvar _array = __webpack_require__(1);\n\nvar _element = __webpack_require__(0);\n\nvar _handsontableEditor = __webpack_require__(308);\n\nvar _handsontableEditor2 = _interopRequireDefault(_handsontableEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AutocompleteEditor = _handsontableEditor2.default.prototype.extend();\n\n/**\n * @private\n * @editor AutocompleteEditor\n * @class AutocompleteEditor\n * @dependencies HandsontableEditor\n */\nAutocompleteEditor.prototype.init = function () {\n  _handsontableEditor2.default.prototype.init.apply(this, arguments);\n  this.query = null;\n  this.strippedChoices = [];\n  this.rawChoices = [];\n};\n\nAutocompleteEditor.prototype.getValue = function () {\n  var _this2 = this;\n\n  var selectedValue = this.rawChoices.find(function (value) {\n    var strippedValue = _this2.stripValueIfNeeded(value);\n\n    return strippedValue === _this2.TEXTAREA.value;\n  });\n\n  if ((0, _mixed.isDefined)(selectedValue)) {\n    return selectedValue;\n  }\n\n  return this.TEXTAREA.value;\n};\n\nAutocompleteEditor.prototype.createElements = function () {\n  _handsontableEditor2.default.prototype.createElements.apply(this, arguments);\n\n  (0, _element.addClass)(this.htContainer, 'autocompleteEditor');\n  (0, _element.addClass)(this.htContainer, window.navigator.platform.indexOf('Mac') === -1 ? '' : 'htMacScroll');\n};\n\nvar skipOne = false;\nfunction onBeforeKeyDown(event) {\n  skipOne = false;\n  var editor = this.getActiveEditor();\n\n  if ((0, _unicode.isPrintableChar)(event.keyCode) || event.keyCode === _unicode.KEY_CODES.BACKSPACE || event.keyCode === _unicode.KEY_CODES.DELETE || event.keyCode === _unicode.KEY_CODES.INSERT) {\n    var timeOffset = 0;\n\n    // on ctl+c / cmd+c don't update suggestion list\n    if (event.keyCode === _unicode.KEY_CODES.C && (event.ctrlKey || event.metaKey)) {\n      return;\n    }\n    if (!editor.isOpened()) {\n      timeOffset += 10;\n    }\n\n    if (editor.htEditor) {\n      editor.instance._registerTimeout(setTimeout(function () {\n        editor.queryChoices(editor.TEXTAREA.value);\n        skipOne = true;\n      }, timeOffset));\n    }\n  }\n}\n\nAutocompleteEditor.prototype.prepare = function () {\n  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);\n  _handsontableEditor2.default.prototype.prepare.apply(this, arguments);\n};\n\nAutocompleteEditor.prototype.open = function () {\n  // Ugly fix for handsontable which grab window object for autocomplete scroll listener instead table element.\n  this.TEXTAREA_PARENT.style.overflow = 'auto';\n  _handsontableEditor2.default.prototype.open.apply(this, arguments);\n  this.TEXTAREA_PARENT.style.overflow = '';\n\n  var choicesListHot = this.htEditor.getInstance();\n  var _this = this;\n  var trimDropdown = this.cellProperties.trimDropdown === void 0 ? true : this.cellProperties.trimDropdown;\n\n  this.TEXTAREA.style.visibility = 'visible';\n  this.focus();\n\n  choicesListHot.updateSettings({\n    colWidths: trimDropdown ? [(0, _element.outerWidth)(this.TEXTAREA) - 2] : void 0,\n    width: trimDropdown ? (0, _element.outerWidth)(this.TEXTAREA) + (0, _element.getScrollbarWidth)() + 2 : void 0,\n    afterRenderer: function afterRenderer(TD, row, col, prop, value, cellProperties) {\n      var _this$cellProperties = _this.cellProperties,\n          filteringCaseSensitive = _this$cellProperties.filteringCaseSensitive,\n          allowHtml = _this$cellProperties.allowHtml;\n\n      var indexOfMatch = void 0;\n      var match = void 0;\n\n      value = (0, _mixed.stringify)(value);\n\n      if (value && !allowHtml) {\n        indexOfMatch = filteringCaseSensitive === true ? value.indexOf(this.query) : value.toLowerCase().indexOf(_this.query.toLowerCase());\n\n        if (indexOfMatch !== -1) {\n          match = value.substr(indexOfMatch, _this.query.length);\n          value = value.replace(match, '<strong>' + match + '</strong>');\n        }\n      }\n      TD.innerHTML = value;\n    },\n\n    autoColumnSize: true,\n    modifyColWidth: function modifyColWidth(width, col) {\n      // workaround for <strong> text overlapping the dropdown, not really accurate\n      var autoWidths = this.getPlugin('autoColumnSize').widths;\n\n      if (autoWidths[col]) {\n        width = autoWidths[col];\n      }\n\n      return trimDropdown ? width : width + 15;\n    }\n  });\n\n  // Add additional space for autocomplete holder\n  this.htEditor.view.wt.wtTable.holder.parentNode.style['padding-right'] = (0, _element.getScrollbarWidth)() + 2 + 'px';\n\n  if (skipOne) {\n    skipOne = false;\n  }\n\n  _this.instance._registerTimeout(setTimeout(function () {\n    _this.queryChoices(_this.TEXTAREA.value);\n  }, 0));\n};\n\nAutocompleteEditor.prototype.close = function () {\n  _handsontableEditor2.default.prototype.close.apply(this, arguments);\n};\nAutocompleteEditor.prototype.queryChoices = function (query) {\n  var _this3 = this;\n\n  this.query = query;\n  var source = this.cellProperties.source;\n\n  if (typeof source == 'function') {\n    source.call(this.cellProperties, query, function (choices) {\n      _this3.rawChoices = choices;\n      _this3.updateChoicesList(_this3.stripValuesIfNeeded(choices));\n    });\n  } else if (Array.isArray(source)) {\n    this.rawChoices = source;\n    this.updateChoicesList(this.stripValuesIfNeeded(source));\n  } else {\n    this.updateChoicesList([]);\n  }\n};\n\nAutocompleteEditor.prototype.updateChoicesList = function (choices) {\n  var pos = (0, _element.getCaretPosition)(this.TEXTAREA);\n  var endPos = (0, _element.getSelectionEndPosition)(this.TEXTAREA);\n  var sortByRelevanceSetting = this.cellProperties.sortByRelevance;\n  var filterSetting = this.cellProperties.filter;\n  var orderByRelevance = null;\n  var highlightIndex = null;\n\n  if (sortByRelevanceSetting) {\n    orderByRelevance = AutocompleteEditor.sortByRelevance(this.stripValueIfNeeded(this.getValue()), choices, this.cellProperties.filteringCaseSensitive);\n  }\n  var orderByRelevanceLength = Array.isArray(orderByRelevance) ? orderByRelevance.length : 0;\n\n  if (filterSetting === false) {\n    if (orderByRelevanceLength) {\n      highlightIndex = orderByRelevance[0];\n    }\n  } else {\n    var sorted = [];\n\n    for (var i = 0, choicesCount = choices.length; i < choicesCount; i++) {\n      if (sortByRelevanceSetting && orderByRelevanceLength <= i) {\n        break;\n      }\n      if (orderByRelevanceLength) {\n        sorted.push(choices[orderByRelevance[i]]);\n      } else {\n        sorted.push(choices[i]);\n      }\n    }\n\n    highlightIndex = 0;\n    choices = sorted;\n  }\n\n  this.strippedChoices = choices;\n  this.htEditor.loadData((0, _array.pivot)([choices]));\n\n  this.updateDropdownHeight();\n\n  this.flipDropdownIfNeeded();\n\n  if (this.cellProperties.strict === true) {\n    this.highlightBestMatchingChoice(highlightIndex);\n  }\n\n  this.instance.listen(false);\n\n  (0, _element.setCaretPosition)(this.TEXTAREA, pos, pos === endPos ? void 0 : endPos);\n};\n\nAutocompleteEditor.prototype.flipDropdownIfNeeded = function () {\n  var textareaOffset = (0, _element.offset)(this.TEXTAREA);\n  var textareaHeight = (0, _element.outerHeight)(this.TEXTAREA);\n  var dropdownHeight = this.getDropdownHeight();\n  var trimmingContainer = (0, _element.getTrimmingContainer)(this.instance.view.wt.wtTable.TABLE);\n  var trimmingContainerScrollTop = trimmingContainer.scrollTop;\n  var headersHeight = (0, _element.outerHeight)(this.instance.view.wt.wtTable.THEAD);\n  var containerOffset = {\n    row: 0,\n    col: 0\n  };\n\n  if (trimmingContainer !== window) {\n    containerOffset = (0, _element.offset)(trimmingContainer);\n  }\n\n  var spaceAbove = textareaOffset.top - containerOffset.top - headersHeight + trimmingContainerScrollTop;\n  var spaceBelow = trimmingContainer.scrollHeight - spaceAbove - headersHeight - textareaHeight;\n  var flipNeeded = dropdownHeight > spaceBelow && spaceAbove > spaceBelow;\n\n  if (flipNeeded) {\n    this.flipDropdown(dropdownHeight);\n  } else {\n    this.unflipDropdown();\n  }\n\n  this.limitDropdownIfNeeded(flipNeeded ? spaceAbove : spaceBelow, dropdownHeight);\n\n  return flipNeeded;\n};\n\nAutocompleteEditor.prototype.limitDropdownIfNeeded = function (spaceAvailable, dropdownHeight) {\n  if (dropdownHeight > spaceAvailable) {\n    var tempHeight = 0;\n    var i = 0;\n    var lastRowHeight = 0;\n    var height = null;\n\n    do {\n      lastRowHeight = this.htEditor.getRowHeight(i) || this.htEditor.view.wt.wtSettings.settings.defaultRowHeight;\n      tempHeight += lastRowHeight;\n      i++;\n    } while (tempHeight < spaceAvailable);\n\n    height = tempHeight - lastRowHeight;\n\n    if (this.htEditor.flipped) {\n      this.htEditor.rootElement.style.top = parseInt(this.htEditor.rootElement.style.top, 10) + dropdownHeight - height + 'px';\n    }\n\n    this.setDropdownHeight(tempHeight - lastRowHeight);\n  }\n};\n\nAutocompleteEditor.prototype.flipDropdown = function (dropdownHeight) {\n  var dropdownStyle = this.htEditor.rootElement.style;\n\n  dropdownStyle.position = 'absolute';\n  dropdownStyle.top = -dropdownHeight + 'px';\n\n  this.htEditor.flipped = true;\n};\n\nAutocompleteEditor.prototype.unflipDropdown = function () {\n  var dropdownStyle = this.htEditor.rootElement.style;\n\n  if (dropdownStyle.position === 'absolute') {\n    dropdownStyle.position = '';\n    dropdownStyle.top = '';\n  }\n\n  this.htEditor.flipped = void 0;\n};\n\nAutocompleteEditor.prototype.updateDropdownHeight = function () {\n  var currentDropdownWidth = this.htEditor.getColWidth(0) + (0, _element.getScrollbarWidth)() + 2;\n  var trimDropdown = this.cellProperties.trimDropdown;\n\n  this.htEditor.updateSettings({\n    height: this.getDropdownHeight(),\n    width: trimDropdown ? void 0 : currentDropdownWidth\n  });\n\n  this.htEditor.view.wt.wtTable.alignOverlaysWithTrimmingContainer();\n};\n\nAutocompleteEditor.prototype.setDropdownHeight = function (height) {\n  this.htEditor.updateSettings({\n    height: height\n  });\n};\n\nAutocompleteEditor.prototype.finishEditing = function (restoreOriginalValue) {\n  if (!restoreOriginalValue) {\n    this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n  }\n  _handsontableEditor2.default.prototype.finishEditing.apply(this, arguments);\n};\n\nAutocompleteEditor.prototype.highlightBestMatchingChoice = function (index) {\n  if (typeof index === 'number') {\n    this.htEditor.selectCell(index, 0, void 0, void 0, void 0, false);\n  } else {\n    this.htEditor.deselectCell();\n  }\n};\n\n/**\n * Filters and sorts by relevance\n * @param value\n * @param choices\n * @param caseSensitive\n * @returns {Array} array of indexes in original choices array\n */\nAutocompleteEditor.sortByRelevance = function (value, choices, caseSensitive) {\n  var choicesRelevance = [];\n  var currentItem = void 0;\n  var valueLength = value.length;\n  var valueIndex = void 0;\n  var charsLeft = void 0;\n  var result = [];\n  var i = void 0;\n  var choicesCount = choices.length;\n\n  if (valueLength === 0) {\n    for (i = 0; i < choicesCount; i++) {\n      result.push(i);\n    }\n    return result;\n  }\n\n  for (i = 0; i < choicesCount; i++) {\n    currentItem = (0, _string.stripTags)((0, _mixed.stringify)(choices[i]));\n\n    if (caseSensitive) {\n      valueIndex = currentItem.indexOf(value);\n    } else {\n      valueIndex = currentItem.toLowerCase().indexOf(value.toLowerCase());\n    }\n\n    if (valueIndex !== -1) {\n      charsLeft = currentItem.length - valueIndex - valueLength;\n\n      choicesRelevance.push({\n        baseIndex: i,\n        index: valueIndex,\n        charsLeft: charsLeft,\n        value: currentItem\n      });\n    }\n  }\n\n  choicesRelevance.sort(function (a, b) {\n\n    if (b.index === -1) {\n      return -1;\n    }\n    if (a.index === -1) {\n      return 1;\n    }\n\n    if (a.index < b.index) {\n      return -1;\n    } else if (b.index < a.index) {\n      return 1;\n    } else if (a.index === b.index) {\n      if (a.charsLeft < b.charsLeft) {\n        return -1;\n      } else if (a.charsLeft > b.charsLeft) {\n        return 1;\n      }\n    }\n\n    return 0;\n  });\n\n  for (i = 0, choicesCount = choicesRelevance.length; i < choicesCount; i++) {\n    result.push(choicesRelevance[i].baseIndex);\n  }\n\n  return result;\n};\n\nAutocompleteEditor.prototype.getDropdownHeight = function () {\n  var firstRowHeight = this.htEditor.getInstance().getRowHeight(0) || 23;\n  var visibleRows = this.cellProperties.visibleRows;\n\n  return this.strippedChoices.length >= visibleRows ? visibleRows * firstRowHeight : this.strippedChoices.length * firstRowHeight + 8;\n};\n\nAutocompleteEditor.prototype.stripValueIfNeeded = function (value) {\n  return this.stripValuesIfNeeded([value])[0];\n};\n\nAutocompleteEditor.prototype.stripValuesIfNeeded = function (values) {\n  var allowHtml = this.cellProperties.allowHtml;\n\n\n  var stringifiedValues = (0, _array.arrayMap)(values, function (value) {\n    return (0, _mixed.stringify)(value);\n  });\n  var strippedValues = (0, _array.arrayMap)(stringifiedValues, function (value) {\n    return allowHtml ? value : (0, _string.stripTags)(value);\n  });\n\n  return strippedValues;\n};\n\nAutocompleteEditor.prototype.allowKeyEventPropagation = function (keyCode) {\n  var selectedRange = this.htEditor.getSelectedRangeLast();\n\n  var selected = { row: selectedRange ? selectedRange.from.row : -1 };\n  var allowed = false;\n\n  if (keyCode === _unicode.KEY_CODES.ARROW_DOWN && selected.row > 0 && selected.row < this.htEditor.countRows() - 1) {\n    allowed = true;\n  }\n  if (keyCode === _unicode.KEY_CODES.ARROW_UP && selected.row > -1) {\n    allowed = true;\n  }\n\n  return allowed;\n};\n\nAutocompleteEditor.prototype.discardEditor = function (result) {\n  _handsontableEditor2.default.prototype.discardEditor.apply(this, arguments);\n\n  this.instance.view.render();\n};\n\nexports.default = AutocompleteEditor;\n\n/***/ }),\n/* 308 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _unicode = __webpack_require__(21);\n\nvar _object = __webpack_require__(2);\n\nvar _element = __webpack_require__(0);\n\nvar _event = __webpack_require__(12);\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar HandsontableEditor = _textEditor2.default.prototype.extend();\n\n/**\n * @private\n * @editor HandsontableEditor\n * @class HandsontableEditor\n * @dependencies TextEditor\n */\nHandsontableEditor.prototype.createElements = function () {\n  _textEditor2.default.prototype.createElements.apply(this, arguments);\n\n  var DIV = document.createElement('DIV');\n  DIV.className = 'handsontableEditor';\n  this.TEXTAREA_PARENT.appendChild(DIV);\n\n  this.htContainer = DIV;\n  this.assignHooks();\n};\n\nHandsontableEditor.prototype.prepare = function (td, row, col, prop, value, cellProperties) {\n  _textEditor2.default.prototype.prepare.apply(this, arguments);\n\n  var parent = this;\n  var options = {\n    startRows: 0,\n    startCols: 0,\n    minRows: 0,\n    minCols: 0,\n    className: 'listbox',\n    copyPaste: false,\n    autoColumnSize: false,\n    autoRowSize: false,\n    readOnly: true,\n    fillHandle: false,\n    afterOnCellMouseDown: function afterOnCellMouseDown(_, coords) {\n      var value = this.getSourceData(coords.row, coords.col);\n\n      // if the value is undefined then it means we don't want to set the value\n      if (value !== void 0) {\n        parent.setValue(value);\n      }\n      parent.instance.destroyEditor();\n    }\n  };\n\n  if (this.cellProperties.handsontable) {\n    (0, _object.extend)(options, cellProperties.handsontable);\n  }\n  this.htOptions = options;\n};\n\nvar onBeforeKeyDown = function onBeforeKeyDown(event) {\n  if ((0, _event.isImmediatePropagationStopped)(event)) {\n    return;\n  }\n  var editor = this.getActiveEditor();\n\n  var innerHOT = editor.htEditor.getInstance();\n\n  var rowToSelect;\n  var selectedRow;\n\n  if (event.keyCode == _unicode.KEY_CODES.ARROW_DOWN) {\n    if (!innerHOT.getSelectedLast() && !innerHOT.flipped) {\n      rowToSelect = 0;\n    } else if (innerHOT.getSelectedLast()) {\n      if (innerHOT.flipped) {\n        rowToSelect = innerHOT.getSelectedLast()[0] + 1;\n      } else if (!innerHOT.flipped) {\n        selectedRow = innerHOT.getSelectedLast()[0];\n        var lastRow = innerHOT.countRows() - 1;\n        rowToSelect = Math.min(lastRow, selectedRow + 1);\n      }\n    }\n  } else if (event.keyCode == _unicode.KEY_CODES.ARROW_UP) {\n    if (!innerHOT.getSelectedLast() && innerHOT.flipped) {\n      rowToSelect = innerHOT.countRows() - 1;\n    } else if (innerHOT.getSelectedLast()) {\n      if (innerHOT.flipped) {\n        selectedRow = innerHOT.getSelectedLast()[0];\n        rowToSelect = Math.max(0, selectedRow - 1);\n      } else {\n        selectedRow = innerHOT.getSelectedLast()[0];\n        rowToSelect = selectedRow - 1;\n      }\n    }\n  }\n\n  if (rowToSelect !== void 0) {\n    if (rowToSelect < 0 || innerHOT.flipped && rowToSelect > innerHOT.countRows() - 1) {\n      innerHOT.deselectCell();\n    } else {\n      innerHOT.selectCell(rowToSelect, 0);\n    }\n    if (innerHOT.getData().length) {\n      event.preventDefault();\n      (0, _event.stopImmediatePropagation)(event);\n\n      editor.instance.listen();\n      editor.TEXTAREA.focus();\n    }\n  }\n};\n\nHandsontableEditor.prototype.open = function () {\n  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);\n\n  _textEditor2.default.prototype.open.apply(this, arguments);\n\n  if (this.htEditor) {\n    this.htEditor.destroy();\n  }\n  // Construct and initialise a new Handsontable\n  this.htEditor = new this.instance.constructor(this.htContainer, this.htOptions);\n  this.htEditor.init();\n\n  if (this.cellProperties.strict) {\n    this.htEditor.selectCell(0, 0);\n    this.TEXTAREA.style.visibility = 'hidden';\n  } else {\n    this.htEditor.deselectCell();\n    this.TEXTAREA.style.visibility = 'visible';\n  }\n\n  (0, _element.setCaretPosition)(this.TEXTAREA, 0, this.TEXTAREA.value.length);\n};\n\nHandsontableEditor.prototype.close = function () {\n  this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n  this.instance.listen();\n\n  _textEditor2.default.prototype.close.apply(this, arguments);\n};\n\nHandsontableEditor.prototype.focus = function () {\n  this.instance.listen();\n  _textEditor2.default.prototype.focus.apply(this, arguments);\n};\n\nHandsontableEditor.prototype.beginEditing = function (initialValue) {\n  var onBeginEditing = this.instance.getSettings().onBeginEditing;\n\n  if (onBeginEditing && onBeginEditing() === false) {\n    return;\n  }\n  _textEditor2.default.prototype.beginEditing.apply(this, arguments);\n};\n\nHandsontableEditor.prototype.finishEditing = function (isCancelled, ctrlDown) {\n  if (this.htEditor && this.htEditor.isListening()) {\n    // if focus is still in the HOT editor\n\n    this.instance.listen(); // return the focus to the parent HOT instance\n  }\n\n  if (this.htEditor && this.htEditor.getSelectedLast()) {\n    var value = this.htEditor.getInstance().getValue();\n\n    if (value !== void 0) {\n      // if the value is undefined then it means we don't want to set the value\n      this.setValue(value);\n    }\n  }\n\n  return _textEditor2.default.prototype.finishEditing.apply(this, arguments);\n};\n\nHandsontableEditor.prototype.assignHooks = function () {\n  var _this = this;\n\n  this.instance.addHook('afterDestroy', function () {\n    if (_this.htEditor) {\n      _this.htEditor.destroy();\n    }\n  });\n};\n\nexports.default = HandsontableEditor;\n\n/***/ }),\n/* 309 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * numbro.js\n * version : 1.11.0\n * author : Företagsplatsen AB\n * license : MIT\n * http://www.foretagsplatsen.se\n */\n\n(function () {\n    'use strict';\n\n    /************************************\n        Constants\n    ************************************/\n\n    var numbro,\n        VERSION = '1.11.0',\n        binarySuffixes = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'],\n        decimalSuffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],\n        bytes = {\n            general: { scale: 1024, suffixes: decimalSuffixes, marker: 'bd' },\n            binary:  { scale: 1024, suffixes: binarySuffixes, marker: 'b' },\n            decimal: { scale: 1000, suffixes: decimalSuffixes, marker: 'd' }\n        },\n        // general must be before the others because it reuses their characters!\n        byteFormatOrder = [ bytes.general, bytes.binary, bytes.decimal ],\n    // internal storage for culture config files\n        cultures = {},\n    // Todo: Remove in 2.0.0\n        languages = cultures,\n        currentCulture = 'en-US',\n        zeroFormat = null,\n        defaultFormat = '0,0',\n        defaultCurrencyFormat = '0$',\n        // check for nodeJS\n        hasModule = (typeof module !== 'undefined' && module.exports),\n    // default culture\n        enUS = {\n            delimiters: {\n                thousands: ',',\n                decimal: '.'\n            },\n            abbreviations: {\n                thousand: 'k',\n                million: 'm',\n                billion: 'b',\n                trillion: 't'\n            },\n            ordinal: function(number) {\n                var b = number % 10;\n                return (~~(number % 100 / 10) === 1) ? 'th' :\n                    (b === 1) ? 'st' :\n                        (b === 2) ? 'nd' :\n                            (b === 3) ? 'rd' : 'th';\n            },\n            currency: {\n                symbol: '$',\n                position: 'prefix'\n            },\n            defaults: {\n                currencyFormat: ',0000 a'\n            },\n            formats: {\n                fourDigits: '0000 a',\n                fullWithTwoDecimals: '$ ,0.00',\n                fullWithTwoDecimalsNoCurrency: ',0.00'\n            }\n        };\n\n    /************************************\n        Constructors\n    ************************************/\n\n\n    // Numbro prototype object\n    function Numbro(number) {\n        this._value = number;\n    }\n\n    function numberLength(number) {\n        if (number === 0) { return 1; }\n        return Math.floor(Math.log(Math.abs(number)) / Math.LN10) + 1;\n    }\n\n    function zeroes(count) {\n        var i, ret = '';\n\n        for (i = 0; i < count; i++) {\n            ret += '0';\n        }\n\n        return ret;\n    }\n    /**\n     * Implementation of toFixed() for numbers with exponents\n     * This function may return negative representations for zero values e.g. \"-0.0\"\n     */\n    function toFixedLargeSmall(value, precision) {\n        var mantissa,\n            beforeDec,\n            afterDec,\n            exponent,\n            prefix,\n            endStr,\n            zerosStr,\n            str;\n\n        str = value.toString();\n\n        mantissa = str.split('e')[0];\n        exponent = str.split('e')[1];\n\n        beforeDec = mantissa.split('.')[0];\n        afterDec = mantissa.split('.')[1] || '';\n\n        if (+exponent > 0) {\n            // exponent is positive - add zeros after the numbers\n            str = beforeDec + afterDec + zeroes(exponent - afterDec.length);\n        } else {\n            // exponent is negative\n\n            if (+beforeDec < 0) {\n                prefix = '-0';\n            } else {\n                prefix = '0';\n            }\n\n            // tack on the decimal point if needed\n            if (precision > 0) {\n                prefix += '.';\n            }\n\n            zerosStr = zeroes((-1 * exponent) - 1);\n            // substring off the end to satisfy the precision\n            endStr = (zerosStr + Math.abs(beforeDec) + afterDec).substr(0, precision);\n            str = prefix + endStr;\n        }\n\n        // only add percision 0's if the exponent is positive\n        if (+exponent > 0 && precision > 0) {\n            str += '.' + zeroes(precision);\n        }\n\n        return str;\n    }\n\n    /**\n     * Implementation of toFixed() that treats floats more like decimals\n     *\n     * Fixes binary rounding issues (eg. (0.615).toFixed(2) === '0.61') that present\n     * problems for accounting- and finance-related software.\n     *\n     * Also removes negative signs for zero-formatted numbers. e.g. -0.01 w/ precision 1 -> 0.0\n     */\n    function toFixed(value, precision, roundingFunction, optionals) {\n        var power = Math.pow(10, precision),\n            optionalsRegExp,\n            output;\n\n        if (value.toString().indexOf('e') > -1) {\n            // toFixed returns scientific notation for numbers above 1e21 and below 1e-7\n            output = toFixedLargeSmall(value, precision);\n            // remove the leading negative sign if it exists and should not be present (e.g. -0.00)\n            if (output.charAt(0) === '-' && +output >= 0) {\n                output = output.substr(1); // chop off the '-'\n            }\n        }\n        else {\n            // Multiply up by precision, round accurately, then divide and use native toFixed():\n            output = (roundingFunction(value + 'e+' + precision) / power).toFixed(precision);\n        }\n\n        if (optionals) {\n            optionalsRegExp = new RegExp('0{1,' + optionals + '}$');\n            output = output.replace(optionalsRegExp, '');\n        }\n\n        return output;\n    }\n\n    /************************************\n        Formatting\n    ************************************/\n\n    // determine what type of formatting we need to do\n    function formatNumbro(n, format, roundingFunction) {\n        var output,\n            escapedFormat = format.replace(/\\{[^\\{\\}]*\\}/g, '');\n\n        // figure out what kind of format we are dealing with\n        if (escapedFormat.indexOf('$') > -1) { // currency!!!!!\n            output = formatCurrency(n, cultures[currentCulture].currency.symbol, format, roundingFunction);\n        } else if (escapedFormat.indexOf('%') > -1) { // percentage\n            output = formatPercentage(n, format, roundingFunction);\n        } else if (escapedFormat.indexOf(':') > -1) { // time\n            output = formatTime(n, format);\n        } else { // plain ol' numbers or bytes\n            output = formatNumber(n._value, format, roundingFunction);\n        }\n\n        // return string\n        return output;\n    }\n\n    // revert to number\n    function unformatNumbro(n, string) {\n        var stringOriginal = string,\n            thousandRegExp,\n            millionRegExp,\n            billionRegExp,\n            trillionRegExp,\n            bytesMultiplier = false,\n            power;\n\n        if (string.indexOf(':') > -1) {\n            n._value = unformatTime(string);\n        } else {\n            if (string === zeroFormat) {\n                n._value = 0;\n            } else {\n                if (cultures[currentCulture].delimiters.decimal !== '.') {\n                    string = string.replace(/\\./g, '').replace(cultures[currentCulture].delimiters.decimal, '.');\n                }\n\n                // see if abbreviations are there so that we can multiply to the correct number\n                thousandRegExp = new RegExp('[^a-zA-Z]' + cultures[currentCulture].abbreviations.thousand +\n                    '(?:\\\\)|(\\\\' + cultures[currentCulture].currency.symbol + ')?(?:\\\\))?)?$');\n                millionRegExp = new RegExp('[^a-zA-Z]' + cultures[currentCulture].abbreviations.million +\n                    '(?:\\\\)|(\\\\' + cultures[currentCulture].currency.symbol + ')?(?:\\\\))?)?$');\n                billionRegExp = new RegExp('[^a-zA-Z]' + cultures[currentCulture].abbreviations.billion +\n                    '(?:\\\\)|(\\\\' + cultures[currentCulture].currency.symbol + ')?(?:\\\\))?)?$');\n                trillionRegExp = new RegExp('[^a-zA-Z]' + cultures[currentCulture].abbreviations.trillion +\n                    '(?:\\\\)|(\\\\' + cultures[currentCulture].currency.symbol + ')?(?:\\\\))?)?$');\n\n                // see if bytes are there so that we can multiply to the correct number\n                for (power = 1; power < binarySuffixes.length && !bytesMultiplier; ++power) {\n                    if (string.indexOf(binarySuffixes[power]) > -1) {\n                        bytesMultiplier = Math.pow(1024, power);\n                    } else if (string.indexOf(decimalSuffixes[power]) > -1) {\n                        bytesMultiplier = Math.pow(1000, power);\n                    }\n                }\n\n                var str = string.replace(/[^0-9\\.]+/g, '');\n                if (str === '') {\n                    // An empty string is not a number.\n                    n._value = NaN;\n\n                } else {\n                    // do some math to create our number\n                    n._value = ((bytesMultiplier) ? bytesMultiplier : 1) *\n                        ((stringOriginal.match(thousandRegExp)) ? Math.pow(10, 3) : 1) *\n                        ((stringOriginal.match(millionRegExp)) ? Math.pow(10, 6) : 1) *\n                        ((stringOriginal.match(billionRegExp)) ? Math.pow(10, 9) : 1) *\n                        ((stringOriginal.match(trillionRegExp)) ? Math.pow(10, 12) : 1) *\n                        ((string.indexOf('%') > -1) ? 0.01 : 1) *\n                        (((string.split('-').length +\n                            Math.min(string.split('(').length - 1, string.split(')').length - 1)) % 2) ? 1 : -1) *\n                        Number(str);\n\n                    // round if we are talking about bytes\n                    n._value = (bytesMultiplier) ? Math.ceil(n._value) : n._value;\n                }\n            }\n        }\n        return n._value;\n    }\n\n    function formatCurrency(n, currencySymbol, originalFormat, roundingFunction) {\n        var format = originalFormat,\n            symbolIndex = format.indexOf('$'),\n            openParenIndex = format.indexOf('('),\n            plusSignIndex = format.indexOf('+'),\n            minusSignIndex = format.indexOf('-'),\n            space = '',\n            decimalSeparator = '',\n            spliceIndex,\n            output;\n\n        if(format.indexOf('$') === -1){\n            // Use defaults instead of the format provided\n            if (cultures[currentCulture].currency.position === 'infix') {\n                decimalSeparator = currencySymbol;\n                if (cultures[currentCulture].currency.spaceSeparated) {\n                    decimalSeparator = ' ' + decimalSeparator + ' ';\n                }\n            } else if (cultures[currentCulture].currency.spaceSeparated) {\n                space = ' ';\n            }\n        } else {\n            // check for space before or after currency\n            if (format.indexOf(' $') > -1) {\n                space = ' ';\n                format = format.replace(' $', '');\n            } else if (format.indexOf('$ ') > -1) {\n                space = ' ';\n                format = format.replace('$ ', '');\n            } else {\n                format = format.replace('$', '');\n            }\n        }\n\n        // Format The Number\n        output = formatNumber(n._value, format, roundingFunction, decimalSeparator);\n\n        if (originalFormat.indexOf('$') === -1) {\n            // Use defaults instead of the format provided\n            switch (cultures[currentCulture].currency.position) {\n                case 'postfix':\n                    if (output.indexOf(')') > -1) {\n                        output = output.split('');\n                        output.splice(-1, 0, space + currencySymbol);\n                        output = output.join('');\n                    } else {\n                        output = output + space + currencySymbol;\n                    }\n                    break;\n                case 'infix':\n                    break;\n                case 'prefix':\n                    if (output.indexOf('(') > -1 || output.indexOf('-') > -1) {\n                        output = output.split('');\n                        spliceIndex = Math.max(openParenIndex, minusSignIndex) + 1;\n\n                        output.splice(spliceIndex, 0, currencySymbol + space);\n                        output = output.join('');\n                    } else {\n                        output = currencySymbol + space + output;\n                    }\n                    break;\n                default:\n                    throw Error('Currency position should be among [\"prefix\", \"infix\", \"postfix\"]');\n            }\n        } else {\n            // position the symbol\n            if (symbolIndex <= 1) {\n                if (output.indexOf('(') > -1 || output.indexOf('+') > -1 || output.indexOf('-') > -1) {\n                    output = output.split('');\n                    spliceIndex = 1;\n                    if (symbolIndex < openParenIndex || symbolIndex < plusSignIndex || symbolIndex < minusSignIndex) {\n                        // the symbol appears before the \"(\", \"+\" or \"-\"\n                        spliceIndex = 0;\n                    }\n                    output.splice(spliceIndex, 0, currencySymbol + space);\n                    output = output.join('');\n                } else {\n                    output = currencySymbol + space + output;\n                }\n            } else {\n                if (output.indexOf(')') > -1) {\n                    output = output.split('');\n                    output.splice(-1, 0, space + currencySymbol);\n                    output = output.join('');\n                } else {\n                    output = output + space + currencySymbol;\n                }\n            }\n        }\n\n        return output;\n    }\n\n    function formatForeignCurrency(n, foreignCurrencySymbol, originalFormat, roundingFunction) {\n        return formatCurrency(n, foreignCurrencySymbol, originalFormat, roundingFunction);\n    }\n\n    function formatPercentage(n, format, roundingFunction) {\n        var space = '',\n            output,\n            value = n._value * 100;\n\n        // check for space before %\n        if (format.indexOf(' %') > -1) {\n            space = ' ';\n            format = format.replace(' %', '');\n        } else {\n            format = format.replace('%', '');\n        }\n\n        output = formatNumber(value, format, roundingFunction);\n\n        if (output.indexOf(')') > -1) {\n            output = output.split('');\n            output.splice(-1, 0, space + '%');\n            output = output.join('');\n        } else {\n            output = output + space + '%';\n        }\n\n        return output;\n    }\n\n    function formatTime(n) {\n        var hours = Math.floor(n._value / 60 / 60),\n            minutes = Math.floor((n._value - (hours * 60 * 60)) / 60),\n            seconds = Math.round(n._value - (hours * 60 * 60) - (minutes * 60));\n        return hours + ':' +\n            ((minutes < 10) ? '0' + minutes : minutes) + ':' +\n            ((seconds < 10) ? '0' + seconds : seconds);\n    }\n\n    function unformatTime(string) {\n        var timeArray = string.split(':'),\n            seconds = 0;\n        // turn hours and minutes into seconds and add them all up\n        if (timeArray.length === 3) {\n            // hours\n            seconds = seconds + (Number(timeArray[0]) * 60 * 60);\n            // minutes\n            seconds = seconds + (Number(timeArray[1]) * 60);\n            // seconds\n            seconds = seconds + Number(timeArray[2]);\n        } else if (timeArray.length === 2) {\n            // minutes\n            seconds = seconds + (Number(timeArray[0]) * 60);\n            // seconds\n            seconds = seconds + Number(timeArray[1]);\n        }\n        return Number(seconds);\n    }\n\n    function formatByteUnits (value, suffixes, scale) {\n        var suffix = suffixes[0],\n            power,\n            min,\n            max,\n            abs = Math.abs(value);\n\n        if (abs >= scale) {\n            for (power = 1; power < suffixes.length; ++power) {\n                min = Math.pow(scale, power);\n                max = Math.pow(scale, power + 1);\n\n                if (abs >= min && abs < max) {\n                    suffix = suffixes[power];\n                    value = value / min;\n                    break;\n                }\n            }\n\n            // values greater than or equal to [scale] YB never set the suffix\n            if (suffix === suffixes[0]) {\n                value = value / Math.pow(scale, suffixes.length - 1);\n                suffix = suffixes[suffixes.length - 1];\n            }\n        }\n\n        return { value: value, suffix: suffix };\n    }\n\n    function formatNumber (value, format, roundingFunction, sep) {\n        var negP = false,\n            signed = false,\n            optDec = false,\n            abbr = '',\n            abbrK = false, // force abbreviation to thousands\n            abbrM = false, // force abbreviation to millions\n            abbrB = false, // force abbreviation to billions\n            abbrT = false, // force abbreviation to trillions\n            abbrForce = false, // force abbreviation\n            bytes = '',\n            byteFormat,\n            units,\n            ord = '',\n            abs = Math.abs(value),\n            totalLength,\n            length,\n            minimumPrecision,\n            pow,\n            w,\n            intPrecision,\n            precision,\n            prefix,\n            postfix,\n            thousands,\n            d = '',\n            forcedNeg = false,\n            neg = false,\n            indexOpenP,\n            indexMinus,\n            paren = '',\n            minlen,\n            i;\n\n        // check if number is zero and a custom zero format has been set\n        if (value === 0 && zeroFormat !== null) {\n            return zeroFormat;\n        }\n\n        if (!isFinite(value)) {\n            return '' + value;\n        }\n\n        if (format.indexOf('{') === 0) {\n            var end = format.indexOf('}');\n            if (end === -1) {\n                throw Error('Format should also contain a \"}\"');\n            }\n            prefix = format.slice(1, end);\n            format = format.slice(end + 1);\n        } else {\n            prefix = '';\n        }\n\n        if (format.indexOf('}') === format.length - 1 && format.length) {\n            var start = format.indexOf('{');\n            if (start === -1) {\n                throw Error('Format should also contain a \"{\"');\n            }\n            postfix = format.slice(start + 1, -1);\n            format = format.slice(0, start + 1);\n        } else {\n            postfix = '';\n        }\n\n        // check for min length\n        var info;\n        if (format.indexOf('.') === -1) {\n            info = format.match(/([0-9]+).*/);\n        } else {\n            info = format.match(/([0-9]+)\\..*/);\n        }\n        minlen = info === null ? -1 : info[1].length;\n\n        // see if we should use parentheses for negative number or if we should prefix with a sign\n        // if both are present we default to parentheses\n        if (format.indexOf('-') !== -1) {\n            forcedNeg = true;\n        }\n        if (format.indexOf('(') > -1) {\n            negP = true;\n            format = format.slice(1, -1);\n        } else if (format.indexOf('+') > -1) {\n            signed = true;\n            format = format.replace(/\\+/g, '');\n        }\n\n        // see if abbreviation is wanted\n        if (format.indexOf('a') > -1) {\n            intPrecision = format.split('.')[0].match(/[0-9]+/g) || ['0'];\n            intPrecision = parseInt(intPrecision[0], 10);\n\n            // check if abbreviation is specified\n            abbrK = format.indexOf('aK') >= 0;\n            abbrM = format.indexOf('aM') >= 0;\n            abbrB = format.indexOf('aB') >= 0;\n            abbrT = format.indexOf('aT') >= 0;\n            abbrForce = abbrK || abbrM || abbrB || abbrT;\n\n            // check for space before abbreviation\n            if (format.indexOf(' a') > -1) {\n                abbr = ' ';\n                format = format.replace(' a', '');\n            } else {\n                format = format.replace('a', '');\n            }\n\n            totalLength = numberLength(value);\n            minimumPrecision = totalLength % 3;\n            minimumPrecision = minimumPrecision === 0 ? 3 : minimumPrecision;\n\n            if (intPrecision && abs !== 0) {\n                pow = 3 * ~~((Math.min(intPrecision, totalLength) - minimumPrecision) / 3);\n                abs = abs / Math.pow(10, pow);\n            }\n\n            if (totalLength !== intPrecision) {\n                if (abs >= Math.pow(10, 12) && !abbrForce || abbrT) {\n                    // trillion\n                    abbr = abbr + cultures[currentCulture].abbreviations.trillion;\n                    value = value / Math.pow(10, 12);\n                } else if (abs < Math.pow(10, 12) && abs >= Math.pow(10, 9) && !abbrForce || abbrB) {\n                    // billion\n                    abbr = abbr + cultures[currentCulture].abbreviations.billion;\n                    value = value / Math.pow(10, 9);\n                } else if (abs < Math.pow(10, 9) && abs >= Math.pow(10, 6) && !abbrForce || abbrM) {\n                    // million\n                    abbr = abbr + cultures[currentCulture].abbreviations.million;\n                    value = value / Math.pow(10, 6);\n                } else if (abs < Math.pow(10, 6) && abs >= Math.pow(10, 3) && !abbrForce || abbrK) {\n                    // thousand\n                    abbr = abbr + cultures[currentCulture].abbreviations.thousand;\n                    value = value / Math.pow(10, 3);\n                }\n            }\n\n            length = numberLength(value);\n            if (intPrecision && length < intPrecision && format.indexOf('.') === -1) {\n                format += '[.]';\n                format += zeroes(intPrecision - length);\n            }\n        }\n\n        // see if we are formatting\n        //   binary-decimal bytes (1024 MB), binary bytes (1024 MiB), or decimal bytes (1000 MB)\n        for (i = 0; i < byteFormatOrder.length; ++i) {\n            byteFormat = byteFormatOrder[i];\n\n            if (format.indexOf(byteFormat.marker) > -1) {\n                // check for space before\n                if (format.indexOf(' ' + byteFormat.marker) >-1) {\n                    bytes = ' ';\n                }\n\n                // remove the marker (with the space if it had one)\n                format = format.replace(bytes + byteFormat.marker, '');\n\n                units = formatByteUnits(value, byteFormat.suffixes, byteFormat.scale);\n\n                value = units.value;\n                bytes = bytes + units.suffix;\n\n                break;\n            }\n        }\n\n        // see if ordinal is wanted\n        if (format.indexOf('o') > -1) {\n            // check for space before\n            if (format.indexOf(' o') > -1) {\n                ord = ' ';\n                format = format.replace(' o', '');\n            } else {\n                format = format.replace('o', '');\n            }\n\n            if (cultures[currentCulture].ordinal) {\n                ord = ord + cultures[currentCulture].ordinal(value);\n            }\n        }\n\n        if (format.indexOf('[.]') > -1) {\n            optDec = true;\n            format = format.replace('[.]', '.');\n        }\n\n        precision = format.split('.')[1];\n        thousands = format.indexOf(',');\n\n        if (precision) {\n            var dSplit = [];\n\n            if (precision.indexOf('*') !== -1) {\n                d = value.toString();\n                dSplit = d.split('.');\n                if (dSplit.length > 1) {\n                    d = toFixed(value, dSplit[1].length, roundingFunction);\n                }\n            } else {\n                if (precision.indexOf('[') > -1) {\n                    precision = precision.replace(']', '');\n                    precision = precision.split('[');\n                    d = toFixed(value, (precision[0].length + precision[1].length), roundingFunction,\n                        precision[1].length);\n                } else {\n                    d = toFixed(value, precision.length, roundingFunction);\n                }\n            }\n\n            dSplit = d.split('.');\n            w = dSplit[0];\n\n            if (dSplit.length > 1 && dSplit[1].length) {\n                var p = sep ? abbr + sep : cultures[currentCulture].delimiters.decimal;\n                d = p + dSplit[1];\n            } else {\n                d = '';\n            }\n\n            if (optDec && Number(d.slice(1)) === 0) {\n                d = '';\n            }\n        } else {\n            w = toFixed(value, 0, roundingFunction);\n        }\n\n        // format number\n        if (w.indexOf('-') > -1) {\n            w = w.slice(1);\n            neg = true;\n        }\n\n        if (w.length < minlen) {\n            w = zeroes(minlen - w.length) + w;\n        }\n\n        if (thousands > -1) {\n            w = w.toString().replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1' +\n                cultures[currentCulture].delimiters.thousands);\n        }\n\n        if (format.indexOf('.') === 0) {\n            w = '';\n        }\n\n        indexOpenP = format.indexOf('(');\n        indexMinus = format.indexOf('-');\n\n        if (indexOpenP < indexMinus) {\n            paren = ((negP && neg) ? '(' : '') + (((forcedNeg && neg) || (!negP && neg)) ? '-' : '');\n        } else {\n            paren = (((forcedNeg && neg) || (!negP && neg)) ? '-' : '') + ((negP && neg) ? '(' : '');\n        }\n\n        return prefix +\n            paren + ((!neg && signed && value !== 0) ? '+' : '') +\n            w + d +\n            ((ord) ? ord : '') +\n            ((abbr && !sep) ? abbr : '') +\n            ((bytes) ? bytes : '') +\n            ((negP && neg) ? ')' : '') +\n            postfix;\n    }\n\n    /************************************\n        Top Level Functions\n    ************************************/\n\n    numbro = function(input) {\n        if (numbro.isNumbro(input)) {\n            input = input.value();\n        } else if (typeof input === 'string' || typeof input === 'number') {\n            input = numbro.fn.unformat(input);\n        } else {\n            input = NaN;\n        }\n\n        return new Numbro(Number(input));\n    };\n\n    // version number\n    numbro.version = VERSION;\n\n    // compare numbro object\n    numbro.isNumbro = function(obj) {\n        return obj instanceof Numbro;\n    };\n\n    /**\n     * This function allow the user to set a new language with a fallback if\n     * the language does not exist. If no fallback language is provided,\n     * it fallbacks to english.\n     *\n     * @deprecated Since in version 1.6.0. It will be deleted in version 2.0\n     * `setCulture` should be used instead.\n     */\n    numbro.setLanguage = function(newLanguage, fallbackLanguage) {\n        console.warn('`setLanguage` is deprecated since version 1.6.0. Use `setCulture` instead');\n        var key = newLanguage,\n            prefix = newLanguage.split('-')[0],\n            matchingLanguage = null;\n        if (!languages[key]) {\n            Object.keys(languages).forEach(function(language) {\n                if (!matchingLanguage && language.split('-')[0] === prefix) {\n                    matchingLanguage = language;\n                }\n            });\n            key = matchingLanguage || fallbackLanguage || 'en-US';\n        }\n        chooseCulture(key);\n    };\n\n    /**\n     * This function allow the user to set a new culture with a fallback if\n     * the culture does not exist. If no fallback culture is provided,\n     * it falls back to \"en-US\".\n     */\n    numbro.setCulture = function(newCulture, fallbackCulture) {\n        var key = newCulture,\n            suffix = newCulture.split('-')[1],\n            matchingCulture = null;\n        if (!cultures[key]) {\n            if (suffix) {\n                Object.keys(cultures).forEach(function(language) {\n                    if (!matchingCulture && language.split('-')[1] === suffix) {\n                        matchingCulture = language;\n                    }\n                });\n            }\n\n            key = matchingCulture || fallbackCulture || 'en-US';\n        }\n        chooseCulture(key);\n    };\n\n    /**\n     * This function will load languages and then set the global language.  If\n     * no arguments are passed in, it will simply return the current global\n     * language key.\n     *\n     * @deprecated Since in version 1.6.0. It will be deleted in version 2.0\n     * `culture` should be used instead.\n     */\n    numbro.language = function(key, values) {\n        console.warn('`language` is deprecated since version 1.6.0. Use `culture` instead');\n\n        if (!key) {\n            return currentCulture;\n        }\n\n        if (key && !values) {\n            if (!languages[key]) {\n                throw new Error('Unknown language : ' + key);\n            }\n            chooseCulture(key);\n        }\n\n        if (values || !languages[key]) {\n            setCulture(key, values);\n        }\n\n        return numbro;\n    };\n\n    /**\n     * This function will load cultures and then set the global culture.  If\n     * no arguments are passed in, it will simply return the current global\n     * culture code.\n     */\n    numbro.culture = function(code, values) {\n        if (!code) {\n            return currentCulture;\n        }\n\n        if (code && !values) {\n            if (!cultures[code]) {\n                throw new Error('Unknown culture : ' + code);\n            }\n            chooseCulture(code);\n        }\n\n        if (values || !cultures[code]) {\n            setCulture(code, values);\n        }\n\n        return numbro;\n    };\n\n    /**\n     * This function provides access to the loaded language data.  If\n     * no arguments are passed in, it will simply return the current\n     * global language object.\n     *\n     * @deprecated Since in version 1.6.0. It will be deleted in version 2.0\n     * `culture` should be used instead.\n     */\n    numbro.languageData = function(key) {\n        console.warn('`languageData` is deprecated since version 1.6.0. Use `cultureData` instead');\n\n        if (!key) {\n            return languages[currentCulture];\n        }\n\n        if (!languages[key]) {\n            throw new Error('Unknown language : ' + key);\n        }\n\n        return languages[key];\n    };\n\n    /**\n     * This function provides access to the loaded culture data.  If\n     * no arguments are passed in, it will simply return the current\n     * global culture object.\n     */\n    numbro.cultureData = function(code) {\n        if (!code) {\n            return cultures[currentCulture];\n        }\n\n        if (!cultures[code]) {\n            throw new Error('Unknown culture : ' + code);\n        }\n\n        return cultures[code];\n    };\n\n    numbro.culture('en-US', enUS);\n\n    /**\n     * @deprecated Since in version 1.6.0. It will be deleted in version 2.0\n     * `cultures` should be used instead.\n     */\n    numbro.languages = function() {\n        console.warn('`languages` is deprecated since version 1.6.0. Use `cultures` instead');\n\n        return languages;\n    };\n\n    numbro.cultures = function() {\n        return cultures;\n    };\n\n    numbro.zeroFormat = function(format) {\n        zeroFormat = typeof(format) === 'string' ? format : null;\n    };\n\n    numbro.defaultFormat = function(format) {\n        defaultFormat = typeof(format) === 'string' ? format : '0.0';\n    };\n\n    numbro.defaultCurrencyFormat = function (format) {\n        defaultCurrencyFormat = typeof(format) === 'string' ? format : '0$';\n    };\n\n    numbro.validate = function(val, culture) {\n\n        var _decimalSep,\n            _thousandSep,\n            _currSymbol,\n            _valArray,\n            _abbrObj,\n            _thousandRegEx,\n            cultureData,\n            temp;\n\n        //coerce val to string\n        if (typeof val !== 'string') {\n            val += '';\n            if (console.warn) {\n                console.warn('Numbro.js: Value is not string. It has been co-erced to: ', val);\n            }\n        }\n\n        //trim whitespaces from either sides\n        val = val.trim();\n\n        //replace the initial '+' or '-' sign if present\n        val = val.replace(/^[+-]?/, '');\n\n        //if val is just digits return true\n        if ( !! val.match(/^\\d+$/)) {\n            return true;\n        }\n\n        //if val is empty return false\n        if (val === '') {\n            return false;\n        }\n\n        //get the decimal and thousands separator from numbro.cultureData\n        try {\n            //check if the culture is understood by numbro. if not, default it to current culture\n            cultureData = numbro.cultureData(culture);\n        } catch (e) {\n            cultureData = numbro.cultureData(numbro.culture());\n        }\n\n        //setup the delimiters and currency symbol based on culture\n        _currSymbol = cultureData.currency.symbol;\n        _abbrObj = cultureData.abbreviations;\n        _decimalSep = cultureData.delimiters.decimal;\n        if (cultureData.delimiters.thousands === '.') {\n            _thousandSep = '\\\\.';\n        } else {\n            _thousandSep = cultureData.delimiters.thousands;\n        }\n\n        // validating currency symbol\n        temp = val.match(/^[^\\d\\.\\,]+/);\n        if (temp !== null) {\n            val = val.substr(1);\n            if (temp[0] !== _currSymbol) {\n                return false;\n            }\n        }\n\n        //validating abbreviation symbol\n        temp = val.match(/[^\\d]+$/);\n        if (temp !== null) {\n            val = val.slice(0, -1);\n            if (temp[0] !== _abbrObj.thousand && temp[0] !== _abbrObj.million &&\n                    temp[0] !== _abbrObj.billion && temp[0] !== _abbrObj.trillion) {\n                return false;\n            }\n        }\n\n        _thousandRegEx = new RegExp(_thousandSep + '{2}');\n\n        if (!val.match(/[^\\d.,]/g)) {\n            _valArray = val.split(_decimalSep);\n            if (_valArray.length > 2) {\n                return false;\n            } else {\n                if (_valArray.length < 2) {\n                    return ( !! _valArray[0].match(/^\\d+.*\\d$/) && !_valArray[0].match(_thousandRegEx));\n                } else {\n                    if (_valArray[0] === '') {\n                        // for values without leading zero eg. .984\n                        return (!_valArray[0].match(_thousandRegEx) &&\n                            !!_valArray[1].match(/^\\d+$/));\n\n                    } else if (_valArray[0].length === 1) {\n                        return ( !! _valArray[0].match(/^\\d+$/) &&\n                            !_valArray[0].match(_thousandRegEx) &&\n                            !! _valArray[1].match(/^\\d+$/));\n                    } else {\n                        return ( !! _valArray[0].match(/^\\d+.*\\d$/) &&\n                            !_valArray[0].match(_thousandRegEx) &&\n                            !! _valArray[1].match(/^\\d+$/));\n                    }\n                }\n            }\n        }\n\n        return false;\n    };\n\n    /**\n     * * @deprecated Since in version 1.6.0. It will be deleted in version 2.0\n     * `loadCulturesInNode` should be used instead.\n     */\n    numbro.loadLanguagesInNode = function() {\n        console.warn('`loadLanguagesInNode` is deprecated since version 1.6.0. Use `loadCulturesInNode` instead');\n\n        numbro.loadCulturesInNode();\n    };\n\n    numbro.loadCulturesInNode = function() {\n        // TODO: Rename the folder in 2.0.0\n        var cultures = __webpack_require__(369);\n\n        for(var langLocaleCode in cultures) {\n            if(langLocaleCode) {\n                numbro.culture(langLocaleCode, cultures[langLocaleCode]);\n            }\n        }\n    };\n\n    /************************************\n        Helpers\n    ************************************/\n\n    function setCulture(code, values) {\n        cultures[code] = values;\n    }\n\n    function chooseCulture(code) {\n        currentCulture = code;\n        var defaults = cultures[code].defaults;\n        if (defaults && defaults.format) {\n            numbro.defaultFormat(defaults.format);\n        }\n        if (defaults && defaults.currencyFormat) {\n            numbro.defaultCurrencyFormat(defaults.currencyFormat);\n        }\n    }\n\n    function inNodejsRuntime() {\n        return (typeof process !== 'undefined') &&\n            (process.browser === undefined) &&\n            process.title &&\n            (\n                process.title.indexOf('node') !== -1 ||\n                process.title.indexOf('meteor-tool') > 0 ||\n                process.title === 'grunt' ||\n                process.title === 'gulp'\n            ) &&\n            (\"function\" !== 'undefined');\n    }\n\n    /************************************\n        Floating-point helpers\n    ************************************/\n\n    // The floating-point helper functions and implementation\n    // borrows heavily from sinful.js: http://guipn.github.io/sinful.js/\n\n    /**\n     * Array.prototype.reduce for browsers that don't support it\n     * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Compatibility\n     */\n    if ('function' !== typeof Array.prototype.reduce) {\n        Array.prototype.reduce = function(callback, optInitialValue) {\n\n            if (null === this || 'undefined' === typeof this) {\n                // At the moment all modern browsers, that support strict mode, have\n                // native implementation of Array.prototype.reduce. For instance, IE8\n                // does not support strict mode, so this check is actually useless.\n                throw new TypeError('Array.prototype.reduce called on null or undefined');\n            }\n\n            if ('function' !== typeof callback) {\n                throw new TypeError(callback + ' is not a function');\n            }\n\n            var index,\n                value,\n                length = this.length >>> 0,\n                isValueSet = false;\n\n            if (1 < arguments.length) {\n                value = optInitialValue;\n                isValueSet = true;\n            }\n\n            for (index = 0; length > index; ++index) {\n                if (this.hasOwnProperty(index)) {\n                    if (isValueSet) {\n                        value = callback(value, this[index], index, this);\n                    } else {\n                        value = this[index];\n                        isValueSet = true;\n                    }\n                }\n            }\n\n            if (!isValueSet) {\n                throw new TypeError('Reduce of empty array with no initial value');\n            }\n\n            return value;\n        };\n    }\n\n\n    /**\n     * Computes the multiplier necessary to make x >= 1,\n     * effectively eliminating miscalculations caused by\n     * finite precision.\n     */\n    function multiplier(x) {\n        var parts = x.toString().split('.');\n        if (parts.length < 2) {\n            return 1;\n        }\n        return Math.pow(10, parts[1].length);\n    }\n\n    /**\n     * Given a variable number of arguments, returns the maximum\n     * multiplier that must be used to normalize an operation involving\n     * all of them.\n     */\n    function correctionFactor() {\n        var args = Array.prototype.slice.call(arguments);\n        return args.reduce(function(prev, next) {\n            var mp = multiplier(prev),\n                mn = multiplier(next);\n            return mp > mn ? mp : mn;\n        }, -Infinity);\n    }\n\n    /************************************\n        Numbro Prototype\n    ************************************/\n\n\n    numbro.fn = Numbro.prototype = {\n\n        clone: function() {\n            return numbro(this);\n        },\n\n        format: function(inputString, roundingFunction) {\n            return formatNumbro(this,\n                inputString ? inputString : defaultFormat,\n                (roundingFunction !== undefined) ? roundingFunction : Math.round\n            );\n        },\n\n        formatCurrency: function(inputString, roundingFunction) {\n            return formatCurrency(this,\n                cultures[currentCulture].currency.symbol,\n                inputString ? inputString : defaultCurrencyFormat,\n                (roundingFunction !== undefined) ? roundingFunction : Math.round\n            );\n        },\n\n        formatForeignCurrency: function(currencySymbol, inputString, roundingFunction) {\n            return formatForeignCurrency(this,\n                currencySymbol,\n                inputString ? inputString : defaultCurrencyFormat,\n                (roundingFunction !== undefined) ? roundingFunction : Math.round\n            );\n        },\n\n        unformat: function(inputString) {\n            if (typeof inputString === 'number') {\n                return inputString;\n            } else if (typeof inputString === 'string') {\n                var result = unformatNumbro(this, inputString);\n\n                // Any unparseable string (represented as NaN in the result) is\n                // converted into undefined.\n                return isNaN(result) ? undefined : result;\n            } else {\n                return undefined;\n            }\n        },\n\n        binaryByteUnits: function() {\n            return formatByteUnits(this._value, bytes.binary.suffixes, bytes.binary.scale).suffix;\n        },\n\n        byteUnits: function() {\n            return formatByteUnits(this._value, bytes.general.suffixes, bytes.general.scale).suffix;\n        },\n\n        decimalByteUnits: function() {\n            return formatByteUnits(this._value, bytes.decimal.suffixes, bytes.decimal.scale).suffix;\n        },\n\n        value: function() {\n            return this._value;\n        },\n\n        valueOf: function() {\n            return this._value;\n        },\n\n        set: function(value) {\n            this._value = Number(value);\n            return this;\n        },\n\n        add: function(value) {\n            var corrFactor = correctionFactor.call(null, this._value, value);\n\n            function cback(accum, curr) {\n                return accum + corrFactor * curr;\n            }\n            this._value = [this._value, value].reduce(cback, 0) / corrFactor;\n            return this;\n        },\n\n        subtract: function(value) {\n            var corrFactor = correctionFactor.call(null, this._value, value);\n\n            function cback(accum, curr) {\n                return accum - corrFactor * curr;\n            }\n            this._value = [value].reduce(cback, this._value * corrFactor) / corrFactor;\n            return this;\n        },\n\n        multiply: function(value) {\n            function cback(accum, curr) {\n                var corrFactor = correctionFactor(accum, curr),\n                    result = accum * corrFactor;\n                result *= curr * corrFactor;\n                result /= corrFactor * corrFactor;\n                return result;\n            }\n            this._value = [this._value, value].reduce(cback, 1);\n            return this;\n        },\n\n        divide: function(value) {\n            function cback(accum, curr) {\n                var corrFactor = correctionFactor(accum, curr);\n                return (accum * corrFactor) / (curr * corrFactor);\n            }\n            this._value = [this._value, value].reduce(cback);\n            return this;\n        },\n\n        difference: function(value) {\n            return Math.abs(numbro(this._value).subtract(value).value());\n        }\n\n    };\n\n    /************************************\n        Exposing Numbro\n    ************************************/\n\n    if (inNodejsRuntime()) {\n        //Todo: Rename the folder in 2.0.0\n        numbro.loadCulturesInNode();\n    }\n\n    // CommonJS module is defined\n    if (hasModule) {\n        module.exports = numbro;\n    } else {\n        /*global ender:false */\n        if (typeof ender === 'undefined') {\n            // here, `this` means `window` in the browser, or `global` on the server\n            // add `numbro` as a global object via a string identifier,\n            // for Closure Compiler 'advanced' mode\n            this.numbro = numbro;\n        }\n\n        /*global define:false */\n        if (true) {\n            !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n                return numbro;\n            }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n        }\n    }\n\n}.call(typeof window === 'undefined' ? this : window));\n\n\n/*** EXPORTS FROM exports-to-window-loader ***/\nwindow['numbro'] = __webpack_require__(309);\n\n/***/ }),\n/* 310 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getNormalizedDate = getNormalizedDate;\n/* eslint-disable import/prefer-default-export */\n\n/**\n * Get normalized Date object for the ISO formatted date strings.\n * Natively, the date object parsed from a ISO 8601 string will be offsetted by the timezone difference, which may result in returning a wrong date.\n * See: Github issue #3338.\n *\n * @param {String} dateString String representing the date.\n * @returns {Date} The proper Date object.\n */\nfunction getNormalizedDate(dateString) {\n  var nativeDate = new Date(dateString);\n\n  // NaN if dateString is not in ISO format\n  if (!isNaN(new Date(dateString + \"T00:00\").getDate())) {\n\n    // Compensate timezone offset\n    return new Date(nativeDate.getTime() + nativeDate.getTimezoneOffset() * 60000);\n  }\n\n  return nativeDate;\n}\n\n/***/ }),\n/* 311 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * SheetClip - Spreadsheet Clipboard Parser\n * version 0.2\n *\n * This tiny library transforms JavaScript arrays to strings that are pasteable by LibreOffice, OpenOffice,\n * Google Docs and Microsoft Excel.\n *\n * Copyright 2012, Marcin Warpechowski\n * Licensed under the MIT license.\n * http://github.com/warpech/sheetclip/\n */\n/*jslint white: true*/\n(function (global) {\n  \"use strict\";\n\n  function countQuotes(str) {\n    return str.split('\"').length - 1;\n  }\n\n  var SheetClip = {\n    /**\n     * Decode spreadsheet string into array\n     *\n     * @param {String} str\n     * @returns {Array}\n     */\n    parse: function parse(str) {\n      var r,\n          rLen,\n          rows,\n          arr = [],\n          a = 0,\n          c,\n          cLen,\n          multiline,\n          last;\n\n      rows = str.split('\\n');\n\n      if (rows.length > 1 && rows[rows.length - 1] === '') {\n        rows.pop();\n      }\n      for (r = 0, rLen = rows.length; r < rLen; r += 1) {\n        rows[r] = rows[r].split('\\t');\n\n        for (c = 0, cLen = rows[r].length; c < cLen; c += 1) {\n          if (!arr[a]) {\n            arr[a] = [];\n          }\n          if (multiline && c === 0) {\n            last = arr[a].length - 1;\n            arr[a][last] = arr[a][last] + '\\n' + rows[r][0];\n\n            if (multiline && countQuotes(rows[r][0]) & 1) {\n              //& 1 is a bitwise way of performing mod 2\n              multiline = false;\n              arr[a][last] = arr[a][last].substring(0, arr[a][last].length - 1).replace(/\"\"/g, '\"');\n            }\n          } else {\n            if (c === cLen - 1 && rows[r][c].indexOf('\"') === 0 && countQuotes(rows[r][c]) & 1) {\n              arr[a].push(rows[r][c].substring(1).replace(/\"\"/g, '\"'));\n              multiline = true;\n            } else {\n              arr[a].push(rows[r][c].replace(/\"\"/g, '\"'));\n              multiline = false;\n            }\n          }\n        }\n        if (!multiline) {\n          a += 1;\n        }\n      }\n\n      return arr;\n    },\n\n    /**\n     * Encode array into valid spreadsheet string\n     *\n     * @param arr\n     * @returns {String}\n     */\n    stringify: function stringify(arr) {\n      var r,\n          rLen,\n          c,\n          cLen,\n          str = '',\n          val;\n\n      for (r = 0, rLen = arr.length; r < rLen; r += 1) {\n        cLen = arr[r].length;\n\n        for (c = 0; c < cLen; c += 1) {\n          if (c > 0) {\n            str += '\\t';\n          }\n          val = arr[r][c];\n\n          if (typeof val === 'string') {\n            if (val.indexOf('\\n') > -1) {\n              str += '\"' + val.replace(/\"/g, '\"\"') + '\"';\n            } else {\n              str += val;\n            }\n          } else if (val === null || val === void 0) {\n            // void 0 resolves to undefined\n            str += '';\n          } else {\n            str += val;\n          }\n        }\n\n        if (r !== rLen - 1) {\n          str += '\\n';\n        }\n      }\n\n      return str;\n    }\n  };\n\n  if (true) {\n    exports.parse = SheetClip.parse;\n    exports.stringify = SheetClip.stringify;\n  } else {\n    global.SheetClip = SheetClip;\n  }\n})(window);\n\n/***/ }),\n/* 312 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.mouseDown = mouseDown;\nexports.mouseOver = mouseOver;\nexports.handleMouseEvent = handleMouseEvent;\n\nvar _event = __webpack_require__(12);\n\nvar _src = __webpack_require__(4);\n\n/**\n * MouseDown handler.\n *\n * @param {Object} options\n * @param {Boolean} options.isShiftKey The flag which indicates if the shift key is pressed.\n * @param {Boolean} options.isLeftClick The flag which indicates if the left mouse button is pressed.\n * @param {Boolean} options.isRightClick The flag which indicates if the right mouse button is pressed.\n * @param {CellRange} options.coords The CellCoords object with defined visual coordinates.\n * @param {Selection} options.selection The Selection class instance.\n * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what\n *                                    operation will be performed in later selection stages.\n */\nfunction mouseDown(_ref) {\n  var isShiftKey = _ref.isShiftKey,\n      isLeftClick = _ref.isLeftClick,\n      isRightClick = _ref.isRightClick,\n      coords = _ref.coords,\n      selection = _ref.selection,\n      controller = _ref.controller;\n\n  var currentSelection = selection.isSelected() ? selection.getSelectedRange().current() : null;\n  var selectedCorner = selection.isSelectedByCorner();\n  var selectedRow = selection.isSelectedByRowHeader();\n  var selectedColumn = selection.isSelectedByColumnHeader();\n\n  if (isShiftKey && currentSelection) {\n    if (coords.row >= 0 && coords.col >= 0 && !controller.cells) {\n      selection.setRangeEnd(coords);\n    } else if ((selectedCorner || selectedRow) && coords.row >= 0 && coords.col >= 0 && !controller.cells) {\n      selection.setRangeEnd(new _src.CellCoords(coords.row, coords.col));\n    } else if (selectedCorner && coords.row < 0 && !controller.column) {\n      selection.setRangeEnd(new _src.CellCoords(currentSelection.to.row, coords.col));\n    } else if (selectedRow && coords.col < 0 && !controller.row) {\n      selection.setRangeEnd(new _src.CellCoords(coords.row, currentSelection.to.col));\n    } else if ((!selectedCorner && !selectedRow && coords.col < 0 || selectedCorner && coords.col < 0) && !controller.row) {\n      selection.selectRows(currentSelection.from.row, coords.row);\n    } else if ((!selectedCorner && !selectedRow && coords.row < 0 || selectedRow && coords.row < 0) && !controller.column) {\n      selection.selectColumns(currentSelection.from.col, coords.col);\n    }\n  } else {\n    var newCoord = new _src.CellCoords(coords.row, coords.col);\n\n    if (newCoord.row < 0) {\n      newCoord.row = 0;\n    }\n    if (newCoord.col < 0) {\n      newCoord.col = 0;\n    }\n\n    var allowRightClickSelection = !selection.inInSelection(newCoord);\n    var performSelection = isLeftClick || isRightClick && allowRightClickSelection;\n\n    // clicked row header and when some column was selected\n    if (coords.row < 0 && coords.col >= 0 && !controller.column) {\n      if (performSelection) {\n        selection.selectColumns(coords.col);\n      }\n\n      // clicked column header and when some row was selected\n    } else if (coords.col < 0 && coords.row >= 0 && !controller.row) {\n      if (performSelection) {\n        selection.selectRows(coords.row);\n      }\n    } else if (coords.col >= 0 && coords.row >= 0 && !controller.cells) {\n      if (performSelection) {\n        selection.setRangeStart(coords);\n      }\n    } else if (coords.col < 0 && coords.row < 0) {\n      selection.setRangeStart(coords);\n    }\n  }\n}\n\n/**\n * MouseOver handler.\n *\n * @param {Object} options\n * @param {Boolean} options.isLeftClick\n * @param {CellRange} options.coords The CellCoords object with defined visual coordinates.\n * @param {Selection} options.selection The Selection class instance.\n * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what\n *                                    operation will be performed in later selection stages.\n */\nfunction mouseOver(_ref2) {\n  var isLeftClick = _ref2.isLeftClick,\n      coords = _ref2.coords,\n      selection = _ref2.selection,\n      controller = _ref2.controller;\n\n  if (!isLeftClick) {\n    return;\n  }\n\n  var selectedRow = selection.isSelectedByRowHeader();\n  var selectedColumn = selection.isSelectedByColumnHeader();\n  var countCols = selection.tableProps.countCols();\n  var countRows = selection.tableProps.countRows();\n\n  if (selectedColumn && !controller.column) {\n    selection.setRangeEnd(new _src.CellCoords(countRows - 1, coords.col));\n  } else if (selectedRow && !controller.row) {\n    selection.setRangeEnd(new _src.CellCoords(coords.row, countCols - 1));\n  } else if (!controller.cell) {\n    selection.setRangeEnd(coords);\n  }\n}\n\nvar handlers = new Map([['mousedown', mouseDown], ['mouseover', mouseOver], ['touchstart', mouseDown]]);\n\n/**\n * Mouse handler for selection functionality.\n *\n * @param {Event} event An native event to handle.\n * @param {Object} options\n * @param {CellRange} options.coords The CellCoords object with defined visual coordinates.\n * @param {Selection} options.selection The Selection class instance.\n * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what\n *                                    operation will be performed in later selection stages.\n */\nfunction handleMouseEvent(event, _ref3) {\n  var coords = _ref3.coords,\n      selection = _ref3.selection,\n      controller = _ref3.controller;\n\n  handlers.get(event.type)({\n    coords: coords,\n    selection: selection,\n    controller: controller,\n    isShiftKey: event.shiftKey,\n    isLeftClick: (0, _event.isLeftClick)(event) || event.type === 'touchstart',\n    isRightClick: (0, _event.isRightClick)(event)\n  });\n}\n\n/***/ }),\n/* 313 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.RecordTranslator = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.registerIdentity = registerIdentity;\nexports.getTranslator = getTranslator;\n\nvar _core = __webpack_require__(88);\n\nvar _core2 = _interopRequireDefault(_core);\n\nvar _object = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class RecordTranslator\n * @util\n */\nvar RecordTranslator = function () {\n  function RecordTranslator(hot) {\n    _classCallCheck(this, RecordTranslator);\n\n    this.hot = hot;\n  }\n\n  /**\n   * Translate physical row index into visual.\n   *\n   * @param {Number} row Physical row index.\n   * @returns {Number} Returns visual row index.\n   */\n\n\n  _createClass(RecordTranslator, [{\n    key: 'toVisualRow',\n    value: function toVisualRow(row) {\n      return this.hot.runHooks('unmodifyRow', row);\n    }\n\n    /**\n     * Translate physical column index into visual.\n     *\n     * @param {Number} column Physical column index.\n     * @returns {Number} Returns visual column index.\n     */\n\n  }, {\n    key: 'toVisualColumn',\n    value: function toVisualColumn(column) {\n      return this.hot.runHooks('unmodifyCol', column);\n    }\n\n    /**\n     * Translate physical coordinates into visual. Can be passed as separate 2 arguments (row, column) or as an object in first\n     * argument with `row` and `column` keys.\n     *\n     * @param {Number|Object} row Physical coordinates or row index.\n     * @param {Number} [column] Physical column index.\n     * @returns {Object|Array} Returns an object with visual records or an array if coordinates passed as separate arguments.\n     */\n\n  }, {\n    key: 'toVisual',\n    value: function toVisual(row, column) {\n      var result = void 0;\n\n      if ((0, _object.isObject)(row)) {\n        result = {\n          row: this.toVisualRow(row.row),\n          column: this.toVisualColumn(row.column)\n        };\n      } else {\n        result = [this.toVisualRow(row), this.toVisualColumn(column)];\n      }\n\n      return result;\n    }\n\n    /**\n     * Translate visual row index into physical.\n     *\n     * @param {Number} row Visual row index.\n     * @returns {Number} Returns physical row index.\n     */\n\n  }, {\n    key: 'toPhysicalRow',\n    value: function toPhysicalRow(row) {\n      return this.hot.runHooks('modifyRow', row);\n    }\n\n    /**\n     * Translate visual column index into physical.\n     *\n     * @param {Number} column Visual column index.\n     * @returns {Number} Returns physical column index.\n     */\n\n  }, {\n    key: 'toPhysicalColumn',\n    value: function toPhysicalColumn(column) {\n      return this.hot.runHooks('modifyCol', column);\n    }\n\n    /**\n     * Translate visual coordinates into physical. Can be passed as separate 2 arguments (row, column) or as an object in first\n     * argument with `row` and `column` keys.\n     *\n     * @param {Number|Object} row Visual coordinates or row index.\n     * @param {Number} [column] Visual column index.\n     * @returns {Object|Array} Returns an object with physical records or an array if coordinates passed as separate arguments.\n     */\n\n  }, {\n    key: 'toPhysical',\n    value: function toPhysical(row, column) {\n      var result = void 0;\n\n      if ((0, _object.isObject)(row)) {\n        result = {\n          row: this.toPhysicalRow(row.row),\n          column: this.toPhysicalColumn(row.column)\n        };\n      } else {\n        result = [this.toPhysicalRow(row), this.toPhysicalColumn(column)];\n      }\n\n      return result;\n    }\n  }]);\n\n  return RecordTranslator;\n}();\n\nexports.RecordTranslator = RecordTranslator;\n\n\nvar identities = new WeakMap();\nvar translatorSingletons = new WeakMap();\n\nfunction registerIdentity(identity, hot) {\n  identities.set(identity, hot);\n}\n\nfunction getTranslator(identity) {\n  var singleton = void 0;\n\n  if (!(identity instanceof _core2.default)) {\n    if (!identities.has(identity)) {\n      throw Error('Record translator was not registered for this object identity');\n    }\n    identity = identities.get(identity);\n  }\n  if (translatorSingletons.has(identity)) {\n    singleton = translatorSingletons.get(identity);\n  } else {\n    singleton = new RecordTranslator(identity);\n    translatorSingletons.set(identity, singleton);\n  }\n\n  return singleton;\n}\n\n/***/ }),\n/* 314 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.registerAsRootInstance = registerAsRootInstance;\nexports.hasValidParameter = hasValidParameter;\nexports.isRootInstance = isRootInstance;\nvar holder = exports.holder = new WeakMap();\n\nvar rootInstanceSymbol = exports.rootInstanceSymbol = Symbol('rootInstance');\n\n/**\n * Register an object as a root instance.\n *\n * @param  {Object} object An object to associate with root instance flag.\n */\nfunction registerAsRootInstance(object) {\n  holder.set(object, true);\n}\n\n/**\n * Check if the source of the root indication call is valid.\n *\n * @param  {Symbol} rootSymbol A symbol as a source of truth.\n * @return {Boolean}\n */\nfunction hasValidParameter(rootSymbol) {\n  return rootSymbol === rootInstanceSymbol;\n}\n\n/**\n * Check if passed an object was flagged as a root instance.\n *\n * @param  {Object} object An object to check.\n * @return {Boolean}\n */\nfunction isRootInstance(object) {\n  return holder.has(object);\n}\n\n/***/ }),\n/* 315 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _mixed = __webpack_require__(16);\n\nvar _object = __webpack_require__(2);\n\n/**\n * @alias Options\n * @constructor\n * @description\n\n * ## Constructor options\n *\n * Constructor options are applied using an object literal passed as a second argument to the Handsontable constructor.\n *\n * ```js\n * var hot = new Handsontable(document.getElementById('example1'), {\n *   data: myArray,\n *   width: 400,\n *   height: 300\n * });\n * ```\n *\n * ---\n * ## Cascading configuration\n *\n * Handsontable 0.9 and newer is using *Cascading Configuration*, which is a fast way to provide configuration options\n * for the entire table, including its columns and particular cells.\n *\n * Consider the following example:\n * ```js\n * var hot = new Handsontable(document.getElementById('example'), {\n *   readOnly: true,\n *   columns: [\n *     {readOnly: false},\n *     {},\n *     {}\n *   ],\n *   cells: function (row, col, prop) {\n *     var cellProperties = {};\n *\n *     if (row === 0 && col === 0) {\n *       cellProperties.readOnly = true;\n *     }\n *\n *     return cellProperties;\n *   }\n * });\n * ```\n *\n * The above notation will result in all TDs being *read only*, except for first column TDs which will be *editable*, except for the TD in top left corner which will still be *read only*.\n *\n * ### The Cascading Configuration model\n *\n * ##### 1. Constructor\n *\n * Configuration options that are provided using first-level `handsontable(container, {option: \"value\"})` and `updateSettings` method.\n *\n * ##### 2. Columns\n *\n * Configuration options that are provided using second-level object `handsontable(container, {columns: {option: \"value\"}]})`\n *\n * ##### 3. Cells\n *\n * Configuration options that are provided using third-level function `handsontable(container, {cells: function: (row, col, prop){ }})`\n *\n * ---\n * ## Architecture performance\n *\n * The Cascading Configuration model is based on prototypical inheritance. It is much faster and memory efficient compared\n * to the previous model that used jQuery extend. See: [http://jsperf.com/extending-settings](http://jsperf.com/extending-settings).\n *\n * ---\n * __Important notice:__ In order for the data separation to work properly, make sure that each instance of Handsontable has a unique `id`.\n */\nfunction DefaultSettings() {};\n\nDefaultSettings.prototype = {\n  /**\n   * License key for commercial version of Handsontable.\n   *\n   * @pro\n   * @type {String}\n   * @default 'trial'\n   */\n  licenseKey: 'trial',\n\n  /**\n   * @description\n   * Initial data source that will be bound to the data grid __by reference__ (editing data grid alters the data source).\n   * Can be declared as an Array of Arrays, Array of Objects or a Function.\n   *\n   * See [Understanding binding as reference](http://docs.handsontable.com/tutorial-data-binding.html#page-reference).\n   *\n   * @type {Array|Function}\n   * @default undefined\n   */\n  data: void 0,\n\n  /**\n   * @description\n   * Defines the structure of a new row when data source is an array of objects.\n   *\n   * See [data-schema](http://docs.handsontable.com/tutorial-data-sources.html#page-data-schema) for examples.\n   *\n   * @type {Object}\n   * @default undefined\n   */\n  dataSchema: void 0,\n\n  /**\n   * Width of the grid. Can be a value or a function that returns a value.\n   *\n   * @type {Number|Function}\n   * @default undefined\n   */\n  width: void 0,\n\n  /**\n   * Height of the grid. Can be a number or a function that returns a number.\n   *\n   * @type {Number|Function}\n   * @default undefined\n   */\n  height: void 0,\n\n  /**\n   * @description\n   * Initial number of rows.\n   *\n   * __Notice:__ This option only has effect in Handsontable constructor and only if `data` option is not provided\n   *\n   * @type {Number}\n   * @default 5\n   */\n  startRows: 5,\n\n  /**\n   * @description\n   * Initial number of columns.\n   *\n   * __Notice:__ This option only has effect in Handsontable constructor and only if `data` option is not provided\n   *\n   * @type {Number}\n   * @default 5\n   */\n  startCols: 5,\n\n  /**\n   * Setting `true` or `false` will enable or disable the default row headers (1, 2, 3).\n   * You can also define an array `['One', 'Two', 'Three', ...]` or a function to define the headers.\n   * If a function is set the index of the row is passed as a parameter.\n   *\n   * @type {Boolean|Array|Function}\n   * @default null\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * rowHeaders: true,\n   * ...\n   *\n   * ...\n   * // as array\n   * rowHeaders: [1, 2, 3],\n   * ...\n   *\n   * ...\n   * // as function\n   * rowHeaders: function(index) {\n   *   return index + ': AB';\n   * },\n   * ...\n   * ```\n   */\n  rowHeaders: void 0,\n\n  /**\n   * Setting `true` or `false` will enable or disable the default column headers (A, B, C).\n   * You can also define an array `['One', 'Two', 'Three', ...]` or a function to define the headers.\n   * If a function is set, then the index of the column is passed as a parameter.\n   *\n   * @type {Boolean|Array|Function}\n   * @default null\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * colHeaders: true,\n   * ...\n   *\n   * ...\n   * // as array\n   * colHeaders: ['A', 'B', 'C'],\n   * ...\n   *\n   * ...\n   * // as function\n   * colHeaders: function(index) {\n   *   return index + ': AB';\n   * },\n   * ...\n   * ```\n   */\n  colHeaders: null,\n\n  /**\n   * Defines column widths in pixels. Accepts number, string (that will be converted to a number),\n   * array of numbers (if you want to define column width separately for each column) or a\n   * function (if you want to set column width dynamically on each render).\n   *\n   * @type {Array|Function|Number|String}\n   * @default undefined\n   * @example\n   * ```js\n   * ...\n   * // as numeric, for each column.\n   * colWidths: 100,\n   * ...\n   *\n   * * ...\n   * // as string, for each column.\n   * colWidths: '100px',\n   * ...\n   *\n   * ...\n   * // as array, based on visual indexes. The rest of the columns have a default width.\n   * colWidths: [100, 120, 90],\n   * ...\n   *\n   * ...\n   * // as function, based on visual indexes.\n   * colWidths: function(index) {\n   *   return index * 10;\n   * },\n   * ...\n   * ```\n   */\n  colWidths: void 0,\n\n  /**\n   * Defines row heights in pixels. Accepts numbers, strings (that will be converted into a number),\n   * array of numbers (if you want to define row height separately for each row) or a\n   * function (if you want to set row height dynamically on each render).\n   * If the ManualRowResize or AutoRowSize plugins are enabled, this is also the minimum height that can be set\n   * via either of those two plugins.\n   * Height should be equal or greater than 23px. Table is rendered incorrectly if height is less than 23px.\n   *\n   * @type {Array|Function|Number|String}\n   * @default undefined\n   * @example\n   * ```js\n   * ...\n   * // as numeric, for each row.\n   * rowHeights: 100,\n   * ...\n   *\n   * * ...\n   * // as string, for each row.\n   * rowHeights: '100px',\n   * ...\n   *\n   * ...\n   * // as array, based on visual indexes. The rest of the rows have a default height.\n   * rowHeights: [100, 120, 90],\n   * ...\n   *\n   * ...\n   * // as function, based on visual indexes.\n   * rowHeights: function(index) {\n   *   return index * 10;\n   * },\n   * ...\n   * ```\n   */\n  rowHeights: void 0,\n\n  /**\n   * @description\n   * Defines the cell properties and data binding for certain columns.\n   *\n   * __Notice:__ Using this option sets a fixed number of columns (options `startCols`, `minCols`, `maxCols` will be ignored).\n   *\n   * See [documentation -> datasources.html](http://docs.handsontable.com/tutorial-data-sources.html#page-nested) for examples.\n   *\n   * @type {Array|Function}\n   * @default undefined\n   * @example\n   * ```js\n   * ...\n   * // as an array of objects. Order of the objects in array is representation of physical indexes.\n   * columns: [\n   *   {\n   *     // column options for the first column\n   *     type: 'numeric',\n   *     numericFormat: {\n   *       pattern: '0,0.00 $'\n   *     }\n   *   },\n   *   {\n   *     // column options for the second column\n   *     type: 'text',\n   *     readOnly: true\n   *   }\n   * ],\n   * ...\n   *\n   * // or as function, based on physical indexes\n   * ...\n   * columns: function(index) {\n  *    return {\n  *      type: index > 0 ? 'numeric' : 'text',\n  *      readOnly: index < 1\n  *    }\n   * }\n   * ...\n   * ```\n   */\n  columns: void 0,\n\n  /**\n   * @description\n   * Defines the cell properties for given `row`, `col`, `prop` coordinates.\n   * Any constructor or column option may be overwritten for a particular cell (row/column combination)\n   * using the `cells` property in the Handsontable constructor.\n   *\n   * __Note:__ Parameters `row` and `col` always represent __physical indexes__. Example below show how to execute\n   * operations based on the __visual__ representation of Handsontable.\n   *\n   * Possible values of `prop`:\n   * - property name for column's data source object, when dataset is an [array of objects](/tutorial-data-sources.html#page-object)\n   * - the same number as `col`, when dataset is an [array of arrays](/tutorial-data-sources.html#page-array)\n   *\n   * @type {Function}\n   * @default undefined\n   * @example\n   * ```js\n   * ...\n   * cells: function (row, col, prop) {\n   *   var cellProperties = {};\n   *   var visualRowIndex = this.instance.toVisualRow(row);\n   *   var visualColIndex = this.instance.toVisualColumn(col);\n   *\n   *   if (visualRowIndex === 0 && visualColIndex === 0) {\n   *     cellProperties.readOnly = true;\n   *   }\n   *\n   *   return cellProperties;\n   * },\n   * ...\n   * ```\n   */\n  cells: void 0,\n\n  /**\n   * Any constructor or column option may be overwritten for a particular cell (row/column combination), using `cell`\n   * array passed to the Handsontable constructor.\n   *\n   * @type {Array}\n   * @default []\n   * @example\n   * ```js\n   * ...\n   * cell: [\n   *   {row: 0, col: 0, readOnly: true}\n   * ],\n   * ...\n   * ```\n   */\n  cell: [],\n\n  /**\n   * @description\n   * If `true`, enables the {@link Comments} plugin, which enables an option to apply cell comments through the context menu\n   * (configurable with context menu keys `commentsAddEdit`, `commentsRemove`).\n   *\n   * To initialize Handsontable with predefined comments, provide cell coordinates and comment text values in a form of an array.\n   *\n   * See [Comments](http://docs.handsontable.com/demo-comments_.html) demo for examples.\n   *\n   * @since 0.11.0\n   * @type {Boolean|Array}\n   * @default false\n   * @example\n   * ```js\n   * ...\n   * comments: [{row: 1, col: 1, comment: {value: \"Test comment\"}}],\n   * ...\n   * ```\n   */\n  comments: false,\n\n  /**\n   * @description\n   * If `true`, enables the Custom Borders plugin, which enables an option to apply custom borders through the context menu (configurable with context menu key `borders`).\n   *\n   * To initialize Handsontable with predefined custom borders, provide cell coordinates and border styles in a form of an array.\n   *\n   * See [Custom Borders](http://docs.handsontable.com/demo-custom-borders.html) demo for examples.\n   *\n   * @since 0.11.0\n   * @type {Boolean|Array}\n   * @default false\n   * @example\n   * ```js\n   * ...\n   * customBorders: [\n   *   {range: {\n   *     from: {row: 1, col: 1},\n   *     to: {row: 3, col: 4}},\n   *     left: {},\n   *     right: {},\n   *     top: {},\n   *     bottom: {}\n   *   }\n   * ],\n   * ...\n   *\n   * // or\n   * ...\n   * customBorders: [\n   *   {row: 2, col: 2, left: {width: 2, color: 'red'},\n   *     right: {width: 1, color: 'green'}, top: '', bottom: ''}\n   * ],\n   * ...\n   * ```\n   */\n  customBorders: false,\n\n  /**\n   * Minimum number of rows. At least that number of rows will be created during initialization.\n   *\n   * @type {Number}\n   * @default 0\n   */\n  minRows: 0,\n\n  /**\n   * Minimum number of columns. At least that number of columns will be created during initialization.\n   *\n   * @type {Number}\n   * @default 0\n   */\n  minCols: 0,\n\n  /**\n   * Maximum number of rows. If set to a value lower than the initial row count, the data will be trimmed to the provided value as the number of rows.\n   *\n   * @type {Number}\n   * @default Infinity\n   */\n  maxRows: Infinity,\n\n  /**\n   * Maximum number of cols. If set to a value lower than the initial col count, the data will be trimmed to the provided value as the number of cols.\n   *\n   * @type {Number}\n   * @default Infinity\n   */\n  maxCols: Infinity,\n\n  /**\n   * When set to 1 (or more), Handsontable will add a new row at the end of grid if there are no more empty rows.\n   * (unless the number of rows exceeds the one set in the `maxRows` property)\n   *\n   * @type {Number}\n   * @default 0\n   */\n  minSpareRows: 0,\n\n  /**\n   * When set to 1 (or more), Handsontable will add a new column at the end of grid if there are no more empty columns.\n   * (unless the number of rows exceeds the one set in the `maxCols` property)\n   *\n   * @type {Number}\n   * @default 0\n   */\n  minSpareCols: 0,\n\n  /**\n   * If set to `false`, there won't be an option to insert new rows in the Context Menu.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  allowInsertRow: true,\n\n  /**\n   * If set to `false`, there won't be an option to insert new columns in the Context Menu.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  allowInsertColumn: true,\n\n  /**\n   * If set to `false`, there won't be an option to remove rows in the Context Menu.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  allowRemoveRow: true,\n\n  /**\n   * If set to `false`, there won't be an option to remove columns in the Context Menu.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  allowRemoveColumn: true,\n\n  /**\n   * @description\n   * Defines how the table selection reacts. The selection support three different behaviors defined as:\n   *  * `'single'` Only a single cell can be selected.\n   *  * `'range'` Multiple cells within a single range can be selected.\n   *  * `'multiple'` Multiple ranges of cells can be selected.\n   *\n   * To see how to interact with selection by getting selected data or change styles of the selected cells go to\n   * [https://docs.handsontable.com/demo-selecting-ranges.html](https://docs.handsontable.com/demo-selecting-ranges.html).\n   *\n   * @since 0.36.0\n   * @type {String}\n   * @default 'multiple'\n   */\n  selectionMode: 'multiple',\n\n  /**\n   * Enables the fill handle (drag-down and copy-down) functionality, which shows a small rectangle in bottom\n   * right corner of the selected area, that let's you expand values to the adjacent cells.\n   *\n   * Possible values: `true` (to enable in all directions), `'vertical'` or `'horizontal'` (to enable in one direction),\n   * `false` (to disable completely). Setting to `true` enables the fillHandle plugin.\n   *\n   * Since 0.23.0 you can pass object to plugin which allows you to add more options for this functionality. If `autoInsertRow`\n   * option is `true`, fill-handler will create new rows till it reaches the last row. It is enabled by default.\n   *\n   * @example\n   * ```js\n   * ...\n   * fillHandle: true // enable plugin in all directions and with autoInsertRow as true\n   * ...\n   * // or\n   * ...\n   * fillHandle: 'vertical' // enable plugin in vertical direction and with autoInsertRow as true\n   * ...\n   * // or\n   * ...\n   * fillHandle: { // enable plugin in both directions and with autoInsertRow as false\n   *   autoInsertRow: false,\n   * }\n   * // or\n   * ...\n   * fillHandle: { // enable plugin in vertical direction and with autoInsertRow as false\n   *   autoInsertRow: false,\n   *   direction: 'vertical' // 'vertical' or 'horizontal'\n   * }\n   * ```\n   *\n   * @type {Boolean|String|Object}\n   * @default true\n   */\n  fillHandle: true,\n\n  /**\n   * Allows to specify the number of fixed (or *frozen*) rows at the top of the table.\n   *\n   * @type {Number}\n   * @default 0\n   * @example\n   * ```js\n   * fixedRowsTop: 3 // This would freeze the top 3 rows of the table.\n   * ```\n   */\n  fixedRowsTop: 0,\n\n  /**\n   * Allows to specify the number of fixed (or *frozen*) rows at the bottom of the table.\n   *\n   * @pro\n   * @type {Number}\n   * @default 0\n   * @example\n   * ```js\n   * fixedRowsBottom: 3 // This would freeze the top 3 rows of the table.\n   * ```\n   */\n  fixedRowsBottom: 0,\n\n  /**\n   * Allows to specify the number of fixed (or *frozen*) columns on the left of the table.\n   *\n   * @type {Number}\n   * @default 0\n   * @example\n   * ```js\n   * fixedColumnsLeft: 3 // This would freeze the top 3 rows of the table.\n   * ```\n   */\n  fixedColumnsLeft: 0,\n\n  /**\n   * If `true`, mouse click outside the grid will deselect the current selection.\n   * Can be a function that takes the click event target and returns a boolean.\n   *\n   * @type {Boolean|Function}\n   * @default true\n   */\n  outsideClickDeselects: true,\n\n  /**\n   * If `true`, <kbd>ENTER</kbd> begins editing mode (like in Google Docs). If `false`, <kbd>ENTER</kbd> moves to next\n   * row (like Excel) and adds a new row if necessary. <kbd>TAB</kbd> adds new column if necessary.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  enterBeginsEditing: true,\n\n  /**\n   * Defines the cursor movement after <kbd>ENTER</kbd> was pressed (<kbd>SHIFT</kbd> + <kbd>ENTER</kbd> uses a negative vector).\n   * Can be an object or a function that returns an object. The event argument passed to the function\n   * is a DOM Event object received after the <kbd>ENTER</kbd> key has been pressed. This event object can be used to check\n   * whether user pressed <kbd>ENTER</kbd> or <kbd>SHIFT</kbd> + <kbd>ENTER</kbd>.\n   *\n   * @type {Object|Function}\n   * @default {row: 1, col: 0}\n   */\n  enterMoves: { row: 1, col: 0 },\n\n  /**\n   * Defines the cursor movement after <kbd>TAB</kbd> is pressed (<kbd>SHIFT</kbd> + <kbd>TAB</kbd> uses a negative vector).\n   * Can be an object or a function that returns an object. The event argument passed to the function\n   * is a DOM Event object received after the <kbd>TAB</kbd> key has been pressed. This event object can be used to check\n   * whether user pressed <kbd>TAB</kbd> or <kbd>SHIFT</kbd> + <kbd>TAB</kbd>.\n   *\n   * @type {Object}\n   * @default {row: 0, col: 1}\n   */\n  tabMoves: { row: 0, col: 1 },\n\n  /**\n   * If `true`, pressing <kbd>TAB</kbd> or right arrow in the last column will move to first column in next row.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  autoWrapRow: false,\n\n  /**\n   * If `true`, pressing <kbd>ENTER</kbd> or down arrow in the last row will move to the first row in the next column.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  autoWrapCol: false,\n\n  /**\n   * @description\n   * Turns on saving the state of column sorting, column positions and column sizes in local storage.\n   *\n   * You can save any sort of data in local storage to preserve table state between page reloads.\n   * In order to enable data storage mechanism, `persistentState` option must be set to `true` (you can set it\n   * either during Handsontable initialization or using the `updateSettings` method). When `persistentState` is enabled it exposes 3 hooks:\n   *\n   * __persistentStateSave__ (key: String, value: Mixed)\n   *\n   *   * Saves value under given key in browser local storage.\n   *\n   * __persistentStateLoad__ (key: String, valuePlaceholder: Object)\n   *\n   *   * Loads `value`, saved under given key, form browser local storage. The loaded `value` will be saved in `valuePlaceholder.value`\n   *     (this is due to specific behaviour of `Hooks.run()` method). If no value have been saved under key `valuePlaceholder.value`\n   *     will be `undefined`.\n   *\n   * __persistentStateReset__ (key: String)\n   *\n   *   * Clears the value saved under `key`. If no `key` is given, all values associated with table will be cleared.\n   *\n   * __Note:__ The main reason behind using `persistentState` hooks rather than regular LocalStorage API is that it\n   * ensures separation of data stored by multiple Handsontable instances. In other words, if you have two (or more)\n   * instances of Handsontable on one page, data saved by one instance won't be accessible by the second instance.\n   * Those two instances can store data under the same key and no data would be overwritten.\n   *\n   * __Important:__ In order for the data separation to work properly, make sure that each instance of Handsontable has a unique `id`.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  persistentState: void 0,\n\n  /**\n   * Class name for all visible rows in the current selection.\n   *\n   * @type {String}\n   * @default undefined\n   * @example\n   * ```js\n   * currentRowClassName: 'currentRow' // This will add a 'currentRow' class name to appropriate table cells.\n   * ```\n   */\n  currentRowClassName: void 0,\n\n  /**\n   * Class name for all visible columns in the current selection.\n   *\n   * @type {String}\n   * @default undefined\n   * @example\n   * ```js\n   * currentColClassName: 'currentColumn' // This will add a 'currentColumn' class name to appropriate table cells.\n   * ```\n   */\n  currentColClassName: void 0,\n\n  /**\n   * Class name for all visible headers in current selection.\n   *\n   * @type {String}\n   * @since 0.27.0\n   * @default 'ht__highlight'\n   * @example\n   * ```js\n   * currentHeaderClassName: 'ht__highlight' // This will add a 'ht__highlight' class name to appropriate table headers.\n   * ```\n   */\n  currentHeaderClassName: 'ht__highlight',\n\n  /**\n   * Class name for all active headers in selections. The header will be marked with this class name\n   * only when a whole column or row will be selected.\n   *\n   * @type {String}\n   * @since 0.38.2\n   * @default 'ht__active_highlight'\n   * @example\n   * ```js\n   * activeHeaderClassName: 'ht__active_highlight' // This will add a 'ht__active_highlight' class name to appropriate table headers.\n   * ```\n   */\n  activeHeaderClassName: 'ht__active_highlight',\n\n  /**\n   * Class name for the Handsontable container element.\n   *\n   * @type {String|Array}\n   * @default undefined\n   */\n  className: void 0,\n\n  /**\n   * Class name for all tables inside container element.\n   *\n   * @since 0.17.0\n   * @type {String|Array}\n   * @default undefined\n   */\n  tableClassName: void 0,\n\n  /**\n   * @description\n   * Defines how the columns react, when the declared table width is different than the calculated sum of all column widths.\n   * [See more](http://docs.handsontable.com/demo-stretching.html) mode. Possible values:\n   *  * `'none'` Disable stretching\n   *  * `'last'` Stretch only the last column\n   *  * `'all'` Stretch all the columns evenly\n   *\n   * @type {String}\n   * @default 'none'\n   */\n  stretchH: 'none',\n\n  /**\n   * Lets you overwrite the default `isEmptyRow` method, which checks if row at the provided index is empty.\n   *\n   * @type {Function}\n   * @param {Number} row Visual row index.\n   * @returns {Boolean}\n   */\n  isEmptyRow: function isEmptyRow(row) {\n    var col, colLen, value, meta;\n\n    for (col = 0, colLen = this.countCols(); col < colLen; col++) {\n      value = this.getDataAtCell(row, col);\n\n      if (value !== '' && value !== null && (0, _mixed.isDefined)(value)) {\n        if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') {\n          meta = this.getCellMeta(row, col);\n\n          return (0, _object.isObjectEqual)(this.getSchema()[meta.prop], value);\n        }\n        return false;\n      }\n    }\n\n    return true;\n  },\n\n\n  /**\n   * Lets you overwrite the default `isEmptyCol` method, which checks if column at the provided index is empty.\n   *\n   * @type {Function}\n   * @param {Number} col Visual column index\n   * @returns {Boolean}\n   */\n  isEmptyCol: function isEmptyCol(col) {\n    var row, rowLen, value;\n\n    for (row = 0, rowLen = this.countRows(); row < rowLen; row++) {\n      value = this.getDataAtCell(row, col);\n\n      if (value !== '' && value !== null && (0, _mixed.isDefined)(value)) {\n        return false;\n      }\n    }\n\n    return true;\n  },\n\n\n  /**\n   * When set to `true`, the table is re-rendered when it is detected that it was made visible in DOM.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  observeDOMVisibility: true,\n\n  /**\n   * If set to `true`, Handsontable will accept values that were marked as invalid by the cell `validator`.\n   * It will result with *invalid* cells being treated as *valid* (will save the *invalid* value into the Handsontable data source).\n   * If set to `false`, Handsontable will *not* accept the invalid values and won't allow the user to close the editor.\n   * This option will be particularly useful when used with the Autocomplete's `strict` mode.\n   *\n   * @type {Boolean}\n   * @default true\n   * @since 0.9.5\n   */\n  allowInvalid: true,\n\n  /**\n   * If set to `true`, Handsontable will accept values that are empty (`null`, `undefined` or `''`).\n   * If set to `false`, Handsontable will *not* accept the empty values and mark cell as invalid.\n   *\n   * @example\n   * ```js\n   * ...\n   * allowEmpty: true // allow empty values for all cells (whole table)\n   * ...\n   * // or\n   * ...\n   * columns: [\n   *   // allow empty values only for 'date' column\n   *   {data: 'date', dateFormat: 'DD/MM/YYYY', allowEmpty: true}\n   * ]\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   * @default true\n   * @since 0.23.0\n   */\n  allowEmpty: true,\n\n  /**\n   * CSS class name for cells that did not pass validation.\n   *\n   * @type {String}\n   * @default 'htInvalid'\n   */\n  invalidCellClassName: 'htInvalid',\n\n  /**\n   * When set to an non-empty string, displayed as the cell content for empty cells. If a value of a different type is provided,\n   * it will be stringified and applied as a string.\n   *\n   * @type {Mixed}\n   * @default false\n   */\n  placeholder: false,\n\n  /**\n   * CSS class name for cells that have a placeholder in use.\n   *\n   * @type {String}\n   * @default 'htPlaceholder'\n   */\n  placeholderCellClassName: 'htPlaceholder',\n\n  /**\n   * CSS class name for read-only cells.\n   *\n   * @type {String}\n   * @default 'htDimmed'\n   */\n  readOnlyCellClassName: 'htDimmed',\n\n  /**\n   * @description\n   * If a string is provided, it may be one of the following predefined values:\n   * * `autocomplete`,\n   * * `checkbox`,\n   * * `html`,\n   * * `numeric`,\n   * * `password`.\n   * * `text`.\n   *\n   * Or you can [register](http://docs.handsontable.com/demo-custom-renderers.html) the custom renderer under specified name and use\n   * its name as an alias in your configuration.\n   *\n   * If a function is provided, it will receive the following arguments:\n   * ```js\n   * function(instance, TD, row, col, prop, value, cellProperties) {}\n   * ```\n   *\n   * You can read more about custom renderes [in the documentation](http://docs.handsontable.com/demo-custom-renderers.html).\n   *\n   * @example\n   * ```js\n   * ...\n   * Handsontable.renderers.registerRenderer('my.renderer', function(instance, TD, row, col, prop, value, cellProperties) {\n   *   TD.innerHTML = value;\n   * });\n   * ...\n   * columns: [\n   *   {\n   *     editor: 'select',\n   *     renderer: 'autocomplete' // as string\n   *   },\n   *   {\n   *     renderer: 'my.renderer' // custom renderer as an alias\n   *   },\n   *   {\n   *     // renderer as custom function\n   *     renderer: function(hotInstance, TD, row, col, prop, value, cellProperties) {\n   *       TD.style.color = 'blue';\n   *       TD.innerHTML = value;\n   *     }\n   *   }\n   * ]\n   * ...\n   * ```\n   *\n   * @type {String|Function}\n   * @default undefined\n   */\n  renderer: void 0,\n\n  /**\n   * CSS class name added to the commented cells.\n   *\n   * @type {String}\n   * @default 'htCommentCell'\n   */\n  commentedCellClassName: 'htCommentCell',\n\n  /**\n   * If set to `true`, it enables the browser's native selection of a fragment of the text within a single cell, between adjacent cells or in a whole table.\n   * If set to `'cell'`, it enables the possibility of selecting a fragment of the text within a single cell's body.\n   *\n   * @type {Boolean|String}\n   * @default false\n   */\n  fragmentSelection: false,\n\n  /**\n   * @description\n   * Make cell [read only](http://docs.handsontable.com/demo-read-only.html).\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  readOnly: false,\n\n  /**\n   * @description\n   * When added to a `column` property, it skips the column on paste and pastes the data on the next column to the right.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  skipColumnOnPaste: false,\n\n  /**\n   * @description\n   * Setting to true enables the search plugin (see [demo](http://docs.handsontable.com/demo-search-for-values.html)).\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  search: false,\n\n  /**\n   * @description\n   * Shortcut to define the combination of the cell renderer, editor and validator for the column, cell or whole table.\n   *\n   * Possible values:\n   *  * [autocomplete](http://docs.handsontable.com/demo-autocomplete.html)\n   *  * [checkbox](http://docs.handsontable.com/demo-checkbox.html)\n   *  * [date](http://docs.handsontable.com/demo-date.html)\n   *  * [dropdown](http://docs.handsontable.com/demo-dropdown.html)\n   *  * [handsontable](http://docs.handsontable.com/demo-handsontable.html)\n   *  * [numeric](http://docs.handsontable.com/demo-numeric.html)\n   *  * [password](http://docs.handsontable.com/demo-password.html)\n   *  * text\n   *  * [time](http://docs.handsontable.com/demo-time.html)\n   *\n   * Or you can register the custom cell type under specified name and use\n   * its name as an alias in your configuration.\n   *\n   * @example\n   * ```js\n   * ...\n   * Handsontable.cellTypes.registerCellType('my.type', {\n   *   editor: MyEditorClass,\n   *   renderer: function(hot, td, row, col, prop, value, cellProperties) {\n   *     td.innerHTML = value;\n   *   },\n   *   validator: function(value, callback) {\n   *     callback(value === 'foo' ? true : false);\n   *   }\n   * });\n   * ...\n   * columns: [\n   *   {\n   *     type: 'text'\n   *   },\n   *   {\n   *     type: 'my.type' // an alias to custom type\n   *   },\n   *   {\n   *     type: 'checkbox'\n   *   }\n   * ]\n   * ...\n   * ```\n   *\n   * @type {String}\n   * @default 'text'\n   */\n  type: 'text',\n\n  /**\n   * @description\n   * Make cell copyable (pressing <kbd>CTRL</kbd> + <kbd>C</kbd> on your keyboard moves its value to system clipboard).\n   *\n   * __Note:__ this setting is `false` by default for cells with type `password`.\n   *\n   * @type {Boolean}\n   * @default true\n   * @since 0.10.2\n   */\n  copyable: true,\n\n  /**\n   * Defines the editor for the table/column/cell.\n   *\n   * If a string is provided, it may be one of the following predefined values:\n   *  * [autocomplete](http://docs.handsontable.com/demo-autocomplete.html)\n   *  * [checkbox](http://docs.handsontable.com/demo-checkbox.html)\n   *  * [date](http://docs.handsontable.com/demo-date.html)\n   *  * [dropdown](http://docs.handsontable.com/demo-dropdown.html)\n   *  * [handsontable](http://docs.handsontable.com/demo-handsontable.html)\n   *  * [mobile](http://docs.handsontable.com/demo-mobiles-and-tablets.html)\n   *  * [password](http://docs.handsontable.com/demo-password.html)\n   *  * [select](http://docs.handsontable.com/demo-select.html)\n   *  * text\n   *\n   * Or you can [register](http://docs.handsontable.com/tutorial-cell-editor.html#registering-an-editor) the custom editor under specified name and use\n   * its name as an alias in your configuration.\n   *\n   * To disable cell editing completely set `editor` property to `false`.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [\n   *   {\n   *     editor: 'select'\n   *   },\n   *   {\n   *     editor: false\n   *   }\n   * ]\n   * ...\n   * ```\n   *\n   * @type {String|Function|Boolean}\n   * @default 'text'\n   */\n  editor: void 0,\n\n  /**\n   * @description\n   * Autocomplete definitions. See [autocomplete demo](http://docs.handsontable.com/demo-autocomplete.html) for examples and definitions.\n   *\n   * @type {Array}\n   * @default undefined\n   */\n  autoComplete: void 0,\n\n  /**\n   * Control number of choices for the autocomplete (or dropdown) typed cells. After exceeding it, a scrollbar for the dropdown list of choices will appear.\n   *\n   * @since 0.18.0\n   * @type {Number}\n   * @default 10\n   */\n  visibleRows: 10,\n\n  /**\n   * Makes autocomplete or dropdown width the same as the edited cell width. If `false` then editor will be scaled\n   * according to its content.\n   *\n   * @since 0.17.0\n   * @type {Boolean}\n   * @default true\n   */\n  trimDropdown: true,\n\n  /**\n   * Setting to true enables the debug mode, currently used to test the correctness of the row and column\n   * header fixed positioning on a layer above the master table.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  debug: false,\n\n  /**\n   * When set to `true`, the text of the cell content is wrapped if it does not fit in the fixed column width.\n   *\n   * @type {Boolean}\n   * @default true\n   * @since 0.11.0\n   */\n  wordWrap: true,\n\n  /**\n   * CSS class name added to cells with cell meta `wordWrap: false`.\n   *\n   * @type {String}\n   * @default 'htNoWrap'\n   * @since 0.11.0\n   */\n  noWordWrapClassName: 'htNoWrap',\n\n  /**\n   * @description\n   * Defines if the right-click context menu should be enabled. Context menu allows to create new row or\n   * column at any place in the grid among [other features](http://docs.handsontable.com/demo-context-menu.html).\n   * Possible values:\n   * * `true` (to enable default options),\n   * * `false` (to disable completely)\n   * * an array of [predefined options](https://docs.handsontable.com/demo-context-menu.html#page-specific),\n   * * an object [with defined structure](http://docs.handsontable.com/demo-context-menu.html#page-custom)\n   *\n   * See [the context menu demo](http://docs.handsontable.com/demo-context-menu.html) for examples.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as a boolean\n   * contextMenu: true\n   * ...\n   * // as an array\n   * contextMenu: ['row_above', 'row_below', '--------', 'undo', 'redo']\n   * ...\n   * ```\n   * ...\n   * // as an object (`name` attribute is required in the custom keys)\n   * contextMenu: {\n   *   items: {\n   *     \"option1\": {\n   *       name: \"option1\"\n   *     },\n   *     \"option2\": {\n   *       name: \"option2\",\n   *       submenu: {\n   *         items: [\n   *           {\n   *             key: \"option2:suboption1\",\n   *             name: \"option2:suboption1\",\n   *             callback: function(key, options) {\n   *               ...\n   *             }\n   *           },\n   *           ...\n   *         ]\n   *       }\n   *     }\n   *   }\n   * }\n   * ...\n   * ```\n   * @type {Boolean|Array|Object}\n   * @default undefined\n   */\n  contextMenu: void 0,\n\n  /**\n   * @description\n   * Disable or enable the copy/paste functionality.\n   *\n   * @example\n   * ```js\n   * ...\n   * copyPaste: false,\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  copyPaste: true,\n\n  /**\n   * If `true`, undo/redo functionality is enabled.\n   *\n   * @type {Boolean}\n   * @default undefined\n   */\n  undo: void 0,\n\n  /**\n   * @description\n   * Turns on [Column sorting](http://docs.handsontable.com/demo-sorting-data.html).\n   * Can be either a boolean (true/false) or an object with a declared sorting options. See the below example:\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * columnSorting: true\n   * ...\n   * // as a object with initial order (sort ascending column at index 2)\n   * columnSorting: {\n   *   column: 2,\n   *   sortOrder: true, // true = ascending, false = descending, undefined = original order\n   *   sortEmptyCells: true // true = the table sorts empty cells, false = the table moves all empty cells to the end of the table\n   * }\n   * ...\n   * ```\n   *\n   * @type {Boolean|Object}\n   * @default undefined\n   */\n  columnSorting: void 0,\n\n  /**\n   * @description\n   * Turns on [Manual column move](http://docs.handsontable.com/demo-moving-rows-and-columns.html), if set to a boolean or define initial\n   * column order, if set to an array of column indexes.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * manualColumnMove: true\n   * ...\n   * // as a array with initial order (move column index at 0 to 1 and move column index at 1 to 4)\n   * manualColumnMove: [1, 4]\n   * ...\n   * ```\n   *\n   * @type {Boolean|Array}\n   * @default undefined\n   */\n  manualColumnMove: void 0,\n\n  /**\n   * @description\n   * Turns on [Manual column resize](http://docs.handsontable.com/demo-resizing.html), if set to a boolean or define initial\n   * column resized widths, if set to an array of numbers.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * manualColumnResize: true\n   * ...\n   * // as a array with initial widths (column at 0 index has 40px and column at 1 index has 50px)\n   * manualColumnResize: [40, 50]\n   * ...\n   * ```\n   *\n   * @type {Boolean|Array}\n   * @default undefined\n   */\n  manualColumnResize: void 0,\n\n  /**\n   * @description\n   * Turns on [Manual row move](http://docs.handsontable.com/demo-moving-rows-and-columns.html), if set to a boolean or define initial\n   * row order, if set to an array of row indexes.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * manualRowMove: true\n   * ...\n   * // as a array with initial order (move row index at 0 to 1 and move row index at 1 to 4)\n   * manualRowMove: [1, 4]\n   * ...\n   * ```\n   *\n   * @type {Boolean|Array}\n   * @default undefined\n   * @since 0.11.0\n   */\n  manualRowMove: void 0,\n\n  /**\n   * @description\n   * Turns on [Manual row resize](http://docs.handsontable.com/demo-resizing.html), if set to a boolean or define initial\n   * row resized heights, if set to an array of numbers.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * manualRowResize: true\n   * ...\n   * // as a array with initial heights (row at 0 index has 40px and row at 1 index has 50px)\n   * manualRowResize: [40, 50]\n   * ...\n   * ```\n   *\n   * @type {Boolean|Array}\n   * @default undefined\n   * @since 0.11.0\n   */\n  manualRowResize: void 0,\n\n  /**\n   * @description\n   * If set to `true`, it enables a possibility to merge cells. If set to an array of objects, it merges the cells provided in the objects (see the example below).\n   * [More information on the demo page.](http://docs.handsontable.com/demo-merge-cells.html)\n   *\n   * @example\n   * ```js\n   * // enables the mergeCells plugin:\n   * margeCells: true\n   * ...\n   * // declares a list of merged sections:\n   * mergeCells: [\n   *   {row: 1, col: 1, rowspan: 3, colspan: 3}, // rowspan and colspan properties declare the width and height of a merged section in cells\n   *   {row: 3, col: 4, rowspan: 2, colspan: 2},\n   *   {row: 5, col: 6, rowspan: 3, colspan: 3}\n   * ]\n   * ```\n   * @type {Boolean|Array}\n   * @default false\n   */\n  mergeCells: false,\n\n  /**\n   * Number of rows to be rendered outside of the visible part of the table.\n   * By default, it's set to `'auto'`, which makes Handsontable to attempt to calculate the best offset performance-wise.\n   *\n   * You may test out different values to find the best one that works for your specific implementation.\n   *\n   * @type {Number|String}\n   * @default 'auto'\n   */\n  viewportRowRenderingOffset: 'auto',\n\n  /**\n   * Number of columns to be rendered outside of the visible part of the table.\n   * By default, it's set to `'auto'`, which makes Handsontable try calculating the best offset performance-wise.\n   *\n   * You may experiment with the value to find the one that works best for your specific implementation.\n   *\n   * @type {Number|String}\n   * @default 'auto'\n   */\n  viewportColumnRenderingOffset: 'auto',\n\n  /**\n   * A function, regular expression or a string, which will be used in the process of cell validation.\n   * If a function is used, be sure to execute the callback argument with either `true` (`callback(true)`) if the validation passed\n   * or with `false` (`callback(false)`), if the validation failed.\n   * Note, that `this` in the function points to the `cellProperties` object.\n   *\n   * If a string is provided, it may be one of the following predefined values:\n   * * `autocomplete`,\n   * * `date`,\n   * * `numeric`,\n   * * `time`.\n   *\n   * Or you can [register](http://docs.handsontable.com/demo-data-validation.html) the validator function under specified name and use\n   * its name as an alias in your configuration.\n   *\n   * See more [in the demo](http://docs.handsontable.com/demo-data-validation.html).\n   *\n   * @example\n   * ```js\n   * // as a function\n   * columns: [\n   *    {\n   *      validator: function(value, callback) { // validation rules }\n   *    }\n   * ]\n   * ...\n   * // as a regexp\n   * columns: [\n   *    {\n   *      validator: /^[0-9]$/ // regular expression\n   *    }\n   * ]\n   * // as a string\n   * columns: [\n   *    {\n   *      validator: 'numeric'\n   *    }\n   * ]\n   * ```\n   * @type {Function|RegExp|String}\n   * @default undefined\n   * @since 0.9.5\n   */\n  validator: void 0,\n\n  /**\n   * @description\n   * Disable visual cells selection.\n   *\n   * Possible values:\n   *  * `true` - Disables any type of visual selection (current and area selection),\n   *  * `false` - Enables any type of visual selection. This is default value.\n   *  * `'current'` - Disables the selection of a currently selected cell, the area selection is still present.\n   *  * `'area'` - Disables the area selection, the currently selected cell selection is still present.\n   *  * `'header'` - Disables the headers selection, the currently selected cell selection is still present (available since 0.36.0).\n   *\n   * @type {Boolean|String|Array}\n   * @default false\n   * @since 0.13.2\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * disableVisualSelection: true,\n   * ...\n   *\n   * ...\n   * // as string ('current', 'area' or 'header')\n   * disableVisualSelection: 'current',\n   * ...\n   *\n   * ...\n   * // as array\n   * disableVisualSelection: ['current', 'area'],\n   * ...\n   * ```\n   */\n  disableVisualSelection: false,\n\n  /**\n   * @description\n   * Set whether to display the current sorting order indicator (a triangle icon in the column header, specifying the sorting order).\n   *\n   * @type {Boolean}\n   * @default false\n   * @since 0.15.0-beta3\n   */\n  sortIndicator: void 0,\n\n  /**\n   * Disable or enable ManualColumnFreeze plugin.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  manualColumnFreeze: void 0,\n\n  /**\n   * @description\n   * Defines whether Handsontable should trim the whitespace at the beginning and the end of the cell contents.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  trimWhitespace: true,\n\n  settings: void 0,\n\n  /**\n   * @description\n   * Defines data source for Autocomplete or Dropdown cell types.\n   *\n   * @example\n   * ```js\n   * ...\n   * // source as a array\n   * columns: [{\n   *   type: 'autocomplete',\n   *   source: ['A', 'B', 'C', 'D']\n   * }]\n   * ...\n   * // source as a function\n   * columns: [{\n   *   type: 'autocomplete',\n   *   source: function(query, callback) {\n   *     fetch('http://example.com/query?q=' + query, function(response) {\n   *       callback(response.items);\n   *     })\n   *   }\n   * }]\n   * ...\n   * ```\n   *\n   * @type {Array|Function}\n   * @default undefined\n   */\n  source: void 0,\n\n  /**\n   * @description\n   * Defines the column header name.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *     title: 'First name',\n   *     type: 'text',\n   *   },\n   *   {\n   *     title: 'Last name',\n   *     type: 'text',\n   *   }]\n   * ...\n   * ```\n   *\n   * @type {String}\n   * @default undefined\n   */\n  title: void 0,\n\n  /**\n   * Data template for `'checkbox'` type when checkbox is checked.\n   *\n   * @example\n   * ```js\n   * checkedTemplate: 'good'\n   *\n   * // if a checkbox-typed cell is checked, then getDataAtCell(x,y), where x and y are the coordinates of the cell\n   * // will return 'good'.\n   * ```\n   * @type {Boolean|String}\n   * @default true\n   */\n  checkedTemplate: void 0,\n\n  /**\n   * Data template for `'checkbox'` type when checkbox is unchecked.\n   *\n   * @example\n   * ```js\n   * uncheckedTemplate: 'bad'\n   *\n   * // if a checkbox-typed cell is not checked, then getDataAtCell(x,y), where x and y are the coordinates of the cell\n   * // will return 'bad'.\n   * ```\n   * @type {Boolean|String}\n   * @default false\n   */\n  uncheckedTemplate: void 0,\n\n  /**\n   * @description\n   * Object which describes if renderer should create checkbox element with label element as a parent. Option desired for\n   * [checkbox](http://docs.handsontable.com/demo-checkbox.html)-typed cells.\n   *\n   * By default the [checkbox](http://docs.handsontable.com/demo-checkbox.html) renderer renders the checkbox without a label.\n   *\n   * Possible object properties:\n   *  * `property` - Defines the property name of the data object, which will to be used as a label.\n   *  (eg. `label: {property: 'name.last'}`). This option works only if data was passed as an array of objects.\n   *  * `position` - String which describes where to place the label text (before or after checkbox element).\n   * Valid values are `'before'` and '`after`' (defaults to `'after'`).\n   *  * `value` - String or a Function which will be used as label text.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'checkbox',\n   *   label: {position: 'after', value: 'My label: '}\n   * }]\n   * ...\n   * ```\n   *\n   * @since 0.19.0\n   * @type {Object}\n   * @default undefined\n   */\n  label: void 0,\n\n  /**\n   * Display format. This option is desired for [numeric-typed](http://docs.handsontable.com/demo-numeric.html) cells. Format is described by two properties:\n   *\n   * - pattern, which is handled by `numbro` for purpose of formatting numbers to desired pattern. List of supported patterns can be found [here](http://numbrojs.com/format.html#numbers).\n   * - culture, which is handled by `numbro` for purpose of formatting currencies. Examples showing how it works can be found [here](http://numbrojs.com/format.html#currency). List of supported cultures can be found [here](http://numbrojs.com/languages.html#supported-languages).\n   *\n   * __Note:__ Please keep in mind that this option is used only to format the displayed output! It has no effect on the input data provided for the cell. The numeric data can be entered to the table only as floats (separated by a dot or a comma) or integers, and are stored in the source dataset as JavaScript numbers.\n   *\n   * Since 0.26.0 Handsontable uses [numbro](http://numbrojs.com/) as a main library for numbers formatting.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'numeric',\n   *   numericFormat: {\n   *     pattern: '0,00',\n   *     culture: 'en-US'\n   *   }\n   * }]\n   * ...\n   * ```\n   *\n   * @since 0.35.0\n   * @type {Object}\n   */\n  numericFormat: void 0,\n\n  /**\n   * Language for Handsontable translation. Possible language codes are: `en-US`, `pl-PL`.\n   *\n   * @type {String}\n   * @default 'en-US'\n   */\n  language: void 0,\n\n  /**\n   * @description\n   * Data source for [select](http://docs.handsontable.com/demo-select.html)-typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   editor: 'select',\n   *   selectOptions: ['A', 'B', 'C'],\n   * }]\n   * ...\n   * ```\n   *\n   * @type {Array}\n   */\n  selectOptions: void 0,\n\n  /**\n   * Enables or disables the autoColumnSize plugin. Default value is `undefined`, which has the same effect as `true`.\n   * Disabling this plugin can increase performance, as no size-related calculations would be done.\n   *\n   * Column width calculations are divided into sync and async part. Each of this parts has their own advantages and\n   * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous operations don't\n   * block the browser UI.\n   *\n   * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value.\n   * `syncLimit` option is available since 0.16.0.\n   *\n   * You can also use the `useHeaders` option to take the column headers with into calculation.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as a number (300 columns in sync, rest async)\n   * autoColumnSize: {syncLimit: 300},\n   * ...\n   *\n   * ...\n   * // as a string (percent)\n   * autoColumnSize: {syncLimit: '40%'},\n   * ...\n   *\n   * ...\n   * // use headers width while calculation the column width\n   * autoColumnSize: {useHeaders: true},\n   * ...\n   *\n   * ```\n   *\n   * @type {Object|Boolean}\n   * @default {syncLimit: 50}\n   */\n  autoColumnSize: void 0,\n\n  /**\n   * Enables or disables autoRowSize plugin. Default value is `undefined`, which has the same effect as `false` (disabled).\n   * Enabling this plugin can decrease performance, as size-related calculations would be performed.\n   *\n   * Row height calculations are divided into sync and async stages. Each of these stages has their own advantages and\n   * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous operations don't\n   * block the browser UI.\n   *\n   * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value.\n   * `syncLimit` options is available since 0.16.0.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as number (300 columns in sync, rest async)\n   * autoRowSize: {syncLimit: 300},\n   * ...\n   *\n   * ...\n   * // as string (percent)\n   * autoRowSize: {syncLimit: '40%'},\n   * ...\n   * ```\n   * @type {Object|Boolean}\n   * @default {syncLimit: 1000}\n   */\n  autoRowSize: void 0,\n\n  /**\n   * Date validation format.\n   *\n   * Option desired for `'date'` - typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'date',\n   *   dateFormat: 'MM/DD/YYYY'\n   * }]\n   * ...\n   * ```\n   *\n   * @type {String}\n   * @default 'DD/MM/YYYY'\n   */\n  dateFormat: void 0,\n\n  /**\n   * If `true` then dates will be automatically formatted to match the desired format.\n   *\n   * Option desired for `'date'`-typed typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'date',\n   *   dateFormat: 'YYYY-MM-DD',\n   *   correctFormat: true\n   * }]\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  correctFormat: false,\n\n  /**\n   * Definition of default value which will fill the empty cells.\n   *\n   * Option desired for `'date'`-typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'date',\n   *   defaultData: '2015-02-02'\n   * }]\n   * ...\n   * ```\n   *\n   * @type {String}\n   */\n  defaultDate: void 0,\n\n  /**\n   * If set to `true`, the value entered into the cell must match (case-sensitive) the autocomplete source. Otherwise, cell won't pass the validation.\n   * When filtering the autocomplete source list, the editor will be working in case-insensitive mode.\n   *\n   * Option desired for `autocomplete`-typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'autocomplete',\n   *   source: ['A', 'B', 'C'],\n   *   strict: true\n   * }]\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   */\n  strict: void 0,\n\n  /**\n   * @description\n   * If typed `true`, data defined in `source` of the autocomplete or dropdown cell will be treated as HTML.\n   *\n   * __Warning:__ Enabling this option can cause serious XSS vulnerabilities.\n   *\n   * Option desired for `'autocomplete'`-typed cells.\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'autocomplete',\n   *   allowHtml: true,\n   *   source: ['<b>foo</b>', '<b>bar</b>']\n   * }]\n   * ...\n   * ```\n   * @type {Boolean}\n   * @default false\n   */\n  allowHtml: false,\n\n  /**\n   * If typed `true` then virtual rendering mechanism for handsontable will be disabled.\n   *\n   * @type {Boolean}\n   */\n  renderAllRows: void 0,\n\n  /**\n   * Prevents table to overlap outside the parent element. If `'horizontal'` option is chosen then table will appear horizontal\n   * scrollbar in case where parent's width is narrower then table's width.\n   *\n   * Possible values:\n   *  * `false` - Disables functionality (Default option).\n   *  * `horizontal` - Prevents horizontal overflow table.\n   *  * `vertical` - Prevents vertical overflow table (Not implemented yet).\n   *\n   * @since 0.20.3\n   * @example\n   * ```js\n   * ...\n   * preventOverflow: 'horizontal'\n   * ...\n   * ```\n   *\n   * @type {String|Boolean}\n   */\n  preventOverflow: false,\n\n  /**\n   * @description\n   * Plugin allowing binding the table rows with their headers.\n   * If the plugin is enabled, the table row headers will \"stick\" to the rows, when they are hidden/moved. Basically, if at the initialization\n   * row 0 has a header titled \"A\", it will have it no matter what you do with the table.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|String}\n   * @example\n   *\n   * ```js\n   * ...\n   * var hot = new Handsontable(document.getElementById('example'), {\n   *   date: getData(),\n   *   bindRowsWithHeaders: true\n   * });\n   * ...\n   * ```\n   *\n   */\n  bindRowsWithHeaders: void 0,\n\n  /**\n   * @description\n   * The CollapsibleColumns plugin allows collapsing of columns, covered by a header with the `colspan` property defined.\n   *\n   * Clicking the \"collapse/expand\" button collapses (or expands) all \"child\" headers except the first one.\n   *\n   * Setting the `collapsibleColumns` property to `true` will display a \"collapse/expand\" button in every header with a defined\n   * `colspan` property.\n   *\n   * To limit this functionality to a smaller group of headers, define the `collapsibleColumns` property as an array of objects, as in\n   * the example below.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Array}\n   * @example\n   * ```js\n   * ...\n   *  collapsibleColumns: [\n   *    {row: -4, col: 1, collapsible: true},\n   *    {row: -3, col: 5, collapsible: true}\n   *  ]\n   * ...\n   * // or\n   * ...\n   *  collapsibleColumns: true\n   * ...\n   * ```\n   */\n  collapsibleColumns: void 0,\n\n  /**\n   * @description\n   * Allows making pre-defined calculations on the cell values and display the results within Handsontable.\n   * See the demo for more information.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Object}\n   */\n  columnSummary: void 0,\n\n  /**\n   * This plugin allows adding a configurable dropdown menu to the table's column headers.\n   * The dropdown menu acts like the Context Menu, but is triggered by clicking the button in the header.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Object|Array}\n   */\n  dropdownMenu: void 0,\n\n  /**\n   * The filters plugin.\n   * It allows filtering the table data either by the built-in component or with the API.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean}\n   */\n  filters: void 0,\n\n  /**\n   * It allows Handsontable to process formula expressions defined in the provided data.\n   *\n   * @pro\n   * @since 1.7.0\n   * @type {Boolean}\n   */\n  formulas: void 0,\n\n  /**\n   * @description\n   * GanttChart plugin enables a possibility to create a Gantt chart using a Handsontable instance.\n   * In this case, the whole table becomes read-only.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Object}\n   */\n  ganttChart: void 0,\n\n  /**\n   * @description\n   * Allows adding a tooltip to the table headers.\n   *\n   * Available options:\n   * * the `rows` property defines if tooltips should be added to row headers,\n   * * the `columns` property defines if tooltips should be added to column headers,\n   * * the `onlyTrimmed` property defines if tooltips should be added only to headers, which content is trimmed by the header itself (the content being wider then the header).\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Object}\n   */\n  headerTooltips: void 0,\n\n  /**\n   * Plugin allowing hiding of certain columns.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Object}\n   */\n  hiddenColumns: void 0,\n\n  /**\n   * @description\n   * Plugin allowing hiding of certain rows.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Object}\n   */\n  hiddenRows: void 0,\n\n  /**\n   * @description\n   * Allows creating a nested header structure, using the HTML's colspan attribute.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Array}\n   */\n  nestedHeaders: void 0,\n\n  /**\n   * @description\n   * Plugin allowing hiding of certain rows.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Array}\n   */\n  trimRows: void 0,\n\n  /**\n   * @description\n   * Allows setting a custom width of the row headers. You can provide a number or an array of widths, if many row header levels are defined.\n   *\n   * @since 0.22.0\n   * @type {Number|Array}\n   */\n  rowHeaderWidth: void 0,\n\n  /**\n   * @description\n   * Allows setting a custom height of the column headers. You can provide a number or an array of heights, if many column header levels are defined.\n   *\n   * @since 0.22.0\n   * @type {Number|Array}\n   */\n  columnHeaderHeight: void 0,\n\n  /**\n   * @description\n   * Enabling this plugin switches table into one-way data binding where changes are applied into data source (from outside table)\n   * will be automatically reflected in the table.\n   *\n   * For every data change [afterChangesObserved](Hooks.html#event:afterChangesObserved) hook will be fired.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  observeChanges: void 0,\n\n  /**\n   * @description\n   * When passed to the `column` property, allows specifying a custom sorting function for the desired column.\n   *\n   * @since 0.24.0\n   * @type {Function}\n   * @example\n   * ```js\n   * columns: [\n   *   {\n   *     sortFunction: function(sortOrder) {\n   *        return function(a, b) {\n   *          // sorting function body.\n   *          //\n   *          // Function parameters:\n   *          // sortOrder: If true, the order is ascending, if false - descending. undefined = original order\n   *          // a, b: Two compared elements. These are 2-element arrays, with the first element being the row index, the second - cell value.\n   *        }\n   *     }\n   *   }\n   * ]\n   * ```\n   */\n  sortFunction: void 0,\n\n  /**\n   * If defined as 'true', the Autocomplete's suggestion list would be sorted by relevance (the closer to the left the match is, the higher the suggestion).\n   *\n   * Option desired for cells of the `'autocomplete'` type.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  sortByRelevance: true,\n\n  /**\n   * If defined as 'true', when the user types into the input area the Autocomplete's suggestion list is updated to only\n   * include those choices starting with what has been typed; if defined as 'false' all suggestions remain shown, with\n   * those matching what has been typed marked in bold.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  filter: true,\n\n  /**\n   * If defined as 'true', filtering in the Autocomplete Editor will be case-sensitive.\n   *\n   * @type {Boolean}\n   * @default: false\n   */\n  filteringCaseSensitive: false,\n\n  /**\n   * @description\n   * Disable or enable the drag to scroll functionality.\n   *\n   * @example\n   * ```js\n   * ...\n   * dragToScroll: false,\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  dragToScroll: true\n};\n\nexports.default = DefaultSettings;\n\n/***/ }),\n/* 316 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getTranslatedPhrase = getTranslatedPhrase;\n\nvar _array = __webpack_require__(1);\n\nvar _dictionariesManager = __webpack_require__(71);\n\nvar _phraseFormatters = __webpack_require__(392);\n\nvar _mixed = __webpack_require__(16);\n\n/**\n * Get phrase for specified dictionary key.\n *\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n * @param {String} dictionaryKey Constant which is dictionary key.\n * @param {*} argumentsForFormatters Arguments which will be handled by formatters.\n *\n * @returns {String}\n */\n// eslint-disable-next-line import/prefer-default-export\nfunction getTranslatedPhrase(languageCode, dictionaryKey, argumentsForFormatters) {\n  var languageDictionary = (0, _dictionariesManager.getLanguageDictionary)(languageCode);\n\n  if (languageDictionary === null) {\n    return null;\n  }\n\n  var phrasePropositions = languageDictionary[dictionaryKey];\n\n  if ((0, _mixed.isUndefined)(phrasePropositions)) {\n    return null;\n  }\n\n  var formattedPhrase = getFormattedPhrase(phrasePropositions, argumentsForFormatters);\n\n  if (Array.isArray(formattedPhrase)) {\n    return formattedPhrase[0];\n  }\n\n  return formattedPhrase;\n}\n\n/**\n * Get formatted phrase from phrases propositions for specified dictionary key.\n *\n * @private\n * @param {Array|string} phrasePropositions List of phrase propositions.\n * @param {*} argumentsForFormatters Arguments which will be handled by formatters.\n *\n * @returns {Array|string}\n */\nfunction getFormattedPhrase(phrasePropositions, argumentsForFormatters) {\n  var formattedPhrasePropositions = phrasePropositions;\n\n  (0, _array.arrayEach)((0, _phraseFormatters.getPhraseFormatters)(), function (formatter) {\n    formattedPhrasePropositions = formatter(phrasePropositions, argumentsForFormatters);\n  });\n\n  return formattedPhrasePropositions;\n}\n\n/***/ }),\n/* 317 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _templateObject = _taggedTemplateLiteral(['Language with code \"', '\" was not found. You should register particular language \\n    before using it. Read more about this issue at: https://docs.handsontable.com/i18n/missing-language-code.'], ['Language with code \"', '\" was not found. You should register particular language \\n    before using it. Read more about this issue at: https://docs.handsontable.com/i18n/missing-language-code.']);\n\nexports.extendNotExistingKeys = extendNotExistingKeys;\nexports.createCellHeadersRange = createCellHeadersRange;\nexports.normalizeLanguageCode = normalizeLanguageCode;\nexports.applyLanguageSetting = applyLanguageSetting;\nexports.warnUserAboutLanguageRegistration = warnUserAboutLanguageRegistration;\n\nvar _mixed = __webpack_require__(16);\n\nvar _object = __webpack_require__(2);\n\nvar _console = __webpack_require__(56);\n\nvar _templateLiteralTag = __webpack_require__(42);\n\nvar _dictionariesManager = __webpack_require__(71);\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\n/**\n * Perform shallow extend of a target object with only this extension's properties which doesn't exist in the target.\n *\n * @param {Object} target An object that will receive the new properties.\n * @param {Object} extension An object containing additional properties to merge into the target.\n */\n// TODO: Maybe it should be moved to global helpers? It's changed `extend` function.\nfunction extendNotExistingKeys(target, extension) {\n  (0, _object.objectEach)(extension, function (value, key) {\n    if ((0, _mixed.isUndefined)(target[key])) {\n      target[key] = value;\n    }\n  });\n\n  return target;\n}\n\n/**\n * Create range of values basing on cell indexes. For example, it will create below ranges for specified function arguments:\n *\n * createCellHeadersRange(2, 7) => `2-7`\n * createCellHeadersRange(7, 2) => `2-7`\n * createCellHeadersRange(0, 4, 'A', 'D') => `A-D`\n * createCellHeadersRange(4, 0, 'D', 'A') => `A-D`\n *\n * @param {number} firstRowIndex Index of \"first\" cell\n * @param {number} nextRowIndex Index of \"next\" cell\n * @param {*} fromValue Value which will represent \"first\" cell\n * @param {*} toValue Value which will represent \"next\" cell\n * @returns {String} Value representing range i.e. A-Z, 11-15.\n */\nfunction createCellHeadersRange(firstRowIndex, nextRowIndex) {\n  var fromValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : firstRowIndex;\n  var toValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : nextRowIndex;\n\n  // Will swap `fromValue` with `toValue` if it's necessary.\n  if (firstRowIndex > nextRowIndex) {\n    var _ref = [toValue, fromValue];\n    fromValue = _ref[0];\n    toValue = _ref[1];\n  }\n\n  return fromValue + '-' + toValue;\n}\n\n/**\n * Normalize language code. It takes handled languageCode proposition and change it to proper languageCode.\n * For example, when it takes `eN-us` as parameter it return `en-US`\n *\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n * @returns {String}\n */\nfunction normalizeLanguageCode(languageCode) {\n  var languageCodePattern = /^([a-zA-Z]{2})-([a-zA-Z]{2})$/;\n  var partsOfLanguageCode = languageCodePattern.exec(languageCode);\n\n  if (partsOfLanguageCode) {\n    return partsOfLanguageCode[1].toLowerCase() + '-' + partsOfLanguageCode[2].toUpperCase();\n  }\n\n  return languageCode;\n}\n\n/**\n * Set proper start language code. User may set language code which is not proper.\n *\n * @param {Object} settings Settings object.\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n * @returns {String}\n */\nfunction applyLanguageSetting(settings, languageCode) {\n  var normalizedLanguageCode = normalizeLanguageCode(languageCode);\n\n  if ((0, _dictionariesManager.hasLanguageDictionary)(normalizedLanguageCode)) {\n    settings.language = normalizedLanguageCode;\n  } else {\n    settings.language = _dictionariesManager.DEFAULT_LANGUAGE_CODE;\n\n    warnUserAboutLanguageRegistration(languageCode);\n  }\n}\n\n/**\n *\n * Warn user if there is no registered language.\n *\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n */\nfunction warnUserAboutLanguageRegistration(languageCode) {\n  if ((0, _mixed.isDefined)(languageCode)) {\n    (0, _console.error)((0, _templateLiteralTag.toSingleLine)(_templateObject, languageCode));\n  }\n}\n\n/***/ }),\n/* 318 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.stopObserving = exports.startObserving = exports.isPressedCtrlKey = exports.isPressed = exports._resetState = exports._getRefCount = undefined;\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _unicode = __webpack_require__(21);\n\nvar _array = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar eventManager = new _eventManager2.default();\nvar pressedKeys = new Set();\nvar refCount = 0;\n\n/**\n * Begins observing keyboard keys states.\n */\nfunction startObserving() {\n  if (refCount === 0) {\n    eventManager.addEventListener(document, 'keydown', function (event) {\n      if (!pressedKeys.has(event.keyCode)) {\n        pressedKeys.add(event.keyCode);\n      }\n    });\n    eventManager.addEventListener(document, 'keyup', function (event) {\n      if (pressedKeys.has(event.keyCode)) {\n        pressedKeys.delete(event.keyCode);\n      }\n    });\n    eventManager.addEventListener(document, 'visibilitychange', function () {\n      if (document.hidden) {\n        pressedKeys.clear();\n      }\n    });\n  }\n\n  refCount += 1;\n}\n\n/**\n * Stops observing keyboard keys states and clear all previously saved states.\n */\nfunction stopObserving() {\n  if (refCount > 0) {\n    refCount -= 1;\n  }\n\n  if (refCount === 0) {\n    _resetState();\n  }\n}\n\n/**\n * Remove all listeners attached to the DOM and clear all previously saved states.\n */\nfunction _resetState() {\n  eventManager.clearEvents();\n  pressedKeys.clear();\n  refCount = 0;\n}\n\n/**\n * Checks if provided keyCode or keyCodes are pressed.\n *\n * @param {String} keyCodes The key codes passed as a string defined in helpers/unicode.js file delimited with '|'.\n * @return {Boolean}\n */\nfunction isPressed(keyCodes) {\n  return Array.from(pressedKeys.values()).some(function (_keyCode) {\n    return (0, _unicode.isKey)(_keyCode, keyCodes);\n  });\n}\n\n/**\n * Checks if ctrl keys are pressed.\n *\n * @return {Boolean}\n */\nfunction isPressedCtrlKey() {\n  return Array.from(pressedKeys.values()).some(function (_keyCode) {\n    return (0, _unicode.isCtrlMetaKey)(_keyCode);\n  });\n}\n\n/**\n * Returns reference count. Useful for debugging and testing purposes.\n *\n * @return {Number}\n */\nfunction _getRefCount() {\n  return refCount;\n}\n\nexports._getRefCount = _getRefCount;\nexports._resetState = _resetState;\nexports.isPressed = isPressed;\nexports.isPressedCtrlKey = isPressedCtrlKey;\nexports.startObserving = startObserving;\nexports.stopObserving = stopObserving;\n\n/***/ }),\n/* 319 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.HEADER_TYPE = exports.FILL_TYPE = exports.CELL_TYPE = exports.AREA_TYPE = exports.ACTIVE_HEADER_TYPE = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _types = __webpack_require__(395);\n\nvar _array = __webpack_require__(1);\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ACTIVE_HEADER_TYPE = exports.ACTIVE_HEADER_TYPE = 'active-header';\nvar AREA_TYPE = exports.AREA_TYPE = 'area';\nvar CELL_TYPE = exports.CELL_TYPE = 'cell';\nvar FILL_TYPE = exports.FILL_TYPE = 'fill';\nvar HEADER_TYPE = exports.HEADER_TYPE = 'header';\n\n/**\n * Highlight class responsible for managing Walkontable Selection classes.\n *\n * With Highlight object you can manipulate four different highlight types:\n *  - `cell` can be added only to a single cell at a time and it defines currently selected cell;\n *  - `fill` can occur only once and its highlight defines selection of autofill functionality (managed by the plugin with the same name);\n *  - `areas` can be added to multiple cells at a time. This type highlights selected cell or multiple cells.\n *    The multiple cells have to be defined as an uninterrupted order (regular shape). Otherwise, the new layer of\n *    that type should be created to manage not-consecutive selection;\n *  - `header` can occur multiple times. This type is designed to highlight only headers. Like `area` type it\n *    can appear with multiple highlights (accessed under different level layers).\n *\n * @class Highlight\n * @util\n */\n\nvar Highlight = function () {\n  function Highlight(options) {\n    _classCallCheck(this, Highlight);\n\n    /**\n     * Options consumed by Highlight class and Walkontable Selection classes.\n     *\n     * @type {Object}\n     */\n    this.options = options;\n    /**\n     * The property which describes which layer level of the visual selection will be modified.\n     * This option is valid only for `area` and `header` highlight types which occurs multiple times on\n     * the table (as a non-consecutive selection).\n     *\n     * An order of the layers is the same as the order of added new non-consecutive selections.\n     *\n     * @type {Number}\n     * @default 0\n     */\n    this.layerLevel = 0;\n    /**\n     * `cell` highlight object which describes attributes for the currently selected cell.\n     * It can only occur only once on the table.\n     *\n     * @type {Selection}\n     */\n    this.cell = (0, _types.createHighlight)(CELL_TYPE, options);\n    /**\n     * `fill` highlight object which describes attributes for the borders for autofill functionality.\n     * It can only occur only once on the table.\n     *\n     * @type {Selection}\n     */\n    this.fill = (0, _types.createHighlight)(FILL_TYPE, options);\n    /**\n     * Collection of the `area` highlights. That objects describes attributes for the borders and selection of\n     * the multiple selected cells. It can occur multiple times on the table.\n     *\n     * @type {Map.<number, Selection>}\n     */\n    this.areas = new Map();\n    /**\n     * Collection of the `header` highlights. That objects describes attributes for the selection of\n     * the multiple selected rows and columns in the table header. It can occur multiple times on the table.\n     *\n     * @type {Map.<number, Selection>}\n     */\n    this.headers = new Map();\n    /**\n     * Collection of the `active-header` highlights. That objects describes attributes for the selection of\n     * the multiple selected rows and columns in the table header. The table headers which have selected all items in\n     * a row will be marked as `active-header`.\n     *\n     * @type {Map.<number, Selection>}\n     */\n    this.activeHeaders = new Map();\n    /**\n     * The temporary property, holder for borders added through CustomBorders plugin.\n     *\n     * @type {Selection[]}\n     */\n    this.borders = [];\n  }\n\n  /**\n   * Check if highlight cell rendering is disabled for specyfied highlight type.\n   *\n   * @param {String} highlightType Highlight type. Possible values are: `cell`, `area`, `fill` or `header`.\n   * @return {Boolean}\n   */\n\n\n  _createClass(Highlight, [{\n    key: 'isEnabledFor',\n    value: function isEnabledFor(highlightType) {\n      var disableHighlight = this.options.disableHighlight;\n\n      // Legacy compatibility.\n      if (highlightType === 'current') {\n        highlightType = CELL_TYPE;\n      }\n\n      if (typeof disableHighlight === 'string') {\n        disableHighlight = [disableHighlight];\n      }\n\n      return disableHighlight === false || Array.isArray(disableHighlight) && !disableHighlight.includes(highlightType);\n    }\n\n    /**\n     * Set a new layer level to make access to the desire `area` and `header` highlights.\n     *\n     * @param {Number} [level=0] Layer level to use.\n     * @returns {Highlight}\n     */\n\n  }, {\n    key: 'useLayerLevel',\n    value: function useLayerLevel() {\n      var level = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n      this.layerLevel = level;\n\n      return this;\n    }\n\n    /**\n     * Get Walkontable Selection instance created for controlling highlight of the currently selected/edited cell.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'getCell',\n    value: function getCell() {\n      return this.cell;\n    }\n\n    /**\n     * Get Walkontable Selection instance created for controlling highlight of the autofill functionality.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'getFill',\n    value: function getFill() {\n      return this.fill;\n    }\n\n    /**\n     * Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight\n     * of the multiple selected cells.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'createOrGetArea',\n    value: function createOrGetArea() {\n      var layerLevel = this.layerLevel;\n      var area = void 0;\n\n      if (this.areas.has(layerLevel)) {\n        area = this.areas.get(layerLevel);\n      } else {\n        area = (0, _types.createHighlight)(AREA_TYPE, Object.assign({ layerLevel: layerLevel }, this.options));\n\n        this.areas.set(layerLevel, area);\n      }\n\n      return area;\n    }\n\n    /**\n     * Get all Walkontable Selection instances which describes the state of the visual highlight of the cells.\n     *\n     * @return {Selection[]}\n     */\n\n  }, {\n    key: 'getAreas',\n    value: function getAreas() {\n      return [].concat(_toConsumableArray(this.areas.values()));\n    }\n\n    /**\n     * Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight\n     * of the multiple selected header cells.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'createOrGetHeader',\n    value: function createOrGetHeader() {\n      var layerLevel = this.layerLevel;\n      var header = void 0;\n\n      if (this.headers.has(layerLevel)) {\n        header = this.headers.get(layerLevel);\n      } else {\n        header = (0, _types.createHighlight)(HEADER_TYPE, Object.assign({}, this.options));\n\n        this.headers.set(layerLevel, header);\n      }\n\n      return header;\n    }\n\n    /**\n     * Get all Walkontable Selection instances which describes the state of the visual highlight of the headers.\n     *\n     * @return {Selection[]}\n     */\n\n  }, {\n    key: 'getHeaders',\n    value: function getHeaders() {\n      return [].concat(_toConsumableArray(this.headers.values()));\n    }\n\n    /**\n     * Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight\n     * of the multiple selected active header cells.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'createOrGetActiveHeader',\n    value: function createOrGetActiveHeader() {\n      var layerLevel = this.layerLevel;\n      var header = void 0;\n\n      if (this.activeHeaders.has(layerLevel)) {\n        header = this.activeHeaders.get(layerLevel);\n      } else {\n        header = (0, _types.createHighlight)(ACTIVE_HEADER_TYPE, Object.assign({}, this.options));\n\n        this.activeHeaders.set(layerLevel, header);\n      }\n\n      return header;\n    }\n\n    /**\n     * Get all Walkontable Selection instances which describes the state of the visual highlight of the active headers.\n     *\n     * @return {Selection[]}\n     */\n\n  }, {\n    key: 'getActiveHeaders',\n    value: function getActiveHeaders() {\n      return [].concat(_toConsumableArray(this.activeHeaders.values()));\n    }\n\n    /**\n     * Perform cleaning visual highlights for the whole table.\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.cell.clear();\n      this.fill.clear();\n\n      (0, _array.arrayEach)(this.areas.values(), function (highlight) {\n        return void highlight.clear();\n      });\n      (0, _array.arrayEach)(this.headers.values(), function (highlight) {\n        return void highlight.clear();\n      });\n      (0, _array.arrayEach)(this.activeHeaders.values(), function (highlight) {\n        return void highlight.clear();\n      });\n    }\n\n    /**\n     * This object can be iterate over using `for of` syntax or using internal `arrayEach` helper.\n     */\n\n  }, {\n    key: Symbol.iterator,\n    value: function value() {\n      return [this.cell, this.fill].concat(_toConsumableArray(this.areas.values()), _toConsumableArray(this.headers.values()), _toConsumableArray(this.activeHeaders.values()), _toConsumableArray(this.borders))[Symbol.iterator]();\n    }\n  }]);\n\n  return Highlight;\n}();\n\nexports.default = Highlight;\n\n/***/ }),\n/* 320 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _mixed = __webpack_require__(16);\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class SamplesGenerator\n * @util\n */\nvar SamplesGenerator = function () {\n  _createClass(SamplesGenerator, null, [{\n    key: 'SAMPLE_COUNT',\n\n    /**\n     * Number of samples to take of each value length.\n     *\n     * @type {Number}\n     */\n    get: function get() {\n      return 3;\n    }\n  }]);\n\n  function SamplesGenerator(dataFactory) {\n    _classCallCheck(this, SamplesGenerator);\n\n    /**\n     * Samples prepared for calculations.\n     *\n     * @type {Map}\n     * @default {null}\n     */\n    this.samples = null;\n    /**\n     * Function which give the data to collect samples.\n     *\n     * @type {Function}\n     */\n    this.dataFactory = dataFactory;\n    /**\n     * Custom number of samples to take of each value length.\n     *\n     * @type {Number}\n     * @default {null}\n     */\n    this.customSampleCount = null;\n    /**\n     * `true` if duplicate samples collection should be allowed, `false` otherwise.\n     *\n     * @type {Boolean}\n     * @default {false}\n     */\n    this.allowDuplicates = false;\n  }\n\n  /**\n   * Get the sample count for this instance.\n   *\n   * @returns {Number}\n   */\n\n\n  _createClass(SamplesGenerator, [{\n    key: 'getSampleCount',\n    value: function getSampleCount() {\n      if (this.customSampleCount) {\n        return this.customSampleCount;\n      }\n      return SamplesGenerator.SAMPLE_COUNT;\n    }\n  }, {\n    key: 'setSampleCount',\n\n\n    /**\n     * Set the sample count.\n     *\n     * @param {Number} sampleCount Number of samples to be collected.\n     */\n    value: function setSampleCount(sampleCount) {\n      this.customSampleCount = sampleCount;\n    }\n\n    /**\n     * Set if the generator should accept duplicate values.\n     *\n     * @param {Boolean} allowDuplicates `true` to allow duplicate values.\n     */\n\n  }, {\n    key: 'setAllowDuplicates',\n    value: function setAllowDuplicates(allowDuplicates) {\n      this.allowDuplicates = allowDuplicates;\n    }\n\n    /**\n     * Generate samples for row. You can control which area should be sampled by passing `rowRange` object and `colRange` object.\n     *\n     * @param {Object|Number} rowRange\n     * @param {Object} colRange\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'generateRowSamples',\n    value: function generateRowSamples(rowRange, colRange) {\n      return this.generateSamples('row', colRange, rowRange);\n    }\n\n    /**\n     * Generate samples for column. You can control which area should be sampled by passing `colRange` object and `rowRange` object.\n     *\n     * @param {Object} colRange Column index.\n     * @param {Object} rowRange Column index.\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'generateColumnSamples',\n    value: function generateColumnSamples(colRange, rowRange) {\n      return this.generateSamples('col', rowRange, colRange);\n    }\n\n    /**\n     * Generate collection of samples.\n     *\n     * @param {String} type Type to generate. Can be `col` or `row`.\n     * @param {Object} range\n     * @param {Object|Number} specifierRange\n     * @returns {Map}\n     */\n\n  }, {\n    key: 'generateSamples',\n    value: function generateSamples(type, range, specifierRange) {\n      var _this = this;\n\n      var samples = new Map();\n\n      if (typeof specifierRange === 'number') {\n        specifierRange = { from: specifierRange, to: specifierRange };\n      }\n      (0, _number.rangeEach)(specifierRange.from, specifierRange.to, function (index) {\n        var sample = _this.generateSample(type, range, index);\n\n        samples.set(index, sample);\n      });\n\n      return samples;\n    }\n\n    /**\n     * Generate sample for specified type (`row` or `col`).\n     *\n     * @param {String} type Samples type `row` or `col`.\n     * @param {Object} range\n     * @param {Number} specifierValue\n     * @returns {Map}\n     */\n\n  }, {\n    key: 'generateSample',\n    value: function generateSample(type, range, specifierValue) {\n      var _this2 = this;\n\n      var samples = new Map();\n      var sampledValues = [];\n      var length = void 0;\n\n      (0, _number.rangeEach)(range.from, range.to, function (index) {\n        var value = void 0;\n\n        if (type === 'row') {\n          value = _this2.dataFactory(specifierValue, index);\n        } else if (type === 'col') {\n          value = _this2.dataFactory(index, specifierValue);\n        } else {\n          throw new Error('Unsupported sample type');\n        }\n\n        if ((0, _object.isObject)(value)) {\n          length = Object.keys(value).length;\n        } else if (Array.isArray(value)) {\n          length = value.length;\n        } else {\n          length = (0, _mixed.stringify)(value).length;\n        }\n\n        if (!samples.has(length)) {\n          samples.set(length, {\n            needed: _this2.getSampleCount(),\n            strings: []\n          });\n        }\n        var sample = samples.get(length);\n\n        if (sample.needed) {\n          var duplicate = sampledValues.indexOf(value) > -1;\n\n          if (!duplicate || _this2.allowDuplicates) {\n            var computedKey = type === 'row' ? 'col' : 'row';\n\n            sample.strings.push(_defineProperty({ value: value }, computedKey, index));\n            sampledValues.push(value);\n            sample.needed--;\n          }\n        }\n      });\n\n      return samples;\n    }\n  }]);\n\n  return SamplesGenerator;\n}();\n\nexports.default = SamplesGenerator;\n\n/***/ }),\n/* 321 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar MIXIN_NAME = 'arrayMapper';\n\n/**\n * @type {Object}\n */\nvar arrayMapper = {\n  _arrayMap: [],\n\n  /**\n   * Get translated index by its physical index.\n   *\n   * @param {Number} physicalIndex Physical index.\n   * @return {Number|null} Returns translated index mapped by passed physical index.\n   */\n  getValueByIndex: function getValueByIndex(physicalIndex) {\n    var length = this._arrayMap.length;\n    var translatedIndex = null;\n\n    if (physicalIndex < length) {\n      translatedIndex = this._arrayMap[physicalIndex];\n    }\n\n    return translatedIndex;\n  },\n\n\n  /**\n   * Get physical index by its translated index.\n   *\n   * @param {*} translatedIndex Value to search.\n   * @returns {Number|null} Returns a physical index of the array mapper.\n   */\n  getIndexByValue: function getIndexByValue(translatedIndex) {\n    var physicalIndex = void 0;\n\n    // eslint-disable-next-line no-cond-assign, no-return-assign\n    return (physicalIndex = this._arrayMap.indexOf(translatedIndex)) === -1 ? null : physicalIndex;\n  },\n\n\n  /**\n   * Insert new items to array mapper starting at passed index. New entries will be a continuation of last value in the array.\n   *\n   * @param {Number} physicalIndex Array index.\n   * @param {Number} [amount=1] Defines how many items will be created to an array.\n   * @returns {Array} Returns added items.\n   */\n  insertItems: function insertItems(physicalIndex) {\n    var _this = this;\n\n    var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n    var newIndex = (0, _array.arrayMax)(this._arrayMap) + 1;\n    var addedItems = [];\n\n    (0, _number.rangeEach)(amount - 1, function (count) {\n      addedItems.push(_this._arrayMap.splice(physicalIndex + count, 0, newIndex + count));\n    });\n\n    return addedItems;\n  },\n\n\n  /**\n   * Remove items from array mapper.\n   *\n   * @param {Number} physicalIndex Array index.\n   * @param {Number} [amount=1] Defines how many items will be created to an array.\n   * @returns {Array} Returns removed items.\n   */\n  removeItems: function removeItems(physicalIndex) {\n    var _this2 = this;\n\n    var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n    var removedItems = [];\n\n    if (Array.isArray(physicalIndex)) {\n      var mapCopy = [].concat(this._arrayMap);\n\n      // Sort descending\n      physicalIndex.sort(function (a, b) {\n        return b - a;\n      });\n\n      removedItems = (0, _array.arrayReduce)(physicalIndex, function (acc, item) {\n        _this2._arrayMap.splice(item, 1);\n\n        return acc.concat(mapCopy.slice(item, item + 1));\n      }, []);\n    } else {\n      removedItems = this._arrayMap.splice(physicalIndex, amount);\n    }\n\n    return removedItems;\n  },\n\n\n  /**\n   * Unshift items (remove and shift chunk of array to the left).\n   *\n   * @param {Number|Array} physicalIndex Array index or Array of indexes to unshift.\n   * @param {Number} [amount=1] Defines how many items will be removed from an array (when index is passed as number).\n   */\n  unshiftItems: function unshiftItems(physicalIndex) {\n    var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n    var removedItems = this.removeItems(physicalIndex, amount);\n\n    function countRowShift(logicalRow) {\n      // Todo: compare perf between reduce vs sort->each->brake\n      return (0, _array.arrayReduce)(removedItems, function (count, removedLogicalRow) {\n        if (logicalRow > removedLogicalRow) {\n          count++;\n        }\n\n        return count;\n      }, 0);\n    }\n\n    this._arrayMap = (0, _array.arrayMap)(this._arrayMap, function (logicalRow, physicalRow) {\n      var rowShift = countRowShift(logicalRow);\n\n      if (rowShift) {\n        logicalRow -= rowShift;\n      }\n\n      return logicalRow;\n    });\n  },\n\n\n  /**\n   * Shift (right shifting) items starting at passed index.\n   *\n   * @param {Number} physicalIndex Array index.\n   * @param {Number} [amount=1] Defines how many items will be created to an array.\n   */\n  shiftItems: function shiftItems(physicalIndex) {\n    var _this3 = this;\n\n    var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n    this._arrayMap = (0, _array.arrayMap)(this._arrayMap, function (row) {\n      if (row >= physicalIndex) {\n        row += amount;\n      }\n      return row;\n    });\n\n    (0, _number.rangeEach)(amount - 1, function (count) {\n      _this3._arrayMap.splice(physicalIndex + count, 0, physicalIndex + count);\n    });\n  },\n\n\n  /**\n   * Swap indexes in arrayMapper.\n   *\n   * @param {Number} physicalIndexFrom index to move.\n   * @param {Number} physicalIndexTo index to.\n   */\n  swapIndexes: function swapIndexes(physicalIndexFrom, physicalIndexTo) {\n    var _arrayMap;\n\n    (_arrayMap = this._arrayMap).splice.apply(_arrayMap, [physicalIndexTo, 0].concat(_toConsumableArray(this._arrayMap.splice(physicalIndexFrom, 1))));\n  },\n\n\n  /**\n   * Clear all stored index<->value information from an array.\n   */\n  clearMap: function clearMap() {\n    this._arrayMap.length = 0;\n  }\n};\n\n(0, _object.defineGetter)(arrayMapper, 'MIXIN_NAME', MIXIN_NAME, {\n  writable: false,\n  enumerable: false\n});\n\nexports.default = arrayMapper;\n\n/***/ }),\n/* 322 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _number = __webpack_require__(5);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar STATE_INITIALIZED = 0;\nvar STATE_BUILT = 1;\nvar STATE_APPENDED = 2;\nvar UNIT = 'px';\n\n/**\n * @class\n * @private\n */\n\nvar BaseUI = function () {\n  function BaseUI(hotInstance) {\n    _classCallCheck(this, BaseUI);\n\n    /**\n     * Instance of Handsontable.\n     *\n     * @type {Core}\n     */\n    this.hot = hotInstance;\n    /**\n     * DOM element representing the ui element.\n     *\n     * @type {HTMLElement}\n     * @private\n     */\n    this._element = null;\n    /**\n     * Flag which determines build state of element.\n     *\n     * @type {Boolean}\n     */\n    this.state = STATE_INITIALIZED;\n  }\n\n  /**\n   * Add created UI elements to table.\n   *\n   * @param {HTMLElement} wrapper Element which are parent for our UI element.\n   */\n\n\n  _createClass(BaseUI, [{\n    key: 'appendTo',\n    value: function appendTo(wrapper) {\n      wrapper.appendChild(this._element);\n\n      this.state = STATE_APPENDED;\n    }\n\n    /**\n     * Method for create UI element. Only create, without append to table.\n     */\n\n  }, {\n    key: 'build',\n    value: function build() {\n      this._element = document.createElement('div');\n      this.state = STATE_BUILT;\n    }\n\n    /**\n     * Method for remove UI element.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.isAppended()) {\n        this._element.parentElement.removeChild(this._element);\n      }\n\n      this._element = null;\n      this.state = STATE_INITIALIZED;\n    }\n\n    /**\n     * Check if UI element are appended.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isAppended',\n    value: function isAppended() {\n      return this.state === STATE_APPENDED;\n    }\n\n    /**\n     * Check if UI element are built.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isBuilt',\n    value: function isBuilt() {\n      return this.state >= STATE_BUILT;\n    }\n\n    /**\n     * Setter for position.\n     *\n     * @param {Number} top New top position of the element.\n     * @param {Number} left New left position of the element.\n     */\n\n  }, {\n    key: 'setPosition',\n    value: function setPosition(top, left) {\n      if ((0, _number.isNumeric)(top)) {\n        this._element.style.top = top + UNIT;\n      }\n      if ((0, _number.isNumeric)(left)) {\n        this._element.style.left = left + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element position.\n     *\n     * @returns {Object} Object contains left and top position of the element.\n     */\n\n  }, {\n    key: 'getPosition',\n    value: function getPosition() {\n      return {\n        top: this._element.style.top ? parseInt(this._element.style.top, 10) : 0,\n        left: this._element.style.left ? parseInt(this._element.style.left, 10) : 0\n      };\n    }\n\n    /**\n     * Setter for the element size.\n     *\n     * @param {Number} width New width of the element.\n     * @param {Number} height New height of the element.\n     */\n\n  }, {\n    key: 'setSize',\n    value: function setSize(width, height) {\n      if ((0, _number.isNumeric)(width)) {\n        this._element.style.width = width + UNIT;\n      }\n      if ((0, _number.isNumeric)(height)) {\n        this._element.style.height = height + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element position.\n     *\n     * @returns {Object} Object contains height and width of the element.\n     */\n\n  }, {\n    key: 'getSize',\n    value: function getSize() {\n      return {\n        width: this._element.style.width ? parseInt(this._element.style.width, 10) : 0,\n        height: this._element.style.height ? parseInt(this._element.style.height, 10) : 0\n      };\n    }\n\n    /**\n     * Setter for the element offset. Offset means marginTop and marginLeft of the element.\n     *\n     * @param {Number} top New margin top of the element.\n     * @param {Number} left New margin left of the element.\n     */\n\n  }, {\n    key: 'setOffset',\n    value: function setOffset(top, left) {\n      if ((0, _number.isNumeric)(top)) {\n        this._element.style.marginTop = top + UNIT;\n      }\n      if ((0, _number.isNumeric)(left)) {\n        this._element.style.marginLeft = left + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element offset.\n     *\n     * @returns {Object} Object contains top and left offset of the element.\n     */\n\n  }, {\n    key: 'getOffset',\n    value: function getOffset() {\n      return {\n        top: this._element.style.marginTop ? parseInt(this._element.style.marginTop, 10) : 0,\n        left: this._element.style.marginLeft ? parseInt(this._element.style.marginLeft, 10) : 0\n      };\n    }\n  }]);\n\n  return BaseUI;\n}();\n\nexports.default = BaseUI;\n\n/***/ }),\n/* 323 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar STATE_INITIALIZED = 0;\nvar STATE_BUILT = 1;\nvar STATE_APPENDED = 2;\nvar UNIT = 'px';\n\n/**\n * @class\n * @private\n */\n\nvar BaseUI = function () {\n  function BaseUI(hotInstance) {\n    _classCallCheck(this, BaseUI);\n\n    /**\n     * Instance of Handsontable.\n     *\n     * @type {Core}\n     */\n    this.hot = hotInstance;\n    /**\n     * DOM element representing the ui element.\n     *\n     * @type {HTMLElement}\n     * @private\n     */\n    this._element = null;\n    /**\n     * Flag which determines build state of element.\n     *\n     * @type {Boolean}\n     */\n    this.state = STATE_INITIALIZED;\n  }\n\n  /**\n   * Add created UI elements to table.\n   *\n   * @param {HTMLElement} wrapper Element which are parent for our UI element.\n   */\n\n\n  _createClass(BaseUI, [{\n    key: 'appendTo',\n    value: function appendTo(wrapper) {\n      wrapper.appendChild(this._element);\n\n      this.state = STATE_APPENDED;\n    }\n\n    /**\n     * Method for create UI element. Only create, without append to table.\n     */\n\n  }, {\n    key: 'build',\n    value: function build() {\n      this._element = document.createElement('div');\n      this.state = STATE_BUILT;\n    }\n\n    /**\n     * Method for remove UI element.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.isAppended()) {\n        this._element.parentElement.removeChild(this._element);\n      }\n\n      this._element = null;\n      this.state = STATE_INITIALIZED;\n    }\n\n    /**\n     * Check if UI element are appended.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isAppended',\n    value: function isAppended() {\n      return this.state === STATE_APPENDED;\n    }\n\n    /**\n     * Check if UI element are built.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isBuilt',\n    value: function isBuilt() {\n      return this.state >= STATE_BUILT;\n    }\n\n    /**\n     * Setter for position.\n     *\n     * @param {Number} top New top position of the element.\n     * @param {Number} left New left position of the element.\n     */\n\n  }, {\n    key: 'setPosition',\n    value: function setPosition(top, left) {\n      if (top !== void 0) {\n        this._element.style.top = top + UNIT;\n      }\n      if (left !== void 0) {\n        this._element.style.left = left + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element position.\n     *\n     * @returns {Object} Object contains left and top position of the element.\n     */\n\n  }, {\n    key: 'getPosition',\n    value: function getPosition() {\n      return {\n        top: this._element.style.top ? parseInt(this._element.style.top, 10) : 0,\n        left: this._element.style.left ? parseInt(this._element.style.left, 10) : 0\n      };\n    }\n\n    /**\n     * Setter for the element size.\n     *\n     * @param {Number} width New width of the element.\n     * @param {Number} height New height of the element.\n     */\n\n  }, {\n    key: 'setSize',\n    value: function setSize(width, height) {\n      if (width) {\n        this._element.style.width = width + UNIT;\n      }\n      if (height) {\n        this._element.style.height = height + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element position.\n     *\n     * @returns {Object} Object contains height and width of the element.\n     */\n\n  }, {\n    key: 'getSize',\n    value: function getSize() {\n      return {\n        width: this._element.style.width ? parseInt(this._element.style.width, 10) : 0,\n        height: this._element.style.height ? parseInt(this._element.style.height, 10) : 0\n      };\n    }\n\n    /**\n     * Setter for the element offset. Offset means marginTop and marginLeft of the element.\n     *\n     * @param {Number} top New margin top of the element.\n     * @param {Number} left New margin left of the element.\n     */\n\n  }, {\n    key: 'setOffset',\n    value: function setOffset(top, left) {\n      if (top) {\n        this._element.style.marginTop = top + UNIT;\n      }\n      if (left) {\n        this._element.style.marginLeft = left + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element offset.\n     *\n     * @returns {Object} Object contains top and left offset of the element.\n     */\n\n  }, {\n    key: 'getOffset',\n    value: function getOffset() {\n      return {\n        top: this._element.style.marginTop ? parseInt(this._element.style.marginTop, 10) : 0,\n        left: this._element.style.marginLeft ? parseInt(this._element.style.marginLeft, 10) : 0\n      };\n    }\n  }]);\n\n  return BaseUI;\n}();\n\nexports.default = BaseUI;\n\n/***/ }),\n/* 324 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.applySpanProperties = applySpanProperties;\n/**\n * Apply the `colspan`/`rowspan` properties.\n *\n * @param {HTMLElement} TD The soon-to-be-modified cell.\n * @param {MergedCellCoords} merged cellInfo The merged cell in question.\n * @param {Number} row Row index.\n * @param {Number} col Column index.\n */\n// eslint-disable-next-line import/prefer-default-export\nfunction applySpanProperties(TD, mergedCellInfo, row, col) {\n  if (mergedCellInfo) {\n    if (mergedCellInfo.row === row && mergedCellInfo.col === col) {\n      TD.setAttribute('rowspan', mergedCellInfo.rowspan.toString());\n      TD.setAttribute('colspan', mergedCellInfo.colspan.toString());\n    } else {\n      TD.removeAttribute('rowspan');\n      TD.removeAttribute('colspan');\n\n      TD.style.display = 'none';\n    }\n  } else {\n    TD.removeAttribute('rowspan');\n    TD.removeAttribute('colspan');\n\n    TD.style.display = '';\n  }\n}\n\n/***/ }),\n/* 325 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/*!\n * https://github.com/Starcounter-Jack/JSON-Patch\n * json-patch-duplex.js version: 0.5.7\n * (c) 2013 Joachim Wester\n * MIT license\n */\nvar __extends = undefined && undefined.__extends || function (d, b) {\n    for (var p in b) {\n        if (b.hasOwnProperty(p)) d[p] = b[p];\n    }function __() {\n        this.constructor = d;\n    }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OriginalError = Error;\nvar jsonpatch;\n(function (jsonpatch) {\n    var _objectKeys = function _objectKeys(obj) {\n        if (_isArray(obj)) {\n            var keys = new Array(obj.length);\n            for (var k = 0; k < keys.length; k++) {\n                keys[k] = \"\" + k;\n            }\n            return keys;\n        }\n        if (Object.keys) {\n            return Object.keys(obj);\n        }\n        var keys = [];\n        for (var i in obj) {\n            if (obj.hasOwnProperty(i)) {\n                keys.push(i);\n            }\n        }\n        return keys;\n    };\n    function _equals(a, b) {\n        switch (typeof a === 'undefined' ? 'undefined' : _typeof(a)) {\n            case 'undefined': //backward compatibility, but really I think we should return false\n            case 'boolean':\n            case 'string':\n            case 'number':\n                return a === b;\n            case 'object':\n                if (a === null) return b === null;\n                if (_isArray(a)) {\n                    if (!_isArray(b) || a.length !== b.length) return false;\n                    for (var i = 0, l = a.length; i < l; i++) {\n                        if (!_equals(a[i], b[i])) return false;\n                    }return true;\n                }\n                var bKeys = _objectKeys(b);\n                var bLength = bKeys.length;\n                if (_objectKeys(a).length !== bLength) return false;\n                for (var i = 0; i < bLength; i++) {\n                    if (!_equals(a[i], b[i])) return false;\n                }return true;\n            default:\n                return false;\n        }\n    }\n    /* We use a Javascript hash to store each\n     function. Each hash entry (property) uses\n     the operation identifiers specified in rfc6902.\n     In this way, we can map each patch operation\n     to its dedicated function in efficient way.\n     */\n    /* The operations applicable to an object */\n    var objOps = {\n        add: function add(obj, key) {\n            obj[key] = this.value;\n            return true;\n        },\n        remove: function remove(obj, key) {\n            delete obj[key];\n            return true;\n        },\n        replace: function replace(obj, key) {\n            obj[key] = this.value;\n            return true;\n        },\n        move: function move(obj, key, tree) {\n            var temp = { op: \"_get\", path: this.from };\n            apply(tree, [temp]);\n            apply(tree, [{ op: \"remove\", path: this.from }]);\n            apply(tree, [{ op: \"add\", path: this.path, value: temp.value }]);\n            return true;\n        },\n        copy: function copy(obj, key, tree) {\n            var temp = { op: \"_get\", path: this.from };\n            apply(tree, [temp]);\n            apply(tree, [{ op: \"add\", path: this.path, value: temp.value }]);\n            return true;\n        },\n        test: function test(obj, key) {\n            return _equals(obj[key], this.value);\n        },\n        _get: function _get(obj, key) {\n            this.value = obj[key];\n        }\n    };\n    /* The operations applicable to an array. Many are the same as for the object */\n    var arrOps = {\n        add: function add(arr, i) {\n            arr.splice(i, 0, this.value);\n            return true;\n        },\n        remove: function remove(arr, i) {\n            arr.splice(i, 1);\n            return true;\n        },\n        replace: function replace(arr, i) {\n            arr[i] = this.value;\n            return true;\n        },\n        move: objOps.move,\n        copy: objOps.copy,\n        test: objOps.test,\n        _get: objOps._get\n    };\n    /* The operations applicable to object root. Many are the same as for the object */\n    var rootOps = {\n        add: function add(obj) {\n            rootOps.remove.call(this, obj);\n            for (var key in this.value) {\n                if (this.value.hasOwnProperty(key)) {\n                    obj[key] = this.value[key];\n                }\n            }\n            return true;\n        },\n        remove: function remove(obj) {\n            for (var key in obj) {\n                if (obj.hasOwnProperty(key)) {\n                    objOps.remove.call(this, obj, key);\n                }\n            }\n            return true;\n        },\n        replace: function replace(obj) {\n            apply(obj, [{ op: \"remove\", path: this.path }]);\n            apply(obj, [{ op: \"add\", path: this.path, value: this.value }]);\n            return true;\n        },\n        move: objOps.move,\n        copy: objOps.copy,\n        test: function test(obj) {\n            return JSON.stringify(obj) === JSON.stringify(this.value);\n        },\n        _get: function _get(obj) {\n            this.value = obj;\n        }\n    };\n    var observeOps = {\n        add: function add(patches, path) {\n            var patch = {\n                op: \"add\",\n                path: path + escapePathComponent(this.name),\n                value: this.object[this.name] };\n            patches.push(patch);\n        },\n        'delete': function _delete(patches, path) {\n            var patch = {\n                op: \"remove\",\n                path: path + escapePathComponent(this.name)\n            };\n            patches.push(patch);\n        },\n        update: function update(patches, path) {\n            var patch = {\n                op: \"replace\",\n                path: path + escapePathComponent(this.name),\n                value: this.object[this.name]\n            };\n            patches.push(patch);\n        }\n    };\n    function escapePathComponent(str) {\n        if (str.indexOf('/') === -1 && str.indexOf('~') === -1) return str;\n        return str.replace(/~/g, '~0').replace(/\\//g, '~1');\n    }\n    function _getPathRecursive(root, obj) {\n        var found;\n        for (var key in root) {\n            if (root.hasOwnProperty(key)) {\n                if (root[key] === obj) {\n                    return escapePathComponent(key) + '/';\n                } else if (_typeof(root[key]) === 'object') {\n                    found = _getPathRecursive(root[key], obj);\n                    if (found != '') {\n                        return escapePathComponent(key) + '/' + found;\n                    }\n                }\n            }\n        }\n        return '';\n    }\n    function getPath(root, obj) {\n        if (root === obj) {\n            return '/';\n        }\n        var path = _getPathRecursive(root, obj);\n        if (path === '') {\n            throw new OriginalError(\"Object not found in root\");\n        }\n        return '/' + path;\n    }\n    var beforeDict = [];\n    var Mirror = function () {\n        function Mirror(obj) {\n            this.observers = [];\n            this.obj = obj;\n        }\n        return Mirror;\n    }();\n    var ObserverInfo = function () {\n        function ObserverInfo(callback, observer) {\n            this.callback = callback;\n            this.observer = observer;\n        }\n        return ObserverInfo;\n    }();\n    function getMirror(obj) {\n        for (var i = 0, ilen = beforeDict.length; i < ilen; i++) {\n            if (beforeDict[i].obj === obj) {\n                return beforeDict[i];\n            }\n        }\n    }\n    function getObserverFromMirror(mirror, callback) {\n        for (var j = 0, jlen = mirror.observers.length; j < jlen; j++) {\n            if (mirror.observers[j].callback === callback) {\n                return mirror.observers[j].observer;\n            }\n        }\n    }\n    function removeObserverFromMirror(mirror, observer) {\n        for (var j = 0, jlen = mirror.observers.length; j < jlen; j++) {\n            if (mirror.observers[j].observer === observer) {\n                mirror.observers.splice(j, 1);\n                return;\n            }\n        }\n    }\n    function unobserve(root, observer) {\n        observer.unobserve();\n    }\n    jsonpatch.unobserve = unobserve;\n    function deepClone(obj) {\n        if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === \"object\") {\n            return JSON.parse(JSON.stringify(obj)); //Faster than ES5 clone - http://jsperf.com/deep-cloning-of-objects/5\n        } else {\n            return obj; //no need to clone primitives\n        }\n    }\n    function observe(obj, callback) {\n        var patches = [];\n        var root = obj;\n        var observer;\n        var mirror = getMirror(obj);\n        if (!mirror) {\n            mirror = new Mirror(obj);\n            beforeDict.push(mirror);\n        } else {\n            observer = getObserverFromMirror(mirror, callback);\n        }\n        if (observer) {\n            return observer;\n        }\n        observer = {};\n        mirror.value = deepClone(obj);\n        if (callback) {\n            observer.callback = callback;\n            observer.next = null;\n            var intervals = this.intervals || [100, 1000, 10000, 60000];\n            if (intervals.push === void 0) {\n                throw new OriginalError(\"jsonpatch.intervals must be an array\");\n            }\n            var currentInterval = 0;\n            var dirtyCheck = function dirtyCheck() {\n                generate(observer);\n            };\n            var fastCheck = function fastCheck() {\n                clearTimeout(observer.next);\n                observer.next = setTimeout(function () {\n                    dirtyCheck();\n                    currentInterval = 0;\n                    observer.next = setTimeout(slowCheck, intervals[currentInterval++]);\n                }, 0);\n            };\n            var slowCheck = function slowCheck() {\n                dirtyCheck();\n                if (currentInterval == intervals.length) currentInterval = intervals.length - 1;\n                observer.next = setTimeout(slowCheck, intervals[currentInterval++]);\n            };\n            if (typeof window !== 'undefined') {\n                if (window.addEventListener) {\n                    window.addEventListener('mousedown', fastCheck);\n                    window.addEventListener('mouseup', fastCheck);\n                    window.addEventListener('keydown', fastCheck);\n                } else {\n                    document.documentElement.attachEvent('onmousedown', fastCheck);\n                    document.documentElement.attachEvent('onmouseup', fastCheck);\n                    document.documentElement.attachEvent('onkeydown', fastCheck);\n                }\n            }\n            observer.next = setTimeout(slowCheck, intervals[currentInterval++]);\n        }\n        observer.patches = patches;\n        observer.object = obj;\n        observer.unobserve = function () {\n            generate(observer);\n            clearTimeout(observer.next);\n            removeObserverFromMirror(mirror, observer);\n            if (typeof window !== 'undefined') {\n                if (window.removeEventListener) {\n                    window.removeEventListener('mousedown', fastCheck);\n                    window.removeEventListener('mouseup', fastCheck);\n                    window.removeEventListener('keydown', fastCheck);\n                } else {\n                    document.documentElement.detachEvent('onmousedown', fastCheck);\n                    document.documentElement.detachEvent('onmouseup', fastCheck);\n                    document.documentElement.detachEvent('onkeydown', fastCheck);\n                }\n            }\n        };\n        mirror.observers.push(new ObserverInfo(callback, observer));\n        return observer;\n    }\n    jsonpatch.observe = observe;\n    function generate(observer) {\n        var mirror;\n        for (var i = 0, ilen = beforeDict.length; i < ilen; i++) {\n            if (beforeDict[i].obj === observer.object) {\n                mirror = beforeDict[i];\n                break;\n            }\n        }\n        _generate(mirror.value, observer.object, observer.patches, \"\");\n        if (observer.patches.length) {\n            apply(mirror.value, observer.patches);\n        }\n        var temp = observer.patches;\n        if (temp.length > 0) {\n            observer.patches = [];\n            if (observer.callback) {\n                observer.callback(temp);\n            }\n        }\n        return temp;\n    }\n    jsonpatch.generate = generate;\n    // Dirty check if obj is different from mirror, generate patches and update mirror\n    function _generate(mirror, obj, patches, path) {\n        var newKeys = _objectKeys(obj);\n        var oldKeys = _objectKeys(mirror);\n        var changed = false;\n        var deleted = false;\n        //if ever \"move\" operation is implemented here, make sure this test runs OK: \"should not generate the same patch twice (move)\"\n        for (var t = oldKeys.length - 1; t >= 0; t--) {\n            var key = oldKeys[t];\n            var oldVal = mirror[key];\n            if (obj.hasOwnProperty(key)) {\n                var newVal = obj[key];\n                if ((typeof oldVal === 'undefined' ? 'undefined' : _typeof(oldVal)) == \"object\" && oldVal != null && (typeof newVal === 'undefined' ? 'undefined' : _typeof(newVal)) == \"object\" && newVal != null) {\n                    _generate(oldVal, newVal, patches, path + \"/\" + escapePathComponent(key));\n                } else {\n                    if (oldVal != newVal) {\n                        changed = true;\n                        patches.push({ op: \"replace\", path: path + \"/\" + escapePathComponent(key), value: deepClone(newVal) });\n                    }\n                }\n            } else {\n                patches.push({ op: \"remove\", path: path + \"/\" + escapePathComponent(key) });\n                deleted = true; // property has been deleted\n            }\n        }\n        if (!deleted && newKeys.length == oldKeys.length) {\n            return;\n        }\n        for (var t = 0; t < newKeys.length; t++) {\n            var key = newKeys[t];\n            if (!mirror.hasOwnProperty(key)) {\n                patches.push({ op: \"add\", path: path + \"/\" + escapePathComponent(key), value: deepClone(obj[key]) });\n            }\n        }\n    }\n    var _isArray;\n    if (Array.isArray) {\n        _isArray = Array.isArray;\n    } else {\n        _isArray = function _isArray(obj) {\n            return obj.push && typeof obj.length === 'number';\n        };\n    }\n    //3x faster than cached /^\\d+$/.test(str)\n    function isInteger(str) {\n        var i = 0;\n        var len = str.length;\n        var charCode;\n        while (i < len) {\n            charCode = str.charCodeAt(i);\n            if (charCode >= 48 && charCode <= 57) {\n                i++;\n                continue;\n            }\n            return false;\n        }\n        return true;\n    }\n    /// Apply a json-patch operation on an object tree\n    function apply(tree, patches, validate) {\n        var result = false,\n            p = 0,\n            plen = patches.length,\n            patch,\n            key;\n        while (p < plen) {\n            patch = patches[p];\n            p++;\n            // Find the object\n            var path = patch.path || \"\";\n            var keys = path.split('/');\n            var obj = tree;\n            var t = 1; //skip empty element - http://jsperf.com/to-shift-or-not-to-shift\n            var len = keys.length;\n            var existingPathFragment = undefined;\n            while (true) {\n                key = keys[t];\n                if (validate) {\n                    if (existingPathFragment === undefined) {\n                        if (obj[key] === undefined) {\n                            existingPathFragment = keys.slice(0, t).join('/');\n                        } else if (t == len - 1) {\n                            existingPathFragment = patch.path;\n                        }\n                        if (existingPathFragment !== undefined) {\n                            this.validator(patch, p - 1, tree, existingPathFragment);\n                        }\n                    }\n                }\n                t++;\n                if (key === undefined) {\n                    if (t >= len) {\n                        result = rootOps[patch.op].call(patch, obj, key, tree); // Apply patch\n                        break;\n                    }\n                }\n                if (_isArray(obj)) {\n                    if (key === '-') {\n                        key = obj.length;\n                    } else {\n                        if (validate && !isInteger(key)) {\n                            throw new JsonPatchError(\"Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index\", \"OPERATION_PATH_ILLEGAL_ARRAY_INDEX\", p - 1, patch.path, patch);\n                        }\n                        key = parseInt(key, 10);\n                    }\n                    if (t >= len) {\n                        if (validate && patch.op === \"add\" && key > obj.length) {\n                            throw new JsonPatchError(\"The specified index MUST NOT be greater than the number of elements in the array\", \"OPERATION_VALUE_OUT_OF_BOUNDS\", p - 1, patch.path, patch);\n                        }\n                        result = arrOps[patch.op].call(patch, obj, key, tree); // Apply patch\n                        break;\n                    }\n                } else {\n                    if (key && key.indexOf('~') != -1) key = key.replace(/~1/g, '/').replace(/~0/g, '~'); // escape chars\n                    if (t >= len) {\n                        result = objOps[patch.op].call(patch, obj, key, tree); // Apply patch\n                        break;\n                    }\n                }\n                obj = obj[key];\n            }\n        }\n        return result;\n    }\n    jsonpatch.apply = apply;\n    function compare(tree1, tree2) {\n        var patches = [];\n        _generate(tree1, tree2, patches, '');\n        return patches;\n    }\n    jsonpatch.compare = compare;\n    var JsonPatchError = function (_super) {\n        __extends(JsonPatchError, _super);\n        function JsonPatchError(message, name, index, operation, tree) {\n            _super.call(this, message);\n            this.message = message;\n            this.name = name;\n            this.index = index;\n            this.operation = operation;\n            this.tree = tree;\n        }\n        return JsonPatchError;\n    }(OriginalError);\n    jsonpatch.JsonPatchError = JsonPatchError;\n    jsonpatch.Error = JsonPatchError;\n    /**\n     * Recursively checks whether an object has any undefined values inside.\n     */\n    function hasUndefined(obj) {\n        if (obj === undefined) {\n            return true;\n        }\n        if (typeof obj == \"array\" || (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) == \"object\") {\n            for (var i in obj) {\n                if (hasUndefined(obj[i])) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n    /**\n     * Validates a single operation. Called from `jsonpatch.validate`. Throws `JsonPatchError` in case of an error.\n     * @param {object} operation - operation object (patch)\n     * @param {number} index - index of operation in the sequence\n     * @param {object} [tree] - object where the operation is supposed to be applied\n     * @param {string} [existingPathFragment] - comes along with `tree`\n     */\n    function validator(operation, index, tree, existingPathFragment) {\n        if ((typeof operation === 'undefined' ? 'undefined' : _typeof(operation)) !== 'object' || operation === null || _isArray(operation)) {\n            throw new JsonPatchError('Operation is not an object', 'OPERATION_NOT_AN_OBJECT', index, operation, tree);\n        } else if (!objOps[operation.op]) {\n            throw new JsonPatchError('Operation `op` property is not one of operations defined in RFC-6902', 'OPERATION_OP_INVALID', index, operation, tree);\n        } else if (typeof operation.path !== 'string') {\n            throw new JsonPatchError('Operation `path` property is not a string', 'OPERATION_PATH_INVALID', index, operation, tree);\n        } else if ((operation.op === 'move' || operation.op === 'copy') && typeof operation.from !== 'string') {\n            throw new JsonPatchError('Operation `from` property is not present (applicable in `move` and `copy` operations)', 'OPERATION_FROM_REQUIRED', index, operation, tree);\n        } else if ((operation.op === 'add' || operation.op === 'replace' || operation.op === 'test') && operation.value === undefined) {\n            throw new JsonPatchError('Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)', 'OPERATION_VALUE_REQUIRED', index, operation, tree);\n        } else if ((operation.op === 'add' || operation.op === 'replace' || operation.op === 'test') && hasUndefined(operation.value)) {\n            throw new JsonPatchError('Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)', 'OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED', index, operation, tree);\n        } else if (tree) {\n            if (operation.op == \"add\") {\n                var pathLen = operation.path.split(\"/\").length;\n                var existingPathLen = existingPathFragment.split(\"/\").length;\n                if (pathLen !== existingPathLen + 1 && pathLen !== existingPathLen) {\n                    throw new JsonPatchError('Cannot perform an `add` operation at the desired path', 'OPERATION_PATH_CANNOT_ADD', index, operation, tree);\n                }\n            } else if (operation.op === 'replace' || operation.op === 'remove' || operation.op === '_get') {\n                if (operation.path !== existingPathFragment) {\n                    throw new JsonPatchError('Cannot perform the operation at a path that does not exist', 'OPERATION_PATH_UNRESOLVABLE', index, operation, tree);\n                }\n            } else if (operation.op === 'move' || operation.op === 'copy') {\n                var existingValue = { op: \"_get\", path: operation.from, value: undefined };\n                var error = jsonpatch.validate([existingValue], tree);\n                if (error && error.name === 'OPERATION_PATH_UNRESOLVABLE') {\n                    throw new JsonPatchError('Cannot perform the operation from a path that does not exist', 'OPERATION_FROM_UNRESOLVABLE', index, operation, tree);\n                }\n            }\n        }\n    }\n    jsonpatch.validator = validator;\n    /**\n     * Validates a sequence of operations. If `tree` parameter is provided, the sequence is additionally validated against the object tree.\n     * If error is encountered, returns a JsonPatchError object\n     * @param sequence\n     * @param tree\n     * @returns {JsonPatchError|undefined}\n     */\n    function validate(sequence, tree) {\n        try {\n            if (!_isArray(sequence)) {\n                throw new JsonPatchError('Patch sequence must be an array', 'SEQUENCE_NOT_AN_ARRAY');\n            }\n            if (tree) {\n                tree = JSON.parse(JSON.stringify(tree)); //clone tree so that we can safely try applying operations\n                apply.call(this, tree, sequence, true);\n            } else {\n                for (var i = 0; i < sequence.length; i++) {\n                    this.validator(sequence[i], i);\n                }\n            }\n        } catch (e) {\n            if (e instanceof JsonPatchError) {\n                return e;\n            } else {\n                throw e;\n            }\n        }\n    }\n    jsonpatch.validate = validate;\n})(jsonpatch || (jsonpatch = {}));\nif (true) {\n    exports.apply = jsonpatch.apply;\n    exports.observe = jsonpatch.observe;\n    exports.unobserve = jsonpatch.unobserve;\n    exports.generate = jsonpatch.generate;\n    exports.compare = jsonpatch.compare;\n    exports.validate = jsonpatch.validate;\n    exports.validator = jsonpatch.validator;\n    exports.JsonPatchError = jsonpatch.JsonPatchError;\n    exports.Error = jsonpatch.Error;\n}\n\n/***/ }),\n/* 326 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\n__webpack_require__(96);\n\n__webpack_require__(111);\n\n__webpack_require__(112);\n\n__webpack_require__(116);\n\n__webpack_require__(117);\n\n__webpack_require__(119);\n\n__webpack_require__(122);\n\n__webpack_require__(123);\n\n__webpack_require__(124);\n\n__webpack_require__(125);\n\n__webpack_require__(126);\n\n__webpack_require__(127);\n\n__webpack_require__(128);\n\n__webpack_require__(129);\n\n__webpack_require__(130);\n\n__webpack_require__(131);\n\n__webpack_require__(132);\n\n__webpack_require__(133);\n\n__webpack_require__(134);\n\n__webpack_require__(135);\n\n__webpack_require__(136);\n\n__webpack_require__(137);\n\n__webpack_require__(138);\n\n__webpack_require__(139);\n\n__webpack_require__(141);\n\n__webpack_require__(143);\n\n__webpack_require__(144);\n\n__webpack_require__(145);\n\n__webpack_require__(146);\n\n__webpack_require__(147);\n\n__webpack_require__(148);\n\n__webpack_require__(149);\n\n__webpack_require__(150);\n\n__webpack_require__(151);\n\n__webpack_require__(152);\n\n__webpack_require__(153);\n\n__webpack_require__(154);\n\n__webpack_require__(155);\n\n__webpack_require__(85);\n\n__webpack_require__(156);\n\n__webpack_require__(157);\n\n__webpack_require__(159);\n\n__webpack_require__(160);\n\n__webpack_require__(161);\n\n__webpack_require__(162);\n\n__webpack_require__(163);\n\n__webpack_require__(164);\n\n__webpack_require__(165);\n\n__webpack_require__(167);\n\n__webpack_require__(168);\n\n__webpack_require__(169);\n\n__webpack_require__(172);\n\n__webpack_require__(173);\n\n__webpack_require__(174);\n\n__webpack_require__(345);\n\n__webpack_require__(346);\n\n__webpack_require__(347);\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar _cellTypes = __webpack_require__(87);\n\nvar _core = __webpack_require__(88);\n\nvar _core2 = _interopRequireDefault(_core);\n\nvar _jquery = __webpack_require__(404);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _ghostTable = __webpack_require__(92);\n\nvar _ghostTable2 = _interopRequireDefault(_ghostTable);\n\nvar _array = __webpack_require__(1);\n\nvar arrayHelpers = _interopRequireWildcard(_array);\n\nvar _browser = __webpack_require__(27);\n\nvar browserHelpers = _interopRequireWildcard(_browser);\n\nvar _data = __webpack_require__(90);\n\nvar dataHelpers = _interopRequireWildcard(_data);\n\nvar _date = __webpack_require__(310);\n\nvar dateHelpers = _interopRequireWildcard(_date);\n\nvar _feature = __webpack_require__(40);\n\nvar featureHelpers = _interopRequireWildcard(_feature);\n\nvar _function = __webpack_require__(43);\n\nvar functionHelpers = _interopRequireWildcard(_function);\n\nvar _mixed = __webpack_require__(16);\n\nvar mixedHelpers = _interopRequireWildcard(_mixed);\n\nvar _number = __webpack_require__(5);\n\nvar numberHelpers = _interopRequireWildcard(_number);\n\nvar _object = __webpack_require__(2);\n\nvar objectHelpers = _interopRequireWildcard(_object);\n\nvar _setting = __webpack_require__(89);\n\nvar settingHelpers = _interopRequireWildcard(_setting);\n\nvar _string = __webpack_require__(36);\n\nvar stringHelpers = _interopRequireWildcard(_string);\n\nvar _unicode = __webpack_require__(21);\n\nvar unicodeHelpers = _interopRequireWildcard(_unicode);\n\nvar _element = __webpack_require__(0);\n\nvar domHelpers = _interopRequireWildcard(_element);\n\nvar _event = __webpack_require__(12);\n\nvar domEventHelpers = _interopRequireWildcard(_event);\n\nvar _index = __webpack_require__(405);\n\nvar plugins = _interopRequireWildcard(_index);\n\nvar _plugins = __webpack_require__(8);\n\nvar _defaultSettings = __webpack_require__(315);\n\nvar _defaultSettings2 = _interopRequireDefault(_defaultSettings);\n\nvar _rootInstance = __webpack_require__(314);\n\nvar _i18n = __webpack_require__(316);\n\nvar _constants = __webpack_require__(7);\n\nvar constants = _interopRequireWildcard(_constants);\n\nvar _dictionariesManager = __webpack_require__(71);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Handsontable(rootElement, userSettings) {\n  var instance = new _core2.default(rootElement, userSettings || {}, _rootInstance.rootInstanceSymbol);\n\n  instance.init();\n\n  return instance;\n}\n\n(0, _jquery2.default)(Handsontable);\n\nHandsontable.Core = _core2.default;\nHandsontable.DefaultSettings = _defaultSettings2.default;\nHandsontable.EventManager = _eventManager2.default;\nHandsontable._getListenersCounter = _eventManager.getListenersCounter; // For MemoryLeak tests\n\nHandsontable.buildDate = '10/04/2018 11:38:33';\nHandsontable.packageName = 'handsontable';\nHandsontable.version = '2.0.0';\n\nvar baseVersion = '';\n\nif (baseVersion) {\n  Handsontable.baseVersion = baseVersion;\n}\n\n// Export Hooks singleton\nHandsontable.hooks = _pluginHooks2.default.getSingleton();\n\n// TODO: Remove this exports after rewrite tests about this module\nHandsontable.__GhostTable = _ghostTable2.default;\n//\n\n// Export all helpers to the Handsontable object\nvar HELPERS = [arrayHelpers, browserHelpers, dataHelpers, dateHelpers, featureHelpers, functionHelpers, mixedHelpers, numberHelpers, objectHelpers, settingHelpers, stringHelpers, unicodeHelpers];\nvar DOM = [domHelpers, domEventHelpers];\n\nHandsontable.helper = {};\nHandsontable.dom = {};\n\n// Fill general helpers.\narrayHelpers.arrayEach(HELPERS, function (helper) {\n  arrayHelpers.arrayEach(Object.getOwnPropertyNames(helper), function (key) {\n    if (key.charAt(0) !== '_') {\n      Handsontable.helper[key] = helper[key];\n    }\n  });\n});\n\n// Fill DOM helpers.\narrayHelpers.arrayEach(DOM, function (helper) {\n  arrayHelpers.arrayEach(Object.getOwnPropertyNames(helper), function (key) {\n    if (key.charAt(0) !== '_') {\n      Handsontable.dom[key] = helper[key];\n    }\n  });\n});\n\n// Export cell types.\nHandsontable.cellTypes = {};\n\narrayHelpers.arrayEach((0, _cellTypes.getRegisteredCellTypeNames)(), function (cellTypeName) {\n  Handsontable.cellTypes[cellTypeName] = (0, _cellTypes.getCellType)(cellTypeName);\n});\n\nHandsontable.cellTypes.registerCellType = _cellTypes.registerCellType;\nHandsontable.cellTypes.getCellType = _cellTypes.getCellType;\n\n// Export all registered editors from the Handsontable.\nHandsontable.editors = {};\n\narrayHelpers.arrayEach((0, _editors.getRegisteredEditorNames)(), function (editorName) {\n  Handsontable.editors[stringHelpers.toUpperCaseFirst(editorName) + 'Editor'] = (0, _editors.getEditor)(editorName);\n});\n\nHandsontable.editors.registerEditor = _editors.registerEditor;\nHandsontable.editors.getEditor = _editors.getEditor;\n\n// Export all registered renderers from the Handsontable.\nHandsontable.renderers = {};\n\narrayHelpers.arrayEach((0, _renderers.getRegisteredRendererNames)(), function (rendererName) {\n  var renderer = (0, _renderers.getRenderer)(rendererName);\n\n  if (rendererName === 'base') {\n    Handsontable.renderers.cellDecorator = renderer;\n  }\n  Handsontable.renderers[stringHelpers.toUpperCaseFirst(rendererName) + 'Renderer'] = renderer;\n});\n\nHandsontable.renderers.registerRenderer = _renderers.registerRenderer;\nHandsontable.renderers.getRenderer = _renderers.getRenderer;\n\n// Export all registered validators from the Handsontable.\nHandsontable.validators = {};\n\narrayHelpers.arrayEach((0, _validators.getRegisteredValidatorNames)(), function (validatorName) {\n  Handsontable.validators[stringHelpers.toUpperCaseFirst(validatorName) + 'Validator'] = (0, _validators.getValidator)(validatorName);\n});\n\nHandsontable.validators.registerValidator = _validators.registerValidator;\nHandsontable.validators.getValidator = _validators.getValidator;\n\n// Export all registered plugins from the Handsontable.\nHandsontable.plugins = {};\n\narrayHelpers.arrayEach(Object.getOwnPropertyNames(plugins), function (pluginName) {\n  var plugin = plugins[pluginName];\n\n  if (pluginName === 'Base') {\n    Handsontable.plugins[pluginName + 'Plugin'] = plugin;\n  } else {\n    Handsontable.plugins[pluginName] = plugin;\n  }\n});\n\nHandsontable.plugins.registerPlugin = _plugins.registerPlugin;\n\nHandsontable.languages = {};\nHandsontable.languages.dictionaryKeys = constants;\nHandsontable.languages.getLanguageDictionary = _dictionariesManager.getLanguageDictionary;\nHandsontable.languages.getLanguagesDictionaries = _dictionariesManager.getLanguagesDictionaries;\nHandsontable.languages.registerLanguageDictionary = _dictionariesManager.registerLanguageDictionary;\n\n// Alias to `getTranslatedPhrase` function, for more information check it API.\nHandsontable.languages.getTranslatedPhrase = function () {\n  return _i18n.getTranslatedPhrase.apply(undefined, arguments);\n};\n\nexports.default = Handsontable;\n\n/***/ }),\n/* 327 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(20);\nvar anObject = __webpack_require__(18);\nvar getKeys = __webpack_require__(37);\n\nmodule.exports = __webpack_require__(22) ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var keys = getKeys(Properties);\n  var length = keys.length;\n  var i = 0;\n  var P;\n  while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n  return O;\n};\n\n\n/***/ }),\n/* 328 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar create = __webpack_require__(74);\nvar descriptor = __webpack_require__(50);\nvar setToStringTag = __webpack_require__(52);\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__webpack_require__(31)(IteratorPrototype, __webpack_require__(11)('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n\n/***/ }),\n/* 329 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nvar setPrototypeOf = __webpack_require__(110).set;\nmodule.exports = function (that, target, C) {\n  var S = target.constructor;\n  var P;\n  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n    setPrototypeOf(that, P);\n  } return that;\n};\n\n\n/***/ }),\n/* 330 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = __webpack_require__(331);\n\nmodule.exports = function (original, length) {\n  return new (speciesConstructor(original))(length);\n};\n\n\n/***/ }),\n/* 331 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nvar isArray = __webpack_require__(113);\nvar SPECIES = __webpack_require__(11)('species');\n\nmodule.exports = function (original) {\n  var C;\n  if (isArray(original)) {\n    C = original.constructor;\n    // cross-realm fallback\n    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n    if (isObject(C)) {\n      C = C[SPECIES];\n      if (C === null) C = undefined;\n    }\n  } return C === undefined ? Array : C;\n};\n\n\n/***/ }),\n/* 332 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = __webpack_require__(18);\nvar aFunction = __webpack_require__(62);\nvar SPECIES = __webpack_require__(11)('species');\nmodule.exports = function (O, D) {\n  var C = anObject(O).constructor;\n  var S;\n  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n\n\n/***/ }),\n/* 333 */\n/***/ (function(module, exports) {\n\n// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n  var un = that === undefined;\n  switch (args.length) {\n    case 0: return un ? fn()\n                      : fn.call(that);\n    case 1: return un ? fn(args[0])\n                      : fn.call(that, args[0]);\n    case 2: return un ? fn(args[0], args[1])\n                      : fn.call(that, args[0], args[1]);\n    case 3: return un ? fn(args[0], args[1], args[2])\n                      : fn.call(that, args[0], args[1], args[2]);\n    case 4: return un ? fn(args[0], args[1], args[2], args[3])\n                      : fn.call(that, args[0], args[1], args[2], args[3]);\n  } return fn.apply(that, args);\n};\n\n\n/***/ }),\n/* 334 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar macrotask = __webpack_require__(80).set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = __webpack_require__(44)(process) == 'process';\n\nmodule.exports = function () {\n  var head, last, notify;\n\n  var flush = function () {\n    var parent, fn;\n    if (isNode && (parent = process.domain)) parent.exit();\n    while (head) {\n      fn = head.fn;\n      head = head.next;\n      try {\n        fn();\n      } catch (e) {\n        if (head) notify();\n        else last = undefined;\n        throw e;\n      }\n    } last = undefined;\n    if (parent) parent.enter();\n  };\n\n  // Node.js\n  if (isNode) {\n    notify = function () {\n      process.nextTick(flush);\n    };\n  // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n  } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n    var toggle = true;\n    var node = document.createTextNode('');\n    new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n    notify = function () {\n      node.data = toggle = !toggle;\n    };\n  // environments with maybe non-completely correct, but existent Promise\n  } else if (Promise && Promise.resolve) {\n    var promise = Promise.resolve();\n    notify = function () {\n      promise.then(flush);\n    };\n  // for other environments - macrotask based on:\n  // - setImmediate\n  // - MessageChannel\n  // - window.postMessag\n  // - onreadystatechange\n  // - setTimeout\n  } else {\n    notify = function () {\n      // strange IE + webpack dev server bug - use .call(global)\n      macrotask.call(global, flush);\n    };\n  }\n\n  return function (fn) {\n    var task = { fn: fn, next: undefined };\n    if (last) last.next = task;\n    if (!head) {\n      head = task;\n      notify();\n    } last = task;\n  };\n};\n\n\n/***/ }),\n/* 335 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (exec) {\n  try {\n    return { e: false, v: exec() };\n  } catch (e) {\n    return { e: true, v: e };\n  }\n};\n\n\n/***/ }),\n/* 336 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(18);\nvar isObject = __webpack_require__(9);\nvar newPromiseCapability = __webpack_require__(118);\n\nmodule.exports = function (C, x) {\n  anObject(C);\n  if (isObject(x) && x.constructor === C) return x;\n  var promiseCapability = newPromiseCapability.f(C);\n  var resolve = promiseCapability.resolve;\n  resolve(x);\n  return promiseCapability.promise;\n};\n\n\n/***/ }),\n/* 337 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar core = __webpack_require__(45);\nvar LIBRARY = __webpack_require__(65);\nvar wksExt = __webpack_require__(120);\nvar defineProperty = __webpack_require__(20).f;\nmodule.exports = function (name) {\n  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n\n\n/***/ }),\n/* 338 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// all enumerable object keys, includes symbols\nvar getKeys = __webpack_require__(37);\nvar gOPS = __webpack_require__(69);\nvar pIE = __webpack_require__(53);\nmodule.exports = function (it) {\n  var result = getKeys(it);\n  var getSymbols = gOPS.f;\n  if (getSymbols) {\n    var symbols = getSymbols(it);\n    var isEnum = pIE.f;\n    var i = 0;\n    var key;\n    while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n  } return result;\n};\n\n\n/***/ }),\n/* 339 */\n/***/ (function(module, exports) {\n\n// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n  // eslint-disable-next-line no-self-compare\n  return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n\n\n/***/ }),\n/* 340 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(59);\nvar defined = __webpack_require__(38);\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n  return function (that, pos) {\n    var s = String(defined(that));\n    var i = toInteger(pos);\n    var l = s.length;\n    var a, b;\n    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n      ? TO_STRING ? s.charAt(i) : a\n      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n\n\n/***/ }),\n/* 341 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = __webpack_require__(18);\nmodule.exports = function () {\n  var that = anObject(this);\n  var result = '';\n  if (that.global) result += 'g';\n  if (that.ignoreCase) result += 'i';\n  if (that.multiline) result += 'm';\n  if (that.unicode) result += 'u';\n  if (that.sticky) result += 'y';\n  return result;\n};\n\n\n/***/ }),\n/* 342 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n\nvar toObject = __webpack_require__(33);\nvar toAbsoluteIndex = __webpack_require__(60);\nvar toLength = __webpack_require__(25);\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n  var O = toObject(this);\n  var len = toLength(O.length);\n  var to = toAbsoluteIndex(target, len);\n  var from = toAbsoluteIndex(start, len);\n  var end = arguments.length > 2 ? arguments[2] : undefined;\n  var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n  var inc = 1;\n  if (from < to && to < from + count) {\n    inc = -1;\n    from += count - 1;\n    to += count - 1;\n  }\n  while (count-- > 0) {\n    if (from in O) O[to] = O[from];\n    else delete O[to];\n    to += inc;\n    from += inc;\n  } return O;\n};\n\n\n/***/ }),\n/* 343 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n\nvar toObject = __webpack_require__(33);\nvar toAbsoluteIndex = __webpack_require__(60);\nvar toLength = __webpack_require__(25);\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n  var O = toObject(this);\n  var length = toLength(O.length);\n  var aLen = arguments.length;\n  var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n  var end = aLen > 2 ? arguments[2] : undefined;\n  var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n  while (endPos > index) O[index++] = value;\n  return O;\n};\n\n\n/***/ }),\n/* 344 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// all object keys, includes non-enumerable and symbols\nvar gOPN = __webpack_require__(81);\nvar gOPS = __webpack_require__(69);\nvar anObject = __webpack_require__(18);\nvar Reflect = __webpack_require__(14).Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n  var keys = gOPN.f(anObject(it));\n  var getSymbols = gOPS.f;\n  return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n\n\n/***/ }),\n/* 345 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 346 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 347 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 348 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * A overlay that renders ALL available rows & columns positioned on top of the original Walkontable instance and all other overlays.\n * Used for debugging purposes to see if the other overlays (that render only part of the rows & columns) are positioned correctly\n *\n * @class DebugOverlay\n */\nvar DebugOverlay = function (_Overlay) {\n  _inherits(DebugOverlay, _Overlay);\n\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function DebugOverlay(wotInstance) {\n    _classCallCheck(this, DebugOverlay);\n\n    var _this = _possibleConstructorReturn(this, (DebugOverlay.__proto__ || Object.getPrototypeOf(DebugOverlay)).call(this, wotInstance));\n\n    _this.clone = _this.makeClone(_base2.default.CLONE_DEBUG);\n    _this.clone.wtTable.holder.style.opacity = 0.4;\n    _this.clone.wtTable.holder.style.textShadow = '0 0 2px #ff0000';\n\n    (0, _element.addClass)(_this.clone.wtTable.holder.parentNode, 'wtDebugVisible');\n    return _this;\n  }\n\n  return DebugOverlay;\n}(_base2.default);\n\n_base2.default.registerOverlay(_base2.default.CLONE_DEBUG, DebugOverlay);\n\nexports.default = DebugOverlay;\n\n/***/ }),\n/* 349 */\n/***/ (function(module, exports) {\n\nmodule.exports = function(module) {\n\tif(!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif(!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n\n\n/***/ }),\n/* 350 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar map = {\n\t\"./af\": 180,\n\t\"./af.js\": 180,\n\t\"./ar\": 181,\n\t\"./ar-dz\": 182,\n\t\"./ar-dz.js\": 182,\n\t\"./ar-kw\": 183,\n\t\"./ar-kw.js\": 183,\n\t\"./ar-ly\": 184,\n\t\"./ar-ly.js\": 184,\n\t\"./ar-ma\": 185,\n\t\"./ar-ma.js\": 185,\n\t\"./ar-sa\": 186,\n\t\"./ar-sa.js\": 186,\n\t\"./ar-tn\": 187,\n\t\"./ar-tn.js\": 187,\n\t\"./ar.js\": 181,\n\t\"./az\": 188,\n\t\"./az.js\": 188,\n\t\"./be\": 189,\n\t\"./be.js\": 189,\n\t\"./bg\": 190,\n\t\"./bg.js\": 190,\n\t\"./bm\": 191,\n\t\"./bm.js\": 191,\n\t\"./bn\": 192,\n\t\"./bn.js\": 192,\n\t\"./bo\": 193,\n\t\"./bo.js\": 193,\n\t\"./br\": 194,\n\t\"./br.js\": 194,\n\t\"./bs\": 195,\n\t\"./bs.js\": 195,\n\t\"./ca\": 196,\n\t\"./ca.js\": 196,\n\t\"./cs\": 197,\n\t\"./cs.js\": 197,\n\t\"./cv\": 198,\n\t\"./cv.js\": 198,\n\t\"./cy\": 199,\n\t\"./cy.js\": 199,\n\t\"./da\": 200,\n\t\"./da.js\": 200,\n\t\"./de\": 201,\n\t\"./de-at\": 202,\n\t\"./de-at.js\": 202,\n\t\"./de-ch\": 203,\n\t\"./de-ch.js\": 203,\n\t\"./de.js\": 201,\n\t\"./dv\": 204,\n\t\"./dv.js\": 204,\n\t\"./el\": 205,\n\t\"./el.js\": 205,\n\t\"./en-au\": 206,\n\t\"./en-au.js\": 206,\n\t\"./en-ca\": 207,\n\t\"./en-ca.js\": 207,\n\t\"./en-gb\": 208,\n\t\"./en-gb.js\": 208,\n\t\"./en-ie\": 209,\n\t\"./en-ie.js\": 209,\n\t\"./en-nz\": 210,\n\t\"./en-nz.js\": 210,\n\t\"./eo\": 211,\n\t\"./eo.js\": 211,\n\t\"./es\": 212,\n\t\"./es-do\": 213,\n\t\"./es-do.js\": 213,\n\t\"./es-us\": 214,\n\t\"./es-us.js\": 214,\n\t\"./es.js\": 212,\n\t\"./et\": 215,\n\t\"./et.js\": 215,\n\t\"./eu\": 216,\n\t\"./eu.js\": 216,\n\t\"./fa\": 217,\n\t\"./fa.js\": 217,\n\t\"./fi\": 218,\n\t\"./fi.js\": 218,\n\t\"./fo\": 219,\n\t\"./fo.js\": 219,\n\t\"./fr\": 220,\n\t\"./fr-ca\": 221,\n\t\"./fr-ca.js\": 221,\n\t\"./fr-ch\": 222,\n\t\"./fr-ch.js\": 222,\n\t\"./fr.js\": 220,\n\t\"./fy\": 223,\n\t\"./fy.js\": 223,\n\t\"./gd\": 224,\n\t\"./gd.js\": 224,\n\t\"./gl\": 225,\n\t\"./gl.js\": 225,\n\t\"./gom-latn\": 226,\n\t\"./gom-latn.js\": 226,\n\t\"./gu\": 227,\n\t\"./gu.js\": 227,\n\t\"./he\": 228,\n\t\"./he.js\": 228,\n\t\"./hi\": 229,\n\t\"./hi.js\": 229,\n\t\"./hr\": 230,\n\t\"./hr.js\": 230,\n\t\"./hu\": 231,\n\t\"./hu.js\": 231,\n\t\"./hy-am\": 232,\n\t\"./hy-am.js\": 232,\n\t\"./id\": 233,\n\t\"./id.js\": 233,\n\t\"./is\": 234,\n\t\"./is.js\": 234,\n\t\"./it\": 235,\n\t\"./it.js\": 235,\n\t\"./ja\": 236,\n\t\"./ja.js\": 236,\n\t\"./jv\": 237,\n\t\"./jv.js\": 237,\n\t\"./ka\": 238,\n\t\"./ka.js\": 238,\n\t\"./kk\": 239,\n\t\"./kk.js\": 239,\n\t\"./km\": 240,\n\t\"./km.js\": 240,\n\t\"./kn\": 241,\n\t\"./kn.js\": 241,\n\t\"./ko\": 242,\n\t\"./ko.js\": 242,\n\t\"./ky\": 243,\n\t\"./ky.js\": 243,\n\t\"./lb\": 244,\n\t\"./lb.js\": 244,\n\t\"./lo\": 245,\n\t\"./lo.js\": 245,\n\t\"./lt\": 246,\n\t\"./lt.js\": 246,\n\t\"./lv\": 247,\n\t\"./lv.js\": 247,\n\t\"./me\": 248,\n\t\"./me.js\": 248,\n\t\"./mi\": 249,\n\t\"./mi.js\": 249,\n\t\"./mk\": 250,\n\t\"./mk.js\": 250,\n\t\"./ml\": 251,\n\t\"./ml.js\": 251,\n\t\"./mr\": 252,\n\t\"./mr.js\": 252,\n\t\"./ms\": 253,\n\t\"./ms-my\": 254,\n\t\"./ms-my.js\": 254,\n\t\"./ms.js\": 253,\n\t\"./mt\": 255,\n\t\"./mt.js\": 255,\n\t\"./my\": 256,\n\t\"./my.js\": 256,\n\t\"./nb\": 257,\n\t\"./nb.js\": 257,\n\t\"./ne\": 258,\n\t\"./ne.js\": 258,\n\t\"./nl\": 259,\n\t\"./nl-be\": 260,\n\t\"./nl-be.js\": 260,\n\t\"./nl.js\": 259,\n\t\"./nn\": 261,\n\t\"./nn.js\": 261,\n\t\"./pa-in\": 262,\n\t\"./pa-in.js\": 262,\n\t\"./pl\": 263,\n\t\"./pl.js\": 263,\n\t\"./pt\": 264,\n\t\"./pt-br\": 265,\n\t\"./pt-br.js\": 265,\n\t\"./pt.js\": 264,\n\t\"./ro\": 266,\n\t\"./ro.js\": 266,\n\t\"./ru\": 267,\n\t\"./ru.js\": 267,\n\t\"./sd\": 268,\n\t\"./sd.js\": 268,\n\t\"./se\": 269,\n\t\"./se.js\": 269,\n\t\"./si\": 270,\n\t\"./si.js\": 270,\n\t\"./sk\": 271,\n\t\"./sk.js\": 271,\n\t\"./sl\": 272,\n\t\"./sl.js\": 272,\n\t\"./sq\": 273,\n\t\"./sq.js\": 273,\n\t\"./sr\": 274,\n\t\"./sr-cyrl\": 275,\n\t\"./sr-cyrl.js\": 275,\n\t\"./sr.js\": 274,\n\t\"./ss\": 276,\n\t\"./ss.js\": 276,\n\t\"./sv\": 277,\n\t\"./sv.js\": 277,\n\t\"./sw\": 278,\n\t\"./sw.js\": 278,\n\t\"./ta\": 279,\n\t\"./ta.js\": 279,\n\t\"./te\": 280,\n\t\"./te.js\": 280,\n\t\"./tet\": 281,\n\t\"./tet.js\": 281,\n\t\"./th\": 282,\n\t\"./th.js\": 282,\n\t\"./tl-ph\": 283,\n\t\"./tl-ph.js\": 283,\n\t\"./tlh\": 284,\n\t\"./tlh.js\": 284,\n\t\"./tr\": 285,\n\t\"./tr.js\": 285,\n\t\"./tzl\": 286,\n\t\"./tzl.js\": 286,\n\t\"./tzm\": 287,\n\t\"./tzm-latn\": 288,\n\t\"./tzm-latn.js\": 288,\n\t\"./tzm.js\": 287,\n\t\"./uk\": 289,\n\t\"./uk.js\": 289,\n\t\"./ur\": 290,\n\t\"./ur.js\": 290,\n\t\"./uz\": 291,\n\t\"./uz-latn\": 292,\n\t\"./uz-latn.js\": 292,\n\t\"./uz.js\": 291,\n\t\"./vi\": 293,\n\t\"./vi.js\": 293,\n\t\"./x-pseudo\": 294,\n\t\"./x-pseudo.js\": 294,\n\t\"./yo\": 295,\n\t\"./yo.js\": 295,\n\t\"./zh-cn\": 296,\n\t\"./zh-cn.js\": 296,\n\t\"./zh-hk\": 297,\n\t\"./zh-hk.js\": 297,\n\t\"./zh-tw\": 298,\n\t\"./zh-tw.js\": 298\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 350;\n\n/***/ }),\n/* 351 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @class LeftOverlay\n */\nvar LeftOverlay = function (_Overlay) {\n  _inherits(LeftOverlay, _Overlay);\n\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function LeftOverlay(wotInstance) {\n    _classCallCheck(this, LeftOverlay);\n\n    var _this = _possibleConstructorReturn(this, (LeftOverlay.__proto__ || Object.getPrototypeOf(LeftOverlay)).call(this, wotInstance));\n\n    _this.clone = _this.makeClone(_base2.default.CLONE_LEFT);\n    return _this;\n  }\n\n  /**\n   * Checks if overlay should be fully rendered\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(LeftOverlay, [{\n    key: 'shouldBeRendered',\n    value: function shouldBeRendered() {\n      return !!(this.wot.getSetting('fixedColumnsLeft') || this.wot.getSetting('rowHeaders').length);\n    }\n\n    /**\n     * Updates the left overlay position\n     */\n\n  }, {\n    key: 'resetFixedPosition',\n    value: function resetFixedPosition() {\n      if (!this.needFullRender || !this.wot.wtTable.holder.parentNode) {\n        // removed from DOM\n        return;\n      }\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var headerPosition = 0;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (this.trimmingContainer === window && (!preventOverflow || preventOverflow !== 'horizontal')) {\n        var box = this.wot.wtTable.hider.getBoundingClientRect();\n        var left = Math.ceil(box.left);\n        var right = Math.ceil(box.right);\n        var finalLeft = void 0;\n        var finalTop = void 0;\n\n        finalTop = this.wot.wtTable.hider.style.top;\n        finalTop = finalTop === '' ? 0 : finalTop;\n\n        if (left < 0 && right - overlayRoot.offsetWidth > 0) {\n          finalLeft = -left;\n        } else {\n          finalLeft = 0;\n        }\n        headerPosition = finalLeft;\n        finalLeft += 'px';\n\n        (0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop);\n      } else {\n        headerPosition = this.getScrollPosition();\n        (0, _element.resetCssTransform)(overlayRoot);\n      }\n      this.adjustHeaderBordersPosition(headerPosition);\n\n      this.adjustElementsSize();\n    }\n\n    /**\n     * Sets the main overlay's horizontal scroll position\n     *\n     * @param {Number} pos\n     */\n\n  }, {\n    key: 'setScrollPosition',\n    value: function setScrollPosition(pos) {\n      if (this.mainTableScrollableElement === window) {\n        window.scrollTo(pos, (0, _element.getWindowScrollTop)());\n      } else {\n        this.mainTableScrollableElement.scrollLeft = pos;\n      }\n    }\n\n    /**\n     * Triggers onScroll hook callback\n     */\n\n  }, {\n    key: 'onScroll',\n    value: function onScroll() {\n      this.wot.getSetting('onScrollVertically');\n    }\n\n    /**\n     * Calculates total sum cells width\n     *\n     * @param {Number} from Column index which calculates started from\n     * @param {Number} to Column index where calculation is finished\n     * @returns {Number} Width sum\n     */\n\n  }, {\n    key: 'sumCellSizes',\n    value: function sumCellSizes(from, to) {\n      var sum = 0;\n      var defaultColumnWidth = this.wot.wtSettings.defaultColumnWidth;\n\n      while (from < to) {\n        sum += this.wot.wtTable.getStretchedColumnWidth(from) || defaultColumnWidth;\n        from++;\n      }\n\n      return sum;\n    }\n\n    /**\n     * Adjust overlay root element, childs and master table element sizes (width, height).\n     *\n     * @param {Boolean} [force=false]\n     */\n\n  }, {\n    key: 'adjustElementsSize',\n    value: function adjustElementsSize() {\n      var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      this.updateTrimmingContainer();\n\n      if (this.needFullRender || force) {\n        this.adjustRootElementSize();\n        this.adjustRootChildrenSize();\n\n        if (!force) {\n          this.areElementSizesAdjusted = true;\n        }\n      }\n    }\n\n    /**\n     * Adjust overlay root element size (width and height).\n     */\n\n  }, {\n    key: 'adjustRootElementSize',\n    value: function adjustRootElementSize() {\n      var masterHolder = this.wot.wtTable.holder;\n      var scrollbarHeight = masterHolder.clientHeight === masterHolder.offsetHeight ? 0 : (0, _element.getScrollbarWidth)();\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var overlayRootStyle = overlayRoot.style;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n      var tableWidth = void 0;\n\n      if (this.trimmingContainer !== window || preventOverflow === 'vertical') {\n        var height = this.wot.wtViewport.getWorkspaceHeight() - scrollbarHeight;\n\n        height = Math.min(height, (0, _element.innerHeight)(this.wot.wtTable.wtRootElement));\n\n        overlayRootStyle.height = height + 'px';\n      } else {\n        overlayRootStyle.height = '';\n      }\n\n      this.clone.wtTable.holder.style.height = overlayRootStyle.height;\n\n      tableWidth = (0, _element.outerWidth)(this.clone.wtTable.TABLE);\n      overlayRootStyle.width = (tableWidth === 0 ? tableWidth : tableWidth + 4) + 'px';\n    }\n\n    /**\n     * Adjust overlay root childs size\n     */\n\n  }, {\n    key: 'adjustRootChildrenSize',\n    value: function adjustRootChildrenSize() {\n      var scrollbarWidth = (0, _element.getScrollbarWidth)();\n\n      this.clone.wtTable.hider.style.height = this.hider.style.height;\n      this.clone.wtTable.holder.style.height = this.clone.wtTable.holder.parentNode.style.height;\n\n      if (scrollbarWidth === 0) {\n        scrollbarWidth = 30;\n      }\n      this.clone.wtTable.holder.style.width = parseInt(this.clone.wtTable.holder.parentNode.style.width, 10) + scrollbarWidth + 'px';\n    }\n\n    /**\n     * Adjust the overlay dimensions and position\n     */\n\n  }, {\n    key: 'applyToDOM',\n    value: function applyToDOM() {\n      var total = this.wot.getSetting('totalColumns');\n\n      if (!this.areElementSizesAdjusted) {\n        this.adjustElementsSize();\n      }\n      if (typeof this.wot.wtViewport.columnsRenderCalculator.startPosition === 'number') {\n        this.spreader.style.left = this.wot.wtViewport.columnsRenderCalculator.startPosition + 'px';\n      } else if (total === 0) {\n        this.spreader.style.left = '0';\n      } else {\n        throw new Error('Incorrect value of the columnsRenderCalculator');\n      }\n      this.spreader.style.right = '';\n\n      if (this.needFullRender) {\n        this.syncOverlayOffset();\n      }\n    }\n\n    /**\n     * Synchronize calculated top position to an element\n     */\n\n  }, {\n    key: 'syncOverlayOffset',\n    value: function syncOverlayOffset() {\n      if (typeof this.wot.wtViewport.rowsRenderCalculator.startPosition === 'number') {\n        this.clone.wtTable.spreader.style.top = this.wot.wtViewport.rowsRenderCalculator.startPosition + 'px';\n      } else {\n        this.clone.wtTable.spreader.style.top = '';\n      }\n    }\n\n    /**\n     * Scrolls horizontally to a column at the left edge of the viewport\n     *\n     * @param sourceCol {Number} Column index which you want to scroll to\n     * @param [beyondRendered=false] {Boolean} if `true`, scrolls according to the bottom edge (top edge is by default)\n     */\n\n  }, {\n    key: 'scrollTo',\n    value: function scrollTo(sourceCol, beyondRendered) {\n      var newX = this.getTableParentOffset();\n      var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot;\n      var mainHolder = sourceInstance.wtTable.holder;\n      var scrollbarCompensation = 0;\n\n      if (beyondRendered && mainHolder.offsetWidth !== mainHolder.clientWidth) {\n        scrollbarCompensation = (0, _element.getScrollbarWidth)();\n      }\n      if (beyondRendered) {\n        newX += this.sumCellSizes(0, sourceCol + 1);\n        newX -= this.wot.wtViewport.getViewportWidth();\n      } else {\n        newX += this.sumCellSizes(this.wot.getSetting('fixedColumnsLeft'), sourceCol);\n      }\n      newX += scrollbarCompensation;\n\n      this.setScrollPosition(newX);\n    }\n\n    /**\n     * Gets table parent left position\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getTableParentOffset',\n    value: function getTableParentOffset() {\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n      var offset = 0;\n\n      if (!preventOverflow && this.trimmingContainer === window) {\n        offset = this.wot.wtTable.holderOffset.left;\n      }\n\n      return offset;\n    }\n\n    /**\n     * Gets the main overlay's horizontal scroll position\n     *\n     * @returns {Number} Main table's vertical scroll position\n     */\n\n  }, {\n    key: 'getScrollPosition',\n    value: function getScrollPosition() {\n      return (0, _element.getScrollLeft)(this.mainTableScrollableElement);\n    }\n\n    /**\n     * Adds css classes to hide the header border's header (cell-selection border hiding issue)\n     *\n     * @param {Number} position Header X position if trimming container is window or scroll top if not\n     */\n\n  }, {\n    key: 'adjustHeaderBordersPosition',\n    value: function adjustHeaderBordersPosition(position) {\n      var masterParent = this.wot.wtTable.holder.parentNode;\n      var rowHeaders = this.wot.getSetting('rowHeaders');\n      var fixedColumnsLeft = this.wot.getSetting('fixedColumnsLeft');\n      var totalRows = this.wot.getSetting('totalRows');\n\n      if (totalRows) {\n        (0, _element.removeClass)(masterParent, 'emptyRows');\n      } else {\n        (0, _element.addClass)(masterParent, 'emptyRows');\n      }\n\n      if (fixedColumnsLeft && !rowHeaders.length) {\n        (0, _element.addClass)(masterParent, 'innerBorderLeft');\n      } else if (!fixedColumnsLeft && rowHeaders.length) {\n        var previousState = (0, _element.hasClass)(masterParent, 'innerBorderLeft');\n\n        if (position) {\n          (0, _element.addClass)(masterParent, 'innerBorderLeft');\n        } else {\n          (0, _element.removeClass)(masterParent, 'innerBorderLeft');\n        }\n        if (!previousState && position || previousState && !position) {\n          this.wot.wtOverlays.adjustElementsSize();\n        }\n      }\n    }\n  }]);\n\n  return LeftOverlay;\n}(_base2.default);\n\n_base2.default.registerOverlay(_base2.default.CLONE_LEFT, LeftOverlay);\n\nexports.default = LeftOverlay;\n\n/***/ }),\n/* 352 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @class TopOverlay\n */\nvar TopOverlay = function (_Overlay) {\n  _inherits(TopOverlay, _Overlay);\n\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function TopOverlay(wotInstance) {\n    _classCallCheck(this, TopOverlay);\n\n    var _this = _possibleConstructorReturn(this, (TopOverlay.__proto__ || Object.getPrototypeOf(TopOverlay)).call(this, wotInstance));\n\n    _this.clone = _this.makeClone(_base2.default.CLONE_TOP);\n    return _this;\n  }\n\n  /**\n   * Checks if overlay should be fully rendered\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(TopOverlay, [{\n    key: 'shouldBeRendered',\n    value: function shouldBeRendered() {\n      return !!(this.wot.getSetting('fixedRowsTop') || this.wot.getSetting('columnHeaders').length);\n    }\n\n    /**\n     * Updates the top overlay position\n     */\n\n  }, {\n    key: 'resetFixedPosition',\n    value: function resetFixedPosition() {\n      if (!this.needFullRender || !this.wot.wtTable.holder.parentNode) {\n        // removed from DOM\n        return;\n      }\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var headerPosition = 0;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (this.trimmingContainer === window && (!preventOverflow || preventOverflow !== 'vertical')) {\n        var box = this.wot.wtTable.hider.getBoundingClientRect();\n        var top = Math.ceil(box.top);\n        var bottom = Math.ceil(box.bottom);\n        var finalLeft = void 0;\n        var finalTop = void 0;\n\n        finalLeft = this.wot.wtTable.hider.style.left;\n        finalLeft = finalLeft === '' ? 0 : finalLeft;\n\n        if (top < 0 && bottom - overlayRoot.offsetHeight > 0) {\n          finalTop = -top;\n        } else {\n          finalTop = 0;\n        }\n        headerPosition = finalTop;\n        finalTop += 'px';\n\n        (0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop);\n      } else {\n        headerPosition = this.getScrollPosition();\n        (0, _element.resetCssTransform)(overlayRoot);\n      }\n\n      this.adjustHeaderBordersPosition(headerPosition);\n\n      this.adjustElementsSize();\n    }\n\n    /**\n     * Sets the main overlay's vertical scroll position\n     *\n     * @param {Number} pos\n     */\n\n  }, {\n    key: 'setScrollPosition',\n    value: function setScrollPosition(pos) {\n      if (this.mainTableScrollableElement === window) {\n        window.scrollTo((0, _element.getWindowScrollLeft)(), pos);\n      } else {\n        this.mainTableScrollableElement.scrollTop = pos;\n      }\n    }\n\n    /**\n     * Triggers onScroll hook callback\n     */\n\n  }, {\n    key: 'onScroll',\n    value: function onScroll() {\n      this.wot.getSetting('onScrollHorizontally');\n    }\n\n    /**\n     * Calculates total sum cells height\n     *\n     * @param {Number} from Row index which calculates started from\n     * @param {Number} to Row index where calculation is finished\n     * @returns {Number} Height sum\n     */\n\n  }, {\n    key: 'sumCellSizes',\n    value: function sumCellSizes(from, to) {\n      var sum = 0;\n      var defaultRowHeight = this.wot.wtSettings.settings.defaultRowHeight;\n\n      while (from < to) {\n        var height = this.wot.wtTable.getRowHeight(from);\n\n        sum += height === void 0 ? defaultRowHeight : height;\n        from++;\n      }\n\n      return sum;\n    }\n\n    /**\n     * Adjust overlay root element, childs and master table element sizes (width, height).\n     *\n     * @param {Boolean} [force=false]\n     */\n\n  }, {\n    key: 'adjustElementsSize',\n    value: function adjustElementsSize() {\n      var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      this.updateTrimmingContainer();\n\n      if (this.needFullRender || force) {\n        this.adjustRootElementSize();\n        this.adjustRootChildrenSize();\n\n        if (!force) {\n          this.areElementSizesAdjusted = true;\n        }\n      }\n    }\n\n    /**\n     * Adjust overlay root element size (width and height).\n     */\n\n  }, {\n    key: 'adjustRootElementSize',\n    value: function adjustRootElementSize() {\n      var masterHolder = this.wot.wtTable.holder;\n      var scrollbarWidth = masterHolder.clientWidth === masterHolder.offsetWidth ? 0 : (0, _element.getScrollbarWidth)();\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var overlayRootStyle = overlayRoot.style;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n      var tableHeight = void 0;\n\n      if (this.trimmingContainer !== window || preventOverflow === 'horizontal') {\n        var width = this.wot.wtViewport.getWorkspaceWidth() - scrollbarWidth;\n\n        width = Math.min(width, (0, _element.innerWidth)(this.wot.wtTable.wtRootElement));\n\n        overlayRootStyle.width = width + 'px';\n      } else {\n        overlayRootStyle.width = '';\n      }\n\n      this.clone.wtTable.holder.style.width = overlayRootStyle.width;\n\n      tableHeight = (0, _element.outerHeight)(this.clone.wtTable.TABLE);\n      overlayRootStyle.height = (tableHeight === 0 ? tableHeight : tableHeight + 4) + 'px';\n    }\n\n    /**\n     * Adjust overlay root childs size\n     */\n\n  }, {\n    key: 'adjustRootChildrenSize',\n    value: function adjustRootChildrenSize() {\n      var scrollbarWidth = (0, _element.getScrollbarWidth)();\n\n      this.clone.wtTable.hider.style.width = this.hider.style.width;\n      this.clone.wtTable.holder.style.width = this.clone.wtTable.holder.parentNode.style.width;\n\n      if (scrollbarWidth === 0) {\n        scrollbarWidth = 30;\n      }\n      this.clone.wtTable.holder.style.height = parseInt(this.clone.wtTable.holder.parentNode.style.height, 10) + scrollbarWidth + 'px';\n    }\n\n    /**\n     * Adjust the overlay dimensions and position\n     */\n\n  }, {\n    key: 'applyToDOM',\n    value: function applyToDOM() {\n      var total = this.wot.getSetting('totalRows');\n\n      if (!this.areElementSizesAdjusted) {\n        this.adjustElementsSize();\n      }\n      if (typeof this.wot.wtViewport.rowsRenderCalculator.startPosition === 'number') {\n        this.spreader.style.top = this.wot.wtViewport.rowsRenderCalculator.startPosition + 'px';\n      } else if (total === 0) {\n        // can happen if there are 0 rows\n        this.spreader.style.top = '0';\n      } else {\n        throw new Error('Incorrect value of the rowsRenderCalculator');\n      }\n      this.spreader.style.bottom = '';\n\n      if (this.needFullRender) {\n        this.syncOverlayOffset();\n      }\n    }\n\n    /**\n     * Synchronize calculated left position to an element\n     */\n\n  }, {\n    key: 'syncOverlayOffset',\n    value: function syncOverlayOffset() {\n      if (typeof this.wot.wtViewport.columnsRenderCalculator.startPosition === 'number') {\n        this.clone.wtTable.spreader.style.left = this.wot.wtViewport.columnsRenderCalculator.startPosition + 'px';\n      } else {\n        this.clone.wtTable.spreader.style.left = '';\n      }\n    }\n\n    /**\n     * Scrolls vertically to a row\n     *\n     * @param sourceRow {Number} Row index which you want to scroll to\n     * @param [bottomEdge=false] {Boolean} if `true`, scrolls according to the bottom edge (top edge is by default)\n     */\n\n  }, {\n    key: 'scrollTo',\n    value: function scrollTo(sourceRow, bottomEdge) {\n      var newY = this.getTableParentOffset();\n      var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot;\n      var mainHolder = sourceInstance.wtTable.holder;\n      var scrollbarCompensation = 0;\n\n      if (bottomEdge && mainHolder.offsetHeight !== mainHolder.clientHeight) {\n        scrollbarCompensation = (0, _element.getScrollbarWidth)();\n      }\n\n      if (bottomEdge) {\n        var fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');\n        var fixedRowsTop = this.wot.getSetting('fixedRowsTop');\n        var totalRows = this.wot.getSetting('totalRows');\n\n        newY += this.sumCellSizes(0, sourceRow + 1);\n        newY -= this.wot.wtViewport.getViewportHeight() - this.sumCellSizes(totalRows - fixedRowsBottom, totalRows);\n        // Fix 1 pixel offset when cell is selected\n        newY += 1;\n      } else {\n        newY += this.sumCellSizes(this.wot.getSetting('fixedRowsTop'), sourceRow);\n      }\n      newY += scrollbarCompensation;\n\n      this.setScrollPosition(newY);\n    }\n\n    /**\n     * Gets table parent top position\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getTableParentOffset',\n    value: function getTableParentOffset() {\n      if (this.mainTableScrollableElement === window) {\n        return this.wot.wtTable.holderOffset.top;\n      }\n      return 0;\n    }\n\n    /**\n     * Gets the main overlay's vertical scroll position\n     *\n     * @returns {Number} Main table's vertical scroll position\n     */\n\n  }, {\n    key: 'getScrollPosition',\n    value: function getScrollPosition() {\n      return (0, _element.getScrollTop)(this.mainTableScrollableElement);\n    }\n\n    /**\n     * Redraw borders of selection\n     *\n     * @param {WalkontableSelection} selection Selection for redraw\n     */\n\n  }, {\n    key: 'redrawSelectionBorders',\n    value: function redrawSelectionBorders(selection) {\n      if (selection && selection.cellRange) {\n        var border = selection.getBorder(this.wot);\n        var corners = selection.getCorners();\n\n        border.disappear();\n        border.appear(corners);\n      }\n    }\n\n    /**\n     * Redrawing borders of all selections\n     */\n\n  }, {\n    key: 'redrawAllSelectionsBorders',\n    value: function redrawAllSelectionsBorders() {\n      var _this2 = this;\n\n      var selections = this.wot.selections;\n\n      this.redrawSelectionBorders(selections.getCell());\n\n      (0, _array.arrayEach)(selections.getAreas(), function (area) {\n        _this2.redrawSelectionBorders(area);\n      });\n      this.redrawSelectionBorders(selections.getFill());\n\n      this.wot.wtTable.wot.wtOverlays.leftOverlay.refresh();\n    }\n\n    /**\n     * Adds css classes to hide the header border's header (cell-selection border hiding issue)\n     *\n     * @param {Number} position Header Y position if trimming container is window or scroll top if not\n     */\n\n  }, {\n    key: 'adjustHeaderBordersPosition',\n    value: function adjustHeaderBordersPosition(position) {\n      var masterParent = this.wot.wtTable.holder.parentNode;\n      var totalColumns = this.wot.getSetting('totalColumns');\n\n      if (totalColumns) {\n        (0, _element.removeClass)(masterParent, 'emptyColumns');\n      } else {\n        (0, _element.addClass)(masterParent, 'emptyColumns');\n      }\n\n      if (this.wot.getSetting('fixedRowsTop') === 0 && this.wot.getSetting('columnHeaders').length > 0) {\n        var previousState = (0, _element.hasClass)(masterParent, 'innerBorderTop');\n\n        if (position || this.wot.getSetting('totalRows') === 0) {\n          (0, _element.addClass)(masterParent, 'innerBorderTop');\n        } else {\n          (0, _element.removeClass)(masterParent, 'innerBorderTop');\n        }\n\n        if (!previousState && position || previousState && !position) {\n          this.wot.wtOverlays.adjustElementsSize();\n\n          // cell borders should be positioned once again,\n          // because we added / removed 1px border from table header\n          this.redrawAllSelectionsBorders();\n        }\n      }\n\n      // nasty workaround for double border in the header, TODO: find a pure-css solution\n      if (this.wot.getSetting('rowHeaders').length === 0) {\n        var secondHeaderCell = this.clone.wtTable.THEAD.querySelectorAll('th:nth-of-type(2)');\n\n        if (secondHeaderCell) {\n          for (var i = 0; i < secondHeaderCell.length; i++) {\n            secondHeaderCell[i].style['border-left-width'] = 0;\n          }\n        }\n      }\n    }\n  }]);\n\n  return TopOverlay;\n}(_base2.default);\n\n_base2.default.registerOverlay(_base2.default.CLONE_TOP, TopOverlay);\n\nexports.default = TopOverlay;\n\n/***/ }),\n/* 353 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @class TopLeftCornerOverlay\n */\nvar TopLeftCornerOverlay = function (_Overlay) {\n  _inherits(TopLeftCornerOverlay, _Overlay);\n\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function TopLeftCornerOverlay(wotInstance) {\n    _classCallCheck(this, TopLeftCornerOverlay);\n\n    var _this = _possibleConstructorReturn(this, (TopLeftCornerOverlay.__proto__ || Object.getPrototypeOf(TopLeftCornerOverlay)).call(this, wotInstance));\n\n    _this.clone = _this.makeClone(_base2.default.CLONE_TOP_LEFT_CORNER);\n    return _this;\n  }\n\n  /**\n   * Checks if overlay should be fully rendered\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(TopLeftCornerOverlay, [{\n    key: 'shouldBeRendered',\n    value: function shouldBeRendered() {\n      return !!((this.wot.getSetting('fixedRowsTop') || this.wot.getSetting('columnHeaders').length) && (this.wot.getSetting('fixedColumnsLeft') || this.wot.getSetting('rowHeaders').length));\n    }\n\n    /**\n     * Updates the corner overlay position\n     */\n\n  }, {\n    key: 'resetFixedPosition',\n    value: function resetFixedPosition() {\n      this.updateTrimmingContainer();\n\n      if (!this.wot.wtTable.holder.parentNode) {\n        // removed from DOM\n        return;\n      }\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var tableHeight = (0, _element.outerHeight)(this.clone.wtTable.TABLE);\n      var tableWidth = (0, _element.outerWidth)(this.clone.wtTable.TABLE);\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (this.trimmingContainer === window) {\n        var box = this.wot.wtTable.hider.getBoundingClientRect();\n        var top = Math.ceil(box.top);\n        var left = Math.ceil(box.left);\n        var bottom = Math.ceil(box.bottom);\n        var right = Math.ceil(box.right);\n        var finalLeft = '0';\n        var finalTop = '0';\n\n        if (!preventOverflow || preventOverflow === 'vertical') {\n          if (left < 0 && right - overlayRoot.offsetWidth > 0) {\n            finalLeft = -left + 'px';\n          }\n        }\n\n        if (!preventOverflow || preventOverflow === 'horizontal') {\n          if (top < 0 && bottom - overlayRoot.offsetHeight > 0) {\n            finalTop = -top + 'px';\n          }\n        }\n        (0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop);\n      } else {\n        (0, _element.resetCssTransform)(overlayRoot);\n      }\n      overlayRoot.style.height = (tableHeight === 0 ? tableHeight : tableHeight + 4) + 'px';\n      overlayRoot.style.width = (tableWidth === 0 ? tableWidth : tableWidth + 4) + 'px';\n    }\n  }]);\n\n  return TopLeftCornerOverlay;\n}(_base2.default);\n\n_base2.default.registerOverlay(_base2.default.CLONE_TOP_LEFT_CORNER, TopLeftCornerOverlay);\n\nexports.default = TopLeftCornerOverlay;\n\n/***/ }),\n/* 354 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _border = __webpack_require__(306);\n\nvar _border2 = _interopRequireDefault(_border);\n\nvar _coords = __webpack_require__(55);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nvar _range = __webpack_require__(86);\n\nvar _range2 = _interopRequireDefault(_range);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Selection\n */\nvar Selection = function () {\n  /**\n   * @param {Object} settings\n   * @param {CellRange} cellRange\n   */\n  function Selection(settings, cellRange) {\n    _classCallCheck(this, Selection);\n\n    this.settings = settings;\n    this.cellRange = cellRange || null;\n    this.instanceBorders = {};\n    this.classNames = [this.settings.className];\n    this.classNameGenerator = this.linearClassNameGenerator(this.settings.className, this.settings.layerLevel);\n  }\n\n  /**\n   * Each Walkontable clone requires it's own border for every selection. This method creates and returns selection\n   * borders per instance\n   *\n   * @param {Walkontable} wotInstance\n   * @returns {Border}\n   */\n\n\n  _createClass(Selection, [{\n    key: 'getBorder',\n    value: function getBorder(wotInstance) {\n      if (!this.instanceBorders[wotInstance.guid]) {\n        this.instanceBorders[wotInstance.guid] = new _border2.default(wotInstance, this.settings);\n      }\n\n      return this.instanceBorders[wotInstance.guid];\n    }\n\n    /**\n     * Checks if selection is empty\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isEmpty',\n    value: function isEmpty() {\n      return this.cellRange === null;\n    }\n\n    /**\n     * Adds a cell coords to the selection\n     *\n     * @param {CellCoords} coords\n     */\n\n  }, {\n    key: 'add',\n    value: function add(coords) {\n      if (this.isEmpty()) {\n        this.cellRange = new _range2.default(coords);\n      } else {\n        this.cellRange.expand(coords);\n      }\n\n      return this;\n    }\n\n    /**\n     * If selection range from or to property equals oldCoords, replace it with newCoords. Return boolean\n     * information about success\n     *\n     * @param {CellCoords} oldCoords\n     * @param {CellCoords} newCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'replace',\n    value: function replace(oldCoords, newCoords) {\n      if (!this.isEmpty()) {\n        if (this.cellRange.from.isEqual(oldCoords)) {\n          this.cellRange.from = newCoords;\n\n          return true;\n        }\n        if (this.cellRange.to.isEqual(oldCoords)) {\n          this.cellRange.to = newCoords;\n\n          return true;\n        }\n      }\n\n      return false;\n    }\n\n    /**\n     * Clears selection\n     *\n     * @returns {Selection}\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.cellRange = null;\n\n      return this;\n    }\n\n    /**\n     * Returns the top left (TL) and bottom right (BR) selection coordinates\n     *\n     * @returns {Array} Returns array of coordinates for example `[1, 1, 5, 5]`\n     */\n\n  }, {\n    key: 'getCorners',\n    value: function getCorners() {\n      var topLeft = this.cellRange.getTopLeftCorner();\n      var bottomRight = this.cellRange.getBottomRightCorner();\n\n      return [topLeft.row, topLeft.col, bottomRight.row, bottomRight.col];\n    }\n\n    /**\n     * Adds class name to cell element at given coords\n     *\n     * @param {Walkontable} wotInstance Walkontable instance\n     * @param {Number} sourceRow Cell row coord\n     * @param {Number} sourceColumn Cell column coord\n     * @param {String} className Class name\n     * @param {Boolean} [markIntersections=false] If `true`, linear className generator will be used to add CSS classes\n     *                                            in a continuous way.\n     * @returns {Selection}\n     */\n\n  }, {\n    key: 'addClassAtCoords',\n    value: function addClassAtCoords(wotInstance, sourceRow, sourceColumn, className) {\n      var markIntersections = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n      var TD = wotInstance.wtTable.getCell(new _coords2.default(sourceRow, sourceColumn));\n\n      if ((typeof TD === 'undefined' ? 'undefined' : _typeof(TD)) === 'object') {\n        if (markIntersections) {\n          className = this.classNameGenerator(TD);\n\n          if (!this.classNames.includes(className)) {\n            this.classNames.push(className);\n          }\n        }\n\n        (0, _element.addClass)(TD, className);\n      }\n\n      return this;\n    }\n\n    /**\n     * Generate helper for calculating classNames based on previously added base className.\n     * The generated className is always generated as a continuation of the previous className. For example, when\n     * the currently checked element has 'area-2' className the generated new className will be 'area-3'. When\n     * the element doesn't have any classNames than the base className will be returned ('area');\n     *\n     * @param {String} baseClassName Base className to be used.\n     * @param {Number} layerLevelOwner Layer level which the instance of the Selection belongs to.\n     * @return {Function}\n     */\n\n  }, {\n    key: 'linearClassNameGenerator',\n    value: function linearClassNameGenerator(baseClassName, layerLevelOwner) {\n      // TODO: Make this recursive function Proper Tail Calls (TCO/PTC) friendly.\n      return function calcClassName(element) {\n        var previousIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;\n\n        if (layerLevelOwner === 0 || previousIndex === 0) {\n          return baseClassName;\n        }\n\n        var index = previousIndex >= 0 ? previousIndex : layerLevelOwner;\n        var className = baseClassName;\n\n        index -= 1;\n\n        var previousClassName = index === 0 ? baseClassName : baseClassName + '-' + index;\n\n        if ((0, _element.hasClass)(element, previousClassName)) {\n          var currentLayer = index + 1;\n\n          className = baseClassName + '-' + currentLayer;\n        } else {\n          className = calcClassName(element, index);\n        }\n\n        return className;\n      };\n    }\n\n    /**\n     * @param wotInstance\n     */\n\n  }, {\n    key: 'draw',\n    value: function draw(wotInstance) {\n      if (this.isEmpty()) {\n        if (this.settings.border) {\n          this.getBorder(wotInstance).disappear();\n        }\n\n        return;\n      }\n\n      var renderedRows = wotInstance.wtTable.getRenderedRowsCount();\n      var renderedColumns = wotInstance.wtTable.getRenderedColumnsCount();\n      var corners = this.getCorners();\n\n      var _corners = _slicedToArray(corners, 4),\n          topRow = _corners[0],\n          topColumn = _corners[1],\n          bottomRow = _corners[2],\n          bottomColumn = _corners[3];\n\n      for (var column = 0; column < renderedColumns; column += 1) {\n        var sourceCol = wotInstance.wtTable.columnFilter.renderedToSource(column);\n\n        if (sourceCol >= topColumn && sourceCol <= bottomColumn) {\n          var TH = wotInstance.wtTable.getColumnHeader(sourceCol);\n\n          if (TH) {\n            var newClasses = [];\n\n            if (this.settings.highlightHeaderClassName) {\n              newClasses.push(this.settings.highlightHeaderClassName);\n            }\n\n            if (this.settings.highlightColumnClassName) {\n              newClasses.push(this.settings.highlightColumnClassName);\n            }\n\n            (0, _element.addClass)(TH, newClasses);\n          }\n        }\n      }\n\n      for (var row = 0; row < renderedRows; row += 1) {\n        var sourceRow = wotInstance.wtTable.rowFilter.renderedToSource(row);\n\n        if (sourceRow >= topRow && sourceRow <= bottomRow) {\n          var _TH = wotInstance.wtTable.getRowHeader(sourceRow);\n\n          if (_TH) {\n            var _newClasses = [];\n\n            if (this.settings.highlightHeaderClassName) {\n              _newClasses.push(this.settings.highlightHeaderClassName);\n            }\n\n            if (this.settings.highlightRowClassName) {\n              _newClasses.push(this.settings.highlightRowClassName);\n            }\n\n            (0, _element.addClass)(_TH, _newClasses);\n          }\n        }\n\n        for (var _column = 0; _column < renderedColumns; _column += 1) {\n          var _sourceCol = wotInstance.wtTable.columnFilter.renderedToSource(_column);\n\n          if (sourceRow >= topRow && sourceRow <= bottomRow && _sourceCol >= topColumn && _sourceCol <= bottomColumn) {\n            // selected cell\n            if (this.settings.className) {\n              this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.className, this.settings.markIntersections);\n            }\n          } else if (sourceRow >= topRow && sourceRow <= bottomRow) {\n            // selection is in this row\n            if (this.settings.highlightRowClassName) {\n              this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.highlightRowClassName);\n            }\n          } else if (_sourceCol >= topColumn && _sourceCol <= bottomColumn) {\n            // selection is in this column\n            if (this.settings.highlightColumnClassName) {\n              this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.highlightColumnClassName);\n            }\n          }\n\n          var additionalSelectionClass = wotInstance.getSetting('onAfterDrawSelection', sourceRow, _sourceCol, corners, this.settings.layerLevel);\n\n          if (typeof additionalSelectionClass === 'string') {\n            this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, additionalSelectionClass);\n          }\n        }\n      }\n\n      wotInstance.getSetting('onBeforeDrawBorders', corners, this.settings.className);\n\n      if (this.settings.border) {\n        // warning! border.appear modifies corners!\n        this.getBorder(wotInstance).appear(corners);\n      }\n    }\n  }]);\n\n  return Selection;\n}();\n\nexports.default = Selection;\n\n/***/ }),\n/* 355 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * autoResize - resizes a DOM element to the width and height of another DOM element\n *\n * Copyright 2014, Marcin Warpechowski\n * Licensed under the MIT license\n */\n\nfunction autoResize() {\n  var defaults = {\n    minHeight: 200,\n    maxHeight: 300,\n    minWidth: 100,\n    maxWidth: 300\n  },\n      el,\n      body = document.body,\n      text = document.createTextNode(''),\n      span = document.createElement('SPAN'),\n      observe = function observe(element, event, handler) {\n    if (element.attachEvent) {\n      element.attachEvent('on' + event, handler);\n    } else {\n      element.addEventListener(event, handler, false);\n    }\n  },\n      _unObserve = function _unObserve(element, event, handler) {\n    if (element.removeEventListener) {\n      element.removeEventListener(event, handler, false);\n    } else {\n      element.detachEvent('on' + event, handler);\n    }\n  },\n      resize = function resize(newChar) {\n    var width, scrollHeight;\n\n    if (!newChar) {\n      newChar = \"\";\n    } else if (!/^[a-zA-Z \\.,\\\\\\/\\|0-9]$/.test(newChar)) {\n      newChar = \".\";\n    }\n\n    if (text.textContent !== void 0) {\n      text.textContent = el.value + newChar;\n    } else {\n      text.data = el.value + newChar; //IE8\n    }\n    span.style.fontSize = getComputedStyle(el).fontSize;\n    span.style.fontFamily = getComputedStyle(el).fontFamily;\n    span.style.whiteSpace = \"pre\";\n\n    body.appendChild(span);\n    width = span.clientWidth + 2;\n    body.removeChild(span);\n\n    el.style.height = defaults.minHeight + 'px';\n\n    if (defaults.minWidth > width) {\n      el.style.width = defaults.minWidth + 'px';\n    } else if (width > defaults.maxWidth) {\n      el.style.width = defaults.maxWidth + 'px';\n    } else {\n      el.style.width = width + 'px';\n    }\n    scrollHeight = el.scrollHeight ? el.scrollHeight - 1 : 0;\n\n    if (defaults.minHeight > scrollHeight) {\n      el.style.height = defaults.minHeight + 'px';\n    } else if (defaults.maxHeight < scrollHeight) {\n      el.style.height = defaults.maxHeight + 'px';\n      el.style.overflowY = 'visible';\n    } else {\n      el.style.height = scrollHeight + 'px';\n    }\n  },\n      delayedResize = function delayedResize() {\n    window.setTimeout(resize, 0);\n  },\n      extendDefaults = function extendDefaults(config) {\n\n    if (config && config.minHeight) {\n      if (config.minHeight == 'inherit') {\n        defaults.minHeight = el.clientHeight;\n      } else {\n        var minHeight = parseInt(config.minHeight);\n        if (!isNaN(minHeight)) {\n          defaults.minHeight = minHeight;\n        }\n      }\n    }\n\n    if (config && config.maxHeight) {\n      if (config.maxHeight == 'inherit') {\n        defaults.maxHeight = el.clientHeight;\n      } else {\n        var maxHeight = parseInt(config.maxHeight);\n        if (!isNaN(maxHeight)) {\n          defaults.maxHeight = maxHeight;\n        }\n      }\n    }\n\n    if (config && config.minWidth) {\n      if (config.minWidth == 'inherit') {\n        defaults.minWidth = el.clientWidth;\n      } else {\n        var minWidth = parseInt(config.minWidth);\n        if (!isNaN(minWidth)) {\n          defaults.minWidth = minWidth;\n        }\n      }\n    }\n\n    if (config && config.maxWidth) {\n      if (config.maxWidth == 'inherit') {\n        defaults.maxWidth = el.clientWidth;\n      } else {\n        var maxWidth = parseInt(config.maxWidth);\n        if (!isNaN(maxWidth)) {\n          defaults.maxWidth = maxWidth;\n        }\n      }\n    }\n\n    if (!span.firstChild) {\n      span.className = \"autoResize\";\n      span.style.display = 'inline-block';\n      span.appendChild(text);\n    }\n  },\n      _init = function _init(el_, config, doObserve) {\n    el = el_;\n    extendDefaults(config);\n\n    if (el.nodeName == 'TEXTAREA') {\n\n      el.style.resize = 'none';\n      el.style.overflowY = '';\n      el.style.height = defaults.minHeight + 'px';\n      el.style.minWidth = defaults.minWidth + 'px';\n      el.style.maxWidth = defaults.maxWidth + 'px';\n      el.style.overflowY = 'hidden';\n    }\n\n    if (doObserve) {\n      observe(el, 'change', resize);\n      observe(el, 'cut', delayedResize);\n      observe(el, 'paste', delayedResize);\n      observe(el, 'drop', delayedResize);\n      observe(el, 'keydown', delayedResize);\n      observe(el, 'focus', resize);\n    }\n\n    resize();\n  };\n\n  function getComputedStyle(element) {\n    return element.currentStyle || document.defaultView.getComputedStyle(element);\n  }\n\n  return {\n    init: function init(el_, config, doObserve) {\n      _init(el_, config, doObserve);\n    },\n    unObserve: function unObserve() {\n      _unObserve(el, 'change', resize);\n      _unObserve(el, 'cut', delayedResize);\n      _unObserve(el, 'paste', delayedResize);\n      _unObserve(el, 'drop', delayedResize);\n      _unObserve(el, 'keydown', delayedResize);\n      _unObserve(el, 'focus', resize);\n    },\n    resize: resize\n  };\n}\n\nif (true) {\n  module.exports = autoResize;\n}\n\n/***/ }),\n/* 356 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _baseEditor = __webpack_require__(54);\n\nvar _baseEditor2 = _interopRequireDefault(_baseEditor);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor CheckboxEditor\n * @class CheckboxEditor\n */\nvar CheckboxEditor = function (_BaseEditor) {\n  _inherits(CheckboxEditor, _BaseEditor);\n\n  function CheckboxEditor() {\n    _classCallCheck(this, CheckboxEditor);\n\n    return _possibleConstructorReturn(this, (CheckboxEditor.__proto__ || Object.getPrototypeOf(CheckboxEditor)).apply(this, arguments));\n  }\n\n  _createClass(CheckboxEditor, [{\n    key: 'beginEditing',\n    value: function beginEditing(initialValue, event) {\n      // Just some events connected with checkbox editor are delegated here. Some `keydown` events like `enter` and `space` key press\n      // are handled inside `checkboxRenderer`. Some events come here from `editorManager`. Below `if` statement was created by author\n      // for purpose of handling only `doubleclick` event which may be done on a cell with checkbox.\n\n      if (event.type === 'mouseup') {\n        var checkbox = this.TD.querySelector('input[type=\"checkbox\"]');\n\n        if (!(0, _element.hasClass)(checkbox, 'htBadValue')) {\n          checkbox.click();\n        }\n      }\n    }\n  }, {\n    key: 'finishEditing',\n    value: function finishEditing() {}\n  }, {\n    key: 'init',\n    value: function init() {}\n  }, {\n    key: 'open',\n    value: function open() {}\n  }, {\n    key: 'close',\n    value: function close() {}\n  }, {\n    key: 'getValue',\n    value: function getValue() {}\n  }, {\n    key: 'setValue',\n    value: function setValue() {}\n  }, {\n    key: 'focus',\n    value: function focus() {}\n  }]);\n\n  return CheckboxEditor;\n}(_baseEditor2.default);\n\nexports.default = CheckboxEditor;\n\n/***/ }),\n/* 357 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _moment = __webpack_require__(41);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _pikaday = __webpack_require__(358);\n\nvar _pikaday2 = _interopRequireDefault(_pikaday);\n\n__webpack_require__(359);\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _unicode = __webpack_require__(21);\n\nvar _event = __webpack_require__(12);\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor DateEditor\n * @class DateEditor\n * @dependencies TextEditor moment pikaday\n */\nvar DateEditor = function (_TextEditor) {\n  _inherits(DateEditor, _TextEditor);\n\n  /**\n   * @param {Core} hotInstance Handsontable instance\n   * @private\n   */\n  function DateEditor(hotInstance) {\n    _classCallCheck(this, DateEditor);\n\n    // TODO: Move this option to general settings\n    var _this = _possibleConstructorReturn(this, (DateEditor.__proto__ || Object.getPrototypeOf(DateEditor)).call(this, hotInstance));\n\n    _this.defaultDateFormat = 'DD/MM/YYYY';\n    _this.isCellEdited = false;\n    _this.parentDestroyed = false;\n    return _this;\n  }\n\n  _createClass(DateEditor, [{\n    key: 'init',\n    value: function init() {\n      var _this2 = this;\n\n      if (typeof _moment2.default !== 'function') {\n        throw new Error('You need to include moment.js to your project.');\n      }\n\n      if (typeof _pikaday2.default !== 'function') {\n        throw new Error('You need to include Pikaday to your project.');\n      }\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'init', this).call(this);\n      this.instance.addHook('afterDestroy', function () {\n        _this2.parentDestroyed = true;\n        _this2.destroyElements();\n      });\n    }\n\n    /**\n     * Create data picker instance\n     */\n\n  }, {\n    key: 'createElements',\n    value: function createElements() {\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'createElements', this).call(this);\n\n      this.datePicker = document.createElement('DIV');\n      this.datePickerStyle = this.datePicker.style;\n      this.datePickerStyle.position = 'absolute';\n      this.datePickerStyle.top = 0;\n      this.datePickerStyle.left = 0;\n      this.datePickerStyle.zIndex = 9999;\n\n      (0, _element.addClass)(this.datePicker, 'htDatepickerHolder');\n      document.body.appendChild(this.datePicker);\n\n      this.$datePicker = new _pikaday2.default(this.getDatePickerConfig());\n      var eventManager = new _eventManager2.default(this);\n\n      /**\n       * Prevent recognizing clicking on datepicker as clicking outside of table\n       */\n      eventManager.addEventListener(this.datePicker, 'mousedown', function (event) {\n        return (0, _event.stopPropagation)(event);\n      });\n      this.hideDatepicker();\n    }\n\n    /**\n     * Destroy data picker instance\n     */\n\n  }, {\n    key: 'destroyElements',\n    value: function destroyElements() {\n      this.$datePicker.destroy();\n    }\n\n    /**\n     * Prepare editor to appear\n     *\n     * @param {Number} row Row index\n     * @param {Number} col Column index\n     * @param {String} prop Property name (passed when datasource is an array of objects)\n     * @param {HTMLTableCellElement} td Table cell element\n     * @param {*} originalValue Original value\n     * @param {Object} cellProperties Object with cell properties ({@see Core#getCellMeta})\n     */\n\n  }, {\n    key: 'prepare',\n    value: function prepare(row, col, prop, td, originalValue, cellProperties) {\n      this._opened = false;\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'prepare', this).call(this, row, col, prop, td, originalValue, cellProperties);\n    }\n\n    /**\n     * Open editor\n     *\n     * @param {Event} [event=null]\n     */\n\n  }, {\n    key: 'open',\n    value: function open() {\n      var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'open', this).call(this);\n      this.showDatepicker(event);\n    }\n\n    /**\n     * Close editor\n     */\n\n  }, {\n    key: 'close',\n    value: function close() {\n      var _this3 = this;\n\n      this._opened = false;\n      this.instance._registerTimeout(setTimeout(function () {\n        _this3.instance._refreshBorders();\n      }, 0));\n\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'close', this).call(this);\n    }\n\n    /**\n     * @param {Boolean} [isCancelled=false]\n     * @param {Boolean} [ctrlDown=false]\n     */\n\n  }, {\n    key: 'finishEditing',\n    value: function finishEditing() {\n      var isCancelled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n      var ctrlDown = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (isCancelled) {\n        // pressed ESC, restore original value\n        // var value = this.instance.getDataAtCell(this.row, this.col);\n        var value = this.originalValue;\n\n        if (value !== void 0) {\n          this.setValue(value);\n        }\n      }\n      this.hideDatepicker();\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'finishEditing', this).call(this, isCancelled, ctrlDown);\n    }\n\n    /**\n     * Show data picker\n     *\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'showDatepicker',\n    value: function showDatepicker(event) {\n      this.$datePicker.config(this.getDatePickerConfig());\n\n      var offset = this.TD.getBoundingClientRect();\n      var dateFormat = this.cellProperties.dateFormat || this.defaultDateFormat;\n      var datePickerConfig = this.$datePicker.config();\n      var dateStr = void 0;\n      var isMouseDown = this.instance.view.isMouseDown();\n      var isMeta = event ? (0, _unicode.isMetaKey)(event.keyCode) : false;\n\n      this.datePickerStyle.top = window.pageYOffset + offset.top + (0, _element.outerHeight)(this.TD) + 'px';\n      this.datePickerStyle.left = window.pageXOffset + offset.left + 'px';\n\n      this.$datePicker._onInputFocus = function () {};\n      datePickerConfig.format = dateFormat;\n\n      if (this.originalValue) {\n        dateStr = this.originalValue;\n\n        if ((0, _moment2.default)(dateStr, dateFormat, true).isValid()) {\n          this.$datePicker.setMoment((0, _moment2.default)(dateStr, dateFormat), true);\n        }\n\n        // workaround for date/time cells - pikaday resets the cell value to 12:00 AM by default, this will overwrite the value.\n        if (this.getValue() !== this.originalValue) {\n          this.setValue(this.originalValue);\n        }\n\n        if (!isMeta && !isMouseDown) {\n          this.setValue('');\n        }\n      } else if (this.cellProperties.defaultDate) {\n        dateStr = this.cellProperties.defaultDate;\n\n        datePickerConfig.defaultDate = dateStr;\n\n        if ((0, _moment2.default)(dateStr, dateFormat, true).isValid()) {\n          this.$datePicker.setMoment((0, _moment2.default)(dateStr, dateFormat), true);\n        }\n\n        if (!isMeta && !isMouseDown) {\n          this.setValue('');\n        }\n      } else {\n        // if a default date is not defined, set a soft-default-date: display the current day and month in the\n        // datepicker, but don't fill the editor input\n        this.$datePicker.gotoToday();\n      }\n\n      this.datePickerStyle.display = 'block';\n      this.$datePicker.show();\n    }\n\n    /**\n     * Hide data picker\n     */\n\n  }, {\n    key: 'hideDatepicker',\n    value: function hideDatepicker() {\n      this.datePickerStyle.display = 'none';\n      this.$datePicker.hide();\n    }\n\n    /**\n     * Get date picker options.\n     *\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'getDatePickerConfig',\n    value: function getDatePickerConfig() {\n      var _this4 = this;\n\n      var htInput = this.TEXTAREA;\n      var options = {};\n\n      if (this.cellProperties && this.cellProperties.datePickerConfig) {\n        (0, _object.deepExtend)(options, this.cellProperties.datePickerConfig);\n      }\n      var origOnSelect = options.onSelect;\n      var origOnClose = options.onClose;\n\n      options.field = htInput;\n      options.trigger = htInput;\n      options.container = this.datePicker;\n      options.bound = false;\n      options.format = options.format || this.defaultDateFormat;\n      options.reposition = options.reposition || false;\n      options.onSelect = function (dateStr) {\n        if (!isNaN(dateStr.getTime())) {\n          dateStr = (0, _moment2.default)(dateStr).format(_this4.cellProperties.dateFormat || _this4.defaultDateFormat);\n        }\n        _this4.setValue(dateStr);\n        _this4.hideDatepicker();\n\n        if (origOnSelect) {\n          origOnSelect();\n        }\n      };\n      options.onClose = function () {\n        if (!_this4.parentDestroyed) {\n          _this4.finishEditing(false);\n        }\n        if (origOnClose) {\n          origOnClose();\n        }\n      };\n\n      return options;\n    }\n  }]);\n\n  return DateEditor;\n}(_textEditor2.default);\n\nexports.default = DateEditor;\n\n/***/ }),\n/* 358 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*!\n * Pikaday\n *\n * Copyright © 2014 David Bushell | BSD & MIT license | https://github.com/dbushell/Pikaday\n */\n\n(function (root, factory)\n{\n    'use strict';\n\n    var moment;\n    if (true) {\n        // CommonJS module\n        // Load moment.js as an optional dependency\n        try { moment = __webpack_require__(41); } catch (e) {}\n        module.exports = factory(moment);\n    } else if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(function (req)\n        {\n            // Load moment.js as an optional dependency\n            var id = 'moment';\n            try { moment = req(id); } catch (e) {}\n            return factory(moment);\n        });\n    } else {\n        root.Pikaday = factory(root.moment);\n    }\n}(this, function (moment)\n{\n    'use strict';\n\n    /**\n     * feature detection and helper functions\n     */\n    var hasMoment = typeof moment === 'function',\n\n    hasEventListeners = !!window.addEventListener,\n\n    document = window.document,\n\n    sto = window.setTimeout,\n\n    addEvent = function(el, e, callback, capture)\n    {\n        if (hasEventListeners) {\n            el.addEventListener(e, callback, !!capture);\n        } else {\n            el.attachEvent('on' + e, callback);\n        }\n    },\n\n    removeEvent = function(el, e, callback, capture)\n    {\n        if (hasEventListeners) {\n            el.removeEventListener(e, callback, !!capture);\n        } else {\n            el.detachEvent('on' + e, callback);\n        }\n    },\n\n    fireEvent = function(el, eventName, data)\n    {\n        var ev;\n\n        if (document.createEvent) {\n            ev = document.createEvent('HTMLEvents');\n            ev.initEvent(eventName, true, false);\n            ev = extend(ev, data);\n            el.dispatchEvent(ev);\n        } else if (document.createEventObject) {\n            ev = document.createEventObject();\n            ev = extend(ev, data);\n            el.fireEvent('on' + eventName, ev);\n        }\n    },\n\n    trim = function(str)\n    {\n        return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g,'');\n    },\n\n    hasClass = function(el, cn)\n    {\n        return (' ' + el.className + ' ').indexOf(' ' + cn + ' ') !== -1;\n    },\n\n    addClass = function(el, cn)\n    {\n        if (!hasClass(el, cn)) {\n            el.className = (el.className === '') ? cn : el.className + ' ' + cn;\n        }\n    },\n\n    removeClass = function(el, cn)\n    {\n        el.className = trim((' ' + el.className + ' ').replace(' ' + cn + ' ', ' '));\n    },\n\n    isArray = function(obj)\n    {\n        return (/Array/).test(Object.prototype.toString.call(obj));\n    },\n\n    isDate = function(obj)\n    {\n        return (/Date/).test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime());\n    },\n\n    isWeekend = function(date)\n    {\n        var day = date.getDay();\n        return day === 0 || day === 6;\n    },\n\n    isLeapYear = function(year)\n    {\n        // solution by Matti Virkkunen: http://stackoverflow.com/a/4881951\n        return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;\n    },\n\n    getDaysInMonth = function(year, month)\n    {\n        return [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n    },\n\n    setToStartOfDay = function(date)\n    {\n        if (isDate(date)) date.setHours(0,0,0,0);\n    },\n\n    compareDates = function(a,b)\n    {\n        // weak date comparison (use setToStartOfDay(date) to ensure correct result)\n        return a.getTime() === b.getTime();\n    },\n\n    extend = function(to, from, overwrite)\n    {\n        var prop, hasProp;\n        for (prop in from) {\n            hasProp = to[prop] !== undefined;\n            if (hasProp && typeof from[prop] === 'object' && from[prop] !== null && from[prop].nodeName === undefined) {\n                if (isDate(from[prop])) {\n                    if (overwrite) {\n                        to[prop] = new Date(from[prop].getTime());\n                    }\n                }\n                else if (isArray(from[prop])) {\n                    if (overwrite) {\n                        to[prop] = from[prop].slice(0);\n                    }\n                } else {\n                    to[prop] = extend({}, from[prop], overwrite);\n                }\n            } else if (overwrite || !hasProp) {\n                to[prop] = from[prop];\n            }\n        }\n        return to;\n    },\n\n    adjustCalendar = function(calendar) {\n        if (calendar.month < 0) {\n            calendar.year -= Math.ceil(Math.abs(calendar.month)/12);\n            calendar.month += 12;\n        }\n        if (calendar.month > 11) {\n            calendar.year += Math.floor(Math.abs(calendar.month)/12);\n            calendar.month -= 12;\n        }\n        return calendar;\n    },\n\n    /**\n     * defaults and localisation\n     */\n    defaults = {\n\n        // bind the picker to a form field\n        field: null,\n\n        // automatically show/hide the picker on `field` focus (default `true` if `field` is set)\n        bound: undefined,\n\n        // position of the datepicker, relative to the field (default to bottom & left)\n        // ('bottom' & 'left' keywords are not used, 'top' & 'right' are modifier on the bottom/left position)\n        position: 'bottom left',\n\n        // automatically fit in the viewport even if it means repositioning from the position option\n        reposition: true,\n\n        // the default output format for `.toString()` and `field` value\n        format: 'YYYY-MM-DD',\n\n        // the initial date to view when first opened\n        defaultDate: null,\n\n        // make the `defaultDate` the initial selected value\n        setDefaultDate: false,\n\n        // first day of week (0: Sunday, 1: Monday etc)\n        firstDay: 0,\n\n        // the default flag for moment's strict date parsing\n        formatStrict: false,\n\n        // the minimum/earliest date that can be selected\n        minDate: null,\n        // the maximum/latest date that can be selected\n        maxDate: null,\n\n        // number of years either side, or array of upper/lower range\n        yearRange: 10,\n\n        // show week numbers at head of row\n        showWeekNumber: false,\n\n        // used internally (don't config outside)\n        minYear: 0,\n        maxYear: 9999,\n        minMonth: undefined,\n        maxMonth: undefined,\n\n        startRange: null,\n        endRange: null,\n\n        isRTL: false,\n\n        // Additional text to append to the year in the calendar title\n        yearSuffix: '',\n\n        // Render the month after year in the calendar title\n        showMonthAfterYear: false,\n\n        // Render days of the calendar grid that fall in the next or previous month\n        showDaysInNextAndPreviousMonths: false,\n\n        // how many months are visible\n        numberOfMonths: 1,\n\n        // when numberOfMonths is used, this will help you to choose where the main calendar will be (default `left`, can be set to `right`)\n        // only used for the first display or when a selected date is not visible\n        mainCalendar: 'left',\n\n        // Specify a DOM element to render the calendar in\n        container: undefined,\n\n        // internationalization\n        i18n: {\n            previousMonth : 'Previous Month',\n            nextMonth     : 'Next Month',\n            months        : ['January','February','March','April','May','June','July','August','September','October','November','December'],\n            weekdays      : ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],\n            weekdaysShort : ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']\n        },\n\n        // Theme Classname\n        theme: null,\n\n        // callback function\n        onSelect: null,\n        onOpen: null,\n        onClose: null,\n        onDraw: null\n    },\n\n\n    /**\n     * templating functions to abstract HTML rendering\n     */\n    renderDayName = function(opts, day, abbr)\n    {\n        day += opts.firstDay;\n        while (day >= 7) {\n            day -= 7;\n        }\n        return abbr ? opts.i18n.weekdaysShort[day] : opts.i18n.weekdays[day];\n    },\n\n    renderDay = function(opts)\n    {\n        var arr = [];\n        var ariaSelected = 'false';\n        if (opts.isEmpty) {\n            if (opts.showDaysInNextAndPreviousMonths) {\n                arr.push('is-outside-current-month');\n            } else {\n                return '<td class=\"is-empty\"></td>';\n            }\n        }\n        if (opts.isDisabled) {\n            arr.push('is-disabled');\n        }\n        if (opts.isToday) {\n            arr.push('is-today');\n        }\n        if (opts.isSelected) {\n            arr.push('is-selected');\n            ariaSelected = 'true';\n        }\n        if (opts.isInRange) {\n            arr.push('is-inrange');\n        }\n        if (opts.isStartRange) {\n            arr.push('is-startrange');\n        }\n        if (opts.isEndRange) {\n            arr.push('is-endrange');\n        }\n        return '<td data-day=\"' + opts.day + '\" class=\"' + arr.join(' ') + '\" aria-selected=\"' + ariaSelected + '\">' +\n                 '<button class=\"pika-button pika-day\" type=\"button\" ' +\n                    'data-pika-year=\"' + opts.year + '\" data-pika-month=\"' + opts.month + '\" data-pika-day=\"' + opts.day + '\">' +\n                        opts.day +\n                 '</button>' +\n               '</td>';\n    },\n\n    renderWeek = function (d, m, y) {\n        // Lifted from http://javascript.about.com/library/blweekyear.htm, lightly modified.\n        var onejan = new Date(y, 0, 1),\n            weekNum = Math.ceil((((new Date(y, m, d) - onejan) / 86400000) + onejan.getDay()+1)/7);\n        return '<td class=\"pika-week\">' + weekNum + '</td>';\n    },\n\n    renderRow = function(days, isRTL)\n    {\n        return '<tr>' + (isRTL ? days.reverse() : days).join('') + '</tr>';\n    },\n\n    renderBody = function(rows)\n    {\n        return '<tbody>' + rows.join('') + '</tbody>';\n    },\n\n    renderHead = function(opts)\n    {\n        var i, arr = [];\n        if (opts.showWeekNumber) {\n            arr.push('<th></th>');\n        }\n        for (i = 0; i < 7; i++) {\n            arr.push('<th scope=\"col\"><abbr title=\"' + renderDayName(opts, i) + '\">' + renderDayName(opts, i, true) + '</abbr></th>');\n        }\n        return '<thead><tr>' + (opts.isRTL ? arr.reverse() : arr).join('') + '</tr></thead>';\n    },\n\n    renderTitle = function(instance, c, year, month, refYear, randId)\n    {\n        var i, j, arr,\n            opts = instance._o,\n            isMinYear = year === opts.minYear,\n            isMaxYear = year === opts.maxYear,\n            html = '<div id=\"' + randId + '\" class=\"pika-title\" role=\"heading\" aria-live=\"assertive\">',\n            monthHtml,\n            yearHtml,\n            prev = true,\n            next = true;\n\n        for (arr = [], i = 0; i < 12; i++) {\n            arr.push('<option value=\"' + (year === refYear ? i - c : 12 + i - c) + '\"' +\n                (i === month ? ' selected=\"selected\"': '') +\n                ((isMinYear && i < opts.minMonth) || (isMaxYear && i > opts.maxMonth) ? 'disabled=\"disabled\"' : '') + '>' +\n                opts.i18n.months[i] + '</option>');\n        }\n\n        monthHtml = '<div class=\"pika-label\">' + opts.i18n.months[month] + '<select class=\"pika-select pika-select-month\" tabindex=\"-1\">' + arr.join('') + '</select></div>';\n\n        if (isArray(opts.yearRange)) {\n            i = opts.yearRange[0];\n            j = opts.yearRange[1] + 1;\n        } else {\n            i = year - opts.yearRange;\n            j = 1 + year + opts.yearRange;\n        }\n\n        for (arr = []; i < j && i <= opts.maxYear; i++) {\n            if (i >= opts.minYear) {\n                arr.push('<option value=\"' + i + '\"' + (i === year ? ' selected=\"selected\"': '') + '>' + (i) + '</option>');\n            }\n        }\n        yearHtml = '<div class=\"pika-label\">' + year + opts.yearSuffix + '<select class=\"pika-select pika-select-year\" tabindex=\"-1\">' + arr.join('') + '</select></div>';\n\n        if (opts.showMonthAfterYear) {\n            html += yearHtml + monthHtml;\n        } else {\n            html += monthHtml + yearHtml;\n        }\n\n        if (isMinYear && (month === 0 || opts.minMonth >= month)) {\n            prev = false;\n        }\n\n        if (isMaxYear && (month === 11 || opts.maxMonth <= month)) {\n            next = false;\n        }\n\n        if (c === 0) {\n            html += '<button class=\"pika-prev' + (prev ? '' : ' is-disabled') + '\" type=\"button\">' + opts.i18n.previousMonth + '</button>';\n        }\n        if (c === (instance._o.numberOfMonths - 1) ) {\n            html += '<button class=\"pika-next' + (next ? '' : ' is-disabled') + '\" type=\"button\">' + opts.i18n.nextMonth + '</button>';\n        }\n\n        return html += '</div>';\n    },\n\n    renderTable = function(opts, data, randId)\n    {\n        return '<table cellpadding=\"0\" cellspacing=\"0\" class=\"pika-table\" role=\"grid\" aria-labelledby=\"' + randId + '\">' + renderHead(opts) + renderBody(data) + '</table>';\n    },\n\n\n    /**\n     * Pikaday constructor\n     */\n    Pikaday = function(options)\n    {\n        var self = this,\n            opts = self.config(options);\n\n        self._onMouseDown = function(e)\n        {\n            if (!self._v) {\n                return;\n            }\n            e = e || window.event;\n            var target = e.target || e.srcElement;\n            if (!target) {\n                return;\n            }\n\n            if (!hasClass(target, 'is-disabled')) {\n                if (hasClass(target, 'pika-button') && !hasClass(target, 'is-empty') && !hasClass(target.parentNode, 'is-disabled')) {\n                    self.setDate(new Date(target.getAttribute('data-pika-year'), target.getAttribute('data-pika-month'), target.getAttribute('data-pika-day')));\n                    if (opts.bound) {\n                        sto(function() {\n                            self.hide();\n                            if (opts.field) {\n                                opts.field.blur();\n                            }\n                        }, 100);\n                    }\n                }\n                else if (hasClass(target, 'pika-prev')) {\n                    self.prevMonth();\n                }\n                else if (hasClass(target, 'pika-next')) {\n                    self.nextMonth();\n                }\n            }\n            if (!hasClass(target, 'pika-select')) {\n                // if this is touch event prevent mouse events emulation\n                if (e.preventDefault) {\n                    e.preventDefault();\n                } else {\n                    e.returnValue = false;\n                    return false;\n                }\n            } else {\n                self._c = true;\n            }\n        };\n\n        self._onChange = function(e)\n        {\n            e = e || window.event;\n            var target = e.target || e.srcElement;\n            if (!target) {\n                return;\n            }\n            if (hasClass(target, 'pika-select-month')) {\n                self.gotoMonth(target.value);\n            }\n            else if (hasClass(target, 'pika-select-year')) {\n                self.gotoYear(target.value);\n            }\n        };\n\n        self._onKeyChange = function(e)\n        {\n            e = e || window.event;\n\n            if (self.isVisible()) {\n\n                switch(e.keyCode){\n                    case 13:\n                    case 27:\n                        opts.field.blur();\n                        break;\n                    case 37:\n                        e.preventDefault();\n                        self.adjustDate('subtract', 1);\n                        break;\n                    case 38:\n                        self.adjustDate('subtract', 7);\n                        break;\n                    case 39:\n                        self.adjustDate('add', 1);\n                        break;\n                    case 40:\n                        self.adjustDate('add', 7);\n                        break;\n                }\n            }\n        };\n\n        self._onInputChange = function(e)\n        {\n            var date;\n\n            if (e.firedBy === self) {\n                return;\n            }\n            if (hasMoment) {\n                date = moment(opts.field.value, opts.format, opts.formatStrict);\n                date = (date && date.isValid()) ? date.toDate() : null;\n            }\n            else {\n                date = new Date(Date.parse(opts.field.value));\n            }\n            if (isDate(date)) {\n              self.setDate(date);\n            }\n            if (!self._v) {\n                self.show();\n            }\n        };\n\n        self._onInputFocus = function()\n        {\n            self.show();\n        };\n\n        self._onInputClick = function()\n        {\n            self.show();\n        };\n\n        self._onInputBlur = function()\n        {\n            // IE allows pika div to gain focus; catch blur the input field\n            var pEl = document.activeElement;\n            do {\n                if (hasClass(pEl, 'pika-single')) {\n                    return;\n                }\n            }\n            while ((pEl = pEl.parentNode));\n\n            if (!self._c) {\n                self._b = sto(function() {\n                    self.hide();\n                }, 50);\n            }\n            self._c = false;\n        };\n\n        self._onClick = function(e)\n        {\n            e = e || window.event;\n            var target = e.target || e.srcElement,\n                pEl = target;\n            if (!target) {\n                return;\n            }\n            if (!hasEventListeners && hasClass(target, 'pika-select')) {\n                if (!target.onchange) {\n                    target.setAttribute('onchange', 'return;');\n                    addEvent(target, 'change', self._onChange);\n                }\n            }\n            do {\n                if (hasClass(pEl, 'pika-single') || pEl === opts.trigger) {\n                    return;\n                }\n            }\n            while ((pEl = pEl.parentNode));\n            if (self._v && target !== opts.trigger && pEl !== opts.trigger) {\n                self.hide();\n            }\n        };\n\n        self.el = document.createElement('div');\n        self.el.className = 'pika-single' + (opts.isRTL ? ' is-rtl' : '') + (opts.theme ? ' ' + opts.theme : '');\n\n        addEvent(self.el, 'mousedown', self._onMouseDown, true);\n        addEvent(self.el, 'touchend', self._onMouseDown, true);\n        addEvent(self.el, 'change', self._onChange);\n        addEvent(document, 'keydown', self._onKeyChange);\n\n        if (opts.field) {\n            if (opts.container) {\n                opts.container.appendChild(self.el);\n            } else if (opts.bound) {\n                document.body.appendChild(self.el);\n            } else {\n                opts.field.parentNode.insertBefore(self.el, opts.field.nextSibling);\n            }\n            addEvent(opts.field, 'change', self._onInputChange);\n\n            if (!opts.defaultDate) {\n                if (hasMoment && opts.field.value) {\n                    opts.defaultDate = moment(opts.field.value, opts.format).toDate();\n                } else {\n                    opts.defaultDate = new Date(Date.parse(opts.field.value));\n                }\n                opts.setDefaultDate = true;\n            }\n        }\n\n        var defDate = opts.defaultDate;\n\n        if (isDate(defDate)) {\n            if (opts.setDefaultDate) {\n                self.setDate(defDate, true);\n            } else {\n                self.gotoDate(defDate);\n            }\n        } else {\n            self.gotoDate(new Date());\n        }\n\n        if (opts.bound) {\n            this.hide();\n            self.el.className += ' is-bound';\n            addEvent(opts.trigger, 'click', self._onInputClick);\n            addEvent(opts.trigger, 'focus', self._onInputFocus);\n            addEvent(opts.trigger, 'blur', self._onInputBlur);\n        } else {\n            this.show();\n        }\n    };\n\n\n    /**\n     * public Pikaday API\n     */\n    Pikaday.prototype = {\n\n\n        /**\n         * configure functionality\n         */\n        config: function(options)\n        {\n            if (!this._o) {\n                this._o = extend({}, defaults, true);\n            }\n\n            var opts = extend(this._o, options, true);\n\n            opts.isRTL = !!opts.isRTL;\n\n            opts.field = (opts.field && opts.field.nodeName) ? opts.field : null;\n\n            opts.theme = (typeof opts.theme) === 'string' && opts.theme ? opts.theme : null;\n\n            opts.bound = !!(opts.bound !== undefined ? opts.field && opts.bound : opts.field);\n\n            opts.trigger = (opts.trigger && opts.trigger.nodeName) ? opts.trigger : opts.field;\n\n            opts.disableWeekends = !!opts.disableWeekends;\n\n            opts.disableDayFn = (typeof opts.disableDayFn) === 'function' ? opts.disableDayFn : null;\n\n            var nom = parseInt(opts.numberOfMonths, 10) || 1;\n            opts.numberOfMonths = nom > 4 ? 4 : nom;\n\n            if (!isDate(opts.minDate)) {\n                opts.minDate = false;\n            }\n            if (!isDate(opts.maxDate)) {\n                opts.maxDate = false;\n            }\n            if ((opts.minDate && opts.maxDate) && opts.maxDate < opts.minDate) {\n                opts.maxDate = opts.minDate = false;\n            }\n            if (opts.minDate) {\n                this.setMinDate(opts.minDate);\n            }\n            if (opts.maxDate) {\n                this.setMaxDate(opts.maxDate);\n            }\n\n            if (isArray(opts.yearRange)) {\n                var fallback = new Date().getFullYear() - 10;\n                opts.yearRange[0] = parseInt(opts.yearRange[0], 10) || fallback;\n                opts.yearRange[1] = parseInt(opts.yearRange[1], 10) || fallback;\n            } else {\n                opts.yearRange = Math.abs(parseInt(opts.yearRange, 10)) || defaults.yearRange;\n                if (opts.yearRange > 100) {\n                    opts.yearRange = 100;\n                }\n            }\n\n            return opts;\n        },\n\n        /**\n         * return a formatted string of the current selection (using Moment.js if available)\n         */\n        toString: function(format)\n        {\n            return !isDate(this._d) ? '' : hasMoment ? moment(this._d).format(format || this._o.format) : this._d.toDateString();\n        },\n\n        /**\n         * return a Moment.js object of the current selection (if available)\n         */\n        getMoment: function()\n        {\n            return hasMoment ? moment(this._d) : null;\n        },\n\n        /**\n         * set the current selection from a Moment.js object (if available)\n         */\n        setMoment: function(date, preventOnSelect)\n        {\n            if (hasMoment && moment.isMoment(date)) {\n                this.setDate(date.toDate(), preventOnSelect);\n            }\n        },\n\n        /**\n         * return a Date object of the current selection with fallback for the current date\n         */\n        getDate: function()\n        {\n            return isDate(this._d) ? new Date(this._d.getTime()) : new Date();\n        },\n\n        /**\n         * set the current selection\n         */\n        setDate: function(date, preventOnSelect)\n        {\n            if (!date) {\n                this._d = null;\n\n                if (this._o.field) {\n                    this._o.field.value = '';\n                    fireEvent(this._o.field, 'change', { firedBy: this });\n                }\n\n                return this.draw();\n            }\n            if (typeof date === 'string') {\n                date = new Date(Date.parse(date));\n            }\n            if (!isDate(date)) {\n                return;\n            }\n\n            var min = this._o.minDate,\n                max = this._o.maxDate;\n\n            if (isDate(min) && date < min) {\n                date = min;\n            } else if (isDate(max) && date > max) {\n                date = max;\n            }\n\n            this._d = new Date(date.getTime());\n            setToStartOfDay(this._d);\n            this.gotoDate(this._d);\n\n            if (this._o.field) {\n                this._o.field.value = this.toString();\n                fireEvent(this._o.field, 'change', { firedBy: this });\n            }\n            if (!preventOnSelect && typeof this._o.onSelect === 'function') {\n                this._o.onSelect.call(this, this.getDate());\n            }\n        },\n\n        /**\n         * change view to a specific date\n         */\n        gotoDate: function(date)\n        {\n            var newCalendar = true;\n\n            if (!isDate(date)) {\n                return;\n            }\n\n            if (this.calendars) {\n                var firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1),\n                    lastVisibleDate = new Date(this.calendars[this.calendars.length-1].year, this.calendars[this.calendars.length-1].month, 1),\n                    visibleDate = date.getTime();\n                // get the end of the month\n                lastVisibleDate.setMonth(lastVisibleDate.getMonth()+1);\n                lastVisibleDate.setDate(lastVisibleDate.getDate()-1);\n                newCalendar = (visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate);\n            }\n\n            if (newCalendar) {\n                this.calendars = [{\n                    month: date.getMonth(),\n                    year: date.getFullYear()\n                }];\n                if (this._o.mainCalendar === 'right') {\n                    this.calendars[0].month += 1 - this._o.numberOfMonths;\n                }\n            }\n\n            this.adjustCalendars();\n        },\n\n        adjustDate: function(sign, days) {\n\n            var day = this.getDate();\n            var difference = parseInt(days)*24*60*60*1000;\n\n            var newDay;\n\n            if (sign === 'add') {\n                newDay = new Date(day.valueOf() + difference);\n            } else if (sign === 'subtract') {\n                newDay = new Date(day.valueOf() - difference);\n            }\n\n            if (hasMoment) {\n                if (sign === 'add') {\n                    newDay = moment(day).add(days, \"days\").toDate();\n                } else if (sign === 'subtract') {\n                    newDay = moment(day).subtract(days, \"days\").toDate();\n                }\n            }\n\n            this.setDate(newDay);\n        },\n\n        adjustCalendars: function() {\n            this.calendars[0] = adjustCalendar(this.calendars[0]);\n            for (var c = 1; c < this._o.numberOfMonths; c++) {\n                this.calendars[c] = adjustCalendar({\n                    month: this.calendars[0].month + c,\n                    year: this.calendars[0].year\n                });\n            }\n            this.draw();\n        },\n\n        gotoToday: function()\n        {\n            this.gotoDate(new Date());\n        },\n\n        /**\n         * change view to a specific month (zero-index, e.g. 0: January)\n         */\n        gotoMonth: function(month)\n        {\n            if (!isNaN(month)) {\n                this.calendars[0].month = parseInt(month, 10);\n                this.adjustCalendars();\n            }\n        },\n\n        nextMonth: function()\n        {\n            this.calendars[0].month++;\n            this.adjustCalendars();\n        },\n\n        prevMonth: function()\n        {\n            this.calendars[0].month--;\n            this.adjustCalendars();\n        },\n\n        /**\n         * change view to a specific full year (e.g. \"2012\")\n         */\n        gotoYear: function(year)\n        {\n            if (!isNaN(year)) {\n                this.calendars[0].year = parseInt(year, 10);\n                this.adjustCalendars();\n            }\n        },\n\n        /**\n         * change the minDate\n         */\n        setMinDate: function(value)\n        {\n            if(value instanceof Date) {\n                setToStartOfDay(value);\n                this._o.minDate = value;\n                this._o.minYear  = value.getFullYear();\n                this._o.minMonth = value.getMonth();\n            } else {\n                this._o.minDate = defaults.minDate;\n                this._o.minYear  = defaults.minYear;\n                this._o.minMonth = defaults.minMonth;\n                this._o.startRange = defaults.startRange;\n            }\n\n            this.draw();\n        },\n\n        /**\n         * change the maxDate\n         */\n        setMaxDate: function(value)\n        {\n            if(value instanceof Date) {\n                setToStartOfDay(value);\n                this._o.maxDate = value;\n                this._o.maxYear = value.getFullYear();\n                this._o.maxMonth = value.getMonth();\n            } else {\n                this._o.maxDate = defaults.maxDate;\n                this._o.maxYear = defaults.maxYear;\n                this._o.maxMonth = defaults.maxMonth;\n                this._o.endRange = defaults.endRange;\n            }\n\n            this.draw();\n        },\n\n        setStartRange: function(value)\n        {\n            this._o.startRange = value;\n        },\n\n        setEndRange: function(value)\n        {\n            this._o.endRange = value;\n        },\n\n        /**\n         * refresh the HTML\n         */\n        draw: function(force)\n        {\n            if (!this._v && !force) {\n                return;\n            }\n            var opts = this._o,\n                minYear = opts.minYear,\n                maxYear = opts.maxYear,\n                minMonth = opts.minMonth,\n                maxMonth = opts.maxMonth,\n                html = '',\n                randId;\n\n            if (this._y <= minYear) {\n                this._y = minYear;\n                if (!isNaN(minMonth) && this._m < minMonth) {\n                    this._m = minMonth;\n                }\n            }\n            if (this._y >= maxYear) {\n                this._y = maxYear;\n                if (!isNaN(maxMonth) && this._m > maxMonth) {\n                    this._m = maxMonth;\n                }\n            }\n\n            randId = 'pika-title-' + Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 2);\n\n            for (var c = 0; c < opts.numberOfMonths; c++) {\n                html += '<div class=\"pika-lendar\">' + renderTitle(this, c, this.calendars[c].year, this.calendars[c].month, this.calendars[0].year, randId) + this.render(this.calendars[c].year, this.calendars[c].month, randId) + '</div>';\n            }\n\n            this.el.innerHTML = html;\n\n            if (opts.bound) {\n                if(opts.field.type !== 'hidden') {\n                    sto(function() {\n                        opts.trigger.focus();\n                    }, 1);\n                }\n            }\n\n            if (typeof this._o.onDraw === 'function') {\n                this._o.onDraw(this);\n            }\n            \n            if (opts.bound) {\n                // let the screen reader user know to use arrow keys\n                opts.field.setAttribute('aria-label', 'Use the arrow keys to pick a date');\n            }\n        },\n\n        adjustPosition: function()\n        {\n            var field, pEl, width, height, viewportWidth, viewportHeight, scrollTop, left, top, clientRect;\n\n            if (this._o.container) return;\n\n            this.el.style.position = 'absolute';\n\n            field = this._o.trigger;\n            pEl = field;\n            width = this.el.offsetWidth;\n            height = this.el.offsetHeight;\n            viewportWidth = window.innerWidth || document.documentElement.clientWidth;\n            viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n            scrollTop = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;\n\n            if (typeof field.getBoundingClientRect === 'function') {\n                clientRect = field.getBoundingClientRect();\n                left = clientRect.left + window.pageXOffset;\n                top = clientRect.bottom + window.pageYOffset;\n            } else {\n                left = pEl.offsetLeft;\n                top  = pEl.offsetTop + pEl.offsetHeight;\n                while((pEl = pEl.offsetParent)) {\n                    left += pEl.offsetLeft;\n                    top  += pEl.offsetTop;\n                }\n            }\n\n            // default position is bottom & left\n            if ((this._o.reposition && left + width > viewportWidth) ||\n                (\n                    this._o.position.indexOf('right') > -1 &&\n                    left - width + field.offsetWidth > 0\n                )\n            ) {\n                left = left - width + field.offsetWidth;\n            }\n            if ((this._o.reposition && top + height > viewportHeight + scrollTop) ||\n                (\n                    this._o.position.indexOf('top') > -1 &&\n                    top - height - field.offsetHeight > 0\n                )\n            ) {\n                top = top - height - field.offsetHeight;\n            }\n\n            this.el.style.left = left + 'px';\n            this.el.style.top = top + 'px';\n        },\n\n        /**\n         * render HTML for a particular month\n         */\n        render: function(year, month, randId)\n        {\n            var opts   = this._o,\n                now    = new Date(),\n                days   = getDaysInMonth(year, month),\n                before = new Date(year, month, 1).getDay(),\n                data   = [],\n                row    = [];\n            setToStartOfDay(now);\n            if (opts.firstDay > 0) {\n                before -= opts.firstDay;\n                if (before < 0) {\n                    before += 7;\n                }\n            }\n            var previousMonth = month === 0 ? 11 : month - 1,\n                nextMonth = month === 11 ? 0 : month + 1,\n                yearOfPreviousMonth = month === 0 ? year - 1 : year,\n                yearOfNextMonth = month === 11 ? year + 1 : year,\n                daysInPreviousMonth = getDaysInMonth(yearOfPreviousMonth, previousMonth);\n            var cells = days + before,\n                after = cells;\n            while(after > 7) {\n                after -= 7;\n            }\n            cells += 7 - after;\n            for (var i = 0, r = 0; i < cells; i++)\n            {\n                var day = new Date(year, month, 1 + (i - before)),\n                    isSelected = isDate(this._d) ? compareDates(day, this._d) : false,\n                    isToday = compareDates(day, now),\n                    isEmpty = i < before || i >= (days + before),\n                    dayNumber = 1 + (i - before),\n                    monthNumber = month,\n                    yearNumber = year,\n                    isStartRange = opts.startRange && compareDates(opts.startRange, day),\n                    isEndRange = opts.endRange && compareDates(opts.endRange, day),\n                    isInRange = opts.startRange && opts.endRange && opts.startRange < day && day < opts.endRange,\n                    isDisabled = (opts.minDate && day < opts.minDate) ||\n                                 (opts.maxDate && day > opts.maxDate) ||\n                                 (opts.disableWeekends && isWeekend(day)) ||\n                                 (opts.disableDayFn && opts.disableDayFn(day));\n\n                if (isEmpty) {\n                    if (i < before) {\n                        dayNumber = daysInPreviousMonth + dayNumber;\n                        monthNumber = previousMonth;\n                        yearNumber = yearOfPreviousMonth;\n                    } else {\n                        dayNumber = dayNumber - days;\n                        monthNumber = nextMonth;\n                        yearNumber = yearOfNextMonth;\n                    }\n                }\n\n                var dayConfig = {\n                        day: dayNumber,\n                        month: monthNumber,\n                        year: yearNumber,\n                        isSelected: isSelected,\n                        isToday: isToday,\n                        isDisabled: isDisabled,\n                        isEmpty: isEmpty,\n                        isStartRange: isStartRange,\n                        isEndRange: isEndRange,\n                        isInRange: isInRange,\n                        showDaysInNextAndPreviousMonths: opts.showDaysInNextAndPreviousMonths\n                    };\n\n                row.push(renderDay(dayConfig));\n\n                if (++r === 7) {\n                    if (opts.showWeekNumber) {\n                        row.unshift(renderWeek(i - before, month, year));\n                    }\n                    data.push(renderRow(row, opts.isRTL));\n                    row = [];\n                    r = 0;\n                }\n            }\n            return renderTable(opts, data, randId);\n        },\n\n        isVisible: function()\n        {\n            return this._v;\n        },\n\n        show: function()\n        {\n            if (!this.isVisible()) {\n                removeClass(this.el, 'is-hidden');\n                this._v = true;\n                this.draw();\n                if (this._o.bound) {\n                    addEvent(document, 'click', this._onClick);\n                    this.adjustPosition();\n                }\n                if (typeof this._o.onOpen === 'function') {\n                    this._o.onOpen.call(this);\n                }\n            }\n        },\n\n        hide: function()\n        {\n            var v = this._v;\n            if (v !== false) {\n                if (this._o.bound) {\n                    removeEvent(document, 'click', this._onClick);\n                }\n                this.el.style.position = 'static'; // reset\n                this.el.style.left = 'auto';\n                this.el.style.top = 'auto';\n                addClass(this.el, 'is-hidden');\n                this._v = false;\n                if (v !== undefined && typeof this._o.onClose === 'function') {\n                    this._o.onClose.call(this);\n                }\n            }\n        },\n\n        /**\n         * GAME OVER\n         */\n        destroy: function()\n        {\n            this.hide();\n            removeEvent(this.el, 'mousedown', this._onMouseDown, true);\n            removeEvent(this.el, 'touchend', this._onMouseDown, true);\n            removeEvent(this.el, 'change', this._onChange);\n            if (this._o.field) {\n                removeEvent(this._o.field, 'change', this._onInputChange);\n                if (this._o.bound) {\n                    removeEvent(this._o.trigger, 'click', this._onInputClick);\n                    removeEvent(this._o.trigger, 'focus', this._onInputFocus);\n                    removeEvent(this._o.trigger, 'blur', this._onInputBlur);\n                }\n            }\n            if (this.el.parentNode) {\n                this.el.parentNode.removeChild(this.el);\n            }\n        }\n\n    };\n\n    return Pikaday;\n\n}));\n\n\n/***/ }),\n/* 359 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 360 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _autocompleteEditor = __webpack_require__(307);\n\nvar _autocompleteEditor2 = _interopRequireDefault(_autocompleteEditor);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor DropdownEditor\n * @class DropdownEditor\n * @dependencies AutocompleteEditor\n */\nvar DropdownEditor = function (_AutocompleteEditor) {\n  _inherits(DropdownEditor, _AutocompleteEditor);\n\n  function DropdownEditor() {\n    _classCallCheck(this, DropdownEditor);\n\n    return _possibleConstructorReturn(this, (DropdownEditor.__proto__ || Object.getPrototypeOf(DropdownEditor)).apply(this, arguments));\n  }\n\n  _createClass(DropdownEditor, [{\n    key: 'prepare',\n    value: function prepare(row, col, prop, td, originalValue, cellProperties) {\n      _get(DropdownEditor.prototype.__proto__ || Object.getPrototypeOf(DropdownEditor.prototype), 'prepare', this).call(this, row, col, prop, td, originalValue, cellProperties);\n      this.cellProperties.filter = false;\n      this.cellProperties.strict = true;\n    }\n  }]);\n\n  return DropdownEditor;\n}(_autocompleteEditor2.default);\n\n_pluginHooks2.default.getSingleton().add('beforeValidate', function (value, row, col, source) {\n  var cellMeta = this.getCellMeta(row, this.propToCol(col));\n\n  if (cellMeta.editor === DropdownEditor) {\n    if (cellMeta.strict === void 0) {\n      cellMeta.filter = false;\n      cellMeta.strict = true;\n    }\n  }\n});\n\nexports.default = DropdownEditor;\n\n/***/ }),\n/* 361 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor NumericEditor\n * @class NumericEditor\n */\nvar NumericEditor = function (_TextEditor) {\n  _inherits(NumericEditor, _TextEditor);\n\n  function NumericEditor() {\n    _classCallCheck(this, NumericEditor);\n\n    return _possibleConstructorReturn(this, (NumericEditor.__proto__ || Object.getPrototypeOf(NumericEditor)).apply(this, arguments));\n  }\n\n  return NumericEditor;\n}(_textEditor2.default);\n\nexports.default = NumericEditor;\n\n/***/ }),\n/* 362 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _element = __webpack_require__(0);\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor PasswordEditor\n * @class PasswordEditor\n * @dependencies TextEditor\n */\nvar PasswordEditor = function (_TextEditor) {\n  _inherits(PasswordEditor, _TextEditor);\n\n  function PasswordEditor() {\n    _classCallCheck(this, PasswordEditor);\n\n    return _possibleConstructorReturn(this, (PasswordEditor.__proto__ || Object.getPrototypeOf(PasswordEditor)).apply(this, arguments));\n  }\n\n  _createClass(PasswordEditor, [{\n    key: 'createElements',\n    value: function createElements() {\n      _get(PasswordEditor.prototype.__proto__ || Object.getPrototypeOf(PasswordEditor.prototype), 'createElements', this).call(this);\n\n      this.TEXTAREA = document.createElement('input');\n      this.TEXTAREA.setAttribute('type', 'password');\n      this.TEXTAREA.className = 'handsontableInput';\n      this.textareaStyle = this.TEXTAREA.style;\n      this.textareaStyle.width = 0;\n      this.textareaStyle.height = 0;\n\n      (0, _element.empty)(this.TEXTAREA_PARENT);\n      this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n    }\n  }]);\n\n  return PasswordEditor;\n}(_textEditor2.default);\n\nexports.default = PasswordEditor;\n\n/***/ }),\n/* 363 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _element = __webpack_require__(0);\n\nvar _event = __webpack_require__(12);\n\nvar _unicode = __webpack_require__(21);\n\nvar _baseEditor = __webpack_require__(54);\n\nvar _baseEditor2 = _interopRequireDefault(_baseEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SelectEditor = _baseEditor2.default.prototype.extend();\n\n/**\n * @private\n * @editor SelectEditor\n * @class SelectEditor\n */\nSelectEditor.prototype.init = function () {\n  this.select = document.createElement('SELECT');\n  (0, _element.addClass)(this.select, 'htSelectEditor');\n  this.select.style.display = 'none';\n  this.instance.rootElement.appendChild(this.select);\n  this.registerHooks();\n};\n\nSelectEditor.prototype.registerHooks = function () {\n  var _this = this;\n\n  this.instance.addHook('afterScrollHorizontally', function () {\n    return _this.refreshDimensions();\n  });\n  this.instance.addHook('afterScrollVertically', function () {\n    return _this.refreshDimensions();\n  });\n  this.instance.addHook('afterColumnResize', function () {\n    return _this.refreshDimensions();\n  });\n  this.instance.addHook('afterRowResize', function () {\n    return _this.refreshDimensions();\n  });\n};\n\nSelectEditor.prototype.prepare = function () {\n  _baseEditor2.default.prototype.prepare.apply(this, arguments);\n\n  var selectOptions = this.cellProperties.selectOptions;\n  var options;\n\n  if (typeof selectOptions == 'function') {\n    options = this.prepareOptions(selectOptions(this.row, this.col, this.prop));\n  } else {\n    options = this.prepareOptions(selectOptions);\n  }\n\n  (0, _element.empty)(this.select);\n\n  for (var option in options) {\n    if (Object.prototype.hasOwnProperty.call(options, option)) {\n      var optionElement = document.createElement('OPTION');\n      optionElement.value = option;\n      (0, _element.fastInnerHTML)(optionElement, options[option]);\n      this.select.appendChild(optionElement);\n    }\n  }\n};\n\nSelectEditor.prototype.prepareOptions = function (optionsToPrepare) {\n  var preparedOptions = {};\n\n  if (Array.isArray(optionsToPrepare)) {\n    for (var i = 0, len = optionsToPrepare.length; i < len; i++) {\n      preparedOptions[optionsToPrepare[i]] = optionsToPrepare[i];\n    }\n  } else if ((typeof optionsToPrepare === 'undefined' ? 'undefined' : _typeof(optionsToPrepare)) == 'object') {\n    preparedOptions = optionsToPrepare;\n  }\n\n  return preparedOptions;\n};\n\nSelectEditor.prototype.getValue = function () {\n  return this.select.value;\n};\n\nSelectEditor.prototype.setValue = function (value) {\n  this.select.value = value;\n};\n\nvar onBeforeKeyDown = function onBeforeKeyDown(event) {\n  var instance = this;\n  var editor = instance.getActiveEditor();\n\n  switch (event.keyCode) {\n    case _unicode.KEY_CODES.ARROW_UP:\n      var previousOptionIndex = editor.select.selectedIndex - 1;\n      if (previousOptionIndex >= 0) {\n        editor.select[previousOptionIndex].selected = true;\n      }\n\n      (0, _event.stopImmediatePropagation)(event);\n      event.preventDefault();\n      break;\n\n    case _unicode.KEY_CODES.ARROW_DOWN:\n      var nextOptionIndex = editor.select.selectedIndex + 1;\n      if (nextOptionIndex <= editor.select.length - 1) {\n        editor.select[nextOptionIndex].selected = true;\n      }\n\n      (0, _event.stopImmediatePropagation)(event);\n      event.preventDefault();\n      break;\n    default:\n      break;\n  }\n};\n\nSelectEditor.prototype.open = function () {\n  this._opened = true;\n  this.refreshDimensions();\n  this.select.style.display = '';\n  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);\n};\n\nSelectEditor.prototype.close = function () {\n  this._opened = false;\n  this.select.style.display = 'none';\n  this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n};\n\nSelectEditor.prototype.focus = function () {\n  this.select.focus();\n};\n\nSelectEditor.prototype.refreshValue = function () {\n  var sourceData = this.instance.getSourceDataAtCell(this.row, this.prop);\n  this.originalValue = sourceData;\n\n  this.setValue(sourceData);\n  this.refreshDimensions();\n};\n\nSelectEditor.prototype.refreshDimensions = function () {\n  if (this.state !== _baseEditor.EditorState.EDITING) {\n    return;\n  }\n  this.TD = this.getEditedCell();\n\n  // TD is outside of the viewport.\n  if (!this.TD) {\n    this.close();\n\n    return;\n  }\n  var width = (0, _element.outerWidth)(this.TD) + 1,\n      height = (0, _element.outerHeight)(this.TD) + 1,\n      currentOffset = (0, _element.offset)(this.TD),\n      containerOffset = (0, _element.offset)(this.instance.rootElement),\n      scrollableContainer = (0, _element.getScrollableElement)(this.TD),\n      editTop = currentOffset.top - containerOffset.top - 1 - (scrollableContainer.scrollTop || 0),\n      editLeft = currentOffset.left - containerOffset.left - 1 - (scrollableContainer.scrollLeft || 0),\n      editorSection = this.checkEditorSection(),\n      cssTransformOffset;\n\n  var settings = this.instance.getSettings();\n  var rowHeadersCount = settings.rowHeaders ? 1 : 0;\n  var colHeadersCount = settings.colHeaders ? 1 : 0;\n\n  switch (editorSection) {\n    case 'top':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'left':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'top-left-corner':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'bottom-left-corner':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'bottom':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.holder.parentNode);\n      break;\n    default:\n      break;\n  }\n  if (this.instance.getSelectedLast()[0] === 0) {\n    editTop += 1;\n  }\n\n  if (this.instance.getSelectedLast()[1] === 0) {\n    editLeft += 1;\n  }\n\n  var selectStyle = this.select.style;\n\n  if (cssTransformOffset && cssTransformOffset != -1) {\n    selectStyle[cssTransformOffset[0]] = cssTransformOffset[1];\n  } else {\n    (0, _element.resetCssTransform)(this.select);\n  }\n  var cellComputedStyle = (0, _element.getComputedStyle)(this.TD);\n\n  if (parseInt(cellComputedStyle.borderTopWidth, 10) > 0) {\n    height -= 1;\n  }\n  if (parseInt(cellComputedStyle.borderLeftWidth, 10) > 0) {\n    width -= 1;\n  }\n\n  selectStyle.height = height + 'px';\n  selectStyle.minWidth = width + 'px';\n  selectStyle.top = editTop + 'px';\n  selectStyle.left = editLeft + 'px';\n  selectStyle.margin = '0px';\n};\n\nSelectEditor.prototype.getEditedCell = function () {\n  var editorSection = this.checkEditorSection(),\n      editedCell;\n\n  switch (editorSection) {\n    case 'top':\n      editedCell = this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.select.style.zIndex = 101;\n      break;\n    case 'corner':\n      editedCell = this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.select.style.zIndex = 103;\n      break;\n    case 'left':\n      editedCell = this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.select.style.zIndex = 102;\n      break;\n    default:\n      editedCell = this.instance.getCell(this.row, this.col);\n      this.select.style.zIndex = '';\n      break;\n  }\n\n  return editedCell != -1 && editedCell != -2 ? editedCell : void 0;\n};\n\nexports.default = SelectEditor;\n\n/***/ }),\n/* 364 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nfunction cellDecorator(instance, TD, row, col, prop, value, cellProperties) {\n  var classesToAdd = [];\n  var classesToRemove = [];\n\n  if (cellProperties.className) {\n    if (TD.className) {\n      TD.className = TD.className + ' ' + cellProperties.className;\n    } else {\n      TD.className = cellProperties.className;\n    }\n  }\n\n  if (cellProperties.readOnly) {\n    classesToAdd.push(cellProperties.readOnlyCellClassName);\n  }\n\n  if (cellProperties.valid === false && cellProperties.invalidCellClassName) {\n    classesToAdd.push(cellProperties.invalidCellClassName);\n  } else {\n    classesToRemove.push(cellProperties.invalidCellClassName);\n  }\n\n  if (cellProperties.wordWrap === false && cellProperties.noWordWrapClassName) {\n    classesToAdd.push(cellProperties.noWordWrapClassName);\n  }\n\n  if (!value && cellProperties.placeholder) {\n    classesToAdd.push(cellProperties.placeholderCellClassName);\n  }\n\n  (0, _element.removeClass)(TD, classesToRemove);\n  (0, _element.addClass)(TD, classesToAdd);\n} /**\n   * Adds appropriate CSS class to table cell, based on cellProperties\n   */\nexports.default = cellDecorator;\n\n/***/ }),\n/* 365 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _src = __webpack_require__(4);\n\nvar _index = __webpack_require__(13);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar clonableWRAPPER = document.createElement('DIV');\nclonableWRAPPER.className = 'htAutocompleteWrapper';\n\nvar clonableARROW = document.createElement('DIV');\nclonableARROW.className = 'htAutocompleteArrow';\n// workaround for https://github.com/handsontable/handsontable/issues/1946\n// this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\nclonableARROW.appendChild(document.createTextNode(String.fromCharCode(9660)));\n\nvar wrapTdContentWithWrapper = function wrapTdContentWithWrapper(TD, WRAPPER) {\n  WRAPPER.innerHTML = TD.innerHTML;\n  (0, _element.empty)(TD);\n  TD.appendChild(WRAPPER);\n};\n\n/**\n * Autocomplete renderer\n *\n * @private\n * @renderer AutocompleteRenderer\n * @param {Object} instance Handsontable instance\n * @param {Element} TD Table cell where to render\n * @param {Number} row\n * @param {Number} col\n * @param {String|Number} prop Row object property name\n * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)\n * @param {Object} cellProperties Cell properites (shared by cell renderer and editor)\n */\nfunction autocompleteRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  var WRAPPER = clonableWRAPPER.cloneNode(true); // this is faster than createElement\n  var ARROW = clonableARROW.cloneNode(true); // this is faster than createElement\n\n  if (cellProperties.allowHtml) {\n    (0, _index.getRenderer)('html').apply(this, arguments);\n  } else {\n    (0, _index.getRenderer)('text').apply(this, arguments);\n  }\n\n  TD.appendChild(ARROW);\n  (0, _element.addClass)(TD, 'htAutocomplete');\n\n  if (!TD.firstChild) {\n    // http://jsperf.com/empty-node-if-needed\n    // otherwise empty fields appear borderless in demo/renderers.html (IE)\n    TD.appendChild(document.createTextNode(String.fromCharCode(160))); // workaround for https://github.com/handsontable/handsontable/issues/1946\n    // this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\n  }\n\n  if (!instance.acArrowListener) {\n    var eventManager = new _eventManager2.default(instance);\n\n    // not very elegant but easy and fast\n    instance.acArrowListener = function (event) {\n      if ((0, _element.hasClass)(event.target, 'htAutocompleteArrow')) {\n        instance.view.wt.getSetting('onCellDblClick', null, new _src.CellCoords(row, col), TD);\n      }\n    };\n\n    eventManager.addEventListener(instance.rootElement, 'mousedown', instance.acArrowListener);\n\n    // We need to unbind the listener after the table has been destroyed\n    instance.addHookOnce('afterDestroy', function () {\n      eventManager.destroy();\n    });\n  }\n}\n\nexports.default = autocompleteRenderer;\n\n/***/ }),\n/* 366 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _string = __webpack_require__(36);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _unicode = __webpack_require__(21);\n\nvar _function = __webpack_require__(43);\n\nvar _event = __webpack_require__(12);\n\nvar _index = __webpack_require__(13);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar isListeningKeyDownEvent = new WeakMap();\nvar isCheckboxListenerAdded = new WeakMap();\nvar BAD_VALUE_CLASS = 'htBadValue';\n\n/**\n * Checkbox renderer\n *\n * @private\n * @param {Object} instance Handsontable instance\n * @param {Element} TD Table cell where to render\n * @param {Number} row\n * @param {Number} col\n * @param {String|Number} prop Row object property name\n * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)\n * @param {Object} cellProperties Cell properties (shared by cell renderer and editor)\n */\nfunction checkboxRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  (0, _index.getRenderer)('base').apply(this, arguments);\n\n  var eventManager = registerEvents(instance);\n  var input = createInput();\n  var labelOptions = cellProperties.label;\n  var badValue = false;\n\n  if (typeof cellProperties.checkedTemplate === 'undefined') {\n    cellProperties.checkedTemplate = true;\n  }\n  if (typeof cellProperties.uncheckedTemplate === 'undefined') {\n    cellProperties.uncheckedTemplate = false;\n  }\n\n  (0, _element.empty)(TD); // TODO identify under what circumstances this line can be removed\n\n  if (value === cellProperties.checkedTemplate || (0, _string.equalsIgnoreCase)(value, cellProperties.checkedTemplate)) {\n    input.checked = true;\n  } else if (value === cellProperties.uncheckedTemplate || (0, _string.equalsIgnoreCase)(value, cellProperties.uncheckedTemplate)) {\n    input.checked = false;\n  } else if (value === null) {\n    // default value\n    (0, _element.addClass)(input, 'noValue');\n  } else {\n    input.style.display = 'none';\n    (0, _element.addClass)(input, BAD_VALUE_CLASS);\n    badValue = true;\n  }\n\n  input.setAttribute('data-row', row);\n  input.setAttribute('data-col', col);\n\n  if (!badValue && labelOptions) {\n    var labelText = '';\n\n    if (labelOptions.value) {\n      labelText = typeof labelOptions.value === 'function' ? labelOptions.value.call(this, row, col, prop, value) : labelOptions.value;\n    } else if (labelOptions.property) {\n      labelText = instance.getDataAtRowProp(row, labelOptions.property);\n    }\n    var label = createLabel(labelText);\n\n    if (labelOptions.position === 'before') {\n      label.appendChild(input);\n    } else {\n      label.insertBefore(input, label.firstChild);\n    }\n    input = label;\n  }\n\n  TD.appendChild(input);\n\n  if (badValue) {\n    TD.appendChild(document.createTextNode('#bad-value#'));\n  }\n\n  if (!isListeningKeyDownEvent.has(instance)) {\n    isListeningKeyDownEvent.set(instance, true);\n    instance.addHook('beforeKeyDown', onBeforeKeyDown);\n  }\n\n  /**\n   * On before key down DOM listener.\n   *\n   * @private\n   * @param {Event} event\n   */\n  function onBeforeKeyDown(event) {\n    var toggleKeys = 'SPACE|ENTER';\n    var switchOffKeys = 'DELETE|BACKSPACE';\n    var isKeyCode = (0, _function.partial)(_unicode.isKey, event.keyCode);\n\n    if (isKeyCode(toggleKeys + '|' + switchOffKeys) && !(0, _event.isImmediatePropagationStopped)(event)) {\n      eachSelectedCheckboxCell(function () {\n        (0, _event.stopImmediatePropagation)(event);\n        event.preventDefault();\n      });\n    }\n    if (isKeyCode(toggleKeys)) {\n      changeSelectedCheckboxesState();\n    }\n    if (isKeyCode(switchOffKeys)) {\n      changeSelectedCheckboxesState(true);\n    }\n  }\n\n  /**\n   * Change checkbox checked property\n   *\n   * @private\n   * @param {Boolean} [uncheckCheckbox=false]\n   */\n  function changeSelectedCheckboxesState() {\n    var uncheckCheckbox = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n    var selRange = instance.getSelectedRangeLast();\n\n    if (!selRange) {\n      return;\n    }\n\n    var _selRange$getTopLeftC = selRange.getTopLeftCorner(),\n        startRow = _selRange$getTopLeftC.row,\n        startColumn = _selRange$getTopLeftC.col;\n\n    var _selRange$getBottomRi = selRange.getBottomRightCorner(),\n        endRow = _selRange$getBottomRi.row,\n        endColumn = _selRange$getBottomRi.col;\n\n    var changes = [];\n\n    for (var _row = startRow; _row <= endRow; _row += 1) {\n      for (var _col = startColumn; _col <= endColumn; _col += 1) {\n        var _cellProperties = instance.getCellMeta(_row, _col);\n\n        if (_cellProperties.type !== 'checkbox') {\n          return;\n        }\n\n        /* eslint-disable no-continue */\n        if (_cellProperties.readOnly === true) {\n          continue;\n        }\n\n        if (typeof _cellProperties.checkedTemplate === 'undefined') {\n          _cellProperties.checkedTemplate = true;\n        }\n        if (typeof _cellProperties.uncheckedTemplate === 'undefined') {\n          _cellProperties.uncheckedTemplate = false;\n        }\n\n        var dataAtCell = instance.getDataAtCell(_row, _col);\n\n        if (uncheckCheckbox === false) {\n          if ([_cellProperties.checkedTemplate, _cellProperties.checkedTemplate.toString()].includes(dataAtCell)) {\n            changes.push([_row, _col, _cellProperties.uncheckedTemplate]);\n          } else if ([_cellProperties.uncheckedTemplate, _cellProperties.uncheckedTemplate.toString(), null, void 0].includes(dataAtCell)) {\n            changes.push([_row, _col, _cellProperties.checkedTemplate]);\n          }\n        } else {\n          changes.push([_row, _col, _cellProperties.uncheckedTemplate]);\n        }\n      }\n    }\n\n    if (changes.length > 0) {\n      instance.setDataAtCell(changes);\n    }\n  }\n\n  /**\n   * Call callback for each found selected cell with checkbox type.\n   *\n   * @private\n   * @param {Function} callback\n   */\n  function eachSelectedCheckboxCell(callback) {\n    var selRange = instance.getSelectedRangeLast();\n\n    if (!selRange) {\n      return;\n    }\n    var topLeft = selRange.getTopLeftCorner();\n    var bottomRight = selRange.getBottomRightCorner();\n\n    for (var _row2 = topLeft.row; _row2 <= bottomRight.row; _row2++) {\n      for (var _col2 = topLeft.col; _col2 <= bottomRight.col; _col2++) {\n        var _cellProperties2 = instance.getCellMeta(_row2, _col2);\n\n        if (_cellProperties2.type !== 'checkbox') {\n          return;\n        }\n\n        var cell = instance.getCell(_row2, _col2);\n\n        if (cell == null) {\n\n          callback(_row2, _col2, _cellProperties2);\n        } else {\n          var checkboxes = cell.querySelectorAll('input[type=checkbox]');\n\n          if (checkboxes.length > 0 && !_cellProperties2.readOnly) {\n            callback(checkboxes);\n          }\n        }\n      }\n    }\n  }\n}\n\n/**\n * Register checkbox listeners.\n *\n * @param {Handsontable} instance Handsontable instance.\n * @returns {EventManager}\n */\nfunction registerEvents(instance) {\n  var eventManager = isCheckboxListenerAdded.get(instance);\n\n  if (!eventManager) {\n    eventManager = new _eventManager2.default(instance);\n    eventManager.addEventListener(instance.rootElement, 'click', function (event) {\n      return onClick(event, instance);\n    });\n    eventManager.addEventListener(instance.rootElement, 'mouseup', function (event) {\n      return onMouseUp(event, instance);\n    });\n    eventManager.addEventListener(instance.rootElement, 'change', function (event) {\n      return onChange(event, instance);\n    });\n\n    isCheckboxListenerAdded.set(instance, eventManager);\n  }\n\n  return eventManager;\n}\n\n/**\n * Create input element.\n *\n * @returns {Node}\n */\nfunction createInput() {\n  var input = document.createElement('input');\n\n  input.className = 'htCheckboxRendererInput';\n  input.type = 'checkbox';\n  input.setAttribute('autocomplete', 'off');\n  input.setAttribute('tabindex', '-1');\n\n  return input.cloneNode(false);\n}\n\n/**\n * Create label element.\n *\n * @returns {Node}\n */\nfunction createLabel(text) {\n  var label = document.createElement('label');\n\n  label.className = 'htCheckboxRendererLabel';\n  label.appendChild(document.createTextNode(text));\n\n  return label.cloneNode(true);\n}\n\n/**\n * `mouseup` callback.\n *\n * @private\n * @param {Event} event `mouseup` event.\n * @param {Object} instance Handsontable instance.\n */\nfunction onMouseUp(event, instance) {\n  if (!isCheckboxInput(event.target)) {\n    return;\n  }\n  setTimeout(instance.listen, 10);\n}\n\n/**\n * `click` callback.\n *\n * @private\n * @param {Event} event `click` event.\n * @param {Object} instance Handsontable instance.\n */\nfunction onClick(event, instance) {\n  if (!isCheckboxInput(event.target)) {\n    return false;\n  }\n\n  var row = parseInt(event.target.getAttribute('data-row'), 10);\n  var col = parseInt(event.target.getAttribute('data-col'), 10);\n  var cellProperties = instance.getCellMeta(row, col);\n\n  if (cellProperties.readOnly) {\n    event.preventDefault();\n  }\n}\n\n/**\n * `change` callback.\n *\n * @param {Event} event `change` event.\n * @param {Object} instance Handsontable instance.\n * @param {Object} cellProperties Reference to cell properties.\n * @returns {Boolean}\n */\nfunction onChange(event, instance) {\n  if (!isCheckboxInput(event.target)) {\n    return false;\n  }\n\n  var row = parseInt(event.target.getAttribute('data-row'), 10);\n  var col = parseInt(event.target.getAttribute('data-col'), 10);\n  var cellProperties = instance.getCellMeta(row, col);\n\n  if (!cellProperties.readOnly) {\n    var newCheckboxValue = null;\n\n    if (event.target.checked) {\n      newCheckboxValue = cellProperties.uncheckedTemplate === void 0 ? true : cellProperties.checkedTemplate;\n    } else {\n      newCheckboxValue = cellProperties.uncheckedTemplate === void 0 ? false : cellProperties.uncheckedTemplate;\n    }\n\n    instance.setDataAtCell(row, col, newCheckboxValue);\n  }\n}\n\n/**\n * Check if the provided element is the checkbox input.\n *\n * @private\n * @param {HTMLElement} element The element in question.\n * @returns {Boolean}\n */\nfunction isCheckboxInput(element) {\n  return element.tagName === 'INPUT' && element.getAttribute('type') === 'checkbox';\n}\n\nexports.default = checkboxRenderer;\n\n/***/ }),\n/* 367 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _index = __webpack_require__(13);\n\n/**\n * @private\n * @renderer HtmlRenderer\n * @param instance\n * @param TD\n * @param row\n * @param col\n * @param prop\n * @param value\n * @param cellProperties\n */\nfunction htmlRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  (0, _index.getRenderer)('base').apply(this, arguments);\n\n  if (value === null || value === void 0) {\n    value = '';\n  }\n\n  (0, _element.fastInnerHTML)(TD, value);\n}\n\nexports.default = htmlRenderer;\n\n/***/ }),\n/* 368 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _numbro = __webpack_require__(309);\n\nvar _numbro2 = _interopRequireDefault(_numbro);\n\nvar _index = __webpack_require__(13);\n\nvar _number = __webpack_require__(5);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Numeric cell renderer\n *\n * @private\n * @renderer NumericRenderer\n * @dependencies numbro\n * @param {Object} instance Handsontable instance\n * @param {Element} TD Table cell where to render\n * @param {Number} row\n * @param {Number} col\n * @param {String|Number} prop Row object property name\n * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)\n * @param {Object} cellProperties Cell properties (shared by cell renderer and editor)\n */\nfunction numericRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  if ((0, _number.isNumeric)(value)) {\n    var numericFormat = cellProperties.numericFormat;\n    var cellCulture = numericFormat && numericFormat.culture;\n    var cellFormatPattern = numericFormat && numericFormat.pattern;\n    var className = cellProperties.className || '';\n    var classArr = className.length ? className.split(' ') : [];\n\n    if (typeof cellCulture !== 'undefined') {\n      _numbro2.default.culture(cellCulture);\n    }\n\n    value = (0, _numbro2.default)(value).format(cellFormatPattern || '0');\n\n    if (classArr.indexOf('htLeft') < 0 && classArr.indexOf('htCenter') < 0 && classArr.indexOf('htRight') < 0 && classArr.indexOf('htJustify') < 0) {\n      classArr.push('htRight');\n    }\n\n    if (classArr.indexOf('htNumeric') < 0) {\n      classArr.push('htNumeric');\n    }\n\n    cellProperties.className = classArr.join(' ');\n  }\n\n  (0, _index.getRenderer)('text')(instance, TD, row, col, prop, value, cellProperties);\n}\n\nexports.default = numericRenderer;\n\n/***/ }),\n/* 369 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 370 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _index = __webpack_require__(13);\n\nvar _number = __webpack_require__(5);\n\n/**\n * @private\n * @renderer PasswordRenderer\n * @param instance\n * @param TD\n * @param row\n * @param col\n * @param prop\n * @param value\n * @param cellProperties\n */\nfunction passwordRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  (0, _index.getRenderer)('text').apply(this, arguments);\n\n  value = TD.innerHTML;\n\n  var hashLength = cellProperties.hashLength || value.length;\n  var hashSymbol = cellProperties.hashSymbol || '*';\n\n  var hash = '';\n\n  (0, _number.rangeEach)(hashLength - 1, function () {\n    hash += hashSymbol;\n  });\n  (0, _element.fastInnerHTML)(TD, hash);\n}\n\nexports.default = passwordRenderer;\n\n/***/ }),\n/* 371 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _mixed = __webpack_require__(16);\n\nvar _index = __webpack_require__(13);\n\n/**\n * Default text renderer\n *\n * @private\n * @renderer TextRenderer\n * @param {Object} instance Handsontable instance\n * @param {Element} TD Table cell where to render\n * @param {Number} row\n * @param {Number} col\n * @param {String|Number} prop Row object property name\n * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)\n * @param {Object} cellProperties Cell properties (shared by cell renderer and editor)\n */\nfunction textRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  (0, _index.getRenderer)('base').apply(this, arguments);\n\n  if (!value && cellProperties.placeholder) {\n    value = cellProperties.placeholder;\n  }\n\n  var escaped = (0, _mixed.stringify)(value);\n\n  if (!instance.getSettings().trimWhitespace) {\n    escaped = escaped.replace(/ /g, String.fromCharCode(160));\n  }\n\n  if (cellProperties.rendererTemplate) {\n    (0, _element.empty)(TD);\n    var TEMPLATE = document.createElement('TEMPLATE');\n    TEMPLATE.setAttribute('bind', '{{}}');\n    TEMPLATE.innerHTML = cellProperties.rendererTemplate;\n    HTMLTemplateElement.decorate(TEMPLATE);\n    TEMPLATE.model = instance.getSourceDataAtRow(row);\n    TD.appendChild(TEMPLATE);\n  } else {\n    // this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\n    (0, _element.fastInnerText)(TD, escaped);\n  }\n}\n\nexports.default = textRenderer;\n\n/***/ }),\n/* 372 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = autocompleteValidator;\n/**\n * Autocomplete cell validator.\n *\n * @private\n * @validator AutocompleteValidator\n * @param {*} value - Value of edited cell\n * @param {Function} callback - Callback called with validation result\n */\nfunction autocompleteValidator(value, callback) {\n  if (value == null) {\n    value = '';\n  }\n\n  if (this.allowEmpty && value === '') {\n    callback(true);\n\n    return;\n  }\n\n  if (this.strict && this.source) {\n    if (typeof this.source === 'function') {\n      this.source(value, process(value, callback));\n    } else {\n      process(value, callback)(this.source);\n    }\n  } else {\n    callback(true);\n  }\n};\n\n/**\n * Function responsible for validation of autocomplete value.\n *\n * @param {*} value - Value of edited cell\n * @param {Function} callback - Callback called with validation result\n */\nfunction process(value, callback) {\n  var originalVal = value;\n\n  return function (source) {\n    var found = false;\n\n    for (var s = 0, slen = source.length; s < slen; s++) {\n      if (originalVal === source[s]) {\n        found = true; // perfect match\n        break;\n      }\n    }\n\n    callback(found);\n  };\n}\n\n/***/ }),\n/* 373 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = dateValidator;\nexports.correctFormat = correctFormat;\n\nvar _moment = __webpack_require__(41);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _date = __webpack_require__(310);\n\nvar _editors = __webpack_require__(17);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Date cell validator\n *\n * @private\n * @validator DateValidator\n * @dependencies moment\n * @param {*} value - Value of edited cell\n * @param {Function} callback - Callback called with validation result\n */\nfunction dateValidator(value, callback) {\n  var valid = true;\n  var dateEditor = (0, _editors.getEditorInstance)('date', this.instance);\n\n  if (value == null) {\n    value = '';\n  }\n  var isValidDate = (0, _moment2.default)(new Date(value)).isValid() || (0, _moment2.default)(value, dateEditor.defaultDateFormat).isValid();\n  // is it in the specified format\n  var isValidFormat = (0, _moment2.default)(value, this.dateFormat || dateEditor.defaultDateFormat, true).isValid();\n\n  if (this.allowEmpty && value === '') {\n    isValidDate = true;\n    isValidFormat = true;\n  }\n  if (!isValidDate) {\n    valid = false;\n  }\n  if (!isValidDate && isValidFormat) {\n    valid = true;\n  }\n\n  if (isValidDate && !isValidFormat) {\n    if (this.correctFormat === true) {\n      // if format correction is enabled\n      var correctedValue = correctFormat(value, this.dateFormat);\n      var row = this.instance.runHooks('unmodifyRow', this.row);\n      var column = this.instance.runHooks('unmodifyCol', this.col);\n\n      this.instance.setDataAtCell(row, column, correctedValue, 'dateValidator');\n      valid = true;\n    } else {\n      valid = false;\n    }\n  }\n\n  callback(valid);\n};\n\n/**\n * Format the given string using moment.js' format feature\n *\n * @param {String} value\n * @param {String} dateFormat\n * @returns {String}\n */\nfunction correctFormat(value, dateFormat) {\n  var dateFromDate = (0, _moment2.default)((0, _date.getNormalizedDate)(value));\n  var dateFromMoment = (0, _moment2.default)(value, dateFormat);\n  var isAlphanumeric = value.search(/[A-z]/g) > -1;\n  var date = void 0;\n\n  if (dateFromDate.isValid() && dateFromDate.format('x') === dateFromMoment.format('x') || !dateFromMoment.isValid() || isAlphanumeric) {\n    date = dateFromDate;\n  } else {\n    date = dateFromMoment;\n  }\n\n  return date.format(dateFormat);\n};\n\n/***/ }),\n/* 374 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = numericValidator;\n/**\n * Numeric cell validator\n *\n * @private\n * @validator NumericValidator\n * @param {*} value - Value of edited cell\n * @param {*} callback - Callback called with validation result\n */\nfunction numericValidator(value, callback) {\n  if (value == null) {\n    value = '';\n  }\n  if (this.allowEmpty && value === '') {\n    callback(true);\n  } else if (value === '') {\n    callback(false);\n  } else {\n    callback(/^-?\\d*(\\.|,)?\\d*$/.test(value));\n  }\n};\n\n/***/ }),\n/* 375 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = timeValidator;\n\nvar _moment = __webpack_require__(41);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Formats which are correctly parsed to time (supported by momentjs)\nvar STRICT_FORMATS = ['YYYY-MM-DDTHH:mm:ss.SSSZ', 'X', // Unix timestamp\n'x' // Unix ms timestamp\n];\n\n/**\n * Time cell validator\n *\n * @private\n * @validator TimeValidator\n * @dependencies moment\n * @param {*} value - Value of edited cell\n * @param {Function} callback - Callback called with validation result\n */\nfunction timeValidator(value, callback) {\n  var valid = true;\n  var timeFormat = this.timeFormat || 'h:mm:ss a';\n\n  if (value === null) {\n    value = '';\n  }\n\n  value = /^\\d{3,}$/.test(value) ? parseInt(value, 10) : value;\n\n  var twoDigitValue = /^\\d{1,2}$/.test(value);\n\n  if (twoDigitValue) {\n    value += ':00';\n  }\n\n  var date = (0, _moment2.default)(value, STRICT_FORMATS, true).isValid() ? (0, _moment2.default)(value) : (0, _moment2.default)(value, timeFormat);\n  var isValidTime = date.isValid();\n\n  // is it in the specified format\n  var isValidFormat = (0, _moment2.default)(value, timeFormat, true).isValid() && !twoDigitValue;\n\n  if (this.allowEmpty && value === '') {\n    isValidTime = true;\n    isValidFormat = true;\n  }\n  if (!isValidTime) {\n    valid = false;\n  }\n  if (!isValidTime && isValidFormat) {\n    valid = true;\n  }\n  if (isValidTime && !isValidFormat) {\n    if (this.correctFormat === true) {\n      // if format correction is enabled\n      var correctedValue = date.format(timeFormat);\n      var row = this.instance.runHooks('unmodifyRow', this.row);\n      var column = this.instance.runHooks('unmodifyCol', this.col);\n\n      this.instance.setDataAtCell(row, column, correctedValue, 'timeValidator');\n      valid = true;\n    } else {\n      valid = false;\n    }\n  }\n\n  callback(valid);\n};\n\n/***/ }),\n/* 376 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'autocomplete';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE),\n  validator: (0, _validators.getValidator)(CELL_TYPE)\n};\n\n/***/ }),\n/* 377 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar CELL_TYPE = 'checkbox';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE)\n};\n\n/***/ }),\n/* 378 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'date';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  // displays small gray arrow on right side of the cell\n  renderer: (0, _renderers.getRenderer)('autocomplete'),\n  validator: (0, _validators.getValidator)(CELL_TYPE)\n};\n\n/***/ }),\n/* 379 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'dropdown';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  // displays small gray arrow on right side of the cell\n  renderer: (0, _renderers.getRenderer)('autocomplete'),\n  validator: (0, _validators.getValidator)('autocomplete')\n};\n\n/***/ }),\n/* 380 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar CELL_TYPE = 'handsontable';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  // displays small gray arrow on right side of the cell\n  renderer: (0, _renderers.getRenderer)('autocomplete')\n};\n\n/***/ }),\n/* 381 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'numeric';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE),\n  validator: (0, _validators.getValidator)(CELL_TYPE),\n  dataType: 'number'\n};\n\n/***/ }),\n/* 382 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'password';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE),\n  copyable: false\n};\n\n/***/ }),\n/* 383 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _browser = __webpack_require__(27);\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar CELL_TYPE = 'text';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE)\n};\n\n/***/ }),\n/* 384 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'time';\n\nexports.default = {\n  editor: (0, _editors.getEditor)('text'),\n  // displays small gray arrow on right side of the cell\n  renderer: (0, _renderers.getRenderer)('text'),\n  validator: (0, _validators.getValidator)(CELL_TYPE)\n};\n\n/***/ }),\n/* 385 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _SheetClip = __webpack_require__(311);\n\nvar _SheetClip2 = _interopRequireDefault(_SheetClip);\n\nvar _data = __webpack_require__(90);\n\nvar _setting = __webpack_require__(89);\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _interval = __webpack_require__(386);\n\nvar _interval2 = _interopRequireDefault(_interval);\n\nvar _number = __webpack_require__(5);\n\nvar _multiMap = __webpack_require__(387);\n\nvar _multiMap2 = _interopRequireDefault(_multiMap);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Utility class that gets and saves data from/to the data source using mapping of columns numbers to object property names\n * @todo refactor arguments of methods getRange, getText to be numbers (not objects)\n * @todo remove priv, GridSettings from object constructor\n *\n * @param {Object} instance Instance of Handsontable\n * @param {*} priv\n * @param {*} GridSettings Grid settings\n * @util\n * @class DataMap\n */\nfunction DataMap(instance, priv, GridSettings) {\n  var _this = this;\n\n  this.instance = instance;\n  this.priv = priv;\n  this.GridSettings = GridSettings;\n  this.dataSource = this.instance.getSettings().data;\n  this.cachedLength = null;\n  this.skipCache = false;\n  this.latestSourceRowsCount = 0;\n\n  if (this.dataSource && this.dataSource[0]) {\n    this.duckSchema = this.recursiveDuckSchema(this.dataSource[0]);\n  } else {\n    this.duckSchema = {};\n  }\n  this.createMap();\n  this.interval = _interval2.default.create(function () {\n    return _this.clearLengthCache();\n  }, '15fps');\n\n  this.instance.addHook('skipLengthCache', function (delay) {\n    return _this.onSkipLengthCache(delay);\n  });\n  this.onSkipLengthCache(500);\n}\n\nDataMap.prototype.DESTINATION_RENDERER = 1;\nDataMap.prototype.DESTINATION_CLIPBOARD_GENERATOR = 2;\n\n/**\n * @param {Object|Array} object\n * @returns {Object|Array}\n */\nDataMap.prototype.recursiveDuckSchema = function (object) {\n  return (0, _object.duckSchema)(object);\n};\n\n/**\n * @param {Object} schema\n * @param {Number} lastCol\n * @param {Number} parent\n * @returns {Number}\n */\nDataMap.prototype.recursiveDuckColumns = function (schema, lastCol, parent) {\n  var prop, i;\n  if (typeof lastCol === 'undefined') {\n    lastCol = 0;\n    parent = '';\n  }\n  if ((typeof schema === 'undefined' ? 'undefined' : _typeof(schema)) === 'object' && !Array.isArray(schema)) {\n    for (i in schema) {\n      if ((0, _object.hasOwnProperty)(schema, i)) {\n        if (schema[i] === null) {\n          prop = parent + i;\n          this.colToPropCache.push(prop);\n          this.propToColCache.set(prop, lastCol);\n\n          lastCol++;\n        } else {\n          lastCol = this.recursiveDuckColumns(schema[i], lastCol, i + '.');\n        }\n      }\n    }\n  }\n\n  return lastCol;\n};\n\nDataMap.prototype.createMap = function () {\n  var i = void 0;\n  var schema = this.getSchema();\n\n  if (typeof schema === 'undefined') {\n    throw new Error('trying to create `columns` definition but you didn\\'t provide `schema` nor `data`');\n  }\n\n  this.colToPropCache = [];\n  this.propToColCache = new _multiMap2.default();\n\n  var columns = this.instance.getSettings().columns;\n\n  if (columns) {\n    var maxCols = this.instance.getSettings().maxCols;\n    var columnsLen = Math.min(maxCols, columns.length);\n    var filteredIndex = 0;\n    var columnsAsFunc = false;\n    var schemaLen = (0, _object.deepObjectSize)(schema);\n\n    if (typeof columns === 'function') {\n      columnsLen = schemaLen > 0 ? schemaLen : this.instance.countSourceCols();\n      columnsAsFunc = true;\n    }\n\n    for (i = 0; i < columnsLen; i++) {\n      var column = columnsAsFunc ? columns(i) : columns[i];\n\n      if ((0, _object.isObject)(column)) {\n        if (typeof column.data !== 'undefined') {\n          var index = columnsAsFunc ? filteredIndex : i;\n          this.colToPropCache[index] = column.data;\n          this.propToColCache.set(column.data, index);\n        }\n\n        filteredIndex++;\n      }\n    }\n  } else {\n    this.recursiveDuckColumns(schema);\n  }\n};\n\n/**\n * Returns property name that corresponds with the given column index.\n *\n * @param {Number} col Visual column index.\n * @returns {Number} Physical column index.\n */\nDataMap.prototype.colToProp = function (col) {\n  col = this.instance.runHooks('modifyCol', col);\n\n  if (!isNaN(col) && this.colToPropCache && typeof this.colToPropCache[col] !== 'undefined') {\n    return this.colToPropCache[col];\n  }\n\n  return col;\n};\n\n/**\n * @param {Object} prop\n * @fires Hooks#modifyCol\n * @returns {*}\n */\nDataMap.prototype.propToCol = function (prop) {\n  var col;\n\n  if (typeof this.propToColCache.get(prop) === 'undefined') {\n    col = prop;\n  } else {\n    col = this.propToColCache.get(prop);\n  }\n  col = this.instance.runHooks('unmodifyCol', col);\n\n  return col;\n};\n\n/**\n * @returns {Object}\n */\nDataMap.prototype.getSchema = function () {\n  var schema = this.instance.getSettings().dataSchema;\n\n  if (schema) {\n    if (typeof schema === 'function') {\n      return schema();\n    }\n    return schema;\n  }\n\n  return this.duckSchema;\n};\n\n/**\n * Creates row at the bottom of the data array.\n *\n * @param {Number} [index] Physical index of the row before which the new row will be inserted.\n * @param {Number} [amount=1] An amount of rows to add.\n * @param {String} [source] Source of method call.\n * @fires Hooks#afterCreateRow\n * @returns {Number} Returns number of created rows.\n */\nDataMap.prototype.createRow = function (index) {\n  var _this2 = this;\n\n  var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n  var source = arguments[2];\n\n  var numberOfCreatedRows = 0;\n\n  if (typeof index !== 'number' || index >= this.instance.countSourceRows()) {\n    index = this.instance.countSourceRows();\n  }\n\n  var continueProcess = this.instance.runHooks('beforeCreateRow', index, amount, source);\n\n  if (continueProcess === false) {\n    return 0;\n  }\n\n  var maxRows = this.instance.getSettings().maxRows;\n  var columnCount = this.instance.countCols();\n\n  var _loop = function _loop() {\n    var row = null;\n\n    if (_this2.instance.dataType === 'array') {\n      if (_this2.instance.getSettings().dataSchema) {\n        // Clone template array\n        row = (0, _object.deepClone)(_this2.getSchema());\n      } else {\n        row = [];\n        /* eslint-disable no-loop-func */\n        (0, _number.rangeEach)(columnCount - 1, function () {\n          return row.push(null);\n        });\n      }\n    } else if (_this2.instance.dataType === 'function') {\n      row = _this2.instance.getSettings().dataSchema(index);\n    } else {\n      row = {};\n      (0, _object.deepExtend)(row, _this2.getSchema());\n    }\n\n    if (index === _this2.instance.countSourceRows()) {\n      _this2.dataSource.push(row);\n    } else {\n      _this2.spliceData(index, 0, row);\n    }\n\n    numberOfCreatedRows++;\n  };\n\n  while (numberOfCreatedRows < amount && this.instance.countSourceRows() < maxRows) {\n    _loop();\n  }\n\n  this.instance.runHooks('afterCreateRow', index, numberOfCreatedRows, source);\n  this.instance.forceFullRender = true; // used when data was changed\n\n  return numberOfCreatedRows;\n};\n\n/**\n * Creates col at the right of the data array.\n *\n * @param {Number} [index] Visual index of the column before which the new column will be inserted\n * @param {Number} [amount] An amount of columns to add.\n * @param {String} [source] Source of method call.\n * @fires Hooks#afterCreateCol\n * @returns {Number} Returns number of created columns\n */\nDataMap.prototype.createCol = function (index, amount, source) {\n  if (!this.instance.isColumnModificationAllowed()) {\n    throw new Error('Cannot create new column. When data source in an object, ' + 'you can only have as much columns as defined in first data row, data schema or in the \\'columns\\' setting.' + 'If you want to be able to add new columns, you have to use array datasource.');\n  }\n  var rlen = this.instance.countSourceRows(),\n      data = this.dataSource,\n      constructor,\n      numberOfCreatedCols = 0,\n      currentIndex;\n\n  if (!amount) {\n    amount = 1;\n  }\n\n  if (typeof index !== 'number' || index >= this.instance.countCols()) {\n    index = this.instance.countCols();\n  }\n  this.instance.runHooks('beforeCreateCol', index, amount, source);\n\n  currentIndex = index;\n\n  var maxCols = this.instance.getSettings().maxCols;\n  while (numberOfCreatedCols < amount && this.instance.countCols() < maxCols) {\n    constructor = (0, _setting.columnFactory)(this.GridSettings, this.priv.columnsSettingConflicts);\n\n    if (typeof index !== 'number' || index >= this.instance.countCols()) {\n      if (rlen > 0) {\n        for (var r = 0; r < rlen; r++) {\n          if (typeof data[r] === 'undefined') {\n            data[r] = [];\n          }\n          data[r].push(null);\n        }\n      } else {\n        data.push([null]);\n      }\n      // Add new column constructor\n      this.priv.columnSettings.push(constructor);\n    } else {\n      for (var _r = 0; _r < rlen; _r++) {\n        data[_r].splice(currentIndex, 0, null);\n      }\n      // Add new column constructor at given index\n      this.priv.columnSettings.splice(currentIndex, 0, constructor);\n    }\n\n    numberOfCreatedCols++;\n    currentIndex++;\n  }\n\n  this.instance.runHooks('afterCreateCol', index, numberOfCreatedCols, source);\n  this.instance.forceFullRender = true; // used when data was changed\n\n  return numberOfCreatedCols;\n};\n\n/**\n * Removes row from the data array.\n *\n * @param {Number} [index] Visual index of the row to be removed. If not provided, the last row will be removed\n * @param {Number} [amount] Amount of the rows to be removed. If not provided, one row will be removed\n * @param {String} [source] Source of method call.\n * @fires Hooks#beforeRemoveRow\n * @fires Hooks#afterRemoveRow\n */\nDataMap.prototype.removeRow = function (index, amount, source) {\n  if (!amount) {\n    amount = 1;\n  }\n  if (typeof index !== 'number') {\n    index = -amount;\n  }\n\n  amount = this.instance.runHooks('modifyRemovedAmount', amount, index);\n\n  index = (this.instance.countSourceRows() + index) % this.instance.countSourceRows();\n\n  var logicRows = this.visualRowsToPhysical(index, amount);\n  var actionWasNotCancelled = this.instance.runHooks('beforeRemoveRow', index, amount, logicRows, source);\n\n  if (actionWasNotCancelled === false) {\n    return;\n  }\n\n  var data = this.dataSource;\n  var newData = void 0;\n\n  newData = this.filterData(index, amount);\n\n  if (newData) {\n    data.length = 0;\n    Array.prototype.push.apply(data, newData);\n  }\n\n  this.instance.runHooks('afterRemoveRow', index, amount, logicRows, source);\n\n  this.instance.forceFullRender = true; // used when data was changed\n};\n\n/**\n * Removes column from the data array.\n *\n * @param {Number} [index] Visual index of the column to be removed. If not provided, the last column will be removed\n * @param {Number} [amount] Amount of the columns to be removed. If not provided, one column will be removed\n * @param {String} [source] Source of method call.\n * @fires Hooks#beforeRemoveCol\n * @fires Hooks#afterRemoveCol\n */\nDataMap.prototype.removeCol = function (index, amount, source) {\n  if (this.instance.dataType === 'object' || this.instance.getSettings().columns) {\n    throw new Error('cannot remove column with object data source or columns option specified');\n  }\n  if (!amount) {\n    amount = 1;\n  }\n  if (typeof index !== 'number') {\n    index = -amount;\n  }\n\n  index = (this.instance.countCols() + index) % this.instance.countCols();\n\n  var logicColumns = this.visualColumnsToPhysical(index, amount);\n  var descendingLogicColumns = logicColumns.slice(0).sort(function (a, b) {\n    return b - a;\n  });\n  var actionWasNotCancelled = this.instance.runHooks('beforeRemoveCol', index, amount, logicColumns, source);\n\n  if (actionWasNotCancelled === false) {\n    return;\n  }\n\n  var isTableUniform = true;\n  var removedColumnsCount = descendingLogicColumns.length;\n  var data = this.dataSource;\n\n  for (var c = 0; c < removedColumnsCount; c++) {\n    if (isTableUniform && logicColumns[0] !== logicColumns[c] - c) {\n      isTableUniform = false;\n    }\n  }\n\n  if (isTableUniform) {\n    for (var r = 0, rlen = this.instance.countSourceRows(); r < rlen; r++) {\n      data[r].splice(logicColumns[0], amount);\n    }\n  } else {\n    for (var _r2 = 0, _rlen = this.instance.countSourceRows(); _r2 < _rlen; _r2++) {\n      for (var _c = 0; _c < removedColumnsCount; _c++) {\n        data[_r2].splice(descendingLogicColumns[_c], 1);\n      }\n    }\n\n    for (var _c2 = 0; _c2 < removedColumnsCount; _c2++) {\n      this.priv.columnSettings.splice(logicColumns[_c2], 1);\n    }\n  }\n\n  this.instance.runHooks('afterRemoveCol', index, amount, logicColumns, source);\n\n  this.instance.forceFullRender = true; // used when data was changed\n};\n\n/**\n * Add/Removes data from the column.\n *\n * @param {Number} col Physical index of column in which do you want to do splice\n * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end\n * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed\n * @returns {Array} Returns removed portion of columns\n */\nDataMap.prototype.spliceCol = function (col, index, amount /* , elements... */) {\n  var elements = arguments.length >= 4 ? [].slice.call(arguments, 3) : [];\n\n  var colData = this.instance.getDataAtCol(col);\n  var removed = colData.slice(index, index + amount);\n  var after = colData.slice(index + amount);\n\n  (0, _array.extendArray)(elements, after);\n  var i = 0;\n  while (i < amount) {\n    elements.push(null); // add null in place of removed elements\n    i++;\n  }\n  (0, _array.to2dArray)(elements);\n  this.instance.populateFromArray(index, col, elements, null, null, 'spliceCol');\n\n  return removed;\n};\n\n/**\n * Add/Removes data from the row.\n *\n * @param {Number} row Physical index of row in which do you want to do splice\n * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end.\n * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed.\n * @returns {Array} Returns removed portion of rows\n */\nDataMap.prototype.spliceRow = function (row, index, amount /* , elements... */) {\n  var elements = arguments.length >= 4 ? [].slice.call(arguments, 3) : [];\n\n  var rowData = this.instance.getSourceDataAtRow(row);\n  var removed = rowData.slice(index, index + amount);\n  var after = rowData.slice(index + amount);\n\n  (0, _array.extendArray)(elements, after);\n  var i = 0;\n  while (i < amount) {\n    elements.push(null); // add null in place of removed elements\n    i++;\n  }\n  this.instance.populateFromArray(row, index, [elements], null, null, 'spliceRow');\n\n  return removed;\n};\n\n/**\n * Add/remove row(s) to/from the data source.\n *\n * @param {Number} index Physical index of the element to remove.\n * @param {Number} amount Number of rows to add/remove.\n * @param {Object} element Row to add.\n */\nDataMap.prototype.spliceData = function (index, amount, element) {\n  var continueSplicing = this.instance.runHooks('beforeDataSplice', index, amount, element);\n\n  if (continueSplicing !== false) {\n    this.dataSource.splice(index, amount, element);\n  }\n};\n\n/**\n * Filter unwanted data elements from the data source.\n *\n * @param {Number} index Visual index of the element to remove.\n * @param {Number} amount Number of rows to add/remove.\n * @returns {Array}\n */\nDataMap.prototype.filterData = function (index, amount) {\n  var physicalRows = this.visualRowsToPhysical(index, amount);\n  var continueSplicing = this.instance.runHooks('beforeDataFilter', index, amount, physicalRows);\n\n  if (continueSplicing !== false) {\n    var newData = this.dataSource.filter(function (row, index) {\n      return physicalRows.indexOf(index) == -1;\n    });\n\n    return newData;\n  }\n};\n\n/**\n * Returns single value from the data array.\n *\n * @param {Number} row Visual row index.\n * @param {Number} prop\n */\nDataMap.prototype.get = function (row, prop) {\n  row = this.instance.runHooks('modifyRow', row);\n\n  var dataRow = this.dataSource[row];\n  // TODO: To remove, use 'modifyData' hook instead (see below)\n  var modifiedRowData = this.instance.runHooks('modifyRowData', row);\n\n  dataRow = isNaN(modifiedRowData) ? modifiedRowData : dataRow;\n  //\n\n  var value = null;\n\n  // try to get value under property `prop` (includes dot)\n  if (dataRow && dataRow.hasOwnProperty && (0, _object.hasOwnProperty)(dataRow, prop)) {\n    value = dataRow[prop];\n  } else if (typeof prop === 'string' && prop.indexOf('.') > -1) {\n    var sliced = prop.split('.');\n    var out = dataRow;\n\n    if (!out) {\n      return null;\n    }\n    for (var i = 0, ilen = sliced.length; i < ilen; i++) {\n      out = out[sliced[i]];\n\n      if (typeof out === 'undefined') {\n        return null;\n      }\n    }\n    value = out;\n  } else if (typeof prop === 'function') {\n    /**\n     *  allows for interacting with complex structures, for example\n     *  d3/jQuery getter/setter properties:\n     *\n     *    {columns: [{\n     *      data: function(row, value){\n     *        if(arguments.length === 1){\n     *          return row.property();\n     *        }\n     *        row.property(value);\n     *      }\n     *    }]}\n     */\n    value = prop(this.dataSource.slice(row, row + 1)[0]);\n  }\n\n  if (this.instance.hasHook('modifyData')) {\n    var valueHolder = (0, _object.createObjectPropListener)(value);\n\n    this.instance.runHooks('modifyData', row, this.propToCol(prop), valueHolder, 'get');\n\n    if (valueHolder.isTouched()) {\n      value = valueHolder.value;\n    }\n  }\n\n  return value;\n};\n\nvar copyableLookup = (0, _data.cellMethodLookupFactory)('copyable', false);\n\n/**\n * Returns single value from the data array (intended for clipboard copy to an external application).\n *\n * @param {Number} row Physical row index.\n * @param {Number} prop\n * @returns {String}\n */\nDataMap.prototype.getCopyable = function (row, prop) {\n  if (copyableLookup.call(this.instance, row, this.propToCol(prop))) {\n    return this.get(row, prop);\n  }\n  return '';\n};\n\n/**\n * Saves single value to the data array.\n *\n * @param {Number} row Visual row index.\n * @param {Number} prop\n * @param {String} value\n * @param {String} [source] Source of hook runner.\n */\nDataMap.prototype.set = function (row, prop, value, source) {\n  row = this.instance.runHooks('modifyRow', row, source || 'datamapGet');\n\n  var dataRow = this.dataSource[row];\n  // TODO: To remove, use 'modifyData' hook instead (see below)\n  var modifiedRowData = this.instance.runHooks('modifyRowData', row);\n\n  dataRow = isNaN(modifiedRowData) ? modifiedRowData : dataRow;\n  //\n\n  if (this.instance.hasHook('modifyData')) {\n    var valueHolder = (0, _object.createObjectPropListener)(value);\n\n    this.instance.runHooks('modifyData', row, this.propToCol(prop), valueHolder, 'set');\n\n    if (valueHolder.isTouched()) {\n      value = valueHolder.value;\n    }\n  }\n\n  // try to set value under property `prop` (includes dot)\n  if (dataRow && dataRow.hasOwnProperty && (0, _object.hasOwnProperty)(dataRow, prop)) {\n    dataRow[prop] = value;\n  } else if (typeof prop === 'string' && prop.indexOf('.') > -1) {\n    var sliced = prop.split('.');\n    var out = dataRow;\n    var i = 0;\n    var ilen = void 0;\n\n    for (i = 0, ilen = sliced.length - 1; i < ilen; i++) {\n      if (typeof out[sliced[i]] === 'undefined') {\n        out[sliced[i]] = {};\n      }\n      out = out[sliced[i]];\n    }\n    out[sliced[i]] = value;\n  } else if (typeof prop === 'function') {\n    /* see the `function` handler in `get` */\n    prop(this.dataSource.slice(row, row + 1)[0], value);\n  } else {\n    dataRow[prop] = value;\n  }\n};\n\n/**\n * This ridiculous piece of code maps rows Id that are present in table data to those displayed for user.\n * The trick is, the physical row id (stored in settings.data) is not necessary the same\n * as the visual (displayed) row id (e.g. when sorting is applied).\n *\n * @param {Number} index Visual row index.\n * @param {Number} amount\n * @fires Hooks#modifyRow\n * @returns {Number}\n */\nDataMap.prototype.visualRowsToPhysical = function (index, amount) {\n  var totalRows = this.instance.countSourceRows();\n  var physicRow = (totalRows + index) % totalRows;\n  var logicRows = [];\n  var rowsToRemove = amount;\n  var row;\n\n  while (physicRow < totalRows && rowsToRemove) {\n    row = this.instance.runHooks('modifyRow', physicRow);\n    logicRows.push(row);\n\n    rowsToRemove--;\n    physicRow++;\n  }\n\n  return logicRows;\n};\n\n/**\n *\n * @param index Visual column index.\n * @param amount\n * @returns {Array}\n */\nDataMap.prototype.visualColumnsToPhysical = function (index, amount) {\n  var totalCols = this.instance.countCols();\n  var physicalCol = (totalCols + index) % totalCols;\n  var visualCols = [];\n  var colsToRemove = amount;\n\n  while (physicalCol < totalCols && colsToRemove) {\n    var col = this.instance.runHooks('modifyCol', physicalCol);\n\n    visualCols.push(col);\n\n    colsToRemove--;\n    physicalCol++;\n  }\n\n  return visualCols;\n};\n\n/**\n * Clears the data array.\n */\nDataMap.prototype.clear = function () {\n  for (var r = 0; r < this.instance.countSourceRows(); r++) {\n    for (var c = 0; c < this.instance.countCols(); c++) {\n      this.set(r, this.colToProp(c), '');\n    }\n  }\n};\n\n/**\n * Clear cached data length.\n */\nDataMap.prototype.clearLengthCache = function () {\n  this.cachedLength = null;\n};\n\n/**\n * Get data length.\n *\n * @returns {Number}\n */\nDataMap.prototype.getLength = function () {\n  var _this3 = this;\n\n  var maxRows = void 0,\n      maxRowsFromSettings = this.instance.getSettings().maxRows;\n\n  if (maxRowsFromSettings < 0 || maxRowsFromSettings === 0) {\n    maxRows = 0;\n  } else {\n    maxRows = maxRowsFromSettings || Infinity;\n  }\n\n  var length = this.instance.countSourceRows();\n\n  if (this.instance.hasHook('modifyRow')) {\n    var reValidate = this.skipCache;\n\n    this.interval.start();\n    if (length !== this.latestSourceRowsCount) {\n      reValidate = true;\n    }\n\n    this.latestSourceRowsCount = length;\n    if (this.cachedLength === null || reValidate) {\n      (0, _number.rangeEach)(length - 1, function (row) {\n        row = _this3.instance.runHooks('modifyRow', row);\n\n        if (row === null) {\n          --length;\n        }\n      });\n      this.cachedLength = length;\n    } else {\n      length = this.cachedLength;\n    }\n  } else {\n    this.interval.stop();\n  }\n\n  return Math.min(length, maxRows);\n};\n\n/**\n * Returns the data array.\n *\n * @returns {Array}\n */\nDataMap.prototype.getAll = function () {\n  var start = {\n    row: 0,\n    col: 0\n  };\n\n  var end = {\n    row: Math.max(this.instance.countSourceRows() - 1, 0),\n    col: Math.max(this.instance.countCols() - 1, 0)\n  };\n\n  if (start.row - end.row === 0 && !this.instance.countSourceRows()) {\n    return [];\n  }\n\n  return this.getRange(start, end, DataMap.prototype.DESTINATION_RENDERER);\n};\n\n/**\n * Returns data range as array.\n *\n * @param {Object} [start] Start selection position. Visual indexes.\n * @param {Object} [end] End selection position. Visual indexes.\n * @param {Number} destination Destination of datamap.get\n * @returns {Array}\n */\nDataMap.prototype.getRange = function (start, end, destination) {\n  var r,\n      rlen,\n      c,\n      clen,\n      output = [],\n      row;\n\n  var maxRows = this.instance.getSettings().maxRows;\n  var maxCols = this.instance.getSettings().maxCols;\n\n  if (maxRows === 0 || maxCols === 0) {\n    return [];\n  }\n\n  var getFn = destination === this.DESTINATION_CLIPBOARD_GENERATOR ? this.getCopyable : this.get;\n\n  rlen = Math.min(Math.max(maxRows - 1, 0), Math.max(start.row, end.row));\n  clen = Math.min(Math.max(maxCols - 1, 0), Math.max(start.col, end.col));\n\n  for (r = Math.min(start.row, end.row); r <= rlen; r++) {\n    row = [];\n    var physicalRow = this.instance.runHooks('modifyRow', r);\n\n    for (c = Math.min(start.col, end.col); c <= clen; c++) {\n\n      if (physicalRow === null) {\n        break;\n      }\n      row.push(getFn.call(this, r, this.colToProp(c)));\n    }\n    if (physicalRow !== null) {\n      output.push(row);\n    }\n  }\n\n  return output;\n};\n\n/**\n * Return data as text (tab separated columns).\n *\n * @param {Object} [start] Start selection position. Visual indexes.\n * @param {Object} [end] End selection position. Visual indexes.\n * @returns {String}\n */\nDataMap.prototype.getText = function (start, end) {\n  return _SheetClip2.default.stringify(this.getRange(start, end, this.DESTINATION_RENDERER));\n};\n\n/**\n * Return data as copyable text (tab separated columns intended for clipboard copy to an external application).\n *\n * @param {Object} [start] Start selection position. Visual indexes.\n * @param {Object} [end] End selection position. Visual indexes.\n * @returns {String}\n */\nDataMap.prototype.getCopyableText = function (start, end) {\n  return _SheetClip2.default.stringify(this.getRange(start, end, this.DESTINATION_CLIPBOARD_GENERATOR));\n};\n\n/**\n * `skipLengthCache` callback.\n * @private\n * @param {Number} delay Time of the delay in milliseconds.\n */\nDataMap.prototype.onSkipLengthCache = function (delay) {\n  var _this4 = this;\n\n  this.skipCache = true;\n  setTimeout(function () {\n    _this4.skipCache = false;\n  }, delay);\n};\n\n/**\n * Destroy instance.\n */\nDataMap.prototype.destroy = function () {\n  this.interval.stop();\n\n  this.interval = null;\n  this.instance = null;\n  this.priv = null;\n  this.GridSettings = null;\n  this.dataSource = null;\n  this.cachedLength = null;\n  this.duckSchema = null;\n};\n\nexports.default = DataMap;\n\n/***/ }),\n/* 386 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.parseDelay = parseDelay;\n\nvar _feature = __webpack_require__(40);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Interval\n * @util\n */\nvar Interval = function () {\n  _createClass(Interval, null, [{\n    key: 'create',\n    value: function create(func, delay) {\n      return new Interval(func, delay);\n    }\n  }]);\n\n  function Interval(func, delay) {\n    var _this = this;\n\n    _classCallCheck(this, Interval);\n\n    /**\n     * Animation frame request id.\n     *\n     * @type {Number}\n     */\n    this.timer = null;\n    /**\n     * Function to invoke repeatedly.\n     *\n     * @type {Function}\n     */\n    this.func = func;\n    /**\n     * Number of milliseconds that function should wait before next call.\n     */\n    this.delay = parseDelay(delay);\n    /**\n     * Flag which indicates if interval object was stopped.\n     *\n     * @type {Boolean}\n     * @default true\n     */\n    this.stopped = true;\n    /**\n     * Interval time (in milliseconds) of the last callback call.\n     *\n     * @private\n     * @type {Number}\n     */\n    this._then = null;\n    /**\n     * Bounded function `func`.\n     *\n     * @private\n     * @type {Function}\n     */\n    this._callback = function () {\n      return _this.__callback();\n    };\n  }\n\n  /**\n   * Start loop.\n   *\n   * @returns {Interval}\n   */\n\n\n  _createClass(Interval, [{\n    key: 'start',\n    value: function start() {\n      if (this.stopped) {\n        this._then = Date.now();\n        this.stopped = false;\n        this.timer = (0, _feature.requestAnimationFrame)(this._callback);\n      }\n\n      return this;\n    }\n\n    /**\n     * Stop looping.\n     *\n     * @returns {Interval}\n     */\n\n  }, {\n    key: 'stop',\n    value: function stop() {\n      if (!this.stopped) {\n        this.stopped = true;\n        (0, _feature.cancelAnimationFrame)(this.timer);\n        this.timer = null;\n      }\n\n      return this;\n    }\n\n    /**\n     * Loop callback, fired on every animation frame.\n     *\n     * @private\n     */\n\n  }, {\n    key: '__callback',\n    value: function __callback() {\n      this.timer = (0, _feature.requestAnimationFrame)(this._callback);\n\n      if (this.delay) {\n        var now = Date.now();\n        var elapsed = now - this._then;\n\n        if (elapsed > this.delay) {\n          this._then = now - elapsed % this.delay;\n          this.func();\n        }\n      } else {\n        this.func();\n      }\n    }\n  }]);\n\n  return Interval;\n}();\n\nexports.default = Interval;\nfunction parseDelay(delay) {\n  if (typeof delay === 'string' && /fps$/.test(delay)) {\n    delay = 1000 / parseInt(delay.replace('fps', '') || 0, 10);\n  }\n\n  return delay;\n}\n\n/***/ }),\n/* 387 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction MultiMap() {\n  var map = {\n    arrayMap: [],\n    weakMap: new WeakMap()\n  };\n\n  return {\n    get: function get(key) {\n      if (canBeAnArrayMapKey(key)) {\n        return map.arrayMap[key];\n      } else if (canBeAWeakMapKey(key)) {\n        return map.weakMap.get(key);\n      }\n    },\n    set: function set(key, value) {\n      if (canBeAnArrayMapKey(key)) {\n        map.arrayMap[key] = value;\n      } else if (canBeAWeakMapKey(key)) {\n        map.weakMap.set(key, value);\n      } else {\n        throw new Error('Invalid key type');\n      }\n    },\n    delete: function _delete(key) {\n      if (canBeAnArrayMapKey(key)) {\n        delete map.arrayMap[key];\n      } else if (canBeAWeakMapKey(key)) {\n        map.weakMap.delete(key);\n      }\n    }\n  };\n\n  function canBeAnArrayMapKey(obj) {\n    return obj !== null && !isNaNSymbol(obj) && (typeof obj == 'string' || typeof obj == 'number');\n  }\n\n  function canBeAWeakMapKey(obj) {\n    return obj !== null && ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) == 'object' || typeof obj == 'function');\n  }\n\n  function isNaNSymbol(obj) {\n    /* eslint-disable no-self-compare */\n    return obj !== obj; // NaN === NaN is always false\n  }\n}\n\nexports.default = MultiMap;\n\n/***/ }),\n/* 388 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\nvar _unicode = __webpack_require__(21);\n\nvar _event = __webpack_require__(12);\n\nvar _editors = __webpack_require__(17);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _baseEditor = __webpack_require__(54);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction EditorManager(instance, priv, selection) {\n  var _this = this,\n      destroyed = false,\n      lock = false,\n      eventManager,\n      activeEditor;\n\n  eventManager = new _eventManager2.default(instance);\n\n  function moveSelectionAfterEnter(shiftKey) {\n    var enterMoves = typeof priv.settings.enterMoves === 'function' ? priv.settings.enterMoves(event) : priv.settings.enterMoves;\n\n    if (shiftKey) {\n      // move selection up\n      selection.transformStart(-enterMoves.row, -enterMoves.col);\n    } else {\n      // move selection down (add a new row if needed)\n      selection.transformStart(enterMoves.row, enterMoves.col, true);\n    }\n  }\n\n  function moveSelectionUp(shiftKey) {\n    if (shiftKey) {\n      selection.transformEnd(-1, 0);\n    } else {\n      selection.transformStart(-1, 0);\n    }\n  }\n\n  function moveSelectionDown(shiftKey) {\n    if (shiftKey) {\n      // expanding selection down with shift\n      selection.transformEnd(1, 0);\n    } else {\n      selection.transformStart(1, 0);\n    }\n  }\n\n  function moveSelectionRight(shiftKey) {\n    if (shiftKey) {\n      selection.transformEnd(0, 1);\n    } else {\n      selection.transformStart(0, 1);\n    }\n  }\n\n  function moveSelectionLeft(shiftKey) {\n    if (shiftKey) {\n      selection.transformEnd(0, -1);\n    } else {\n      selection.transformStart(0, -1);\n    }\n  }\n\n  function onKeyDown(event) {\n    if (!instance.isListening()) {\n      return;\n    }\n    instance.runHooks('beforeKeyDown', event);\n\n    if (destroyed) {\n      return;\n    }\n    if ((0, _event.isImmediatePropagationStopped)(event)) {\n      return;\n    }\n    priv.lastKeyCode = event.keyCode;\n\n    if (!selection.isSelected()) {\n      return;\n    }\n    // catch CTRL but not right ALT (which in some systems triggers ALT+CTRL)\n    var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey;\n\n    if (activeEditor && !activeEditor.isWaiting()) {\n      if (!(0, _unicode.isMetaKey)(event.keyCode) && !(0, _unicode.isCtrlMetaKey)(event.keyCode) && !ctrlDown && !_this.isEditorOpened()) {\n        _this.openEditor('', event);\n\n        return;\n      }\n    }\n    var rangeModifier = event.shiftKey ? selection.setRangeEnd : selection.setRangeStart;\n    var tabMoves = void 0;\n\n    switch (event.keyCode) {\n      case _unicode.KEY_CODES.A:\n        if (!_this.isEditorOpened() && ctrlDown) {\n          instance.selectAll();\n\n          event.preventDefault();\n          (0, _event.stopPropagation)(event);\n        }\n        break;\n\n      case _unicode.KEY_CODES.ARROW_UP:\n        if (_this.isEditorOpened() && !activeEditor.isWaiting()) {\n          _this.closeEditorAndSaveChanges(ctrlDown);\n        }\n        moveSelectionUp(event.shiftKey);\n\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.ARROW_DOWN:\n        if (_this.isEditorOpened() && !activeEditor.isWaiting()) {\n          _this.closeEditorAndSaveChanges(ctrlDown);\n        }\n\n        moveSelectionDown(event.shiftKey);\n\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.ARROW_RIGHT:\n        if (_this.isEditorOpened() && !activeEditor.isWaiting()) {\n          _this.closeEditorAndSaveChanges(ctrlDown);\n        }\n\n        moveSelectionRight(event.shiftKey);\n\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.ARROW_LEFT:\n        if (_this.isEditorOpened() && !activeEditor.isWaiting()) {\n          _this.closeEditorAndSaveChanges(ctrlDown);\n        }\n\n        moveSelectionLeft(event.shiftKey);\n\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.TAB:\n        tabMoves = typeof priv.settings.tabMoves === 'function' ? priv.settings.tabMoves(event) : priv.settings.tabMoves;\n\n        if (event.shiftKey) {\n          // move selection left\n          selection.transformStart(-tabMoves.row, -tabMoves.col);\n        } else {\n          // move selection right (add a new column if needed)\n          selection.transformStart(tabMoves.row, tabMoves.col, true);\n        }\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.BACKSPACE:\n      case _unicode.KEY_CODES.DELETE:\n        instance.emptySelectedCells();\n        _this.prepareEditor();\n        event.preventDefault();\n        break;\n\n      case _unicode.KEY_CODES.F2:\n        /* F2 */\n        _this.openEditor(null, event);\n\n        if (activeEditor) {\n          activeEditor.enableFullEditMode();\n        }\n        event.preventDefault(); // prevent Opera from opening 'Go to Page dialog'\n        break;\n\n      case _unicode.KEY_CODES.ENTER:\n        /* return/enter */\n        if (_this.isEditorOpened()) {\n\n          if (activeEditor && activeEditor.state !== _baseEditor.EditorState.WAITING) {\n            _this.closeEditorAndSaveChanges(ctrlDown);\n          }\n          moveSelectionAfterEnter(event.shiftKey);\n        } else if (instance.getSettings().enterBeginsEditing) {\n          _this.openEditor(null, event);\n\n          if (activeEditor) {\n            activeEditor.enableFullEditMode();\n          }\n        } else {\n          moveSelectionAfterEnter(event.shiftKey);\n        }\n        event.preventDefault(); // don't add newline to field\n        (0, _event.stopImmediatePropagation)(event); // required by HandsontableEditor\n        break;\n\n      case _unicode.KEY_CODES.ESCAPE:\n        if (_this.isEditorOpened()) {\n          _this.closeEditorAndRestoreOriginalValue(ctrlDown);\n        }\n        event.preventDefault();\n        break;\n\n      case _unicode.KEY_CODES.HOME:\n        if (event.ctrlKey || event.metaKey) {\n          rangeModifier.call(selection, new _src.CellCoords(0, selection.selectedRange.current().from.col));\n        } else {\n          rangeModifier.call(selection, new _src.CellCoords(selection.selectedRange.current().from.row, 0));\n        }\n        event.preventDefault(); // don't scroll the window\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.END:\n        if (event.ctrlKey || event.metaKey) {\n          rangeModifier.call(selection, new _src.CellCoords(instance.countRows() - 1, selection.selectedRange.current().from.col));\n        } else {\n          rangeModifier.call(selection, new _src.CellCoords(selection.selectedRange.current().from.row, instance.countCols() - 1));\n        }\n        event.preventDefault(); // don't scroll the window\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.PAGE_UP:\n        selection.transformStart(-instance.countVisibleRows(), 0);\n        event.preventDefault(); // don't page up the window\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.PAGE_DOWN:\n        selection.transformStart(instance.countVisibleRows(), 0);\n        event.preventDefault(); // don't page down the window\n        (0, _event.stopPropagation)(event);\n        break;\n      default:\n        break;\n    }\n  }\n\n  function init() {\n    instance.addHook('afterDocumentKeyDown', onKeyDown);\n\n    eventManager.addEventListener(document.documentElement, 'keydown', function (event) {\n      if (!destroyed) {\n        instance.runHooks('afterDocumentKeyDown', event);\n      }\n    });\n\n    function onDblClick(event, coords, elem) {\n      // may be TD or TH\n      if (elem.nodeName === 'TD') {\n        _this.openEditor(null, event);\n\n        if (activeEditor) {\n          activeEditor.enableFullEditMode();\n        }\n      }\n    }\n    instance.view.wt.update('onCellDblClick', onDblClick);\n  }\n\n  /**\n  * Lock the editor from being prepared and closed. Locking the editor prevents its closing and\n  * reinitialized after selecting the new cell. This feature is necessary for a mobile editor.\n  *\n  * @function lockEditor\n  * @memberof! Handsontable.EditorManager#\n   */\n  this.lockEditor = function () {\n    lock = true;\n  };\n\n  /**\n  * Unlock the editor from being prepared and closed. This method restores the original behavior of\n  * the editors where for every new selection its instances are closed.\n  *\n  * @function unlockEditor\n  * @memberof! Handsontable.EditorManager#\n   */\n  this.unlockEditor = function () {\n    lock = false;\n  };\n\n  /**\n   * Destroy current editor, if exists.\n   *\n   * @function destroyEditor\n   * @memberof! Handsontable.EditorManager#\n   * @param {Boolean} revertOriginal\n   */\n  this.destroyEditor = function (revertOriginal) {\n    if (!lock) {\n      this.closeEditor(revertOriginal);\n    }\n  };\n\n  /**\n   * Get active editor.\n   *\n   * @function getActiveEditor\n   * @memberof! Handsontable.EditorManager#\n   * @returns {*}\n   */\n  this.getActiveEditor = function () {\n    return activeEditor;\n  };\n\n  /**\n   * Prepare text input to be displayed at given grid cell.\n   *\n   * @function prepareEditor\n   * @memberof! Handsontable.EditorManager#\n   */\n  this.prepareEditor = function () {\n    if (lock) {\n      return;\n    }\n\n    var row, col, prop, td, originalValue, cellProperties, editorClass;\n\n    if (activeEditor && activeEditor.isWaiting()) {\n      this.closeEditor(false, false, function (dataSaved) {\n        if (dataSaved) {\n          _this.prepareEditor();\n        }\n      });\n\n      return;\n    }\n    row = instance.selection.selectedRange.current().highlight.row;\n    col = instance.selection.selectedRange.current().highlight.col;\n    prop = instance.colToProp(col);\n    td = instance.getCell(row, col);\n\n    originalValue = instance.getSourceDataAtCell(instance.runHooks('modifyRow', row), col);\n    cellProperties = instance.getCellMeta(row, col);\n    editorClass = instance.getCellEditor(cellProperties);\n\n    if (editorClass) {\n      activeEditor = (0, _editors.getEditorInstance)(editorClass, instance);\n      activeEditor.prepare(row, col, prop, td, originalValue, cellProperties);\n    } else {\n      activeEditor = void 0;\n    }\n  };\n\n  /**\n   * Check is editor is opened/showed.\n   *\n   * @function isEditorOpened\n   * @memberof! Handsontable.EditorManager#\n   * @returns {Boolean}\n   */\n  this.isEditorOpened = function () {\n    return activeEditor && activeEditor.isOpened();\n  };\n\n  /**\n   * Open editor with initial value.\n   *\n   * @function openEditor\n   * @memberof! Handsontable.EditorManager#\n   * @param {null|String} newInitialValue new value from which editor will start if handled property it's not the `null`.\n   * @param {DOMEvent} event\n   */\n  this.openEditor = function (newInitialValue, event) {\n    if (activeEditor && !activeEditor.cellProperties.readOnly) {\n      activeEditor.beginEditing(newInitialValue, event);\n    } else if (activeEditor && activeEditor.cellProperties.readOnly) {\n\n      // move the selection after opening the editor with ENTER key\n      if (event && event.keyCode === _unicode.KEY_CODES.ENTER) {\n        moveSelectionAfterEnter();\n      }\n    }\n  };\n\n  /**\n   * Close editor, finish editing cell.\n   *\n   * @function closeEditor\n   * @memberof! Handsontable.EditorManager#\n   * @param {Boolean} restoreOriginalValue\n   * @param {Boolean} [ctrlDown]\n   * @param {Function} [callback]\n   */\n  this.closeEditor = function (restoreOriginalValue, ctrlDown, callback) {\n    if (activeEditor) {\n      activeEditor.finishEditing(restoreOriginalValue, ctrlDown, callback);\n    } else if (callback) {\n      callback(false);\n    }\n  };\n\n  /**\n   * Close editor and save changes.\n   *\n   * @function closeEditorAndSaveChanges\n   * @memberof! Handsontable.EditorManager#\n   * @param {Boolean} ctrlDown\n   */\n  this.closeEditorAndSaveChanges = function (ctrlDown) {\n    return this.closeEditor(false, ctrlDown);\n  };\n\n  /**\n   * Close editor and restore original value.\n   *\n   * @function closeEditorAndRestoreOriginalValue\n   * @memberof! Handsontable.EditorManager#\n   * @param {Boolean} ctrlDown\n   */\n  this.closeEditorAndRestoreOriginalValue = function (ctrlDown) {\n    return this.closeEditor(true, ctrlDown);\n  };\n\n  /**\n   * Destroy the instance.\n   */\n  this.destroy = function () {\n    destroyed = true;\n  };\n\n  init();\n}\n\nvar instances = new WeakMap();\n\nEditorManager.getInstance = function (hotInstance, hotSettings, selection, datamap) {\n  var editorManager = instances.get(hotInstance);\n\n  if (!editorManager) {\n    editorManager = new EditorManager(hotInstance, hotSettings, selection, datamap);\n    instances.set(hotInstance, editorManager);\n  }\n\n  return editorManager;\n};\n\nexports.default = EditorManager;\n\n/***/ }),\n/* 389 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _browser = __webpack_require__(27);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _event = __webpack_require__(12);\n\nvar _src = __webpack_require__(4);\n\nvar _src2 = _interopRequireDefault(_src);\n\nvar _mouseEventHandler = __webpack_require__(312);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Handsontable TableView constructor\n * @param {Object} instance\n */\nfunction TableView(instance) {\n  var _this = this;\n\n  var that = this;\n\n  this.eventManager = new _eventManager2.default(instance);\n  this.instance = instance;\n  this.settings = instance.getSettings();\n  this.selectionMouseDown = false;\n\n  var originalStyle = instance.rootElement.getAttribute('style');\n\n  if (originalStyle) {\n    instance.rootElement.setAttribute('data-originalstyle', originalStyle); // needed to retrieve original style in jsFiddle link generator in HT examples. may be removed in future versions\n  }\n\n  (0, _element.addClass)(instance.rootElement, 'handsontable');\n\n  var table = document.createElement('TABLE');\n  (0, _element.addClass)(table, 'htCore');\n\n  if (instance.getSettings().tableClassName) {\n    (0, _element.addClass)(table, instance.getSettings().tableClassName);\n  }\n  this.THEAD = document.createElement('THEAD');\n  table.appendChild(this.THEAD);\n  this.TBODY = document.createElement('TBODY');\n  table.appendChild(this.TBODY);\n\n  instance.table = table;\n\n  instance.container.insertBefore(table, instance.container.firstChild);\n\n  this.eventManager.addEventListener(instance.rootElement, 'mousedown', function (event) {\n    this.selectionMouseDown = true;\n\n    if (!that.isTextSelectionAllowed(event.target)) {\n      clearTextSelection();\n      event.preventDefault();\n      window.focus(); // make sure that window that contains HOT is active. Important when HOT is in iframe.\n    }\n  });\n  this.eventManager.addEventListener(instance.rootElement, 'mouseup', function (event) {\n    this.selectionMouseDown = false;\n  });\n  this.eventManager.addEventListener(instance.rootElement, 'mousemove', function (event) {\n    if (this.selectionMouseDown && !that.isTextSelectionAllowed(event.target)) {\n      clearTextSelection();\n      event.preventDefault();\n    }\n  });\n\n  this.eventManager.addEventListener(document.documentElement, 'keyup', function (event) {\n    if (instance.selection.isInProgress() && !event.shiftKey) {\n      instance.selection.finish();\n    }\n  });\n\n  var isMouseDown;\n  this.isMouseDown = function () {\n    return isMouseDown;\n  };\n\n  this.eventManager.addEventListener(document.documentElement, 'mouseup', function (event) {\n    if (instance.selection.isInProgress() && (0, _event.isLeftClick)(event)) {\n      // is left mouse button\n      instance.selection.finish();\n    }\n\n    isMouseDown = false;\n\n    if ((0, _element.isOutsideInput)(document.activeElement) || !instance.selection.isSelected() && !(0, _event.isRightClick)(event)) {\n      instance.unlisten();\n    }\n  });\n\n  this.eventManager.addEventListener(document.documentElement, 'mousedown', function (event) {\n    var originalTarget = event.target;\n    var next = event.target;\n    var eventX = event.x || event.clientX;\n    var eventY = event.y || event.clientY;\n\n    if (isMouseDown || !instance.rootElement) {\n      return; // it must have been started in a cell\n    }\n\n    // immediate click on \"holder\" means click on the right side of vertical scrollbar\n    if (next === instance.view.wt.wtTable.holder) {\n      var scrollbarWidth = (0, _element.getScrollbarWidth)();\n\n      if (document.elementFromPoint(eventX + scrollbarWidth, eventY) !== instance.view.wt.wtTable.holder || document.elementFromPoint(eventX, eventY + scrollbarWidth) !== instance.view.wt.wtTable.holder) {\n        return;\n      }\n    } else {\n      while (next !== document.documentElement) {\n        if (next === null) {\n          if (event.isTargetWebComponent) {\n            break;\n          }\n          // click on something that was a row but now is detached (possibly because your click triggered a rerender)\n          return;\n        }\n        if (next === instance.rootElement) {\n          // click inside container\n          return;\n        }\n        next = next.parentNode;\n      }\n    }\n\n    // function did not return until here, we have an outside click!\n\n    var outsideClickDeselects = typeof that.settings.outsideClickDeselects === 'function' ? that.settings.outsideClickDeselects(originalTarget) : that.settings.outsideClickDeselects;\n\n    if (outsideClickDeselects) {\n      instance.deselectCell();\n    } else {\n      instance.destroyEditor();\n    }\n  });\n\n  this.eventManager.addEventListener(table, 'selectstart', function (event) {\n    if (that.settings.fragmentSelection || (0, _element.isInput)(event.target)) {\n      return;\n    }\n    // https://github.com/handsontable/handsontable/issues/160\n    // Prevent text from being selected when performing drag down.\n    event.preventDefault();\n  });\n\n  var clearTextSelection = function clearTextSelection() {\n    // http://stackoverflow.com/questions/3169786/clear-text-selection-with-javascript\n    if (window.getSelection) {\n      if (window.getSelection().empty) {\n        // Chrome\n        window.getSelection().empty();\n      } else if (window.getSelection().removeAllRanges) {\n        // Firefox\n        window.getSelection().removeAllRanges();\n      }\n    } else if (document.selection) {\n      // IE?\n      document.selection.empty();\n    }\n  };\n\n  var walkontableConfig = {\n    debug: function debug() {\n      return that.settings.debug;\n    },\n    externalRowCalculator: this.instance.getPlugin('autoRowSize') && this.instance.getPlugin('autoRowSize').isEnabled(),\n    table: table,\n    preventOverflow: function preventOverflow() {\n      return _this.settings.preventOverflow;\n    },\n    stretchH: function stretchH() {\n      return that.settings.stretchH;\n    },\n    data: instance.getDataAtCell,\n    totalRows: function totalRows() {\n      return instance.countRows();\n    },\n    totalColumns: function totalColumns() {\n      return instance.countCols();\n    },\n    fixedColumnsLeft: function fixedColumnsLeft() {\n      return that.settings.fixedColumnsLeft;\n    },\n    fixedRowsTop: function fixedRowsTop() {\n      return that.settings.fixedRowsTop;\n    },\n    fixedRowsBottom: function fixedRowsBottom() {\n      return that.settings.fixedRowsBottom;\n    },\n    minSpareRows: function minSpareRows() {\n      return that.settings.minSpareRows;\n    },\n    renderAllRows: that.settings.renderAllRows,\n    rowHeaders: function rowHeaders() {\n      var headerRenderers = [];\n\n      if (instance.hasRowHeaders()) {\n        headerRenderers.push(function (row, TH) {\n          that.appendRowHeader(row, TH);\n        });\n      }\n      instance.runHooks('afterGetRowHeaderRenderers', headerRenderers);\n\n      return headerRenderers;\n    },\n    columnHeaders: function columnHeaders() {\n      var headerRenderers = [];\n\n      if (instance.hasColHeaders()) {\n        headerRenderers.push(function (column, TH) {\n          that.appendColHeader(column, TH);\n        });\n      }\n\n      instance.runHooks('afterGetColumnHeaderRenderers', headerRenderers);\n\n      return headerRenderers;\n    },\n    columnWidth: instance.getColWidth,\n    rowHeight: instance.getRowHeight,\n    cellRenderer: function cellRenderer(row, col, TD) {\n      var cellProperties = that.instance.getCellMeta(row, col);\n      var prop = that.instance.colToProp(col);\n      var value = that.instance.getDataAtRowProp(row, prop);\n\n      if (that.instance.hasHook('beforeValueRender')) {\n        value = that.instance.runHooks('beforeValueRender', value, cellProperties);\n      }\n\n      that.instance.runHooks('beforeRenderer', TD, row, col, prop, value, cellProperties);\n      that.instance.getCellRenderer(cellProperties)(that.instance, TD, row, col, prop, value, cellProperties);\n      that.instance.runHooks('afterRenderer', TD, row, col, prop, value, cellProperties);\n    },\n    selections: that.instance.selection.highlight,\n    hideBorderOnMouseDownOver: function hideBorderOnMouseDownOver() {\n      return that.settings.fragmentSelection;\n    },\n    onCellMouseDown: function onCellMouseDown(event, coords, TD, wt) {\n      var blockCalculations = {\n        row: false,\n        column: false,\n        cell: false\n      };\n\n      instance.listen();\n\n      that.activeWt = wt;\n      isMouseDown = true;\n\n      instance.runHooks('beforeOnCellMouseDown', event, coords, TD, blockCalculations);\n\n      if ((0, _event.isImmediatePropagationStopped)(event)) {\n        return;\n      }\n\n      (0, _mouseEventHandler.handleMouseEvent)(event, {\n        coords: coords,\n        selection: instance.selection,\n        controller: blockCalculations\n      });\n\n      instance.runHooks('afterOnCellMouseDown', event, coords, TD);\n      that.activeWt = that.wt;\n    },\n    onCellMouseOut: function onCellMouseOut(event, coords, TD, wt) {\n      that.activeWt = wt;\n      instance.runHooks('beforeOnCellMouseOut', event, coords, TD);\n\n      if ((0, _event.isImmediatePropagationStopped)(event)) {\n        return;\n      }\n\n      instance.runHooks('afterOnCellMouseOut', event, coords, TD);\n      that.activeWt = that.wt;\n    },\n    onCellMouseOver: function onCellMouseOver(event, coords, TD, wt) {\n      var blockCalculations = {\n        row: false,\n        column: false,\n        cell: false\n      };\n\n      that.activeWt = wt;\n\n      instance.runHooks('beforeOnCellMouseOver', event, coords, TD, blockCalculations);\n\n      if ((0, _event.isImmediatePropagationStopped)(event)) {\n        return;\n      }\n\n      if (isMouseDown) {\n        (0, _mouseEventHandler.handleMouseEvent)(event, {\n          coords: coords,\n          selection: instance.selection,\n          controller: blockCalculations\n        });\n      }\n\n      instance.runHooks('afterOnCellMouseOver', event, coords, TD);\n      that.activeWt = that.wt;\n    },\n    onCellMouseUp: function onCellMouseUp(event, coords, TD, wt) {\n      that.activeWt = wt;\n      instance.runHooks('beforeOnCellMouseUp', event, coords, TD);\n\n      instance.runHooks('afterOnCellMouseUp', event, coords, TD);\n      that.activeWt = that.wt;\n    },\n    onCellCornerMouseDown: function onCellCornerMouseDown(event) {\n      event.preventDefault();\n      instance.runHooks('afterOnCellCornerMouseDown', event);\n    },\n    onCellCornerDblClick: function onCellCornerDblClick(event) {\n      event.preventDefault();\n      instance.runHooks('afterOnCellCornerDblClick', event);\n    },\n    beforeDraw: function beforeDraw(force, skipRender) {\n      that.beforeRender(force, skipRender);\n    },\n    onDraw: function onDraw(force) {\n      that.onDraw(force);\n    },\n    onScrollVertically: function onScrollVertically() {\n      instance.runHooks('afterScrollVertically');\n    },\n    onScrollHorizontally: function onScrollHorizontally() {\n      instance.runHooks('afterScrollHorizontally');\n    },\n    onBeforeRemoveCellClassNames: function onBeforeRemoveCellClassNames() {\n      return instance.runHooks('beforeRemoveCellClassNames');\n    },\n    onAfterDrawSelection: function onAfterDrawSelection(currentRow, currentColumn, cornersOfSelection, layerLevel) {\n      return instance.runHooks('afterDrawSelection', currentRow, currentColumn, cornersOfSelection, layerLevel);\n    },\n    onBeforeDrawBorders: function onBeforeDrawBorders(corners, borderClassName) {\n      instance.runHooks('beforeDrawBorders', corners, borderClassName);\n    },\n    onBeforeTouchScroll: function onBeforeTouchScroll() {\n      instance.runHooks('beforeTouchScroll');\n    },\n    onAfterMomentumScroll: function onAfterMomentumScroll() {\n      instance.runHooks('afterMomentumScroll');\n    },\n    onBeforeStretchingColumnWidth: function onBeforeStretchingColumnWidth(stretchedWidth, column) {\n      return instance.runHooks('beforeStretchingColumnWidth', stretchedWidth, column);\n    },\n    onModifyRowHeaderWidth: function onModifyRowHeaderWidth(rowHeaderWidth) {\n      return instance.runHooks('modifyRowHeaderWidth', rowHeaderWidth);\n    },\n    onModifyGetCellCoords: function onModifyGetCellCoords(row, column, topmost) {\n      return instance.runHooks('modifyGetCellCoords', row, column, topmost);\n    },\n    viewportRowCalculatorOverride: function viewportRowCalculatorOverride(calc) {\n      var rows = instance.countRows();\n      var viewportOffset = that.settings.viewportRowRenderingOffset;\n\n      if (viewportOffset === 'auto' && that.settings.fixedRowsTop) {\n        viewportOffset = 10;\n      }\n      if (typeof viewportOffset === 'number') {\n        calc.startRow = Math.max(calc.startRow - viewportOffset, 0);\n        calc.endRow = Math.min(calc.endRow + viewportOffset, rows - 1);\n      }\n      if (viewportOffset === 'auto') {\n        var center = calc.startRow + calc.endRow - calc.startRow;\n        var offset = Math.ceil(center / rows * 12);\n\n        calc.startRow = Math.max(calc.startRow - offset, 0);\n        calc.endRow = Math.min(calc.endRow + offset, rows - 1);\n      }\n      instance.runHooks('afterViewportRowCalculatorOverride', calc);\n    },\n    viewportColumnCalculatorOverride: function viewportColumnCalculatorOverride(calc) {\n      var cols = instance.countCols();\n      var viewportOffset = that.settings.viewportColumnRenderingOffset;\n\n      if (viewportOffset === 'auto' && that.settings.fixedColumnsLeft) {\n        viewportOffset = 10;\n      }\n      if (typeof viewportOffset === 'number') {\n        calc.startColumn = Math.max(calc.startColumn - viewportOffset, 0);\n        calc.endColumn = Math.min(calc.endColumn + viewportOffset, cols - 1);\n      }\n      if (viewportOffset === 'auto') {\n        var center = calc.startColumn + calc.endColumn - calc.startColumn;\n        var offset = Math.ceil(center / cols * 12);\n\n        calc.startRow = Math.max(calc.startColumn - offset, 0);\n        calc.endColumn = Math.min(calc.endColumn + offset, cols - 1);\n      }\n      instance.runHooks('afterViewportColumnCalculatorOverride', calc);\n    },\n    rowHeaderWidth: function rowHeaderWidth() {\n      return that.settings.rowHeaderWidth;\n    },\n    columnHeaderHeight: function columnHeaderHeight() {\n      var columnHeaderHeight = instance.runHooks('modifyColumnHeaderHeight');\n      return that.settings.columnHeaderHeight || columnHeaderHeight;\n    }\n  };\n\n  instance.runHooks('beforeInitWalkontable', walkontableConfig);\n\n  this.wt = new _src2.default(walkontableConfig);\n  this.activeWt = this.wt;\n\n  this.eventManager.addEventListener(that.wt.wtTable.spreader, 'mousedown', function (event) {\n    // right mouse button exactly on spreader means right click on the right hand side of vertical scrollbar\n    if (event.target === that.wt.wtTable.spreader && event.which === 3) {\n      (0, _event.stopPropagation)(event);\n    }\n  });\n\n  this.eventManager.addEventListener(that.wt.wtTable.spreader, 'contextmenu', function (event) {\n    // right mouse button exactly on spreader means right click on the right hand side of vertical scrollbar\n    if (event.target === that.wt.wtTable.spreader && event.which === 3) {\n      (0, _event.stopPropagation)(event);\n    }\n  });\n\n  this.eventManager.addEventListener(document.documentElement, 'click', function () {\n    if (that.settings.observeDOMVisibility) {\n      if (that.wt.drawInterrupted) {\n        that.instance.forceFullRender = true;\n        that.render();\n      }\n    }\n  });\n}\n\nTableView.prototype.isTextSelectionAllowed = function (el) {\n  if ((0, _element.isInput)(el)) {\n    return true;\n  }\n  var isChildOfTableBody = (0, _element.isChildOf)(el, this.instance.view.wt.wtTable.spreader);\n\n  if (this.settings.fragmentSelection === true && isChildOfTableBody) {\n    return true;\n  }\n  if (this.settings.fragmentSelection === 'cell' && this.isSelectedOnlyCell() && isChildOfTableBody) {\n    return true;\n  }\n  if (!this.settings.fragmentSelection && this.isCellEdited() && this.isSelectedOnlyCell()) {\n    return true;\n  }\n\n  return false;\n};\n\n/**\n * Check if selected only one cell.\n *\n * @returns {Boolean}\n */\nTableView.prototype.isSelectedOnlyCell = function () {\n  var _ref = this.instance.getSelectedLast() || [],\n      _ref2 = _slicedToArray(_ref, 4),\n      row = _ref2[0],\n      col = _ref2[1],\n      rowEnd = _ref2[2],\n      colEnd = _ref2[3];\n\n  return row !== void 0 && row === rowEnd && col === colEnd;\n};\n\nTableView.prototype.isCellEdited = function () {\n  var activeEditor = this.instance.getActiveEditor();\n\n  return activeEditor && activeEditor.isOpened();\n};\n\nTableView.prototype.beforeRender = function (force, skipRender) {\n  if (force) {\n    // this.instance.forceFullRender = did Handsontable request full render?\n    this.instance.runHooks('beforeRender', this.instance.forceFullRender, skipRender);\n  }\n};\n\nTableView.prototype.onDraw = function (force) {\n  if (force) {\n    // this.instance.forceFullRender = did Handsontable request full render?\n    this.instance.runHooks('afterRender', this.instance.forceFullRender);\n  }\n};\n\nTableView.prototype.render = function () {\n  this.wt.draw(!this.instance.forceFullRender);\n  this.instance.forceFullRender = false;\n  this.instance.renderCall = false;\n};\n\n/**\n * Returns td object given coordinates\n *\n * @param {CellCoords} coords\n * @param {Boolean} topmost\n */\nTableView.prototype.getCellAtCoords = function (coords, topmost) {\n  var td = this.wt.getCell(coords, topmost);\n\n  if (td < 0) {\n    // there was an exit code (cell is out of bounds)\n    return null;\n  }\n\n  return td;\n};\n\n/**\n * Scroll viewport to selection.\n *\n * @param {CellCoords} coords\n */\nTableView.prototype.scrollViewport = function (coords) {\n  this.wt.scrollViewport(coords);\n};\n\n/**\n * Append row header to a TH element\n * @param row\n * @param TH\n */\nTableView.prototype.appendRowHeader = function (row, TH) {\n  if (TH.firstChild) {\n    var container = TH.firstChild;\n\n    if (!(0, _element.hasClass)(container, 'relative')) {\n      (0, _element.empty)(TH);\n      this.appendRowHeader(row, TH);\n\n      return;\n    }\n    this.updateCellHeader(container.querySelector('.rowHeader'), row, this.instance.getRowHeader);\n  } else {\n    var div = document.createElement('div');\n    var span = document.createElement('span');\n\n    div.className = 'relative';\n    span.className = 'rowHeader';\n    this.updateCellHeader(span, row, this.instance.getRowHeader);\n\n    div.appendChild(span);\n    TH.appendChild(div);\n  }\n\n  this.instance.runHooks('afterGetRowHeader', row, TH);\n};\n\n/**\n * Append column header to a TH element\n * @param col\n * @param TH\n */\nTableView.prototype.appendColHeader = function (col, TH) {\n  if (TH.firstChild) {\n    var container = TH.firstChild;\n\n    if ((0, _element.hasClass)(container, 'relative')) {\n      this.updateCellHeader(container.querySelector('.colHeader'), col, this.instance.getColHeader);\n    } else {\n      (0, _element.empty)(TH);\n      this.appendColHeader(col, TH);\n    }\n  } else {\n    var div = document.createElement('div');\n    var span = document.createElement('span');\n\n    div.className = 'relative';\n    span.className = 'colHeader';\n    this.updateCellHeader(span, col, this.instance.getColHeader);\n\n    div.appendChild(span);\n    TH.appendChild(div);\n  }\n\n  this.instance.runHooks('afterGetColHeader', col, TH);\n};\n\n/**\n * Update header cell content\n *\n * @since 0.15.0-beta4\n * @param {HTMLElement} element Element to update\n * @param {Number} index Row index or column index\n * @param {Function} content Function which should be returns content for this cell\n */\nTableView.prototype.updateCellHeader = function (element, index, content) {\n  var renderedIndex = index;\n  var parentOverlay = this.wt.wtOverlays.getParentOverlay(element) || this.wt;\n\n  // prevent wrong calculations from SampleGenerator\n  if (element.parentNode) {\n    if ((0, _element.hasClass)(element, 'colHeader')) {\n      renderedIndex = parentOverlay.wtTable.columnFilter.sourceToRendered(index);\n    } else if ((0, _element.hasClass)(element, 'rowHeader')) {\n      renderedIndex = parentOverlay.wtTable.rowFilter.sourceToRendered(index);\n    }\n  }\n\n  if (renderedIndex > -1) {\n    (0, _element.fastInnerHTML)(element, content(index));\n  } else {\n    // workaround for https://github.com/handsontable/handsontable/issues/1946\n    (0, _element.fastInnerText)(element, String.fromCharCode(160));\n    (0, _element.addClass)(element, 'cornerHeader');\n  }\n};\n\n/**\n * Given a element's left position relative to the viewport, returns maximum element width until the right\n * edge of the viewport (before scrollbar)\n *\n * @param {Number} leftOffset\n * @return {Number}\n */\nTableView.prototype.maximumVisibleElementWidth = function (leftOffset) {\n  var workspaceWidth = this.wt.wtViewport.getWorkspaceWidth();\n  var maxWidth = workspaceWidth - leftOffset;\n  return maxWidth > 0 ? maxWidth : 0;\n};\n\n/**\n * Given a element's top position relative to the viewport, returns maximum element height until the bottom\n * edge of the viewport (before scrollbar)\n *\n * @param {Number} topOffset\n * @return {Number}\n */\nTableView.prototype.maximumVisibleElementHeight = function (topOffset) {\n  var workspaceHeight = this.wt.wtViewport.getWorkspaceHeight();\n  var maxHeight = workspaceHeight - topOffset;\n  return maxHeight > 0 ? maxHeight : 0;\n};\n\nTableView.prototype.mainViewIsActive = function () {\n  return this.wt === this.activeWt;\n};\n\nTableView.prototype.destroy = function () {\n  this.wt.destroy();\n  this.eventManager.destroy();\n};\n\nexports.default = TableView;\n\n/***/ }),\n/* 390 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class DataSource\n * @private\n */\nvar DataSource = function () {\n  function DataSource(hotInstance) {\n    var dataSource = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\n    _classCallCheck(this, DataSource);\n\n    /**\n     * Instance of Handsontable.\n     *\n     * @type {Handsontable}\n     */\n    this.hot = hotInstance;\n    /**\n     * Data source\n     *\n     * @type {Array}\n     */\n    this.data = dataSource;\n    /**\n     * Type of data source.\n     *\n     * @type {String}\n     * @default 'array'\n     */\n    this.dataType = 'array';\n\n    this.colToProp = function () {};\n    this.propToCol = function () {};\n  }\n\n  /**\n   * Get all data.\n   *\n   * @param {Boolean} [toArray=false] If `true` return source data as an array of arrays even when source data was provided\n   *                                  in another format.\n   * @returns {Array}\n   */\n\n\n  _createClass(DataSource, [{\n    key: 'getData',\n    value: function getData() {\n      var toArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      var result = this.data;\n\n      if (toArray) {\n        result = this.getByRange({ row: 0, col: 0 }, { row: Math.max(this.countRows() - 1, 0), col: Math.max(this.countColumns() - 1, 0) }, true);\n      }\n\n      return result;\n    }\n\n    /**\n     * Set new data source.\n     *\n     * @param data {Array}\n     */\n\n  }, {\n    key: 'setData',\n    value: function setData(data) {\n      this.data = data;\n    }\n\n    /**\n     * Returns array of column values from the data source. `column` is the index of the row in the data source.\n     *\n     * @param {Number} column Visual column index.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getAtColumn',\n    value: function getAtColumn(column) {\n      var _this = this;\n\n      var result = [];\n\n      (0, _array.arrayEach)(this.data, function (row) {\n        var property = _this.colToProp(column);\n\n        if (typeof property === 'string') {\n          row = (0, _object.getProperty)(row, property);\n        } else {\n          row = row[property];\n        }\n        result.push(row);\n      });\n\n      return result;\n    }\n\n    /**\n     * Returns a single row of the data (array or object, depending on what you have). `row` is the index of the row in the data source.\n     *\n     * @param {Number} row Physical row index.\n     * @returns {Array|Object}\n     */\n\n  }, {\n    key: 'getAtRow',\n    value: function getAtRow(row) {\n      return this.data[row];\n    }\n\n    /**\n     * Returns a single value from the data.\n     *\n     * @param {Number} row Physical row index.\n     * @param {Number} column Visual column index.\n     * @returns {*}\n     */\n\n  }, {\n    key: 'getAtCell',\n    value: function getAtCell(row, column) {\n      var result = null;\n\n      var modifyRowData = this.hot.runHooks('modifyRowData', row);\n\n      var dataRow = isNaN(modifyRowData) ? modifyRowData : this.data[row];\n\n      if (dataRow) {\n        var prop = this.colToProp(column);\n\n        if (typeof prop === 'string') {\n          result = (0, _object.getProperty)(dataRow, prop);\n        } else if (typeof prop === 'function') {\n          result = prop(this.data.slice(row, row + 1)[0]);\n        } else {\n          result = dataRow[prop];\n        }\n      }\n\n      return result;\n    }\n\n    /**\n     * Returns source data by passed range.\n     *\n     * @param {Object} start Object with physical `row` and `col` keys (or visual column index, if data type is an array of objects).\n     * @param {Object} end Object with physical `row` and `col` keys (or visual column index, if data type is an array of objects).\n     * @param {Boolean} [toArray=false] If `true` return source data as an array of arrays even when source data was provided\n     *                                  in another format.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getByRange',\n    value: function getByRange(start, end) {\n      var _this2 = this;\n\n      var toArray = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      var startRow = Math.min(start.row, end.row);\n      var startCol = Math.min(start.col, end.col);\n      var endRow = Math.max(start.row, end.row);\n      var endCol = Math.max(start.col, end.col);\n      var result = [];\n\n      (0, _number.rangeEach)(startRow, endRow, function (currentRow) {\n        var row = _this2.getAtRow(currentRow);\n        var newRow = void 0;\n\n        if (_this2.dataType === 'array') {\n          newRow = row.slice(startCol, endCol + 1);\n        } else if (_this2.dataType === 'object') {\n          newRow = toArray ? [] : {};\n\n          (0, _number.rangeEach)(startCol, endCol, function (column) {\n            var prop = _this2.colToProp(column);\n\n            if (toArray) {\n              newRow.push(row[prop]);\n            } else {\n              newRow[prop] = row[prop];\n            }\n          });\n        }\n\n        result.push(newRow);\n      });\n\n      return result;\n    }\n\n    /**\n     * Count number of rows.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'countRows',\n    value: function countRows() {\n      return Array.isArray(this.data) ? this.data.length : 0;\n    }\n\n    /**\n     * Count number of columns.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'countColumns',\n    value: function countColumns() {\n      var result = 0;\n\n      if (Array.isArray(this.data)) {\n        if (this.dataType === 'array') {\n          result = this.data[0].length;\n        } else if (this.dataType === 'object') {\n          result = Object.keys(this.data[0]).length;\n        }\n      }\n\n      return result;\n    }\n\n    /**\n     * Destroy instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.data = null;\n      this.hot = null;\n    }\n  }]);\n\n  return DataSource;\n}();\n\nexports.default = DataSource;\n\n/***/ }),\n/* 391 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 15, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for English - United States language-country.\n                                                                                                                                                                                                                   */\n\n\nvar dictionary = (_dictionary = {\n  languageCode: 'en-US'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Insert row above'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Insert row below'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Insert column left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Insert column right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Remove row', 'Remove rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Remove column', 'Remove columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Undo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Redo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Read only'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Clear column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alignment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Center'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justify'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Middle'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Freeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Unfreeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Borders'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Remove border(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Add comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edit comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Delete comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Read-only comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Merge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Unmerge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copy'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Cut'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Insert child row'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Detach from parent'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Hide column', 'Hide columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Show column', 'Show columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Hide row', 'Hide rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Show row', 'Show rows']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'None'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Is empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Is not empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Is equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Is not equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Begins with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Ends with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contains'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Does not contain'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Greater than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Greater than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Less than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Less than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Is between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Is not between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'After'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Before'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Today'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Tomorrow'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Yesterday'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Blank cells'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filter by condition'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filter by value'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'And'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Or'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Select all'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Clear'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancel'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Search'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Value'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Second value'), _dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 392 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getPhraseFormatters = exports.registerPhraseFormatter = undefined;\nexports.register = register;\nexports.getAll = getAll;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _pluralize = __webpack_require__(393);\n\nvar _pluralize2 = _interopRequireDefault(_pluralize);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _staticRegister = (0, _staticRegister3.default)('phraseFormatters'),\n    registerGloballyPhraseFormatter = _staticRegister.register,\n    getGlobalPhraseFormatters = _staticRegister.getValues;\n\n/**\n * Register phrase formatter.\n *\n * @param {String} name Name of formatter.\n * @param {Function} formatterFn Function which will be applied on phrase propositions. It will transform them if it's possible.\n */\n\n\nfunction register(name, formatterFn) {\n  registerGloballyPhraseFormatter(name, formatterFn);\n}\n\n/**\n * Get all registered previously formatters.\n *\n * @returns {Array}\n */\nfunction getAll() {\n  return getGlobalPhraseFormatters();\n}\n\nexports.registerPhraseFormatter = register;\nexports.getPhraseFormatters = getAll;\n\n\nregister('pluralize', _pluralize2.default);\n\n/***/ }),\n/* 393 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = pluralize;\n/**\n * Try to choose plural form from available phrase propositions.\n *\n * @param {Array} phrasePropositions List of phrases propositions.\n * @param {number} pluralForm Number determining which phrase form should be used.\n *\n * @returns {String|Array} One particular phrase if it's possible, list of unchanged phrase propositions otherwise.\n */\nfunction pluralize(phrasePropositions, pluralForm) {\n  var isPluralizable = Array.isArray(phrasePropositions) && Number.isInteger(pluralForm);\n\n  if (isPluralizable) {\n    return phrasePropositions[pluralForm];\n  }\n\n  return phrasePropositions;\n};\n\n/***/ }),\n/* 394 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.Selection = exports.Highlight = exports.handleMouseEvent = undefined;\n\nvar _highlight = __webpack_require__(319);\n\nvar _highlight2 = _interopRequireDefault(_highlight);\n\nvar _selection = __webpack_require__(401);\n\nvar _selection2 = _interopRequireDefault(_selection);\n\nvar _mouseEventHandler = __webpack_require__(312);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.handleMouseEvent = _mouseEventHandler.handleMouseEvent;\nexports.Highlight = _highlight2.default;\nexports.Selection = _selection2.default;\n\n/***/ }),\n/* 395 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.createHighlight = undefined;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _activeHeader = __webpack_require__(396);\n\nvar _activeHeader2 = _interopRequireDefault(_activeHeader);\n\nvar _area = __webpack_require__(397);\n\nvar _area2 = _interopRequireDefault(_area);\n\nvar _cell = __webpack_require__(398);\n\nvar _cell2 = _interopRequireDefault(_cell);\n\nvar _fill = __webpack_require__(399);\n\nvar _fill2 = _interopRequireDefault(_fill);\n\nvar _header = __webpack_require__(400);\n\nvar _header2 = _interopRequireDefault(_header);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint-disable import/prefer-default-export */\nvar _staticRegister = (0, _staticRegister3.default)('highlight/types'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem;\n\nregister('active-header', _activeHeader2.default);\nregister('area', _area2.default);\nregister('cell', _cell2.default);\nregister('fill', _fill2.default);\nregister('header', _header2.default);\n\nfunction createHighlight(highlightType, options) {\n  return getItem(highlightType)(options);\n}\n\nexports.createHighlight = createHighlight;\n\n/***/ }),\n/* 396 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * @return {Selection}\n */\nfunction createHighlight(_ref) {\n  var activeHeaderClassName = _ref.activeHeaderClassName;\n\n  var s = new _src.Selection({\n    highlightHeaderClassName: activeHeaderClassName\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 397 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * Creates the new instance of Selection responsible for highlighting area of the selected multiple cells.\n *\n * @return {Selection}\n */\nfunction createHighlight(_ref) {\n  var layerLevel = _ref.layerLevel,\n      areaCornerVisible = _ref.areaCornerVisible;\n\n  var s = new _src.Selection({\n    className: 'area',\n    markIntersections: true,\n    layerLevel: Math.min(layerLevel, 7),\n    border: {\n      width: 1,\n      color: '#4b89ff',\n      cornerVisible: areaCornerVisible\n    }\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 398 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * Creates the new instance of Selection responsible for highlighting currently selected cell. This type of selection\n * can present on the table only one at the time.\n *\n * @return {Selection}\n */\nfunction createHighlight(_ref) {\n  var cellCornerVisible = _ref.cellCornerVisible;\n\n  var s = new _src.Selection({\n    className: 'current',\n    border: {\n      width: 2,\n      color: '#4b89ff',\n      cornerVisible: cellCornerVisible\n    }\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 399 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * Creates the new instance of Selection, responsible for highlighting cells which are covered by fill handle\n * functionality. This type of selection can present on the table only one at the time.\n *\n * @return {Selection}\n */\nfunction createHighlight() {\n  var s = new _src.Selection({\n    className: 'fill',\n    border: {\n      width: 1,\n      color: '#ff0000'\n    }\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 400 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * Creates the new instance of Selection, responsible for highlighting row and column headers. This type of selection\n * can occur multiple times.\n *\n * @return {Selection}\n */\nfunction createHighlight(_ref) {\n  var headerClassName = _ref.headerClassName,\n      rowClassName = _ref.rowClassName,\n      columnClassName = _ref.columnClassName;\n\n  var s = new _src.Selection({\n    className: 'highlight',\n    highlightHeaderClassName: headerClassName,\n    highlightRowClassName: rowClassName,\n    highlightColumnClassName: columnClassName\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 401 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['Unsupported format of the selection ranges was passed. To select cells pass \\n        the coordinates as an array of arrays ([[rowStart, columnStart/columnPropStart, rowEnd, columnEnd/columnPropEnd]]) \\n        or as an array of CellRange objects.'], ['Unsupported format of the selection ranges was passed. To select cells pass\\\\x20\\n        the coordinates as an array of arrays ([[rowStart, columnStart/columnPropStart, rowEnd, columnEnd/columnPropEnd]])\\\\x20\\n        or as an array of CellRange objects.']);\n\nvar _highlight = __webpack_require__(319);\n\nvar _highlight2 = _interopRequireDefault(_highlight);\n\nvar _range = __webpack_require__(402);\n\nvar _range2 = _interopRequireDefault(_range);\n\nvar _src = __webpack_require__(4);\n\nvar _keyStateObserver = __webpack_require__(318);\n\nvar _object = __webpack_require__(2);\n\nvar _mixed = __webpack_require__(16);\n\nvar _array = __webpack_require__(1);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nvar _transformation = __webpack_require__(403);\n\nvar _transformation2 = _interopRequireDefault(_transformation);\n\nvar _utils = __webpack_require__(91);\n\nvar _templateLiteralTag = __webpack_require__(42);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Selection\n * @util\n */\nvar Selection = function () {\n  function Selection(settings, tableProps) {\n    var _this = this;\n\n    _classCallCheck(this, Selection);\n\n    /**\n     * Handsontable settings instance.\n     *\n     * @type {GridSettings}\n     */\n    this.settings = settings;\n    /**\n     * An additional object with dynamically defined properties which describes table state.\n     *\n     * @type {Object}\n     */\n    this.tableProps = tableProps;\n    /**\n     * The flag which determines if the selection is in progress.\n     *\n     * @type {Boolean}\n     */\n    this.inProgress = false;\n    /**\n     * The flag indicates that selection was performed by clicking the corner overlay.\n     *\n     * @type {Boolean}\n     */\n    this.selectedByCorner = false;\n    /**\n     * The collection of the selection layer levels where the whole row was selected using the row header.\n     *\n     * @type {Set.<Number>}\n     */\n    this.selectedByRowHeader = new Set();\n    /**\n     * The collection of the selection layer levels where the whole column was selected using the column header.\n     *\n     * @type {Set.<Number>}\n     */\n    this.selectedByColumnHeader = new Set();\n    /**\n     * Selection data layer.\n     *\n     * @type {SelectionRange}\n     */\n    this.selectedRange = new _range2.default();\n    /**\n     * Visualization layer.\n     *\n     * @type {Highlight}\n     */\n    this.highlight = new _highlight2.default({\n      headerClassName: settings.currentHeaderClassName,\n      activeHeaderClassName: settings.activeHeaderClassName,\n      rowClassName: settings.currentRowClassName,\n      columnClassName: settings.currentColClassName,\n      disableHighlight: this.settings.disableVisualSelection,\n      cellCornerVisible: function cellCornerVisible() {\n        return _this.isCellCornerVisible.apply(_this, arguments);\n      },\n      areaCornerVisible: function areaCornerVisible() {\n        return _this.isAreaCornerVisible.apply(_this, arguments);\n      }\n    });\n    /**\n     * The module for modifying coordinates.\n     *\n     * @type {Transformation}\n     */\n    this.transformation = new _transformation2.default(this.selectedRange, {\n      countRows: function countRows() {\n        return _this.tableProps.countRows();\n      },\n      countCols: function countCols() {\n        return _this.tableProps.countCols();\n      },\n      fixedRowsBottom: function fixedRowsBottom() {\n        return settings.fixedRowsBottom;\n      },\n      minSpareRows: function minSpareRows() {\n        return settings.minSpareRows;\n      },\n      minSpareCols: function minSpareCols() {\n        return settings.minSpareCols;\n      },\n      autoWrapRow: function autoWrapRow() {\n        return settings.autoWrapRow;\n      },\n      autoWrapCol: function autoWrapCol() {\n        return settings.autoWrapCol;\n      }\n    });\n\n    this.transformation.addLocalHook('beforeTransformStart', function () {\n      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['beforeModifyTransformStart'].concat(args));\n    });\n    this.transformation.addLocalHook('afterTransformStart', function () {\n      for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['afterModifyTransformStart'].concat(args));\n    });\n    this.transformation.addLocalHook('beforeTransformEnd', function () {\n      for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['beforeModifyTransformEnd'].concat(args));\n    });\n    this.transformation.addLocalHook('afterTransformEnd', function () {\n      for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        args[_key4] = arguments[_key4];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['afterModifyTransformEnd'].concat(args));\n    });\n    this.transformation.addLocalHook('insertRowRequire', function () {\n      for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n        args[_key5] = arguments[_key5];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['insertRowRequire'].concat(args));\n    });\n    this.transformation.addLocalHook('insertColRequire', function () {\n      for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n        args[_key6] = arguments[_key6];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['insertColRequire'].concat(args));\n    });\n  }\n\n  /**\n   * Get data layer for current selection.\n   *\n   * @return {SelectionRange}\n   */\n\n\n  _createClass(Selection, [{\n    key: 'getSelectedRange',\n    value: function getSelectedRange() {\n      return this.selectedRange;\n    }\n\n    /**\n     * Indicate that selection process began. It sets internaly `.inProgress` property to `true`.\n     */\n\n  }, {\n    key: 'begin',\n    value: function begin() {\n      this.inProgress = true;\n    }\n\n    /**\n     * Indicate that selection process finished. It sets internaly `.inProgress` property to `false`.\n     */\n\n  }, {\n    key: 'finish',\n    value: function finish() {\n      this.runLocalHooks('afterSelectionFinished', Array.from(this.selectedRange));\n      this.inProgress = false;\n    }\n\n    /**\n     * Check if the process of selecting the cell/cells is in progress.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isInProgress',\n    value: function isInProgress() {\n      return this.inProgress;\n    }\n\n    /**\n     * Starts selection range on given coordinate object.\n     *\n     * @param {CellCoords} coords Visual coords.\n     * @param {Boolean} [multipleSelection] If `true`, selection will be worked in 'multiple' mode. This option works\n     *                                      only when 'selectionMode' is set as 'multiple'. If the argument is not defined\n     *                                      the default trigger will be used (isPressedCtrlKey() helper).\n     * @param {Boolean} [fragment=false] If `true`, the selection will be treated as a partial selection where the\n     *                                   `setRangeEnd` method won't be called on every `setRangeStart` call.\n     */\n\n  }, {\n    key: 'setRangeStart',\n    value: function setRangeStart(coords, multipleSelection) {\n      var fragment = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      var isMultipleMode = this.settings.selectionMode === 'multiple';\n      var isMultipleSelection = (0, _mixed.isUndefined)(multipleSelection) ? (0, _keyStateObserver.isPressedCtrlKey)() : multipleSelection;\n      var isRowNegative = coords.row < 0;\n      var isColumnNegative = coords.col < 0;\n      var selectedByCorner = isRowNegative && isColumnNegative;\n\n      if (isRowNegative) {\n        coords.row = 0;\n      }\n      if (isColumnNegative) {\n        coords.col = 0;\n      }\n\n      this.selectedByCorner = selectedByCorner;\n      this.runLocalHooks('beforeSetRangeStart' + (fragment ? 'Only' : ''), coords);\n\n      if (!isMultipleMode || isMultipleMode && !isMultipleSelection && (0, _mixed.isUndefined)(multipleSelection)) {\n        this.selectedRange.clear();\n      }\n\n      this.selectedRange.add(coords);\n\n      if (this.getLayerLevel() === 0) {\n        this.selectedByRowHeader.clear();\n        this.selectedByColumnHeader.clear();\n      }\n\n      if (!selectedByCorner && isColumnNegative) {\n        this.selectedByRowHeader.add(this.getLayerLevel());\n      }\n      if (!selectedByCorner && isRowNegative) {\n        this.selectedByColumnHeader.add(this.getLayerLevel());\n      }\n\n      if (!fragment) {\n        this.setRangeEnd(coords);\n      }\n    }\n\n    /**\n     * Starts selection range on given coordinate object.\n     *\n     * @param {CellCoords} coords Visual coords.\n     * @param {Boolean} [multipleSelection] If `true`, selection will be worked in 'multiple' mode. This option works\n     *                                      only when 'selectionMode' is set as 'multiple'. If the argument is not defined\n     *                                      the default trigger will be used (isPressedCtrlKey() helper).\n     */\n\n  }, {\n    key: 'setRangeStartOnly',\n    value: function setRangeStartOnly(coords, multipleSelection) {\n      this.setRangeStart(coords, multipleSelection, true);\n    }\n\n    /**\n     * Ends selection range on given coordinate object.\n     *\n     * @param {CellCoords} coords Visual coords.\n     */\n\n  }, {\n    key: 'setRangeEnd',\n    value: function setRangeEnd(coords) {\n      if (this.selectedRange.isEmpty()) {\n        return;\n      }\n\n      this.runLocalHooks('beforeSetRangeEnd', coords);\n      this.begin();\n\n      var cellRange = this.selectedRange.current();\n\n      if (this.settings.selectionMode !== 'single') {\n        cellRange.setTo(new _src.CellCoords(coords.row, coords.col));\n      }\n\n      // Set up current selection.\n      this.highlight.getCell().clear();\n\n      if (this.highlight.isEnabledFor(_highlight.CELL_TYPE)) {\n        this.highlight.getCell().add(this.selectedRange.current().highlight);\n      }\n\n      var layerLevel = this.getLayerLevel();\n\n      // If the next layer level is lower than previous then clear all area and header highlights. This is the\n      // indication that the new selection is performing.\n      if (layerLevel < this.highlight.layerLevel) {\n        (0, _array.arrayEach)(this.highlight.getAreas(), function (highlight) {\n          return void highlight.clear();\n        });\n        (0, _array.arrayEach)(this.highlight.getHeaders(), function (highlight) {\n          return void highlight.clear();\n        });\n        (0, _array.arrayEach)(this.highlight.getActiveHeaders(), function (highlight) {\n          return void highlight.clear();\n        });\n      }\n\n      this.highlight.useLayerLevel(layerLevel);\n\n      var areaHighlight = this.highlight.createOrGetArea();\n      var headerHighlight = this.highlight.createOrGetHeader();\n      var activeHeaderHighlight = this.highlight.createOrGetActiveHeader();\n\n      areaHighlight.clear();\n      headerHighlight.clear();\n      activeHeaderHighlight.clear();\n\n      if (this.highlight.isEnabledFor(_highlight.AREA_TYPE) && (this.isMultiple() || layerLevel >= 1)) {\n        areaHighlight.add(cellRange.from).add(cellRange.to);\n\n        if (layerLevel === 1) {\n          // For single cell selection in the same layer, we do not create area selection to prevent blue background.\n          // When non-consecutive selection is performed we have to add that missing area selection to the previous layer\n          // based on previous coordinates. It only occurs when the previous selection wasn't select multiple cells.\n          this.highlight.useLayerLevel(layerLevel - 1).createOrGetArea().add(this.selectedRange.previous().from);\n\n          this.highlight.useLayerLevel(layerLevel);\n        }\n      }\n\n      if (this.highlight.isEnabledFor(_highlight.HEADER_TYPE)) {\n        if (this.settings.selectionMode === 'single') {\n          headerHighlight.add(cellRange.highlight);\n        } else {\n          headerHighlight.add(cellRange.from).add(cellRange.to);\n        }\n      }\n\n      if (this.isSelectedByRowHeader()) {\n        var isRowSelected = this.tableProps.countCols() === cellRange.getWidth();\n\n        // Make sure that the whole row is selected (in case where selectionMode is set to 'single')\n        if (isRowSelected) {\n          activeHeaderHighlight.add(new _src.CellCoords(cellRange.from.row, -1)).add(new _src.CellCoords(cellRange.to.row, -1));\n        }\n      }\n\n      if (this.isSelectedByColumnHeader()) {\n        var isColumnSelected = this.tableProps.countRows() === cellRange.getHeight();\n\n        // Make sure that the whole column is selected (in case where selectionMode is set to 'single')\n        if (isColumnSelected) {\n          activeHeaderHighlight.add(new _src.CellCoords(-1, cellRange.from.col)).add(new _src.CellCoords(-1, cellRange.to.col));\n        }\n      }\n\n      this.runLocalHooks('afterSetRangeEnd', coords);\n    }\n\n    /**\n     * Returns information if we have a multiselection. This method check multiselection only on the latest layer of\n     * the selection.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isMultiple',\n    value: function isMultiple() {\n      var isMultipleListener = (0, _object.createObjectPropListener)(!this.selectedRange.current().isSingle());\n\n      this.runLocalHooks('afterIsMultipleSelection', isMultipleListener);\n\n      return isMultipleListener.value;\n    }\n\n    /**\n     * Selects cell relative to the current cell (if possible).\n     *\n     * @param {Number} rowDelta Rows number to move, value can be passed as negative number.\n     * @param {Number} colDelta Columns number to move, value can be passed as negative number.\n     * @param {Boolean} force If `true` the new rows/columns will be created if necessary. Otherwise, row/column will\n     *                        be created according to `minSpareRows/minSpareCols` settings of Handsontable.\n     */\n\n  }, {\n    key: 'transformStart',\n    value: function transformStart(rowDelta, colDelta, force) {\n      this.setRangeStart(this.transformation.transformStart(rowDelta, colDelta, force));\n    }\n\n    /**\n     * Sets selection end cell relative to the current selection end cell (if possible).\n     *\n     * @param {Number} rowDelta Rows number to move, value can be passed as negative number.\n     * @param {Number} colDelta Columns number to move, value can be passed as negative number.\n     */\n\n  }, {\n    key: 'transformEnd',\n    value: function transformEnd(rowDelta, colDelta) {\n      this.setRangeEnd(this.transformation.transformEnd(rowDelta, colDelta));\n    }\n\n    /**\n     * Returns currently used layer level.\n     *\n     * @return {Number} Returns layer level starting from 0. If no selection was added to the table -1 is returned.\n     */\n\n  }, {\n    key: 'getLayerLevel',\n    value: function getLayerLevel() {\n      return this.selectedRange.size() - 1;\n    }\n\n    /**\n     * Returns `true` if currently there is a selection on the screen, `false` otherwise.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSelected',\n    value: function isSelected() {\n      return !this.selectedRange.isEmpty();\n    }\n\n    /**\n     * Returns `true` if the selection was applied by clicking to the row header. If the `layerLevel`\n     * argument is passed then only that layer will be checked. Otherwise, it checks if any row header\n     * was clicked on any selection layer level.\n     *\n     * @param {Number} [layerLevel=this.getLayerLevel()] Selection layer level to check.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSelectedByRowHeader',\n    value: function isSelectedByRowHeader() {\n      var layerLevel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getLayerLevel();\n\n      return layerLevel === -1 ? this.selectedByRowHeader.size > 0 : this.selectedByRowHeader.has(layerLevel);\n    }\n\n    /**\n     * Returns `true` if the selection was applied by clicking to the column header. If the `layerLevel`\n     * argument is passed then only that layer will be checked. Otherwise, it checks if any column header\n     * was clicked on any selection layer level.\n     *\n     * @param {Number} [layerLevel=this.getLayerLevel()] Selection layer level to check.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSelectedByColumnHeader',\n    value: function isSelectedByColumnHeader() {\n      var layerLevel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getLayerLevel();\n\n      return layerLevel === -1 ? this.selectedByColumnHeader.size > 0 : this.selectedByColumnHeader.has(layerLevel);\n    }\n\n    /**\n     * Returns `true` if the selection was applied by clicking on the row or column header on any layer level.\n     *\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSelectedByAnyHeader',\n    value: function isSelectedByAnyHeader() {\n      return this.isSelectedByRowHeader(-1) || this.isSelectedByColumnHeader(-1);\n    }\n\n    /**\n     * Returns `true` if the selection was applied by clicking on the left-top corner overlay.\n     *\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSelectedByCorner',\n    value: function isSelectedByCorner() {\n      return this.selectedByCorner;\n    }\n\n    /**\n     * Returns `true` if coords is within selection coords. This method iterates through all selection layers to check if\n     * the coords object is within selection range.\n     *\n     * @param {CellCoords} coords The CellCoords instance with defined visual coordinates.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'inInSelection',\n    value: function inInSelection(coords) {\n      return this.selectedRange.includes(coords);\n    }\n\n    /**\n     * Returns `true` if the cell corner should be visible.\n     *\n     * @private\n     * @return {Boolean} `true` if the corner element has to be visible, `false` otherwise.\n     */\n\n  }, {\n    key: 'isCellCornerVisible',\n    value: function isCellCornerVisible() {\n      return this.settings.fillHandle && !this.tableProps.isEditorOpened() && !this.isMultiple();\n    }\n\n    /**\n     * Returns `true` if the area corner should be visible.\n     *\n     * @param {Number} layerLevel The layer level.\n     * @return {Boolean} `true` if the corner element has to be visible, `false` otherwise.\n     */\n\n  }, {\n    key: 'isAreaCornerVisible',\n    value: function isAreaCornerVisible(layerLevel) {\n      if (Number.isInteger(layerLevel) && layerLevel !== this.getLayerLevel()) {\n        return false;\n      }\n\n      return this.settings.fillHandle && !this.tableProps.isEditorOpened() && this.isMultiple();\n    }\n\n    /**\n     * Clear the selection by resetting the collected ranges and highlights.\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.selectedRange.clear();\n      this.highlight.clear();\n    }\n\n    /**\n     * Deselects all selected cells.\n     */\n\n  }, {\n    key: 'deselect',\n    value: function deselect() {\n      if (!this.isSelected()) {\n        return;\n      }\n\n      this.inProgress = false;\n      this.clear();\n      this.runLocalHooks('afterDeselect');\n    }\n\n    /**\n     * Select all cells.\n     */\n\n  }, {\n    key: 'selectAll',\n    value: function selectAll() {\n      this.clear();\n      this.setRangeStart(new _src.CellCoords(-1, -1));\n      this.selectedByRowHeader.add(this.getLayerLevel());\n      this.selectedByColumnHeader.add(this.getLayerLevel());\n      this.setRangeEnd(new _src.CellCoords(this.tableProps.countRows() - 1, this.tableProps.countCols() - 1));\n    }\n\n    /**\n     * Make multiple, non-contiguous selection specified by `row` and `column` values or a range of cells\n     * finishing at `endRow`, `endColumn`. The method supports two input formats, first as an array of arrays such\n     * as `[[rowStart, columnStart, rowEnd, columnEnd]]` and second format as an array of CellRange objects.\n     * If the passed ranges have another format the exception will be thrown.\n     *\n     * @param {Array[]|CellRange[]} selectionRanges The coordinates which define what the cells should be selected.\n     * @return {Boolean} Returns `true` if selection was successful, `false` otherwise.\n     */\n\n  }, {\n    key: 'selectCells',\n    value: function selectCells(selectionRanges) {\n      var _this2 = this;\n\n      var selectionType = (0, _utils.detectSelectionType)(selectionRanges);\n\n      if (selectionType === _utils.SELECTION_TYPE_EMPTY) {\n        return false;\n      } else if (selectionType === _utils.SELECTION_TYPE_UNRECOGNIZED) {\n        throw new Error((0, _templateLiteralTag.toSingleLine)(_templateObject));\n      }\n\n      var selectionSchemaNormalizer = (0, _utils.normalizeSelectionFactory)(selectionType, {\n        propToCol: function propToCol(prop) {\n          return _this2.tableProps.propToCol(prop);\n        },\n        keepDirection: true\n      });\n      var countRows = this.tableProps.countRows();\n      var countCols = this.tableProps.countCols();\n\n      // Check if every layer of the coordinates are valid.\n      var isValid = !selectionRanges.some(function (selection) {\n        var _selectionSchemaNorma = selectionSchemaNormalizer(selection),\n            _selectionSchemaNorma2 = _slicedToArray(_selectionSchemaNorma, 4),\n            rowStart = _selectionSchemaNorma2[0],\n            columnStart = _selectionSchemaNorma2[1],\n            rowEnd = _selectionSchemaNorma2[2],\n            columnEnd = _selectionSchemaNorma2[3];\n\n        var _isValid = (0, _utils.isValidCoord)(rowStart, countRows) && (0, _utils.isValidCoord)(columnStart, countCols) && (0, _utils.isValidCoord)(rowEnd, countRows) && (0, _utils.isValidCoord)(columnEnd, countCols);\n\n        return !_isValid;\n      });\n\n      if (isValid) {\n        this.clear();\n\n        (0, _array.arrayEach)(selectionRanges, function (selection) {\n          var _selectionSchemaNorma3 = selectionSchemaNormalizer(selection),\n              _selectionSchemaNorma4 = _slicedToArray(_selectionSchemaNorma3, 4),\n              rowStart = _selectionSchemaNorma4[0],\n              columnStart = _selectionSchemaNorma4[1],\n              rowEnd = _selectionSchemaNorma4[2],\n              columnEnd = _selectionSchemaNorma4[3];\n\n          _this2.setRangeStartOnly(new _src.CellCoords(rowStart, columnStart), false);\n          _this2.setRangeEnd(new _src.CellCoords(rowEnd, columnEnd));\n          _this2.finish();\n        });\n      }\n\n      return isValid;\n    }\n\n    /**\n     * Select column specified by `startColumn` visual index or column property or a range of columns finishing at `endColumn`.\n     *\n     * @param {Number|String} startColumn Visual column index or column property from which the selection starts.\n     * @param {Number|String} [endColumn] Visual column index or column property from to the selection finishes.\n     * @returns {Boolean} Returns `true` if selection was successful, `false` otherwise.\n     */\n\n  }, {\n    key: 'selectColumns',\n    value: function selectColumns(startColumn) {\n      var endColumn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startColumn;\n\n      startColumn = typeof startColumn === 'string' ? this.tableProps.propToCol(startColumn) : startColumn;\n      endColumn = typeof endColumn === 'string' ? this.tableProps.propToCol(endColumn) : endColumn;\n\n      var countCols = this.tableProps.countCols();\n      var isValid = (0, _utils.isValidCoord)(startColumn, countCols) && (0, _utils.isValidCoord)(endColumn, countCols);\n\n      if (isValid) {\n        this.setRangeStartOnly(new _src.CellCoords(-1, startColumn));\n        this.setRangeEnd(new _src.CellCoords(this.tableProps.countRows() - 1, endColumn));\n        this.finish();\n      }\n\n      return isValid;\n    }\n\n    /**\n     * Select row specified by `startRow` visual index or a range of rows finishing at `endRow`.\n     *\n     * @param {Number} startRow Visual row index from which the selection starts.\n     * @param {Number} [endRow] Visual row index from to the selection finishes.\n     * @returns {Boolean} Returns `true` if selection was successful, `false` otherwise.\n     */\n\n  }, {\n    key: 'selectRows',\n    value: function selectRows(startRow) {\n      var endRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startRow;\n\n      var countRows = this.tableProps.countRows();\n      var isValid = (0, _utils.isValidCoord)(startRow, countRows) && (0, _utils.isValidCoord)(endRow, countRows);\n\n      if (isValid) {\n        this.setRangeStartOnly(new _src.CellCoords(startRow, -1));\n        this.setRangeEnd(new _src.CellCoords(endRow, this.tableProps.countCols() - 1));\n        this.finish();\n      }\n\n      return isValid;\n    }\n  }]);\n\n  return Selection;\n}();\n\n(0, _object.mixin)(Selection, _localHooks2.default);\n\nexports.default = Selection;\n\n/***/ }),\n/* 402 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _src = __webpack_require__(4);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * The SelectionRange class is a simple CellRanges collection designed for easy manipulation of the multiple\n * consecutive and non-consecutive selections.\n *\n * @class SelectionRange\n * @util\n */\nvar SelectionRange = function () {\n  function SelectionRange() {\n    _classCallCheck(this, SelectionRange);\n\n    /**\n     * List of all CellRanges added to the class instance.\n     *\n     * @type {CellRange[]}\n     */\n    this.ranges = [];\n  }\n\n  /**\n   * Check if selected range is empty.\n   *\n   * @return {Boolean}\n   */\n\n\n  _createClass(SelectionRange, [{\n    key: 'isEmpty',\n    value: function isEmpty() {\n      return this.size() === 0;\n    }\n\n    /**\n     * Set coordinates to the class instance. It clears all previously added coordinates and push `coords`\n     * to the collection.\n     *\n     * @param {CellCoords} coords The CellCoords instance with defined visual coordinates.\n     * @returns {SelectionRange}\n     */\n\n  }, {\n    key: 'set',\n    value: function set(coords) {\n      this.clear();\n      this.ranges.push(new _src.CellRange(coords));\n\n      return this;\n    }\n\n    /**\n     * Add coordinates to the class instance. The new coordinates are added to the end of the range collection.\n     *\n     * @param {CellCoords} coords The CellCoords instance with defined visual coordinates.\n     * @returns {SelectionRange}\n     */\n\n  }, {\n    key: 'add',\n    value: function add(coords) {\n      this.ranges.push(new _src.CellRange(coords));\n\n      return this;\n    }\n\n    /**\n     * Get last added coordinates from ranges, it returns a CellRange instance.\n     *\n     * @return {CellRange|undefined}\n     */\n\n  }, {\n    key: 'current',\n    value: function current() {\n      return this.peekByIndex(0);\n    }\n\n    /**\n     * Get previously added coordinates from ranges, it returns a CellRange instance.\n     *\n     * @return {CellRange|undefined}\n     */\n\n  }, {\n    key: 'previous',\n    value: function previous() {\n      return this.peekByIndex(-1);\n    }\n\n    /**\n     * Returns `true` if coords is within selection coords. This method iterates through all selection layers to check if\n     * the coords object is within selection range.\n     *\n     * @param {CellCoords} coords The CellCoords instance with defined visual coordinates.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'includes',\n    value: function includes(coords) {\n      return this.ranges.some(function (cellRange) {\n        return cellRange.includes(coords);\n      });\n    }\n\n    /**\n     * Clear collection.\n     *\n     * @return {SelectionRange}\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.ranges.length = 0;\n\n      return this;\n    }\n\n    /**\n     * Get count of added all coordinates added to the selection.\n     *\n     * @return {Number}\n     */\n\n  }, {\n    key: 'size',\n    value: function size() {\n      return this.ranges.length;\n    }\n\n    /**\n     * Peek the coordinates based on the offset where that coordinate resides in the collection.\n     *\n     * @param {Number} [offset=0] An offset where the coordinate will be retrieved from.\n     * @return {CellRange|undefined}\n     */\n\n  }, {\n    key: 'peekByIndex',\n    value: function peekByIndex() {\n      var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n      var rangeIndex = this.size() + offset - 1;\n      var cellRange = void 0;\n\n      if (rangeIndex >= 0) {\n        cellRange = this.ranges[rangeIndex];\n      }\n\n      return cellRange;\n    }\n  }, {\n    key: Symbol.iterator,\n    value: function value() {\n      return this.ranges[Symbol.iterator]();\n    }\n  }]);\n\n  return SelectionRange;\n}();\n\nexports.default = SelectionRange;\n\n/***/ }),\n/* 403 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _src = __webpack_require__(4);\n\nvar _object = __webpack_require__(2);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * The Transformation class implements algorithms for transforming coordinates based on current settings\n * passed to the Handsontable.\n *\n * Transformation is always applied relative to the current selection.\n *\n * @class Transformation\n * @util\n */\nvar Transformation = function () {\n  function Transformation(range, options) {\n    _classCallCheck(this, Transformation);\n\n    /**\n     * Instance of the SelectionRange, holder for coordinates applied to the table.\n     *\n     * @type {SelectionRange}\n     */\n    this.range = range;\n    /**\n     * Additional options which define the state of the settings which can infer transformation.\n     *\n     * @type {Object}\n     */\n    this.options = options;\n  }\n\n  /**\n   * Selects cell relative to current cell (if possible).\n   *\n   * @param {Number} rowDelta Rows number to move, value can be passed as negative number.\n   * @param {Number} colDelta Columns number to move, value can be passed as negative number.\n   * @param {Boolean} force If `true` the new rows/columns will be created if necessary. Otherwise, row/column will\n   *                        be created according to `minSpareRows/minSpareCols` settings of Handsontable.\n   * @returns {CellCoords}\n   */\n\n\n  _createClass(Transformation, [{\n    key: 'transformStart',\n    value: function transformStart(rowDelta, colDelta, force) {\n      var delta = new _src.CellCoords(rowDelta, colDelta);\n\n      this.runLocalHooks('beforeTransformStart', delta);\n\n      var totalRows = this.options.countRows();\n      var totalCols = this.options.countCols();\n      var fixedRowsBottom = this.options.fixedRowsBottom();\n      var minSpareRows = this.options.minSpareRows();\n      var minSpareCols = this.options.minSpareCols();\n      var autoWrapRow = this.options.autoWrapRow();\n      var autoWrapCol = this.options.autoWrapCol();\n      var highlightCoords = this.range.current().highlight;\n\n      if (highlightCoords.row + rowDelta > totalRows - 1) {\n        if (force && minSpareRows > 0 && !(fixedRowsBottom && highlightCoords.row >= totalRows - fixedRowsBottom - 1)) {\n          this.runLocalHooks('insertRowRequire', totalRows);\n          totalRows = this.options.countRows();\n        } else if (autoWrapCol) {\n          delta.row = 1 - totalRows;\n          delta.col = highlightCoords.col + delta.col == totalCols - 1 ? 1 - totalCols : 1;\n        }\n      } else if (autoWrapCol && highlightCoords.row + delta.row < 0 && highlightCoords.col + delta.col >= 0) {\n        delta.row = totalRows - 1;\n        delta.col = highlightCoords.col + delta.col == 0 ? totalCols - 1 : -1;\n      }\n\n      if (highlightCoords.col + delta.col > totalCols - 1) {\n        if (force && minSpareCols > 0) {\n          this.runLocalHooks('insertColRequire', totalRows);\n          totalCols = this.options.countCols();\n        } else if (autoWrapRow) {\n          delta.row = highlightCoords.row + delta.row == totalRows - 1 ? 1 - totalRows : 1;\n          delta.col = 1 - totalCols;\n        }\n      } else if (autoWrapRow && highlightCoords.col + delta.col < 0 && highlightCoords.row + delta.row >= 0) {\n        delta.row = highlightCoords.row + delta.row == 0 ? totalRows - 1 : -1;\n        delta.col = totalCols - 1;\n      }\n\n      var coords = new _src.CellCoords(highlightCoords.row + delta.row, highlightCoords.col + delta.col);\n      var rowTransformDir = 0;\n      var colTransformDir = 0;\n\n      if (coords.row < 0) {\n        rowTransformDir = -1;\n        coords.row = 0;\n      } else if (coords.row > 0 && coords.row >= totalRows) {\n        rowTransformDir = 1;\n        coords.row = totalRows - 1;\n      }\n\n      if (coords.col < 0) {\n        colTransformDir = -1;\n        coords.col = 0;\n      } else if (coords.col > 0 && coords.col >= totalCols) {\n        colTransformDir = 1;\n        coords.col = totalCols - 1;\n      }\n      this.runLocalHooks('afterTransformStart', coords, rowTransformDir, colTransformDir);\n\n      return coords;\n    }\n\n    /**\n     * Sets selection end cell relative to current selection end cell (if possible).\n     *\n     * @param {Number} rowDelta Rows number to move, value can be passed as negative number.\n     * @param {Number} colDelta Columns number to move, value can be passed as negative number.\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'transformEnd',\n    value: function transformEnd(rowDelta, colDelta) {\n      var delta = new _src.CellCoords(rowDelta, colDelta);\n\n      this.runLocalHooks('beforeTransformEnd', delta);\n\n      var totalRows = this.options.countRows();\n      var totalCols = this.options.countCols();\n      var cellRange = this.range.current();\n      var coords = new _src.CellCoords(cellRange.to.row + delta.row, cellRange.to.col + delta.col);\n      var rowTransformDir = 0;\n      var colTransformDir = 0;\n\n      if (coords.row < 0) {\n        rowTransformDir = -1;\n        coords.row = 0;\n      } else if (coords.row > 0 && coords.row >= totalRows) {\n        rowTransformDir = 1;\n        coords.row = totalRows - 1;\n      }\n\n      if (coords.col < 0) {\n        colTransformDir = -1;\n        coords.col = 0;\n      } else if (coords.col > 0 && coords.col >= totalCols) {\n        colTransformDir = 1;\n        coords.col = totalCols - 1;\n      }\n      this.runLocalHooks('afterTransformEnd', coords, rowTransformDir, colTransformDir);\n\n      return coords;\n    }\n  }]);\n\n  return Transformation;\n}();\n\n(0, _object.mixin)(Transformation, _localHooks2.default);\n\nexports.default = Transformation;\n\n/***/ }),\n/* 404 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = jQueryWrapper;\nfunction jQueryWrapper(Handsontable) {\n  var jQuery = typeof window === 'undefined' ? false : window.jQuery;\n\n  if (!jQuery) {\n    return;\n  }\n\n  jQuery.fn.handsontable = function (action) {\n    var $this = this.first(); // Use only first element from list\n    var instance = $this.data('handsontable');\n\n    // Init case\n    if (typeof action !== 'string') {\n      var userSettings = action || {};\n\n      if (instance) {\n        instance.updateSettings(userSettings);\n      } else {\n        instance = new Handsontable.Core($this[0], userSettings);\n        $this.data('handsontable', instance);\n        instance.init();\n      }\n\n      return $this;\n    }\n\n    // Action case\n    var args = [];\n    var output = void 0;\n\n    if (arguments.length > 1) {\n      for (var i = 1, ilen = arguments.length; i < ilen; i++) {\n        args.push(arguments[i]);\n      }\n    }\n\n    if (instance) {\n      if (typeof instance[action] !== 'undefined') {\n        output = instance[action].apply(instance, args);\n\n        if (action === 'destroy') {\n          $this.removeData();\n        }\n      } else {\n        throw new Error('Handsontable do not provide action: ' + action);\n      }\n    }\n\n    return output;\n  };\n};\n\n/***/ }),\n/* 405 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.Base = exports.UndoRedo = exports.TouchScroll = exports.Search = exports.PersistentState = exports.ObserveChanges = exports.MultipleSelectionHandles = exports.MergeCells = exports.ManualRowResize = exports.ManualRowMove = exports.ManualColumnResize = exports.ManualColumnMove = exports.ManualColumnFreeze = exports.DragToScroll = exports.CustomBorders = exports.CopyPaste = exports.ContextMenu = exports.Comments = exports.ColumnSorting = exports.AutoRowSize = exports.AutoFill = exports.AutoColumnSize = undefined;\n\nvar _persistentState = __webpack_require__(406);\n\nvar _persistentState2 = _interopRequireDefault(_persistentState);\n\nvar _autoColumnSize = __webpack_require__(408);\n\nvar _autoColumnSize2 = _interopRequireDefault(_autoColumnSize);\n\nvar _autofill = __webpack_require__(409);\n\nvar _autofill2 = _interopRequireDefault(_autofill);\n\nvar _autoRowSize = __webpack_require__(411);\n\nvar _autoRowSize2 = _interopRequireDefault(_autoRowSize);\n\nvar _columnSorting = __webpack_require__(412);\n\nvar _columnSorting2 = _interopRequireDefault(_columnSorting);\n\nvar _comments = __webpack_require__(415);\n\nvar _comments2 = _interopRequireDefault(_comments);\n\nvar _contextMenu = __webpack_require__(419);\n\nvar _contextMenu2 = _interopRequireDefault(_contextMenu);\n\nvar _copyPaste = __webpack_require__(436);\n\nvar _copyPaste2 = _interopRequireDefault(_copyPaste);\n\nvar _customBorders = __webpack_require__(443);\n\nvar _customBorders2 = _interopRequireDefault(_customBorders);\n\nvar _dragToScroll = __webpack_require__(449);\n\nvar _dragToScroll2 = _interopRequireDefault(_dragToScroll);\n\nvar _manualColumnFreeze = __webpack_require__(450);\n\nvar _manualColumnFreeze2 = _interopRequireDefault(_manualColumnFreeze);\n\nvar _manualColumnMove = __webpack_require__(454);\n\nvar _manualColumnMove2 = _interopRequireDefault(_manualColumnMove);\n\nvar _manualColumnResize = __webpack_require__(459);\n\nvar _manualColumnResize2 = _interopRequireDefault(_manualColumnResize);\n\nvar _manualRowMove = __webpack_require__(460);\n\nvar _manualRowMove2 = _interopRequireDefault(_manualRowMove);\n\nvar _manualRowResize = __webpack_require__(465);\n\nvar _manualRowResize2 = _interopRequireDefault(_manualRowResize);\n\nvar _mergeCells = __webpack_require__(466);\n\nvar _mergeCells2 = _interopRequireDefault(_mergeCells);\n\nvar _multipleSelectionHandles = __webpack_require__(472);\n\nvar _multipleSelectionHandles2 = _interopRequireDefault(_multipleSelectionHandles);\n\nvar _observeChanges = __webpack_require__(473);\n\nvar _observeChanges2 = _interopRequireDefault(_observeChanges);\n\nvar _search = __webpack_require__(476);\n\nvar _search2 = _interopRequireDefault(_search);\n\nvar _touchScroll = __webpack_require__(477);\n\nvar _touchScroll2 = _interopRequireDefault(_touchScroll);\n\nvar _undoRedo = __webpack_require__(478);\n\nvar _undoRedo2 = _interopRequireDefault(_undoRedo);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.AutoColumnSize = _autoColumnSize2.default;\nexports.AutoFill = _autofill2.default;\nexports.AutoRowSize = _autoRowSize2.default;\nexports.ColumnSorting = _columnSorting2.default;\nexports.Comments = _comments2.default;\nexports.ContextMenu = _contextMenu2.default;\nexports.CopyPaste = _copyPaste2.default;\nexports.CustomBorders = _customBorders2.default;\nexports.DragToScroll = _dragToScroll2.default;\nexports.ManualColumnFreeze = _manualColumnFreeze2.default;\nexports.ManualColumnMove = _manualColumnMove2.default;\nexports.ManualColumnResize = _manualColumnResize2.default;\nexports.ManualRowMove = _manualRowMove2.default;\nexports.ManualRowResize = _manualRowResize2.default;\nexports.MergeCells = _mergeCells2.default;\nexports.MultipleSelectionHandles = _multipleSelectionHandles2.default;\nexports.ObserveChanges = _observeChanges2.default;\nexports.PersistentState = _persistentState2.default;\nexports.Search = _search2.default;\nexports.TouchScroll = _touchScroll2.default;\nexports.UndoRedo = _undoRedo2.default;\nexports.Base = _base2.default;\n\n/***/ }),\n/* 406 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _storage = __webpack_require__(407);\n\nvar _storage2 = _interopRequireDefault(_storage);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('persistentStateSave');\n_pluginHooks2.default.getSingleton().register('persistentStateLoad');\n_pluginHooks2.default.getSingleton().register('persistentStateReset');\n\n/**\n * Save the state of column sorting, column positions and column sizes in local storage\n * to preserve table state between page reloads.\n *\n * In order to enable data storage mechanism, persistentState option must be set to true.\n *\n * When persistentState is enabled it exposes 3 hooks:\n *\n * persistentStateSave (key: String, value: Mixed) -\n * Saves value under given key in browser local storage.\n *\n * persistentStateLoad (key: String, saveTo: Object) -\n * Loads value, saved under given key, form browser local storage.\n * The loaded value will be saved in saveTo.value.\n *\n * persistentStateReset (key: String) -\n * Clears the value saved under key.\n * If no key is given, all values associated with table will be cleared.\n *\n * @plugin persistentState\n */\n\nvar PersistentState = function (_BasePlugin) {\n  _inherits(PersistentState, _BasePlugin);\n\n  function PersistentState(hotInstance) {\n    _classCallCheck(this, PersistentState);\n\n    /**\n     * Instance of {@link Storage}.\n     *\n     * @type {Storage}\n     */\n    var _this = _possibleConstructorReturn(this, (PersistentState.__proto__ || Object.getPrototypeOf(PersistentState)).call(this, hotInstance));\n\n    _this.storage = void 0;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(PersistentState, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().persistentState;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      if (!this.storage) {\n        this.storage = new _storage2.default(this.hot.rootElement.id);\n      }\n\n      this.addHook('persistentStateSave', function (key, value) {\n        return _this2.saveValue(key, value);\n      });\n      this.addHook('persistentStateLoad', function (key, saveTo) {\n        return _this2.loadValue(key, saveTo);\n      });\n      this.addHook('persistentStateReset', function () {\n        return _this2.resetValue();\n      });\n\n      _get(PersistentState.prototype.__proto__ || Object.getPrototypeOf(PersistentState.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.storage = void 0;\n\n      _get(PersistentState.prototype.__proto__ || Object.getPrototypeOf(PersistentState.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(PersistentState.prototype.__proto__ || Object.getPrototypeOf(PersistentState.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Load value from localStorage.\n     *\n     * @param {String} key Key string.\n     * @param {Object} saveTo Saved value from browser local storage.\n     */\n\n  }, {\n    key: 'loadValue',\n    value: function loadValue(key, saveTo) {\n      saveTo.value = this.storage.loadValue(key);\n    }\n\n    /**\n     * Save data to localStorage.\n     *\n     * @param {String} key Key string.\n     * @param {Mixed} value Value to save.\n     */\n\n  }, {\n    key: 'saveValue',\n    value: function saveValue(key, value) {\n      this.storage.saveValue(key, value);\n    }\n\n    /**\n     * Reset given data or all data from localStorage.\n     *\n     * @param {String} key [optional] Key string.\n     */\n\n  }, {\n    key: 'resetValue',\n    value: function resetValue(key) {\n      if (typeof key === 'undefined') {\n        this.storage.resetAll();\n      } else {\n        this.storage.reset(key);\n      }\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(PersistentState.prototype.__proto__ || Object.getPrototypeOf(PersistentState.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return PersistentState;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('persistentState', PersistentState);\n\nexports.default = PersistentState;\n\n/***/ }),\n/* 407 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _array = __webpack_require__(1);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Storage\n * @plugin PersistentState\n */\nvar Storage = function () {\n  function Storage(prefix) {\n    _classCallCheck(this, Storage);\n\n    /**\n     * Prefix for key (id element).\n     *\n     * @type {String}\n     */\n    this.prefix = prefix;\n\n    /**\n     * Saved keys.\n     *\n     * @type {Array}\n     */\n    this.savedKeys = [];\n    this.loadSavedKeys();\n  }\n\n  /**\n   * Save data to localStorage.\n   *\n   * @param {String} key Key string.\n   * @param {Mixed} value Value to save.\n   */\n\n\n  _createClass(Storage, [{\n    key: 'saveValue',\n    value: function saveValue(key, value) {\n      window.localStorage.setItem(this.prefix + '_' + key, JSON.stringify(value));\n\n      if (this.savedKeys.indexOf(key) === -1) {\n        this.savedKeys.push(key);\n        this.saveSavedKeys();\n      }\n    }\n\n    /**\n     * Load data from localStorage.\n     *\n     * @param {String} key Key string.\n     * @param {Object} defaultValue Object containing the loaded data.\n     *\n     * @returns {}\n     */\n\n  }, {\n    key: 'loadValue',\n    value: function loadValue(key, defaultValue) {\n      key = typeof key === 'undefined' ? defaultValue : key;\n\n      var value = window.localStorage.getItem(this.prefix + '_' + key);\n\n      return value === null ? void 0 : JSON.parse(value);\n    }\n\n    /**\n     * Reset given data from localStorage.\n     *\n     * @param {String} key Key string.\n     */\n\n  }, {\n    key: 'reset',\n    value: function reset(key) {\n      window.localStorage.removeItem(this.prefix + '_' + key);\n    }\n\n    /**\n     * Reset all data from localStorage.\n     *\n     */\n\n  }, {\n    key: 'resetAll',\n    value: function resetAll() {\n      var _this = this;\n\n      (0, _array.arrayEach)(this.savedKeys, function (value, index) {\n        window.localStorage.removeItem(_this.prefix + '_' + _this.savedKeys[index]);\n      });\n\n      this.clearSavedKeys();\n    }\n\n    /**\n     * Load and save all keys from localStorage.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'loadSavedKeys',\n    value: function loadSavedKeys() {\n      var keysJSON = window.localStorage.getItem(this.prefix + '__persistentStateKeys');\n      var keys = typeof keysJSON === 'string' ? JSON.parse(keysJSON) : void 0;\n\n      this.savedKeys = keys ? keys : [];\n    }\n  }, {\n    key: 'saveSavedKeys',\n\n\n    /**\n     * Save saved key in localStorage.\n     *\n     * @private\n     */\n    value: function saveSavedKeys() {\n      window.localStorage.setItem(this.prefix + '__persistentStateKeys', JSON.stringify(this.savedKeys));\n    }\n  }, {\n    key: 'clearSavedKeys',\n\n\n    /**\n     * Clear saved key from localStorage.\n     *\n     * @private\n     */\n    value: function clearSavedKeys() {\n      this.savedKeys.length = 0;\n      this.saveSavedKeys();\n    }\n  }]);\n\n  return Storage;\n}();\n\nexports.default = Storage;\n\n/***/ }),\n/* 408 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _array = __webpack_require__(1);\n\nvar _feature = __webpack_require__(40);\n\nvar _element = __webpack_require__(0);\n\nvar _ghostTable = __webpack_require__(92);\n\nvar _ghostTable2 = _interopRequireDefault(_ghostTable);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nvar _samplesGenerator = __webpack_require__(320);\n\nvar _samplesGenerator2 = _interopRequireDefault(_samplesGenerator);\n\nvar _string = __webpack_require__(36);\n\nvar _src = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar privatePool = new WeakMap();\n\n/**\n * @plugin AutoColumnSize\n *\n * @description\n * This plugin allows to set column widths based on their widest cells.\n *\n * By default, the plugin is declared as `undefined`, which makes it enabled (same as if it was declared as `true`).\n * Enabling this plugin may decrease the overall table performance, as it needs to calculate the widths of all cells to\n * resize the columns accordingly.\n * If you experience problems with the performance, try turning this feature off and declaring the column widths manually.\n *\n * Column width calculations are divided into sync and async part. Each of this parts has their own advantages and\n * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous operations don't\n * block the browser UI.\n *\n * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value to a config object:\n * ```js\n * ...\n * // as a number (300 columns in sync, rest async)\n * autoColumnSize: {syncLimit: 300},\n * ...\n *\n * ...\n * // as a string (percent)\n * autoColumnSize: {syncLimit: '40%'},\n * ...\n * ```\n *\n * To configure this plugin see {@link Options#autoColumnSize}.\n *\n * @example\n * ```js\n * ...\n * var hot = new Handsontable(document.getElementById('example'), {\n *   date: getData(),\n *   autoColumnSize: true\n * });\n * // Access to plugin instance:\n * var plugin = hot.getPlugin('autoColumnSize');\n *\n * plugin.getColumnWidth(4);\n *\n * if (plugin.isEnabled()) {\n *   // code...\n * }\n * ...\n * ```\n */\n\nvar AutoColumnSize = function (_BasePlugin) {\n  _inherits(AutoColumnSize, _BasePlugin);\n\n  _createClass(AutoColumnSize, null, [{\n    key: 'CALCULATION_STEP',\n    get: function get() {\n      return 50;\n    }\n  }, {\n    key: 'SYNC_CALCULATION_LIMIT',\n    get: function get() {\n      return 50;\n    }\n  }]);\n\n  function AutoColumnSize(hotInstance) {\n    _classCallCheck(this, AutoColumnSize);\n\n    var _this = _possibleConstructorReturn(this, (AutoColumnSize.__proto__ || Object.getPrototypeOf(AutoColumnSize)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      /**\n       * Cached column header names. It is used to diff current column headers with previous state and detect which\n       * columns width should be updated.\n       *\n       * @private\n       * @type {Array}\n       */\n      cachedColumnHeaders: []\n    });\n    /**\n     * Cached columns widths.\n     *\n     * @type {Array}\n     */\n    _this.widths = [];\n    /**\n     * Instance of {@link GhostTable} for rows and columns size calculations.\n     *\n     * @type {GhostTable}\n     */\n    _this.ghostTable = new _ghostTable2.default(_this.hot);\n    /**\n     * Instance of {@link SamplesGenerator} for generating samples necessary for columns width calculations.\n     *\n     * @type {SamplesGenerator}\n     */\n    _this.samplesGenerator = new _samplesGenerator2.default(function (row, col) {\n      return _this.hot.getCellMeta(row, col).spanned ? '' : _this.hot.getDataAtCell(row, col);\n    });\n    /**\n     * `true` only if the first calculation was performed\n     *\n     * @type {Boolean}\n     */\n    _this.firstCalculation = true;\n    /**\n     * `true` if the size calculation is in progress.\n     *\n     * @type {Boolean}\n     */\n    _this.inProgress = false;\n\n    // moved to constructor to allow auto-sizing the columns when the plugin is disabled\n    _this.addHook('beforeColumnResize', function (col, size, isDblClick) {\n      return _this.onBeforeColumnResize(col, size, isDblClick);\n    });\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(AutoColumnSize, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().autoColumnSize !== false && !this.hot.getSettings().colWidths;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      var setting = this.hot.getSettings().autoColumnSize;\n\n      if (setting && setting.useHeaders != null) {\n        this.ghostTable.setSetting('useHeaders', setting.useHeaders);\n      }\n\n      this.addHook('afterLoadData', function () {\n        return _this2.onAfterLoadData();\n      });\n      this.addHook('beforeChange', function (changes) {\n        return _this2.onBeforeChange(changes);\n      });\n\n      this.addHook('beforeRender', function (force) {\n        return _this2.onBeforeRender(force);\n      });\n      this.addHook('modifyColWidth', function (width, col) {\n        return _this2.getColumnWidth(col, width);\n      });\n      this.addHook('afterInit', function () {\n        return _this2.onAfterInit();\n      });\n      _get(AutoColumnSize.prototype.__proto__ || Object.getPrototypeOf(AutoColumnSize.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Update plugin state.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      var changedColumns = this.findColumnsWhereHeaderWasChanged();\n\n      if (changedColumns.length) {\n        this.clearCache(changedColumns);\n      }\n      _get(AutoColumnSize.prototype.__proto__ || Object.getPrototypeOf(AutoColumnSize.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(AutoColumnSize.prototype.__proto__ || Object.getPrototypeOf(AutoColumnSize.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Calculate a columns width.\n     *\n     * @param {Number|Object} colRange Column range object.\n     * @param {Number|Object} rowRange Row range object.\n     * @param {Boolean} [force=false] If `true` force calculate width even when value was cached earlier.\n     */\n\n  }, {\n    key: 'calculateColumnsWidth',\n    value: function calculateColumnsWidth() {\n      var colRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countCols() - 1 };\n\n      var _this3 = this;\n\n      var rowRange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { from: 0, to: this.hot.countRows() - 1 };\n      var force = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      if (typeof colRange === 'number') {\n        colRange = { from: colRange, to: colRange };\n      }\n      if (typeof rowRange === 'number') {\n        rowRange = { from: rowRange, to: rowRange };\n      }\n\n      (0, _number.rangeEach)(colRange.from, colRange.to, function (col) {\n        if (force || _this3.widths[col] === void 0 && !_this3.hot._getColWidthFromSettings(col)) {\n          var samples = _this3.samplesGenerator.generateColumnSamples(col, rowRange);\n\n          samples.forEach(function (sample, col) {\n            return _this3.ghostTable.addColumn(col, sample);\n          });\n        }\n      });\n\n      if (this.ghostTable.columns.length) {\n        this.ghostTable.getWidths(function (col, width) {\n          _this3.widths[col] = width;\n        });\n        this.ghostTable.clean();\n      }\n    }\n\n    /**\n     * Calculate all columns width.\n     *\n     * @param {Object|Number} rowRange Row range object.\n     */\n\n  }, {\n    key: 'calculateAllColumnsWidth',\n    value: function calculateAllColumnsWidth() {\n      var _this4 = this;\n\n      var rowRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countRows() - 1 };\n\n      var current = 0;\n      var length = this.hot.countCols() - 1;\n      var timer = null;\n\n      this.inProgress = true;\n\n      var loop = function loop() {\n        // When hot was destroyed after calculating finished cancel frame\n        if (!_this4.hot) {\n          (0, _feature.cancelAnimationFrame)(timer);\n          _this4.inProgress = false;\n\n          return;\n        }\n\n        _this4.calculateColumnsWidth({\n          from: current,\n          to: Math.min(current + AutoColumnSize.CALCULATION_STEP, length)\n        }, rowRange);\n\n        current = current + AutoColumnSize.CALCULATION_STEP + 1;\n\n        if (current < length) {\n          timer = (0, _feature.requestAnimationFrame)(loop);\n        } else {\n          (0, _feature.cancelAnimationFrame)(timer);\n          _this4.inProgress = false;\n\n          // @TODO Should call once per render cycle, currently fired separately in different plugins\n          _this4.hot.view.wt.wtOverlays.adjustElementsSize(true);\n          // tmp\n          if (_this4.hot.view.wt.wtOverlays.leftOverlay.needFullRender) {\n            _this4.hot.view.wt.wtOverlays.leftOverlay.clone.draw();\n          }\n        }\n      };\n      // sync\n      if (this.firstCalculation && this.getSyncCalculationLimit()) {\n        this.calculateColumnsWidth({ from: 0, to: this.getSyncCalculationLimit() }, rowRange);\n        this.firstCalculation = false;\n        current = this.getSyncCalculationLimit() + 1;\n      }\n      // async\n      if (current < length) {\n        loop();\n      } else {\n        this.inProgress = false;\n      }\n    }\n\n    /**\n     * Set the sampling options.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'setSamplingOptions',\n    value: function setSamplingOptions() {\n      var setting = this.hot.getSettings().autoColumnSize;\n      var samplingRatio = setting && (0, _object.hasOwnProperty)(setting, 'samplingRatio') ? this.hot.getSettings().autoColumnSize.samplingRatio : void 0;\n      var allowSampleDuplicates = setting && (0, _object.hasOwnProperty)(setting, 'allowSampleDuplicates') ? this.hot.getSettings().autoColumnSize.allowSampleDuplicates : void 0;\n\n      if (samplingRatio && !isNaN(samplingRatio)) {\n        this.samplesGenerator.setSampleCount(parseInt(samplingRatio, 10));\n      }\n\n      if (allowSampleDuplicates) {\n        this.samplesGenerator.setAllowDuplicates(allowSampleDuplicates);\n      }\n    }\n\n    /**\n     * Recalculate all columns width (overwrite cache values).\n     */\n\n  }, {\n    key: 'recalculateAllColumnsWidth',\n    value: function recalculateAllColumnsWidth() {\n      if (this.hot.view && (0, _element.isVisible)(this.hot.view.wt.wtTable.TABLE)) {\n        this.clearCache();\n        this.calculateAllColumnsWidth();\n      }\n    }\n\n    /**\n     * Get value which tells how many columns should be calculated synchronously. Rest of the columns will be calculated asynchronously.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getSyncCalculationLimit',\n    value: function getSyncCalculationLimit() {\n      /* eslint-disable no-bitwise */\n      var limit = AutoColumnSize.SYNC_CALCULATION_LIMIT;\n      var colsLimit = this.hot.countCols() - 1;\n\n      if ((0, _object.isObject)(this.hot.getSettings().autoColumnSize)) {\n        limit = this.hot.getSettings().autoColumnSize.syncLimit;\n\n        if ((0, _string.isPercentValue)(limit)) {\n          limit = (0, _number.valueAccordingPercent)(colsLimit, limit);\n        } else {\n          // Force to Number\n          limit >>= 0;\n        }\n      }\n\n      return Math.min(limit, colsLimit);\n    }\n\n    /**\n     * Get the calculated column width.\n     *\n     * @param {Number} col Column index.\n     * @param {Number} [defaultWidth] Default column width. It will be picked up if no calculated width found.\n     * @param {Boolean} [keepMinimum=true] If `true` then returned value won't be smaller then 50 (default column width).\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getColumnWidth',\n    value: function getColumnWidth(col) {\n      var defaultWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : void 0;\n      var keepMinimum = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n      var width = defaultWidth;\n\n      if (width === void 0) {\n        width = this.widths[col];\n\n        if (keepMinimum && typeof width === 'number') {\n          width = Math.max(width, _src.ViewportColumnsCalculator.DEFAULT_WIDTH);\n        }\n      }\n\n      return width;\n    }\n\n    /**\n     * Get the first visible column.\n     *\n     * @returns {Number} Returns column index or -1 if table is not rendered.\n     */\n\n  }, {\n    key: 'getFirstVisibleColumn',\n    value: function getFirstVisibleColumn() {\n      var wot = this.hot.view.wt;\n\n      if (wot.wtViewport.columnsVisibleCalculator) {\n        return wot.wtTable.getFirstVisibleColumn();\n      }\n      if (wot.wtViewport.columnsRenderCalculator) {\n        return wot.wtTable.getFirstRenderedColumn();\n      }\n\n      return -1;\n    }\n\n    /**\n     * Get the last visible column.\n     *\n     * @returns {Number} Returns column index or -1 if table is not rendered.\n     */\n\n  }, {\n    key: 'getLastVisibleColumn',\n    value: function getLastVisibleColumn() {\n      var wot = this.hot.view.wt;\n\n      if (wot.wtViewport.columnsVisibleCalculator) {\n        return wot.wtTable.getLastVisibleColumn();\n      }\n      if (wot.wtViewport.columnsRenderCalculator) {\n        return wot.wtTable.getLastRenderedColumn();\n      }\n\n      return -1;\n    }\n\n    /**\n     * Collects all columns which titles has been changed in comparison to the previous state.\n     *\n     * @returns {Array} It returns an array of physical column indexes.\n     */\n\n  }, {\n    key: 'findColumnsWhereHeaderWasChanged',\n    value: function findColumnsWhereHeaderWasChanged() {\n      var columnHeaders = this.hot.getColHeader();\n\n      var _privatePool$get = privatePool.get(this),\n          cachedColumnHeaders = _privatePool$get.cachedColumnHeaders;\n\n      var changedColumns = (0, _array.arrayReduce)(columnHeaders, function (acc, columnTitle, physicalColumn) {\n        var cachedColumnsLength = cachedColumnHeaders.length;\n\n        if (cachedColumnsLength - 1 < physicalColumn || cachedColumnHeaders[physicalColumn] !== columnTitle) {\n          acc.push(physicalColumn);\n        }\n        if (cachedColumnsLength - 1 < physicalColumn) {\n          cachedColumnHeaders.push(columnTitle);\n        } else {\n          cachedColumnHeaders[physicalColumn] = columnTitle;\n        }\n\n        return acc;\n      }, []);\n\n      return changedColumns;\n    }\n\n    /**\n     * Clear cache of calculated column widths. If you want to clear only selected columns pass an array with their indexes.\n     * Otherwise whole cache will be cleared.\n     *\n     * @param {Array} [columns=[]] List of column indexes (physical indexes) to clear.\n     */\n\n  }, {\n    key: 'clearCache',\n    value: function clearCache() {\n      var _this5 = this;\n\n      var columns = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n      if (columns.length) {\n        (0, _array.arrayEach)(columns, function (physicalIndex) {\n          _this5.widths[physicalIndex] = void 0;\n        });\n      } else {\n        this.widths.length = 0;\n      }\n    }\n\n    /**\n     * Check if all widths were calculated. If not then return `true` (need recalculate).\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNeedRecalculate',\n    value: function isNeedRecalculate() {\n      return !!(0, _array.arrayFilter)(this.widths, function (item) {\n        return item === void 0;\n      }).length;\n    }\n\n    /**\n     * On before render listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onBeforeRender',\n    value: function onBeforeRender() {\n      var force = this.hot.renderCall;\n      var rowsCount = this.hot.countRows();\n\n      // Keep last column widths unchanged for situation when all rows was deleted or trimmed (pro #6)\n      if (!rowsCount) {\n        return;\n      }\n\n      this.calculateColumnsWidth({ from: this.getFirstVisibleColumn(), to: this.getLastVisibleColumn() }, void 0, force);\n\n      if (this.isNeedRecalculate() && !this.inProgress) {\n        this.calculateAllColumnsWidth();\n      }\n    }\n\n    /**\n     * On after load data listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData() {\n      var _this6 = this;\n\n      if (this.hot.view) {\n        this.recalculateAllColumnsWidth();\n      } else {\n        // first load - initialization\n        setTimeout(function () {\n          if (_this6.hot) {\n            _this6.recalculateAllColumnsWidth();\n          }\n        }, 0);\n      }\n    }\n\n    /**\n     * On before change listener.\n     *\n     * @private\n     * @param {Array} changes\n     */\n\n  }, {\n    key: 'onBeforeChange',\n    value: function onBeforeChange(changes) {\n      var _this7 = this;\n\n      var changedColumns = (0, _array.arrayMap)(changes, function (_ref) {\n        var _ref2 = _slicedToArray(_ref, 2),\n            row = _ref2[0],\n            column = _ref2[1];\n\n        return _this7.hot.propToCol(column);\n      });\n\n      this.clearCache(changedColumns);\n    }\n\n    /**\n     * On before column resize listener.\n     *\n     * @private\n     * @param {Number} col\n     * @param {Number} size\n     * @param {Boolean} isDblClick\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onBeforeColumnResize',\n    value: function onBeforeColumnResize(col, size, isDblClick) {\n      if (isDblClick) {\n        this.calculateColumnsWidth(col, void 0, true);\n        size = this.getColumnWidth(col, void 0, false);\n      }\n\n      return size;\n    }\n\n    /**\n     * On after Handsontable init fill plugin with all necessary values.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      privatePool.get(this).cachedColumnHeaders = this.hot.getColHeader();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.ghostTable.clean();\n      _get(AutoColumnSize.prototype.__proto__ || Object.getPrototypeOf(AutoColumnSize.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return AutoColumnSize;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('autoColumnSize', AutoColumnSize);\n\nexports.default = AutoColumnSize;\n\n/***/ }),\n/* 409 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _element = __webpack_require__(0);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nvar _src = __webpack_require__(4);\n\nvar _utils = __webpack_require__(410);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('modifyAutofillRange');\n_pluginHooks2.default.getSingleton().register('beforeAutofill');\n\nvar INSERT_ROW_ALTER_ACTION_NAME = 'insert_row';\nvar INTERVAL_FOR_ADDING_ROW = 200;\n\n/**\n * This plugin provides \"drag-down\" and \"copy-down\" functionalities, both operated\n * using the small square in the right bottom of the cell selection.\n *\n * \"Drag-down\" expands the value of the selected cells to the neighbouring\n * cells when you drag the small square in the corner.\n *\n * \"Copy-down\" copies the value of the selection to all empty cells\n * below when you double click the small square.\n *\n * @class Autofill\n * @plugin Autofill\n */\n\nvar Autofill = function (_BasePlugin) {\n  _inherits(Autofill, _BasePlugin);\n\n  function Autofill(hotInstance) {\n    _classCallCheck(this, Autofill);\n\n    /**\n     * Event manager\n     *\n     * @type {EventManager}\n     */\n    var _this = _possibleConstructorReturn(this, (Autofill.__proto__ || Object.getPrototypeOf(Autofill)).call(this, hotInstance));\n\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Specifies if adding new row started.\n     *\n     * @type {Boolean}\n     */\n    _this.addingStarted = false;\n    /**\n     * Specifies if there was mouse down on the cell corner.\n     *\n     * @type {Boolean}\n     */\n    _this.mouseDownOnCellCorner = false;\n    /**\n     * Specifies if mouse was dragged outside Handsontable.\n     *\n     * @type {Boolean}\n     */\n    _this.mouseDragOutside = false;\n    /**\n     * Specifies how many cell levels were dragged using the handle.\n     *\n     * @type {Boolean}\n     */\n    _this.handleDraggedCells = 0;\n    /**\n     * Specifies allowed directions of drag.\n     *\n     * @type {Array}\n     */\n    _this.directions = [];\n    /**\n     * Specifies if can insert new rows if needed.\n     *\n     * @type {Boolean}\n     */\n    _this.autoInsertRow = false;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(Autofill, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().fillHandle;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.mapSettings();\n      this.registerEvents();\n\n      this.addHook('afterOnCellCornerMouseDown', function (event) {\n        return _this2.onAfterCellCornerMouseDown(event);\n      });\n      this.addHook('afterOnCellCornerDblClick', function (event) {\n        return _this2.onCellCornerDblClick(event);\n      });\n      this.addHook('beforeOnCellMouseOver', function (event, coords, TD) {\n        return _this2.onBeforeCellMouseOver(coords);\n      });\n\n      _get(Autofill.prototype.__proto__ || Object.getPrototypeOf(Autofill.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Update plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n      _get(Autofill.prototype.__proto__ || Object.getPrototypeOf(Autofill.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.clearMappedSettings();\n      _get(Autofill.prototype.__proto__ || Object.getPrototypeOf(Autofill.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Get selection data\n     *\n     * @private\n     * @returns {Array} Array with the data.\n     */\n\n  }, {\n    key: 'getSelectionData',\n    value: function getSelectionData() {\n      var selRange = {\n        from: this.hot.getSelectedRangeLast().from,\n        to: this.hot.getSelectedRangeLast().to\n      };\n\n      return this.hot.getData(selRange.from.row, selRange.from.col, selRange.to.row, selRange.to.col);\n    }\n\n    /**\n     * Try to apply fill values to the area in fill border, omitting the selection border.\n     *\n     * @private\n     * @returns {Boolean} reports if fill was applied.\n     */\n\n  }, {\n    key: 'fillIn',\n    value: function fillIn() {\n      if (this.hot.selection.highlight.getFill().isEmpty()) {\n        return false;\n      }\n\n      var cornersOfSelectionAndDragAreas = this.hot.selection.highlight.getFill().getCorners();\n\n      this.resetSelectionOfDraggedArea();\n\n      var cornersOfSelectedCells = this.getCornersOfSelectedCells();\n      cornersOfSelectionAndDragAreas = this.hot.runHooks('modifyAutofillRange', cornersOfSelectionAndDragAreas, cornersOfSelectedCells);\n\n      var _getDragDirectionAndR = (0, _utils.getDragDirectionAndRange)(cornersOfSelectedCells, cornersOfSelectionAndDragAreas),\n          directionOfDrag = _getDragDirectionAndR.directionOfDrag,\n          startOfDragCoords = _getDragDirectionAndR.startOfDragCoords,\n          endOfDragCoords = _getDragDirectionAndR.endOfDragCoords;\n\n      if (startOfDragCoords && startOfDragCoords.row > -1 && startOfDragCoords.col > -1) {\n        var selectionData = this.getSelectionData();\n\n        this.hot.runHooks('beforeAutofill', startOfDragCoords, endOfDragCoords, selectionData);\n\n        var deltas = (0, _utils.getDeltas)(startOfDragCoords, endOfDragCoords, selectionData, directionOfDrag);\n        var fillData = selectionData;\n\n        if (['up', 'left'].indexOf(directionOfDrag) > -1) {\n          fillData = [];\n\n          var dragLength = null;\n          var fillOffset = null;\n\n          if (directionOfDrag === 'up') {\n            dragLength = endOfDragCoords.row - startOfDragCoords.row + 1;\n            fillOffset = dragLength % selectionData.length;\n\n            for (var i = 0; i < dragLength; i++) {\n              fillData.push(selectionData[(i + (selectionData.length - fillOffset)) % selectionData.length]);\n            }\n          } else {\n            dragLength = endOfDragCoords.col - startOfDragCoords.col + 1;\n            fillOffset = dragLength % selectionData[0].length;\n\n            for (var _i = 0; _i < selectionData.length; _i++) {\n              fillData.push([]);\n              for (var j = 0; j < dragLength; j++) {\n                fillData[_i].push(selectionData[_i][(j + (selectionData[_i].length - fillOffset)) % selectionData[_i].length]);\n              }\n            }\n          }\n        }\n\n        this.hot.populateFromArray(startOfDragCoords.row, startOfDragCoords.col, fillData, endOfDragCoords.row, endOfDragCoords.col, this.pluginName + '.fill', null, directionOfDrag, deltas);\n\n        this.setSelection(cornersOfSelectionAndDragAreas);\n      } else {\n        // reset to avoid some range bug\n        this.hot._refreshBorders();\n      }\n\n      return true;\n    }\n\n    /**\n     * Reduce the selection area if the handle was dragged outside of the table or on headers.\n     *\n     * @private\n     * @param {CellCoords} coords indexes of selection corners.\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'reduceSelectionAreaIfNeeded',\n    value: function reduceSelectionAreaIfNeeded(coords) {\n      if (coords.row < 0) {\n        coords.row = 0;\n      }\n\n      if (coords.col < 0) {\n        coords.col = 0;\n      }\n      return coords;\n    }\n\n    /**\n     * Get the coordinates of the drag & drop borders.\n     *\n     * @private\n     * @param {CellCoords} coordsOfSelection `CellCoords` coord object.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getCoordsOfDragAndDropBorders',\n    value: function getCoordsOfDragAndDropBorders(coordsOfSelection) {\n      var topLeftCorner = this.hot.getSelectedRangeLast().getTopLeftCorner();\n      var bottomRightCorner = this.hot.getSelectedRangeLast().getBottomRightCorner();\n      var coords = void 0;\n\n      if (this.directions.includes(_utils.DIRECTIONS.vertical) && (bottomRightCorner.row < coordsOfSelection.row || topLeftCorner.row > coordsOfSelection.row)) {\n        coords = new _src.CellCoords(coordsOfSelection.row, bottomRightCorner.col);\n      } else if (this.directions.includes(_utils.DIRECTIONS.horizontal)) {\n        coords = new _src.CellCoords(bottomRightCorner.row, coordsOfSelection.col);\n      } else {\n        // wrong direction\n        return;\n      }\n\n      return this.reduceSelectionAreaIfNeeded(coords);\n    }\n\n    /**\n     * Show the fill border.\n     *\n     * @private\n     * @param {CellCoords} coordsOfSelection `CellCoords` coord object.\n     */\n\n  }, {\n    key: 'showBorder',\n    value: function showBorder(coordsOfSelection) {\n      var coordsOfDragAndDropBorders = this.getCoordsOfDragAndDropBorders(coordsOfSelection);\n\n      if (coordsOfDragAndDropBorders) {\n        this.redrawBorders(coordsOfDragAndDropBorders);\n      }\n    }\n\n    /**\n     * Add new row\n     *\n     * @private\n     */\n\n  }, {\n    key: 'addRow',\n    value: function addRow() {\n      var _this3 = this;\n\n      this.hot._registerTimeout(setTimeout(function () {\n        _this3.hot.alter(INSERT_ROW_ALTER_ACTION_NAME, void 0, 1, _this3.pluginName + '.fill');\n\n        _this3.addingStarted = false;\n      }, INTERVAL_FOR_ADDING_ROW));\n    }\n\n    /**\n     * Add new rows if they are needed to continue auto-filling values.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'addNewRowIfNeeded',\n    value: function addNewRowIfNeeded() {\n      if (this.hot.selection.highlight.getFill().cellRange && this.addingStarted === false && this.autoInsertRow) {\n        var cornersOfSelectedCells = this.hot.getSelectedLast();\n        var cornersOfSelectedDragArea = this.hot.selection.highlight.getFill().getCorners();\n        var nrOfTableRows = this.hot.countRows();\n\n        if (cornersOfSelectedCells[2] < nrOfTableRows - 1 && cornersOfSelectedDragArea[2] === nrOfTableRows - 1) {\n          this.addingStarted = true;\n\n          this.addRow();\n        }\n      }\n    }\n\n    /**\n     * Get corners of selected cells.\n     *\n     * @private\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getCornersOfSelectedCells',\n    value: function getCornersOfSelectedCells() {\n      if (this.hot.selection.isMultiple()) {\n        return this.hot.selection.highlight.createOrGetArea().getCorners();\n      }\n      return this.hot.selection.highlight.getCell().getCorners();\n    }\n\n    /**\n     * Get index of last adjacent filled in row\n     *\n     * @private\n     * @param {Array} cornersOfSelectedCells indexes of selection corners.\n     * @returns {Number} gives number greater than or equal to zero when selection adjacent can be applied.\n     * or -1 when selection adjacent can't be applied\n     */\n\n  }, {\n    key: 'getIndexOfLastAdjacentFilledInRow',\n    value: function getIndexOfLastAdjacentFilledInRow(cornersOfSelectedCells) {\n      var data = this.hot.getData();\n      var nrOfTableRows = this.hot.countRows();\n      var lastFilledInRowIndex = void 0;\n\n      for (var rowIndex = cornersOfSelectedCells[2] + 1; rowIndex < nrOfTableRows; rowIndex++) {\n        for (var columnIndex = cornersOfSelectedCells[1]; columnIndex <= cornersOfSelectedCells[3]; columnIndex++) {\n          var dataInCell = data[rowIndex][columnIndex];\n\n          if (dataInCell) {\n            return -1;\n          }\n        }\n\n        var dataInNextLeftCell = data[rowIndex][cornersOfSelectedCells[1] - 1];\n        var dataInNextRightCell = data[rowIndex][cornersOfSelectedCells[3] + 1];\n\n        if (!!dataInNextLeftCell || !!dataInNextRightCell) {\n          lastFilledInRowIndex = rowIndex;\n        }\n      }\n      return lastFilledInRowIndex;\n    }\n\n    /**\n     * Add a selection from the start area to the specific row index.\n     *\n     * @private\n     * @param {Array} selectStartArea selection area from which we start to create more comprehensive selection.\n     * @param {Number} rowIndex\n     */\n\n  }, {\n    key: 'addSelectionFromStartAreaToSpecificRowIndex',\n    value: function addSelectionFromStartAreaToSpecificRowIndex(selectStartArea, rowIndex) {\n      this.hot.selection.highlight.getFill().clear().add(new _src.CellCoords(selectStartArea[0], selectStartArea[1])).add(new _src.CellCoords(rowIndex, selectStartArea[3]));\n    }\n\n    /**\n     * Set selection based on passed corners.\n     *\n     * @private\n     * @param {Array} cornersOfArea\n     */\n\n  }, {\n    key: 'setSelection',\n    value: function setSelection(cornersOfArea) {\n      var _hot;\n\n      (_hot = this.hot).selectCell.apply(_hot, _toConsumableArray(cornersOfArea).concat([false, false]));\n    }\n\n    /**\n     * Try to select cells down to the last row in the left column and then returns if selection was applied.\n     *\n     * @private\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'selectAdjacent',\n    value: function selectAdjacent() {\n      var cornersOfSelectedCells = this.getCornersOfSelectedCells();\n      var lastFilledInRowIndex = this.getIndexOfLastAdjacentFilledInRow(cornersOfSelectedCells);\n\n      if (lastFilledInRowIndex === -1) {\n        return false;\n      }\n      this.addSelectionFromStartAreaToSpecificRowIndex(cornersOfSelectedCells, lastFilledInRowIndex);\n\n      return true;\n    }\n\n    /**\n     * Reset selection of dragged area.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'resetSelectionOfDraggedArea',\n    value: function resetSelectionOfDraggedArea() {\n      this.handleDraggedCells = 0;\n\n      this.hot.selection.highlight.getFill().clear();\n    }\n\n    /**\n     * Redraw borders.\n     *\n     * @private\n     * @param {CellCoords} coords `CellCoords` coord object.\n     */\n\n  }, {\n    key: 'redrawBorders',\n    value: function redrawBorders(coords) {\n      this.hot.selection.highlight.getFill().clear().add(this.hot.getSelectedRangeLast().from).add(this.hot.getSelectedRangeLast().to).add(coords);\n\n      this.hot.view.render();\n    }\n\n    /**\n     * Get if mouse was dragged outside.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'getIfMouseWasDraggedOutside',\n    value: function getIfMouseWasDraggedOutside(event) {\n      var tableBottom = (0, _element.offset)(this.hot.table).top - (window.pageYOffset || document.documentElement.scrollTop) + (0, _element.outerHeight)(this.hot.table);\n      var tableRight = (0, _element.offset)(this.hot.table).left - (window.pageXOffset || document.documentElement.scrollLeft) + (0, _element.outerWidth)(this.hot.table);\n\n      return event.clientY > tableBottom && event.clientX <= tableRight;\n    }\n\n    /**\n     * Bind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this4 = this;\n\n      this.eventManager.addEventListener(document.documentElement, 'mouseup', function () {\n        return _this4.onMouseUp();\n      });\n      this.eventManager.addEventListener(document.documentElement, 'mousemove', function (event) {\n        return _this4.onMouseMove(event);\n      });\n    }\n\n    /**\n     * On cell corner double click callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onCellCornerDblClick',\n    value: function onCellCornerDblClick() {\n      var selectionApplied = this.selectAdjacent();\n\n      if (selectionApplied) {\n        this.fillIn();\n      }\n    }\n\n    /**\n     * On after cell corner mouse down listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterCellCornerMouseDown',\n    value: function onAfterCellCornerMouseDown() {\n      this.handleDraggedCells = 1;\n      this.mouseDownOnCellCorner = true;\n    }\n\n    /**\n     * On before cell mouse over listener.\n     *\n     * @private\n     * @param {CellCoords} coords `CellCoords` coord object.\n     */\n\n  }, {\n    key: 'onBeforeCellMouseOver',\n    value: function onBeforeCellMouseOver(coords) {\n      if (this.mouseDownOnCellCorner && !this.hot.view.isMouseDown() && this.handleDraggedCells) {\n        this.handleDraggedCells++;\n\n        this.showBorder(coords);\n        this.addNewRowIfNeeded();\n      }\n    }\n\n    /**\n     * On mouse up listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      if (this.handleDraggedCells) {\n        if (this.handleDraggedCells > 1) {\n          this.fillIn();\n        }\n\n        this.handleDraggedCells = 0;\n        this.mouseDownOnCellCorner = false;\n      }\n    }\n\n    /**\n     * On mouse move listener.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var mouseWasDraggedOutside = this.getIfMouseWasDraggedOutside(event);\n\n      if (this.addingStarted === false && this.handleDraggedCells > 0 && mouseWasDraggedOutside) {\n        this.mouseDragOutside = true;\n        this.addingStarted = true;\n      } else {\n        this.mouseDragOutside = false;\n      }\n\n      if (this.mouseDragOutside && this.autoInsertRow) {\n        this.addRow();\n      }\n    }\n\n    /**\n     * Clear mapped settings.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'clearMappedSettings',\n    value: function clearMappedSettings() {\n      this.directions.length = 0;\n      this.autoInsertRow = false;\n    }\n\n    /**\n     * Map settings.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'mapSettings',\n    value: function mapSettings() {\n      var mappedSettings = (0, _utils.getMappedFillHandleSetting)(this.hot.getSettings().fillHandle);\n      this.directions = mappedSettings.directions;\n      this.autoInsertRow = mappedSettings.autoInsertRow;\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(Autofill.prototype.__proto__ || Object.getPrototypeOf(Autofill.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return Autofill;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('autofill', Autofill);\n\nexports.default = Autofill;\n\n/***/ }),\n/* 410 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.DIRECTIONS = undefined;\nexports.getDeltas = getDeltas;\nexports.getDragDirectionAndRange = getDragDirectionAndRange;\nexports.getMappedFillHandleSetting = getMappedFillHandleSetting;\n\nvar _object = __webpack_require__(2);\n\nvar _mixed = __webpack_require__(16);\n\nvar _src = __webpack_require__(4);\n\nvar DIRECTIONS = exports.DIRECTIONS = {\n  horizontal: 'horizontal',\n  vertical: 'vertical'\n};\n\n/**\n * Get deltas array.\n *\n * @param {CellCoords} start\n * @param {CellCoords} end\n * @param {Array} data\n * @param {String} direction\n * @returns {Array}\n */\nfunction getDeltas(start, end, data, direction) {\n  var rowsLength = data.length;\n  var columnsLength = data ? data[0].length : 0;\n  var deltas = [];\n  var diffRow = end.row - start.row;\n  var diffCol = end.col - start.col;\n\n  if (['down', 'up'].indexOf(direction) !== -1) {\n    var arr = [];\n\n    for (var col = 0; col <= diffCol; col++) {\n      var startValue = parseInt(data[0][col], 10);\n      var endValue = parseInt(data[rowsLength - 1][col], 10);\n      var delta = (direction === 'down' ? endValue - startValue : startValue - endValue) / (rowsLength - 1) || 0;\n\n      arr.push(delta);\n    }\n\n    deltas.push(arr);\n  }\n\n  if (['right', 'left'].indexOf(direction) !== -1) {\n    for (var row = 0; row <= diffRow; row++) {\n      var _startValue = parseInt(data[row][0], 10);\n      var _endValue = parseInt(data[row][columnsLength - 1], 10);\n      var _delta = (direction === 'right' ? _endValue - _startValue : _startValue - _endValue) / (columnsLength - 1) || 0;\n\n      deltas.push([_delta]);\n    }\n  }\n\n  return deltas;\n}\n\n/**\n * Get direction between positions and cords of selections difference (drag area)\n *\n * @param {Array} startSelection\n * @param {Array} endSelection\n * @returns {{direction: String, start: CellCoords, end: CellCoords}}\n */\nfunction getDragDirectionAndRange(startSelection, endSelection) {\n  var startOfDragCoords = void 0,\n      endOfDragCoords = void 0,\n      directionOfDrag = void 0;\n\n  if (endSelection[0] === startSelection[0] && endSelection[1] < startSelection[1]) {\n    directionOfDrag = 'left';\n\n    startOfDragCoords = new _src.CellCoords(endSelection[0], endSelection[1]);\n    endOfDragCoords = new _src.CellCoords(endSelection[2], startSelection[1] - 1);\n  } else if (endSelection[2] === startSelection[2] && endSelection[0] === startSelection[0] && endSelection[3] > startSelection[3]) {\n    directionOfDrag = 'right';\n\n    startOfDragCoords = new _src.CellCoords(endSelection[0], startSelection[3] + 1);\n    endOfDragCoords = new _src.CellCoords(endSelection[2], endSelection[3]);\n  } else if (endSelection[0] < startSelection[0] && endSelection[1] === startSelection[1]) {\n    directionOfDrag = 'up';\n\n    startOfDragCoords = new _src.CellCoords(endSelection[0], endSelection[1]);\n    endOfDragCoords = new _src.CellCoords(startSelection[0] - 1, endSelection[3]);\n  } else if (endSelection[2] > startSelection[2] && endSelection[1] === startSelection[1]) {\n    directionOfDrag = 'down';\n\n    startOfDragCoords = new _src.CellCoords(startSelection[2] + 1, endSelection[1]);\n    endOfDragCoords = new _src.CellCoords(endSelection[2], endSelection[3]);\n  }\n\n  return {\n    directionOfDrag: directionOfDrag,\n    startOfDragCoords: startOfDragCoords,\n    endOfDragCoords: endOfDragCoords\n  };\n}\n\n/**\n * Get mapped FillHandle setting containing information about\n * allowed FillHandle directions and if allowed is automatic insertion of rows on drag\n *\n * @param {Boolean|Object} fillHandle property of Handsontable settings\n * @returns {{directions: Array, autoInsertRow: Boolean}} object allowing access to information\n * about FillHandle in more useful way\n */\nfunction getMappedFillHandleSetting(fillHandle) {\n  var mappedSettings = {};\n\n  if (fillHandle === true) {\n    mappedSettings.directions = Object.keys(DIRECTIONS);\n    mappedSettings.autoInsertRow = true;\n  } else if ((0, _object.isObject)(fillHandle)) {\n    if ((0, _mixed.isDefined)(fillHandle.autoInsertRow)) {\n\n      // autoInsertRow for horizontal direction will be always false\n\n      if (fillHandle.direction === DIRECTIONS.horizontal) {\n        mappedSettings.autoInsertRow = false;\n      } else {\n        mappedSettings.autoInsertRow = fillHandle.autoInsertRow;\n      }\n    } else {\n      mappedSettings.autoInsertRow = false;\n    }\n\n    if ((0, _mixed.isDefined)(fillHandle.direction)) {\n      mappedSettings.directions = [fillHandle.direction];\n    } else {\n      mappedSettings.directions = Object.keys(DIRECTIONS);\n    }\n  } else if (typeof fillHandle === 'string') {\n    mappedSettings.directions = [fillHandle];\n    mappedSettings.autoInsertRow = true;\n  } else {\n    mappedSettings.directions = [];\n    mappedSettings.autoInsertRow = false;\n  }\n\n  return mappedSettings;\n}\n\n/***/ }),\n/* 411 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _array = __webpack_require__(1);\n\nvar _feature = __webpack_require__(40);\n\nvar _element = __webpack_require__(0);\n\nvar _ghostTable = __webpack_require__(92);\n\nvar _ghostTable2 = _interopRequireDefault(_ghostTable);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nvar _samplesGenerator = __webpack_require__(320);\n\nvar _samplesGenerator2 = _interopRequireDefault(_samplesGenerator);\n\nvar _string = __webpack_require__(36);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @plugin AutoRowSize\n *\n * @description\n * This plugin allows to set row heights based on their highest cells.\n *\n * By default, the plugin is declared as `undefined`, which makes it disabled (same as if it was declared as `false`).\n * Enabling this plugin may decrease the overall table performance, as it needs to calculate the heights of all cells to\n * resize the rows accordingly.\n * If you experience problems with the performance, try turning this feature off and declaring the row heights manually.\n *\n * Row height calculations are divided into sync and async part. Each of this parts has their own advantages and\n * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous operations don't\n * block the browser UI.\n *\n * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value to a config object:\n * ```js\n * ...\n * // as a number (300 columns in sync, rest async)\n * autoRowSize: {syncLimit: 300},\n * ...\n *\n * ...\n * // as a string (percent)\n * autoRowSize: {syncLimit: '40%'},\n * ...\n * ```\n *\n * You can also use the `allowSampleDuplicates` option to allow sampling duplicate values when calculating the row height. Note, that this might have\n * a negative impact on performance.\n *\n * To configure this plugin see {@link Options#autoRowSize}.\n *\n * @example\n *\n * ```js\n * ...\n * var hot = new Handsontable(document.getElementById('example'), {\n *   date: getData(),\n *   autoRowSize: true\n * });\n * // Access to plugin instance:\n * var plugin = hot.getPlugin('autoRowSize');\n *\n * plugin.getRowHeight(4);\n *\n * if (plugin.isEnabled()) {\n *   // code...\n * }\n * ...\n * ```\n */\nvar AutoRowSize = function (_BasePlugin) {\n  _inherits(AutoRowSize, _BasePlugin);\n\n  _createClass(AutoRowSize, null, [{\n    key: 'CALCULATION_STEP',\n    get: function get() {\n      return 50;\n    }\n  }, {\n    key: 'SYNC_CALCULATION_LIMIT',\n    get: function get() {\n      return 500;\n    }\n  }]);\n\n  function AutoRowSize(hotInstance) {\n    _classCallCheck(this, AutoRowSize);\n\n    /**\n     * Cached rows heights.\n     *\n     * @type {Array}\n     */\n    var _this = _possibleConstructorReturn(this, (AutoRowSize.__proto__ || Object.getPrototypeOf(AutoRowSize)).call(this, hotInstance));\n\n    _this.heights = [];\n    /**\n     * Instance of {@link GhostTable} for rows and columns size calculations.\n     *\n     * @type {GhostTable}\n     */\n    _this.ghostTable = new _ghostTable2.default(_this.hot);\n    /**\n     * Instance of {@link SamplesGenerator} for generating samples necessary for rows height calculations.\n     *\n     * @type {SamplesGenerator}\n     */\n    _this.samplesGenerator = new _samplesGenerator2.default(function (row, col) {\n      if (row >= 0) {\n        return _this.hot.getDataAtCell(row, col);\n      } else if (row === -1) {\n        return _this.hot.getColHeader(col);\n      }\n      return null;\n    });\n    /**\n     * `true` if only the first calculation was performed.\n     *\n     * @type {Boolean}\n     */\n    _this.firstCalculation = true;\n    /**\n     * `true` if the size calculation is in progress.\n     *\n     * @type {Boolean}\n     */\n    _this.inProgress = false;\n\n    // moved to constructor to allow auto-sizing the rows when the plugin is disabled\n    _this.addHook('beforeRowResize', function (row, size, isDblClick) {\n      return _this.onBeforeRowResize(row, size, isDblClick);\n    });\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(AutoRowSize, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().autoRowSize === true || (0, _object.isObject)(this.hot.getSettings().autoRowSize);\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.setSamplingOptions();\n\n      this.addHook('afterLoadData', function () {\n        return _this2.onAfterLoadData();\n      });\n      this.addHook('beforeChange', function (changes) {\n        return _this2.onBeforeChange(changes);\n      });\n      this.addHook('beforeColumnMove', function () {\n        return _this2.recalculateAllRowsHeight();\n      });\n      this.addHook('beforeColumnResize', function () {\n        return _this2.recalculateAllRowsHeight();\n      });\n      this.addHook('beforeColumnSort', function () {\n        return _this2.clearCache();\n      });\n      this.addHook('beforeRender', function (force) {\n        return _this2.onBeforeRender(force);\n      });\n      this.addHook('beforeRowMove', function (rowStart, rowEnd) {\n        return _this2.onBeforeRowMove(rowStart, rowEnd);\n      });\n      this.addHook('modifyRowHeight', function (height, row) {\n        return _this2.getRowHeight(row, height);\n      });\n      this.addHook('modifyColumnHeaderHeight', function () {\n        return _this2.getColumnHeaderHeight();\n      });\n      _get(AutoRowSize.prototype.__proto__ || Object.getPrototypeOf(AutoRowSize.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(AutoRowSize.prototype.__proto__ || Object.getPrototypeOf(AutoRowSize.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Calculate a given rows height.\n     *\n     * @param {Number|Object} rowRange Row range object.\n     * @param {Number|Object} colRange Column range object.\n     * @param {Boolean} [force=false] If `true` force calculate height even when value was cached earlier.\n     */\n\n  }, {\n    key: 'calculateRowsHeight',\n    value: function calculateRowsHeight() {\n      var rowRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countRows() - 1 };\n\n      var _this3 = this;\n\n      var colRange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { from: 0, to: this.hot.countCols() - 1 };\n      var force = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      if (typeof rowRange === 'number') {\n        rowRange = { from: rowRange, to: rowRange };\n      }\n      if (typeof colRange === 'number') {\n        colRange = { from: colRange, to: colRange };\n      }\n\n      if (this.hot.getColHeader(0) !== null) {\n        var samples = this.samplesGenerator.generateRowSamples(-1, colRange);\n\n        this.ghostTable.addColumnHeadersRow(samples.get(-1));\n      }\n\n      (0, _number.rangeEach)(rowRange.from, rowRange.to, function (row) {\n        // For rows we must calculate row height even when user had set height value manually.\n        // We can shrink column but cannot shrink rows!\n        if (force || _this3.heights[row] === void 0) {\n          var _samples = _this3.samplesGenerator.generateRowSamples(row, colRange);\n\n          _samples.forEach(function (sample, row) {\n            _this3.ghostTable.addRow(row, sample);\n          });\n        }\n      });\n      if (this.ghostTable.rows.length) {\n        this.ghostTable.getHeights(function (row, height) {\n          _this3.heights[row] = height;\n        });\n        this.ghostTable.clean();\n      }\n    }\n\n    /**\n     * Calculate the height of all the rows.\n     *\n     * @param {Object|Number} colRange Column range object.\n     */\n\n  }, {\n    key: 'calculateAllRowsHeight',\n    value: function calculateAllRowsHeight() {\n      var _this4 = this;\n\n      var colRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countCols() - 1 };\n\n      var current = 0;\n      var length = this.hot.countRows() - 1;\n      var timer = null;\n\n      this.inProgress = true;\n\n      var loop = function loop() {\n        // When hot was destroyed after calculating finished cancel frame\n        if (!_this4.hot) {\n          (0, _feature.cancelAnimationFrame)(timer);\n          _this4.inProgress = false;\n\n          return;\n        }\n        _this4.calculateRowsHeight({ from: current, to: Math.min(current + AutoRowSize.CALCULATION_STEP, length) }, colRange);\n        current = current + AutoRowSize.CALCULATION_STEP + 1;\n\n        if (current < length) {\n          timer = (0, _feature.requestAnimationFrame)(loop);\n        } else {\n          (0, _feature.cancelAnimationFrame)(timer);\n          _this4.inProgress = false;\n\n          // @TODO Should call once per render cycle, currently fired separately in different plugins\n          _this4.hot.view.wt.wtOverlays.adjustElementsSize(true);\n          // tmp\n          if (_this4.hot.view.wt.wtOverlays.leftOverlay.needFullRender) {\n            _this4.hot.view.wt.wtOverlays.leftOverlay.clone.draw();\n          }\n        }\n      };\n      // sync\n      if (this.firstCalculation && this.getSyncCalculationLimit()) {\n        this.calculateRowsHeight({ from: 0, to: this.getSyncCalculationLimit() }, colRange);\n        this.firstCalculation = false;\n        current = this.getSyncCalculationLimit() + 1;\n      }\n      // async\n      if (current < length) {\n        loop();\n      } else {\n        this.inProgress = false;\n        this.hot.view.wt.wtOverlays.adjustElementsSize(false);\n      }\n    }\n\n    /**\n     * Set the sampling options.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'setSamplingOptions',\n    value: function setSamplingOptions() {\n      var setting = this.hot.getSettings().autoRowSize;\n      var samplingRatio = setting && (0, _object.hasOwnProperty)(setting, 'samplingRatio') ? this.hot.getSettings().autoRowSize.samplingRatio : void 0;\n      var allowSampleDuplicates = setting && (0, _object.hasOwnProperty)(setting, 'allowSampleDuplicates') ? this.hot.getSettings().autoRowSize.allowSampleDuplicates : void 0;\n\n      if (samplingRatio && !isNaN(samplingRatio)) {\n        this.samplesGenerator.setSampleCount(parseInt(samplingRatio, 10));\n      }\n\n      if (allowSampleDuplicates) {\n        this.samplesGenerator.setAllowDuplicates(allowSampleDuplicates);\n      }\n    }\n\n    /**\n     * Recalculate all rows height (overwrite cache values).\n     */\n\n  }, {\n    key: 'recalculateAllRowsHeight',\n    value: function recalculateAllRowsHeight() {\n      if ((0, _element.isVisible)(this.hot.view.wt.wtTable.TABLE)) {\n        this.clearCache();\n        this.calculateAllRowsHeight();\n      }\n    }\n\n    /**\n     * Get value which tells how much rows will be calculated synchronously. Rest rows will be calculated asynchronously.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getSyncCalculationLimit',\n    value: function getSyncCalculationLimit() {\n      /* eslint-disable no-bitwise */\n      var limit = AutoRowSize.SYNC_CALCULATION_LIMIT;\n      var rowsLimit = this.hot.countRows() - 1;\n\n      if ((0, _object.isObject)(this.hot.getSettings().autoRowSize)) {\n        limit = this.hot.getSettings().autoRowSize.syncLimit;\n\n        if ((0, _string.isPercentValue)(limit)) {\n          limit = (0, _number.valueAccordingPercent)(rowsLimit, limit);\n        } else {\n          // Force to Number\n          limit >>= 0;\n        }\n      }\n\n      return Math.min(limit, rowsLimit);\n    }\n\n    /**\n     * Get the calculated row height.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} [defaultHeight] Default row height. It will be pick up if no calculated height found.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getRowHeight',\n    value: function getRowHeight(row) {\n      var defaultHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : void 0;\n\n      var height = defaultHeight;\n\n      if (this.heights[row] !== void 0 && this.heights[row] > (defaultHeight || 0)) {\n        height = this.heights[row];\n      }\n\n      return height;\n    }\n\n    /**\n     * Get the calculated column header height.\n     *\n     * @returns {Number|undefined}\n     */\n\n  }, {\n    key: 'getColumnHeaderHeight',\n    value: function getColumnHeaderHeight() {\n      return this.heights[-1];\n    }\n\n    /**\n     * Get the first visible row.\n     *\n     * @returns {Number} Returns row index or -1 if table is not rendered.\n     */\n\n  }, {\n    key: 'getFirstVisibleRow',\n    value: function getFirstVisibleRow() {\n      var wot = this.hot.view.wt;\n\n      if (wot.wtViewport.rowsVisibleCalculator) {\n        return wot.wtTable.getFirstVisibleRow();\n      }\n      if (wot.wtViewport.rowsRenderCalculator) {\n        return wot.wtTable.getFirstRenderedRow();\n      }\n\n      return -1;\n    }\n\n    /**\n     * Get the last visible row.\n     *\n     * @returns {Number} Returns row index or -1 if table is not rendered.\n     */\n\n  }, {\n    key: 'getLastVisibleRow',\n    value: function getLastVisibleRow() {\n      var wot = this.hot.view.wt;\n\n      if (wot.wtViewport.rowsVisibleCalculator) {\n        return wot.wtTable.getLastVisibleRow();\n      }\n      if (wot.wtViewport.rowsRenderCalculator) {\n        return wot.wtTable.getLastRenderedRow();\n      }\n\n      return -1;\n    }\n\n    /**\n     * Clear cached heights.\n     */\n\n  }, {\n    key: 'clearCache',\n    value: function clearCache() {\n      this.heights.length = 0;\n      this.heights[-1] = void 0;\n    }\n\n    /**\n     * Clear cache by range.\n     *\n     * @param {Object|Number} range Row range object.\n     */\n\n  }, {\n    key: 'clearCacheByRange',\n    value: function clearCacheByRange(range) {\n      var _this5 = this;\n\n      if (typeof range === 'number') {\n        range = { from: range, to: range };\n      }\n      (0, _number.rangeEach)(Math.min(range.from, range.to), Math.max(range.from, range.to), function (row) {\n        _this5.heights[row] = void 0;\n      });\n    }\n\n    /**\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNeedRecalculate',\n    value: function isNeedRecalculate() {\n      return !!(0, _array.arrayFilter)(this.heights, function (item) {\n        return item === void 0;\n      }).length;\n    }\n\n    /**\n     * On before render listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onBeforeRender',\n    value: function onBeforeRender() {\n      var force = this.hot.renderCall;\n      this.calculateRowsHeight({ from: this.getFirstVisibleRow(), to: this.getLastVisibleRow() }, void 0, force);\n\n      var fixedRowsBottom = this.hot.getSettings().fixedRowsBottom;\n\n      // Calculate rows height synchronously for bottom overlay\n      if (fixedRowsBottom) {\n        var totalRows = this.hot.countRows() - 1;\n        this.calculateRowsHeight({ from: totalRows - fixedRowsBottom, to: totalRows });\n      }\n\n      if (this.isNeedRecalculate() && !this.inProgress) {\n        this.calculateAllRowsHeight();\n      }\n    }\n\n    /**\n     * On before row move listener.\n     *\n     * @private\n     * @param {Number} from Row index where was grabbed.\n     * @param {Number} to Destination row index.\n     */\n\n  }, {\n    key: 'onBeforeRowMove',\n    value: function onBeforeRowMove(from, to) {\n      this.clearCacheByRange({ from: from, to: to });\n      this.calculateAllRowsHeight();\n    }\n\n    /**\n     * On before row resize listener.\n     *\n     * @private\n     * @param {Number} row\n     * @param {Number} size\n     * @param {Boolean} isDblClick\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onBeforeRowResize',\n    value: function onBeforeRowResize(row, size, isDblClick) {\n      if (isDblClick) {\n        this.calculateRowsHeight(row, void 0, true);\n        size = this.getRowHeight(row);\n      }\n\n      return size;\n    }\n\n    /**\n     * On after load data listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData() {\n      var _this6 = this;\n\n      if (this.hot.view) {\n        this.recalculateAllRowsHeight();\n      } else {\n        // first load - initialization\n        setTimeout(function () {\n          if (_this6.hot) {\n            _this6.recalculateAllRowsHeight();\n          }\n        }, 0);\n      }\n    }\n\n    /**\n     * On before change listener.\n     *\n     * @private\n     * @param {Array} changes\n     */\n\n  }, {\n    key: 'onBeforeChange',\n    value: function onBeforeChange(changes) {\n      var range = null;\n\n      if (changes.length === 1) {\n        range = changes[0][0];\n      } else if (changes.length > 1) {\n        range = {\n          from: changes[0][0],\n          to: changes[changes.length - 1][0]\n        };\n      }\n      if (range !== null) {\n        this.clearCacheByRange(range);\n      }\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.ghostTable.clean();\n      _get(AutoRowSize.prototype.__proto__ || Object.getPrototypeOf(AutoRowSize.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return AutoRowSize;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('autoRowSize', AutoRowSize);\n\nexports.default = AutoRowSize;\n\n/***/ }),\n/* 412 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _moment = __webpack_require__(41);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _mixed = __webpack_require__(16);\n\nvar _object = __webpack_require__(2);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _mergeSort = __webpack_require__(413);\n\nvar _mergeSort2 = _interopRequireDefault(_mergeSort);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('beforeColumnSort');\n_pluginHooks2.default.getSingleton().register('afterColumnSort');\n\n// TODO: Implement mixin arrayMapper to ColumnSorting plugin.\n\n/**\n * @plugin ColumnSorting\n *\n * @description\n * This plugin sorts the view by a column (but does not sort the data source!).\n * To enable the plugin, set the `columnSorting` property to either:\n * * a boolean value (`true`/`false`),\n * * an object defining the initial sorting order (see the example below).\n *\n * @example\n * ```js\n * ...\n * // as boolean\n * columnSorting: true\n * ...\n * // as a object with initial order (sort ascending column at index 2)\n * columnSorting: {\n *  column: 2,\n *  sortOrder: true, // true = ascending, false = descending, undefined = original order\n *  sortEmptyCells: true // true = the table sorts empty cells, false = the table moves all empty cells to the end of the table\n * }\n * ...\n * ```\n * @dependencies ObserveChanges\n */\n\nvar ColumnSorting = function (_BasePlugin) {\n  _inherits(ColumnSorting, _BasePlugin);\n\n  function ColumnSorting(hotInstance) {\n    _classCallCheck(this, ColumnSorting);\n\n    var _this2 = _possibleConstructorReturn(this, (ColumnSorting.__proto__ || Object.getPrototypeOf(ColumnSorting)).call(this, hotInstance));\n\n    _this2.sortIndicators = [];\n    _this2.lastSortedColumn = null;\n    _this2.sortEmptyCells = false;\n    return _this2;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ColumnSorting, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().columnSorting;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this3 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.setPluginOptions();\n\n      var _this = this;\n      this.hot.sortIndex = [];\n\n      this.hot.sort = function () {\n        var args = Array.prototype.slice.call(arguments);\n\n        return _this.sortByColumn.apply(_this, _toConsumableArray(args));\n      };\n\n      if (typeof this.hot.getSettings().observeChanges === 'undefined') {\n        this.enableObserveChangesPlugin();\n      }\n\n      this.addHook('afterTrimRow', function (row) {\n        return _this3.sort();\n      });\n      this.addHook('afterUntrimRow', function (row) {\n        return _this3.sort();\n      });\n      this.addHook('modifyRow', function (row) {\n        return _this3.translateRow(row);\n      });\n      this.addHook('unmodifyRow', function (row) {\n        return _this3.untranslateRow(row);\n      });\n      this.addHook('afterUpdateSettings', function () {\n        return _this3.onAfterUpdateSettings();\n      });\n      this.addHook('afterGetColHeader', function (col, TH) {\n        return _this3.getColHeader(col, TH);\n      });\n      this.addHook('afterOnCellMouseDown', function (event, target) {\n        return _this3.onAfterOnCellMouseDown(event, target);\n      });\n      this.addHook('afterCreateRow', function () {\n        _this.afterCreateRow.apply(_this, arguments);\n      });\n      this.addHook('afterRemoveRow', function () {\n        _this.afterRemoveRow.apply(_this, arguments);\n      });\n      this.addHook('afterInit', function () {\n        return _this3.sortBySettings();\n      });\n      this.addHook('afterLoadData', function () {\n        _this3.hot.sortIndex = [];\n\n        if (_this3.hot.view) {\n          _this3.sortBySettings();\n        }\n      });\n      if (this.hot.view) {\n        this.sortBySettings();\n      }\n      _get(ColumnSorting.prototype.__proto__ || Object.getPrototypeOf(ColumnSorting.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.hot.sort = void 0;\n      _get(ColumnSorting.prototype.__proto__ || Object.getPrototypeOf(ColumnSorting.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * afterUpdateSettings callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterUpdateSettings',\n    value: function onAfterUpdateSettings() {\n      this.sortBySettings();\n    }\n  }, {\n    key: 'sortBySettings',\n    value: function sortBySettings() {\n      var sortingSettings = this.hot.getSettings().columnSorting;\n      var loadedSortingState = this.loadSortingState();\n      var sortingColumn = void 0;\n      var sortingOrder = void 0;\n\n      if (typeof loadedSortingState === 'undefined') {\n        sortingColumn = sortingSettings.column;\n        sortingOrder = sortingSettings.sortOrder;\n      } else {\n        sortingColumn = loadedSortingState.sortColumn;\n        sortingOrder = loadedSortingState.sortOrder;\n      }\n      if (typeof sortingColumn === 'number') {\n        this.lastSortedColumn = sortingColumn;\n        this.sortByColumn(sortingColumn, sortingOrder);\n      }\n    }\n\n    /**\n     * Set sorted column and order info\n     *\n     * @param {number} col Sorted visual column index.\n     * @param {boolean|undefined} order Sorting order (`true` for ascending, `false` for descending).\n     */\n\n  }, {\n    key: 'setSortingColumn',\n    value: function setSortingColumn(col, order) {\n      if (typeof col == 'undefined') {\n        this.hot.sortColumn = void 0;\n        this.hot.sortOrder = void 0;\n\n        return;\n      } else if (this.hot.sortColumn === col && typeof order == 'undefined') {\n        if (this.hot.sortOrder === false) {\n          this.hot.sortOrder = void 0;\n        } else {\n          this.hot.sortOrder = !this.hot.sortOrder;\n        }\n      } else {\n        this.hot.sortOrder = typeof order === 'undefined' ? true : order;\n      }\n\n      this.hot.sortColumn = col;\n    }\n  }, {\n    key: 'sortByColumn',\n    value: function sortByColumn(col, order) {\n      this.setSortingColumn(col, order);\n\n      if (typeof this.hot.sortColumn == 'undefined') {\n        return;\n      }\n\n      var allowSorting = this.hot.runHooks('beforeColumnSort', this.hot.sortColumn, this.hot.sortOrder);\n\n      if (allowSorting !== false) {\n        this.sort();\n      }\n      this.updateOrderClass();\n      this.updateSortIndicator();\n\n      this.hot.runHooks('afterColumnSort', this.hot.sortColumn, this.hot.sortOrder);\n\n      this.hot.render();\n      this.saveSortingState();\n    }\n\n    /**\n     * Save the sorting state\n     */\n\n  }, {\n    key: 'saveSortingState',\n    value: function saveSortingState() {\n      var sortingState = {};\n\n      if (typeof this.hot.sortColumn != 'undefined') {\n        sortingState.sortColumn = this.hot.sortColumn;\n      }\n\n      if (typeof this.hot.sortOrder != 'undefined') {\n        sortingState.sortOrder = this.hot.sortOrder;\n      }\n\n      if ((0, _object.hasOwnProperty)(sortingState, 'sortColumn') || (0, _object.hasOwnProperty)(sortingState, 'sortOrder')) {\n        this.hot.runHooks('persistentStateSave', 'columnSorting', sortingState);\n      }\n    }\n\n    /**\n     * Load the sorting state.\n     *\n     * @returns {*} Previously saved sorting state.\n     */\n\n  }, {\n    key: 'loadSortingState',\n    value: function loadSortingState() {\n      var storedState = {};\n      this.hot.runHooks('persistentStateLoad', 'columnSorting', storedState);\n\n      return storedState.value;\n    }\n\n    /**\n     * Update sorting class name state.\n     */\n\n  }, {\n    key: 'updateOrderClass',\n    value: function updateOrderClass() {\n      var orderClass = void 0;\n\n      if (this.hot.sortOrder === true) {\n        orderClass = 'ascending';\n      } else if (this.hot.sortOrder === false) {\n        orderClass = 'descending';\n      }\n      this.sortOrderClass = orderClass;\n    }\n  }, {\n    key: 'enableObserveChangesPlugin',\n    value: function enableObserveChangesPlugin() {\n      var _this = this;\n\n      this.hot._registerTimeout(setTimeout(function () {\n        _this.hot.updateSettings({\n          observeChanges: true\n        });\n      }, 0));\n    }\n\n    /**\n     * Default sorting algorithm.\n     *\n     * @param {Boolean} sortOrder Sorting order - `true` for ascending, `false` for descending.\n     * @param {Object} columnMeta Column meta object.\n     * @returns {Function} The comparing function.\n     */\n\n  }, {\n    key: 'defaultSort',\n    value: function defaultSort(sortOrder, columnMeta) {\n      return function (a, b) {\n        if (typeof a[1] == 'string') {\n          a[1] = a[1].toLowerCase();\n        }\n        if (typeof b[1] == 'string') {\n          b[1] = b[1].toLowerCase();\n        }\n\n        if (a[1] === b[1]) {\n          return 0;\n        }\n\n        if ((0, _mixed.isEmpty)(a[1])) {\n          if ((0, _mixed.isEmpty)(b[1])) {\n            return 0;\n          }\n\n          if (columnMeta.columnSorting.sortEmptyCells) {\n            return sortOrder ? -1 : 1;\n          }\n\n          return 1;\n        }\n        if ((0, _mixed.isEmpty)(b[1])) {\n          if ((0, _mixed.isEmpty)(a[1])) {\n            return 0;\n          }\n\n          if (columnMeta.columnSorting.sortEmptyCells) {\n            return sortOrder ? 1 : -1;\n          }\n\n          return -1;\n        }\n\n        if (isNaN(a[1]) && !isNaN(b[1])) {\n          return sortOrder ? 1 : -1;\n        } else if (!isNaN(a[1]) && isNaN(b[1])) {\n          return sortOrder ? -1 : 1;\n        } else if (!(isNaN(a[1]) || isNaN(b[1]))) {\n          a[1] = parseFloat(a[1]);\n          b[1] = parseFloat(b[1]);\n        }\n        if (a[1] < b[1]) {\n          return sortOrder ? -1 : 1;\n        }\n        if (a[1] > b[1]) {\n          return sortOrder ? 1 : -1;\n        }\n\n        return 0;\n      };\n    }\n\n    /**\n     * Date sorting algorithm\n     * @param {Boolean} sortOrder Sorting order (`true` for ascending, `false` for descending).\n     * @param {Object} columnMeta Column meta object.\n     * @returns {Function} The compare function.\n     */\n\n  }, {\n    key: 'dateSort',\n    value: function dateSort(sortOrder, columnMeta) {\n      return function (a, b) {\n        if (a[1] === b[1]) {\n          return 0;\n        }\n\n        if ((0, _mixed.isEmpty)(a[1])) {\n          if ((0, _mixed.isEmpty)(b[1])) {\n            return 0;\n          }\n\n          if (columnMeta.columnSorting.sortEmptyCells) {\n            return sortOrder ? -1 : 1;\n          }\n\n          return 1;\n        }\n\n        if ((0, _mixed.isEmpty)(b[1])) {\n          if ((0, _mixed.isEmpty)(a[1])) {\n            return 0;\n          }\n\n          if (columnMeta.columnSorting.sortEmptyCells) {\n            return sortOrder ? 1 : -1;\n          }\n\n          return -1;\n        }\n\n        var aDate = (0, _moment2.default)(a[1], columnMeta.dateFormat);\n        var bDate = (0, _moment2.default)(b[1], columnMeta.dateFormat);\n\n        if (!aDate.isValid()) {\n          return 1;\n        }\n        if (!bDate.isValid()) {\n          return -1;\n        }\n\n        if (bDate.isAfter(aDate)) {\n          return sortOrder ? -1 : 1;\n        }\n        if (bDate.isBefore(aDate)) {\n          return sortOrder ? 1 : -1;\n        }\n\n        return 0;\n      };\n    }\n\n    /**\n     * Numeric sorting algorithm.\n     *\n     * @param {Boolean} sortOrder Sorting order (`true` for ascending, `false` for descending).\n     * @param {Object} columnMeta Column meta object.\n     * @returns {Function} The compare function.\n     */\n\n  }, {\n    key: 'numericSort',\n    value: function numericSort(sortOrder, columnMeta) {\n      return function (a, b) {\n        var parsedA = parseFloat(a[1]);\n        var parsedB = parseFloat(b[1]);\n\n        // Watch out when changing this part of code!\n        // Check below returns 0 (as expected) when comparing empty string, null, undefined\n        if (parsedA === parsedB || isNaN(parsedA) && isNaN(parsedB)) {\n          return 0;\n        }\n\n        if (columnMeta.columnSorting.sortEmptyCells) {\n          if ((0, _mixed.isEmpty)(a[1])) {\n            return sortOrder ? -1 : 1;\n          }\n\n          if ((0, _mixed.isEmpty)(b[1])) {\n            return sortOrder ? 1 : -1;\n          }\n        }\n\n        if (isNaN(parsedA)) {\n          return 1;\n        }\n\n        if (isNaN(parsedB)) {\n          return -1;\n        }\n\n        if (parsedA < parsedB) {\n          return sortOrder ? -1 : 1;\n        } else if (parsedA > parsedB) {\n          return sortOrder ? 1 : -1;\n        }\n\n        return 0;\n      };\n    }\n\n    /**\n     * Perform the sorting.\n     */\n\n  }, {\n    key: 'sort',\n    value: function sort() {\n      if (typeof this.hot.sortOrder == 'undefined') {\n        this.hot.sortIndex.length = 0;\n\n        return;\n      }\n\n      var colMeta = this.hot.getCellMeta(0, this.hot.sortColumn);\n      var emptyRows = this.hot.countEmptyRows();\n      var sortFunction = void 0;\n      var nrOfRows = void 0;\n\n      this.hot.sortingEnabled = false; // this is required by translateRow plugin hook\n      this.hot.sortIndex.length = 0;\n\n      if (typeof colMeta.columnSorting.sortEmptyCells === 'undefined') {\n        colMeta.columnSorting = { sortEmptyCells: this.sortEmptyCells };\n      }\n\n      if (this.hot.getSettings().maxRows === Number.POSITIVE_INFINITY) {\n        nrOfRows = this.hot.countRows() - this.hot.getSettings().minSpareRows;\n      } else {\n        nrOfRows = this.hot.countRows() - emptyRows;\n      }\n\n      for (var i = 0, ilen = nrOfRows; i < ilen; i++) {\n        this.hot.sortIndex.push([i, this.hot.getDataAtCell(i, this.hot.sortColumn)]);\n      }\n\n      if (colMeta.sortFunction) {\n        sortFunction = colMeta.sortFunction;\n      } else {\n        switch (colMeta.type) {\n          case 'date':\n            sortFunction = this.dateSort;\n            break;\n          case 'numeric':\n            sortFunction = this.numericSort;\n            break;\n          default:\n            sortFunction = this.defaultSort;\n        }\n      }\n\n      (0, _mergeSort2.default)(this.hot.sortIndex, sortFunction(this.hot.sortOrder, colMeta));\n\n      // Append spareRows\n      for (var _i = this.hot.sortIndex.length; _i < this.hot.countRows(); _i++) {\n        this.hot.sortIndex.push([_i, this.hot.getDataAtCell(_i, this.hot.sortColumn)]);\n      }\n\n      this.hot.sortingEnabled = true; // this is required by translateRow plugin hook\n    }\n\n    /**\n     * Update indicator states.\n     */\n\n  }, {\n    key: 'updateSortIndicator',\n    value: function updateSortIndicator() {\n      if (typeof this.hot.sortOrder == 'undefined') {\n        return;\n      }\n      var colMeta = this.hot.getCellMeta(0, this.hot.sortColumn);\n\n      this.sortIndicators[this.hot.sortColumn] = colMeta.sortIndicator;\n    }\n\n    /**\n     * `modifyRow` hook callback. Translates physical row index to the sorted row index.\n     *\n     * @param {Number} row Row index.\n     * @returns {Number} Sorted row index.\n     */\n\n  }, {\n    key: 'translateRow',\n    value: function translateRow(row) {\n      if (this.hot.sortingEnabled && typeof this.hot.sortOrder !== 'undefined' && this.hot.sortIndex && this.hot.sortIndex.length && this.hot.sortIndex[row]) {\n        return this.hot.sortIndex[row][0];\n      }\n\n      return row;\n    }\n\n    /**\n     * Translates sorted row index to physical row index.\n     *\n     * @param {Number} row Sorted (visual) row index.\n     * @returns {number} Physical row index.\n     */\n\n  }, {\n    key: 'untranslateRow',\n    value: function untranslateRow(row) {\n      if (this.hot.sortingEnabled && this.hot.sortIndex && this.hot.sortIndex.length) {\n        for (var i = 0; i < this.hot.sortIndex.length; i++) {\n          if (this.hot.sortIndex[i][0] == row) {\n            return i;\n          }\n        }\n      }\n    }\n\n    /**\n     * `afterGetColHeader` callback. Adds column sorting css classes to clickable headers.\n     *\n     * @private\n     * @param {Number} col Visual column index.\n     * @param {Element} TH TH HTML element.\n     */\n\n  }, {\n    key: 'getColHeader',\n    value: function getColHeader(col, TH) {\n      if (col < 0 || !TH.parentNode) {\n        return false;\n      }\n\n      var headerLink = TH.querySelector('.colHeader');\n      var colspan = TH.getAttribute('colspan');\n      var TRs = TH.parentNode.parentNode.childNodes;\n      var headerLevel = Array.prototype.indexOf.call(TRs, TH.parentNode);\n      headerLevel -= TRs.length;\n\n      if (!headerLink) {\n        return;\n      }\n\n      if (this.hot.getSettings().columnSorting && col >= 0 && headerLevel === -1) {\n        (0, _element.addClass)(headerLink, 'columnSorting');\n      }\n      (0, _element.removeClass)(headerLink, 'descending');\n      (0, _element.removeClass)(headerLink, 'ascending');\n\n      if (this.sortIndicators[col]) {\n        if (col === this.hot.sortColumn) {\n          if (this.sortOrderClass === 'ascending') {\n            (0, _element.addClass)(headerLink, 'ascending');\n          } else if (this.sortOrderClass === 'descending') {\n            (0, _element.addClass)(headerLink, 'descending');\n          }\n        }\n      }\n    }\n\n    /**\n     * Check if any column is in a sorted state.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSorted',\n    value: function isSorted() {\n      return typeof this.hot.sortColumn != 'undefined';\n    }\n\n    /**\n     * `afterCreateRow` callback. Updates the sorting state after a row have been created.\n     *\n     * @private\n     * @param {Number} index Visual row index.\n     * @param {Number} amount\n     */\n\n  }, {\n    key: 'afterCreateRow',\n    value: function afterCreateRow(index, amount) {\n      if (!this.isSorted()) {\n        return;\n      }\n\n      for (var i = 0; i < this.hot.sortIndex.length; i++) {\n        if (this.hot.sortIndex[i][0] >= index) {\n          this.hot.sortIndex[i][0] += amount;\n        }\n      }\n\n      for (var _i2 = 0; _i2 < amount; _i2++) {\n        this.hot.sortIndex.splice(index + _i2, 0, [index + _i2, this.hot.getSourceData()[index + _i2][this.hot.sortColumn + this.hot.colOffset()]]);\n      }\n\n      this.saveSortingState();\n    }\n\n    /**\n     * `afterRemoveRow` hook callback.\n     *\n     * @private\n     * @param {Number} index Visual row index.\n     * @param {Number} amount\n     */\n\n  }, {\n    key: 'afterRemoveRow',\n    value: function afterRemoveRow(index, amount) {\n      if (!this.isSorted()) {\n        return;\n      }\n      var removedRows = this.hot.sortIndex.splice(index, amount);\n\n      removedRows = (0, _array.arrayMap)(removedRows, function (row) {\n        return row[0];\n      });\n\n      function countRowShift(logicalRow) {\n        // Todo: compare perf between reduce vs sort->each->brake\n        return (0, _array.arrayReduce)(removedRows, function (count, removedLogicalRow) {\n          if (logicalRow > removedLogicalRow) {\n            count++;\n          }\n\n          return count;\n        }, 0);\n      }\n\n      this.hot.sortIndex = (0, _array.arrayMap)(this.hot.sortIndex, function (logicalRow, physicalRow) {\n        var rowShift = countRowShift(logicalRow[0]);\n\n        if (rowShift) {\n          logicalRow[0] -= rowShift;\n        }\n\n        return logicalRow;\n      });\n\n      this.saveSortingState();\n    }\n\n    /**\n     * Set options by passed settings\n     *\n     * @private\n     */\n\n  }, {\n    key: 'setPluginOptions',\n    value: function setPluginOptions() {\n      var columnSorting = this.hot.getSettings().columnSorting;\n\n      if ((typeof columnSorting === 'undefined' ? 'undefined' : _typeof(columnSorting)) === 'object') {\n        this.sortEmptyCells = columnSorting.sortEmptyCells || false;\n      } else {\n        this.sortEmptyCells = false;\n      }\n    }\n\n    /**\n     * `onAfterOnCellMouseDown` hook callback.\n     *\n     * @private\n     * @param {Event} event Event which are provided by hook.\n     * @param {CellCoords} coords Visual coords of the selected cell.\n     */\n\n  }, {\n    key: 'onAfterOnCellMouseDown',\n    value: function onAfterOnCellMouseDown(event, coords) {\n      if (coords.row > -1) {\n        return;\n      }\n\n      if ((0, _element.hasClass)(event.realTarget, 'columnSorting')) {\n        // reset order state on every new column header click\n        if (coords.col !== this.lastSortedColumn) {\n          this.hot.sortOrder = true;\n        }\n\n        this.lastSortedColumn = coords.col;\n\n        this.sortByColumn(coords.col);\n      }\n    }\n  }]);\n\n  return ColumnSorting;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('columnSorting', ColumnSorting);\n\nexports.default = ColumnSorting;\n\n/***/ }),\n/* 413 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = mergeSort;\nexports.merge = merge;\n\nvar _linkedList = __webpack_require__(414);\n\nvar _linkedList2 = _interopRequireDefault(_linkedList);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Refactored implementation of mergeSort (part of javascript-algorithms project) by Github users:\n * mgechev, AndriiHeonia and lekkas (part of javascript-algorithms project - all project contributors\n * at repository website)\n *\n * Link to repository: https://github.com/mgechev/javascript-algorithms\n */\n\n/**\n * Specifies a function that defines the sort order. The array is sorted according to each\n * character's Unicode code point value, according to the string conversion of each element.\n *\n * @param a {*} first compared element.\n * @param b {*} second compared element.\n * @returns {Number}\n */\nvar defaultCompareFunction = function defaultCompareFunction(a, b) {\n  // sort lexically\n\n  var firstValue = a.toString();\n  var secondValue = b.toString();\n\n  if (firstValue === secondValue) {\n    return 0;\n  } else if (firstValue < secondValue) {\n    return -1;\n  }\n  return 1;\n};\n\n/**\n * Mergesort method which is recursively called for sorting the input array.\n *\n * @param {Array} array The array which should be sorted.\n * @param {Function} compareFunction Compares two items in an array. If compareFunction is not supplied,\n * elements are sorted by converting them to strings and comparing strings in Unicode code point order.\n * @param {Number} startIndex Left side of the subarray.\n * @param {Number} endIndex Right side of the subarray.\n * @returns {Array} Array with sorted subarray.\n */\nfunction mergeSort(array) {\n  var compareFunction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultCompareFunction;\n  var startIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n  var endIndex = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : array.length;\n\n  if (Math.abs(endIndex - startIndex) <= 1) {\n    return [];\n  }\n\n  var middleIndex = Math.ceil((startIndex + endIndex) / 2);\n\n  mergeSort(array, compareFunction, startIndex, middleIndex);\n  mergeSort(array, compareFunction, middleIndex, endIndex);\n\n  return merge(array, compareFunction, startIndex, middleIndex, endIndex);\n}\n\n/**\n * Devides and sort merges two subarrays of given array\n *\n * @param {Array} array The array which subarrays should be sorted.\n * @param {Number} startIndex The start of the first subarray.\n *   This subarray is with end middle - 1.\n * @param {Number} middleIndex The start of the second array.\n * @param {Number} endIndex end - 1 is the end of the second array.\n * @returns {Array} The array with sorted subarray.\n */\nfunction merge(array, compareFunction, startIndex, middleIndex, endIndex) {\n  var leftElements = new _linkedList2.default();\n  var rightElements = new _linkedList2.default();\n  var leftSize = middleIndex - startIndex;\n  var rightSize = endIndex - middleIndex;\n  var maxSize = Math.max(leftSize, rightSize);\n  var size = endIndex - startIndex;\n\n  for (var _i = 0; _i < maxSize; _i += 1) {\n    if (_i < leftSize) {\n      leftElements.push(array[startIndex + _i]);\n    }\n\n    if (_i < rightSize) {\n      rightElements.push(array[middleIndex + _i]);\n    }\n  }\n\n  var i = 0;\n\n  while (i < size) {\n    if (leftElements.first && rightElements.first) {\n      if (compareFunction(leftElements.first.data, rightElements.first.data) > 0) {\n        array[startIndex + i] = rightElements.shift().data;\n      } else {\n        array[startIndex + i] = leftElements.shift().data;\n      }\n    } else if (leftElements.first) {\n\n      array[startIndex + i] = leftElements.shift().data;\n    } else {\n\n      array[startIndex + i] = rightElements.shift().data;\n    }\n\n    i += 1;\n  }\n\n  return array;\n};\n\n/***/ }),\n/* 414 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Refactored implementation of LinkedList (part of javascript-algorithms project) by Github users:\n * mgechev, AndriiHeonia, Microfed and Jakeh (part of javascript-algorithms project - all project contributors\n * at repository website)\n *\n * Link to repository: https://github.com/mgechev/javascript-algorithms\n */\n\n/**\n * Linked list node.\n *\n * @class NodeStructure\n * @util\n */\nvar NodeStructure = function NodeStructure(data) {\n  _classCallCheck(this, NodeStructure);\n\n  /**\n   * Data of the node.\n   * @member {Object}\n   */\n  this.data = data;\n  /**\n   * Next node.\n   * @member {NodeStructure}\n   */\n  this.next = null;\n  /**\n   * Previous node.\n   * @member {NodeStructure}\n   */\n  this.prev = null;\n};\n\n/**\n * Linked list.\n *\n * @class LinkedList\n * @util\n */\n\n\nvar LinkedList = function () {\n  function LinkedList() {\n    _classCallCheck(this, LinkedList);\n\n    this.first = null;\n    this.last = null;\n  }\n\n  /**\n   * Add data to the end of linked list.\n   *\n   * @param {Object} data Data which should be added.\n   */\n\n\n  _createClass(LinkedList, [{\n    key: \"push\",\n    value: function push(data) {\n      var node = new NodeStructure(data);\n\n      if (this.first === null) {\n        this.first = node;\n        this.last = node;\n      } else {\n        var temp = this.last;\n\n        this.last = node;\n        node.prev = temp;\n        temp.next = node;\n      }\n    }\n\n    /**\n     * Add data to the beginning of linked list.\n     *\n     * @param {Object} data Data which should be added.\n     */\n\n  }, {\n    key: \"unshift\",\n    value: function unshift(data) {\n      var node = new NodeStructure(data);\n\n      if (this.first === null) {\n        this.first = node;\n        this.last = node;\n      } else {\n        var temp = this.first;\n\n        this.first = node;\n        node.next = temp;\n        temp.prev = node;\n      }\n    }\n\n    /**\n     * In order traversal of the linked list.\n     *\n     * @param {Function} callback Callback which should be executed on each node.\n     */\n\n  }, {\n    key: \"inorder\",\n    value: function inorder(callback) {\n      var temp = this.first;\n\n      while (temp) {\n        callback(temp);\n        temp = temp.next;\n      }\n    }\n\n    /**\n     * Remove data from the linked list.\n     *\n     * @param {Object} data Data which should be removed.\n     * @returns {Boolean} Returns true if data has been removed.\n     */\n\n  }, {\n    key: \"remove\",\n    value: function remove(data) {\n      if (this.first === null) {\n        return false;\n      }\n\n      var temp = this.first;\n      var next = void 0;\n      var prev = void 0;\n\n      while (temp) {\n        if (temp.data === data) {\n          next = temp.next;\n          prev = temp.prev;\n\n          if (next) {\n            next.prev = prev;\n          }\n\n          if (prev) {\n            prev.next = next;\n          }\n\n          if (temp === this.first) {\n            this.first = next;\n          }\n\n          if (temp === this.last) {\n            this.last = prev;\n          }\n\n          return true;\n        }\n\n        temp = temp.next;\n      }\n\n      return false;\n    }\n\n    /**\n     * Check if linked list contains cycle.\n     *\n     * @returns {Boolean} Returns true if linked list contains cycle.\n     */\n\n  }, {\n    key: \"hasCycle\",\n    value: function hasCycle() {\n      var fast = this.first;\n      var slow = this.first;\n\n      while (true) {\n        if (fast === null) {\n          return false;\n        }\n\n        fast = fast.next;\n\n        if (fast === null) {\n          return false;\n        }\n\n        fast = fast.next;\n        slow = slow.next;\n\n        if (fast === slow) {\n          return true;\n        }\n      }\n    }\n  }, {\n    key: \"pop\",\n\n\n    /**\n     * Return last node from the linked list.\n     *\n     * @returns {NodeStructure} Last node.\n     */\n    value: function pop() {\n      if (this.last === null) {\n        return null;\n      }\n\n      var temp = this.last;\n      this.last = this.last.prev;\n\n      return temp;\n    }\n  }, {\n    key: \"shift\",\n\n\n    /**\n     * Return first node from the linked list.\n     *\n     * @returns {NodeStructure} First node.\n     */\n    value: function shift() {\n      if (this.first === null) {\n        return null;\n      }\n\n      var temp = this.first;\n      this.first = this.first.next;\n\n      return temp;\n    }\n  }, {\n    key: \"recursiveReverse\",\n\n\n    /**\n     * Reverses the linked list recursively\n     */\n    value: function recursiveReverse() {\n      function inverse(current, next) {\n        if (!next) {\n          return;\n        }\n        inverse(next, next.next);\n        next.next = current;\n      }\n\n      if (!this.first) {\n        return;\n      }\n\n      inverse(this.first, this.first.next);\n\n      this.first.next = null;\n      var temp = this.first;\n      this.first = this.last;\n      this.last = temp;\n    }\n  }, {\n    key: \"reverse\",\n\n\n    /**\n     * Reverses the linked list iteratively\n     */\n    value: function reverse() {\n      if (!this.first || !this.first.next) {\n        return;\n      }\n\n      var current = this.first.next;\n      var prev = this.first;\n      var temp = void 0;\n\n      while (current) {\n        temp = current.next;\n        current.next = prev;\n        prev.prev = current;\n        prev = current;\n        current = temp;\n      }\n\n      this.first.next = null;\n      this.last.prev = null;\n      temp = this.first;\n      this.first = prev;\n      this.last = temp;\n    }\n  }]);\n\n  return LinkedList;\n}();\n\n;\n\nexports.NodeStructure = NodeStructure;\nexports.default = LinkedList;\n\n/***/ }),\n/* 415 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _src = __webpack_require__(4);\n\nvar _plugins = __webpack_require__(8);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _commentEditor = __webpack_require__(416);\n\nvar _commentEditor2 = _interopRequireDefault(_commentEditor);\n\nvar _utils = __webpack_require__(19);\n\nvar _displaySwitch = __webpack_require__(417);\n\nvar _displaySwitch2 = _interopRequireDefault(_displaySwitch);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\n__webpack_require__(418);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar privatePool = new WeakMap();\nvar META_COMMENT = 'comment';\nvar META_COMMENT_VALUE = 'value';\nvar META_STYLE = 'style';\nvar META_READONLY = 'readOnly';\n\n/**\n * @plugin Comments\n *\n * @description\n * This plugin allows setting and managing cell comments by either an option in the context menu or with the use of the API.\n *\n * To enable the plugin, you'll need to set the comments property of the config object to `true`:\n * ```js\n * ...\n * comments: true\n * ...\n * ```\n *\n * or object with extra predefined plugin config:\n *\n * ```js\n * ...\n * comments: {\n *   displayDelay: 1000\n * }\n * ...\n * ```\n *\n * To add comments at the table initialization, define the `comment` property in the `cell` config array as in an example below.\n *\n * @example\n *\n * ```js\n * ...\n * var hot = new Handsontable(document.getElementById('example'), {\n *   date: getData(),\n *   comments: true,\n *   cell: [\n *     {row: 1, col: 1, comment: {value: 'Foo'}},\n *     {row: 2, col: 2, comment: {value: 'Bar'}}\n *   ]\n * });\n *\n * // Access to the Comments plugin instance:\n * var commentsPlugin = hot.getPlugin('comments');\n *\n * // Manage comments programmatically:\n * commentsPlugin.setCommentAtCell(1, 6, 'Comment contents');\n * commentsPlugin.showAtCell(1, 6);\n * commentsPlugin.removeCommentAtCell(1, 6);\n *\n * // You can also set range once and use proper methods:\n * commentsPlugin.setRange({row: 1, col: 6});\n * commentsPlugin.setComment('Comment contents');\n * commentsPlugin.show();\n * commentsPlugin.removeComment();\n * ...\n * ```\n */\n\nvar Comments = function (_BasePlugin) {\n  _inherits(Comments, _BasePlugin);\n\n  function Comments(hotInstance) {\n    _classCallCheck(this, Comments);\n\n    /**\n     * Instance of {@link CommentEditor}.\n     *\n     * @type {CommentEditor}\n     */\n    var _this = _possibleConstructorReturn(this, (Comments.__proto__ || Object.getPrototypeOf(Comments)).call(this, hotInstance));\n\n    _this.editor = null;\n    /**\n     * Instance of {@link DisplaySwitch}.\n     *\n     * @type {DisplaySwitch}\n     */\n    _this.displaySwitch = null;\n    /**\n     * Instance of {@link EventManager}.\n     *\n     * @private\n     * @type {EventManager}\n     */\n    _this.eventManager = null;\n    /**\n     * Current cell range.\n     *\n     * @type {Object}\n     */\n    _this.range = {};\n    /**\n     * @private\n     * @type {Boolean}\n     */\n    _this.mouseDown = false;\n    /**\n     * @private\n     * @type {Boolean}\n     */\n    _this.contextMenuEvent = false;\n    /**\n     * @private\n     * @type {*}\n     */\n    _this.timer = null;\n\n    privatePool.set(_this, {\n      tempEditorDimensions: {},\n      cellBelowCursor: null\n    });\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(Comments, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().comments;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      if (!this.editor) {\n        this.editor = new _commentEditor2.default();\n      }\n\n      if (!this.eventManager) {\n        this.eventManager = new _eventManager2.default(this);\n      }\n\n      if (!this.displaySwitch) {\n        this.displaySwitch = new _displaySwitch2.default(this.getDisplayDelaySetting());\n      }\n\n      this.addHook('afterContextMenuDefaultOptions', function (options) {\n        return _this2.addToContextMenu(options);\n      });\n      this.addHook('afterRenderer', function (TD, row, col, prop, value, cellProperties) {\n        return _this2.onAfterRenderer(TD, cellProperties);\n      });\n      this.addHook('afterScrollHorizontally', function () {\n        return _this2.hide();\n      });\n      this.addHook('afterScrollVertically', function () {\n        return _this2.hide();\n      });\n      this.addHook('afterBeginEditing', function (args) {\n        return _this2.onAfterBeginEditing(args);\n      });\n\n      this.displaySwitch.addLocalHook('hide', function () {\n        return _this2.hide();\n      });\n      this.displaySwitch.addLocalHook('show', function (row, col) {\n        return _this2.showAtCell(row, col);\n      });\n\n      this.registerListeners();\n\n      _get(Comments.prototype.__proto__ || Object.getPrototypeOf(Comments.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Update plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n      _get(Comments.prototype.__proto__ || Object.getPrototypeOf(Comments.prototype), 'updatePlugin', this).call(this);\n\n      this.displaySwitch.updateDelay(this.getDisplayDelaySetting());\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(Comments.prototype.__proto__ || Object.getPrototypeOf(Comments.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Register all necessary DOM listeners.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerListeners',\n    value: function registerListeners() {\n      var _this3 = this;\n\n      this.eventManager.addEventListener(document, 'mouseover', function (event) {\n        return _this3.onMouseOver(event);\n      });\n      this.eventManager.addEventListener(document, 'mousedown', function (event) {\n        return _this3.onMouseDown(event);\n      });\n      this.eventManager.addEventListener(document, 'mouseup', function (event) {\n        return _this3.onMouseUp(event);\n      });\n      this.eventManager.addEventListener(this.editor.getInputElement(), 'blur', function (event) {\n        return _this3.onEditorBlur(event);\n      });\n      this.eventManager.addEventListener(this.editor.getInputElement(), 'mousedown', function (event) {\n        return _this3.onEditorMouseDown(event);\n      });\n      this.eventManager.addEventListener(this.editor.getInputElement(), 'mouseup', function (event) {\n        return _this3.onEditorMouseUp(event);\n      });\n    }\n\n    /**\n     * Set current cell range to be able to use general methods like {@link Comments#setComment},\n     * {@link Comments#removeComment}, {@link Comments#show}.\n     *\n     * @param {Object} range Object with `from` and `to` properties, each with `row` and `col` properties.\n     */\n\n  }, {\n    key: 'setRange',\n    value: function setRange(range) {\n      this.range = range;\n    }\n\n    /**\n     * Clear the currently selected cell.\n     */\n\n  }, {\n    key: 'clearRange',\n    value: function clearRange() {\n      this.range = {};\n    }\n\n    /**\n     * Check if the event target is a cell containing a comment.\n     *\n     * @param {Event} event DOM event\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'targetIsCellWithComment',\n    value: function targetIsCellWithComment(event) {\n      var closestCell = (0, _element.closest)(event.target, 'TD', 'TBODY');\n\n      return !!(closestCell && (0, _element.hasClass)(closestCell, 'htCommentCell') && (0, _element.closest)(closestCell, [this.hot.rootElement]));\n    }\n\n    /**\n     * Check if the event target is a comment textarea.\n     *\n     * @param {Event} event DOM event.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'targetIsCommentTextArea',\n    value: function targetIsCommentTextArea(event) {\n      return this.editor.getInputElement() === event.target;\n    }\n\n    /**\n     * Set a comment for a cell according to the previously set range (see {@link Comments#setRange}).\n     *\n     * @param {String} value Comment contents.\n     */\n\n  }, {\n    key: 'setComment',\n    value: function setComment(value) {\n      if (!this.range.from) {\n        throw new Error('Before using this method, first set cell range (hot.getPlugin(\"comment\").setRange())');\n      }\n      var editorValue = this.editor.getValue();\n      var comment = '';\n\n      if (value != null) {\n        comment = value;\n      } else if (editorValue != null) {\n        comment = editorValue;\n      }\n\n      var row = this.range.from.row;\n      var col = this.range.from.col;\n\n      this.updateCommentMeta(row, col, _defineProperty({}, META_COMMENT_VALUE, comment));\n      this.hot.render();\n    }\n\n    /**\n     * Set a comment for a cell.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {String} value Comment contents.\n     */\n\n  }, {\n    key: 'setCommentAtCell',\n    value: function setCommentAtCell(row, col, value) {\n      this.setRange({\n        from: new _src.CellCoords(row, col)\n      });\n      this.setComment(value);\n    }\n\n    /**\n     * Remove a comment from a cell according to previously set range (see {@link Comments#setRange}).\n     *\n     * @param {Boolean} [forceRender = true] If set to `true`, the table will be re-rendered at the end of the operation.\n     */\n\n  }, {\n    key: 'removeComment',\n    value: function removeComment() {\n      var forceRender = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n      if (!this.range.from) {\n        throw new Error('Before using this method, first set cell range (hot.getPlugin(\"comment\").setRange())');\n      }\n\n      this.hot.setCellMeta(this.range.from.row, this.range.from.col, META_COMMENT, void 0);\n\n      if (forceRender) {\n        this.hot.render();\n      }\n\n      this.hide();\n    }\n\n    /**\n     * Remove comment from a cell.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {Boolean} [forceRender = true] If `true`, the table will be re-rendered at the end of the operation.\n     */\n\n  }, {\n    key: 'removeCommentAtCell',\n    value: function removeCommentAtCell(row, col) {\n      var forceRender = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n      this.setRange({\n        from: new _src.CellCoords(row, col)\n      });\n      this.removeComment(forceRender);\n    }\n\n    /**\n     * Get comment from a cell at the predefined range.\n     */\n\n  }, {\n    key: 'getComment',\n    value: function getComment() {\n      var row = this.range.from.row;\n      var column = this.range.from.col;\n\n      return this.getCommentMeta(row, column, META_COMMENT_VALUE);\n    }\n\n    /**\n     * Get comment from a cell at the provided coordinates.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'getCommentAtCell',\n    value: function getCommentAtCell(row, column) {\n      return this.getCommentMeta(row, column, META_COMMENT_VALUE);\n    }\n\n    /**\n     * Show the comment editor accordingly to the previously set range (see {@link Comments#setRange}).\n     *\n     * @returns {Boolean} Returns `true` if comment editor was shown.\n     */\n\n  }, {\n    key: 'show',\n    value: function show() {\n      if (!this.range.from) {\n        throw new Error('Before using this method, first set cell range (hot.getPlugin(\"comment\").setRange())');\n      }\n      var meta = this.hot.getCellMeta(this.range.from.row, this.range.from.col);\n\n      this.refreshEditor(true);\n      this.editor.setValue(meta[META_COMMENT] ? meta[META_COMMENT][META_COMMENT_VALUE] : null || '');\n\n      if (this.editor.hidden) {\n        this.editor.show();\n      }\n\n      return true;\n    }\n\n    /**\n     * Show comment editor according to cell coordinates.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @returns {Boolean} Returns `true` if comment editor was shown.\n     */\n\n  }, {\n    key: 'showAtCell',\n    value: function showAtCell(row, col) {\n      this.setRange({\n        from: new _src.CellCoords(row, col)\n      });\n\n      return this.show();\n    }\n\n    /**\n     * Hide the comment editor.\n     */\n\n  }, {\n    key: 'hide',\n    value: function hide() {\n      if (!this.editor.hidden) {\n        this.editor.hide();\n      }\n    }\n\n    /**\n     * Refresh comment editor position and styling.\n     *\n     * @param {Boolean} [force=false] If `true` then recalculation will be forced.\n     */\n\n  }, {\n    key: 'refreshEditor',\n    value: function refreshEditor() {\n      var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (!force && (!this.range.from || !this.editor.isVisible())) {\n        return;\n      }\n      var scrollableElement = (0, _element.getScrollableElement)(this.hot.view.wt.wtTable.TABLE);\n      var TD = this.hot.view.wt.wtTable.getCell(this.range.from);\n      var row = this.range.from.row;\n      var column = this.range.from.col;\n      var cellOffset = (0, _element.offset)(TD);\n      var lastColWidth = this.hot.view.wt.wtTable.getStretchedColumnWidth(column);\n      var cellTopOffset = cellOffset.top < 0 ? 0 : cellOffset.top;\n      var cellLeftOffset = cellOffset.left;\n\n      if (this.hot.view.wt.wtViewport.hasVerticalScroll() && scrollableElement !== window) {\n        cellTopOffset -= this.hot.view.wt.wtOverlays.topOverlay.getScrollPosition();\n      }\n\n      if (this.hot.view.wt.wtViewport.hasHorizontalScroll() && scrollableElement !== window) {\n        cellLeftOffset -= this.hot.view.wt.wtOverlays.leftOverlay.getScrollPosition();\n      }\n\n      var x = cellLeftOffset + lastColWidth;\n      var y = cellTopOffset;\n\n      var commentStyle = this.getCommentMeta(row, column, META_STYLE);\n      var readOnly = this.getCommentMeta(row, column, META_READONLY);\n\n      if (commentStyle) {\n        this.editor.setSize(commentStyle.width, commentStyle.height);\n      } else {\n        this.editor.resetSize();\n      }\n\n      this.editor.setReadOnlyState(readOnly);\n\n      this.editor.setPosition(x, y);\n    }\n\n    /**\n     * Check if there is a comment for selected range.\n     *\n     * @private\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'checkSelectionCommentsConsistency',\n    value: function checkSelectionCommentsConsistency() {\n      var selected = this.hot.getSelectedRangeLast();\n\n      if (!selected) {\n        return false;\n      }\n      var hasComment = false;\n      var cell = selected.from; // IN EXCEL THERE IS COMMENT ONLY FOR TOP LEFT CELL IN SELECTION\n\n      if (this.getCommentMeta(cell.row, cell.col, META_COMMENT_VALUE)) {\n        hasComment = true;\n      }\n\n      return hasComment;\n    }\n\n    /**\n     * Set or update the comment-related cell meta.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} column Visual column index.\n     * @param {Object} metaObject Object defining all the comment-related meta information.\n     */\n\n  }, {\n    key: 'updateCommentMeta',\n    value: function updateCommentMeta(row, column, metaObject) {\n      var oldComment = this.hot.getCellMeta(row, column)[META_COMMENT];\n      var newComment = void 0;\n\n      if (oldComment) {\n        newComment = (0, _object.deepClone)(oldComment);\n        (0, _object.deepExtend)(newComment, metaObject);\n      } else {\n        newComment = metaObject;\n      }\n\n      this.hot.setCellMeta(row, column, META_COMMENT, newComment);\n    }\n\n    /**\n     * Get the comment related meta information.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} column Visual column index.\n     * @param {String} property Cell meta property.\n     * @returns {Mixed}\n     */\n\n  }, {\n    key: 'getCommentMeta',\n    value: function getCommentMeta(row, column, property) {\n      var cellMeta = this.hot.getCellMeta(row, column);\n\n      if (!cellMeta[META_COMMENT]) {\n        return void 0;\n      }\n\n      return cellMeta[META_COMMENT][property];\n    }\n\n    /**\n     * `mousedown` event callback.\n     *\n     * @private\n     * @param {MouseEvent} event The `mousedown` event.\n     */\n\n  }, {\n    key: 'onMouseDown',\n    value: function onMouseDown(event) {\n      this.mouseDown = true;\n\n      if (!this.hot.view || !this.hot.view.wt) {\n        return;\n      }\n\n      if (!this.contextMenuEvent && !this.targetIsCommentTextArea(event)) {\n        var eventCell = (0, _element.closest)(event.target, 'TD', 'TBODY');\n        var coordinates = null;\n\n        if (eventCell) {\n          coordinates = this.hot.view.wt.wtTable.getCoords(eventCell);\n        }\n\n        if (!eventCell || this.range.from && coordinates && (this.range.from.row !== coordinates.row || this.range.from.col !== coordinates.col)) {\n          this.hide();\n        }\n      }\n      this.contextMenuEvent = false;\n    }\n\n    /**\n     * `mouseover` event callback.\n     *\n     * @private\n     * @param {MouseEvent} event The `mouseover` event.\n     */\n\n  }, {\n    key: 'onMouseOver',\n    value: function onMouseOver(event) {\n      var priv = privatePool.get(this);\n\n      priv.cellBelowCursor = document.elementFromPoint(event.clientX, event.clientY);\n\n      if (this.mouseDown || this.editor.isFocused() || (0, _element.hasClass)(event.target, 'wtBorder') || priv.cellBelowCursor !== event.target || !this.editor) {\n        return;\n      }\n\n      if (this.targetIsCellWithComment(event)) {\n        var coordinates = this.hot.view.wt.wtTable.getCoords(event.target);\n        var range = {\n          from: new _src.CellCoords(coordinates.row, coordinates.col)\n        };\n\n        this.displaySwitch.show(range);\n      } else if ((0, _element.isChildOf)(event.target, document) && !this.targetIsCommentTextArea(event)) {\n        this.displaySwitch.hide();\n      }\n    }\n\n    /**\n     * `mouseup` event callback.\n     *\n     * @private\n     * @param {MouseEvent} event The `mouseup` event.\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp(event) {\n      this.mouseDown = false;\n    }\n\n    /** *\n     * The `afterRenderer` hook callback..\n     *\n     * @private\n     * @param {HTMLTableCellElement} TD The rendered `TD` element.\n     * @param {Object} cellProperties The rendered cell's property object.\n     */\n\n  }, {\n    key: 'onAfterRenderer',\n    value: function onAfterRenderer(TD, cellProperties) {\n      if (cellProperties[META_COMMENT] && cellProperties[META_COMMENT][META_COMMENT_VALUE]) {\n        (0, _element.addClass)(TD, cellProperties.commentedCellClassName);\n      }\n    }\n\n    /**\n     * `blur` event callback for the comment editor.\n     *\n     * @private\n     * @param {Event} event The `blur` event.\n     */\n\n  }, {\n    key: 'onEditorBlur',\n    value: function onEditorBlur(event) {\n      this.setComment();\n    }\n\n    /**\n     * `mousedown` hook. Along with `onEditorMouseUp` used to simulate the textarea resizing event.\n     *\n     * @private\n     * @param {MouseEvent} event The `mousedown` event.\n     */\n\n  }, {\n    key: 'onEditorMouseDown',\n    value: function onEditorMouseDown(event) {\n      var priv = privatePool.get(this);\n\n      priv.tempEditorDimensions = {\n        width: (0, _element.outerWidth)(event.target),\n        height: (0, _element.outerHeight)(event.target)\n      };\n    }\n\n    /**\n     * `mouseup` hook. Along with `onEditorMouseDown` used to simulate the textarea resizing event.\n     *\n     * @private\n     * @param {MouseEvent} event The `mouseup` event.\n     */\n\n  }, {\n    key: 'onEditorMouseUp',\n    value: function onEditorMouseUp(event) {\n      var priv = privatePool.get(this);\n      var currentWidth = (0, _element.outerWidth)(event.target);\n      var currentHeight = (0, _element.outerHeight)(event.target);\n\n      if (currentWidth !== priv.tempEditorDimensions.width + 1 || currentHeight !== priv.tempEditorDimensions.height + 2) {\n        this.updateCommentMeta(this.range.from.row, this.range.from.col, _defineProperty({}, META_STYLE, {\n          width: currentWidth,\n          height: currentHeight\n        }));\n      }\n    }\n\n    /**\n     * Context Menu's \"Add comment\" callback. Results in showing the comment editor.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onContextMenuAddComment',\n    value: function onContextMenuAddComment() {\n      var _this4 = this;\n\n      this.displaySwitch.cancelHiding();\n      var coords = this.hot.getSelectedRangeLast();\n\n      this.contextMenuEvent = true;\n      this.setRange({\n        from: coords.from\n      });\n      this.show();\n      setTimeout(function () {\n        if (_this4.hot) {\n          _this4.hot.deselectCell();\n          _this4.editor.focus();\n        }\n      }, 10);\n    }\n\n    /**\n     * Context Menu's \"remove comment\" callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onContextMenuRemoveComment',\n    value: function onContextMenuRemoveComment() {\n      this.contextMenuEvent = true;\n\n      var _hot$getSelectedRange = this.hot.getSelectedRangeLast(),\n          from = _hot$getSelectedRange.from,\n          to = _hot$getSelectedRange.to;\n\n      for (var i = from.row; i <= to.row; i++) {\n        for (var j = from.col; j <= to.col; j++) {\n          this.removeCommentAtCell(i, j, false);\n        }\n      }\n\n      this.hot.render();\n    }\n\n    /**\n     * Context Menu's \"make comment read-only\" callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onContextMenuMakeReadOnly',\n    value: function onContextMenuMakeReadOnly() {\n      this.contextMenuEvent = true;\n\n      var _hot$getSelectedRange2 = this.hot.getSelectedRangeLast(),\n          from = _hot$getSelectedRange2.from,\n          to = _hot$getSelectedRange2.to;\n\n      for (var i = from.row; i <= to.row; i++) {\n        for (var j = from.col; j <= to.col; j++) {\n          var currentState = !!this.getCommentMeta(i, j, META_READONLY);\n\n          this.updateCommentMeta(i, j, _defineProperty({}, META_READONLY, !currentState));\n        }\n      }\n    }\n\n    /**\n     * Add Comments plugin options to the Context Menu.\n     *\n     * @private\n     * @param {Object} defaultOptions\n     */\n\n  }, {\n    key: 'addToContextMenu',\n    value: function addToContextMenu(defaultOptions) {\n      var _this5 = this;\n\n      defaultOptions.items.push({\n        name: '---------'\n      }, {\n        key: 'commentsAddEdit',\n        name: function name() {\n          if (_this5.checkSelectionCommentsConsistency()) {\n            return _this5.hot.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_EDIT_COMMENT);\n          }\n\n          return _this5.hot.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ADD_COMMENT);\n        },\n        callback: function callback() {\n          return _this5.onContextMenuAddComment();\n        },\n        disabled: function disabled() {\n          return !(this.getSelectedLast() && !this.selection.isSelectedByCorner());\n        }\n      }, {\n        key: 'commentsRemove',\n        name: function name() {\n          return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_COMMENT);\n        },\n\n        callback: function callback() {\n          return _this5.onContextMenuRemoveComment();\n        },\n        disabled: function disabled() {\n          return _this5.hot.selection.isSelectedByCorner();\n        }\n      }, {\n        key: 'commentsReadOnly',\n        name: function name() {\n          var _this6 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT);\n          var hasProperty = (0, _utils.checkSelectionConsistency)(this.getSelectedRangeLast(), function (row, col) {\n            var readOnlyProperty = _this6.getCellMeta(row, col)[META_COMMENT];\n            if (readOnlyProperty) {\n              readOnlyProperty = readOnlyProperty[META_READONLY];\n            }\n\n            if (readOnlyProperty) {\n              return true;\n            }\n          });\n\n          if (hasProperty) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n\n        callback: function callback() {\n          return _this5.onContextMenuMakeReadOnly();\n        },\n        disabled: function disabled() {\n          return _this5.hot.selection.isSelectedByCorner() || !_this5.checkSelectionCommentsConsistency();\n        }\n      });\n    }\n\n    /**\n     * Get `displayDelay` setting of comment plugin.\n     *\n     * @returns {Number|undefined}\n     */\n\n  }, {\n    key: 'getDisplayDelaySetting',\n    value: function getDisplayDelaySetting() {\n      var commentSetting = this.hot.getSettings().comments;\n\n      if ((0, _object.isObject)(commentSetting)) {\n        return commentSetting.displayDelay;\n      }\n\n      return void 0;\n    }\n\n    /**\n     * `afterBeginEditing` hook callback.\n     *\n     * @private\n     * @param {Number} row Visual row index of the currently edited cell.\n     * @param {Number} column Visual column index of the currently edited cell.\n     */\n\n  }, {\n    key: 'onAfterBeginEditing',\n    value: function onAfterBeginEditing(row, column) {\n      this.hide();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.editor) {\n        this.editor.destroy();\n      }\n\n      if (this.displaySwitch) {\n        this.displaySwitch.destroy();\n      }\n\n      _get(Comments.prototype.__proto__ || Object.getPrototypeOf(Comments.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return Comments;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('comments', Comments);\n\nexports.default = Comments;\n\n/***/ }),\n/* 416 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Comment editor for the Comments plugin.\n *\n * @class CommentEditor\n * @plugin Comments\n */\nvar CommentEditor = function () {\n  _createClass(CommentEditor, null, [{\n    key: 'CLASS_EDITOR_CONTAINER',\n    get: function get() {\n      return 'htCommentsContainer';\n    }\n  }, {\n    key: 'CLASS_EDITOR',\n    get: function get() {\n      return 'htComments';\n    }\n  }, {\n    key: 'CLASS_INPUT',\n    get: function get() {\n      return 'htCommentTextArea';\n    }\n  }, {\n    key: 'CLASS_CELL',\n    get: function get() {\n      return 'htCommentCell';\n    }\n  }]);\n\n  function CommentEditor() {\n    _classCallCheck(this, CommentEditor);\n\n    this.editor = this.createEditor();\n    this.editorStyle = this.editor.style;\n\n    this.hidden = true;\n\n    this.hide();\n  }\n\n  /**\n   * Set position of the comments editor according to the  provided x and y coordinates.\n   *\n   * @param {Number} x X position (in pixels).\n   * @param {Number} y Y position (in pixels).\n   */\n\n\n  _createClass(CommentEditor, [{\n    key: 'setPosition',\n    value: function setPosition(x, y) {\n      this.editorStyle.left = x + 'px';\n      this.editorStyle.top = y + 'px';\n    }\n\n    /**\n     * Set the editor size according to the provided arguments.\n     *\n     * @param {Number} width Width in pixels.\n     * @param {Number} height Height in pixels.\n     */\n\n  }, {\n    key: 'setSize',\n    value: function setSize(width, height) {\n      if (width && height) {\n        var input = this.getInputElement();\n\n        input.style.width = width + 'px';\n        input.style.height = height + 'px';\n      }\n    }\n\n    /**\n     * Reset the editor size to its initial state.\n     */\n\n  }, {\n    key: 'resetSize',\n    value: function resetSize() {\n      var input = this.getInputElement();\n\n      input.style.width = '';\n      input.style.height = '';\n    }\n\n    /**\n     * Set the read-only state for the comments editor.\n     *\n     * @param {Boolean} state The new read only state.\n     */\n\n  }, {\n    key: 'setReadOnlyState',\n    value: function setReadOnlyState(state) {\n      var input = this.getInputElement();\n\n      input.readOnly = state;\n    }\n\n    /**\n     * Show the comments editor.\n     */\n\n  }, {\n    key: 'show',\n    value: function show() {\n      this.editorStyle.display = 'block';\n      this.hidden = false;\n    }\n\n    /**\n     * Hide the comments editor.\n     */\n\n  }, {\n    key: 'hide',\n    value: function hide() {\n      this.editorStyle.display = 'none';\n      this.hidden = true;\n    }\n\n    /**\n     * Checks if the editor is visible.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isVisible',\n    value: function isVisible() {\n      return this.editorStyle.display === 'block';\n    }\n\n    /**\n     * Set the comment value.\n     *\n     * @param {String} [value] The value to use.\n     */\n\n  }, {\n    key: 'setValue',\n    value: function setValue() {\n      var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      value = value || '';\n      this.getInputElement().value = value;\n    }\n\n    /**\n     * Get the comment value.\n     *\n     * @returns {String}\n     */\n\n  }, {\n    key: 'getValue',\n    value: function getValue() {\n      return this.getInputElement().value;\n    }\n\n    /**\n     * Checks if the comment input element is focused.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isFocused',\n    value: function isFocused() {\n      return document.activeElement === this.getInputElement();\n    }\n\n    /**\n     * Focus the comments input element.\n     */\n\n  }, {\n    key: 'focus',\n    value: function focus() {\n      this.getInputElement().focus();\n    }\n\n    /**\n     * Create the `textarea` to be used as a comments editor.\n     *\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createEditor',\n    value: function createEditor() {\n      var container = document.querySelector('.' + CommentEditor.CLASS_EDITOR_CONTAINER);\n      var editor = void 0;\n      var textArea = void 0;\n\n      if (!container) {\n        container = document.createElement('div');\n        (0, _element.addClass)(container, CommentEditor.CLASS_EDITOR_CONTAINER);\n        document.body.appendChild(container);\n      }\n      editor = document.createElement('div');\n      (0, _element.addClass)(editor, CommentEditor.CLASS_EDITOR);\n\n      textArea = document.createElement('textarea');\n      (0, _element.addClass)(textArea, CommentEditor.CLASS_INPUT);\n\n      editor.appendChild(textArea);\n      container.appendChild(editor);\n\n      return editor;\n    }\n\n    /**\n     * Get the input element.\n     *\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'getInputElement',\n    value: function getInputElement() {\n      return this.editor.querySelector('.' + CommentEditor.CLASS_INPUT);\n    }\n\n    /**\n     * Destroy the comments editor.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.editor.parentNode.removeChild(this.editor);\n      this.editor = null;\n      this.editorStyle = null;\n    }\n  }]);\n\n  return CommentEditor;\n}();\n\nexports.default = CommentEditor;\n\n/***/ }),\n/* 417 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _function = __webpack_require__(43);\n\nvar _object = __webpack_require__(2);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DEFAULT_DISPLAY_DELAY = 250;\nvar DEFAULT_HIDE_DELAY = 250;\n\n/**\n * Display switch for the Comments plugin. Manages the time of delayed displaying / hiding comments.\n *\n * @class DisplaySwitch\n * @plugin Comments\n */\n\nvar DisplaySwitch = function () {\n  function DisplaySwitch(displayDelay) {\n    _classCallCheck(this, DisplaySwitch);\n\n    /**\n     * Flag to determine if comment can be showed or hidden. State `true` mean that last performed action\n     * was an attempt to show comment element. State `false` mean that it was attempt to hide comment element.\n     *\n     * @type {Boolean}\n     */\n    this.wasLastActionShow = true;\n    /**\n     * Show comment after predefined delay. It keeps reference to immutable `debounce` function.\n     *\n     * @type {Function}\n     */\n    this.showDebounced = null;\n    /**\n     * Reference to timer, run by `setTimeout`, which is hiding comment\n     *\n     * @type {Number}\n     */\n    this.hidingTimer = null;\n\n    this.updateDelay(displayDelay);\n  }\n\n  /**\n   * Responsible for hiding comment after proper delay.\n   */\n\n\n  _createClass(DisplaySwitch, [{\n    key: 'hide',\n    value: function hide() {\n      var _this = this;\n\n      this.wasLastActionShow = false;\n\n      this.hidingTimer = setTimeout(function () {\n        if (_this.wasLastActionShow === false) {\n          _this.runLocalHooks('hide');\n        }\n      }, DEFAULT_HIDE_DELAY);\n    }\n\n    /**\n     * Responsible for showing comment after proper delay.\n     *\n     * @param {Object} range Coordinates of selected cell.\n     */\n\n  }, {\n    key: 'show',\n    value: function show(range) {\n      this.wasLastActionShow = true;\n      this.showDebounced(range);\n    }\n  }, {\n    key: 'cancelHiding',\n\n\n    /**\n     * Cancel hiding comment.\n     */\n    value: function cancelHiding() {\n      this.wasLastActionShow = true;\n\n      clearTimeout(this.hidingTimer);\n      this.hidingTimer = null;\n    }\n\n    /**\n     * Update the switch settings.\n     *\n     * @param {Number} displayDelay Delay of showing the comments (in milliseconds).\n     */\n\n  }, {\n    key: 'updateDelay',\n    value: function updateDelay() {\n      var _this2 = this;\n\n      var displayDelay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_DISPLAY_DELAY;\n\n      this.showDebounced = (0, _function.debounce)(function (range) {\n        if (_this2.wasLastActionShow) {\n          _this2.runLocalHooks('show', range.from.row, range.from.col);\n        }\n      }, displayDelay);\n    }\n\n    /**\n     * Destroy the switcher.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.clearLocalHooks();\n    }\n  }]);\n\n  return DisplaySwitch;\n}();\n\n(0, _object.mixin)(DisplaySwitch, _localHooks2.default);\n\nexports.default = DisplaySwitch;\n\n/***/ }),\n/* 418 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 419 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _commandExecutor = __webpack_require__(420);\n\nvar _commandExecutor2 = _interopRequireDefault(_commandExecutor);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _itemsFactory = __webpack_require__(421);\n\nvar _itemsFactory2 = _interopRequireDefault(_itemsFactory);\n\nvar _menu = __webpack_require__(433);\n\nvar _menu2 = _interopRequireDefault(_menu);\n\nvar _plugins = __webpack_require__(8);\n\nvar _event = __webpack_require__(12);\n\nvar _element = __webpack_require__(0);\n\nvar _predefinedItems = __webpack_require__(94);\n\n__webpack_require__(435);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('afterContextMenuDefaultOptions');\n_pluginHooks2.default.getSingleton().register('beforeContextMenuShow');\n_pluginHooks2.default.getSingleton().register('afterContextMenuShow');\n_pluginHooks2.default.getSingleton().register('afterContextMenuHide');\n_pluginHooks2.default.getSingleton().register('afterContextMenuExecute');\n\n/**\n * @description\n * This plugin creates the Handsontable Context Menu. It allows to create a new row or\n * column at any place in the grid among [other features](http://docs.handsontable.com/demo-context-menu.html).\n * Possible values:\n * * `true` (to enable default options),\n * * `false` (to disable completely)\n *\n * or array of any available strings:\n * * `[\"row_above\", \"row_below\", \"col_left\", \"col_right\",\n * \"remove_row\", \"remove_col\", \"---------\", \"undo\", \"redo\"]`.\n *\n * See [the context menu demo](http://docs.handsontable.com/demo-context-menu.html) for examples.\n *\n * @example\n * ```js\n * ...\n * // as a boolean\n * contextMenu: true\n * ...\n * // as a array\n * contextMenu: ['row_above', 'row_below', '---------', 'undo', 'redo']\n * ...\n * ```\n *\n * @plugin ContextMenu\n */\n\nvar ContextMenu = function (_BasePlugin) {\n  _inherits(ContextMenu, _BasePlugin);\n\n  _createClass(ContextMenu, null, [{\n    key: 'DEFAULT_ITEMS',\n\n    /**\n     * Default menu items order when `contextMenu` is enabled by `true`.\n     *\n     * @returns {Array}\n     */\n    get: function get() {\n      return [_predefinedItems.ROW_ABOVE, _predefinedItems.ROW_BELOW, _predefinedItems.SEPARATOR, _predefinedItems.COLUMN_LEFT, _predefinedItems.COLUMN_RIGHT, _predefinedItems.SEPARATOR, _predefinedItems.REMOVE_ROW, _predefinedItems.REMOVE_COLUMN, _predefinedItems.SEPARATOR, _predefinedItems.UNDO, _predefinedItems.REDO, _predefinedItems.SEPARATOR, _predefinedItems.READ_ONLY, _predefinedItems.SEPARATOR, _predefinedItems.ALIGNMENT];\n    }\n  }]);\n\n  function ContextMenu(hotInstance) {\n    _classCallCheck(this, ContextMenu);\n\n    /**\n     * Instance of {@link EventManager}.\n     *\n     * @type {EventManager}\n     */\n    var _this = _possibleConstructorReturn(this, (ContextMenu.__proto__ || Object.getPrototypeOf(ContextMenu)).call(this, hotInstance));\n\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Instance of {@link CommandExecutor}.\n     *\n     * @type {CommandExecutor}\n     */\n    _this.commandExecutor = new _commandExecutor2.default(_this.hot);\n    /**\n     * Instance of {@link ItemsFactory}.\n     *\n     * @type {ItemsFactory}\n     */\n    _this.itemsFactory = null;\n    /**\n     * Instance of {@link Menu}.\n     *\n     * @type {Menu}\n     */\n    _this.menu = null;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ContextMenu, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().contextMenu;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n      this.itemsFactory = new _itemsFactory2.default(this.hot, ContextMenu.DEFAULT_ITEMS);\n\n      var settings = this.hot.getSettings().contextMenu;\n      var predefinedItems = {\n        items: this.itemsFactory.getItems(settings)\n      };\n      this.registerEvents();\n\n      if (typeof settings.callback === 'function') {\n        this.commandExecutor.setCommonCallback(settings.callback);\n      }\n      _get(ContextMenu.prototype.__proto__ || Object.getPrototypeOf(ContextMenu.prototype), 'enablePlugin', this).call(this);\n\n      var delayedInitialization = function delayedInitialization() {\n        if (!_this2.hot) {\n          return;\n        }\n\n        _this2.hot.runHooks('afterContextMenuDefaultOptions', predefinedItems);\n\n        _this2.itemsFactory.setPredefinedItems(predefinedItems.items);\n        var menuItems = _this2.itemsFactory.getItems(settings);\n\n        _this2.menu = new _menu2.default(_this2.hot, {\n          className: 'htContextMenu',\n          keepInViewport: true\n        });\n        _this2.hot.runHooks('beforeContextMenuSetItems', menuItems);\n\n        _this2.menu.setMenuItems(menuItems);\n\n        _this2.menu.addLocalHook('beforeOpen', function () {\n          return _this2.onMenuBeforeOpen();\n        });\n        _this2.menu.addLocalHook('afterOpen', function () {\n          return _this2.onMenuAfterOpen();\n        });\n        _this2.menu.addLocalHook('afterClose', function () {\n          return _this2.onMenuAfterClose();\n        });\n        _this2.menu.addLocalHook('executeCommand', function () {\n          for (var _len = arguments.length, params = Array(_len), _key = 0; _key < _len; _key++) {\n            params[_key] = arguments[_key];\n          }\n\n          return _this2.executeCommand.apply(_this2, params);\n        });\n\n        // Register all commands. Predefined and added by user or by plugins\n        (0, _array.arrayEach)(menuItems, function (command) {\n          return _this2.commandExecutor.registerCommand(command.key, command);\n        });\n      };\n\n      this.callOnPluginsReady(function () {\n        if (_this2.isPluginsReady) {\n          setTimeout(delayedInitialization, 0);\n        } else {\n          delayedInitialization();\n        }\n      });\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(ContextMenu.prototype.__proto__ || Object.getPrototypeOf(ContextMenu.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.close();\n\n      if (this.menu) {\n        this.menu.destroy();\n        this.menu = null;\n      }\n      _get(ContextMenu.prototype.__proto__ || Object.getPrototypeOf(ContextMenu.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Register dom listeners.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this3 = this;\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'contextmenu', function (event) {\n        return _this3.onContextMenu(event);\n      });\n    }\n\n    /**\n     * Open menu and re-position it based on dom event object.\n     *\n     * @param {Event} event The event object.\n     */\n\n  }, {\n    key: 'open',\n    value: function open(event) {\n      if (!this.menu) {\n        return;\n      }\n      this.menu.open();\n      this.menu.setPosition({\n        top: parseInt((0, _event.pageY)(event), 10) - (0, _element.getWindowScrollTop)(),\n        left: parseInt((0, _event.pageX)(event), 10) - (0, _element.getWindowScrollLeft)()\n      });\n\n      // ContextMenu is not detected HotTableEnv correctly because is injected outside hot-table\n      this.menu.hotMenu.isHotTableEnv = this.hot.isHotTableEnv;\n      // Handsontable.eventManager.isHotTableEnv = this.hot.isHotTableEnv;\n    }\n\n    /**\n     * Close menu.\n     */\n\n  }, {\n    key: 'close',\n    value: function close() {\n      if (!this.menu) {\n        return;\n      }\n      this.menu.close();\n    }\n\n    /**\n     * Execute context menu command.\n     *\n     * You can execute all predefined commands:\n     *  * `'row_above'` - Insert row above\n     *  * `'row_below'` - Insert row below\n     *  * `'col_left'` - Insert column left\n     *  * `'col_right'` - Insert column right\n     *  * `'clear_column'` - Clear selected column\n     *  * `'remove_row'` - Remove row\n     *  * `'remove_col'` - Remove column\n     *  * `'undo'` - Undo last action\n     *  * `'redo'` - Redo last action\n     *  * `'make_read_only'` - Make cell read only\n     *  * `'alignment:left'` - Alignment to the left\n     *  * `'alignment:top'` - Alignment to the top\n     *  * `'alignment:right'` - Alignment to the right\n     *  * `'alignment:bottom'` - Alignment to the bottom\n     *  * `'alignment:middle'` - Alignment to the middle\n     *  * `'alignment:center'` - Alignment to the center (justify)\n     *\n     * Or you can execute command registered in settings where `key` is your command name.\n     *\n     * @param {String} commandName\n     * @param {*} params\n     */\n\n  }, {\n    key: 'executeCommand',\n    value: function executeCommand() {\n      for (var _len2 = arguments.length, params = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        params[_key2] = arguments[_key2];\n      }\n\n      this.commandExecutor.execute.apply(this.commandExecutor, params);\n    }\n\n    /**\n     * On context menu listener.\n     *\n     * @private\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onContextMenu',\n    value: function onContextMenu(event) {\n      var settings = this.hot.getSettings();\n      var showRowHeaders = settings.rowHeaders;\n      var showColHeaders = settings.colHeaders;\n\n      function isValidElement(element) {\n        return element.nodeName === 'TD' || element.parentNode.nodeName === 'TD';\n      }\n      // if event is from hot-table we must get web component element not element inside him\n      var element = event.realTarget;\n      this.close();\n\n      if ((0, _element.hasClass)(element, 'handsontableInput')) {\n        return;\n      }\n\n      event.preventDefault();\n      (0, _event.stopPropagation)(event);\n\n      if (!(showRowHeaders || showColHeaders)) {\n        if (!isValidElement(element) && !((0, _element.hasClass)(element, 'current') && (0, _element.hasClass)(element, 'wtBorder'))) {\n          return;\n        }\n      }\n\n      this.open(event);\n    }\n\n    /**\n     * On menu before open listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMenuBeforeOpen',\n    value: function onMenuBeforeOpen() {\n      this.hot.runHooks('beforeContextMenuShow', this);\n    }\n\n    /**\n     * On menu after open listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMenuAfterOpen',\n    value: function onMenuAfterOpen() {\n      this.hot.runHooks('afterContextMenuShow', this);\n    }\n\n    /**\n     * On menu after close listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMenuAfterClose',\n    value: function onMenuAfterClose() {\n      this.hot.listen();\n      this.hot.runHooks('afterContextMenuHide', this);\n    }\n\n    /**\n     * Destroy instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.close();\n\n      if (this.menu) {\n        this.menu.destroy();\n      }\n      _get(ContextMenu.prototype.__proto__ || Object.getPrototypeOf(ContextMenu.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return ContextMenu;\n}(_base2.default);\n\nContextMenu.SEPARATOR = {\n  name: _predefinedItems.SEPARATOR\n};\n\n(0, _plugins.registerPlugin)('contextMenu', ContextMenu);\n\nexports.default = ContextMenu;\n\n/***/ }),\n/* 420 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Command executor for ContextMenu.\n *\n * @class CommandExecutor\n * @plugin ContextMenu\n */\nvar CommandExecutor = function () {\n  function CommandExecutor(hotInstance) {\n    _classCallCheck(this, CommandExecutor);\n\n    this.hot = hotInstance;\n    this.commands = {};\n    this.commonCallback = null;\n  }\n\n  /**\n   * Register command.\n   *\n   * @param {String} name Command name.\n   * @param {Object} commandDescriptor Command descriptor object with properties like `key` (command id),\n   *                                   `callback` (task to execute), `name` (command name), `disabled` (command availability).\n   */\n\n\n  _createClass(CommandExecutor, [{\n    key: 'registerCommand',\n    value: function registerCommand(name, commandDescriptor) {\n      this.commands[name] = commandDescriptor;\n    }\n\n    /**\n     * Set common callback which will be trigger on every executed command.\n     *\n     * @param {Function} callback Function which will be fired on every command execute.\n     */\n\n  }, {\n    key: 'setCommonCallback',\n    value: function setCommonCallback(callback) {\n      this.commonCallback = callback;\n    }\n\n    /**\n     * Execute command by its name.\n     *\n     * @param {String} commandName Command id.\n     * @param {*} params Arguments passed to command task.\n     */\n\n  }, {\n    key: 'execute',\n    value: function execute(commandName) {\n      var _this = this;\n\n      for (var _len = arguments.length, params = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        params[_key - 1] = arguments[_key];\n      }\n\n      var commandSplit = commandName.split(':');\n      commandName = commandSplit[0];\n\n      var subCommandName = commandSplit.length === 2 ? commandSplit[1] : null;\n      var command = this.commands[commandName];\n\n      if (!command) {\n        throw new Error('Menu command \\'' + commandName + '\\' not exists.');\n      }\n      if (subCommandName && command.submenu) {\n        command = findSubCommand(subCommandName, command.submenu.items);\n      }\n      if (command.disabled === true) {\n        return;\n      }\n      if (typeof command.disabled == 'function' && command.disabled.call(this.hot) === true) {\n        return;\n      }\n      if ((0, _object.hasOwnProperty)(command, 'submenu')) {\n        return;\n      }\n      var callbacks = [];\n\n      if (typeof command.callback === 'function') {\n        callbacks.push(command.callback);\n      }\n      if (typeof this.commonCallback === 'function') {\n        callbacks.push(this.commonCallback);\n      }\n      params.unshift(commandSplit.join(':'));\n      (0, _array.arrayEach)(callbacks, function (callback) {\n        return callback.apply(_this.hot, params);\n      });\n    }\n  }]);\n\n  return CommandExecutor;\n}();\n\nfunction findSubCommand(subCommandName, subCommands) {\n  var command = void 0;\n\n  (0, _array.arrayEach)(subCommands, function (cmd) {\n    var cmds = cmd.key ? cmd.key.split(':') : null;\n\n    if (Array.isArray(cmds) && cmds[1] === subCommandName) {\n      command = cmd;\n\n      return false;\n    }\n  });\n\n  return command;\n}\n\nexports.default = CommandExecutor;\n\n/***/ }),\n/* 421 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _predefinedItems = __webpack_require__(94);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Predefined items class factory for menu items.\n *\n * @class ItemsFactory\n * @plugin ContextMenu\n */\nvar ItemsFactory = function () {\n  function ItemsFactory(hotInstance) {\n    var orderPattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n    _classCallCheck(this, ItemsFactory);\n\n    this.hot = hotInstance;\n    this.predefinedItems = (0, _predefinedItems.predefinedItems)();\n    this.defaultOrderPattern = orderPattern;\n  }\n\n  /**\n   * Set predefined items.\n   *\n   * @param {Array} predefinedItems Array of predefined items.\n   */\n\n\n  _createClass(ItemsFactory, [{\n    key: 'setPredefinedItems',\n    value: function setPredefinedItems(predefinedItems) {\n      var _this = this;\n\n      var items = {};\n\n      this.defaultOrderPattern.length = 0;\n\n      (0, _object.objectEach)(predefinedItems, function (value, key) {\n        var menuItemKey = '';\n\n        if (value.name === _predefinedItems.SEPARATOR) {\n          items[_predefinedItems.SEPARATOR] = value;\n          menuItemKey = _predefinedItems.SEPARATOR;\n\n          // Menu item added as a property to array\n        } else if (isNaN(parseInt(key, 10))) {\n          value.key = value.key === void 0 ? key : value.key;\n          items[key] = value;\n          menuItemKey = value.key;\n        } else {\n          items[value.key] = value;\n          menuItemKey = value.key;\n        }\n        _this.defaultOrderPattern.push(menuItemKey);\n      });\n      this.predefinedItems = items;\n    }\n\n    /**\n     * Get all menu items based on pattern.\n     *\n     * @param {Array|Object|Boolean} pattern Pattern which you can define by displaying menu items order. If `true` default\n     *                                       pattern will be used.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getItems',\n    value: function getItems() {\n      var pattern = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      return _getItems(pattern, this.defaultOrderPattern, this.predefinedItems);\n    }\n  }]);\n\n  return ItemsFactory;\n}();\n\nfunction _getItems() {\n  var pattern = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n  var defaultPattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n  var items = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n  var result = [];\n\n  if (pattern && pattern.items) {\n    pattern = pattern.items;\n  } else if (!Array.isArray(pattern)) {\n    pattern = defaultPattern;\n  }\n  if ((0, _object.isObject)(pattern)) {\n    (0, _object.objectEach)(pattern, function (value, key) {\n      var item = items[typeof value === 'string' ? value : key];\n\n      if (!item) {\n        item = value;\n      }\n      if ((0, _object.isObject)(value)) {\n        (0, _object.extend)(item, value);\n      } else if (typeof item === 'string') {\n        item = { name: item };\n      }\n      if (item.key === void 0) {\n        item.key = key;\n      }\n      result.push(item);\n    });\n  } else {\n    (0, _array.arrayEach)(pattern, function (name, key) {\n      var item = items[name];\n\n      // Item deleted from settings `allowInsertRow: false` etc.\n      if (!item && _predefinedItems.ITEMS.indexOf(name) >= 0) {\n        return;\n      }\n      if (!item) {\n        item = { name: name, key: '' + key };\n      }\n      if ((0, _object.isObject)(name)) {\n        (0, _object.extend)(item, name);\n      }\n      if (item.key === void 0) {\n        item.key = key;\n      }\n      result.push(item);\n    });\n  }\n\n  return result;\n}\n\nexports.default = ItemsFactory;\n\n/***/ }),\n/* 422 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = alignmentItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _separator = __webpack_require__(93);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'alignment';\n\nfunction alignmentItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT);\n    },\n    disabled: function disabled() {\n      return !(this.getSelectedRange() && !this.selection.isSelectedByCorner());\n    },\n\n    submenu: {\n      items: [{\n        key: KEY + ':left',\n        name: function name() {\n          var _this = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htLeft') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this2 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this2.getCellMeta(row, col).className;\n          });\n          var type = 'horizontal';\n          var alignment = 'htLeft';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this2.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this2.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':center',\n        name: function name() {\n          var _this3 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this3.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htCenter') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback(key, selection) {\n          var _this4 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this4.getCellMeta(row, col).className;\n          });\n          var type = 'horizontal';\n          var alignment = 'htCenter';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this4.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this4.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':right',\n        name: function name() {\n          var _this5 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this5.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htRight') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this6 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this6.getCellMeta(row, col).className;\n          });\n          var type = 'horizontal';\n          var alignment = 'htRight';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this6.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this6.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':justify',\n        name: function name() {\n          var _this7 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this7.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htJustify') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this8 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this8.getCellMeta(row, col).className;\n          });\n          var type = 'horizontal';\n          var alignment = 'htJustify';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this8.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this8.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        name: _separator.KEY\n      }, {\n        key: KEY + ':top',\n        name: function name() {\n          var _this9 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this9.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htTop') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n          return label;\n        },\n        callback: function callback() {\n          var _this10 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this10.getCellMeta(row, col).className;\n          });\n          var type = 'vertical';\n          var alignment = 'htTop';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this10.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this10.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':middle',\n        name: function name() {\n          var _this11 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this11.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htMiddle') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this12 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this12.getCellMeta(row, col).className;\n          });\n          var type = 'vertical';\n          var alignment = 'htMiddle';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this12.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this12.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':bottom',\n        name: function name() {\n          var _this13 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this13.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htBottom') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this14 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this14.getCellMeta(row, col).className;\n          });\n          var type = 'vertical';\n          var alignment = 'htBottom';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this14.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this14.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }]\n    }\n  };\n}\n\n/***/ }),\n/* 423 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = clearColumnItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'clear_column';\n\nfunction clearColumnItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_CLEAR_COLUMN);\n    },\n    callback: function callback(key, selection) {\n      var column = selection[0].start.col;\n\n      if (this.countRows()) {\n        this.populateFromArray(0, column, [[null]], Math.max(selection[0].start.row, selection[0].end.row), column, 'ContextMenu.clearColumn');\n      }\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n\n      var _selected$ = _slicedToArray(selected[0], 4),\n          startRow = _selected$[0],\n          startColumn = _selected$[1],\n          endRow = _selected$[2],\n          endColumn = _selected$[3];\n\n      var entireRowSelection = [startRow, 0, endRow, this.countCols() - 1];\n      var rowSelected = entireRowSelection.join(',') === selected.join(',');\n\n      return startColumn < 0 || this.countCols() >= this.getSettings().maxCols || rowSelected;\n    }\n  };\n}\n\n/***/ }),\n/* 424 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = columnLeftItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'col_left';\n\nfunction columnLeftItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_INSERT_LEFT);\n    },\n    callback: function callback(key, normalizedSelection) {\n      var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)];\n\n      this.alter('insert_col', latestSelection.start.col, 1, 'ContextMenu.columnLeft');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n      if (!this.isColumnModificationAllowed()) {\n        return true;\n      }\n\n      var _selected$ = _slicedToArray(selected[0], 4),\n          startRow = _selected$[0],\n          startColumn = _selected$[1],\n          endRow = _selected$[2],\n          endColumn = _selected$[3];\n\n      var entireRowSelection = [startRow, 0, endRow, this.countCols() - 1];\n      var rowSelected = entireRowSelection.join(',') === selected.join(',');\n      var onlyOneColumn = this.countCols() === 1;\n\n      return startColumn < 0 || this.countCols() >= this.getSettings().maxCols || !onlyOneColumn && rowSelected;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowInsertColumn;\n    }\n  };\n}\n\n/***/ }),\n/* 425 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = columnRightItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'col_right';\n\nfunction columnRightItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_INSERT_RIGHT);\n    },\n    callback: function callback(key, normalizedSelection) {\n      var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)];\n\n      this.alter('insert_col', latestSelection.end.col + 1, 1, 'ContextMenu.columnRight');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n      if (!this.isColumnModificationAllowed()) {\n        return true;\n      }\n\n      var _selected$ = _slicedToArray(selected[0], 4),\n          startRow = _selected$[0],\n          startColumn = _selected$[1],\n          endRow = _selected$[2],\n          endColumn = _selected$[3];\n\n      var entireRowSelection = [startRow, 0, endRow, this.countCols() - 1];\n      var rowSelected = entireRowSelection.join(',') === selected.join(',');\n      var onlyOneColumn = this.countCols() === 1;\n\n      return startColumn < 0 || this.countCols() >= this.getSettings().maxCols || !onlyOneColumn && rowSelected;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowInsertColumn;\n    }\n  };\n}\n\n/***/ }),\n/* 426 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = readOnlyItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _array = __webpack_require__(1);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'make_read_only';\n\nfunction readOnlyItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      var _this = this;\n\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_READ_ONLY);\n      var atLeastOneReadOnly = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n        return _this.getCellMeta(row, col).readOnly;\n      });\n\n      if (atLeastOneReadOnly) {\n        label = (0, _utils.markLabelAsSelected)(label);\n      }\n\n      return label;\n    },\n    callback: function callback() {\n      var _this2 = this;\n\n      var ranges = this.getSelectedRange();\n      var atLeastOneReadOnly = (0, _utils.checkSelectionConsistency)(ranges, function (row, col) {\n        return _this2.getCellMeta(row, col).readOnly;\n      });\n\n      (0, _array.arrayEach)(ranges, function (range) {\n        range.forAll(function (row, col) {\n          _this2.setCellMeta(row, col, 'readOnly', !atLeastOneReadOnly);\n        });\n      });\n\n      this.render();\n    },\n    disabled: function disabled() {\n      return !(this.getSelectedRange() && !this.selection.isSelectedByCorner());\n    }\n  };\n}\n\n/***/ }),\n/* 427 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = redoItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'redo';\n\nfunction redoItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REDO);\n    },\n    callback: function callback() {\n      this.redo();\n    },\n    disabled: function disabled() {\n      return this.undoRedo && !this.undoRedo.isRedoAvailable();\n    }\n  };\n}\n\n/***/ }),\n/* 428 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = removeColumnItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _array = __webpack_require__(1);\n\nvar _utils2 = __webpack_require__(91);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'remove_col';\n\nfunction removeColumnItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      var selection = this.getSelected();\n      var pluralForm = 0;\n\n      if (selection) {\n        if (selection.length > 1) {\n          pluralForm = 1;\n        } else {\n          var _selection$ = _slicedToArray(selection[0], 4),\n              fromColumn = _selection$[1],\n              toColumn = _selection$[3];\n\n          if (fromColumn - toColumn !== 0) {\n            pluralForm = 1;\n          }\n        }\n      }\n\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, pluralForm);\n    },\n    callback: function callback() {\n      this.alter('remove_col', (0, _utils2.transformSelectionToColumnDistance)(this.getSelected()), null, 'ContextMenu.removeColumn');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n      var totalColumns = this.countCols();\n\n      if (!selected) {\n        return true;\n      }\n\n      return this.selection.isSelectedByRowHeader() || this.selection.isSelectedByCorner() || !this.isColumnModificationAllowed() || !totalColumns;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowRemoveColumn;\n    }\n  };\n}\n\n/***/ }),\n/* 429 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = removeRowItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _array = __webpack_require__(1);\n\nvar _utils2 = __webpack_require__(91);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'remove_row';\n\nfunction removeRowItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      var selection = this.getSelected();\n      var pluralForm = 0;\n\n      if (selection) {\n        if (selection.length > 1) {\n          pluralForm = 1;\n        } else {\n          var _selection$ = _slicedToArray(selection[0], 3),\n              fromRow = _selection$[0],\n              toRow = _selection$[2];\n\n          if (fromRow - toRow !== 0) {\n            pluralForm = 1;\n          }\n        }\n      }\n\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_ROW, pluralForm);\n    },\n    callback: function callback() {\n      this.alter('remove_row', (0, _utils2.transformSelectionToRowDistance)(this.getSelected()), null, 'ContextMenu.removeRow');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n      var totalRows = this.countRows();\n\n      if (!selected) {\n        return true;\n      }\n\n      return this.selection.isSelectedByColumnHeader() || this.selection.isSelectedByCorner() || !totalRows;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowRemoveRow;\n    }\n  };\n}\n\n/***/ }),\n/* 430 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = rowAboveItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'row_above';\n\nfunction rowAboveItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ROW_ABOVE);\n    },\n    callback: function callback(key, normalizedSelection) {\n      var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)];\n\n      this.alter('insert_row', latestSelection.start.row, 1, 'ContextMenu.rowAbove');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n\n      return this.selection.isSelectedByColumnHeader() || this.countRows() >= this.getSettings().maxRows;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowInsertRow;\n    }\n  };\n}\n\n/***/ }),\n/* 431 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = rowBelowItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'row_below';\n\nfunction rowBelowItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ROW_BELOW);\n    },\n    callback: function callback(key, normalizedSelection) {\n      var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)];\n\n      this.alter('insert_row', latestSelection.end.row + 1, 1, 'ContextMenu.rowBelow');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n\n      return this.selection.isSelectedByColumnHeader() || this.countRows() >= this.getSettings().maxRows;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowInsertRow;\n    }\n  };\n}\n\n/***/ }),\n/* 432 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = undoItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'undo';\n\nfunction undoItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_UNDO);\n    },\n    callback: function callback() {\n      this.undo();\n    },\n    disabled: function disabled() {\n      return this.undoRedo && !this.undoRedo.isUndoAvailable();\n    }\n  };\n}\n\n/***/ }),\n/* 433 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _core = __webpack_require__(88);\n\nvar _core2 = _interopRequireDefault(_core);\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _cursor = __webpack_require__(434);\n\nvar _cursor2 = _interopRequireDefault(_cursor);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _object = __webpack_require__(2);\n\nvar _mixed = __webpack_require__(16);\n\nvar _function = __webpack_require__(43);\n\nvar _utils = __webpack_require__(19);\n\nvar _unicode = __webpack_require__(21);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nvar _predefinedItems = __webpack_require__(94);\n\nvar _event = __webpack_require__(12);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar MIN_WIDTH = 215;\n\n/**\n * @class Menu\n * @plugin ContextMenu\n */\n\nvar Menu = function () {\n  function Menu(hotInstance, options) {\n    _classCallCheck(this, Menu);\n\n    this.hot = hotInstance;\n    this.options = options || {\n      parent: null,\n      name: null,\n      className: '',\n      keepInViewport: true,\n      standalone: false,\n      minWidth: MIN_WIDTH\n    };\n    this.eventManager = new _eventManager2.default(this);\n    this.container = this.createContainer(this.options.name);\n    this.hotMenu = null;\n    this.hotSubMenus = {};\n    this.parentMenu = this.options.parent || null;\n    this.menuItems = null;\n    this.origOutsideClickDeselects = null;\n    this.keyEvent = false;\n\n    this.offset = {\n      above: 0,\n      below: 0,\n      left: 0,\n      right: 0\n    };\n    this._afterScrollCallback = null;\n\n    this.registerEvents();\n  }\n\n  /**\n   * Register event listeners.\n   *\n   * @private\n   */\n\n\n  _createClass(Menu, [{\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this = this;\n\n      this.eventManager.addEventListener(document.documentElement, 'mousedown', function (event) {\n        return _this.onDocumentMouseDown(event);\n      });\n    }\n\n    /**\n     * Set array of objects which defines menu items.\n     *\n     * @param {Array} menuItems Menu items to display.\n     */\n\n  }, {\n    key: 'setMenuItems',\n    value: function setMenuItems(menuItems) {\n      this.menuItems = menuItems;\n    }\n\n    /**\n     * Set offset menu position for specified area (`above`, `below`, `left` or `right`).\n     *\n     * @param {String} area Specified area name (`above`, `below`, `left` or `right`).\n     * @param {Number} offset Offset value.\n     */\n\n  }, {\n    key: 'setOffset',\n    value: function setOffset(area) {\n      var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n      this.offset[area] = offset;\n    }\n\n    /**\n     * Check if menu is using as sub-menu.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSubMenu',\n    value: function isSubMenu() {\n      return this.parentMenu !== null;\n    }\n\n    /**\n     * Open menu.\n     *\n     * @fires Hooks#beforeContextMenuShow\n     * @fires Hooks#afterContextMenuShow\n     */\n\n  }, {\n    key: 'open',\n    value: function open() {\n      var _this2 = this;\n\n      this.runLocalHooks('beforeOpen');\n\n      this.container.removeAttribute('style');\n      this.container.style.display = 'block';\n\n      var delayedOpenSubMenu = (0, _function.debounce)(function (row) {\n        return _this2.openSubMenu(row);\n      }, 300);\n      var minWidthOfMenu = this.options.minWidth || MIN_WIDTH;\n\n      var filteredItems = (0, _array.arrayFilter)(this.menuItems, function (item) {\n        return (0, _utils.isItemHidden)(item, _this2.hot);\n      });\n\n      filteredItems = (0, _utils.filterSeparators)(filteredItems, _predefinedItems.SEPARATOR);\n\n      var settings = {\n        data: filteredItems,\n        colHeaders: false,\n        autoColumnSize: true,\n        modifyColWidth: function modifyColWidth(width) {\n          if ((0, _mixed.isDefined)(width) && width < minWidthOfMenu) {\n            return minWidthOfMenu;\n          }\n\n          return width;\n        },\n\n        autoRowSize: false,\n        readOnly: true,\n        copyPaste: false,\n        columns: [{\n          data: 'name',\n          renderer: function renderer(hot, TD, row, col, prop, value) {\n            return _this2.menuItemRenderer(hot, TD, row, col, prop, value);\n          }\n        }],\n        renderAllRows: true,\n        fragmentSelection: 'cell',\n        disableVisualSelection: 'area',\n        beforeKeyDown: function beforeKeyDown(event) {\n          return _this2.onBeforeKeyDown(event);\n        },\n        afterOnCellMouseOver: function afterOnCellMouseOver(event, coords, TD) {\n          if (_this2.isAllSubMenusClosed()) {\n            delayedOpenSubMenu(coords.row);\n          } else {\n            _this2.openSubMenu(coords.row);\n          }\n        },\n        rowHeights: function rowHeights(row) {\n          return filteredItems[row].name === _predefinedItems.SEPARATOR ? 1 : 23;\n        }\n      };\n      this.origOutsideClickDeselects = this.hot.getSettings().outsideClickDeselects;\n      this.hot.getSettings().outsideClickDeselects = false;\n      this.hotMenu = new _core2.default(this.container, settings);\n      this.hotMenu.addHook('afterInit', function () {\n        return _this2.onAfterInit();\n      });\n      this.hotMenu.addHook('afterSelection', function () {\n        return _this2.onAfterSelection.apply(_this2, arguments);\n      });\n      this.hotMenu.init();\n      this.hotMenu.listen();\n      this.blockMainTableCallbacks();\n      this.runLocalHooks('afterOpen');\n    }\n\n    /**\n     * Close menu.\n     *\n     * @param {Boolean} [closeParent=false] if `true` try to close parent menu if exists.\n     */\n\n  }, {\n    key: 'close',\n    value: function close() {\n      var closeParent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (!this.isOpened()) {\n        return;\n      }\n      if (closeParent && this.parentMenu) {\n        this.parentMenu.close();\n      } else {\n        this.closeAllSubMenus();\n        this.container.style.display = 'none';\n        this.releaseMainTableCallbacks();\n        this.hotMenu.destroy();\n        this.hotMenu = null;\n        this.hot.getSettings().outsideClickDeselects = this.origOutsideClickDeselects;\n        this.runLocalHooks('afterClose');\n\n        if (this.parentMenu) {\n          this.parentMenu.hotMenu.listen();\n        }\n      }\n    }\n\n    /**\n     * Open sub menu at the provided row index.\n     *\n     * @param {Number} row Row index.\n     * @returns {Menu|Boolean} Returns created menu or `false` if no one menu was created.\n     */\n\n  }, {\n    key: 'openSubMenu',\n    value: function openSubMenu(row) {\n      if (!this.hotMenu) {\n        return false;\n      }\n      var cell = this.hotMenu.getCell(row, 0);\n\n      this.closeAllSubMenus();\n\n      if (!cell || !(0, _utils.hasSubMenu)(cell)) {\n        return false;\n      }\n      var dataItem = this.hotMenu.getSourceDataAtRow(row);\n      var subMenu = new Menu(this.hot, {\n        parent: this,\n        name: dataItem.name,\n        className: this.options.className,\n        keepInViewport: true\n      });\n      subMenu.setMenuItems(dataItem.submenu.items);\n      subMenu.open();\n      subMenu.setPosition(cell.getBoundingClientRect());\n      this.hotSubMenus[dataItem.key] = subMenu;\n\n      return subMenu;\n    }\n\n    /**\n     * Close sub menu at row index.\n     *\n     * @param {Number} row Row index.\n     */\n\n  }, {\n    key: 'closeSubMenu',\n    value: function closeSubMenu(row) {\n      var dataItem = this.hotMenu.getSourceDataAtRow(row);\n      var menus = this.hotSubMenus[dataItem.key];\n\n      if (menus) {\n        menus.destroy();\n        delete this.hotSubMenus[dataItem.key];\n      }\n    }\n\n    /**\n     * Close all opened sub menus.\n     */\n\n  }, {\n    key: 'closeAllSubMenus',\n    value: function closeAllSubMenus() {\n      var _this3 = this;\n\n      (0, _array.arrayEach)(this.hotMenu.getData(), function (value, row) {\n        return _this3.closeSubMenu(row);\n      });\n    }\n\n    /**\n     * Checks if all created and opened sub menus are closed.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isAllSubMenusClosed',\n    value: function isAllSubMenusClosed() {\n      return Object.keys(this.hotSubMenus).length === 0;\n    }\n\n    /**\n     * Destroy instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.clearLocalHooks();\n      this.close();\n      this.parentMenu = null;\n      this.eventManager.destroy();\n    }\n\n    /**\n     * Checks if menu was opened.\n     *\n     * @returns {Boolean} Returns `true` if menu was opened.\n     */\n\n  }, {\n    key: 'isOpened',\n    value: function isOpened() {\n      return this.hotMenu !== null;\n    }\n\n    /**\n     * Execute menu command.\n     *\n     * @param {Event} [event]\n     */\n\n  }, {\n    key: 'executeCommand',\n    value: function executeCommand(event) {\n      if (!this.isOpened() || !this.hotMenu.getSelectedLast()) {\n        return;\n      }\n      var selectedItem = this.hotMenu.getSourceDataAtRow(this.hotMenu.getSelectedLast()[0]);\n\n      this.runLocalHooks('select', selectedItem, event);\n\n      if (selectedItem.isCommand === false || selectedItem.name === _predefinedItems.SEPARATOR) {\n        return;\n      }\n      var selRanges = this.hot.getSelectedRange();\n      var normalizedSelection = selRanges ? (0, _utils.normalizeSelection)(selRanges) : [];\n      var autoClose = true;\n\n      // Don't close context menu if item is disabled or it has submenu\n      if (selectedItem.disabled === true || typeof selectedItem.disabled === 'function' && selectedItem.disabled.call(this.hot) === true || selectedItem.submenu) {\n        autoClose = false;\n      }\n\n      this.runLocalHooks('executeCommand', selectedItem.key, normalizedSelection, event);\n\n      if (this.isSubMenu()) {\n        this.parentMenu.runLocalHooks('executeCommand', selectedItem.key, normalizedSelection, event);\n      }\n\n      if (autoClose) {\n        this.close(true);\n      }\n    }\n\n    /**\n     * Set menu position based on dom event or based on literal object.\n     *\n     * @param {Event|Object} coords Event or literal Object with coordinates.\n     */\n\n  }, {\n    key: 'setPosition',\n    value: function setPosition(coords) {\n      var cursor = new _cursor2.default(coords);\n\n      if (this.options.keepInViewport) {\n        if (cursor.fitsBelow(this.container)) {\n          this.setPositionBelowCursor(cursor);\n        } else if (cursor.fitsAbove(this.container)) {\n          this.setPositionAboveCursor(cursor);\n        } else {\n          this.setPositionBelowCursor(cursor);\n        }\n        if (cursor.fitsOnRight(this.container)) {\n          this.setPositionOnRightOfCursor(cursor);\n        } else {\n          this.setPositionOnLeftOfCursor(cursor);\n        }\n      } else {\n        this.setPositionBelowCursor(cursor);\n        this.setPositionOnRightOfCursor(cursor);\n      }\n    }\n\n    /**\n     * Set menu position above cursor object.\n     *\n     * @param {Cursor} cursor `Cursor` object.\n     */\n\n  }, {\n    key: 'setPositionAboveCursor',\n    value: function setPositionAboveCursor(cursor) {\n      var top = this.offset.above + cursor.top - this.container.offsetHeight;\n\n      if (this.isSubMenu()) {\n        top = cursor.top + cursor.cellHeight - this.container.offsetHeight + 3;\n      }\n      this.container.style.top = top + 'px';\n    }\n\n    /**\n     * Set menu position below cursor object.\n     *\n     * @param {Cursor} cursor `Cursor` object.\n     */\n\n  }, {\n    key: 'setPositionBelowCursor',\n    value: function setPositionBelowCursor(cursor) {\n      var top = this.offset.below + cursor.top;\n\n      if (this.isSubMenu()) {\n        top = cursor.top - 1;\n      }\n      this.container.style.top = top + 'px';\n    }\n\n    /**\n     * Set menu position on the right of cursor object.\n     *\n     * @param {Cursor} cursor `Cursor` object.\n     */\n\n  }, {\n    key: 'setPositionOnRightOfCursor',\n    value: function setPositionOnRightOfCursor(cursor) {\n      var left = void 0;\n\n      if (this.isSubMenu()) {\n        left = 1 + cursor.left + cursor.cellWidth;\n      } else {\n        left = this.offset.right + 1 + cursor.left;\n      }\n\n      this.container.style.left = left + 'px';\n    }\n\n    /**\n     * Set menu position on the left of cursor object.\n     *\n     * @param {Cursor} cursor `Cursor` object.\n     */\n\n  }, {\n    key: 'setPositionOnLeftOfCursor',\n    value: function setPositionOnLeftOfCursor(cursor) {\n      var left = this.offset.left + cursor.left - this.container.offsetWidth + (0, _element.getScrollbarWidth)() + 4;\n\n      this.container.style.left = left + 'px';\n    }\n\n    /**\n     * Select first cell in opened menu.\n     */\n\n  }, {\n    key: 'selectFirstCell',\n    value: function selectFirstCell() {\n      var cell = this.hotMenu.getCell(0, 0);\n\n      if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {\n        this.selectNextCell(0, 0);\n      } else {\n        this.hotMenu.selectCell(0, 0);\n      }\n    }\n\n    /**\n     * Select last cell in opened menu.\n     */\n\n  }, {\n    key: 'selectLastCell',\n    value: function selectLastCell() {\n      var lastRow = this.hotMenu.countRows() - 1;\n      var cell = this.hotMenu.getCell(lastRow, 0);\n\n      if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {\n        this.selectPrevCell(lastRow, 0);\n      } else {\n        this.hotMenu.selectCell(lastRow, 0);\n      }\n    }\n\n    /**\n     * Select next cell in opened menu.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} col Column index.\n     */\n\n  }, {\n    key: 'selectNextCell',\n    value: function selectNextCell(row, col) {\n      var nextRow = row + 1;\n      var cell = nextRow < this.hotMenu.countRows() ? this.hotMenu.getCell(nextRow, col) : null;\n\n      if (!cell) {\n        return;\n      }\n      if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {\n        this.selectNextCell(nextRow, col);\n      } else {\n        this.hotMenu.selectCell(nextRow, col);\n      }\n    }\n\n    /**\n     * Select previous cell in opened menu.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} col Column index.\n     */\n\n  }, {\n    key: 'selectPrevCell',\n    value: function selectPrevCell(row, col) {\n      var prevRow = row - 1;\n      var cell = prevRow >= 0 ? this.hotMenu.getCell(prevRow, col) : null;\n\n      if (!cell) {\n        return;\n      }\n      if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {\n        this.selectPrevCell(prevRow, col);\n      } else {\n        this.hotMenu.selectCell(prevRow, col);\n      }\n    }\n\n    /**\n     * Menu item renderer.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'menuItemRenderer',\n    value: function menuItemRenderer(hot, TD, row, col, prop, value) {\n      var _this4 = this;\n\n      var item = hot.getSourceDataAtRow(row);\n      var wrapper = document.createElement('div');\n\n      var isSubMenu = function isSubMenu(item) {\n        return (0, _object.hasOwnProperty)(item, 'submenu');\n      };\n      var itemIsSeparator = function itemIsSeparator(item) {\n        return new RegExp(_predefinedItems.SEPARATOR, 'i').test(item.name);\n      };\n      var itemIsDisabled = function itemIsDisabled(item) {\n        return item.disabled === true || typeof item.disabled == 'function' && item.disabled.call(_this4.hot) === true;\n      };\n      var itemIsSelectionDisabled = function itemIsSelectionDisabled(item) {\n        return item.disableSelection;\n      };\n\n      if (typeof value === 'function') {\n        value = value.call(this.hot);\n      }\n      (0, _element.empty)(TD);\n      (0, _element.addClass)(wrapper, 'htItemWrapper');\n      TD.appendChild(wrapper);\n\n      if (itemIsSeparator(item)) {\n        (0, _element.addClass)(TD, 'htSeparator');\n      } else if (typeof item.renderer === 'function') {\n        (0, _element.addClass)(TD, 'htCustomMenuRenderer');\n        TD.appendChild(item.renderer(hot, wrapper, row, col, prop, value));\n      } else {\n        (0, _element.fastInnerHTML)(wrapper, value);\n      }\n      if (itemIsDisabled(item)) {\n        (0, _element.addClass)(TD, 'htDisabled');\n        this.eventManager.addEventListener(TD, 'mouseenter', function () {\n          return hot.deselectCell();\n        });\n      } else if (itemIsSelectionDisabled(item)) {\n        (0, _element.addClass)(TD, 'htSelectionDisabled');\n        this.eventManager.addEventListener(TD, 'mouseenter', function () {\n          return hot.deselectCell();\n        });\n      } else if (isSubMenu(item)) {\n        (0, _element.addClass)(TD, 'htSubmenu');\n\n        if (itemIsSelectionDisabled(item)) {\n          this.eventManager.addEventListener(TD, 'mouseenter', function () {\n            return hot.deselectCell();\n          });\n        } else {\n          this.eventManager.addEventListener(TD, 'mouseenter', function () {\n            return hot.selectCell(row, col, void 0, void 0, false, false);\n          });\n        }\n      } else {\n        (0, _element.removeClass)(TD, 'htSubmenu');\n        (0, _element.removeClass)(TD, 'htDisabled');\n\n        if (itemIsSelectionDisabled(item)) {\n          this.eventManager.addEventListener(TD, 'mouseenter', function () {\n            return hot.deselectCell();\n          });\n        } else {\n          this.eventManager.addEventListener(TD, 'mouseenter', function () {\n            return hot.selectCell(row, col, void 0, void 0, false, false);\n          });\n        }\n      }\n    }\n\n    /**\n     * Create container/wrapper for handsontable.\n     *\n     * @private\n     * @param {String} [name] Class name.\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createContainer',\n    value: function createContainer() {\n      var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      var container = void 0;\n\n      if (name) {\n        if ((0, _function.isFunction)(name)) {\n          name = name.call(this.hot);\n\n          if (name === null || (0, _mixed.isUndefined)(name)) {\n            name = '';\n          } else {\n            name = name.toString();\n          }\n        }\n\n        name = name.replace(/[^A-z0-9]/g, '_');\n        name = this.options.className + 'Sub_' + name;\n\n        container = document.querySelector('.' + this.options.className + '.' + name);\n      } else {\n        container = document.querySelector('.' + this.options.className);\n      }\n\n      if (!container) {\n        container = document.createElement('div');\n\n        (0, _element.addClass)(container, 'htMenu ' + this.options.className);\n\n        if (name) {\n          (0, _element.addClass)(container, name);\n        }\n        document.getElementsByTagName('body')[0].appendChild(container);\n      }\n\n      return container;\n    }\n\n    /**\n     * @private\n     */\n\n  }, {\n    key: 'blockMainTableCallbacks',\n    value: function blockMainTableCallbacks() {\n      this._afterScrollCallback = function () {};\n      this.hot.addHook('afterScrollVertically', this._afterScrollCallback);\n      this.hot.addHook('afterScrollHorizontally', this._afterScrollCallback);\n    }\n\n    /**\n     * @private\n     */\n\n  }, {\n    key: 'releaseMainTableCallbacks',\n    value: function releaseMainTableCallbacks() {\n      if (this._afterScrollCallback) {\n        this.hot.removeHook('afterScrollVertically', this._afterScrollCallback);\n        this.hot.removeHook('afterScrollHorizontally', this._afterScrollCallback);\n        this._afterScrollCallback = null;\n      }\n    }\n\n    /**\n     * On before key down listener.\n     *\n     * @private\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onBeforeKeyDown',\n    value: function onBeforeKeyDown(event) {\n      var selection = this.hotMenu.getSelectedLast();\n      var stopEvent = false;\n      this.keyEvent = true;\n\n      switch (event.keyCode) {\n        case _unicode.KEY_CODES.ESCAPE:\n          this.close();\n          stopEvent = true;\n          break;\n\n        case _unicode.KEY_CODES.ENTER:\n          if (selection) {\n            if (this.hotMenu.getSourceDataAtRow(selection[0]).submenu) {\n              stopEvent = true;\n            } else {\n              this.executeCommand(event);\n              this.close(true);\n            }\n          }\n          break;\n\n        case _unicode.KEY_CODES.ARROW_DOWN:\n          if (selection) {\n            this.selectNextCell(selection[0], selection[1]);\n          } else {\n            this.selectFirstCell();\n          }\n          stopEvent = true;\n          break;\n\n        case _unicode.KEY_CODES.ARROW_UP:\n          if (selection) {\n            this.selectPrevCell(selection[0], selection[1]);\n          } else {\n            this.selectLastCell();\n          }\n          stopEvent = true;\n          break;\n\n        case _unicode.KEY_CODES.ARROW_RIGHT:\n          if (selection) {\n            var menu = this.openSubMenu(selection[0]);\n\n            if (menu) {\n              menu.selectFirstCell();\n            }\n          }\n          stopEvent = true;\n\n          break;\n\n        case _unicode.KEY_CODES.ARROW_LEFT:\n          if (selection && this.isSubMenu()) {\n            this.close();\n\n            if (this.parentMenu) {\n              this.parentMenu.hotMenu.listen();\n            }\n            stopEvent = true;\n          }\n          break;\n        default:\n          break;\n      }\n      if (stopEvent) {\n        event.preventDefault();\n        (0, _event.stopImmediatePropagation)(event);\n      }\n\n      this.keyEvent = false;\n    }\n\n    /**\n     * On after init listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      var data = this.hotMenu.getSettings().data;\n      var hiderStyle = this.hotMenu.view.wt.wtTable.hider.style;\n      var holderStyle = this.hotMenu.view.wt.wtTable.holder.style;\n      var currentHiderWidth = parseInt(hiderStyle.width, 10);\n\n      var realHeight = (0, _array.arrayReduce)(data, function (accumulator, value) {\n        return accumulator + (value.name === _predefinedItems.SEPARATOR ? 1 : 26);\n      }, 0);\n\n      holderStyle.width = currentHiderWidth + 22 + 'px';\n      holderStyle.height = realHeight + 4 + 'px';\n      hiderStyle.height = holderStyle.height;\n    }\n\n    /**\n     * On after selection listener.\n     *\n     * @param {Number} r Selection start row index.\n     * @param {Number} c Selection start column index.\n     * @param {Number} r2 Selection end row index.\n     * @param {Number} c2 Selection end column index.\n     * @param {Object} preventScrolling Object with `value` property where its value change will be observed.\n     * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n     */\n\n  }, {\n    key: 'onAfterSelection',\n    value: function onAfterSelection(r, c, r2, c2, preventScrolling) {\n      if (this.keyEvent === false) {\n        preventScrolling.value = true;\n      }\n    }\n\n    /**\n     * Document mouse down listener.\n     *\n     * @private\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onDocumentMouseDown',\n    value: function onDocumentMouseDown(event) {\n      if (!this.isOpened()) {\n        return;\n      }\n      if (this.container && (0, _element.isChildOf)(event.target, this.container)) {\n        this.executeCommand(event);\n      }\n      // Close menu when clicked element is not belongs to menu itself\n      if (this.options.standalone && this.hotMenu && !(0, _element.isChildOf)(event.target, this.hotMenu.rootElement)) {\n        this.close(true);\n\n        // Automatically close menu when clicked element is not belongs to menu or submenu (not necessarily to itself)\n      } else if ((this.isAllSubMenusClosed() || this.isSubMenu()) && !(0, _element.isChildOf)(event.target, '.htMenu') && (0, _element.isChildOf)(event.target, document)) {\n        this.close(true);\n      }\n    }\n  }]);\n\n  return Menu;\n}();\n\n(0, _object.mixin)(Menu, _localHooks2.default);\n\nexports.default = Menu;\n\n/***/ }),\n/* 434 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _event = __webpack_require__(12);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Helper class for checking if element will fit at the desired side of cursor.\n *\n * @class Cursor\n * @plugin ContextMenu\n */\nvar Cursor = function () {\n  function Cursor(object) {\n    _classCallCheck(this, Cursor);\n\n    var windowScrollTop = (0, _element.getWindowScrollTop)();\n    var windowScrollLeft = (0, _element.getWindowScrollLeft)();\n    var top = void 0,\n        topRelative = void 0;\n    var left = void 0,\n        leftRelative = void 0;\n    var cellHeight = void 0,\n        cellWidth = void 0;\n\n    this.type = this.getSourceType(object);\n\n    if (this.type === 'literal') {\n      top = parseInt(object.top, 10);\n      left = parseInt(object.left, 10);\n      cellHeight = object.height || 0;\n      cellWidth = object.width || 0;\n      topRelative = top;\n      leftRelative = left;\n      top += windowScrollTop;\n      left += windowScrollLeft;\n    } else if (this.type === 'event') {\n      top = parseInt((0, _event.pageY)(object), 10);\n      left = parseInt((0, _event.pageX)(object), 10);\n      cellHeight = object.target.clientHeight;\n      cellWidth = object.target.clientWidth;\n      topRelative = top - windowScrollTop;\n      leftRelative = left - windowScrollLeft;\n    }\n\n    this.top = top;\n    this.topRelative = topRelative;\n    this.left = left;\n    this.leftRelative = leftRelative;\n    this.scrollTop = windowScrollTop;\n    this.scrollLeft = windowScrollLeft;\n    this.cellHeight = cellHeight;\n    this.cellWidth = cellWidth;\n  }\n\n  /**\n   * Get source type name.\n   *\n   * @param {*} object Event or Object with coordinates.\n   * @returns {String} Returns one of this values: `'literal'`, `'event'`.\n   */\n\n\n  _createClass(Cursor, [{\n    key: 'getSourceType',\n    value: function getSourceType(object) {\n      var type = 'literal';\n\n      if (object instanceof Event) {\n        type = 'event';\n      }\n\n      return type;\n    }\n\n    /**\n     * Checks if element can be placed above the cursor.\n     *\n     * @param {HTMLElement} element Element to check if it's size will fit above the cursor.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'fitsAbove',\n    value: function fitsAbove(element) {\n      return this.topRelative >= element.offsetHeight;\n    }\n\n    /**\n     * Checks if element can be placed below the cursor.\n     *\n     * @param {HTMLElement} element Element to check if it's size will fit below the cursor.\n     * @param {Number} [viewportHeight] The viewport height.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'fitsBelow',\n    value: function fitsBelow(element) {\n      var viewportHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window.innerHeight;\n\n      return this.topRelative + element.offsetHeight <= viewportHeight;\n    }\n\n    /**\n     * Checks if element can be placed on the right of the cursor.\n     *\n     * @param {HTMLElement} element Element to check if it's size will fit on the right of the cursor.\n     * @param {Number} [viewportWidth] The viewport width.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'fitsOnRight',\n    value: function fitsOnRight(element) {\n      var viewportWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window.innerWidth;\n\n      return this.leftRelative + this.cellWidth + element.offsetWidth <= viewportWidth;\n    }\n\n    /**\n     * Checks if element can be placed on the left on the cursor.\n     *\n     * @param {HTMLElement} element Element to check if it's size will fit on the left of the cursor.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'fitsOnLeft',\n    value: function fitsOnLeft(element) {\n      return this.leftRelative >= element.offsetWidth;\n    }\n  }]);\n\n  return Cursor;\n}();\n\nexports.default = Cursor;\n\n/***/ }),\n/* 435 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 436 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _SheetClip = __webpack_require__(311);\n\nvar _SheetClip2 = _interopRequireDefault(_SheetClip);\n\nvar _src = __webpack_require__(4);\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nvar _textarea = __webpack_require__(437);\n\nvar _textarea2 = _interopRequireDefault(_textarea);\n\nvar _copy = __webpack_require__(438);\n\nvar _copy2 = _interopRequireDefault(_copy);\n\nvar _cut = __webpack_require__(439);\n\nvar _cut2 = _interopRequireDefault(_cut);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _pasteEvent = __webpack_require__(440);\n\nvar _pasteEvent2 = _interopRequireDefault(_pasteEvent);\n\n__webpack_require__(442);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('afterCopyLimit');\n_pluginHooks2.default.getSingleton().register('modifyCopyableRange');\n_pluginHooks2.default.getSingleton().register('beforeCut');\n_pluginHooks2.default.getSingleton().register('afterCut');\n_pluginHooks2.default.getSingleton().register('beforePaste');\n_pluginHooks2.default.getSingleton().register('afterPaste');\n_pluginHooks2.default.getSingleton().register('beforeCopy');\n_pluginHooks2.default.getSingleton().register('afterCopy');\n\nvar ROWS_LIMIT = 1000;\nvar COLUMNS_LIMIT = 1000;\nvar privatePool = new WeakMap();\n\n/**\n * @description\n * This plugin enables the copy/paste functionality in the Handsontable.\n *\n * @example\n * ```js\n * ...\n * copyPaste: true,\n * ...\n * ```\n * @class CopyPaste\n * @plugin CopyPaste\n */\n\nvar CopyPaste = function (_BasePlugin) {\n  _inherits(CopyPaste, _BasePlugin);\n\n  function CopyPaste(hotInstance) {\n    _classCallCheck(this, CopyPaste);\n\n    /**\n     * Event manager\n     *\n     * @type {EventManager}\n     */\n    var _this = _possibleConstructorReturn(this, (CopyPaste.__proto__ || Object.getPrototypeOf(CopyPaste)).call(this, hotInstance));\n\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Maximum number of columns than can be copied to clipboard using <kbd>CTRL</kbd> + <kbd>C</kbd>.\n     *\n     * @private\n     * @type {Number}\n     * @default 1000\n     */\n    _this.columnsLimit = COLUMNS_LIMIT;\n    /**\n     * Ranges of the cells coordinates, which should be used to copy/cut/paste actions.\n     *\n     * @private\n     * @type {Array}\n     */\n    _this.copyableRanges = [];\n    /**\n     * Defines paste (<kbd>CTRL</kbd> + <kbd>V</kbd>) behavior.\n     * * Default value `\"overwrite\"` will paste clipboard value over current selection.\n     * * When set to `\"shift_down\"`, clipboard data will be pasted in place of current selection, while all selected cells are moved down.\n     * * When set to `\"shift_right\"`, clipboard data will be pasted in place of current selection, while all selected cells are moved right.\n     *\n     * @private\n     * @type {String}\n     * @default 'overwrite'\n     */\n    _this.pasteMode = 'overwrite';\n    /**\n     * Maximum number of rows than can be copied to clipboard using <kbd>CTRL</kbd> + <kbd>C</kbd>.\n     *\n     * @private\n     * @type {Number}\n     * @default 1000\n     */\n    _this.rowsLimit = ROWS_LIMIT;\n    /**\n     * The `textarea` element which is necessary to process copying, cutting off and pasting.\n     *\n     * @private\n     * @type {HTMLElement}\n     * @default undefined\n     */\n    _this.textarea = void 0;\n\n    privatePool.set(_this, {\n      isTriggeredByCopy: false,\n      isTriggeredByCut: false,\n      isBeginEditing: false,\n      isFragmentSelectionEnabled: false\n    });\n    return _this;\n  }\n\n  /**\n   * Check if plugin is enabled.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(CopyPaste, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().copyPaste;\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n      var settings = this.hot.getSettings();\n      var priv = privatePool.get(this);\n\n      this.textarea = _textarea2.default.getSingleton();\n      priv.isFragmentSelectionEnabled = settings.fragmentSelection;\n\n      if (_typeof(settings.copyPaste) === 'object') {\n        this.pasteMode = settings.copyPaste.pasteMode || this.pasteMode;\n        this.rowsLimit = settings.copyPaste.rowsLimit || this.rowsLimit;\n        this.columnsLimit = settings.copyPaste.columnsLimit || this.columnsLimit;\n      }\n\n      this.addHook('afterContextMenuDefaultOptions', function (options) {\n        return _this2.onAfterContextMenuDefaultOptions(options);\n      });\n      this.addHook('afterSelectionEnd', function () {\n        return _this2.onAfterSelectionEnd();\n      });\n\n      this.registerEvents();\n\n      _get(CopyPaste.prototype.__proto__ || Object.getPrototypeOf(CopyPaste.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(CopyPaste.prototype.__proto__ || Object.getPrototypeOf(CopyPaste.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      if (this.textarea) {\n        this.textarea.destroy();\n      }\n\n      _get(CopyPaste.prototype.__proto__ || Object.getPrototypeOf(CopyPaste.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Prepares copyable text from the cells selection in the invisible textarea.\n     *\n     * @function setCopyable\n     * @memberof CopyPaste#\n     */\n\n  }, {\n    key: 'setCopyableText',\n    value: function setCopyableText() {\n      var selRange = this.hot.getSelectedRangeLast();\n\n      if (!selRange) {\n        return;\n      }\n      var topLeft = selRange.getTopLeftCorner();\n      var bottomRight = selRange.getBottomRightCorner();\n      var startRow = topLeft.row;\n      var startCol = topLeft.col;\n      var endRow = bottomRight.row;\n      var endCol = bottomRight.col;\n      var finalEndRow = Math.min(endRow, startRow + this.rowsLimit - 1);\n      var finalEndCol = Math.min(endCol, startCol + this.columnsLimit - 1);\n\n      this.copyableRanges.length = 0;\n\n      this.copyableRanges.push({\n        startRow: startRow,\n        startCol: startCol,\n        endRow: finalEndRow,\n        endCol: finalEndCol\n      });\n\n      this.copyableRanges = this.hot.runHooks('modifyCopyableRange', this.copyableRanges);\n\n      if (endRow !== finalEndRow || endCol !== finalEndCol) {\n        this.hot.runHooks('afterCopyLimit', endRow - startRow + 1, endCol - startCol + 1, this.rowsLimit, this.columnsLimit);\n      }\n    }\n\n    /**\n     * Create copyable text releated to range objects.\n     *\n     * @since 0.19.0\n     * @param {Array} ranges Array of Objects with properties `startRow`, `endRow`, `startCol` and `endCol`.\n     * @returns {String} Returns string which will be copied into clipboard.\n     */\n\n  }, {\n    key: 'getRangedCopyableData',\n    value: function getRangedCopyableData(ranges) {\n      var _this3 = this;\n\n      var dataSet = [];\n      var copyableRows = [];\n      var copyableColumns = [];\n\n      // Count all copyable rows and columns\n      (0, _array.arrayEach)(ranges, function (range) {\n        (0, _number.rangeEach)(range.startRow, range.endRow, function (row) {\n          if (copyableRows.indexOf(row) === -1) {\n            copyableRows.push(row);\n          }\n        });\n        (0, _number.rangeEach)(range.startCol, range.endCol, function (column) {\n          if (copyableColumns.indexOf(column) === -1) {\n            copyableColumns.push(column);\n          }\n        });\n      });\n      // Concat all rows and columns data defined in ranges into one copyable string\n      (0, _array.arrayEach)(copyableRows, function (row) {\n        var rowSet = [];\n\n        (0, _array.arrayEach)(copyableColumns, function (column) {\n          rowSet.push(_this3.hot.getCopyableData(row, column));\n        });\n\n        dataSet.push(rowSet);\n      });\n\n      return _SheetClip2.default.stringify(dataSet);\n    }\n\n    /**\n     * Create copyable text releated to range objects.\n     *\n     * @since 0.31.1\n     * @param {Array} ranges Array of Objects with properties `startRow`, `startCol`, `endRow` and `endCol`.\n     * @returns {Array} Returns array of arrays which will be copied into clipboard.\n     */\n\n  }, {\n    key: 'getRangedData',\n    value: function getRangedData(ranges) {\n      var _this4 = this;\n\n      var dataSet = [];\n      var copyableRows = [];\n      var copyableColumns = [];\n\n      // Count all copyable rows and columns\n      (0, _array.arrayEach)(ranges, function (range) {\n        (0, _number.rangeEach)(range.startRow, range.endRow, function (row) {\n          if (copyableRows.indexOf(row) === -1) {\n            copyableRows.push(row);\n          }\n        });\n        (0, _number.rangeEach)(range.startCol, range.endCol, function (column) {\n          if (copyableColumns.indexOf(column) === -1) {\n            copyableColumns.push(column);\n          }\n        });\n      });\n      // Concat all rows and columns data defined in ranges into one copyable string\n      (0, _array.arrayEach)(copyableRows, function (row) {\n        var rowSet = [];\n\n        (0, _array.arrayEach)(copyableColumns, function (column) {\n          rowSet.push(_this4.hot.getCopyableData(row, column));\n        });\n\n        dataSet.push(rowSet);\n      });\n\n      return dataSet;\n    }\n\n    /**\n     * Copy action.\n     */\n\n  }, {\n    key: 'copy',\n    value: function copy() {\n      var priv = privatePool.get(this);\n\n      priv.isTriggeredByCopy = true;\n\n      this.textarea.select();\n      document.execCommand('copy');\n    }\n\n    /**\n     * Cut action.\n     */\n\n  }, {\n    key: 'cut',\n    value: function cut() {\n      var priv = privatePool.get(this);\n\n      priv.isTriggeredByCut = true;\n\n      this.textarea.select();\n      document.execCommand('cut');\n    }\n\n    /**\n     * Simulated paste action.\n     *\n     * @param {String} [value=''] New value, which should be `pasted`.\n     */\n\n  }, {\n    key: 'paste',\n    value: function paste() {\n      var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      var pasteData = new _pasteEvent2.default();\n      pasteData.clipboardData.setData('text/plain', value);\n\n      this.onPaste(pasteData);\n    }\n\n    /**\n     * Register event listeners.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this5 = this;\n\n      this.eventManager.addEventListener(this.textarea.element, 'paste', function (event) {\n        return _this5.onPaste(event);\n      });\n      this.eventManager.addEventListener(this.textarea.element, 'cut', function (event) {\n        return _this5.onCut(event);\n      });\n      this.eventManager.addEventListener(this.textarea.element, 'copy', function (event) {\n        return _this5.onCopy(event);\n      });\n    }\n\n    /**\n     * `copy` event callback on textarea element.\n     *\n     * @param {Event} event ClipboardEvent.\n     * @private\n     */\n\n  }, {\n    key: 'onCopy',\n    value: function onCopy(event) {\n      var priv = privatePool.get(this);\n\n      if (!this.hot.isListening() && !priv.isTriggeredByCopy) {\n        return;\n      }\n\n      this.setCopyableText();\n      priv.isTriggeredByCopy = false;\n\n      var rangedData = this.getRangedData(this.copyableRanges);\n      var allowCopying = !!this.hot.runHooks('beforeCopy', rangedData, this.copyableRanges);\n      var value = '';\n\n      if (allowCopying) {\n        value = _SheetClip2.default.stringify(rangedData);\n\n        if (event && event.clipboardData) {\n          event.clipboardData.setData('text/plain', value);\n        } else if (typeof ClipboardEvent === 'undefined') {\n          window.clipboardData.setData('Text', value);\n        }\n\n        this.hot.runHooks('afterCopy', rangedData, this.copyableRanges);\n      }\n\n      event.preventDefault();\n    }\n\n    /**\n     * `cut` event callback on textarea element.\n     *\n     * @param {Event} event ClipboardEvent.\n     * @private\n     */\n\n  }, {\n    key: 'onCut',\n    value: function onCut(event) {\n      var priv = privatePool.get(this);\n\n      if (!this.hot.isListening() && !priv.isTriggeredByCut) {\n        return;\n      }\n\n      this.setCopyableText();\n      priv.isTriggeredByCut = false;\n\n      var rangedData = this.getRangedData(this.copyableRanges);\n      var allowCuttingOut = !!this.hot.runHooks('beforeCut', rangedData, this.copyableRanges);\n      var value = void 0;\n\n      if (allowCuttingOut) {\n        value = _SheetClip2.default.stringify(rangedData);\n\n        if (event && event.clipboardData) {\n          event.clipboardData.setData('text/plain', value);\n        } else if (typeof ClipboardEvent === 'undefined') {\n          window.clipboardData.setData('Text', value);\n        }\n\n        this.hot.emptySelectedCells();\n        this.hot.runHooks('afterCut', rangedData, this.copyableRanges);\n      }\n\n      event.preventDefault();\n    }\n\n    /**\n     * `paste` event callback on textarea element.\n     *\n     * @param {Event} event ClipboardEvent or pseudo ClipboardEvent, if paste was called manually.\n     * @private\n     */\n\n  }, {\n    key: 'onPaste',\n    value: function onPaste(event) {\n      var _this6 = this;\n\n      if (!this.hot.isListening()) {\n        return;\n      }\n      if (event && event.preventDefault) {\n        event.preventDefault();\n      }\n\n      var inputArray = void 0;\n\n      if (event && typeof event.clipboardData !== 'undefined') {\n        this.textarea.setValue(event.clipboardData.getData('text/plain'));\n      } else if (typeof ClipboardEvent === 'undefined' && typeof window.clipboardData !== 'undefined') {\n        this.textarea.setValue(window.clipboardData.getData('Text'));\n      }\n\n      inputArray = _SheetClip2.default.parse(this.textarea.getValue());\n      this.textarea.setValue(' ');\n\n      if (inputArray.length === 0) {\n        return;\n      }\n\n      var allowPasting = !!this.hot.runHooks('beforePaste', inputArray, this.copyableRanges);\n\n      if (!allowPasting) {\n        return;\n      }\n\n      var selected = this.hot.getSelectedLast();\n      var coordsFrom = new _src.CellCoords(selected[0], selected[1]);\n      var coordsTo = new _src.CellCoords(selected[2], selected[3]);\n      var cellRange = new _src.CellRange(coordsFrom, coordsFrom, coordsTo);\n      var topLeftCorner = cellRange.getTopLeftCorner();\n      var bottomRightCorner = cellRange.getBottomRightCorner();\n      var areaStart = topLeftCorner;\n      var areaEnd = new _src.CellCoords(Math.max(bottomRightCorner.row, inputArray.length - 1 + topLeftCorner.row), Math.max(bottomRightCorner.col, inputArray[0].length - 1 + topLeftCorner.col));\n\n      var isSelRowAreaCoverInputValue = coordsTo.row - coordsFrom.row >= inputArray.length - 1;\n      var isSelColAreaCoverInputValue = coordsTo.col - coordsFrom.col >= inputArray[0].length - 1;\n\n      this.hot.addHookOnce('afterChange', function (changes) {\n        var changesLength = changes ? changes.length : 0;\n\n        if (changesLength) {\n          var offset = { row: 0, col: 0 };\n          var highestColumnIndex = -1;\n\n          (0, _array.arrayEach)(changes, function (change, index) {\n            var nextChange = changesLength > index + 1 ? changes[index + 1] : null;\n\n            if (nextChange) {\n              if (!isSelRowAreaCoverInputValue) {\n                offset.row += Math.max(nextChange[0] - change[0] - 1, 0);\n              }\n              if (!isSelColAreaCoverInputValue && change[1] > highestColumnIndex) {\n                highestColumnIndex = change[1];\n                offset.col += Math.max(nextChange[1] - change[1] - 1, 0);\n              }\n            }\n          });\n          _this6.hot.selectCell(areaStart.row, areaStart.col, areaEnd.row + offset.row, areaEnd.col + offset.col);\n        }\n      });\n\n      this.hot.populateFromArray(areaStart.row, areaStart.col, inputArray, areaEnd.row, areaEnd.col, 'CopyPaste.paste', this.pasteMode);\n      this.hot.runHooks('afterPaste', inputArray, this.copyableRanges);\n    }\n\n    /**\n     * Add copy, cut and paste options to the Context Menu.\n     *\n     * @private\n     * @param {Object} options Contains default added options of the Context Menu.\n     */\n\n  }, {\n    key: 'onAfterContextMenuDefaultOptions',\n    value: function onAfterContextMenuDefaultOptions(options) {\n      options.items.push({\n        name: '---------'\n      }, (0, _copy2.default)(this), (0, _cut2.default)(this));\n    }\n\n    /**\n     * We have to keep focus on textarea element, to make possible use of the browser tools (copy, cut, paste).\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterSelectionEnd',\n    value: function onAfterSelectionEnd() {\n      var priv = privatePool.get(this);\n      var editor = this.hot.getActiveEditor();\n\n      if (editor && typeof editor.isOpened !== 'undefined' && editor.isOpened()) {\n        return;\n      }\n      if (priv.isFragmentSelectionEnabled && !this.textarea.isActive() && (0, _element.getSelectionText)()) {\n        return;\n      }\n\n      this.setCopyableText();\n      this.textarea.select();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.textarea) {\n        this.textarea.destroy();\n      }\n\n      _get(CopyPaste.prototype.__proto__ || Object.getPrototypeOf(CopyPaste.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return CopyPaste;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('CopyPaste', CopyPaste);\n\nexports.default = CopyPaste;\n\n/***/ }),\n/* 437 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Textarea\n *\n * @plugin CopyPaste\n */\nvar Textarea = function () {\n  _createClass(Textarea, null, [{\n    key: 'getSingleton',\n    value: function getSingleton() {\n      globalSingleton.append();\n\n      return globalSingleton;\n    }\n  }]);\n\n  function Textarea() {\n    _classCallCheck(this, Textarea);\n\n    /**\n     * Main textarea element.\n     *\n     * @type {HTMLElement}\n     */\n    this.element = void 0;\n    /**\n     * Store information about append to the document.body.\n     *\n     * @type {Boolean}\n     */\n    this.isAppended = false;\n    /**\n     * Reference counter.\n     *\n     * @type {Number}\n     */\n    this.refCounter = 0;\n  }\n\n  /**\n   * Apends textarea element to the `body`\n   */\n\n\n  _createClass(Textarea, [{\n    key: 'append',\n    value: function append() {\n      if (this.hasBeenDestroyed()) {\n        this.create();\n      }\n\n      this.refCounter++;\n\n      if (!this.isAppended && document.body) {\n        if (document.body) {\n          this.isAppended = true;\n          document.body.appendChild(this.element);\n        }\n      }\n    }\n\n    /**\n     * Prepares textarea element with proper attributes.\n     */\n\n  }, {\n    key: 'create',\n    value: function create() {\n      this.element = document.createElement('textarea');\n      this.element.id = 'HandsontableCopyPaste';\n      this.element.className = 'copyPaste';\n      this.element.tabIndex = -1;\n      this.element.autocomplete = 'off';\n      this.element.wrap = 'hard';\n      this.element.value = ' ';\n    }\n\n    /**\n     * Deselects textarea element if is active.\n     */\n\n  }, {\n    key: 'deselect',\n    value: function deselect() {\n      if (this.element === document.activeElement) {\n        document.activeElement.blur();\n      }\n    }\n\n    /**\n     * Destroy instance\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.refCounter--;\n      this.refCounter = this.refCounter < 0 ? 0 : this.refCounter;\n\n      if (this.hasBeenDestroyed() && this.element && this.element.parentNode) {\n        this.element.parentNode.removeChild(this.element);\n        this.element = null;\n        this.isAppended = false;\n      }\n    }\n\n    /**\n     * Getter for the element.\n     *\n     * @returns {String}\n     */\n\n  }, {\n    key: 'getValue',\n    value: function getValue() {\n      return this.element.value;\n    }\n\n    /**\n     * Check if instance has been destroyed\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasBeenDestroyed',\n    value: function hasBeenDestroyed() {\n      return this.refCounter < 1;\n    }\n\n    /**\n     * Check if the element is an active element in frame.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isActive',\n    value: function isActive() {\n      return this.element === document.activeElement;\n    }\n\n    /**\n     * Sets focus on the element and select content.\n     */\n\n  }, {\n    key: 'select',\n    value: function select() {\n      this.element.focus();\n      this.element.select();\n    }\n\n    /**\n     * Setter for the element.\n     *\n     * @param {String} data Value which should be insert into the element.\n     */\n\n  }, {\n    key: 'setValue',\n    value: function setValue(data) {\n      this.element.value = data;\n    }\n  }]);\n\n  return Textarea;\n}();\n\nvar globalSingleton = new Textarea();\n\nexports.default = Textarea;\n\n/***/ }),\n/* 438 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = copyItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction copyItem(copyPastePlugin) {\n  return {\n    key: 'copy',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_COPY);\n    },\n    callback: function callback() {\n      copyPastePlugin.copy();\n    },\n    disabled: function disabled() {\n      var selected = this.getSelected();\n\n      if (!selected || selected.length > 1) {\n        return true;\n      }\n\n      return false;\n    },\n\n    hidden: false\n  };\n}\n\n/***/ }),\n/* 439 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = cutItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction cutItem(copyPastePlugin) {\n  return {\n    key: 'cut',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_CUT);\n    },\n    callback: function callback() {\n      copyPastePlugin.cut();\n    },\n    disabled: function disabled() {\n      var selected = this.getSelected();\n\n      if (!selected || selected.length > 1) {\n        return true;\n      }\n\n      return false;\n    },\n\n    hidden: false\n  };\n}\n\n/***/ }),\n/* 440 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _clipboardData = __webpack_require__(441);\n\nvar _clipboardData2 = _interopRequireDefault(_clipboardData);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar PasteEvent = function PasteEvent() {\n  _classCallCheck(this, PasteEvent);\n\n  this.clipboardData = new _clipboardData2.default();\n};\n\nexports.default = PasteEvent;\n\n/***/ }),\n/* 441 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ClipboardData = function () {\n  function ClipboardData() {\n    _classCallCheck(this, ClipboardData);\n\n    this.data = {};\n  }\n\n  _createClass(ClipboardData, [{\n    key: \"setData\",\n    value: function setData(type, value) {\n      this.data[type] = value;\n    }\n  }, {\n    key: \"getData\",\n    value: function getData(type) {\n      return this.data[type] || void 0;\n    }\n  }]);\n\n  return ClipboardData;\n}();\n\nexports.default = ClipboardData;\n\n/***/ }),\n/* 442 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 443 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _src = __webpack_require__(4);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _bottom = __webpack_require__(444);\n\nvar _bottom2 = _interopRequireDefault(_bottom);\n\nvar _left = __webpack_require__(445);\n\nvar _left2 = _interopRequireDefault(_left);\n\nvar _noBorders = __webpack_require__(446);\n\nvar _noBorders2 = _interopRequireDefault(_noBorders);\n\nvar _right = __webpack_require__(447);\n\nvar _right2 = _interopRequireDefault(_right);\n\nvar _top = __webpack_require__(448);\n\nvar _top2 = _interopRequireDefault(_top);\n\nvar _utils = __webpack_require__(48);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @plugin CustomBorders\n *\n * @description\n * This plugin enables an option to apply custom borders through the context menu (configurable with context menu key `borders`).\n *\n * To initialize Handsontable with predefined custom borders, provide cell coordinates and border styles in a form of an array.\n *\n * See [Custom Borders](http://docs.handsontable.com/demo-custom-borders.html) demo for more examples.\n *\n * @example\n * ```js\n * ...\n * customBorders: [\n *   {\n *    range: {\n *      from: {\n *        row: 1,\n *        col: 1\n *      },\n *      to: {\n *        row: 3,\n *        col: 4\n *      },\n *    },\n *    left: {},\n *    right: {},\n *    top: {},\n *    bottom: {},\n *   },\n * ],\n * ...\n *\n * // or\n * ...\n * customBorders: [\n *   { row: 2,\n *     col: 2,\n *     left: {\n *       width: 2,\n *       color: 'red',\n *     },\n *     right: {\n *       width: 1,\n *       color: 'green',\n *     },\n *     top: '',\n *     bottom: '',\n *   }.\n * ],\n * ...\n * ```\n * @private\n * @class CustomBorders\n */\nvar CustomBorders = function (_BasePlugin) {\n  _inherits(CustomBorders, _BasePlugin);\n\n  function CustomBorders(hotInstance) {\n    _classCallCheck(this, CustomBorders);\n\n    /**\n     * Saved borders settings.\n     *\n     * @type {Array}\n     */\n    var _this = _possibleConstructorReturn(this, (CustomBorders.__proto__ || Object.getPrototypeOf(CustomBorders)).call(this, hotInstance));\n\n    _this.savedBorderSettings = void 0;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(CustomBorders, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().customBorders;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('afterContextMenuDefaultOptions', function (options) {\n        return _this2.onAfterContextMenuDefaultOptions(options);\n      });\n      this.addHook('afterInit', function () {\n        return _this2.onAfterInit();\n      });\n\n      _get(CustomBorders.prototype.__proto__ || Object.getPrototypeOf(CustomBorders.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.clearBorders();\n\n      _get(CustomBorders.prototype.__proto__ || Object.getPrototypeOf(CustomBorders.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      this.changeBorderSettings();\n\n      _get(CustomBorders.prototype.__proto__ || Object.getPrototypeOf(CustomBorders.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Get index of border from the settings.\n     *\n     * @param {String} className Class name as string.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getSettingIndex',\n    value: function getSettingIndex(className) {\n      var index = -1;\n\n      (0, _array.arrayEach)(this.hot.selection.highlight.borders, function (selection, i) {\n        if (selection.settings.className === className) {\n          index = i;\n\n          return false;\n        }\n      });\n\n      return index;\n    }\n\n    /**\n     * Insert WalkontableSelection instance into Walkontable settings.\n     *\n     * @param {Object} border Object with `row` and `col`, `left`, `right`, `top` and `bottom`, `className` and `border` ({Object} with `color`, `width` and `cornerVisible` property) properties.\n     */\n\n  }, {\n    key: 'insertBorderIntoSettings',\n    value: function insertBorderIntoSettings(border) {\n      var coordinates = {\n        row: border.row,\n        col: border.col\n      };\n      var selection = new _src.Selection(border, new _src.CellRange(coordinates, coordinates, coordinates));\n      var index = this.getSettingIndex(border.className);\n\n      if (index >= 0) {\n        this.hot.selection.highlight.borders[index] = selection;\n      } else {\n        this.hot.selection.highlight.borders.push(selection);\n      }\n    }\n\n    /**\n     * Prepare borders from setting (single cell).\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {Object} borderObj Object with `row` and `col`, `left`, `right`, `top` and `bottom` properties.\n     */\n\n  }, {\n    key: 'prepareBorderFromCustomAdded',\n    value: function prepareBorderFromCustomAdded(row, col, borderObj) {\n      var border = (0, _utils.createEmptyBorders)(row, col);\n\n      border = (0, _utils.extendDefaultBorder)(border, borderObj);\n      this.hot.setCellMeta(row, col, 'borders', border);\n\n      this.insertBorderIntoSettings(border);\n    }\n\n    /** *\n     * Prepare borders from setting (object).\n     *\n     * @param {Object} rowObj Object with `range`, `left`, `right`, `top` and `bottom` properties.\n     */\n\n  }, {\n    key: 'prepareBorderFromCustomAddedRange',\n    value: function prepareBorderFromCustomAddedRange(rowObj) {\n      var _this3 = this;\n\n      var range = rowObj.range;\n\n      (0, _number.rangeEach)(range.from.row, range.to.row, function (rowIndex) {\n        (0, _number.rangeEach)(range.from.col, range.to.col, function (colIndex) {\n          var border = (0, _utils.createEmptyBorders)(rowIndex, colIndex);\n          var add = 0;\n\n          if (rowIndex === range.from.row) {\n            add += 1;\n\n            if ((0, _object.hasOwnProperty)(rowObj, 'top')) {\n              border.top = rowObj.top;\n            }\n          }\n\n          if (rowIndex === range.to.row) {\n            add += 1;\n\n            if ((0, _object.hasOwnProperty)(rowObj, 'bottom')) {\n              border.bottom = rowObj.bottom;\n            }\n          }\n\n          if (colIndex === range.from.col) {\n            add += 1;\n\n            if ((0, _object.hasOwnProperty)(rowObj, 'left')) {\n              border.left = rowObj.left;\n            }\n          }\n\n          if (colIndex === range.to.col) {\n            add += 1;\n\n            if ((0, _object.hasOwnProperty)(rowObj, 'right')) {\n              border.right = rowObj.right;\n            }\n          }\n\n          if (add > 0) {\n            _this3.hot.setCellMeta(rowIndex, colIndex, 'borders', border);\n            _this3.insertBorderIntoSettings(border);\n          }\n        });\n      });\n    }\n\n    /**\n     * Remove borders divs from DOM.\n     *\n     * @param {String} borderClassName Border class name as string.\n     */\n\n  }, {\n    key: 'removeBordersFromDom',\n    value: function removeBordersFromDom(borderClassName) {\n      var borders = this.hot.rootElement.querySelectorAll('.' + borderClassName + ':not(td)');\n\n      (0, _number.rangeEach)(0, borders.length - 1, function (index) {\n        var parent = borders[index].parentNode;\n\n        if (parent.parentNode) {\n          parent.parentNode.removeChild(parent);\n        }\n      });\n    }\n\n    /**\n     * Remove border (triggered from context menu).\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     */\n\n  }, {\n    key: 'removeAllBorders',\n    value: function removeAllBorders(row, col) {\n      var borderClassName = (0, _utils.createClassName)(row, col);\n\n      this.removeBordersFromDom(borderClassName);\n      this.hot.removeCellMeta(row, col, 'borders');\n    }\n\n    /**\n     * Set borders for each cell re. to border position.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {String} place Coordinate where add/remove border - `top`, `bottom`, `left`, `right` and `noBorders`.\n     * @param {Boolean} remove True when remove borders, and false when add borders.\n     */\n\n  }, {\n    key: 'setBorder',\n    value: function setBorder(row, col, place, remove) {\n      var bordersMeta = this.hot.getCellMeta(row, col).borders;\n\n      if (!bordersMeta || bordersMeta.border === void 0) {\n        bordersMeta = (0, _utils.createEmptyBorders)(row, col);\n      }\n\n      if (remove) {\n        bordersMeta[place] = (0, _utils.createSingleEmptyBorder)();\n      } else {\n        bordersMeta[place] = (0, _utils.createDefaultCustomBorder)();\n      }\n\n      this.hot.setCellMeta(row, col, 'borders', bordersMeta);\n\n      var borderClassName = (0, _utils.createClassName)(row, col);\n      this.removeBordersFromDom(borderClassName);\n      this.insertBorderIntoSettings(bordersMeta);\n\n      this.hot.render();\n    }\n\n    /**\n     * Prepare borders based on cell and border position.\n     *\n     * @param {Object} selected\n     * @param {String} place Coordinate where add/remove border - `top`, `bottom`, `left`, `right` and `noBorders`.\n     * @param {Boolean} remove True when remove borders, and false when add borders.\n     */\n\n  }, {\n    key: 'prepareBorder',\n    value: function prepareBorder(selected, place, remove) {\n      var _this4 = this;\n\n      (0, _array.arrayEach)(selected, function (_ref) {\n        var start = _ref.start,\n            end = _ref.end;\n\n        if (start.row === end.row && start.col === end.col) {\n          if (place === 'noBorders') {\n            _this4.removeAllBorders(start.row, start.col);\n          } else {\n            _this4.setBorder(start.row, start.col, place, remove);\n          }\n        } else {\n          switch (place) {\n            case 'noBorders':\n              (0, _number.rangeEach)(start.col, end.col, function (colIndex) {\n                (0, _number.rangeEach)(start.row, end.row, function (rowIndex) {\n                  _this4.removeAllBorders(rowIndex, colIndex);\n                });\n              });\n              break;\n\n            case 'top':\n              (0, _number.rangeEach)(start.col, end.col, function (topCol) {\n                _this4.setBorder(start.row, topCol, place, remove);\n              });\n              break;\n\n            case 'right':\n              (0, _number.rangeEach)(start.row, end.row, function (rowRight) {\n                _this4.setBorder(rowRight, end.col, place, remove);\n              });\n              break;\n\n            case 'bottom':\n              (0, _number.rangeEach)(start.col, end.col, function (bottomCol) {\n                _this4.setBorder(end.row, bottomCol, place, remove);\n              });\n              break;\n\n            case 'left':\n              (0, _number.rangeEach)(start.row, end.row, function (rowLeft) {\n                _this4.setBorder(rowLeft, start.col, place, remove);\n              });\n              break;\n            default:\n              break;\n          }\n        }\n      });\n    }\n\n    /**\n     * Create borders from settings.\n     *\n     * @private\n     * @param {Array} customBorders Object with `row` and `col`, `left`, `right`, `top` and `bottom` properties.\n     */\n\n  }, {\n    key: 'createCustomBorders',\n    value: function createCustomBorders(customBorders) {\n      var _this5 = this;\n\n      (0, _number.rangeEach)(0, customBorders.length - 1, function (index) {\n        if (customBorders[index].range) {\n          _this5.prepareBorderFromCustomAddedRange(customBorders[index]);\n        } else {\n          _this5.prepareBorderFromCustomAdded(customBorders[index].row, customBorders[index].col, customBorders[index]);\n        }\n      });\n\n      this.hot.render();\n      this.hot.view.wt.draw(true);\n    }\n\n    /**\n     * Add border options to context menu.\n     *\n     * @private\n     * @param {Object} defaultOptions Context menu items.\n     */\n\n  }, {\n    key: 'onAfterContextMenuDefaultOptions',\n    value: function onAfterContextMenuDefaultOptions(defaultOptions) {\n      if (!this.hot.getSettings().customBorders) {\n        return;\n      }\n\n      defaultOptions.items.push({\n        name: '---------'\n      }, {\n        key: 'borders',\n        name: function name() {\n          return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS);\n        },\n        disabled: function disabled() {\n          return this.selection.isSelectedByCorner();\n        },\n\n        submenu: {\n          items: [(0, _top2.default)(this), (0, _right2.default)(this), (0, _bottom2.default)(this), (0, _left2.default)(this), (0, _noBorders2.default)(this)]\n        }\n      });\n    }\n\n    /**\n      * Clear borders.\n      *\n      * @private\n      */\n\n  }, {\n    key: 'clearBorders',\n    value: function clearBorders() {\n      var _this6 = this;\n\n      var bordersFromTable = this.hot.rootElement.querySelectorAll('td[class^=\"border\"]');\n\n      (0, _number.rangeEach)(0, bordersFromTable.length - 1, function (index) {\n        _this6.removeBordersFromDom(bordersFromTable[index].className);\n      });\n    }\n\n    /**\n     * Change borders from settings.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'changeBorderSettings',\n    value: function changeBorderSettings() {\n      var customBorders = this.hot.getSettings().customBorders;\n\n      if (customBorders) {\n        if (Array.isArray(customBorders)) {\n          this.savedBorderSettings = customBorders;\n          this.createCustomBorders(customBorders);\n        } else if (customBorders !== void 0) {\n          var borders = this.savedBorderSettings ? this.savedBorderSettings : customBorders;\n\n          this.createCustomBorders(borders);\n        }\n      }\n    }\n\n    /**\n     * `afterInit` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      this.changeBorderSettings();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(CustomBorders.prototype.__proto__ || Object.getPrototypeOf(CustomBorders.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return CustomBorders;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('customBorders', CustomBorders);\n\nexports.default = CustomBorders;\n\n/***/ }),\n/* 444 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = bottom;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(48);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction bottom(customBordersPlugin) {\n  return {\n    key: 'borders:bottom',\n    name: function name() {\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM);\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'bottom');\n      if (hasBorder) {\n        label = (0, _utils.markSelected)(label);\n      }\n      return label;\n    },\n    callback: function callback(key, selected) {\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'bottom');\n      customBordersPlugin.prepareBorder(selected, 'bottom', hasBorder);\n    }\n  };\n}\n\n/***/ }),\n/* 445 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = left;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(48);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction left(customBordersPlugin) {\n  return {\n    key: 'borders:left',\n    name: function name() {\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_LEFT);\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'left');\n      if (hasBorder) {\n        label = (0, _utils.markSelected)(label);\n      }\n\n      return label;\n    },\n    callback: function callback(key, selected) {\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'left');\n      customBordersPlugin.prepareBorder(selected, 'left', hasBorder);\n    }\n  };\n}\n\n/***/ }),\n/* 446 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = noBorders;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(48);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction noBorders(customBordersPlugin) {\n  return {\n    key: 'borders:no_borders',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_BORDERS);\n    },\n    callback: function callback(key, selected) {\n      customBordersPlugin.prepareBorder(selected, 'noBorders');\n    },\n    disabled: function disabled() {\n      return !(0, _utils.checkSelectionBorders)(this);\n    }\n  };\n}\n\n/***/ }),\n/* 447 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = right;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(48);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction right(customBordersPlugin) {\n  return {\n    key: 'borders:right',\n    name: function name() {\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_RIGHT);\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'right');\n      if (hasBorder) {\n        label = (0, _utils.markSelected)(label);\n      }\n      return label;\n    },\n    callback: function callback(key, selected) {\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'right');\n      customBordersPlugin.prepareBorder(selected, 'right', hasBorder);\n    }\n  };\n}\n\n/***/ }),\n/* 448 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = top;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(48);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction top(customBordersPlugin) {\n  return {\n    key: 'borders:top',\n    name: function name() {\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_TOP);\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'top');\n      if (hasBorder) {\n        label = (0, _utils.markSelected)(label);\n      }\n\n      return label;\n    },\n    callback: function callback(key, selected) {\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'top');\n      customBordersPlugin.prepareBorder(selected, 'top', hasBorder);\n    }\n  };\n}\n\n/***/ }),\n/* 449 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @description\n * Plugin used to scroll Handsontable by selecting a cell and dragging outside of the visible viewport.\n *\n *\n * @class DragToScroll\n * @plugin DragToScroll\n */\nvar DragToScroll = function (_BasePlugin) {\n  _inherits(DragToScroll, _BasePlugin);\n\n  function DragToScroll(hotInstance) {\n    _classCallCheck(this, DragToScroll);\n\n    /**\n     * Instance of {@link EventManager}.\n     *\n     * @type {EventManager}\n     */\n    var _this = _possibleConstructorReturn(this, (DragToScroll.__proto__ || Object.getPrototypeOf(DragToScroll)).call(this, hotInstance));\n\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * DOMRect - size of an element and its position relative to the viewport,\n     * e.g. {bottom: 449, height: 441, left: 8, right: 814, top: 8, width: 806, x: 8, y:8}.\n     *\n     * @type {Object}\n     */\n    _this.boundaries = null;\n    /**\n     * Callback function.\n     *\n     * @type {Function}\n     */\n    _this.callback = null;\n    /**\n     * Flag indicates mouseDown/mouseUp.\n     *\n     * @type {Boolean}\n     */\n    _this.listening = false;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(DragToScroll, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().dragToScroll;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('afterOnCellMouseDown', function () {\n        return _this2.setupListening();\n      });\n      this.addHook('afterOnCellCornerMouseDown', function () {\n        return _this2.setupListening();\n      });\n\n      this.registerEvents();\n\n      _get(DragToScroll.prototype.__proto__ || Object.getPrototypeOf(DragToScroll.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(DragToScroll.prototype.__proto__ || Object.getPrototypeOf(DragToScroll.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.unregisterEvents();\n\n      _get(DragToScroll.prototype.__proto__ || Object.getPrototypeOf(DragToScroll.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Sets the value of the visible element.\n     *\n     * @param boundaries {Object} compatible with getBoundingClientRect\n     */\n\n  }, {\n    key: 'setBoundaries',\n    value: function setBoundaries(boundaries) {\n      this.boundaries = boundaries;\n    }\n\n    /**\n     * Change callback function.\n     *\n     * @param callback {Function}\n     */\n\n  }, {\n    key: 'setCallback',\n    value: function setCallback(callback) {\n      this.callback = callback;\n    }\n\n    /**\n     * Check if mouse position (x, y) is outside of the viewport.\n     *\n     * @param {Number} x\n     * @param {Number} y\n     */\n\n  }, {\n    key: 'check',\n    value: function check(x, y) {\n      var diffX = 0;\n      var diffY = 0;\n\n      if (y < this.boundaries.top) {\n        // y is less than top\n        diffY = y - this.boundaries.top;\n      } else if (y > this.boundaries.bottom) {\n        // y is more than bottom\n        diffY = y - this.boundaries.bottom;\n      }\n\n      if (x < this.boundaries.left) {\n        // x is less than left\n        diffX = x - this.boundaries.left;\n      } else if (x > this.boundaries.right) {\n        // x is more than right\n        diffX = x - this.boundaries.right;\n      }\n\n      this.callback(diffX, diffY);\n    }\n\n    /**\n     * Register dom listeners.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this3 = this;\n\n      this.eventManager.addEventListener(document, 'mouseup', function () {\n        return _this3.onMouseUp();\n      });\n      this.eventManager.addEventListener(document, 'mousemove', function (event) {\n        return _this3.onMouseMove(event);\n      });\n    }\n\n    /**\n     * Unbind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'unregisterEvents',\n    value: function unregisterEvents() {\n      this.eventManager.clear();\n    }\n\n    /**\n     * On after on cell/cellCorner mouse down listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'setupListening',\n    value: function setupListening() {\n      var scrollHandler = this.hot.view.wt.wtTable.holder; // native scroll\n\n      if (scrollHandler === window) {\n        // not much we can do currently\n        return;\n      }\n\n      this.setBoundaries(scrollHandler.getBoundingClientRect());\n      this.setCallback(function (scrollX, scrollY) {\n        if (scrollX < 0) {\n          scrollHandler.scrollLeft -= 50;\n        } else if (scrollX > 0) {\n          scrollHandler.scrollLeft += 50;\n        }\n\n        if (scrollY < 0) {\n          scrollHandler.scrollTop -= 20;\n        } else if (scrollY > 0) {\n          scrollHandler.scrollTop += 20;\n        }\n      });\n\n      this.listening = true;\n    }\n\n    /**\n     * 'mouseMove' event callback.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      if (this.listening) {\n        this.check(event.clientX, event.clientY);\n      }\n    }\n\n    /**\n     * `onMouseUp` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      this.listening = false;\n    }\n\n    /**\n     * Destroy instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(DragToScroll.prototype.__proto__ || Object.getPrototypeOf(DragToScroll.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return DragToScroll;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('dragToScroll', DragToScroll);\n\nexports.default = DragToScroll;\n\n/***/ }),\n/* 450 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _array = __webpack_require__(1);\n\nvar _freezeColumn = __webpack_require__(451);\n\nvar _freezeColumn2 = _interopRequireDefault(_freezeColumn);\n\nvar _unfreezeColumn = __webpack_require__(452);\n\nvar _unfreezeColumn2 = _interopRequireDefault(_unfreezeColumn);\n\n__webpack_require__(453);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar privatePool = new WeakMap();\n/**\n * This plugin allows to manually \"freeze\" and \"unfreeze\" a column using an entry in the Context Menu.\n * You can turn it on by setting a `manualColumnFreeze` property to `true`.\n *\n * @plugin ManualColumnFreeze\n * @dependencies ManualColumnMove\n */\n\nvar ManualColumnFreeze = function (_BasePlugin) {\n  _inherits(ManualColumnFreeze, _BasePlugin);\n\n  function ManualColumnFreeze(hotInstance) {\n    _classCallCheck(this, ManualColumnFreeze);\n\n    var _this = _possibleConstructorReturn(this, (ManualColumnFreeze.__proto__ || Object.getPrototypeOf(ManualColumnFreeze)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      moveByFreeze: false,\n      afterFirstUse: false\n    });\n    /**\n     * Original column positions\n     *\n     * @type {Array}\n     */\n    _this.frozenColumnsBasePositions = [];\n    /**\n     * Reference to the `ManualColumnMove` plugin.\n     */\n    _this.manualColumnMovePlugin = void 0;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualColumnFreeze, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().manualColumnFreeze;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('afterContextMenuDefaultOptions', function (options) {\n        return _this2.addContextMenuEntry(options);\n      });\n      this.addHook('afterInit', function () {\n        return _this2.onAfterInit();\n      });\n      this.addHook('beforeColumnMove', function (rows, target) {\n        return _this2.onBeforeColumnMove(rows, target);\n      });\n\n      _get(ManualColumnFreeze.prototype.__proto__ || Object.getPrototypeOf(ManualColumnFreeze.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      var priv = privatePool.get(this);\n\n      priv.afterFirstUse = false;\n      priv.moveByFreeze = false;\n\n      _get(ManualColumnFreeze.prototype.__proto__ || Object.getPrototypeOf(ManualColumnFreeze.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(ManualColumnFreeze.prototype.__proto__ || Object.getPrototypeOf(ManualColumnFreeze.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Freeze the given column (add it to fixed columns).\n     *\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'freezeColumn',\n    value: function freezeColumn(column) {\n      var priv = privatePool.get(this);\n      var settings = this.hot.getSettings();\n\n      if (!priv.afterFirstUse) {\n        priv.afterFirstUse = true;\n      }\n\n      if (settings.fixedColumnsLeft === this.hot.countCols() || column <= settings.fixedColumnsLeft - 1) {\n        return; // already fixed\n      }\n\n      priv.moveByFreeze = true;\n\n      if (column !== this.getMovePlugin().columnsMapper.getValueByIndex(column)) {\n        this.frozenColumnsBasePositions[settings.fixedColumnsLeft] = column;\n      }\n\n      this.getMovePlugin().moveColumn(column, settings.fixedColumnsLeft++);\n    }\n\n    /**\n     * Unfreeze the given column (remove it from fixed columns and bring to it's previous position).\n     *\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'unfreezeColumn',\n    value: function unfreezeColumn(column) {\n      var priv = privatePool.get(this);\n      var settings = this.hot.getSettings();\n\n      if (!priv.afterFirstUse) {\n        priv.afterFirstUse = true;\n      }\n\n      if (settings.fixedColumnsLeft <= 0 || column > settings.fixedColumnsLeft - 1) {\n        return; // not fixed\n      }\n\n      var returnCol = this.getBestColumnReturnPosition(column);\n\n      priv.moveByFreeze = true;\n      settings.fixedColumnsLeft--;\n\n      this.getMovePlugin().moveColumn(column, returnCol + 1);\n    }\n\n    /**\n     * Get the reference to the ManualColumnMove plugin.\n     *\n     * @private\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'getMovePlugin',\n    value: function getMovePlugin() {\n      if (!this.manualColumnMovePlugin) {\n        this.manualColumnMovePlugin = this.hot.getPlugin('manualColumnMove');\n      }\n\n      return this.manualColumnMovePlugin;\n    }\n\n    /**\n     * Estimates the most fitting return position for unfrozen column.\n     *\n     * @private\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'getBestColumnReturnPosition',\n    value: function getBestColumnReturnPosition(column) {\n      var movePlugin = this.getMovePlugin();\n      var settings = this.hot.getSettings();\n      var i = settings.fixedColumnsLeft;\n      var j = movePlugin.columnsMapper.getValueByIndex(i);\n      var initialCol = void 0;\n\n      if (this.frozenColumnsBasePositions[column] === null || this.frozenColumnsBasePositions[column] === void 0) {\n        initialCol = movePlugin.columnsMapper.getValueByIndex(column);\n\n        while (j !== null && j <= initialCol) {\n          i++;\n          j = movePlugin.columnsMapper.getValueByIndex(i);\n        }\n      } else {\n        initialCol = this.frozenColumnsBasePositions[column];\n        this.frozenColumnsBasePositions[column] = void 0;\n\n        while (j !== null && j <= initialCol) {\n          i++;\n          j = movePlugin.columnsMapper.getValueByIndex(i);\n        }\n        i = j;\n      }\n\n      return i - 1;\n    }\n    /**\n     * Add the manualColumnFreeze context menu entries.\n     *\n     * @private\n     * @param {Object} options Context menu options.\n     */\n\n  }, {\n    key: 'addContextMenuEntry',\n    value: function addContextMenuEntry(options) {\n      options.items.push({ name: '---------' }, (0, _freezeColumn2.default)(this), (0, _unfreezeColumn2.default)(this));\n    }\n\n    /**\n     * Enabling `manualColumnMove` plugin on `afterInit` hook.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      if (!this.getMovePlugin().isEnabled()) {\n        this.getMovePlugin().enablePlugin();\n      }\n    }\n\n    /**\n     * Prevent moving the rows from/to fixed area.\n     *\n     * @private\n     * @param {Array} rows\n     * @param {Number} target\n     */\n\n  }, {\n    key: 'onBeforeColumnMove',\n    value: function onBeforeColumnMove(rows, target) {\n      var priv = privatePool.get(this);\n\n      if (priv.afterFirstUse && !priv.moveByFreeze) {\n        var frozenLen = this.hot.getSettings().fixedColumnsLeft;\n        var disallowMoving = target < frozenLen;\n\n        if (!disallowMoving) {\n          (0, _array.arrayEach)(rows, function (value, index, array) {\n            if (value < frozenLen) {\n              disallowMoving = true;\n              return false;\n            }\n          });\n        }\n\n        if (disallowMoving) {\n          return false;\n        }\n      }\n\n      if (priv.moveByFreeze) {\n        priv.moveByFreeze = false;\n      }\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(ManualColumnFreeze.prototype.__proto__ || Object.getPrototypeOf(ManualColumnFreeze.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return ManualColumnFreeze;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('manualColumnFreeze', ManualColumnFreeze);\n\nexports.default = ManualColumnFreeze;\n\n/***/ }),\n/* 451 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = freezeColumnItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction freezeColumnItem(manualColumnFreezePlugin) {\n  return {\n    key: 'freeze_column',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_FREEZE_COLUMN);\n    },\n    callback: function callback(key, selected) {\n      var _selected = _slicedToArray(selected, 1),\n          selectedColumn = _selected[0].start.col;\n\n      manualColumnFreezePlugin.freezeColumn(selectedColumn);\n\n      this.render();\n      this.view.wt.wtOverlays.adjustElementsSize(true);\n    },\n    hidden: function hidden() {\n      var selection = this.getSelectedRange();\n      var hide = false;\n\n      if (selection === void 0) {\n        hide = true;\n      } else if (selection.length > 1) {\n        hide = true;\n      } else if (selection[0].from.col !== selection[0].to.col || selection[0].from.col <= this.getSettings().fixedColumnsLeft - 1) {\n        hide = true;\n      }\n\n      return hide;\n    }\n  };\n}\n\n/***/ }),\n/* 452 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = unfreezeColumnItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction unfreezeColumnItem(manualColumnFreezePlugin) {\n  return {\n    key: 'unfreeze_column',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN);\n    },\n    callback: function callback(key, selected) {\n      var _selected = _slicedToArray(selected, 1),\n          selectedColumn = _selected[0].start.col;\n\n      manualColumnFreezePlugin.unfreezeColumn(selectedColumn);\n\n      this.render();\n      this.view.wt.wtOverlays.adjustElementsSize(true);\n    },\n    hidden: function hidden() {\n      var selection = this.getSelectedRange();\n      var hide = false;\n\n      if (selection === void 0) {\n        hide = true;\n      } else if (selection.length > 1) {\n        hide = true;\n      } else if (selection[0].from.col !== selection[0].to.col || selection[0].from.col >= this.getSettings().fixedColumnsLeft) {\n        hide = true;\n      }\n\n      return hide;\n    }\n  };\n}\n\n/***/ }),\n/* 453 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 454 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _element = __webpack_require__(0);\n\nvar _number = __webpack_require__(5);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nvar _columnsMapper = __webpack_require__(455);\n\nvar _columnsMapper2 = _interopRequireDefault(_columnsMapper);\n\nvar _backlight = __webpack_require__(456);\n\nvar _backlight2 = _interopRequireDefault(_backlight);\n\nvar _guideline = __webpack_require__(457);\n\nvar _guideline2 = _interopRequireDefault(_guideline);\n\nvar _src = __webpack_require__(4);\n\n__webpack_require__(458);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('beforeColumnMove');\n_pluginHooks2.default.getSingleton().register('afterColumnMove');\n_pluginHooks2.default.getSingleton().register('unmodifyCol');\n\nvar privatePool = new WeakMap();\nvar CSS_PLUGIN = 'ht__manualColumnMove';\nvar CSS_SHOW_UI = 'show-ui';\nvar CSS_ON_MOVING = 'on-moving--columns';\nvar CSS_AFTER_SELECTION = 'after-selection--columns';\n\n/**\n * @plugin ManualColumnMove\n *\n * @description\n * This plugin allows to change columns order.\n *\n * API:\n * - moveColumn - move single column to the new position.\n * - moveColumns - move many columns (as an array of indexes) to the new position.\n *\n * If you want apply visual changes, you have to call manually the render() method on the instance of Handsontable.\n *\n * UI components:\n * - backlight - highlight of selected columns.\n * - guideline - line which shows where rows has been moved.\n *\n * @class ManualColumnMove\n * @plugin ManualColumnMove\n */\n\nvar ManualColumnMove = function (_BasePlugin) {\n  _inherits(ManualColumnMove, _BasePlugin);\n\n  function ManualColumnMove(hotInstance) {\n    _classCallCheck(this, ManualColumnMove);\n\n    /**\n     * Set up WeakMap of plugin to sharing private parameters;\n     */\n    var _this = _possibleConstructorReturn(this, (ManualColumnMove.__proto__ || Object.getPrototypeOf(ManualColumnMove)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      columnsToMove: [],\n      countCols: 0,\n      fixedColumns: 0,\n      pressed: void 0,\n      disallowMoving: void 0,\n      target: {\n        eventPageX: void 0,\n        coords: void 0,\n        TD: void 0,\n        col: void 0\n      }\n    });\n\n    /**\n     * List of last removed row indexes.\n     *\n     * @type {Array}\n     */\n    _this.removedColumns = [];\n    /**\n     * Object containing visual row indexes mapped to data source indexes.\n     *\n     * @type {RowsMapper}\n     */\n    _this.columnsMapper = new _columnsMapper2.default(_this);\n    /**\n     * Event Manager object.\n     *\n     * @type {Object}\n     */\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Backlight UI object.\n     *\n     * @type {Object}\n     */\n    _this.backlight = new _backlight2.default(hotInstance);\n    /**\n     * Guideline UI object.\n     *\n     * @type {Object}\n     */\n    _this.guideline = new _guideline2.default(hotInstance);\n    return _this;\n  }\n\n  /**\n   * Check if plugin is enabled.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualColumnMove, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().manualColumnMove;\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('beforeOnCellMouseDown', function (event, coords, TD, blockCalculations) {\n        return _this2.onBeforeOnCellMouseDown(event, coords, TD, blockCalculations);\n      });\n      this.addHook('beforeOnCellMouseOver', function (event, coords, TD, blockCalculations) {\n        return _this2.onBeforeOnCellMouseOver(event, coords, TD, blockCalculations);\n      });\n      this.addHook('afterScrollVertically', function () {\n        return _this2.onAfterScrollVertically();\n      });\n      this.addHook('modifyCol', function (row, source) {\n        return _this2.onModifyCol(row, source);\n      });\n      this.addHook('beforeRemoveCol', function (index, amount) {\n        return _this2.onBeforeRemoveCol(index, amount);\n      });\n      this.addHook('afterRemoveCol', function () {\n        return _this2.onAfterRemoveCol();\n      });\n      this.addHook('afterCreateCol', function (index, amount) {\n        return _this2.onAfterCreateCol(index, amount);\n      });\n      this.addHook('afterLoadData', function () {\n        return _this2.onAfterLoadData();\n      });\n      this.addHook('unmodifyCol', function (column) {\n        return _this2.onUnmodifyCol(column);\n      });\n\n      this.registerEvents();\n\n      // TODO: move adding plugin classname to BasePlugin.\n      (0, _element.addClass)(this.hot.rootElement, CSS_PLUGIN);\n\n      _get(ManualColumnMove.prototype.__proto__ || Object.getPrototypeOf(ManualColumnMove.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      this.onAfterPluginsInitialized();\n\n      _get(ManualColumnMove.prototype.__proto__ || Object.getPrototypeOf(ManualColumnMove.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      var pluginSettings = this.hot.getSettings().manualColumnMove;\n\n      if (Array.isArray(pluginSettings)) {\n        this.columnsMapper.clearMap();\n      }\n\n      (0, _element.removeClass)(this.hot.rootElement, CSS_PLUGIN);\n\n      this.unregisterEvents();\n      this.backlight.destroy();\n      this.guideline.destroy();\n\n      _get(ManualColumnMove.prototype.__proto__ || Object.getPrototypeOf(ManualColumnMove.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Move a single column.\n     *\n     * @param {Number} column Visual column index to be moved.\n     * @param {Number} target Visual column index being a target for the moved column.\n     */\n\n  }, {\n    key: 'moveColumn',\n    value: function moveColumn(column, target) {\n      this.moveColumns([column], target);\n    }\n\n    /**\n     * Move multiple columns.\n     *\n     * @param {Array} columns Array of visual column indexes to be moved.\n     * @param {Number} target Visual column index being a target for the moved columns.\n     */\n\n  }, {\n    key: 'moveColumns',\n    value: function moveColumns(columns, target) {\n      var _this3 = this;\n\n      var visualColumns = [].concat(_toConsumableArray(columns));\n      var priv = privatePool.get(this);\n      var beforeColumnHook = this.hot.runHooks('beforeColumnMove', visualColumns, target);\n\n      priv.disallowMoving = !beforeColumnHook;\n\n      if (beforeColumnHook !== false) {\n        // first we need to rewrite an visual indexes to physical for save reference after move\n        (0, _array.arrayEach)(columns, function (column, index, array) {\n          array[index] = _this3.columnsMapper.getValueByIndex(column);\n        });\n\n        // next, when we have got an physical indexes, we can move columns\n        (0, _array.arrayEach)(columns, function (column, index) {\n          var actualPosition = _this3.columnsMapper.getIndexByValue(column);\n\n          if (actualPosition !== target) {\n            _this3.columnsMapper.moveColumn(actualPosition, target + index);\n          }\n        });\n\n        // after moving we have to clear columnsMapper from null entries\n        this.columnsMapper.clearNull();\n      }\n\n      this.hot.runHooks('afterColumnMove', visualColumns, target);\n    }\n\n    /**\n     * Correct the cell selection after the move action. Fired only when action was made with a mouse.\n     * That means that changing the column order using the API won't correct the selection.\n     *\n     * @private\n     * @param {Number} startColumn Visual column index for the start of the selection.\n     * @param {Number} endColumn Visual column index for the end of the selection.\n     */\n\n  }, {\n    key: 'changeSelection',\n    value: function changeSelection(startColumn, endColumn) {\n      this.hot.selectColumns(startColumn, endColumn);\n    }\n\n    /**\n     * Get the sum of the widths of columns in the provided range.\n     *\n     * @private\n     * @param {Number} from Visual column index.\n     * @param {Number} to Visual column index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getColumnsWidth',\n    value: function getColumnsWidth(from, to) {\n      var width = 0;\n\n      for (var i = from; i < to; i++) {\n        var columnWidth = 0;\n\n        if (i < 0) {\n          columnWidth = this.hot.view.wt.wtViewport.getRowHeaderWidth() || 0;\n        } else {\n          columnWidth = this.hot.view.wt.wtTable.getStretchedColumnWidth(i) || 0;\n        }\n\n        width += columnWidth;\n      }\n\n      return width;\n    }\n\n    /**\n     * Load initial settings when persistent state is saved or when plugin was initialized as an array.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'initialSettings',\n    value: function initialSettings() {\n      var pluginSettings = this.hot.getSettings().manualColumnMove;\n\n      if (Array.isArray(pluginSettings)) {\n        this.moveColumns(pluginSettings, 0);\n      } else if (pluginSettings !== void 0) {\n        this.persistentStateLoad();\n      }\n    }\n\n    /**\n     * Check if the provided column is in the fixedColumnsLeft section.\n     *\n     * @private\n     * @param {Number} column Visual column index to check.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isFixedColumnsLeft',\n    value: function isFixedColumnsLeft(column) {\n      return column < this.hot.getSettings().fixedColumnsLeft;\n    }\n\n    /**\n     * Save the manual column positions to the persistent state.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'persistentStateSave',\n    value: function persistentStateSave() {\n      this.hot.runHooks('persistentStateSave', 'manualColumnMove', this.columnsMapper._arrayMap);\n    }\n\n    /**\n     * Load the manual column positions from the persistent state.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'persistentStateLoad',\n    value: function persistentStateLoad() {\n      var storedState = {};\n\n      this.hot.runHooks('persistentStateLoad', 'manualColumnMove', storedState);\n\n      if (storedState.value) {\n        this.columnsMapper._arrayMap = storedState.value;\n      }\n    }\n\n    /**\n     * Prepare array of indexes based on actual selection.\n     *\n     * @private\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'prepareColumnsToMoving',\n    value: function prepareColumnsToMoving(start, end) {\n      var selectedColumns = [];\n\n      (0, _number.rangeEach)(start, end, function (i) {\n        selectedColumns.push(i);\n      });\n\n      return selectedColumns;\n    }\n\n    /**\n     * Update the UI visual position.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'refreshPositions',\n    value: function refreshPositions() {\n      var priv = privatePool.get(this);\n      var firstVisible = this.hot.view.wt.wtTable.getFirstVisibleColumn();\n      var lastVisible = this.hot.view.wt.wtTable.getLastVisibleColumn();\n      var wtTable = this.hot.view.wt.wtTable;\n      var scrollableElement = this.hot.view.wt.wtOverlays.scrollableElement;\n      var scrollLeft = typeof scrollableElement.scrollX === 'number' ? scrollableElement.scrollX : scrollableElement.scrollLeft;\n      var tdOffsetLeft = this.hot.view.THEAD.offsetLeft + this.getColumnsWidth(0, priv.coordsColumn);\n      var mouseOffsetLeft = priv.target.eventPageX - (priv.rootElementOffset - (scrollableElement.scrollX === void 0 ? scrollLeft : 0));\n      var hiderWidth = wtTable.hider.offsetWidth;\n      var tbodyOffsetLeft = wtTable.TBODY.offsetLeft;\n      var backlightElemMarginLeft = this.backlight.getOffset().left;\n      var backlightElemWidth = this.backlight.getSize().width;\n      var rowHeaderWidth = 0;\n\n      if (priv.rootElementOffset + wtTable.holder.offsetWidth + scrollLeft < priv.target.eventPageX) {\n        if (priv.coordsColumn < priv.countCols) {\n          priv.coordsColumn++;\n        }\n      }\n\n      if (priv.hasRowHeaders) {\n        rowHeaderWidth = this.hot.view.wt.wtOverlays.leftOverlay.clone.wtTable.getColumnHeader(-1).offsetWidth;\n      }\n      if (this.isFixedColumnsLeft(priv.coordsColumn)) {\n        tdOffsetLeft += scrollLeft;\n      }\n      tdOffsetLeft += rowHeaderWidth;\n\n      if (priv.coordsColumn < 0) {\n        // if hover on rowHeader\n        if (priv.fixedColumns > 0) {\n          priv.target.col = 0;\n        } else {\n          priv.target.col = firstVisible > 0 ? firstVisible - 1 : firstVisible;\n        }\n      } else if (priv.target.TD.offsetWidth / 2 + tdOffsetLeft <= mouseOffsetLeft) {\n        var newCoordsCol = priv.coordsColumn >= priv.countCols ? priv.countCols - 1 : priv.coordsColumn;\n        // if hover on right part of TD\n        priv.target.col = newCoordsCol + 1;\n        // unfortunately first column is bigger than rest\n        tdOffsetLeft += priv.target.TD.offsetWidth;\n\n        if (priv.target.col > lastVisible) {\n          this.hot.scrollViewportTo(void 0, lastVisible + 1, void 0, true);\n        }\n      } else {\n        // elsewhere on table\n        priv.target.col = priv.coordsColumn;\n\n        if (priv.target.col <= firstVisible && priv.target.col >= priv.fixedColumns) {\n          this.hot.scrollViewportTo(void 0, firstVisible - 1);\n        }\n      }\n\n      if (priv.target.col <= firstVisible && priv.target.col >= priv.fixedColumns) {\n        this.hot.scrollViewportTo(void 0, firstVisible - 1);\n      }\n\n      var backlightLeft = mouseOffsetLeft;\n      var guidelineLeft = tdOffsetLeft;\n\n      if (mouseOffsetLeft + backlightElemWidth + backlightElemMarginLeft >= hiderWidth) {\n        // prevent display backlight on the right side of the table\n        backlightLeft = hiderWidth - backlightElemWidth - backlightElemMarginLeft;\n      } else if (mouseOffsetLeft + backlightElemMarginLeft < tbodyOffsetLeft + rowHeaderWidth) {\n        // prevent display backlight on the left side of the table\n        backlightLeft = tbodyOffsetLeft + rowHeaderWidth + Math.abs(backlightElemMarginLeft);\n      }\n\n      if (tdOffsetLeft >= hiderWidth - 1) {\n        // prevent display guideline outside the table\n        guidelineLeft = hiderWidth - 1;\n      } else if (guidelineLeft === 0) {\n        // guideline has got `margin-left: -1px` as default\n        guidelineLeft = 1;\n      } else if (scrollableElement.scrollX !== void 0 && priv.coordsColumn < priv.fixedColumns) {\n        guidelineLeft -= priv.rootElementOffset <= scrollableElement.scrollX ? priv.rootElementOffset : 0;\n      }\n\n      this.backlight.setPosition(null, backlightLeft);\n      this.guideline.setPosition(null, guidelineLeft);\n    }\n\n    /**\n     * This method checks arrayMap from columnsMapper and updates the columnsMapper if it's necessary.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'updateColumnsMapper',\n    value: function updateColumnsMapper() {\n      var countCols = this.hot.countSourceCols();\n      var columnsMapperLen = this.columnsMapper._arrayMap.length;\n\n      if (columnsMapperLen === 0) {\n        this.columnsMapper.createMap(countCols || this.hot.getSettings().startCols);\n      } else if (columnsMapperLen < countCols) {\n        var diff = countCols - columnsMapperLen;\n\n        this.columnsMapper.insertItems(columnsMapperLen, diff);\n      } else if (columnsMapperLen > countCols) {\n        var maxIndex = countCols - 1;\n        var columnsToRemove = [];\n\n        (0, _array.arrayEach)(this.columnsMapper._arrayMap, function (value, index) {\n          if (value > maxIndex) {\n            columnsToRemove.push(index);\n          }\n        });\n\n        this.columnsMapper.removeItems(columnsToRemove);\n      }\n    }\n\n    /**\n     * Bind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this4 = this;\n\n      this.eventManager.addEventListener(document.documentElement, 'mousemove', function (event) {\n        return _this4.onMouseMove(event);\n      });\n      this.eventManager.addEventListener(document.documentElement, 'mouseup', function () {\n        return _this4.onMouseUp();\n      });\n    }\n\n    /**\n     * Unbind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'unregisterEvents',\n    value: function unregisterEvents() {\n      this.eventManager.clear();\n    }\n\n    /**\n     * Change the behavior of selection / dragging.\n     *\n     * @private\n     * @param {MouseEvent} event `mousedown` event properties.\n     * @param {CellCoords} coords Visual cell coordinates where was fired event.\n     * @param {HTMLElement} TD Cell represented as HTMLElement.\n     * @param {Object} blockCalculations Object which contains information about blockCalculation for row, column or cells.\n     */\n\n  }, {\n    key: 'onBeforeOnCellMouseDown',\n    value: function onBeforeOnCellMouseDown(event, coords, TD, blockCalculations) {\n      var wtTable = this.hot.view.wt.wtTable;\n      var isHeaderSelection = this.hot.selection.isSelectedByColumnHeader();\n      var selection = this.hot.getSelectedRangeLast();\n      var priv = privatePool.get(this);\n      var isSortingElement = event.realTarget.className.indexOf('columnSorting') > -1;\n\n      if (!selection || !isHeaderSelection || priv.pressed || event.button !== 0 || isSortingElement) {\n        priv.pressed = false;\n        priv.columnsToMove.length = 0;\n        (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI]);\n        return;\n      }\n\n      var guidelineIsNotReady = this.guideline.isBuilt() && !this.guideline.isAppended();\n      var backlightIsNotReady = this.backlight.isBuilt() && !this.backlight.isAppended();\n\n      if (guidelineIsNotReady && backlightIsNotReady) {\n        this.guideline.appendTo(wtTable.hider);\n        this.backlight.appendTo(wtTable.hider);\n      }\n\n      var from = selection.from,\n          to = selection.to;\n\n      var start = Math.min(from.col, to.col);\n      var end = Math.max(from.col, to.col);\n\n      if (coords.row < 0 && coords.col >= start && coords.col <= end) {\n        blockCalculations.column = true;\n        priv.pressed = true;\n        priv.target.eventPageX = event.pageX;\n        priv.coordsColumn = coords.col;\n        priv.target.TD = TD;\n        priv.target.col = coords.col;\n        priv.columnsToMove = this.prepareColumnsToMoving(start, end);\n        priv.hasRowHeaders = !!this.hot.getSettings().rowHeaders;\n        priv.countCols = this.hot.countCols();\n        priv.fixedColumns = this.hot.getSettings().fixedColumnsLeft;\n        priv.rootElementOffset = (0, _element.offset)(this.hot.rootElement).left;\n\n        var countColumnsFrom = priv.hasRowHeaders ? -1 : 0;\n        var topPos = wtTable.holder.scrollTop + wtTable.getColumnHeaderHeight(0) + 1;\n        var fixedColumns = coords.col < priv.fixedColumns;\n        var scrollableElement = this.hot.view.wt.wtOverlays.scrollableElement;\n        var wrapperIsWindow = scrollableElement.scrollX ? scrollableElement.scrollX - priv.rootElementOffset : 0;\n\n        var mouseOffset = event.layerX - (fixedColumns ? wrapperIsWindow : 0);\n        var leftOffset = Math.abs(this.getColumnsWidth(start, coords.col) + mouseOffset);\n\n        this.backlight.setPosition(topPos, this.getColumnsWidth(countColumnsFrom, start) + leftOffset);\n        this.backlight.setSize(this.getColumnsWidth(start, end + 1), wtTable.hider.offsetHeight - topPos);\n        this.backlight.setOffset(null, leftOffset * -1);\n\n        (0, _element.addClass)(this.hot.rootElement, CSS_ON_MOVING);\n      } else {\n        (0, _element.removeClass)(this.hot.rootElement, CSS_AFTER_SELECTION);\n        priv.pressed = false;\n        priv.columnsToMove.length = 0;\n      }\n    }\n\n    /**\n     * 'mouseMove' event callback. Fired when pointer move on document.documentElement.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var priv = privatePool.get(this);\n\n      if (!priv.pressed) {\n        return;\n      }\n\n      // callback for browser which doesn't supports CSS pointer-event: none\n      if (event.realTarget === this.backlight.element) {\n        var width = this.backlight.getSize().width;\n        this.backlight.setSize(0);\n\n        setTimeout(function () {\n          this.backlight.setPosition(width);\n        });\n      }\n\n      priv.target.eventPageX = event.pageX;\n      this.refreshPositions();\n    }\n\n    /**\n     * 'beforeOnCellMouseOver' hook callback. Fired when pointer was over cell.\n     *\n     * @private\n     * @param {MouseEvent} event `mouseover` event properties.\n     * @param {CellCoords} coords Visual cell coordinates where was fired event.\n     * @param {HTMLElement} TD Cell represented as HTMLElement.\n     * @param {Object} blockCalculations Object which contains information about blockCalculation for row, column or cells.\n     */\n\n  }, {\n    key: 'onBeforeOnCellMouseOver',\n    value: function onBeforeOnCellMouseOver(event, coords, TD, blockCalculations) {\n      var selectedRange = this.hot.getSelectedRangeLast();\n      var priv = privatePool.get(this);\n\n      if (!selectedRange || !priv.pressed) {\n        return;\n      }\n\n      if (priv.columnsToMove.indexOf(coords.col) > -1) {\n        (0, _element.removeClass)(this.hot.rootElement, CSS_SHOW_UI);\n      } else {\n        (0, _element.addClass)(this.hot.rootElement, CSS_SHOW_UI);\n      }\n\n      blockCalculations.row = true;\n      blockCalculations.column = true;\n      blockCalculations.cell = true;\n      priv.coordsColumn = coords.col;\n      priv.target.TD = TD;\n    }\n\n    /**\n     * `onMouseUp` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      var priv = privatePool.get(this);\n\n      priv.coordsColumn = void 0;\n      priv.pressed = false;\n      priv.backlightWidth = 0;\n\n      (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI, CSS_AFTER_SELECTION]);\n\n      if (this.hot.selection.isSelectedByColumnHeader()) {\n        (0, _element.addClass)(this.hot.rootElement, CSS_AFTER_SELECTION);\n      }\n      if (priv.columnsToMove.length < 1 || priv.target.col === void 0 || priv.columnsToMove.indexOf(priv.target.col) > -1) {\n        return;\n      }\n\n      this.moveColumns(priv.columnsToMove, priv.target.col);\n      this.persistentStateSave();\n      this.hot.render();\n      this.hot.view.wt.wtOverlays.adjustElementsSize(true);\n\n      if (!priv.disallowMoving) {\n        var selectionStart = this.columnsMapper.getIndexByValue(priv.columnsToMove[0]);\n        var selectionEnd = this.columnsMapper.getIndexByValue(priv.columnsToMove[priv.columnsToMove.length - 1]);\n        this.changeSelection(selectionStart, selectionEnd);\n      }\n\n      priv.columnsToMove.length = 0;\n    }\n\n    /**\n     * `afterScrollHorizontally` hook callback. Fired the table was scrolled horizontally.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterScrollVertically',\n    value: function onAfterScrollVertically() {\n      var wtTable = this.hot.view.wt.wtTable;\n      var headerHeight = wtTable.getColumnHeaderHeight(0) + 1;\n      var scrollTop = wtTable.holder.scrollTop;\n      var posTop = headerHeight + scrollTop;\n\n      this.backlight.setPosition(posTop);\n      this.backlight.setSize(null, wtTable.hider.offsetHeight - posTop);\n    }\n\n    /**\n     * `afterCreateCol` hook callback.\n     *\n     * @private\n     * @param {Number} index Visual index of the created column.\n     * @param {Number} amount Amount of created columns.\n     */\n\n  }, {\n    key: 'onAfterCreateCol',\n    value: function onAfterCreateCol(index, amount) {\n      this.columnsMapper.shiftItems(index, amount);\n    }\n\n    /**\n     * On before remove column listener.\n     *\n     * @private\n     * @param {Number} index Visual column index.\n     * @param {Number} amount Defines how many columns removed.\n     */\n\n  }, {\n    key: 'onBeforeRemoveCol',\n    value: function onBeforeRemoveCol(index, amount) {\n      var _this5 = this;\n\n      this.removedColumns.length = 0;\n\n      if (index !== false) {\n        // Collect physical row index.\n        (0, _number.rangeEach)(index, index + amount - 1, function (removedIndex) {\n          _this5.removedColumns.push(_this5.hot.runHooks('modifyCol', removedIndex, _this5.pluginName));\n        });\n      }\n    }\n\n    /**\n     * `afterRemoveCol` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterRemoveCol',\n    value: function onAfterRemoveCol() {\n      this.columnsMapper.unshiftItems(this.removedColumns);\n    }\n\n    /**\n     * `afterLoadData` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData() {\n      this.updateColumnsMapper();\n    }\n\n    /**\n     * 'modifyRow' hook callback.\n     *\n     * @private\n     * @param {Number} column Visual column index.\n     * @returns {Number} Physical column index.\n     */\n\n  }, {\n    key: 'onModifyCol',\n    value: function onModifyCol(column, source) {\n      if (source !== this.pluginName) {\n        // ugly fix for try to insert new, needed columns after pasting data\n        var columnInMapper = this.columnsMapper.getValueByIndex(column);\n        column = columnInMapper === null ? column : columnInMapper;\n      }\n\n      return column;\n    }\n\n    /**\n     * 'unmodifyCol' hook callback.\n     *\n     * @private\n     * @param {Number} column Physical column index.\n     * @returns {Number} Visual column index.\n     */\n\n  }, {\n    key: 'onUnmodifyCol',\n    value: function onUnmodifyCol(column) {\n      var indexInMapper = this.columnsMapper.getIndexByValue(column);\n\n      return indexInMapper === null ? column : indexInMapper;\n    }\n\n    /**\n     * `afterPluginsInitialized` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterPluginsInitialized',\n    value: function onAfterPluginsInitialized() {\n      this.updateColumnsMapper();\n      this.initialSettings();\n      this.backlight.build();\n      this.guideline.build();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.backlight.destroy();\n      this.guideline.destroy();\n\n      _get(ManualColumnMove.prototype.__proto__ || Object.getPrototypeOf(ManualColumnMove.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return ManualColumnMove;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('ManualColumnMove', ManualColumnMove);\n\nexports.default = ManualColumnMove;\n\n/***/ }),\n/* 455 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _arrayMapper = __webpack_require__(321);\n\nvar _arrayMapper2 = _interopRequireDefault(_arrayMapper);\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class ColumnsMapper\n * @plugin ManualColumnMove\n */\nvar ColumnsMapper = function () {\n  function ColumnsMapper(manualColumnMove) {\n    _classCallCheck(this, ColumnsMapper);\n\n    /**\n     * Instance of ManualColumnMove plugin.\n     *\n     * @type {ManualColumnMove}\n     */\n    this.manualColumnMove = manualColumnMove;\n  }\n\n  /**\n   * Reset current map array and create new one.\n   *\n   * @param {Number} [length] Custom generated map length.\n   */\n\n\n  _createClass(ColumnsMapper, [{\n    key: 'createMap',\n    value: function createMap(length) {\n      var _this = this;\n\n      var originLength = length === void 0 ? this._arrayMap.length : length;\n\n      this._arrayMap.length = 0;\n\n      (0, _number.rangeEach)(originLength - 1, function (itemIndex) {\n        _this._arrayMap[itemIndex] = itemIndex;\n      });\n    }\n\n    /**\n     * Destroy class.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this._arrayMap = null;\n    }\n\n    /**\n     * Moving elements in columnsMapper.\n     *\n     * @param {Number} from Column index to move.\n     * @param {Number} to Target index.\n     */\n\n  }, {\n    key: 'moveColumn',\n    value: function moveColumn(from, to) {\n      var indexToMove = this._arrayMap[from];\n      this._arrayMap[from] = null;\n      this._arrayMap.splice(to, 0, indexToMove);\n    }\n\n    /**\n     * Clearing arrayMap from `null` entries.\n     */\n\n  }, {\n    key: 'clearNull',\n    value: function clearNull() {\n      this._arrayMap = (0, _array.arrayFilter)(this._arrayMap, function (i) {\n        return i !== null;\n      });\n    }\n  }]);\n\n  return ColumnsMapper;\n}();\n\n(0, _object.mixin)(ColumnsMapper, _arrayMapper2.default);\n\nexports.default = ColumnsMapper;\n\n/***/ }),\n/* 456 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(322);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CSS_CLASSNAME = 'ht__manualColumnMove--backlight';\n\n/**\n * @class BacklightUI\n * @util\n */\n\nvar BacklightUI = function (_BaseUI) {\n  _inherits(BacklightUI, _BaseUI);\n\n  function BacklightUI() {\n    _classCallCheck(this, BacklightUI);\n\n    return _possibleConstructorReturn(this, (BacklightUI.__proto__ || Object.getPrototypeOf(BacklightUI)).apply(this, arguments));\n  }\n\n  _createClass(BacklightUI, [{\n    key: 'build',\n\n    /**\n     * Custom className on build process.\n     */\n    value: function build() {\n      _get(BacklightUI.prototype.__proto__ || Object.getPrototypeOf(BacklightUI.prototype), 'build', this).call(this);\n\n      (0, _element.addClass)(this._element, CSS_CLASSNAME);\n    }\n  }]);\n\n  return BacklightUI;\n}(_base2.default);\n\nexports.default = BacklightUI;\n\n/***/ }),\n/* 457 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(322);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CSS_CLASSNAME = 'ht__manualColumnMove--guideline';\n\n/**\n * @class GuidelineUI\n * @util\n */\n\nvar GuidelineUI = function (_BaseUI) {\n  _inherits(GuidelineUI, _BaseUI);\n\n  function GuidelineUI() {\n    _classCallCheck(this, GuidelineUI);\n\n    return _possibleConstructorReturn(this, (GuidelineUI.__proto__ || Object.getPrototypeOf(GuidelineUI)).apply(this, arguments));\n  }\n\n  _createClass(GuidelineUI, [{\n    key: 'build',\n\n    /**\n     * Custom className on build process.\n     */\n    value: function build() {\n      _get(GuidelineUI.prototype.__proto__ || Object.getPrototypeOf(GuidelineUI.prototype), 'build', this).call(this);\n\n      (0, _element.addClass)(this._element, CSS_CLASSNAME);\n    }\n  }]);\n\n  return GuidelineUI;\n}(_base2.default);\n\nexports.default = GuidelineUI;\n\n/***/ }),\n/* 458 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 459 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _event = __webpack_require__(12);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// Developer note! Whenever you make a change in this file, make an analogous change in manualRowResize.js\n\n/**\n * @description\n * ManualColumnResize Plugin.\n *\n * Has 2 UI components:\n * - handle - the draggable element that sets the desired width of the column.\n * - guide - the helper guide that shows the desired width as a vertical guide.\n *\n * @plugin ManualColumnResize\n */\nvar ManualColumnResize = function (_BasePlugin) {\n  _inherits(ManualColumnResize, _BasePlugin);\n\n  function ManualColumnResize(hotInstance) {\n    _classCallCheck(this, ManualColumnResize);\n\n    var _this = _possibleConstructorReturn(this, (ManualColumnResize.__proto__ || Object.getPrototypeOf(ManualColumnResize)).call(this, hotInstance));\n\n    _this.currentTH = null;\n    _this.currentCol = null;\n    _this.selectedCols = [];\n    _this.currentWidth = null;\n    _this.newSize = null;\n    _this.startY = null;\n    _this.startWidth = null;\n    _this.startOffset = null;\n    _this.handle = document.createElement('DIV');\n    _this.guide = document.createElement('DIV');\n    _this.eventManager = new _eventManager2.default(_this);\n    _this.pressed = null;\n    _this.dblclick = 0;\n    _this.autoresizeTimeout = null;\n    _this.manualColumnWidths = [];\n\n    (0, _element.addClass)(_this.handle, 'manualColumnResizer');\n    (0, _element.addClass)(_this.guide, 'manualColumnResizerGuide');\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualColumnResize, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().manualColumnResize;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.manualColumnWidths = [];\n      var initialColumnWidth = this.hot.getSettings().manualColumnResize;\n      var loadedManualColumnWidths = this.loadManualColumnWidths();\n\n      this.addHook('modifyColWidth', function (width, col) {\n        return _this2.onModifyColWidth(width, col);\n      });\n      this.addHook('beforeStretchingColumnWidth', function (stretchedWidth, column) {\n        return _this2.onBeforeStretchingColumnWidth(stretchedWidth, column);\n      });\n      this.addHook('beforeColumnResize', function (currentColumn, newSize, isDoubleClick) {\n        return _this2.onBeforeColumnResize(currentColumn, newSize, isDoubleClick);\n      });\n\n      if (typeof loadedManualColumnWidths != 'undefined') {\n        this.manualColumnWidths = loadedManualColumnWidths;\n      } else if (Array.isArray(initialColumnWidth)) {\n        this.manualColumnWidths = initialColumnWidth;\n      } else {\n        this.manualColumnWidths = [];\n      }\n\n      // Handsontable.hooks.register('beforeColumnResize');\n      // Handsontable.hooks.register('afterColumnResize');\n\n      this.bindEvents();\n\n      _get(ManualColumnResize.prototype.__proto__ || Object.getPrototypeOf(ManualColumnResize.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      var initialColumnWidth = this.hot.getSettings().manualColumnResize;\n\n      if (Array.isArray(initialColumnWidth)) {\n        this.manualColumnWidths = initialColumnWidth;\n      } else if (!initialColumnWidth) {\n        this.manualColumnWidths = [];\n      }\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(ManualColumnResize.prototype.__proto__ || Object.getPrototypeOf(ManualColumnResize.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Save the current sizes using the persistentState plugin.\n     */\n\n  }, {\n    key: 'saveManualColumnWidths',\n    value: function saveManualColumnWidths() {\n      this.hot.runHooks('persistentStateSave', 'manualColumnWidths', this.manualColumnWidths);\n    }\n\n    /**\n     * Load the previously saved sizes using the persistentState plugin.\n     *\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'loadManualColumnWidths',\n    value: function loadManualColumnWidths() {\n      var storedState = {};\n\n      this.hot.runHooks('persistentStateLoad', 'manualColumnWidths', storedState);\n\n      return storedState.value;\n    }\n\n    /**\n     * Set the resize handle position.\n     *\n     * @param {HTMLCellElement} TH TH HTML element.\n     */\n\n  }, {\n    key: 'setupHandlePosition',\n    value: function setupHandlePosition(TH) {\n      var _this3 = this;\n\n      if (!TH.parentNode) {\n        return false;\n      }\n\n      this.currentTH = TH;\n\n      var col = this.hot.view.wt.wtTable.getCoords(TH).col; // getCoords returns CellCoords\n      var headerHeight = (0, _element.outerHeight)(this.currentTH);\n\n      if (col >= 0) {\n        // if not col header\n        var box = this.currentTH.getBoundingClientRect();\n\n        this.currentCol = col;\n        this.selectedCols = [];\n\n        if (this.hot.selection.isSelected() && this.hot.selection.isSelectedByColumnHeader()) {\n          var _hot$getSelectedRange = this.hot.getSelectedRangeLast(),\n              from = _hot$getSelectedRange.from,\n              to = _hot$getSelectedRange.to;\n\n          var start = from.col;\n          var end = to.col;\n\n          if (start >= end) {\n            start = to.col;\n            end = from.col;\n          }\n\n          if (this.currentCol >= start && this.currentCol <= end) {\n            (0, _number.rangeEach)(start, end, function (i) {\n              return _this3.selectedCols.push(i);\n            });\n          } else {\n            this.selectedCols.push(this.currentCol);\n          }\n        } else {\n          this.selectedCols.push(this.currentCol);\n        }\n\n        this.startOffset = box.left - 6;\n        this.startWidth = parseInt(box.width, 10);\n        this.handle.style.top = box.top + 'px';\n        this.handle.style.left = this.startOffset + this.startWidth + 'px';\n        this.handle.style.height = headerHeight + 'px';\n        this.hot.rootElement.appendChild(this.handle);\n      }\n    }\n\n    /**\n     * Refresh the resize handle position.\n     */\n\n  }, {\n    key: 'refreshHandlePosition',\n    value: function refreshHandlePosition() {\n      this.handle.style.left = this.startOffset + this.currentWidth + 'px';\n    }\n\n    /**\n     * Set the resize guide position.\n     */\n\n  }, {\n    key: 'setupGuidePosition',\n    value: function setupGuidePosition() {\n      var handleHeight = parseInt((0, _element.outerHeight)(this.handle), 10);\n      var handleBottomPosition = parseInt(this.handle.style.top, 10) + handleHeight;\n      var maximumVisibleElementHeight = parseInt(this.hot.view.maximumVisibleElementHeight(0), 10);\n\n      (0, _element.addClass)(this.handle, 'active');\n      (0, _element.addClass)(this.guide, 'active');\n\n      this.guide.style.top = handleBottomPosition + 'px';\n      this.guide.style.left = this.handle.style.left;\n      this.guide.style.height = maximumVisibleElementHeight - handleHeight + 'px';\n      this.hot.rootElement.appendChild(this.guide);\n    }\n\n    /**\n     * Refresh the resize guide position.\n     */\n\n  }, {\n    key: 'refreshGuidePosition',\n    value: function refreshGuidePosition() {\n      this.guide.style.left = this.handle.style.left;\n    }\n\n    /**\n     * Hide both the resize handle and resize guide.\n     */\n\n  }, {\n    key: 'hideHandleAndGuide',\n    value: function hideHandleAndGuide() {\n      (0, _element.removeClass)(this.handle, 'active');\n      (0, _element.removeClass)(this.guide, 'active');\n    }\n\n    /**\n     * Check if provided element is considered a column header.\n     *\n     * @param {HTMLElement} element HTML element.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'checkIfColumnHeader',\n    value: function checkIfColumnHeader(element) {\n      if (element != this.hot.rootElement) {\n        var parent = element.parentNode;\n\n        if (parent.tagName === 'THEAD') {\n          return true;\n        }\n\n        return this.checkIfColumnHeader(parent);\n      }\n\n      return false;\n    }\n\n    /**\n     * Get the TH element from the provided element.\n     *\n     * @param {HTMLElement} element HTML element.\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'getTHFromTargetElement',\n    value: function getTHFromTargetElement(element) {\n      if (element.tagName != 'TABLE') {\n        if (element.tagName == 'TH') {\n          return element;\n        }\n        return this.getTHFromTargetElement(element.parentNode);\n      }\n\n      return null;\n    }\n\n    /**\n     * 'mouseover' event callback - set the handle position.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseOver',\n    value: function onMouseOver(event) {\n      if (this.checkIfColumnHeader(event.target)) {\n        var th = this.getTHFromTargetElement(event.target);\n\n        if (!th) {\n          return;\n        }\n\n        var colspan = th.getAttribute('colspan');\n\n        if (th && (colspan === null || colspan === 1)) {\n          if (!this.pressed) {\n            this.setupHandlePosition(th);\n          }\n        }\n      }\n    }\n\n    /**\n     * Auto-size row after doubleclick - callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'afterMouseDownTimeout',\n    value: function afterMouseDownTimeout() {\n      var _this4 = this;\n\n      var render = function render() {\n        _this4.hot.forceFullRender = true;\n        _this4.hot.view.render(); // updates all\n        _this4.hot.view.wt.wtOverlays.adjustElementsSize(true);\n      };\n      var resize = function resize(selectedCol, forceRender) {\n        var hookNewSize = _this4.hot.runHooks('beforeColumnResize', selectedCol, _this4.newSize, true);\n\n        if (hookNewSize !== void 0) {\n          _this4.newSize = hookNewSize;\n        }\n\n        if (_this4.hot.getSettings().stretchH === 'all') {\n          _this4.clearManualSize(selectedCol);\n        } else {\n          _this4.setManualSize(selectedCol, _this4.newSize); // double click sets by auto row size plugin\n        }\n\n        if (forceRender) {\n          render();\n        }\n\n        _this4.saveManualColumnWidths();\n\n        _this4.hot.runHooks('afterColumnResize', selectedCol, _this4.newSize, true);\n      };\n\n      if (this.dblclick >= 2) {\n        var selectedColsLength = this.selectedCols.length;\n\n        if (selectedColsLength > 1) {\n          (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n            resize(selectedCol);\n          });\n          render();\n        } else {\n          (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n            resize(selectedCol, true);\n          });\n        }\n      }\n      this.dblclick = 0;\n      this.autoresizeTimeout = null;\n    }\n\n    /**\n     * 'mousedown' event callback.\n     *\n     * @private\n     * @param {MouseEvent} e\n     */\n\n  }, {\n    key: 'onMouseDown',\n    value: function onMouseDown(event) {\n      var _this5 = this;\n\n      if ((0, _element.hasClass)(event.target, 'manualColumnResizer')) {\n        this.setupGuidePosition();\n        this.pressed = this.hot;\n\n        if (this.autoresizeTimeout === null) {\n          this.autoresizeTimeout = setTimeout(function () {\n            return _this5.afterMouseDownTimeout();\n          }, 500);\n\n          this.hot._registerTimeout(this.autoresizeTimeout);\n        }\n        this.dblclick++;\n\n        this.startX = (0, _event.pageX)(event);\n        this.newSize = this.startWidth;\n      }\n    }\n\n    /**\n     * 'mousemove' event callback - refresh the handle and guide positions, cache the new column width.\n     *\n     * @private\n     * @param {MouseEvent} e\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var _this6 = this;\n\n      if (this.pressed) {\n        this.currentWidth = this.startWidth + ((0, _event.pageX)(event) - this.startX);\n\n        (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n          _this6.newSize = _this6.setManualSize(selectedCol, _this6.currentWidth);\n        });\n\n        this.refreshHandlePosition();\n        this.refreshGuidePosition();\n      }\n    }\n\n    /**\n     * 'mouseup' event callback - apply the column resizing.\n     *\n     * @private\n     * @param {MouseEvent} e\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp(event) {\n      var _this7 = this;\n\n      var render = function render() {\n        _this7.hot.forceFullRender = true;\n        _this7.hot.view.render(); // updates all\n        _this7.hot.view.wt.wtOverlays.adjustElementsSize(true);\n      };\n      var resize = function resize(selectedCol, forceRender) {\n        _this7.hot.runHooks('beforeColumnResize', selectedCol, _this7.newSize);\n\n        if (forceRender) {\n          render();\n        }\n\n        _this7.saveManualColumnWidths();\n\n        _this7.hot.runHooks('afterColumnResize', selectedCol, _this7.newSize);\n      };\n\n      if (this.pressed) {\n        this.hideHandleAndGuide();\n        this.pressed = false;\n\n        if (this.newSize != this.startWidth) {\n          var selectedColsLength = this.selectedCols.length;\n\n          if (selectedColsLength > 1) {\n            (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n              resize(selectedCol);\n            });\n            render();\n          } else {\n            (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n              resize(selectedCol, true);\n            });\n          }\n        }\n\n        this.setupHandlePosition(this.currentTH);\n      }\n    }\n\n    /**\n     * Bind the mouse events.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'bindEvents',\n    value: function bindEvents() {\n      var _this8 = this;\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'mouseover', function (e) {\n        return _this8.onMouseOver(e);\n      });\n      this.eventManager.addEventListener(this.hot.rootElement, 'mousedown', function (e) {\n        return _this8.onMouseDown(e);\n      });\n      this.eventManager.addEventListener(window, 'mousemove', function (e) {\n        return _this8.onMouseMove(e);\n      });\n      this.eventManager.addEventListener(window, 'mouseup', function (e) {\n        return _this8.onMouseUp(e);\n      });\n    }\n\n    /**\n     * Cache the current column width.\n     *\n     * @param {Number} column Visual column index.\n     * @param {Number} width Column width.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'setManualSize',\n    value: function setManualSize(column, width) {\n      width = Math.max(width, 20);\n\n      /**\n       *  We need to run col through modifyCol hook, in case the order of displayed columns is different than the order\n       *  in data source. For instance, this order can be modified by manualColumnMove plugin.\n       */\n      column = this.hot.runHooks('modifyCol', column);\n\n      this.manualColumnWidths[column] = width;\n\n      return width;\n    }\n\n    /**\n     * Clear cache for the current column index.\n     *\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'clearManualSize',\n    value: function clearManualSize(column) {\n      column = this.hot.runHooks('modifyCol', column);\n\n      this.manualColumnWidths[column] = void 0;\n    }\n\n    /**\n     * Modify the provided column width, based on the plugin settings\n     *\n     * @private\n     * @param {Number} width Column width.\n     * @param {Number} column Visual column index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onModifyColWidth',\n    value: function onModifyColWidth(width, column) {\n      if (this.enabled) {\n        column = this.hot.runHooks('modifyCol', column);\n\n        if (this.hot.getSettings().manualColumnResize && this.manualColumnWidths[column]) {\n          return this.manualColumnWidths[column];\n        }\n      }\n\n      return width;\n    }\n\n    /**\n     * Modify the provided column stretched width. This hook decides if specified column should be stretched or not.\n     *\n     * @private\n     * @param {Number} stretchedWidth Stretched width.\n     * @param {Number} column Physical column index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onBeforeStretchingColumnWidth',\n    value: function onBeforeStretchingColumnWidth(stretchedWidth, column) {\n      var width = this.manualColumnWidths[column];\n\n      if (width === void 0) {\n        width = stretchedWidth;\n      }\n\n      return width;\n    }\n\n    /**\n     * `beforeColumnResize` hook callback.\n     *\n     * @private\n     * @param {Number} currentColumn Index of the resized column.\n     * @param {Number} newSize Calculated new column width.\n     * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n     */\n\n  }, {\n    key: 'onBeforeColumnResize',\n    value: function onBeforeColumnResize() {\n      // clear the header height cache information\n      this.hot.view.wt.wtViewport.hasOversizedColumnHeadersMarked = {};\n    }\n  }]);\n\n  return ManualColumnResize;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('manualColumnResize', ManualColumnResize);\n\nexports.default = ManualColumnResize;\n\n/***/ }),\n/* 460 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _element = __webpack_require__(0);\n\nvar _number = __webpack_require__(5);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nvar _rowsMapper = __webpack_require__(461);\n\nvar _rowsMapper2 = _interopRequireDefault(_rowsMapper);\n\nvar _backlight = __webpack_require__(462);\n\nvar _backlight2 = _interopRequireDefault(_backlight);\n\nvar _guideline = __webpack_require__(463);\n\nvar _guideline2 = _interopRequireDefault(_guideline);\n\nvar _src = __webpack_require__(4);\n\n__webpack_require__(464);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('beforeRowMove');\n_pluginHooks2.default.getSingleton().register('afterRowMove');\n_pluginHooks2.default.getSingleton().register('unmodifyRow');\n\nvar privatePool = new WeakMap();\nvar CSS_PLUGIN = 'ht__manualRowMove';\nvar CSS_SHOW_UI = 'show-ui';\nvar CSS_ON_MOVING = 'on-moving--rows';\nvar CSS_AFTER_SELECTION = 'after-selection--rows';\n\n/**\n * @plugin ManualRowMove\n *\n * @description\n * This plugin allows to change rows order.\n *\n * API:\n * - moveRow - move single row to the new position.\n * - moveRows - move many rows (as an array of indexes) to the new position.\n *\n * If you want apply visual changes, you have to call manually the render() method on the instance of handsontable.\n *\n * UI components:\n * - backlight - highlight of selected rows.\n * - guideline - line which shows where rows has been moved.\n *\n * @class ManualRowMove\n * @plugin ManualRowMove\n */\n\nvar ManualRowMove = function (_BasePlugin) {\n  _inherits(ManualRowMove, _BasePlugin);\n\n  function ManualRowMove(hotInstance) {\n    _classCallCheck(this, ManualRowMove);\n\n    /**\n     * Set up WeakMap of plugin to sharing private parameters;\n     */\n    var _this = _possibleConstructorReturn(this, (ManualRowMove.__proto__ || Object.getPrototypeOf(ManualRowMove)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      rowsToMove: [],\n      pressed: void 0,\n      disallowMoving: void 0,\n      target: {\n        eventPageY: void 0,\n        coords: void 0,\n        TD: void 0,\n        row: void 0\n      }\n    });\n\n    /**\n     * List of last removed row indexes.\n     *\n     * @type {Array}\n     */\n    _this.removedRows = [];\n    /**\n     * Object containing visual row indexes mapped to data source indexes.\n     *\n     * @type {RowsMapper}\n     */\n    _this.rowsMapper = new _rowsMapper2.default(_this);\n    /**\n     * Event Manager object.\n     *\n     * @type {Object}\n     */\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Backlight UI object.\n     *\n     * @type {Object}\n     */\n    _this.backlight = new _backlight2.default(hotInstance);\n    /**\n     * Guideline UI object.\n     *\n     * @type {Object}\n     */\n    _this.guideline = new _guideline2.default(hotInstance);\n    return _this;\n  }\n\n  /**\n   * Check if plugin is enabled.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualRowMove, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().manualRowMove;\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('beforeOnCellMouseDown', function (event, coords, TD, blockCalculations) {\n        return _this2.onBeforeOnCellMouseDown(event, coords, TD, blockCalculations);\n      });\n      this.addHook('beforeOnCellMouseOver', function (event, coords, TD, blockCalculations) {\n        return _this2.onBeforeOnCellMouseOver(event, coords, TD, blockCalculations);\n      });\n      this.addHook('afterScrollHorizontally', function () {\n        return _this2.onAfterScrollHorizontally();\n      });\n      this.addHook('modifyRow', function (row, source) {\n        return _this2.onModifyRow(row, source);\n      });\n      this.addHook('beforeRemoveRow', function (index, amount) {\n        return _this2.onBeforeRemoveRow(index, amount);\n      });\n      this.addHook('afterRemoveRow', function () {\n        return _this2.onAfterRemoveRow();\n      });\n      this.addHook('afterCreateRow', function (index, amount) {\n        return _this2.onAfterCreateRow(index, amount);\n      });\n      this.addHook('afterLoadData', function () {\n        return _this2.onAfterLoadData();\n      });\n      this.addHook('beforeColumnSort', function (column, order) {\n        return _this2.onBeforeColumnSort(column, order);\n      });\n      this.addHook('unmodifyRow', function (row) {\n        return _this2.onUnmodifyRow(row);\n      });\n\n      this.registerEvents();\n\n      // TODO: move adding plugin classname to BasePlugin.\n      (0, _element.addClass)(this.hot.rootElement, CSS_PLUGIN);\n\n      _get(ManualRowMove.prototype.__proto__ || Object.getPrototypeOf(ManualRowMove.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      this.onAfterPluginsInitialized();\n\n      _get(ManualRowMove.prototype.__proto__ || Object.getPrototypeOf(ManualRowMove.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      var pluginSettings = this.hot.getSettings().manualRowMove;\n\n      if (Array.isArray(pluginSettings)) {\n        this.rowsMapper.clearMap();\n      }\n\n      (0, _element.removeClass)(this.hot.rootElement, CSS_PLUGIN);\n\n      this.unregisterEvents();\n      this.backlight.destroy();\n      this.guideline.destroy();\n\n      _get(ManualRowMove.prototype.__proto__ || Object.getPrototypeOf(ManualRowMove.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Move a single row.\n     *\n     * @param {Number} row Visual row index to be moved.\n     * @param {Number} target Visual row index being a target for the moved row.\n     */\n\n  }, {\n    key: 'moveRow',\n    value: function moveRow(row, target) {\n      this.moveRows([row], target);\n    }\n\n    /**\n     * Move multiple rows.\n     *\n     * @param {Array} rows Array of visual row indexes to be moved.\n     * @param {Number} target Visual row index being a target for the moved rows.\n     */\n\n  }, {\n    key: 'moveRows',\n    value: function moveRows(rows, target) {\n      var _this3 = this;\n\n      var visualRows = [].concat(_toConsumableArray(rows));\n      var priv = privatePool.get(this);\n      var beforeMoveHook = this.hot.runHooks('beforeRowMove', visualRows, target);\n\n      priv.disallowMoving = beforeMoveHook === false;\n\n      if (!priv.disallowMoving) {\n        // first we need to rewrite an visual indexes to physical for save reference after move\n        (0, _array.arrayEach)(rows, function (row, index, array) {\n          array[index] = _this3.rowsMapper.getValueByIndex(row);\n        });\n\n        // next, when we have got an physical indexes, we can move rows\n        (0, _array.arrayEach)(rows, function (row, index) {\n          var actualPosition = _this3.rowsMapper.getIndexByValue(row);\n\n          if (actualPosition !== target) {\n            _this3.rowsMapper.moveRow(actualPosition, target + index);\n          }\n        });\n\n        // after moving we have to clear rowsMapper from null entries\n        this.rowsMapper.clearNull();\n      }\n\n      this.hot.runHooks('afterRowMove', visualRows, target);\n    }\n\n    /**\n     * Correct the cell selection after the move action. Fired only when action was made with a mouse.\n     * That means that changing the row order using the API won't correct the selection.\n     *\n     * @private\n     * @param {Number} startRow Visual row index for the start of the selection.\n     * @param {Number} endRow Visual row index for the end of the selection.\n     */\n\n  }, {\n    key: 'changeSelection',\n    value: function changeSelection(startRow, endRow) {\n      this.hot.selectRows(startRow, endRow);\n    }\n\n    /**\n     * Get the sum of the heights of rows in the provided range.\n     *\n     * @private\n     * @param {Number} from Visual row index.\n     * @param {Number} to Visual row index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getRowsHeight',\n    value: function getRowsHeight(from, to) {\n      var height = 0;\n\n      for (var i = from; i < to; i++) {\n        var rowHeight = this.hot.view.wt.wtTable.getRowHeight(i) || 23;\n\n        height += rowHeight;\n      }\n\n      return height;\n    }\n\n    /**\n     * Load initial settings when persistent state is saved or when plugin was initialized as an array.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'initialSettings',\n    value: function initialSettings() {\n      var pluginSettings = this.hot.getSettings().manualRowMove;\n\n      if (Array.isArray(pluginSettings)) {\n        this.moveRows(pluginSettings, 0);\n      } else if (pluginSettings !== void 0) {\n        var persistentState = this.persistentStateLoad();\n\n        if (persistentState.length) {\n          this.moveRows(persistentState, 0);\n        }\n      }\n    }\n\n    /**\n     * Check if the provided row is in the fixedRowsTop section.\n     *\n     * @private\n     * @param {Number} row Visual row index to check.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isFixedRowTop',\n    value: function isFixedRowTop(row) {\n      return row < this.hot.getSettings().fixedRowsTop;\n    }\n\n    /**\n     * Check if the provided row is in the fixedRowsBottom section.\n     *\n     * @private\n     * @param {Number} row Visual row index to check.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isFixedRowBottom',\n    value: function isFixedRowBottom(row) {\n      return row > this.hot.getSettings().fixedRowsBottom;\n    }\n\n    /**\n     * Save the manual row positions to the persistent state.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'persistentStateSave',\n    value: function persistentStateSave() {\n      this.hot.runHooks('persistentStateSave', 'manualRowMove', this.rowsMapper._arrayMap);\n    }\n\n    /**\n     * Load the manual row positions from the persistent state.\n     *\n     * @private\n     * @returns {Array} Stored state.\n     */\n\n  }, {\n    key: 'persistentStateLoad',\n    value: function persistentStateLoad() {\n      var storedState = {};\n\n      this.hot.runHooks('persistentStateLoad', 'manualRowMove', storedState);\n\n      return storedState.value ? storedState.value : [];\n    }\n\n    /**\n     * Prepare array of indexes based on actual selection.\n     *\n     * @private\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'prepareRowsToMoving',\n    value: function prepareRowsToMoving() {\n      var selection = this.hot.getSelectedRangeLast();\n      var selectedRows = [];\n\n      if (!selection) {\n        return selectedRows;\n      }\n\n      var from = selection.from,\n          to = selection.to;\n\n      var start = Math.min(from.row, to.row);\n      var end = Math.max(from.row, to.row);\n\n      (0, _number.rangeEach)(start, end, function (i) {\n        selectedRows.push(i);\n      });\n\n      return selectedRows;\n    }\n\n    /**\n     * Update the UI visual position.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'refreshPositions',\n    value: function refreshPositions() {\n      var priv = privatePool.get(this);\n      var coords = priv.target.coords;\n      var firstVisible = this.hot.view.wt.wtTable.getFirstVisibleRow();\n      var lastVisible = this.hot.view.wt.wtTable.getLastVisibleRow();\n      var fixedRows = this.hot.getSettings().fixedRowsTop;\n      var countRows = this.hot.countRows();\n\n      if (coords.row < fixedRows && firstVisible > 0) {\n        this.hot.scrollViewportTo(firstVisible - 1);\n      }\n      if (coords.row >= lastVisible && lastVisible < countRows) {\n        this.hot.scrollViewportTo(lastVisible + 1, undefined, true);\n      }\n\n      var wtTable = this.hot.view.wt.wtTable;\n      var TD = priv.target.TD;\n      var rootElementOffset = (0, _element.offset)(this.hot.rootElement);\n      var tdOffsetTop = this.hot.view.THEAD.offsetHeight + this.getRowsHeight(0, coords.row);\n      var mouseOffsetTop = priv.target.eventPageY - rootElementOffset.top + wtTable.holder.scrollTop;\n      var hiderHeight = wtTable.hider.offsetHeight;\n      var tbodyOffsetTop = wtTable.TBODY.offsetTop;\n      var backlightElemMarginTop = this.backlight.getOffset().top;\n      var backlightElemHeight = this.backlight.getSize().height;\n\n      if (this.isFixedRowTop(coords.row)) {\n        tdOffsetTop += wtTable.holder.scrollTop;\n      }\n\n      // todo: fixedRowsBottom\n      // if (this.isFixedRowBottom(coords.row)) {\n      //\n      // }\n\n      if (coords.row < 0) {\n        // if hover on colHeader\n        priv.target.row = firstVisible > 0 ? firstVisible - 1 : firstVisible;\n      } else if (TD.offsetHeight / 2 + tdOffsetTop <= mouseOffsetTop) {\n        // if hover on lower part of TD\n        priv.target.row = coords.row + 1;\n        // unfortunately first row is bigger than rest\n        tdOffsetTop += coords.row === 0 ? TD.offsetHeight - 1 : TD.offsetHeight;\n      } else {\n        // elsewhere on table\n        priv.target.row = coords.row;\n      }\n\n      var backlightTop = mouseOffsetTop;\n      var guidelineTop = tdOffsetTop;\n\n      if (mouseOffsetTop + backlightElemHeight + backlightElemMarginTop >= hiderHeight) {\n        // prevent display backlight below table\n        backlightTop = hiderHeight - backlightElemHeight - backlightElemMarginTop;\n      } else if (mouseOffsetTop + backlightElemMarginTop < tbodyOffsetTop) {\n        // prevent display above below table\n        backlightTop = tbodyOffsetTop + Math.abs(backlightElemMarginTop);\n      }\n\n      if (tdOffsetTop >= hiderHeight - 1) {\n        // prevent display guideline below table\n        guidelineTop = hiderHeight - 1;\n      }\n\n      var topOverlayHeight = 0;\n      if (this.hot.view.wt.wtOverlays.topOverlay) {\n        topOverlayHeight = this.hot.view.wt.wtOverlays.topOverlay.clone.wtTable.TABLE.offsetHeight;\n      }\n\n      if (coords.row >= fixedRows && guidelineTop - wtTable.holder.scrollTop < topOverlayHeight) {\n        this.hot.scrollViewportTo(coords.row);\n      }\n\n      this.backlight.setPosition(backlightTop);\n      this.guideline.setPosition(guidelineTop);\n    }\n\n    /**\n     * This method checks arrayMap from rowsMapper and updates the rowsMapper if it's necessary.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'updateRowsMapper',\n    value: function updateRowsMapper() {\n      var countRows = this.hot.countSourceRows();\n      var rowsMapperLen = this.rowsMapper._arrayMap.length;\n\n      if (rowsMapperLen === 0) {\n        this.rowsMapper.createMap(countRows || this.hot.getSettings().startRows);\n      } else if (rowsMapperLen < countRows) {\n        var diff = countRows - rowsMapperLen;\n\n        this.rowsMapper.insertItems(rowsMapperLen, diff);\n      } else if (rowsMapperLen > countRows) {\n        var maxIndex = countRows - 1;\n        var rowsToRemove = [];\n\n        (0, _array.arrayEach)(this.rowsMapper._arrayMap, function (value, index) {\n          if (value > maxIndex) {\n            rowsToRemove.push(index);\n          }\n        });\n\n        this.rowsMapper.removeItems(rowsToRemove);\n      }\n    }\n\n    /**\n     * Bind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this4 = this;\n\n      this.eventManager.addEventListener(document.documentElement, 'mousemove', function (event) {\n        return _this4.onMouseMove(event);\n      });\n      this.eventManager.addEventListener(document.documentElement, 'mouseup', function () {\n        return _this4.onMouseUp();\n      });\n    }\n\n    /**\n     * Unbind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'unregisterEvents',\n    value: function unregisterEvents() {\n      this.eventManager.clear();\n    }\n\n    /**\n     * `beforeColumnSort` hook callback. If user uses the sorting, manual row moving is disabled.\n     *\n     * @private\n     * @param {Number} column Column index where soring is present\n     * @param {*} order State of sorting. ASC/DESC/None\n     */\n\n  }, {\n    key: 'onBeforeColumnSort',\n    value: function onBeforeColumnSort(column, order) {\n      var priv = privatePool.get(this);\n\n      priv.disallowMoving = order !== void 0;\n    }\n\n    /**\n     * Change the behavior of selection / dragging.\n     *\n     * @private\n     * @param {MouseEvent} event\n     * @param {CellCoords} coords Visual coordinates.\n     * @param {HTMLElement} TD\n     * @param {Object} blockCalculations\n     */\n\n  }, {\n    key: 'onBeforeOnCellMouseDown',\n    value: function onBeforeOnCellMouseDown(event, coords, TD, blockCalculations) {\n      var wtTable = this.hot.view.wt.wtTable;\n      var isHeaderSelection = this.hot.selection.isSelectedByRowHeader();\n      var selection = this.hot.getSelectedRangeLast();\n      var priv = privatePool.get(this);\n\n      if (!selection || !isHeaderSelection || priv.pressed || event.button !== 0) {\n        priv.pressed = false;\n        priv.rowsToMove.length = 0;\n        (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI]);\n        return;\n      }\n\n      var guidelineIsNotReady = this.guideline.isBuilt() && !this.guideline.isAppended();\n      var backlightIsNotReady = this.backlight.isBuilt() && !this.backlight.isAppended();\n\n      if (guidelineIsNotReady && backlightIsNotReady) {\n        this.guideline.appendTo(wtTable.hider);\n        this.backlight.appendTo(wtTable.hider);\n      }\n\n      var from = selection.from,\n          to = selection.to;\n\n      var start = Math.min(from.row, to.row);\n      var end = Math.max(from.row, to.row);\n\n      if (coords.col < 0 && coords.row >= start && coords.row <= end) {\n        blockCalculations.row = true;\n        priv.pressed = true;\n        priv.target.eventPageY = event.pageY;\n        priv.target.coords = coords;\n        priv.target.TD = TD;\n        priv.rowsToMove = this.prepareRowsToMoving();\n\n        var leftPos = wtTable.holder.scrollLeft + this.hot.view.wt.wtViewport.getRowHeaderWidth();\n\n        this.backlight.setPosition(null, leftPos);\n        this.backlight.setSize(wtTable.hider.offsetWidth - leftPos, this.getRowsHeight(start, end + 1));\n        this.backlight.setOffset((this.getRowsHeight(start, coords.row) + event.layerY) * -1, null);\n\n        (0, _element.addClass)(this.hot.rootElement, CSS_ON_MOVING);\n\n        this.refreshPositions();\n      } else {\n        (0, _element.removeClass)(this.hot.rootElement, CSS_AFTER_SELECTION);\n        priv.pressed = false;\n        priv.rowsToMove.length = 0;\n      }\n    }\n\n    /**\n     * 'mouseMove' event callback. Fired when pointer move on document.documentElement.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var priv = privatePool.get(this);\n\n      if (!priv.pressed) {\n        return;\n      }\n\n      // callback for browser which doesn't supports CSS pointer-event: none\n      if (event.realTarget === this.backlight.element) {\n        var height = this.backlight.getSize().height;\n        this.backlight.setSize(null, 0);\n\n        setTimeout(function () {\n          this.backlight.setPosition(null, height);\n        });\n      }\n\n      priv.target.eventPageY = event.pageY;\n      this.refreshPositions();\n    }\n\n    /**\n     * 'beforeOnCellMouseOver' hook callback. Fired when pointer was over cell.\n     *\n     * @private\n     * @param {MouseEvent} event `mouseover` event properties.\n     * @param {CellCoords} coords Visual cell coordinates where was fired event.\n     * @param {HTMLElement} TD Cell represented as HTMLElement.\n     * @param {Object} blockCalculations Object which contains information about blockCalculation for row, column or cells.\n     */\n\n  }, {\n    key: 'onBeforeOnCellMouseOver',\n    value: function onBeforeOnCellMouseOver(event, coords, TD, blockCalculations) {\n      var selectedRange = this.hot.getSelectedRangeLast();\n      var priv = privatePool.get(this);\n\n      if (!selectedRange || !priv.pressed) {\n        return;\n      }\n\n      if (priv.rowsToMove.indexOf(coords.row) > -1) {\n        (0, _element.removeClass)(this.hot.rootElement, CSS_SHOW_UI);\n      } else {\n        (0, _element.addClass)(this.hot.rootElement, CSS_SHOW_UI);\n      }\n\n      blockCalculations.row = true;\n      blockCalculations.column = true;\n      blockCalculations.cell = true;\n      priv.target.coords = coords;\n      priv.target.TD = TD;\n    }\n\n    /**\n     * `onMouseUp` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      var priv = privatePool.get(this);\n      var target = priv.target.row;\n      var rowsLen = priv.rowsToMove.length;\n\n      priv.pressed = false;\n      priv.backlightHeight = 0;\n\n      (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI, CSS_AFTER_SELECTION]);\n\n      if (this.hot.selection.isSelectedByRowHeader()) {\n        (0, _element.addClass)(this.hot.rootElement, CSS_AFTER_SELECTION);\n      }\n\n      if (rowsLen < 1 || target === void 0 || priv.rowsToMove.indexOf(target) > -1 || priv.rowsToMove[rowsLen - 1] === target - 1) {\n        return;\n      }\n\n      this.moveRows(priv.rowsToMove, target);\n\n      this.persistentStateSave();\n      this.hot.render();\n\n      if (!priv.disallowMoving) {\n        var selectionStart = this.rowsMapper.getIndexByValue(priv.rowsToMove[0]);\n        var selectionEnd = this.rowsMapper.getIndexByValue(priv.rowsToMove[rowsLen - 1]);\n        this.changeSelection(selectionStart, selectionEnd);\n      }\n\n      priv.rowsToMove.length = 0;\n    }\n\n    /**\n     * `afterScrollHorizontally` hook callback. Fired the table was scrolled horizontally.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterScrollHorizontally',\n    value: function onAfterScrollHorizontally() {\n      var wtTable = this.hot.view.wt.wtTable;\n      var headerWidth = this.hot.view.wt.wtViewport.getRowHeaderWidth();\n      var scrollLeft = wtTable.holder.scrollLeft;\n      var posLeft = headerWidth + scrollLeft;\n\n      this.backlight.setPosition(null, posLeft);\n      this.backlight.setSize(wtTable.hider.offsetWidth - posLeft);\n    }\n\n    /**\n     * `afterCreateRow` hook callback.\n     *\n     * @private\n     * @param {Number} index Visual index of the created row.\n     * @param {Number} amount Amount of created rows.\n     */\n\n  }, {\n    key: 'onAfterCreateRow',\n    value: function onAfterCreateRow(index, amount) {\n      this.rowsMapper.shiftItems(index, amount);\n    }\n\n    /**\n     * On before remove row listener.\n     *\n     * @private\n     * @param {Number} index Visual row index.\n     * @param {Number} amount Defines how many rows removed.\n     */\n\n  }, {\n    key: 'onBeforeRemoveRow',\n    value: function onBeforeRemoveRow(index, amount) {\n      var _this5 = this;\n\n      this.removedRows.length = 0;\n\n      if (index !== false) {\n        // Collect physical row index.\n        (0, _number.rangeEach)(index, index + amount - 1, function (removedIndex) {\n          _this5.removedRows.push(_this5.hot.runHooks('modifyRow', removedIndex, _this5.pluginName));\n        });\n      }\n    }\n\n    /**\n     * `afterRemoveRow` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterRemoveRow',\n    value: function onAfterRemoveRow() {\n      this.rowsMapper.unshiftItems(this.removedRows);\n    }\n\n    /**\n     * `afterLoadData` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData() {\n      this.updateRowsMapper();\n    }\n\n    /**\n     * 'modifyRow' hook callback.\n     *\n     * @private\n     * @param {Number} row Visual Row index.\n     * @returns {Number} Physical row index.\n     */\n\n  }, {\n    key: 'onModifyRow',\n    value: function onModifyRow(row, source) {\n      if (source !== this.pluginName) {\n        var rowInMapper = this.rowsMapper.getValueByIndex(row);\n        row = rowInMapper === null ? row : rowInMapper;\n      }\n\n      return row;\n    }\n\n    /**\n     * 'unmodifyRow' hook callback.\n     *\n     * @private\n     * @param {Number} row Physical row index.\n     * @returns {Number} Visual row index.\n     */\n\n  }, {\n    key: 'onUnmodifyRow',\n    value: function onUnmodifyRow(row) {\n      var indexInMapper = this.rowsMapper.getIndexByValue(row);\n\n      return indexInMapper === null ? row : indexInMapper;\n    }\n\n    /**\n     * `afterPluginsInitialized` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterPluginsInitialized',\n    value: function onAfterPluginsInitialized() {\n      this.updateRowsMapper();\n      this.initialSettings();\n      this.backlight.build();\n      this.guideline.build();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.backlight.destroy();\n      this.guideline.destroy();\n\n      _get(ManualRowMove.prototype.__proto__ || Object.getPrototypeOf(ManualRowMove.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return ManualRowMove;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('ManualRowMove', ManualRowMove);\n\nexports.default = ManualRowMove;\n\n/***/ }),\n/* 461 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _arrayMapper = __webpack_require__(321);\n\nvar _arrayMapper2 = _interopRequireDefault(_arrayMapper);\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class RowsMapper\n * @plugin ManualRowMove\n */\nvar RowsMapper = function () {\n  function RowsMapper(manualRowMove) {\n    _classCallCheck(this, RowsMapper);\n\n    /**\n     * Instance of ManualRowMove plugin.\n     *\n     * @type {ManualRowMove}\n     */\n    this.manualRowMove = manualRowMove;\n  }\n\n  /**\n   * Reset current map array and create new one.\n   *\n   * @param {Number} [length] Custom generated map length.\n   */\n\n\n  _createClass(RowsMapper, [{\n    key: 'createMap',\n    value: function createMap(length) {\n      var _this = this;\n\n      var originLength = length === void 0 ? this._arrayMap.length : length;\n\n      this._arrayMap.length = 0;\n\n      (0, _number.rangeEach)(originLength - 1, function (itemIndex) {\n        _this._arrayMap[itemIndex] = itemIndex;\n      });\n    }\n\n    /**\n     * Destroy class.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this._arrayMap = null;\n    }\n\n    /**\n     *\n     * Moving elements in rowsMapper.\n     * @param {Number} from Row index to move.\n     * @param {Number} to Target index.\n     */\n\n  }, {\n    key: 'moveRow',\n    value: function moveRow(from, to) {\n      var indexToMove = this._arrayMap[from];\n      this._arrayMap[from] = null;\n      this._arrayMap.splice(to, 0, indexToMove);\n    }\n\n    /**\n     * Clearing arrayMap from `null` entries.\n     */\n\n  }, {\n    key: 'clearNull',\n    value: function clearNull() {\n      this._arrayMap = (0, _array.arrayFilter)(this._arrayMap, function (i) {\n        return i !== null;\n      });\n    }\n  }]);\n\n  return RowsMapper;\n}();\n\n(0, _object.mixin)(RowsMapper, _arrayMapper2.default);\n\nexports.default = RowsMapper;\n\n/***/ }),\n/* 462 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(323);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CSS_CLASSNAME = 'ht__manualRowMove--backlight';\n\n/**\n * @class BacklightUI\n * @util\n */\n\nvar BacklightUI = function (_BaseUI) {\n  _inherits(BacklightUI, _BaseUI);\n\n  function BacklightUI() {\n    _classCallCheck(this, BacklightUI);\n\n    return _possibleConstructorReturn(this, (BacklightUI.__proto__ || Object.getPrototypeOf(BacklightUI)).apply(this, arguments));\n  }\n\n  _createClass(BacklightUI, [{\n    key: 'build',\n\n    /**\n     * Custom className on build process.\n     */\n    value: function build() {\n      _get(BacklightUI.prototype.__proto__ || Object.getPrototypeOf(BacklightUI.prototype), 'build', this).call(this);\n\n      (0, _element.addClass)(this._element, CSS_CLASSNAME);\n    }\n  }]);\n\n  return BacklightUI;\n}(_base2.default);\n\nexports.default = BacklightUI;\n\n/***/ }),\n/* 463 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(323);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CSS_CLASSNAME = 'ht__manualRowMove--guideline';\n\n/**\n * @class GuidelineUI\n * @util\n */\n\nvar GuidelineUI = function (_BaseUI) {\n  _inherits(GuidelineUI, _BaseUI);\n\n  function GuidelineUI() {\n    _classCallCheck(this, GuidelineUI);\n\n    return _possibleConstructorReturn(this, (GuidelineUI.__proto__ || Object.getPrototypeOf(GuidelineUI)).apply(this, arguments));\n  }\n\n  _createClass(GuidelineUI, [{\n    key: 'build',\n\n    /**\n     * Custom className on build process.\n     */\n    value: function build() {\n      _get(GuidelineUI.prototype.__proto__ || Object.getPrototypeOf(GuidelineUI.prototype), 'build', this).call(this);\n\n      (0, _element.addClass)(this._element, CSS_CLASSNAME);\n    }\n  }]);\n\n  return GuidelineUI;\n}(_base2.default);\n\nexports.default = GuidelineUI;\n\n/***/ }),\n/* 464 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 465 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _event = __webpack_require__(12);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// Developer note! Whenever you make a change in this file, make an analogous change in manualRowResize.js\n\n/**\n * @description\n * ManualRowResize Plugin.\n *\n * Has 2 UI components:\n * - handle - the draggable element that sets the desired height of the row.\n * - guide - the helper guide that shows the desired height as a horizontal guide.\n *\n * @plugin ManualRowResize\n */\nvar ManualRowResize = function (_BasePlugin) {\n  _inherits(ManualRowResize, _BasePlugin);\n\n  function ManualRowResize(hotInstance) {\n    _classCallCheck(this, ManualRowResize);\n\n    var _this = _possibleConstructorReturn(this, (ManualRowResize.__proto__ || Object.getPrototypeOf(ManualRowResize)).call(this, hotInstance));\n\n    _this.currentTH = null;\n    _this.currentRow = null;\n    _this.selectedRows = [];\n    _this.currentHeight = null;\n    _this.newSize = null;\n    _this.startY = null;\n    _this.startHeight = null;\n    _this.startOffset = null;\n    _this.handle = document.createElement('DIV');\n    _this.guide = document.createElement('DIV');\n    _this.eventManager = new _eventManager2.default(_this);\n    _this.pressed = null;\n    _this.dblclick = 0;\n    _this.autoresizeTimeout = null;\n    _this.manualRowHeights = [];\n\n    (0, _element.addClass)(_this.handle, 'manualRowResizer');\n    (0, _element.addClass)(_this.guide, 'manualRowResizerGuide');\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualRowResize, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().manualRowResize;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.manualRowHeights = [];\n\n      var initialRowHeights = this.hot.getSettings().manualRowResize;\n      var loadedManualRowHeights = this.loadManualRowHeights();\n\n      if (typeof loadedManualRowHeights != 'undefined') {\n        this.manualRowHeights = loadedManualRowHeights;\n      } else if (Array.isArray(initialRowHeights)) {\n        this.manualRowHeights = initialRowHeights;\n      } else {\n        this.manualRowHeights = [];\n      }\n\n      this.addHook('modifyRowHeight', function (height, row) {\n        return _this2.onModifyRowHeight(height, row);\n      });\n\n      // Handsontable.hooks.register('beforeRowResize');\n      // Handsontable.hooks.register('afterRowResize');\n\n      this.bindEvents();\n\n      _get(ManualRowResize.prototype.__proto__ || Object.getPrototypeOf(ManualRowResize.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      var initialRowHeights = this.hot.getSettings().manualRowResize;\n\n      if (Array.isArray(initialRowHeights)) {\n        this.manualRowHeights = initialRowHeights;\n      } else if (!initialRowHeights) {\n        this.manualRowHeights = [];\n      }\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(ManualRowResize.prototype.__proto__ || Object.getPrototypeOf(ManualRowResize.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Save the current sizes using the persistentState plugin.\n     */\n\n  }, {\n    key: 'saveManualRowHeights',\n    value: function saveManualRowHeights() {\n      this.hot.runHooks('persistentStateSave', 'manualRowHeights', this.manualRowHeights);\n    }\n\n    /**\n     * Load the previously saved sizes using the persistentState plugin.\n     *\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'loadManualRowHeights',\n    value: function loadManualRowHeights() {\n      var storedState = {};\n\n      this.hot.runHooks('persistentStateLoad', 'manualRowHeights', storedState);\n\n      return storedState.value;\n    }\n\n    /**\n     * Set the resize handle position.\n     *\n     * @param {HTMLCellElement} TH TH HTML element.\n     */\n\n  }, {\n    key: 'setupHandlePosition',\n    value: function setupHandlePosition(TH) {\n      var _this3 = this;\n\n      this.currentTH = TH;\n      var row = this.hot.view.wt.wtTable.getCoords(TH).row; // getCoords returns CellCoords\n      var headerWidth = (0, _element.outerWidth)(this.currentTH);\n\n      if (row >= 0) {\n        // if not col header\n        var box = this.currentTH.getBoundingClientRect();\n\n        this.currentRow = row;\n        this.selectedRows = [];\n\n        if (this.hot.selection.isSelected() && this.hot.selection.isSelectedByRowHeader()) {\n          var _hot$getSelectedRange = this.hot.getSelectedRangeLast(),\n              from = _hot$getSelectedRange.from,\n              to = _hot$getSelectedRange.to;\n\n          var start = from.row;\n          var end = to.row;\n\n          if (start >= end) {\n            start = to.row;\n            end = from.row;\n          }\n\n          if (this.currentRow >= start && this.currentRow <= end) {\n            (0, _number.rangeEach)(start, end, function (i) {\n              return _this3.selectedRows.push(i);\n            });\n          } else {\n            this.selectedRows.push(this.currentRow);\n          }\n        } else {\n          this.selectedRows.push(this.currentRow);\n        }\n\n        this.startOffset = box.top - 6;\n        this.startHeight = parseInt(box.height, 10);\n        this.handle.style.left = box.left + 'px';\n        this.handle.style.top = this.startOffset + this.startHeight + 'px';\n        this.handle.style.width = headerWidth + 'px';\n        this.hot.rootElement.appendChild(this.handle);\n      }\n    }\n\n    /**\n     * Refresh the resize handle position.\n     */\n\n  }, {\n    key: 'refreshHandlePosition',\n    value: function refreshHandlePosition() {\n      this.handle.style.top = this.startOffset + this.currentHeight + 'px';\n    }\n\n    /**\n     * Set the resize guide position.\n     */\n\n  }, {\n    key: 'setupGuidePosition',\n    value: function setupGuidePosition() {\n      var handleWidth = parseInt((0, _element.outerWidth)(this.handle), 10);\n      var handleRightPosition = parseInt(this.handle.style.left, 10) + handleWidth;\n      var maximumVisibleElementWidth = parseInt(this.hot.view.maximumVisibleElementWidth(0), 10);\n      (0, _element.addClass)(this.handle, 'active');\n      (0, _element.addClass)(this.guide, 'active');\n\n      this.guide.style.top = this.handle.style.top;\n      this.guide.style.left = handleRightPosition + 'px';\n      this.guide.style.width = maximumVisibleElementWidth - handleWidth + 'px';\n      this.hot.rootElement.appendChild(this.guide);\n    }\n\n    /**\n     * Refresh the resize guide position.\n     */\n\n  }, {\n    key: 'refreshGuidePosition',\n    value: function refreshGuidePosition() {\n      this.guide.style.top = this.handle.style.top;\n    }\n\n    /**\n     * Hide both the resize handle and resize guide.\n     */\n\n  }, {\n    key: 'hideHandleAndGuide',\n    value: function hideHandleAndGuide() {\n      (0, _element.removeClass)(this.handle, 'active');\n      (0, _element.removeClass)(this.guide, 'active');\n    }\n\n    /**\n     * Check if provided element is considered as a row header.\n     *\n     * @param {HTMLElement} element HTML element.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'checkIfRowHeader',\n    value: function checkIfRowHeader(element) {\n      if (element != this.hot.rootElement) {\n        var parent = element.parentNode;\n\n        if (parent.tagName === 'TBODY') {\n          return true;\n        }\n\n        return this.checkIfRowHeader(parent);\n      }\n\n      return false;\n    }\n\n    /**\n     * Get the TH element from the provided element.\n     *\n     * @param {HTMLElement} element HTML element.\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'getTHFromTargetElement',\n    value: function getTHFromTargetElement(element) {\n      if (element.tagName != 'TABLE') {\n        if (element.tagName == 'TH') {\n          return element;\n        }\n        return this.getTHFromTargetElement(element.parentNode);\n      }\n\n      return null;\n    }\n\n    /**\n     * 'mouseover' event callback - set the handle position.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseOver',\n    value: function onMouseOver(event) {\n      if (this.checkIfRowHeader(event.target)) {\n        var th = this.getTHFromTargetElement(event.target);\n\n        if (th) {\n          if (!this.pressed) {\n            this.setupHandlePosition(th);\n          }\n        }\n      }\n    }\n\n    /**\n     * Auto-size row after doubleclick - callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'afterMouseDownTimeout',\n    value: function afterMouseDownTimeout() {\n      var _this4 = this;\n\n      var render = function render() {\n        _this4.hot.forceFullRender = true;\n        _this4.hot.view.render(); // updates all\n        _this4.hot.view.wt.wtOverlays.adjustElementsSize(true);\n      };\n      var resize = function resize(selectedRow, forceRender) {\n        var hookNewSize = _this4.hot.runHooks('beforeRowResize', selectedRow, _this4.newSize, true);\n\n        if (hookNewSize !== void 0) {\n          _this4.newSize = hookNewSize;\n        }\n\n        _this4.setManualSize(selectedRow, _this4.newSize); // double click sets auto row size\n\n        if (forceRender) {\n          render();\n        }\n\n        _this4.hot.runHooks('afterRowResize', selectedRow, _this4.newSize, true);\n      };\n\n      if (this.dblclick >= 2) {\n        var selectedRowsLength = this.selectedRows.length;\n\n        if (selectedRowsLength > 1) {\n          (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n            resize(selectedRow);\n          });\n          render();\n        } else {\n          (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n            resize(selectedRow, true);\n          });\n        }\n      }\n      this.dblclick = 0;\n      this.autoresizeTimeout = null;\n    }\n\n    /**\n     * 'mousedown' event callback.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseDown',\n    value: function onMouseDown(event) {\n      var _this5 = this;\n\n      if ((0, _element.hasClass)(event.target, 'manualRowResizer')) {\n        this.setupGuidePosition();\n        this.pressed = this.hot;\n\n        if (this.autoresizeTimeout == null) {\n          this.autoresizeTimeout = setTimeout(function () {\n            return _this5.afterMouseDownTimeout();\n          }, 500);\n\n          this.hot._registerTimeout(this.autoresizeTimeout);\n        }\n        this.dblclick++;\n\n        this.startY = (0, _event.pageY)(event);\n        this.newSize = this.startHeight;\n      }\n    }\n\n    /**\n     * 'mousemove' event callback - refresh the handle and guide positions, cache the new row height.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var _this6 = this;\n\n      if (this.pressed) {\n        this.currentHeight = this.startHeight + ((0, _event.pageY)(event) - this.startY);\n\n        (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n          _this6.newSize = _this6.setManualSize(selectedRow, _this6.currentHeight);\n        });\n\n        this.refreshHandlePosition();\n        this.refreshGuidePosition();\n      }\n    }\n\n    /**\n     * 'mouseup' event callback - apply the row resizing.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp(event) {\n      var _this7 = this;\n\n      var render = function render() {\n        _this7.hot.forceFullRender = true;\n        _this7.hot.view.render(); // updates all\n        _this7.hot.view.wt.wtOverlays.adjustElementsSize(true);\n      };\n      var runHooks = function runHooks(selectedRow, forceRender) {\n        _this7.hot.runHooks('beforeRowResize', selectedRow, _this7.newSize);\n\n        if (forceRender) {\n          render();\n        }\n\n        _this7.saveManualRowHeights();\n\n        _this7.hot.runHooks('afterRowResize', selectedRow, _this7.newSize);\n      };\n      if (this.pressed) {\n        this.hideHandleAndGuide();\n        this.pressed = false;\n\n        if (this.newSize != this.startHeight) {\n          var selectedRowsLength = this.selectedRows.length;\n\n          if (selectedRowsLength > 1) {\n            (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n              runHooks(selectedRow);\n            });\n            render();\n          } else {\n            (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n              runHooks(selectedRow, true);\n            });\n          }\n        }\n\n        this.setupHandlePosition(this.currentTH);\n      }\n    }\n\n    /**\n     * Bind the mouse events.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'bindEvents',\n    value: function bindEvents() {\n      var _this8 = this;\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'mouseover', function (e) {\n        return _this8.onMouseOver(e);\n      });\n      this.eventManager.addEventListener(this.hot.rootElement, 'mousedown', function (e) {\n        return _this8.onMouseDown(e);\n      });\n      this.eventManager.addEventListener(window, 'mousemove', function (e) {\n        return _this8.onMouseMove(e);\n      });\n      this.eventManager.addEventListener(window, 'mouseup', function (e) {\n        return _this8.onMouseUp(e);\n      });\n    }\n\n    /**\n     * Cache the current row height.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} height Row height.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'setManualSize',\n    value: function setManualSize(row, height) {\n      row = this.hot.runHooks('modifyRow', row);\n      this.manualRowHeights[row] = height;\n\n      return height;\n    }\n\n    /**\n     * Modify the provided row height, based on the plugin settings.\n     *\n     * @private\n     * @param {Number} height Row height.\n     * @param {Number} row Visual row index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onModifyRowHeight',\n    value: function onModifyRowHeight(height, row) {\n      if (this.enabled) {\n        var autoRowSizePlugin = this.hot.getPlugin('autoRowSize');\n        var autoRowHeightResult = autoRowSizePlugin ? autoRowSizePlugin.heights[row] : null;\n\n        row = this.hot.runHooks('modifyRow', row);\n\n        var manualRowHeight = this.manualRowHeights[row];\n\n        if (manualRowHeight !== void 0 && (manualRowHeight === autoRowHeightResult || manualRowHeight > (height || 0))) {\n          return manualRowHeight;\n        }\n      }\n\n      return height;\n    }\n  }]);\n\n  return ManualRowResize;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('manualRowResize', ManualRowResize);\n\nexports.default = ManualRowResize;\n\n/***/ }),\n/* 466 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _plugins = __webpack_require__(8);\n\nvar _event = __webpack_require__(12);\n\nvar _src = __webpack_require__(4);\n\nvar _cellsCollection = __webpack_require__(467);\n\nvar _cellsCollection2 = _interopRequireDefault(_cellsCollection);\n\nvar _cellCoords = __webpack_require__(95);\n\nvar _cellCoords2 = _interopRequireDefault(_cellCoords);\n\nvar _autofill = __webpack_require__(468);\n\nvar _autofill2 = _interopRequireDefault(_autofill);\n\nvar _selection = __webpack_require__(469);\n\nvar _selection2 = _interopRequireDefault(_selection);\n\nvar _toggleMerge = __webpack_require__(470);\n\nvar _toggleMerge2 = _interopRequireDefault(_toggleMerge);\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar _console = __webpack_require__(56);\n\nvar _number = __webpack_require__(5);\n\nvar _utils = __webpack_require__(324);\n\n__webpack_require__(471);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('beforeMergeCells');\n_pluginHooks2.default.getSingleton().register('afterMergeCells');\n_pluginHooks2.default.getSingleton().register('beforeUnmergeCells');\n_pluginHooks2.default.getSingleton().register('afterUnmergeCells');\n\nvar privatePool = new WeakMap();\n\n/**\n * @plugin MergeCells\n *\n * @description Plugin, which allows merging cells in the table (using the initial configuration, API or context menu).\n *\n * @example\n *\n * ```js\n * ...\n * let hot = new Handsontable(document.getElementById('example'), {\n *  data: getData(),\n *  mergeCells: [\n *    {row: 0, col: 3, rowspan: 3, colspan: 3},\n *    {row: 2, col: 6, rowspan: 2, colspan: 2},\n *    {row: 4, col: 8, rowspan: 3, colspan: 3}\n *  ],\n * ...\n * ```\n */\n\nvar MergeCells = function (_BasePlugin) {\n  _inherits(MergeCells, _BasePlugin);\n\n  function MergeCells(hotInstance) {\n    _classCallCheck(this, MergeCells);\n\n    var _this = _possibleConstructorReturn(this, (MergeCells.__proto__ || Object.getPrototypeOf(MergeCells)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      lastDesiredCoords: null\n    });\n\n    /**\n     * A container for all the merged cells.\n     *\n     * @type {MergedCellsCollection}\n     */\n    _this.mergedCellsCollection = null;\n    /**\n     * Instance of the class responsible for all the autofill-related calculations.\n     *\n     * @private\n     * @type {AutofillCalculations}\n     */\n    _this.autofillCalculations = null;\n    /**\n     * Instance of the class responsible for the selection-related calculations.\n     *\n     * @private\n     * @type {SelectionCalculations}\n     */\n    _this.selectionCalculations = null;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(MergeCells, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().mergeCells;\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.mergedCellsCollection = new _cellsCollection2.default(this);\n      this.autofillCalculations = new _autofill2.default(this);\n      this.selectionCalculations = new _selection2.default(this);\n\n      this.addHook('afterInit', function () {\n        return _this2.onAfterInit.apply(_this2, arguments);\n      });\n      this.addHook('beforeKeyDown', function () {\n        return _this2.onBeforeKeyDown.apply(_this2, arguments);\n      });\n      this.addHook('modifyTransformStart', function () {\n        return _this2.onModifyTransformStart.apply(_this2, arguments);\n      });\n      this.addHook('afterModifyTransformStart', function () {\n        return _this2.onAfterModifyTransformStart.apply(_this2, arguments);\n      });\n      this.addHook('modifyTransformEnd', function () {\n        return _this2.onModifyTransformEnd.apply(_this2, arguments);\n      });\n      this.addHook('modifyGetCellCoords', function () {\n        return _this2.onModifyGetCellCoords.apply(_this2, arguments);\n      });\n      this.addHook('beforeSetRangeEnd', function () {\n        return _this2.onBeforeSetRangeEnd.apply(_this2, arguments);\n      });\n      this.addHook('afterIsMultipleSelection', function () {\n        return _this2.onAfterIsMultipleSelection.apply(_this2, arguments);\n      });\n      this.addHook('afterRenderer', function () {\n        return _this2.onAfterRenderer.apply(_this2, arguments);\n      });\n      this.addHook('afterContextMenuDefaultOptions', function () {\n        return _this2.addMergeActionsToContextMenu.apply(_this2, arguments);\n      });\n      this.addHook('afterGetCellMeta', function () {\n        return _this2.onAfterGetCellMeta.apply(_this2, arguments);\n      });\n      this.addHook('afterViewportRowCalculatorOverride', function () {\n        return _this2.onAfterViewportRowCalculatorOverride.apply(_this2, arguments);\n      });\n      this.addHook('afterViewportColumnCalculatorOverride', function () {\n        return _this2.onAfterViewportColumnCalculatorOverride.apply(_this2, arguments);\n      });\n      this.addHook('modifyAutofillRange', function () {\n        return _this2.onModifyAutofillRange.apply(_this2, arguments);\n      });\n      this.addHook('afterCreateCol', function () {\n        return _this2.onAfterCreateCol.apply(_this2, arguments);\n      });\n      this.addHook('afterRemoveCol', function () {\n        return _this2.onAfterRemoveCol.apply(_this2, arguments);\n      });\n      this.addHook('afterCreateRow', function () {\n        return _this2.onAfterCreateRow.apply(_this2, arguments);\n      });\n      this.addHook('afterRemoveRow', function () {\n        return _this2.onAfterRemoveRow.apply(_this2, arguments);\n      });\n      this.addHook('afterChange', function () {\n        return _this2.onAfterChange.apply(_this2, arguments);\n      });\n      this.addHook('beforeDrawBorders', function () {\n        return _this2.onBeforeDrawAreaBorders.apply(_this2, arguments);\n      });\n      this.addHook('afterDrawSelection', function () {\n        return _this2.onAfterDrawSelection.apply(_this2, arguments);\n      });\n      this.addHook('beforeRemoveCellClassNames', function () {\n        return _this2.onBeforeRemoveCellClassNames.apply(_this2, arguments);\n      });\n\n      _get(MergeCells.prototype.__proto__ || Object.getPrototypeOf(MergeCells.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable the plugin.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.clearCollections();\n      this.hot.render();\n      _get(MergeCells.prototype.__proto__ || Object.getPrototypeOf(MergeCells.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Update the plugin (after using the `updateSettings` method)\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      var settings = this.hot.getSettings().mergeCells;\n\n      this.clearCollections();\n      this.disablePlugin();\n      this.enablePlugin();\n\n      this.generateFromSettings(settings);\n\n      _get(MergeCells.prototype.__proto__ || Object.getPrototypeOf(MergeCells.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Validate a single setting object, represented by a single merged cell information object.\n     *\n     * @private\n     * @param {Object} setting An object with `row`, `col`, `rowspan` and `colspan` properties.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'validateSetting',\n    value: function validateSetting(setting) {\n      var valid = true;\n\n      if (!setting) {\n        return false;\n      }\n\n      if (_cellCoords2.default.containsNegativeValues(setting)) {\n        (0, _console.warn)(_cellCoords2.default.NEGATIVE_VALUES_WARNING(setting));\n\n        valid = false;\n      } else if (_cellCoords2.default.isOutOfBounds(setting, this.hot.countRows(), this.hot.countCols())) {\n        (0, _console.warn)(_cellCoords2.default.IS_OUT_OF_BOUNDS_WARNING(setting));\n\n        valid = false;\n      } else if (_cellCoords2.default.isSingleCell(setting)) {\n        (0, _console.warn)(_cellCoords2.default.IS_SINGLE_CELL(setting));\n\n        valid = false;\n      } else if (_cellCoords2.default.containsZeroSpan(setting)) {\n        (0, _console.warn)(_cellCoords2.default.ZERO_SPAN_WARNING(setting));\n\n        valid = false;\n      }\n\n      return valid;\n    }\n\n    /**\n     * Generate the merged cells from the settings provided to the plugin.\n     *\n     * @private\n     * @param {Array|Boolean} settings The settings provided to the plugin.\n     */\n\n  }, {\n    key: 'generateFromSettings',\n    value: function generateFromSettings(settings) {\n      var _this3 = this;\n\n      if (Array.isArray(settings)) {\n        var _hot;\n\n        var populationArgumentsList = [];\n\n        (0, _array.arrayEach)(settings, function (setting) {\n          if (!_this3.validateSetting(setting)) {\n            return;\n          }\n\n          var highlight = new _src.CellCoords(setting.row, setting.col);\n          var rangeEnd = new _src.CellCoords(setting.row + setting.rowspan - 1, setting.col + setting.colspan - 1);\n          var mergeRange = new _src.CellRange(highlight, highlight, rangeEnd);\n\n          populationArgumentsList.push(_this3.mergeRange(mergeRange, true, true));\n        });\n\n        // remove 'empty' setting objects, caused by improper merge range declarations\n        populationArgumentsList = populationArgumentsList.filter(function (value) {\n          return value !== true;\n        });\n\n        var bulkPopulationData = this.getBulkCollectionData(populationArgumentsList);\n\n        (_hot = this.hot).populateFromArray.apply(_hot, _toConsumableArray(bulkPopulationData));\n      }\n    }\n\n    /**\n     * Generates a bulk set of all the data to be populated to fill the data \"under\" the added merged cells.\n     *\n     * @private\n     * @param {Array} populationArgumentsList Array in a form of `[row, column, dataUnderCollection]`.\n     * @return {Array} Array in a form of `[row, column, dataOfAllCollections]`.\n     */\n\n  }, {\n    key: 'getBulkCollectionData',\n    value: function getBulkCollectionData(populationArgumentsList) {\n      var _hot2;\n\n      var populationDataRange = this.getBulkCollectionDataRange(populationArgumentsList);\n      var dataAtRange = (_hot2 = this.hot).getData.apply(_hot2, _toConsumableArray(populationDataRange));\n      var newDataAtRange = dataAtRange.splice(0);\n\n      (0, _array.arrayEach)(populationArgumentsList, function (mergedCellArguments) {\n        var _mergedCellArguments = _slicedToArray(mergedCellArguments, 3),\n            mergedCellRowIndex = _mergedCellArguments[0],\n            mergedCellColumnIndex = _mergedCellArguments[1],\n            mergedCellData = _mergedCellArguments[2];\n\n        (0, _array.arrayEach)(mergedCellData, function (mergedCellRow, rowIndex) {\n          (0, _array.arrayEach)(mergedCellRow, function (mergedCellElement, columnIndex) {\n            newDataAtRange[mergedCellRowIndex - populationDataRange[0] + rowIndex][mergedCellColumnIndex - populationDataRange[1] + columnIndex] = mergedCellElement;\n          });\n        });\n      });\n\n      return [populationDataRange[0], populationDataRange[1], newDataAtRange];\n    }\n\n    /**\n     * Get the range of combined data ranges provided in a form of an array of arrays ([row, column, dataUnderCollection])\n     *\n     * @private\n     * @param {Array} populationArgumentsList Array containing argument lists for the `populateFromArray` method - row, column and data for population.\n     * @return {Array[]} Start and end coordinates of the merged cell range. (in a form of [rowIndex, columnIndex])\n     */\n\n  }, {\n    key: 'getBulkCollectionDataRange',\n    value: function getBulkCollectionDataRange(populationArgumentsList) {\n      var start = [0, 0];\n      var end = [0, 0];\n      var mergedCellRow = null;\n      var mergedCellColumn = null;\n      var mergedCellData = null;\n\n      (0, _array.arrayEach)(populationArgumentsList, function (mergedCellArguments) {\n        mergedCellRow = mergedCellArguments[0];\n        mergedCellColumn = mergedCellArguments[1];\n        mergedCellData = mergedCellArguments[2];\n\n        start[0] = Math.min(mergedCellRow, start[0]);\n        start[1] = Math.min(mergedCellColumn, start[1]);\n        end[0] = Math.max(mergedCellRow + mergedCellData.length - 1, end[0]);\n        end[1] = Math.max(mergedCellColumn + mergedCellData[0].length - 1, end[1]);\n      });\n\n      return [].concat(start, end);\n    }\n\n    /**\n     * Clear the merged cells from the merged cell container.\n     */\n\n  }, {\n    key: 'clearCollections',\n    value: function clearCollections() {\n      this.mergedCellsCollection.clear();\n    }\n\n    /**\n     * Returns `true` if a range is mergeable.\n     *\n     * @private\n     * @param {Object} newMergedCellInfo Merged cell information object to test.\n     * @param {Boolean} [auto=false] `true` if triggered at initialization.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'canMergeRange',\n    value: function canMergeRange(newMergedCellInfo) {\n      var auto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      return auto ? true : this.validateSetting(newMergedCellInfo);\n    }\n\n    /**\n     * Merge or unmerge, based on last selected range.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'toggleMergeOnSelection',\n    value: function toggleMergeOnSelection() {\n      var currentRange = this.hot.getSelectedRangeLast();\n\n      if (!currentRange) {\n        return;\n      }\n\n      currentRange.setDirection('NW-SE');\n\n      var from = currentRange.from,\n          to = currentRange.to;\n\n\n      this.toggleMerge(currentRange);\n      this.hot.selectCell(from.row, from.col, to.row, to.col, false);\n    }\n\n    /**\n     * Merge the selection provided as a cell range.\n     *\n     * @param {CellRange} [cellRange] Selection cell range.\n     */\n\n  }, {\n    key: 'mergeSelection',\n    value: function mergeSelection() {\n      var cellRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.hot.getSelectedRangeLast();\n\n      if (!cellRange) {\n        return;\n      }\n\n      cellRange.setDirection('NW-SE');\n\n      var from = cellRange.from,\n          to = cellRange.to;\n\n\n      this.unmergeRange(cellRange, true);\n      this.mergeRange(cellRange);\n      this.hot.selectCell(from.row, from.col, to.row, to.col, false);\n    }\n\n    /**\n     * Unmerge the selection provided as a cell range.\n     *\n     * @param {CellRange} [cellRange] Selection cell range.\n     */\n\n  }, {\n    key: 'unmergeSelection',\n    value: function unmergeSelection() {\n      var cellRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.hot.getSelectedRangeLast();\n\n      if (!cellRange) {\n        return;\n      }\n\n      var from = cellRange.from,\n          to = cellRange.to;\n\n\n      this.unmergeRange(cellRange, true);\n      this.hot.selectCell(from.row, from.col, to.row, to.col, false);\n    }\n\n    /**\n     * Merge cells in the provided cell range.\n     *\n     * @private\n     * @param {CellRange} cellRange Cell range to merge.\n     * @param {Boolean} [auto=false] `true` if is called automatically, e.g. at initialization.\n     * @param {Boolean} [preventPopulation=false] `true`, if the method should not run `populateFromArray` at the end, but rather return its arguments.\n     * @returns {Array|Boolean} Returns an array of [row, column, dataUnderCollection] if preventPopulation is set to true. If the the merging process went successful, it returns `true`, otherwise - `false`.\n     * @fires Hooks#beforeMergeCells\n     * @fires Hooks#afterMergeCells\n     */\n\n  }, {\n    key: 'mergeRange',\n    value: function mergeRange(cellRange) {\n      var _this4 = this;\n\n      var auto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n      var preventPopulation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      var topLeft = cellRange.getTopLeftCorner();\n      var bottomRight = cellRange.getBottomRightCorner();\n      var mergeParent = {\n        row: topLeft.row,\n        col: topLeft.col,\n        rowspan: bottomRight.row - topLeft.row + 1,\n        colspan: bottomRight.col - topLeft.col + 1\n      };\n      var clearedData = [];\n      var populationInfo = null;\n\n      if (!this.canMergeRange(mergeParent, auto)) {\n        return false;\n      }\n\n      this.hot.runHooks('beforeMergeCells', cellRange, auto);\n\n      (0, _number.rangeEach)(0, mergeParent.rowspan - 1, function (i) {\n        (0, _number.rangeEach)(0, mergeParent.colspan - 1, function (j) {\n          var clearedValue = null;\n\n          if (!clearedData[i]) {\n            clearedData[i] = [];\n          }\n\n          if (i === 0 && j === 0) {\n            clearedValue = _this4.hot.getDataAtCell(mergeParent.row, mergeParent.col);\n          } else {\n            _this4.hot.setCellMeta(mergeParent.row + i, mergeParent.col + j, 'hidden', true);\n          }\n\n          clearedData[i][j] = clearedValue;\n        });\n      });\n\n      this.hot.setCellMeta(mergeParent.row, mergeParent.col, 'spanned', true);\n\n      var mergedCellAdded = this.mergedCellsCollection.add(mergeParent);\n\n      if (mergedCellAdded) {\n        if (preventPopulation) {\n          populationInfo = [mergeParent.row, mergeParent.col, clearedData];\n        } else {\n          this.hot.populateFromArray(mergeParent.row, mergeParent.col, clearedData, void 0, void 0, this.pluginName);\n        }\n\n        this.hot.runHooks('afterMergeCells', cellRange, mergeParent, auto);\n\n        return populationInfo;\n      }\n\n      return true;\n    }\n\n    /**\n     * Unmerge the selection provided as a cell range. If no cell range is provided, it uses the current selection.\n     *\n     * @private\n     * @param {CellRange} cellRange Selection cell range.\n     * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n     */\n\n  }, {\n    key: 'unmergeRange',\n    value: function unmergeRange(cellRange) {\n      var _this5 = this;\n\n      var auto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      var mergedCells = this.mergedCellsCollection.getWithinRange(cellRange);\n\n      if (!mergedCells) {\n        return;\n      }\n\n      this.hot.runHooks('beforeUnmergeCells', cellRange, auto);\n\n      (0, _array.arrayEach)(mergedCells, function (currentCollection) {\n        _this5.mergedCellsCollection.remove(currentCollection.row, currentCollection.col);\n\n        (0, _number.rangeEach)(0, currentCollection.rowspan - 1, function (i) {\n          (0, _number.rangeEach)(0, currentCollection.colspan - 1, function (j) {\n            _this5.hot.removeCellMeta(currentCollection.row + i, currentCollection.col + j, 'hidden');\n          });\n        });\n\n        _this5.hot.removeCellMeta(currentCollection.row, currentCollection.col, 'spanned');\n      });\n\n      this.hot.render();\n      this.hot.runHooks('afterUnmergeCells', cellRange, auto);\n    }\n\n    /**\n     * Merge or unmerge, based on the cell range provided as `cellRange`.\n     *\n     * @private\n     * @param {CellRange} cellRange The cell range to merge or unmerged.\n     */\n\n  }, {\n    key: 'toggleMerge',\n    value: function toggleMerge(cellRange) {\n      var mergedCell = this.mergedCellsCollection.get(cellRange.from.row, cellRange.from.col);\n      var mergedCellCoversWholeRange = mergedCell.row === cellRange.from.row && mergedCell.col === cellRange.from.col && mergedCell.row + mergedCell.rowspan - 1 === cellRange.to.row && mergedCell.col + mergedCell.colspan - 1 === cellRange.to.col;\n\n      if (mergedCellCoversWholeRange) {\n        this.unmergeRange(cellRange);\n      } else {\n        this.mergeSelection(cellRange);\n      }\n    }\n\n    /**\n     * Merge the specified range.\n     *\n     * @param {Number} startRow Start row of the merged cell.\n     * @param {Number} startColumn Start column of the merged cell.\n     * @param {Number} endRow End row of the merged cell.\n     * @param {Number} endColumn End column of the merged cell.\n     */\n\n  }, {\n    key: 'merge',\n    value: function merge(startRow, startColumn, endRow, endColumn) {\n      var start = new _src.CellCoords(startRow, startColumn);\n      var end = new _src.CellCoords(endRow, endColumn);\n\n      this.mergeRange(new _src.CellRange(start, start, end));\n    }\n\n    /**\n     * Unmerge the merged cell in the provided range.\n     *\n     * @param {Number} startRow Start row of the merged cell.\n     * @param {Number} startColumn Start column of the merged cell.\n     * @param {Number} endRow End row of the merged cell.\n     * @param {Number} endColumn End column of the merged cell.\n     */\n\n  }, {\n    key: 'unmerge',\n    value: function unmerge(startRow, startColumn, endRow, endColumn) {\n      var start = new _src.CellCoords(startRow, startColumn);\n      var end = new _src.CellCoords(endRow, endColumn);\n\n      this.unmergeRange(new _src.CellRange(start, start, end));\n    }\n\n    /**\n     * `afterInit` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      this.generateFromSettings(this.hot.getSettings().mergeCells);\n      this.hot.render();\n    }\n\n    /**\n     * `beforeKeyDown` hook callback.\n     *\n     * @private\n     * @param {KeyboardEvent} event The `keydown` event object.\n     */\n\n  }, {\n    key: 'onBeforeKeyDown',\n    value: function onBeforeKeyDown(event) {\n      var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey;\n\n      if (ctrlDown && event.keyCode === 77) {\n        // CTRL + M\n        this.toggleMerge(this.hot.getSelectedRangeLast());\n\n        this.hot.render();\n        (0, _event.stopImmediatePropagation)(event);\n      }\n    }\n\n    /**\n     * Modify the information on whether the current selection contains multiple cells. The `afterIsMultipleSelection` hook callback.\n     *\n     * @private\n     * @param {Boolean} isMultiple\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'onAfterIsMultipleSelection',\n    value: function onAfterIsMultipleSelection(isMultiple) {\n      if (isMultiple) {\n        var mergedCells = this.mergedCellsCollection.mergedCells;\n        var selectionRange = this.hot.getSelectedRangeLast();\n\n        for (var group = 0; group < mergedCells.length; group += 1) {\n          if (selectionRange.highlight.row === mergedCells[group].row && selectionRange.highlight.col === mergedCells[group].col && selectionRange.to.row === mergedCells[group].row + mergedCells[group].rowspan - 1 && selectionRange.to.col === mergedCells[group].col + mergedCells[group].colspan - 1) {\n            return false;\n          }\n        }\n      }\n\n      return isMultiple;\n    }\n\n    /**\n     * `modifyTransformStart` hook callback.\n     *\n     * @private\n     * @param {Object} delta The transformation delta.\n     */\n\n  }, {\n    key: 'onModifyTransformStart',\n    value: function onModifyTransformStart(delta) {\n      var priv = privatePool.get(this);\n      var currentlySelectedRange = this.hot.getSelectedRangeLast();\n      var newDelta = {\n        row: delta.row,\n        col: delta.col\n      };\n      var nextPosition = null;\n      var currentPosition = new _src.CellCoords(currentlySelectedRange.highlight.row, currentlySelectedRange.highlight.col);\n      var mergedParent = this.mergedCellsCollection.get(currentPosition.row, currentPosition.col);\n\n      if (!priv.lastDesiredCoords) {\n        priv.lastDesiredCoords = new _src.CellCoords(null, null);\n      }\n\n      if (mergedParent) {\n        // only merge selected\n        var mergeTopLeft = new _src.CellCoords(mergedParent.row, mergedParent.col);\n        var mergeBottomRight = new _src.CellCoords(mergedParent.row + mergedParent.rowspan - 1, mergedParent.col + mergedParent.colspan - 1);\n        var mergeRange = new _src.CellRange(mergeTopLeft, mergeTopLeft, mergeBottomRight);\n\n        if (!mergeRange.includes(priv.lastDesiredCoords)) {\n          priv.lastDesiredCoords = new _src.CellCoords(null, null); // reset outdated version of lastDesiredCoords\n        }\n\n        newDelta.row = priv.lastDesiredCoords.row ? priv.lastDesiredCoords.row - currentPosition.row : newDelta.row;\n        newDelta.col = priv.lastDesiredCoords.col ? priv.lastDesiredCoords.col - currentPosition.col : newDelta.col;\n\n        if (delta.row > 0) {\n          // moving down\n          newDelta.row = mergedParent.row + mergedParent.rowspan - 1 - currentPosition.row + delta.row;\n        } else if (delta.row < 0) {\n          // moving up\n          newDelta.row = currentPosition.row - mergedParent.row + delta.row;\n        }\n\n        if (delta.col > 0) {\n          // moving right\n          newDelta.col = mergedParent.col + mergedParent.colspan - 1 - currentPosition.col + delta.col;\n        } else if (delta.col < 0) {\n          // moving left\n          newDelta.col = currentPosition.col - mergedParent.col + delta.col;\n        }\n      }\n\n      nextPosition = new _src.CellCoords(currentlySelectedRange.highlight.row + newDelta.row, currentlySelectedRange.highlight.col + newDelta.col);\n\n      var nextParentIsMerged = this.mergedCellsCollection.get(nextPosition.row, nextPosition.col);\n\n      if (nextParentIsMerged) {\n        // skipping the invisible cells in the merge range\n        priv.lastDesiredCoords = nextPosition;\n        newDelta = {\n          row: nextParentIsMerged.row - currentPosition.row,\n          col: nextParentIsMerged.col - currentPosition.col\n        };\n      }\n\n      if (newDelta.row !== 0) {\n        delta.row = newDelta.row;\n      }\n      if (newDelta.col !== 0) {\n        delta.col = newDelta.col;\n      }\n    }\n\n    /**\n     * `modifyTransformEnd` hook callback. Needed to handle \"jumping over\" merged merged cells, while selecting.\n     *\n     * @private\n     * @param {Object} delta The transformation delta.\n     */\n\n  }, {\n    key: 'onModifyTransformEnd',\n    value: function onModifyTransformEnd(delta) {\n      var _this6 = this;\n\n      var currentSelectionRange = this.hot.getSelectedRangeLast();\n      var newDelta = (0, _object.clone)(delta);\n      var newSelectionRange = this.selectionCalculations.getUpdatedSelectionRange(currentSelectionRange, delta);\n      var tempDelta = (0, _object.clone)(newDelta);\n\n      var mergedCellsWithinRange = this.mergedCellsCollection.getWithinRange(newSelectionRange, true);\n\n      do {\n        tempDelta = (0, _object.clone)(newDelta);\n        this.selectionCalculations.getUpdatedSelectionRange(currentSelectionRange, newDelta);\n\n        (0, _array.arrayEach)(mergedCellsWithinRange, function (mergedCell) {\n          _this6.selectionCalculations.snapDelta(newDelta, currentSelectionRange, mergedCell);\n        });\n      } while (newDelta.row !== tempDelta.row || newDelta.col !== tempDelta.col);\n\n      delta.row = newDelta.row;\n      delta.col = newDelta.col;\n    }\n\n    /**\n     * `modifyGetCellCoords` hook callback. Swaps the `getCell` coords with the merged parent coords.\n     *\n     * @private\n     * @param {Number} row Row index.\n     * @param {Number} column Column index.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'onModifyGetCellCoords',\n    value: function onModifyGetCellCoords(row, column) {\n      var mergeParent = this.mergedCellsCollection.get(row, column);\n\n      return mergeParent ? [mergeParent.row, mergeParent.col, mergeParent.row + mergeParent.rowspan - 1, mergeParent.col + mergeParent.colspan - 1] : void 0;\n    }\n\n    /**\n     * `afterContextMenuDefaultOptions` hook callback.\n     *\n     * @private\n     * @param {Object} defaultOptions The default context menu options.\n     */\n\n  }, {\n    key: 'addMergeActionsToContextMenu',\n    value: function addMergeActionsToContextMenu(defaultOptions) {\n      defaultOptions.items.push({\n        name: '---------'\n      }, (0, _toggleMerge2.default)(this));\n    }\n\n    /**\n     * `afterRenderer` hook callback.\n     *\n     * @private\n     * @param {HTMLElement} TD The cell to be modified.\n     * @param {Number} row Row index.\n     * @param {Number} col Column index.\n     */\n\n  }, {\n    key: 'onAfterRenderer',\n    value: function onAfterRenderer(TD, row, col) {\n      var mergedCell = this.mergedCellsCollection.get(row, col);\n\n      (0, _utils.applySpanProperties)(TD, mergedCell, row, col);\n    }\n\n    /**\n     * `beforeSetRangeEnd` hook callback.\n     * While selecting cells with keyboard or mouse, make sure that rectangular area is expanded to the extent of the merged cell\n     *\n     * @private\n     * @param {Object} coords Cell coords.\n     */\n\n  }, {\n    key: 'onBeforeSetRangeEnd',\n    value: function onBeforeSetRangeEnd(coords) {\n      var selRange = this.hot.getSelectedRangeLast();\n      selRange.highlight = new _src.CellCoords(selRange.highlight.row, selRange.highlight.col); // clone in case we will modify its reference\n      selRange.to = coords;\n      var rangeExpanded = false;\n\n      if (selRange.from.row === 0 && selRange.to.row === this.hot.countRows() - 1 || selRange.from.col === 0 && selRange.to.col === this.hot.countCols() - 1) {\n        return;\n      }\n\n      do {\n        rangeExpanded = false;\n\n        for (var i = 0; i < this.mergedCellsCollection.mergedCells.length; i += 1) {\n          var cellInfo = this.mergedCellsCollection.mergedCells[i];\n          var mergedCellRange = cellInfo.getRange();\n\n          if (selRange.expandByRange(mergedCellRange)) {\n            coords.row = selRange.to.row;\n            coords.col = selRange.to.col;\n\n            rangeExpanded = true;\n          }\n        }\n      } while (rangeExpanded);\n    }\n\n    /**\n     * The `afterGetCellMeta` hook callback.\n     *\n     * @private\n     * @param {Number} row Row index.\n     * @param {Number} col Column index.\n     * @param {Object} cellProperties The cell properties object.\n     */\n\n  }, {\n    key: 'onAfterGetCellMeta',\n    value: function onAfterGetCellMeta(row, col, cellProperties) {\n      var mergeParent = this.mergedCellsCollection.get(row, col);\n\n      if (mergeParent && (mergeParent.row !== row || mergeParent.col !== col)) {\n        cellProperties.copyable = false;\n      }\n    }\n\n    /**\n     * `afterViewportRowCalculatorOverride` hook callback.\n     *\n     * @private\n     * @param {Object} calc The row calculator object.\n     */\n\n  }, {\n    key: 'onAfterViewportRowCalculatorOverride',\n    value: function onAfterViewportRowCalculatorOverride(calc) {\n      var _this7 = this;\n\n      var colCount = this.hot.countCols();\n      var mergeParent = void 0;\n\n      (0, _number.rangeEach)(0, colCount - 1, function (c) {\n        mergeParent = _this7.mergedCellsCollection.get(calc.startRow, c);\n        if (mergeParent) {\n          if (mergeParent.row < calc.startRow) {\n            calc.startRow = mergeParent.row;\n            return _this7.onAfterViewportRowCalculatorOverride.call(_this7, calc); // recursively search upwards\n          }\n        }\n\n        mergeParent = _this7.mergedCellsCollection.get(calc.endRow, c);\n\n        if (mergeParent) {\n          var mergeEnd = mergeParent.row + mergeParent.rowspan - 1;\n          if (mergeEnd > calc.endRow) {\n            calc.endRow = mergeEnd;\n            return _this7.onAfterViewportRowCalculatorOverride.call(_this7, calc); // recursively search upwards\n          }\n        }\n\n        return true;\n      });\n    }\n\n    /**\n     * `afterViewportColumnCalculatorOverride` hook callback.\n     *\n     * @private\n     * @param {Object} calc The column calculator object.\n     */\n\n  }, {\n    key: 'onAfterViewportColumnCalculatorOverride',\n    value: function onAfterViewportColumnCalculatorOverride(calc) {\n      var _this8 = this;\n\n      var rowCount = this.hot.countRows();\n      var mergeParent = void 0;\n\n      (0, _number.rangeEach)(0, rowCount - 1, function (r) {\n        mergeParent = _this8.mergedCellsCollection.get(r, calc.startColumn);\n\n        if (mergeParent && mergeParent.col < calc.startColumn) {\n          calc.startColumn = mergeParent.col;\n          return _this8.onAfterViewportColumnCalculatorOverride.call(_this8, calc); // recursively search upwards\n        }\n\n        mergeParent = _this8.mergedCellsCollection.get(r, calc.endColumn);\n\n        if (mergeParent) {\n          var mergeEnd = mergeParent.col + mergeParent.colspan - 1;\n          if (mergeEnd > calc.endColumn) {\n            calc.endColumn = mergeEnd;\n            return _this8.onAfterViewportColumnCalculatorOverride.call(_this8, calc); // recursively search upwards\n          }\n        }\n\n        return true;\n      });\n    }\n\n    /**\n     * The `modifyAutofillRange` hook callback.\n     *\n     * @private\n     * @param {Array} drag The drag area coordinates.\n     * @param {Array} select The selection information.\n     * @return {Array} The new drag area.\n     */\n\n  }, {\n    key: 'onModifyAutofillRange',\n    value: function onModifyAutofillRange(drag, select) {\n      this.autofillCalculations.correctSelectionAreaSize(select);\n      var dragDirection = this.autofillCalculations.getDirection(select, drag);\n\n      if (this.autofillCalculations.dragAreaOverlapsCollections(select, drag, dragDirection)) {\n        drag = select;\n        return drag;\n      }\n\n      var mergedCellsWithinSelectionArea = this.mergedCellsCollection.getWithinRange({\n        from: { row: select[0], col: select[1] },\n        to: { row: select[2], col: select[3] }\n      });\n\n      if (!mergedCellsWithinSelectionArea) {\n        return drag;\n      }\n\n      drag = this.autofillCalculations.snapDragArea(select, drag, dragDirection, mergedCellsWithinSelectionArea);\n\n      return drag;\n    }\n\n    /**\n     * `afterCreateCol` hook callback.\n     *\n     * @private\n     * @param {Number} column Column index.\n     * @param {Number} count Number of created columns.\n     */\n\n  }, {\n    key: 'onAfterCreateCol',\n    value: function onAfterCreateCol(column, count) {\n      this.mergedCellsCollection.shiftCollections('right', column, count);\n    }\n\n    /**\n     * `afterRemoveCol` hook callback.\n     *\n     * @private\n     * @param {Number} column Column index.\n     * @param {Number} count Number of removed columns.\n     */\n\n  }, {\n    key: 'onAfterRemoveCol',\n    value: function onAfterRemoveCol(column, count) {\n      this.mergedCellsCollection.shiftCollections('left', column, count);\n    }\n\n    /**\n     * `afterCreateRow` hook callback.\n     *\n     * @private\n     * @param {Number} row Row index.\n     * @param {Number} count Number of created rows.\n     * @param {String} source Source of change.\n     */\n\n  }, {\n    key: 'onAfterCreateRow',\n    value: function onAfterCreateRow(row, count, source) {\n      if (source === 'auto') {\n        return;\n      }\n\n      this.mergedCellsCollection.shiftCollections('down', row, count);\n    }\n\n    /**\n     * `afterRemoveRow` hook callback.\n     *\n     * @private\n     * @param {Number} row Row index.\n     * @param {Number} count Number of removed rows.\n     */\n\n  }, {\n    key: 'onAfterRemoveRow',\n    value: function onAfterRemoveRow(row, count) {\n      this.mergedCellsCollection.shiftCollections('up', row, count);\n    }\n\n    /**\n     * `afterChange` hook callback. Used to propagate merged cells after using Autofill.\n     *\n     * @private\n     * @param {Array} changes The changes array.\n     * @param {String} source Determines the source of the change.\n     */\n\n  }, {\n    key: 'onAfterChange',\n    value: function onAfterChange(changes, source) {\n      if (source !== 'Autofill.fill') {\n        return;\n      }\n\n      this.autofillCalculations.recreateAfterDataPopulation(changes);\n    }\n\n    /**\n     * `beforeDrawAreaBorders` hook callback.\n     *\n     * @private\n     * @param {Array} corners Coordinates of the area corners.\n     * @param {String} className Class name for the area.\n     */\n\n  }, {\n    key: 'onBeforeDrawAreaBorders',\n    value: function onBeforeDrawAreaBorders(corners, className) {\n      if (className && className === 'area') {\n        var selectedRange = this.hot.getSelectedRangeLast();\n        var mergedCellsWithinRange = this.mergedCellsCollection.getWithinRange(selectedRange);\n\n        (0, _array.arrayEach)(mergedCellsWithinRange, function (mergedCell) {\n          if (selectedRange.getBottomRightCorner().row === mergedCell.getLastRow() && selectedRange.getBottomRightCorner().col === mergedCell.getLastColumn()) {\n            corners[2] = mergedCell.row;\n            corners[3] = mergedCell.col;\n          }\n        });\n      }\n    }\n\n    /**\n     * `afterModifyTransformStart` hook callback. Fixes a problem with navigating through merged cells at the edges of the table\n     * with the ENTER/SHIFT+ENTER/TAB/SHIFT+TAB keys.\n     *\n     * @private\n     * @param {CellCoords} coords Coordinates of the to-be-selected cell.\n     * @param {Number} rowTransformDir Row transformation direction (negative value = up, 0 = none, positive value = down)\n     * @param {Number} colTransformDir Column transformation direction (negative value = up, 0 = none, positive value = down)\n     */\n\n  }, {\n    key: 'onAfterModifyTransformStart',\n    value: function onAfterModifyTransformStart(coords, rowTransformDir, colTransformDir) {\n      if (!this.enabled) {\n        return;\n      }\n\n      var mergedCellAtCoords = this.mergedCellsCollection.get(coords.row, coords.col);\n\n      if (!mergedCellAtCoords) {\n        return;\n      }\n\n      var goingDown = rowTransformDir > 0;\n      var goingUp = rowTransformDir < 0;\n      var goingLeft = colTransformDir < 0;\n      var goingRight = colTransformDir > 0;\n      var mergedCellOnBottomEdge = mergedCellAtCoords.row + mergedCellAtCoords.rowspan - 1 === this.hot.countRows() - 1;\n      var mergedCellOnTopEdge = mergedCellAtCoords.row === 0;\n      var mergedCellOnRightEdge = mergedCellAtCoords.col + mergedCellAtCoords.colspan - 1 === this.hot.countCols() - 1;\n      var mergedCellOnLeftEdge = mergedCellAtCoords.col === 0;\n\n      if (goingDown && mergedCellOnBottomEdge || goingUp && mergedCellOnTopEdge || goingRight && mergedCellOnRightEdge || goingLeft && mergedCellOnLeftEdge) {\n        coords.row = mergedCellAtCoords.row;\n        coords.col = mergedCellAtCoords.col;\n      }\n    }\n\n    /**\n     * `afterDrawSelection` hook callback. Used to add the additional class name for the entirely-selected merged cells.\n     *\n     * @private\n     * @param {Number} currentRow Row index of the currently processed cell.\n     * @param {Number} currentColumn Column index of the currently cell.\n     * @param {Array} cornersOfSelection Array of the current selection in a form of `[startRow, startColumn, endRow, endColumn]`.\n     * @param {Number|undefined} layerLevel Number indicating which layer of selection is currently processed.\n     * @returns {String|undefined} A `String`, which will act as an additional `className` to be added to the currently processed cell.\n     */\n\n  }, {\n    key: 'onAfterDrawSelection',\n    value: function onAfterDrawSelection(currentRow, currentColumn, cornersOfSelection, layerLevel) {\n      return this.selectionCalculations.getSelectedMergedCellClassName(currentRow, currentColumn, cornersOfSelection, layerLevel);\n    }\n\n    /**\n     * `beforeRemoveCellClassNames` hook callback. Used to remove additional class name from all cells in the table.\n     *\n     * @private\n     * @returns {String[]} An `Array` of `String`s. Each of these strings will act like class names to be removed from all the cells in the table.\n     */\n\n  }, {\n    key: 'onBeforeRemoveCellClassNames',\n    value: function onBeforeRemoveCellClassNames() {\n      return this.selectionCalculations.getSelectedMergedCellClassNameToRemove();\n    }\n  }]);\n\n  return MergeCells;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('mergeCells', MergeCells);\n\nexports.default = MergeCells;\n\n/***/ }),\n/* 467 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['The merged cell declared at [', ', ', '] overlaps with the other declared merged \\n      cell. The overlapping merged cell was not added to the table, please fix your setup.'], ['The merged cell declared at [', ', ', '] overlaps with the other declared merged \\n      cell. The overlapping merged cell was not added to the table, please fix your setup.']);\n\nvar _cellCoords = __webpack_require__(95);\n\nvar _cellCoords2 = _interopRequireDefault(_cellCoords);\n\nvar _index = __webpack_require__(4);\n\nvar _number = __webpack_require__(5);\n\nvar _console = __webpack_require__(56);\n\nvar _array = __webpack_require__(1);\n\nvar _utils = __webpack_require__(324);\n\nvar _templateLiteralTag = __webpack_require__(42);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Defines a container object for the merged cells.\n *\n * @class MergedCellsCollection\n * @plugin MergeCells\n */\nvar MergedCellsCollection = function () {\n  function MergedCellsCollection(plugin) {\n    _classCallCheck(this, MergedCellsCollection);\n\n    /**\n     * Reference to the Merge Cells plugin.\n     *\n     * @type {MergeCells}\n     */\n    this.plugin = plugin;\n    /**\n     * Array of merged cells.\n     *\n     * @type {Array}\n     */\n    this.mergedCells = [];\n    /**\n     * The Handsontable instance.\n     *\n     * @type {Handsontable}\n     */\n    this.hot = plugin.hot;\n  }\n\n  /**\n   * Get a warning message for when the declared merged cell data overlaps already existing merged cells.\n   *\n   * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n   * @return {String}\n   */\n\n\n  _createClass(MergedCellsCollection, [{\n    key: 'get',\n\n\n    /**\n     * Get a merged cell from the container, based on the provided arguments. You can provide either the \"starting coordinates\"\n     * of a merged cell, or any coordinates from the body of the merged cell.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} column Column index.\n     * @returns {MergedCellCoords|Boolean} Returns a wanted merged cell on success and `false` on failure.\n     */\n    value: function get(row, column) {\n      var mergedCells = this.mergedCells;\n      var result = false;\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        if (mergedCell.row <= row && mergedCell.row + mergedCell.rowspan - 1 >= row && mergedCell.col <= column && mergedCell.col + mergedCell.colspan - 1 >= column) {\n          result = mergedCell;\n          return false;\n        }\n\n        return true;\n      });\n\n      return result;\n    }\n\n    /**\n     * Get a merged cell containing the provided range.\n     *\n     * @param {CellRange|Object} range The range to search merged cells for.\n     * @return {MergedCellCoords|Boolean}\n     */\n\n  }, {\n    key: 'getByRange',\n    value: function getByRange(range) {\n      var mergedCells = this.mergedCells;\n      var result = false;\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        if (mergedCell.row <= range.from.row && mergedCell.row + mergedCell.rowspan - 1 >= range.to.row && mergedCell.col <= range.from.col && mergedCell.col + mergedCell.colspan - 1 >= range.to.col) {\n          result = mergedCell;\n          return result;\n        }\n\n        return true;\n      });\n\n      return result;\n    }\n\n    /**\n     * Get a merged cell contained in the provided range.\n     *\n     * @param {CellRange|Object} range The range to search merged cells in.\n     * @param [countPartials=false] If set to `true`, all the merged cells overlapping the range will be taken into calculation.\n     * @return {Array|Boolean} Array of found merged cells of `false` if none were found.\n     */\n\n  }, {\n    key: 'getWithinRange',\n    value: function getWithinRange(range) {\n      var countPartials = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      var mergedCells = this.mergedCells;\n      var foundMergedCells = [];\n\n      if (!range.includesRange) {\n        var from = new _index.CellCoords(range.from.row, range.from.col);\n        var to = new _index.CellCoords(range.to.row, range.to.col);\n        range = new _index.CellRange(from, from, to);\n      }\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        var mergedCellTopLeft = new _index.CellCoords(mergedCell.row, mergedCell.col);\n        var mergedCellBottomRight = new _index.CellCoords(mergedCell.row + mergedCell.rowspan - 1, mergedCell.col + mergedCell.colspan - 1);\n        var mergedCellRange = new _index.CellRange(mergedCellTopLeft, mergedCellTopLeft, mergedCellBottomRight);\n\n        if (countPartials) {\n          if (range.overlaps(mergedCellRange)) {\n            foundMergedCells.push(mergedCell);\n          }\n        } else if (range.includesRange(mergedCellRange)) {\n          foundMergedCells.push(mergedCell);\n        }\n      });\n\n      return foundMergedCells.length ? foundMergedCells : false;\n    }\n\n    /**\n     * Add a merged cell to the container.\n     *\n     * @param {Object} mergedCellInfo The merged cell information object. Has to contain `row`, `col`, `colspan` and `rowspan` properties.\n     * @return {MergedCellCoords|Boolean} Returns the new merged cell on success and `false` on failure.\n     */\n\n  }, {\n    key: 'add',\n    value: function add(mergedCellInfo) {\n      var mergedCells = this.mergedCells;\n      var row = mergedCellInfo.row;\n      var column = mergedCellInfo.col;\n      var rowspan = mergedCellInfo.rowspan;\n      var colspan = mergedCellInfo.colspan;\n      var newMergedCell = new _cellCoords2.default(row, column, rowspan, colspan);\n      var alreadyExists = this.get(row, column);\n      var isOverlapping = this.isOverlapping(newMergedCell);\n\n      if (!alreadyExists && !isOverlapping) {\n        if (this.hot) {\n          newMergedCell.normalize(this.hot);\n        }\n\n        mergedCells.push(newMergedCell);\n\n        return newMergedCell;\n      }\n\n      (0, _console.warn)(MergedCellsCollection.IS_OVERLAPPING_WARNING(newMergedCell));\n\n      return false;\n    }\n\n    /**\n     * Remove a merged cell from the container. You can provide either the \"starting coordinates\"\n     * of a merged cell, or any coordinates from the body of the merged cell.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} column Column index.\n     * @return {MergedCellCoords|Boolean} Returns the removed merged cell on success and `false` on failure.\n     */\n\n  }, {\n    key: 'remove',\n    value: function remove(row, column) {\n      var mergedCells = this.mergedCells;\n      var wantedCollection = this.get(row, column);\n      var wantedCollectionIndex = wantedCollection ? this.mergedCells.indexOf(wantedCollection) : null;\n\n      if (wantedCollection && wantedCollectionIndex !== false) {\n        mergedCells.splice(wantedCollectionIndex, 1);\n        return wantedCollection;\n      }\n\n      return false;\n    }\n\n    /**\n     * Clear all the merged cells.\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      var _this = this;\n\n      var mergedCells = this.mergedCells;\n      var mergedCellParentsToClear = [];\n      var hiddenCollectionElements = [];\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        mergedCellParentsToClear.push([_this.hot.getCell(mergedCell.row, mergedCell.col), _this.get(mergedCell.row, mergedCell.col), mergedCell.row, mergedCell.col]);\n      });\n\n      this.mergedCells.length = 0;\n\n      (0, _array.arrayEach)(mergedCellParentsToClear, function (mergedCell, i) {\n        (0, _number.rangeEach)(0, mergedCell.rowspan - 1, function (j) {\n          (0, _number.rangeEach)(0, mergedCell.colspan - 1, function (k) {\n            if (k !== 0 || j !== 0) {\n              hiddenCollectionElements.push([_this.hot.getCell(mergedCell.row + j, mergedCell.col + k), null, null, null]);\n            }\n          });\n        });\n\n        mergedCellParentsToClear[i][1] = null;\n      });\n\n      (0, _array.arrayEach)(mergedCellParentsToClear, function (mergedCellParents) {\n        _utils.applySpanProperties.apply(undefined, _toConsumableArray(mergedCellParents));\n      });\n\n      (0, _array.arrayEach)(hiddenCollectionElements, function (hiddenCollectionElement) {\n        _utils.applySpanProperties.apply(undefined, _toConsumableArray(hiddenCollectionElement));\n      });\n    }\n\n    /**\n     * Check if the provided merged cell overlaps with the others in the container.\n     *\n     * @param {MergedCellCoords} mergedCell The merged cell to check against all others in the container.\n     * @return {Boolean} `true` if the provided merged cell overlaps with the others, `false` otherwise.\n     */\n\n  }, {\n    key: 'isOverlapping',\n    value: function isOverlapping(mergedCell) {\n      var mergedCellRange = new _index.CellRange(null, new _index.CellCoords(mergedCell.row, mergedCell.col), new _index.CellCoords(mergedCell.row + mergedCell.rowspan - 1, mergedCell.col + mergedCell.colspan - 1));\n      var result = false;\n\n      (0, _array.arrayEach)(this.mergedCells, function (col) {\n        var currentRange = new _index.CellRange(null, new _index.CellCoords(col.row, col.col), new _index.CellCoords(col.row + col.rowspan - 1, col.col + col.colspan - 1));\n\n        if (currentRange.overlaps(mergedCellRange)) {\n          result = true;\n          return false;\n        }\n\n        return true;\n      });\n\n      return result;\n    }\n\n    /**\n     * Check whether the provided row/col coordinates direct to a merged parent.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} column Column index.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isMergedParent',\n    value: function isMergedParent(row, column) {\n      var mergedCells = this.mergedCells;\n      var result = false;\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        if (mergedCell.row === row && mergedCell.col === column) {\n          result = true;\n          return false;\n        }\n\n        return true;\n      });\n\n      return result;\n    }\n\n    /**\n     * Shift the merged cell in the direction and by an offset defined in the arguments.\n     *\n     * @param {String} direction `right`, `left`, `up` or `down`.\n     * @param {Number} index Index where the change, which caused the shifting took place.\n     * @param {Number} count Number of rows/columns added/removed in the preceding action.\n     */\n\n  }, {\n    key: 'shiftCollections',\n    value: function shiftCollections(direction, index, count) {\n      var _this2 = this;\n\n      var shiftVector = [0, 0];\n\n      switch (direction) {\n        case 'right':\n          shiftVector[0] += count;\n          break;\n\n        case 'left':\n          shiftVector[0] -= count;\n          break;\n\n        case 'down':\n          shiftVector[1] += count;\n          break;\n\n        case 'up':\n          shiftVector[1] -= count;\n          break;\n\n        default:\n      }\n\n      (0, _array.arrayEach)(this.mergedCells, function (currentMerge) {\n        currentMerge.shift(shiftVector, index);\n      });\n\n      (0, _number.rangeEachReverse)(this.mergedCells.length - 1, 0, function (i) {\n        var currentMerge = _this2.mergedCells[i];\n\n        if (currentMerge && currentMerge.removed) {\n          _this2.mergedCells.splice(_this2.mergedCells.indexOf(currentMerge), 1);\n        }\n      });\n    }\n  }], [{\n    key: 'IS_OVERLAPPING_WARNING',\n    value: function IS_OVERLAPPING_WARNING(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject, newMergedCell.row, newMergedCell.col);\n    }\n  }]);\n\n  return MergedCellsCollection;\n}();\n\nexports.default = MergedCellsCollection;\n\n/***/ }),\n/* 468 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _src = __webpack_require__(4);\n\nvar _array = __webpack_require__(1);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Class responsible for all of the Autofill-related operations on merged cells.\n *\n * @class AutofillCalculations\n * @plugin MergeCells\n * @util\n */\nvar AutofillCalculations = function () {\n  function AutofillCalculations(plugin) {\n    _classCallCheck(this, AutofillCalculations);\n\n    /**\n     * Reference to the Merge Cells plugin.\n     *\n     * @type {MergeCells}\n     */\n    this.plugin = plugin;\n    /**\n     * Reference to the MergedCellsCollection class instance.\n     *\n     * @type {MergedCellsCollection}\n     */\n    this.mergedCellsCollection = this.plugin.mergedCellsCollection;\n    /**\n     * Cache of the currently processed autofill data.\n     *\n     * @private\n     * @type {Object}\n     */\n    this.currentFillData = null;\n  }\n\n  /**\n   * Correct the provided selection area, so it's not selecting only a part of a merged cell.\n   *\n   * @param {Array} selectionArea\n   */\n\n\n  _createClass(AutofillCalculations, [{\n    key: 'correctSelectionAreaSize',\n    value: function correctSelectionAreaSize(selectionArea) {\n      if (selectionArea[0] === selectionArea[2] && selectionArea[1] === selectionArea[3]) {\n        var mergedCell = this.mergedCellsCollection.get(selectionArea[0], selectionArea[1]);\n\n        if (mergedCell) {\n          selectionArea[2] = selectionArea[0] + mergedCell.rowspan - 1;\n          selectionArea[3] = selectionArea[1] + mergedCell.colspan - 1;\n        }\n      }\n    }\n\n    /**\n     * Get the direction of the autofill process.\n     *\n     * @param {Array} selectionArea The selection area.\n     * @param {Array} finalArea The final area (base + drag).\n     * @return {String} `up`, `down`, `left` or `right`.\n     */\n\n  }, {\n    key: 'getDirection',\n    value: function getDirection(selectionArea, finalArea) {\n      var direction = null;\n\n      if (finalArea[0] === selectionArea[0] && finalArea[1] === selectionArea[1] && finalArea[3] === selectionArea[3]) {\n        direction = 'down';\n      } else if (finalArea[2] === selectionArea[2] && finalArea[1] === selectionArea[1] && finalArea[3] === selectionArea[3]) {\n        direction = 'up';\n      } else if (finalArea[1] === selectionArea[1] && finalArea[2] === selectionArea[2]) {\n        direction = 'right';\n      } else {\n        direction = 'left';\n      }\n\n      return direction;\n    }\n\n    /**\n     * Snap the drag area to the farthest merged cell, so it won't clip any of the merged cells.\n     *\n     * @param {Array} baseArea The base selected area.\n     * @param {Array} dragArea The drag area.\n     * @param {String} dragDirection The autofill drag direction.\n     * @param {Array} foundMergedCells MergeCellCoords found in the base selection area.\n     * @return {Array} The new drag area\n     */\n\n  }, {\n    key: 'snapDragArea',\n    value: function snapDragArea(baseArea, dragArea, dragDirection, foundMergedCells) {\n      var newDragArea = dragArea.slice(0);\n      var fillSize = this.getAutofillSize(baseArea, dragArea, dragDirection);\n\n      var _baseArea = _slicedToArray(baseArea, 4),\n          baseAreaStartRow = _baseArea[0],\n          baseAreaStartColumn = _baseArea[1],\n          baseAreaEndRow = _baseArea[2],\n          baseAreaEndColumn = _baseArea[3];\n\n      var verticalDirection = ['up', 'down'].indexOf(dragDirection) > -1;\n      var fullCycle = verticalDirection ? baseAreaEndRow - baseAreaStartRow + 1 : baseAreaEndColumn - baseAreaStartColumn + 1;\n      var fulls = Math.floor(fillSize / fullCycle) * fullCycle;\n      var partials = fillSize - fulls;\n      var farthestCollection = this.getFarthestCollection(baseArea, dragArea, dragDirection, foundMergedCells);\n\n      if (farthestCollection) {\n        if (dragDirection === 'down') {\n          var fill = farthestCollection.row + farthestCollection.rowspan - baseAreaStartRow - partials;\n          var newLimit = newDragArea[2] + fill;\n\n          if (newLimit >= this.plugin.hot.countRows()) {\n            newDragArea[2] -= partials;\n          } else {\n            newDragArea[2] += partials ? fill : 0;\n          }\n        } else if (dragDirection === 'right') {\n          var _fill = farthestCollection.col + farthestCollection.colspan - baseAreaStartColumn - partials;\n          var _newLimit = newDragArea[3] + _fill;\n\n          if (_newLimit >= this.plugin.hot.countCols()) {\n            newDragArea[3] -= partials;\n          } else {\n            newDragArea[3] += partials ? _fill : 0;\n          }\n        } else if (dragDirection === 'up') {\n          var _fill2 = baseAreaEndRow - partials - farthestCollection.row + 1;\n          var _newLimit2 = newDragArea[0] + _fill2;\n\n          if (_newLimit2 < 0) {\n            newDragArea[0] += partials;\n          } else {\n            newDragArea[0] -= partials ? _fill2 : 0;\n          }\n        } else if (dragDirection === 'left') {\n          var _fill3 = baseAreaEndColumn - partials - farthestCollection.col + 1;\n          var _newLimit3 = newDragArea[1] + _fill3;\n\n          if (_newLimit3 < 0) {\n            newDragArea[1] += partials;\n          } else {\n            newDragArea[1] -= partials ? _fill3 : 0;\n          }\n        }\n      }\n\n      this.updateCurrentFillCache({\n        baseArea: baseArea,\n        dragDirection: dragDirection,\n        foundMergedCells: foundMergedCells,\n        fillSize: fillSize,\n        dragArea: newDragArea,\n        cycleLength: fullCycle\n      });\n\n      return newDragArea;\n    }\n\n    /**\n     * Update the current fill cache with the provided object.\n     *\n     * @private\n     * @param {Object} updateObject\n     */\n\n  }, {\n    key: 'updateCurrentFillCache',\n    value: function updateCurrentFillCache(updateObject) {\n      if (!this.currentFillData) {\n        this.currentFillData = {};\n      }\n\n      (0, _object.extend)(this.currentFillData, updateObject);\n    }\n\n    /**\n     * Get the \"length\" of the drag area.\n     *\n     * @private\n     * @param {Array} baseArea The base selection area.\n     * @param {Array} dragArea The drag area (containing the base area).\n     * @param {String} direction The drag direction.\n     * @return {Number|null} The \"length\" (height or width, depending on the direction) of the drag.\n     */\n\n  }, {\n    key: 'getAutofillSize',\n    value: function getAutofillSize(baseArea, dragArea, direction) {\n      var _baseArea2 = _slicedToArray(baseArea, 4),\n          baseAreaStartRow = _baseArea2[0],\n          baseAreaStartColumn = _baseArea2[1],\n          baseAreaEndRow = _baseArea2[2],\n          baseAreaEndColumn = _baseArea2[3];\n\n      var _dragArea = _slicedToArray(dragArea, 4),\n          dragAreaStartRow = _dragArea[0],\n          dragAreaStartColumn = _dragArea[1],\n          dragAreaEndRow = _dragArea[2],\n          dragAreaEndColumn = _dragArea[3];\n\n      switch (direction) {\n        case 'up':\n          return baseAreaStartRow - dragAreaStartRow;\n        case 'down':\n          return dragAreaEndRow - baseAreaEndRow;\n        case 'left':\n          return baseAreaStartColumn - dragAreaStartColumn;\n        case 'right':\n          return dragAreaEndColumn - baseAreaEndColumn;\n        default:\n          return null;\n      }\n    }\n\n    /**\n     * Trim the default drag area (containing the selection area) to the drag-only area.\n     *\n     * @private\n     * @param {Array} baseArea The base selection area.\n     * @param {Array} dragArea The base selection area extended by the drag area.\n     * @param {String} direction Drag direction.\n     * @return {Array|null} Array representing the drag area coordinates.\n     */\n\n  }, {\n    key: 'getDragArea',\n    value: function getDragArea(baseArea, dragArea, direction) {\n      var _baseArea3 = _slicedToArray(baseArea, 4),\n          baseAreaStartRow = _baseArea3[0],\n          baseAreaStartColumn = _baseArea3[1],\n          baseAreaEndRow = _baseArea3[2],\n          baseAreaEndColumn = _baseArea3[3];\n\n      var _dragArea2 = _slicedToArray(dragArea, 4),\n          dragAreaStartRow = _dragArea2[0],\n          dragAreaStartColumn = _dragArea2[1],\n          dragAreaEndRow = _dragArea2[2],\n          dragAreaEndColumn = _dragArea2[3];\n\n      switch (direction) {\n        case 'up':\n          return [dragAreaStartRow, dragAreaStartColumn, baseAreaStartRow - 1, baseAreaEndColumn];\n        case 'down':\n          return [baseAreaEndRow + 1, baseAreaStartColumn, dragAreaEndRow, baseAreaEndColumn];\n        case 'left':\n          return [dragAreaStartRow, dragAreaStartColumn, baseAreaEndRow, baseAreaStartColumn - 1];\n        case 'right':\n          return [baseAreaStartRow, baseAreaEndColumn + 1, dragAreaEndRow, dragAreaEndColumn];\n        default:\n          return null;\n      }\n    }\n\n    /**\n     * Get the to-be-farthest merged cell in the newly filled area.\n     *\n     * @private\n     * @param {Array} baseArea The base selection area.\n     * @param {Array} dragArea The drag area (containing the base area).\n     * @param {String} direction The drag direction.\n     * @param {Array} mergedCellArray Array of the merged cells found in the base area.\n     * @return {MergedCellCoords|null}\n     */\n\n  }, {\n    key: 'getFarthestCollection',\n    value: function getFarthestCollection(baseArea, dragArea, direction, mergedCellArray) {\n      var _baseArea4 = _slicedToArray(baseArea, 4),\n          baseAreaStartRow = _baseArea4[0],\n          baseAreaStartColumn = _baseArea4[1],\n          baseAreaEndRow = _baseArea4[2],\n          baseAreaEndColumn = _baseArea4[3];\n\n      var verticalDirection = ['up', 'down'].indexOf(direction) > -1;\n      var baseEnd = verticalDirection ? baseAreaEndRow : baseAreaEndColumn;\n      var baseStart = verticalDirection ? baseAreaStartRow : baseAreaStartColumn;\n      var fillSize = this.getAutofillSize(baseArea, dragArea, direction);\n      var fullCycle = verticalDirection ? baseAreaEndRow - baseAreaStartRow + 1 : baseAreaEndColumn - baseAreaStartColumn + 1;\n      var fulls = Math.floor(fillSize / fullCycle) * fullCycle;\n      var partials = fillSize - fulls;\n      var inclusionFunctionName = null;\n      var farthestCollection = null;\n      var endOfDragRecreationIndex = null;\n\n      switch (direction) {\n        case 'up':\n          inclusionFunctionName = 'includesVertically';\n          endOfDragRecreationIndex = baseEnd - partials + 1;\n          break;\n\n        case 'left':\n          inclusionFunctionName = 'includesHorizontally';\n          endOfDragRecreationIndex = baseEnd - partials + 1;\n          break;\n\n        case 'down':\n          inclusionFunctionName = 'includesVertically';\n          endOfDragRecreationIndex = baseStart + partials - 1;\n          break;\n\n        case 'right':\n          inclusionFunctionName = 'includesHorizontally';\n          endOfDragRecreationIndex = baseStart + partials - 1;\n          break;\n\n        default:\n      }\n\n      (0, _array.arrayEach)(mergedCellArray, function (currentCollection) {\n        if (currentCollection[inclusionFunctionName](endOfDragRecreationIndex) && currentCollection.isFarther(farthestCollection, direction)) {\n          farthestCollection = currentCollection;\n        }\n      });\n\n      return farthestCollection;\n    }\n\n    /**\n     * Recreate the merged cells after the autofill process.\n     *\n     * @param {Array} changes Changes made.\n     */\n\n  }, {\n    key: 'recreateAfterDataPopulation',\n    value: function recreateAfterDataPopulation(changes) {\n      if (!this.currentFillData) {\n        return;\n      }\n\n      var fillRange = this.getRangeFromChanges(changes);\n      var foundMergedCells = this.currentFillData.foundMergedCells;\n      var dragDirection = this.currentFillData.dragDirection;\n      var inBounds = function inBounds(current, offset) {\n        switch (dragDirection) {\n          case 'up':\n            return current.row - offset >= fillRange.from.row;\n          case 'down':\n            return current.row + current.rowspan - 1 + offset <= fillRange.to.row;\n          case 'left':\n            return current.col - offset >= fillRange.from.column;\n          case 'right':\n            return current.col + current.colspan - 1 + offset <= fillRange.to.column;\n          default:\n            return null;\n        }\n      };\n      var fillOffset = 0;\n      var current = null;\n      var multiplier = 1;\n\n      do {\n        for (var j = 0; j < foundMergedCells.length; j += 1) {\n          current = foundMergedCells[j];\n\n          fillOffset = multiplier * this.currentFillData.cycleLength;\n\n          if (inBounds(current, fillOffset)) {\n            switch (dragDirection) {\n              case 'up':\n                this.plugin.mergedCellsCollection.add({\n                  row: current.row - fillOffset,\n                  rowspan: current.rowspan,\n                  col: current.col,\n                  colspan: current.colspan\n                });\n                break;\n\n              case 'down':\n                this.plugin.mergedCellsCollection.add({\n                  row: current.row + fillOffset,\n                  rowspan: current.rowspan,\n                  col: current.col,\n                  colspan: current.colspan\n                });\n                break;\n\n              case 'left':\n                this.plugin.mergedCellsCollection.add({\n                  row: current.row,\n                  rowspan: current.rowspan,\n                  col: current.col - fillOffset,\n                  colspan: current.colspan\n                });\n                break;\n\n              case 'right':\n                this.plugin.mergedCellsCollection.add({\n                  row: current.row,\n                  rowspan: current.rowspan,\n                  col: current.col + fillOffset,\n                  colspan: current.colspan\n                });\n                break;\n\n              default:\n            }\n          }\n\n          if (j === foundMergedCells.length - 1) {\n            multiplier += 1;\n          }\n        }\n      } while (inBounds(current, fillOffset));\n\n      this.currentFillData = null;\n      this.plugin.hot.render();\n    }\n\n    /**\n     * Get the drag range from the changes made.\n     *\n     * @private\n     * @param {Array} changes The changes made.\n     * @returns {Object} Object with `from` and `to` properties, both containing `row` and `column` keys.\n     */\n\n  }, {\n    key: 'getRangeFromChanges',\n    value: function getRangeFromChanges(changes) {\n      var rows = { min: null, max: null };\n      var columns = { min: null, max: null };\n\n      (0, _array.arrayEach)(changes, function (change) {\n        if (rows.min === null || change[0] < rows.min) {\n          rows.min = change[0];\n        }\n\n        if (rows.max === null || change[0] > rows.max) {\n          rows.max = change[0];\n        }\n\n        if (columns.min === null || change[1] < columns.min) {\n          columns.min = change[1];\n        }\n\n        if (columns.max === null || change[1] > columns.max) {\n          columns.max = change[1];\n        }\n      });\n\n      return {\n        from: {\n          row: rows.min,\n          column: columns.min\n        },\n        to: {\n          row: rows.max,\n          column: columns.max\n        }\n      };\n    }\n\n    /**\n     * Check if the drag area contains any merged cells.\n     *\n     * @param {Array} baseArea The base selection area.\n     * @param {Array} fullArea The base area extended by the drag area.\n     * @param {String} direction Drag direction.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'dragAreaOverlapsCollections',\n    value: function dragAreaOverlapsCollections(baseArea, fullArea, direction) {\n      var dragArea = this.getDragArea(baseArea, fullArea, direction);\n\n      var _dragArea3 = _slicedToArray(dragArea, 4),\n          dragAreaStartRow = _dragArea3[0],\n          dragAreaStartColumn = _dragArea3[1],\n          dragAreaEndRow = _dragArea3[2],\n          dragAreaEndColumn = _dragArea3[3];\n\n      var topLeft = new _src.CellCoords(dragAreaStartRow, dragAreaStartColumn);\n      var bottomRight = new _src.CellCoords(dragAreaEndRow, dragAreaEndColumn);\n      var dragRange = new _src.CellRange(topLeft, topLeft, bottomRight);\n\n      return !!this.mergedCellsCollection.getWithinRange(dragRange, true);\n    }\n  }]);\n\n  return AutofillCalculations;\n}();\n\nexports.default = AutofillCalculations;\n\n/***/ }),\n/* 469 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _src = __webpack_require__(4);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Class responsible for all of the Selection-related operations on merged cells.\n *\n * @class SelectionCalculations\n * @plugin MergeCells\n * @util\n */\nvar SelectionCalculations = function () {\n  function SelectionCalculations(plugin) {\n    _classCallCheck(this, SelectionCalculations);\n\n    /**\n     * Reference to the Merge Cells plugin.\n     *\n     * @type {MergeCells}\n     */\n    this.plugin = plugin;\n    /**\n     * Class name used for fully selected merged cells.\n     *\n     * @type {String}\n     */\n    this.fullySelectedMergedCellClassName = 'fullySelectedMergedCell';\n  }\n\n  /**\n   * \"Snap\" the delta value according to defined merged cells. (In other words, compensate the rowspan -\n   * e.g. going up with `delta.row = -1` over a merged cell with `rowspan = 3`, `delta.row` should change to `-3`.)\n   *\n   * @param {Object} delta The delta object containing `row` and `col` properties.\n   * @param {CellRange} selectionRange The selection range.\n   * @param {Object} mergedCell A merged cell object.\n   */\n\n\n  _createClass(SelectionCalculations, [{\n    key: 'snapDelta',\n    value: function snapDelta(delta, selectionRange, mergedCell) {\n      var cellCoords = selectionRange.to;\n      var newRow = cellCoords.row + delta.row;\n      var newColumn = cellCoords.col + delta.col;\n\n      if (delta.row) {\n        this.jumpOverMergedCell(delta, mergedCell, newRow);\n      } else if (delta.col) {\n        this.jumpOverMergedCell(delta, mergedCell, newColumn);\n      }\n    }\n\n    /**\n     * \"Jump\" over the merged cell (compensate for the indexes within the merged cell to get past it)\n     *\n     * @private\n     * @param {Object} delta The delta object.\n     * @param {MergedCellCoords} mergedCell The merge cell object.\n     * @param {Number} newIndex New row/column index, created with the delta.\n     */\n\n  }, {\n    key: 'jumpOverMergedCell',\n    value: function jumpOverMergedCell(delta, mergedCell, newIndex) {\n      var flatDelta = delta.row || delta.col;\n      var includesIndex = null;\n      var firstIndex = null;\n      var lastIndex = null;\n\n      if (delta.row) {\n        includesIndex = mergedCell.includesVertically(newIndex);\n        firstIndex = mergedCell.row;\n        lastIndex = mergedCell.getLastRow();\n      } else if (delta.col) {\n        includesIndex = mergedCell.includesHorizontally(newIndex);\n        firstIndex = mergedCell.col;\n        lastIndex = mergedCell.getLastColumn();\n      }\n\n      if (flatDelta === 0) {\n        return;\n      } else if (flatDelta > 0) {\n        if (includesIndex && newIndex !== firstIndex) {\n          flatDelta += lastIndex - newIndex + 1;\n        }\n      } else if (includesIndex && newIndex !== lastIndex) {\n        flatDelta -= newIndex - firstIndex + 1;\n      }\n\n      if (delta.row) {\n        delta.row = flatDelta;\n      } else if (delta.col) {\n        delta.col = flatDelta;\n      }\n    }\n\n    /**\n     * Get a selection range with `to` property incremented by the provided delta.\n     *\n     * @param {CellRange} oldSelectionRange The base selection range.\n     * @param {Object} delta The delta object with `row` and `col` properties.\n     * @returns {CellRange} A new `CellRange` object.\n     */\n\n  }, {\n    key: 'getUpdatedSelectionRange',\n    value: function getUpdatedSelectionRange(oldSelectionRange, delta) {\n      return new _src.CellRange(oldSelectionRange.highlight, oldSelectionRange.from, new _src.CellCoords(oldSelectionRange.to.row + delta.row, oldSelectionRange.to.col + delta.col));\n    }\n\n    /**\n     * Generate an additional class name for the entirely-selected merged cells.\n     *\n     * @param {Number} currentRow Row index of the currently processed cell.\n     * @param {Number} currentColumn Column index of the currently cell.\n     * @param {Array} cornersOfSelection Array of the current selection in a form of `[startRow, startColumn, endRow, endColumn]`.\n     * @param {Number|undefined} layerLevel Number indicating which layer of selection is currently processed.\n     * @returns {String|undefined} A `String`, which will act as an additional `className` to be added to the currently processed cell.\n     */\n\n  }, {\n    key: 'getSelectedMergedCellClassName',\n    value: function getSelectedMergedCellClassName(currentRow, currentColumn, cornersOfSelection, layerLevel) {\n      var _cornersOfSelection = _slicedToArray(cornersOfSelection, 4),\n          startRow = _cornersOfSelection[0],\n          startColumn = _cornersOfSelection[1],\n          endRow = _cornersOfSelection[2],\n          endColumn = _cornersOfSelection[3];\n\n      if (layerLevel === void 0) {\n        return;\n      }\n\n      if (currentRow >= startRow && currentRow <= endRow && currentColumn >= startColumn && currentColumn <= endColumn) {\n\n        var isMergedCellParent = this.plugin.mergedCellsCollection.isMergedParent(currentRow, currentColumn);\n\n        if (!isMergedCellParent) {\n          return;\n        }\n\n        var mergedCell = this.plugin.mergedCellsCollection.get(currentRow, currentColumn);\n\n        if (!mergedCell) {\n          return;\n        }\n\n        if (mergedCell.row + mergedCell.rowspan - 1 <= endRow && mergedCell.col + mergedCell.colspan - 1 <= endColumn) {\n          return this.fullySelectedMergedCellClassName + '-' + layerLevel;\n        } else if (this.plugin.selectionCalculations.isMergeCellFullySelected(mergedCell, this.plugin.hot.getSelectedRange())) {\n          return this.fullySelectedMergedCellClassName + '-multiple';\n        }\n      }\n    }\n\n    /**\n     * Check if the provided merged cell is fully selected (by one or many layers of selection)\n     *\n     * @param {MergedCellCoords} mergedCell The merged cell to be processed.\n     * @param {CellRange[]} selectionRangesArray Array of selection ranges.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isMergeCellFullySelected',\n    value: function isMergeCellFullySelected(mergedCell, selectionRangesArray) {\n      var mergedCellIndividualCoords = [];\n\n      if (!selectionRangesArray || !mergedCell) {\n        return false;\n      }\n\n      for (var r = 0; r < mergedCell.rowspan; r += 1) {\n        for (var c = 0; c < mergedCell.colspan; c += 1) {\n          mergedCellIndividualCoords.push(new _src.CellCoords(mergedCell.row + r, mergedCell.col + c));\n        }\n      }\n\n      for (var i = 0; i < mergedCellIndividualCoords.length; i += 1) {\n        var insideSelections = [];\n\n        for (var s = 0; s < selectionRangesArray.length; s += 1) {\n          insideSelections[s] = selectionRangesArray[s].includes(mergedCellIndividualCoords[i]);\n        }\n\n        if (!insideSelections.includes(true)) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n\n    /**\n     * Generate an array of the entirely-selected merged cells' class names.\n     *\n     * @returns {String[]} An `Array` of `String`s. Each of these strings will act like class names to be removed from all the cells in the table.\n     */\n\n  }, {\n    key: 'getSelectedMergedCellClassNameToRemove',\n    value: function getSelectedMergedCellClassNameToRemove() {\n      var classNames = [];\n\n      for (var i = 0; i <= 7; i += 1) {\n        classNames.push(this.fullySelectedMergedCellClassName + '-' + i);\n      }\n\n      classNames.push(this.fullySelectedMergedCellClassName + '-multiple');\n\n      return classNames;\n    }\n  }]);\n\n  return SelectionCalculations;\n}();\n\nexports.default = SelectionCalculations;\n\n/***/ }),\n/* 470 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = toggleMergeItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _cellCoords = __webpack_require__(95);\n\nvar _cellCoords2 = _interopRequireDefault(_cellCoords);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction toggleMergeItem(plugin) {\n  return {\n    key: 'mergeCells',\n    name: function name() {\n      var sel = this.getSelectedLast();\n\n      if (sel) {\n        var info = plugin.mergedCellsCollection.get(sel[0], sel[1]);\n\n        if (info.row === sel[0] && info.col === sel[1] && info.row + info.rowspan - 1 === sel[2] && info.col + info.colspan - 1 === sel[3]) {\n          return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_UNMERGE_CELLS);\n        }\n      }\n\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_MERGE_CELLS);\n    },\n    callback: function callback() {\n      plugin.toggleMergeOnSelection();\n    },\n    disabled: function disabled() {\n      var sel = this.getSelectedLast();\n\n      if (!sel) {\n        return true;\n      }\n\n      var isSingleCell = _cellCoords2.default.isSingleCell({\n        row: sel[0],\n        col: sel[1],\n        rowspan: sel[2] - sel[0] + 1,\n        colspan: sel[3] - sel[1] + 1\n      });\n\n      return isSingleCell || this.selection.isSelectedByCorner();\n    },\n\n    hidden: false\n  };\n}\n\n/***/ }),\n/* 471 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 472 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _element = __webpack_require__(0);\n\nvar _browser = __webpack_require__(27);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nvar _src = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @plugin MultipleSelectionHandles\n */\nvar MultipleSelectionHandles = function (_BasePlugin) {\n  _inherits(MultipleSelectionHandles, _BasePlugin);\n\n  /**\n   * @param {Object} hotInstance\n   */\n  function MultipleSelectionHandles(hotInstance) {\n    _classCallCheck(this, MultipleSelectionHandles);\n\n    /**\n     * @type {Array}\n     */\n    var _this2 = _possibleConstructorReturn(this, (MultipleSelectionHandles.__proto__ || Object.getPrototypeOf(MultipleSelectionHandles)).call(this, hotInstance));\n\n    _this2.dragged = [];\n    /**\n     * Instance of EventManager.\n     *\n     * @type {EventManager}\n     */\n    _this2.eventManager = null;\n    /**\n     * @type {null}\n     */\n    _this2.lastSetCell = null;\n    return _this2;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(MultipleSelectionHandles, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return (0, _browser.isMobileBrowser)();\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      if (this.enabled) {\n        return;\n      }\n      if (!this.eventManager) {\n        this.eventManager = new _eventManager2.default(this);\n      }\n      this.registerListeners();\n      _get(MultipleSelectionHandles.prototype.__proto__ || Object.getPrototypeOf(MultipleSelectionHandles.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Bind the touch events\n     * @private\n     */\n\n  }, {\n    key: 'registerListeners',\n    value: function registerListeners() {\n      var _this = this;\n\n      function removeFromDragged(query) {\n\n        if (_this.dragged.length === 1) {\n          // clear array\n          _this.dragged.splice(0, _this.dragged.length);\n\n          return true;\n        }\n\n        var entryPosition = _this.dragged.indexOf(query);\n\n        if (entryPosition == -1) {\n          return false;\n        } else if (entryPosition === 0) {\n          _this.dragged = _this.dragged.slice(0, 1);\n        } else if (entryPosition == 1) {\n          _this.dragged = _this.dragged.slice(-1);\n        }\n      }\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'touchstart', function (event) {\n        var selectedRange = void 0;\n\n        if ((0, _element.hasClass)(event.target, 'topLeftSelectionHandle-HitArea')) {\n          selectedRange = _this.hot.getSelectedRangeLast();\n\n          _this.dragged.push('topLeft');\n\n          _this.touchStartRange = {\n            width: selectedRange.getWidth(),\n            height: selectedRange.getHeight(),\n            direction: selectedRange.getDirection()\n          };\n\n          event.preventDefault();\n          return false;\n        } else if ((0, _element.hasClass)(event.target, 'bottomRightSelectionHandle-HitArea')) {\n          selectedRange = _this.hot.getSelectedRangeLast();\n\n          _this.dragged.push('bottomRight');\n\n          _this.touchStartRange = {\n            width: selectedRange.getWidth(),\n            height: selectedRange.getHeight(),\n            direction: selectedRange.getDirection()\n          };\n\n          event.preventDefault();\n          return false;\n        }\n      });\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'touchend', function (event) {\n        if ((0, _element.hasClass)(event.target, 'topLeftSelectionHandle-HitArea')) {\n          removeFromDragged.call(_this, 'topLeft');\n\n          _this.touchStartRange = void 0;\n\n          event.preventDefault();\n          return false;\n        } else if ((0, _element.hasClass)(event.target, 'bottomRightSelectionHandle-HitArea')) {\n          removeFromDragged.call(_this, 'bottomRight');\n\n          _this.touchStartRange = void 0;\n\n          event.preventDefault();\n          return false;\n        }\n      });\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'touchmove', function (event) {\n        var scrollTop = (0, _element.getWindowScrollTop)(),\n            scrollLeft = (0, _element.getWindowScrollLeft)(),\n            endTarget = void 0,\n            targetCoords = void 0,\n            selectedRange = void 0,\n            rangeWidth = void 0,\n            rangeHeight = void 0,\n            rangeDirection = void 0,\n            newRangeCoords = void 0;\n\n        if (_this.dragged.length === 0) {\n          return;\n        }\n\n        endTarget = document.elementFromPoint(event.touches[0].screenX - scrollLeft, event.touches[0].screenY - scrollTop);\n\n        if (!endTarget || endTarget === _this.lastSetCell) {\n          return;\n        }\n\n        if (endTarget.nodeName == 'TD' || endTarget.nodeName == 'TH') {\n          targetCoords = _this.hot.getCoords(endTarget);\n\n          if (targetCoords.col == -1) {\n            targetCoords.col = 0;\n          }\n\n          selectedRange = _this.hot.getSelectedRangeLast();\n          rangeWidth = selectedRange.getWidth();\n          rangeHeight = selectedRange.getHeight();\n          rangeDirection = selectedRange.getDirection();\n\n          if (rangeWidth == 1 && rangeHeight == 1) {\n            _this.hot.selection.setRangeEnd(targetCoords);\n          }\n\n          newRangeCoords = _this.getCurrentRangeCoords(selectedRange, targetCoords, _this.touchStartRange.direction, rangeDirection, _this.dragged[0]);\n\n          if (newRangeCoords.start !== null) {\n            _this.hot.selection.setRangeStart(newRangeCoords.start);\n          }\n\n          _this.hot.selection.setRangeEnd(newRangeCoords.end);\n\n          _this.lastSetCell = endTarget;\n        }\n\n        event.preventDefault();\n      });\n    }\n  }, {\n    key: 'getCurrentRangeCoords',\n    value: function getCurrentRangeCoords(selectedRange, currentTouch, touchStartDirection, currentDirection, draggedHandle) {\n      var topLeftCorner = selectedRange.getTopLeftCorner(),\n          bottomRightCorner = selectedRange.getBottomRightCorner(),\n          bottomLeftCorner = selectedRange.getBottomLeftCorner(),\n          topRightCorner = selectedRange.getTopRightCorner();\n\n      var newCoords = {\n        start: null,\n        end: null\n      };\n\n      switch (touchStartDirection) {\n        case 'NE-SW':\n          switch (currentDirection) {\n            case 'NE-SW':\n            case 'NW-SE':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: new _src.CellCoords(currentTouch.row, selectedRange.highlight.col),\n                  end: new _src.CellCoords(bottomLeftCorner.row, currentTouch.col)\n                };\n              } else {\n                newCoords = {\n                  start: new _src.CellCoords(selectedRange.highlight.row, currentTouch.col),\n                  end: new _src.CellCoords(currentTouch.row, topLeftCorner.col)\n                };\n              }\n              break;\n            case 'SE-NW':\n              if (draggedHandle == 'bottomRight') {\n                newCoords = {\n                  start: new _src.CellCoords(bottomRightCorner.row, currentTouch.col),\n                  end: new _src.CellCoords(currentTouch.row, topLeftCorner.col)\n                };\n              }\n              break;\n            default:\n              break;\n          }\n          break;\n        case 'NW-SE':\n          switch (currentDirection) {\n            case 'NE-SW':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: currentTouch,\n                  end: bottomLeftCorner\n                };\n              } else {\n                newCoords.end = currentTouch;\n              }\n              break;\n            case 'NW-SE':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: currentTouch,\n                  end: bottomRightCorner\n                };\n              } else {\n                newCoords.end = currentTouch;\n              }\n              break;\n            case 'SE-NW':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: currentTouch,\n                  end: topLeftCorner\n                };\n              } else {\n                newCoords.end = currentTouch;\n              }\n              break;\n            case 'SW-NE':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: currentTouch,\n                  end: topRightCorner\n                };\n              } else {\n                newCoords.end = currentTouch;\n              }\n              break;\n            default:\n              break;\n          }\n          break;\n        case 'SW-NE':\n          switch (currentDirection) {\n            case 'NW-SE':\n              if (draggedHandle == 'bottomRight') {\n                newCoords = {\n                  start: new _src.CellCoords(currentTouch.row, topLeftCorner.col),\n                  end: new _src.CellCoords(bottomLeftCorner.row, currentTouch.col)\n                };\n              } else {\n                newCoords = {\n                  start: new _src.CellCoords(topLeftCorner.row, currentTouch.col),\n                  end: new _src.CellCoords(currentTouch.row, bottomRightCorner.col)\n                };\n              }\n              break;\n            // case 'NE-SW':\n            //\n            //  break;\n            case 'SW-NE':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: new _src.CellCoords(selectedRange.highlight.row, currentTouch.col),\n                  end: new _src.CellCoords(currentTouch.row, bottomRightCorner.col)\n                };\n              } else {\n                newCoords = {\n                  start: new _src.CellCoords(currentTouch.row, topLeftCorner.col),\n                  end: new _src.CellCoords(topLeftCorner.row, currentTouch.col)\n                };\n              }\n              break;\n            case 'SE-NW':\n              if (draggedHandle == 'bottomRight') {\n                newCoords = {\n                  start: new _src.CellCoords(currentTouch.row, topRightCorner.col),\n                  end: new _src.CellCoords(topLeftCorner.row, currentTouch.col)\n                };\n              } else if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: bottomLeftCorner,\n                  end: currentTouch\n                };\n              }\n              break;\n            default:\n              break;\n          }\n          break;\n        case 'SE-NW':\n          switch (currentDirection) {\n            case 'NW-SE':\n            case 'NE-SW':\n            case 'SW-NE':\n              if (draggedHandle == 'topLeft') {\n                newCoords.end = currentTouch;\n              }\n              break;\n            case 'SE-NW':\n              if (draggedHandle == 'topLeft') {\n                newCoords.end = currentTouch;\n              } else {\n                newCoords = {\n                  start: currentTouch,\n                  end: topLeftCorner\n                };\n              }\n              break;\n            default:\n              break;\n          }\n          break;\n        default:\n          break;\n      }\n\n      return newCoords;\n    }\n\n    /**\n     * Check if user is currently dragging the handle.\n     *\n     * @returns {boolean} Dragging state\n     */\n\n  }, {\n    key: 'isDragged',\n    value: function isDragged() {\n      return this.dragged.length > 0;\n    }\n  }]);\n\n  return MultipleSelectionHandles;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('multipleSelectionHandles', MultipleSelectionHandles);\n\nexports.default = MultipleSelectionHandles;\n\n/***/ }),\n/* 473 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _jsonPatchDuplex = __webpack_require__(325);\n\nvar _jsonPatchDuplex2 = _interopRequireDefault(_jsonPatchDuplex);\n\nvar _dataObserver = __webpack_require__(474);\n\nvar _dataObserver2 = _interopRequireDefault(_dataObserver);\n\nvar _array = __webpack_require__(1);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// Handsontable.hooks.register('afterChangesObserved');\n\n/**\n * @plugin ObserveChanges\n *\n * @description\n * This plugin allows to observe data source changes.\n *\n * By default, the plugin is declared as `undefined`, which makes it disabled.\n * Enabling this plugin switches the table into one-way data binding where changes are applied into the data source (outside from the table)\n * will be automatically reflected in the table.\n *\n * ```js\n * ...\n * // as a boolean\n * observeChanges: true,\n * ...\n * ```\n *\n * To configure this plugin see {@link Options#observeChanges}.\n */\nvar ObserveChanges = function (_BasePlugin) {\n  _inherits(ObserveChanges, _BasePlugin);\n\n  function ObserveChanges(hotInstance) {\n    _classCallCheck(this, ObserveChanges);\n\n    /**\n     * Instance of {@link DataObserver}.\n     *\n     * @type {DataObserver}\n     */\n    var _this = _possibleConstructorReturn(this, (ObserveChanges.__proto__ || Object.getPrototypeOf(ObserveChanges)).call(this, hotInstance));\n\n    _this.observer = null;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ObserveChanges, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().observeChanges;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n      if (!this.observer) {\n        this.observer = new _dataObserver2.default(this.hot.getSourceData());\n        this._exposePublicApi();\n      }\n\n      this.observer.addLocalHook('change', function (patches) {\n        return _this2.onDataChange(patches);\n      });\n      this.addHook('afterCreateRow', function () {\n        return _this2.onAfterTableAlter();\n      });\n      this.addHook('afterRemoveRow', function () {\n        return _this2.onAfterTableAlter();\n      });\n      this.addHook('afterCreateCol', function () {\n        return _this2.onAfterTableAlter();\n      });\n      this.addHook('afterRemoveCol', function () {\n        return _this2.onAfterTableAlter();\n      });\n      this.addHook('afterChange', function (changes, source) {\n        return _this2.onAfterTableAlter(source);\n      });\n      this.addHook('afterLoadData', function (firstRun) {\n        return _this2.onAfterLoadData(firstRun);\n      });\n\n      _get(ObserveChanges.prototype.__proto__ || Object.getPrototypeOf(ObserveChanges.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      if (this.observer) {\n        this.observer.destroy();\n        this.observer = null;\n        this._deletePublicApi();\n      }\n\n      _get(ObserveChanges.prototype.__proto__ || Object.getPrototypeOf(ObserveChanges.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Data change observer.\n     *\n     * @private\n     * @param {Array} patches An array of objects which every item defines coordinates where data was changed.\n     */\n\n  }, {\n    key: 'onDataChange',\n    value: function onDataChange(patches) {\n      var _this3 = this;\n\n      if (!this.observer.isPaused()) {\n        var sourceName = this.pluginName + '.change';\n        var actions = {\n          add: function add(patch) {\n            if (isNaN(patch.col)) {\n              _this3.hot.runHooks('afterCreateRow', patch.row, 1, sourceName);\n            } else {\n              _this3.hot.runHooks('afterCreateCol', patch.col, 1, sourceName);\n            }\n          },\n          remove: function remove(patch) {\n            if (isNaN(patch.col)) {\n              _this3.hot.runHooks('afterRemoveRow', patch.row, 1, sourceName);\n            } else {\n              _this3.hot.runHooks('afterRemoveCol', patch.col, 1, sourceName);\n            }\n          },\n          replace: function replace(patch) {\n            _this3.hot.runHooks('afterChange', [[patch.row, patch.col, null, patch.value]], sourceName);\n          }\n        };\n\n        (0, _array.arrayEach)(patches, function (patch) {\n          if (actions[patch.op]) {\n            actions[patch.op](patch);\n          }\n        });\n        this.hot.render();\n      }\n\n      this.hot.runHooks('afterChangesObserved');\n    }\n\n    /**\n     * On after table alter listener. Prevents infinity loop between internal and external data changing.\n     *\n     * @private\n     * @param source\n     */\n\n  }, {\n    key: 'onAfterTableAlter',\n    value: function onAfterTableAlter(source) {\n      var _this4 = this;\n\n      if (source !== 'loadData') {\n        this.observer.pause();\n        this.hot.addHookOnce('afterChangesObserved', function () {\n          return _this4.observer.resume();\n        });\n      }\n    }\n\n    /**\n     * On after load data listener.\n     *\n     * @private\n     * @param {Boolean} firstRun `true` if event was fired first time.\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData(firstRun) {\n      if (!firstRun) {\n        this.observer.setObservedData(this.hot.getSourceData());\n      }\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.observer) {\n        this.observer.destroy();\n        this._deletePublicApi();\n      }\n      _get(ObserveChanges.prototype.__proto__ || Object.getPrototypeOf(ObserveChanges.prototype), 'destroy', this).call(this);\n    }\n\n    /**\n     * Expose plugins methods to the core.\n     *\n     * @private\n     */\n\n  }, {\n    key: '_exposePublicApi',\n    value: function _exposePublicApi() {\n      var _this5 = this;\n\n      var hot = this.hot;\n\n      hot.pauseObservingChanges = function () {\n        return _this5.observer.pause();\n      };\n      hot.resumeObservingChanges = function () {\n        return _this5.observer.resume();\n      };\n      hot.isPausedObservingChanges = function () {\n        return _this5.observer.isPaused();\n      };\n    }\n\n    /**\n     * Delete all previously exposed methods.\n     *\n     * @private\n     */\n\n  }, {\n    key: '_deletePublicApi',\n    value: function _deletePublicApi() {\n      var hot = this.hot;\n\n      delete hot.pauseObservingChanges;\n      delete hot.resumeObservingChanges;\n      delete hot.isPausedObservingChanges;\n    }\n  }]);\n\n  return ObserveChanges;\n}(_base2.default);\n\nexports.default = ObserveChanges;\n\n\n(0, _plugins.registerPlugin)('observeChanges', ObserveChanges);\n\n/***/ }),\n/* 474 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _jsonPatchDuplex = __webpack_require__(325);\n\nvar _jsonPatchDuplex2 = _interopRequireDefault(_jsonPatchDuplex);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nvar _object = __webpack_require__(2);\n\nvar _utils = __webpack_require__(475);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class DataObserver\n * @plugin ObserveChanges\n */\nvar DataObserver = function () {\n  function DataObserver(observedData) {\n    _classCallCheck(this, DataObserver);\n\n    /**\n     * Observed source data.\n     *\n     * @type {Array}\n     */\n    this.observedData = null;\n    /**\n     * JsonPatch observer.\n     *\n     * @type {Object}\n     */\n    this.observer = null;\n    /**\n     * Flag which determines if observer is paused or not. Paused observer doesn't emit `change` hooks.\n     *\n     * @type {Boolean}\n     * @default false\n     */\n    this.paused = false;\n\n    this.setObservedData(observedData);\n  }\n\n  /**\n   * Set data to observe.\n   *\n   * @param {*} observedData\n   */\n\n\n  _createClass(DataObserver, [{\n    key: 'setObservedData',\n    value: function setObservedData(observedData) {\n      var _this = this;\n\n      if (this.observer) {\n        _jsonPatchDuplex2.default.unobserve(this.observedData, this.observer);\n      }\n      this.observedData = observedData;\n      this.observer = _jsonPatchDuplex2.default.observe(this.observedData, function (patches) {\n        return _this.onChange(patches);\n      });\n    }\n\n    /**\n     * Check if observer was paused.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isPaused',\n    value: function isPaused() {\n      return this.paused;\n    }\n\n    /**\n     * Pause observer (stop emitting all detected changes).\n     */\n\n  }, {\n    key: 'pause',\n    value: function pause() {\n      this.paused = true;\n    }\n\n    /**\n     * Resume observer (emit all detected changes).\n     */\n\n  }, {\n    key: 'resume',\n    value: function resume() {\n      this.paused = false;\n    }\n\n    /**\n     * JsonPatch on change listener.\n     *\n     * @private\n     * @param {Array} patches An array of object passed from jsonpatch.\n     */\n\n  }, {\n    key: 'onChange',\n    value: function onChange(patches) {\n      this.runLocalHooks('change', (0, _utils.cleanPatches)(patches));\n    }\n\n    /**\n     * Destroy observer instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _jsonPatchDuplex2.default.unobserve(this.observedData, this.observer);\n      this.observedData = null;\n      this.observer = null;\n    }\n  }]);\n\n  return DataObserver;\n}();\n\n(0, _object.mixin)(DataObserver, _localHooks2.default);\n\nexports.default = DataObserver;\n\n/***/ }),\n/* 475 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.cleanPatches = cleanPatches;\nexports.parsePath = parsePath;\n\nvar _array = __webpack_require__(1);\n\n/**\n * Clean and extend patches from jsonpatch observer.\n *\n * @param {Array} patches\n * @returns {Array}\n */\nfunction cleanPatches(patches) {\n  var newOrRemovedColumns = [];\n\n  /**\n   * If observeChanges uses native Object.observe method, then it produces patches for length property. Filter them.\n   * If path can't be parsed. Filter it.\n   */\n  patches = (0, _array.arrayFilter)(patches, function (patch) {\n    if (/[/]length/ig.test(patch.path)) {\n      return false;\n    }\n    if (!parsePath(patch.path)) {\n      return false;\n    }\n\n    return true;\n  });\n  /**\n   * Extend patches with changed cells coords\n   */\n  patches = (0, _array.arrayMap)(patches, function (patch) {\n    var coords = parsePath(patch.path);\n\n    patch.row = coords.row;\n    patch.col = coords.col;\n\n    return patch;\n  });\n  /**\n   * Removing or adding column will produce one patch for each table row.\n   * Leaves only one patch for each column add/remove operation.\n   */\n  patches = (0, _array.arrayFilter)(patches, function (patch) {\n    if (['add', 'remove'].indexOf(patch.op) !== -1 && !isNaN(patch.col)) {\n      if (newOrRemovedColumns.indexOf(patch.col) !== -1) {\n        return false;\n      }\n      newOrRemovedColumns.push(patch.col);\n    }\n\n    return true;\n  });\n  newOrRemovedColumns.length = 0;\n\n  return patches;\n}\n\n/**\n * Extract coordinates from path where data was changed.\n *\n * @param {String} path Path describing where data was changed.\n * @returns {Object|null} Returns an object with `row` and `col` properties or `null` if path doesn't have necessary information.\n */\nfunction parsePath(path) {\n  var match = path.match(/^\\/(\\d+)\\/?(.*)?$/);\n\n  if (!match) {\n    return null;\n  }\n\n  var _match = _slicedToArray(match, 3),\n      row = _match[1],\n      column = _match[2];\n\n  return {\n    row: parseInt(row, 10),\n    col: /^\\d*$/.test(column) ? parseInt(column, 10) : column\n  };\n}\n\n/***/ }),\n/* 476 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _mixed = __webpack_require__(16);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar DEFAULT_SEARCH_RESULT_CLASS = 'htSearchResult';\n\nvar DEFAULT_CALLBACK = function DEFAULT_CALLBACK(instance, row, col, data, testResult) {\n  instance.getCellMeta(row, col).isSearchResult = testResult;\n};\n\nvar DEFAULT_QUERY_METHOD = function DEFAULT_QUERY_METHOD(query, value) {\n  if ((0, _mixed.isUndefined)(query) || query === null || !query.toLowerCase || query.length === 0) {\n    return false;\n  }\n  if ((0, _mixed.isUndefined)(value) || value === null) {\n    return false;\n  }\n\n  return value.toString().toLowerCase().indexOf(query.toLowerCase()) !== -1;\n};\n\n/**\n * @plugin Search\n *\n * @example\n *\n * ```js\n * ...\n *  // as boolean\n *  search: true\n *\n *  // as a object with one or more options\n *  search: {\n *    callback: myNewCallbackFunction,\n *    queryMethod: myNewQueryMethod,\n *    searchResultClass: 'customClass'\n *  }\n *\n * // Access to search plugin instance:\n * var searchPlugin = hot.getPlugin('search');\n *\n * // Set callback programmatically:\n * searchPlugin.setCallback(myNewCallbackFunction);\n * // Set query method programmatically:\n * searchPlugin.setQueryMethod(myNewQueryMethod);\n * // Set search result cells class programmatically:\n * searchPlugin.setSearchResultClass(customClass);\n * ...\n * ```\n */\n\nvar Search = function (_BasePlugin) {\n  _inherits(Search, _BasePlugin);\n\n  function Search(hotInstance) {\n    _classCallCheck(this, Search);\n\n    /**\n     * Function called during querying for each cell from the {@link DataMap}.\n     *\n     * @type {Function}\n     */\n    var _this = _possibleConstructorReturn(this, (Search.__proto__ || Object.getPrototypeOf(Search)).call(this, hotInstance));\n\n    _this.callback = DEFAULT_CALLBACK;\n    /**\n     * Query function is responsible for determining whether a query matches the value stored in a cell.\n     *\n     * @type {Function}\n     */\n    _this.queryMethod = DEFAULT_QUERY_METHOD;\n    /**\n     * Class name added to each cell that belongs to the searched query.\n     *\n     * @type {String}\n     */\n    _this.searchResultClass = DEFAULT_SEARCH_RESULT_CLASS;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(Search, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().search;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      var searchSettings = this.hot.getSettings().search;\n      this.updatePluginSettings(searchSettings);\n\n      this.addHook('beforeRenderer', function () {\n        return _this2.onBeforeRenderer.apply(_this2, arguments);\n      });\n\n      _get(Search.prototype.__proto__ || Object.getPrototypeOf(Search.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      var _this3 = this;\n\n      var beforeRendererCallback = function beforeRendererCallback() {\n        return _this3.onBeforeRenderer.apply(_this3, arguments);\n      };\n\n      this.hot.addHook('beforeRenderer', beforeRendererCallback);\n      this.hot.addHookOnce('afterRender', function () {\n        _this3.hot.removeHook('beforeRenderer', beforeRendererCallback);\n      });\n\n      _get(Search.prototype.__proto__ || Object.getPrototypeOf(Search.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(Search.prototype.__proto__ || Object.getPrototypeOf(Search.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Query method - used inside search input listener.\n     *\n     * @param {String} queryStr Searched value.\n     * @param {Function} [callback] Callback function performed on cells with values which matches to the searched query.\n     * @param {Function} [queryMethod] Query function responsible for determining whether a query matches the value stored in a cell.\n     *\n     * @returns {Array} Return array of objects with `row`, `col`, `data` properties or empty array.\n     */\n\n  }, {\n    key: 'query',\n    value: function query(queryStr) {\n      var _this4 = this;\n\n      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getCallback();\n      var queryMethod = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.getQueryMethod();\n\n      var rowCount = this.hot.countRows();\n      var colCount = this.hot.countCols();\n      var queryResult = [];\n      var instance = this.hot;\n\n      (0, _number.rangeEach)(0, rowCount - 1, function (rowIndex) {\n        (0, _number.rangeEach)(0, colCount - 1, function (colIndex) {\n          var cellData = _this4.hot.getDataAtCell(rowIndex, colIndex);\n          var cellProperties = _this4.hot.getCellMeta(rowIndex, colIndex);\n          var cellCallback = cellProperties.search.callback || callback;\n          var cellQueryMethod = cellProperties.search.queryMethod || queryMethod;\n          var testResult = cellQueryMethod(queryStr, cellData);\n\n          if (testResult) {\n            var singleResult = {\n              row: rowIndex,\n              col: colIndex,\n              data: cellData\n            };\n\n            queryResult.push(singleResult);\n          }\n\n          if (cellCallback) {\n            cellCallback(instance, rowIndex, colIndex, cellData, testResult);\n          }\n        });\n      });\n\n      return queryResult;\n    }\n  }, {\n    key: 'getCallback',\n\n\n    /**\n     * Get callback function.\n     *\n     * @returns {Function} Return the callback function.\n     */\n    value: function getCallback() {\n      return this.callback;\n    }\n\n    /**\n     * Set callback function.\n     *\n     * @param {Function} newCallback\n     */\n\n  }, {\n    key: 'setCallback',\n    value: function setCallback(newCallback) {\n      this.callback = newCallback;\n    }\n\n    /**\n     * Get queryMethod function.\n     *\n     * @returns {Function} Return the query method.\n     */\n\n  }, {\n    key: 'getQueryMethod',\n    value: function getQueryMethod() {\n      return this.queryMethod;\n    }\n\n    /**\n     * Set queryMethod function.\n     *\n     * @param {Function} newQueryMethod\n     */\n\n  }, {\n    key: 'setQueryMethod',\n    value: function setQueryMethod(newQueryMethod) {\n      this.queryMethod = newQueryMethod;\n    }\n\n    /**\n     * Get search result cells class.\n     *\n     * @returns {Function} Return the cell class.\n     */\n\n  }, {\n    key: 'getSearchResultClass',\n    value: function getSearchResultClass() {\n      return this.searchResultClass;\n    }\n\n    /**\n     * Set search result cells class.\n     *\n     * @param {String} newElementClass\n     */\n\n  }, {\n    key: 'setSearchResultClass',\n    value: function setSearchResultClass(newElementClass) {\n      this.searchResultClass = newElementClass;\n    }\n\n    /**\n     * Updates the settings of the plugin.\n     *\n     * @param {Object} searchSettings The plugin settings, taken from Handsontable configuration.\n     * @private\n     */\n\n  }, {\n    key: 'updatePluginSettings',\n    value: function updatePluginSettings(searchSettings) {\n      if ((0, _object.isObject)(searchSettings)) {\n        if (searchSettings.searchResultClass) {\n          this.setSearchResultClass(searchSettings.searchResultClass);\n        }\n\n        if (searchSettings.queryMethod) {\n          this.setQueryMethod(searchSettings.queryMethod);\n        }\n\n        if (searchSettings.callback) {\n          this.setCallback(searchSettings.callback);\n        }\n      }\n    }\n\n    /** *\n     * The `beforeRenderer` hook callback.\n     *\n     * @private\n     * @param {HTMLTableCellElement} TD The rendered `TD` element.\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {String | Number} prop Column property name or a column index, if datasource is an array of arrays.\n     * @param {String} value Value of the rendered cell.\n     * @param {Object} cellProperties Object containing the cell's properties.\n     */\n\n  }, {\n    key: 'onBeforeRenderer',\n    value: function onBeforeRenderer(TD, row, col, prop, value, cellProperties) {\n      // TODO: #4972\n      var className = cellProperties.className || [];\n      var classArray = [];\n\n      if (typeof className === 'string') {\n        classArray = className.split(' ');\n      } else {\n        var _classArray;\n\n        (_classArray = classArray).push.apply(_classArray, _toConsumableArray(className));\n      }\n\n      if (this.isEnabled() && cellProperties.isSearchResult) {\n        if (!classArray.includes(this.searchResultClass)) {\n          classArray.push('' + this.searchResultClass);\n        }\n      } else if (classArray.includes(this.searchResultClass)) {\n        classArray.splice(classArray.indexOf(this.searchResultClass), 1);\n      }\n\n      cellProperties.className = classArray.join(' ');\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(Search.prototype.__proto__ || Object.getPrototypeOf(Search.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return Search;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('search', Search);\n\nexports.default = Search;\n\n/***/ }),\n/* 477 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _feature = __webpack_require__(40);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @plugin TouchScroll\n * @class TouchScroll\n */\nvar TouchScroll = function (_BasePlugin) {\n  _inherits(TouchScroll, _BasePlugin);\n\n  function TouchScroll(hotInstance) {\n    _classCallCheck(this, TouchScroll);\n\n    /**\n     * Collection of scrollbars to update.\n     *\n     * @type {Array}\n     */\n    var _this = _possibleConstructorReturn(this, (TouchScroll.__proto__ || Object.getPrototypeOf(TouchScroll)).call(this, hotInstance));\n\n    _this.scrollbars = [];\n    /**\n     * Collection of overlays to update.\n     *\n     * @type {Array}\n     */\n    _this.clones = [];\n    /**\n     * Flag which determines if collection of overlays should be refilled on every table render.\n     *\n     * @type {Boolean}\n     * @default false\n     */\n    _this.lockedCollection = false;\n    /**\n     * Flag which determines if walkontable should freeze overlays while scrolling.\n     *\n     * @type {Boolean}\n     * @default false\n     */\n    _this.freezeOverlays = false;\n    return _this;\n  }\n\n  /**\n   * Check if plugin is enabled.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(TouchScroll, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return (0, _feature.isTouchSupported)();\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('afterRender', function () {\n        return _this2.onAfterRender();\n      });\n      this.registerEvents();\n\n      _get(TouchScroll.prototype.__proto__ || Object.getPrototypeOf(TouchScroll.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.lockedCollection = false;\n\n      _get(TouchScroll.prototype.__proto__ || Object.getPrototypeOf(TouchScroll.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(TouchScroll.prototype.__proto__ || Object.getPrototypeOf(TouchScroll.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Register all necessary events.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this3 = this;\n\n      this.addHook('beforeTouchScroll', function () {\n        return _this3.onBeforeTouchScroll();\n      });\n      this.addHook('afterMomentumScroll', function () {\n        return _this3.onAfterMomentumScroll();\n      });\n    }\n\n    /**\n     * After render listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterRender',\n    value: function onAfterRender() {\n      if (this.lockedCollection) {\n        return;\n      }\n\n      var _hot$view$wt$wtOverla = this.hot.view.wt.wtOverlays,\n          topOverlay = _hot$view$wt$wtOverla.topOverlay,\n          bottomOverlay = _hot$view$wt$wtOverla.bottomOverlay,\n          leftOverlay = _hot$view$wt$wtOverla.leftOverlay,\n          topLeftCornerOverlay = _hot$view$wt$wtOverla.topLeftCornerOverlay,\n          bottomLeftCornerOverlay = _hot$view$wt$wtOverla.bottomLeftCornerOverlay;\n\n\n      this.lockedCollection = true;\n      this.scrollbars.length = 0;\n      this.scrollbars.push(topOverlay);\n\n      if (bottomOverlay.clone) {\n        this.scrollbars.push(bottomOverlay);\n      }\n      this.scrollbars.push(leftOverlay);\n\n      if (topLeftCornerOverlay) {\n        this.scrollbars.push(topLeftCornerOverlay);\n      }\n      if (bottomLeftCornerOverlay && bottomLeftCornerOverlay.clone) {\n        this.scrollbars.push(bottomLeftCornerOverlay);\n      }\n\n      this.clones.length = 0;\n\n      if (topOverlay.needFullRender) {\n        this.clones.push(topOverlay.clone.wtTable.holder.parentNode);\n      }\n      if (bottomOverlay.needFullRender) {\n        this.clones.push(bottomOverlay.clone.wtTable.holder.parentNode);\n      }\n      if (leftOverlay.needFullRender) {\n        this.clones.push(leftOverlay.clone.wtTable.holder.parentNode);\n      }\n      if (topLeftCornerOverlay) {\n        this.clones.push(topLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      }\n      if (bottomLeftCornerOverlay && bottomLeftCornerOverlay.clone) {\n        this.clones.push(bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      }\n    }\n\n    /**\n     * Touch scroll listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onBeforeTouchScroll',\n    value: function onBeforeTouchScroll() {\n      this.freezeOverlays = true;\n\n      (0, _array.arrayEach)(this.clones, function (clone) {\n        (0, _element.addClass)(clone, 'hide-tween');\n      });\n    }\n\n    /**\n     * After momentum scroll listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterMomentumScroll',\n    value: function onAfterMomentumScroll() {\n      var _this4 = this;\n\n      this.freezeOverlays = false;\n\n      (0, _array.arrayEach)(this.clones, function (clone) {\n        (0, _element.removeClass)(clone, 'hide-tween');\n        (0, _element.addClass)(clone, 'show-tween');\n      });\n\n      setTimeout(function () {\n        (0, _array.arrayEach)(_this4.clones, function (clone) {\n          (0, _element.removeClass)(clone, 'show-tween');\n        });\n      }, 400);\n\n      (0, _array.arrayEach)(this.scrollbars, function (scrollbar) {\n        scrollbar.refresh();\n        scrollbar.resetFixedPosition();\n      });\n\n      this.hot.view.wt.wtOverlays.syncScrollWithMaster();\n    }\n  }]);\n\n  return TouchScroll;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('touchScroll', TouchScroll);\n\nexports.default = TouchScroll;\n\n/***/ }),\n/* 478 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _object = __webpack_require__(2);\n\nvar _event = __webpack_require__(12);\n\nvar _src = __webpack_require__(4);\n\nvar _utils = __webpack_require__(19);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /**\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * Handsontable UndoRedo class\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                */\n\n\n/**\n * @description\n * Handsontable UndoRedo plugin. It allows to undo and redo certain actions done in the table.\n * Please note, that not all actions are currently undo-able.\n *\n * @example\n * ```js\n * ...\n * undo: true\n * ...\n * ```\n * @class UndoRedo\n * @plugin UndoRedo\n */\nfunction UndoRedo(instance) {\n  var plugin = this;\n  this.instance = instance;\n  this.doneActions = [];\n  this.undoneActions = [];\n  this.ignoreNewActions = false;\n\n  instance.addHook('afterChange', function (changes, source) {\n    if (changes && source !== 'UndoRedo.undo' && source !== 'UndoRedo.redo' && source !== 'MergeCells') {\n      plugin.done(new UndoRedo.ChangeAction(changes));\n    }\n  });\n\n  instance.addHook('afterCreateRow', function (index, amount, source) {\n    if (source === 'UndoRedo.undo' || source === 'UndoRedo.undo' || source === 'auto') {\n      return;\n    }\n\n    var action = new UndoRedo.CreateRowAction(index, amount);\n    plugin.done(action);\n  });\n\n  instance.addHook('beforeRemoveRow', function (index, amount, logicRows, source) {\n    if (source === 'UndoRedo.undo' || source === 'UndoRedo.redo' || source === 'auto') {\n      return;\n    }\n\n    var originalData = plugin.instance.getSourceDataArray();\n\n    index = (originalData.length + index) % originalData.length;\n\n    var removedData = (0, _object.deepClone)(originalData.slice(index, index + amount));\n\n    plugin.done(new UndoRedo.RemoveRowAction(index, removedData));\n  });\n\n  instance.addHook('afterCreateCol', function (index, amount, source) {\n    if (source === 'UndoRedo.undo' || source === 'UndoRedo.redo' || source === 'auto') {\n      return;\n    }\n\n    plugin.done(new UndoRedo.CreateColumnAction(index, amount));\n  });\n\n  instance.addHook('beforeRemoveCol', function (index, amount, logicColumns, source) {\n    if (source === 'UndoRedo.undo' || source === 'UndoRedo.redo' || source === 'auto') {\n      return;\n    }\n\n    var originalData = plugin.instance.getSourceDataArray();\n\n    index = (plugin.instance.countCols() + index) % plugin.instance.countCols();\n\n    var removedData = [];\n    var headers = [];\n    var indexes = [];\n\n    (0, _number.rangeEach)(originalData.length - 1, function (i) {\n      var column = [];\n      var origRow = originalData[i];\n\n      (0, _number.rangeEach)(index, index + (amount - 1), function (j) {\n        column.push(origRow[instance.runHooks('modifyCol', j)]);\n      });\n      removedData.push(column);\n    });\n\n    (0, _number.rangeEach)(amount - 1, function (i) {\n      indexes.push(instance.runHooks('modifyCol', index + i));\n    });\n\n    if (Array.isArray(instance.getSettings().colHeaders)) {\n      (0, _number.rangeEach)(amount - 1, function (i) {\n        headers.push(instance.getSettings().colHeaders[instance.runHooks('modifyCol', index + i)] || null);\n      });\n    }\n\n    var manualColumnMovePlugin = plugin.instance.getPlugin('manualColumnMove');\n\n    var columnsMap = manualColumnMovePlugin.isEnabled() ? manualColumnMovePlugin.columnsMapper.__arrayMap : [];\n    var action = new UndoRedo.RemoveColumnAction(index, indexes, removedData, headers, columnsMap);\n\n    plugin.done(action);\n  });\n\n  instance.addHook('beforeCellAlignment', function (stateBefore, range, type, alignment) {\n    var action = new UndoRedo.CellAlignmentAction(stateBefore, range, type, alignment);\n    plugin.done(action);\n  });\n\n  instance.addHook('beforeFilter', function (conditionsStack) {\n    plugin.done(new UndoRedo.FiltersAction(conditionsStack));\n  });\n\n  instance.addHook('beforeRowMove', function (movedRows, target) {\n    if (movedRows === false) {\n      return;\n    }\n\n    plugin.done(new UndoRedo.RowMoveAction(movedRows, target));\n  });\n\n  instance.addHook('beforeMergeCells', function (cellRange, auto) {\n    if (auto) {\n      return;\n    }\n\n    plugin.done(new UndoRedo.MergeCellsAction(instance, cellRange));\n  });\n\n  instance.addHook('afterUnmergeCells', function (cellRange, auto) {\n    if (auto) {\n      return;\n    }\n\n    plugin.done(new UndoRedo.UnmergeCellsAction(instance, cellRange));\n  });\n}\n\nUndoRedo.prototype.done = function (action) {\n  if (!this.ignoreNewActions) {\n    this.doneActions.push(action);\n    this.undoneActions.length = 0;\n  }\n};\n\n/**\n * Undo last edit.\n *\n * @function undo\n * @memberof UndoRedo#\n */\nUndoRedo.prototype.undo = function () {\n  if (this.isUndoAvailable()) {\n    var action = this.doneActions.pop();\n    var actionClone = (0, _object.deepClone)(action);\n    var instance = this.instance;\n\n    var continueAction = instance.runHooks('beforeUndo', actionClone);\n\n    if (continueAction === false) {\n      return;\n    }\n\n    this.ignoreNewActions = true;\n    var that = this;\n    action.undo(this.instance, function () {\n      that.ignoreNewActions = false;\n      that.undoneActions.push(action);\n    });\n\n    instance.runHooks('afterUndo', actionClone);\n  }\n};\n\n/**\n * Redo edit (used to reverse an undo).\n *\n * @function redo\n * @memberof UndoRedo#\n */\nUndoRedo.prototype.redo = function () {\n  if (this.isRedoAvailable()) {\n    var action = this.undoneActions.pop();\n    var actionClone = (0, _object.deepClone)(action);\n    var instance = this.instance;\n\n    var continueAction = instance.runHooks('beforeRedo', actionClone);\n\n    if (continueAction === false) {\n      return;\n    }\n\n    this.ignoreNewActions = true;\n    var that = this;\n    action.redo(this.instance, function () {\n      that.ignoreNewActions = false;\n      that.doneActions.push(action);\n    });\n\n    instance.runHooks('afterRedo', actionClone);\n  }\n};\n\n/**\n * Check if undo action is available.\n *\n * @function isUndoAvailable\n * @memberof UndoRedo#\n * @return {Boolean} Return `true` if undo can be performed, `false` otherwise\n */\nUndoRedo.prototype.isUndoAvailable = function () {\n  return this.doneActions.length > 0;\n};\n\n/**\n * Check if redo action is available.\n *\n * @function isRedoAvailable\n * @memberof UndoRedo#\n * @return {Boolean} Return `true` if redo can be performed, `false` otherwise.\n */\nUndoRedo.prototype.isRedoAvailable = function () {\n  return this.undoneActions.length > 0;\n};\n\n/**\n * Clears undo history.\n *\n * @function clear\n * @memberof UndoRedo#\n */\nUndoRedo.prototype.clear = function () {\n  this.doneActions.length = 0;\n  this.undoneActions.length = 0;\n};\n\nUndoRedo.Action = function () {};\nUndoRedo.Action.prototype.undo = function () {};\nUndoRedo.Action.prototype.redo = function () {};\n\n/**\n * Change action.\n */\nUndoRedo.ChangeAction = function (changes) {\n  this.changes = changes;\n  this.actionType = 'change';\n};\n(0, _object.inherit)(UndoRedo.ChangeAction, UndoRedo.Action);\n\nUndoRedo.ChangeAction.prototype.undo = function (instance, undoneCallback) {\n  var data = (0, _object.deepClone)(this.changes),\n      emptyRowsAtTheEnd = instance.countEmptyRows(true),\n      emptyColsAtTheEnd = instance.countEmptyCols(true);\n\n  for (var i = 0, len = data.length; i < len; i++) {\n    data[i].splice(3, 1);\n  }\n\n  instance.addHookOnce('afterChange', undoneCallback);\n\n  instance.setDataAtRowProp(data, null, null, 'UndoRedo.undo');\n\n  for (var _i = 0, _len = data.length; _i < _len; _i++) {\n    if (instance.getSettings().minSpareRows && data[_i][0] + 1 + instance.getSettings().minSpareRows === instance.countRows() && emptyRowsAtTheEnd === instance.getSettings().minSpareRows) {\n\n      instance.alter('remove_row', parseInt(data[_i][0] + 1, 10), instance.getSettings().minSpareRows);\n      instance.undoRedo.doneActions.pop();\n    }\n\n    if (instance.getSettings().minSpareCols && data[_i][1] + 1 + instance.getSettings().minSpareCols === instance.countCols() && emptyColsAtTheEnd === instance.getSettings().minSpareCols) {\n\n      instance.alter('remove_col', parseInt(data[_i][1] + 1, 10), instance.getSettings().minSpareCols);\n      instance.undoRedo.doneActions.pop();\n    }\n  }\n};\nUndoRedo.ChangeAction.prototype.redo = function (instance, onFinishCallback) {\n  var data = (0, _object.deepClone)(this.changes);\n\n  for (var i = 0, len = data.length; i < len; i++) {\n    data[i].splice(2, 1);\n  }\n\n  instance.addHookOnce('afterChange', onFinishCallback);\n  instance.setDataAtRowProp(data, null, null, 'UndoRedo.redo');\n};\n\n/**\n * Create row action.\n */\nUndoRedo.CreateRowAction = function (index, amount) {\n  this.index = index;\n  this.amount = amount;\n  this.actionType = 'insert_row';\n};\n(0, _object.inherit)(UndoRedo.CreateRowAction, UndoRedo.Action);\n\nUndoRedo.CreateRowAction.prototype.undo = function (instance, undoneCallback) {\n  var rowCount = instance.countRows(),\n      minSpareRows = instance.getSettings().minSpareRows;\n\n  if (this.index >= rowCount && this.index - minSpareRows < rowCount) {\n    this.index -= minSpareRows; // work around the situation where the needed row was removed due to an 'undo' of a made change\n  }\n\n  instance.addHookOnce('afterRemoveRow', undoneCallback);\n  instance.alter('remove_row', this.index, this.amount, 'UndoRedo.undo');\n};\nUndoRedo.CreateRowAction.prototype.redo = function (instance, redoneCallback) {\n  instance.addHookOnce('afterCreateRow', redoneCallback);\n  instance.alter('insert_row', this.index, this.amount, 'UndoRedo.redo');\n};\n\n/**\n * Remove row action.\n */\nUndoRedo.RemoveRowAction = function (index, data) {\n  this.index = index;\n  this.data = data;\n  this.actionType = 'remove_row';\n};\n(0, _object.inherit)(UndoRedo.RemoveRowAction, UndoRedo.Action);\n\nUndoRedo.RemoveRowAction.prototype.undo = function (instance, undoneCallback) {\n  instance.alter('insert_row', this.index, this.data.length, 'UndoRedo.undo');\n  instance.addHookOnce('afterRender', undoneCallback);\n  instance.populateFromArray(this.index, 0, this.data, void 0, void 0, 'UndoRedo.undo');\n};\nUndoRedo.RemoveRowAction.prototype.redo = function (instance, redoneCallback) {\n  instance.addHookOnce('afterRemoveRow', redoneCallback);\n  instance.alter('remove_row', this.index, this.data.length, 'UndoRedo.redo');\n};\n\n/**\n * Create column action.\n */\nUndoRedo.CreateColumnAction = function (index, amount) {\n  this.index = index;\n  this.amount = amount;\n  this.actionType = 'insert_col';\n};\n(0, _object.inherit)(UndoRedo.CreateColumnAction, UndoRedo.Action);\n\nUndoRedo.CreateColumnAction.prototype.undo = function (instance, undoneCallback) {\n  instance.addHookOnce('afterRemoveCol', undoneCallback);\n  instance.alter('remove_col', this.index, this.amount, 'UndoRedo.undo');\n};\nUndoRedo.CreateColumnAction.prototype.redo = function (instance, redoneCallback) {\n  instance.addHookOnce('afterCreateCol', redoneCallback);\n  instance.alter('insert_col', this.index, this.amount, 'UndoRedo.redo');\n};\n\n/**\n * Remove column action.\n */\nUndoRedo.RemoveColumnAction = function (index, indexes, data, headers, columnPositions) {\n  this.index = index;\n  this.indexes = indexes;\n  this.data = data;\n  this.amount = this.data[0].length;\n  this.headers = headers;\n  this.columnPositions = columnPositions.slice(0);\n  this.actionType = 'remove_col';\n};\n(0, _object.inherit)(UndoRedo.RemoveColumnAction, UndoRedo.Action);\n\nUndoRedo.RemoveColumnAction.prototype.undo = function (instance, undoneCallback) {\n  var _this = this;\n\n  var row = void 0;\n  var ascendingIndexes = this.indexes.slice(0).sort();\n  var sortByIndexes = function sortByIndexes(elem, j, arr) {\n    return arr[_this.indexes.indexOf(ascendingIndexes[j])];\n  };\n\n  var sortedData = [];\n  (0, _number.rangeEach)(this.data.length - 1, function (i) {\n    sortedData[i] = (0, _array.arrayMap)(_this.data[i], sortByIndexes);\n  });\n\n  var sortedHeaders = [];\n  sortedHeaders = (0, _array.arrayMap)(this.headers, sortByIndexes);\n\n  var changes = [];\n\n  // TODO: Temporary hook for undo/redo mess\n  instance.runHooks('beforeCreateCol', this.indexes[0], this.indexes.length, 'UndoRedo.undo');\n\n  (0, _number.rangeEach)(this.data.length - 1, function (i) {\n    row = instance.getSourceDataAtRow(i);\n\n    (0, _number.rangeEach)(ascendingIndexes.length - 1, function (j) {\n      row.splice(ascendingIndexes[j], 0, sortedData[i][j]);\n      changes.push([i, ascendingIndexes[j], null, sortedData[i][j]]);\n    });\n  });\n\n  // TODO: Temporary hook for undo/redo mess\n  if (instance.getPlugin('formulas')) {\n    instance.getPlugin('formulas').onAfterSetDataAtCell(changes);\n  }\n\n  if (typeof this.headers !== 'undefined') {\n    (0, _number.rangeEach)(sortedHeaders.length - 1, function (j) {\n      instance.getSettings().colHeaders.splice(ascendingIndexes[j], 0, sortedHeaders[j]);\n    });\n  }\n\n  if (instance.getPlugin('manualColumnMove')) {\n    instance.getPlugin('manualColumnMove').columnsMapper.__arrayMap = this.columnPositions;\n  }\n\n  instance.addHookOnce('afterRender', undoneCallback);\n\n  // TODO: Temporary hook for undo/redo mess\n  instance.runHooks('afterCreateCol', this.indexes[0], this.indexes.length, 'UndoRedo.undo');\n\n  if (instance.getPlugin('formulas')) {\n    instance.getPlugin('formulas').recalculateFull();\n  }\n\n  instance.render();\n};\n\nUndoRedo.RemoveColumnAction.prototype.redo = function (instance, redoneCallback) {\n  instance.addHookOnce('afterRemoveCol', redoneCallback);\n  instance.alter('remove_col', this.index, this.amount, 'UndoRedo.redo');\n};\n\n/**\n * Cell alignment action.\n */\nUndoRedo.CellAlignmentAction = function (stateBefore, range, type, alignment) {\n  this.stateBefore = stateBefore;\n  this.range = range;\n  this.type = type;\n  this.alignment = alignment;\n};\nUndoRedo.CellAlignmentAction.prototype.undo = function (instance, undoneCallback) {\n  var _this2 = this;\n\n  (0, _array.arrayEach)(this.range, function (_ref) {\n    var from = _ref.from,\n        to = _ref.to;\n\n    for (var row = from.row; row <= to.row; row += 1) {\n      for (var col = from.col; col <= to.col; col += 1) {\n        instance.setCellMeta(row, col, 'className', _this2.stateBefore[row][col] || ' htLeft');\n      }\n    }\n  });\n\n  instance.addHookOnce('afterRender', undoneCallback);\n  instance.render();\n};\nUndoRedo.CellAlignmentAction.prototype.redo = function (instance, undoneCallback) {\n  (0, _utils.align)(this.range, this.type, this.alignment, function (row, col) {\n    return instance.getCellMeta(row, col);\n  }, function (row, col, key, value) {\n    return instance.setCellMeta(row, col, key, value);\n  });\n\n  instance.addHookOnce('afterRender', undoneCallback);\n  instance.render();\n};\n\n/**\n * Filters action.\n */\nUndoRedo.FiltersAction = function (conditionsStack) {\n  this.conditionsStack = conditionsStack;\n  this.actionType = 'filter';\n};\n(0, _object.inherit)(UndoRedo.FiltersAction, UndoRedo.Action);\n\nUndoRedo.FiltersAction.prototype.undo = function (instance, undoneCallback) {\n  var filters = instance.getPlugin('filters');\n\n  instance.addHookOnce('afterRender', undoneCallback);\n\n  filters.conditionCollection.importAllConditions(this.conditionsStack.slice(0, this.conditionsStack.length - 1));\n  filters.filter();\n};\nUndoRedo.FiltersAction.prototype.redo = function (instance, redoneCallback) {\n  var filters = instance.getPlugin('filters');\n\n  instance.addHookOnce('afterRender', redoneCallback);\n\n  filters.conditionCollection.importAllConditions(this.conditionsStack);\n  filters.filter();\n};\n\n/**\n * Merge Cells action.\n * @util\n */\n\nvar MergeCellsAction = function (_UndoRedo$Action) {\n  _inherits(MergeCellsAction, _UndoRedo$Action);\n\n  function MergeCellsAction(instance, cellRange) {\n    _classCallCheck(this, MergeCellsAction);\n\n    var _this3 = _possibleConstructorReturn(this, (MergeCellsAction.__proto__ || Object.getPrototypeOf(MergeCellsAction)).call(this));\n\n    _this3.cellRange = cellRange;\n    _this3.rangeData = instance.getData(cellRange.from.row, cellRange.from.col, cellRange.to.row, cellRange.to.col);\n    return _this3;\n  }\n\n  _createClass(MergeCellsAction, [{\n    key: 'undo',\n    value: function undo(instance, undoneCallback) {\n      var mergeCellsPlugin = instance.getPlugin('mergeCells');\n      instance.addHookOnce('afterRender', undoneCallback);\n\n      mergeCellsPlugin.unmergeRange(this.cellRange, true);\n      instance.populateFromArray(this.cellRange.from.row, this.cellRange.from.col, this.rangeData, void 0, void 0, 'MergeCells');\n    }\n  }, {\n    key: 'redo',\n    value: function redo(instance, redoneCallback) {\n      var mergeCellsPlugin = instance.getPlugin('mergeCells');\n      instance.addHookOnce('afterRender', redoneCallback);\n\n      mergeCellsPlugin.mergeRange(this.cellRange);\n    }\n  }]);\n\n  return MergeCellsAction;\n}(UndoRedo.Action);\n\nUndoRedo.MergeCellsAction = MergeCellsAction;\n\n/**\n * Unmerge Cells action.\n * @util\n */\n\nvar UnmergeCellsAction = function (_UndoRedo$Action2) {\n  _inherits(UnmergeCellsAction, _UndoRedo$Action2);\n\n  function UnmergeCellsAction(instance, cellRange) {\n    _classCallCheck(this, UnmergeCellsAction);\n\n    var _this4 = _possibleConstructorReturn(this, (UnmergeCellsAction.__proto__ || Object.getPrototypeOf(UnmergeCellsAction)).call(this));\n\n    _this4.cellRange = cellRange;\n    return _this4;\n  }\n\n  _createClass(UnmergeCellsAction, [{\n    key: 'undo',\n    value: function undo(instance, undoneCallback) {\n      var mergeCellsPlugin = instance.getPlugin('mergeCells');\n      instance.addHookOnce('afterRender', undoneCallback);\n\n      mergeCellsPlugin.mergeRange(this.cellRange, true);\n    }\n  }, {\n    key: 'redo',\n    value: function redo(instance, redoneCallback) {\n      var mergeCellsPlugin = instance.getPlugin('mergeCells');\n      instance.addHookOnce('afterRender', redoneCallback);\n\n      mergeCellsPlugin.unmergeRange(this.cellRange, true);\n      instance.render();\n    }\n  }]);\n\n  return UnmergeCellsAction;\n}(UndoRedo.Action);\n\nUndoRedo.UnmergeCellsAction = UnmergeCellsAction;\n\n/**\n * ManualRowMove action.\n * @TODO: removeRow undo should works on logical index\n */\nUndoRedo.RowMoveAction = function (movedRows, target) {\n  this.rows = movedRows.slice();\n  this.target = target;\n};\n(0, _object.inherit)(UndoRedo.RowMoveAction, UndoRedo.Action);\n\nUndoRedo.RowMoveAction.prototype.undo = function (instance, undoneCallback) {\n  var manualRowMove = instance.getPlugin('manualRowMove');\n\n  instance.addHookOnce('afterRender', undoneCallback);\n\n  var mod = this.rows[0] < this.target ? -1 * this.rows.length : 0;\n  var newTarget = this.rows[0] > this.target ? this.rows[0] + this.rows.length : this.rows[0];\n  var newRows = [];\n  var rowsLen = this.rows.length + mod;\n\n  for (var i = mod; i < rowsLen; i += 1) {\n    newRows.push(this.target + i);\n  }\n\n  manualRowMove.moveRows(newRows.slice(), newTarget);\n  instance.render();\n\n  instance.selectCell(this.rows[0], 0, this.rows[this.rows.length - 1], instance.countCols() - 1, false, false);\n};\nUndoRedo.RowMoveAction.prototype.redo = function (instance, redoneCallback) {\n  var manualRowMove = instance.getPlugin('manualRowMove');\n\n  instance.addHookOnce('afterRender', redoneCallback);\n  manualRowMove.moveRows(this.rows.slice(), this.target);\n  instance.render();\n  var startSelection = this.rows[0] < this.target ? this.target - this.rows.length : this.target;\n\n  instance.selectCell(startSelection, 0, startSelection + this.rows.length - 1, instance.countCols() - 1, false, false);\n};\n\nfunction init() {\n  var instance = this;\n  var pluginEnabled = typeof instance.getSettings().undo == 'undefined' || instance.getSettings().undo;\n\n  if (pluginEnabled) {\n    if (!instance.undoRedo) {\n      /**\n       * Instance of Handsontable.UndoRedo Plugin {@link Handsontable.UndoRedo}\n       *\n       * @alias undoRedo\n       * @memberof! Handsontable.Core#\n       * @type {UndoRedo}\n       */\n      instance.undoRedo = new UndoRedo(instance);\n\n      exposeUndoRedoMethods(instance);\n\n      instance.addHook('beforeKeyDown', onBeforeKeyDown);\n      instance.addHook('afterChange', onAfterChange);\n    }\n  } else if (instance.undoRedo) {\n    delete instance.undoRedo;\n\n    removeExposedUndoRedoMethods(instance);\n\n    instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n    instance.removeHook('afterChange', onAfterChange);\n  }\n}\n\nfunction onBeforeKeyDown(event) {\n  var instance = this;\n\n  var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey;\n\n  if (ctrlDown) {\n    if (event.keyCode === 89 || event.shiftKey && event.keyCode === 90) {\n      // CTRL + Y or CTRL + SHIFT + Z\n      instance.undoRedo.redo();\n      (0, _event.stopImmediatePropagation)(event);\n    } else if (event.keyCode === 90) {\n      // CTRL + Z\n      instance.undoRedo.undo();\n      (0, _event.stopImmediatePropagation)(event);\n    }\n  }\n}\n\nfunction onAfterChange(changes, source) {\n  var instance = this;\n  if (source === 'loadData') {\n    return instance.undoRedo.clear();\n  }\n}\n\nfunction exposeUndoRedoMethods(instance) {\n  /**\n   * {@link UndoRedo#undo}\n   * @alias undo\n   * @memberof! Handsontable.Core#\n   */\n  instance.undo = function () {\n    return instance.undoRedo.undo();\n  };\n\n  /**\n   * {@link UndoRedo#redo}\n   * @alias redo\n   * @memberof! Handsontable.Core#\n   */\n  instance.redo = function () {\n    return instance.undoRedo.redo();\n  };\n\n  /**\n   * {@link UndoRedo#isUndoAvailable}\n   * @alias isUndoAvailable\n   * @memberof! Handsontable.Core#\n   */\n  instance.isUndoAvailable = function () {\n    return instance.undoRedo.isUndoAvailable();\n  };\n\n  /**\n   * {@link UndoRedo#isRedoAvailable}\n   * @alias isRedoAvailable\n   * @memberof! Handsontable.Core#\n   */\n  instance.isRedoAvailable = function () {\n    return instance.undoRedo.isRedoAvailable();\n  };\n\n  /**\n   * {@link UndoRedo#clear}\n   * @alias clearUndo\n   * @memberof! Handsontable.Core#\n   */\n  instance.clearUndo = function () {\n    return instance.undoRedo.clear();\n  };\n}\n\nfunction removeExposedUndoRedoMethods(instance) {\n  delete instance.undo;\n  delete instance.redo;\n  delete instance.isUndoAvailable;\n  delete instance.isRedoAvailable;\n  delete instance.clearUndo;\n}\n\nvar hook = _pluginHooks2.default.getSingleton();\n\nhook.add('afterInit', init);\nhook.add('afterUpdateSettings', init);\n\nhook.register('beforeUndo');\nhook.register('afterUndo');\nhook.register('beforeRedo');\nhook.register('afterRedo');\n\nexports.default = UndoRedo;\n\n/***/ })\n/******/ ])[\"default\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/dist/handsontable.js",
    "content": "/*!\n * (The MIT License)\n * \n * Copyright (c) 2012-2014 Marcin Warpechowski\n * Copyright (c) 2015 Handsoncode sp. z o.o. <hello@handsoncode.net>\n * \n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * 'Software'), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n * \n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n * \n * Version: 2.0.0\n * Release date: 11/04/2018 (built at 10/04/2018 11:38:33)\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"moment\"), require(\"numbro\"), require(\"pikaday\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"Handsontable\", [\"moment\", \"numbro\", \"pikaday\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Handsontable\"] = factory(require(\"moment\"), require(\"numbro\"), require(\"pikaday\"));\n\telse\n\t\troot[\"Handsontable\"] = factory(root[\"moment\"], root[\"numbro\"], root[\"Pikaday\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_55__, __WEBPACK_EXTERNAL_MODULE_247__, __WEBPACK_EXTERNAL_MODULE_236__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 206);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.HTML_CHARACTERS = undefined;\nexports.getParent = getParent;\nexports.closest = closest;\nexports.closestDown = closestDown;\nexports.isChildOf = isChildOf;\nexports.isChildOfWebComponentTable = isChildOfWebComponentTable;\nexports.polymerWrap = polymerWrap;\nexports.polymerUnwrap = polymerUnwrap;\nexports.index = index;\nexports.overlayContainsElement = overlayContainsElement;\nexports.hasClass = hasClass;\nexports.addClass = addClass;\nexports.removeClass = removeClass;\nexports.removeTextNodes = removeTextNodes;\nexports.empty = empty;\nexports.fastInnerHTML = fastInnerHTML;\nexports.fastInnerText = fastInnerText;\nexports.isVisible = isVisible;\nexports.offset = offset;\nexports.getWindowScrollTop = getWindowScrollTop;\nexports.getWindowScrollLeft = getWindowScrollLeft;\nexports.getScrollTop = getScrollTop;\nexports.getScrollLeft = getScrollLeft;\nexports.getScrollableElement = getScrollableElement;\nexports.getTrimmingContainer = getTrimmingContainer;\nexports.getStyle = getStyle;\nexports.getComputedStyle = getComputedStyle;\nexports.outerWidth = outerWidth;\nexports.outerHeight = outerHeight;\nexports.innerHeight = innerHeight;\nexports.innerWidth = innerWidth;\nexports.addEvent = addEvent;\nexports.removeEvent = removeEvent;\nexports.getCaretPosition = getCaretPosition;\nexports.getSelectionEndPosition = getSelectionEndPosition;\nexports.getSelectionText = getSelectionText;\nexports.setCaretPosition = setCaretPosition;\nexports.getScrollbarWidth = getScrollbarWidth;\nexports.hasVerticalScrollbar = hasVerticalScrollbar;\nexports.hasHorizontalScrollbar = hasHorizontalScrollbar;\nexports.setOverlayPosition = setOverlayPosition;\nexports.getCssTransform = getCssTransform;\nexports.resetCssTransform = resetCssTransform;\nexports.isInput = isInput;\nexports.isOutsideInput = isOutsideInput;\n\nvar _browser = __webpack_require__(27);\n\nvar _feature = __webpack_require__(40);\n\n/**\n * Get the parent of the specified node in the DOM tree.\n *\n * @param  {HTMLElement} element Element from which traversing is started.\n * @param  {Number} [level=0] Traversing deep level.\n * @return {HTMLElement|null}\n */\nfunction getParent(element) {\n  var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n  var iteration = -1;\n  var parent = null;\n\n  while (element != null) {\n    if (iteration === level) {\n      parent = element;\n      break;\n    }\n\n    if (element.host && element.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      element = element.host;\n    } else {\n      iteration++;\n      element = element.parentNode;\n    }\n  }\n\n  return parent;\n}\n\n/**\n * Goes up the DOM tree (including given element) until it finds an element that matches the nodes or nodes name.\n * This method goes up through web components.\n *\n * @param {HTMLElement} element Element from which traversing is started\n * @param {Array} nodes Array of elements or Array of elements name\n * @param {HTMLElement} [until]\n * @returns {HTMLElement|null}\n */\nfunction closest(element, nodes, until) {\n  while (element != null && element !== until) {\n    if (element.nodeType === Node.ELEMENT_NODE && (nodes.indexOf(element.nodeName) > -1 || nodes.indexOf(element) > -1)) {\n      return element;\n    }\n    if (element.host && element.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      element = element.host;\n    } else {\n      element = element.parentNode;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Goes \"down\" the DOM tree (including given element) until it finds an element that matches the nodes or nodes name.\n *\n * @param {HTMLElement} element Element from which traversing is started\n * @param {Array} nodes Array of elements or Array of elements name\n * @param {HTMLElement} [until]\n * @returns {HTMLElement|null}\n */\nfunction closestDown(element, nodes, until) {\n  var matched = [];\n\n  while (element) {\n    element = closest(element, nodes, until);\n\n    if (!element || until && !until.contains(element)) {\n      break;\n    }\n    matched.push(element);\n\n    if (element.host && element.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      element = element.host;\n    } else {\n      element = element.parentNode;\n    }\n  }\n  var length = matched.length;\n\n  return length ? matched[length - 1] : null;\n}\n\n/**\n * Goes up the DOM tree and checks if element is child of another element.\n *\n * @param child Child element\n * @param {Object|String} parent Parent element OR selector of the parent element.\n *                               If string provided, function returns `true` for the first occurrence of element with that class.\n * @returns {Boolean}\n */\nfunction isChildOf(child, parent) {\n  var node = child.parentNode;\n  var queriedParents = [];\n\n  if (typeof parent === 'string') {\n    queriedParents = Array.prototype.slice.call(document.querySelectorAll(parent), 0);\n  } else {\n    queriedParents.push(parent);\n  }\n\n  while (node != null) {\n    if (queriedParents.indexOf(node) > -1) {\n      return true;\n    }\n    node = node.parentNode;\n  }\n\n  return false;\n}\n\n/**\n * Check if an element is part of `hot-table` web component.\n *\n * @param {Element} element\n * @returns {Boolean}\n */\nfunction isChildOfWebComponentTable(element) {\n  var hotTableName = 'hot-table',\n      result = false,\n      parentNode;\n\n  parentNode = polymerWrap(element);\n\n  function isHotTable(element) {\n    return element.nodeType === Node.ELEMENT_NODE && element.nodeName === hotTableName.toUpperCase();\n  }\n\n  while (parentNode != null) {\n    if (isHotTable(parentNode)) {\n      result = true;\n      break;\n    } else if (parentNode.host && parentNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      result = isHotTable(parentNode.host);\n\n      if (result) {\n        break;\n      }\n      parentNode = parentNode.host;\n    }\n    parentNode = parentNode.parentNode;\n  }\n\n  return result;\n}\n\n/**\n * Wrap element into polymer/webcomponent container if exists\n *\n * @param element\n * @returns {*}\n */\nfunction polymerWrap(element) {\n  /* global Polymer */\n  return typeof Polymer !== 'undefined' && typeof wrap === 'function' ? wrap(element) : element;\n}\n\n/**\n * Unwrap element from polymer/webcomponent container if exists\n *\n * @param element\n * @returns {*}\n */\nfunction polymerUnwrap(element) {\n  /* global Polymer */\n  return typeof Polymer !== 'undefined' && typeof unwrap === 'function' ? unwrap(element) : element;\n}\n\n/**\n * Counts index of element within its parent\n * WARNING: for performance reasons, assumes there are only element nodes (no text nodes). This is true for Walkotnable\n * Otherwise would need to check for nodeType or use previousElementSibling\n *\n * @see http://jsperf.com/sibling-index/10\n * @param {Element} element\n * @return {Number}\n */\nfunction index(element) {\n  var i = 0;\n\n  if (element.previousSibling) {\n    /* eslint-disable no-cond-assign */\n    while (element = element.previousSibling) {\n      ++i;\n    }\n  }\n\n  return i;\n}\n\n/**\n * Check if the provided overlay contains the provided element\n *\n * @param {String} overlay\n * @param {HTMLElement} element\n * @returns {boolean}\n */\nfunction overlayContainsElement(overlayType, element) {\n  var overlayElement = document.querySelector('.ht_clone_' + overlayType);\n  return overlayElement ? overlayElement.contains(element) : null;\n}\n\nvar classListSupport = !!document.documentElement.classList;\nvar _hasClass, _addClass, _removeClass;\n\nfunction filterEmptyClassNames(classNames) {\n  var result = [];\n\n  if (!classNames || !classNames.length) {\n    return result;\n  }\n\n  var len = 0;\n\n  while (classNames[len]) {\n    result.push(classNames[len]);\n    len++;\n  }\n\n  return result;\n}\n\nif (classListSupport) {\n  var isSupportMultipleClassesArg = function () {\n    var element = document.createElement('div');\n\n    element.classList.add('test', 'test2');\n\n    return element.classList.contains('test2');\n  }();\n\n  _hasClass = function _hasClass(element, className) {\n    if (element.classList === void 0 || typeof className !== 'string' || className === '') {\n      return false;\n    }\n\n    return element.classList.contains(className);\n  };\n\n  _addClass = function _addClass(element, className) {\n    if (typeof className === 'string') {\n      className = className.split(' ');\n    }\n\n    className = filterEmptyClassNames(className);\n\n    if (className.length > 0) {\n      if (isSupportMultipleClassesArg) {\n        element.classList.add.apply(element.classList, className);\n      } else {\n        var len = 0;\n\n        while (className && className[len]) {\n          element.classList.add(className[len]);\n          len++;\n        }\n      }\n    }\n  };\n\n  _removeClass = function _removeClass(element, className) {\n    if (typeof className === 'string') {\n      className = className.split(' ');\n    }\n\n    className = filterEmptyClassNames(className);\n\n    if (className.length > 0) {\n      if (isSupportMultipleClassesArg) {\n        element.classList.remove.apply(element.classList, className);\n      } else {\n        var len = 0;\n\n        while (className && className[len]) {\n          element.classList.remove(className[len]);\n          len++;\n        }\n      }\n    }\n  };\n} else {\n  var createClassNameRegExp = function createClassNameRegExp(className) {\n    return new RegExp('(\\\\s|^)' + className + '(\\\\s|$)');\n  };\n\n  _hasClass = function _hasClass(element, className) {\n    // http://snipplr.com/view/3561/addclass-removeclass-hasclass/\n    return element.className !== void 0 && createClassNameRegExp(className).test(element.className);\n  };\n\n  _addClass = function _addClass(element, className) {\n    var len = 0,\n        _className = element.className;\n\n    if (typeof className === 'string') {\n      className = className.split(' ');\n    }\n    if (_className === '') {\n      _className = className.join(' ');\n    } else {\n      while (className && className[len]) {\n        if (!createClassNameRegExp(className[len]).test(_className)) {\n          _className += ' ' + className[len];\n        }\n        len++;\n      }\n    }\n    element.className = _className;\n  };\n\n  _removeClass = function _removeClass(element, className) {\n    var len = 0,\n        _className = element.className;\n\n    if (typeof className === 'string') {\n      className = className.split(' ');\n    }\n    while (className && className[len]) {\n      // String.prototype.trim is defined in polyfill.js\n      _className = _className.replace(createClassNameRegExp(className[len]), ' ').trim();\n      len++;\n    }\n    if (element.className !== _className) {\n      element.className = _className;\n    }\n  };\n}\n\n/**\n * Checks if element has class name\n *\n * @param {HTMLElement} element\n * @param {String} className Class name to check\n * @returns {Boolean}\n */\nfunction hasClass(element, className) {\n  return _hasClass(element, className);\n}\n\n/**\n * Add class name to an element\n *\n * @param {HTMLElement} element\n * @param {String|Array} className Class name as string or array of strings\n */\nfunction addClass(element, className) {\n  return _addClass(element, className);\n}\n\n/**\n * Remove class name from an element\n *\n * @param {HTMLElement} element\n * @param {String|Array} className Class name as string or array of strings\n */\nfunction removeClass(element, className) {\n  return _removeClass(element, className);\n}\n\nfunction removeTextNodes(element, parent) {\n  if (element.nodeType === 3) {\n    parent.removeChild(element); // bye text nodes!\n  } else if (['TABLE', 'THEAD', 'TBODY', 'TFOOT', 'TR'].indexOf(element.nodeName) > -1) {\n    var childs = element.childNodes;\n    for (var i = childs.length - 1; i >= 0; i--) {\n      removeTextNodes(childs[i], element);\n    }\n  }\n}\n\n/**\n * Remove childs function\n * WARNING - this doesn't unload events and data attached by jQuery\n * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/9\n * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/11 - no siginificant improvement with Chrome remove() method\n *\n * @param element\n * @returns {void}\n */\n//\nfunction empty(element) {\n  var child;\n  /* eslint-disable no-cond-assign */\n  while (child = element.lastChild) {\n    element.removeChild(child);\n  }\n}\n\nvar HTML_CHARACTERS = exports.HTML_CHARACTERS = /(<(.*)>|&(.*);)/;\n\n/**\n * Insert content into element trying avoid innerHTML method.\n * @return {void}\n */\nfunction fastInnerHTML(element, content) {\n  if (HTML_CHARACTERS.test(content)) {\n    element.innerHTML = content;\n  } else {\n    fastInnerText(element, content);\n  }\n}\n\n/**\n * Insert text content into element\n * @return {void}\n */\n\nvar textContextSupport = !!document.createTextNode('test').textContent;\n\nfunction fastInnerText(element, content) {\n  var child = element.firstChild;\n\n  if (child && child.nodeType === 3 && child.nextSibling === null) {\n    // fast lane - replace existing text node\n\n    if (textContextSupport) {\n      // http://jsperf.com/replace-text-vs-reuse\n      child.textContent = content;\n    } else {\n      // http://jsperf.com/replace-text-vs-reuse\n      child.data = content;\n    }\n  } else {\n    // slow lane - empty element and insert a text node\n    empty(element);\n    element.appendChild(document.createTextNode(content));\n  }\n}\n\n/**\n * Returns true if element is attached to the DOM and visible, false otherwise\n * @param elem\n * @returns {boolean}\n */\nfunction isVisible(elem) {\n  var next = elem;\n\n  while (polymerUnwrap(next) !== document.documentElement) {\n    // until <html> reached\n    if (next === null) {\n      // parent detached from DOM\n      return false;\n    } else if (next.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      if (next.host) {\n        // this is Web Components Shadow DOM\n        // see: http://w3c.github.io/webcomponents/spec/shadow/#encapsulation\n        // according to spec, should be if (next.ownerDocument !== window.document), but that doesn't work yet\n        if (next.host.impl) {\n          // Chrome 33.0.1723.0 canary (2013-11-29) Web Platform features disabled\n          return isVisible(next.host.impl);\n        } else if (next.host) {\n          // Chrome 33.0.1723.0 canary (2013-11-29) Web Platform features enabled\n          return isVisible(next.host);\n        }\n        throw new Error('Lost in Web Components world');\n      } else {\n        return false; // this is a node detached from document in IE8\n      }\n    } else if (next.style.display === 'none') {\n      return false;\n    }\n    next = next.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * Returns elements top and left offset relative to the document. Function is not compatible with jQuery offset.\n *\n * @param {HTMLElement} elem\n * @return {Object} Returns object with `top` and `left` props\n */\nfunction offset(elem) {\n  var offsetLeft, offsetTop, lastElem, docElem, box;\n\n  docElem = document.documentElement;\n\n  if ((0, _feature.hasCaptionProblem)() && elem.firstChild && elem.firstChild.nodeName === 'CAPTION') {\n    // fixes problem with Firefox ignoring <caption> in TABLE offset (see also export outerHeight)\n    // http://jsperf.com/offset-vs-getboundingclientrect/8\n    box = elem.getBoundingClientRect();\n\n    return {\n      top: box.top + (window.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\n      left: box.left + (window.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\n    };\n  }\n  offsetLeft = elem.offsetLeft;\n  offsetTop = elem.offsetTop;\n  lastElem = elem;\n\n  /* eslint-disable no-cond-assign */\n  while (elem = elem.offsetParent) {\n    // from my observation, document.body always has scrollLeft/scrollTop == 0\n    if (elem === document.body) {\n      break;\n    }\n    offsetLeft += elem.offsetLeft;\n    offsetTop += elem.offsetTop;\n    lastElem = elem;\n  }\n\n  // slow - http://jsperf.com/offset-vs-getboundingclientrect/6\n  if (lastElem && lastElem.style.position === 'fixed') {\n    // if(lastElem !== document.body) { //faster but does gives false positive in Firefox\n    offsetLeft += window.pageXOffset || docElem.scrollLeft;\n    offsetTop += window.pageYOffset || docElem.scrollTop;\n  }\n\n  return {\n    left: offsetLeft,\n    top: offsetTop\n  };\n}\n\n/**\n * Returns the document's scrollTop property.\n *\n * @returns {Number}\n */\nfunction getWindowScrollTop() {\n  var res = window.scrollY;\n\n  if (res === void 0) {\n    // IE8-11\n    res = document.documentElement.scrollTop;\n  }\n\n  return res;\n}\n\n/**\n * Returns the document's scrollLeft property.\n *\n * @returns {Number}\n */\nfunction getWindowScrollLeft() {\n  var res = window.scrollX;\n\n  if (res === void 0) {\n    // IE8-11\n    res = document.documentElement.scrollLeft;\n  }\n\n  return res;\n}\n\n/**\n * Returns the provided element's scrollTop property.\n *\n * @param element\n * @returns {Number}\n */\nfunction getScrollTop(element) {\n  if (element === window) {\n    return getWindowScrollTop();\n  }\n  return element.scrollTop;\n}\n\n/**\n * Returns the provided element's scrollLeft property.\n *\n * @param element\n * @returns {Number}\n */\nfunction getScrollLeft(element) {\n  if (element === window) {\n    return getWindowScrollLeft();\n  }\n  return element.scrollLeft;\n}\n\n/**\n * Returns a DOM element responsible for scrolling of the provided element.\n *\n * @param {HTMLElement} element\n * @returns {HTMLElement} Element's scrollable parent\n */\nfunction getScrollableElement(element) {\n  var el = element.parentNode,\n      props = ['auto', 'scroll'],\n      overflow,\n      overflowX,\n      overflowY,\n      computedStyle = '',\n      computedOverflow = '',\n      computedOverflowY = '',\n      computedOverflowX = '';\n\n  while (el && el.style && document.body !== el) {\n    overflow = el.style.overflow;\n    overflowX = el.style.overflowX;\n    overflowY = el.style.overflowY;\n\n    if (overflow == 'scroll' || overflowX == 'scroll' || overflowY == 'scroll') {\n      return el;\n    } else if (window.getComputedStyle) {\n      computedStyle = window.getComputedStyle(el);\n      computedOverflow = computedStyle.getPropertyValue('overflow');\n      computedOverflowY = computedStyle.getPropertyValue('overflow-y');\n      computedOverflowX = computedStyle.getPropertyValue('overflow-x');\n\n      if (computedOverflow === 'scroll' || computedOverflowX === 'scroll' || computedOverflowY === 'scroll') {\n        return el;\n      }\n    }\n\n    // The '+ 1' after the scrollHeight/scrollWidth is to prevent problems with zoomed out Chrome.\n    if (el.clientHeight <= el.scrollHeight + 1 && (props.indexOf(overflowY) !== -1 || props.indexOf(overflow) !== -1 || props.indexOf(computedOverflow) !== -1 || props.indexOf(computedOverflowY) !== -1)) {\n      return el;\n    }\n    if (el.clientWidth <= el.scrollWidth + 1 && (props.indexOf(overflowX) !== -1 || props.indexOf(overflow) !== -1 || props.indexOf(computedOverflow) !== -1 || props.indexOf(computedOverflowX) !== -1)) {\n      return el;\n    }\n    el = el.parentNode;\n  }\n\n  return window;\n}\n\n/**\n * Returns a DOM element responsible for trimming the provided element.\n *\n * @param {HTMLElement} base Base element\n * @returns {HTMLElement} Base element's trimming parent\n */\nfunction getTrimmingContainer(base) {\n  var el = base.parentNode;\n\n  while (el && el.style && document.body !== el) {\n    if (el.style.overflow !== 'visible' && el.style.overflow !== '') {\n      return el;\n    } else if (window.getComputedStyle) {\n      var computedStyle = window.getComputedStyle(el);\n\n      if (computedStyle.getPropertyValue('overflow') !== 'visible' && computedStyle.getPropertyValue('overflow') !== '') {\n        return el;\n      }\n    }\n\n    el = el.parentNode;\n  }\n\n  return window;\n}\n\n/**\n * Returns a style property for the provided element. (Be it an inline or external style).\n *\n * @param {HTMLElement} element\n * @param {String} prop Wanted property\n * @returns {String|undefined} Element's style property\n */\nfunction getStyle(element, prop) {\n  /* eslint-disable */\n  if (!element) {\n    return;\n  } else if (element === window) {\n    if (prop === 'width') {\n      return window.innerWidth + 'px';\n    } else if (prop === 'height') {\n      return window.innerHeight + 'px';\n    }\n\n    return;\n  }\n\n  var styleProp = element.style[prop],\n      computedStyle;\n\n  if (styleProp !== '' && styleProp !== void 0) {\n    return styleProp;\n  } else {\n    computedStyle = getComputedStyle(element);\n\n    if (computedStyle[prop] !== '' && computedStyle[prop] !== void 0) {\n      return computedStyle[prop];\n    }\n  }\n}\n\n/**\n * Returns a computed style object for the provided element. (Needed if style is declared in external stylesheet).\n *\n * @param element\n * @returns {IEElementStyle|CssStyle} Elements computed style object\n */\nfunction getComputedStyle(element) {\n  return element.currentStyle || document.defaultView.getComputedStyle(element);\n}\n\n/**\n * Returns the element's outer width.\n *\n * @param element\n * @returns {number} Element's outer width\n */\nfunction outerWidth(element) {\n  return element.offsetWidth;\n}\n\n/**\n * Returns the element's outer height\n *\n * @param elem\n * @returns {number} Element's outer height\n */\nfunction outerHeight(elem) {\n  if ((0, _feature.hasCaptionProblem)() && elem.firstChild && elem.firstChild.nodeName === 'CAPTION') {\n    // fixes problem with Firefox ignoring <caption> in TABLE.offsetHeight\n    // jQuery (1.10.1) still has this unsolved\n    // may be better to just switch to getBoundingClientRect\n    // http://bililite.com/blog/2009/03/27/finding-the-size-of-a-table/\n    // http://lists.w3.org/Archives/Public/www-style/2009Oct/0089.html\n    // http://bugs.jquery.com/ticket/2196\n    // http://lists.w3.org/Archives/Public/www-style/2009Oct/0140.html#start140\n    return elem.offsetHeight + elem.firstChild.offsetHeight;\n  }\n\n  return elem.offsetHeight;\n}\n\n/**\n * Returns the element's inner height.\n *\n * @param element\n * @returns {number} Element's inner height\n */\nfunction innerHeight(element) {\n  return element.clientHeight || element.innerHeight;\n}\n\n/**\n * Returns the element's inner width.\n *\n * @param element\n * @returns {number} Element's inner width\n */\nfunction innerWidth(element) {\n  return element.clientWidth || element.innerWidth;\n}\n\nfunction addEvent(element, event, callback) {\n  if (window.addEventListener) {\n    element.addEventListener(event, callback, false);\n  } else {\n    element.attachEvent('on' + event, callback);\n  }\n}\n\nfunction removeEvent(element, event, callback) {\n  if (window.removeEventListener) {\n    element.removeEventListener(event, callback, false);\n  } else {\n    element.detachEvent('on' + event, callback);\n  }\n}\n\n/**\n * Returns caret position in text input\n *\n * @author http://stackoverflow.com/questions/263743/how-to-get-caret-position-in-textarea\n * @return {Number}\n */\nfunction getCaretPosition(el) {\n  if (el.selectionStart) {\n    return el.selectionStart;\n  } else if (document.selection) {\n    // IE8\n    el.focus();\n\n    var r = document.selection.createRange();\n\n    if (r == null) {\n      return 0;\n    }\n    var re = el.createTextRange();\n    var rc = re.duplicate();\n\n    re.moveToBookmark(r.getBookmark());\n    rc.setEndPoint('EndToStart', re);\n\n    return rc.text.length;\n  }\n\n  return 0;\n}\n\n/**\n * Returns end of the selection in text input\n *\n * @return {Number}\n */\nfunction getSelectionEndPosition(el) {\n  if (el.selectionEnd) {\n    return el.selectionEnd;\n  } else if (document.selection) {\n    // IE8\n    var r = document.selection.createRange();\n\n    if (r == null) {\n      return 0;\n    }\n    var re = el.createTextRange();\n\n    return re.text.indexOf(r.text) + r.text.length;\n  }\n\n  return 0;\n}\n\n/**\n * Returns text under selection.\n *\n * @returns {String}\n */\nfunction getSelectionText() {\n  var text = '';\n\n  if (window.getSelection) {\n    text = window.getSelection().toString();\n  } else if (document.selection && document.selection.type !== 'Control') {\n    text = document.selection.createRange().text;\n  }\n\n  return text;\n}\n\n/**\n * Sets caret position in text input.\n *\n * @author http://blog.vishalon.net/index.php/javascript-getting-and-setting-caret-position-in-textarea/\n * @param {Element} element\n * @param {Number} pos\n * @param {Number} endPos\n */\nfunction setCaretPosition(element, pos, endPos) {\n  if (endPos === void 0) {\n    endPos = pos;\n  }\n  if (element.setSelectionRange) {\n    element.focus();\n\n    try {\n      element.setSelectionRange(pos, endPos);\n    } catch (err) {\n      var elementParent = element.parentNode;\n      var parentDisplayValue = elementParent.style.display;\n      elementParent.style.display = 'block';\n      element.setSelectionRange(pos, endPos);\n      elementParent.style.display = parentDisplayValue;\n    }\n  } else if (element.createTextRange) {\n    // IE8\n    var range = element.createTextRange();\n    range.collapse(true);\n    range.moveEnd('character', endPos);\n    range.moveStart('character', pos);\n    range.select();\n  }\n}\n\nvar cachedScrollbarWidth;\n\n// http://stackoverflow.com/questions/986937/how-can-i-get-the-browsers-scrollbar-sizes\nfunction walkontableCalculateScrollbarWidth() {\n  var inner = document.createElement('div');\n  inner.style.height = '200px';\n  inner.style.width = '100%';\n\n  var outer = document.createElement('div');\n  outer.style.boxSizing = 'content-box';\n  outer.style.height = '150px';\n  outer.style.left = '0px';\n  outer.style.overflow = 'hidden';\n  outer.style.position = 'absolute';\n  outer.style.top = '0px';\n  outer.style.width = '200px';\n  outer.style.visibility = 'hidden';\n  outer.appendChild(inner);\n\n  (document.body || document.documentElement).appendChild(outer);\n  var w1 = inner.offsetWidth;\n  outer.style.overflow = 'scroll';\n  var w2 = inner.offsetWidth;\n  if (w1 == w2) {\n    w2 = outer.clientWidth;\n  }\n\n  (document.body || document.documentElement).removeChild(outer);\n\n  return w1 - w2;\n}\n\n/**\n * Returns the computed width of the native browser scroll bar.\n *\n * @return {Number} width\n */\nfunction getScrollbarWidth() {\n  if (cachedScrollbarWidth === void 0) {\n    cachedScrollbarWidth = walkontableCalculateScrollbarWidth();\n  }\n\n  return cachedScrollbarWidth;\n}\n\n/**\n * Checks if the provided element has a vertical scrollbar.\n *\n * @param {HTMLElement} element\n * @returns {Boolean}\n */\nfunction hasVerticalScrollbar(element) {\n  return element.offsetWidth !== element.clientWidth;\n}\n\n/**\n * Checks if the provided element has a vertical scrollbar.\n *\n * @param {HTMLElement} element\n * @returns {Boolean}\n */\nfunction hasHorizontalScrollbar(element) {\n  return element.offsetHeight !== element.clientHeight;\n}\n\n/**\n * Sets overlay position depending on it's type and used browser\n */\nfunction setOverlayPosition(overlayElem, left, top) {\n  if ((0, _browser.isIE8)() || (0, _browser.isIE9)()) {\n    overlayElem.style.top = top;\n    overlayElem.style.left = left;\n  } else if ((0, _browser.isSafari)()) {\n    overlayElem.style['-webkit-transform'] = 'translate3d(' + left + ',' + top + ',0)';\n  } else {\n    overlayElem.style.transform = 'translate3d(' + left + ',' + top + ',0)';\n  }\n}\n\nfunction getCssTransform(element) {\n  var transform;\n\n  if (element.style.transform && (transform = element.style.transform) !== '') {\n    return ['transform', transform];\n  } else if (element.style['-webkit-transform'] && (transform = element.style['-webkit-transform']) !== '') {\n\n    return ['-webkit-transform', transform];\n  }\n\n  return -1;\n}\n\nfunction resetCssTransform(element) {\n  if (element.style.transform && element.style.transform !== '') {\n    element.style.transform = '';\n  } else if (element.style['-webkit-transform'] && element.style['-webkit-transform'] !== '') {\n    element.style['-webkit-transform'] = '';\n  }\n}\n\n/**\n * Determines if the given DOM element is an input field.\n * Notice: By 'input' we mean input, textarea and select nodes\n *\n * @param {HTMLElement} element - DOM element\n * @returns {Boolean}\n */\nfunction isInput(element) {\n  var inputs = ['INPUT', 'SELECT', 'TEXTAREA'];\n\n  return element && (inputs.indexOf(element.nodeName) > -1 || element.contentEditable === 'true');\n}\n\n/**\n * Determines if the given DOM element is an input field placed OUTSIDE of HOT.\n * Notice: By 'input' we mean input, textarea and select nodes\n *\n * @param {HTMLElement} element - DOM element\n * @returns {Boolean}\n */\nfunction isOutsideInput(element) {\n  return isInput(element) && element.className.indexOf('handsontableInput') == -1 && element.className.indexOf('copyPaste') == -1;\n}\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.to2dArray = to2dArray;\nexports.extendArray = extendArray;\nexports.pivot = pivot;\nexports.arrayReduce = arrayReduce;\nexports.arrayFilter = arrayFilter;\nexports.arrayMap = arrayMap;\nexports.arrayEach = arrayEach;\nexports.arraySum = arraySum;\nexports.arrayMax = arrayMax;\nexports.arrayMin = arrayMin;\nexports.arrayAvg = arrayAvg;\nexports.arrayFlatten = arrayFlatten;\nexports.arrayUnique = arrayUnique;\nfunction to2dArray(arr) {\n  var i = 0,\n      ilen = arr.length;\n\n  while (i < ilen) {\n    arr[i] = [arr[i]];\n    i++;\n  }\n}\n\nfunction extendArray(arr, extension) {\n  var i = 0,\n      ilen = extension.length;\n\n  while (i < ilen) {\n    arr.push(extension[i]);\n    i++;\n  }\n}\n\nfunction pivot(arr) {\n  var pivotedArr = [];\n\n  if (!arr || arr.length === 0 || !arr[0] || arr[0].length === 0) {\n    return pivotedArr;\n  }\n\n  var rowCount = arr.length;\n  var colCount = arr[0].length;\n\n  for (var i = 0; i < rowCount; i++) {\n    for (var j = 0; j < colCount; j++) {\n      if (!pivotedArr[j]) {\n        pivotedArr[j] = [];\n      }\n\n      pivotedArr[j][i] = arr[i][j];\n    }\n  }\n\n  return pivotedArr;\n}\n\n/**\n * A specialized version of `.reduce` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * {@link https://github.com/lodash/lodash/blob/master/lodash.js}\n *\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {Boolean} [initFromArray] Specify using the first element of `array` as the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initFromArray) {\n  var index = -1;\n  var iterable = array;\n\n  if (!Array.isArray(array)) {\n    iterable = Array.from(array);\n  }\n  var length = iterable.length;\n\n  if (initFromArray && length) {\n    accumulator = iterable[++index];\n  }\n  while (++index < length) {\n    accumulator = iteratee(accumulator, iterable[index], index, iterable);\n  }\n\n  return accumulator;\n}\n\n/**\n * A specialized version of `.filter` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * {@link https://github.com/lodash/lodash/blob/master/lodash.js}\n *\n * @param {Array} array The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1;\n  var iterable = array;\n\n  if (!Array.isArray(array)) {\n    iterable = Array.from(array);\n  }\n\n  var length = iterable.length;\n  var result = [];\n  var resIndex = -1;\n\n  while (++index < length) {\n    var value = iterable[index];\n\n    if (predicate(value, index, iterable)) {\n      result[++resIndex] = value;\n    }\n  }\n\n  return result;\n}\n\n/**\n * A specialized version of `.map` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1;\n  var iterable = array;\n\n  if (!Array.isArray(array)) {\n    iterable = Array.from(array);\n  }\n\n  var length = iterable.length;\n  var result = [];\n  var resIndex = -1;\n\n  while (++index < length) {\n    var value = iterable[index];\n\n    result[++resIndex] = iteratee(value, index, iterable);\n  }\n\n  return result;\n}\n\n/**\n * A specialized version of `.forEach` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * {@link https://github.com/lodash/lodash/blob/master/lodash.js}\n *\n * @param {Array|*} array The array to iterate over or an any element with implemented iterator protocol.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1;\n  var iterable = array;\n\n  if (!Array.isArray(array)) {\n    iterable = Array.from(array);\n  }\n\n  var length = iterable.length;\n\n  while (++index < length) {\n    if (iteratee(iterable[index], index, iterable) === false) {\n      break;\n    }\n  }\n\n  return array;\n}\n\n/**\n * Calculate sum value for each item of the array.\n *\n * @param {Array} array The array to process.\n * @returns {Number} Returns calculated sum value.\n */\nfunction arraySum(array) {\n  return arrayReduce(array, function (a, b) {\n    return a + b;\n  }, 0);\n}\n\n/**\n * Returns the highest value from an array. Can be array of numbers or array of strings.\n * NOTICE: Mixed values is not supported.\n *\n * @param {Array} array The array to process.\n * @returns {Number} Returns the highest value from an array.\n */\nfunction arrayMax(array) {\n  return arrayReduce(array, function (a, b) {\n    return a > b ? a : b;\n  }, Array.isArray(array) ? array[0] : void 0);\n}\n\n/**\n * Returns the lowest value from an array. Can be array of numbers or array of strings.\n * NOTICE: Mixed values is not supported.\n *\n * @param {Array} array The array to process.\n * @returns {Number} Returns the lowest value from an array.\n */\nfunction arrayMin(array) {\n  return arrayReduce(array, function (a, b) {\n    return a < b ? a : b;\n  }, Array.isArray(array) ? array[0] : void 0);\n}\n\n/**\n * Calculate average value for each item of the array.\n *\n * @param {Array} array The array to process.\n * @returns {Number} Returns calculated average value.\n */\nfunction arrayAvg(array) {\n  if (!array.length) {\n    return 0;\n  }\n\n  return arraySum(array) / array.length;\n}\n\n/**\n * Flatten multidimensional array.\n *\n * @param {Array} array Array of Arrays\n * @returns {Array}\n */\nfunction arrayFlatten(array) {\n  return arrayReduce(array, function (initial, value) {\n    return initial.concat(Array.isArray(value) ? arrayFlatten(value) : value);\n  }, []);\n}\n\n/**\n * Unique values in the array.\n *\n * @param {Array} array The array to process.\n * @returns {Array}\n */\nfunction arrayUnique(array) {\n  var unique = [];\n\n  arrayEach(array, function (value) {\n    if (unique.indexOf(value) === -1) {\n      unique.push(value);\n    }\n  });\n\n  return unique;\n}\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.duckSchema = duckSchema;\nexports.inherit = inherit;\nexports.extend = extend;\nexports.deepExtend = deepExtend;\nexports.deepClone = deepClone;\nexports.clone = clone;\nexports.mixin = mixin;\nexports.isObjectEqual = isObjectEqual;\nexports.isObject = isObject;\nexports.defineGetter = defineGetter;\nexports.objectEach = objectEach;\nexports.getProperty = getProperty;\nexports.deepObjectSize = deepObjectSize;\nexports.createObjectPropListener = createObjectPropListener;\nexports.hasOwnProperty = hasOwnProperty;\n\nvar _array = __webpack_require__(1);\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/**\n * Generate schema for passed object.\n *\n * @param {Array|Object} object\n * @returns {Array|Object}\n */\nfunction duckSchema(object) {\n  var schema;\n\n  if (Array.isArray(object)) {\n    schema = [];\n  } else {\n    schema = {};\n\n    objectEach(object, function (value, key) {\n      if (key === '__children') {\n        return;\n      }\n\n      if (value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && !Array.isArray(value)) {\n        schema[key] = duckSchema(value);\n      } else if (Array.isArray(value)) {\n        if (value.length && _typeof(value[0]) === 'object' && !Array.isArray(value[0])) {\n          schema[key] = [duckSchema(value[0])];\n        } else {\n          schema[key] = [];\n        }\n      } else {\n        schema[key] = null;\n      }\n    });\n  }\n\n  return schema;\n}\n\n/**\n * Inherit without without calling parent constructor, and setting `Child.prototype.constructor` to `Child` instead of `Parent`.\n * Creates temporary dummy function to call it as constructor.\n * Described in ticket: https://github.com/handsontable/handsontable/pull/516\n *\n * @param  {Object} Child  child class\n * @param  {Object} Parent parent class\n * @return {Object}        extended Child\n */\nfunction inherit(Child, Parent) {\n  Parent.prototype.constructor = Parent;\n  Child.prototype = new Parent();\n  Child.prototype.constructor = Child;\n\n  return Child;\n}\n\n/**\n * Perform shallow extend of a target object with extension's own properties.\n *\n * @param {Object} target An object that will receive the new properties.\n * @param {Object} extension An object containing additional properties to merge into the target.\n */\nfunction extend(target, extension) {\n  objectEach(extension, function (value, key) {\n    target[key] = value;\n  });\n\n  return target;\n}\n\n/**\n * Perform deep extend of a target object with extension's own properties.\n *\n * @param {Object} target An object that will receive the new properties.\n * @param {Object} extension An object containing additional properties to merge into the target.\n */\nfunction deepExtend(target, extension) {\n  objectEach(extension, function (value, key) {\n    if (extension[key] && _typeof(extension[key]) === 'object') {\n      if (!target[key]) {\n        if (Array.isArray(extension[key])) {\n          target[key] = [];\n        } else if (Object.prototype.toString.call(extension[key]) === '[object Date]') {\n          target[key] = extension[key];\n        } else {\n          target[key] = {};\n        }\n      }\n      deepExtend(target[key], extension[key]);\n    } else {\n      target[key] = extension[key];\n    }\n  });\n}\n\n/**\n * Perform deep clone of an object.\n * WARNING! Only clones JSON properties. Will cause error when `obj` contains a function, Date, etc.\n *\n * @param {Object} obj An object that will be cloned\n * @return {Object}\n */\nfunction deepClone(obj) {\n  if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object') {\n    return JSON.parse(JSON.stringify(obj));\n  }\n\n  return obj;\n}\n\n/**\n * Shallow clone object.\n *\n * @param {Object} object\n * @returns {Object}\n */\nfunction clone(object) {\n  var result = {};\n\n  objectEach(object, function (value, key) {\n    result[key] = value;\n  });\n\n  return result;\n}\n\n/**\n * Extend the Base object (usually prototype) of the functionality the `mixins` objects.\n *\n * @param {Object} Base Base object which will be extended.\n * @param {Object} mixins The object of the functionality will be \"copied\".\n * @returns {Object}\n */\nfunction mixin(Base) {\n  if (!Base.MIXINS) {\n    Base.MIXINS = [];\n  }\n\n  for (var _len = arguments.length, mixins = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    mixins[_key - 1] = arguments[_key];\n  }\n\n  (0, _array.arrayEach)(mixins, function (mixin) {\n    Base.MIXINS.push(mixin.MIXIN_NAME);\n\n    objectEach(mixin, function (value, key) {\n      if (Base.prototype[key] !== void 0) {\n        throw new Error('Mixin conflict. Property \\'' + key + '\\' already exist and cannot be overwritten.');\n      }\n      if (typeof value === 'function') {\n        Base.prototype[key] = value;\n      } else {\n        var getter = function _getter(propertyName, initialValue) {\n          propertyName = '_' + propertyName;\n\n          var initValue = function initValue(value) {\n            if (Array.isArray(value) || isObject(value)) {\n              value = deepClone(value);\n            }\n\n            return value;\n          };\n\n          return function () {\n            if (this[propertyName] === void 0) {\n              this[propertyName] = initValue(initialValue);\n            }\n\n            return this[propertyName];\n          };\n        };\n        var setter = function _setter(propertyName) {\n          propertyName = '_' + propertyName;\n\n          return function (value) {\n            this[propertyName] = value;\n          };\n        };\n        Object.defineProperty(Base.prototype, key, {\n          get: getter(key, value),\n          set: setter(key),\n          configurable: true\n        });\n      }\n    });\n  });\n\n  return Base;\n}\n\n/**\n * Checks if two objects or arrays are (deep) equal\n *\n * @param {Object|Array} object1\n * @param {Object|Array} object2\n * @returns {Boolean}\n */\nfunction isObjectEqual(object1, object2) {\n  return JSON.stringify(object1) === JSON.stringify(object2);\n}\n\n/**\n * Determines whether given object is a plain Object.\n * Note: String and Array are not plain Objects\n * @param {*} obj\n * @returns {boolean}\n */\nfunction isObject(obj) {\n  return Object.prototype.toString.call(obj) == '[object Object]';\n}\n\nfunction defineGetter(object, property, value, options) {\n  options.value = value;\n  options.writable = options.writable !== false;\n  options.enumerable = options.enumerable !== false;\n  options.configurable = options.configurable !== false;\n\n  Object.defineProperty(object, property, options);\n}\n\n/**\n * A specialized version of `.forEach` for objects.\n *\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction objectEach(object, iteratee) {\n  for (var key in object) {\n    if (!object.hasOwnProperty || object.hasOwnProperty && Object.prototype.hasOwnProperty.call(object, key)) {\n      if (iteratee(object[key], key, object) === false) {\n        break;\n      }\n    }\n  }\n\n  return object;\n}\n\n/**\n * Get object property by its name. Access to sub properties can be achieved by dot notation (e.q. `'foo.bar.baz'`).\n *\n * @param {Object} object Object which value will be exported.\n * @param {String} name Object property name.\n * @returns {*}\n */\nfunction getProperty(object, name) {\n  var names = name.split('.');\n  var result = object;\n\n  objectEach(names, function (name) {\n    result = result[name];\n\n    if (result === void 0) {\n      result = void 0;\n\n      return false;\n    }\n  });\n\n  return result;\n}\n\n/**\n * Return object length (recursively).\n *\n * @param {*} object Object for which we want get length.\n * @returns {Number}\n */\nfunction deepObjectSize(object) {\n  if (!isObject(object)) {\n    return 0;\n  }\n  var recursObjLen = function recursObjLen(obj) {\n    var result = 0;\n\n    if (isObject(obj)) {\n      objectEach(obj, function (key) {\n        result += recursObjLen(key);\n      });\n    } else {\n      result++;\n    }\n\n    return result;\n  };\n\n  return recursObjLen(object);\n}\n\n/**\n * Create object with property where its value change will be observed.\n *\n * @param {*} [defaultValue=undefined] Default value.\n * @param {String} [propertyToListen='value'] Property to listen.\n * @returns {Object}\n */\nfunction createObjectPropListener(defaultValue) {\n  var _holder;\n\n  var propertyToListen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'value';\n\n  var privateProperty = '_' + propertyToListen;\n  var holder = (_holder = {\n    _touched: false\n  }, _defineProperty(_holder, privateProperty, defaultValue), _defineProperty(_holder, 'isTouched', function isTouched() {\n    return this._touched;\n  }), _holder);\n\n  Object.defineProperty(holder, propertyToListen, {\n    get: function get() {\n      return this[privateProperty];\n    },\n    set: function set(value) {\n      this._touched = true;\n      this[privateProperty] = value;\n    },\n\n    enumerable: true,\n    configurable: true\n  });\n\n  return holder;\n}\n\n/**\n * Check if at specified `key` there is any value for `object`.\n *\n * @param {Object} object Object to search value at specyfic key.\n * @param {String} key String key to check.\n */\nfunction hasOwnProperty(object, key) {\n  return Object.prototype.hasOwnProperty.call(object, key);\n}\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar core = __webpack_require__(44);\nvar hide = __webpack_require__(31);\nvar redefine = __webpack_require__(30);\nvar ctx = __webpack_require__(32);\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n  var IS_FORCED = type & $export.F;\n  var IS_GLOBAL = type & $export.G;\n  var IS_STATIC = type & $export.S;\n  var IS_PROTO = type & $export.P;\n  var IS_BIND = type & $export.B;\n  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n  var key, own, out, exp;\n  if (IS_GLOBAL) source = name;\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    // export native or passed\n    out = (own ? target : source)[key];\n    // bind timers to global for call from export context\n    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // extend global\n    if (target) redefine(target, key, out, type & $export.U);\n    // export\n    if (exports[key] != out) hide(exports, key, exp);\n    if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n  }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1;   // forced\n$export.G = 2;   // global\n$export.S = 4;   // static\n$export.P = 8;   // proto\n$export.B = 16;  // bind\n$export.W = 32;  // wrap\n$export.U = 64;  // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.Viewport = exports.TableRenderer = exports.Table = exports.Settings = exports.Selection = exports.Scroll = exports.Overlays = exports.Event = exports.Core = exports.default = exports.Border = exports.TopLeftCornerOverlay = exports.TopOverlay = exports.LeftOverlay = exports.DebugOverlay = exports.RowFilter = exports.ColumnFilter = exports.CellRange = exports.CellCoords = exports.ViewportRowsCalculator = exports.ViewportColumnsCalculator = undefined;\n\n__webpack_require__(96);\n\n__webpack_require__(111);\n\n__webpack_require__(112);\n\n__webpack_require__(116);\n\n__webpack_require__(117);\n\n__webpack_require__(119);\n\n__webpack_require__(122);\n\n__webpack_require__(123);\n\n__webpack_require__(124);\n\n__webpack_require__(125);\n\n__webpack_require__(126);\n\n__webpack_require__(127);\n\n__webpack_require__(128);\n\n__webpack_require__(129);\n\n__webpack_require__(130);\n\n__webpack_require__(131);\n\n__webpack_require__(132);\n\n__webpack_require__(133);\n\n__webpack_require__(134);\n\n__webpack_require__(135);\n\n__webpack_require__(136);\n\n__webpack_require__(137);\n\n__webpack_require__(138);\n\n__webpack_require__(139);\n\n__webpack_require__(141);\n\n__webpack_require__(143);\n\n__webpack_require__(144);\n\n__webpack_require__(145);\n\n__webpack_require__(146);\n\n__webpack_require__(147);\n\n__webpack_require__(148);\n\n__webpack_require__(149);\n\n__webpack_require__(150);\n\n__webpack_require__(151);\n\n__webpack_require__(152);\n\n__webpack_require__(153);\n\n__webpack_require__(154);\n\n__webpack_require__(155);\n\n__webpack_require__(85);\n\n__webpack_require__(156);\n\n__webpack_require__(157);\n\n__webpack_require__(159);\n\n__webpack_require__(160);\n\n__webpack_require__(161);\n\n__webpack_require__(162);\n\n__webpack_require__(163);\n\n__webpack_require__(164);\n\n__webpack_require__(165);\n\n__webpack_require__(167);\n\n__webpack_require__(168);\n\n__webpack_require__(169);\n\n__webpack_require__(172);\n\n__webpack_require__(173);\n\n__webpack_require__(174);\n\nvar _viewportColumns = __webpack_require__(175);\n\nvar _viewportColumns2 = _interopRequireDefault(_viewportColumns);\n\nvar _viewportRows = __webpack_require__(176);\n\nvar _viewportRows2 = _interopRequireDefault(_viewportRows);\n\nvar _coords = __webpack_require__(54);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nvar _range = __webpack_require__(86);\n\nvar _range2 = _interopRequireDefault(_range);\n\nvar _column = __webpack_require__(177);\n\nvar _column2 = _interopRequireDefault(_column);\n\nvar _row = __webpack_require__(178);\n\nvar _row2 = _interopRequireDefault(_row);\n\nvar _debug = __webpack_require__(228);\n\nvar _debug2 = _interopRequireDefault(_debug);\n\nvar _left = __webpack_require__(229);\n\nvar _left2 = _interopRequireDefault(_left);\n\nvar _top = __webpack_require__(230);\n\nvar _top2 = _interopRequireDefault(_top);\n\nvar _topLeftCorner = __webpack_require__(231);\n\nvar _topLeftCorner2 = _interopRequireDefault(_topLeftCorner);\n\nvar _border = __webpack_require__(187);\n\nvar _border2 = _interopRequireDefault(_border);\n\nvar _core = __webpack_require__(179);\n\nvar _core2 = _interopRequireDefault(_core);\n\nvar _event = __webpack_require__(180);\n\nvar _event2 = _interopRequireDefault(_event);\n\nvar _overlays = __webpack_require__(181);\n\nvar _overlays2 = _interopRequireDefault(_overlays);\n\nvar _scroll = __webpack_require__(182);\n\nvar _scroll2 = _interopRequireDefault(_scroll);\n\nvar _selection = __webpack_require__(232);\n\nvar _selection2 = _interopRequireDefault(_selection);\n\nvar _settings = __webpack_require__(183);\n\nvar _settings2 = _interopRequireDefault(_settings);\n\nvar _table = __webpack_require__(184);\n\nvar _table2 = _interopRequireDefault(_table);\n\nvar _tableRenderer = __webpack_require__(185);\n\nvar _tableRenderer2 = _interopRequireDefault(_tableRenderer);\n\nvar _viewport = __webpack_require__(186);\n\nvar _viewport2 = _interopRequireDefault(_viewport);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.ViewportColumnsCalculator = _viewportColumns2.default;\nexports.ViewportRowsCalculator = _viewportRows2.default;\nexports.CellCoords = _coords2.default;\nexports.CellRange = _range2.default;\nexports.ColumnFilter = _column2.default;\nexports.RowFilter = _row2.default;\nexports.DebugOverlay = _debug2.default;\nexports.LeftOverlay = _left2.default;\nexports.TopOverlay = _top2.default;\nexports.TopLeftCornerOverlay = _topLeftCorner2.default;\nexports.Border = _border2.default;\nexports.default = _core2.default;\nexports.Core = _core2.default;\nexports.Event = _event2.default;\nexports.Overlays = _overlays2.default;\nexports.Scroll = _scroll2.default;\nexports.Selection = _selection2.default;\nexports.Settings = _settings2.default;\nexports.Table = _table2.default;\nexports.TableRenderer = _tableRenderer2.default;\nexports.Viewport = _viewport2.default;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.isNumeric = isNumeric;\nexports.rangeEach = rangeEach;\nexports.rangeEachReverse = rangeEachReverse;\nexports.valueAccordingPercent = valueAccordingPercent;\n/**\n * Checks if value of n is a numeric one\n * http://jsperf.com/isnan-vs-isnumeric/4\n * @param n\n * @returns {boolean}\n */\nfunction isNumeric(n) {\n  /* eslint-disable */\n  var t = typeof n === 'undefined' ? 'undefined' : _typeof(n);\n\n  return t == 'number' ? !isNaN(n) && isFinite(n) : t == 'string' ? !n.length ? false : n.length == 1 ? /\\d/.test(n) : /^\\s*[+-]?\\s*(?:(?:\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)|(?:0x[a-f\\d]+))\\s*$/i.test(n) : t == 'object' ? !!n && typeof n.valueOf() == 'number' && !(n instanceof Date) : false;\n}\n\n/**\n * A specialized version of `.forEach` defined by ranges.\n *\n * @param {Number} rangeFrom The number from start iterate.\n * @param {Number|Function} rangeTo The number where finish iterate or function as a iteratee.\n * @param {Function} [iteratee] The function invoked per iteration.\n */\nfunction rangeEach(rangeFrom, rangeTo, iteratee) {\n  var index = -1;\n\n  if (typeof rangeTo === 'function') {\n    iteratee = rangeTo;\n    rangeTo = rangeFrom;\n  } else {\n    index = rangeFrom - 1;\n  }\n  while (++index <= rangeTo) {\n    if (iteratee(index) === false) {\n      break;\n    }\n  }\n}\n\n/**\n * A specialized version of `.forEach` defined by ranges iterable in reverse order.\n *\n * @param {Number} rangeFrom The number from start iterate.\n * @param {Number|Function} rangeTo The number where finish iterate or function as a iteratee.\n * @param {Function} [iteratee] The function invoked per iteration.\n */\nfunction rangeEachReverse(rangeFrom, rangeTo, iteratee) {\n  var index = rangeFrom + 1;\n\n  if (typeof rangeTo === 'function') {\n    iteratee = rangeTo;\n    rangeTo = 0;\n  }\n  while (--index >= rangeTo) {\n    if (iteratee(index) === false) {\n      break;\n    }\n  }\n}\n\n/**\n * Calculate value from percent.\n *\n * @param {Number} value Base value from percent will be calculated.\n * @param {String|Number} percent Can be Number or String (eq. `'33%'`).\n * @returns {Number}\n */\nfunction valueAccordingPercent(value, percent) {\n  percent = parseInt(percent.toString().replace('%', ''), 10);\n  percent = parseInt(value * percent / 100, 10);\n\n  return percent;\n}\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.getListenersCounter = getListenersCounter;\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _feature = __webpack_require__(40);\n\nvar _event = __webpack_require__(12);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Counter which tracks unregistered listeners (useful for detecting memory leaks).\n *\n * @type {Number}\n */\nvar listenersCounter = 0;\n\n/**\n * Event DOM manager for internal use in Handsontable.\n *\n * @class EventManager\n * @util\n */\n\nvar EventManager = function () {\n  /**\n   * @param {Object} [context=null]\n   * @private\n   */\n  function EventManager() {\n    var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n    _classCallCheck(this, EventManager);\n\n    this.context = context || this;\n\n    if (!this.context.eventListeners) {\n      this.context.eventListeners = [];\n    }\n  }\n\n  /**\n   * Register specified listener (`eventName`) to the element.\n   *\n   * @param {Element} element Target element.\n   * @param {String} eventName Event name.\n   * @param {Function} callback Function which will be called after event occur.\n   * @returns {Function} Returns function which you can easily call to remove that event\n   */\n\n\n  _createClass(EventManager, [{\n    key: 'addEventListener',\n    value: function addEventListener(element, eventName, callback) {\n      var _this = this;\n\n      var context = this.context;\n\n      function callbackProxy(event) {\n        event = extendEvent(context, event);\n\n        callback.call(this, event);\n      }\n      this.context.eventListeners.push({\n        element: element,\n        event: eventName,\n        callback: callback,\n        callbackProxy: callbackProxy\n      });\n\n      if (window.addEventListener) {\n        element.addEventListener(eventName, callbackProxy, false);\n      } else {\n        element.attachEvent('on' + eventName, callbackProxy);\n      }\n      listenersCounter++;\n\n      return function () {\n        _this.removeEventListener(element, eventName, callback);\n      };\n    }\n\n    /**\n     * Remove the event listener previously registered.\n     *\n     * @param {Element} element Target element.\n     * @param {String} eventName Event name.\n     * @param {Function} callback Function to remove from the event target. It must be the same as during registration listener.\n     */\n\n  }, {\n    key: 'removeEventListener',\n    value: function removeEventListener(element, eventName, callback) {\n      var len = this.context.eventListeners.length;\n      var tmpEvent = void 0;\n\n      while (len--) {\n        tmpEvent = this.context.eventListeners[len];\n\n        if (tmpEvent.event == eventName && tmpEvent.element == element) {\n          if (callback && callback != tmpEvent.callback) {\n            /* eslint-disable no-continue */\n            continue;\n          }\n          this.context.eventListeners.splice(len, 1);\n\n          if (tmpEvent.element.removeEventListener) {\n            tmpEvent.element.removeEventListener(tmpEvent.event, tmpEvent.callbackProxy, false);\n          } else {\n            tmpEvent.element.detachEvent('on' + tmpEvent.event, tmpEvent.callbackProxy);\n          }\n          listenersCounter--;\n        }\n      }\n    }\n\n    /**\n     * Clear all previously registered events.\n     *\n     * @private\n     * @since 0.15.0-beta3\n     */\n\n  }, {\n    key: 'clearEvents',\n    value: function clearEvents() {\n      if (!this.context) {\n        return;\n      }\n      var len = this.context.eventListeners.length;\n\n      while (len--) {\n        var event = this.context.eventListeners[len];\n\n        if (event) {\n          this.removeEventListener(event.element, event.event, event.callback);\n        }\n      }\n    }\n\n    /**\n     * Clear all previously registered events.\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.clearEvents();\n    }\n\n    /**\n     * Destroy instance of EventManager.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.clearEvents();\n      this.context = null;\n    }\n\n    /**\n     * Trigger event at the specified target element.\n     *\n     * @param {Element} element Target element.\n     * @param {String} eventName Event name.\n     */\n\n  }, {\n    key: 'fireEvent',\n    value: function fireEvent(element, eventName) {\n      var options = {\n        bubbles: true,\n        cancelable: eventName !== 'mousemove',\n        view: window,\n        detail: 0,\n        screenX: 0,\n        screenY: 0,\n        clientX: 1,\n        clientY: 1,\n        ctrlKey: false,\n        altKey: false,\n        shiftKey: false,\n        metaKey: false,\n        button: 0,\n        relatedTarget: undefined\n      };\n      var event;\n\n      if (document.createEvent) {\n        event = document.createEvent('MouseEvents');\n        event.initMouseEvent(eventName, options.bubbles, options.cancelable, options.view, options.detail, options.screenX, options.screenY, options.clientX, options.clientY, options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, options.relatedTarget || document.body.parentNode);\n      } else {\n        event = document.createEventObject();\n      }\n\n      if (element.dispatchEvent) {\n        element.dispatchEvent(event);\n      } else {\n        element.fireEvent('on' + eventName, event);\n      }\n    }\n  }]);\n\n  return EventManager;\n}();\n\n/**\n * @param {Object} context\n * @param {Event} event\n * @private\n * @returns {*}\n */\n\n\nfunction extendEvent(context, event) {\n  var componentName = 'HOT-TABLE';\n  var isHotTableSpotted = void 0;\n  var fromElement = void 0;\n  var realTarget = void 0;\n  var target = void 0;\n  var len = void 0;\n  var nativeStopImmediatePropagation = void 0;\n\n  event.isTargetWebComponent = false;\n  event.realTarget = event.target;\n\n  nativeStopImmediatePropagation = event.stopImmediatePropagation;\n  event.stopImmediatePropagation = function () {\n    nativeStopImmediatePropagation.apply(this);\n    (0, _event.stopImmediatePropagation)(this);\n  };\n\n  if (!EventManager.isHotTableEnv) {\n    return event;\n  }\n  event = (0, _element.polymerWrap)(event);\n  len = event.path ? event.path.length : 0;\n\n  while (len--) {\n    if (event.path[len].nodeName === componentName) {\n      isHotTableSpotted = true;\n    } else if (isHotTableSpotted && event.path[len].shadowRoot) {\n      target = event.path[len];\n\n      break;\n    }\n    if (len === 0 && !target) {\n      target = event.path[len];\n    }\n  }\n  if (!target) {\n    target = event.target;\n  }\n  event.isTargetWebComponent = true;\n\n  if ((0, _feature.isWebComponentSupportedNatively)()) {\n    event.realTarget = event.srcElement || event.toElement;\n  } else if ((0, _object.hasOwnProperty)(context, 'hot') || context.isHotTableEnv || context.wtTable) {\n    // Polymer doesn't support `event.target` property properly we must emulate it ourselves\n    if ((0, _object.hasOwnProperty)(context, 'hot')) {\n      // Custom element\n      fromElement = context.hot ? context.hot.view.wt.wtTable.TABLE : null;\n    } else if (context.isHotTableEnv) {\n      // Handsontable.Core\n      fromElement = context.view.activeWt.wtTable.TABLE.parentNode.parentNode;\n    } else if (context.wtTable) {\n      // Walkontable\n      fromElement = context.wtTable.TABLE.parentNode.parentNode;\n    }\n    realTarget = (0, _element.closest)(event.target, [componentName], fromElement);\n\n    if (realTarget) {\n      event.realTarget = fromElement.querySelector(componentName) || event.target;\n    } else {\n      event.realTarget = event.target;\n    }\n  }\n\n  Object.defineProperty(event, 'target', {\n    get: function get() {\n      return (0, _element.polymerWrap)(target);\n    },\n\n    enumerable: true,\n    configurable: true\n  });\n\n  return event;\n}\n\nexports.default = EventManager;\nfunction getListenersCounter() {\n  return listenersCounter;\n};\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n/**\n * Constants for parts of translation.\n */\n\nvar CONTEXT_MENU_ITEMS_NAMESPACE = exports.CONTEXT_MENU_ITEMS_NAMESPACE = 'ContextMenu:items';\nvar CONTEXTMENU_ITEMS_ROW_ABOVE = exports.CONTEXTMENU_ITEMS_ROW_ABOVE = CONTEXT_MENU_ITEMS_NAMESPACE + '.insertRowAbove';\nvar CONTEXTMENU_ITEMS_ROW_BELOW = exports.CONTEXTMENU_ITEMS_ROW_BELOW = CONTEXT_MENU_ITEMS_NAMESPACE + '.insertRowBelow';\nvar CONTEXTMENU_ITEMS_INSERT_LEFT = exports.CONTEXTMENU_ITEMS_INSERT_LEFT = CONTEXT_MENU_ITEMS_NAMESPACE + '.insertColumnOnTheLeft';\nvar CONTEXTMENU_ITEMS_INSERT_RIGHT = exports.CONTEXTMENU_ITEMS_INSERT_RIGHT = CONTEXT_MENU_ITEMS_NAMESPACE + '.insertColumnOnTheRight';\nvar CONTEXTMENU_ITEMS_REMOVE_ROW = exports.CONTEXTMENU_ITEMS_REMOVE_ROW = CONTEXT_MENU_ITEMS_NAMESPACE + '.removeRow';\nvar CONTEXTMENU_ITEMS_REMOVE_COLUMN = exports.CONTEXTMENU_ITEMS_REMOVE_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.removeColumn';\nvar CONTEXTMENU_ITEMS_UNDO = exports.CONTEXTMENU_ITEMS_UNDO = CONTEXT_MENU_ITEMS_NAMESPACE + '.undo';\nvar CONTEXTMENU_ITEMS_REDO = exports.CONTEXTMENU_ITEMS_REDO = CONTEXT_MENU_ITEMS_NAMESPACE + '.redo';\nvar CONTEXTMENU_ITEMS_READ_ONLY = exports.CONTEXTMENU_ITEMS_READ_ONLY = CONTEXT_MENU_ITEMS_NAMESPACE + '.readOnly';\nvar CONTEXTMENU_ITEMS_CLEAR_COLUMN = exports.CONTEXTMENU_ITEMS_CLEAR_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.clearColumn';\n\nvar CONTEXTMENU_ITEMS_COPY = exports.CONTEXTMENU_ITEMS_COPY = CONTEXT_MENU_ITEMS_NAMESPACE + '.copy';\nvar CONTEXTMENU_ITEMS_CUT = exports.CONTEXTMENU_ITEMS_CUT = CONTEXT_MENU_ITEMS_NAMESPACE + '.cut';\n\nvar CONTEXTMENU_ITEMS_FREEZE_COLUMN = exports.CONTEXTMENU_ITEMS_FREEZE_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.freezeColumn';\nvar CONTEXTMENU_ITEMS_UNFREEZE_COLUMN = exports.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.unfreezeColumn';\n\nvar CONTEXTMENU_ITEMS_MERGE_CELLS = exports.CONTEXTMENU_ITEMS_MERGE_CELLS = CONTEXT_MENU_ITEMS_NAMESPACE + '.mergeCells';\nvar CONTEXTMENU_ITEMS_UNMERGE_CELLS = exports.CONTEXTMENU_ITEMS_UNMERGE_CELLS = CONTEXT_MENU_ITEMS_NAMESPACE + '.unmergeCells';\n\nvar CONTEXTMENU_ITEMS_ADD_COMMENT = exports.CONTEXTMENU_ITEMS_ADD_COMMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.addComment';\nvar CONTEXTMENU_ITEMS_EDIT_COMMENT = exports.CONTEXTMENU_ITEMS_EDIT_COMMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.editComment';\nvar CONTEXTMENU_ITEMS_REMOVE_COMMENT = exports.CONTEXTMENU_ITEMS_REMOVE_COMMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.removeComment';\nvar CONTEXTMENU_ITEMS_READ_ONLY_COMMENT = exports.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.readOnlyComment';\n\nvar CONTEXTMENU_ITEMS_ALIGNMENT = exports.CONTEXTMENU_ITEMS_ALIGNMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.align';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_LEFT = exports.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.left';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_CENTER = exports.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.center';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT = exports.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.right';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY = exports.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.justify';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_TOP = exports.CONTEXTMENU_ITEMS_ALIGNMENT_TOP = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.top';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE = exports.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.middle';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM = exports.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.bottom';\n\nvar CONTEXTMENU_ITEMS_BORDERS = exports.CONTEXTMENU_ITEMS_BORDERS = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders';\nvar CONTEXTMENU_ITEMS_BORDERS_TOP = exports.CONTEXTMENU_ITEMS_BORDERS_TOP = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.top';\nvar CONTEXTMENU_ITEMS_BORDERS_RIGHT = exports.CONTEXTMENU_ITEMS_BORDERS_RIGHT = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.right';\nvar CONTEXTMENU_ITEMS_BORDERS_BOTTOM = exports.CONTEXTMENU_ITEMS_BORDERS_BOTTOM = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.bottom';\nvar CONTEXTMENU_ITEMS_BORDERS_LEFT = exports.CONTEXTMENU_ITEMS_BORDERS_LEFT = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.left';\nvar CONTEXTMENU_ITEMS_REMOVE_BORDERS = exports.CONTEXTMENU_ITEMS_REMOVE_BORDERS = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.remove';\n\nvar CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD = exports.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD = CONTEXT_MENU_ITEMS_NAMESPACE + '.nestedHeaders.insertChildRow';\nvar CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD = exports.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD = CONTEXT_MENU_ITEMS_NAMESPACE + '.nestedHeaders.detachFromParent';\n\nvar CONTEXTMENU_ITEMS_HIDE_COLUMN = exports.CONTEXTMENU_ITEMS_HIDE_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.hideColumn';\nvar CONTEXTMENU_ITEMS_SHOW_COLUMN = exports.CONTEXTMENU_ITEMS_SHOW_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.showColumn';\n\nvar CONTEXTMENU_ITEMS_HIDE_ROW = exports.CONTEXTMENU_ITEMS_HIDE_ROW = CONTEXT_MENU_ITEMS_NAMESPACE + '.hideRow';\nvar CONTEXTMENU_ITEMS_SHOW_ROW = exports.CONTEXTMENU_ITEMS_SHOW_ROW = CONTEXT_MENU_ITEMS_NAMESPACE + '.showRow';\n\nvar FILTERS_NAMESPACE = exports.FILTERS_NAMESPACE = 'Filters:';\nvar FILTERS_CONDITIONS_NAMESPACE = exports.FILTERS_CONDITIONS_NAMESPACE = FILTERS_NAMESPACE + 'conditions';\nvar FILTERS_CONDITIONS_NONE = exports.FILTERS_CONDITIONS_NONE = FILTERS_CONDITIONS_NAMESPACE + '.none';\nvar FILTERS_CONDITIONS_EMPTY = exports.FILTERS_CONDITIONS_EMPTY = FILTERS_CONDITIONS_NAMESPACE + '.isEmpty';\nvar FILTERS_CONDITIONS_NOT_EMPTY = exports.FILTERS_CONDITIONS_NOT_EMPTY = FILTERS_CONDITIONS_NAMESPACE + '.isNotEmpty';\nvar FILTERS_CONDITIONS_EQUAL = exports.FILTERS_CONDITIONS_EQUAL = FILTERS_CONDITIONS_NAMESPACE + '.isEqualTo';\nvar FILTERS_CONDITIONS_NOT_EQUAL = exports.FILTERS_CONDITIONS_NOT_EQUAL = FILTERS_CONDITIONS_NAMESPACE + '.isNotEqualTo';\nvar FILTERS_CONDITIONS_BEGINS_WITH = exports.FILTERS_CONDITIONS_BEGINS_WITH = FILTERS_CONDITIONS_NAMESPACE + '.beginsWith';\nvar FILTERS_CONDITIONS_ENDS_WITH = exports.FILTERS_CONDITIONS_ENDS_WITH = FILTERS_CONDITIONS_NAMESPACE + '.endsWith';\nvar FILTERS_CONDITIONS_CONTAINS = exports.FILTERS_CONDITIONS_CONTAINS = FILTERS_CONDITIONS_NAMESPACE + '.contains';\nvar FILTERS_CONDITIONS_NOT_CONTAIN = exports.FILTERS_CONDITIONS_NOT_CONTAIN = FILTERS_CONDITIONS_NAMESPACE + '.doesNotContain';\nvar FILTERS_CONDITIONS_BY_VALUE = exports.FILTERS_CONDITIONS_BY_VALUE = FILTERS_CONDITIONS_NAMESPACE + '.byValue';\nvar FILTERS_CONDITIONS_GREATER_THAN = exports.FILTERS_CONDITIONS_GREATER_THAN = FILTERS_CONDITIONS_NAMESPACE + '.greaterThan';\nvar FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL = exports.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL = FILTERS_CONDITIONS_NAMESPACE + '.greaterThanOrEqualTo';\nvar FILTERS_CONDITIONS_LESS_THAN = exports.FILTERS_CONDITIONS_LESS_THAN = FILTERS_CONDITIONS_NAMESPACE + '.lessThan';\nvar FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL = exports.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL = FILTERS_CONDITIONS_NAMESPACE + '.lessThanOrEqualTo';\nvar FILTERS_CONDITIONS_BETWEEN = exports.FILTERS_CONDITIONS_BETWEEN = FILTERS_CONDITIONS_NAMESPACE + '.isBetween';\nvar FILTERS_CONDITIONS_NOT_BETWEEN = exports.FILTERS_CONDITIONS_NOT_BETWEEN = FILTERS_CONDITIONS_NAMESPACE + '.isNotBetween';\nvar FILTERS_CONDITIONS_AFTER = exports.FILTERS_CONDITIONS_AFTER = FILTERS_CONDITIONS_NAMESPACE + '.after';\nvar FILTERS_CONDITIONS_BEFORE = exports.FILTERS_CONDITIONS_BEFORE = FILTERS_CONDITIONS_NAMESPACE + '.before';\nvar FILTERS_CONDITIONS_TODAY = exports.FILTERS_CONDITIONS_TODAY = FILTERS_CONDITIONS_NAMESPACE + '.today';\nvar FILTERS_CONDITIONS_TOMORROW = exports.FILTERS_CONDITIONS_TOMORROW = FILTERS_CONDITIONS_NAMESPACE + '.tomorrow';\nvar FILTERS_CONDITIONS_YESTERDAY = exports.FILTERS_CONDITIONS_YESTERDAY = FILTERS_CONDITIONS_NAMESPACE + '.yesterday';\n\nvar FILTERS_DIVS_FILTER_BY_CONDITION = exports.FILTERS_DIVS_FILTER_BY_CONDITION = FILTERS_NAMESPACE + 'labels.filterByCondition';\nvar FILTERS_DIVS_FILTER_BY_VALUE = exports.FILTERS_DIVS_FILTER_BY_VALUE = FILTERS_NAMESPACE + 'labels.filterByValue';\n\nvar FILTERS_LABELS_CONJUNCTION = exports.FILTERS_LABELS_CONJUNCTION = FILTERS_NAMESPACE + 'labels.conjunction';\nvar FILTERS_LABELS_DISJUNCTION = exports.FILTERS_LABELS_DISJUNCTION = FILTERS_NAMESPACE + 'labels.disjunction';\n\nvar FILTERS_VALUES_BLANK_CELLS = exports.FILTERS_VALUES_BLANK_CELLS = FILTERS_NAMESPACE + 'values.blankCells';\n\nvar FILTERS_BUTTONS_SELECT_ALL = exports.FILTERS_BUTTONS_SELECT_ALL = FILTERS_NAMESPACE + 'buttons.selectAll';\nvar FILTERS_BUTTONS_CLEAR = exports.FILTERS_BUTTONS_CLEAR = FILTERS_NAMESPACE + 'buttons.clear';\nvar FILTERS_BUTTONS_OK = exports.FILTERS_BUTTONS_OK = FILTERS_NAMESPACE + 'buttons.ok';\nvar FILTERS_BUTTONS_CANCEL = exports.FILTERS_BUTTONS_CANCEL = FILTERS_NAMESPACE + 'buttons.cancel';\n\nvar FILTERS_BUTTONS_PLACEHOLDER_SEARCH = exports.FILTERS_BUTTONS_PLACEHOLDER_SEARCH = FILTERS_NAMESPACE + 'buttons.placeholder.search';\nvar FILTERS_BUTTONS_PLACEHOLDER_VALUE = exports.FILTERS_BUTTONS_PLACEHOLDER_VALUE = FILTERS_NAMESPACE + 'buttons.placeholder.value';\nvar FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE = exports.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE = FILTERS_NAMESPACE + 'buttons.placeholder.secondValue';\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getPluginName = exports.getRegistredPluginNames = exports.getPlugin = exports.registerPlugin = undefined;\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _object = __webpack_require__(2);\n\nvar _string = __webpack_require__(36);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar registeredPlugins = new WeakMap();\n\n/**\n * Registers plugin under given name\n *\n * @param {String} pluginName\n * @param {Function} PluginClass\n */\n/**\n * Utility to register plugins and common namespace for keeping reference to all plugins classes\n */\nfunction registerPlugin(pluginName, PluginClass) {\n  pluginName = (0, _string.toUpperCaseFirst)(pluginName);\n\n  _pluginHooks2.default.getSingleton().add('construct', function () {\n    var holder = void 0;\n\n    if (!registeredPlugins.has(this)) {\n      registeredPlugins.set(this, {});\n    }\n    holder = registeredPlugins.get(this);\n\n    if (!holder[pluginName]) {\n      holder[pluginName] = new PluginClass(this);\n    }\n  });\n  _pluginHooks2.default.getSingleton().add('afterDestroy', function () {\n    if (registeredPlugins.has(this)) {\n      var pluginsHolder = registeredPlugins.get(this);\n\n      (0, _object.objectEach)(pluginsHolder, function (plugin) {\n        return plugin.destroy();\n      });\n      registeredPlugins.delete(this);\n    }\n  });\n}\n\n/**\n * @param {Object} instance\n * @param {String|Function} pluginName\n * @returns {Function} pluginClass Returns plugin instance if exists or `undefined` if not exists.\n */\nfunction getPlugin(instance, pluginName) {\n  if (typeof pluginName != 'string') {\n    throw Error('Only strings can be passed as \"plugin\" parameter');\n  }\n  var _pluginName = (0, _string.toUpperCaseFirst)(pluginName);\n\n  if (!registeredPlugins.has(instance) || !registeredPlugins.get(instance)[_pluginName]) {\n    return void 0;\n  }\n\n  return registeredPlugins.get(instance)[_pluginName];\n}\n\n/**\n * Get all registred plugins names for concrete Handsontable instance.\n *\n * @param {Object} hotInstance\n * @returns {Array}\n */\nfunction getRegistredPluginNames(hotInstance) {\n  return registeredPlugins.has(hotInstance) ? Object.keys(registeredPlugins.get(hotInstance)) : [];\n}\n\n/**\n * Get plugin name.\n *\n * @param {Object} hotInstance\n * @param {Object} plugin\n * @returns {String|null}\n */\nfunction getPluginName(hotInstance, plugin) {\n  var pluginName = null;\n\n  if (registeredPlugins.has(hotInstance)) {\n    (0, _object.objectEach)(registeredPlugins.get(hotInstance), function (pluginInstance, name) {\n      if (pluginInstance === plugin) {\n        pluginName = name;\n      }\n    });\n  }\n\n  return pluginName;\n}\n\nexports.registerPlugin = registerPlugin;\nexports.getPlugin = getPlugin;\nexports.getRegistredPluginNames = getRegistredPluginNames;\nexports.getPluginName = getPluginName;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _recordTranslator = __webpack_require__(193);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar privatePool = new WeakMap();\nvar initializedPlugins = null;\n\n/**\n * @private\n */\n\nvar BasePlugin = function () {\n  /**\n   * @param {Object} hotInstance Handsontable instance.\n   */\n  function BasePlugin(hotInstance) {\n    var _this = this;\n\n    _classCallCheck(this, BasePlugin);\n\n    /**\n     * Handsontable instance.\n     *\n     * @type {Core}\n     */\n    (0, _object.defineGetter)(this, 'hot', hotInstance, {\n      writable: false\n    });\n    (0, _object.defineGetter)(this, 't', (0, _recordTranslator.getTranslator)(hotInstance), {\n      writable: false\n    });\n\n    privatePool.set(this, { hooks: {} });\n    initializedPlugins = null;\n\n    this.pluginName = null;\n    this.pluginsInitializedCallbacks = [];\n    this.isPluginsReady = false;\n    this.enabled = false;\n    this.initialized = false;\n\n    this.hot.addHook('afterPluginsInitialized', function () {\n      return _this.onAfterPluginsInitialized();\n    });\n    this.hot.addHook('afterUpdateSettings', function () {\n      return _this.onUpdateSettings();\n    });\n    this.hot.addHook('beforeInit', function () {\n      return _this.init();\n    });\n  }\n\n  _createClass(BasePlugin, [{\n    key: 'init',\n    value: function init() {\n      this.pluginName = (0, _plugins.getPluginName)(this.hot, this);\n\n      if (this.isEnabled && this.isEnabled()) {\n        this.enablePlugin();\n      }\n      if (!initializedPlugins) {\n        initializedPlugins = (0, _plugins.getRegistredPluginNames)(this.hot);\n      }\n      if (initializedPlugins.indexOf(this.pluginName) >= 0) {\n        initializedPlugins.splice(initializedPlugins.indexOf(this.pluginName), 1);\n      }\n      if (!initializedPlugins.length) {\n        this.hot.runHooks('afterPluginsInitialized');\n      }\n      this.initialized = true;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      this.enabled = true;\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      if (this.eventManager) {\n        this.eventManager.clear();\n      }\n      this.clearHooks();\n      this.enabled = false;\n    }\n\n    /**\n     * Add listener to plugin hooks system.\n     *\n     * @param {String} name\n     * @param {Function} callback\n     */\n\n  }, {\n    key: 'addHook',\n    value: function addHook(name, callback) {\n      privatePool.get(this).hooks[name] = privatePool.get(this).hooks[name] || [];\n\n      var hooks = privatePool.get(this).hooks[name];\n\n      this.hot.addHook(name, callback);\n      hooks.push(callback);\n      privatePool.get(this).hooks[name] = hooks;\n    }\n\n    /**\n     * Remove all hooks listeners by hook name.\n     *\n     * @param {String} name\n     */\n\n  }, {\n    key: 'removeHooks',\n    value: function removeHooks(name) {\n      var _this2 = this;\n\n      (0, _array.arrayEach)(privatePool.get(this).hooks[name] || [], function (callback) {\n        _this2.hot.removeHook(name, callback);\n      });\n    }\n\n    /**\n     * Clear all hooks.\n     */\n\n  }, {\n    key: 'clearHooks',\n    value: function clearHooks() {\n      var _this3 = this;\n\n      var hooks = privatePool.get(this).hooks;\n\n      (0, _object.objectEach)(hooks, function (callbacks, name) {\n        return _this3.removeHooks(name);\n      });\n      hooks.length = 0;\n    }\n\n    /**\n     * Register function which will be immediately called after all plugins initialized.\n     *\n     * @param {Function} callback\n     */\n\n  }, {\n    key: 'callOnPluginsReady',\n    value: function callOnPluginsReady(callback) {\n      if (this.isPluginsReady) {\n        callback();\n      } else {\n        this.pluginsInitializedCallbacks.push(callback);\n      }\n    }\n\n    /**\n     * On after plugins initialized listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterPluginsInitialized',\n    value: function onAfterPluginsInitialized() {\n      (0, _array.arrayEach)(this.pluginsInitializedCallbacks, function (callback) {\n        return callback();\n      });\n      this.pluginsInitializedCallbacks.length = 0;\n      this.isPluginsReady = true;\n    }\n\n    /**\n     * On update settings listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onUpdateSettings',\n    value: function onUpdateSettings() {\n      if (this.isEnabled) {\n        if (this.enabled && !this.isEnabled()) {\n          this.disablePlugin();\n        }\n        if (!this.enabled && this.isEnabled()) {\n          this.enablePlugin();\n        }\n        if (this.enabled && this.isEnabled()) {\n          this.updatePlugin();\n        }\n      }\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {}\n\n    /**\n     * Destroy plugin.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      var _this4 = this;\n\n      if (this.eventManager) {\n        this.eventManager.destroy();\n      }\n      this.clearHooks();\n\n      (0, _object.objectEach)(this, function (value, property) {\n        if (property !== 'hot' && property !== 't') {\n          _this4[property] = null;\n        }\n      });\n      delete this.t;\n      delete this.hot;\n    }\n  }]);\n\n  return BasePlugin;\n}();\n\nexports.default = BasePlugin;\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar store = __webpack_require__(77)('wks');\nvar uid = __webpack_require__(48);\nvar Symbol = __webpack_require__(14).Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n  return store[name] || (store[name] =\n    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.stopImmediatePropagation = stopImmediatePropagation;\nexports.isImmediatePropagationStopped = isImmediatePropagationStopped;\nexports.stopPropagation = stopPropagation;\nexports.pageX = pageX;\nexports.pageY = pageY;\nexports.isRightClick = isRightClick;\nexports.isLeftClick = isLeftClick;\n\nvar _element = __webpack_require__(0);\n\n/**\n * Prevent other listeners of the same event from being called.\n *\n * @param {Event} event\n */\nfunction stopImmediatePropagation(event) {\n  event.isImmediatePropagationEnabled = false;\n  event.cancelBubble = true;\n}\n\n/**\n * Check if event was stopped by `stopImmediatePropagation`.\n *\n * @param event {Event}\n * @returns {Boolean}\n */\nfunction isImmediatePropagationStopped(event) {\n  return event.isImmediatePropagationEnabled === false;\n}\n\n/**\n * Prevent further propagation of the current event (prevent bubbling).\n *\n * @param event {Event}\n */\nfunction stopPropagation(event) {\n  // ie8\n  // http://msdn.microsoft.com/en-us/library/ie/ff975462(v=vs.85).aspx\n  if (typeof event.stopPropagation === 'function') {\n    event.stopPropagation();\n  } else {\n    event.cancelBubble = true;\n  }\n}\n\n/**\n * Get horizontal coordinate of the event object relative to the whole document.\n *\n * @param {Event} event\n * @returns {Number}\n */\nfunction pageX(event) {\n  if (event.pageX) {\n    return event.pageX;\n  }\n\n  return event.clientX + (0, _element.getWindowScrollLeft)();\n}\n\n/**\n * Get vertical coordinate of the event object relative to the whole document.\n *\n * @param {Event} event\n * @returns {Number}\n */\nfunction pageY(event) {\n  if (event.pageY) {\n    return event.pageY;\n  }\n\n  return event.clientY + (0, _element.getWindowScrollTop)();\n}\n\n/**\n * Check if provided event was triggered by clicking the right mouse button.\n *\n * @param {Event} event DOM Event.\n * @returns {Boolean}\n */\nfunction isRightClick(event) {\n  return event.button === 2;\n}\n\n/**\n * Check if provided event was triggered by clicking the left mouse button.\n *\n * @param {Event} event DOM Event.\n * @returns {Boolean}\n */\nfunction isLeftClick(event) {\n  return event.button === 0;\n}\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getRegisteredRenderers = exports.getRegisteredRendererNames = exports.hasRenderer = exports.getRenderer = exports.registerRenderer = undefined;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _cellDecorator = __webpack_require__(242);\n\nvar _cellDecorator2 = _interopRequireDefault(_cellDecorator);\n\nvar _autocompleteRenderer = __webpack_require__(243);\n\nvar _autocompleteRenderer2 = _interopRequireDefault(_autocompleteRenderer);\n\nvar _checkboxRenderer = __webpack_require__(244);\n\nvar _checkboxRenderer2 = _interopRequireDefault(_checkboxRenderer);\n\nvar _htmlRenderer = __webpack_require__(245);\n\nvar _htmlRenderer2 = _interopRequireDefault(_htmlRenderer);\n\nvar _numericRenderer = __webpack_require__(246);\n\nvar _numericRenderer2 = _interopRequireDefault(_numericRenderer);\n\nvar _passwordRenderer = __webpack_require__(248);\n\nvar _passwordRenderer2 = _interopRequireDefault(_passwordRenderer);\n\nvar _textRenderer = __webpack_require__(249);\n\nvar _textRenderer2 = _interopRequireDefault(_textRenderer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _staticRegister = (0, _staticRegister3.default)('renderers'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem,\n    hasItem = _staticRegister.hasItem,\n    getNames = _staticRegister.getNames,\n    getValues = _staticRegister.getValues;\n\nregister('base', _cellDecorator2.default);\nregister('autocomplete', _autocompleteRenderer2.default);\nregister('checkbox', _checkboxRenderer2.default);\nregister('html', _htmlRenderer2.default);\nregister('numeric', _numericRenderer2.default);\nregister('password', _passwordRenderer2.default);\nregister('text', _textRenderer2.default);\n\n/**\n * Retrieve renderer function.\n *\n * @param {String} name Renderer identification.\n * @returns {Function} Returns renderer function.\n */\nfunction _getItem(name) {\n  if (typeof name === 'function') {\n    return name;\n  }\n  if (!hasItem(name)) {\n    throw Error('No registered renderer found under \"' + name + '\" name');\n  }\n\n  return getItem(name);\n}\n\nexports.registerRenderer = register;\nexports.getRenderer = _getItem;\nexports.hasRenderer = hasItem;\nexports.getRegisteredRendererNames = getNames;\nexports.getRegisteredRenderers = getValues;\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports) {\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self\n  // eslint-disable-next-line no-new-func\n  : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @description\n * Handsontable events are the common interface that function in 2 ways: as __callbacks__ and as __hooks__.\n *\n * @example\n *\n * ```js\n * // Using events as callbacks:\n * ...\n * var hot1 = new Handsontable(document.getElementById('example1'), {\n *   afterChange: function(changes, source) {\n *     $.ajax({\n *       url: \"save.php',\n *       data: change\n *     });\n *   }\n * });\n * ...\n * ```\n *\n * ```js\n * // Using events as plugin hooks:\n * ...\n * var hot1 = new Handsontable(document.getElementById('example1'), {\n *   myPlugin: true\n * });\n *\n * var hot2 = new Handsontable(document.getElementById('example2'), {\n *   myPlugin: false\n * });\n *\n * // global hook\n * Handsontable.hooks.add('afterChange', function() {\n *   // Fired twice - for hot1 and hot2\n *   if (this.getSettings().myPlugin) {\n *     // function body - will only run for hot1\n *   }\n * });\n *\n * // local hook (has same effect as a callback)\n * hot2.addHook('afterChange', function() {\n *   // function body - will only run in #example2\n * });\n * ```\n * ...\n */\n\n// @TODO: Move plugin description hooks to plugin?\nvar REGISTERED_HOOKS = [\n/**\n * Callback fired after resetting a cell's meta.\n *\n * @event Hooks#afterCellMetaReset\n * @since 0.11\n */\n'afterCellMetaReset',\n\n/**\n * @description\n * Callback fired after one or more cells has been changed. Its main use case is to save the input.\n *\n * __Note:__ For performance reasons, the `changes` array is null for `\"loadData\"` source.\n *\n * @event Hooks#afterChange\n * @param {Array} changes 2D array containing information about each of the edited cells `[[row, prop, oldVal, newVal], ...]`.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterChange',\n\n/**\n * @description\n * Fired after observing changes.\n *\n * @event Hooks#afterChangesObserved\n */\n'afterChangesObserved',\n\n/**\n * @description\n * Fired after setting up the Context Menu's default options. These options are a collection which user can select by setting\n * an array of keys or an array of objects in `contextMenu` option.\n *\n * @event Hooks#afterContextMenuDefaultOptions\n * @param {Array} predefinedItems Array of objects containing information about the pre-defined Context Menu items.\n */\n'afterContextMenuDefaultOptions',\n\n/**\n * @description\n * Fired before setting up the Context Menu's items but after filtering these options by user (`contextMenu` option). This hook\n * can by helpful to determine if user use specified menu item or to set up one of the menu item to by always visible.\n *\n * @event Hooks#beforeContextMenuSetItems\n * @param {Array} menuItems Array of objects containing information about to generated Context Menu items.\n */\n'beforeContextMenuSetItems',\n\n/**\n * @description\n * Fired after setting up the Context Menu's default options. These options are a collection which user can select by setting\n * an array of keys or an array of objects in `contextMenu` option.\n *\n * @pro\n * @event Hooks#afterDropdownMenuDefaultOptions\n * @param {Array} predefinedItems Array of objects containing information about the pre-defined Context Menu items.\n */\n'afterDropdownMenuDefaultOptions',\n\n/**\n * @description\n * Fired before setting up the Dropdown Menu's items but after filtering these options by user (`dropdownMenu` option). This hook\n * can by helpful to determine if user use specified menu item or to set up one of the menu item to by always visible.\n *\n * @pro\n * @event Hooks#beforeDropdownMenuSetItems\n * @param {Array} menuItems Array of objects containing information about to generated Dropdown Menu items.\n */\n'beforeDropdownMenuSetItems',\n\n/**\n * @description\n * Fired after hiding the Context Menu.\n *\n * @event Hooks#afterContextMenuHide\n * @param {Object} context The Context menu instance.\n */\n'afterContextMenuHide',\n\n/**\n * @description\n * Fired before opening the Context Menu.\n *\n * @event Hooks#beforeContextMenuShow\n * @param {Object} context The Context Menu instance.\n */\n'beforeContextMenuShow',\n\n/**\n * @description\n * Fired after opening the Context Menu.\n *\n * @event Hooks#afterContextMenuShow\n * @param {Object} context The Context Menu instance.\n */\n'afterContextMenuShow',\n\n/**\n * @description\n * Fired after reaching the copy limit while copying data.\n *\n * @event Hooks#afterCopyLimit\n * @param {Number} selectedRows Count of selected copyable rows.\n * @param {Number} selectedColumns Count of selected copyable columns.\n * @param {Number} copyRowsLimit Current copy rows limit.\n * @param {Number} copyColumnsLimit Current copy columns limit.\n */\n'afterCopyLimit',\n\n/**\n * Callback is fired before a new column was created.\n *\n * @since 0.28.0\n * @event Hooks#beforeCreateCol\n * @param {Number} index Represents the visual index of first newly created column in the data source array.\n * @param {Number} amount Number of newly created columns in the data source array.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'beforeCreateCol',\n\n/**\n * Callback is fired after a new column was created.\n *\n * @event Hooks#afterCreateCol\n * @param {Number} index Represents the visual index of first newly created column in the data source array.\n * @param {Number} amount Number of newly created columns in the data source array.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterCreateCol',\n\n/**\n * Callback is fired before a new row was created.\n *\n * @since 0.28.0\n * @event Hooks#beforeCreateRow\n * @param {Number} index Represents the visual index of first newly created row in the data source array.\n * @param {Number} amount Number of newly created rows in the data source array.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'beforeCreateRow',\n\n/**\n * Callback is fired after a new row was created.\n *\n * @event Hooks#afterCreateRow\n * @param {Number} index Represents the visual index of first newly created row in the data source array.\n * @param {Number} amount Number of newly created rows in the data source array.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterCreateRow',\n\n/**\n * Fired after the current cell is deselected.\n *\n * @event Hooks#afterDeselect\n */\n'afterDeselect',\n\n/**\n * Fired after destroying the Handsontable instance.\n *\n * @event Hooks#afterDestroy\n */\n'afterDestroy',\n\n/**\n * Fired on a `keydown` event on the document body.\n *\n * @event Hooks#afterDocumentKeyDown\n * @param {Event} event A `keydown` event.\n */\n'afterDocumentKeyDown',\n\n/**\n * Fired inside the Walkontable's selection `draw` method. Can be used to add additional class names to cells, depending on the current selection.\n *\n * @event Hooks#afterDrawSelection\n * @param {Number} currentRow Row index of the currently processed cell.\n * @param {Number} currentColumn Column index of the currently cell.\n * @param {Array} cornersOfSelection Array of the current selection in a form of `[startRow, startColumn, endRow, endColumn]`.\n * @param {Number|undefined} layerLevel Number indicating which layer of selection is currently processed.\n * @since 0.38.1\n * @returns {String|undefined} Can return a `String`, which will act as an additional `className` to be added to the currently processed cell.\n */\n'afterDrawSelection',\n/**\n * Fired inside the Walkontable's `refreshSelections` method. Can be used to remove additional class names from all cells in the table.\n *\n * @event Hooks#beforeRemoveCellClassNames\n * @since 0.38.1\n * @returns {String[]|undefined} Can return an `Array` of `String`s. Each of these strings will act like class names to be removed from all the cells in the table.\n */\n'beforeRemoveCellClassNames',\n/**\n * Callback fired after getting the cell settings.\n *\n * @event Hooks#afterGetCellMeta\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {Object} cellProperties Object containing the cell properties.\n */\n'afterGetCellMeta',\n\n/**\n * Callback fired after retrieving information about a column header and appending it to the table header.\n *\n * @event Hooks#afterGetColHeader\n * @param {Number} col Visual column index.\n * @param {Element} TH Header's TH element.\n */\n'afterGetColHeader',\n\n/**\n * Callback fired after retrieving information about a column header and appending it to the table header.\n *\n * @event Hooks#afterGetRowHeader\n * @param {Number} row Visual row index.\n * @param {Element} TH Header's TH element.\n */\n'afterGetRowHeader',\n\n/**\n * Callback fired after Handsontable instance is initiated.\n *\n * @event Hooks#afterInit\n */\n'afterInit',\n\n/**\n * Callback fired after new data is loaded (by `loadData` method) into the data source array.\n *\n * @event Hooks#afterLoadData\n * @param {Boolean} firstTime flag that determines whether the data has been loaded during the initialization.\n */\n'afterLoadData',\n\n/**\n * Fired after a scroll event, which is identified as a momentum scroll (e.g. on an iPad).\n *\n * @event Hooks#afterMomentumScroll\n */\n'afterMomentumScroll',\n\n/**\n * Fired after a `mousedown` event is triggered on the cell corner (the drag handle).\n *\n * @event Hooks#afterOnCellCornerMouseDown\n * @since 0.11\n * @param {Object} event `mousedown` event object.\n */\n'afterOnCellCornerMouseDown',\n\n/**\n * Fired after a `dblclick` event is triggered on the cell corner (the drag handle).\n *\n * @event Hooks#afterOnCellCornerDblClick\n * @since 0.30.0\n * @param {Object} event `dblclick` event object.\n */\n'afterOnCellCornerDblClick',\n\n/**\n * Callback fired after clicking on a cell or row/column header.\n * In case the row/column header was clicked, the index is negative.\n * For example clicking on the row header of cell (0, 0) results with `afterOnCellMouseDown` called\n * with coords `{row: 0, col: -1}`.\n *\n * @event Hooks#afterOnCellMouseDown\n * @since 0.11\n * @param {Object} event `mousedown` event object.\n * @param {Object} coords Coordinates object containing the visual row and visual column indexes of the clicked cell.\n * @param {Element} TD Cell's TD (or TH) element.\n */\n'afterOnCellMouseDown',\n\n/**\n * Callback fired after hovering a cell or row/column header with the mouse cursor.\n * In case the row/column header was hovered, the index is negative.\n * For example, hovering over the row header of cell (0, 0) results with `afterOnCellMouseOver` called\n * with coords `{row: 0, col: -1}`.\n *\n * @event Hooks#afterOnCellMouseOver\n * @since 0.11\n * @param {Object} event `mouseover` event object.\n * @param {Object} coords Hovered cell's visual coordinate object.\n * @param {Element} TD Cell's TD (or TH) element.\n */\n'afterOnCellMouseOver',\n\n/**\n * Callback fired after leaving a cell or row/column header with the mouse cursor.\n *\n * @event Hooks#afterOnCellMouseOut\n * @since 0.31.1\n * @param {Object} event `mouseout` event object.\n * @param {Object} coords Leaved cell's visual coordinate object.\n * @param {Element} TD Cell's TD (or TH) element.\n */\n'afterOnCellMouseOut',\n\n/**\n * Callback is fired when one or more columns are removed.\n *\n * @event Hooks#afterRemoveCol\n * @param {Number} index Is an visual index of starter column.\n * @param {Number} amount Is an amount of removed columns.\n */\n'afterRemoveCol',\n\n/**\n * Callback is fired when one or more rows are removed.\n *\n * @event Hooks#afterRemoveRow\n * @param {Number} index Is an visual index of starter row.\n * @param {Number} amount Is an amount of removed rows.\n */\n'afterRemoveRow',\n\n/**\n * Callback fired after the Handsontable table is rendered.\n *\n * @event Hooks#afterRender\n * @param {Boolean} isForced Is `true` if rendering was triggered by a change of settings or data; or `false` if\n *                           rendering was triggered by scrolling or moving selection.\n */\n'afterRender',\n\n/**\n * Fired before starting rendering the cell.\n *\n * @event Hooks#beforeRenderer\n * @since 0.24.2\n * @param {Element} TD Currently rendered cell's TD element.\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String|Number} prop Column property name or a column index, if datasource is an array of arrays.\n * @param {String} value Value of the rendered cell.\n * @param {Object} cellProperties Object containing the cell's properties.\n */\n'beforeRenderer',\n\n/**\n * Fired after finishing rendering the cell (after the renderer finishes).\n *\n * @event Hooks#afterRenderer\n * @since 0.11.0\n * @param {Element} TD Currently rendered cell's TD element.\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String|Number} prop Column property name or a column index, if datasource is an array of arrays.\n * @param {String} value Value of the rendered cell.\n * @param {Object} cellProperties Object containing the cell's properties.\n */\n'afterRenderer',\n\n/**\n * Fired after the horizontal scroll event.\n *\n * @event Hooks#afterScrollHorizontally\n * @since 0.11\n */\n'afterScrollHorizontally',\n\n/**\n * Fired after the vertical scroll event.\n *\n * @event Hooks#afterScrollVertically\n * @since 0.11\n */\n'afterScrollVertically',\n\n/**\n * Callback fired after one or more cells are selected (e.g. during mouse move).\n *\n * @event Hooks#afterSelection\n * @param {Number} r Selection start visual row index.\n * @param {Number} c Selection start visual column index.\n * @param {Number} r2 Selection end visual row index.\n * @param {Number} c2 Selection end visual column index.\n * @param {Object} preventScrolling Object with `value` property where its value change will be observed.\n * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n * @example\n * ```js\n * handsontable({\n *   afterSelection: function (r, c, r2, c2, preventScrolling, selectionLayerLevel) {\n *     // setting if prevent scrolling after selection\n *     preventScrolling.value = true;\n *   }\n * })\n * ```\n */\n'afterSelection',\n\n/**\n * Callback fired after one or more cells are selected. The `p` argument represents the source object property name instead of the column number.\n *\n * @event Hooks#afterSelectionByProp\n * @param {Number} r Selection start visual row index.\n * @param {String} p Selection start data source object property name.\n * @param {Number} r2 Selection end visual row index.\n * @param {String} p2 Selection end data source object property name.\n * @param {Object} preventScrolling Object with `value` property where its value change will be observed.\n * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n * @example\n * ```js\n * handsontable({\n *   afterSelectionByProp: function (r, c, r2, c2, preventScrolling, selectionLayerLevel) {\n *     // setting if prevent scrolling after selection\n *     preventScrolling.value = true;\n *   }\n * })\n * ```\n */\n'afterSelectionByProp',\n\n/**\n * Callback fired after one or more cells are selected (e.g. on mouse up).\n *\n * @event Hooks#afterSelectionEnd\n * @param {Number} r Selection start visual row index.\n * @param {Number} c Selection start visual column index.\n * @param {Number} r2 Selection end visual row index.\n * @param {Number} c2 Selection end visual column index.\n * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n */\n'afterSelectionEnd',\n\n/**\n * Callback fired after one or more cells are selected (e.g. on mouse up). The `p` argument represents the data source object\n * property name instead of the column number.\n *\n * @event Hooks#afterSelectionEndByProp\n * @param {Number} r Selection start visual row index.\n * @param {String} p Selection start data source object property index.\n * @param {Number} r2 Selection end visual row index.\n * @param {String} p2 Selection end data source object property index.\n * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n */\n'afterSelectionEndByProp',\n\n/**\n * Called after cell meta is changed.\n *\n * @event Hooks#afterSetCellMeta\n * @since 0.11.0\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String} key The updated meta key.\n * @param {*} value The updated meta value.\n */\n'afterSetCellMeta',\n\n/**\n * Called after cell meta is removed.\n *\n * @event Hooks#afterRemoveCellMeta\n * @since 0.33.1\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String} key The removed meta key.\n * @param {*} value Value which was under removed key of cell meta.\n */\n'afterRemoveCellMeta',\n\n/**\n * Called after cell data was changed.\n *\n * @event Hooks#afterSetDataAtCell\n * @since 0.28.0\n * @param {Array} changes An array of changes in format `[[row, col, oldValue, value], ...]`.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterSetDataAtCell',\n\n/**\n * Called after cell data was changed.\n *\n * @event Hooks#afterSetDataAtRowProp\n * @since 0.28.0\n * @param {Array} changes An array of changes in format `[[row, prop, oldValue, value], ...]`.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterSetDataAtRowProp',\n\n/**\n * Fired after calling the `updateSettings` method.\n *\n * @event Hooks#afterUpdateSettings\n * @param {Object} settings New settings object.\n */\n'afterUpdateSettings',\n\n/**\n * @description\n * A plugin hook executed after validator function, only if validator function is defined.\n * Validation result is the first parameter. This can be used to determinate if validation passed successfully or not.\n *\n * __Returning false from the callback will mark the cell as invalid.__\n *\n * @event Hooks#afterValidate\n * @since 0.9.5\n * @param {Boolean} isValid `true` if valid, `false` if not.\n * @param {*} value The value in question.\n * @param {Number} row Row index.\n * @param {String|Number} prop Property name / column index.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterValidate',\n\n/**\n * Fired before successful change of language (when proper language code was set)\n *\n * @event Hooks#beforeLanguageChange\n * @since 0.35.0\n * @param {String} languageCode New language code.\n */\n'beforeLanguageChange',\n\n/**\n * Fired after successful change of language (when proper language code was set)\n *\n * @event Hooks#afterLanguageChange\n * @since 0.35.0\n * @param {String} languageCode New language code.\n */\n'afterLanguageChange',\n\n/**\n * Fired before populating the data in the autofill feature.\n *\n * @event Hooks#beforeAutofill\n * @param {Object} start Object containing information about first filled cell: `{row: 2, col: 0}`.\n * @param {Object} end Object containing information about last filled cell: `{row: 4, col: 1}`.\n * @param {Array} data 2D array containing information about fill pattern: `[[\"1\", \"Ted\"], [\"1\", \"John\"]]`.\n * @param {Array} baseRange The coordinates of the base area for autofill.\n */\n'beforeAutofill',\n\n/**\n * Fired before aligning the cell contents.\n *\n * @event Hooks#beforeCellAlignment\n * @param stateBefore\n * @param range\n * @param {String} type Type of the alignment - either `horizontal` or `vertical`\n * @param {String} alignmentClass String defining the alignment class added to the cell.\n * Possible values:\n * * `htLeft`,\n * * `htCenter`,\n * * `htRight`,\n * * `htJustify`\n * for horizontal alignment,\n *\n *\n * * `htTop`,\n * * `htMiddle`,\n * * `htBottom`\n * for vertical alignment.\n */\n'beforeCellAlignment',\n\n/**\n * Callback fired before one or more cells is changed. Its main purpose is to alter changes silently before input.\n *\n * @event Hooks#beforeChange\n * @param {Array} changes 2D array containing information about each of the edited cells.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n * @example\n * ```js\n * // To disregard a single change, set changes[i] to null or remove it from array using changes.splice(i, 1).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeChange: function(changes, source) {\n *     // [[row, prop, oldVal, newVal], ...]\n *     changes[0] = null;\n *   }\n * });\n * ...\n *\n * // To alter a single change, overwrite the desired value to changes[i][3].\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeChange: function(changes, source) {\n *     // [[row, prop, oldVal, newVal], ...]\n *     changes[0][3] = 10;\n *   }\n * });\n * ...\n *\n * // To cancel all edit, return false from the callback or set array length to 0 (changes.length = 0).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeChange: function(changes, source) {\n *     // [[row, prop, oldVal, newVal], ...]\n *     return false;\n *   }\n * });\n * ...\n * ```\n */\n'beforeChange',\n\n/**\n * Fired right before rendering the changes.\n *\n * @event Hooks#beforeChangeRender\n * @since 0.11\n * @param {Array} changes Array in form of [row, prop, oldValue, newValue].\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'beforeChangeRender',\n\n/**\n * Fired before drawing the borders.\n *\n * @event Hooks#beforeDrawBorders\n * @param {Array} corners Array specifying the current selection borders.\n * @param {String} borderClassName Specifies the border class name.\n */\n'beforeDrawBorders',\n\n/**\n * Callback fired before getting cell settings.\n *\n * @event Hooks#beforeGetCellMeta\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {Object} cellProperties Object containing the cell's properties.\n */\n'beforeGetCellMeta',\n\n/**\n * Called before cell meta is removed.\n *\n * @event Hooks#beforeRemoveCellMeta\n * @since 0.33.1\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String} key The removed meta key.\n * @param {*} value Value which is under removed key of cell meta.\n */\n'beforeRemoveCellMeta',\n\n/**\n * @description\n * Callback fired before Handsontable instance is initiated.\n *\n * @event Hooks#beforeInit\n */\n'beforeInit',\n\n/**\n * Callback fired before Walkontable instance is initiated.\n *\n * @since 0.11\n * @event Hooks#beforeInitWalkontable\n * @param {Object} walkontableConfig Walkontable configuration object.\n */\n'beforeInitWalkontable',\n\n/**\n * Callback fired before keydown event is handled. It can be used to overwrite default key bindings.\n * Caution - in your `beforeKeyDown` handler you need to call `event.stopImmediatePropagation()` to prevent default key behavior.\n *\n * @event Hooks#beforeKeyDown\n * @since 0.9.0\n * @param {Event} event Original DOM event.\n */\n'beforeKeyDown',\n\n/**\n * Fired after the user clicked a cell, but before all the calculations related with it.\n *\n * @event Hooks#beforeOnCellMouseDown\n * @param {Event} event The `mousedown` event object.\n * @param {CellCoords} coords Cell coords object containing the visual coordinates of the clicked cell.\n * @param {Element} TD TD element.\n */\n'beforeOnCellMouseDown',\n\n/**\n * Fired after the user moved cursor over a cell, but before all the calculations related with it.\n *\n * @event Hooks#beforeOnCellMouseOver\n * @param {Event} event The `mouseover` event object.\n * @param {CellCoords} coords CellCoords object containing the visual coordinates of the clicked cell.\n * @param {Element} TD TD element.\n * @param {Object} blockCalculations Contain keys 'row' and 'column' with boolean value.\n */\n'beforeOnCellMouseOver',\n\n/**\n * Fired after the user moved cursor out from a cell, but before all the calculations related with it.\n *\n * @event Hooks#beforeOnCellMouseOut\n * @since 0.31.1\n * @param {Event} event The `mouseout` event object.\n * @param {WalkontableCellCoords} coords WalkontableCellCoords object containing the visual coordinates of the leaved cell.\n * @param {Element} TD TD element.\n */\n'beforeOnCellMouseOut',\n\n/**\n * Callback is fired when one or more columns are about to be removed.\n *\n * @event Hooks#beforeRemoveCol\n * @param {Number} index Visual index of starter column.\n * @param {Number} amount Amount of columns to be removed.\n * @param {Array} [visualCols] Consists of visual indexes of processed columns.\n */\n'beforeRemoveCol',\n\n/**\n * Callback is fired when one or more rows are about to be removed.\n *\n * @event Hooks#beforeRemoveRow\n * @param {Number} index Visual index of starter column.\n * @param {Number} amount Amount of columns to be removed.\n * @param {Array} [visualRows] Consists of visual indexes of processed rows.\n */\n'beforeRemoveRow',\n\n/**\n * Callback fired before Handsontable table is rendered.\n *\n * @event Hooks#beforeRender\n * @param {Boolean} isForced If `true` rendering was triggered by a change of settings or data; or `false` if\n *                           rendering was triggered by scrolling or moving selection.\n */\n'beforeRender',\n\n/**\n * Callback fired before setting range is started but not finished yet.\n *\n * @event Hooks#beforeSetRangeStartOnly\n * @param {CellCoords} coords CellCoords instance.\n */\n'beforeSetRangeStartOnly',\n\n/**\n * Callback fired before setting range is started.\n *\n * @event Hooks#beforeSetRangeStart\n * @param {CellCoords} coords CellCoords instance.\n */\n'beforeSetRangeStart',\n\n/**\n * Callback fired before setting range is ended.\n *\n * @event Hooks#beforeSetRangeEnd\n * @param {CellCoords} coords CellCoords instance.\n */\n'beforeSetRangeEnd',\n\n/**\n * Fired before the logic of handling a touch scroll, when user started scrolling on a touch-enabled device.\n *\n * @event Hooks#beforeTouchScroll\n */\n'beforeTouchScroll',\n\n/**\n * @description\n * A plugin hook executed before validator function, only if validator function is defined.\n * This can be used to manipulate the value of changed cell before it is applied to the validator function.\n *\n * __Notice:__ this will not affect values of changes. This will change value ONLY for validation!\n *\n * @event Hooks#beforeValidate\n * @since 0.9.5\n * @param {*} value Value of the cell.\n * @param {Number} row Row index.\n * @param {String|Number} prop Property name / column index.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'beforeValidate',\n\n/**\n * Callback fired before cell value is rendered into the DOM (through renderer function).\n *\n * @event Hooks#beforeValueRender\n * @since 0.29.0\n * @param {*} value Cell value to render.\n */\n'beforeValueRender',\n\n/**\n * Callback fired after Handsontable instance is constructed (via `new` operator).\n *\n * @event Hooks#construct\n * @since 0.16.1\n */\n'construct',\n\n/**\n * Callback fired after Handsontable instance is initiated but before table is rendered.\n *\n * @event Hooks#init\n * @since 0.16.1\n */\n'init',\n\n/**\n * Fired when a column index is about to be modified by a callback function.\n *\n * @event Hooks#modifyCol\n * @since 0.11\n * @param {Number} col Visual column index.\n */\n'modifyCol',\n\n/**\n * Fired when a column index is about to be de-modified by a callback function.\n *\n * @event Hooks#unmodifyCol\n * @since 0.23.0\n * @param {Number} col Physical column index.\n */\n'unmodifyCol',\n\n/**\n * Fired when a physical row index is about to be de-modified by a callback function.\n *\n * @event Hooks#unmodifyRow\n * @since 0.26.2\n * @param {Number} row Physical row index.\n */\n'unmodifyRow',\n/**\n * Fired when a column header index is about to be modified by a callback function.\n *\n * @event Hooks#modifyColHeader\n * @since 0.20.0\n * @param {Number} column Visual column header index.\n */\n'modifyColHeader',\n\n/**\n * Fired when a column width is about to be modified by a callback function.\n *\n * @event Hooks#modifyColWidth\n * @since 0.11\n * @param {Number} width Current column width.\n * @param {Number} col Column index.\n */\n'modifyColWidth',\n\n/**\n * Fired when a row index is about to be modified by a callback function.\n *\n * @event Hooks#modifyRow\n * @since 0.11\n * @param {Number} row Row index.\n */\n'modifyRow',\n\n/**\n * Fired when a row header index is about to be modified by a callback function.\n *\n * @event Hooks#modifyRowHeader\n * @since 0.20.0\n * @param {Number} row Row header index.\n */\n'modifyRowHeader',\n\n/**\n * Fired when a row height is about to be modified by a callback function.\n *\n * @event Hooks#modifyRowHeight\n * @since 0.11.0\n * @param {Number} height Row height.\n * @param {Number} row Row index.\n */\n'modifyRowHeight',\n\n/**\n * Fired when a data was retrieved or modified.\n *\n * @event Hooks#modifyData\n * @since 0.28.0\n * @param {Number} row Row height.\n * @param {Number} column Column index.\n * @param {Object} valueHolder Object which contains original value which can be modified by overwriting `.value` property.\n * @param {String} ioMode String which indicates for what operation hook is fired (`get` or `set`).\n */\n'modifyData',\n\n/**\n * Fired when a data was retrieved or modified.\n *\n * @event Hooks#modifyRowData\n * @since 0.28.0\n * @param {Number} row Physical row index.\n */\n'modifyRowData',\n\n/**\n * Used to modify the cell coordinates when using the `getCell` method.\n *\n * @event Hooks#modifyGetCellCoords\n * @since 0.36.0\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {Boolean} topmost If set to true, it returns the TD element from the topmost overlay. For example,\n * if the wanted cell is in the range of fixed rows, it will return a TD element from the `top` overlay.\n */\n'modifyGetCellCoords',\n\n/**\n * Fired after loading data using the Persistent State plugin.\n *\n * @event Hooks#persistentStateLoad\n * @param {String} key Key string.\n * @param {Object} valuePlaceholder Object containing the loaded data.\n */\n'persistentStateLoad',\n\n/**\n * Fired after resetting data using the Persistent State plugin.\n *\n * @event Hooks#persistentStateReset\n * @param {String} key Key string.\n */\n'persistentStateReset',\n\n/**\n * Fired after resetting data using the Persistent State plugin.\n *\n * @event Hooks#persistentStateSave\n * @param {String} key Key string.\n * @param {Mixed} value Value to save.\n */\n'persistentStateSave',\n\n/**\n * Fired before sorting the column. If you return `false` value then sorting will be not applied by\n * Handsontable (useful for server-side sorting).\n *\n * @event Hooks#beforeColumnSort\n * @param {Number} column Sorted visual column index.\n * @param {Boolean} order Soring order where:\n *  * `true` means ascending order,\n *  * `false` means descending order,\n *  * `undefined` means original order.\n */\n'beforeColumnSort',\n\n/**\n * Fired after sorting the column.\n *\n * @event Hooks#afterColumnSort\n * @param {Number} column Sorted visual column index.\n * @param {Boolean} order Soring order where:\n *  * `true` means ascending order\n *  * `false` means descending order\n *  * `undefined` means original order\n */\n'afterColumnSort',\n\n/**\n * @description\n * Fired after setting range of autofill.\n * Both arguments are provided in the following format:\n * ```js\n * [startRow, startColumn, endRow, endColumn]\n * ```\n *\n * @event Hooks#modifyAutofillRange\n * @param {Array} startArea Array of visual coordinates of the starting point for the drag-down operation.\n * @param {Array} entireArea Array of visual coordinates of the entire area of the drag-down operation.\n */\n'modifyAutofillRange',\n\n/**\n * Fired to allow modifying the copyable range with a callback function.\n *\n * @since 0.19.0\n * @event Hooks#modifyCopyableRange\n * @param {Array} copyableRanges Array of objects defining copyable cells.\n */\n'modifyCopyableRange',\n\n/**\n * Called before copying the values into clipboard and before clearing values of the selected cells.\n *\n * @event Hooks#beforeCut\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains data to cut.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       which will be cut out.\n * @returns {*} If returns `false` then operation of the cutting out is cancelled.\n *\n * @example\n * ```js\n * // To disregard a single row, remove it from array using data.splice(i, 1).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeCut: function(data, coords) {\n *     // data -> [[1, 2, 3], [4, 5, 6]]\n *     data.splice(0, 1);\n *     // data -> [[4, 5, 6]]\n *     // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n *   }\n * });\n * ...\n *\n * // To cancel cutting out, return false from the callback.\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeCut: function(data, coords) {\n *     return false;\n *   }\n * });\n * ...\n * ```\n */\n'beforeCut',\n\n/**\n * Fired after data are cutted out from the table.\n *\n * @event Hooks#afterCut\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains the cutted out data.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       which was cut out.\n */\n'afterCut',\n\n/**\n * Fired before values are copied into clipboard.\n *\n * @event Hooks#beforeCopy\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains data to copied.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       which will copied.\n * @returns {*} If returns `false` then copying is cancelled.\n *\n * @example\n * ```js\n * // To disregard a single row, remove it from array using data.splice(i, 1).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeCopy: function(data, coords) {\n *     // data -> [[1, 2, 3], [4, 5, 6]]\n *     data.splice(0, 1);\n *     // data -> [[4, 5, 6]]\n *     // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n *   }\n * });\n * ...\n *\n * // To cancel copying, return false from the callback.\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeCopy: function(data, coords) {\n *     return false;\n *   }\n * });\n * ...\n * ```\n */\n'beforeCopy',\n\n/**\n * Fired after data are pasted into table.\n *\n * @event Hooks#afterCopy\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains the copied data.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       which was copied.\n */\n'afterCopy',\n\n/**\n * Fired before values are pasted into table.\n *\n * @event Hooks#beforePaste\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains data to paste.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       that correspond to the previously selected area.\n * @returns {*} If returns `false` then pasting is cancelled.\n *\n * @example\n * ```js\n * // To disregard a single row, remove it from array using data.splice(i, 1).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforePaste: function(data, coords) {\n *     // data -> [[1, 2, 3], [4, 5, 6]]\n *     data.splice(0, 1);\n *     // data -> [[4, 5, 6]]\n *     // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n *   }\n * });\n * ...\n *\n * // To cancel pasting, return false from the callback.\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforePaste: function(data, coords) {\n *     return false;\n *   }\n * });\n * ...\n * ```\n */\n'beforePaste',\n\n/**\n * Fired after values are pasted into table.\n *\n * @event Hooks#afterPaste\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains the pasted data.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       that correspond to the previously selected area.\n */\n'afterPaste',\n\n/**\n * Fired before change order of the visual indexes.\n *\n * @event Hooks#beforeColumnMove\n * @param {Array} columns Array of visual column indexes to be moved.\n * @param {Number} target Visual column index being a target for moved columns.\n */\n'beforeColumnMove',\n\n/**\n * Fired after change order of the visual indexes.\n *\n * @event Hooks#afterColumnMove\n * @param {Array} columns Array of visual column indexes that were moved.\n * @param {Number} target Visual column index being a target for moved columns.\n */\n'afterColumnMove',\n\n/**\n * Fired before change order of the visual indexes.\n *\n * @event Hooks#beforeRowMove\n * @param {Array} rows Array of visual row indexes to be moved.\n * @param {Number} target Visual row index being a target for moved rows.\n */\n'beforeRowMove',\n\n/**\n * Fired after change order of the visual indexes.\n *\n * @event Hooks#afterRowMove\n * @param {Array} rows Array of visual row indexes that were moved.\n * @param {Number} target Visual row index being a target for moved rows.\n */\n'afterRowMove',\n\n/**\n * Fired before rendering the table with modified column sizes.\n *\n * @event Hooks#beforeColumnResize\n * @param {Number} currentColumn Visual index of the resized column.\n * @param {Number} newSize Calculated new column width.\n * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n * @returns {Number} Returns a new column size or `undefined`, if column size should be calculated automatically.\n */\n'beforeColumnResize',\n\n/**\n * Fired after rendering the table with modified column sizes.\n *\n * @event Hooks#afterColumnResize\n * @param {Number} currentColumn Visual index of the resized column.\n * @param {Number} newSize Calculated new column width.\n * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n */\n'afterColumnResize',\n\n/**\n * Fired before rendering the table with modified row sizes.\n *\n * @event Hooks#beforeRowResize\n * @param {Number} currentRow Visual index of the resized row.\n * @param {Number} newSize Calculated new row height.\n * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n * @returns {Number} Returns the new row size or `undefined` if row size should be calculated automatically.\n */\n'beforeRowResize',\n\n/**\n * Fired after rendering the table with modified row sizes.\n *\n * @event Hooks#afterRowResize\n * @param {Number} currentRow Visual index of the resized row.\n * @param {Number} newSize Calculated new row height.\n * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n */\n'afterRowResize',\n\n/**\n * Fired after getting the column header renderers.\n *\n * @event Hooks#afterGetColumnHeaderRenderers\n * @param {Array} array Array of the column header renderers.\n */\n'afterGetColumnHeaderRenderers',\n\n/**\n * Fired after getting the row header renderers.\n *\n * @event Hooks#afterGetRowHeaderRenderers\n * @param {Array} array Array of the row header renderers.\n */\n'afterGetRowHeaderRenderers',\n\n/**\n * Fired before applying stretched column width to column.\n *\n * @event Hooks#beforeStretchingColumnWidth\n * @param {Number} stretchedWidth Calculated width.\n * @param {Number} column Visual column index.\n * @returns {Number} Returns new width which will be applied to the column element.\n */\n'beforeStretchingColumnWidth',\n\n/**\n * Fired before applying [filtering]{@link http://docs.handsontable.com/pro/demo-filtering.html}.\n *\n * @pro\n * @event Hooks#beforeFilter\n * @param {Array} conditionsStack An array of objects with added formulas.\n * @returns {Boolean} If hook returns `false` value then filtering won't be applied on the UI side (server-side filtering).\n */\n'beforeFilter',\n\n/**\n * Fired after applying [filtering]{@link http://docs.handsontable.com/pro/demo-filtering.html}.\n *\n * @pro\n * @event Hooks#afterFilter\n * @param {Array} conditionsStack An array of objects with added formulas.\n */\n'afterFilter',\n\n/**\n * Used to modify the column header height.\n *\n * @event Hooks#modifyColumnHeaderHeight\n * @since 0.25.0\n * @param {Number} col Visual column index.\n */\n'modifyColumnHeaderHeight',\n\n/**\n * Fired before the undo action. Contains information about the action that is being undone.\n *\n * @event Hooks#beforeUndo\n * @since 0.26.2\n * @param {Object} action The action object. Contains information about the action being undone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n */\n'beforeUndo',\n\n/**\n * Fired after the undo action. Contains information about the action that is being undone.\n *\n * @event Hooks#afterUndo\n * @since 0.26.2\n * @param {Object} action The action object. Contains information about the action being undone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n */\n'afterUndo',\n\n/**\n * Fired before the redo action. Contains information about the action that is being redone.\n *\n * @event Hooks#beforeRedo\n * @since 0.26.2\n * @param {Object} action The action object. Contains information about the action being redone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n */\n'beforeRedo',\n\n/**\n * Fired after the redo action. Contains information about the action that is being redone.\n *\n * @event Hooks#afterRedo\n * @since 0.26.2\n * @param {Object} action The action object. Contains information about the action being redone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n */\n'afterRedo',\n\n/**\n * Used to modify the row header width.\n *\n * @event Hooks#modifyRowHeaderWidth\n * @param {Number} rowHeaderWidth Row header width.\n */\n'modifyRowHeaderWidth',\n\n/**\n * Fired from the `populateFromArray` method during the `autofill` process. Fired for each \"autofilled\" cell individually.\n *\n * @event Hooks#beforeAutofillInsidePopulate\n * @param {Object} index Object containing `row` and `col` properties, defining the number of rows/columns from the initial cell of the autofill.\n * @param {String} direction Declares the direction of the autofill. Possible values: `up`, `down`, `left`, `right`.\n * @param {Array} input Array of arrays. Contains an array of rows with data being used in the autofill.\n * @param {Array} deltas The deltas array passed to the `populateFromArray` method.\n */\n'beforeAutofillInsidePopulate',\n\n/**\n * Fired when the start of the selection is being modified. (e.g. moving the selection with the arrow keys).\n *\n * @event Hooks#modifyTransformStart\n * @param {CellCoords} delta Cell coords object declaring the delta of the new selection relative to the previous one.\n */\n'modifyTransformStart',\n\n/**\n * Fired when the end of the selection is being modified. (e.g. moving the selection with the arrow keys).\n *\n * @event Hooks#modifyTransformEnd\n * @param {CellCoords} delta Cell coords object declaring the delta of the new selection relative to the previous one.\n */\n'modifyTransformEnd',\n\n/**\n * Fired after the start of the selection is being modified. (e.g. moving the selection with the arrow keys).\n *\n * @event Hooks#afterModifyTransformStart\n * @param {CellCoords} coords Coords of the freshly selected cell.\n * @param {Number} rowTransformDir `-1` if trying to select a cell with a negative row index. `0` otherwise.\n * @param {Number} colTransformDir `-1` if trying to select a cell with a negative column index. `0` otherwise.\n */\n'afterModifyTransformStart',\n\n/**\n * Fired after the end of the selection is being modified. (e.g. moving the selection with the arrow keys).\n *\n * @event Hooks#afterModifyTransformEnd\n * @param {CellCoords} coords Visual coords of the freshly selected cell.\n * @param {Number} rowTransformDir `-1` if trying to select a cell with a negative row index. `0` otherwise.\n * @param {Number} colTransformDir `-1` if trying to select a cell with a negative column index. `0` otherwise.\n */\n'afterModifyTransformEnd',\n\n/**\n * Fired inside the `viewportRowCalculatorOverride` method. Allows modifying the row calculator parameters.\n *\n * @event Hooks#afterViewportRowCalculatorOverride\n * @param {Object} calc The row calculator.\n */\n'afterViewportRowCalculatorOverride',\n\n/**\n * Fired inside the `viewportColumnCalculatorOverride` method. Allows modifying the row calculator parameters.\n *\n * @event Hooks#afterViewportColumnCalculatorOverride\n * @param {Object} calc The row calculator.\n */\n'afterViewportColumnCalculatorOverride',\n\n/**\n * Fired after initializing all the plugins.\n *\n * @event Hooks#afterPluginsInitialized\n */\n'afterPluginsInitialized',\n\n/**\n * Used when saving/loading the manual row heights state.\n *\n * @event Hooks#manualRowHeights\n * @param {Array} state The current manual row heights state.\n */\n'manualRowHeights',\n\n/**\n * Used to skip the length cache calculation for a defined period of time.\n *\n * @event Hooks#skipLengthCache\n * @param {Number} delay The delay in milliseconds.\n */\n'skipLengthCache',\n\n/**\n * Fired after trimming rows in the TrimRows plugin.\n *\n * @pro\n * @event Hooks#afterTrimRow\n * @param {Array} rows Physical indexes of trimmed rows.\n */\n'afterTrimRow',\n\n/**\n * Fired after untrimming rows in the TrimRows plugin.\n *\n * @pro\n * @event Hooks#afterUntrimRow\n * @param {Array} rows Physical indexes of untrimmed rows.\n */\n'afterUntrimRow',\n\n/**\n * Fired before opening the dropdown menu.\n *\n * @pro\n * @event Hooks#beforeDropdownMenuShow\n * @param {DropdownMenu} instance The DropdownMenu instance.\n */\n'beforeDropdownMenuShow',\n\n/**\n * Fired after opening the dropdown menu.\n *\n * @pro\n * @event Hooks#afterDropdownMenuShow\n * @param {DropdownMenu} instance The DropdownMenu instance.\n */\n'afterDropdownMenuShow',\n\n/**\n * Fired after hiding the dropdown menu.\n *\n * @pro\n * @event Hooks#afterDropdownMenuHide\n * @param {DropdownMenu} instance The DropdownMenu instance.\n */\n'afterDropdownMenuHide',\n\n/**\n * Used to check whether the provided row index is hidden.\n *\n * @pro\n * @event Hooks#hiddenRow\n * @param {Number} row The visual row index in question.\n */\n'hiddenRow',\n\n/**\n * Used to check whether the provided column index is hidden.\n *\n * @pro\n * @event Hooks#hiddenColumn\n * @param {Number} column The visual column index in question.\n */\n'hiddenColumn',\n\n/**\n * Fired before adding a children to the NestedRows structure.\n *\n * @pro\n * @event Hooks#beforeAddChild\n * @param {Object} parent The parent object.\n * @param {Object|undefined} element The element added as a child. If `undefined`, a blank child was added.\n * @param {Number|undefined} index The index within the parent where the new child was added. If `undefined`, the element was added as the last child.\n */\n'beforeAddChild',\n\n/**\n * Fired after adding a children to the NestedRows structure.\n *\n * @pro\n * @event Hooks#afterAddChild\n * @param {Object} parent The parent object.\n * @param {Object|undefined} element The element added as a child. If `undefined`, a blank child was added.\n * @param {Number|undefined} index The index within the parent where the new child was added. If `undefined`, the element was added as the last child.\n */\n'afterAddChild',\n\n/**\n * Fired before detaching a child from its parent in the NestedRows plugin.\n *\n * @pro\n * @event Hooks#beforeDetachChild\n * @param {Object} parent An object representing the parent from which the element is to be detached.\n * @param {Object} element The detached element.\n */\n'beforeDetachChild',\n\n/**\n * Fired after detaching a child from its parent in the NestedRows plugin.\n *\n * @pro\n * @event Hooks#afterDetachChild\n * @param {Object} parent An object representing the parent from which the element was detached.\n * @param {Object} element The detached element.\n */\n'afterDetachChild',\n\n/**\n * Fired after the editor is opened and rendered.\n *\n * @event Hooks#afterBeginEditing\n * @param {Number} row Row index of the edited cell.\n * @param {Number} column Column index of the edited cell.\n */\n'afterBeginEditing',\n\n/**\n * Fired before cell merging.\n *\n * @event Hooks#beforeMergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'beforeMergeCells',\n\n/**\n * Fired after cell merging.\n *\n * @event Hooks#afterMergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {Object} mergeParent The parent collection of the provided cell range.\n * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'afterMergeCells',\n\n/**\n * Fired before unmerging the cells.\n *\n * @event Hooks#beforeUnmergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'beforeUnmergeCells',\n\n/**\n * Fired after unmerging the cells.\n *\n * @event Hooks#beforeUnmergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'afterUnmergeCells',\n\n/**\n * Fired after the listening is turned on.\n *\n * @event Hooks#afterListen\n * @since 0.34.5\n */\n'afterListen',\n\n/**\n * Fired after the listening is turned off.\n *\n * @event Hooks#afterUnlisten\n * @since 0.34.5\n */\n'afterUnlisten'];\n\nvar Hooks = function () {\n  _createClass(Hooks, null, [{\n    key: 'getSingleton',\n    value: function getSingleton() {\n      return globalSingleton;\n    }\n\n    /**\n     *\n     */\n\n  }]);\n\n  function Hooks() {\n    _classCallCheck(this, Hooks);\n\n    this.globalBucket = this.createEmptyBucket();\n  }\n\n  /**\n   * Returns a new object with empty handlers related to every registered hook name.\n   *\n   * @returns {Object} The empty bucket object.\n   *\n   * @example\n   * ```js\n   * Handsontable.hooks.createEmptyBucket();\n   * // Results:\n   * {\n   * ...\n   * afterCreateCol: [],\n   * afterCreateRow: [],\n   * beforeInit: [],\n   * ...\n   * }\n   * ```\n   */\n\n\n  _createClass(Hooks, [{\n    key: 'createEmptyBucket',\n    value: function createEmptyBucket() {\n      var bucket = Object.create(null);\n\n      // eslint-disable-next-line no-return-assign\n      (0, _array.arrayEach)(REGISTERED_HOOKS, function (hook) {\n        return bucket[hook] = [];\n      });\n\n      return bucket;\n    }\n\n    /**\n     * Get hook bucket based on the context of the object or if argument is `undefined`, get the global hook bucket.\n     *\n     * @param {Object} [context=null] A Handsontable instance.\n     * @returns {Object} Returns a global or Handsontable instance bucket.\n     */\n\n  }, {\n    key: 'getBucket',\n    value: function getBucket() {\n      var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      if (context) {\n        if (!context.pluginHookBucket) {\n          context.pluginHookBucket = this.createEmptyBucket();\n        }\n\n        return context.pluginHookBucket;\n      }\n\n      return this.globalBucket;\n    }\n\n    /**\n     * Adds a listener (globally or locally) to a specified hook name.\n     * If the `context` parameter is provided, the hook will be added only to the instance it references.\n     * Otherwise, the callback will be used everytime the hook fires on any Handsontable instance.\n     * You can provide an array of callback functions as the `callback` argument, this way they will all be fired\n     * once the hook is triggered.\n     *\n     * @see Core#addHook\n     * @param {String} key Hook name.\n     * @param {Function|Array} callback Callback function or an array of functions.\n     * @param {Object} [context=null] The context for the hook callback to be added - a Handsontable instance or leave empty.\n     * @returns {Hooks} Instance of Hooks.\n     *\n     * @example\n     * ```js\n     * // single callback, added locally\n     * Handsontable.hooks.add('beforeInit', myCallback, hotInstance);\n     *\n     * // single callback, added globally\n     * Handsontable.hooks.add('beforeInit', myCallback);\n     *\n     * // multiple callbacks, added locally\n     * Handsontable.hooks.add('beforeInit', [myCallback, anotherCallback], hotInstance);\n     *\n     * // multiple callbacks, added globally\n     * Handsontable.hooks.add('beforeInit', [myCallback, anotherCallback]);\n     * ```\n     */\n\n  }, {\n    key: 'add',\n    value: function add(key, callback) {\n      var _this = this;\n\n      var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n      if (Array.isArray(callback)) {\n        (0, _array.arrayEach)(callback, function (c) {\n          return _this.add(key, c, context);\n        });\n      } else {\n        var bucket = this.getBucket(context);\n\n        if (typeof bucket[key] === 'undefined') {\n          this.register(key);\n          bucket[key] = [];\n        }\n        callback.skip = false;\n\n        if (bucket[key].indexOf(callback) === -1) {\n          // only add a hook if it has not already been added (adding the same hook twice is now silently ignored)\n          var foundInitialHook = false;\n\n          if (callback.initialHook) {\n            (0, _array.arrayEach)(bucket[key], function (cb, i) {\n              if (cb.initialHook) {\n                bucket[key][i] = callback;\n                foundInitialHook = true;\n\n                return false;\n              }\n            });\n          }\n\n          if (!foundInitialHook) {\n            bucket[key].push(callback);\n          }\n        }\n      }\n\n      return this;\n    }\n\n    /**\n     * Adds a listener to a specified hook. After the hook runs this listener will be automatically removed from the bucket.\n     *\n     * @see Core#addHookOnce\n     * @param {String} key Hook/Event name.\n     * @param {Function|Array} callback Callback function.\n     * @param {Object} [context=null] A Handsontable instance.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.once('beforeInit', myCallback, hotInstance);\n     * ```\n     */\n\n  }, {\n    key: 'once',\n    value: function once(key, callback) {\n      var _this2 = this;\n\n      var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n      if (Array.isArray(callback)) {\n        (0, _array.arrayEach)(callback, function (c) {\n          return _this2.once(key, c, context);\n        });\n      } else {\n        callback.runOnce = true;\n        this.add(key, callback, context);\n      }\n    }\n\n    /**\n     * Removes a listener from a hook with a given name. If the `context` argument is provided, it removes a listener from a local hook assigned to the given Handsontable instance.\n     *\n     * @see Core#removeHook\n     * @param {String} key Hook/Event name.\n     * @param {Function} callback Callback function (needs the be the function that was previously added to the hook).\n     * @param {Object} [context=null] Handsontable instance.\n     * @return {Boolean} Returns `true` if hook was removed, `false` otherwise.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.remove('beforeInit', myCallback);\n     * ```\n     */\n\n  }, {\n    key: 'remove',\n    value: function remove(key, callback) {\n      var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n      var bucket = this.getBucket(context);\n\n      if (typeof bucket[key] !== 'undefined') {\n        if (bucket[key].indexOf(callback) >= 0) {\n          callback.skip = true;\n\n          return true;\n        }\n      }\n\n      return false;\n    }\n\n    /**\n     * Checks whether there are any registered listeners for the provided hook name.\n     * If the `context` parameter is provided, it only checks for listeners assigned to the given Handsontable instance.\n     *\n     * @param {String} key Hook name.\n     * @param {Object} [context=null] A Handsontable instance.\n     * @returns {Boolean} `true` for success, `false` otherwise.\n     */\n\n  }, {\n    key: 'has',\n    value: function has(key) {\n      var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n      var bucket = this.getBucket(context);\n\n      return !!(bucket[key] !== void 0 && bucket[key].length);\n    }\n\n    /**\n     * Runs all local and global callbacks assigned to the hook identified by the `key` parameter.\n     * It returns either a return value from the last called callback or the first parameter (`p1`) passed to the `run` function.\n     *\n     * @see Core#runHooks\n     * @param {Object} context Handsontable instance.\n     * @param {String} key Hook/Event name.\n     * @param {*} [p1] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p2] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p3] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p4] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p5] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p6] Parameter to be passed as an argument to the callback function.\n     * @returns {*} Either a return value from the last called callback or `p1`.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.run(hot, 'beforeInit');\n     * ```\n     */\n\n  }, {\n    key: 'run',\n    value: function run(context, key, p1, p2, p3, p4, p5, p6) {\n      {\n        var globalHandlers = this.globalBucket[key];\n        var index = -1;\n        var length = globalHandlers ? globalHandlers.length : 0;\n\n        if (length) {\n          // Do not optimise this loop with arrayEach or arrow function! If you do You'll decrease perf because of GC.\n          while (++index < length) {\n            if (!globalHandlers[index] || globalHandlers[index].skip) {\n              /* eslint-disable no-continue */\n              continue;\n            }\n            // performance considerations - http://jsperf.com/call-vs-apply-for-a-plugin-architecture\n            var res = globalHandlers[index].call(context, p1, p2, p3, p4, p5, p6);\n\n            if (res !== void 0) {\n              p1 = res;\n            }\n            if (globalHandlers[index] && globalHandlers[index].runOnce) {\n              this.remove(key, globalHandlers[index]);\n            }\n          }\n        }\n      }\n      {\n        var localHandlers = this.getBucket(context)[key];\n        var _index = -1;\n        var _length = localHandlers ? localHandlers.length : 0;\n\n        if (_length) {\n          // Do not optimise this loop with arrayEach or arrow function! If you do You'll decrease perf because of GC.\n          while (++_index < _length) {\n            if (!localHandlers[_index] || localHandlers[_index].skip) {\n              /* eslint-disable no-continue */\n              continue;\n            }\n            // performance considerations - http://jsperf.com/call-vs-apply-for-a-plugin-architecture\n            var _res = localHandlers[_index].call(context, p1, p2, p3, p4, p5, p6);\n\n            if (_res !== void 0) {\n              p1 = _res;\n            }\n            if (localHandlers[_index] && localHandlers[_index].runOnce) {\n              this.remove(key, localHandlers[_index], context);\n            }\n          }\n        }\n      }\n\n      return p1;\n    }\n\n    /**\n     * Destroy all listeners connected to the context. If no context is provided, the global listeners will be destroyed.\n     *\n     * @param {Object} [context=null] A Handsontable instance.\n     * @example\n     * ```js\n     * // destroy the global listeners\n     * Handsontable.hooks.destroy();\n     *\n     * // destroy the local listeners\n     * Handsontable.hooks.destroy(hotInstance);\n     * ```\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      // eslint-disable-next-line no-return-assign\n      (0, _object.objectEach)(this.getBucket(context), function (value, key, bucket) {\n        return bucket[key].length = 0;\n      });\n    }\n\n    /**\n     * Registers a hook name (adds it to the list of the known hook names). Used by plugins.\n     * It is not necessary to call register, but if you use it, your plugin hook will be used returned by\n     * the `getRegistered` method. (which itself is used in the demo http://docs.handsontable.com/tutorial-callbacks.html).\n     *\n     * @param key {String} The hook name.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.register('myHook');\n     * ```\n     */\n\n  }, {\n    key: 'register',\n    value: function register(key) {\n      if (!this.isRegistered(key)) {\n        REGISTERED_HOOKS.push(key);\n      }\n    }\n\n    /**\n     * Deregisters a hook name (removes it from the list of known hook names).\n     *\n     * @param key {String} Hook name.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.deregister('myHook');\n     * ```\n     */\n\n  }, {\n    key: 'deregister',\n    value: function deregister(key) {\n      if (this.isRegistered(key)) {\n        REGISTERED_HOOKS.splice(REGISTERED_HOOKS.indexOf(key), 1);\n      }\n    }\n\n    /**\n     * Returns a boolean depending on if a hook by such name has been registered.\n     *\n     * @param key {String} Hook name.\n     * @returns {Boolean} `true` for success, `false` otherwise.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.isRegistered('beforeInit');\n     *\n     * // Results:\n     * true\n     * ```\n     */\n\n  }, {\n    key: 'isRegistered',\n    value: function isRegistered(key) {\n      return REGISTERED_HOOKS.indexOf(key) >= 0;\n    }\n\n    /**\n     * Returns an array of registered hooks.\n     *\n     * @returns {Array} An array of registered hooks.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.getRegistered();\n     *\n     * // Results:\n     * [\n     * ...\n     *   'beforeInit',\n     *   'beforeRender',\n     *   'beforeSetRangeEnd',\n     *   'beforeDrawBorders',\n     *   'beforeChange',\n     * ...\n     * ]\n     * ```\n     */\n\n  }, {\n    key: 'getRegistered',\n    value: function getRegistered() {\n      return REGISTERED_HOOKS;\n    }\n  }]);\n\n  return Hooks;\n}();\n\nvar globalSingleton = new Hooks();\n\nexports.default = Hooks;\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _templateObject = _taggedTemplateLiteral(['\\n          Your license key of Handsontable Pro has expired.\\u200C\\u200C\\u200C\\u200C \\n          Renew your maintenance plan at https://handsontable.com or downgrade to the previous version of the software.\\n          '], ['\\n          Your license key of Handsontable Pro has expired.\\u200C\\u200C\\u200C\\u200C\\\\x20\\n          Renew your maintenance plan at https://handsontable.com or downgrade to the previous version of the software.\\n          ']);\n\nexports.stringify = stringify;\nexports.isDefined = isDefined;\nexports.isUndefined = isUndefined;\nexports.isEmpty = isEmpty;\nexports.isRegExp = isRegExp;\nexports._injectProductInfo = _injectProductInfo;\n\nvar _moment = __webpack_require__(55);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _templateLiteralTag = __webpack_require__(41);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\n/**\n * Converts any value to string.\n *\n * @param {*} value\n * @returns {String}\n */\nfunction stringify(value) {\n  var result = void 0;\n\n  switch (typeof value === 'undefined' ? 'undefined' : _typeof(value)) {\n    case 'string':\n    case 'number':\n      result = '' + value;\n      break;\n\n    case 'object':\n      result = value === null ? '' : value.toString();\n      break;\n    case 'undefined':\n      result = '';\n      break;\n    default:\n      result = value.toString();\n      break;\n  }\n\n  return result;\n}\n\n/**\n * Checks if given variable is defined.\n *\n * @param {*} variable Variable to check.\n * @returns {Boolean}\n */\nfunction isDefined(variable) {\n  return typeof variable !== 'undefined';\n}\n\n/**\n * Checks if given variable is undefined.\n *\n * @param {*} variable Variable to check.\n * @returns {Boolean}\n */\nfunction isUndefined(variable) {\n  return typeof variable === 'undefined';\n}\n\n/**\n * Check if given variable is null, empty string or undefined.\n *\n * @param {*} variable Variable to check.\n * @returns {Boolean}\n */\nfunction isEmpty(variable) {\n  return variable === null || variable === '' || isUndefined(variable);\n}\n\n/**\n * Check if given variable is a regular expression.\n *\n * @param {*} variable Variable to check.\n * @returns {Boolean}\n */\nfunction isRegExp(variable) {\n  return Object.prototype.toString.call(variable) === '[object RegExp]';\n}\n\n/* eslint-disable */\nvar _m = '\\x6C\\x65\\x6E\\x67\\x74\\x68';\nvar _hd = function _hd(v) {\n  return parseInt(v, 16);\n};\nvar _pi = function _pi(v) {\n  return parseInt(v, 10);\n};\nvar _ss = function _ss(v, s, l) {\n  return v['\\x73\\x75\\x62\\x73\\x74\\x72'](s, l);\n};\nvar _cp = function _cp(v) {\n  return v['\\x63\\x6F\\x64\\x65\\x50\\x6F\\x69\\x6E\\x74\\x41\\x74'](0) - 65;\n};\nvar _norm = function _norm(v) {\n  return ('' + v).replace(/\\-/g, '');\n};\nvar _extractTime = function _extractTime(v) {\n  return _hd(_ss(_norm(v), _hd('12'), _cp('\\x46'))) / (_hd(_ss(_norm(v), _cp('\\x42'), ~~![][_m])) || 9);\n};\nvar _ignored = function _ignored() {\n  return typeof location !== 'undefined' && /^([a-z0-9\\-]+\\.)?\\x68\\x61\\x6E\\x64\\x73\\x6F\\x6E\\x74\\x61\\x62\\x6C\\x65\\x2E\\x63\\x6F\\x6D$/i.test(location.host);\n};\nvar _notified = false;\n\nfunction _injectProductInfo(key, element) {\n  key = _norm(key || '');\n\n  var warningMessage = '';\n  var showDomMessage = true;\n  var schemaValidity = _checkKeySchema(key);\n  var ignored = _ignored();\n  var trial = isEmpty(key) || key === 'trial';\n\n  if (trial || schemaValidity) {\n    if (schemaValidity) {\n      var releaseTime = Math.floor((0, _moment2.default)('11/04/2018', 'DD/MM/YYYY').toDate().getTime() / 8.64e7);\n      var keyGenTime = _extractTime(key);\n\n      if (keyGenTime > 45000 || keyGenTime !== parseInt(keyGenTime, 10)) {\n        warningMessage = 'The license key provided to Handsontable Pro is invalid. Make sure you pass it correctly.';\n      }\n\n      if (!warningMessage) {\n        if (releaseTime > keyGenTime + 1) {\n          warningMessage = (0, _templateLiteralTag.toSingleLine)(_templateObject);\n        }\n        showDomMessage = releaseTime > keyGenTime + 15;\n      }\n    } else {\n      warningMessage = 'Evaluation version of Handsontable Pro. Not licensed for use in a production environment.';\n    }\n  } else {\n    warningMessage = 'The license key provided to Handsontable Pro is invalid. Make sure you pass it correctly.';\n  }\n  if (ignored) {\n    warningMessage = false;\n    showDomMessage = false;\n  }\n\n  if (warningMessage && !_notified) {\n    console[trial ? 'info' : 'warn'](warningMessage);\n    _notified = true;\n  }\n  if (showDomMessage && element.parentNode) {\n    var message = document.createElement('div');\n\n    message.id = 'hot-display-license-info';\n    message.appendChild(document.createTextNode('Evaluation version of Handsontable Pro.'));\n    message.appendChild(document.createElement('br'));\n    message.appendChild(document.createTextNode('Not licensed for production use.'));\n\n    element.parentNode.insertBefore(message, element.nextSibling);\n  }\n}\n\nfunction _checkKeySchema(v) {\n  var z = [][_m];\n  var p = z;\n\n  if (v[_m] !== _cp('\\x5A')) {\n    return false;\n  }\n\n  for (var c = '', i = '\\x42\\x3C\\x48\\x34\\x50\\x2B'.split(''), j = _cp(i.shift()); j; j = _cp(i.shift() || 'A')) {\n    --j < ''[_m] ? p = p | (_pi('' + _pi(_hd(c) + (_hd(_ss(v, Math.abs(j), 2)) + []).padStart(2, '0'))) % 97 || 2) >> 1 : c = _ss(v, j, !j ? 6 : i[_m] === 1 ? 9 : 8);\n  }\n\n  return p === z;\n}\n/* eslint-enable */\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getRegisteredEditors = exports.getRegisteredEditorNames = exports.hasEditor = exports.getEditorInstance = exports.getEditor = exports.registerEditor = undefined;\nexports.RegisteredEditor = RegisteredEditor;\nexports._getEditorInstance = _getEditorInstance;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _baseEditor = __webpack_require__(53);\n\nvar _baseEditor2 = _interopRequireDefault(_baseEditor);\n\nvar _autocompleteEditor = __webpack_require__(188);\n\nvar _autocompleteEditor2 = _interopRequireDefault(_autocompleteEditor);\n\nvar _checkboxEditor = __webpack_require__(234);\n\nvar _checkboxEditor2 = _interopRequireDefault(_checkboxEditor);\n\nvar _dateEditor = __webpack_require__(235);\n\nvar _dateEditor2 = _interopRequireDefault(_dateEditor);\n\nvar _dropdownEditor = __webpack_require__(238);\n\nvar _dropdownEditor2 = _interopRequireDefault(_dropdownEditor);\n\nvar _handsontableEditor = __webpack_require__(189);\n\nvar _handsontableEditor2 = _interopRequireDefault(_handsontableEditor);\n\nvar _numericEditor = __webpack_require__(239);\n\nvar _numericEditor2 = _interopRequireDefault(_numericEditor);\n\nvar _passwordEditor = __webpack_require__(240);\n\nvar _passwordEditor2 = _interopRequireDefault(_passwordEditor);\n\nvar _selectEditor = __webpack_require__(241);\n\nvar _selectEditor2 = _interopRequireDefault(_selectEditor);\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Utility to register editors and common namespace for keeping reference to all editor classes\n */\nvar registeredEditorClasses = new WeakMap();\n\nvar _staticRegister = (0, _staticRegister3.default)('editors'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem,\n    hasItem = _staticRegister.hasItem,\n    getNames = _staticRegister.getNames,\n    getValues = _staticRegister.getValues;\n\n_register('base', _baseEditor2.default);\n_register('autocomplete', _autocompleteEditor2.default);\n_register('checkbox', _checkboxEditor2.default);\n_register('date', _dateEditor2.default);\n_register('dropdown', _dropdownEditor2.default);\n_register('handsontable', _handsontableEditor2.default);\n_register('numeric', _numericEditor2.default);\n_register('password', _passwordEditor2.default);\n_register('select', _selectEditor2.default);\n_register('text', _textEditor2.default);\n\nfunction RegisteredEditor(editorClass) {\n  var instances = {};\n  var Clazz = editorClass;\n\n  this.getConstructor = function () {\n    return editorClass;\n  };\n\n  this.getInstance = function (hotInstance) {\n    if (!(hotInstance.guid in instances)) {\n      instances[hotInstance.guid] = new Clazz(hotInstance);\n    }\n\n    return instances[hotInstance.guid];\n  };\n\n  _pluginHooks2.default.getSingleton().add('afterDestroy', function () {\n    instances = {};\n  });\n}\n\n/**\n * Returns instance (singleton) of editor class.\n *\n * @param {String} name Name of an editor under which it has been stored.\n * @param {Object} hotInstance Instance of Handsontable.\n * @returns {Function} Returns instance of editor.\n */\nfunction _getEditorInstance(name, hotInstance) {\n  var editor = void 0;\n\n  if (typeof name === 'function') {\n    if (!registeredEditorClasses.get(name)) {\n      _register(null, name);\n    }\n    editor = registeredEditorClasses.get(name);\n  } else if (typeof name === 'string') {\n    editor = getItem(name);\n  } else {\n    throw Error('Only strings and functions can be passed as \"editor\" parameter');\n  }\n\n  if (!editor) {\n    throw Error('No editor registered under name \"' + name + '\"');\n  }\n\n  return editor.getInstance(hotInstance);\n}\n\n/**\n * Retrieve editor class.\n *\n * @param {String} name Editor identification.\n * @returns {Function} Returns editor class.\n */\nfunction _getItem(name) {\n  if (!hasItem(name)) {\n    throw Error('No registered editor found under \"' + name + '\" name');\n  }\n\n  return getItem(name).getConstructor();\n}\n\n/**\n * Register editor class under specified name.\n *\n * @param {String} name Editor identification.\n * @param {Function} editorClass Editor class.\n */\nfunction _register(name, editorClass) {\n  var editorWrapper = new RegisteredEditor(editorClass);\n\n  if (typeof name === 'string') {\n    register(name, editorWrapper);\n  }\n  registeredEditorClasses.set(editorClass, editorWrapper);\n}\n\nexports.registerEditor = _register;\nexports.getEditor = _getItem;\nexports.getEditorInstance = _getEditorInstance;\nexports.hasEditor = hasItem;\nexports.getRegisteredEditorNames = getNames;\nexports.getRegisteredEditors = getValues;\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.normalizeSelection = normalizeSelection;\nexports.isSeparator = isSeparator;\nexports.hasSubMenu = hasSubMenu;\nexports.isDisabled = isDisabled;\nexports.isSelectionDisabled = isSelectionDisabled;\nexports.getValidSelection = getValidSelection;\nexports.prepareVerticalAlignClass = prepareVerticalAlignClass;\nexports.prepareHorizontalAlignClass = prepareHorizontalAlignClass;\nexports.getAlignmentClasses = getAlignmentClasses;\nexports.align = align;\nexports.checkSelectionConsistency = checkSelectionConsistency;\nexports.markLabelAsSelected = markLabelAsSelected;\nexports.isItemHidden = isItemHidden;\nexports.filterSeparators = filterSeparators;\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _element = __webpack_require__(0);\n\nvar _separator = __webpack_require__(93);\n\nfunction normalizeSelection(selRanges) {\n  return (0, _array.arrayMap)(selRanges, function (range) {\n    return {\n      start: range.getTopLeftCorner(),\n      end: range.getBottomRightCorner()\n    };\n  });\n}\n\nfunction isSeparator(cell) {\n  return (0, _element.hasClass)(cell, 'htSeparator');\n}\n\nfunction hasSubMenu(cell) {\n  return (0, _element.hasClass)(cell, 'htSubmenu');\n}\n\nfunction isDisabled(cell) {\n  return (0, _element.hasClass)(cell, 'htDisabled');\n}\n\nfunction isSelectionDisabled(cell) {\n  return (0, _element.hasClass)(cell, 'htSelectionDisabled');\n}\n\nfunction getValidSelection(hot) {\n  var selected = hot.getSelected();\n\n  if (!selected) {\n    return null;\n  }\n  if (selected[0] < 0) {\n    return null;\n  }\n\n  return selected;\n}\n\nfunction prepareVerticalAlignClass(className, alignment) {\n  if (className.indexOf(alignment) != -1) {\n    return className;\n  }\n  className = className.replace('htTop', '').replace('htMiddle', '').replace('htBottom', '').replace('  ', '');\n\n  className += ' ' + alignment;\n\n  return className;\n}\n\nfunction prepareHorizontalAlignClass(className, alignment) {\n  if (className.indexOf(alignment) != -1) {\n    return className;\n  }\n  className = className.replace('htLeft', '').replace('htCenter', '').replace('htRight', '').replace('htJustify', '').replace('  ', '');\n\n  className += ' ' + alignment;\n\n  return className;\n}\n\nfunction getAlignmentClasses(ranges, callback) {\n  var classes = {};\n\n  (0, _array.arrayEach)(ranges, function (_ref) {\n    var from = _ref.from,\n        to = _ref.to;\n\n    for (var row = from.row; row <= to.row; row++) {\n      for (var col = from.col; col <= to.col; col++) {\n        if (!classes[row]) {\n          classes[row] = [];\n        }\n        classes[row][col] = callback(row, col);\n      }\n    }\n  });\n\n  return classes;\n}\n\nfunction align(ranges, type, alignment, cellDescriptor, propertySetter) {\n  (0, _array.arrayEach)(ranges, function (_ref2) {\n    var from = _ref2.from,\n        to = _ref2.to;\n\n    if (from.row == to.row && from.col == to.col) {\n      applyAlignClassName(from.row, from.col, type, alignment, cellDescriptor, propertySetter);\n    } else {\n      for (var row = from.row; row <= to.row; row++) {\n        for (var col = from.col; col <= to.col; col++) {\n          applyAlignClassName(row, col, type, alignment, cellDescriptor, propertySetter);\n        }\n      }\n    }\n  });\n}\n\nfunction applyAlignClassName(row, col, type, alignment, cellDescriptor, propertySetter) {\n  var cellMeta = cellDescriptor(row, col);\n  var className = alignment;\n\n  if (cellMeta.className) {\n    if (type === 'vertical') {\n      className = prepareVerticalAlignClass(cellMeta.className, alignment);\n    } else {\n      className = prepareHorizontalAlignClass(cellMeta.className, alignment);\n    }\n  }\n\n  propertySetter(row, col, 'className', className);\n}\n\nfunction checkSelectionConsistency(ranges, comparator) {\n  var result = false;\n\n  if (Array.isArray(ranges)) {\n    (0, _array.arrayEach)(ranges, function (range) {\n      range.forAll(function (row, col) {\n        if (comparator(row, col)) {\n          result = true;\n\n          return false;\n        }\n      });\n\n      return result;\n    });\n  }\n\n  return result;\n}\n\nfunction markLabelAsSelected(label) {\n  // workaround for https://github.com/handsontable/handsontable/issues/1946\n  return '<span class=\"selected\">' + String.fromCharCode(10003) + '</span>' + label;\n}\n\nfunction isItemHidden(item, instance) {\n  return !item.hidden || !(typeof item.hidden == 'function' && item.hidden.call(instance));\n}\n\nfunction shiftSeparators(items, separator) {\n  var result = items.slice(0);\n\n  for (var i = 0; i < result.length;) {\n    if (result[i].name === separator) {\n      result.shift();\n    } else {\n      break;\n    }\n  }\n  return result;\n}\n\nfunction popSeparators(items, separator) {\n  var result = items.slice(0);\n\n  result.reverse();\n  result = shiftSeparators(result, separator);\n  result.reverse();\n\n  return result;\n}\n\nfunction removeDuplicatedSeparators(items) {\n  var result = [];\n\n  (0, _array.arrayEach)(items, function (value, index) {\n    if (index > 0) {\n      if (result[result.length - 1].name !== value.name) {\n        result.push(value);\n      }\n    } else {\n      result.push(value);\n    }\n  });\n\n  return result;\n}\n\nfunction filterSeparators(items) {\n  var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _separator.KEY;\n\n  var result = items.slice(0);\n\n  result = shiftSeparators(result, separator);\n  result = popSeparators(result, separator);\n  result = removeDuplicatedSeparators(result);\n\n  return result;\n}\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(18);\nvar IE8_DOM_DEFINE = __webpack_require__(98);\nvar toPrimitive = __webpack_require__(73);\nvar dP = Object.defineProperty;\n\nexports.f = __webpack_require__(22) ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return dP(O, P, Attributes);\n  } catch (e) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY_CODES = undefined;\nexports.isPrintableChar = isPrintableChar;\nexports.isMetaKey = isMetaKey;\nexports.isCtrlKey = isCtrlKey;\nexports.isCtrlMetaKey = isCtrlMetaKey;\nexports.isKey = isKey;\n\nvar _array = __webpack_require__(1);\n\nvar KEY_CODES = exports.KEY_CODES = {\n  MOUSE_LEFT: 1,\n  MOUSE_RIGHT: 3,\n  MOUSE_MIDDLE: 2,\n  BACKSPACE: 8,\n  COMMA: 188,\n  INSERT: 45,\n  DELETE: 46,\n  END: 35,\n  ENTER: 13,\n  ESCAPE: 27,\n  CONTROL: 17,\n  COMMAND_LEFT: 91,\n  COMMAND_RIGHT: 93,\n  COMMAND_FIREFOX: 224,\n  ALT: 18,\n  HOME: 36,\n  PAGE_DOWN: 34,\n  PAGE_UP: 33,\n  PERIOD: 190,\n  SPACE: 32,\n  SHIFT: 16,\n  CAPS_LOCK: 20,\n  TAB: 9,\n  ARROW_RIGHT: 39,\n  ARROW_LEFT: 37,\n  ARROW_UP: 38,\n  ARROW_DOWN: 40,\n  F1: 112,\n  F2: 113,\n  F3: 114,\n  F4: 115,\n  F5: 116,\n  F6: 117,\n  F7: 118,\n  F8: 119,\n  F9: 120,\n  F10: 121,\n  F11: 122,\n  F12: 123,\n  A: 65,\n  X: 88,\n  C: 67,\n  V: 86\n};\n\n/**\n * Returns true if keyCode represents a printable character.\n *\n * @param {Number} keyCode\n * @returns {Boolean}\n */\nfunction isPrintableChar(keyCode) {\n  return keyCode == 32 || // space\n  keyCode >= 48 && keyCode <= 57 || // 0-9\n  keyCode >= 96 && keyCode <= 111 || // numpad\n  keyCode >= 186 && keyCode <= 192 || // ;=,-./`\n  keyCode >= 219 && keyCode <= 222 || // []{}\\|\"'\n  keyCode >= 226 || // special chars (229 for Asian chars)\n  keyCode >= 65 && keyCode <= 90; // a-z\n}\n\n/**\n * @param {Number} keyCode\n * @returns {Boolean}\n */\nfunction isMetaKey(keyCode) {\n  var metaKeys = [KEY_CODES.ARROW_DOWN, KEY_CODES.ARROW_UP, KEY_CODES.ARROW_LEFT, KEY_CODES.ARROW_RIGHT, KEY_CODES.HOME, KEY_CODES.END, KEY_CODES.DELETE, KEY_CODES.BACKSPACE, KEY_CODES.F1, KEY_CODES.F2, KEY_CODES.F3, KEY_CODES.F4, KEY_CODES.F5, KEY_CODES.F6, KEY_CODES.F7, KEY_CODES.F8, KEY_CODES.F9, KEY_CODES.F10, KEY_CODES.F11, KEY_CODES.F12, KEY_CODES.TAB, KEY_CODES.PAGE_DOWN, KEY_CODES.PAGE_UP, KEY_CODES.ENTER, KEY_CODES.ESCAPE, KEY_CODES.SHIFT, KEY_CODES.CAPS_LOCK, KEY_CODES.ALT];\n\n  return metaKeys.indexOf(keyCode) !== -1;\n}\n\n/**\n * Checks if passed key code is ctrl or cmd key. Depends on what OS the code runs it check key code based on\n * different meta key codes.\n *\n * @param {Number} keyCode Key code to check.\n * @returns {Boolean}\n */\nfunction isCtrlKey(keyCode) {\n  var keys = [];\n\n  if (window.navigator.platform.includes('Mac')) {\n    keys.push(KEY_CODES.COMMAND_LEFT, KEY_CODES.COMMAND_RIGHT, KEY_CODES.COMMAND_FIREFOX);\n  } else {\n    keys.push(KEY_CODES.CONTROL);\n  }\n\n  return keys.includes(keyCode);\n}\n\n/**\n * Checks if passed key code is ctrl or cmd key. This helper checks if the key code matches to meta keys\n * regardless of the OS on which it is running.\n *\n * @param {Number} keyCode Key code to check.\n * @returns {Boolean}\n */\nfunction isCtrlMetaKey(keyCode) {\n  return [KEY_CODES.CONTROL, KEY_CODES.COMMAND_LEFT, KEY_CODES.COMMAND_RIGHT, KEY_CODES.COMMAND_FIREFOX].includes(keyCode);\n}\n\n/**\n * @param {Number} keyCode\n * @param {String} baseCode\n * @returns {Boolean}\n */\nfunction isKey(keyCode, baseCode) {\n  var keys = baseCode.split('|');\n  var result = false;\n\n  (0, _array.arrayEach)(keys, function (key) {\n    if (keyCode === KEY_CODES[key]) {\n      result = true;\n\n      return false;\n    }\n  });\n\n  return result;\n}\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(23)(function () {\n  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(75);\nvar defined = __webpack_require__(38);\nmodule.exports = function (it) {\n  return IObject(defined(it));\n};\n\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.15 ToLength\nvar toInteger = __webpack_require__(59);\nvar min = Math.min;\nmodule.exports = function (it) {\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// most Object methods by ES6 should accept primitives\nvar $export = __webpack_require__(3);\nvar core = __webpack_require__(44);\nvar fails = __webpack_require__(23);\nmodule.exports = function (KEY, exec) {\n  var fn = (core.Object || {})[KEY] || Object[KEY];\n  var exp = {};\n  exp[KEY] = exec(fn);\n  $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.isIE8 = isIE8;\nexports.isIE9 = isIE9;\nexports.isSafari = isSafari;\nexports.isChrome = isChrome;\nexports.isMobileBrowser = isMobileBrowser;\nvar _isIE8 = !document.createTextNode('test').textContent;\n\nfunction isIE8() {\n  return _isIE8;\n}\n\nvar _isIE9 = !!document.documentMode;\n\nfunction isIE9() {\n  return _isIE9;\n}\n\nvar _isSafari = /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);\n\nfunction isSafari() {\n  return _isSafari;\n}\n\nvar _isChrome = /Chrome/.test(navigator.userAgent) && /Google/.test(navigator.vendor);\n\nfunction isChrome() {\n  return _isChrome;\n}\n\nfunction isMobileBrowser(userAgent) {\n  if (!userAgent) {\n    userAgent = navigator.userAgent;\n  }\n\n  return (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent)\n  );\n}\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getRegisteredValidators = exports.getRegisteredValidatorNames = exports.hasValidator = exports.getValidator = exports.registerValidator = undefined;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _autocompleteValidator = __webpack_require__(250);\n\nvar _autocompleteValidator2 = _interopRequireDefault(_autocompleteValidator);\n\nvar _dateValidator = __webpack_require__(251);\n\nvar _dateValidator2 = _interopRequireDefault(_dateValidator);\n\nvar _numericValidator = __webpack_require__(252);\n\nvar _numericValidator2 = _interopRequireDefault(_numericValidator);\n\nvar _timeValidator = __webpack_require__(253);\n\nvar _timeValidator2 = _interopRequireDefault(_timeValidator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _staticRegister = (0, _staticRegister3.default)('validators'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem,\n    hasItem = _staticRegister.hasItem,\n    getNames = _staticRegister.getNames,\n    getValues = _staticRegister.getValues;\n\nregister('autocomplete', _autocompleteValidator2.default);\nregister('date', _dateValidator2.default);\nregister('numeric', _numericValidator2.default);\nregister('time', _timeValidator2.default);\n\n/**\n * Retrieve validator function.\n *\n * @param {String} name Validator identification.\n * @returns {Function} Returns validator function.\n */\nfunction _getItem(name) {\n  if (typeof name === 'function') {\n    return name;\n  }\n  if (!hasItem(name)) {\n    throw Error('No registered validator found under \"' + name + '\" name');\n  }\n\n  return getItem(name);\n}\n\nexports.registerValidator = register;\nexports.getValidator = _getItem;\nexports.hasValidator = hasItem;\nexports.getRegisteredValidatorNames = getNames;\nexports.getRegisteredValidators = getValues;\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports) {\n\nvar hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar hide = __webpack_require__(31);\nvar has = __webpack_require__(29);\nvar SRC = __webpack_require__(48)('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\n__webpack_require__(44).inspectSource = function (it) {\n  return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n  var isFunction = typeof val == 'function';\n  if (isFunction) has(val, 'name') || hide(val, 'name', key);\n  if (O[key] === val) return;\n  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n  if (O === global) {\n    O[key] = val;\n  } else if (!safe) {\n    delete O[key];\n    hide(O, key, val);\n  } else if (O[key]) {\n    O[key] = val;\n  } else {\n    hide(O, key, val);\n  }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n  return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(20);\nvar createDesc = __webpack_require__(49);\nmodule.exports = __webpack_require__(22) ? function (object, key, value) {\n  return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// optional / simple context binding\nvar aFunction = __webpack_require__(62);\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n  switch (length) {\n    case 1: return function (a) {\n      return fn.call(that, a);\n    };\n    case 2: return function (a, b) {\n      return fn.call(that, a, b);\n    };\n    case 3: return function (a, b, c) {\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(38);\nmodule.exports = function (it) {\n  return Object(defined(it));\n};\n\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar META = __webpack_require__(48)('meta');\nvar isObject = __webpack_require__(9);\nvar has = __webpack_require__(29);\nvar setDesc = __webpack_require__(20).f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n  return true;\n};\nvar FREEZE = !__webpack_require__(23)(function () {\n  return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n  setDesc(it, META, { value: {\n    i: 'O' + ++id, // object ID\n    w: {}          // weak collections IDs\n  } });\n};\nvar fastKey = function (it, create) {\n  // return primitive with prefix\n  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return 'F';\n    // not necessary to add metadata\n    if (!create) return 'E';\n    // add missing metadata\n    setMeta(it);\n  // return object ID\n  } return it[META].i;\n};\nvar getWeak = function (it, create) {\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return true;\n    // not necessary to add metadata\n    if (!create) return false;\n    // add missing metadata\n    setMeta(it);\n  // return hash weak collections IDs\n  } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n  return it;\n};\nvar meta = module.exports = {\n  KEY: META,\n  NEED: false,\n  fastKey: fastKey,\n  getWeak: getWeak,\n  onFreeze: onFreeze\n};\n\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _core = __webpack_require__(179);\n\nvar _core2 = _interopRequireDefault(_core);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar registeredOverlays = {};\n\n/**\n * Creates an overlay over the original Walkontable instance. The overlay renders the clone of the original Walkontable\n * and (optionally) implements behavior needed for native horizontal and vertical scrolling.\n *\n * @class Overlay\n */\n\nvar Overlay = function () {\n  _createClass(Overlay, null, [{\n    key: 'registerOverlay',\n\n\n    /**\n     * Register overlay class.\n     *\n     * @param {String} type Overlay type, one of the CLONE_TYPES value\n     * @param {Overlay} overlayClass Overlay class extended from base overlay class {@link Overlay}\n     */\n    value: function registerOverlay(type, overlayClass) {\n      if (Overlay.CLONE_TYPES.indexOf(type) === -1) {\n        throw new Error('Unsupported overlay (' + type + ').');\n      }\n      registeredOverlays[type] = overlayClass;\n    }\n\n    /**\n     * Create new instance of overlay type.\n     *\n     * @param {String} type Overlay type, one of the CLONE_TYPES value\n     * @param {Walkontable} wot Walkontable instance\n     */\n\n  }, {\n    key: 'createOverlay',\n    value: function createOverlay(type, wot) {\n      return new registeredOverlays[type](wot);\n    }\n\n    /**\n     * Check if specified overlay was registered.\n     *\n     * @param {String} type Overlay type, one of the CLONE_TYPES value\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasOverlay',\n    value: function hasOverlay(type) {\n      return registeredOverlays[type] !== void 0;\n    }\n\n    /**\n     * Checks if overlay object (`overlay`) is instance of overlay type (`type`).\n     *\n     * @param {Overlay} overlay Overlay object\n     * @param {String} type Overlay type, one of the CLONE_TYPES value\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isOverlayTypeOf',\n    value: function isOverlayTypeOf(overlay, type) {\n      if (!overlay || !registeredOverlays[type]) {\n        return false;\n      }\n\n      return overlay instanceof registeredOverlays[type];\n    }\n\n    /**\n     * @param {Walkontable} wotInstance\n     */\n\n  }, {\n    key: 'CLONE_TOP',\n\n    /**\n     * @type {String}\n     */\n    get: function get() {\n      return 'top';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_BOTTOM',\n    get: function get() {\n      return 'bottom';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_LEFT',\n    get: function get() {\n      return 'left';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_TOP_LEFT_CORNER',\n    get: function get() {\n      return 'top_left_corner';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_BOTTOM_LEFT_CORNER',\n    get: function get() {\n      return 'bottom_left_corner';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_DEBUG',\n    get: function get() {\n      return 'debug';\n    }\n\n    /**\n     * List of all availables clone types\n     *\n     * @type {Array}\n     */\n\n  }, {\n    key: 'CLONE_TYPES',\n    get: function get() {\n      return [Overlay.CLONE_TOP, Overlay.CLONE_BOTTOM, Overlay.CLONE_LEFT, Overlay.CLONE_TOP_LEFT_CORNER, Overlay.CLONE_BOTTOM_LEFT_CORNER, Overlay.CLONE_DEBUG];\n    }\n  }]);\n\n  function Overlay(wotInstance) {\n    _classCallCheck(this, Overlay);\n\n    (0, _object.defineGetter)(this, 'wot', wotInstance, {\n      writable: false\n    });\n\n    // legacy support, deprecated in the future\n    this.instance = this.wot;\n\n    this.type = '';\n    this.mainTableScrollableElement = null;\n    this.TABLE = this.wot.wtTable.TABLE;\n    this.hider = this.wot.wtTable.hider;\n    this.spreader = this.wot.wtTable.spreader;\n    this.holder = this.wot.wtTable.holder;\n    this.wtRootElement = this.wot.wtTable.wtRootElement;\n    this.trimmingContainer = (0, _element.getTrimmingContainer)(this.hider.parentNode.parentNode);\n    this.areElementSizesAdjusted = false;\n    this.updateStateOfRendering();\n  }\n\n  /**\n   * Update internal state of object with an information about the need of full rendering of the overlay.\n   *\n   * @returns {Boolean} Returns `true` if the state has changed since the last check.\n   */\n\n\n  _createClass(Overlay, [{\n    key: 'updateStateOfRendering',\n    value: function updateStateOfRendering() {\n      var previousState = this.needFullRender;\n\n      this.needFullRender = this.shouldBeRendered();\n\n      var changed = previousState !== this.needFullRender;\n\n      if (changed && !this.needFullRender) {\n        this.reset();\n      }\n\n      return changed;\n    }\n\n    /**\n     * Checks if overlay should be fully rendered\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'shouldBeRendered',\n    value: function shouldBeRendered() {\n      return true;\n    }\n\n    /**\n     * Update the trimming container.\n     */\n\n  }, {\n    key: 'updateTrimmingContainer',\n    value: function updateTrimmingContainer() {\n      this.trimmingContainer = (0, _element.getTrimmingContainer)(this.hider.parentNode.parentNode);\n    }\n\n    /**\n     * Update the main scrollable element.\n     */\n\n  }, {\n    key: 'updateMainScrollableElement',\n    value: function updateMainScrollableElement() {\n      this.mainTableScrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);\n    }\n\n    /**\n     * Make a clone of table for overlay\n     *\n     * @param {String} direction Can be `Overlay.CLONE_TOP`, `Overlay.CLONE_LEFT`,\n     *                           `Overlay.CLONE_TOP_LEFT_CORNER`, `Overlay.CLONE_DEBUG`\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'makeClone',\n    value: function makeClone(direction) {\n      if (Overlay.CLONE_TYPES.indexOf(direction) === -1) {\n        throw new Error('Clone type \"' + direction + '\" is not supported.');\n      }\n      var clone = document.createElement('DIV');\n      var clonedTable = document.createElement('TABLE');\n\n      clone.className = 'ht_clone_' + direction + ' handsontable';\n      clone.style.position = 'absolute';\n      clone.style.top = 0;\n      clone.style.left = 0;\n      clone.style.overflow = 'hidden';\n\n      clonedTable.className = this.wot.wtTable.TABLE.className;\n      clone.appendChild(clonedTable);\n\n      this.type = direction;\n      this.wot.wtTable.wtRootElement.parentNode.appendChild(clone);\n\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (preventOverflow === true || preventOverflow === 'horizontal' && this.type === Overlay.CLONE_TOP || preventOverflow === 'vertical' && this.type === Overlay.CLONE_LEFT) {\n        this.mainTableScrollableElement = window;\n      } else {\n        this.mainTableScrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);\n      }\n\n      return new _core2.default({\n        cloneSource: this.wot,\n        cloneOverlay: this,\n        table: clonedTable\n      });\n    }\n\n    /**\n     * Refresh/Redraw overlay\n     *\n     * @param {Boolean} [fastDraw=false]\n     */\n\n  }, {\n    key: 'refresh',\n    value: function refresh() {\n      var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      // When hot settings are changed we allow to refresh overlay once before blocking\n      var nextCycleRenderFlag = this.shouldBeRendered();\n\n      if (this.clone && (this.needFullRender || nextCycleRenderFlag)) {\n        this.clone.draw(fastDraw);\n      }\n      this.needFullRender = nextCycleRenderFlag;\n    }\n\n    /**\n     * Reset overlay styles to initial values.\n     */\n\n  }, {\n    key: 'reset',\n    value: function reset() {\n      if (!this.clone) {\n        return;\n      }\n      var holder = this.clone.wtTable.holder;\n      var hider = this.clone.wtTable.hider;\n      var holderStyle = holder.style;\n      var hidderStyle = hider.style;\n      var rootStyle = holder.parentNode.style;\n\n      (0, _array.arrayEach)([holderStyle, hidderStyle, rootStyle], function (style) {\n        style.width = '';\n        style.height = '';\n      });\n    }\n\n    /**\n     * Destroy overlay instance\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      new _eventManager2.default(this.clone).destroy();\n    }\n  }]);\n\n  return Overlay;\n}();\n\nexports.default = Overlay;\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.toUpperCaseFirst = toUpperCaseFirst;\nexports.equalsIgnoreCase = equalsIgnoreCase;\nexports.randomString = randomString;\nexports.isPercentValue = isPercentValue;\nexports.substitute = substitute;\nexports.stripTags = stripTags;\n\nvar _mixed = __webpack_require__(16);\n\nvar _number = __webpack_require__(5);\n\n/**\n * Convert string to upper case first letter.\n *\n * @param {String} string String to convert.\n * @returns {String}\n */\nfunction toUpperCaseFirst(string) {\n  return string[0].toUpperCase() + string.substr(1);\n}\n\n/**\n * Compare strings case insensitively.\n *\n * @param {...String} strings Strings to compare.\n * @returns {Boolean}\n */\nfunction equalsIgnoreCase() {\n  var unique = [];\n\n  for (var _len = arguments.length, strings = Array(_len), _key = 0; _key < _len; _key++) {\n    strings[_key] = arguments[_key];\n  }\n\n  var length = strings.length;\n\n  while (length--) {\n    var string = (0, _mixed.stringify)(strings[length]).toLowerCase();\n\n    if (unique.indexOf(string) === -1) {\n      unique.push(string);\n    }\n  }\n\n  return unique.length === 1;\n}\n\n/**\n * Generates a random hex string. Used as namespace for Handsontable instance events.\n *\n * @return {String} Returns 16-long character random string (eq. `'92b1bfc74ec4'`).\n */\nfunction randomString() {\n  function s4() {\n    return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n  }\n\n  return s4() + s4() + s4() + s4();\n}\n\n/**\n * Checks if value is valid percent.\n *\n * @param {String} value\n * @returns {Boolean}\n */\nfunction isPercentValue(value) {\n  return (/^([0-9][0-9]?%$)|(^100%$)/.test(value)\n  );\n}\n\n/**\n * Substitute strings placed beetwen square brackets into value defined in `variables` object. String names defined in\n * square brackets must be the same as property name of `variables` object.\n *\n * @param {String} template Template string.\n * @param {Object} variables Object which contains all available values which can be injected into template.\n * @returns {String}\n */\nfunction substitute(template) {\n  var variables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  return ('' + template).replace(/(?:\\\\)?\\[([^[\\]]+)]/g, function (match, name) {\n    if (match.charAt(0) === '\\\\') {\n      return match.substr(1, match.length - 1);\n    }\n\n    return variables[name] === void 0 ? '' : variables[name];\n  });\n}\n\nvar STRIP_TAGS_REGEX = /<\\/?\\w+\\/?>|<\\w+[\\s|/][^>]*>/gi;\n\n/**\n * Strip any HTML tag from the string.\n *\n * @param  {String} string String to cut HTML from.\n * @return {String}\n */\nfunction stripTags(string) {\n  string += '';\n\n  return string.replace(STRIP_TAGS_REGEX, '');\n}\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(99);\nvar enumBugKeys = __webpack_require__(78);\n\nmodule.exports = Object.keys || function keys(O) {\n  return $keys(O, enumBugKeys);\n};\n\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports) {\n\n// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = staticRegister;\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar collection = exports.collection = new Map();\n\nfunction staticRegister() {\n  var namespace = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'common';\n\n  if (!collection.has(namespace)) {\n    collection.set(namespace, new Map());\n  }\n  var subCollection = collection.get(namespace);\n\n  /**\n   * Register an item to the collection. If the item under the same was exist earlier then this item will be replaced with new one.\n   *\n   * @param {String} name Identification of the item.\n   * @param {*} item Item to save in the collection.\n   */\n  function register(name, item) {\n    subCollection.set(name, item);\n  }\n\n  /**\n   * Retrieve the item from the collection.\n   *\n   * @param {String} name Identification of the item.\n   * @returns {*} Returns item which was saved in the collection.\n   */\n  function getItem(name) {\n    return subCollection.get(name);\n  }\n\n  /**\n   * Check if item under specyfied name is exists.\n   *\n   * @param {String} name Identification of the item.\n   * @returns {Boolean} Returns `true` or `false` depends on if element exists in the collection.\n   */\n  function hasItem(name) {\n    return subCollection.has(name);\n  }\n\n  /**\n   * Retrieve list of names registered from the collection.\n   *\n   * @returns {Array} Returns an array of strings with all names under which objects are stored.\n   */\n  function getNames() {\n    return [].concat(_toConsumableArray(subCollection.keys()));\n  }\n\n  /**\n   * Retrieve all registered values from the collection.\n   *\n   * @returns {Array} Returns an array with all values stored in the collection.\n   */\n  function getValues() {\n    return [].concat(_toConsumableArray(subCollection.values()));\n  }\n\n  return {\n    register: register,\n    getItem: getItem,\n    hasItem: hasItem,\n    getNames: getNames,\n    getValues: getValues\n  };\n}\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.requestAnimationFrame = requestAnimationFrame;\nexports.cancelAnimationFrame = cancelAnimationFrame;\nexports.isTouchSupported = isTouchSupported;\nexports.isWebComponentSupportedNatively = isWebComponentSupportedNatively;\nexports.hasCaptionProblem = hasCaptionProblem;\nexports.getComparisonFunction = getComparisonFunction;\n// https://gist.github.com/paulirish/1579671\nvar lastTime = 0;\nvar vendors = ['ms', 'moz', 'webkit', 'o'];\nvar _requestAnimationFrame = window.requestAnimationFrame;\nvar _cancelAnimationFrame = window.cancelAnimationFrame;\n\nfor (var x = 0; x < vendors.length && !_requestAnimationFrame; ++x) {\n  _requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\n  _cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!_requestAnimationFrame) {\n  _requestAnimationFrame = function _requestAnimationFrame(callback) {\n    var currTime = new Date().getTime();\n    var timeToCall = Math.max(0, 16 - (currTime - lastTime));\n    var id = window.setTimeout(function () {\n      callback(currTime + timeToCall);\n    }, timeToCall);\n    lastTime = currTime + timeToCall;\n\n    return id;\n  };\n}\n\nif (!_cancelAnimationFrame) {\n  _cancelAnimationFrame = function _cancelAnimationFrame(id) {\n    clearTimeout(id);\n  };\n}\n\n/**\n * Polyfill for requestAnimationFrame\n *\n * @param {Function} callback\n * @returns {Number}\n */\nfunction requestAnimationFrame(callback) {\n  return _requestAnimationFrame.call(window, callback);\n}\n\n/**\n * Polyfill for cancelAnimationFrame\n *\n * @param {Number} id\n */\nfunction cancelAnimationFrame(id) {\n  _cancelAnimationFrame.call(window, id);\n}\n\nfunction isTouchSupported() {\n  return 'ontouchstart' in window;\n}\n\n/**\n * Checks if browser is support web components natively\n *\n * @returns {Boolean}\n */\nfunction isWebComponentSupportedNatively() {\n  var test = document.createElement('div');\n\n  return !!(test.createShadowRoot && test.createShadowRoot.toString().match(/\\[native code\\]/));\n}\n\nvar _hasCaptionProblem;\n\nfunction detectCaptionProblem() {\n  var TABLE = document.createElement('TABLE');\n  TABLE.style.borderSpacing = 0;\n  TABLE.style.borderWidth = 0;\n  TABLE.style.padding = 0;\n  var TBODY = document.createElement('TBODY');\n  TABLE.appendChild(TBODY);\n  TBODY.appendChild(document.createElement('TR'));\n  TBODY.firstChild.appendChild(document.createElement('TD'));\n  TBODY.firstChild.firstChild.innerHTML = '<tr><td>t<br>t</td></tr>';\n\n  var CAPTION = document.createElement('CAPTION');\n  CAPTION.innerHTML = 'c<br>c<br>c<br>c';\n  CAPTION.style.padding = 0;\n  CAPTION.style.margin = 0;\n  TABLE.insertBefore(CAPTION, TBODY);\n\n  document.body.appendChild(TABLE);\n  _hasCaptionProblem = TABLE.offsetHeight < 2 * TABLE.lastChild.offsetHeight; // boolean\n  document.body.removeChild(TABLE);\n}\n\nfunction hasCaptionProblem() {\n  if (_hasCaptionProblem === void 0) {\n    detectCaptionProblem();\n  }\n\n  return _hasCaptionProblem;\n}\n\nvar comparisonFunction = void 0;\n\n/**\n * Get string comparison function for sorting purposes. It supports multilingual string comparison base on Internationalization API.\n *\n * @param {String} [language]\n * @param {Object} [options]\n * @returns {*}\n */\nfunction getComparisonFunction(language) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (comparisonFunction) {\n    return comparisonFunction;\n  }\n\n  if ((typeof Intl === 'undefined' ? 'undefined' : _typeof(Intl)) === 'object') {\n    comparisonFunction = new Intl.Collator(language, options).compare;\n  } else if (typeof String.prototype.localeCompare === 'function') {\n    comparisonFunction = function comparisonFunction(a, b) {\n      return ('' + a).localeCompare(b);\n    };\n  } else {\n    comparisonFunction = function comparisonFunction(a, b) {\n      if (a === b) {\n        return 0;\n      }\n\n      return a > b ? -1 : 1;\n    };\n  }\n\n  return comparisonFunction;\n}\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.toSingleLine = toSingleLine;\n\nvar _array = __webpack_require__(1);\n\n/**\n * Tags a multiline string and return new one without line break characters and following spaces.\n *\n * @param {Array} strings Parts of the entire string without expressions.\n * @param {...String} expressions Expressions converted to strings, which are added to the entire string.\n * @returns {String}\n */\nfunction toSingleLine(strings) {\n  for (var _len = arguments.length, expressions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    expressions[_key - 1] = arguments[_key];\n  }\n\n  var result = (0, _array.arrayReduce)(strings, function (previousValue, currentValue, index) {\n\n    var valueWithoutWhiteSpaces = currentValue.replace(/(?:\\r?\\n\\s+)/g, '');\n    var expressionForIndex = expressions[index] ? expressions[index] : '';\n\n    return previousValue + valueWithoutWhiteSpaces + expressionForIndex;\n  }, '');\n\n  return result.trim();\n} /* eslint-disable import/prefer-default-export */\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.isFunction = isFunction;\nexports.throttle = throttle;\nexports.throttleAfterHits = throttleAfterHits;\nexports.debounce = debounce;\nexports.pipe = pipe;\nexports.partial = partial;\nexports.curry = curry;\nexports.curryRight = curryRight;\n\nvar _array = __webpack_require__(1);\n\n/**\n * Checks if given variable is function.\n *\n * @param {*} func Variable to check.\n * @returns {Boolean}\n */\nfunction isFunction(func) {\n  return typeof func === 'function';\n}\n\n/**\n * Creates throttle function that enforces a maximum number of times a function (`func`) can be called over time (`wait`).\n *\n * @param {Function} func Function to invoke.\n * @param {Number} wait Delay in miliseconds.\n * @returns {Function}\n */\nfunction throttle(func) {\n  var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;\n\n  var lastCalled = 0;\n  var result = {\n    lastCallThrottled: true\n  };\n  var lastTimer = null;\n\n  function _throttle() {\n    var _this = this;\n\n    var args = arguments;\n    var stamp = Date.now();\n    var needCall = false;\n\n    result.lastCallThrottled = true;\n\n    if (!lastCalled) {\n      lastCalled = stamp;\n      needCall = true;\n    }\n    var remaining = wait - (stamp - lastCalled);\n\n    if (needCall) {\n      result.lastCallThrottled = false;\n      func.apply(this, args);\n    } else {\n      if (lastTimer) {\n        clearTimeout(lastTimer);\n      }\n      lastTimer = setTimeout(function () {\n        result.lastCallThrottled = false;\n        func.apply(_this, args);\n        lastCalled = 0;\n        lastTimer = void 0;\n      }, remaining);\n    }\n\n    return result;\n  }\n\n  return _throttle;\n}\n\n/**\n * Creates throttle function that enforces a maximum number of times a function (`func`) can be called over\n * time (`wait`) after specified hits.\n *\n * @param {Function} func Function to invoke.\n * @param {Number} wait Delay in miliseconds.\n * @param {Number} hits Number of hits after throttling will be applied.\n * @returns {Function}\n */\nfunction throttleAfterHits(func) {\n  var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;\n  var hits = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;\n\n  var funcThrottle = throttle(func, wait);\n  var remainHits = hits;\n\n  function _clearHits() {\n    remainHits = hits;\n  }\n  function _throttleAfterHits() {\n    if (remainHits) {\n      remainHits--;\n\n      return func.apply(this, arguments);\n    }\n\n    return funcThrottle.apply(this, arguments);\n  }\n  _throttleAfterHits.clearHits = _clearHits;\n\n  return _throttleAfterHits;\n}\n\n/**\n * Creates debounce function that enforces a function (`func`) not be called again until a certain amount of time (`wait`)\n * has passed without it being called.\n *\n * @param {Function} func Function to invoke.\n * @param {Number} wait Delay in milliseconds.\n * @returns {Function}\n */\nfunction debounce(func) {\n  var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;\n\n  var lastTimer = null;\n  var result = void 0;\n\n  function _debounce() {\n    var _this2 = this;\n\n    var args = arguments;\n\n    if (lastTimer) {\n      clearTimeout(lastTimer);\n    }\n    lastTimer = setTimeout(function () {\n      result = func.apply(_this2, args);\n    }, wait);\n\n    return result;\n  }\n\n  return _debounce;\n}\n\n/**\n * Creates the function that returns the result of calling the given functions. Result of the first function is passed to\n * the second as an argument and so on. Only first function in the chain can handle multiple arguments.\n *\n * @param {Function} functions Functions to compose.\n * @returns {Function}\n */\nfunction pipe() {\n  for (var _len = arguments.length, functions = Array(_len), _key = 0; _key < _len; _key++) {\n    functions[_key] = arguments[_key];\n  }\n\n  var firstFunc = functions[0],\n      restFunc = functions.slice(1);\n\n\n  return function _pipe() {\n    return (0, _array.arrayReduce)(restFunc, function (acc, fn) {\n      return fn(acc);\n    }, firstFunc.apply(this, arguments));\n  };\n}\n\n/**\n * Creates the function that returns the function with cached arguments.\n *\n * @param {Function} func Function to partialization.\n * @param {Array} params Function arguments to cache.\n * @returns {Function}\n */\nfunction partial(func) {\n  for (var _len2 = arguments.length, params = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n    params[_key2 - 1] = arguments[_key2];\n  }\n\n  return function _partial() {\n    for (var _len3 = arguments.length, restParams = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n      restParams[_key3] = arguments[_key3];\n    }\n\n    return func.apply(this, params.concat(restParams));\n  };\n}\n\n/**\n * Creates the functions that returns the function with cached arguments. If count if passed arguments will be matched\n * to the arguments defined in `func` then function will be invoked.\n * Arguments are added to the stack in direction from the left to the right.\n *\n * @example\n * ```\n * var replace = curry(function(find, replace, string) {\n *   return string.replace(find, replace);\n * });\n *\n * // returns function with bounded first argument\n * var replace = replace('foo')\n *\n * // returns replaced string - all arguments was passed so function was invoked\n * replace('bar', 'Some test with foo...');\n *\n * ```\n *\n * @param {Function} func Function to currying.\n * @returns {Function}\n */\nfunction curry(func) {\n  var argsLength = func.length;\n\n  function given(argsSoFar) {\n    return function _curry() {\n      for (var _len4 = arguments.length, params = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        params[_key4] = arguments[_key4];\n      }\n\n      var passedArgsSoFar = argsSoFar.concat(params);\n      var result = void 0;\n\n      if (passedArgsSoFar.length >= argsLength) {\n        result = func.apply(this, passedArgsSoFar);\n      } else {\n        result = given(passedArgsSoFar);\n      }\n\n      return result;\n    };\n  }\n\n  return given([]);\n}\n\n/**\n * Creates the functions that returns the function with cached arguments. If count if passed arguments will be matched\n * to the arguments defined in `func` then function will be invoked.\n * Arguments are added to the stack in direction from the right to the left.\n *\n * @example\n * ```\n * var replace = curry(function(find, replace, string) {\n *   return string.replace(find, replace);\n * });\n *\n * // returns function with bounded first argument\n * var replace = replace('Some test with foo...')\n *\n * // returns replaced string - all arguments was passed so function was invoked\n * replace('bar', 'foo');\n *\n * ```\n *\n * @param {Function} func Function to currying.\n * @returns {Function}\n */\nfunction curryRight(func) {\n  var argsLength = func.length;\n\n  function given(argsSoFar) {\n    return function _curry() {\n      for (var _len5 = arguments.length, params = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n        params[_key5] = arguments[_key5];\n      }\n\n      var passedArgsSoFar = argsSoFar.concat(params.reverse());\n      var result = void 0;\n\n      if (passedArgsSoFar.length >= argsLength) {\n        result = func.apply(this, passedArgsSoFar);\n      } else {\n        result = given(passedArgsSoFar);\n      }\n\n      return result;\n    };\n  }\n\n  return given([]);\n}\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports) {\n\nvar toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports) {\n\nvar core = module.exports = { version: '2.5.5' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nmodule.exports = function (it, TYPE) {\n  if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n  return it;\n};\n\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = __webpack_require__(11)('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(31)(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n  ArrayProto[UNSCOPABLES][key] = true;\n};\n\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.createClassName = createClassName;\nexports.createDefaultCustomBorder = createDefaultCustomBorder;\nexports.createSingleEmptyBorder = createSingleEmptyBorder;\nexports.createDefaultHtBorder = createDefaultHtBorder;\nexports.createEmptyBorders = createEmptyBorders;\nexports.extendDefaultBorder = extendDefaultBorder;\nexports.checkSelectionBorders = checkSelectionBorders;\nexports.markSelected = markSelected;\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\n/**\n * Create separated class name for borders for each cell.\n *\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @returns {String}\n */\nfunction createClassName(row, col) {\n  return 'border_row' + row + 'col' + col;\n}\n\n/**\n * Create default single border for each position (top/right/bottom/left).\n *\n * @returns {Object} `{{width: number, color: string}}`\n */\nfunction createDefaultCustomBorder() {\n  return {\n    width: 1,\n    color: '#000'\n  };\n}\n\n/**\n * Create default object for empty border.\n *\n * @returns {Object} `{{hide: boolean}}`\n */\nfunction createSingleEmptyBorder() {\n  return { hide: true };\n}\n\n/**\n * Create default Handsontable border object.\n *\n * @returns {Object} `{{width: number, color: string, cornerVisible: boolean}}`\n */\nfunction createDefaultHtBorder() {\n  return {\n    width: 1,\n    color: '#000',\n    cornerVisible: false\n  };\n}\n\n/**\n * Prepare empty border for each cell with all custom borders hidden.\n *\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @returns {Object} `{{className: *, border: *, row: *, col: *, top: {hide: boolean}, right: {hide: boolean}, bottom: {hide: boolean}, left: {hide: boolean}}}`\n */\nfunction createEmptyBorders(row, col) {\n  return {\n    className: createClassName(row, col),\n    border: createDefaultHtBorder(),\n    row: row,\n    col: col,\n    top: createSingleEmptyBorder(),\n    right: createSingleEmptyBorder(),\n    bottom: createSingleEmptyBorder(),\n    left: createSingleEmptyBorder()\n  };\n}\n\nfunction extendDefaultBorder(defaultBorder, customBorder) {\n  if ((0, _object.hasOwnProperty)(customBorder, 'border')) {\n    defaultBorder.border = customBorder.border;\n  }\n\n  if ((0, _object.hasOwnProperty)(customBorder, 'top')) {\n    defaultBorder.top = customBorder.top;\n  }\n\n  if ((0, _object.hasOwnProperty)(customBorder, 'right')) {\n    defaultBorder.right = customBorder.right;\n  }\n\n  if ((0, _object.hasOwnProperty)(customBorder, 'bottom')) {\n    defaultBorder.bottom = customBorder.bottom;\n  }\n\n  if ((0, _object.hasOwnProperty)(customBorder, 'left')) {\n    defaultBorder.left = customBorder.left;\n  }\n\n  return defaultBorder;\n}\n\n/**\n * Check if selection has border by className\n *\n * @param hot\n * @param direction\n */\nfunction checkSelectionBorders(hot, direction) {\n  var atLeastOneHasBorder = false;\n\n  (0, _array.arrayEach)(hot.getSelectedRange(), function (range) {\n    range.forAll(function (r, c) {\n      var metaBorders = hot.getCellMeta(r, c).borders;\n\n      if (metaBorders) {\n        if (direction) {\n          if (!(0, _object.hasOwnProperty)(metaBorders[direction], 'hide')) {\n            atLeastOneHasBorder = true;\n            return false; // breaks forAll\n          }\n        } else {\n          atLeastOneHasBorder = true;\n          return false; // breaks forAll\n        }\n      }\n    });\n  });\n\n  return atLeastOneHasBorder;\n}\n\n/**\n * Mark label in contextMenu as selected\n *\n * @param label\n * @returns {string}\n */\nfunction markSelected(label) {\n  return '<span class=\"selected\">' + String.fromCharCode(10003) + '</span>' + label; // workaround for https://github.com/handsontable/handsontable/issues/1946\n}\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports) {\n\nvar id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports) {\n\nmodule.exports = {};\n\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar def = __webpack_require__(20).f;\nvar has = __webpack_require__(29);\nvar TAG = __webpack_require__(11)('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports) {\n\nexports.f = {}.propertyIsEnumerable;\n\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.EditorState = undefined;\n\nvar _src = __webpack_require__(4);\n\nvar _mixed = __webpack_require__(16);\n\nvar EditorState = exports.EditorState = {\n  VIRGIN: 'STATE_VIRGIN', // before editing\n  EDITING: 'STATE_EDITING',\n  WAITING: 'STATE_WAITING', // waiting for async validation\n  FINISHED: 'STATE_FINISHED'\n};\n\nfunction BaseEditor(instance) {\n  this.instance = instance;\n  this.state = EditorState.VIRGIN;\n\n  this._opened = false;\n  this._fullEditMode = false;\n  this._closeCallback = null;\n\n  this.init();\n}\n\nBaseEditor.prototype._fireCallbacks = function (result) {\n  if (this._closeCallback) {\n    this._closeCallback(result);\n    this._closeCallback = null;\n  }\n};\n\nBaseEditor.prototype.init = function () {};\n\nBaseEditor.prototype.getValue = function () {\n  throw Error('Editor getValue() method unimplemented');\n};\n\nBaseEditor.prototype.setValue = function (newValue) {\n  throw Error('Editor setValue() method unimplemented');\n};\n\nBaseEditor.prototype.open = function () {\n  throw Error('Editor open() method unimplemented');\n};\n\nBaseEditor.prototype.close = function () {\n  throw Error('Editor close() method unimplemented');\n};\n\nBaseEditor.prototype.prepare = function (row, col, prop, td, originalValue, cellProperties) {\n  this.TD = td;\n  this.row = row;\n  this.col = col;\n  this.prop = prop;\n  this.originalValue = originalValue;\n  this.cellProperties = cellProperties;\n  this.state = EditorState.VIRGIN;\n};\n\nBaseEditor.prototype.extend = function () {\n  var baseClass = this.constructor;\n\n  function Editor() {\n    baseClass.apply(this, arguments);\n  }\n\n  function inherit(Child, Parent) {\n    function Bridge() {}\n    Bridge.prototype = Parent.prototype;\n    Child.prototype = new Bridge();\n    Child.prototype.constructor = Child;\n\n    return Child;\n  }\n\n  return inherit(Editor, baseClass);\n};\n\nBaseEditor.prototype.saveValue = function (value, ctrlDown) {\n  var selection = void 0;\n  var tmp = void 0;\n\n  // if ctrl+enter and multiple cells selected, behave like Excel (finish editing and apply to all cells)\n  if (ctrlDown) {\n    selection = this.instance.getSelectedLast();\n\n    if (selection[0] > selection[2]) {\n      tmp = selection[0];\n      selection[0] = selection[2];\n      selection[2] = tmp;\n    }\n    if (selection[1] > selection[3]) {\n      tmp = selection[1];\n      selection[1] = selection[3];\n      selection[3] = tmp;\n    }\n  } else {\n    selection = [this.row, this.col, null, null];\n  }\n\n  this.instance.populateFromArray(selection[0], selection[1], value, selection[2], selection[3], 'edit');\n};\n\nBaseEditor.prototype.beginEditing = function (newInitialValue, event) {\n  if (this.state !== EditorState.VIRGIN) {\n    return;\n  }\n  this.instance.view.scrollViewport(new _src.CellCoords(this.row, this.col));\n  this.instance.view.render();\n  this.state = EditorState.EDITING;\n\n  newInitialValue = typeof newInitialValue === 'string' ? newInitialValue : this.originalValue;\n  this.setValue((0, _mixed.stringify)(newInitialValue));\n\n  this.open(event);\n  this._opened = true;\n  this.focus();\n\n  // only rerender the selections (FillHandle should disappear when beginediting is triggered)\n  this.instance.view.render();\n\n  this.instance.runHooks('afterBeginEditing', this.row, this.col);\n};\n\nBaseEditor.prototype.finishEditing = function (restoreOriginalValue, ctrlDown, callback) {\n  var _this = this,\n      val;\n\n  if (callback) {\n    var previousCloseCallback = this._closeCallback;\n\n    this._closeCallback = function (result) {\n      if (previousCloseCallback) {\n        previousCloseCallback(result);\n      }\n\n      callback(result);\n      _this.instance.view.render();\n    };\n  }\n\n  if (this.isWaiting()) {\n    return;\n  }\n\n  if (this.state == EditorState.VIRGIN) {\n    this.instance._registerTimeout(setTimeout(function () {\n      _this._fireCallbacks(true);\n    }, 0));\n\n    return;\n  }\n\n  if (this.state == EditorState.EDITING) {\n    if (restoreOriginalValue) {\n      this.cancelChanges();\n      this.instance.view.render();\n\n      return;\n    }\n\n    var value = this.getValue();\n\n    if (this.instance.getSettings().trimWhitespace) {\n      // We trim only string values\n      val = [[typeof value === 'string' ? String.prototype.trim.call(value || '') : value]];\n    } else {\n      val = [[value]];\n    }\n\n    this.state = EditorState.WAITING;\n    this.saveValue(val, ctrlDown);\n\n    if (this.instance.getCellValidator(this.cellProperties)) {\n      this.instance.addHookOnce('postAfterValidate', function (result) {\n        _this.state = EditorState.FINISHED;\n        _this.discardEditor(result);\n      });\n    } else {\n      this.state = EditorState.FINISHED;\n      this.discardEditor(true);\n    }\n  }\n};\n\nBaseEditor.prototype.cancelChanges = function () {\n  this.state = EditorState.FINISHED;\n  this.discardEditor();\n};\n\nBaseEditor.prototype.discardEditor = function (result) {\n  if (this.state !== EditorState.FINISHED) {\n    return;\n  }\n  // validator was defined and failed\n  if (result === false && this.cellProperties.allowInvalid !== true) {\n    this.instance.selectCell(this.row, this.col);\n    this.focus();\n    this.state = EditorState.EDITING;\n    this._fireCallbacks(false);\n  } else {\n    this.close();\n    this._opened = false;\n    this._fullEditMode = false;\n    this.state = EditorState.VIRGIN;\n    this._fireCallbacks(true);\n  }\n};\n\n/**\n * Switch editor into full edit mode. In this state navigation keys don't close editor. This mode is activated\n * automatically after hit ENTER or F2 key on the cell or while editing cell press F2 key.\n */\nBaseEditor.prototype.enableFullEditMode = function () {\n  this._fullEditMode = true;\n};\n\n/**\n * Checks if editor is in full edit mode.\n *\n * @returns {Boolean}\n */\nBaseEditor.prototype.isInFullEditMode = function () {\n  return this._fullEditMode;\n};\n\nBaseEditor.prototype.isOpened = function () {\n  return this._opened;\n};\n\nBaseEditor.prototype.isWaiting = function () {\n  return this.state === EditorState.WAITING;\n};\n\nBaseEditor.prototype.checkEditorSection = function () {\n  var totalRows = this.instance.countRows();\n  var section = '';\n\n  if (this.row < this.instance.getSettings().fixedRowsTop) {\n    if (this.col < this.instance.getSettings().fixedColumnsLeft) {\n      section = 'top-left-corner';\n    } else {\n      section = 'top';\n    }\n  } else if (this.instance.getSettings().fixedRowsBottom && this.row >= totalRows - this.instance.getSettings().fixedRowsBottom) {\n    if (this.col < this.instance.getSettings().fixedColumnsLeft) {\n      section = 'bottom-left-corner';\n    } else {\n      section = 'bottom';\n    }\n  } else if (this.col < this.instance.getSettings().fixedColumnsLeft) {\n    section = 'left';\n  }\n\n  return section;\n};\n\nexports.default = BaseEditor;\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * CellCoords holds cell coordinates (row, column) and few method to validate them and\n * retrieve as an array or an object\n *\n * @class CellCoords\n */\nvar CellCoords = function () {\n  /**\n   * @param {Number} row Row index\n   * @param {Number} col Column index\n   */\n  function CellCoords(row, col) {\n    _classCallCheck(this, CellCoords);\n\n    if (typeof row !== 'undefined' && typeof col !== 'undefined') {\n      this.row = row;\n      this.col = col;\n    } else {\n      this.row = null;\n      this.col = null;\n    }\n  }\n\n  /**\n   * Checks if given set of coordinates is valid in context of a given Walkontable instance\n   *\n   * @param {Walkontable} wotInstance\n   * @returns {Boolean}\n   */\n\n\n  _createClass(CellCoords, [{\n    key: 'isValid',\n    value: function isValid(wotInstance) {\n      // is it a valid cell index (0 or higher)\n      if (this.row < 0 || this.col < 0) {\n        return false;\n      }\n      // is selection within total rows and columns\n      if (this.row >= wotInstance.getSetting('totalRows') || this.col >= wotInstance.getSetting('totalColumns')) {\n        return false;\n      }\n\n      return true;\n    }\n\n    /**\n     * Checks if this cell coords are the same as cell coords given as a parameter\n     *\n     * @param {CellCoords} cellCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isEqual',\n    value: function isEqual(cellCoords) {\n      if (cellCoords === this) {\n        return true;\n      }\n\n      return this.row === cellCoords.row && this.col === cellCoords.col;\n    }\n\n    /**\n     * Checks if tested coordinates are positioned in south-east from this cell coords\n     *\n     * @param {Object} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSouthEastOf',\n    value: function isSouthEastOf(testedCoords) {\n      return this.row >= testedCoords.row && this.col >= testedCoords.col;\n    }\n\n    /**\n     * Checks if tested coordinates are positioned in north-east from this cell coords\n     *\n     * @param {Object} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNorthWestOf',\n    value: function isNorthWestOf(testedCoords) {\n      return this.row <= testedCoords.row && this.col <= testedCoords.col;\n    }\n\n    /**\n     * Checks if tested coordinates are positioned in south-west from this cell coords\n     *\n     * @param {Object} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSouthWestOf',\n    value: function isSouthWestOf(testedCoords) {\n      return this.row >= testedCoords.row && this.col <= testedCoords.col;\n    }\n\n    /**\n     * Checks if tested coordinates are positioned in north-east from this cell coords\n     *\n     * @param {Object} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNorthEastOf',\n    value: function isNorthEastOf(testedCoords) {\n      return this.row <= testedCoords.row && this.col >= testedCoords.col;\n    }\n\n    /**\n     * Convert CellCoords to literal object.\n     *\n     * @return {Object} Returns a literal object with `row` and `col` properties.\n     */\n\n  }, {\n    key: 'toObject',\n    value: function toObject() {\n      return {\n        row: this.row,\n        col: this.col\n      };\n    }\n  }]);\n\n  return CellCoords;\n}();\n\nexports.default = CellCoords;\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_55__;\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.log = log;\nexports.warn = warn;\nexports.info = info;\nexports.error = error;\n\nvar _mixed = __webpack_require__(16);\n\n/**\n * Logs message to the console if the `console` object is exposed.\n *\n * @param {...*} args Values which will be logged.\n */\nfunction log() {\n  if ((0, _mixed.isDefined)(console)) {\n    var _console;\n\n    (_console = console).log.apply(_console, arguments);\n  }\n} /* eslint-disable no-console */\n/* eslint-disable no-restricted-globals */\n\n/**\n * \"In Internet Explorer 9 (and 8), the console object is only exposed when the developer tools are opened\n * for a particular tab.\"\n *\n * Source: https://stackoverflow.com/a/5473193\n */\n\n;\n\n/**\n * Logs warn to the console if the `console` object is exposed.\n *\n * @param {...*} args Values which will be logged.\n */\nfunction warn() {\n  if ((0, _mixed.isDefined)(console)) {\n    var _console2;\n\n    (_console2 = console).warn.apply(_console2, arguments);\n  }\n};\n\n/**\n * Logs info to the console if the `console` object is exposed.\n *\n * @param {...*} args Values which will be logged.\n */\nfunction info() {\n  if ((0, _mixed.isDefined)(console)) {\n    var _console3;\n\n    (_console3 = console).info.apply(_console3, arguments);\n  }\n};\n\n/**\n * Logs error to the console if the `console` object is exposed.\n *\n * @param {...*} args Values which will be logged.\n */\nfunction error() {\n  if ((0, _mixed.isDefined)(console)) {\n    var _console4;\n\n    (_console4 = console).error.apply(_console4, arguments);\n  }\n};\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _autoResize = __webpack_require__(233);\n\nvar _autoResize2 = _interopRequireDefault(_autoResize);\n\nvar _baseEditor = __webpack_require__(53);\n\nvar _baseEditor2 = _interopRequireDefault(_baseEditor);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _unicode = __webpack_require__(21);\n\nvar _event = __webpack_require__(12);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar TextEditor = _baseEditor2.default.prototype.extend();\n\n/**\n * @private\n * @editor TextEditor\n * @class TextEditor\n * @dependencies autoResize\n */\nTextEditor.prototype.init = function () {\n  var that = this;\n  this.createElements();\n  this.eventManager = new _eventManager2.default(this);\n  this.bindEvents();\n  this.autoResize = (0, _autoResize2.default)();\n\n  this.instance.addHook('afterDestroy', function () {\n    that.destroy();\n  });\n};\n\nTextEditor.prototype.getValue = function () {\n  return this.TEXTAREA.value;\n};\n\nTextEditor.prototype.setValue = function (newValue) {\n  this.TEXTAREA.value = newValue;\n};\n\nvar onBeforeKeyDown = function onBeforeKeyDown(event) {\n  var instance = this,\n      that = instance.getActiveEditor(),\n      ctrlDown;\n\n  // catch CTRL but not right ALT (which in some systems triggers ALT+CTRL)\n  ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey;\n\n  // Process only events that have been fired in the editor\n  if (event.target !== that.TEXTAREA || (0, _event.isImmediatePropagationStopped)(event)) {\n    return;\n  }\n\n  if (event.keyCode === 17 || event.keyCode === 224 || event.keyCode === 91 || event.keyCode === 93) {\n    // when CTRL or its equivalent is pressed and cell is edited, don't prepare selectable text in textarea\n    (0, _event.stopImmediatePropagation)(event);\n    return;\n  }\n\n  switch (event.keyCode) {\n    case _unicode.KEY_CODES.ARROW_RIGHT:\n      if (that.isInFullEditMode()) {\n        if (!that.isWaiting() && !that.allowKeyEventPropagation || !that.isWaiting() && that.allowKeyEventPropagation && !that.allowKeyEventPropagation(event.keyCode)) {\n          (0, _event.stopImmediatePropagation)(event);\n        }\n      }\n      break;\n    case _unicode.KEY_CODES.ARROW_LEFT:\n      if (that.isInFullEditMode()) {\n        if (!that.isWaiting() && !that.allowKeyEventPropagation || !that.isWaiting() && that.allowKeyEventPropagation && !that.allowKeyEventPropagation(event.keyCode)) {\n          (0, _event.stopImmediatePropagation)(event);\n        }\n      }\n      break;\n    case _unicode.KEY_CODES.ARROW_UP:\n    case _unicode.KEY_CODES.ARROW_DOWN:\n      if (that.isInFullEditMode()) {\n        if (!that.isWaiting() && !that.allowKeyEventPropagation || !that.isWaiting() && that.allowKeyEventPropagation && !that.allowKeyEventPropagation(event.keyCode)) {\n          (0, _event.stopImmediatePropagation)(event);\n        }\n      }\n      break;\n\n    case _unicode.KEY_CODES.ENTER:\n      {\n        var isMultipleSelection = this.selection.isMultiple();\n\n        if (ctrlDown && !isMultipleSelection || event.altKey) {\n          // if ctrl+enter or alt+enter, add new line\n          if (that.isOpened()) {\n            var caretPosition = (0, _element.getCaretPosition)(that.TEXTAREA);\n            var value = that.getValue();\n            var newValue = value.slice(0, caretPosition) + '\\n' + value.slice(caretPosition);\n\n            that.setValue(newValue);\n\n            (0, _element.setCaretPosition)(that.TEXTAREA, caretPosition + 1);\n          } else {\n            that.beginEditing(that.originalValue + '\\n');\n          }\n          (0, _event.stopImmediatePropagation)(event);\n        }\n        event.preventDefault(); // don't add newline to field\n        break;\n      }\n    case _unicode.KEY_CODES.A:\n    case _unicode.KEY_CODES.X:\n    case _unicode.KEY_CODES.C:\n    case _unicode.KEY_CODES.V:\n      if (ctrlDown) {\n        (0, _event.stopImmediatePropagation)(event); // CTRL+A, CTRL+C, CTRL+V, CTRL+X should only work locally when cell is edited (not in table context)\n      }\n      break;\n\n    case _unicode.KEY_CODES.BACKSPACE:\n    case _unicode.KEY_CODES.DELETE:\n    case _unicode.KEY_CODES.HOME:\n    case _unicode.KEY_CODES.END:\n      (0, _event.stopImmediatePropagation)(event); // backspace, delete, home, end should only work locally when cell is edited (not in table context)\n      break;\n    default:\n      break;\n  }\n\n  if ([_unicode.KEY_CODES.ARROW_UP, _unicode.KEY_CODES.ARROW_RIGHT, _unicode.KEY_CODES.ARROW_DOWN, _unicode.KEY_CODES.ARROW_LEFT].indexOf(event.keyCode) === -1) {\n    that.autoResize.resize(String.fromCharCode(event.keyCode));\n  }\n};\n\nTextEditor.prototype.open = function () {\n  this.refreshDimensions(); // need it instantly, to prevent https://github.com/handsontable/handsontable/issues/348\n\n  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);\n};\n\nTextEditor.prototype.close = function (tdOutside) {\n  this.textareaParentStyle.display = 'none';\n\n  this.autoResize.unObserve();\n\n  if (document.activeElement === this.TEXTAREA) {\n    this.instance.listen(); // don't refocus the table if user focused some cell outside of HT on purpose\n  }\n  this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n};\n\nTextEditor.prototype.focus = function () {\n  this.TEXTAREA.focus();\n  (0, _element.setCaretPosition)(this.TEXTAREA, this.TEXTAREA.value.length);\n};\n\nTextEditor.prototype.createElements = function () {\n  //    this.$body = $(document.body);\n\n  this.TEXTAREA = document.createElement('TEXTAREA');\n\n  (0, _element.addClass)(this.TEXTAREA, 'handsontableInput');\n\n  this.textareaStyle = this.TEXTAREA.style;\n  this.textareaStyle.width = 0;\n  this.textareaStyle.height = 0;\n\n  this.TEXTAREA_PARENT = document.createElement('DIV');\n  (0, _element.addClass)(this.TEXTAREA_PARENT, 'handsontableInputHolder');\n\n  this.textareaParentStyle = this.TEXTAREA_PARENT.style;\n  this.textareaParentStyle.top = 0;\n  this.textareaParentStyle.left = 0;\n  this.textareaParentStyle.display = 'none';\n\n  this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n\n  this.instance.rootElement.appendChild(this.TEXTAREA_PARENT);\n\n  var that = this;\n  this.instance._registerTimeout(setTimeout(function () {\n    that.refreshDimensions();\n  }, 0));\n};\n\nTextEditor.prototype.getEditedCell = function () {\n  var editorSection = this.checkEditorSection(),\n      editedCell;\n\n  switch (editorSection) {\n    case 'top':\n      editedCell = this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 101;\n      break;\n    case 'top-left-corner':\n      editedCell = this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 103;\n      break;\n    case 'bottom-left-corner':\n      editedCell = this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 103;\n      break;\n    case 'left':\n      editedCell = this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 102;\n      break;\n    case 'bottom':\n      editedCell = this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 102;\n      break;\n    default:\n      editedCell = this.instance.getCell(this.row, this.col);\n      this.textareaParentStyle.zIndex = '';\n      break;\n  }\n\n  return editedCell != -1 && editedCell != -2 ? editedCell : void 0;\n};\n\nTextEditor.prototype.refreshValue = function () {\n  var sourceData = this.instance.getSourceDataAtCell(this.row, this.prop);\n  this.originalValue = sourceData;\n\n  this.setValue(sourceData);\n  this.refreshDimensions();\n};\n\nTextEditor.prototype.refreshDimensions = function () {\n  if (this.state !== _baseEditor.EditorState.EDITING) {\n    return;\n  }\n  this.TD = this.getEditedCell();\n\n  // TD is outside of the viewport.\n  if (!this.TD) {\n    this.close(true);\n\n    return;\n  }\n\n  var currentOffset = (0, _element.offset)(this.TD);\n  var containerOffset = (0, _element.offset)(this.instance.rootElement);\n  var scrollableContainer = this.instance.view.wt.wtOverlays.topOverlay.mainTableScrollableElement;\n  var totalRowsCount = this.instance.countRows();\n  var containerScrollTop = scrollableContainer !== window ? scrollableContainer.scrollTop : 0;\n  var containerScrollLeft = scrollableContainer !== window ? scrollableContainer.scrollLeft : 0;\n\n  var editorSection = this.checkEditorSection();\n\n  var scrollTop = ['', 'left'].includes(editorSection) ? containerScrollTop : 0;\n  var scrollLeft = ['', 'top', 'bottom'].includes(editorSection) ? containerScrollLeft : 0;\n\n  // If colHeaders is disabled, cells in the first row have border-top\n  var editTopModifier = currentOffset.top === containerOffset.top ? 0 : 1;\n\n  var settings = this.instance.getSettings();\n  var rowHeadersCount = this.instance.hasRowHeaders();\n  var colHeadersCount = this.instance.hasColHeaders();\n  var backgroundColor = this.TD.style.backgroundColor;\n\n  var editTop = currentOffset.top - containerOffset.top - editTopModifier - scrollTop;\n  var editLeft = currentOffset.left - containerOffset.left - 1 - scrollLeft;\n  var cssTransformOffset = void 0;\n\n  // TODO: Refactor this to the new instance.getCell method (from #ply-59), after 0.12.1 is released\n  switch (editorSection) {\n    case 'top':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'left':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'top-left-corner':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'bottom-left-corner':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'bottom':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.holder.parentNode);\n      break;\n    default:\n      break;\n  }\n\n  if (colHeadersCount && this.instance.getSelectedLast()[0] === 0 || settings.fixedRowsBottom && this.instance.getSelectedLast()[0] === totalRowsCount - settings.fixedRowsBottom) {\n    editTop += 1;\n  }\n\n  if (this.instance.getSelectedLast()[1] === 0) {\n    editLeft += 1;\n  }\n\n  if (cssTransformOffset && cssTransformOffset != -1) {\n    this.textareaParentStyle[cssTransformOffset[0]] = cssTransformOffset[1];\n  } else {\n    (0, _element.resetCssTransform)(this.TEXTAREA_PARENT);\n  }\n\n  this.textareaParentStyle.top = editTop + 'px';\n  this.textareaParentStyle.left = editLeft + 'px';\n\n  var firstRowOffset = this.instance.view.wt.wtViewport.rowsRenderCalculator.startPosition;\n  var firstColumnOffset = this.instance.view.wt.wtViewport.columnsRenderCalculator.startPosition;\n  var horizontalScrollPosition = this.instance.view.wt.wtOverlays.leftOverlay.getScrollPosition();\n  var verticalScrollPosition = this.instance.view.wt.wtOverlays.topOverlay.getScrollPosition();\n  var scrollbarWidth = (0, _element.getScrollbarWidth)();\n\n  var cellTopOffset = this.TD.offsetTop + firstRowOffset - verticalScrollPosition;\n  var cellLeftOffset = this.TD.offsetLeft + firstColumnOffset - horizontalScrollPosition;\n\n  var width = (0, _element.innerWidth)(this.TD) - 8;\n  var actualVerticalScrollbarWidth = (0, _element.hasVerticalScrollbar)(scrollableContainer) ? scrollbarWidth : 0;\n  var actualHorizontalScrollbarWidth = (0, _element.hasHorizontalScrollbar)(scrollableContainer) ? scrollbarWidth : 0;\n  var maxWidth = this.instance.view.maximumVisibleElementWidth(cellLeftOffset) - 9 - actualVerticalScrollbarWidth;\n  var height = this.TD.scrollHeight + 1;\n  var maxHeight = Math.max(this.instance.view.maximumVisibleElementHeight(cellTopOffset) - actualHorizontalScrollbarWidth, 23);\n\n  var cellComputedStyle = (0, _element.getComputedStyle)(this.TD);\n\n  this.TEXTAREA.style.fontSize = cellComputedStyle.fontSize;\n  this.TEXTAREA.style.fontFamily = cellComputedStyle.fontFamily;\n  this.TEXTAREA.style.backgroundColor = ''; // RESET STYLE\n  this.TEXTAREA.style.backgroundColor = backgroundColor ? backgroundColor : (0, _element.getComputedStyle)(this.TEXTAREA).backgroundColor;\n\n  this.autoResize.init(this.TEXTAREA, {\n    minHeight: Math.min(height, maxHeight),\n    maxHeight: maxHeight, // TEXTAREA should never be wider than visible part of the viewport (should not cover the scrollbar)\n    minWidth: Math.min(width, maxWidth),\n    maxWidth: maxWidth // TEXTAREA should never be wider than visible part of the viewport (should not cover the scrollbar)\n  }, true);\n\n  this.textareaParentStyle.display = 'block';\n};\n\nTextEditor.prototype.bindEvents = function () {\n  var editor = this;\n\n  this.eventManager.addEventListener(this.TEXTAREA, 'cut', function (event) {\n    (0, _event.stopPropagation)(event);\n  });\n\n  this.eventManager.addEventListener(this.TEXTAREA, 'paste', function (event) {\n    (0, _event.stopPropagation)(event);\n  });\n\n  this.instance.addHook('afterScrollHorizontally', function () {\n    editor.refreshDimensions();\n  });\n\n  this.instance.addHook('afterScrollVertically', function () {\n    editor.refreshDimensions();\n  });\n\n  this.instance.addHook('afterColumnResize', function () {\n    editor.refreshDimensions();\n    editor.focus();\n  });\n\n  this.instance.addHook('afterRowResize', function () {\n    editor.refreshDimensions();\n    editor.focus();\n  });\n\n  this.instance.addHook('afterDestroy', function () {\n    editor.eventManager.destroy();\n  });\n};\n\nTextEditor.prototype.destroy = function () {\n  this.eventManager.destroy();\n};\n\nexports.default = TextEditor;\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar MIXIN_NAME = 'localHooks';\n\n/**\n * Mixin object to extend objects functionality for local hooks.\n *\n * @type {Object}\n */\nvar localHooks = {\n  /**\n   * Internal hooks storage.\n   */\n  _localHooks: Object.create(null),\n\n  /**\n   * Add hook to the collection.\n   *\n   * @param {String} key Hook name.\n   * @param {Function} callback Hook callback\n   */\n  addLocalHook: function addLocalHook(key, callback) {\n    if (!this._localHooks[key]) {\n      this._localHooks[key] = [];\n    }\n    this._localHooks[key].push(callback);\n  },\n\n\n  /**\n   * Run hooks.\n   *\n   * @param {String} key Hook name.\n   * @param {*} params\n   */\n  runLocalHooks: function runLocalHooks(key) {\n    var _this = this;\n\n    for (var _len = arguments.length, params = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      params[_key - 1] = arguments[_key];\n    }\n\n    if (this._localHooks[key]) {\n      (0, _array.arrayEach)(this._localHooks[key], function (callback) {\n        return callback.apply(_this, params);\n      });\n    }\n  },\n\n\n  /**\n   * Clear all added hooks.\n   */\n  clearLocalHooks: function clearLocalHooks() {\n    this._localHooks = {};\n  }\n};\n\n(0, _object.defineGetter)(localHooks, 'MIXIN_NAME', MIXIN_NAME, {\n  writable: false,\n  enumerable: false\n});\n\nexports.default = localHooks;\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports) {\n\n// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(59);\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar redefine = __webpack_require__(30);\nmodule.exports = function (target, src, safe) {\n  for (var key in src) redefine(target, key, src[key], safe);\n  return target;\n};\n\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it, Constructor, name, forbiddenField) {\n  if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n    throw TypeError(name + ': incorrect invocation!');\n  } return it;\n};\n\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ctx = __webpack_require__(32);\nvar call = __webpack_require__(102);\nvar isArrayIter = __webpack_require__(103);\nvar anObject = __webpack_require__(18);\nvar toLength = __webpack_require__(25);\nvar getIterFn = __webpack_require__(104);\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n  var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n  var f = ctx(fn, that, entries ? 2 : 1);\n  var index = 0;\n  var length, step, iterator, result;\n  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n  // fast case for arrays with default iterator\n  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n    if (result === BREAK || result === RETURN) return result;\n  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n    result = call(iterator, f, step.value, entries);\n    if (result === BREAK || result === RETURN) return result;\n  }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports) {\n\nmodule.exports = false;\n\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar global = __webpack_require__(14);\nvar $export = __webpack_require__(3);\nvar redefine = __webpack_require__(30);\nvar redefineAll = __webpack_require__(61);\nvar meta = __webpack_require__(34);\nvar forOf = __webpack_require__(64);\nvar anInstance = __webpack_require__(63);\nvar isObject = __webpack_require__(9);\nvar fails = __webpack_require__(23);\nvar $iterDetect = __webpack_require__(79);\nvar setToStringTag = __webpack_require__(51);\nvar inheritIfRequired = __webpack_require__(209);\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n  var Base = global[NAME];\n  var C = Base;\n  var ADDER = IS_MAP ? 'set' : 'add';\n  var proto = C && C.prototype;\n  var O = {};\n  var fixMethod = function (KEY) {\n    var fn = proto[KEY];\n    redefine(proto, KEY,\n      KEY == 'delete' ? function (a) {\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'has' ? function has(a) {\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'get' ? function get(a) {\n        return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n        : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n    );\n  };\n  if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n    new C().entries().next();\n  }))) {\n    // create collection constructor\n    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n    redefineAll(C.prototype, methods);\n    meta.NEED = true;\n  } else {\n    var instance = new C();\n    // early implementations not supports chaining\n    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n    // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false\n    var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n    // most early implementations doesn't supports iterables, most modern - not close it correctly\n    var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n    // for early implementations -0 and +0 not the same\n    var BUGGY_ZERO = !IS_WEAK && fails(function () {\n      // V8 ~ Chromium 42- fails only with 5+ elements\n      var $instance = new C();\n      var index = 5;\n      while (index--) $instance[ADDER](index, index);\n      return !$instance.has(-0);\n    });\n    if (!ACCEPT_ITERABLES) {\n      C = wrapper(function (target, iterable) {\n        anInstance(target, C, NAME);\n        var that = inheritIfRequired(new Base(), target, C);\n        if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n        return that;\n      });\n      C.prototype = proto;\n      proto.constructor = C;\n    }\n    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n      fixMethod('delete');\n      fixMethod('has');\n      IS_MAP && fixMethod('get');\n    }\n    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n    // weak collections should not contains .clear method\n    if (IS_WEAK && proto.clear) delete proto.clear;\n  }\n\n  setToStringTag(C, NAME);\n\n  O[NAME] = C;\n  $export($export.G + $export.W + $export.F * (C != Base), O);\n\n  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n  return C;\n};\n\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar pIE = __webpack_require__(52);\nvar createDesc = __webpack_require__(49);\nvar toIObject = __webpack_require__(24);\nvar toPrimitive = __webpack_require__(73);\nvar has = __webpack_require__(29);\nvar IE8_DOM_DEFINE = __webpack_require__(98);\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = __webpack_require__(22) ? gOPD : function getOwnPropertyDescriptor(O, P) {\n  O = toIObject(O);\n  P = toPrimitive(P, true);\n  if (IE8_DOM_DEFINE) try {\n    return gOPD(O, P);\n  } catch (e) { /* empty */ }\n  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = __webpack_require__(32);\nvar IObject = __webpack_require__(75);\nvar toObject = __webpack_require__(33);\nvar toLength = __webpack_require__(25);\nvar asc = __webpack_require__(210);\nmodule.exports = function (TYPE, $create) {\n  var IS_MAP = TYPE == 1;\n  var IS_FILTER = TYPE == 2;\n  var IS_SOME = TYPE == 3;\n  var IS_EVERY = TYPE == 4;\n  var IS_FIND_INDEX = TYPE == 6;\n  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n  var create = $create || asc;\n  return function ($this, callbackfn, that) {\n    var O = toObject($this);\n    var self = IObject(O);\n    var f = ctx(callbackfn, that, 3);\n    var length = toLength(self.length);\n    var index = 0;\n    var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n    var val, res;\n    for (;length > index; index++) if (NO_HOLES || index in self) {\n      val = self[index];\n      res = f(val, index, O);\n      if (TYPE) {\n        if (IS_MAP) result[index] = res;   // map\n        else if (res) switch (TYPE) {\n          case 3: return true;             // some\n          case 5: return val;              // find\n          case 6: return index;            // findIndex\n          case 2: result.push(val);        // filter\n        } else if (IS_EVERY) return false; // every\n      }\n    }\n    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n  };\n};\n\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports) {\n\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar hide = __webpack_require__(31);\nvar redefine = __webpack_require__(30);\nvar fails = __webpack_require__(23);\nvar defined = __webpack_require__(38);\nvar wks = __webpack_require__(11);\n\nmodule.exports = function (KEY, length, exec) {\n  var SYMBOL = wks(KEY);\n  var fns = exec(defined, SYMBOL, ''[KEY]);\n  var strfn = fns[0];\n  var rxfn = fns[1];\n  if (fails(function () {\n    var O = {};\n    O[SYMBOL] = function () { return 7; };\n    return ''[KEY](O) != 7;\n  })) {\n    redefine(String.prototype, KEY, strfn);\n    hide(RegExp.prototype, SYMBOL, length == 2\n      // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n      // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n      ? function (string, arg) { return rxfn.call(string, this, arg); }\n      // 21.2.5.6 RegExp.prototype[@@match](string)\n      // 21.2.5.9 RegExp.prototype[@@search](string)\n      : function (string) { return rxfn.call(string, this); }\n    );\n  }\n};\n\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.DEFAULT_LANGUAGE_CODE = exports.getLanguagesDictionaries = exports.getDefaultLanguageDictionary = exports.hasLanguageDictionary = exports.getLanguageDictionary = exports.registerLanguageDictionary = undefined;\n\nvar _object = __webpack_require__(2);\n\nvar _utils = __webpack_require__(197);\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _enUS = __webpack_require__(269);\n\nvar _enUS2 = _interopRequireDefault(_enUS);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar DEFAULT_LANGUAGE_CODE = _enUS2.default.languageCode;\n\nvar _staticRegister = (0, _staticRegister3.default)('languagesDictionaries'),\n    registerGloballyLanguageDictionary = _staticRegister.register,\n    getGlobalLanguageDictionary = _staticRegister.getItem,\n    hasGlobalLanguageDictionary = _staticRegister.hasItem,\n    getGlobalLanguagesDictionaries = _staticRegister.getValues;\n\n/**\n * Register language dictionary for specific language code.\n *\n * @param {String|Object} languageCodeOrDictionary Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE' or object representing dictionary.\n * @param {Object} dictionary Dictionary for specific language (optional if first parameter has already dictionary).\n */\n\n\nfunction registerLanguage(languageCodeOrDictionary, dictionary) {\n  var languageCode = languageCodeOrDictionary;\n\n  // Dictionary passed as first argument.\n  if ((0, _object.isObject)(languageCodeOrDictionary)) {\n    dictionary = languageCodeOrDictionary;\n    languageCode = dictionary.languageCode;\n  }\n\n  extendLanguageDictionary(languageCode, dictionary);\n  registerGloballyLanguageDictionary(languageCode, (0, _object.deepClone)(dictionary));\n\n  // We do not allow user to work with dictionary by reference, it can cause lot of bugs.\n  return (0, _object.deepClone)(dictionary);\n};\n\n/**\n * Get language dictionary for specific language code.\n *\n * @param {String} languageCode Language code.\n * @returns {Object} Object with constants representing identifiers for translation (as keys) and corresponding translation phrases (as values).\n */\nfunction getLanguage(languageCode) {\n  if (!hasLanguage(languageCode)) {\n    return null;\n  }\n\n  return (0, _object.deepClone)(getGlobalLanguageDictionary(languageCode));\n}\n\n/**\n *\n * Get if language with specified language code was registered.\n *\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n * @returns {Boolean}\n */\nfunction hasLanguage(languageCode) {\n  return hasGlobalLanguageDictionary(languageCode);\n}\n\n/**\n * Get default language dictionary.\n *\n * @returns {Object} Object with constants representing identifiers for translation (as keys) and corresponding translation phrases (as values).\n */\nfunction getDefaultLanguage() {\n  return _enUS2.default;\n}\n\n/**\n * Extend handled dictionary by default language dictionary. As result, if any dictionary key isn't defined for specific language, it will be filled with default language value (\"dictionary gaps\" are supplemented).\n *\n * @private\n * @param {String} languageCode Language code.\n * @param {Object} dictionary Dictionary which is extended.\n */\nfunction extendLanguageDictionary(languageCode, dictionary) {\n  if (languageCode !== DEFAULT_LANGUAGE_CODE) {\n    (0, _utils.extendNotExistingKeys)(dictionary, getGlobalLanguageDictionary(DEFAULT_LANGUAGE_CODE));\n  }\n}\n\n/**\n * Get registered language dictionaries.\n *\n * @returns {Array}\n */\nfunction getLanguages() {\n  return getGlobalLanguagesDictionaries();\n}\n\nexports.registerLanguageDictionary = registerLanguage;\nexports.getLanguageDictionary = getLanguage;\nexports.hasLanguageDictionary = hasLanguage;\nexports.getDefaultLanguageDictionary = getDefaultLanguage;\nexports.getLanguagesDictionaries = getLanguages;\nexports.DEFAULT_LANGUAGE_CODE = DEFAULT_LANGUAGE_CODE;\n\n/**\n * Automatically registers default dictionary.\n */\n\nregisterLanguage(_enUS2.default);\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nvar document = __webpack_require__(14).document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(9);\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(18);\nvar dPs = __webpack_require__(207);\nvar enumBugKeys = __webpack_require__(78);\nvar IE_PROTO = __webpack_require__(76)('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = __webpack_require__(72)('iframe');\n  var i = enumBugKeys.length;\n  var lt = '<';\n  var gt = '>';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  __webpack_require__(101).appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n  return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty();\n    Empty[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = createDict();\n  return Properties === undefined ? result : dPs(result, Properties);\n};\n\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(43);\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar shared = __webpack_require__(77)('keys');\nvar uid = __webpack_require__(48);\nmodule.exports = function (key) {\n  return shared[key] || (shared[key] = uid(key));\n};\n\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function (key) {\n  return store[key] || (store[key] = {});\n};\n\n\n/***/ }),\n/* 78 */\n/***/ (function(module, exports) {\n\n// IE 8- don't enum bug keys\nmodule.exports = (\n  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n\n\n/***/ }),\n/* 79 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ITERATOR = __webpack_require__(11)('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n  var riter = [7][ITERATOR]();\n  riter['return'] = function () { SAFE_CLOSING = true; };\n  // eslint-disable-next-line no-throw-literal\n  Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n  if (!skipClosing && !SAFE_CLOSING) return false;\n  var safe = false;\n  try {\n    var arr = [7];\n    var iter = arr[ITERATOR]();\n    iter.next = function () { return { done: safe = true }; };\n    arr[ITERATOR] = function () { return iter; };\n    exec(arr);\n  } catch (e) { /* empty */ }\n  return safe;\n};\n\n\n/***/ }),\n/* 80 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ctx = __webpack_require__(32);\nvar invoke = __webpack_require__(213);\nvar html = __webpack_require__(101);\nvar cel = __webpack_require__(72);\nvar global = __webpack_require__(14);\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n  var id = +this;\n  // eslint-disable-next-line no-prototype-builtins\n  if (queue.hasOwnProperty(id)) {\n    var fn = queue[id];\n    delete queue[id];\n    fn();\n  }\n};\nvar listener = function (event) {\n  run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n  setTask = function setImmediate(fn) {\n    var args = [];\n    var i = 1;\n    while (arguments.length > i) args.push(arguments[i++]);\n    queue[++counter] = function () {\n      // eslint-disable-next-line no-new-func\n      invoke(typeof fn == 'function' ? fn : Function(fn), args);\n    };\n    defer(counter);\n    return counter;\n  };\n  clearTask = function clearImmediate(id) {\n    delete queue[id];\n  };\n  // Node.js 0.8-\n  if (__webpack_require__(43)(process) == 'process') {\n    defer = function (id) {\n      process.nextTick(ctx(run, id, 1));\n    };\n  // Sphere (JS game engine) Dispatch API\n  } else if (Dispatch && Dispatch.now) {\n    defer = function (id) {\n      Dispatch.now(ctx(run, id, 1));\n    };\n  // Browsers with MessageChannel, includes WebWorkers\n  } else if (MessageChannel) {\n    channel = new MessageChannel();\n    port = channel.port2;\n    channel.port1.onmessage = listener;\n    defer = ctx(port.postMessage, port, 1);\n  // Browsers with postMessage, skip WebWorkers\n  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n    defer = function (id) {\n      global.postMessage(id + '', '*');\n    };\n    global.addEventListener('message', listener, false);\n  // IE8-\n  } else if (ONREADYSTATECHANGE in cel('script')) {\n    defer = function (id) {\n      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n        html.removeChild(this);\n        run.call(id);\n      };\n    };\n  // Rest old browsers\n  } else {\n    defer = function (id) {\n      setTimeout(ctx(run, id, 1), 0);\n    };\n  }\n}\nmodule.exports = {\n  set: setTask,\n  clear: clearTask\n};\n\n\n/***/ }),\n/* 81 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = __webpack_require__(99);\nvar hiddenKeys = __webpack_require__(78).concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return $keys(O, hiddenKeys);\n};\n\n\n/***/ }),\n/* 82 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = __webpack_require__(142);\nvar defined = __webpack_require__(38);\n\nmodule.exports = function (that, searchString, NAME) {\n  if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n  return String(defined(that));\n};\n\n\n/***/ }),\n/* 83 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar MATCH = __webpack_require__(11)('match');\nmodule.exports = function (KEY) {\n  var re = /./;\n  try {\n    '/./'[KEY](re);\n  } catch (e) {\n    try {\n      re[MATCH] = false;\n      return !'/./'[KEY](re);\n    } catch (f) { /* empty */ }\n  } return true;\n};\n\n\n/***/ }),\n/* 84 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $defineProperty = __webpack_require__(20);\nvar createDesc = __webpack_require__(49);\n\nmodule.exports = function (object, index, value) {\n  if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n  else object[index] = value;\n};\n\n\n/***/ }),\n/* 85 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar addToUnscopables = __webpack_require__(46);\nvar step = __webpack_require__(108);\nvar Iterators = __webpack_require__(50);\nvar toIObject = __webpack_require__(24);\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = __webpack_require__(106)(Array, 'Array', function (iterated, kind) {\n  this._t = toIObject(iterated); // target\n  this._i = 0;                   // next index\n  this._k = kind;                // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var kind = this._k;\n  var index = this._i++;\n  if (!O || index >= O.length) {\n    this._t = undefined;\n    return step(1);\n  }\n  if (kind == 'keys') return step(0, index);\n  if (kind == 'values') return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n\n/***/ }),\n/* 86 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _coords = __webpack_require__(54);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * A cell range is a set of exactly two CellCoords (that can be the same or different).\n *\n * @class CellRange\n */\nvar CellRange = function () {\n  /**\n   * @param {CellCoords} highlight Used to draw bold border around a cell where selection was\n   *                               started and to edit the cell when you press Enter.\n   * @param {CellCoords} [from] Usually the same as highlight, but in Excel there is distinction - one can change\n   *                            highlight within a selection.\n   * @param {CellCoords} [to] End selection.\n   */\n  function CellRange(highlight) {\n    var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : highlight;\n    var to = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : highlight;\n\n    _classCallCheck(this, CellRange);\n\n    this.highlight = highlight;\n    this.from = from;\n    this.to = to;\n  }\n\n  /**\n   * Set the new coordinates for highlighting selection.\n   *\n   * @param {CellCoords} coords Coordinates to use.\n   */\n\n\n  _createClass(CellRange, [{\n    key: 'setHighlight',\n    value: function setHighlight(coords) {\n      this.highlight = coords;\n\n      return this;\n    }\n\n    /**\n     * Set the new coordinates where selection starts from.\n     *\n     * @param {CellCoords} coords Coordinates to use.\n     */\n\n  }, {\n    key: 'setFrom',\n    value: function setFrom(coords) {\n      this.from = coords;\n\n      return this;\n    }\n\n    /**\n     * Set new coordinates where selection ends from.\n     *\n     * @param {CellCoords} coords Coordinates to use.\n     */\n\n  }, {\n    key: 'setTo',\n    value: function setTo(coords) {\n      this.to = coords;\n\n      return this;\n    }\n\n    /**\n     * Checks if given coords are valid in context of a given Walkontable instance\n     *\n     * @param {Walkontable} wotInstance\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isValid',\n    value: function isValid(wotInstance) {\n      return this.from.isValid(wotInstance) && this.to.isValid(wotInstance);\n    }\n\n    /**\n     * Checks if this cell range is restricted to one cell\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSingle',\n    value: function isSingle() {\n      return this.from.row === this.to.row && this.from.col === this.to.col;\n    }\n\n    /**\n     * Returns selected range height (in number of rows)\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getHeight',\n    value: function getHeight() {\n      return Math.max(this.from.row, this.to.row) - Math.min(this.from.row, this.to.row) + 1;\n    }\n\n    /**\n     * Returns selected range width (in number of columns)\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getWidth',\n    value: function getWidth() {\n      return Math.max(this.from.col, this.to.col) - Math.min(this.from.col, this.to.col) + 1;\n    }\n\n    /**\n     * Checks if given cell coords is within `from` and `to` cell coords of this range\n     *\n     * @param {CellCoords} cellCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'includes',\n    value: function includes(cellCoords) {\n      var row = cellCoords.row,\n          col = cellCoords.col;\n\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n\n      return topLeft.row <= row && bottomRight.row >= row && topLeft.col <= col && bottomRight.col >= col;\n    }\n\n    /**\n     * Checks if given range is within of this range\n     *\n     * @param {CellRange} testedRange\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'includesRange',\n    value: function includesRange(testedRange) {\n      return this.includes(testedRange.getTopLeftCorner()) && this.includes(testedRange.getBottomRightCorner());\n    }\n\n    /**\n     * Checks if given range is equal to this range\n     *\n     * @param {CellRange} testedRange\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isEqual',\n    value: function isEqual(testedRange) {\n      return Math.min(this.from.row, this.to.row) === Math.min(testedRange.from.row, testedRange.to.row) && Math.max(this.from.row, this.to.row) === Math.max(testedRange.from.row, testedRange.to.row) && Math.min(this.from.col, this.to.col) === Math.min(testedRange.from.col, testedRange.to.col) && Math.max(this.from.col, this.to.col) === Math.max(testedRange.from.col, testedRange.to.col);\n    }\n\n    /**\n     * Checks if tested range overlaps with the range.\n     * Range A is considered to to be overlapping with range B if intersection of A and B or B and A is not empty.\n     *\n     * @param {CellRange} testedRange\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'overlaps',\n    value: function overlaps(testedRange) {\n      return testedRange.isSouthEastOf(this.getTopLeftCorner()) && testedRange.isNorthWestOf(this.getBottomRightCorner());\n    }\n\n    /**\n     * @param {CellRange} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSouthEastOf',\n    value: function isSouthEastOf(testedCoords) {\n      return this.getTopLeftCorner().isSouthEastOf(testedCoords) || this.getBottomRightCorner().isSouthEastOf(testedCoords);\n    }\n\n    /**\n     * @param {CellRange} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNorthWestOf',\n    value: function isNorthWestOf(testedCoords) {\n      return this.getTopLeftCorner().isNorthWestOf(testedCoords) || this.getBottomRightCorner().isNorthWestOf(testedCoords);\n    }\n\n    /**\n     * Returns `true` if the provided range is overlapping the current range horizontally\n     * (e.g. the current range's last column is 5 and the provided range's first column is 3).\n     *\n     * @param {CellRange} range The range to check against.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isOverlappingHorizontally',\n    value: function isOverlappingHorizontally(range) {\n      return this.getTopRightCorner().col >= range.getTopLeftCorner().col && this.getTopRightCorner().col <= range.getTopRightCorner().col || this.getTopLeftCorner().col <= range.getTopRightCorner().col && this.getTopLeftCorner().col >= range.getTopLeftCorner().col;\n    }\n\n    /**\n     * Returns `true` if the provided range is overlapping the current range vertically\n     * (e.g. the current range's last row is 5 and the provided range's first row is 3).\n     *\n     * @param {CellRange} range The range to check against.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isOverlappingVertically',\n    value: function isOverlappingVertically(range) {\n      return this.getBottomRightCorner().row >= range.getTopRightCorner().row && this.getBottomRightCorner().row <= range.getBottomRightCorner().row || this.getTopRightCorner().row <= range.getBottomRightCorner().row && this.getTopRightCorner().row >= range.getTopRightCorner().row;\n    }\n\n    /**\n     * Adds a cell to a range (only if exceeds corners of the range). Returns information if range was expanded\n     *\n     * @param {CellCoords} cellCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'expand',\n    value: function expand(cellCoords) {\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n\n      if (cellCoords.row < topLeft.row || cellCoords.col < topLeft.col || cellCoords.row > bottomRight.row || cellCoords.col > bottomRight.col) {\n        this.from = new _coords2.default(Math.min(topLeft.row, cellCoords.row), Math.min(topLeft.col, cellCoords.col));\n        this.to = new _coords2.default(Math.max(bottomRight.row, cellCoords.row), Math.max(bottomRight.col, cellCoords.col));\n\n        return true;\n      }\n\n      return false;\n    }\n\n    /**\n     * @param {CellRange} expandingRange\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'expandByRange',\n    value: function expandByRange(expandingRange) {\n      if (this.includesRange(expandingRange) || !this.overlaps(expandingRange)) {\n        return false;\n      }\n\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n      var initialDirection = this.getDirection();\n\n      var expandingTopLeft = expandingRange.getTopLeftCorner();\n      var expandingBottomRight = expandingRange.getBottomRightCorner();\n\n      var resultTopRow = Math.min(topLeft.row, expandingTopLeft.row);\n      var resultTopCol = Math.min(topLeft.col, expandingTopLeft.col);\n      var resultBottomRow = Math.max(bottomRight.row, expandingBottomRight.row);\n      var resultBottomCol = Math.max(bottomRight.col, expandingBottomRight.col);\n\n      var finalFrom = new _coords2.default(resultTopRow, resultTopCol);\n      var finalTo = new _coords2.default(resultBottomRow, resultBottomCol);\n\n      this.from = finalFrom;\n      this.to = finalTo;\n\n      this.setDirection(initialDirection);\n\n      if (this.highlight.row === this.getBottomRightCorner().row && this.getVerticalDirection() === 'N-S') {\n        this.flipDirectionVertically();\n      }\n\n      if (this.highlight.col === this.getTopRightCorner().col && this.getHorizontalDirection() === 'W-E') {\n        this.flipDirectionHorizontally();\n      }\n\n      return true;\n    }\n\n    /**\n     * @returns {String}\n     */\n\n  }, {\n    key: 'getDirection',\n    value: function getDirection() {\n      if (this.from.isNorthWestOf(this.to)) {\n        // NorthWest - SouthEast\n        return 'NW-SE';\n      } else if (this.from.isNorthEastOf(this.to)) {\n        // NorthEast - SouthWest\n        return 'NE-SW';\n      } else if (this.from.isSouthEastOf(this.to)) {\n        // SouthEast - NorthWest\n        return 'SE-NW';\n      } else if (this.from.isSouthWestOf(this.to)) {\n        // SouthWest - NorthEast\n        return 'SW-NE';\n      }\n    }\n\n    /**\n     * Get the vertical direction of the range.\n     *\n     * @returns {String} Available options: `N-S` (north->south), `S-N` (south->north).\n     */\n\n  }, {\n    key: 'getVerticalDirection',\n    value: function getVerticalDirection() {\n      return ['NE-SW', 'NW-SE'].indexOf(this.getDirection()) > -1 ? 'N-S' : 'S-N';\n    }\n\n    /**\n     * Get the horizontal direction of the range.\n     *\n     * @returns {String} Available options: `W-E` (west->east), `E-W` (east->west).\n     */\n\n  }, {\n    key: 'getHorizontalDirection',\n    value: function getHorizontalDirection() {\n      return ['NW-SE', 'SW-NE'].indexOf(this.getDirection()) > -1 ? 'W-E' : 'E-W';\n    }\n\n    /**\n     * @param {String} direction\n     */\n\n  }, {\n    key: 'setDirection',\n    value: function setDirection(direction) {\n      switch (direction) {\n        case 'NW-SE':\n          var _ref = [this.getTopLeftCorner(), this.getBottomRightCorner()];\n          this.from = _ref[0];\n          this.to = _ref[1];\n\n          break;\n        case 'NE-SW':\n          var _ref2 = [this.getTopRightCorner(), this.getBottomLeftCorner()];\n          this.from = _ref2[0];\n          this.to = _ref2[1];\n\n          break;\n        case 'SE-NW':\n          var _ref3 = [this.getBottomRightCorner(), this.getTopLeftCorner()];\n          this.from = _ref3[0];\n          this.to = _ref3[1];\n\n          break;\n        case 'SW-NE':\n          var _ref4 = [this.getBottomLeftCorner(), this.getTopRightCorner()];\n          this.from = _ref4[0];\n          this.to = _ref4[1];\n\n          break;\n        default:\n          break;\n      }\n    }\n\n    /**\n     * Flip the direction vertically. (e.g. `NW-SE` changes to `SW-NE`)\n     */\n\n  }, {\n    key: 'flipDirectionVertically',\n    value: function flipDirectionVertically() {\n      var direction = this.getDirection();\n      switch (direction) {\n        case 'NW-SE':\n          this.setDirection('SW-NE');\n          break;\n        case 'NE-SW':\n          this.setDirection('SE-NW');\n          break;\n        case 'SE-NW':\n          this.setDirection('NE-SW');\n          break;\n        case 'SW-NE':\n          this.setDirection('NW-SE');\n          break;\n        default:\n          break;\n      }\n    }\n\n    /**\n     * Flip the direction horizontally. (e.g. `NW-SE` changes to `NE-SW`)\n     */\n\n  }, {\n    key: 'flipDirectionHorizontally',\n    value: function flipDirectionHorizontally() {\n      var direction = this.getDirection();\n      switch (direction) {\n        case 'NW-SE':\n          this.setDirection('NE-SW');\n          break;\n        case 'NE-SW':\n          this.setDirection('NW-SE');\n          break;\n        case 'SE-NW':\n          this.setDirection('SW-NE');\n          break;\n        case 'SW-NE':\n          this.setDirection('SE-NW');\n          break;\n        default:\n          break;\n      }\n    }\n\n    /**\n     * Get top left corner of this range\n     *\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getTopLeftCorner',\n    value: function getTopLeftCorner() {\n      return new _coords2.default(Math.min(this.from.row, this.to.row), Math.min(this.from.col, this.to.col));\n    }\n\n    /**\n     * Get bottom right corner of this range\n     *\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getBottomRightCorner',\n    value: function getBottomRightCorner() {\n      return new _coords2.default(Math.max(this.from.row, this.to.row), Math.max(this.from.col, this.to.col));\n    }\n\n    /**\n     * Get top right corner of this range\n     *\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getTopRightCorner',\n    value: function getTopRightCorner() {\n      return new _coords2.default(Math.min(this.from.row, this.to.row), Math.max(this.from.col, this.to.col));\n    }\n\n    /**\n     * Get bottom left corner of this range\n     *\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getBottomLeftCorner',\n    value: function getBottomLeftCorner() {\n      return new _coords2.default(Math.max(this.from.row, this.to.row), Math.min(this.from.col, this.to.col));\n    }\n\n    /**\n     * @param {CellCoords} coords\n     * @param {CellRange} expandedRange\n     * @returns {*}\n     */\n\n  }, {\n    key: 'isCorner',\n    value: function isCorner(coords, expandedRange) {\n      if (expandedRange && expandedRange.includes(coords) && (this.getTopLeftCorner().isEqual(new _coords2.default(expandedRange.from.row, expandedRange.from.col)) || this.getTopRightCorner().isEqual(new _coords2.default(expandedRange.from.row, expandedRange.to.col)) || this.getBottomLeftCorner().isEqual(new _coords2.default(expandedRange.to.row, expandedRange.from.col)) || this.getBottomRightCorner().isEqual(new _coords2.default(expandedRange.to.row, expandedRange.to.col)))) {\n        return true;\n      }\n\n      return coords.isEqual(this.getTopLeftCorner()) || coords.isEqual(this.getTopRightCorner()) || coords.isEqual(this.getBottomLeftCorner()) || coords.isEqual(this.getBottomRightCorner());\n    }\n\n    /**\n     * @param {CellCoords} coords\n     * @param {CellRange} expandedRange\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getOppositeCorner',\n    value: function getOppositeCorner(coords, expandedRange) {\n      if (!(coords instanceof _coords2.default)) {\n        return false;\n      }\n\n      if (expandedRange) {\n        if (expandedRange.includes(coords)) {\n          if (this.getTopLeftCorner().isEqual(new _coords2.default(expandedRange.from.row, expandedRange.from.col))) {\n            return this.getBottomRightCorner();\n          }\n          if (this.getTopRightCorner().isEqual(new _coords2.default(expandedRange.from.row, expandedRange.to.col))) {\n            return this.getBottomLeftCorner();\n          }\n          if (this.getBottomLeftCorner().isEqual(new _coords2.default(expandedRange.to.row, expandedRange.from.col))) {\n            return this.getTopRightCorner();\n          }\n          if (this.getBottomRightCorner().isEqual(new _coords2.default(expandedRange.to.row, expandedRange.to.col))) {\n            return this.getTopLeftCorner();\n          }\n        }\n      }\n\n      if (coords.isEqual(this.getBottomRightCorner())) {\n        return this.getTopLeftCorner();\n      } else if (coords.isEqual(this.getTopLeftCorner())) {\n        return this.getBottomRightCorner();\n      } else if (coords.isEqual(this.getTopRightCorner())) {\n        return this.getBottomLeftCorner();\n      } else if (coords.isEqual(this.getBottomLeftCorner())) {\n        return this.getTopRightCorner();\n      }\n    }\n\n    /**\n     * @param {CellRange} range\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getBordersSharedWith',\n    value: function getBordersSharedWith(range) {\n      if (!this.includesRange(range)) {\n        return [];\n      }\n\n      var thisBorders = {\n        top: Math.min(this.from.row, this.to.row),\n        bottom: Math.max(this.from.row, this.to.row),\n        left: Math.min(this.from.col, this.to.col),\n        right: Math.max(this.from.col, this.to.col)\n      };\n      var rangeBorders = {\n        top: Math.min(range.from.row, range.to.row),\n        bottom: Math.max(range.from.row, range.to.row),\n        left: Math.min(range.from.col, range.to.col),\n        right: Math.max(range.from.col, range.to.col)\n      };\n      var result = [];\n\n      if (thisBorders.top == rangeBorders.top) {\n        result.push('top');\n      }\n      if (thisBorders.right == rangeBorders.right) {\n        result.push('right');\n      }\n      if (thisBorders.bottom == rangeBorders.bottom) {\n        result.push('bottom');\n      }\n      if (thisBorders.left == rangeBorders.left) {\n        result.push('left');\n      }\n\n      return result;\n    }\n\n    /**\n     * Get inner selected cell coords defined by this range\n     *\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getInner',\n    value: function getInner() {\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n      var out = [];\n\n      for (var r = topLeft.row; r <= bottomRight.row; r++) {\n        for (var c = topLeft.col; c <= bottomRight.col; c++) {\n          if (!(this.from.row === r && this.from.col === c) && !(this.to.row === r && this.to.col === c)) {\n            out.push(new _coords2.default(r, c));\n          }\n        }\n      }\n      return out;\n    }\n\n    /**\n     * Get all selected cell coords defined by this range\n     *\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getAll',\n    value: function getAll() {\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n      var out = [];\n\n      for (var r = topLeft.row; r <= bottomRight.row; r++) {\n        for (var c = topLeft.col; c <= bottomRight.col; c++) {\n          if (topLeft.row === r && topLeft.col === c) {\n            out.push(topLeft);\n          } else if (bottomRight.row === r && bottomRight.col === c) {\n            out.push(bottomRight);\n          } else {\n            out.push(new _coords2.default(r, c));\n          }\n        }\n      }\n\n      return out;\n    }\n\n    /**\n     * Runs a callback function against all cells in the range. You can break the iteration by returning\n     * `false` in the callback function\n     *\n     * @param callback {Function}\n     */\n\n  }, {\n    key: 'forAll',\n    value: function forAll(callback) {\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n\n      for (var r = topLeft.row; r <= bottomRight.row; r++) {\n        for (var c = topLeft.col; c <= bottomRight.col; c++) {\n          var breakIteration = callback(r, c);\n\n          if (breakIteration === false) {\n            return;\n          }\n        }\n      }\n    }\n\n    /**\n     * Convert CellRange to literal object.\n     *\n     * @return {Object} Returns a literal object with `from` and `to` properties which each of that object\n     *                  contains `row` and `col` keys.\n     */\n\n  }, {\n    key: 'toObject',\n    value: function toObject() {\n      return {\n        from: this.from.toObject(),\n        to: this.to.toObject()\n      };\n    }\n  }]);\n\n  return CellRange;\n}();\n\nexports.default = CellRange;\n\n/***/ }),\n/* 87 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getRegisteredCellTypes = exports.getRegisteredCellTypeNames = exports.hasCellType = exports.getCellType = exports.registerCellType = undefined;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar _autocompleteType = __webpack_require__(254);\n\nvar _autocompleteType2 = _interopRequireDefault(_autocompleteType);\n\nvar _checkboxType = __webpack_require__(255);\n\nvar _checkboxType2 = _interopRequireDefault(_checkboxType);\n\nvar _dateType = __webpack_require__(256);\n\nvar _dateType2 = _interopRequireDefault(_dateType);\n\nvar _dropdownType = __webpack_require__(257);\n\nvar _dropdownType2 = _interopRequireDefault(_dropdownType);\n\nvar _handsontableType = __webpack_require__(258);\n\nvar _handsontableType2 = _interopRequireDefault(_handsontableType);\n\nvar _numericType = __webpack_require__(259);\n\nvar _numericType2 = _interopRequireDefault(_numericType);\n\nvar _passwordType = __webpack_require__(260);\n\nvar _passwordType2 = _interopRequireDefault(_passwordType);\n\nvar _textType = __webpack_require__(261);\n\nvar _textType2 = _interopRequireDefault(_textType);\n\nvar _timeType = __webpack_require__(262);\n\nvar _timeType2 = _interopRequireDefault(_timeType);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _staticRegister = (0, _staticRegister3.default)('cellTypes'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem,\n    hasItem = _staticRegister.hasItem,\n    getNames = _staticRegister.getNames,\n    getValues = _staticRegister.getValues;\n\n_register('autocomplete', _autocompleteType2.default);\n_register('checkbox', _checkboxType2.default);\n_register('date', _dateType2.default);\n_register('dropdown', _dropdownType2.default);\n_register('handsontable', _handsontableType2.default);\n_register('numeric', _numericType2.default);\n_register('password', _passwordType2.default);\n_register('text', _textType2.default);\n_register('time', _timeType2.default);\n\n/**\n * Retrieve cell type object.\n *\n * @param {String} name Cell type identification.\n * @returns {Object} Returns cell type object.\n */\nfunction _getItem(name) {\n  if (!hasItem(name)) {\n    throw Error('You declared cell type \"' + name + '\" as a string that is not mapped to a known object.\\n                 Cell type must be an object or a string mapped to an object registered by \"Handsontable.cellTypes.registerCellType\" method');\n  }\n\n  return getItem(name);\n}\n\n/**\n * Register cell type under specified name.\n *\n * @param {String} name Cell type identification.\n * @param {Object} type An object with contains keys (eq: `editor`, `renderer`, `validator`) which describes specified behaviour of the cell.\n */\nfunction _register(name, type) {\n  var editor = type.editor,\n      renderer = type.renderer,\n      validator = type.validator;\n\n\n  if (editor) {\n    (0, _editors.registerEditor)(name, editor);\n  }\n  if (renderer) {\n    (0, _renderers.registerRenderer)(name, renderer);\n  }\n  if (validator) {\n    (0, _validators.registerValidator)(name, validator);\n  }\n\n  register(name, type);\n}\n\nexports.registerCellType = _register;\nexports.getCellType = _getItem;\nexports.hasCellType = hasItem;\nexports.getRegisteredCellTypeNames = getNames;\nexports.getRegisteredCellTypes = getValues;\n\n/***/ }),\n/* 88 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['Deprecation warning: This method is going to be removed in the next release. \\n      If you want to select a cell using props, please use the `selectCell` method.'], ['Deprecation warning: This method is going to be removed in the next release.\\\\x20\\n      If you want to select a cell using props, please use the \\\\`selectCell\\\\` method.']);\n\nexports.default = Core;\n\nvar _element = __webpack_require__(0);\n\nvar _setting = __webpack_require__(89);\n\nvar _function = __webpack_require__(42);\n\nvar _console = __webpack_require__(56);\n\nvar _mixed = __webpack_require__(16);\n\nvar _browser = __webpack_require__(27);\n\nvar _dataMap = __webpack_require__(263);\n\nvar _dataMap2 = _interopRequireDefault(_dataMap);\n\nvar _editorManager = __webpack_require__(266);\n\nvar _editorManager2 = _interopRequireDefault(_editorManager);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _templateLiteralTag = __webpack_require__(41);\n\nvar _plugins = __webpack_require__(8);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar _string = __webpack_require__(36);\n\nvar _number = __webpack_require__(5);\n\nvar _tableView = __webpack_require__(267);\n\nvar _tableView2 = _interopRequireDefault(_tableView);\n\nvar _dataSource = __webpack_require__(268);\n\nvar _dataSource2 = _interopRequireDefault(_dataSource);\n\nvar _data = __webpack_require__(90);\n\nvar _recordTranslator = __webpack_require__(193);\n\nvar _rootInstance = __webpack_require__(194);\n\nvar _src = __webpack_require__(4);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _defaultSettings = __webpack_require__(195);\n\nvar _defaultSettings2 = _interopRequireDefault(_defaultSettings);\n\nvar _cellTypes = __webpack_require__(87);\n\nvar _i18n = __webpack_require__(196);\n\nvar _dictionariesManager = __webpack_require__(71);\n\nvar _utils = __webpack_require__(197);\n\nvar _keyStateObserver = __webpack_require__(198);\n\nvar _selection = __webpack_require__(272);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar activeGuid = null;\n\n/**\n * Handsontable constructor\n *\n * @core\n * @constructor Core\n * @description\n *\n * After Handsontable is constructed, you can modify the grid behavior using the available public methods.\n *\n * ---\n * ## How to call methods\n *\n * These are 2 equal ways to call a Handsontable method:\n *\n * ```js\n * // all following examples assume that you constructed Handsontable like this\n * var ht = new Handsontable(document.getElementById('example1'), options);\n *\n * // now, to use setDataAtCell method, you can either:\n * ht.setDataAtCell(0, 0, 'new value');\n * ```\n *\n * Alternatively, you can call the method using jQuery wrapper (__obsolete__, requires initialization using our jQuery guide\n * ```js\n *   $('#example1').handsontable('setDataAtCell', 0, 0, 'new value');\n * ```\n * ---\n */\nfunction Core(rootElement, userSettings) {\n  var _this = this;\n\n  var rootInstanceSymbol = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n  var priv,\n      datamap,\n      dataSource,\n      grid,\n      editorManager,\n      preventScrollingToCell = false,\n      instance = this,\n      GridSettings = function GridSettings() {},\n      eventManager = new _eventManager2.default(instance);\n\n  (0, _object.extend)(GridSettings.prototype, _defaultSettings2.default.prototype); // create grid settings as a copy of default settings\n  (0, _object.extend)(GridSettings.prototype, userSettings); // overwrite defaults with user settings\n  (0, _object.extend)(GridSettings.prototype, expandType(userSettings));\n\n  (0, _utils.applyLanguageSetting)(GridSettings.prototype, userSettings.language);\n\n  if ((0, _rootInstance.hasValidParameter)(rootInstanceSymbol)) {\n    (0, _rootInstance.registerAsRootInstance)(this);\n  }\n\n  (0, _keyStateObserver.startObserving)();\n\n  this.rootElement = rootElement;\n  this.isHotTableEnv = (0, _element.isChildOfWebComponentTable)(this.rootElement);\n  _eventManager2.default.isHotTableEnv = this.isHotTableEnv;\n\n  this.container = document.createElement('div');\n  this.renderCall = false;\n\n  rootElement.insertBefore(this.container, rootElement.firstChild);\n\n  if (false) {\n    (0, _mixed._injectProductInfo)(userSettings.licenseKey, rootElement);\n  }\n\n  this.guid = 'ht_' + (0, _string.randomString)(); // this is the namespace for global events\n\n  var recordTranslator = (0, _recordTranslator.getTranslator)(instance);\n\n  dataSource = new _dataSource2.default(instance);\n\n  if (!this.rootElement.id || this.rootElement.id.substring(0, 3) === 'ht_') {\n    this.rootElement.id = this.guid; // if root element does not have an id, assign a random id\n  }\n  priv = {\n    cellSettings: [],\n    columnSettings: [],\n    columnsSettingConflicts: ['data', 'width', 'language'],\n    settings: new GridSettings(), // current settings instance\n    selRange: null, // exposed by public method `getSelectedRange`\n    isPopulated: null,\n    scrollable: null,\n    firstRun: true\n  };\n\n  var selection = new _selection.Selection(priv.settings, {\n    countCols: function countCols() {\n      return instance.countCols();\n    },\n    countRows: function countRows() {\n      return instance.countRows();\n    },\n    propToCol: function propToCol(prop) {\n      return datamap.propToCol(prop);\n    },\n    isEditorOpened: function isEditorOpened() {\n      return instance.getActiveEditor() ? instance.getActiveEditor().isOpened() : false;\n    }\n  });\n\n  this.selection = selection;\n\n  this.selection.addLocalHook('beforeSetRangeStart', function (cellCoords) {\n    _this.runHooks('beforeSetRangeStart', cellCoords);\n  });\n\n  this.selection.addLocalHook('beforeSetRangeStartOnly', function (cellCoords) {\n    _this.runHooks('beforeSetRangeStartOnly', cellCoords);\n  });\n\n  this.selection.addLocalHook('beforeSetRangeEnd', function (cellCoords) {\n    _this.runHooks('beforeSetRangeEnd', cellCoords);\n\n    if (cellCoords.row < 0) {\n      cellCoords.row = _this.view.wt.wtTable.getFirstVisibleRow();\n    }\n    if (cellCoords.col < 0) {\n      cellCoords.col = _this.view.wt.wtTable.getFirstVisibleColumn();\n    }\n  });\n\n  this.selection.addLocalHook('afterSetRangeEnd', function (cellCoords) {\n    var preventScrolling = (0, _object.createObjectPropListener)(false);\n    var selectionRange = _this.selection.getSelectedRange();\n\n    var _selectionRange$curre = selectionRange.current(),\n        from = _selectionRange$curre.from,\n        to = _selectionRange$curre.to;\n\n    var selectionLayerLevel = selectionRange.size() - 1;\n\n    _this.runHooks('afterSelection', from.row, from.col, to.row, to.col, preventScrolling, selectionLayerLevel);\n    _this.runHooks('afterSelectionByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), preventScrolling, selectionLayerLevel);\n\n    var isSelectedByAnyHeader = _this.selection.isSelectedByAnyHeader();\n    var currentSelectedRange = _this.selection.selectedRange.current();\n\n    var scrollToCell = true;\n\n    if (preventScrollingToCell) {\n      scrollToCell = false;\n    }\n\n    if (preventScrolling.isTouched()) {\n      scrollToCell = !preventScrolling.value;\n    }\n\n    if (scrollToCell !== false && !isSelectedByAnyHeader) {\n      if (currentSelectedRange && !_this.selection.isMultiple()) {\n        _this.view.scrollViewport(currentSelectedRange.from);\n      } else {\n        _this.view.scrollViewport(cellCoords);\n      }\n    }\n\n    var isSelectedByRowHeader = _this.selection.isSelectedByRowHeader();\n    var isSelectedByColumnHeader = _this.selection.isSelectedByColumnHeader();\n\n    // @TODO: These CSS classes are no longer needed anymore. They are used only as a indicator of the selected\n    // rows/columns in the MergedCells plugin (via border.js#L520 in the walkontable module). After fixing\n    // the Border class this should be removed.\n    if (isSelectedByRowHeader && isSelectedByColumnHeader) {\n      (0, _element.addClass)(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);\n    } else if (isSelectedByRowHeader) {\n      (0, _element.removeClass)(_this.rootElement, 'ht__selection--columns');\n      (0, _element.addClass)(_this.rootElement, 'ht__selection--rows');\n    } else if (isSelectedByColumnHeader) {\n      (0, _element.removeClass)(_this.rootElement, 'ht__selection--rows');\n      (0, _element.addClass)(_this.rootElement, 'ht__selection--columns');\n    } else {\n      (0, _element.removeClass)(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);\n    }\n\n    _this._refreshBorders(null);\n  });\n\n  this.selection.addLocalHook('afterSelectionFinished', function (cellRanges) {\n    var selectionLayerLevel = cellRanges.length - 1;\n    var _cellRanges$selection = cellRanges[selectionLayerLevel],\n        from = _cellRanges$selection.from,\n        to = _cellRanges$selection.to;\n\n\n    _this.runHooks('afterSelectionEnd', from.row, from.col, to.row, to.col, selectionLayerLevel);\n    _this.runHooks('afterSelectionEndByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), selectionLayerLevel);\n  });\n\n  this.selection.addLocalHook('afterIsMultipleSelection', function (isMultiple) {\n    var changedIsMultiple = _this.runHooks('afterIsMultipleSelection', isMultiple.value);\n\n    if (isMultiple.value) {\n      isMultiple.value = changedIsMultiple;\n    }\n  });\n\n  this.selection.addLocalHook('beforeModifyTransformStart', function (cellCoordsDelta) {\n    _this.runHooks('modifyTransformStart', cellCoordsDelta);\n  });\n  this.selection.addLocalHook('afterModifyTransformStart', function (coords, rowTransformDir, colTransformDir) {\n    _this.runHooks('afterModifyTransformStart', coords, rowTransformDir, colTransformDir);\n  });\n  this.selection.addLocalHook('beforeModifyTransformEnd', function (cellCoordsDelta) {\n    _this.runHooks('modifyTransformEnd', cellCoordsDelta);\n  });\n  this.selection.addLocalHook('afterModifyTransformEnd', function (coords, rowTransformDir, colTransformDir) {\n    _this.runHooks('afterModifyTransformEnd', coords, rowTransformDir, colTransformDir);\n  });\n  this.selection.addLocalHook('afterDeselect', function () {\n    editorManager.destroyEditor();\n\n    _this._refreshBorders();\n    (0, _element.removeClass)(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);\n\n    _this.runHooks('afterDeselect');\n  });\n  this.selection.addLocalHook('insertRowRequire', function (totalRows) {\n    _this.alter('insert_row', totalRows, 1, 'auto');\n  });\n  this.selection.addLocalHook('insertColRequire', function (totalCols) {\n    _this.alter('insert_col', totalCols, 1, 'auto');\n  });\n\n  grid = {\n    /**\n     * Inserts or removes rows and columns.\n     *\n     * @memberof Core#\n     * @function alter\n     * @private\n     * @param {String} action Possible values: \"insert_row\", \"insert_col\", \"remove_row\", \"remove_col\".\n     * @param {Number|Array} index Row or column visual index which from the alter action will be triggered.\n     *                             Alter actions such as \"remove_row\" and \"remove_col\" support array indexes in the\n     *                             format `[[index, amount], [index, amount]...]` this can be used to remove\n     *                             non-consecutive columns or rows in one call.\n     * @param {Number} amount Ammount rows or columns to remove.\n     * @param {String} [source] Optional. Source of hook runner.\n     * @param {Boolean} [keepEmptyRows] Optional. Flag for preventing deletion of empty rows.\n     */\n    alter: function alter(action, index, amount, source, keepEmptyRows) {\n      var delta;\n\n      amount = amount || 1;\n\n      function spliceWith(data, index, count, toInject) {\n        var valueFactory = function valueFactory() {\n          var result = void 0;\n\n          if (toInject === 'array') {\n            result = [];\n          } else if (toInject === 'object') {\n            result = {};\n          }\n\n          return result;\n        };\n        var spliceArgs = (0, _array.arrayMap)(new Array(count), function () {\n          return valueFactory();\n        });\n\n        spliceArgs.unshift(index, 0);\n        data.splice.apply(data, _toConsumableArray(spliceArgs));\n      }\n\n      var normalizeIndexesGroup = function normalizeIndexesGroup(indexes) {\n        if (indexes.length === 0) {\n          return [];\n        }\n\n        var sortedIndexes = [].concat(_toConsumableArray(indexes));\n\n        // Sort the indexes in ascending order.\n        sortedIndexes.sort(function (_ref, _ref2) {\n          var _ref4 = _slicedToArray(_ref, 1),\n              indexA = _ref4[0];\n\n          var _ref3 = _slicedToArray(_ref2, 1),\n              indexB = _ref3[0];\n\n          if (indexA === indexB) {\n            return 0;\n          }\n\n          return indexA > indexB ? 1 : -1;\n        });\n\n        // Normalize the {index, amount} groups into bigger groups.\n        var normalizedIndexes = (0, _array.arrayReduce)(sortedIndexes, function (acc, _ref5) {\n          var _ref6 = _slicedToArray(_ref5, 2),\n              index = _ref6[0],\n              amount = _ref6[1];\n\n          var previousItem = acc[acc.length - 1];\n\n          var _previousItem = _slicedToArray(previousItem, 2),\n              prevIndex = _previousItem[0],\n              prevAmount = _previousItem[1];\n\n          var prevLastIndex = prevIndex + prevAmount;\n\n          if (index <= prevLastIndex) {\n            var amountToAdd = Math.max(amount - (prevLastIndex - index), 0);\n\n            previousItem[1] += amountToAdd;\n          } else {\n            acc.push([index, amount]);\n          }\n\n          return acc;\n        }, [sortedIndexes[0]]);\n\n        return normalizedIndexes;\n      };\n\n      /* eslint-disable no-case-declarations */\n      switch (action) {\n        case 'insert_row':\n\n          var numberOfSourceRows = instance.countSourceRows();\n\n          if (instance.getSettings().maxRows === numberOfSourceRows) {\n            return;\n          }\n\n          index = (0, _mixed.isDefined)(index) ? index : numberOfSourceRows;\n\n          delta = datamap.createRow(index, amount, source);\n          spliceWith(priv.cellSettings, index, amount, 'array');\n\n          if (delta) {\n            if (selection.isSelected() && selection.selectedRange.current().from.row >= index) {\n              selection.selectedRange.current().from.row += delta;\n              selection.transformEnd(delta, 0); // will call render() internally\n            } else {\n              instance._refreshBorders(); // it will call render and prepare methods\n            }\n          }\n          break;\n\n        case 'insert_col':\n          delta = datamap.createCol(index, amount, source);\n\n          for (var row = 0, len = instance.countSourceRows(); row < len; row++) {\n            if (priv.cellSettings[row]) {\n              spliceWith(priv.cellSettings[row], index, amount);\n            }\n          }\n\n          if (delta) {\n            if (Array.isArray(instance.getSettings().colHeaders)) {\n              var spliceArray = [index, 0];\n              spliceArray.length += delta; // inserts empty (undefined) elements at the end of an array\n              Array.prototype.splice.apply(instance.getSettings().colHeaders, spliceArray); // inserts empty (undefined) elements into the colHeader array\n            }\n\n            if (selection.isSelected() && selection.selectedRange.current().from.col >= index) {\n              selection.selectedRange.current().from.col += delta;\n              selection.transformEnd(0, delta); // will call render() internally\n            } else {\n              instance._refreshBorders(); // it will call render and prepare methods\n            }\n          }\n          break;\n\n        case 'remove_row':\n\n          var removeRow = function removeRow(indexes) {\n            var offset = 0;\n\n            (0, _array.arrayEach)(indexes, function (_ref7) {\n              var _ref8 = _slicedToArray(_ref7, 2),\n                  index = _ref8[0],\n                  amount = _ref8[1];\n\n              var calcIndex = (0, _mixed.isEmpty)(index) ? instance.countRows() - 1 : Math.max(index - offset, 0);\n\n              // If the 'index' is an integer decrease it by 'offset' otherwise pass it through to make the value\n              // compatible with datamap.removeCol method.\n              if (Number.isInteger(index)) {\n                index = Math.max(index - offset, 0);\n              }\n\n              // TODO: for datamap.removeRow index should be passed as it is (with undefined and null values). If not, the logic\n              // inside the datamap.removeRow breaks the removing functionality.\n              datamap.removeRow(index, amount, source);\n              priv.cellSettings.splice(calcIndex, amount);\n\n              var totalRows = instance.countRows();\n              var fixedRowsTop = instance.getSettings().fixedRowsTop;\n\n              if (fixedRowsTop >= calcIndex + 1) {\n                instance.getSettings().fixedRowsTop -= Math.min(amount, fixedRowsTop - calcIndex);\n              }\n\n              var fixedRowsBottom = instance.getSettings().fixedRowsBottom;\n\n              if (fixedRowsBottom && calcIndex >= totalRows - fixedRowsBottom) {\n                instance.getSettings().fixedRowsBottom -= Math.min(amount, fixedRowsBottom);\n              }\n\n              offset += amount;\n            });\n          };\n\n          if (Array.isArray(index)) {\n            removeRow(normalizeIndexesGroup(index));\n          } else {\n            removeRow([[index, amount]]);\n          }\n\n          grid.adjustRowsAndCols();\n          instance._refreshBorders(); // it will call render and prepare methods\n          break;\n\n        case 'remove_col':\n\n          var removeCol = function removeCol(indexes) {\n            var offset = 0;\n\n            (0, _array.arrayEach)(indexes, function (_ref9) {\n              var _ref10 = _slicedToArray(_ref9, 2),\n                  index = _ref10[0],\n                  amount = _ref10[1];\n\n              var calcIndex = (0, _mixed.isEmpty)(index) ? instance.countCols() - 1 : Math.max(index - offset, 0);\n\n              var visualColumnIndex = recordTranslator.toPhysicalColumn(calcIndex);\n\n              // If the 'index' is an integer decrease it by 'offset' otherwise pass it through to make the value\n              // compatible with datamap.removeCol method.\n              if (Number.isInteger(index)) {\n                index = Math.max(index - offset, 0);\n              }\n\n              // TODO: for datamap.removeCol index should be passed as it is (with undefined and null values). If not, the logic\n              // inside the datamap.removeCol breaks the removing functionality.\n              datamap.removeCol(index, amount, source);\n\n              for (var _row = 0, _len = instance.countSourceRows(); _row < _len; _row++) {\n                if (priv.cellSettings[_row]) {\n                  // if row hasn't been rendered it wouldn't have cellSettings\n                  priv.cellSettings[_row].splice(visualColumnIndex, amount);\n                }\n              }\n              var fixedColumnsLeft = instance.getSettings().fixedColumnsLeft;\n\n              if (fixedColumnsLeft >= calcIndex + 1) {\n                instance.getSettings().fixedColumnsLeft -= Math.min(amount, fixedColumnsLeft - calcIndex);\n              }\n\n              if (Array.isArray(instance.getSettings().colHeaders)) {\n                if (typeof visualColumnIndex === 'undefined') {\n                  visualColumnIndex = -1;\n                }\n                instance.getSettings().colHeaders.splice(visualColumnIndex, amount);\n              }\n\n              offset += amount;\n            });\n          };\n\n          if (Array.isArray(index)) {\n            removeCol(normalizeIndexesGroup(index));\n          } else {\n            removeCol([[index, amount]]);\n          }\n\n          grid.adjustRowsAndCols();\n          instance._refreshBorders(); // it will call render and prepare methods\n\n          break;\n        default:\n          throw new Error('There is no such action \"' + action + '\"');\n      }\n\n      if (!keepEmptyRows) {\n        grid.adjustRowsAndCols(); // makes sure that we did not add rows that will be removed in next refresh\n      }\n    },\n\n\n    /**\n     * Makes sure there are empty rows at the bottom of the table\n     */\n    adjustRowsAndCols: function adjustRowsAndCols() {\n      if (priv.settings.minRows) {\n        // should I add empty rows to data source to meet minRows?\n        var rows = instance.countRows();\n\n        if (rows < priv.settings.minRows) {\n          for (var r = 0, minRows = priv.settings.minRows; r < minRows - rows; r++) {\n            datamap.createRow(instance.countRows(), 1, 'auto');\n          }\n        }\n      }\n      if (priv.settings.minSpareRows) {\n        var emptyRows = instance.countEmptyRows(true);\n\n        // should I add empty rows to meet minSpareRows?\n        if (emptyRows < priv.settings.minSpareRows) {\n          for (; emptyRows < priv.settings.minSpareRows && instance.countSourceRows() < priv.settings.maxRows; emptyRows++) {\n            datamap.createRow(instance.countRows(), 1, 'auto');\n          }\n        }\n      }\n      {\n        var emptyCols = void 0;\n\n        // count currently empty cols\n        if (priv.settings.minCols || priv.settings.minSpareCols) {\n          emptyCols = instance.countEmptyCols(true);\n        }\n\n        // should I add empty cols to meet minCols?\n        if (priv.settings.minCols && !priv.settings.columns && instance.countCols() < priv.settings.minCols) {\n          for (; instance.countCols() < priv.settings.minCols; emptyCols++) {\n            datamap.createCol(instance.countCols(), 1, 'auto');\n          }\n        }\n        // should I add empty cols to meet minSpareCols?\n        if (priv.settings.minSpareCols && !priv.settings.columns && instance.dataType === 'array' && emptyCols < priv.settings.minSpareCols) {\n          for (; emptyCols < priv.settings.minSpareCols && instance.countCols() < priv.settings.maxCols; emptyCols++) {\n            datamap.createCol(instance.countCols(), 1, 'auto');\n          }\n        }\n      }\n      var rowCount = instance.countRows();\n      var colCount = instance.countCols();\n\n      if (rowCount === 0 || colCount === 0) {\n        selection.deselect();\n      }\n\n      if (selection.isSelected()) {\n        (0, _array.arrayEach)(selection.selectedRange, function (range) {\n          var selectionChanged = false;\n          var fromRow = range.from.row;\n          var fromCol = range.from.col;\n          var toRow = range.to.row;\n          var toCol = range.to.col;\n\n          // if selection is outside, move selection to last row\n          if (fromRow > rowCount - 1) {\n            fromRow = rowCount - 1;\n            selectionChanged = true;\n\n            if (toRow > fromRow) {\n              toRow = fromRow;\n            }\n          } else if (toRow > rowCount - 1) {\n            toRow = rowCount - 1;\n            selectionChanged = true;\n\n            if (fromRow > toRow) {\n              fromRow = toRow;\n            }\n          }\n          // if selection is outside, move selection to last row\n          if (fromCol > colCount - 1) {\n            fromCol = colCount - 1;\n            selectionChanged = true;\n\n            if (toCol > fromCol) {\n              toCol = fromCol;\n            }\n          } else if (toCol > colCount - 1) {\n            toCol = colCount - 1;\n            selectionChanged = true;\n\n            if (fromCol > toCol) {\n              fromCol = toCol;\n            }\n          }\n\n          if (selectionChanged) {\n            instance.selectCell(fromRow, fromCol, toRow, toCol);\n          }\n        });\n      }\n      if (instance.view) {\n        instance.view.wt.wtOverlays.adjustElementsSize();\n      }\n    },\n\n\n    /**\n     * Populate the data from the provided 2d array from the given cell coordinates.\n     *\n     * @private\n     * @param {Object} start Start selection position. Visual indexes.\n     * @param {Array} input 2d data array.\n     * @param {Object} [end] End selection position (only for drag-down mode). Visual indexes.\n     * @param {String} [source=\"populateFromArray\"] Source information string.\n     * @param {String} [method=\"overwrite\"] Populate method. Possible options: `shift_down`, `shift_right`, `overwrite`.\n     * @param {String} direction (left|right|up|down) String specifying the direction.\n     * @param {Array} deltas The deltas array. A difference between values of adjacent cells.\n     *                       Useful **only** when the type of handled cells is `numeric`.\n     * @returns {Object|undefined} ending td in pasted area (only if any cell was changed).\n     */\n    populateFromArray: function populateFromArray(start, input, end, source, method, direction, deltas) {\n      // TODO: either remove or implement the `direction` argument. Currently it's not working at all.\n      var r,\n          rlen,\n          c,\n          clen,\n          setData = [],\n          current = {};\n\n      rlen = input.length;\n\n      if (rlen === 0) {\n        return false;\n      }\n\n      var repeatCol,\n          repeatRow,\n          cmax,\n          rmax,\n          baseEnd = {\n        row: end === null ? null : end.row,\n        col: end === null ? null : end.col\n      };\n\n      /* eslint-disable no-case-declarations */\n      // insert data with specified pasteMode method\n      switch (method) {\n        case 'shift_down':\n          repeatCol = end ? end.col - start.col + 1 : 0;\n          repeatRow = end ? end.row - start.row + 1 : 0;\n          input = (0, _data.translateRowsToColumns)(input);\n          for (c = 0, clen = input.length, cmax = Math.max(clen, repeatCol); c < cmax; c++) {\n            if (c < clen) {\n              var _instance;\n\n              for (r = 0, rlen = input[c].length; r < repeatRow - rlen; r++) {\n                input[c].push(input[c][r % rlen]);\n              }\n              input[c].unshift(start.col + c, start.row, 0);\n              (_instance = instance).spliceCol.apply(_instance, _toConsumableArray(input[c]));\n            } else {\n              var _instance2;\n\n              input[c % clen][0] = start.col + c;\n              (_instance2 = instance).spliceCol.apply(_instance2, _toConsumableArray(input[c % clen]));\n            }\n          }\n          break;\n\n        case 'shift_right':\n          repeatCol = end ? end.col - start.col + 1 : 0;\n          repeatRow = end ? end.row - start.row + 1 : 0;\n          for (r = 0, rlen = input.length, rmax = Math.max(rlen, repeatRow); r < rmax; r++) {\n            if (r < rlen) {\n              var _instance3;\n\n              for (c = 0, clen = input[r].length; c < repeatCol - clen; c++) {\n                input[r].push(input[r][c % clen]);\n              }\n              input[r].unshift(start.row + r, start.col, 0);\n              (_instance3 = instance).spliceRow.apply(_instance3, _toConsumableArray(input[r]));\n            } else {\n              var _instance4;\n\n              input[r % rlen][0] = start.row + r;\n              (_instance4 = instance).spliceRow.apply(_instance4, _toConsumableArray(input[r % rlen]));\n            }\n          }\n          break;\n\n        case 'overwrite':\n        default:\n          // overwrite and other not specified options\n          current.row = start.row;\n          current.col = start.col;\n\n          var selected = { // selected range\n            row: end && start ? end.row - start.row + 1 : 1,\n            col: end && start ? end.col - start.col + 1 : 1\n          };\n          var skippedRow = 0;\n          var skippedColumn = 0;\n          var pushData = true;\n          var cellMeta = void 0;\n\n          var getInputValue = function getInputValue(row) {\n            var col = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n            var rowValue = input[row % input.length];\n\n            if (col !== null) {\n              return rowValue[col % rowValue.length];\n            }\n\n            return rowValue;\n          };\n          var rowInputLength = input.length;\n          var rowSelectionLength = end ? end.row - start.row + 1 : 0;\n\n          if (end) {\n            rlen = rowSelectionLength;\n          } else {\n            rlen = Math.max(rowInputLength, rowSelectionLength);\n          }\n          for (r = 0; r < rlen; r++) {\n            if (end && current.row > end.row && rowSelectionLength > rowInputLength || !priv.settings.allowInsertRow && current.row > instance.countRows() - 1 || current.row >= priv.settings.maxRows) {\n              break;\n            }\n            var visualRow = r - skippedRow;\n            var colInputLength = getInputValue(visualRow).length;\n            var colSelectionLength = end ? end.col - start.col + 1 : 0;\n\n            if (end) {\n              clen = colSelectionLength;\n            } else {\n              clen = Math.max(colInputLength, colSelectionLength);\n            }\n            current.col = start.col;\n            cellMeta = instance.getCellMeta(current.row, current.col);\n\n            if ((source === 'CopyPaste.paste' || source === 'Autofill.autofill') && cellMeta.skipRowOnPaste) {\n              skippedRow++;\n              current.row++;\n              rlen++;\n              /* eslint-disable no-continue */\n              continue;\n            }\n            skippedColumn = 0;\n\n            for (c = 0; c < clen; c++) {\n              if (end && current.col > end.col && colSelectionLength > colInputLength || !priv.settings.allowInsertColumn && current.col > instance.countCols() - 1 || current.col >= priv.settings.maxCols) {\n                break;\n              }\n              cellMeta = instance.getCellMeta(current.row, current.col);\n\n              if ((source === 'CopyPaste.paste' || source === 'Autofill.fill') && cellMeta.skipColumnOnPaste) {\n                skippedColumn++;\n                current.col++;\n                clen++;\n                continue;\n              }\n              if (cellMeta.readOnly) {\n                current.col++;\n                /* eslint-disable no-continue */\n                continue;\n              }\n              var visualColumn = c - skippedColumn;\n              var value = getInputValue(visualRow, visualColumn);\n              var orgValue = instance.getDataAtCell(current.row, current.col);\n              var index = {\n                row: visualRow,\n                col: visualColumn\n              };\n\n              if (source === 'Autofill.fill') {\n                var result = instance.runHooks('beforeAutofillInsidePopulate', index, direction, input, deltas, {}, selected);\n\n                if (result) {\n                  value = (0, _mixed.isUndefined)(result.value) ? value : result.value;\n                }\n              }\n              if (value !== null && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') {\n                if (orgValue === null || (typeof orgValue === 'undefined' ? 'undefined' : _typeof(orgValue)) !== 'object') {\n                  pushData = false;\n                } else {\n                  var orgValueSchema = (0, _object.duckSchema)(orgValue[0] || orgValue);\n                  var valueSchema = (0, _object.duckSchema)(value[0] || value);\n\n                  /* eslint-disable max-depth */\n                  if ((0, _object.isObjectEqual)(orgValueSchema, valueSchema)) {\n                    value = (0, _object.deepClone)(value);\n                  } else {\n                    pushData = false;\n                  }\n                }\n              } else if (orgValue !== null && (typeof orgValue === 'undefined' ? 'undefined' : _typeof(orgValue)) === 'object') {\n                pushData = false;\n              }\n              if (pushData) {\n                setData.push([current.row, current.col, value]);\n              }\n              pushData = true;\n              current.col++;\n            }\n            current.row++;\n          }\n          instance.setDataAtCell(setData, null, null, source || 'populateFromArray');\n          break;\n      }\n    }\n  };\n\n  /**\n   * Internal function to set `language` key of settings.\n   *\n   * @private\n   * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'\n   * @fires Hooks#afterLanguageChange\n   */\n  function setLanguage(languageCode) {\n    var normalizedLanguageCode = (0, _utils.normalizeLanguageCode)(languageCode);\n\n    if ((0, _dictionariesManager.hasLanguageDictionary)(normalizedLanguageCode)) {\n      instance.runHooks('beforeLanguageChange', normalizedLanguageCode);\n\n      GridSettings.prototype.language = normalizedLanguageCode;\n\n      instance.runHooks('afterLanguageChange', normalizedLanguageCode);\n    } else {\n      (0, _utils.warnUserAboutLanguageRegistration)(languageCode);\n    }\n  }\n\n  this.init = function () {\n    dataSource.setData(priv.settings.data);\n    instance.runHooks('beforeInit');\n\n    if ((0, _browser.isMobileBrowser)()) {\n      (0, _element.addClass)(instance.rootElement, 'mobile');\n    }\n\n    this.updateSettings(priv.settings, true);\n\n    this.view = new _tableView2.default(this);\n    editorManager = _editorManager2.default.getInstance(instance, priv, selection, datamap);\n\n    this.forceFullRender = true; // used when data was changed\n\n    instance.runHooks('init');\n    this.view.render();\n\n    if (_typeof(priv.firstRun) === 'object') {\n      instance.runHooks('afterChange', priv.firstRun[0], priv.firstRun[1]);\n      priv.firstRun = false;\n    }\n    instance.runHooks('afterInit');\n  };\n\n  function ValidatorsQueue() {\n    // moved this one level up so it can be used in any function here. Probably this should be moved to a separate file\n    var resolved = false;\n\n    return {\n      validatorsInQueue: 0,\n      valid: true,\n      addValidatorToQueue: function addValidatorToQueue() {\n        this.validatorsInQueue++;\n        resolved = false;\n      },\n      removeValidatorFormQueue: function removeValidatorFormQueue() {\n        this.validatorsInQueue = this.validatorsInQueue - 1 < 0 ? 0 : this.validatorsInQueue - 1;\n        this.checkIfQueueIsEmpty();\n      },\n      onQueueEmpty: function onQueueEmpty(valid) {},\n      checkIfQueueIsEmpty: function checkIfQueueIsEmpty() {\n        if (this.validatorsInQueue == 0 && resolved == false) {\n          resolved = true;\n          this.onQueueEmpty(this.valid);\n        }\n      }\n    };\n  }\n\n  /**\n   * Get parsed number from numeric string.\n   *\n   * @private\n   * @param {String} numericData Float (separated by a dot or a comma) or integer.\n   * @returns {Number} Number if we get data in parsable format, not changed value otherwise.\n   */\n  function getParsedNumber(numericData) {\n    // Unifying \"float like\" string. Change from value with comma determiner to value with dot determiner,\n    // for example from `450,65` to `450.65`.\n    var unifiedNumericData = numericData.replace(',', '.');\n\n    if (isNaN(parseFloat(unifiedNumericData)) === false) {\n      return parseFloat(unifiedNumericData);\n    }\n\n    return numericData;\n  }\n\n  function validateChanges(changes, source, callback) {\n    var waitingForValidator = new ValidatorsQueue();\n    var isNumericData = function isNumericData(value) {\n      return value.length > 0 && /^-?[\\d\\s]*(\\.|,)?\\d*$/.test(value);\n    };\n\n    waitingForValidator.onQueueEmpty = resolve;\n\n    for (var i = changes.length - 1; i >= 0; i--) {\n      if (changes[i] === null) {\n        changes.splice(i, 1);\n      } else {\n        var _changes$i = _slicedToArray(changes[i], 4),\n            row = _changes$i[0],\n            prop = _changes$i[1],\n            newValue = _changes$i[3];\n\n        var col = datamap.propToCol(prop);\n        var cellProperties = instance.getCellMeta(row, col);\n\n        if (cellProperties.type === 'numeric' && typeof newValue === 'string' && isNumericData(newValue)) {\n          changes[i][3] = getParsedNumber(newValue);\n        }\n\n        /* eslint-disable no-loop-func */\n        if (instance.getCellValidator(cellProperties)) {\n          waitingForValidator.addValidatorToQueue();\n          instance.validateCell(changes[i][3], cellProperties, function (i, cellProperties) {\n            return function (result) {\n              if (typeof result !== 'boolean') {\n                throw new Error('Validation error: result is not boolean');\n              }\n              if (result === false && cellProperties.allowInvalid === false) {\n                changes.splice(i, 1); // cancel the change\n                cellProperties.valid = true; // we cancelled the change, so cell value is still valid\n                var cell = instance.getCell(cellProperties.visualRow, cellProperties.visualCol);\n                (0, _element.removeClass)(cell, instance.getSettings().invalidCellClassName);\n                --i;\n              }\n              waitingForValidator.removeValidatorFormQueue();\n            };\n          }(i, cellProperties), source);\n        }\n      }\n    }\n    waitingForValidator.checkIfQueueIsEmpty();\n\n    function resolve() {\n      var beforeChangeResult;\n\n      if (changes.length) {\n        beforeChangeResult = instance.runHooks('beforeChange', changes, source || 'edit');\n        if ((0, _function.isFunction)(beforeChangeResult)) {\n          (0, _console.warn)('Your beforeChange callback returns a function. It\\'s not supported since Handsontable 0.12.1 (and the returned function will not be executed).');\n        } else if (beforeChangeResult === false) {\n          changes.splice(0, changes.length); // invalidate all changes (remove everything from array)\n        }\n      }\n      callback(); // called when async validators are resolved and beforeChange was not async\n    }\n  }\n\n  /**\n   * Internal function to apply changes. Called after validateChanges\n   *\n   * @private\n   * @param {Array} changes Array in form of [row, prop, oldValue, newValue]\n   * @param {String} source String that identifies how this change will be described in changes array (useful in onChange callback)\n   * @fires Hooks#beforeChangeRender\n   * @fires Hooks#afterChange\n   */\n  function applyChanges(changes, source) {\n    var i = changes.length - 1;\n\n    if (i < 0) {\n      return;\n    }\n\n    for (; i >= 0; i--) {\n      var skipThisChange = false;\n\n      if (changes[i] === null) {\n        changes.splice(i, 1);\n        /* eslint-disable no-continue */\n        continue;\n      }\n\n      if (changes[i][2] == null && changes[i][3] == null) {\n        /* eslint-disable no-continue */\n        continue;\n      }\n\n      if (priv.settings.allowInsertRow) {\n        while (changes[i][0] > instance.countRows() - 1) {\n          var numberOfCreatedRows = datamap.createRow(void 0, void 0, source);\n\n          if (numberOfCreatedRows === 0) {\n            skipThisChange = true;\n            break;\n          }\n        }\n      }\n\n      if (skipThisChange) {\n        /* eslint-disable no-continue */\n        continue;\n      }\n\n      if (instance.dataType === 'array' && (!priv.settings.columns || priv.settings.columns.length === 0) && priv.settings.allowInsertColumn) {\n        while (datamap.propToCol(changes[i][1]) > instance.countCols() - 1) {\n          datamap.createCol(void 0, void 0, source);\n        }\n      }\n\n      datamap.set(changes[i][0], changes[i][1], changes[i][3]);\n    }\n\n    instance.forceFullRender = true; // used when data was changed\n    grid.adjustRowsAndCols();\n    instance.runHooks('beforeChangeRender', changes, source);\n    editorManager.lockEditor();\n    instance._refreshBorders(null);\n    editorManager.unlockEditor();\n    instance.view.wt.wtOverlays.adjustElementsSize();\n    instance.runHooks('afterChange', changes, source || 'edit');\n\n    var activeEditor = instance.getActiveEditor();\n\n    if (activeEditor && (0, _mixed.isDefined)(activeEditor.refreshValue)) {\n      activeEditor.refreshValue();\n    }\n  }\n\n  /**\n   * Validate a single cell.\n   *\n   * @param {String|Number} value\n   * @param cellProperties\n   * @param callback\n   * @param source\n   */\n  this.validateCell = function (value, cellProperties, callback, source) {\n    var validator = instance.getCellValidator(cellProperties);\n\n    // the `canBeValidated = false` argument suggests, that the cell passes validation by default.\n    function done(valid) {\n      var canBeValidated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n      // Fixes GH#3903\n      if (!canBeValidated || cellProperties.hidden === true) {\n        callback(valid);\n        return;\n      }\n\n      var col = cellProperties.visualCol,\n          row = cellProperties.visualRow,\n          td = instance.getCell(row, col, true);\n\n      if (td && td.nodeName != 'TH') {\n        instance.view.wt.wtSettings.settings.cellRenderer(row, col, td);\n      }\n      callback(valid);\n    }\n\n    if ((0, _mixed.isRegExp)(validator)) {\n      validator = function (validator) {\n        return function (value, callback) {\n          callback(validator.test(value));\n        };\n      }(validator);\n    }\n\n    if ((0, _function.isFunction)(validator)) {\n\n      value = instance.runHooks('beforeValidate', value, cellProperties.visualRow, cellProperties.prop, source);\n\n      // To provide consistent behaviour, validation should be always asynchronous\n      instance._registerTimeout(setTimeout(function () {\n        validator.call(cellProperties, value, function (valid) {\n          valid = instance.runHooks('afterValidate', valid, value, cellProperties.visualRow, cellProperties.prop, source);\n          cellProperties.valid = valid;\n\n          done(valid);\n          instance.runHooks('postAfterValidate', valid, value, cellProperties.visualRow, cellProperties.prop, source);\n        });\n      }, 0));\n    } else {\n      // resolve callback even if validator function was not found\n      instance._registerTimeout(setTimeout(function () {\n        cellProperties.valid = true;\n        done(cellProperties.valid, false);\n      }, 0));\n    }\n  };\n\n  function setDataInputToArray(row, propOrCol, value) {\n    if ((typeof row === 'undefined' ? 'undefined' : _typeof(row)) === 'object') {\n      // is it an array of changes\n      return row;\n    }\n    return [[row, propOrCol, value]];\n  }\n\n  /**\n   * @description\n   * Set new value to a cell. To change many cells at once, pass an array of `changes` in format `[[row, col, value], ...]` as\n   * the only parameter. `col` is the index of a __visible__ column (note that if columns were reordered,\n   * the current visible order will be used). `source` is a flag for before/afterChange events. If you pass only array of\n   * changes then `source` could be set as second parameter.\n   *\n   * @memberof Core#\n   * @function setDataAtCell\n   * @param {Number|Array} row Visual row index or array of changes in format `[[row, col, value], ...]`.\n   * @param {Number} col Visual column index.\n   * @param {String} value New value.\n   * @param {String} [source] String that identifies how this change will be described in the changes array (useful in onAfterChange or onBeforeChange callback).\n   */\n  this.setDataAtCell = function (row, col, value, source) {\n    var input = setDataInputToArray(row, col, value),\n        i,\n        ilen,\n        changes = [],\n        prop;\n\n    for (i = 0, ilen = input.length; i < ilen; i++) {\n      if (_typeof(input[i]) !== 'object') {\n        throw new Error('Method `setDataAtCell` accepts row number or changes array of arrays as its first parameter');\n      }\n      if (typeof input[i][1] !== 'number') {\n        throw new Error('Method `setDataAtCell` accepts row and column number as its parameters. If you want to use object property name, use method `setDataAtRowProp`');\n      }\n      prop = datamap.colToProp(input[i][1]);\n      changes.push([input[i][0], prop, dataSource.getAtCell(recordTranslator.toPhysicalRow(input[i][0]), input[i][1]), input[i][2]]);\n    }\n\n    if (!source && (typeof row === 'undefined' ? 'undefined' : _typeof(row)) === 'object') {\n      source = col;\n    }\n\n    instance.runHooks('afterSetDataAtCell', changes, source);\n\n    validateChanges(changes, source, function () {\n      applyChanges(changes, source);\n    });\n  };\n\n  /**\n   * @description\n   * Set new value to a cell. To change many cells at once, pass an array of `changes` in format `[[row, prop, value], ...]` as\n   * the only parameter. `prop` is the name of the object property (e.g. `first.name`). `source` is a flag for before/afterChange events.\n   * If you pass only array of changes then `source` could be set as second parameter.\n   *\n   * @memberof Core#\n   * @function setDataAtRowProp\n   * @param {Number|Array} row Visual row index or array of changes in format `[[row, prop, value], ...]`.\n   * @param {String} prop Property name or the source string.\n   * @param {String} value Value to be set.\n   * @param {String} [source] String that identifies how this change will be described in changes array (useful in onChange callback).\n   */\n  this.setDataAtRowProp = function (row, prop, value, source) {\n    var input = setDataInputToArray(row, prop, value),\n        i,\n        ilen,\n        changes = [];\n\n    for (i = 0, ilen = input.length; i < ilen; i++) {\n      changes.push([input[i][0], input[i][1], dataSource.getAtCell(recordTranslator.toPhysicalRow(input[i][0]), input[i][1]), input[i][2]]);\n    }\n\n    if (!source && (typeof row === 'undefined' ? 'undefined' : _typeof(row)) === 'object') {\n      source = prop;\n    }\n\n    instance.runHooks('afterSetDataAtRowProp', changes, source);\n\n    validateChanges(changes, source, function () {\n      applyChanges(changes, source);\n    });\n  };\n\n  /**\n   * Listen to the keyboard input on document body.\n   *\n   * @memberof Core#\n   * @function listen\n   * @since 0.11\n   * @param {Boolean} [modifyDocumentFocus=true] If `true`, currently focused element will be blured (which returns focus\n   *                                             to the document.body). Otherwise the active element does not lose its focus.\n   */\n  this.listen = function () {\n    var modifyDocumentFocus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n    if (modifyDocumentFocus) {\n      var invalidActiveElement = !document.activeElement || document.activeElement && document.activeElement.nodeName === void 0;\n\n      if (document.activeElement && document.activeElement !== document.body && !invalidActiveElement) {\n        document.activeElement.blur();\n      } else if (invalidActiveElement) {\n        // IE\n        document.body.focus();\n      }\n    }\n\n    if (instance && !instance.isListening()) {\n      activeGuid = instance.guid;\n      instance.runHooks('afterListen');\n    }\n  };\n\n  /**\n   * Stop listening to keyboard input on the document body.\n   *\n   * @memberof Core#\n   * @function unlisten\n   * @since 0.11\n   */\n  this.unlisten = function () {\n    if (this.isListening()) {\n      activeGuid = null;\n      instance.runHooks('afterUnlisten');\n    }\n  };\n\n  /**\n   * Returns `true` if the current Handsontable instance is listening to keyboard input on document body.\n   *\n   * @memberof Core#\n   * @function isListening\n   * @since 0.11\n   * @returns {Boolean} `true` if the instance is listening, `false` otherwise.\n   */\n  this.isListening = function () {\n    return activeGuid === instance.guid;\n  };\n\n  /**\n   * Destroys the current editor, renders and selects the current cell.\n   *\n   * @memberof Core#\n   * @function destroyEditor\n   * @param {Boolean} [revertOriginal] If != `true`, edited data is saved. Otherwise the previous value is restored.\n   */\n  this.destroyEditor = function (revertOriginal) {\n    instance._refreshBorders(revertOriginal);\n  };\n\n  /**\n   * Populate cells at position with 2D input array (e.g. `[[1, 2], [3, 4]]`).\n   * Use `endRow`, `endCol` when you want to cut input when a certain row is reached.\n   * Optional `source` parameter (default value \"populateFromArray\") is used to identify this call in the resulting events (beforeChange, afterChange).\n   * Optional `populateMethod` parameter (default value \"overwrite\", possible values \"shift_down\" and \"shift_right\")\n   * has the same effect as pasteMode option {@link Options#pasteMode}\n   *\n   * @memberof Core#\n   * @function populateFromArray\n   * @since 0.9.0\n   * @param {Number} row Start visual row index.\n   * @param {Number} col Start visual column index.\n   * @param {Array} input 2d array\n   * @param {Number} [endRow] End visual row index (use when you want to cut input when certain row is reached).\n   * @param {Number} [endCol] End visual column index (use when you want to cut input when certain column is reached).\n   * @param {String} [source=\"populateFromArray\"] Source string.\n   * @param {String} [method=\"overwrite\"] Populate method. Possible options: `shift_down`, `shift_right`, `overwrite`.\n   * @param {String} direction Populate direction. (left|right|up|down)\n   * @param {Array} deltas Deltas array.\n   * @returns {Object|undefined} The ending TD element in pasted area (only if any cells were changed).\n   */\n  this.populateFromArray = function (row, col, input, endRow, endCol, source, method, direction, deltas) {\n    var c;\n\n    if (!((typeof input === 'undefined' ? 'undefined' : _typeof(input)) === 'object' && _typeof(input[0]) === 'object')) {\n      throw new Error('populateFromArray parameter `input` must be an array of arrays'); // API changed in 0.9-beta2, let's check if you use it correctly\n    }\n    c = typeof endRow === 'number' ? new _src.CellCoords(endRow, endCol) : null;\n\n    return grid.populateFromArray(new _src.CellCoords(row, col), input, c, source, method, direction, deltas);\n  };\n\n  /**\n   * Adds/removes data from the column. This function is modelled after Array.splice.\n   * Parameter `col` is the index of the column in which do you want to do splice.\n   * Parameter `index` is the row index at which to start changing the array.\n   * If negative, will begin that many elements from the end. Parameter `amount`, is the number of the old array elements to remove.\n   * If the amount is 0, no elements are removed. Fourth and further parameters are the `elements` to add to the array.\n   * If you don't specify any elements, spliceCol simply removes elements from the array.\n   * {@link DataMap#spliceCol}\n   *\n   * @memberof Core#\n   * @function spliceCol\n   * @since 0.9-beta2\n   * @param {Number} col Index of the column in which do you want to do splice.\n   * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end.\n   * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed.\n   * @param {*} [elements] The elements to add to the array. If you don't specify any elements, spliceCol simply removes elements from the array.\n   */\n  this.spliceCol = function (col, index, amount /* , elements... */) {\n    var _datamap;\n\n    return (_datamap = datamap).spliceCol.apply(_datamap, arguments);\n  };\n\n  /**\n   * Adds/removes data from the row. This function works is modelled after Array.splice.\n   * Parameter `row` is the index of row in which do you want to do splice.\n   * Parameter `index` is the column index at which to start changing the array.\n   * If negative, will begin that many elements from the end. Parameter `amount`, is the number of old array elements to remove.\n   * If the amount is 0, no elements are removed. Fourth and further parameters are the `elements` to add to the array.\n   * If you don't specify any elements, spliceCol simply removes elements from the array.\n   * {@link DataMap#spliceRow}\n   *\n   * @memberof Core#\n   * @function spliceRow\n   * @since 0.11\n   * @param {Number} row Index of column in which do you want to do splice.\n   * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end.\n   * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed.\n   * @param {*} [elements] The elements to add to the array. If you don't specify any elements, spliceCol simply removes elements from the array.\n   */\n  this.spliceRow = function (row, index, amount /* , elements... */) {\n    var _datamap2;\n\n    return (_datamap2 = datamap).spliceRow.apply(_datamap2, arguments);\n  };\n\n  /**\n   * Returns indexes of the currently selected cells as an array of arrays `[[startRow, startCol, endRow, endCol], ...]`.\n   *\n   * Start row and start col are the coordinates of the active cell (where the selection was started).\n   *\n   * The version 0.36.0 adds a non-consecutive selection feature. Since this version, the method returns an array of arrays.\n   * Additionally to collect the coordinates of the currently selected area (as it was previously done by the method)\n   * you need to use `getSelectedLast` method.\n   *\n   * @memberof Core#\n   * @function getSelected\n   * @returns {Array[]|undefined} An array of arrays of the selection's coordinates.\n   */\n  this.getSelected = function () {\n    // https://github.com/handsontable/handsontable/issues/44  //cjl\n    if (selection.isSelected()) {\n      return (0, _array.arrayMap)(selection.getSelectedRange(), function (_ref11) {\n        var from = _ref11.from,\n            to = _ref11.to;\n        return [from.row, from.col, to.row, to.col];\n      });\n    }\n  };\n\n  /**\n   * Returns the last coordinates applied to the table as a an array `[startRow, startCol, endRow, endCol]`.\n   *\n   * @since 0.36.0\n   * @memberof Core#\n   * @function getSelectedLast\n   * @returns {Array|undefined} An array of the selection's coordinates.\n   */\n  this.getSelectedLast = function () {\n    var selected = this.getSelected();\n    var result = void 0;\n\n    if (selected && selected.length > 0) {\n      result = selected[selected.length - 1];\n    }\n\n    return result;\n  };\n\n  /**\n   * Returns the current selection as an array of CellRange objects.\n   *\n   * The version 0.36.0 adds a non-consecutive selection feature. Since this version, the method returns an array of arrays.\n   * Additionally to collect the coordinates of the currently selected area (as it was previously done by the method)\n   * you need to use `getSelectedRangeLast` method.\n   *\n   * @memberof Core#\n   * @function getSelectedRange\n   * @since 0.11\n   * @returns {CellRange[]|undefined} Selected range object or undefined` if there is no selection.\n   */\n  this.getSelectedRange = function () {\n    // https://github.com/handsontable/handsontable/issues/44  //cjl\n    if (selection.isSelected()) {\n      return Array.from(selection.getSelectedRange());\n    }\n  };\n\n  /**\n  * Returns the last coordinates applied to the table as a CellRange object.\n  *\n  * @memberof Core#\n  * @function getSelectedRangeLast\n  * @since 0.36.0\n  * @returns {CellRange|undefined} Selected range object or undefined` if there is no selection.\n   */\n  this.getSelectedRangeLast = function () {\n    var selectedRange = this.getSelectedRange();\n    var result = void 0;\n\n    if (selectedRange && selectedRange.length > 0) {\n      result = selectedRange[selectedRange.length - 1];\n    }\n\n    return result;\n  };\n\n  /**\n   * Erases content from cells that have been selected in the table.\n   *\n   * @memberof Core#\n   * @function emptySelectedCells\n   * @since 0.36.0\n   */\n  this.emptySelectedCells = function () {\n    var _this2 = this;\n\n    if (!selection.isSelected()) {\n      return;\n    }\n    var changes = [];\n\n    (0, _array.arrayEach)(selection.getSelectedRange(), function (cellRange) {\n      var topLeft = cellRange.getTopLeftCorner();\n      var bottomRight = cellRange.getBottomRightCorner();\n\n      (0, _number.rangeEach)(topLeft.row, bottomRight.row, function (row) {\n        (0, _number.rangeEach)(topLeft.col, bottomRight.col, function (column) {\n          if (!_this2.getCellMeta(row, column).readOnly) {\n            changes.push([row, column, '']);\n          }\n        });\n      });\n    });\n\n    if (changes.length > 0) {\n      this.setDataAtCell(changes);\n    }\n  };\n\n  /**\n   * Rerender the table.\n   *\n   * @memberof Core#\n   * @function render\n   */\n  this.render = function () {\n    if (instance.view) {\n      instance.renderCall = true;\n      instance.forceFullRender = true; // used when data was changed\n      editorManager.lockEditor();\n      instance._refreshBorders(null);\n      editorManager.unlockEditor();\n    }\n  };\n\n  /**\n   * Reset all cells in the grid to contain data from the data array.\n   *\n   * @memberof Core#\n   * @function loadData\n   * @param {Array} data Array of arrays or array of objects containing data.\n   * @fires Hooks#afterLoadData\n   * @fires Hooks#afterChange\n   */\n  this.loadData = function (data) {\n    if (Array.isArray(priv.settings.dataSchema)) {\n      instance.dataType = 'array';\n    } else if ((0, _function.isFunction)(priv.settings.dataSchema)) {\n      instance.dataType = 'function';\n    } else {\n      instance.dataType = 'object';\n    }\n\n    if (datamap) {\n      datamap.destroy();\n    }\n    datamap = new _dataMap2.default(instance, priv, GridSettings);\n\n    if ((typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object' && data !== null) {\n      if (!(data.push && data.splice)) {\n        // check if data is array. Must use duck-type check so Backbone Collections also pass it\n        // when data is not an array, attempt to make a single-row array of it\n        data = [data];\n      }\n    } else if (data === null) {\n      data = [];\n      var row;\n      var r = 0;\n      var rlen = 0;\n      var dataSchema = datamap.getSchema();\n\n      for (r = 0, rlen = priv.settings.startRows; r < rlen; r++) {\n        if ((instance.dataType === 'object' || instance.dataType === 'function') && priv.settings.dataSchema) {\n          row = (0, _object.deepClone)(dataSchema);\n          data.push(row);\n        } else if (instance.dataType === 'array') {\n          row = (0, _object.deepClone)(dataSchema[0]);\n          data.push(row);\n        } else {\n          row = [];\n\n          for (var c = 0, clen = priv.settings.startCols; c < clen; c++) {\n            row.push(null);\n          }\n\n          data.push(row);\n        }\n      }\n    } else {\n      throw new Error('loadData only accepts array of objects or array of arrays (' + (typeof data === 'undefined' ? 'undefined' : _typeof(data)) + ' given)');\n    }\n\n    priv.isPopulated = false;\n    GridSettings.prototype.data = data;\n\n    if (Array.isArray(data[0])) {\n      instance.dataType = 'array';\n    }\n\n    datamap.dataSource = data;\n    dataSource.data = data;\n    dataSource.dataType = instance.dataType;\n    dataSource.colToProp = datamap.colToProp.bind(datamap);\n    dataSource.propToCol = datamap.propToCol.bind(datamap);\n\n    clearCellSettingCache();\n\n    grid.adjustRowsAndCols();\n    instance.runHooks('afterLoadData', priv.firstRun);\n\n    if (priv.firstRun) {\n      priv.firstRun = [null, 'loadData'];\n    } else {\n      instance.runHooks('afterChange', null, 'loadData');\n      instance.render();\n    }\n    priv.isPopulated = true;\n\n    function clearCellSettingCache() {\n      priv.cellSettings.length = 0;\n    }\n  };\n\n  /**\n   * Returns the current data object (the same one that was passed by `data` configuration option or `loadData` method,\n   * unless the `modifyRow` hook was used to trim some of the rows. If that's the case - use the {@link Core#getSourceData} method.).\n   * Optionally you can provide cell range by defining `row`, `col`, `row2`, `col2` to get only a fragment of grid data.\n   *\n   * Note: getData functionality changed with the release of version 0.20. If you're looking for the previous functionality,\n   * you should use the {@link Core#getSourceData} method.\n   *\n   * @memberof Core#\n   * @function getData\n   * @param {Number} [r] From visual row index.\n   * @param {Number} [c] From visual column index.\n   * @param {Number} [r2] To visual row index.\n   * @param {Number} [c2] To visual column index.\n   * @returns {Array} Array with the data.\n   */\n  this.getData = function (r, c, r2, c2) {\n    if ((0, _mixed.isUndefined)(r)) {\n      return datamap.getAll();\n    }\n    return datamap.getRange(new _src.CellCoords(r, c), new _src.CellCoords(r2, c2), datamap.DESTINATION_RENDERER);\n  };\n\n  /**\n   * Returns a string value of the selected range. Each column is separated by tab, each row is separated by a new line character.\n   * {@link DataMap#getCopyableText}\n   *\n   * @memberof Core#\n   * @function getCopyableText\n   * @since 0.11\n   * @param {Number} startRow From visual row index.\n   * @param {Number} startCol From visual column index.\n   * @param {Number} endRow To visual row index.\n   * @param {Number} endCol To visual column index.\n   * @returns {String}\n   */\n  this.getCopyableText = function (startRow, startCol, endRow, endCol) {\n    return datamap.getCopyableText(new _src.CellCoords(startRow, startCol), new _src.CellCoords(endRow, endCol));\n  };\n\n  /**\n   * Returns the data's copyable value at specified row and column index ({@link DataMap#getCopyable}).\n   *\n   * @memberof Core#\n   * @function getCopyableData\n   * @since 0.19.0\n   * @param {Number} row Visual row index.\n   * @param {Number} column Visual column index.\n   * @returns {String}\n   */\n  this.getCopyableData = function (row, column) {\n    return datamap.getCopyable(row, datamap.colToProp(column));\n  };\n\n  /**\n   * Returns schema provided by constructor settings. If it doesn't exist then it returns the schema based on the data\n   * structure in the first row.\n   *\n   * @memberof Core#\n   * @function getSchema\n   * @since 0.13.2\n   * @returns {Object} Schema object.\n   */\n  this.getSchema = function () {\n    return datamap.getSchema();\n  };\n\n  /**\n   * Use it if you need to change configuration after initialization. The `settings` parameter is an object containing the new\n   * settings, declared the same way as in the initial settings object.\n   * Note, that although the `updateSettings` method doesn't overwrite the previously declared settings, it might reset\n   * the settings made post-initialization. (for example - ignore changes made using the columnResize feature).\n   *\n   * @memberof Core#\n   * @function updateSettings\n   * @param {Object} settings New settings object.\n   * @param {Boolean} init Calls this method in the initialization mode. Internal use only.\n   *                       Used by API could be cause of the unexpected behaviour of the Handsontable.\n   * @example\n   * ```js\n   * hot.updateSettings({\n   *    contextMenu: true,\n   *    colHeaders: true,\n   *    fixedRowsTop: 2\n   * });\n   * ```\n   * @fires Hooks#afterCellMetaReset\n   * @fires Hooks#afterUpdateSettings\n   */\n  this.updateSettings = function (settings, init) {\n    var columnsAsFunc = false;\n    var i = void 0;\n    var j = void 0;\n    var clen = void 0;\n\n    if ((0, _mixed.isDefined)(settings.rows)) {\n      throw new Error('\"rows\" setting is no longer supported. do you mean startRows, minRows or maxRows?');\n    }\n    if ((0, _mixed.isDefined)(settings.cols)) {\n      throw new Error('\"cols\" setting is no longer supported. do you mean startCols, minCols or maxCols?');\n    }\n\n    for (i in settings) {\n      if (i === 'data') {\n        /* eslint-disable-next-line no-continue */\n        continue; // loadData will be triggered later\n      } else if (i === 'language') {\n        setLanguage(settings.language);\n\n        /* eslint-disable-next-line no-continue */\n        continue;\n      } else if (_pluginHooks2.default.getSingleton().getRegistered().indexOf(i) > -1) {\n        if ((0, _function.isFunction)(settings[i]) || Array.isArray(settings[i])) {\n          settings[i].initialHook = true;\n          instance.addHook(i, settings[i]);\n        }\n      } else if (!init && (0, _object.hasOwnProperty)(settings, i)) {\n        // Update settings\n        GridSettings.prototype[i] = settings[i];\n      }\n    }\n\n    // Load data or create data map\n    if (settings.data === void 0 && priv.settings.data === void 0) {\n      instance.loadData(null); // data source created just now\n    } else if (settings.data !== void 0) {\n      instance.loadData(settings.data); // data source given as option\n    } else if (settings.columns !== void 0) {\n      datamap.createMap();\n    }\n\n    clen = instance.countCols();\n\n    var columnSetting = settings.columns || GridSettings.prototype.columns;\n\n    // Init columns constructors configuration\n    if (columnSetting && (0, _function.isFunction)(columnSetting)) {\n      clen = instance.countSourceCols();\n      columnsAsFunc = true;\n    }\n\n    // Clear cellSettings cache\n    if (settings.cell !== void 0 || settings.cells !== void 0 || settings.columns !== void 0) {\n      priv.cellSettings.length = 0;\n    }\n\n    if (clen > 0) {\n      var proto = void 0;\n      var column = void 0;\n\n      for (i = 0, j = 0; i < clen; i++) {\n        if (columnsAsFunc && !columnSetting(i)) {\n          /* eslint-disable no-continue */\n          continue;\n        }\n        priv.columnSettings[j] = (0, _setting.columnFactory)(GridSettings, priv.columnsSettingConflicts);\n\n        // shortcut for prototype\n        proto = priv.columnSettings[j].prototype;\n\n        // Use settings provided by user\n        if (columnSetting) {\n          if (columnsAsFunc) {\n            column = columnSetting(i);\n          } else {\n            column = columnSetting[j];\n          }\n\n          if (column) {\n            (0, _object.extend)(proto, column);\n            (0, _object.extend)(proto, expandType(column));\n          }\n        }\n\n        j++;\n      }\n    }\n\n    if ((0, _mixed.isDefined)(settings.cell)) {\n      for (var key in settings.cell) {\n        if ((0, _object.hasOwnProperty)(settings.cell, key)) {\n          var cell = settings.cell[key];\n\n          instance.setCellMetaObject(cell.row, cell.col, cell);\n        }\n      }\n    }\n\n    instance.runHooks('afterCellMetaReset');\n\n    if ((0, _mixed.isDefined)(settings.className)) {\n      if (GridSettings.prototype.className) {\n        (0, _element.removeClass)(instance.rootElement, GridSettings.prototype.className);\n      }\n      if (settings.className) {\n        (0, _element.addClass)(instance.rootElement, settings.className);\n      }\n    }\n\n    var currentHeight = instance.rootElement.style.height;\n    if (currentHeight !== '') {\n      currentHeight = parseInt(instance.rootElement.style.height, 10);\n    }\n\n    var height = settings.height;\n    if ((0, _function.isFunction)(height)) {\n      height = height();\n    }\n\n    if (init) {\n      var initialStyle = instance.rootElement.getAttribute('style');\n\n      if (initialStyle) {\n        instance.rootElement.setAttribute('data-initialstyle', instance.rootElement.getAttribute('style'));\n      }\n    }\n\n    if (height === null) {\n      var _initialStyle = instance.rootElement.getAttribute('data-initialstyle');\n\n      if (_initialStyle && (_initialStyle.indexOf('height') > -1 || _initialStyle.indexOf('overflow') > -1)) {\n        instance.rootElement.setAttribute('style', _initialStyle);\n      } else {\n        instance.rootElement.style.height = '';\n        instance.rootElement.style.overflow = '';\n      }\n    } else if (height !== void 0) {\n      instance.rootElement.style.height = height + 'px';\n      instance.rootElement.style.overflow = 'hidden';\n    }\n\n    if (typeof settings.width !== 'undefined') {\n      var width = settings.width;\n\n      if ((0, _function.isFunction)(width)) {\n        width = width();\n      }\n\n      instance.rootElement.style.width = width + 'px';\n    }\n\n    if (!init) {\n      datamap.clearLengthCache(); // force clear cache length on updateSettings() #3416\n\n      if (instance.view) {\n        instance.view.wt.wtViewport.resetHasOversizedColumnHeadersMarked();\n      }\n\n      instance.runHooks('afterUpdateSettings', settings);\n    }\n\n    grid.adjustRowsAndCols();\n    if (instance.view && !priv.firstRun) {\n      instance.forceFullRender = true; // used when data was changed\n      editorManager.lockEditor();\n      instance._refreshBorders(null);\n      editorManager.unlockEditor();\n    }\n\n    if (!init && instance.view && (currentHeight === '' || height === '' || height === void 0) && currentHeight !== height) {\n      instance.view.wt.wtOverlays.updateMainScrollableElements();\n    }\n  };\n\n  /**\n   * Get value from the selected cell.\n   *\n   * @memberof Core#\n   * @function getValue\n   * @since 0.11\n   * @returns {*} Value of selected cell.\n   */\n  this.getValue = function () {\n    var sel = instance.getSelectedLast();\n\n    if (GridSettings.prototype.getValue) {\n      if ((0, _function.isFunction)(GridSettings.prototype.getValue)) {\n        return GridSettings.prototype.getValue.call(instance);\n      } else if (sel) {\n        return instance.getData()[sel[0][0]][GridSettings.prototype.getValue];\n      }\n    } else if (sel) {\n      return instance.getDataAtCell(sel[0], sel[1]);\n    }\n  };\n\n  function expandType(obj) {\n    if (!(0, _object.hasOwnProperty)(obj, 'type')) {\n      // ignore obj.prototype.type\n      return;\n    }\n\n    var type,\n        expandedType = {};\n\n    if (_typeof(obj.type) === 'object') {\n      type = obj.type;\n    } else if (typeof obj.type === 'string') {\n      type = (0, _cellTypes.getCellType)(obj.type);\n    }\n\n    for (var i in type) {\n      if ((0, _object.hasOwnProperty)(type, i) && !(0, _object.hasOwnProperty)(obj, i)) {\n        expandedType[i] = type[i];\n      }\n    }\n\n    return expandedType;\n  }\n\n  /**\n   * Returns the object settings.\n   *\n   * @memberof Core#\n   * @function getSettings\n   * @returns {Object} Object containing the current grid settings.\n   */\n  this.getSettings = function () {\n    return priv.settings;\n  };\n\n  /**\n   * Clears the data from the grid (the table settings remain intact).\n   *\n   * @memberof Core#\n   * @function clear\n   * @since 0.11.0\n   */\n  this.clear = function () {\n    this.selectAll();\n    this.emptySelectedCells();\n  };\n\n  /**\n   * @memberof Core#\n   * @function alter\n   * @param {String} action See grid.alter for possible values: `\"insert_row\"`, `\"insert_col\"`, `\"remove_row\"`, `\"remove_col\"`\n   * @param {Number} index Visual index of the row/column before which the new row/column will be inserted/removed.\n   * @param {Number} [amount = 1] Amound of rows/columns to be inserted/removed.\n   * @param {String} [source] Source indicator.\n   * @param {Boolean} [keepEmptyRows] Flag for preventing deletion of empty rows.\n   * @description\n   *\n   * Allows altering the table structure by either inserting/removing rows or inserting/removing columns:\n   *\n   * Insert new row(s) above the row with a given `index`. If index is `null` or `undefined`, the new row will be\n   * added after the last row.\n   * ```js\n   * var hot = new Handsontable(document.getElementById('example'));\n   * hot.alter('insert_row', 10);\n   * ```\n   *\n   * Insert new column(s) before the column with a given `index`. If index is `null` or `undefined`, the new column\n   * will be added after the last column.\n   * ```js\n   * var hot = new Handsontable(document.getElementById('example'));\n   * hot.alter('insert_col', 10);\n   * ```\n   *\n   * Remove the row(s) at the given `index`.\n   * ```js\n   * var hot = new Handsontable(document.getElementById('example'));\n   * hot.alter('remove_row', 10);\n   * ```\n   *\n   * Remove the column(s) at the given `index`.\n   * ```js\n   * var hot = new Handsontable(document.getElementById('example'));\n   * hot.alter('remove_col', 10);\n   * ```\n   */\n  this.alter = function (action, index, amount, source, keepEmptyRows) {\n    grid.alter(action, index, amount, source, keepEmptyRows);\n  };\n\n  /**\n   * Returns a TD element for the given `row` and `col` arguments, if it is rendered on screen.\n   * Returns `null` if the TD is not rendered on screen (probably because that part of the table is not visible).\n   *\n   * @memberof Core#\n   * @function getCell\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @param {Boolean} topmost If set to true, it returns the TD element from the topmost overlay. For example,\n   * if the wanted cell is in the range of fixed rows, it will return a TD element from the `top` overlay.\n   * @returns {Element} The cell's TD element.\n   */\n  this.getCell = function (row, col, topmost) {\n    return instance.view.getCellAtCoords(new _src.CellCoords(row, col), topmost);\n  };\n\n  /**\n   * Returns the coordinates of the cell, provided as a HTML Element.\n   *\n   * @memberof Core#\n   * @function getCoords\n   * @param {Element} elem The HTML Element representing the cell.\n   * @returns {CellCoords} Visual coordinates object.\n   */\n  this.getCoords = function (elem) {\n    return this.view.wt.wtTable.getCoords.call(this.view.wt.wtTable, elem);\n  };\n\n  /**\n   * Returns the property name that corresponds with the given column index. {@link DataMap#colToProp}\n   * If the data source is an array of arrays, it returns the columns index.\n   *\n   * @memberof Core#\n   * @function colToProp\n   * @param {Number} col Visual column index.\n   * @returns {String|Number} Column property or physical column index.\n   */\n  this.colToProp = function (col) {\n    return datamap.colToProp(col);\n  };\n\n  /**\n   * Returns column index that corresponds with the given property. {@link DataMap#propToCol}\n   *\n   * @memberof Core#\n   * @function propToCol\n   * @param {String|Number} prop Property name or physical column index.\n   * @returns {Number} Visual column index.\n   */\n  this.propToCol = function (prop) {\n    return datamap.propToCol(prop);\n  };\n\n  /**\n   * Translate physical row index into visual.\n   *\n   * @since 0.29.0\n   * @memberof Core#\n   * @function toVisualRow\n   * @param {Number} row Physical row index.\n   * @returns {Number} Returns visual row index.\n   */\n  this.toVisualRow = function (row) {\n    return recordTranslator.toVisualRow(row);\n  };\n\n  /**\n   * Translate physical column index into visual.\n   *\n   * @since 0.29.0\n   * @memberof Core#\n   * @function toVisualColumn\n   * @param {Number} column Physical column index.\n   * @returns {Number} Returns visual column index.\n   */\n  this.toVisualColumn = function (column) {\n    return recordTranslator.toVisualColumn(column);\n  };\n\n  /**\n   * Translate visual row index into physical.\n   * If displayed rows order is different than the order of rows stored in memory (i.e. sorting is applied)\n   * to retrieve valid physical row index you can use this method.\n   *\n   * @since 0.29.0\n   * @memberof Core#\n   * @function toPhysicalRow\n   * @param {Number} row Visual row index.\n   * @returns {Number} Returns physical row index.\n   */\n  this.toPhysicalRow = function (row) {\n    return recordTranslator.toPhysicalRow(row);\n  };\n\n  /**\n   * Translate visual column index into physical.\n   * If displayed columns order is different than the order of columns stored in memory (i.e. manual column move is applied)\n   * to retrieve valid physical column index you can use this method.\n   *\n   * @since 0.29.0\n   * @memberof Core#\n   * @function toPhysicalColumn\n   * @param {Number} column Visual column index.\n   * @returns {Number} Returns physical column index.\n   */\n  this.toPhysicalColumn = function (column) {\n    return recordTranslator.toPhysicalColumn(column);\n  };\n\n  /**\n   * @description\n   * Returns the cell value at `row`, `col`. `row` and `col` are the __visible__ indexes (note, that if columns were reordered or sorted,\n   * the currently visible order will be used).\n   *\n   * @memberof Core#\n   * @function getDataAtCell\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @returns {String|Boolean|null} Data at cell.\n   */\n  this.getDataAtCell = function (row, col) {\n    return datamap.get(row, datamap.colToProp(col));\n  };\n\n  /**\n   * Return value at `row`, `prop`. (Uses {@link DataMap#get})\n   *\n   * @memberof Core#\n   * @function getDataAtRowProp\n   * @param {Number} row Visual row index.\n   * @param {String} prop Property name.\n   * @returns {*} Cell value.\n   */\n  this.getDataAtRowProp = function (row, prop) {\n    return datamap.get(row, prop);\n  };\n\n  /**\n   * @description\n   * Returns array of column values from the data source. `col` is the __visible__ index of the column.\n   * Note, that if columns were reordered or sorted, the currently visible order will be used.\n   *\n   * @memberof Core#\n   * @function getDataAtCol\n   * @since 0.9-beta2\n   * @param {Number} col Visual column index.\n   * @returns {Array} Array of cell values.\n   */\n  this.getDataAtCol = function (col) {\n    var out = [];\n    return out.concat.apply(out, _toConsumableArray(datamap.getRange(new _src.CellCoords(0, col), new _src.CellCoords(priv.settings.data.length - 1, col), datamap.DESTINATION_RENDERER)));\n  };\n\n  /**\n   * Given the object property name (e.g. `'first.name'`), returns an array of column's values from the data source.\n   * You can also provide a column index as the first argument.\n   *\n   * @memberof Core#\n   * @function getDataAtProp\n   * @since 0.9-beta2\n   * @param {String|Number} prop Property name / physical column index.\n   * @returns {Array} Array of cell values.\n   */\n  // TODO: Getting data from `datamap` should work on visual indexes.\n  this.getDataAtProp = function (prop) {\n    var out = [],\n        range;\n\n    range = datamap.getRange(new _src.CellCoords(0, datamap.propToCol(prop)), new _src.CellCoords(priv.settings.data.length - 1, datamap.propToCol(prop)), datamap.DESTINATION_RENDERER);\n\n    return out.concat.apply(out, _toConsumableArray(range));\n  };\n\n  /**\n   * Returns the source data object (the same that was passed by `data` configuration option or `loadData` method).\n   * Optionally you can provide a cell range by using the `row`, `col`, `row2`, `col2` arguments, to get only a fragment of grid data.\n   *\n   * @memberof Core#\n   * @function getSourceData\n   * @since 0.20.0\n   * @param {Number} [r] From physical row index.\n   * @param {Number} [c] From physical column index (or visual index, if data type is an array of objects).\n   * @param {Number} [r2] To physical row index.\n   * @param {Number} [c2] To physical column index (or visual index, if data type is an array of objects).\n   * @returns {Array} Array of grid data.\n   */\n  this.getSourceData = function (r, c, r2, c2) {\n    var data = void 0;\n\n    if (r === void 0) {\n      data = dataSource.getData();\n    } else {\n      data = dataSource.getByRange(new _src.CellCoords(r, c), new _src.CellCoords(r2, c2));\n    }\n\n    return data;\n  };\n\n  /**\n   * Returns the source data object as an arrays of arrays format even when source data was provided in another format.\n   * Optionally you can provide a cell range by using the `row`, `col`, `row2`, `col2` arguments, to get only a fragment of grid data.\n   *\n   * @memberof Core#\n   * @function getSourceDataArray\n   * @since 0.28.0\n   * @param {Number} [r] From physical row index.\n   * @param {Number} [c] From physical column index (or visual index, if data type is an array of objects).\n   * @param {Number} [r2] To physical row index.\n   * @param {Number} [c2] To physical column index (or visual index, if data type is an array of objects).\n   * @returns {Array} An array of arrays.\n   */\n  this.getSourceDataArray = function (r, c, r2, c2) {\n    var data = void 0;\n\n    if (r === void 0) {\n      data = dataSource.getData(true);\n    } else {\n      data = dataSource.getByRange(new _src.CellCoords(r, c), new _src.CellCoords(r2, c2), true);\n    }\n\n    return data;\n  };\n\n  /**\n   * Returns an array of column values from the data source. `col` is the index of the row in the data source.\n   *\n   * @memberof Core#\n   * @function getSourceDataAtCol\n   * @since 0.11.0-beta3\n   * @param {Number} column Visual column index.\n   * @returns {Array} Array of the column's cell values.\n   */\n  // TODO: Getting data from `sourceData` should work always on physical indexes.\n  this.getSourceDataAtCol = function (column) {\n    return dataSource.getAtColumn(column);\n  };\n\n  /**\n   * Returns a single row of the data (array or object, depending on what you have). `row` is the index of the row in the data source.\n   *\n   * @memberof Core#\n   * @function getSourceDataAtRow\n   * @since 0.11.0-beta3\n   * @param {Number} row Physical row index.\n   * @returns {Array|Object} Single row of data.\n   */\n  this.getSourceDataAtRow = function (row) {\n    return dataSource.getAtRow(row);\n  };\n\n  /**\n   * Returns a single value from the data source.\n   *\n   * @memberof Core#\n   * @function getSourceDataAtCell\n   * @param {Number} row Physical row index.\n   * @param {Number} column Visual column index.\n   * @returns {*} Cell data.\n   * @since 0.20.0\n   */\n  // TODO: Getting data from `sourceData` should work always on physical indexes.\n  this.getSourceDataAtCell = function (row, column) {\n    return dataSource.getAtCell(row, column);\n  };\n\n  /**\n   * @description\n   * Returns a single row of the data. The `row` argument is the __visible__ index of the row.\n   *\n   * @memberof Core#\n   * @function getDataAtRow\n   * @param {Number} row Visual row index.\n   * @returns {Array} Array of row's cell data.\n   * @since 0.9-beta2\n   */\n  this.getDataAtRow = function (row) {\n    var data = datamap.getRange(new _src.CellCoords(row, 0), new _src.CellCoords(row, this.countCols() - 1), datamap.DESTINATION_RENDERER);\n\n    return data[0] || [];\n  };\n\n  /**\n   * @description\n   * Returns a data type defined in the Handsontable settings under the `type` key ([Options#type](http://docs.handsontable.com/Options.html#type)).\n   * If there are cells with different types in the selected range, it returns `'mixed'`.\n   *\n   * @since 0.18.1\n   * @memberof Core#\n   * @function getDataType\n   * @param {Number} rowFrom From visual row index.\n   * @param {Number} columnFrom From visual column index.\n   * @param {Number} rowTo To visual row index.\n   * @param {Number} columnTo To visual column index.\n   * @returns {String} Cell type (e.q: `'mixed'`, `'text'`, `'numeric'`, `'autocomplete'`).\n   */\n  this.getDataType = function (rowFrom, columnFrom, rowTo, columnTo) {\n    var _this3 = this;\n\n    var previousType = null;\n    var currentType = null;\n\n    if (rowFrom === void 0) {\n      rowFrom = 0;\n      rowTo = this.countRows();\n      columnFrom = 0;\n      columnTo = this.countCols();\n    }\n    if (rowTo === void 0) {\n      rowTo = rowFrom;\n    }\n    if (columnTo === void 0) {\n      columnTo = columnFrom;\n    }\n    var type = 'mixed';\n\n    (0, _number.rangeEach)(Math.min(rowFrom, rowTo), Math.max(rowFrom, rowTo), function (row) {\n      var isTypeEqual = true;\n\n      (0, _number.rangeEach)(Math.min(columnFrom, columnTo), Math.max(columnFrom, columnTo), function (column) {\n        var cellType = _this3.getCellMeta(row, column);\n\n        currentType = cellType.type;\n\n        if (previousType) {\n          isTypeEqual = previousType === currentType;\n        } else {\n          previousType = currentType;\n        }\n\n        return isTypeEqual;\n      });\n      type = isTypeEqual ? currentType : 'mixed';\n\n      return isTypeEqual;\n    });\n\n    return type;\n  };\n\n  /**\n   * Remove a property defined by the `key` argument from the cell meta object for the provided `row` and `col` coordinates.\n   *\n   * @memberof Core#\n   * @function removeCellMeta\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @param {String} key Property name.\n   * @fires Hooks#beforeRemoveCellMeta\n   * @fires Hooks#afterRemoveCellMeta\n   */\n  this.removeCellMeta = function (row, col, key) {\n    var _recordTranslator$toP = recordTranslator.toPhysical(row, col),\n        _recordTranslator$toP2 = _slicedToArray(_recordTranslator$toP, 2),\n        physicalRow = _recordTranslator$toP2[0],\n        physicalColumn = _recordTranslator$toP2[1];\n\n    var cachedValue = priv.cellSettings[physicalRow][physicalColumn][key];\n\n    var hookResult = instance.runHooks('beforeRemoveCellMeta', row, col, key, cachedValue);\n\n    if (hookResult !== false) {\n      delete priv.cellSettings[physicalRow][physicalColumn][key];\n\n      instance.runHooks('afterRemoveCellMeta', row, col, key, cachedValue);\n    }\n\n    cachedValue = null;\n  };\n\n  /**\n   * Remove one or more rows from the cell meta object.\n   *\n   * @since 0.30.0\n   * @param {Number} index An integer that specifies at what position to add/remove items, Use negative values to specify the position from the end of the array.\n   * @param {Number} deleteAmount The number of items to be removed. If set to 0, no items will be removed.\n   * @param {Array} items The new items to be added to the array.\n   */\n  this.spliceCellsMeta = function (index, deleteAmount) {\n    var _priv$cellSettings;\n\n    for (var _len2 = arguments.length, items = Array(_len2 > 2 ? _len2 - 2 : 0), _key = 2; _key < _len2; _key++) {\n      items[_key - 2] = arguments[_key];\n    }\n\n    (_priv$cellSettings = priv.cellSettings).splice.apply(_priv$cellSettings, [index, deleteAmount].concat(items));\n  };\n\n  /**\n   * Set cell meta data object defined by `prop` to the corresponding params `row` and `col`.\n   *\n   * @memberof Core#\n   * @function setCellMetaObject\n   * @since 0.11\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @param {Object} prop Meta object.\n   */\n  this.setCellMetaObject = function (row, col, prop) {\n    if ((typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) === 'object') {\n      for (var key in prop) {\n        if ((0, _object.hasOwnProperty)(prop, key)) {\n          var value = prop[key];\n          this.setCellMeta(row, col, key, value);\n        }\n      }\n    }\n  };\n\n  /**\n   * Sets a property defined by the `key` object to the meta object of a cell corresponding to params `row` and `col`.\n   *\n   * @memberof Core#\n   * @function setCellMeta\n   * @since 0.11\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @param {String} key Property name.\n   * @param {String} val Property value.\n   * @fires Hooks#afterSetCellMeta\n   */\n  this.setCellMeta = function (row, col, key, val) {\n    var _recordTranslator$toP3 = recordTranslator.toPhysical(row, col),\n        _recordTranslator$toP4 = _slicedToArray(_recordTranslator$toP3, 2),\n        physicalRow = _recordTranslator$toP4[0],\n        physicalColumn = _recordTranslator$toP4[1];\n\n    if (!priv.columnSettings[physicalColumn]) {\n      priv.columnSettings[physicalColumn] = (0, _setting.columnFactory)(GridSettings, priv.columnsSettingConflicts);\n    }\n\n    if (!priv.cellSettings[physicalRow]) {\n      priv.cellSettings[physicalRow] = [];\n    }\n    if (!priv.cellSettings[physicalRow][physicalColumn]) {\n      priv.cellSettings[physicalRow][physicalColumn] = new priv.columnSettings[physicalColumn]();\n    }\n    priv.cellSettings[physicalRow][physicalColumn][key] = val;\n    instance.runHooks('afterSetCellMeta', row, col, key, val);\n  };\n\n  /**\n   * Get all the cells meta settings at least once generated in the table (in order of cell initialization).\n   *\n   * @since 0.19.0\n   * @returns {Array} Returns Array of ColumnSettings object.\n   */\n  this.getCellsMeta = function () {\n    return (0, _array.arrayFlatten)(priv.cellSettings);\n  };\n\n  /**\n   * Returns the cell properties object for the given `row` and `col` coordinates.\n   *\n   * @memberof Core#\n   * @function getCellMeta\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @returns {Object} The cell properties object.\n   * @fires Hooks#beforeGetCellMeta\n   * @fires Hooks#afterGetCellMeta\n   */\n  this.getCellMeta = function (row, col) {\n    var prop = datamap.colToProp(col);\n    var cellProperties = void 0;\n\n    var _recordTranslator$toP5 = recordTranslator.toPhysical(row, col),\n        _recordTranslator$toP6 = _slicedToArray(_recordTranslator$toP5, 2),\n        physicalRow = _recordTranslator$toP6[0],\n        physicalColumn = _recordTranslator$toP6[1];\n\n    // Workaround for #11. Connected also with #3849. It should be fixed within #4497.\n\n\n    if (physicalRow === null) {\n      physicalRow = row;\n    }\n\n    if (!priv.columnSettings[physicalColumn]) {\n      priv.columnSettings[physicalColumn] = (0, _setting.columnFactory)(GridSettings, priv.columnsSettingConflicts);\n    }\n\n    if (!priv.cellSettings[physicalRow]) {\n      priv.cellSettings[physicalRow] = [];\n    }\n    if (!priv.cellSettings[physicalRow][physicalColumn]) {\n      priv.cellSettings[physicalRow][physicalColumn] = new priv.columnSettings[physicalColumn]();\n    }\n\n    cellProperties = priv.cellSettings[physicalRow][physicalColumn]; // retrieve cellProperties from cache\n\n    cellProperties.row = physicalRow;\n    cellProperties.col = physicalColumn;\n    cellProperties.visualRow = row;\n    cellProperties.visualCol = col;\n    cellProperties.prop = prop;\n    cellProperties.instance = instance;\n\n    instance.runHooks('beforeGetCellMeta', row, col, cellProperties);\n    (0, _object.extend)(cellProperties, expandType(cellProperties)); // for `type` added in beforeGetCellMeta\n\n    if (cellProperties.cells) {\n      var settings = cellProperties.cells.call(cellProperties, physicalRow, physicalColumn, prop);\n\n      if (settings) {\n        (0, _object.extend)(cellProperties, settings);\n        (0, _object.extend)(cellProperties, expandType(settings)); // for `type` added in cells\n      }\n    }\n\n    instance.runHooks('afterGetCellMeta', row, col, cellProperties);\n\n    return cellProperties;\n  };\n\n  /**\n   * Returns a row off the cell meta array.\n   *\n   * @memberof Core#\n   * @function getCellMetaAtRow\n   * @since 0.30.0\n   * @param {Number} row Physical index of the row to return cell meta for.\n   * @returns {Array}\n   */\n  this.getCellMetaAtRow = function (row) {\n    return priv.cellSettings[row];\n  };\n\n  /**\n   * Checks if the data format and config allows user to modify the column structure.\n   * @returns {boolean}\n   */\n  this.isColumnModificationAllowed = function () {\n    return !(instance.dataType === 'object' || instance.getSettings().columns);\n  };\n\n  var rendererLookup = (0, _data.cellMethodLookupFactory)('renderer');\n\n  /**\n   * Returns the cell renderer function by given `row` and `col` arguments.\n   *\n   * @memberof Core#\n   * @function getCellRenderer\n   * @since 0.11\n   * @param {Number|Object} row Visual row index or cell meta object.\n   * @param {Number} [col] Visual column index.\n   * @returns {Function} The renderer function.\n   */\n  this.getCellRenderer = function (row, col) {\n    return (0, _renderers.getRenderer)(rendererLookup.call(this, row, col));\n  };\n\n  /**\n   * Returns the cell editor by the provided `row` and `col` arguments.\n   *\n   * @memberof Core#\n   * @function getCellEditor\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @returns {Object} The Editor object.\n   */\n  this.getCellEditor = (0, _data.cellMethodLookupFactory)('editor');\n\n  var validatorLookup = (0, _data.cellMethodLookupFactory)('validator');\n\n  /**\n   * Returns the cell validator by `row` and `col`, provided a validator is defined. If not - it doesn't return anything.\n   *\n   * @memberof Core#\n   * @function getCellValidator\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @returns {Function|RegExp|undefined} The validator function.\n   */\n  this.getCellValidator = function (row, col) {\n    var validator = validatorLookup.call(this, row, col);\n\n    if (typeof validator === 'string') {\n      validator = (0, _validators.getValidator)(validator);\n    }\n\n    return validator;\n  };\n\n  /**\n   * Validates all cells using their validator functions and calls callback when finished.\n   *\n   * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`.\n   *\n   * @memberof Core#\n   * @function validateCells\n   * @param {Function} [callback] The callback function.\n   */\n  this.validateCells = function (callback) {\n    this._validateCells(callback);\n  };\n\n  /**\n   * Validates rows using their validator functions and calls callback when finished.\n   *\n   * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`.\n   *\n   * @memberof Core#\n   * @function validateRows\n   * @param {Array} [rows] Array of validation target visual row indexes.\n   * @param {Function} [callback] The callback function.\n   */\n  this.validateRows = function (rows, callback) {\n    if (!Array.isArray(rows)) {\n      throw new Error('validateRows parameter `rows` must be an array');\n    }\n    this._validateCells(callback, rows);\n  };\n\n  /**\n   * Validates columns using their validator functions and calls callback when finished.\n   *\n   * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`.\n   *\n   * @memberof Core#\n   * @function validateColumns\n   * @param {Array} [columns] Array of validation target visual columns indexes.\n   * @param {Function} [callback] The callback function.\n   */\n  this.validateColumns = function (columns, callback) {\n    if (!Array.isArray(columns)) {\n      throw new Error('validateColumns parameter `columns` must be an array');\n    }\n    this._validateCells(callback, undefined, columns);\n  };\n\n  /**\n   * Validates all cells using their validator functions and calls callback when finished.\n   *\n   * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`.\n   *\n   * Private use intended.\n   *\n   * @private\n   * @memberof Core#\n   * @function _validateCells\n   * @param {Function} [callback] The callback function.\n   * @param {Array} [rows] Optional. Array of validation target visual row indexes.\n   * @param {Array} [columns] Optional. Array of validation target visual column indexes.\n   */\n  this._validateCells = function (callback, rows, columns) {\n    var waitingForValidator = new ValidatorsQueue();\n\n    if (callback) {\n      waitingForValidator.onQueueEmpty = callback;\n    }\n\n    var i = instance.countRows() - 1;\n\n    while (i >= 0) {\n      if (rows !== undefined && rows.indexOf(i) === -1) {\n        i--;\n        continue;\n      }\n      var j = instance.countCols() - 1;\n\n      while (j >= 0) {\n        if (columns !== undefined && columns.indexOf(j) === -1) {\n          j--;\n          continue;\n        }\n        waitingForValidator.addValidatorToQueue();\n\n        instance.validateCell(instance.getDataAtCell(i, j), instance.getCellMeta(i, j), function (result) {\n          if (typeof result !== 'boolean') {\n            throw new Error('Validation error: result is not boolean');\n          }\n          if (result === false) {\n            waitingForValidator.valid = false;\n          }\n          waitingForValidator.removeValidatorFormQueue();\n        }, 'validateCells');\n        j--;\n      }\n      i--;\n    }\n    waitingForValidator.checkIfQueueIsEmpty();\n  };\n\n  /**\n   * Returns an array of row headers' values (if they are enabled). If param `row` was given, it returns the header of the given row as a string.\n   *\n   * @memberof Core#\n   * @function getRowHeader\n   * @param {Number} [row] Visual row index.\n   * @fires Hooks#modifyRowHeader\n   * @returns {Array|String} Array of header values / single header value.\n   */\n  this.getRowHeader = function (row) {\n    var rowHeader = priv.settings.rowHeaders;\n\n    if (row !== void 0) {\n      row = instance.runHooks('modifyRowHeader', row);\n    }\n    if (row === void 0) {\n      rowHeader = [];\n      (0, _number.rangeEach)(instance.countRows() - 1, function (i) {\n        rowHeader.push(instance.getRowHeader(i));\n      });\n    } else if (Array.isArray(rowHeader) && rowHeader[row] !== void 0) {\n      rowHeader = rowHeader[row];\n    } else if ((0, _function.isFunction)(rowHeader)) {\n      rowHeader = rowHeader(row);\n    } else if (rowHeader && typeof rowHeader !== 'string' && typeof rowHeader !== 'number') {\n      rowHeader = row + 1;\n    }\n\n    return rowHeader;\n  };\n\n  /**\n   * Returns information about if this table is configured to display row headers.\n   *\n   * @memberof Core#\n   * @function hasRowHeaders\n   * @returns {Boolean} `true` if the instance has the row headers enabled, `false` otherwise.\n   * @since 0.11\n   */\n  this.hasRowHeaders = function () {\n    return !!priv.settings.rowHeaders;\n  };\n\n  /**\n   * Returns information about if this table is configured to display column headers.\n   *\n   * @memberof Core#\n   * @function hasColHeaders\n   * @since 0.11\n   * @returns {Boolean} `True` if the instance has the column headers enabled, `false` otherwise.\n   */\n  this.hasColHeaders = function () {\n    if (priv.settings.colHeaders !== void 0 && priv.settings.colHeaders !== null) {\n      // Polymer has empty value = null\n      return !!priv.settings.colHeaders;\n    }\n    for (var i = 0, ilen = instance.countCols(); i < ilen; i++) {\n      if (instance.getColHeader(i)) {\n        return true;\n      }\n    }\n\n    return false;\n  };\n\n  /**\n   * Returns an array of column headers (in string format, if they are enabled). If param `col` is given, it returns the header at the given column as a string.\n   *\n   * @memberof Core#\n   * @function getColHeader\n   * @param {Number} [col] Visual column index.\n   * @fires Hooks#modifyColHeader\n   * @returns {Array|String} The column header(s).\n   */\n  this.getColHeader = function (col) {\n    var columnsAsFunc = priv.settings.columns && (0, _function.isFunction)(priv.settings.columns);\n    var result = priv.settings.colHeaders;\n\n    col = instance.runHooks('modifyColHeader', col);\n\n    if (col === void 0) {\n      var out = [];\n      var ilen = columnsAsFunc ? instance.countSourceCols() : instance.countCols();\n\n      for (var i = 0; i < ilen; i++) {\n        out.push(instance.getColHeader(i));\n      }\n\n      result = out;\n    } else {\n      var translateVisualIndexToColumns = function translateVisualIndexToColumns(col) {\n        var arr = [];\n        var columnsLen = instance.countSourceCols();\n        var index = 0;\n\n        for (; index < columnsLen; index++) {\n          if ((0, _function.isFunction)(instance.getSettings().columns) && instance.getSettings().columns(index)) {\n            arr.push(index);\n          }\n        }\n\n        return arr[col];\n      };\n      var baseCol = col;\n      col = instance.runHooks('modifyCol', col);\n\n      var prop = translateVisualIndexToColumns(col);\n\n      if (priv.settings.columns && (0, _function.isFunction)(priv.settings.columns) && priv.settings.columns(prop) && priv.settings.columns(prop).title) {\n        result = priv.settings.columns(prop).title;\n      } else if (priv.settings.columns && priv.settings.columns[col] && priv.settings.columns[col].title) {\n        result = priv.settings.columns[col].title;\n      } else if (Array.isArray(priv.settings.colHeaders) && priv.settings.colHeaders[col] !== void 0) {\n        result = priv.settings.colHeaders[col];\n      } else if ((0, _function.isFunction)(priv.settings.colHeaders)) {\n        result = priv.settings.colHeaders(col);\n      } else if (priv.settings.colHeaders && typeof priv.settings.colHeaders !== 'string' && typeof priv.settings.colHeaders !== 'number') {\n        result = (0, _data.spreadsheetColumnLabel)(baseCol); // see #1458\n      }\n    }\n\n    return result;\n  };\n\n  /**\n   * Return column width from settings (no guessing). Private use intended.\n   *\n   * @private\n   * @memberof Core#\n   * @function _getColWidthFromSettings\n   * @param {Number} col Visual col index.\n   * @returns {Number}\n   */\n  this._getColWidthFromSettings = function (col) {\n    var cellProperties = instance.getCellMeta(0, col);\n    var width = cellProperties.width;\n\n    if (width === void 0 || width === priv.settings.width) {\n      width = cellProperties.colWidths;\n    }\n    if (width !== void 0 && width !== null) {\n      switch (typeof width === 'undefined' ? 'undefined' : _typeof(width)) {\n        case 'object':\n          // array\n          width = width[col];\n          break;\n\n        case 'function':\n          width = width(col);\n          break;\n        default:\n          break;\n      }\n      if (typeof width === 'string') {\n        width = parseInt(width, 10);\n      }\n    }\n\n    return width;\n  };\n\n  /**\n   * Returns the width of the requested column.\n   *\n   * @memberof Core#\n   * @function getColWidth\n   * @since 0.11\n   * @param {Number} col Visual column index.\n   * @returns {Number} Column width.\n   * @fires Hooks#modifyColWidth\n   */\n  this.getColWidth = function (col) {\n    var width = instance._getColWidthFromSettings(col);\n\n    width = instance.runHooks('modifyColWidth', width, col);\n\n    if (width === void 0) {\n      width = _src.ViewportColumnsCalculator.DEFAULT_WIDTH;\n    }\n\n    return width;\n  };\n\n  /**\n   * Return row height from settings (no guessing). Private use intended.\n   *\n   * @private\n   * @memberof Core#\n   * @function _getRowHeightFromSettings\n   * @param {Number} row Visual row index.\n   * @returns {Number}\n   */\n  this._getRowHeightFromSettings = function (row) {\n    // let cellProperties = instance.getCellMeta(row, 0);\n    // let height = cellProperties.height;\n    //\n    // if (height === void 0 || height === priv.settings.height) {\n    //  height = cellProperties.rowHeights;\n    // }\n    var height = priv.settings.rowHeights;\n\n    if (height !== void 0 && height !== null) {\n      switch (typeof height === 'undefined' ? 'undefined' : _typeof(height)) {\n        case 'object':\n          // array\n          height = height[row];\n          break;\n\n        case 'function':\n          height = height(row);\n          break;\n        default:\n          break;\n      }\n      if (typeof height === 'string') {\n        height = parseInt(height, 10);\n      }\n    }\n\n    return height;\n  };\n\n  /**\n   * Returns the row height.\n   *\n   * @memberof Core#\n   * @function getRowHeight\n   * @since 0.11\n   * @param {Number} row Visual row index.\n   * @returns {Number} The given row's height.\n   * @fires Hooks#modifyRowHeight\n   */\n  this.getRowHeight = function (row) {\n    var height = instance._getRowHeightFromSettings(row);\n\n    height = instance.runHooks('modifyRowHeight', height, row);\n\n    return height;\n  };\n\n  /**\n   * Returns the total number of rows in the data source.\n   *\n   * @memberof Core#\n   * @function countSourceRows\n   * @since 0.20.0\n   * @returns {Number} Total number in rows in data source.\n   */\n  this.countSourceRows = function () {\n    var sourceLength = instance.runHooks('modifySourceLength');\n    return sourceLength || (instance.getSourceData() ? instance.getSourceData().length : 0);\n  };\n\n  /**\n   * Returns the total number of columns in the data source.\n   *\n   * @memberof Core#\n   * @function countSourceCols\n   * @since 0.26.1\n   * @returns {Number} Total number in columns in data source.\n   */\n  this.countSourceCols = function () {\n    var len = 0;\n    var obj = instance.getSourceData() && instance.getSourceData()[0] ? instance.getSourceData()[0] : [];\n\n    if ((0, _object.isObject)(obj)) {\n      len = (0, _object.deepObjectSize)(obj);\n    } else {\n      len = obj.length || 0;\n    }\n\n    return len;\n  };\n\n  /**\n   * Returns the total number of rows in the grid.\n   *\n   * @memberof Core#\n   * @function countRows\n   * @returns {Number} Total number in rows the grid.\n   */\n  this.countRows = function () {\n    return datamap.getLength();\n  };\n\n  /**\n   * Returns the total number of columns in the grid.\n   *\n   * @memberof Core#\n   * @function countCols\n   * @returns {Number} Total number of columns.\n   */\n  this.countCols = function () {\n    var maxCols = this.getSettings().maxCols;\n    var dataHasLength = false;\n    var dataLen = 0;\n\n    if (instance.dataType === 'array') {\n      dataHasLength = priv.settings.data && priv.settings.data[0] && priv.settings.data[0].length;\n    }\n\n    if (dataHasLength) {\n      dataLen = priv.settings.data[0].length;\n    }\n\n    if (priv.settings.columns) {\n      var columnsIsFunction = (0, _function.isFunction)(priv.settings.columns);\n\n      if (columnsIsFunction) {\n        if (instance.dataType === 'array') {\n          var columnLen = 0;\n\n          for (var i = 0; i < dataLen; i++) {\n            if (priv.settings.columns(i)) {\n              columnLen++;\n            }\n          }\n\n          dataLen = columnLen;\n        } else if (instance.dataType === 'object' || instance.dataType === 'function') {\n          dataLen = datamap.colToPropCache.length;\n        }\n      } else {\n        dataLen = priv.settings.columns.length;\n      }\n    } else if (instance.dataType === 'object' || instance.dataType === 'function') {\n      dataLen = datamap.colToPropCache.length;\n    }\n\n    return Math.min(maxCols, dataLen);\n  };\n\n  /**\n   * Returns an visual index of the first rendered row.\n   *\n   * @memberof Core#\n   * @function rowOffset\n   * @returns {Number} Visual index of first rendered row.\n   */\n  this.rowOffset = function () {\n    return instance.view.wt.wtTable.getFirstRenderedRow();\n  };\n\n  /**\n   * Returns the visual index of the first rendered column.\n   *\n   * @memberof Core#\n   * @function colOffset\n   * @returns {Number} Visual index of the first visible column.\n   */\n  this.colOffset = function () {\n    return instance.view.wt.wtTable.getFirstRenderedColumn();\n  };\n\n  /**\n   * Returns the number of rendered rows (including rows partially or fully rendered outside viewport).\n   *\n   * @memberof Core#\n   * @function countRenderedRows\n   * @returns {Number} Returns -1 if table is not visible.\n   */\n  this.countRenderedRows = function () {\n    return instance.view.wt.drawn ? instance.view.wt.wtTable.getRenderedRowsCount() : -1;\n  };\n\n  /**\n   * Returns the number of visible rows (rendered rows that fully fit inside viewport).\n   *\n   * @memberof Core#\n   * @function countVisibleRows\n   * @returns {Number} Number of visible rows or -1.\n   */\n  this.countVisibleRows = function () {\n    return instance.view.wt.drawn ? instance.view.wt.wtTable.getVisibleRowsCount() : -1;\n  };\n\n  /**\n   * Returns the number of rendered columns (including columns partially or fully rendered outside viewport).\n   *\n   * @memberof Core#\n   * @function countRenderedCols\n   * @returns {Number} Returns -1 if table is not visible.\n   */\n  this.countRenderedCols = function () {\n    return instance.view.wt.drawn ? instance.view.wt.wtTable.getRenderedColumnsCount() : -1;\n  };\n\n  /**\n   * Returns the number of visible columns. Returns -1 if table is not visible\n   *\n   * @memberof Core#\n   * @function countVisibleCols\n   * @return {Number} Number of visible columns or -1.\n   */\n  this.countVisibleCols = function () {\n    return instance.view.wt.drawn ? instance.view.wt.wtTable.getVisibleColumnsCount() : -1;\n  };\n\n  /**\n   * Returns the number of empty rows. If the optional ending parameter is `true`, returns the\n   * number of empty rows at the bottom of the table.\n   *\n   * @memberof Core#\n   * @function countEmptyRows\n   * @param {Boolean} [ending] If `true`, will only count empty rows at the end of the data source.\n   * @returns {Number} Count empty rows.\n   */\n  this.countEmptyRows = function (ending) {\n    var emptyRows = 0;\n\n    (0, _number.rangeEachReverse)(instance.countRows() - 1, function (visualIndex) {\n      if (instance.isEmptyRow(visualIndex)) {\n        emptyRows += 1;\n      } else if (ending === true) {\n        return false;\n      }\n    });\n\n    return emptyRows;\n  };\n\n  /**\n   * Returns the number of empty columns. If the optional ending parameter is `true`, returns the number of empty\n   * columns at right hand edge of the table.\n   *\n   * @memberof Core#\n   * @function countEmptyCols\n   * @param {Boolean} [ending] If `true`, will only count empty columns at the end of the data source row.\n   * @returns {Number} Count empty cols.\n   */\n  this.countEmptyCols = function (ending) {\n    if (instance.countRows() < 1) {\n      return 0;\n    }\n\n    var emptyColumns = 0;\n\n    (0, _number.rangeEachReverse)(instance.countCols() - 1, function (visualIndex) {\n      if (instance.isEmptyCol(visualIndex)) {\n        emptyColumns += 1;\n      } else if (ending === true) {\n        return false;\n      }\n    });\n\n    return emptyColumns;\n  };\n\n  /**\n   * Check if all cells in the row declared by the `row` argument are empty.\n   *\n   * @memberof Core#\n   * @function isEmptyRow\n   * @param {Number} row Visual row index.\n   * @returns {Boolean} `true` if the row at the given `row` is empty, `false` otherwise.\n   */\n  this.isEmptyRow = function (row) {\n    return priv.settings.isEmptyRow.call(instance, row);\n  };\n\n  /**\n   * Check if all cells in the the column declared by the `col` argument are empty.\n   *\n   * @memberof Core#\n   * @function isEmptyCol\n   * @param {Number} col Column index.\n   * @returns {Boolean} `true` if the column at the given `col` is empty, `false` otherwise.\n   */\n  this.isEmptyCol = function (col) {\n    return priv.settings.isEmptyCol.call(instance, col);\n  };\n\n  /**\n   * Select cell specified by `row` and `col` values or a range of cells finishing at `endRow`, `endCol`. If the table\n   * was configured to support data column properties that properties can be used to making a selection.\n   *\n   * By default, viewport will be scrolled to the selection. After the `selectCell` method had finished, the instance\n   * will be listening to keyboard input on the document.\n   *\n   * @example\n   * ```js\n   * // select a single cell\n   * hot.selectCell(2, 4);\n   * // select a single cell using column property\n   * hot.selectCell(2, 'address');\n   * // select a range of cells\n   * hot.selectCell(2, 4, 3, 5);\n   * // select a range of cells using column properties\n   * hot.selectCell(2, 'address', 3, 'phone_number');\n   * // select a range of cells without scrolling to them\n   * hot.selectCell(2, 'address', 3, 'phone_number', false);\n   * ```\n   *\n   * @memberof Core#\n   * @function selectCell\n   * @param {Number} row Visual row index.\n   * @param {Number|String} column Visual column index or column property.\n   * @param {Number} [endRow] Visual end row index (if selecting a range).\n   * @param {Number|String} [endColumn] Visual end column index or column property (if selecting a range).\n   * @param {Boolean} [scrollToCell=true] If `true`, the viewport will be scrolled to the selection.\n   * @param {Boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectCell = function (row, column, endRow, endColumn) {\n    var scrollToCell = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n    var changeListener = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n\n    if ((0, _mixed.isUndefined)(row) || (0, _mixed.isUndefined)(column)) {\n      return false;\n    }\n\n    return this.selectCells([[row, column, endRow, endColumn]], scrollToCell, changeListener);\n  };\n\n  /**\n   * Make multiple, non-contiguous selection specified by `row` and `column` values or a range of cells\n   * finishing at `endRow`, `endColumn`. The method supports two input formats which are the same as that\n   * produces by `getSelected` and `getSelectedRange` methods.\n   *\n   * By default, viewport will be scrolled to selection. After the `selectCells` method had finished, the instance\n   * will be listening to keyboard input on the document.\n   *\n   * @example\n   * ```js\n   * // using an array of arrays\n   * hot.selectCells([[1, 1, 2, 2], [3, 3], [6, 2, 0, 2]]);\n   * // using an array of arrays with defined columns as props\n   * hot.selectCells([[1, 'id', 2, 'first_name'], [3, 'full_name'], [6, 'last_name', 0, 'first_name']]);\n   * // or using an array of CellRange objects (produced by `.getSelectedRange()` method)\n   * const selected = hot.getSelectedRange();\n   *\n   * selected[0].from.row = 0;\n   * selected[0].from.col = 0;\n   *\n   * hot.selectCells(selected);\n   * ```\n   *\n   * @memberof Core#\n   * @since 0.38.0\n   * @function selectCells\n   * @param {Array[]|CellRange[]} coords Visual coords passed as an array of array (`[[rowStart, columnStart, rowEnd, columnEnd], ...]`)\n   *                                     the same format as `getSelected` method returns or as an CellRange objects\n   *                                     which is the same format what `getSelectedRange` method returns.\n   * @param {Boolean} [scrollToCell=true] If `true`, the viewport will be scrolled to the selection.\n   * @param {Boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectCells = function () {\n    var coords = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [[]];\n    var scrollToCell = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n    var changeListener = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n    if (scrollToCell === false) {\n      preventScrollingToCell = true;\n    }\n\n    var wasSelected = selection.selectCells(coords);\n\n    if (wasSelected && changeListener) {\n      instance.listen();\n    }\n    preventScrollingToCell = false;\n\n    return wasSelected;\n  };\n\n  /**\n   * Select the cell specified by the `row` and `prop` arguments, or a range finishing at `endRow`, `endProp`.\n   * By default, viewport will be scrolled to selection.\n   *\n   * @deprecated\n   * @memberof Core#\n   * @function selectCellByProp\n   * @param {Number} row Visual row index.\n   * @param {String} prop Property name.\n   * @param {Number} [endRow] visual end row index (if selecting a range).\n   * @param {String} [endProp] End property name (if selecting a range).\n   * @param {Boolean} [scrollToCell=true] If `true`, viewport will be scrolled to the selection.\n   * @param {Boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectCellByProp = function (row, prop, endRow, endProp) {\n    var scrollToCell = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n    var changeListener = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n\n    (0, _console.warn)((0, _templateLiteralTag.toSingleLine)(_templateObject));\n\n    return this.selectCells([[row, prop, endRow, endProp]], scrollToCell, changeListener);\n  };\n\n  /**\n   * Select column specified by `startColumn` visual index, column property or a range of columns finishing at `endColumn`.\n   *\n   * @example\n   * ```js\n   * // select column using visual index\n   * hot.selectColumns(1);\n   * // select column using column property\n   * hot.selectColumns('id');\n   * // select range of columns using visual indexes\n   * hot.selectColumns(1, 4);\n   * // select range of columns using column properties\n   * hot.selectColumns('id', 'last_name');\n   * ```\n   *\n   * @memberof Core#\n   * @since 0.38.0\n   * @function selectColumns\n   * @param {Number} startColumn The visual column index from which the selection starts.\n   * @param {Number} [endColumn=startColumn] The visual column index to which the selection finishes. If `endColumn`\n   *                                         is not defined the column defined by `startColumn` will be selected.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectColumns = function (startColumn) {\n    var endColumn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startColumn;\n\n    return selection.selectColumns(startColumn, endColumn);\n  };\n\n  /**\n   * Select row specified by `startRow` visual index or a range of rows finishing at `endRow`.\n   *\n   * @example\n   * ```js\n   * select row using visual index\n   * hot.selectRows(1);\n   * select range of rows using visual indexes\n   * hot.selectRows(1, 4);\n   * ```\n   *\n   * @memberof Core#\n   * @since 0.38.0\n   * @function selectRows\n   * @param {Number} startRow The visual row index from which the selection starts.\n   * @param {Number} [endRow=startRow] The visual row index to which the selection finishes. If `endRow`\n   *                                   is not defined the row defined by `startRow` will be selected.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectRows = function (startRow) {\n    var endRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startRow;\n\n    return selection.selectRows(startRow, endRow);\n  };\n\n  /**\n   * Deselects the current cell selection on grid.\n   *\n   * @memberof Core#\n   * @function deselectCell\n   */\n  this.deselectCell = function () {\n    selection.deselect();\n  };\n\n  /**\n   * Select the whole table. The previous selection will be overwritten.\n   *\n   * @since 0.38.2\n   * @memberof Core#\n   * @function selectAll\n   */\n  this.selectAll = function () {\n    preventScrollingToCell = true;\n    selection.selectAll();\n    preventScrollingToCell = false;\n  };\n\n  /**\n   * Scroll viewport to coords specified by the `row` and `column` arguments.\n   *\n   * @since 0.24.3\n   * @memberof Core#\n   * @function scrollViewportTo\n   * @param {Number} [row] Visual row index.\n   * @param {Number} [column] Visual column index.\n   * @param {Boolean} [snapToBottom = false] If `true`, viewport is scrolled to show the cell on the bottom of the table.\n   * @param {Boolean} [snapToRight = false] If `true`, viewport is scrolled to show the cell on the right side of the table.\n   * @returns {Boolean} `true` if scroll was successful, `false` otherwise.\n   */\n  this.scrollViewportTo = function (row, column) {\n    var snapToBottom = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n    var snapToRight = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n    if (row !== void 0 && (row < 0 || row >= instance.countRows())) {\n      return false;\n    }\n    if (column !== void 0 && (column < 0 || column >= instance.countCols())) {\n      return false;\n    }\n\n    var result = false;\n\n    if (row !== void 0 && column !== void 0) {\n      instance.view.wt.wtOverlays.topOverlay.scrollTo(row, snapToBottom);\n      instance.view.wt.wtOverlays.leftOverlay.scrollTo(column, snapToRight);\n\n      result = true;\n    }\n    if (typeof row === 'number' && typeof column !== 'number') {\n      instance.view.wt.wtOverlays.topOverlay.scrollTo(row, snapToBottom);\n\n      result = true;\n    }\n    if (typeof column === 'number' && typeof row !== 'number') {\n      instance.view.wt.wtOverlays.leftOverlay.scrollTo(column, snapToRight);\n\n      result = true;\n    }\n\n    return result;\n  };\n\n  /**\n   * Removes grid from the DOM.\n   *\n   * @memberof Core#\n   * @function destroy\n   * @fires Hooks#afterDestroy\n   */\n  this.destroy = function () {\n\n    instance._clearTimeouts();\n    if (instance.view) {\n      // in case HT is destroyed before initialization has finished\n      instance.view.destroy();\n    }\n    if (dataSource) {\n      dataSource.destroy();\n    }\n    dataSource = null;\n\n    (0, _keyStateObserver.stopObserving)();\n\n    if (false) {\n      var licenseInfo = document.querySelector('#hot-display-license-info');\n\n      if (licenseInfo) {\n        licenseInfo.parentNode.removeChild(licenseInfo);\n      }\n    }\n    (0, _element.empty)(instance.rootElement);\n    eventManager.destroy();\n\n    if (editorManager) {\n      editorManager.destroy();\n    }\n\n    instance.runHooks('afterDestroy');\n    _pluginHooks2.default.getSingleton().destroy(instance);\n\n    for (var i in instance) {\n      if ((0, _object.hasOwnProperty)(instance, i)) {\n        // replace instance methods with post mortem\n        if ((0, _function.isFunction)(instance[i])) {\n          instance[i] = postMortem;\n        } else if (i !== 'guid') {\n          // replace instance properties with null (restores memory)\n          // it should not be necessary but this prevents a memory leak side effects that show itself in Jasmine tests\n          instance[i] = null;\n        }\n      }\n    }\n\n    // replace private properties with null (restores memory)\n    // it should not be necessary but this prevents a memory leak side effects that show itself in Jasmine tests\n    if (datamap) {\n      datamap.destroy();\n    }\n    datamap = null;\n    priv = null;\n    grid = null;\n    selection = null;\n    editorManager = null;\n    instance = null;\n    GridSettings = null;\n  };\n\n  /**\n   * Replacement for all methods after Handsotnable was destroyed.\n   *\n   * @private\n   */\n  function postMortem() {\n    throw new Error('This method cannot be called because this Handsontable instance has been destroyed');\n  }\n\n  /**\n   * Returns the active editor object.\n   *\n   * @memberof Core#\n   * @function getActiveEditor\n   * @returns {Object} The active editor object.\n   */\n  this.getActiveEditor = function () {\n    return editorManager.getActiveEditor();\n  };\n\n  /**\n   * Returns plugin instance using the plugin name provided.\n   *\n   * @memberof Core#\n   * @function getPlugin\n   * @param {String} pluginName The plugin name.\n   * @returns {*} The plugin instance.\n   * @since 0.15.0\n   */\n  this.getPlugin = function (pluginName) {\n    return (0, _plugins.getPlugin)(this, pluginName);\n  };\n\n  /**\n   * Returns the Handsontable instance.\n   *\n   * @memberof Core#\n   * @function getInstance\n   * @returns {Handsontable} The Handsontable instance.\n   */\n  this.getInstance = function () {\n    return instance;\n  };\n\n  /**\n   * Adds listener to the specified hook name (only for this Handsontable instance).\n   *\n   * @memberof Core#\n   * @function addHook\n   * @see Hooks#add\n   * @param {String} key Hook name.\n   * @param {Function|Array} callback Function or array of Functions.\n   *\n   * @example\n   * ```js\n   * hot.addHook('beforeInit', myCallback);\n   * ```\n   */\n  this.addHook = function (key, callback) {\n    _pluginHooks2.default.getSingleton().add(key, callback, instance);\n  };\n\n  /**\n   * Check if for a specified hook name there are added listeners (only for this Handsontable instance).\n   *\n   * @memberof Core#\n   * @function hasHook\n   * @see Hooks#has\n   * @param {String} key Hook name\n   * @return {Boolean}\n   *\n   * @example\n   * ```js\n   * var hasBeforeInitListeners = hot.hasHook('beforeInit');\n   * ```\n   */\n  this.hasHook = function (key) {\n    return _pluginHooks2.default.getSingleton().has(key, instance);\n  };\n\n  /**\n   * Adds listener to specified hook name (only for this Handsontable instance).\n   * After the listener is triggered, it will be automatically removed.\n   *\n   * @memberof Core#\n   * @function addHookOnce\n   * @see Hooks#once\n   * @param {String} key Hook name.\n   * @param {Function|Array} callback Function or array of Functions.\n   *\n   * @example\n   * ```js\n   * hot.addHookOnce('beforeInit', myCallback);\n   * ```\n   */\n  this.addHookOnce = function (key, callback) {\n    _pluginHooks2.default.getSingleton().once(key, callback, instance);\n  };\n\n  /**\n   * Removes the hook listener previously registered with {@link Core#addHook}.\n   *\n   * @memberof Core#\n   * @function removeHook\n   * @see Hooks#remove\n   * @param {String} key Hook name.\n   * @param {Function} callback Function which have been registered via {@link Core#addHook}.\n   *\n   * @example\n   * ```js\n   * hot.removeHook('beforeInit', myCallback);\n   * ```\n   */\n  this.removeHook = function (key, callback) {\n    _pluginHooks2.default.getSingleton().remove(key, callback, instance);\n  };\n\n  /**\n   * Run the callbacks for the hook provided in the `key` argument using the parameters given in the other arguments.\n   *\n   * @memberof Core#\n   * @function runHooks\n   * @see Hooks#run\n   * @param {String} key Hook name.\n   * @param {*} [p1] Argument passed to the callback.\n   * @param {*} [p2] Argument passed to the callback.\n   * @param {*} [p3] Argument passed to the callback.\n   * @param {*} [p4] Argument passed to the callback.\n   * @param {*} [p5] Argument passed to the callback.\n   * @param {*} [p6] Argument passed to the callback.\n   * @returns {*}\n   *\n   * @example\n   * ```js\n   * hot.runHooks('beforeInit');\n   * ```\n   */\n  this.runHooks = function (key, p1, p2, p3, p4, p5, p6) {\n    return _pluginHooks2.default.getSingleton().run(instance, key, p1, p2, p3, p4, p5, p6);\n  };\n\n  /**\n   * Get phrase for specified dictionary key.\n   *\n   * @memberof Core#\n   * @function getTranslatedPhrase\n   * @since 0.35.0\n   * @param {String} dictionaryKey Constant which is dictionary key.\n   * @param {*} extraArguments Arguments which will be handled by formatters.\n   *\n   * @returns {String}\n   */\n  this.getTranslatedPhrase = function (dictionaryKey, extraArguments) {\n    return (0, _i18n.getTranslatedPhrase)(priv.settings.language, dictionaryKey, extraArguments);\n  };\n\n  this.timeouts = [];\n\n  /**\n   * Sets timeout. Purpose of this method is to clear all known timeouts when `destroy` method is called.\n   *\n   * @param {*} handle\n   * @private\n   */\n  this._registerTimeout = function (handle) {\n    this.timeouts.push(handle);\n  };\n\n  /**\n   * Clears all known timeouts.\n   *\n   * @private\n   */\n  this._clearTimeouts = function () {\n    for (var i = 0, ilen = this.timeouts.length; i < ilen; i++) {\n      clearTimeout(this.timeouts[i]);\n    }\n  };\n\n  /**\n   * Refresh selection borders. This is temporary method relic after selection rewrite.\n   *\n   * @private\n   * @param {Boolean} revertOriginal\n   */\n  this._refreshBorders = function (revertOriginal) {\n    editorManager.destroyEditor(revertOriginal);\n    instance.view.render();\n\n    if (selection.isSelected()) {\n      editorManager.prepareEditor();\n    }\n  };\n\n  _pluginHooks2.default.getSingleton().run(instance, 'construct');\n};\n\n/***/ }),\n/* 89 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.columnFactory = columnFactory;\n\nvar _object = __webpack_require__(2);\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Factory for columns constructors.\n *\n * @param {Object} GridSettings\n * @param {Array} conflictList\n * @return {Object} ColumnSettings\n */\nfunction columnFactory(GridSettings, conflictList) {\n  function ColumnSettings() {};\n\n  (0, _object.inherit)(ColumnSettings, GridSettings);\n\n  // Clear conflict settings\n  for (var i = 0, len = conflictList.length; i < len; i++) {\n    ColumnSettings.prototype[conflictList[i]] = void 0;\n  }\n\n  return ColumnSettings;\n}\n\n/***/ }),\n/* 90 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.spreadsheetColumnLabel = spreadsheetColumnLabel;\nexports.spreadsheetColumnIndex = spreadsheetColumnIndex;\nexports.createSpreadsheetData = createSpreadsheetData;\nexports.createSpreadsheetObjectData = createSpreadsheetObjectData;\nexports.createEmptySpreadsheetData = createEmptySpreadsheetData;\nexports.translateRowsToColumns = translateRowsToColumns;\nexports.cellMethodLookupFactory = cellMethodLookupFactory;\n\nvar _cellTypes = __webpack_require__(87);\n\nvar _object = __webpack_require__(2);\n\nvar COLUMN_LABEL_BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\nvar COLUMN_LABEL_BASE_LENGTH = COLUMN_LABEL_BASE.length;\n\n/**\n * Generates spreadsheet-like column names: A, B, C, ..., Z, AA, AB, etc.\n *\n * @param {Number} index Column index.\n * @returns {String}\n */\nfunction spreadsheetColumnLabel(index) {\n  var dividend = index + 1;\n  var columnLabel = '';\n  var modulo = void 0;\n\n  while (dividend > 0) {\n    modulo = (dividend - 1) % COLUMN_LABEL_BASE_LENGTH;\n    columnLabel = String.fromCharCode(65 + modulo) + columnLabel;\n    dividend = parseInt((dividend - modulo) / COLUMN_LABEL_BASE_LENGTH, 10);\n  }\n\n  return columnLabel;\n}\n\n/**\n * Generates spreadsheet-like column index from theirs labels: A, B, C ...., Z, AA, AB, etc.\n *\n * @param {String} label Column label.\n * @returns {Number}\n */\nfunction spreadsheetColumnIndex(label) {\n  var result = 0;\n\n  if (label) {\n    for (var i = 0, j = label.length - 1; i < label.length; i += 1, j -= 1) {\n      result += Math.pow(COLUMN_LABEL_BASE_LENGTH, j) * (COLUMN_LABEL_BASE.indexOf(label[i]) + 1);\n    }\n  }\n  --result;\n\n  return result;\n}\n\n/**\n * Creates 2D array of Excel-like values \"A1\", \"A2\", ...\n *\n * @param {Number} rows Number of rows to generate.\n * @param {Number} columns Number of columns to generate.\n * @returns {Array}\n */\nfunction createSpreadsheetData() {\n  var rows = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100;\n  var columns = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 4;\n\n  var _rows = [],\n      i,\n      j;\n\n  for (i = 0; i < rows; i++) {\n    var row = [];\n\n    for (j = 0; j < columns; j++) {\n      row.push(spreadsheetColumnLabel(j) + (i + 1));\n    }\n    _rows.push(row);\n  }\n\n  return _rows;\n}\n\n/**\n * Creates 2D array of Excel-like values \"A1\", \"A2\", as an array of objects.\n *\n * @param {Number} rows Number of rows to generate.\n * @param {Number} colCount Number of columns to generate.\n * @returns {Array}\n */\nfunction createSpreadsheetObjectData() {\n  var rows = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100;\n  var colCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 4;\n\n  var _rows = [],\n      i,\n      j;\n\n  for (i = 0; i < rows; i++) {\n    var row = {};\n\n    for (j = 0; j < colCount; j++) {\n      row['prop' + j] = spreadsheetColumnLabel(j) + (i + 1);\n    }\n    _rows.push(row);\n  }\n\n  return _rows;\n}\n\n/**\n * Generates an empty data object.\n *\n * @param {Number} rows Number of rows to generate.\n * @param {Number} columns Number of columns to generate\n * @returns {Array}\n */\nfunction createEmptySpreadsheetData(rows, columns) {\n  var data = [];\n  var row = void 0;\n\n  for (var i = 0; i < rows; i++) {\n    row = [];\n    for (var j = 0; j < columns; j++) {\n      row.push('');\n    }\n    data.push(row);\n  }\n\n  return data;\n}\n\nfunction translateRowsToColumns(input) {\n  var i,\n      ilen,\n      j,\n      jlen,\n      output = [],\n      olen = 0;\n\n  for (i = 0, ilen = input.length; i < ilen; i++) {\n    for (j = 0, jlen = input[i].length; j < jlen; j++) {\n      if (j == olen) {\n        output.push([]);\n        olen++;\n      }\n      output[j].push(input[i][j]);\n    }\n  }\n\n  return output;\n}\n\n/**\n * Factory that produces a function for searching methods (or any properties) which could be defined directly in\n * table configuration or implicitly, within cell type definition.\n *\n * For example: renderer can be defined explicitly using \"renderer\" property in column configuration or it can be\n * defined implicitly using \"type\" property.\n *\n * Methods/properties defined explicitly always takes precedence over those defined through \"type\".\n *\n * If the method/property is not found in an object, searching is continued recursively through prototype chain, until\n * it reaches the Object.prototype.\n *\n *\n * @param methodName {String} name of the method/property to search (i.e. 'renderer', 'validator', 'copyable')\n * @param allowUndefined {Boolean} [optional] if false, the search is continued if methodName has not been found in cell \"type\"\n * @returns {Function}\n */\nfunction cellMethodLookupFactory(methodName, allowUndefined) {\n\n  allowUndefined = typeof allowUndefined == 'undefined' ? true : allowUndefined;\n\n  return function cellMethodLookup(row, col) {\n    return function getMethodFromProperties(properties) {\n\n      if (!properties) {\n        return; // method not found\n      } else if ((0, _object.hasOwnProperty)(properties, methodName) && properties[methodName] !== void 0) {\n        // check if it is own and is not empty\n        return properties[methodName]; // method defined directly\n      } else if ((0, _object.hasOwnProperty)(properties, 'type') && properties.type) {\n        // check if it is own and is not empty\n        var type;\n\n        if (typeof properties.type != 'string') {\n          throw new Error('Cell type must be a string ');\n        }\n        type = (0, _cellTypes.getCellType)(properties.type);\n\n        if ((0, _object.hasOwnProperty)(type, methodName)) {\n          return type[methodName]; // method defined in type.\n        } else if (allowUndefined) {\n          return; // method does not defined in type (eg. validator), returns undefined\n        }\n      }\n\n      return getMethodFromProperties(Object.getPrototypeOf(properties));\n    }(typeof row == 'number' ? this.getCellMeta(row, col) : row);\n  };\n}\n\n/***/ }),\n/* 91 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.SELECTION_TYPES = exports.SELECTION_TYPE_OBJECT = exports.SELECTION_TYPE_ARRAY = exports.SELECTION_TYPE_EMPTY = exports.SELECTION_TYPE_UNRECOGNIZED = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.detectSelectionType = detectSelectionType;\nexports.normalizeSelectionFactory = normalizeSelectionFactory;\nexports.transformSelectionToColumnDistance = transformSelectionToColumnDistance;\nexports.transformSelectionToRowDistance = transformSelectionToRowDistance;\nexports.isValidCoord = isValidCoord;\n\nvar _src = __webpack_require__(4);\n\nvar _array = __webpack_require__(1);\n\nvar _mixed = __webpack_require__(16);\n\nvar SELECTION_TYPE_UNRECOGNIZED = exports.SELECTION_TYPE_UNRECOGNIZED = 0;\nvar SELECTION_TYPE_EMPTY = exports.SELECTION_TYPE_EMPTY = 1;\nvar SELECTION_TYPE_ARRAY = exports.SELECTION_TYPE_ARRAY = 2;\nvar SELECTION_TYPE_OBJECT = exports.SELECTION_TYPE_OBJECT = 3;\nvar SELECTION_TYPES = exports.SELECTION_TYPES = [SELECTION_TYPE_OBJECT, SELECTION_TYPE_ARRAY];\nvar ARRAY_TYPE_PATTERN = [['number'], ['number', 'string'], ['number', 'undefined'], ['number', 'string', 'undefined']];\nvar rootCall = Symbol('root');\nvar childCall = Symbol('child');\n\n/**\n * Detect selection schema structure.\n *\n * @param {*} selectionRanges The selected range or and array of selected ranges. This type of data is produced by\n *                            `hot.getSelected()`, `hot.getSelectedLast()`, `hot.getSelectedRange()`\n *                            and `hot.getSelectedRangeLast()` methods.\n * @returns {Number} Returns a number that specifies the type of detected selection schema. If selection schema type\n *                   is unrecognized than it returns `0`.\n */\nfunction detectSelectionType(selectionRanges) {\n  var _callSymbol = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : rootCall;\n\n  if (_callSymbol !== rootCall && _callSymbol !== childCall) {\n    throw new Error('The second argument is used internally only and cannot be overwritten.');\n  }\n\n  var isArray = Array.isArray(selectionRanges);\n  var isRootCall = _callSymbol === rootCall;\n  var result = SELECTION_TYPE_UNRECOGNIZED;\n\n  if (isArray) {\n    var firstItem = selectionRanges[0];\n\n    if (selectionRanges.length === 0) {\n      result = SELECTION_TYPE_EMPTY;\n    } else if (isRootCall && firstItem instanceof _src.CellRange) {\n      result = SELECTION_TYPE_OBJECT;\n    } else if (isRootCall && Array.isArray(firstItem)) {\n      result = detectSelectionType(firstItem, childCall);\n    } else if (selectionRanges.length >= 2 && selectionRanges.length <= 4) {\n      var isArrayType = !selectionRanges.some(function (value, index) {\n        return !ARRAY_TYPE_PATTERN[index].includes(typeof value === 'undefined' ? 'undefined' : _typeof(value));\n      });\n\n      if (isArrayType) {\n        result = SELECTION_TYPE_ARRAY;\n      }\n    }\n  }\n\n  return result;\n}\n\n/**\n * Factory function designed for normalization data schema from different data structures of the selection ranges.\n *\n * @param {String} type Selection type which will be processed.\n * @param {Object} [options]\n * @param {Boolean} [options.keepDirection=false] If `true`, the coordinates which contain the direction of the\n *                                                selected cells won't be changed. Otherwise, the selection will be\n *                                                normalized to values starting from top-left to bottom-right.\n * @param {Function} [options.propToCol] Pass the converting function (usually `datamap.propToCol`) if the column\n *                                       defined as props should be normalized to the numeric values.\n * @returns {Number[]} Returns normalized data about selected range as an array (`[rowStart, columnStart, rowEnd, columnEnd]`).\n */\nfunction normalizeSelectionFactory(type) {\n  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref$keepDirection = _ref.keepDirection,\n      keepDirection = _ref$keepDirection === undefined ? false : _ref$keepDirection,\n      propToCol = _ref.propToCol;\n\n  if (!SELECTION_TYPES.includes(type)) {\n    throw new Error('Unsupported selection ranges schema type was provided.');\n  }\n\n  return function (selection) {\n    var isObjectType = type === SELECTION_TYPE_OBJECT;\n    var rowStart = isObjectType ? selection.from.row : selection[0];\n    var columnStart = isObjectType ? selection.from.col : selection[1];\n    var rowEnd = isObjectType ? selection.to.row : selection[2];\n    var columnEnd = isObjectType ? selection.to.col : selection[3];\n\n    if (typeof propToCol === 'function') {\n      if (typeof columnStart === 'string') {\n        columnStart = propToCol(columnStart);\n      }\n      if (typeof columnEnd === 'string') {\n        columnEnd = propToCol(columnEnd);\n      }\n    }\n\n    if ((0, _mixed.isUndefined)(rowEnd)) {\n      rowEnd = rowStart;\n    }\n    if ((0, _mixed.isUndefined)(columnEnd)) {\n      columnEnd = columnStart;\n    }\n\n    if (!keepDirection) {\n      var origRowStart = rowStart;\n      var origColumnStart = columnStart;\n      var origRowEnd = rowEnd;\n      var origColumnEnd = columnEnd;\n\n      rowStart = Math.min(origRowStart, origRowEnd);\n      columnStart = Math.min(origColumnStart, origColumnEnd);\n      rowEnd = Math.max(origRowStart, origRowEnd);\n      columnEnd = Math.max(origColumnStart, origColumnEnd);\n    }\n\n    return [rowStart, columnStart, rowEnd, columnEnd];\n  };\n}\n\n/**\n * Function transform selection ranges (produced by `hot.getSelected()` and `hot.getSelectedRange()`) to normalized\n * data structure. It merges repeated ranges into consecutive coordinates. The returned structure\n * contains an array of arrays. The single item contains at index 0 visual column index from the selection was\n * started and at index 1 distance as a count of selected columns.\n *\n * @param {Array[]|CellRange[]} selectionRanges Selection ranges produced by Handsontable.\n * @return {Array[]} Returns an array of arrays with ranges defines in that schema:\n *                   `[[visualColumnStart, distance], [visualColumnStart, distance], ...]`.\n *                   The column distances are always created starting from the left (zero index) to the\n *                   right (the latest column index).\n */\nfunction transformSelectionToColumnDistance(selectionRanges) {\n  var selectionType = detectSelectionType(selectionRanges);\n\n  if (selectionType === SELECTION_TYPE_UNRECOGNIZED || selectionType === SELECTION_TYPE_EMPTY) {\n    return [];\n  }\n\n  var selectionSchemaNormalizer = normalizeSelectionFactory(selectionType);\n  var unorderedIndexes = new Set();\n\n  // Iterate through all ranges and collect all column indexes which are not saved yet.\n  (0, _array.arrayEach)(selectionRanges, function (selection) {\n    var _selectionSchemaNorma = selectionSchemaNormalizer(selection),\n        _selectionSchemaNorma2 = _slicedToArray(_selectionSchemaNorma, 4),\n        columnStart = _selectionSchemaNorma2[1],\n        columnEnd = _selectionSchemaNorma2[3];\n\n    var amount = columnEnd - columnStart + 1;\n\n    (0, _array.arrayEach)(Array.from(new Array(amount), function (_, i) {\n      return columnStart + i;\n    }), function (index) {\n      if (!unorderedIndexes.has(index)) {\n        unorderedIndexes.add(index);\n      }\n    });\n  });\n\n  // Sort indexes in ascending order to easily detecting non-consecutive columns.\n  var orderedIndexes = Array.from(unorderedIndexes).sort(function (a, b) {\n    return a - b;\n  });\n  var normalizedColumnRanges = (0, _array.arrayReduce)(orderedIndexes, function (acc, visualColumnIndex, index, array) {\n    if (index !== 0 && visualColumnIndex === array[index - 1] + 1) {\n      acc[acc.length - 1][1]++;\n    } else {\n      acc.push([visualColumnIndex, 1]);\n    }\n\n    return acc;\n  }, []);\n\n  return normalizedColumnRanges;\n}\n\n/**\n * Function transform selection ranges (produced by `hot.getSelected()` and `hot.getSelectedRange()`) to normalized\n * data structure. It merges repeated ranges into consecutive coordinates. The returned structure\n * contains an array of arrays. The single item contains at index 0 visual column index from the selection was\n * started and at index 1 distance as a count of selected columns.\n *\n * @param {Array[]|CellRange[]} selectionRanges Selection ranges produced by Handsontable.\n * @return {Array[]} Returns an array of arrays with ranges defines in that schema:\n *                   `[[visualColumnStart, distance], [visualColumnStart, distance], ...]`.\n *                   The column distances are always created starting from the left (zero index) to the\n *                   right (the latest column index).\n */\nfunction transformSelectionToRowDistance(selectionRanges) {\n  var selectionType = detectSelectionType(selectionRanges);\n\n  if (selectionType === SELECTION_TYPE_UNRECOGNIZED || selectionType === SELECTION_TYPE_EMPTY) {\n    return [];\n  }\n\n  var selectionSchemaNormalizer = normalizeSelectionFactory(selectionType);\n  var unorderedIndexes = new Set();\n\n  // Iterate through all ranges and collect all column indexes which are not saved yet.\n  (0, _array.arrayEach)(selectionRanges, function (selection) {\n    var _selectionSchemaNorma3 = selectionSchemaNormalizer(selection),\n        _selectionSchemaNorma4 = _slicedToArray(_selectionSchemaNorma3, 3),\n        rowStart = _selectionSchemaNorma4[0],\n        rowEnd = _selectionSchemaNorma4[2];\n\n    var amount = rowEnd - rowStart + 1;\n\n    (0, _array.arrayEach)(Array.from(new Array(amount), function (_, i) {\n      return rowStart + i;\n    }), function (index) {\n      if (!unorderedIndexes.has(index)) {\n        unorderedIndexes.add(index);\n      }\n    });\n  });\n\n  // Sort indexes in ascending order to easily detecting non-consecutive columns.\n  var orderedIndexes = Array.from(unorderedIndexes).sort(function (a, b) {\n    return a - b;\n  });\n  var normalizedRowRanges = (0, _array.arrayReduce)(orderedIndexes, function (acc, rowIndex, index, array) {\n    if (index !== 0 && rowIndex === array[index - 1] + 1) {\n      acc[acc.length - 1][1]++;\n    } else {\n      acc.push([rowIndex, 1]);\n    }\n\n    return acc;\n  }, []);\n\n  return normalizedRowRanges;\n}\n\n/**\n * Check if passed value can be treated as valid cell coordinate. The second argument is\n * used to check if the value doesn't exceed the defined max table rows/columns count.\n *\n * @param {*} coord\n * @param {Number} maxTableItemsCount The value that declares the maximum coordinate that is still validatable.\n * @return {Boolean}\n */\nfunction isValidCoord(coord) {\n  var maxTableItemsCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Infinity;\n\n  return typeof coord === 'number' && coord >= 0 && coord < maxTableItemsCount;\n};\n\n/***/ }),\n/* 92 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class GhostTable\n * @util\n */\nvar GhostTable = function () {\n  function GhostTable(hotInstance) {\n    _classCallCheck(this, GhostTable);\n\n    /**\n     * Handsontable instance.\n     *\n     * @type {Core}\n     */\n    this.hot = hotInstance;\n    /**\n     * Container element where every table will be injected.\n     *\n     * @type {HTMLElement|null}\n     */\n    this.container = null;\n    /**\n     * Flag which determine is table was injected to DOM.\n     *\n     * @type {Boolean}\n     */\n    this.injected = false;\n    /**\n     * Added rows collection.\n     *\n     * @type {Array}\n     */\n    this.rows = [];\n    /**\n     * Added columns collection.\n     *\n     * @type {Array}\n     */\n    this.columns = [];\n    /**\n     * Samples prepared for calculations.\n     *\n     * @type {Map}\n     * @default {null}\n     */\n    this.samples = null;\n    /**\n     * Ghost table settings.\n     *\n     * @type {Object}\n     * @default {Object}\n     */\n    this.settings = {\n      useHeaders: true\n    };\n  }\n\n  /**\n   * Add row.\n   *\n   * @param {Number} row Row index.\n   * @param {Map} samples Samples Map object.\n   */\n\n\n  _createClass(GhostTable, [{\n    key: 'addRow',\n    value: function addRow(row, samples) {\n      if (this.columns.length) {\n        throw new Error('Doesn\\'t support multi-dimensional table');\n      }\n      if (!this.rows.length) {\n        this.container = this.createContainer(this.hot.rootElement.className);\n      }\n      var rowObject = { row: row };\n      this.rows.push(rowObject);\n\n      this.samples = samples;\n      this.table = this.createTable(this.hot.table.className);\n      this.table.colGroup.appendChild(this.createColGroupsCol());\n      this.table.tr.appendChild(this.createRow(row));\n      this.container.container.appendChild(this.table.fragment);\n\n      rowObject.table = this.table.table;\n    }\n\n    /**\n     * Add a row consisting of the column headers.\n     */\n\n  }, {\n    key: 'addColumnHeadersRow',\n    value: function addColumnHeadersRow(samples) {\n      if (this.hot.getColHeader(0) != null) {\n        var rowObject = { row: -1 };\n        this.rows.push(rowObject);\n\n        this.container = this.createContainer(this.hot.rootElement.className);\n\n        this.samples = samples;\n        this.table = this.createTable(this.hot.table.className);\n        this.table.colGroup.appendChild(this.createColGroupsCol());\n        this.table.tHead.appendChild(this.createColumnHeadersRow());\n        this.container.container.appendChild(this.table.fragment);\n\n        rowObject.table = this.table.table;\n      }\n    }\n\n    /**\n     * Add column.\n     *\n     * @param {Number} column Column index.\n     * @param {Map} samples Samples Map object.\n     */\n\n  }, {\n    key: 'addColumn',\n    value: function addColumn(column, samples) {\n      if (this.rows.length) {\n        throw new Error('Doesn\\'t support multi-dimensional table');\n      }\n      if (!this.columns.length) {\n        this.container = this.createContainer(this.hot.rootElement.className);\n      }\n      var columnObject = { col: column };\n      this.columns.push(columnObject);\n\n      this.samples = samples;\n      this.table = this.createTable(this.hot.table.className);\n\n      if (this.getSetting('useHeaders') && this.hot.getColHeader(column) !== null) {\n        this.hot.view.appendColHeader(column, this.table.th);\n      }\n      this.table.tBody.appendChild(this.createCol(column));\n      this.container.container.appendChild(this.table.fragment);\n\n      columnObject.table = this.table.table;\n    }\n\n    /**\n     * Get calculated heights.\n     *\n     * @param {Function} callback Callback which will be fired for each calculated row.\n     */\n\n  }, {\n    key: 'getHeights',\n    value: function getHeights(callback) {\n      if (!this.injected) {\n        this.injectTable();\n      }\n      (0, _array.arrayEach)(this.rows, function (row) {\n        // -1 <- reduce border-top from table\n        callback(row.row, (0, _element.outerHeight)(row.table) - 1);\n      });\n    }\n\n    /**\n     * Get calculated widths.\n     *\n     * @param {Function} callback Callback which will be fired for each calculated column.\n     */\n\n  }, {\n    key: 'getWidths',\n    value: function getWidths(callback) {\n      if (!this.injected) {\n        this.injectTable();\n      }\n      (0, _array.arrayEach)(this.columns, function (column) {\n        callback(column.col, (0, _element.outerWidth)(column.table));\n      });\n    }\n\n    /**\n     * Set the Ghost Table settings to the provided object.\n     *\n     * @param {Object} settings New Ghost Table Settings\n     */\n\n  }, {\n    key: 'setSettings',\n    value: function setSettings(settings) {\n      this.settings = settings;\n    }\n\n    /**\n     * Set a single setting of the Ghost Table.\n     *\n     * @param {String} name Setting name.\n     * @param {*} value Setting value.\n     */\n\n  }, {\n    key: 'setSetting',\n    value: function setSetting(name, value) {\n      if (!this.settings) {\n        this.settings = {};\n      }\n\n      this.settings[name] = value;\n    }\n\n    /**\n     * Get the Ghost Table settings.\n     *\n     * @returns {Object|null}\n     */\n\n  }, {\n    key: 'getSettings',\n    value: function getSettings() {\n      return this.settings;\n    }\n\n    /**\n     * Get a single Ghost Table setting.\n     *\n     * @param {String} name\n     * @returns {Boolean|null}\n     */\n\n  }, {\n    key: 'getSetting',\n    value: function getSetting(name) {\n      if (this.settings) {\n        return this.settings[name];\n      }\n      return null;\n    }\n\n    /**\n     * Create colgroup col elements.\n     *\n     * @returns {DocumentFragment}\n     */\n\n  }, {\n    key: 'createColGroupsCol',\n    value: function createColGroupsCol() {\n      var _this = this;\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n\n      if (this.hot.hasRowHeaders()) {\n        fragment.appendChild(this.createColElement(-1));\n      }\n\n      this.samples.forEach(function (sample) {\n        (0, _array.arrayEach)(sample.strings, function (string) {\n          fragment.appendChild(_this.createColElement(string.col));\n        });\n      });\n\n      return fragment;\n    }\n\n    /**\n     * Create table row element.\n     *\n     * @param {Number} row Row index.\n     * @returns {DocumentFragment} Returns created table row elements.\n     */\n\n  }, {\n    key: 'createRow',\n    value: function createRow(row) {\n      var _this2 = this;\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n      var th = d.createElement('th');\n\n      if (this.hot.hasRowHeaders()) {\n        this.hot.view.appendRowHeader(row, th);\n\n        fragment.appendChild(th);\n      }\n\n      this.samples.forEach(function (sample) {\n        (0, _array.arrayEach)(sample.strings, function (string) {\n          var column = string.col;\n          var cellProperties = _this2.hot.getCellMeta(row, column);\n\n          cellProperties.col = column;\n          cellProperties.row = row;\n\n          var renderer = _this2.hot.getCellRenderer(cellProperties);\n          var td = d.createElement('td');\n\n          renderer(_this2.hot, td, row, column, _this2.hot.colToProp(column), string.value, cellProperties);\n          fragment.appendChild(td);\n        });\n      });\n\n      return fragment;\n    }\n  }, {\n    key: 'createColumnHeadersRow',\n    value: function createColumnHeadersRow() {\n      var _this3 = this;\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n\n      if (this.hot.hasRowHeaders()) {\n        var th = d.createElement('th');\n        this.hot.view.appendColHeader(-1, th);\n        fragment.appendChild(th);\n      }\n\n      this.samples.forEach(function (sample) {\n        (0, _array.arrayEach)(sample.strings, function (string) {\n          var column = string.col;\n\n          var th = d.createElement('th');\n\n          _this3.hot.view.appendColHeader(column, th);\n          fragment.appendChild(th);\n        });\n      });\n\n      return fragment;\n    }\n\n    /**\n     * Create table column elements.\n     *\n     * @param {Number} column Column index.\n     * @returns {DocumentFragment} Returns created column table column elements.\n     */\n\n  }, {\n    key: 'createCol',\n    value: function createCol(column) {\n      var _this4 = this;\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n\n      this.samples.forEach(function (sample) {\n        (0, _array.arrayEach)(sample.strings, function (string) {\n          var row = string.row;\n          var cellProperties = _this4.hot.getCellMeta(row, column);\n\n          cellProperties.col = column;\n          cellProperties.row = row;\n\n          var renderer = _this4.hot.getCellRenderer(cellProperties);\n          var td = d.createElement('td');\n          var tr = d.createElement('tr');\n\n          renderer(_this4.hot, td, row, column, _this4.hot.colToProp(column), string.value, cellProperties);\n          tr.appendChild(td);\n          fragment.appendChild(tr);\n        });\n      });\n\n      return fragment;\n    }\n\n    /**\n     * Remove table from document and reset internal state.\n     */\n\n  }, {\n    key: 'clean',\n    value: function clean() {\n      this.rows.length = 0;\n      this.rows[-1] = void 0;\n      this.columns.length = 0;\n\n      if (this.samples) {\n        this.samples.clear();\n      }\n      this.samples = null;\n      this.removeTable();\n    }\n\n    /**\n     * Inject generated table into document.\n     *\n     * @param {HTMLElement} [parent=null]\n     */\n\n  }, {\n    key: 'injectTable',\n    value: function injectTable() {\n      var parent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      if (!this.injected) {\n        (parent || this.hot.rootElement).appendChild(this.container.fragment);\n        this.injected = true;\n      }\n    }\n\n    /**\n     * Remove table from document.\n     */\n\n  }, {\n    key: 'removeTable',\n    value: function removeTable() {\n      if (this.injected && this.container.container.parentNode) {\n        this.container.container.parentNode.removeChild(this.container.container);\n        this.container = null;\n        this.injected = false;\n      }\n    }\n\n    /**\n     * Create col element.\n     *\n     * @param {Number} column Column index.\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createColElement',\n    value: function createColElement(column) {\n      var d = document;\n      var col = d.createElement('col');\n\n      col.style.width = this.hot.view.wt.wtTable.getStretchedColumnWidth(column) + 'px';\n\n      return col;\n    }\n\n    /**\n     * Create table element.\n     *\n     * @param {String} className\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'createTable',\n    value: function createTable() {\n      var className = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n      var table = d.createElement('table');\n      var tHead = d.createElement('thead');\n      var tBody = d.createElement('tbody');\n      var colGroup = d.createElement('colgroup');\n      var tr = d.createElement('tr');\n      var th = d.createElement('th');\n\n      if (this.isVertical()) {\n        table.appendChild(colGroup);\n      }\n      if (this.isHorizontal()) {\n        tr.appendChild(th);\n        tHead.appendChild(tr);\n        table.style.tableLayout = 'auto';\n        table.style.width = 'auto';\n      }\n      table.appendChild(tHead);\n\n      if (this.isVertical()) {\n        tBody.appendChild(tr);\n      }\n      table.appendChild(tBody);\n      (0, _element.addClass)(table, className);\n      fragment.appendChild(table);\n\n      return { fragment: fragment, table: table, tHead: tHead, tBody: tBody, colGroup: colGroup, tr: tr, th: th };\n    }\n\n    /**\n     * Create container for tables.\n     *\n     * @param {String} className\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'createContainer',\n    value: function createContainer() {\n      var className = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n      var container = d.createElement('div');\n\n      className = 'htGhostTable htAutoSize ' + className.trim();\n      (0, _element.addClass)(container, className);\n      fragment.appendChild(container);\n\n      return { fragment: fragment, container: container };\n    }\n\n    /**\n     * Checks if table is raised vertically (checking rows).\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isVertical',\n    value: function isVertical() {\n      return !!(this.rows.length && !this.columns.length);\n    }\n\n    /**\n     * Checks if table is raised horizontally (checking columns).\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isHorizontal',\n    value: function isHorizontal() {\n      return !!(this.columns.length && !this.rows.length);\n    }\n  }]);\n\n  return GhostTable;\n}();\n\nexports.default = GhostTable;\n\n/***/ }),\n/* 93 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = separatorItem;\nvar KEY = exports.KEY = '---------';\n\nfunction separatorItem() {\n  return {\n    name: KEY\n  };\n}\n\n/***/ }),\n/* 94 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.ITEMS = exports.UNDO = exports.SEPARATOR = exports.ROW_BELOW = exports.ROW_ABOVE = exports.REMOVE_ROW = exports.REMOVE_COLUMN = exports.REDO = exports.READ_ONLY = exports.COLUMN_RIGHT = exports.COLUMN_LEFT = exports.CLEAR_COLUMN = exports.ALIGNMENT = undefined;\n\nvar _predefinedItems2;\n\nvar _alignment = __webpack_require__(300);\n\nObject.defineProperty(exports, 'ALIGNMENT', {\n  enumerable: true,\n  get: function get() {\n    return _alignment.KEY;\n  }\n});\n\nvar _clearColumn = __webpack_require__(301);\n\nObject.defineProperty(exports, 'CLEAR_COLUMN', {\n  enumerable: true,\n  get: function get() {\n    return _clearColumn.KEY;\n  }\n});\n\nvar _columnLeft = __webpack_require__(302);\n\nObject.defineProperty(exports, 'COLUMN_LEFT', {\n  enumerable: true,\n  get: function get() {\n    return _columnLeft.KEY;\n  }\n});\n\nvar _columnRight = __webpack_require__(303);\n\nObject.defineProperty(exports, 'COLUMN_RIGHT', {\n  enumerable: true,\n  get: function get() {\n    return _columnRight.KEY;\n  }\n});\n\nvar _readOnly = __webpack_require__(304);\n\nObject.defineProperty(exports, 'READ_ONLY', {\n  enumerable: true,\n  get: function get() {\n    return _readOnly.KEY;\n  }\n});\n\nvar _redo = __webpack_require__(305);\n\nObject.defineProperty(exports, 'REDO', {\n  enumerable: true,\n  get: function get() {\n    return _redo.KEY;\n  }\n});\n\nvar _removeColumn = __webpack_require__(306);\n\nObject.defineProperty(exports, 'REMOVE_COLUMN', {\n  enumerable: true,\n  get: function get() {\n    return _removeColumn.KEY;\n  }\n});\n\nvar _removeRow = __webpack_require__(307);\n\nObject.defineProperty(exports, 'REMOVE_ROW', {\n  enumerable: true,\n  get: function get() {\n    return _removeRow.KEY;\n  }\n});\n\nvar _rowAbove = __webpack_require__(308);\n\nObject.defineProperty(exports, 'ROW_ABOVE', {\n  enumerable: true,\n  get: function get() {\n    return _rowAbove.KEY;\n  }\n});\n\nvar _rowBelow = __webpack_require__(309);\n\nObject.defineProperty(exports, 'ROW_BELOW', {\n  enumerable: true,\n  get: function get() {\n    return _rowBelow.KEY;\n  }\n});\n\nvar _separator = __webpack_require__(93);\n\nObject.defineProperty(exports, 'SEPARATOR', {\n  enumerable: true,\n  get: function get() {\n    return _separator.KEY;\n  }\n});\n\nvar _undo = __webpack_require__(310);\n\nObject.defineProperty(exports, 'UNDO', {\n  enumerable: true,\n  get: function get() {\n    return _undo.KEY;\n  }\n});\nexports.predefinedItems = predefinedItems;\nexports.addItem = addItem;\n\nvar _object = __webpack_require__(2);\n\nvar _alignment2 = _interopRequireDefault(_alignment);\n\nvar _clearColumn2 = _interopRequireDefault(_clearColumn);\n\nvar _columnLeft2 = _interopRequireDefault(_columnLeft);\n\nvar _columnRight2 = _interopRequireDefault(_columnRight);\n\nvar _readOnly2 = _interopRequireDefault(_readOnly);\n\nvar _redo2 = _interopRequireDefault(_redo);\n\nvar _removeColumn2 = _interopRequireDefault(_removeColumn);\n\nvar _removeRow2 = _interopRequireDefault(_removeRow);\n\nvar _rowAbove2 = _interopRequireDefault(_rowAbove);\n\nvar _rowBelow2 = _interopRequireDefault(_rowBelow);\n\nvar _separator2 = _interopRequireDefault(_separator);\n\nvar _undo2 = _interopRequireDefault(_undo);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar ITEMS = exports.ITEMS = [_rowAbove.KEY, _rowBelow.KEY, _columnLeft.KEY, _columnRight.KEY, _clearColumn.KEY, _removeRow.KEY, _removeColumn.KEY, _undo.KEY, _redo.KEY, _readOnly.KEY, _alignment.KEY, _separator.KEY];\n\nvar _predefinedItems = (_predefinedItems2 = {}, _defineProperty(_predefinedItems2, _separator.KEY, _separator2.default), _defineProperty(_predefinedItems2, _rowAbove.KEY, _rowAbove2.default), _defineProperty(_predefinedItems2, _rowBelow.KEY, _rowBelow2.default), _defineProperty(_predefinedItems2, _columnLeft.KEY, _columnLeft2.default), _defineProperty(_predefinedItems2, _columnRight.KEY, _columnRight2.default), _defineProperty(_predefinedItems2, _clearColumn.KEY, _clearColumn2.default), _defineProperty(_predefinedItems2, _removeRow.KEY, _removeRow2.default), _defineProperty(_predefinedItems2, _removeColumn.KEY, _removeColumn2.default), _defineProperty(_predefinedItems2, _undo.KEY, _undo2.default), _defineProperty(_predefinedItems2, _redo.KEY, _redo2.default), _defineProperty(_predefinedItems2, _readOnly.KEY, _readOnly2.default), _defineProperty(_predefinedItems2, _alignment.KEY, _alignment2.default), _predefinedItems2);\n\n/**\n * Gets new object with all predefined menu items.\n *\n * @returns {Object}\n */\nfunction predefinedItems() {\n  var items = {};\n\n  (0, _object.objectEach)(_predefinedItems, function (itemFactory, key) {\n    items[key] = itemFactory();\n  });\n\n  return items;\n}\n\n/**\n * Add new predefined menu item to the collection.\n *\n * @param {String} key Menu command id.\n * @param {Object} item Object command descriptor.\n */\nfunction addItem(key, item) {\n  if (ITEMS.indexOf(key) === -1) {\n    _predefinedItems[key] = item;\n  }\n}\n\n/***/ }),\n/* 95 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['The merged cell declared with {row: ', ', col: ', ', rowspan: \\n    ', ', colspan: ', '} contains negative values, which is not supported. It \\n    will not be added to the collection.'], ['The merged cell declared with {row: ', ', col: ', ', rowspan: \\n    ', ', colspan: ', '} contains negative values, which is not supported. It \\n    will not be added to the collection.']),\n    _templateObject2 = _taggedTemplateLiteral(['The merged cell declared at [', ', ', '] is positioned (or positioned partially) \\n       outside of the table range. It was not added to the table, please fix your setup.'], ['The merged cell declared at [', ', ', '] is positioned (or positioned partially) \\n       outside of the table range. It was not added to the table, please fix your setup.']),\n    _templateObject3 = _taggedTemplateLiteral(['The merged cell declared at [', ', ', '] has both \"rowspan\" \\n     and \"colspan\" declared as \"1\", which makes it a single cell. It cannot be added to the collection.'], ['The merged cell declared at [', ', ', '] has both \"rowspan\" \\n     and \"colspan\" declared as \"1\", which makes it a single cell. It cannot be added to the collection.']),\n    _templateObject4 = _taggedTemplateLiteral(['The merged cell declared at [', ', ', '] has \"rowspan\" or \"colspan\" declared as \\n      \"0\", which is not supported. It cannot be added to the collection.'], ['The merged cell declared at [', ', ', '] has \"rowspan\" or \"colspan\" declared as \\n      \"0\", which is not supported. It cannot be added to the collection.']);\n\nvar _index = __webpack_require__(4);\n\nvar _templateLiteralTag = __webpack_require__(41);\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * The `MergedCellCoords` class represents a single merged cell.\n *\n * @class MergedCellCoords\n * @plugin MergeCells\n */\nvar MergedCellCoords = function () {\n  function MergedCellCoords(row, column, rowspan, colspan) {\n    _classCallCheck(this, MergedCellCoords);\n\n    /**\n     * The index of the topmost merged cell row.\n     *\n     * @type {Number}\n     */\n    this.row = row;\n    /**\n     * The index of the leftmost column.\n     *\n     * @type {Number}\n     */\n    this.col = column;\n    /**\n     * The `rowspan` value of the merged cell.\n     *\n     * @type {Number}\n     */\n    this.rowspan = rowspan;\n    /**\n     * The `colspan` value of the merged cell.\n     *\n     * @type {Number}\n     */\n    this.colspan = colspan;\n    /**\n     * `true` only if the merged cell is bound to be removed.\n     *\n     * @type {Boolean}\n     */\n    this.removed = false;\n  }\n\n  /**\n   * Get a warning message for when the declared merged cell data contains negative values.\n   *\n   * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n   * @return {String}\n   */\n\n\n  _createClass(MergedCellCoords, [{\n    key: 'normalize',\n\n\n    /**\n     * Sanitize (prevent from going outside the boundaries) the merged cell.\n     *\n     * @param hotInstance\n     */\n    value: function normalize(hotInstance) {\n      var totalRows = hotInstance.countRows();\n      var totalColumns = hotInstance.countCols();\n\n      if (this.row < 0) {\n        this.row = 0;\n      } else if (this.row > totalRows - 1) {\n        this.row = totalRows - 1;\n      }\n\n      if (this.col < 0) {\n        this.col = 0;\n      } else if (this.col > totalColumns - 1) {\n        this.col = totalColumns - 1;\n      }\n\n      if (this.row + this.rowspan > totalRows - 1) {\n        this.rowspan = totalRows - this.row;\n      }\n\n      if (this.col + this.colspan > totalColumns - 1) {\n        this.colspan = totalColumns - this.col;\n      }\n    }\n\n    /**\n     * Returns `true` if the provided coordinates are inside the merged cell.\n     *\n     * @param {Number} row The row index.\n     * @param {Number} column The column index.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'includes',\n    value: function includes(row, column) {\n      return this.row <= row && this.col <= column && this.row + this.rowspan - 1 >= row && this.col + this.colspan - 1 >= column;\n    }\n\n    /**\n     * Returns `true` if the provided `column` property is within the column span of the merged cell.\n     *\n     * @param {Number} column The column index.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'includesHorizontally',\n    value: function includesHorizontally(column) {\n      return this.col <= column && this.col + this.colspan - 1 >= column;\n    }\n\n    /**\n     * Returns `true` if the provided `row` property is within the row span of the merged cell.\n     *\n     * @param {Number} row Row index.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'includesVertically',\n    value: function includesVertically(row) {\n      return this.row <= row && this.row + this.rowspan - 1 >= row;\n    }\n\n    /**\n     * Shift (and possibly resize, if needed) the merged cell.\n     *\n     * @param {Array} shiftVector 2-element array containing the information on the shifting in the `x` and `y` axis.\n     * @param {Number} indexOfChange Index of the preceding change.\n     * @returns {Boolean} Returns `false` if the whole merged cell was removed.\n     */\n\n  }, {\n    key: 'shift',\n    value: function shift(shiftVector, indexOfChange) {\n      var shiftValue = shiftVector[0] || shiftVector[1];\n      var shiftedIndex = indexOfChange + Math.abs(shiftVector[0] || shiftVector[1]) - 1;\n      var span = shiftVector[0] ? 'colspan' : 'rowspan';\n      var index = shiftVector[0] ? 'col' : 'row';\n      var changeStart = Math.min(indexOfChange, shiftedIndex);\n      var changeEnd = Math.max(indexOfChange, shiftedIndex);\n      var mergeStart = this[index];\n      var mergeEnd = this[index] + this[span] - 1;\n\n      if (mergeStart >= indexOfChange) {\n        this[index] += shiftValue;\n      }\n\n      // adding rows/columns\n      if (shiftValue > 0) {\n        if (indexOfChange <= mergeEnd && indexOfChange > mergeStart) {\n          this[span] += shiftValue;\n        }\n\n        // removing rows/columns\n      } else if (shiftValue < 0) {\n\n        // removing the whole merge\n        if (changeStart <= mergeStart && changeEnd >= mergeEnd) {\n          this.removed = true;\n          return false;\n\n          // removing the merge partially, including the beginning\n        } else if (mergeStart >= changeStart && mergeStart <= changeEnd) {\n          var removedOffset = changeEnd - mergeStart + 1;\n          var preRemovedOffset = Math.abs(shiftValue) - removedOffset;\n\n          this[index] -= preRemovedOffset + shiftValue;\n          this[span] -= removedOffset;\n\n          // removing the middle part of the merge\n        } else if (mergeStart <= changeStart && mergeEnd >= changeEnd) {\n          this[span] += shiftValue;\n\n          // removing the end part of the merge\n        } else if (mergeStart <= changeStart && mergeEnd >= changeStart && mergeEnd < changeEnd) {\n          var removedPart = mergeEnd - changeStart + 1;\n\n          this[span] -= removedPart;\n        }\n      }\n\n      return true;\n    }\n\n    /**\n     * Check if the second provided merged cell is \"farther\" in the provided direction.\n     *\n     * @param {MergedCellCoords} mergedCell The merged cell to check.\n     * @param {String} direction Drag direction.\n     * @return {Boolean|null} `true` if the second provided merged cell is \"farther\".\n     */\n\n  }, {\n    key: 'isFarther',\n    value: function isFarther(mergedCell, direction) {\n      if (!mergedCell) {\n        return true;\n      }\n\n      if (direction === 'down') {\n        return mergedCell.row + mergedCell.rowspan - 1 < this.row + this.rowspan - 1;\n      } else if (direction === 'up') {\n        return mergedCell.row > this.row;\n      } else if (direction === 'right') {\n        return mergedCell.col + mergedCell.colspan - 1 < this.col + this.colspan - 1;\n      } else if (direction === 'left') {\n        return mergedCell.col > this.col;\n      }\n      return null;\n    }\n\n    /**\n     * Get the bottom row index of the merged cell.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getLastRow',\n    value: function getLastRow() {\n      return this.row + this.rowspan - 1;\n    }\n\n    /**\n     * Get the rightmost column index of the merged cell.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getLastColumn',\n    value: function getLastColumn() {\n      return this.col + this.colspan - 1;\n    }\n\n    /**\n     * Get the range coordinates of the merged cell.\n     *\n     * @return {CellRange}\n     */\n\n  }, {\n    key: 'getRange',\n    value: function getRange() {\n      return new _index.CellRange(new _index.CellCoords(this.row, this.col), new _index.CellCoords(this.row, this.col), new _index.CellCoords(this.getLastRow(), this.getLastColumn()));\n    }\n  }], [{\n    key: 'NEGATIVE_VALUES_WARNING',\n    value: function NEGATIVE_VALUES_WARNING(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject, newMergedCell.row, newMergedCell.col, newMergedCell.rowspan, newMergedCell.colspan);\n    }\n\n    /**\n     * Get a warning message for when the declared merged cell data contains values exceeding the table limits.\n     *\n     * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n     * @return {String}\n     */\n\n  }, {\n    key: 'IS_OUT_OF_BOUNDS_WARNING',\n    value: function IS_OUT_OF_BOUNDS_WARNING(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject2, newMergedCell.row, newMergedCell.col);\n    }\n\n    /**\n     * Get a warning message for when the declared merged cell data represents a single cell.\n     *\n     * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n     * @return {String}\n     */\n\n  }, {\n    key: 'IS_SINGLE_CELL',\n    value: function IS_SINGLE_CELL(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject3, newMergedCell.row, newMergedCell.col);\n    }\n\n    /**\n     * Get a warning message for when the declared merged cell data contains \"colspan\" or \"rowspan\", that equals 0.\n     *\n     * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n     * @return {String}\n     */\n\n  }, {\n    key: 'ZERO_SPAN_WARNING',\n    value: function ZERO_SPAN_WARNING(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject4, newMergedCell.row, newMergedCell.col);\n    }\n\n    /**\n     * Check whether the values provided for a merged cell contain any negative values.\n     *\n     * @param {Object} mergedCellInfo Object containing the `row`, `col`, `rowspan` and `colspan` properties.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'containsNegativeValues',\n    value: function containsNegativeValues(mergedCellInfo) {\n      return mergedCellInfo.row < 0 || mergedCellInfo.col < 0 || mergedCellInfo.rowspan < 0 || mergedCellInfo.colspan < 0;\n    }\n\n    /**\n     * Check whether the provided merged cell information object represents a single cell.\n     *\n     * @private\n     * @param {Object} mergedCellInfo An object with `row`, `col`, `rowspan` and `colspan` properties.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSingleCell',\n    value: function isSingleCell(mergedCellInfo) {\n      return mergedCellInfo.colspan === 1 && mergedCellInfo.rowspan === 1;\n    }\n\n    /**\n     * Check whether the provided merged cell information object contains a rowspan or colspan of 0.\n     *\n     * @private\n     * @param {Object} mergedCellInfo An object with `row`, `col`, `rowspan` and `colspan` properties.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'containsZeroSpan',\n    value: function containsZeroSpan(mergedCellInfo) {\n      return mergedCellInfo.colspan === 0 || mergedCellInfo.rowspan === 0;\n    }\n\n    /**\n     * Check whether the provided merged cell object is to be declared out of bounds of the table.\n     *\n     * @param {Object} mergeCell Object containing the `row`, `col`, `rowspan` and `colspan` properties.\n     * @param {Number} rowCount Number of rows in the table.\n     * @param {Number} columnCount Number of rows in the table.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isOutOfBounds',\n    value: function isOutOfBounds(mergeCell, rowCount, columnCount) {\n      return mergeCell.row < 0 || mergeCell.col < 0 || mergeCell.row >= rowCount || mergeCell.row + mergeCell.rowspan - 1 >= rowCount || mergeCell.col >= columnCount || mergeCell.col + mergeCell.colspan - 1 >= columnCount;\n    }\n  }]);\n\n  return MergedCellCoords;\n}();\n\nexports.default = MergedCellCoords;\n\n/***/ }),\n/* 96 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar strong = __webpack_require__(97);\nvar validate = __webpack_require__(45);\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = __webpack_require__(66)(MAP, function (get) {\n  return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.1.3.6 Map.prototype.get(key)\n  get: function get(key) {\n    var entry = strong.getEntry(validate(this, MAP), key);\n    return entry && entry.v;\n  },\n  // 23.1.3.9 Map.prototype.set(key, value)\n  set: function set(key, value) {\n    return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n  }\n}, strong, true);\n\n\n/***/ }),\n/* 97 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar dP = __webpack_require__(20).f;\nvar create = __webpack_require__(74);\nvar redefineAll = __webpack_require__(61);\nvar ctx = __webpack_require__(32);\nvar anInstance = __webpack_require__(63);\nvar forOf = __webpack_require__(64);\nvar $iterDefine = __webpack_require__(106);\nvar step = __webpack_require__(108);\nvar setSpecies = __webpack_require__(109);\nvar DESCRIPTORS = __webpack_require__(22);\nvar fastKey = __webpack_require__(34).fastKey;\nvar validate = __webpack_require__(45);\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n  // fast case\n  var index = fastKey(key);\n  var entry;\n  if (index !== 'F') return that._i[index];\n  // frozen object case\n  for (entry = that._f; entry; entry = entry.n) {\n    if (entry.k == key) return entry;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      anInstance(that, C, NAME, '_i');\n      that._t = NAME;         // collection type\n      that._i = create(null); // index\n      that._f = undefined;    // first entry\n      that._l = undefined;    // last entry\n      that[SIZE] = 0;         // size\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.1.3.1 Map.prototype.clear()\n      // 23.2.3.2 Set.prototype.clear()\n      clear: function clear() {\n        for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n          entry.r = true;\n          if (entry.p) entry.p = entry.p.n = undefined;\n          delete data[entry.i];\n        }\n        that._f = that._l = undefined;\n        that[SIZE] = 0;\n      },\n      // 23.1.3.3 Map.prototype.delete(key)\n      // 23.2.3.4 Set.prototype.delete(value)\n      'delete': function (key) {\n        var that = validate(this, NAME);\n        var entry = getEntry(that, key);\n        if (entry) {\n          var next = entry.n;\n          var prev = entry.p;\n          delete that._i[entry.i];\n          entry.r = true;\n          if (prev) prev.n = next;\n          if (next) next.p = prev;\n          if (that._f == entry) that._f = next;\n          if (that._l == entry) that._l = prev;\n          that[SIZE]--;\n        } return !!entry;\n      },\n      // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n      // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n      forEach: function forEach(callbackfn /* , that = undefined */) {\n        validate(this, NAME);\n        var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n        var entry;\n        while (entry = entry ? entry.n : this._f) {\n          f(entry.v, entry.k, this);\n          // revert to the last existing entry\n          while (entry && entry.r) entry = entry.p;\n        }\n      },\n      // 23.1.3.7 Map.prototype.has(key)\n      // 23.2.3.7 Set.prototype.has(value)\n      has: function has(key) {\n        return !!getEntry(validate(this, NAME), key);\n      }\n    });\n    if (DESCRIPTORS) dP(C.prototype, 'size', {\n      get: function () {\n        return validate(this, NAME)[SIZE];\n      }\n    });\n    return C;\n  },\n  def: function (that, key, value) {\n    var entry = getEntry(that, key);\n    var prev, index;\n    // change existing entry\n    if (entry) {\n      entry.v = value;\n    // create new entry\n    } else {\n      that._l = entry = {\n        i: index = fastKey(key, true), // <- index\n        k: key,                        // <- key\n        v: value,                      // <- value\n        p: prev = that._l,             // <- previous entry\n        n: undefined,                  // <- next entry\n        r: false                       // <- removed\n      };\n      if (!that._f) that._f = entry;\n      if (prev) prev.n = entry;\n      that[SIZE]++;\n      // add to index\n      if (index !== 'F') that._i[index] = entry;\n    } return that;\n  },\n  getEntry: getEntry,\n  setStrong: function (C, NAME, IS_MAP) {\n    // add .keys, .values, .entries, [@@iterator]\n    // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n    $iterDefine(C, NAME, function (iterated, kind) {\n      this._t = validate(iterated, NAME); // target\n      this._k = kind;                     // kind\n      this._l = undefined;                // previous\n    }, function () {\n      var that = this;\n      var kind = that._k;\n      var entry = that._l;\n      // revert to the last existing entry\n      while (entry && entry.r) entry = entry.p;\n      // get next entry\n      if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n        // or finish the iteration\n        that._t = undefined;\n        return step(1);\n      }\n      // return step by kind\n      if (kind == 'keys') return step(0, entry.k);\n      if (kind == 'values') return step(0, entry.v);\n      return step(0, [entry.k, entry.v]);\n    }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n    // add [@@species], 23.1.2.2, 23.2.2.2\n    setSpecies(NAME);\n  }\n};\n\n\n/***/ }),\n/* 98 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = !__webpack_require__(22) && !__webpack_require__(23)(function () {\n  return Object.defineProperty(__webpack_require__(72)('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n/* 99 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar has = __webpack_require__(29);\nvar toIObject = __webpack_require__(24);\nvar arrayIndexOf = __webpack_require__(100)(false);\nvar IE_PROTO = __webpack_require__(76)('IE_PROTO');\n\nmodule.exports = function (object, names) {\n  var O = toIObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (has(O, key = names[i++])) {\n    ~arrayIndexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n\n\n/***/ }),\n/* 100 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = __webpack_require__(24);\nvar toLength = __webpack_require__(25);\nvar toAbsoluteIndex = __webpack_require__(60);\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIObject($this);\n    var length = toLength(O.length);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n      if (O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n\n\n/***/ }),\n/* 101 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar document = __webpack_require__(14).document;\nmodule.exports = document && document.documentElement;\n\n\n/***/ }),\n/* 102 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// call something on iterator step with safe closing on error\nvar anObject = __webpack_require__(18);\nmodule.exports = function (iterator, fn, value, entries) {\n  try {\n    return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n  // 7.4.6 IteratorClose(iterator, completion)\n  } catch (e) {\n    var ret = iterator['return'];\n    if (ret !== undefined) anObject(ret.call(iterator));\n    throw e;\n  }\n};\n\n\n/***/ }),\n/* 103 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// check on default Array iterator\nvar Iterators = __webpack_require__(50);\nvar ITERATOR = __webpack_require__(11)('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n\n\n/***/ }),\n/* 104 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar classof = __webpack_require__(105);\nvar ITERATOR = __webpack_require__(11)('iterator');\nvar Iterators = __webpack_require__(50);\nmodule.exports = __webpack_require__(44).getIteratorMethod = function (it) {\n  if (it != undefined) return it[ITERATOR]\n    || it['@@iterator']\n    || Iterators[classof(it)];\n};\n\n\n/***/ }),\n/* 105 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(43);\nvar TAG = __webpack_require__(11)('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n    // builtinTag case\n    : ARG ? cof(O)\n    // ES3 arguments fallback\n    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\n\n/***/ }),\n/* 106 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(65);\nvar $export = __webpack_require__(3);\nvar redefine = __webpack_require__(30);\nvar hide = __webpack_require__(31);\nvar Iterators = __webpack_require__(50);\nvar $iterCreate = __webpack_require__(208);\nvar setToStringTag = __webpack_require__(51);\nvar getPrototypeOf = __webpack_require__(107);\nvar ITERATOR = __webpack_require__(11)('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function (kind) {\n    if (!BUGGY && kind in proto) return proto[kind];\n    switch (kind) {\n      case KEYS: return function keys() { return new Constructor(this, kind); };\n      case VALUES: return function values() { return new Constructor(this, kind); };\n    } return function entries() { return new Constructor(this, kind); };\n  };\n  var TAG = NAME + ' Iterator';\n  var DEF_VALUES = DEFAULT == VALUES;\n  var VALUES_BUG = false;\n  var proto = Base.prototype;\n  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n  var $default = $native || getMethod(DEFAULT);\n  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n  var methods, key, IteratorPrototype;\n  // Fix native\n  if ($anyNative) {\n    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n      // Set @@toStringTag to native iterators\n      setToStringTag(IteratorPrototype, TAG, true);\n      // fix for some old engines\n      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n    }\n  }\n  // fix Array#{values, @@iterator}.name in V8 / FF\n  if (DEF_VALUES && $native && $native.name !== VALUES) {\n    VALUES_BUG = true;\n    $default = function values() { return $native.call(this); };\n  }\n  // Define iterator\n  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG] = returnThis;\n  if (DEFAULT) {\n    methods = {\n      values: DEF_VALUES ? $default : getMethod(VALUES),\n      keys: IS_SET ? $default : getMethod(KEYS),\n      entries: $entries\n    };\n    if (FORCED) for (key in methods) {\n      if (!(key in proto)) redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n\n\n/***/ }),\n/* 107 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(29);\nvar toObject = __webpack_require__(33);\nvar IE_PROTO = __webpack_require__(76)('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n  O = toObject(O);\n  if (has(O, IE_PROTO)) return O[IE_PROTO];\n  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  } return O instanceof Object ? ObjectProto : null;\n};\n\n\n/***/ }),\n/* 108 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (done, value) {\n  return { value: value, done: !!done };\n};\n\n\n/***/ }),\n/* 109 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar global = __webpack_require__(14);\nvar dP = __webpack_require__(20);\nvar DESCRIPTORS = __webpack_require__(22);\nvar SPECIES = __webpack_require__(11)('species');\n\nmodule.exports = function (KEY) {\n  var C = global[KEY];\n  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n    configurable: true,\n    get: function () { return this; }\n  });\n};\n\n\n/***/ }),\n/* 110 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = __webpack_require__(9);\nvar anObject = __webpack_require__(18);\nvar check = function (O, proto) {\n  anObject(O);\n  if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n    function (test, buggy, set) {\n      try {\n        set = __webpack_require__(32)(Function.call, __webpack_require__(67).f(Object.prototype, '__proto__').set, 2);\n        set(test, []);\n        buggy = !(test instanceof Array);\n      } catch (e) { buggy = true; }\n      return function setPrototypeOf(O, proto) {\n        check(O, proto);\n        if (buggy) O.__proto__ = proto;\n        else set(O, proto);\n        return O;\n      };\n    }({}, false) : undefined),\n  check: check\n};\n\n\n/***/ }),\n/* 111 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar strong = __webpack_require__(97);\nvar validate = __webpack_require__(45);\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = __webpack_require__(66)(SET, function (get) {\n  return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.2.3.1 Set.prototype.add(value)\n  add: function add(value) {\n    return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n  }\n}, strong);\n\n\n/***/ }),\n/* 112 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar each = __webpack_require__(68)(0);\nvar redefine = __webpack_require__(30);\nvar meta = __webpack_require__(34);\nvar assign = __webpack_require__(114);\nvar weak = __webpack_require__(115);\nvar isObject = __webpack_require__(9);\nvar fails = __webpack_require__(23);\nvar validate = __webpack_require__(45);\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n  return function WeakMap() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n};\n\nvar methods = {\n  // 23.3.3.3 WeakMap.prototype.get(key)\n  get: function get(key) {\n    if (isObject(key)) {\n      var data = getWeak(key);\n      if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n      return data ? data[this._i] : undefined;\n    }\n  },\n  // 23.3.3.5 WeakMap.prototype.set(key, value)\n  set: function set(key, value) {\n    return weak.def(validate(this, WEAK_MAP), key, value);\n  }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = __webpack_require__(66)(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n  InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n  assign(InternalMap.prototype, methods);\n  meta.NEED = true;\n  each(['delete', 'has', 'get', 'set'], function (key) {\n    var proto = $WeakMap.prototype;\n    var method = proto[key];\n    redefine(proto, key, function (a, b) {\n      // store frozen objects on internal weakmap shim\n      if (isObject(a) && !isExtensible(a)) {\n        if (!this._f) this._f = new InternalMap();\n        var result = this._f[key](a, b);\n        return key == 'set' ? this : result;\n      // store all the rest on native weakmap\n      } return method.call(this, a, b);\n    });\n  });\n}\n\n\n/***/ }),\n/* 113 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.2.2 IsArray(argument)\nvar cof = __webpack_require__(43);\nmodule.exports = Array.isArray || function isArray(arg) {\n  return cof(arg) == 'Array';\n};\n\n\n/***/ }),\n/* 114 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = __webpack_require__(37);\nvar gOPS = __webpack_require__(69);\nvar pIE = __webpack_require__(52);\nvar toObject = __webpack_require__(33);\nvar IObject = __webpack_require__(75);\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || __webpack_require__(23)(function () {\n  var A = {};\n  var B = {};\n  // eslint-disable-next-line no-undef\n  var S = Symbol();\n  var K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function (k) { B[k] = k; });\n  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n  var T = toObject(target);\n  var aLen = arguments.length;\n  var index = 1;\n  var getSymbols = gOPS.f;\n  var isEnum = pIE.f;\n  while (aLen > index) {\n    var S = IObject(arguments[index++]);\n    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n    while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n  } return T;\n} : $assign;\n\n\n/***/ }),\n/* 115 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar redefineAll = __webpack_require__(61);\nvar getWeak = __webpack_require__(34).getWeak;\nvar anObject = __webpack_require__(18);\nvar isObject = __webpack_require__(9);\nvar anInstance = __webpack_require__(63);\nvar forOf = __webpack_require__(64);\nvar createArrayMethod = __webpack_require__(68);\nvar $has = __webpack_require__(29);\nvar validate = __webpack_require__(45);\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n  return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n  this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n  return arrayFind(store.a, function (it) {\n    return it[0] === key;\n  });\n};\nUncaughtFrozenStore.prototype = {\n  get: function (key) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) return entry[1];\n  },\n  has: function (key) {\n    return !!findUncaughtFrozen(this, key);\n  },\n  set: function (key, value) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) entry[1] = value;\n    else this.a.push([key, value]);\n  },\n  'delete': function (key) {\n    var index = arrayFindIndex(this.a, function (it) {\n      return it[0] === key;\n    });\n    if (~index) this.a.splice(index, 1);\n    return !!~index;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      anInstance(that, C, NAME, '_i');\n      that._t = NAME;      // collection type\n      that._i = id++;      // collection id\n      that._l = undefined; // leak store for uncaught frozen objects\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.3.3.2 WeakMap.prototype.delete(key)\n      // 23.4.3.3 WeakSet.prototype.delete(value)\n      'delete': function (key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n        return data && $has(data, this._i) && delete data[this._i];\n      },\n      // 23.3.3.4 WeakMap.prototype.has(key)\n      // 23.4.3.4 WeakSet.prototype.has(value)\n      has: function has(key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n        return data && $has(data, this._i);\n      }\n    });\n    return C;\n  },\n  def: function (that, key, value) {\n    var data = getWeak(anObject(key), true);\n    if (data === true) uncaughtFrozenStore(that).set(key, value);\n    else data[that._i] = value;\n    return that;\n  },\n  ufstore: uncaughtFrozenStore\n};\n\n\n/***/ }),\n/* 116 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar weak = __webpack_require__(115);\nvar validate = __webpack_require__(45);\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\n__webpack_require__(66)(WEAK_SET, function (get) {\n  return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.4.3.1 WeakSet.prototype.add(value)\n  add: function add(value) {\n    return weak.def(validate(this, WEAK_SET), value, true);\n  }\n}, weak, false, true);\n\n\n/***/ }),\n/* 117 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(65);\nvar global = __webpack_require__(14);\nvar ctx = __webpack_require__(32);\nvar classof = __webpack_require__(105);\nvar $export = __webpack_require__(3);\nvar isObject = __webpack_require__(9);\nvar aFunction = __webpack_require__(62);\nvar anInstance = __webpack_require__(63);\nvar forOf = __webpack_require__(64);\nvar speciesConstructor = __webpack_require__(212);\nvar task = __webpack_require__(80).set;\nvar microtask = __webpack_require__(214)();\nvar newPromiseCapabilityModule = __webpack_require__(118);\nvar perform = __webpack_require__(215);\nvar promiseResolve = __webpack_require__(216);\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n  try {\n    // correct subclassing with @@species support\n    var promise = $Promise.resolve(1);\n    var FakePromise = (promise.constructor = {})[__webpack_require__(11)('species')] = function (exec) {\n      exec(empty, empty);\n    };\n    // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n    return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;\n  } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n  var then;\n  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n  if (promise._n) return;\n  promise._n = true;\n  var chain = promise._c;\n  microtask(function () {\n    var value = promise._v;\n    var ok = promise._s == 1;\n    var i = 0;\n    var run = function (reaction) {\n      var handler = ok ? reaction.ok : reaction.fail;\n      var resolve = reaction.resolve;\n      var reject = reaction.reject;\n      var domain = reaction.domain;\n      var result, then, exited;\n      try {\n        if (handler) {\n          if (!ok) {\n            if (promise._h == 2) onHandleUnhandled(promise);\n            promise._h = 1;\n          }\n          if (handler === true) result = value;\n          else {\n            if (domain) domain.enter();\n            result = handler(value); // may throw\n            if (domain) {\n              domain.exit();\n              exited = true;\n            }\n          }\n          if (result === reaction.promise) {\n            reject(TypeError('Promise-chain cycle'));\n          } else if (then = isThenable(result)) {\n            then.call(result, resolve, reject);\n          } else resolve(result);\n        } else reject(value);\n      } catch (e) {\n        if (domain && !exited) domain.exit();\n        reject(e);\n      }\n    };\n    while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n    promise._c = [];\n    promise._n = false;\n    if (isReject && !promise._h) onUnhandled(promise);\n  });\n};\nvar onUnhandled = function (promise) {\n  task.call(global, function () {\n    var value = promise._v;\n    var unhandled = isUnhandled(promise);\n    var result, handler, console;\n    if (unhandled) {\n      result = perform(function () {\n        if (isNode) {\n          process.emit('unhandledRejection', value, promise);\n        } else if (handler = global.onunhandledrejection) {\n          handler({ promise: promise, reason: value });\n        } else if ((console = global.console) && console.error) {\n          console.error('Unhandled promise rejection', value);\n        }\n      });\n      // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n      promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n    } promise._a = undefined;\n    if (unhandled && result.e) throw result.v;\n  });\n};\nvar isUnhandled = function (promise) {\n  return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n  task.call(global, function () {\n    var handler;\n    if (isNode) {\n      process.emit('rejectionHandled', promise);\n    } else if (handler = global.onrejectionhandled) {\n      handler({ promise: promise, reason: promise._v });\n    }\n  });\n};\nvar $reject = function (value) {\n  var promise = this;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  promise._v = value;\n  promise._s = 2;\n  if (!promise._a) promise._a = promise._c.slice();\n  notify(promise, true);\n};\nvar $resolve = function (value) {\n  var promise = this;\n  var then;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  try {\n    if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n    if (then = isThenable(value)) {\n      microtask(function () {\n        var wrapper = { _w: promise, _d: false }; // wrap\n        try {\n          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n        } catch (e) {\n          $reject.call(wrapper, e);\n        }\n      });\n    } else {\n      promise._v = value;\n      promise._s = 1;\n      notify(promise, false);\n    }\n  } catch (e) {\n    $reject.call({ _w: promise, _d: false }, e); // wrap\n  }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n  // 25.4.3.1 Promise(executor)\n  $Promise = function Promise(executor) {\n    anInstance(this, $Promise, PROMISE, '_h');\n    aFunction(executor);\n    Internal.call(this);\n    try {\n      executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n    } catch (err) {\n      $reject.call(this, err);\n    }\n  };\n  // eslint-disable-next-line no-unused-vars\n  Internal = function Promise(executor) {\n    this._c = [];             // <- awaiting reactions\n    this._a = undefined;      // <- checked in isUnhandled reactions\n    this._s = 0;              // <- state\n    this._d = false;          // <- done\n    this._v = undefined;      // <- value\n    this._h = 0;              // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n    this._n = false;          // <- notify\n  };\n  Internal.prototype = __webpack_require__(61)($Promise.prototype, {\n    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n    then: function then(onFulfilled, onRejected) {\n      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n      reaction.fail = typeof onRejected == 'function' && onRejected;\n      reaction.domain = isNode ? process.domain : undefined;\n      this._c.push(reaction);\n      if (this._a) this._a.push(reaction);\n      if (this._s) notify(this, false);\n      return reaction.promise;\n    },\n    // 25.4.5.1 Promise.prototype.catch(onRejected)\n    'catch': function (onRejected) {\n      return this.then(undefined, onRejected);\n    }\n  });\n  OwnPromiseCapability = function () {\n    var promise = new Internal();\n    this.promise = promise;\n    this.resolve = ctx($resolve, promise, 1);\n    this.reject = ctx($reject, promise, 1);\n  };\n  newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n    return C === $Promise || C === Wrapper\n      ? new OwnPromiseCapability(C)\n      : newGenericPromiseCapability(C);\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\n__webpack_require__(51)($Promise, PROMISE);\n__webpack_require__(109)(PROMISE);\nWrapper = __webpack_require__(44)[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n  // 25.4.4.5 Promise.reject(r)\n  reject: function reject(r) {\n    var capability = newPromiseCapability(this);\n    var $$reject = capability.reject;\n    $$reject(r);\n    return capability.promise;\n  }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n  // 25.4.4.6 Promise.resolve(x)\n  resolve: function resolve(x) {\n    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n  }\n});\n$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(79)(function (iter) {\n  $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n  // 25.4.4.1 Promise.all(iterable)\n  all: function all(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var resolve = capability.resolve;\n    var reject = capability.reject;\n    var result = perform(function () {\n      var values = [];\n      var index = 0;\n      var remaining = 1;\n      forOf(iterable, false, function (promise) {\n        var $index = index++;\n        var alreadyCalled = false;\n        values.push(undefined);\n        remaining++;\n        C.resolve(promise).then(function (value) {\n          if (alreadyCalled) return;\n          alreadyCalled = true;\n          values[$index] = value;\n          --remaining || resolve(values);\n        }, reject);\n      });\n      --remaining || resolve(values);\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  },\n  // 25.4.4.4 Promise.race(iterable)\n  race: function race(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var reject = capability.reject;\n    var result = perform(function () {\n      forOf(iterable, false, function (promise) {\n        C.resolve(promise).then(capability.resolve, reject);\n      });\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  }\n});\n\n\n/***/ }),\n/* 118 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = __webpack_require__(62);\n\nfunction PromiseCapability(C) {\n  var resolve, reject;\n  this.promise = new C(function ($$resolve, $$reject) {\n    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n    resolve = $$resolve;\n    reject = $$reject;\n  });\n  this.resolve = aFunction(resolve);\n  this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n  return new PromiseCapability(C);\n};\n\n\n/***/ }),\n/* 119 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// ECMAScript 6 symbols shim\nvar global = __webpack_require__(14);\nvar has = __webpack_require__(29);\nvar DESCRIPTORS = __webpack_require__(22);\nvar $export = __webpack_require__(3);\nvar redefine = __webpack_require__(30);\nvar META = __webpack_require__(34).KEY;\nvar $fails = __webpack_require__(23);\nvar shared = __webpack_require__(77);\nvar setToStringTag = __webpack_require__(51);\nvar uid = __webpack_require__(48);\nvar wks = __webpack_require__(11);\nvar wksExt = __webpack_require__(120);\nvar wksDefine = __webpack_require__(217);\nvar enumKeys = __webpack_require__(218);\nvar isArray = __webpack_require__(113);\nvar anObject = __webpack_require__(18);\nvar isObject = __webpack_require__(9);\nvar toIObject = __webpack_require__(24);\nvar toPrimitive = __webpack_require__(73);\nvar createDesc = __webpack_require__(49);\nvar _create = __webpack_require__(74);\nvar gOPNExt = __webpack_require__(121);\nvar $GOPD = __webpack_require__(67);\nvar $DP = __webpack_require__(20);\nvar $keys = __webpack_require__(37);\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n  return _create(dP({}, 'a', {\n    get: function () { return dP(this, 'a', { value: 7 }).a; }\n  })).a != 7;\n}) ? function (it, key, D) {\n  var protoDesc = gOPD(ObjectProto, key);\n  if (protoDesc) delete ObjectProto[key];\n  dP(it, key, D);\n  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n  sym._k = tag;\n  return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n  return typeof it == 'symbol';\n} : function (it) {\n  return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n  anObject(it);\n  key = toPrimitive(key, true);\n  anObject(D);\n  if (has(AllSymbols, key)) {\n    if (!D.enumerable) {\n      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n      it[HIDDEN][key] = true;\n    } else {\n      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n      D = _create(D, { enumerable: createDesc(0, false) });\n    } return setSymbolDesc(it, key, D);\n  } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n  anObject(it);\n  var keys = enumKeys(P = toIObject(P));\n  var i = 0;\n  var l = keys.length;\n  var key;\n  while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n  return it;\n};\nvar $create = function create(it, P) {\n  return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n  var E = isEnum.call(this, key = toPrimitive(key, true));\n  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n  it = toIObject(it);\n  key = toPrimitive(key, true);\n  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n  var D = gOPD(it, key);\n  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n  return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n  var names = gOPN(toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n  } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n  var IS_OP = it === ObjectProto;\n  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n  } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n  $Symbol = function Symbol() {\n    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n    var $set = function (value) {\n      if (this === ObjectProto) $set.call(OPSymbols, value);\n      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n      setSymbolDesc(this, tag, createDesc(1, value));\n    };\n    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n    return wrap(tag);\n  };\n  redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n    return this._k;\n  });\n\n  $GOPD.f = $getOwnPropertyDescriptor;\n  $DP.f = $defineProperty;\n  __webpack_require__(81).f = gOPNExt.f = $getOwnPropertyNames;\n  __webpack_require__(52).f = $propertyIsEnumerable;\n  __webpack_require__(69).f = $getOwnPropertySymbols;\n\n  if (DESCRIPTORS && !__webpack_require__(65)) {\n    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n  }\n\n  wksExt.f = function (name) {\n    return wrap(wks(name));\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n  // 19.4.2.1 Symbol.for(key)\n  'for': function (key) {\n    return has(SymbolRegistry, key += '')\n      ? SymbolRegistry[key]\n      : SymbolRegistry[key] = $Symbol(key);\n  },\n  // 19.4.2.5 Symbol.keyFor(sym)\n  keyFor: function keyFor(sym) {\n    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n  },\n  useSetter: function () { setter = true; },\n  useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n  // 19.1.2.2 Object.create(O [, Properties])\n  create: $create,\n  // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n  defineProperty: $defineProperty,\n  // 19.1.2.3 Object.defineProperties(O, Properties)\n  defineProperties: $defineProperties,\n  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n  // 19.1.2.7 Object.getOwnPropertyNames(O)\n  getOwnPropertyNames: $getOwnPropertyNames,\n  // 19.1.2.8 Object.getOwnPropertySymbols(O)\n  getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n  var S = $Symbol();\n  // MS Edge converts symbol values to JSON as {}\n  // WebKit converts symbol values to JSON as null\n  // V8 throws on boxed symbols\n  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n  stringify: function stringify(it) {\n    var args = [it];\n    var i = 1;\n    var replacer, $replacer;\n    while (arguments.length > i) args.push(arguments[i++]);\n    $replacer = replacer = args[1];\n    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n    if (!isArray(replacer)) replacer = function (key, value) {\n      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n      if (!isSymbol(value)) return value;\n    };\n    args[1] = replacer;\n    return _stringify.apply($JSON, args);\n  }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(31)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n\n\n/***/ }),\n/* 120 */\n/***/ (function(module, exports, __webpack_require__) {\n\nexports.f = __webpack_require__(11);\n\n\n/***/ }),\n/* 121 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = __webpack_require__(24);\nvar gOPN = __webpack_require__(81).f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n  ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n  try {\n    return gOPN(it);\n  } catch (e) {\n    return windowNames.slice();\n  }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n\n\n/***/ }),\n/* 122 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.5 Object.freeze(O)\nvar isObject = __webpack_require__(9);\nvar meta = __webpack_require__(34).onFreeze;\n\n__webpack_require__(26)('freeze', function ($freeze) {\n  return function freeze(it) {\n    return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n  };\n});\n\n\n/***/ }),\n/* 123 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.17 Object.seal(O)\nvar isObject = __webpack_require__(9);\nvar meta = __webpack_require__(34).onFreeze;\n\n__webpack_require__(26)('seal', function ($seal) {\n  return function seal(it) {\n    return $seal && isObject(it) ? $seal(meta(it)) : it;\n  };\n});\n\n\n/***/ }),\n/* 124 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = __webpack_require__(9);\nvar meta = __webpack_require__(34).onFreeze;\n\n__webpack_require__(26)('preventExtensions', function ($preventExtensions) {\n  return function preventExtensions(it) {\n    return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n  };\n});\n\n\n/***/ }),\n/* 125 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.12 Object.isFrozen(O)\nvar isObject = __webpack_require__(9);\n\n__webpack_require__(26)('isFrozen', function ($isFrozen) {\n  return function isFrozen(it) {\n    return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n  };\n});\n\n\n/***/ }),\n/* 126 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.13 Object.isSealed(O)\nvar isObject = __webpack_require__(9);\n\n__webpack_require__(26)('isSealed', function ($isSealed) {\n  return function isSealed(it) {\n    return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n  };\n});\n\n\n/***/ }),\n/* 127 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.11 Object.isExtensible(O)\nvar isObject = __webpack_require__(9);\n\n__webpack_require__(26)('isExtensible', function ($isExtensible) {\n  return function isExtensible(it) {\n    return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n  };\n});\n\n\n/***/ }),\n/* 128 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = __webpack_require__(24);\nvar $getOwnPropertyDescriptor = __webpack_require__(67).f;\n\n__webpack_require__(26)('getOwnPropertyDescriptor', function () {\n  return function getOwnPropertyDescriptor(it, key) {\n    return $getOwnPropertyDescriptor(toIObject(it), key);\n  };\n});\n\n\n/***/ }),\n/* 129 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = __webpack_require__(33);\nvar $getPrototypeOf = __webpack_require__(107);\n\n__webpack_require__(26)('getPrototypeOf', function () {\n  return function getPrototypeOf(it) {\n    return $getPrototypeOf(toObject(it));\n  };\n});\n\n\n/***/ }),\n/* 130 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 Object.keys(O)\nvar toObject = __webpack_require__(33);\nvar $keys = __webpack_require__(37);\n\n__webpack_require__(26)('keys', function () {\n  return function keys(it) {\n    return $keys(toObject(it));\n  };\n});\n\n\n/***/ }),\n/* 131 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.7 Object.getOwnPropertyNames(O)\n__webpack_require__(26)('getOwnPropertyNames', function () {\n  return __webpack_require__(121).f;\n});\n\n\n/***/ }),\n/* 132 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.1 Object.assign(target, source)\nvar $export = __webpack_require__(3);\n\n$export($export.S + $export.F, 'Object', { assign: __webpack_require__(114) });\n\n\n/***/ }),\n/* 133 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.10 Object.is(value1, value2)\nvar $export = __webpack_require__(3);\n$export($export.S, 'Object', { is: __webpack_require__(219) });\n\n\n/***/ }),\n/* 134 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = __webpack_require__(3);\n$export($export.S, 'Object', { setPrototypeOf: __webpack_require__(110).set });\n\n\n/***/ }),\n/* 135 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(20).f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || __webpack_require__(22) && dP(FProto, NAME, {\n  configurable: true,\n  get: function () {\n    try {\n      return ('' + this).match(nameRE)[1];\n    } catch (e) {\n      return '';\n    }\n  }\n});\n\n\n/***/ }),\n/* 136 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\nvar toIObject = __webpack_require__(24);\nvar toLength = __webpack_require__(25);\n\n$export($export.S, 'String', {\n  // 21.1.2.4 String.raw(callSite, ...substitutions)\n  raw: function raw(callSite) {\n    var tpl = toIObject(callSite.raw);\n    var len = toLength(tpl.length);\n    var aLen = arguments.length;\n    var res = [];\n    var i = 0;\n    while (len > i) {\n      res.push(String(tpl[i++]));\n      if (i < aLen) res.push(String(arguments[i]));\n    } return res.join('');\n  }\n});\n\n\n/***/ }),\n/* 137 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\nvar toAbsoluteIndex = __webpack_require__(60);\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n  // 21.1.2.2 String.fromCodePoint(...codePoints)\n  fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n    var res = [];\n    var aLen = arguments.length;\n    var i = 0;\n    var code;\n    while (aLen > i) {\n      code = +arguments[i++];\n      if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n      res.push(code < 0x10000\n        ? fromCharCode(code)\n        : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n      );\n    } return res.join('');\n  }\n});\n\n\n/***/ }),\n/* 138 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(3);\nvar $at = __webpack_require__(220)(false);\n$export($export.P, 'String', {\n  // 21.1.3.3 String.prototype.codePointAt(pos)\n  codePointAt: function codePointAt(pos) {\n    return $at(this, pos);\n  }\n});\n\n\n/***/ }),\n/* 139 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\n\n$export($export.P, 'String', {\n  // 21.1.3.13 String.prototype.repeat(count)\n  repeat: __webpack_require__(140)\n});\n\n\n/***/ }),\n/* 140 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar toInteger = __webpack_require__(59);\nvar defined = __webpack_require__(38);\n\nmodule.exports = function repeat(count) {\n  var str = String(defined(this));\n  var res = '';\n  var n = toInteger(count);\n  if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n  for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n  return res;\n};\n\n\n/***/ }),\n/* 141 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n\nvar $export = __webpack_require__(3);\nvar toLength = __webpack_require__(25);\nvar context = __webpack_require__(82);\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * __webpack_require__(83)(STARTS_WITH), 'String', {\n  startsWith: function startsWith(searchString /* , position = 0 */) {\n    var that = context(this, searchString, STARTS_WITH);\n    var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n    var search = String(searchString);\n    return $startsWith\n      ? $startsWith.call(that, search, index)\n      : that.slice(index, index + search.length) === search;\n  }\n});\n\n\n/***/ }),\n/* 142 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.2.8 IsRegExp(argument)\nvar isObject = __webpack_require__(9);\nvar cof = __webpack_require__(43);\nvar MATCH = __webpack_require__(11)('match');\nmodule.exports = function (it) {\n  var isRegExp;\n  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n\n\n/***/ }),\n/* 143 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n\nvar $export = __webpack_require__(3);\nvar toLength = __webpack_require__(25);\nvar context = __webpack_require__(82);\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * __webpack_require__(83)(ENDS_WITH), 'String', {\n  endsWith: function endsWith(searchString /* , endPosition = @length */) {\n    var that = context(this, searchString, ENDS_WITH);\n    var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n    var len = toLength(that.length);\n    var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n    var search = String(searchString);\n    return $endsWith\n      ? $endsWith.call(that, search, end)\n      : that.slice(end - search.length, end) === search;\n  }\n});\n\n\n/***/ }),\n/* 144 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n\nvar $export = __webpack_require__(3);\nvar context = __webpack_require__(82);\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * __webpack_require__(83)(INCLUDES), 'String', {\n  includes: function includes(searchString /* , position = 0 */) {\n    return !!~context(this, searchString, INCLUDES)\n      .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n\n/***/ }),\n/* 145 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 21.2.5.3 get RegExp.prototype.flags()\nif (__webpack_require__(22) && /./g.flags != 'g') __webpack_require__(20).f(RegExp.prototype, 'flags', {\n  configurable: true,\n  get: __webpack_require__(221)\n});\n\n\n/***/ }),\n/* 146 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// @@match logic\n__webpack_require__(70)('match', 1, function (defined, MATCH, $match) {\n  // 21.1.3.11 String.prototype.match(regexp)\n  return [function match(regexp) {\n    'use strict';\n    var O = defined(this);\n    var fn = regexp == undefined ? undefined : regexp[MATCH];\n    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n  }, $match];\n});\n\n\n/***/ }),\n/* 147 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// @@replace logic\n__webpack_require__(70)('replace', 2, function (defined, REPLACE, $replace) {\n  // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n  return [function replace(searchValue, replaceValue) {\n    'use strict';\n    var O = defined(this);\n    var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n    return fn !== undefined\n      ? fn.call(searchValue, O, replaceValue)\n      : $replace.call(String(O), searchValue, replaceValue);\n  }, $replace];\n});\n\n\n/***/ }),\n/* 148 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// @@split logic\n__webpack_require__(70)('split', 2, function (defined, SPLIT, $split) {\n  'use strict';\n  var isRegExp = __webpack_require__(142);\n  var _split = $split;\n  var $push = [].push;\n  var $SPLIT = 'split';\n  var LENGTH = 'length';\n  var LAST_INDEX = 'lastIndex';\n  if (\n    'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n    'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n    'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n    '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n    '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n    ''[$SPLIT](/.?/)[LENGTH]\n  ) {\n    var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n    // based on es5-shim implementation, need to rework it\n    $split = function (separator, limit) {\n      var string = String(this);\n      if (separator === undefined && limit === 0) return [];\n      // If `separator` is not a regex, use native split\n      if (!isRegExp(separator)) return _split.call(string, separator, limit);\n      var output = [];\n      var flags = (separator.ignoreCase ? 'i' : '') +\n                  (separator.multiline ? 'm' : '') +\n                  (separator.unicode ? 'u' : '') +\n                  (separator.sticky ? 'y' : '');\n      var lastLastIndex = 0;\n      var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n      // Make `global` and avoid `lastIndex` issues by working with a copy\n      var separatorCopy = new RegExp(separator.source, flags + 'g');\n      var separator2, match, lastIndex, lastLength, i;\n      // Doesn't need flags gy, but they don't hurt\n      if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n      while (match = separatorCopy.exec(string)) {\n        // `separatorCopy.lastIndex` is not reliable cross-browser\n        lastIndex = match.index + match[0][LENGTH];\n        if (lastIndex > lastLastIndex) {\n          output.push(string.slice(lastLastIndex, match.index));\n          // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n          // eslint-disable-next-line no-loop-func\n          if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {\n            for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;\n          });\n          if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n          lastLength = match[0][LENGTH];\n          lastLastIndex = lastIndex;\n          if (output[LENGTH] >= splitLimit) break;\n        }\n        if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n      }\n      if (lastLastIndex === string[LENGTH]) {\n        if (lastLength || !separatorCopy.test('')) output.push('');\n      } else output.push(string.slice(lastLastIndex));\n      return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n    };\n  // Chakra, V8\n  } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n    $split = function (separator, limit) {\n      return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n    };\n  }\n  // 21.1.3.17 String.prototype.split(separator, limit)\n  return [function split(separator, limit) {\n    var O = defined(this);\n    var fn = separator == undefined ? undefined : separator[SPLIT];\n    return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n  }, $split];\n});\n\n\n/***/ }),\n/* 149 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// @@search logic\n__webpack_require__(70)('search', 1, function (defined, SEARCH, $search) {\n  // 21.1.3.15 String.prototype.search(regexp)\n  return [function search(regexp) {\n    'use strict';\n    var O = defined(this);\n    var fn = regexp == undefined ? undefined : regexp[SEARCH];\n    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n  }, $search];\n});\n\n\n/***/ }),\n/* 150 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar ctx = __webpack_require__(32);\nvar $export = __webpack_require__(3);\nvar toObject = __webpack_require__(33);\nvar call = __webpack_require__(102);\nvar isArrayIter = __webpack_require__(103);\nvar toLength = __webpack_require__(25);\nvar createProperty = __webpack_require__(84);\nvar getIterFn = __webpack_require__(104);\n\n$export($export.S + $export.F * !__webpack_require__(79)(function (iter) { Array.from(iter); }), 'Array', {\n  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n  from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n    var O = toObject(arrayLike);\n    var C = typeof this == 'function' ? this : Array;\n    var aLen = arguments.length;\n    var mapfn = aLen > 1 ? arguments[1] : undefined;\n    var mapping = mapfn !== undefined;\n    var index = 0;\n    var iterFn = getIterFn(O);\n    var length, result, step, iterator;\n    if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n    // if object isn't iterable or it's array with default iterator - use simple case\n    if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n      for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n        createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n      }\n    } else {\n      length = toLength(O.length);\n      for (result = new C(length); length > index; index++) {\n        createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n      }\n    }\n    result.length = index;\n    return result;\n  }\n});\n\n\n/***/ }),\n/* 151 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(3);\nvar createProperty = __webpack_require__(84);\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * __webpack_require__(23)(function () {\n  function F() { /* empty */ }\n  return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n  // 22.1.2.3 Array.of( ...items)\n  of: function of(/* ...args */) {\n    var index = 0;\n    var aLen = arguments.length;\n    var result = new (typeof this == 'function' ? this : Array)(aLen);\n    while (aLen > index) createProperty(result, index, arguments[index++]);\n    result.length = aLen;\n    return result;\n  }\n});\n\n\n/***/ }),\n/* 152 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = __webpack_require__(3);\n\n$export($export.P, 'Array', { copyWithin: __webpack_require__(222) });\n\n__webpack_require__(46)('copyWithin');\n\n\n/***/ }),\n/* 153 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = __webpack_require__(3);\nvar $find = __webpack_require__(68)(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n  find: function find(callbackfn /* , that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n__webpack_require__(46)(KEY);\n\n\n/***/ }),\n/* 154 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = __webpack_require__(3);\nvar $find = __webpack_require__(68)(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n  findIndex: function findIndex(callbackfn /* , that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n__webpack_require__(46)(KEY);\n\n\n/***/ }),\n/* 155 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = __webpack_require__(3);\n\n$export($export.P, 'Array', { fill: __webpack_require__(223) });\n\n__webpack_require__(46)('fill');\n\n\n/***/ }),\n/* 156 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.2 Number.isFinite(number)\nvar $export = __webpack_require__(3);\nvar _isFinite = __webpack_require__(14).isFinite;\n\n$export($export.S, 'Number', {\n  isFinite: function isFinite(it) {\n    return typeof it == 'number' && _isFinite(it);\n  }\n});\n\n\n/***/ }),\n/* 157 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.3 Number.isInteger(number)\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', { isInteger: __webpack_require__(158) });\n\n\n/***/ }),\n/* 158 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.3 Number.isInteger(number)\nvar isObject = __webpack_require__(9);\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n  return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n\n\n/***/ }),\n/* 159 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = __webpack_require__(3);\nvar isInteger = __webpack_require__(158);\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n  isSafeInteger: function isSafeInteger(number) {\n    return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n  }\n});\n\n\n/***/ }),\n/* 160 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.4 Number.isNaN(number)\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', {\n  isNaN: function isNaN(number) {\n    // eslint-disable-next-line no-self-compare\n    return number != number;\n  }\n});\n\n\n/***/ }),\n/* 161 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.1 Number.EPSILON\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n\n\n/***/ }),\n/* 162 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n\n\n/***/ }),\n/* 163 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n\n\n/***/ }),\n/* 164 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/Array.prototype.includes\nvar $export = __webpack_require__(3);\nvar $includes = __webpack_require__(100)(true);\n\n$export($export.P, 'Array', {\n  includes: function includes(el /* , fromIndex = 0 */) {\n    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n__webpack_require__(46)('includes');\n\n\n/***/ }),\n/* 165 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-object-values-entries\nvar $export = __webpack_require__(3);\nvar $values = __webpack_require__(166)(false);\n\n$export($export.S, 'Object', {\n  values: function values(it) {\n    return $values(it);\n  }\n});\n\n\n/***/ }),\n/* 166 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getKeys = __webpack_require__(37);\nvar toIObject = __webpack_require__(24);\nvar isEnum = __webpack_require__(52).f;\nmodule.exports = function (isEntries) {\n  return function (it) {\n    var O = toIObject(it);\n    var keys = getKeys(O);\n    var length = keys.length;\n    var i = 0;\n    var result = [];\n    var key;\n    while (length > i) if (isEnum.call(O, key = keys[i++])) {\n      result.push(isEntries ? [key, O[key]] : O[key]);\n    } return result;\n  };\n};\n\n\n/***/ }),\n/* 167 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-object-values-entries\nvar $export = __webpack_require__(3);\nvar $entries = __webpack_require__(166)(true);\n\n$export($export.S, 'Object', {\n  entries: function entries(it) {\n    return $entries(it);\n  }\n});\n\n\n/***/ }),\n/* 168 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = __webpack_require__(3);\nvar ownKeys = __webpack_require__(224);\nvar toIObject = __webpack_require__(24);\nvar gOPD = __webpack_require__(67);\nvar createProperty = __webpack_require__(84);\n\n$export($export.S, 'Object', {\n  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n    var O = toIObject(object);\n    var getDesc = gOPD.f;\n    var keys = ownKeys(O);\n    var result = {};\n    var i = 0;\n    var key, desc;\n    while (keys.length > i) {\n      desc = getDesc(O, key = keys[i++]);\n      if (desc !== undefined) createProperty(result, key, desc);\n    }\n    return result;\n  }\n});\n\n\n/***/ }),\n/* 169 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = __webpack_require__(3);\nvar $pad = __webpack_require__(170);\nvar userAgent = __webpack_require__(171);\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n  padStart: function padStart(maxLength /* , fillString = ' ' */) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n  }\n});\n\n\n/***/ }),\n/* 170 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = __webpack_require__(25);\nvar repeat = __webpack_require__(140);\nvar defined = __webpack_require__(38);\n\nmodule.exports = function (that, maxLength, fillString, left) {\n  var S = String(defined(that));\n  var stringLength = S.length;\n  var fillStr = fillString === undefined ? ' ' : String(fillString);\n  var intMaxLength = toLength(maxLength);\n  if (intMaxLength <= stringLength || fillStr == '') return S;\n  var fillLen = intMaxLength - stringLength;\n  var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n  if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n  return left ? stringFiller + S : S + stringFiller;\n};\n\n\n/***/ }),\n/* 171 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n\n\n/***/ }),\n/* 172 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = __webpack_require__(3);\nvar $pad = __webpack_require__(170);\nvar userAgent = __webpack_require__(171);\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n  padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n  }\n});\n\n\n/***/ }),\n/* 173 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\nvar $task = __webpack_require__(80);\n$export($export.G + $export.B, {\n  setImmediate: $task.set,\n  clearImmediate: $task.clear\n});\n\n\n/***/ }),\n/* 174 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $iterators = __webpack_require__(85);\nvar getKeys = __webpack_require__(37);\nvar redefine = __webpack_require__(30);\nvar global = __webpack_require__(14);\nvar hide = __webpack_require__(31);\nvar Iterators = __webpack_require__(50);\nvar wks = __webpack_require__(11);\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n  CSSRuleList: true, // TODO: Not spec compliant, should be false.\n  CSSStyleDeclaration: false,\n  CSSValueList: false,\n  ClientRectList: false,\n  DOMRectList: false,\n  DOMStringList: false,\n  DOMTokenList: true,\n  DataTransferItemList: false,\n  FileList: false,\n  HTMLAllCollection: false,\n  HTMLCollection: false,\n  HTMLFormElement: false,\n  HTMLSelectElement: false,\n  MediaList: true, // TODO: Not spec compliant, should be false.\n  MimeTypeArray: false,\n  NamedNodeMap: false,\n  NodeList: true,\n  PaintRequestList: false,\n  Plugin: false,\n  PluginArray: false,\n  SVGLengthList: false,\n  SVGNumberList: false,\n  SVGPathSegList: false,\n  SVGPointList: false,\n  SVGStringList: false,\n  SVGTransformList: false,\n  SourceBufferList: false,\n  StyleSheetList: true, // TODO: Not spec compliant, should be false.\n  TextTrackCueList: false,\n  TextTrackList: false,\n  TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n  var NAME = collections[i];\n  var explicit = DOMIterables[NAME];\n  var Collection = global[NAME];\n  var proto = Collection && Collection.prototype;\n  var key;\n  if (proto) {\n    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n    Iterators[NAME] = ArrayValues;\n    if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n  }\n}\n\n\n/***/ }),\n/* 175 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar privatePool = new WeakMap();\n\n/**\n * Calculates indexes of columns to render OR columns that are visible.\n * To redo the calculation, you need to create a new calculator.\n *\n * @class ViewportColumnsCalculator\n */\n\nvar ViewportColumnsCalculator = function () {\n  _createClass(ViewportColumnsCalculator, null, [{\n    key: 'DEFAULT_WIDTH',\n\n    /**\n     * Default column width\n     *\n     * @type {Number}\n     */\n    get: function get() {\n      return 50;\n    }\n\n    /**\n     * @param {Number} viewportWidth Width of the viewport\n     * @param {Number} scrollOffset Current horizontal scroll position of the viewport\n     * @param {Number} totalColumns Total number of rows\n     * @param {Function} columnWidthFn Function that returns the width of the column at a given index (in px)\n     * @param {Function} overrideFn Function that changes calculated this.startRow, this.endRow (used by MergeCells plugin)\n     * @param {Boolean} onlyFullyVisible if `true`, only startRow and endRow will be indexes of rows that are fully in viewport\n     * @param {Boolean} stretchH\n     * @param {Function} [stretchingColumnWidthFn] Function that returns the new width of the stretched column.\n     */\n\n  }]);\n\n  function ViewportColumnsCalculator(viewportWidth, scrollOffset, totalColumns, columnWidthFn, overrideFn, onlyFullyVisible, stretchH) {\n    var stretchingColumnWidthFn = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : function (width) {\n      return width;\n    };\n\n    _classCallCheck(this, ViewportColumnsCalculator);\n\n    privatePool.set(this, {\n      viewportWidth: viewportWidth,\n      scrollOffset: scrollOffset,\n      totalColumns: totalColumns,\n      columnWidthFn: columnWidthFn,\n      overrideFn: overrideFn,\n      onlyFullyVisible: onlyFullyVisible,\n      stretchingColumnWidthFn: stretchingColumnWidthFn\n    });\n\n    /**\n     * Number of rendered/visible columns\n     *\n     * @type {Number}\n     */\n    this.count = 0;\n\n    /**\n     * Index of the first rendered/visible column (can be overwritten using overrideFn)\n     *\n     * @type {Number|null}\n     */\n    this.startColumn = null;\n\n    /**\n     * Index of the last rendered/visible column (can be overwritten using overrideFn)\n     *\n     * @type {null}\n     */\n    this.endColumn = null;\n\n    /**\n     * Position of the first rendered/visible column (in px)\n     *\n     * @type {Number|null}\n     */\n    this.startPosition = null;\n\n    this.stretchAllRatio = 0;\n    this.stretchLastWidth = 0;\n    this.stretch = stretchH;\n    this.totalTargetWidth = 0;\n    this.needVerifyLastColumnWidth = true;\n    this.stretchAllColumnsWidth = [];\n\n    this.calculate();\n  }\n\n  /**\n   * Calculates viewport\n   */\n\n\n  _createClass(ViewportColumnsCalculator, [{\n    key: 'calculate',\n    value: function calculate() {\n      var sum = 0;\n      var needReverse = true;\n      var startPositions = [];\n      var columnWidth = void 0;\n\n      var priv = privatePool.get(this);\n      var onlyFullyVisible = priv.onlyFullyVisible;\n      var overrideFn = priv.overrideFn;\n      var scrollOffset = priv.scrollOffset;\n      var totalColumns = priv.totalColumns;\n      var viewportWidth = priv.viewportWidth;\n\n      for (var i = 0; i < totalColumns; i++) {\n        columnWidth = this._getColumnWidth(i);\n\n        if (sum <= scrollOffset && !onlyFullyVisible) {\n          this.startColumn = i;\n        }\n\n        // +1 pixel for row header width compensation for horizontal scroll > 0\n        var compensatedViewportWidth = scrollOffset > 0 ? viewportWidth + 1 : viewportWidth;\n\n        if (sum >= scrollOffset && sum + columnWidth <= scrollOffset + compensatedViewportWidth) {\n          if (this.startColumn == null) {\n            this.startColumn = i;\n          }\n          this.endColumn = i;\n        }\n        startPositions.push(sum);\n        sum += columnWidth;\n\n        if (!onlyFullyVisible) {\n          this.endColumn = i;\n        }\n        if (sum >= scrollOffset + viewportWidth) {\n          needReverse = false;\n          break;\n        }\n      }\n\n      if (this.endColumn === totalColumns - 1 && needReverse) {\n        this.startColumn = this.endColumn;\n\n        while (this.startColumn > 0) {\n          var viewportSum = startPositions[this.endColumn] + columnWidth - startPositions[this.startColumn - 1];\n\n          if (viewportSum <= viewportWidth || !onlyFullyVisible) {\n            this.startColumn--;\n          }\n          if (viewportSum > viewportWidth) {\n            break;\n          }\n        }\n      }\n\n      if (this.startColumn !== null && overrideFn) {\n        overrideFn(this);\n      }\n      this.startPosition = startPositions[this.startColumn];\n\n      if (this.startPosition == void 0) {\n        this.startPosition = null;\n      }\n      if (this.startColumn !== null) {\n        this.count = this.endColumn - this.startColumn + 1;\n      }\n    }\n\n    /**\n     * Recalculate columns stretching.\n     *\n     * @param {Number} totalWidth\n     */\n\n  }, {\n    key: 'refreshStretching',\n    value: function refreshStretching(totalWidth) {\n      if (this.stretch === 'none') {\n        return;\n      }\n      this.totalTargetWidth = totalWidth;\n\n      var priv = privatePool.get(this);\n      var totalColumns = priv.totalColumns;\n      var sumAll = 0;\n\n      for (var i = 0; i < totalColumns; i++) {\n        var columnWidth = this._getColumnWidth(i);\n        var permanentColumnWidth = priv.stretchingColumnWidthFn(void 0, i);\n\n        if (typeof permanentColumnWidth === 'number') {\n          totalWidth -= permanentColumnWidth;\n        } else {\n          sumAll += columnWidth;\n        }\n      }\n      var remainingSize = totalWidth - sumAll;\n\n      if (this.stretch === 'all' && remainingSize > 0) {\n        this.stretchAllRatio = totalWidth / sumAll;\n        this.stretchAllColumnsWidth = [];\n        this.needVerifyLastColumnWidth = true;\n      } else if (this.stretch === 'last' && totalWidth !== Infinity) {\n        var _columnWidth = this._getColumnWidth(totalColumns - 1);\n        var lastColumnWidth = remainingSize + _columnWidth;\n\n        this.stretchLastWidth = lastColumnWidth >= 0 ? lastColumnWidth : _columnWidth;\n      }\n    }\n\n    /**\n     * Get stretched column width based on stretchH (all or last) setting passed in handsontable instance.\n     *\n     * @param {Number} column\n     * @param {Number} baseWidth\n     * @returns {Number|null}\n     */\n\n  }, {\n    key: 'getStretchedColumnWidth',\n    value: function getStretchedColumnWidth(column, baseWidth) {\n      var result = null;\n\n      if (this.stretch === 'all' && this.stretchAllRatio !== 0) {\n        result = this._getStretchedAllColumnWidth(column, baseWidth);\n      } else if (this.stretch === 'last' && this.stretchLastWidth !== 0) {\n        result = this._getStretchedLastColumnWidth(column);\n      }\n\n      return result;\n    }\n\n    /**\n     * @param {Number} column\n     * @param {Number} baseWidth\n     * @returns {Number}\n     * @private\n     */\n\n  }, {\n    key: '_getStretchedAllColumnWidth',\n    value: function _getStretchedAllColumnWidth(column, baseWidth) {\n      var sumRatioWidth = 0;\n      var priv = privatePool.get(this);\n      var totalColumns = priv.totalColumns;\n\n      if (!this.stretchAllColumnsWidth[column]) {\n        var stretchedWidth = Math.round(baseWidth * this.stretchAllRatio);\n        var newStretchedWidth = priv.stretchingColumnWidthFn(stretchedWidth, column);\n\n        if (newStretchedWidth === void 0) {\n          this.stretchAllColumnsWidth[column] = stretchedWidth;\n        } else {\n          this.stretchAllColumnsWidth[column] = isNaN(newStretchedWidth) ? this._getColumnWidth(column) : newStretchedWidth;\n        }\n      }\n\n      if (this.stretchAllColumnsWidth.length === totalColumns && this.needVerifyLastColumnWidth) {\n        this.needVerifyLastColumnWidth = false;\n\n        for (var i = 0; i < this.stretchAllColumnsWidth.length; i++) {\n          sumRatioWidth += this.stretchAllColumnsWidth[i];\n        }\n        if (sumRatioWidth !== this.totalTargetWidth) {\n          this.stretchAllColumnsWidth[this.stretchAllColumnsWidth.length - 1] += this.totalTargetWidth - sumRatioWidth;\n        }\n      }\n\n      return this.stretchAllColumnsWidth[column];\n    }\n\n    /**\n     * @param {Number} column\n     * @returns {Number|null}\n     * @private\n     */\n\n  }, {\n    key: '_getStretchedLastColumnWidth',\n    value: function _getStretchedLastColumnWidth(column) {\n      var priv = privatePool.get(this);\n      var totalColumns = priv.totalColumns;\n\n      if (column === totalColumns - 1) {\n        return this.stretchLastWidth;\n      }\n\n      return null;\n    }\n\n    /**\n     * @param {Number} column Column index.\n     * @returns {Number}\n     * @private\n     */\n\n  }, {\n    key: '_getColumnWidth',\n    value: function _getColumnWidth(column) {\n      var width = privatePool.get(this).columnWidthFn(column);\n\n      if (width === void 0) {\n        width = ViewportColumnsCalculator.DEFAULT_WIDTH;\n      }\n\n      return width;\n    }\n  }]);\n\n  return ViewportColumnsCalculator;\n}();\n\nexports.default = ViewportColumnsCalculator;\n\n/***/ }),\n/* 176 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar privatePool = new WeakMap();\n\n/**\n * Calculates indexes of rows to render OR rows that are visible.\n * To redo the calculation, you need to create a new calculator.\n *\n * @class ViewportRowsCalculator\n */\n\nvar ViewportRowsCalculator = function () {\n  _createClass(ViewportRowsCalculator, null, [{\n    key: \"DEFAULT_HEIGHT\",\n\n    /**\n     * Default row height\n     *\n     * @type {Number}\n     */\n    get: function get() {\n      return 23;\n    }\n\n    /**\n     * @param {Number} viewportHeight Height of the viewport\n     * @param {Number} scrollOffset Current vertical scroll position of the viewport\n     * @param {Number} totalRows Total number of rows\n     * @param {Function} rowHeightFn Function that returns the height of the row at a given index (in px)\n     * @param {Function} overrideFn Function that changes calculated this.startRow, this.endRow (used by MergeCells plugin)\n     * @param {Boolean} onlyFullyVisible if `true`, only startRow and endRow will be indexes of rows that are fully in viewport\n     * @param {Number} horizontalScrollbarHeight\n     */\n\n  }]);\n\n  function ViewportRowsCalculator(viewportHeight, scrollOffset, totalRows, rowHeightFn, overrideFn, onlyFullyVisible, horizontalScrollbarHeight) {\n    _classCallCheck(this, ViewportRowsCalculator);\n\n    privatePool.set(this, {\n      viewportHeight: viewportHeight,\n      scrollOffset: scrollOffset,\n      totalRows: totalRows,\n      rowHeightFn: rowHeightFn,\n      overrideFn: overrideFn,\n      onlyFullyVisible: onlyFullyVisible,\n      horizontalScrollbarHeight: horizontalScrollbarHeight\n    });\n\n    /**\n     * Number of rendered/visible rows\n     *\n     * @type {Number}\n     */\n    this.count = 0;\n\n    /**\n     * Index of the first rendered/visible row (can be overwritten using overrideFn)\n     *\n     * @type {Number|null}\n     */\n    this.startRow = null;\n\n    /**\n     * Index of the last rendered/visible row (can be overwritten using overrideFn)\n     *\n     * @type {null}\n     */\n    this.endRow = null;\n\n    /**\n     * Position of the first rendered/visible row (in px)\n     *\n     * @type {Number|null}\n     */\n    this.startPosition = null;\n\n    this.calculate();\n  }\n\n  /**\n   * Calculates viewport\n   */\n\n\n  _createClass(ViewportRowsCalculator, [{\n    key: \"calculate\",\n    value: function calculate() {\n      var sum = 0;\n      var needReverse = true;\n      var startPositions = [];\n\n      var priv = privatePool.get(this);\n      var onlyFullyVisible = priv.onlyFullyVisible;\n      var overrideFn = priv.overrideFn;\n      var rowHeightFn = priv.rowHeightFn;\n      var scrollOffset = priv.scrollOffset;\n      var totalRows = priv.totalRows;\n      var viewportHeight = priv.viewportHeight;\n      var horizontalScrollbarHeight = priv.horizontalScrollbarHeight || 0;\n      var rowHeight = void 0;\n\n      // Calculate the number (start and end index) of rows needed\n      for (var i = 0; i < totalRows; i++) {\n        rowHeight = rowHeightFn(i);\n\n        if (rowHeight === undefined) {\n          rowHeight = ViewportRowsCalculator.DEFAULT_HEIGHT;\n        }\n        if (sum <= scrollOffset && !onlyFullyVisible) {\n          this.startRow = i;\n        }\n\n        // the row is within the \"visible range\"\n        if (sum >= scrollOffset && sum + rowHeight <= scrollOffset + viewportHeight - horizontalScrollbarHeight) {\n          if (this.startRow === null) {\n            this.startRow = i;\n          }\n          this.endRow = i;\n        }\n        startPositions.push(sum);\n        sum += rowHeight;\n\n        if (!onlyFullyVisible) {\n          this.endRow = i;\n        }\n        if (sum >= scrollOffset + viewportHeight - horizontalScrollbarHeight) {\n          needReverse = false;\n          break;\n        }\n      }\n\n      // If the estimation has reached the last row and there is still some space available in the viewport,\n      // we need to render in reverse in order to fill the whole viewport with rows\n      if (this.endRow === totalRows - 1 && needReverse) {\n        this.startRow = this.endRow;\n\n        while (this.startRow > 0) {\n          // rowHeight is the height of the last row\n          var viewportSum = startPositions[this.endRow] + rowHeight - startPositions[this.startRow - 1];\n\n          if (viewportSum <= viewportHeight - horizontalScrollbarHeight || !onlyFullyVisible) {\n            this.startRow--;\n          }\n          if (viewportSum >= viewportHeight - horizontalScrollbarHeight) {\n            break;\n          }\n        }\n      }\n\n      if (this.startRow !== null && overrideFn) {\n        overrideFn(this);\n      }\n      this.startPosition = startPositions[this.startRow];\n\n      if (this.startPosition == void 0) {\n        this.startPosition = null;\n      }\n      if (this.startRow !== null) {\n        this.count = this.endRow - this.startRow + 1;\n      }\n    }\n  }]);\n\n  return ViewportRowsCalculator;\n}();\n\nexports.default = ViewportRowsCalculator;\n\n/***/ }),\n/* 177 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class ColumnFilter\n */\nvar ColumnFilter = function () {\n  /**\n   * @param {Number} offset\n   * @param {Number} total\n   * @param {Number} countTH\n   */\n  function ColumnFilter(offset, total, countTH) {\n    _classCallCheck(this, ColumnFilter);\n\n    this.offset = offset;\n    this.total = total;\n    this.countTH = countTH;\n  }\n\n  /**\n   * @param index\n   * @returns {Number}\n   */\n\n\n  _createClass(ColumnFilter, [{\n    key: \"offsetted\",\n    value: function offsetted(index) {\n      return index + this.offset;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"unOffsetted\",\n    value: function unOffsetted(index) {\n      return index - this.offset;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"renderedToSource\",\n    value: function renderedToSource(index) {\n      return this.offsetted(index);\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"sourceToRendered\",\n    value: function sourceToRendered(index) {\n      return this.unOffsetted(index);\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"offsettedTH\",\n    value: function offsettedTH(index) {\n      return index - this.countTH;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"unOffsettedTH\",\n    value: function unOffsettedTH(index) {\n      return index + this.countTH;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"visibleRowHeadedColumnToSourceColumn\",\n    value: function visibleRowHeadedColumnToSourceColumn(index) {\n      return this.renderedToSource(this.offsettedTH(index));\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"sourceColumnToVisibleRowHeadedColumn\",\n    value: function sourceColumnToVisibleRowHeadedColumn(index) {\n      return this.unOffsettedTH(this.sourceToRendered(index));\n    }\n  }]);\n\n  return ColumnFilter;\n}();\n\nexports.default = ColumnFilter;\n\n/***/ }),\n/* 178 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class RowFilter\n */\nvar RowFilter = function () {\n  /**\n   * @param {Number} offset\n   * @param {Number} total\n   * @param {Number} countTH\n   */\n  function RowFilter(offset, total, countTH) {\n    _classCallCheck(this, RowFilter);\n\n    this.offset = offset;\n    this.total = total;\n    this.countTH = countTH;\n  }\n\n  /**\n   * @param index\n   * @returns {Number}\n   */\n\n\n  _createClass(RowFilter, [{\n    key: \"offsetted\",\n    value: function offsetted(index) {\n      return index + this.offset;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"unOffsetted\",\n    value: function unOffsetted(index) {\n      return index - this.offset;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"renderedToSource\",\n    value: function renderedToSource(index) {\n      return this.offsetted(index);\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"sourceToRendered\",\n    value: function sourceToRendered(index) {\n      return this.unOffsetted(index);\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"offsettedTH\",\n    value: function offsettedTH(index) {\n      return index - this.countTH;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"unOffsettedTH\",\n    value: function unOffsettedTH(index) {\n      return index + this.countTH;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"visibleColHeadedRowToSourceRow\",\n    value: function visibleColHeadedRowToSourceRow(index) {\n      return this.renderedToSource(this.offsettedTH(index));\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"sourceRowToVisibleColHeadedRow\",\n    value: function sourceRowToVisibleColHeadedRow(index) {\n      return this.unOffsettedTH(this.sourceToRendered(index));\n    }\n  }]);\n\n  return RowFilter;\n}();\n\nexports.default = RowFilter;\n\n/***/ }),\n/* 179 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _string = __webpack_require__(36);\n\nvar _event = __webpack_require__(180);\n\nvar _event2 = _interopRequireDefault(_event);\n\nvar _overlays = __webpack_require__(181);\n\nvar _overlays2 = _interopRequireDefault(_overlays);\n\nvar _scroll = __webpack_require__(182);\n\nvar _scroll2 = _interopRequireDefault(_scroll);\n\nvar _settings = __webpack_require__(183);\n\nvar _settings2 = _interopRequireDefault(_settings);\n\nvar _table = __webpack_require__(184);\n\nvar _table2 = _interopRequireDefault(_table);\n\nvar _viewport = __webpack_require__(186);\n\nvar _viewport2 = _interopRequireDefault(_viewport);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Walkontable\n */\nvar Walkontable = function () {\n  /**\n   * @param {Object} settings\n   */\n  function Walkontable(settings) {\n    _classCallCheck(this, Walkontable);\n\n    var originalHeaders = [];\n\n    // this is the namespace for global events\n    this.guid = 'wt_' + (0, _string.randomString)();\n\n    // bootstrap from settings\n    if (settings.cloneSource) {\n      this.cloneSource = settings.cloneSource;\n      this.cloneOverlay = settings.cloneOverlay;\n      this.wtSettings = settings.cloneSource.wtSettings;\n      this.wtTable = new _table2.default(this, settings.table, settings.wtRootElement);\n      this.wtScroll = new _scroll2.default(this);\n      this.wtViewport = settings.cloneSource.wtViewport;\n      this.wtEvent = new _event2.default(this);\n      this.selections = this.cloneSource.selections;\n    } else {\n      this.wtSettings = new _settings2.default(this, settings);\n      this.wtTable = new _table2.default(this, settings.table);\n      this.wtScroll = new _scroll2.default(this);\n      this.wtViewport = new _viewport2.default(this);\n      this.wtEvent = new _event2.default(this);\n      this.selections = this.getSetting('selections');\n      this.wtOverlays = new _overlays2.default(this);\n      this.exportSettingsAsClassNames();\n    }\n\n    // find original headers\n    if (this.wtTable.THEAD.childNodes.length && this.wtTable.THEAD.childNodes[0].childNodes.length) {\n      for (var c = 0, clen = this.wtTable.THEAD.childNodes[0].childNodes.length; c < clen; c++) {\n        originalHeaders.push(this.wtTable.THEAD.childNodes[0].childNodes[c].innerHTML);\n      }\n      if (!this.getSetting('columnHeaders').length) {\n        this.update('columnHeaders', [function (column, TH) {\n          (0, _element.fastInnerText)(TH, originalHeaders[column]);\n        }]);\n      }\n    }\n    this.drawn = false;\n    this.drawInterrupted = false;\n  }\n\n  /**\n   * Force rerender of Walkontable\n   *\n   * @param {Boolean} [fastDraw=false] When `true`, try to refresh only the positions of borders without rerendering\n   *                                   the data. It will only work if Table.draw() does not force\n   *                                   rendering anyway\n   * @returns {Walkontable}\n   */\n\n\n  _createClass(Walkontable, [{\n    key: 'draw',\n    value: function draw() {\n      var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      this.drawInterrupted = false;\n\n      if (!fastDraw && !(0, _element.isVisible)(this.wtTable.TABLE)) {\n        // draw interrupted because TABLE is not visible\n        this.drawInterrupted = true;\n      } else {\n        this.wtTable.draw(fastDraw);\n      }\n\n      return this;\n    }\n\n    /**\n     * Returns the TD at coords. If topmost is set to true, returns TD from the topmost overlay layer,\n     * if not set or set to false, returns TD from the master table.\n     *\n     * @param {CellCoords} coords\n     * @param {Boolean} [topmost=false]\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'getCell',\n    value: function getCell(coords) {\n      var topmost = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (!topmost) {\n        return this.wtTable.getCell(coords);\n      }\n\n      var totalRows = this.wtSettings.getSetting('totalRows');\n      var fixedRowsTop = this.wtSettings.getSetting('fixedRowsTop');\n      var fixedRowsBottom = this.wtSettings.getSetting('fixedRowsBottom');\n      var fixedColumns = this.wtSettings.getSetting('fixedColumnsLeft');\n\n      if (coords.row < fixedRowsTop && coords.col < fixedColumns) {\n        return this.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell(coords);\n      } else if (coords.row < fixedRowsTop) {\n        return this.wtOverlays.topOverlay.clone.wtTable.getCell(coords);\n      } else if (coords.col < fixedColumns && coords.row >= totalRows - fixedRowsBottom) {\n        if (this.wtOverlays.bottomLeftCornerOverlay && this.wtOverlays.bottomLeftCornerOverlay.clone) {\n          return this.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.getCell(coords);\n        }\n      } else if (coords.col < fixedColumns) {\n        return this.wtOverlays.leftOverlay.clone.wtTable.getCell(coords);\n      } else if (coords.row < totalRows && coords.row > totalRows - fixedRowsBottom) {\n        if (this.wtOverlays.bottomOverlay && this.wtOverlays.bottomOverlay.clone) {\n          return this.wtOverlays.bottomOverlay.clone.wtTable.getCell(coords);\n        }\n      }\n\n      return this.wtTable.getCell(coords);\n    }\n\n    /**\n     * @param {Object} settings\n     * @param {*} value\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'update',\n    value: function update(settings, value) {\n      return this.wtSettings.update(settings, value);\n    }\n\n    /**\n     * Scroll the viewport to a row at the given index in the data source\n     *\n     * @param {Number} row\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'scrollVertical',\n    value: function scrollVertical(row) {\n      this.wtOverlays.topOverlay.scrollTo(row);\n      this.getSetting('onScrollVertically');\n\n      return this;\n    }\n\n    /**\n     * Scroll the viewport to a column at the given index in the data source\n     *\n     * @param {Number} column\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'scrollHorizontal',\n    value: function scrollHorizontal(column) {\n      this.wtOverlays.leftOverlay.scrollTo(column);\n      this.getSetting('onScrollHorizontally');\n\n      return this;\n    }\n\n    /**\n     * Scrolls the viewport to a cell (rerenders if needed)\n     *\n     * @param {CellCoords} coords\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'scrollViewport',\n    value: function scrollViewport(coords) {\n      this.wtScroll.scrollViewport(coords);\n\n      return this;\n    }\n\n    /**\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getViewport',\n    value: function getViewport() {\n      return [this.wtTable.getFirstVisibleRow(), this.wtTable.getFirstVisibleColumn(), this.wtTable.getLastVisibleRow(), this.wtTable.getLastVisibleColumn()];\n    }\n\n    /**\n     * Get overlay name\n     *\n     * @returns {String}\n     */\n\n  }, {\n    key: 'getOverlayName',\n    value: function getOverlayName() {\n      return this.cloneOverlay ? this.cloneOverlay.type : 'master';\n    }\n\n    /**\n     * Check overlay type of this Walkontable instance.\n     *\n     * @param {String} name Clone type @see {Overlay.CLONE_TYPES}.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isOverlayName',\n    value: function isOverlayName(name) {\n      if (this.cloneOverlay) {\n        return this.cloneOverlay.type === name;\n      }\n\n      return false;\n    }\n\n    /**\n     * Export settings as class names added to the parent element of the table.\n     */\n\n  }, {\n    key: 'exportSettingsAsClassNames',\n    value: function exportSettingsAsClassNames() {\n      var _this = this;\n\n      var toExport = {\n        rowHeaders: ['array'],\n        columnHeaders: ['array']\n      };\n      var allClassNames = [];\n      var newClassNames = [];\n\n      (0, _object.objectEach)(toExport, function (optionType, key) {\n        if (optionType.indexOf('array') > -1 && _this.getSetting(key).length) {\n          newClassNames.push('ht' + (0, _string.toUpperCaseFirst)(key));\n        }\n        allClassNames.push('ht' + (0, _string.toUpperCaseFirst)(key));\n      });\n      (0, _element.removeClass)(this.wtTable.wtRootElement.parentNode, allClassNames);\n      (0, _element.addClass)(this.wtTable.wtRootElement.parentNode, newClassNames);\n    }\n\n    /**\n     * Get/Set Walkontable instance setting\n     *\n     * @param {String} key\n     * @param {*} [param1]\n     * @param {*} [param2]\n     * @param {*} [param3]\n     * @param {*} [param4]\n     * @returns {*}\n     */\n\n  }, {\n    key: 'getSetting',\n    value: function getSetting(key, param1, param2, param3, param4) {\n      // this is faster than .apply - https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\n      return this.wtSettings.getSetting(key, param1, param2, param3, param4);\n    }\n\n    /**\n     * Checks if setting exists\n     *\n     * @param {String} key\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasSetting',\n    value: function hasSetting(key) {\n      return this.wtSettings.has(key);\n    }\n\n    /**\n     * Destroy instance\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.wtOverlays.destroy();\n      this.wtEvent.destroy();\n    }\n  }]);\n\n  return Walkontable;\n}();\n\nexports.default = Walkontable;\n\n/***/ }),\n/* 180 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _function = __webpack_require__(42);\n\nvar _browser = __webpack_require__(27);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n *\n */\nfunction Event(instance) {\n  var that = this;\n  var eventManager = new _eventManager2.default(instance);\n  var selectedCellBeforeTouchEnd = void 0;\n\n  this.instance = instance;\n\n  var dblClickOrigin = [null, null];\n  this.dblClickTimeout = [null, null];\n\n  var onMouseDown = function onMouseDown(event) {\n    var activeElement = document.activeElement;\n    var getParentNode = (0, _function.partial)(_element.getParent, event.realTarget);\n    var realTarget = event.realTarget;\n\n    // ignore focusable element from mouse down processing (https://github.com/handsontable/handsontable/issues/3555)\n    if (realTarget === activeElement || getParentNode(0) === activeElement || getParentNode(1) === activeElement) {\n      return;\n    }\n\n    var cell = that.parentCell(realTarget);\n\n    if ((0, _element.hasClass)(realTarget, 'corner')) {\n      that.instance.getSetting('onCellCornerMouseDown', event, realTarget);\n    } else if (cell.TD) {\n      if (that.instance.hasSetting('onCellMouseDown')) {\n        that.instance.getSetting('onCellMouseDown', event, cell.coords, cell.TD, that.instance);\n      }\n    }\n\n    if (event.button !== 2) {\n      // if not right mouse button\n      if (cell.TD) {\n        dblClickOrigin[0] = cell.TD;\n        clearTimeout(that.dblClickTimeout[0]);\n        that.dblClickTimeout[0] = setTimeout(function () {\n          dblClickOrigin[0] = null;\n        }, 1000);\n      }\n    }\n  };\n\n  var onTouchMove = function onTouchMove(event) {\n    that.instance.touchMoving = true;\n  };\n\n  var onTouchStart = function onTouchStart(event) {\n    eventManager.addEventListener(this, 'touchmove', onTouchMove);\n\n    // Prevent cell selection when scrolling with touch event - not the best solution performance-wise\n    that.checkIfTouchMove = setTimeout(function () {\n      if (that.instance.touchMoving === true) {\n        that.instance.touchMoving = void 0;\n\n        eventManager.removeEventListener('touchmove', onTouchMove, false);\n      }\n\n      onMouseDown(event);\n    }, 30);\n  };\n\n  var onMouseOver = function onMouseOver(event) {\n    var table, td, mainWOT;\n\n    if (that.instance.hasSetting('onCellMouseOver')) {\n      table = that.instance.wtTable.TABLE;\n      td = (0, _element.closestDown)(event.realTarget, ['TD', 'TH'], table);\n      mainWOT = that.instance.cloneSource || that.instance;\n\n      if (td && td !== mainWOT.lastMouseOver && (0, _element.isChildOf)(td, table)) {\n        mainWOT.lastMouseOver = td;\n\n        that.instance.getSetting('onCellMouseOver', event, that.instance.wtTable.getCoords(td), td, that.instance);\n      }\n    }\n  };\n\n  var onMouseOut = function onMouseOut(event) {\n    var table = void 0;\n    var lastTD = void 0;\n    var nextTD = void 0;\n\n    if (that.instance.hasSetting('onCellMouseOut')) {\n      table = that.instance.wtTable.TABLE;\n      lastTD = (0, _element.closestDown)(event.realTarget, ['TD', 'TH'], table);\n      nextTD = (0, _element.closestDown)(event.relatedTarget, ['TD', 'TH'], table);\n\n      if (lastTD && lastTD !== nextTD && (0, _element.isChildOf)(lastTD, table)) {\n        that.instance.getSetting('onCellMouseOut', event, that.instance.wtTable.getCoords(lastTD), lastTD, that.instance);\n      }\n    }\n  };\n\n  var onMouseUp = function onMouseUp(event) {\n    if (event.button !== 2) {\n      // if not right mouse button\n      var cell = that.parentCell(event.realTarget);\n\n      if (cell.TD === dblClickOrigin[0] && cell.TD === dblClickOrigin[1]) {\n        if ((0, _element.hasClass)(event.realTarget, 'corner')) {\n          that.instance.getSetting('onCellCornerDblClick', event, cell.coords, cell.TD, that.instance);\n        } else {\n          that.instance.getSetting('onCellDblClick', event, cell.coords, cell.TD, that.instance);\n        }\n\n        dblClickOrigin[0] = null;\n        dblClickOrigin[1] = null;\n      } else if (cell.TD === dblClickOrigin[0]) {\n        that.instance.getSetting('onCellMouseUp', event, cell.coords, cell.TD, that.instance);\n\n        dblClickOrigin[1] = cell.TD;\n        clearTimeout(that.dblClickTimeout[1]);\n        that.dblClickTimeout[1] = setTimeout(function () {\n          dblClickOrigin[1] = null;\n        }, 500);\n      } else if (cell.TD && that.instance.hasSetting('onCellMouseUp')) {\n        that.instance.getSetting('onCellMouseUp', event, cell.coords, cell.TD, that.instance);\n      }\n    }\n  };\n\n  var selectedCellWasTouched = function selectedCellWasTouched(touchTarget) {\n    var cellUnderFinger = that.parentCell(touchTarget);\n    var coordsOfCellUnderFinger = cellUnderFinger.coords;\n\n    if (selectedCellBeforeTouchEnd && coordsOfCellUnderFinger) {\n      var _ref = [coordsOfCellUnderFinger.row, selectedCellBeforeTouchEnd.from.row],\n          rowTouched = _ref[0],\n          rowSelected = _ref[1];\n      var _ref2 = [coordsOfCellUnderFinger.col, selectedCellBeforeTouchEnd.from.col],\n          colTouched = _ref2[0],\n          colSelected = _ref2[1];\n\n\n      return rowTouched === rowSelected && colTouched === colSelected;\n    }\n\n    return false;\n  };\n\n  var onTouchEnd = function onTouchEnd(event) {\n    var excludeTags = ['A', 'BUTTON', 'INPUT'];\n    var target = event.target;\n\n    // touched link which was placed inside a cell (a cell with DOM `a` element) WILL NOT trigger the below function calls\n    // and as consequence will behave as standard (open the link).\n    if (selectedCellWasTouched(target) === false || excludeTags.includes(target.tagName) === false) {\n      event.preventDefault();\n      onMouseUp(event);\n    }\n  };\n\n  eventManager.addEventListener(this.instance.wtTable.holder, 'mousedown', onMouseDown);\n  eventManager.addEventListener(this.instance.wtTable.TABLE, 'mouseover', onMouseOver);\n  eventManager.addEventListener(this.instance.wtTable.TABLE, 'mouseout', onMouseOut);\n  eventManager.addEventListener(this.instance.wtTable.holder, 'mouseup', onMouseUp);\n\n  // check if full HOT instance, or detached WOT AND run on mobile device\n  if (this.instance.wtTable.holder.parentNode.parentNode && (0, _browser.isMobileBrowser)() && !that.instance.wtTable.isWorkingOnClone()) {\n    var classSelector = '.' + this.instance.wtTable.holder.parentNode.className.split(' ').join('.');\n\n    eventManager.addEventListener(this.instance.wtTable.holder, 'touchstart', function (event) {\n      selectedCellBeforeTouchEnd = instance.selections.getCell().cellRange;\n\n      that.instance.touchApplied = true;\n      if ((0, _element.isChildOf)(event.target, classSelector)) {\n        onTouchStart.call(event.target, event);\n      }\n    });\n    eventManager.addEventListener(this.instance.wtTable.holder, 'touchend', function (event) {\n      that.instance.touchApplied = false;\n      if ((0, _element.isChildOf)(event.target, classSelector)) {\n        onTouchEnd.call(event.target, event);\n      }\n    });\n\n    if (!that.instance.momentumScrolling) {\n      that.instance.momentumScrolling = {};\n    }\n    eventManager.addEventListener(this.instance.wtTable.holder, 'scroll', function (event) {\n      clearTimeout(that.instance.momentumScrolling._timeout);\n\n      if (!that.instance.momentumScrolling.ongoing) {\n        that.instance.getSetting('onBeforeTouchScroll');\n      }\n      that.instance.momentumScrolling.ongoing = true;\n\n      that.instance.momentumScrolling._timeout = setTimeout(function () {\n        if (!that.instance.touchApplied) {\n          that.instance.momentumScrolling.ongoing = false;\n\n          that.instance.getSetting('onAfterMomentumScroll');\n        }\n      }, 200);\n    });\n  }\n\n  eventManager.addEventListener(window, 'resize', function () {\n    if (that.instance.getSetting('stretchH') !== 'none') {\n      that.instance.draw();\n    }\n  });\n\n  this.destroy = function () {\n    clearTimeout(this.dblClickTimeout[0]);\n    clearTimeout(this.dblClickTimeout[1]);\n\n    eventManager.destroy();\n  };\n}\n\nEvent.prototype.parentCell = function (elem) {\n  var cell = {};\n  var TABLE = this.instance.wtTable.TABLE;\n  var TD = (0, _element.closestDown)(elem, ['TD', 'TH'], TABLE);\n\n  if (TD) {\n    cell.coords = this.instance.wtTable.getCoords(TD);\n    cell.TD = TD;\n  } else if ((0, _element.hasClass)(elem, 'wtBorder') && (0, _element.hasClass)(elem, 'current')) {\n    cell.coords = this.instance.selections.getCell().cellRange.highlight;\n    cell.TD = this.instance.wtTable.getCell(cell.coords);\n  } else if ((0, _element.hasClass)(elem, 'wtBorder') && (0, _element.hasClass)(elem, 'area')) {\n    if (this.instance.selections.createOrGetArea().cellRange) {\n      cell.coords = this.instance.selections.createOrGetArea().cellRange.to;\n      cell.TD = this.instance.wtTable.getCell(cell.coords);\n    }\n  }\n\n  return cell;\n};\n\nexports.default = Event;\n\n/***/ }),\n/* 181 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _unicode = __webpack_require__(21);\n\nvar _browser = __webpack_require__(27);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Overlays\n */\nvar Overlays = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function Overlays(wotInstance) {\n    _classCallCheck(this, Overlays);\n\n    /**\n     * Sometimes `line-height` might be set to 'normal'. In that case, a default `font-size` should be multiplied by roughly 1.2.\n     * https://developer.mozilla.org/pl/docs/Web/CSS/line-height#Values\n     */\n    var BODY_LINE_HEIGHT = parseInt(getComputedStyle(document.body).lineHeight, 10);\n    var FALLBACK_BODY_LINE_HEIGHT = parseInt(getComputedStyle(document.body).fontSize, 10) * 1.2;\n\n    this.wot = wotInstance;\n\n    // legacy support\n    this.instance = this.wot;\n    this.eventManager = new _eventManager2.default(this.wot);\n\n    this.wot.update('scrollbarWidth', (0, _element.getScrollbarWidth)());\n    this.wot.update('scrollbarHeight', (0, _element.getScrollbarWidth)());\n\n    this.scrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);\n\n    this.prepareOverlays();\n\n    this.destroyed = false;\n    this.keyPressed = false;\n    this.spreaderLastSize = {\n      width: null,\n      height: null\n    };\n    this.overlayScrollPositions = {\n      master: {\n        top: 0,\n        left: 0\n      },\n      top: {\n        top: null,\n        left: 0\n      },\n      bottom: {\n        top: null,\n        left: 0\n      },\n      left: {\n        top: 0,\n        left: null\n      }\n    };\n\n    this.pendingScrollCallbacks = {\n      master: {\n        top: 0,\n        left: 0\n      },\n      top: {\n        left: 0\n      },\n      bottom: {\n        left: 0\n      },\n      left: {\n        top: 0\n      }\n    };\n\n    this.verticalScrolling = false;\n    this.horizontalScrolling = false;\n    this.delegatedScrollCallback = false;\n\n    this.registeredListeners = [];\n\n    this.browserLineHeight = BODY_LINE_HEIGHT || FALLBACK_BODY_LINE_HEIGHT;\n\n    this.registerListeners();\n  }\n\n  /**\n   * Prepare overlays based on user settings.\n   *\n   * @returns {Boolean} Returns `true` if changes applied to overlay needs scroll synchronization.\n   */\n\n\n  _createClass(Overlays, [{\n    key: 'prepareOverlays',\n    value: function prepareOverlays() {\n      var syncScroll = false;\n\n      if (this.topOverlay) {\n        syncScroll = this.topOverlay.updateStateOfRendering() || syncScroll;\n      } else {\n        this.topOverlay = _base2.default.createOverlay(_base2.default.CLONE_TOP, this.wot);\n      }\n\n      if (!_base2.default.hasOverlay(_base2.default.CLONE_BOTTOM)) {\n        this.bottomOverlay = {\n          needFullRender: false,\n          updateStateOfRendering: function updateStateOfRendering() {\n            return false;\n          }\n        };\n      }\n      if (!_base2.default.hasOverlay(_base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n        this.bottomLeftCornerOverlay = {\n          needFullRender: false,\n          updateStateOfRendering: function updateStateOfRendering() {\n            return false;\n          }\n        };\n      }\n\n      if (this.bottomOverlay) {\n        syncScroll = this.bottomOverlay.updateStateOfRendering() || syncScroll;\n      } else {\n        this.bottomOverlay = _base2.default.createOverlay(_base2.default.CLONE_BOTTOM, this.wot);\n      }\n\n      if (this.leftOverlay) {\n        syncScroll = this.leftOverlay.updateStateOfRendering() || syncScroll;\n      } else {\n        this.leftOverlay = _base2.default.createOverlay(_base2.default.CLONE_LEFT, this.wot);\n      }\n\n      if (this.topOverlay.needFullRender && this.leftOverlay.needFullRender) {\n        if (this.topLeftCornerOverlay) {\n          syncScroll = this.topLeftCornerOverlay.updateStateOfRendering() || syncScroll;\n        } else {\n          this.topLeftCornerOverlay = _base2.default.createOverlay(_base2.default.CLONE_TOP_LEFT_CORNER, this.wot);\n        }\n      }\n\n      if (this.bottomOverlay.needFullRender && this.leftOverlay.needFullRender) {\n        if (this.bottomLeftCornerOverlay) {\n          syncScroll = this.bottomLeftCornerOverlay.updateStateOfRendering() || syncScroll;\n        } else {\n          this.bottomLeftCornerOverlay = _base2.default.createOverlay(_base2.default.CLONE_BOTTOM_LEFT_CORNER, this.wot);\n        }\n      }\n\n      if (this.wot.getSetting('debug') && !this.debug) {\n        this.debug = _base2.default.createOverlay(_base2.default.CLONE_DEBUG, this.wot);\n      }\n\n      return syncScroll;\n    }\n\n    /**\n     * Refresh and redraw table\n     */\n\n  }, {\n    key: 'refreshAll',\n    value: function refreshAll() {\n      if (!this.wot.drawn) {\n        return;\n      }\n      if (!this.wot.wtTable.holder.parentNode) {\n        // Walkontable was detached from DOM, but this handler was not removed\n        this.destroy();\n\n        return;\n      }\n      this.wot.draw(true);\n\n      if (this.verticalScrolling) {\n        this.leftOverlay.onScroll();\n      }\n\n      if (this.horizontalScrolling) {\n        this.topOverlay.onScroll();\n      }\n\n      this.verticalScrolling = false;\n      this.horizontalScrolling = false;\n    }\n\n    /**\n     * Register all necessary event listeners.\n     */\n\n  }, {\n    key: 'registerListeners',\n    value: function registerListeners() {\n      var _this = this;\n\n      var topOverlayScrollable = this.topOverlay.mainTableScrollableElement;\n      var leftOverlayScrollable = this.leftOverlay.mainTableScrollableElement;\n\n      var listenersToRegister = [];\n      listenersToRegister.push([document.documentElement, 'keydown', function (event) {\n        return _this.onKeyDown(event);\n      }]);\n      listenersToRegister.push([document.documentElement, 'keyup', function () {\n        return _this.onKeyUp();\n      }]);\n      listenersToRegister.push([document, 'visibilitychange', function () {\n        return _this.onKeyUp();\n      }]);\n      listenersToRegister.push([topOverlayScrollable, 'scroll', function (event) {\n        return _this.onTableScroll(event);\n      }]);\n\n      if (topOverlayScrollable !== leftOverlayScrollable) {\n        listenersToRegister.push([leftOverlayScrollable, 'scroll', function (event) {\n          return _this.onTableScroll(event);\n        }]);\n      }\n\n      var isHighPixelRatio = window.devicePixelRatio && window.devicePixelRatio > 1;\n\n      if (isHighPixelRatio || !(0, _browser.isChrome)()) {\n        listenersToRegister.push([this.instance.wtTable.wtRootElement.parentNode, 'wheel', function (event) {\n          return _this.onCloneWheel(event);\n        }]);\n      } else {\n        if (this.topOverlay.needFullRender) {\n          listenersToRegister.push([this.topOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n\n        if (this.bottomOverlay.needFullRender) {\n          listenersToRegister.push([this.bottomOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n\n        if (this.leftOverlay.needFullRender) {\n          listenersToRegister.push([this.leftOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n\n        if (this.topLeftCornerOverlay && this.topLeftCornerOverlay.needFullRender) {\n          listenersToRegister.push([this.topLeftCornerOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n\n        if (this.bottomLeftCornerOverlay && this.bottomLeftCornerOverlay.needFullRender) {\n          listenersToRegister.push([this.bottomLeftCornerOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n      }\n\n      if (this.topOverlay.trimmingContainer !== window && this.leftOverlay.trimmingContainer !== window) {\n        // This is necessary?\n        // eventManager.addEventListener(window, 'scroll', (event) => this.refreshAll(event));\n        listenersToRegister.push([window, 'wheel', function (event) {\n          var overlay = void 0;\n          var deltaY = event.wheelDeltaY || event.deltaY;\n          var deltaX = event.wheelDeltaX || event.deltaX;\n\n          if (_this.topOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'top';\n          } else if (_this.bottomOverlay.clone && _this.bottomOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'bottom';\n          } else if (_this.leftOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'left';\n          } else if (_this.topLeftCornerOverlay && _this.topLeftCornerOverlay.clone && _this.topLeftCornerOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'topLeft';\n          } else if (_this.bottomLeftCornerOverlay && _this.bottomLeftCornerOverlay.clone && _this.bottomLeftCornerOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'bottomLeft';\n          }\n\n          if (overlay === 'top' && deltaY !== 0 || overlay === 'left' && deltaX !== 0 || overlay === 'bottom' && deltaY !== 0 || (overlay === 'topLeft' || overlay === 'bottomLeft') && (deltaY !== 0 || deltaX !== 0)) {\n\n            event.preventDefault();\n          }\n        }]);\n      }\n\n      while (listenersToRegister.length) {\n        var listener = listenersToRegister.pop();\n        this.eventManager.addEventListener(listener[0], listener[1], listener[2]);\n\n        this.registeredListeners.push(listener);\n      }\n    }\n\n    /**\n     * Deregister all previously registered listeners.\n     */\n\n  }, {\n    key: 'deregisterListeners',\n    value: function deregisterListeners() {\n      while (this.registeredListeners.length) {\n        var listener = this.registeredListeners.pop();\n        this.eventManager.removeEventListener(listener[0], listener[1], listener[2]);\n      }\n    }\n\n    /**\n     * Scroll listener\n     *\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onTableScroll',\n    value: function onTableScroll(event) {\n      // There was if statement which controlled flow of this function. It avoided the execution of the next lines\n      // on mobile devices. It was changed. Broader description of this case is included within issue #4856.\n\n      var masterHorizontal = this.leftOverlay.mainTableScrollableElement;\n      var masterVertical = this.topOverlay.mainTableScrollableElement;\n      var target = event.target;\n\n      // For key press, sync only master -> overlay position because while pressing Walkontable.render is triggered\n      // by hot.refreshBorder\n      if (this.keyPressed) {\n        if (masterVertical !== window && target !== window && !event.target.contains(masterVertical) || masterHorizontal !== window && target !== window && !event.target.contains(masterHorizontal)) {\n          return;\n        }\n      }\n\n      this.syncScrollPositions(event);\n    }\n\n    /**\n     * Wheel listener for cloned overlays.\n     *\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onCloneWheel',\n    value: function onCloneWheel(event) {\n      if (this.scrollableElement !== window) {\n        event.preventDefault();\n      }\n      // There was if statement which controlled flow of this function. It avoided the execution of the next lines\n      // on mobile devices. It was changed. Broader description of this case is included within issue #4856.\n\n      var masterHorizontal = this.leftOverlay.mainTableScrollableElement;\n      var masterVertical = this.topOverlay.mainTableScrollableElement;\n      var target = event.target;\n\n      // For key press, sync only master -> overlay position because while pressing Walkontable.render is triggered\n      // by hot.refreshBorder\n      var shouldNotWheelVertically = masterVertical !== window && target !== window && !event.target.contains(masterVertical);\n      var shouldNotWheelHorizontally = masterHorizontal !== window && target !== window && !event.target.contains(masterHorizontal);\n\n      if (this.keyPressed && (shouldNotWheelVertically || shouldNotWheelHorizontally)) {\n        return;\n      }\n\n      this.translateMouseWheelToScroll(event);\n    }\n\n    /**\n     * Key down listener\n     */\n\n  }, {\n    key: 'onKeyDown',\n    value: function onKeyDown(event) {\n      this.keyPressed = (0, _unicode.isKey)(event.keyCode, 'ARROW_UP|ARROW_RIGHT|ARROW_DOWN|ARROW_LEFT');\n    }\n\n    /**\n     * Key up listener\n     */\n\n  }, {\n    key: 'onKeyUp',\n    value: function onKeyUp() {\n      this.keyPressed = false;\n    }\n\n    /**\n     * Translate wheel event into scroll event and sync scroll overlays position\n     *\n     * @private\n     * @param {Event} event\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'translateMouseWheelToScroll',\n    value: function translateMouseWheelToScroll(event) {\n      var deltaY = isNaN(event.deltaY) ? -1 * event.wheelDeltaY : event.deltaY;\n      var deltaX = isNaN(event.deltaX) ? -1 * event.wheelDeltaX : event.deltaX;\n\n      if (event.deltaMode === 1) {\n        deltaX += deltaX * this.browserLineHeight;\n        deltaY += deltaY * this.browserLineHeight;\n      }\n\n      this.scrollVertically(deltaY);\n      this.scrollHorizontally(deltaX);\n\n      return false;\n    }\n  }, {\n    key: 'scrollVertically',\n    value: function scrollVertically(distance) {\n      if (distance === 0) {\n        return 0;\n      }\n      this.scrollableElement.scrollTop += distance;\n    }\n  }, {\n    key: 'scrollHorizontally',\n    value: function scrollHorizontally(distance) {\n      if (distance === 0) {\n        return 0;\n      }\n      this.scrollableElement.scrollLeft += distance;\n    }\n\n    /**\n     * Synchronize scroll position between master table and overlay table.\n     *\n     * @private\n     * @param {Event|Object} event\n     */\n\n  }, {\n    key: 'syncScrollPositions',\n    value: function syncScrollPositions(event) {\n      if (this.destroyed) {\n        return;\n      }\n\n      var topHolder = this.topOverlay.clone.wtTable.holder;\n      var leftHolder = this.leftOverlay.clone.wtTable.holder;\n\n      var _ref = [this.scrollableElement.scrollLeft, this.scrollableElement.scrollTop],\n          scrollLeft = _ref[0],\n          scrollTop = _ref[1];\n\n\n      this.horizontalScrolling = topHolder.scrollLeft !== scrollLeft;\n      this.verticalScrolling = leftHolder.scrollTop !== scrollTop;\n\n      if (this.horizontalScrolling) {\n        topHolder.scrollLeft = scrollLeft;\n      }\n\n      if (this.verticalScrolling) {\n        leftHolder.scrollTop = scrollTop;\n\n        if (this.bottomOverlay.needFullRender) {\n          this.bottomOverlay.clone.wtTable.holder.scrollLeft = scrollLeft;\n        }\n      }\n\n      this.refreshAll();\n    }\n\n    /**\n     * Synchronize overlay scrollbars with the master scrollbar\n     */\n\n  }, {\n    key: 'syncScrollWithMaster',\n    value: function syncScrollWithMaster() {\n      var master = this.topOverlay.mainTableScrollableElement;\n      var scrollLeft = master.scrollLeft,\n          scrollTop = master.scrollTop;\n\n\n      if (this.topOverlay.needFullRender) {\n        this.topOverlay.clone.wtTable.holder.scrollLeft = scrollLeft;\n      }\n      if (this.bottomOverlay.needFullRender) {\n        this.bottomOverlay.clone.wtTable.holder.scrollLeft = scrollLeft;\n      }\n      if (this.leftOverlay.needFullRender) {\n        this.leftOverlay.clone.wtTable.holder.scrollTop = scrollTop;\n      }\n    }\n\n    /**\n     * Update the main scrollable elements for all the overlays.\n     */\n\n  }, {\n    key: 'updateMainScrollableElements',\n    value: function updateMainScrollableElements() {\n      this.deregisterListeners();\n\n      this.leftOverlay.updateMainScrollableElement();\n      this.topOverlay.updateMainScrollableElement();\n\n      if (this.bottomOverlay.needFullRender) {\n        this.bottomOverlay.updateMainScrollableElement();\n      }\n\n      this.scrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);\n\n      this.registerListeners();\n    }\n\n    /**\n     *\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.eventManager.destroy();\n      this.topOverlay.destroy();\n\n      if (this.bottomOverlay.clone) {\n        this.bottomOverlay.destroy();\n      }\n      this.leftOverlay.destroy();\n\n      if (this.topLeftCornerOverlay) {\n        this.topLeftCornerOverlay.destroy();\n      }\n\n      if (this.bottomLeftCornerOverlay && this.bottomLeftCornerOverlay.clone) {\n        this.bottomLeftCornerOverlay.destroy();\n      }\n\n      if (this.debug) {\n        this.debug.destroy();\n      }\n      this.destroyed = true;\n    }\n\n    /**\n     * @param {Boolean} [fastDraw=false]\n     */\n\n  }, {\n    key: 'refresh',\n    value: function refresh() {\n      var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (this.topOverlay.areElementSizesAdjusted && this.leftOverlay.areElementSizesAdjusted) {\n        var container = this.wot.wtTable.wtRootElement.parentNode || this.wot.wtTable.wtRootElement;\n        var width = container.clientWidth;\n        var height = container.clientHeight;\n\n        if (width !== this.spreaderLastSize.width || height !== this.spreaderLastSize.height) {\n          this.spreaderLastSize.width = width;\n          this.spreaderLastSize.height = height;\n          this.adjustElementsSize();\n        }\n      }\n\n      if (this.bottomOverlay.clone) {\n        this.bottomOverlay.refresh(fastDraw);\n      }\n\n      this.leftOverlay.refresh(fastDraw);\n      this.topOverlay.refresh(fastDraw);\n\n      if (this.topLeftCornerOverlay) {\n        this.topLeftCornerOverlay.refresh(fastDraw);\n      }\n\n      if (this.bottomLeftCornerOverlay && this.bottomLeftCornerOverlay.clone) {\n        this.bottomLeftCornerOverlay.refresh(fastDraw);\n      }\n\n      if (this.debug) {\n        this.debug.refresh(fastDraw);\n      }\n    }\n\n    /**\n     * Adjust overlays elements size and master table size\n     *\n     * @param {Boolean} [force=false]\n     */\n\n  }, {\n    key: 'adjustElementsSize',\n    value: function adjustElementsSize() {\n      var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      var totalColumns = this.wot.getSetting('totalColumns');\n      var totalRows = this.wot.getSetting('totalRows');\n      var headerRowSize = this.wot.wtViewport.getRowHeaderWidth();\n      var headerColumnSize = this.wot.wtViewport.getColumnHeaderHeight();\n      var hiderStyle = this.wot.wtTable.hider.style;\n\n      hiderStyle.width = headerRowSize + this.leftOverlay.sumCellSizes(0, totalColumns) + 'px';\n      hiderStyle.height = headerColumnSize + this.topOverlay.sumCellSizes(0, totalRows) + 1 + 'px';\n\n      this.topOverlay.adjustElementsSize(force);\n      this.leftOverlay.adjustElementsSize(force);\n\n      if (this.bottomOverlay.clone) {\n        this.bottomOverlay.adjustElementsSize(force);\n      }\n    }\n\n    /**\n     *\n     */\n\n  }, {\n    key: 'applyToDOM',\n    value: function applyToDOM() {\n      if (!this.topOverlay.areElementSizesAdjusted || !this.leftOverlay.areElementSizesAdjusted) {\n        this.adjustElementsSize();\n      }\n      this.topOverlay.applyToDOM();\n\n      if (this.bottomOverlay.clone) {\n        this.bottomOverlay.applyToDOM();\n      }\n\n      this.leftOverlay.applyToDOM();\n    }\n\n    /**\n     * Get the parent overlay of the provided element.\n     *\n     * @param {HTMLElement} element\n     * @returns {Object|null}\n     */\n\n  }, {\n    key: 'getParentOverlay',\n    value: function getParentOverlay(element) {\n      if (!element) {\n        return null;\n      }\n\n      var overlays = [this.topOverlay, this.leftOverlay, this.bottomOverlay, this.topLeftCornerOverlay, this.bottomLeftCornerOverlay];\n      var result = null;\n\n      (0, _array.arrayEach)(overlays, function (elem, i) {\n        if (!elem) {\n          return;\n        }\n\n        if (elem.clone && elem.clone.wtTable.TABLE.contains(element)) {\n          result = elem.clone;\n        }\n      });\n\n      return result;\n    }\n  }]);\n\n  return Overlays;\n}();\n\nexports.default = Overlays;\n\n/***/ }),\n/* 182 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _number = __webpack_require__(5);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Scroll\n */\nvar Scroll = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function Scroll(wotInstance) {\n    _classCallCheck(this, Scroll);\n\n    this.wot = wotInstance;\n\n    // legacy support\n    this.instance = wotInstance;\n  }\n\n  /**\n   * Scrolls viewport to a cell by minimum number of cells\n   *\n   * @param {CellCoords} coords\n   */\n\n\n  _createClass(Scroll, [{\n    key: 'scrollViewport',\n    value: function scrollViewport(coords) {\n      if (!this.wot.drawn) {\n        return;\n      }\n\n      var _getVariables2 = this._getVariables(),\n          topOverlay = _getVariables2.topOverlay,\n          leftOverlay = _getVariables2.leftOverlay,\n          totalRows = _getVariables2.totalRows,\n          totalColumns = _getVariables2.totalColumns,\n          fixedRowsTop = _getVariables2.fixedRowsTop,\n          fixedRowsBottom = _getVariables2.fixedRowsBottom,\n          fixedColumnsLeft = _getVariables2.fixedColumnsLeft;\n\n      if (coords.row < 0 || coords.row > Math.max(totalRows - 1, 0)) {\n        throw new Error('row ' + coords.row + ' does not exist');\n      }\n\n      if (coords.col < 0 || coords.col > Math.max(totalColumns - 1, 0)) {\n        throw new Error('column ' + coords.col + ' does not exist');\n      }\n\n      if (coords.row >= fixedRowsTop && coords.row < this.getFirstVisibleRow()) {\n        topOverlay.scrollTo(coords.row);\n      } else if (coords.row > this.getLastVisibleRow() && coords.row < totalRows - fixedRowsBottom) {\n        topOverlay.scrollTo(coords.row, true);\n      }\n\n      if (coords.col >= fixedColumnsLeft && coords.col < this.getFirstVisibleColumn()) {\n        leftOverlay.scrollTo(coords.col);\n      } else if (coords.col > this.getLastVisibleColumn()) {\n        leftOverlay.scrollTo(coords.col, true);\n      }\n    }\n\n    /**\n     * Get first visible row based on virtual dom and how table is visible in browser window viewport.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getFirstVisibleRow',\n    value: function getFirstVisibleRow() {\n      var _getVariables3 = this._getVariables(),\n          topOverlay = _getVariables3.topOverlay,\n          wtTable = _getVariables3.wtTable,\n          wtViewport = _getVariables3.wtViewport,\n          totalRows = _getVariables3.totalRows,\n          fixedRowsTop = _getVariables3.fixedRowsTop;\n\n      var firstVisibleRow = wtTable.getFirstVisibleRow();\n\n      if (topOverlay.mainTableScrollableElement === window) {\n        var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);\n        var totalTableHeight = (0, _element.innerHeight)(wtTable.hider);\n        var windowHeight = (0, _element.innerHeight)(window);\n        var windowScrollTop = (0, _element.getScrollTop)(window);\n\n        // Only calculate firstVisibleRow when table didn't filled (from up) whole viewport space\n        if (rootElementOffset.top + totalTableHeight - windowHeight <= windowScrollTop) {\n          var rowsHeight = wtViewport.getColumnHeaderHeight();\n\n          rowsHeight += topOverlay.sumCellSizes(0, fixedRowsTop);\n\n          (0, _number.rangeEachReverse)(totalRows, 1, function (row) {\n            rowsHeight += topOverlay.sumCellSizes(row - 1, row);\n\n            if (rootElementOffset.top + totalTableHeight - rowsHeight <= windowScrollTop) {\n              // Return physical row + 1\n              firstVisibleRow = row;\n\n              return false;\n            }\n          });\n        }\n      }\n\n      return firstVisibleRow;\n    }\n\n    /**\n     * Get last visible row based on virtual dom and how table is visible in browser window viewport.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getLastVisibleRow',\n    value: function getLastVisibleRow() {\n      var _getVariables4 = this._getVariables(),\n          topOverlay = _getVariables4.topOverlay,\n          wtTable = _getVariables4.wtTable,\n          wtViewport = _getVariables4.wtViewport,\n          totalRows = _getVariables4.totalRows;\n\n      var lastVisibleRow = wtTable.getLastVisibleRow();\n\n      if (topOverlay.mainTableScrollableElement === window) {\n        var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);\n        var windowHeight = (0, _element.innerHeight)(window);\n        var windowScrollTop = (0, _element.getScrollTop)(window);\n\n        // Only calculate lastVisibleRow when table didn't filled (from bottom) whole viewport space\n        if (rootElementOffset.top > windowScrollTop) {\n          var rowsHeight = wtViewport.getColumnHeaderHeight();\n\n          (0, _number.rangeEach)(1, totalRows, function (row) {\n            rowsHeight += topOverlay.sumCellSizes(row - 1, row);\n\n            if (rootElementOffset.top + rowsHeight - windowScrollTop >= windowHeight) {\n              // Return physical row - 1 (-2 because rangeEach gives row index + 1 - sumCellSizes requirements)\n              lastVisibleRow = row - 2;\n\n              return false;\n            }\n          });\n        }\n      }\n\n      return lastVisibleRow;\n    }\n\n    /**\n     * Get first visible column based on virtual dom and how table is visible in browser window viewport.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getFirstVisibleColumn',\n    value: function getFirstVisibleColumn() {\n      var _getVariables5 = this._getVariables(),\n          leftOverlay = _getVariables5.leftOverlay,\n          wtTable = _getVariables5.wtTable,\n          wtViewport = _getVariables5.wtViewport,\n          totalColumns = _getVariables5.totalColumns,\n          fixedColumnsLeft = _getVariables5.fixedColumnsLeft;\n\n      var firstVisibleColumn = wtTable.getFirstVisibleColumn();\n\n      if (leftOverlay.mainTableScrollableElement === window) {\n        var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);\n        var totalTableWidth = (0, _element.innerWidth)(wtTable.hider);\n        var windowWidth = (0, _element.innerWidth)(window);\n        var windowScrollLeft = (0, _element.getScrollLeft)(window);\n\n        // Only calculate firstVisibleColumn when table didn't filled (from left) whole viewport space\n        if (rootElementOffset.left + totalTableWidth - windowWidth <= windowScrollLeft) {\n          var columnsWidth = wtViewport.getRowHeaderWidth();\n\n          (0, _number.rangeEachReverse)(totalColumns, 1, function (column) {\n            columnsWidth += leftOverlay.sumCellSizes(column - 1, column);\n\n            if (rootElementOffset.left + totalTableWidth - columnsWidth <= windowScrollLeft) {\n              // Return physical column + 1\n              firstVisibleColumn = column;\n\n              return false;\n            }\n          });\n        }\n      }\n\n      return firstVisibleColumn;\n    }\n\n    /**\n     * Get last visible column based on virtual dom and how table is visible in browser window viewport.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getLastVisibleColumn',\n    value: function getLastVisibleColumn() {\n      var _getVariables6 = this._getVariables(),\n          leftOverlay = _getVariables6.leftOverlay,\n          wtTable = _getVariables6.wtTable,\n          wtViewport = _getVariables6.wtViewport,\n          totalColumns = _getVariables6.totalColumns;\n\n      var lastVisibleColumn = wtTable.getLastVisibleColumn();\n\n      if (leftOverlay.mainTableScrollableElement === window) {\n        var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);\n        var windowWidth = (0, _element.innerWidth)(window);\n        var windowScrollLeft = (0, _element.getScrollLeft)(window);\n\n        // Only calculate lastVisibleColumn when table didn't filled (from right) whole viewport space\n        if (rootElementOffset.left > windowScrollLeft) {\n          var columnsWidth = wtViewport.getRowHeaderWidth();\n\n          (0, _number.rangeEach)(1, totalColumns, function (column) {\n            columnsWidth += leftOverlay.sumCellSizes(column - 1, column);\n\n            if (rootElementOffset.left + columnsWidth - windowScrollLeft >= windowWidth) {\n              // Return physical column - 1 (-2 because rangeEach gives column index + 1 - sumCellSizes requirements)\n              lastVisibleColumn = column - 2;\n\n              return false;\n            }\n          });\n        }\n      }\n\n      return lastVisibleColumn;\n    }\n\n    /**\n     * Returns collection of variables used to rows and columns visibility calculations.\n     *\n     * @returns {Object}\n     * @private\n     */\n\n  }, {\n    key: '_getVariables',\n    value: function _getVariables() {\n      var wot = this.wot;\n      var topOverlay = wot.wtOverlays.topOverlay;\n      var leftOverlay = wot.wtOverlays.leftOverlay;\n      var wtTable = wot.wtTable;\n      var wtViewport = wot.wtViewport;\n      var totalRows = wot.getSetting('totalRows');\n      var totalColumns = wot.getSetting('totalColumns');\n      var fixedRowsTop = wot.getSetting('fixedRowsTop');\n      var fixedRowsBottom = wot.getSetting('fixedRowsBottom');\n      var fixedColumnsLeft = wot.getSetting('fixedColumnsLeft');\n\n      return {\n        topOverlay: topOverlay,\n        leftOverlay: leftOverlay,\n        wtTable: wtTable,\n        wtViewport: wtViewport,\n        totalRows: totalRows,\n        totalColumns: totalColumns,\n        fixedRowsTop: fixedRowsTop,\n        fixedRowsBottom: fixedRowsBottom,\n        fixedColumnsLeft: fixedColumnsLeft\n      };\n    }\n  }]);\n\n  return Scroll;\n}();\n\nexports.default = Scroll;\n\n/***/ }),\n/* 183 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Settings\n */\nvar Settings = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   * @param {Object} settings\n   */\n  function Settings(wotInstance, settings) {\n    var _this = this;\n\n    _classCallCheck(this, Settings);\n\n    this.wot = wotInstance;\n\n    // legacy support\n    this.instance = wotInstance;\n\n    // default settings. void 0 means it is required, null means it can be empty\n    this.defaults = {\n      table: void 0,\n      debug: false, // shows WalkontableDebugOverlay\n\n      // presentation mode\n      externalRowCalculator: false,\n      stretchH: 'none', // values: all, last, none\n      currentRowClassName: null,\n      currentColumnClassName: null,\n      preventOverflow: function preventOverflow() {\n        return false;\n      },\n\n\n      // data source\n      data: void 0,\n      freezeOverlays: false,\n      fixedColumnsLeft: 0,\n      fixedRowsTop: 0,\n      fixedRowsBottom: 0,\n      minSpareRows: 0,\n\n      // this must be array of functions: [function (row, TH) {}]\n      rowHeaders: function rowHeaders() {\n        return [];\n      },\n\n\n      // this must be array of functions: [function (column, TH) {}]\n      columnHeaders: function columnHeaders() {\n        return [];\n      },\n\n      totalRows: void 0,\n      totalColumns: void 0,\n      cellRenderer: function cellRenderer(row, column, TD) {\n        var cellData = _this.getSetting('data', row, column);\n\n        (0, _element.fastInnerText)(TD, cellData === void 0 || cellData === null ? '' : cellData);\n      },\n\n      // columnWidth: 50,\n      columnWidth: function columnWidth(col) {\n        // return undefined means use default size for the rendered cell content\n      },\n      rowHeight: function rowHeight(row) {\n        // return undefined means use default size for the rendered cell content\n      },\n\n      defaultRowHeight: 23,\n      defaultColumnWidth: 50,\n      selections: null,\n      hideBorderOnMouseDownOver: false,\n      viewportRowCalculatorOverride: null,\n      viewportColumnCalculatorOverride: null,\n\n      // callbacks\n      onCellMouseDown: null,\n      onCellMouseOver: null,\n      onCellMouseOut: null,\n      onCellMouseUp: null,\n\n      //    onCellMouseOut: null,\n      onCellDblClick: null,\n      onCellCornerMouseDown: null,\n      onCellCornerDblClick: null,\n      beforeDraw: null,\n      onDraw: null,\n      onBeforeRemoveCellClassNames: null,\n      onAfterDrawSelection: null,\n      onBeforeDrawBorders: null,\n      onScrollVertically: null,\n      onScrollHorizontally: null,\n      onBeforeTouchScroll: null,\n      onAfterMomentumScroll: null,\n      onBeforeStretchingColumnWidth: function onBeforeStretchingColumnWidth(width) {\n        return width;\n      },\n      onModifyRowHeaderWidth: null,\n      onModifyGetCellCoords: null,\n\n      // constants\n      scrollbarWidth: 10,\n      scrollbarHeight: 10,\n\n      renderAllRows: false,\n      groups: false,\n      rowHeaderWidth: null,\n      columnHeaderHeight: null,\n      headerClassName: null\n    };\n\n    // reference to settings\n    this.settings = {};\n\n    for (var i in this.defaults) {\n      if ((0, _object.hasOwnProperty)(this.defaults, i)) {\n        if (settings[i] !== void 0) {\n          this.settings[i] = settings[i];\n        } else if (this.defaults[i] === void 0) {\n          throw new Error('A required setting \"' + i + '\" was not provided');\n        } else {\n          this.settings[i] = this.defaults[i];\n        }\n      }\n    }\n  }\n\n  /**\n   * Update settings\n   *\n   * @param {Object} settings\n   * @param {*} value\n   * @returns {Walkontable}\n   */\n\n\n  _createClass(Settings, [{\n    key: 'update',\n    value: function update(settings, value) {\n      if (value === void 0) {\n        // settings is object\n        for (var i in settings) {\n          if ((0, _object.hasOwnProperty)(settings, i)) {\n            this.settings[i] = settings[i];\n          }\n        }\n      } else {\n        // if value is defined then settings is the key\n        this.settings[settings] = value;\n      }\n      return this.wot;\n    }\n\n    /**\n     * Get setting by name\n     *\n     * @param {String} key\n     * @param {*} param1\n     * @param {*} param2\n     * @param {*} param3\n     * @param {*} param4\n     * @returns {*}\n     */\n\n  }, {\n    key: 'getSetting',\n    value: function getSetting(key, param1, param2, param3, param4) {\n      if (typeof this.settings[key] === 'function') {\n        // this is faster than .apply - https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\n        return this.settings[key](param1, param2, param3, param4);\n      } else if (param1 !== void 0 && Array.isArray(this.settings[key])) {\n        // perhaps this can be removed, it is only used in tests\n        return this.settings[key][param1];\n      }\n\n      return this.settings[key];\n    }\n\n    /**\n     * Checks if setting exists\n     *\n     * @param {Boolean} key\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'has',\n    value: function has(key) {\n      return !!this.settings[key];\n    }\n  }]);\n\n  return Settings;\n}();\n\nexports.default = Settings;\n\n/***/ }),\n/* 184 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _function = __webpack_require__(42);\n\nvar _coords = __webpack_require__(54);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nvar _range = __webpack_require__(86);\n\nvar _range2 = _interopRequireDefault(_range);\n\nvar _column = __webpack_require__(177);\n\nvar _column2 = _interopRequireDefault(_column);\n\nvar _row = __webpack_require__(178);\n\nvar _row2 = _interopRequireDefault(_row);\n\nvar _tableRenderer = __webpack_require__(185);\n\nvar _tableRenderer2 = _interopRequireDefault(_tableRenderer);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n *\n */\nvar Table = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   * @param {HTMLTableElement} table\n   */\n  function Table(wotInstance, table) {\n    var _this = this;\n\n    _classCallCheck(this, Table);\n\n    this.wot = wotInstance;\n\n    // legacy support\n    this.instance = this.wot;\n    this.TABLE = table;\n    this.TBODY = null;\n    this.THEAD = null;\n    this.COLGROUP = null;\n    this.tableOffset = 0;\n    this.holderOffset = 0;\n\n    (0, _element.removeTextNodes)(this.TABLE);\n\n    this.spreader = this.createSpreader(this.TABLE);\n    this.hider = this.createHider(this.spreader);\n    this.holder = this.createHolder(this.hider);\n\n    this.wtRootElement = this.holder.parentNode;\n    this.alignOverlaysWithTrimmingContainer();\n    this.fixTableDomTree();\n\n    this.colgroupChildrenLength = this.COLGROUP.childNodes.length;\n    this.theadChildrenLength = this.THEAD.firstChild ? this.THEAD.firstChild.childNodes.length : 0;\n    this.tbodyChildrenLength = this.TBODY.childNodes.length;\n\n    this.rowFilter = null;\n    this.columnFilter = null;\n    this.correctHeaderWidth = false;\n\n    var origRowHeaderWidth = this.wot.wtSettings.settings.rowHeaderWidth;\n\n    // Fix for jumping row headers (https://github.com/handsontable/handsontable/issues/3850)\n    this.wot.wtSettings.settings.rowHeaderWidth = function () {\n      return _this._modifyRowHeaderWidth(origRowHeaderWidth);\n    };\n  }\n\n  /**\n   *\n   */\n\n\n  _createClass(Table, [{\n    key: 'fixTableDomTree',\n    value: function fixTableDomTree() {\n      this.TBODY = this.TABLE.querySelector('tbody');\n\n      if (!this.TBODY) {\n        this.TBODY = document.createElement('tbody');\n        this.TABLE.appendChild(this.TBODY);\n      }\n      this.THEAD = this.TABLE.querySelector('thead');\n\n      if (!this.THEAD) {\n        this.THEAD = document.createElement('thead');\n        this.TABLE.insertBefore(this.THEAD, this.TBODY);\n      }\n      this.COLGROUP = this.TABLE.querySelector('colgroup');\n\n      if (!this.COLGROUP) {\n        this.COLGROUP = document.createElement('colgroup');\n        this.TABLE.insertBefore(this.COLGROUP, this.THEAD);\n      }\n\n      if (this.wot.getSetting('columnHeaders').length && !this.THEAD.childNodes.length) {\n        this.THEAD.appendChild(document.createElement('TR'));\n      }\n    }\n\n    /**\n     * @param table\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createSpreader',\n    value: function createSpreader(table) {\n      var parent = table.parentNode;\n      var spreader = void 0;\n\n      if (!parent || parent.nodeType !== 1 || !(0, _element.hasClass)(parent, 'wtHolder')) {\n        spreader = document.createElement('div');\n        spreader.className = 'wtSpreader';\n\n        if (parent) {\n          // if TABLE is detached (e.g. in Jasmine test), it has no parentNode so we cannot attach holder to it\n          parent.insertBefore(spreader, table);\n        }\n        spreader.appendChild(table);\n      }\n      spreader.style.position = 'relative';\n\n      return spreader;\n    }\n\n    /**\n     * @param spreader\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createHider',\n    value: function createHider(spreader) {\n      var parent = spreader.parentNode;\n      var hider = void 0;\n\n      if (!parent || parent.nodeType !== 1 || !(0, _element.hasClass)(parent, 'wtHolder')) {\n        hider = document.createElement('div');\n        hider.className = 'wtHider';\n\n        if (parent) {\n          // if TABLE is detached (e.g. in Jasmine test), it has no parentNode so we cannot attach holder to it\n          parent.insertBefore(hider, spreader);\n        }\n        hider.appendChild(spreader);\n      }\n\n      return hider;\n    }\n\n    /**\n     *\n     * @param hider\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createHolder',\n    value: function createHolder(hider) {\n      var parent = hider.parentNode;\n      var holder = void 0;\n\n      if (!parent || parent.nodeType !== 1 || !(0, _element.hasClass)(parent, 'wtHolder')) {\n        holder = document.createElement('div');\n        holder.style.position = 'relative';\n        holder.className = 'wtHolder';\n\n        if (parent) {\n          // if TABLE is detached (e.g. in Jasmine test), it has no parentNode so we cannot attach holder to it\n          parent.insertBefore(holder, hider);\n        }\n        if (!this.isWorkingOnClone()) {\n          holder.parentNode.className += 'ht_master handsontable';\n        }\n        holder.appendChild(hider);\n      }\n\n      return holder;\n    }\n  }, {\n    key: 'alignOverlaysWithTrimmingContainer',\n    value: function alignOverlaysWithTrimmingContainer() {\n      var trimmingElement = (0, _element.getTrimmingContainer)(this.wtRootElement);\n\n      if (!this.isWorkingOnClone()) {\n        this.holder.parentNode.style.position = 'relative';\n\n        if (trimmingElement === window) {\n          var preventOverflow = this.wot.getSetting('preventOverflow');\n\n          if (!preventOverflow) {\n            this.holder.style.overflow = 'visible';\n            this.wtRootElement.style.overflow = 'visible';\n          }\n        } else {\n          this.holder.style.width = (0, _element.getStyle)(trimmingElement, 'width');\n          this.holder.style.height = (0, _element.getStyle)(trimmingElement, 'height');\n          this.holder.style.overflow = '';\n        }\n      }\n    }\n  }, {\n    key: 'isWorkingOnClone',\n    value: function isWorkingOnClone() {\n      return !!this.wot.cloneSource;\n    }\n\n    /**\n     * Redraws the table\n     *\n     * @param {Boolean} fastDraw If TRUE, will try to avoid full redraw and only update the border positions. If FALSE or UNDEFINED, will perform a full redraw\n     * @returns {Table}\n     */\n\n  }, {\n    key: 'draw',\n    value: function draw(fastDraw) {\n      var _wot = this.wot,\n          wtOverlays = _wot.wtOverlays,\n          wtViewport = _wot.wtViewport;\n\n      var totalRows = this.instance.getSetting('totalRows');\n      var rowHeaders = this.wot.getSetting('rowHeaders').length;\n      var columnHeaders = this.wot.getSetting('columnHeaders').length;\n      var syncScroll = false;\n\n      if (!this.isWorkingOnClone()) {\n        this.holderOffset = (0, _element.offset)(this.holder);\n        fastDraw = wtViewport.createRenderCalculators(fastDraw);\n\n        if (rowHeaders && !this.wot.getSetting('fixedColumnsLeft')) {\n          var leftScrollPos = wtOverlays.leftOverlay.getScrollPosition();\n          var previousState = this.correctHeaderWidth;\n\n          this.correctHeaderWidth = leftScrollPos > 0;\n\n          if (previousState !== this.correctHeaderWidth) {\n            fastDraw = false;\n          }\n        }\n      }\n\n      if (!this.isWorkingOnClone()) {\n        syncScroll = wtOverlays.prepareOverlays();\n      }\n\n      if (fastDraw) {\n        if (!this.isWorkingOnClone()) {\n          // in case we only scrolled without redraw, update visible rows information in oldRowsCalculator\n          wtViewport.createVisibleCalculators();\n        }\n        if (wtOverlays) {\n          wtOverlays.refresh(true);\n        }\n      } else {\n        if (this.isWorkingOnClone()) {\n          this.tableOffset = this.wot.cloneSource.wtTable.tableOffset;\n        } else {\n          this.tableOffset = (0, _element.offset)(this.TABLE);\n        }\n        var startRow = void 0;\n\n        if (_base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_DEBUG) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_TOP) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_TOP_LEFT_CORNER)) {\n          startRow = 0;\n        } else if (_base2.default.isOverlayTypeOf(this.instance.cloneOverlay, _base2.default.CLONE_BOTTOM) || _base2.default.isOverlayTypeOf(this.instance.cloneOverlay, _base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n          startRow = Math.max(totalRows - this.wot.getSetting('fixedRowsBottom'), 0);\n        } else {\n          startRow = wtViewport.rowsRenderCalculator.startRow;\n        }\n        var startColumn = void 0;\n\n        if (_base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_DEBUG) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_LEFT) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_TOP_LEFT_CORNER) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n          startColumn = 0;\n        } else {\n          startColumn = wtViewport.columnsRenderCalculator.startColumn;\n        }\n        this.rowFilter = new _row2.default(startRow, totalRows, columnHeaders);\n        this.columnFilter = new _column2.default(startColumn, this.wot.getSetting('totalColumns'), rowHeaders);\n\n        this.alignOverlaysWithTrimmingContainer();\n        this._doDraw(); // creates calculator after draw\n      }\n      this.refreshSelections(fastDraw);\n\n      if (!this.isWorkingOnClone()) {\n        wtOverlays.topOverlay.resetFixedPosition();\n\n        if (wtOverlays.bottomOverlay.clone) {\n          wtOverlays.bottomOverlay.resetFixedPosition();\n        }\n\n        wtOverlays.leftOverlay.resetFixedPosition();\n\n        if (wtOverlays.topLeftCornerOverlay) {\n          wtOverlays.topLeftCornerOverlay.resetFixedPosition();\n        }\n\n        if (wtOverlays.bottomLeftCornerOverlay && wtOverlays.bottomLeftCornerOverlay.clone) {\n          wtOverlays.bottomLeftCornerOverlay.resetFixedPosition();\n        }\n      }\n      if (syncScroll) {\n        wtOverlays.syncScrollWithMaster();\n      }\n      this.wot.drawn = true;\n\n      return this;\n    }\n  }, {\n    key: '_doDraw',\n    value: function _doDraw() {\n      var wtRenderer = new _tableRenderer2.default(this);\n\n      wtRenderer.render();\n    }\n  }, {\n    key: 'removeClassFromCells',\n    value: function removeClassFromCells(className) {\n      var nodes = this.TABLE.querySelectorAll('.' + className);\n\n      for (var i = 0, len = nodes.length; i < len; i++) {\n        (0, _element.removeClass)(nodes[i], className);\n      }\n    }\n\n    /**\n     * Refresh the table selection by re-rendering Selection instances connected with that instance.\n     *\n     * @param {Boolean} fastDraw If fast drawing is enabled than additionally className clearing is applied.\n     */\n\n  }, {\n    key: 'refreshSelections',\n    value: function refreshSelections(fastDraw) {\n      if (!this.wot.selections) {\n        return;\n      }\n      var highlights = Array.from(this.wot.selections);\n      var len = highlights.length;\n\n      if (fastDraw) {\n        var classesToRemove = [];\n\n        for (var i = 0; i < len; i++) {\n          var _highlights$i$setting = highlights[i].settings,\n              highlightHeaderClassName = _highlights$i$setting.highlightHeaderClassName,\n              highlightRowClassName = _highlights$i$setting.highlightRowClassName,\n              highlightColumnClassName = _highlights$i$setting.highlightColumnClassName;\n\n          var classNames = highlights[i].classNames;\n          var classNamesLength = classNames.length;\n\n          for (var j = 0; j < classNamesLength; j++) {\n            if (!classesToRemove.includes(classNames[j])) {\n              classesToRemove.push(classNames[j]);\n            }\n          }\n\n          if (highlightHeaderClassName && !classesToRemove.includes(highlightHeaderClassName)) {\n            classesToRemove.push(highlightHeaderClassName);\n          }\n          if (highlightRowClassName && !classesToRemove.includes(highlightRowClassName)) {\n            classesToRemove.push(highlightRowClassName);\n          }\n          if (highlightColumnClassName && !classesToRemove.includes(highlightColumnClassName)) {\n            classesToRemove.push(highlightColumnClassName);\n          }\n        }\n\n        var additionalClassesToRemove = this.wot.getSetting('onBeforeRemoveCellClassNames');\n\n        if (Array.isArray(additionalClassesToRemove)) {\n          for (var _i = 0; _i < additionalClassesToRemove.length; _i++) {\n            classesToRemove.push(additionalClassesToRemove[_i]);\n          }\n        }\n\n        var classesToRemoveLength = classesToRemove.length;\n\n        for (var _i2 = 0; _i2 < classesToRemoveLength; _i2++) {\n          // there was no rerender, so we need to remove classNames by ourselves\n          this.removeClassFromCells(classesToRemove[_i2]);\n        }\n      }\n\n      for (var _i3 = 0; _i3 < len; _i3++) {\n        highlights[_i3].draw(this.wot, fastDraw);\n      }\n    }\n\n    /**\n     * Get cell element at coords.\n     *\n     * @param {CellCoords} coords\n     * @returns {HTMLElement|Number} HTMLElement on success or Number one of the exit codes on error:\n     *  -1 row before viewport\n     *  -2 row after viewport\n     */\n\n  }, {\n    key: 'getCell',\n    value: function getCell(coords) {\n      var row = coords.row;\n      var column = coords.col;\n      var hookResult = this.wot.getSetting('onModifyGetCellCoords', row, column);\n\n      if (hookResult && Array.isArray(hookResult)) {\n        var _hookResult = _slicedToArray(hookResult, 2);\n\n        row = _hookResult[0];\n        column = _hookResult[1];\n      }\n\n      if (this.isRowBeforeRenderedRows(row)) {\n        // row before rendered rows\n        return -1;\n      } else if (this.isRowAfterRenderedRows(row)) {\n        // row after rendered rows\n        return -2;\n      }\n\n      var TR = this.TBODY.childNodes[this.rowFilter.sourceToRendered(row)];\n\n      if (TR) {\n        return TR.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(column)];\n      }\n    }\n\n    /**\n     * getColumnHeader\n     *\n     * @param {Number} col Column index\n     * @param {Number} [level=0] Header level (0 = most distant to the table)\n     * @returns {Object} HTMLElement on success or undefined on error\n     */\n\n  }, {\n    key: 'getColumnHeader',\n    value: function getColumnHeader(col) {\n      var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n      var TR = this.THEAD.childNodes[level];\n\n      if (TR) {\n        return TR.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(col)];\n      }\n    }\n\n    /**\n     * getRowHeader\n     *\n     * @param {Number} row Row index\n     * @returns {HTMLElement} HTMLElement on success or Number one of the exit codes on error: `null table doesn't have row headers`\n     */\n\n  }, {\n    key: 'getRowHeader',\n    value: function getRowHeader(row) {\n      if (this.columnFilter.sourceColumnToVisibleRowHeadedColumn(0) === 0) {\n        return null;\n      }\n      var TR = this.TBODY.childNodes[this.rowFilter.sourceToRendered(row)];\n\n      if (TR) {\n        return TR.childNodes[0];\n      }\n    }\n\n    /**\n     * Returns cell coords object for a given TD (or a child element of a TD element).\n     *\n     * @param {HTMLTableCellElement} TD A cell DOM element (or a child of one).\n     * @returns {CellCoords|null} The coordinates of the provided TD element (or the closest TD element) or null, if the provided element is not applicable.\n     */\n\n  }, {\n    key: 'getCoords',\n    value: function getCoords(TD) {\n      if (TD.nodeName !== 'TD' && TD.nodeName !== 'TH') {\n        TD = (0, _element.closest)(TD, ['TD', 'TH']);\n      }\n\n      if (TD === null) {\n        return null;\n      }\n\n      var TR = TD.parentNode;\n      var CONTAINER = TR.parentNode;\n      var row = (0, _element.index)(TR);\n      var col = TD.cellIndex;\n\n      if ((0, _element.overlayContainsElement)(_base2.default.CLONE_TOP_LEFT_CORNER, TD) || (0, _element.overlayContainsElement)(_base2.default.CLONE_TOP, TD)) {\n        if (CONTAINER.nodeName === 'THEAD') {\n          row -= CONTAINER.childNodes.length;\n        }\n      } else if (CONTAINER === this.THEAD) {\n        row = this.rowFilter.visibleColHeadedRowToSourceRow(row);\n      } else {\n        row = this.rowFilter.renderedToSource(row);\n      }\n\n      if ((0, _element.overlayContainsElement)(_base2.default.CLONE_TOP_LEFT_CORNER, TD) || (0, _element.overlayContainsElement)(_base2.default.CLONE_LEFT, TD)) {\n        col = this.columnFilter.offsettedTH(col);\n      } else {\n        col = this.columnFilter.visibleRowHeadedColumnToSourceColumn(col);\n      }\n\n      return new _coords2.default(row, col);\n    }\n  }, {\n    key: 'getTrForRow',\n    value: function getTrForRow(row) {\n      return this.TBODY.childNodes[this.rowFilter.sourceToRendered(row)];\n    }\n  }, {\n    key: 'getFirstRenderedRow',\n    value: function getFirstRenderedRow() {\n      return this.wot.wtViewport.rowsRenderCalculator.startRow;\n    }\n  }, {\n    key: 'getFirstVisibleRow',\n    value: function getFirstVisibleRow() {\n      return this.wot.wtViewport.rowsVisibleCalculator.startRow;\n    }\n  }, {\n    key: 'getFirstRenderedColumn',\n    value: function getFirstRenderedColumn() {\n      return this.wot.wtViewport.columnsRenderCalculator.startColumn;\n    }\n\n    /**\n     * @returns {Number} Returns -1 if no row is visible\n     */\n\n  }, {\n    key: 'getFirstVisibleColumn',\n    value: function getFirstVisibleColumn() {\n      return this.wot.wtViewport.columnsVisibleCalculator.startColumn;\n    }\n\n    /**\n     * @returns {Number} Returns -1 if no row is visible\n     */\n\n  }, {\n    key: 'getLastRenderedRow',\n    value: function getLastRenderedRow() {\n      return this.wot.wtViewport.rowsRenderCalculator.endRow;\n    }\n  }, {\n    key: 'getLastVisibleRow',\n    value: function getLastVisibleRow() {\n      return this.wot.wtViewport.rowsVisibleCalculator.endRow;\n    }\n  }, {\n    key: 'getLastRenderedColumn',\n    value: function getLastRenderedColumn() {\n      return this.wot.wtViewport.columnsRenderCalculator.endColumn;\n    }\n\n    /**\n     * @returns {Number} Returns -1 if no column is visible\n     */\n\n  }, {\n    key: 'getLastVisibleColumn',\n    value: function getLastVisibleColumn() {\n      return this.wot.wtViewport.columnsVisibleCalculator.endColumn;\n    }\n  }, {\n    key: 'isRowBeforeRenderedRows',\n    value: function isRowBeforeRenderedRows(row) {\n      return this.rowFilter && this.rowFilter.sourceToRendered(row) < 0 && row >= 0;\n    }\n  }, {\n    key: 'isRowAfterViewport',\n    value: function isRowAfterViewport(row) {\n      return this.rowFilter && this.rowFilter.sourceToRendered(row) > this.getLastVisibleRow();\n    }\n  }, {\n    key: 'isRowAfterRenderedRows',\n    value: function isRowAfterRenderedRows(row) {\n      return this.rowFilter && this.rowFilter.sourceToRendered(row) > this.getLastRenderedRow();\n    }\n  }, {\n    key: 'isColumnBeforeViewport',\n    value: function isColumnBeforeViewport(column) {\n      return this.columnFilter && this.columnFilter.sourceToRendered(column) < 0 && column >= 0;\n    }\n  }, {\n    key: 'isColumnAfterViewport',\n    value: function isColumnAfterViewport(column) {\n      return this.columnFilter && this.columnFilter.sourceToRendered(column) > this.getLastVisibleColumn();\n    }\n  }, {\n    key: 'isLastRowFullyVisible',\n    value: function isLastRowFullyVisible() {\n      return this.getLastVisibleRow() === this.getLastRenderedRow();\n    }\n  }, {\n    key: 'isLastColumnFullyVisible',\n    value: function isLastColumnFullyVisible() {\n      return this.getLastVisibleColumn() === this.getLastRenderedColumn();\n    }\n  }, {\n    key: 'getRenderedColumnsCount',\n    value: function getRenderedColumnsCount() {\n      var columnsCount = this.wot.wtViewport.columnsRenderCalculator.count;\n      var totalColumns = this.wot.getSetting('totalColumns');\n\n      if (this.wot.isOverlayName(_base2.default.CLONE_DEBUG)) {\n        columnsCount = totalColumns;\n      } else if (this.wot.isOverlayName(_base2.default.CLONE_LEFT) || this.wot.isOverlayName(_base2.default.CLONE_TOP_LEFT_CORNER) || this.wot.isOverlayName(_base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n        return Math.min(this.wot.getSetting('fixedColumnsLeft'), totalColumns);\n      }\n\n      return columnsCount;\n    }\n  }, {\n    key: 'getRenderedRowsCount',\n    value: function getRenderedRowsCount() {\n      var rowsCount = this.wot.wtViewport.rowsRenderCalculator.count;\n      var totalRows = this.wot.getSetting('totalRows');\n\n      if (this.wot.isOverlayName(_base2.default.CLONE_DEBUG)) {\n        rowsCount = totalRows;\n      } else if (this.wot.isOverlayName(_base2.default.CLONE_TOP) || this.wot.isOverlayName(_base2.default.CLONE_TOP_LEFT_CORNER)) {\n        rowsCount = Math.min(this.wot.getSetting('fixedRowsTop'), totalRows);\n      } else if (this.wot.isOverlayName(_base2.default.CLONE_BOTTOM) || this.wot.isOverlayName(_base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n        rowsCount = Math.min(this.wot.getSetting('fixedRowsBottom'), totalRows);\n      }\n\n      return rowsCount;\n    }\n  }, {\n    key: 'getVisibleRowsCount',\n    value: function getVisibleRowsCount() {\n      return this.wot.wtViewport.rowsVisibleCalculator.count;\n    }\n  }, {\n    key: 'allRowsInViewport',\n    value: function allRowsInViewport() {\n      return this.wot.getSetting('totalRows') == this.getVisibleRowsCount();\n    }\n\n    /**\n     * Checks if any of the row's cells content exceeds its initial height, and if so, returns the oversized height\n     *\n     * @param {Number} sourceRow\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getRowHeight',\n    value: function getRowHeight(sourceRow) {\n      var height = this.wot.wtSettings.settings.rowHeight(sourceRow);\n      var oversizedHeight = this.wot.wtViewport.oversizedRows[sourceRow];\n\n      if (oversizedHeight !== void 0) {\n        height = height === void 0 ? oversizedHeight : Math.max(height, oversizedHeight);\n      }\n\n      return height;\n    }\n  }, {\n    key: 'getColumnHeaderHeight',\n    value: function getColumnHeaderHeight(level) {\n      var height = this.wot.wtSettings.settings.defaultRowHeight;\n      var oversizedHeight = this.wot.wtViewport.oversizedColumnHeaders[level];\n\n      if (oversizedHeight !== void 0) {\n        height = height ? Math.max(height, oversizedHeight) : oversizedHeight;\n      }\n\n      return height;\n    }\n  }, {\n    key: 'getVisibleColumnsCount',\n    value: function getVisibleColumnsCount() {\n      return this.wot.wtViewport.columnsVisibleCalculator.count;\n    }\n  }, {\n    key: 'allColumnsInViewport',\n    value: function allColumnsInViewport() {\n      return this.wot.getSetting('totalColumns') == this.getVisibleColumnsCount();\n    }\n  }, {\n    key: 'getColumnWidth',\n    value: function getColumnWidth(sourceColumn) {\n      var width = this.wot.wtSettings.settings.columnWidth;\n\n      if (typeof width === 'function') {\n        width = width(sourceColumn);\n      } else if ((typeof width === 'undefined' ? 'undefined' : _typeof(width)) === 'object') {\n        width = width[sourceColumn];\n      }\n\n      return width || this.wot.wtSettings.settings.defaultColumnWidth;\n    }\n  }, {\n    key: 'getStretchedColumnWidth',\n    value: function getStretchedColumnWidth(sourceColumn) {\n      var columnWidth = this.getColumnWidth(sourceColumn);\n      var width = columnWidth == null ? this.instance.wtSettings.settings.defaultColumnWidth : columnWidth;\n      var calculator = this.wot.wtViewport.columnsRenderCalculator;\n\n      if (calculator) {\n        var stretchedWidth = calculator.getStretchedColumnWidth(sourceColumn, width);\n\n        if (stretchedWidth) {\n          width = stretchedWidth;\n        }\n      }\n\n      return width;\n    }\n\n    /**\n     * Modify row header widths provided by user in class contructor.\n     *\n     * @private\n     */\n\n  }, {\n    key: '_modifyRowHeaderWidth',\n    value: function _modifyRowHeaderWidth(rowHeaderWidthFactory) {\n      var widths = (0, _function.isFunction)(rowHeaderWidthFactory) ? rowHeaderWidthFactory() : null;\n\n      if (Array.isArray(widths)) {\n        widths = [].concat(_toConsumableArray(widths));\n        widths[widths.length - 1] = this._correctRowHeaderWidth(widths[widths.length - 1]);\n      } else {\n        widths = this._correctRowHeaderWidth(widths);\n      }\n\n      return widths;\n    }\n\n    /**\n     * Correct row header width if necessary.\n     *\n     * @private\n     */\n\n  }, {\n    key: '_correctRowHeaderWidth',\n    value: function _correctRowHeaderWidth(width) {\n      if (typeof width !== 'number') {\n        width = this.wot.getSetting('defaultColumnWidth');\n      }\n      if (this.correctHeaderWidth) {\n        width++;\n      }\n\n      return width;\n    }\n  }]);\n\n  return Table;\n}();\n\nexports.default = Table;\n\n/***/ }),\n/* 185 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['Performance tip: Handsontable rendered more than 1000 visible rows. Consider limiting the number \\n          of rendered rows by specifying the table height and/or turning off the \"renderAllRows\" option.'], ['Performance tip: Handsontable rendered more than 1000 visible rows. Consider limiting the number \\n          of rendered rows by specifying the table height and/or turning off the \"renderAllRows\" option.']);\n\nvar _element = __webpack_require__(0);\n\nvar _console = __webpack_require__(56);\n\nvar _templateLiteralTag = __webpack_require__(41);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar performanceWarningAppeared = false;\n\n/**\n * @class TableRenderer\n */\n\nvar TableRenderer = function () {\n  /**\n   * @param {WalkontableTable} wtTable\n   */\n  function TableRenderer(wtTable) {\n    _classCallCheck(this, TableRenderer);\n\n    this.wtTable = wtTable;\n    this.wot = wtTable.instance;\n\n    // legacy support\n    this.instance = wtTable.instance;\n\n    this.rowFilter = wtTable.rowFilter;\n    this.columnFilter = wtTable.columnFilter;\n\n    this.TABLE = wtTable.TABLE;\n    this.THEAD = wtTable.THEAD;\n    this.TBODY = wtTable.TBODY;\n    this.COLGROUP = wtTable.COLGROUP;\n\n    this.rowHeaders = [];\n    this.rowHeaderCount = 0;\n    this.columnHeaders = [];\n    this.columnHeaderCount = 0;\n    this.fixedRowsTop = 0;\n    this.fixedRowsBottom = 0;\n  }\n\n  /**\n   *\n   */\n\n\n  _createClass(TableRenderer, [{\n    key: 'render',\n    value: function render() {\n      if (!this.wtTable.isWorkingOnClone()) {\n        var skipRender = {};\n        this.wot.getSetting('beforeDraw', true, skipRender);\n\n        if (skipRender.skipRender === true) {\n          return;\n        }\n      }\n\n      this.rowHeaders = this.wot.getSetting('rowHeaders');\n      this.rowHeaderCount = this.rowHeaders.length;\n      this.fixedRowsTop = this.wot.getSetting('fixedRowsTop');\n      this.fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');\n      this.columnHeaders = this.wot.getSetting('columnHeaders');\n      this.columnHeaderCount = this.columnHeaders.length;\n\n      var columnsToRender = this.wtTable.getRenderedColumnsCount();\n      var rowsToRender = this.wtTable.getRenderedRowsCount();\n      var totalColumns = this.wot.getSetting('totalColumns');\n      var totalRows = this.wot.getSetting('totalRows');\n      var workspaceWidth = void 0;\n      var adjusted = false;\n\n      if (_base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_BOTTOM) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n\n        // do NOT render headers on the bottom or bottom-left corner overlay\n        this.columnHeaders = [];\n        this.columnHeaderCount = 0;\n      }\n\n      if (totalColumns >= 0) {\n        // prepare COL and TH elements for rendering\n        this.adjustAvailableNodes();\n        adjusted = true;\n\n        // adjust column widths according to user widths settings\n        this.renderColumnHeaders();\n\n        // Render table rows\n        this.renderRows(totalRows, rowsToRender, columnsToRender);\n\n        if (!this.wtTable.isWorkingOnClone()) {\n          workspaceWidth = this.wot.wtViewport.getWorkspaceWidth();\n          this.wot.wtViewport.containerWidth = null;\n        }\n\n        this.adjustColumnWidths(columnsToRender);\n        this.markOversizedColumnHeaders();\n        this.adjustColumnHeaderHeights();\n      }\n\n      if (!adjusted) {\n        this.adjustAvailableNodes();\n      }\n      this.removeRedundantRows(rowsToRender);\n\n      if (!this.wtTable.isWorkingOnClone() || this.wot.isOverlayName(_base2.default.CLONE_BOTTOM)) {\n        this.markOversizedRows();\n      }\n      if (!this.wtTable.isWorkingOnClone()) {\n        this.wot.wtViewport.createVisibleCalculators();\n        this.wot.wtOverlays.refresh(false);\n\n        this.wot.wtOverlays.applyToDOM();\n\n        var hiderWidth = (0, _element.outerWidth)(this.wtTable.hider);\n        var tableWidth = (0, _element.outerWidth)(this.wtTable.TABLE);\n\n        if (hiderWidth !== 0 && tableWidth !== hiderWidth) {\n          // Recalculate the column widths, if width changes made in the overlays removed the scrollbar, thus changing the viewport width.\n          this.adjustColumnWidths(columnsToRender);\n        }\n\n        if (workspaceWidth !== this.wot.wtViewport.getWorkspaceWidth()) {\n          // workspace width changed though to shown/hidden vertical scrollbar. Let's reapply stretching\n          this.wot.wtViewport.containerWidth = null;\n\n          var firstRendered = this.wtTable.getFirstRenderedColumn();\n          var lastRendered = this.wtTable.getLastRenderedColumn();\n          var defaultColumnWidth = this.wot.getSetting('defaultColumnWidth');\n          var rowHeaderWidthSetting = this.wot.getSetting('rowHeaderWidth');\n\n          rowHeaderWidthSetting = this.instance.getSetting('onModifyRowHeaderWidth', rowHeaderWidthSetting);\n\n          if (rowHeaderWidthSetting != null) {\n            for (var i = 0; i < this.rowHeaderCount; i++) {\n              var width = Array.isArray(rowHeaderWidthSetting) ? rowHeaderWidthSetting[i] : rowHeaderWidthSetting;\n\n              width = width == null ? defaultColumnWidth : width;\n\n              this.COLGROUP.childNodes[i].style.width = width + 'px';\n            }\n          }\n\n          for (var _i = firstRendered; _i < lastRendered; _i++) {\n            var _width = this.wtTable.getStretchedColumnWidth(_i);\n            var renderedIndex = this.columnFilter.sourceToRendered(_i);\n\n            this.COLGROUP.childNodes[renderedIndex + this.rowHeaderCount].style.width = _width + 'px';\n          }\n        }\n\n        this.wot.getSetting('onDraw', true);\n      } else if (this.wot.isOverlayName(_base2.default.CLONE_BOTTOM)) {\n        this.wot.cloneSource.wtOverlays.adjustElementsSize();\n      }\n    }\n\n    /**\n     * @param {Number} renderedRowsCount\n     */\n\n  }, {\n    key: 'removeRedundantRows',\n    value: function removeRedundantRows(renderedRowsCount) {\n      while (this.wtTable.tbodyChildrenLength > renderedRowsCount) {\n        this.TBODY.removeChild(this.TBODY.lastChild);\n        this.wtTable.tbodyChildrenLength--;\n      }\n    }\n\n    /**\n     * @param {Number} totalRows\n     * @param {Number} rowsToRender\n     * @param {Number} columnsToRender\n     */\n\n  }, {\n    key: 'renderRows',\n    value: function renderRows(totalRows, rowsToRender, columnsToRender) {\n      var lastTD = void 0;\n      var TR = void 0;\n      var visibleRowIndex = 0;\n      var sourceRowIndex = this.rowFilter.renderedToSource(visibleRowIndex);\n      var isWorkingOnClone = this.wtTable.isWorkingOnClone();\n\n      while (sourceRowIndex < totalRows && sourceRowIndex >= 0) {\n        if (!performanceWarningAppeared && visibleRowIndex > 1000) {\n          performanceWarningAppeared = true;\n          (0, _console.warn)((0, _templateLiteralTag.toSingleLine)(_templateObject));\n        }\n        if (rowsToRender !== void 0 && visibleRowIndex === rowsToRender) {\n          // We have as much rows as needed for this clone\n          break;\n        }\n        TR = this.getOrCreateTrForRow(visibleRowIndex, TR);\n\n        // Render row headers\n        this.renderRowHeaders(sourceRowIndex, TR);\n        // Add and/or remove TDs to TR to match the desired number\n        this.adjustColumns(TR, columnsToRender + this.rowHeaderCount);\n\n        lastTD = this.renderCells(sourceRowIndex, TR, columnsToRender);\n\n        if (!isWorkingOnClone ||\n        // Necessary to refresh oversized row heights after editing cell in overlays\n        this.wot.isOverlayName(_base2.default.CLONE_BOTTOM)) {\n          // Reset the oversized row cache for this row\n          this.resetOversizedRow(sourceRowIndex);\n        }\n\n        if (TR.firstChild) {\n          // if I have 2 fixed columns with one-line content and the 3rd column has a multiline content, this is\n          // the way to make sure that the overlay will has same row height\n          var height = this.wot.wtTable.getRowHeight(sourceRowIndex);\n\n          if (height) {\n            // Decrease height. 1 pixel will be \"replaced\" by 1px border top\n            height--;\n            TR.firstChild.style.height = height + 'px';\n          } else {\n            TR.firstChild.style.height = '';\n          }\n        }\n        visibleRowIndex++;\n        sourceRowIndex = this.rowFilter.renderedToSource(visibleRowIndex);\n      }\n    }\n\n    /**\n     * Reset the oversized row cache for the provided index\n     *\n     * @param {Number} sourceRow Row index\n     */\n\n  }, {\n    key: 'resetOversizedRow',\n    value: function resetOversizedRow(sourceRow) {\n      if (this.wot.getSetting('externalRowCalculator')) {\n        return;\n      }\n      if (this.wot.wtViewport.oversizedRows && this.wot.wtViewport.oversizedRows[sourceRow]) {\n        this.wot.wtViewport.oversizedRows[sourceRow] = void 0;\n      }\n    }\n\n    /**\n     * Check if any of the rendered rows is higher than expected, and if so, cache them\n     */\n\n  }, {\n    key: 'markOversizedRows',\n    value: function markOversizedRows() {\n      if (this.wot.getSetting('externalRowCalculator')) {\n        return;\n      }\n      var rowCount = this.instance.wtTable.TBODY.childNodes.length;\n      var expectedTableHeight = rowCount * this.instance.wtSettings.settings.defaultRowHeight;\n      var actualTableHeight = (0, _element.innerHeight)(this.instance.wtTable.TBODY) - 1;\n      var previousRowHeight = void 0;\n      var rowInnerHeight = void 0;\n      var sourceRowIndex = void 0;\n      var currentTr = void 0;\n      var rowHeader = void 0;\n      var totalRows = this.instance.getSetting('totalRows');\n\n      if (expectedTableHeight === actualTableHeight && !this.instance.getSetting('fixedRowsBottom')) {\n        // If the actual table height equals rowCount * default single row height, no row is oversized -> no need to iterate over them\n        return;\n      }\n\n      while (rowCount) {\n        rowCount--;\n        sourceRowIndex = this.instance.wtTable.rowFilter.renderedToSource(rowCount);\n        previousRowHeight = this.instance.wtTable.getRowHeight(sourceRowIndex);\n        currentTr = this.instance.wtTable.getTrForRow(sourceRowIndex);\n        rowHeader = currentTr.querySelector('th');\n\n        if (rowHeader) {\n          rowInnerHeight = (0, _element.innerHeight)(rowHeader);\n        } else {\n          rowInnerHeight = (0, _element.innerHeight)(currentTr) - 1;\n        }\n\n        if (!previousRowHeight && this.instance.wtSettings.settings.defaultRowHeight < rowInnerHeight || previousRowHeight < rowInnerHeight) {\n          this.instance.wtViewport.oversizedRows[sourceRowIndex] = ++rowInnerHeight;\n        }\n      }\n    }\n\n    /**\n     * Check if any of the rendered columns is higher than expected, and if so, cache them.\n     */\n\n  }, {\n    key: 'markOversizedColumnHeaders',\n    value: function markOversizedColumnHeaders() {\n      var overlayName = this.wot.getOverlayName();\n\n      if (!this.columnHeaderCount || this.wot.wtViewport.hasOversizedColumnHeadersMarked[overlayName] || this.wtTable.isWorkingOnClone()) {\n        return;\n      }\n      var columnCount = this.wtTable.getRenderedColumnsCount();\n\n      for (var i = 0; i < this.columnHeaderCount; i++) {\n        for (var renderedColumnIndex = -1 * this.rowHeaderCount; renderedColumnIndex < columnCount; renderedColumnIndex++) {\n          this.markIfOversizedColumnHeader(renderedColumnIndex);\n        }\n      }\n      this.wot.wtViewport.hasOversizedColumnHeadersMarked[overlayName] = true;\n    }\n\n    /**\n     *\n     */\n\n  }, {\n    key: 'adjustColumnHeaderHeights',\n    value: function adjustColumnHeaderHeights() {\n      var columnHeaders = this.wot.getSetting('columnHeaders');\n      var children = this.wot.wtTable.THEAD.childNodes;\n      var oversizedColumnHeaders = this.wot.wtViewport.oversizedColumnHeaders;\n\n      for (var i = 0, len = columnHeaders.length; i < len; i++) {\n        if (oversizedColumnHeaders[i]) {\n          if (!children[i] || children[i].childNodes.length === 0) {\n            return;\n          }\n          children[i].childNodes[0].style.height = oversizedColumnHeaders[i] + 'px';\n        }\n      }\n    }\n\n    /**\n     * Check if column header for the specified column is higher than expected, and if so, cache it\n     *\n     * @param {Number} col Index of column\n     */\n\n  }, {\n    key: 'markIfOversizedColumnHeader',\n    value: function markIfOversizedColumnHeader(col) {\n      var sourceColIndex = this.wot.wtTable.columnFilter.renderedToSource(col);\n      var level = this.columnHeaderCount;\n      var defaultRowHeight = this.wot.wtSettings.settings.defaultRowHeight;\n      var previousColHeaderHeight = void 0;\n      var currentHeader = void 0;\n      var currentHeaderHeight = void 0;\n      var columnHeaderHeightSetting = this.wot.getSetting('columnHeaderHeight') || [];\n\n      while (level) {\n        level--;\n\n        previousColHeaderHeight = this.wot.wtTable.getColumnHeaderHeight(level);\n        currentHeader = this.wot.wtTable.getColumnHeader(sourceColIndex, level);\n\n        if (!currentHeader) {\n          /* eslint-disable no-continue */\n          continue;\n        }\n        currentHeaderHeight = (0, _element.innerHeight)(currentHeader);\n\n        if (!previousColHeaderHeight && defaultRowHeight < currentHeaderHeight || previousColHeaderHeight < currentHeaderHeight) {\n          this.wot.wtViewport.oversizedColumnHeaders[level] = currentHeaderHeight;\n        }\n\n        if (Array.isArray(columnHeaderHeightSetting)) {\n          if (columnHeaderHeightSetting[level] != null) {\n            this.wot.wtViewport.oversizedColumnHeaders[level] = columnHeaderHeightSetting[level];\n          }\n        } else if (!isNaN(columnHeaderHeightSetting)) {\n          this.wot.wtViewport.oversizedColumnHeaders[level] = columnHeaderHeightSetting;\n        }\n\n        if (this.wot.wtViewport.oversizedColumnHeaders[level] < (columnHeaderHeightSetting[level] || columnHeaderHeightSetting)) {\n          this.wot.wtViewport.oversizedColumnHeaders[level] = columnHeaderHeightSetting[level] || columnHeaderHeightSetting;\n        }\n      }\n    }\n\n    /**\n     * @param {Number} sourceRowIndex\n     * @param {HTMLTableRowElement} TR\n     * @param {Number} columnsToRender\n     * @returns {HTMLTableCellElement}\n     */\n\n  }, {\n    key: 'renderCells',\n    value: function renderCells(sourceRowIndex, TR, columnsToRender) {\n      var TD = void 0;\n      var sourceColIndex = void 0;\n\n      for (var visibleColIndex = 0; visibleColIndex < columnsToRender; visibleColIndex++) {\n        sourceColIndex = this.columnFilter.renderedToSource(visibleColIndex);\n\n        if (visibleColIndex === 0) {\n          TD = TR.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(sourceColIndex)];\n        } else {\n          TD = TD.nextSibling; // http://jsperf.com/nextsibling-vs-indexed-childnodes\n        }\n        // If the number of headers has been reduced, we need to replace excess TH with TD\n        if (TD.nodeName == 'TH') {\n          TD = replaceThWithTd(TD, TR);\n        }\n        if (!(0, _element.hasClass)(TD, 'hide')) {\n          TD.className = '';\n        }\n        TD.removeAttribute('style');\n        this.wot.wtSettings.settings.cellRenderer(sourceRowIndex, sourceColIndex, TD);\n      }\n\n      return TD;\n    }\n\n    /**\n     * @param {Number} columnsToRender Number of columns to render.\n     */\n\n  }, {\n    key: 'adjustColumnWidths',\n    value: function adjustColumnWidths(columnsToRender) {\n      var scrollbarCompensation = 0;\n      var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot;\n      var mainHolder = sourceInstance.wtTable.holder;\n      var defaultColumnWidth = this.wot.getSetting('defaultColumnWidth');\n      var rowHeaderWidthSetting = this.wot.getSetting('rowHeaderWidth');\n\n      if (mainHolder.offsetHeight < mainHolder.scrollHeight) {\n        scrollbarCompensation = (0, _element.getScrollbarWidth)();\n      }\n      this.wot.wtViewport.columnsRenderCalculator.refreshStretching(this.wot.wtViewport.getViewportWidth() - scrollbarCompensation);\n\n      rowHeaderWidthSetting = this.instance.getSetting('onModifyRowHeaderWidth', rowHeaderWidthSetting);\n\n      if (rowHeaderWidthSetting != null) {\n        for (var i = 0; i < this.rowHeaderCount; i++) {\n          var width = Array.isArray(rowHeaderWidthSetting) ? rowHeaderWidthSetting[i] : rowHeaderWidthSetting;\n\n          width = width == null ? defaultColumnWidth : width;\n\n          this.COLGROUP.childNodes[i].style.width = width + 'px';\n        }\n      }\n\n      for (var renderedColIndex = 0; renderedColIndex < columnsToRender; renderedColIndex++) {\n        var _width2 = this.wtTable.getStretchedColumnWidth(this.columnFilter.renderedToSource(renderedColIndex));\n\n        this.COLGROUP.childNodes[renderedColIndex + this.rowHeaderCount].style.width = _width2 + 'px';\n      }\n    }\n\n    /**\n     * @param {HTMLTableCellElement} TR\n     */\n\n  }, {\n    key: 'appendToTbody',\n    value: function appendToTbody(TR) {\n      this.TBODY.appendChild(TR);\n      this.wtTable.tbodyChildrenLength++;\n    }\n\n    /**\n     * @param {Number} rowIndex\n     * @param {HTMLTableRowElement} currentTr\n     * @returns {HTMLTableCellElement}\n     */\n\n  }, {\n    key: 'getOrCreateTrForRow',\n    value: function getOrCreateTrForRow(rowIndex, currentTr) {\n      var TR = void 0;\n\n      if (rowIndex >= this.wtTable.tbodyChildrenLength) {\n        TR = this.createRow();\n        this.appendToTbody(TR);\n      } else if (rowIndex === 0) {\n        TR = this.TBODY.firstChild;\n      } else {\n        // http://jsperf.com/nextsibling-vs-indexed-childnodes\n        TR = currentTr.nextSibling;\n      }\n      if (TR.className) {\n        TR.removeAttribute('class');\n      }\n\n      return TR;\n    }\n\n    /**\n     * @returns {HTMLTableCellElement}\n     */\n\n  }, {\n    key: 'createRow',\n    value: function createRow() {\n      var TR = document.createElement('TR');\n\n      for (var visibleColIndex = 0; visibleColIndex < this.rowHeaderCount; visibleColIndex++) {\n        TR.appendChild(document.createElement('TH'));\n      }\n\n      return TR;\n    }\n\n    /**\n     * @param {Number} row\n     * @param {Number} col\n     * @param {HTMLTableCellElement} TH\n     */\n\n  }, {\n    key: 'renderRowHeader',\n    value: function renderRowHeader(row, col, TH) {\n      TH.className = '';\n      TH.removeAttribute('style');\n      this.rowHeaders[col](row, TH, col);\n    }\n\n    /**\n     * @param {Number} row\n     * @param {HTMLTableCellElement} TR\n     */\n\n  }, {\n    key: 'renderRowHeaders',\n    value: function renderRowHeaders(row, TR) {\n      for (var TH = TR.firstChild, visibleColIndex = 0; visibleColIndex < this.rowHeaderCount; visibleColIndex++) {\n        // If the number of row headers increased we need to create TH or replace an existing TD node with TH\n        if (!TH) {\n          TH = document.createElement('TH');\n          TR.appendChild(TH);\n        } else if (TH.nodeName == 'TD') {\n          TH = replaceTdWithTh(TH, TR);\n        }\n        this.renderRowHeader(row, visibleColIndex, TH);\n        // http://jsperf.com/nextsibling-vs-indexed-childnodes\n        TH = TH.nextSibling;\n      }\n    }\n\n    /**\n     * Adjust the number of COL and TH elements to match the number of columns and headers that need to be rendered\n     */\n\n  }, {\n    key: 'adjustAvailableNodes',\n    value: function adjustAvailableNodes() {\n      this.adjustColGroups();\n      this.adjustThead();\n    }\n\n    /**\n     * Renders the column headers\n     */\n\n  }, {\n    key: 'renderColumnHeaders',\n    value: function renderColumnHeaders() {\n      if (!this.columnHeaderCount) {\n        return;\n      }\n      var columnCount = this.wtTable.getRenderedColumnsCount();\n\n      for (var i = 0; i < this.columnHeaderCount; i++) {\n        var TR = this.getTrForColumnHeaders(i);\n\n        for (var renderedColumnIndex = -1 * this.rowHeaderCount; renderedColumnIndex < columnCount; renderedColumnIndex++) {\n          var sourceCol = this.columnFilter.renderedToSource(renderedColumnIndex);\n\n          this.renderColumnHeader(i, sourceCol, TR.childNodes[renderedColumnIndex + this.rowHeaderCount]);\n        }\n      }\n    }\n\n    /**\n     * Adjusts the number of COL elements to match the number of columns that need to be rendered\n     */\n\n  }, {\n    key: 'adjustColGroups',\n    value: function adjustColGroups() {\n      var columnCount = this.wtTable.getRenderedColumnsCount();\n\n      while (this.wtTable.colgroupChildrenLength < columnCount + this.rowHeaderCount) {\n        this.COLGROUP.appendChild(document.createElement('COL'));\n        this.wtTable.colgroupChildrenLength++;\n      }\n      while (this.wtTable.colgroupChildrenLength > columnCount + this.rowHeaderCount) {\n        this.COLGROUP.removeChild(this.COLGROUP.lastChild);\n        this.wtTable.colgroupChildrenLength--;\n      }\n      if (this.rowHeaderCount) {\n        (0, _element.addClass)(this.COLGROUP.childNodes[0], 'rowHeader');\n      }\n    }\n\n    /**\n     * Adjusts the number of TH elements in THEAD to match the number of headers and columns that need to be rendered\n     */\n\n  }, {\n    key: 'adjustThead',\n    value: function adjustThead() {\n      var columnCount = this.wtTable.getRenderedColumnsCount();\n      var TR = this.THEAD.firstChild;\n\n      if (this.columnHeaders.length) {\n        for (var i = 0, len = this.columnHeaders.length; i < len; i++) {\n          TR = this.THEAD.childNodes[i];\n\n          if (!TR) {\n            TR = document.createElement('TR');\n            this.THEAD.appendChild(TR);\n          }\n          this.theadChildrenLength = TR.childNodes.length;\n\n          while (this.theadChildrenLength < columnCount + this.rowHeaderCount) {\n            TR.appendChild(document.createElement('TH'));\n            this.theadChildrenLength++;\n          }\n          while (this.theadChildrenLength > columnCount + this.rowHeaderCount) {\n            TR.removeChild(TR.lastChild);\n            this.theadChildrenLength--;\n          }\n        }\n        var theadChildrenLength = this.THEAD.childNodes.length;\n\n        if (theadChildrenLength > this.columnHeaders.length) {\n          for (var _i2 = this.columnHeaders.length; _i2 < theadChildrenLength; _i2++) {\n            this.THEAD.removeChild(this.THEAD.lastChild);\n          }\n        }\n      } else if (TR) {\n        (0, _element.empty)(TR);\n      }\n    }\n\n    /**\n     * @param {Number} index\n     * @returns {HTMLTableCellElement}\n     */\n\n  }, {\n    key: 'getTrForColumnHeaders',\n    value: function getTrForColumnHeaders(index) {\n      return this.THEAD.childNodes[index];\n    }\n\n    /**\n     * @param {Number} row\n     * @param {Number} col\n     * @param {HTMLTableCellElement} TH\n     * @returns {*}\n     */\n\n  }, {\n    key: 'renderColumnHeader',\n    value: function renderColumnHeader(row, col, TH) {\n      TH.className = '';\n      TH.removeAttribute('style');\n\n      return this.columnHeaders[row](col, TH, row);\n    }\n\n    /**\n     * Add and/or remove the TDs to match the desired number\n     *\n     * @param {HTMLTableCellElement} TR Table row in question\n     * @param {Number} desiredCount The desired number of TDs in the TR\n     */\n\n  }, {\n    key: 'adjustColumns',\n    value: function adjustColumns(TR, desiredCount) {\n      var count = TR.childNodes.length;\n\n      while (count < desiredCount) {\n        var TD = document.createElement('TD');\n\n        TR.appendChild(TD);\n        count++;\n      }\n      while (count > desiredCount) {\n        TR.removeChild(TR.lastChild);\n        count--;\n      }\n    }\n\n    /**\n     * @param {Number} columnsToRender\n     */\n\n  }, {\n    key: 'removeRedundantColumns',\n    value: function removeRedundantColumns(columnsToRender) {\n      while (this.wtTable.tbodyChildrenLength > columnsToRender) {\n        this.TBODY.removeChild(this.TBODY.lastChild);\n        this.wtTable.tbodyChildrenLength--;\n      }\n    }\n  }]);\n\n  return TableRenderer;\n}();\n\nfunction replaceTdWithTh(TD, TR) {\n  var TH = document.createElement('TH');\n\n  TR.insertBefore(TH, TD);\n  TR.removeChild(TD);\n\n  return TH;\n}\n\nfunction replaceThWithTd(TH, TR) {\n  var TD = document.createElement('TD');\n\n  TR.insertBefore(TD, TH);\n  TR.removeChild(TH);\n\n  return TD;\n}\n\nexports.default = TableRenderer;\n\n/***/ }),\n/* 186 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _viewportColumns = __webpack_require__(175);\n\nvar _viewportColumns2 = _interopRequireDefault(_viewportColumns);\n\nvar _viewportRows = __webpack_require__(176);\n\nvar _viewportRows2 = _interopRequireDefault(_viewportRows);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Viewport\n */\nvar Viewport = function () {\n  /**\n   * @param wotInstance\n   */\n  function Viewport(wotInstance) {\n    var _this = this;\n\n    _classCallCheck(this, Viewport);\n\n    this.wot = wotInstance;\n    // legacy support\n    this.instance = this.wot;\n\n    this.oversizedRows = [];\n    this.oversizedColumnHeaders = [];\n    this.hasOversizedColumnHeadersMarked = {};\n    this.clientHeight = 0;\n    this.containerWidth = NaN;\n    this.rowHeaderWidth = NaN;\n    this.rowsVisibleCalculator = null;\n    this.columnsVisibleCalculator = null;\n\n    this.eventManager = new _eventManager2.default(this.wot);\n    this.eventManager.addEventListener(window, 'resize', function () {\n      _this.clientHeight = _this.getWorkspaceHeight();\n    });\n  }\n\n  /**\n   * @returns {number}\n   */\n\n\n  _createClass(Viewport, [{\n    key: 'getWorkspaceHeight',\n    value: function getWorkspaceHeight() {\n      var trimmingContainer = this.instance.wtOverlays.topOverlay.trimmingContainer;\n      var elemHeight = void 0;\n      var height = 0;\n\n      if (trimmingContainer === window) {\n        height = document.documentElement.clientHeight;\n      } else {\n        elemHeight = (0, _element.outerHeight)(trimmingContainer);\n        // returns height without DIV scrollbar\n        height = elemHeight > 0 && trimmingContainer.clientHeight > 0 ? trimmingContainer.clientHeight : Infinity;\n      }\n\n      return height;\n    }\n  }, {\n    key: 'getWorkspaceWidth',\n    value: function getWorkspaceWidth() {\n      var width = void 0;\n      var totalColumns = this.wot.getSetting('totalColumns');\n      var trimmingContainer = this.instance.wtOverlays.leftOverlay.trimmingContainer;\n      var overflow = void 0;\n      var stretchSetting = this.wot.getSetting('stretchH');\n      var docOffsetWidth = document.documentElement.offsetWidth;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (preventOverflow) {\n        return (0, _element.outerWidth)(this.instance.wtTable.wtRootElement);\n      }\n\n      if (this.wot.getSetting('freezeOverlays')) {\n        width = Math.min(docOffsetWidth - this.getWorkspaceOffset().left, docOffsetWidth);\n      } else {\n        width = Math.min(this.getContainerFillWidth(), docOffsetWidth - this.getWorkspaceOffset().left, docOffsetWidth);\n      }\n\n      if (trimmingContainer === window && totalColumns > 0 && this.sumColumnWidths(0, totalColumns - 1) > width) {\n        // in case sum of column widths is higher than available stylesheet width, let's assume using the whole window\n        // otherwise continue below, which will allow stretching\n        // this is used in `scroll_window.html`\n        // TODO test me\n        return document.documentElement.clientWidth;\n      }\n\n      if (trimmingContainer !== window) {\n        overflow = (0, _element.getStyle)(this.instance.wtOverlays.leftOverlay.trimmingContainer, 'overflow');\n\n        if (overflow == 'scroll' || overflow == 'hidden' || overflow == 'auto') {\n          // this is used in `scroll.html`\n          // TODO test me\n          return Math.max(width, trimmingContainer.clientWidth);\n        }\n      }\n\n      if (stretchSetting === 'none' || !stretchSetting) {\n        // if no stretching is used, return the maximum used workspace width\n        return Math.max(width, (0, _element.outerWidth)(this.instance.wtTable.TABLE));\n      }\n\n      // if stretching is used, return the actual container width, so the columns can fit inside it\n      return width;\n    }\n\n    /**\n     * Checks if viewport has vertical scroll\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasVerticalScroll',\n    value: function hasVerticalScroll() {\n      return this.getWorkspaceActualHeight() > this.getWorkspaceHeight();\n    }\n\n    /**\n     * Checks if viewport has horizontal scroll\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasHorizontalScroll',\n    value: function hasHorizontalScroll() {\n      return this.getWorkspaceActualWidth() > this.getWorkspaceWidth();\n    }\n\n    /**\n     * @param from\n     * @param length\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'sumColumnWidths',\n    value: function sumColumnWidths(from, length) {\n      var sum = 0;\n\n      while (from < length) {\n        sum += this.wot.wtTable.getColumnWidth(from);\n        from++;\n      }\n\n      return sum;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getContainerFillWidth',\n    value: function getContainerFillWidth() {\n      if (this.containerWidth) {\n        return this.containerWidth;\n      }\n      var mainContainer = this.instance.wtTable.holder;\n      var fillWidth = void 0;\n      var dummyElement = void 0;\n\n      dummyElement = document.createElement('div');\n      dummyElement.style.width = '100%';\n      dummyElement.style.height = '1px';\n      mainContainer.appendChild(dummyElement);\n      fillWidth = dummyElement.offsetWidth;\n\n      this.containerWidth = fillWidth;\n      mainContainer.removeChild(dummyElement);\n\n      return fillWidth;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getWorkspaceOffset',\n    value: function getWorkspaceOffset() {\n      return (0, _element.offset)(this.wot.wtTable.TABLE);\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getWorkspaceActualHeight',\n    value: function getWorkspaceActualHeight() {\n      return (0, _element.outerHeight)(this.wot.wtTable.TABLE);\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getWorkspaceActualWidth',\n    value: function getWorkspaceActualWidth() {\n      return (0, _element.outerWidth)(this.wot.wtTable.TABLE) || (0, _element.outerWidth)(this.wot.wtTable.TBODY) || (0, _element.outerWidth)(this.wot.wtTable.THEAD); // IE8 reports 0 as <table> offsetWidth;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getColumnHeaderHeight',\n    value: function getColumnHeaderHeight() {\n      if (isNaN(this.columnHeaderHeight)) {\n        this.columnHeaderHeight = (0, _element.outerHeight)(this.wot.wtTable.THEAD);\n      }\n\n      return this.columnHeaderHeight;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getViewportHeight',\n    value: function getViewportHeight() {\n      var containerHeight = this.getWorkspaceHeight();\n      var columnHeaderHeight = void 0;\n\n      if (containerHeight === Infinity) {\n        return containerHeight;\n      }\n      columnHeaderHeight = this.getColumnHeaderHeight();\n\n      if (columnHeaderHeight > 0) {\n        containerHeight -= columnHeaderHeight;\n      }\n\n      return containerHeight;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getRowHeaderWidth',\n    value: function getRowHeaderWidth() {\n      var rowHeadersHeightSetting = this.instance.getSetting('rowHeaderWidth');\n      var rowHeaders = this.instance.getSetting('rowHeaders');\n\n      if (rowHeadersHeightSetting) {\n        this.rowHeaderWidth = 0;\n\n        for (var i = 0, len = rowHeaders.length; i < len; i++) {\n          this.rowHeaderWidth += rowHeadersHeightSetting[i] || rowHeadersHeightSetting;\n        }\n      }\n\n      if (this.wot.cloneSource) {\n        return this.wot.cloneSource.wtViewport.getRowHeaderWidth();\n      }\n\n      if (isNaN(this.rowHeaderWidth)) {\n\n        if (rowHeaders.length) {\n          var TH = this.instance.wtTable.TABLE.querySelector('TH');\n          this.rowHeaderWidth = 0;\n\n          for (var _i = 0, _len = rowHeaders.length; _i < _len; _i++) {\n            if (TH) {\n              this.rowHeaderWidth += (0, _element.outerWidth)(TH);\n              TH = TH.nextSibling;\n            } else {\n              // yes this is a cheat but it worked like that before, just taking assumption from CSS instead of measuring.\n              // TODO: proper fix\n              this.rowHeaderWidth += 50;\n            }\n          }\n        } else {\n          this.rowHeaderWidth = 0;\n        }\n      }\n\n      this.rowHeaderWidth = this.instance.getSetting('onModifyRowHeaderWidth', this.rowHeaderWidth) || this.rowHeaderWidth;\n\n      return this.rowHeaderWidth;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getViewportWidth',\n    value: function getViewportWidth() {\n      var containerWidth = this.getWorkspaceWidth();\n      var rowHeaderWidth = void 0;\n\n      if (containerWidth === Infinity) {\n        return containerWidth;\n      }\n      rowHeaderWidth = this.getRowHeaderWidth();\n\n      if (rowHeaderWidth > 0) {\n        return containerWidth - rowHeaderWidth;\n      }\n\n      return containerWidth;\n    }\n\n    /**\n     * Creates:\n     *  - rowsRenderCalculator (before draw, to qualify rows for rendering)\n     *  - rowsVisibleCalculator (after draw, to measure which rows are actually visible)\n     *\n     * @returns {ViewportRowsCalculator}\n     */\n\n  }, {\n    key: 'createRowsCalculator',\n    value: function createRowsCalculator() {\n      var _this2 = this;\n\n      var visible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      var height = void 0;\n      var pos = void 0;\n      var fixedRowsTop = void 0;\n      var scrollbarHeight = void 0;\n      var fixedRowsBottom = void 0;\n      var fixedRowsHeight = void 0;\n      var totalRows = void 0;\n\n      this.rowHeaderWidth = NaN;\n\n      if (this.wot.wtSettings.settings.renderAllRows && !visible) {\n        height = Infinity;\n      } else {\n        height = this.getViewportHeight();\n      }\n      pos = this.wot.wtOverlays.topOverlay.getScrollPosition() - this.wot.wtOverlays.topOverlay.getTableParentOffset();\n\n      if (pos < 0) {\n        pos = 0;\n      }\n      fixedRowsTop = this.wot.getSetting('fixedRowsTop');\n      fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');\n      totalRows = this.wot.getSetting('totalRows');\n\n      if (fixedRowsTop) {\n        fixedRowsHeight = this.wot.wtOverlays.topOverlay.sumCellSizes(0, fixedRowsTop);\n        pos += fixedRowsHeight;\n        height -= fixedRowsHeight;\n      }\n\n      if (fixedRowsBottom && this.wot.wtOverlays.bottomOverlay.clone) {\n        fixedRowsHeight = this.wot.wtOverlays.bottomOverlay.sumCellSizes(totalRows - fixedRowsBottom, totalRows);\n\n        height -= fixedRowsHeight;\n      }\n\n      if (this.wot.wtTable.holder.clientHeight === this.wot.wtTable.holder.offsetHeight) {\n        scrollbarHeight = 0;\n      } else {\n        scrollbarHeight = (0, _element.getScrollbarWidth)();\n      }\n\n      return new _viewportRows2.default(height, pos, this.wot.getSetting('totalRows'), function (sourceRow) {\n        return _this2.wot.wtTable.getRowHeight(sourceRow);\n      }, visible ? null : this.wot.wtSettings.settings.viewportRowCalculatorOverride, visible, scrollbarHeight);\n    }\n\n    /**\n     * Creates:\n     *  - columnsRenderCalculator (before draw, to qualify columns for rendering)\n     *  - columnsVisibleCalculator (after draw, to measure which columns are actually visible)\n     *\n     * @returns {ViewportRowsCalculator}\n     */\n\n  }, {\n    key: 'createColumnsCalculator',\n    value: function createColumnsCalculator() {\n      var _this3 = this;\n\n      var visible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      var width = this.getViewportWidth();\n      var pos = void 0;\n      var fixedColumnsLeft = void 0;\n\n      this.columnHeaderHeight = NaN;\n\n      pos = this.wot.wtOverlays.leftOverlay.getScrollPosition() - this.wot.wtOverlays.leftOverlay.getTableParentOffset();\n\n      if (pos < 0) {\n        pos = 0;\n      }\n      fixedColumnsLeft = this.wot.getSetting('fixedColumnsLeft');\n\n      if (fixedColumnsLeft) {\n        var fixedColumnsWidth = this.wot.wtOverlays.leftOverlay.sumCellSizes(0, fixedColumnsLeft);\n        pos += fixedColumnsWidth;\n        width -= fixedColumnsWidth;\n      }\n      if (this.wot.wtTable.holder.clientWidth !== this.wot.wtTable.holder.offsetWidth) {\n        width -= (0, _element.getScrollbarWidth)();\n      }\n\n      return new _viewportColumns2.default(width, pos, this.wot.getSetting('totalColumns'), function (sourceCol) {\n        return _this3.wot.wtTable.getColumnWidth(sourceCol);\n      }, visible ? null : this.wot.wtSettings.settings.viewportColumnCalculatorOverride, visible, this.wot.getSetting('stretchH'), function (stretchedWidth, column) {\n        return _this3.wot.getSetting('onBeforeStretchingColumnWidth', stretchedWidth, column);\n      });\n    }\n\n    /**\n     * Creates rowsRenderCalculator and columnsRenderCalculator (before draw, to determine what rows and\n     * cols should be rendered)\n     *\n     * @param fastDraw {Boolean} If `true`, will try to avoid full redraw and only update the border positions.\n     *                           If `false` or `undefined`, will perform a full redraw\n     * @returns fastDraw {Boolean} The fastDraw value, possibly modified\n     */\n\n  }, {\n    key: 'createRenderCalculators',\n    value: function createRenderCalculators() {\n      var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (fastDraw) {\n        var proposedRowsVisibleCalculator = this.createRowsCalculator(true);\n        var proposedColumnsVisibleCalculator = this.createColumnsCalculator(true);\n\n        if (!(this.areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator) && this.areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator))) {\n          fastDraw = false;\n        }\n      }\n\n      if (!fastDraw) {\n        this.rowsRenderCalculator = this.createRowsCalculator();\n        this.columnsRenderCalculator = this.createColumnsCalculator();\n      }\n      // delete temporarily to make sure that renderers always use rowsRenderCalculator, not rowsVisibleCalculator\n      this.rowsVisibleCalculator = null;\n      this.columnsVisibleCalculator = null;\n\n      return fastDraw;\n    }\n\n    /**\n     * Creates rowsVisibleCalculator and columnsVisibleCalculator (after draw, to determine what are\n     * the actually visible rows and columns)\n     */\n\n  }, {\n    key: 'createVisibleCalculators',\n    value: function createVisibleCalculators() {\n      this.rowsVisibleCalculator = this.createRowsCalculator(true);\n      this.columnsVisibleCalculator = this.createColumnsCalculator(true);\n    }\n\n    /**\n     * Returns information whether proposedRowsVisibleCalculator viewport\n     * is contained inside rows rendered in previous draw (cached in rowsRenderCalculator)\n     *\n     * @param {Object} proposedRowsVisibleCalculator\n     * @returns {Boolean} Returns `true` if all proposed visible rows are already rendered (meaning: redraw is not needed).\n     *                    Returns `false` if at least one proposed visible row is not already rendered (meaning: redraw is needed)\n     */\n\n  }, {\n    key: 'areAllProposedVisibleRowsAlreadyRendered',\n    value: function areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator) {\n      if (this.rowsVisibleCalculator) {\n        if (proposedRowsVisibleCalculator.startRow < this.rowsRenderCalculator.startRow || proposedRowsVisibleCalculator.startRow === this.rowsRenderCalculator.startRow && proposedRowsVisibleCalculator.startRow > 0) {\n          return false;\n        } else if (proposedRowsVisibleCalculator.endRow > this.rowsRenderCalculator.endRow || proposedRowsVisibleCalculator.endRow === this.rowsRenderCalculator.endRow && proposedRowsVisibleCalculator.endRow < this.wot.getSetting('totalRows') - 1) {\n          return false;\n        }\n        return true;\n      }\n\n      return false;\n    }\n\n    /**\n     * Returns information whether proposedColumnsVisibleCalculator viewport\n     * is contained inside column rendered in previous draw (cached in columnsRenderCalculator)\n     *\n     * @param {Object} proposedColumnsVisibleCalculator\n     * @returns {Boolean} Returns `true` if all proposed visible columns are already rendered (meaning: redraw is not needed).\n     *                    Returns `false` if at least one proposed visible column is not already rendered (meaning: redraw is needed)\n     */\n\n  }, {\n    key: 'areAllProposedVisibleColumnsAlreadyRendered',\n    value: function areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator) {\n      if (this.columnsVisibleCalculator) {\n        if (proposedColumnsVisibleCalculator.startColumn < this.columnsRenderCalculator.startColumn || proposedColumnsVisibleCalculator.startColumn === this.columnsRenderCalculator.startColumn && proposedColumnsVisibleCalculator.startColumn > 0) {\n          return false;\n        } else if (proposedColumnsVisibleCalculator.endColumn > this.columnsRenderCalculator.endColumn || proposedColumnsVisibleCalculator.endColumn === this.columnsRenderCalculator.endColumn && proposedColumnsVisibleCalculator.endColumn < this.wot.getSetting('totalColumns') - 1) {\n          return false;\n        }\n        return true;\n      }\n\n      return false;\n    }\n\n    /**\n     * Resets values in keys of the hasOversizedColumnHeadersMarked object after updateSettings.\n     */\n\n  }, {\n    key: 'resetHasOversizedColumnHeadersMarked',\n    value: function resetHasOversizedColumnHeadersMarked() {\n      (0, _object.objectEach)(this.hasOversizedColumnHeadersMarked, function (value, key, object) {\n        object[key] = void 0;\n      });\n    }\n  }]);\n\n  return Viewport;\n}();\n\nexports.default = Viewport;\n\n/***/ }),\n/* 187 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _event = __webpack_require__(12);\n\nvar _object = __webpack_require__(2);\n\nvar _browser = __webpack_require__(27);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _coords = __webpack_require__(54);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n *\n */\nvar Border = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   * @param {Object} settings\n   */\n  function Border(wotInstance, settings) {\n    _classCallCheck(this, Border);\n\n    if (!settings) {\n      return;\n    }\n    this.eventManager = new _eventManager2.default(wotInstance);\n    this.instance = wotInstance;\n    this.wot = wotInstance;\n    this.settings = settings;\n    this.mouseDown = false;\n    this.main = null;\n\n    this.top = null;\n    this.left = null;\n    this.bottom = null;\n    this.right = null;\n\n    this.topStyle = null;\n    this.leftStyle = null;\n    this.bottomStyle = null;\n    this.rightStyle = null;\n\n    this.cornerDefaultStyle = {\n      width: '6px',\n      height: '6px',\n      borderWidth: '1px',\n      borderStyle: 'solid',\n      borderColor: '#FFF'\n    };\n    this.corner = null;\n    this.cornerStyle = null;\n\n    this.createBorders(settings);\n    this.registerListeners();\n  }\n\n  /**\n   * Register all necessary events\n   */\n\n\n  _createClass(Border, [{\n    key: 'registerListeners',\n    value: function registerListeners() {\n      var _this2 = this;\n\n      this.eventManager.addEventListener(document.body, 'mousedown', function () {\n        return _this2.onMouseDown();\n      });\n      this.eventManager.addEventListener(document.body, 'mouseup', function () {\n        return _this2.onMouseUp();\n      });\n\n      var _loop = function _loop(c, len) {\n        _this2.eventManager.addEventListener(_this2.main.childNodes[c], 'mouseenter', function (event) {\n          return _this2.onMouseEnter(event, _this2.main.childNodes[c]);\n        });\n      };\n\n      for (var c = 0, len = this.main.childNodes.length; c < len; c++) {\n        _loop(c, len);\n      }\n    }\n\n    /**\n     * Mouse down listener\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseDown',\n    value: function onMouseDown() {\n      this.mouseDown = true;\n    }\n\n    /**\n     * Mouse up listener\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      this.mouseDown = false;\n    }\n\n    /**\n     * Mouse enter listener for fragment selection functionality.\n     *\n     * @private\n     * @param {Event} event Dom event\n     * @param {HTMLElement} parentElement Part of border element.\n     */\n\n  }, {\n    key: 'onMouseEnter',\n    value: function onMouseEnter(event, parentElement) {\n      if (!this.mouseDown || !this.wot.getSetting('hideBorderOnMouseDownOver')) {\n        return;\n      }\n      event.preventDefault();\n      (0, _event.stopImmediatePropagation)(event);\n\n      var _this = this;\n      var bounds = parentElement.getBoundingClientRect();\n      // Hide border to prevents selection jumping when fragmentSelection is enabled.\n      parentElement.style.display = 'none';\n\n      function isOutside(event) {\n        if (event.clientY < Math.floor(bounds.top)) {\n          return true;\n        }\n        if (event.clientY > Math.ceil(bounds.top + bounds.height)) {\n          return true;\n        }\n        if (event.clientX < Math.floor(bounds.left)) {\n          return true;\n        }\n        if (event.clientX > Math.ceil(bounds.left + bounds.width)) {\n          return true;\n        }\n      }\n\n      function handler(event) {\n        if (isOutside(event)) {\n          _this.eventManager.removeEventListener(document.body, 'mousemove', handler);\n          parentElement.style.display = 'block';\n        }\n      }\n\n      this.eventManager.addEventListener(document.body, 'mousemove', handler);\n    }\n\n    /**\n     * Create border elements\n     *\n     * @param {Object} settings\n     */\n\n  }, {\n    key: 'createBorders',\n    value: function createBorders(settings) {\n      this.main = document.createElement('div');\n\n      var borderDivs = ['top', 'left', 'bottom', 'right', 'corner'];\n      var style = this.main.style;\n      style.position = 'absolute';\n      style.top = 0;\n      style.left = 0;\n\n      for (var i = 0; i < 5; i++) {\n        var position = borderDivs[i];\n        var div = document.createElement('div');\n        div.className = 'wtBorder ' + (this.settings.className || ''); // + borderDivs[i];\n\n        if (this.settings[position] && this.settings[position].hide) {\n          div.className += ' hidden';\n        }\n        style = div.style;\n        style.backgroundColor = this.settings[position] && this.settings[position].color ? this.settings[position].color : settings.border.color;\n        style.height = this.settings[position] && this.settings[position].width ? this.settings[position].width + 'px' : settings.border.width + 'px';\n        style.width = this.settings[position] && this.settings[position].width ? this.settings[position].width + 'px' : settings.border.width + 'px';\n\n        this.main.appendChild(div);\n      }\n      this.top = this.main.childNodes[0];\n      this.left = this.main.childNodes[1];\n      this.bottom = this.main.childNodes[2];\n      this.right = this.main.childNodes[3];\n\n      this.topStyle = this.top.style;\n      this.leftStyle = this.left.style;\n      this.bottomStyle = this.bottom.style;\n      this.rightStyle = this.right.style;\n\n      this.corner = this.main.childNodes[4];\n      this.corner.className += ' corner';\n      this.cornerStyle = this.corner.style;\n      this.cornerStyle.width = this.cornerDefaultStyle.width;\n      this.cornerStyle.height = this.cornerDefaultStyle.height;\n      this.cornerStyle.border = [this.cornerDefaultStyle.borderWidth, this.cornerDefaultStyle.borderStyle, this.cornerDefaultStyle.borderColor].join(' ');\n\n      if ((0, _browser.isMobileBrowser)()) {\n        this.createMultipleSelectorHandles();\n      }\n      this.disappear();\n\n      if (!this.wot.wtTable.bordersHolder) {\n        this.wot.wtTable.bordersHolder = document.createElement('div');\n        this.wot.wtTable.bordersHolder.className = 'htBorders';\n        this.wot.wtTable.spreader.appendChild(this.wot.wtTable.bordersHolder);\n      }\n      this.wot.wtTable.bordersHolder.insertBefore(this.main, this.wot.wtTable.bordersHolder.firstChild);\n    }\n\n    /**\n     * Create multiple selector handler for mobile devices\n     */\n\n  }, {\n    key: 'createMultipleSelectorHandles',\n    value: function createMultipleSelectorHandles() {\n      this.selectionHandles = {\n        topLeft: document.createElement('DIV'),\n        topLeftHitArea: document.createElement('DIV'),\n        bottomRight: document.createElement('DIV'),\n        bottomRightHitArea: document.createElement('DIV')\n      };\n      var width = 10;\n      var hitAreaWidth = 40;\n\n      this.selectionHandles.topLeft.className = 'topLeftSelectionHandle';\n      this.selectionHandles.topLeftHitArea.className = 'topLeftSelectionHandle-HitArea';\n      this.selectionHandles.bottomRight.className = 'bottomRightSelectionHandle';\n      this.selectionHandles.bottomRightHitArea.className = 'bottomRightSelectionHandle-HitArea';\n\n      this.selectionHandles.styles = {\n        topLeft: this.selectionHandles.topLeft.style,\n        topLeftHitArea: this.selectionHandles.topLeftHitArea.style,\n        bottomRight: this.selectionHandles.bottomRight.style,\n        bottomRightHitArea: this.selectionHandles.bottomRightHitArea.style\n      };\n\n      var hitAreaStyle = {\n        position: 'absolute',\n        height: hitAreaWidth + 'px',\n        width: hitAreaWidth + 'px',\n        'border-radius': parseInt(hitAreaWidth / 1.5, 10) + 'px'\n      };\n\n      for (var prop in hitAreaStyle) {\n        if ((0, _object.hasOwnProperty)(hitAreaStyle, prop)) {\n          this.selectionHandles.styles.bottomRightHitArea[prop] = hitAreaStyle[prop];\n          this.selectionHandles.styles.topLeftHitArea[prop] = hitAreaStyle[prop];\n        }\n      }\n\n      var handleStyle = {\n        position: 'absolute',\n        height: width + 'px',\n        width: width + 'px',\n        'border-radius': parseInt(width / 1.5, 10) + 'px',\n        background: '#F5F5FF',\n        border: '1px solid #4285c8'\n      };\n\n      for (var _prop in handleStyle) {\n        if ((0, _object.hasOwnProperty)(handleStyle, _prop)) {\n          this.selectionHandles.styles.bottomRight[_prop] = handleStyle[_prop];\n          this.selectionHandles.styles.topLeft[_prop] = handleStyle[_prop];\n        }\n      }\n      this.main.appendChild(this.selectionHandles.topLeft);\n      this.main.appendChild(this.selectionHandles.bottomRight);\n      this.main.appendChild(this.selectionHandles.topLeftHitArea);\n      this.main.appendChild(this.selectionHandles.bottomRightHitArea);\n    }\n  }, {\n    key: 'isPartRange',\n    value: function isPartRange(row, col) {\n      var areaSelection = this.wot.selections.createOrGetArea();\n\n      if (areaSelection.cellRange) {\n        if (row != areaSelection.cellRange.to.row || col != areaSelection.cellRange.to.col) {\n          return true;\n        }\n      }\n\n      return false;\n    }\n  }, {\n    key: 'updateMultipleSelectionHandlesPosition',\n    value: function updateMultipleSelectionHandlesPosition(row, col, top, left, width, height) {\n      var handleWidth = parseInt(this.selectionHandles.styles.topLeft.width, 10);\n      var hitAreaWidth = parseInt(this.selectionHandles.styles.topLeftHitArea.width, 10);\n\n      this.selectionHandles.styles.topLeft.top = parseInt(top - handleWidth, 10) + 'px';\n      this.selectionHandles.styles.topLeft.left = parseInt(left - handleWidth, 10) + 'px';\n\n      this.selectionHandles.styles.topLeftHitArea.top = parseInt(top - hitAreaWidth / 4 * 3, 10) + 'px';\n      this.selectionHandles.styles.topLeftHitArea.left = parseInt(left - hitAreaWidth / 4 * 3, 10) + 'px';\n\n      this.selectionHandles.styles.bottomRight.top = parseInt(top + height, 10) + 'px';\n      this.selectionHandles.styles.bottomRight.left = parseInt(left + width, 10) + 'px';\n\n      this.selectionHandles.styles.bottomRightHitArea.top = parseInt(top + height - hitAreaWidth / 4, 10) + 'px';\n      this.selectionHandles.styles.bottomRightHitArea.left = parseInt(left + width - hitAreaWidth / 4, 10) + 'px';\n\n      if (this.settings.border.cornerVisible && this.settings.border.cornerVisible()) {\n        this.selectionHandles.styles.topLeft.display = 'block';\n        this.selectionHandles.styles.topLeftHitArea.display = 'block';\n\n        if (this.isPartRange(row, col)) {\n          this.selectionHandles.styles.bottomRight.display = 'none';\n          this.selectionHandles.styles.bottomRightHitArea.display = 'none';\n        } else {\n          this.selectionHandles.styles.bottomRight.display = 'block';\n          this.selectionHandles.styles.bottomRightHitArea.display = 'block';\n        }\n      } else {\n        this.selectionHandles.styles.topLeft.display = 'none';\n        this.selectionHandles.styles.bottomRight.display = 'none';\n        this.selectionHandles.styles.topLeftHitArea.display = 'none';\n        this.selectionHandles.styles.bottomRightHitArea.display = 'none';\n      }\n\n      if (row == this.wot.wtSettings.getSetting('fixedRowsTop') || col == this.wot.wtSettings.getSetting('fixedColumnsLeft')) {\n        this.selectionHandles.styles.topLeft.zIndex = '9999';\n        this.selectionHandles.styles.topLeftHitArea.zIndex = '9999';\n      } else {\n        this.selectionHandles.styles.topLeft.zIndex = '';\n        this.selectionHandles.styles.topLeftHitArea.zIndex = '';\n      }\n    }\n\n    /**\n     * Show border around one or many cells\n     *\n     * @param {Array} corners\n     */\n\n  }, {\n    key: 'appear',\n    value: function appear(corners) {\n      if (this.disabled) {\n        return;\n      }\n\n      var fromRow = void 0;\n      var toRow = void 0;\n      var fromColumn = void 0;\n      var toColumn = void 0;\n\n      var rowsCount = this.wot.wtTable.getRenderedRowsCount();\n\n      for (var i = 0; i < rowsCount; i += 1) {\n        var s = this.wot.wtTable.rowFilter.renderedToSource(i);\n\n        if (s >= corners[0] && s <= corners[2]) {\n          fromRow = s;\n          break;\n        }\n      }\n\n      for (var _i = rowsCount - 1; _i >= 0; _i -= 1) {\n        var _s = this.wot.wtTable.rowFilter.renderedToSource(_i);\n\n        if (_s >= corners[0] && _s <= corners[2]) {\n          toRow = _s;\n          break;\n        }\n      }\n\n      var columnsCount = this.wot.wtTable.getRenderedColumnsCount();\n\n      for (var _i2 = 0; _i2 < columnsCount; _i2 += 1) {\n        var _s2 = this.wot.wtTable.columnFilter.renderedToSource(_i2);\n\n        if (_s2 >= corners[1] && _s2 <= corners[3]) {\n          fromColumn = _s2;\n          break;\n        }\n      }\n\n      for (var _i3 = columnsCount - 1; _i3 >= 0; _i3 -= 1) {\n        var _s3 = this.wot.wtTable.columnFilter.renderedToSource(_i3);\n\n        if (_s3 >= corners[1] && _s3 <= corners[3]) {\n          toColumn = _s3;\n          break;\n        }\n      }\n      if (fromRow === void 0 || fromColumn === void 0) {\n        this.disappear();\n\n        return;\n      }\n      var fromTD = this.wot.wtTable.getCell(new _coords2.default(fromRow, fromColumn));\n      var isMultiple = fromRow !== toRow || fromColumn !== toColumn;\n      var toTD = isMultiple ? this.wot.wtTable.getCell(new _coords2.default(toRow, toColumn)) : fromTD;\n      var fromOffset = (0, _element.offset)(fromTD);\n      var toOffset = isMultiple ? (0, _element.offset)(toTD) : fromOffset;\n      var containerOffset = (0, _element.offset)(this.wot.wtTable.TABLE);\n      var minTop = fromOffset.top;\n      var minLeft = fromOffset.left;\n\n      var left = minLeft - containerOffset.left - 1;\n      var width = toOffset.left + (0, _element.outerWidth)(toTD) - minLeft;\n\n      if (this.isEntireColumnSelected(fromRow, toRow)) {\n        var modifiedValues = this.getDimensionsFromHeader('columns', fromColumn, toColumn, containerOffset);\n        var fromTH = null;\n\n        if (modifiedValues) {\n          var _modifiedValues = _slicedToArray(modifiedValues, 3);\n\n          fromTH = _modifiedValues[0];\n          left = _modifiedValues[1];\n          width = _modifiedValues[2];\n        }\n\n        if (fromTH) {\n          fromTD = fromTH;\n        }\n      }\n\n      var top = minTop - containerOffset.top - 1;\n      var height = toOffset.top + (0, _element.outerHeight)(toTD) - minTop;\n\n      if (this.isEntireRowSelected(fromColumn, toColumn)) {\n        var _modifiedValues2 = this.getDimensionsFromHeader('rows', fromRow, toRow, containerOffset);\n        var _fromTH = null;\n\n        if (_modifiedValues2) {\n          var _modifiedValues3 = _slicedToArray(_modifiedValues2, 3);\n\n          _fromTH = _modifiedValues3[0];\n          top = _modifiedValues3[1];\n          height = _modifiedValues3[2];\n        }\n\n        if (_fromTH) {\n          fromTD = _fromTH;\n        }\n      }\n\n      var style = (0, _element.getComputedStyle)(fromTD);\n\n      if (parseInt(style.borderTopWidth, 10) > 0) {\n        top += 1;\n        height = height > 0 ? height - 1 : 0;\n      }\n      if (parseInt(style.borderLeftWidth, 10) > 0) {\n        left += 1;\n        width = width > 0 ? width - 1 : 0;\n      }\n\n      this.topStyle.top = top + 'px';\n      this.topStyle.left = left + 'px';\n      this.topStyle.width = width + 'px';\n      this.topStyle.display = 'block';\n\n      this.leftStyle.top = top + 'px';\n      this.leftStyle.left = left + 'px';\n      this.leftStyle.height = height + 'px';\n      this.leftStyle.display = 'block';\n\n      var delta = Math.floor(this.settings.border.width / 2);\n\n      this.bottomStyle.top = top + height - delta + 'px';\n      this.bottomStyle.left = left + 'px';\n      this.bottomStyle.width = width + 'px';\n      this.bottomStyle.display = 'block';\n\n      this.rightStyle.top = top + 'px';\n      this.rightStyle.left = left + width - delta + 'px';\n      this.rightStyle.height = height + 1 + 'px';\n      this.rightStyle.display = 'block';\n\n      var cornerVisibleSetting = this.settings.border.cornerVisible;\n      cornerVisibleSetting = typeof cornerVisibleSetting === 'function' ? cornerVisibleSetting(this.settings.layerLevel) : cornerVisibleSetting;\n\n      var hookResult = this.wot.getSetting('onModifyGetCellCoords', toRow, toColumn);\n      var checkRow = toRow,\n          checkCol = toColumn;\n\n\n      if (hookResult && Array.isArray(hookResult)) {\n        var _hookResult = _slicedToArray(hookResult, 4);\n\n        checkRow = _hookResult[2];\n        checkCol = _hookResult[3];\n      }\n\n      if ((0, _browser.isMobileBrowser)() || !cornerVisibleSetting || this.isPartRange(checkRow, checkCol)) {\n        this.cornerStyle.display = 'none';\n      } else {\n        this.cornerStyle.top = top + height - 4 + 'px';\n        this.cornerStyle.left = left + width - 4 + 'px';\n        this.cornerStyle.borderRightWidth = this.cornerDefaultStyle.borderWidth;\n        this.cornerStyle.width = this.cornerDefaultStyle.width;\n\n        // Hide the fill handle, so the possible further adjustments won't force unneeded scrollbars.\n        this.cornerStyle.display = 'none';\n\n        var trimmingContainer = (0, _element.getTrimmingContainer)(this.wot.wtTable.TABLE);\n\n        if (toColumn === this.wot.getSetting('totalColumns') - 1) {\n          var cornerOverlappingContainer = toTD.offsetLeft + (0, _element.outerWidth)(toTD) + parseInt(this.cornerDefaultStyle.width, 10) / 2 >= (0, _element.innerWidth)(trimmingContainer);\n\n          if (cornerOverlappingContainer) {\n            this.cornerStyle.left = Math.floor(left + width - 3 - parseInt(this.cornerDefaultStyle.width, 10) / 2) + 'px';\n            this.cornerStyle.borderRightWidth = 0;\n          }\n        }\n\n        if (toRow === this.wot.getSetting('totalRows') - 1) {\n          var _cornerOverlappingContainer = toTD.offsetTop + (0, _element.outerHeight)(toTD) + parseInt(this.cornerDefaultStyle.height, 10) / 2 >= (0, _element.innerHeight)(trimmingContainer);\n\n          if (_cornerOverlappingContainer) {\n            this.cornerStyle.top = Math.floor(top + height - 3 - parseInt(this.cornerDefaultStyle.height, 10) / 2) + 'px';\n            this.cornerStyle.borderBottomWidth = 0;\n          }\n        }\n\n        this.cornerStyle.display = 'block';\n      }\n\n      if ((0, _browser.isMobileBrowser)()) {\n        this.updateMultipleSelectionHandlesPosition(toRow, toColumn, top, left, width, height);\n      }\n    }\n\n    /**\n     * Check whether an entire column of cells is selected.\n     *\n     * @private\n     * @param {Number} startRowIndex Start row index.\n     * @param {Number} endRowIndex End row index.\n     */\n\n  }, {\n    key: 'isEntireColumnSelected',\n    value: function isEntireColumnSelected(startRowIndex, endRowIndex) {\n      return startRowIndex === this.wot.wtTable.getFirstRenderedRow() && endRowIndex === this.wot.wtTable.getLastRenderedRow();\n    }\n\n    /**\n     * Check whether an entire row of cells is selected.\n     *\n     * @private\n     * @param {Number} startColumnIndex Start column index.\n     * @param {Number} endColumnIndex End column index.\n     */\n\n  }, {\n    key: 'isEntireRowSelected',\n    value: function isEntireRowSelected(startColumnIndex, endColumnIndex) {\n      return startColumnIndex === this.wot.wtTable.getFirstRenderedColumn() && endColumnIndex === this.wot.wtTable.getLastRenderedColumn();\n    }\n\n    /**\n     * Get left/top index and width/height depending on the `direction` provided.\n     *\n     * @private\n     * @param {String} direction `rows` or `columns`, defines if an entire column or row is selected.\n     * @param {Number} fromIndex Start index of the selection.\n     * @param {Number} toIndex End index of the selection.\n     * @param {Number} containerOffset offset of the container.\n     * @return {Array|Boolean} Returns an array of [headerElement, left, width] or [headerElement, top, height], depending on `direction` (`false` in case of an error getting the headers).\n     */\n\n  }, {\n    key: 'getDimensionsFromHeader',\n    value: function getDimensionsFromHeader(direction, fromIndex, toIndex, containerOffset) {\n      var _this3 = this;\n\n      var rootHotElement = this.wot.wtTable.wtRootElement.parentNode;\n      var getHeaderFn = null;\n      var dimensionFn = null;\n      var entireSelectionClassname = null;\n      var index = null;\n      var dimension = null;\n      var dimensionProperty = null;\n      var startHeader = null;\n      var endHeader = null;\n\n      switch (direction) {\n        case 'rows':\n          getHeaderFn = function getHeaderFn() {\n            var _wot$wtTable;\n\n            return (_wot$wtTable = _this3.wot.wtTable).getRowHeader.apply(_wot$wtTable, arguments);\n          };\n          dimensionFn = function dimensionFn() {\n            return _element.outerHeight.apply(undefined, arguments);\n          };\n          entireSelectionClassname = 'ht__selection--rows';\n          dimensionProperty = 'top';\n\n          break;\n\n        case 'columns':\n          getHeaderFn = function getHeaderFn() {\n            var _wot$wtTable2;\n\n            return (_wot$wtTable2 = _this3.wot.wtTable).getColumnHeader.apply(_wot$wtTable2, arguments);\n          };\n          dimensionFn = function dimensionFn() {\n            return _element.outerWidth.apply(undefined, arguments);\n          };\n          entireSelectionClassname = 'ht__selection--columns';\n          dimensionProperty = 'left';\n          break;\n        default:\n      }\n\n      if (rootHotElement.className.includes(entireSelectionClassname)) {\n        var columnHeaderLevelCount = this.wot.getSetting('columnHeaders').length;\n\n        startHeader = getHeaderFn(fromIndex, columnHeaderLevelCount - 1);\n        endHeader = getHeaderFn(toIndex, columnHeaderLevelCount - 1);\n\n        if (!startHeader || !endHeader) {\n          return false;\n        }\n\n        var startHeaderOffset = (0, _element.offset)(startHeader);\n        var endOffset = (0, _element.offset)(endHeader);\n\n        if (startHeader && endHeader) {\n          index = startHeaderOffset[dimensionProperty] - containerOffset[dimensionProperty] - 1;\n          dimension = endOffset[dimensionProperty] + dimensionFn(endHeader) - startHeaderOffset[dimensionProperty];\n        }\n\n        return [startHeader, index, dimension];\n      }\n\n      return false;\n    }\n\n    /**\n     * Hide border\n     */\n\n  }, {\n    key: 'disappear',\n    value: function disappear() {\n      this.topStyle.display = 'none';\n      this.leftStyle.display = 'none';\n      this.bottomStyle.display = 'none';\n      this.rightStyle.display = 'none';\n      this.cornerStyle.display = 'none';\n\n      if ((0, _browser.isMobileBrowser)()) {\n        this.selectionHandles.styles.topLeft.display = 'none';\n        this.selectionHandles.styles.bottomRight.display = 'none';\n      }\n    }\n  }]);\n\n  return Border;\n}();\n\nexports.default = Border;\n\n/***/ }),\n/* 188 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _unicode = __webpack_require__(21);\n\nvar _mixed = __webpack_require__(16);\n\nvar _string = __webpack_require__(36);\n\nvar _array = __webpack_require__(1);\n\nvar _element = __webpack_require__(0);\n\nvar _handsontableEditor = __webpack_require__(189);\n\nvar _handsontableEditor2 = _interopRequireDefault(_handsontableEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AutocompleteEditor = _handsontableEditor2.default.prototype.extend();\n\n/**\n * @private\n * @editor AutocompleteEditor\n * @class AutocompleteEditor\n * @dependencies HandsontableEditor\n */\nAutocompleteEditor.prototype.init = function () {\n  _handsontableEditor2.default.prototype.init.apply(this, arguments);\n  this.query = null;\n  this.strippedChoices = [];\n  this.rawChoices = [];\n};\n\nAutocompleteEditor.prototype.getValue = function () {\n  var _this2 = this;\n\n  var selectedValue = this.rawChoices.find(function (value) {\n    var strippedValue = _this2.stripValueIfNeeded(value);\n\n    return strippedValue === _this2.TEXTAREA.value;\n  });\n\n  if ((0, _mixed.isDefined)(selectedValue)) {\n    return selectedValue;\n  }\n\n  return this.TEXTAREA.value;\n};\n\nAutocompleteEditor.prototype.createElements = function () {\n  _handsontableEditor2.default.prototype.createElements.apply(this, arguments);\n\n  (0, _element.addClass)(this.htContainer, 'autocompleteEditor');\n  (0, _element.addClass)(this.htContainer, window.navigator.platform.indexOf('Mac') === -1 ? '' : 'htMacScroll');\n};\n\nvar skipOne = false;\nfunction onBeforeKeyDown(event) {\n  skipOne = false;\n  var editor = this.getActiveEditor();\n\n  if ((0, _unicode.isPrintableChar)(event.keyCode) || event.keyCode === _unicode.KEY_CODES.BACKSPACE || event.keyCode === _unicode.KEY_CODES.DELETE || event.keyCode === _unicode.KEY_CODES.INSERT) {\n    var timeOffset = 0;\n\n    // on ctl+c / cmd+c don't update suggestion list\n    if (event.keyCode === _unicode.KEY_CODES.C && (event.ctrlKey || event.metaKey)) {\n      return;\n    }\n    if (!editor.isOpened()) {\n      timeOffset += 10;\n    }\n\n    if (editor.htEditor) {\n      editor.instance._registerTimeout(setTimeout(function () {\n        editor.queryChoices(editor.TEXTAREA.value);\n        skipOne = true;\n      }, timeOffset));\n    }\n  }\n}\n\nAutocompleteEditor.prototype.prepare = function () {\n  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);\n  _handsontableEditor2.default.prototype.prepare.apply(this, arguments);\n};\n\nAutocompleteEditor.prototype.open = function () {\n  // Ugly fix for handsontable which grab window object for autocomplete scroll listener instead table element.\n  this.TEXTAREA_PARENT.style.overflow = 'auto';\n  _handsontableEditor2.default.prototype.open.apply(this, arguments);\n  this.TEXTAREA_PARENT.style.overflow = '';\n\n  var choicesListHot = this.htEditor.getInstance();\n  var _this = this;\n  var trimDropdown = this.cellProperties.trimDropdown === void 0 ? true : this.cellProperties.trimDropdown;\n\n  this.TEXTAREA.style.visibility = 'visible';\n  this.focus();\n\n  choicesListHot.updateSettings({\n    colWidths: trimDropdown ? [(0, _element.outerWidth)(this.TEXTAREA) - 2] : void 0,\n    width: trimDropdown ? (0, _element.outerWidth)(this.TEXTAREA) + (0, _element.getScrollbarWidth)() + 2 : void 0,\n    afterRenderer: function afterRenderer(TD, row, col, prop, value, cellProperties) {\n      var _this$cellProperties = _this.cellProperties,\n          filteringCaseSensitive = _this$cellProperties.filteringCaseSensitive,\n          allowHtml = _this$cellProperties.allowHtml;\n\n      var indexOfMatch = void 0;\n      var match = void 0;\n\n      value = (0, _mixed.stringify)(value);\n\n      if (value && !allowHtml) {\n        indexOfMatch = filteringCaseSensitive === true ? value.indexOf(this.query) : value.toLowerCase().indexOf(_this.query.toLowerCase());\n\n        if (indexOfMatch !== -1) {\n          match = value.substr(indexOfMatch, _this.query.length);\n          value = value.replace(match, '<strong>' + match + '</strong>');\n        }\n      }\n      TD.innerHTML = value;\n    },\n\n    autoColumnSize: true,\n    modifyColWidth: function modifyColWidth(width, col) {\n      // workaround for <strong> text overlapping the dropdown, not really accurate\n      var autoWidths = this.getPlugin('autoColumnSize').widths;\n\n      if (autoWidths[col]) {\n        width = autoWidths[col];\n      }\n\n      return trimDropdown ? width : width + 15;\n    }\n  });\n\n  // Add additional space for autocomplete holder\n  this.htEditor.view.wt.wtTable.holder.parentNode.style['padding-right'] = (0, _element.getScrollbarWidth)() + 2 + 'px';\n\n  if (skipOne) {\n    skipOne = false;\n  }\n\n  _this.instance._registerTimeout(setTimeout(function () {\n    _this.queryChoices(_this.TEXTAREA.value);\n  }, 0));\n};\n\nAutocompleteEditor.prototype.close = function () {\n  _handsontableEditor2.default.prototype.close.apply(this, arguments);\n};\nAutocompleteEditor.prototype.queryChoices = function (query) {\n  var _this3 = this;\n\n  this.query = query;\n  var source = this.cellProperties.source;\n\n  if (typeof source == 'function') {\n    source.call(this.cellProperties, query, function (choices) {\n      _this3.rawChoices = choices;\n      _this3.updateChoicesList(_this3.stripValuesIfNeeded(choices));\n    });\n  } else if (Array.isArray(source)) {\n    this.rawChoices = source;\n    this.updateChoicesList(this.stripValuesIfNeeded(source));\n  } else {\n    this.updateChoicesList([]);\n  }\n};\n\nAutocompleteEditor.prototype.updateChoicesList = function (choices) {\n  var pos = (0, _element.getCaretPosition)(this.TEXTAREA);\n  var endPos = (0, _element.getSelectionEndPosition)(this.TEXTAREA);\n  var sortByRelevanceSetting = this.cellProperties.sortByRelevance;\n  var filterSetting = this.cellProperties.filter;\n  var orderByRelevance = null;\n  var highlightIndex = null;\n\n  if (sortByRelevanceSetting) {\n    orderByRelevance = AutocompleteEditor.sortByRelevance(this.stripValueIfNeeded(this.getValue()), choices, this.cellProperties.filteringCaseSensitive);\n  }\n  var orderByRelevanceLength = Array.isArray(orderByRelevance) ? orderByRelevance.length : 0;\n\n  if (filterSetting === false) {\n    if (orderByRelevanceLength) {\n      highlightIndex = orderByRelevance[0];\n    }\n  } else {\n    var sorted = [];\n\n    for (var i = 0, choicesCount = choices.length; i < choicesCount; i++) {\n      if (sortByRelevanceSetting && orderByRelevanceLength <= i) {\n        break;\n      }\n      if (orderByRelevanceLength) {\n        sorted.push(choices[orderByRelevance[i]]);\n      } else {\n        sorted.push(choices[i]);\n      }\n    }\n\n    highlightIndex = 0;\n    choices = sorted;\n  }\n\n  this.strippedChoices = choices;\n  this.htEditor.loadData((0, _array.pivot)([choices]));\n\n  this.updateDropdownHeight();\n\n  this.flipDropdownIfNeeded();\n\n  if (this.cellProperties.strict === true) {\n    this.highlightBestMatchingChoice(highlightIndex);\n  }\n\n  this.instance.listen(false);\n\n  (0, _element.setCaretPosition)(this.TEXTAREA, pos, pos === endPos ? void 0 : endPos);\n};\n\nAutocompleteEditor.prototype.flipDropdownIfNeeded = function () {\n  var textareaOffset = (0, _element.offset)(this.TEXTAREA);\n  var textareaHeight = (0, _element.outerHeight)(this.TEXTAREA);\n  var dropdownHeight = this.getDropdownHeight();\n  var trimmingContainer = (0, _element.getTrimmingContainer)(this.instance.view.wt.wtTable.TABLE);\n  var trimmingContainerScrollTop = trimmingContainer.scrollTop;\n  var headersHeight = (0, _element.outerHeight)(this.instance.view.wt.wtTable.THEAD);\n  var containerOffset = {\n    row: 0,\n    col: 0\n  };\n\n  if (trimmingContainer !== window) {\n    containerOffset = (0, _element.offset)(trimmingContainer);\n  }\n\n  var spaceAbove = textareaOffset.top - containerOffset.top - headersHeight + trimmingContainerScrollTop;\n  var spaceBelow = trimmingContainer.scrollHeight - spaceAbove - headersHeight - textareaHeight;\n  var flipNeeded = dropdownHeight > spaceBelow && spaceAbove > spaceBelow;\n\n  if (flipNeeded) {\n    this.flipDropdown(dropdownHeight);\n  } else {\n    this.unflipDropdown();\n  }\n\n  this.limitDropdownIfNeeded(flipNeeded ? spaceAbove : spaceBelow, dropdownHeight);\n\n  return flipNeeded;\n};\n\nAutocompleteEditor.prototype.limitDropdownIfNeeded = function (spaceAvailable, dropdownHeight) {\n  if (dropdownHeight > spaceAvailable) {\n    var tempHeight = 0;\n    var i = 0;\n    var lastRowHeight = 0;\n    var height = null;\n\n    do {\n      lastRowHeight = this.htEditor.getRowHeight(i) || this.htEditor.view.wt.wtSettings.settings.defaultRowHeight;\n      tempHeight += lastRowHeight;\n      i++;\n    } while (tempHeight < spaceAvailable);\n\n    height = tempHeight - lastRowHeight;\n\n    if (this.htEditor.flipped) {\n      this.htEditor.rootElement.style.top = parseInt(this.htEditor.rootElement.style.top, 10) + dropdownHeight - height + 'px';\n    }\n\n    this.setDropdownHeight(tempHeight - lastRowHeight);\n  }\n};\n\nAutocompleteEditor.prototype.flipDropdown = function (dropdownHeight) {\n  var dropdownStyle = this.htEditor.rootElement.style;\n\n  dropdownStyle.position = 'absolute';\n  dropdownStyle.top = -dropdownHeight + 'px';\n\n  this.htEditor.flipped = true;\n};\n\nAutocompleteEditor.prototype.unflipDropdown = function () {\n  var dropdownStyle = this.htEditor.rootElement.style;\n\n  if (dropdownStyle.position === 'absolute') {\n    dropdownStyle.position = '';\n    dropdownStyle.top = '';\n  }\n\n  this.htEditor.flipped = void 0;\n};\n\nAutocompleteEditor.prototype.updateDropdownHeight = function () {\n  var currentDropdownWidth = this.htEditor.getColWidth(0) + (0, _element.getScrollbarWidth)() + 2;\n  var trimDropdown = this.cellProperties.trimDropdown;\n\n  this.htEditor.updateSettings({\n    height: this.getDropdownHeight(),\n    width: trimDropdown ? void 0 : currentDropdownWidth\n  });\n\n  this.htEditor.view.wt.wtTable.alignOverlaysWithTrimmingContainer();\n};\n\nAutocompleteEditor.prototype.setDropdownHeight = function (height) {\n  this.htEditor.updateSettings({\n    height: height\n  });\n};\n\nAutocompleteEditor.prototype.finishEditing = function (restoreOriginalValue) {\n  if (!restoreOriginalValue) {\n    this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n  }\n  _handsontableEditor2.default.prototype.finishEditing.apply(this, arguments);\n};\n\nAutocompleteEditor.prototype.highlightBestMatchingChoice = function (index) {\n  if (typeof index === 'number') {\n    this.htEditor.selectCell(index, 0, void 0, void 0, void 0, false);\n  } else {\n    this.htEditor.deselectCell();\n  }\n};\n\n/**\n * Filters and sorts by relevance\n * @param value\n * @param choices\n * @param caseSensitive\n * @returns {Array} array of indexes in original choices array\n */\nAutocompleteEditor.sortByRelevance = function (value, choices, caseSensitive) {\n  var choicesRelevance = [];\n  var currentItem = void 0;\n  var valueLength = value.length;\n  var valueIndex = void 0;\n  var charsLeft = void 0;\n  var result = [];\n  var i = void 0;\n  var choicesCount = choices.length;\n\n  if (valueLength === 0) {\n    for (i = 0; i < choicesCount; i++) {\n      result.push(i);\n    }\n    return result;\n  }\n\n  for (i = 0; i < choicesCount; i++) {\n    currentItem = (0, _string.stripTags)((0, _mixed.stringify)(choices[i]));\n\n    if (caseSensitive) {\n      valueIndex = currentItem.indexOf(value);\n    } else {\n      valueIndex = currentItem.toLowerCase().indexOf(value.toLowerCase());\n    }\n\n    if (valueIndex !== -1) {\n      charsLeft = currentItem.length - valueIndex - valueLength;\n\n      choicesRelevance.push({\n        baseIndex: i,\n        index: valueIndex,\n        charsLeft: charsLeft,\n        value: currentItem\n      });\n    }\n  }\n\n  choicesRelevance.sort(function (a, b) {\n\n    if (b.index === -1) {\n      return -1;\n    }\n    if (a.index === -1) {\n      return 1;\n    }\n\n    if (a.index < b.index) {\n      return -1;\n    } else if (b.index < a.index) {\n      return 1;\n    } else if (a.index === b.index) {\n      if (a.charsLeft < b.charsLeft) {\n        return -1;\n      } else if (a.charsLeft > b.charsLeft) {\n        return 1;\n      }\n    }\n\n    return 0;\n  });\n\n  for (i = 0, choicesCount = choicesRelevance.length; i < choicesCount; i++) {\n    result.push(choicesRelevance[i].baseIndex);\n  }\n\n  return result;\n};\n\nAutocompleteEditor.prototype.getDropdownHeight = function () {\n  var firstRowHeight = this.htEditor.getInstance().getRowHeight(0) || 23;\n  var visibleRows = this.cellProperties.visibleRows;\n\n  return this.strippedChoices.length >= visibleRows ? visibleRows * firstRowHeight : this.strippedChoices.length * firstRowHeight + 8;\n};\n\nAutocompleteEditor.prototype.stripValueIfNeeded = function (value) {\n  return this.stripValuesIfNeeded([value])[0];\n};\n\nAutocompleteEditor.prototype.stripValuesIfNeeded = function (values) {\n  var allowHtml = this.cellProperties.allowHtml;\n\n\n  var stringifiedValues = (0, _array.arrayMap)(values, function (value) {\n    return (0, _mixed.stringify)(value);\n  });\n  var strippedValues = (0, _array.arrayMap)(stringifiedValues, function (value) {\n    return allowHtml ? value : (0, _string.stripTags)(value);\n  });\n\n  return strippedValues;\n};\n\nAutocompleteEditor.prototype.allowKeyEventPropagation = function (keyCode) {\n  var selectedRange = this.htEditor.getSelectedRangeLast();\n\n  var selected = { row: selectedRange ? selectedRange.from.row : -1 };\n  var allowed = false;\n\n  if (keyCode === _unicode.KEY_CODES.ARROW_DOWN && selected.row > 0 && selected.row < this.htEditor.countRows() - 1) {\n    allowed = true;\n  }\n  if (keyCode === _unicode.KEY_CODES.ARROW_UP && selected.row > -1) {\n    allowed = true;\n  }\n\n  return allowed;\n};\n\nAutocompleteEditor.prototype.discardEditor = function (result) {\n  _handsontableEditor2.default.prototype.discardEditor.apply(this, arguments);\n\n  this.instance.view.render();\n};\n\nexports.default = AutocompleteEditor;\n\n/***/ }),\n/* 189 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _unicode = __webpack_require__(21);\n\nvar _object = __webpack_require__(2);\n\nvar _element = __webpack_require__(0);\n\nvar _event = __webpack_require__(12);\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar HandsontableEditor = _textEditor2.default.prototype.extend();\n\n/**\n * @private\n * @editor HandsontableEditor\n * @class HandsontableEditor\n * @dependencies TextEditor\n */\nHandsontableEditor.prototype.createElements = function () {\n  _textEditor2.default.prototype.createElements.apply(this, arguments);\n\n  var DIV = document.createElement('DIV');\n  DIV.className = 'handsontableEditor';\n  this.TEXTAREA_PARENT.appendChild(DIV);\n\n  this.htContainer = DIV;\n  this.assignHooks();\n};\n\nHandsontableEditor.prototype.prepare = function (td, row, col, prop, value, cellProperties) {\n  _textEditor2.default.prototype.prepare.apply(this, arguments);\n\n  var parent = this;\n  var options = {\n    startRows: 0,\n    startCols: 0,\n    minRows: 0,\n    minCols: 0,\n    className: 'listbox',\n    copyPaste: false,\n    autoColumnSize: false,\n    autoRowSize: false,\n    readOnly: true,\n    fillHandle: false,\n    afterOnCellMouseDown: function afterOnCellMouseDown(_, coords) {\n      var value = this.getSourceData(coords.row, coords.col);\n\n      // if the value is undefined then it means we don't want to set the value\n      if (value !== void 0) {\n        parent.setValue(value);\n      }\n      parent.instance.destroyEditor();\n    }\n  };\n\n  if (this.cellProperties.handsontable) {\n    (0, _object.extend)(options, cellProperties.handsontable);\n  }\n  this.htOptions = options;\n};\n\nvar onBeforeKeyDown = function onBeforeKeyDown(event) {\n  if ((0, _event.isImmediatePropagationStopped)(event)) {\n    return;\n  }\n  var editor = this.getActiveEditor();\n\n  var innerHOT = editor.htEditor.getInstance();\n\n  var rowToSelect;\n  var selectedRow;\n\n  if (event.keyCode == _unicode.KEY_CODES.ARROW_DOWN) {\n    if (!innerHOT.getSelectedLast() && !innerHOT.flipped) {\n      rowToSelect = 0;\n    } else if (innerHOT.getSelectedLast()) {\n      if (innerHOT.flipped) {\n        rowToSelect = innerHOT.getSelectedLast()[0] + 1;\n      } else if (!innerHOT.flipped) {\n        selectedRow = innerHOT.getSelectedLast()[0];\n        var lastRow = innerHOT.countRows() - 1;\n        rowToSelect = Math.min(lastRow, selectedRow + 1);\n      }\n    }\n  } else if (event.keyCode == _unicode.KEY_CODES.ARROW_UP) {\n    if (!innerHOT.getSelectedLast() && innerHOT.flipped) {\n      rowToSelect = innerHOT.countRows() - 1;\n    } else if (innerHOT.getSelectedLast()) {\n      if (innerHOT.flipped) {\n        selectedRow = innerHOT.getSelectedLast()[0];\n        rowToSelect = Math.max(0, selectedRow - 1);\n      } else {\n        selectedRow = innerHOT.getSelectedLast()[0];\n        rowToSelect = selectedRow - 1;\n      }\n    }\n  }\n\n  if (rowToSelect !== void 0) {\n    if (rowToSelect < 0 || innerHOT.flipped && rowToSelect > innerHOT.countRows() - 1) {\n      innerHOT.deselectCell();\n    } else {\n      innerHOT.selectCell(rowToSelect, 0);\n    }\n    if (innerHOT.getData().length) {\n      event.preventDefault();\n      (0, _event.stopImmediatePropagation)(event);\n\n      editor.instance.listen();\n      editor.TEXTAREA.focus();\n    }\n  }\n};\n\nHandsontableEditor.prototype.open = function () {\n  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);\n\n  _textEditor2.default.prototype.open.apply(this, arguments);\n\n  if (this.htEditor) {\n    this.htEditor.destroy();\n  }\n  // Construct and initialise a new Handsontable\n  this.htEditor = new this.instance.constructor(this.htContainer, this.htOptions);\n  this.htEditor.init();\n\n  if (this.cellProperties.strict) {\n    this.htEditor.selectCell(0, 0);\n    this.TEXTAREA.style.visibility = 'hidden';\n  } else {\n    this.htEditor.deselectCell();\n    this.TEXTAREA.style.visibility = 'visible';\n  }\n\n  (0, _element.setCaretPosition)(this.TEXTAREA, 0, this.TEXTAREA.value.length);\n};\n\nHandsontableEditor.prototype.close = function () {\n  this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n  this.instance.listen();\n\n  _textEditor2.default.prototype.close.apply(this, arguments);\n};\n\nHandsontableEditor.prototype.focus = function () {\n  this.instance.listen();\n  _textEditor2.default.prototype.focus.apply(this, arguments);\n};\n\nHandsontableEditor.prototype.beginEditing = function (initialValue) {\n  var onBeginEditing = this.instance.getSettings().onBeginEditing;\n\n  if (onBeginEditing && onBeginEditing() === false) {\n    return;\n  }\n  _textEditor2.default.prototype.beginEditing.apply(this, arguments);\n};\n\nHandsontableEditor.prototype.finishEditing = function (isCancelled, ctrlDown) {\n  if (this.htEditor && this.htEditor.isListening()) {\n    // if focus is still in the HOT editor\n\n    this.instance.listen(); // return the focus to the parent HOT instance\n  }\n\n  if (this.htEditor && this.htEditor.getSelectedLast()) {\n    var value = this.htEditor.getInstance().getValue();\n\n    if (value !== void 0) {\n      // if the value is undefined then it means we don't want to set the value\n      this.setValue(value);\n    }\n  }\n\n  return _textEditor2.default.prototype.finishEditing.apply(this, arguments);\n};\n\nHandsontableEditor.prototype.assignHooks = function () {\n  var _this = this;\n\n  this.instance.addHook('afterDestroy', function () {\n    if (_this.htEditor) {\n      _this.htEditor.destroy();\n    }\n  });\n};\n\nexports.default = HandsontableEditor;\n\n/***/ }),\n/* 190 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getNormalizedDate = getNormalizedDate;\n/* eslint-disable import/prefer-default-export */\n\n/**\n * Get normalized Date object for the ISO formatted date strings.\n * Natively, the date object parsed from a ISO 8601 string will be offsetted by the timezone difference, which may result in returning a wrong date.\n * See: Github issue #3338.\n *\n * @param {String} dateString String representing the date.\n * @returns {Date} The proper Date object.\n */\nfunction getNormalizedDate(dateString) {\n  var nativeDate = new Date(dateString);\n\n  // NaN if dateString is not in ISO format\n  if (!isNaN(new Date(dateString + \"T00:00\").getDate())) {\n\n    // Compensate timezone offset\n    return new Date(nativeDate.getTime() + nativeDate.getTimezoneOffset() * 60000);\n  }\n\n  return nativeDate;\n}\n\n/***/ }),\n/* 191 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * SheetClip - Spreadsheet Clipboard Parser\n * version 0.2\n *\n * This tiny library transforms JavaScript arrays to strings that are pasteable by LibreOffice, OpenOffice,\n * Google Docs and Microsoft Excel.\n *\n * Copyright 2012, Marcin Warpechowski\n * Licensed under the MIT license.\n * http://github.com/warpech/sheetclip/\n */\n/*jslint white: true*/\n(function (global) {\n  \"use strict\";\n\n  function countQuotes(str) {\n    return str.split('\"').length - 1;\n  }\n\n  var SheetClip = {\n    /**\n     * Decode spreadsheet string into array\n     *\n     * @param {String} str\n     * @returns {Array}\n     */\n    parse: function parse(str) {\n      var r,\n          rLen,\n          rows,\n          arr = [],\n          a = 0,\n          c,\n          cLen,\n          multiline,\n          last;\n\n      rows = str.split('\\n');\n\n      if (rows.length > 1 && rows[rows.length - 1] === '') {\n        rows.pop();\n      }\n      for (r = 0, rLen = rows.length; r < rLen; r += 1) {\n        rows[r] = rows[r].split('\\t');\n\n        for (c = 0, cLen = rows[r].length; c < cLen; c += 1) {\n          if (!arr[a]) {\n            arr[a] = [];\n          }\n          if (multiline && c === 0) {\n            last = arr[a].length - 1;\n            arr[a][last] = arr[a][last] + '\\n' + rows[r][0];\n\n            if (multiline && countQuotes(rows[r][0]) & 1) {\n              //& 1 is a bitwise way of performing mod 2\n              multiline = false;\n              arr[a][last] = arr[a][last].substring(0, arr[a][last].length - 1).replace(/\"\"/g, '\"');\n            }\n          } else {\n            if (c === cLen - 1 && rows[r][c].indexOf('\"') === 0 && countQuotes(rows[r][c]) & 1) {\n              arr[a].push(rows[r][c].substring(1).replace(/\"\"/g, '\"'));\n              multiline = true;\n            } else {\n              arr[a].push(rows[r][c].replace(/\"\"/g, '\"'));\n              multiline = false;\n            }\n          }\n        }\n        if (!multiline) {\n          a += 1;\n        }\n      }\n\n      return arr;\n    },\n\n    /**\n     * Encode array into valid spreadsheet string\n     *\n     * @param arr\n     * @returns {String}\n     */\n    stringify: function stringify(arr) {\n      var r,\n          rLen,\n          c,\n          cLen,\n          str = '',\n          val;\n\n      for (r = 0, rLen = arr.length; r < rLen; r += 1) {\n        cLen = arr[r].length;\n\n        for (c = 0; c < cLen; c += 1) {\n          if (c > 0) {\n            str += '\\t';\n          }\n          val = arr[r][c];\n\n          if (typeof val === 'string') {\n            if (val.indexOf('\\n') > -1) {\n              str += '\"' + val.replace(/\"/g, '\"\"') + '\"';\n            } else {\n              str += val;\n            }\n          } else if (val === null || val === void 0) {\n            // void 0 resolves to undefined\n            str += '';\n          } else {\n            str += val;\n          }\n        }\n\n        if (r !== rLen - 1) {\n          str += '\\n';\n        }\n      }\n\n      return str;\n    }\n  };\n\n  if (true) {\n    exports.parse = SheetClip.parse;\n    exports.stringify = SheetClip.stringify;\n  } else {\n    global.SheetClip = SheetClip;\n  }\n})(window);\n\n/***/ }),\n/* 192 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.mouseDown = mouseDown;\nexports.mouseOver = mouseOver;\nexports.handleMouseEvent = handleMouseEvent;\n\nvar _event = __webpack_require__(12);\n\nvar _src = __webpack_require__(4);\n\n/**\n * MouseDown handler.\n *\n * @param {Object} options\n * @param {Boolean} options.isShiftKey The flag which indicates if the shift key is pressed.\n * @param {Boolean} options.isLeftClick The flag which indicates if the left mouse button is pressed.\n * @param {Boolean} options.isRightClick The flag which indicates if the right mouse button is pressed.\n * @param {CellRange} options.coords The CellCoords object with defined visual coordinates.\n * @param {Selection} options.selection The Selection class instance.\n * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what\n *                                    operation will be performed in later selection stages.\n */\nfunction mouseDown(_ref) {\n  var isShiftKey = _ref.isShiftKey,\n      isLeftClick = _ref.isLeftClick,\n      isRightClick = _ref.isRightClick,\n      coords = _ref.coords,\n      selection = _ref.selection,\n      controller = _ref.controller;\n\n  var currentSelection = selection.isSelected() ? selection.getSelectedRange().current() : null;\n  var selectedCorner = selection.isSelectedByCorner();\n  var selectedRow = selection.isSelectedByRowHeader();\n  var selectedColumn = selection.isSelectedByColumnHeader();\n\n  if (isShiftKey && currentSelection) {\n    if (coords.row >= 0 && coords.col >= 0 && !controller.cells) {\n      selection.setRangeEnd(coords);\n    } else if ((selectedCorner || selectedRow) && coords.row >= 0 && coords.col >= 0 && !controller.cells) {\n      selection.setRangeEnd(new _src.CellCoords(coords.row, coords.col));\n    } else if (selectedCorner && coords.row < 0 && !controller.column) {\n      selection.setRangeEnd(new _src.CellCoords(currentSelection.to.row, coords.col));\n    } else if (selectedRow && coords.col < 0 && !controller.row) {\n      selection.setRangeEnd(new _src.CellCoords(coords.row, currentSelection.to.col));\n    } else if ((!selectedCorner && !selectedRow && coords.col < 0 || selectedCorner && coords.col < 0) && !controller.row) {\n      selection.selectRows(currentSelection.from.row, coords.row);\n    } else if ((!selectedCorner && !selectedRow && coords.row < 0 || selectedRow && coords.row < 0) && !controller.column) {\n      selection.selectColumns(currentSelection.from.col, coords.col);\n    }\n  } else {\n    var newCoord = new _src.CellCoords(coords.row, coords.col);\n\n    if (newCoord.row < 0) {\n      newCoord.row = 0;\n    }\n    if (newCoord.col < 0) {\n      newCoord.col = 0;\n    }\n\n    var allowRightClickSelection = !selection.inInSelection(newCoord);\n    var performSelection = isLeftClick || isRightClick && allowRightClickSelection;\n\n    // clicked row header and when some column was selected\n    if (coords.row < 0 && coords.col >= 0 && !controller.column) {\n      if (performSelection) {\n        selection.selectColumns(coords.col);\n      }\n\n      // clicked column header and when some row was selected\n    } else if (coords.col < 0 && coords.row >= 0 && !controller.row) {\n      if (performSelection) {\n        selection.selectRows(coords.row);\n      }\n    } else if (coords.col >= 0 && coords.row >= 0 && !controller.cells) {\n      if (performSelection) {\n        selection.setRangeStart(coords);\n      }\n    } else if (coords.col < 0 && coords.row < 0) {\n      selection.setRangeStart(coords);\n    }\n  }\n}\n\n/**\n * MouseOver handler.\n *\n * @param {Object} options\n * @param {Boolean} options.isLeftClick\n * @param {CellRange} options.coords The CellCoords object with defined visual coordinates.\n * @param {Selection} options.selection The Selection class instance.\n * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what\n *                                    operation will be performed in later selection stages.\n */\nfunction mouseOver(_ref2) {\n  var isLeftClick = _ref2.isLeftClick,\n      coords = _ref2.coords,\n      selection = _ref2.selection,\n      controller = _ref2.controller;\n\n  if (!isLeftClick) {\n    return;\n  }\n\n  var selectedRow = selection.isSelectedByRowHeader();\n  var selectedColumn = selection.isSelectedByColumnHeader();\n  var countCols = selection.tableProps.countCols();\n  var countRows = selection.tableProps.countRows();\n\n  if (selectedColumn && !controller.column) {\n    selection.setRangeEnd(new _src.CellCoords(countRows - 1, coords.col));\n  } else if (selectedRow && !controller.row) {\n    selection.setRangeEnd(new _src.CellCoords(coords.row, countCols - 1));\n  } else if (!controller.cell) {\n    selection.setRangeEnd(coords);\n  }\n}\n\nvar handlers = new Map([['mousedown', mouseDown], ['mouseover', mouseOver], ['touchstart', mouseDown]]);\n\n/**\n * Mouse handler for selection functionality.\n *\n * @param {Event} event An native event to handle.\n * @param {Object} options\n * @param {CellRange} options.coords The CellCoords object with defined visual coordinates.\n * @param {Selection} options.selection The Selection class instance.\n * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what\n *                                    operation will be performed in later selection stages.\n */\nfunction handleMouseEvent(event, _ref3) {\n  var coords = _ref3.coords,\n      selection = _ref3.selection,\n      controller = _ref3.controller;\n\n  handlers.get(event.type)({\n    coords: coords,\n    selection: selection,\n    controller: controller,\n    isShiftKey: event.shiftKey,\n    isLeftClick: (0, _event.isLeftClick)(event) || event.type === 'touchstart',\n    isRightClick: (0, _event.isRightClick)(event)\n  });\n}\n\n/***/ }),\n/* 193 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.RecordTranslator = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.registerIdentity = registerIdentity;\nexports.getTranslator = getTranslator;\n\nvar _core = __webpack_require__(88);\n\nvar _core2 = _interopRequireDefault(_core);\n\nvar _object = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class RecordTranslator\n * @util\n */\nvar RecordTranslator = function () {\n  function RecordTranslator(hot) {\n    _classCallCheck(this, RecordTranslator);\n\n    this.hot = hot;\n  }\n\n  /**\n   * Translate physical row index into visual.\n   *\n   * @param {Number} row Physical row index.\n   * @returns {Number} Returns visual row index.\n   */\n\n\n  _createClass(RecordTranslator, [{\n    key: 'toVisualRow',\n    value: function toVisualRow(row) {\n      return this.hot.runHooks('unmodifyRow', row);\n    }\n\n    /**\n     * Translate physical column index into visual.\n     *\n     * @param {Number} column Physical column index.\n     * @returns {Number} Returns visual column index.\n     */\n\n  }, {\n    key: 'toVisualColumn',\n    value: function toVisualColumn(column) {\n      return this.hot.runHooks('unmodifyCol', column);\n    }\n\n    /**\n     * Translate physical coordinates into visual. Can be passed as separate 2 arguments (row, column) or as an object in first\n     * argument with `row` and `column` keys.\n     *\n     * @param {Number|Object} row Physical coordinates or row index.\n     * @param {Number} [column] Physical column index.\n     * @returns {Object|Array} Returns an object with visual records or an array if coordinates passed as separate arguments.\n     */\n\n  }, {\n    key: 'toVisual',\n    value: function toVisual(row, column) {\n      var result = void 0;\n\n      if ((0, _object.isObject)(row)) {\n        result = {\n          row: this.toVisualRow(row.row),\n          column: this.toVisualColumn(row.column)\n        };\n      } else {\n        result = [this.toVisualRow(row), this.toVisualColumn(column)];\n      }\n\n      return result;\n    }\n\n    /**\n     * Translate visual row index into physical.\n     *\n     * @param {Number} row Visual row index.\n     * @returns {Number} Returns physical row index.\n     */\n\n  }, {\n    key: 'toPhysicalRow',\n    value: function toPhysicalRow(row) {\n      return this.hot.runHooks('modifyRow', row);\n    }\n\n    /**\n     * Translate visual column index into physical.\n     *\n     * @param {Number} column Visual column index.\n     * @returns {Number} Returns physical column index.\n     */\n\n  }, {\n    key: 'toPhysicalColumn',\n    value: function toPhysicalColumn(column) {\n      return this.hot.runHooks('modifyCol', column);\n    }\n\n    /**\n     * Translate visual coordinates into physical. Can be passed as separate 2 arguments (row, column) or as an object in first\n     * argument with `row` and `column` keys.\n     *\n     * @param {Number|Object} row Visual coordinates or row index.\n     * @param {Number} [column] Visual column index.\n     * @returns {Object|Array} Returns an object with physical records or an array if coordinates passed as separate arguments.\n     */\n\n  }, {\n    key: 'toPhysical',\n    value: function toPhysical(row, column) {\n      var result = void 0;\n\n      if ((0, _object.isObject)(row)) {\n        result = {\n          row: this.toPhysicalRow(row.row),\n          column: this.toPhysicalColumn(row.column)\n        };\n      } else {\n        result = [this.toPhysicalRow(row), this.toPhysicalColumn(column)];\n      }\n\n      return result;\n    }\n  }]);\n\n  return RecordTranslator;\n}();\n\nexports.RecordTranslator = RecordTranslator;\n\n\nvar identities = new WeakMap();\nvar translatorSingletons = new WeakMap();\n\nfunction registerIdentity(identity, hot) {\n  identities.set(identity, hot);\n}\n\nfunction getTranslator(identity) {\n  var singleton = void 0;\n\n  if (!(identity instanceof _core2.default)) {\n    if (!identities.has(identity)) {\n      throw Error('Record translator was not registered for this object identity');\n    }\n    identity = identities.get(identity);\n  }\n  if (translatorSingletons.has(identity)) {\n    singleton = translatorSingletons.get(identity);\n  } else {\n    singleton = new RecordTranslator(identity);\n    translatorSingletons.set(identity, singleton);\n  }\n\n  return singleton;\n}\n\n/***/ }),\n/* 194 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.registerAsRootInstance = registerAsRootInstance;\nexports.hasValidParameter = hasValidParameter;\nexports.isRootInstance = isRootInstance;\nvar holder = exports.holder = new WeakMap();\n\nvar rootInstanceSymbol = exports.rootInstanceSymbol = Symbol('rootInstance');\n\n/**\n * Register an object as a root instance.\n *\n * @param  {Object} object An object to associate with root instance flag.\n */\nfunction registerAsRootInstance(object) {\n  holder.set(object, true);\n}\n\n/**\n * Check if the source of the root indication call is valid.\n *\n * @param  {Symbol} rootSymbol A symbol as a source of truth.\n * @return {Boolean}\n */\nfunction hasValidParameter(rootSymbol) {\n  return rootSymbol === rootInstanceSymbol;\n}\n\n/**\n * Check if passed an object was flagged as a root instance.\n *\n * @param  {Object} object An object to check.\n * @return {Boolean}\n */\nfunction isRootInstance(object) {\n  return holder.has(object);\n}\n\n/***/ }),\n/* 195 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _mixed = __webpack_require__(16);\n\nvar _object = __webpack_require__(2);\n\n/**\n * @alias Options\n * @constructor\n * @description\n\n * ## Constructor options\n *\n * Constructor options are applied using an object literal passed as a second argument to the Handsontable constructor.\n *\n * ```js\n * var hot = new Handsontable(document.getElementById('example1'), {\n *   data: myArray,\n *   width: 400,\n *   height: 300\n * });\n * ```\n *\n * ---\n * ## Cascading configuration\n *\n * Handsontable 0.9 and newer is using *Cascading Configuration*, which is a fast way to provide configuration options\n * for the entire table, including its columns and particular cells.\n *\n * Consider the following example:\n * ```js\n * var hot = new Handsontable(document.getElementById('example'), {\n *   readOnly: true,\n *   columns: [\n *     {readOnly: false},\n *     {},\n *     {}\n *   ],\n *   cells: function (row, col, prop) {\n *     var cellProperties = {};\n *\n *     if (row === 0 && col === 0) {\n *       cellProperties.readOnly = true;\n *     }\n *\n *     return cellProperties;\n *   }\n * });\n * ```\n *\n * The above notation will result in all TDs being *read only*, except for first column TDs which will be *editable*, except for the TD in top left corner which will still be *read only*.\n *\n * ### The Cascading Configuration model\n *\n * ##### 1. Constructor\n *\n * Configuration options that are provided using first-level `handsontable(container, {option: \"value\"})` and `updateSettings` method.\n *\n * ##### 2. Columns\n *\n * Configuration options that are provided using second-level object `handsontable(container, {columns: {option: \"value\"}]})`\n *\n * ##### 3. Cells\n *\n * Configuration options that are provided using third-level function `handsontable(container, {cells: function: (row, col, prop){ }})`\n *\n * ---\n * ## Architecture performance\n *\n * The Cascading Configuration model is based on prototypical inheritance. It is much faster and memory efficient compared\n * to the previous model that used jQuery extend. See: [http://jsperf.com/extending-settings](http://jsperf.com/extending-settings).\n *\n * ---\n * __Important notice:__ In order for the data separation to work properly, make sure that each instance of Handsontable has a unique `id`.\n */\nfunction DefaultSettings() {};\n\nDefaultSettings.prototype = {\n  /**\n   * License key for commercial version of Handsontable.\n   *\n   * @pro\n   * @type {String}\n   * @default 'trial'\n   */\n  licenseKey: 'trial',\n\n  /**\n   * @description\n   * Initial data source that will be bound to the data grid __by reference__ (editing data grid alters the data source).\n   * Can be declared as an Array of Arrays, Array of Objects or a Function.\n   *\n   * See [Understanding binding as reference](http://docs.handsontable.com/tutorial-data-binding.html#page-reference).\n   *\n   * @type {Array|Function}\n   * @default undefined\n   */\n  data: void 0,\n\n  /**\n   * @description\n   * Defines the structure of a new row when data source is an array of objects.\n   *\n   * See [data-schema](http://docs.handsontable.com/tutorial-data-sources.html#page-data-schema) for examples.\n   *\n   * @type {Object}\n   * @default undefined\n   */\n  dataSchema: void 0,\n\n  /**\n   * Width of the grid. Can be a value or a function that returns a value.\n   *\n   * @type {Number|Function}\n   * @default undefined\n   */\n  width: void 0,\n\n  /**\n   * Height of the grid. Can be a number or a function that returns a number.\n   *\n   * @type {Number|Function}\n   * @default undefined\n   */\n  height: void 0,\n\n  /**\n   * @description\n   * Initial number of rows.\n   *\n   * __Notice:__ This option only has effect in Handsontable constructor and only if `data` option is not provided\n   *\n   * @type {Number}\n   * @default 5\n   */\n  startRows: 5,\n\n  /**\n   * @description\n   * Initial number of columns.\n   *\n   * __Notice:__ This option only has effect in Handsontable constructor and only if `data` option is not provided\n   *\n   * @type {Number}\n   * @default 5\n   */\n  startCols: 5,\n\n  /**\n   * Setting `true` or `false` will enable or disable the default row headers (1, 2, 3).\n   * You can also define an array `['One', 'Two', 'Three', ...]` or a function to define the headers.\n   * If a function is set the index of the row is passed as a parameter.\n   *\n   * @type {Boolean|Array|Function}\n   * @default null\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * rowHeaders: true,\n   * ...\n   *\n   * ...\n   * // as array\n   * rowHeaders: [1, 2, 3],\n   * ...\n   *\n   * ...\n   * // as function\n   * rowHeaders: function(index) {\n   *   return index + ': AB';\n   * },\n   * ...\n   * ```\n   */\n  rowHeaders: void 0,\n\n  /**\n   * Setting `true` or `false` will enable or disable the default column headers (A, B, C).\n   * You can also define an array `['One', 'Two', 'Three', ...]` or a function to define the headers.\n   * If a function is set, then the index of the column is passed as a parameter.\n   *\n   * @type {Boolean|Array|Function}\n   * @default null\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * colHeaders: true,\n   * ...\n   *\n   * ...\n   * // as array\n   * colHeaders: ['A', 'B', 'C'],\n   * ...\n   *\n   * ...\n   * // as function\n   * colHeaders: function(index) {\n   *   return index + ': AB';\n   * },\n   * ...\n   * ```\n   */\n  colHeaders: null,\n\n  /**\n   * Defines column widths in pixels. Accepts number, string (that will be converted to a number),\n   * array of numbers (if you want to define column width separately for each column) or a\n   * function (if you want to set column width dynamically on each render).\n   *\n   * @type {Array|Function|Number|String}\n   * @default undefined\n   * @example\n   * ```js\n   * ...\n   * // as numeric, for each column.\n   * colWidths: 100,\n   * ...\n   *\n   * * ...\n   * // as string, for each column.\n   * colWidths: '100px',\n   * ...\n   *\n   * ...\n   * // as array, based on visual indexes. The rest of the columns have a default width.\n   * colWidths: [100, 120, 90],\n   * ...\n   *\n   * ...\n   * // as function, based on visual indexes.\n   * colWidths: function(index) {\n   *   return index * 10;\n   * },\n   * ...\n   * ```\n   */\n  colWidths: void 0,\n\n  /**\n   * Defines row heights in pixels. Accepts numbers, strings (that will be converted into a number),\n   * array of numbers (if you want to define row height separately for each row) or a\n   * function (if you want to set row height dynamically on each render).\n   * If the ManualRowResize or AutoRowSize plugins are enabled, this is also the minimum height that can be set\n   * via either of those two plugins.\n   * Height should be equal or greater than 23px. Table is rendered incorrectly if height is less than 23px.\n   *\n   * @type {Array|Function|Number|String}\n   * @default undefined\n   * @example\n   * ```js\n   * ...\n   * // as numeric, for each row.\n   * rowHeights: 100,\n   * ...\n   *\n   * * ...\n   * // as string, for each row.\n   * rowHeights: '100px',\n   * ...\n   *\n   * ...\n   * // as array, based on visual indexes. The rest of the rows have a default height.\n   * rowHeights: [100, 120, 90],\n   * ...\n   *\n   * ...\n   * // as function, based on visual indexes.\n   * rowHeights: function(index) {\n   *   return index * 10;\n   * },\n   * ...\n   * ```\n   */\n  rowHeights: void 0,\n\n  /**\n   * @description\n   * Defines the cell properties and data binding for certain columns.\n   *\n   * __Notice:__ Using this option sets a fixed number of columns (options `startCols`, `minCols`, `maxCols` will be ignored).\n   *\n   * See [documentation -> datasources.html](http://docs.handsontable.com/tutorial-data-sources.html#page-nested) for examples.\n   *\n   * @type {Array|Function}\n   * @default undefined\n   * @example\n   * ```js\n   * ...\n   * // as an array of objects. Order of the objects in array is representation of physical indexes.\n   * columns: [\n   *   {\n   *     // column options for the first column\n   *     type: 'numeric',\n   *     numericFormat: {\n   *       pattern: '0,0.00 $'\n   *     }\n   *   },\n   *   {\n   *     // column options for the second column\n   *     type: 'text',\n   *     readOnly: true\n   *   }\n   * ],\n   * ...\n   *\n   * // or as function, based on physical indexes\n   * ...\n   * columns: function(index) {\n  *    return {\n  *      type: index > 0 ? 'numeric' : 'text',\n  *      readOnly: index < 1\n  *    }\n   * }\n   * ...\n   * ```\n   */\n  columns: void 0,\n\n  /**\n   * @description\n   * Defines the cell properties for given `row`, `col`, `prop` coordinates.\n   * Any constructor or column option may be overwritten for a particular cell (row/column combination)\n   * using the `cells` property in the Handsontable constructor.\n   *\n   * __Note:__ Parameters `row` and `col` always represent __physical indexes__. Example below show how to execute\n   * operations based on the __visual__ representation of Handsontable.\n   *\n   * Possible values of `prop`:\n   * - property name for column's data source object, when dataset is an [array of objects](/tutorial-data-sources.html#page-object)\n   * - the same number as `col`, when dataset is an [array of arrays](/tutorial-data-sources.html#page-array)\n   *\n   * @type {Function}\n   * @default undefined\n   * @example\n   * ```js\n   * ...\n   * cells: function (row, col, prop) {\n   *   var cellProperties = {};\n   *   var visualRowIndex = this.instance.toVisualRow(row);\n   *   var visualColIndex = this.instance.toVisualColumn(col);\n   *\n   *   if (visualRowIndex === 0 && visualColIndex === 0) {\n   *     cellProperties.readOnly = true;\n   *   }\n   *\n   *   return cellProperties;\n   * },\n   * ...\n   * ```\n   */\n  cells: void 0,\n\n  /**\n   * Any constructor or column option may be overwritten for a particular cell (row/column combination), using `cell`\n   * array passed to the Handsontable constructor.\n   *\n   * @type {Array}\n   * @default []\n   * @example\n   * ```js\n   * ...\n   * cell: [\n   *   {row: 0, col: 0, readOnly: true}\n   * ],\n   * ...\n   * ```\n   */\n  cell: [],\n\n  /**\n   * @description\n   * If `true`, enables the {@link Comments} plugin, which enables an option to apply cell comments through the context menu\n   * (configurable with context menu keys `commentsAddEdit`, `commentsRemove`).\n   *\n   * To initialize Handsontable with predefined comments, provide cell coordinates and comment text values in a form of an array.\n   *\n   * See [Comments](http://docs.handsontable.com/demo-comments_.html) demo for examples.\n   *\n   * @since 0.11.0\n   * @type {Boolean|Array}\n   * @default false\n   * @example\n   * ```js\n   * ...\n   * comments: [{row: 1, col: 1, comment: {value: \"Test comment\"}}],\n   * ...\n   * ```\n   */\n  comments: false,\n\n  /**\n   * @description\n   * If `true`, enables the Custom Borders plugin, which enables an option to apply custom borders through the context menu (configurable with context menu key `borders`).\n   *\n   * To initialize Handsontable with predefined custom borders, provide cell coordinates and border styles in a form of an array.\n   *\n   * See [Custom Borders](http://docs.handsontable.com/demo-custom-borders.html) demo for examples.\n   *\n   * @since 0.11.0\n   * @type {Boolean|Array}\n   * @default false\n   * @example\n   * ```js\n   * ...\n   * customBorders: [\n   *   {range: {\n   *     from: {row: 1, col: 1},\n   *     to: {row: 3, col: 4}},\n   *     left: {},\n   *     right: {},\n   *     top: {},\n   *     bottom: {}\n   *   }\n   * ],\n   * ...\n   *\n   * // or\n   * ...\n   * customBorders: [\n   *   {row: 2, col: 2, left: {width: 2, color: 'red'},\n   *     right: {width: 1, color: 'green'}, top: '', bottom: ''}\n   * ],\n   * ...\n   * ```\n   */\n  customBorders: false,\n\n  /**\n   * Minimum number of rows. At least that number of rows will be created during initialization.\n   *\n   * @type {Number}\n   * @default 0\n   */\n  minRows: 0,\n\n  /**\n   * Minimum number of columns. At least that number of columns will be created during initialization.\n   *\n   * @type {Number}\n   * @default 0\n   */\n  minCols: 0,\n\n  /**\n   * Maximum number of rows. If set to a value lower than the initial row count, the data will be trimmed to the provided value as the number of rows.\n   *\n   * @type {Number}\n   * @default Infinity\n   */\n  maxRows: Infinity,\n\n  /**\n   * Maximum number of cols. If set to a value lower than the initial col count, the data will be trimmed to the provided value as the number of cols.\n   *\n   * @type {Number}\n   * @default Infinity\n   */\n  maxCols: Infinity,\n\n  /**\n   * When set to 1 (or more), Handsontable will add a new row at the end of grid if there are no more empty rows.\n   * (unless the number of rows exceeds the one set in the `maxRows` property)\n   *\n   * @type {Number}\n   * @default 0\n   */\n  minSpareRows: 0,\n\n  /**\n   * When set to 1 (or more), Handsontable will add a new column at the end of grid if there are no more empty columns.\n   * (unless the number of rows exceeds the one set in the `maxCols` property)\n   *\n   * @type {Number}\n   * @default 0\n   */\n  minSpareCols: 0,\n\n  /**\n   * If set to `false`, there won't be an option to insert new rows in the Context Menu.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  allowInsertRow: true,\n\n  /**\n   * If set to `false`, there won't be an option to insert new columns in the Context Menu.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  allowInsertColumn: true,\n\n  /**\n   * If set to `false`, there won't be an option to remove rows in the Context Menu.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  allowRemoveRow: true,\n\n  /**\n   * If set to `false`, there won't be an option to remove columns in the Context Menu.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  allowRemoveColumn: true,\n\n  /**\n   * @description\n   * Defines how the table selection reacts. The selection support three different behaviors defined as:\n   *  * `'single'` Only a single cell can be selected.\n   *  * `'range'` Multiple cells within a single range can be selected.\n   *  * `'multiple'` Multiple ranges of cells can be selected.\n   *\n   * To see how to interact with selection by getting selected data or change styles of the selected cells go to\n   * [https://docs.handsontable.com/demo-selecting-ranges.html](https://docs.handsontable.com/demo-selecting-ranges.html).\n   *\n   * @since 0.36.0\n   * @type {String}\n   * @default 'multiple'\n   */\n  selectionMode: 'multiple',\n\n  /**\n   * Enables the fill handle (drag-down and copy-down) functionality, which shows a small rectangle in bottom\n   * right corner of the selected area, that let's you expand values to the adjacent cells.\n   *\n   * Possible values: `true` (to enable in all directions), `'vertical'` or `'horizontal'` (to enable in one direction),\n   * `false` (to disable completely). Setting to `true` enables the fillHandle plugin.\n   *\n   * Since 0.23.0 you can pass object to plugin which allows you to add more options for this functionality. If `autoInsertRow`\n   * option is `true`, fill-handler will create new rows till it reaches the last row. It is enabled by default.\n   *\n   * @example\n   * ```js\n   * ...\n   * fillHandle: true // enable plugin in all directions and with autoInsertRow as true\n   * ...\n   * // or\n   * ...\n   * fillHandle: 'vertical' // enable plugin in vertical direction and with autoInsertRow as true\n   * ...\n   * // or\n   * ...\n   * fillHandle: { // enable plugin in both directions and with autoInsertRow as false\n   *   autoInsertRow: false,\n   * }\n   * // or\n   * ...\n   * fillHandle: { // enable plugin in vertical direction and with autoInsertRow as false\n   *   autoInsertRow: false,\n   *   direction: 'vertical' // 'vertical' or 'horizontal'\n   * }\n   * ```\n   *\n   * @type {Boolean|String|Object}\n   * @default true\n   */\n  fillHandle: true,\n\n  /**\n   * Allows to specify the number of fixed (or *frozen*) rows at the top of the table.\n   *\n   * @type {Number}\n   * @default 0\n   * @example\n   * ```js\n   * fixedRowsTop: 3 // This would freeze the top 3 rows of the table.\n   * ```\n   */\n  fixedRowsTop: 0,\n\n  /**\n   * Allows to specify the number of fixed (or *frozen*) rows at the bottom of the table.\n   *\n   * @pro\n   * @type {Number}\n   * @default 0\n   * @example\n   * ```js\n   * fixedRowsBottom: 3 // This would freeze the top 3 rows of the table.\n   * ```\n   */\n  fixedRowsBottom: 0,\n\n  /**\n   * Allows to specify the number of fixed (or *frozen*) columns on the left of the table.\n   *\n   * @type {Number}\n   * @default 0\n   * @example\n   * ```js\n   * fixedColumnsLeft: 3 // This would freeze the top 3 rows of the table.\n   * ```\n   */\n  fixedColumnsLeft: 0,\n\n  /**\n   * If `true`, mouse click outside the grid will deselect the current selection.\n   * Can be a function that takes the click event target and returns a boolean.\n   *\n   * @type {Boolean|Function}\n   * @default true\n   */\n  outsideClickDeselects: true,\n\n  /**\n   * If `true`, <kbd>ENTER</kbd> begins editing mode (like in Google Docs). If `false`, <kbd>ENTER</kbd> moves to next\n   * row (like Excel) and adds a new row if necessary. <kbd>TAB</kbd> adds new column if necessary.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  enterBeginsEditing: true,\n\n  /**\n   * Defines the cursor movement after <kbd>ENTER</kbd> was pressed (<kbd>SHIFT</kbd> + <kbd>ENTER</kbd> uses a negative vector).\n   * Can be an object or a function that returns an object. The event argument passed to the function\n   * is a DOM Event object received after the <kbd>ENTER</kbd> key has been pressed. This event object can be used to check\n   * whether user pressed <kbd>ENTER</kbd> or <kbd>SHIFT</kbd> + <kbd>ENTER</kbd>.\n   *\n   * @type {Object|Function}\n   * @default {row: 1, col: 0}\n   */\n  enterMoves: { row: 1, col: 0 },\n\n  /**\n   * Defines the cursor movement after <kbd>TAB</kbd> is pressed (<kbd>SHIFT</kbd> + <kbd>TAB</kbd> uses a negative vector).\n   * Can be an object or a function that returns an object. The event argument passed to the function\n   * is a DOM Event object received after the <kbd>TAB</kbd> key has been pressed. This event object can be used to check\n   * whether user pressed <kbd>TAB</kbd> or <kbd>SHIFT</kbd> + <kbd>TAB</kbd>.\n   *\n   * @type {Object}\n   * @default {row: 0, col: 1}\n   */\n  tabMoves: { row: 0, col: 1 },\n\n  /**\n   * If `true`, pressing <kbd>TAB</kbd> or right arrow in the last column will move to first column in next row.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  autoWrapRow: false,\n\n  /**\n   * If `true`, pressing <kbd>ENTER</kbd> or down arrow in the last row will move to the first row in the next column.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  autoWrapCol: false,\n\n  /**\n   * @description\n   * Turns on saving the state of column sorting, column positions and column sizes in local storage.\n   *\n   * You can save any sort of data in local storage to preserve table state between page reloads.\n   * In order to enable data storage mechanism, `persistentState` option must be set to `true` (you can set it\n   * either during Handsontable initialization or using the `updateSettings` method). When `persistentState` is enabled it exposes 3 hooks:\n   *\n   * __persistentStateSave__ (key: String, value: Mixed)\n   *\n   *   * Saves value under given key in browser local storage.\n   *\n   * __persistentStateLoad__ (key: String, valuePlaceholder: Object)\n   *\n   *   * Loads `value`, saved under given key, form browser local storage. The loaded `value` will be saved in `valuePlaceholder.value`\n   *     (this is due to specific behaviour of `Hooks.run()` method). If no value have been saved under key `valuePlaceholder.value`\n   *     will be `undefined`.\n   *\n   * __persistentStateReset__ (key: String)\n   *\n   *   * Clears the value saved under `key`. If no `key` is given, all values associated with table will be cleared.\n   *\n   * __Note:__ The main reason behind using `persistentState` hooks rather than regular LocalStorage API is that it\n   * ensures separation of data stored by multiple Handsontable instances. In other words, if you have two (or more)\n   * instances of Handsontable on one page, data saved by one instance won't be accessible by the second instance.\n   * Those two instances can store data under the same key and no data would be overwritten.\n   *\n   * __Important:__ In order for the data separation to work properly, make sure that each instance of Handsontable has a unique `id`.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  persistentState: void 0,\n\n  /**\n   * Class name for all visible rows in the current selection.\n   *\n   * @type {String}\n   * @default undefined\n   * @example\n   * ```js\n   * currentRowClassName: 'currentRow' // This will add a 'currentRow' class name to appropriate table cells.\n   * ```\n   */\n  currentRowClassName: void 0,\n\n  /**\n   * Class name for all visible columns in the current selection.\n   *\n   * @type {String}\n   * @default undefined\n   * @example\n   * ```js\n   * currentColClassName: 'currentColumn' // This will add a 'currentColumn' class name to appropriate table cells.\n   * ```\n   */\n  currentColClassName: void 0,\n\n  /**\n   * Class name for all visible headers in current selection.\n   *\n   * @type {String}\n   * @since 0.27.0\n   * @default 'ht__highlight'\n   * @example\n   * ```js\n   * currentHeaderClassName: 'ht__highlight' // This will add a 'ht__highlight' class name to appropriate table headers.\n   * ```\n   */\n  currentHeaderClassName: 'ht__highlight',\n\n  /**\n   * Class name for all active headers in selections. The header will be marked with this class name\n   * only when a whole column or row will be selected.\n   *\n   * @type {String}\n   * @since 0.38.2\n   * @default 'ht__active_highlight'\n   * @example\n   * ```js\n   * activeHeaderClassName: 'ht__active_highlight' // This will add a 'ht__active_highlight' class name to appropriate table headers.\n   * ```\n   */\n  activeHeaderClassName: 'ht__active_highlight',\n\n  /**\n   * Class name for the Handsontable container element.\n   *\n   * @type {String|Array}\n   * @default undefined\n   */\n  className: void 0,\n\n  /**\n   * Class name for all tables inside container element.\n   *\n   * @since 0.17.0\n   * @type {String|Array}\n   * @default undefined\n   */\n  tableClassName: void 0,\n\n  /**\n   * @description\n   * Defines how the columns react, when the declared table width is different than the calculated sum of all column widths.\n   * [See more](http://docs.handsontable.com/demo-stretching.html) mode. Possible values:\n   *  * `'none'` Disable stretching\n   *  * `'last'` Stretch only the last column\n   *  * `'all'` Stretch all the columns evenly\n   *\n   * @type {String}\n   * @default 'none'\n   */\n  stretchH: 'none',\n\n  /**\n   * Lets you overwrite the default `isEmptyRow` method, which checks if row at the provided index is empty.\n   *\n   * @type {Function}\n   * @param {Number} row Visual row index.\n   * @returns {Boolean}\n   */\n  isEmptyRow: function isEmptyRow(row) {\n    var col, colLen, value, meta;\n\n    for (col = 0, colLen = this.countCols(); col < colLen; col++) {\n      value = this.getDataAtCell(row, col);\n\n      if (value !== '' && value !== null && (0, _mixed.isDefined)(value)) {\n        if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') {\n          meta = this.getCellMeta(row, col);\n\n          return (0, _object.isObjectEqual)(this.getSchema()[meta.prop], value);\n        }\n        return false;\n      }\n    }\n\n    return true;\n  },\n\n\n  /**\n   * Lets you overwrite the default `isEmptyCol` method, which checks if column at the provided index is empty.\n   *\n   * @type {Function}\n   * @param {Number} col Visual column index\n   * @returns {Boolean}\n   */\n  isEmptyCol: function isEmptyCol(col) {\n    var row, rowLen, value;\n\n    for (row = 0, rowLen = this.countRows(); row < rowLen; row++) {\n      value = this.getDataAtCell(row, col);\n\n      if (value !== '' && value !== null && (0, _mixed.isDefined)(value)) {\n        return false;\n      }\n    }\n\n    return true;\n  },\n\n\n  /**\n   * When set to `true`, the table is re-rendered when it is detected that it was made visible in DOM.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  observeDOMVisibility: true,\n\n  /**\n   * If set to `true`, Handsontable will accept values that were marked as invalid by the cell `validator`.\n   * It will result with *invalid* cells being treated as *valid* (will save the *invalid* value into the Handsontable data source).\n   * If set to `false`, Handsontable will *not* accept the invalid values and won't allow the user to close the editor.\n   * This option will be particularly useful when used with the Autocomplete's `strict` mode.\n   *\n   * @type {Boolean}\n   * @default true\n   * @since 0.9.5\n   */\n  allowInvalid: true,\n\n  /**\n   * If set to `true`, Handsontable will accept values that are empty (`null`, `undefined` or `''`).\n   * If set to `false`, Handsontable will *not* accept the empty values and mark cell as invalid.\n   *\n   * @example\n   * ```js\n   * ...\n   * allowEmpty: true // allow empty values for all cells (whole table)\n   * ...\n   * // or\n   * ...\n   * columns: [\n   *   // allow empty values only for 'date' column\n   *   {data: 'date', dateFormat: 'DD/MM/YYYY', allowEmpty: true}\n   * ]\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   * @default true\n   * @since 0.23.0\n   */\n  allowEmpty: true,\n\n  /**\n   * CSS class name for cells that did not pass validation.\n   *\n   * @type {String}\n   * @default 'htInvalid'\n   */\n  invalidCellClassName: 'htInvalid',\n\n  /**\n   * When set to an non-empty string, displayed as the cell content for empty cells. If a value of a different type is provided,\n   * it will be stringified and applied as a string.\n   *\n   * @type {Mixed}\n   * @default false\n   */\n  placeholder: false,\n\n  /**\n   * CSS class name for cells that have a placeholder in use.\n   *\n   * @type {String}\n   * @default 'htPlaceholder'\n   */\n  placeholderCellClassName: 'htPlaceholder',\n\n  /**\n   * CSS class name for read-only cells.\n   *\n   * @type {String}\n   * @default 'htDimmed'\n   */\n  readOnlyCellClassName: 'htDimmed',\n\n  /**\n   * @description\n   * If a string is provided, it may be one of the following predefined values:\n   * * `autocomplete`,\n   * * `checkbox`,\n   * * `html`,\n   * * `numeric`,\n   * * `password`.\n   * * `text`.\n   *\n   * Or you can [register](http://docs.handsontable.com/demo-custom-renderers.html) the custom renderer under specified name and use\n   * its name as an alias in your configuration.\n   *\n   * If a function is provided, it will receive the following arguments:\n   * ```js\n   * function(instance, TD, row, col, prop, value, cellProperties) {}\n   * ```\n   *\n   * You can read more about custom renderes [in the documentation](http://docs.handsontable.com/demo-custom-renderers.html).\n   *\n   * @example\n   * ```js\n   * ...\n   * Handsontable.renderers.registerRenderer('my.renderer', function(instance, TD, row, col, prop, value, cellProperties) {\n   *   TD.innerHTML = value;\n   * });\n   * ...\n   * columns: [\n   *   {\n   *     editor: 'select',\n   *     renderer: 'autocomplete' // as string\n   *   },\n   *   {\n   *     renderer: 'my.renderer' // custom renderer as an alias\n   *   },\n   *   {\n   *     // renderer as custom function\n   *     renderer: function(hotInstance, TD, row, col, prop, value, cellProperties) {\n   *       TD.style.color = 'blue';\n   *       TD.innerHTML = value;\n   *     }\n   *   }\n   * ]\n   * ...\n   * ```\n   *\n   * @type {String|Function}\n   * @default undefined\n   */\n  renderer: void 0,\n\n  /**\n   * CSS class name added to the commented cells.\n   *\n   * @type {String}\n   * @default 'htCommentCell'\n   */\n  commentedCellClassName: 'htCommentCell',\n\n  /**\n   * If set to `true`, it enables the browser's native selection of a fragment of the text within a single cell, between adjacent cells or in a whole table.\n   * If set to `'cell'`, it enables the possibility of selecting a fragment of the text within a single cell's body.\n   *\n   * @type {Boolean|String}\n   * @default false\n   */\n  fragmentSelection: false,\n\n  /**\n   * @description\n   * Make cell [read only](http://docs.handsontable.com/demo-read-only.html).\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  readOnly: false,\n\n  /**\n   * @description\n   * When added to a `column` property, it skips the column on paste and pastes the data on the next column to the right.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  skipColumnOnPaste: false,\n\n  /**\n   * @description\n   * Setting to true enables the search plugin (see [demo](http://docs.handsontable.com/demo-search-for-values.html)).\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  search: false,\n\n  /**\n   * @description\n   * Shortcut to define the combination of the cell renderer, editor and validator for the column, cell or whole table.\n   *\n   * Possible values:\n   *  * [autocomplete](http://docs.handsontable.com/demo-autocomplete.html)\n   *  * [checkbox](http://docs.handsontable.com/demo-checkbox.html)\n   *  * [date](http://docs.handsontable.com/demo-date.html)\n   *  * [dropdown](http://docs.handsontable.com/demo-dropdown.html)\n   *  * [handsontable](http://docs.handsontable.com/demo-handsontable.html)\n   *  * [numeric](http://docs.handsontable.com/demo-numeric.html)\n   *  * [password](http://docs.handsontable.com/demo-password.html)\n   *  * text\n   *  * [time](http://docs.handsontable.com/demo-time.html)\n   *\n   * Or you can register the custom cell type under specified name and use\n   * its name as an alias in your configuration.\n   *\n   * @example\n   * ```js\n   * ...\n   * Handsontable.cellTypes.registerCellType('my.type', {\n   *   editor: MyEditorClass,\n   *   renderer: function(hot, td, row, col, prop, value, cellProperties) {\n   *     td.innerHTML = value;\n   *   },\n   *   validator: function(value, callback) {\n   *     callback(value === 'foo' ? true : false);\n   *   }\n   * });\n   * ...\n   * columns: [\n   *   {\n   *     type: 'text'\n   *   },\n   *   {\n   *     type: 'my.type' // an alias to custom type\n   *   },\n   *   {\n   *     type: 'checkbox'\n   *   }\n   * ]\n   * ...\n   * ```\n   *\n   * @type {String}\n   * @default 'text'\n   */\n  type: 'text',\n\n  /**\n   * @description\n   * Make cell copyable (pressing <kbd>CTRL</kbd> + <kbd>C</kbd> on your keyboard moves its value to system clipboard).\n   *\n   * __Note:__ this setting is `false` by default for cells with type `password`.\n   *\n   * @type {Boolean}\n   * @default true\n   * @since 0.10.2\n   */\n  copyable: true,\n\n  /**\n   * Defines the editor for the table/column/cell.\n   *\n   * If a string is provided, it may be one of the following predefined values:\n   *  * [autocomplete](http://docs.handsontable.com/demo-autocomplete.html)\n   *  * [checkbox](http://docs.handsontable.com/demo-checkbox.html)\n   *  * [date](http://docs.handsontable.com/demo-date.html)\n   *  * [dropdown](http://docs.handsontable.com/demo-dropdown.html)\n   *  * [handsontable](http://docs.handsontable.com/demo-handsontable.html)\n   *  * [mobile](http://docs.handsontable.com/demo-mobiles-and-tablets.html)\n   *  * [password](http://docs.handsontable.com/demo-password.html)\n   *  * [select](http://docs.handsontable.com/demo-select.html)\n   *  * text\n   *\n   * Or you can [register](http://docs.handsontable.com/tutorial-cell-editor.html#registering-an-editor) the custom editor under specified name and use\n   * its name as an alias in your configuration.\n   *\n   * To disable cell editing completely set `editor` property to `false`.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [\n   *   {\n   *     editor: 'select'\n   *   },\n   *   {\n   *     editor: false\n   *   }\n   * ]\n   * ...\n   * ```\n   *\n   * @type {String|Function|Boolean}\n   * @default 'text'\n   */\n  editor: void 0,\n\n  /**\n   * @description\n   * Autocomplete definitions. See [autocomplete demo](http://docs.handsontable.com/demo-autocomplete.html) for examples and definitions.\n   *\n   * @type {Array}\n   * @default undefined\n   */\n  autoComplete: void 0,\n\n  /**\n   * Control number of choices for the autocomplete (or dropdown) typed cells. After exceeding it, a scrollbar for the dropdown list of choices will appear.\n   *\n   * @since 0.18.0\n   * @type {Number}\n   * @default 10\n   */\n  visibleRows: 10,\n\n  /**\n   * Makes autocomplete or dropdown width the same as the edited cell width. If `false` then editor will be scaled\n   * according to its content.\n   *\n   * @since 0.17.0\n   * @type {Boolean}\n   * @default true\n   */\n  trimDropdown: true,\n\n  /**\n   * Setting to true enables the debug mode, currently used to test the correctness of the row and column\n   * header fixed positioning on a layer above the master table.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  debug: false,\n\n  /**\n   * When set to `true`, the text of the cell content is wrapped if it does not fit in the fixed column width.\n   *\n   * @type {Boolean}\n   * @default true\n   * @since 0.11.0\n   */\n  wordWrap: true,\n\n  /**\n   * CSS class name added to cells with cell meta `wordWrap: false`.\n   *\n   * @type {String}\n   * @default 'htNoWrap'\n   * @since 0.11.0\n   */\n  noWordWrapClassName: 'htNoWrap',\n\n  /**\n   * @description\n   * Defines if the right-click context menu should be enabled. Context menu allows to create new row or\n   * column at any place in the grid among [other features](http://docs.handsontable.com/demo-context-menu.html).\n   * Possible values:\n   * * `true` (to enable default options),\n   * * `false` (to disable completely)\n   * * an array of [predefined options](https://docs.handsontable.com/demo-context-menu.html#page-specific),\n   * * an object [with defined structure](http://docs.handsontable.com/demo-context-menu.html#page-custom)\n   *\n   * See [the context menu demo](http://docs.handsontable.com/demo-context-menu.html) for examples.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as a boolean\n   * contextMenu: true\n   * ...\n   * // as an array\n   * contextMenu: ['row_above', 'row_below', '--------', 'undo', 'redo']\n   * ...\n   * ```\n   * ...\n   * // as an object (`name` attribute is required in the custom keys)\n   * contextMenu: {\n   *   items: {\n   *     \"option1\": {\n   *       name: \"option1\"\n   *     },\n   *     \"option2\": {\n   *       name: \"option2\",\n   *       submenu: {\n   *         items: [\n   *           {\n   *             key: \"option2:suboption1\",\n   *             name: \"option2:suboption1\",\n   *             callback: function(key, options) {\n   *               ...\n   *             }\n   *           },\n   *           ...\n   *         ]\n   *       }\n   *     }\n   *   }\n   * }\n   * ...\n   * ```\n   * @type {Boolean|Array|Object}\n   * @default undefined\n   */\n  contextMenu: void 0,\n\n  /**\n   * @description\n   * Disable or enable the copy/paste functionality.\n   *\n   * @example\n   * ```js\n   * ...\n   * copyPaste: false,\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  copyPaste: true,\n\n  /**\n   * If `true`, undo/redo functionality is enabled.\n   *\n   * @type {Boolean}\n   * @default undefined\n   */\n  undo: void 0,\n\n  /**\n   * @description\n   * Turns on [Column sorting](http://docs.handsontable.com/demo-sorting-data.html).\n   * Can be either a boolean (true/false) or an object with a declared sorting options. See the below example:\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * columnSorting: true\n   * ...\n   * // as a object with initial order (sort ascending column at index 2)\n   * columnSorting: {\n   *   column: 2,\n   *   sortOrder: true, // true = ascending, false = descending, undefined = original order\n   *   sortEmptyCells: true // true = the table sorts empty cells, false = the table moves all empty cells to the end of the table\n   * }\n   * ...\n   * ```\n   *\n   * @type {Boolean|Object}\n   * @default undefined\n   */\n  columnSorting: void 0,\n\n  /**\n   * @description\n   * Turns on [Manual column move](http://docs.handsontable.com/demo-moving-rows-and-columns.html), if set to a boolean or define initial\n   * column order, if set to an array of column indexes.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * manualColumnMove: true\n   * ...\n   * // as a array with initial order (move column index at 0 to 1 and move column index at 1 to 4)\n   * manualColumnMove: [1, 4]\n   * ...\n   * ```\n   *\n   * @type {Boolean|Array}\n   * @default undefined\n   */\n  manualColumnMove: void 0,\n\n  /**\n   * @description\n   * Turns on [Manual column resize](http://docs.handsontable.com/demo-resizing.html), if set to a boolean or define initial\n   * column resized widths, if set to an array of numbers.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * manualColumnResize: true\n   * ...\n   * // as a array with initial widths (column at 0 index has 40px and column at 1 index has 50px)\n   * manualColumnResize: [40, 50]\n   * ...\n   * ```\n   *\n   * @type {Boolean|Array}\n   * @default undefined\n   */\n  manualColumnResize: void 0,\n\n  /**\n   * @description\n   * Turns on [Manual row move](http://docs.handsontable.com/demo-moving-rows-and-columns.html), if set to a boolean or define initial\n   * row order, if set to an array of row indexes.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * manualRowMove: true\n   * ...\n   * // as a array with initial order (move row index at 0 to 1 and move row index at 1 to 4)\n   * manualRowMove: [1, 4]\n   * ...\n   * ```\n   *\n   * @type {Boolean|Array}\n   * @default undefined\n   * @since 0.11.0\n   */\n  manualRowMove: void 0,\n\n  /**\n   * @description\n   * Turns on [Manual row resize](http://docs.handsontable.com/demo-resizing.html), if set to a boolean or define initial\n   * row resized heights, if set to an array of numbers.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * manualRowResize: true\n   * ...\n   * // as a array with initial heights (row at 0 index has 40px and row at 1 index has 50px)\n   * manualRowResize: [40, 50]\n   * ...\n   * ```\n   *\n   * @type {Boolean|Array}\n   * @default undefined\n   * @since 0.11.0\n   */\n  manualRowResize: void 0,\n\n  /**\n   * @description\n   * If set to `true`, it enables a possibility to merge cells. If set to an array of objects, it merges the cells provided in the objects (see the example below).\n   * [More information on the demo page.](http://docs.handsontable.com/demo-merge-cells.html)\n   *\n   * @example\n   * ```js\n   * // enables the mergeCells plugin:\n   * margeCells: true\n   * ...\n   * // declares a list of merged sections:\n   * mergeCells: [\n   *   {row: 1, col: 1, rowspan: 3, colspan: 3}, // rowspan and colspan properties declare the width and height of a merged section in cells\n   *   {row: 3, col: 4, rowspan: 2, colspan: 2},\n   *   {row: 5, col: 6, rowspan: 3, colspan: 3}\n   * ]\n   * ```\n   * @type {Boolean|Array}\n   * @default false\n   */\n  mergeCells: false,\n\n  /**\n   * Number of rows to be rendered outside of the visible part of the table.\n   * By default, it's set to `'auto'`, which makes Handsontable to attempt to calculate the best offset performance-wise.\n   *\n   * You may test out different values to find the best one that works for your specific implementation.\n   *\n   * @type {Number|String}\n   * @default 'auto'\n   */\n  viewportRowRenderingOffset: 'auto',\n\n  /**\n   * Number of columns to be rendered outside of the visible part of the table.\n   * By default, it's set to `'auto'`, which makes Handsontable try calculating the best offset performance-wise.\n   *\n   * You may experiment with the value to find the one that works best for your specific implementation.\n   *\n   * @type {Number|String}\n   * @default 'auto'\n   */\n  viewportColumnRenderingOffset: 'auto',\n\n  /**\n   * A function, regular expression or a string, which will be used in the process of cell validation.\n   * If a function is used, be sure to execute the callback argument with either `true` (`callback(true)`) if the validation passed\n   * or with `false` (`callback(false)`), if the validation failed.\n   * Note, that `this` in the function points to the `cellProperties` object.\n   *\n   * If a string is provided, it may be one of the following predefined values:\n   * * `autocomplete`,\n   * * `date`,\n   * * `numeric`,\n   * * `time`.\n   *\n   * Or you can [register](http://docs.handsontable.com/demo-data-validation.html) the validator function under specified name and use\n   * its name as an alias in your configuration.\n   *\n   * See more [in the demo](http://docs.handsontable.com/demo-data-validation.html).\n   *\n   * @example\n   * ```js\n   * // as a function\n   * columns: [\n   *    {\n   *      validator: function(value, callback) { // validation rules }\n   *    }\n   * ]\n   * ...\n   * // as a regexp\n   * columns: [\n   *    {\n   *      validator: /^[0-9]$/ // regular expression\n   *    }\n   * ]\n   * // as a string\n   * columns: [\n   *    {\n   *      validator: 'numeric'\n   *    }\n   * ]\n   * ```\n   * @type {Function|RegExp|String}\n   * @default undefined\n   * @since 0.9.5\n   */\n  validator: void 0,\n\n  /**\n   * @description\n   * Disable visual cells selection.\n   *\n   * Possible values:\n   *  * `true` - Disables any type of visual selection (current and area selection),\n   *  * `false` - Enables any type of visual selection. This is default value.\n   *  * `'current'` - Disables the selection of a currently selected cell, the area selection is still present.\n   *  * `'area'` - Disables the area selection, the currently selected cell selection is still present.\n   *  * `'header'` - Disables the headers selection, the currently selected cell selection is still present (available since 0.36.0).\n   *\n   * @type {Boolean|String|Array}\n   * @default false\n   * @since 0.13.2\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * disableVisualSelection: true,\n   * ...\n   *\n   * ...\n   * // as string ('current', 'area' or 'header')\n   * disableVisualSelection: 'current',\n   * ...\n   *\n   * ...\n   * // as array\n   * disableVisualSelection: ['current', 'area'],\n   * ...\n   * ```\n   */\n  disableVisualSelection: false,\n\n  /**\n   * @description\n   * Set whether to display the current sorting order indicator (a triangle icon in the column header, specifying the sorting order).\n   *\n   * @type {Boolean}\n   * @default false\n   * @since 0.15.0-beta3\n   */\n  sortIndicator: void 0,\n\n  /**\n   * Disable or enable ManualColumnFreeze plugin.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  manualColumnFreeze: void 0,\n\n  /**\n   * @description\n   * Defines whether Handsontable should trim the whitespace at the beginning and the end of the cell contents.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  trimWhitespace: true,\n\n  settings: void 0,\n\n  /**\n   * @description\n   * Defines data source for Autocomplete or Dropdown cell types.\n   *\n   * @example\n   * ```js\n   * ...\n   * // source as a array\n   * columns: [{\n   *   type: 'autocomplete',\n   *   source: ['A', 'B', 'C', 'D']\n   * }]\n   * ...\n   * // source as a function\n   * columns: [{\n   *   type: 'autocomplete',\n   *   source: function(query, callback) {\n   *     fetch('http://example.com/query?q=' + query, function(response) {\n   *       callback(response.items);\n   *     })\n   *   }\n   * }]\n   * ...\n   * ```\n   *\n   * @type {Array|Function}\n   * @default undefined\n   */\n  source: void 0,\n\n  /**\n   * @description\n   * Defines the column header name.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *     title: 'First name',\n   *     type: 'text',\n   *   },\n   *   {\n   *     title: 'Last name',\n   *     type: 'text',\n   *   }]\n   * ...\n   * ```\n   *\n   * @type {String}\n   * @default undefined\n   */\n  title: void 0,\n\n  /**\n   * Data template for `'checkbox'` type when checkbox is checked.\n   *\n   * @example\n   * ```js\n   * checkedTemplate: 'good'\n   *\n   * // if a checkbox-typed cell is checked, then getDataAtCell(x,y), where x and y are the coordinates of the cell\n   * // will return 'good'.\n   * ```\n   * @type {Boolean|String}\n   * @default true\n   */\n  checkedTemplate: void 0,\n\n  /**\n   * Data template for `'checkbox'` type when checkbox is unchecked.\n   *\n   * @example\n   * ```js\n   * uncheckedTemplate: 'bad'\n   *\n   * // if a checkbox-typed cell is not checked, then getDataAtCell(x,y), where x and y are the coordinates of the cell\n   * // will return 'bad'.\n   * ```\n   * @type {Boolean|String}\n   * @default false\n   */\n  uncheckedTemplate: void 0,\n\n  /**\n   * @description\n   * Object which describes if renderer should create checkbox element with label element as a parent. Option desired for\n   * [checkbox](http://docs.handsontable.com/demo-checkbox.html)-typed cells.\n   *\n   * By default the [checkbox](http://docs.handsontable.com/demo-checkbox.html) renderer renders the checkbox without a label.\n   *\n   * Possible object properties:\n   *  * `property` - Defines the property name of the data object, which will to be used as a label.\n   *  (eg. `label: {property: 'name.last'}`). This option works only if data was passed as an array of objects.\n   *  * `position` - String which describes where to place the label text (before or after checkbox element).\n   * Valid values are `'before'` and '`after`' (defaults to `'after'`).\n   *  * `value` - String or a Function which will be used as label text.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'checkbox',\n   *   label: {position: 'after', value: 'My label: '}\n   * }]\n   * ...\n   * ```\n   *\n   * @since 0.19.0\n   * @type {Object}\n   * @default undefined\n   */\n  label: void 0,\n\n  /**\n   * Display format. This option is desired for [numeric-typed](http://docs.handsontable.com/demo-numeric.html) cells. Format is described by two properties:\n   *\n   * - pattern, which is handled by `numbro` for purpose of formatting numbers to desired pattern. List of supported patterns can be found [here](http://numbrojs.com/format.html#numbers).\n   * - culture, which is handled by `numbro` for purpose of formatting currencies. Examples showing how it works can be found [here](http://numbrojs.com/format.html#currency). List of supported cultures can be found [here](http://numbrojs.com/languages.html#supported-languages).\n   *\n   * __Note:__ Please keep in mind that this option is used only to format the displayed output! It has no effect on the input data provided for the cell. The numeric data can be entered to the table only as floats (separated by a dot or a comma) or integers, and are stored in the source dataset as JavaScript numbers.\n   *\n   * Since 0.26.0 Handsontable uses [numbro](http://numbrojs.com/) as a main library for numbers formatting.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'numeric',\n   *   numericFormat: {\n   *     pattern: '0,00',\n   *     culture: 'en-US'\n   *   }\n   * }]\n   * ...\n   * ```\n   *\n   * @since 0.35.0\n   * @type {Object}\n   */\n  numericFormat: void 0,\n\n  /**\n   * Language for Handsontable translation. Possible language codes are: `en-US`, `pl-PL`.\n   *\n   * @type {String}\n   * @default 'en-US'\n   */\n  language: void 0,\n\n  /**\n   * @description\n   * Data source for [select](http://docs.handsontable.com/demo-select.html)-typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   editor: 'select',\n   *   selectOptions: ['A', 'B', 'C'],\n   * }]\n   * ...\n   * ```\n   *\n   * @type {Array}\n   */\n  selectOptions: void 0,\n\n  /**\n   * Enables or disables the autoColumnSize plugin. Default value is `undefined`, which has the same effect as `true`.\n   * Disabling this plugin can increase performance, as no size-related calculations would be done.\n   *\n   * Column width calculations are divided into sync and async part. Each of this parts has their own advantages and\n   * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous operations don't\n   * block the browser UI.\n   *\n   * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value.\n   * `syncLimit` option is available since 0.16.0.\n   *\n   * You can also use the `useHeaders` option to take the column headers with into calculation.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as a number (300 columns in sync, rest async)\n   * autoColumnSize: {syncLimit: 300},\n   * ...\n   *\n   * ...\n   * // as a string (percent)\n   * autoColumnSize: {syncLimit: '40%'},\n   * ...\n   *\n   * ...\n   * // use headers width while calculation the column width\n   * autoColumnSize: {useHeaders: true},\n   * ...\n   *\n   * ```\n   *\n   * @type {Object|Boolean}\n   * @default {syncLimit: 50}\n   */\n  autoColumnSize: void 0,\n\n  /**\n   * Enables or disables autoRowSize plugin. Default value is `undefined`, which has the same effect as `false` (disabled).\n   * Enabling this plugin can decrease performance, as size-related calculations would be performed.\n   *\n   * Row height calculations are divided into sync and async stages. Each of these stages has their own advantages and\n   * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous operations don't\n   * block the browser UI.\n   *\n   * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value.\n   * `syncLimit` options is available since 0.16.0.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as number (300 columns in sync, rest async)\n   * autoRowSize: {syncLimit: 300},\n   * ...\n   *\n   * ...\n   * // as string (percent)\n   * autoRowSize: {syncLimit: '40%'},\n   * ...\n   * ```\n   * @type {Object|Boolean}\n   * @default {syncLimit: 1000}\n   */\n  autoRowSize: void 0,\n\n  /**\n   * Date validation format.\n   *\n   * Option desired for `'date'` - typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'date',\n   *   dateFormat: 'MM/DD/YYYY'\n   * }]\n   * ...\n   * ```\n   *\n   * @type {String}\n   * @default 'DD/MM/YYYY'\n   */\n  dateFormat: void 0,\n\n  /**\n   * If `true` then dates will be automatically formatted to match the desired format.\n   *\n   * Option desired for `'date'`-typed typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'date',\n   *   dateFormat: 'YYYY-MM-DD',\n   *   correctFormat: true\n   * }]\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  correctFormat: false,\n\n  /**\n   * Definition of default value which will fill the empty cells.\n   *\n   * Option desired for `'date'`-typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'date',\n   *   defaultData: '2015-02-02'\n   * }]\n   * ...\n   * ```\n   *\n   * @type {String}\n   */\n  defaultDate: void 0,\n\n  /**\n   * If set to `true`, the value entered into the cell must match (case-sensitive) the autocomplete source. Otherwise, cell won't pass the validation.\n   * When filtering the autocomplete source list, the editor will be working in case-insensitive mode.\n   *\n   * Option desired for `autocomplete`-typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'autocomplete',\n   *   source: ['A', 'B', 'C'],\n   *   strict: true\n   * }]\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   */\n  strict: void 0,\n\n  /**\n   * @description\n   * If typed `true`, data defined in `source` of the autocomplete or dropdown cell will be treated as HTML.\n   *\n   * __Warning:__ Enabling this option can cause serious XSS vulnerabilities.\n   *\n   * Option desired for `'autocomplete'`-typed cells.\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'autocomplete',\n   *   allowHtml: true,\n   *   source: ['<b>foo</b>', '<b>bar</b>']\n   * }]\n   * ...\n   * ```\n   * @type {Boolean}\n   * @default false\n   */\n  allowHtml: false,\n\n  /**\n   * If typed `true` then virtual rendering mechanism for handsontable will be disabled.\n   *\n   * @type {Boolean}\n   */\n  renderAllRows: void 0,\n\n  /**\n   * Prevents table to overlap outside the parent element. If `'horizontal'` option is chosen then table will appear horizontal\n   * scrollbar in case where parent's width is narrower then table's width.\n   *\n   * Possible values:\n   *  * `false` - Disables functionality (Default option).\n   *  * `horizontal` - Prevents horizontal overflow table.\n   *  * `vertical` - Prevents vertical overflow table (Not implemented yet).\n   *\n   * @since 0.20.3\n   * @example\n   * ```js\n   * ...\n   * preventOverflow: 'horizontal'\n   * ...\n   * ```\n   *\n   * @type {String|Boolean}\n   */\n  preventOverflow: false,\n\n  /**\n   * @description\n   * Plugin allowing binding the table rows with their headers.\n   * If the plugin is enabled, the table row headers will \"stick\" to the rows, when they are hidden/moved. Basically, if at the initialization\n   * row 0 has a header titled \"A\", it will have it no matter what you do with the table.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|String}\n   * @example\n   *\n   * ```js\n   * ...\n   * var hot = new Handsontable(document.getElementById('example'), {\n   *   date: getData(),\n   *   bindRowsWithHeaders: true\n   * });\n   * ...\n   * ```\n   *\n   */\n  bindRowsWithHeaders: void 0,\n\n  /**\n   * @description\n   * The CollapsibleColumns plugin allows collapsing of columns, covered by a header with the `colspan` property defined.\n   *\n   * Clicking the \"collapse/expand\" button collapses (or expands) all \"child\" headers except the first one.\n   *\n   * Setting the `collapsibleColumns` property to `true` will display a \"collapse/expand\" button in every header with a defined\n   * `colspan` property.\n   *\n   * To limit this functionality to a smaller group of headers, define the `collapsibleColumns` property as an array of objects, as in\n   * the example below.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Array}\n   * @example\n   * ```js\n   * ...\n   *  collapsibleColumns: [\n   *    {row: -4, col: 1, collapsible: true},\n   *    {row: -3, col: 5, collapsible: true}\n   *  ]\n   * ...\n   * // or\n   * ...\n   *  collapsibleColumns: true\n   * ...\n   * ```\n   */\n  collapsibleColumns: void 0,\n\n  /**\n   * @description\n   * Allows making pre-defined calculations on the cell values and display the results within Handsontable.\n   * See the demo for more information.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Object}\n   */\n  columnSummary: void 0,\n\n  /**\n   * This plugin allows adding a configurable dropdown menu to the table's column headers.\n   * The dropdown menu acts like the Context Menu, but is triggered by clicking the button in the header.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Object|Array}\n   */\n  dropdownMenu: void 0,\n\n  /**\n   * The filters plugin.\n   * It allows filtering the table data either by the built-in component or with the API.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean}\n   */\n  filters: void 0,\n\n  /**\n   * It allows Handsontable to process formula expressions defined in the provided data.\n   *\n   * @pro\n   * @since 1.7.0\n   * @type {Boolean}\n   */\n  formulas: void 0,\n\n  /**\n   * @description\n   * GanttChart plugin enables a possibility to create a Gantt chart using a Handsontable instance.\n   * In this case, the whole table becomes read-only.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Object}\n   */\n  ganttChart: void 0,\n\n  /**\n   * @description\n   * Allows adding a tooltip to the table headers.\n   *\n   * Available options:\n   * * the `rows` property defines if tooltips should be added to row headers,\n   * * the `columns` property defines if tooltips should be added to column headers,\n   * * the `onlyTrimmed` property defines if tooltips should be added only to headers, which content is trimmed by the header itself (the content being wider then the header).\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Object}\n   */\n  headerTooltips: void 0,\n\n  /**\n   * Plugin allowing hiding of certain columns.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Object}\n   */\n  hiddenColumns: void 0,\n\n  /**\n   * @description\n   * Plugin allowing hiding of certain rows.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Object}\n   */\n  hiddenRows: void 0,\n\n  /**\n   * @description\n   * Allows creating a nested header structure, using the HTML's colspan attribute.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Array}\n   */\n  nestedHeaders: void 0,\n\n  /**\n   * @description\n   * Plugin allowing hiding of certain rows.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Array}\n   */\n  trimRows: void 0,\n\n  /**\n   * @description\n   * Allows setting a custom width of the row headers. You can provide a number or an array of widths, if many row header levels are defined.\n   *\n   * @since 0.22.0\n   * @type {Number|Array}\n   */\n  rowHeaderWidth: void 0,\n\n  /**\n   * @description\n   * Allows setting a custom height of the column headers. You can provide a number or an array of heights, if many column header levels are defined.\n   *\n   * @since 0.22.0\n   * @type {Number|Array}\n   */\n  columnHeaderHeight: void 0,\n\n  /**\n   * @description\n   * Enabling this plugin switches table into one-way data binding where changes are applied into data source (from outside table)\n   * will be automatically reflected in the table.\n   *\n   * For every data change [afterChangesObserved](Hooks.html#event:afterChangesObserved) hook will be fired.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  observeChanges: void 0,\n\n  /**\n   * @description\n   * When passed to the `column` property, allows specifying a custom sorting function for the desired column.\n   *\n   * @since 0.24.0\n   * @type {Function}\n   * @example\n   * ```js\n   * columns: [\n   *   {\n   *     sortFunction: function(sortOrder) {\n   *        return function(a, b) {\n   *          // sorting function body.\n   *          //\n   *          // Function parameters:\n   *          // sortOrder: If true, the order is ascending, if false - descending. undefined = original order\n   *          // a, b: Two compared elements. These are 2-element arrays, with the first element being the row index, the second - cell value.\n   *        }\n   *     }\n   *   }\n   * ]\n   * ```\n   */\n  sortFunction: void 0,\n\n  /**\n   * If defined as 'true', the Autocomplete's suggestion list would be sorted by relevance (the closer to the left the match is, the higher the suggestion).\n   *\n   * Option desired for cells of the `'autocomplete'` type.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  sortByRelevance: true,\n\n  /**\n   * If defined as 'true', when the user types into the input area the Autocomplete's suggestion list is updated to only\n   * include those choices starting with what has been typed; if defined as 'false' all suggestions remain shown, with\n   * those matching what has been typed marked in bold.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  filter: true,\n\n  /**\n   * If defined as 'true', filtering in the Autocomplete Editor will be case-sensitive.\n   *\n   * @type {Boolean}\n   * @default: false\n   */\n  filteringCaseSensitive: false,\n\n  /**\n   * @description\n   * Disable or enable the drag to scroll functionality.\n   *\n   * @example\n   * ```js\n   * ...\n   * dragToScroll: false,\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  dragToScroll: true\n};\n\nexports.default = DefaultSettings;\n\n/***/ }),\n/* 196 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getTranslatedPhrase = getTranslatedPhrase;\n\nvar _array = __webpack_require__(1);\n\nvar _dictionariesManager = __webpack_require__(71);\n\nvar _phraseFormatters = __webpack_require__(270);\n\nvar _mixed = __webpack_require__(16);\n\n/**\n * Get phrase for specified dictionary key.\n *\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n * @param {String} dictionaryKey Constant which is dictionary key.\n * @param {*} argumentsForFormatters Arguments which will be handled by formatters.\n *\n * @returns {String}\n */\n// eslint-disable-next-line import/prefer-default-export\nfunction getTranslatedPhrase(languageCode, dictionaryKey, argumentsForFormatters) {\n  var languageDictionary = (0, _dictionariesManager.getLanguageDictionary)(languageCode);\n\n  if (languageDictionary === null) {\n    return null;\n  }\n\n  var phrasePropositions = languageDictionary[dictionaryKey];\n\n  if ((0, _mixed.isUndefined)(phrasePropositions)) {\n    return null;\n  }\n\n  var formattedPhrase = getFormattedPhrase(phrasePropositions, argumentsForFormatters);\n\n  if (Array.isArray(formattedPhrase)) {\n    return formattedPhrase[0];\n  }\n\n  return formattedPhrase;\n}\n\n/**\n * Get formatted phrase from phrases propositions for specified dictionary key.\n *\n * @private\n * @param {Array|string} phrasePropositions List of phrase propositions.\n * @param {*} argumentsForFormatters Arguments which will be handled by formatters.\n *\n * @returns {Array|string}\n */\nfunction getFormattedPhrase(phrasePropositions, argumentsForFormatters) {\n  var formattedPhrasePropositions = phrasePropositions;\n\n  (0, _array.arrayEach)((0, _phraseFormatters.getPhraseFormatters)(), function (formatter) {\n    formattedPhrasePropositions = formatter(phrasePropositions, argumentsForFormatters);\n  });\n\n  return formattedPhrasePropositions;\n}\n\n/***/ }),\n/* 197 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _templateObject = _taggedTemplateLiteral(['Language with code \"', '\" was not found. You should register particular language \\n    before using it. Read more about this issue at: https://docs.handsontable.com/i18n/missing-language-code.'], ['Language with code \"', '\" was not found. You should register particular language \\n    before using it. Read more about this issue at: https://docs.handsontable.com/i18n/missing-language-code.']);\n\nexports.extendNotExistingKeys = extendNotExistingKeys;\nexports.createCellHeadersRange = createCellHeadersRange;\nexports.normalizeLanguageCode = normalizeLanguageCode;\nexports.applyLanguageSetting = applyLanguageSetting;\nexports.warnUserAboutLanguageRegistration = warnUserAboutLanguageRegistration;\n\nvar _mixed = __webpack_require__(16);\n\nvar _object = __webpack_require__(2);\n\nvar _console = __webpack_require__(56);\n\nvar _templateLiteralTag = __webpack_require__(41);\n\nvar _dictionariesManager = __webpack_require__(71);\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\n/**\n * Perform shallow extend of a target object with only this extension's properties which doesn't exist in the target.\n *\n * @param {Object} target An object that will receive the new properties.\n * @param {Object} extension An object containing additional properties to merge into the target.\n */\n// TODO: Maybe it should be moved to global helpers? It's changed `extend` function.\nfunction extendNotExistingKeys(target, extension) {\n  (0, _object.objectEach)(extension, function (value, key) {\n    if ((0, _mixed.isUndefined)(target[key])) {\n      target[key] = value;\n    }\n  });\n\n  return target;\n}\n\n/**\n * Create range of values basing on cell indexes. For example, it will create below ranges for specified function arguments:\n *\n * createCellHeadersRange(2, 7) => `2-7`\n * createCellHeadersRange(7, 2) => `2-7`\n * createCellHeadersRange(0, 4, 'A', 'D') => `A-D`\n * createCellHeadersRange(4, 0, 'D', 'A') => `A-D`\n *\n * @param {number} firstRowIndex Index of \"first\" cell\n * @param {number} nextRowIndex Index of \"next\" cell\n * @param {*} fromValue Value which will represent \"first\" cell\n * @param {*} toValue Value which will represent \"next\" cell\n * @returns {String} Value representing range i.e. A-Z, 11-15.\n */\nfunction createCellHeadersRange(firstRowIndex, nextRowIndex) {\n  var fromValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : firstRowIndex;\n  var toValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : nextRowIndex;\n\n  // Will swap `fromValue` with `toValue` if it's necessary.\n  if (firstRowIndex > nextRowIndex) {\n    var _ref = [toValue, fromValue];\n    fromValue = _ref[0];\n    toValue = _ref[1];\n  }\n\n  return fromValue + '-' + toValue;\n}\n\n/**\n * Normalize language code. It takes handled languageCode proposition and change it to proper languageCode.\n * For example, when it takes `eN-us` as parameter it return `en-US`\n *\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n * @returns {String}\n */\nfunction normalizeLanguageCode(languageCode) {\n  var languageCodePattern = /^([a-zA-Z]{2})-([a-zA-Z]{2})$/;\n  var partsOfLanguageCode = languageCodePattern.exec(languageCode);\n\n  if (partsOfLanguageCode) {\n    return partsOfLanguageCode[1].toLowerCase() + '-' + partsOfLanguageCode[2].toUpperCase();\n  }\n\n  return languageCode;\n}\n\n/**\n * Set proper start language code. User may set language code which is not proper.\n *\n * @param {Object} settings Settings object.\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n * @returns {String}\n */\nfunction applyLanguageSetting(settings, languageCode) {\n  var normalizedLanguageCode = normalizeLanguageCode(languageCode);\n\n  if ((0, _dictionariesManager.hasLanguageDictionary)(normalizedLanguageCode)) {\n    settings.language = normalizedLanguageCode;\n  } else {\n    settings.language = _dictionariesManager.DEFAULT_LANGUAGE_CODE;\n\n    warnUserAboutLanguageRegistration(languageCode);\n  }\n}\n\n/**\n *\n * Warn user if there is no registered language.\n *\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n */\nfunction warnUserAboutLanguageRegistration(languageCode) {\n  if ((0, _mixed.isDefined)(languageCode)) {\n    (0, _console.error)((0, _templateLiteralTag.toSingleLine)(_templateObject, languageCode));\n  }\n}\n\n/***/ }),\n/* 198 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.stopObserving = exports.startObserving = exports.isPressedCtrlKey = exports.isPressed = exports._resetState = exports._getRefCount = undefined;\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _unicode = __webpack_require__(21);\n\nvar _array = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar eventManager = new _eventManager2.default();\nvar pressedKeys = new Set();\nvar refCount = 0;\n\n/**\n * Begins observing keyboard keys states.\n */\nfunction startObserving() {\n  if (refCount === 0) {\n    eventManager.addEventListener(document, 'keydown', function (event) {\n      if (!pressedKeys.has(event.keyCode)) {\n        pressedKeys.add(event.keyCode);\n      }\n    });\n    eventManager.addEventListener(document, 'keyup', function (event) {\n      if (pressedKeys.has(event.keyCode)) {\n        pressedKeys.delete(event.keyCode);\n      }\n    });\n    eventManager.addEventListener(document, 'visibilitychange', function () {\n      if (document.hidden) {\n        pressedKeys.clear();\n      }\n    });\n  }\n\n  refCount += 1;\n}\n\n/**\n * Stops observing keyboard keys states and clear all previously saved states.\n */\nfunction stopObserving() {\n  if (refCount > 0) {\n    refCount -= 1;\n  }\n\n  if (refCount === 0) {\n    _resetState();\n  }\n}\n\n/**\n * Remove all listeners attached to the DOM and clear all previously saved states.\n */\nfunction _resetState() {\n  eventManager.clearEvents();\n  pressedKeys.clear();\n  refCount = 0;\n}\n\n/**\n * Checks if provided keyCode or keyCodes are pressed.\n *\n * @param {String} keyCodes The key codes passed as a string defined in helpers/unicode.js file delimited with '|'.\n * @return {Boolean}\n */\nfunction isPressed(keyCodes) {\n  return Array.from(pressedKeys.values()).some(function (_keyCode) {\n    return (0, _unicode.isKey)(_keyCode, keyCodes);\n  });\n}\n\n/**\n * Checks if ctrl keys are pressed.\n *\n * @return {Boolean}\n */\nfunction isPressedCtrlKey() {\n  return Array.from(pressedKeys.values()).some(function (_keyCode) {\n    return (0, _unicode.isCtrlMetaKey)(_keyCode);\n  });\n}\n\n/**\n * Returns reference count. Useful for debugging and testing purposes.\n *\n * @return {Number}\n */\nfunction _getRefCount() {\n  return refCount;\n}\n\nexports._getRefCount = _getRefCount;\nexports._resetState = _resetState;\nexports.isPressed = isPressed;\nexports.isPressedCtrlKey = isPressedCtrlKey;\nexports.startObserving = startObserving;\nexports.stopObserving = stopObserving;\n\n/***/ }),\n/* 199 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.HEADER_TYPE = exports.FILL_TYPE = exports.CELL_TYPE = exports.AREA_TYPE = exports.ACTIVE_HEADER_TYPE = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _types = __webpack_require__(273);\n\nvar _array = __webpack_require__(1);\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ACTIVE_HEADER_TYPE = exports.ACTIVE_HEADER_TYPE = 'active-header';\nvar AREA_TYPE = exports.AREA_TYPE = 'area';\nvar CELL_TYPE = exports.CELL_TYPE = 'cell';\nvar FILL_TYPE = exports.FILL_TYPE = 'fill';\nvar HEADER_TYPE = exports.HEADER_TYPE = 'header';\n\n/**\n * Highlight class responsible for managing Walkontable Selection classes.\n *\n * With Highlight object you can manipulate four different highlight types:\n *  - `cell` can be added only to a single cell at a time and it defines currently selected cell;\n *  - `fill` can occur only once and its highlight defines selection of autofill functionality (managed by the plugin with the same name);\n *  - `areas` can be added to multiple cells at a time. This type highlights selected cell or multiple cells.\n *    The multiple cells have to be defined as an uninterrupted order (regular shape). Otherwise, the new layer of\n *    that type should be created to manage not-consecutive selection;\n *  - `header` can occur multiple times. This type is designed to highlight only headers. Like `area` type it\n *    can appear with multiple highlights (accessed under different level layers).\n *\n * @class Highlight\n * @util\n */\n\nvar Highlight = function () {\n  function Highlight(options) {\n    _classCallCheck(this, Highlight);\n\n    /**\n     * Options consumed by Highlight class and Walkontable Selection classes.\n     *\n     * @type {Object}\n     */\n    this.options = options;\n    /**\n     * The property which describes which layer level of the visual selection will be modified.\n     * This option is valid only for `area` and `header` highlight types which occurs multiple times on\n     * the table (as a non-consecutive selection).\n     *\n     * An order of the layers is the same as the order of added new non-consecutive selections.\n     *\n     * @type {Number}\n     * @default 0\n     */\n    this.layerLevel = 0;\n    /**\n     * `cell` highlight object which describes attributes for the currently selected cell.\n     * It can only occur only once on the table.\n     *\n     * @type {Selection}\n     */\n    this.cell = (0, _types.createHighlight)(CELL_TYPE, options);\n    /**\n     * `fill` highlight object which describes attributes for the borders for autofill functionality.\n     * It can only occur only once on the table.\n     *\n     * @type {Selection}\n     */\n    this.fill = (0, _types.createHighlight)(FILL_TYPE, options);\n    /**\n     * Collection of the `area` highlights. That objects describes attributes for the borders and selection of\n     * the multiple selected cells. It can occur multiple times on the table.\n     *\n     * @type {Map.<number, Selection>}\n     */\n    this.areas = new Map();\n    /**\n     * Collection of the `header` highlights. That objects describes attributes for the selection of\n     * the multiple selected rows and columns in the table header. It can occur multiple times on the table.\n     *\n     * @type {Map.<number, Selection>}\n     */\n    this.headers = new Map();\n    /**\n     * Collection of the `active-header` highlights. That objects describes attributes for the selection of\n     * the multiple selected rows and columns in the table header. The table headers which have selected all items in\n     * a row will be marked as `active-header`.\n     *\n     * @type {Map.<number, Selection>}\n     */\n    this.activeHeaders = new Map();\n    /**\n     * The temporary property, holder for borders added through CustomBorders plugin.\n     *\n     * @type {Selection[]}\n     */\n    this.borders = [];\n  }\n\n  /**\n   * Check if highlight cell rendering is disabled for specyfied highlight type.\n   *\n   * @param {String} highlightType Highlight type. Possible values are: `cell`, `area`, `fill` or `header`.\n   * @return {Boolean}\n   */\n\n\n  _createClass(Highlight, [{\n    key: 'isEnabledFor',\n    value: function isEnabledFor(highlightType) {\n      var disableHighlight = this.options.disableHighlight;\n\n      // Legacy compatibility.\n      if (highlightType === 'current') {\n        highlightType = CELL_TYPE;\n      }\n\n      if (typeof disableHighlight === 'string') {\n        disableHighlight = [disableHighlight];\n      }\n\n      return disableHighlight === false || Array.isArray(disableHighlight) && !disableHighlight.includes(highlightType);\n    }\n\n    /**\n     * Set a new layer level to make access to the desire `area` and `header` highlights.\n     *\n     * @param {Number} [level=0] Layer level to use.\n     * @returns {Highlight}\n     */\n\n  }, {\n    key: 'useLayerLevel',\n    value: function useLayerLevel() {\n      var level = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n      this.layerLevel = level;\n\n      return this;\n    }\n\n    /**\n     * Get Walkontable Selection instance created for controlling highlight of the currently selected/edited cell.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'getCell',\n    value: function getCell() {\n      return this.cell;\n    }\n\n    /**\n     * Get Walkontable Selection instance created for controlling highlight of the autofill functionality.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'getFill',\n    value: function getFill() {\n      return this.fill;\n    }\n\n    /**\n     * Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight\n     * of the multiple selected cells.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'createOrGetArea',\n    value: function createOrGetArea() {\n      var layerLevel = this.layerLevel;\n      var area = void 0;\n\n      if (this.areas.has(layerLevel)) {\n        area = this.areas.get(layerLevel);\n      } else {\n        area = (0, _types.createHighlight)(AREA_TYPE, Object.assign({ layerLevel: layerLevel }, this.options));\n\n        this.areas.set(layerLevel, area);\n      }\n\n      return area;\n    }\n\n    /**\n     * Get all Walkontable Selection instances which describes the state of the visual highlight of the cells.\n     *\n     * @return {Selection[]}\n     */\n\n  }, {\n    key: 'getAreas',\n    value: function getAreas() {\n      return [].concat(_toConsumableArray(this.areas.values()));\n    }\n\n    /**\n     * Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight\n     * of the multiple selected header cells.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'createOrGetHeader',\n    value: function createOrGetHeader() {\n      var layerLevel = this.layerLevel;\n      var header = void 0;\n\n      if (this.headers.has(layerLevel)) {\n        header = this.headers.get(layerLevel);\n      } else {\n        header = (0, _types.createHighlight)(HEADER_TYPE, Object.assign({}, this.options));\n\n        this.headers.set(layerLevel, header);\n      }\n\n      return header;\n    }\n\n    /**\n     * Get all Walkontable Selection instances which describes the state of the visual highlight of the headers.\n     *\n     * @return {Selection[]}\n     */\n\n  }, {\n    key: 'getHeaders',\n    value: function getHeaders() {\n      return [].concat(_toConsumableArray(this.headers.values()));\n    }\n\n    /**\n     * Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight\n     * of the multiple selected active header cells.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'createOrGetActiveHeader',\n    value: function createOrGetActiveHeader() {\n      var layerLevel = this.layerLevel;\n      var header = void 0;\n\n      if (this.activeHeaders.has(layerLevel)) {\n        header = this.activeHeaders.get(layerLevel);\n      } else {\n        header = (0, _types.createHighlight)(ACTIVE_HEADER_TYPE, Object.assign({}, this.options));\n\n        this.activeHeaders.set(layerLevel, header);\n      }\n\n      return header;\n    }\n\n    /**\n     * Get all Walkontable Selection instances which describes the state of the visual highlight of the active headers.\n     *\n     * @return {Selection[]}\n     */\n\n  }, {\n    key: 'getActiveHeaders',\n    value: function getActiveHeaders() {\n      return [].concat(_toConsumableArray(this.activeHeaders.values()));\n    }\n\n    /**\n     * Perform cleaning visual highlights for the whole table.\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.cell.clear();\n      this.fill.clear();\n\n      (0, _array.arrayEach)(this.areas.values(), function (highlight) {\n        return void highlight.clear();\n      });\n      (0, _array.arrayEach)(this.headers.values(), function (highlight) {\n        return void highlight.clear();\n      });\n      (0, _array.arrayEach)(this.activeHeaders.values(), function (highlight) {\n        return void highlight.clear();\n      });\n    }\n\n    /**\n     * This object can be iterate over using `for of` syntax or using internal `arrayEach` helper.\n     */\n\n  }, {\n    key: Symbol.iterator,\n    value: function value() {\n      return [this.cell, this.fill].concat(_toConsumableArray(this.areas.values()), _toConsumableArray(this.headers.values()), _toConsumableArray(this.activeHeaders.values()), _toConsumableArray(this.borders))[Symbol.iterator]();\n    }\n  }]);\n\n  return Highlight;\n}();\n\nexports.default = Highlight;\n\n/***/ }),\n/* 200 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _mixed = __webpack_require__(16);\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class SamplesGenerator\n * @util\n */\nvar SamplesGenerator = function () {\n  _createClass(SamplesGenerator, null, [{\n    key: 'SAMPLE_COUNT',\n\n    /**\n     * Number of samples to take of each value length.\n     *\n     * @type {Number}\n     */\n    get: function get() {\n      return 3;\n    }\n  }]);\n\n  function SamplesGenerator(dataFactory) {\n    _classCallCheck(this, SamplesGenerator);\n\n    /**\n     * Samples prepared for calculations.\n     *\n     * @type {Map}\n     * @default {null}\n     */\n    this.samples = null;\n    /**\n     * Function which give the data to collect samples.\n     *\n     * @type {Function}\n     */\n    this.dataFactory = dataFactory;\n    /**\n     * Custom number of samples to take of each value length.\n     *\n     * @type {Number}\n     * @default {null}\n     */\n    this.customSampleCount = null;\n    /**\n     * `true` if duplicate samples collection should be allowed, `false` otherwise.\n     *\n     * @type {Boolean}\n     * @default {false}\n     */\n    this.allowDuplicates = false;\n  }\n\n  /**\n   * Get the sample count for this instance.\n   *\n   * @returns {Number}\n   */\n\n\n  _createClass(SamplesGenerator, [{\n    key: 'getSampleCount',\n    value: function getSampleCount() {\n      if (this.customSampleCount) {\n        return this.customSampleCount;\n      }\n      return SamplesGenerator.SAMPLE_COUNT;\n    }\n  }, {\n    key: 'setSampleCount',\n\n\n    /**\n     * Set the sample count.\n     *\n     * @param {Number} sampleCount Number of samples to be collected.\n     */\n    value: function setSampleCount(sampleCount) {\n      this.customSampleCount = sampleCount;\n    }\n\n    /**\n     * Set if the generator should accept duplicate values.\n     *\n     * @param {Boolean} allowDuplicates `true` to allow duplicate values.\n     */\n\n  }, {\n    key: 'setAllowDuplicates',\n    value: function setAllowDuplicates(allowDuplicates) {\n      this.allowDuplicates = allowDuplicates;\n    }\n\n    /**\n     * Generate samples for row. You can control which area should be sampled by passing `rowRange` object and `colRange` object.\n     *\n     * @param {Object|Number} rowRange\n     * @param {Object} colRange\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'generateRowSamples',\n    value: function generateRowSamples(rowRange, colRange) {\n      return this.generateSamples('row', colRange, rowRange);\n    }\n\n    /**\n     * Generate samples for column. You can control which area should be sampled by passing `colRange` object and `rowRange` object.\n     *\n     * @param {Object} colRange Column index.\n     * @param {Object} rowRange Column index.\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'generateColumnSamples',\n    value: function generateColumnSamples(colRange, rowRange) {\n      return this.generateSamples('col', rowRange, colRange);\n    }\n\n    /**\n     * Generate collection of samples.\n     *\n     * @param {String} type Type to generate. Can be `col` or `row`.\n     * @param {Object} range\n     * @param {Object|Number} specifierRange\n     * @returns {Map}\n     */\n\n  }, {\n    key: 'generateSamples',\n    value: function generateSamples(type, range, specifierRange) {\n      var _this = this;\n\n      var samples = new Map();\n\n      if (typeof specifierRange === 'number') {\n        specifierRange = { from: specifierRange, to: specifierRange };\n      }\n      (0, _number.rangeEach)(specifierRange.from, specifierRange.to, function (index) {\n        var sample = _this.generateSample(type, range, index);\n\n        samples.set(index, sample);\n      });\n\n      return samples;\n    }\n\n    /**\n     * Generate sample for specified type (`row` or `col`).\n     *\n     * @param {String} type Samples type `row` or `col`.\n     * @param {Object} range\n     * @param {Number} specifierValue\n     * @returns {Map}\n     */\n\n  }, {\n    key: 'generateSample',\n    value: function generateSample(type, range, specifierValue) {\n      var _this2 = this;\n\n      var samples = new Map();\n      var sampledValues = [];\n      var length = void 0;\n\n      (0, _number.rangeEach)(range.from, range.to, function (index) {\n        var value = void 0;\n\n        if (type === 'row') {\n          value = _this2.dataFactory(specifierValue, index);\n        } else if (type === 'col') {\n          value = _this2.dataFactory(index, specifierValue);\n        } else {\n          throw new Error('Unsupported sample type');\n        }\n\n        if ((0, _object.isObject)(value)) {\n          length = Object.keys(value).length;\n        } else if (Array.isArray(value)) {\n          length = value.length;\n        } else {\n          length = (0, _mixed.stringify)(value).length;\n        }\n\n        if (!samples.has(length)) {\n          samples.set(length, {\n            needed: _this2.getSampleCount(),\n            strings: []\n          });\n        }\n        var sample = samples.get(length);\n\n        if (sample.needed) {\n          var duplicate = sampledValues.indexOf(value) > -1;\n\n          if (!duplicate || _this2.allowDuplicates) {\n            var computedKey = type === 'row' ? 'col' : 'row';\n\n            sample.strings.push(_defineProperty({ value: value }, computedKey, index));\n            sampledValues.push(value);\n            sample.needed--;\n          }\n        }\n      });\n\n      return samples;\n    }\n  }]);\n\n  return SamplesGenerator;\n}();\n\nexports.default = SamplesGenerator;\n\n/***/ }),\n/* 201 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar MIXIN_NAME = 'arrayMapper';\n\n/**\n * @type {Object}\n */\nvar arrayMapper = {\n  _arrayMap: [],\n\n  /**\n   * Get translated index by its physical index.\n   *\n   * @param {Number} physicalIndex Physical index.\n   * @return {Number|null} Returns translated index mapped by passed physical index.\n   */\n  getValueByIndex: function getValueByIndex(physicalIndex) {\n    var length = this._arrayMap.length;\n    var translatedIndex = null;\n\n    if (physicalIndex < length) {\n      translatedIndex = this._arrayMap[physicalIndex];\n    }\n\n    return translatedIndex;\n  },\n\n\n  /**\n   * Get physical index by its translated index.\n   *\n   * @param {*} translatedIndex Value to search.\n   * @returns {Number|null} Returns a physical index of the array mapper.\n   */\n  getIndexByValue: function getIndexByValue(translatedIndex) {\n    var physicalIndex = void 0;\n\n    // eslint-disable-next-line no-cond-assign, no-return-assign\n    return (physicalIndex = this._arrayMap.indexOf(translatedIndex)) === -1 ? null : physicalIndex;\n  },\n\n\n  /**\n   * Insert new items to array mapper starting at passed index. New entries will be a continuation of last value in the array.\n   *\n   * @param {Number} physicalIndex Array index.\n   * @param {Number} [amount=1] Defines how many items will be created to an array.\n   * @returns {Array} Returns added items.\n   */\n  insertItems: function insertItems(physicalIndex) {\n    var _this = this;\n\n    var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n    var newIndex = (0, _array.arrayMax)(this._arrayMap) + 1;\n    var addedItems = [];\n\n    (0, _number.rangeEach)(amount - 1, function (count) {\n      addedItems.push(_this._arrayMap.splice(physicalIndex + count, 0, newIndex + count));\n    });\n\n    return addedItems;\n  },\n\n\n  /**\n   * Remove items from array mapper.\n   *\n   * @param {Number} physicalIndex Array index.\n   * @param {Number} [amount=1] Defines how many items will be created to an array.\n   * @returns {Array} Returns removed items.\n   */\n  removeItems: function removeItems(physicalIndex) {\n    var _this2 = this;\n\n    var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n    var removedItems = [];\n\n    if (Array.isArray(physicalIndex)) {\n      var mapCopy = [].concat(this._arrayMap);\n\n      // Sort descending\n      physicalIndex.sort(function (a, b) {\n        return b - a;\n      });\n\n      removedItems = (0, _array.arrayReduce)(physicalIndex, function (acc, item) {\n        _this2._arrayMap.splice(item, 1);\n\n        return acc.concat(mapCopy.slice(item, item + 1));\n      }, []);\n    } else {\n      removedItems = this._arrayMap.splice(physicalIndex, amount);\n    }\n\n    return removedItems;\n  },\n\n\n  /**\n   * Unshift items (remove and shift chunk of array to the left).\n   *\n   * @param {Number|Array} physicalIndex Array index or Array of indexes to unshift.\n   * @param {Number} [amount=1] Defines how many items will be removed from an array (when index is passed as number).\n   */\n  unshiftItems: function unshiftItems(physicalIndex) {\n    var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n    var removedItems = this.removeItems(physicalIndex, amount);\n\n    function countRowShift(logicalRow) {\n      // Todo: compare perf between reduce vs sort->each->brake\n      return (0, _array.arrayReduce)(removedItems, function (count, removedLogicalRow) {\n        if (logicalRow > removedLogicalRow) {\n          count++;\n        }\n\n        return count;\n      }, 0);\n    }\n\n    this._arrayMap = (0, _array.arrayMap)(this._arrayMap, function (logicalRow, physicalRow) {\n      var rowShift = countRowShift(logicalRow);\n\n      if (rowShift) {\n        logicalRow -= rowShift;\n      }\n\n      return logicalRow;\n    });\n  },\n\n\n  /**\n   * Shift (right shifting) items starting at passed index.\n   *\n   * @param {Number} physicalIndex Array index.\n   * @param {Number} [amount=1] Defines how many items will be created to an array.\n   */\n  shiftItems: function shiftItems(physicalIndex) {\n    var _this3 = this;\n\n    var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n    this._arrayMap = (0, _array.arrayMap)(this._arrayMap, function (row) {\n      if (row >= physicalIndex) {\n        row += amount;\n      }\n      return row;\n    });\n\n    (0, _number.rangeEach)(amount - 1, function (count) {\n      _this3._arrayMap.splice(physicalIndex + count, 0, physicalIndex + count);\n    });\n  },\n\n\n  /**\n   * Swap indexes in arrayMapper.\n   *\n   * @param {Number} physicalIndexFrom index to move.\n   * @param {Number} physicalIndexTo index to.\n   */\n  swapIndexes: function swapIndexes(physicalIndexFrom, physicalIndexTo) {\n    var _arrayMap;\n\n    (_arrayMap = this._arrayMap).splice.apply(_arrayMap, [physicalIndexTo, 0].concat(_toConsumableArray(this._arrayMap.splice(physicalIndexFrom, 1))));\n  },\n\n\n  /**\n   * Clear all stored index<->value information from an array.\n   */\n  clearMap: function clearMap() {\n    this._arrayMap.length = 0;\n  }\n};\n\n(0, _object.defineGetter)(arrayMapper, 'MIXIN_NAME', MIXIN_NAME, {\n  writable: false,\n  enumerable: false\n});\n\nexports.default = arrayMapper;\n\n/***/ }),\n/* 202 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _number = __webpack_require__(5);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar STATE_INITIALIZED = 0;\nvar STATE_BUILT = 1;\nvar STATE_APPENDED = 2;\nvar UNIT = 'px';\n\n/**\n * @class\n * @private\n */\n\nvar BaseUI = function () {\n  function BaseUI(hotInstance) {\n    _classCallCheck(this, BaseUI);\n\n    /**\n     * Instance of Handsontable.\n     *\n     * @type {Core}\n     */\n    this.hot = hotInstance;\n    /**\n     * DOM element representing the ui element.\n     *\n     * @type {HTMLElement}\n     * @private\n     */\n    this._element = null;\n    /**\n     * Flag which determines build state of element.\n     *\n     * @type {Boolean}\n     */\n    this.state = STATE_INITIALIZED;\n  }\n\n  /**\n   * Add created UI elements to table.\n   *\n   * @param {HTMLElement} wrapper Element which are parent for our UI element.\n   */\n\n\n  _createClass(BaseUI, [{\n    key: 'appendTo',\n    value: function appendTo(wrapper) {\n      wrapper.appendChild(this._element);\n\n      this.state = STATE_APPENDED;\n    }\n\n    /**\n     * Method for create UI element. Only create, without append to table.\n     */\n\n  }, {\n    key: 'build',\n    value: function build() {\n      this._element = document.createElement('div');\n      this.state = STATE_BUILT;\n    }\n\n    /**\n     * Method for remove UI element.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.isAppended()) {\n        this._element.parentElement.removeChild(this._element);\n      }\n\n      this._element = null;\n      this.state = STATE_INITIALIZED;\n    }\n\n    /**\n     * Check if UI element are appended.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isAppended',\n    value: function isAppended() {\n      return this.state === STATE_APPENDED;\n    }\n\n    /**\n     * Check if UI element are built.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isBuilt',\n    value: function isBuilt() {\n      return this.state >= STATE_BUILT;\n    }\n\n    /**\n     * Setter for position.\n     *\n     * @param {Number} top New top position of the element.\n     * @param {Number} left New left position of the element.\n     */\n\n  }, {\n    key: 'setPosition',\n    value: function setPosition(top, left) {\n      if ((0, _number.isNumeric)(top)) {\n        this._element.style.top = top + UNIT;\n      }\n      if ((0, _number.isNumeric)(left)) {\n        this._element.style.left = left + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element position.\n     *\n     * @returns {Object} Object contains left and top position of the element.\n     */\n\n  }, {\n    key: 'getPosition',\n    value: function getPosition() {\n      return {\n        top: this._element.style.top ? parseInt(this._element.style.top, 10) : 0,\n        left: this._element.style.left ? parseInt(this._element.style.left, 10) : 0\n      };\n    }\n\n    /**\n     * Setter for the element size.\n     *\n     * @param {Number} width New width of the element.\n     * @param {Number} height New height of the element.\n     */\n\n  }, {\n    key: 'setSize',\n    value: function setSize(width, height) {\n      if ((0, _number.isNumeric)(width)) {\n        this._element.style.width = width + UNIT;\n      }\n      if ((0, _number.isNumeric)(height)) {\n        this._element.style.height = height + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element position.\n     *\n     * @returns {Object} Object contains height and width of the element.\n     */\n\n  }, {\n    key: 'getSize',\n    value: function getSize() {\n      return {\n        width: this._element.style.width ? parseInt(this._element.style.width, 10) : 0,\n        height: this._element.style.height ? parseInt(this._element.style.height, 10) : 0\n      };\n    }\n\n    /**\n     * Setter for the element offset. Offset means marginTop and marginLeft of the element.\n     *\n     * @param {Number} top New margin top of the element.\n     * @param {Number} left New margin left of the element.\n     */\n\n  }, {\n    key: 'setOffset',\n    value: function setOffset(top, left) {\n      if ((0, _number.isNumeric)(top)) {\n        this._element.style.marginTop = top + UNIT;\n      }\n      if ((0, _number.isNumeric)(left)) {\n        this._element.style.marginLeft = left + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element offset.\n     *\n     * @returns {Object} Object contains top and left offset of the element.\n     */\n\n  }, {\n    key: 'getOffset',\n    value: function getOffset() {\n      return {\n        top: this._element.style.marginTop ? parseInt(this._element.style.marginTop, 10) : 0,\n        left: this._element.style.marginLeft ? parseInt(this._element.style.marginLeft, 10) : 0\n      };\n    }\n  }]);\n\n  return BaseUI;\n}();\n\nexports.default = BaseUI;\n\n/***/ }),\n/* 203 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar STATE_INITIALIZED = 0;\nvar STATE_BUILT = 1;\nvar STATE_APPENDED = 2;\nvar UNIT = 'px';\n\n/**\n * @class\n * @private\n */\n\nvar BaseUI = function () {\n  function BaseUI(hotInstance) {\n    _classCallCheck(this, BaseUI);\n\n    /**\n     * Instance of Handsontable.\n     *\n     * @type {Core}\n     */\n    this.hot = hotInstance;\n    /**\n     * DOM element representing the ui element.\n     *\n     * @type {HTMLElement}\n     * @private\n     */\n    this._element = null;\n    /**\n     * Flag which determines build state of element.\n     *\n     * @type {Boolean}\n     */\n    this.state = STATE_INITIALIZED;\n  }\n\n  /**\n   * Add created UI elements to table.\n   *\n   * @param {HTMLElement} wrapper Element which are parent for our UI element.\n   */\n\n\n  _createClass(BaseUI, [{\n    key: 'appendTo',\n    value: function appendTo(wrapper) {\n      wrapper.appendChild(this._element);\n\n      this.state = STATE_APPENDED;\n    }\n\n    /**\n     * Method for create UI element. Only create, without append to table.\n     */\n\n  }, {\n    key: 'build',\n    value: function build() {\n      this._element = document.createElement('div');\n      this.state = STATE_BUILT;\n    }\n\n    /**\n     * Method for remove UI element.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.isAppended()) {\n        this._element.parentElement.removeChild(this._element);\n      }\n\n      this._element = null;\n      this.state = STATE_INITIALIZED;\n    }\n\n    /**\n     * Check if UI element are appended.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isAppended',\n    value: function isAppended() {\n      return this.state === STATE_APPENDED;\n    }\n\n    /**\n     * Check if UI element are built.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isBuilt',\n    value: function isBuilt() {\n      return this.state >= STATE_BUILT;\n    }\n\n    /**\n     * Setter for position.\n     *\n     * @param {Number} top New top position of the element.\n     * @param {Number} left New left position of the element.\n     */\n\n  }, {\n    key: 'setPosition',\n    value: function setPosition(top, left) {\n      if (top !== void 0) {\n        this._element.style.top = top + UNIT;\n      }\n      if (left !== void 0) {\n        this._element.style.left = left + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element position.\n     *\n     * @returns {Object} Object contains left and top position of the element.\n     */\n\n  }, {\n    key: 'getPosition',\n    value: function getPosition() {\n      return {\n        top: this._element.style.top ? parseInt(this._element.style.top, 10) : 0,\n        left: this._element.style.left ? parseInt(this._element.style.left, 10) : 0\n      };\n    }\n\n    /**\n     * Setter for the element size.\n     *\n     * @param {Number} width New width of the element.\n     * @param {Number} height New height of the element.\n     */\n\n  }, {\n    key: 'setSize',\n    value: function setSize(width, height) {\n      if (width) {\n        this._element.style.width = width + UNIT;\n      }\n      if (height) {\n        this._element.style.height = height + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element position.\n     *\n     * @returns {Object} Object contains height and width of the element.\n     */\n\n  }, {\n    key: 'getSize',\n    value: function getSize() {\n      return {\n        width: this._element.style.width ? parseInt(this._element.style.width, 10) : 0,\n        height: this._element.style.height ? parseInt(this._element.style.height, 10) : 0\n      };\n    }\n\n    /**\n     * Setter for the element offset. Offset means marginTop and marginLeft of the element.\n     *\n     * @param {Number} top New margin top of the element.\n     * @param {Number} left New margin left of the element.\n     */\n\n  }, {\n    key: 'setOffset',\n    value: function setOffset(top, left) {\n      if (top) {\n        this._element.style.marginTop = top + UNIT;\n      }\n      if (left) {\n        this._element.style.marginLeft = left + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element offset.\n     *\n     * @returns {Object} Object contains top and left offset of the element.\n     */\n\n  }, {\n    key: 'getOffset',\n    value: function getOffset() {\n      return {\n        top: this._element.style.marginTop ? parseInt(this._element.style.marginTop, 10) : 0,\n        left: this._element.style.marginLeft ? parseInt(this._element.style.marginLeft, 10) : 0\n      };\n    }\n  }]);\n\n  return BaseUI;\n}();\n\nexports.default = BaseUI;\n\n/***/ }),\n/* 204 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.applySpanProperties = applySpanProperties;\n/**\n * Apply the `colspan`/`rowspan` properties.\n *\n * @param {HTMLElement} TD The soon-to-be-modified cell.\n * @param {MergedCellCoords} merged cellInfo The merged cell in question.\n * @param {Number} row Row index.\n * @param {Number} col Column index.\n */\n// eslint-disable-next-line import/prefer-default-export\nfunction applySpanProperties(TD, mergedCellInfo, row, col) {\n  if (mergedCellInfo) {\n    if (mergedCellInfo.row === row && mergedCellInfo.col === col) {\n      TD.setAttribute('rowspan', mergedCellInfo.rowspan.toString());\n      TD.setAttribute('colspan', mergedCellInfo.colspan.toString());\n    } else {\n      TD.removeAttribute('rowspan');\n      TD.removeAttribute('colspan');\n\n      TD.style.display = 'none';\n    }\n  } else {\n    TD.removeAttribute('rowspan');\n    TD.removeAttribute('colspan');\n\n    TD.style.display = '';\n  }\n}\n\n/***/ }),\n/* 205 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/*!\n * https://github.com/Starcounter-Jack/JSON-Patch\n * json-patch-duplex.js version: 0.5.7\n * (c) 2013 Joachim Wester\n * MIT license\n */\nvar __extends = undefined && undefined.__extends || function (d, b) {\n    for (var p in b) {\n        if (b.hasOwnProperty(p)) d[p] = b[p];\n    }function __() {\n        this.constructor = d;\n    }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OriginalError = Error;\nvar jsonpatch;\n(function (jsonpatch) {\n    var _objectKeys = function _objectKeys(obj) {\n        if (_isArray(obj)) {\n            var keys = new Array(obj.length);\n            for (var k = 0; k < keys.length; k++) {\n                keys[k] = \"\" + k;\n            }\n            return keys;\n        }\n        if (Object.keys) {\n            return Object.keys(obj);\n        }\n        var keys = [];\n        for (var i in obj) {\n            if (obj.hasOwnProperty(i)) {\n                keys.push(i);\n            }\n        }\n        return keys;\n    };\n    function _equals(a, b) {\n        switch (typeof a === 'undefined' ? 'undefined' : _typeof(a)) {\n            case 'undefined': //backward compatibility, but really I think we should return false\n            case 'boolean':\n            case 'string':\n            case 'number':\n                return a === b;\n            case 'object':\n                if (a === null) return b === null;\n                if (_isArray(a)) {\n                    if (!_isArray(b) || a.length !== b.length) return false;\n                    for (var i = 0, l = a.length; i < l; i++) {\n                        if (!_equals(a[i], b[i])) return false;\n                    }return true;\n                }\n                var bKeys = _objectKeys(b);\n                var bLength = bKeys.length;\n                if (_objectKeys(a).length !== bLength) return false;\n                for (var i = 0; i < bLength; i++) {\n                    if (!_equals(a[i], b[i])) return false;\n                }return true;\n            default:\n                return false;\n        }\n    }\n    /* We use a Javascript hash to store each\n     function. Each hash entry (property) uses\n     the operation identifiers specified in rfc6902.\n     In this way, we can map each patch operation\n     to its dedicated function in efficient way.\n     */\n    /* The operations applicable to an object */\n    var objOps = {\n        add: function add(obj, key) {\n            obj[key] = this.value;\n            return true;\n        },\n        remove: function remove(obj, key) {\n            delete obj[key];\n            return true;\n        },\n        replace: function replace(obj, key) {\n            obj[key] = this.value;\n            return true;\n        },\n        move: function move(obj, key, tree) {\n            var temp = { op: \"_get\", path: this.from };\n            apply(tree, [temp]);\n            apply(tree, [{ op: \"remove\", path: this.from }]);\n            apply(tree, [{ op: \"add\", path: this.path, value: temp.value }]);\n            return true;\n        },\n        copy: function copy(obj, key, tree) {\n            var temp = { op: \"_get\", path: this.from };\n            apply(tree, [temp]);\n            apply(tree, [{ op: \"add\", path: this.path, value: temp.value }]);\n            return true;\n        },\n        test: function test(obj, key) {\n            return _equals(obj[key], this.value);\n        },\n        _get: function _get(obj, key) {\n            this.value = obj[key];\n        }\n    };\n    /* The operations applicable to an array. Many are the same as for the object */\n    var arrOps = {\n        add: function add(arr, i) {\n            arr.splice(i, 0, this.value);\n            return true;\n        },\n        remove: function remove(arr, i) {\n            arr.splice(i, 1);\n            return true;\n        },\n        replace: function replace(arr, i) {\n            arr[i] = this.value;\n            return true;\n        },\n        move: objOps.move,\n        copy: objOps.copy,\n        test: objOps.test,\n        _get: objOps._get\n    };\n    /* The operations applicable to object root. Many are the same as for the object */\n    var rootOps = {\n        add: function add(obj) {\n            rootOps.remove.call(this, obj);\n            for (var key in this.value) {\n                if (this.value.hasOwnProperty(key)) {\n                    obj[key] = this.value[key];\n                }\n            }\n            return true;\n        },\n        remove: function remove(obj) {\n            for (var key in obj) {\n                if (obj.hasOwnProperty(key)) {\n                    objOps.remove.call(this, obj, key);\n                }\n            }\n            return true;\n        },\n        replace: function replace(obj) {\n            apply(obj, [{ op: \"remove\", path: this.path }]);\n            apply(obj, [{ op: \"add\", path: this.path, value: this.value }]);\n            return true;\n        },\n        move: objOps.move,\n        copy: objOps.copy,\n        test: function test(obj) {\n            return JSON.stringify(obj) === JSON.stringify(this.value);\n        },\n        _get: function _get(obj) {\n            this.value = obj;\n        }\n    };\n    var observeOps = {\n        add: function add(patches, path) {\n            var patch = {\n                op: \"add\",\n                path: path + escapePathComponent(this.name),\n                value: this.object[this.name] };\n            patches.push(patch);\n        },\n        'delete': function _delete(patches, path) {\n            var patch = {\n                op: \"remove\",\n                path: path + escapePathComponent(this.name)\n            };\n            patches.push(patch);\n        },\n        update: function update(patches, path) {\n            var patch = {\n                op: \"replace\",\n                path: path + escapePathComponent(this.name),\n                value: this.object[this.name]\n            };\n            patches.push(patch);\n        }\n    };\n    function escapePathComponent(str) {\n        if (str.indexOf('/') === -1 && str.indexOf('~') === -1) return str;\n        return str.replace(/~/g, '~0').replace(/\\//g, '~1');\n    }\n    function _getPathRecursive(root, obj) {\n        var found;\n        for (var key in root) {\n            if (root.hasOwnProperty(key)) {\n                if (root[key] === obj) {\n                    return escapePathComponent(key) + '/';\n                } else if (_typeof(root[key]) === 'object') {\n                    found = _getPathRecursive(root[key], obj);\n                    if (found != '') {\n                        return escapePathComponent(key) + '/' + found;\n                    }\n                }\n            }\n        }\n        return '';\n    }\n    function getPath(root, obj) {\n        if (root === obj) {\n            return '/';\n        }\n        var path = _getPathRecursive(root, obj);\n        if (path === '') {\n            throw new OriginalError(\"Object not found in root\");\n        }\n        return '/' + path;\n    }\n    var beforeDict = [];\n    var Mirror = function () {\n        function Mirror(obj) {\n            this.observers = [];\n            this.obj = obj;\n        }\n        return Mirror;\n    }();\n    var ObserverInfo = function () {\n        function ObserverInfo(callback, observer) {\n            this.callback = callback;\n            this.observer = observer;\n        }\n        return ObserverInfo;\n    }();\n    function getMirror(obj) {\n        for (var i = 0, ilen = beforeDict.length; i < ilen; i++) {\n            if (beforeDict[i].obj === obj) {\n                return beforeDict[i];\n            }\n        }\n    }\n    function getObserverFromMirror(mirror, callback) {\n        for (var j = 0, jlen = mirror.observers.length; j < jlen; j++) {\n            if (mirror.observers[j].callback === callback) {\n                return mirror.observers[j].observer;\n            }\n        }\n    }\n    function removeObserverFromMirror(mirror, observer) {\n        for (var j = 0, jlen = mirror.observers.length; j < jlen; j++) {\n            if (mirror.observers[j].observer === observer) {\n                mirror.observers.splice(j, 1);\n                return;\n            }\n        }\n    }\n    function unobserve(root, observer) {\n        observer.unobserve();\n    }\n    jsonpatch.unobserve = unobserve;\n    function deepClone(obj) {\n        if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === \"object\") {\n            return JSON.parse(JSON.stringify(obj)); //Faster than ES5 clone - http://jsperf.com/deep-cloning-of-objects/5\n        } else {\n            return obj; //no need to clone primitives\n        }\n    }\n    function observe(obj, callback) {\n        var patches = [];\n        var root = obj;\n        var observer;\n        var mirror = getMirror(obj);\n        if (!mirror) {\n            mirror = new Mirror(obj);\n            beforeDict.push(mirror);\n        } else {\n            observer = getObserverFromMirror(mirror, callback);\n        }\n        if (observer) {\n            return observer;\n        }\n        observer = {};\n        mirror.value = deepClone(obj);\n        if (callback) {\n            observer.callback = callback;\n            observer.next = null;\n            var intervals = this.intervals || [100, 1000, 10000, 60000];\n            if (intervals.push === void 0) {\n                throw new OriginalError(\"jsonpatch.intervals must be an array\");\n            }\n            var currentInterval = 0;\n            var dirtyCheck = function dirtyCheck() {\n                generate(observer);\n            };\n            var fastCheck = function fastCheck() {\n                clearTimeout(observer.next);\n                observer.next = setTimeout(function () {\n                    dirtyCheck();\n                    currentInterval = 0;\n                    observer.next = setTimeout(slowCheck, intervals[currentInterval++]);\n                }, 0);\n            };\n            var slowCheck = function slowCheck() {\n                dirtyCheck();\n                if (currentInterval == intervals.length) currentInterval = intervals.length - 1;\n                observer.next = setTimeout(slowCheck, intervals[currentInterval++]);\n            };\n            if (typeof window !== 'undefined') {\n                if (window.addEventListener) {\n                    window.addEventListener('mousedown', fastCheck);\n                    window.addEventListener('mouseup', fastCheck);\n                    window.addEventListener('keydown', fastCheck);\n                } else {\n                    document.documentElement.attachEvent('onmousedown', fastCheck);\n                    document.documentElement.attachEvent('onmouseup', fastCheck);\n                    document.documentElement.attachEvent('onkeydown', fastCheck);\n                }\n            }\n            observer.next = setTimeout(slowCheck, intervals[currentInterval++]);\n        }\n        observer.patches = patches;\n        observer.object = obj;\n        observer.unobserve = function () {\n            generate(observer);\n            clearTimeout(observer.next);\n            removeObserverFromMirror(mirror, observer);\n            if (typeof window !== 'undefined') {\n                if (window.removeEventListener) {\n                    window.removeEventListener('mousedown', fastCheck);\n                    window.removeEventListener('mouseup', fastCheck);\n                    window.removeEventListener('keydown', fastCheck);\n                } else {\n                    document.documentElement.detachEvent('onmousedown', fastCheck);\n                    document.documentElement.detachEvent('onmouseup', fastCheck);\n                    document.documentElement.detachEvent('onkeydown', fastCheck);\n                }\n            }\n        };\n        mirror.observers.push(new ObserverInfo(callback, observer));\n        return observer;\n    }\n    jsonpatch.observe = observe;\n    function generate(observer) {\n        var mirror;\n        for (var i = 0, ilen = beforeDict.length; i < ilen; i++) {\n            if (beforeDict[i].obj === observer.object) {\n                mirror = beforeDict[i];\n                break;\n            }\n        }\n        _generate(mirror.value, observer.object, observer.patches, \"\");\n        if (observer.patches.length) {\n            apply(mirror.value, observer.patches);\n        }\n        var temp = observer.patches;\n        if (temp.length > 0) {\n            observer.patches = [];\n            if (observer.callback) {\n                observer.callback(temp);\n            }\n        }\n        return temp;\n    }\n    jsonpatch.generate = generate;\n    // Dirty check if obj is different from mirror, generate patches and update mirror\n    function _generate(mirror, obj, patches, path) {\n        var newKeys = _objectKeys(obj);\n        var oldKeys = _objectKeys(mirror);\n        var changed = false;\n        var deleted = false;\n        //if ever \"move\" operation is implemented here, make sure this test runs OK: \"should not generate the same patch twice (move)\"\n        for (var t = oldKeys.length - 1; t >= 0; t--) {\n            var key = oldKeys[t];\n            var oldVal = mirror[key];\n            if (obj.hasOwnProperty(key)) {\n                var newVal = obj[key];\n                if ((typeof oldVal === 'undefined' ? 'undefined' : _typeof(oldVal)) == \"object\" && oldVal != null && (typeof newVal === 'undefined' ? 'undefined' : _typeof(newVal)) == \"object\" && newVal != null) {\n                    _generate(oldVal, newVal, patches, path + \"/\" + escapePathComponent(key));\n                } else {\n                    if (oldVal != newVal) {\n                        changed = true;\n                        patches.push({ op: \"replace\", path: path + \"/\" + escapePathComponent(key), value: deepClone(newVal) });\n                    }\n                }\n            } else {\n                patches.push({ op: \"remove\", path: path + \"/\" + escapePathComponent(key) });\n                deleted = true; // property has been deleted\n            }\n        }\n        if (!deleted && newKeys.length == oldKeys.length) {\n            return;\n        }\n        for (var t = 0; t < newKeys.length; t++) {\n            var key = newKeys[t];\n            if (!mirror.hasOwnProperty(key)) {\n                patches.push({ op: \"add\", path: path + \"/\" + escapePathComponent(key), value: deepClone(obj[key]) });\n            }\n        }\n    }\n    var _isArray;\n    if (Array.isArray) {\n        _isArray = Array.isArray;\n    } else {\n        _isArray = function _isArray(obj) {\n            return obj.push && typeof obj.length === 'number';\n        };\n    }\n    //3x faster than cached /^\\d+$/.test(str)\n    function isInteger(str) {\n        var i = 0;\n        var len = str.length;\n        var charCode;\n        while (i < len) {\n            charCode = str.charCodeAt(i);\n            if (charCode >= 48 && charCode <= 57) {\n                i++;\n                continue;\n            }\n            return false;\n        }\n        return true;\n    }\n    /// Apply a json-patch operation on an object tree\n    function apply(tree, patches, validate) {\n        var result = false,\n            p = 0,\n            plen = patches.length,\n            patch,\n            key;\n        while (p < plen) {\n            patch = patches[p];\n            p++;\n            // Find the object\n            var path = patch.path || \"\";\n            var keys = path.split('/');\n            var obj = tree;\n            var t = 1; //skip empty element - http://jsperf.com/to-shift-or-not-to-shift\n            var len = keys.length;\n            var existingPathFragment = undefined;\n            while (true) {\n                key = keys[t];\n                if (validate) {\n                    if (existingPathFragment === undefined) {\n                        if (obj[key] === undefined) {\n                            existingPathFragment = keys.slice(0, t).join('/');\n                        } else if (t == len - 1) {\n                            existingPathFragment = patch.path;\n                        }\n                        if (existingPathFragment !== undefined) {\n                            this.validator(patch, p - 1, tree, existingPathFragment);\n                        }\n                    }\n                }\n                t++;\n                if (key === undefined) {\n                    if (t >= len) {\n                        result = rootOps[patch.op].call(patch, obj, key, tree); // Apply patch\n                        break;\n                    }\n                }\n                if (_isArray(obj)) {\n                    if (key === '-') {\n                        key = obj.length;\n                    } else {\n                        if (validate && !isInteger(key)) {\n                            throw new JsonPatchError(\"Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index\", \"OPERATION_PATH_ILLEGAL_ARRAY_INDEX\", p - 1, patch.path, patch);\n                        }\n                        key = parseInt(key, 10);\n                    }\n                    if (t >= len) {\n                        if (validate && patch.op === \"add\" && key > obj.length) {\n                            throw new JsonPatchError(\"The specified index MUST NOT be greater than the number of elements in the array\", \"OPERATION_VALUE_OUT_OF_BOUNDS\", p - 1, patch.path, patch);\n                        }\n                        result = arrOps[patch.op].call(patch, obj, key, tree); // Apply patch\n                        break;\n                    }\n                } else {\n                    if (key && key.indexOf('~') != -1) key = key.replace(/~1/g, '/').replace(/~0/g, '~'); // escape chars\n                    if (t >= len) {\n                        result = objOps[patch.op].call(patch, obj, key, tree); // Apply patch\n                        break;\n                    }\n                }\n                obj = obj[key];\n            }\n        }\n        return result;\n    }\n    jsonpatch.apply = apply;\n    function compare(tree1, tree2) {\n        var patches = [];\n        _generate(tree1, tree2, patches, '');\n        return patches;\n    }\n    jsonpatch.compare = compare;\n    var JsonPatchError = function (_super) {\n        __extends(JsonPatchError, _super);\n        function JsonPatchError(message, name, index, operation, tree) {\n            _super.call(this, message);\n            this.message = message;\n            this.name = name;\n            this.index = index;\n            this.operation = operation;\n            this.tree = tree;\n        }\n        return JsonPatchError;\n    }(OriginalError);\n    jsonpatch.JsonPatchError = JsonPatchError;\n    jsonpatch.Error = JsonPatchError;\n    /**\n     * Recursively checks whether an object has any undefined values inside.\n     */\n    function hasUndefined(obj) {\n        if (obj === undefined) {\n            return true;\n        }\n        if (typeof obj == \"array\" || (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) == \"object\") {\n            for (var i in obj) {\n                if (hasUndefined(obj[i])) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n    /**\n     * Validates a single operation. Called from `jsonpatch.validate`. Throws `JsonPatchError` in case of an error.\n     * @param {object} operation - operation object (patch)\n     * @param {number} index - index of operation in the sequence\n     * @param {object} [tree] - object where the operation is supposed to be applied\n     * @param {string} [existingPathFragment] - comes along with `tree`\n     */\n    function validator(operation, index, tree, existingPathFragment) {\n        if ((typeof operation === 'undefined' ? 'undefined' : _typeof(operation)) !== 'object' || operation === null || _isArray(operation)) {\n            throw new JsonPatchError('Operation is not an object', 'OPERATION_NOT_AN_OBJECT', index, operation, tree);\n        } else if (!objOps[operation.op]) {\n            throw new JsonPatchError('Operation `op` property is not one of operations defined in RFC-6902', 'OPERATION_OP_INVALID', index, operation, tree);\n        } else if (typeof operation.path !== 'string') {\n            throw new JsonPatchError('Operation `path` property is not a string', 'OPERATION_PATH_INVALID', index, operation, tree);\n        } else if ((operation.op === 'move' || operation.op === 'copy') && typeof operation.from !== 'string') {\n            throw new JsonPatchError('Operation `from` property is not present (applicable in `move` and `copy` operations)', 'OPERATION_FROM_REQUIRED', index, operation, tree);\n        } else if ((operation.op === 'add' || operation.op === 'replace' || operation.op === 'test') && operation.value === undefined) {\n            throw new JsonPatchError('Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)', 'OPERATION_VALUE_REQUIRED', index, operation, tree);\n        } else if ((operation.op === 'add' || operation.op === 'replace' || operation.op === 'test') && hasUndefined(operation.value)) {\n            throw new JsonPatchError('Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)', 'OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED', index, operation, tree);\n        } else if (tree) {\n            if (operation.op == \"add\") {\n                var pathLen = operation.path.split(\"/\").length;\n                var existingPathLen = existingPathFragment.split(\"/\").length;\n                if (pathLen !== existingPathLen + 1 && pathLen !== existingPathLen) {\n                    throw new JsonPatchError('Cannot perform an `add` operation at the desired path', 'OPERATION_PATH_CANNOT_ADD', index, operation, tree);\n                }\n            } else if (operation.op === 'replace' || operation.op === 'remove' || operation.op === '_get') {\n                if (operation.path !== existingPathFragment) {\n                    throw new JsonPatchError('Cannot perform the operation at a path that does not exist', 'OPERATION_PATH_UNRESOLVABLE', index, operation, tree);\n                }\n            } else if (operation.op === 'move' || operation.op === 'copy') {\n                var existingValue = { op: \"_get\", path: operation.from, value: undefined };\n                var error = jsonpatch.validate([existingValue], tree);\n                if (error && error.name === 'OPERATION_PATH_UNRESOLVABLE') {\n                    throw new JsonPatchError('Cannot perform the operation from a path that does not exist', 'OPERATION_FROM_UNRESOLVABLE', index, operation, tree);\n                }\n            }\n        }\n    }\n    jsonpatch.validator = validator;\n    /**\n     * Validates a sequence of operations. If `tree` parameter is provided, the sequence is additionally validated against the object tree.\n     * If error is encountered, returns a JsonPatchError object\n     * @param sequence\n     * @param tree\n     * @returns {JsonPatchError|undefined}\n     */\n    function validate(sequence, tree) {\n        try {\n            if (!_isArray(sequence)) {\n                throw new JsonPatchError('Patch sequence must be an array', 'SEQUENCE_NOT_AN_ARRAY');\n            }\n            if (tree) {\n                tree = JSON.parse(JSON.stringify(tree)); //clone tree so that we can safely try applying operations\n                apply.call(this, tree, sequence, true);\n            } else {\n                for (var i = 0; i < sequence.length; i++) {\n                    this.validator(sequence[i], i);\n                }\n            }\n        } catch (e) {\n            if (e instanceof JsonPatchError) {\n                return e;\n            } else {\n                throw e;\n            }\n        }\n    }\n    jsonpatch.validate = validate;\n})(jsonpatch || (jsonpatch = {}));\nif (true) {\n    exports.apply = jsonpatch.apply;\n    exports.observe = jsonpatch.observe;\n    exports.unobserve = jsonpatch.unobserve;\n    exports.generate = jsonpatch.generate;\n    exports.compare = jsonpatch.compare;\n    exports.validate = jsonpatch.validate;\n    exports.validator = jsonpatch.validator;\n    exports.JsonPatchError = jsonpatch.JsonPatchError;\n    exports.Error = jsonpatch.Error;\n}\n\n/***/ }),\n/* 206 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\n__webpack_require__(96);\n\n__webpack_require__(111);\n\n__webpack_require__(112);\n\n__webpack_require__(116);\n\n__webpack_require__(117);\n\n__webpack_require__(119);\n\n__webpack_require__(122);\n\n__webpack_require__(123);\n\n__webpack_require__(124);\n\n__webpack_require__(125);\n\n__webpack_require__(126);\n\n__webpack_require__(127);\n\n__webpack_require__(128);\n\n__webpack_require__(129);\n\n__webpack_require__(130);\n\n__webpack_require__(131);\n\n__webpack_require__(132);\n\n__webpack_require__(133);\n\n__webpack_require__(134);\n\n__webpack_require__(135);\n\n__webpack_require__(136);\n\n__webpack_require__(137);\n\n__webpack_require__(138);\n\n__webpack_require__(139);\n\n__webpack_require__(141);\n\n__webpack_require__(143);\n\n__webpack_require__(144);\n\n__webpack_require__(145);\n\n__webpack_require__(146);\n\n__webpack_require__(147);\n\n__webpack_require__(148);\n\n__webpack_require__(149);\n\n__webpack_require__(150);\n\n__webpack_require__(151);\n\n__webpack_require__(152);\n\n__webpack_require__(153);\n\n__webpack_require__(154);\n\n__webpack_require__(155);\n\n__webpack_require__(85);\n\n__webpack_require__(156);\n\n__webpack_require__(157);\n\n__webpack_require__(159);\n\n__webpack_require__(160);\n\n__webpack_require__(161);\n\n__webpack_require__(162);\n\n__webpack_require__(163);\n\n__webpack_require__(164);\n\n__webpack_require__(165);\n\n__webpack_require__(167);\n\n__webpack_require__(168);\n\n__webpack_require__(169);\n\n__webpack_require__(172);\n\n__webpack_require__(173);\n\n__webpack_require__(174);\n\n__webpack_require__(225);\n\n__webpack_require__(226);\n\n__webpack_require__(227);\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar _cellTypes = __webpack_require__(87);\n\nvar _core = __webpack_require__(88);\n\nvar _core2 = _interopRequireDefault(_core);\n\nvar _jquery = __webpack_require__(282);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _ghostTable = __webpack_require__(92);\n\nvar _ghostTable2 = _interopRequireDefault(_ghostTable);\n\nvar _array = __webpack_require__(1);\n\nvar arrayHelpers = _interopRequireWildcard(_array);\n\nvar _browser = __webpack_require__(27);\n\nvar browserHelpers = _interopRequireWildcard(_browser);\n\nvar _data = __webpack_require__(90);\n\nvar dataHelpers = _interopRequireWildcard(_data);\n\nvar _date = __webpack_require__(190);\n\nvar dateHelpers = _interopRequireWildcard(_date);\n\nvar _feature = __webpack_require__(40);\n\nvar featureHelpers = _interopRequireWildcard(_feature);\n\nvar _function = __webpack_require__(42);\n\nvar functionHelpers = _interopRequireWildcard(_function);\n\nvar _mixed = __webpack_require__(16);\n\nvar mixedHelpers = _interopRequireWildcard(_mixed);\n\nvar _number = __webpack_require__(5);\n\nvar numberHelpers = _interopRequireWildcard(_number);\n\nvar _object = __webpack_require__(2);\n\nvar objectHelpers = _interopRequireWildcard(_object);\n\nvar _setting = __webpack_require__(89);\n\nvar settingHelpers = _interopRequireWildcard(_setting);\n\nvar _string = __webpack_require__(36);\n\nvar stringHelpers = _interopRequireWildcard(_string);\n\nvar _unicode = __webpack_require__(21);\n\nvar unicodeHelpers = _interopRequireWildcard(_unicode);\n\nvar _element = __webpack_require__(0);\n\nvar domHelpers = _interopRequireWildcard(_element);\n\nvar _event = __webpack_require__(12);\n\nvar domEventHelpers = _interopRequireWildcard(_event);\n\nvar _index = __webpack_require__(283);\n\nvar plugins = _interopRequireWildcard(_index);\n\nvar _plugins = __webpack_require__(8);\n\nvar _defaultSettings = __webpack_require__(195);\n\nvar _defaultSettings2 = _interopRequireDefault(_defaultSettings);\n\nvar _rootInstance = __webpack_require__(194);\n\nvar _i18n = __webpack_require__(196);\n\nvar _constants = __webpack_require__(7);\n\nvar constants = _interopRequireWildcard(_constants);\n\nvar _dictionariesManager = __webpack_require__(71);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Handsontable(rootElement, userSettings) {\n  var instance = new _core2.default(rootElement, userSettings || {}, _rootInstance.rootInstanceSymbol);\n\n  instance.init();\n\n  return instance;\n}\n\n(0, _jquery2.default)(Handsontable);\n\nHandsontable.Core = _core2.default;\nHandsontable.DefaultSettings = _defaultSettings2.default;\nHandsontable.EventManager = _eventManager2.default;\nHandsontable._getListenersCounter = _eventManager.getListenersCounter; // For MemoryLeak tests\n\nHandsontable.buildDate = '10/04/2018 11:38:33';\nHandsontable.packageName = 'handsontable';\nHandsontable.version = '2.0.0';\n\nvar baseVersion = '';\n\nif (baseVersion) {\n  Handsontable.baseVersion = baseVersion;\n}\n\n// Export Hooks singleton\nHandsontable.hooks = _pluginHooks2.default.getSingleton();\n\n// TODO: Remove this exports after rewrite tests about this module\nHandsontable.__GhostTable = _ghostTable2.default;\n//\n\n// Export all helpers to the Handsontable object\nvar HELPERS = [arrayHelpers, browserHelpers, dataHelpers, dateHelpers, featureHelpers, functionHelpers, mixedHelpers, numberHelpers, objectHelpers, settingHelpers, stringHelpers, unicodeHelpers];\nvar DOM = [domHelpers, domEventHelpers];\n\nHandsontable.helper = {};\nHandsontable.dom = {};\n\n// Fill general helpers.\narrayHelpers.arrayEach(HELPERS, function (helper) {\n  arrayHelpers.arrayEach(Object.getOwnPropertyNames(helper), function (key) {\n    if (key.charAt(0) !== '_') {\n      Handsontable.helper[key] = helper[key];\n    }\n  });\n});\n\n// Fill DOM helpers.\narrayHelpers.arrayEach(DOM, function (helper) {\n  arrayHelpers.arrayEach(Object.getOwnPropertyNames(helper), function (key) {\n    if (key.charAt(0) !== '_') {\n      Handsontable.dom[key] = helper[key];\n    }\n  });\n});\n\n// Export cell types.\nHandsontable.cellTypes = {};\n\narrayHelpers.arrayEach((0, _cellTypes.getRegisteredCellTypeNames)(), function (cellTypeName) {\n  Handsontable.cellTypes[cellTypeName] = (0, _cellTypes.getCellType)(cellTypeName);\n});\n\nHandsontable.cellTypes.registerCellType = _cellTypes.registerCellType;\nHandsontable.cellTypes.getCellType = _cellTypes.getCellType;\n\n// Export all registered editors from the Handsontable.\nHandsontable.editors = {};\n\narrayHelpers.arrayEach((0, _editors.getRegisteredEditorNames)(), function (editorName) {\n  Handsontable.editors[stringHelpers.toUpperCaseFirst(editorName) + 'Editor'] = (0, _editors.getEditor)(editorName);\n});\n\nHandsontable.editors.registerEditor = _editors.registerEditor;\nHandsontable.editors.getEditor = _editors.getEditor;\n\n// Export all registered renderers from the Handsontable.\nHandsontable.renderers = {};\n\narrayHelpers.arrayEach((0, _renderers.getRegisteredRendererNames)(), function (rendererName) {\n  var renderer = (0, _renderers.getRenderer)(rendererName);\n\n  if (rendererName === 'base') {\n    Handsontable.renderers.cellDecorator = renderer;\n  }\n  Handsontable.renderers[stringHelpers.toUpperCaseFirst(rendererName) + 'Renderer'] = renderer;\n});\n\nHandsontable.renderers.registerRenderer = _renderers.registerRenderer;\nHandsontable.renderers.getRenderer = _renderers.getRenderer;\n\n// Export all registered validators from the Handsontable.\nHandsontable.validators = {};\n\narrayHelpers.arrayEach((0, _validators.getRegisteredValidatorNames)(), function (validatorName) {\n  Handsontable.validators[stringHelpers.toUpperCaseFirst(validatorName) + 'Validator'] = (0, _validators.getValidator)(validatorName);\n});\n\nHandsontable.validators.registerValidator = _validators.registerValidator;\nHandsontable.validators.getValidator = _validators.getValidator;\n\n// Export all registered plugins from the Handsontable.\nHandsontable.plugins = {};\n\narrayHelpers.arrayEach(Object.getOwnPropertyNames(plugins), function (pluginName) {\n  var plugin = plugins[pluginName];\n\n  if (pluginName === 'Base') {\n    Handsontable.plugins[pluginName + 'Plugin'] = plugin;\n  } else {\n    Handsontable.plugins[pluginName] = plugin;\n  }\n});\n\nHandsontable.plugins.registerPlugin = _plugins.registerPlugin;\n\nHandsontable.languages = {};\nHandsontable.languages.dictionaryKeys = constants;\nHandsontable.languages.getLanguageDictionary = _dictionariesManager.getLanguageDictionary;\nHandsontable.languages.getLanguagesDictionaries = _dictionariesManager.getLanguagesDictionaries;\nHandsontable.languages.registerLanguageDictionary = _dictionariesManager.registerLanguageDictionary;\n\n// Alias to `getTranslatedPhrase` function, for more information check it API.\nHandsontable.languages.getTranslatedPhrase = function () {\n  return _i18n.getTranslatedPhrase.apply(undefined, arguments);\n};\n\nexports.default = Handsontable;\n\n/***/ }),\n/* 207 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(20);\nvar anObject = __webpack_require__(18);\nvar getKeys = __webpack_require__(37);\n\nmodule.exports = __webpack_require__(22) ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var keys = getKeys(Properties);\n  var length = keys.length;\n  var i = 0;\n  var P;\n  while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n  return O;\n};\n\n\n/***/ }),\n/* 208 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar create = __webpack_require__(74);\nvar descriptor = __webpack_require__(49);\nvar setToStringTag = __webpack_require__(51);\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__webpack_require__(31)(IteratorPrototype, __webpack_require__(11)('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n\n/***/ }),\n/* 209 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nvar setPrototypeOf = __webpack_require__(110).set;\nmodule.exports = function (that, target, C) {\n  var S = target.constructor;\n  var P;\n  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n    setPrototypeOf(that, P);\n  } return that;\n};\n\n\n/***/ }),\n/* 210 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = __webpack_require__(211);\n\nmodule.exports = function (original, length) {\n  return new (speciesConstructor(original))(length);\n};\n\n\n/***/ }),\n/* 211 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nvar isArray = __webpack_require__(113);\nvar SPECIES = __webpack_require__(11)('species');\n\nmodule.exports = function (original) {\n  var C;\n  if (isArray(original)) {\n    C = original.constructor;\n    // cross-realm fallback\n    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n    if (isObject(C)) {\n      C = C[SPECIES];\n      if (C === null) C = undefined;\n    }\n  } return C === undefined ? Array : C;\n};\n\n\n/***/ }),\n/* 212 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = __webpack_require__(18);\nvar aFunction = __webpack_require__(62);\nvar SPECIES = __webpack_require__(11)('species');\nmodule.exports = function (O, D) {\n  var C = anObject(O).constructor;\n  var S;\n  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n\n\n/***/ }),\n/* 213 */\n/***/ (function(module, exports) {\n\n// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n  var un = that === undefined;\n  switch (args.length) {\n    case 0: return un ? fn()\n                      : fn.call(that);\n    case 1: return un ? fn(args[0])\n                      : fn.call(that, args[0]);\n    case 2: return un ? fn(args[0], args[1])\n                      : fn.call(that, args[0], args[1]);\n    case 3: return un ? fn(args[0], args[1], args[2])\n                      : fn.call(that, args[0], args[1], args[2]);\n    case 4: return un ? fn(args[0], args[1], args[2], args[3])\n                      : fn.call(that, args[0], args[1], args[2], args[3]);\n  } return fn.apply(that, args);\n};\n\n\n/***/ }),\n/* 214 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar macrotask = __webpack_require__(80).set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = __webpack_require__(43)(process) == 'process';\n\nmodule.exports = function () {\n  var head, last, notify;\n\n  var flush = function () {\n    var parent, fn;\n    if (isNode && (parent = process.domain)) parent.exit();\n    while (head) {\n      fn = head.fn;\n      head = head.next;\n      try {\n        fn();\n      } catch (e) {\n        if (head) notify();\n        else last = undefined;\n        throw e;\n      }\n    } last = undefined;\n    if (parent) parent.enter();\n  };\n\n  // Node.js\n  if (isNode) {\n    notify = function () {\n      process.nextTick(flush);\n    };\n  // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n  } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n    var toggle = true;\n    var node = document.createTextNode('');\n    new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n    notify = function () {\n      node.data = toggle = !toggle;\n    };\n  // environments with maybe non-completely correct, but existent Promise\n  } else if (Promise && Promise.resolve) {\n    var promise = Promise.resolve();\n    notify = function () {\n      promise.then(flush);\n    };\n  // for other environments - macrotask based on:\n  // - setImmediate\n  // - MessageChannel\n  // - window.postMessag\n  // - onreadystatechange\n  // - setTimeout\n  } else {\n    notify = function () {\n      // strange IE + webpack dev server bug - use .call(global)\n      macrotask.call(global, flush);\n    };\n  }\n\n  return function (fn) {\n    var task = { fn: fn, next: undefined };\n    if (last) last.next = task;\n    if (!head) {\n      head = task;\n      notify();\n    } last = task;\n  };\n};\n\n\n/***/ }),\n/* 215 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (exec) {\n  try {\n    return { e: false, v: exec() };\n  } catch (e) {\n    return { e: true, v: e };\n  }\n};\n\n\n/***/ }),\n/* 216 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(18);\nvar isObject = __webpack_require__(9);\nvar newPromiseCapability = __webpack_require__(118);\n\nmodule.exports = function (C, x) {\n  anObject(C);\n  if (isObject(x) && x.constructor === C) return x;\n  var promiseCapability = newPromiseCapability.f(C);\n  var resolve = promiseCapability.resolve;\n  resolve(x);\n  return promiseCapability.promise;\n};\n\n\n/***/ }),\n/* 217 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar core = __webpack_require__(44);\nvar LIBRARY = __webpack_require__(65);\nvar wksExt = __webpack_require__(120);\nvar defineProperty = __webpack_require__(20).f;\nmodule.exports = function (name) {\n  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n\n\n/***/ }),\n/* 218 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// all enumerable object keys, includes symbols\nvar getKeys = __webpack_require__(37);\nvar gOPS = __webpack_require__(69);\nvar pIE = __webpack_require__(52);\nmodule.exports = function (it) {\n  var result = getKeys(it);\n  var getSymbols = gOPS.f;\n  if (getSymbols) {\n    var symbols = getSymbols(it);\n    var isEnum = pIE.f;\n    var i = 0;\n    var key;\n    while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n  } return result;\n};\n\n\n/***/ }),\n/* 219 */\n/***/ (function(module, exports) {\n\n// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n  // eslint-disable-next-line no-self-compare\n  return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n\n\n/***/ }),\n/* 220 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(59);\nvar defined = __webpack_require__(38);\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n  return function (that, pos) {\n    var s = String(defined(that));\n    var i = toInteger(pos);\n    var l = s.length;\n    var a, b;\n    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n      ? TO_STRING ? s.charAt(i) : a\n      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n\n\n/***/ }),\n/* 221 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = __webpack_require__(18);\nmodule.exports = function () {\n  var that = anObject(this);\n  var result = '';\n  if (that.global) result += 'g';\n  if (that.ignoreCase) result += 'i';\n  if (that.multiline) result += 'm';\n  if (that.unicode) result += 'u';\n  if (that.sticky) result += 'y';\n  return result;\n};\n\n\n/***/ }),\n/* 222 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n\nvar toObject = __webpack_require__(33);\nvar toAbsoluteIndex = __webpack_require__(60);\nvar toLength = __webpack_require__(25);\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n  var O = toObject(this);\n  var len = toLength(O.length);\n  var to = toAbsoluteIndex(target, len);\n  var from = toAbsoluteIndex(start, len);\n  var end = arguments.length > 2 ? arguments[2] : undefined;\n  var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n  var inc = 1;\n  if (from < to && to < from + count) {\n    inc = -1;\n    from += count - 1;\n    to += count - 1;\n  }\n  while (count-- > 0) {\n    if (from in O) O[to] = O[from];\n    else delete O[to];\n    to += inc;\n    from += inc;\n  } return O;\n};\n\n\n/***/ }),\n/* 223 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n\nvar toObject = __webpack_require__(33);\nvar toAbsoluteIndex = __webpack_require__(60);\nvar toLength = __webpack_require__(25);\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n  var O = toObject(this);\n  var length = toLength(O.length);\n  var aLen = arguments.length;\n  var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n  var end = aLen > 2 ? arguments[2] : undefined;\n  var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n  while (endPos > index) O[index++] = value;\n  return O;\n};\n\n\n/***/ }),\n/* 224 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// all object keys, includes non-enumerable and symbols\nvar gOPN = __webpack_require__(81);\nvar gOPS = __webpack_require__(69);\nvar anObject = __webpack_require__(18);\nvar Reflect = __webpack_require__(14).Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n  var keys = gOPN.f(anObject(it));\n  var getSymbols = gOPS.f;\n  return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n\n\n/***/ }),\n/* 225 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 226 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 227 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 228 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * A overlay that renders ALL available rows & columns positioned on top of the original Walkontable instance and all other overlays.\n * Used for debugging purposes to see if the other overlays (that render only part of the rows & columns) are positioned correctly\n *\n * @class DebugOverlay\n */\nvar DebugOverlay = function (_Overlay) {\n  _inherits(DebugOverlay, _Overlay);\n\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function DebugOverlay(wotInstance) {\n    _classCallCheck(this, DebugOverlay);\n\n    var _this = _possibleConstructorReturn(this, (DebugOverlay.__proto__ || Object.getPrototypeOf(DebugOverlay)).call(this, wotInstance));\n\n    _this.clone = _this.makeClone(_base2.default.CLONE_DEBUG);\n    _this.clone.wtTable.holder.style.opacity = 0.4;\n    _this.clone.wtTable.holder.style.textShadow = '0 0 2px #ff0000';\n\n    (0, _element.addClass)(_this.clone.wtTable.holder.parentNode, 'wtDebugVisible');\n    return _this;\n  }\n\n  return DebugOverlay;\n}(_base2.default);\n\n_base2.default.registerOverlay(_base2.default.CLONE_DEBUG, DebugOverlay);\n\nexports.default = DebugOverlay;\n\n/***/ }),\n/* 229 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @class LeftOverlay\n */\nvar LeftOverlay = function (_Overlay) {\n  _inherits(LeftOverlay, _Overlay);\n\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function LeftOverlay(wotInstance) {\n    _classCallCheck(this, LeftOverlay);\n\n    var _this = _possibleConstructorReturn(this, (LeftOverlay.__proto__ || Object.getPrototypeOf(LeftOverlay)).call(this, wotInstance));\n\n    _this.clone = _this.makeClone(_base2.default.CLONE_LEFT);\n    return _this;\n  }\n\n  /**\n   * Checks if overlay should be fully rendered\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(LeftOverlay, [{\n    key: 'shouldBeRendered',\n    value: function shouldBeRendered() {\n      return !!(this.wot.getSetting('fixedColumnsLeft') || this.wot.getSetting('rowHeaders').length);\n    }\n\n    /**\n     * Updates the left overlay position\n     */\n\n  }, {\n    key: 'resetFixedPosition',\n    value: function resetFixedPosition() {\n      if (!this.needFullRender || !this.wot.wtTable.holder.parentNode) {\n        // removed from DOM\n        return;\n      }\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var headerPosition = 0;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (this.trimmingContainer === window && (!preventOverflow || preventOverflow !== 'horizontal')) {\n        var box = this.wot.wtTable.hider.getBoundingClientRect();\n        var left = Math.ceil(box.left);\n        var right = Math.ceil(box.right);\n        var finalLeft = void 0;\n        var finalTop = void 0;\n\n        finalTop = this.wot.wtTable.hider.style.top;\n        finalTop = finalTop === '' ? 0 : finalTop;\n\n        if (left < 0 && right - overlayRoot.offsetWidth > 0) {\n          finalLeft = -left;\n        } else {\n          finalLeft = 0;\n        }\n        headerPosition = finalLeft;\n        finalLeft += 'px';\n\n        (0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop);\n      } else {\n        headerPosition = this.getScrollPosition();\n        (0, _element.resetCssTransform)(overlayRoot);\n      }\n      this.adjustHeaderBordersPosition(headerPosition);\n\n      this.adjustElementsSize();\n    }\n\n    /**\n     * Sets the main overlay's horizontal scroll position\n     *\n     * @param {Number} pos\n     */\n\n  }, {\n    key: 'setScrollPosition',\n    value: function setScrollPosition(pos) {\n      if (this.mainTableScrollableElement === window) {\n        window.scrollTo(pos, (0, _element.getWindowScrollTop)());\n      } else {\n        this.mainTableScrollableElement.scrollLeft = pos;\n      }\n    }\n\n    /**\n     * Triggers onScroll hook callback\n     */\n\n  }, {\n    key: 'onScroll',\n    value: function onScroll() {\n      this.wot.getSetting('onScrollVertically');\n    }\n\n    /**\n     * Calculates total sum cells width\n     *\n     * @param {Number} from Column index which calculates started from\n     * @param {Number} to Column index where calculation is finished\n     * @returns {Number} Width sum\n     */\n\n  }, {\n    key: 'sumCellSizes',\n    value: function sumCellSizes(from, to) {\n      var sum = 0;\n      var defaultColumnWidth = this.wot.wtSettings.defaultColumnWidth;\n\n      while (from < to) {\n        sum += this.wot.wtTable.getStretchedColumnWidth(from) || defaultColumnWidth;\n        from++;\n      }\n\n      return sum;\n    }\n\n    /**\n     * Adjust overlay root element, childs and master table element sizes (width, height).\n     *\n     * @param {Boolean} [force=false]\n     */\n\n  }, {\n    key: 'adjustElementsSize',\n    value: function adjustElementsSize() {\n      var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      this.updateTrimmingContainer();\n\n      if (this.needFullRender || force) {\n        this.adjustRootElementSize();\n        this.adjustRootChildrenSize();\n\n        if (!force) {\n          this.areElementSizesAdjusted = true;\n        }\n      }\n    }\n\n    /**\n     * Adjust overlay root element size (width and height).\n     */\n\n  }, {\n    key: 'adjustRootElementSize',\n    value: function adjustRootElementSize() {\n      var masterHolder = this.wot.wtTable.holder;\n      var scrollbarHeight = masterHolder.clientHeight === masterHolder.offsetHeight ? 0 : (0, _element.getScrollbarWidth)();\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var overlayRootStyle = overlayRoot.style;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n      var tableWidth = void 0;\n\n      if (this.trimmingContainer !== window || preventOverflow === 'vertical') {\n        var height = this.wot.wtViewport.getWorkspaceHeight() - scrollbarHeight;\n\n        height = Math.min(height, (0, _element.innerHeight)(this.wot.wtTable.wtRootElement));\n\n        overlayRootStyle.height = height + 'px';\n      } else {\n        overlayRootStyle.height = '';\n      }\n\n      this.clone.wtTable.holder.style.height = overlayRootStyle.height;\n\n      tableWidth = (0, _element.outerWidth)(this.clone.wtTable.TABLE);\n      overlayRootStyle.width = (tableWidth === 0 ? tableWidth : tableWidth + 4) + 'px';\n    }\n\n    /**\n     * Adjust overlay root childs size\n     */\n\n  }, {\n    key: 'adjustRootChildrenSize',\n    value: function adjustRootChildrenSize() {\n      var scrollbarWidth = (0, _element.getScrollbarWidth)();\n\n      this.clone.wtTable.hider.style.height = this.hider.style.height;\n      this.clone.wtTable.holder.style.height = this.clone.wtTable.holder.parentNode.style.height;\n\n      if (scrollbarWidth === 0) {\n        scrollbarWidth = 30;\n      }\n      this.clone.wtTable.holder.style.width = parseInt(this.clone.wtTable.holder.parentNode.style.width, 10) + scrollbarWidth + 'px';\n    }\n\n    /**\n     * Adjust the overlay dimensions and position\n     */\n\n  }, {\n    key: 'applyToDOM',\n    value: function applyToDOM() {\n      var total = this.wot.getSetting('totalColumns');\n\n      if (!this.areElementSizesAdjusted) {\n        this.adjustElementsSize();\n      }\n      if (typeof this.wot.wtViewport.columnsRenderCalculator.startPosition === 'number') {\n        this.spreader.style.left = this.wot.wtViewport.columnsRenderCalculator.startPosition + 'px';\n      } else if (total === 0) {\n        this.spreader.style.left = '0';\n      } else {\n        throw new Error('Incorrect value of the columnsRenderCalculator');\n      }\n      this.spreader.style.right = '';\n\n      if (this.needFullRender) {\n        this.syncOverlayOffset();\n      }\n    }\n\n    /**\n     * Synchronize calculated top position to an element\n     */\n\n  }, {\n    key: 'syncOverlayOffset',\n    value: function syncOverlayOffset() {\n      if (typeof this.wot.wtViewport.rowsRenderCalculator.startPosition === 'number') {\n        this.clone.wtTable.spreader.style.top = this.wot.wtViewport.rowsRenderCalculator.startPosition + 'px';\n      } else {\n        this.clone.wtTable.spreader.style.top = '';\n      }\n    }\n\n    /**\n     * Scrolls horizontally to a column at the left edge of the viewport\n     *\n     * @param sourceCol {Number} Column index which you want to scroll to\n     * @param [beyondRendered=false] {Boolean} if `true`, scrolls according to the bottom edge (top edge is by default)\n     */\n\n  }, {\n    key: 'scrollTo',\n    value: function scrollTo(sourceCol, beyondRendered) {\n      var newX = this.getTableParentOffset();\n      var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot;\n      var mainHolder = sourceInstance.wtTable.holder;\n      var scrollbarCompensation = 0;\n\n      if (beyondRendered && mainHolder.offsetWidth !== mainHolder.clientWidth) {\n        scrollbarCompensation = (0, _element.getScrollbarWidth)();\n      }\n      if (beyondRendered) {\n        newX += this.sumCellSizes(0, sourceCol + 1);\n        newX -= this.wot.wtViewport.getViewportWidth();\n      } else {\n        newX += this.sumCellSizes(this.wot.getSetting('fixedColumnsLeft'), sourceCol);\n      }\n      newX += scrollbarCompensation;\n\n      this.setScrollPosition(newX);\n    }\n\n    /**\n     * Gets table parent left position\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getTableParentOffset',\n    value: function getTableParentOffset() {\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n      var offset = 0;\n\n      if (!preventOverflow && this.trimmingContainer === window) {\n        offset = this.wot.wtTable.holderOffset.left;\n      }\n\n      return offset;\n    }\n\n    /**\n     * Gets the main overlay's horizontal scroll position\n     *\n     * @returns {Number} Main table's vertical scroll position\n     */\n\n  }, {\n    key: 'getScrollPosition',\n    value: function getScrollPosition() {\n      return (0, _element.getScrollLeft)(this.mainTableScrollableElement);\n    }\n\n    /**\n     * Adds css classes to hide the header border's header (cell-selection border hiding issue)\n     *\n     * @param {Number} position Header X position if trimming container is window or scroll top if not\n     */\n\n  }, {\n    key: 'adjustHeaderBordersPosition',\n    value: function adjustHeaderBordersPosition(position) {\n      var masterParent = this.wot.wtTable.holder.parentNode;\n      var rowHeaders = this.wot.getSetting('rowHeaders');\n      var fixedColumnsLeft = this.wot.getSetting('fixedColumnsLeft');\n      var totalRows = this.wot.getSetting('totalRows');\n\n      if (totalRows) {\n        (0, _element.removeClass)(masterParent, 'emptyRows');\n      } else {\n        (0, _element.addClass)(masterParent, 'emptyRows');\n      }\n\n      if (fixedColumnsLeft && !rowHeaders.length) {\n        (0, _element.addClass)(masterParent, 'innerBorderLeft');\n      } else if (!fixedColumnsLeft && rowHeaders.length) {\n        var previousState = (0, _element.hasClass)(masterParent, 'innerBorderLeft');\n\n        if (position) {\n          (0, _element.addClass)(masterParent, 'innerBorderLeft');\n        } else {\n          (0, _element.removeClass)(masterParent, 'innerBorderLeft');\n        }\n        if (!previousState && position || previousState && !position) {\n          this.wot.wtOverlays.adjustElementsSize();\n        }\n      }\n    }\n  }]);\n\n  return LeftOverlay;\n}(_base2.default);\n\n_base2.default.registerOverlay(_base2.default.CLONE_LEFT, LeftOverlay);\n\nexports.default = LeftOverlay;\n\n/***/ }),\n/* 230 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @class TopOverlay\n */\nvar TopOverlay = function (_Overlay) {\n  _inherits(TopOverlay, _Overlay);\n\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function TopOverlay(wotInstance) {\n    _classCallCheck(this, TopOverlay);\n\n    var _this = _possibleConstructorReturn(this, (TopOverlay.__proto__ || Object.getPrototypeOf(TopOverlay)).call(this, wotInstance));\n\n    _this.clone = _this.makeClone(_base2.default.CLONE_TOP);\n    return _this;\n  }\n\n  /**\n   * Checks if overlay should be fully rendered\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(TopOverlay, [{\n    key: 'shouldBeRendered',\n    value: function shouldBeRendered() {\n      return !!(this.wot.getSetting('fixedRowsTop') || this.wot.getSetting('columnHeaders').length);\n    }\n\n    /**\n     * Updates the top overlay position\n     */\n\n  }, {\n    key: 'resetFixedPosition',\n    value: function resetFixedPosition() {\n      if (!this.needFullRender || !this.wot.wtTable.holder.parentNode) {\n        // removed from DOM\n        return;\n      }\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var headerPosition = 0;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (this.trimmingContainer === window && (!preventOverflow || preventOverflow !== 'vertical')) {\n        var box = this.wot.wtTable.hider.getBoundingClientRect();\n        var top = Math.ceil(box.top);\n        var bottom = Math.ceil(box.bottom);\n        var finalLeft = void 0;\n        var finalTop = void 0;\n\n        finalLeft = this.wot.wtTable.hider.style.left;\n        finalLeft = finalLeft === '' ? 0 : finalLeft;\n\n        if (top < 0 && bottom - overlayRoot.offsetHeight > 0) {\n          finalTop = -top;\n        } else {\n          finalTop = 0;\n        }\n        headerPosition = finalTop;\n        finalTop += 'px';\n\n        (0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop);\n      } else {\n        headerPosition = this.getScrollPosition();\n        (0, _element.resetCssTransform)(overlayRoot);\n      }\n\n      this.adjustHeaderBordersPosition(headerPosition);\n\n      this.adjustElementsSize();\n    }\n\n    /**\n     * Sets the main overlay's vertical scroll position\n     *\n     * @param {Number} pos\n     */\n\n  }, {\n    key: 'setScrollPosition',\n    value: function setScrollPosition(pos) {\n      if (this.mainTableScrollableElement === window) {\n        window.scrollTo((0, _element.getWindowScrollLeft)(), pos);\n      } else {\n        this.mainTableScrollableElement.scrollTop = pos;\n      }\n    }\n\n    /**\n     * Triggers onScroll hook callback\n     */\n\n  }, {\n    key: 'onScroll',\n    value: function onScroll() {\n      this.wot.getSetting('onScrollHorizontally');\n    }\n\n    /**\n     * Calculates total sum cells height\n     *\n     * @param {Number} from Row index which calculates started from\n     * @param {Number} to Row index where calculation is finished\n     * @returns {Number} Height sum\n     */\n\n  }, {\n    key: 'sumCellSizes',\n    value: function sumCellSizes(from, to) {\n      var sum = 0;\n      var defaultRowHeight = this.wot.wtSettings.settings.defaultRowHeight;\n\n      while (from < to) {\n        var height = this.wot.wtTable.getRowHeight(from);\n\n        sum += height === void 0 ? defaultRowHeight : height;\n        from++;\n      }\n\n      return sum;\n    }\n\n    /**\n     * Adjust overlay root element, childs and master table element sizes (width, height).\n     *\n     * @param {Boolean} [force=false]\n     */\n\n  }, {\n    key: 'adjustElementsSize',\n    value: function adjustElementsSize() {\n      var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      this.updateTrimmingContainer();\n\n      if (this.needFullRender || force) {\n        this.adjustRootElementSize();\n        this.adjustRootChildrenSize();\n\n        if (!force) {\n          this.areElementSizesAdjusted = true;\n        }\n      }\n    }\n\n    /**\n     * Adjust overlay root element size (width and height).\n     */\n\n  }, {\n    key: 'adjustRootElementSize',\n    value: function adjustRootElementSize() {\n      var masterHolder = this.wot.wtTable.holder;\n      var scrollbarWidth = masterHolder.clientWidth === masterHolder.offsetWidth ? 0 : (0, _element.getScrollbarWidth)();\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var overlayRootStyle = overlayRoot.style;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n      var tableHeight = void 0;\n\n      if (this.trimmingContainer !== window || preventOverflow === 'horizontal') {\n        var width = this.wot.wtViewport.getWorkspaceWidth() - scrollbarWidth;\n\n        width = Math.min(width, (0, _element.innerWidth)(this.wot.wtTable.wtRootElement));\n\n        overlayRootStyle.width = width + 'px';\n      } else {\n        overlayRootStyle.width = '';\n      }\n\n      this.clone.wtTable.holder.style.width = overlayRootStyle.width;\n\n      tableHeight = (0, _element.outerHeight)(this.clone.wtTable.TABLE);\n      overlayRootStyle.height = (tableHeight === 0 ? tableHeight : tableHeight + 4) + 'px';\n    }\n\n    /**\n     * Adjust overlay root childs size\n     */\n\n  }, {\n    key: 'adjustRootChildrenSize',\n    value: function adjustRootChildrenSize() {\n      var scrollbarWidth = (0, _element.getScrollbarWidth)();\n\n      this.clone.wtTable.hider.style.width = this.hider.style.width;\n      this.clone.wtTable.holder.style.width = this.clone.wtTable.holder.parentNode.style.width;\n\n      if (scrollbarWidth === 0) {\n        scrollbarWidth = 30;\n      }\n      this.clone.wtTable.holder.style.height = parseInt(this.clone.wtTable.holder.parentNode.style.height, 10) + scrollbarWidth + 'px';\n    }\n\n    /**\n     * Adjust the overlay dimensions and position\n     */\n\n  }, {\n    key: 'applyToDOM',\n    value: function applyToDOM() {\n      var total = this.wot.getSetting('totalRows');\n\n      if (!this.areElementSizesAdjusted) {\n        this.adjustElementsSize();\n      }\n      if (typeof this.wot.wtViewport.rowsRenderCalculator.startPosition === 'number') {\n        this.spreader.style.top = this.wot.wtViewport.rowsRenderCalculator.startPosition + 'px';\n      } else if (total === 0) {\n        // can happen if there are 0 rows\n        this.spreader.style.top = '0';\n      } else {\n        throw new Error('Incorrect value of the rowsRenderCalculator');\n      }\n      this.spreader.style.bottom = '';\n\n      if (this.needFullRender) {\n        this.syncOverlayOffset();\n      }\n    }\n\n    /**\n     * Synchronize calculated left position to an element\n     */\n\n  }, {\n    key: 'syncOverlayOffset',\n    value: function syncOverlayOffset() {\n      if (typeof this.wot.wtViewport.columnsRenderCalculator.startPosition === 'number') {\n        this.clone.wtTable.spreader.style.left = this.wot.wtViewport.columnsRenderCalculator.startPosition + 'px';\n      } else {\n        this.clone.wtTable.spreader.style.left = '';\n      }\n    }\n\n    /**\n     * Scrolls vertically to a row\n     *\n     * @param sourceRow {Number} Row index which you want to scroll to\n     * @param [bottomEdge=false] {Boolean} if `true`, scrolls according to the bottom edge (top edge is by default)\n     */\n\n  }, {\n    key: 'scrollTo',\n    value: function scrollTo(sourceRow, bottomEdge) {\n      var newY = this.getTableParentOffset();\n      var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot;\n      var mainHolder = sourceInstance.wtTable.holder;\n      var scrollbarCompensation = 0;\n\n      if (bottomEdge && mainHolder.offsetHeight !== mainHolder.clientHeight) {\n        scrollbarCompensation = (0, _element.getScrollbarWidth)();\n      }\n\n      if (bottomEdge) {\n        var fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');\n        var fixedRowsTop = this.wot.getSetting('fixedRowsTop');\n        var totalRows = this.wot.getSetting('totalRows');\n\n        newY += this.sumCellSizes(0, sourceRow + 1);\n        newY -= this.wot.wtViewport.getViewportHeight() - this.sumCellSizes(totalRows - fixedRowsBottom, totalRows);\n        // Fix 1 pixel offset when cell is selected\n        newY += 1;\n      } else {\n        newY += this.sumCellSizes(this.wot.getSetting('fixedRowsTop'), sourceRow);\n      }\n      newY += scrollbarCompensation;\n\n      this.setScrollPosition(newY);\n    }\n\n    /**\n     * Gets table parent top position\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getTableParentOffset',\n    value: function getTableParentOffset() {\n      if (this.mainTableScrollableElement === window) {\n        return this.wot.wtTable.holderOffset.top;\n      }\n      return 0;\n    }\n\n    /**\n     * Gets the main overlay's vertical scroll position\n     *\n     * @returns {Number} Main table's vertical scroll position\n     */\n\n  }, {\n    key: 'getScrollPosition',\n    value: function getScrollPosition() {\n      return (0, _element.getScrollTop)(this.mainTableScrollableElement);\n    }\n\n    /**\n     * Redraw borders of selection\n     *\n     * @param {WalkontableSelection} selection Selection for redraw\n     */\n\n  }, {\n    key: 'redrawSelectionBorders',\n    value: function redrawSelectionBorders(selection) {\n      if (selection && selection.cellRange) {\n        var border = selection.getBorder(this.wot);\n        var corners = selection.getCorners();\n\n        border.disappear();\n        border.appear(corners);\n      }\n    }\n\n    /**\n     * Redrawing borders of all selections\n     */\n\n  }, {\n    key: 'redrawAllSelectionsBorders',\n    value: function redrawAllSelectionsBorders() {\n      var _this2 = this;\n\n      var selections = this.wot.selections;\n\n      this.redrawSelectionBorders(selections.getCell());\n\n      (0, _array.arrayEach)(selections.getAreas(), function (area) {\n        _this2.redrawSelectionBorders(area);\n      });\n      this.redrawSelectionBorders(selections.getFill());\n\n      this.wot.wtTable.wot.wtOverlays.leftOverlay.refresh();\n    }\n\n    /**\n     * Adds css classes to hide the header border's header (cell-selection border hiding issue)\n     *\n     * @param {Number} position Header Y position if trimming container is window or scroll top if not\n     */\n\n  }, {\n    key: 'adjustHeaderBordersPosition',\n    value: function adjustHeaderBordersPosition(position) {\n      var masterParent = this.wot.wtTable.holder.parentNode;\n      var totalColumns = this.wot.getSetting('totalColumns');\n\n      if (totalColumns) {\n        (0, _element.removeClass)(masterParent, 'emptyColumns');\n      } else {\n        (0, _element.addClass)(masterParent, 'emptyColumns');\n      }\n\n      if (this.wot.getSetting('fixedRowsTop') === 0 && this.wot.getSetting('columnHeaders').length > 0) {\n        var previousState = (0, _element.hasClass)(masterParent, 'innerBorderTop');\n\n        if (position || this.wot.getSetting('totalRows') === 0) {\n          (0, _element.addClass)(masterParent, 'innerBorderTop');\n        } else {\n          (0, _element.removeClass)(masterParent, 'innerBorderTop');\n        }\n\n        if (!previousState && position || previousState && !position) {\n          this.wot.wtOverlays.adjustElementsSize();\n\n          // cell borders should be positioned once again,\n          // because we added / removed 1px border from table header\n          this.redrawAllSelectionsBorders();\n        }\n      }\n\n      // nasty workaround for double border in the header, TODO: find a pure-css solution\n      if (this.wot.getSetting('rowHeaders').length === 0) {\n        var secondHeaderCell = this.clone.wtTable.THEAD.querySelectorAll('th:nth-of-type(2)');\n\n        if (secondHeaderCell) {\n          for (var i = 0; i < secondHeaderCell.length; i++) {\n            secondHeaderCell[i].style['border-left-width'] = 0;\n          }\n        }\n      }\n    }\n  }]);\n\n  return TopOverlay;\n}(_base2.default);\n\n_base2.default.registerOverlay(_base2.default.CLONE_TOP, TopOverlay);\n\nexports.default = TopOverlay;\n\n/***/ }),\n/* 231 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @class TopLeftCornerOverlay\n */\nvar TopLeftCornerOverlay = function (_Overlay) {\n  _inherits(TopLeftCornerOverlay, _Overlay);\n\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function TopLeftCornerOverlay(wotInstance) {\n    _classCallCheck(this, TopLeftCornerOverlay);\n\n    var _this = _possibleConstructorReturn(this, (TopLeftCornerOverlay.__proto__ || Object.getPrototypeOf(TopLeftCornerOverlay)).call(this, wotInstance));\n\n    _this.clone = _this.makeClone(_base2.default.CLONE_TOP_LEFT_CORNER);\n    return _this;\n  }\n\n  /**\n   * Checks if overlay should be fully rendered\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(TopLeftCornerOverlay, [{\n    key: 'shouldBeRendered',\n    value: function shouldBeRendered() {\n      return !!((this.wot.getSetting('fixedRowsTop') || this.wot.getSetting('columnHeaders').length) && (this.wot.getSetting('fixedColumnsLeft') || this.wot.getSetting('rowHeaders').length));\n    }\n\n    /**\n     * Updates the corner overlay position\n     */\n\n  }, {\n    key: 'resetFixedPosition',\n    value: function resetFixedPosition() {\n      this.updateTrimmingContainer();\n\n      if (!this.wot.wtTable.holder.parentNode) {\n        // removed from DOM\n        return;\n      }\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var tableHeight = (0, _element.outerHeight)(this.clone.wtTable.TABLE);\n      var tableWidth = (0, _element.outerWidth)(this.clone.wtTable.TABLE);\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (this.trimmingContainer === window) {\n        var box = this.wot.wtTable.hider.getBoundingClientRect();\n        var top = Math.ceil(box.top);\n        var left = Math.ceil(box.left);\n        var bottom = Math.ceil(box.bottom);\n        var right = Math.ceil(box.right);\n        var finalLeft = '0';\n        var finalTop = '0';\n\n        if (!preventOverflow || preventOverflow === 'vertical') {\n          if (left < 0 && right - overlayRoot.offsetWidth > 0) {\n            finalLeft = -left + 'px';\n          }\n        }\n\n        if (!preventOverflow || preventOverflow === 'horizontal') {\n          if (top < 0 && bottom - overlayRoot.offsetHeight > 0) {\n            finalTop = -top + 'px';\n          }\n        }\n        (0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop);\n      } else {\n        (0, _element.resetCssTransform)(overlayRoot);\n      }\n      overlayRoot.style.height = (tableHeight === 0 ? tableHeight : tableHeight + 4) + 'px';\n      overlayRoot.style.width = (tableWidth === 0 ? tableWidth : tableWidth + 4) + 'px';\n    }\n  }]);\n\n  return TopLeftCornerOverlay;\n}(_base2.default);\n\n_base2.default.registerOverlay(_base2.default.CLONE_TOP_LEFT_CORNER, TopLeftCornerOverlay);\n\nexports.default = TopLeftCornerOverlay;\n\n/***/ }),\n/* 232 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _border = __webpack_require__(187);\n\nvar _border2 = _interopRequireDefault(_border);\n\nvar _coords = __webpack_require__(54);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nvar _range = __webpack_require__(86);\n\nvar _range2 = _interopRequireDefault(_range);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Selection\n */\nvar Selection = function () {\n  /**\n   * @param {Object} settings\n   * @param {CellRange} cellRange\n   */\n  function Selection(settings, cellRange) {\n    _classCallCheck(this, Selection);\n\n    this.settings = settings;\n    this.cellRange = cellRange || null;\n    this.instanceBorders = {};\n    this.classNames = [this.settings.className];\n    this.classNameGenerator = this.linearClassNameGenerator(this.settings.className, this.settings.layerLevel);\n  }\n\n  /**\n   * Each Walkontable clone requires it's own border for every selection. This method creates and returns selection\n   * borders per instance\n   *\n   * @param {Walkontable} wotInstance\n   * @returns {Border}\n   */\n\n\n  _createClass(Selection, [{\n    key: 'getBorder',\n    value: function getBorder(wotInstance) {\n      if (!this.instanceBorders[wotInstance.guid]) {\n        this.instanceBorders[wotInstance.guid] = new _border2.default(wotInstance, this.settings);\n      }\n\n      return this.instanceBorders[wotInstance.guid];\n    }\n\n    /**\n     * Checks if selection is empty\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isEmpty',\n    value: function isEmpty() {\n      return this.cellRange === null;\n    }\n\n    /**\n     * Adds a cell coords to the selection\n     *\n     * @param {CellCoords} coords\n     */\n\n  }, {\n    key: 'add',\n    value: function add(coords) {\n      if (this.isEmpty()) {\n        this.cellRange = new _range2.default(coords);\n      } else {\n        this.cellRange.expand(coords);\n      }\n\n      return this;\n    }\n\n    /**\n     * If selection range from or to property equals oldCoords, replace it with newCoords. Return boolean\n     * information about success\n     *\n     * @param {CellCoords} oldCoords\n     * @param {CellCoords} newCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'replace',\n    value: function replace(oldCoords, newCoords) {\n      if (!this.isEmpty()) {\n        if (this.cellRange.from.isEqual(oldCoords)) {\n          this.cellRange.from = newCoords;\n\n          return true;\n        }\n        if (this.cellRange.to.isEqual(oldCoords)) {\n          this.cellRange.to = newCoords;\n\n          return true;\n        }\n      }\n\n      return false;\n    }\n\n    /**\n     * Clears selection\n     *\n     * @returns {Selection}\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.cellRange = null;\n\n      return this;\n    }\n\n    /**\n     * Returns the top left (TL) and bottom right (BR) selection coordinates\n     *\n     * @returns {Array} Returns array of coordinates for example `[1, 1, 5, 5]`\n     */\n\n  }, {\n    key: 'getCorners',\n    value: function getCorners() {\n      var topLeft = this.cellRange.getTopLeftCorner();\n      var bottomRight = this.cellRange.getBottomRightCorner();\n\n      return [topLeft.row, topLeft.col, bottomRight.row, bottomRight.col];\n    }\n\n    /**\n     * Adds class name to cell element at given coords\n     *\n     * @param {Walkontable} wotInstance Walkontable instance\n     * @param {Number} sourceRow Cell row coord\n     * @param {Number} sourceColumn Cell column coord\n     * @param {String} className Class name\n     * @param {Boolean} [markIntersections=false] If `true`, linear className generator will be used to add CSS classes\n     *                                            in a continuous way.\n     * @returns {Selection}\n     */\n\n  }, {\n    key: 'addClassAtCoords',\n    value: function addClassAtCoords(wotInstance, sourceRow, sourceColumn, className) {\n      var markIntersections = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n      var TD = wotInstance.wtTable.getCell(new _coords2.default(sourceRow, sourceColumn));\n\n      if ((typeof TD === 'undefined' ? 'undefined' : _typeof(TD)) === 'object') {\n        if (markIntersections) {\n          className = this.classNameGenerator(TD);\n\n          if (!this.classNames.includes(className)) {\n            this.classNames.push(className);\n          }\n        }\n\n        (0, _element.addClass)(TD, className);\n      }\n\n      return this;\n    }\n\n    /**\n     * Generate helper for calculating classNames based on previously added base className.\n     * The generated className is always generated as a continuation of the previous className. For example, when\n     * the currently checked element has 'area-2' className the generated new className will be 'area-3'. When\n     * the element doesn't have any classNames than the base className will be returned ('area');\n     *\n     * @param {String} baseClassName Base className to be used.\n     * @param {Number} layerLevelOwner Layer level which the instance of the Selection belongs to.\n     * @return {Function}\n     */\n\n  }, {\n    key: 'linearClassNameGenerator',\n    value: function linearClassNameGenerator(baseClassName, layerLevelOwner) {\n      // TODO: Make this recursive function Proper Tail Calls (TCO/PTC) friendly.\n      return function calcClassName(element) {\n        var previousIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;\n\n        if (layerLevelOwner === 0 || previousIndex === 0) {\n          return baseClassName;\n        }\n\n        var index = previousIndex >= 0 ? previousIndex : layerLevelOwner;\n        var className = baseClassName;\n\n        index -= 1;\n\n        var previousClassName = index === 0 ? baseClassName : baseClassName + '-' + index;\n\n        if ((0, _element.hasClass)(element, previousClassName)) {\n          var currentLayer = index + 1;\n\n          className = baseClassName + '-' + currentLayer;\n        } else {\n          className = calcClassName(element, index);\n        }\n\n        return className;\n      };\n    }\n\n    /**\n     * @param wotInstance\n     */\n\n  }, {\n    key: 'draw',\n    value: function draw(wotInstance) {\n      if (this.isEmpty()) {\n        if (this.settings.border) {\n          this.getBorder(wotInstance).disappear();\n        }\n\n        return;\n      }\n\n      var renderedRows = wotInstance.wtTable.getRenderedRowsCount();\n      var renderedColumns = wotInstance.wtTable.getRenderedColumnsCount();\n      var corners = this.getCorners();\n\n      var _corners = _slicedToArray(corners, 4),\n          topRow = _corners[0],\n          topColumn = _corners[1],\n          bottomRow = _corners[2],\n          bottomColumn = _corners[3];\n\n      for (var column = 0; column < renderedColumns; column += 1) {\n        var sourceCol = wotInstance.wtTable.columnFilter.renderedToSource(column);\n\n        if (sourceCol >= topColumn && sourceCol <= bottomColumn) {\n          var TH = wotInstance.wtTable.getColumnHeader(sourceCol);\n\n          if (TH) {\n            var newClasses = [];\n\n            if (this.settings.highlightHeaderClassName) {\n              newClasses.push(this.settings.highlightHeaderClassName);\n            }\n\n            if (this.settings.highlightColumnClassName) {\n              newClasses.push(this.settings.highlightColumnClassName);\n            }\n\n            (0, _element.addClass)(TH, newClasses);\n          }\n        }\n      }\n\n      for (var row = 0; row < renderedRows; row += 1) {\n        var sourceRow = wotInstance.wtTable.rowFilter.renderedToSource(row);\n\n        if (sourceRow >= topRow && sourceRow <= bottomRow) {\n          var _TH = wotInstance.wtTable.getRowHeader(sourceRow);\n\n          if (_TH) {\n            var _newClasses = [];\n\n            if (this.settings.highlightHeaderClassName) {\n              _newClasses.push(this.settings.highlightHeaderClassName);\n            }\n\n            if (this.settings.highlightRowClassName) {\n              _newClasses.push(this.settings.highlightRowClassName);\n            }\n\n            (0, _element.addClass)(_TH, _newClasses);\n          }\n        }\n\n        for (var _column = 0; _column < renderedColumns; _column += 1) {\n          var _sourceCol = wotInstance.wtTable.columnFilter.renderedToSource(_column);\n\n          if (sourceRow >= topRow && sourceRow <= bottomRow && _sourceCol >= topColumn && _sourceCol <= bottomColumn) {\n            // selected cell\n            if (this.settings.className) {\n              this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.className, this.settings.markIntersections);\n            }\n          } else if (sourceRow >= topRow && sourceRow <= bottomRow) {\n            // selection is in this row\n            if (this.settings.highlightRowClassName) {\n              this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.highlightRowClassName);\n            }\n          } else if (_sourceCol >= topColumn && _sourceCol <= bottomColumn) {\n            // selection is in this column\n            if (this.settings.highlightColumnClassName) {\n              this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.highlightColumnClassName);\n            }\n          }\n\n          var additionalSelectionClass = wotInstance.getSetting('onAfterDrawSelection', sourceRow, _sourceCol, corners, this.settings.layerLevel);\n\n          if (typeof additionalSelectionClass === 'string') {\n            this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, additionalSelectionClass);\n          }\n        }\n      }\n\n      wotInstance.getSetting('onBeforeDrawBorders', corners, this.settings.className);\n\n      if (this.settings.border) {\n        // warning! border.appear modifies corners!\n        this.getBorder(wotInstance).appear(corners);\n      }\n    }\n  }]);\n\n  return Selection;\n}();\n\nexports.default = Selection;\n\n/***/ }),\n/* 233 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * autoResize - resizes a DOM element to the width and height of another DOM element\n *\n * Copyright 2014, Marcin Warpechowski\n * Licensed under the MIT license\n */\n\nfunction autoResize() {\n  var defaults = {\n    minHeight: 200,\n    maxHeight: 300,\n    minWidth: 100,\n    maxWidth: 300\n  },\n      el,\n      body = document.body,\n      text = document.createTextNode(''),\n      span = document.createElement('SPAN'),\n      observe = function observe(element, event, handler) {\n    if (element.attachEvent) {\n      element.attachEvent('on' + event, handler);\n    } else {\n      element.addEventListener(event, handler, false);\n    }\n  },\n      _unObserve = function _unObserve(element, event, handler) {\n    if (element.removeEventListener) {\n      element.removeEventListener(event, handler, false);\n    } else {\n      element.detachEvent('on' + event, handler);\n    }\n  },\n      resize = function resize(newChar) {\n    var width, scrollHeight;\n\n    if (!newChar) {\n      newChar = \"\";\n    } else if (!/^[a-zA-Z \\.,\\\\\\/\\|0-9]$/.test(newChar)) {\n      newChar = \".\";\n    }\n\n    if (text.textContent !== void 0) {\n      text.textContent = el.value + newChar;\n    } else {\n      text.data = el.value + newChar; //IE8\n    }\n    span.style.fontSize = getComputedStyle(el).fontSize;\n    span.style.fontFamily = getComputedStyle(el).fontFamily;\n    span.style.whiteSpace = \"pre\";\n\n    body.appendChild(span);\n    width = span.clientWidth + 2;\n    body.removeChild(span);\n\n    el.style.height = defaults.minHeight + 'px';\n\n    if (defaults.minWidth > width) {\n      el.style.width = defaults.minWidth + 'px';\n    } else if (width > defaults.maxWidth) {\n      el.style.width = defaults.maxWidth + 'px';\n    } else {\n      el.style.width = width + 'px';\n    }\n    scrollHeight = el.scrollHeight ? el.scrollHeight - 1 : 0;\n\n    if (defaults.minHeight > scrollHeight) {\n      el.style.height = defaults.minHeight + 'px';\n    } else if (defaults.maxHeight < scrollHeight) {\n      el.style.height = defaults.maxHeight + 'px';\n      el.style.overflowY = 'visible';\n    } else {\n      el.style.height = scrollHeight + 'px';\n    }\n  },\n      delayedResize = function delayedResize() {\n    window.setTimeout(resize, 0);\n  },\n      extendDefaults = function extendDefaults(config) {\n\n    if (config && config.minHeight) {\n      if (config.minHeight == 'inherit') {\n        defaults.minHeight = el.clientHeight;\n      } else {\n        var minHeight = parseInt(config.minHeight);\n        if (!isNaN(minHeight)) {\n          defaults.minHeight = minHeight;\n        }\n      }\n    }\n\n    if (config && config.maxHeight) {\n      if (config.maxHeight == 'inherit') {\n        defaults.maxHeight = el.clientHeight;\n      } else {\n        var maxHeight = parseInt(config.maxHeight);\n        if (!isNaN(maxHeight)) {\n          defaults.maxHeight = maxHeight;\n        }\n      }\n    }\n\n    if (config && config.minWidth) {\n      if (config.minWidth == 'inherit') {\n        defaults.minWidth = el.clientWidth;\n      } else {\n        var minWidth = parseInt(config.minWidth);\n        if (!isNaN(minWidth)) {\n          defaults.minWidth = minWidth;\n        }\n      }\n    }\n\n    if (config && config.maxWidth) {\n      if (config.maxWidth == 'inherit') {\n        defaults.maxWidth = el.clientWidth;\n      } else {\n        var maxWidth = parseInt(config.maxWidth);\n        if (!isNaN(maxWidth)) {\n          defaults.maxWidth = maxWidth;\n        }\n      }\n    }\n\n    if (!span.firstChild) {\n      span.className = \"autoResize\";\n      span.style.display = 'inline-block';\n      span.appendChild(text);\n    }\n  },\n      _init = function _init(el_, config, doObserve) {\n    el = el_;\n    extendDefaults(config);\n\n    if (el.nodeName == 'TEXTAREA') {\n\n      el.style.resize = 'none';\n      el.style.overflowY = '';\n      el.style.height = defaults.minHeight + 'px';\n      el.style.minWidth = defaults.minWidth + 'px';\n      el.style.maxWidth = defaults.maxWidth + 'px';\n      el.style.overflowY = 'hidden';\n    }\n\n    if (doObserve) {\n      observe(el, 'change', resize);\n      observe(el, 'cut', delayedResize);\n      observe(el, 'paste', delayedResize);\n      observe(el, 'drop', delayedResize);\n      observe(el, 'keydown', delayedResize);\n      observe(el, 'focus', resize);\n    }\n\n    resize();\n  };\n\n  function getComputedStyle(element) {\n    return element.currentStyle || document.defaultView.getComputedStyle(element);\n  }\n\n  return {\n    init: function init(el_, config, doObserve) {\n      _init(el_, config, doObserve);\n    },\n    unObserve: function unObserve() {\n      _unObserve(el, 'change', resize);\n      _unObserve(el, 'cut', delayedResize);\n      _unObserve(el, 'paste', delayedResize);\n      _unObserve(el, 'drop', delayedResize);\n      _unObserve(el, 'keydown', delayedResize);\n      _unObserve(el, 'focus', resize);\n    },\n    resize: resize\n  };\n}\n\nif (true) {\n  module.exports = autoResize;\n}\n\n/***/ }),\n/* 234 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _baseEditor = __webpack_require__(53);\n\nvar _baseEditor2 = _interopRequireDefault(_baseEditor);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor CheckboxEditor\n * @class CheckboxEditor\n */\nvar CheckboxEditor = function (_BaseEditor) {\n  _inherits(CheckboxEditor, _BaseEditor);\n\n  function CheckboxEditor() {\n    _classCallCheck(this, CheckboxEditor);\n\n    return _possibleConstructorReturn(this, (CheckboxEditor.__proto__ || Object.getPrototypeOf(CheckboxEditor)).apply(this, arguments));\n  }\n\n  _createClass(CheckboxEditor, [{\n    key: 'beginEditing',\n    value: function beginEditing(initialValue, event) {\n      // Just some events connected with checkbox editor are delegated here. Some `keydown` events like `enter` and `space` key press\n      // are handled inside `checkboxRenderer`. Some events come here from `editorManager`. Below `if` statement was created by author\n      // for purpose of handling only `doubleclick` event which may be done on a cell with checkbox.\n\n      if (event.type === 'mouseup') {\n        var checkbox = this.TD.querySelector('input[type=\"checkbox\"]');\n\n        if (!(0, _element.hasClass)(checkbox, 'htBadValue')) {\n          checkbox.click();\n        }\n      }\n    }\n  }, {\n    key: 'finishEditing',\n    value: function finishEditing() {}\n  }, {\n    key: 'init',\n    value: function init() {}\n  }, {\n    key: 'open',\n    value: function open() {}\n  }, {\n    key: 'close',\n    value: function close() {}\n  }, {\n    key: 'getValue',\n    value: function getValue() {}\n  }, {\n    key: 'setValue',\n    value: function setValue() {}\n  }, {\n    key: 'focus',\n    value: function focus() {}\n  }]);\n\n  return CheckboxEditor;\n}(_baseEditor2.default);\n\nexports.default = CheckboxEditor;\n\n/***/ }),\n/* 235 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _moment = __webpack_require__(55);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _pikaday = __webpack_require__(236);\n\nvar _pikaday2 = _interopRequireDefault(_pikaday);\n\n__webpack_require__(237);\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _unicode = __webpack_require__(21);\n\nvar _event = __webpack_require__(12);\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor DateEditor\n * @class DateEditor\n * @dependencies TextEditor moment pikaday\n */\nvar DateEditor = function (_TextEditor) {\n  _inherits(DateEditor, _TextEditor);\n\n  /**\n   * @param {Core} hotInstance Handsontable instance\n   * @private\n   */\n  function DateEditor(hotInstance) {\n    _classCallCheck(this, DateEditor);\n\n    // TODO: Move this option to general settings\n    var _this = _possibleConstructorReturn(this, (DateEditor.__proto__ || Object.getPrototypeOf(DateEditor)).call(this, hotInstance));\n\n    _this.defaultDateFormat = 'DD/MM/YYYY';\n    _this.isCellEdited = false;\n    _this.parentDestroyed = false;\n    return _this;\n  }\n\n  _createClass(DateEditor, [{\n    key: 'init',\n    value: function init() {\n      var _this2 = this;\n\n      if (typeof _moment2.default !== 'function') {\n        throw new Error('You need to include moment.js to your project.');\n      }\n\n      if (typeof _pikaday2.default !== 'function') {\n        throw new Error('You need to include Pikaday to your project.');\n      }\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'init', this).call(this);\n      this.instance.addHook('afterDestroy', function () {\n        _this2.parentDestroyed = true;\n        _this2.destroyElements();\n      });\n    }\n\n    /**\n     * Create data picker instance\n     */\n\n  }, {\n    key: 'createElements',\n    value: function createElements() {\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'createElements', this).call(this);\n\n      this.datePicker = document.createElement('DIV');\n      this.datePickerStyle = this.datePicker.style;\n      this.datePickerStyle.position = 'absolute';\n      this.datePickerStyle.top = 0;\n      this.datePickerStyle.left = 0;\n      this.datePickerStyle.zIndex = 9999;\n\n      (0, _element.addClass)(this.datePicker, 'htDatepickerHolder');\n      document.body.appendChild(this.datePicker);\n\n      this.$datePicker = new _pikaday2.default(this.getDatePickerConfig());\n      var eventManager = new _eventManager2.default(this);\n\n      /**\n       * Prevent recognizing clicking on datepicker as clicking outside of table\n       */\n      eventManager.addEventListener(this.datePicker, 'mousedown', function (event) {\n        return (0, _event.stopPropagation)(event);\n      });\n      this.hideDatepicker();\n    }\n\n    /**\n     * Destroy data picker instance\n     */\n\n  }, {\n    key: 'destroyElements',\n    value: function destroyElements() {\n      this.$datePicker.destroy();\n    }\n\n    /**\n     * Prepare editor to appear\n     *\n     * @param {Number} row Row index\n     * @param {Number} col Column index\n     * @param {String} prop Property name (passed when datasource is an array of objects)\n     * @param {HTMLTableCellElement} td Table cell element\n     * @param {*} originalValue Original value\n     * @param {Object} cellProperties Object with cell properties ({@see Core#getCellMeta})\n     */\n\n  }, {\n    key: 'prepare',\n    value: function prepare(row, col, prop, td, originalValue, cellProperties) {\n      this._opened = false;\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'prepare', this).call(this, row, col, prop, td, originalValue, cellProperties);\n    }\n\n    /**\n     * Open editor\n     *\n     * @param {Event} [event=null]\n     */\n\n  }, {\n    key: 'open',\n    value: function open() {\n      var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'open', this).call(this);\n      this.showDatepicker(event);\n    }\n\n    /**\n     * Close editor\n     */\n\n  }, {\n    key: 'close',\n    value: function close() {\n      var _this3 = this;\n\n      this._opened = false;\n      this.instance._registerTimeout(setTimeout(function () {\n        _this3.instance._refreshBorders();\n      }, 0));\n\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'close', this).call(this);\n    }\n\n    /**\n     * @param {Boolean} [isCancelled=false]\n     * @param {Boolean} [ctrlDown=false]\n     */\n\n  }, {\n    key: 'finishEditing',\n    value: function finishEditing() {\n      var isCancelled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n      var ctrlDown = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (isCancelled) {\n        // pressed ESC, restore original value\n        // var value = this.instance.getDataAtCell(this.row, this.col);\n        var value = this.originalValue;\n\n        if (value !== void 0) {\n          this.setValue(value);\n        }\n      }\n      this.hideDatepicker();\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'finishEditing', this).call(this, isCancelled, ctrlDown);\n    }\n\n    /**\n     * Show data picker\n     *\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'showDatepicker',\n    value: function showDatepicker(event) {\n      this.$datePicker.config(this.getDatePickerConfig());\n\n      var offset = this.TD.getBoundingClientRect();\n      var dateFormat = this.cellProperties.dateFormat || this.defaultDateFormat;\n      var datePickerConfig = this.$datePicker.config();\n      var dateStr = void 0;\n      var isMouseDown = this.instance.view.isMouseDown();\n      var isMeta = event ? (0, _unicode.isMetaKey)(event.keyCode) : false;\n\n      this.datePickerStyle.top = window.pageYOffset + offset.top + (0, _element.outerHeight)(this.TD) + 'px';\n      this.datePickerStyle.left = window.pageXOffset + offset.left + 'px';\n\n      this.$datePicker._onInputFocus = function () {};\n      datePickerConfig.format = dateFormat;\n\n      if (this.originalValue) {\n        dateStr = this.originalValue;\n\n        if ((0, _moment2.default)(dateStr, dateFormat, true).isValid()) {\n          this.$datePicker.setMoment((0, _moment2.default)(dateStr, dateFormat), true);\n        }\n\n        // workaround for date/time cells - pikaday resets the cell value to 12:00 AM by default, this will overwrite the value.\n        if (this.getValue() !== this.originalValue) {\n          this.setValue(this.originalValue);\n        }\n\n        if (!isMeta && !isMouseDown) {\n          this.setValue('');\n        }\n      } else if (this.cellProperties.defaultDate) {\n        dateStr = this.cellProperties.defaultDate;\n\n        datePickerConfig.defaultDate = dateStr;\n\n        if ((0, _moment2.default)(dateStr, dateFormat, true).isValid()) {\n          this.$datePicker.setMoment((0, _moment2.default)(dateStr, dateFormat), true);\n        }\n\n        if (!isMeta && !isMouseDown) {\n          this.setValue('');\n        }\n      } else {\n        // if a default date is not defined, set a soft-default-date: display the current day and month in the\n        // datepicker, but don't fill the editor input\n        this.$datePicker.gotoToday();\n      }\n\n      this.datePickerStyle.display = 'block';\n      this.$datePicker.show();\n    }\n\n    /**\n     * Hide data picker\n     */\n\n  }, {\n    key: 'hideDatepicker',\n    value: function hideDatepicker() {\n      this.datePickerStyle.display = 'none';\n      this.$datePicker.hide();\n    }\n\n    /**\n     * Get date picker options.\n     *\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'getDatePickerConfig',\n    value: function getDatePickerConfig() {\n      var _this4 = this;\n\n      var htInput = this.TEXTAREA;\n      var options = {};\n\n      if (this.cellProperties && this.cellProperties.datePickerConfig) {\n        (0, _object.deepExtend)(options, this.cellProperties.datePickerConfig);\n      }\n      var origOnSelect = options.onSelect;\n      var origOnClose = options.onClose;\n\n      options.field = htInput;\n      options.trigger = htInput;\n      options.container = this.datePicker;\n      options.bound = false;\n      options.format = options.format || this.defaultDateFormat;\n      options.reposition = options.reposition || false;\n      options.onSelect = function (dateStr) {\n        if (!isNaN(dateStr.getTime())) {\n          dateStr = (0, _moment2.default)(dateStr).format(_this4.cellProperties.dateFormat || _this4.defaultDateFormat);\n        }\n        _this4.setValue(dateStr);\n        _this4.hideDatepicker();\n\n        if (origOnSelect) {\n          origOnSelect();\n        }\n      };\n      options.onClose = function () {\n        if (!_this4.parentDestroyed) {\n          _this4.finishEditing(false);\n        }\n        if (origOnClose) {\n          origOnClose();\n        }\n      };\n\n      return options;\n    }\n  }]);\n\n  return DateEditor;\n}(_textEditor2.default);\n\nexports.default = DateEditor;\n\n/***/ }),\n/* 236 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_236__;\n\n/***/ }),\n/* 237 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 238 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _autocompleteEditor = __webpack_require__(188);\n\nvar _autocompleteEditor2 = _interopRequireDefault(_autocompleteEditor);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor DropdownEditor\n * @class DropdownEditor\n * @dependencies AutocompleteEditor\n */\nvar DropdownEditor = function (_AutocompleteEditor) {\n  _inherits(DropdownEditor, _AutocompleteEditor);\n\n  function DropdownEditor() {\n    _classCallCheck(this, DropdownEditor);\n\n    return _possibleConstructorReturn(this, (DropdownEditor.__proto__ || Object.getPrototypeOf(DropdownEditor)).apply(this, arguments));\n  }\n\n  _createClass(DropdownEditor, [{\n    key: 'prepare',\n    value: function prepare(row, col, prop, td, originalValue, cellProperties) {\n      _get(DropdownEditor.prototype.__proto__ || Object.getPrototypeOf(DropdownEditor.prototype), 'prepare', this).call(this, row, col, prop, td, originalValue, cellProperties);\n      this.cellProperties.filter = false;\n      this.cellProperties.strict = true;\n    }\n  }]);\n\n  return DropdownEditor;\n}(_autocompleteEditor2.default);\n\n_pluginHooks2.default.getSingleton().add('beforeValidate', function (value, row, col, source) {\n  var cellMeta = this.getCellMeta(row, this.propToCol(col));\n\n  if (cellMeta.editor === DropdownEditor) {\n    if (cellMeta.strict === void 0) {\n      cellMeta.filter = false;\n      cellMeta.strict = true;\n    }\n  }\n});\n\nexports.default = DropdownEditor;\n\n/***/ }),\n/* 239 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor NumericEditor\n * @class NumericEditor\n */\nvar NumericEditor = function (_TextEditor) {\n  _inherits(NumericEditor, _TextEditor);\n\n  function NumericEditor() {\n    _classCallCheck(this, NumericEditor);\n\n    return _possibleConstructorReturn(this, (NumericEditor.__proto__ || Object.getPrototypeOf(NumericEditor)).apply(this, arguments));\n  }\n\n  return NumericEditor;\n}(_textEditor2.default);\n\nexports.default = NumericEditor;\n\n/***/ }),\n/* 240 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _element = __webpack_require__(0);\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor PasswordEditor\n * @class PasswordEditor\n * @dependencies TextEditor\n */\nvar PasswordEditor = function (_TextEditor) {\n  _inherits(PasswordEditor, _TextEditor);\n\n  function PasswordEditor() {\n    _classCallCheck(this, PasswordEditor);\n\n    return _possibleConstructorReturn(this, (PasswordEditor.__proto__ || Object.getPrototypeOf(PasswordEditor)).apply(this, arguments));\n  }\n\n  _createClass(PasswordEditor, [{\n    key: 'createElements',\n    value: function createElements() {\n      _get(PasswordEditor.prototype.__proto__ || Object.getPrototypeOf(PasswordEditor.prototype), 'createElements', this).call(this);\n\n      this.TEXTAREA = document.createElement('input');\n      this.TEXTAREA.setAttribute('type', 'password');\n      this.TEXTAREA.className = 'handsontableInput';\n      this.textareaStyle = this.TEXTAREA.style;\n      this.textareaStyle.width = 0;\n      this.textareaStyle.height = 0;\n\n      (0, _element.empty)(this.TEXTAREA_PARENT);\n      this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n    }\n  }]);\n\n  return PasswordEditor;\n}(_textEditor2.default);\n\nexports.default = PasswordEditor;\n\n/***/ }),\n/* 241 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _element = __webpack_require__(0);\n\nvar _event = __webpack_require__(12);\n\nvar _unicode = __webpack_require__(21);\n\nvar _baseEditor = __webpack_require__(53);\n\nvar _baseEditor2 = _interopRequireDefault(_baseEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SelectEditor = _baseEditor2.default.prototype.extend();\n\n/**\n * @private\n * @editor SelectEditor\n * @class SelectEditor\n */\nSelectEditor.prototype.init = function () {\n  this.select = document.createElement('SELECT');\n  (0, _element.addClass)(this.select, 'htSelectEditor');\n  this.select.style.display = 'none';\n  this.instance.rootElement.appendChild(this.select);\n  this.registerHooks();\n};\n\nSelectEditor.prototype.registerHooks = function () {\n  var _this = this;\n\n  this.instance.addHook('afterScrollHorizontally', function () {\n    return _this.refreshDimensions();\n  });\n  this.instance.addHook('afterScrollVertically', function () {\n    return _this.refreshDimensions();\n  });\n  this.instance.addHook('afterColumnResize', function () {\n    return _this.refreshDimensions();\n  });\n  this.instance.addHook('afterRowResize', function () {\n    return _this.refreshDimensions();\n  });\n};\n\nSelectEditor.prototype.prepare = function () {\n  _baseEditor2.default.prototype.prepare.apply(this, arguments);\n\n  var selectOptions = this.cellProperties.selectOptions;\n  var options;\n\n  if (typeof selectOptions == 'function') {\n    options = this.prepareOptions(selectOptions(this.row, this.col, this.prop));\n  } else {\n    options = this.prepareOptions(selectOptions);\n  }\n\n  (0, _element.empty)(this.select);\n\n  for (var option in options) {\n    if (Object.prototype.hasOwnProperty.call(options, option)) {\n      var optionElement = document.createElement('OPTION');\n      optionElement.value = option;\n      (0, _element.fastInnerHTML)(optionElement, options[option]);\n      this.select.appendChild(optionElement);\n    }\n  }\n};\n\nSelectEditor.prototype.prepareOptions = function (optionsToPrepare) {\n  var preparedOptions = {};\n\n  if (Array.isArray(optionsToPrepare)) {\n    for (var i = 0, len = optionsToPrepare.length; i < len; i++) {\n      preparedOptions[optionsToPrepare[i]] = optionsToPrepare[i];\n    }\n  } else if ((typeof optionsToPrepare === 'undefined' ? 'undefined' : _typeof(optionsToPrepare)) == 'object') {\n    preparedOptions = optionsToPrepare;\n  }\n\n  return preparedOptions;\n};\n\nSelectEditor.prototype.getValue = function () {\n  return this.select.value;\n};\n\nSelectEditor.prototype.setValue = function (value) {\n  this.select.value = value;\n};\n\nvar onBeforeKeyDown = function onBeforeKeyDown(event) {\n  var instance = this;\n  var editor = instance.getActiveEditor();\n\n  switch (event.keyCode) {\n    case _unicode.KEY_CODES.ARROW_UP:\n      var previousOptionIndex = editor.select.selectedIndex - 1;\n      if (previousOptionIndex >= 0) {\n        editor.select[previousOptionIndex].selected = true;\n      }\n\n      (0, _event.stopImmediatePropagation)(event);\n      event.preventDefault();\n      break;\n\n    case _unicode.KEY_CODES.ARROW_DOWN:\n      var nextOptionIndex = editor.select.selectedIndex + 1;\n      if (nextOptionIndex <= editor.select.length - 1) {\n        editor.select[nextOptionIndex].selected = true;\n      }\n\n      (0, _event.stopImmediatePropagation)(event);\n      event.preventDefault();\n      break;\n    default:\n      break;\n  }\n};\n\nSelectEditor.prototype.open = function () {\n  this._opened = true;\n  this.refreshDimensions();\n  this.select.style.display = '';\n  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);\n};\n\nSelectEditor.prototype.close = function () {\n  this._opened = false;\n  this.select.style.display = 'none';\n  this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n};\n\nSelectEditor.prototype.focus = function () {\n  this.select.focus();\n};\n\nSelectEditor.prototype.refreshValue = function () {\n  var sourceData = this.instance.getSourceDataAtCell(this.row, this.prop);\n  this.originalValue = sourceData;\n\n  this.setValue(sourceData);\n  this.refreshDimensions();\n};\n\nSelectEditor.prototype.refreshDimensions = function () {\n  if (this.state !== _baseEditor.EditorState.EDITING) {\n    return;\n  }\n  this.TD = this.getEditedCell();\n\n  // TD is outside of the viewport.\n  if (!this.TD) {\n    this.close();\n\n    return;\n  }\n  var width = (0, _element.outerWidth)(this.TD) + 1,\n      height = (0, _element.outerHeight)(this.TD) + 1,\n      currentOffset = (0, _element.offset)(this.TD),\n      containerOffset = (0, _element.offset)(this.instance.rootElement),\n      scrollableContainer = (0, _element.getScrollableElement)(this.TD),\n      editTop = currentOffset.top - containerOffset.top - 1 - (scrollableContainer.scrollTop || 0),\n      editLeft = currentOffset.left - containerOffset.left - 1 - (scrollableContainer.scrollLeft || 0),\n      editorSection = this.checkEditorSection(),\n      cssTransformOffset;\n\n  var settings = this.instance.getSettings();\n  var rowHeadersCount = settings.rowHeaders ? 1 : 0;\n  var colHeadersCount = settings.colHeaders ? 1 : 0;\n\n  switch (editorSection) {\n    case 'top':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'left':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'top-left-corner':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'bottom-left-corner':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'bottom':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.holder.parentNode);\n      break;\n    default:\n      break;\n  }\n  if (this.instance.getSelectedLast()[0] === 0) {\n    editTop += 1;\n  }\n\n  if (this.instance.getSelectedLast()[1] === 0) {\n    editLeft += 1;\n  }\n\n  var selectStyle = this.select.style;\n\n  if (cssTransformOffset && cssTransformOffset != -1) {\n    selectStyle[cssTransformOffset[0]] = cssTransformOffset[1];\n  } else {\n    (0, _element.resetCssTransform)(this.select);\n  }\n  var cellComputedStyle = (0, _element.getComputedStyle)(this.TD);\n\n  if (parseInt(cellComputedStyle.borderTopWidth, 10) > 0) {\n    height -= 1;\n  }\n  if (parseInt(cellComputedStyle.borderLeftWidth, 10) > 0) {\n    width -= 1;\n  }\n\n  selectStyle.height = height + 'px';\n  selectStyle.minWidth = width + 'px';\n  selectStyle.top = editTop + 'px';\n  selectStyle.left = editLeft + 'px';\n  selectStyle.margin = '0px';\n};\n\nSelectEditor.prototype.getEditedCell = function () {\n  var editorSection = this.checkEditorSection(),\n      editedCell;\n\n  switch (editorSection) {\n    case 'top':\n      editedCell = this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.select.style.zIndex = 101;\n      break;\n    case 'corner':\n      editedCell = this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.select.style.zIndex = 103;\n      break;\n    case 'left':\n      editedCell = this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.select.style.zIndex = 102;\n      break;\n    default:\n      editedCell = this.instance.getCell(this.row, this.col);\n      this.select.style.zIndex = '';\n      break;\n  }\n\n  return editedCell != -1 && editedCell != -2 ? editedCell : void 0;\n};\n\nexports.default = SelectEditor;\n\n/***/ }),\n/* 242 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nfunction cellDecorator(instance, TD, row, col, prop, value, cellProperties) {\n  var classesToAdd = [];\n  var classesToRemove = [];\n\n  if (cellProperties.className) {\n    if (TD.className) {\n      TD.className = TD.className + ' ' + cellProperties.className;\n    } else {\n      TD.className = cellProperties.className;\n    }\n  }\n\n  if (cellProperties.readOnly) {\n    classesToAdd.push(cellProperties.readOnlyCellClassName);\n  }\n\n  if (cellProperties.valid === false && cellProperties.invalidCellClassName) {\n    classesToAdd.push(cellProperties.invalidCellClassName);\n  } else {\n    classesToRemove.push(cellProperties.invalidCellClassName);\n  }\n\n  if (cellProperties.wordWrap === false && cellProperties.noWordWrapClassName) {\n    classesToAdd.push(cellProperties.noWordWrapClassName);\n  }\n\n  if (!value && cellProperties.placeholder) {\n    classesToAdd.push(cellProperties.placeholderCellClassName);\n  }\n\n  (0, _element.removeClass)(TD, classesToRemove);\n  (0, _element.addClass)(TD, classesToAdd);\n} /**\n   * Adds appropriate CSS class to table cell, based on cellProperties\n   */\nexports.default = cellDecorator;\n\n/***/ }),\n/* 243 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _src = __webpack_require__(4);\n\nvar _index = __webpack_require__(13);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar clonableWRAPPER = document.createElement('DIV');\nclonableWRAPPER.className = 'htAutocompleteWrapper';\n\nvar clonableARROW = document.createElement('DIV');\nclonableARROW.className = 'htAutocompleteArrow';\n// workaround for https://github.com/handsontable/handsontable/issues/1946\n// this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\nclonableARROW.appendChild(document.createTextNode(String.fromCharCode(9660)));\n\nvar wrapTdContentWithWrapper = function wrapTdContentWithWrapper(TD, WRAPPER) {\n  WRAPPER.innerHTML = TD.innerHTML;\n  (0, _element.empty)(TD);\n  TD.appendChild(WRAPPER);\n};\n\n/**\n * Autocomplete renderer\n *\n * @private\n * @renderer AutocompleteRenderer\n * @param {Object} instance Handsontable instance\n * @param {Element} TD Table cell where to render\n * @param {Number} row\n * @param {Number} col\n * @param {String|Number} prop Row object property name\n * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)\n * @param {Object} cellProperties Cell properites (shared by cell renderer and editor)\n */\nfunction autocompleteRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  var WRAPPER = clonableWRAPPER.cloneNode(true); // this is faster than createElement\n  var ARROW = clonableARROW.cloneNode(true); // this is faster than createElement\n\n  if (cellProperties.allowHtml) {\n    (0, _index.getRenderer)('html').apply(this, arguments);\n  } else {\n    (0, _index.getRenderer)('text').apply(this, arguments);\n  }\n\n  TD.appendChild(ARROW);\n  (0, _element.addClass)(TD, 'htAutocomplete');\n\n  if (!TD.firstChild) {\n    // http://jsperf.com/empty-node-if-needed\n    // otherwise empty fields appear borderless in demo/renderers.html (IE)\n    TD.appendChild(document.createTextNode(String.fromCharCode(160))); // workaround for https://github.com/handsontable/handsontable/issues/1946\n    // this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\n  }\n\n  if (!instance.acArrowListener) {\n    var eventManager = new _eventManager2.default(instance);\n\n    // not very elegant but easy and fast\n    instance.acArrowListener = function (event) {\n      if ((0, _element.hasClass)(event.target, 'htAutocompleteArrow')) {\n        instance.view.wt.getSetting('onCellDblClick', null, new _src.CellCoords(row, col), TD);\n      }\n    };\n\n    eventManager.addEventListener(instance.rootElement, 'mousedown', instance.acArrowListener);\n\n    // We need to unbind the listener after the table has been destroyed\n    instance.addHookOnce('afterDestroy', function () {\n      eventManager.destroy();\n    });\n  }\n}\n\nexports.default = autocompleteRenderer;\n\n/***/ }),\n/* 244 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _string = __webpack_require__(36);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _unicode = __webpack_require__(21);\n\nvar _function = __webpack_require__(42);\n\nvar _event = __webpack_require__(12);\n\nvar _index = __webpack_require__(13);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar isListeningKeyDownEvent = new WeakMap();\nvar isCheckboxListenerAdded = new WeakMap();\nvar BAD_VALUE_CLASS = 'htBadValue';\n\n/**\n * Checkbox renderer\n *\n * @private\n * @param {Object} instance Handsontable instance\n * @param {Element} TD Table cell where to render\n * @param {Number} row\n * @param {Number} col\n * @param {String|Number} prop Row object property name\n * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)\n * @param {Object} cellProperties Cell properties (shared by cell renderer and editor)\n */\nfunction checkboxRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  (0, _index.getRenderer)('base').apply(this, arguments);\n\n  var eventManager = registerEvents(instance);\n  var input = createInput();\n  var labelOptions = cellProperties.label;\n  var badValue = false;\n\n  if (typeof cellProperties.checkedTemplate === 'undefined') {\n    cellProperties.checkedTemplate = true;\n  }\n  if (typeof cellProperties.uncheckedTemplate === 'undefined') {\n    cellProperties.uncheckedTemplate = false;\n  }\n\n  (0, _element.empty)(TD); // TODO identify under what circumstances this line can be removed\n\n  if (value === cellProperties.checkedTemplate || (0, _string.equalsIgnoreCase)(value, cellProperties.checkedTemplate)) {\n    input.checked = true;\n  } else if (value === cellProperties.uncheckedTemplate || (0, _string.equalsIgnoreCase)(value, cellProperties.uncheckedTemplate)) {\n    input.checked = false;\n  } else if (value === null) {\n    // default value\n    (0, _element.addClass)(input, 'noValue');\n  } else {\n    input.style.display = 'none';\n    (0, _element.addClass)(input, BAD_VALUE_CLASS);\n    badValue = true;\n  }\n\n  input.setAttribute('data-row', row);\n  input.setAttribute('data-col', col);\n\n  if (!badValue && labelOptions) {\n    var labelText = '';\n\n    if (labelOptions.value) {\n      labelText = typeof labelOptions.value === 'function' ? labelOptions.value.call(this, row, col, prop, value) : labelOptions.value;\n    } else if (labelOptions.property) {\n      labelText = instance.getDataAtRowProp(row, labelOptions.property);\n    }\n    var label = createLabel(labelText);\n\n    if (labelOptions.position === 'before') {\n      label.appendChild(input);\n    } else {\n      label.insertBefore(input, label.firstChild);\n    }\n    input = label;\n  }\n\n  TD.appendChild(input);\n\n  if (badValue) {\n    TD.appendChild(document.createTextNode('#bad-value#'));\n  }\n\n  if (!isListeningKeyDownEvent.has(instance)) {\n    isListeningKeyDownEvent.set(instance, true);\n    instance.addHook('beforeKeyDown', onBeforeKeyDown);\n  }\n\n  /**\n   * On before key down DOM listener.\n   *\n   * @private\n   * @param {Event} event\n   */\n  function onBeforeKeyDown(event) {\n    var toggleKeys = 'SPACE|ENTER';\n    var switchOffKeys = 'DELETE|BACKSPACE';\n    var isKeyCode = (0, _function.partial)(_unicode.isKey, event.keyCode);\n\n    if (isKeyCode(toggleKeys + '|' + switchOffKeys) && !(0, _event.isImmediatePropagationStopped)(event)) {\n      eachSelectedCheckboxCell(function () {\n        (0, _event.stopImmediatePropagation)(event);\n        event.preventDefault();\n      });\n    }\n    if (isKeyCode(toggleKeys)) {\n      changeSelectedCheckboxesState();\n    }\n    if (isKeyCode(switchOffKeys)) {\n      changeSelectedCheckboxesState(true);\n    }\n  }\n\n  /**\n   * Change checkbox checked property\n   *\n   * @private\n   * @param {Boolean} [uncheckCheckbox=false]\n   */\n  function changeSelectedCheckboxesState() {\n    var uncheckCheckbox = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n    var selRange = instance.getSelectedRangeLast();\n\n    if (!selRange) {\n      return;\n    }\n\n    var _selRange$getTopLeftC = selRange.getTopLeftCorner(),\n        startRow = _selRange$getTopLeftC.row,\n        startColumn = _selRange$getTopLeftC.col;\n\n    var _selRange$getBottomRi = selRange.getBottomRightCorner(),\n        endRow = _selRange$getBottomRi.row,\n        endColumn = _selRange$getBottomRi.col;\n\n    var changes = [];\n\n    for (var _row = startRow; _row <= endRow; _row += 1) {\n      for (var _col = startColumn; _col <= endColumn; _col += 1) {\n        var _cellProperties = instance.getCellMeta(_row, _col);\n\n        if (_cellProperties.type !== 'checkbox') {\n          return;\n        }\n\n        /* eslint-disable no-continue */\n        if (_cellProperties.readOnly === true) {\n          continue;\n        }\n\n        if (typeof _cellProperties.checkedTemplate === 'undefined') {\n          _cellProperties.checkedTemplate = true;\n        }\n        if (typeof _cellProperties.uncheckedTemplate === 'undefined') {\n          _cellProperties.uncheckedTemplate = false;\n        }\n\n        var dataAtCell = instance.getDataAtCell(_row, _col);\n\n        if (uncheckCheckbox === false) {\n          if ([_cellProperties.checkedTemplate, _cellProperties.checkedTemplate.toString()].includes(dataAtCell)) {\n            changes.push([_row, _col, _cellProperties.uncheckedTemplate]);\n          } else if ([_cellProperties.uncheckedTemplate, _cellProperties.uncheckedTemplate.toString(), null, void 0].includes(dataAtCell)) {\n            changes.push([_row, _col, _cellProperties.checkedTemplate]);\n          }\n        } else {\n          changes.push([_row, _col, _cellProperties.uncheckedTemplate]);\n        }\n      }\n    }\n\n    if (changes.length > 0) {\n      instance.setDataAtCell(changes);\n    }\n  }\n\n  /**\n   * Call callback for each found selected cell with checkbox type.\n   *\n   * @private\n   * @param {Function} callback\n   */\n  function eachSelectedCheckboxCell(callback) {\n    var selRange = instance.getSelectedRangeLast();\n\n    if (!selRange) {\n      return;\n    }\n    var topLeft = selRange.getTopLeftCorner();\n    var bottomRight = selRange.getBottomRightCorner();\n\n    for (var _row2 = topLeft.row; _row2 <= bottomRight.row; _row2++) {\n      for (var _col2 = topLeft.col; _col2 <= bottomRight.col; _col2++) {\n        var _cellProperties2 = instance.getCellMeta(_row2, _col2);\n\n        if (_cellProperties2.type !== 'checkbox') {\n          return;\n        }\n\n        var cell = instance.getCell(_row2, _col2);\n\n        if (cell == null) {\n\n          callback(_row2, _col2, _cellProperties2);\n        } else {\n          var checkboxes = cell.querySelectorAll('input[type=checkbox]');\n\n          if (checkboxes.length > 0 && !_cellProperties2.readOnly) {\n            callback(checkboxes);\n          }\n        }\n      }\n    }\n  }\n}\n\n/**\n * Register checkbox listeners.\n *\n * @param {Handsontable} instance Handsontable instance.\n * @returns {EventManager}\n */\nfunction registerEvents(instance) {\n  var eventManager = isCheckboxListenerAdded.get(instance);\n\n  if (!eventManager) {\n    eventManager = new _eventManager2.default(instance);\n    eventManager.addEventListener(instance.rootElement, 'click', function (event) {\n      return onClick(event, instance);\n    });\n    eventManager.addEventListener(instance.rootElement, 'mouseup', function (event) {\n      return onMouseUp(event, instance);\n    });\n    eventManager.addEventListener(instance.rootElement, 'change', function (event) {\n      return onChange(event, instance);\n    });\n\n    isCheckboxListenerAdded.set(instance, eventManager);\n  }\n\n  return eventManager;\n}\n\n/**\n * Create input element.\n *\n * @returns {Node}\n */\nfunction createInput() {\n  var input = document.createElement('input');\n\n  input.className = 'htCheckboxRendererInput';\n  input.type = 'checkbox';\n  input.setAttribute('autocomplete', 'off');\n  input.setAttribute('tabindex', '-1');\n\n  return input.cloneNode(false);\n}\n\n/**\n * Create label element.\n *\n * @returns {Node}\n */\nfunction createLabel(text) {\n  var label = document.createElement('label');\n\n  label.className = 'htCheckboxRendererLabel';\n  label.appendChild(document.createTextNode(text));\n\n  return label.cloneNode(true);\n}\n\n/**\n * `mouseup` callback.\n *\n * @private\n * @param {Event} event `mouseup` event.\n * @param {Object} instance Handsontable instance.\n */\nfunction onMouseUp(event, instance) {\n  if (!isCheckboxInput(event.target)) {\n    return;\n  }\n  setTimeout(instance.listen, 10);\n}\n\n/**\n * `click` callback.\n *\n * @private\n * @param {Event} event `click` event.\n * @param {Object} instance Handsontable instance.\n */\nfunction onClick(event, instance) {\n  if (!isCheckboxInput(event.target)) {\n    return false;\n  }\n\n  var row = parseInt(event.target.getAttribute('data-row'), 10);\n  var col = parseInt(event.target.getAttribute('data-col'), 10);\n  var cellProperties = instance.getCellMeta(row, col);\n\n  if (cellProperties.readOnly) {\n    event.preventDefault();\n  }\n}\n\n/**\n * `change` callback.\n *\n * @param {Event} event `change` event.\n * @param {Object} instance Handsontable instance.\n * @param {Object} cellProperties Reference to cell properties.\n * @returns {Boolean}\n */\nfunction onChange(event, instance) {\n  if (!isCheckboxInput(event.target)) {\n    return false;\n  }\n\n  var row = parseInt(event.target.getAttribute('data-row'), 10);\n  var col = parseInt(event.target.getAttribute('data-col'), 10);\n  var cellProperties = instance.getCellMeta(row, col);\n\n  if (!cellProperties.readOnly) {\n    var newCheckboxValue = null;\n\n    if (event.target.checked) {\n      newCheckboxValue = cellProperties.uncheckedTemplate === void 0 ? true : cellProperties.checkedTemplate;\n    } else {\n      newCheckboxValue = cellProperties.uncheckedTemplate === void 0 ? false : cellProperties.uncheckedTemplate;\n    }\n\n    instance.setDataAtCell(row, col, newCheckboxValue);\n  }\n}\n\n/**\n * Check if the provided element is the checkbox input.\n *\n * @private\n * @param {HTMLElement} element The element in question.\n * @returns {Boolean}\n */\nfunction isCheckboxInput(element) {\n  return element.tagName === 'INPUT' && element.getAttribute('type') === 'checkbox';\n}\n\nexports.default = checkboxRenderer;\n\n/***/ }),\n/* 245 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _index = __webpack_require__(13);\n\n/**\n * @private\n * @renderer HtmlRenderer\n * @param instance\n * @param TD\n * @param row\n * @param col\n * @param prop\n * @param value\n * @param cellProperties\n */\nfunction htmlRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  (0, _index.getRenderer)('base').apply(this, arguments);\n\n  if (value === null || value === void 0) {\n    value = '';\n  }\n\n  (0, _element.fastInnerHTML)(TD, value);\n}\n\nexports.default = htmlRenderer;\n\n/***/ }),\n/* 246 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _numbro = __webpack_require__(247);\n\nvar _numbro2 = _interopRequireDefault(_numbro);\n\nvar _index = __webpack_require__(13);\n\nvar _number = __webpack_require__(5);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Numeric cell renderer\n *\n * @private\n * @renderer NumericRenderer\n * @dependencies numbro\n * @param {Object} instance Handsontable instance\n * @param {Element} TD Table cell where to render\n * @param {Number} row\n * @param {Number} col\n * @param {String|Number} prop Row object property name\n * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)\n * @param {Object} cellProperties Cell properties (shared by cell renderer and editor)\n */\nfunction numericRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  if ((0, _number.isNumeric)(value)) {\n    var numericFormat = cellProperties.numericFormat;\n    var cellCulture = numericFormat && numericFormat.culture;\n    var cellFormatPattern = numericFormat && numericFormat.pattern;\n    var className = cellProperties.className || '';\n    var classArr = className.length ? className.split(' ') : [];\n\n    if (typeof cellCulture !== 'undefined') {\n      _numbro2.default.culture(cellCulture);\n    }\n\n    value = (0, _numbro2.default)(value).format(cellFormatPattern || '0');\n\n    if (classArr.indexOf('htLeft') < 0 && classArr.indexOf('htCenter') < 0 && classArr.indexOf('htRight') < 0 && classArr.indexOf('htJustify') < 0) {\n      classArr.push('htRight');\n    }\n\n    if (classArr.indexOf('htNumeric') < 0) {\n      classArr.push('htNumeric');\n    }\n\n    cellProperties.className = classArr.join(' ');\n  }\n\n  (0, _index.getRenderer)('text')(instance, TD, row, col, prop, value, cellProperties);\n}\n\nexports.default = numericRenderer;\n\n/***/ }),\n/* 247 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_247__;\n\n/***/ }),\n/* 248 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _index = __webpack_require__(13);\n\nvar _number = __webpack_require__(5);\n\n/**\n * @private\n * @renderer PasswordRenderer\n * @param instance\n * @param TD\n * @param row\n * @param col\n * @param prop\n * @param value\n * @param cellProperties\n */\nfunction passwordRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  (0, _index.getRenderer)('text').apply(this, arguments);\n\n  value = TD.innerHTML;\n\n  var hashLength = cellProperties.hashLength || value.length;\n  var hashSymbol = cellProperties.hashSymbol || '*';\n\n  var hash = '';\n\n  (0, _number.rangeEach)(hashLength - 1, function () {\n    hash += hashSymbol;\n  });\n  (0, _element.fastInnerHTML)(TD, hash);\n}\n\nexports.default = passwordRenderer;\n\n/***/ }),\n/* 249 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _mixed = __webpack_require__(16);\n\nvar _index = __webpack_require__(13);\n\n/**\n * Default text renderer\n *\n * @private\n * @renderer TextRenderer\n * @param {Object} instance Handsontable instance\n * @param {Element} TD Table cell where to render\n * @param {Number} row\n * @param {Number} col\n * @param {String|Number} prop Row object property name\n * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)\n * @param {Object} cellProperties Cell properties (shared by cell renderer and editor)\n */\nfunction textRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  (0, _index.getRenderer)('base').apply(this, arguments);\n\n  if (!value && cellProperties.placeholder) {\n    value = cellProperties.placeholder;\n  }\n\n  var escaped = (0, _mixed.stringify)(value);\n\n  if (!instance.getSettings().trimWhitespace) {\n    escaped = escaped.replace(/ /g, String.fromCharCode(160));\n  }\n\n  if (cellProperties.rendererTemplate) {\n    (0, _element.empty)(TD);\n    var TEMPLATE = document.createElement('TEMPLATE');\n    TEMPLATE.setAttribute('bind', '{{}}');\n    TEMPLATE.innerHTML = cellProperties.rendererTemplate;\n    HTMLTemplateElement.decorate(TEMPLATE);\n    TEMPLATE.model = instance.getSourceDataAtRow(row);\n    TD.appendChild(TEMPLATE);\n  } else {\n    // this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\n    (0, _element.fastInnerText)(TD, escaped);\n  }\n}\n\nexports.default = textRenderer;\n\n/***/ }),\n/* 250 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = autocompleteValidator;\n/**\n * Autocomplete cell validator.\n *\n * @private\n * @validator AutocompleteValidator\n * @param {*} value - Value of edited cell\n * @param {Function} callback - Callback called with validation result\n */\nfunction autocompleteValidator(value, callback) {\n  if (value == null) {\n    value = '';\n  }\n\n  if (this.allowEmpty && value === '') {\n    callback(true);\n\n    return;\n  }\n\n  if (this.strict && this.source) {\n    if (typeof this.source === 'function') {\n      this.source(value, process(value, callback));\n    } else {\n      process(value, callback)(this.source);\n    }\n  } else {\n    callback(true);\n  }\n};\n\n/**\n * Function responsible for validation of autocomplete value.\n *\n * @param {*} value - Value of edited cell\n * @param {Function} callback - Callback called with validation result\n */\nfunction process(value, callback) {\n  var originalVal = value;\n\n  return function (source) {\n    var found = false;\n\n    for (var s = 0, slen = source.length; s < slen; s++) {\n      if (originalVal === source[s]) {\n        found = true; // perfect match\n        break;\n      }\n    }\n\n    callback(found);\n  };\n}\n\n/***/ }),\n/* 251 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = dateValidator;\nexports.correctFormat = correctFormat;\n\nvar _moment = __webpack_require__(55);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _date = __webpack_require__(190);\n\nvar _editors = __webpack_require__(17);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Date cell validator\n *\n * @private\n * @validator DateValidator\n * @dependencies moment\n * @param {*} value - Value of edited cell\n * @param {Function} callback - Callback called with validation result\n */\nfunction dateValidator(value, callback) {\n  var valid = true;\n  var dateEditor = (0, _editors.getEditorInstance)('date', this.instance);\n\n  if (value == null) {\n    value = '';\n  }\n  var isValidDate = (0, _moment2.default)(new Date(value)).isValid() || (0, _moment2.default)(value, dateEditor.defaultDateFormat).isValid();\n  // is it in the specified format\n  var isValidFormat = (0, _moment2.default)(value, this.dateFormat || dateEditor.defaultDateFormat, true).isValid();\n\n  if (this.allowEmpty && value === '') {\n    isValidDate = true;\n    isValidFormat = true;\n  }\n  if (!isValidDate) {\n    valid = false;\n  }\n  if (!isValidDate && isValidFormat) {\n    valid = true;\n  }\n\n  if (isValidDate && !isValidFormat) {\n    if (this.correctFormat === true) {\n      // if format correction is enabled\n      var correctedValue = correctFormat(value, this.dateFormat);\n      var row = this.instance.runHooks('unmodifyRow', this.row);\n      var column = this.instance.runHooks('unmodifyCol', this.col);\n\n      this.instance.setDataAtCell(row, column, correctedValue, 'dateValidator');\n      valid = true;\n    } else {\n      valid = false;\n    }\n  }\n\n  callback(valid);\n};\n\n/**\n * Format the given string using moment.js' format feature\n *\n * @param {String} value\n * @param {String} dateFormat\n * @returns {String}\n */\nfunction correctFormat(value, dateFormat) {\n  var dateFromDate = (0, _moment2.default)((0, _date.getNormalizedDate)(value));\n  var dateFromMoment = (0, _moment2.default)(value, dateFormat);\n  var isAlphanumeric = value.search(/[A-z]/g) > -1;\n  var date = void 0;\n\n  if (dateFromDate.isValid() && dateFromDate.format('x') === dateFromMoment.format('x') || !dateFromMoment.isValid() || isAlphanumeric) {\n    date = dateFromDate;\n  } else {\n    date = dateFromMoment;\n  }\n\n  return date.format(dateFormat);\n};\n\n/***/ }),\n/* 252 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = numericValidator;\n/**\n * Numeric cell validator\n *\n * @private\n * @validator NumericValidator\n * @param {*} value - Value of edited cell\n * @param {*} callback - Callback called with validation result\n */\nfunction numericValidator(value, callback) {\n  if (value == null) {\n    value = '';\n  }\n  if (this.allowEmpty && value === '') {\n    callback(true);\n  } else if (value === '') {\n    callback(false);\n  } else {\n    callback(/^-?\\d*(\\.|,)?\\d*$/.test(value));\n  }\n};\n\n/***/ }),\n/* 253 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = timeValidator;\n\nvar _moment = __webpack_require__(55);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Formats which are correctly parsed to time (supported by momentjs)\nvar STRICT_FORMATS = ['YYYY-MM-DDTHH:mm:ss.SSSZ', 'X', // Unix timestamp\n'x' // Unix ms timestamp\n];\n\n/**\n * Time cell validator\n *\n * @private\n * @validator TimeValidator\n * @dependencies moment\n * @param {*} value - Value of edited cell\n * @param {Function} callback - Callback called with validation result\n */\nfunction timeValidator(value, callback) {\n  var valid = true;\n  var timeFormat = this.timeFormat || 'h:mm:ss a';\n\n  if (value === null) {\n    value = '';\n  }\n\n  value = /^\\d{3,}$/.test(value) ? parseInt(value, 10) : value;\n\n  var twoDigitValue = /^\\d{1,2}$/.test(value);\n\n  if (twoDigitValue) {\n    value += ':00';\n  }\n\n  var date = (0, _moment2.default)(value, STRICT_FORMATS, true).isValid() ? (0, _moment2.default)(value) : (0, _moment2.default)(value, timeFormat);\n  var isValidTime = date.isValid();\n\n  // is it in the specified format\n  var isValidFormat = (0, _moment2.default)(value, timeFormat, true).isValid() && !twoDigitValue;\n\n  if (this.allowEmpty && value === '') {\n    isValidTime = true;\n    isValidFormat = true;\n  }\n  if (!isValidTime) {\n    valid = false;\n  }\n  if (!isValidTime && isValidFormat) {\n    valid = true;\n  }\n  if (isValidTime && !isValidFormat) {\n    if (this.correctFormat === true) {\n      // if format correction is enabled\n      var correctedValue = date.format(timeFormat);\n      var row = this.instance.runHooks('unmodifyRow', this.row);\n      var column = this.instance.runHooks('unmodifyCol', this.col);\n\n      this.instance.setDataAtCell(row, column, correctedValue, 'timeValidator');\n      valid = true;\n    } else {\n      valid = false;\n    }\n  }\n\n  callback(valid);\n};\n\n/***/ }),\n/* 254 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'autocomplete';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE),\n  validator: (0, _validators.getValidator)(CELL_TYPE)\n};\n\n/***/ }),\n/* 255 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar CELL_TYPE = 'checkbox';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE)\n};\n\n/***/ }),\n/* 256 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'date';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  // displays small gray arrow on right side of the cell\n  renderer: (0, _renderers.getRenderer)('autocomplete'),\n  validator: (0, _validators.getValidator)(CELL_TYPE)\n};\n\n/***/ }),\n/* 257 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'dropdown';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  // displays small gray arrow on right side of the cell\n  renderer: (0, _renderers.getRenderer)('autocomplete'),\n  validator: (0, _validators.getValidator)('autocomplete')\n};\n\n/***/ }),\n/* 258 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar CELL_TYPE = 'handsontable';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  // displays small gray arrow on right side of the cell\n  renderer: (0, _renderers.getRenderer)('autocomplete')\n};\n\n/***/ }),\n/* 259 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'numeric';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE),\n  validator: (0, _validators.getValidator)(CELL_TYPE),\n  dataType: 'number'\n};\n\n/***/ }),\n/* 260 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'password';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE),\n  copyable: false\n};\n\n/***/ }),\n/* 261 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _browser = __webpack_require__(27);\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar CELL_TYPE = 'text';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE)\n};\n\n/***/ }),\n/* 262 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'time';\n\nexports.default = {\n  editor: (0, _editors.getEditor)('text'),\n  // displays small gray arrow on right side of the cell\n  renderer: (0, _renderers.getRenderer)('text'),\n  validator: (0, _validators.getValidator)(CELL_TYPE)\n};\n\n/***/ }),\n/* 263 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _SheetClip = __webpack_require__(191);\n\nvar _SheetClip2 = _interopRequireDefault(_SheetClip);\n\nvar _data = __webpack_require__(90);\n\nvar _setting = __webpack_require__(89);\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _interval = __webpack_require__(264);\n\nvar _interval2 = _interopRequireDefault(_interval);\n\nvar _number = __webpack_require__(5);\n\nvar _multiMap = __webpack_require__(265);\n\nvar _multiMap2 = _interopRequireDefault(_multiMap);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Utility class that gets and saves data from/to the data source using mapping of columns numbers to object property names\n * @todo refactor arguments of methods getRange, getText to be numbers (not objects)\n * @todo remove priv, GridSettings from object constructor\n *\n * @param {Object} instance Instance of Handsontable\n * @param {*} priv\n * @param {*} GridSettings Grid settings\n * @util\n * @class DataMap\n */\nfunction DataMap(instance, priv, GridSettings) {\n  var _this = this;\n\n  this.instance = instance;\n  this.priv = priv;\n  this.GridSettings = GridSettings;\n  this.dataSource = this.instance.getSettings().data;\n  this.cachedLength = null;\n  this.skipCache = false;\n  this.latestSourceRowsCount = 0;\n\n  if (this.dataSource && this.dataSource[0]) {\n    this.duckSchema = this.recursiveDuckSchema(this.dataSource[0]);\n  } else {\n    this.duckSchema = {};\n  }\n  this.createMap();\n  this.interval = _interval2.default.create(function () {\n    return _this.clearLengthCache();\n  }, '15fps');\n\n  this.instance.addHook('skipLengthCache', function (delay) {\n    return _this.onSkipLengthCache(delay);\n  });\n  this.onSkipLengthCache(500);\n}\n\nDataMap.prototype.DESTINATION_RENDERER = 1;\nDataMap.prototype.DESTINATION_CLIPBOARD_GENERATOR = 2;\n\n/**\n * @param {Object|Array} object\n * @returns {Object|Array}\n */\nDataMap.prototype.recursiveDuckSchema = function (object) {\n  return (0, _object.duckSchema)(object);\n};\n\n/**\n * @param {Object} schema\n * @param {Number} lastCol\n * @param {Number} parent\n * @returns {Number}\n */\nDataMap.prototype.recursiveDuckColumns = function (schema, lastCol, parent) {\n  var prop, i;\n  if (typeof lastCol === 'undefined') {\n    lastCol = 0;\n    parent = '';\n  }\n  if ((typeof schema === 'undefined' ? 'undefined' : _typeof(schema)) === 'object' && !Array.isArray(schema)) {\n    for (i in schema) {\n      if ((0, _object.hasOwnProperty)(schema, i)) {\n        if (schema[i] === null) {\n          prop = parent + i;\n          this.colToPropCache.push(prop);\n          this.propToColCache.set(prop, lastCol);\n\n          lastCol++;\n        } else {\n          lastCol = this.recursiveDuckColumns(schema[i], lastCol, i + '.');\n        }\n      }\n    }\n  }\n\n  return lastCol;\n};\n\nDataMap.prototype.createMap = function () {\n  var i = void 0;\n  var schema = this.getSchema();\n\n  if (typeof schema === 'undefined') {\n    throw new Error('trying to create `columns` definition but you didn\\'t provide `schema` nor `data`');\n  }\n\n  this.colToPropCache = [];\n  this.propToColCache = new _multiMap2.default();\n\n  var columns = this.instance.getSettings().columns;\n\n  if (columns) {\n    var maxCols = this.instance.getSettings().maxCols;\n    var columnsLen = Math.min(maxCols, columns.length);\n    var filteredIndex = 0;\n    var columnsAsFunc = false;\n    var schemaLen = (0, _object.deepObjectSize)(schema);\n\n    if (typeof columns === 'function') {\n      columnsLen = schemaLen > 0 ? schemaLen : this.instance.countSourceCols();\n      columnsAsFunc = true;\n    }\n\n    for (i = 0; i < columnsLen; i++) {\n      var column = columnsAsFunc ? columns(i) : columns[i];\n\n      if ((0, _object.isObject)(column)) {\n        if (typeof column.data !== 'undefined') {\n          var index = columnsAsFunc ? filteredIndex : i;\n          this.colToPropCache[index] = column.data;\n          this.propToColCache.set(column.data, index);\n        }\n\n        filteredIndex++;\n      }\n    }\n  } else {\n    this.recursiveDuckColumns(schema);\n  }\n};\n\n/**\n * Returns property name that corresponds with the given column index.\n *\n * @param {Number} col Visual column index.\n * @returns {Number} Physical column index.\n */\nDataMap.prototype.colToProp = function (col) {\n  col = this.instance.runHooks('modifyCol', col);\n\n  if (!isNaN(col) && this.colToPropCache && typeof this.colToPropCache[col] !== 'undefined') {\n    return this.colToPropCache[col];\n  }\n\n  return col;\n};\n\n/**\n * @param {Object} prop\n * @fires Hooks#modifyCol\n * @returns {*}\n */\nDataMap.prototype.propToCol = function (prop) {\n  var col;\n\n  if (typeof this.propToColCache.get(prop) === 'undefined') {\n    col = prop;\n  } else {\n    col = this.propToColCache.get(prop);\n  }\n  col = this.instance.runHooks('unmodifyCol', col);\n\n  return col;\n};\n\n/**\n * @returns {Object}\n */\nDataMap.prototype.getSchema = function () {\n  var schema = this.instance.getSettings().dataSchema;\n\n  if (schema) {\n    if (typeof schema === 'function') {\n      return schema();\n    }\n    return schema;\n  }\n\n  return this.duckSchema;\n};\n\n/**\n * Creates row at the bottom of the data array.\n *\n * @param {Number} [index] Physical index of the row before which the new row will be inserted.\n * @param {Number} [amount=1] An amount of rows to add.\n * @param {String} [source] Source of method call.\n * @fires Hooks#afterCreateRow\n * @returns {Number} Returns number of created rows.\n */\nDataMap.prototype.createRow = function (index) {\n  var _this2 = this;\n\n  var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n  var source = arguments[2];\n\n  var numberOfCreatedRows = 0;\n\n  if (typeof index !== 'number' || index >= this.instance.countSourceRows()) {\n    index = this.instance.countSourceRows();\n  }\n\n  var continueProcess = this.instance.runHooks('beforeCreateRow', index, amount, source);\n\n  if (continueProcess === false) {\n    return 0;\n  }\n\n  var maxRows = this.instance.getSettings().maxRows;\n  var columnCount = this.instance.countCols();\n\n  var _loop = function _loop() {\n    var row = null;\n\n    if (_this2.instance.dataType === 'array') {\n      if (_this2.instance.getSettings().dataSchema) {\n        // Clone template array\n        row = (0, _object.deepClone)(_this2.getSchema());\n      } else {\n        row = [];\n        /* eslint-disable no-loop-func */\n        (0, _number.rangeEach)(columnCount - 1, function () {\n          return row.push(null);\n        });\n      }\n    } else if (_this2.instance.dataType === 'function') {\n      row = _this2.instance.getSettings().dataSchema(index);\n    } else {\n      row = {};\n      (0, _object.deepExtend)(row, _this2.getSchema());\n    }\n\n    if (index === _this2.instance.countSourceRows()) {\n      _this2.dataSource.push(row);\n    } else {\n      _this2.spliceData(index, 0, row);\n    }\n\n    numberOfCreatedRows++;\n  };\n\n  while (numberOfCreatedRows < amount && this.instance.countSourceRows() < maxRows) {\n    _loop();\n  }\n\n  this.instance.runHooks('afterCreateRow', index, numberOfCreatedRows, source);\n  this.instance.forceFullRender = true; // used when data was changed\n\n  return numberOfCreatedRows;\n};\n\n/**\n * Creates col at the right of the data array.\n *\n * @param {Number} [index] Visual index of the column before which the new column will be inserted\n * @param {Number} [amount] An amount of columns to add.\n * @param {String} [source] Source of method call.\n * @fires Hooks#afterCreateCol\n * @returns {Number} Returns number of created columns\n */\nDataMap.prototype.createCol = function (index, amount, source) {\n  if (!this.instance.isColumnModificationAllowed()) {\n    throw new Error('Cannot create new column. When data source in an object, ' + 'you can only have as much columns as defined in first data row, data schema or in the \\'columns\\' setting.' + 'If you want to be able to add new columns, you have to use array datasource.');\n  }\n  var rlen = this.instance.countSourceRows(),\n      data = this.dataSource,\n      constructor,\n      numberOfCreatedCols = 0,\n      currentIndex;\n\n  if (!amount) {\n    amount = 1;\n  }\n\n  if (typeof index !== 'number' || index >= this.instance.countCols()) {\n    index = this.instance.countCols();\n  }\n  this.instance.runHooks('beforeCreateCol', index, amount, source);\n\n  currentIndex = index;\n\n  var maxCols = this.instance.getSettings().maxCols;\n  while (numberOfCreatedCols < amount && this.instance.countCols() < maxCols) {\n    constructor = (0, _setting.columnFactory)(this.GridSettings, this.priv.columnsSettingConflicts);\n\n    if (typeof index !== 'number' || index >= this.instance.countCols()) {\n      if (rlen > 0) {\n        for (var r = 0; r < rlen; r++) {\n          if (typeof data[r] === 'undefined') {\n            data[r] = [];\n          }\n          data[r].push(null);\n        }\n      } else {\n        data.push([null]);\n      }\n      // Add new column constructor\n      this.priv.columnSettings.push(constructor);\n    } else {\n      for (var _r = 0; _r < rlen; _r++) {\n        data[_r].splice(currentIndex, 0, null);\n      }\n      // Add new column constructor at given index\n      this.priv.columnSettings.splice(currentIndex, 0, constructor);\n    }\n\n    numberOfCreatedCols++;\n    currentIndex++;\n  }\n\n  this.instance.runHooks('afterCreateCol', index, numberOfCreatedCols, source);\n  this.instance.forceFullRender = true; // used when data was changed\n\n  return numberOfCreatedCols;\n};\n\n/**\n * Removes row from the data array.\n *\n * @param {Number} [index] Visual index of the row to be removed. If not provided, the last row will be removed\n * @param {Number} [amount] Amount of the rows to be removed. If not provided, one row will be removed\n * @param {String} [source] Source of method call.\n * @fires Hooks#beforeRemoveRow\n * @fires Hooks#afterRemoveRow\n */\nDataMap.prototype.removeRow = function (index, amount, source) {\n  if (!amount) {\n    amount = 1;\n  }\n  if (typeof index !== 'number') {\n    index = -amount;\n  }\n\n  amount = this.instance.runHooks('modifyRemovedAmount', amount, index);\n\n  index = (this.instance.countSourceRows() + index) % this.instance.countSourceRows();\n\n  var logicRows = this.visualRowsToPhysical(index, amount);\n  var actionWasNotCancelled = this.instance.runHooks('beforeRemoveRow', index, amount, logicRows, source);\n\n  if (actionWasNotCancelled === false) {\n    return;\n  }\n\n  var data = this.dataSource;\n  var newData = void 0;\n\n  newData = this.filterData(index, amount);\n\n  if (newData) {\n    data.length = 0;\n    Array.prototype.push.apply(data, newData);\n  }\n\n  this.instance.runHooks('afterRemoveRow', index, amount, logicRows, source);\n\n  this.instance.forceFullRender = true; // used when data was changed\n};\n\n/**\n * Removes column from the data array.\n *\n * @param {Number} [index] Visual index of the column to be removed. If not provided, the last column will be removed\n * @param {Number} [amount] Amount of the columns to be removed. If not provided, one column will be removed\n * @param {String} [source] Source of method call.\n * @fires Hooks#beforeRemoveCol\n * @fires Hooks#afterRemoveCol\n */\nDataMap.prototype.removeCol = function (index, amount, source) {\n  if (this.instance.dataType === 'object' || this.instance.getSettings().columns) {\n    throw new Error('cannot remove column with object data source or columns option specified');\n  }\n  if (!amount) {\n    amount = 1;\n  }\n  if (typeof index !== 'number') {\n    index = -amount;\n  }\n\n  index = (this.instance.countCols() + index) % this.instance.countCols();\n\n  var logicColumns = this.visualColumnsToPhysical(index, amount);\n  var descendingLogicColumns = logicColumns.slice(0).sort(function (a, b) {\n    return b - a;\n  });\n  var actionWasNotCancelled = this.instance.runHooks('beforeRemoveCol', index, amount, logicColumns, source);\n\n  if (actionWasNotCancelled === false) {\n    return;\n  }\n\n  var isTableUniform = true;\n  var removedColumnsCount = descendingLogicColumns.length;\n  var data = this.dataSource;\n\n  for (var c = 0; c < removedColumnsCount; c++) {\n    if (isTableUniform && logicColumns[0] !== logicColumns[c] - c) {\n      isTableUniform = false;\n    }\n  }\n\n  if (isTableUniform) {\n    for (var r = 0, rlen = this.instance.countSourceRows(); r < rlen; r++) {\n      data[r].splice(logicColumns[0], amount);\n    }\n  } else {\n    for (var _r2 = 0, _rlen = this.instance.countSourceRows(); _r2 < _rlen; _r2++) {\n      for (var _c = 0; _c < removedColumnsCount; _c++) {\n        data[_r2].splice(descendingLogicColumns[_c], 1);\n      }\n    }\n\n    for (var _c2 = 0; _c2 < removedColumnsCount; _c2++) {\n      this.priv.columnSettings.splice(logicColumns[_c2], 1);\n    }\n  }\n\n  this.instance.runHooks('afterRemoveCol', index, amount, logicColumns, source);\n\n  this.instance.forceFullRender = true; // used when data was changed\n};\n\n/**\n * Add/Removes data from the column.\n *\n * @param {Number} col Physical index of column in which do you want to do splice\n * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end\n * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed\n * @returns {Array} Returns removed portion of columns\n */\nDataMap.prototype.spliceCol = function (col, index, amount /* , elements... */) {\n  var elements = arguments.length >= 4 ? [].slice.call(arguments, 3) : [];\n\n  var colData = this.instance.getDataAtCol(col);\n  var removed = colData.slice(index, index + amount);\n  var after = colData.slice(index + amount);\n\n  (0, _array.extendArray)(elements, after);\n  var i = 0;\n  while (i < amount) {\n    elements.push(null); // add null in place of removed elements\n    i++;\n  }\n  (0, _array.to2dArray)(elements);\n  this.instance.populateFromArray(index, col, elements, null, null, 'spliceCol');\n\n  return removed;\n};\n\n/**\n * Add/Removes data from the row.\n *\n * @param {Number} row Physical index of row in which do you want to do splice\n * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end.\n * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed.\n * @returns {Array} Returns removed portion of rows\n */\nDataMap.prototype.spliceRow = function (row, index, amount /* , elements... */) {\n  var elements = arguments.length >= 4 ? [].slice.call(arguments, 3) : [];\n\n  var rowData = this.instance.getSourceDataAtRow(row);\n  var removed = rowData.slice(index, index + amount);\n  var after = rowData.slice(index + amount);\n\n  (0, _array.extendArray)(elements, after);\n  var i = 0;\n  while (i < amount) {\n    elements.push(null); // add null in place of removed elements\n    i++;\n  }\n  this.instance.populateFromArray(row, index, [elements], null, null, 'spliceRow');\n\n  return removed;\n};\n\n/**\n * Add/remove row(s) to/from the data source.\n *\n * @param {Number} index Physical index of the element to remove.\n * @param {Number} amount Number of rows to add/remove.\n * @param {Object} element Row to add.\n */\nDataMap.prototype.spliceData = function (index, amount, element) {\n  var continueSplicing = this.instance.runHooks('beforeDataSplice', index, amount, element);\n\n  if (continueSplicing !== false) {\n    this.dataSource.splice(index, amount, element);\n  }\n};\n\n/**\n * Filter unwanted data elements from the data source.\n *\n * @param {Number} index Visual index of the element to remove.\n * @param {Number} amount Number of rows to add/remove.\n * @returns {Array}\n */\nDataMap.prototype.filterData = function (index, amount) {\n  var physicalRows = this.visualRowsToPhysical(index, amount);\n  var continueSplicing = this.instance.runHooks('beforeDataFilter', index, amount, physicalRows);\n\n  if (continueSplicing !== false) {\n    var newData = this.dataSource.filter(function (row, index) {\n      return physicalRows.indexOf(index) == -1;\n    });\n\n    return newData;\n  }\n};\n\n/**\n * Returns single value from the data array.\n *\n * @param {Number} row Visual row index.\n * @param {Number} prop\n */\nDataMap.prototype.get = function (row, prop) {\n  row = this.instance.runHooks('modifyRow', row);\n\n  var dataRow = this.dataSource[row];\n  // TODO: To remove, use 'modifyData' hook instead (see below)\n  var modifiedRowData = this.instance.runHooks('modifyRowData', row);\n\n  dataRow = isNaN(modifiedRowData) ? modifiedRowData : dataRow;\n  //\n\n  var value = null;\n\n  // try to get value under property `prop` (includes dot)\n  if (dataRow && dataRow.hasOwnProperty && (0, _object.hasOwnProperty)(dataRow, prop)) {\n    value = dataRow[prop];\n  } else if (typeof prop === 'string' && prop.indexOf('.') > -1) {\n    var sliced = prop.split('.');\n    var out = dataRow;\n\n    if (!out) {\n      return null;\n    }\n    for (var i = 0, ilen = sliced.length; i < ilen; i++) {\n      out = out[sliced[i]];\n\n      if (typeof out === 'undefined') {\n        return null;\n      }\n    }\n    value = out;\n  } else if (typeof prop === 'function') {\n    /**\n     *  allows for interacting with complex structures, for example\n     *  d3/jQuery getter/setter properties:\n     *\n     *    {columns: [{\n     *      data: function(row, value){\n     *        if(arguments.length === 1){\n     *          return row.property();\n     *        }\n     *        row.property(value);\n     *      }\n     *    }]}\n     */\n    value = prop(this.dataSource.slice(row, row + 1)[0]);\n  }\n\n  if (this.instance.hasHook('modifyData')) {\n    var valueHolder = (0, _object.createObjectPropListener)(value);\n\n    this.instance.runHooks('modifyData', row, this.propToCol(prop), valueHolder, 'get');\n\n    if (valueHolder.isTouched()) {\n      value = valueHolder.value;\n    }\n  }\n\n  return value;\n};\n\nvar copyableLookup = (0, _data.cellMethodLookupFactory)('copyable', false);\n\n/**\n * Returns single value from the data array (intended for clipboard copy to an external application).\n *\n * @param {Number} row Physical row index.\n * @param {Number} prop\n * @returns {String}\n */\nDataMap.prototype.getCopyable = function (row, prop) {\n  if (copyableLookup.call(this.instance, row, this.propToCol(prop))) {\n    return this.get(row, prop);\n  }\n  return '';\n};\n\n/**\n * Saves single value to the data array.\n *\n * @param {Number} row Visual row index.\n * @param {Number} prop\n * @param {String} value\n * @param {String} [source] Source of hook runner.\n */\nDataMap.prototype.set = function (row, prop, value, source) {\n  row = this.instance.runHooks('modifyRow', row, source || 'datamapGet');\n\n  var dataRow = this.dataSource[row];\n  // TODO: To remove, use 'modifyData' hook instead (see below)\n  var modifiedRowData = this.instance.runHooks('modifyRowData', row);\n\n  dataRow = isNaN(modifiedRowData) ? modifiedRowData : dataRow;\n  //\n\n  if (this.instance.hasHook('modifyData')) {\n    var valueHolder = (0, _object.createObjectPropListener)(value);\n\n    this.instance.runHooks('modifyData', row, this.propToCol(prop), valueHolder, 'set');\n\n    if (valueHolder.isTouched()) {\n      value = valueHolder.value;\n    }\n  }\n\n  // try to set value under property `prop` (includes dot)\n  if (dataRow && dataRow.hasOwnProperty && (0, _object.hasOwnProperty)(dataRow, prop)) {\n    dataRow[prop] = value;\n  } else if (typeof prop === 'string' && prop.indexOf('.') > -1) {\n    var sliced = prop.split('.');\n    var out = dataRow;\n    var i = 0;\n    var ilen = void 0;\n\n    for (i = 0, ilen = sliced.length - 1; i < ilen; i++) {\n      if (typeof out[sliced[i]] === 'undefined') {\n        out[sliced[i]] = {};\n      }\n      out = out[sliced[i]];\n    }\n    out[sliced[i]] = value;\n  } else if (typeof prop === 'function') {\n    /* see the `function` handler in `get` */\n    prop(this.dataSource.slice(row, row + 1)[0], value);\n  } else {\n    dataRow[prop] = value;\n  }\n};\n\n/**\n * This ridiculous piece of code maps rows Id that are present in table data to those displayed for user.\n * The trick is, the physical row id (stored in settings.data) is not necessary the same\n * as the visual (displayed) row id (e.g. when sorting is applied).\n *\n * @param {Number} index Visual row index.\n * @param {Number} amount\n * @fires Hooks#modifyRow\n * @returns {Number}\n */\nDataMap.prototype.visualRowsToPhysical = function (index, amount) {\n  var totalRows = this.instance.countSourceRows();\n  var physicRow = (totalRows + index) % totalRows;\n  var logicRows = [];\n  var rowsToRemove = amount;\n  var row;\n\n  while (physicRow < totalRows && rowsToRemove) {\n    row = this.instance.runHooks('modifyRow', physicRow);\n    logicRows.push(row);\n\n    rowsToRemove--;\n    physicRow++;\n  }\n\n  return logicRows;\n};\n\n/**\n *\n * @param index Visual column index.\n * @param amount\n * @returns {Array}\n */\nDataMap.prototype.visualColumnsToPhysical = function (index, amount) {\n  var totalCols = this.instance.countCols();\n  var physicalCol = (totalCols + index) % totalCols;\n  var visualCols = [];\n  var colsToRemove = amount;\n\n  while (physicalCol < totalCols && colsToRemove) {\n    var col = this.instance.runHooks('modifyCol', physicalCol);\n\n    visualCols.push(col);\n\n    colsToRemove--;\n    physicalCol++;\n  }\n\n  return visualCols;\n};\n\n/**\n * Clears the data array.\n */\nDataMap.prototype.clear = function () {\n  for (var r = 0; r < this.instance.countSourceRows(); r++) {\n    for (var c = 0; c < this.instance.countCols(); c++) {\n      this.set(r, this.colToProp(c), '');\n    }\n  }\n};\n\n/**\n * Clear cached data length.\n */\nDataMap.prototype.clearLengthCache = function () {\n  this.cachedLength = null;\n};\n\n/**\n * Get data length.\n *\n * @returns {Number}\n */\nDataMap.prototype.getLength = function () {\n  var _this3 = this;\n\n  var maxRows = void 0,\n      maxRowsFromSettings = this.instance.getSettings().maxRows;\n\n  if (maxRowsFromSettings < 0 || maxRowsFromSettings === 0) {\n    maxRows = 0;\n  } else {\n    maxRows = maxRowsFromSettings || Infinity;\n  }\n\n  var length = this.instance.countSourceRows();\n\n  if (this.instance.hasHook('modifyRow')) {\n    var reValidate = this.skipCache;\n\n    this.interval.start();\n    if (length !== this.latestSourceRowsCount) {\n      reValidate = true;\n    }\n\n    this.latestSourceRowsCount = length;\n    if (this.cachedLength === null || reValidate) {\n      (0, _number.rangeEach)(length - 1, function (row) {\n        row = _this3.instance.runHooks('modifyRow', row);\n\n        if (row === null) {\n          --length;\n        }\n      });\n      this.cachedLength = length;\n    } else {\n      length = this.cachedLength;\n    }\n  } else {\n    this.interval.stop();\n  }\n\n  return Math.min(length, maxRows);\n};\n\n/**\n * Returns the data array.\n *\n * @returns {Array}\n */\nDataMap.prototype.getAll = function () {\n  var start = {\n    row: 0,\n    col: 0\n  };\n\n  var end = {\n    row: Math.max(this.instance.countSourceRows() - 1, 0),\n    col: Math.max(this.instance.countCols() - 1, 0)\n  };\n\n  if (start.row - end.row === 0 && !this.instance.countSourceRows()) {\n    return [];\n  }\n\n  return this.getRange(start, end, DataMap.prototype.DESTINATION_RENDERER);\n};\n\n/**\n * Returns data range as array.\n *\n * @param {Object} [start] Start selection position. Visual indexes.\n * @param {Object} [end] End selection position. Visual indexes.\n * @param {Number} destination Destination of datamap.get\n * @returns {Array}\n */\nDataMap.prototype.getRange = function (start, end, destination) {\n  var r,\n      rlen,\n      c,\n      clen,\n      output = [],\n      row;\n\n  var maxRows = this.instance.getSettings().maxRows;\n  var maxCols = this.instance.getSettings().maxCols;\n\n  if (maxRows === 0 || maxCols === 0) {\n    return [];\n  }\n\n  var getFn = destination === this.DESTINATION_CLIPBOARD_GENERATOR ? this.getCopyable : this.get;\n\n  rlen = Math.min(Math.max(maxRows - 1, 0), Math.max(start.row, end.row));\n  clen = Math.min(Math.max(maxCols - 1, 0), Math.max(start.col, end.col));\n\n  for (r = Math.min(start.row, end.row); r <= rlen; r++) {\n    row = [];\n    var physicalRow = this.instance.runHooks('modifyRow', r);\n\n    for (c = Math.min(start.col, end.col); c <= clen; c++) {\n\n      if (physicalRow === null) {\n        break;\n      }\n      row.push(getFn.call(this, r, this.colToProp(c)));\n    }\n    if (physicalRow !== null) {\n      output.push(row);\n    }\n  }\n\n  return output;\n};\n\n/**\n * Return data as text (tab separated columns).\n *\n * @param {Object} [start] Start selection position. Visual indexes.\n * @param {Object} [end] End selection position. Visual indexes.\n * @returns {String}\n */\nDataMap.prototype.getText = function (start, end) {\n  return _SheetClip2.default.stringify(this.getRange(start, end, this.DESTINATION_RENDERER));\n};\n\n/**\n * Return data as copyable text (tab separated columns intended for clipboard copy to an external application).\n *\n * @param {Object} [start] Start selection position. Visual indexes.\n * @param {Object} [end] End selection position. Visual indexes.\n * @returns {String}\n */\nDataMap.prototype.getCopyableText = function (start, end) {\n  return _SheetClip2.default.stringify(this.getRange(start, end, this.DESTINATION_CLIPBOARD_GENERATOR));\n};\n\n/**\n * `skipLengthCache` callback.\n * @private\n * @param {Number} delay Time of the delay in milliseconds.\n */\nDataMap.prototype.onSkipLengthCache = function (delay) {\n  var _this4 = this;\n\n  this.skipCache = true;\n  setTimeout(function () {\n    _this4.skipCache = false;\n  }, delay);\n};\n\n/**\n * Destroy instance.\n */\nDataMap.prototype.destroy = function () {\n  this.interval.stop();\n\n  this.interval = null;\n  this.instance = null;\n  this.priv = null;\n  this.GridSettings = null;\n  this.dataSource = null;\n  this.cachedLength = null;\n  this.duckSchema = null;\n};\n\nexports.default = DataMap;\n\n/***/ }),\n/* 264 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.parseDelay = parseDelay;\n\nvar _feature = __webpack_require__(40);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Interval\n * @util\n */\nvar Interval = function () {\n  _createClass(Interval, null, [{\n    key: 'create',\n    value: function create(func, delay) {\n      return new Interval(func, delay);\n    }\n  }]);\n\n  function Interval(func, delay) {\n    var _this = this;\n\n    _classCallCheck(this, Interval);\n\n    /**\n     * Animation frame request id.\n     *\n     * @type {Number}\n     */\n    this.timer = null;\n    /**\n     * Function to invoke repeatedly.\n     *\n     * @type {Function}\n     */\n    this.func = func;\n    /**\n     * Number of milliseconds that function should wait before next call.\n     */\n    this.delay = parseDelay(delay);\n    /**\n     * Flag which indicates if interval object was stopped.\n     *\n     * @type {Boolean}\n     * @default true\n     */\n    this.stopped = true;\n    /**\n     * Interval time (in milliseconds) of the last callback call.\n     *\n     * @private\n     * @type {Number}\n     */\n    this._then = null;\n    /**\n     * Bounded function `func`.\n     *\n     * @private\n     * @type {Function}\n     */\n    this._callback = function () {\n      return _this.__callback();\n    };\n  }\n\n  /**\n   * Start loop.\n   *\n   * @returns {Interval}\n   */\n\n\n  _createClass(Interval, [{\n    key: 'start',\n    value: function start() {\n      if (this.stopped) {\n        this._then = Date.now();\n        this.stopped = false;\n        this.timer = (0, _feature.requestAnimationFrame)(this._callback);\n      }\n\n      return this;\n    }\n\n    /**\n     * Stop looping.\n     *\n     * @returns {Interval}\n     */\n\n  }, {\n    key: 'stop',\n    value: function stop() {\n      if (!this.stopped) {\n        this.stopped = true;\n        (0, _feature.cancelAnimationFrame)(this.timer);\n        this.timer = null;\n      }\n\n      return this;\n    }\n\n    /**\n     * Loop callback, fired on every animation frame.\n     *\n     * @private\n     */\n\n  }, {\n    key: '__callback',\n    value: function __callback() {\n      this.timer = (0, _feature.requestAnimationFrame)(this._callback);\n\n      if (this.delay) {\n        var now = Date.now();\n        var elapsed = now - this._then;\n\n        if (elapsed > this.delay) {\n          this._then = now - elapsed % this.delay;\n          this.func();\n        }\n      } else {\n        this.func();\n      }\n    }\n  }]);\n\n  return Interval;\n}();\n\nexports.default = Interval;\nfunction parseDelay(delay) {\n  if (typeof delay === 'string' && /fps$/.test(delay)) {\n    delay = 1000 / parseInt(delay.replace('fps', '') || 0, 10);\n  }\n\n  return delay;\n}\n\n/***/ }),\n/* 265 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction MultiMap() {\n  var map = {\n    arrayMap: [],\n    weakMap: new WeakMap()\n  };\n\n  return {\n    get: function get(key) {\n      if (canBeAnArrayMapKey(key)) {\n        return map.arrayMap[key];\n      } else if (canBeAWeakMapKey(key)) {\n        return map.weakMap.get(key);\n      }\n    },\n    set: function set(key, value) {\n      if (canBeAnArrayMapKey(key)) {\n        map.arrayMap[key] = value;\n      } else if (canBeAWeakMapKey(key)) {\n        map.weakMap.set(key, value);\n      } else {\n        throw new Error('Invalid key type');\n      }\n    },\n    delete: function _delete(key) {\n      if (canBeAnArrayMapKey(key)) {\n        delete map.arrayMap[key];\n      } else if (canBeAWeakMapKey(key)) {\n        map.weakMap.delete(key);\n      }\n    }\n  };\n\n  function canBeAnArrayMapKey(obj) {\n    return obj !== null && !isNaNSymbol(obj) && (typeof obj == 'string' || typeof obj == 'number');\n  }\n\n  function canBeAWeakMapKey(obj) {\n    return obj !== null && ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) == 'object' || typeof obj == 'function');\n  }\n\n  function isNaNSymbol(obj) {\n    /* eslint-disable no-self-compare */\n    return obj !== obj; // NaN === NaN is always false\n  }\n}\n\nexports.default = MultiMap;\n\n/***/ }),\n/* 266 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\nvar _unicode = __webpack_require__(21);\n\nvar _event = __webpack_require__(12);\n\nvar _editors = __webpack_require__(17);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _baseEditor = __webpack_require__(53);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction EditorManager(instance, priv, selection) {\n  var _this = this,\n      destroyed = false,\n      lock = false,\n      eventManager,\n      activeEditor;\n\n  eventManager = new _eventManager2.default(instance);\n\n  function moveSelectionAfterEnter(shiftKey) {\n    var enterMoves = typeof priv.settings.enterMoves === 'function' ? priv.settings.enterMoves(event) : priv.settings.enterMoves;\n\n    if (shiftKey) {\n      // move selection up\n      selection.transformStart(-enterMoves.row, -enterMoves.col);\n    } else {\n      // move selection down (add a new row if needed)\n      selection.transformStart(enterMoves.row, enterMoves.col, true);\n    }\n  }\n\n  function moveSelectionUp(shiftKey) {\n    if (shiftKey) {\n      selection.transformEnd(-1, 0);\n    } else {\n      selection.transformStart(-1, 0);\n    }\n  }\n\n  function moveSelectionDown(shiftKey) {\n    if (shiftKey) {\n      // expanding selection down with shift\n      selection.transformEnd(1, 0);\n    } else {\n      selection.transformStart(1, 0);\n    }\n  }\n\n  function moveSelectionRight(shiftKey) {\n    if (shiftKey) {\n      selection.transformEnd(0, 1);\n    } else {\n      selection.transformStart(0, 1);\n    }\n  }\n\n  function moveSelectionLeft(shiftKey) {\n    if (shiftKey) {\n      selection.transformEnd(0, -1);\n    } else {\n      selection.transformStart(0, -1);\n    }\n  }\n\n  function onKeyDown(event) {\n    if (!instance.isListening()) {\n      return;\n    }\n    instance.runHooks('beforeKeyDown', event);\n\n    if (destroyed) {\n      return;\n    }\n    if ((0, _event.isImmediatePropagationStopped)(event)) {\n      return;\n    }\n    priv.lastKeyCode = event.keyCode;\n\n    if (!selection.isSelected()) {\n      return;\n    }\n    // catch CTRL but not right ALT (which in some systems triggers ALT+CTRL)\n    var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey;\n\n    if (activeEditor && !activeEditor.isWaiting()) {\n      if (!(0, _unicode.isMetaKey)(event.keyCode) && !(0, _unicode.isCtrlMetaKey)(event.keyCode) && !ctrlDown && !_this.isEditorOpened()) {\n        _this.openEditor('', event);\n\n        return;\n      }\n    }\n    var rangeModifier = event.shiftKey ? selection.setRangeEnd : selection.setRangeStart;\n    var tabMoves = void 0;\n\n    switch (event.keyCode) {\n      case _unicode.KEY_CODES.A:\n        if (!_this.isEditorOpened() && ctrlDown) {\n          instance.selectAll();\n\n          event.preventDefault();\n          (0, _event.stopPropagation)(event);\n        }\n        break;\n\n      case _unicode.KEY_CODES.ARROW_UP:\n        if (_this.isEditorOpened() && !activeEditor.isWaiting()) {\n          _this.closeEditorAndSaveChanges(ctrlDown);\n        }\n        moveSelectionUp(event.shiftKey);\n\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.ARROW_DOWN:\n        if (_this.isEditorOpened() && !activeEditor.isWaiting()) {\n          _this.closeEditorAndSaveChanges(ctrlDown);\n        }\n\n        moveSelectionDown(event.shiftKey);\n\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.ARROW_RIGHT:\n        if (_this.isEditorOpened() && !activeEditor.isWaiting()) {\n          _this.closeEditorAndSaveChanges(ctrlDown);\n        }\n\n        moveSelectionRight(event.shiftKey);\n\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.ARROW_LEFT:\n        if (_this.isEditorOpened() && !activeEditor.isWaiting()) {\n          _this.closeEditorAndSaveChanges(ctrlDown);\n        }\n\n        moveSelectionLeft(event.shiftKey);\n\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.TAB:\n        tabMoves = typeof priv.settings.tabMoves === 'function' ? priv.settings.tabMoves(event) : priv.settings.tabMoves;\n\n        if (event.shiftKey) {\n          // move selection left\n          selection.transformStart(-tabMoves.row, -tabMoves.col);\n        } else {\n          // move selection right (add a new column if needed)\n          selection.transformStart(tabMoves.row, tabMoves.col, true);\n        }\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.BACKSPACE:\n      case _unicode.KEY_CODES.DELETE:\n        instance.emptySelectedCells();\n        _this.prepareEditor();\n        event.preventDefault();\n        break;\n\n      case _unicode.KEY_CODES.F2:\n        /* F2 */\n        _this.openEditor(null, event);\n\n        if (activeEditor) {\n          activeEditor.enableFullEditMode();\n        }\n        event.preventDefault(); // prevent Opera from opening 'Go to Page dialog'\n        break;\n\n      case _unicode.KEY_CODES.ENTER:\n        /* return/enter */\n        if (_this.isEditorOpened()) {\n\n          if (activeEditor && activeEditor.state !== _baseEditor.EditorState.WAITING) {\n            _this.closeEditorAndSaveChanges(ctrlDown);\n          }\n          moveSelectionAfterEnter(event.shiftKey);\n        } else if (instance.getSettings().enterBeginsEditing) {\n          _this.openEditor(null, event);\n\n          if (activeEditor) {\n            activeEditor.enableFullEditMode();\n          }\n        } else {\n          moveSelectionAfterEnter(event.shiftKey);\n        }\n        event.preventDefault(); // don't add newline to field\n        (0, _event.stopImmediatePropagation)(event); // required by HandsontableEditor\n        break;\n\n      case _unicode.KEY_CODES.ESCAPE:\n        if (_this.isEditorOpened()) {\n          _this.closeEditorAndRestoreOriginalValue(ctrlDown);\n        }\n        event.preventDefault();\n        break;\n\n      case _unicode.KEY_CODES.HOME:\n        if (event.ctrlKey || event.metaKey) {\n          rangeModifier.call(selection, new _src.CellCoords(0, selection.selectedRange.current().from.col));\n        } else {\n          rangeModifier.call(selection, new _src.CellCoords(selection.selectedRange.current().from.row, 0));\n        }\n        event.preventDefault(); // don't scroll the window\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.END:\n        if (event.ctrlKey || event.metaKey) {\n          rangeModifier.call(selection, new _src.CellCoords(instance.countRows() - 1, selection.selectedRange.current().from.col));\n        } else {\n          rangeModifier.call(selection, new _src.CellCoords(selection.selectedRange.current().from.row, instance.countCols() - 1));\n        }\n        event.preventDefault(); // don't scroll the window\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.PAGE_UP:\n        selection.transformStart(-instance.countVisibleRows(), 0);\n        event.preventDefault(); // don't page up the window\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.PAGE_DOWN:\n        selection.transformStart(instance.countVisibleRows(), 0);\n        event.preventDefault(); // don't page down the window\n        (0, _event.stopPropagation)(event);\n        break;\n      default:\n        break;\n    }\n  }\n\n  function init() {\n    instance.addHook('afterDocumentKeyDown', onKeyDown);\n\n    eventManager.addEventListener(document.documentElement, 'keydown', function (event) {\n      if (!destroyed) {\n        instance.runHooks('afterDocumentKeyDown', event);\n      }\n    });\n\n    function onDblClick(event, coords, elem) {\n      // may be TD or TH\n      if (elem.nodeName === 'TD') {\n        _this.openEditor(null, event);\n\n        if (activeEditor) {\n          activeEditor.enableFullEditMode();\n        }\n      }\n    }\n    instance.view.wt.update('onCellDblClick', onDblClick);\n  }\n\n  /**\n  * Lock the editor from being prepared and closed. Locking the editor prevents its closing and\n  * reinitialized after selecting the new cell. This feature is necessary for a mobile editor.\n  *\n  * @function lockEditor\n  * @memberof! Handsontable.EditorManager#\n   */\n  this.lockEditor = function () {\n    lock = true;\n  };\n\n  /**\n  * Unlock the editor from being prepared and closed. This method restores the original behavior of\n  * the editors where for every new selection its instances are closed.\n  *\n  * @function unlockEditor\n  * @memberof! Handsontable.EditorManager#\n   */\n  this.unlockEditor = function () {\n    lock = false;\n  };\n\n  /**\n   * Destroy current editor, if exists.\n   *\n   * @function destroyEditor\n   * @memberof! Handsontable.EditorManager#\n   * @param {Boolean} revertOriginal\n   */\n  this.destroyEditor = function (revertOriginal) {\n    if (!lock) {\n      this.closeEditor(revertOriginal);\n    }\n  };\n\n  /**\n   * Get active editor.\n   *\n   * @function getActiveEditor\n   * @memberof! Handsontable.EditorManager#\n   * @returns {*}\n   */\n  this.getActiveEditor = function () {\n    return activeEditor;\n  };\n\n  /**\n   * Prepare text input to be displayed at given grid cell.\n   *\n   * @function prepareEditor\n   * @memberof! Handsontable.EditorManager#\n   */\n  this.prepareEditor = function () {\n    if (lock) {\n      return;\n    }\n\n    var row, col, prop, td, originalValue, cellProperties, editorClass;\n\n    if (activeEditor && activeEditor.isWaiting()) {\n      this.closeEditor(false, false, function (dataSaved) {\n        if (dataSaved) {\n          _this.prepareEditor();\n        }\n      });\n\n      return;\n    }\n    row = instance.selection.selectedRange.current().highlight.row;\n    col = instance.selection.selectedRange.current().highlight.col;\n    prop = instance.colToProp(col);\n    td = instance.getCell(row, col);\n\n    originalValue = instance.getSourceDataAtCell(instance.runHooks('modifyRow', row), col);\n    cellProperties = instance.getCellMeta(row, col);\n    editorClass = instance.getCellEditor(cellProperties);\n\n    if (editorClass) {\n      activeEditor = (0, _editors.getEditorInstance)(editorClass, instance);\n      activeEditor.prepare(row, col, prop, td, originalValue, cellProperties);\n    } else {\n      activeEditor = void 0;\n    }\n  };\n\n  /**\n   * Check is editor is opened/showed.\n   *\n   * @function isEditorOpened\n   * @memberof! Handsontable.EditorManager#\n   * @returns {Boolean}\n   */\n  this.isEditorOpened = function () {\n    return activeEditor && activeEditor.isOpened();\n  };\n\n  /**\n   * Open editor with initial value.\n   *\n   * @function openEditor\n   * @memberof! Handsontable.EditorManager#\n   * @param {null|String} newInitialValue new value from which editor will start if handled property it's not the `null`.\n   * @param {DOMEvent} event\n   */\n  this.openEditor = function (newInitialValue, event) {\n    if (activeEditor && !activeEditor.cellProperties.readOnly) {\n      activeEditor.beginEditing(newInitialValue, event);\n    } else if (activeEditor && activeEditor.cellProperties.readOnly) {\n\n      // move the selection after opening the editor with ENTER key\n      if (event && event.keyCode === _unicode.KEY_CODES.ENTER) {\n        moveSelectionAfterEnter();\n      }\n    }\n  };\n\n  /**\n   * Close editor, finish editing cell.\n   *\n   * @function closeEditor\n   * @memberof! Handsontable.EditorManager#\n   * @param {Boolean} restoreOriginalValue\n   * @param {Boolean} [ctrlDown]\n   * @param {Function} [callback]\n   */\n  this.closeEditor = function (restoreOriginalValue, ctrlDown, callback) {\n    if (activeEditor) {\n      activeEditor.finishEditing(restoreOriginalValue, ctrlDown, callback);\n    } else if (callback) {\n      callback(false);\n    }\n  };\n\n  /**\n   * Close editor and save changes.\n   *\n   * @function closeEditorAndSaveChanges\n   * @memberof! Handsontable.EditorManager#\n   * @param {Boolean} ctrlDown\n   */\n  this.closeEditorAndSaveChanges = function (ctrlDown) {\n    return this.closeEditor(false, ctrlDown);\n  };\n\n  /**\n   * Close editor and restore original value.\n   *\n   * @function closeEditorAndRestoreOriginalValue\n   * @memberof! Handsontable.EditorManager#\n   * @param {Boolean} ctrlDown\n   */\n  this.closeEditorAndRestoreOriginalValue = function (ctrlDown) {\n    return this.closeEditor(true, ctrlDown);\n  };\n\n  /**\n   * Destroy the instance.\n   */\n  this.destroy = function () {\n    destroyed = true;\n  };\n\n  init();\n}\n\nvar instances = new WeakMap();\n\nEditorManager.getInstance = function (hotInstance, hotSettings, selection, datamap) {\n  var editorManager = instances.get(hotInstance);\n\n  if (!editorManager) {\n    editorManager = new EditorManager(hotInstance, hotSettings, selection, datamap);\n    instances.set(hotInstance, editorManager);\n  }\n\n  return editorManager;\n};\n\nexports.default = EditorManager;\n\n/***/ }),\n/* 267 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _browser = __webpack_require__(27);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _event = __webpack_require__(12);\n\nvar _src = __webpack_require__(4);\n\nvar _src2 = _interopRequireDefault(_src);\n\nvar _mouseEventHandler = __webpack_require__(192);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Handsontable TableView constructor\n * @param {Object} instance\n */\nfunction TableView(instance) {\n  var _this = this;\n\n  var that = this;\n\n  this.eventManager = new _eventManager2.default(instance);\n  this.instance = instance;\n  this.settings = instance.getSettings();\n  this.selectionMouseDown = false;\n\n  var originalStyle = instance.rootElement.getAttribute('style');\n\n  if (originalStyle) {\n    instance.rootElement.setAttribute('data-originalstyle', originalStyle); // needed to retrieve original style in jsFiddle link generator in HT examples. may be removed in future versions\n  }\n\n  (0, _element.addClass)(instance.rootElement, 'handsontable');\n\n  var table = document.createElement('TABLE');\n  (0, _element.addClass)(table, 'htCore');\n\n  if (instance.getSettings().tableClassName) {\n    (0, _element.addClass)(table, instance.getSettings().tableClassName);\n  }\n  this.THEAD = document.createElement('THEAD');\n  table.appendChild(this.THEAD);\n  this.TBODY = document.createElement('TBODY');\n  table.appendChild(this.TBODY);\n\n  instance.table = table;\n\n  instance.container.insertBefore(table, instance.container.firstChild);\n\n  this.eventManager.addEventListener(instance.rootElement, 'mousedown', function (event) {\n    this.selectionMouseDown = true;\n\n    if (!that.isTextSelectionAllowed(event.target)) {\n      clearTextSelection();\n      event.preventDefault();\n      window.focus(); // make sure that window that contains HOT is active. Important when HOT is in iframe.\n    }\n  });\n  this.eventManager.addEventListener(instance.rootElement, 'mouseup', function (event) {\n    this.selectionMouseDown = false;\n  });\n  this.eventManager.addEventListener(instance.rootElement, 'mousemove', function (event) {\n    if (this.selectionMouseDown && !that.isTextSelectionAllowed(event.target)) {\n      clearTextSelection();\n      event.preventDefault();\n    }\n  });\n\n  this.eventManager.addEventListener(document.documentElement, 'keyup', function (event) {\n    if (instance.selection.isInProgress() && !event.shiftKey) {\n      instance.selection.finish();\n    }\n  });\n\n  var isMouseDown;\n  this.isMouseDown = function () {\n    return isMouseDown;\n  };\n\n  this.eventManager.addEventListener(document.documentElement, 'mouseup', function (event) {\n    if (instance.selection.isInProgress() && (0, _event.isLeftClick)(event)) {\n      // is left mouse button\n      instance.selection.finish();\n    }\n\n    isMouseDown = false;\n\n    if ((0, _element.isOutsideInput)(document.activeElement) || !instance.selection.isSelected() && !(0, _event.isRightClick)(event)) {\n      instance.unlisten();\n    }\n  });\n\n  this.eventManager.addEventListener(document.documentElement, 'mousedown', function (event) {\n    var originalTarget = event.target;\n    var next = event.target;\n    var eventX = event.x || event.clientX;\n    var eventY = event.y || event.clientY;\n\n    if (isMouseDown || !instance.rootElement) {\n      return; // it must have been started in a cell\n    }\n\n    // immediate click on \"holder\" means click on the right side of vertical scrollbar\n    if (next === instance.view.wt.wtTable.holder) {\n      var scrollbarWidth = (0, _element.getScrollbarWidth)();\n\n      if (document.elementFromPoint(eventX + scrollbarWidth, eventY) !== instance.view.wt.wtTable.holder || document.elementFromPoint(eventX, eventY + scrollbarWidth) !== instance.view.wt.wtTable.holder) {\n        return;\n      }\n    } else {\n      while (next !== document.documentElement) {\n        if (next === null) {\n          if (event.isTargetWebComponent) {\n            break;\n          }\n          // click on something that was a row but now is detached (possibly because your click triggered a rerender)\n          return;\n        }\n        if (next === instance.rootElement) {\n          // click inside container\n          return;\n        }\n        next = next.parentNode;\n      }\n    }\n\n    // function did not return until here, we have an outside click!\n\n    var outsideClickDeselects = typeof that.settings.outsideClickDeselects === 'function' ? that.settings.outsideClickDeselects(originalTarget) : that.settings.outsideClickDeselects;\n\n    if (outsideClickDeselects) {\n      instance.deselectCell();\n    } else {\n      instance.destroyEditor();\n    }\n  });\n\n  this.eventManager.addEventListener(table, 'selectstart', function (event) {\n    if (that.settings.fragmentSelection || (0, _element.isInput)(event.target)) {\n      return;\n    }\n    // https://github.com/handsontable/handsontable/issues/160\n    // Prevent text from being selected when performing drag down.\n    event.preventDefault();\n  });\n\n  var clearTextSelection = function clearTextSelection() {\n    // http://stackoverflow.com/questions/3169786/clear-text-selection-with-javascript\n    if (window.getSelection) {\n      if (window.getSelection().empty) {\n        // Chrome\n        window.getSelection().empty();\n      } else if (window.getSelection().removeAllRanges) {\n        // Firefox\n        window.getSelection().removeAllRanges();\n      }\n    } else if (document.selection) {\n      // IE?\n      document.selection.empty();\n    }\n  };\n\n  var walkontableConfig = {\n    debug: function debug() {\n      return that.settings.debug;\n    },\n    externalRowCalculator: this.instance.getPlugin('autoRowSize') && this.instance.getPlugin('autoRowSize').isEnabled(),\n    table: table,\n    preventOverflow: function preventOverflow() {\n      return _this.settings.preventOverflow;\n    },\n    stretchH: function stretchH() {\n      return that.settings.stretchH;\n    },\n    data: instance.getDataAtCell,\n    totalRows: function totalRows() {\n      return instance.countRows();\n    },\n    totalColumns: function totalColumns() {\n      return instance.countCols();\n    },\n    fixedColumnsLeft: function fixedColumnsLeft() {\n      return that.settings.fixedColumnsLeft;\n    },\n    fixedRowsTop: function fixedRowsTop() {\n      return that.settings.fixedRowsTop;\n    },\n    fixedRowsBottom: function fixedRowsBottom() {\n      return that.settings.fixedRowsBottom;\n    },\n    minSpareRows: function minSpareRows() {\n      return that.settings.minSpareRows;\n    },\n    renderAllRows: that.settings.renderAllRows,\n    rowHeaders: function rowHeaders() {\n      var headerRenderers = [];\n\n      if (instance.hasRowHeaders()) {\n        headerRenderers.push(function (row, TH) {\n          that.appendRowHeader(row, TH);\n        });\n      }\n      instance.runHooks('afterGetRowHeaderRenderers', headerRenderers);\n\n      return headerRenderers;\n    },\n    columnHeaders: function columnHeaders() {\n      var headerRenderers = [];\n\n      if (instance.hasColHeaders()) {\n        headerRenderers.push(function (column, TH) {\n          that.appendColHeader(column, TH);\n        });\n      }\n\n      instance.runHooks('afterGetColumnHeaderRenderers', headerRenderers);\n\n      return headerRenderers;\n    },\n    columnWidth: instance.getColWidth,\n    rowHeight: instance.getRowHeight,\n    cellRenderer: function cellRenderer(row, col, TD) {\n      var cellProperties = that.instance.getCellMeta(row, col);\n      var prop = that.instance.colToProp(col);\n      var value = that.instance.getDataAtRowProp(row, prop);\n\n      if (that.instance.hasHook('beforeValueRender')) {\n        value = that.instance.runHooks('beforeValueRender', value, cellProperties);\n      }\n\n      that.instance.runHooks('beforeRenderer', TD, row, col, prop, value, cellProperties);\n      that.instance.getCellRenderer(cellProperties)(that.instance, TD, row, col, prop, value, cellProperties);\n      that.instance.runHooks('afterRenderer', TD, row, col, prop, value, cellProperties);\n    },\n    selections: that.instance.selection.highlight,\n    hideBorderOnMouseDownOver: function hideBorderOnMouseDownOver() {\n      return that.settings.fragmentSelection;\n    },\n    onCellMouseDown: function onCellMouseDown(event, coords, TD, wt) {\n      var blockCalculations = {\n        row: false,\n        column: false,\n        cell: false\n      };\n\n      instance.listen();\n\n      that.activeWt = wt;\n      isMouseDown = true;\n\n      instance.runHooks('beforeOnCellMouseDown', event, coords, TD, blockCalculations);\n\n      if ((0, _event.isImmediatePropagationStopped)(event)) {\n        return;\n      }\n\n      (0, _mouseEventHandler.handleMouseEvent)(event, {\n        coords: coords,\n        selection: instance.selection,\n        controller: blockCalculations\n      });\n\n      instance.runHooks('afterOnCellMouseDown', event, coords, TD);\n      that.activeWt = that.wt;\n    },\n    onCellMouseOut: function onCellMouseOut(event, coords, TD, wt) {\n      that.activeWt = wt;\n      instance.runHooks('beforeOnCellMouseOut', event, coords, TD);\n\n      if ((0, _event.isImmediatePropagationStopped)(event)) {\n        return;\n      }\n\n      instance.runHooks('afterOnCellMouseOut', event, coords, TD);\n      that.activeWt = that.wt;\n    },\n    onCellMouseOver: function onCellMouseOver(event, coords, TD, wt) {\n      var blockCalculations = {\n        row: false,\n        column: false,\n        cell: false\n      };\n\n      that.activeWt = wt;\n\n      instance.runHooks('beforeOnCellMouseOver', event, coords, TD, blockCalculations);\n\n      if ((0, _event.isImmediatePropagationStopped)(event)) {\n        return;\n      }\n\n      if (isMouseDown) {\n        (0, _mouseEventHandler.handleMouseEvent)(event, {\n          coords: coords,\n          selection: instance.selection,\n          controller: blockCalculations\n        });\n      }\n\n      instance.runHooks('afterOnCellMouseOver', event, coords, TD);\n      that.activeWt = that.wt;\n    },\n    onCellMouseUp: function onCellMouseUp(event, coords, TD, wt) {\n      that.activeWt = wt;\n      instance.runHooks('beforeOnCellMouseUp', event, coords, TD);\n\n      instance.runHooks('afterOnCellMouseUp', event, coords, TD);\n      that.activeWt = that.wt;\n    },\n    onCellCornerMouseDown: function onCellCornerMouseDown(event) {\n      event.preventDefault();\n      instance.runHooks('afterOnCellCornerMouseDown', event);\n    },\n    onCellCornerDblClick: function onCellCornerDblClick(event) {\n      event.preventDefault();\n      instance.runHooks('afterOnCellCornerDblClick', event);\n    },\n    beforeDraw: function beforeDraw(force, skipRender) {\n      that.beforeRender(force, skipRender);\n    },\n    onDraw: function onDraw(force) {\n      that.onDraw(force);\n    },\n    onScrollVertically: function onScrollVertically() {\n      instance.runHooks('afterScrollVertically');\n    },\n    onScrollHorizontally: function onScrollHorizontally() {\n      instance.runHooks('afterScrollHorizontally');\n    },\n    onBeforeRemoveCellClassNames: function onBeforeRemoveCellClassNames() {\n      return instance.runHooks('beforeRemoveCellClassNames');\n    },\n    onAfterDrawSelection: function onAfterDrawSelection(currentRow, currentColumn, cornersOfSelection, layerLevel) {\n      return instance.runHooks('afterDrawSelection', currentRow, currentColumn, cornersOfSelection, layerLevel);\n    },\n    onBeforeDrawBorders: function onBeforeDrawBorders(corners, borderClassName) {\n      instance.runHooks('beforeDrawBorders', corners, borderClassName);\n    },\n    onBeforeTouchScroll: function onBeforeTouchScroll() {\n      instance.runHooks('beforeTouchScroll');\n    },\n    onAfterMomentumScroll: function onAfterMomentumScroll() {\n      instance.runHooks('afterMomentumScroll');\n    },\n    onBeforeStretchingColumnWidth: function onBeforeStretchingColumnWidth(stretchedWidth, column) {\n      return instance.runHooks('beforeStretchingColumnWidth', stretchedWidth, column);\n    },\n    onModifyRowHeaderWidth: function onModifyRowHeaderWidth(rowHeaderWidth) {\n      return instance.runHooks('modifyRowHeaderWidth', rowHeaderWidth);\n    },\n    onModifyGetCellCoords: function onModifyGetCellCoords(row, column, topmost) {\n      return instance.runHooks('modifyGetCellCoords', row, column, topmost);\n    },\n    viewportRowCalculatorOverride: function viewportRowCalculatorOverride(calc) {\n      var rows = instance.countRows();\n      var viewportOffset = that.settings.viewportRowRenderingOffset;\n\n      if (viewportOffset === 'auto' && that.settings.fixedRowsTop) {\n        viewportOffset = 10;\n      }\n      if (typeof viewportOffset === 'number') {\n        calc.startRow = Math.max(calc.startRow - viewportOffset, 0);\n        calc.endRow = Math.min(calc.endRow + viewportOffset, rows - 1);\n      }\n      if (viewportOffset === 'auto') {\n        var center = calc.startRow + calc.endRow - calc.startRow;\n        var offset = Math.ceil(center / rows * 12);\n\n        calc.startRow = Math.max(calc.startRow - offset, 0);\n        calc.endRow = Math.min(calc.endRow + offset, rows - 1);\n      }\n      instance.runHooks('afterViewportRowCalculatorOverride', calc);\n    },\n    viewportColumnCalculatorOverride: function viewportColumnCalculatorOverride(calc) {\n      var cols = instance.countCols();\n      var viewportOffset = that.settings.viewportColumnRenderingOffset;\n\n      if (viewportOffset === 'auto' && that.settings.fixedColumnsLeft) {\n        viewportOffset = 10;\n      }\n      if (typeof viewportOffset === 'number') {\n        calc.startColumn = Math.max(calc.startColumn - viewportOffset, 0);\n        calc.endColumn = Math.min(calc.endColumn + viewportOffset, cols - 1);\n      }\n      if (viewportOffset === 'auto') {\n        var center = calc.startColumn + calc.endColumn - calc.startColumn;\n        var offset = Math.ceil(center / cols * 12);\n\n        calc.startRow = Math.max(calc.startColumn - offset, 0);\n        calc.endColumn = Math.min(calc.endColumn + offset, cols - 1);\n      }\n      instance.runHooks('afterViewportColumnCalculatorOverride', calc);\n    },\n    rowHeaderWidth: function rowHeaderWidth() {\n      return that.settings.rowHeaderWidth;\n    },\n    columnHeaderHeight: function columnHeaderHeight() {\n      var columnHeaderHeight = instance.runHooks('modifyColumnHeaderHeight');\n      return that.settings.columnHeaderHeight || columnHeaderHeight;\n    }\n  };\n\n  instance.runHooks('beforeInitWalkontable', walkontableConfig);\n\n  this.wt = new _src2.default(walkontableConfig);\n  this.activeWt = this.wt;\n\n  this.eventManager.addEventListener(that.wt.wtTable.spreader, 'mousedown', function (event) {\n    // right mouse button exactly on spreader means right click on the right hand side of vertical scrollbar\n    if (event.target === that.wt.wtTable.spreader && event.which === 3) {\n      (0, _event.stopPropagation)(event);\n    }\n  });\n\n  this.eventManager.addEventListener(that.wt.wtTable.spreader, 'contextmenu', function (event) {\n    // right mouse button exactly on spreader means right click on the right hand side of vertical scrollbar\n    if (event.target === that.wt.wtTable.spreader && event.which === 3) {\n      (0, _event.stopPropagation)(event);\n    }\n  });\n\n  this.eventManager.addEventListener(document.documentElement, 'click', function () {\n    if (that.settings.observeDOMVisibility) {\n      if (that.wt.drawInterrupted) {\n        that.instance.forceFullRender = true;\n        that.render();\n      }\n    }\n  });\n}\n\nTableView.prototype.isTextSelectionAllowed = function (el) {\n  if ((0, _element.isInput)(el)) {\n    return true;\n  }\n  var isChildOfTableBody = (0, _element.isChildOf)(el, this.instance.view.wt.wtTable.spreader);\n\n  if (this.settings.fragmentSelection === true && isChildOfTableBody) {\n    return true;\n  }\n  if (this.settings.fragmentSelection === 'cell' && this.isSelectedOnlyCell() && isChildOfTableBody) {\n    return true;\n  }\n  if (!this.settings.fragmentSelection && this.isCellEdited() && this.isSelectedOnlyCell()) {\n    return true;\n  }\n\n  return false;\n};\n\n/**\n * Check if selected only one cell.\n *\n * @returns {Boolean}\n */\nTableView.prototype.isSelectedOnlyCell = function () {\n  var _ref = this.instance.getSelectedLast() || [],\n      _ref2 = _slicedToArray(_ref, 4),\n      row = _ref2[0],\n      col = _ref2[1],\n      rowEnd = _ref2[2],\n      colEnd = _ref2[3];\n\n  return row !== void 0 && row === rowEnd && col === colEnd;\n};\n\nTableView.prototype.isCellEdited = function () {\n  var activeEditor = this.instance.getActiveEditor();\n\n  return activeEditor && activeEditor.isOpened();\n};\n\nTableView.prototype.beforeRender = function (force, skipRender) {\n  if (force) {\n    // this.instance.forceFullRender = did Handsontable request full render?\n    this.instance.runHooks('beforeRender', this.instance.forceFullRender, skipRender);\n  }\n};\n\nTableView.prototype.onDraw = function (force) {\n  if (force) {\n    // this.instance.forceFullRender = did Handsontable request full render?\n    this.instance.runHooks('afterRender', this.instance.forceFullRender);\n  }\n};\n\nTableView.prototype.render = function () {\n  this.wt.draw(!this.instance.forceFullRender);\n  this.instance.forceFullRender = false;\n  this.instance.renderCall = false;\n};\n\n/**\n * Returns td object given coordinates\n *\n * @param {CellCoords} coords\n * @param {Boolean} topmost\n */\nTableView.prototype.getCellAtCoords = function (coords, topmost) {\n  var td = this.wt.getCell(coords, topmost);\n\n  if (td < 0) {\n    // there was an exit code (cell is out of bounds)\n    return null;\n  }\n\n  return td;\n};\n\n/**\n * Scroll viewport to selection.\n *\n * @param {CellCoords} coords\n */\nTableView.prototype.scrollViewport = function (coords) {\n  this.wt.scrollViewport(coords);\n};\n\n/**\n * Append row header to a TH element\n * @param row\n * @param TH\n */\nTableView.prototype.appendRowHeader = function (row, TH) {\n  if (TH.firstChild) {\n    var container = TH.firstChild;\n\n    if (!(0, _element.hasClass)(container, 'relative')) {\n      (0, _element.empty)(TH);\n      this.appendRowHeader(row, TH);\n\n      return;\n    }\n    this.updateCellHeader(container.querySelector('.rowHeader'), row, this.instance.getRowHeader);\n  } else {\n    var div = document.createElement('div');\n    var span = document.createElement('span');\n\n    div.className = 'relative';\n    span.className = 'rowHeader';\n    this.updateCellHeader(span, row, this.instance.getRowHeader);\n\n    div.appendChild(span);\n    TH.appendChild(div);\n  }\n\n  this.instance.runHooks('afterGetRowHeader', row, TH);\n};\n\n/**\n * Append column header to a TH element\n * @param col\n * @param TH\n */\nTableView.prototype.appendColHeader = function (col, TH) {\n  if (TH.firstChild) {\n    var container = TH.firstChild;\n\n    if ((0, _element.hasClass)(container, 'relative')) {\n      this.updateCellHeader(container.querySelector('.colHeader'), col, this.instance.getColHeader);\n    } else {\n      (0, _element.empty)(TH);\n      this.appendColHeader(col, TH);\n    }\n  } else {\n    var div = document.createElement('div');\n    var span = document.createElement('span');\n\n    div.className = 'relative';\n    span.className = 'colHeader';\n    this.updateCellHeader(span, col, this.instance.getColHeader);\n\n    div.appendChild(span);\n    TH.appendChild(div);\n  }\n\n  this.instance.runHooks('afterGetColHeader', col, TH);\n};\n\n/**\n * Update header cell content\n *\n * @since 0.15.0-beta4\n * @param {HTMLElement} element Element to update\n * @param {Number} index Row index or column index\n * @param {Function} content Function which should be returns content for this cell\n */\nTableView.prototype.updateCellHeader = function (element, index, content) {\n  var renderedIndex = index;\n  var parentOverlay = this.wt.wtOverlays.getParentOverlay(element) || this.wt;\n\n  // prevent wrong calculations from SampleGenerator\n  if (element.parentNode) {\n    if ((0, _element.hasClass)(element, 'colHeader')) {\n      renderedIndex = parentOverlay.wtTable.columnFilter.sourceToRendered(index);\n    } else if ((0, _element.hasClass)(element, 'rowHeader')) {\n      renderedIndex = parentOverlay.wtTable.rowFilter.sourceToRendered(index);\n    }\n  }\n\n  if (renderedIndex > -1) {\n    (0, _element.fastInnerHTML)(element, content(index));\n  } else {\n    // workaround for https://github.com/handsontable/handsontable/issues/1946\n    (0, _element.fastInnerText)(element, String.fromCharCode(160));\n    (0, _element.addClass)(element, 'cornerHeader');\n  }\n};\n\n/**\n * Given a element's left position relative to the viewport, returns maximum element width until the right\n * edge of the viewport (before scrollbar)\n *\n * @param {Number} leftOffset\n * @return {Number}\n */\nTableView.prototype.maximumVisibleElementWidth = function (leftOffset) {\n  var workspaceWidth = this.wt.wtViewport.getWorkspaceWidth();\n  var maxWidth = workspaceWidth - leftOffset;\n  return maxWidth > 0 ? maxWidth : 0;\n};\n\n/**\n * Given a element's top position relative to the viewport, returns maximum element height until the bottom\n * edge of the viewport (before scrollbar)\n *\n * @param {Number} topOffset\n * @return {Number}\n */\nTableView.prototype.maximumVisibleElementHeight = function (topOffset) {\n  var workspaceHeight = this.wt.wtViewport.getWorkspaceHeight();\n  var maxHeight = workspaceHeight - topOffset;\n  return maxHeight > 0 ? maxHeight : 0;\n};\n\nTableView.prototype.mainViewIsActive = function () {\n  return this.wt === this.activeWt;\n};\n\nTableView.prototype.destroy = function () {\n  this.wt.destroy();\n  this.eventManager.destroy();\n};\n\nexports.default = TableView;\n\n/***/ }),\n/* 268 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class DataSource\n * @private\n */\nvar DataSource = function () {\n  function DataSource(hotInstance) {\n    var dataSource = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\n    _classCallCheck(this, DataSource);\n\n    /**\n     * Instance of Handsontable.\n     *\n     * @type {Handsontable}\n     */\n    this.hot = hotInstance;\n    /**\n     * Data source\n     *\n     * @type {Array}\n     */\n    this.data = dataSource;\n    /**\n     * Type of data source.\n     *\n     * @type {String}\n     * @default 'array'\n     */\n    this.dataType = 'array';\n\n    this.colToProp = function () {};\n    this.propToCol = function () {};\n  }\n\n  /**\n   * Get all data.\n   *\n   * @param {Boolean} [toArray=false] If `true` return source data as an array of arrays even when source data was provided\n   *                                  in another format.\n   * @returns {Array}\n   */\n\n\n  _createClass(DataSource, [{\n    key: 'getData',\n    value: function getData() {\n      var toArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      var result = this.data;\n\n      if (toArray) {\n        result = this.getByRange({ row: 0, col: 0 }, { row: Math.max(this.countRows() - 1, 0), col: Math.max(this.countColumns() - 1, 0) }, true);\n      }\n\n      return result;\n    }\n\n    /**\n     * Set new data source.\n     *\n     * @param data {Array}\n     */\n\n  }, {\n    key: 'setData',\n    value: function setData(data) {\n      this.data = data;\n    }\n\n    /**\n     * Returns array of column values from the data source. `column` is the index of the row in the data source.\n     *\n     * @param {Number} column Visual column index.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getAtColumn',\n    value: function getAtColumn(column) {\n      var _this = this;\n\n      var result = [];\n\n      (0, _array.arrayEach)(this.data, function (row) {\n        var property = _this.colToProp(column);\n\n        if (typeof property === 'string') {\n          row = (0, _object.getProperty)(row, property);\n        } else {\n          row = row[property];\n        }\n        result.push(row);\n      });\n\n      return result;\n    }\n\n    /**\n     * Returns a single row of the data (array or object, depending on what you have). `row` is the index of the row in the data source.\n     *\n     * @param {Number} row Physical row index.\n     * @returns {Array|Object}\n     */\n\n  }, {\n    key: 'getAtRow',\n    value: function getAtRow(row) {\n      return this.data[row];\n    }\n\n    /**\n     * Returns a single value from the data.\n     *\n     * @param {Number} row Physical row index.\n     * @param {Number} column Visual column index.\n     * @returns {*}\n     */\n\n  }, {\n    key: 'getAtCell',\n    value: function getAtCell(row, column) {\n      var result = null;\n\n      var modifyRowData = this.hot.runHooks('modifyRowData', row);\n\n      var dataRow = isNaN(modifyRowData) ? modifyRowData : this.data[row];\n\n      if (dataRow) {\n        var prop = this.colToProp(column);\n\n        if (typeof prop === 'string') {\n          result = (0, _object.getProperty)(dataRow, prop);\n        } else if (typeof prop === 'function') {\n          result = prop(this.data.slice(row, row + 1)[0]);\n        } else {\n          result = dataRow[prop];\n        }\n      }\n\n      return result;\n    }\n\n    /**\n     * Returns source data by passed range.\n     *\n     * @param {Object} start Object with physical `row` and `col` keys (or visual column index, if data type is an array of objects).\n     * @param {Object} end Object with physical `row` and `col` keys (or visual column index, if data type is an array of objects).\n     * @param {Boolean} [toArray=false] If `true` return source data as an array of arrays even when source data was provided\n     *                                  in another format.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getByRange',\n    value: function getByRange(start, end) {\n      var _this2 = this;\n\n      var toArray = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      var startRow = Math.min(start.row, end.row);\n      var startCol = Math.min(start.col, end.col);\n      var endRow = Math.max(start.row, end.row);\n      var endCol = Math.max(start.col, end.col);\n      var result = [];\n\n      (0, _number.rangeEach)(startRow, endRow, function (currentRow) {\n        var row = _this2.getAtRow(currentRow);\n        var newRow = void 0;\n\n        if (_this2.dataType === 'array') {\n          newRow = row.slice(startCol, endCol + 1);\n        } else if (_this2.dataType === 'object') {\n          newRow = toArray ? [] : {};\n\n          (0, _number.rangeEach)(startCol, endCol, function (column) {\n            var prop = _this2.colToProp(column);\n\n            if (toArray) {\n              newRow.push(row[prop]);\n            } else {\n              newRow[prop] = row[prop];\n            }\n          });\n        }\n\n        result.push(newRow);\n      });\n\n      return result;\n    }\n\n    /**\n     * Count number of rows.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'countRows',\n    value: function countRows() {\n      return Array.isArray(this.data) ? this.data.length : 0;\n    }\n\n    /**\n     * Count number of columns.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'countColumns',\n    value: function countColumns() {\n      var result = 0;\n\n      if (Array.isArray(this.data)) {\n        if (this.dataType === 'array') {\n          result = this.data[0].length;\n        } else if (this.dataType === 'object') {\n          result = Object.keys(this.data[0]).length;\n        }\n      }\n\n      return result;\n    }\n\n    /**\n     * Destroy instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.data = null;\n      this.hot = null;\n    }\n  }]);\n\n  return DataSource;\n}();\n\nexports.default = DataSource;\n\n/***/ }),\n/* 269 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 15, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for English - United States language-country.\n                                                                                                                                                                                                                   */\n\n\nvar dictionary = (_dictionary = {\n  languageCode: 'en-US'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Insert row above'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Insert row below'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Insert column left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Insert column right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Remove row', 'Remove rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Remove column', 'Remove columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Undo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Redo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Read only'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Clear column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alignment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Center'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justify'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Middle'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Freeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Unfreeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Borders'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Remove border(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Add comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edit comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Delete comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Read-only comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Merge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Unmerge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copy'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Cut'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Insert child row'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Detach from parent'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Hide column', 'Hide columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Show column', 'Show columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Hide row', 'Hide rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Show row', 'Show rows']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'None'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Is empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Is not empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Is equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Is not equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Begins with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Ends with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contains'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Does not contain'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Greater than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Greater than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Less than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Less than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Is between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Is not between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'After'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Before'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Today'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Tomorrow'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Yesterday'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Blank cells'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filter by condition'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filter by value'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'And'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Or'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Select all'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Clear'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancel'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Search'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Value'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Second value'), _dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 270 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getPhraseFormatters = exports.registerPhraseFormatter = undefined;\nexports.register = register;\nexports.getAll = getAll;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _pluralize = __webpack_require__(271);\n\nvar _pluralize2 = _interopRequireDefault(_pluralize);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _staticRegister = (0, _staticRegister3.default)('phraseFormatters'),\n    registerGloballyPhraseFormatter = _staticRegister.register,\n    getGlobalPhraseFormatters = _staticRegister.getValues;\n\n/**\n * Register phrase formatter.\n *\n * @param {String} name Name of formatter.\n * @param {Function} formatterFn Function which will be applied on phrase propositions. It will transform them if it's possible.\n */\n\n\nfunction register(name, formatterFn) {\n  registerGloballyPhraseFormatter(name, formatterFn);\n}\n\n/**\n * Get all registered previously formatters.\n *\n * @returns {Array}\n */\nfunction getAll() {\n  return getGlobalPhraseFormatters();\n}\n\nexports.registerPhraseFormatter = register;\nexports.getPhraseFormatters = getAll;\n\n\nregister('pluralize', _pluralize2.default);\n\n/***/ }),\n/* 271 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = pluralize;\n/**\n * Try to choose plural form from available phrase propositions.\n *\n * @param {Array} phrasePropositions List of phrases propositions.\n * @param {number} pluralForm Number determining which phrase form should be used.\n *\n * @returns {String|Array} One particular phrase if it's possible, list of unchanged phrase propositions otherwise.\n */\nfunction pluralize(phrasePropositions, pluralForm) {\n  var isPluralizable = Array.isArray(phrasePropositions) && Number.isInteger(pluralForm);\n\n  if (isPluralizable) {\n    return phrasePropositions[pluralForm];\n  }\n\n  return phrasePropositions;\n};\n\n/***/ }),\n/* 272 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.Selection = exports.Highlight = exports.handleMouseEvent = undefined;\n\nvar _highlight = __webpack_require__(199);\n\nvar _highlight2 = _interopRequireDefault(_highlight);\n\nvar _selection = __webpack_require__(279);\n\nvar _selection2 = _interopRequireDefault(_selection);\n\nvar _mouseEventHandler = __webpack_require__(192);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.handleMouseEvent = _mouseEventHandler.handleMouseEvent;\nexports.Highlight = _highlight2.default;\nexports.Selection = _selection2.default;\n\n/***/ }),\n/* 273 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.createHighlight = undefined;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _activeHeader = __webpack_require__(274);\n\nvar _activeHeader2 = _interopRequireDefault(_activeHeader);\n\nvar _area = __webpack_require__(275);\n\nvar _area2 = _interopRequireDefault(_area);\n\nvar _cell = __webpack_require__(276);\n\nvar _cell2 = _interopRequireDefault(_cell);\n\nvar _fill = __webpack_require__(277);\n\nvar _fill2 = _interopRequireDefault(_fill);\n\nvar _header = __webpack_require__(278);\n\nvar _header2 = _interopRequireDefault(_header);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint-disable import/prefer-default-export */\nvar _staticRegister = (0, _staticRegister3.default)('highlight/types'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem;\n\nregister('active-header', _activeHeader2.default);\nregister('area', _area2.default);\nregister('cell', _cell2.default);\nregister('fill', _fill2.default);\nregister('header', _header2.default);\n\nfunction createHighlight(highlightType, options) {\n  return getItem(highlightType)(options);\n}\n\nexports.createHighlight = createHighlight;\n\n/***/ }),\n/* 274 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * @return {Selection}\n */\nfunction createHighlight(_ref) {\n  var activeHeaderClassName = _ref.activeHeaderClassName;\n\n  var s = new _src.Selection({\n    highlightHeaderClassName: activeHeaderClassName\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 275 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * Creates the new instance of Selection responsible for highlighting area of the selected multiple cells.\n *\n * @return {Selection}\n */\nfunction createHighlight(_ref) {\n  var layerLevel = _ref.layerLevel,\n      areaCornerVisible = _ref.areaCornerVisible;\n\n  var s = new _src.Selection({\n    className: 'area',\n    markIntersections: true,\n    layerLevel: Math.min(layerLevel, 7),\n    border: {\n      width: 1,\n      color: '#4b89ff',\n      cornerVisible: areaCornerVisible\n    }\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 276 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * Creates the new instance of Selection responsible for highlighting currently selected cell. This type of selection\n * can present on the table only one at the time.\n *\n * @return {Selection}\n */\nfunction createHighlight(_ref) {\n  var cellCornerVisible = _ref.cellCornerVisible;\n\n  var s = new _src.Selection({\n    className: 'current',\n    border: {\n      width: 2,\n      color: '#4b89ff',\n      cornerVisible: cellCornerVisible\n    }\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 277 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * Creates the new instance of Selection, responsible for highlighting cells which are covered by fill handle\n * functionality. This type of selection can present on the table only one at the time.\n *\n * @return {Selection}\n */\nfunction createHighlight() {\n  var s = new _src.Selection({\n    className: 'fill',\n    border: {\n      width: 1,\n      color: '#ff0000'\n    }\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 278 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * Creates the new instance of Selection, responsible for highlighting row and column headers. This type of selection\n * can occur multiple times.\n *\n * @return {Selection}\n */\nfunction createHighlight(_ref) {\n  var headerClassName = _ref.headerClassName,\n      rowClassName = _ref.rowClassName,\n      columnClassName = _ref.columnClassName;\n\n  var s = new _src.Selection({\n    className: 'highlight',\n    highlightHeaderClassName: headerClassName,\n    highlightRowClassName: rowClassName,\n    highlightColumnClassName: columnClassName\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 279 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['Unsupported format of the selection ranges was passed. To select cells pass \\n        the coordinates as an array of arrays ([[rowStart, columnStart/columnPropStart, rowEnd, columnEnd/columnPropEnd]]) \\n        or as an array of CellRange objects.'], ['Unsupported format of the selection ranges was passed. To select cells pass\\\\x20\\n        the coordinates as an array of arrays ([[rowStart, columnStart/columnPropStart, rowEnd, columnEnd/columnPropEnd]])\\\\x20\\n        or as an array of CellRange objects.']);\n\nvar _highlight = __webpack_require__(199);\n\nvar _highlight2 = _interopRequireDefault(_highlight);\n\nvar _range = __webpack_require__(280);\n\nvar _range2 = _interopRequireDefault(_range);\n\nvar _src = __webpack_require__(4);\n\nvar _keyStateObserver = __webpack_require__(198);\n\nvar _object = __webpack_require__(2);\n\nvar _mixed = __webpack_require__(16);\n\nvar _array = __webpack_require__(1);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nvar _transformation = __webpack_require__(281);\n\nvar _transformation2 = _interopRequireDefault(_transformation);\n\nvar _utils = __webpack_require__(91);\n\nvar _templateLiteralTag = __webpack_require__(41);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Selection\n * @util\n */\nvar Selection = function () {\n  function Selection(settings, tableProps) {\n    var _this = this;\n\n    _classCallCheck(this, Selection);\n\n    /**\n     * Handsontable settings instance.\n     *\n     * @type {GridSettings}\n     */\n    this.settings = settings;\n    /**\n     * An additional object with dynamically defined properties which describes table state.\n     *\n     * @type {Object}\n     */\n    this.tableProps = tableProps;\n    /**\n     * The flag which determines if the selection is in progress.\n     *\n     * @type {Boolean}\n     */\n    this.inProgress = false;\n    /**\n     * The flag indicates that selection was performed by clicking the corner overlay.\n     *\n     * @type {Boolean}\n     */\n    this.selectedByCorner = false;\n    /**\n     * The collection of the selection layer levels where the whole row was selected using the row header.\n     *\n     * @type {Set.<Number>}\n     */\n    this.selectedByRowHeader = new Set();\n    /**\n     * The collection of the selection layer levels where the whole column was selected using the column header.\n     *\n     * @type {Set.<Number>}\n     */\n    this.selectedByColumnHeader = new Set();\n    /**\n     * Selection data layer.\n     *\n     * @type {SelectionRange}\n     */\n    this.selectedRange = new _range2.default();\n    /**\n     * Visualization layer.\n     *\n     * @type {Highlight}\n     */\n    this.highlight = new _highlight2.default({\n      headerClassName: settings.currentHeaderClassName,\n      activeHeaderClassName: settings.activeHeaderClassName,\n      rowClassName: settings.currentRowClassName,\n      columnClassName: settings.currentColClassName,\n      disableHighlight: this.settings.disableVisualSelection,\n      cellCornerVisible: function cellCornerVisible() {\n        return _this.isCellCornerVisible.apply(_this, arguments);\n      },\n      areaCornerVisible: function areaCornerVisible() {\n        return _this.isAreaCornerVisible.apply(_this, arguments);\n      }\n    });\n    /**\n     * The module for modifying coordinates.\n     *\n     * @type {Transformation}\n     */\n    this.transformation = new _transformation2.default(this.selectedRange, {\n      countRows: function countRows() {\n        return _this.tableProps.countRows();\n      },\n      countCols: function countCols() {\n        return _this.tableProps.countCols();\n      },\n      fixedRowsBottom: function fixedRowsBottom() {\n        return settings.fixedRowsBottom;\n      },\n      minSpareRows: function minSpareRows() {\n        return settings.minSpareRows;\n      },\n      minSpareCols: function minSpareCols() {\n        return settings.minSpareCols;\n      },\n      autoWrapRow: function autoWrapRow() {\n        return settings.autoWrapRow;\n      },\n      autoWrapCol: function autoWrapCol() {\n        return settings.autoWrapCol;\n      }\n    });\n\n    this.transformation.addLocalHook('beforeTransformStart', function () {\n      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['beforeModifyTransformStart'].concat(args));\n    });\n    this.transformation.addLocalHook('afterTransformStart', function () {\n      for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['afterModifyTransformStart'].concat(args));\n    });\n    this.transformation.addLocalHook('beforeTransformEnd', function () {\n      for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['beforeModifyTransformEnd'].concat(args));\n    });\n    this.transformation.addLocalHook('afterTransformEnd', function () {\n      for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        args[_key4] = arguments[_key4];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['afterModifyTransformEnd'].concat(args));\n    });\n    this.transformation.addLocalHook('insertRowRequire', function () {\n      for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n        args[_key5] = arguments[_key5];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['insertRowRequire'].concat(args));\n    });\n    this.transformation.addLocalHook('insertColRequire', function () {\n      for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n        args[_key6] = arguments[_key6];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['insertColRequire'].concat(args));\n    });\n  }\n\n  /**\n   * Get data layer for current selection.\n   *\n   * @return {SelectionRange}\n   */\n\n\n  _createClass(Selection, [{\n    key: 'getSelectedRange',\n    value: function getSelectedRange() {\n      return this.selectedRange;\n    }\n\n    /**\n     * Indicate that selection process began. It sets internaly `.inProgress` property to `true`.\n     */\n\n  }, {\n    key: 'begin',\n    value: function begin() {\n      this.inProgress = true;\n    }\n\n    /**\n     * Indicate that selection process finished. It sets internaly `.inProgress` property to `false`.\n     */\n\n  }, {\n    key: 'finish',\n    value: function finish() {\n      this.runLocalHooks('afterSelectionFinished', Array.from(this.selectedRange));\n      this.inProgress = false;\n    }\n\n    /**\n     * Check if the process of selecting the cell/cells is in progress.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isInProgress',\n    value: function isInProgress() {\n      return this.inProgress;\n    }\n\n    /**\n     * Starts selection range on given coordinate object.\n     *\n     * @param {CellCoords} coords Visual coords.\n     * @param {Boolean} [multipleSelection] If `true`, selection will be worked in 'multiple' mode. This option works\n     *                                      only when 'selectionMode' is set as 'multiple'. If the argument is not defined\n     *                                      the default trigger will be used (isPressedCtrlKey() helper).\n     * @param {Boolean} [fragment=false] If `true`, the selection will be treated as a partial selection where the\n     *                                   `setRangeEnd` method won't be called on every `setRangeStart` call.\n     */\n\n  }, {\n    key: 'setRangeStart',\n    value: function setRangeStart(coords, multipleSelection) {\n      var fragment = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      var isMultipleMode = this.settings.selectionMode === 'multiple';\n      var isMultipleSelection = (0, _mixed.isUndefined)(multipleSelection) ? (0, _keyStateObserver.isPressedCtrlKey)() : multipleSelection;\n      var isRowNegative = coords.row < 0;\n      var isColumnNegative = coords.col < 0;\n      var selectedByCorner = isRowNegative && isColumnNegative;\n\n      if (isRowNegative) {\n        coords.row = 0;\n      }\n      if (isColumnNegative) {\n        coords.col = 0;\n      }\n\n      this.selectedByCorner = selectedByCorner;\n      this.runLocalHooks('beforeSetRangeStart' + (fragment ? 'Only' : ''), coords);\n\n      if (!isMultipleMode || isMultipleMode && !isMultipleSelection && (0, _mixed.isUndefined)(multipleSelection)) {\n        this.selectedRange.clear();\n      }\n\n      this.selectedRange.add(coords);\n\n      if (this.getLayerLevel() === 0) {\n        this.selectedByRowHeader.clear();\n        this.selectedByColumnHeader.clear();\n      }\n\n      if (!selectedByCorner && isColumnNegative) {\n        this.selectedByRowHeader.add(this.getLayerLevel());\n      }\n      if (!selectedByCorner && isRowNegative) {\n        this.selectedByColumnHeader.add(this.getLayerLevel());\n      }\n\n      if (!fragment) {\n        this.setRangeEnd(coords);\n      }\n    }\n\n    /**\n     * Starts selection range on given coordinate object.\n     *\n     * @param {CellCoords} coords Visual coords.\n     * @param {Boolean} [multipleSelection] If `true`, selection will be worked in 'multiple' mode. This option works\n     *                                      only when 'selectionMode' is set as 'multiple'. If the argument is not defined\n     *                                      the default trigger will be used (isPressedCtrlKey() helper).\n     */\n\n  }, {\n    key: 'setRangeStartOnly',\n    value: function setRangeStartOnly(coords, multipleSelection) {\n      this.setRangeStart(coords, multipleSelection, true);\n    }\n\n    /**\n     * Ends selection range on given coordinate object.\n     *\n     * @param {CellCoords} coords Visual coords.\n     */\n\n  }, {\n    key: 'setRangeEnd',\n    value: function setRangeEnd(coords) {\n      if (this.selectedRange.isEmpty()) {\n        return;\n      }\n\n      this.runLocalHooks('beforeSetRangeEnd', coords);\n      this.begin();\n\n      var cellRange = this.selectedRange.current();\n\n      if (this.settings.selectionMode !== 'single') {\n        cellRange.setTo(new _src.CellCoords(coords.row, coords.col));\n      }\n\n      // Set up current selection.\n      this.highlight.getCell().clear();\n\n      if (this.highlight.isEnabledFor(_highlight.CELL_TYPE)) {\n        this.highlight.getCell().add(this.selectedRange.current().highlight);\n      }\n\n      var layerLevel = this.getLayerLevel();\n\n      // If the next layer level is lower than previous then clear all area and header highlights. This is the\n      // indication that the new selection is performing.\n      if (layerLevel < this.highlight.layerLevel) {\n        (0, _array.arrayEach)(this.highlight.getAreas(), function (highlight) {\n          return void highlight.clear();\n        });\n        (0, _array.arrayEach)(this.highlight.getHeaders(), function (highlight) {\n          return void highlight.clear();\n        });\n        (0, _array.arrayEach)(this.highlight.getActiveHeaders(), function (highlight) {\n          return void highlight.clear();\n        });\n      }\n\n      this.highlight.useLayerLevel(layerLevel);\n\n      var areaHighlight = this.highlight.createOrGetArea();\n      var headerHighlight = this.highlight.createOrGetHeader();\n      var activeHeaderHighlight = this.highlight.createOrGetActiveHeader();\n\n      areaHighlight.clear();\n      headerHighlight.clear();\n      activeHeaderHighlight.clear();\n\n      if (this.highlight.isEnabledFor(_highlight.AREA_TYPE) && (this.isMultiple() || layerLevel >= 1)) {\n        areaHighlight.add(cellRange.from).add(cellRange.to);\n\n        if (layerLevel === 1) {\n          // For single cell selection in the same layer, we do not create area selection to prevent blue background.\n          // When non-consecutive selection is performed we have to add that missing area selection to the previous layer\n          // based on previous coordinates. It only occurs when the previous selection wasn't select multiple cells.\n          this.highlight.useLayerLevel(layerLevel - 1).createOrGetArea().add(this.selectedRange.previous().from);\n\n          this.highlight.useLayerLevel(layerLevel);\n        }\n      }\n\n      if (this.highlight.isEnabledFor(_highlight.HEADER_TYPE)) {\n        if (this.settings.selectionMode === 'single') {\n          headerHighlight.add(cellRange.highlight);\n        } else {\n          headerHighlight.add(cellRange.from).add(cellRange.to);\n        }\n      }\n\n      if (this.isSelectedByRowHeader()) {\n        var isRowSelected = this.tableProps.countCols() === cellRange.getWidth();\n\n        // Make sure that the whole row is selected (in case where selectionMode is set to 'single')\n        if (isRowSelected) {\n          activeHeaderHighlight.add(new _src.CellCoords(cellRange.from.row, -1)).add(new _src.CellCoords(cellRange.to.row, -1));\n        }\n      }\n\n      if (this.isSelectedByColumnHeader()) {\n        var isColumnSelected = this.tableProps.countRows() === cellRange.getHeight();\n\n        // Make sure that the whole column is selected (in case where selectionMode is set to 'single')\n        if (isColumnSelected) {\n          activeHeaderHighlight.add(new _src.CellCoords(-1, cellRange.from.col)).add(new _src.CellCoords(-1, cellRange.to.col));\n        }\n      }\n\n      this.runLocalHooks('afterSetRangeEnd', coords);\n    }\n\n    /**\n     * Returns information if we have a multiselection. This method check multiselection only on the latest layer of\n     * the selection.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isMultiple',\n    value: function isMultiple() {\n      var isMultipleListener = (0, _object.createObjectPropListener)(!this.selectedRange.current().isSingle());\n\n      this.runLocalHooks('afterIsMultipleSelection', isMultipleListener);\n\n      return isMultipleListener.value;\n    }\n\n    /**\n     * Selects cell relative to the current cell (if possible).\n     *\n     * @param {Number} rowDelta Rows number to move, value can be passed as negative number.\n     * @param {Number} colDelta Columns number to move, value can be passed as negative number.\n     * @param {Boolean} force If `true` the new rows/columns will be created if necessary. Otherwise, row/column will\n     *                        be created according to `minSpareRows/minSpareCols` settings of Handsontable.\n     */\n\n  }, {\n    key: 'transformStart',\n    value: function transformStart(rowDelta, colDelta, force) {\n      this.setRangeStart(this.transformation.transformStart(rowDelta, colDelta, force));\n    }\n\n    /**\n     * Sets selection end cell relative to the current selection end cell (if possible).\n     *\n     * @param {Number} rowDelta Rows number to move, value can be passed as negative number.\n     * @param {Number} colDelta Columns number to move, value can be passed as negative number.\n     */\n\n  }, {\n    key: 'transformEnd',\n    value: function transformEnd(rowDelta, colDelta) {\n      this.setRangeEnd(this.transformation.transformEnd(rowDelta, colDelta));\n    }\n\n    /**\n     * Returns currently used layer level.\n     *\n     * @return {Number} Returns layer level starting from 0. If no selection was added to the table -1 is returned.\n     */\n\n  }, {\n    key: 'getLayerLevel',\n    value: function getLayerLevel() {\n      return this.selectedRange.size() - 1;\n    }\n\n    /**\n     * Returns `true` if currently there is a selection on the screen, `false` otherwise.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSelected',\n    value: function isSelected() {\n      return !this.selectedRange.isEmpty();\n    }\n\n    /**\n     * Returns `true` if the selection was applied by clicking to the row header. If the `layerLevel`\n     * argument is passed then only that layer will be checked. Otherwise, it checks if any row header\n     * was clicked on any selection layer level.\n     *\n     * @param {Number} [layerLevel=this.getLayerLevel()] Selection layer level to check.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSelectedByRowHeader',\n    value: function isSelectedByRowHeader() {\n      var layerLevel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getLayerLevel();\n\n      return layerLevel === -1 ? this.selectedByRowHeader.size > 0 : this.selectedByRowHeader.has(layerLevel);\n    }\n\n    /**\n     * Returns `true` if the selection was applied by clicking to the column header. If the `layerLevel`\n     * argument is passed then only that layer will be checked. Otherwise, it checks if any column header\n     * was clicked on any selection layer level.\n     *\n     * @param {Number} [layerLevel=this.getLayerLevel()] Selection layer level to check.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSelectedByColumnHeader',\n    value: function isSelectedByColumnHeader() {\n      var layerLevel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getLayerLevel();\n\n      return layerLevel === -1 ? this.selectedByColumnHeader.size > 0 : this.selectedByColumnHeader.has(layerLevel);\n    }\n\n    /**\n     * Returns `true` if the selection was applied by clicking on the row or column header on any layer level.\n     *\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSelectedByAnyHeader',\n    value: function isSelectedByAnyHeader() {\n      return this.isSelectedByRowHeader(-1) || this.isSelectedByColumnHeader(-1);\n    }\n\n    /**\n     * Returns `true` if the selection was applied by clicking on the left-top corner overlay.\n     *\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSelectedByCorner',\n    value: function isSelectedByCorner() {\n      return this.selectedByCorner;\n    }\n\n    /**\n     * Returns `true` if coords is within selection coords. This method iterates through all selection layers to check if\n     * the coords object is within selection range.\n     *\n     * @param {CellCoords} coords The CellCoords instance with defined visual coordinates.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'inInSelection',\n    value: function inInSelection(coords) {\n      return this.selectedRange.includes(coords);\n    }\n\n    /**\n     * Returns `true` if the cell corner should be visible.\n     *\n     * @private\n     * @return {Boolean} `true` if the corner element has to be visible, `false` otherwise.\n     */\n\n  }, {\n    key: 'isCellCornerVisible',\n    value: function isCellCornerVisible() {\n      return this.settings.fillHandle && !this.tableProps.isEditorOpened() && !this.isMultiple();\n    }\n\n    /**\n     * Returns `true` if the area corner should be visible.\n     *\n     * @param {Number} layerLevel The layer level.\n     * @return {Boolean} `true` if the corner element has to be visible, `false` otherwise.\n     */\n\n  }, {\n    key: 'isAreaCornerVisible',\n    value: function isAreaCornerVisible(layerLevel) {\n      if (Number.isInteger(layerLevel) && layerLevel !== this.getLayerLevel()) {\n        return false;\n      }\n\n      return this.settings.fillHandle && !this.tableProps.isEditorOpened() && this.isMultiple();\n    }\n\n    /**\n     * Clear the selection by resetting the collected ranges and highlights.\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.selectedRange.clear();\n      this.highlight.clear();\n    }\n\n    /**\n     * Deselects all selected cells.\n     */\n\n  }, {\n    key: 'deselect',\n    value: function deselect() {\n      if (!this.isSelected()) {\n        return;\n      }\n\n      this.inProgress = false;\n      this.clear();\n      this.runLocalHooks('afterDeselect');\n    }\n\n    /**\n     * Select all cells.\n     */\n\n  }, {\n    key: 'selectAll',\n    value: function selectAll() {\n      this.clear();\n      this.setRangeStart(new _src.CellCoords(-1, -1));\n      this.selectedByRowHeader.add(this.getLayerLevel());\n      this.selectedByColumnHeader.add(this.getLayerLevel());\n      this.setRangeEnd(new _src.CellCoords(this.tableProps.countRows() - 1, this.tableProps.countCols() - 1));\n    }\n\n    /**\n     * Make multiple, non-contiguous selection specified by `row` and `column` values or a range of cells\n     * finishing at `endRow`, `endColumn`. The method supports two input formats, first as an array of arrays such\n     * as `[[rowStart, columnStart, rowEnd, columnEnd]]` and second format as an array of CellRange objects.\n     * If the passed ranges have another format the exception will be thrown.\n     *\n     * @param {Array[]|CellRange[]} selectionRanges The coordinates which define what the cells should be selected.\n     * @return {Boolean} Returns `true` if selection was successful, `false` otherwise.\n     */\n\n  }, {\n    key: 'selectCells',\n    value: function selectCells(selectionRanges) {\n      var _this2 = this;\n\n      var selectionType = (0, _utils.detectSelectionType)(selectionRanges);\n\n      if (selectionType === _utils.SELECTION_TYPE_EMPTY) {\n        return false;\n      } else if (selectionType === _utils.SELECTION_TYPE_UNRECOGNIZED) {\n        throw new Error((0, _templateLiteralTag.toSingleLine)(_templateObject));\n      }\n\n      var selectionSchemaNormalizer = (0, _utils.normalizeSelectionFactory)(selectionType, {\n        propToCol: function propToCol(prop) {\n          return _this2.tableProps.propToCol(prop);\n        },\n        keepDirection: true\n      });\n      var countRows = this.tableProps.countRows();\n      var countCols = this.tableProps.countCols();\n\n      // Check if every layer of the coordinates are valid.\n      var isValid = !selectionRanges.some(function (selection) {\n        var _selectionSchemaNorma = selectionSchemaNormalizer(selection),\n            _selectionSchemaNorma2 = _slicedToArray(_selectionSchemaNorma, 4),\n            rowStart = _selectionSchemaNorma2[0],\n            columnStart = _selectionSchemaNorma2[1],\n            rowEnd = _selectionSchemaNorma2[2],\n            columnEnd = _selectionSchemaNorma2[3];\n\n        var _isValid = (0, _utils.isValidCoord)(rowStart, countRows) && (0, _utils.isValidCoord)(columnStart, countCols) && (0, _utils.isValidCoord)(rowEnd, countRows) && (0, _utils.isValidCoord)(columnEnd, countCols);\n\n        return !_isValid;\n      });\n\n      if (isValid) {\n        this.clear();\n\n        (0, _array.arrayEach)(selectionRanges, function (selection) {\n          var _selectionSchemaNorma3 = selectionSchemaNormalizer(selection),\n              _selectionSchemaNorma4 = _slicedToArray(_selectionSchemaNorma3, 4),\n              rowStart = _selectionSchemaNorma4[0],\n              columnStart = _selectionSchemaNorma4[1],\n              rowEnd = _selectionSchemaNorma4[2],\n              columnEnd = _selectionSchemaNorma4[3];\n\n          _this2.setRangeStartOnly(new _src.CellCoords(rowStart, columnStart), false);\n          _this2.setRangeEnd(new _src.CellCoords(rowEnd, columnEnd));\n          _this2.finish();\n        });\n      }\n\n      return isValid;\n    }\n\n    /**\n     * Select column specified by `startColumn` visual index or column property or a range of columns finishing at `endColumn`.\n     *\n     * @param {Number|String} startColumn Visual column index or column property from which the selection starts.\n     * @param {Number|String} [endColumn] Visual column index or column property from to the selection finishes.\n     * @returns {Boolean} Returns `true` if selection was successful, `false` otherwise.\n     */\n\n  }, {\n    key: 'selectColumns',\n    value: function selectColumns(startColumn) {\n      var endColumn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startColumn;\n\n      startColumn = typeof startColumn === 'string' ? this.tableProps.propToCol(startColumn) : startColumn;\n      endColumn = typeof endColumn === 'string' ? this.tableProps.propToCol(endColumn) : endColumn;\n\n      var countCols = this.tableProps.countCols();\n      var isValid = (0, _utils.isValidCoord)(startColumn, countCols) && (0, _utils.isValidCoord)(endColumn, countCols);\n\n      if (isValid) {\n        this.setRangeStartOnly(new _src.CellCoords(-1, startColumn));\n        this.setRangeEnd(new _src.CellCoords(this.tableProps.countRows() - 1, endColumn));\n        this.finish();\n      }\n\n      return isValid;\n    }\n\n    /**\n     * Select row specified by `startRow` visual index or a range of rows finishing at `endRow`.\n     *\n     * @param {Number} startRow Visual row index from which the selection starts.\n     * @param {Number} [endRow] Visual row index from to the selection finishes.\n     * @returns {Boolean} Returns `true` if selection was successful, `false` otherwise.\n     */\n\n  }, {\n    key: 'selectRows',\n    value: function selectRows(startRow) {\n      var endRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startRow;\n\n      var countRows = this.tableProps.countRows();\n      var isValid = (0, _utils.isValidCoord)(startRow, countRows) && (0, _utils.isValidCoord)(endRow, countRows);\n\n      if (isValid) {\n        this.setRangeStartOnly(new _src.CellCoords(startRow, -1));\n        this.setRangeEnd(new _src.CellCoords(endRow, this.tableProps.countCols() - 1));\n        this.finish();\n      }\n\n      return isValid;\n    }\n  }]);\n\n  return Selection;\n}();\n\n(0, _object.mixin)(Selection, _localHooks2.default);\n\nexports.default = Selection;\n\n/***/ }),\n/* 280 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _src = __webpack_require__(4);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * The SelectionRange class is a simple CellRanges collection designed for easy manipulation of the multiple\n * consecutive and non-consecutive selections.\n *\n * @class SelectionRange\n * @util\n */\nvar SelectionRange = function () {\n  function SelectionRange() {\n    _classCallCheck(this, SelectionRange);\n\n    /**\n     * List of all CellRanges added to the class instance.\n     *\n     * @type {CellRange[]}\n     */\n    this.ranges = [];\n  }\n\n  /**\n   * Check if selected range is empty.\n   *\n   * @return {Boolean}\n   */\n\n\n  _createClass(SelectionRange, [{\n    key: 'isEmpty',\n    value: function isEmpty() {\n      return this.size() === 0;\n    }\n\n    /**\n     * Set coordinates to the class instance. It clears all previously added coordinates and push `coords`\n     * to the collection.\n     *\n     * @param {CellCoords} coords The CellCoords instance with defined visual coordinates.\n     * @returns {SelectionRange}\n     */\n\n  }, {\n    key: 'set',\n    value: function set(coords) {\n      this.clear();\n      this.ranges.push(new _src.CellRange(coords));\n\n      return this;\n    }\n\n    /**\n     * Add coordinates to the class instance. The new coordinates are added to the end of the range collection.\n     *\n     * @param {CellCoords} coords The CellCoords instance with defined visual coordinates.\n     * @returns {SelectionRange}\n     */\n\n  }, {\n    key: 'add',\n    value: function add(coords) {\n      this.ranges.push(new _src.CellRange(coords));\n\n      return this;\n    }\n\n    /**\n     * Get last added coordinates from ranges, it returns a CellRange instance.\n     *\n     * @return {CellRange|undefined}\n     */\n\n  }, {\n    key: 'current',\n    value: function current() {\n      return this.peekByIndex(0);\n    }\n\n    /**\n     * Get previously added coordinates from ranges, it returns a CellRange instance.\n     *\n     * @return {CellRange|undefined}\n     */\n\n  }, {\n    key: 'previous',\n    value: function previous() {\n      return this.peekByIndex(-1);\n    }\n\n    /**\n     * Returns `true` if coords is within selection coords. This method iterates through all selection layers to check if\n     * the coords object is within selection range.\n     *\n     * @param {CellCoords} coords The CellCoords instance with defined visual coordinates.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'includes',\n    value: function includes(coords) {\n      return this.ranges.some(function (cellRange) {\n        return cellRange.includes(coords);\n      });\n    }\n\n    /**\n     * Clear collection.\n     *\n     * @return {SelectionRange}\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.ranges.length = 0;\n\n      return this;\n    }\n\n    /**\n     * Get count of added all coordinates added to the selection.\n     *\n     * @return {Number}\n     */\n\n  }, {\n    key: 'size',\n    value: function size() {\n      return this.ranges.length;\n    }\n\n    /**\n     * Peek the coordinates based on the offset where that coordinate resides in the collection.\n     *\n     * @param {Number} [offset=0] An offset where the coordinate will be retrieved from.\n     * @return {CellRange|undefined}\n     */\n\n  }, {\n    key: 'peekByIndex',\n    value: function peekByIndex() {\n      var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n      var rangeIndex = this.size() + offset - 1;\n      var cellRange = void 0;\n\n      if (rangeIndex >= 0) {\n        cellRange = this.ranges[rangeIndex];\n      }\n\n      return cellRange;\n    }\n  }, {\n    key: Symbol.iterator,\n    value: function value() {\n      return this.ranges[Symbol.iterator]();\n    }\n  }]);\n\n  return SelectionRange;\n}();\n\nexports.default = SelectionRange;\n\n/***/ }),\n/* 281 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _src = __webpack_require__(4);\n\nvar _object = __webpack_require__(2);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * The Transformation class implements algorithms for transforming coordinates based on current settings\n * passed to the Handsontable.\n *\n * Transformation is always applied relative to the current selection.\n *\n * @class Transformation\n * @util\n */\nvar Transformation = function () {\n  function Transformation(range, options) {\n    _classCallCheck(this, Transformation);\n\n    /**\n     * Instance of the SelectionRange, holder for coordinates applied to the table.\n     *\n     * @type {SelectionRange}\n     */\n    this.range = range;\n    /**\n     * Additional options which define the state of the settings which can infer transformation.\n     *\n     * @type {Object}\n     */\n    this.options = options;\n  }\n\n  /**\n   * Selects cell relative to current cell (if possible).\n   *\n   * @param {Number} rowDelta Rows number to move, value can be passed as negative number.\n   * @param {Number} colDelta Columns number to move, value can be passed as negative number.\n   * @param {Boolean} force If `true` the new rows/columns will be created if necessary. Otherwise, row/column will\n   *                        be created according to `minSpareRows/minSpareCols` settings of Handsontable.\n   * @returns {CellCoords}\n   */\n\n\n  _createClass(Transformation, [{\n    key: 'transformStart',\n    value: function transformStart(rowDelta, colDelta, force) {\n      var delta = new _src.CellCoords(rowDelta, colDelta);\n\n      this.runLocalHooks('beforeTransformStart', delta);\n\n      var totalRows = this.options.countRows();\n      var totalCols = this.options.countCols();\n      var fixedRowsBottom = this.options.fixedRowsBottom();\n      var minSpareRows = this.options.minSpareRows();\n      var minSpareCols = this.options.minSpareCols();\n      var autoWrapRow = this.options.autoWrapRow();\n      var autoWrapCol = this.options.autoWrapCol();\n      var highlightCoords = this.range.current().highlight;\n\n      if (highlightCoords.row + rowDelta > totalRows - 1) {\n        if (force && minSpareRows > 0 && !(fixedRowsBottom && highlightCoords.row >= totalRows - fixedRowsBottom - 1)) {\n          this.runLocalHooks('insertRowRequire', totalRows);\n          totalRows = this.options.countRows();\n        } else if (autoWrapCol) {\n          delta.row = 1 - totalRows;\n          delta.col = highlightCoords.col + delta.col == totalCols - 1 ? 1 - totalCols : 1;\n        }\n      } else if (autoWrapCol && highlightCoords.row + delta.row < 0 && highlightCoords.col + delta.col >= 0) {\n        delta.row = totalRows - 1;\n        delta.col = highlightCoords.col + delta.col == 0 ? totalCols - 1 : -1;\n      }\n\n      if (highlightCoords.col + delta.col > totalCols - 1) {\n        if (force && minSpareCols > 0) {\n          this.runLocalHooks('insertColRequire', totalRows);\n          totalCols = this.options.countCols();\n        } else if (autoWrapRow) {\n          delta.row = highlightCoords.row + delta.row == totalRows - 1 ? 1 - totalRows : 1;\n          delta.col = 1 - totalCols;\n        }\n      } else if (autoWrapRow && highlightCoords.col + delta.col < 0 && highlightCoords.row + delta.row >= 0) {\n        delta.row = highlightCoords.row + delta.row == 0 ? totalRows - 1 : -1;\n        delta.col = totalCols - 1;\n      }\n\n      var coords = new _src.CellCoords(highlightCoords.row + delta.row, highlightCoords.col + delta.col);\n      var rowTransformDir = 0;\n      var colTransformDir = 0;\n\n      if (coords.row < 0) {\n        rowTransformDir = -1;\n        coords.row = 0;\n      } else if (coords.row > 0 && coords.row >= totalRows) {\n        rowTransformDir = 1;\n        coords.row = totalRows - 1;\n      }\n\n      if (coords.col < 0) {\n        colTransformDir = -1;\n        coords.col = 0;\n      } else if (coords.col > 0 && coords.col >= totalCols) {\n        colTransformDir = 1;\n        coords.col = totalCols - 1;\n      }\n      this.runLocalHooks('afterTransformStart', coords, rowTransformDir, colTransformDir);\n\n      return coords;\n    }\n\n    /**\n     * Sets selection end cell relative to current selection end cell (if possible).\n     *\n     * @param {Number} rowDelta Rows number to move, value can be passed as negative number.\n     * @param {Number} colDelta Columns number to move, value can be passed as negative number.\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'transformEnd',\n    value: function transformEnd(rowDelta, colDelta) {\n      var delta = new _src.CellCoords(rowDelta, colDelta);\n\n      this.runLocalHooks('beforeTransformEnd', delta);\n\n      var totalRows = this.options.countRows();\n      var totalCols = this.options.countCols();\n      var cellRange = this.range.current();\n      var coords = new _src.CellCoords(cellRange.to.row + delta.row, cellRange.to.col + delta.col);\n      var rowTransformDir = 0;\n      var colTransformDir = 0;\n\n      if (coords.row < 0) {\n        rowTransformDir = -1;\n        coords.row = 0;\n      } else if (coords.row > 0 && coords.row >= totalRows) {\n        rowTransformDir = 1;\n        coords.row = totalRows - 1;\n      }\n\n      if (coords.col < 0) {\n        colTransformDir = -1;\n        coords.col = 0;\n      } else if (coords.col > 0 && coords.col >= totalCols) {\n        colTransformDir = 1;\n        coords.col = totalCols - 1;\n      }\n      this.runLocalHooks('afterTransformEnd', coords, rowTransformDir, colTransformDir);\n\n      return coords;\n    }\n  }]);\n\n  return Transformation;\n}();\n\n(0, _object.mixin)(Transformation, _localHooks2.default);\n\nexports.default = Transformation;\n\n/***/ }),\n/* 282 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = jQueryWrapper;\nfunction jQueryWrapper(Handsontable) {\n  var jQuery = typeof window === 'undefined' ? false : window.jQuery;\n\n  if (!jQuery) {\n    return;\n  }\n\n  jQuery.fn.handsontable = function (action) {\n    var $this = this.first(); // Use only first element from list\n    var instance = $this.data('handsontable');\n\n    // Init case\n    if (typeof action !== 'string') {\n      var userSettings = action || {};\n\n      if (instance) {\n        instance.updateSettings(userSettings);\n      } else {\n        instance = new Handsontable.Core($this[0], userSettings);\n        $this.data('handsontable', instance);\n        instance.init();\n      }\n\n      return $this;\n    }\n\n    // Action case\n    var args = [];\n    var output = void 0;\n\n    if (arguments.length > 1) {\n      for (var i = 1, ilen = arguments.length; i < ilen; i++) {\n        args.push(arguments[i]);\n      }\n    }\n\n    if (instance) {\n      if (typeof instance[action] !== 'undefined') {\n        output = instance[action].apply(instance, args);\n\n        if (action === 'destroy') {\n          $this.removeData();\n        }\n      } else {\n        throw new Error('Handsontable do not provide action: ' + action);\n      }\n    }\n\n    return output;\n  };\n};\n\n/***/ }),\n/* 283 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.Base = exports.UndoRedo = exports.TouchScroll = exports.Search = exports.PersistentState = exports.ObserveChanges = exports.MultipleSelectionHandles = exports.MergeCells = exports.ManualRowResize = exports.ManualRowMove = exports.ManualColumnResize = exports.ManualColumnMove = exports.ManualColumnFreeze = exports.DragToScroll = exports.CustomBorders = exports.CopyPaste = exports.ContextMenu = exports.Comments = exports.ColumnSorting = exports.AutoRowSize = exports.AutoFill = exports.AutoColumnSize = undefined;\n\nvar _persistentState = __webpack_require__(284);\n\nvar _persistentState2 = _interopRequireDefault(_persistentState);\n\nvar _autoColumnSize = __webpack_require__(286);\n\nvar _autoColumnSize2 = _interopRequireDefault(_autoColumnSize);\n\nvar _autofill = __webpack_require__(287);\n\nvar _autofill2 = _interopRequireDefault(_autofill);\n\nvar _autoRowSize = __webpack_require__(289);\n\nvar _autoRowSize2 = _interopRequireDefault(_autoRowSize);\n\nvar _columnSorting = __webpack_require__(290);\n\nvar _columnSorting2 = _interopRequireDefault(_columnSorting);\n\nvar _comments = __webpack_require__(293);\n\nvar _comments2 = _interopRequireDefault(_comments);\n\nvar _contextMenu = __webpack_require__(297);\n\nvar _contextMenu2 = _interopRequireDefault(_contextMenu);\n\nvar _copyPaste = __webpack_require__(314);\n\nvar _copyPaste2 = _interopRequireDefault(_copyPaste);\n\nvar _customBorders = __webpack_require__(321);\n\nvar _customBorders2 = _interopRequireDefault(_customBorders);\n\nvar _dragToScroll = __webpack_require__(327);\n\nvar _dragToScroll2 = _interopRequireDefault(_dragToScroll);\n\nvar _manualColumnFreeze = __webpack_require__(328);\n\nvar _manualColumnFreeze2 = _interopRequireDefault(_manualColumnFreeze);\n\nvar _manualColumnMove = __webpack_require__(332);\n\nvar _manualColumnMove2 = _interopRequireDefault(_manualColumnMove);\n\nvar _manualColumnResize = __webpack_require__(337);\n\nvar _manualColumnResize2 = _interopRequireDefault(_manualColumnResize);\n\nvar _manualRowMove = __webpack_require__(338);\n\nvar _manualRowMove2 = _interopRequireDefault(_manualRowMove);\n\nvar _manualRowResize = __webpack_require__(343);\n\nvar _manualRowResize2 = _interopRequireDefault(_manualRowResize);\n\nvar _mergeCells = __webpack_require__(344);\n\nvar _mergeCells2 = _interopRequireDefault(_mergeCells);\n\nvar _multipleSelectionHandles = __webpack_require__(350);\n\nvar _multipleSelectionHandles2 = _interopRequireDefault(_multipleSelectionHandles);\n\nvar _observeChanges = __webpack_require__(351);\n\nvar _observeChanges2 = _interopRequireDefault(_observeChanges);\n\nvar _search = __webpack_require__(354);\n\nvar _search2 = _interopRequireDefault(_search);\n\nvar _touchScroll = __webpack_require__(355);\n\nvar _touchScroll2 = _interopRequireDefault(_touchScroll);\n\nvar _undoRedo = __webpack_require__(356);\n\nvar _undoRedo2 = _interopRequireDefault(_undoRedo);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.AutoColumnSize = _autoColumnSize2.default;\nexports.AutoFill = _autofill2.default;\nexports.AutoRowSize = _autoRowSize2.default;\nexports.ColumnSorting = _columnSorting2.default;\nexports.Comments = _comments2.default;\nexports.ContextMenu = _contextMenu2.default;\nexports.CopyPaste = _copyPaste2.default;\nexports.CustomBorders = _customBorders2.default;\nexports.DragToScroll = _dragToScroll2.default;\nexports.ManualColumnFreeze = _manualColumnFreeze2.default;\nexports.ManualColumnMove = _manualColumnMove2.default;\nexports.ManualColumnResize = _manualColumnResize2.default;\nexports.ManualRowMove = _manualRowMove2.default;\nexports.ManualRowResize = _manualRowResize2.default;\nexports.MergeCells = _mergeCells2.default;\nexports.MultipleSelectionHandles = _multipleSelectionHandles2.default;\nexports.ObserveChanges = _observeChanges2.default;\nexports.PersistentState = _persistentState2.default;\nexports.Search = _search2.default;\nexports.TouchScroll = _touchScroll2.default;\nexports.UndoRedo = _undoRedo2.default;\nexports.Base = _base2.default;\n\n/***/ }),\n/* 284 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _storage = __webpack_require__(285);\n\nvar _storage2 = _interopRequireDefault(_storage);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('persistentStateSave');\n_pluginHooks2.default.getSingleton().register('persistentStateLoad');\n_pluginHooks2.default.getSingleton().register('persistentStateReset');\n\n/**\n * Save the state of column sorting, column positions and column sizes in local storage\n * to preserve table state between page reloads.\n *\n * In order to enable data storage mechanism, persistentState option must be set to true.\n *\n * When persistentState is enabled it exposes 3 hooks:\n *\n * persistentStateSave (key: String, value: Mixed) -\n * Saves value under given key in browser local storage.\n *\n * persistentStateLoad (key: String, saveTo: Object) -\n * Loads value, saved under given key, form browser local storage.\n * The loaded value will be saved in saveTo.value.\n *\n * persistentStateReset (key: String) -\n * Clears the value saved under key.\n * If no key is given, all values associated with table will be cleared.\n *\n * @plugin persistentState\n */\n\nvar PersistentState = function (_BasePlugin) {\n  _inherits(PersistentState, _BasePlugin);\n\n  function PersistentState(hotInstance) {\n    _classCallCheck(this, PersistentState);\n\n    /**\n     * Instance of {@link Storage}.\n     *\n     * @type {Storage}\n     */\n    var _this = _possibleConstructorReturn(this, (PersistentState.__proto__ || Object.getPrototypeOf(PersistentState)).call(this, hotInstance));\n\n    _this.storage = void 0;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(PersistentState, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().persistentState;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      if (!this.storage) {\n        this.storage = new _storage2.default(this.hot.rootElement.id);\n      }\n\n      this.addHook('persistentStateSave', function (key, value) {\n        return _this2.saveValue(key, value);\n      });\n      this.addHook('persistentStateLoad', function (key, saveTo) {\n        return _this2.loadValue(key, saveTo);\n      });\n      this.addHook('persistentStateReset', function () {\n        return _this2.resetValue();\n      });\n\n      _get(PersistentState.prototype.__proto__ || Object.getPrototypeOf(PersistentState.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.storage = void 0;\n\n      _get(PersistentState.prototype.__proto__ || Object.getPrototypeOf(PersistentState.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(PersistentState.prototype.__proto__ || Object.getPrototypeOf(PersistentState.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Load value from localStorage.\n     *\n     * @param {String} key Key string.\n     * @param {Object} saveTo Saved value from browser local storage.\n     */\n\n  }, {\n    key: 'loadValue',\n    value: function loadValue(key, saveTo) {\n      saveTo.value = this.storage.loadValue(key);\n    }\n\n    /**\n     * Save data to localStorage.\n     *\n     * @param {String} key Key string.\n     * @param {Mixed} value Value to save.\n     */\n\n  }, {\n    key: 'saveValue',\n    value: function saveValue(key, value) {\n      this.storage.saveValue(key, value);\n    }\n\n    /**\n     * Reset given data or all data from localStorage.\n     *\n     * @param {String} key [optional] Key string.\n     */\n\n  }, {\n    key: 'resetValue',\n    value: function resetValue(key) {\n      if (typeof key === 'undefined') {\n        this.storage.resetAll();\n      } else {\n        this.storage.reset(key);\n      }\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(PersistentState.prototype.__proto__ || Object.getPrototypeOf(PersistentState.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return PersistentState;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('persistentState', PersistentState);\n\nexports.default = PersistentState;\n\n/***/ }),\n/* 285 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _array = __webpack_require__(1);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Storage\n * @plugin PersistentState\n */\nvar Storage = function () {\n  function Storage(prefix) {\n    _classCallCheck(this, Storage);\n\n    /**\n     * Prefix for key (id element).\n     *\n     * @type {String}\n     */\n    this.prefix = prefix;\n\n    /**\n     * Saved keys.\n     *\n     * @type {Array}\n     */\n    this.savedKeys = [];\n    this.loadSavedKeys();\n  }\n\n  /**\n   * Save data to localStorage.\n   *\n   * @param {String} key Key string.\n   * @param {Mixed} value Value to save.\n   */\n\n\n  _createClass(Storage, [{\n    key: 'saveValue',\n    value: function saveValue(key, value) {\n      window.localStorage.setItem(this.prefix + '_' + key, JSON.stringify(value));\n\n      if (this.savedKeys.indexOf(key) === -1) {\n        this.savedKeys.push(key);\n        this.saveSavedKeys();\n      }\n    }\n\n    /**\n     * Load data from localStorage.\n     *\n     * @param {String} key Key string.\n     * @param {Object} defaultValue Object containing the loaded data.\n     *\n     * @returns {}\n     */\n\n  }, {\n    key: 'loadValue',\n    value: function loadValue(key, defaultValue) {\n      key = typeof key === 'undefined' ? defaultValue : key;\n\n      var value = window.localStorage.getItem(this.prefix + '_' + key);\n\n      return value === null ? void 0 : JSON.parse(value);\n    }\n\n    /**\n     * Reset given data from localStorage.\n     *\n     * @param {String} key Key string.\n     */\n\n  }, {\n    key: 'reset',\n    value: function reset(key) {\n      window.localStorage.removeItem(this.prefix + '_' + key);\n    }\n\n    /**\n     * Reset all data from localStorage.\n     *\n     */\n\n  }, {\n    key: 'resetAll',\n    value: function resetAll() {\n      var _this = this;\n\n      (0, _array.arrayEach)(this.savedKeys, function (value, index) {\n        window.localStorage.removeItem(_this.prefix + '_' + _this.savedKeys[index]);\n      });\n\n      this.clearSavedKeys();\n    }\n\n    /**\n     * Load and save all keys from localStorage.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'loadSavedKeys',\n    value: function loadSavedKeys() {\n      var keysJSON = window.localStorage.getItem(this.prefix + '__persistentStateKeys');\n      var keys = typeof keysJSON === 'string' ? JSON.parse(keysJSON) : void 0;\n\n      this.savedKeys = keys ? keys : [];\n    }\n  }, {\n    key: 'saveSavedKeys',\n\n\n    /**\n     * Save saved key in localStorage.\n     *\n     * @private\n     */\n    value: function saveSavedKeys() {\n      window.localStorage.setItem(this.prefix + '__persistentStateKeys', JSON.stringify(this.savedKeys));\n    }\n  }, {\n    key: 'clearSavedKeys',\n\n\n    /**\n     * Clear saved key from localStorage.\n     *\n     * @private\n     */\n    value: function clearSavedKeys() {\n      this.savedKeys.length = 0;\n      this.saveSavedKeys();\n    }\n  }]);\n\n  return Storage;\n}();\n\nexports.default = Storage;\n\n/***/ }),\n/* 286 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _array = __webpack_require__(1);\n\nvar _feature = __webpack_require__(40);\n\nvar _element = __webpack_require__(0);\n\nvar _ghostTable = __webpack_require__(92);\n\nvar _ghostTable2 = _interopRequireDefault(_ghostTable);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nvar _samplesGenerator = __webpack_require__(200);\n\nvar _samplesGenerator2 = _interopRequireDefault(_samplesGenerator);\n\nvar _string = __webpack_require__(36);\n\nvar _src = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar privatePool = new WeakMap();\n\n/**\n * @plugin AutoColumnSize\n *\n * @description\n * This plugin allows to set column widths based on their widest cells.\n *\n * By default, the plugin is declared as `undefined`, which makes it enabled (same as if it was declared as `true`).\n * Enabling this plugin may decrease the overall table performance, as it needs to calculate the widths of all cells to\n * resize the columns accordingly.\n * If you experience problems with the performance, try turning this feature off and declaring the column widths manually.\n *\n * Column width calculations are divided into sync and async part. Each of this parts has their own advantages and\n * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous operations don't\n * block the browser UI.\n *\n * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value to a config object:\n * ```js\n * ...\n * // as a number (300 columns in sync, rest async)\n * autoColumnSize: {syncLimit: 300},\n * ...\n *\n * ...\n * // as a string (percent)\n * autoColumnSize: {syncLimit: '40%'},\n * ...\n * ```\n *\n * To configure this plugin see {@link Options#autoColumnSize}.\n *\n * @example\n * ```js\n * ...\n * var hot = new Handsontable(document.getElementById('example'), {\n *   date: getData(),\n *   autoColumnSize: true\n * });\n * // Access to plugin instance:\n * var plugin = hot.getPlugin('autoColumnSize');\n *\n * plugin.getColumnWidth(4);\n *\n * if (plugin.isEnabled()) {\n *   // code...\n * }\n * ...\n * ```\n */\n\nvar AutoColumnSize = function (_BasePlugin) {\n  _inherits(AutoColumnSize, _BasePlugin);\n\n  _createClass(AutoColumnSize, null, [{\n    key: 'CALCULATION_STEP',\n    get: function get() {\n      return 50;\n    }\n  }, {\n    key: 'SYNC_CALCULATION_LIMIT',\n    get: function get() {\n      return 50;\n    }\n  }]);\n\n  function AutoColumnSize(hotInstance) {\n    _classCallCheck(this, AutoColumnSize);\n\n    var _this = _possibleConstructorReturn(this, (AutoColumnSize.__proto__ || Object.getPrototypeOf(AutoColumnSize)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      /**\n       * Cached column header names. It is used to diff current column headers with previous state and detect which\n       * columns width should be updated.\n       *\n       * @private\n       * @type {Array}\n       */\n      cachedColumnHeaders: []\n    });\n    /**\n     * Cached columns widths.\n     *\n     * @type {Array}\n     */\n    _this.widths = [];\n    /**\n     * Instance of {@link GhostTable} for rows and columns size calculations.\n     *\n     * @type {GhostTable}\n     */\n    _this.ghostTable = new _ghostTable2.default(_this.hot);\n    /**\n     * Instance of {@link SamplesGenerator} for generating samples necessary for columns width calculations.\n     *\n     * @type {SamplesGenerator}\n     */\n    _this.samplesGenerator = new _samplesGenerator2.default(function (row, col) {\n      return _this.hot.getCellMeta(row, col).spanned ? '' : _this.hot.getDataAtCell(row, col);\n    });\n    /**\n     * `true` only if the first calculation was performed\n     *\n     * @type {Boolean}\n     */\n    _this.firstCalculation = true;\n    /**\n     * `true` if the size calculation is in progress.\n     *\n     * @type {Boolean}\n     */\n    _this.inProgress = false;\n\n    // moved to constructor to allow auto-sizing the columns when the plugin is disabled\n    _this.addHook('beforeColumnResize', function (col, size, isDblClick) {\n      return _this.onBeforeColumnResize(col, size, isDblClick);\n    });\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(AutoColumnSize, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().autoColumnSize !== false && !this.hot.getSettings().colWidths;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      var setting = this.hot.getSettings().autoColumnSize;\n\n      if (setting && setting.useHeaders != null) {\n        this.ghostTable.setSetting('useHeaders', setting.useHeaders);\n      }\n\n      this.addHook('afterLoadData', function () {\n        return _this2.onAfterLoadData();\n      });\n      this.addHook('beforeChange', function (changes) {\n        return _this2.onBeforeChange(changes);\n      });\n\n      this.addHook('beforeRender', function (force) {\n        return _this2.onBeforeRender(force);\n      });\n      this.addHook('modifyColWidth', function (width, col) {\n        return _this2.getColumnWidth(col, width);\n      });\n      this.addHook('afterInit', function () {\n        return _this2.onAfterInit();\n      });\n      _get(AutoColumnSize.prototype.__proto__ || Object.getPrototypeOf(AutoColumnSize.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Update plugin state.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      var changedColumns = this.findColumnsWhereHeaderWasChanged();\n\n      if (changedColumns.length) {\n        this.clearCache(changedColumns);\n      }\n      _get(AutoColumnSize.prototype.__proto__ || Object.getPrototypeOf(AutoColumnSize.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(AutoColumnSize.prototype.__proto__ || Object.getPrototypeOf(AutoColumnSize.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Calculate a columns width.\n     *\n     * @param {Number|Object} colRange Column range object.\n     * @param {Number|Object} rowRange Row range object.\n     * @param {Boolean} [force=false] If `true` force calculate width even when value was cached earlier.\n     */\n\n  }, {\n    key: 'calculateColumnsWidth',\n    value: function calculateColumnsWidth() {\n      var colRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countCols() - 1 };\n\n      var _this3 = this;\n\n      var rowRange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { from: 0, to: this.hot.countRows() - 1 };\n      var force = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      if (typeof colRange === 'number') {\n        colRange = { from: colRange, to: colRange };\n      }\n      if (typeof rowRange === 'number') {\n        rowRange = { from: rowRange, to: rowRange };\n      }\n\n      (0, _number.rangeEach)(colRange.from, colRange.to, function (col) {\n        if (force || _this3.widths[col] === void 0 && !_this3.hot._getColWidthFromSettings(col)) {\n          var samples = _this3.samplesGenerator.generateColumnSamples(col, rowRange);\n\n          samples.forEach(function (sample, col) {\n            return _this3.ghostTable.addColumn(col, sample);\n          });\n        }\n      });\n\n      if (this.ghostTable.columns.length) {\n        this.ghostTable.getWidths(function (col, width) {\n          _this3.widths[col] = width;\n        });\n        this.ghostTable.clean();\n      }\n    }\n\n    /**\n     * Calculate all columns width.\n     *\n     * @param {Object|Number} rowRange Row range object.\n     */\n\n  }, {\n    key: 'calculateAllColumnsWidth',\n    value: function calculateAllColumnsWidth() {\n      var _this4 = this;\n\n      var rowRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countRows() - 1 };\n\n      var current = 0;\n      var length = this.hot.countCols() - 1;\n      var timer = null;\n\n      this.inProgress = true;\n\n      var loop = function loop() {\n        // When hot was destroyed after calculating finished cancel frame\n        if (!_this4.hot) {\n          (0, _feature.cancelAnimationFrame)(timer);\n          _this4.inProgress = false;\n\n          return;\n        }\n\n        _this4.calculateColumnsWidth({\n          from: current,\n          to: Math.min(current + AutoColumnSize.CALCULATION_STEP, length)\n        }, rowRange);\n\n        current = current + AutoColumnSize.CALCULATION_STEP + 1;\n\n        if (current < length) {\n          timer = (0, _feature.requestAnimationFrame)(loop);\n        } else {\n          (0, _feature.cancelAnimationFrame)(timer);\n          _this4.inProgress = false;\n\n          // @TODO Should call once per render cycle, currently fired separately in different plugins\n          _this4.hot.view.wt.wtOverlays.adjustElementsSize(true);\n          // tmp\n          if (_this4.hot.view.wt.wtOverlays.leftOverlay.needFullRender) {\n            _this4.hot.view.wt.wtOverlays.leftOverlay.clone.draw();\n          }\n        }\n      };\n      // sync\n      if (this.firstCalculation && this.getSyncCalculationLimit()) {\n        this.calculateColumnsWidth({ from: 0, to: this.getSyncCalculationLimit() }, rowRange);\n        this.firstCalculation = false;\n        current = this.getSyncCalculationLimit() + 1;\n      }\n      // async\n      if (current < length) {\n        loop();\n      } else {\n        this.inProgress = false;\n      }\n    }\n\n    /**\n     * Set the sampling options.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'setSamplingOptions',\n    value: function setSamplingOptions() {\n      var setting = this.hot.getSettings().autoColumnSize;\n      var samplingRatio = setting && (0, _object.hasOwnProperty)(setting, 'samplingRatio') ? this.hot.getSettings().autoColumnSize.samplingRatio : void 0;\n      var allowSampleDuplicates = setting && (0, _object.hasOwnProperty)(setting, 'allowSampleDuplicates') ? this.hot.getSettings().autoColumnSize.allowSampleDuplicates : void 0;\n\n      if (samplingRatio && !isNaN(samplingRatio)) {\n        this.samplesGenerator.setSampleCount(parseInt(samplingRatio, 10));\n      }\n\n      if (allowSampleDuplicates) {\n        this.samplesGenerator.setAllowDuplicates(allowSampleDuplicates);\n      }\n    }\n\n    /**\n     * Recalculate all columns width (overwrite cache values).\n     */\n\n  }, {\n    key: 'recalculateAllColumnsWidth',\n    value: function recalculateAllColumnsWidth() {\n      if (this.hot.view && (0, _element.isVisible)(this.hot.view.wt.wtTable.TABLE)) {\n        this.clearCache();\n        this.calculateAllColumnsWidth();\n      }\n    }\n\n    /**\n     * Get value which tells how many columns should be calculated synchronously. Rest of the columns will be calculated asynchronously.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getSyncCalculationLimit',\n    value: function getSyncCalculationLimit() {\n      /* eslint-disable no-bitwise */\n      var limit = AutoColumnSize.SYNC_CALCULATION_LIMIT;\n      var colsLimit = this.hot.countCols() - 1;\n\n      if ((0, _object.isObject)(this.hot.getSettings().autoColumnSize)) {\n        limit = this.hot.getSettings().autoColumnSize.syncLimit;\n\n        if ((0, _string.isPercentValue)(limit)) {\n          limit = (0, _number.valueAccordingPercent)(colsLimit, limit);\n        } else {\n          // Force to Number\n          limit >>= 0;\n        }\n      }\n\n      return Math.min(limit, colsLimit);\n    }\n\n    /**\n     * Get the calculated column width.\n     *\n     * @param {Number} col Column index.\n     * @param {Number} [defaultWidth] Default column width. It will be picked up if no calculated width found.\n     * @param {Boolean} [keepMinimum=true] If `true` then returned value won't be smaller then 50 (default column width).\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getColumnWidth',\n    value: function getColumnWidth(col) {\n      var defaultWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : void 0;\n      var keepMinimum = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n      var width = defaultWidth;\n\n      if (width === void 0) {\n        width = this.widths[col];\n\n        if (keepMinimum && typeof width === 'number') {\n          width = Math.max(width, _src.ViewportColumnsCalculator.DEFAULT_WIDTH);\n        }\n      }\n\n      return width;\n    }\n\n    /**\n     * Get the first visible column.\n     *\n     * @returns {Number} Returns column index or -1 if table is not rendered.\n     */\n\n  }, {\n    key: 'getFirstVisibleColumn',\n    value: function getFirstVisibleColumn() {\n      var wot = this.hot.view.wt;\n\n      if (wot.wtViewport.columnsVisibleCalculator) {\n        return wot.wtTable.getFirstVisibleColumn();\n      }\n      if (wot.wtViewport.columnsRenderCalculator) {\n        return wot.wtTable.getFirstRenderedColumn();\n      }\n\n      return -1;\n    }\n\n    /**\n     * Get the last visible column.\n     *\n     * @returns {Number} Returns column index or -1 if table is not rendered.\n     */\n\n  }, {\n    key: 'getLastVisibleColumn',\n    value: function getLastVisibleColumn() {\n      var wot = this.hot.view.wt;\n\n      if (wot.wtViewport.columnsVisibleCalculator) {\n        return wot.wtTable.getLastVisibleColumn();\n      }\n      if (wot.wtViewport.columnsRenderCalculator) {\n        return wot.wtTable.getLastRenderedColumn();\n      }\n\n      return -1;\n    }\n\n    /**\n     * Collects all columns which titles has been changed in comparison to the previous state.\n     *\n     * @returns {Array} It returns an array of physical column indexes.\n     */\n\n  }, {\n    key: 'findColumnsWhereHeaderWasChanged',\n    value: function findColumnsWhereHeaderWasChanged() {\n      var columnHeaders = this.hot.getColHeader();\n\n      var _privatePool$get = privatePool.get(this),\n          cachedColumnHeaders = _privatePool$get.cachedColumnHeaders;\n\n      var changedColumns = (0, _array.arrayReduce)(columnHeaders, function (acc, columnTitle, physicalColumn) {\n        var cachedColumnsLength = cachedColumnHeaders.length;\n\n        if (cachedColumnsLength - 1 < physicalColumn || cachedColumnHeaders[physicalColumn] !== columnTitle) {\n          acc.push(physicalColumn);\n        }\n        if (cachedColumnsLength - 1 < physicalColumn) {\n          cachedColumnHeaders.push(columnTitle);\n        } else {\n          cachedColumnHeaders[physicalColumn] = columnTitle;\n        }\n\n        return acc;\n      }, []);\n\n      return changedColumns;\n    }\n\n    /**\n     * Clear cache of calculated column widths. If you want to clear only selected columns pass an array with their indexes.\n     * Otherwise whole cache will be cleared.\n     *\n     * @param {Array} [columns=[]] List of column indexes (physical indexes) to clear.\n     */\n\n  }, {\n    key: 'clearCache',\n    value: function clearCache() {\n      var _this5 = this;\n\n      var columns = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n      if (columns.length) {\n        (0, _array.arrayEach)(columns, function (physicalIndex) {\n          _this5.widths[physicalIndex] = void 0;\n        });\n      } else {\n        this.widths.length = 0;\n      }\n    }\n\n    /**\n     * Check if all widths were calculated. If not then return `true` (need recalculate).\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNeedRecalculate',\n    value: function isNeedRecalculate() {\n      return !!(0, _array.arrayFilter)(this.widths, function (item) {\n        return item === void 0;\n      }).length;\n    }\n\n    /**\n     * On before render listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onBeforeRender',\n    value: function onBeforeRender() {\n      var force = this.hot.renderCall;\n      var rowsCount = this.hot.countRows();\n\n      // Keep last column widths unchanged for situation when all rows was deleted or trimmed (pro #6)\n      if (!rowsCount) {\n        return;\n      }\n\n      this.calculateColumnsWidth({ from: this.getFirstVisibleColumn(), to: this.getLastVisibleColumn() }, void 0, force);\n\n      if (this.isNeedRecalculate() && !this.inProgress) {\n        this.calculateAllColumnsWidth();\n      }\n    }\n\n    /**\n     * On after load data listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData() {\n      var _this6 = this;\n\n      if (this.hot.view) {\n        this.recalculateAllColumnsWidth();\n      } else {\n        // first load - initialization\n        setTimeout(function () {\n          if (_this6.hot) {\n            _this6.recalculateAllColumnsWidth();\n          }\n        }, 0);\n      }\n    }\n\n    /**\n     * On before change listener.\n     *\n     * @private\n     * @param {Array} changes\n     */\n\n  }, {\n    key: 'onBeforeChange',\n    value: function onBeforeChange(changes) {\n      var _this7 = this;\n\n      var changedColumns = (0, _array.arrayMap)(changes, function (_ref) {\n        var _ref2 = _slicedToArray(_ref, 2),\n            row = _ref2[0],\n            column = _ref2[1];\n\n        return _this7.hot.propToCol(column);\n      });\n\n      this.clearCache(changedColumns);\n    }\n\n    /**\n     * On before column resize listener.\n     *\n     * @private\n     * @param {Number} col\n     * @param {Number} size\n     * @param {Boolean} isDblClick\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onBeforeColumnResize',\n    value: function onBeforeColumnResize(col, size, isDblClick) {\n      if (isDblClick) {\n        this.calculateColumnsWidth(col, void 0, true);\n        size = this.getColumnWidth(col, void 0, false);\n      }\n\n      return size;\n    }\n\n    /**\n     * On after Handsontable init fill plugin with all necessary values.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      privatePool.get(this).cachedColumnHeaders = this.hot.getColHeader();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.ghostTable.clean();\n      _get(AutoColumnSize.prototype.__proto__ || Object.getPrototypeOf(AutoColumnSize.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return AutoColumnSize;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('autoColumnSize', AutoColumnSize);\n\nexports.default = AutoColumnSize;\n\n/***/ }),\n/* 287 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _element = __webpack_require__(0);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nvar _src = __webpack_require__(4);\n\nvar _utils = __webpack_require__(288);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('modifyAutofillRange');\n_pluginHooks2.default.getSingleton().register('beforeAutofill');\n\nvar INSERT_ROW_ALTER_ACTION_NAME = 'insert_row';\nvar INTERVAL_FOR_ADDING_ROW = 200;\n\n/**\n * This plugin provides \"drag-down\" and \"copy-down\" functionalities, both operated\n * using the small square in the right bottom of the cell selection.\n *\n * \"Drag-down\" expands the value of the selected cells to the neighbouring\n * cells when you drag the small square in the corner.\n *\n * \"Copy-down\" copies the value of the selection to all empty cells\n * below when you double click the small square.\n *\n * @class Autofill\n * @plugin Autofill\n */\n\nvar Autofill = function (_BasePlugin) {\n  _inherits(Autofill, _BasePlugin);\n\n  function Autofill(hotInstance) {\n    _classCallCheck(this, Autofill);\n\n    /**\n     * Event manager\n     *\n     * @type {EventManager}\n     */\n    var _this = _possibleConstructorReturn(this, (Autofill.__proto__ || Object.getPrototypeOf(Autofill)).call(this, hotInstance));\n\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Specifies if adding new row started.\n     *\n     * @type {Boolean}\n     */\n    _this.addingStarted = false;\n    /**\n     * Specifies if there was mouse down on the cell corner.\n     *\n     * @type {Boolean}\n     */\n    _this.mouseDownOnCellCorner = false;\n    /**\n     * Specifies if mouse was dragged outside Handsontable.\n     *\n     * @type {Boolean}\n     */\n    _this.mouseDragOutside = false;\n    /**\n     * Specifies how many cell levels were dragged using the handle.\n     *\n     * @type {Boolean}\n     */\n    _this.handleDraggedCells = 0;\n    /**\n     * Specifies allowed directions of drag.\n     *\n     * @type {Array}\n     */\n    _this.directions = [];\n    /**\n     * Specifies if can insert new rows if needed.\n     *\n     * @type {Boolean}\n     */\n    _this.autoInsertRow = false;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(Autofill, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().fillHandle;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.mapSettings();\n      this.registerEvents();\n\n      this.addHook('afterOnCellCornerMouseDown', function (event) {\n        return _this2.onAfterCellCornerMouseDown(event);\n      });\n      this.addHook('afterOnCellCornerDblClick', function (event) {\n        return _this2.onCellCornerDblClick(event);\n      });\n      this.addHook('beforeOnCellMouseOver', function (event, coords, TD) {\n        return _this2.onBeforeCellMouseOver(coords);\n      });\n\n      _get(Autofill.prototype.__proto__ || Object.getPrototypeOf(Autofill.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Update plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n      _get(Autofill.prototype.__proto__ || Object.getPrototypeOf(Autofill.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.clearMappedSettings();\n      _get(Autofill.prototype.__proto__ || Object.getPrototypeOf(Autofill.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Get selection data\n     *\n     * @private\n     * @returns {Array} Array with the data.\n     */\n\n  }, {\n    key: 'getSelectionData',\n    value: function getSelectionData() {\n      var selRange = {\n        from: this.hot.getSelectedRangeLast().from,\n        to: this.hot.getSelectedRangeLast().to\n      };\n\n      return this.hot.getData(selRange.from.row, selRange.from.col, selRange.to.row, selRange.to.col);\n    }\n\n    /**\n     * Try to apply fill values to the area in fill border, omitting the selection border.\n     *\n     * @private\n     * @returns {Boolean} reports if fill was applied.\n     */\n\n  }, {\n    key: 'fillIn',\n    value: function fillIn() {\n      if (this.hot.selection.highlight.getFill().isEmpty()) {\n        return false;\n      }\n\n      var cornersOfSelectionAndDragAreas = this.hot.selection.highlight.getFill().getCorners();\n\n      this.resetSelectionOfDraggedArea();\n\n      var cornersOfSelectedCells = this.getCornersOfSelectedCells();\n      cornersOfSelectionAndDragAreas = this.hot.runHooks('modifyAutofillRange', cornersOfSelectionAndDragAreas, cornersOfSelectedCells);\n\n      var _getDragDirectionAndR = (0, _utils.getDragDirectionAndRange)(cornersOfSelectedCells, cornersOfSelectionAndDragAreas),\n          directionOfDrag = _getDragDirectionAndR.directionOfDrag,\n          startOfDragCoords = _getDragDirectionAndR.startOfDragCoords,\n          endOfDragCoords = _getDragDirectionAndR.endOfDragCoords;\n\n      if (startOfDragCoords && startOfDragCoords.row > -1 && startOfDragCoords.col > -1) {\n        var selectionData = this.getSelectionData();\n\n        this.hot.runHooks('beforeAutofill', startOfDragCoords, endOfDragCoords, selectionData);\n\n        var deltas = (0, _utils.getDeltas)(startOfDragCoords, endOfDragCoords, selectionData, directionOfDrag);\n        var fillData = selectionData;\n\n        if (['up', 'left'].indexOf(directionOfDrag) > -1) {\n          fillData = [];\n\n          var dragLength = null;\n          var fillOffset = null;\n\n          if (directionOfDrag === 'up') {\n            dragLength = endOfDragCoords.row - startOfDragCoords.row + 1;\n            fillOffset = dragLength % selectionData.length;\n\n            for (var i = 0; i < dragLength; i++) {\n              fillData.push(selectionData[(i + (selectionData.length - fillOffset)) % selectionData.length]);\n            }\n          } else {\n            dragLength = endOfDragCoords.col - startOfDragCoords.col + 1;\n            fillOffset = dragLength % selectionData[0].length;\n\n            for (var _i = 0; _i < selectionData.length; _i++) {\n              fillData.push([]);\n              for (var j = 0; j < dragLength; j++) {\n                fillData[_i].push(selectionData[_i][(j + (selectionData[_i].length - fillOffset)) % selectionData[_i].length]);\n              }\n            }\n          }\n        }\n\n        this.hot.populateFromArray(startOfDragCoords.row, startOfDragCoords.col, fillData, endOfDragCoords.row, endOfDragCoords.col, this.pluginName + '.fill', null, directionOfDrag, deltas);\n\n        this.setSelection(cornersOfSelectionAndDragAreas);\n      } else {\n        // reset to avoid some range bug\n        this.hot._refreshBorders();\n      }\n\n      return true;\n    }\n\n    /**\n     * Reduce the selection area if the handle was dragged outside of the table or on headers.\n     *\n     * @private\n     * @param {CellCoords} coords indexes of selection corners.\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'reduceSelectionAreaIfNeeded',\n    value: function reduceSelectionAreaIfNeeded(coords) {\n      if (coords.row < 0) {\n        coords.row = 0;\n      }\n\n      if (coords.col < 0) {\n        coords.col = 0;\n      }\n      return coords;\n    }\n\n    /**\n     * Get the coordinates of the drag & drop borders.\n     *\n     * @private\n     * @param {CellCoords} coordsOfSelection `CellCoords` coord object.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getCoordsOfDragAndDropBorders',\n    value: function getCoordsOfDragAndDropBorders(coordsOfSelection) {\n      var topLeftCorner = this.hot.getSelectedRangeLast().getTopLeftCorner();\n      var bottomRightCorner = this.hot.getSelectedRangeLast().getBottomRightCorner();\n      var coords = void 0;\n\n      if (this.directions.includes(_utils.DIRECTIONS.vertical) && (bottomRightCorner.row < coordsOfSelection.row || topLeftCorner.row > coordsOfSelection.row)) {\n        coords = new _src.CellCoords(coordsOfSelection.row, bottomRightCorner.col);\n      } else if (this.directions.includes(_utils.DIRECTIONS.horizontal)) {\n        coords = new _src.CellCoords(bottomRightCorner.row, coordsOfSelection.col);\n      } else {\n        // wrong direction\n        return;\n      }\n\n      return this.reduceSelectionAreaIfNeeded(coords);\n    }\n\n    /**\n     * Show the fill border.\n     *\n     * @private\n     * @param {CellCoords} coordsOfSelection `CellCoords` coord object.\n     */\n\n  }, {\n    key: 'showBorder',\n    value: function showBorder(coordsOfSelection) {\n      var coordsOfDragAndDropBorders = this.getCoordsOfDragAndDropBorders(coordsOfSelection);\n\n      if (coordsOfDragAndDropBorders) {\n        this.redrawBorders(coordsOfDragAndDropBorders);\n      }\n    }\n\n    /**\n     * Add new row\n     *\n     * @private\n     */\n\n  }, {\n    key: 'addRow',\n    value: function addRow() {\n      var _this3 = this;\n\n      this.hot._registerTimeout(setTimeout(function () {\n        _this3.hot.alter(INSERT_ROW_ALTER_ACTION_NAME, void 0, 1, _this3.pluginName + '.fill');\n\n        _this3.addingStarted = false;\n      }, INTERVAL_FOR_ADDING_ROW));\n    }\n\n    /**\n     * Add new rows if they are needed to continue auto-filling values.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'addNewRowIfNeeded',\n    value: function addNewRowIfNeeded() {\n      if (this.hot.selection.highlight.getFill().cellRange && this.addingStarted === false && this.autoInsertRow) {\n        var cornersOfSelectedCells = this.hot.getSelectedLast();\n        var cornersOfSelectedDragArea = this.hot.selection.highlight.getFill().getCorners();\n        var nrOfTableRows = this.hot.countRows();\n\n        if (cornersOfSelectedCells[2] < nrOfTableRows - 1 && cornersOfSelectedDragArea[2] === nrOfTableRows - 1) {\n          this.addingStarted = true;\n\n          this.addRow();\n        }\n      }\n    }\n\n    /**\n     * Get corners of selected cells.\n     *\n     * @private\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getCornersOfSelectedCells',\n    value: function getCornersOfSelectedCells() {\n      if (this.hot.selection.isMultiple()) {\n        return this.hot.selection.highlight.createOrGetArea().getCorners();\n      }\n      return this.hot.selection.highlight.getCell().getCorners();\n    }\n\n    /**\n     * Get index of last adjacent filled in row\n     *\n     * @private\n     * @param {Array} cornersOfSelectedCells indexes of selection corners.\n     * @returns {Number} gives number greater than or equal to zero when selection adjacent can be applied.\n     * or -1 when selection adjacent can't be applied\n     */\n\n  }, {\n    key: 'getIndexOfLastAdjacentFilledInRow',\n    value: function getIndexOfLastAdjacentFilledInRow(cornersOfSelectedCells) {\n      var data = this.hot.getData();\n      var nrOfTableRows = this.hot.countRows();\n      var lastFilledInRowIndex = void 0;\n\n      for (var rowIndex = cornersOfSelectedCells[2] + 1; rowIndex < nrOfTableRows; rowIndex++) {\n        for (var columnIndex = cornersOfSelectedCells[1]; columnIndex <= cornersOfSelectedCells[3]; columnIndex++) {\n          var dataInCell = data[rowIndex][columnIndex];\n\n          if (dataInCell) {\n            return -1;\n          }\n        }\n\n        var dataInNextLeftCell = data[rowIndex][cornersOfSelectedCells[1] - 1];\n        var dataInNextRightCell = data[rowIndex][cornersOfSelectedCells[3] + 1];\n\n        if (!!dataInNextLeftCell || !!dataInNextRightCell) {\n          lastFilledInRowIndex = rowIndex;\n        }\n      }\n      return lastFilledInRowIndex;\n    }\n\n    /**\n     * Add a selection from the start area to the specific row index.\n     *\n     * @private\n     * @param {Array} selectStartArea selection area from which we start to create more comprehensive selection.\n     * @param {Number} rowIndex\n     */\n\n  }, {\n    key: 'addSelectionFromStartAreaToSpecificRowIndex',\n    value: function addSelectionFromStartAreaToSpecificRowIndex(selectStartArea, rowIndex) {\n      this.hot.selection.highlight.getFill().clear().add(new _src.CellCoords(selectStartArea[0], selectStartArea[1])).add(new _src.CellCoords(rowIndex, selectStartArea[3]));\n    }\n\n    /**\n     * Set selection based on passed corners.\n     *\n     * @private\n     * @param {Array} cornersOfArea\n     */\n\n  }, {\n    key: 'setSelection',\n    value: function setSelection(cornersOfArea) {\n      var _hot;\n\n      (_hot = this.hot).selectCell.apply(_hot, _toConsumableArray(cornersOfArea).concat([false, false]));\n    }\n\n    /**\n     * Try to select cells down to the last row in the left column and then returns if selection was applied.\n     *\n     * @private\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'selectAdjacent',\n    value: function selectAdjacent() {\n      var cornersOfSelectedCells = this.getCornersOfSelectedCells();\n      var lastFilledInRowIndex = this.getIndexOfLastAdjacentFilledInRow(cornersOfSelectedCells);\n\n      if (lastFilledInRowIndex === -1) {\n        return false;\n      }\n      this.addSelectionFromStartAreaToSpecificRowIndex(cornersOfSelectedCells, lastFilledInRowIndex);\n\n      return true;\n    }\n\n    /**\n     * Reset selection of dragged area.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'resetSelectionOfDraggedArea',\n    value: function resetSelectionOfDraggedArea() {\n      this.handleDraggedCells = 0;\n\n      this.hot.selection.highlight.getFill().clear();\n    }\n\n    /**\n     * Redraw borders.\n     *\n     * @private\n     * @param {CellCoords} coords `CellCoords` coord object.\n     */\n\n  }, {\n    key: 'redrawBorders',\n    value: function redrawBorders(coords) {\n      this.hot.selection.highlight.getFill().clear().add(this.hot.getSelectedRangeLast().from).add(this.hot.getSelectedRangeLast().to).add(coords);\n\n      this.hot.view.render();\n    }\n\n    /**\n     * Get if mouse was dragged outside.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'getIfMouseWasDraggedOutside',\n    value: function getIfMouseWasDraggedOutside(event) {\n      var tableBottom = (0, _element.offset)(this.hot.table).top - (window.pageYOffset || document.documentElement.scrollTop) + (0, _element.outerHeight)(this.hot.table);\n      var tableRight = (0, _element.offset)(this.hot.table).left - (window.pageXOffset || document.documentElement.scrollLeft) + (0, _element.outerWidth)(this.hot.table);\n\n      return event.clientY > tableBottom && event.clientX <= tableRight;\n    }\n\n    /**\n     * Bind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this4 = this;\n\n      this.eventManager.addEventListener(document.documentElement, 'mouseup', function () {\n        return _this4.onMouseUp();\n      });\n      this.eventManager.addEventListener(document.documentElement, 'mousemove', function (event) {\n        return _this4.onMouseMove(event);\n      });\n    }\n\n    /**\n     * On cell corner double click callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onCellCornerDblClick',\n    value: function onCellCornerDblClick() {\n      var selectionApplied = this.selectAdjacent();\n\n      if (selectionApplied) {\n        this.fillIn();\n      }\n    }\n\n    /**\n     * On after cell corner mouse down listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterCellCornerMouseDown',\n    value: function onAfterCellCornerMouseDown() {\n      this.handleDraggedCells = 1;\n      this.mouseDownOnCellCorner = true;\n    }\n\n    /**\n     * On before cell mouse over listener.\n     *\n     * @private\n     * @param {CellCoords} coords `CellCoords` coord object.\n     */\n\n  }, {\n    key: 'onBeforeCellMouseOver',\n    value: function onBeforeCellMouseOver(coords) {\n      if (this.mouseDownOnCellCorner && !this.hot.view.isMouseDown() && this.handleDraggedCells) {\n        this.handleDraggedCells++;\n\n        this.showBorder(coords);\n        this.addNewRowIfNeeded();\n      }\n    }\n\n    /**\n     * On mouse up listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      if (this.handleDraggedCells) {\n        if (this.handleDraggedCells > 1) {\n          this.fillIn();\n        }\n\n        this.handleDraggedCells = 0;\n        this.mouseDownOnCellCorner = false;\n      }\n    }\n\n    /**\n     * On mouse move listener.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var mouseWasDraggedOutside = this.getIfMouseWasDraggedOutside(event);\n\n      if (this.addingStarted === false && this.handleDraggedCells > 0 && mouseWasDraggedOutside) {\n        this.mouseDragOutside = true;\n        this.addingStarted = true;\n      } else {\n        this.mouseDragOutside = false;\n      }\n\n      if (this.mouseDragOutside && this.autoInsertRow) {\n        this.addRow();\n      }\n    }\n\n    /**\n     * Clear mapped settings.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'clearMappedSettings',\n    value: function clearMappedSettings() {\n      this.directions.length = 0;\n      this.autoInsertRow = false;\n    }\n\n    /**\n     * Map settings.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'mapSettings',\n    value: function mapSettings() {\n      var mappedSettings = (0, _utils.getMappedFillHandleSetting)(this.hot.getSettings().fillHandle);\n      this.directions = mappedSettings.directions;\n      this.autoInsertRow = mappedSettings.autoInsertRow;\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(Autofill.prototype.__proto__ || Object.getPrototypeOf(Autofill.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return Autofill;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('autofill', Autofill);\n\nexports.default = Autofill;\n\n/***/ }),\n/* 288 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.DIRECTIONS = undefined;\nexports.getDeltas = getDeltas;\nexports.getDragDirectionAndRange = getDragDirectionAndRange;\nexports.getMappedFillHandleSetting = getMappedFillHandleSetting;\n\nvar _object = __webpack_require__(2);\n\nvar _mixed = __webpack_require__(16);\n\nvar _src = __webpack_require__(4);\n\nvar DIRECTIONS = exports.DIRECTIONS = {\n  horizontal: 'horizontal',\n  vertical: 'vertical'\n};\n\n/**\n * Get deltas array.\n *\n * @param {CellCoords} start\n * @param {CellCoords} end\n * @param {Array} data\n * @param {String} direction\n * @returns {Array}\n */\nfunction getDeltas(start, end, data, direction) {\n  var rowsLength = data.length;\n  var columnsLength = data ? data[0].length : 0;\n  var deltas = [];\n  var diffRow = end.row - start.row;\n  var diffCol = end.col - start.col;\n\n  if (['down', 'up'].indexOf(direction) !== -1) {\n    var arr = [];\n\n    for (var col = 0; col <= diffCol; col++) {\n      var startValue = parseInt(data[0][col], 10);\n      var endValue = parseInt(data[rowsLength - 1][col], 10);\n      var delta = (direction === 'down' ? endValue - startValue : startValue - endValue) / (rowsLength - 1) || 0;\n\n      arr.push(delta);\n    }\n\n    deltas.push(arr);\n  }\n\n  if (['right', 'left'].indexOf(direction) !== -1) {\n    for (var row = 0; row <= diffRow; row++) {\n      var _startValue = parseInt(data[row][0], 10);\n      var _endValue = parseInt(data[row][columnsLength - 1], 10);\n      var _delta = (direction === 'right' ? _endValue - _startValue : _startValue - _endValue) / (columnsLength - 1) || 0;\n\n      deltas.push([_delta]);\n    }\n  }\n\n  return deltas;\n}\n\n/**\n * Get direction between positions and cords of selections difference (drag area)\n *\n * @param {Array} startSelection\n * @param {Array} endSelection\n * @returns {{direction: String, start: CellCoords, end: CellCoords}}\n */\nfunction getDragDirectionAndRange(startSelection, endSelection) {\n  var startOfDragCoords = void 0,\n      endOfDragCoords = void 0,\n      directionOfDrag = void 0;\n\n  if (endSelection[0] === startSelection[0] && endSelection[1] < startSelection[1]) {\n    directionOfDrag = 'left';\n\n    startOfDragCoords = new _src.CellCoords(endSelection[0], endSelection[1]);\n    endOfDragCoords = new _src.CellCoords(endSelection[2], startSelection[1] - 1);\n  } else if (endSelection[2] === startSelection[2] && endSelection[0] === startSelection[0] && endSelection[3] > startSelection[3]) {\n    directionOfDrag = 'right';\n\n    startOfDragCoords = new _src.CellCoords(endSelection[0], startSelection[3] + 1);\n    endOfDragCoords = new _src.CellCoords(endSelection[2], endSelection[3]);\n  } else if (endSelection[0] < startSelection[0] && endSelection[1] === startSelection[1]) {\n    directionOfDrag = 'up';\n\n    startOfDragCoords = new _src.CellCoords(endSelection[0], endSelection[1]);\n    endOfDragCoords = new _src.CellCoords(startSelection[0] - 1, endSelection[3]);\n  } else if (endSelection[2] > startSelection[2] && endSelection[1] === startSelection[1]) {\n    directionOfDrag = 'down';\n\n    startOfDragCoords = new _src.CellCoords(startSelection[2] + 1, endSelection[1]);\n    endOfDragCoords = new _src.CellCoords(endSelection[2], endSelection[3]);\n  }\n\n  return {\n    directionOfDrag: directionOfDrag,\n    startOfDragCoords: startOfDragCoords,\n    endOfDragCoords: endOfDragCoords\n  };\n}\n\n/**\n * Get mapped FillHandle setting containing information about\n * allowed FillHandle directions and if allowed is automatic insertion of rows on drag\n *\n * @param {Boolean|Object} fillHandle property of Handsontable settings\n * @returns {{directions: Array, autoInsertRow: Boolean}} object allowing access to information\n * about FillHandle in more useful way\n */\nfunction getMappedFillHandleSetting(fillHandle) {\n  var mappedSettings = {};\n\n  if (fillHandle === true) {\n    mappedSettings.directions = Object.keys(DIRECTIONS);\n    mappedSettings.autoInsertRow = true;\n  } else if ((0, _object.isObject)(fillHandle)) {\n    if ((0, _mixed.isDefined)(fillHandle.autoInsertRow)) {\n\n      // autoInsertRow for horizontal direction will be always false\n\n      if (fillHandle.direction === DIRECTIONS.horizontal) {\n        mappedSettings.autoInsertRow = false;\n      } else {\n        mappedSettings.autoInsertRow = fillHandle.autoInsertRow;\n      }\n    } else {\n      mappedSettings.autoInsertRow = false;\n    }\n\n    if ((0, _mixed.isDefined)(fillHandle.direction)) {\n      mappedSettings.directions = [fillHandle.direction];\n    } else {\n      mappedSettings.directions = Object.keys(DIRECTIONS);\n    }\n  } else if (typeof fillHandle === 'string') {\n    mappedSettings.directions = [fillHandle];\n    mappedSettings.autoInsertRow = true;\n  } else {\n    mappedSettings.directions = [];\n    mappedSettings.autoInsertRow = false;\n  }\n\n  return mappedSettings;\n}\n\n/***/ }),\n/* 289 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _array = __webpack_require__(1);\n\nvar _feature = __webpack_require__(40);\n\nvar _element = __webpack_require__(0);\n\nvar _ghostTable = __webpack_require__(92);\n\nvar _ghostTable2 = _interopRequireDefault(_ghostTable);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nvar _samplesGenerator = __webpack_require__(200);\n\nvar _samplesGenerator2 = _interopRequireDefault(_samplesGenerator);\n\nvar _string = __webpack_require__(36);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @plugin AutoRowSize\n *\n * @description\n * This plugin allows to set row heights based on their highest cells.\n *\n * By default, the plugin is declared as `undefined`, which makes it disabled (same as if it was declared as `false`).\n * Enabling this plugin may decrease the overall table performance, as it needs to calculate the heights of all cells to\n * resize the rows accordingly.\n * If you experience problems with the performance, try turning this feature off and declaring the row heights manually.\n *\n * Row height calculations are divided into sync and async part. Each of this parts has their own advantages and\n * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous operations don't\n * block the browser UI.\n *\n * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value to a config object:\n * ```js\n * ...\n * // as a number (300 columns in sync, rest async)\n * autoRowSize: {syncLimit: 300},\n * ...\n *\n * ...\n * // as a string (percent)\n * autoRowSize: {syncLimit: '40%'},\n * ...\n * ```\n *\n * You can also use the `allowSampleDuplicates` option to allow sampling duplicate values when calculating the row height. Note, that this might have\n * a negative impact on performance.\n *\n * To configure this plugin see {@link Options#autoRowSize}.\n *\n * @example\n *\n * ```js\n * ...\n * var hot = new Handsontable(document.getElementById('example'), {\n *   date: getData(),\n *   autoRowSize: true\n * });\n * // Access to plugin instance:\n * var plugin = hot.getPlugin('autoRowSize');\n *\n * plugin.getRowHeight(4);\n *\n * if (plugin.isEnabled()) {\n *   // code...\n * }\n * ...\n * ```\n */\nvar AutoRowSize = function (_BasePlugin) {\n  _inherits(AutoRowSize, _BasePlugin);\n\n  _createClass(AutoRowSize, null, [{\n    key: 'CALCULATION_STEP',\n    get: function get() {\n      return 50;\n    }\n  }, {\n    key: 'SYNC_CALCULATION_LIMIT',\n    get: function get() {\n      return 500;\n    }\n  }]);\n\n  function AutoRowSize(hotInstance) {\n    _classCallCheck(this, AutoRowSize);\n\n    /**\n     * Cached rows heights.\n     *\n     * @type {Array}\n     */\n    var _this = _possibleConstructorReturn(this, (AutoRowSize.__proto__ || Object.getPrototypeOf(AutoRowSize)).call(this, hotInstance));\n\n    _this.heights = [];\n    /**\n     * Instance of {@link GhostTable} for rows and columns size calculations.\n     *\n     * @type {GhostTable}\n     */\n    _this.ghostTable = new _ghostTable2.default(_this.hot);\n    /**\n     * Instance of {@link SamplesGenerator} for generating samples necessary for rows height calculations.\n     *\n     * @type {SamplesGenerator}\n     */\n    _this.samplesGenerator = new _samplesGenerator2.default(function (row, col) {\n      if (row >= 0) {\n        return _this.hot.getDataAtCell(row, col);\n      } else if (row === -1) {\n        return _this.hot.getColHeader(col);\n      }\n      return null;\n    });\n    /**\n     * `true` if only the first calculation was performed.\n     *\n     * @type {Boolean}\n     */\n    _this.firstCalculation = true;\n    /**\n     * `true` if the size calculation is in progress.\n     *\n     * @type {Boolean}\n     */\n    _this.inProgress = false;\n\n    // moved to constructor to allow auto-sizing the rows when the plugin is disabled\n    _this.addHook('beforeRowResize', function (row, size, isDblClick) {\n      return _this.onBeforeRowResize(row, size, isDblClick);\n    });\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(AutoRowSize, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().autoRowSize === true || (0, _object.isObject)(this.hot.getSettings().autoRowSize);\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.setSamplingOptions();\n\n      this.addHook('afterLoadData', function () {\n        return _this2.onAfterLoadData();\n      });\n      this.addHook('beforeChange', function (changes) {\n        return _this2.onBeforeChange(changes);\n      });\n      this.addHook('beforeColumnMove', function () {\n        return _this2.recalculateAllRowsHeight();\n      });\n      this.addHook('beforeColumnResize', function () {\n        return _this2.recalculateAllRowsHeight();\n      });\n      this.addHook('beforeColumnSort', function () {\n        return _this2.clearCache();\n      });\n      this.addHook('beforeRender', function (force) {\n        return _this2.onBeforeRender(force);\n      });\n      this.addHook('beforeRowMove', function (rowStart, rowEnd) {\n        return _this2.onBeforeRowMove(rowStart, rowEnd);\n      });\n      this.addHook('modifyRowHeight', function (height, row) {\n        return _this2.getRowHeight(row, height);\n      });\n      this.addHook('modifyColumnHeaderHeight', function () {\n        return _this2.getColumnHeaderHeight();\n      });\n      _get(AutoRowSize.prototype.__proto__ || Object.getPrototypeOf(AutoRowSize.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(AutoRowSize.prototype.__proto__ || Object.getPrototypeOf(AutoRowSize.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Calculate a given rows height.\n     *\n     * @param {Number|Object} rowRange Row range object.\n     * @param {Number|Object} colRange Column range object.\n     * @param {Boolean} [force=false] If `true` force calculate height even when value was cached earlier.\n     */\n\n  }, {\n    key: 'calculateRowsHeight',\n    value: function calculateRowsHeight() {\n      var rowRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countRows() - 1 };\n\n      var _this3 = this;\n\n      var colRange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { from: 0, to: this.hot.countCols() - 1 };\n      var force = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      if (typeof rowRange === 'number') {\n        rowRange = { from: rowRange, to: rowRange };\n      }\n      if (typeof colRange === 'number') {\n        colRange = { from: colRange, to: colRange };\n      }\n\n      if (this.hot.getColHeader(0) !== null) {\n        var samples = this.samplesGenerator.generateRowSamples(-1, colRange);\n\n        this.ghostTable.addColumnHeadersRow(samples.get(-1));\n      }\n\n      (0, _number.rangeEach)(rowRange.from, rowRange.to, function (row) {\n        // For rows we must calculate row height even when user had set height value manually.\n        // We can shrink column but cannot shrink rows!\n        if (force || _this3.heights[row] === void 0) {\n          var _samples = _this3.samplesGenerator.generateRowSamples(row, colRange);\n\n          _samples.forEach(function (sample, row) {\n            _this3.ghostTable.addRow(row, sample);\n          });\n        }\n      });\n      if (this.ghostTable.rows.length) {\n        this.ghostTable.getHeights(function (row, height) {\n          _this3.heights[row] = height;\n        });\n        this.ghostTable.clean();\n      }\n    }\n\n    /**\n     * Calculate the height of all the rows.\n     *\n     * @param {Object|Number} colRange Column range object.\n     */\n\n  }, {\n    key: 'calculateAllRowsHeight',\n    value: function calculateAllRowsHeight() {\n      var _this4 = this;\n\n      var colRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countCols() - 1 };\n\n      var current = 0;\n      var length = this.hot.countRows() - 1;\n      var timer = null;\n\n      this.inProgress = true;\n\n      var loop = function loop() {\n        // When hot was destroyed after calculating finished cancel frame\n        if (!_this4.hot) {\n          (0, _feature.cancelAnimationFrame)(timer);\n          _this4.inProgress = false;\n\n          return;\n        }\n        _this4.calculateRowsHeight({ from: current, to: Math.min(current + AutoRowSize.CALCULATION_STEP, length) }, colRange);\n        current = current + AutoRowSize.CALCULATION_STEP + 1;\n\n        if (current < length) {\n          timer = (0, _feature.requestAnimationFrame)(loop);\n        } else {\n          (0, _feature.cancelAnimationFrame)(timer);\n          _this4.inProgress = false;\n\n          // @TODO Should call once per render cycle, currently fired separately in different plugins\n          _this4.hot.view.wt.wtOverlays.adjustElementsSize(true);\n          // tmp\n          if (_this4.hot.view.wt.wtOverlays.leftOverlay.needFullRender) {\n            _this4.hot.view.wt.wtOverlays.leftOverlay.clone.draw();\n          }\n        }\n      };\n      // sync\n      if (this.firstCalculation && this.getSyncCalculationLimit()) {\n        this.calculateRowsHeight({ from: 0, to: this.getSyncCalculationLimit() }, colRange);\n        this.firstCalculation = false;\n        current = this.getSyncCalculationLimit() + 1;\n      }\n      // async\n      if (current < length) {\n        loop();\n      } else {\n        this.inProgress = false;\n        this.hot.view.wt.wtOverlays.adjustElementsSize(false);\n      }\n    }\n\n    /**\n     * Set the sampling options.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'setSamplingOptions',\n    value: function setSamplingOptions() {\n      var setting = this.hot.getSettings().autoRowSize;\n      var samplingRatio = setting && (0, _object.hasOwnProperty)(setting, 'samplingRatio') ? this.hot.getSettings().autoRowSize.samplingRatio : void 0;\n      var allowSampleDuplicates = setting && (0, _object.hasOwnProperty)(setting, 'allowSampleDuplicates') ? this.hot.getSettings().autoRowSize.allowSampleDuplicates : void 0;\n\n      if (samplingRatio && !isNaN(samplingRatio)) {\n        this.samplesGenerator.setSampleCount(parseInt(samplingRatio, 10));\n      }\n\n      if (allowSampleDuplicates) {\n        this.samplesGenerator.setAllowDuplicates(allowSampleDuplicates);\n      }\n    }\n\n    /**\n     * Recalculate all rows height (overwrite cache values).\n     */\n\n  }, {\n    key: 'recalculateAllRowsHeight',\n    value: function recalculateAllRowsHeight() {\n      if ((0, _element.isVisible)(this.hot.view.wt.wtTable.TABLE)) {\n        this.clearCache();\n        this.calculateAllRowsHeight();\n      }\n    }\n\n    /**\n     * Get value which tells how much rows will be calculated synchronously. Rest rows will be calculated asynchronously.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getSyncCalculationLimit',\n    value: function getSyncCalculationLimit() {\n      /* eslint-disable no-bitwise */\n      var limit = AutoRowSize.SYNC_CALCULATION_LIMIT;\n      var rowsLimit = this.hot.countRows() - 1;\n\n      if ((0, _object.isObject)(this.hot.getSettings().autoRowSize)) {\n        limit = this.hot.getSettings().autoRowSize.syncLimit;\n\n        if ((0, _string.isPercentValue)(limit)) {\n          limit = (0, _number.valueAccordingPercent)(rowsLimit, limit);\n        } else {\n          // Force to Number\n          limit >>= 0;\n        }\n      }\n\n      return Math.min(limit, rowsLimit);\n    }\n\n    /**\n     * Get the calculated row height.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} [defaultHeight] Default row height. It will be pick up if no calculated height found.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getRowHeight',\n    value: function getRowHeight(row) {\n      var defaultHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : void 0;\n\n      var height = defaultHeight;\n\n      if (this.heights[row] !== void 0 && this.heights[row] > (defaultHeight || 0)) {\n        height = this.heights[row];\n      }\n\n      return height;\n    }\n\n    /**\n     * Get the calculated column header height.\n     *\n     * @returns {Number|undefined}\n     */\n\n  }, {\n    key: 'getColumnHeaderHeight',\n    value: function getColumnHeaderHeight() {\n      return this.heights[-1];\n    }\n\n    /**\n     * Get the first visible row.\n     *\n     * @returns {Number} Returns row index or -1 if table is not rendered.\n     */\n\n  }, {\n    key: 'getFirstVisibleRow',\n    value: function getFirstVisibleRow() {\n      var wot = this.hot.view.wt;\n\n      if (wot.wtViewport.rowsVisibleCalculator) {\n        return wot.wtTable.getFirstVisibleRow();\n      }\n      if (wot.wtViewport.rowsRenderCalculator) {\n        return wot.wtTable.getFirstRenderedRow();\n      }\n\n      return -1;\n    }\n\n    /**\n     * Get the last visible row.\n     *\n     * @returns {Number} Returns row index or -1 if table is not rendered.\n     */\n\n  }, {\n    key: 'getLastVisibleRow',\n    value: function getLastVisibleRow() {\n      var wot = this.hot.view.wt;\n\n      if (wot.wtViewport.rowsVisibleCalculator) {\n        return wot.wtTable.getLastVisibleRow();\n      }\n      if (wot.wtViewport.rowsRenderCalculator) {\n        return wot.wtTable.getLastRenderedRow();\n      }\n\n      return -1;\n    }\n\n    /**\n     * Clear cached heights.\n     */\n\n  }, {\n    key: 'clearCache',\n    value: function clearCache() {\n      this.heights.length = 0;\n      this.heights[-1] = void 0;\n    }\n\n    /**\n     * Clear cache by range.\n     *\n     * @param {Object|Number} range Row range object.\n     */\n\n  }, {\n    key: 'clearCacheByRange',\n    value: function clearCacheByRange(range) {\n      var _this5 = this;\n\n      if (typeof range === 'number') {\n        range = { from: range, to: range };\n      }\n      (0, _number.rangeEach)(Math.min(range.from, range.to), Math.max(range.from, range.to), function (row) {\n        _this5.heights[row] = void 0;\n      });\n    }\n\n    /**\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNeedRecalculate',\n    value: function isNeedRecalculate() {\n      return !!(0, _array.arrayFilter)(this.heights, function (item) {\n        return item === void 0;\n      }).length;\n    }\n\n    /**\n     * On before render listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onBeforeRender',\n    value: function onBeforeRender() {\n      var force = this.hot.renderCall;\n      this.calculateRowsHeight({ from: this.getFirstVisibleRow(), to: this.getLastVisibleRow() }, void 0, force);\n\n      var fixedRowsBottom = this.hot.getSettings().fixedRowsBottom;\n\n      // Calculate rows height synchronously for bottom overlay\n      if (fixedRowsBottom) {\n        var totalRows = this.hot.countRows() - 1;\n        this.calculateRowsHeight({ from: totalRows - fixedRowsBottom, to: totalRows });\n      }\n\n      if (this.isNeedRecalculate() && !this.inProgress) {\n        this.calculateAllRowsHeight();\n      }\n    }\n\n    /**\n     * On before row move listener.\n     *\n     * @private\n     * @param {Number} from Row index where was grabbed.\n     * @param {Number} to Destination row index.\n     */\n\n  }, {\n    key: 'onBeforeRowMove',\n    value: function onBeforeRowMove(from, to) {\n      this.clearCacheByRange({ from: from, to: to });\n      this.calculateAllRowsHeight();\n    }\n\n    /**\n     * On before row resize listener.\n     *\n     * @private\n     * @param {Number} row\n     * @param {Number} size\n     * @param {Boolean} isDblClick\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onBeforeRowResize',\n    value: function onBeforeRowResize(row, size, isDblClick) {\n      if (isDblClick) {\n        this.calculateRowsHeight(row, void 0, true);\n        size = this.getRowHeight(row);\n      }\n\n      return size;\n    }\n\n    /**\n     * On after load data listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData() {\n      var _this6 = this;\n\n      if (this.hot.view) {\n        this.recalculateAllRowsHeight();\n      } else {\n        // first load - initialization\n        setTimeout(function () {\n          if (_this6.hot) {\n            _this6.recalculateAllRowsHeight();\n          }\n        }, 0);\n      }\n    }\n\n    /**\n     * On before change listener.\n     *\n     * @private\n     * @param {Array} changes\n     */\n\n  }, {\n    key: 'onBeforeChange',\n    value: function onBeforeChange(changes) {\n      var range = null;\n\n      if (changes.length === 1) {\n        range = changes[0][0];\n      } else if (changes.length > 1) {\n        range = {\n          from: changes[0][0],\n          to: changes[changes.length - 1][0]\n        };\n      }\n      if (range !== null) {\n        this.clearCacheByRange(range);\n      }\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.ghostTable.clean();\n      _get(AutoRowSize.prototype.__proto__ || Object.getPrototypeOf(AutoRowSize.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return AutoRowSize;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('autoRowSize', AutoRowSize);\n\nexports.default = AutoRowSize;\n\n/***/ }),\n/* 290 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _moment = __webpack_require__(55);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _mixed = __webpack_require__(16);\n\nvar _object = __webpack_require__(2);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _mergeSort = __webpack_require__(291);\n\nvar _mergeSort2 = _interopRequireDefault(_mergeSort);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('beforeColumnSort');\n_pluginHooks2.default.getSingleton().register('afterColumnSort');\n\n// TODO: Implement mixin arrayMapper to ColumnSorting plugin.\n\n/**\n * @plugin ColumnSorting\n *\n * @description\n * This plugin sorts the view by a column (but does not sort the data source!).\n * To enable the plugin, set the `columnSorting` property to either:\n * * a boolean value (`true`/`false`),\n * * an object defining the initial sorting order (see the example below).\n *\n * @example\n * ```js\n * ...\n * // as boolean\n * columnSorting: true\n * ...\n * // as a object with initial order (sort ascending column at index 2)\n * columnSorting: {\n *  column: 2,\n *  sortOrder: true, // true = ascending, false = descending, undefined = original order\n *  sortEmptyCells: true // true = the table sorts empty cells, false = the table moves all empty cells to the end of the table\n * }\n * ...\n * ```\n * @dependencies ObserveChanges\n */\n\nvar ColumnSorting = function (_BasePlugin) {\n  _inherits(ColumnSorting, _BasePlugin);\n\n  function ColumnSorting(hotInstance) {\n    _classCallCheck(this, ColumnSorting);\n\n    var _this2 = _possibleConstructorReturn(this, (ColumnSorting.__proto__ || Object.getPrototypeOf(ColumnSorting)).call(this, hotInstance));\n\n    _this2.sortIndicators = [];\n    _this2.lastSortedColumn = null;\n    _this2.sortEmptyCells = false;\n    return _this2;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ColumnSorting, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().columnSorting;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this3 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.setPluginOptions();\n\n      var _this = this;\n      this.hot.sortIndex = [];\n\n      this.hot.sort = function () {\n        var args = Array.prototype.slice.call(arguments);\n\n        return _this.sortByColumn.apply(_this, _toConsumableArray(args));\n      };\n\n      if (typeof this.hot.getSettings().observeChanges === 'undefined') {\n        this.enableObserveChangesPlugin();\n      }\n\n      this.addHook('afterTrimRow', function (row) {\n        return _this3.sort();\n      });\n      this.addHook('afterUntrimRow', function (row) {\n        return _this3.sort();\n      });\n      this.addHook('modifyRow', function (row) {\n        return _this3.translateRow(row);\n      });\n      this.addHook('unmodifyRow', function (row) {\n        return _this3.untranslateRow(row);\n      });\n      this.addHook('afterUpdateSettings', function () {\n        return _this3.onAfterUpdateSettings();\n      });\n      this.addHook('afterGetColHeader', function (col, TH) {\n        return _this3.getColHeader(col, TH);\n      });\n      this.addHook('afterOnCellMouseDown', function (event, target) {\n        return _this3.onAfterOnCellMouseDown(event, target);\n      });\n      this.addHook('afterCreateRow', function () {\n        _this.afterCreateRow.apply(_this, arguments);\n      });\n      this.addHook('afterRemoveRow', function () {\n        _this.afterRemoveRow.apply(_this, arguments);\n      });\n      this.addHook('afterInit', function () {\n        return _this3.sortBySettings();\n      });\n      this.addHook('afterLoadData', function () {\n        _this3.hot.sortIndex = [];\n\n        if (_this3.hot.view) {\n          _this3.sortBySettings();\n        }\n      });\n      if (this.hot.view) {\n        this.sortBySettings();\n      }\n      _get(ColumnSorting.prototype.__proto__ || Object.getPrototypeOf(ColumnSorting.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.hot.sort = void 0;\n      _get(ColumnSorting.prototype.__proto__ || Object.getPrototypeOf(ColumnSorting.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * afterUpdateSettings callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterUpdateSettings',\n    value: function onAfterUpdateSettings() {\n      this.sortBySettings();\n    }\n  }, {\n    key: 'sortBySettings',\n    value: function sortBySettings() {\n      var sortingSettings = this.hot.getSettings().columnSorting;\n      var loadedSortingState = this.loadSortingState();\n      var sortingColumn = void 0;\n      var sortingOrder = void 0;\n\n      if (typeof loadedSortingState === 'undefined') {\n        sortingColumn = sortingSettings.column;\n        sortingOrder = sortingSettings.sortOrder;\n      } else {\n        sortingColumn = loadedSortingState.sortColumn;\n        sortingOrder = loadedSortingState.sortOrder;\n      }\n      if (typeof sortingColumn === 'number') {\n        this.lastSortedColumn = sortingColumn;\n        this.sortByColumn(sortingColumn, sortingOrder);\n      }\n    }\n\n    /**\n     * Set sorted column and order info\n     *\n     * @param {number} col Sorted visual column index.\n     * @param {boolean|undefined} order Sorting order (`true` for ascending, `false` for descending).\n     */\n\n  }, {\n    key: 'setSortingColumn',\n    value: function setSortingColumn(col, order) {\n      if (typeof col == 'undefined') {\n        this.hot.sortColumn = void 0;\n        this.hot.sortOrder = void 0;\n\n        return;\n      } else if (this.hot.sortColumn === col && typeof order == 'undefined') {\n        if (this.hot.sortOrder === false) {\n          this.hot.sortOrder = void 0;\n        } else {\n          this.hot.sortOrder = !this.hot.sortOrder;\n        }\n      } else {\n        this.hot.sortOrder = typeof order === 'undefined' ? true : order;\n      }\n\n      this.hot.sortColumn = col;\n    }\n  }, {\n    key: 'sortByColumn',\n    value: function sortByColumn(col, order) {\n      this.setSortingColumn(col, order);\n\n      if (typeof this.hot.sortColumn == 'undefined') {\n        return;\n      }\n\n      var allowSorting = this.hot.runHooks('beforeColumnSort', this.hot.sortColumn, this.hot.sortOrder);\n\n      if (allowSorting !== false) {\n        this.sort();\n      }\n      this.updateOrderClass();\n      this.updateSortIndicator();\n\n      this.hot.runHooks('afterColumnSort', this.hot.sortColumn, this.hot.sortOrder);\n\n      this.hot.render();\n      this.saveSortingState();\n    }\n\n    /**\n     * Save the sorting state\n     */\n\n  }, {\n    key: 'saveSortingState',\n    value: function saveSortingState() {\n      var sortingState = {};\n\n      if (typeof this.hot.sortColumn != 'undefined') {\n        sortingState.sortColumn = this.hot.sortColumn;\n      }\n\n      if (typeof this.hot.sortOrder != 'undefined') {\n        sortingState.sortOrder = this.hot.sortOrder;\n      }\n\n      if ((0, _object.hasOwnProperty)(sortingState, 'sortColumn') || (0, _object.hasOwnProperty)(sortingState, 'sortOrder')) {\n        this.hot.runHooks('persistentStateSave', 'columnSorting', sortingState);\n      }\n    }\n\n    /**\n     * Load the sorting state.\n     *\n     * @returns {*} Previously saved sorting state.\n     */\n\n  }, {\n    key: 'loadSortingState',\n    value: function loadSortingState() {\n      var storedState = {};\n      this.hot.runHooks('persistentStateLoad', 'columnSorting', storedState);\n\n      return storedState.value;\n    }\n\n    /**\n     * Update sorting class name state.\n     */\n\n  }, {\n    key: 'updateOrderClass',\n    value: function updateOrderClass() {\n      var orderClass = void 0;\n\n      if (this.hot.sortOrder === true) {\n        orderClass = 'ascending';\n      } else if (this.hot.sortOrder === false) {\n        orderClass = 'descending';\n      }\n      this.sortOrderClass = orderClass;\n    }\n  }, {\n    key: 'enableObserveChangesPlugin',\n    value: function enableObserveChangesPlugin() {\n      var _this = this;\n\n      this.hot._registerTimeout(setTimeout(function () {\n        _this.hot.updateSettings({\n          observeChanges: true\n        });\n      }, 0));\n    }\n\n    /**\n     * Default sorting algorithm.\n     *\n     * @param {Boolean} sortOrder Sorting order - `true` for ascending, `false` for descending.\n     * @param {Object} columnMeta Column meta object.\n     * @returns {Function} The comparing function.\n     */\n\n  }, {\n    key: 'defaultSort',\n    value: function defaultSort(sortOrder, columnMeta) {\n      return function (a, b) {\n        if (typeof a[1] == 'string') {\n          a[1] = a[1].toLowerCase();\n        }\n        if (typeof b[1] == 'string') {\n          b[1] = b[1].toLowerCase();\n        }\n\n        if (a[1] === b[1]) {\n          return 0;\n        }\n\n        if ((0, _mixed.isEmpty)(a[1])) {\n          if ((0, _mixed.isEmpty)(b[1])) {\n            return 0;\n          }\n\n          if (columnMeta.columnSorting.sortEmptyCells) {\n            return sortOrder ? -1 : 1;\n          }\n\n          return 1;\n        }\n        if ((0, _mixed.isEmpty)(b[1])) {\n          if ((0, _mixed.isEmpty)(a[1])) {\n            return 0;\n          }\n\n          if (columnMeta.columnSorting.sortEmptyCells) {\n            return sortOrder ? 1 : -1;\n          }\n\n          return -1;\n        }\n\n        if (isNaN(a[1]) && !isNaN(b[1])) {\n          return sortOrder ? 1 : -1;\n        } else if (!isNaN(a[1]) && isNaN(b[1])) {\n          return sortOrder ? -1 : 1;\n        } else if (!(isNaN(a[1]) || isNaN(b[1]))) {\n          a[1] = parseFloat(a[1]);\n          b[1] = parseFloat(b[1]);\n        }\n        if (a[1] < b[1]) {\n          return sortOrder ? -1 : 1;\n        }\n        if (a[1] > b[1]) {\n          return sortOrder ? 1 : -1;\n        }\n\n        return 0;\n      };\n    }\n\n    /**\n     * Date sorting algorithm\n     * @param {Boolean} sortOrder Sorting order (`true` for ascending, `false` for descending).\n     * @param {Object} columnMeta Column meta object.\n     * @returns {Function} The compare function.\n     */\n\n  }, {\n    key: 'dateSort',\n    value: function dateSort(sortOrder, columnMeta) {\n      return function (a, b) {\n        if (a[1] === b[1]) {\n          return 0;\n        }\n\n        if ((0, _mixed.isEmpty)(a[1])) {\n          if ((0, _mixed.isEmpty)(b[1])) {\n            return 0;\n          }\n\n          if (columnMeta.columnSorting.sortEmptyCells) {\n            return sortOrder ? -1 : 1;\n          }\n\n          return 1;\n        }\n\n        if ((0, _mixed.isEmpty)(b[1])) {\n          if ((0, _mixed.isEmpty)(a[1])) {\n            return 0;\n          }\n\n          if (columnMeta.columnSorting.sortEmptyCells) {\n            return sortOrder ? 1 : -1;\n          }\n\n          return -1;\n        }\n\n        var aDate = (0, _moment2.default)(a[1], columnMeta.dateFormat);\n        var bDate = (0, _moment2.default)(b[1], columnMeta.dateFormat);\n\n        if (!aDate.isValid()) {\n          return 1;\n        }\n        if (!bDate.isValid()) {\n          return -1;\n        }\n\n        if (bDate.isAfter(aDate)) {\n          return sortOrder ? -1 : 1;\n        }\n        if (bDate.isBefore(aDate)) {\n          return sortOrder ? 1 : -1;\n        }\n\n        return 0;\n      };\n    }\n\n    /**\n     * Numeric sorting algorithm.\n     *\n     * @param {Boolean} sortOrder Sorting order (`true` for ascending, `false` for descending).\n     * @param {Object} columnMeta Column meta object.\n     * @returns {Function} The compare function.\n     */\n\n  }, {\n    key: 'numericSort',\n    value: function numericSort(sortOrder, columnMeta) {\n      return function (a, b) {\n        var parsedA = parseFloat(a[1]);\n        var parsedB = parseFloat(b[1]);\n\n        // Watch out when changing this part of code!\n        // Check below returns 0 (as expected) when comparing empty string, null, undefined\n        if (parsedA === parsedB || isNaN(parsedA) && isNaN(parsedB)) {\n          return 0;\n        }\n\n        if (columnMeta.columnSorting.sortEmptyCells) {\n          if ((0, _mixed.isEmpty)(a[1])) {\n            return sortOrder ? -1 : 1;\n          }\n\n          if ((0, _mixed.isEmpty)(b[1])) {\n            return sortOrder ? 1 : -1;\n          }\n        }\n\n        if (isNaN(parsedA)) {\n          return 1;\n        }\n\n        if (isNaN(parsedB)) {\n          return -1;\n        }\n\n        if (parsedA < parsedB) {\n          return sortOrder ? -1 : 1;\n        } else if (parsedA > parsedB) {\n          return sortOrder ? 1 : -1;\n        }\n\n        return 0;\n      };\n    }\n\n    /**\n     * Perform the sorting.\n     */\n\n  }, {\n    key: 'sort',\n    value: function sort() {\n      if (typeof this.hot.sortOrder == 'undefined') {\n        this.hot.sortIndex.length = 0;\n\n        return;\n      }\n\n      var colMeta = this.hot.getCellMeta(0, this.hot.sortColumn);\n      var emptyRows = this.hot.countEmptyRows();\n      var sortFunction = void 0;\n      var nrOfRows = void 0;\n\n      this.hot.sortingEnabled = false; // this is required by translateRow plugin hook\n      this.hot.sortIndex.length = 0;\n\n      if (typeof colMeta.columnSorting.sortEmptyCells === 'undefined') {\n        colMeta.columnSorting = { sortEmptyCells: this.sortEmptyCells };\n      }\n\n      if (this.hot.getSettings().maxRows === Number.POSITIVE_INFINITY) {\n        nrOfRows = this.hot.countRows() - this.hot.getSettings().minSpareRows;\n      } else {\n        nrOfRows = this.hot.countRows() - emptyRows;\n      }\n\n      for (var i = 0, ilen = nrOfRows; i < ilen; i++) {\n        this.hot.sortIndex.push([i, this.hot.getDataAtCell(i, this.hot.sortColumn)]);\n      }\n\n      if (colMeta.sortFunction) {\n        sortFunction = colMeta.sortFunction;\n      } else {\n        switch (colMeta.type) {\n          case 'date':\n            sortFunction = this.dateSort;\n            break;\n          case 'numeric':\n            sortFunction = this.numericSort;\n            break;\n          default:\n            sortFunction = this.defaultSort;\n        }\n      }\n\n      (0, _mergeSort2.default)(this.hot.sortIndex, sortFunction(this.hot.sortOrder, colMeta));\n\n      // Append spareRows\n      for (var _i = this.hot.sortIndex.length; _i < this.hot.countRows(); _i++) {\n        this.hot.sortIndex.push([_i, this.hot.getDataAtCell(_i, this.hot.sortColumn)]);\n      }\n\n      this.hot.sortingEnabled = true; // this is required by translateRow plugin hook\n    }\n\n    /**\n     * Update indicator states.\n     */\n\n  }, {\n    key: 'updateSortIndicator',\n    value: function updateSortIndicator() {\n      if (typeof this.hot.sortOrder == 'undefined') {\n        return;\n      }\n      var colMeta = this.hot.getCellMeta(0, this.hot.sortColumn);\n\n      this.sortIndicators[this.hot.sortColumn] = colMeta.sortIndicator;\n    }\n\n    /**\n     * `modifyRow` hook callback. Translates physical row index to the sorted row index.\n     *\n     * @param {Number} row Row index.\n     * @returns {Number} Sorted row index.\n     */\n\n  }, {\n    key: 'translateRow',\n    value: function translateRow(row) {\n      if (this.hot.sortingEnabled && typeof this.hot.sortOrder !== 'undefined' && this.hot.sortIndex && this.hot.sortIndex.length && this.hot.sortIndex[row]) {\n        return this.hot.sortIndex[row][0];\n      }\n\n      return row;\n    }\n\n    /**\n     * Translates sorted row index to physical row index.\n     *\n     * @param {Number} row Sorted (visual) row index.\n     * @returns {number} Physical row index.\n     */\n\n  }, {\n    key: 'untranslateRow',\n    value: function untranslateRow(row) {\n      if (this.hot.sortingEnabled && this.hot.sortIndex && this.hot.sortIndex.length) {\n        for (var i = 0; i < this.hot.sortIndex.length; i++) {\n          if (this.hot.sortIndex[i][0] == row) {\n            return i;\n          }\n        }\n      }\n    }\n\n    /**\n     * `afterGetColHeader` callback. Adds column sorting css classes to clickable headers.\n     *\n     * @private\n     * @param {Number} col Visual column index.\n     * @param {Element} TH TH HTML element.\n     */\n\n  }, {\n    key: 'getColHeader',\n    value: function getColHeader(col, TH) {\n      if (col < 0 || !TH.parentNode) {\n        return false;\n      }\n\n      var headerLink = TH.querySelector('.colHeader');\n      var colspan = TH.getAttribute('colspan');\n      var TRs = TH.parentNode.parentNode.childNodes;\n      var headerLevel = Array.prototype.indexOf.call(TRs, TH.parentNode);\n      headerLevel -= TRs.length;\n\n      if (!headerLink) {\n        return;\n      }\n\n      if (this.hot.getSettings().columnSorting && col >= 0 && headerLevel === -1) {\n        (0, _element.addClass)(headerLink, 'columnSorting');\n      }\n      (0, _element.removeClass)(headerLink, 'descending');\n      (0, _element.removeClass)(headerLink, 'ascending');\n\n      if (this.sortIndicators[col]) {\n        if (col === this.hot.sortColumn) {\n          if (this.sortOrderClass === 'ascending') {\n            (0, _element.addClass)(headerLink, 'ascending');\n          } else if (this.sortOrderClass === 'descending') {\n            (0, _element.addClass)(headerLink, 'descending');\n          }\n        }\n      }\n    }\n\n    /**\n     * Check if any column is in a sorted state.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSorted',\n    value: function isSorted() {\n      return typeof this.hot.sortColumn != 'undefined';\n    }\n\n    /**\n     * `afterCreateRow` callback. Updates the sorting state after a row have been created.\n     *\n     * @private\n     * @param {Number} index Visual row index.\n     * @param {Number} amount\n     */\n\n  }, {\n    key: 'afterCreateRow',\n    value: function afterCreateRow(index, amount) {\n      if (!this.isSorted()) {\n        return;\n      }\n\n      for (var i = 0; i < this.hot.sortIndex.length; i++) {\n        if (this.hot.sortIndex[i][0] >= index) {\n          this.hot.sortIndex[i][0] += amount;\n        }\n      }\n\n      for (var _i2 = 0; _i2 < amount; _i2++) {\n        this.hot.sortIndex.splice(index + _i2, 0, [index + _i2, this.hot.getSourceData()[index + _i2][this.hot.sortColumn + this.hot.colOffset()]]);\n      }\n\n      this.saveSortingState();\n    }\n\n    /**\n     * `afterRemoveRow` hook callback.\n     *\n     * @private\n     * @param {Number} index Visual row index.\n     * @param {Number} amount\n     */\n\n  }, {\n    key: 'afterRemoveRow',\n    value: function afterRemoveRow(index, amount) {\n      if (!this.isSorted()) {\n        return;\n      }\n      var removedRows = this.hot.sortIndex.splice(index, amount);\n\n      removedRows = (0, _array.arrayMap)(removedRows, function (row) {\n        return row[0];\n      });\n\n      function countRowShift(logicalRow) {\n        // Todo: compare perf between reduce vs sort->each->brake\n        return (0, _array.arrayReduce)(removedRows, function (count, removedLogicalRow) {\n          if (logicalRow > removedLogicalRow) {\n            count++;\n          }\n\n          return count;\n        }, 0);\n      }\n\n      this.hot.sortIndex = (0, _array.arrayMap)(this.hot.sortIndex, function (logicalRow, physicalRow) {\n        var rowShift = countRowShift(logicalRow[0]);\n\n        if (rowShift) {\n          logicalRow[0] -= rowShift;\n        }\n\n        return logicalRow;\n      });\n\n      this.saveSortingState();\n    }\n\n    /**\n     * Set options by passed settings\n     *\n     * @private\n     */\n\n  }, {\n    key: 'setPluginOptions',\n    value: function setPluginOptions() {\n      var columnSorting = this.hot.getSettings().columnSorting;\n\n      if ((typeof columnSorting === 'undefined' ? 'undefined' : _typeof(columnSorting)) === 'object') {\n        this.sortEmptyCells = columnSorting.sortEmptyCells || false;\n      } else {\n        this.sortEmptyCells = false;\n      }\n    }\n\n    /**\n     * `onAfterOnCellMouseDown` hook callback.\n     *\n     * @private\n     * @param {Event} event Event which are provided by hook.\n     * @param {CellCoords} coords Visual coords of the selected cell.\n     */\n\n  }, {\n    key: 'onAfterOnCellMouseDown',\n    value: function onAfterOnCellMouseDown(event, coords) {\n      if (coords.row > -1) {\n        return;\n      }\n\n      if ((0, _element.hasClass)(event.realTarget, 'columnSorting')) {\n        // reset order state on every new column header click\n        if (coords.col !== this.lastSortedColumn) {\n          this.hot.sortOrder = true;\n        }\n\n        this.lastSortedColumn = coords.col;\n\n        this.sortByColumn(coords.col);\n      }\n    }\n  }]);\n\n  return ColumnSorting;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('columnSorting', ColumnSorting);\n\nexports.default = ColumnSorting;\n\n/***/ }),\n/* 291 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = mergeSort;\nexports.merge = merge;\n\nvar _linkedList = __webpack_require__(292);\n\nvar _linkedList2 = _interopRequireDefault(_linkedList);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Refactored implementation of mergeSort (part of javascript-algorithms project) by Github users:\n * mgechev, AndriiHeonia and lekkas (part of javascript-algorithms project - all project contributors\n * at repository website)\n *\n * Link to repository: https://github.com/mgechev/javascript-algorithms\n */\n\n/**\n * Specifies a function that defines the sort order. The array is sorted according to each\n * character's Unicode code point value, according to the string conversion of each element.\n *\n * @param a {*} first compared element.\n * @param b {*} second compared element.\n * @returns {Number}\n */\nvar defaultCompareFunction = function defaultCompareFunction(a, b) {\n  // sort lexically\n\n  var firstValue = a.toString();\n  var secondValue = b.toString();\n\n  if (firstValue === secondValue) {\n    return 0;\n  } else if (firstValue < secondValue) {\n    return -1;\n  }\n  return 1;\n};\n\n/**\n * Mergesort method which is recursively called for sorting the input array.\n *\n * @param {Array} array The array which should be sorted.\n * @param {Function} compareFunction Compares two items in an array. If compareFunction is not supplied,\n * elements are sorted by converting them to strings and comparing strings in Unicode code point order.\n * @param {Number} startIndex Left side of the subarray.\n * @param {Number} endIndex Right side of the subarray.\n * @returns {Array} Array with sorted subarray.\n */\nfunction mergeSort(array) {\n  var compareFunction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultCompareFunction;\n  var startIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n  var endIndex = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : array.length;\n\n  if (Math.abs(endIndex - startIndex) <= 1) {\n    return [];\n  }\n\n  var middleIndex = Math.ceil((startIndex + endIndex) / 2);\n\n  mergeSort(array, compareFunction, startIndex, middleIndex);\n  mergeSort(array, compareFunction, middleIndex, endIndex);\n\n  return merge(array, compareFunction, startIndex, middleIndex, endIndex);\n}\n\n/**\n * Devides and sort merges two subarrays of given array\n *\n * @param {Array} array The array which subarrays should be sorted.\n * @param {Number} startIndex The start of the first subarray.\n *   This subarray is with end middle - 1.\n * @param {Number} middleIndex The start of the second array.\n * @param {Number} endIndex end - 1 is the end of the second array.\n * @returns {Array} The array with sorted subarray.\n */\nfunction merge(array, compareFunction, startIndex, middleIndex, endIndex) {\n  var leftElements = new _linkedList2.default();\n  var rightElements = new _linkedList2.default();\n  var leftSize = middleIndex - startIndex;\n  var rightSize = endIndex - middleIndex;\n  var maxSize = Math.max(leftSize, rightSize);\n  var size = endIndex - startIndex;\n\n  for (var _i = 0; _i < maxSize; _i += 1) {\n    if (_i < leftSize) {\n      leftElements.push(array[startIndex + _i]);\n    }\n\n    if (_i < rightSize) {\n      rightElements.push(array[middleIndex + _i]);\n    }\n  }\n\n  var i = 0;\n\n  while (i < size) {\n    if (leftElements.first && rightElements.first) {\n      if (compareFunction(leftElements.first.data, rightElements.first.data) > 0) {\n        array[startIndex + i] = rightElements.shift().data;\n      } else {\n        array[startIndex + i] = leftElements.shift().data;\n      }\n    } else if (leftElements.first) {\n\n      array[startIndex + i] = leftElements.shift().data;\n    } else {\n\n      array[startIndex + i] = rightElements.shift().data;\n    }\n\n    i += 1;\n  }\n\n  return array;\n};\n\n/***/ }),\n/* 292 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Refactored implementation of LinkedList (part of javascript-algorithms project) by Github users:\n * mgechev, AndriiHeonia, Microfed and Jakeh (part of javascript-algorithms project - all project contributors\n * at repository website)\n *\n * Link to repository: https://github.com/mgechev/javascript-algorithms\n */\n\n/**\n * Linked list node.\n *\n * @class NodeStructure\n * @util\n */\nvar NodeStructure = function NodeStructure(data) {\n  _classCallCheck(this, NodeStructure);\n\n  /**\n   * Data of the node.\n   * @member {Object}\n   */\n  this.data = data;\n  /**\n   * Next node.\n   * @member {NodeStructure}\n   */\n  this.next = null;\n  /**\n   * Previous node.\n   * @member {NodeStructure}\n   */\n  this.prev = null;\n};\n\n/**\n * Linked list.\n *\n * @class LinkedList\n * @util\n */\n\n\nvar LinkedList = function () {\n  function LinkedList() {\n    _classCallCheck(this, LinkedList);\n\n    this.first = null;\n    this.last = null;\n  }\n\n  /**\n   * Add data to the end of linked list.\n   *\n   * @param {Object} data Data which should be added.\n   */\n\n\n  _createClass(LinkedList, [{\n    key: \"push\",\n    value: function push(data) {\n      var node = new NodeStructure(data);\n\n      if (this.first === null) {\n        this.first = node;\n        this.last = node;\n      } else {\n        var temp = this.last;\n\n        this.last = node;\n        node.prev = temp;\n        temp.next = node;\n      }\n    }\n\n    /**\n     * Add data to the beginning of linked list.\n     *\n     * @param {Object} data Data which should be added.\n     */\n\n  }, {\n    key: \"unshift\",\n    value: function unshift(data) {\n      var node = new NodeStructure(data);\n\n      if (this.first === null) {\n        this.first = node;\n        this.last = node;\n      } else {\n        var temp = this.first;\n\n        this.first = node;\n        node.next = temp;\n        temp.prev = node;\n      }\n    }\n\n    /**\n     * In order traversal of the linked list.\n     *\n     * @param {Function} callback Callback which should be executed on each node.\n     */\n\n  }, {\n    key: \"inorder\",\n    value: function inorder(callback) {\n      var temp = this.first;\n\n      while (temp) {\n        callback(temp);\n        temp = temp.next;\n      }\n    }\n\n    /**\n     * Remove data from the linked list.\n     *\n     * @param {Object} data Data which should be removed.\n     * @returns {Boolean} Returns true if data has been removed.\n     */\n\n  }, {\n    key: \"remove\",\n    value: function remove(data) {\n      if (this.first === null) {\n        return false;\n      }\n\n      var temp = this.first;\n      var next = void 0;\n      var prev = void 0;\n\n      while (temp) {\n        if (temp.data === data) {\n          next = temp.next;\n          prev = temp.prev;\n\n          if (next) {\n            next.prev = prev;\n          }\n\n          if (prev) {\n            prev.next = next;\n          }\n\n          if (temp === this.first) {\n            this.first = next;\n          }\n\n          if (temp === this.last) {\n            this.last = prev;\n          }\n\n          return true;\n        }\n\n        temp = temp.next;\n      }\n\n      return false;\n    }\n\n    /**\n     * Check if linked list contains cycle.\n     *\n     * @returns {Boolean} Returns true if linked list contains cycle.\n     */\n\n  }, {\n    key: \"hasCycle\",\n    value: function hasCycle() {\n      var fast = this.first;\n      var slow = this.first;\n\n      while (true) {\n        if (fast === null) {\n          return false;\n        }\n\n        fast = fast.next;\n\n        if (fast === null) {\n          return false;\n        }\n\n        fast = fast.next;\n        slow = slow.next;\n\n        if (fast === slow) {\n          return true;\n        }\n      }\n    }\n  }, {\n    key: \"pop\",\n\n\n    /**\n     * Return last node from the linked list.\n     *\n     * @returns {NodeStructure} Last node.\n     */\n    value: function pop() {\n      if (this.last === null) {\n        return null;\n      }\n\n      var temp = this.last;\n      this.last = this.last.prev;\n\n      return temp;\n    }\n  }, {\n    key: \"shift\",\n\n\n    /**\n     * Return first node from the linked list.\n     *\n     * @returns {NodeStructure} First node.\n     */\n    value: function shift() {\n      if (this.first === null) {\n        return null;\n      }\n\n      var temp = this.first;\n      this.first = this.first.next;\n\n      return temp;\n    }\n  }, {\n    key: \"recursiveReverse\",\n\n\n    /**\n     * Reverses the linked list recursively\n     */\n    value: function recursiveReverse() {\n      function inverse(current, next) {\n        if (!next) {\n          return;\n        }\n        inverse(next, next.next);\n        next.next = current;\n      }\n\n      if (!this.first) {\n        return;\n      }\n\n      inverse(this.first, this.first.next);\n\n      this.first.next = null;\n      var temp = this.first;\n      this.first = this.last;\n      this.last = temp;\n    }\n  }, {\n    key: \"reverse\",\n\n\n    /**\n     * Reverses the linked list iteratively\n     */\n    value: function reverse() {\n      if (!this.first || !this.first.next) {\n        return;\n      }\n\n      var current = this.first.next;\n      var prev = this.first;\n      var temp = void 0;\n\n      while (current) {\n        temp = current.next;\n        current.next = prev;\n        prev.prev = current;\n        prev = current;\n        current = temp;\n      }\n\n      this.first.next = null;\n      this.last.prev = null;\n      temp = this.first;\n      this.first = prev;\n      this.last = temp;\n    }\n  }]);\n\n  return LinkedList;\n}();\n\n;\n\nexports.NodeStructure = NodeStructure;\nexports.default = LinkedList;\n\n/***/ }),\n/* 293 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _src = __webpack_require__(4);\n\nvar _plugins = __webpack_require__(8);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _commentEditor = __webpack_require__(294);\n\nvar _commentEditor2 = _interopRequireDefault(_commentEditor);\n\nvar _utils = __webpack_require__(19);\n\nvar _displaySwitch = __webpack_require__(295);\n\nvar _displaySwitch2 = _interopRequireDefault(_displaySwitch);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\n__webpack_require__(296);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar privatePool = new WeakMap();\nvar META_COMMENT = 'comment';\nvar META_COMMENT_VALUE = 'value';\nvar META_STYLE = 'style';\nvar META_READONLY = 'readOnly';\n\n/**\n * @plugin Comments\n *\n * @description\n * This plugin allows setting and managing cell comments by either an option in the context menu or with the use of the API.\n *\n * To enable the plugin, you'll need to set the comments property of the config object to `true`:\n * ```js\n * ...\n * comments: true\n * ...\n * ```\n *\n * or object with extra predefined plugin config:\n *\n * ```js\n * ...\n * comments: {\n *   displayDelay: 1000\n * }\n * ...\n * ```\n *\n * To add comments at the table initialization, define the `comment` property in the `cell` config array as in an example below.\n *\n * @example\n *\n * ```js\n * ...\n * var hot = new Handsontable(document.getElementById('example'), {\n *   date: getData(),\n *   comments: true,\n *   cell: [\n *     {row: 1, col: 1, comment: {value: 'Foo'}},\n *     {row: 2, col: 2, comment: {value: 'Bar'}}\n *   ]\n * });\n *\n * // Access to the Comments plugin instance:\n * var commentsPlugin = hot.getPlugin('comments');\n *\n * // Manage comments programmatically:\n * commentsPlugin.setCommentAtCell(1, 6, 'Comment contents');\n * commentsPlugin.showAtCell(1, 6);\n * commentsPlugin.removeCommentAtCell(1, 6);\n *\n * // You can also set range once and use proper methods:\n * commentsPlugin.setRange({row: 1, col: 6});\n * commentsPlugin.setComment('Comment contents');\n * commentsPlugin.show();\n * commentsPlugin.removeComment();\n * ...\n * ```\n */\n\nvar Comments = function (_BasePlugin) {\n  _inherits(Comments, _BasePlugin);\n\n  function Comments(hotInstance) {\n    _classCallCheck(this, Comments);\n\n    /**\n     * Instance of {@link CommentEditor}.\n     *\n     * @type {CommentEditor}\n     */\n    var _this = _possibleConstructorReturn(this, (Comments.__proto__ || Object.getPrototypeOf(Comments)).call(this, hotInstance));\n\n    _this.editor = null;\n    /**\n     * Instance of {@link DisplaySwitch}.\n     *\n     * @type {DisplaySwitch}\n     */\n    _this.displaySwitch = null;\n    /**\n     * Instance of {@link EventManager}.\n     *\n     * @private\n     * @type {EventManager}\n     */\n    _this.eventManager = null;\n    /**\n     * Current cell range.\n     *\n     * @type {Object}\n     */\n    _this.range = {};\n    /**\n     * @private\n     * @type {Boolean}\n     */\n    _this.mouseDown = false;\n    /**\n     * @private\n     * @type {Boolean}\n     */\n    _this.contextMenuEvent = false;\n    /**\n     * @private\n     * @type {*}\n     */\n    _this.timer = null;\n\n    privatePool.set(_this, {\n      tempEditorDimensions: {},\n      cellBelowCursor: null\n    });\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(Comments, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().comments;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      if (!this.editor) {\n        this.editor = new _commentEditor2.default();\n      }\n\n      if (!this.eventManager) {\n        this.eventManager = new _eventManager2.default(this);\n      }\n\n      if (!this.displaySwitch) {\n        this.displaySwitch = new _displaySwitch2.default(this.getDisplayDelaySetting());\n      }\n\n      this.addHook('afterContextMenuDefaultOptions', function (options) {\n        return _this2.addToContextMenu(options);\n      });\n      this.addHook('afterRenderer', function (TD, row, col, prop, value, cellProperties) {\n        return _this2.onAfterRenderer(TD, cellProperties);\n      });\n      this.addHook('afterScrollHorizontally', function () {\n        return _this2.hide();\n      });\n      this.addHook('afterScrollVertically', function () {\n        return _this2.hide();\n      });\n      this.addHook('afterBeginEditing', function (args) {\n        return _this2.onAfterBeginEditing(args);\n      });\n\n      this.displaySwitch.addLocalHook('hide', function () {\n        return _this2.hide();\n      });\n      this.displaySwitch.addLocalHook('show', function (row, col) {\n        return _this2.showAtCell(row, col);\n      });\n\n      this.registerListeners();\n\n      _get(Comments.prototype.__proto__ || Object.getPrototypeOf(Comments.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Update plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n      _get(Comments.prototype.__proto__ || Object.getPrototypeOf(Comments.prototype), 'updatePlugin', this).call(this);\n\n      this.displaySwitch.updateDelay(this.getDisplayDelaySetting());\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(Comments.prototype.__proto__ || Object.getPrototypeOf(Comments.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Register all necessary DOM listeners.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerListeners',\n    value: function registerListeners() {\n      var _this3 = this;\n\n      this.eventManager.addEventListener(document, 'mouseover', function (event) {\n        return _this3.onMouseOver(event);\n      });\n      this.eventManager.addEventListener(document, 'mousedown', function (event) {\n        return _this3.onMouseDown(event);\n      });\n      this.eventManager.addEventListener(document, 'mouseup', function (event) {\n        return _this3.onMouseUp(event);\n      });\n      this.eventManager.addEventListener(this.editor.getInputElement(), 'blur', function (event) {\n        return _this3.onEditorBlur(event);\n      });\n      this.eventManager.addEventListener(this.editor.getInputElement(), 'mousedown', function (event) {\n        return _this3.onEditorMouseDown(event);\n      });\n      this.eventManager.addEventListener(this.editor.getInputElement(), 'mouseup', function (event) {\n        return _this3.onEditorMouseUp(event);\n      });\n    }\n\n    /**\n     * Set current cell range to be able to use general methods like {@link Comments#setComment},\n     * {@link Comments#removeComment}, {@link Comments#show}.\n     *\n     * @param {Object} range Object with `from` and `to` properties, each with `row` and `col` properties.\n     */\n\n  }, {\n    key: 'setRange',\n    value: function setRange(range) {\n      this.range = range;\n    }\n\n    /**\n     * Clear the currently selected cell.\n     */\n\n  }, {\n    key: 'clearRange',\n    value: function clearRange() {\n      this.range = {};\n    }\n\n    /**\n     * Check if the event target is a cell containing a comment.\n     *\n     * @param {Event} event DOM event\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'targetIsCellWithComment',\n    value: function targetIsCellWithComment(event) {\n      var closestCell = (0, _element.closest)(event.target, 'TD', 'TBODY');\n\n      return !!(closestCell && (0, _element.hasClass)(closestCell, 'htCommentCell') && (0, _element.closest)(closestCell, [this.hot.rootElement]));\n    }\n\n    /**\n     * Check if the event target is a comment textarea.\n     *\n     * @param {Event} event DOM event.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'targetIsCommentTextArea',\n    value: function targetIsCommentTextArea(event) {\n      return this.editor.getInputElement() === event.target;\n    }\n\n    /**\n     * Set a comment for a cell according to the previously set range (see {@link Comments#setRange}).\n     *\n     * @param {String} value Comment contents.\n     */\n\n  }, {\n    key: 'setComment',\n    value: function setComment(value) {\n      if (!this.range.from) {\n        throw new Error('Before using this method, first set cell range (hot.getPlugin(\"comment\").setRange())');\n      }\n      var editorValue = this.editor.getValue();\n      var comment = '';\n\n      if (value != null) {\n        comment = value;\n      } else if (editorValue != null) {\n        comment = editorValue;\n      }\n\n      var row = this.range.from.row;\n      var col = this.range.from.col;\n\n      this.updateCommentMeta(row, col, _defineProperty({}, META_COMMENT_VALUE, comment));\n      this.hot.render();\n    }\n\n    /**\n     * Set a comment for a cell.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {String} value Comment contents.\n     */\n\n  }, {\n    key: 'setCommentAtCell',\n    value: function setCommentAtCell(row, col, value) {\n      this.setRange({\n        from: new _src.CellCoords(row, col)\n      });\n      this.setComment(value);\n    }\n\n    /**\n     * Remove a comment from a cell according to previously set range (see {@link Comments#setRange}).\n     *\n     * @param {Boolean} [forceRender = true] If set to `true`, the table will be re-rendered at the end of the operation.\n     */\n\n  }, {\n    key: 'removeComment',\n    value: function removeComment() {\n      var forceRender = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n      if (!this.range.from) {\n        throw new Error('Before using this method, first set cell range (hot.getPlugin(\"comment\").setRange())');\n      }\n\n      this.hot.setCellMeta(this.range.from.row, this.range.from.col, META_COMMENT, void 0);\n\n      if (forceRender) {\n        this.hot.render();\n      }\n\n      this.hide();\n    }\n\n    /**\n     * Remove comment from a cell.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {Boolean} [forceRender = true] If `true`, the table will be re-rendered at the end of the operation.\n     */\n\n  }, {\n    key: 'removeCommentAtCell',\n    value: function removeCommentAtCell(row, col) {\n      var forceRender = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n      this.setRange({\n        from: new _src.CellCoords(row, col)\n      });\n      this.removeComment(forceRender);\n    }\n\n    /**\n     * Get comment from a cell at the predefined range.\n     */\n\n  }, {\n    key: 'getComment',\n    value: function getComment() {\n      var row = this.range.from.row;\n      var column = this.range.from.col;\n\n      return this.getCommentMeta(row, column, META_COMMENT_VALUE);\n    }\n\n    /**\n     * Get comment from a cell at the provided coordinates.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'getCommentAtCell',\n    value: function getCommentAtCell(row, column) {\n      return this.getCommentMeta(row, column, META_COMMENT_VALUE);\n    }\n\n    /**\n     * Show the comment editor accordingly to the previously set range (see {@link Comments#setRange}).\n     *\n     * @returns {Boolean} Returns `true` if comment editor was shown.\n     */\n\n  }, {\n    key: 'show',\n    value: function show() {\n      if (!this.range.from) {\n        throw new Error('Before using this method, first set cell range (hot.getPlugin(\"comment\").setRange())');\n      }\n      var meta = this.hot.getCellMeta(this.range.from.row, this.range.from.col);\n\n      this.refreshEditor(true);\n      this.editor.setValue(meta[META_COMMENT] ? meta[META_COMMENT][META_COMMENT_VALUE] : null || '');\n\n      if (this.editor.hidden) {\n        this.editor.show();\n      }\n\n      return true;\n    }\n\n    /**\n     * Show comment editor according to cell coordinates.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @returns {Boolean} Returns `true` if comment editor was shown.\n     */\n\n  }, {\n    key: 'showAtCell',\n    value: function showAtCell(row, col) {\n      this.setRange({\n        from: new _src.CellCoords(row, col)\n      });\n\n      return this.show();\n    }\n\n    /**\n     * Hide the comment editor.\n     */\n\n  }, {\n    key: 'hide',\n    value: function hide() {\n      if (!this.editor.hidden) {\n        this.editor.hide();\n      }\n    }\n\n    /**\n     * Refresh comment editor position and styling.\n     *\n     * @param {Boolean} [force=false] If `true` then recalculation will be forced.\n     */\n\n  }, {\n    key: 'refreshEditor',\n    value: function refreshEditor() {\n      var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (!force && (!this.range.from || !this.editor.isVisible())) {\n        return;\n      }\n      var scrollableElement = (0, _element.getScrollableElement)(this.hot.view.wt.wtTable.TABLE);\n      var TD = this.hot.view.wt.wtTable.getCell(this.range.from);\n      var row = this.range.from.row;\n      var column = this.range.from.col;\n      var cellOffset = (0, _element.offset)(TD);\n      var lastColWidth = this.hot.view.wt.wtTable.getStretchedColumnWidth(column);\n      var cellTopOffset = cellOffset.top < 0 ? 0 : cellOffset.top;\n      var cellLeftOffset = cellOffset.left;\n\n      if (this.hot.view.wt.wtViewport.hasVerticalScroll() && scrollableElement !== window) {\n        cellTopOffset -= this.hot.view.wt.wtOverlays.topOverlay.getScrollPosition();\n      }\n\n      if (this.hot.view.wt.wtViewport.hasHorizontalScroll() && scrollableElement !== window) {\n        cellLeftOffset -= this.hot.view.wt.wtOverlays.leftOverlay.getScrollPosition();\n      }\n\n      var x = cellLeftOffset + lastColWidth;\n      var y = cellTopOffset;\n\n      var commentStyle = this.getCommentMeta(row, column, META_STYLE);\n      var readOnly = this.getCommentMeta(row, column, META_READONLY);\n\n      if (commentStyle) {\n        this.editor.setSize(commentStyle.width, commentStyle.height);\n      } else {\n        this.editor.resetSize();\n      }\n\n      this.editor.setReadOnlyState(readOnly);\n\n      this.editor.setPosition(x, y);\n    }\n\n    /**\n     * Check if there is a comment for selected range.\n     *\n     * @private\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'checkSelectionCommentsConsistency',\n    value: function checkSelectionCommentsConsistency() {\n      var selected = this.hot.getSelectedRangeLast();\n\n      if (!selected) {\n        return false;\n      }\n      var hasComment = false;\n      var cell = selected.from; // IN EXCEL THERE IS COMMENT ONLY FOR TOP LEFT CELL IN SELECTION\n\n      if (this.getCommentMeta(cell.row, cell.col, META_COMMENT_VALUE)) {\n        hasComment = true;\n      }\n\n      return hasComment;\n    }\n\n    /**\n     * Set or update the comment-related cell meta.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} column Visual column index.\n     * @param {Object} metaObject Object defining all the comment-related meta information.\n     */\n\n  }, {\n    key: 'updateCommentMeta',\n    value: function updateCommentMeta(row, column, metaObject) {\n      var oldComment = this.hot.getCellMeta(row, column)[META_COMMENT];\n      var newComment = void 0;\n\n      if (oldComment) {\n        newComment = (0, _object.deepClone)(oldComment);\n        (0, _object.deepExtend)(newComment, metaObject);\n      } else {\n        newComment = metaObject;\n      }\n\n      this.hot.setCellMeta(row, column, META_COMMENT, newComment);\n    }\n\n    /**\n     * Get the comment related meta information.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} column Visual column index.\n     * @param {String} property Cell meta property.\n     * @returns {Mixed}\n     */\n\n  }, {\n    key: 'getCommentMeta',\n    value: function getCommentMeta(row, column, property) {\n      var cellMeta = this.hot.getCellMeta(row, column);\n\n      if (!cellMeta[META_COMMENT]) {\n        return void 0;\n      }\n\n      return cellMeta[META_COMMENT][property];\n    }\n\n    /**\n     * `mousedown` event callback.\n     *\n     * @private\n     * @param {MouseEvent} event The `mousedown` event.\n     */\n\n  }, {\n    key: 'onMouseDown',\n    value: function onMouseDown(event) {\n      this.mouseDown = true;\n\n      if (!this.hot.view || !this.hot.view.wt) {\n        return;\n      }\n\n      if (!this.contextMenuEvent && !this.targetIsCommentTextArea(event)) {\n        var eventCell = (0, _element.closest)(event.target, 'TD', 'TBODY');\n        var coordinates = null;\n\n        if (eventCell) {\n          coordinates = this.hot.view.wt.wtTable.getCoords(eventCell);\n        }\n\n        if (!eventCell || this.range.from && coordinates && (this.range.from.row !== coordinates.row || this.range.from.col !== coordinates.col)) {\n          this.hide();\n        }\n      }\n      this.contextMenuEvent = false;\n    }\n\n    /**\n     * `mouseover` event callback.\n     *\n     * @private\n     * @param {MouseEvent} event The `mouseover` event.\n     */\n\n  }, {\n    key: 'onMouseOver',\n    value: function onMouseOver(event) {\n      var priv = privatePool.get(this);\n\n      priv.cellBelowCursor = document.elementFromPoint(event.clientX, event.clientY);\n\n      if (this.mouseDown || this.editor.isFocused() || (0, _element.hasClass)(event.target, 'wtBorder') || priv.cellBelowCursor !== event.target || !this.editor) {\n        return;\n      }\n\n      if (this.targetIsCellWithComment(event)) {\n        var coordinates = this.hot.view.wt.wtTable.getCoords(event.target);\n        var range = {\n          from: new _src.CellCoords(coordinates.row, coordinates.col)\n        };\n\n        this.displaySwitch.show(range);\n      } else if ((0, _element.isChildOf)(event.target, document) && !this.targetIsCommentTextArea(event)) {\n        this.displaySwitch.hide();\n      }\n    }\n\n    /**\n     * `mouseup` event callback.\n     *\n     * @private\n     * @param {MouseEvent} event The `mouseup` event.\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp(event) {\n      this.mouseDown = false;\n    }\n\n    /** *\n     * The `afterRenderer` hook callback..\n     *\n     * @private\n     * @param {HTMLTableCellElement} TD The rendered `TD` element.\n     * @param {Object} cellProperties The rendered cell's property object.\n     */\n\n  }, {\n    key: 'onAfterRenderer',\n    value: function onAfterRenderer(TD, cellProperties) {\n      if (cellProperties[META_COMMENT] && cellProperties[META_COMMENT][META_COMMENT_VALUE]) {\n        (0, _element.addClass)(TD, cellProperties.commentedCellClassName);\n      }\n    }\n\n    /**\n     * `blur` event callback for the comment editor.\n     *\n     * @private\n     * @param {Event} event The `blur` event.\n     */\n\n  }, {\n    key: 'onEditorBlur',\n    value: function onEditorBlur(event) {\n      this.setComment();\n    }\n\n    /**\n     * `mousedown` hook. Along with `onEditorMouseUp` used to simulate the textarea resizing event.\n     *\n     * @private\n     * @param {MouseEvent} event The `mousedown` event.\n     */\n\n  }, {\n    key: 'onEditorMouseDown',\n    value: function onEditorMouseDown(event) {\n      var priv = privatePool.get(this);\n\n      priv.tempEditorDimensions = {\n        width: (0, _element.outerWidth)(event.target),\n        height: (0, _element.outerHeight)(event.target)\n      };\n    }\n\n    /**\n     * `mouseup` hook. Along with `onEditorMouseDown` used to simulate the textarea resizing event.\n     *\n     * @private\n     * @param {MouseEvent} event The `mouseup` event.\n     */\n\n  }, {\n    key: 'onEditorMouseUp',\n    value: function onEditorMouseUp(event) {\n      var priv = privatePool.get(this);\n      var currentWidth = (0, _element.outerWidth)(event.target);\n      var currentHeight = (0, _element.outerHeight)(event.target);\n\n      if (currentWidth !== priv.tempEditorDimensions.width + 1 || currentHeight !== priv.tempEditorDimensions.height + 2) {\n        this.updateCommentMeta(this.range.from.row, this.range.from.col, _defineProperty({}, META_STYLE, {\n          width: currentWidth,\n          height: currentHeight\n        }));\n      }\n    }\n\n    /**\n     * Context Menu's \"Add comment\" callback. Results in showing the comment editor.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onContextMenuAddComment',\n    value: function onContextMenuAddComment() {\n      var _this4 = this;\n\n      this.displaySwitch.cancelHiding();\n      var coords = this.hot.getSelectedRangeLast();\n\n      this.contextMenuEvent = true;\n      this.setRange({\n        from: coords.from\n      });\n      this.show();\n      setTimeout(function () {\n        if (_this4.hot) {\n          _this4.hot.deselectCell();\n          _this4.editor.focus();\n        }\n      }, 10);\n    }\n\n    /**\n     * Context Menu's \"remove comment\" callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onContextMenuRemoveComment',\n    value: function onContextMenuRemoveComment() {\n      this.contextMenuEvent = true;\n\n      var _hot$getSelectedRange = this.hot.getSelectedRangeLast(),\n          from = _hot$getSelectedRange.from,\n          to = _hot$getSelectedRange.to;\n\n      for (var i = from.row; i <= to.row; i++) {\n        for (var j = from.col; j <= to.col; j++) {\n          this.removeCommentAtCell(i, j, false);\n        }\n      }\n\n      this.hot.render();\n    }\n\n    /**\n     * Context Menu's \"make comment read-only\" callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onContextMenuMakeReadOnly',\n    value: function onContextMenuMakeReadOnly() {\n      this.contextMenuEvent = true;\n\n      var _hot$getSelectedRange2 = this.hot.getSelectedRangeLast(),\n          from = _hot$getSelectedRange2.from,\n          to = _hot$getSelectedRange2.to;\n\n      for (var i = from.row; i <= to.row; i++) {\n        for (var j = from.col; j <= to.col; j++) {\n          var currentState = !!this.getCommentMeta(i, j, META_READONLY);\n\n          this.updateCommentMeta(i, j, _defineProperty({}, META_READONLY, !currentState));\n        }\n      }\n    }\n\n    /**\n     * Add Comments plugin options to the Context Menu.\n     *\n     * @private\n     * @param {Object} defaultOptions\n     */\n\n  }, {\n    key: 'addToContextMenu',\n    value: function addToContextMenu(defaultOptions) {\n      var _this5 = this;\n\n      defaultOptions.items.push({\n        name: '---------'\n      }, {\n        key: 'commentsAddEdit',\n        name: function name() {\n          if (_this5.checkSelectionCommentsConsistency()) {\n            return _this5.hot.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_EDIT_COMMENT);\n          }\n\n          return _this5.hot.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ADD_COMMENT);\n        },\n        callback: function callback() {\n          return _this5.onContextMenuAddComment();\n        },\n        disabled: function disabled() {\n          return !(this.getSelectedLast() && !this.selection.isSelectedByCorner());\n        }\n      }, {\n        key: 'commentsRemove',\n        name: function name() {\n          return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_COMMENT);\n        },\n\n        callback: function callback() {\n          return _this5.onContextMenuRemoveComment();\n        },\n        disabled: function disabled() {\n          return _this5.hot.selection.isSelectedByCorner();\n        }\n      }, {\n        key: 'commentsReadOnly',\n        name: function name() {\n          var _this6 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT);\n          var hasProperty = (0, _utils.checkSelectionConsistency)(this.getSelectedRangeLast(), function (row, col) {\n            var readOnlyProperty = _this6.getCellMeta(row, col)[META_COMMENT];\n            if (readOnlyProperty) {\n              readOnlyProperty = readOnlyProperty[META_READONLY];\n            }\n\n            if (readOnlyProperty) {\n              return true;\n            }\n          });\n\n          if (hasProperty) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n\n        callback: function callback() {\n          return _this5.onContextMenuMakeReadOnly();\n        },\n        disabled: function disabled() {\n          return _this5.hot.selection.isSelectedByCorner() || !_this5.checkSelectionCommentsConsistency();\n        }\n      });\n    }\n\n    /**\n     * Get `displayDelay` setting of comment plugin.\n     *\n     * @returns {Number|undefined}\n     */\n\n  }, {\n    key: 'getDisplayDelaySetting',\n    value: function getDisplayDelaySetting() {\n      var commentSetting = this.hot.getSettings().comments;\n\n      if ((0, _object.isObject)(commentSetting)) {\n        return commentSetting.displayDelay;\n      }\n\n      return void 0;\n    }\n\n    /**\n     * `afterBeginEditing` hook callback.\n     *\n     * @private\n     * @param {Number} row Visual row index of the currently edited cell.\n     * @param {Number} column Visual column index of the currently edited cell.\n     */\n\n  }, {\n    key: 'onAfterBeginEditing',\n    value: function onAfterBeginEditing(row, column) {\n      this.hide();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.editor) {\n        this.editor.destroy();\n      }\n\n      if (this.displaySwitch) {\n        this.displaySwitch.destroy();\n      }\n\n      _get(Comments.prototype.__proto__ || Object.getPrototypeOf(Comments.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return Comments;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('comments', Comments);\n\nexports.default = Comments;\n\n/***/ }),\n/* 294 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Comment editor for the Comments plugin.\n *\n * @class CommentEditor\n * @plugin Comments\n */\nvar CommentEditor = function () {\n  _createClass(CommentEditor, null, [{\n    key: 'CLASS_EDITOR_CONTAINER',\n    get: function get() {\n      return 'htCommentsContainer';\n    }\n  }, {\n    key: 'CLASS_EDITOR',\n    get: function get() {\n      return 'htComments';\n    }\n  }, {\n    key: 'CLASS_INPUT',\n    get: function get() {\n      return 'htCommentTextArea';\n    }\n  }, {\n    key: 'CLASS_CELL',\n    get: function get() {\n      return 'htCommentCell';\n    }\n  }]);\n\n  function CommentEditor() {\n    _classCallCheck(this, CommentEditor);\n\n    this.editor = this.createEditor();\n    this.editorStyle = this.editor.style;\n\n    this.hidden = true;\n\n    this.hide();\n  }\n\n  /**\n   * Set position of the comments editor according to the  provided x and y coordinates.\n   *\n   * @param {Number} x X position (in pixels).\n   * @param {Number} y Y position (in pixels).\n   */\n\n\n  _createClass(CommentEditor, [{\n    key: 'setPosition',\n    value: function setPosition(x, y) {\n      this.editorStyle.left = x + 'px';\n      this.editorStyle.top = y + 'px';\n    }\n\n    /**\n     * Set the editor size according to the provided arguments.\n     *\n     * @param {Number} width Width in pixels.\n     * @param {Number} height Height in pixels.\n     */\n\n  }, {\n    key: 'setSize',\n    value: function setSize(width, height) {\n      if (width && height) {\n        var input = this.getInputElement();\n\n        input.style.width = width + 'px';\n        input.style.height = height + 'px';\n      }\n    }\n\n    /**\n     * Reset the editor size to its initial state.\n     */\n\n  }, {\n    key: 'resetSize',\n    value: function resetSize() {\n      var input = this.getInputElement();\n\n      input.style.width = '';\n      input.style.height = '';\n    }\n\n    /**\n     * Set the read-only state for the comments editor.\n     *\n     * @param {Boolean} state The new read only state.\n     */\n\n  }, {\n    key: 'setReadOnlyState',\n    value: function setReadOnlyState(state) {\n      var input = this.getInputElement();\n\n      input.readOnly = state;\n    }\n\n    /**\n     * Show the comments editor.\n     */\n\n  }, {\n    key: 'show',\n    value: function show() {\n      this.editorStyle.display = 'block';\n      this.hidden = false;\n    }\n\n    /**\n     * Hide the comments editor.\n     */\n\n  }, {\n    key: 'hide',\n    value: function hide() {\n      this.editorStyle.display = 'none';\n      this.hidden = true;\n    }\n\n    /**\n     * Checks if the editor is visible.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isVisible',\n    value: function isVisible() {\n      return this.editorStyle.display === 'block';\n    }\n\n    /**\n     * Set the comment value.\n     *\n     * @param {String} [value] The value to use.\n     */\n\n  }, {\n    key: 'setValue',\n    value: function setValue() {\n      var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      value = value || '';\n      this.getInputElement().value = value;\n    }\n\n    /**\n     * Get the comment value.\n     *\n     * @returns {String}\n     */\n\n  }, {\n    key: 'getValue',\n    value: function getValue() {\n      return this.getInputElement().value;\n    }\n\n    /**\n     * Checks if the comment input element is focused.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isFocused',\n    value: function isFocused() {\n      return document.activeElement === this.getInputElement();\n    }\n\n    /**\n     * Focus the comments input element.\n     */\n\n  }, {\n    key: 'focus',\n    value: function focus() {\n      this.getInputElement().focus();\n    }\n\n    /**\n     * Create the `textarea` to be used as a comments editor.\n     *\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createEditor',\n    value: function createEditor() {\n      var container = document.querySelector('.' + CommentEditor.CLASS_EDITOR_CONTAINER);\n      var editor = void 0;\n      var textArea = void 0;\n\n      if (!container) {\n        container = document.createElement('div');\n        (0, _element.addClass)(container, CommentEditor.CLASS_EDITOR_CONTAINER);\n        document.body.appendChild(container);\n      }\n      editor = document.createElement('div');\n      (0, _element.addClass)(editor, CommentEditor.CLASS_EDITOR);\n\n      textArea = document.createElement('textarea');\n      (0, _element.addClass)(textArea, CommentEditor.CLASS_INPUT);\n\n      editor.appendChild(textArea);\n      container.appendChild(editor);\n\n      return editor;\n    }\n\n    /**\n     * Get the input element.\n     *\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'getInputElement',\n    value: function getInputElement() {\n      return this.editor.querySelector('.' + CommentEditor.CLASS_INPUT);\n    }\n\n    /**\n     * Destroy the comments editor.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.editor.parentNode.removeChild(this.editor);\n      this.editor = null;\n      this.editorStyle = null;\n    }\n  }]);\n\n  return CommentEditor;\n}();\n\nexports.default = CommentEditor;\n\n/***/ }),\n/* 295 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _function = __webpack_require__(42);\n\nvar _object = __webpack_require__(2);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DEFAULT_DISPLAY_DELAY = 250;\nvar DEFAULT_HIDE_DELAY = 250;\n\n/**\n * Display switch for the Comments plugin. Manages the time of delayed displaying / hiding comments.\n *\n * @class DisplaySwitch\n * @plugin Comments\n */\n\nvar DisplaySwitch = function () {\n  function DisplaySwitch(displayDelay) {\n    _classCallCheck(this, DisplaySwitch);\n\n    /**\n     * Flag to determine if comment can be showed or hidden. State `true` mean that last performed action\n     * was an attempt to show comment element. State `false` mean that it was attempt to hide comment element.\n     *\n     * @type {Boolean}\n     */\n    this.wasLastActionShow = true;\n    /**\n     * Show comment after predefined delay. It keeps reference to immutable `debounce` function.\n     *\n     * @type {Function}\n     */\n    this.showDebounced = null;\n    /**\n     * Reference to timer, run by `setTimeout`, which is hiding comment\n     *\n     * @type {Number}\n     */\n    this.hidingTimer = null;\n\n    this.updateDelay(displayDelay);\n  }\n\n  /**\n   * Responsible for hiding comment after proper delay.\n   */\n\n\n  _createClass(DisplaySwitch, [{\n    key: 'hide',\n    value: function hide() {\n      var _this = this;\n\n      this.wasLastActionShow = false;\n\n      this.hidingTimer = setTimeout(function () {\n        if (_this.wasLastActionShow === false) {\n          _this.runLocalHooks('hide');\n        }\n      }, DEFAULT_HIDE_DELAY);\n    }\n\n    /**\n     * Responsible for showing comment after proper delay.\n     *\n     * @param {Object} range Coordinates of selected cell.\n     */\n\n  }, {\n    key: 'show',\n    value: function show(range) {\n      this.wasLastActionShow = true;\n      this.showDebounced(range);\n    }\n  }, {\n    key: 'cancelHiding',\n\n\n    /**\n     * Cancel hiding comment.\n     */\n    value: function cancelHiding() {\n      this.wasLastActionShow = true;\n\n      clearTimeout(this.hidingTimer);\n      this.hidingTimer = null;\n    }\n\n    /**\n     * Update the switch settings.\n     *\n     * @param {Number} displayDelay Delay of showing the comments (in milliseconds).\n     */\n\n  }, {\n    key: 'updateDelay',\n    value: function updateDelay() {\n      var _this2 = this;\n\n      var displayDelay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_DISPLAY_DELAY;\n\n      this.showDebounced = (0, _function.debounce)(function (range) {\n        if (_this2.wasLastActionShow) {\n          _this2.runLocalHooks('show', range.from.row, range.from.col);\n        }\n      }, displayDelay);\n    }\n\n    /**\n     * Destroy the switcher.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.clearLocalHooks();\n    }\n  }]);\n\n  return DisplaySwitch;\n}();\n\n(0, _object.mixin)(DisplaySwitch, _localHooks2.default);\n\nexports.default = DisplaySwitch;\n\n/***/ }),\n/* 296 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 297 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _commandExecutor = __webpack_require__(298);\n\nvar _commandExecutor2 = _interopRequireDefault(_commandExecutor);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _itemsFactory = __webpack_require__(299);\n\nvar _itemsFactory2 = _interopRequireDefault(_itemsFactory);\n\nvar _menu = __webpack_require__(311);\n\nvar _menu2 = _interopRequireDefault(_menu);\n\nvar _plugins = __webpack_require__(8);\n\nvar _event = __webpack_require__(12);\n\nvar _element = __webpack_require__(0);\n\nvar _predefinedItems = __webpack_require__(94);\n\n__webpack_require__(313);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('afterContextMenuDefaultOptions');\n_pluginHooks2.default.getSingleton().register('beforeContextMenuShow');\n_pluginHooks2.default.getSingleton().register('afterContextMenuShow');\n_pluginHooks2.default.getSingleton().register('afterContextMenuHide');\n_pluginHooks2.default.getSingleton().register('afterContextMenuExecute');\n\n/**\n * @description\n * This plugin creates the Handsontable Context Menu. It allows to create a new row or\n * column at any place in the grid among [other features](http://docs.handsontable.com/demo-context-menu.html).\n * Possible values:\n * * `true` (to enable default options),\n * * `false` (to disable completely)\n *\n * or array of any available strings:\n * * `[\"row_above\", \"row_below\", \"col_left\", \"col_right\",\n * \"remove_row\", \"remove_col\", \"---------\", \"undo\", \"redo\"]`.\n *\n * See [the context menu demo](http://docs.handsontable.com/demo-context-menu.html) for examples.\n *\n * @example\n * ```js\n * ...\n * // as a boolean\n * contextMenu: true\n * ...\n * // as a array\n * contextMenu: ['row_above', 'row_below', '---------', 'undo', 'redo']\n * ...\n * ```\n *\n * @plugin ContextMenu\n */\n\nvar ContextMenu = function (_BasePlugin) {\n  _inherits(ContextMenu, _BasePlugin);\n\n  _createClass(ContextMenu, null, [{\n    key: 'DEFAULT_ITEMS',\n\n    /**\n     * Default menu items order when `contextMenu` is enabled by `true`.\n     *\n     * @returns {Array}\n     */\n    get: function get() {\n      return [_predefinedItems.ROW_ABOVE, _predefinedItems.ROW_BELOW, _predefinedItems.SEPARATOR, _predefinedItems.COLUMN_LEFT, _predefinedItems.COLUMN_RIGHT, _predefinedItems.SEPARATOR, _predefinedItems.REMOVE_ROW, _predefinedItems.REMOVE_COLUMN, _predefinedItems.SEPARATOR, _predefinedItems.UNDO, _predefinedItems.REDO, _predefinedItems.SEPARATOR, _predefinedItems.READ_ONLY, _predefinedItems.SEPARATOR, _predefinedItems.ALIGNMENT];\n    }\n  }]);\n\n  function ContextMenu(hotInstance) {\n    _classCallCheck(this, ContextMenu);\n\n    /**\n     * Instance of {@link EventManager}.\n     *\n     * @type {EventManager}\n     */\n    var _this = _possibleConstructorReturn(this, (ContextMenu.__proto__ || Object.getPrototypeOf(ContextMenu)).call(this, hotInstance));\n\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Instance of {@link CommandExecutor}.\n     *\n     * @type {CommandExecutor}\n     */\n    _this.commandExecutor = new _commandExecutor2.default(_this.hot);\n    /**\n     * Instance of {@link ItemsFactory}.\n     *\n     * @type {ItemsFactory}\n     */\n    _this.itemsFactory = null;\n    /**\n     * Instance of {@link Menu}.\n     *\n     * @type {Menu}\n     */\n    _this.menu = null;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ContextMenu, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().contextMenu;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n      this.itemsFactory = new _itemsFactory2.default(this.hot, ContextMenu.DEFAULT_ITEMS);\n\n      var settings = this.hot.getSettings().contextMenu;\n      var predefinedItems = {\n        items: this.itemsFactory.getItems(settings)\n      };\n      this.registerEvents();\n\n      if (typeof settings.callback === 'function') {\n        this.commandExecutor.setCommonCallback(settings.callback);\n      }\n      _get(ContextMenu.prototype.__proto__ || Object.getPrototypeOf(ContextMenu.prototype), 'enablePlugin', this).call(this);\n\n      var delayedInitialization = function delayedInitialization() {\n        if (!_this2.hot) {\n          return;\n        }\n\n        _this2.hot.runHooks('afterContextMenuDefaultOptions', predefinedItems);\n\n        _this2.itemsFactory.setPredefinedItems(predefinedItems.items);\n        var menuItems = _this2.itemsFactory.getItems(settings);\n\n        _this2.menu = new _menu2.default(_this2.hot, {\n          className: 'htContextMenu',\n          keepInViewport: true\n        });\n        _this2.hot.runHooks('beforeContextMenuSetItems', menuItems);\n\n        _this2.menu.setMenuItems(menuItems);\n\n        _this2.menu.addLocalHook('beforeOpen', function () {\n          return _this2.onMenuBeforeOpen();\n        });\n        _this2.menu.addLocalHook('afterOpen', function () {\n          return _this2.onMenuAfterOpen();\n        });\n        _this2.menu.addLocalHook('afterClose', function () {\n          return _this2.onMenuAfterClose();\n        });\n        _this2.menu.addLocalHook('executeCommand', function () {\n          for (var _len = arguments.length, params = Array(_len), _key = 0; _key < _len; _key++) {\n            params[_key] = arguments[_key];\n          }\n\n          return _this2.executeCommand.apply(_this2, params);\n        });\n\n        // Register all commands. Predefined and added by user or by plugins\n        (0, _array.arrayEach)(menuItems, function (command) {\n          return _this2.commandExecutor.registerCommand(command.key, command);\n        });\n      };\n\n      this.callOnPluginsReady(function () {\n        if (_this2.isPluginsReady) {\n          setTimeout(delayedInitialization, 0);\n        } else {\n          delayedInitialization();\n        }\n      });\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(ContextMenu.prototype.__proto__ || Object.getPrototypeOf(ContextMenu.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.close();\n\n      if (this.menu) {\n        this.menu.destroy();\n        this.menu = null;\n      }\n      _get(ContextMenu.prototype.__proto__ || Object.getPrototypeOf(ContextMenu.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Register dom listeners.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this3 = this;\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'contextmenu', function (event) {\n        return _this3.onContextMenu(event);\n      });\n    }\n\n    /**\n     * Open menu and re-position it based on dom event object.\n     *\n     * @param {Event} event The event object.\n     */\n\n  }, {\n    key: 'open',\n    value: function open(event) {\n      if (!this.menu) {\n        return;\n      }\n      this.menu.open();\n      this.menu.setPosition({\n        top: parseInt((0, _event.pageY)(event), 10) - (0, _element.getWindowScrollTop)(),\n        left: parseInt((0, _event.pageX)(event), 10) - (0, _element.getWindowScrollLeft)()\n      });\n\n      // ContextMenu is not detected HotTableEnv correctly because is injected outside hot-table\n      this.menu.hotMenu.isHotTableEnv = this.hot.isHotTableEnv;\n      // Handsontable.eventManager.isHotTableEnv = this.hot.isHotTableEnv;\n    }\n\n    /**\n     * Close menu.\n     */\n\n  }, {\n    key: 'close',\n    value: function close() {\n      if (!this.menu) {\n        return;\n      }\n      this.menu.close();\n    }\n\n    /**\n     * Execute context menu command.\n     *\n     * You can execute all predefined commands:\n     *  * `'row_above'` - Insert row above\n     *  * `'row_below'` - Insert row below\n     *  * `'col_left'` - Insert column left\n     *  * `'col_right'` - Insert column right\n     *  * `'clear_column'` - Clear selected column\n     *  * `'remove_row'` - Remove row\n     *  * `'remove_col'` - Remove column\n     *  * `'undo'` - Undo last action\n     *  * `'redo'` - Redo last action\n     *  * `'make_read_only'` - Make cell read only\n     *  * `'alignment:left'` - Alignment to the left\n     *  * `'alignment:top'` - Alignment to the top\n     *  * `'alignment:right'` - Alignment to the right\n     *  * `'alignment:bottom'` - Alignment to the bottom\n     *  * `'alignment:middle'` - Alignment to the middle\n     *  * `'alignment:center'` - Alignment to the center (justify)\n     *\n     * Or you can execute command registered in settings where `key` is your command name.\n     *\n     * @param {String} commandName\n     * @param {*} params\n     */\n\n  }, {\n    key: 'executeCommand',\n    value: function executeCommand() {\n      for (var _len2 = arguments.length, params = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        params[_key2] = arguments[_key2];\n      }\n\n      this.commandExecutor.execute.apply(this.commandExecutor, params);\n    }\n\n    /**\n     * On context menu listener.\n     *\n     * @private\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onContextMenu',\n    value: function onContextMenu(event) {\n      var settings = this.hot.getSettings();\n      var showRowHeaders = settings.rowHeaders;\n      var showColHeaders = settings.colHeaders;\n\n      function isValidElement(element) {\n        return element.nodeName === 'TD' || element.parentNode.nodeName === 'TD';\n      }\n      // if event is from hot-table we must get web component element not element inside him\n      var element = event.realTarget;\n      this.close();\n\n      if ((0, _element.hasClass)(element, 'handsontableInput')) {\n        return;\n      }\n\n      event.preventDefault();\n      (0, _event.stopPropagation)(event);\n\n      if (!(showRowHeaders || showColHeaders)) {\n        if (!isValidElement(element) && !((0, _element.hasClass)(element, 'current') && (0, _element.hasClass)(element, 'wtBorder'))) {\n          return;\n        }\n      }\n\n      this.open(event);\n    }\n\n    /**\n     * On menu before open listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMenuBeforeOpen',\n    value: function onMenuBeforeOpen() {\n      this.hot.runHooks('beforeContextMenuShow', this);\n    }\n\n    /**\n     * On menu after open listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMenuAfterOpen',\n    value: function onMenuAfterOpen() {\n      this.hot.runHooks('afterContextMenuShow', this);\n    }\n\n    /**\n     * On menu after close listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMenuAfterClose',\n    value: function onMenuAfterClose() {\n      this.hot.listen();\n      this.hot.runHooks('afterContextMenuHide', this);\n    }\n\n    /**\n     * Destroy instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.close();\n\n      if (this.menu) {\n        this.menu.destroy();\n      }\n      _get(ContextMenu.prototype.__proto__ || Object.getPrototypeOf(ContextMenu.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return ContextMenu;\n}(_base2.default);\n\nContextMenu.SEPARATOR = {\n  name: _predefinedItems.SEPARATOR\n};\n\n(0, _plugins.registerPlugin)('contextMenu', ContextMenu);\n\nexports.default = ContextMenu;\n\n/***/ }),\n/* 298 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Command executor for ContextMenu.\n *\n * @class CommandExecutor\n * @plugin ContextMenu\n */\nvar CommandExecutor = function () {\n  function CommandExecutor(hotInstance) {\n    _classCallCheck(this, CommandExecutor);\n\n    this.hot = hotInstance;\n    this.commands = {};\n    this.commonCallback = null;\n  }\n\n  /**\n   * Register command.\n   *\n   * @param {String} name Command name.\n   * @param {Object} commandDescriptor Command descriptor object with properties like `key` (command id),\n   *                                   `callback` (task to execute), `name` (command name), `disabled` (command availability).\n   */\n\n\n  _createClass(CommandExecutor, [{\n    key: 'registerCommand',\n    value: function registerCommand(name, commandDescriptor) {\n      this.commands[name] = commandDescriptor;\n    }\n\n    /**\n     * Set common callback which will be trigger on every executed command.\n     *\n     * @param {Function} callback Function which will be fired on every command execute.\n     */\n\n  }, {\n    key: 'setCommonCallback',\n    value: function setCommonCallback(callback) {\n      this.commonCallback = callback;\n    }\n\n    /**\n     * Execute command by its name.\n     *\n     * @param {String} commandName Command id.\n     * @param {*} params Arguments passed to command task.\n     */\n\n  }, {\n    key: 'execute',\n    value: function execute(commandName) {\n      var _this = this;\n\n      for (var _len = arguments.length, params = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        params[_key - 1] = arguments[_key];\n      }\n\n      var commandSplit = commandName.split(':');\n      commandName = commandSplit[0];\n\n      var subCommandName = commandSplit.length === 2 ? commandSplit[1] : null;\n      var command = this.commands[commandName];\n\n      if (!command) {\n        throw new Error('Menu command \\'' + commandName + '\\' not exists.');\n      }\n      if (subCommandName && command.submenu) {\n        command = findSubCommand(subCommandName, command.submenu.items);\n      }\n      if (command.disabled === true) {\n        return;\n      }\n      if (typeof command.disabled == 'function' && command.disabled.call(this.hot) === true) {\n        return;\n      }\n      if ((0, _object.hasOwnProperty)(command, 'submenu')) {\n        return;\n      }\n      var callbacks = [];\n\n      if (typeof command.callback === 'function') {\n        callbacks.push(command.callback);\n      }\n      if (typeof this.commonCallback === 'function') {\n        callbacks.push(this.commonCallback);\n      }\n      params.unshift(commandSplit.join(':'));\n      (0, _array.arrayEach)(callbacks, function (callback) {\n        return callback.apply(_this.hot, params);\n      });\n    }\n  }]);\n\n  return CommandExecutor;\n}();\n\nfunction findSubCommand(subCommandName, subCommands) {\n  var command = void 0;\n\n  (0, _array.arrayEach)(subCommands, function (cmd) {\n    var cmds = cmd.key ? cmd.key.split(':') : null;\n\n    if (Array.isArray(cmds) && cmds[1] === subCommandName) {\n      command = cmd;\n\n      return false;\n    }\n  });\n\n  return command;\n}\n\nexports.default = CommandExecutor;\n\n/***/ }),\n/* 299 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _predefinedItems = __webpack_require__(94);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Predefined items class factory for menu items.\n *\n * @class ItemsFactory\n * @plugin ContextMenu\n */\nvar ItemsFactory = function () {\n  function ItemsFactory(hotInstance) {\n    var orderPattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n    _classCallCheck(this, ItemsFactory);\n\n    this.hot = hotInstance;\n    this.predefinedItems = (0, _predefinedItems.predefinedItems)();\n    this.defaultOrderPattern = orderPattern;\n  }\n\n  /**\n   * Set predefined items.\n   *\n   * @param {Array} predefinedItems Array of predefined items.\n   */\n\n\n  _createClass(ItemsFactory, [{\n    key: 'setPredefinedItems',\n    value: function setPredefinedItems(predefinedItems) {\n      var _this = this;\n\n      var items = {};\n\n      this.defaultOrderPattern.length = 0;\n\n      (0, _object.objectEach)(predefinedItems, function (value, key) {\n        var menuItemKey = '';\n\n        if (value.name === _predefinedItems.SEPARATOR) {\n          items[_predefinedItems.SEPARATOR] = value;\n          menuItemKey = _predefinedItems.SEPARATOR;\n\n          // Menu item added as a property to array\n        } else if (isNaN(parseInt(key, 10))) {\n          value.key = value.key === void 0 ? key : value.key;\n          items[key] = value;\n          menuItemKey = value.key;\n        } else {\n          items[value.key] = value;\n          menuItemKey = value.key;\n        }\n        _this.defaultOrderPattern.push(menuItemKey);\n      });\n      this.predefinedItems = items;\n    }\n\n    /**\n     * Get all menu items based on pattern.\n     *\n     * @param {Array|Object|Boolean} pattern Pattern which you can define by displaying menu items order. If `true` default\n     *                                       pattern will be used.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getItems',\n    value: function getItems() {\n      var pattern = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      return _getItems(pattern, this.defaultOrderPattern, this.predefinedItems);\n    }\n  }]);\n\n  return ItemsFactory;\n}();\n\nfunction _getItems() {\n  var pattern = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n  var defaultPattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n  var items = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n  var result = [];\n\n  if (pattern && pattern.items) {\n    pattern = pattern.items;\n  } else if (!Array.isArray(pattern)) {\n    pattern = defaultPattern;\n  }\n  if ((0, _object.isObject)(pattern)) {\n    (0, _object.objectEach)(pattern, function (value, key) {\n      var item = items[typeof value === 'string' ? value : key];\n\n      if (!item) {\n        item = value;\n      }\n      if ((0, _object.isObject)(value)) {\n        (0, _object.extend)(item, value);\n      } else if (typeof item === 'string') {\n        item = { name: item };\n      }\n      if (item.key === void 0) {\n        item.key = key;\n      }\n      result.push(item);\n    });\n  } else {\n    (0, _array.arrayEach)(pattern, function (name, key) {\n      var item = items[name];\n\n      // Item deleted from settings `allowInsertRow: false` etc.\n      if (!item && _predefinedItems.ITEMS.indexOf(name) >= 0) {\n        return;\n      }\n      if (!item) {\n        item = { name: name, key: '' + key };\n      }\n      if ((0, _object.isObject)(name)) {\n        (0, _object.extend)(item, name);\n      }\n      if (item.key === void 0) {\n        item.key = key;\n      }\n      result.push(item);\n    });\n  }\n\n  return result;\n}\n\nexports.default = ItemsFactory;\n\n/***/ }),\n/* 300 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = alignmentItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _separator = __webpack_require__(93);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'alignment';\n\nfunction alignmentItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT);\n    },\n    disabled: function disabled() {\n      return !(this.getSelectedRange() && !this.selection.isSelectedByCorner());\n    },\n\n    submenu: {\n      items: [{\n        key: KEY + ':left',\n        name: function name() {\n          var _this = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htLeft') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this2 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this2.getCellMeta(row, col).className;\n          });\n          var type = 'horizontal';\n          var alignment = 'htLeft';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this2.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this2.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':center',\n        name: function name() {\n          var _this3 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this3.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htCenter') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback(key, selection) {\n          var _this4 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this4.getCellMeta(row, col).className;\n          });\n          var type = 'horizontal';\n          var alignment = 'htCenter';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this4.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this4.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':right',\n        name: function name() {\n          var _this5 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this5.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htRight') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this6 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this6.getCellMeta(row, col).className;\n          });\n          var type = 'horizontal';\n          var alignment = 'htRight';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this6.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this6.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':justify',\n        name: function name() {\n          var _this7 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this7.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htJustify') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this8 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this8.getCellMeta(row, col).className;\n          });\n          var type = 'horizontal';\n          var alignment = 'htJustify';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this8.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this8.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        name: _separator.KEY\n      }, {\n        key: KEY + ':top',\n        name: function name() {\n          var _this9 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this9.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htTop') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n          return label;\n        },\n        callback: function callback() {\n          var _this10 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this10.getCellMeta(row, col).className;\n          });\n          var type = 'vertical';\n          var alignment = 'htTop';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this10.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this10.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':middle',\n        name: function name() {\n          var _this11 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this11.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htMiddle') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this12 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this12.getCellMeta(row, col).className;\n          });\n          var type = 'vertical';\n          var alignment = 'htMiddle';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this12.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this12.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':bottom',\n        name: function name() {\n          var _this13 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this13.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htBottom') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this14 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this14.getCellMeta(row, col).className;\n          });\n          var type = 'vertical';\n          var alignment = 'htBottom';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this14.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this14.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }]\n    }\n  };\n}\n\n/***/ }),\n/* 301 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = clearColumnItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'clear_column';\n\nfunction clearColumnItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_CLEAR_COLUMN);\n    },\n    callback: function callback(key, selection) {\n      var column = selection[0].start.col;\n\n      if (this.countRows()) {\n        this.populateFromArray(0, column, [[null]], Math.max(selection[0].start.row, selection[0].end.row), column, 'ContextMenu.clearColumn');\n      }\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n\n      var _selected$ = _slicedToArray(selected[0], 4),\n          startRow = _selected$[0],\n          startColumn = _selected$[1],\n          endRow = _selected$[2],\n          endColumn = _selected$[3];\n\n      var entireRowSelection = [startRow, 0, endRow, this.countCols() - 1];\n      var rowSelected = entireRowSelection.join(',') === selected.join(',');\n\n      return startColumn < 0 || this.countCols() >= this.getSettings().maxCols || rowSelected;\n    }\n  };\n}\n\n/***/ }),\n/* 302 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = columnLeftItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'col_left';\n\nfunction columnLeftItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_INSERT_LEFT);\n    },\n    callback: function callback(key, normalizedSelection) {\n      var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)];\n\n      this.alter('insert_col', latestSelection.start.col, 1, 'ContextMenu.columnLeft');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n      if (!this.isColumnModificationAllowed()) {\n        return true;\n      }\n\n      var _selected$ = _slicedToArray(selected[0], 4),\n          startRow = _selected$[0],\n          startColumn = _selected$[1],\n          endRow = _selected$[2],\n          endColumn = _selected$[3];\n\n      var entireRowSelection = [startRow, 0, endRow, this.countCols() - 1];\n      var rowSelected = entireRowSelection.join(',') === selected.join(',');\n      var onlyOneColumn = this.countCols() === 1;\n\n      return startColumn < 0 || this.countCols() >= this.getSettings().maxCols || !onlyOneColumn && rowSelected;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowInsertColumn;\n    }\n  };\n}\n\n/***/ }),\n/* 303 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = columnRightItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'col_right';\n\nfunction columnRightItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_INSERT_RIGHT);\n    },\n    callback: function callback(key, normalizedSelection) {\n      var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)];\n\n      this.alter('insert_col', latestSelection.end.col + 1, 1, 'ContextMenu.columnRight');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n      if (!this.isColumnModificationAllowed()) {\n        return true;\n      }\n\n      var _selected$ = _slicedToArray(selected[0], 4),\n          startRow = _selected$[0],\n          startColumn = _selected$[1],\n          endRow = _selected$[2],\n          endColumn = _selected$[3];\n\n      var entireRowSelection = [startRow, 0, endRow, this.countCols() - 1];\n      var rowSelected = entireRowSelection.join(',') === selected.join(',');\n      var onlyOneColumn = this.countCols() === 1;\n\n      return startColumn < 0 || this.countCols() >= this.getSettings().maxCols || !onlyOneColumn && rowSelected;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowInsertColumn;\n    }\n  };\n}\n\n/***/ }),\n/* 304 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = readOnlyItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _array = __webpack_require__(1);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'make_read_only';\n\nfunction readOnlyItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      var _this = this;\n\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_READ_ONLY);\n      var atLeastOneReadOnly = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n        return _this.getCellMeta(row, col).readOnly;\n      });\n\n      if (atLeastOneReadOnly) {\n        label = (0, _utils.markLabelAsSelected)(label);\n      }\n\n      return label;\n    },\n    callback: function callback() {\n      var _this2 = this;\n\n      var ranges = this.getSelectedRange();\n      var atLeastOneReadOnly = (0, _utils.checkSelectionConsistency)(ranges, function (row, col) {\n        return _this2.getCellMeta(row, col).readOnly;\n      });\n\n      (0, _array.arrayEach)(ranges, function (range) {\n        range.forAll(function (row, col) {\n          _this2.setCellMeta(row, col, 'readOnly', !atLeastOneReadOnly);\n        });\n      });\n\n      this.render();\n    },\n    disabled: function disabled() {\n      return !(this.getSelectedRange() && !this.selection.isSelectedByCorner());\n    }\n  };\n}\n\n/***/ }),\n/* 305 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = redoItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'redo';\n\nfunction redoItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REDO);\n    },\n    callback: function callback() {\n      this.redo();\n    },\n    disabled: function disabled() {\n      return this.undoRedo && !this.undoRedo.isRedoAvailable();\n    }\n  };\n}\n\n/***/ }),\n/* 306 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = removeColumnItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _array = __webpack_require__(1);\n\nvar _utils2 = __webpack_require__(91);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'remove_col';\n\nfunction removeColumnItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      var selection = this.getSelected();\n      var pluralForm = 0;\n\n      if (selection) {\n        if (selection.length > 1) {\n          pluralForm = 1;\n        } else {\n          var _selection$ = _slicedToArray(selection[0], 4),\n              fromColumn = _selection$[1],\n              toColumn = _selection$[3];\n\n          if (fromColumn - toColumn !== 0) {\n            pluralForm = 1;\n          }\n        }\n      }\n\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, pluralForm);\n    },\n    callback: function callback() {\n      this.alter('remove_col', (0, _utils2.transformSelectionToColumnDistance)(this.getSelected()), null, 'ContextMenu.removeColumn');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n      var totalColumns = this.countCols();\n\n      if (!selected) {\n        return true;\n      }\n\n      return this.selection.isSelectedByRowHeader() || this.selection.isSelectedByCorner() || !this.isColumnModificationAllowed() || !totalColumns;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowRemoveColumn;\n    }\n  };\n}\n\n/***/ }),\n/* 307 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = removeRowItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _array = __webpack_require__(1);\n\nvar _utils2 = __webpack_require__(91);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'remove_row';\n\nfunction removeRowItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      var selection = this.getSelected();\n      var pluralForm = 0;\n\n      if (selection) {\n        if (selection.length > 1) {\n          pluralForm = 1;\n        } else {\n          var _selection$ = _slicedToArray(selection[0], 3),\n              fromRow = _selection$[0],\n              toRow = _selection$[2];\n\n          if (fromRow - toRow !== 0) {\n            pluralForm = 1;\n          }\n        }\n      }\n\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_ROW, pluralForm);\n    },\n    callback: function callback() {\n      this.alter('remove_row', (0, _utils2.transformSelectionToRowDistance)(this.getSelected()), null, 'ContextMenu.removeRow');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n      var totalRows = this.countRows();\n\n      if (!selected) {\n        return true;\n      }\n\n      return this.selection.isSelectedByColumnHeader() || this.selection.isSelectedByCorner() || !totalRows;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowRemoveRow;\n    }\n  };\n}\n\n/***/ }),\n/* 308 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = rowAboveItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'row_above';\n\nfunction rowAboveItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ROW_ABOVE);\n    },\n    callback: function callback(key, normalizedSelection) {\n      var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)];\n\n      this.alter('insert_row', latestSelection.start.row, 1, 'ContextMenu.rowAbove');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n\n      return this.selection.isSelectedByColumnHeader() || this.countRows() >= this.getSettings().maxRows;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowInsertRow;\n    }\n  };\n}\n\n/***/ }),\n/* 309 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = rowBelowItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'row_below';\n\nfunction rowBelowItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ROW_BELOW);\n    },\n    callback: function callback(key, normalizedSelection) {\n      var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)];\n\n      this.alter('insert_row', latestSelection.end.row + 1, 1, 'ContextMenu.rowBelow');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n\n      return this.selection.isSelectedByColumnHeader() || this.countRows() >= this.getSettings().maxRows;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowInsertRow;\n    }\n  };\n}\n\n/***/ }),\n/* 310 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = undoItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'undo';\n\nfunction undoItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_UNDO);\n    },\n    callback: function callback() {\n      this.undo();\n    },\n    disabled: function disabled() {\n      return this.undoRedo && !this.undoRedo.isUndoAvailable();\n    }\n  };\n}\n\n/***/ }),\n/* 311 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _core = __webpack_require__(88);\n\nvar _core2 = _interopRequireDefault(_core);\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _cursor = __webpack_require__(312);\n\nvar _cursor2 = _interopRequireDefault(_cursor);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _object = __webpack_require__(2);\n\nvar _mixed = __webpack_require__(16);\n\nvar _function = __webpack_require__(42);\n\nvar _utils = __webpack_require__(19);\n\nvar _unicode = __webpack_require__(21);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nvar _predefinedItems = __webpack_require__(94);\n\nvar _event = __webpack_require__(12);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar MIN_WIDTH = 215;\n\n/**\n * @class Menu\n * @plugin ContextMenu\n */\n\nvar Menu = function () {\n  function Menu(hotInstance, options) {\n    _classCallCheck(this, Menu);\n\n    this.hot = hotInstance;\n    this.options = options || {\n      parent: null,\n      name: null,\n      className: '',\n      keepInViewport: true,\n      standalone: false,\n      minWidth: MIN_WIDTH\n    };\n    this.eventManager = new _eventManager2.default(this);\n    this.container = this.createContainer(this.options.name);\n    this.hotMenu = null;\n    this.hotSubMenus = {};\n    this.parentMenu = this.options.parent || null;\n    this.menuItems = null;\n    this.origOutsideClickDeselects = null;\n    this.keyEvent = false;\n\n    this.offset = {\n      above: 0,\n      below: 0,\n      left: 0,\n      right: 0\n    };\n    this._afterScrollCallback = null;\n\n    this.registerEvents();\n  }\n\n  /**\n   * Register event listeners.\n   *\n   * @private\n   */\n\n\n  _createClass(Menu, [{\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this = this;\n\n      this.eventManager.addEventListener(document.documentElement, 'mousedown', function (event) {\n        return _this.onDocumentMouseDown(event);\n      });\n    }\n\n    /**\n     * Set array of objects which defines menu items.\n     *\n     * @param {Array} menuItems Menu items to display.\n     */\n\n  }, {\n    key: 'setMenuItems',\n    value: function setMenuItems(menuItems) {\n      this.menuItems = menuItems;\n    }\n\n    /**\n     * Set offset menu position for specified area (`above`, `below`, `left` or `right`).\n     *\n     * @param {String} area Specified area name (`above`, `below`, `left` or `right`).\n     * @param {Number} offset Offset value.\n     */\n\n  }, {\n    key: 'setOffset',\n    value: function setOffset(area) {\n      var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n      this.offset[area] = offset;\n    }\n\n    /**\n     * Check if menu is using as sub-menu.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSubMenu',\n    value: function isSubMenu() {\n      return this.parentMenu !== null;\n    }\n\n    /**\n     * Open menu.\n     *\n     * @fires Hooks#beforeContextMenuShow\n     * @fires Hooks#afterContextMenuShow\n     */\n\n  }, {\n    key: 'open',\n    value: function open() {\n      var _this2 = this;\n\n      this.runLocalHooks('beforeOpen');\n\n      this.container.removeAttribute('style');\n      this.container.style.display = 'block';\n\n      var delayedOpenSubMenu = (0, _function.debounce)(function (row) {\n        return _this2.openSubMenu(row);\n      }, 300);\n      var minWidthOfMenu = this.options.minWidth || MIN_WIDTH;\n\n      var filteredItems = (0, _array.arrayFilter)(this.menuItems, function (item) {\n        return (0, _utils.isItemHidden)(item, _this2.hot);\n      });\n\n      filteredItems = (0, _utils.filterSeparators)(filteredItems, _predefinedItems.SEPARATOR);\n\n      var settings = {\n        data: filteredItems,\n        colHeaders: false,\n        autoColumnSize: true,\n        modifyColWidth: function modifyColWidth(width) {\n          if ((0, _mixed.isDefined)(width) && width < minWidthOfMenu) {\n            return minWidthOfMenu;\n          }\n\n          return width;\n        },\n\n        autoRowSize: false,\n        readOnly: true,\n        copyPaste: false,\n        columns: [{\n          data: 'name',\n          renderer: function renderer(hot, TD, row, col, prop, value) {\n            return _this2.menuItemRenderer(hot, TD, row, col, prop, value);\n          }\n        }],\n        renderAllRows: true,\n        fragmentSelection: 'cell',\n        disableVisualSelection: 'area',\n        beforeKeyDown: function beforeKeyDown(event) {\n          return _this2.onBeforeKeyDown(event);\n        },\n        afterOnCellMouseOver: function afterOnCellMouseOver(event, coords, TD) {\n          if (_this2.isAllSubMenusClosed()) {\n            delayedOpenSubMenu(coords.row);\n          } else {\n            _this2.openSubMenu(coords.row);\n          }\n        },\n        rowHeights: function rowHeights(row) {\n          return filteredItems[row].name === _predefinedItems.SEPARATOR ? 1 : 23;\n        }\n      };\n      this.origOutsideClickDeselects = this.hot.getSettings().outsideClickDeselects;\n      this.hot.getSettings().outsideClickDeselects = false;\n      this.hotMenu = new _core2.default(this.container, settings);\n      this.hotMenu.addHook('afterInit', function () {\n        return _this2.onAfterInit();\n      });\n      this.hotMenu.addHook('afterSelection', function () {\n        return _this2.onAfterSelection.apply(_this2, arguments);\n      });\n      this.hotMenu.init();\n      this.hotMenu.listen();\n      this.blockMainTableCallbacks();\n      this.runLocalHooks('afterOpen');\n    }\n\n    /**\n     * Close menu.\n     *\n     * @param {Boolean} [closeParent=false] if `true` try to close parent menu if exists.\n     */\n\n  }, {\n    key: 'close',\n    value: function close() {\n      var closeParent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (!this.isOpened()) {\n        return;\n      }\n      if (closeParent && this.parentMenu) {\n        this.parentMenu.close();\n      } else {\n        this.closeAllSubMenus();\n        this.container.style.display = 'none';\n        this.releaseMainTableCallbacks();\n        this.hotMenu.destroy();\n        this.hotMenu = null;\n        this.hot.getSettings().outsideClickDeselects = this.origOutsideClickDeselects;\n        this.runLocalHooks('afterClose');\n\n        if (this.parentMenu) {\n          this.parentMenu.hotMenu.listen();\n        }\n      }\n    }\n\n    /**\n     * Open sub menu at the provided row index.\n     *\n     * @param {Number} row Row index.\n     * @returns {Menu|Boolean} Returns created menu or `false` if no one menu was created.\n     */\n\n  }, {\n    key: 'openSubMenu',\n    value: function openSubMenu(row) {\n      if (!this.hotMenu) {\n        return false;\n      }\n      var cell = this.hotMenu.getCell(row, 0);\n\n      this.closeAllSubMenus();\n\n      if (!cell || !(0, _utils.hasSubMenu)(cell)) {\n        return false;\n      }\n      var dataItem = this.hotMenu.getSourceDataAtRow(row);\n      var subMenu = new Menu(this.hot, {\n        parent: this,\n        name: dataItem.name,\n        className: this.options.className,\n        keepInViewport: true\n      });\n      subMenu.setMenuItems(dataItem.submenu.items);\n      subMenu.open();\n      subMenu.setPosition(cell.getBoundingClientRect());\n      this.hotSubMenus[dataItem.key] = subMenu;\n\n      return subMenu;\n    }\n\n    /**\n     * Close sub menu at row index.\n     *\n     * @param {Number} row Row index.\n     */\n\n  }, {\n    key: 'closeSubMenu',\n    value: function closeSubMenu(row) {\n      var dataItem = this.hotMenu.getSourceDataAtRow(row);\n      var menus = this.hotSubMenus[dataItem.key];\n\n      if (menus) {\n        menus.destroy();\n        delete this.hotSubMenus[dataItem.key];\n      }\n    }\n\n    /**\n     * Close all opened sub menus.\n     */\n\n  }, {\n    key: 'closeAllSubMenus',\n    value: function closeAllSubMenus() {\n      var _this3 = this;\n\n      (0, _array.arrayEach)(this.hotMenu.getData(), function (value, row) {\n        return _this3.closeSubMenu(row);\n      });\n    }\n\n    /**\n     * Checks if all created and opened sub menus are closed.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isAllSubMenusClosed',\n    value: function isAllSubMenusClosed() {\n      return Object.keys(this.hotSubMenus).length === 0;\n    }\n\n    /**\n     * Destroy instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.clearLocalHooks();\n      this.close();\n      this.parentMenu = null;\n      this.eventManager.destroy();\n    }\n\n    /**\n     * Checks if menu was opened.\n     *\n     * @returns {Boolean} Returns `true` if menu was opened.\n     */\n\n  }, {\n    key: 'isOpened',\n    value: function isOpened() {\n      return this.hotMenu !== null;\n    }\n\n    /**\n     * Execute menu command.\n     *\n     * @param {Event} [event]\n     */\n\n  }, {\n    key: 'executeCommand',\n    value: function executeCommand(event) {\n      if (!this.isOpened() || !this.hotMenu.getSelectedLast()) {\n        return;\n      }\n      var selectedItem = this.hotMenu.getSourceDataAtRow(this.hotMenu.getSelectedLast()[0]);\n\n      this.runLocalHooks('select', selectedItem, event);\n\n      if (selectedItem.isCommand === false || selectedItem.name === _predefinedItems.SEPARATOR) {\n        return;\n      }\n      var selRanges = this.hot.getSelectedRange();\n      var normalizedSelection = selRanges ? (0, _utils.normalizeSelection)(selRanges) : [];\n      var autoClose = true;\n\n      // Don't close context menu if item is disabled or it has submenu\n      if (selectedItem.disabled === true || typeof selectedItem.disabled === 'function' && selectedItem.disabled.call(this.hot) === true || selectedItem.submenu) {\n        autoClose = false;\n      }\n\n      this.runLocalHooks('executeCommand', selectedItem.key, normalizedSelection, event);\n\n      if (this.isSubMenu()) {\n        this.parentMenu.runLocalHooks('executeCommand', selectedItem.key, normalizedSelection, event);\n      }\n\n      if (autoClose) {\n        this.close(true);\n      }\n    }\n\n    /**\n     * Set menu position based on dom event or based on literal object.\n     *\n     * @param {Event|Object} coords Event or literal Object with coordinates.\n     */\n\n  }, {\n    key: 'setPosition',\n    value: function setPosition(coords) {\n      var cursor = new _cursor2.default(coords);\n\n      if (this.options.keepInViewport) {\n        if (cursor.fitsBelow(this.container)) {\n          this.setPositionBelowCursor(cursor);\n        } else if (cursor.fitsAbove(this.container)) {\n          this.setPositionAboveCursor(cursor);\n        } else {\n          this.setPositionBelowCursor(cursor);\n        }\n        if (cursor.fitsOnRight(this.container)) {\n          this.setPositionOnRightOfCursor(cursor);\n        } else {\n          this.setPositionOnLeftOfCursor(cursor);\n        }\n      } else {\n        this.setPositionBelowCursor(cursor);\n        this.setPositionOnRightOfCursor(cursor);\n      }\n    }\n\n    /**\n     * Set menu position above cursor object.\n     *\n     * @param {Cursor} cursor `Cursor` object.\n     */\n\n  }, {\n    key: 'setPositionAboveCursor',\n    value: function setPositionAboveCursor(cursor) {\n      var top = this.offset.above + cursor.top - this.container.offsetHeight;\n\n      if (this.isSubMenu()) {\n        top = cursor.top + cursor.cellHeight - this.container.offsetHeight + 3;\n      }\n      this.container.style.top = top + 'px';\n    }\n\n    /**\n     * Set menu position below cursor object.\n     *\n     * @param {Cursor} cursor `Cursor` object.\n     */\n\n  }, {\n    key: 'setPositionBelowCursor',\n    value: function setPositionBelowCursor(cursor) {\n      var top = this.offset.below + cursor.top;\n\n      if (this.isSubMenu()) {\n        top = cursor.top - 1;\n      }\n      this.container.style.top = top + 'px';\n    }\n\n    /**\n     * Set menu position on the right of cursor object.\n     *\n     * @param {Cursor} cursor `Cursor` object.\n     */\n\n  }, {\n    key: 'setPositionOnRightOfCursor',\n    value: function setPositionOnRightOfCursor(cursor) {\n      var left = void 0;\n\n      if (this.isSubMenu()) {\n        left = 1 + cursor.left + cursor.cellWidth;\n      } else {\n        left = this.offset.right + 1 + cursor.left;\n      }\n\n      this.container.style.left = left + 'px';\n    }\n\n    /**\n     * Set menu position on the left of cursor object.\n     *\n     * @param {Cursor} cursor `Cursor` object.\n     */\n\n  }, {\n    key: 'setPositionOnLeftOfCursor',\n    value: function setPositionOnLeftOfCursor(cursor) {\n      var left = this.offset.left + cursor.left - this.container.offsetWidth + (0, _element.getScrollbarWidth)() + 4;\n\n      this.container.style.left = left + 'px';\n    }\n\n    /**\n     * Select first cell in opened menu.\n     */\n\n  }, {\n    key: 'selectFirstCell',\n    value: function selectFirstCell() {\n      var cell = this.hotMenu.getCell(0, 0);\n\n      if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {\n        this.selectNextCell(0, 0);\n      } else {\n        this.hotMenu.selectCell(0, 0);\n      }\n    }\n\n    /**\n     * Select last cell in opened menu.\n     */\n\n  }, {\n    key: 'selectLastCell',\n    value: function selectLastCell() {\n      var lastRow = this.hotMenu.countRows() - 1;\n      var cell = this.hotMenu.getCell(lastRow, 0);\n\n      if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {\n        this.selectPrevCell(lastRow, 0);\n      } else {\n        this.hotMenu.selectCell(lastRow, 0);\n      }\n    }\n\n    /**\n     * Select next cell in opened menu.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} col Column index.\n     */\n\n  }, {\n    key: 'selectNextCell',\n    value: function selectNextCell(row, col) {\n      var nextRow = row + 1;\n      var cell = nextRow < this.hotMenu.countRows() ? this.hotMenu.getCell(nextRow, col) : null;\n\n      if (!cell) {\n        return;\n      }\n      if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {\n        this.selectNextCell(nextRow, col);\n      } else {\n        this.hotMenu.selectCell(nextRow, col);\n      }\n    }\n\n    /**\n     * Select previous cell in opened menu.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} col Column index.\n     */\n\n  }, {\n    key: 'selectPrevCell',\n    value: function selectPrevCell(row, col) {\n      var prevRow = row - 1;\n      var cell = prevRow >= 0 ? this.hotMenu.getCell(prevRow, col) : null;\n\n      if (!cell) {\n        return;\n      }\n      if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {\n        this.selectPrevCell(prevRow, col);\n      } else {\n        this.hotMenu.selectCell(prevRow, col);\n      }\n    }\n\n    /**\n     * Menu item renderer.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'menuItemRenderer',\n    value: function menuItemRenderer(hot, TD, row, col, prop, value) {\n      var _this4 = this;\n\n      var item = hot.getSourceDataAtRow(row);\n      var wrapper = document.createElement('div');\n\n      var isSubMenu = function isSubMenu(item) {\n        return (0, _object.hasOwnProperty)(item, 'submenu');\n      };\n      var itemIsSeparator = function itemIsSeparator(item) {\n        return new RegExp(_predefinedItems.SEPARATOR, 'i').test(item.name);\n      };\n      var itemIsDisabled = function itemIsDisabled(item) {\n        return item.disabled === true || typeof item.disabled == 'function' && item.disabled.call(_this4.hot) === true;\n      };\n      var itemIsSelectionDisabled = function itemIsSelectionDisabled(item) {\n        return item.disableSelection;\n      };\n\n      if (typeof value === 'function') {\n        value = value.call(this.hot);\n      }\n      (0, _element.empty)(TD);\n      (0, _element.addClass)(wrapper, 'htItemWrapper');\n      TD.appendChild(wrapper);\n\n      if (itemIsSeparator(item)) {\n        (0, _element.addClass)(TD, 'htSeparator');\n      } else if (typeof item.renderer === 'function') {\n        (0, _element.addClass)(TD, 'htCustomMenuRenderer');\n        TD.appendChild(item.renderer(hot, wrapper, row, col, prop, value));\n      } else {\n        (0, _element.fastInnerHTML)(wrapper, value);\n      }\n      if (itemIsDisabled(item)) {\n        (0, _element.addClass)(TD, 'htDisabled');\n        this.eventManager.addEventListener(TD, 'mouseenter', function () {\n          return hot.deselectCell();\n        });\n      } else if (itemIsSelectionDisabled(item)) {\n        (0, _element.addClass)(TD, 'htSelectionDisabled');\n        this.eventManager.addEventListener(TD, 'mouseenter', function () {\n          return hot.deselectCell();\n        });\n      } else if (isSubMenu(item)) {\n        (0, _element.addClass)(TD, 'htSubmenu');\n\n        if (itemIsSelectionDisabled(item)) {\n          this.eventManager.addEventListener(TD, 'mouseenter', function () {\n            return hot.deselectCell();\n          });\n        } else {\n          this.eventManager.addEventListener(TD, 'mouseenter', function () {\n            return hot.selectCell(row, col, void 0, void 0, false, false);\n          });\n        }\n      } else {\n        (0, _element.removeClass)(TD, 'htSubmenu');\n        (0, _element.removeClass)(TD, 'htDisabled');\n\n        if (itemIsSelectionDisabled(item)) {\n          this.eventManager.addEventListener(TD, 'mouseenter', function () {\n            return hot.deselectCell();\n          });\n        } else {\n          this.eventManager.addEventListener(TD, 'mouseenter', function () {\n            return hot.selectCell(row, col, void 0, void 0, false, false);\n          });\n        }\n      }\n    }\n\n    /**\n     * Create container/wrapper for handsontable.\n     *\n     * @private\n     * @param {String} [name] Class name.\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createContainer',\n    value: function createContainer() {\n      var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      var container = void 0;\n\n      if (name) {\n        if ((0, _function.isFunction)(name)) {\n          name = name.call(this.hot);\n\n          if (name === null || (0, _mixed.isUndefined)(name)) {\n            name = '';\n          } else {\n            name = name.toString();\n          }\n        }\n\n        name = name.replace(/[^A-z0-9]/g, '_');\n        name = this.options.className + 'Sub_' + name;\n\n        container = document.querySelector('.' + this.options.className + '.' + name);\n      } else {\n        container = document.querySelector('.' + this.options.className);\n      }\n\n      if (!container) {\n        container = document.createElement('div');\n\n        (0, _element.addClass)(container, 'htMenu ' + this.options.className);\n\n        if (name) {\n          (0, _element.addClass)(container, name);\n        }\n        document.getElementsByTagName('body')[0].appendChild(container);\n      }\n\n      return container;\n    }\n\n    /**\n     * @private\n     */\n\n  }, {\n    key: 'blockMainTableCallbacks',\n    value: function blockMainTableCallbacks() {\n      this._afterScrollCallback = function () {};\n      this.hot.addHook('afterScrollVertically', this._afterScrollCallback);\n      this.hot.addHook('afterScrollHorizontally', this._afterScrollCallback);\n    }\n\n    /**\n     * @private\n     */\n\n  }, {\n    key: 'releaseMainTableCallbacks',\n    value: function releaseMainTableCallbacks() {\n      if (this._afterScrollCallback) {\n        this.hot.removeHook('afterScrollVertically', this._afterScrollCallback);\n        this.hot.removeHook('afterScrollHorizontally', this._afterScrollCallback);\n        this._afterScrollCallback = null;\n      }\n    }\n\n    /**\n     * On before key down listener.\n     *\n     * @private\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onBeforeKeyDown',\n    value: function onBeforeKeyDown(event) {\n      var selection = this.hotMenu.getSelectedLast();\n      var stopEvent = false;\n      this.keyEvent = true;\n\n      switch (event.keyCode) {\n        case _unicode.KEY_CODES.ESCAPE:\n          this.close();\n          stopEvent = true;\n          break;\n\n        case _unicode.KEY_CODES.ENTER:\n          if (selection) {\n            if (this.hotMenu.getSourceDataAtRow(selection[0]).submenu) {\n              stopEvent = true;\n            } else {\n              this.executeCommand(event);\n              this.close(true);\n            }\n          }\n          break;\n\n        case _unicode.KEY_CODES.ARROW_DOWN:\n          if (selection) {\n            this.selectNextCell(selection[0], selection[1]);\n          } else {\n            this.selectFirstCell();\n          }\n          stopEvent = true;\n          break;\n\n        case _unicode.KEY_CODES.ARROW_UP:\n          if (selection) {\n            this.selectPrevCell(selection[0], selection[1]);\n          } else {\n            this.selectLastCell();\n          }\n          stopEvent = true;\n          break;\n\n        case _unicode.KEY_CODES.ARROW_RIGHT:\n          if (selection) {\n            var menu = this.openSubMenu(selection[0]);\n\n            if (menu) {\n              menu.selectFirstCell();\n            }\n          }\n          stopEvent = true;\n\n          break;\n\n        case _unicode.KEY_CODES.ARROW_LEFT:\n          if (selection && this.isSubMenu()) {\n            this.close();\n\n            if (this.parentMenu) {\n              this.parentMenu.hotMenu.listen();\n            }\n            stopEvent = true;\n          }\n          break;\n        default:\n          break;\n      }\n      if (stopEvent) {\n        event.preventDefault();\n        (0, _event.stopImmediatePropagation)(event);\n      }\n\n      this.keyEvent = false;\n    }\n\n    /**\n     * On after init listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      var data = this.hotMenu.getSettings().data;\n      var hiderStyle = this.hotMenu.view.wt.wtTable.hider.style;\n      var holderStyle = this.hotMenu.view.wt.wtTable.holder.style;\n      var currentHiderWidth = parseInt(hiderStyle.width, 10);\n\n      var realHeight = (0, _array.arrayReduce)(data, function (accumulator, value) {\n        return accumulator + (value.name === _predefinedItems.SEPARATOR ? 1 : 26);\n      }, 0);\n\n      holderStyle.width = currentHiderWidth + 22 + 'px';\n      holderStyle.height = realHeight + 4 + 'px';\n      hiderStyle.height = holderStyle.height;\n    }\n\n    /**\n     * On after selection listener.\n     *\n     * @param {Number} r Selection start row index.\n     * @param {Number} c Selection start column index.\n     * @param {Number} r2 Selection end row index.\n     * @param {Number} c2 Selection end column index.\n     * @param {Object} preventScrolling Object with `value` property where its value change will be observed.\n     * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n     */\n\n  }, {\n    key: 'onAfterSelection',\n    value: function onAfterSelection(r, c, r2, c2, preventScrolling) {\n      if (this.keyEvent === false) {\n        preventScrolling.value = true;\n      }\n    }\n\n    /**\n     * Document mouse down listener.\n     *\n     * @private\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onDocumentMouseDown',\n    value: function onDocumentMouseDown(event) {\n      if (!this.isOpened()) {\n        return;\n      }\n      if (this.container && (0, _element.isChildOf)(event.target, this.container)) {\n        this.executeCommand(event);\n      }\n      // Close menu when clicked element is not belongs to menu itself\n      if (this.options.standalone && this.hotMenu && !(0, _element.isChildOf)(event.target, this.hotMenu.rootElement)) {\n        this.close(true);\n\n        // Automatically close menu when clicked element is not belongs to menu or submenu (not necessarily to itself)\n      } else if ((this.isAllSubMenusClosed() || this.isSubMenu()) && !(0, _element.isChildOf)(event.target, '.htMenu') && (0, _element.isChildOf)(event.target, document)) {\n        this.close(true);\n      }\n    }\n  }]);\n\n  return Menu;\n}();\n\n(0, _object.mixin)(Menu, _localHooks2.default);\n\nexports.default = Menu;\n\n/***/ }),\n/* 312 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _event = __webpack_require__(12);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Helper class for checking if element will fit at the desired side of cursor.\n *\n * @class Cursor\n * @plugin ContextMenu\n */\nvar Cursor = function () {\n  function Cursor(object) {\n    _classCallCheck(this, Cursor);\n\n    var windowScrollTop = (0, _element.getWindowScrollTop)();\n    var windowScrollLeft = (0, _element.getWindowScrollLeft)();\n    var top = void 0,\n        topRelative = void 0;\n    var left = void 0,\n        leftRelative = void 0;\n    var cellHeight = void 0,\n        cellWidth = void 0;\n\n    this.type = this.getSourceType(object);\n\n    if (this.type === 'literal') {\n      top = parseInt(object.top, 10);\n      left = parseInt(object.left, 10);\n      cellHeight = object.height || 0;\n      cellWidth = object.width || 0;\n      topRelative = top;\n      leftRelative = left;\n      top += windowScrollTop;\n      left += windowScrollLeft;\n    } else if (this.type === 'event') {\n      top = parseInt((0, _event.pageY)(object), 10);\n      left = parseInt((0, _event.pageX)(object), 10);\n      cellHeight = object.target.clientHeight;\n      cellWidth = object.target.clientWidth;\n      topRelative = top - windowScrollTop;\n      leftRelative = left - windowScrollLeft;\n    }\n\n    this.top = top;\n    this.topRelative = topRelative;\n    this.left = left;\n    this.leftRelative = leftRelative;\n    this.scrollTop = windowScrollTop;\n    this.scrollLeft = windowScrollLeft;\n    this.cellHeight = cellHeight;\n    this.cellWidth = cellWidth;\n  }\n\n  /**\n   * Get source type name.\n   *\n   * @param {*} object Event or Object with coordinates.\n   * @returns {String} Returns one of this values: `'literal'`, `'event'`.\n   */\n\n\n  _createClass(Cursor, [{\n    key: 'getSourceType',\n    value: function getSourceType(object) {\n      var type = 'literal';\n\n      if (object instanceof Event) {\n        type = 'event';\n      }\n\n      return type;\n    }\n\n    /**\n     * Checks if element can be placed above the cursor.\n     *\n     * @param {HTMLElement} element Element to check if it's size will fit above the cursor.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'fitsAbove',\n    value: function fitsAbove(element) {\n      return this.topRelative >= element.offsetHeight;\n    }\n\n    /**\n     * Checks if element can be placed below the cursor.\n     *\n     * @param {HTMLElement} element Element to check if it's size will fit below the cursor.\n     * @param {Number} [viewportHeight] The viewport height.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'fitsBelow',\n    value: function fitsBelow(element) {\n      var viewportHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window.innerHeight;\n\n      return this.topRelative + element.offsetHeight <= viewportHeight;\n    }\n\n    /**\n     * Checks if element can be placed on the right of the cursor.\n     *\n     * @param {HTMLElement} element Element to check if it's size will fit on the right of the cursor.\n     * @param {Number} [viewportWidth] The viewport width.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'fitsOnRight',\n    value: function fitsOnRight(element) {\n      var viewportWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window.innerWidth;\n\n      return this.leftRelative + this.cellWidth + element.offsetWidth <= viewportWidth;\n    }\n\n    /**\n     * Checks if element can be placed on the left on the cursor.\n     *\n     * @param {HTMLElement} element Element to check if it's size will fit on the left of the cursor.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'fitsOnLeft',\n    value: function fitsOnLeft(element) {\n      return this.leftRelative >= element.offsetWidth;\n    }\n  }]);\n\n  return Cursor;\n}();\n\nexports.default = Cursor;\n\n/***/ }),\n/* 313 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 314 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _SheetClip = __webpack_require__(191);\n\nvar _SheetClip2 = _interopRequireDefault(_SheetClip);\n\nvar _src = __webpack_require__(4);\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nvar _textarea = __webpack_require__(315);\n\nvar _textarea2 = _interopRequireDefault(_textarea);\n\nvar _copy = __webpack_require__(316);\n\nvar _copy2 = _interopRequireDefault(_copy);\n\nvar _cut = __webpack_require__(317);\n\nvar _cut2 = _interopRequireDefault(_cut);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _pasteEvent = __webpack_require__(318);\n\nvar _pasteEvent2 = _interopRequireDefault(_pasteEvent);\n\n__webpack_require__(320);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('afterCopyLimit');\n_pluginHooks2.default.getSingleton().register('modifyCopyableRange');\n_pluginHooks2.default.getSingleton().register('beforeCut');\n_pluginHooks2.default.getSingleton().register('afterCut');\n_pluginHooks2.default.getSingleton().register('beforePaste');\n_pluginHooks2.default.getSingleton().register('afterPaste');\n_pluginHooks2.default.getSingleton().register('beforeCopy');\n_pluginHooks2.default.getSingleton().register('afterCopy');\n\nvar ROWS_LIMIT = 1000;\nvar COLUMNS_LIMIT = 1000;\nvar privatePool = new WeakMap();\n\n/**\n * @description\n * This plugin enables the copy/paste functionality in the Handsontable.\n *\n * @example\n * ```js\n * ...\n * copyPaste: true,\n * ...\n * ```\n * @class CopyPaste\n * @plugin CopyPaste\n */\n\nvar CopyPaste = function (_BasePlugin) {\n  _inherits(CopyPaste, _BasePlugin);\n\n  function CopyPaste(hotInstance) {\n    _classCallCheck(this, CopyPaste);\n\n    /**\n     * Event manager\n     *\n     * @type {EventManager}\n     */\n    var _this = _possibleConstructorReturn(this, (CopyPaste.__proto__ || Object.getPrototypeOf(CopyPaste)).call(this, hotInstance));\n\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Maximum number of columns than can be copied to clipboard using <kbd>CTRL</kbd> + <kbd>C</kbd>.\n     *\n     * @private\n     * @type {Number}\n     * @default 1000\n     */\n    _this.columnsLimit = COLUMNS_LIMIT;\n    /**\n     * Ranges of the cells coordinates, which should be used to copy/cut/paste actions.\n     *\n     * @private\n     * @type {Array}\n     */\n    _this.copyableRanges = [];\n    /**\n     * Defines paste (<kbd>CTRL</kbd> + <kbd>V</kbd>) behavior.\n     * * Default value `\"overwrite\"` will paste clipboard value over current selection.\n     * * When set to `\"shift_down\"`, clipboard data will be pasted in place of current selection, while all selected cells are moved down.\n     * * When set to `\"shift_right\"`, clipboard data will be pasted in place of current selection, while all selected cells are moved right.\n     *\n     * @private\n     * @type {String}\n     * @default 'overwrite'\n     */\n    _this.pasteMode = 'overwrite';\n    /**\n     * Maximum number of rows than can be copied to clipboard using <kbd>CTRL</kbd> + <kbd>C</kbd>.\n     *\n     * @private\n     * @type {Number}\n     * @default 1000\n     */\n    _this.rowsLimit = ROWS_LIMIT;\n    /**\n     * The `textarea` element which is necessary to process copying, cutting off and pasting.\n     *\n     * @private\n     * @type {HTMLElement}\n     * @default undefined\n     */\n    _this.textarea = void 0;\n\n    privatePool.set(_this, {\n      isTriggeredByCopy: false,\n      isTriggeredByCut: false,\n      isBeginEditing: false,\n      isFragmentSelectionEnabled: false\n    });\n    return _this;\n  }\n\n  /**\n   * Check if plugin is enabled.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(CopyPaste, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().copyPaste;\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n      var settings = this.hot.getSettings();\n      var priv = privatePool.get(this);\n\n      this.textarea = _textarea2.default.getSingleton();\n      priv.isFragmentSelectionEnabled = settings.fragmentSelection;\n\n      if (_typeof(settings.copyPaste) === 'object') {\n        this.pasteMode = settings.copyPaste.pasteMode || this.pasteMode;\n        this.rowsLimit = settings.copyPaste.rowsLimit || this.rowsLimit;\n        this.columnsLimit = settings.copyPaste.columnsLimit || this.columnsLimit;\n      }\n\n      this.addHook('afterContextMenuDefaultOptions', function (options) {\n        return _this2.onAfterContextMenuDefaultOptions(options);\n      });\n      this.addHook('afterSelectionEnd', function () {\n        return _this2.onAfterSelectionEnd();\n      });\n\n      this.registerEvents();\n\n      _get(CopyPaste.prototype.__proto__ || Object.getPrototypeOf(CopyPaste.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(CopyPaste.prototype.__proto__ || Object.getPrototypeOf(CopyPaste.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      if (this.textarea) {\n        this.textarea.destroy();\n      }\n\n      _get(CopyPaste.prototype.__proto__ || Object.getPrototypeOf(CopyPaste.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Prepares copyable text from the cells selection in the invisible textarea.\n     *\n     * @function setCopyable\n     * @memberof CopyPaste#\n     */\n\n  }, {\n    key: 'setCopyableText',\n    value: function setCopyableText() {\n      var selRange = this.hot.getSelectedRangeLast();\n\n      if (!selRange) {\n        return;\n      }\n      var topLeft = selRange.getTopLeftCorner();\n      var bottomRight = selRange.getBottomRightCorner();\n      var startRow = topLeft.row;\n      var startCol = topLeft.col;\n      var endRow = bottomRight.row;\n      var endCol = bottomRight.col;\n      var finalEndRow = Math.min(endRow, startRow + this.rowsLimit - 1);\n      var finalEndCol = Math.min(endCol, startCol + this.columnsLimit - 1);\n\n      this.copyableRanges.length = 0;\n\n      this.copyableRanges.push({\n        startRow: startRow,\n        startCol: startCol,\n        endRow: finalEndRow,\n        endCol: finalEndCol\n      });\n\n      this.copyableRanges = this.hot.runHooks('modifyCopyableRange', this.copyableRanges);\n\n      if (endRow !== finalEndRow || endCol !== finalEndCol) {\n        this.hot.runHooks('afterCopyLimit', endRow - startRow + 1, endCol - startCol + 1, this.rowsLimit, this.columnsLimit);\n      }\n    }\n\n    /**\n     * Create copyable text releated to range objects.\n     *\n     * @since 0.19.0\n     * @param {Array} ranges Array of Objects with properties `startRow`, `endRow`, `startCol` and `endCol`.\n     * @returns {String} Returns string which will be copied into clipboard.\n     */\n\n  }, {\n    key: 'getRangedCopyableData',\n    value: function getRangedCopyableData(ranges) {\n      var _this3 = this;\n\n      var dataSet = [];\n      var copyableRows = [];\n      var copyableColumns = [];\n\n      // Count all copyable rows and columns\n      (0, _array.arrayEach)(ranges, function (range) {\n        (0, _number.rangeEach)(range.startRow, range.endRow, function (row) {\n          if (copyableRows.indexOf(row) === -1) {\n            copyableRows.push(row);\n          }\n        });\n        (0, _number.rangeEach)(range.startCol, range.endCol, function (column) {\n          if (copyableColumns.indexOf(column) === -1) {\n            copyableColumns.push(column);\n          }\n        });\n      });\n      // Concat all rows and columns data defined in ranges into one copyable string\n      (0, _array.arrayEach)(copyableRows, function (row) {\n        var rowSet = [];\n\n        (0, _array.arrayEach)(copyableColumns, function (column) {\n          rowSet.push(_this3.hot.getCopyableData(row, column));\n        });\n\n        dataSet.push(rowSet);\n      });\n\n      return _SheetClip2.default.stringify(dataSet);\n    }\n\n    /**\n     * Create copyable text releated to range objects.\n     *\n     * @since 0.31.1\n     * @param {Array} ranges Array of Objects with properties `startRow`, `startCol`, `endRow` and `endCol`.\n     * @returns {Array} Returns array of arrays which will be copied into clipboard.\n     */\n\n  }, {\n    key: 'getRangedData',\n    value: function getRangedData(ranges) {\n      var _this4 = this;\n\n      var dataSet = [];\n      var copyableRows = [];\n      var copyableColumns = [];\n\n      // Count all copyable rows and columns\n      (0, _array.arrayEach)(ranges, function (range) {\n        (0, _number.rangeEach)(range.startRow, range.endRow, function (row) {\n          if (copyableRows.indexOf(row) === -1) {\n            copyableRows.push(row);\n          }\n        });\n        (0, _number.rangeEach)(range.startCol, range.endCol, function (column) {\n          if (copyableColumns.indexOf(column) === -1) {\n            copyableColumns.push(column);\n          }\n        });\n      });\n      // Concat all rows and columns data defined in ranges into one copyable string\n      (0, _array.arrayEach)(copyableRows, function (row) {\n        var rowSet = [];\n\n        (0, _array.arrayEach)(copyableColumns, function (column) {\n          rowSet.push(_this4.hot.getCopyableData(row, column));\n        });\n\n        dataSet.push(rowSet);\n      });\n\n      return dataSet;\n    }\n\n    /**\n     * Copy action.\n     */\n\n  }, {\n    key: 'copy',\n    value: function copy() {\n      var priv = privatePool.get(this);\n\n      priv.isTriggeredByCopy = true;\n\n      this.textarea.select();\n      document.execCommand('copy');\n    }\n\n    /**\n     * Cut action.\n     */\n\n  }, {\n    key: 'cut',\n    value: function cut() {\n      var priv = privatePool.get(this);\n\n      priv.isTriggeredByCut = true;\n\n      this.textarea.select();\n      document.execCommand('cut');\n    }\n\n    /**\n     * Simulated paste action.\n     *\n     * @param {String} [value=''] New value, which should be `pasted`.\n     */\n\n  }, {\n    key: 'paste',\n    value: function paste() {\n      var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      var pasteData = new _pasteEvent2.default();\n      pasteData.clipboardData.setData('text/plain', value);\n\n      this.onPaste(pasteData);\n    }\n\n    /**\n     * Register event listeners.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this5 = this;\n\n      this.eventManager.addEventListener(this.textarea.element, 'paste', function (event) {\n        return _this5.onPaste(event);\n      });\n      this.eventManager.addEventListener(this.textarea.element, 'cut', function (event) {\n        return _this5.onCut(event);\n      });\n      this.eventManager.addEventListener(this.textarea.element, 'copy', function (event) {\n        return _this5.onCopy(event);\n      });\n    }\n\n    /**\n     * `copy` event callback on textarea element.\n     *\n     * @param {Event} event ClipboardEvent.\n     * @private\n     */\n\n  }, {\n    key: 'onCopy',\n    value: function onCopy(event) {\n      var priv = privatePool.get(this);\n\n      if (!this.hot.isListening() && !priv.isTriggeredByCopy) {\n        return;\n      }\n\n      this.setCopyableText();\n      priv.isTriggeredByCopy = false;\n\n      var rangedData = this.getRangedData(this.copyableRanges);\n      var allowCopying = !!this.hot.runHooks('beforeCopy', rangedData, this.copyableRanges);\n      var value = '';\n\n      if (allowCopying) {\n        value = _SheetClip2.default.stringify(rangedData);\n\n        if (event && event.clipboardData) {\n          event.clipboardData.setData('text/plain', value);\n        } else if (typeof ClipboardEvent === 'undefined') {\n          window.clipboardData.setData('Text', value);\n        }\n\n        this.hot.runHooks('afterCopy', rangedData, this.copyableRanges);\n      }\n\n      event.preventDefault();\n    }\n\n    /**\n     * `cut` event callback on textarea element.\n     *\n     * @param {Event} event ClipboardEvent.\n     * @private\n     */\n\n  }, {\n    key: 'onCut',\n    value: function onCut(event) {\n      var priv = privatePool.get(this);\n\n      if (!this.hot.isListening() && !priv.isTriggeredByCut) {\n        return;\n      }\n\n      this.setCopyableText();\n      priv.isTriggeredByCut = false;\n\n      var rangedData = this.getRangedData(this.copyableRanges);\n      var allowCuttingOut = !!this.hot.runHooks('beforeCut', rangedData, this.copyableRanges);\n      var value = void 0;\n\n      if (allowCuttingOut) {\n        value = _SheetClip2.default.stringify(rangedData);\n\n        if (event && event.clipboardData) {\n          event.clipboardData.setData('text/plain', value);\n        } else if (typeof ClipboardEvent === 'undefined') {\n          window.clipboardData.setData('Text', value);\n        }\n\n        this.hot.emptySelectedCells();\n        this.hot.runHooks('afterCut', rangedData, this.copyableRanges);\n      }\n\n      event.preventDefault();\n    }\n\n    /**\n     * `paste` event callback on textarea element.\n     *\n     * @param {Event} event ClipboardEvent or pseudo ClipboardEvent, if paste was called manually.\n     * @private\n     */\n\n  }, {\n    key: 'onPaste',\n    value: function onPaste(event) {\n      var _this6 = this;\n\n      if (!this.hot.isListening()) {\n        return;\n      }\n      if (event && event.preventDefault) {\n        event.preventDefault();\n      }\n\n      var inputArray = void 0;\n\n      if (event && typeof event.clipboardData !== 'undefined') {\n        this.textarea.setValue(event.clipboardData.getData('text/plain'));\n      } else if (typeof ClipboardEvent === 'undefined' && typeof window.clipboardData !== 'undefined') {\n        this.textarea.setValue(window.clipboardData.getData('Text'));\n      }\n\n      inputArray = _SheetClip2.default.parse(this.textarea.getValue());\n      this.textarea.setValue(' ');\n\n      if (inputArray.length === 0) {\n        return;\n      }\n\n      var allowPasting = !!this.hot.runHooks('beforePaste', inputArray, this.copyableRanges);\n\n      if (!allowPasting) {\n        return;\n      }\n\n      var selected = this.hot.getSelectedLast();\n      var coordsFrom = new _src.CellCoords(selected[0], selected[1]);\n      var coordsTo = new _src.CellCoords(selected[2], selected[3]);\n      var cellRange = new _src.CellRange(coordsFrom, coordsFrom, coordsTo);\n      var topLeftCorner = cellRange.getTopLeftCorner();\n      var bottomRightCorner = cellRange.getBottomRightCorner();\n      var areaStart = topLeftCorner;\n      var areaEnd = new _src.CellCoords(Math.max(bottomRightCorner.row, inputArray.length - 1 + topLeftCorner.row), Math.max(bottomRightCorner.col, inputArray[0].length - 1 + topLeftCorner.col));\n\n      var isSelRowAreaCoverInputValue = coordsTo.row - coordsFrom.row >= inputArray.length - 1;\n      var isSelColAreaCoverInputValue = coordsTo.col - coordsFrom.col >= inputArray[0].length - 1;\n\n      this.hot.addHookOnce('afterChange', function (changes) {\n        var changesLength = changes ? changes.length : 0;\n\n        if (changesLength) {\n          var offset = { row: 0, col: 0 };\n          var highestColumnIndex = -1;\n\n          (0, _array.arrayEach)(changes, function (change, index) {\n            var nextChange = changesLength > index + 1 ? changes[index + 1] : null;\n\n            if (nextChange) {\n              if (!isSelRowAreaCoverInputValue) {\n                offset.row += Math.max(nextChange[0] - change[0] - 1, 0);\n              }\n              if (!isSelColAreaCoverInputValue && change[1] > highestColumnIndex) {\n                highestColumnIndex = change[1];\n                offset.col += Math.max(nextChange[1] - change[1] - 1, 0);\n              }\n            }\n          });\n          _this6.hot.selectCell(areaStart.row, areaStart.col, areaEnd.row + offset.row, areaEnd.col + offset.col);\n        }\n      });\n\n      this.hot.populateFromArray(areaStart.row, areaStart.col, inputArray, areaEnd.row, areaEnd.col, 'CopyPaste.paste', this.pasteMode);\n      this.hot.runHooks('afterPaste', inputArray, this.copyableRanges);\n    }\n\n    /**\n     * Add copy, cut and paste options to the Context Menu.\n     *\n     * @private\n     * @param {Object} options Contains default added options of the Context Menu.\n     */\n\n  }, {\n    key: 'onAfterContextMenuDefaultOptions',\n    value: function onAfterContextMenuDefaultOptions(options) {\n      options.items.push({\n        name: '---------'\n      }, (0, _copy2.default)(this), (0, _cut2.default)(this));\n    }\n\n    /**\n     * We have to keep focus on textarea element, to make possible use of the browser tools (copy, cut, paste).\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterSelectionEnd',\n    value: function onAfterSelectionEnd() {\n      var priv = privatePool.get(this);\n      var editor = this.hot.getActiveEditor();\n\n      if (editor && typeof editor.isOpened !== 'undefined' && editor.isOpened()) {\n        return;\n      }\n      if (priv.isFragmentSelectionEnabled && !this.textarea.isActive() && (0, _element.getSelectionText)()) {\n        return;\n      }\n\n      this.setCopyableText();\n      this.textarea.select();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.textarea) {\n        this.textarea.destroy();\n      }\n\n      _get(CopyPaste.prototype.__proto__ || Object.getPrototypeOf(CopyPaste.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return CopyPaste;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('CopyPaste', CopyPaste);\n\nexports.default = CopyPaste;\n\n/***/ }),\n/* 315 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Textarea\n *\n * @plugin CopyPaste\n */\nvar Textarea = function () {\n  _createClass(Textarea, null, [{\n    key: 'getSingleton',\n    value: function getSingleton() {\n      globalSingleton.append();\n\n      return globalSingleton;\n    }\n  }]);\n\n  function Textarea() {\n    _classCallCheck(this, Textarea);\n\n    /**\n     * Main textarea element.\n     *\n     * @type {HTMLElement}\n     */\n    this.element = void 0;\n    /**\n     * Store information about append to the document.body.\n     *\n     * @type {Boolean}\n     */\n    this.isAppended = false;\n    /**\n     * Reference counter.\n     *\n     * @type {Number}\n     */\n    this.refCounter = 0;\n  }\n\n  /**\n   * Apends textarea element to the `body`\n   */\n\n\n  _createClass(Textarea, [{\n    key: 'append',\n    value: function append() {\n      if (this.hasBeenDestroyed()) {\n        this.create();\n      }\n\n      this.refCounter++;\n\n      if (!this.isAppended && document.body) {\n        if (document.body) {\n          this.isAppended = true;\n          document.body.appendChild(this.element);\n        }\n      }\n    }\n\n    /**\n     * Prepares textarea element with proper attributes.\n     */\n\n  }, {\n    key: 'create',\n    value: function create() {\n      this.element = document.createElement('textarea');\n      this.element.id = 'HandsontableCopyPaste';\n      this.element.className = 'copyPaste';\n      this.element.tabIndex = -1;\n      this.element.autocomplete = 'off';\n      this.element.wrap = 'hard';\n      this.element.value = ' ';\n    }\n\n    /**\n     * Deselects textarea element if is active.\n     */\n\n  }, {\n    key: 'deselect',\n    value: function deselect() {\n      if (this.element === document.activeElement) {\n        document.activeElement.blur();\n      }\n    }\n\n    /**\n     * Destroy instance\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.refCounter--;\n      this.refCounter = this.refCounter < 0 ? 0 : this.refCounter;\n\n      if (this.hasBeenDestroyed() && this.element && this.element.parentNode) {\n        this.element.parentNode.removeChild(this.element);\n        this.element = null;\n        this.isAppended = false;\n      }\n    }\n\n    /**\n     * Getter for the element.\n     *\n     * @returns {String}\n     */\n\n  }, {\n    key: 'getValue',\n    value: function getValue() {\n      return this.element.value;\n    }\n\n    /**\n     * Check if instance has been destroyed\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasBeenDestroyed',\n    value: function hasBeenDestroyed() {\n      return this.refCounter < 1;\n    }\n\n    /**\n     * Check if the element is an active element in frame.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isActive',\n    value: function isActive() {\n      return this.element === document.activeElement;\n    }\n\n    /**\n     * Sets focus on the element and select content.\n     */\n\n  }, {\n    key: 'select',\n    value: function select() {\n      this.element.focus();\n      this.element.select();\n    }\n\n    /**\n     * Setter for the element.\n     *\n     * @param {String} data Value which should be insert into the element.\n     */\n\n  }, {\n    key: 'setValue',\n    value: function setValue(data) {\n      this.element.value = data;\n    }\n  }]);\n\n  return Textarea;\n}();\n\nvar globalSingleton = new Textarea();\n\nexports.default = Textarea;\n\n/***/ }),\n/* 316 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = copyItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction copyItem(copyPastePlugin) {\n  return {\n    key: 'copy',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_COPY);\n    },\n    callback: function callback() {\n      copyPastePlugin.copy();\n    },\n    disabled: function disabled() {\n      var selected = this.getSelected();\n\n      if (!selected || selected.length > 1) {\n        return true;\n      }\n\n      return false;\n    },\n\n    hidden: false\n  };\n}\n\n/***/ }),\n/* 317 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = cutItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction cutItem(copyPastePlugin) {\n  return {\n    key: 'cut',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_CUT);\n    },\n    callback: function callback() {\n      copyPastePlugin.cut();\n    },\n    disabled: function disabled() {\n      var selected = this.getSelected();\n\n      if (!selected || selected.length > 1) {\n        return true;\n      }\n\n      return false;\n    },\n\n    hidden: false\n  };\n}\n\n/***/ }),\n/* 318 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _clipboardData = __webpack_require__(319);\n\nvar _clipboardData2 = _interopRequireDefault(_clipboardData);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar PasteEvent = function PasteEvent() {\n  _classCallCheck(this, PasteEvent);\n\n  this.clipboardData = new _clipboardData2.default();\n};\n\nexports.default = PasteEvent;\n\n/***/ }),\n/* 319 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ClipboardData = function () {\n  function ClipboardData() {\n    _classCallCheck(this, ClipboardData);\n\n    this.data = {};\n  }\n\n  _createClass(ClipboardData, [{\n    key: \"setData\",\n    value: function setData(type, value) {\n      this.data[type] = value;\n    }\n  }, {\n    key: \"getData\",\n    value: function getData(type) {\n      return this.data[type] || void 0;\n    }\n  }]);\n\n  return ClipboardData;\n}();\n\nexports.default = ClipboardData;\n\n/***/ }),\n/* 320 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 321 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _src = __webpack_require__(4);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _bottom = __webpack_require__(322);\n\nvar _bottom2 = _interopRequireDefault(_bottom);\n\nvar _left = __webpack_require__(323);\n\nvar _left2 = _interopRequireDefault(_left);\n\nvar _noBorders = __webpack_require__(324);\n\nvar _noBorders2 = _interopRequireDefault(_noBorders);\n\nvar _right = __webpack_require__(325);\n\nvar _right2 = _interopRequireDefault(_right);\n\nvar _top = __webpack_require__(326);\n\nvar _top2 = _interopRequireDefault(_top);\n\nvar _utils = __webpack_require__(47);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @plugin CustomBorders\n *\n * @description\n * This plugin enables an option to apply custom borders through the context menu (configurable with context menu key `borders`).\n *\n * To initialize Handsontable with predefined custom borders, provide cell coordinates and border styles in a form of an array.\n *\n * See [Custom Borders](http://docs.handsontable.com/demo-custom-borders.html) demo for more examples.\n *\n * @example\n * ```js\n * ...\n * customBorders: [\n *   {\n *    range: {\n *      from: {\n *        row: 1,\n *        col: 1\n *      },\n *      to: {\n *        row: 3,\n *        col: 4\n *      },\n *    },\n *    left: {},\n *    right: {},\n *    top: {},\n *    bottom: {},\n *   },\n * ],\n * ...\n *\n * // or\n * ...\n * customBorders: [\n *   { row: 2,\n *     col: 2,\n *     left: {\n *       width: 2,\n *       color: 'red',\n *     },\n *     right: {\n *       width: 1,\n *       color: 'green',\n *     },\n *     top: '',\n *     bottom: '',\n *   }.\n * ],\n * ...\n * ```\n * @private\n * @class CustomBorders\n */\nvar CustomBorders = function (_BasePlugin) {\n  _inherits(CustomBorders, _BasePlugin);\n\n  function CustomBorders(hotInstance) {\n    _classCallCheck(this, CustomBorders);\n\n    /**\n     * Saved borders settings.\n     *\n     * @type {Array}\n     */\n    var _this = _possibleConstructorReturn(this, (CustomBorders.__proto__ || Object.getPrototypeOf(CustomBorders)).call(this, hotInstance));\n\n    _this.savedBorderSettings = void 0;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(CustomBorders, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().customBorders;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('afterContextMenuDefaultOptions', function (options) {\n        return _this2.onAfterContextMenuDefaultOptions(options);\n      });\n      this.addHook('afterInit', function () {\n        return _this2.onAfterInit();\n      });\n\n      _get(CustomBorders.prototype.__proto__ || Object.getPrototypeOf(CustomBorders.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.clearBorders();\n\n      _get(CustomBorders.prototype.__proto__ || Object.getPrototypeOf(CustomBorders.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      this.changeBorderSettings();\n\n      _get(CustomBorders.prototype.__proto__ || Object.getPrototypeOf(CustomBorders.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Get index of border from the settings.\n     *\n     * @param {String} className Class name as string.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getSettingIndex',\n    value: function getSettingIndex(className) {\n      var index = -1;\n\n      (0, _array.arrayEach)(this.hot.selection.highlight.borders, function (selection, i) {\n        if (selection.settings.className === className) {\n          index = i;\n\n          return false;\n        }\n      });\n\n      return index;\n    }\n\n    /**\n     * Insert WalkontableSelection instance into Walkontable settings.\n     *\n     * @param {Object} border Object with `row` and `col`, `left`, `right`, `top` and `bottom`, `className` and `border` ({Object} with `color`, `width` and `cornerVisible` property) properties.\n     */\n\n  }, {\n    key: 'insertBorderIntoSettings',\n    value: function insertBorderIntoSettings(border) {\n      var coordinates = {\n        row: border.row,\n        col: border.col\n      };\n      var selection = new _src.Selection(border, new _src.CellRange(coordinates, coordinates, coordinates));\n      var index = this.getSettingIndex(border.className);\n\n      if (index >= 0) {\n        this.hot.selection.highlight.borders[index] = selection;\n      } else {\n        this.hot.selection.highlight.borders.push(selection);\n      }\n    }\n\n    /**\n     * Prepare borders from setting (single cell).\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {Object} borderObj Object with `row` and `col`, `left`, `right`, `top` and `bottom` properties.\n     */\n\n  }, {\n    key: 'prepareBorderFromCustomAdded',\n    value: function prepareBorderFromCustomAdded(row, col, borderObj) {\n      var border = (0, _utils.createEmptyBorders)(row, col);\n\n      border = (0, _utils.extendDefaultBorder)(border, borderObj);\n      this.hot.setCellMeta(row, col, 'borders', border);\n\n      this.insertBorderIntoSettings(border);\n    }\n\n    /** *\n     * Prepare borders from setting (object).\n     *\n     * @param {Object} rowObj Object with `range`, `left`, `right`, `top` and `bottom` properties.\n     */\n\n  }, {\n    key: 'prepareBorderFromCustomAddedRange',\n    value: function prepareBorderFromCustomAddedRange(rowObj) {\n      var _this3 = this;\n\n      var range = rowObj.range;\n\n      (0, _number.rangeEach)(range.from.row, range.to.row, function (rowIndex) {\n        (0, _number.rangeEach)(range.from.col, range.to.col, function (colIndex) {\n          var border = (0, _utils.createEmptyBorders)(rowIndex, colIndex);\n          var add = 0;\n\n          if (rowIndex === range.from.row) {\n            add += 1;\n\n            if ((0, _object.hasOwnProperty)(rowObj, 'top')) {\n              border.top = rowObj.top;\n            }\n          }\n\n          if (rowIndex === range.to.row) {\n            add += 1;\n\n            if ((0, _object.hasOwnProperty)(rowObj, 'bottom')) {\n              border.bottom = rowObj.bottom;\n            }\n          }\n\n          if (colIndex === range.from.col) {\n            add += 1;\n\n            if ((0, _object.hasOwnProperty)(rowObj, 'left')) {\n              border.left = rowObj.left;\n            }\n          }\n\n          if (colIndex === range.to.col) {\n            add += 1;\n\n            if ((0, _object.hasOwnProperty)(rowObj, 'right')) {\n              border.right = rowObj.right;\n            }\n          }\n\n          if (add > 0) {\n            _this3.hot.setCellMeta(rowIndex, colIndex, 'borders', border);\n            _this3.insertBorderIntoSettings(border);\n          }\n        });\n      });\n    }\n\n    /**\n     * Remove borders divs from DOM.\n     *\n     * @param {String} borderClassName Border class name as string.\n     */\n\n  }, {\n    key: 'removeBordersFromDom',\n    value: function removeBordersFromDom(borderClassName) {\n      var borders = this.hot.rootElement.querySelectorAll('.' + borderClassName + ':not(td)');\n\n      (0, _number.rangeEach)(0, borders.length - 1, function (index) {\n        var parent = borders[index].parentNode;\n\n        if (parent.parentNode) {\n          parent.parentNode.removeChild(parent);\n        }\n      });\n    }\n\n    /**\n     * Remove border (triggered from context menu).\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     */\n\n  }, {\n    key: 'removeAllBorders',\n    value: function removeAllBorders(row, col) {\n      var borderClassName = (0, _utils.createClassName)(row, col);\n\n      this.removeBordersFromDom(borderClassName);\n      this.hot.removeCellMeta(row, col, 'borders');\n    }\n\n    /**\n     * Set borders for each cell re. to border position.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {String} place Coordinate where add/remove border - `top`, `bottom`, `left`, `right` and `noBorders`.\n     * @param {Boolean} remove True when remove borders, and false when add borders.\n     */\n\n  }, {\n    key: 'setBorder',\n    value: function setBorder(row, col, place, remove) {\n      var bordersMeta = this.hot.getCellMeta(row, col).borders;\n\n      if (!bordersMeta || bordersMeta.border === void 0) {\n        bordersMeta = (0, _utils.createEmptyBorders)(row, col);\n      }\n\n      if (remove) {\n        bordersMeta[place] = (0, _utils.createSingleEmptyBorder)();\n      } else {\n        bordersMeta[place] = (0, _utils.createDefaultCustomBorder)();\n      }\n\n      this.hot.setCellMeta(row, col, 'borders', bordersMeta);\n\n      var borderClassName = (0, _utils.createClassName)(row, col);\n      this.removeBordersFromDom(borderClassName);\n      this.insertBorderIntoSettings(bordersMeta);\n\n      this.hot.render();\n    }\n\n    /**\n     * Prepare borders based on cell and border position.\n     *\n     * @param {Object} selected\n     * @param {String} place Coordinate where add/remove border - `top`, `bottom`, `left`, `right` and `noBorders`.\n     * @param {Boolean} remove True when remove borders, and false when add borders.\n     */\n\n  }, {\n    key: 'prepareBorder',\n    value: function prepareBorder(selected, place, remove) {\n      var _this4 = this;\n\n      (0, _array.arrayEach)(selected, function (_ref) {\n        var start = _ref.start,\n            end = _ref.end;\n\n        if (start.row === end.row && start.col === end.col) {\n          if (place === 'noBorders') {\n            _this4.removeAllBorders(start.row, start.col);\n          } else {\n            _this4.setBorder(start.row, start.col, place, remove);\n          }\n        } else {\n          switch (place) {\n            case 'noBorders':\n              (0, _number.rangeEach)(start.col, end.col, function (colIndex) {\n                (0, _number.rangeEach)(start.row, end.row, function (rowIndex) {\n                  _this4.removeAllBorders(rowIndex, colIndex);\n                });\n              });\n              break;\n\n            case 'top':\n              (0, _number.rangeEach)(start.col, end.col, function (topCol) {\n                _this4.setBorder(start.row, topCol, place, remove);\n              });\n              break;\n\n            case 'right':\n              (0, _number.rangeEach)(start.row, end.row, function (rowRight) {\n                _this4.setBorder(rowRight, end.col, place, remove);\n              });\n              break;\n\n            case 'bottom':\n              (0, _number.rangeEach)(start.col, end.col, function (bottomCol) {\n                _this4.setBorder(end.row, bottomCol, place, remove);\n              });\n              break;\n\n            case 'left':\n              (0, _number.rangeEach)(start.row, end.row, function (rowLeft) {\n                _this4.setBorder(rowLeft, start.col, place, remove);\n              });\n              break;\n            default:\n              break;\n          }\n        }\n      });\n    }\n\n    /**\n     * Create borders from settings.\n     *\n     * @private\n     * @param {Array} customBorders Object with `row` and `col`, `left`, `right`, `top` and `bottom` properties.\n     */\n\n  }, {\n    key: 'createCustomBorders',\n    value: function createCustomBorders(customBorders) {\n      var _this5 = this;\n\n      (0, _number.rangeEach)(0, customBorders.length - 1, function (index) {\n        if (customBorders[index].range) {\n          _this5.prepareBorderFromCustomAddedRange(customBorders[index]);\n        } else {\n          _this5.prepareBorderFromCustomAdded(customBorders[index].row, customBorders[index].col, customBorders[index]);\n        }\n      });\n\n      this.hot.render();\n      this.hot.view.wt.draw(true);\n    }\n\n    /**\n     * Add border options to context menu.\n     *\n     * @private\n     * @param {Object} defaultOptions Context menu items.\n     */\n\n  }, {\n    key: 'onAfterContextMenuDefaultOptions',\n    value: function onAfterContextMenuDefaultOptions(defaultOptions) {\n      if (!this.hot.getSettings().customBorders) {\n        return;\n      }\n\n      defaultOptions.items.push({\n        name: '---------'\n      }, {\n        key: 'borders',\n        name: function name() {\n          return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS);\n        },\n        disabled: function disabled() {\n          return this.selection.isSelectedByCorner();\n        },\n\n        submenu: {\n          items: [(0, _top2.default)(this), (0, _right2.default)(this), (0, _bottom2.default)(this), (0, _left2.default)(this), (0, _noBorders2.default)(this)]\n        }\n      });\n    }\n\n    /**\n      * Clear borders.\n      *\n      * @private\n      */\n\n  }, {\n    key: 'clearBorders',\n    value: function clearBorders() {\n      var _this6 = this;\n\n      var bordersFromTable = this.hot.rootElement.querySelectorAll('td[class^=\"border\"]');\n\n      (0, _number.rangeEach)(0, bordersFromTable.length - 1, function (index) {\n        _this6.removeBordersFromDom(bordersFromTable[index].className);\n      });\n    }\n\n    /**\n     * Change borders from settings.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'changeBorderSettings',\n    value: function changeBorderSettings() {\n      var customBorders = this.hot.getSettings().customBorders;\n\n      if (customBorders) {\n        if (Array.isArray(customBorders)) {\n          this.savedBorderSettings = customBorders;\n          this.createCustomBorders(customBorders);\n        } else if (customBorders !== void 0) {\n          var borders = this.savedBorderSettings ? this.savedBorderSettings : customBorders;\n\n          this.createCustomBorders(borders);\n        }\n      }\n    }\n\n    /**\n     * `afterInit` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      this.changeBorderSettings();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(CustomBorders.prototype.__proto__ || Object.getPrototypeOf(CustomBorders.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return CustomBorders;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('customBorders', CustomBorders);\n\nexports.default = CustomBorders;\n\n/***/ }),\n/* 322 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = bottom;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(47);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction bottom(customBordersPlugin) {\n  return {\n    key: 'borders:bottom',\n    name: function name() {\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM);\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'bottom');\n      if (hasBorder) {\n        label = (0, _utils.markSelected)(label);\n      }\n      return label;\n    },\n    callback: function callback(key, selected) {\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'bottom');\n      customBordersPlugin.prepareBorder(selected, 'bottom', hasBorder);\n    }\n  };\n}\n\n/***/ }),\n/* 323 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = left;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(47);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction left(customBordersPlugin) {\n  return {\n    key: 'borders:left',\n    name: function name() {\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_LEFT);\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'left');\n      if (hasBorder) {\n        label = (0, _utils.markSelected)(label);\n      }\n\n      return label;\n    },\n    callback: function callback(key, selected) {\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'left');\n      customBordersPlugin.prepareBorder(selected, 'left', hasBorder);\n    }\n  };\n}\n\n/***/ }),\n/* 324 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = noBorders;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(47);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction noBorders(customBordersPlugin) {\n  return {\n    key: 'borders:no_borders',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_BORDERS);\n    },\n    callback: function callback(key, selected) {\n      customBordersPlugin.prepareBorder(selected, 'noBorders');\n    },\n    disabled: function disabled() {\n      return !(0, _utils.checkSelectionBorders)(this);\n    }\n  };\n}\n\n/***/ }),\n/* 325 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = right;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(47);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction right(customBordersPlugin) {\n  return {\n    key: 'borders:right',\n    name: function name() {\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_RIGHT);\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'right');\n      if (hasBorder) {\n        label = (0, _utils.markSelected)(label);\n      }\n      return label;\n    },\n    callback: function callback(key, selected) {\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'right');\n      customBordersPlugin.prepareBorder(selected, 'right', hasBorder);\n    }\n  };\n}\n\n/***/ }),\n/* 326 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = top;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(47);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction top(customBordersPlugin) {\n  return {\n    key: 'borders:top',\n    name: function name() {\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_TOP);\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'top');\n      if (hasBorder) {\n        label = (0, _utils.markSelected)(label);\n      }\n\n      return label;\n    },\n    callback: function callback(key, selected) {\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'top');\n      customBordersPlugin.prepareBorder(selected, 'top', hasBorder);\n    }\n  };\n}\n\n/***/ }),\n/* 327 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @description\n * Plugin used to scroll Handsontable by selecting a cell and dragging outside of the visible viewport.\n *\n *\n * @class DragToScroll\n * @plugin DragToScroll\n */\nvar DragToScroll = function (_BasePlugin) {\n  _inherits(DragToScroll, _BasePlugin);\n\n  function DragToScroll(hotInstance) {\n    _classCallCheck(this, DragToScroll);\n\n    /**\n     * Instance of {@link EventManager}.\n     *\n     * @type {EventManager}\n     */\n    var _this = _possibleConstructorReturn(this, (DragToScroll.__proto__ || Object.getPrototypeOf(DragToScroll)).call(this, hotInstance));\n\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * DOMRect - size of an element and its position relative to the viewport,\n     * e.g. {bottom: 449, height: 441, left: 8, right: 814, top: 8, width: 806, x: 8, y:8}.\n     *\n     * @type {Object}\n     */\n    _this.boundaries = null;\n    /**\n     * Callback function.\n     *\n     * @type {Function}\n     */\n    _this.callback = null;\n    /**\n     * Flag indicates mouseDown/mouseUp.\n     *\n     * @type {Boolean}\n     */\n    _this.listening = false;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(DragToScroll, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().dragToScroll;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('afterOnCellMouseDown', function () {\n        return _this2.setupListening();\n      });\n      this.addHook('afterOnCellCornerMouseDown', function () {\n        return _this2.setupListening();\n      });\n\n      this.registerEvents();\n\n      _get(DragToScroll.prototype.__proto__ || Object.getPrototypeOf(DragToScroll.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(DragToScroll.prototype.__proto__ || Object.getPrototypeOf(DragToScroll.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.unregisterEvents();\n\n      _get(DragToScroll.prototype.__proto__ || Object.getPrototypeOf(DragToScroll.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Sets the value of the visible element.\n     *\n     * @param boundaries {Object} compatible with getBoundingClientRect\n     */\n\n  }, {\n    key: 'setBoundaries',\n    value: function setBoundaries(boundaries) {\n      this.boundaries = boundaries;\n    }\n\n    /**\n     * Change callback function.\n     *\n     * @param callback {Function}\n     */\n\n  }, {\n    key: 'setCallback',\n    value: function setCallback(callback) {\n      this.callback = callback;\n    }\n\n    /**\n     * Check if mouse position (x, y) is outside of the viewport.\n     *\n     * @param {Number} x\n     * @param {Number} y\n     */\n\n  }, {\n    key: 'check',\n    value: function check(x, y) {\n      var diffX = 0;\n      var diffY = 0;\n\n      if (y < this.boundaries.top) {\n        // y is less than top\n        diffY = y - this.boundaries.top;\n      } else if (y > this.boundaries.bottom) {\n        // y is more than bottom\n        diffY = y - this.boundaries.bottom;\n      }\n\n      if (x < this.boundaries.left) {\n        // x is less than left\n        diffX = x - this.boundaries.left;\n      } else if (x > this.boundaries.right) {\n        // x is more than right\n        diffX = x - this.boundaries.right;\n      }\n\n      this.callback(diffX, diffY);\n    }\n\n    /**\n     * Register dom listeners.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this3 = this;\n\n      this.eventManager.addEventListener(document, 'mouseup', function () {\n        return _this3.onMouseUp();\n      });\n      this.eventManager.addEventListener(document, 'mousemove', function (event) {\n        return _this3.onMouseMove(event);\n      });\n    }\n\n    /**\n     * Unbind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'unregisterEvents',\n    value: function unregisterEvents() {\n      this.eventManager.clear();\n    }\n\n    /**\n     * On after on cell/cellCorner mouse down listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'setupListening',\n    value: function setupListening() {\n      var scrollHandler = this.hot.view.wt.wtTable.holder; // native scroll\n\n      if (scrollHandler === window) {\n        // not much we can do currently\n        return;\n      }\n\n      this.setBoundaries(scrollHandler.getBoundingClientRect());\n      this.setCallback(function (scrollX, scrollY) {\n        if (scrollX < 0) {\n          scrollHandler.scrollLeft -= 50;\n        } else if (scrollX > 0) {\n          scrollHandler.scrollLeft += 50;\n        }\n\n        if (scrollY < 0) {\n          scrollHandler.scrollTop -= 20;\n        } else if (scrollY > 0) {\n          scrollHandler.scrollTop += 20;\n        }\n      });\n\n      this.listening = true;\n    }\n\n    /**\n     * 'mouseMove' event callback.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      if (this.listening) {\n        this.check(event.clientX, event.clientY);\n      }\n    }\n\n    /**\n     * `onMouseUp` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      this.listening = false;\n    }\n\n    /**\n     * Destroy instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(DragToScroll.prototype.__proto__ || Object.getPrototypeOf(DragToScroll.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return DragToScroll;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('dragToScroll', DragToScroll);\n\nexports.default = DragToScroll;\n\n/***/ }),\n/* 328 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _array = __webpack_require__(1);\n\nvar _freezeColumn = __webpack_require__(329);\n\nvar _freezeColumn2 = _interopRequireDefault(_freezeColumn);\n\nvar _unfreezeColumn = __webpack_require__(330);\n\nvar _unfreezeColumn2 = _interopRequireDefault(_unfreezeColumn);\n\n__webpack_require__(331);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar privatePool = new WeakMap();\n/**\n * This plugin allows to manually \"freeze\" and \"unfreeze\" a column using an entry in the Context Menu.\n * You can turn it on by setting a `manualColumnFreeze` property to `true`.\n *\n * @plugin ManualColumnFreeze\n * @dependencies ManualColumnMove\n */\n\nvar ManualColumnFreeze = function (_BasePlugin) {\n  _inherits(ManualColumnFreeze, _BasePlugin);\n\n  function ManualColumnFreeze(hotInstance) {\n    _classCallCheck(this, ManualColumnFreeze);\n\n    var _this = _possibleConstructorReturn(this, (ManualColumnFreeze.__proto__ || Object.getPrototypeOf(ManualColumnFreeze)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      moveByFreeze: false,\n      afterFirstUse: false\n    });\n    /**\n     * Original column positions\n     *\n     * @type {Array}\n     */\n    _this.frozenColumnsBasePositions = [];\n    /**\n     * Reference to the `ManualColumnMove` plugin.\n     */\n    _this.manualColumnMovePlugin = void 0;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualColumnFreeze, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().manualColumnFreeze;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('afterContextMenuDefaultOptions', function (options) {\n        return _this2.addContextMenuEntry(options);\n      });\n      this.addHook('afterInit', function () {\n        return _this2.onAfterInit();\n      });\n      this.addHook('beforeColumnMove', function (rows, target) {\n        return _this2.onBeforeColumnMove(rows, target);\n      });\n\n      _get(ManualColumnFreeze.prototype.__proto__ || Object.getPrototypeOf(ManualColumnFreeze.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      var priv = privatePool.get(this);\n\n      priv.afterFirstUse = false;\n      priv.moveByFreeze = false;\n\n      _get(ManualColumnFreeze.prototype.__proto__ || Object.getPrototypeOf(ManualColumnFreeze.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(ManualColumnFreeze.prototype.__proto__ || Object.getPrototypeOf(ManualColumnFreeze.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Freeze the given column (add it to fixed columns).\n     *\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'freezeColumn',\n    value: function freezeColumn(column) {\n      var priv = privatePool.get(this);\n      var settings = this.hot.getSettings();\n\n      if (!priv.afterFirstUse) {\n        priv.afterFirstUse = true;\n      }\n\n      if (settings.fixedColumnsLeft === this.hot.countCols() || column <= settings.fixedColumnsLeft - 1) {\n        return; // already fixed\n      }\n\n      priv.moveByFreeze = true;\n\n      if (column !== this.getMovePlugin().columnsMapper.getValueByIndex(column)) {\n        this.frozenColumnsBasePositions[settings.fixedColumnsLeft] = column;\n      }\n\n      this.getMovePlugin().moveColumn(column, settings.fixedColumnsLeft++);\n    }\n\n    /**\n     * Unfreeze the given column (remove it from fixed columns and bring to it's previous position).\n     *\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'unfreezeColumn',\n    value: function unfreezeColumn(column) {\n      var priv = privatePool.get(this);\n      var settings = this.hot.getSettings();\n\n      if (!priv.afterFirstUse) {\n        priv.afterFirstUse = true;\n      }\n\n      if (settings.fixedColumnsLeft <= 0 || column > settings.fixedColumnsLeft - 1) {\n        return; // not fixed\n      }\n\n      var returnCol = this.getBestColumnReturnPosition(column);\n\n      priv.moveByFreeze = true;\n      settings.fixedColumnsLeft--;\n\n      this.getMovePlugin().moveColumn(column, returnCol + 1);\n    }\n\n    /**\n     * Get the reference to the ManualColumnMove plugin.\n     *\n     * @private\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'getMovePlugin',\n    value: function getMovePlugin() {\n      if (!this.manualColumnMovePlugin) {\n        this.manualColumnMovePlugin = this.hot.getPlugin('manualColumnMove');\n      }\n\n      return this.manualColumnMovePlugin;\n    }\n\n    /**\n     * Estimates the most fitting return position for unfrozen column.\n     *\n     * @private\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'getBestColumnReturnPosition',\n    value: function getBestColumnReturnPosition(column) {\n      var movePlugin = this.getMovePlugin();\n      var settings = this.hot.getSettings();\n      var i = settings.fixedColumnsLeft;\n      var j = movePlugin.columnsMapper.getValueByIndex(i);\n      var initialCol = void 0;\n\n      if (this.frozenColumnsBasePositions[column] === null || this.frozenColumnsBasePositions[column] === void 0) {\n        initialCol = movePlugin.columnsMapper.getValueByIndex(column);\n\n        while (j !== null && j <= initialCol) {\n          i++;\n          j = movePlugin.columnsMapper.getValueByIndex(i);\n        }\n      } else {\n        initialCol = this.frozenColumnsBasePositions[column];\n        this.frozenColumnsBasePositions[column] = void 0;\n\n        while (j !== null && j <= initialCol) {\n          i++;\n          j = movePlugin.columnsMapper.getValueByIndex(i);\n        }\n        i = j;\n      }\n\n      return i - 1;\n    }\n    /**\n     * Add the manualColumnFreeze context menu entries.\n     *\n     * @private\n     * @param {Object} options Context menu options.\n     */\n\n  }, {\n    key: 'addContextMenuEntry',\n    value: function addContextMenuEntry(options) {\n      options.items.push({ name: '---------' }, (0, _freezeColumn2.default)(this), (0, _unfreezeColumn2.default)(this));\n    }\n\n    /**\n     * Enabling `manualColumnMove` plugin on `afterInit` hook.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      if (!this.getMovePlugin().isEnabled()) {\n        this.getMovePlugin().enablePlugin();\n      }\n    }\n\n    /**\n     * Prevent moving the rows from/to fixed area.\n     *\n     * @private\n     * @param {Array} rows\n     * @param {Number} target\n     */\n\n  }, {\n    key: 'onBeforeColumnMove',\n    value: function onBeforeColumnMove(rows, target) {\n      var priv = privatePool.get(this);\n\n      if (priv.afterFirstUse && !priv.moveByFreeze) {\n        var frozenLen = this.hot.getSettings().fixedColumnsLeft;\n        var disallowMoving = target < frozenLen;\n\n        if (!disallowMoving) {\n          (0, _array.arrayEach)(rows, function (value, index, array) {\n            if (value < frozenLen) {\n              disallowMoving = true;\n              return false;\n            }\n          });\n        }\n\n        if (disallowMoving) {\n          return false;\n        }\n      }\n\n      if (priv.moveByFreeze) {\n        priv.moveByFreeze = false;\n      }\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(ManualColumnFreeze.prototype.__proto__ || Object.getPrototypeOf(ManualColumnFreeze.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return ManualColumnFreeze;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('manualColumnFreeze', ManualColumnFreeze);\n\nexports.default = ManualColumnFreeze;\n\n/***/ }),\n/* 329 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = freezeColumnItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction freezeColumnItem(manualColumnFreezePlugin) {\n  return {\n    key: 'freeze_column',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_FREEZE_COLUMN);\n    },\n    callback: function callback(key, selected) {\n      var _selected = _slicedToArray(selected, 1),\n          selectedColumn = _selected[0].start.col;\n\n      manualColumnFreezePlugin.freezeColumn(selectedColumn);\n\n      this.render();\n      this.view.wt.wtOverlays.adjustElementsSize(true);\n    },\n    hidden: function hidden() {\n      var selection = this.getSelectedRange();\n      var hide = false;\n\n      if (selection === void 0) {\n        hide = true;\n      } else if (selection.length > 1) {\n        hide = true;\n      } else if (selection[0].from.col !== selection[0].to.col || selection[0].from.col <= this.getSettings().fixedColumnsLeft - 1) {\n        hide = true;\n      }\n\n      return hide;\n    }\n  };\n}\n\n/***/ }),\n/* 330 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = unfreezeColumnItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction unfreezeColumnItem(manualColumnFreezePlugin) {\n  return {\n    key: 'unfreeze_column',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN);\n    },\n    callback: function callback(key, selected) {\n      var _selected = _slicedToArray(selected, 1),\n          selectedColumn = _selected[0].start.col;\n\n      manualColumnFreezePlugin.unfreezeColumn(selectedColumn);\n\n      this.render();\n      this.view.wt.wtOverlays.adjustElementsSize(true);\n    },\n    hidden: function hidden() {\n      var selection = this.getSelectedRange();\n      var hide = false;\n\n      if (selection === void 0) {\n        hide = true;\n      } else if (selection.length > 1) {\n        hide = true;\n      } else if (selection[0].from.col !== selection[0].to.col || selection[0].from.col >= this.getSettings().fixedColumnsLeft) {\n        hide = true;\n      }\n\n      return hide;\n    }\n  };\n}\n\n/***/ }),\n/* 331 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 332 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _element = __webpack_require__(0);\n\nvar _number = __webpack_require__(5);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nvar _columnsMapper = __webpack_require__(333);\n\nvar _columnsMapper2 = _interopRequireDefault(_columnsMapper);\n\nvar _backlight = __webpack_require__(334);\n\nvar _backlight2 = _interopRequireDefault(_backlight);\n\nvar _guideline = __webpack_require__(335);\n\nvar _guideline2 = _interopRequireDefault(_guideline);\n\nvar _src = __webpack_require__(4);\n\n__webpack_require__(336);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('beforeColumnMove');\n_pluginHooks2.default.getSingleton().register('afterColumnMove');\n_pluginHooks2.default.getSingleton().register('unmodifyCol');\n\nvar privatePool = new WeakMap();\nvar CSS_PLUGIN = 'ht__manualColumnMove';\nvar CSS_SHOW_UI = 'show-ui';\nvar CSS_ON_MOVING = 'on-moving--columns';\nvar CSS_AFTER_SELECTION = 'after-selection--columns';\n\n/**\n * @plugin ManualColumnMove\n *\n * @description\n * This plugin allows to change columns order.\n *\n * API:\n * - moveColumn - move single column to the new position.\n * - moveColumns - move many columns (as an array of indexes) to the new position.\n *\n * If you want apply visual changes, you have to call manually the render() method on the instance of Handsontable.\n *\n * UI components:\n * - backlight - highlight of selected columns.\n * - guideline - line which shows where rows has been moved.\n *\n * @class ManualColumnMove\n * @plugin ManualColumnMove\n */\n\nvar ManualColumnMove = function (_BasePlugin) {\n  _inherits(ManualColumnMove, _BasePlugin);\n\n  function ManualColumnMove(hotInstance) {\n    _classCallCheck(this, ManualColumnMove);\n\n    /**\n     * Set up WeakMap of plugin to sharing private parameters;\n     */\n    var _this = _possibleConstructorReturn(this, (ManualColumnMove.__proto__ || Object.getPrototypeOf(ManualColumnMove)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      columnsToMove: [],\n      countCols: 0,\n      fixedColumns: 0,\n      pressed: void 0,\n      disallowMoving: void 0,\n      target: {\n        eventPageX: void 0,\n        coords: void 0,\n        TD: void 0,\n        col: void 0\n      }\n    });\n\n    /**\n     * List of last removed row indexes.\n     *\n     * @type {Array}\n     */\n    _this.removedColumns = [];\n    /**\n     * Object containing visual row indexes mapped to data source indexes.\n     *\n     * @type {RowsMapper}\n     */\n    _this.columnsMapper = new _columnsMapper2.default(_this);\n    /**\n     * Event Manager object.\n     *\n     * @type {Object}\n     */\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Backlight UI object.\n     *\n     * @type {Object}\n     */\n    _this.backlight = new _backlight2.default(hotInstance);\n    /**\n     * Guideline UI object.\n     *\n     * @type {Object}\n     */\n    _this.guideline = new _guideline2.default(hotInstance);\n    return _this;\n  }\n\n  /**\n   * Check if plugin is enabled.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualColumnMove, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().manualColumnMove;\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('beforeOnCellMouseDown', function (event, coords, TD, blockCalculations) {\n        return _this2.onBeforeOnCellMouseDown(event, coords, TD, blockCalculations);\n      });\n      this.addHook('beforeOnCellMouseOver', function (event, coords, TD, blockCalculations) {\n        return _this2.onBeforeOnCellMouseOver(event, coords, TD, blockCalculations);\n      });\n      this.addHook('afterScrollVertically', function () {\n        return _this2.onAfterScrollVertically();\n      });\n      this.addHook('modifyCol', function (row, source) {\n        return _this2.onModifyCol(row, source);\n      });\n      this.addHook('beforeRemoveCol', function (index, amount) {\n        return _this2.onBeforeRemoveCol(index, amount);\n      });\n      this.addHook('afterRemoveCol', function () {\n        return _this2.onAfterRemoveCol();\n      });\n      this.addHook('afterCreateCol', function (index, amount) {\n        return _this2.onAfterCreateCol(index, amount);\n      });\n      this.addHook('afterLoadData', function () {\n        return _this2.onAfterLoadData();\n      });\n      this.addHook('unmodifyCol', function (column) {\n        return _this2.onUnmodifyCol(column);\n      });\n\n      this.registerEvents();\n\n      // TODO: move adding plugin classname to BasePlugin.\n      (0, _element.addClass)(this.hot.rootElement, CSS_PLUGIN);\n\n      _get(ManualColumnMove.prototype.__proto__ || Object.getPrototypeOf(ManualColumnMove.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      this.onAfterPluginsInitialized();\n\n      _get(ManualColumnMove.prototype.__proto__ || Object.getPrototypeOf(ManualColumnMove.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      var pluginSettings = this.hot.getSettings().manualColumnMove;\n\n      if (Array.isArray(pluginSettings)) {\n        this.columnsMapper.clearMap();\n      }\n\n      (0, _element.removeClass)(this.hot.rootElement, CSS_PLUGIN);\n\n      this.unregisterEvents();\n      this.backlight.destroy();\n      this.guideline.destroy();\n\n      _get(ManualColumnMove.prototype.__proto__ || Object.getPrototypeOf(ManualColumnMove.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Move a single column.\n     *\n     * @param {Number} column Visual column index to be moved.\n     * @param {Number} target Visual column index being a target for the moved column.\n     */\n\n  }, {\n    key: 'moveColumn',\n    value: function moveColumn(column, target) {\n      this.moveColumns([column], target);\n    }\n\n    /**\n     * Move multiple columns.\n     *\n     * @param {Array} columns Array of visual column indexes to be moved.\n     * @param {Number} target Visual column index being a target for the moved columns.\n     */\n\n  }, {\n    key: 'moveColumns',\n    value: function moveColumns(columns, target) {\n      var _this3 = this;\n\n      var visualColumns = [].concat(_toConsumableArray(columns));\n      var priv = privatePool.get(this);\n      var beforeColumnHook = this.hot.runHooks('beforeColumnMove', visualColumns, target);\n\n      priv.disallowMoving = !beforeColumnHook;\n\n      if (beforeColumnHook !== false) {\n        // first we need to rewrite an visual indexes to physical for save reference after move\n        (0, _array.arrayEach)(columns, function (column, index, array) {\n          array[index] = _this3.columnsMapper.getValueByIndex(column);\n        });\n\n        // next, when we have got an physical indexes, we can move columns\n        (0, _array.arrayEach)(columns, function (column, index) {\n          var actualPosition = _this3.columnsMapper.getIndexByValue(column);\n\n          if (actualPosition !== target) {\n            _this3.columnsMapper.moveColumn(actualPosition, target + index);\n          }\n        });\n\n        // after moving we have to clear columnsMapper from null entries\n        this.columnsMapper.clearNull();\n      }\n\n      this.hot.runHooks('afterColumnMove', visualColumns, target);\n    }\n\n    /**\n     * Correct the cell selection after the move action. Fired only when action was made with a mouse.\n     * That means that changing the column order using the API won't correct the selection.\n     *\n     * @private\n     * @param {Number} startColumn Visual column index for the start of the selection.\n     * @param {Number} endColumn Visual column index for the end of the selection.\n     */\n\n  }, {\n    key: 'changeSelection',\n    value: function changeSelection(startColumn, endColumn) {\n      this.hot.selectColumns(startColumn, endColumn);\n    }\n\n    /**\n     * Get the sum of the widths of columns in the provided range.\n     *\n     * @private\n     * @param {Number} from Visual column index.\n     * @param {Number} to Visual column index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getColumnsWidth',\n    value: function getColumnsWidth(from, to) {\n      var width = 0;\n\n      for (var i = from; i < to; i++) {\n        var columnWidth = 0;\n\n        if (i < 0) {\n          columnWidth = this.hot.view.wt.wtViewport.getRowHeaderWidth() || 0;\n        } else {\n          columnWidth = this.hot.view.wt.wtTable.getStretchedColumnWidth(i) || 0;\n        }\n\n        width += columnWidth;\n      }\n\n      return width;\n    }\n\n    /**\n     * Load initial settings when persistent state is saved or when plugin was initialized as an array.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'initialSettings',\n    value: function initialSettings() {\n      var pluginSettings = this.hot.getSettings().manualColumnMove;\n\n      if (Array.isArray(pluginSettings)) {\n        this.moveColumns(pluginSettings, 0);\n      } else if (pluginSettings !== void 0) {\n        this.persistentStateLoad();\n      }\n    }\n\n    /**\n     * Check if the provided column is in the fixedColumnsLeft section.\n     *\n     * @private\n     * @param {Number} column Visual column index to check.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isFixedColumnsLeft',\n    value: function isFixedColumnsLeft(column) {\n      return column < this.hot.getSettings().fixedColumnsLeft;\n    }\n\n    /**\n     * Save the manual column positions to the persistent state.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'persistentStateSave',\n    value: function persistentStateSave() {\n      this.hot.runHooks('persistentStateSave', 'manualColumnMove', this.columnsMapper._arrayMap);\n    }\n\n    /**\n     * Load the manual column positions from the persistent state.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'persistentStateLoad',\n    value: function persistentStateLoad() {\n      var storedState = {};\n\n      this.hot.runHooks('persistentStateLoad', 'manualColumnMove', storedState);\n\n      if (storedState.value) {\n        this.columnsMapper._arrayMap = storedState.value;\n      }\n    }\n\n    /**\n     * Prepare array of indexes based on actual selection.\n     *\n     * @private\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'prepareColumnsToMoving',\n    value: function prepareColumnsToMoving(start, end) {\n      var selectedColumns = [];\n\n      (0, _number.rangeEach)(start, end, function (i) {\n        selectedColumns.push(i);\n      });\n\n      return selectedColumns;\n    }\n\n    /**\n     * Update the UI visual position.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'refreshPositions',\n    value: function refreshPositions() {\n      var priv = privatePool.get(this);\n      var firstVisible = this.hot.view.wt.wtTable.getFirstVisibleColumn();\n      var lastVisible = this.hot.view.wt.wtTable.getLastVisibleColumn();\n      var wtTable = this.hot.view.wt.wtTable;\n      var scrollableElement = this.hot.view.wt.wtOverlays.scrollableElement;\n      var scrollLeft = typeof scrollableElement.scrollX === 'number' ? scrollableElement.scrollX : scrollableElement.scrollLeft;\n      var tdOffsetLeft = this.hot.view.THEAD.offsetLeft + this.getColumnsWidth(0, priv.coordsColumn);\n      var mouseOffsetLeft = priv.target.eventPageX - (priv.rootElementOffset - (scrollableElement.scrollX === void 0 ? scrollLeft : 0));\n      var hiderWidth = wtTable.hider.offsetWidth;\n      var tbodyOffsetLeft = wtTable.TBODY.offsetLeft;\n      var backlightElemMarginLeft = this.backlight.getOffset().left;\n      var backlightElemWidth = this.backlight.getSize().width;\n      var rowHeaderWidth = 0;\n\n      if (priv.rootElementOffset + wtTable.holder.offsetWidth + scrollLeft < priv.target.eventPageX) {\n        if (priv.coordsColumn < priv.countCols) {\n          priv.coordsColumn++;\n        }\n      }\n\n      if (priv.hasRowHeaders) {\n        rowHeaderWidth = this.hot.view.wt.wtOverlays.leftOverlay.clone.wtTable.getColumnHeader(-1).offsetWidth;\n      }\n      if (this.isFixedColumnsLeft(priv.coordsColumn)) {\n        tdOffsetLeft += scrollLeft;\n      }\n      tdOffsetLeft += rowHeaderWidth;\n\n      if (priv.coordsColumn < 0) {\n        // if hover on rowHeader\n        if (priv.fixedColumns > 0) {\n          priv.target.col = 0;\n        } else {\n          priv.target.col = firstVisible > 0 ? firstVisible - 1 : firstVisible;\n        }\n      } else if (priv.target.TD.offsetWidth / 2 + tdOffsetLeft <= mouseOffsetLeft) {\n        var newCoordsCol = priv.coordsColumn >= priv.countCols ? priv.countCols - 1 : priv.coordsColumn;\n        // if hover on right part of TD\n        priv.target.col = newCoordsCol + 1;\n        // unfortunately first column is bigger than rest\n        tdOffsetLeft += priv.target.TD.offsetWidth;\n\n        if (priv.target.col > lastVisible) {\n          this.hot.scrollViewportTo(void 0, lastVisible + 1, void 0, true);\n        }\n      } else {\n        // elsewhere on table\n        priv.target.col = priv.coordsColumn;\n\n        if (priv.target.col <= firstVisible && priv.target.col >= priv.fixedColumns) {\n          this.hot.scrollViewportTo(void 0, firstVisible - 1);\n        }\n      }\n\n      if (priv.target.col <= firstVisible && priv.target.col >= priv.fixedColumns) {\n        this.hot.scrollViewportTo(void 0, firstVisible - 1);\n      }\n\n      var backlightLeft = mouseOffsetLeft;\n      var guidelineLeft = tdOffsetLeft;\n\n      if (mouseOffsetLeft + backlightElemWidth + backlightElemMarginLeft >= hiderWidth) {\n        // prevent display backlight on the right side of the table\n        backlightLeft = hiderWidth - backlightElemWidth - backlightElemMarginLeft;\n      } else if (mouseOffsetLeft + backlightElemMarginLeft < tbodyOffsetLeft + rowHeaderWidth) {\n        // prevent display backlight on the left side of the table\n        backlightLeft = tbodyOffsetLeft + rowHeaderWidth + Math.abs(backlightElemMarginLeft);\n      }\n\n      if (tdOffsetLeft >= hiderWidth - 1) {\n        // prevent display guideline outside the table\n        guidelineLeft = hiderWidth - 1;\n      } else if (guidelineLeft === 0) {\n        // guideline has got `margin-left: -1px` as default\n        guidelineLeft = 1;\n      } else if (scrollableElement.scrollX !== void 0 && priv.coordsColumn < priv.fixedColumns) {\n        guidelineLeft -= priv.rootElementOffset <= scrollableElement.scrollX ? priv.rootElementOffset : 0;\n      }\n\n      this.backlight.setPosition(null, backlightLeft);\n      this.guideline.setPosition(null, guidelineLeft);\n    }\n\n    /**\n     * This method checks arrayMap from columnsMapper and updates the columnsMapper if it's necessary.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'updateColumnsMapper',\n    value: function updateColumnsMapper() {\n      var countCols = this.hot.countSourceCols();\n      var columnsMapperLen = this.columnsMapper._arrayMap.length;\n\n      if (columnsMapperLen === 0) {\n        this.columnsMapper.createMap(countCols || this.hot.getSettings().startCols);\n      } else if (columnsMapperLen < countCols) {\n        var diff = countCols - columnsMapperLen;\n\n        this.columnsMapper.insertItems(columnsMapperLen, diff);\n      } else if (columnsMapperLen > countCols) {\n        var maxIndex = countCols - 1;\n        var columnsToRemove = [];\n\n        (0, _array.arrayEach)(this.columnsMapper._arrayMap, function (value, index) {\n          if (value > maxIndex) {\n            columnsToRemove.push(index);\n          }\n        });\n\n        this.columnsMapper.removeItems(columnsToRemove);\n      }\n    }\n\n    /**\n     * Bind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this4 = this;\n\n      this.eventManager.addEventListener(document.documentElement, 'mousemove', function (event) {\n        return _this4.onMouseMove(event);\n      });\n      this.eventManager.addEventListener(document.documentElement, 'mouseup', function () {\n        return _this4.onMouseUp();\n      });\n    }\n\n    /**\n     * Unbind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'unregisterEvents',\n    value: function unregisterEvents() {\n      this.eventManager.clear();\n    }\n\n    /**\n     * Change the behavior of selection / dragging.\n     *\n     * @private\n     * @param {MouseEvent} event `mousedown` event properties.\n     * @param {CellCoords} coords Visual cell coordinates where was fired event.\n     * @param {HTMLElement} TD Cell represented as HTMLElement.\n     * @param {Object} blockCalculations Object which contains information about blockCalculation for row, column or cells.\n     */\n\n  }, {\n    key: 'onBeforeOnCellMouseDown',\n    value: function onBeforeOnCellMouseDown(event, coords, TD, blockCalculations) {\n      var wtTable = this.hot.view.wt.wtTable;\n      var isHeaderSelection = this.hot.selection.isSelectedByColumnHeader();\n      var selection = this.hot.getSelectedRangeLast();\n      var priv = privatePool.get(this);\n      var isSortingElement = event.realTarget.className.indexOf('columnSorting') > -1;\n\n      if (!selection || !isHeaderSelection || priv.pressed || event.button !== 0 || isSortingElement) {\n        priv.pressed = false;\n        priv.columnsToMove.length = 0;\n        (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI]);\n        return;\n      }\n\n      var guidelineIsNotReady = this.guideline.isBuilt() && !this.guideline.isAppended();\n      var backlightIsNotReady = this.backlight.isBuilt() && !this.backlight.isAppended();\n\n      if (guidelineIsNotReady && backlightIsNotReady) {\n        this.guideline.appendTo(wtTable.hider);\n        this.backlight.appendTo(wtTable.hider);\n      }\n\n      var from = selection.from,\n          to = selection.to;\n\n      var start = Math.min(from.col, to.col);\n      var end = Math.max(from.col, to.col);\n\n      if (coords.row < 0 && coords.col >= start && coords.col <= end) {\n        blockCalculations.column = true;\n        priv.pressed = true;\n        priv.target.eventPageX = event.pageX;\n        priv.coordsColumn = coords.col;\n        priv.target.TD = TD;\n        priv.target.col = coords.col;\n        priv.columnsToMove = this.prepareColumnsToMoving(start, end);\n        priv.hasRowHeaders = !!this.hot.getSettings().rowHeaders;\n        priv.countCols = this.hot.countCols();\n        priv.fixedColumns = this.hot.getSettings().fixedColumnsLeft;\n        priv.rootElementOffset = (0, _element.offset)(this.hot.rootElement).left;\n\n        var countColumnsFrom = priv.hasRowHeaders ? -1 : 0;\n        var topPos = wtTable.holder.scrollTop + wtTable.getColumnHeaderHeight(0) + 1;\n        var fixedColumns = coords.col < priv.fixedColumns;\n        var scrollableElement = this.hot.view.wt.wtOverlays.scrollableElement;\n        var wrapperIsWindow = scrollableElement.scrollX ? scrollableElement.scrollX - priv.rootElementOffset : 0;\n\n        var mouseOffset = event.layerX - (fixedColumns ? wrapperIsWindow : 0);\n        var leftOffset = Math.abs(this.getColumnsWidth(start, coords.col) + mouseOffset);\n\n        this.backlight.setPosition(topPos, this.getColumnsWidth(countColumnsFrom, start) + leftOffset);\n        this.backlight.setSize(this.getColumnsWidth(start, end + 1), wtTable.hider.offsetHeight - topPos);\n        this.backlight.setOffset(null, leftOffset * -1);\n\n        (0, _element.addClass)(this.hot.rootElement, CSS_ON_MOVING);\n      } else {\n        (0, _element.removeClass)(this.hot.rootElement, CSS_AFTER_SELECTION);\n        priv.pressed = false;\n        priv.columnsToMove.length = 0;\n      }\n    }\n\n    /**\n     * 'mouseMove' event callback. Fired when pointer move on document.documentElement.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var priv = privatePool.get(this);\n\n      if (!priv.pressed) {\n        return;\n      }\n\n      // callback for browser which doesn't supports CSS pointer-event: none\n      if (event.realTarget === this.backlight.element) {\n        var width = this.backlight.getSize().width;\n        this.backlight.setSize(0);\n\n        setTimeout(function () {\n          this.backlight.setPosition(width);\n        });\n      }\n\n      priv.target.eventPageX = event.pageX;\n      this.refreshPositions();\n    }\n\n    /**\n     * 'beforeOnCellMouseOver' hook callback. Fired when pointer was over cell.\n     *\n     * @private\n     * @param {MouseEvent} event `mouseover` event properties.\n     * @param {CellCoords} coords Visual cell coordinates where was fired event.\n     * @param {HTMLElement} TD Cell represented as HTMLElement.\n     * @param {Object} blockCalculations Object which contains information about blockCalculation for row, column or cells.\n     */\n\n  }, {\n    key: 'onBeforeOnCellMouseOver',\n    value: function onBeforeOnCellMouseOver(event, coords, TD, blockCalculations) {\n      var selectedRange = this.hot.getSelectedRangeLast();\n      var priv = privatePool.get(this);\n\n      if (!selectedRange || !priv.pressed) {\n        return;\n      }\n\n      if (priv.columnsToMove.indexOf(coords.col) > -1) {\n        (0, _element.removeClass)(this.hot.rootElement, CSS_SHOW_UI);\n      } else {\n        (0, _element.addClass)(this.hot.rootElement, CSS_SHOW_UI);\n      }\n\n      blockCalculations.row = true;\n      blockCalculations.column = true;\n      blockCalculations.cell = true;\n      priv.coordsColumn = coords.col;\n      priv.target.TD = TD;\n    }\n\n    /**\n     * `onMouseUp` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      var priv = privatePool.get(this);\n\n      priv.coordsColumn = void 0;\n      priv.pressed = false;\n      priv.backlightWidth = 0;\n\n      (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI, CSS_AFTER_SELECTION]);\n\n      if (this.hot.selection.isSelectedByColumnHeader()) {\n        (0, _element.addClass)(this.hot.rootElement, CSS_AFTER_SELECTION);\n      }\n      if (priv.columnsToMove.length < 1 || priv.target.col === void 0 || priv.columnsToMove.indexOf(priv.target.col) > -1) {\n        return;\n      }\n\n      this.moveColumns(priv.columnsToMove, priv.target.col);\n      this.persistentStateSave();\n      this.hot.render();\n      this.hot.view.wt.wtOverlays.adjustElementsSize(true);\n\n      if (!priv.disallowMoving) {\n        var selectionStart = this.columnsMapper.getIndexByValue(priv.columnsToMove[0]);\n        var selectionEnd = this.columnsMapper.getIndexByValue(priv.columnsToMove[priv.columnsToMove.length - 1]);\n        this.changeSelection(selectionStart, selectionEnd);\n      }\n\n      priv.columnsToMove.length = 0;\n    }\n\n    /**\n     * `afterScrollHorizontally` hook callback. Fired the table was scrolled horizontally.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterScrollVertically',\n    value: function onAfterScrollVertically() {\n      var wtTable = this.hot.view.wt.wtTable;\n      var headerHeight = wtTable.getColumnHeaderHeight(0) + 1;\n      var scrollTop = wtTable.holder.scrollTop;\n      var posTop = headerHeight + scrollTop;\n\n      this.backlight.setPosition(posTop);\n      this.backlight.setSize(null, wtTable.hider.offsetHeight - posTop);\n    }\n\n    /**\n     * `afterCreateCol` hook callback.\n     *\n     * @private\n     * @param {Number} index Visual index of the created column.\n     * @param {Number} amount Amount of created columns.\n     */\n\n  }, {\n    key: 'onAfterCreateCol',\n    value: function onAfterCreateCol(index, amount) {\n      this.columnsMapper.shiftItems(index, amount);\n    }\n\n    /**\n     * On before remove column listener.\n     *\n     * @private\n     * @param {Number} index Visual column index.\n     * @param {Number} amount Defines how many columns removed.\n     */\n\n  }, {\n    key: 'onBeforeRemoveCol',\n    value: function onBeforeRemoveCol(index, amount) {\n      var _this5 = this;\n\n      this.removedColumns.length = 0;\n\n      if (index !== false) {\n        // Collect physical row index.\n        (0, _number.rangeEach)(index, index + amount - 1, function (removedIndex) {\n          _this5.removedColumns.push(_this5.hot.runHooks('modifyCol', removedIndex, _this5.pluginName));\n        });\n      }\n    }\n\n    /**\n     * `afterRemoveCol` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterRemoveCol',\n    value: function onAfterRemoveCol() {\n      this.columnsMapper.unshiftItems(this.removedColumns);\n    }\n\n    /**\n     * `afterLoadData` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData() {\n      this.updateColumnsMapper();\n    }\n\n    /**\n     * 'modifyRow' hook callback.\n     *\n     * @private\n     * @param {Number} column Visual column index.\n     * @returns {Number} Physical column index.\n     */\n\n  }, {\n    key: 'onModifyCol',\n    value: function onModifyCol(column, source) {\n      if (source !== this.pluginName) {\n        // ugly fix for try to insert new, needed columns after pasting data\n        var columnInMapper = this.columnsMapper.getValueByIndex(column);\n        column = columnInMapper === null ? column : columnInMapper;\n      }\n\n      return column;\n    }\n\n    /**\n     * 'unmodifyCol' hook callback.\n     *\n     * @private\n     * @param {Number} column Physical column index.\n     * @returns {Number} Visual column index.\n     */\n\n  }, {\n    key: 'onUnmodifyCol',\n    value: function onUnmodifyCol(column) {\n      var indexInMapper = this.columnsMapper.getIndexByValue(column);\n\n      return indexInMapper === null ? column : indexInMapper;\n    }\n\n    /**\n     * `afterPluginsInitialized` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterPluginsInitialized',\n    value: function onAfterPluginsInitialized() {\n      this.updateColumnsMapper();\n      this.initialSettings();\n      this.backlight.build();\n      this.guideline.build();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.backlight.destroy();\n      this.guideline.destroy();\n\n      _get(ManualColumnMove.prototype.__proto__ || Object.getPrototypeOf(ManualColumnMove.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return ManualColumnMove;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('ManualColumnMove', ManualColumnMove);\n\nexports.default = ManualColumnMove;\n\n/***/ }),\n/* 333 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _arrayMapper = __webpack_require__(201);\n\nvar _arrayMapper2 = _interopRequireDefault(_arrayMapper);\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class ColumnsMapper\n * @plugin ManualColumnMove\n */\nvar ColumnsMapper = function () {\n  function ColumnsMapper(manualColumnMove) {\n    _classCallCheck(this, ColumnsMapper);\n\n    /**\n     * Instance of ManualColumnMove plugin.\n     *\n     * @type {ManualColumnMove}\n     */\n    this.manualColumnMove = manualColumnMove;\n  }\n\n  /**\n   * Reset current map array and create new one.\n   *\n   * @param {Number} [length] Custom generated map length.\n   */\n\n\n  _createClass(ColumnsMapper, [{\n    key: 'createMap',\n    value: function createMap(length) {\n      var _this = this;\n\n      var originLength = length === void 0 ? this._arrayMap.length : length;\n\n      this._arrayMap.length = 0;\n\n      (0, _number.rangeEach)(originLength - 1, function (itemIndex) {\n        _this._arrayMap[itemIndex] = itemIndex;\n      });\n    }\n\n    /**\n     * Destroy class.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this._arrayMap = null;\n    }\n\n    /**\n     * Moving elements in columnsMapper.\n     *\n     * @param {Number} from Column index to move.\n     * @param {Number} to Target index.\n     */\n\n  }, {\n    key: 'moveColumn',\n    value: function moveColumn(from, to) {\n      var indexToMove = this._arrayMap[from];\n      this._arrayMap[from] = null;\n      this._arrayMap.splice(to, 0, indexToMove);\n    }\n\n    /**\n     * Clearing arrayMap from `null` entries.\n     */\n\n  }, {\n    key: 'clearNull',\n    value: function clearNull() {\n      this._arrayMap = (0, _array.arrayFilter)(this._arrayMap, function (i) {\n        return i !== null;\n      });\n    }\n  }]);\n\n  return ColumnsMapper;\n}();\n\n(0, _object.mixin)(ColumnsMapper, _arrayMapper2.default);\n\nexports.default = ColumnsMapper;\n\n/***/ }),\n/* 334 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(202);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CSS_CLASSNAME = 'ht__manualColumnMove--backlight';\n\n/**\n * @class BacklightUI\n * @util\n */\n\nvar BacklightUI = function (_BaseUI) {\n  _inherits(BacklightUI, _BaseUI);\n\n  function BacklightUI() {\n    _classCallCheck(this, BacklightUI);\n\n    return _possibleConstructorReturn(this, (BacklightUI.__proto__ || Object.getPrototypeOf(BacklightUI)).apply(this, arguments));\n  }\n\n  _createClass(BacklightUI, [{\n    key: 'build',\n\n    /**\n     * Custom className on build process.\n     */\n    value: function build() {\n      _get(BacklightUI.prototype.__proto__ || Object.getPrototypeOf(BacklightUI.prototype), 'build', this).call(this);\n\n      (0, _element.addClass)(this._element, CSS_CLASSNAME);\n    }\n  }]);\n\n  return BacklightUI;\n}(_base2.default);\n\nexports.default = BacklightUI;\n\n/***/ }),\n/* 335 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(202);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CSS_CLASSNAME = 'ht__manualColumnMove--guideline';\n\n/**\n * @class GuidelineUI\n * @util\n */\n\nvar GuidelineUI = function (_BaseUI) {\n  _inherits(GuidelineUI, _BaseUI);\n\n  function GuidelineUI() {\n    _classCallCheck(this, GuidelineUI);\n\n    return _possibleConstructorReturn(this, (GuidelineUI.__proto__ || Object.getPrototypeOf(GuidelineUI)).apply(this, arguments));\n  }\n\n  _createClass(GuidelineUI, [{\n    key: 'build',\n\n    /**\n     * Custom className on build process.\n     */\n    value: function build() {\n      _get(GuidelineUI.prototype.__proto__ || Object.getPrototypeOf(GuidelineUI.prototype), 'build', this).call(this);\n\n      (0, _element.addClass)(this._element, CSS_CLASSNAME);\n    }\n  }]);\n\n  return GuidelineUI;\n}(_base2.default);\n\nexports.default = GuidelineUI;\n\n/***/ }),\n/* 336 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 337 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _event = __webpack_require__(12);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// Developer note! Whenever you make a change in this file, make an analogous change in manualRowResize.js\n\n/**\n * @description\n * ManualColumnResize Plugin.\n *\n * Has 2 UI components:\n * - handle - the draggable element that sets the desired width of the column.\n * - guide - the helper guide that shows the desired width as a vertical guide.\n *\n * @plugin ManualColumnResize\n */\nvar ManualColumnResize = function (_BasePlugin) {\n  _inherits(ManualColumnResize, _BasePlugin);\n\n  function ManualColumnResize(hotInstance) {\n    _classCallCheck(this, ManualColumnResize);\n\n    var _this = _possibleConstructorReturn(this, (ManualColumnResize.__proto__ || Object.getPrototypeOf(ManualColumnResize)).call(this, hotInstance));\n\n    _this.currentTH = null;\n    _this.currentCol = null;\n    _this.selectedCols = [];\n    _this.currentWidth = null;\n    _this.newSize = null;\n    _this.startY = null;\n    _this.startWidth = null;\n    _this.startOffset = null;\n    _this.handle = document.createElement('DIV');\n    _this.guide = document.createElement('DIV');\n    _this.eventManager = new _eventManager2.default(_this);\n    _this.pressed = null;\n    _this.dblclick = 0;\n    _this.autoresizeTimeout = null;\n    _this.manualColumnWidths = [];\n\n    (0, _element.addClass)(_this.handle, 'manualColumnResizer');\n    (0, _element.addClass)(_this.guide, 'manualColumnResizerGuide');\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualColumnResize, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().manualColumnResize;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.manualColumnWidths = [];\n      var initialColumnWidth = this.hot.getSettings().manualColumnResize;\n      var loadedManualColumnWidths = this.loadManualColumnWidths();\n\n      this.addHook('modifyColWidth', function (width, col) {\n        return _this2.onModifyColWidth(width, col);\n      });\n      this.addHook('beforeStretchingColumnWidth', function (stretchedWidth, column) {\n        return _this2.onBeforeStretchingColumnWidth(stretchedWidth, column);\n      });\n      this.addHook('beforeColumnResize', function (currentColumn, newSize, isDoubleClick) {\n        return _this2.onBeforeColumnResize(currentColumn, newSize, isDoubleClick);\n      });\n\n      if (typeof loadedManualColumnWidths != 'undefined') {\n        this.manualColumnWidths = loadedManualColumnWidths;\n      } else if (Array.isArray(initialColumnWidth)) {\n        this.manualColumnWidths = initialColumnWidth;\n      } else {\n        this.manualColumnWidths = [];\n      }\n\n      // Handsontable.hooks.register('beforeColumnResize');\n      // Handsontable.hooks.register('afterColumnResize');\n\n      this.bindEvents();\n\n      _get(ManualColumnResize.prototype.__proto__ || Object.getPrototypeOf(ManualColumnResize.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      var initialColumnWidth = this.hot.getSettings().manualColumnResize;\n\n      if (Array.isArray(initialColumnWidth)) {\n        this.manualColumnWidths = initialColumnWidth;\n      } else if (!initialColumnWidth) {\n        this.manualColumnWidths = [];\n      }\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(ManualColumnResize.prototype.__proto__ || Object.getPrototypeOf(ManualColumnResize.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Save the current sizes using the persistentState plugin.\n     */\n\n  }, {\n    key: 'saveManualColumnWidths',\n    value: function saveManualColumnWidths() {\n      this.hot.runHooks('persistentStateSave', 'manualColumnWidths', this.manualColumnWidths);\n    }\n\n    /**\n     * Load the previously saved sizes using the persistentState plugin.\n     *\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'loadManualColumnWidths',\n    value: function loadManualColumnWidths() {\n      var storedState = {};\n\n      this.hot.runHooks('persistentStateLoad', 'manualColumnWidths', storedState);\n\n      return storedState.value;\n    }\n\n    /**\n     * Set the resize handle position.\n     *\n     * @param {HTMLCellElement} TH TH HTML element.\n     */\n\n  }, {\n    key: 'setupHandlePosition',\n    value: function setupHandlePosition(TH) {\n      var _this3 = this;\n\n      if (!TH.parentNode) {\n        return false;\n      }\n\n      this.currentTH = TH;\n\n      var col = this.hot.view.wt.wtTable.getCoords(TH).col; // getCoords returns CellCoords\n      var headerHeight = (0, _element.outerHeight)(this.currentTH);\n\n      if (col >= 0) {\n        // if not col header\n        var box = this.currentTH.getBoundingClientRect();\n\n        this.currentCol = col;\n        this.selectedCols = [];\n\n        if (this.hot.selection.isSelected() && this.hot.selection.isSelectedByColumnHeader()) {\n          var _hot$getSelectedRange = this.hot.getSelectedRangeLast(),\n              from = _hot$getSelectedRange.from,\n              to = _hot$getSelectedRange.to;\n\n          var start = from.col;\n          var end = to.col;\n\n          if (start >= end) {\n            start = to.col;\n            end = from.col;\n          }\n\n          if (this.currentCol >= start && this.currentCol <= end) {\n            (0, _number.rangeEach)(start, end, function (i) {\n              return _this3.selectedCols.push(i);\n            });\n          } else {\n            this.selectedCols.push(this.currentCol);\n          }\n        } else {\n          this.selectedCols.push(this.currentCol);\n        }\n\n        this.startOffset = box.left - 6;\n        this.startWidth = parseInt(box.width, 10);\n        this.handle.style.top = box.top + 'px';\n        this.handle.style.left = this.startOffset + this.startWidth + 'px';\n        this.handle.style.height = headerHeight + 'px';\n        this.hot.rootElement.appendChild(this.handle);\n      }\n    }\n\n    /**\n     * Refresh the resize handle position.\n     */\n\n  }, {\n    key: 'refreshHandlePosition',\n    value: function refreshHandlePosition() {\n      this.handle.style.left = this.startOffset + this.currentWidth + 'px';\n    }\n\n    /**\n     * Set the resize guide position.\n     */\n\n  }, {\n    key: 'setupGuidePosition',\n    value: function setupGuidePosition() {\n      var handleHeight = parseInt((0, _element.outerHeight)(this.handle), 10);\n      var handleBottomPosition = parseInt(this.handle.style.top, 10) + handleHeight;\n      var maximumVisibleElementHeight = parseInt(this.hot.view.maximumVisibleElementHeight(0), 10);\n\n      (0, _element.addClass)(this.handle, 'active');\n      (0, _element.addClass)(this.guide, 'active');\n\n      this.guide.style.top = handleBottomPosition + 'px';\n      this.guide.style.left = this.handle.style.left;\n      this.guide.style.height = maximumVisibleElementHeight - handleHeight + 'px';\n      this.hot.rootElement.appendChild(this.guide);\n    }\n\n    /**\n     * Refresh the resize guide position.\n     */\n\n  }, {\n    key: 'refreshGuidePosition',\n    value: function refreshGuidePosition() {\n      this.guide.style.left = this.handle.style.left;\n    }\n\n    /**\n     * Hide both the resize handle and resize guide.\n     */\n\n  }, {\n    key: 'hideHandleAndGuide',\n    value: function hideHandleAndGuide() {\n      (0, _element.removeClass)(this.handle, 'active');\n      (0, _element.removeClass)(this.guide, 'active');\n    }\n\n    /**\n     * Check if provided element is considered a column header.\n     *\n     * @param {HTMLElement} element HTML element.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'checkIfColumnHeader',\n    value: function checkIfColumnHeader(element) {\n      if (element != this.hot.rootElement) {\n        var parent = element.parentNode;\n\n        if (parent.tagName === 'THEAD') {\n          return true;\n        }\n\n        return this.checkIfColumnHeader(parent);\n      }\n\n      return false;\n    }\n\n    /**\n     * Get the TH element from the provided element.\n     *\n     * @param {HTMLElement} element HTML element.\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'getTHFromTargetElement',\n    value: function getTHFromTargetElement(element) {\n      if (element.tagName != 'TABLE') {\n        if (element.tagName == 'TH') {\n          return element;\n        }\n        return this.getTHFromTargetElement(element.parentNode);\n      }\n\n      return null;\n    }\n\n    /**\n     * 'mouseover' event callback - set the handle position.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseOver',\n    value: function onMouseOver(event) {\n      if (this.checkIfColumnHeader(event.target)) {\n        var th = this.getTHFromTargetElement(event.target);\n\n        if (!th) {\n          return;\n        }\n\n        var colspan = th.getAttribute('colspan');\n\n        if (th && (colspan === null || colspan === 1)) {\n          if (!this.pressed) {\n            this.setupHandlePosition(th);\n          }\n        }\n      }\n    }\n\n    /**\n     * Auto-size row after doubleclick - callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'afterMouseDownTimeout',\n    value: function afterMouseDownTimeout() {\n      var _this4 = this;\n\n      var render = function render() {\n        _this4.hot.forceFullRender = true;\n        _this4.hot.view.render(); // updates all\n        _this4.hot.view.wt.wtOverlays.adjustElementsSize(true);\n      };\n      var resize = function resize(selectedCol, forceRender) {\n        var hookNewSize = _this4.hot.runHooks('beforeColumnResize', selectedCol, _this4.newSize, true);\n\n        if (hookNewSize !== void 0) {\n          _this4.newSize = hookNewSize;\n        }\n\n        if (_this4.hot.getSettings().stretchH === 'all') {\n          _this4.clearManualSize(selectedCol);\n        } else {\n          _this4.setManualSize(selectedCol, _this4.newSize); // double click sets by auto row size plugin\n        }\n\n        if (forceRender) {\n          render();\n        }\n\n        _this4.saveManualColumnWidths();\n\n        _this4.hot.runHooks('afterColumnResize', selectedCol, _this4.newSize, true);\n      };\n\n      if (this.dblclick >= 2) {\n        var selectedColsLength = this.selectedCols.length;\n\n        if (selectedColsLength > 1) {\n          (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n            resize(selectedCol);\n          });\n          render();\n        } else {\n          (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n            resize(selectedCol, true);\n          });\n        }\n      }\n      this.dblclick = 0;\n      this.autoresizeTimeout = null;\n    }\n\n    /**\n     * 'mousedown' event callback.\n     *\n     * @private\n     * @param {MouseEvent} e\n     */\n\n  }, {\n    key: 'onMouseDown',\n    value: function onMouseDown(event) {\n      var _this5 = this;\n\n      if ((0, _element.hasClass)(event.target, 'manualColumnResizer')) {\n        this.setupGuidePosition();\n        this.pressed = this.hot;\n\n        if (this.autoresizeTimeout === null) {\n          this.autoresizeTimeout = setTimeout(function () {\n            return _this5.afterMouseDownTimeout();\n          }, 500);\n\n          this.hot._registerTimeout(this.autoresizeTimeout);\n        }\n        this.dblclick++;\n\n        this.startX = (0, _event.pageX)(event);\n        this.newSize = this.startWidth;\n      }\n    }\n\n    /**\n     * 'mousemove' event callback - refresh the handle and guide positions, cache the new column width.\n     *\n     * @private\n     * @param {MouseEvent} e\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var _this6 = this;\n\n      if (this.pressed) {\n        this.currentWidth = this.startWidth + ((0, _event.pageX)(event) - this.startX);\n\n        (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n          _this6.newSize = _this6.setManualSize(selectedCol, _this6.currentWidth);\n        });\n\n        this.refreshHandlePosition();\n        this.refreshGuidePosition();\n      }\n    }\n\n    /**\n     * 'mouseup' event callback - apply the column resizing.\n     *\n     * @private\n     * @param {MouseEvent} e\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp(event) {\n      var _this7 = this;\n\n      var render = function render() {\n        _this7.hot.forceFullRender = true;\n        _this7.hot.view.render(); // updates all\n        _this7.hot.view.wt.wtOverlays.adjustElementsSize(true);\n      };\n      var resize = function resize(selectedCol, forceRender) {\n        _this7.hot.runHooks('beforeColumnResize', selectedCol, _this7.newSize);\n\n        if (forceRender) {\n          render();\n        }\n\n        _this7.saveManualColumnWidths();\n\n        _this7.hot.runHooks('afterColumnResize', selectedCol, _this7.newSize);\n      };\n\n      if (this.pressed) {\n        this.hideHandleAndGuide();\n        this.pressed = false;\n\n        if (this.newSize != this.startWidth) {\n          var selectedColsLength = this.selectedCols.length;\n\n          if (selectedColsLength > 1) {\n            (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n              resize(selectedCol);\n            });\n            render();\n          } else {\n            (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n              resize(selectedCol, true);\n            });\n          }\n        }\n\n        this.setupHandlePosition(this.currentTH);\n      }\n    }\n\n    /**\n     * Bind the mouse events.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'bindEvents',\n    value: function bindEvents() {\n      var _this8 = this;\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'mouseover', function (e) {\n        return _this8.onMouseOver(e);\n      });\n      this.eventManager.addEventListener(this.hot.rootElement, 'mousedown', function (e) {\n        return _this8.onMouseDown(e);\n      });\n      this.eventManager.addEventListener(window, 'mousemove', function (e) {\n        return _this8.onMouseMove(e);\n      });\n      this.eventManager.addEventListener(window, 'mouseup', function (e) {\n        return _this8.onMouseUp(e);\n      });\n    }\n\n    /**\n     * Cache the current column width.\n     *\n     * @param {Number} column Visual column index.\n     * @param {Number} width Column width.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'setManualSize',\n    value: function setManualSize(column, width) {\n      width = Math.max(width, 20);\n\n      /**\n       *  We need to run col through modifyCol hook, in case the order of displayed columns is different than the order\n       *  in data source. For instance, this order can be modified by manualColumnMove plugin.\n       */\n      column = this.hot.runHooks('modifyCol', column);\n\n      this.manualColumnWidths[column] = width;\n\n      return width;\n    }\n\n    /**\n     * Clear cache for the current column index.\n     *\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'clearManualSize',\n    value: function clearManualSize(column) {\n      column = this.hot.runHooks('modifyCol', column);\n\n      this.manualColumnWidths[column] = void 0;\n    }\n\n    /**\n     * Modify the provided column width, based on the plugin settings\n     *\n     * @private\n     * @param {Number} width Column width.\n     * @param {Number} column Visual column index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onModifyColWidth',\n    value: function onModifyColWidth(width, column) {\n      if (this.enabled) {\n        column = this.hot.runHooks('modifyCol', column);\n\n        if (this.hot.getSettings().manualColumnResize && this.manualColumnWidths[column]) {\n          return this.manualColumnWidths[column];\n        }\n      }\n\n      return width;\n    }\n\n    /**\n     * Modify the provided column stretched width. This hook decides if specified column should be stretched or not.\n     *\n     * @private\n     * @param {Number} stretchedWidth Stretched width.\n     * @param {Number} column Physical column index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onBeforeStretchingColumnWidth',\n    value: function onBeforeStretchingColumnWidth(stretchedWidth, column) {\n      var width = this.manualColumnWidths[column];\n\n      if (width === void 0) {\n        width = stretchedWidth;\n      }\n\n      return width;\n    }\n\n    /**\n     * `beforeColumnResize` hook callback.\n     *\n     * @private\n     * @param {Number} currentColumn Index of the resized column.\n     * @param {Number} newSize Calculated new column width.\n     * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n     */\n\n  }, {\n    key: 'onBeforeColumnResize',\n    value: function onBeforeColumnResize() {\n      // clear the header height cache information\n      this.hot.view.wt.wtViewport.hasOversizedColumnHeadersMarked = {};\n    }\n  }]);\n\n  return ManualColumnResize;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('manualColumnResize', ManualColumnResize);\n\nexports.default = ManualColumnResize;\n\n/***/ }),\n/* 338 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _element = __webpack_require__(0);\n\nvar _number = __webpack_require__(5);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nvar _rowsMapper = __webpack_require__(339);\n\nvar _rowsMapper2 = _interopRequireDefault(_rowsMapper);\n\nvar _backlight = __webpack_require__(340);\n\nvar _backlight2 = _interopRequireDefault(_backlight);\n\nvar _guideline = __webpack_require__(341);\n\nvar _guideline2 = _interopRequireDefault(_guideline);\n\nvar _src = __webpack_require__(4);\n\n__webpack_require__(342);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('beforeRowMove');\n_pluginHooks2.default.getSingleton().register('afterRowMove');\n_pluginHooks2.default.getSingleton().register('unmodifyRow');\n\nvar privatePool = new WeakMap();\nvar CSS_PLUGIN = 'ht__manualRowMove';\nvar CSS_SHOW_UI = 'show-ui';\nvar CSS_ON_MOVING = 'on-moving--rows';\nvar CSS_AFTER_SELECTION = 'after-selection--rows';\n\n/**\n * @plugin ManualRowMove\n *\n * @description\n * This plugin allows to change rows order.\n *\n * API:\n * - moveRow - move single row to the new position.\n * - moveRows - move many rows (as an array of indexes) to the new position.\n *\n * If you want apply visual changes, you have to call manually the render() method on the instance of handsontable.\n *\n * UI components:\n * - backlight - highlight of selected rows.\n * - guideline - line which shows where rows has been moved.\n *\n * @class ManualRowMove\n * @plugin ManualRowMove\n */\n\nvar ManualRowMove = function (_BasePlugin) {\n  _inherits(ManualRowMove, _BasePlugin);\n\n  function ManualRowMove(hotInstance) {\n    _classCallCheck(this, ManualRowMove);\n\n    /**\n     * Set up WeakMap of plugin to sharing private parameters;\n     */\n    var _this = _possibleConstructorReturn(this, (ManualRowMove.__proto__ || Object.getPrototypeOf(ManualRowMove)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      rowsToMove: [],\n      pressed: void 0,\n      disallowMoving: void 0,\n      target: {\n        eventPageY: void 0,\n        coords: void 0,\n        TD: void 0,\n        row: void 0\n      }\n    });\n\n    /**\n     * List of last removed row indexes.\n     *\n     * @type {Array}\n     */\n    _this.removedRows = [];\n    /**\n     * Object containing visual row indexes mapped to data source indexes.\n     *\n     * @type {RowsMapper}\n     */\n    _this.rowsMapper = new _rowsMapper2.default(_this);\n    /**\n     * Event Manager object.\n     *\n     * @type {Object}\n     */\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Backlight UI object.\n     *\n     * @type {Object}\n     */\n    _this.backlight = new _backlight2.default(hotInstance);\n    /**\n     * Guideline UI object.\n     *\n     * @type {Object}\n     */\n    _this.guideline = new _guideline2.default(hotInstance);\n    return _this;\n  }\n\n  /**\n   * Check if plugin is enabled.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualRowMove, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().manualRowMove;\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('beforeOnCellMouseDown', function (event, coords, TD, blockCalculations) {\n        return _this2.onBeforeOnCellMouseDown(event, coords, TD, blockCalculations);\n      });\n      this.addHook('beforeOnCellMouseOver', function (event, coords, TD, blockCalculations) {\n        return _this2.onBeforeOnCellMouseOver(event, coords, TD, blockCalculations);\n      });\n      this.addHook('afterScrollHorizontally', function () {\n        return _this2.onAfterScrollHorizontally();\n      });\n      this.addHook('modifyRow', function (row, source) {\n        return _this2.onModifyRow(row, source);\n      });\n      this.addHook('beforeRemoveRow', function (index, amount) {\n        return _this2.onBeforeRemoveRow(index, amount);\n      });\n      this.addHook('afterRemoveRow', function () {\n        return _this2.onAfterRemoveRow();\n      });\n      this.addHook('afterCreateRow', function (index, amount) {\n        return _this2.onAfterCreateRow(index, amount);\n      });\n      this.addHook('afterLoadData', function () {\n        return _this2.onAfterLoadData();\n      });\n      this.addHook('beforeColumnSort', function (column, order) {\n        return _this2.onBeforeColumnSort(column, order);\n      });\n      this.addHook('unmodifyRow', function (row) {\n        return _this2.onUnmodifyRow(row);\n      });\n\n      this.registerEvents();\n\n      // TODO: move adding plugin classname to BasePlugin.\n      (0, _element.addClass)(this.hot.rootElement, CSS_PLUGIN);\n\n      _get(ManualRowMove.prototype.__proto__ || Object.getPrototypeOf(ManualRowMove.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      this.onAfterPluginsInitialized();\n\n      _get(ManualRowMove.prototype.__proto__ || Object.getPrototypeOf(ManualRowMove.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      var pluginSettings = this.hot.getSettings().manualRowMove;\n\n      if (Array.isArray(pluginSettings)) {\n        this.rowsMapper.clearMap();\n      }\n\n      (0, _element.removeClass)(this.hot.rootElement, CSS_PLUGIN);\n\n      this.unregisterEvents();\n      this.backlight.destroy();\n      this.guideline.destroy();\n\n      _get(ManualRowMove.prototype.__proto__ || Object.getPrototypeOf(ManualRowMove.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Move a single row.\n     *\n     * @param {Number} row Visual row index to be moved.\n     * @param {Number} target Visual row index being a target for the moved row.\n     */\n\n  }, {\n    key: 'moveRow',\n    value: function moveRow(row, target) {\n      this.moveRows([row], target);\n    }\n\n    /**\n     * Move multiple rows.\n     *\n     * @param {Array} rows Array of visual row indexes to be moved.\n     * @param {Number} target Visual row index being a target for the moved rows.\n     */\n\n  }, {\n    key: 'moveRows',\n    value: function moveRows(rows, target) {\n      var _this3 = this;\n\n      var visualRows = [].concat(_toConsumableArray(rows));\n      var priv = privatePool.get(this);\n      var beforeMoveHook = this.hot.runHooks('beforeRowMove', visualRows, target);\n\n      priv.disallowMoving = beforeMoveHook === false;\n\n      if (!priv.disallowMoving) {\n        // first we need to rewrite an visual indexes to physical for save reference after move\n        (0, _array.arrayEach)(rows, function (row, index, array) {\n          array[index] = _this3.rowsMapper.getValueByIndex(row);\n        });\n\n        // next, when we have got an physical indexes, we can move rows\n        (0, _array.arrayEach)(rows, function (row, index) {\n          var actualPosition = _this3.rowsMapper.getIndexByValue(row);\n\n          if (actualPosition !== target) {\n            _this3.rowsMapper.moveRow(actualPosition, target + index);\n          }\n        });\n\n        // after moving we have to clear rowsMapper from null entries\n        this.rowsMapper.clearNull();\n      }\n\n      this.hot.runHooks('afterRowMove', visualRows, target);\n    }\n\n    /**\n     * Correct the cell selection after the move action. Fired only when action was made with a mouse.\n     * That means that changing the row order using the API won't correct the selection.\n     *\n     * @private\n     * @param {Number} startRow Visual row index for the start of the selection.\n     * @param {Number} endRow Visual row index for the end of the selection.\n     */\n\n  }, {\n    key: 'changeSelection',\n    value: function changeSelection(startRow, endRow) {\n      this.hot.selectRows(startRow, endRow);\n    }\n\n    /**\n     * Get the sum of the heights of rows in the provided range.\n     *\n     * @private\n     * @param {Number} from Visual row index.\n     * @param {Number} to Visual row index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getRowsHeight',\n    value: function getRowsHeight(from, to) {\n      var height = 0;\n\n      for (var i = from; i < to; i++) {\n        var rowHeight = this.hot.view.wt.wtTable.getRowHeight(i) || 23;\n\n        height += rowHeight;\n      }\n\n      return height;\n    }\n\n    /**\n     * Load initial settings when persistent state is saved or when plugin was initialized as an array.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'initialSettings',\n    value: function initialSettings() {\n      var pluginSettings = this.hot.getSettings().manualRowMove;\n\n      if (Array.isArray(pluginSettings)) {\n        this.moveRows(pluginSettings, 0);\n      } else if (pluginSettings !== void 0) {\n        var persistentState = this.persistentStateLoad();\n\n        if (persistentState.length) {\n          this.moveRows(persistentState, 0);\n        }\n      }\n    }\n\n    /**\n     * Check if the provided row is in the fixedRowsTop section.\n     *\n     * @private\n     * @param {Number} row Visual row index to check.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isFixedRowTop',\n    value: function isFixedRowTop(row) {\n      return row < this.hot.getSettings().fixedRowsTop;\n    }\n\n    /**\n     * Check if the provided row is in the fixedRowsBottom section.\n     *\n     * @private\n     * @param {Number} row Visual row index to check.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isFixedRowBottom',\n    value: function isFixedRowBottom(row) {\n      return row > this.hot.getSettings().fixedRowsBottom;\n    }\n\n    /**\n     * Save the manual row positions to the persistent state.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'persistentStateSave',\n    value: function persistentStateSave() {\n      this.hot.runHooks('persistentStateSave', 'manualRowMove', this.rowsMapper._arrayMap);\n    }\n\n    /**\n     * Load the manual row positions from the persistent state.\n     *\n     * @private\n     * @returns {Array} Stored state.\n     */\n\n  }, {\n    key: 'persistentStateLoad',\n    value: function persistentStateLoad() {\n      var storedState = {};\n\n      this.hot.runHooks('persistentStateLoad', 'manualRowMove', storedState);\n\n      return storedState.value ? storedState.value : [];\n    }\n\n    /**\n     * Prepare array of indexes based on actual selection.\n     *\n     * @private\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'prepareRowsToMoving',\n    value: function prepareRowsToMoving() {\n      var selection = this.hot.getSelectedRangeLast();\n      var selectedRows = [];\n\n      if (!selection) {\n        return selectedRows;\n      }\n\n      var from = selection.from,\n          to = selection.to;\n\n      var start = Math.min(from.row, to.row);\n      var end = Math.max(from.row, to.row);\n\n      (0, _number.rangeEach)(start, end, function (i) {\n        selectedRows.push(i);\n      });\n\n      return selectedRows;\n    }\n\n    /**\n     * Update the UI visual position.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'refreshPositions',\n    value: function refreshPositions() {\n      var priv = privatePool.get(this);\n      var coords = priv.target.coords;\n      var firstVisible = this.hot.view.wt.wtTable.getFirstVisibleRow();\n      var lastVisible = this.hot.view.wt.wtTable.getLastVisibleRow();\n      var fixedRows = this.hot.getSettings().fixedRowsTop;\n      var countRows = this.hot.countRows();\n\n      if (coords.row < fixedRows && firstVisible > 0) {\n        this.hot.scrollViewportTo(firstVisible - 1);\n      }\n      if (coords.row >= lastVisible && lastVisible < countRows) {\n        this.hot.scrollViewportTo(lastVisible + 1, undefined, true);\n      }\n\n      var wtTable = this.hot.view.wt.wtTable;\n      var TD = priv.target.TD;\n      var rootElementOffset = (0, _element.offset)(this.hot.rootElement);\n      var tdOffsetTop = this.hot.view.THEAD.offsetHeight + this.getRowsHeight(0, coords.row);\n      var mouseOffsetTop = priv.target.eventPageY - rootElementOffset.top + wtTable.holder.scrollTop;\n      var hiderHeight = wtTable.hider.offsetHeight;\n      var tbodyOffsetTop = wtTable.TBODY.offsetTop;\n      var backlightElemMarginTop = this.backlight.getOffset().top;\n      var backlightElemHeight = this.backlight.getSize().height;\n\n      if (this.isFixedRowTop(coords.row)) {\n        tdOffsetTop += wtTable.holder.scrollTop;\n      }\n\n      // todo: fixedRowsBottom\n      // if (this.isFixedRowBottom(coords.row)) {\n      //\n      // }\n\n      if (coords.row < 0) {\n        // if hover on colHeader\n        priv.target.row = firstVisible > 0 ? firstVisible - 1 : firstVisible;\n      } else if (TD.offsetHeight / 2 + tdOffsetTop <= mouseOffsetTop) {\n        // if hover on lower part of TD\n        priv.target.row = coords.row + 1;\n        // unfortunately first row is bigger than rest\n        tdOffsetTop += coords.row === 0 ? TD.offsetHeight - 1 : TD.offsetHeight;\n      } else {\n        // elsewhere on table\n        priv.target.row = coords.row;\n      }\n\n      var backlightTop = mouseOffsetTop;\n      var guidelineTop = tdOffsetTop;\n\n      if (mouseOffsetTop + backlightElemHeight + backlightElemMarginTop >= hiderHeight) {\n        // prevent display backlight below table\n        backlightTop = hiderHeight - backlightElemHeight - backlightElemMarginTop;\n      } else if (mouseOffsetTop + backlightElemMarginTop < tbodyOffsetTop) {\n        // prevent display above below table\n        backlightTop = tbodyOffsetTop + Math.abs(backlightElemMarginTop);\n      }\n\n      if (tdOffsetTop >= hiderHeight - 1) {\n        // prevent display guideline below table\n        guidelineTop = hiderHeight - 1;\n      }\n\n      var topOverlayHeight = 0;\n      if (this.hot.view.wt.wtOverlays.topOverlay) {\n        topOverlayHeight = this.hot.view.wt.wtOverlays.topOverlay.clone.wtTable.TABLE.offsetHeight;\n      }\n\n      if (coords.row >= fixedRows && guidelineTop - wtTable.holder.scrollTop < topOverlayHeight) {\n        this.hot.scrollViewportTo(coords.row);\n      }\n\n      this.backlight.setPosition(backlightTop);\n      this.guideline.setPosition(guidelineTop);\n    }\n\n    /**\n     * This method checks arrayMap from rowsMapper and updates the rowsMapper if it's necessary.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'updateRowsMapper',\n    value: function updateRowsMapper() {\n      var countRows = this.hot.countSourceRows();\n      var rowsMapperLen = this.rowsMapper._arrayMap.length;\n\n      if (rowsMapperLen === 0) {\n        this.rowsMapper.createMap(countRows || this.hot.getSettings().startRows);\n      } else if (rowsMapperLen < countRows) {\n        var diff = countRows - rowsMapperLen;\n\n        this.rowsMapper.insertItems(rowsMapperLen, diff);\n      } else if (rowsMapperLen > countRows) {\n        var maxIndex = countRows - 1;\n        var rowsToRemove = [];\n\n        (0, _array.arrayEach)(this.rowsMapper._arrayMap, function (value, index) {\n          if (value > maxIndex) {\n            rowsToRemove.push(index);\n          }\n        });\n\n        this.rowsMapper.removeItems(rowsToRemove);\n      }\n    }\n\n    /**\n     * Bind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this4 = this;\n\n      this.eventManager.addEventListener(document.documentElement, 'mousemove', function (event) {\n        return _this4.onMouseMove(event);\n      });\n      this.eventManager.addEventListener(document.documentElement, 'mouseup', function () {\n        return _this4.onMouseUp();\n      });\n    }\n\n    /**\n     * Unbind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'unregisterEvents',\n    value: function unregisterEvents() {\n      this.eventManager.clear();\n    }\n\n    /**\n     * `beforeColumnSort` hook callback. If user uses the sorting, manual row moving is disabled.\n     *\n     * @private\n     * @param {Number} column Column index where soring is present\n     * @param {*} order State of sorting. ASC/DESC/None\n     */\n\n  }, {\n    key: 'onBeforeColumnSort',\n    value: function onBeforeColumnSort(column, order) {\n      var priv = privatePool.get(this);\n\n      priv.disallowMoving = order !== void 0;\n    }\n\n    /**\n     * Change the behavior of selection / dragging.\n     *\n     * @private\n     * @param {MouseEvent} event\n     * @param {CellCoords} coords Visual coordinates.\n     * @param {HTMLElement} TD\n     * @param {Object} blockCalculations\n     */\n\n  }, {\n    key: 'onBeforeOnCellMouseDown',\n    value: function onBeforeOnCellMouseDown(event, coords, TD, blockCalculations) {\n      var wtTable = this.hot.view.wt.wtTable;\n      var isHeaderSelection = this.hot.selection.isSelectedByRowHeader();\n      var selection = this.hot.getSelectedRangeLast();\n      var priv = privatePool.get(this);\n\n      if (!selection || !isHeaderSelection || priv.pressed || event.button !== 0) {\n        priv.pressed = false;\n        priv.rowsToMove.length = 0;\n        (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI]);\n        return;\n      }\n\n      var guidelineIsNotReady = this.guideline.isBuilt() && !this.guideline.isAppended();\n      var backlightIsNotReady = this.backlight.isBuilt() && !this.backlight.isAppended();\n\n      if (guidelineIsNotReady && backlightIsNotReady) {\n        this.guideline.appendTo(wtTable.hider);\n        this.backlight.appendTo(wtTable.hider);\n      }\n\n      var from = selection.from,\n          to = selection.to;\n\n      var start = Math.min(from.row, to.row);\n      var end = Math.max(from.row, to.row);\n\n      if (coords.col < 0 && coords.row >= start && coords.row <= end) {\n        blockCalculations.row = true;\n        priv.pressed = true;\n        priv.target.eventPageY = event.pageY;\n        priv.target.coords = coords;\n        priv.target.TD = TD;\n        priv.rowsToMove = this.prepareRowsToMoving();\n\n        var leftPos = wtTable.holder.scrollLeft + this.hot.view.wt.wtViewport.getRowHeaderWidth();\n\n        this.backlight.setPosition(null, leftPos);\n        this.backlight.setSize(wtTable.hider.offsetWidth - leftPos, this.getRowsHeight(start, end + 1));\n        this.backlight.setOffset((this.getRowsHeight(start, coords.row) + event.layerY) * -1, null);\n\n        (0, _element.addClass)(this.hot.rootElement, CSS_ON_MOVING);\n\n        this.refreshPositions();\n      } else {\n        (0, _element.removeClass)(this.hot.rootElement, CSS_AFTER_SELECTION);\n        priv.pressed = false;\n        priv.rowsToMove.length = 0;\n      }\n    }\n\n    /**\n     * 'mouseMove' event callback. Fired when pointer move on document.documentElement.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var priv = privatePool.get(this);\n\n      if (!priv.pressed) {\n        return;\n      }\n\n      // callback for browser which doesn't supports CSS pointer-event: none\n      if (event.realTarget === this.backlight.element) {\n        var height = this.backlight.getSize().height;\n        this.backlight.setSize(null, 0);\n\n        setTimeout(function () {\n          this.backlight.setPosition(null, height);\n        });\n      }\n\n      priv.target.eventPageY = event.pageY;\n      this.refreshPositions();\n    }\n\n    /**\n     * 'beforeOnCellMouseOver' hook callback. Fired when pointer was over cell.\n     *\n     * @private\n     * @param {MouseEvent} event `mouseover` event properties.\n     * @param {CellCoords} coords Visual cell coordinates where was fired event.\n     * @param {HTMLElement} TD Cell represented as HTMLElement.\n     * @param {Object} blockCalculations Object which contains information about blockCalculation for row, column or cells.\n     */\n\n  }, {\n    key: 'onBeforeOnCellMouseOver',\n    value: function onBeforeOnCellMouseOver(event, coords, TD, blockCalculations) {\n      var selectedRange = this.hot.getSelectedRangeLast();\n      var priv = privatePool.get(this);\n\n      if (!selectedRange || !priv.pressed) {\n        return;\n      }\n\n      if (priv.rowsToMove.indexOf(coords.row) > -1) {\n        (0, _element.removeClass)(this.hot.rootElement, CSS_SHOW_UI);\n      } else {\n        (0, _element.addClass)(this.hot.rootElement, CSS_SHOW_UI);\n      }\n\n      blockCalculations.row = true;\n      blockCalculations.column = true;\n      blockCalculations.cell = true;\n      priv.target.coords = coords;\n      priv.target.TD = TD;\n    }\n\n    /**\n     * `onMouseUp` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      var priv = privatePool.get(this);\n      var target = priv.target.row;\n      var rowsLen = priv.rowsToMove.length;\n\n      priv.pressed = false;\n      priv.backlightHeight = 0;\n\n      (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI, CSS_AFTER_SELECTION]);\n\n      if (this.hot.selection.isSelectedByRowHeader()) {\n        (0, _element.addClass)(this.hot.rootElement, CSS_AFTER_SELECTION);\n      }\n\n      if (rowsLen < 1 || target === void 0 || priv.rowsToMove.indexOf(target) > -1 || priv.rowsToMove[rowsLen - 1] === target - 1) {\n        return;\n      }\n\n      this.moveRows(priv.rowsToMove, target);\n\n      this.persistentStateSave();\n      this.hot.render();\n\n      if (!priv.disallowMoving) {\n        var selectionStart = this.rowsMapper.getIndexByValue(priv.rowsToMove[0]);\n        var selectionEnd = this.rowsMapper.getIndexByValue(priv.rowsToMove[rowsLen - 1]);\n        this.changeSelection(selectionStart, selectionEnd);\n      }\n\n      priv.rowsToMove.length = 0;\n    }\n\n    /**\n     * `afterScrollHorizontally` hook callback. Fired the table was scrolled horizontally.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterScrollHorizontally',\n    value: function onAfterScrollHorizontally() {\n      var wtTable = this.hot.view.wt.wtTable;\n      var headerWidth = this.hot.view.wt.wtViewport.getRowHeaderWidth();\n      var scrollLeft = wtTable.holder.scrollLeft;\n      var posLeft = headerWidth + scrollLeft;\n\n      this.backlight.setPosition(null, posLeft);\n      this.backlight.setSize(wtTable.hider.offsetWidth - posLeft);\n    }\n\n    /**\n     * `afterCreateRow` hook callback.\n     *\n     * @private\n     * @param {Number} index Visual index of the created row.\n     * @param {Number} amount Amount of created rows.\n     */\n\n  }, {\n    key: 'onAfterCreateRow',\n    value: function onAfterCreateRow(index, amount) {\n      this.rowsMapper.shiftItems(index, amount);\n    }\n\n    /**\n     * On before remove row listener.\n     *\n     * @private\n     * @param {Number} index Visual row index.\n     * @param {Number} amount Defines how many rows removed.\n     */\n\n  }, {\n    key: 'onBeforeRemoveRow',\n    value: function onBeforeRemoveRow(index, amount) {\n      var _this5 = this;\n\n      this.removedRows.length = 0;\n\n      if (index !== false) {\n        // Collect physical row index.\n        (0, _number.rangeEach)(index, index + amount - 1, function (removedIndex) {\n          _this5.removedRows.push(_this5.hot.runHooks('modifyRow', removedIndex, _this5.pluginName));\n        });\n      }\n    }\n\n    /**\n     * `afterRemoveRow` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterRemoveRow',\n    value: function onAfterRemoveRow() {\n      this.rowsMapper.unshiftItems(this.removedRows);\n    }\n\n    /**\n     * `afterLoadData` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData() {\n      this.updateRowsMapper();\n    }\n\n    /**\n     * 'modifyRow' hook callback.\n     *\n     * @private\n     * @param {Number} row Visual Row index.\n     * @returns {Number} Physical row index.\n     */\n\n  }, {\n    key: 'onModifyRow',\n    value: function onModifyRow(row, source) {\n      if (source !== this.pluginName) {\n        var rowInMapper = this.rowsMapper.getValueByIndex(row);\n        row = rowInMapper === null ? row : rowInMapper;\n      }\n\n      return row;\n    }\n\n    /**\n     * 'unmodifyRow' hook callback.\n     *\n     * @private\n     * @param {Number} row Physical row index.\n     * @returns {Number} Visual row index.\n     */\n\n  }, {\n    key: 'onUnmodifyRow',\n    value: function onUnmodifyRow(row) {\n      var indexInMapper = this.rowsMapper.getIndexByValue(row);\n\n      return indexInMapper === null ? row : indexInMapper;\n    }\n\n    /**\n     * `afterPluginsInitialized` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterPluginsInitialized',\n    value: function onAfterPluginsInitialized() {\n      this.updateRowsMapper();\n      this.initialSettings();\n      this.backlight.build();\n      this.guideline.build();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.backlight.destroy();\n      this.guideline.destroy();\n\n      _get(ManualRowMove.prototype.__proto__ || Object.getPrototypeOf(ManualRowMove.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return ManualRowMove;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('ManualRowMove', ManualRowMove);\n\nexports.default = ManualRowMove;\n\n/***/ }),\n/* 339 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _arrayMapper = __webpack_require__(201);\n\nvar _arrayMapper2 = _interopRequireDefault(_arrayMapper);\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class RowsMapper\n * @plugin ManualRowMove\n */\nvar RowsMapper = function () {\n  function RowsMapper(manualRowMove) {\n    _classCallCheck(this, RowsMapper);\n\n    /**\n     * Instance of ManualRowMove plugin.\n     *\n     * @type {ManualRowMove}\n     */\n    this.manualRowMove = manualRowMove;\n  }\n\n  /**\n   * Reset current map array and create new one.\n   *\n   * @param {Number} [length] Custom generated map length.\n   */\n\n\n  _createClass(RowsMapper, [{\n    key: 'createMap',\n    value: function createMap(length) {\n      var _this = this;\n\n      var originLength = length === void 0 ? this._arrayMap.length : length;\n\n      this._arrayMap.length = 0;\n\n      (0, _number.rangeEach)(originLength - 1, function (itemIndex) {\n        _this._arrayMap[itemIndex] = itemIndex;\n      });\n    }\n\n    /**\n     * Destroy class.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this._arrayMap = null;\n    }\n\n    /**\n     *\n     * Moving elements in rowsMapper.\n     * @param {Number} from Row index to move.\n     * @param {Number} to Target index.\n     */\n\n  }, {\n    key: 'moveRow',\n    value: function moveRow(from, to) {\n      var indexToMove = this._arrayMap[from];\n      this._arrayMap[from] = null;\n      this._arrayMap.splice(to, 0, indexToMove);\n    }\n\n    /**\n     * Clearing arrayMap from `null` entries.\n     */\n\n  }, {\n    key: 'clearNull',\n    value: function clearNull() {\n      this._arrayMap = (0, _array.arrayFilter)(this._arrayMap, function (i) {\n        return i !== null;\n      });\n    }\n  }]);\n\n  return RowsMapper;\n}();\n\n(0, _object.mixin)(RowsMapper, _arrayMapper2.default);\n\nexports.default = RowsMapper;\n\n/***/ }),\n/* 340 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(203);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CSS_CLASSNAME = 'ht__manualRowMove--backlight';\n\n/**\n * @class BacklightUI\n * @util\n */\n\nvar BacklightUI = function (_BaseUI) {\n  _inherits(BacklightUI, _BaseUI);\n\n  function BacklightUI() {\n    _classCallCheck(this, BacklightUI);\n\n    return _possibleConstructorReturn(this, (BacklightUI.__proto__ || Object.getPrototypeOf(BacklightUI)).apply(this, arguments));\n  }\n\n  _createClass(BacklightUI, [{\n    key: 'build',\n\n    /**\n     * Custom className on build process.\n     */\n    value: function build() {\n      _get(BacklightUI.prototype.__proto__ || Object.getPrototypeOf(BacklightUI.prototype), 'build', this).call(this);\n\n      (0, _element.addClass)(this._element, CSS_CLASSNAME);\n    }\n  }]);\n\n  return BacklightUI;\n}(_base2.default);\n\nexports.default = BacklightUI;\n\n/***/ }),\n/* 341 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(203);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CSS_CLASSNAME = 'ht__manualRowMove--guideline';\n\n/**\n * @class GuidelineUI\n * @util\n */\n\nvar GuidelineUI = function (_BaseUI) {\n  _inherits(GuidelineUI, _BaseUI);\n\n  function GuidelineUI() {\n    _classCallCheck(this, GuidelineUI);\n\n    return _possibleConstructorReturn(this, (GuidelineUI.__proto__ || Object.getPrototypeOf(GuidelineUI)).apply(this, arguments));\n  }\n\n  _createClass(GuidelineUI, [{\n    key: 'build',\n\n    /**\n     * Custom className on build process.\n     */\n    value: function build() {\n      _get(GuidelineUI.prototype.__proto__ || Object.getPrototypeOf(GuidelineUI.prototype), 'build', this).call(this);\n\n      (0, _element.addClass)(this._element, CSS_CLASSNAME);\n    }\n  }]);\n\n  return GuidelineUI;\n}(_base2.default);\n\nexports.default = GuidelineUI;\n\n/***/ }),\n/* 342 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 343 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _event = __webpack_require__(12);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// Developer note! Whenever you make a change in this file, make an analogous change in manualRowResize.js\n\n/**\n * @description\n * ManualRowResize Plugin.\n *\n * Has 2 UI components:\n * - handle - the draggable element that sets the desired height of the row.\n * - guide - the helper guide that shows the desired height as a horizontal guide.\n *\n * @plugin ManualRowResize\n */\nvar ManualRowResize = function (_BasePlugin) {\n  _inherits(ManualRowResize, _BasePlugin);\n\n  function ManualRowResize(hotInstance) {\n    _classCallCheck(this, ManualRowResize);\n\n    var _this = _possibleConstructorReturn(this, (ManualRowResize.__proto__ || Object.getPrototypeOf(ManualRowResize)).call(this, hotInstance));\n\n    _this.currentTH = null;\n    _this.currentRow = null;\n    _this.selectedRows = [];\n    _this.currentHeight = null;\n    _this.newSize = null;\n    _this.startY = null;\n    _this.startHeight = null;\n    _this.startOffset = null;\n    _this.handle = document.createElement('DIV');\n    _this.guide = document.createElement('DIV');\n    _this.eventManager = new _eventManager2.default(_this);\n    _this.pressed = null;\n    _this.dblclick = 0;\n    _this.autoresizeTimeout = null;\n    _this.manualRowHeights = [];\n\n    (0, _element.addClass)(_this.handle, 'manualRowResizer');\n    (0, _element.addClass)(_this.guide, 'manualRowResizerGuide');\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualRowResize, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().manualRowResize;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.manualRowHeights = [];\n\n      var initialRowHeights = this.hot.getSettings().manualRowResize;\n      var loadedManualRowHeights = this.loadManualRowHeights();\n\n      if (typeof loadedManualRowHeights != 'undefined') {\n        this.manualRowHeights = loadedManualRowHeights;\n      } else if (Array.isArray(initialRowHeights)) {\n        this.manualRowHeights = initialRowHeights;\n      } else {\n        this.manualRowHeights = [];\n      }\n\n      this.addHook('modifyRowHeight', function (height, row) {\n        return _this2.onModifyRowHeight(height, row);\n      });\n\n      // Handsontable.hooks.register('beforeRowResize');\n      // Handsontable.hooks.register('afterRowResize');\n\n      this.bindEvents();\n\n      _get(ManualRowResize.prototype.__proto__ || Object.getPrototypeOf(ManualRowResize.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      var initialRowHeights = this.hot.getSettings().manualRowResize;\n\n      if (Array.isArray(initialRowHeights)) {\n        this.manualRowHeights = initialRowHeights;\n      } else if (!initialRowHeights) {\n        this.manualRowHeights = [];\n      }\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(ManualRowResize.prototype.__proto__ || Object.getPrototypeOf(ManualRowResize.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Save the current sizes using the persistentState plugin.\n     */\n\n  }, {\n    key: 'saveManualRowHeights',\n    value: function saveManualRowHeights() {\n      this.hot.runHooks('persistentStateSave', 'manualRowHeights', this.manualRowHeights);\n    }\n\n    /**\n     * Load the previously saved sizes using the persistentState plugin.\n     *\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'loadManualRowHeights',\n    value: function loadManualRowHeights() {\n      var storedState = {};\n\n      this.hot.runHooks('persistentStateLoad', 'manualRowHeights', storedState);\n\n      return storedState.value;\n    }\n\n    /**\n     * Set the resize handle position.\n     *\n     * @param {HTMLCellElement} TH TH HTML element.\n     */\n\n  }, {\n    key: 'setupHandlePosition',\n    value: function setupHandlePosition(TH) {\n      var _this3 = this;\n\n      this.currentTH = TH;\n      var row = this.hot.view.wt.wtTable.getCoords(TH).row; // getCoords returns CellCoords\n      var headerWidth = (0, _element.outerWidth)(this.currentTH);\n\n      if (row >= 0) {\n        // if not col header\n        var box = this.currentTH.getBoundingClientRect();\n\n        this.currentRow = row;\n        this.selectedRows = [];\n\n        if (this.hot.selection.isSelected() && this.hot.selection.isSelectedByRowHeader()) {\n          var _hot$getSelectedRange = this.hot.getSelectedRangeLast(),\n              from = _hot$getSelectedRange.from,\n              to = _hot$getSelectedRange.to;\n\n          var start = from.row;\n          var end = to.row;\n\n          if (start >= end) {\n            start = to.row;\n            end = from.row;\n          }\n\n          if (this.currentRow >= start && this.currentRow <= end) {\n            (0, _number.rangeEach)(start, end, function (i) {\n              return _this3.selectedRows.push(i);\n            });\n          } else {\n            this.selectedRows.push(this.currentRow);\n          }\n        } else {\n          this.selectedRows.push(this.currentRow);\n        }\n\n        this.startOffset = box.top - 6;\n        this.startHeight = parseInt(box.height, 10);\n        this.handle.style.left = box.left + 'px';\n        this.handle.style.top = this.startOffset + this.startHeight + 'px';\n        this.handle.style.width = headerWidth + 'px';\n        this.hot.rootElement.appendChild(this.handle);\n      }\n    }\n\n    /**\n     * Refresh the resize handle position.\n     */\n\n  }, {\n    key: 'refreshHandlePosition',\n    value: function refreshHandlePosition() {\n      this.handle.style.top = this.startOffset + this.currentHeight + 'px';\n    }\n\n    /**\n     * Set the resize guide position.\n     */\n\n  }, {\n    key: 'setupGuidePosition',\n    value: function setupGuidePosition() {\n      var handleWidth = parseInt((0, _element.outerWidth)(this.handle), 10);\n      var handleRightPosition = parseInt(this.handle.style.left, 10) + handleWidth;\n      var maximumVisibleElementWidth = parseInt(this.hot.view.maximumVisibleElementWidth(0), 10);\n      (0, _element.addClass)(this.handle, 'active');\n      (0, _element.addClass)(this.guide, 'active');\n\n      this.guide.style.top = this.handle.style.top;\n      this.guide.style.left = handleRightPosition + 'px';\n      this.guide.style.width = maximumVisibleElementWidth - handleWidth + 'px';\n      this.hot.rootElement.appendChild(this.guide);\n    }\n\n    /**\n     * Refresh the resize guide position.\n     */\n\n  }, {\n    key: 'refreshGuidePosition',\n    value: function refreshGuidePosition() {\n      this.guide.style.top = this.handle.style.top;\n    }\n\n    /**\n     * Hide both the resize handle and resize guide.\n     */\n\n  }, {\n    key: 'hideHandleAndGuide',\n    value: function hideHandleAndGuide() {\n      (0, _element.removeClass)(this.handle, 'active');\n      (0, _element.removeClass)(this.guide, 'active');\n    }\n\n    /**\n     * Check if provided element is considered as a row header.\n     *\n     * @param {HTMLElement} element HTML element.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'checkIfRowHeader',\n    value: function checkIfRowHeader(element) {\n      if (element != this.hot.rootElement) {\n        var parent = element.parentNode;\n\n        if (parent.tagName === 'TBODY') {\n          return true;\n        }\n\n        return this.checkIfRowHeader(parent);\n      }\n\n      return false;\n    }\n\n    /**\n     * Get the TH element from the provided element.\n     *\n     * @param {HTMLElement} element HTML element.\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'getTHFromTargetElement',\n    value: function getTHFromTargetElement(element) {\n      if (element.tagName != 'TABLE') {\n        if (element.tagName == 'TH') {\n          return element;\n        }\n        return this.getTHFromTargetElement(element.parentNode);\n      }\n\n      return null;\n    }\n\n    /**\n     * 'mouseover' event callback - set the handle position.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseOver',\n    value: function onMouseOver(event) {\n      if (this.checkIfRowHeader(event.target)) {\n        var th = this.getTHFromTargetElement(event.target);\n\n        if (th) {\n          if (!this.pressed) {\n            this.setupHandlePosition(th);\n          }\n        }\n      }\n    }\n\n    /**\n     * Auto-size row after doubleclick - callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'afterMouseDownTimeout',\n    value: function afterMouseDownTimeout() {\n      var _this4 = this;\n\n      var render = function render() {\n        _this4.hot.forceFullRender = true;\n        _this4.hot.view.render(); // updates all\n        _this4.hot.view.wt.wtOverlays.adjustElementsSize(true);\n      };\n      var resize = function resize(selectedRow, forceRender) {\n        var hookNewSize = _this4.hot.runHooks('beforeRowResize', selectedRow, _this4.newSize, true);\n\n        if (hookNewSize !== void 0) {\n          _this4.newSize = hookNewSize;\n        }\n\n        _this4.setManualSize(selectedRow, _this4.newSize); // double click sets auto row size\n\n        if (forceRender) {\n          render();\n        }\n\n        _this4.hot.runHooks('afterRowResize', selectedRow, _this4.newSize, true);\n      };\n\n      if (this.dblclick >= 2) {\n        var selectedRowsLength = this.selectedRows.length;\n\n        if (selectedRowsLength > 1) {\n          (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n            resize(selectedRow);\n          });\n          render();\n        } else {\n          (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n            resize(selectedRow, true);\n          });\n        }\n      }\n      this.dblclick = 0;\n      this.autoresizeTimeout = null;\n    }\n\n    /**\n     * 'mousedown' event callback.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseDown',\n    value: function onMouseDown(event) {\n      var _this5 = this;\n\n      if ((0, _element.hasClass)(event.target, 'manualRowResizer')) {\n        this.setupGuidePosition();\n        this.pressed = this.hot;\n\n        if (this.autoresizeTimeout == null) {\n          this.autoresizeTimeout = setTimeout(function () {\n            return _this5.afterMouseDownTimeout();\n          }, 500);\n\n          this.hot._registerTimeout(this.autoresizeTimeout);\n        }\n        this.dblclick++;\n\n        this.startY = (0, _event.pageY)(event);\n        this.newSize = this.startHeight;\n      }\n    }\n\n    /**\n     * 'mousemove' event callback - refresh the handle and guide positions, cache the new row height.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var _this6 = this;\n\n      if (this.pressed) {\n        this.currentHeight = this.startHeight + ((0, _event.pageY)(event) - this.startY);\n\n        (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n          _this6.newSize = _this6.setManualSize(selectedRow, _this6.currentHeight);\n        });\n\n        this.refreshHandlePosition();\n        this.refreshGuidePosition();\n      }\n    }\n\n    /**\n     * 'mouseup' event callback - apply the row resizing.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp(event) {\n      var _this7 = this;\n\n      var render = function render() {\n        _this7.hot.forceFullRender = true;\n        _this7.hot.view.render(); // updates all\n        _this7.hot.view.wt.wtOverlays.adjustElementsSize(true);\n      };\n      var runHooks = function runHooks(selectedRow, forceRender) {\n        _this7.hot.runHooks('beforeRowResize', selectedRow, _this7.newSize);\n\n        if (forceRender) {\n          render();\n        }\n\n        _this7.saveManualRowHeights();\n\n        _this7.hot.runHooks('afterRowResize', selectedRow, _this7.newSize);\n      };\n      if (this.pressed) {\n        this.hideHandleAndGuide();\n        this.pressed = false;\n\n        if (this.newSize != this.startHeight) {\n          var selectedRowsLength = this.selectedRows.length;\n\n          if (selectedRowsLength > 1) {\n            (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n              runHooks(selectedRow);\n            });\n            render();\n          } else {\n            (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n              runHooks(selectedRow, true);\n            });\n          }\n        }\n\n        this.setupHandlePosition(this.currentTH);\n      }\n    }\n\n    /**\n     * Bind the mouse events.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'bindEvents',\n    value: function bindEvents() {\n      var _this8 = this;\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'mouseover', function (e) {\n        return _this8.onMouseOver(e);\n      });\n      this.eventManager.addEventListener(this.hot.rootElement, 'mousedown', function (e) {\n        return _this8.onMouseDown(e);\n      });\n      this.eventManager.addEventListener(window, 'mousemove', function (e) {\n        return _this8.onMouseMove(e);\n      });\n      this.eventManager.addEventListener(window, 'mouseup', function (e) {\n        return _this8.onMouseUp(e);\n      });\n    }\n\n    /**\n     * Cache the current row height.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} height Row height.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'setManualSize',\n    value: function setManualSize(row, height) {\n      row = this.hot.runHooks('modifyRow', row);\n      this.manualRowHeights[row] = height;\n\n      return height;\n    }\n\n    /**\n     * Modify the provided row height, based on the plugin settings.\n     *\n     * @private\n     * @param {Number} height Row height.\n     * @param {Number} row Visual row index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onModifyRowHeight',\n    value: function onModifyRowHeight(height, row) {\n      if (this.enabled) {\n        var autoRowSizePlugin = this.hot.getPlugin('autoRowSize');\n        var autoRowHeightResult = autoRowSizePlugin ? autoRowSizePlugin.heights[row] : null;\n\n        row = this.hot.runHooks('modifyRow', row);\n\n        var manualRowHeight = this.manualRowHeights[row];\n\n        if (manualRowHeight !== void 0 && (manualRowHeight === autoRowHeightResult || manualRowHeight > (height || 0))) {\n          return manualRowHeight;\n        }\n      }\n\n      return height;\n    }\n  }]);\n\n  return ManualRowResize;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('manualRowResize', ManualRowResize);\n\nexports.default = ManualRowResize;\n\n/***/ }),\n/* 344 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _plugins = __webpack_require__(8);\n\nvar _event = __webpack_require__(12);\n\nvar _src = __webpack_require__(4);\n\nvar _cellsCollection = __webpack_require__(345);\n\nvar _cellsCollection2 = _interopRequireDefault(_cellsCollection);\n\nvar _cellCoords = __webpack_require__(95);\n\nvar _cellCoords2 = _interopRequireDefault(_cellCoords);\n\nvar _autofill = __webpack_require__(346);\n\nvar _autofill2 = _interopRequireDefault(_autofill);\n\nvar _selection = __webpack_require__(347);\n\nvar _selection2 = _interopRequireDefault(_selection);\n\nvar _toggleMerge = __webpack_require__(348);\n\nvar _toggleMerge2 = _interopRequireDefault(_toggleMerge);\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar _console = __webpack_require__(56);\n\nvar _number = __webpack_require__(5);\n\nvar _utils = __webpack_require__(204);\n\n__webpack_require__(349);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('beforeMergeCells');\n_pluginHooks2.default.getSingleton().register('afterMergeCells');\n_pluginHooks2.default.getSingleton().register('beforeUnmergeCells');\n_pluginHooks2.default.getSingleton().register('afterUnmergeCells');\n\nvar privatePool = new WeakMap();\n\n/**\n * @plugin MergeCells\n *\n * @description Plugin, which allows merging cells in the table (using the initial configuration, API or context menu).\n *\n * @example\n *\n * ```js\n * ...\n * let hot = new Handsontable(document.getElementById('example'), {\n *  data: getData(),\n *  mergeCells: [\n *    {row: 0, col: 3, rowspan: 3, colspan: 3},\n *    {row: 2, col: 6, rowspan: 2, colspan: 2},\n *    {row: 4, col: 8, rowspan: 3, colspan: 3}\n *  ],\n * ...\n * ```\n */\n\nvar MergeCells = function (_BasePlugin) {\n  _inherits(MergeCells, _BasePlugin);\n\n  function MergeCells(hotInstance) {\n    _classCallCheck(this, MergeCells);\n\n    var _this = _possibleConstructorReturn(this, (MergeCells.__proto__ || Object.getPrototypeOf(MergeCells)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      lastDesiredCoords: null\n    });\n\n    /**\n     * A container for all the merged cells.\n     *\n     * @type {MergedCellsCollection}\n     */\n    _this.mergedCellsCollection = null;\n    /**\n     * Instance of the class responsible for all the autofill-related calculations.\n     *\n     * @private\n     * @type {AutofillCalculations}\n     */\n    _this.autofillCalculations = null;\n    /**\n     * Instance of the class responsible for the selection-related calculations.\n     *\n     * @private\n     * @type {SelectionCalculations}\n     */\n    _this.selectionCalculations = null;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(MergeCells, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().mergeCells;\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.mergedCellsCollection = new _cellsCollection2.default(this);\n      this.autofillCalculations = new _autofill2.default(this);\n      this.selectionCalculations = new _selection2.default(this);\n\n      this.addHook('afterInit', function () {\n        return _this2.onAfterInit.apply(_this2, arguments);\n      });\n      this.addHook('beforeKeyDown', function () {\n        return _this2.onBeforeKeyDown.apply(_this2, arguments);\n      });\n      this.addHook('modifyTransformStart', function () {\n        return _this2.onModifyTransformStart.apply(_this2, arguments);\n      });\n      this.addHook('afterModifyTransformStart', function () {\n        return _this2.onAfterModifyTransformStart.apply(_this2, arguments);\n      });\n      this.addHook('modifyTransformEnd', function () {\n        return _this2.onModifyTransformEnd.apply(_this2, arguments);\n      });\n      this.addHook('modifyGetCellCoords', function () {\n        return _this2.onModifyGetCellCoords.apply(_this2, arguments);\n      });\n      this.addHook('beforeSetRangeEnd', function () {\n        return _this2.onBeforeSetRangeEnd.apply(_this2, arguments);\n      });\n      this.addHook('afterIsMultipleSelection', function () {\n        return _this2.onAfterIsMultipleSelection.apply(_this2, arguments);\n      });\n      this.addHook('afterRenderer', function () {\n        return _this2.onAfterRenderer.apply(_this2, arguments);\n      });\n      this.addHook('afterContextMenuDefaultOptions', function () {\n        return _this2.addMergeActionsToContextMenu.apply(_this2, arguments);\n      });\n      this.addHook('afterGetCellMeta', function () {\n        return _this2.onAfterGetCellMeta.apply(_this2, arguments);\n      });\n      this.addHook('afterViewportRowCalculatorOverride', function () {\n        return _this2.onAfterViewportRowCalculatorOverride.apply(_this2, arguments);\n      });\n      this.addHook('afterViewportColumnCalculatorOverride', function () {\n        return _this2.onAfterViewportColumnCalculatorOverride.apply(_this2, arguments);\n      });\n      this.addHook('modifyAutofillRange', function () {\n        return _this2.onModifyAutofillRange.apply(_this2, arguments);\n      });\n      this.addHook('afterCreateCol', function () {\n        return _this2.onAfterCreateCol.apply(_this2, arguments);\n      });\n      this.addHook('afterRemoveCol', function () {\n        return _this2.onAfterRemoveCol.apply(_this2, arguments);\n      });\n      this.addHook('afterCreateRow', function () {\n        return _this2.onAfterCreateRow.apply(_this2, arguments);\n      });\n      this.addHook('afterRemoveRow', function () {\n        return _this2.onAfterRemoveRow.apply(_this2, arguments);\n      });\n      this.addHook('afterChange', function () {\n        return _this2.onAfterChange.apply(_this2, arguments);\n      });\n      this.addHook('beforeDrawBorders', function () {\n        return _this2.onBeforeDrawAreaBorders.apply(_this2, arguments);\n      });\n      this.addHook('afterDrawSelection', function () {\n        return _this2.onAfterDrawSelection.apply(_this2, arguments);\n      });\n      this.addHook('beforeRemoveCellClassNames', function () {\n        return _this2.onBeforeRemoveCellClassNames.apply(_this2, arguments);\n      });\n\n      _get(MergeCells.prototype.__proto__ || Object.getPrototypeOf(MergeCells.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable the plugin.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.clearCollections();\n      this.hot.render();\n      _get(MergeCells.prototype.__proto__ || Object.getPrototypeOf(MergeCells.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Update the plugin (after using the `updateSettings` method)\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      var settings = this.hot.getSettings().mergeCells;\n\n      this.clearCollections();\n      this.disablePlugin();\n      this.enablePlugin();\n\n      this.generateFromSettings(settings);\n\n      _get(MergeCells.prototype.__proto__ || Object.getPrototypeOf(MergeCells.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Validate a single setting object, represented by a single merged cell information object.\n     *\n     * @private\n     * @param {Object} setting An object with `row`, `col`, `rowspan` and `colspan` properties.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'validateSetting',\n    value: function validateSetting(setting) {\n      var valid = true;\n\n      if (!setting) {\n        return false;\n      }\n\n      if (_cellCoords2.default.containsNegativeValues(setting)) {\n        (0, _console.warn)(_cellCoords2.default.NEGATIVE_VALUES_WARNING(setting));\n\n        valid = false;\n      } else if (_cellCoords2.default.isOutOfBounds(setting, this.hot.countRows(), this.hot.countCols())) {\n        (0, _console.warn)(_cellCoords2.default.IS_OUT_OF_BOUNDS_WARNING(setting));\n\n        valid = false;\n      } else if (_cellCoords2.default.isSingleCell(setting)) {\n        (0, _console.warn)(_cellCoords2.default.IS_SINGLE_CELL(setting));\n\n        valid = false;\n      } else if (_cellCoords2.default.containsZeroSpan(setting)) {\n        (0, _console.warn)(_cellCoords2.default.ZERO_SPAN_WARNING(setting));\n\n        valid = false;\n      }\n\n      return valid;\n    }\n\n    /**\n     * Generate the merged cells from the settings provided to the plugin.\n     *\n     * @private\n     * @param {Array|Boolean} settings The settings provided to the plugin.\n     */\n\n  }, {\n    key: 'generateFromSettings',\n    value: function generateFromSettings(settings) {\n      var _this3 = this;\n\n      if (Array.isArray(settings)) {\n        var _hot;\n\n        var populationArgumentsList = [];\n\n        (0, _array.arrayEach)(settings, function (setting) {\n          if (!_this3.validateSetting(setting)) {\n            return;\n          }\n\n          var highlight = new _src.CellCoords(setting.row, setting.col);\n          var rangeEnd = new _src.CellCoords(setting.row + setting.rowspan - 1, setting.col + setting.colspan - 1);\n          var mergeRange = new _src.CellRange(highlight, highlight, rangeEnd);\n\n          populationArgumentsList.push(_this3.mergeRange(mergeRange, true, true));\n        });\n\n        // remove 'empty' setting objects, caused by improper merge range declarations\n        populationArgumentsList = populationArgumentsList.filter(function (value) {\n          return value !== true;\n        });\n\n        var bulkPopulationData = this.getBulkCollectionData(populationArgumentsList);\n\n        (_hot = this.hot).populateFromArray.apply(_hot, _toConsumableArray(bulkPopulationData));\n      }\n    }\n\n    /**\n     * Generates a bulk set of all the data to be populated to fill the data \"under\" the added merged cells.\n     *\n     * @private\n     * @param {Array} populationArgumentsList Array in a form of `[row, column, dataUnderCollection]`.\n     * @return {Array} Array in a form of `[row, column, dataOfAllCollections]`.\n     */\n\n  }, {\n    key: 'getBulkCollectionData',\n    value: function getBulkCollectionData(populationArgumentsList) {\n      var _hot2;\n\n      var populationDataRange = this.getBulkCollectionDataRange(populationArgumentsList);\n      var dataAtRange = (_hot2 = this.hot).getData.apply(_hot2, _toConsumableArray(populationDataRange));\n      var newDataAtRange = dataAtRange.splice(0);\n\n      (0, _array.arrayEach)(populationArgumentsList, function (mergedCellArguments) {\n        var _mergedCellArguments = _slicedToArray(mergedCellArguments, 3),\n            mergedCellRowIndex = _mergedCellArguments[0],\n            mergedCellColumnIndex = _mergedCellArguments[1],\n            mergedCellData = _mergedCellArguments[2];\n\n        (0, _array.arrayEach)(mergedCellData, function (mergedCellRow, rowIndex) {\n          (0, _array.arrayEach)(mergedCellRow, function (mergedCellElement, columnIndex) {\n            newDataAtRange[mergedCellRowIndex - populationDataRange[0] + rowIndex][mergedCellColumnIndex - populationDataRange[1] + columnIndex] = mergedCellElement;\n          });\n        });\n      });\n\n      return [populationDataRange[0], populationDataRange[1], newDataAtRange];\n    }\n\n    /**\n     * Get the range of combined data ranges provided in a form of an array of arrays ([row, column, dataUnderCollection])\n     *\n     * @private\n     * @param {Array} populationArgumentsList Array containing argument lists for the `populateFromArray` method - row, column and data for population.\n     * @return {Array[]} Start and end coordinates of the merged cell range. (in a form of [rowIndex, columnIndex])\n     */\n\n  }, {\n    key: 'getBulkCollectionDataRange',\n    value: function getBulkCollectionDataRange(populationArgumentsList) {\n      var start = [0, 0];\n      var end = [0, 0];\n      var mergedCellRow = null;\n      var mergedCellColumn = null;\n      var mergedCellData = null;\n\n      (0, _array.arrayEach)(populationArgumentsList, function (mergedCellArguments) {\n        mergedCellRow = mergedCellArguments[0];\n        mergedCellColumn = mergedCellArguments[1];\n        mergedCellData = mergedCellArguments[2];\n\n        start[0] = Math.min(mergedCellRow, start[0]);\n        start[1] = Math.min(mergedCellColumn, start[1]);\n        end[0] = Math.max(mergedCellRow + mergedCellData.length - 1, end[0]);\n        end[1] = Math.max(mergedCellColumn + mergedCellData[0].length - 1, end[1]);\n      });\n\n      return [].concat(start, end);\n    }\n\n    /**\n     * Clear the merged cells from the merged cell container.\n     */\n\n  }, {\n    key: 'clearCollections',\n    value: function clearCollections() {\n      this.mergedCellsCollection.clear();\n    }\n\n    /**\n     * Returns `true` if a range is mergeable.\n     *\n     * @private\n     * @param {Object} newMergedCellInfo Merged cell information object to test.\n     * @param {Boolean} [auto=false] `true` if triggered at initialization.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'canMergeRange',\n    value: function canMergeRange(newMergedCellInfo) {\n      var auto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      return auto ? true : this.validateSetting(newMergedCellInfo);\n    }\n\n    /**\n     * Merge or unmerge, based on last selected range.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'toggleMergeOnSelection',\n    value: function toggleMergeOnSelection() {\n      var currentRange = this.hot.getSelectedRangeLast();\n\n      if (!currentRange) {\n        return;\n      }\n\n      currentRange.setDirection('NW-SE');\n\n      var from = currentRange.from,\n          to = currentRange.to;\n\n\n      this.toggleMerge(currentRange);\n      this.hot.selectCell(from.row, from.col, to.row, to.col, false);\n    }\n\n    /**\n     * Merge the selection provided as a cell range.\n     *\n     * @param {CellRange} [cellRange] Selection cell range.\n     */\n\n  }, {\n    key: 'mergeSelection',\n    value: function mergeSelection() {\n      var cellRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.hot.getSelectedRangeLast();\n\n      if (!cellRange) {\n        return;\n      }\n\n      cellRange.setDirection('NW-SE');\n\n      var from = cellRange.from,\n          to = cellRange.to;\n\n\n      this.unmergeRange(cellRange, true);\n      this.mergeRange(cellRange);\n      this.hot.selectCell(from.row, from.col, to.row, to.col, false);\n    }\n\n    /**\n     * Unmerge the selection provided as a cell range.\n     *\n     * @param {CellRange} [cellRange] Selection cell range.\n     */\n\n  }, {\n    key: 'unmergeSelection',\n    value: function unmergeSelection() {\n      var cellRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.hot.getSelectedRangeLast();\n\n      if (!cellRange) {\n        return;\n      }\n\n      var from = cellRange.from,\n          to = cellRange.to;\n\n\n      this.unmergeRange(cellRange, true);\n      this.hot.selectCell(from.row, from.col, to.row, to.col, false);\n    }\n\n    /**\n     * Merge cells in the provided cell range.\n     *\n     * @private\n     * @param {CellRange} cellRange Cell range to merge.\n     * @param {Boolean} [auto=false] `true` if is called automatically, e.g. at initialization.\n     * @param {Boolean} [preventPopulation=false] `true`, if the method should not run `populateFromArray` at the end, but rather return its arguments.\n     * @returns {Array|Boolean} Returns an array of [row, column, dataUnderCollection] if preventPopulation is set to true. If the the merging process went successful, it returns `true`, otherwise - `false`.\n     * @fires Hooks#beforeMergeCells\n     * @fires Hooks#afterMergeCells\n     */\n\n  }, {\n    key: 'mergeRange',\n    value: function mergeRange(cellRange) {\n      var _this4 = this;\n\n      var auto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n      var preventPopulation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      var topLeft = cellRange.getTopLeftCorner();\n      var bottomRight = cellRange.getBottomRightCorner();\n      var mergeParent = {\n        row: topLeft.row,\n        col: topLeft.col,\n        rowspan: bottomRight.row - topLeft.row + 1,\n        colspan: bottomRight.col - topLeft.col + 1\n      };\n      var clearedData = [];\n      var populationInfo = null;\n\n      if (!this.canMergeRange(mergeParent, auto)) {\n        return false;\n      }\n\n      this.hot.runHooks('beforeMergeCells', cellRange, auto);\n\n      (0, _number.rangeEach)(0, mergeParent.rowspan - 1, function (i) {\n        (0, _number.rangeEach)(0, mergeParent.colspan - 1, function (j) {\n          var clearedValue = null;\n\n          if (!clearedData[i]) {\n            clearedData[i] = [];\n          }\n\n          if (i === 0 && j === 0) {\n            clearedValue = _this4.hot.getDataAtCell(mergeParent.row, mergeParent.col);\n          } else {\n            _this4.hot.setCellMeta(mergeParent.row + i, mergeParent.col + j, 'hidden', true);\n          }\n\n          clearedData[i][j] = clearedValue;\n        });\n      });\n\n      this.hot.setCellMeta(mergeParent.row, mergeParent.col, 'spanned', true);\n\n      var mergedCellAdded = this.mergedCellsCollection.add(mergeParent);\n\n      if (mergedCellAdded) {\n        if (preventPopulation) {\n          populationInfo = [mergeParent.row, mergeParent.col, clearedData];\n        } else {\n          this.hot.populateFromArray(mergeParent.row, mergeParent.col, clearedData, void 0, void 0, this.pluginName);\n        }\n\n        this.hot.runHooks('afterMergeCells', cellRange, mergeParent, auto);\n\n        return populationInfo;\n      }\n\n      return true;\n    }\n\n    /**\n     * Unmerge the selection provided as a cell range. If no cell range is provided, it uses the current selection.\n     *\n     * @private\n     * @param {CellRange} cellRange Selection cell range.\n     * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n     */\n\n  }, {\n    key: 'unmergeRange',\n    value: function unmergeRange(cellRange) {\n      var _this5 = this;\n\n      var auto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      var mergedCells = this.mergedCellsCollection.getWithinRange(cellRange);\n\n      if (!mergedCells) {\n        return;\n      }\n\n      this.hot.runHooks('beforeUnmergeCells', cellRange, auto);\n\n      (0, _array.arrayEach)(mergedCells, function (currentCollection) {\n        _this5.mergedCellsCollection.remove(currentCollection.row, currentCollection.col);\n\n        (0, _number.rangeEach)(0, currentCollection.rowspan - 1, function (i) {\n          (0, _number.rangeEach)(0, currentCollection.colspan - 1, function (j) {\n            _this5.hot.removeCellMeta(currentCollection.row + i, currentCollection.col + j, 'hidden');\n          });\n        });\n\n        _this5.hot.removeCellMeta(currentCollection.row, currentCollection.col, 'spanned');\n      });\n\n      this.hot.render();\n      this.hot.runHooks('afterUnmergeCells', cellRange, auto);\n    }\n\n    /**\n     * Merge or unmerge, based on the cell range provided as `cellRange`.\n     *\n     * @private\n     * @param {CellRange} cellRange The cell range to merge or unmerged.\n     */\n\n  }, {\n    key: 'toggleMerge',\n    value: function toggleMerge(cellRange) {\n      var mergedCell = this.mergedCellsCollection.get(cellRange.from.row, cellRange.from.col);\n      var mergedCellCoversWholeRange = mergedCell.row === cellRange.from.row && mergedCell.col === cellRange.from.col && mergedCell.row + mergedCell.rowspan - 1 === cellRange.to.row && mergedCell.col + mergedCell.colspan - 1 === cellRange.to.col;\n\n      if (mergedCellCoversWholeRange) {\n        this.unmergeRange(cellRange);\n      } else {\n        this.mergeSelection(cellRange);\n      }\n    }\n\n    /**\n     * Merge the specified range.\n     *\n     * @param {Number} startRow Start row of the merged cell.\n     * @param {Number} startColumn Start column of the merged cell.\n     * @param {Number} endRow End row of the merged cell.\n     * @param {Number} endColumn End column of the merged cell.\n     */\n\n  }, {\n    key: 'merge',\n    value: function merge(startRow, startColumn, endRow, endColumn) {\n      var start = new _src.CellCoords(startRow, startColumn);\n      var end = new _src.CellCoords(endRow, endColumn);\n\n      this.mergeRange(new _src.CellRange(start, start, end));\n    }\n\n    /**\n     * Unmerge the merged cell in the provided range.\n     *\n     * @param {Number} startRow Start row of the merged cell.\n     * @param {Number} startColumn Start column of the merged cell.\n     * @param {Number} endRow End row of the merged cell.\n     * @param {Number} endColumn End column of the merged cell.\n     */\n\n  }, {\n    key: 'unmerge',\n    value: function unmerge(startRow, startColumn, endRow, endColumn) {\n      var start = new _src.CellCoords(startRow, startColumn);\n      var end = new _src.CellCoords(endRow, endColumn);\n\n      this.unmergeRange(new _src.CellRange(start, start, end));\n    }\n\n    /**\n     * `afterInit` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      this.generateFromSettings(this.hot.getSettings().mergeCells);\n      this.hot.render();\n    }\n\n    /**\n     * `beforeKeyDown` hook callback.\n     *\n     * @private\n     * @param {KeyboardEvent} event The `keydown` event object.\n     */\n\n  }, {\n    key: 'onBeforeKeyDown',\n    value: function onBeforeKeyDown(event) {\n      var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey;\n\n      if (ctrlDown && event.keyCode === 77) {\n        // CTRL + M\n        this.toggleMerge(this.hot.getSelectedRangeLast());\n\n        this.hot.render();\n        (0, _event.stopImmediatePropagation)(event);\n      }\n    }\n\n    /**\n     * Modify the information on whether the current selection contains multiple cells. The `afterIsMultipleSelection` hook callback.\n     *\n     * @private\n     * @param {Boolean} isMultiple\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'onAfterIsMultipleSelection',\n    value: function onAfterIsMultipleSelection(isMultiple) {\n      if (isMultiple) {\n        var mergedCells = this.mergedCellsCollection.mergedCells;\n        var selectionRange = this.hot.getSelectedRangeLast();\n\n        for (var group = 0; group < mergedCells.length; group += 1) {\n          if (selectionRange.highlight.row === mergedCells[group].row && selectionRange.highlight.col === mergedCells[group].col && selectionRange.to.row === mergedCells[group].row + mergedCells[group].rowspan - 1 && selectionRange.to.col === mergedCells[group].col + mergedCells[group].colspan - 1) {\n            return false;\n          }\n        }\n      }\n\n      return isMultiple;\n    }\n\n    /**\n     * `modifyTransformStart` hook callback.\n     *\n     * @private\n     * @param {Object} delta The transformation delta.\n     */\n\n  }, {\n    key: 'onModifyTransformStart',\n    value: function onModifyTransformStart(delta) {\n      var priv = privatePool.get(this);\n      var currentlySelectedRange = this.hot.getSelectedRangeLast();\n      var newDelta = {\n        row: delta.row,\n        col: delta.col\n      };\n      var nextPosition = null;\n      var currentPosition = new _src.CellCoords(currentlySelectedRange.highlight.row, currentlySelectedRange.highlight.col);\n      var mergedParent = this.mergedCellsCollection.get(currentPosition.row, currentPosition.col);\n\n      if (!priv.lastDesiredCoords) {\n        priv.lastDesiredCoords = new _src.CellCoords(null, null);\n      }\n\n      if (mergedParent) {\n        // only merge selected\n        var mergeTopLeft = new _src.CellCoords(mergedParent.row, mergedParent.col);\n        var mergeBottomRight = new _src.CellCoords(mergedParent.row + mergedParent.rowspan - 1, mergedParent.col + mergedParent.colspan - 1);\n        var mergeRange = new _src.CellRange(mergeTopLeft, mergeTopLeft, mergeBottomRight);\n\n        if (!mergeRange.includes(priv.lastDesiredCoords)) {\n          priv.lastDesiredCoords = new _src.CellCoords(null, null); // reset outdated version of lastDesiredCoords\n        }\n\n        newDelta.row = priv.lastDesiredCoords.row ? priv.lastDesiredCoords.row - currentPosition.row : newDelta.row;\n        newDelta.col = priv.lastDesiredCoords.col ? priv.lastDesiredCoords.col - currentPosition.col : newDelta.col;\n\n        if (delta.row > 0) {\n          // moving down\n          newDelta.row = mergedParent.row + mergedParent.rowspan - 1 - currentPosition.row + delta.row;\n        } else if (delta.row < 0) {\n          // moving up\n          newDelta.row = currentPosition.row - mergedParent.row + delta.row;\n        }\n\n        if (delta.col > 0) {\n          // moving right\n          newDelta.col = mergedParent.col + mergedParent.colspan - 1 - currentPosition.col + delta.col;\n        } else if (delta.col < 0) {\n          // moving left\n          newDelta.col = currentPosition.col - mergedParent.col + delta.col;\n        }\n      }\n\n      nextPosition = new _src.CellCoords(currentlySelectedRange.highlight.row + newDelta.row, currentlySelectedRange.highlight.col + newDelta.col);\n\n      var nextParentIsMerged = this.mergedCellsCollection.get(nextPosition.row, nextPosition.col);\n\n      if (nextParentIsMerged) {\n        // skipping the invisible cells in the merge range\n        priv.lastDesiredCoords = nextPosition;\n        newDelta = {\n          row: nextParentIsMerged.row - currentPosition.row,\n          col: nextParentIsMerged.col - currentPosition.col\n        };\n      }\n\n      if (newDelta.row !== 0) {\n        delta.row = newDelta.row;\n      }\n      if (newDelta.col !== 0) {\n        delta.col = newDelta.col;\n      }\n    }\n\n    /**\n     * `modifyTransformEnd` hook callback. Needed to handle \"jumping over\" merged merged cells, while selecting.\n     *\n     * @private\n     * @param {Object} delta The transformation delta.\n     */\n\n  }, {\n    key: 'onModifyTransformEnd',\n    value: function onModifyTransformEnd(delta) {\n      var _this6 = this;\n\n      var currentSelectionRange = this.hot.getSelectedRangeLast();\n      var newDelta = (0, _object.clone)(delta);\n      var newSelectionRange = this.selectionCalculations.getUpdatedSelectionRange(currentSelectionRange, delta);\n      var tempDelta = (0, _object.clone)(newDelta);\n\n      var mergedCellsWithinRange = this.mergedCellsCollection.getWithinRange(newSelectionRange, true);\n\n      do {\n        tempDelta = (0, _object.clone)(newDelta);\n        this.selectionCalculations.getUpdatedSelectionRange(currentSelectionRange, newDelta);\n\n        (0, _array.arrayEach)(mergedCellsWithinRange, function (mergedCell) {\n          _this6.selectionCalculations.snapDelta(newDelta, currentSelectionRange, mergedCell);\n        });\n      } while (newDelta.row !== tempDelta.row || newDelta.col !== tempDelta.col);\n\n      delta.row = newDelta.row;\n      delta.col = newDelta.col;\n    }\n\n    /**\n     * `modifyGetCellCoords` hook callback. Swaps the `getCell` coords with the merged parent coords.\n     *\n     * @private\n     * @param {Number} row Row index.\n     * @param {Number} column Column index.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'onModifyGetCellCoords',\n    value: function onModifyGetCellCoords(row, column) {\n      var mergeParent = this.mergedCellsCollection.get(row, column);\n\n      return mergeParent ? [mergeParent.row, mergeParent.col, mergeParent.row + mergeParent.rowspan - 1, mergeParent.col + mergeParent.colspan - 1] : void 0;\n    }\n\n    /**\n     * `afterContextMenuDefaultOptions` hook callback.\n     *\n     * @private\n     * @param {Object} defaultOptions The default context menu options.\n     */\n\n  }, {\n    key: 'addMergeActionsToContextMenu',\n    value: function addMergeActionsToContextMenu(defaultOptions) {\n      defaultOptions.items.push({\n        name: '---------'\n      }, (0, _toggleMerge2.default)(this));\n    }\n\n    /**\n     * `afterRenderer` hook callback.\n     *\n     * @private\n     * @param {HTMLElement} TD The cell to be modified.\n     * @param {Number} row Row index.\n     * @param {Number} col Column index.\n     */\n\n  }, {\n    key: 'onAfterRenderer',\n    value: function onAfterRenderer(TD, row, col) {\n      var mergedCell = this.mergedCellsCollection.get(row, col);\n\n      (0, _utils.applySpanProperties)(TD, mergedCell, row, col);\n    }\n\n    /**\n     * `beforeSetRangeEnd` hook callback.\n     * While selecting cells with keyboard or mouse, make sure that rectangular area is expanded to the extent of the merged cell\n     *\n     * @private\n     * @param {Object} coords Cell coords.\n     */\n\n  }, {\n    key: 'onBeforeSetRangeEnd',\n    value: function onBeforeSetRangeEnd(coords) {\n      var selRange = this.hot.getSelectedRangeLast();\n      selRange.highlight = new _src.CellCoords(selRange.highlight.row, selRange.highlight.col); // clone in case we will modify its reference\n      selRange.to = coords;\n      var rangeExpanded = false;\n\n      if (selRange.from.row === 0 && selRange.to.row === this.hot.countRows() - 1 || selRange.from.col === 0 && selRange.to.col === this.hot.countCols() - 1) {\n        return;\n      }\n\n      do {\n        rangeExpanded = false;\n\n        for (var i = 0; i < this.mergedCellsCollection.mergedCells.length; i += 1) {\n          var cellInfo = this.mergedCellsCollection.mergedCells[i];\n          var mergedCellRange = cellInfo.getRange();\n\n          if (selRange.expandByRange(mergedCellRange)) {\n            coords.row = selRange.to.row;\n            coords.col = selRange.to.col;\n\n            rangeExpanded = true;\n          }\n        }\n      } while (rangeExpanded);\n    }\n\n    /**\n     * The `afterGetCellMeta` hook callback.\n     *\n     * @private\n     * @param {Number} row Row index.\n     * @param {Number} col Column index.\n     * @param {Object} cellProperties The cell properties object.\n     */\n\n  }, {\n    key: 'onAfterGetCellMeta',\n    value: function onAfterGetCellMeta(row, col, cellProperties) {\n      var mergeParent = this.mergedCellsCollection.get(row, col);\n\n      if (mergeParent && (mergeParent.row !== row || mergeParent.col !== col)) {\n        cellProperties.copyable = false;\n      }\n    }\n\n    /**\n     * `afterViewportRowCalculatorOverride` hook callback.\n     *\n     * @private\n     * @param {Object} calc The row calculator object.\n     */\n\n  }, {\n    key: 'onAfterViewportRowCalculatorOverride',\n    value: function onAfterViewportRowCalculatorOverride(calc) {\n      var _this7 = this;\n\n      var colCount = this.hot.countCols();\n      var mergeParent = void 0;\n\n      (0, _number.rangeEach)(0, colCount - 1, function (c) {\n        mergeParent = _this7.mergedCellsCollection.get(calc.startRow, c);\n        if (mergeParent) {\n          if (mergeParent.row < calc.startRow) {\n            calc.startRow = mergeParent.row;\n            return _this7.onAfterViewportRowCalculatorOverride.call(_this7, calc); // recursively search upwards\n          }\n        }\n\n        mergeParent = _this7.mergedCellsCollection.get(calc.endRow, c);\n\n        if (mergeParent) {\n          var mergeEnd = mergeParent.row + mergeParent.rowspan - 1;\n          if (mergeEnd > calc.endRow) {\n            calc.endRow = mergeEnd;\n            return _this7.onAfterViewportRowCalculatorOverride.call(_this7, calc); // recursively search upwards\n          }\n        }\n\n        return true;\n      });\n    }\n\n    /**\n     * `afterViewportColumnCalculatorOverride` hook callback.\n     *\n     * @private\n     * @param {Object} calc The column calculator object.\n     */\n\n  }, {\n    key: 'onAfterViewportColumnCalculatorOverride',\n    value: function onAfterViewportColumnCalculatorOverride(calc) {\n      var _this8 = this;\n\n      var rowCount = this.hot.countRows();\n      var mergeParent = void 0;\n\n      (0, _number.rangeEach)(0, rowCount - 1, function (r) {\n        mergeParent = _this8.mergedCellsCollection.get(r, calc.startColumn);\n\n        if (mergeParent && mergeParent.col < calc.startColumn) {\n          calc.startColumn = mergeParent.col;\n          return _this8.onAfterViewportColumnCalculatorOverride.call(_this8, calc); // recursively search upwards\n        }\n\n        mergeParent = _this8.mergedCellsCollection.get(r, calc.endColumn);\n\n        if (mergeParent) {\n          var mergeEnd = mergeParent.col + mergeParent.colspan - 1;\n          if (mergeEnd > calc.endColumn) {\n            calc.endColumn = mergeEnd;\n            return _this8.onAfterViewportColumnCalculatorOverride.call(_this8, calc); // recursively search upwards\n          }\n        }\n\n        return true;\n      });\n    }\n\n    /**\n     * The `modifyAutofillRange` hook callback.\n     *\n     * @private\n     * @param {Array} drag The drag area coordinates.\n     * @param {Array} select The selection information.\n     * @return {Array} The new drag area.\n     */\n\n  }, {\n    key: 'onModifyAutofillRange',\n    value: function onModifyAutofillRange(drag, select) {\n      this.autofillCalculations.correctSelectionAreaSize(select);\n      var dragDirection = this.autofillCalculations.getDirection(select, drag);\n\n      if (this.autofillCalculations.dragAreaOverlapsCollections(select, drag, dragDirection)) {\n        drag = select;\n        return drag;\n      }\n\n      var mergedCellsWithinSelectionArea = this.mergedCellsCollection.getWithinRange({\n        from: { row: select[0], col: select[1] },\n        to: { row: select[2], col: select[3] }\n      });\n\n      if (!mergedCellsWithinSelectionArea) {\n        return drag;\n      }\n\n      drag = this.autofillCalculations.snapDragArea(select, drag, dragDirection, mergedCellsWithinSelectionArea);\n\n      return drag;\n    }\n\n    /**\n     * `afterCreateCol` hook callback.\n     *\n     * @private\n     * @param {Number} column Column index.\n     * @param {Number} count Number of created columns.\n     */\n\n  }, {\n    key: 'onAfterCreateCol',\n    value: function onAfterCreateCol(column, count) {\n      this.mergedCellsCollection.shiftCollections('right', column, count);\n    }\n\n    /**\n     * `afterRemoveCol` hook callback.\n     *\n     * @private\n     * @param {Number} column Column index.\n     * @param {Number} count Number of removed columns.\n     */\n\n  }, {\n    key: 'onAfterRemoveCol',\n    value: function onAfterRemoveCol(column, count) {\n      this.mergedCellsCollection.shiftCollections('left', column, count);\n    }\n\n    /**\n     * `afterCreateRow` hook callback.\n     *\n     * @private\n     * @param {Number} row Row index.\n     * @param {Number} count Number of created rows.\n     * @param {String} source Source of change.\n     */\n\n  }, {\n    key: 'onAfterCreateRow',\n    value: function onAfterCreateRow(row, count, source) {\n      if (source === 'auto') {\n        return;\n      }\n\n      this.mergedCellsCollection.shiftCollections('down', row, count);\n    }\n\n    /**\n     * `afterRemoveRow` hook callback.\n     *\n     * @private\n     * @param {Number} row Row index.\n     * @param {Number} count Number of removed rows.\n     */\n\n  }, {\n    key: 'onAfterRemoveRow',\n    value: function onAfterRemoveRow(row, count) {\n      this.mergedCellsCollection.shiftCollections('up', row, count);\n    }\n\n    /**\n     * `afterChange` hook callback. Used to propagate merged cells after using Autofill.\n     *\n     * @private\n     * @param {Array} changes The changes array.\n     * @param {String} source Determines the source of the change.\n     */\n\n  }, {\n    key: 'onAfterChange',\n    value: function onAfterChange(changes, source) {\n      if (source !== 'Autofill.fill') {\n        return;\n      }\n\n      this.autofillCalculations.recreateAfterDataPopulation(changes);\n    }\n\n    /**\n     * `beforeDrawAreaBorders` hook callback.\n     *\n     * @private\n     * @param {Array} corners Coordinates of the area corners.\n     * @param {String} className Class name for the area.\n     */\n\n  }, {\n    key: 'onBeforeDrawAreaBorders',\n    value: function onBeforeDrawAreaBorders(corners, className) {\n      if (className && className === 'area') {\n        var selectedRange = this.hot.getSelectedRangeLast();\n        var mergedCellsWithinRange = this.mergedCellsCollection.getWithinRange(selectedRange);\n\n        (0, _array.arrayEach)(mergedCellsWithinRange, function (mergedCell) {\n          if (selectedRange.getBottomRightCorner().row === mergedCell.getLastRow() && selectedRange.getBottomRightCorner().col === mergedCell.getLastColumn()) {\n            corners[2] = mergedCell.row;\n            corners[3] = mergedCell.col;\n          }\n        });\n      }\n    }\n\n    /**\n     * `afterModifyTransformStart` hook callback. Fixes a problem with navigating through merged cells at the edges of the table\n     * with the ENTER/SHIFT+ENTER/TAB/SHIFT+TAB keys.\n     *\n     * @private\n     * @param {CellCoords} coords Coordinates of the to-be-selected cell.\n     * @param {Number} rowTransformDir Row transformation direction (negative value = up, 0 = none, positive value = down)\n     * @param {Number} colTransformDir Column transformation direction (negative value = up, 0 = none, positive value = down)\n     */\n\n  }, {\n    key: 'onAfterModifyTransformStart',\n    value: function onAfterModifyTransformStart(coords, rowTransformDir, colTransformDir) {\n      if (!this.enabled) {\n        return;\n      }\n\n      var mergedCellAtCoords = this.mergedCellsCollection.get(coords.row, coords.col);\n\n      if (!mergedCellAtCoords) {\n        return;\n      }\n\n      var goingDown = rowTransformDir > 0;\n      var goingUp = rowTransformDir < 0;\n      var goingLeft = colTransformDir < 0;\n      var goingRight = colTransformDir > 0;\n      var mergedCellOnBottomEdge = mergedCellAtCoords.row + mergedCellAtCoords.rowspan - 1 === this.hot.countRows() - 1;\n      var mergedCellOnTopEdge = mergedCellAtCoords.row === 0;\n      var mergedCellOnRightEdge = mergedCellAtCoords.col + mergedCellAtCoords.colspan - 1 === this.hot.countCols() - 1;\n      var mergedCellOnLeftEdge = mergedCellAtCoords.col === 0;\n\n      if (goingDown && mergedCellOnBottomEdge || goingUp && mergedCellOnTopEdge || goingRight && mergedCellOnRightEdge || goingLeft && mergedCellOnLeftEdge) {\n        coords.row = mergedCellAtCoords.row;\n        coords.col = mergedCellAtCoords.col;\n      }\n    }\n\n    /**\n     * `afterDrawSelection` hook callback. Used to add the additional class name for the entirely-selected merged cells.\n     *\n     * @private\n     * @param {Number} currentRow Row index of the currently processed cell.\n     * @param {Number} currentColumn Column index of the currently cell.\n     * @param {Array} cornersOfSelection Array of the current selection in a form of `[startRow, startColumn, endRow, endColumn]`.\n     * @param {Number|undefined} layerLevel Number indicating which layer of selection is currently processed.\n     * @returns {String|undefined} A `String`, which will act as an additional `className` to be added to the currently processed cell.\n     */\n\n  }, {\n    key: 'onAfterDrawSelection',\n    value: function onAfterDrawSelection(currentRow, currentColumn, cornersOfSelection, layerLevel) {\n      return this.selectionCalculations.getSelectedMergedCellClassName(currentRow, currentColumn, cornersOfSelection, layerLevel);\n    }\n\n    /**\n     * `beforeRemoveCellClassNames` hook callback. Used to remove additional class name from all cells in the table.\n     *\n     * @private\n     * @returns {String[]} An `Array` of `String`s. Each of these strings will act like class names to be removed from all the cells in the table.\n     */\n\n  }, {\n    key: 'onBeforeRemoveCellClassNames',\n    value: function onBeforeRemoveCellClassNames() {\n      return this.selectionCalculations.getSelectedMergedCellClassNameToRemove();\n    }\n  }]);\n\n  return MergeCells;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('mergeCells', MergeCells);\n\nexports.default = MergeCells;\n\n/***/ }),\n/* 345 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['The merged cell declared at [', ', ', '] overlaps with the other declared merged \\n      cell. The overlapping merged cell was not added to the table, please fix your setup.'], ['The merged cell declared at [', ', ', '] overlaps with the other declared merged \\n      cell. The overlapping merged cell was not added to the table, please fix your setup.']);\n\nvar _cellCoords = __webpack_require__(95);\n\nvar _cellCoords2 = _interopRequireDefault(_cellCoords);\n\nvar _index = __webpack_require__(4);\n\nvar _number = __webpack_require__(5);\n\nvar _console = __webpack_require__(56);\n\nvar _array = __webpack_require__(1);\n\nvar _utils = __webpack_require__(204);\n\nvar _templateLiteralTag = __webpack_require__(41);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Defines a container object for the merged cells.\n *\n * @class MergedCellsCollection\n * @plugin MergeCells\n */\nvar MergedCellsCollection = function () {\n  function MergedCellsCollection(plugin) {\n    _classCallCheck(this, MergedCellsCollection);\n\n    /**\n     * Reference to the Merge Cells plugin.\n     *\n     * @type {MergeCells}\n     */\n    this.plugin = plugin;\n    /**\n     * Array of merged cells.\n     *\n     * @type {Array}\n     */\n    this.mergedCells = [];\n    /**\n     * The Handsontable instance.\n     *\n     * @type {Handsontable}\n     */\n    this.hot = plugin.hot;\n  }\n\n  /**\n   * Get a warning message for when the declared merged cell data overlaps already existing merged cells.\n   *\n   * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n   * @return {String}\n   */\n\n\n  _createClass(MergedCellsCollection, [{\n    key: 'get',\n\n\n    /**\n     * Get a merged cell from the container, based on the provided arguments. You can provide either the \"starting coordinates\"\n     * of a merged cell, or any coordinates from the body of the merged cell.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} column Column index.\n     * @returns {MergedCellCoords|Boolean} Returns a wanted merged cell on success and `false` on failure.\n     */\n    value: function get(row, column) {\n      var mergedCells = this.mergedCells;\n      var result = false;\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        if (mergedCell.row <= row && mergedCell.row + mergedCell.rowspan - 1 >= row && mergedCell.col <= column && mergedCell.col + mergedCell.colspan - 1 >= column) {\n          result = mergedCell;\n          return false;\n        }\n\n        return true;\n      });\n\n      return result;\n    }\n\n    /**\n     * Get a merged cell containing the provided range.\n     *\n     * @param {CellRange|Object} range The range to search merged cells for.\n     * @return {MergedCellCoords|Boolean}\n     */\n\n  }, {\n    key: 'getByRange',\n    value: function getByRange(range) {\n      var mergedCells = this.mergedCells;\n      var result = false;\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        if (mergedCell.row <= range.from.row && mergedCell.row + mergedCell.rowspan - 1 >= range.to.row && mergedCell.col <= range.from.col && mergedCell.col + mergedCell.colspan - 1 >= range.to.col) {\n          result = mergedCell;\n          return result;\n        }\n\n        return true;\n      });\n\n      return result;\n    }\n\n    /**\n     * Get a merged cell contained in the provided range.\n     *\n     * @param {CellRange|Object} range The range to search merged cells in.\n     * @param [countPartials=false] If set to `true`, all the merged cells overlapping the range will be taken into calculation.\n     * @return {Array|Boolean} Array of found merged cells of `false` if none were found.\n     */\n\n  }, {\n    key: 'getWithinRange',\n    value: function getWithinRange(range) {\n      var countPartials = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      var mergedCells = this.mergedCells;\n      var foundMergedCells = [];\n\n      if (!range.includesRange) {\n        var from = new _index.CellCoords(range.from.row, range.from.col);\n        var to = new _index.CellCoords(range.to.row, range.to.col);\n        range = new _index.CellRange(from, from, to);\n      }\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        var mergedCellTopLeft = new _index.CellCoords(mergedCell.row, mergedCell.col);\n        var mergedCellBottomRight = new _index.CellCoords(mergedCell.row + mergedCell.rowspan - 1, mergedCell.col + mergedCell.colspan - 1);\n        var mergedCellRange = new _index.CellRange(mergedCellTopLeft, mergedCellTopLeft, mergedCellBottomRight);\n\n        if (countPartials) {\n          if (range.overlaps(mergedCellRange)) {\n            foundMergedCells.push(mergedCell);\n          }\n        } else if (range.includesRange(mergedCellRange)) {\n          foundMergedCells.push(mergedCell);\n        }\n      });\n\n      return foundMergedCells.length ? foundMergedCells : false;\n    }\n\n    /**\n     * Add a merged cell to the container.\n     *\n     * @param {Object} mergedCellInfo The merged cell information object. Has to contain `row`, `col`, `colspan` and `rowspan` properties.\n     * @return {MergedCellCoords|Boolean} Returns the new merged cell on success and `false` on failure.\n     */\n\n  }, {\n    key: 'add',\n    value: function add(mergedCellInfo) {\n      var mergedCells = this.mergedCells;\n      var row = mergedCellInfo.row;\n      var column = mergedCellInfo.col;\n      var rowspan = mergedCellInfo.rowspan;\n      var colspan = mergedCellInfo.colspan;\n      var newMergedCell = new _cellCoords2.default(row, column, rowspan, colspan);\n      var alreadyExists = this.get(row, column);\n      var isOverlapping = this.isOverlapping(newMergedCell);\n\n      if (!alreadyExists && !isOverlapping) {\n        if (this.hot) {\n          newMergedCell.normalize(this.hot);\n        }\n\n        mergedCells.push(newMergedCell);\n\n        return newMergedCell;\n      }\n\n      (0, _console.warn)(MergedCellsCollection.IS_OVERLAPPING_WARNING(newMergedCell));\n\n      return false;\n    }\n\n    /**\n     * Remove a merged cell from the container. You can provide either the \"starting coordinates\"\n     * of a merged cell, or any coordinates from the body of the merged cell.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} column Column index.\n     * @return {MergedCellCoords|Boolean} Returns the removed merged cell on success and `false` on failure.\n     */\n\n  }, {\n    key: 'remove',\n    value: function remove(row, column) {\n      var mergedCells = this.mergedCells;\n      var wantedCollection = this.get(row, column);\n      var wantedCollectionIndex = wantedCollection ? this.mergedCells.indexOf(wantedCollection) : null;\n\n      if (wantedCollection && wantedCollectionIndex !== false) {\n        mergedCells.splice(wantedCollectionIndex, 1);\n        return wantedCollection;\n      }\n\n      return false;\n    }\n\n    /**\n     * Clear all the merged cells.\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      var _this = this;\n\n      var mergedCells = this.mergedCells;\n      var mergedCellParentsToClear = [];\n      var hiddenCollectionElements = [];\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        mergedCellParentsToClear.push([_this.hot.getCell(mergedCell.row, mergedCell.col), _this.get(mergedCell.row, mergedCell.col), mergedCell.row, mergedCell.col]);\n      });\n\n      this.mergedCells.length = 0;\n\n      (0, _array.arrayEach)(mergedCellParentsToClear, function (mergedCell, i) {\n        (0, _number.rangeEach)(0, mergedCell.rowspan - 1, function (j) {\n          (0, _number.rangeEach)(0, mergedCell.colspan - 1, function (k) {\n            if (k !== 0 || j !== 0) {\n              hiddenCollectionElements.push([_this.hot.getCell(mergedCell.row + j, mergedCell.col + k), null, null, null]);\n            }\n          });\n        });\n\n        mergedCellParentsToClear[i][1] = null;\n      });\n\n      (0, _array.arrayEach)(mergedCellParentsToClear, function (mergedCellParents) {\n        _utils.applySpanProperties.apply(undefined, _toConsumableArray(mergedCellParents));\n      });\n\n      (0, _array.arrayEach)(hiddenCollectionElements, function (hiddenCollectionElement) {\n        _utils.applySpanProperties.apply(undefined, _toConsumableArray(hiddenCollectionElement));\n      });\n    }\n\n    /**\n     * Check if the provided merged cell overlaps with the others in the container.\n     *\n     * @param {MergedCellCoords} mergedCell The merged cell to check against all others in the container.\n     * @return {Boolean} `true` if the provided merged cell overlaps with the others, `false` otherwise.\n     */\n\n  }, {\n    key: 'isOverlapping',\n    value: function isOverlapping(mergedCell) {\n      var mergedCellRange = new _index.CellRange(null, new _index.CellCoords(mergedCell.row, mergedCell.col), new _index.CellCoords(mergedCell.row + mergedCell.rowspan - 1, mergedCell.col + mergedCell.colspan - 1));\n      var result = false;\n\n      (0, _array.arrayEach)(this.mergedCells, function (col) {\n        var currentRange = new _index.CellRange(null, new _index.CellCoords(col.row, col.col), new _index.CellCoords(col.row + col.rowspan - 1, col.col + col.colspan - 1));\n\n        if (currentRange.overlaps(mergedCellRange)) {\n          result = true;\n          return false;\n        }\n\n        return true;\n      });\n\n      return result;\n    }\n\n    /**\n     * Check whether the provided row/col coordinates direct to a merged parent.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} column Column index.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isMergedParent',\n    value: function isMergedParent(row, column) {\n      var mergedCells = this.mergedCells;\n      var result = false;\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        if (mergedCell.row === row && mergedCell.col === column) {\n          result = true;\n          return false;\n        }\n\n        return true;\n      });\n\n      return result;\n    }\n\n    /**\n     * Shift the merged cell in the direction and by an offset defined in the arguments.\n     *\n     * @param {String} direction `right`, `left`, `up` or `down`.\n     * @param {Number} index Index where the change, which caused the shifting took place.\n     * @param {Number} count Number of rows/columns added/removed in the preceding action.\n     */\n\n  }, {\n    key: 'shiftCollections',\n    value: function shiftCollections(direction, index, count) {\n      var _this2 = this;\n\n      var shiftVector = [0, 0];\n\n      switch (direction) {\n        case 'right':\n          shiftVector[0] += count;\n          break;\n\n        case 'left':\n          shiftVector[0] -= count;\n          break;\n\n        case 'down':\n          shiftVector[1] += count;\n          break;\n\n        case 'up':\n          shiftVector[1] -= count;\n          break;\n\n        default:\n      }\n\n      (0, _array.arrayEach)(this.mergedCells, function (currentMerge) {\n        currentMerge.shift(shiftVector, index);\n      });\n\n      (0, _number.rangeEachReverse)(this.mergedCells.length - 1, 0, function (i) {\n        var currentMerge = _this2.mergedCells[i];\n\n        if (currentMerge && currentMerge.removed) {\n          _this2.mergedCells.splice(_this2.mergedCells.indexOf(currentMerge), 1);\n        }\n      });\n    }\n  }], [{\n    key: 'IS_OVERLAPPING_WARNING',\n    value: function IS_OVERLAPPING_WARNING(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject, newMergedCell.row, newMergedCell.col);\n    }\n  }]);\n\n  return MergedCellsCollection;\n}();\n\nexports.default = MergedCellsCollection;\n\n/***/ }),\n/* 346 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _src = __webpack_require__(4);\n\nvar _array = __webpack_require__(1);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Class responsible for all of the Autofill-related operations on merged cells.\n *\n * @class AutofillCalculations\n * @plugin MergeCells\n * @util\n */\nvar AutofillCalculations = function () {\n  function AutofillCalculations(plugin) {\n    _classCallCheck(this, AutofillCalculations);\n\n    /**\n     * Reference to the Merge Cells plugin.\n     *\n     * @type {MergeCells}\n     */\n    this.plugin = plugin;\n    /**\n     * Reference to the MergedCellsCollection class instance.\n     *\n     * @type {MergedCellsCollection}\n     */\n    this.mergedCellsCollection = this.plugin.mergedCellsCollection;\n    /**\n     * Cache of the currently processed autofill data.\n     *\n     * @private\n     * @type {Object}\n     */\n    this.currentFillData = null;\n  }\n\n  /**\n   * Correct the provided selection area, so it's not selecting only a part of a merged cell.\n   *\n   * @param {Array} selectionArea\n   */\n\n\n  _createClass(AutofillCalculations, [{\n    key: 'correctSelectionAreaSize',\n    value: function correctSelectionAreaSize(selectionArea) {\n      if (selectionArea[0] === selectionArea[2] && selectionArea[1] === selectionArea[3]) {\n        var mergedCell = this.mergedCellsCollection.get(selectionArea[0], selectionArea[1]);\n\n        if (mergedCell) {\n          selectionArea[2] = selectionArea[0] + mergedCell.rowspan - 1;\n          selectionArea[3] = selectionArea[1] + mergedCell.colspan - 1;\n        }\n      }\n    }\n\n    /**\n     * Get the direction of the autofill process.\n     *\n     * @param {Array} selectionArea The selection area.\n     * @param {Array} finalArea The final area (base + drag).\n     * @return {String} `up`, `down`, `left` or `right`.\n     */\n\n  }, {\n    key: 'getDirection',\n    value: function getDirection(selectionArea, finalArea) {\n      var direction = null;\n\n      if (finalArea[0] === selectionArea[0] && finalArea[1] === selectionArea[1] && finalArea[3] === selectionArea[3]) {\n        direction = 'down';\n      } else if (finalArea[2] === selectionArea[2] && finalArea[1] === selectionArea[1] && finalArea[3] === selectionArea[3]) {\n        direction = 'up';\n      } else if (finalArea[1] === selectionArea[1] && finalArea[2] === selectionArea[2]) {\n        direction = 'right';\n      } else {\n        direction = 'left';\n      }\n\n      return direction;\n    }\n\n    /**\n     * Snap the drag area to the farthest merged cell, so it won't clip any of the merged cells.\n     *\n     * @param {Array} baseArea The base selected area.\n     * @param {Array} dragArea The drag area.\n     * @param {String} dragDirection The autofill drag direction.\n     * @param {Array} foundMergedCells MergeCellCoords found in the base selection area.\n     * @return {Array} The new drag area\n     */\n\n  }, {\n    key: 'snapDragArea',\n    value: function snapDragArea(baseArea, dragArea, dragDirection, foundMergedCells) {\n      var newDragArea = dragArea.slice(0);\n      var fillSize = this.getAutofillSize(baseArea, dragArea, dragDirection);\n\n      var _baseArea = _slicedToArray(baseArea, 4),\n          baseAreaStartRow = _baseArea[0],\n          baseAreaStartColumn = _baseArea[1],\n          baseAreaEndRow = _baseArea[2],\n          baseAreaEndColumn = _baseArea[3];\n\n      var verticalDirection = ['up', 'down'].indexOf(dragDirection) > -1;\n      var fullCycle = verticalDirection ? baseAreaEndRow - baseAreaStartRow + 1 : baseAreaEndColumn - baseAreaStartColumn + 1;\n      var fulls = Math.floor(fillSize / fullCycle) * fullCycle;\n      var partials = fillSize - fulls;\n      var farthestCollection = this.getFarthestCollection(baseArea, dragArea, dragDirection, foundMergedCells);\n\n      if (farthestCollection) {\n        if (dragDirection === 'down') {\n          var fill = farthestCollection.row + farthestCollection.rowspan - baseAreaStartRow - partials;\n          var newLimit = newDragArea[2] + fill;\n\n          if (newLimit >= this.plugin.hot.countRows()) {\n            newDragArea[2] -= partials;\n          } else {\n            newDragArea[2] += partials ? fill : 0;\n          }\n        } else if (dragDirection === 'right') {\n          var _fill = farthestCollection.col + farthestCollection.colspan - baseAreaStartColumn - partials;\n          var _newLimit = newDragArea[3] + _fill;\n\n          if (_newLimit >= this.plugin.hot.countCols()) {\n            newDragArea[3] -= partials;\n          } else {\n            newDragArea[3] += partials ? _fill : 0;\n          }\n        } else if (dragDirection === 'up') {\n          var _fill2 = baseAreaEndRow - partials - farthestCollection.row + 1;\n          var _newLimit2 = newDragArea[0] + _fill2;\n\n          if (_newLimit2 < 0) {\n            newDragArea[0] += partials;\n          } else {\n            newDragArea[0] -= partials ? _fill2 : 0;\n          }\n        } else if (dragDirection === 'left') {\n          var _fill3 = baseAreaEndColumn - partials - farthestCollection.col + 1;\n          var _newLimit3 = newDragArea[1] + _fill3;\n\n          if (_newLimit3 < 0) {\n            newDragArea[1] += partials;\n          } else {\n            newDragArea[1] -= partials ? _fill3 : 0;\n          }\n        }\n      }\n\n      this.updateCurrentFillCache({\n        baseArea: baseArea,\n        dragDirection: dragDirection,\n        foundMergedCells: foundMergedCells,\n        fillSize: fillSize,\n        dragArea: newDragArea,\n        cycleLength: fullCycle\n      });\n\n      return newDragArea;\n    }\n\n    /**\n     * Update the current fill cache with the provided object.\n     *\n     * @private\n     * @param {Object} updateObject\n     */\n\n  }, {\n    key: 'updateCurrentFillCache',\n    value: function updateCurrentFillCache(updateObject) {\n      if (!this.currentFillData) {\n        this.currentFillData = {};\n      }\n\n      (0, _object.extend)(this.currentFillData, updateObject);\n    }\n\n    /**\n     * Get the \"length\" of the drag area.\n     *\n     * @private\n     * @param {Array} baseArea The base selection area.\n     * @param {Array} dragArea The drag area (containing the base area).\n     * @param {String} direction The drag direction.\n     * @return {Number|null} The \"length\" (height or width, depending on the direction) of the drag.\n     */\n\n  }, {\n    key: 'getAutofillSize',\n    value: function getAutofillSize(baseArea, dragArea, direction) {\n      var _baseArea2 = _slicedToArray(baseArea, 4),\n          baseAreaStartRow = _baseArea2[0],\n          baseAreaStartColumn = _baseArea2[1],\n          baseAreaEndRow = _baseArea2[2],\n          baseAreaEndColumn = _baseArea2[3];\n\n      var _dragArea = _slicedToArray(dragArea, 4),\n          dragAreaStartRow = _dragArea[0],\n          dragAreaStartColumn = _dragArea[1],\n          dragAreaEndRow = _dragArea[2],\n          dragAreaEndColumn = _dragArea[3];\n\n      switch (direction) {\n        case 'up':\n          return baseAreaStartRow - dragAreaStartRow;\n        case 'down':\n          return dragAreaEndRow - baseAreaEndRow;\n        case 'left':\n          return baseAreaStartColumn - dragAreaStartColumn;\n        case 'right':\n          return dragAreaEndColumn - baseAreaEndColumn;\n        default:\n          return null;\n      }\n    }\n\n    /**\n     * Trim the default drag area (containing the selection area) to the drag-only area.\n     *\n     * @private\n     * @param {Array} baseArea The base selection area.\n     * @param {Array} dragArea The base selection area extended by the drag area.\n     * @param {String} direction Drag direction.\n     * @return {Array|null} Array representing the drag area coordinates.\n     */\n\n  }, {\n    key: 'getDragArea',\n    value: function getDragArea(baseArea, dragArea, direction) {\n      var _baseArea3 = _slicedToArray(baseArea, 4),\n          baseAreaStartRow = _baseArea3[0],\n          baseAreaStartColumn = _baseArea3[1],\n          baseAreaEndRow = _baseArea3[2],\n          baseAreaEndColumn = _baseArea3[3];\n\n      var _dragArea2 = _slicedToArray(dragArea, 4),\n          dragAreaStartRow = _dragArea2[0],\n          dragAreaStartColumn = _dragArea2[1],\n          dragAreaEndRow = _dragArea2[2],\n          dragAreaEndColumn = _dragArea2[3];\n\n      switch (direction) {\n        case 'up':\n          return [dragAreaStartRow, dragAreaStartColumn, baseAreaStartRow - 1, baseAreaEndColumn];\n        case 'down':\n          return [baseAreaEndRow + 1, baseAreaStartColumn, dragAreaEndRow, baseAreaEndColumn];\n        case 'left':\n          return [dragAreaStartRow, dragAreaStartColumn, baseAreaEndRow, baseAreaStartColumn - 1];\n        case 'right':\n          return [baseAreaStartRow, baseAreaEndColumn + 1, dragAreaEndRow, dragAreaEndColumn];\n        default:\n          return null;\n      }\n    }\n\n    /**\n     * Get the to-be-farthest merged cell in the newly filled area.\n     *\n     * @private\n     * @param {Array} baseArea The base selection area.\n     * @param {Array} dragArea The drag area (containing the base area).\n     * @param {String} direction The drag direction.\n     * @param {Array} mergedCellArray Array of the merged cells found in the base area.\n     * @return {MergedCellCoords|null}\n     */\n\n  }, {\n    key: 'getFarthestCollection',\n    value: function getFarthestCollection(baseArea, dragArea, direction, mergedCellArray) {\n      var _baseArea4 = _slicedToArray(baseArea, 4),\n          baseAreaStartRow = _baseArea4[0],\n          baseAreaStartColumn = _baseArea4[1],\n          baseAreaEndRow = _baseArea4[2],\n          baseAreaEndColumn = _baseArea4[3];\n\n      var verticalDirection = ['up', 'down'].indexOf(direction) > -1;\n      var baseEnd = verticalDirection ? baseAreaEndRow : baseAreaEndColumn;\n      var baseStart = verticalDirection ? baseAreaStartRow : baseAreaStartColumn;\n      var fillSize = this.getAutofillSize(baseArea, dragArea, direction);\n      var fullCycle = verticalDirection ? baseAreaEndRow - baseAreaStartRow + 1 : baseAreaEndColumn - baseAreaStartColumn + 1;\n      var fulls = Math.floor(fillSize / fullCycle) * fullCycle;\n      var partials = fillSize - fulls;\n      var inclusionFunctionName = null;\n      var farthestCollection = null;\n      var endOfDragRecreationIndex = null;\n\n      switch (direction) {\n        case 'up':\n          inclusionFunctionName = 'includesVertically';\n          endOfDragRecreationIndex = baseEnd - partials + 1;\n          break;\n\n        case 'left':\n          inclusionFunctionName = 'includesHorizontally';\n          endOfDragRecreationIndex = baseEnd - partials + 1;\n          break;\n\n        case 'down':\n          inclusionFunctionName = 'includesVertically';\n          endOfDragRecreationIndex = baseStart + partials - 1;\n          break;\n\n        case 'right':\n          inclusionFunctionName = 'includesHorizontally';\n          endOfDragRecreationIndex = baseStart + partials - 1;\n          break;\n\n        default:\n      }\n\n      (0, _array.arrayEach)(mergedCellArray, function (currentCollection) {\n        if (currentCollection[inclusionFunctionName](endOfDragRecreationIndex) && currentCollection.isFarther(farthestCollection, direction)) {\n          farthestCollection = currentCollection;\n        }\n      });\n\n      return farthestCollection;\n    }\n\n    /**\n     * Recreate the merged cells after the autofill process.\n     *\n     * @param {Array} changes Changes made.\n     */\n\n  }, {\n    key: 'recreateAfterDataPopulation',\n    value: function recreateAfterDataPopulation(changes) {\n      if (!this.currentFillData) {\n        return;\n      }\n\n      var fillRange = this.getRangeFromChanges(changes);\n      var foundMergedCells = this.currentFillData.foundMergedCells;\n      var dragDirection = this.currentFillData.dragDirection;\n      var inBounds = function inBounds(current, offset) {\n        switch (dragDirection) {\n          case 'up':\n            return current.row - offset >= fillRange.from.row;\n          case 'down':\n            return current.row + current.rowspan - 1 + offset <= fillRange.to.row;\n          case 'left':\n            return current.col - offset >= fillRange.from.column;\n          case 'right':\n            return current.col + current.colspan - 1 + offset <= fillRange.to.column;\n          default:\n            return null;\n        }\n      };\n      var fillOffset = 0;\n      var current = null;\n      var multiplier = 1;\n\n      do {\n        for (var j = 0; j < foundMergedCells.length; j += 1) {\n          current = foundMergedCells[j];\n\n          fillOffset = multiplier * this.currentFillData.cycleLength;\n\n          if (inBounds(current, fillOffset)) {\n            switch (dragDirection) {\n              case 'up':\n                this.plugin.mergedCellsCollection.add({\n                  row: current.row - fillOffset,\n                  rowspan: current.rowspan,\n                  col: current.col,\n                  colspan: current.colspan\n                });\n                break;\n\n              case 'down':\n                this.plugin.mergedCellsCollection.add({\n                  row: current.row + fillOffset,\n                  rowspan: current.rowspan,\n                  col: current.col,\n                  colspan: current.colspan\n                });\n                break;\n\n              case 'left':\n                this.plugin.mergedCellsCollection.add({\n                  row: current.row,\n                  rowspan: current.rowspan,\n                  col: current.col - fillOffset,\n                  colspan: current.colspan\n                });\n                break;\n\n              case 'right':\n                this.plugin.mergedCellsCollection.add({\n                  row: current.row,\n                  rowspan: current.rowspan,\n                  col: current.col + fillOffset,\n                  colspan: current.colspan\n                });\n                break;\n\n              default:\n            }\n          }\n\n          if (j === foundMergedCells.length - 1) {\n            multiplier += 1;\n          }\n        }\n      } while (inBounds(current, fillOffset));\n\n      this.currentFillData = null;\n      this.plugin.hot.render();\n    }\n\n    /**\n     * Get the drag range from the changes made.\n     *\n     * @private\n     * @param {Array} changes The changes made.\n     * @returns {Object} Object with `from` and `to` properties, both containing `row` and `column` keys.\n     */\n\n  }, {\n    key: 'getRangeFromChanges',\n    value: function getRangeFromChanges(changes) {\n      var rows = { min: null, max: null };\n      var columns = { min: null, max: null };\n\n      (0, _array.arrayEach)(changes, function (change) {\n        if (rows.min === null || change[0] < rows.min) {\n          rows.min = change[0];\n        }\n\n        if (rows.max === null || change[0] > rows.max) {\n          rows.max = change[0];\n        }\n\n        if (columns.min === null || change[1] < columns.min) {\n          columns.min = change[1];\n        }\n\n        if (columns.max === null || change[1] > columns.max) {\n          columns.max = change[1];\n        }\n      });\n\n      return {\n        from: {\n          row: rows.min,\n          column: columns.min\n        },\n        to: {\n          row: rows.max,\n          column: columns.max\n        }\n      };\n    }\n\n    /**\n     * Check if the drag area contains any merged cells.\n     *\n     * @param {Array} baseArea The base selection area.\n     * @param {Array} fullArea The base area extended by the drag area.\n     * @param {String} direction Drag direction.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'dragAreaOverlapsCollections',\n    value: function dragAreaOverlapsCollections(baseArea, fullArea, direction) {\n      var dragArea = this.getDragArea(baseArea, fullArea, direction);\n\n      var _dragArea3 = _slicedToArray(dragArea, 4),\n          dragAreaStartRow = _dragArea3[0],\n          dragAreaStartColumn = _dragArea3[1],\n          dragAreaEndRow = _dragArea3[2],\n          dragAreaEndColumn = _dragArea3[3];\n\n      var topLeft = new _src.CellCoords(dragAreaStartRow, dragAreaStartColumn);\n      var bottomRight = new _src.CellCoords(dragAreaEndRow, dragAreaEndColumn);\n      var dragRange = new _src.CellRange(topLeft, topLeft, bottomRight);\n\n      return !!this.mergedCellsCollection.getWithinRange(dragRange, true);\n    }\n  }]);\n\n  return AutofillCalculations;\n}();\n\nexports.default = AutofillCalculations;\n\n/***/ }),\n/* 347 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _src = __webpack_require__(4);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Class responsible for all of the Selection-related operations on merged cells.\n *\n * @class SelectionCalculations\n * @plugin MergeCells\n * @util\n */\nvar SelectionCalculations = function () {\n  function SelectionCalculations(plugin) {\n    _classCallCheck(this, SelectionCalculations);\n\n    /**\n     * Reference to the Merge Cells plugin.\n     *\n     * @type {MergeCells}\n     */\n    this.plugin = plugin;\n    /**\n     * Class name used for fully selected merged cells.\n     *\n     * @type {String}\n     */\n    this.fullySelectedMergedCellClassName = 'fullySelectedMergedCell';\n  }\n\n  /**\n   * \"Snap\" the delta value according to defined merged cells. (In other words, compensate the rowspan -\n   * e.g. going up with `delta.row = -1` over a merged cell with `rowspan = 3`, `delta.row` should change to `-3`.)\n   *\n   * @param {Object} delta The delta object containing `row` and `col` properties.\n   * @param {CellRange} selectionRange The selection range.\n   * @param {Object} mergedCell A merged cell object.\n   */\n\n\n  _createClass(SelectionCalculations, [{\n    key: 'snapDelta',\n    value: function snapDelta(delta, selectionRange, mergedCell) {\n      var cellCoords = selectionRange.to;\n      var newRow = cellCoords.row + delta.row;\n      var newColumn = cellCoords.col + delta.col;\n\n      if (delta.row) {\n        this.jumpOverMergedCell(delta, mergedCell, newRow);\n      } else if (delta.col) {\n        this.jumpOverMergedCell(delta, mergedCell, newColumn);\n      }\n    }\n\n    /**\n     * \"Jump\" over the merged cell (compensate for the indexes within the merged cell to get past it)\n     *\n     * @private\n     * @param {Object} delta The delta object.\n     * @param {MergedCellCoords} mergedCell The merge cell object.\n     * @param {Number} newIndex New row/column index, created with the delta.\n     */\n\n  }, {\n    key: 'jumpOverMergedCell',\n    value: function jumpOverMergedCell(delta, mergedCell, newIndex) {\n      var flatDelta = delta.row || delta.col;\n      var includesIndex = null;\n      var firstIndex = null;\n      var lastIndex = null;\n\n      if (delta.row) {\n        includesIndex = mergedCell.includesVertically(newIndex);\n        firstIndex = mergedCell.row;\n        lastIndex = mergedCell.getLastRow();\n      } else if (delta.col) {\n        includesIndex = mergedCell.includesHorizontally(newIndex);\n        firstIndex = mergedCell.col;\n        lastIndex = mergedCell.getLastColumn();\n      }\n\n      if (flatDelta === 0) {\n        return;\n      } else if (flatDelta > 0) {\n        if (includesIndex && newIndex !== firstIndex) {\n          flatDelta += lastIndex - newIndex + 1;\n        }\n      } else if (includesIndex && newIndex !== lastIndex) {\n        flatDelta -= newIndex - firstIndex + 1;\n      }\n\n      if (delta.row) {\n        delta.row = flatDelta;\n      } else if (delta.col) {\n        delta.col = flatDelta;\n      }\n    }\n\n    /**\n     * Get a selection range with `to` property incremented by the provided delta.\n     *\n     * @param {CellRange} oldSelectionRange The base selection range.\n     * @param {Object} delta The delta object with `row` and `col` properties.\n     * @returns {CellRange} A new `CellRange` object.\n     */\n\n  }, {\n    key: 'getUpdatedSelectionRange',\n    value: function getUpdatedSelectionRange(oldSelectionRange, delta) {\n      return new _src.CellRange(oldSelectionRange.highlight, oldSelectionRange.from, new _src.CellCoords(oldSelectionRange.to.row + delta.row, oldSelectionRange.to.col + delta.col));\n    }\n\n    /**\n     * Generate an additional class name for the entirely-selected merged cells.\n     *\n     * @param {Number} currentRow Row index of the currently processed cell.\n     * @param {Number} currentColumn Column index of the currently cell.\n     * @param {Array} cornersOfSelection Array of the current selection in a form of `[startRow, startColumn, endRow, endColumn]`.\n     * @param {Number|undefined} layerLevel Number indicating which layer of selection is currently processed.\n     * @returns {String|undefined} A `String`, which will act as an additional `className` to be added to the currently processed cell.\n     */\n\n  }, {\n    key: 'getSelectedMergedCellClassName',\n    value: function getSelectedMergedCellClassName(currentRow, currentColumn, cornersOfSelection, layerLevel) {\n      var _cornersOfSelection = _slicedToArray(cornersOfSelection, 4),\n          startRow = _cornersOfSelection[0],\n          startColumn = _cornersOfSelection[1],\n          endRow = _cornersOfSelection[2],\n          endColumn = _cornersOfSelection[3];\n\n      if (layerLevel === void 0) {\n        return;\n      }\n\n      if (currentRow >= startRow && currentRow <= endRow && currentColumn >= startColumn && currentColumn <= endColumn) {\n\n        var isMergedCellParent = this.plugin.mergedCellsCollection.isMergedParent(currentRow, currentColumn);\n\n        if (!isMergedCellParent) {\n          return;\n        }\n\n        var mergedCell = this.plugin.mergedCellsCollection.get(currentRow, currentColumn);\n\n        if (!mergedCell) {\n          return;\n        }\n\n        if (mergedCell.row + mergedCell.rowspan - 1 <= endRow && mergedCell.col + mergedCell.colspan - 1 <= endColumn) {\n          return this.fullySelectedMergedCellClassName + '-' + layerLevel;\n        } else if (this.plugin.selectionCalculations.isMergeCellFullySelected(mergedCell, this.plugin.hot.getSelectedRange())) {\n          return this.fullySelectedMergedCellClassName + '-multiple';\n        }\n      }\n    }\n\n    /**\n     * Check if the provided merged cell is fully selected (by one or many layers of selection)\n     *\n     * @param {MergedCellCoords} mergedCell The merged cell to be processed.\n     * @param {CellRange[]} selectionRangesArray Array of selection ranges.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isMergeCellFullySelected',\n    value: function isMergeCellFullySelected(mergedCell, selectionRangesArray) {\n      var mergedCellIndividualCoords = [];\n\n      if (!selectionRangesArray || !mergedCell) {\n        return false;\n      }\n\n      for (var r = 0; r < mergedCell.rowspan; r += 1) {\n        for (var c = 0; c < mergedCell.colspan; c += 1) {\n          mergedCellIndividualCoords.push(new _src.CellCoords(mergedCell.row + r, mergedCell.col + c));\n        }\n      }\n\n      for (var i = 0; i < mergedCellIndividualCoords.length; i += 1) {\n        var insideSelections = [];\n\n        for (var s = 0; s < selectionRangesArray.length; s += 1) {\n          insideSelections[s] = selectionRangesArray[s].includes(mergedCellIndividualCoords[i]);\n        }\n\n        if (!insideSelections.includes(true)) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n\n    /**\n     * Generate an array of the entirely-selected merged cells' class names.\n     *\n     * @returns {String[]} An `Array` of `String`s. Each of these strings will act like class names to be removed from all the cells in the table.\n     */\n\n  }, {\n    key: 'getSelectedMergedCellClassNameToRemove',\n    value: function getSelectedMergedCellClassNameToRemove() {\n      var classNames = [];\n\n      for (var i = 0; i <= 7; i += 1) {\n        classNames.push(this.fullySelectedMergedCellClassName + '-' + i);\n      }\n\n      classNames.push(this.fullySelectedMergedCellClassName + '-multiple');\n\n      return classNames;\n    }\n  }]);\n\n  return SelectionCalculations;\n}();\n\nexports.default = SelectionCalculations;\n\n/***/ }),\n/* 348 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = toggleMergeItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _cellCoords = __webpack_require__(95);\n\nvar _cellCoords2 = _interopRequireDefault(_cellCoords);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction toggleMergeItem(plugin) {\n  return {\n    key: 'mergeCells',\n    name: function name() {\n      var sel = this.getSelectedLast();\n\n      if (sel) {\n        var info = plugin.mergedCellsCollection.get(sel[0], sel[1]);\n\n        if (info.row === sel[0] && info.col === sel[1] && info.row + info.rowspan - 1 === sel[2] && info.col + info.colspan - 1 === sel[3]) {\n          return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_UNMERGE_CELLS);\n        }\n      }\n\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_MERGE_CELLS);\n    },\n    callback: function callback() {\n      plugin.toggleMergeOnSelection();\n    },\n    disabled: function disabled() {\n      var sel = this.getSelectedLast();\n\n      if (!sel) {\n        return true;\n      }\n\n      var isSingleCell = _cellCoords2.default.isSingleCell({\n        row: sel[0],\n        col: sel[1],\n        rowspan: sel[2] - sel[0] + 1,\n        colspan: sel[3] - sel[1] + 1\n      });\n\n      return isSingleCell || this.selection.isSelectedByCorner();\n    },\n\n    hidden: false\n  };\n}\n\n/***/ }),\n/* 349 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 350 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _element = __webpack_require__(0);\n\nvar _browser = __webpack_require__(27);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nvar _src = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @plugin MultipleSelectionHandles\n */\nvar MultipleSelectionHandles = function (_BasePlugin) {\n  _inherits(MultipleSelectionHandles, _BasePlugin);\n\n  /**\n   * @param {Object} hotInstance\n   */\n  function MultipleSelectionHandles(hotInstance) {\n    _classCallCheck(this, MultipleSelectionHandles);\n\n    /**\n     * @type {Array}\n     */\n    var _this2 = _possibleConstructorReturn(this, (MultipleSelectionHandles.__proto__ || Object.getPrototypeOf(MultipleSelectionHandles)).call(this, hotInstance));\n\n    _this2.dragged = [];\n    /**\n     * Instance of EventManager.\n     *\n     * @type {EventManager}\n     */\n    _this2.eventManager = null;\n    /**\n     * @type {null}\n     */\n    _this2.lastSetCell = null;\n    return _this2;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(MultipleSelectionHandles, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return (0, _browser.isMobileBrowser)();\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      if (this.enabled) {\n        return;\n      }\n      if (!this.eventManager) {\n        this.eventManager = new _eventManager2.default(this);\n      }\n      this.registerListeners();\n      _get(MultipleSelectionHandles.prototype.__proto__ || Object.getPrototypeOf(MultipleSelectionHandles.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Bind the touch events\n     * @private\n     */\n\n  }, {\n    key: 'registerListeners',\n    value: function registerListeners() {\n      var _this = this;\n\n      function removeFromDragged(query) {\n\n        if (_this.dragged.length === 1) {\n          // clear array\n          _this.dragged.splice(0, _this.dragged.length);\n\n          return true;\n        }\n\n        var entryPosition = _this.dragged.indexOf(query);\n\n        if (entryPosition == -1) {\n          return false;\n        } else if (entryPosition === 0) {\n          _this.dragged = _this.dragged.slice(0, 1);\n        } else if (entryPosition == 1) {\n          _this.dragged = _this.dragged.slice(-1);\n        }\n      }\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'touchstart', function (event) {\n        var selectedRange = void 0;\n\n        if ((0, _element.hasClass)(event.target, 'topLeftSelectionHandle-HitArea')) {\n          selectedRange = _this.hot.getSelectedRangeLast();\n\n          _this.dragged.push('topLeft');\n\n          _this.touchStartRange = {\n            width: selectedRange.getWidth(),\n            height: selectedRange.getHeight(),\n            direction: selectedRange.getDirection()\n          };\n\n          event.preventDefault();\n          return false;\n        } else if ((0, _element.hasClass)(event.target, 'bottomRightSelectionHandle-HitArea')) {\n          selectedRange = _this.hot.getSelectedRangeLast();\n\n          _this.dragged.push('bottomRight');\n\n          _this.touchStartRange = {\n            width: selectedRange.getWidth(),\n            height: selectedRange.getHeight(),\n            direction: selectedRange.getDirection()\n          };\n\n          event.preventDefault();\n          return false;\n        }\n      });\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'touchend', function (event) {\n        if ((0, _element.hasClass)(event.target, 'topLeftSelectionHandle-HitArea')) {\n          removeFromDragged.call(_this, 'topLeft');\n\n          _this.touchStartRange = void 0;\n\n          event.preventDefault();\n          return false;\n        } else if ((0, _element.hasClass)(event.target, 'bottomRightSelectionHandle-HitArea')) {\n          removeFromDragged.call(_this, 'bottomRight');\n\n          _this.touchStartRange = void 0;\n\n          event.preventDefault();\n          return false;\n        }\n      });\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'touchmove', function (event) {\n        var scrollTop = (0, _element.getWindowScrollTop)(),\n            scrollLeft = (0, _element.getWindowScrollLeft)(),\n            endTarget = void 0,\n            targetCoords = void 0,\n            selectedRange = void 0,\n            rangeWidth = void 0,\n            rangeHeight = void 0,\n            rangeDirection = void 0,\n            newRangeCoords = void 0;\n\n        if (_this.dragged.length === 0) {\n          return;\n        }\n\n        endTarget = document.elementFromPoint(event.touches[0].screenX - scrollLeft, event.touches[0].screenY - scrollTop);\n\n        if (!endTarget || endTarget === _this.lastSetCell) {\n          return;\n        }\n\n        if (endTarget.nodeName == 'TD' || endTarget.nodeName == 'TH') {\n          targetCoords = _this.hot.getCoords(endTarget);\n\n          if (targetCoords.col == -1) {\n            targetCoords.col = 0;\n          }\n\n          selectedRange = _this.hot.getSelectedRangeLast();\n          rangeWidth = selectedRange.getWidth();\n          rangeHeight = selectedRange.getHeight();\n          rangeDirection = selectedRange.getDirection();\n\n          if (rangeWidth == 1 && rangeHeight == 1) {\n            _this.hot.selection.setRangeEnd(targetCoords);\n          }\n\n          newRangeCoords = _this.getCurrentRangeCoords(selectedRange, targetCoords, _this.touchStartRange.direction, rangeDirection, _this.dragged[0]);\n\n          if (newRangeCoords.start !== null) {\n            _this.hot.selection.setRangeStart(newRangeCoords.start);\n          }\n\n          _this.hot.selection.setRangeEnd(newRangeCoords.end);\n\n          _this.lastSetCell = endTarget;\n        }\n\n        event.preventDefault();\n      });\n    }\n  }, {\n    key: 'getCurrentRangeCoords',\n    value: function getCurrentRangeCoords(selectedRange, currentTouch, touchStartDirection, currentDirection, draggedHandle) {\n      var topLeftCorner = selectedRange.getTopLeftCorner(),\n          bottomRightCorner = selectedRange.getBottomRightCorner(),\n          bottomLeftCorner = selectedRange.getBottomLeftCorner(),\n          topRightCorner = selectedRange.getTopRightCorner();\n\n      var newCoords = {\n        start: null,\n        end: null\n      };\n\n      switch (touchStartDirection) {\n        case 'NE-SW':\n          switch (currentDirection) {\n            case 'NE-SW':\n            case 'NW-SE':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: new _src.CellCoords(currentTouch.row, selectedRange.highlight.col),\n                  end: new _src.CellCoords(bottomLeftCorner.row, currentTouch.col)\n                };\n              } else {\n                newCoords = {\n                  start: new _src.CellCoords(selectedRange.highlight.row, currentTouch.col),\n                  end: new _src.CellCoords(currentTouch.row, topLeftCorner.col)\n                };\n              }\n              break;\n            case 'SE-NW':\n              if (draggedHandle == 'bottomRight') {\n                newCoords = {\n                  start: new _src.CellCoords(bottomRightCorner.row, currentTouch.col),\n                  end: new _src.CellCoords(currentTouch.row, topLeftCorner.col)\n                };\n              }\n              break;\n            default:\n              break;\n          }\n          break;\n        case 'NW-SE':\n          switch (currentDirection) {\n            case 'NE-SW':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: currentTouch,\n                  end: bottomLeftCorner\n                };\n              } else {\n                newCoords.end = currentTouch;\n              }\n              break;\n            case 'NW-SE':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: currentTouch,\n                  end: bottomRightCorner\n                };\n              } else {\n                newCoords.end = currentTouch;\n              }\n              break;\n            case 'SE-NW':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: currentTouch,\n                  end: topLeftCorner\n                };\n              } else {\n                newCoords.end = currentTouch;\n              }\n              break;\n            case 'SW-NE':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: currentTouch,\n                  end: topRightCorner\n                };\n              } else {\n                newCoords.end = currentTouch;\n              }\n              break;\n            default:\n              break;\n          }\n          break;\n        case 'SW-NE':\n          switch (currentDirection) {\n            case 'NW-SE':\n              if (draggedHandle == 'bottomRight') {\n                newCoords = {\n                  start: new _src.CellCoords(currentTouch.row, topLeftCorner.col),\n                  end: new _src.CellCoords(bottomLeftCorner.row, currentTouch.col)\n                };\n              } else {\n                newCoords = {\n                  start: new _src.CellCoords(topLeftCorner.row, currentTouch.col),\n                  end: new _src.CellCoords(currentTouch.row, bottomRightCorner.col)\n                };\n              }\n              break;\n            // case 'NE-SW':\n            //\n            //  break;\n            case 'SW-NE':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: new _src.CellCoords(selectedRange.highlight.row, currentTouch.col),\n                  end: new _src.CellCoords(currentTouch.row, bottomRightCorner.col)\n                };\n              } else {\n                newCoords = {\n                  start: new _src.CellCoords(currentTouch.row, topLeftCorner.col),\n                  end: new _src.CellCoords(topLeftCorner.row, currentTouch.col)\n                };\n              }\n              break;\n            case 'SE-NW':\n              if (draggedHandle == 'bottomRight') {\n                newCoords = {\n                  start: new _src.CellCoords(currentTouch.row, topRightCorner.col),\n                  end: new _src.CellCoords(topLeftCorner.row, currentTouch.col)\n                };\n              } else if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: bottomLeftCorner,\n                  end: currentTouch\n                };\n              }\n              break;\n            default:\n              break;\n          }\n          break;\n        case 'SE-NW':\n          switch (currentDirection) {\n            case 'NW-SE':\n            case 'NE-SW':\n            case 'SW-NE':\n              if (draggedHandle == 'topLeft') {\n                newCoords.end = currentTouch;\n              }\n              break;\n            case 'SE-NW':\n              if (draggedHandle == 'topLeft') {\n                newCoords.end = currentTouch;\n              } else {\n                newCoords = {\n                  start: currentTouch,\n                  end: topLeftCorner\n                };\n              }\n              break;\n            default:\n              break;\n          }\n          break;\n        default:\n          break;\n      }\n\n      return newCoords;\n    }\n\n    /**\n     * Check if user is currently dragging the handle.\n     *\n     * @returns {boolean} Dragging state\n     */\n\n  }, {\n    key: 'isDragged',\n    value: function isDragged() {\n      return this.dragged.length > 0;\n    }\n  }]);\n\n  return MultipleSelectionHandles;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('multipleSelectionHandles', MultipleSelectionHandles);\n\nexports.default = MultipleSelectionHandles;\n\n/***/ }),\n/* 351 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _jsonPatchDuplex = __webpack_require__(205);\n\nvar _jsonPatchDuplex2 = _interopRequireDefault(_jsonPatchDuplex);\n\nvar _dataObserver = __webpack_require__(352);\n\nvar _dataObserver2 = _interopRequireDefault(_dataObserver);\n\nvar _array = __webpack_require__(1);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// Handsontable.hooks.register('afterChangesObserved');\n\n/**\n * @plugin ObserveChanges\n *\n * @description\n * This plugin allows to observe data source changes.\n *\n * By default, the plugin is declared as `undefined`, which makes it disabled.\n * Enabling this plugin switches the table into one-way data binding where changes are applied into the data source (outside from the table)\n * will be automatically reflected in the table.\n *\n * ```js\n * ...\n * // as a boolean\n * observeChanges: true,\n * ...\n * ```\n *\n * To configure this plugin see {@link Options#observeChanges}.\n */\nvar ObserveChanges = function (_BasePlugin) {\n  _inherits(ObserveChanges, _BasePlugin);\n\n  function ObserveChanges(hotInstance) {\n    _classCallCheck(this, ObserveChanges);\n\n    /**\n     * Instance of {@link DataObserver}.\n     *\n     * @type {DataObserver}\n     */\n    var _this = _possibleConstructorReturn(this, (ObserveChanges.__proto__ || Object.getPrototypeOf(ObserveChanges)).call(this, hotInstance));\n\n    _this.observer = null;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ObserveChanges, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().observeChanges;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n      if (!this.observer) {\n        this.observer = new _dataObserver2.default(this.hot.getSourceData());\n        this._exposePublicApi();\n      }\n\n      this.observer.addLocalHook('change', function (patches) {\n        return _this2.onDataChange(patches);\n      });\n      this.addHook('afterCreateRow', function () {\n        return _this2.onAfterTableAlter();\n      });\n      this.addHook('afterRemoveRow', function () {\n        return _this2.onAfterTableAlter();\n      });\n      this.addHook('afterCreateCol', function () {\n        return _this2.onAfterTableAlter();\n      });\n      this.addHook('afterRemoveCol', function () {\n        return _this2.onAfterTableAlter();\n      });\n      this.addHook('afterChange', function (changes, source) {\n        return _this2.onAfterTableAlter(source);\n      });\n      this.addHook('afterLoadData', function (firstRun) {\n        return _this2.onAfterLoadData(firstRun);\n      });\n\n      _get(ObserveChanges.prototype.__proto__ || Object.getPrototypeOf(ObserveChanges.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      if (this.observer) {\n        this.observer.destroy();\n        this.observer = null;\n        this._deletePublicApi();\n      }\n\n      _get(ObserveChanges.prototype.__proto__ || Object.getPrototypeOf(ObserveChanges.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Data change observer.\n     *\n     * @private\n     * @param {Array} patches An array of objects which every item defines coordinates where data was changed.\n     */\n\n  }, {\n    key: 'onDataChange',\n    value: function onDataChange(patches) {\n      var _this3 = this;\n\n      if (!this.observer.isPaused()) {\n        var sourceName = this.pluginName + '.change';\n        var actions = {\n          add: function add(patch) {\n            if (isNaN(patch.col)) {\n              _this3.hot.runHooks('afterCreateRow', patch.row, 1, sourceName);\n            } else {\n              _this3.hot.runHooks('afterCreateCol', patch.col, 1, sourceName);\n            }\n          },\n          remove: function remove(patch) {\n            if (isNaN(patch.col)) {\n              _this3.hot.runHooks('afterRemoveRow', patch.row, 1, sourceName);\n            } else {\n              _this3.hot.runHooks('afterRemoveCol', patch.col, 1, sourceName);\n            }\n          },\n          replace: function replace(patch) {\n            _this3.hot.runHooks('afterChange', [[patch.row, patch.col, null, patch.value]], sourceName);\n          }\n        };\n\n        (0, _array.arrayEach)(patches, function (patch) {\n          if (actions[patch.op]) {\n            actions[patch.op](patch);\n          }\n        });\n        this.hot.render();\n      }\n\n      this.hot.runHooks('afterChangesObserved');\n    }\n\n    /**\n     * On after table alter listener. Prevents infinity loop between internal and external data changing.\n     *\n     * @private\n     * @param source\n     */\n\n  }, {\n    key: 'onAfterTableAlter',\n    value: function onAfterTableAlter(source) {\n      var _this4 = this;\n\n      if (source !== 'loadData') {\n        this.observer.pause();\n        this.hot.addHookOnce('afterChangesObserved', function () {\n          return _this4.observer.resume();\n        });\n      }\n    }\n\n    /**\n     * On after load data listener.\n     *\n     * @private\n     * @param {Boolean} firstRun `true` if event was fired first time.\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData(firstRun) {\n      if (!firstRun) {\n        this.observer.setObservedData(this.hot.getSourceData());\n      }\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.observer) {\n        this.observer.destroy();\n        this._deletePublicApi();\n      }\n      _get(ObserveChanges.prototype.__proto__ || Object.getPrototypeOf(ObserveChanges.prototype), 'destroy', this).call(this);\n    }\n\n    /**\n     * Expose plugins methods to the core.\n     *\n     * @private\n     */\n\n  }, {\n    key: '_exposePublicApi',\n    value: function _exposePublicApi() {\n      var _this5 = this;\n\n      var hot = this.hot;\n\n      hot.pauseObservingChanges = function () {\n        return _this5.observer.pause();\n      };\n      hot.resumeObservingChanges = function () {\n        return _this5.observer.resume();\n      };\n      hot.isPausedObservingChanges = function () {\n        return _this5.observer.isPaused();\n      };\n    }\n\n    /**\n     * Delete all previously exposed methods.\n     *\n     * @private\n     */\n\n  }, {\n    key: '_deletePublicApi',\n    value: function _deletePublicApi() {\n      var hot = this.hot;\n\n      delete hot.pauseObservingChanges;\n      delete hot.resumeObservingChanges;\n      delete hot.isPausedObservingChanges;\n    }\n  }]);\n\n  return ObserveChanges;\n}(_base2.default);\n\nexports.default = ObserveChanges;\n\n\n(0, _plugins.registerPlugin)('observeChanges', ObserveChanges);\n\n/***/ }),\n/* 352 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _jsonPatchDuplex = __webpack_require__(205);\n\nvar _jsonPatchDuplex2 = _interopRequireDefault(_jsonPatchDuplex);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nvar _object = __webpack_require__(2);\n\nvar _utils = __webpack_require__(353);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class DataObserver\n * @plugin ObserveChanges\n */\nvar DataObserver = function () {\n  function DataObserver(observedData) {\n    _classCallCheck(this, DataObserver);\n\n    /**\n     * Observed source data.\n     *\n     * @type {Array}\n     */\n    this.observedData = null;\n    /**\n     * JsonPatch observer.\n     *\n     * @type {Object}\n     */\n    this.observer = null;\n    /**\n     * Flag which determines if observer is paused or not. Paused observer doesn't emit `change` hooks.\n     *\n     * @type {Boolean}\n     * @default false\n     */\n    this.paused = false;\n\n    this.setObservedData(observedData);\n  }\n\n  /**\n   * Set data to observe.\n   *\n   * @param {*} observedData\n   */\n\n\n  _createClass(DataObserver, [{\n    key: 'setObservedData',\n    value: function setObservedData(observedData) {\n      var _this = this;\n\n      if (this.observer) {\n        _jsonPatchDuplex2.default.unobserve(this.observedData, this.observer);\n      }\n      this.observedData = observedData;\n      this.observer = _jsonPatchDuplex2.default.observe(this.observedData, function (patches) {\n        return _this.onChange(patches);\n      });\n    }\n\n    /**\n     * Check if observer was paused.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isPaused',\n    value: function isPaused() {\n      return this.paused;\n    }\n\n    /**\n     * Pause observer (stop emitting all detected changes).\n     */\n\n  }, {\n    key: 'pause',\n    value: function pause() {\n      this.paused = true;\n    }\n\n    /**\n     * Resume observer (emit all detected changes).\n     */\n\n  }, {\n    key: 'resume',\n    value: function resume() {\n      this.paused = false;\n    }\n\n    /**\n     * JsonPatch on change listener.\n     *\n     * @private\n     * @param {Array} patches An array of object passed from jsonpatch.\n     */\n\n  }, {\n    key: 'onChange',\n    value: function onChange(patches) {\n      this.runLocalHooks('change', (0, _utils.cleanPatches)(patches));\n    }\n\n    /**\n     * Destroy observer instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _jsonPatchDuplex2.default.unobserve(this.observedData, this.observer);\n      this.observedData = null;\n      this.observer = null;\n    }\n  }]);\n\n  return DataObserver;\n}();\n\n(0, _object.mixin)(DataObserver, _localHooks2.default);\n\nexports.default = DataObserver;\n\n/***/ }),\n/* 353 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.cleanPatches = cleanPatches;\nexports.parsePath = parsePath;\n\nvar _array = __webpack_require__(1);\n\n/**\n * Clean and extend patches from jsonpatch observer.\n *\n * @param {Array} patches\n * @returns {Array}\n */\nfunction cleanPatches(patches) {\n  var newOrRemovedColumns = [];\n\n  /**\n   * If observeChanges uses native Object.observe method, then it produces patches for length property. Filter them.\n   * If path can't be parsed. Filter it.\n   */\n  patches = (0, _array.arrayFilter)(patches, function (patch) {\n    if (/[/]length/ig.test(patch.path)) {\n      return false;\n    }\n    if (!parsePath(patch.path)) {\n      return false;\n    }\n\n    return true;\n  });\n  /**\n   * Extend patches with changed cells coords\n   */\n  patches = (0, _array.arrayMap)(patches, function (patch) {\n    var coords = parsePath(patch.path);\n\n    patch.row = coords.row;\n    patch.col = coords.col;\n\n    return patch;\n  });\n  /**\n   * Removing or adding column will produce one patch for each table row.\n   * Leaves only one patch for each column add/remove operation.\n   */\n  patches = (0, _array.arrayFilter)(patches, function (patch) {\n    if (['add', 'remove'].indexOf(patch.op) !== -1 && !isNaN(patch.col)) {\n      if (newOrRemovedColumns.indexOf(patch.col) !== -1) {\n        return false;\n      }\n      newOrRemovedColumns.push(patch.col);\n    }\n\n    return true;\n  });\n  newOrRemovedColumns.length = 0;\n\n  return patches;\n}\n\n/**\n * Extract coordinates from path where data was changed.\n *\n * @param {String} path Path describing where data was changed.\n * @returns {Object|null} Returns an object with `row` and `col` properties or `null` if path doesn't have necessary information.\n */\nfunction parsePath(path) {\n  var match = path.match(/^\\/(\\d+)\\/?(.*)?$/);\n\n  if (!match) {\n    return null;\n  }\n\n  var _match = _slicedToArray(match, 3),\n      row = _match[1],\n      column = _match[2];\n\n  return {\n    row: parseInt(row, 10),\n    col: /^\\d*$/.test(column) ? parseInt(column, 10) : column\n  };\n}\n\n/***/ }),\n/* 354 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _mixed = __webpack_require__(16);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar DEFAULT_SEARCH_RESULT_CLASS = 'htSearchResult';\n\nvar DEFAULT_CALLBACK = function DEFAULT_CALLBACK(instance, row, col, data, testResult) {\n  instance.getCellMeta(row, col).isSearchResult = testResult;\n};\n\nvar DEFAULT_QUERY_METHOD = function DEFAULT_QUERY_METHOD(query, value) {\n  if ((0, _mixed.isUndefined)(query) || query === null || !query.toLowerCase || query.length === 0) {\n    return false;\n  }\n  if ((0, _mixed.isUndefined)(value) || value === null) {\n    return false;\n  }\n\n  return value.toString().toLowerCase().indexOf(query.toLowerCase()) !== -1;\n};\n\n/**\n * @plugin Search\n *\n * @example\n *\n * ```js\n * ...\n *  // as boolean\n *  search: true\n *\n *  // as a object with one or more options\n *  search: {\n *    callback: myNewCallbackFunction,\n *    queryMethod: myNewQueryMethod,\n *    searchResultClass: 'customClass'\n *  }\n *\n * // Access to search plugin instance:\n * var searchPlugin = hot.getPlugin('search');\n *\n * // Set callback programmatically:\n * searchPlugin.setCallback(myNewCallbackFunction);\n * // Set query method programmatically:\n * searchPlugin.setQueryMethod(myNewQueryMethod);\n * // Set search result cells class programmatically:\n * searchPlugin.setSearchResultClass(customClass);\n * ...\n * ```\n */\n\nvar Search = function (_BasePlugin) {\n  _inherits(Search, _BasePlugin);\n\n  function Search(hotInstance) {\n    _classCallCheck(this, Search);\n\n    /**\n     * Function called during querying for each cell from the {@link DataMap}.\n     *\n     * @type {Function}\n     */\n    var _this = _possibleConstructorReturn(this, (Search.__proto__ || Object.getPrototypeOf(Search)).call(this, hotInstance));\n\n    _this.callback = DEFAULT_CALLBACK;\n    /**\n     * Query function is responsible for determining whether a query matches the value stored in a cell.\n     *\n     * @type {Function}\n     */\n    _this.queryMethod = DEFAULT_QUERY_METHOD;\n    /**\n     * Class name added to each cell that belongs to the searched query.\n     *\n     * @type {String}\n     */\n    _this.searchResultClass = DEFAULT_SEARCH_RESULT_CLASS;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(Search, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().search;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      var searchSettings = this.hot.getSettings().search;\n      this.updatePluginSettings(searchSettings);\n\n      this.addHook('beforeRenderer', function () {\n        return _this2.onBeforeRenderer.apply(_this2, arguments);\n      });\n\n      _get(Search.prototype.__proto__ || Object.getPrototypeOf(Search.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      var _this3 = this;\n\n      var beforeRendererCallback = function beforeRendererCallback() {\n        return _this3.onBeforeRenderer.apply(_this3, arguments);\n      };\n\n      this.hot.addHook('beforeRenderer', beforeRendererCallback);\n      this.hot.addHookOnce('afterRender', function () {\n        _this3.hot.removeHook('beforeRenderer', beforeRendererCallback);\n      });\n\n      _get(Search.prototype.__proto__ || Object.getPrototypeOf(Search.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(Search.prototype.__proto__ || Object.getPrototypeOf(Search.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Query method - used inside search input listener.\n     *\n     * @param {String} queryStr Searched value.\n     * @param {Function} [callback] Callback function performed on cells with values which matches to the searched query.\n     * @param {Function} [queryMethod] Query function responsible for determining whether a query matches the value stored in a cell.\n     *\n     * @returns {Array} Return array of objects with `row`, `col`, `data` properties or empty array.\n     */\n\n  }, {\n    key: 'query',\n    value: function query(queryStr) {\n      var _this4 = this;\n\n      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getCallback();\n      var queryMethod = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.getQueryMethod();\n\n      var rowCount = this.hot.countRows();\n      var colCount = this.hot.countCols();\n      var queryResult = [];\n      var instance = this.hot;\n\n      (0, _number.rangeEach)(0, rowCount - 1, function (rowIndex) {\n        (0, _number.rangeEach)(0, colCount - 1, function (colIndex) {\n          var cellData = _this4.hot.getDataAtCell(rowIndex, colIndex);\n          var cellProperties = _this4.hot.getCellMeta(rowIndex, colIndex);\n          var cellCallback = cellProperties.search.callback || callback;\n          var cellQueryMethod = cellProperties.search.queryMethod || queryMethod;\n          var testResult = cellQueryMethod(queryStr, cellData);\n\n          if (testResult) {\n            var singleResult = {\n              row: rowIndex,\n              col: colIndex,\n              data: cellData\n            };\n\n            queryResult.push(singleResult);\n          }\n\n          if (cellCallback) {\n            cellCallback(instance, rowIndex, colIndex, cellData, testResult);\n          }\n        });\n      });\n\n      return queryResult;\n    }\n  }, {\n    key: 'getCallback',\n\n\n    /**\n     * Get callback function.\n     *\n     * @returns {Function} Return the callback function.\n     */\n    value: function getCallback() {\n      return this.callback;\n    }\n\n    /**\n     * Set callback function.\n     *\n     * @param {Function} newCallback\n     */\n\n  }, {\n    key: 'setCallback',\n    value: function setCallback(newCallback) {\n      this.callback = newCallback;\n    }\n\n    /**\n     * Get queryMethod function.\n     *\n     * @returns {Function} Return the query method.\n     */\n\n  }, {\n    key: 'getQueryMethod',\n    value: function getQueryMethod() {\n      return this.queryMethod;\n    }\n\n    /**\n     * Set queryMethod function.\n     *\n     * @param {Function} newQueryMethod\n     */\n\n  }, {\n    key: 'setQueryMethod',\n    value: function setQueryMethod(newQueryMethod) {\n      this.queryMethod = newQueryMethod;\n    }\n\n    /**\n     * Get search result cells class.\n     *\n     * @returns {Function} Return the cell class.\n     */\n\n  }, {\n    key: 'getSearchResultClass',\n    value: function getSearchResultClass() {\n      return this.searchResultClass;\n    }\n\n    /**\n     * Set search result cells class.\n     *\n     * @param {String} newElementClass\n     */\n\n  }, {\n    key: 'setSearchResultClass',\n    value: function setSearchResultClass(newElementClass) {\n      this.searchResultClass = newElementClass;\n    }\n\n    /**\n     * Updates the settings of the plugin.\n     *\n     * @param {Object} searchSettings The plugin settings, taken from Handsontable configuration.\n     * @private\n     */\n\n  }, {\n    key: 'updatePluginSettings',\n    value: function updatePluginSettings(searchSettings) {\n      if ((0, _object.isObject)(searchSettings)) {\n        if (searchSettings.searchResultClass) {\n          this.setSearchResultClass(searchSettings.searchResultClass);\n        }\n\n        if (searchSettings.queryMethod) {\n          this.setQueryMethod(searchSettings.queryMethod);\n        }\n\n        if (searchSettings.callback) {\n          this.setCallback(searchSettings.callback);\n        }\n      }\n    }\n\n    /** *\n     * The `beforeRenderer` hook callback.\n     *\n     * @private\n     * @param {HTMLTableCellElement} TD The rendered `TD` element.\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {String | Number} prop Column property name or a column index, if datasource is an array of arrays.\n     * @param {String} value Value of the rendered cell.\n     * @param {Object} cellProperties Object containing the cell's properties.\n     */\n\n  }, {\n    key: 'onBeforeRenderer',\n    value: function onBeforeRenderer(TD, row, col, prop, value, cellProperties) {\n      // TODO: #4972\n      var className = cellProperties.className || [];\n      var classArray = [];\n\n      if (typeof className === 'string') {\n        classArray = className.split(' ');\n      } else {\n        var _classArray;\n\n        (_classArray = classArray).push.apply(_classArray, _toConsumableArray(className));\n      }\n\n      if (this.isEnabled() && cellProperties.isSearchResult) {\n        if (!classArray.includes(this.searchResultClass)) {\n          classArray.push('' + this.searchResultClass);\n        }\n      } else if (classArray.includes(this.searchResultClass)) {\n        classArray.splice(classArray.indexOf(this.searchResultClass), 1);\n      }\n\n      cellProperties.className = classArray.join(' ');\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(Search.prototype.__proto__ || Object.getPrototypeOf(Search.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return Search;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('search', Search);\n\nexports.default = Search;\n\n/***/ }),\n/* 355 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _feature = __webpack_require__(40);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @plugin TouchScroll\n * @class TouchScroll\n */\nvar TouchScroll = function (_BasePlugin) {\n  _inherits(TouchScroll, _BasePlugin);\n\n  function TouchScroll(hotInstance) {\n    _classCallCheck(this, TouchScroll);\n\n    /**\n     * Collection of scrollbars to update.\n     *\n     * @type {Array}\n     */\n    var _this = _possibleConstructorReturn(this, (TouchScroll.__proto__ || Object.getPrototypeOf(TouchScroll)).call(this, hotInstance));\n\n    _this.scrollbars = [];\n    /**\n     * Collection of overlays to update.\n     *\n     * @type {Array}\n     */\n    _this.clones = [];\n    /**\n     * Flag which determines if collection of overlays should be refilled on every table render.\n     *\n     * @type {Boolean}\n     * @default false\n     */\n    _this.lockedCollection = false;\n    /**\n     * Flag which determines if walkontable should freeze overlays while scrolling.\n     *\n     * @type {Boolean}\n     * @default false\n     */\n    _this.freezeOverlays = false;\n    return _this;\n  }\n\n  /**\n   * Check if plugin is enabled.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(TouchScroll, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return (0, _feature.isTouchSupported)();\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('afterRender', function () {\n        return _this2.onAfterRender();\n      });\n      this.registerEvents();\n\n      _get(TouchScroll.prototype.__proto__ || Object.getPrototypeOf(TouchScroll.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.lockedCollection = false;\n\n      _get(TouchScroll.prototype.__proto__ || Object.getPrototypeOf(TouchScroll.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(TouchScroll.prototype.__proto__ || Object.getPrototypeOf(TouchScroll.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Register all necessary events.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this3 = this;\n\n      this.addHook('beforeTouchScroll', function () {\n        return _this3.onBeforeTouchScroll();\n      });\n      this.addHook('afterMomentumScroll', function () {\n        return _this3.onAfterMomentumScroll();\n      });\n    }\n\n    /**\n     * After render listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterRender',\n    value: function onAfterRender() {\n      if (this.lockedCollection) {\n        return;\n      }\n\n      var _hot$view$wt$wtOverla = this.hot.view.wt.wtOverlays,\n          topOverlay = _hot$view$wt$wtOverla.topOverlay,\n          bottomOverlay = _hot$view$wt$wtOverla.bottomOverlay,\n          leftOverlay = _hot$view$wt$wtOverla.leftOverlay,\n          topLeftCornerOverlay = _hot$view$wt$wtOverla.topLeftCornerOverlay,\n          bottomLeftCornerOverlay = _hot$view$wt$wtOverla.bottomLeftCornerOverlay;\n\n\n      this.lockedCollection = true;\n      this.scrollbars.length = 0;\n      this.scrollbars.push(topOverlay);\n\n      if (bottomOverlay.clone) {\n        this.scrollbars.push(bottomOverlay);\n      }\n      this.scrollbars.push(leftOverlay);\n\n      if (topLeftCornerOverlay) {\n        this.scrollbars.push(topLeftCornerOverlay);\n      }\n      if (bottomLeftCornerOverlay && bottomLeftCornerOverlay.clone) {\n        this.scrollbars.push(bottomLeftCornerOverlay);\n      }\n\n      this.clones.length = 0;\n\n      if (topOverlay.needFullRender) {\n        this.clones.push(topOverlay.clone.wtTable.holder.parentNode);\n      }\n      if (bottomOverlay.needFullRender) {\n        this.clones.push(bottomOverlay.clone.wtTable.holder.parentNode);\n      }\n      if (leftOverlay.needFullRender) {\n        this.clones.push(leftOverlay.clone.wtTable.holder.parentNode);\n      }\n      if (topLeftCornerOverlay) {\n        this.clones.push(topLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      }\n      if (bottomLeftCornerOverlay && bottomLeftCornerOverlay.clone) {\n        this.clones.push(bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      }\n    }\n\n    /**\n     * Touch scroll listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onBeforeTouchScroll',\n    value: function onBeforeTouchScroll() {\n      this.freezeOverlays = true;\n\n      (0, _array.arrayEach)(this.clones, function (clone) {\n        (0, _element.addClass)(clone, 'hide-tween');\n      });\n    }\n\n    /**\n     * After momentum scroll listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterMomentumScroll',\n    value: function onAfterMomentumScroll() {\n      var _this4 = this;\n\n      this.freezeOverlays = false;\n\n      (0, _array.arrayEach)(this.clones, function (clone) {\n        (0, _element.removeClass)(clone, 'hide-tween');\n        (0, _element.addClass)(clone, 'show-tween');\n      });\n\n      setTimeout(function () {\n        (0, _array.arrayEach)(_this4.clones, function (clone) {\n          (0, _element.removeClass)(clone, 'show-tween');\n        });\n      }, 400);\n\n      (0, _array.arrayEach)(this.scrollbars, function (scrollbar) {\n        scrollbar.refresh();\n        scrollbar.resetFixedPosition();\n      });\n\n      this.hot.view.wt.wtOverlays.syncScrollWithMaster();\n    }\n  }]);\n\n  return TouchScroll;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('touchScroll', TouchScroll);\n\nexports.default = TouchScroll;\n\n/***/ }),\n/* 356 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _object = __webpack_require__(2);\n\nvar _event = __webpack_require__(12);\n\nvar _src = __webpack_require__(4);\n\nvar _utils = __webpack_require__(19);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /**\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * Handsontable UndoRedo class\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                */\n\n\n/**\n * @description\n * Handsontable UndoRedo plugin. It allows to undo and redo certain actions done in the table.\n * Please note, that not all actions are currently undo-able.\n *\n * @example\n * ```js\n * ...\n * undo: true\n * ...\n * ```\n * @class UndoRedo\n * @plugin UndoRedo\n */\nfunction UndoRedo(instance) {\n  var plugin = this;\n  this.instance = instance;\n  this.doneActions = [];\n  this.undoneActions = [];\n  this.ignoreNewActions = false;\n\n  instance.addHook('afterChange', function (changes, source) {\n    if (changes && source !== 'UndoRedo.undo' && source !== 'UndoRedo.redo' && source !== 'MergeCells') {\n      plugin.done(new UndoRedo.ChangeAction(changes));\n    }\n  });\n\n  instance.addHook('afterCreateRow', function (index, amount, source) {\n    if (source === 'UndoRedo.undo' || source === 'UndoRedo.undo' || source === 'auto') {\n      return;\n    }\n\n    var action = new UndoRedo.CreateRowAction(index, amount);\n    plugin.done(action);\n  });\n\n  instance.addHook('beforeRemoveRow', function (index, amount, logicRows, source) {\n    if (source === 'UndoRedo.undo' || source === 'UndoRedo.redo' || source === 'auto') {\n      return;\n    }\n\n    var originalData = plugin.instance.getSourceDataArray();\n\n    index = (originalData.length + index) % originalData.length;\n\n    var removedData = (0, _object.deepClone)(originalData.slice(index, index + amount));\n\n    plugin.done(new UndoRedo.RemoveRowAction(index, removedData));\n  });\n\n  instance.addHook('afterCreateCol', function (index, amount, source) {\n    if (source === 'UndoRedo.undo' || source === 'UndoRedo.redo' || source === 'auto') {\n      return;\n    }\n\n    plugin.done(new UndoRedo.CreateColumnAction(index, amount));\n  });\n\n  instance.addHook('beforeRemoveCol', function (index, amount, logicColumns, source) {\n    if (source === 'UndoRedo.undo' || source === 'UndoRedo.redo' || source === 'auto') {\n      return;\n    }\n\n    var originalData = plugin.instance.getSourceDataArray();\n\n    index = (plugin.instance.countCols() + index) % plugin.instance.countCols();\n\n    var removedData = [];\n    var headers = [];\n    var indexes = [];\n\n    (0, _number.rangeEach)(originalData.length - 1, function (i) {\n      var column = [];\n      var origRow = originalData[i];\n\n      (0, _number.rangeEach)(index, index + (amount - 1), function (j) {\n        column.push(origRow[instance.runHooks('modifyCol', j)]);\n      });\n      removedData.push(column);\n    });\n\n    (0, _number.rangeEach)(amount - 1, function (i) {\n      indexes.push(instance.runHooks('modifyCol', index + i));\n    });\n\n    if (Array.isArray(instance.getSettings().colHeaders)) {\n      (0, _number.rangeEach)(amount - 1, function (i) {\n        headers.push(instance.getSettings().colHeaders[instance.runHooks('modifyCol', index + i)] || null);\n      });\n    }\n\n    var manualColumnMovePlugin = plugin.instance.getPlugin('manualColumnMove');\n\n    var columnsMap = manualColumnMovePlugin.isEnabled() ? manualColumnMovePlugin.columnsMapper.__arrayMap : [];\n    var action = new UndoRedo.RemoveColumnAction(index, indexes, removedData, headers, columnsMap);\n\n    plugin.done(action);\n  });\n\n  instance.addHook('beforeCellAlignment', function (stateBefore, range, type, alignment) {\n    var action = new UndoRedo.CellAlignmentAction(stateBefore, range, type, alignment);\n    plugin.done(action);\n  });\n\n  instance.addHook('beforeFilter', function (conditionsStack) {\n    plugin.done(new UndoRedo.FiltersAction(conditionsStack));\n  });\n\n  instance.addHook('beforeRowMove', function (movedRows, target) {\n    if (movedRows === false) {\n      return;\n    }\n\n    plugin.done(new UndoRedo.RowMoveAction(movedRows, target));\n  });\n\n  instance.addHook('beforeMergeCells', function (cellRange, auto) {\n    if (auto) {\n      return;\n    }\n\n    plugin.done(new UndoRedo.MergeCellsAction(instance, cellRange));\n  });\n\n  instance.addHook('afterUnmergeCells', function (cellRange, auto) {\n    if (auto) {\n      return;\n    }\n\n    plugin.done(new UndoRedo.UnmergeCellsAction(instance, cellRange));\n  });\n}\n\nUndoRedo.prototype.done = function (action) {\n  if (!this.ignoreNewActions) {\n    this.doneActions.push(action);\n    this.undoneActions.length = 0;\n  }\n};\n\n/**\n * Undo last edit.\n *\n * @function undo\n * @memberof UndoRedo#\n */\nUndoRedo.prototype.undo = function () {\n  if (this.isUndoAvailable()) {\n    var action = this.doneActions.pop();\n    var actionClone = (0, _object.deepClone)(action);\n    var instance = this.instance;\n\n    var continueAction = instance.runHooks('beforeUndo', actionClone);\n\n    if (continueAction === false) {\n      return;\n    }\n\n    this.ignoreNewActions = true;\n    var that = this;\n    action.undo(this.instance, function () {\n      that.ignoreNewActions = false;\n      that.undoneActions.push(action);\n    });\n\n    instance.runHooks('afterUndo', actionClone);\n  }\n};\n\n/**\n * Redo edit (used to reverse an undo).\n *\n * @function redo\n * @memberof UndoRedo#\n */\nUndoRedo.prototype.redo = function () {\n  if (this.isRedoAvailable()) {\n    var action = this.undoneActions.pop();\n    var actionClone = (0, _object.deepClone)(action);\n    var instance = this.instance;\n\n    var continueAction = instance.runHooks('beforeRedo', actionClone);\n\n    if (continueAction === false) {\n      return;\n    }\n\n    this.ignoreNewActions = true;\n    var that = this;\n    action.redo(this.instance, function () {\n      that.ignoreNewActions = false;\n      that.doneActions.push(action);\n    });\n\n    instance.runHooks('afterRedo', actionClone);\n  }\n};\n\n/**\n * Check if undo action is available.\n *\n * @function isUndoAvailable\n * @memberof UndoRedo#\n * @return {Boolean} Return `true` if undo can be performed, `false` otherwise\n */\nUndoRedo.prototype.isUndoAvailable = function () {\n  return this.doneActions.length > 0;\n};\n\n/**\n * Check if redo action is available.\n *\n * @function isRedoAvailable\n * @memberof UndoRedo#\n * @return {Boolean} Return `true` if redo can be performed, `false` otherwise.\n */\nUndoRedo.prototype.isRedoAvailable = function () {\n  return this.undoneActions.length > 0;\n};\n\n/**\n * Clears undo history.\n *\n * @function clear\n * @memberof UndoRedo#\n */\nUndoRedo.prototype.clear = function () {\n  this.doneActions.length = 0;\n  this.undoneActions.length = 0;\n};\n\nUndoRedo.Action = function () {};\nUndoRedo.Action.prototype.undo = function () {};\nUndoRedo.Action.prototype.redo = function () {};\n\n/**\n * Change action.\n */\nUndoRedo.ChangeAction = function (changes) {\n  this.changes = changes;\n  this.actionType = 'change';\n};\n(0, _object.inherit)(UndoRedo.ChangeAction, UndoRedo.Action);\n\nUndoRedo.ChangeAction.prototype.undo = function (instance, undoneCallback) {\n  var data = (0, _object.deepClone)(this.changes),\n      emptyRowsAtTheEnd = instance.countEmptyRows(true),\n      emptyColsAtTheEnd = instance.countEmptyCols(true);\n\n  for (var i = 0, len = data.length; i < len; i++) {\n    data[i].splice(3, 1);\n  }\n\n  instance.addHookOnce('afterChange', undoneCallback);\n\n  instance.setDataAtRowProp(data, null, null, 'UndoRedo.undo');\n\n  for (var _i = 0, _len = data.length; _i < _len; _i++) {\n    if (instance.getSettings().minSpareRows && data[_i][0] + 1 + instance.getSettings().minSpareRows === instance.countRows() && emptyRowsAtTheEnd === instance.getSettings().minSpareRows) {\n\n      instance.alter('remove_row', parseInt(data[_i][0] + 1, 10), instance.getSettings().minSpareRows);\n      instance.undoRedo.doneActions.pop();\n    }\n\n    if (instance.getSettings().minSpareCols && data[_i][1] + 1 + instance.getSettings().minSpareCols === instance.countCols() && emptyColsAtTheEnd === instance.getSettings().minSpareCols) {\n\n      instance.alter('remove_col', parseInt(data[_i][1] + 1, 10), instance.getSettings().minSpareCols);\n      instance.undoRedo.doneActions.pop();\n    }\n  }\n};\nUndoRedo.ChangeAction.prototype.redo = function (instance, onFinishCallback) {\n  var data = (0, _object.deepClone)(this.changes);\n\n  for (var i = 0, len = data.length; i < len; i++) {\n    data[i].splice(2, 1);\n  }\n\n  instance.addHookOnce('afterChange', onFinishCallback);\n  instance.setDataAtRowProp(data, null, null, 'UndoRedo.redo');\n};\n\n/**\n * Create row action.\n */\nUndoRedo.CreateRowAction = function (index, amount) {\n  this.index = index;\n  this.amount = amount;\n  this.actionType = 'insert_row';\n};\n(0, _object.inherit)(UndoRedo.CreateRowAction, UndoRedo.Action);\n\nUndoRedo.CreateRowAction.prototype.undo = function (instance, undoneCallback) {\n  var rowCount = instance.countRows(),\n      minSpareRows = instance.getSettings().minSpareRows;\n\n  if (this.index >= rowCount && this.index - minSpareRows < rowCount) {\n    this.index -= minSpareRows; // work around the situation where the needed row was removed due to an 'undo' of a made change\n  }\n\n  instance.addHookOnce('afterRemoveRow', undoneCallback);\n  instance.alter('remove_row', this.index, this.amount, 'UndoRedo.undo');\n};\nUndoRedo.CreateRowAction.prototype.redo = function (instance, redoneCallback) {\n  instance.addHookOnce('afterCreateRow', redoneCallback);\n  instance.alter('insert_row', this.index, this.amount, 'UndoRedo.redo');\n};\n\n/**\n * Remove row action.\n */\nUndoRedo.RemoveRowAction = function (index, data) {\n  this.index = index;\n  this.data = data;\n  this.actionType = 'remove_row';\n};\n(0, _object.inherit)(UndoRedo.RemoveRowAction, UndoRedo.Action);\n\nUndoRedo.RemoveRowAction.prototype.undo = function (instance, undoneCallback) {\n  instance.alter('insert_row', this.index, this.data.length, 'UndoRedo.undo');\n  instance.addHookOnce('afterRender', undoneCallback);\n  instance.populateFromArray(this.index, 0, this.data, void 0, void 0, 'UndoRedo.undo');\n};\nUndoRedo.RemoveRowAction.prototype.redo = function (instance, redoneCallback) {\n  instance.addHookOnce('afterRemoveRow', redoneCallback);\n  instance.alter('remove_row', this.index, this.data.length, 'UndoRedo.redo');\n};\n\n/**\n * Create column action.\n */\nUndoRedo.CreateColumnAction = function (index, amount) {\n  this.index = index;\n  this.amount = amount;\n  this.actionType = 'insert_col';\n};\n(0, _object.inherit)(UndoRedo.CreateColumnAction, UndoRedo.Action);\n\nUndoRedo.CreateColumnAction.prototype.undo = function (instance, undoneCallback) {\n  instance.addHookOnce('afterRemoveCol', undoneCallback);\n  instance.alter('remove_col', this.index, this.amount, 'UndoRedo.undo');\n};\nUndoRedo.CreateColumnAction.prototype.redo = function (instance, redoneCallback) {\n  instance.addHookOnce('afterCreateCol', redoneCallback);\n  instance.alter('insert_col', this.index, this.amount, 'UndoRedo.redo');\n};\n\n/**\n * Remove column action.\n */\nUndoRedo.RemoveColumnAction = function (index, indexes, data, headers, columnPositions) {\n  this.index = index;\n  this.indexes = indexes;\n  this.data = data;\n  this.amount = this.data[0].length;\n  this.headers = headers;\n  this.columnPositions = columnPositions.slice(0);\n  this.actionType = 'remove_col';\n};\n(0, _object.inherit)(UndoRedo.RemoveColumnAction, UndoRedo.Action);\n\nUndoRedo.RemoveColumnAction.prototype.undo = function (instance, undoneCallback) {\n  var _this = this;\n\n  var row = void 0;\n  var ascendingIndexes = this.indexes.slice(0).sort();\n  var sortByIndexes = function sortByIndexes(elem, j, arr) {\n    return arr[_this.indexes.indexOf(ascendingIndexes[j])];\n  };\n\n  var sortedData = [];\n  (0, _number.rangeEach)(this.data.length - 1, function (i) {\n    sortedData[i] = (0, _array.arrayMap)(_this.data[i], sortByIndexes);\n  });\n\n  var sortedHeaders = [];\n  sortedHeaders = (0, _array.arrayMap)(this.headers, sortByIndexes);\n\n  var changes = [];\n\n  // TODO: Temporary hook for undo/redo mess\n  instance.runHooks('beforeCreateCol', this.indexes[0], this.indexes.length, 'UndoRedo.undo');\n\n  (0, _number.rangeEach)(this.data.length - 1, function (i) {\n    row = instance.getSourceDataAtRow(i);\n\n    (0, _number.rangeEach)(ascendingIndexes.length - 1, function (j) {\n      row.splice(ascendingIndexes[j], 0, sortedData[i][j]);\n      changes.push([i, ascendingIndexes[j], null, sortedData[i][j]]);\n    });\n  });\n\n  // TODO: Temporary hook for undo/redo mess\n  if (instance.getPlugin('formulas')) {\n    instance.getPlugin('formulas').onAfterSetDataAtCell(changes);\n  }\n\n  if (typeof this.headers !== 'undefined') {\n    (0, _number.rangeEach)(sortedHeaders.length - 1, function (j) {\n      instance.getSettings().colHeaders.splice(ascendingIndexes[j], 0, sortedHeaders[j]);\n    });\n  }\n\n  if (instance.getPlugin('manualColumnMove')) {\n    instance.getPlugin('manualColumnMove').columnsMapper.__arrayMap = this.columnPositions;\n  }\n\n  instance.addHookOnce('afterRender', undoneCallback);\n\n  // TODO: Temporary hook for undo/redo mess\n  instance.runHooks('afterCreateCol', this.indexes[0], this.indexes.length, 'UndoRedo.undo');\n\n  if (instance.getPlugin('formulas')) {\n    instance.getPlugin('formulas').recalculateFull();\n  }\n\n  instance.render();\n};\n\nUndoRedo.RemoveColumnAction.prototype.redo = function (instance, redoneCallback) {\n  instance.addHookOnce('afterRemoveCol', redoneCallback);\n  instance.alter('remove_col', this.index, this.amount, 'UndoRedo.redo');\n};\n\n/**\n * Cell alignment action.\n */\nUndoRedo.CellAlignmentAction = function (stateBefore, range, type, alignment) {\n  this.stateBefore = stateBefore;\n  this.range = range;\n  this.type = type;\n  this.alignment = alignment;\n};\nUndoRedo.CellAlignmentAction.prototype.undo = function (instance, undoneCallback) {\n  var _this2 = this;\n\n  (0, _array.arrayEach)(this.range, function (_ref) {\n    var from = _ref.from,\n        to = _ref.to;\n\n    for (var row = from.row; row <= to.row; row += 1) {\n      for (var col = from.col; col <= to.col; col += 1) {\n        instance.setCellMeta(row, col, 'className', _this2.stateBefore[row][col] || ' htLeft');\n      }\n    }\n  });\n\n  instance.addHookOnce('afterRender', undoneCallback);\n  instance.render();\n};\nUndoRedo.CellAlignmentAction.prototype.redo = function (instance, undoneCallback) {\n  (0, _utils.align)(this.range, this.type, this.alignment, function (row, col) {\n    return instance.getCellMeta(row, col);\n  }, function (row, col, key, value) {\n    return instance.setCellMeta(row, col, key, value);\n  });\n\n  instance.addHookOnce('afterRender', undoneCallback);\n  instance.render();\n};\n\n/**\n * Filters action.\n */\nUndoRedo.FiltersAction = function (conditionsStack) {\n  this.conditionsStack = conditionsStack;\n  this.actionType = 'filter';\n};\n(0, _object.inherit)(UndoRedo.FiltersAction, UndoRedo.Action);\n\nUndoRedo.FiltersAction.prototype.undo = function (instance, undoneCallback) {\n  var filters = instance.getPlugin('filters');\n\n  instance.addHookOnce('afterRender', undoneCallback);\n\n  filters.conditionCollection.importAllConditions(this.conditionsStack.slice(0, this.conditionsStack.length - 1));\n  filters.filter();\n};\nUndoRedo.FiltersAction.prototype.redo = function (instance, redoneCallback) {\n  var filters = instance.getPlugin('filters');\n\n  instance.addHookOnce('afterRender', redoneCallback);\n\n  filters.conditionCollection.importAllConditions(this.conditionsStack);\n  filters.filter();\n};\n\n/**\n * Merge Cells action.\n * @util\n */\n\nvar MergeCellsAction = function (_UndoRedo$Action) {\n  _inherits(MergeCellsAction, _UndoRedo$Action);\n\n  function MergeCellsAction(instance, cellRange) {\n    _classCallCheck(this, MergeCellsAction);\n\n    var _this3 = _possibleConstructorReturn(this, (MergeCellsAction.__proto__ || Object.getPrototypeOf(MergeCellsAction)).call(this));\n\n    _this3.cellRange = cellRange;\n    _this3.rangeData = instance.getData(cellRange.from.row, cellRange.from.col, cellRange.to.row, cellRange.to.col);\n    return _this3;\n  }\n\n  _createClass(MergeCellsAction, [{\n    key: 'undo',\n    value: function undo(instance, undoneCallback) {\n      var mergeCellsPlugin = instance.getPlugin('mergeCells');\n      instance.addHookOnce('afterRender', undoneCallback);\n\n      mergeCellsPlugin.unmergeRange(this.cellRange, true);\n      instance.populateFromArray(this.cellRange.from.row, this.cellRange.from.col, this.rangeData, void 0, void 0, 'MergeCells');\n    }\n  }, {\n    key: 'redo',\n    value: function redo(instance, redoneCallback) {\n      var mergeCellsPlugin = instance.getPlugin('mergeCells');\n      instance.addHookOnce('afterRender', redoneCallback);\n\n      mergeCellsPlugin.mergeRange(this.cellRange);\n    }\n  }]);\n\n  return MergeCellsAction;\n}(UndoRedo.Action);\n\nUndoRedo.MergeCellsAction = MergeCellsAction;\n\n/**\n * Unmerge Cells action.\n * @util\n */\n\nvar UnmergeCellsAction = function (_UndoRedo$Action2) {\n  _inherits(UnmergeCellsAction, _UndoRedo$Action2);\n\n  function UnmergeCellsAction(instance, cellRange) {\n    _classCallCheck(this, UnmergeCellsAction);\n\n    var _this4 = _possibleConstructorReturn(this, (UnmergeCellsAction.__proto__ || Object.getPrototypeOf(UnmergeCellsAction)).call(this));\n\n    _this4.cellRange = cellRange;\n    return _this4;\n  }\n\n  _createClass(UnmergeCellsAction, [{\n    key: 'undo',\n    value: function undo(instance, undoneCallback) {\n      var mergeCellsPlugin = instance.getPlugin('mergeCells');\n      instance.addHookOnce('afterRender', undoneCallback);\n\n      mergeCellsPlugin.mergeRange(this.cellRange, true);\n    }\n  }, {\n    key: 'redo',\n    value: function redo(instance, redoneCallback) {\n      var mergeCellsPlugin = instance.getPlugin('mergeCells');\n      instance.addHookOnce('afterRender', redoneCallback);\n\n      mergeCellsPlugin.unmergeRange(this.cellRange, true);\n      instance.render();\n    }\n  }]);\n\n  return UnmergeCellsAction;\n}(UndoRedo.Action);\n\nUndoRedo.UnmergeCellsAction = UnmergeCellsAction;\n\n/**\n * ManualRowMove action.\n * @TODO: removeRow undo should works on logical index\n */\nUndoRedo.RowMoveAction = function (movedRows, target) {\n  this.rows = movedRows.slice();\n  this.target = target;\n};\n(0, _object.inherit)(UndoRedo.RowMoveAction, UndoRedo.Action);\n\nUndoRedo.RowMoveAction.prototype.undo = function (instance, undoneCallback) {\n  var manualRowMove = instance.getPlugin('manualRowMove');\n\n  instance.addHookOnce('afterRender', undoneCallback);\n\n  var mod = this.rows[0] < this.target ? -1 * this.rows.length : 0;\n  var newTarget = this.rows[0] > this.target ? this.rows[0] + this.rows.length : this.rows[0];\n  var newRows = [];\n  var rowsLen = this.rows.length + mod;\n\n  for (var i = mod; i < rowsLen; i += 1) {\n    newRows.push(this.target + i);\n  }\n\n  manualRowMove.moveRows(newRows.slice(), newTarget);\n  instance.render();\n\n  instance.selectCell(this.rows[0], 0, this.rows[this.rows.length - 1], instance.countCols() - 1, false, false);\n};\nUndoRedo.RowMoveAction.prototype.redo = function (instance, redoneCallback) {\n  var manualRowMove = instance.getPlugin('manualRowMove');\n\n  instance.addHookOnce('afterRender', redoneCallback);\n  manualRowMove.moveRows(this.rows.slice(), this.target);\n  instance.render();\n  var startSelection = this.rows[0] < this.target ? this.target - this.rows.length : this.target;\n\n  instance.selectCell(startSelection, 0, startSelection + this.rows.length - 1, instance.countCols() - 1, false, false);\n};\n\nfunction init() {\n  var instance = this;\n  var pluginEnabled = typeof instance.getSettings().undo == 'undefined' || instance.getSettings().undo;\n\n  if (pluginEnabled) {\n    if (!instance.undoRedo) {\n      /**\n       * Instance of Handsontable.UndoRedo Plugin {@link Handsontable.UndoRedo}\n       *\n       * @alias undoRedo\n       * @memberof! Handsontable.Core#\n       * @type {UndoRedo}\n       */\n      instance.undoRedo = new UndoRedo(instance);\n\n      exposeUndoRedoMethods(instance);\n\n      instance.addHook('beforeKeyDown', onBeforeKeyDown);\n      instance.addHook('afterChange', onAfterChange);\n    }\n  } else if (instance.undoRedo) {\n    delete instance.undoRedo;\n\n    removeExposedUndoRedoMethods(instance);\n\n    instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n    instance.removeHook('afterChange', onAfterChange);\n  }\n}\n\nfunction onBeforeKeyDown(event) {\n  var instance = this;\n\n  var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey;\n\n  if (ctrlDown) {\n    if (event.keyCode === 89 || event.shiftKey && event.keyCode === 90) {\n      // CTRL + Y or CTRL + SHIFT + Z\n      instance.undoRedo.redo();\n      (0, _event.stopImmediatePropagation)(event);\n    } else if (event.keyCode === 90) {\n      // CTRL + Z\n      instance.undoRedo.undo();\n      (0, _event.stopImmediatePropagation)(event);\n    }\n  }\n}\n\nfunction onAfterChange(changes, source) {\n  var instance = this;\n  if (source === 'loadData') {\n    return instance.undoRedo.clear();\n  }\n}\n\nfunction exposeUndoRedoMethods(instance) {\n  /**\n   * {@link UndoRedo#undo}\n   * @alias undo\n   * @memberof! Handsontable.Core#\n   */\n  instance.undo = function () {\n    return instance.undoRedo.undo();\n  };\n\n  /**\n   * {@link UndoRedo#redo}\n   * @alias redo\n   * @memberof! Handsontable.Core#\n   */\n  instance.redo = function () {\n    return instance.undoRedo.redo();\n  };\n\n  /**\n   * {@link UndoRedo#isUndoAvailable}\n   * @alias isUndoAvailable\n   * @memberof! Handsontable.Core#\n   */\n  instance.isUndoAvailable = function () {\n    return instance.undoRedo.isUndoAvailable();\n  };\n\n  /**\n   * {@link UndoRedo#isRedoAvailable}\n   * @alias isRedoAvailable\n   * @memberof! Handsontable.Core#\n   */\n  instance.isRedoAvailable = function () {\n    return instance.undoRedo.isRedoAvailable();\n  };\n\n  /**\n   * {@link UndoRedo#clear}\n   * @alias clearUndo\n   * @memberof! Handsontable.Core#\n   */\n  instance.clearUndo = function () {\n    return instance.undoRedo.clear();\n  };\n}\n\nfunction removeExposedUndoRedoMethods(instance) {\n  delete instance.undo;\n  delete instance.redo;\n  delete instance.isUndoAvailable;\n  delete instance.isRedoAvailable;\n  delete instance.clearUndo;\n}\n\nvar hook = _pluginHooks2.default.getSingleton();\n\nhook.add('afterInit', init);\nhook.add('afterUpdateSettings', init);\n\nhook.register('beforeUndo');\nhook.register('afterUndo');\nhook.register('beforeRedo');\nhook.register('afterRedo');\n\nexports.default = UndoRedo;\n\n/***/ })\n/******/ ])[\"default\"];\n});\n//# sourceMappingURL=handsontable.js.map"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/dist/languages/all.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 8);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Switzerland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-CH'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Grösser als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Grösser gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Ausserhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Germany language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-DE'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Größer als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Größer gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Außerhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 15, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for English - United States language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'en-US'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Insert row above'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Insert row below'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Insert column left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Insert column right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Remove row', 'Remove rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Remove column', 'Remove columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Undo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Redo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Read only'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Clear column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alignment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Center'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justify'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Middle'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Freeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Unfreeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Borders'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Remove border(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Add comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edit comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Delete comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Read-only comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Merge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Unmerge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copy'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Cut'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Insert child row'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Detach from parent'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Hide column', 'Hide columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Show column', 'Show columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Hide row', 'Hide rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Show row', 'Show rows']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'None'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Is empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Is not empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Is equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Is not equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Begins with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Ends with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contains'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Does not contain'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Greater than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Greater than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Less than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Less than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Is between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Is not between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'After'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Before'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Today'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Tomorrow'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Yesterday'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Blank cells'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filter by condition'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filter by value'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'And'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Or'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Select all'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Clear'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancel'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Search'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Value'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Second value'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: hand-dot\n                                                                                                                                                                                                                   * Last updated: Jan 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Japanese - Japan language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ja-JP'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, '行を上に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, '行を下に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, '列を左に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, '列を右に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['行を削除', '行を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['列を削除', '列を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, '元に戻す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'やり直し'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, '読み取り専用'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, '列をクリア'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, '配置'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, '左揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, '中央揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, '右揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, '両端揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, '上揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, '中央揃え(垂直)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, '下揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, '列を固定'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, '列の固定を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, '枠線'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, '上'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, '右'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, '下'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, '左'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, '枠線を削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'コメントを追加'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'コメントを編集'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'コメントを削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, '読み取り専用コメント'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'セルを結合'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'セルの結合を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'コピー'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, '切り取り'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, '子の行を挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, '親の行と切り離す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['列を非表示', '列を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['列を表示', '列を表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['行を非表示', '行を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['行を表示', '行を表示']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'なし'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, '空白'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, '空白ではない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, '次と等しい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, '次と等しくない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, '次で始まる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, '次で終わる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, '次を含む'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, '次を含まない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, '次より大きい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, '以上'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, '次より小さい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, '以下'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, '次の間にある'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, '次の間にない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, '次より後の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, '次より前の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, '今日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, '明日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, '昨日'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, '空白のセル'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, '条件でフィルタ'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, '値でフィルタ'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'かつ'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'もしくは'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'すべて選択'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'クリア'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'キャンセル'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, '検索'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, '値'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, '値2'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 17, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Polish - Poland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pl-PL'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Wstaw wiersz powyżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Wstaw wiersz poniżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Wstaw kolumnę z lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Wstaw kolumnę z prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Usuń wiersz', 'Usuń wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Usuń kolumnę', 'Usuń kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Cofnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Ponów'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Wyczyść kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Wyrównanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Do lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Do środka'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Do prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Wyjustuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Do góry'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Wyśrodkuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Do dołu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Zablokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Odblokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Obramowanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Krawędź górna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Krawędź prawa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Krawędź dolna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Krawędź lewa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Usuń obramowanie(a)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Dodaj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edytuj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Usuń komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Komentarz tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Scal komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Rozdziel komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopiuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Wytnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Wstaw wiersz podrzędny'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Odłącz od nadrzędnego'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ukryj kolumnę', 'Ukryj kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Pokaż kolumnę', 'Pokaż kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ukryj wiersz', 'Ukryj wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Pokaż wiersz', 'Pokaż wiersze']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Brak'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Komórka jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Komórka nie jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Jest równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Jest różne od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Tekst zaczyna się od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Tekst kończy się na'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Tekst zawiera fragment'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Tekst nie zawiera fragmentu'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Większe niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Większe lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Mniejsze niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Mniejsze lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Nie jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Data późniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Data wcześniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Dzisiaj'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Jutro'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Wczoraj'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Puste miejsca'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtruj wg warunku'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtruj wg wartości'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Oraz'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Lub'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Zaznacz wszystko'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Wyczyść'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Anuluj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Szukaj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wartość'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Druga wartość'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Júlio C. Zuppa\n                                                                                                                                                                                                                   * Last updated: Jan 12, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Portuguese - Brazil language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pt-BR'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Inserir linha acima'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Inserir linha abaixo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Inserir coluna esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Inserir coluna direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Excluir linha', 'Excluir linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Excluir coluna', 'Excluir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Desfazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Refazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Limpar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alinhamento'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Centralizado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justificado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Meio'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Congelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Descongelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Bordas'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Excluir bordas(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Incluir comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Editar comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Remover comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Comentário somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Mesclar células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Desfazer mesclagem de células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copiar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Recortar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Inserir linha filha'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Desanexar da linha pai'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ocultar coluna', 'Ocultar colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Exibir coluna', 'Exibir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ocultar linha', 'Ocultar linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Exibir linha', 'Exibir linhas']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Nenhum'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'É vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Não é vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'É igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'É diferente de'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Começa com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Termina com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Não contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Maior que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Menor que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Não está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Depois'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Antes'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Hoje'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Amanhã'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Ontem'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Células vazias'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtrar por condição'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtrar por valor'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'E'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Ou'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Selecionar tudo'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Limpar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancelar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Localizar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Valor'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Segundo valor'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Alexey Rogachev\n                                                                                                                                                                                                                   * Last updated: Feb 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Russian - Russia language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ru-RU'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Вставить строку выше'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Вставить строку ниже'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Вставить столбец слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Вставить столбец справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Удалить строку', 'Удалить строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Удалить столбец', 'Удалить столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Отменить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Повторить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Очистить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Выравнивание'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'По левому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'По правому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'По ширине'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'По верхнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'По нижнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Закрепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Открепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Границы'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Сверху'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Снизу'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Удалить границу(ы)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Добавить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Редактировать комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Удалить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Комментарий только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Объединить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Разделить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Копировать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Вырезать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Вставить дочернюю строку'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Отделить от родителя'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Скрыть столбец', 'Скрыть столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Показать столбец', 'Показать столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Скрыть строку', 'Скрыть строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Показать строку', 'Показать строки']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Отсутствует'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Не пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Не равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Начинается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Заканчивается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Не содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Больше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Больше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Меньше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Меньше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Не между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'После'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'До'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Сегодня'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Завтра'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Вчера'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Пустые ячейки'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Фильтр по условию'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Фильтр по значению'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'И'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Или'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Выбрать все'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Убрать'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Отмена'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Поиск'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Значение'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Второе значение'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.ruRU = exports.ptBR = exports.plPL = exports.jaJP = exports.enUS = exports.deDE = exports.deCH = undefined;\n\nvar _deCH = __webpack_require__(1);\n\nvar _deCH2 = _interopRequireDefault(_deCH);\n\nvar _deDE = __webpack_require__(2);\n\nvar _deDE2 = _interopRequireDefault(_deDE);\n\nvar _enUS = __webpack_require__(3);\n\nvar _enUS2 = _interopRequireDefault(_enUS);\n\nvar _jaJP = __webpack_require__(4);\n\nvar _jaJP2 = _interopRequireDefault(_jaJP);\n\nvar _plPL = __webpack_require__(5);\n\nvar _plPL2 = _interopRequireDefault(_plPL);\n\nvar _ptBR = __webpack_require__(6);\n\nvar _ptBR2 = _interopRequireDefault(_ptBR);\n\nvar _ruRU = __webpack_require__(7);\n\nvar _ruRU2 = _interopRequireDefault(_ruRU);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.deCH = _deCH2.default;\nexports.deDE = _deDE2.default;\nexports.enUS = _enUS2.default;\nexports.jaJP = _jaJP2.default;\nexports.plPL = _plPL2.default;\nexports.ptBR = _ptBR2.default;\nexports.ruRU = _ruRU2.default; /* eslint-disable import/prefer-default-export */\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/dist/languages/de-CH.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 1);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Switzerland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-CH'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Grösser als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Grösser gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Ausserhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/dist/languages/de-DE.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 2);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */,\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Germany language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-DE'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Größer als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Größer gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Außerhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/dist/languages/en-US.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 3);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */,\n/* 2 */,\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 15, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for English - United States language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'en-US'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Insert row above'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Insert row below'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Insert column left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Insert column right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Remove row', 'Remove rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Remove column', 'Remove columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Undo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Redo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Read only'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Clear column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alignment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Center'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justify'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Middle'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Freeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Unfreeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Borders'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Remove border(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Add comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edit comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Delete comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Read-only comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Merge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Unmerge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copy'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Cut'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Insert child row'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Detach from parent'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Hide column', 'Hide columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Show column', 'Show columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Hide row', 'Hide rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Show row', 'Show rows']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'None'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Is empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Is not empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Is equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Is not equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Begins with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Ends with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contains'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Does not contain'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Greater than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Greater than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Less than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Less than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Is between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Is not between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'After'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Before'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Today'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Tomorrow'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Yesterday'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Blank cells'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filter by condition'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filter by value'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'And'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Or'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Select all'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Clear'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancel'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Search'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Value'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Second value'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/dist/languages/ja-JP.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 4);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */,\n/* 2 */,\n/* 3 */,\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: hand-dot\n                                                                                                                                                                                                                   * Last updated: Jan 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Japanese - Japan language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ja-JP'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, '行を上に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, '行を下に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, '列を左に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, '列を右に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['行を削除', '行を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['列を削除', '列を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, '元に戻す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'やり直し'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, '読み取り専用'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, '列をクリア'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, '配置'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, '左揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, '中央揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, '右揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, '両端揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, '上揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, '中央揃え(垂直)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, '下揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, '列を固定'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, '列の固定を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, '枠線'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, '上'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, '右'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, '下'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, '左'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, '枠線を削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'コメントを追加'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'コメントを編集'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'コメントを削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, '読み取り専用コメント'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'セルを結合'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'セルの結合を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'コピー'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, '切り取り'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, '子の行を挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, '親の行と切り離す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['列を非表示', '列を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['列を表示', '列を表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['行を非表示', '行を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['行を表示', '行を表示']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'なし'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, '空白'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, '空白ではない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, '次と等しい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, '次と等しくない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, '次で始まる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, '次で終わる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, '次を含む'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, '次を含まない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, '次より大きい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, '以上'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, '次より小さい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, '以下'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, '次の間にある'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, '次の間にない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, '次より後の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, '次より前の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, '今日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, '明日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, '昨日'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, '空白のセル'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, '条件でフィルタ'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, '値でフィルタ'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'かつ'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'もしくは'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'すべて選択'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'クリア'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'キャンセル'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, '検索'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, '値'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, '値2'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/dist/languages/pl-PL.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 5);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n\n/***/ 5:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 17, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Polish - Poland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pl-PL'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Wstaw wiersz powyżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Wstaw wiersz poniżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Wstaw kolumnę z lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Wstaw kolumnę z prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Usuń wiersz', 'Usuń wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Usuń kolumnę', 'Usuń kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Cofnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Ponów'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Wyczyść kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Wyrównanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Do lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Do środka'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Do prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Wyjustuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Do góry'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Wyśrodkuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Do dołu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Zablokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Odblokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Obramowanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Krawędź górna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Krawędź prawa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Krawędź dolna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Krawędź lewa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Usuń obramowanie(a)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Dodaj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edytuj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Usuń komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Komentarz tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Scal komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Rozdziel komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopiuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Wytnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Wstaw wiersz podrzędny'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Odłącz od nadrzędnego'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ukryj kolumnę', 'Ukryj kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Pokaż kolumnę', 'Pokaż kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ukryj wiersz', 'Ukryj wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Pokaż wiersz', 'Pokaż wiersze']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Brak'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Komórka jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Komórka nie jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Jest równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Jest różne od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Tekst zaczyna się od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Tekst kończy się na'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Tekst zawiera fragment'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Tekst nie zawiera fragmentu'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Większe niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Większe lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Mniejsze niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Mniejsze lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Nie jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Data późniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Data wcześniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Dzisiaj'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Jutro'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Wczoraj'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Puste miejsca'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtruj wg warunku'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtruj wg wartości'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Oraz'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Lub'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Zaznacz wszystko'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Wyczyść'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Anuluj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Szukaj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wartość'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Druga wartość'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n\n/******/ })[\"___\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/dist/languages/pt-BR.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 6);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n\n/***/ 6:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Júlio C. Zuppa\n                                                                                                                                                                                                                   * Last updated: Jan 12, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Portuguese - Brazil language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pt-BR'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Inserir linha acima'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Inserir linha abaixo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Inserir coluna esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Inserir coluna direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Excluir linha', 'Excluir linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Excluir coluna', 'Excluir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Desfazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Refazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Limpar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alinhamento'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Centralizado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justificado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Meio'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Congelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Descongelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Bordas'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Excluir bordas(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Incluir comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Editar comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Remover comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Comentário somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Mesclar células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Desfazer mesclagem de células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copiar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Recortar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Inserir linha filha'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Desanexar da linha pai'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ocultar coluna', 'Ocultar colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Exibir coluna', 'Exibir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ocultar linha', 'Ocultar linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Exibir linha', 'Exibir linhas']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Nenhum'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'É vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Não é vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'É igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'É diferente de'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Começa com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Termina com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Não contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Maior que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Menor que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Não está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Depois'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Antes'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Hoje'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Amanhã'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Ontem'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Células vazias'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtrar por condição'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtrar por valor'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'E'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Ou'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Selecionar tudo'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Limpar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancelar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Localizar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Valor'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Segundo valor'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n\n/******/ })[\"___\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/dist/languages/ru-RU.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 7);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n\n/***/ 7:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Alexey Rogachev\n                                                                                                                                                                                                                   * Last updated: Feb 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Russian - Russia language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ru-RU'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Вставить строку выше'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Вставить строку ниже'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Вставить столбец слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Вставить столбец справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Удалить строку', 'Удалить строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Удалить столбец', 'Удалить столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Отменить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Повторить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Очистить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Выравнивание'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'По левому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'По правому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'По ширине'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'По верхнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'По нижнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Закрепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Открепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Границы'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Сверху'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Снизу'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Удалить границу(ы)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Добавить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Редактировать комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Удалить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Комментарий только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Объединить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Разделить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Копировать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Вырезать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Вставить дочернюю строку'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Отделить от родителя'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Скрыть столбец', 'Скрыть столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Показать столбец', 'Показать столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Скрыть строку', 'Скрыть строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Показать строку', 'Показать строки']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Отсутствует'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Не пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Не равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Начинается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Заканчивается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Не содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Больше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Больше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Меньше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Меньше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Не между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'После'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'До'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Сегодня'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Завтра'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Вчера'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Пустые ячейки'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Фильтр по условию'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Фильтр по значению'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'И'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Или'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Выбрать все'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Убрать'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Отмена'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Поиск'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Значение'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Второе значение'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n\n/******/ })[\"___\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/dist/pikaday/LICENSE",
    "content": "Copyright (c) 2014 David Bushell BSD & MIT license\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 David Bushell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\nThe BSD License\n\nCopyright (c) 2014 David Bushell\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. 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.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT HOLDER 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."
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/dist/pikaday/pikaday.css",
    "content": "@charset \"UTF-8\";\n\n/*!\n * Pikaday\n * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/\n */\n\n.pika-single {\n    z-index: 9999;\n    display: block;\n    position: relative;\n    color: #333;\n    background: #fff;\n    border: 1px solid #ccc;\n    border-bottom-color: #bbb;\n    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\n/*\nclear child float (pika-lendar), using the famous micro clearfix hack\nhttp://nicolasgallagher.com/micro-clearfix-hack/\n*/\n.pika-single:before,\n.pika-single:after {\n    content: \" \";\n    display: table;\n}\n.pika-single:after { clear: both }\n.pika-single { *zoom: 1 }\n\n.pika-single.is-hidden {\n    display: none;\n}\n\n.pika-single.is-bound {\n    position: absolute;\n    box-shadow: 0 5px 15px -5px rgba(0,0,0,.5);\n}\n\n.pika-lendar {\n    float: left;\n    width: 240px;\n    margin: 8px;\n}\n\n.pika-title {\n    position: relative;\n    text-align: center;\n}\n\n.pika-label {\n    display: inline-block;\n    *display: inline;\n    position: relative;\n    z-index: 9999;\n    overflow: hidden;\n    margin: 0;\n    padding: 5px 3px;\n    font-size: 14px;\n    line-height: 20px;\n    font-weight: bold;\n    background-color: #fff;\n}\n.pika-title select {\n    cursor: pointer;\n    position: absolute;\n    z-index: 9998;\n    margin: 0;\n    left: 0;\n    top: 5px;\n    filter: alpha(opacity=0);\n    opacity: 0;\n}\n\n.pika-prev,\n.pika-next {\n    display: block;\n    cursor: pointer;\n    position: relative;\n    outline: none;\n    border: 0;\n    padding: 0;\n    width: 20px;\n    height: 30px;\n    /* hide text using text-indent trick, using width value (it's enough) */\n    text-indent: 20px;\n    white-space: nowrap;\n    overflow: hidden;\n    background-color: transparent;\n    background-position: center center;\n    background-repeat: no-repeat;\n    background-size: 75% 75%;\n    opacity: .5;\n    *position: absolute;\n    *top: 0;\n}\n\n.pika-prev:hover,\n.pika-next:hover {\n    opacity: 1;\n}\n\n.pika-prev,\n.is-rtl .pika-next {\n    float: left;\n    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==');\n    *left: 0;\n}\n\n.pika-next,\n.is-rtl .pika-prev {\n    float: right;\n    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=');\n    *right: 0;\n}\n\n.pika-prev.is-disabled,\n.pika-next.is-disabled {\n    cursor: default;\n    opacity: .2;\n}\n\n.pika-select {\n    display: inline-block;\n    *display: inline;\n}\n\n.pika-table {\n    width: 100%;\n    border-collapse: collapse;\n    border-spacing: 0;\n    border: 0;\n}\n\n.pika-table th,\n.pika-table td {\n    width: 14.285714285714286%;\n    padding: 0;\n}\n\n.pika-table th {\n    color: #999;\n    font-size: 12px;\n    line-height: 25px;\n    font-weight: bold;\n    text-align: center;\n}\n\n.pika-button {\n    cursor: pointer;\n    display: block;\n    box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    outline: none;\n    border: 0;\n    margin: 0;\n    width: 100%;\n    padding: 5px;\n    color: #666;\n    font-size: 12px;\n    line-height: 15px;\n    text-align: right;\n    background: #f5f5f5;\n}\n\n.pika-week {\n    font-size: 11px;\n    color: #999;\n}\n\n.is-today .pika-button {\n    color: #33aaff;\n    font-weight: bold;\n}\n\n.is-selected .pika-button {\n    color: #fff;\n    font-weight: bold;\n    background: #33aaff;\n    box-shadow: inset 0 1px 3px #178fe5;\n    border-radius: 3px;\n}\n\n.is-inrange .pika-button {\n    background: #D5E9F7;\n}\n\n.is-startrange .pika-button {\n    color: #fff;\n    background: #6CB31D;\n    box-shadow: none;\n    border-radius: 3px;\n}\n\n.is-endrange .pika-button {\n    color: #fff;\n    background: #33aaff;\n    box-shadow: none;\n    border-radius: 3px;\n}\n\n.is-disabled .pika-button,\n.is-outside-current-month .pika-button {\n    pointer-events: none;\n    cursor: default;\n    color: #999;\n    opacity: .3;\n}\n\n.pika-button:hover {\n    color: #fff;\n    background: #ff8000;\n    box-shadow: none;\n    border-radius: 3px;\n}\n\n/* styling for abbr */\n.pika-table abbr {\n    border-bottom: none;\n    cursor: help;\n}\n\n"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/dist/pikaday/pikaday.js",
    "content": "/*!\n * Pikaday\n *\n * Copyright © 2014 David Bushell | BSD & MIT license | https://github.com/dbushell/Pikaday\n */\n\n(function (root, factory)\n{\n    'use strict';\n\n    var moment;\n    if (typeof exports === 'object') {\n        // CommonJS module\n        // Load moment.js as an optional dependency\n        try { moment = require('moment'); } catch (e) {}\n        module.exports = factory(moment);\n    } else if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(function (req)\n        {\n            // Load moment.js as an optional dependency\n            var id = 'moment';\n            try { moment = req(id); } catch (e) {}\n            return factory(moment);\n        });\n    } else {\n        root.Pikaday = factory(root.moment);\n    }\n}(this, function (moment)\n{\n    'use strict';\n\n    /**\n     * feature detection and helper functions\n     */\n    var hasMoment = typeof moment === 'function',\n\n    hasEventListeners = !!window.addEventListener,\n\n    document = window.document,\n\n    sto = window.setTimeout,\n\n    addEvent = function(el, e, callback, capture)\n    {\n        if (hasEventListeners) {\n            el.addEventListener(e, callback, !!capture);\n        } else {\n            el.attachEvent('on' + e, callback);\n        }\n    },\n\n    removeEvent = function(el, e, callback, capture)\n    {\n        if (hasEventListeners) {\n            el.removeEventListener(e, callback, !!capture);\n        } else {\n            el.detachEvent('on' + e, callback);\n        }\n    },\n\n    fireEvent = function(el, eventName, data)\n    {\n        var ev;\n\n        if (document.createEvent) {\n            ev = document.createEvent('HTMLEvents');\n            ev.initEvent(eventName, true, false);\n            ev = extend(ev, data);\n            el.dispatchEvent(ev);\n        } else if (document.createEventObject) {\n            ev = document.createEventObject();\n            ev = extend(ev, data);\n            el.fireEvent('on' + eventName, ev);\n        }\n    },\n\n    trim = function(str)\n    {\n        return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g,'');\n    },\n\n    hasClass = function(el, cn)\n    {\n        return (' ' + el.className + ' ').indexOf(' ' + cn + ' ') !== -1;\n    },\n\n    addClass = function(el, cn)\n    {\n        if (!hasClass(el, cn)) {\n            el.className = (el.className === '') ? cn : el.className + ' ' + cn;\n        }\n    },\n\n    removeClass = function(el, cn)\n    {\n        el.className = trim((' ' + el.className + ' ').replace(' ' + cn + ' ', ' '));\n    },\n\n    isArray = function(obj)\n    {\n        return (/Array/).test(Object.prototype.toString.call(obj));\n    },\n\n    isDate = function(obj)\n    {\n        return (/Date/).test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime());\n    },\n\n    isWeekend = function(date)\n    {\n        var day = date.getDay();\n        return day === 0 || day === 6;\n    },\n\n    isLeapYear = function(year)\n    {\n        // solution by Matti Virkkunen: http://stackoverflow.com/a/4881951\n        return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;\n    },\n\n    getDaysInMonth = function(year, month)\n    {\n        return [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n    },\n\n    setToStartOfDay = function(date)\n    {\n        if (isDate(date)) date.setHours(0,0,0,0);\n    },\n\n    compareDates = function(a,b)\n    {\n        // weak date comparison (use setToStartOfDay(date) to ensure correct result)\n        return a.getTime() === b.getTime();\n    },\n\n    extend = function(to, from, overwrite)\n    {\n        var prop, hasProp;\n        for (prop in from) {\n            hasProp = to[prop] !== undefined;\n            if (hasProp && typeof from[prop] === 'object' && from[prop] !== null && from[prop].nodeName === undefined) {\n                if (isDate(from[prop])) {\n                    if (overwrite) {\n                        to[prop] = new Date(from[prop].getTime());\n                    }\n                }\n                else if (isArray(from[prop])) {\n                    if (overwrite) {\n                        to[prop] = from[prop].slice(0);\n                    }\n                } else {\n                    to[prop] = extend({}, from[prop], overwrite);\n                }\n            } else if (overwrite || !hasProp) {\n                to[prop] = from[prop];\n            }\n        }\n        return to;\n    },\n\n    adjustCalendar = function(calendar) {\n        if (calendar.month < 0) {\n            calendar.year -= Math.ceil(Math.abs(calendar.month)/12);\n            calendar.month += 12;\n        }\n        if (calendar.month > 11) {\n            calendar.year += Math.floor(Math.abs(calendar.month)/12);\n            calendar.month -= 12;\n        }\n        return calendar;\n    },\n\n    /**\n     * defaults and localisation\n     */\n    defaults = {\n\n        // bind the picker to a form field\n        field: null,\n\n        // automatically show/hide the picker on `field` focus (default `true` if `field` is set)\n        bound: undefined,\n\n        // position of the datepicker, relative to the field (default to bottom & left)\n        // ('bottom' & 'left' keywords are not used, 'top' & 'right' are modifier on the bottom/left position)\n        position: 'bottom left',\n\n        // automatically fit in the viewport even if it means repositioning from the position option\n        reposition: true,\n\n        // the default output format for `.toString()` and `field` value\n        format: 'YYYY-MM-DD',\n\n        // the initial date to view when first opened\n        defaultDate: null,\n\n        // make the `defaultDate` the initial selected value\n        setDefaultDate: false,\n\n        // first day of week (0: Sunday, 1: Monday etc)\n        firstDay: 0,\n\n        // the default flag for moment's strict date parsing\n        formatStrict: false,\n\n        // the minimum/earliest date that can be selected\n        minDate: null,\n        // the maximum/latest date that can be selected\n        maxDate: null,\n\n        // number of years either side, or array of upper/lower range\n        yearRange: 10,\n\n        // show week numbers at head of row\n        showWeekNumber: false,\n\n        // used internally (don't config outside)\n        minYear: 0,\n        maxYear: 9999,\n        minMonth: undefined,\n        maxMonth: undefined,\n\n        startRange: null,\n        endRange: null,\n\n        isRTL: false,\n\n        // Additional text to append to the year in the calendar title\n        yearSuffix: '',\n\n        // Render the month after year in the calendar title\n        showMonthAfterYear: false,\n\n        // Render days of the calendar grid that fall in the next or previous month\n        showDaysInNextAndPreviousMonths: false,\n\n        // how many months are visible\n        numberOfMonths: 1,\n\n        // when numberOfMonths is used, this will help you to choose where the main calendar will be (default `left`, can be set to `right`)\n        // only used for the first display or when a selected date is not visible\n        mainCalendar: 'left',\n\n        // Specify a DOM element to render the calendar in\n        container: undefined,\n\n        // internationalization\n        i18n: {\n            previousMonth : 'Previous Month',\n            nextMonth     : 'Next Month',\n            months        : ['January','February','March','April','May','June','July','August','September','October','November','December'],\n            weekdays      : ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],\n            weekdaysShort : ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']\n        },\n\n        // Theme Classname\n        theme: null,\n\n        // callback function\n        onSelect: null,\n        onOpen: null,\n        onClose: null,\n        onDraw: null\n    },\n\n\n    /**\n     * templating functions to abstract HTML rendering\n     */\n    renderDayName = function(opts, day, abbr)\n    {\n        day += opts.firstDay;\n        while (day >= 7) {\n            day -= 7;\n        }\n        return abbr ? opts.i18n.weekdaysShort[day] : opts.i18n.weekdays[day];\n    },\n\n    renderDay = function(opts)\n    {\n        var arr = [];\n        var ariaSelected = 'false';\n        if (opts.isEmpty) {\n            if (opts.showDaysInNextAndPreviousMonths) {\n                arr.push('is-outside-current-month');\n            } else {\n                return '<td class=\"is-empty\"></td>';\n            }\n        }\n        if (opts.isDisabled) {\n            arr.push('is-disabled');\n        }\n        if (opts.isToday) {\n            arr.push('is-today');\n        }\n        if (opts.isSelected) {\n            arr.push('is-selected');\n            ariaSelected = 'true';\n        }\n        if (opts.isInRange) {\n            arr.push('is-inrange');\n        }\n        if (opts.isStartRange) {\n            arr.push('is-startrange');\n        }\n        if (opts.isEndRange) {\n            arr.push('is-endrange');\n        }\n        return '<td data-day=\"' + opts.day + '\" class=\"' + arr.join(' ') + '\" aria-selected=\"' + ariaSelected + '\">' +\n                 '<button class=\"pika-button pika-day\" type=\"button\" ' +\n                    'data-pika-year=\"' + opts.year + '\" data-pika-month=\"' + opts.month + '\" data-pika-day=\"' + opts.day + '\">' +\n                        opts.day +\n                 '</button>' +\n               '</td>';\n    },\n\n    renderWeek = function (d, m, y) {\n        // Lifted from http://javascript.about.com/library/blweekyear.htm, lightly modified.\n        var onejan = new Date(y, 0, 1),\n            weekNum = Math.ceil((((new Date(y, m, d) - onejan) / 86400000) + onejan.getDay()+1)/7);\n        return '<td class=\"pika-week\">' + weekNum + '</td>';\n    },\n\n    renderRow = function(days, isRTL)\n    {\n        return '<tr>' + (isRTL ? days.reverse() : days).join('') + '</tr>';\n    },\n\n    renderBody = function(rows)\n    {\n        return '<tbody>' + rows.join('') + '</tbody>';\n    },\n\n    renderHead = function(opts)\n    {\n        var i, arr = [];\n        if (opts.showWeekNumber) {\n            arr.push('<th></th>');\n        }\n        for (i = 0; i < 7; i++) {\n            arr.push('<th scope=\"col\"><abbr title=\"' + renderDayName(opts, i) + '\">' + renderDayName(opts, i, true) + '</abbr></th>');\n        }\n        return '<thead><tr>' + (opts.isRTL ? arr.reverse() : arr).join('') + '</tr></thead>';\n    },\n\n    renderTitle = function(instance, c, year, month, refYear, randId)\n    {\n        var i, j, arr,\n            opts = instance._o,\n            isMinYear = year === opts.minYear,\n            isMaxYear = year === opts.maxYear,\n            html = '<div id=\"' + randId + '\" class=\"pika-title\" role=\"heading\" aria-live=\"assertive\">',\n            monthHtml,\n            yearHtml,\n            prev = true,\n            next = true;\n\n        for (arr = [], i = 0; i < 12; i++) {\n            arr.push('<option value=\"' + (year === refYear ? i - c : 12 + i - c) + '\"' +\n                (i === month ? ' selected=\"selected\"': '') +\n                ((isMinYear && i < opts.minMonth) || (isMaxYear && i > opts.maxMonth) ? 'disabled=\"disabled\"' : '') + '>' +\n                opts.i18n.months[i] + '</option>');\n        }\n\n        monthHtml = '<div class=\"pika-label\">' + opts.i18n.months[month] + '<select class=\"pika-select pika-select-month\" tabindex=\"-1\">' + arr.join('') + '</select></div>';\n\n        if (isArray(opts.yearRange)) {\n            i = opts.yearRange[0];\n            j = opts.yearRange[1] + 1;\n        } else {\n            i = year - opts.yearRange;\n            j = 1 + year + opts.yearRange;\n        }\n\n        for (arr = []; i < j && i <= opts.maxYear; i++) {\n            if (i >= opts.minYear) {\n                arr.push('<option value=\"' + i + '\"' + (i === year ? ' selected=\"selected\"': '') + '>' + (i) + '</option>');\n            }\n        }\n        yearHtml = '<div class=\"pika-label\">' + year + opts.yearSuffix + '<select class=\"pika-select pika-select-year\" tabindex=\"-1\">' + arr.join('') + '</select></div>';\n\n        if (opts.showMonthAfterYear) {\n            html += yearHtml + monthHtml;\n        } else {\n            html += monthHtml + yearHtml;\n        }\n\n        if (isMinYear && (month === 0 || opts.minMonth >= month)) {\n            prev = false;\n        }\n\n        if (isMaxYear && (month === 11 || opts.maxMonth <= month)) {\n            next = false;\n        }\n\n        if (c === 0) {\n            html += '<button class=\"pika-prev' + (prev ? '' : ' is-disabled') + '\" type=\"button\">' + opts.i18n.previousMonth + '</button>';\n        }\n        if (c === (instance._o.numberOfMonths - 1) ) {\n            html += '<button class=\"pika-next' + (next ? '' : ' is-disabled') + '\" type=\"button\">' + opts.i18n.nextMonth + '</button>';\n        }\n\n        return html += '</div>';\n    },\n\n    renderTable = function(opts, data, randId)\n    {\n        return '<table cellpadding=\"0\" cellspacing=\"0\" class=\"pika-table\" role=\"grid\" aria-labelledby=\"' + randId + '\">' + renderHead(opts) + renderBody(data) + '</table>';\n    },\n\n\n    /**\n     * Pikaday constructor\n     */\n    Pikaday = function(options)\n    {\n        var self = this,\n            opts = self.config(options);\n\n        self._onMouseDown = function(e)\n        {\n            if (!self._v) {\n                return;\n            }\n            e = e || window.event;\n            var target = e.target || e.srcElement;\n            if (!target) {\n                return;\n            }\n\n            if (!hasClass(target, 'is-disabled')) {\n                if (hasClass(target, 'pika-button') && !hasClass(target, 'is-empty') && !hasClass(target.parentNode, 'is-disabled')) {\n                    self.setDate(new Date(target.getAttribute('data-pika-year'), target.getAttribute('data-pika-month'), target.getAttribute('data-pika-day')));\n                    if (opts.bound) {\n                        sto(function() {\n                            self.hide();\n                            if (opts.field) {\n                                opts.field.blur();\n                            }\n                        }, 100);\n                    }\n                }\n                else if (hasClass(target, 'pika-prev')) {\n                    self.prevMonth();\n                }\n                else if (hasClass(target, 'pika-next')) {\n                    self.nextMonth();\n                }\n            }\n            if (!hasClass(target, 'pika-select')) {\n                // if this is touch event prevent mouse events emulation\n                if (e.preventDefault) {\n                    e.preventDefault();\n                } else {\n                    e.returnValue = false;\n                    return false;\n                }\n            } else {\n                self._c = true;\n            }\n        };\n\n        self._onChange = function(e)\n        {\n            e = e || window.event;\n            var target = e.target || e.srcElement;\n            if (!target) {\n                return;\n            }\n            if (hasClass(target, 'pika-select-month')) {\n                self.gotoMonth(target.value);\n            }\n            else if (hasClass(target, 'pika-select-year')) {\n                self.gotoYear(target.value);\n            }\n        };\n\n        self._onKeyChange = function(e)\n        {\n            e = e || window.event;\n\n            if (self.isVisible()) {\n\n                switch(e.keyCode){\n                    case 13:\n                    case 27:\n                        opts.field.blur();\n                        break;\n                    case 37:\n                        e.preventDefault();\n                        self.adjustDate('subtract', 1);\n                        break;\n                    case 38:\n                        self.adjustDate('subtract', 7);\n                        break;\n                    case 39:\n                        self.adjustDate('add', 1);\n                        break;\n                    case 40:\n                        self.adjustDate('add', 7);\n                        break;\n                }\n            }\n        };\n\n        self._onInputChange = function(e)\n        {\n            var date;\n\n            if (e.firedBy === self) {\n                return;\n            }\n            if (hasMoment) {\n                date = moment(opts.field.value, opts.format, opts.formatStrict);\n                date = (date && date.isValid()) ? date.toDate() : null;\n            }\n            else {\n                date = new Date(Date.parse(opts.field.value));\n            }\n            if (isDate(date)) {\n              self.setDate(date);\n            }\n            if (!self._v) {\n                self.show();\n            }\n        };\n\n        self._onInputFocus = function()\n        {\n            self.show();\n        };\n\n        self._onInputClick = function()\n        {\n            self.show();\n        };\n\n        self._onInputBlur = function()\n        {\n            // IE allows pika div to gain focus; catch blur the input field\n            var pEl = document.activeElement;\n            do {\n                if (hasClass(pEl, 'pika-single')) {\n                    return;\n                }\n            }\n            while ((pEl = pEl.parentNode));\n\n            if (!self._c) {\n                self._b = sto(function() {\n                    self.hide();\n                }, 50);\n            }\n            self._c = false;\n        };\n\n        self._onClick = function(e)\n        {\n            e = e || window.event;\n            var target = e.target || e.srcElement,\n                pEl = target;\n            if (!target) {\n                return;\n            }\n            if (!hasEventListeners && hasClass(target, 'pika-select')) {\n                if (!target.onchange) {\n                    target.setAttribute('onchange', 'return;');\n                    addEvent(target, 'change', self._onChange);\n                }\n            }\n            do {\n                if (hasClass(pEl, 'pika-single') || pEl === opts.trigger) {\n                    return;\n                }\n            }\n            while ((pEl = pEl.parentNode));\n            if (self._v && target !== opts.trigger && pEl !== opts.trigger) {\n                self.hide();\n            }\n        };\n\n        self.el = document.createElement('div');\n        self.el.className = 'pika-single' + (opts.isRTL ? ' is-rtl' : '') + (opts.theme ? ' ' + opts.theme : '');\n\n        addEvent(self.el, 'mousedown', self._onMouseDown, true);\n        addEvent(self.el, 'touchend', self._onMouseDown, true);\n        addEvent(self.el, 'change', self._onChange);\n        addEvent(document, 'keydown', self._onKeyChange);\n\n        if (opts.field) {\n            if (opts.container) {\n                opts.container.appendChild(self.el);\n            } else if (opts.bound) {\n                document.body.appendChild(self.el);\n            } else {\n                opts.field.parentNode.insertBefore(self.el, opts.field.nextSibling);\n            }\n            addEvent(opts.field, 'change', self._onInputChange);\n\n            if (!opts.defaultDate) {\n                if (hasMoment && opts.field.value) {\n                    opts.defaultDate = moment(opts.field.value, opts.format).toDate();\n                } else {\n                    opts.defaultDate = new Date(Date.parse(opts.field.value));\n                }\n                opts.setDefaultDate = true;\n            }\n        }\n\n        var defDate = opts.defaultDate;\n\n        if (isDate(defDate)) {\n            if (opts.setDefaultDate) {\n                self.setDate(defDate, true);\n            } else {\n                self.gotoDate(defDate);\n            }\n        } else {\n            self.gotoDate(new Date());\n        }\n\n        if (opts.bound) {\n            this.hide();\n            self.el.className += ' is-bound';\n            addEvent(opts.trigger, 'click', self._onInputClick);\n            addEvent(opts.trigger, 'focus', self._onInputFocus);\n            addEvent(opts.trigger, 'blur', self._onInputBlur);\n        } else {\n            this.show();\n        }\n    };\n\n\n    /**\n     * public Pikaday API\n     */\n    Pikaday.prototype = {\n\n\n        /**\n         * configure functionality\n         */\n        config: function(options)\n        {\n            if (!this._o) {\n                this._o = extend({}, defaults, true);\n            }\n\n            var opts = extend(this._o, options, true);\n\n            opts.isRTL = !!opts.isRTL;\n\n            opts.field = (opts.field && opts.field.nodeName) ? opts.field : null;\n\n            opts.theme = (typeof opts.theme) === 'string' && opts.theme ? opts.theme : null;\n\n            opts.bound = !!(opts.bound !== undefined ? opts.field && opts.bound : opts.field);\n\n            opts.trigger = (opts.trigger && opts.trigger.nodeName) ? opts.trigger : opts.field;\n\n            opts.disableWeekends = !!opts.disableWeekends;\n\n            opts.disableDayFn = (typeof opts.disableDayFn) === 'function' ? opts.disableDayFn : null;\n\n            var nom = parseInt(opts.numberOfMonths, 10) || 1;\n            opts.numberOfMonths = nom > 4 ? 4 : nom;\n\n            if (!isDate(opts.minDate)) {\n                opts.minDate = false;\n            }\n            if (!isDate(opts.maxDate)) {\n                opts.maxDate = false;\n            }\n            if ((opts.minDate && opts.maxDate) && opts.maxDate < opts.minDate) {\n                opts.maxDate = opts.minDate = false;\n            }\n            if (opts.minDate) {\n                this.setMinDate(opts.minDate);\n            }\n            if (opts.maxDate) {\n                this.setMaxDate(opts.maxDate);\n            }\n\n            if (isArray(opts.yearRange)) {\n                var fallback = new Date().getFullYear() - 10;\n                opts.yearRange[0] = parseInt(opts.yearRange[0], 10) || fallback;\n                opts.yearRange[1] = parseInt(opts.yearRange[1], 10) || fallback;\n            } else {\n                opts.yearRange = Math.abs(parseInt(opts.yearRange, 10)) || defaults.yearRange;\n                if (opts.yearRange > 100) {\n                    opts.yearRange = 100;\n                }\n            }\n\n            return opts;\n        },\n\n        /**\n         * return a formatted string of the current selection (using Moment.js if available)\n         */\n        toString: function(format)\n        {\n            return !isDate(this._d) ? '' : hasMoment ? moment(this._d).format(format || this._o.format) : this._d.toDateString();\n        },\n\n        /**\n         * return a Moment.js object of the current selection (if available)\n         */\n        getMoment: function()\n        {\n            return hasMoment ? moment(this._d) : null;\n        },\n\n        /**\n         * set the current selection from a Moment.js object (if available)\n         */\n        setMoment: function(date, preventOnSelect)\n        {\n            if (hasMoment && moment.isMoment(date)) {\n                this.setDate(date.toDate(), preventOnSelect);\n            }\n        },\n\n        /**\n         * return a Date object of the current selection with fallback for the current date\n         */\n        getDate: function()\n        {\n            return isDate(this._d) ? new Date(this._d.getTime()) : new Date();\n        },\n\n        /**\n         * set the current selection\n         */\n        setDate: function(date, preventOnSelect)\n        {\n            if (!date) {\n                this._d = null;\n\n                if (this._o.field) {\n                    this._o.field.value = '';\n                    fireEvent(this._o.field, 'change', { firedBy: this });\n                }\n\n                return this.draw();\n            }\n            if (typeof date === 'string') {\n                date = new Date(Date.parse(date));\n            }\n            if (!isDate(date)) {\n                return;\n            }\n\n            var min = this._o.minDate,\n                max = this._o.maxDate;\n\n            if (isDate(min) && date < min) {\n                date = min;\n            } else if (isDate(max) && date > max) {\n                date = max;\n            }\n\n            this._d = new Date(date.getTime());\n            setToStartOfDay(this._d);\n            this.gotoDate(this._d);\n\n            if (this._o.field) {\n                this._o.field.value = this.toString();\n                fireEvent(this._o.field, 'change', { firedBy: this });\n            }\n            if (!preventOnSelect && typeof this._o.onSelect === 'function') {\n                this._o.onSelect.call(this, this.getDate());\n            }\n        },\n\n        /**\n         * change view to a specific date\n         */\n        gotoDate: function(date)\n        {\n            var newCalendar = true;\n\n            if (!isDate(date)) {\n                return;\n            }\n\n            if (this.calendars) {\n                var firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1),\n                    lastVisibleDate = new Date(this.calendars[this.calendars.length-1].year, this.calendars[this.calendars.length-1].month, 1),\n                    visibleDate = date.getTime();\n                // get the end of the month\n                lastVisibleDate.setMonth(lastVisibleDate.getMonth()+1);\n                lastVisibleDate.setDate(lastVisibleDate.getDate()-1);\n                newCalendar = (visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate);\n            }\n\n            if (newCalendar) {\n                this.calendars = [{\n                    month: date.getMonth(),\n                    year: date.getFullYear()\n                }];\n                if (this._o.mainCalendar === 'right') {\n                    this.calendars[0].month += 1 - this._o.numberOfMonths;\n                }\n            }\n\n            this.adjustCalendars();\n        },\n\n        adjustDate: function(sign, days) {\n\n            var day = this.getDate();\n            var difference = parseInt(days)*24*60*60*1000;\n\n            var newDay;\n\n            if (sign === 'add') {\n                newDay = new Date(day.valueOf() + difference);\n            } else if (sign === 'subtract') {\n                newDay = new Date(day.valueOf() - difference);\n            }\n\n            if (hasMoment) {\n                if (sign === 'add') {\n                    newDay = moment(day).add(days, \"days\").toDate();\n                } else if (sign === 'subtract') {\n                    newDay = moment(day).subtract(days, \"days\").toDate();\n                }\n            }\n\n            this.setDate(newDay);\n        },\n\n        adjustCalendars: function() {\n            this.calendars[0] = adjustCalendar(this.calendars[0]);\n            for (var c = 1; c < this._o.numberOfMonths; c++) {\n                this.calendars[c] = adjustCalendar({\n                    month: this.calendars[0].month + c,\n                    year: this.calendars[0].year\n                });\n            }\n            this.draw();\n        },\n\n        gotoToday: function()\n        {\n            this.gotoDate(new Date());\n        },\n\n        /**\n         * change view to a specific month (zero-index, e.g. 0: January)\n         */\n        gotoMonth: function(month)\n        {\n            if (!isNaN(month)) {\n                this.calendars[0].month = parseInt(month, 10);\n                this.adjustCalendars();\n            }\n        },\n\n        nextMonth: function()\n        {\n            this.calendars[0].month++;\n            this.adjustCalendars();\n        },\n\n        prevMonth: function()\n        {\n            this.calendars[0].month--;\n            this.adjustCalendars();\n        },\n\n        /**\n         * change view to a specific full year (e.g. \"2012\")\n         */\n        gotoYear: function(year)\n        {\n            if (!isNaN(year)) {\n                this.calendars[0].year = parseInt(year, 10);\n                this.adjustCalendars();\n            }\n        },\n\n        /**\n         * change the minDate\n         */\n        setMinDate: function(value)\n        {\n            if(value instanceof Date) {\n                setToStartOfDay(value);\n                this._o.minDate = value;\n                this._o.minYear  = value.getFullYear();\n                this._o.minMonth = value.getMonth();\n            } else {\n                this._o.minDate = defaults.minDate;\n                this._o.minYear  = defaults.minYear;\n                this._o.minMonth = defaults.minMonth;\n                this._o.startRange = defaults.startRange;\n            }\n\n            this.draw();\n        },\n\n        /**\n         * change the maxDate\n         */\n        setMaxDate: function(value)\n        {\n            if(value instanceof Date) {\n                setToStartOfDay(value);\n                this._o.maxDate = value;\n                this._o.maxYear = value.getFullYear();\n                this._o.maxMonth = value.getMonth();\n            } else {\n                this._o.maxDate = defaults.maxDate;\n                this._o.maxYear = defaults.maxYear;\n                this._o.maxMonth = defaults.maxMonth;\n                this._o.endRange = defaults.endRange;\n            }\n\n            this.draw();\n        },\n\n        setStartRange: function(value)\n        {\n            this._o.startRange = value;\n        },\n\n        setEndRange: function(value)\n        {\n            this._o.endRange = value;\n        },\n\n        /**\n         * refresh the HTML\n         */\n        draw: function(force)\n        {\n            if (!this._v && !force) {\n                return;\n            }\n            var opts = this._o,\n                minYear = opts.minYear,\n                maxYear = opts.maxYear,\n                minMonth = opts.minMonth,\n                maxMonth = opts.maxMonth,\n                html = '',\n                randId;\n\n            if (this._y <= minYear) {\n                this._y = minYear;\n                if (!isNaN(minMonth) && this._m < minMonth) {\n                    this._m = minMonth;\n                }\n            }\n            if (this._y >= maxYear) {\n                this._y = maxYear;\n                if (!isNaN(maxMonth) && this._m > maxMonth) {\n                    this._m = maxMonth;\n                }\n            }\n\n            randId = 'pika-title-' + Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 2);\n\n            for (var c = 0; c < opts.numberOfMonths; c++) {\n                html += '<div class=\"pika-lendar\">' + renderTitle(this, c, this.calendars[c].year, this.calendars[c].month, this.calendars[0].year, randId) + this.render(this.calendars[c].year, this.calendars[c].month, randId) + '</div>';\n            }\n\n            this.el.innerHTML = html;\n\n            if (opts.bound) {\n                if(opts.field.type !== 'hidden') {\n                    sto(function() {\n                        opts.trigger.focus();\n                    }, 1);\n                }\n            }\n\n            if (typeof this._o.onDraw === 'function') {\n                this._o.onDraw(this);\n            }\n            \n            if (opts.bound) {\n                // let the screen reader user know to use arrow keys\n                opts.field.setAttribute('aria-label', 'Use the arrow keys to pick a date');\n            }\n        },\n\n        adjustPosition: function()\n        {\n            var field, pEl, width, height, viewportWidth, viewportHeight, scrollTop, left, top, clientRect;\n\n            if (this._o.container) return;\n\n            this.el.style.position = 'absolute';\n\n            field = this._o.trigger;\n            pEl = field;\n            width = this.el.offsetWidth;\n            height = this.el.offsetHeight;\n            viewportWidth = window.innerWidth || document.documentElement.clientWidth;\n            viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n            scrollTop = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;\n\n            if (typeof field.getBoundingClientRect === 'function') {\n                clientRect = field.getBoundingClientRect();\n                left = clientRect.left + window.pageXOffset;\n                top = clientRect.bottom + window.pageYOffset;\n            } else {\n                left = pEl.offsetLeft;\n                top  = pEl.offsetTop + pEl.offsetHeight;\n                while((pEl = pEl.offsetParent)) {\n                    left += pEl.offsetLeft;\n                    top  += pEl.offsetTop;\n                }\n            }\n\n            // default position is bottom & left\n            if ((this._o.reposition && left + width > viewportWidth) ||\n                (\n                    this._o.position.indexOf('right') > -1 &&\n                    left - width + field.offsetWidth > 0\n                )\n            ) {\n                left = left - width + field.offsetWidth;\n            }\n            if ((this._o.reposition && top + height > viewportHeight + scrollTop) ||\n                (\n                    this._o.position.indexOf('top') > -1 &&\n                    top - height - field.offsetHeight > 0\n                )\n            ) {\n                top = top - height - field.offsetHeight;\n            }\n\n            this.el.style.left = left + 'px';\n            this.el.style.top = top + 'px';\n        },\n\n        /**\n         * render HTML for a particular month\n         */\n        render: function(year, month, randId)\n        {\n            var opts   = this._o,\n                now    = new Date(),\n                days   = getDaysInMonth(year, month),\n                before = new Date(year, month, 1).getDay(),\n                data   = [],\n                row    = [];\n            setToStartOfDay(now);\n            if (opts.firstDay > 0) {\n                before -= opts.firstDay;\n                if (before < 0) {\n                    before += 7;\n                }\n            }\n            var previousMonth = month === 0 ? 11 : month - 1,\n                nextMonth = month === 11 ? 0 : month + 1,\n                yearOfPreviousMonth = month === 0 ? year - 1 : year,\n                yearOfNextMonth = month === 11 ? year + 1 : year,\n                daysInPreviousMonth = getDaysInMonth(yearOfPreviousMonth, previousMonth);\n            var cells = days + before,\n                after = cells;\n            while(after > 7) {\n                after -= 7;\n            }\n            cells += 7 - after;\n            for (var i = 0, r = 0; i < cells; i++)\n            {\n                var day = new Date(year, month, 1 + (i - before)),\n                    isSelected = isDate(this._d) ? compareDates(day, this._d) : false,\n                    isToday = compareDates(day, now),\n                    isEmpty = i < before || i >= (days + before),\n                    dayNumber = 1 + (i - before),\n                    monthNumber = month,\n                    yearNumber = year,\n                    isStartRange = opts.startRange && compareDates(opts.startRange, day),\n                    isEndRange = opts.endRange && compareDates(opts.endRange, day),\n                    isInRange = opts.startRange && opts.endRange && opts.startRange < day && day < opts.endRange,\n                    isDisabled = (opts.minDate && day < opts.minDate) ||\n                                 (opts.maxDate && day > opts.maxDate) ||\n                                 (opts.disableWeekends && isWeekend(day)) ||\n                                 (opts.disableDayFn && opts.disableDayFn(day));\n\n                if (isEmpty) {\n                    if (i < before) {\n                        dayNumber = daysInPreviousMonth + dayNumber;\n                        monthNumber = previousMonth;\n                        yearNumber = yearOfPreviousMonth;\n                    } else {\n                        dayNumber = dayNumber - days;\n                        monthNumber = nextMonth;\n                        yearNumber = yearOfNextMonth;\n                    }\n                }\n\n                var dayConfig = {\n                        day: dayNumber,\n                        month: monthNumber,\n                        year: yearNumber,\n                        isSelected: isSelected,\n                        isToday: isToday,\n                        isDisabled: isDisabled,\n                        isEmpty: isEmpty,\n                        isStartRange: isStartRange,\n                        isEndRange: isEndRange,\n                        isInRange: isInRange,\n                        showDaysInNextAndPreviousMonths: opts.showDaysInNextAndPreviousMonths\n                    };\n\n                row.push(renderDay(dayConfig));\n\n                if (++r === 7) {\n                    if (opts.showWeekNumber) {\n                        row.unshift(renderWeek(i - before, month, year));\n                    }\n                    data.push(renderRow(row, opts.isRTL));\n                    row = [];\n                    r = 0;\n                }\n            }\n            return renderTable(opts, data, randId);\n        },\n\n        isVisible: function()\n        {\n            return this._v;\n        },\n\n        show: function()\n        {\n            if (!this.isVisible()) {\n                removeClass(this.el, 'is-hidden');\n                this._v = true;\n                this.draw();\n                if (this._o.bound) {\n                    addEvent(document, 'click', this._onClick);\n                    this.adjustPosition();\n                }\n                if (typeof this._o.onOpen === 'function') {\n                    this._o.onOpen.call(this);\n                }\n            }\n        },\n\n        hide: function()\n        {\n            var v = this._v;\n            if (v !== false) {\n                if (this._o.bound) {\n                    removeEvent(document, 'click', this._onClick);\n                }\n                this.el.style.position = 'static'; // reset\n                this.el.style.left = 'auto';\n                this.el.style.top = 'auto';\n                addClass(this.el, 'is-hidden');\n                this._v = false;\n                if (v !== undefined && typeof this._o.onClose === 'function') {\n                    this._o.onClose.call(this);\n                }\n            }\n        },\n\n        /**\n         * GAME OVER\n         */\n        destroy: function()\n        {\n            this.hide();\n            removeEvent(this.el, 'mousedown', this._onMouseDown, true);\n            removeEvent(this.el, 'touchend', this._onMouseDown, true);\n            removeEvent(this.el, 'change', this._onChange);\n            if (this._o.field) {\n                removeEvent(this._o.field, 'change', this._onInputChange);\n                if (this._o.bound) {\n                    removeEvent(this._o.trigger, 'click', this._onInputClick);\n                    removeEvent(this._o.trigger, 'focus', this._onInputFocus);\n                    removeEvent(this._o.trigger, 'blur', this._onInputBlur);\n                }\n            }\n            if (this.el.parentNode) {\n                this.el.parentNode.removeChild(this.el);\n            }\n        }\n\n    };\n\n    return Pikaday;\n\n}));\n"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/languages/all.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 8);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Switzerland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-CH'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Grösser als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Grösser gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Ausserhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Germany language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-DE'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Größer als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Größer gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Außerhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 15, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for English - United States language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'en-US'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Insert row above'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Insert row below'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Insert column left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Insert column right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Remove row', 'Remove rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Remove column', 'Remove columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Undo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Redo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Read only'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Clear column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alignment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Center'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justify'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Middle'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Freeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Unfreeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Borders'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Remove border(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Add comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edit comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Delete comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Read-only comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Merge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Unmerge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copy'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Cut'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Insert child row'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Detach from parent'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Hide column', 'Hide columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Show column', 'Show columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Hide row', 'Hide rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Show row', 'Show rows']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'None'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Is empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Is not empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Is equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Is not equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Begins with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Ends with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contains'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Does not contain'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Greater than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Greater than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Less than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Less than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Is between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Is not between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'After'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Before'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Today'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Tomorrow'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Yesterday'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Blank cells'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filter by condition'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filter by value'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'And'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Or'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Select all'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Clear'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancel'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Search'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Value'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Second value'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: hand-dot\n                                                                                                                                                                                                                   * Last updated: Jan 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Japanese - Japan language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ja-JP'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, '行を上に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, '行を下に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, '列を左に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, '列を右に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['行を削除', '行を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['列を削除', '列を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, '元に戻す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'やり直し'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, '読み取り専用'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, '列をクリア'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, '配置'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, '左揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, '中央揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, '右揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, '両端揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, '上揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, '中央揃え(垂直)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, '下揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, '列を固定'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, '列の固定を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, '枠線'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, '上'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, '右'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, '下'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, '左'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, '枠線を削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'コメントを追加'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'コメントを編集'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'コメントを削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, '読み取り専用コメント'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'セルを結合'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'セルの結合を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'コピー'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, '切り取り'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, '子の行を挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, '親の行と切り離す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['列を非表示', '列を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['列を表示', '列を表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['行を非表示', '行を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['行を表示', '行を表示']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'なし'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, '空白'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, '空白ではない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, '次と等しい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, '次と等しくない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, '次で始まる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, '次で終わる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, '次を含む'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, '次を含まない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, '次より大きい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, '以上'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, '次より小さい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, '以下'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, '次の間にある'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, '次の間にない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, '次より後の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, '次より前の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, '今日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, '明日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, '昨日'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, '空白のセル'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, '条件でフィルタ'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, '値でフィルタ'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'かつ'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'もしくは'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'すべて選択'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'クリア'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'キャンセル'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, '検索'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, '値'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, '値2'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 17, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Polish - Poland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pl-PL'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Wstaw wiersz powyżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Wstaw wiersz poniżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Wstaw kolumnę z lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Wstaw kolumnę z prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Usuń wiersz', 'Usuń wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Usuń kolumnę', 'Usuń kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Cofnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Ponów'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Wyczyść kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Wyrównanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Do lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Do środka'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Do prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Wyjustuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Do góry'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Wyśrodkuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Do dołu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Zablokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Odblokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Obramowanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Krawędź górna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Krawędź prawa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Krawędź dolna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Krawędź lewa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Usuń obramowanie(a)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Dodaj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edytuj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Usuń komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Komentarz tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Scal komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Rozdziel komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopiuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Wytnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Wstaw wiersz podrzędny'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Odłącz od nadrzędnego'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ukryj kolumnę', 'Ukryj kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Pokaż kolumnę', 'Pokaż kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ukryj wiersz', 'Ukryj wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Pokaż wiersz', 'Pokaż wiersze']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Brak'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Komórka jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Komórka nie jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Jest równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Jest różne od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Tekst zaczyna się od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Tekst kończy się na'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Tekst zawiera fragment'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Tekst nie zawiera fragmentu'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Większe niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Większe lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Mniejsze niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Mniejsze lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Nie jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Data późniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Data wcześniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Dzisiaj'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Jutro'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Wczoraj'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Puste miejsca'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtruj wg warunku'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtruj wg wartości'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Oraz'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Lub'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Zaznacz wszystko'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Wyczyść'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Anuluj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Szukaj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wartość'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Druga wartość'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Júlio C. Zuppa\n                                                                                                                                                                                                                   * Last updated: Jan 12, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Portuguese - Brazil language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pt-BR'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Inserir linha acima'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Inserir linha abaixo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Inserir coluna esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Inserir coluna direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Excluir linha', 'Excluir linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Excluir coluna', 'Excluir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Desfazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Refazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Limpar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alinhamento'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Centralizado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justificado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Meio'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Congelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Descongelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Bordas'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Excluir bordas(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Incluir comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Editar comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Remover comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Comentário somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Mesclar células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Desfazer mesclagem de células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copiar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Recortar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Inserir linha filha'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Desanexar da linha pai'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ocultar coluna', 'Ocultar colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Exibir coluna', 'Exibir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ocultar linha', 'Ocultar linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Exibir linha', 'Exibir linhas']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Nenhum'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'É vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Não é vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'É igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'É diferente de'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Começa com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Termina com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Não contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Maior que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Menor que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Não está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Depois'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Antes'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Hoje'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Amanhã'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Ontem'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Células vazias'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtrar por condição'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtrar por valor'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'E'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Ou'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Selecionar tudo'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Limpar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancelar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Localizar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Valor'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Segundo valor'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Alexey Rogachev\n                                                                                                                                                                                                                   * Last updated: Feb 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Russian - Russia language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ru-RU'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Вставить строку выше'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Вставить строку ниже'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Вставить столбец слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Вставить столбец справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Удалить строку', 'Удалить строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Удалить столбец', 'Удалить столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Отменить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Повторить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Очистить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Выравнивание'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'По левому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'По правому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'По ширине'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'По верхнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'По нижнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Закрепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Открепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Границы'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Сверху'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Снизу'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Удалить границу(ы)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Добавить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Редактировать комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Удалить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Комментарий только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Объединить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Разделить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Копировать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Вырезать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Вставить дочернюю строку'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Отделить от родителя'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Скрыть столбец', 'Скрыть столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Показать столбец', 'Показать столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Скрыть строку', 'Скрыть строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Показать строку', 'Показать строки']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Отсутствует'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Не пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Не равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Начинается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Заканчивается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Не содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Больше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Больше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Меньше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Меньше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Не между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'После'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'До'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Сегодня'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Завтра'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Вчера'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Пустые ячейки'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Фильтр по условию'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Фильтр по значению'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'И'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Или'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Выбрать все'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Убрать'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Отмена'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Поиск'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Значение'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Второе значение'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.ruRU = exports.ptBR = exports.plPL = exports.jaJP = exports.enUS = exports.deDE = exports.deCH = undefined;\n\nvar _deCH = __webpack_require__(1);\n\nvar _deCH2 = _interopRequireDefault(_deCH);\n\nvar _deDE = __webpack_require__(2);\n\nvar _deDE2 = _interopRequireDefault(_deDE);\n\nvar _enUS = __webpack_require__(3);\n\nvar _enUS2 = _interopRequireDefault(_enUS);\n\nvar _jaJP = __webpack_require__(4);\n\nvar _jaJP2 = _interopRequireDefault(_jaJP);\n\nvar _plPL = __webpack_require__(5);\n\nvar _plPL2 = _interopRequireDefault(_plPL);\n\nvar _ptBR = __webpack_require__(6);\n\nvar _ptBR2 = _interopRequireDefault(_ptBR);\n\nvar _ruRU = __webpack_require__(7);\n\nvar _ruRU2 = _interopRequireDefault(_ruRU);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.deCH = _deCH2.default;\nexports.deDE = _deDE2.default;\nexports.enUS = _enUS2.default;\nexports.jaJP = _jaJP2.default;\nexports.plPL = _plPL2.default;\nexports.ptBR = _ptBR2.default;\nexports.ruRU = _ruRU2.default; /* eslint-disable import/prefer-default-export */\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/languages/de-CH.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 1);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Switzerland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-CH'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Grösser als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Grösser gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Ausserhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/languages/de-DE.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 2);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */,\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Germany language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-DE'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Größer als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Größer gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Außerhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/languages/en-US.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 3);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */,\n/* 2 */,\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 15, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for English - United States language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'en-US'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Insert row above'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Insert row below'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Insert column left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Insert column right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Remove row', 'Remove rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Remove column', 'Remove columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Undo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Redo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Read only'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Clear column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alignment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Center'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justify'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Middle'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Freeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Unfreeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Borders'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Remove border(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Add comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edit comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Delete comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Read-only comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Merge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Unmerge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copy'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Cut'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Insert child row'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Detach from parent'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Hide column', 'Hide columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Show column', 'Show columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Hide row', 'Hide rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Show row', 'Show rows']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'None'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Is empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Is not empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Is equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Is not equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Begins with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Ends with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contains'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Does not contain'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Greater than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Greater than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Less than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Less than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Is between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Is not between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'After'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Before'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Today'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Tomorrow'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Yesterday'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Blank cells'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filter by condition'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filter by value'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'And'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Or'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Select all'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Clear'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancel'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Search'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Value'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Second value'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/languages/index.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 8);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Switzerland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-CH'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Grösser als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Grösser gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Ausserhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Germany language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-DE'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Größer als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Größer gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Außerhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 15, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for English - United States language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'en-US'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Insert row above'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Insert row below'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Insert column left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Insert column right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Remove row', 'Remove rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Remove column', 'Remove columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Undo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Redo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Read only'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Clear column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alignment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Center'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justify'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Middle'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Freeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Unfreeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Borders'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Remove border(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Add comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edit comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Delete comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Read-only comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Merge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Unmerge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copy'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Cut'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Insert child row'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Detach from parent'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Hide column', 'Hide columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Show column', 'Show columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Hide row', 'Hide rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Show row', 'Show rows']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'None'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Is empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Is not empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Is equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Is not equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Begins with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Ends with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contains'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Does not contain'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Greater than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Greater than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Less than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Less than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Is between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Is not between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'After'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Before'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Today'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Tomorrow'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Yesterday'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Blank cells'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filter by condition'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filter by value'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'And'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Or'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Select all'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Clear'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancel'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Search'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Value'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Second value'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: hand-dot\n                                                                                                                                                                                                                   * Last updated: Jan 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Japanese - Japan language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ja-JP'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, '行を上に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, '行を下に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, '列を左に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, '列を右に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['行を削除', '行を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['列を削除', '列を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, '元に戻す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'やり直し'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, '読み取り専用'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, '列をクリア'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, '配置'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, '左揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, '中央揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, '右揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, '両端揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, '上揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, '中央揃え(垂直)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, '下揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, '列を固定'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, '列の固定を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, '枠線'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, '上'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, '右'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, '下'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, '左'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, '枠線を削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'コメントを追加'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'コメントを編集'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'コメントを削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, '読み取り専用コメント'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'セルを結合'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'セルの結合を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'コピー'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, '切り取り'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, '子の行を挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, '親の行と切り離す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['列を非表示', '列を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['列を表示', '列を表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['行を非表示', '行を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['行を表示', '行を表示']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'なし'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, '空白'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, '空白ではない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, '次と等しい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, '次と等しくない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, '次で始まる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, '次で終わる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, '次を含む'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, '次を含まない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, '次より大きい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, '以上'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, '次より小さい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, '以下'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, '次の間にある'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, '次の間にない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, '次より後の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, '次より前の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, '今日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, '明日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, '昨日'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, '空白のセル'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, '条件でフィルタ'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, '値でフィルタ'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'かつ'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'もしくは'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'すべて選択'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'クリア'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'キャンセル'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, '検索'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, '値'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, '値2'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 17, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Polish - Poland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pl-PL'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Wstaw wiersz powyżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Wstaw wiersz poniżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Wstaw kolumnę z lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Wstaw kolumnę z prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Usuń wiersz', 'Usuń wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Usuń kolumnę', 'Usuń kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Cofnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Ponów'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Wyczyść kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Wyrównanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Do lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Do środka'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Do prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Wyjustuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Do góry'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Wyśrodkuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Do dołu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Zablokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Odblokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Obramowanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Krawędź górna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Krawędź prawa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Krawędź dolna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Krawędź lewa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Usuń obramowanie(a)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Dodaj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edytuj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Usuń komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Komentarz tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Scal komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Rozdziel komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopiuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Wytnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Wstaw wiersz podrzędny'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Odłącz od nadrzędnego'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ukryj kolumnę', 'Ukryj kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Pokaż kolumnę', 'Pokaż kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ukryj wiersz', 'Ukryj wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Pokaż wiersz', 'Pokaż wiersze']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Brak'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Komórka jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Komórka nie jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Jest równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Jest różne od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Tekst zaczyna się od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Tekst kończy się na'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Tekst zawiera fragment'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Tekst nie zawiera fragmentu'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Większe niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Większe lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Mniejsze niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Mniejsze lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Nie jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Data późniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Data wcześniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Dzisiaj'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Jutro'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Wczoraj'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Puste miejsca'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtruj wg warunku'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtruj wg wartości'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Oraz'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Lub'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Zaznacz wszystko'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Wyczyść'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Anuluj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Szukaj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wartość'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Druga wartość'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Júlio C. Zuppa\n                                                                                                                                                                                                                   * Last updated: Jan 12, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Portuguese - Brazil language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pt-BR'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Inserir linha acima'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Inserir linha abaixo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Inserir coluna esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Inserir coluna direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Excluir linha', 'Excluir linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Excluir coluna', 'Excluir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Desfazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Refazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Limpar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alinhamento'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Centralizado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justificado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Meio'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Congelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Descongelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Bordas'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Excluir bordas(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Incluir comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Editar comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Remover comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Comentário somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Mesclar células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Desfazer mesclagem de células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copiar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Recortar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Inserir linha filha'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Desanexar da linha pai'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ocultar coluna', 'Ocultar colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Exibir coluna', 'Exibir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ocultar linha', 'Ocultar linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Exibir linha', 'Exibir linhas']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Nenhum'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'É vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Não é vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'É igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'É diferente de'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Começa com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Termina com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Não contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Maior que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Menor que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Não está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Depois'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Antes'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Hoje'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Amanhã'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Ontem'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Células vazias'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtrar por condição'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtrar por valor'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'E'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Ou'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Selecionar tudo'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Limpar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancelar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Localizar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Valor'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Segundo valor'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Alexey Rogachev\n                                                                                                                                                                                                                   * Last updated: Feb 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Russian - Russia language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ru-RU'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Вставить строку выше'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Вставить строку ниже'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Вставить столбец слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Вставить столбец справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Удалить строку', 'Удалить строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Удалить столбец', 'Удалить столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Отменить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Повторить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Очистить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Выравнивание'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'По левому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'По правому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'По ширине'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'По верхнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'По нижнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Закрепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Открепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Границы'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Сверху'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Снизу'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Удалить границу(ы)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Добавить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Редактировать комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Удалить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Комментарий только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Объединить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Разделить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Копировать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Вырезать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Вставить дочернюю строку'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Отделить от родителя'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Скрыть столбец', 'Скрыть столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Показать столбец', 'Показать столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Скрыть строку', 'Скрыть строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Показать строку', 'Показать строки']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Отсутствует'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Не пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Не равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Начинается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Заканчивается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Не содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Больше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Больше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Меньше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Меньше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Не между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'После'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'До'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Сегодня'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Завтра'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Вчера'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Пустые ячейки'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Фильтр по условию'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Фильтр по значению'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'И'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Или'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Выбрать все'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Убрать'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Отмена'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Поиск'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Значение'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Второе значение'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.ruRU = exports.ptBR = exports.plPL = exports.jaJP = exports.enUS = exports.deDE = exports.deCH = undefined;\n\nvar _deCH = __webpack_require__(1);\n\nvar _deCH2 = _interopRequireDefault(_deCH);\n\nvar _deDE = __webpack_require__(2);\n\nvar _deDE2 = _interopRequireDefault(_deDE);\n\nvar _enUS = __webpack_require__(3);\n\nvar _enUS2 = _interopRequireDefault(_enUS);\n\nvar _jaJP = __webpack_require__(4);\n\nvar _jaJP2 = _interopRequireDefault(_jaJP);\n\nvar _plPL = __webpack_require__(5);\n\nvar _plPL2 = _interopRequireDefault(_plPL);\n\nvar _ptBR = __webpack_require__(6);\n\nvar _ptBR2 = _interopRequireDefault(_ptBR);\n\nvar _ruRU = __webpack_require__(7);\n\nvar _ruRU2 = _interopRequireDefault(_ruRU);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.deCH = _deCH2.default;\nexports.deDE = _deDE2.default;\nexports.enUS = _enUS2.default;\nexports.jaJP = _jaJP2.default;\nexports.plPL = _plPL2.default;\nexports.ptBR = _ptBR2.default;\nexports.ruRU = _ruRU2.default; /* eslint-disable import/prefer-default-export */\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/languages/ja-JP.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 4);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */,\n/* 2 */,\n/* 3 */,\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: hand-dot\n                                                                                                                                                                                                                   * Last updated: Jan 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Japanese - Japan language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ja-JP'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, '行を上に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, '行を下に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, '列を左に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, '列を右に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['行を削除', '行を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['列を削除', '列を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, '元に戻す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'やり直し'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, '読み取り専用'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, '列をクリア'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, '配置'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, '左揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, '中央揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, '右揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, '両端揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, '上揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, '中央揃え(垂直)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, '下揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, '列を固定'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, '列の固定を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, '枠線'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, '上'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, '右'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, '下'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, '左'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, '枠線を削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'コメントを追加'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'コメントを編集'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'コメントを削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, '読み取り専用コメント'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'セルを結合'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'セルの結合を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'コピー'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, '切り取り'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, '子の行を挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, '親の行と切り離す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['列を非表示', '列を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['列を表示', '列を表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['行を非表示', '行を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['行を表示', '行を表示']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'なし'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, '空白'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, '空白ではない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, '次と等しい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, '次と等しくない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, '次で始まる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, '次で終わる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, '次を含む'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, '次を含まない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, '次より大きい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, '以上'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, '次より小さい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, '以下'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, '次の間にある'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, '次の間にない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, '次より後の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, '次より前の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, '今日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, '明日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, '昨日'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, '空白のセル'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, '条件でフィルタ'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, '値でフィルタ'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'かつ'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'もしくは'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'すべて選択'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'クリア'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'キャンセル'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, '検索'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, '値'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, '値2'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/languages/pl-PL.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 5);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n\n/***/ 5:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 17, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Polish - Poland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pl-PL'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Wstaw wiersz powyżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Wstaw wiersz poniżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Wstaw kolumnę z lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Wstaw kolumnę z prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Usuń wiersz', 'Usuń wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Usuń kolumnę', 'Usuń kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Cofnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Ponów'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Wyczyść kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Wyrównanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Do lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Do środka'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Do prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Wyjustuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Do góry'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Wyśrodkuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Do dołu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Zablokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Odblokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Obramowanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Krawędź górna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Krawędź prawa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Krawędź dolna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Krawędź lewa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Usuń obramowanie(a)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Dodaj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edytuj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Usuń komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Komentarz tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Scal komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Rozdziel komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopiuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Wytnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Wstaw wiersz podrzędny'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Odłącz od nadrzędnego'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ukryj kolumnę', 'Ukryj kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Pokaż kolumnę', 'Pokaż kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ukryj wiersz', 'Ukryj wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Pokaż wiersz', 'Pokaż wiersze']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Brak'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Komórka jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Komórka nie jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Jest równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Jest różne od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Tekst zaczyna się od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Tekst kończy się na'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Tekst zawiera fragment'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Tekst nie zawiera fragmentu'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Większe niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Większe lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Mniejsze niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Mniejsze lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Nie jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Data późniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Data wcześniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Dzisiaj'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Jutro'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Wczoraj'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Puste miejsca'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtruj wg warunku'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtruj wg wartości'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Oraz'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Lub'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Zaznacz wszystko'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Wyczyść'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Anuluj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Szukaj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wartość'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Druga wartość'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n\n/******/ })[\"___\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/languages/pt-BR.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 6);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n\n/***/ 6:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Júlio C. Zuppa\n                                                                                                                                                                                                                   * Last updated: Jan 12, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Portuguese - Brazil language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pt-BR'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Inserir linha acima'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Inserir linha abaixo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Inserir coluna esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Inserir coluna direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Excluir linha', 'Excluir linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Excluir coluna', 'Excluir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Desfazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Refazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Limpar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alinhamento'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Centralizado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justificado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Meio'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Congelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Descongelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Bordas'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Excluir bordas(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Incluir comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Editar comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Remover comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Comentário somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Mesclar células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Desfazer mesclagem de células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copiar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Recortar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Inserir linha filha'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Desanexar da linha pai'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ocultar coluna', 'Ocultar colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Exibir coluna', 'Exibir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ocultar linha', 'Ocultar linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Exibir linha', 'Exibir linhas']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Nenhum'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'É vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Não é vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'É igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'É diferente de'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Começa com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Termina com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Não contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Maior que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Menor que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Não está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Depois'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Antes'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Hoje'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Amanhã'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Ontem'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Células vazias'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtrar por condição'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtrar por valor'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'E'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Ou'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Selecionar tudo'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Limpar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancelar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Localizar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Valor'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Segundo valor'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n\n/******/ })[\"___\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/handsontable/languages/ru-RU.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 7);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n\n/***/ 7:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Alexey Rogachev\n                                                                                                                                                                                                                   * Last updated: Feb 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Russian - Russia language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ru-RU'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Вставить строку выше'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Вставить строку ниже'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Вставить столбец слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Вставить столбец справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Удалить строку', 'Удалить строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Удалить столбец', 'Удалить столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Отменить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Повторить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Очистить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Выравнивание'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'По левому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'По правому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'По ширине'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'По верхнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'По нижнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Закрепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Открепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Границы'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Сверху'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Снизу'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Удалить границу(ы)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Добавить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Редактировать комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Удалить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Комментарий только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Объединить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Разделить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Копировать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Вырезать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Вставить дочернюю строку'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Отделить от родителя'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Скрыть столбец', 'Скрыть столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Показать столбец', 'Показать столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Скрыть строку', 'Скрыть строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Показать строку', 'Показать строки']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Отсутствует'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Не пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Не равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Начинается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Заканчивается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Не содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Больше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Больше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Меньше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Меньше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Не между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'После'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'До'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Сегодня'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Завтра'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Вчера'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Пустые ячейки'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Фильтр по условию'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Фильтр по значению'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'И'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Или'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Выбрать все'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Убрать'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Отмена'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Поиск'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Значение'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Второе значение'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n\n/******/ })[\"___\"];\n});"
  },
  {
    "path": "example/pages/include/SheetJS/del/js/dropsheet.js",
    "content": "/* dropsheet.js (C) 2014-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n\nvar DropSheet = function DropSheet(opts) {\n\tif(!opts) opts = {};\n\tvar nullfunc = function(){};\n\tif(!opts.errors) opts.errors = {};\n\tif(!opts.errors.badfile) opts.errors.badfile = nullfunc;\n\tif(!opts.errors.pending) opts.errors.pending = nullfunc;\n\tif(!opts.errors.failed) opts.errors.failed = nullfunc;\n\tif(!opts.errors.large) opts.errors.large = nullfunc;\n\tif(!opts.on) opts.on = {};\n\tif(!opts.on.workstart) opts.on.workstart = nullfunc;\n\tif(!opts.on.workend) opts.on.workend = nullfunc;\n\tif(!opts.on.sheet) opts.on.sheet = nullfunc;\n\tif(!opts.on.wb) opts.on.wb = nullfunc;\n\n\tvar rABS = typeof FileReader !== 'undefined' && FileReader.prototype && FileReader.prototype.readAsBinaryString;\n\tvar useworker = typeof Worker !== 'undefined';\n\tvar pending = false;\n\tfunction fixdata(data) {\n\t\tvar o = \"\", l = 0, w = 10240;\n\t\tfor(; l<data.byteLength/w; ++l)\n\t\t\to+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));\n\t\to+=String.fromCharCode.apply(null, new Uint8Array(data.slice(o.length)));\n\t\treturn o;\n\t}\n\n\tfunction sheetjsw(data, cb, readtype) {\n\t\tpending = true;\n\t\topts.on.workstart();\n\t\tvar scripts = document.getElementsByTagName('script');\n\t\tvar dropsheetPath;\n\t\tfor (var i = 0; i < scripts.length; i++) {\n\t\t\tif (scripts[i].src.indexOf('dropsheet') != -1) {\n\t\t\t\tdropsheetPath = scripts[i].src.split('dropsheet.js')[0];\n\t\t\t}\n\t\t}\n\t\tvar worker = new Worker(dropsheetPath + 'sheetjsw.js');\n\t\tworker.onmessage = function(e) {\n\t\t\tswitch(e.data.t) {\n\t\t\t\tcase 'ready': break;\n\t\t\t\tcase 'e': pending = false; console.error(e.data.d); break;\n\t\t\t\tcase 'xlsx':\n\t\t\t\t\tpending = false;\n\t\t\t\t\topts.on.workend();\n\t\t\t\t\tcb(JSON.parse(e.data.d)); break;\n\t\t\t}\n\t\t};\n\t\tworker.postMessage({d:data,b:readtype,t:'xlsx'});\n\t}\n\n\tvar last_wb;\n\n\tfunction to_json(workbook) {\n\t\tif(useworker && workbook.SSF) XLSX.SSF.load_table(workbook.SSF);\n\t\tvar result = {};\n\t\tworkbook.SheetNames.forEach(function(sheetName) {\n\t\t\tvar roa = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName], {header:1});\n\t\t\tif(roa.length > 0) result[sheetName] = roa;\n\t\t});\n\t\treturn result;\n\t}\n\n\tfunction choose_sheet(sheetidx) { process_wb(last_wb, sheetidx); }\n\n\tfunction process_wb(wb, sheetidx) {\n\t\tlast_wb = wb;\n\t\topts.on.wb(wb, sheetidx);\n\t\tvar sheet = wb.SheetNames[sheetidx||0];\n\t\tvar json = to_json(wb)[sheet];\n\t\topts.on.sheet(json, wb.SheetNames, choose_sheet);\n\t}\n\n\tfunction handleDrop(e) {\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t\tif(pending) return opts.errors.pending();\n\t\tvar files = e.dataTransfer.files;\n\t\tvar i,f;\n\t\tfor (i = 0, f = files[i]; i != files.length; ++i) {\n\t\t\tvar reader = new FileReader();\n\t\t\tvar name = f.name;\n\t\t\treader.onload = function(e) {\n\t\t\t\tvar data = e.target.result;\n\t\t\t\tvar wb, arr;\n\t\t\t\tvar readtype = {type: rABS ? 'binary' : 'base64' };\n\t\t\t\tif(!rABS) {\n\t\t\t\t\tarr = fixdata(data);\n\t\t\t\t\tdata = btoa(arr);\n\t\t\t\t}\n\t\t\t\tfunction doit() {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif(useworker) { sheetjsw(data, process_wb, readtype); return; }\n\t\t\t\t\t\twb = XLSX.read(data, readtype);\n\t\t\t\t\t\tprocess_wb(wb);\n\t\t\t\t\t} catch(e) { console.log(e); opts.errors.failed(e); }\n\t\t\t\t}\n\n\t\t\t\tif(e.target.result.length > 1e6) opts.errors.large(e.target.result.length, function(e) { if(e) doit(); });\n\t\t\t\telse { doit(); }\n\t\t\t};\n\t\t\tif(rABS) reader.readAsBinaryString(f);\n\t\t\telse reader.readAsArrayBuffer(f);\n\t\t}\n\t}\n\n\tfunction handleDragover(e) {\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t\te.dataTransfer.dropEffect = 'copy';\n\t}\n\n\tif(opts.drop.addEventListener) {\n\t\topts.drop.addEventListener('dragenter', handleDragover, false);\n\t\topts.drop.addEventListener('dragover', handleDragover, false);\n\t\topts.drop.addEventListener('drop', handleDrop, false);\n\t}\n\n};\n"
  },
  {
    "path": "example/pages/include/SheetJS/del/js/main.js",
    "content": "/** drop target **/\nvar _target = document.getElementById('drop');\n\n/** Spinner **/\nvar spinner;\n\nvar _workstart = function() { spinner = new Spinner().spin(_target); }\nvar _workend = function() { spinner.stop(); }\n\n/** Alerts **/\nvar _badfile = function() {\n  alertify.alert('This file does not appear to be a valid Excel file.  If we made a mistake, please send this file to <a href=\"mailto:dev@sheetjs.com?subject=I+broke+your+stuff\">dev@sheetjs.com</a> so we can take a look.', function(){});\n};\n\nvar _pending = function() {\n  alertify.alert('Please wait until the current file is processed.', function(){});\n};\n\nvar _large = function(len, cb) {\n  alertify.confirm(\"This file is \" + len + \" bytes and may take a few moments.  Your browser may lock up during this process.  Shall we play?\", cb);\n};\n\nvar _failed = function(e) {\n  console.log(e, e.stack);\n  alertify.alert('We unfortunately dropped the ball here.  We noticed some issues with the grid recently, so please test the file using the <a href=\"/js-xlsx/\">raw parser</a>.  If there are issues with the file processor, please send this file to <a href=\"mailto:dev@sheetjs.com?subject=I+broke+your+stuff\">dev@sheetjs.com</a> so we can make things right.', function(){});\n};\n\n/** Handsontable magic **/\nvar boldRenderer = function (instance, td, row, col, prop, value, cellProperties) {\n  Handsontable.TextCell.renderer.apply(this, arguments);\n  $(td).css({'font-weight': 'bold'});\n};\n\nvar $container, $parent, $window, availableWidth, availableHeight;\nvar calculateSize = function () {\n  var offset = $container.offset();\n  availableWidth = Math.max($window.width() - 250,600);\n  availableHeight = Math.max($window.height() - 250, 400);\n};\n\n$(document).ready(function() {\n  $container = $(\"#hot\"); $parent = $container.parent();\n  $window = $(window);\n  $window.on('resize', calculateSize);\n});\n\n/* make the buttons for the sheets */\nvar make_buttons = function(sheetnames, cb) {\n  var $buttons = $('#buttons');\n  $buttons.html(\"\");\n  sheetnames.forEach(function(s,idx) {\n    var button= $('<button/>').attr({ type:'button', name:'btn' +idx, text:s });\n    button.append('<h3>' + s + '</h3>');\n    button.click(function() { cb(idx); });\n    $buttons.append(button);\n    $buttons.append('<br/>');\n  });\n};\n\nvar _onsheet = function(json, sheetnames, select_sheet_cb) {\n  //$('#footnote').hide();\n\n  make_buttons(sheetnames, select_sheet_cb);\n  calculateSize();\n\n  /* add header row for table */\n  if(!json) json = [];\n\tjson.forEach(function(r) { \n    if(json[0].length < r.length) json[0].length = r.length; \n  });\n  calculateSize();\n  /* showtime! */\n  $(\"#hot\").handsontable({\n    data: json,\n    startRows: 5,\n    startCols: 3,\n    stretchH: 'all',\n    rowHeaders: true,\n    colHeaders: true,\n    width: function () { return availableWidth; },\n    height: function () { return availableHeight; },\n    stretchH: 'all'\n  });\n};\n\n/** Drop it like it's hot **/\nDropSheet({\n  drop: _target,\n  on: {\n    workstart: _workstart,\n    workend: _workend,\n    sheet: _onsheet,\n    foo: 'bar'\n  },\n  errors: {\n    badfile: _badfile,\n    pending: _pending,\n    failed: _failed,\n    large: _large,\n    foo: 'bar'\n  }\n})\n"
  },
  {
    "path": "example/pages/include/SheetJS/del/js/sheetjsw.js",
    "content": "importScripts('xlsx.full.min.js');\npostMessage({t:'ready'});\nonmessage = function(evt) {\n  var v;\n  try { v = XLSX.read(evt.data.d, evt.data.b); }\n  catch(e) { postMessage({t:\"e\",d:e.stack}); }\n  postMessage({t:evt.data.t, d:JSON.stringify(v)});\n}\n"
  },
  {
    "path": "example/pages/include/SheetJS/del/js/shim.js",
    "content": "// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys\nif (!Object.keys) {\n  Object.keys = (function () {\n    var hasOwnProperty = Object.prototype.hasOwnProperty,\n        hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),\n        dontEnums = [\n          'toString',\n          'toLocaleString',\n          'valueOf',\n          'hasOwnProperty',\n          'isPrototypeOf',\n          'propertyIsEnumerable',\n          'constructor'\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    return function (obj) {\n      if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');\n\n      var result = [];\n\n      for (var prop in obj) {\n        if (hasOwnProperty.call(obj, prop)) result.push(prop);\n      }\n\n      if (hasDontEnumBug) {\n        for (var i=0; i < dontEnumsLength; i++) {\n          if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);\n        }\n      }\n      return result;\n    };\n  })();\n}\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter\nif (!Array.prototype.filter)\n{\n  Array.prototype.filter = function(fun /*, thisp */)\n  {\n    \"use strict\";\n\n    if (this == null)\n      throw new TypeError();\n\n    var t = Object(this);\n    var len = t.length >>> 0;\n    if (typeof fun != \"function\")\n      throw new TypeError();\n\n    var res = [];\n    var thisp = arguments[1];\n    for (var i = 0; i < len; i++)\n    {\n      if (i in t)\n      {\n        var val = t[i]; // in case fun mutates this\n        if (fun.call(thisp, val, i, t))\n          res.push(val);\n      }\n    }\n\n    return res;\n  };\n}\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim\nif (!String.prototype.trim) {\n  String.prototype.trim = function () {\n    return this.replace(/^\\s+|\\s+$/g, '');\n  };\n}\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach\nif (!Array.prototype.forEach)\n{\n  Array.prototype.forEach = function(fun /*, thisArg */)\n  {\n    \"use strict\";\n\n    if (this === void 0 || this === null)\n      throw new TypeError();\n\n    var t = Object(this);\n    var len = t.length >>> 0;\n    if (typeof fun !== \"function\")\n      throw new TypeError();\n\n    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n    for (var i = 0; i < len; i++)\n    {\n      if (i in t)\n        fun.call(thisArg, t[i], i, t);\n    }\n  };\n}\n\n// Production steps of ECMA-262, Edition 5, 15.4.4.19\n// Reference: http://es5.github.com/#x15.4.4.19\nif (!Array.prototype.map) {\n  Array.prototype.map = function(callback, thisArg) {\n\n    var T, A, k;\n\n    if (this == null) {\n      throw new TypeError(\" this is null or not defined\");\n    }\n\n    // 1. Let O be the result of calling ToObject passing the |this| value as the argument.\n    var O = Object(this);\n\n    // 2. Let lenValue be the result of calling the Get internal method of O with the argument \"length\".\n    // 3. Let len be ToUint32(lenValue).\n    var len = O.length >>> 0;\n\n    // 4. If IsCallable(callback) is false, throw a TypeError exception.\n    // See: http://es5.github.com/#x9.11\n    if (typeof callback !== \"function\") {\n      throw new TypeError(callback + \" is not a function\");\n    }\n\n    // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.\n    if (thisArg) {\n      T = thisArg;\n    }\n\n    // 6. Let A be a new array created as if by the expression new Array(len) where Array is\n    // the standard built-in constructor with that name and len is the value of len.\n    A = new Array(len);\n\n    // 7. Let k be 0\n    k = 0;\n\n    // 8. Repeat, while k < len\n    while(k < len) {\n\n      var kValue, mappedValue;\n\n      // a. Let Pk be ToString(k).\n      //   This is implicit for LHS operands of the in operator\n      // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.\n      //   This step can be combined with c\n      // c. If kPresent is true, then\n      if (k in O) {\n\n        // i. Let kValue be the result of calling the Get internal method of O with argument Pk.\n        kValue = O[ k ];\n\n        // ii. Let mappedValue be the result of calling the Call internal method of callback\n        // with T as the this value and argument list containing kValue, k, and O.\n        mappedValue = callback.call(T, kValue, k, O);\n\n        // iii. Call the DefineOwnProperty internal method of A with arguments\n        // Pk, Property Descriptor {Value: mappedValue, : true, Enumerable: true, Configurable: true},\n        // and false.\n\n        // In browsers that support Object.defineProperty, use the following:\n        // Object.defineProperty(A, Pk, { value: mappedValue, writable: true, enumerable: true, configurable: true });\n\n        // For best browser support, use the following:\n        A[ k ] = mappedValue;\n      }\n      // d. Increase k by 1.\n      k++;\n    }\n\n    // 9. return A\n    return A;\n  };\n}\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf\nif (!Array.prototype.indexOf) {\n  Array.prototype.indexOf = function (searchElement, fromIndex) {\n    if ( this === undefined || this === null ) {\n      throw new TypeError( '\"this\" is null or not defined' );\n    }\n\n    var length = this.length >>> 0; // Hack to convert object.length to a UInt32\n\n    fromIndex = +fromIndex || 0;\n\n    if (Math.abs(fromIndex) === Infinity) {\n      fromIndex = 0;\n    }\n\n    if (fromIndex < 0) {\n      fromIndex += length;\n      if (fromIndex < 0) {\n        fromIndex = 0;\n      }\n    }\n\n    for (;fromIndex < length; fromIndex++) {\n      if (this[fromIndex] === searchElement) {\n        return fromIndex;\n      }\n    }\n\n    return -1;\n  };\n}\n// Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray\n\nif (! Array.isArray) {\n    Array.isArray = function(obj) {\n        return Object.prototype.toString.call(obj) === \"[object Array]\";\n    };\n}\n\n// https://github.com/ttaubert/node-arraybuffer-slice\n// (c) 2013 Tim Taubert <tim@timtaubert.de>\n// arraybuffer-slice may be freely distributed under the MIT license.\n\n\"use strict\";\n\nif (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) {\n  ArrayBuffer.prototype.slice = function (begin, end) {\n    begin = (begin|0) || 0;\n    var num = this.byteLength;\n    end = end === (void 0) ? num : (end|0);\n\n    // Handle negative values.\n    if (begin < 0) begin += num;\n    if (end < 0) end += num;\n\n    if (num === 0 || begin >= num || begin >= end) {\n      return new ArrayBuffer(0);\n    }\n\n    var length = Math.min(num - begin, end - begin);\n    var target = new ArrayBuffer(length);\n    var targetArray = new Uint8Array(target);\n    targetArray.set(new Uint8Array(this, begin, length));\n    return target;\n  };\n}\n\n// https://github.com/davidchambers/Base64.js\n// (C) 2015 David Chambers\n// Base64.js may be freely distributed under the Apache 2.0 License.\n;(function () {\n\n  var object =\n    typeof exports != 'undefined' ? exports :\n    typeof self != 'undefined' ? self : // #8: web workers\n    $.global; // #31: ExtendScript\n\n  var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\n  function InvalidCharacterError(message) {\n    this.message = message;\n  }\n  InvalidCharacterError.prototype = new Error;\n  InvalidCharacterError.prototype.name = 'InvalidCharacterError';\n\n  // encoder\n  // [https://gist.github.com/999166] by [https://github.com/nignag]\n  object.btoa || (\n  object.btoa = function (input) {\n    var str = String(input);\n    for (\n      // initialize result and counter\n      var block, charCode, idx = 0, map = chars, output = '';\n      // if the next str index does not exist:\n      //   change the mapping table to \"=\"\n      //   check if d has no fractional digits\n      str.charAt(idx | 0) || (map = '=', idx % 1);\n      // \"8 - idx % 1 * 8\" generates the sequence 2, 4, 6, 8\n      output += map.charAt(63 & block >> 8 - idx % 1 * 8)\n    ) {\n      charCode = str.charCodeAt(idx += 3/4);\n      if (charCode > 0xFF) {\n        throw new InvalidCharacterError(\"'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.\");\n      }\n      block = block << 8 | charCode;\n    }\n    return output;\n  });\n\n  // decoder\n  // [https://gist.github.com/1020396] by [https://github.com/atk]\n  object.atob || (\n  object.atob = function (input) {\n    var str = String(input).replace(/[=]+$/, ''); // #31: ExtendScript bad parse of /=\n    if (str.length % 4 == 1) {\n      throw new InvalidCharacterError(\"'atob' failed: The string to be decoded is not correctly encoded.\");\n    }\n    for (\n      // initialize result and counters\n      var bc = 0, bs, buffer, idx = 0, output = '';\n      // get next character\n      buffer = str.charAt(idx++);\n      // character found in table? initialize bit storage and add its ascii value;\n      ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,\n        // and if not first of each 4 characters,\n        // convert the first 8 bits to one ascii character\n        bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0\n    ) {\n      // try to find character in table (0-63, not found => -1)\n      buffer = chars.indexOf(buffer);\n    }\n    return output;\n  });\n}());\n\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString\nif (!Date.prototype.toISOString) {\n  (function() {\n\n    function pad(number) {\n      if (number < 10) {\n        return '0' + number;\n      }\n      return number;\n    }\n\n    Date.prototype.toISOString = function() {\n      return this.getUTCFullYear() +\n        '-' + pad(this.getUTCMonth() + 1) +\n        '-' + pad(this.getUTCDate()) +\n        'T' + pad(this.getUTCHours()) +\n        ':' + pad(this.getUTCMinutes()) +\n        ':' + pad(this.getUTCSeconds()) +\n        '.' + (this.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) +\n        'Z';\n    };\n\n  }());\n}\n\n"
  },
  {
    "path": "example/pages/include/SheetJS/del/js/xhr-hack.js",
    "content": "var IEBinaryToArray_ByteStr_Script =\n   \"<!-- IEBinaryToArray_ByteStr -->\\r\\n\"+\n   \"<script type='text/vbscript'>\\r\\n\"+\n   \"Function IEBinaryToArray_ByteStr(Binary) : IEBinaryToArray_ByteStr = CStr(Binary) : End Function\\r\\n\"+\n   \"Function IEBinaryToArray_ByteStr_Last(Binary)\\r\\n\"+\n   \"   Dim lastIndex\\r\\n\"+\n   \"   lastIndex = LenB(Binary)\\r\\n\"+\n   \"   if lastIndex mod 2 Then\\r\\n\"+\n   \"       IEBinaryToArray_ByteStr_Last = Chr( AscB( MidB( Binary, lastIndex, 1 ) ) )\\r\\n\"+\n   \"   Else\\r\\n\"+\n   \"       IEBinaryToArray_ByteStr_Last = \"+'\"\"'+\"\\r\\n\"+\n   \"   End If\\r\\n\"+\n   \"End Function\\r\\n\"+\n   \"</script>\\r\\n\";\n\ndocument.write(IEBinaryToArray_ByteStr_Script);\n\n"
  },
  {
    "path": "example/pages/include/SheetJS/index.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <title>SheetJS Live Grid Demo</title>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n        <link rel=\"icon\" type=\"image/png\" href=\"assets/img/logo.png\" />\n        <link rel=\"stylesheet\" href=\"assets/css/sheetjs.css\">\n    </head>\n    <body>\n        <script src=\"assets/vendor/alertify.js\"></script>\n        <script src=\"assets/vendor/jquery.min.js\"></script>\n        <script src=\"assets/vendor/jquery.handsontable.full.js\"></script>\n\n        <link rel=\"stylesheet\" media=\"screen\" href=\"assets/vendor/jquery.handsontable.full.css\">\n        <link rel=\"stylesheet\" media=\"screen\" href=\"assets/vendor/samples.css\">\n        <link rel=\"stylesheet\" media=\"screen\" href=\"assets/vendor/alertify.css\">\n\n        <div id=\"body\">\n            <div id=\"left\">\n            <div id=\"drop\">Drop a file here</div>\n            <h3> Choose a worksheet:</h3>\n            <div id=\"buttons\"></div>\n        </div>\n        <div id=\"right\">\n            <div id=\"header\">\n                <pre id=\"out\"></pre>\n                <h2>SheetJS In-Browser Live Grid Demo</h2>\n            </div>\n            <div id=\"hot\" style=\"overflow: scroll\" class=\"handsontable\"></div>\n        </div>\n\n        <script src=\"assets/js/shim.js\"></script>\n        <script src=\"assets/js/xlsx.full.min.js\"></script>\n        <script src=\"assets/js/dropsheet.js\"></script>\n        <script src=\"assets/js/main.js\"></script>\n\n        <script src=\"assets/vendor/spin.js\"></script>\n    </body>\n</html>\n"
  },
  {
    "path": "example/pages/include/docx/jszip-utils.js",
    "content": "/*!\n\nJSZipUtils - A collection of cross-browser utilities to go along with JSZip.\n<http://stuk.github.io/jszip-utils>\n\n(c) 2014 Stuart Knightley, David Duponchel\nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip-utils/master/LICENSE.markdown.\n\n*/\n!function(e){\"object\"==typeof exports?module.exports=e():\"function\"==typeof define&&define.amd?define(e):\"undefined\"!=typeof window?window.JSZipUtils=e():\"undefined\"!=typeof global?global.JSZipUtils=e():\"undefined\"!=typeof self&&(self.JSZipUtils=e())}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error(\"Cannot find module '\"+o+\"'\")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n'use strict';\n\nvar JSZipUtils = {};\n// just use the responseText with xhr1, response with xhr2.\n// The transformation doesn't throw away high-order byte (with responseText)\n// because JSZip handles that case. If not used with JSZip, you may need to\n// do it, see https://developer.mozilla.org/En/Using_XMLHttpRequest#Handling_binary_data\nJSZipUtils._getBinaryFromXHR = function (xhr) {\n    // for xhr.responseText, the 0xFF mask is applied by JSZip\n    return xhr.response || xhr.responseText;\n};\n\n// taken from jQuery\nfunction createStandardXHR() {\n    try {\n        return new window.XMLHttpRequest();\n    } catch( e ) {}\n}\n\nfunction createActiveXHR() {\n    try {\n        return new window.ActiveXObject(\"Microsoft.XMLHTTP\");\n    } catch( e ) {}\n}\n\n// Create the request object\nvar createXHR = window.ActiveXObject ?\n    /* Microsoft failed to properly\n     * implement the XMLHttpRequest in IE7 (can't request local files),\n     * so we use the ActiveXObject when it is available\n     * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n     * we need a fallback.\n     */\n    function() {\n    return createStandardXHR() || createActiveXHR();\n} :\n    // For all other browsers, use the standard XMLHttpRequest object\n    createStandardXHR;\n\n\n\nJSZipUtils.getBinaryContent = function(path, callback) {\n    /*\n     * Here is the tricky part : getting the data.\n     * In firefox/chrome/opera/... setting the mimeType to 'text/plain; charset=x-user-defined'\n     * is enough, the result is in the standard xhr.responseText.\n     * cf https://developer.mozilla.org/En/XMLHttpRequest/Using_XMLHttpRequest#Receiving_binary_data_in_older_browsers\n     * In IE <= 9, we must use (the IE only) attribute responseBody\n     * (for binary data, its content is different from responseText).\n     * In IE 10, the 'charset=x-user-defined' trick doesn't work, only the\n     * responseType will work :\n     * http://msdn.microsoft.com/en-us/library/ie/hh673569%28v=vs.85%29.aspx#Binary_Object_upload_and_download\n     *\n     * I'd like to use jQuery to avoid this XHR madness, but it doesn't support\n     * the responseType attribute : http://bugs.jquery.com/ticket/11461\n     */\n    try {\n\n        var xhr = createXHR();\n\n        xhr.open('GET', path, true);\n\n        // recent browsers\n        if (\"responseType\" in xhr) {\n            xhr.responseType = \"arraybuffer\";\n        }\n\n        // older browser\n        if(xhr.overrideMimeType) {\n            xhr.overrideMimeType(\"text/plain; charset=x-user-defined\");\n        }\n\n        xhr.onreadystatechange = function(evt) {\n            var file, err;\n            // use `xhr` and not `this`... thanks IE\n            if (xhr.readyState === 4) {\n                if (xhr.status === 200 || xhr.status === 0) {\n                    file = null;\n                    err = null;\n                    try {\n                        file = JSZipUtils._getBinaryFromXHR(xhr);\n                    } catch(e) {\n                        err = new Error(e);\n                    }\n                    callback(err, file);\n                } else {\n                    callback(new Error(\"Ajax error for \" + path + \" : \" + this.status + \" \" + this.statusText), null);\n                }\n            }\n        };\n\n        xhr.send();\n\n    } catch (e) {\n        callback(new Error(e), null);\n    }\n};\n\n// export\nmodule.exports = JSZipUtils;\n\n// enforcing Stuk's coding style\n// vim: set shiftwidth=4 softtabstop=4:\n\n},{}]},{},[1])\n(1)\n});\n;"
  },
  {
    "path": "example/pages/include/docx/mammoth.browser.js",
    "content": "// Module: base64-js@1.2.0\n// License: MIT\n//\n// Module: bluebird@3.4.7\n// License: MIT\n//\n// Module: buffer-shims@1.0.0\n// License: MIT\n//\n// Module: buffer@4.9.1\n// License: MIT\n//\n// Module: core-util-is@1.0.2\n// License: MIT\n//\n// Module: events@1.1.1\n// License: MIT\n//\n// Module: ieee754@1.1.8\n// License: BSD-3-Clause\n//\n// Module: inherits@2.0.1\n// License: ISC\n//\n// Module: inherits@2.0.3\n// License: ISC\n//\n// Module: isarray@1.0.0\n// License: MIT\n//\n// Module: jszip@2.5.0\n// License: MIT or GPLv3\n//\n// Module: lop@0.4.0\n// License: BSD\n//\n// Module: mammoth@1.4.7\n// License: BSD-2-Clause\n//\n// Module: option@0.2.3\n// License: BSD\n//\n// Module: pako@0.2.9\n// License: MIT\n//\n// Module: path-browserify@0.0.0\n// License: MIT\n//\n// Module: process-nextick-args@1.0.7\n// License: MIT\n//\n// Module: process@0.11.9\n// License: MIT\n//\n// Module: readable-stream@2.2.6\n// License: MIT\n//\n// Module: sax@1.1.6\n// License: ISC\n//\n// Module: stream-browserify@2.0.1\n// License: MIT\n//\n// Module: string_decoder@0.10.31\n// License: MIT\n//\n// Module: underscore@1.4.4\n// License: MIT\n//\n// Module: underscore@1.8.3\n// License: MIT\n//\n// Module: util-deprecate@1.0.2\n// License: MIT\n//\n// Module: util@0.10.3\n// License: MIT\n//\n// Module: xmlbuilder@10.0.0\n// License: MIT\n//\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.mammoth = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\nvar promises = require(\"../../lib/promises\");\n\nexports.Files = Files;\n\n\nfunction Files() {\n    function read(uri) {\n        return promises.reject(new Error(\"could not open external image: '\" + uri + \"'\\ncannot open linked files from a web browser\"));\n    }\n    \n    return {\n        read: read\n    };\n}\n\n},{\"../../lib/promises\":23}],2:[function(require,module,exports){\nvar promises = require(\"../lib/promises\");\nvar zipfile = require(\"../lib/zipfile\");\n\nexports.openZip = openZip;\n\nfunction openZip(options) {\n    if (options.arrayBuffer) {\n        return promises.resolve(zipfile.openArrayBuffer(options.arrayBuffer));\n    } else {\n        return promises.reject(new Error(\"Could not find file in options\"));\n    }\n}\n\n},{\"../lib/promises\":23,\"../lib/zipfile\":38}],3:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar promises = require(\"./promises\");\nvar documents = require(\"./documents\");\nvar htmlPaths = require(\"./styles/html-paths\");\nvar results = require(\"./results\");\nvar images = require(\"./images\");\nvar Html = require(\"./html\");\nvar writers = require(\"./writers\");\n\nexports.DocumentConverter = DocumentConverter;\n\n\nfunction DocumentConverter(options) {\n    return {\n        convertToHtml: function(element) {\n            var comments = _.indexBy(\n                element.type === documents.types.document ? element.comments : [],\n                \"commentId\"\n            );\n            var conversion = new DocumentConversion(options, comments);\n            return conversion.convertToHtml(element);\n        }\n    };\n}\n\nfunction DocumentConversion(options, comments) {\n    var noteNumber = 1;\n    \n    var noteReferences = [];\n    \n    var referencedComments = [];\n    \n    options = _.extend({ignoreEmptyParagraphs: true}, options);\n    var idPrefix = options.idPrefix === undefined ? \"\" : options.idPrefix;\n    var ignoreEmptyParagraphs = options.ignoreEmptyParagraphs;\n    \n    var defaultParagraphStyle = htmlPaths.topLevelElement(\"p\");\n    \n    var styleMap = options.styleMap || [];\n    \n    function convertToHtml(document) {\n        var messages = [];\n        \n        var html = elementToHtml(document, messages, {});\n        \n        var deferredNodes = [];\n        walkHtml(html, function(node) {\n            if (node.type === \"deferred\") {\n                deferredNodes.push(node);\n            }\n        });\n        var deferredValues = {};\n        return promises.mapSeries(deferredNodes, function(deferred) {\n            return deferred.value().then(function(value) {\n                deferredValues[deferred.id] = value;\n            });\n        }).then(function() {\n            function replaceDeferred(nodes) {\n                return flatMap(nodes, function(node) {\n                    if (node.type === \"deferred\") {\n                        return deferredValues[node.id];\n                    } else if (node.children) {\n                        return [\n                            _.extend({}, node, {\n                                children: replaceDeferred(node.children)\n                            })\n                        ];\n                    } else {\n                        return [node];\n                    }\n                });\n            }\n            var writer = writers.writer({\n                prettyPrint: options.prettyPrint,\n                outputFormat: options.outputFormat\n            });\n            Html.write(writer, Html.simplify(replaceDeferred(html)));\n            return new results.Result(writer.asString(), messages);\n        });\n    }\n    \n    function convertElements(elements, messages, options) {\n        return flatMap(elements, function(element) {\n            return elementToHtml(element, messages, options);\n        });\n    }\n\n    function elementToHtml(element, messages, options) {\n        if (!options) {\n            throw new Error(\"options not set\");\n        }\n        var handler = elementConverters[element.type];\n        if (handler) {\n            return handler(element, messages, options);\n        } else {\n            return [];\n        }\n    }\n    \n    function convertParagraph(element, messages, options) {\n        return htmlPathForParagraph(element, messages).wrap(function() {\n            var content = convertElements(element.children, messages, options);\n            if (ignoreEmptyParagraphs) {\n                return content;\n            } else {\n                return [Html.forceWrite].concat(content);\n            }\n        });\n    }\n    \n    function htmlPathForParagraph(element, messages) {\n        var style = findStyle(element);\n        \n        if (style) {\n            return style.to;\n        } else {\n            if (element.styleId) {\n                messages.push(unrecognisedStyleWarning(\"paragraph\", element));\n            }\n            return defaultParagraphStyle;\n        }\n    }\n    \n    function convertRun(run, messages, options) {\n        var nodes = function() {\n            return convertElements(run.children, messages, options);\n        };\n        var paths = [];\n        if (run.isSmallCaps) {\n            paths.push(findHtmlPathForRunProperty(\"smallCaps\"));\n        }\n        if (run.isStrikethrough) {\n            paths.push(findHtmlPathForRunProperty(\"strikethrough\", \"s\"));\n        }\n        if (run.isUnderline) {\n            paths.push(findHtmlPathForRunProperty(\"underline\"));\n        }\n        if (run.verticalAlignment === documents.verticalAlignment.subscript) {\n            paths.push(htmlPaths.element(\"sub\", {}, {fresh: false}));\n        }\n        if (run.verticalAlignment === documents.verticalAlignment.superscript) {\n            paths.push(htmlPaths.element(\"sup\", {}, {fresh: false}));\n        }\n        if (run.isItalic) {\n            paths.push(findHtmlPathForRunProperty(\"italic\", \"em\"));\n        }\n        if (run.isBold) {\n            paths.push(findHtmlPathForRunProperty(\"bold\", \"strong\"));\n        }\n        var stylePath = htmlPaths.empty;\n        var style = findStyle(run);\n        if (style) {\n            stylePath = style.to;\n        } else if (run.styleId) {\n            messages.push(unrecognisedStyleWarning(\"run\", run));\n        }\n        paths.push(stylePath);\n            \n        paths.forEach(function(path) {\n            nodes = path.wrap.bind(path, nodes);\n        });\n        \n        return nodes();\n    }\n    \n    function findHtmlPathForRunProperty(elementType, defaultTagName) {\n        var path = findHtmlPath({type: elementType});\n        if (path) {\n            return path;\n        } else if (defaultTagName) {\n            return htmlPaths.element(defaultTagName, {}, {fresh: false});\n        } else {\n            return htmlPaths.empty;\n        }\n    }\n    \n    function findHtmlPath(element, defaultPath) {\n        var style = findStyle(element);\n        return style ? style.to : defaultPath;\n    }\n    \n    function findStyle(element) {\n        for (var i = 0; i < styleMap.length; i++) {\n            if (styleMap[i].from.matches(element)) {\n                return styleMap[i];\n            }\n        }\n    }\n    \n    function recoveringConvertImage(convertImage) {\n        return function(image, messages) {\n            return promises.attempt(function() {\n                return convertImage(image, messages);\n            }).caught(function(error) {\n                messages.push(results.error(error));\n                return [];\n            });\n        };\n    }\n\n    function noteHtmlId(note) {\n        return referentHtmlId(note.noteType, note.noteId);\n    }\n    \n    function noteRefHtmlId(note) {\n        return referenceHtmlId(note.noteType, note.noteId);\n    }\n    \n    function referentHtmlId(referenceType, referenceId) {\n        return htmlId(referenceType + \"-\" + referenceId);\n    }\n    \n    function referenceHtmlId(referenceType, referenceId) {\n        return htmlId(referenceType + \"-ref-\" + referenceId);\n    }\n    \n    function htmlId(suffix) {\n        return idPrefix + suffix;\n    }\n    \n    var defaultTablePath = htmlPaths.elements([\n        htmlPaths.element(\"table\", {}, {fresh: true})\n    ]);\n\n    function convertTable(element, messages, options) {\n        return findHtmlPath(element, defaultTablePath).wrap(function() {\n            return convertTableChildren(element, messages, options);\n        });\n    }\n\n    function convertTableChildren(element, messages, options) {\n        var bodyIndex = _.findIndex(element.children, function(child) {\n            return !child.type === documents.types.tableRow || !child.isHeader;\n        });\n        if (bodyIndex === -1) {\n            bodyIndex = element.children.length;\n        }\n        var children;\n        if (bodyIndex === 0) {\n            children = convertElements(\n                element.children,\n                messages,\n                _.extend({}, options, {isTableHeader: false})\n            );\n        } else {\n            var headRows = convertElements(\n                element.children.slice(0, bodyIndex),\n                messages,\n                _.extend({}, options, {isTableHeader: true})\n            );\n            var bodyRows = convertElements(\n                element.children.slice(bodyIndex),\n                messages,\n                _.extend({}, options, {isTableHeader: false})\n            );\n            children = [\n                Html.freshElement(\"thead\", {}, headRows),\n                Html.freshElement(\"tbody\", {}, bodyRows)\n            ];\n        }\n        return [Html.forceWrite].concat(children);\n    }\n    \n    function convertTableRow(element, messages, options) {\n        return wrapChildrenInFreshElement(element, \"tr\", messages, options);\n    }\n    \n    function convertTableCell(element, messages, options) {\n        var tagName = options.isTableHeader ? \"th\" : \"td\";\n        var children = convertElements(element.children, messages, options);\n        var attributes = {};\n        if (element.colSpan !== 1) {\n            attributes.colspan = element.colSpan.toString();\n        }\n        if (element.rowSpan !== 1) {\n            attributes.rowspan = element.rowSpan.toString();\n        }\n            \n        return [\n            Html.freshElement(tagName, attributes, [Html.forceWrite].concat(children))\n        ];\n    }\n    \n    function convertCommentReference(reference, messages, options) {\n        return findHtmlPath(reference, htmlPaths.ignore).wrap(function() {\n            var comment = comments[reference.commentId];\n            var count = referencedComments.length + 1;\n            var label = \"[\" + commentAuthorLabel(comment) + count + \"]\";\n            referencedComments.push({label: label, comment: comment});\n            // TODO: remove duplication with note references\n            return [\n                Html.freshElement(\"a\", {\n                    href: \"#\" + referentHtmlId(\"comment\", reference.commentId),\n                    id: referenceHtmlId(\"comment\", reference.commentId)\n                }, [Html.text(label)])\n            ];\n        });\n    }\n    \n    function convertComment(referencedComment, messages, options) {\n        // TODO: remove duplication with note references\n        \n        var label = referencedComment.label;\n        var comment = referencedComment.comment;\n        var body = convertElements(comment.body, messages, options).concat([\n            Html.nonFreshElement(\"p\", {}, [\n                Html.text(\" \"),\n                Html.freshElement(\"a\", {\"href\": \"#\" + referenceHtmlId(\"comment\", comment.commentId)}, [\n                    Html.text(\"↑\")\n                ])\n            ])\n        ]);\n        \n        return [\n            Html.freshElement(\n                \"dt\",\n                {\"id\": referentHtmlId(\"comment\", comment.commentId)},\n                [Html.text(\"Comment \" + label)]\n            ),\n            Html.freshElement(\"dd\", {}, body)\n        ];\n    }\n    \n    function convertBreak(element, messages, options) {\n        return htmlPathForBreak(element).wrap(function() {\n            return [];\n        });\n    }\n    \n    function htmlPathForBreak(element) {\n        var style = findStyle(element);\n        if (style) {\n            return style.to;\n        } else if (element.breakType === \"line\") {\n            return htmlPaths.topLevelElement(\"br\");\n        } else {\n            return htmlPaths.empty;\n        }\n    }\n    \n    function wrapChildrenInFreshElement(element, wrapElementName, messages, options) {\n        var children = convertElements(element.children, messages, options);\n        return [\n            Html.freshElement(wrapElementName, {}, [Html.forceWrite].concat(children))\n        ];\n    }\n\n    var elementConverters = {\n        \"document\": function(document, messages, options) {\n            var children = convertElements(document.children, messages, options);\n            var notes = noteReferences.map(function(noteReference) {\n                return document.notes.resolve(noteReference);\n            });\n            var notesNodes = convertElements(notes, messages, options);\n            return children.concat([\n                Html.freshElement(\"ol\", {}, notesNodes),\n                Html.freshElement(\"dl\", {}, flatMap(referencedComments, function(referencedComment) {\n                    return convertComment(referencedComment, messages, options);\n                }))\n            ]);\n        },\n        \"paragraph\": convertParagraph,\n        \"run\": convertRun,\n        \"text\": function(element, messages, options) {\n            return [Html.text(element.value)];\n        },\n        \"tab\": function(element, messages, options) {\n            return [Html.text(\"\\t\")];\n        },\n        \"hyperlink\": function(element, messages, options) {\n            var href = element.anchor ? \"#\" + htmlId(element.anchor) : element.href;\n            var attributes = {href: href};\n            if (element.targetFrame != null) {\n                attributes.target = element.targetFrame;\n            }\n\n            var children = convertElements(element.children, messages, options);\n            return [Html.freshElement(\"a\", attributes, children)];\n        },\n        \"bookmarkStart\": function(element, messages, options) {\n            var anchor = Html.freshElement(\"a\", {\n                id: htmlId(element.name)\n            }, [Html.forceWrite]);\n            return [anchor];\n        },\n        \"noteReference\": function(element, messages, options) {\n            noteReferences.push(element);\n            var anchor = Html.freshElement(\"a\", {\n                href: \"#\" + noteHtmlId(element),\n                id: noteRefHtmlId(element)\n            }, [Html.text(\"[\" + (noteNumber++) + \"]\")]);\n            \n            return [Html.freshElement(\"sup\", {}, [anchor])];\n        },\n        \"note\": function(element, messages, options) {\n            var children = convertElements(element.body, messages, options);\n            var backLink = Html.elementWithTag(htmlPaths.element(\"p\", {}, {fresh: false}), [\n                Html.text(\" \"),\n                Html.freshElement(\"a\", {href: \"#\" + noteRefHtmlId(element)}, [Html.text(\"↑\")])\n            ]);\n            var body = children.concat([backLink]);\n            \n            return Html.freshElement(\"li\", {id: noteHtmlId(element)}, body);\n        },\n        \"commentReference\": convertCommentReference,\n        \"comment\": convertComment,\n        \"image\": deferredConversion(recoveringConvertImage(options.convertImage || images.dataUri)),\n        \"table\": convertTable,\n        \"tableRow\": convertTableRow,\n        \"tableCell\": convertTableCell,\n        \"break\": convertBreak\n    };\n    return {\n        convertToHtml: convertToHtml\n    };\n}\n\nvar deferredId = 1;\n\nfunction deferredConversion(func) {\n    return function(element, messages, options) {\n        return [\n            {\n                type: \"deferred\",\n                id: deferredId++,\n                value: function() {\n                    return func(element, messages, options);\n                }\n            }\n        ];\n    };\n}\n\nfunction unrecognisedStyleWarning(type, element) {\n    return results.warning(\n        \"Unrecognised \" + type + \" style: '\" + element.styleName + \"'\" +\n        \" (Style ID: \" + element.styleId + \")\"\n    );\n}\n\nfunction flatMap(values, func) {\n    return _.flatten(values.map(func), true);\n}\n\nfunction walkHtml(nodes, callback) {\n    nodes.forEach(function(node) {\n        callback(node);\n        if (node.children) {\n            walkHtml(node.children, callback);\n        }\n    });\n}\n\nvar commentAuthorLabel = exports.commentAuthorLabel = function commentAuthorLabel(comment) {\n    return comment.authorInitials || \"\";\n};\n\n},{\"./documents\":4,\"./html\":18,\"./images\":20,\"./promises\":23,\"./results\":24,\"./styles/html-paths\":27,\"./writers\":32,\"underscore\":153}],4:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar types = exports.types = {\n    document: \"document\",\n    paragraph: \"paragraph\",\n    run: \"run\",\n    text: \"text\",\n    tab: \"tab\",\n    hyperlink: \"hyperlink\",\n    noteReference: \"noteReference\",\n    image: \"image\",\n    note: \"note\",\n    commentReference: \"commentReference\",\n    comment: \"comment\",\n    table: \"table\",\n    tableRow: \"tableRow\",\n    tableCell: \"tableCell\",\n    \"break\": \"break\",\n    bookmarkStart: \"bookmarkStart\"\n};\n\nfunction Document(children, options) {\n    options = options || {};\n    return {\n        type: types.document,\n        children: children,\n        notes: options.notes || new Notes({}),\n        comments: options.comments || []\n    };\n}\n\nfunction Paragraph(children, properties) {\n    properties = properties || {};\n    var indent = properties.indent || {};\n    return {\n        type: types.paragraph,\n        children: children,\n        styleId: properties.styleId || null,\n        styleName: properties.styleName || null,\n        numbering: properties.numbering || null,\n        alignment: properties.alignment || null,\n        indent: {\n            start: indent.start || null,\n            end: indent.end || null,\n            firstLine: indent.firstLine || null,\n            hanging: indent.hanging || null\n        }\n    };\n}\n\nfunction Run(children, properties) {\n    properties = properties || {};\n    return {\n        type: types.run,\n        children: children,\n        styleId: properties.styleId || null,\n        styleName: properties.styleName || null,\n        isBold: properties.isBold,\n        isUnderline: properties.isUnderline,\n        isItalic: properties.isItalic,\n        isStrikethrough: properties.isStrikethrough,\n        isSmallCaps: properties.isSmallCaps,\n        verticalAlignment: properties.verticalAlignment || verticalAlignment.baseline,\n        font: properties.font || null\n    };\n}\n\nvar verticalAlignment = {\n    baseline: \"baseline\",\n    superscript: \"superscript\",\n    subscript: \"subscript\"\n};\n\nfunction Text(value) {\n    return {\n        type: types.text,\n        value: value\n    };\n}\n\nfunction Tab() {\n    return {\n        type: types.tab\n    };\n}\n\nfunction Hyperlink(children, options) {\n    return {\n        type: types.hyperlink,\n        children: children,\n        href: options.href,\n        anchor: options.anchor,\n        targetFrame: options.targetFrame\n    };\n}\n\nfunction NoteReference(options) {\n    return {\n        type: types.noteReference,\n        noteType: options.noteType,\n        noteId: options.noteId\n    };\n}\n\nfunction Notes(notes) {\n    this._notes = _.indexBy(notes, function(note) {\n        return noteKey(note.noteType, note.noteId);\n    });\n}\n\nNotes.prototype.resolve = function(reference) {\n    return this.findNoteByKey(noteKey(reference.noteType, reference.noteId));\n};\n\nNotes.prototype.findNoteByKey = function(key) {\n    return this._notes[key] || null;\n};\n\nfunction Note(options) {\n    return {\n        type: types.note,\n        noteType: options.noteType,\n        noteId: options.noteId,\n        body: options.body\n    };\n}\n\nfunction commentReference(options) {\n    return {\n        type: types.commentReference,\n        commentId: options.commentId\n    };\n}\n\nfunction comment(options) {\n    return {\n        type: types.comment,\n        commentId: options.commentId,\n        body: options.body,\n        authorName: options.authorName,\n        authorInitials: options.authorInitials\n    };\n}\n\nfunction noteKey(noteType, id) {\n    return noteType + \"-\" + id;\n}\n\nfunction Image(options) {\n    return {\n        type: types.image,\n        read: options.readImage,\n        altText: options.altText,\n        contentType: options.contentType\n    };\n}\n\nfunction Table(children, properties) {\n    properties = properties || {};\n    return {\n        type: types.table,\n        children: children,\n        styleId: properties.styleId || null,\n        styleName: properties.styleName || null\n    };\n}\n\nfunction TableRow(children, options) {\n    options = options || {};\n    return {\n        type: types.tableRow,\n        children: children,\n        isHeader: options.isHeader || false\n    };\n}\n\nfunction TableCell(children, options) {\n    options = options || {};\n    return {\n        type: types.tableCell,\n        children: children,\n        colSpan: options.colSpan == null ? 1 : options.colSpan,\n        rowSpan: options.rowSpan == null ? 1 : options.rowSpan\n    };\n}\n\nfunction Break(breakType) {\n    return {\n        type: types[\"break\"],\n        breakType: breakType\n    };\n}\n\nfunction BookmarkStart(options) {\n    return {\n        type: types.bookmarkStart,\n        name: options.name\n    };\n}\n\nexports.document = exports.Document = Document;\nexports.paragraph = exports.Paragraph = Paragraph;\nexports.run = exports.Run = Run;\nexports.Text = Text;\nexports.tab = exports.Tab = Tab;\nexports.Hyperlink = Hyperlink;\nexports.noteReference = exports.NoteReference = NoteReference;\nexports.Notes = Notes;\nexports.Note = Note;\nexports.commentReference = commentReference;\nexports.comment = comment;\nexports.Image = Image;\nexports.Table = Table;\nexports.TableRow = TableRow;\nexports.TableCell = TableCell;\nexports.lineBreak = Break(\"line\");\nexports.pageBreak = Break(\"page\");\nexports.columnBreak = Break(\"column\");\nexports.BookmarkStart = BookmarkStart;\n\nexports.verticalAlignment = verticalAlignment;\n\n},{\"underscore\":153}],5:[function(require,module,exports){\nexports.createBodyReader = createBodyReader;\nexports._readNumberingProperties = readNumberingProperties;\n\nvar _ = require(\"underscore\");\n\nvar documents = require(\"../documents\");\nvar Result = require(\"../results\").Result;\nvar warning = require(\"../results\").warning;\nvar uris = require(\"./uris\");\n\nfunction createBodyReader(options) {\n    return {\n        readXmlElement: function(element) {\n            return new BodyReader(options).readXmlElement(element);\n        },\n        readXmlElements: function(elements) {\n            return new BodyReader(options).readXmlElements(elements);\n        }\n    };\n}\n\nfunction BodyReader(options) {\n    var complexFieldStack = [];\n    var currentInstrText = [];\n    var relationships = options.relationships;\n    var contentTypes = options.contentTypes;\n    var docxFile = options.docxFile;\n    var files = options.files;\n    var numbering = options.numbering;\n    var styles = options.styles;\n\n    function readXmlElements(elements) {\n        var results = elements.map(readXmlElement);\n        return combineResults(results);\n    }\n\n    function readXmlElement(element) {\n        if (element.type === \"element\") {\n            var handler = xmlElementReaders[element.name];\n            if (handler) {\n                return handler(element);\n            } else if (!Object.prototype.hasOwnProperty.call(ignoreElements, element.name)) {\n                var message = warning(\"An unrecognised element was ignored: \" + element.name);\n                return emptyResultWithMessages([message]);\n            }\n        }\n        return emptyResult();\n    }\n    \n    function readParagraphIndent(element) {\n        return {\n            start: element.attributes[\"w:start\"] || element.attributes[\"w:left\"],\n            end: element.attributes[\"w:end\"] || element.attributes[\"w:right\"],\n            firstLine: element.attributes[\"w:firstLine\"],\n            hanging: element.attributes[\"w:hanging\"]\n        };\n    }\n    \n    function readRunProperties(element) {\n        return readRunStyle(element).map(function(style) {\n            return {\n                type: \"runProperties\",\n                styleId: style.styleId,\n                styleName: style.name,\n                verticalAlignment: element.firstOrEmpty(\"w:vertAlign\").attributes[\"w:val\"],\n                font: element.firstOrEmpty(\"w:rFonts\").attributes[\"w:ascii\"],\n                isBold: readBooleanElement(element.first(\"w:b\")),\n                isUnderline: readBooleanElement(element.first(\"w:u\")),\n                isItalic: readBooleanElement(element.first(\"w:i\")),\n                isStrikethrough: readBooleanElement(element.first(\"w:strike\")),\n                isSmallCaps: readBooleanElement(element.first(\"w:smallCaps\"))\n            };\n        });\n    }\n    \n    function readBooleanElement(element) {\n        if (element) {\n            var value = element.attributes[\"w:val\"];\n            return value !== \"false\" && value !== \"0\";\n        } else {\n            return false;\n        }\n    }\n    \n    function readParagraphStyle(element) {\n        return readStyle(element, \"w:pStyle\", \"Paragraph\", styles.findParagraphStyleById);\n    }\n    \n    function readRunStyle(element) {\n        return readStyle(element, \"w:rStyle\", \"Run\", styles.findCharacterStyleById);\n    }\n    \n    function readTableStyle(element) {\n        return readStyle(element, \"w:tblStyle\", \"Table\", styles.findTableStyleById);\n    }\n    \n    function readStyle(element, styleTagName, styleType, findStyleById) {\n        var messages = [];\n        var styleElement = element.first(styleTagName);\n        var styleId = null;\n        var name = null;\n        if (styleElement) {\n            styleId = styleElement.attributes[\"w:val\"];\n            if (styleId) {\n                var style = findStyleById(styleId);\n                if (style) {\n                    name = style.name;\n                } else {\n                    messages.push(undefinedStyleWarning(styleType, styleId));\n                }\n            }\n        }\n        return elementResultWithMessages({styleId: styleId, name: name}, messages);\n    }\n    \n    var unknownComplexField = {type: \"unknown\"};\n    \n    function readFldChar(element) {\n        var type = element.attributes[\"w:fldCharType\"];\n        if (type === \"begin\") {\n            complexFieldStack.push(unknownComplexField);\n            currentInstrText = [];\n        } else if (type === \"end\") {\n            complexFieldStack.pop();\n        } else if (type === \"separate\") {\n            var href = parseHyperlinkFieldCode(currentInstrText.join(''));\n            var complexField = href === null ? unknownComplexField : {type: \"hyperlink\", href: href};\n            complexFieldStack.pop();\n            complexFieldStack.push(complexField);\n        }\n        return emptyResult();\n    }\n    \n    function currentHyperlinkHref() {\n        var topHyperlink = _.last(complexFieldStack.filter(function(complexField) {\n            return complexField.type === \"hyperlink\";\n        }));\n        return topHyperlink ? topHyperlink.href : null;\n    }\n\n    function parseHyperlinkFieldCode(code) {\n        var result = /\\s*HYPERLINK \"(.*)\"/.exec(code);\n        if (result) {\n            return result[1];\n        } else {\n            return null;\n        }\n    }\n    \n    function readInstrText(element) {\n        currentInstrText.push(element.text());\n        return emptyResult();\n    }\n    \n    function noteReferenceReader(noteType) {\n        return function(element) {\n            var noteId = element.attributes[\"w:id\"];\n            return elementResult(new documents.NoteReference({\n                noteType: noteType,\n                noteId: noteId\n            }));\n        };\n    }\n    \n    function readCommentReference(element) {\n        return elementResult(documents.commentReference({\n            commentId: element.attributes[\"w:id\"]\n        }));\n    }\n    \n    function readChildElements(element) {\n        return readXmlElements(element.children);\n    }\n    \n    var xmlElementReaders = {\n        \"w:p\": function(element) {\n            return readXmlElements(element.children)\n                .map(function(children) {\n                    var properties = _.find(children, isParagraphProperties);\n                    return new documents.Paragraph(\n                        children.filter(negate(isParagraphProperties)),\n                        properties\n                    );\n                })\n                .insertExtra();\n        },\n        \"w:pPr\": function(element) {\n            return readParagraphStyle(element).map(function(style) {\n                return {\n                    type: \"paragraphProperties\",\n                    styleId: style.styleId,\n                    styleName: style.name,\n                    alignment: element.firstOrEmpty(\"w:jc\").attributes[\"w:val\"],\n                    numbering: readNumberingProperties(element.firstOrEmpty(\"w:numPr\"), numbering),\n                    indent: readParagraphIndent(element.firstOrEmpty(\"w:ind\"))\n                };\n            });\n        },\n        \"w:r\": function(element) {\n            return readXmlElements(element.children)\n                .map(function(children) {\n                    var properties = _.find(children, isRunProperties);\n                    children = children.filter(negate(isRunProperties));\n\n                    var hyperlinkHref = currentHyperlinkHref();\n                    if (hyperlinkHref !== null) {\n                        children = [new documents.Hyperlink(children, {href: hyperlinkHref})];\n                    }\n\n                    return new documents.Run(children, properties);\n                });\n        },\n        \"w:rPr\": readRunProperties,\n        \"w:fldChar\": readFldChar,\n        \"w:instrText\": readInstrText,\n        \"w:t\": function(element) {\n            return elementResult(new documents.Text(element.text()));\n        },\n        \"w:tab\": function(element) {\n            return elementResult(new documents.Tab());\n        },\n        \"w:noBreakHyphen\": function() {\n            return elementResult(new documents.Text(\"\\u2011\"));\n        },\n        \"w:hyperlink\": function(element) {\n            var relationshipId = element.attributes[\"r:id\"];\n            var anchor = element.attributes[\"w:anchor\"];\n            return readXmlElements(element.children).map(function(children) {\n                function create(options) {\n                    var targetFrame = element.attributes[\"w:tgtFrame\"] || null;\n                    \n                    return new documents.Hyperlink(\n                        children,\n                        _.extend({targetFrame: targetFrame}, options)\n                    );\n                }\n                \n                if (relationshipId) {\n                    var href = relationships.findTargetByRelationshipId(relationshipId);\n                    if (anchor) {\n                        href = uris.replaceFragment(href, anchor);\n                    }\n                    return create({href: href});\n                } else if (anchor) {\n                    return create({anchor: anchor});\n                } else {\n                    return children;\n                }\n            });\n        },\n        \"w:tbl\": readTable,\n        \"w:tr\": readTableRow,\n        \"w:tc\": readTableCell,\n        \"w:footnoteReference\": noteReferenceReader(\"footnote\"),\n        \"w:endnoteReference\": noteReferenceReader(\"endnote\"),\n        \"w:commentReference\": readCommentReference,\n        \"w:br\": function(element) {\n            var breakType = element.attributes[\"w:type\"];\n            if (breakType == null || breakType === \"textWrapping\") {\n                return elementResult(documents.lineBreak);\n            } else if (breakType === \"page\") {\n                return elementResult(documents.pageBreak);\n            } else if (breakType === \"column\") {\n                return elementResult(documents.columnBreak);\n            } else {\n                return emptyResultWithMessages([warning(\"Unsupported break type: \" + breakType)]);\n            }\n        },\n        \"w:bookmarkStart\": function(element){\n            var name = element.attributes[\"w:name\"];\n            if (name === \"_GoBack\") {\n                return emptyResult();\n            } else {\n                return elementResult(new documents.BookmarkStart({name: name}));\n            }\n        },\n        \n        \"mc:AlternateContent\": function(element) {\n            return readChildElements(element.first(\"mc:Fallback\"));\n        },\n        \n        \"w:sdt\": function(element) {\n            return readXmlElements(element.firstOrEmpty(\"w:sdtContent\").children);\n        },\n\n        \"w:ins\": readChildElements,\n        \"w:object\": readChildElements,\n        \"w:smartTag\": readChildElements,\n        \"w:drawing\": readChildElements,\n        \"w:pict\": function(element) {\n            return readChildElements(element).toExtra();\n        },\n        \"v:roundrect\": readChildElements,\n        \"v:shape\": readChildElements,\n        \"v:textbox\": readChildElements,\n        \"w:txbxContent\": readChildElements,\n        \"wp:inline\": readDrawingElement,\n        \"wp:anchor\": readDrawingElement,\n        \"v:imagedata\": readImageData,\n        \"v:group\": readChildElements,\n        \"v:rect\": readChildElements\n    };\n    \n    return {\n        readXmlElement: readXmlElement,\n        readXmlElements: readXmlElements\n    };\n\n    \n    function readTable(element) {\n        var propertiesResult = readTableProperties(element.firstOrEmpty(\"w:tblPr\"));\n        return readXmlElements(element.children)\n            .flatMap(calculateRowSpans)\n            .flatMap(function(children) {\n                return propertiesResult.map(function(properties) {\n                    return documents.Table(children, properties);\n                });\n            });\n    }\n    \n    function readTableProperties(element) {\n        return readTableStyle(element).map(function(style) {\n            return {\n                styleId: style.styleId,\n                styleName: style.name\n            };\n        });\n    }\n    \n    function readTableRow(element) {\n        var properties = element.firstOrEmpty(\"w:trPr\");\n        var isHeader = !!properties.first(\"w:tblHeader\");\n        return readXmlElements(element.children).map(function(children) {\n            return documents.TableRow(children, {isHeader: isHeader});\n        });\n    }\n    \n    function readTableCell(element) {\n        return readXmlElements(element.children).map(function(children) {\n            var properties = element.firstOrEmpty(\"w:tcPr\");\n            \n            var gridSpan = properties.firstOrEmpty(\"w:gridSpan\").attributes[\"w:val\"];\n            var colSpan = gridSpan ? parseInt(gridSpan, 10) : 1;\n            \n            var cell = documents.TableCell(children, {colSpan: colSpan});\n            cell._vMerge = readVMerge(properties);\n            return cell;\n        });\n    }\n    \n    function readVMerge(properties) {\n        var element = properties.first(\"w:vMerge\");\n        if (element) {\n            var val = element.attributes[\"w:val\"];\n            return val === \"continue\" || !val;\n        } else {\n            return null;\n        }\n    }\n    \n    function calculateRowSpans(rows) {\n        var unexpectedNonRows = _.any(rows, function(row) {\n            return row.type !== documents.types.tableRow;\n        });\n        if (unexpectedNonRows) {\n            return elementResultWithMessages(rows, [warning(\n                \"unexpected non-row element in table, cell merging may be incorrect\"\n            )]);\n        }\n        var unexpectedNonCells = _.any(rows, function(row) {\n            return _.any(row.children, function(cell) {\n                return cell.type !== documents.types.tableCell;\n            });\n        });\n        if (unexpectedNonCells) {\n            return elementResultWithMessages(rows, [warning(\n                \"unexpected non-cell element in table row, cell merging may be incorrect\"\n            )]);\n        }\n        \n        var columns = {};\n        \n        rows.forEach(function(row) {\n            var cellIndex = 0;\n            row.children.forEach(function(cell) {\n                if (cell._vMerge && columns[cellIndex]) {\n                    columns[cellIndex].rowSpan++;\n                } else {\n                    columns[cellIndex] = cell;\n                    cell._vMerge = false;\n                }\n                cellIndex += cell.colSpan;\n            });\n        });\n        \n        rows.forEach(function(row) {\n            row.children = row.children.filter(function(cell) {\n                return !cell._vMerge;\n            });\n            row.children.forEach(function(cell) {\n                delete cell._vMerge;\n            });\n        });\n        \n        return elementResult(rows);\n    }\n\n    function readDrawingElement(element) {\n        var blips = element\n            .getElementsByTagName(\"a:graphic\")\n            .getElementsByTagName(\"a:graphicData\")\n            .getElementsByTagName(\"pic:pic\")\n            .getElementsByTagName(\"pic:blipFill\")\n            .getElementsByTagName(\"a:blip\");\n        \n        return combineResults(blips.map(readBlip.bind(null, element)));\n    }\n    \n    function readBlip(element, blip) {\n        var properties = element.first(\"wp:docPr\").attributes;\n        var altText = isBlank(properties.descr) ? properties.title : properties.descr;\n        return readImage(findBlipImageFile(blip), altText);\n    }\n    \n    function isBlank(value) {\n        return value == null || /^\\s*$/.test(value);\n    }\n    \n    function findBlipImageFile(blip) {\n        var embedRelationshipId = blip.attributes[\"r:embed\"];\n        var linkRelationshipId = blip.attributes[\"r:link\"];\n        if (embedRelationshipId) {\n            return findEmbeddedImageFile(embedRelationshipId);\n        } else {\n            var imagePath = relationships.findTargetByRelationshipId(linkRelationshipId);\n            return {\n                path: imagePath,\n                read: files.read.bind(files, imagePath)\n            };\n        }\n    }\n    \n    function readImageData(element) {\n        var relationshipId = element.attributes['r:id'];\n        \n        if (relationshipId) {\n            return readImage(\n                findEmbeddedImageFile(relationshipId),\n                element.attributes[\"o:title\"]);\n        } else {\n            return emptyResultWithMessages([warning(\"A v:imagedata element without a relationship ID was ignored\")]);\n        }\n    }\n    \n    function findEmbeddedImageFile(relationshipId) {\n        var path = uris.uriToZipEntryName(\"word\", relationships.findTargetByRelationshipId(relationshipId));\n        return {\n            path: path,\n            read: docxFile.read.bind(docxFile, path)\n        };\n    }\n    \n    function readImage(imageFile, altText) {\n        var contentType = contentTypes.findContentType(imageFile.path);\n        \n        var image = documents.Image({\n            readImage: imageFile.read,\n            altText: altText,\n            contentType: contentType\n        });\n        var warnings = supportedImageTypes[contentType] ?\n            [] : warning(\"Image of type \" + contentType + \" is unlikely to display in web browsers\");\n        return elementResultWithMessages(image, warnings);\n    }\n    \n    function undefinedStyleWarning(type, styleId) {\n        return warning(\n            type + \" style with ID \" + styleId + \" was referenced but not defined in the document\");\n    }\n}\n\n\nfunction readNumberingProperties(element, numbering) {\n    var level = element.firstOrEmpty(\"w:ilvl\").attributes[\"w:val\"];\n    var numId = element.firstOrEmpty(\"w:numId\").attributes[\"w:val\"];\n    if (level === undefined || numId === undefined) {\n        return null;\n    } else {\n        return numbering.findLevel(numId, level);\n    }\n}\n    \nvar supportedImageTypes = {\n    \"image/png\": true,\n    \"image/gif\": true,\n    \"image/jpeg\": true,\n    \"image/svg+xml\": true,\n    \"image/tiff\": true\n};\n\nvar ignoreElements = {\n    \"office-word:wrap\": true,\n    \"v:shadow\": true,\n    \"v:shapetype\": true,\n    \"w:annotationRef\": true,\n    \"w:bookmarkEnd\": true,\n    \"w:sectPr\": true,\n    \"w:proofErr\": true,\n    \"w:lastRenderedPageBreak\": true,\n    \"w:commentRangeStart\": true,\n    \"w:commentRangeEnd\": true,\n    \"w:del\": true,\n    \"w:footnoteRef\": true,\n    \"w:endnoteRef\": true,\n    \"w:tblPr\": true,\n    \"w:tblGrid\": true,\n    \"w:trPr\": true,\n    \"w:tcPr\": true\n};\n\nfunction isParagraphProperties(element) {\n    return element.type === \"paragraphProperties\";\n}\n\nfunction isRunProperties(element) {\n    return element.type === \"runProperties\";\n}\n\nfunction negate(predicate) {\n    return function(value) {\n        return !predicate(value);\n    };\n}\n\n\nfunction emptyResultWithMessages(messages) {\n    return new ReadResult(null, null, messages);\n}\n\nfunction emptyResult() {\n    return new ReadResult(null);\n}\n\nfunction elementResult(element) {\n    return new ReadResult(element);\n}\n\nfunction elementResultWithMessages(element, messages) {\n    return new ReadResult(element, null, messages);\n}\n\nfunction ReadResult(element, extra, messages) {\n    this.value = element || [];\n    this.extra = extra;\n    this._result = new Result({\n        element: this.value,\n        extra: extra\n    }, messages);\n    this.messages = this._result.messages;\n}\n\nReadResult.prototype.toExtra = function() {\n    return new ReadResult(null, joinElements(this.extra, this.value), this.messages);\n};\n\nReadResult.prototype.insertExtra = function() {\n    var extra = this.extra;\n    if (extra && extra.length) {\n        return new ReadResult(joinElements(this.value, extra), null, this.messages);\n    } else {\n        return this;\n    }\n};\n\nReadResult.prototype.map = function(func) {\n    var result = this._result.map(function(value) {\n        return func(value.element);\n    });\n    return new ReadResult(result.value, this.extra, result.messages);\n};\n\nReadResult.prototype.flatMap = function(func) {\n    var result = this._result.flatMap(function(value) {\n        return func(value.element)._result;\n    });\n    return new ReadResult(result.value.element, joinElements(this.extra, result.value.extra), result.messages);\n};\n\nfunction combineResults(results) {\n    var result = Result.combine(_.pluck(results, \"_result\"));\n    return new ReadResult(\n        _.flatten(_.pluck(result.value, \"element\")),\n        _.filter(_.flatten(_.pluck(result.value, \"extra\")), identity),\n        result.messages\n    );\n}\n\nfunction joinElements(first, second) {\n    return _.flatten([first, second]);\n}\n\nfunction identity(value) {\n    return value;\n}\n\n},{\"../documents\":4,\"../results\":24,\"./uris\":16,\"underscore\":153}],6:[function(require,module,exports){\nvar documents = require(\"../documents\");\nvar Result = require(\"../results\").Result;\n\nfunction createCommentsReader(bodyReader) {\n    function readCommentsXml(element) {\n        return Result.combine(element.getElementsByTagName(\"w:comment\")\n            .map(readCommentElement));\n    }\n\n    function readCommentElement(element) {\n        var id = element.attributes[\"w:id\"];\n\n        function readOptionalAttribute(name) {\n            return (element.attributes[name] || \"\").trim() || null;\n        }\n\n        return bodyReader.readXmlElements(element.children)\n            .map(function(body) {\n                return documents.comment({\n                    commentId: id,\n                    body: body,\n                    authorName: readOptionalAttribute(\"w:author\"),\n                    authorInitials: readOptionalAttribute(\"w:initials\")\n                });\n            });\n    }\n    \n    return readCommentsXml;\n}\n\nexports.createCommentsReader = createCommentsReader;\n\n},{\"../documents\":4,\"../results\":24}],7:[function(require,module,exports){\nexports.readContentTypesFromXml = readContentTypesFromXml;\n\nvar fallbackContentTypes = {\n    \"png\": \"png\",\n    \"gif\": \"gif\",\n    \"jpeg\": \"jpeg\",\n    \"jpg\": \"jpeg\",\n    \"tif\": \"tiff\",\n    \"tiff\": \"tiff\",\n    \"bmp\": \"bmp\"\n};\n\nexports.defaultContentTypes = contentTypes({}, {});\n\n\nfunction readContentTypesFromXml(element) {\n    var extensionDefaults = {};\n    var overrides = {};\n    \n    element.children.forEach(function(child) {\n        if (child.name === \"content-types:Default\") {\n            extensionDefaults[child.attributes.Extension] = child.attributes.ContentType;\n        }\n        if (child.name === \"content-types:Override\") {\n            var name = child.attributes.PartName;\n            if (name.charAt(0) === \"/\") {\n                name = name.substring(1);\n            }\n            overrides[name] = child.attributes.ContentType;\n        }\n    });\n    return contentTypes(overrides, extensionDefaults);\n}\n\nfunction contentTypes(overrides, extensionDefaults) {\n    return {\n        findContentType: function(path) {\n            var overrideContentType = overrides[path];\n            if (overrideContentType) {\n                return overrideContentType;\n            } else {\n                var pathParts = path.split(\".\");\n                var extension = pathParts[pathParts.length - 1];\n                if (extensionDefaults.hasOwnProperty(extension)) {\n                    return extensionDefaults[extension];\n                } else {\n                    var fallback = fallbackContentTypes[extension.toLowerCase()];\n                    if (fallback) {\n                        return \"image/\" + fallback;\n                    } else {\n                        return null;\n                    }\n                }\n            }\n        }\n    };\n    \n}\n\n},{}],8:[function(require,module,exports){\nexports.DocumentXmlReader = DocumentXmlReader;\n\nvar documents = require(\"../documents\");\nvar Result = require(\"../results\").Result;\n\n\nfunction DocumentXmlReader(options) {\n    var bodyReader = options.bodyReader;\n    \n    function convertXmlToDocument(element) {\n        var body = element.first(\"w:body\");\n        \n        var result = bodyReader.readXmlElements(body.children)\n            .map(function(children) {\n                return new documents.Document(children, {\n                    notes: options.notes,\n                    comments: options.comments\n                });\n            });\n        return new Result(result.value, result.messages);\n    }\n    \n    return {\n        convertXmlToDocument: convertXmlToDocument\n    };\n}\n\n},{\"../documents\":4,\"../results\":24}],9:[function(require,module,exports){\nexports.read = read;\nexports._findPartPaths = findPartPaths;\n\nvar path = require(\"path\");\n\nvar promises = require(\"../promises\");\nvar documents = require(\"../documents\");\nvar Result = require(\"../results\").Result;\nvar zipfile = require(\"../zipfile\");\n\nvar readXmlFromZipFile = require(\"./office-xml-reader\").readXmlFromZipFile;\nvar createBodyReader = require(\"./body-reader\").createBodyReader;\nvar DocumentXmlReader = require(\"./document-xml-reader\").DocumentXmlReader;\nvar relationshipsReader = require(\"./relationships-reader\");\nvar contentTypesReader = require(\"./content-types-reader\");\nvar numberingXml = require(\"./numbering-xml\");\nvar stylesReader = require(\"./styles-reader\");\nvar notesReader = require(\"./notes-reader\");\nvar commentsReader = require(\"./comments-reader\");\nvar Files = require(\"./files\").Files;\n\n\nfunction read(docxFile, input) {\n    input = input || {};\n    \n    return promises.props({\n        contentTypes: readContentTypesFromZipFile(docxFile),\n        partPaths: findPartPaths(docxFile),\n        docxFile: docxFile,\n        files: new Files(input.path ? path.dirname(input.path) : null)\n    }).also(function(result) {\n        return {\n            numbering: readNumberingFromZipFile(docxFile, result.partPaths.numbering),\n            styles: readStylesFromZipFile(docxFile, result.partPaths.styles)\n        };\n    }).also(function(result) {\n        return {\n            footnotes: readXmlFileWithBody(result.partPaths.footnotes, result, function(bodyReader, xml) {\n                if (xml) {\n                    return notesReader.createFootnotesReader(bodyReader)(xml);\n                } else {\n                    return new Result([]);\n                }\n            }),\n            endnotes: readXmlFileWithBody(result.partPaths.endnotes, result, function(bodyReader, xml) {\n                if (xml) {\n                    return notesReader.createEndnotesReader(bodyReader)(xml);\n                } else {\n                    return new Result([]);\n                }\n            }),\n            comments: readXmlFileWithBody(result.partPaths.comments, result, function(bodyReader, xml) {\n                if (xml) {\n                    return commentsReader.createCommentsReader(bodyReader)(xml);\n                } else {\n                    return new Result([]);\n                }\n            })\n        };\n    }).also(function(result) {\n        return {\n            notes: result.footnotes.flatMap(function(footnotes) {\n                return result.endnotes.map(function(endnotes) {\n                    return new documents.Notes(footnotes.concat(endnotes));\n                });\n            })\n        };\n    }).then(function(result) {\n        return readXmlFileWithBody(result.partPaths.mainDocument, result, function(bodyReader, xml) {\n            return result.notes.flatMap(function(notes) {\n                return result.comments.flatMap(function(comments) {\n                    var reader = new DocumentXmlReader({\n                        bodyReader: bodyReader,\n                        notes: notes,\n                        comments: comments\n                    });\n                    return reader.convertXmlToDocument(xml);\n                });\n            });\n        });\n    });\n}\n\nfunction findPartPaths(docxFile) {\n    return readPackageRelationships(docxFile).then(function(packageRelationships) {\n        var mainDocumentPath = findPartPath({\n            docxFile: docxFile,\n            relationships: packageRelationships,\n            relationshipType: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n            basePath: \"\",\n            fallbackPath: \"word/document.xml\"\n        });\n        \n        if (!docxFile.exists(mainDocumentPath)) {\n            throw new Error(\"Could not find main document part. Are you sure this is a valid .docx file?\");\n        }\n        \n        return xmlFileReader({\n            filename: relationshipsFilename(mainDocumentPath),\n            readElement: relationshipsReader.readRelationships,\n            defaultValue: relationshipsReader.defaultValue\n        })(docxFile).then(function(documentRelationships) {\n            function findPartRelatedToMainDocument(name) {\n                return findPartPath({\n                    docxFile: docxFile,\n                    relationships: documentRelationships,\n                    relationshipType: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/\" + name,\n                    basePath: zipfile.splitPath(mainDocumentPath).dirname,\n                    fallbackPath: \"word/\" + name + \".xml\"\n                });\n            }\n        \n            return {\n                mainDocument: mainDocumentPath,\n                comments: findPartRelatedToMainDocument(\"comments\"),\n                endnotes: findPartRelatedToMainDocument(\"endnotes\"),\n                footnotes: findPartRelatedToMainDocument(\"footnotes\"),\n                numbering: findPartRelatedToMainDocument(\"numbering\"),\n                styles: findPartRelatedToMainDocument(\"styles\")\n            };\n        });\n    });\n}\n\nfunction findPartPath(options) {\n    var docxFile = options.docxFile;\n    var relationships = options.relationships;\n    var relationshipType = options.relationshipType;\n    var basePath = options.basePath;\n    var fallbackPath = options.fallbackPath;\n    \n    var targets = relationships.findTargetsByType(relationshipType);\n    var normalisedTargets = targets.map(function(target) {\n        return stripPrefix(zipfile.joinPath(basePath, target), \"/\");\n    });\n    var validTargets = normalisedTargets.filter(function(target) {\n        return docxFile.exists(target);\n    });\n    if (validTargets.length === 0) {\n        return fallbackPath;\n    } else {\n        return validTargets[0];\n    }\n}\n\nfunction stripPrefix(value, prefix) {\n    if (value.substring(0, prefix.length) === prefix) {\n        return value.substring(prefix.length);\n    } else {\n        return value;\n    }\n}\n\nfunction xmlFileReader(options) {\n    return function(zipFile) {\n        return readXmlFromZipFile(zipFile, options.filename)\n            .then(function(element) {\n                return element ? options.readElement(element) : options.defaultValue;\n            });\n    };\n}\n\nfunction readXmlFileWithBody(filename, options, func) {\n    var readRelationshipsFromZipFile = xmlFileReader({\n        filename: relationshipsFilename(filename),\n        readElement: relationshipsReader.readRelationships,\n        defaultValue: relationshipsReader.defaultValue\n    });\n    \n    return readRelationshipsFromZipFile(options.docxFile).then(function(relationships) {\n        var bodyReader = new createBodyReader({\n            relationships: relationships,\n            contentTypes: options.contentTypes,\n            docxFile: options.docxFile,\n            numbering: options.numbering,\n            styles: options.styles,\n            files: options.files\n        });\n        return readXmlFromZipFile(options.docxFile, filename)\n            .then(function(xml) {\n                return func(bodyReader, xml);\n            });\n    });\n}\n\nfunction relationshipsFilename(filename) {\n    var split = zipfile.splitPath(filename);\n    return zipfile.joinPath(split.dirname, \"_rels\", split.basename + \".rels\");\n}\n\nvar readContentTypesFromZipFile = xmlFileReader({\n    filename: \"[Content_Types].xml\",\n    readElement: contentTypesReader.readContentTypesFromXml,\n    defaultValue: contentTypesReader.defaultContentTypes\n});\n\nfunction readNumberingFromZipFile(zipFile, path) {\n    return xmlFileReader({\n        filename: path,\n        readElement: numberingXml.readNumberingXml,\n        defaultValue: numberingXml.defaultNumbering\n    })(zipFile);\n}\n\nfunction readStylesFromZipFile(zipFile, path) {\n    return xmlFileReader({\n        filename: path,\n        readElement: stylesReader.readStylesXml,\n        defaultValue: stylesReader.defaultStyles\n    })(zipFile);\n}\n\nvar readPackageRelationships = xmlFileReader({\n    filename: \"_rels/.rels\",\n    readElement: relationshipsReader.readRelationships,\n    defaultValue: relationshipsReader.defaultValue\n});\n\n},{\"../documents\":4,\"../promises\":23,\"../results\":24,\"../zipfile\":38,\"./body-reader\":5,\"./comments-reader\":6,\"./content-types-reader\":7,\"./document-xml-reader\":8,\"./files\":1,\"./notes-reader\":10,\"./numbering-xml\":11,\"./office-xml-reader\":12,\"./relationships-reader\":13,\"./styles-reader\":15,\"path\":136}],10:[function(require,module,exports){\nvar documents = require(\"../documents\");\nvar Result = require(\"../results\").Result;\n\nexports.createFootnotesReader = createReader.bind(this, \"footnote\");\nexports.createEndnotesReader = createReader.bind(this, \"endnote\");\n\nfunction createReader(noteType, bodyReader) {\n    function readNotesXml(element) {\n        return Result.combine(element.getElementsByTagName(\"w:\" + noteType)\n            .filter(isFootnoteElement)\n            .map(readFootnoteElement));\n    }\n\n    function isFootnoteElement(element) {\n        var type = element.attributes[\"w:type\"];\n        return type !== \"continuationSeparator\" && type !== \"separator\";\n    }\n\n    function readFootnoteElement(footnoteElement) {\n        var id = footnoteElement.attributes[\"w:id\"];\n        return bodyReader.readXmlElements(footnoteElement.children)\n            .map(function(body) {\n                return documents.Note({noteType: noteType, noteId: id, body: body});\n            });\n    }\n    \n    return readNotesXml;\n}\n\n},{\"../documents\":4,\"../results\":24}],11:[function(require,module,exports){\nexports.readNumberingXml = readNumberingXml;\nexports.Numbering = Numbering;\nexports.defaultNumbering = new Numbering({});\n\nfunction Numbering(nums) {\n    return {\n        findLevel: function(numId, level) {\n            var num = nums[numId];\n            if (num) {\n                return num[level];\n            } else {\n                return null;\n            }\n        }\n    };\n}\n\nfunction readNumberingXml(root) {\n    var abstractNums = readAbstractNums(root);\n    var nums = readNums(root, abstractNums);\n    return new Numbering(nums);\n}\n\nfunction readAbstractNums(root) {\n    var abstractNums = {};\n    root.getElementsByTagName(\"w:abstractNum\").forEach(function(element) {\n        var id = element.attributes[\"w:abstractNumId\"];\n        abstractNums[id] = readAbstractNum(element);\n    });\n    return abstractNums;\n}\n\nfunction readAbstractNum(element) {\n    var levels = {};\n    element.getElementsByTagName(\"w:lvl\").forEach(function(levelElement) {\n        var levelIndex = levelElement.attributes[\"w:ilvl\"];\n        var numFmt = levelElement.first(\"w:numFmt\").attributes[\"w:val\"];\n        levels[levelIndex] = {\n            isOrdered: numFmt !== \"bullet\",\n            level: levelIndex\n        };\n    });\n    return levels;\n}\n\nfunction readNums(root, abstractNums) {\n    var nums = {};\n    root.getElementsByTagName(\"w:num\").forEach(function(element) {\n        var id = element.attributes[\"w:numId\"];\n        var abstractNumId = element.first(\"w:abstractNumId\").attributes[\"w:val\"];\n        nums[id] = abstractNums[abstractNumId];\n    });\n    return nums;\n}\n\n},{}],12:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar promises = require(\"../promises\");\nvar xml = require(\"../xml\");\n\n\nexports.read = read;\nexports.readXmlFromZipFile = readXmlFromZipFile;\n\nvar xmlNamespaceMap = {\n    \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\": \"w\",\n    \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\": \"r\",\n    \"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\": \"wp\",\n    \"http://schemas.openxmlformats.org/drawingml/2006/main\": \"a\",\n    \"http://schemas.openxmlformats.org/drawingml/2006/picture\": \"pic\",\n    \"http://schemas.openxmlformats.org/package/2006/content-types\": \"content-types\",\n    \"urn:schemas-microsoft-com:vml\": \"v\",\n    \"http://schemas.openxmlformats.org/markup-compatibility/2006\": \"mc\",\n    \"urn:schemas-microsoft-com:office:word\": \"office-word\"\n};\n\n\nfunction read(xmlString) {\n    return xml.readString(xmlString, xmlNamespaceMap)\n        .then(function(document) {\n            return collapseAlternateContent(document)[0];\n        });\n}\n\n\nfunction readXmlFromZipFile(docxFile, path) {\n    if (docxFile.exists(path)) {\n        return docxFile.read(path, \"utf-8\")\n            .then(stripUtf8Bom)\n            .then(read);\n    } else {\n        return promises.resolve(null);\n    }\n}\n\n\nfunction stripUtf8Bom(xmlString) {\n    return xmlString.replace(/^\\uFEFF/g, '');\n}\n\n\nfunction collapseAlternateContent(node) {\n    if (node.type === \"element\") {\n        if (node.name === \"mc:AlternateContent\") {\n            return node.first(\"mc:Fallback\").children;\n        } else {\n            node.children = _.flatten(node.children.map(collapseAlternateContent, true));\n            return [node];\n        }\n    } else {\n        return [node];\n    }\n}\n\n},{\"../promises\":23,\"../xml\":34,\"underscore\":153}],13:[function(require,module,exports){\nexports.readRelationships = readRelationships;\nexports.defaultValue = new Relationships([]);\nexports.Relationships = Relationships;\n\n\nfunction readRelationships(element) {\n    var relationships = [];\n    element.children.forEach(function(child) {\n        if (child.name === \"{http://schemas.openxmlformats.org/package/2006/relationships}Relationship\") {\n            var relationship = {\n                relationshipId: child.attributes.Id,\n                target: child.attributes.Target,\n                type: child.attributes.Type\n            };\n            relationships.push(relationship);\n        }\n    });\n    return new Relationships(relationships);\n}\n\nfunction Relationships(relationships) {\n    var targetsByRelationshipId = {};\n    relationships.forEach(function(relationship) {\n        targetsByRelationshipId[relationship.relationshipId] = relationship.target;\n    });\n    \n    var targetsByType = {};\n    relationships.forEach(function(relationship) {\n        if (!targetsByType[relationship.type]) {\n            targetsByType[relationship.type] = [];\n        }\n        targetsByType[relationship.type].push(relationship.target);\n    });\n            \n    return {\n        findTargetByRelationshipId: function(relationshipId) {\n            return targetsByRelationshipId[relationshipId];\n        },\n        findTargetsByType: function(type) {\n            return targetsByType[type] || [];\n        }\n    };\n}\n\n},{}],14:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar promises = require(\"../promises\");\nvar xml = require(\"../xml\");\n\nexports.writeStyleMap = writeStyleMap;\nexports.readStyleMap = readStyleMap;\n\n\nvar schema = \"http://schemas.zwobble.org/mammoth/style-map\";\nvar styleMapPath = \"mammoth/style-map\";\nvar styleMapAbsolutePath = \"/\" + styleMapPath;\n\nfunction writeStyleMap(docxFile, styleMap) {\n    docxFile.write(styleMapPath, styleMap);\n    return updateRelationships(docxFile).then(function() {\n        return updateContentTypes(docxFile);\n    });\n}\n\nfunction updateRelationships(docxFile) {\n    var path = \"word/_rels/document.xml.rels\";\n    var relationshipsUri = \"http://schemas.openxmlformats.org/package/2006/relationships\";\n    var relationshipElementName = \"{\" + relationshipsUri + \"}Relationship\";\n    return docxFile.read(path, \"utf8\")\n        .then(xml.readString)\n        .then(function(relationshipsContainer) {\n            var relationships = relationshipsContainer.children;\n            addOrUpdateElement(relationships, relationshipElementName, \"Id\", {\n                \"Id\": \"rMammothStyleMap\",\n                \"Type\": schema,\n                \"Target\": styleMapAbsolutePath\n            });\n            \n            var namespaces = {\"\": relationshipsUri};\n            return docxFile.write(path, xml.writeString(relationshipsContainer, namespaces));\n        });\n}\n\nfunction updateContentTypes(docxFile) {\n    var path = \"[Content_Types].xml\";\n    var contentTypesUri = \"http://schemas.openxmlformats.org/package/2006/content-types\";\n    var overrideName = \"{\" + contentTypesUri + \"}Override\";\n    return docxFile.read(path, \"utf8\")\n        .then(xml.readString)\n        .then(function(typesElement) {\n            var children = typesElement.children;\n            addOrUpdateElement(children, overrideName, \"PartName\", {\n                \"PartName\": styleMapAbsolutePath,\n                \"ContentType\": \"text/prs.mammoth.style-map\"\n            });\n            var namespaces = {\"\": contentTypesUri};\n            return docxFile.write(path, xml.writeString(typesElement, namespaces));\n        });\n}\n\nfunction addOrUpdateElement(elements, name, identifyingAttribute, attributes) {\n    var existingElement = _.find(elements, function(element) {\n        return element.name === name &&\n            element.attributes[identifyingAttribute] === attributes[identifyingAttribute];\n    });\n    if (existingElement) {\n        existingElement.attributes = attributes;\n    } else {\n        elements.push(xml.element(name, attributes));\n    }\n}\n\nfunction readStyleMap(docxFile) {\n    if (docxFile.exists(styleMapPath)) {\n        return docxFile.read(styleMapPath, \"utf8\");\n    } else {\n        return promises.resolve(null);\n    }\n}\n\n},{\"../promises\":23,\"../xml\":34,\"underscore\":153}],15:[function(require,module,exports){\nexports.readStylesXml = readStylesXml;\nexports.Styles = Styles;\nexports.defaultStyles = new Styles({}, {});\n\nfunction Styles(paragraphStyles, characterStyles, tableStyles) {\n    return {\n        findParagraphStyleById: function(styleId) {\n            return paragraphStyles[styleId];\n        },\n        findCharacterStyleById: function(styleId) {\n            return characterStyles[styleId];\n        },\n        findTableStyleById: function(styleId) {\n            return tableStyles[styleId];\n        }\n    };\n}\n\nStyles.EMPTY = new Styles({}, {}, {});\n\nfunction readStylesXml(root) {\n    var paragraphStyles = {};\n    var characterStyles = {};\n    var tableStyles = {};\n    \n    var styles = {\n        \"paragraph\": paragraphStyles,\n        \"character\": characterStyles,\n        \"table\": tableStyles\n    };\n    \n    root.getElementsByTagName(\"w:style\").forEach(function(styleElement) {\n        var style = readStyleElement(styleElement);\n        var styleSet = styles[style.type];\n        if (styleSet) {\n            styleSet[style.styleId] = style;\n        }\n    });\n    \n    return new Styles(paragraphStyles, characterStyles, tableStyles);\n}\n\nfunction readStyleElement(styleElement) {\n    var type = styleElement.attributes[\"w:type\"];\n    var styleId = styleElement.attributes[\"w:styleId\"];\n    var name = styleName(styleElement);\n    return {type: type, styleId: styleId, name: name};\n}\n\nfunction styleName(styleElement) {\n    var nameElement = styleElement.first(\"w:name\");\n    return nameElement ? nameElement.attributes[\"w:val\"] : null;\n}\n\n},{}],16:[function(require,module,exports){\nexports.uriToZipEntryName = uriToZipEntryName;\nexports.replaceFragment = replaceFragment;\n\nfunction uriToZipEntryName(base, uri) {\n    if (uri.charAt(0) === \"/\") {\n        return uri.substr(1);\n    } else {\n        // In general, we should check first and second for trailing and leading slashes,\n        // but in our specific case this seems to be sufficient\n        return base + \"/\" + uri;\n    }\n}\n\n\nfunction replaceFragment(uri, fragment) {\n    var hashIndex = uri.indexOf(\"#\");\n    if (hashIndex !== -1) {\n        uri = uri.substring(0, hashIndex);\n    }\n    return uri + \"#\" + fragment;\n}\n\n},{}],17:[function(require,module,exports){\nvar htmlPaths = require(\"../styles/html-paths\");\n\n\nfunction nonFreshElement(tagName, attributes, children) {\n    return elementWithTag(\n        htmlPaths.element(tagName, attributes, {fresh: false}),\n        children);\n}\n\nfunction freshElement(tagName, attributes, children) {\n    var tag = htmlPaths.element(tagName, attributes, {fresh: true});\n    return elementWithTag(tag, children);\n}\n\nfunction elementWithTag(tag, children) {\n    return {\n        type: \"element\",\n        tag: tag,\n        children: children || []\n    };\n}\n\nfunction text(value) {\n    return {\n        type: \"text\",\n        value: value\n    };\n}\n\nvar forceWrite = {\n    type: \"forceWrite\"\n};\n\nexports.freshElement = freshElement;\nexports.nonFreshElement = nonFreshElement;\nexports.elementWithTag = elementWithTag;\nexports.text = text;\nexports.forceWrite = forceWrite;\n\nvar voidTagNames = {\n    \"br\": true,\n    \"hr\": true,\n    \"img\": true\n};\n\nfunction isVoidElement(node) {\n    return (node.children.length === 0) && voidTagNames[node.tag.tagName];\n}\n\nexports.isVoidElement = isVoidElement;\n\n},{\"../styles/html-paths\":27}],18:[function(require,module,exports){\nvar ast = require(\"./ast\");\n\nexports.freshElement = ast.freshElement;\nexports.nonFreshElement = ast.nonFreshElement;\nexports.elementWithTag = ast.elementWithTag;\nexports.text = ast.text;\nexports.forceWrite = ast.forceWrite;\n\nexports.simplify = require(\"./simplify\");\n\nfunction write(writer, nodes) {\n    nodes.forEach(function(node) {\n        writeNode(writer, node);\n    });\n}\n\nfunction writeNode(writer, node) {\n    toStrings[node.type](writer, node);\n}\n\nvar toStrings = {\n    element: generateElementString,\n    text: generateTextString,\n    forceWrite: function() { }\n};\n\nfunction generateElementString(writer, node) {\n    if (ast.isVoidElement(node)) {\n        writer.selfClosing(node.tag.tagName, node.tag.attributes);\n    } else {\n        writer.open(node.tag.tagName, node.tag.attributes);\n        write(writer, node.children);\n        writer.close(node.tag.tagName);\n    }\n}\n\nfunction generateTextString(writer, node) {\n    writer.text(node.value);\n}\n\nexports.write = write;\n\n},{\"./ast\":17,\"./simplify\":19}],19:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar ast = require(\"./ast\");\n\nfunction simplify(nodes) {\n    return collapse(removeEmpty(nodes));\n}\n\nfunction collapse(nodes) {\n    var children = [];\n    \n    nodes.map(collapseNode).forEach(function(child) {\n        appendChild(children, child);\n    });\n    return children;\n}\n\nfunction collapseNode(node) {\n    return collapsers[node.type](node);\n}\n\nvar collapsers = {\n    element: collapseElement,\n    text: identity,\n    forceWrite: identity\n};\n\nfunction collapseElement(node) {\n    return ast.elementWithTag(node.tag, collapse(node.children));\n}\n\nfunction identity(value) {\n    return value;\n}\n\nfunction appendChild(children, child) {\n    var lastChild = children[children.length - 1];\n    if (child.type === \"element\" && !child.tag.fresh && lastChild && lastChild.type === \"element\" && child.tag.matchesElement(lastChild.tag)) {\n        if (child.tag.separator) {\n            appendChild(lastChild.children, ast.text(child.tag.separator));\n        }\n        child.children.forEach(function(grandChild) {\n            // Mutation is fine since simplifying elements create a copy of the children.\n            appendChild(lastChild.children, grandChild);\n        });\n    } else {\n        children.push(child);\n    }\n}\n\nfunction removeEmpty(nodes) {\n    return flatMap(nodes, function(node) {\n        return emptiers[node.type](node);\n    });\n}\n\nfunction flatMap(values, func) {\n    return _.flatten(_.map(values, func), true);\n}\n\nvar emptiers = {\n    element: elementEmptier,\n    text: textEmptier,\n    forceWrite: neverEmpty\n};\n\nfunction neverEmpty(node) {\n    return [node];\n}\n\nfunction elementEmptier(element) {\n    var children = removeEmpty(element.children);\n    if (children.length === 0 && !ast.isVoidElement(element)) {\n        return [];\n    } else {\n        return [ast.elementWithTag(element.tag, children)];\n    }\n}\n\nfunction textEmptier(node) {\n    if (node.value.length === 0) {\n        return [];\n    } else {\n        return [node];\n    }\n}\n\nmodule.exports = simplify;\n\n},{\"./ast\":17,\"underscore\":153}],20:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar promises = require(\"./promises\");\nvar Html = require(\"./html\");\n\nexports.imgElement = imgElement;\n\nfunction imgElement(func) {\n    return function(element, messages) {\n        return promises.when(func(element)).then(function(result) {\n            var attributes = _.clone(result);\n            if (element.altText) {\n                attributes.alt = element.altText;\n            }\n            return [Html.freshElement(\"img\", attributes)];\n        });\n    };\n}\n\n// Undocumented, but retained for backwards-compatibility with 0.3.x\nexports.inline = exports.imgElement;\n\nexports.dataUri = imgElement(function(element) {\n    return element.read(\"base64\").then(function(imageBuffer) {\n        return {\n            src: \"data:\" + element.contentType + \";base64,\" + imageBuffer\n        };\n    });\n});\n\n},{\"./html\":18,\"./promises\":23,\"underscore\":153}],21:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar docxReader = require(\"./docx/docx-reader\");\nvar docxStyleMap = require(\"./docx/style-map\");\nvar DocumentConverter = require(\"./document-to-html\").DocumentConverter;\nvar readStyle = require(\"./style-reader\").readStyle;\nvar readOptions = require(\"./options-reader\").readOptions;\nvar unzip = require(\"./unzip\");\nvar Result = require(\"./results\").Result;\n\nexports.convertToHtml = convertToHtml;\nexports.convertToMarkdown = convertToMarkdown;\nexports.convert = convert;\nexports.extractRawText = extractRawText;\nexports.images = require(\"./images\");\nexports.transforms = require(\"./transforms\");\nexports.underline = require(\"./underline\");\nexports.embedStyleMap = embedStyleMap;\nexports.readEmbeddedStyleMap = readEmbeddedStyleMap;\n\nfunction convertToHtml(input, options) {\n    return convert(input, options);\n}\n\nfunction convertToMarkdown(input, options) {\n    var markdownOptions = Object.create(options || {});\n    markdownOptions.outputFormat = \"markdown\";\n    return convert(input, markdownOptions);\n}\n\nfunction convert(input, options) {\n    options = readOptions(options);\n    \n    return unzip.openZip(input)\n        .tap(function(docxFile) {\n            return docxStyleMap.readStyleMap(docxFile).then(function(styleMap) {\n                options.embeddedStyleMap = styleMap;\n            });\n        })\n        .then(function(docxFile) {\n            return docxReader.read(docxFile, input)\n                .then(function(documentResult) {\n                    return documentResult.map(options.transformDocument);\n                })\n                .then(function(documentResult) {\n                    return convertDocumentToHtml(documentResult, options);\n                });\n        });\n}\n\nfunction readEmbeddedStyleMap(input) {\n    return unzip.openZip(input)\n        .then(docxStyleMap.readStyleMap);\n}\n\nfunction convertDocumentToHtml(documentResult, options) {\n    var styleMapResult = parseStyleMap(options.readStyleMap());\n    var parsedOptions = _.extend({}, options, {\n        styleMap: styleMapResult.value\n    });\n    var documentConverter = new DocumentConverter(parsedOptions);\n    \n    return documentResult.flatMapThen(function(document) {\n        return styleMapResult.flatMapThen(function(styleMap) {\n            return documentConverter.convertToHtml(document);\n        });\n    });\n}\n\nfunction parseStyleMap(styleMap) {\n    return Result.combine((styleMap || []).map(readStyle))\n        .map(function(styleMap) {\n            return styleMap.filter(function(styleMapping) {\n                return !!styleMapping;\n            });\n        });\n}\n\n\nfunction extractRawText(input) {\n    return unzip.openZip(input)\n        .then(docxReader.read)\n        .then(function(documentResult) {\n            return documentResult.map(convertElementToRawText);\n        });\n}\n\nfunction convertElementToRawText(element) {\n    if (element.type === \"text\") {\n        return element.value;\n    } else {\n        var tail = element.type === \"paragraph\" ? \"\\n\\n\" : \"\";\n        return (element.children || []).map(convertElementToRawText).join(\"\") + tail;\n    }\n}\n\nfunction embedStyleMap(input, styleMap) {\n    return unzip.openZip(input)\n        .tap(function(docxFile) {\n            return docxStyleMap.writeStyleMap(docxFile, styleMap);\n        })\n        .then(function(docxFile) {\n            return {\n                toBuffer: docxFile.toBuffer\n            };\n        });\n}\n\nexports.styleMapping = function() {\n    throw new Error('Use a raw string instead of mammoth.styleMapping e.g. \"p[style-name=\\'Title\\'] => h1\" instead of mammoth.styleMapping(\"p[style-name=\\'Title\\'] => h1\")');\n};\n\n},{\"./document-to-html\":3,\"./docx/docx-reader\":9,\"./docx/style-map\":14,\"./images\":20,\"./options-reader\":22,\"./results\":24,\"./style-reader\":25,\"./transforms\":29,\"./underline\":30,\"./unzip\":2,\"underscore\":153}],22:[function(require,module,exports){\nexports.readOptions = readOptions;\n\n\nvar _ = require(\"underscore\");\n\nvar defaultStyleMap = exports._defaultStyleMap = [\n    \"p.Heading1 => h1:fresh\",\n    \"p.Heading2 => h2:fresh\",\n    \"p.Heading3 => h3:fresh\",\n    \"p.Heading4 => h4:fresh\",\n    \"p.Heading5 => h5:fresh\",\n    \"p.Heading6 => h6:fresh\",\n    \"p[style-name='Heading 1'] => h1:fresh\",\n    \"p[style-name='Heading 2'] => h2:fresh\",\n    \"p[style-name='Heading 3'] => h3:fresh\",\n    \"p[style-name='Heading 4'] => h4:fresh\",\n    \"p[style-name='Heading 5'] => h5:fresh\",\n    \"p[style-name='Heading 6'] => h6:fresh\",\n    \"p[style-name='heading 1'] => h1:fresh\",\n    \"p[style-name='heading 2'] => h2:fresh\",\n    \"p[style-name='heading 3'] => h3:fresh\",\n    \"p[style-name='heading 4'] => h4:fresh\",\n    \"p[style-name='heading 5'] => h5:fresh\",\n    \"p[style-name='heading 6'] => h6:fresh\",\n    \n    \"r[style-name='Strong'] => strong\",\n    \n    \"p[style-name='footnote text'] => p:fresh\",\n    \"r[style-name='footnote reference'] =>\",\n    \"p[style-name='endnote text'] => p:fresh\",\n    \"r[style-name='endnote reference'] =>\",\n    \"p[style-name='annotation text'] => p:fresh\",\n    \"r[style-name='annotation reference'] =>\",\n    \n    // LibreOffice\n    \"p[style-name='Footnote'] => p:fresh\",\n    \"r[style-name='Footnote anchor'] =>\",\n    \"p[style-name='Endnote'] => p:fresh\",\n    \"r[style-name='Endnote anchor'] =>\",\n    \n    \"p:unordered-list(1) => ul > li:fresh\",\n    \"p:unordered-list(2) => ul|ol > li > ul > li:fresh\",\n    \"p:unordered-list(3) => ul|ol > li > ul|ol > li > ul > li:fresh\",\n    \"p:unordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh\",\n    \"p:unordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh\",\n    \"p:ordered-list(1) => ol > li:fresh\",\n    \"p:ordered-list(2) => ul|ol > li > ol > li:fresh\",\n    \"p:ordered-list(3) => ul|ol > li > ul|ol > li > ol > li:fresh\",\n    \"p:ordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh\",\n    \"p:ordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh\",\n    \n    \"r[style-name='Hyperlink'] =>\",\n    \n    \"p[style-name='Normal'] => p:fresh\"\n];\n\nvar standardOptions = exports._standardOptions = {\n    transformDocument: identity,\n    includeDefaultStyleMap: true,\n    includeEmbeddedStyleMap: true\n};\n\nfunction readOptions(options) {\n    options = options || {};\n    return _.extend({}, standardOptions, options, {\n        customStyleMap: readStyleMap(options.styleMap),\n        readStyleMap: function() {\n            var styleMap = this.customStyleMap;\n            if (this.includeEmbeddedStyleMap) {\n                styleMap = styleMap.concat(readStyleMap(this.embeddedStyleMap));\n            }\n            if (this.includeDefaultStyleMap) {\n                styleMap = styleMap.concat(defaultStyleMap);\n            }\n            return styleMap;\n        }\n    });\n}\n\nfunction readStyleMap(styleMap) {\n    if (!styleMap) {\n        return [];\n    } else if (_.isString(styleMap)) {\n        return styleMap.split(\"\\n\")\n            .map(function(line) {\n                return line.trim();\n            })\n            .filter(function(line) {\n                return line !== \"\" && line.charAt(0) !== \"#\";\n            });\n    } else {\n        return styleMap;\n    }\n}\n\nfunction identity(value) {\n    return value;\n}\n\n},{\"underscore\":153}],23:[function(require,module,exports){\nvar _ = require(\"underscore\");\nvar bluebird = require(\"bluebird/js/release/promise\")();\n\nexports.defer = defer;\nexports.when = bluebird.resolve;\nexports.resolve = bluebird.resolve;\nexports.all = bluebird.all;\nexports.props = bluebird.props;\nexports.reject = bluebird.reject;\nexports.promisify = bluebird.promisify;\nexports.mapSeries = bluebird.mapSeries;\nexports.attempt = bluebird.attempt;\n\nexports.nfcall = function(func) {\n    var args = Array.prototype.slice.call(arguments, 1);\n    var promisedFunc = bluebird.promisify(func);\n    return promisedFunc.apply(null, args);\n};\n\nbluebird.prototype.fail = bluebird.prototype.caught;\n\nbluebird.prototype.also = function(func) {\n    return this.then(function(value) {\n        var returnValue = _.extend({}, value, func(value));\n        return bluebird.props(returnValue);\n    });\n};\n\nfunction defer() {\n    var resolve;\n    var reject;\n    var promise = new bluebird.Promise(function(resolveArg, rejectArg) {\n        resolve = resolveArg;\n        reject = rejectArg;\n    });\n\n    return {\n        resolve: resolve,\n        reject: reject,\n        promise: promise\n    };\n}\n\n},{\"bluebird/js/release/promise\":60,\"underscore\":153}],24:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\n\nexports.Result = Result;\nexports.success = success;\nexports.warning = warning;\nexports.error = error;\n\n\nfunction Result(value, messages) {\n    this.value = value;\n    this.messages = messages || [];\n}\n\nResult.prototype.map = function(func) {\n    return new Result(func(this.value), this.messages);\n};\n\nResult.prototype.flatMap = function(func) {\n    var funcResult = func(this.value);\n    return new Result(funcResult.value, combineMessages([this, funcResult]));\n};\n\nResult.prototype.flatMapThen = function(func) {\n    var that = this;\n    return func(this.value).then(function(otherResult) {\n        return new Result(otherResult.value, combineMessages([that, otherResult]));\n    });\n};\n\nResult.combine = function(results) {\n    var values = _.flatten(_.pluck(results, \"value\"));\n    var messages = combineMessages(results);\n    return new Result(values, messages);\n};\n\nfunction success(value) {\n    return new Result(value, []);\n}\n\nfunction warning(message) {\n    return {\n        type: \"warning\",\n        message: message\n    };\n}\n\nfunction error(exception) {\n    return {\n        type: \"error\",\n        message: exception.message,\n        error: exception\n    };\n}\n\nfunction combineMessages(results) {\n    var messages = [];\n    _.flatten(_.pluck(results, \"messages\"), true).forEach(function(message) {\n        if (!containsMessage(messages, message)) {\n            messages.push(message);\n        }\n    });\n    return messages;\n}\n\nfunction containsMessage(messages, message) {\n    return _.find(messages, isSameMessage.bind(null, message)) !== undefined;\n}\n\nfunction isSameMessage(first, second) {\n    return first.type === second.type && first.message === second.message;\n}\n\n},{\"underscore\":153}],25:[function(require,module,exports){\nvar _ = require(\"underscore\");\nvar lop = require(\"lop\");\n\nvar documentMatchers = require(\"./styles/document-matchers\");\nvar htmlPaths = require(\"./styles/html-paths\");\nvar tokenise = require(\"./styles/parser/tokeniser\").tokenise;\nvar results = require(\"./results\");\n\nexports.readHtmlPath = readHtmlPath;\nexports.readDocumentMatcher = readDocumentMatcher;\nexports.readStyle = readStyle;\n\n\nfunction readStyle(string) {\n    return parseString(styleRule, string);\n}\n\nfunction createStyleRule() {\n    return lop.rules.sequence(\n        lop.rules.sequence.capture(documentMatcherRule()),\n        lop.rules.tokenOfType(\"whitespace\"),\n        lop.rules.tokenOfType(\"arrow\"),\n        lop.rules.sequence.capture(lop.rules.optional(lop.rules.sequence(\n            lop.rules.tokenOfType(\"whitespace\"),\n            lop.rules.sequence.capture(htmlPathRule())\n        ).head())),\n        lop.rules.tokenOfType(\"end\")\n    ).map(function(documentMatcher, htmlPath) {\n        return {\n            from: documentMatcher,\n            to: htmlPath.valueOrElse(htmlPaths.empty)\n        };\n    });\n}\n\nfunction readDocumentMatcher(string) {\n    return parseString(documentMatcherRule(), string);\n}\n\nfunction documentMatcherRule() {\n    var sequence = lop.rules.sequence;\n    \n    var identifierToConstant = function(identifier, constant) {\n        return lop.rules.then(\n            lop.rules.token(\"identifier\", identifier),\n            function() {\n                return constant;\n            }\n        );\n    };\n    \n    var paragraphRule = identifierToConstant(\"p\", documentMatchers.paragraph);\n    var runRule = identifierToConstant(\"r\", documentMatchers.run);\n    \n    var elementTypeRule = lop.rules.firstOf(\"p or r or table\",\n        paragraphRule,\n        runRule\n    );\n    \n    var styleIdRule = lop.rules.then(\n        classRule,\n        function(styleId) {\n            return {styleId: styleId};\n        }\n    );\n\n    var styleNameMatcherRule = lop.rules.firstOf(\"style name matcher\",\n        lop.rules.then(\n            lop.rules.sequence(\n                lop.rules.tokenOfType(\"equals\"),\n                lop.rules.sequence.cut(),\n                lop.rules.sequence.capture(stringRule)\n            ).head(),\n            function(styleName) {\n                return {styleName: documentMatchers.equalTo(styleName)};\n            }\n        ),\n        lop.rules.then(\n            lop.rules.sequence(\n                lop.rules.tokenOfType(\"startsWith\"),\n                lop.rules.sequence.cut(),\n                lop.rules.sequence.capture(stringRule)\n            ).head(),\n            function(styleName) {\n                return {styleName: documentMatchers.startsWith(styleName)};\n            }\n        )\n    );\n    \n    var styleNameRule = lop.rules.sequence(\n        lop.rules.tokenOfType(\"open-square-bracket\"),\n        lop.rules.sequence.cut(),\n        lop.rules.token(\"identifier\", \"style-name\"),\n        lop.rules.sequence.capture(styleNameMatcherRule),\n        lop.rules.tokenOfType(\"close-square-bracket\")\n    ).head();\n\n    \n    var listTypeRule = lop.rules.firstOf(\"list type\",\n        identifierToConstant(\"ordered-list\", {isOrdered: true}),\n        identifierToConstant(\"unordered-list\", {isOrdered: false})\n    );\n    var listRule = sequence(\n        lop.rules.tokenOfType(\"colon\"),\n        sequence.capture(listTypeRule),\n        sequence.cut(),\n        lop.rules.tokenOfType(\"open-paren\"),\n        sequence.capture(integerRule),\n        lop.rules.tokenOfType(\"close-paren\")\n    ).map(function(listType, levelNumber) {\n        return {\n            list: {\n                isOrdered: listType.isOrdered,\n                levelIndex: levelNumber - 1\n            }\n        };\n    });\n\n    function createMatcherSuffixesRule(rules) {\n        var matcherSuffix = lop.rules.firstOf.apply(\n            lop.rules.firstOf,\n            [\"matcher suffix\"].concat(rules)\n        );\n        var matcherSuffixes = lop.rules.zeroOrMore(matcherSuffix);\n        return lop.rules.then(matcherSuffixes, function(suffixes) {\n            var matcherOptions = {};\n            suffixes.forEach(function(suffix) {\n                _.extend(matcherOptions, suffix);\n            });\n            return matcherOptions;\n        });\n    }\n    \n    var paragraphOrRun = sequence(\n        sequence.capture(elementTypeRule),\n        sequence.capture(createMatcherSuffixesRule([\n            styleIdRule,\n            styleNameRule,\n            listRule\n        ]))\n    ).map(function(createMatcher, matcherOptions) {\n        return createMatcher(matcherOptions);\n    });\n    \n    var table = sequence(\n        lop.rules.token(\"identifier\", \"table\"),\n        sequence.capture(createMatcherSuffixesRule([\n            styleIdRule,\n            styleNameRule\n        ]))\n    ).map(function(options) {\n        return documentMatchers.table(options);\n    });\n\n    var bold = identifierToConstant(\"b\", documentMatchers.bold);\n    var italic = identifierToConstant(\"i\", documentMatchers.italic);\n    var underline = identifierToConstant(\"u\", documentMatchers.underline);\n    var strikethrough = identifierToConstant(\"strike\", documentMatchers.strikethrough);\n    var smallCaps = identifierToConstant(\"small-caps\", documentMatchers.smallCaps);\n    var commentReference = identifierToConstant(\"comment-reference\", documentMatchers.commentReference);\n    \n    var breakMatcher = sequence(\n        lop.rules.token(\"identifier\", \"br\"),\n        sequence.cut(),\n        lop.rules.tokenOfType(\"open-square-bracket\"),\n        lop.rules.token(\"identifier\", \"type\"),\n        lop.rules.tokenOfType(\"equals\"),\n        sequence.capture(stringRule),\n        lop.rules.tokenOfType(\"close-square-bracket\")\n    ).map(function(breakType) {\n        switch (breakType) {\n        case \"line\":\n            return documentMatchers.lineBreak;\n        case \"page\":\n            return documentMatchers.pageBreak;\n        case \"column\":\n            return documentMatchers.columnBreak;\n        default:\n            // TODO: handle unknown document matchers\n        }\n    });\n\n    return lop.rules.firstOf(\"element type\",\n        paragraphOrRun,\n        table,\n        bold,\n        italic,\n        underline,\n        strikethrough,\n        smallCaps,\n        commentReference,\n        breakMatcher\n    );\n}\n\nfunction readHtmlPath(string) {\n    return parseString(htmlPathRule(), string);\n}\n\nfunction htmlPathRule() {\n    var capture = lop.rules.sequence.capture;\n    var whitespaceRule = lop.rules.tokenOfType(\"whitespace\");\n    var freshRule = lop.rules.then(\n        lop.rules.optional(lop.rules.sequence(\n            lop.rules.tokenOfType(\"colon\"),\n            lop.rules.token(\"identifier\", \"fresh\")\n        )),\n        function(option) {\n            return option.map(function() {\n                return true;\n            }).valueOrElse(false);\n        }\n    );\n    \n    var separatorRule = lop.rules.then(\n        lop.rules.optional(lop.rules.sequence(\n            lop.rules.tokenOfType(\"colon\"),\n            lop.rules.token(\"identifier\", \"separator\"),\n            lop.rules.tokenOfType(\"open-paren\"),\n            capture(stringRule),\n            lop.rules.tokenOfType(\"close-paren\")\n        ).head()),\n        function(option) {\n            return option.valueOrElse(\"\");\n        }\n    );\n\n    var tagNamesRule = lop.rules.oneOrMoreWithSeparator(\n        identifierRule,\n        lop.rules.tokenOfType(\"choice\")\n    );\n    \n    var styleElementRule = lop.rules.sequence(\n        capture(tagNamesRule),\n        capture(lop.rules.zeroOrMore(classRule)),\n        capture(freshRule),\n        capture(separatorRule)\n    ).map(function(tagName, classNames, fresh, separator) {\n        var attributes = {};\n        var options = {};\n        if (classNames.length > 0) {\n            attributes[\"class\"] = classNames.join(\" \");\n        }\n        if (fresh) {\n            options.fresh = true;\n        }\n        if (separator) {\n            options.separator = separator;\n        }\n        return htmlPaths.element(tagName, attributes, options);\n    });\n    \n    return lop.rules.firstOf(\"html path\",\n        lop.rules.then(lop.rules.tokenOfType(\"bang\"), function() {\n            return htmlPaths.ignore;\n        }),\n        lop.rules.then(\n            lop.rules.zeroOrMoreWithSeparator(\n                styleElementRule,\n                lop.rules.sequence(\n                    whitespaceRule,\n                    lop.rules.tokenOfType(\"gt\"),\n                    whitespaceRule\n                )\n            ),\n            htmlPaths.elements\n        )\n    );\n}\n    \nvar identifierRule = lop.rules.then(\n    lop.rules.tokenOfType(\"identifier\"),\n    decodeEscapeSequences\n);\nvar integerRule = lop.rules.tokenOfType(\"integer\");\n\nvar stringRule = lop.rules.then(\n    lop.rules.tokenOfType(\"string\"),\n    decodeEscapeSequences\n);\n\nvar escapeSequences = {\n    \"n\": \"\\n\",\n    \"r\": \"\\r\",\n    \"t\": \"\\t\"\n};\n\nfunction decodeEscapeSequences(value) {\n    return value.replace(/\\\\(.)/g, function(match, code) {\n        return escapeSequences[code] || code;\n    });\n}\n\nvar classRule = lop.rules.sequence(\n    lop.rules.tokenOfType(\"dot\"),\n    lop.rules.sequence.cut(),\n    lop.rules.sequence.capture(identifierRule)\n).head();\n\nfunction parseString(rule, string) {\n    var tokens = tokenise(string);\n    var parser = lop.Parser();\n    var parseResult = parser.parseTokens(rule, tokens);\n    if (parseResult.isSuccess()) {\n        return results.success(parseResult.value());\n    } else {\n        return new results.Result(null, [results.warning(describeFailure(string, parseResult))]);\n    }\n}\n\nfunction describeFailure(input, parseResult) {\n    return \"Did not understand this style mapping, so ignored it: \" + input + \"\\n\" +\n        parseResult.errors().map(describeError).join(\"\\n\");\n}\n\nfunction describeError(error) {\n    return \"Error was at character number \" + error.characterNumber() + \": \" +\n        \"Expected \" + error.expected + \" but got \" + error.actual;\n}\n\nvar styleRule = createStyleRule();\n\n},{\"./results\":24,\"./styles/document-matchers\":26,\"./styles/html-paths\":27,\"./styles/parser/tokeniser\":28,\"lop\":107,\"underscore\":153}],26:[function(require,module,exports){\nexports.paragraph = paragraph;\nexports.run = run;\nexports.table = table;\nexports.bold = new Matcher(\"bold\");\nexports.italic = new Matcher(\"italic\");\nexports.underline = new Matcher(\"underline\");\nexports.strikethrough = new Matcher(\"strikethrough\");\nexports.smallCaps = new Matcher(\"smallCaps\");\nexports.commentReference = new Matcher(\"commentReference\");\nexports.lineBreak = new Matcher(\"break\", {breakType: \"line\"});\nexports.pageBreak = new Matcher(\"break\", {breakType: \"page\"});\nexports.columnBreak = new Matcher(\"break\", {breakType: \"column\"});\nexports.equalTo = equalTo;\nexports.startsWith = startsWith;\n\n\nfunction paragraph(options) {\n    return new Matcher(\"paragraph\", options);\n}\n\nfunction run(options) {\n    return new Matcher(\"run\", options);\n}\n\nfunction table(options) {\n    return new Matcher(\"table\", options);\n}\n\nfunction Matcher(elementType, options) {\n    options = options || {};\n    this._elementType = elementType;\n    this._styleId = options.styleId;\n    this._styleName = options.styleName;\n    if (options.list) {\n        this._listIndex = options.list.levelIndex;\n        this._listIsOrdered = options.list.isOrdered;\n    }\n}\n\nMatcher.prototype.matches = function(element) {\n    return element.type === this._elementType &&\n        (this._styleId === undefined || element.styleId === this._styleId) &&\n        (this._styleName === undefined || (element.styleName && this._styleName.operator(this._styleName.operand, element.styleName))) &&\n        (this._listIndex === undefined || isList(element, this._listIndex, this._listIsOrdered)) &&\n        (this._breakType === undefined || this._breakType === element.breakType);\n};\n\nfunction isList(element, levelIndex, isOrdered) {\n    return element.numbering &&\n        element.numbering.level == levelIndex &&\n        element.numbering.isOrdered == isOrdered;\n}\n\nfunction equalTo(value) {\n    return {\n        operator: operatorEqualTo,\n        operand: value\n    };\n}\n\nfunction startsWith(value) {\n    return {\n        operator: operatorStartsWith,\n        operand: value\n    };\n}\n\nfunction operatorEqualTo(first, second) {\n    return first.toUpperCase() === second.toUpperCase();\n}\n\nfunction operatorStartsWith(first, second) {\n    return second.toUpperCase().indexOf(first.toUpperCase()) === 0;\n}\n\n},{}],27:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar html = require(\"../html\");\n\nexports.topLevelElement = topLevelElement;\nexports.elements = elements;\nexports.element = element;\n\nfunction topLevelElement(tagName, attributes) {\n    return elements([element(tagName, attributes, {fresh: true})]);\n}\n\nfunction elements(elementStyles) {\n    return new HtmlPath(elementStyles.map(function(elementStyle) {\n        if (_.isString(elementStyle)) {\n            return element(elementStyle);\n        } else {\n            return elementStyle;\n        }\n    }));\n}\n\nfunction HtmlPath(elements) {\n    this._elements = elements;\n}\n\nHtmlPath.prototype.wrap = function wrap(children) {\n    var result = children();\n    for (var index = this._elements.length - 1; index >= 0; index--) {\n        result = this._elements[index].wrapNodes(result);\n    }\n    return result;\n};\n\nfunction element(tagName, attributes, options) {\n    options = options || {};\n    return new Element(tagName, attributes, options);\n}\n\nfunction Element(tagName, attributes, options) {\n    var tagNames = {};\n    if (_.isArray(tagName)) {\n        tagName.forEach(function(tagName) {\n            tagNames[tagName] = true;\n        });\n        tagName = tagName[0];\n    } else {\n        tagNames[tagName] = true;\n    }\n    \n    this.tagName = tagName;\n    this.tagNames = tagNames;\n    this.attributes = attributes || {};\n    this.fresh = options.fresh;\n    this.separator = options.separator;\n}\n\nElement.prototype.matchesElement = function(element) {\n    return this.tagNames[element.tagName] && _.isEqual(this.attributes || {}, element.attributes || {});\n};\n\nElement.prototype.wrap = function wrap(generateNodes) {\n    return this.wrapNodes(generateNodes());\n};\n\nElement.prototype.wrapNodes = function wrapNodes(nodes) {\n    return [html.elementWithTag(this, nodes)];\n};\n\nexports.empty = elements([]);\nexports.ignore = {\n    wrap: function() {\n        return [];\n    }\n};\n\n},{\"../html\":18,\"underscore\":153}],28:[function(require,module,exports){\nvar lop = require(\"lop\");\nvar RegexTokeniser = lop.RegexTokeniser;\n\nexports.tokenise = tokenise;\n\nvar stringPrefix = \"'((?:\\\\\\\\.|[^'])*)\";\n\nfunction tokenise(string) {\n    var identifierCharacter = \"(?:[a-zA-Z\\\\-_]|\\\\\\\\.)\";\n    var tokeniser = new RegexTokeniser([\n        {name: \"identifier\", regex: new RegExp(\"(\" + identifierCharacter + \"(?:\" + identifierCharacter + \"|[0-9])*)\")},\n        {name: \"dot\", regex: /\\./},\n        {name: \"colon\", regex: /:/},\n        {name: \"gt\", regex: />/},\n        {name: \"whitespace\", regex: /\\s+/},\n        {name: \"arrow\", regex: /=>/},\n        {name: \"equals\", regex: /=/},\n        {name: \"startsWith\", regex: /\\^=/},\n        {name: \"open-paren\", regex: /\\(/},\n        {name: \"close-paren\", regex: /\\)/},\n        {name: \"open-square-bracket\", regex: /\\[/},\n        {name: \"close-square-bracket\", regex: /\\]/},\n        {name: \"string\", regex: new RegExp(stringPrefix + \"'\")},\n        {name: \"unterminated-string\", regex: new RegExp(stringPrefix)},\n        {name: \"integer\", regex: /([0-9]+)/},\n        {name: \"choice\", regex: /\\|/},\n        {name: \"bang\", regex: /(!)/}\n    ]);\n    return tokeniser.tokenise(string);\n}\n\n},{\"lop\":107}],29:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nexports.paragraph = paragraph;\nexports.run = run;\nexports._elements = elements;\nexports.getDescendantsOfType = getDescendantsOfType;\nexports.getDescendants = getDescendants;\n\nfunction paragraph(transform) {\n    return elementsOfType(\"paragraph\", transform);\n}\n\nfunction run(transform) {\n    return elementsOfType(\"run\", transform);\n}\n\nfunction elementsOfType(elementType, transform) {\n    return elements(function(element) {\n        if (element.type === elementType) {\n            return transform(element);\n        } else {\n            return element;\n        }\n    });\n}\n\nfunction elements(transform) {\n    return function transformElement(element) {\n        if (element.children) {\n            var children = _.map(element.children, transformElement);\n            element = _.extend(element, {children: children});\n        }\n        return transform(element);\n    };\n}\n\n\nfunction getDescendantsOfType(element, type) {\n    return getDescendants(element).filter(function(descendant) {\n        return descendant.type === type;\n    });\n}\n\nfunction getDescendants(element) {\n    var descendants = [];\n\n    visitDescendants(element, function(descendant) {\n        descendants.push(descendant);\n    });\n\n    return descendants;\n}\n\nfunction visitDescendants(element, visit) {\n    if (element.children) {\n        element.children.forEach(function(child) {\n            visitDescendants(child, visit);\n            visit(child);\n        });\n    }\n}\n\n},{\"underscore\":153}],30:[function(require,module,exports){\nvar htmlPaths = require(\"./styles/html-paths\");\nvar Html = require(\"./html\");\n\n\nexports.element = element;\n\nfunction element(name) {\n    return function(html) {\n        return Html.elementWithTag(htmlPaths.element(name), [html]);\n    };\n}\n\n},{\"./html\":18,\"./styles/html-paths\":27}],31:[function(require,module,exports){\nvar util = require(\"util\");\nvar _ = require(\"underscore\");\n\nexports.writer = writer;\n\nfunction writer(options) {\n    options = options || {};\n    if (options.prettyPrint) {\n        return prettyWriter();\n    } else {\n        return simpleWriter();\n    }\n}\n\n\nvar indentedElements = {\n    div: true,\n    p: true,\n    ul: true,\n    li: true\n};\n\n\nfunction prettyWriter() {\n    var indentationLevel = 0;\n    var indentation = \"  \";\n    var stack = [];\n    var start = true;\n    var inText = false;\n    \n    var writer = simpleWriter();\n    \n    function open(tagName, attributes) {\n        if (indentedElements[tagName]) {\n            indent();\n        }\n        stack.push(tagName);\n        writer.open(tagName, attributes);\n        if (indentedElements[tagName]) {\n            indentationLevel++;\n        }\n        start = false;\n    }\n    \n    function close(tagName) {\n        if (indentedElements[tagName]) {\n            indentationLevel--;\n            indent();\n        }\n        stack.pop();\n        writer.close(tagName);\n    }\n    \n    function text(value) {\n        startText();\n        var text = isInPre() ? value : value.replace(\"\\n\", \"\\n\" + indentation);\n        writer.text(text);\n    }\n    \n    function selfClosing(tagName, attributes) {\n        indent();\n        writer.selfClosing(tagName, attributes);\n    }\n    \n    function insideIndentedElement() {\n        return stack.length === 0 || indentedElements[stack[stack.length - 1]];\n    }\n    \n    function startText() {\n        if (!inText) {\n            indent();\n            inText = true;\n        }\n    }\n    \n    function indent() {\n        inText = false;\n        if (!start && insideIndentedElement() && !isInPre()) {\n            writer._append(\"\\n\");\n            for (var i = 0; i < indentationLevel; i++) {\n                writer._append(indentation);\n            }\n        }\n    }\n    \n    function isInPre() {\n        return _.some(stack, function(tagName) {\n            return tagName === \"pre\";\n        });\n    }\n    \n    return {\n        asString: writer.asString,\n        open: open,\n        close: close,\n        text: text,\n        selfClosing: selfClosing\n    };\n}\n\n\nfunction simpleWriter() {\n    var fragments = [];\n    \n    function open(tagName, attributes) {\n        var attributeString = generateAttributeString(attributes);\n        fragments.push(util.format(\"<%s%s>\", tagName, attributeString));\n    }\n    \n    function close(tagName) {\n        fragments.push(util.format(\"</%s>\", tagName));\n    }\n    \n    function selfClosing(tagName, attributes) {\n        var attributeString = generateAttributeString(attributes);\n        fragments.push(util.format(\"<%s%s />\", tagName, attributeString));\n    }\n    \n    function generateAttributeString(attributes) {\n        return _.map(attributes, function(value, key) {\n            return util.format(' %s=\"%s\"', key, escapeHtmlAttribute(value));\n        }).join(\"\");\n    }\n    \n    function text(value) {\n        fragments.push(escapeHtmlText(value));\n    }\n    \n    function append(html) {\n        fragments.push(html);\n    }\n    \n    function asString() {\n        return fragments.join(\"\");\n    }\n    \n    return {\n        asString: asString,\n        open: open,\n        close: close,\n        text: text,\n        selfClosing: selfClosing,\n        _append: append\n    };\n}\n\nfunction escapeHtmlText(value) {\n    return value\n        .replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;');\n}\n\nfunction escapeHtmlAttribute(value) {\n    return value\n        .replace(/&/g, '&amp;')\n        .replace(/\"/g, '&quot;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;');\n}\n\n},{\"underscore\":153,\"util\":157}],32:[function(require,module,exports){\nvar htmlWriter = require(\"./html-writer\");\nvar markdownWriter = require(\"./markdown-writer\");\n\nexports.writer = writer;\n\n\nfunction writer(options) {\n    options = options || {};\n    if (options.outputFormat === \"markdown\") {\n        return markdownWriter.writer();\n    } else {\n        return htmlWriter.writer(options);\n    }\n}\n\n},{\"./html-writer\":31,\"./markdown-writer\":33}],33:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\n\nfunction symmetricMarkdownElement(end) {\n    return markdownElement(end, end);\n}\n\nfunction markdownElement(start, end) {\n    return function() {\n        return {start: start, end: end};\n    };\n}\n\nfunction markdownLink(attributes) {\n    var href = attributes.href || \"\";\n    if (href) {\n        return {\n            start: \"[\",\n            end: \"](\" + href + \")\",\n            anchorPosition: \"before\"\n        };\n    } else {\n        return {};\n    }\n}\n\nfunction markdownImage(attributes) {\n    var src = attributes.src || \"\";\n    var altText = attributes.alt || \"\";\n    if (src || altText) {\n        return {start: \"![\" + altText + \"](\" + src + \")\"};\n    } else {\n        return {};\n    }\n}\n\nfunction markdownList(options) {\n    return function(attributes, list) {\n        return {\n            start: list ? \"\\n\" : \"\",\n            end: list ? \"\" : \"\\n\",\n            list: {\n                isOrdered: options.isOrdered,\n                indent: list ? list.indent + 1 : 0,\n                count: 0\n            }\n        };\n    };\n}\n\nfunction markdownListItem(attributes, list, listItem) {\n    list = list || {indent: 0, isOrdered: false, count: 0};\n    list.count++;\n    listItem.hasClosed = false;\n    \n    var bullet = list.isOrdered ? list.count + \".\" : \"-\";\n    var start = repeatString(\"\\t\", list.indent) + bullet + \" \";\n        \n    return {\n        start: start,\n        end: function() {\n            if (!listItem.hasClosed) {\n                listItem.hasClosed = true;\n                return \"\\n\";\n            }\n        }\n    };\n}\n\nvar htmlToMarkdown = {\n    \"p\": markdownElement(\"\", \"\\n\\n\"),\n    \"br\": markdownElement(\"\", \"  \\n\"),\n    \"ul\": markdownList({isOrdered: false}),\n    \"ol\": markdownList({isOrdered: true}),\n    \"li\": markdownListItem,\n    \"strong\": symmetricMarkdownElement(\"__\"),\n    \"em\": symmetricMarkdownElement(\"*\"),\n    \"a\": markdownLink,\n    \"img\": markdownImage\n};\n\n(function() {\n    for (var i = 1; i <= 6; i++) {\n        htmlToMarkdown[\"h\" + i] = markdownElement(repeatString(\"#\", i) + \" \", \"\\n\\n\");\n    }\n})();\n\nfunction repeatString(value, count) {\n    return new Array(count + 1).join(value);\n}\n\nfunction markdownWriter() {\n    var fragments = [];\n    var elementStack = [];\n    var list = null;\n    var listItem = {};\n    \n    function open(tagName, attributes) {\n        attributes = attributes || {};\n        \n        var createElement = htmlToMarkdown[tagName] || function() {\n            return {};\n        };\n        var element = createElement(attributes, list, listItem);\n        elementStack.push({end: element.end, list: list});\n        \n        if (element.list) {\n            list = element.list;\n        }\n        \n        var anchorBeforeStart = element.anchorPosition === \"before\";\n        if (anchorBeforeStart) {\n            writeAnchor(attributes);\n        }\n\n        fragments.push(element.start || \"\");\n        if (!anchorBeforeStart) {\n            writeAnchor(attributes);\n        }\n    }\n    \n    function writeAnchor(attributes) {\n        if (attributes.id) {\n            fragments.push('<a id=\"' + attributes.id + '\"></a>');\n        }\n    }\n    \n    function close(tagName) {\n        var element = elementStack.pop();\n        list = element.list;\n        var end = _.isFunction(element.end) ? element.end() : element.end;\n        fragments.push(end || \"\");\n    }\n    \n    function selfClosing(tagName, attributes) {\n        open(tagName, attributes);\n        close(tagName);\n    }\n    \n    function text(value) {\n        fragments.push(escapeMarkdown(value));\n    }\n    \n    function asString() {\n        return fragments.join(\"\");\n    }\n\n    return {\n        asString: asString,\n        open: open,\n        close: close,\n        text: text,\n        selfClosing: selfClosing\n    };\n}\n\nexports.writer = markdownWriter;\n\nfunction escapeMarkdown(value) {\n    return value\n        .replace(/\\\\/g, '\\\\\\\\')\n        .replace(/([\\`\\*_\\{\\}\\[\\]\\(\\)\\#\\+\\-\\.\\!])/g, '\\\\$1');\n}\n\n},{\"underscore\":153}],34:[function(require,module,exports){\nvar nodes = require(\"./nodes\");\n\nexports.Element = nodes.Element;\nexports.element = nodes.element;\nexports.text = nodes.text;\nexports.readString = require(\"./reader\").readString;\nexports.writeString = require(\"./writer\").writeString;\n\n},{\"./nodes\":35,\"./reader\":36,\"./writer\":37}],35:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\n\nexports.Element = Element;\nexports.element = function(name, attributes, children) {\n    return new Element(name, attributes, children);\n};\nexports.text = function(value) {\n    return {\n        type: \"text\",\n        value: value\n    };\n};\n\n\nvar emptyElement = {\n    first: function() {\n        return null;\n    },\n    firstOrEmpty: function() {\n        return emptyElement;\n    },\n    attributes: {}\n};\n\nfunction Element(name, attributes, children) {\n    this.type = \"element\";\n    this.name = name;\n    this.attributes = attributes || {};\n    this.children = children || [];\n}\n\nElement.prototype.first = function(name) {\n    return _.find(this.children, function(child) {\n        return child.name === name;\n    });\n};\n\nElement.prototype.firstOrEmpty = function(name) {\n    return this.first(name) || emptyElement;\n};\n\nElement.prototype.getElementsByTagName = function(name) {\n    var elements = _.filter(this.children, function(child) {\n        return child.name === name;\n    });\n    return toElementList(elements);\n};\n\nElement.prototype.text = function() {\n    if (this.children.length === 0) {\n        return \"\";\n    } else if (this.children.length !== 1 || this.children[0].type !== \"text\") {\n        throw new Error(\"Not implemented\");\n    }\n    return this.children[0].value;\n};\n\nvar elementListPrototype = {\n    getElementsByTagName: function(name) {\n        return toElementList(_.flatten(this.map(function(element) {\n            return element.getElementsByTagName(name);\n        }, true)));\n    }\n};\n\nfunction toElementList(array) {\n    return _.extend(array, elementListPrototype);\n}\n\n},{\"underscore\":153}],36:[function(require,module,exports){\nvar promises = require(\"../promises\");\nvar sax = require(\"sax\");\nvar _ = require(\"underscore\");\n\nvar nodes = require(\"./nodes\");\nvar Element = nodes.Element;\n\nexports.readString = readString;\n\nfunction readString(xmlString, namespaceMap) {\n    namespaceMap = namespaceMap || {};\n    \n    var finished = false;\n    var parser = sax.parser(true, {xmlns: true, position: false});\n    \n    var rootElement = {children: []};\n    var currentElement = rootElement;\n    var stack = [];\n    \n    var deferred = promises.defer();\n    \n    parser.onopentag = function(node) {\n        var attributes = mapObject(node.attributes, function(attribute) {\n            return attribute.value;\n        }, mapName);\n        \n        var element = new Element(mapName(node), attributes);\n        currentElement.children.push(element);\n        stack.push(currentElement);\n        currentElement = element;\n    };\n    \n    function mapName(node) {\n        if (node.uri) {\n            var mappedPrefix = namespaceMap[node.uri];\n            var prefix;\n            if (mappedPrefix) {\n                prefix = mappedPrefix + \":\";\n            } else {\n                prefix = \"{\" + node.uri + \"}\";\n            }\n            return prefix + node.local;\n        } else {\n            return node.local;\n        }\n    }\n    \n    parser.onclosetag = function(node) {\n        currentElement = stack.pop();\n    };\n    \n    parser.ontext = function(text) {\n        if (currentElement !== rootElement) {\n            currentElement.children.push(nodes.text(text));\n        }\n    };\n    \n    parser.onend = function() {\n        if (!finished) {\n            finished = true;\n            deferred.resolve(rootElement.children[0]);\n        }\n    };\n    \n    parser.onerror = function(error) {\n        if (!finished) {\n            finished = true;\n            deferred.reject(error);\n        }\n    };\n    \n    parser.write(xmlString).close();\n    \n    return deferred.promise;\n}\n\nfunction mapObject(input, valueFunc, keyFunc) {\n    return _.reduce(input, function(result, value, key) {\n        var mappedKey = keyFunc(value, key, input);\n        result[mappedKey] = valueFunc(value, key, input);\n        return result;\n    }, {});\n}\n\n},{\"../promises\":23,\"./nodes\":35,\"sax\":150,\"underscore\":153}],37:[function(require,module,exports){\nvar _ = require(\"underscore\");\nvar xmlbuilder = require(\"xmlbuilder\");\n\n\nexports.writeString = writeString;\n\n\nfunction writeString(root, namespaces) {\n    var uriToPrefix = _.invert(namespaces);\n    \n    var nodeWriters = {\n        element: writeElement,\n        text: writeTextNode\n    };\n\n    function writeNode(builder, node) {\n        return nodeWriters[node.type](builder, node);\n    }\n\n    function writeElement(builder, element) {\n        var elementBuilder = builder.element(mapElementName(element.name), element.attributes);\n        element.children.forEach(function(child) {\n            writeNode(elementBuilder, child);\n        });\n    }\n    \n    function mapElementName(name) {\n        var longFormMatch = /^\\{(.*)\\}(.*)$/.exec(name);\n        if (longFormMatch) {\n            var prefix = uriToPrefix[longFormMatch[1]];\n            return prefix + (prefix === \"\" ? \"\" : \":\") + longFormMatch[2];\n        } else {\n            return name;\n        }\n    }\n    \n    function writeDocument(root) {\n        var builder = xmlbuilder\n            .create(mapElementName(root.name), {\n                version: '1.0',\n                encoding: 'UTF-8',\n                standalone: true\n            });\n        \n        _.forEach(namespaces, function(uri, prefix) {\n            var key = \"xmlns\" + (prefix === \"\" ? \"\" : \":\" + prefix);\n            builder.attribute(key, uri);\n        });\n        \n        root.children.forEach(function(child) {\n            writeNode(builder, child);\n        });\n        return builder.end();\n    }\n\n    return writeDocument(root);\n}\n\nfunction writeTextNode(builder, node) {\n    builder.text(node.value);\n}\n\n},{\"underscore\":153,\"xmlbuilder\":179}],38:[function(require,module,exports){\n(function (Buffer){\nvar JSZip = require(\"jszip\");\n\nvar promises = require(\"./promises\");\n\nexports.openArrayBuffer = openArrayBuffer;\nexports.splitPath = splitPath;\nexports.joinPath = joinPath;\n\nfunction openArrayBuffer(arrayBuffer) {\n    var zipFile = new JSZip(arrayBuffer);\n    function exists(name) {\n        return zipFile.file(name) !== null;\n    }\n    \n    function read(name, encoding) {\n        var array = zipFile.file(name).asUint8Array();\n        var buffer = new Buffer(array);\n        if (encoding) {\n            return promises.when(buffer.toString(encoding));\n        } else {\n            return promises.when(buffer);\n        }\n    }\n    \n    function write(name, contents) {\n        zipFile.file(name, contents);\n    }\n    \n    function toBuffer() {\n        return zipFile.generate({type: \"nodebuffer\"});\n    }\n    \n    return {\n        exists: exists,\n        read: read,\n        write: write,\n        toBuffer: toBuffer\n    };\n}\n\nfunction splitPath(path) {\n    var lastIndex = path.lastIndexOf(\"/\");\n    if (lastIndex === -1) {\n        return {dirname: \"\", basename: path};\n    } else {\n        return {\n            dirname: path.substring(0, lastIndex),\n            basename: path.substring(lastIndex + 1)\n        };\n    }\n}\n\nfunction joinPath() {\n    var nonEmptyPaths = Array.prototype.filter.call(arguments, function(path) {\n        return path;\n    });\n    \n    var relevantPaths = [];\n    \n    nonEmptyPaths.forEach(function(path) {\n        if (/^\\//.test(path)) {\n            relevantPaths = [path];\n        } else {\n            relevantPaths.push(path);\n        }\n    });\n    \n    return relevantPaths.join(\"/\");\n}\n\n}).call(this,require(\"buffer\").Buffer)\n},{\"./promises\":23,\"buffer\":77,\"jszip\":92}],39:[function(require,module,exports){\n'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction placeHoldersCount (b64) {\n  var len = b64.length\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // the number of equal signs (place holders)\n  // if there are two placeholders, than the two characters before it\n  // represent one byte\n  // if there is only one, then the three characters before it represent 2 bytes\n  // this is just a cheap hack to not do indexOf twice\n  return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0\n}\n\nfunction byteLength (b64) {\n  // base64 is 4/3 + up to two characters of the original data\n  return b64.length * 3 / 4 - placeHoldersCount(b64)\n}\n\nfunction toByteArray (b64) {\n  var i, j, l, tmp, placeHolders, arr\n  var len = b64.length\n  placeHolders = placeHoldersCount(b64)\n\n  arr = new Arr(len * 3 / 4 - placeHolders)\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  l = placeHolders > 0 ? len - 4 : len\n\n  var L = 0\n\n  for (i = 0, j = 0; i < l; i += 4, j += 3) {\n    tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]\n    arr[L++] = (tmp >> 16) & 0xFF\n    arr[L++] = (tmp >> 8) & 0xFF\n    arr[L++] = tmp & 0xFF\n  }\n\n  if (placeHolders === 2) {\n    tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[L++] = tmp & 0xFF\n  } else if (placeHolders === 1) {\n    tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[L++] = (tmp >> 8) & 0xFF\n    arr[L++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var output = ''\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    output += lookup[tmp >> 2]\n    output += lookup[(tmp << 4) & 0x3F]\n    output += '=='\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + (uint8[len - 1])\n    output += lookup[tmp >> 10]\n    output += lookup[(tmp >> 4) & 0x3F]\n    output += lookup[(tmp << 2) & 0x3F]\n    output += '='\n  }\n\n  parts.push(output)\n\n  return parts.join('')\n}\n\n},{}],40:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nvar SomePromiseArray = Promise._SomePromiseArray;\nfunction any(promises) {\n    var ret = new SomePromiseArray(promises);\n    var promise = ret.promise();\n    ret.setHowMany(1);\n    ret.setUnwrap();\n    ret.init();\n    return promise;\n}\n\nPromise.any = function (promises) {\n    return any(promises);\n};\n\nPromise.prototype.any = function () {\n    return any(this);\n};\n\n};\n\n},{}],41:[function(require,module,exports){\n(function (process){\n\"use strict\";\nvar firstLineError;\ntry {throw new Error(); } catch (e) {firstLineError = e;}\nvar schedule = require(\"./schedule\");\nvar Queue = require(\"./queue\");\nvar util = require(\"./util\");\n\nfunction Async() {\n    this._customScheduler = false;\n    this._isTickUsed = false;\n    this._lateQueue = new Queue(16);\n    this._normalQueue = new Queue(16);\n    this._haveDrainedQueues = false;\n    this._trampolineEnabled = true;\n    var self = this;\n    this.drainQueues = function () {\n        self._drainQueues();\n    };\n    this._schedule = schedule;\n}\n\nAsync.prototype.setScheduler = function(fn) {\n    var prev = this._schedule;\n    this._schedule = fn;\n    this._customScheduler = true;\n    return prev;\n};\n\nAsync.prototype.hasCustomScheduler = function() {\n    return this._customScheduler;\n};\n\nAsync.prototype.enableTrampoline = function() {\n    this._trampolineEnabled = true;\n};\n\nAsync.prototype.disableTrampolineIfNecessary = function() {\n    if (util.hasDevTools) {\n        this._trampolineEnabled = false;\n    }\n};\n\nAsync.prototype.haveItemsQueued = function () {\n    return this._isTickUsed || this._haveDrainedQueues;\n};\n\n\nAsync.prototype.fatalError = function(e, isNode) {\n    if (isNode) {\n        process.stderr.write(\"Fatal \" + (e instanceof Error ? e.stack : e) +\n            \"\\n\");\n        process.exit(2);\n    } else {\n        this.throwLater(e);\n    }\n};\n\nAsync.prototype.throwLater = function(fn, arg) {\n    if (arguments.length === 1) {\n        arg = fn;\n        fn = function () { throw arg; };\n    }\n    if (typeof setTimeout !== \"undefined\") {\n        setTimeout(function() {\n            fn(arg);\n        }, 0);\n    } else try {\n        this._schedule(function() {\n            fn(arg);\n        });\n    } catch (e) {\n        throw new Error(\"No async scheduler available\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n};\n\nfunction AsyncInvokeLater(fn, receiver, arg) {\n    this._lateQueue.push(fn, receiver, arg);\n    this._queueTick();\n}\n\nfunction AsyncInvoke(fn, receiver, arg) {\n    this._normalQueue.push(fn, receiver, arg);\n    this._queueTick();\n}\n\nfunction AsyncSettlePromises(promise) {\n    this._normalQueue._pushOne(promise);\n    this._queueTick();\n}\n\nif (!util.hasDevTools) {\n    Async.prototype.invokeLater = AsyncInvokeLater;\n    Async.prototype.invoke = AsyncInvoke;\n    Async.prototype.settlePromises = AsyncSettlePromises;\n} else {\n    Async.prototype.invokeLater = function (fn, receiver, arg) {\n        if (this._trampolineEnabled) {\n            AsyncInvokeLater.call(this, fn, receiver, arg);\n        } else {\n            this._schedule(function() {\n                setTimeout(function() {\n                    fn.call(receiver, arg);\n                }, 100);\n            });\n        }\n    };\n\n    Async.prototype.invoke = function (fn, receiver, arg) {\n        if (this._trampolineEnabled) {\n            AsyncInvoke.call(this, fn, receiver, arg);\n        } else {\n            this._schedule(function() {\n                fn.call(receiver, arg);\n            });\n        }\n    };\n\n    Async.prototype.settlePromises = function(promise) {\n        if (this._trampolineEnabled) {\n            AsyncSettlePromises.call(this, promise);\n        } else {\n            this._schedule(function() {\n                promise._settlePromises();\n            });\n        }\n    };\n}\n\nAsync.prototype._drainQueue = function(queue) {\n    while (queue.length() > 0) {\n        var fn = queue.shift();\n        if (typeof fn !== \"function\") {\n            fn._settlePromises();\n            continue;\n        }\n        var receiver = queue.shift();\n        var arg = queue.shift();\n        fn.call(receiver, arg);\n    }\n};\n\nAsync.prototype._drainQueues = function () {\n    this._drainQueue(this._normalQueue);\n    this._reset();\n    this._haveDrainedQueues = true;\n    this._drainQueue(this._lateQueue);\n};\n\nAsync.prototype._queueTick = function () {\n    if (!this._isTickUsed) {\n        this._isTickUsed = true;\n        this._schedule(this.drainQueues);\n    }\n};\n\nAsync.prototype._reset = function () {\n    this._isTickUsed = false;\n};\n\nmodule.exports = Async;\nmodule.exports.firstLineError = firstLineError;\n\n}).call(this,require('_process'))\n},{\"./queue\":64,\"./schedule\":67,\"./util\":74,\"_process\":138}],42:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) {\nvar calledBind = false;\nvar rejectThis = function(_, e) {\n    this._reject(e);\n};\n\nvar targetRejected = function(e, context) {\n    context.promiseRejectionQueued = true;\n    context.bindingPromise._then(rejectThis, rejectThis, null, this, e);\n};\n\nvar bindingResolved = function(thisArg, context) {\n    if (((this._bitField & 50397184) === 0)) {\n        this._resolveCallback(context.target);\n    }\n};\n\nvar bindingRejected = function(e, context) {\n    if (!context.promiseRejectionQueued) this._reject(e);\n};\n\nPromise.prototype.bind = function (thisArg) {\n    if (!calledBind) {\n        calledBind = true;\n        Promise.prototype._propagateFrom = debug.propagateFromFunction();\n        Promise.prototype._boundValue = debug.boundValueFunction();\n    }\n    var maybePromise = tryConvertToPromise(thisArg);\n    var ret = new Promise(INTERNAL);\n    ret._propagateFrom(this, 1);\n    var target = this._target();\n    ret._setBoundTo(maybePromise);\n    if (maybePromise instanceof Promise) {\n        var context = {\n            promiseRejectionQueued: false,\n            promise: ret,\n            target: target,\n            bindingPromise: maybePromise\n        };\n        target._then(INTERNAL, targetRejected, undefined, ret, context);\n        maybePromise._then(\n            bindingResolved, bindingRejected, undefined, ret, context);\n        ret._setOnCancel(maybePromise);\n    } else {\n        ret._resolveCallback(target);\n    }\n    return ret;\n};\n\nPromise.prototype._setBoundTo = function (obj) {\n    if (obj !== undefined) {\n        this._bitField = this._bitField | 2097152;\n        this._boundTo = obj;\n    } else {\n        this._bitField = this._bitField & (~2097152);\n    }\n};\n\nPromise.prototype._isBound = function () {\n    return (this._bitField & 2097152) === 2097152;\n};\n\nPromise.bind = function (thisArg, value) {\n    return Promise.resolve(value).bind(thisArg);\n};\n};\n\n},{}],43:[function(require,module,exports){\n\"use strict\";\nvar cr = Object.create;\nif (cr) {\n    var callerCache = cr(null);\n    var getterCache = cr(null);\n    callerCache[\" size\"] = getterCache[\" size\"] = 0;\n}\n\nmodule.exports = function(Promise) {\nvar util = require(\"./util\");\nvar canEvaluate = util.canEvaluate;\nvar isIdentifier = util.isIdentifier;\n\nvar getMethodCaller;\nvar getGetter;\nif (!false) {\nvar makeMethodCaller = function (methodName) {\n    return new Function(\"ensureMethod\", \"                                    \\n\\\n        return function(obj) {                                               \\n\\\n            'use strict'                                                     \\n\\\n            var len = this.length;                                           \\n\\\n            ensureMethod(obj, 'methodName');                                 \\n\\\n            switch(len) {                                                    \\n\\\n                case 1: return obj.methodName(this[0]);                      \\n\\\n                case 2: return obj.methodName(this[0], this[1]);             \\n\\\n                case 3: return obj.methodName(this[0], this[1], this[2]);    \\n\\\n                case 0: return obj.methodName();                             \\n\\\n                default:                                                     \\n\\\n                    return obj.methodName.apply(obj, this);                  \\n\\\n            }                                                                \\n\\\n        };                                                                   \\n\\\n        \".replace(/methodName/g, methodName))(ensureMethod);\n};\n\nvar makeGetter = function (propertyName) {\n    return new Function(\"obj\", \"                                             \\n\\\n        'use strict';                                                        \\n\\\n        return obj.propertyName;                                             \\n\\\n        \".replace(\"propertyName\", propertyName));\n};\n\nvar getCompiled = function(name, compiler, cache) {\n    var ret = cache[name];\n    if (typeof ret !== \"function\") {\n        if (!isIdentifier(name)) {\n            return null;\n        }\n        ret = compiler(name);\n        cache[name] = ret;\n        cache[\" size\"]++;\n        if (cache[\" size\"] > 512) {\n            var keys = Object.keys(cache);\n            for (var i = 0; i < 256; ++i) delete cache[keys[i]];\n            cache[\" size\"] = keys.length - 256;\n        }\n    }\n    return ret;\n};\n\ngetMethodCaller = function(name) {\n    return getCompiled(name, makeMethodCaller, callerCache);\n};\n\ngetGetter = function(name) {\n    return getCompiled(name, makeGetter, getterCache);\n};\n}\n\nfunction ensureMethod(obj, methodName) {\n    var fn;\n    if (obj != null) fn = obj[methodName];\n    if (typeof fn !== \"function\") {\n        var message = \"Object \" + util.classString(obj) + \" has no method '\" +\n            util.toString(methodName) + \"'\";\n        throw new Promise.TypeError(message);\n    }\n    return fn;\n}\n\nfunction caller(obj) {\n    var methodName = this.pop();\n    var fn = ensureMethod(obj, methodName);\n    return fn.apply(obj, this);\n}\nPromise.prototype.call = function (methodName) {\n    var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};\n    if (!false) {\n        if (canEvaluate) {\n            var maybeCaller = getMethodCaller(methodName);\n            if (maybeCaller !== null) {\n                return this._then(\n                    maybeCaller, undefined, undefined, args, undefined);\n            }\n        }\n    }\n    args.push(methodName);\n    return this._then(caller, undefined, undefined, args, undefined);\n};\n\nfunction namedGetter(obj) {\n    return obj[this];\n}\nfunction indexedGetter(obj) {\n    var index = +this;\n    if (index < 0) index = Math.max(0, index + obj.length);\n    return obj[index];\n}\nPromise.prototype.get = function (propertyName) {\n    var isIndex = (typeof propertyName === \"number\");\n    var getter;\n    if (!isIndex) {\n        if (canEvaluate) {\n            var maybeGetter = getGetter(propertyName);\n            getter = maybeGetter !== null ? maybeGetter : namedGetter;\n        } else {\n            getter = namedGetter;\n        }\n    } else {\n        getter = indexedGetter;\n    }\n    return this._then(getter, undefined, undefined, propertyName, undefined);\n};\n};\n\n},{\"./util\":74}],44:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, PromiseArray, apiRejection, debug) {\nvar util = require(\"./util\");\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\nvar async = Promise._async;\n\nPromise.prototype[\"break\"] = Promise.prototype.cancel = function() {\n    if (!debug.cancellation()) return this._warn(\"cancellation is disabled\");\n\n    var promise = this;\n    var child = promise;\n    while (promise._isCancellable()) {\n        if (!promise._cancelBy(child)) {\n            if (child._isFollowing()) {\n                child._followee().cancel();\n            } else {\n                child._cancelBranched();\n            }\n            break;\n        }\n\n        var parent = promise._cancellationParent;\n        if (parent == null || !parent._isCancellable()) {\n            if (promise._isFollowing()) {\n                promise._followee().cancel();\n            } else {\n                promise._cancelBranched();\n            }\n            break;\n        } else {\n            if (promise._isFollowing()) promise._followee().cancel();\n            promise._setWillBeCancelled();\n            child = promise;\n            promise = parent;\n        }\n    }\n};\n\nPromise.prototype._branchHasCancelled = function() {\n    this._branchesRemainingToCancel--;\n};\n\nPromise.prototype._enoughBranchesHaveCancelled = function() {\n    return this._branchesRemainingToCancel === undefined ||\n           this._branchesRemainingToCancel <= 0;\n};\n\nPromise.prototype._cancelBy = function(canceller) {\n    if (canceller === this) {\n        this._branchesRemainingToCancel = 0;\n        this._invokeOnCancel();\n        return true;\n    } else {\n        this._branchHasCancelled();\n        if (this._enoughBranchesHaveCancelled()) {\n            this._invokeOnCancel();\n            return true;\n        }\n    }\n    return false;\n};\n\nPromise.prototype._cancelBranched = function() {\n    if (this._enoughBranchesHaveCancelled()) {\n        this._cancel();\n    }\n};\n\nPromise.prototype._cancel = function() {\n    if (!this._isCancellable()) return;\n    this._setCancelled();\n    async.invoke(this._cancelPromises, this, undefined);\n};\n\nPromise.prototype._cancelPromises = function() {\n    if (this._length() > 0) this._settlePromises();\n};\n\nPromise.prototype._unsetOnCancel = function() {\n    this._onCancelField = undefined;\n};\n\nPromise.prototype._isCancellable = function() {\n    return this.isPending() && !this._isCancelled();\n};\n\nPromise.prototype.isCancellable = function() {\n    return this.isPending() && !this.isCancelled();\n};\n\nPromise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) {\n    if (util.isArray(onCancelCallback)) {\n        for (var i = 0; i < onCancelCallback.length; ++i) {\n            this._doInvokeOnCancel(onCancelCallback[i], internalOnly);\n        }\n    } else if (onCancelCallback !== undefined) {\n        if (typeof onCancelCallback === \"function\") {\n            if (!internalOnly) {\n                var e = tryCatch(onCancelCallback).call(this._boundValue());\n                if (e === errorObj) {\n                    this._attachExtraTrace(e.e);\n                    async.throwLater(e.e);\n                }\n            }\n        } else {\n            onCancelCallback._resultCancelled(this);\n        }\n    }\n};\n\nPromise.prototype._invokeOnCancel = function() {\n    var onCancelCallback = this._onCancel();\n    this._unsetOnCancel();\n    async.invoke(this._doInvokeOnCancel, this, onCancelCallback);\n};\n\nPromise.prototype._invokeInternalOnCancel = function() {\n    if (this._isCancellable()) {\n        this._doInvokeOnCancel(this._onCancel(), true);\n        this._unsetOnCancel();\n    }\n};\n\nPromise.prototype._resultCancelled = function() {\n    this.cancel();\n};\n\n};\n\n},{\"./util\":74}],45:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(NEXT_FILTER) {\nvar util = require(\"./util\");\nvar getKeys = require(\"./es5\").keys;\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\n\nfunction catchFilter(instances, cb, promise) {\n    return function(e) {\n        var boundTo = promise._boundValue();\n        predicateLoop: for (var i = 0; i < instances.length; ++i) {\n            var item = instances[i];\n\n            if (item === Error ||\n                (item != null && item.prototype instanceof Error)) {\n                if (e instanceof item) {\n                    return tryCatch(cb).call(boundTo, e);\n                }\n            } else if (typeof item === \"function\") {\n                var matchesPredicate = tryCatch(item).call(boundTo, e);\n                if (matchesPredicate === errorObj) {\n                    return matchesPredicate;\n                } else if (matchesPredicate) {\n                    return tryCatch(cb).call(boundTo, e);\n                }\n            } else if (util.isObject(e)) {\n                var keys = getKeys(item);\n                for (var j = 0; j < keys.length; ++j) {\n                    var key = keys[j];\n                    if (item[key] != e[key]) {\n                        continue predicateLoop;\n                    }\n                }\n                return tryCatch(cb).call(boundTo, e);\n            }\n        }\n        return NEXT_FILTER;\n    };\n}\n\nreturn catchFilter;\n};\n\n},{\"./es5\":51,\"./util\":74}],46:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nvar longStackTraces = false;\nvar contextStack = [];\n\nPromise.prototype._promiseCreated = function() {};\nPromise.prototype._pushContext = function() {};\nPromise.prototype._popContext = function() {return null;};\nPromise._peekContext = Promise.prototype._peekContext = function() {};\n\nfunction Context() {\n    this._trace = new Context.CapturedTrace(peekContext());\n}\nContext.prototype._pushContext = function () {\n    if (this._trace !== undefined) {\n        this._trace._promiseCreated = null;\n        contextStack.push(this._trace);\n    }\n};\n\nContext.prototype._popContext = function () {\n    if (this._trace !== undefined) {\n        var trace = contextStack.pop();\n        var ret = trace._promiseCreated;\n        trace._promiseCreated = null;\n        return ret;\n    }\n    return null;\n};\n\nfunction createContext() {\n    if (longStackTraces) return new Context();\n}\n\nfunction peekContext() {\n    var lastIndex = contextStack.length - 1;\n    if (lastIndex >= 0) {\n        return contextStack[lastIndex];\n    }\n    return undefined;\n}\nContext.CapturedTrace = null;\nContext.create = createContext;\nContext.deactivateLongStackTraces = function() {};\nContext.activateLongStackTraces = function() {\n    var Promise_pushContext = Promise.prototype._pushContext;\n    var Promise_popContext = Promise.prototype._popContext;\n    var Promise_PeekContext = Promise._peekContext;\n    var Promise_peekContext = Promise.prototype._peekContext;\n    var Promise_promiseCreated = Promise.prototype._promiseCreated;\n    Context.deactivateLongStackTraces = function() {\n        Promise.prototype._pushContext = Promise_pushContext;\n        Promise.prototype._popContext = Promise_popContext;\n        Promise._peekContext = Promise_PeekContext;\n        Promise.prototype._peekContext = Promise_peekContext;\n        Promise.prototype._promiseCreated = Promise_promiseCreated;\n        longStackTraces = false;\n    };\n    longStackTraces = true;\n    Promise.prototype._pushContext = Context.prototype._pushContext;\n    Promise.prototype._popContext = Context.prototype._popContext;\n    Promise._peekContext = Promise.prototype._peekContext = peekContext;\n    Promise.prototype._promiseCreated = function() {\n        var ctx = this._peekContext();\n        if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this;\n    };\n};\nreturn Context;\n};\n\n},{}],47:[function(require,module,exports){\n(function (process){\n\"use strict\";\nmodule.exports = function(Promise, Context) {\nvar getDomain = Promise._getDomain;\nvar async = Promise._async;\nvar Warning = require(\"./errors\").Warning;\nvar util = require(\"./util\");\nvar canAttachTrace = util.canAttachTrace;\nvar unhandledRejectionHandled;\nvar possiblyUnhandledRejection;\nvar bluebirdFramePattern =\n    /[\\\\\\/]bluebird[\\\\\\/]js[\\\\\\/](release|debug|instrumented)/;\nvar nodeFramePattern = /\\((?:timers\\.js):\\d+:\\d+\\)/;\nvar parseLinePattern = /[\\/<\\(](.+?):(\\d+):(\\d+)\\)?\\s*$/;\nvar stackFramePattern = null;\nvar formatStack = null;\nvar indentStackFrames = false;\nvar printWarning;\nvar debugging = !!(util.env(\"BLUEBIRD_DEBUG\") != 0 &&\n                        (false ||\n                         util.env(\"BLUEBIRD_DEBUG\") ||\n                         util.env(\"NODE_ENV\") === \"development\"));\n\nvar warnings = !!(util.env(\"BLUEBIRD_WARNINGS\") != 0 &&\n    (debugging || util.env(\"BLUEBIRD_WARNINGS\")));\n\nvar longStackTraces = !!(util.env(\"BLUEBIRD_LONG_STACK_TRACES\") != 0 &&\n    (debugging || util.env(\"BLUEBIRD_LONG_STACK_TRACES\")));\n\nvar wForgottenReturn = util.env(\"BLUEBIRD_W_FORGOTTEN_RETURN\") != 0 &&\n    (warnings || !!util.env(\"BLUEBIRD_W_FORGOTTEN_RETURN\"));\n\nPromise.prototype.suppressUnhandledRejections = function() {\n    var target = this._target();\n    target._bitField = ((target._bitField & (~1048576)) |\n                      524288);\n};\n\nPromise.prototype._ensurePossibleRejectionHandled = function () {\n    if ((this._bitField & 524288) !== 0) return;\n    this._setRejectionIsUnhandled();\n    async.invokeLater(this._notifyUnhandledRejection, this, undefined);\n};\n\nPromise.prototype._notifyUnhandledRejectionIsHandled = function () {\n    fireRejectionEvent(\"rejectionHandled\",\n                                  unhandledRejectionHandled, undefined, this);\n};\n\nPromise.prototype._setReturnedNonUndefined = function() {\n    this._bitField = this._bitField | 268435456;\n};\n\nPromise.prototype._returnedNonUndefined = function() {\n    return (this._bitField & 268435456) !== 0;\n};\n\nPromise.prototype._notifyUnhandledRejection = function () {\n    if (this._isRejectionUnhandled()) {\n        var reason = this._settledValue();\n        this._setUnhandledRejectionIsNotified();\n        fireRejectionEvent(\"unhandledRejection\",\n                                      possiblyUnhandledRejection, reason, this);\n    }\n};\n\nPromise.prototype._setUnhandledRejectionIsNotified = function () {\n    this._bitField = this._bitField | 262144;\n};\n\nPromise.prototype._unsetUnhandledRejectionIsNotified = function () {\n    this._bitField = this._bitField & (~262144);\n};\n\nPromise.prototype._isUnhandledRejectionNotified = function () {\n    return (this._bitField & 262144) > 0;\n};\n\nPromise.prototype._setRejectionIsUnhandled = function () {\n    this._bitField = this._bitField | 1048576;\n};\n\nPromise.prototype._unsetRejectionIsUnhandled = function () {\n    this._bitField = this._bitField & (~1048576);\n    if (this._isUnhandledRejectionNotified()) {\n        this._unsetUnhandledRejectionIsNotified();\n        this._notifyUnhandledRejectionIsHandled();\n    }\n};\n\nPromise.prototype._isRejectionUnhandled = function () {\n    return (this._bitField & 1048576) > 0;\n};\n\nPromise.prototype._warn = function(message, shouldUseOwnTrace, promise) {\n    return warn(message, shouldUseOwnTrace, promise || this);\n};\n\nPromise.onPossiblyUnhandledRejection = function (fn) {\n    var domain = getDomain();\n    possiblyUnhandledRejection =\n        typeof fn === \"function\" ? (domain === null ?\n                                            fn : util.domainBind(domain, fn))\n                                 : undefined;\n};\n\nPromise.onUnhandledRejectionHandled = function (fn) {\n    var domain = getDomain();\n    unhandledRejectionHandled =\n        typeof fn === \"function\" ? (domain === null ?\n                                            fn : util.domainBind(domain, fn))\n                                 : undefined;\n};\n\nvar disableLongStackTraces = function() {};\nPromise.longStackTraces = function () {\n    if (async.haveItemsQueued() && !config.longStackTraces) {\n        throw new Error(\"cannot enable long stack traces after promises have been created\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    if (!config.longStackTraces && longStackTracesIsSupported()) {\n        var Promise_captureStackTrace = Promise.prototype._captureStackTrace;\n        var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace;\n        config.longStackTraces = true;\n        disableLongStackTraces = function() {\n            if (async.haveItemsQueued() && !config.longStackTraces) {\n                throw new Error(\"cannot enable long stack traces after promises have been created\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n            }\n            Promise.prototype._captureStackTrace = Promise_captureStackTrace;\n            Promise.prototype._attachExtraTrace = Promise_attachExtraTrace;\n            Context.deactivateLongStackTraces();\n            async.enableTrampoline();\n            config.longStackTraces = false;\n        };\n        Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace;\n        Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace;\n        Context.activateLongStackTraces();\n        async.disableTrampolineIfNecessary();\n    }\n};\n\nPromise.hasLongStackTraces = function () {\n    return config.longStackTraces && longStackTracesIsSupported();\n};\n\nvar fireDomEvent = (function() {\n    try {\n        if (typeof CustomEvent === \"function\") {\n            var event = new CustomEvent(\"CustomEvent\");\n            util.global.dispatchEvent(event);\n            return function(name, event) {\n                var domEvent = new CustomEvent(name.toLowerCase(), {\n                    detail: event,\n                    cancelable: true\n                });\n                return !util.global.dispatchEvent(domEvent);\n            };\n        } else if (typeof Event === \"function\") {\n            var event = new Event(\"CustomEvent\");\n            util.global.dispatchEvent(event);\n            return function(name, event) {\n                var domEvent = new Event(name.toLowerCase(), {\n                    cancelable: true\n                });\n                domEvent.detail = event;\n                return !util.global.dispatchEvent(domEvent);\n            };\n        } else {\n            var event = document.createEvent(\"CustomEvent\");\n            event.initCustomEvent(\"testingtheevent\", false, true, {});\n            util.global.dispatchEvent(event);\n            return function(name, event) {\n                var domEvent = document.createEvent(\"CustomEvent\");\n                domEvent.initCustomEvent(name.toLowerCase(), false, true,\n                    event);\n                return !util.global.dispatchEvent(domEvent);\n            };\n        }\n    } catch (e) {}\n    return function() {\n        return false;\n    };\n})();\n\nvar fireGlobalEvent = (function() {\n    if (util.isNode) {\n        return function() {\n            return process.emit.apply(process, arguments);\n        };\n    } else {\n        if (!util.global) {\n            return function() {\n                return false;\n            };\n        }\n        return function(name) {\n            var methodName = \"on\" + name.toLowerCase();\n            var method = util.global[methodName];\n            if (!method) return false;\n            method.apply(util.global, [].slice.call(arguments, 1));\n            return true;\n        };\n    }\n})();\n\nfunction generatePromiseLifecycleEventObject(name, promise) {\n    return {promise: promise};\n}\n\nvar eventToObjectGenerator = {\n    promiseCreated: generatePromiseLifecycleEventObject,\n    promiseFulfilled: generatePromiseLifecycleEventObject,\n    promiseRejected: generatePromiseLifecycleEventObject,\n    promiseResolved: generatePromiseLifecycleEventObject,\n    promiseCancelled: generatePromiseLifecycleEventObject,\n    promiseChained: function(name, promise, child) {\n        return {promise: promise, child: child};\n    },\n    warning: function(name, warning) {\n        return {warning: warning};\n    },\n    unhandledRejection: function (name, reason, promise) {\n        return {reason: reason, promise: promise};\n    },\n    rejectionHandled: generatePromiseLifecycleEventObject\n};\n\nvar activeFireEvent = function (name) {\n    var globalEventFired = false;\n    try {\n        globalEventFired = fireGlobalEvent.apply(null, arguments);\n    } catch (e) {\n        async.throwLater(e);\n        globalEventFired = true;\n    }\n\n    var domEventFired = false;\n    try {\n        domEventFired = fireDomEvent(name,\n                    eventToObjectGenerator[name].apply(null, arguments));\n    } catch (e) {\n        async.throwLater(e);\n        domEventFired = true;\n    }\n\n    return domEventFired || globalEventFired;\n};\n\nPromise.config = function(opts) {\n    opts = Object(opts);\n    if (\"longStackTraces\" in opts) {\n        if (opts.longStackTraces) {\n            Promise.longStackTraces();\n        } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {\n            disableLongStackTraces();\n        }\n    }\n    if (\"warnings\" in opts) {\n        var warningsOption = opts.warnings;\n        config.warnings = !!warningsOption;\n        wForgottenReturn = config.warnings;\n\n        if (util.isObject(warningsOption)) {\n            if (\"wForgottenReturn\" in warningsOption) {\n                wForgottenReturn = !!warningsOption.wForgottenReturn;\n            }\n        }\n    }\n    if (\"cancellation\" in opts && opts.cancellation && !config.cancellation) {\n        if (async.haveItemsQueued()) {\n            throw new Error(\n                \"cannot enable cancellation after promises are in use\");\n        }\n        Promise.prototype._clearCancellationData =\n            cancellationClearCancellationData;\n        Promise.prototype._propagateFrom = cancellationPropagateFrom;\n        Promise.prototype._onCancel = cancellationOnCancel;\n        Promise.prototype._setOnCancel = cancellationSetOnCancel;\n        Promise.prototype._attachCancellationCallback =\n            cancellationAttachCancellationCallback;\n        Promise.prototype._execute = cancellationExecute;\n        propagateFromFunction = cancellationPropagateFrom;\n        config.cancellation = true;\n    }\n    if (\"monitoring\" in opts) {\n        if (opts.monitoring && !config.monitoring) {\n            config.monitoring = true;\n            Promise.prototype._fireEvent = activeFireEvent;\n        } else if (!opts.monitoring && config.monitoring) {\n            config.monitoring = false;\n            Promise.prototype._fireEvent = defaultFireEvent;\n        }\n    }\n    return Promise;\n};\n\nfunction defaultFireEvent() { return false; }\n\nPromise.prototype._fireEvent = defaultFireEvent;\nPromise.prototype._execute = function(executor, resolve, reject) {\n    try {\n        executor(resolve, reject);\n    } catch (e) {\n        return e;\n    }\n};\nPromise.prototype._onCancel = function () {};\nPromise.prototype._setOnCancel = function (handler) { ; };\nPromise.prototype._attachCancellationCallback = function(onCancel) {\n    ;\n};\nPromise.prototype._captureStackTrace = function () {};\nPromise.prototype._attachExtraTrace = function () {};\nPromise.prototype._clearCancellationData = function() {};\nPromise.prototype._propagateFrom = function (parent, flags) {\n    ;\n    ;\n};\n\nfunction cancellationExecute(executor, resolve, reject) {\n    var promise = this;\n    try {\n        executor(resolve, reject, function(onCancel) {\n            if (typeof onCancel !== \"function\") {\n                throw new TypeError(\"onCancel must be a function, got: \" +\n                                    util.toString(onCancel));\n            }\n            promise._attachCancellationCallback(onCancel);\n        });\n    } catch (e) {\n        return e;\n    }\n}\n\nfunction cancellationAttachCancellationCallback(onCancel) {\n    if (!this._isCancellable()) return this;\n\n    var previousOnCancel = this._onCancel();\n    if (previousOnCancel !== undefined) {\n        if (util.isArray(previousOnCancel)) {\n            previousOnCancel.push(onCancel);\n        } else {\n            this._setOnCancel([previousOnCancel, onCancel]);\n        }\n    } else {\n        this._setOnCancel(onCancel);\n    }\n}\n\nfunction cancellationOnCancel() {\n    return this._onCancelField;\n}\n\nfunction cancellationSetOnCancel(onCancel) {\n    this._onCancelField = onCancel;\n}\n\nfunction cancellationClearCancellationData() {\n    this._cancellationParent = undefined;\n    this._onCancelField = undefined;\n}\n\nfunction cancellationPropagateFrom(parent, flags) {\n    if ((flags & 1) !== 0) {\n        this._cancellationParent = parent;\n        var branchesRemainingToCancel = parent._branchesRemainingToCancel;\n        if (branchesRemainingToCancel === undefined) {\n            branchesRemainingToCancel = 0;\n        }\n        parent._branchesRemainingToCancel = branchesRemainingToCancel + 1;\n    }\n    if ((flags & 2) !== 0 && parent._isBound()) {\n        this._setBoundTo(parent._boundTo);\n    }\n}\n\nfunction bindingPropagateFrom(parent, flags) {\n    if ((flags & 2) !== 0 && parent._isBound()) {\n        this._setBoundTo(parent._boundTo);\n    }\n}\nvar propagateFromFunction = bindingPropagateFrom;\n\nfunction boundValueFunction() {\n    var ret = this._boundTo;\n    if (ret !== undefined) {\n        if (ret instanceof Promise) {\n            if (ret.isFulfilled()) {\n                return ret.value();\n            } else {\n                return undefined;\n            }\n        }\n    }\n    return ret;\n}\n\nfunction longStackTracesCaptureStackTrace() {\n    this._trace = new CapturedTrace(this._peekContext());\n}\n\nfunction longStackTracesAttachExtraTrace(error, ignoreSelf) {\n    if (canAttachTrace(error)) {\n        var trace = this._trace;\n        if (trace !== undefined) {\n            if (ignoreSelf) trace = trace._parent;\n        }\n        if (trace !== undefined) {\n            trace.attachExtraTrace(error);\n        } else if (!error.__stackCleaned__) {\n            var parsed = parseStackAndMessage(error);\n            util.notEnumerableProp(error, \"stack\",\n                parsed.message + \"\\n\" + parsed.stack.join(\"\\n\"));\n            util.notEnumerableProp(error, \"__stackCleaned__\", true);\n        }\n    }\n}\n\nfunction checkForgottenReturns(returnValue, promiseCreated, name, promise,\n                               parent) {\n    if (returnValue === undefined && promiseCreated !== null &&\n        wForgottenReturn) {\n        if (parent !== undefined && parent._returnedNonUndefined()) return;\n        if ((promise._bitField & 65535) === 0) return;\n\n        if (name) name = name + \" \";\n        var handlerLine = \"\";\n        var creatorLine = \"\";\n        if (promiseCreated._trace) {\n            var traceLines = promiseCreated._trace.stack.split(\"\\n\");\n            var stack = cleanStack(traceLines);\n            for (var i = stack.length - 1; i >= 0; --i) {\n                var line = stack[i];\n                if (!nodeFramePattern.test(line)) {\n                    var lineMatches = line.match(parseLinePattern);\n                    if (lineMatches) {\n                        handlerLine  = \"at \" + lineMatches[1] +\n                            \":\" + lineMatches[2] + \":\" + lineMatches[3] + \" \";\n                    }\n                    break;\n                }\n            }\n\n            if (stack.length > 0) {\n                var firstUserLine = stack[0];\n                for (var i = 0; i < traceLines.length; ++i) {\n\n                    if (traceLines[i] === firstUserLine) {\n                        if (i > 0) {\n                            creatorLine = \"\\n\" + traceLines[i - 1];\n                        }\n                        break;\n                    }\n                }\n\n            }\n        }\n        var msg = \"a promise was created in a \" + name +\n            \"handler \" + handlerLine + \"but was not returned from it, \" +\n            \"see http://goo.gl/rRqMUw\" +\n            creatorLine;\n        promise._warn(msg, true, promiseCreated);\n    }\n}\n\nfunction deprecated(name, replacement) {\n    var message = name +\n        \" is deprecated and will be removed in a future version.\";\n    if (replacement) message += \" Use \" + replacement + \" instead.\";\n    return warn(message);\n}\n\nfunction warn(message, shouldUseOwnTrace, promise) {\n    if (!config.warnings) return;\n    var warning = new Warning(message);\n    var ctx;\n    if (shouldUseOwnTrace) {\n        promise._attachExtraTrace(warning);\n    } else if (config.longStackTraces && (ctx = Promise._peekContext())) {\n        ctx.attachExtraTrace(warning);\n    } else {\n        var parsed = parseStackAndMessage(warning);\n        warning.stack = parsed.message + \"\\n\" + parsed.stack.join(\"\\n\");\n    }\n\n    if (!activeFireEvent(\"warning\", warning)) {\n        formatAndLogError(warning, \"\", true);\n    }\n}\n\nfunction reconstructStack(message, stacks) {\n    for (var i = 0; i < stacks.length - 1; ++i) {\n        stacks[i].push(\"From previous event:\");\n        stacks[i] = stacks[i].join(\"\\n\");\n    }\n    if (i < stacks.length) {\n        stacks[i] = stacks[i].join(\"\\n\");\n    }\n    return message + \"\\n\" + stacks.join(\"\\n\");\n}\n\nfunction removeDuplicateOrEmptyJumps(stacks) {\n    for (var i = 0; i < stacks.length; ++i) {\n        if (stacks[i].length === 0 ||\n            ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {\n            stacks.splice(i, 1);\n            i--;\n        }\n    }\n}\n\nfunction removeCommonRoots(stacks) {\n    var current = stacks[0];\n    for (var i = 1; i < stacks.length; ++i) {\n        var prev = stacks[i];\n        var currentLastIndex = current.length - 1;\n        var currentLastLine = current[currentLastIndex];\n        var commonRootMeetPoint = -1;\n\n        for (var j = prev.length - 1; j >= 0; --j) {\n            if (prev[j] === currentLastLine) {\n                commonRootMeetPoint = j;\n                break;\n            }\n        }\n\n        for (var j = commonRootMeetPoint; j >= 0; --j) {\n            var line = prev[j];\n            if (current[currentLastIndex] === line) {\n                current.pop();\n                currentLastIndex--;\n            } else {\n                break;\n            }\n        }\n        current = prev;\n    }\n}\n\nfunction cleanStack(stack) {\n    var ret = [];\n    for (var i = 0; i < stack.length; ++i) {\n        var line = stack[i];\n        var isTraceLine = \"    (No stack trace)\" === line ||\n            stackFramePattern.test(line);\n        var isInternalFrame = isTraceLine && shouldIgnore(line);\n        if (isTraceLine && !isInternalFrame) {\n            if (indentStackFrames && line.charAt(0) !== \" \") {\n                line = \"    \" + line;\n            }\n            ret.push(line);\n        }\n    }\n    return ret;\n}\n\nfunction stackFramesAsArray(error) {\n    var stack = error.stack.replace(/\\s+$/g, \"\").split(\"\\n\");\n    for (var i = 0; i < stack.length; ++i) {\n        var line = stack[i];\n        if (\"    (No stack trace)\" === line || stackFramePattern.test(line)) {\n            break;\n        }\n    }\n    if (i > 0 && error.name != \"SyntaxError\") {\n        stack = stack.slice(i);\n    }\n    return stack;\n}\n\nfunction parseStackAndMessage(error) {\n    var stack = error.stack;\n    var message = error.toString();\n    stack = typeof stack === \"string\" && stack.length > 0\n                ? stackFramesAsArray(error) : [\"    (No stack trace)\"];\n    return {\n        message: message,\n        stack: error.name == \"SyntaxError\" ? stack : cleanStack(stack)\n    };\n}\n\nfunction formatAndLogError(error, title, isSoft) {\n    if (typeof console !== \"undefined\") {\n        var message;\n        if (util.isObject(error)) {\n            var stack = error.stack;\n            message = title + formatStack(stack, error);\n        } else {\n            message = title + String(error);\n        }\n        if (typeof printWarning === \"function\") {\n            printWarning(message, isSoft);\n        } else if (typeof console.log === \"function\" ||\n            typeof console.log === \"object\") {\n            console.log(message);\n        }\n    }\n}\n\nfunction fireRejectionEvent(name, localHandler, reason, promise) {\n    var localEventFired = false;\n    try {\n        if (typeof localHandler === \"function\") {\n            localEventFired = true;\n            if (name === \"rejectionHandled\") {\n                localHandler(promise);\n            } else {\n                localHandler(reason, promise);\n            }\n        }\n    } catch (e) {\n        async.throwLater(e);\n    }\n\n    if (name === \"unhandledRejection\") {\n        if (!activeFireEvent(name, reason, promise) && !localEventFired) {\n            formatAndLogError(reason, \"Unhandled rejection \");\n        }\n    } else {\n        activeFireEvent(name, promise);\n    }\n}\n\nfunction formatNonError(obj) {\n    var str;\n    if (typeof obj === \"function\") {\n        str = \"[function \" +\n            (obj.name || \"anonymous\") +\n            \"]\";\n    } else {\n        str = obj && typeof obj.toString === \"function\"\n            ? obj.toString() : util.toString(obj);\n        var ruselessToString = /\\[object [a-zA-Z0-9$_]+\\]/;\n        if (ruselessToString.test(str)) {\n            try {\n                var newStr = JSON.stringify(obj);\n                str = newStr;\n            }\n            catch(e) {\n\n            }\n        }\n        if (str.length === 0) {\n            str = \"(empty array)\";\n        }\n    }\n    return (\"(<\" + snip(str) + \">, no stack trace)\");\n}\n\nfunction snip(str) {\n    var maxChars = 41;\n    if (str.length < maxChars) {\n        return str;\n    }\n    return str.substr(0, maxChars - 3) + \"...\";\n}\n\nfunction longStackTracesIsSupported() {\n    return typeof captureStackTrace === \"function\";\n}\n\nvar shouldIgnore = function() { return false; };\nvar parseLineInfoRegex = /[\\/<\\(]([^:\\/]+):(\\d+):(?:\\d+)\\)?\\s*$/;\nfunction parseLineInfo(line) {\n    var matches = line.match(parseLineInfoRegex);\n    if (matches) {\n        return {\n            fileName: matches[1],\n            line: parseInt(matches[2], 10)\n        };\n    }\n}\n\nfunction setBounds(firstLineError, lastLineError) {\n    if (!longStackTracesIsSupported()) return;\n    var firstStackLines = firstLineError.stack.split(\"\\n\");\n    var lastStackLines = lastLineError.stack.split(\"\\n\");\n    var firstIndex = -1;\n    var lastIndex = -1;\n    var firstFileName;\n    var lastFileName;\n    for (var i = 0; i < firstStackLines.length; ++i) {\n        var result = parseLineInfo(firstStackLines[i]);\n        if (result) {\n            firstFileName = result.fileName;\n            firstIndex = result.line;\n            break;\n        }\n    }\n    for (var i = 0; i < lastStackLines.length; ++i) {\n        var result = parseLineInfo(lastStackLines[i]);\n        if (result) {\n            lastFileName = result.fileName;\n            lastIndex = result.line;\n            break;\n        }\n    }\n    if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||\n        firstFileName !== lastFileName || firstIndex >= lastIndex) {\n        return;\n    }\n\n    shouldIgnore = function(line) {\n        if (bluebirdFramePattern.test(line)) return true;\n        var info = parseLineInfo(line);\n        if (info) {\n            if (info.fileName === firstFileName &&\n                (firstIndex <= info.line && info.line <= lastIndex)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\n\nfunction CapturedTrace(parent) {\n    this._parent = parent;\n    this._promisesCreated = 0;\n    var length = this._length = 1 + (parent === undefined ? 0 : parent._length);\n    captureStackTrace(this, CapturedTrace);\n    if (length > 32) this.uncycle();\n}\nutil.inherits(CapturedTrace, Error);\nContext.CapturedTrace = CapturedTrace;\n\nCapturedTrace.prototype.uncycle = function() {\n    var length = this._length;\n    if (length < 2) return;\n    var nodes = [];\n    var stackToIndex = {};\n\n    for (var i = 0, node = this; node !== undefined; ++i) {\n        nodes.push(node);\n        node = node._parent;\n    }\n    length = this._length = i;\n    for (var i = length - 1; i >= 0; --i) {\n        var stack = nodes[i].stack;\n        if (stackToIndex[stack] === undefined) {\n            stackToIndex[stack] = i;\n        }\n    }\n    for (var i = 0; i < length; ++i) {\n        var currentStack = nodes[i].stack;\n        var index = stackToIndex[currentStack];\n        if (index !== undefined && index !== i) {\n            if (index > 0) {\n                nodes[index - 1]._parent = undefined;\n                nodes[index - 1]._length = 1;\n            }\n            nodes[i]._parent = undefined;\n            nodes[i]._length = 1;\n            var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;\n\n            if (index < length - 1) {\n                cycleEdgeNode._parent = nodes[index + 1];\n                cycleEdgeNode._parent.uncycle();\n                cycleEdgeNode._length =\n                    cycleEdgeNode._parent._length + 1;\n            } else {\n                cycleEdgeNode._parent = undefined;\n                cycleEdgeNode._length = 1;\n            }\n            var currentChildLength = cycleEdgeNode._length + 1;\n            for (var j = i - 2; j >= 0; --j) {\n                nodes[j]._length = currentChildLength;\n                currentChildLength++;\n            }\n            return;\n        }\n    }\n};\n\nCapturedTrace.prototype.attachExtraTrace = function(error) {\n    if (error.__stackCleaned__) return;\n    this.uncycle();\n    var parsed = parseStackAndMessage(error);\n    var message = parsed.message;\n    var stacks = [parsed.stack];\n\n    var trace = this;\n    while (trace !== undefined) {\n        stacks.push(cleanStack(trace.stack.split(\"\\n\")));\n        trace = trace._parent;\n    }\n    removeCommonRoots(stacks);\n    removeDuplicateOrEmptyJumps(stacks);\n    util.notEnumerableProp(error, \"stack\", reconstructStack(message, stacks));\n    util.notEnumerableProp(error, \"__stackCleaned__\", true);\n};\n\nvar captureStackTrace = (function stackDetection() {\n    var v8stackFramePattern = /^\\s*at\\s*/;\n    var v8stackFormatter = function(stack, error) {\n        if (typeof stack === \"string\") return stack;\n\n        if (error.name !== undefined &&\n            error.message !== undefined) {\n            return error.toString();\n        }\n        return formatNonError(error);\n    };\n\n    if (typeof Error.stackTraceLimit === \"number\" &&\n        typeof Error.captureStackTrace === \"function\") {\n        Error.stackTraceLimit += 6;\n        stackFramePattern = v8stackFramePattern;\n        formatStack = v8stackFormatter;\n        var captureStackTrace = Error.captureStackTrace;\n\n        shouldIgnore = function(line) {\n            return bluebirdFramePattern.test(line);\n        };\n        return function(receiver, ignoreUntil) {\n            Error.stackTraceLimit += 6;\n            captureStackTrace(receiver, ignoreUntil);\n            Error.stackTraceLimit -= 6;\n        };\n    }\n    var err = new Error();\n\n    if (typeof err.stack === \"string\" &&\n        err.stack.split(\"\\n\")[0].indexOf(\"stackDetection@\") >= 0) {\n        stackFramePattern = /@/;\n        formatStack = v8stackFormatter;\n        indentStackFrames = true;\n        return function captureStackTrace(o) {\n            o.stack = new Error().stack;\n        };\n    }\n\n    var hasStackAfterThrow;\n    try { throw new Error(); }\n    catch(e) {\n        hasStackAfterThrow = (\"stack\" in e);\n    }\n    if (!(\"stack\" in err) && hasStackAfterThrow &&\n        typeof Error.stackTraceLimit === \"number\") {\n        stackFramePattern = v8stackFramePattern;\n        formatStack = v8stackFormatter;\n        return function captureStackTrace(o) {\n            Error.stackTraceLimit += 6;\n            try { throw new Error(); }\n            catch(e) { o.stack = e.stack; }\n            Error.stackTraceLimit -= 6;\n        };\n    }\n\n    formatStack = function(stack, error) {\n        if (typeof stack === \"string\") return stack;\n\n        if ((typeof error === \"object\" ||\n            typeof error === \"function\") &&\n            error.name !== undefined &&\n            error.message !== undefined) {\n            return error.toString();\n        }\n        return formatNonError(error);\n    };\n\n    return null;\n\n})([]);\n\nif (typeof console !== \"undefined\" && typeof console.warn !== \"undefined\") {\n    printWarning = function (message) {\n        console.warn(message);\n    };\n    if (util.isNode && process.stderr.isTTY) {\n        printWarning = function(message, isSoft) {\n            var color = isSoft ? \"\\u001b[33m\" : \"\\u001b[31m\";\n            console.warn(color + message + \"\\u001b[0m\\n\");\n        };\n    } else if (!util.isNode && typeof (new Error().stack) === \"string\") {\n        printWarning = function(message, isSoft) {\n            console.warn(\"%c\" + message,\n                        isSoft ? \"color: darkorange\" : \"color: red\");\n        };\n    }\n}\n\nvar config = {\n    warnings: warnings,\n    longStackTraces: false,\n    cancellation: false,\n    monitoring: false\n};\n\nif (longStackTraces) Promise.longStackTraces();\n\nreturn {\n    longStackTraces: function() {\n        return config.longStackTraces;\n    },\n    warnings: function() {\n        return config.warnings;\n    },\n    cancellation: function() {\n        return config.cancellation;\n    },\n    monitoring: function() {\n        return config.monitoring;\n    },\n    propagateFromFunction: function() {\n        return propagateFromFunction;\n    },\n    boundValueFunction: function() {\n        return boundValueFunction;\n    },\n    checkForgottenReturns: checkForgottenReturns,\n    setBounds: setBounds,\n    warn: warn,\n    deprecated: deprecated,\n    CapturedTrace: CapturedTrace,\n    fireDomEvent: fireDomEvent,\n    fireGlobalEvent: fireGlobalEvent\n};\n};\n\n}).call(this,require('_process'))\n},{\"./errors\":50,\"./util\":74,\"_process\":138}],48:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nfunction returner() {\n    return this.value;\n}\nfunction thrower() {\n    throw this.reason;\n}\n\nPromise.prototype[\"return\"] =\nPromise.prototype.thenReturn = function (value) {\n    if (value instanceof Promise) value.suppressUnhandledRejections();\n    return this._then(\n        returner, undefined, undefined, {value: value}, undefined);\n};\n\nPromise.prototype[\"throw\"] =\nPromise.prototype.thenThrow = function (reason) {\n    return this._then(\n        thrower, undefined, undefined, {reason: reason}, undefined);\n};\n\nPromise.prototype.catchThrow = function (reason) {\n    if (arguments.length <= 1) {\n        return this._then(\n            undefined, thrower, undefined, {reason: reason}, undefined);\n    } else {\n        var _reason = arguments[1];\n        var handler = function() {throw _reason;};\n        return this.caught(reason, handler);\n    }\n};\n\nPromise.prototype.catchReturn = function (value) {\n    if (arguments.length <= 1) {\n        if (value instanceof Promise) value.suppressUnhandledRejections();\n        return this._then(\n            undefined, returner, undefined, {value: value}, undefined);\n    } else {\n        var _value = arguments[1];\n        if (_value instanceof Promise) _value.suppressUnhandledRejections();\n        var handler = function() {return _value;};\n        return this.caught(value, handler);\n    }\n};\n};\n\n},{}],49:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar PromiseReduce = Promise.reduce;\nvar PromiseAll = Promise.all;\n\nfunction promiseAllThis() {\n    return PromiseAll(this);\n}\n\nfunction PromiseMapSeries(promises, fn) {\n    return PromiseReduce(promises, fn, INTERNAL, INTERNAL);\n}\n\nPromise.prototype.each = function (fn) {\n    return PromiseReduce(this, fn, INTERNAL, 0)\n              ._then(promiseAllThis, undefined, undefined, this, undefined);\n};\n\nPromise.prototype.mapSeries = function (fn) {\n    return PromiseReduce(this, fn, INTERNAL, INTERNAL);\n};\n\nPromise.each = function (promises, fn) {\n    return PromiseReduce(promises, fn, INTERNAL, 0)\n              ._then(promiseAllThis, undefined, undefined, promises, undefined);\n};\n\nPromise.mapSeries = PromiseMapSeries;\n};\n\n\n},{}],50:[function(require,module,exports){\n\"use strict\";\nvar es5 = require(\"./es5\");\nvar Objectfreeze = es5.freeze;\nvar util = require(\"./util\");\nvar inherits = util.inherits;\nvar notEnumerableProp = util.notEnumerableProp;\n\nfunction subError(nameProperty, defaultMessage) {\n    function SubError(message) {\n        if (!(this instanceof SubError)) return new SubError(message);\n        notEnumerableProp(this, \"message\",\n            typeof message === \"string\" ? message : defaultMessage);\n        notEnumerableProp(this, \"name\", nameProperty);\n        if (Error.captureStackTrace) {\n            Error.captureStackTrace(this, this.constructor);\n        } else {\n            Error.call(this);\n        }\n    }\n    inherits(SubError, Error);\n    return SubError;\n}\n\nvar _TypeError, _RangeError;\nvar Warning = subError(\"Warning\", \"warning\");\nvar CancellationError = subError(\"CancellationError\", \"cancellation error\");\nvar TimeoutError = subError(\"TimeoutError\", \"timeout error\");\nvar AggregateError = subError(\"AggregateError\", \"aggregate error\");\ntry {\n    _TypeError = TypeError;\n    _RangeError = RangeError;\n} catch(e) {\n    _TypeError = subError(\"TypeError\", \"type error\");\n    _RangeError = subError(\"RangeError\", \"range error\");\n}\n\nvar methods = (\"join pop push shift unshift slice filter forEach some \" +\n    \"every map indexOf lastIndexOf reduce reduceRight sort reverse\").split(\" \");\n\nfor (var i = 0; i < methods.length; ++i) {\n    if (typeof Array.prototype[methods[i]] === \"function\") {\n        AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];\n    }\n}\n\nes5.defineProperty(AggregateError.prototype, \"length\", {\n    value: 0,\n    configurable: false,\n    writable: true,\n    enumerable: true\n});\nAggregateError.prototype[\"isOperational\"] = true;\nvar level = 0;\nAggregateError.prototype.toString = function() {\n    var indent = Array(level * 4 + 1).join(\" \");\n    var ret = \"\\n\" + indent + \"AggregateError of:\" + \"\\n\";\n    level++;\n    indent = Array(level * 4 + 1).join(\" \");\n    for (var i = 0; i < this.length; ++i) {\n        var str = this[i] === this ? \"[Circular AggregateError]\" : this[i] + \"\";\n        var lines = str.split(\"\\n\");\n        for (var j = 0; j < lines.length; ++j) {\n            lines[j] = indent + lines[j];\n        }\n        str = lines.join(\"\\n\");\n        ret += str + \"\\n\";\n    }\n    level--;\n    return ret;\n};\n\nfunction OperationalError(message) {\n    if (!(this instanceof OperationalError))\n        return new OperationalError(message);\n    notEnumerableProp(this, \"name\", \"OperationalError\");\n    notEnumerableProp(this, \"message\", message);\n    this.cause = message;\n    this[\"isOperational\"] = true;\n\n    if (message instanceof Error) {\n        notEnumerableProp(this, \"message\", message.message);\n        notEnumerableProp(this, \"stack\", message.stack);\n    } else if (Error.captureStackTrace) {\n        Error.captureStackTrace(this, this.constructor);\n    }\n\n}\ninherits(OperationalError, Error);\n\nvar errorTypes = Error[\"__BluebirdErrorTypes__\"];\nif (!errorTypes) {\n    errorTypes = Objectfreeze({\n        CancellationError: CancellationError,\n        TimeoutError: TimeoutError,\n        OperationalError: OperationalError,\n        RejectionError: OperationalError,\n        AggregateError: AggregateError\n    });\n    es5.defineProperty(Error, \"__BluebirdErrorTypes__\", {\n        value: errorTypes,\n        writable: false,\n        enumerable: false,\n        configurable: false\n    });\n}\n\nmodule.exports = {\n    Error: Error,\n    TypeError: _TypeError,\n    RangeError: _RangeError,\n    CancellationError: errorTypes.CancellationError,\n    OperationalError: errorTypes.OperationalError,\n    TimeoutError: errorTypes.TimeoutError,\n    AggregateError: errorTypes.AggregateError,\n    Warning: Warning\n};\n\n},{\"./es5\":51,\"./util\":74}],51:[function(require,module,exports){\nvar isES5 = (function(){\n    \"use strict\";\n    return this === undefined;\n})();\n\nif (isES5) {\n    module.exports = {\n        freeze: Object.freeze,\n        defineProperty: Object.defineProperty,\n        getDescriptor: Object.getOwnPropertyDescriptor,\n        keys: Object.keys,\n        names: Object.getOwnPropertyNames,\n        getPrototypeOf: Object.getPrototypeOf,\n        isArray: Array.isArray,\n        isES5: isES5,\n        propertyIsWritable: function(obj, prop) {\n            var descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n            return !!(!descriptor || descriptor.writable || descriptor.set);\n        }\n    };\n} else {\n    var has = {}.hasOwnProperty;\n    var str = {}.toString;\n    var proto = {}.constructor.prototype;\n\n    var ObjectKeys = function (o) {\n        var ret = [];\n        for (var key in o) {\n            if (has.call(o, key)) {\n                ret.push(key);\n            }\n        }\n        return ret;\n    };\n\n    var ObjectGetDescriptor = function(o, key) {\n        return {value: o[key]};\n    };\n\n    var ObjectDefineProperty = function (o, key, desc) {\n        o[key] = desc.value;\n        return o;\n    };\n\n    var ObjectFreeze = function (obj) {\n        return obj;\n    };\n\n    var ObjectGetPrototypeOf = function (obj) {\n        try {\n            return Object(obj).constructor.prototype;\n        }\n        catch (e) {\n            return proto;\n        }\n    };\n\n    var ArrayIsArray = function (obj) {\n        try {\n            return str.call(obj) === \"[object Array]\";\n        }\n        catch(e) {\n            return false;\n        }\n    };\n\n    module.exports = {\n        isArray: ArrayIsArray,\n        keys: ObjectKeys,\n        names: ObjectKeys,\n        defineProperty: ObjectDefineProperty,\n        getDescriptor: ObjectGetDescriptor,\n        freeze: ObjectFreeze,\n        getPrototypeOf: ObjectGetPrototypeOf,\n        isES5: isES5,\n        propertyIsWritable: function() {\n            return true;\n        }\n    };\n}\n\n},{}],52:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar PromiseMap = Promise.map;\n\nPromise.prototype.filter = function (fn, options) {\n    return PromiseMap(this, fn, options, INTERNAL);\n};\n\nPromise.filter = function (promises, fn, options) {\n    return PromiseMap(promises, fn, options, INTERNAL);\n};\n};\n\n},{}],53:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, tryConvertToPromise) {\nvar util = require(\"./util\");\nvar CancellationError = Promise.CancellationError;\nvar errorObj = util.errorObj;\n\nfunction PassThroughHandlerContext(promise, type, handler) {\n    this.promise = promise;\n    this.type = type;\n    this.handler = handler;\n    this.called = false;\n    this.cancelPromise = null;\n}\n\nPassThroughHandlerContext.prototype.isFinallyHandler = function() {\n    return this.type === 0;\n};\n\nfunction FinallyHandlerCancelReaction(finallyHandler) {\n    this.finallyHandler = finallyHandler;\n}\n\nFinallyHandlerCancelReaction.prototype._resultCancelled = function() {\n    checkCancel(this.finallyHandler);\n};\n\nfunction checkCancel(ctx, reason) {\n    if (ctx.cancelPromise != null) {\n        if (arguments.length > 1) {\n            ctx.cancelPromise._reject(reason);\n        } else {\n            ctx.cancelPromise._cancel();\n        }\n        ctx.cancelPromise = null;\n        return true;\n    }\n    return false;\n}\n\nfunction succeed() {\n    return finallyHandler.call(this, this.promise._target()._settledValue());\n}\nfunction fail(reason) {\n    if (checkCancel(this, reason)) return;\n    errorObj.e = reason;\n    return errorObj;\n}\nfunction finallyHandler(reasonOrValue) {\n    var promise = this.promise;\n    var handler = this.handler;\n\n    if (!this.called) {\n        this.called = true;\n        var ret = this.isFinallyHandler()\n            ? handler.call(promise._boundValue())\n            : handler.call(promise._boundValue(), reasonOrValue);\n        if (ret !== undefined) {\n            promise._setReturnedNonUndefined();\n            var maybePromise = tryConvertToPromise(ret, promise);\n            if (maybePromise instanceof Promise) {\n                if (this.cancelPromise != null) {\n                    if (maybePromise._isCancelled()) {\n                        var reason =\n                            new CancellationError(\"late cancellation observer\");\n                        promise._attachExtraTrace(reason);\n                        errorObj.e = reason;\n                        return errorObj;\n                    } else if (maybePromise.isPending()) {\n                        maybePromise._attachCancellationCallback(\n                            new FinallyHandlerCancelReaction(this));\n                    }\n                }\n                return maybePromise._then(\n                    succeed, fail, undefined, this, undefined);\n            }\n        }\n    }\n\n    if (promise.isRejected()) {\n        checkCancel(this);\n        errorObj.e = reasonOrValue;\n        return errorObj;\n    } else {\n        checkCancel(this);\n        return reasonOrValue;\n    }\n}\n\nPromise.prototype._passThrough = function(handler, type, success, fail) {\n    if (typeof handler !== \"function\") return this.then();\n    return this._then(success,\n                      fail,\n                      undefined,\n                      new PassThroughHandlerContext(this, type, handler),\n                      undefined);\n};\n\nPromise.prototype.lastly =\nPromise.prototype[\"finally\"] = function (handler) {\n    return this._passThrough(handler,\n                             0,\n                             finallyHandler,\n                             finallyHandler);\n};\n\nPromise.prototype.tap = function (handler) {\n    return this._passThrough(handler, 1, finallyHandler);\n};\n\nreturn PassThroughHandlerContext;\n};\n\n},{\"./util\":74}],54:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise,\n                          apiRejection,\n                          INTERNAL,\n                          tryConvertToPromise,\n                          Proxyable,\n                          debug) {\nvar errors = require(\"./errors\");\nvar TypeError = errors.TypeError;\nvar util = require(\"./util\");\nvar errorObj = util.errorObj;\nvar tryCatch = util.tryCatch;\nvar yieldHandlers = [];\n\nfunction promiseFromYieldHandler(value, yieldHandlers, traceParent) {\n    for (var i = 0; i < yieldHandlers.length; ++i) {\n        traceParent._pushContext();\n        var result = tryCatch(yieldHandlers[i])(value);\n        traceParent._popContext();\n        if (result === errorObj) {\n            traceParent._pushContext();\n            var ret = Promise.reject(errorObj.e);\n            traceParent._popContext();\n            return ret;\n        }\n        var maybePromise = tryConvertToPromise(result, traceParent);\n        if (maybePromise instanceof Promise) return maybePromise;\n    }\n    return null;\n}\n\nfunction PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {\n    if (debug.cancellation()) {\n        var internal = new Promise(INTERNAL);\n        var _finallyPromise = this._finallyPromise = new Promise(INTERNAL);\n        this._promise = internal.lastly(function() {\n            return _finallyPromise;\n        });\n        internal._captureStackTrace();\n        internal._setOnCancel(this);\n    } else {\n        var promise = this._promise = new Promise(INTERNAL);\n        promise._captureStackTrace();\n    }\n    this._stack = stack;\n    this._generatorFunction = generatorFunction;\n    this._receiver = receiver;\n    this._generator = undefined;\n    this._yieldHandlers = typeof yieldHandler === \"function\"\n        ? [yieldHandler].concat(yieldHandlers)\n        : yieldHandlers;\n    this._yieldedPromise = null;\n    this._cancellationPhase = false;\n}\nutil.inherits(PromiseSpawn, Proxyable);\n\nPromiseSpawn.prototype._isResolved = function() {\n    return this._promise === null;\n};\n\nPromiseSpawn.prototype._cleanup = function() {\n    this._promise = this._generator = null;\n    if (debug.cancellation() && this._finallyPromise !== null) {\n        this._finallyPromise._fulfill();\n        this._finallyPromise = null;\n    }\n};\n\nPromiseSpawn.prototype._promiseCancelled = function() {\n    if (this._isResolved()) return;\n    var implementsReturn = typeof this._generator[\"return\"] !== \"undefined\";\n\n    var result;\n    if (!implementsReturn) {\n        var reason = new Promise.CancellationError(\n            \"generator .return() sentinel\");\n        Promise.coroutine.returnSentinel = reason;\n        this._promise._attachExtraTrace(reason);\n        this._promise._pushContext();\n        result = tryCatch(this._generator[\"throw\"]).call(this._generator,\n                                                         reason);\n        this._promise._popContext();\n    } else {\n        this._promise._pushContext();\n        result = tryCatch(this._generator[\"return\"]).call(this._generator,\n                                                          undefined);\n        this._promise._popContext();\n    }\n    this._cancellationPhase = true;\n    this._yieldedPromise = null;\n    this._continue(result);\n};\n\nPromiseSpawn.prototype._promiseFulfilled = function(value) {\n    this._yieldedPromise = null;\n    this._promise._pushContext();\n    var result = tryCatch(this._generator.next).call(this._generator, value);\n    this._promise._popContext();\n    this._continue(result);\n};\n\nPromiseSpawn.prototype._promiseRejected = function(reason) {\n    this._yieldedPromise = null;\n    this._promise._attachExtraTrace(reason);\n    this._promise._pushContext();\n    var result = tryCatch(this._generator[\"throw\"])\n        .call(this._generator, reason);\n    this._promise._popContext();\n    this._continue(result);\n};\n\nPromiseSpawn.prototype._resultCancelled = function() {\n    if (this._yieldedPromise instanceof Promise) {\n        var promise = this._yieldedPromise;\n        this._yieldedPromise = null;\n        promise.cancel();\n    }\n};\n\nPromiseSpawn.prototype.promise = function () {\n    return this._promise;\n};\n\nPromiseSpawn.prototype._run = function () {\n    this._generator = this._generatorFunction.call(this._receiver);\n    this._receiver =\n        this._generatorFunction = undefined;\n    this._promiseFulfilled(undefined);\n};\n\nPromiseSpawn.prototype._continue = function (result) {\n    var promise = this._promise;\n    if (result === errorObj) {\n        this._cleanup();\n        if (this._cancellationPhase) {\n            return promise.cancel();\n        } else {\n            return promise._rejectCallback(result.e, false);\n        }\n    }\n\n    var value = result.value;\n    if (result.done === true) {\n        this._cleanup();\n        if (this._cancellationPhase) {\n            return promise.cancel();\n        } else {\n            return promise._resolveCallback(value);\n        }\n    } else {\n        var maybePromise = tryConvertToPromise(value, this._promise);\n        if (!(maybePromise instanceof Promise)) {\n            maybePromise =\n                promiseFromYieldHandler(maybePromise,\n                                        this._yieldHandlers,\n                                        this._promise);\n            if (maybePromise === null) {\n                this._promiseRejected(\n                    new TypeError(\n                        \"A value %s was yielded that could not be treated as a promise\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\\u000a\".replace(\"%s\", value) +\n                        \"From coroutine:\\u000a\" +\n                        this._stack.split(\"\\n\").slice(1, -7).join(\"\\n\")\n                    )\n                );\n                return;\n            }\n        }\n        maybePromise = maybePromise._target();\n        var bitField = maybePromise._bitField;\n        ;\n        if (((bitField & 50397184) === 0)) {\n            this._yieldedPromise = maybePromise;\n            maybePromise._proxy(this, null);\n        } else if (((bitField & 33554432) !== 0)) {\n            Promise._async.invoke(\n                this._promiseFulfilled, this, maybePromise._value()\n            );\n        } else if (((bitField & 16777216) !== 0)) {\n            Promise._async.invoke(\n                this._promiseRejected, this, maybePromise._reason()\n            );\n        } else {\n            this._promiseCancelled();\n        }\n    }\n};\n\nPromise.coroutine = function (generatorFunction, options) {\n    if (typeof generatorFunction !== \"function\") {\n        throw new TypeError(\"generatorFunction must be a function\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    var yieldHandler = Object(options).yieldHandler;\n    var PromiseSpawn$ = PromiseSpawn;\n    var stack = new Error().stack;\n    return function () {\n        var generator = generatorFunction.apply(this, arguments);\n        var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler,\n                                      stack);\n        var ret = spawn.promise();\n        spawn._generator = generator;\n        spawn._promiseFulfilled(undefined);\n        return ret;\n    };\n};\n\nPromise.coroutine.addYieldHandler = function(fn) {\n    if (typeof fn !== \"function\") {\n        throw new TypeError(\"expecting a function but got \" + util.classString(fn));\n    }\n    yieldHandlers.push(fn);\n};\n\nPromise.spawn = function (generatorFunction) {\n    debug.deprecated(\"Promise.spawn()\", \"Promise.coroutine()\");\n    if (typeof generatorFunction !== \"function\") {\n        return apiRejection(\"generatorFunction must be a function\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    var spawn = new PromiseSpawn(generatorFunction, this);\n    var ret = spawn.promise();\n    spawn._run(Promise.spawn);\n    return ret;\n};\n};\n\n},{\"./errors\":50,\"./util\":74}],55:[function(require,module,exports){\n\"use strict\";\nmodule.exports =\nfunction(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async,\n         getDomain) {\nvar util = require(\"./util\");\nvar canEvaluate = util.canEvaluate;\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\nvar reject;\n\nif (!false) {\nif (canEvaluate) {\n    var thenCallback = function(i) {\n        return new Function(\"value\", \"holder\", \"                             \\n\\\n            'use strict';                                                    \\n\\\n            holder.pIndex = value;                                           \\n\\\n            holder.checkFulfillment(this);                                   \\n\\\n            \".replace(/Index/g, i));\n    };\n\n    var promiseSetter = function(i) {\n        return new Function(\"promise\", \"holder\", \"                           \\n\\\n            'use strict';                                                    \\n\\\n            holder.pIndex = promise;                                         \\n\\\n            \".replace(/Index/g, i));\n    };\n\n    var generateHolderClass = function(total) {\n        var props = new Array(total);\n        for (var i = 0; i < props.length; ++i) {\n            props[i] = \"this.p\" + (i+1);\n        }\n        var assignment = props.join(\" = \") + \" = null;\";\n        var cancellationCode= \"var promise;\\n\" + props.map(function(prop) {\n            return \"                                                         \\n\\\n                promise = \" + prop + \";                                      \\n\\\n                if (promise instanceof Promise) {                            \\n\\\n                    promise.cancel();                                        \\n\\\n                }                                                            \\n\\\n            \";\n        }).join(\"\\n\");\n        var passedArguments = props.join(\", \");\n        var name = \"Holder$\" + total;\n\n\n        var code = \"return function(tryCatch, errorObj, Promise, async) {    \\n\\\n            'use strict';                                                    \\n\\\n            function [TheName](fn) {                                         \\n\\\n                [TheProperties]                                              \\n\\\n                this.fn = fn;                                                \\n\\\n                this.asyncNeeded = true;                                     \\n\\\n                this.now = 0;                                                \\n\\\n            }                                                                \\n\\\n                                                                             \\n\\\n            [TheName].prototype._callFunction = function(promise) {          \\n\\\n                promise._pushContext();                                      \\n\\\n                var ret = tryCatch(this.fn)([ThePassedArguments]);           \\n\\\n                promise._popContext();                                       \\n\\\n                if (ret === errorObj) {                                      \\n\\\n                    promise._rejectCallback(ret.e, false);                   \\n\\\n                } else {                                                     \\n\\\n                    promise._resolveCallback(ret);                           \\n\\\n                }                                                            \\n\\\n            };                                                               \\n\\\n                                                                             \\n\\\n            [TheName].prototype.checkFulfillment = function(promise) {       \\n\\\n                var now = ++this.now;                                        \\n\\\n                if (now === [TheTotal]) {                                    \\n\\\n                    if (this.asyncNeeded) {                                  \\n\\\n                        async.invoke(this._callFunction, this, promise);     \\n\\\n                    } else {                                                 \\n\\\n                        this._callFunction(promise);                         \\n\\\n                    }                                                        \\n\\\n                                                                             \\n\\\n                }                                                            \\n\\\n            };                                                               \\n\\\n                                                                             \\n\\\n            [TheName].prototype._resultCancelled = function() {              \\n\\\n                [CancellationCode]                                           \\n\\\n            };                                                               \\n\\\n                                                                             \\n\\\n            return [TheName];                                                \\n\\\n        }(tryCatch, errorObj, Promise, async);                               \\n\\\n        \";\n\n        code = code.replace(/\\[TheName\\]/g, name)\n            .replace(/\\[TheTotal\\]/g, total)\n            .replace(/\\[ThePassedArguments\\]/g, passedArguments)\n            .replace(/\\[TheProperties\\]/g, assignment)\n            .replace(/\\[CancellationCode\\]/g, cancellationCode);\n\n        return new Function(\"tryCatch\", \"errorObj\", \"Promise\", \"async\", code)\n                           (tryCatch, errorObj, Promise, async);\n    };\n\n    var holderClasses = [];\n    var thenCallbacks = [];\n    var promiseSetters = [];\n\n    for (var i = 0; i < 8; ++i) {\n        holderClasses.push(generateHolderClass(i + 1));\n        thenCallbacks.push(thenCallback(i + 1));\n        promiseSetters.push(promiseSetter(i + 1));\n    }\n\n    reject = function (reason) {\n        this._reject(reason);\n    };\n}}\n\nPromise.join = function () {\n    var last = arguments.length - 1;\n    var fn;\n    if (last > 0 && typeof arguments[last] === \"function\") {\n        fn = arguments[last];\n        if (!false) {\n            if (last <= 8 && canEvaluate) {\n                var ret = new Promise(INTERNAL);\n                ret._captureStackTrace();\n                var HolderClass = holderClasses[last - 1];\n                var holder = new HolderClass(fn);\n                var callbacks = thenCallbacks;\n\n                for (var i = 0; i < last; ++i) {\n                    var maybePromise = tryConvertToPromise(arguments[i], ret);\n                    if (maybePromise instanceof Promise) {\n                        maybePromise = maybePromise._target();\n                        var bitField = maybePromise._bitField;\n                        ;\n                        if (((bitField & 50397184) === 0)) {\n                            maybePromise._then(callbacks[i], reject,\n                                               undefined, ret, holder);\n                            promiseSetters[i](maybePromise, holder);\n                            holder.asyncNeeded = false;\n                        } else if (((bitField & 33554432) !== 0)) {\n                            callbacks[i].call(ret,\n                                              maybePromise._value(), holder);\n                        } else if (((bitField & 16777216) !== 0)) {\n                            ret._reject(maybePromise._reason());\n                        } else {\n                            ret._cancel();\n                        }\n                    } else {\n                        callbacks[i].call(ret, maybePromise, holder);\n                    }\n                }\n\n                if (!ret._isFateSealed()) {\n                    if (holder.asyncNeeded) {\n                        var domain = getDomain();\n                        if (domain !== null) {\n                            holder.fn = util.domainBind(domain, holder.fn);\n                        }\n                    }\n                    ret._setAsyncGuaranteed();\n                    ret._setOnCancel(holder);\n                }\n                return ret;\n            }\n        }\n    }\n    var $_len = arguments.length;var args = new Array($_len); for(var $_i = 0; $_i < $_len; ++$_i) {args[$_i] = arguments[$_i];};\n    if (fn) args.pop();\n    var ret = new PromiseArray(args).promise();\n    return fn !== undefined ? ret.spread(fn) : ret;\n};\n\n};\n\n},{\"./util\":74}],56:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise,\n                          PromiseArray,\n                          apiRejection,\n                          tryConvertToPromise,\n                          INTERNAL,\n                          debug) {\nvar getDomain = Promise._getDomain;\nvar util = require(\"./util\");\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\nvar async = Promise._async;\n\nfunction MappingPromiseArray(promises, fn, limit, _filter) {\n    this.constructor$(promises);\n    this._promise._captureStackTrace();\n    var domain = getDomain();\n    this._callback = domain === null ? fn : util.domainBind(domain, fn);\n    this._preservedValues = _filter === INTERNAL\n        ? new Array(this.length())\n        : null;\n    this._limit = limit;\n    this._inFlight = 0;\n    this._queue = [];\n    async.invoke(this._asyncInit, this, undefined);\n}\nutil.inherits(MappingPromiseArray, PromiseArray);\n\nMappingPromiseArray.prototype._asyncInit = function() {\n    this._init$(undefined, -2);\n};\n\nMappingPromiseArray.prototype._init = function () {};\n\nMappingPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    var values = this._values;\n    var length = this.length();\n    var preservedValues = this._preservedValues;\n    var limit = this._limit;\n\n    if (index < 0) {\n        index = (index * -1) - 1;\n        values[index] = value;\n        if (limit >= 1) {\n            this._inFlight--;\n            this._drainQueue();\n            if (this._isResolved()) return true;\n        }\n    } else {\n        if (limit >= 1 && this._inFlight >= limit) {\n            values[index] = value;\n            this._queue.push(index);\n            return false;\n        }\n        if (preservedValues !== null) preservedValues[index] = value;\n\n        var promise = this._promise;\n        var callback = this._callback;\n        var receiver = promise._boundValue();\n        promise._pushContext();\n        var ret = tryCatch(callback).call(receiver, value, index, length);\n        var promiseCreated = promise._popContext();\n        debug.checkForgottenReturns(\n            ret,\n            promiseCreated,\n            preservedValues !== null ? \"Promise.filter\" : \"Promise.map\",\n            promise\n        );\n        if (ret === errorObj) {\n            this._reject(ret.e);\n            return true;\n        }\n\n        var maybePromise = tryConvertToPromise(ret, this._promise);\n        if (maybePromise instanceof Promise) {\n            maybePromise = maybePromise._target();\n            var bitField = maybePromise._bitField;\n            ;\n            if (((bitField & 50397184) === 0)) {\n                if (limit >= 1) this._inFlight++;\n                values[index] = maybePromise;\n                maybePromise._proxy(this, (index + 1) * -1);\n                return false;\n            } else if (((bitField & 33554432) !== 0)) {\n                ret = maybePromise._value();\n            } else if (((bitField & 16777216) !== 0)) {\n                this._reject(maybePromise._reason());\n                return true;\n            } else {\n                this._cancel();\n                return true;\n            }\n        }\n        values[index] = ret;\n    }\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= length) {\n        if (preservedValues !== null) {\n            this._filter(values, preservedValues);\n        } else {\n            this._resolve(values);\n        }\n        return true;\n    }\n    return false;\n};\n\nMappingPromiseArray.prototype._drainQueue = function () {\n    var queue = this._queue;\n    var limit = this._limit;\n    var values = this._values;\n    while (queue.length > 0 && this._inFlight < limit) {\n        if (this._isResolved()) return;\n        var index = queue.pop();\n        this._promiseFulfilled(values[index], index);\n    }\n};\n\nMappingPromiseArray.prototype._filter = function (booleans, values) {\n    var len = values.length;\n    var ret = new Array(len);\n    var j = 0;\n    for (var i = 0; i < len; ++i) {\n        if (booleans[i]) ret[j++] = values[i];\n    }\n    ret.length = j;\n    this._resolve(ret);\n};\n\nMappingPromiseArray.prototype.preservedValues = function () {\n    return this._preservedValues;\n};\n\nfunction map(promises, fn, options, _filter) {\n    if (typeof fn !== \"function\") {\n        return apiRejection(\"expecting a function but got \" + util.classString(fn));\n    }\n\n    var limit = 0;\n    if (options !== undefined) {\n        if (typeof options === \"object\" && options !== null) {\n            if (typeof options.concurrency !== \"number\") {\n                return Promise.reject(\n                    new TypeError(\"'concurrency' must be a number but it is \" +\n                                    util.classString(options.concurrency)));\n            }\n            limit = options.concurrency;\n        } else {\n            return Promise.reject(new TypeError(\n                            \"options argument must be an object but it is \" +\n                             util.classString(options)));\n        }\n    }\n    limit = typeof limit === \"number\" &&\n        isFinite(limit) && limit >= 1 ? limit : 0;\n    return new MappingPromiseArray(promises, fn, limit, _filter).promise();\n}\n\nPromise.prototype.map = function (fn, options) {\n    return map(this, fn, options, null);\n};\n\nPromise.map = function (promises, fn, options, _filter) {\n    return map(promises, fn, options, _filter);\n};\n\n\n};\n\n},{\"./util\":74}],57:[function(require,module,exports){\n\"use strict\";\nmodule.exports =\nfunction(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) {\nvar util = require(\"./util\");\nvar tryCatch = util.tryCatch;\n\nPromise.method = function (fn) {\n    if (typeof fn !== \"function\") {\n        throw new Promise.TypeError(\"expecting a function but got \" + util.classString(fn));\n    }\n    return function () {\n        var ret = new Promise(INTERNAL);\n        ret._captureStackTrace();\n        ret._pushContext();\n        var value = tryCatch(fn).apply(this, arguments);\n        var promiseCreated = ret._popContext();\n        debug.checkForgottenReturns(\n            value, promiseCreated, \"Promise.method\", ret);\n        ret._resolveFromSyncValue(value);\n        return ret;\n    };\n};\n\nPromise.attempt = Promise[\"try\"] = function (fn) {\n    if (typeof fn !== \"function\") {\n        return apiRejection(\"expecting a function but got \" + util.classString(fn));\n    }\n    var ret = new Promise(INTERNAL);\n    ret._captureStackTrace();\n    ret._pushContext();\n    var value;\n    if (arguments.length > 1) {\n        debug.deprecated(\"calling Promise.try with more than 1 argument\");\n        var arg = arguments[1];\n        var ctx = arguments[2];\n        value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg)\n                                  : tryCatch(fn).call(ctx, arg);\n    } else {\n        value = tryCatch(fn)();\n    }\n    var promiseCreated = ret._popContext();\n    debug.checkForgottenReturns(\n        value, promiseCreated, \"Promise.try\", ret);\n    ret._resolveFromSyncValue(value);\n    return ret;\n};\n\nPromise.prototype._resolveFromSyncValue = function (value) {\n    if (value === util.errorObj) {\n        this._rejectCallback(value.e, false);\n    } else {\n        this._resolveCallback(value, true);\n    }\n};\n};\n\n},{\"./util\":74}],58:[function(require,module,exports){\n\"use strict\";\nvar util = require(\"./util\");\nvar maybeWrapAsError = util.maybeWrapAsError;\nvar errors = require(\"./errors\");\nvar OperationalError = errors.OperationalError;\nvar es5 = require(\"./es5\");\n\nfunction isUntypedError(obj) {\n    return obj instanceof Error &&\n        es5.getPrototypeOf(obj) === Error.prototype;\n}\n\nvar rErrorKey = /^(?:name|message|stack|cause)$/;\nfunction wrapAsOperationalError(obj) {\n    var ret;\n    if (isUntypedError(obj)) {\n        ret = new OperationalError(obj);\n        ret.name = obj.name;\n        ret.message = obj.message;\n        ret.stack = obj.stack;\n        var keys = es5.keys(obj);\n        for (var i = 0; i < keys.length; ++i) {\n            var key = keys[i];\n            if (!rErrorKey.test(key)) {\n                ret[key] = obj[key];\n            }\n        }\n        return ret;\n    }\n    util.markAsOriginatingFromRejection(obj);\n    return obj;\n}\n\nfunction nodebackForPromise(promise, multiArgs) {\n    return function(err, value) {\n        if (promise === null) return;\n        if (err) {\n            var wrapped = wrapAsOperationalError(maybeWrapAsError(err));\n            promise._attachExtraTrace(wrapped);\n            promise._reject(wrapped);\n        } else if (!multiArgs) {\n            promise._fulfill(value);\n        } else {\n            var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};\n            promise._fulfill(args);\n        }\n        promise = null;\n    };\n}\n\nmodule.exports = nodebackForPromise;\n\n},{\"./errors\":50,\"./es5\":51,\"./util\":74}],59:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nvar util = require(\"./util\");\nvar async = Promise._async;\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\n\nfunction spreadAdapter(val, nodeback) {\n    var promise = this;\n    if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback);\n    var ret =\n        tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val));\n    if (ret === errorObj) {\n        async.throwLater(ret.e);\n    }\n}\n\nfunction successAdapter(val, nodeback) {\n    var promise = this;\n    var receiver = promise._boundValue();\n    var ret = val === undefined\n        ? tryCatch(nodeback).call(receiver, null)\n        : tryCatch(nodeback).call(receiver, null, val);\n    if (ret === errorObj) {\n        async.throwLater(ret.e);\n    }\n}\nfunction errorAdapter(reason, nodeback) {\n    var promise = this;\n    if (!reason) {\n        var newReason = new Error(reason + \"\");\n        newReason.cause = reason;\n        reason = newReason;\n    }\n    var ret = tryCatch(nodeback).call(promise._boundValue(), reason);\n    if (ret === errorObj) {\n        async.throwLater(ret.e);\n    }\n}\n\nPromise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback,\n                                                                     options) {\n    if (typeof nodeback == \"function\") {\n        var adapter = successAdapter;\n        if (options !== undefined && Object(options).spread) {\n            adapter = spreadAdapter;\n        }\n        this._then(\n            adapter,\n            errorAdapter,\n            undefined,\n            this,\n            nodeback\n        );\n    }\n    return this;\n};\n};\n\n},{\"./util\":74}],60:[function(require,module,exports){\n(function (process){\n\"use strict\";\nmodule.exports = function() {\nvar makeSelfResolutionError = function () {\n    return new TypeError(\"circular promise resolution chain\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n};\nvar reflectHandler = function() {\n    return new Promise.PromiseInspection(this._target());\n};\nvar apiRejection = function(msg) {\n    return Promise.reject(new TypeError(msg));\n};\nfunction Proxyable() {}\nvar UNDEFINED_BINDING = {};\nvar util = require(\"./util\");\n\nvar getDomain;\nif (util.isNode) {\n    getDomain = function() {\n        var ret = process.domain;\n        if (ret === undefined) ret = null;\n        return ret;\n    };\n} else {\n    getDomain = function() {\n        return null;\n    };\n}\nutil.notEnumerableProp(Promise, \"_getDomain\", getDomain);\n\nvar es5 = require(\"./es5\");\nvar Async = require(\"./async\");\nvar async = new Async();\nes5.defineProperty(Promise, \"_async\", {value: async});\nvar errors = require(\"./errors\");\nvar TypeError = Promise.TypeError = errors.TypeError;\nPromise.RangeError = errors.RangeError;\nvar CancellationError = Promise.CancellationError = errors.CancellationError;\nPromise.TimeoutError = errors.TimeoutError;\nPromise.OperationalError = errors.OperationalError;\nPromise.RejectionError = errors.OperationalError;\nPromise.AggregateError = errors.AggregateError;\nvar INTERNAL = function(){};\nvar APPLY = {};\nvar NEXT_FILTER = {};\nvar tryConvertToPromise = require(\"./thenables\")(Promise, INTERNAL);\nvar PromiseArray =\n    require(\"./promise_array\")(Promise, INTERNAL,\n                               tryConvertToPromise, apiRejection, Proxyable);\nvar Context = require(\"./context\")(Promise);\n /*jshint unused:false*/\nvar createContext = Context.create;\nvar debug = require(\"./debuggability\")(Promise, Context);\nvar CapturedTrace = debug.CapturedTrace;\nvar PassThroughHandlerContext =\n    require(\"./finally\")(Promise, tryConvertToPromise);\nvar catchFilter = require(\"./catch_filter\")(NEXT_FILTER);\nvar nodebackForPromise = require(\"./nodeback\");\nvar errorObj = util.errorObj;\nvar tryCatch = util.tryCatch;\nfunction check(self, executor) {\n    if (typeof executor !== \"function\") {\n        throw new TypeError(\"expecting a function but got \" + util.classString(executor));\n    }\n    if (self.constructor !== Promise) {\n        throw new TypeError(\"the promise constructor cannot be invoked directly\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n}\n\nfunction Promise(executor) {\n    this._bitField = 0;\n    this._fulfillmentHandler0 = undefined;\n    this._rejectionHandler0 = undefined;\n    this._promise0 = undefined;\n    this._receiver0 = undefined;\n    if (executor !== INTERNAL) {\n        check(this, executor);\n        this._resolveFromExecutor(executor);\n    }\n    this._promiseCreated();\n    this._fireEvent(\"promiseCreated\", this);\n}\n\nPromise.prototype.toString = function () {\n    return \"[object Promise]\";\n};\n\nPromise.prototype.caught = Promise.prototype[\"catch\"] = function (fn) {\n    var len = arguments.length;\n    if (len > 1) {\n        var catchInstances = new Array(len - 1),\n            j = 0, i;\n        for (i = 0; i < len - 1; ++i) {\n            var item = arguments[i];\n            if (util.isObject(item)) {\n                catchInstances[j++] = item;\n            } else {\n                return apiRejection(\"expecting an object but got \" +\n                    \"A catch statement predicate \" + util.classString(item));\n            }\n        }\n        catchInstances.length = j;\n        fn = arguments[i];\n        return this.then(undefined, catchFilter(catchInstances, fn, this));\n    }\n    return this.then(undefined, fn);\n};\n\nPromise.prototype.reflect = function () {\n    return this._then(reflectHandler,\n        reflectHandler, undefined, this, undefined);\n};\n\nPromise.prototype.then = function (didFulfill, didReject) {\n    if (debug.warnings() && arguments.length > 0 &&\n        typeof didFulfill !== \"function\" &&\n        typeof didReject !== \"function\") {\n        var msg = \".then() only accepts functions but was passed: \" +\n                util.classString(didFulfill);\n        if (arguments.length > 1) {\n            msg += \", \" + util.classString(didReject);\n        }\n        this._warn(msg);\n    }\n    return this._then(didFulfill, didReject, undefined, undefined, undefined);\n};\n\nPromise.prototype.done = function (didFulfill, didReject) {\n    var promise =\n        this._then(didFulfill, didReject, undefined, undefined, undefined);\n    promise._setIsFinal();\n};\n\nPromise.prototype.spread = function (fn) {\n    if (typeof fn !== \"function\") {\n        return apiRejection(\"expecting a function but got \" + util.classString(fn));\n    }\n    return this.all()._then(fn, undefined, undefined, APPLY, undefined);\n};\n\nPromise.prototype.toJSON = function () {\n    var ret = {\n        isFulfilled: false,\n        isRejected: false,\n        fulfillmentValue: undefined,\n        rejectionReason: undefined\n    };\n    if (this.isFulfilled()) {\n        ret.fulfillmentValue = this.value();\n        ret.isFulfilled = true;\n    } else if (this.isRejected()) {\n        ret.rejectionReason = this.reason();\n        ret.isRejected = true;\n    }\n    return ret;\n};\n\nPromise.prototype.all = function () {\n    if (arguments.length > 0) {\n        this._warn(\".all() was passed arguments but it does not take any\");\n    }\n    return new PromiseArray(this).promise();\n};\n\nPromise.prototype.error = function (fn) {\n    return this.caught(util.originatesFromRejection, fn);\n};\n\nPromise.getNewLibraryCopy = module.exports;\n\nPromise.is = function (val) {\n    return val instanceof Promise;\n};\n\nPromise.fromNode = Promise.fromCallback = function(fn) {\n    var ret = new Promise(INTERNAL);\n    ret._captureStackTrace();\n    var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs\n                                         : false;\n    var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs));\n    if (result === errorObj) {\n        ret._rejectCallback(result.e, true);\n    }\n    if (!ret._isFateSealed()) ret._setAsyncGuaranteed();\n    return ret;\n};\n\nPromise.all = function (promises) {\n    return new PromiseArray(promises).promise();\n};\n\nPromise.cast = function (obj) {\n    var ret = tryConvertToPromise(obj);\n    if (!(ret instanceof Promise)) {\n        ret = new Promise(INTERNAL);\n        ret._captureStackTrace();\n        ret._setFulfilled();\n        ret._rejectionHandler0 = obj;\n    }\n    return ret;\n};\n\nPromise.resolve = Promise.fulfilled = Promise.cast;\n\nPromise.reject = Promise.rejected = function (reason) {\n    var ret = new Promise(INTERNAL);\n    ret._captureStackTrace();\n    ret._rejectCallback(reason, true);\n    return ret;\n};\n\nPromise.setScheduler = function(fn) {\n    if (typeof fn !== \"function\") {\n        throw new TypeError(\"expecting a function but got \" + util.classString(fn));\n    }\n    return async.setScheduler(fn);\n};\n\nPromise.prototype._then = function (\n    didFulfill,\n    didReject,\n    _,    receiver,\n    internalData\n) {\n    var haveInternalData = internalData !== undefined;\n    var promise = haveInternalData ? internalData : new Promise(INTERNAL);\n    var target = this._target();\n    var bitField = target._bitField;\n\n    if (!haveInternalData) {\n        promise._propagateFrom(this, 3);\n        promise._captureStackTrace();\n        if (receiver === undefined &&\n            ((this._bitField & 2097152) !== 0)) {\n            if (!((bitField & 50397184) === 0)) {\n                receiver = this._boundValue();\n            } else {\n                receiver = target === this ? undefined : this._boundTo;\n            }\n        }\n        this._fireEvent(\"promiseChained\", this, promise);\n    }\n\n    var domain = getDomain();\n    if (!((bitField & 50397184) === 0)) {\n        var handler, value, settler = target._settlePromiseCtx;\n        if (((bitField & 33554432) !== 0)) {\n            value = target._rejectionHandler0;\n            handler = didFulfill;\n        } else if (((bitField & 16777216) !== 0)) {\n            value = target._fulfillmentHandler0;\n            handler = didReject;\n            target._unsetRejectionIsUnhandled();\n        } else {\n            settler = target._settlePromiseLateCancellationObserver;\n            value = new CancellationError(\"late cancellation observer\");\n            target._attachExtraTrace(value);\n            handler = didReject;\n        }\n\n        async.invoke(settler, target, {\n            handler: domain === null ? handler\n                : (typeof handler === \"function\" &&\n                    util.domainBind(domain, handler)),\n            promise: promise,\n            receiver: receiver,\n            value: value\n        });\n    } else {\n        target._addCallbacks(didFulfill, didReject, promise, receiver, domain);\n    }\n\n    return promise;\n};\n\nPromise.prototype._length = function () {\n    return this._bitField & 65535;\n};\n\nPromise.prototype._isFateSealed = function () {\n    return (this._bitField & 117506048) !== 0;\n};\n\nPromise.prototype._isFollowing = function () {\n    return (this._bitField & 67108864) === 67108864;\n};\n\nPromise.prototype._setLength = function (len) {\n    this._bitField = (this._bitField & -65536) |\n        (len & 65535);\n};\n\nPromise.prototype._setFulfilled = function () {\n    this._bitField = this._bitField | 33554432;\n    this._fireEvent(\"promiseFulfilled\", this);\n};\n\nPromise.prototype._setRejected = function () {\n    this._bitField = this._bitField | 16777216;\n    this._fireEvent(\"promiseRejected\", this);\n};\n\nPromise.prototype._setFollowing = function () {\n    this._bitField = this._bitField | 67108864;\n    this._fireEvent(\"promiseResolved\", this);\n};\n\nPromise.prototype._setIsFinal = function () {\n    this._bitField = this._bitField | 4194304;\n};\n\nPromise.prototype._isFinal = function () {\n    return (this._bitField & 4194304) > 0;\n};\n\nPromise.prototype._unsetCancelled = function() {\n    this._bitField = this._bitField & (~65536);\n};\n\nPromise.prototype._setCancelled = function() {\n    this._bitField = this._bitField | 65536;\n    this._fireEvent(\"promiseCancelled\", this);\n};\n\nPromise.prototype._setWillBeCancelled = function() {\n    this._bitField = this._bitField | 8388608;\n};\n\nPromise.prototype._setAsyncGuaranteed = function() {\n    if (async.hasCustomScheduler()) return;\n    this._bitField = this._bitField | 134217728;\n};\n\nPromise.prototype._receiverAt = function (index) {\n    var ret = index === 0 ? this._receiver0 : this[\n            index * 4 - 4 + 3];\n    if (ret === UNDEFINED_BINDING) {\n        return undefined;\n    } else if (ret === undefined && this._isBound()) {\n        return this._boundValue();\n    }\n    return ret;\n};\n\nPromise.prototype._promiseAt = function (index) {\n    return this[\n            index * 4 - 4 + 2];\n};\n\nPromise.prototype._fulfillmentHandlerAt = function (index) {\n    return this[\n            index * 4 - 4 + 0];\n};\n\nPromise.prototype._rejectionHandlerAt = function (index) {\n    return this[\n            index * 4 - 4 + 1];\n};\n\nPromise.prototype._boundValue = function() {};\n\nPromise.prototype._migrateCallback0 = function (follower) {\n    var bitField = follower._bitField;\n    var fulfill = follower._fulfillmentHandler0;\n    var reject = follower._rejectionHandler0;\n    var promise = follower._promise0;\n    var receiver = follower._receiverAt(0);\n    if (receiver === undefined) receiver = UNDEFINED_BINDING;\n    this._addCallbacks(fulfill, reject, promise, receiver, null);\n};\n\nPromise.prototype._migrateCallbackAt = function (follower, index) {\n    var fulfill = follower._fulfillmentHandlerAt(index);\n    var reject = follower._rejectionHandlerAt(index);\n    var promise = follower._promiseAt(index);\n    var receiver = follower._receiverAt(index);\n    if (receiver === undefined) receiver = UNDEFINED_BINDING;\n    this._addCallbacks(fulfill, reject, promise, receiver, null);\n};\n\nPromise.prototype._addCallbacks = function (\n    fulfill,\n    reject,\n    promise,\n    receiver,\n    domain\n) {\n    var index = this._length();\n\n    if (index >= 65535 - 4) {\n        index = 0;\n        this._setLength(0);\n    }\n\n    if (index === 0) {\n        this._promise0 = promise;\n        this._receiver0 = receiver;\n        if (typeof fulfill === \"function\") {\n            this._fulfillmentHandler0 =\n                domain === null ? fulfill : util.domainBind(domain, fulfill);\n        }\n        if (typeof reject === \"function\") {\n            this._rejectionHandler0 =\n                domain === null ? reject : util.domainBind(domain, reject);\n        }\n    } else {\n        var base = index * 4 - 4;\n        this[base + 2] = promise;\n        this[base + 3] = receiver;\n        if (typeof fulfill === \"function\") {\n            this[base + 0] =\n                domain === null ? fulfill : util.domainBind(domain, fulfill);\n        }\n        if (typeof reject === \"function\") {\n            this[base + 1] =\n                domain === null ? reject : util.domainBind(domain, reject);\n        }\n    }\n    this._setLength(index + 1);\n    return index;\n};\n\nPromise.prototype._proxy = function (proxyable, arg) {\n    this._addCallbacks(undefined, undefined, arg, proxyable, null);\n};\n\nPromise.prototype._resolveCallback = function(value, shouldBind) {\n    if (((this._bitField & 117506048) !== 0)) return;\n    if (value === this)\n        return this._rejectCallback(makeSelfResolutionError(), false);\n    var maybePromise = tryConvertToPromise(value, this);\n    if (!(maybePromise instanceof Promise)) return this._fulfill(value);\n\n    if (shouldBind) this._propagateFrom(maybePromise, 2);\n\n    var promise = maybePromise._target();\n\n    if (promise === this) {\n        this._reject(makeSelfResolutionError());\n        return;\n    }\n\n    var bitField = promise._bitField;\n    if (((bitField & 50397184) === 0)) {\n        var len = this._length();\n        if (len > 0) promise._migrateCallback0(this);\n        for (var i = 1; i < len; ++i) {\n            promise._migrateCallbackAt(this, i);\n        }\n        this._setFollowing();\n        this._setLength(0);\n        this._setFollowee(promise);\n    } else if (((bitField & 33554432) !== 0)) {\n        this._fulfill(promise._value());\n    } else if (((bitField & 16777216) !== 0)) {\n        this._reject(promise._reason());\n    } else {\n        var reason = new CancellationError(\"late cancellation observer\");\n        promise._attachExtraTrace(reason);\n        this._reject(reason);\n    }\n};\n\nPromise.prototype._rejectCallback =\nfunction(reason, synchronous, ignoreNonErrorWarnings) {\n    var trace = util.ensureErrorObject(reason);\n    var hasStack = trace === reason;\n    if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) {\n        var message = \"a promise was rejected with a non-error: \" +\n            util.classString(reason);\n        this._warn(message, true);\n    }\n    this._attachExtraTrace(trace, synchronous ? hasStack : false);\n    this._reject(reason);\n};\n\nPromise.prototype._resolveFromExecutor = function (executor) {\n    var promise = this;\n    this._captureStackTrace();\n    this._pushContext();\n    var synchronous = true;\n    var r = this._execute(executor, function(value) {\n        promise._resolveCallback(value);\n    }, function (reason) {\n        promise._rejectCallback(reason, synchronous);\n    });\n    synchronous = false;\n    this._popContext();\n\n    if (r !== undefined) {\n        promise._rejectCallback(r, true);\n    }\n};\n\nPromise.prototype._settlePromiseFromHandler = function (\n    handler, receiver, value, promise\n) {\n    var bitField = promise._bitField;\n    if (((bitField & 65536) !== 0)) return;\n    promise._pushContext();\n    var x;\n    if (receiver === APPLY) {\n        if (!value || typeof value.length !== \"number\") {\n            x = errorObj;\n            x.e = new TypeError(\"cannot .spread() a non-array: \" +\n                                    util.classString(value));\n        } else {\n            x = tryCatch(handler).apply(this._boundValue(), value);\n        }\n    } else {\n        x = tryCatch(handler).call(receiver, value);\n    }\n    var promiseCreated = promise._popContext();\n    bitField = promise._bitField;\n    if (((bitField & 65536) !== 0)) return;\n\n    if (x === NEXT_FILTER) {\n        promise._reject(value);\n    } else if (x === errorObj) {\n        promise._rejectCallback(x.e, false);\n    } else {\n        debug.checkForgottenReturns(x, promiseCreated, \"\",  promise, this);\n        promise._resolveCallback(x);\n    }\n};\n\nPromise.prototype._target = function() {\n    var ret = this;\n    while (ret._isFollowing()) ret = ret._followee();\n    return ret;\n};\n\nPromise.prototype._followee = function() {\n    return this._rejectionHandler0;\n};\n\nPromise.prototype._setFollowee = function(promise) {\n    this._rejectionHandler0 = promise;\n};\n\nPromise.prototype._settlePromise = function(promise, handler, receiver, value) {\n    var isPromise = promise instanceof Promise;\n    var bitField = this._bitField;\n    var asyncGuaranteed = ((bitField & 134217728) !== 0);\n    if (((bitField & 65536) !== 0)) {\n        if (isPromise) promise._invokeInternalOnCancel();\n\n        if (receiver instanceof PassThroughHandlerContext &&\n            receiver.isFinallyHandler()) {\n            receiver.cancelPromise = promise;\n            if (tryCatch(handler).call(receiver, value) === errorObj) {\n                promise._reject(errorObj.e);\n            }\n        } else if (handler === reflectHandler) {\n            promise._fulfill(reflectHandler.call(receiver));\n        } else if (receiver instanceof Proxyable) {\n            receiver._promiseCancelled(promise);\n        } else if (isPromise || promise instanceof PromiseArray) {\n            promise._cancel();\n        } else {\n            receiver.cancel();\n        }\n    } else if (typeof handler === \"function\") {\n        if (!isPromise) {\n            handler.call(receiver, value, promise);\n        } else {\n            if (asyncGuaranteed) promise._setAsyncGuaranteed();\n            this._settlePromiseFromHandler(handler, receiver, value, promise);\n        }\n    } else if (receiver instanceof Proxyable) {\n        if (!receiver._isResolved()) {\n            if (((bitField & 33554432) !== 0)) {\n                receiver._promiseFulfilled(value, promise);\n            } else {\n                receiver._promiseRejected(value, promise);\n            }\n        }\n    } else if (isPromise) {\n        if (asyncGuaranteed) promise._setAsyncGuaranteed();\n        if (((bitField & 33554432) !== 0)) {\n            promise._fulfill(value);\n        } else {\n            promise._reject(value);\n        }\n    }\n};\n\nPromise.prototype._settlePromiseLateCancellationObserver = function(ctx) {\n    var handler = ctx.handler;\n    var promise = ctx.promise;\n    var receiver = ctx.receiver;\n    var value = ctx.value;\n    if (typeof handler === \"function\") {\n        if (!(promise instanceof Promise)) {\n            handler.call(receiver, value, promise);\n        } else {\n            this._settlePromiseFromHandler(handler, receiver, value, promise);\n        }\n    } else if (promise instanceof Promise) {\n        promise._reject(value);\n    }\n};\n\nPromise.prototype._settlePromiseCtx = function(ctx) {\n    this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value);\n};\n\nPromise.prototype._settlePromise0 = function(handler, value, bitField) {\n    var promise = this._promise0;\n    var receiver = this._receiverAt(0);\n    this._promise0 = undefined;\n    this._receiver0 = undefined;\n    this._settlePromise(promise, handler, receiver, value);\n};\n\nPromise.prototype._clearCallbackDataAtIndex = function(index) {\n    var base = index * 4 - 4;\n    this[base + 2] =\n    this[base + 3] =\n    this[base + 0] =\n    this[base + 1] = undefined;\n};\n\nPromise.prototype._fulfill = function (value) {\n    var bitField = this._bitField;\n    if (((bitField & 117506048) >>> 16)) return;\n    if (value === this) {\n        var err = makeSelfResolutionError();\n        this._attachExtraTrace(err);\n        return this._reject(err);\n    }\n    this._setFulfilled();\n    this._rejectionHandler0 = value;\n\n    if ((bitField & 65535) > 0) {\n        if (((bitField & 134217728) !== 0)) {\n            this._settlePromises();\n        } else {\n            async.settlePromises(this);\n        }\n    }\n};\n\nPromise.prototype._reject = function (reason) {\n    var bitField = this._bitField;\n    if (((bitField & 117506048) >>> 16)) return;\n    this._setRejected();\n    this._fulfillmentHandler0 = reason;\n\n    if (this._isFinal()) {\n        return async.fatalError(reason, util.isNode);\n    }\n\n    if ((bitField & 65535) > 0) {\n        async.settlePromises(this);\n    } else {\n        this._ensurePossibleRejectionHandled();\n    }\n};\n\nPromise.prototype._fulfillPromises = function (len, value) {\n    for (var i = 1; i < len; i++) {\n        var handler = this._fulfillmentHandlerAt(i);\n        var promise = this._promiseAt(i);\n        var receiver = this._receiverAt(i);\n        this._clearCallbackDataAtIndex(i);\n        this._settlePromise(promise, handler, receiver, value);\n    }\n};\n\nPromise.prototype._rejectPromises = function (len, reason) {\n    for (var i = 1; i < len; i++) {\n        var handler = this._rejectionHandlerAt(i);\n        var promise = this._promiseAt(i);\n        var receiver = this._receiverAt(i);\n        this._clearCallbackDataAtIndex(i);\n        this._settlePromise(promise, handler, receiver, reason);\n    }\n};\n\nPromise.prototype._settlePromises = function () {\n    var bitField = this._bitField;\n    var len = (bitField & 65535);\n\n    if (len > 0) {\n        if (((bitField & 16842752) !== 0)) {\n            var reason = this._fulfillmentHandler0;\n            this._settlePromise0(this._rejectionHandler0, reason, bitField);\n            this._rejectPromises(len, reason);\n        } else {\n            var value = this._rejectionHandler0;\n            this._settlePromise0(this._fulfillmentHandler0, value, bitField);\n            this._fulfillPromises(len, value);\n        }\n        this._setLength(0);\n    }\n    this._clearCancellationData();\n};\n\nPromise.prototype._settledValue = function() {\n    var bitField = this._bitField;\n    if (((bitField & 33554432) !== 0)) {\n        return this._rejectionHandler0;\n    } else if (((bitField & 16777216) !== 0)) {\n        return this._fulfillmentHandler0;\n    }\n};\n\nfunction deferResolve(v) {this.promise._resolveCallback(v);}\nfunction deferReject(v) {this.promise._rejectCallback(v, false);}\n\nPromise.defer = Promise.pending = function() {\n    debug.deprecated(\"Promise.defer\", \"new Promise\");\n    var promise = new Promise(INTERNAL);\n    return {\n        promise: promise,\n        resolve: deferResolve,\n        reject: deferReject\n    };\n};\n\nutil.notEnumerableProp(Promise,\n                       \"_makeSelfResolutionError\",\n                       makeSelfResolutionError);\n\nrequire(\"./method\")(Promise, INTERNAL, tryConvertToPromise, apiRejection,\n    debug);\nrequire(\"./bind\")(Promise, INTERNAL, tryConvertToPromise, debug);\nrequire(\"./cancel\")(Promise, PromiseArray, apiRejection, debug);\nrequire(\"./direct_resolve\")(Promise);\nrequire(\"./synchronous_inspection\")(Promise);\nrequire(\"./join\")(\n    Promise, PromiseArray, tryConvertToPromise, INTERNAL, async, getDomain);\nPromise.Promise = Promise;\nPromise.version = \"3.4.7\";\nrequire('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);\nrequire('./call_get.js')(Promise);\nrequire('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug);\nrequire('./timers.js')(Promise, INTERNAL, debug);\nrequire('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug);\nrequire('./nodeify.js')(Promise);\nrequire('./promisify.js')(Promise, INTERNAL);\nrequire('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);\nrequire('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);\nrequire('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);\nrequire('./settle.js')(Promise, PromiseArray, debug);\nrequire('./some.js')(Promise, PromiseArray, apiRejection);\nrequire('./filter.js')(Promise, INTERNAL);\nrequire('./each.js')(Promise, INTERNAL);\nrequire('./any.js')(Promise);\n                                                         \n    util.toFastProperties(Promise);                                          \n    util.toFastProperties(Promise.prototype);                                \n    function fillTypes(value) {                                              \n        var p = new Promise(INTERNAL);                                       \n        p._fulfillmentHandler0 = value;                                      \n        p._rejectionHandler0 = value;                                        \n        p._promise0 = value;                                                 \n        p._receiver0 = value;                                                \n    }                                                                        \n    // Complete slack tracking, opt out of field-type tracking and           \n    // stabilize map                                                         \n    fillTypes({a: 1});                                                       \n    fillTypes({b: 2});                                                       \n    fillTypes({c: 3});                                                       \n    fillTypes(1);                                                            \n    fillTypes(function(){});                                                 \n    fillTypes(undefined);                                                    \n    fillTypes(false);                                                        \n    fillTypes(new Promise(INTERNAL));                                        \n    debug.setBounds(Async.firstLineError, util.lastLineError);               \n    return Promise;                                                          \n\n};\n\n}).call(this,require('_process'))\n},{\"./any.js\":40,\"./async\":41,\"./bind\":42,\"./call_get.js\":43,\"./cancel\":44,\"./catch_filter\":45,\"./context\":46,\"./debuggability\":47,\"./direct_resolve\":48,\"./each.js\":49,\"./errors\":50,\"./es5\":51,\"./filter.js\":52,\"./finally\":53,\"./generators.js\":54,\"./join\":55,\"./map.js\":56,\"./method\":57,\"./nodeback\":58,\"./nodeify.js\":59,\"./promise_array\":61,\"./promisify.js\":62,\"./props.js\":63,\"./race.js\":65,\"./reduce.js\":66,\"./settle.js\":68,\"./some.js\":69,\"./synchronous_inspection\":70,\"./thenables\":71,\"./timers.js\":72,\"./using.js\":73,\"./util\":74,\"_process\":138}],61:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL, tryConvertToPromise,\n    apiRejection, Proxyable) {\nvar util = require(\"./util\");\nvar isArray = util.isArray;\n\nfunction toResolutionValue(val) {\n    switch(val) {\n    case -2: return [];\n    case -3: return {};\n    }\n}\n\nfunction PromiseArray(values) {\n    var promise = this._promise = new Promise(INTERNAL);\n    if (values instanceof Promise) {\n        promise._propagateFrom(values, 3);\n    }\n    promise._setOnCancel(this);\n    this._values = values;\n    this._length = 0;\n    this._totalResolved = 0;\n    this._init(undefined, -2);\n}\nutil.inherits(PromiseArray, Proxyable);\n\nPromiseArray.prototype.length = function () {\n    return this._length;\n};\n\nPromiseArray.prototype.promise = function () {\n    return this._promise;\n};\n\nPromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {\n    var values = tryConvertToPromise(this._values, this._promise);\n    if (values instanceof Promise) {\n        values = values._target();\n        var bitField = values._bitField;\n        ;\n        this._values = values;\n\n        if (((bitField & 50397184) === 0)) {\n            this._promise._setAsyncGuaranteed();\n            return values._then(\n                init,\n                this._reject,\n                undefined,\n                this,\n                resolveValueIfEmpty\n           );\n        } else if (((bitField & 33554432) !== 0)) {\n            values = values._value();\n        } else if (((bitField & 16777216) !== 0)) {\n            return this._reject(values._reason());\n        } else {\n            return this._cancel();\n        }\n    }\n    values = util.asArray(values);\n    if (values === null) {\n        var err = apiRejection(\n            \"expecting an array or an iterable object but got \" + util.classString(values)).reason();\n        this._promise._rejectCallback(err, false);\n        return;\n    }\n\n    if (values.length === 0) {\n        if (resolveValueIfEmpty === -5) {\n            this._resolveEmptyArray();\n        }\n        else {\n            this._resolve(toResolutionValue(resolveValueIfEmpty));\n        }\n        return;\n    }\n    this._iterate(values);\n};\n\nPromiseArray.prototype._iterate = function(values) {\n    var len = this.getActualLength(values.length);\n    this._length = len;\n    this._values = this.shouldCopyValues() ? new Array(len) : this._values;\n    var result = this._promise;\n    var isResolved = false;\n    var bitField = null;\n    for (var i = 0; i < len; ++i) {\n        var maybePromise = tryConvertToPromise(values[i], result);\n\n        if (maybePromise instanceof Promise) {\n            maybePromise = maybePromise._target();\n            bitField = maybePromise._bitField;\n        } else {\n            bitField = null;\n        }\n\n        if (isResolved) {\n            if (bitField !== null) {\n                maybePromise.suppressUnhandledRejections();\n            }\n        } else if (bitField !== null) {\n            if (((bitField & 50397184) === 0)) {\n                maybePromise._proxy(this, i);\n                this._values[i] = maybePromise;\n            } else if (((bitField & 33554432) !== 0)) {\n                isResolved = this._promiseFulfilled(maybePromise._value(), i);\n            } else if (((bitField & 16777216) !== 0)) {\n                isResolved = this._promiseRejected(maybePromise._reason(), i);\n            } else {\n                isResolved = this._promiseCancelled(i);\n            }\n        } else {\n            isResolved = this._promiseFulfilled(maybePromise, i);\n        }\n    }\n    if (!isResolved) result._setAsyncGuaranteed();\n};\n\nPromiseArray.prototype._isResolved = function () {\n    return this._values === null;\n};\n\nPromiseArray.prototype._resolve = function (value) {\n    this._values = null;\n    this._promise._fulfill(value);\n};\n\nPromiseArray.prototype._cancel = function() {\n    if (this._isResolved() || !this._promise._isCancellable()) return;\n    this._values = null;\n    this._promise._cancel();\n};\n\nPromiseArray.prototype._reject = function (reason) {\n    this._values = null;\n    this._promise._rejectCallback(reason, false);\n};\n\nPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    this._values[index] = value;\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= this._length) {\n        this._resolve(this._values);\n        return true;\n    }\n    return false;\n};\n\nPromiseArray.prototype._promiseCancelled = function() {\n    this._cancel();\n    return true;\n};\n\nPromiseArray.prototype._promiseRejected = function (reason) {\n    this._totalResolved++;\n    this._reject(reason);\n    return true;\n};\n\nPromiseArray.prototype._resultCancelled = function() {\n    if (this._isResolved()) return;\n    var values = this._values;\n    this._cancel();\n    if (values instanceof Promise) {\n        values.cancel();\n    } else {\n        for (var i = 0; i < values.length; ++i) {\n            if (values[i] instanceof Promise) {\n                values[i].cancel();\n            }\n        }\n    }\n};\n\nPromiseArray.prototype.shouldCopyValues = function () {\n    return true;\n};\n\nPromiseArray.prototype.getActualLength = function (len) {\n    return len;\n};\n\nreturn PromiseArray;\n};\n\n},{\"./util\":74}],62:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar THIS = {};\nvar util = require(\"./util\");\nvar nodebackForPromise = require(\"./nodeback\");\nvar withAppended = util.withAppended;\nvar maybeWrapAsError = util.maybeWrapAsError;\nvar canEvaluate = util.canEvaluate;\nvar TypeError = require(\"./errors\").TypeError;\nvar defaultSuffix = \"Async\";\nvar defaultPromisified = {__isPromisified__: true};\nvar noCopyProps = [\n    \"arity\",    \"length\",\n    \"name\",\n    \"arguments\",\n    \"caller\",\n    \"callee\",\n    \"prototype\",\n    \"__isPromisified__\"\n];\nvar noCopyPropsPattern = new RegExp(\"^(?:\" + noCopyProps.join(\"|\") + \")$\");\n\nvar defaultFilter = function(name) {\n    return util.isIdentifier(name) &&\n        name.charAt(0) !== \"_\" &&\n        name !== \"constructor\";\n};\n\nfunction propsFilter(key) {\n    return !noCopyPropsPattern.test(key);\n}\n\nfunction isPromisified(fn) {\n    try {\n        return fn.__isPromisified__ === true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n\nfunction hasPromisified(obj, key, suffix) {\n    var val = util.getDataPropertyOrDefault(obj, key + suffix,\n                                            defaultPromisified);\n    return val ? isPromisified(val) : false;\n}\nfunction checkValid(ret, suffix, suffixRegexp) {\n    for (var i = 0; i < ret.length; i += 2) {\n        var key = ret[i];\n        if (suffixRegexp.test(key)) {\n            var keyWithoutAsyncSuffix = key.replace(suffixRegexp, \"\");\n            for (var j = 0; j < ret.length; j += 2) {\n                if (ret[j] === keyWithoutAsyncSuffix) {\n                    throw new TypeError(\"Cannot promisify an API that has normal methods with '%s'-suffix\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\"\n                        .replace(\"%s\", suffix));\n                }\n            }\n        }\n    }\n}\n\nfunction promisifiableMethods(obj, suffix, suffixRegexp, filter) {\n    var keys = util.inheritedDataKeys(obj);\n    var ret = [];\n    for (var i = 0; i < keys.length; ++i) {\n        var key = keys[i];\n        var value = obj[key];\n        var passesDefaultFilter = filter === defaultFilter\n            ? true : defaultFilter(key, value, obj);\n        if (typeof value === \"function\" &&\n            !isPromisified(value) &&\n            !hasPromisified(obj, key, suffix) &&\n            filter(key, value, obj, passesDefaultFilter)) {\n            ret.push(key, value);\n        }\n    }\n    checkValid(ret, suffix, suffixRegexp);\n    return ret;\n}\n\nvar escapeIdentRegex = function(str) {\n    return str.replace(/([$])/, \"\\\\$\");\n};\n\nvar makeNodePromisifiedEval;\nif (!false) {\nvar switchCaseArgumentOrder = function(likelyArgumentCount) {\n    var ret = [likelyArgumentCount];\n    var min = Math.max(0, likelyArgumentCount - 1 - 3);\n    for(var i = likelyArgumentCount - 1; i >= min; --i) {\n        ret.push(i);\n    }\n    for(var i = likelyArgumentCount + 1; i <= 3; ++i) {\n        ret.push(i);\n    }\n    return ret;\n};\n\nvar argumentSequence = function(argumentCount) {\n    return util.filledRange(argumentCount, \"_arg\", \"\");\n};\n\nvar parameterDeclaration = function(parameterCount) {\n    return util.filledRange(\n        Math.max(parameterCount, 3), \"_arg\", \"\");\n};\n\nvar parameterCount = function(fn) {\n    if (typeof fn.length === \"number\") {\n        return Math.max(Math.min(fn.length, 1023 + 1), 0);\n    }\n    return 0;\n};\n\nmakeNodePromisifiedEval =\nfunction(callback, receiver, originalName, fn, _, multiArgs) {\n    var newParameterCount = Math.max(0, parameterCount(fn) - 1);\n    var argumentOrder = switchCaseArgumentOrder(newParameterCount);\n    var shouldProxyThis = typeof callback === \"string\" || receiver === THIS;\n\n    function generateCallForArgumentCount(count) {\n        var args = argumentSequence(count).join(\", \");\n        var comma = count > 0 ? \", \" : \"\";\n        var ret;\n        if (shouldProxyThis) {\n            ret = \"ret = callback.call(this, {{args}}, nodeback); break;\\n\";\n        } else {\n            ret = receiver === undefined\n                ? \"ret = callback({{args}}, nodeback); break;\\n\"\n                : \"ret = callback.call(receiver, {{args}}, nodeback); break;\\n\";\n        }\n        return ret.replace(\"{{args}}\", args).replace(\", \", comma);\n    }\n\n    function generateArgumentSwitchCase() {\n        var ret = \"\";\n        for (var i = 0; i < argumentOrder.length; ++i) {\n            ret += \"case \" + argumentOrder[i] +\":\" +\n                generateCallForArgumentCount(argumentOrder[i]);\n        }\n\n        ret += \"                                                             \\n\\\n        default:                                                             \\n\\\n            var args = new Array(len + 1);                                   \\n\\\n            var i = 0;                                                       \\n\\\n            for (var i = 0; i < len; ++i) {                                  \\n\\\n               args[i] = arguments[i];                                       \\n\\\n            }                                                                \\n\\\n            args[i] = nodeback;                                              \\n\\\n            [CodeForCall]                                                    \\n\\\n            break;                                                           \\n\\\n        \".replace(\"[CodeForCall]\", (shouldProxyThis\n                                ? \"ret = callback.apply(this, args);\\n\"\n                                : \"ret = callback.apply(receiver, args);\\n\"));\n        return ret;\n    }\n\n    var getFunctionCode = typeof callback === \"string\"\n                                ? (\"this != null ? this['\"+callback+\"'] : fn\")\n                                : \"fn\";\n    var body = \"'use strict';                                                \\n\\\n        var ret = function (Parameters) {                                    \\n\\\n            'use strict';                                                    \\n\\\n            var len = arguments.length;                                      \\n\\\n            var promise = new Promise(INTERNAL);                             \\n\\\n            promise._captureStackTrace();                                    \\n\\\n            var nodeback = nodebackForPromise(promise, \" + multiArgs + \");   \\n\\\n            var ret;                                                         \\n\\\n            var callback = tryCatch([GetFunctionCode]);                      \\n\\\n            switch(len) {                                                    \\n\\\n                [CodeForSwitchCase]                                          \\n\\\n            }                                                                \\n\\\n            if (ret === errorObj) {                                          \\n\\\n                promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\\n\\\n            }                                                                \\n\\\n            if (!promise._isFateSealed()) promise._setAsyncGuaranteed();     \\n\\\n            return promise;                                                  \\n\\\n        };                                                                   \\n\\\n        notEnumerableProp(ret, '__isPromisified__', true);                   \\n\\\n        return ret;                                                          \\n\\\n    \".replace(\"[CodeForSwitchCase]\", generateArgumentSwitchCase())\n        .replace(\"[GetFunctionCode]\", getFunctionCode);\n    body = body.replace(\"Parameters\", parameterDeclaration(newParameterCount));\n    return new Function(\"Promise\",\n                        \"fn\",\n                        \"receiver\",\n                        \"withAppended\",\n                        \"maybeWrapAsError\",\n                        \"nodebackForPromise\",\n                        \"tryCatch\",\n                        \"errorObj\",\n                        \"notEnumerableProp\",\n                        \"INTERNAL\",\n                        body)(\n                    Promise,\n                    fn,\n                    receiver,\n                    withAppended,\n                    maybeWrapAsError,\n                    nodebackForPromise,\n                    util.tryCatch,\n                    util.errorObj,\n                    util.notEnumerableProp,\n                    INTERNAL);\n};\n}\n\nfunction makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) {\n    var defaultThis = (function() {return this;})();\n    var method = callback;\n    if (typeof method === \"string\") {\n        callback = fn;\n    }\n    function promisified() {\n        var _receiver = receiver;\n        if (receiver === THIS) _receiver = this;\n        var promise = new Promise(INTERNAL);\n        promise._captureStackTrace();\n        var cb = typeof method === \"string\" && this !== defaultThis\n            ? this[method] : callback;\n        var fn = nodebackForPromise(promise, multiArgs);\n        try {\n            cb.apply(_receiver, withAppended(arguments, fn));\n        } catch(e) {\n            promise._rejectCallback(maybeWrapAsError(e), true, true);\n        }\n        if (!promise._isFateSealed()) promise._setAsyncGuaranteed();\n        return promise;\n    }\n    util.notEnumerableProp(promisified, \"__isPromisified__\", true);\n    return promisified;\n}\n\nvar makeNodePromisified = canEvaluate\n    ? makeNodePromisifiedEval\n    : makeNodePromisifiedClosure;\n\nfunction promisifyAll(obj, suffix, filter, promisifier, multiArgs) {\n    var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + \"$\");\n    var methods =\n        promisifiableMethods(obj, suffix, suffixRegexp, filter);\n\n    for (var i = 0, len = methods.length; i < len; i+= 2) {\n        var key = methods[i];\n        var fn = methods[i+1];\n        var promisifiedKey = key + suffix;\n        if (promisifier === makeNodePromisified) {\n            obj[promisifiedKey] =\n                makeNodePromisified(key, THIS, key, fn, suffix, multiArgs);\n        } else {\n            var promisified = promisifier(fn, function() {\n                return makeNodePromisified(key, THIS, key,\n                                           fn, suffix, multiArgs);\n            });\n            util.notEnumerableProp(promisified, \"__isPromisified__\", true);\n            obj[promisifiedKey] = promisified;\n        }\n    }\n    util.toFastProperties(obj);\n    return obj;\n}\n\nfunction promisify(callback, receiver, multiArgs) {\n    return makeNodePromisified(callback, receiver, undefined,\n                                callback, null, multiArgs);\n}\n\nPromise.promisify = function (fn, options) {\n    if (typeof fn !== \"function\") {\n        throw new TypeError(\"expecting a function but got \" + util.classString(fn));\n    }\n    if (isPromisified(fn)) {\n        return fn;\n    }\n    options = Object(options);\n    var receiver = options.context === undefined ? THIS : options.context;\n    var multiArgs = !!options.multiArgs;\n    var ret = promisify(fn, receiver, multiArgs);\n    util.copyDescriptors(fn, ret, propsFilter);\n    return ret;\n};\n\nPromise.promisifyAll = function (target, options) {\n    if (typeof target !== \"function\" && typeof target !== \"object\") {\n        throw new TypeError(\"the target of promisifyAll must be an object or a function\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    options = Object(options);\n    var multiArgs = !!options.multiArgs;\n    var suffix = options.suffix;\n    if (typeof suffix !== \"string\") suffix = defaultSuffix;\n    var filter = options.filter;\n    if (typeof filter !== \"function\") filter = defaultFilter;\n    var promisifier = options.promisifier;\n    if (typeof promisifier !== \"function\") promisifier = makeNodePromisified;\n\n    if (!util.isIdentifier(suffix)) {\n        throw new RangeError(\"suffix must be a valid identifier\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n\n    var keys = util.inheritedDataKeys(target);\n    for (var i = 0; i < keys.length; ++i) {\n        var value = target[keys[i]];\n        if (keys[i] !== \"constructor\" &&\n            util.isClass(value)) {\n            promisifyAll(value.prototype, suffix, filter, promisifier,\n                multiArgs);\n            promisifyAll(value, suffix, filter, promisifier, multiArgs);\n        }\n    }\n\n    return promisifyAll(target, suffix, filter, promisifier, multiArgs);\n};\n};\n\n\n},{\"./errors\":50,\"./nodeback\":58,\"./util\":74}],63:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(\n    Promise, PromiseArray, tryConvertToPromise, apiRejection) {\nvar util = require(\"./util\");\nvar isObject = util.isObject;\nvar es5 = require(\"./es5\");\nvar Es6Map;\nif (typeof Map === \"function\") Es6Map = Map;\n\nvar mapToEntries = (function() {\n    var index = 0;\n    var size = 0;\n\n    function extractEntry(value, key) {\n        this[index] = value;\n        this[index + size] = key;\n        index++;\n    }\n\n    return function mapToEntries(map) {\n        size = map.size;\n        index = 0;\n        var ret = new Array(map.size * 2);\n        map.forEach(extractEntry, ret);\n        return ret;\n    };\n})();\n\nvar entriesToMap = function(entries) {\n    var ret = new Es6Map();\n    var length = entries.length / 2 | 0;\n    for (var i = 0; i < length; ++i) {\n        var key = entries[length + i];\n        var value = entries[i];\n        ret.set(key, value);\n    }\n    return ret;\n};\n\nfunction PropertiesPromiseArray(obj) {\n    var isMap = false;\n    var entries;\n    if (Es6Map !== undefined && obj instanceof Es6Map) {\n        entries = mapToEntries(obj);\n        isMap = true;\n    } else {\n        var keys = es5.keys(obj);\n        var len = keys.length;\n        entries = new Array(len * 2);\n        for (var i = 0; i < len; ++i) {\n            var key = keys[i];\n            entries[i] = obj[key];\n            entries[i + len] = key;\n        }\n    }\n    this.constructor$(entries);\n    this._isMap = isMap;\n    this._init$(undefined, -3);\n}\nutil.inherits(PropertiesPromiseArray, PromiseArray);\n\nPropertiesPromiseArray.prototype._init = function () {};\n\nPropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    this._values[index] = value;\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= this._length) {\n        var val;\n        if (this._isMap) {\n            val = entriesToMap(this._values);\n        } else {\n            val = {};\n            var keyOffset = this.length();\n            for (var i = 0, len = this.length(); i < len; ++i) {\n                val[this._values[i + keyOffset]] = this._values[i];\n            }\n        }\n        this._resolve(val);\n        return true;\n    }\n    return false;\n};\n\nPropertiesPromiseArray.prototype.shouldCopyValues = function () {\n    return false;\n};\n\nPropertiesPromiseArray.prototype.getActualLength = function (len) {\n    return len >> 1;\n};\n\nfunction props(promises) {\n    var ret;\n    var castValue = tryConvertToPromise(promises);\n\n    if (!isObject(castValue)) {\n        return apiRejection(\"cannot await properties of a non-object\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    } else if (castValue instanceof Promise) {\n        ret = castValue._then(\n            Promise.props, undefined, undefined, undefined, undefined);\n    } else {\n        ret = new PropertiesPromiseArray(castValue).promise();\n    }\n\n    if (castValue instanceof Promise) {\n        ret._propagateFrom(castValue, 2);\n    }\n    return ret;\n}\n\nPromise.prototype.props = function () {\n    return props(this);\n};\n\nPromise.props = function (promises) {\n    return props(promises);\n};\n};\n\n},{\"./es5\":51,\"./util\":74}],64:[function(require,module,exports){\n\"use strict\";\nfunction arrayMove(src, srcIndex, dst, dstIndex, len) {\n    for (var j = 0; j < len; ++j) {\n        dst[j + dstIndex] = src[j + srcIndex];\n        src[j + srcIndex] = void 0;\n    }\n}\n\nfunction Queue(capacity) {\n    this._capacity = capacity;\n    this._length = 0;\n    this._front = 0;\n}\n\nQueue.prototype._willBeOverCapacity = function (size) {\n    return this._capacity < size;\n};\n\nQueue.prototype._pushOne = function (arg) {\n    var length = this.length();\n    this._checkCapacity(length + 1);\n    var i = (this._front + length) & (this._capacity - 1);\n    this[i] = arg;\n    this._length = length + 1;\n};\n\nQueue.prototype.push = function (fn, receiver, arg) {\n    var length = this.length() + 3;\n    if (this._willBeOverCapacity(length)) {\n        this._pushOne(fn);\n        this._pushOne(receiver);\n        this._pushOne(arg);\n        return;\n    }\n    var j = this._front + length - 3;\n    this._checkCapacity(length);\n    var wrapMask = this._capacity - 1;\n    this[(j + 0) & wrapMask] = fn;\n    this[(j + 1) & wrapMask] = receiver;\n    this[(j + 2) & wrapMask] = arg;\n    this._length = length;\n};\n\nQueue.prototype.shift = function () {\n    var front = this._front,\n        ret = this[front];\n\n    this[front] = undefined;\n    this._front = (front + 1) & (this._capacity - 1);\n    this._length--;\n    return ret;\n};\n\nQueue.prototype.length = function () {\n    return this._length;\n};\n\nQueue.prototype._checkCapacity = function (size) {\n    if (this._capacity < size) {\n        this._resizeTo(this._capacity << 1);\n    }\n};\n\nQueue.prototype._resizeTo = function (capacity) {\n    var oldCapacity = this._capacity;\n    this._capacity = capacity;\n    var front = this._front;\n    var length = this._length;\n    var moveItemsCount = (front + length) & (oldCapacity - 1);\n    arrayMove(this, 0, this, oldCapacity, moveItemsCount);\n};\n\nmodule.exports = Queue;\n\n},{}],65:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(\n    Promise, INTERNAL, tryConvertToPromise, apiRejection) {\nvar util = require(\"./util\");\n\nvar raceLater = function (promise) {\n    return promise.then(function(array) {\n        return race(array, promise);\n    });\n};\n\nfunction race(promises, parent) {\n    var maybePromise = tryConvertToPromise(promises);\n\n    if (maybePromise instanceof Promise) {\n        return raceLater(maybePromise);\n    } else {\n        promises = util.asArray(promises);\n        if (promises === null)\n            return apiRejection(\"expecting an array or an iterable object but got \" + util.classString(promises));\n    }\n\n    var ret = new Promise(INTERNAL);\n    if (parent !== undefined) {\n        ret._propagateFrom(parent, 3);\n    }\n    var fulfill = ret._fulfill;\n    var reject = ret._reject;\n    for (var i = 0, len = promises.length; i < len; ++i) {\n        var val = promises[i];\n\n        if (val === undefined && !(i in promises)) {\n            continue;\n        }\n\n        Promise.cast(val)._then(fulfill, reject, undefined, ret, null);\n    }\n    return ret;\n}\n\nPromise.race = function (promises) {\n    return race(promises, undefined);\n};\n\nPromise.prototype.race = function () {\n    return race(this, undefined);\n};\n\n};\n\n},{\"./util\":74}],66:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise,\n                          PromiseArray,\n                          apiRejection,\n                          tryConvertToPromise,\n                          INTERNAL,\n                          debug) {\nvar getDomain = Promise._getDomain;\nvar util = require(\"./util\");\nvar tryCatch = util.tryCatch;\n\nfunction ReductionPromiseArray(promises, fn, initialValue, _each) {\n    this.constructor$(promises);\n    var domain = getDomain();\n    this._fn = domain === null ? fn : util.domainBind(domain, fn);\n    if (initialValue !== undefined) {\n        initialValue = Promise.resolve(initialValue);\n        initialValue._attachCancellationCallback(this);\n    }\n    this._initialValue = initialValue;\n    this._currentCancellable = null;\n    if(_each === INTERNAL) {\n        this._eachValues = Array(this._length);\n    } else if (_each === 0) {\n        this._eachValues = null;\n    } else {\n        this._eachValues = undefined;\n    }\n    this._promise._captureStackTrace();\n    this._init$(undefined, -5);\n}\nutil.inherits(ReductionPromiseArray, PromiseArray);\n\nReductionPromiseArray.prototype._gotAccum = function(accum) {\n    if (this._eachValues !== undefined && \n        this._eachValues !== null && \n        accum !== INTERNAL) {\n        this._eachValues.push(accum);\n    }\n};\n\nReductionPromiseArray.prototype._eachComplete = function(value) {\n    if (this._eachValues !== null) {\n        this._eachValues.push(value);\n    }\n    return this._eachValues;\n};\n\nReductionPromiseArray.prototype._init = function() {};\n\nReductionPromiseArray.prototype._resolveEmptyArray = function() {\n    this._resolve(this._eachValues !== undefined ? this._eachValues\n                                                 : this._initialValue);\n};\n\nReductionPromiseArray.prototype.shouldCopyValues = function () {\n    return false;\n};\n\nReductionPromiseArray.prototype._resolve = function(value) {\n    this._promise._resolveCallback(value);\n    this._values = null;\n};\n\nReductionPromiseArray.prototype._resultCancelled = function(sender) {\n    if (sender === this._initialValue) return this._cancel();\n    if (this._isResolved()) return;\n    this._resultCancelled$();\n    if (this._currentCancellable instanceof Promise) {\n        this._currentCancellable.cancel();\n    }\n    if (this._initialValue instanceof Promise) {\n        this._initialValue.cancel();\n    }\n};\n\nReductionPromiseArray.prototype._iterate = function (values) {\n    this._values = values;\n    var value;\n    var i;\n    var length = values.length;\n    if (this._initialValue !== undefined) {\n        value = this._initialValue;\n        i = 0;\n    } else {\n        value = Promise.resolve(values[0]);\n        i = 1;\n    }\n\n    this._currentCancellable = value;\n\n    if (!value.isRejected()) {\n        for (; i < length; ++i) {\n            var ctx = {\n                accum: null,\n                value: values[i],\n                index: i,\n                length: length,\n                array: this\n            };\n            value = value._then(gotAccum, undefined, undefined, ctx, undefined);\n        }\n    }\n\n    if (this._eachValues !== undefined) {\n        value = value\n            ._then(this._eachComplete, undefined, undefined, this, undefined);\n    }\n    value._then(completed, completed, undefined, value, this);\n};\n\nPromise.prototype.reduce = function (fn, initialValue) {\n    return reduce(this, fn, initialValue, null);\n};\n\nPromise.reduce = function (promises, fn, initialValue, _each) {\n    return reduce(promises, fn, initialValue, _each);\n};\n\nfunction completed(valueOrReason, array) {\n    if (this.isFulfilled()) {\n        array._resolve(valueOrReason);\n    } else {\n        array._reject(valueOrReason);\n    }\n}\n\nfunction reduce(promises, fn, initialValue, _each) {\n    if (typeof fn !== \"function\") {\n        return apiRejection(\"expecting a function but got \" + util.classString(fn));\n    }\n    var array = new ReductionPromiseArray(promises, fn, initialValue, _each);\n    return array.promise();\n}\n\nfunction gotAccum(accum) {\n    this.accum = accum;\n    this.array._gotAccum(accum);\n    var value = tryConvertToPromise(this.value, this.array._promise);\n    if (value instanceof Promise) {\n        this.array._currentCancellable = value;\n        return value._then(gotValue, undefined, undefined, this, undefined);\n    } else {\n        return gotValue.call(this, value);\n    }\n}\n\nfunction gotValue(value) {\n    var array = this.array;\n    var promise = array._promise;\n    var fn = tryCatch(array._fn);\n    promise._pushContext();\n    var ret;\n    if (array._eachValues !== undefined) {\n        ret = fn.call(promise._boundValue(), value, this.index, this.length);\n    } else {\n        ret = fn.call(promise._boundValue(),\n                              this.accum, value, this.index, this.length);\n    }\n    if (ret instanceof Promise) {\n        array._currentCancellable = ret;\n    }\n    var promiseCreated = promise._popContext();\n    debug.checkForgottenReturns(\n        ret,\n        promiseCreated,\n        array._eachValues !== undefined ? \"Promise.each\" : \"Promise.reduce\",\n        promise\n    );\n    return ret;\n}\n};\n\n},{\"./util\":74}],67:[function(require,module,exports){\n(function (process,global){\n\"use strict\";\nvar util = require(\"./util\");\nvar schedule;\nvar noAsyncScheduler = function() {\n    throw new Error(\"No async scheduler available\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n};\nvar NativePromise = util.getNativePromise();\nif (util.isNode && typeof MutationObserver === \"undefined\") {\n    var GlobalSetImmediate = global.setImmediate;\n    var ProcessNextTick = process.nextTick;\n    schedule = util.isRecentNode\n                ? function(fn) { GlobalSetImmediate.call(global, fn); }\n                : function(fn) { ProcessNextTick.call(process, fn); };\n} else if (typeof NativePromise === \"function\" &&\n           typeof NativePromise.resolve === \"function\") {\n    var nativePromise = NativePromise.resolve();\n    schedule = function(fn) {\n        nativePromise.then(fn);\n    };\n} else if ((typeof MutationObserver !== \"undefined\") &&\n          !(typeof window !== \"undefined\" &&\n            window.navigator &&\n            (window.navigator.standalone || window.cordova))) {\n    schedule = (function() {\n        var div = document.createElement(\"div\");\n        var opts = {attributes: true};\n        var toggleScheduled = false;\n        var div2 = document.createElement(\"div\");\n        var o2 = new MutationObserver(function() {\n            div.classList.toggle(\"foo\");\n            toggleScheduled = false;\n        });\n        o2.observe(div2, opts);\n\n        var scheduleToggle = function() {\n            if (toggleScheduled) return;\n                toggleScheduled = true;\n                div2.classList.toggle(\"foo\");\n            };\n\n            return function schedule(fn) {\n            var o = new MutationObserver(function() {\n                o.disconnect();\n                fn();\n            });\n            o.observe(div, opts);\n            scheduleToggle();\n        };\n    })();\n} else if (typeof setImmediate !== \"undefined\") {\n    schedule = function (fn) {\n        setImmediate(fn);\n    };\n} else if (typeof setTimeout !== \"undefined\") {\n    schedule = function (fn) {\n        setTimeout(fn, 0);\n    };\n} else {\n    schedule = noAsyncScheduler;\n}\nmodule.exports = schedule;\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./util\":74,\"_process\":138}],68:[function(require,module,exports){\n\"use strict\";\nmodule.exports =\n    function(Promise, PromiseArray, debug) {\nvar PromiseInspection = Promise.PromiseInspection;\nvar util = require(\"./util\");\n\nfunction SettledPromiseArray(values) {\n    this.constructor$(values);\n}\nutil.inherits(SettledPromiseArray, PromiseArray);\n\nSettledPromiseArray.prototype._promiseResolved = function (index, inspection) {\n    this._values[index] = inspection;\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= this._length) {\n        this._resolve(this._values);\n        return true;\n    }\n    return false;\n};\n\nSettledPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    var ret = new PromiseInspection();\n    ret._bitField = 33554432;\n    ret._settledValueField = value;\n    return this._promiseResolved(index, ret);\n};\nSettledPromiseArray.prototype._promiseRejected = function (reason, index) {\n    var ret = new PromiseInspection();\n    ret._bitField = 16777216;\n    ret._settledValueField = reason;\n    return this._promiseResolved(index, ret);\n};\n\nPromise.settle = function (promises) {\n    debug.deprecated(\".settle()\", \".reflect()\");\n    return new SettledPromiseArray(promises).promise();\n};\n\nPromise.prototype.settle = function () {\n    return Promise.settle(this);\n};\n};\n\n},{\"./util\":74}],69:[function(require,module,exports){\n\"use strict\";\nmodule.exports =\nfunction(Promise, PromiseArray, apiRejection) {\nvar util = require(\"./util\");\nvar RangeError = require(\"./errors\").RangeError;\nvar AggregateError = require(\"./errors\").AggregateError;\nvar isArray = util.isArray;\nvar CANCELLATION = {};\n\n\nfunction SomePromiseArray(values) {\n    this.constructor$(values);\n    this._howMany = 0;\n    this._unwrap = false;\n    this._initialized = false;\n}\nutil.inherits(SomePromiseArray, PromiseArray);\n\nSomePromiseArray.prototype._init = function () {\n    if (!this._initialized) {\n        return;\n    }\n    if (this._howMany === 0) {\n        this._resolve([]);\n        return;\n    }\n    this._init$(undefined, -5);\n    var isArrayResolved = isArray(this._values);\n    if (!this._isResolved() &&\n        isArrayResolved &&\n        this._howMany > this._canPossiblyFulfill()) {\n        this._reject(this._getRangeError(this.length()));\n    }\n};\n\nSomePromiseArray.prototype.init = function () {\n    this._initialized = true;\n    this._init();\n};\n\nSomePromiseArray.prototype.setUnwrap = function () {\n    this._unwrap = true;\n};\n\nSomePromiseArray.prototype.howMany = function () {\n    return this._howMany;\n};\n\nSomePromiseArray.prototype.setHowMany = function (count) {\n    this._howMany = count;\n};\n\nSomePromiseArray.prototype._promiseFulfilled = function (value) {\n    this._addFulfilled(value);\n    if (this._fulfilled() === this.howMany()) {\n        this._values.length = this.howMany();\n        if (this.howMany() === 1 && this._unwrap) {\n            this._resolve(this._values[0]);\n        } else {\n            this._resolve(this._values);\n        }\n        return true;\n    }\n    return false;\n\n};\nSomePromiseArray.prototype._promiseRejected = function (reason) {\n    this._addRejected(reason);\n    return this._checkOutcome();\n};\n\nSomePromiseArray.prototype._promiseCancelled = function () {\n    if (this._values instanceof Promise || this._values == null) {\n        return this._cancel();\n    }\n    this._addRejected(CANCELLATION);\n    return this._checkOutcome();\n};\n\nSomePromiseArray.prototype._checkOutcome = function() {\n    if (this.howMany() > this._canPossiblyFulfill()) {\n        var e = new AggregateError();\n        for (var i = this.length(); i < this._values.length; ++i) {\n            if (this._values[i] !== CANCELLATION) {\n                e.push(this._values[i]);\n            }\n        }\n        if (e.length > 0) {\n            this._reject(e);\n        } else {\n            this._cancel();\n        }\n        return true;\n    }\n    return false;\n};\n\nSomePromiseArray.prototype._fulfilled = function () {\n    return this._totalResolved;\n};\n\nSomePromiseArray.prototype._rejected = function () {\n    return this._values.length - this.length();\n};\n\nSomePromiseArray.prototype._addRejected = function (reason) {\n    this._values.push(reason);\n};\n\nSomePromiseArray.prototype._addFulfilled = function (value) {\n    this._values[this._totalResolved++] = value;\n};\n\nSomePromiseArray.prototype._canPossiblyFulfill = function () {\n    return this.length() - this._rejected();\n};\n\nSomePromiseArray.prototype._getRangeError = function (count) {\n    var message = \"Input array must contain at least \" +\n            this._howMany + \" items but contains only \" + count + \" items\";\n    return new RangeError(message);\n};\n\nSomePromiseArray.prototype._resolveEmptyArray = function () {\n    this._reject(this._getRangeError(0));\n};\n\nfunction some(promises, howMany) {\n    if ((howMany | 0) !== howMany || howMany < 0) {\n        return apiRejection(\"expecting a positive integer\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    var ret = new SomePromiseArray(promises);\n    var promise = ret.promise();\n    ret.setHowMany(howMany);\n    ret.init();\n    return promise;\n}\n\nPromise.some = function (promises, howMany) {\n    return some(promises, howMany);\n};\n\nPromise.prototype.some = function (howMany) {\n    return some(this, howMany);\n};\n\nPromise._SomePromiseArray = SomePromiseArray;\n};\n\n},{\"./errors\":50,\"./util\":74}],70:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nfunction PromiseInspection(promise) {\n    if (promise !== undefined) {\n        promise = promise._target();\n        this._bitField = promise._bitField;\n        this._settledValueField = promise._isFateSealed()\n            ? promise._settledValue() : undefined;\n    }\n    else {\n        this._bitField = 0;\n        this._settledValueField = undefined;\n    }\n}\n\nPromiseInspection.prototype._settledValue = function() {\n    return this._settledValueField;\n};\n\nvar value = PromiseInspection.prototype.value = function () {\n    if (!this.isFulfilled()) {\n        throw new TypeError(\"cannot get fulfillment value of a non-fulfilled promise\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    return this._settledValue();\n};\n\nvar reason = PromiseInspection.prototype.error =\nPromiseInspection.prototype.reason = function () {\n    if (!this.isRejected()) {\n        throw new TypeError(\"cannot get rejection reason of a non-rejected promise\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    return this._settledValue();\n};\n\nvar isFulfilled = PromiseInspection.prototype.isFulfilled = function() {\n    return (this._bitField & 33554432) !== 0;\n};\n\nvar isRejected = PromiseInspection.prototype.isRejected = function () {\n    return (this._bitField & 16777216) !== 0;\n};\n\nvar isPending = PromiseInspection.prototype.isPending = function () {\n    return (this._bitField & 50397184) === 0;\n};\n\nvar isResolved = PromiseInspection.prototype.isResolved = function () {\n    return (this._bitField & 50331648) !== 0;\n};\n\nPromiseInspection.prototype.isCancelled = function() {\n    return (this._bitField & 8454144) !== 0;\n};\n\nPromise.prototype.__isCancelled = function() {\n    return (this._bitField & 65536) === 65536;\n};\n\nPromise.prototype._isCancelled = function() {\n    return this._target().__isCancelled();\n};\n\nPromise.prototype.isCancelled = function() {\n    return (this._target()._bitField & 8454144) !== 0;\n};\n\nPromise.prototype.isPending = function() {\n    return isPending.call(this._target());\n};\n\nPromise.prototype.isRejected = function() {\n    return isRejected.call(this._target());\n};\n\nPromise.prototype.isFulfilled = function() {\n    return isFulfilled.call(this._target());\n};\n\nPromise.prototype.isResolved = function() {\n    return isResolved.call(this._target());\n};\n\nPromise.prototype.value = function() {\n    return value.call(this._target());\n};\n\nPromise.prototype.reason = function() {\n    var target = this._target();\n    target._unsetRejectionIsUnhandled();\n    return reason.call(target);\n};\n\nPromise.prototype._value = function() {\n    return this._settledValue();\n};\n\nPromise.prototype._reason = function() {\n    this._unsetRejectionIsUnhandled();\n    return this._settledValue();\n};\n\nPromise.PromiseInspection = PromiseInspection;\n};\n\n},{}],71:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar util = require(\"./util\");\nvar errorObj = util.errorObj;\nvar isObject = util.isObject;\n\nfunction tryConvertToPromise(obj, context) {\n    if (isObject(obj)) {\n        if (obj instanceof Promise) return obj;\n        var then = getThen(obj);\n        if (then === errorObj) {\n            if (context) context._pushContext();\n            var ret = Promise.reject(then.e);\n            if (context) context._popContext();\n            return ret;\n        } else if (typeof then === \"function\") {\n            if (isAnyBluebirdPromise(obj)) {\n                var ret = new Promise(INTERNAL);\n                obj._then(\n                    ret._fulfill,\n                    ret._reject,\n                    undefined,\n                    ret,\n                    null\n                );\n                return ret;\n            }\n            return doThenable(obj, then, context);\n        }\n    }\n    return obj;\n}\n\nfunction doGetThen(obj) {\n    return obj.then;\n}\n\nfunction getThen(obj) {\n    try {\n        return doGetThen(obj);\n    } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n    }\n}\n\nvar hasProp = {}.hasOwnProperty;\nfunction isAnyBluebirdPromise(obj) {\n    try {\n        return hasProp.call(obj, \"_promise0\");\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction doThenable(x, then, context) {\n    var promise = new Promise(INTERNAL);\n    var ret = promise;\n    if (context) context._pushContext();\n    promise._captureStackTrace();\n    if (context) context._popContext();\n    var synchronous = true;\n    var result = util.tryCatch(then).call(x, resolve, reject);\n    synchronous = false;\n\n    if (promise && result === errorObj) {\n        promise._rejectCallback(result.e, true, true);\n        promise = null;\n    }\n\n    function resolve(value) {\n        if (!promise) return;\n        promise._resolveCallback(value);\n        promise = null;\n    }\n\n    function reject(reason) {\n        if (!promise) return;\n        promise._rejectCallback(reason, synchronous, true);\n        promise = null;\n    }\n    return ret;\n}\n\nreturn tryConvertToPromise;\n};\n\n},{\"./util\":74}],72:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL, debug) {\nvar util = require(\"./util\");\nvar TimeoutError = Promise.TimeoutError;\n\nfunction HandleWrapper(handle)  {\n    this.handle = handle;\n}\n\nHandleWrapper.prototype._resultCancelled = function() {\n    clearTimeout(this.handle);\n};\n\nvar afterValue = function(value) { return delay(+this).thenReturn(value); };\nvar delay = Promise.delay = function (ms, value) {\n    var ret;\n    var handle;\n    if (value !== undefined) {\n        ret = Promise.resolve(value)\n                ._then(afterValue, null, null, ms, undefined);\n        if (debug.cancellation() && value instanceof Promise) {\n            ret._setOnCancel(value);\n        }\n    } else {\n        ret = new Promise(INTERNAL);\n        handle = setTimeout(function() { ret._fulfill(); }, +ms);\n        if (debug.cancellation()) {\n            ret._setOnCancel(new HandleWrapper(handle));\n        }\n        ret._captureStackTrace();\n    }\n    ret._setAsyncGuaranteed();\n    return ret;\n};\n\nPromise.prototype.delay = function (ms) {\n    return delay(ms, this);\n};\n\nvar afterTimeout = function (promise, message, parent) {\n    var err;\n    if (typeof message !== \"string\") {\n        if (message instanceof Error) {\n            err = message;\n        } else {\n            err = new TimeoutError(\"operation timed out\");\n        }\n    } else {\n        err = new TimeoutError(message);\n    }\n    util.markAsOriginatingFromRejection(err);\n    promise._attachExtraTrace(err);\n    promise._reject(err);\n\n    if (parent != null) {\n        parent.cancel();\n    }\n};\n\nfunction successClear(value) {\n    clearTimeout(this.handle);\n    return value;\n}\n\nfunction failureClear(reason) {\n    clearTimeout(this.handle);\n    throw reason;\n}\n\nPromise.prototype.timeout = function (ms, message) {\n    ms = +ms;\n    var ret, parent;\n\n    var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() {\n        if (ret.isPending()) {\n            afterTimeout(ret, message, parent);\n        }\n    }, ms));\n\n    if (debug.cancellation()) {\n        parent = this.then();\n        ret = parent._then(successClear, failureClear,\n                            undefined, handleWrapper, undefined);\n        ret._setOnCancel(handleWrapper);\n    } else {\n        ret = this._then(successClear, failureClear,\n                            undefined, handleWrapper, undefined);\n    }\n\n    return ret;\n};\n\n};\n\n},{\"./util\":74}],73:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function (Promise, apiRejection, tryConvertToPromise,\n    createContext, INTERNAL, debug) {\n    var util = require(\"./util\");\n    var TypeError = require(\"./errors\").TypeError;\n    var inherits = require(\"./util\").inherits;\n    var errorObj = util.errorObj;\n    var tryCatch = util.tryCatch;\n    var NULL = {};\n\n    function thrower(e) {\n        setTimeout(function(){throw e;}, 0);\n    }\n\n    function castPreservingDisposable(thenable) {\n        var maybePromise = tryConvertToPromise(thenable);\n        if (maybePromise !== thenable &&\n            typeof thenable._isDisposable === \"function\" &&\n            typeof thenable._getDisposer === \"function\" &&\n            thenable._isDisposable()) {\n            maybePromise._setDisposable(thenable._getDisposer());\n        }\n        return maybePromise;\n    }\n    function dispose(resources, inspection) {\n        var i = 0;\n        var len = resources.length;\n        var ret = new Promise(INTERNAL);\n        function iterator() {\n            if (i >= len) return ret._fulfill();\n            var maybePromise = castPreservingDisposable(resources[i++]);\n            if (maybePromise instanceof Promise &&\n                maybePromise._isDisposable()) {\n                try {\n                    maybePromise = tryConvertToPromise(\n                        maybePromise._getDisposer().tryDispose(inspection),\n                        resources.promise);\n                } catch (e) {\n                    return thrower(e);\n                }\n                if (maybePromise instanceof Promise) {\n                    return maybePromise._then(iterator, thrower,\n                                              null, null, null);\n                }\n            }\n            iterator();\n        }\n        iterator();\n        return ret;\n    }\n\n    function Disposer(data, promise, context) {\n        this._data = data;\n        this._promise = promise;\n        this._context = context;\n    }\n\n    Disposer.prototype.data = function () {\n        return this._data;\n    };\n\n    Disposer.prototype.promise = function () {\n        return this._promise;\n    };\n\n    Disposer.prototype.resource = function () {\n        if (this.promise().isFulfilled()) {\n            return this.promise().value();\n        }\n        return NULL;\n    };\n\n    Disposer.prototype.tryDispose = function(inspection) {\n        var resource = this.resource();\n        var context = this._context;\n        if (context !== undefined) context._pushContext();\n        var ret = resource !== NULL\n            ? this.doDispose(resource, inspection) : null;\n        if (context !== undefined) context._popContext();\n        this._promise._unsetDisposable();\n        this._data = null;\n        return ret;\n    };\n\n    Disposer.isDisposer = function (d) {\n        return (d != null &&\n                typeof d.resource === \"function\" &&\n                typeof d.tryDispose === \"function\");\n    };\n\n    function FunctionDisposer(fn, promise, context) {\n        this.constructor$(fn, promise, context);\n    }\n    inherits(FunctionDisposer, Disposer);\n\n    FunctionDisposer.prototype.doDispose = function (resource, inspection) {\n        var fn = this.data();\n        return fn.call(resource, resource, inspection);\n    };\n\n    function maybeUnwrapDisposer(value) {\n        if (Disposer.isDisposer(value)) {\n            this.resources[this.index]._setDisposable(value);\n            return value.promise();\n        }\n        return value;\n    }\n\n    function ResourceList(length) {\n        this.length = length;\n        this.promise = null;\n        this[length-1] = null;\n    }\n\n    ResourceList.prototype._resultCancelled = function() {\n        var len = this.length;\n        for (var i = 0; i < len; ++i) {\n            var item = this[i];\n            if (item instanceof Promise) {\n                item.cancel();\n            }\n        }\n    };\n\n    Promise.using = function () {\n        var len = arguments.length;\n        if (len < 2) return apiRejection(\n                        \"you must pass at least 2 arguments to Promise.using\");\n        var fn = arguments[len - 1];\n        if (typeof fn !== \"function\") {\n            return apiRejection(\"expecting a function but got \" + util.classString(fn));\n        }\n        var input;\n        var spreadArgs = true;\n        if (len === 2 && Array.isArray(arguments[0])) {\n            input = arguments[0];\n            len = input.length;\n            spreadArgs = false;\n        } else {\n            input = arguments;\n            len--;\n        }\n        var resources = new ResourceList(len);\n        for (var i = 0; i < len; ++i) {\n            var resource = input[i];\n            if (Disposer.isDisposer(resource)) {\n                var disposer = resource;\n                resource = resource.promise();\n                resource._setDisposable(disposer);\n            } else {\n                var maybePromise = tryConvertToPromise(resource);\n                if (maybePromise instanceof Promise) {\n                    resource =\n                        maybePromise._then(maybeUnwrapDisposer, null, null, {\n                            resources: resources,\n                            index: i\n                    }, undefined);\n                }\n            }\n            resources[i] = resource;\n        }\n\n        var reflectedResources = new Array(resources.length);\n        for (var i = 0; i < reflectedResources.length; ++i) {\n            reflectedResources[i] = Promise.resolve(resources[i]).reflect();\n        }\n\n        var resultPromise = Promise.all(reflectedResources)\n            .then(function(inspections) {\n                for (var i = 0; i < inspections.length; ++i) {\n                    var inspection = inspections[i];\n                    if (inspection.isRejected()) {\n                        errorObj.e = inspection.error();\n                        return errorObj;\n                    } else if (!inspection.isFulfilled()) {\n                        resultPromise.cancel();\n                        return;\n                    }\n                    inspections[i] = inspection.value();\n                }\n                promise._pushContext();\n\n                fn = tryCatch(fn);\n                var ret = spreadArgs\n                    ? fn.apply(undefined, inspections) : fn(inspections);\n                var promiseCreated = promise._popContext();\n                debug.checkForgottenReturns(\n                    ret, promiseCreated, \"Promise.using\", promise);\n                return ret;\n            });\n\n        var promise = resultPromise.lastly(function() {\n            var inspection = new Promise.PromiseInspection(resultPromise);\n            return dispose(resources, inspection);\n        });\n        resources.promise = promise;\n        promise._setOnCancel(resources);\n        return promise;\n    };\n\n    Promise.prototype._setDisposable = function (disposer) {\n        this._bitField = this._bitField | 131072;\n        this._disposer = disposer;\n    };\n\n    Promise.prototype._isDisposable = function () {\n        return (this._bitField & 131072) > 0;\n    };\n\n    Promise.prototype._getDisposer = function () {\n        return this._disposer;\n    };\n\n    Promise.prototype._unsetDisposable = function () {\n        this._bitField = this._bitField & (~131072);\n        this._disposer = undefined;\n    };\n\n    Promise.prototype.disposer = function (fn) {\n        if (typeof fn === \"function\") {\n            return new FunctionDisposer(fn, this, createContext());\n        }\n        throw new TypeError();\n    };\n\n};\n\n},{\"./errors\":50,\"./util\":74}],74:[function(require,module,exports){\n(function (process,global){\n\"use strict\";\nvar es5 = require(\"./es5\");\nvar canEvaluate = typeof navigator == \"undefined\";\n\nvar errorObj = {e: {}};\nvar tryCatchTarget;\nvar globalObject = typeof self !== \"undefined\" ? self :\n    typeof window !== \"undefined\" ? window :\n    typeof global !== \"undefined\" ? global :\n    this !== undefined ? this : null;\n\nfunction tryCatcher() {\n    try {\n        var target = tryCatchTarget;\n        tryCatchTarget = null;\n        return target.apply(this, arguments);\n    } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n    }\n}\nfunction tryCatch(fn) {\n    tryCatchTarget = fn;\n    return tryCatcher;\n}\n\nvar inherits = function(Child, Parent) {\n    var hasProp = {}.hasOwnProperty;\n\n    function T() {\n        this.constructor = Child;\n        this.constructor$ = Parent;\n        for (var propertyName in Parent.prototype) {\n            if (hasProp.call(Parent.prototype, propertyName) &&\n                propertyName.charAt(propertyName.length-1) !== \"$\"\n           ) {\n                this[propertyName + \"$\"] = Parent.prototype[propertyName];\n            }\n        }\n    }\n    T.prototype = Parent.prototype;\n    Child.prototype = new T();\n    return Child.prototype;\n};\n\n\nfunction isPrimitive(val) {\n    return val == null || val === true || val === false ||\n        typeof val === \"string\" || typeof val === \"number\";\n\n}\n\nfunction isObject(value) {\n    return typeof value === \"function\" ||\n           typeof value === \"object\" && value !== null;\n}\n\nfunction maybeWrapAsError(maybeError) {\n    if (!isPrimitive(maybeError)) return maybeError;\n\n    return new Error(safeToString(maybeError));\n}\n\nfunction withAppended(target, appendee) {\n    var len = target.length;\n    var ret = new Array(len + 1);\n    var i;\n    for (i = 0; i < len; ++i) {\n        ret[i] = target[i];\n    }\n    ret[i] = appendee;\n    return ret;\n}\n\nfunction getDataPropertyOrDefault(obj, key, defaultValue) {\n    if (es5.isES5) {\n        var desc = Object.getOwnPropertyDescriptor(obj, key);\n\n        if (desc != null) {\n            return desc.get == null && desc.set == null\n                    ? desc.value\n                    : defaultValue;\n        }\n    } else {\n        return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;\n    }\n}\n\nfunction notEnumerableProp(obj, name, value) {\n    if (isPrimitive(obj)) return obj;\n    var descriptor = {\n        value: value,\n        configurable: true,\n        enumerable: false,\n        writable: true\n    };\n    es5.defineProperty(obj, name, descriptor);\n    return obj;\n}\n\nfunction thrower(r) {\n    throw r;\n}\n\nvar inheritedDataKeys = (function() {\n    var excludedPrototypes = [\n        Array.prototype,\n        Object.prototype,\n        Function.prototype\n    ];\n\n    var isExcludedProto = function(val) {\n        for (var i = 0; i < excludedPrototypes.length; ++i) {\n            if (excludedPrototypes[i] === val) {\n                return true;\n            }\n        }\n        return false;\n    };\n\n    if (es5.isES5) {\n        var getKeys = Object.getOwnPropertyNames;\n        return function(obj) {\n            var ret = [];\n            var visitedKeys = Object.create(null);\n            while (obj != null && !isExcludedProto(obj)) {\n                var keys;\n                try {\n                    keys = getKeys(obj);\n                } catch (e) {\n                    return ret;\n                }\n                for (var i = 0; i < keys.length; ++i) {\n                    var key = keys[i];\n                    if (visitedKeys[key]) continue;\n                    visitedKeys[key] = true;\n                    var desc = Object.getOwnPropertyDescriptor(obj, key);\n                    if (desc != null && desc.get == null && desc.set == null) {\n                        ret.push(key);\n                    }\n                }\n                obj = es5.getPrototypeOf(obj);\n            }\n            return ret;\n        };\n    } else {\n        var hasProp = {}.hasOwnProperty;\n        return function(obj) {\n            if (isExcludedProto(obj)) return [];\n            var ret = [];\n\n            /*jshint forin:false */\n            enumeration: for (var key in obj) {\n                if (hasProp.call(obj, key)) {\n                    ret.push(key);\n                } else {\n                    for (var i = 0; i < excludedPrototypes.length; ++i) {\n                        if (hasProp.call(excludedPrototypes[i], key)) {\n                            continue enumeration;\n                        }\n                    }\n                    ret.push(key);\n                }\n            }\n            return ret;\n        };\n    }\n\n})();\n\nvar thisAssignmentPattern = /this\\s*\\.\\s*\\S+\\s*=/;\nfunction isClass(fn) {\n    try {\n        if (typeof fn === \"function\") {\n            var keys = es5.names(fn.prototype);\n\n            var hasMethods = es5.isES5 && keys.length > 1;\n            var hasMethodsOtherThanConstructor = keys.length > 0 &&\n                !(keys.length === 1 && keys[0] === \"constructor\");\n            var hasThisAssignmentAndStaticMethods =\n                thisAssignmentPattern.test(fn + \"\") && es5.names(fn).length > 0;\n\n            if (hasMethods || hasMethodsOtherThanConstructor ||\n                hasThisAssignmentAndStaticMethods) {\n                return true;\n            }\n        }\n        return false;\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction toFastProperties(obj) {\n    /*jshint -W027,-W055,-W031*/\n    function FakeConstructor() {}\n    FakeConstructor.prototype = obj;\n    var l = 8;\n    while (l--) new FakeConstructor();\n    return obj;\n    eval(obj);\n}\n\nvar rident = /^[a-z$_][a-z$_0-9]*$/i;\nfunction isIdentifier(str) {\n    return rident.test(str);\n}\n\nfunction filledRange(count, prefix, suffix) {\n    var ret = new Array(count);\n    for(var i = 0; i < count; ++i) {\n        ret[i] = prefix + i + suffix;\n    }\n    return ret;\n}\n\nfunction safeToString(obj) {\n    try {\n        return obj + \"\";\n    } catch (e) {\n        return \"[no string representation]\";\n    }\n}\n\nfunction isError(obj) {\n    return obj !== null &&\n           typeof obj === \"object\" &&\n           typeof obj.message === \"string\" &&\n           typeof obj.name === \"string\";\n}\n\nfunction markAsOriginatingFromRejection(e) {\n    try {\n        notEnumerableProp(e, \"isOperational\", true);\n    }\n    catch(ignore) {}\n}\n\nfunction originatesFromRejection(e) {\n    if (e == null) return false;\n    return ((e instanceof Error[\"__BluebirdErrorTypes__\"].OperationalError) ||\n        e[\"isOperational\"] === true);\n}\n\nfunction canAttachTrace(obj) {\n    return isError(obj) && es5.propertyIsWritable(obj, \"stack\");\n}\n\nvar ensureErrorObject = (function() {\n    if (!(\"stack\" in new Error())) {\n        return function(value) {\n            if (canAttachTrace(value)) return value;\n            try {throw new Error(safeToString(value));}\n            catch(err) {return err;}\n        };\n    } else {\n        return function(value) {\n            if (canAttachTrace(value)) return value;\n            return new Error(safeToString(value));\n        };\n    }\n})();\n\nfunction classString(obj) {\n    return {}.toString.call(obj);\n}\n\nfunction copyDescriptors(from, to, filter) {\n    var keys = es5.names(from);\n    for (var i = 0; i < keys.length; ++i) {\n        var key = keys[i];\n        if (filter(key)) {\n            try {\n                es5.defineProperty(to, key, es5.getDescriptor(from, key));\n            } catch (ignore) {}\n        }\n    }\n}\n\nvar asArray = function(v) {\n    if (es5.isArray(v)) {\n        return v;\n    }\n    return null;\n};\n\nif (typeof Symbol !== \"undefined\" && Symbol.iterator) {\n    var ArrayFrom = typeof Array.from === \"function\" ? function(v) {\n        return Array.from(v);\n    } : function(v) {\n        var ret = [];\n        var it = v[Symbol.iterator]();\n        var itResult;\n        while (!((itResult = it.next()).done)) {\n            ret.push(itResult.value);\n        }\n        return ret;\n    };\n\n    asArray = function(v) {\n        if (es5.isArray(v)) {\n            return v;\n        } else if (v != null && typeof v[Symbol.iterator] === \"function\") {\n            return ArrayFrom(v);\n        }\n        return null;\n    };\n}\n\nvar isNode = typeof process !== \"undefined\" &&\n        classString(process).toLowerCase() === \"[object process]\";\n\nvar hasEnvVariables = typeof process !== \"undefined\" &&\n    typeof process.env !== \"undefined\";\n\nfunction env(key) {\n    return hasEnvVariables ? process.env[key] : undefined;\n}\n\nfunction getNativePromise() {\n    if (typeof Promise === \"function\") {\n        try {\n            var promise = new Promise(function(){});\n            if ({}.toString.call(promise) === \"[object Promise]\") {\n                return Promise;\n            }\n        } catch (e) {}\n    }\n}\n\nfunction domainBind(self, cb) {\n    return self.bind(cb);\n}\n\nvar ret = {\n    isClass: isClass,\n    isIdentifier: isIdentifier,\n    inheritedDataKeys: inheritedDataKeys,\n    getDataPropertyOrDefault: getDataPropertyOrDefault,\n    thrower: thrower,\n    isArray: es5.isArray,\n    asArray: asArray,\n    notEnumerableProp: notEnumerableProp,\n    isPrimitive: isPrimitive,\n    isObject: isObject,\n    isError: isError,\n    canEvaluate: canEvaluate,\n    errorObj: errorObj,\n    tryCatch: tryCatch,\n    inherits: inherits,\n    withAppended: withAppended,\n    maybeWrapAsError: maybeWrapAsError,\n    toFastProperties: toFastProperties,\n    filledRange: filledRange,\n    toString: safeToString,\n    canAttachTrace: canAttachTrace,\n    ensureErrorObject: ensureErrorObject,\n    originatesFromRejection: originatesFromRejection,\n    markAsOriginatingFromRejection: markAsOriginatingFromRejection,\n    classString: classString,\n    copyDescriptors: copyDescriptors,\n    hasDevTools: typeof chrome !== \"undefined\" && chrome &&\n                 typeof chrome.loadTimes === \"function\",\n    isNode: isNode,\n    hasEnvVariables: hasEnvVariables,\n    env: env,\n    global: globalObject,\n    getNativePromise: getNativePromise,\n    domainBind: domainBind\n};\nret.isRecentNode = ret.isNode && (function() {\n    var version = process.versions.node.split(\".\").map(Number);\n    return (version[0] === 0 && version[1] > 10) || (version[0] > 0);\n})();\n\nif (ret.isNode) ret.toFastProperties(process);\n\ntry {throw new Error(); } catch (e) {ret.lastLineError = e;}\nmodule.exports = ret;\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./es5\":51,\"_process\":138}],75:[function(require,module,exports){\n\n},{}],76:[function(require,module,exports){\n(function (global){\n'use strict';\n\nvar buffer = require('buffer');\nvar Buffer = buffer.Buffer;\nvar SlowBuffer = buffer.SlowBuffer;\nvar MAX_LEN = buffer.kMaxLength || 2147483647;\nexports.alloc = function alloc(size, fill, encoding) {\n  if (typeof Buffer.alloc === 'function') {\n    return Buffer.alloc(size, fill, encoding);\n  }\n  if (typeof encoding === 'number') {\n    throw new TypeError('encoding must not be number');\n  }\n  if (typeof size !== 'number') {\n    throw new TypeError('size must be a number');\n  }\n  if (size > MAX_LEN) {\n    throw new RangeError('size is too large');\n  }\n  var enc = encoding;\n  var _fill = fill;\n  if (_fill === undefined) {\n    enc = undefined;\n    _fill = 0;\n  }\n  var buf = new Buffer(size);\n  if (typeof _fill === 'string') {\n    var fillBuf = new Buffer(_fill, enc);\n    var flen = fillBuf.length;\n    var i = -1;\n    while (++i < size) {\n      buf[i] = fillBuf[i % flen];\n    }\n  } else {\n    buf.fill(_fill);\n  }\n  return buf;\n}\nexports.allocUnsafe = function allocUnsafe(size) {\n  if (typeof Buffer.allocUnsafe === 'function') {\n    return Buffer.allocUnsafe(size);\n  }\n  if (typeof size !== 'number') {\n    throw new TypeError('size must be a number');\n  }\n  if (size > MAX_LEN) {\n    throw new RangeError('size is too large');\n  }\n  return new Buffer(size);\n}\nexports.from = function from(value, encodingOrOffset, length) {\n  if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) {\n    return Buffer.from(value, encodingOrOffset, length);\n  }\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number');\n  }\n  if (typeof value === 'string') {\n    return new Buffer(value, encodingOrOffset);\n  }\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    var offset = encodingOrOffset;\n    if (arguments.length === 1) {\n      return new Buffer(value);\n    }\n    if (typeof offset === 'undefined') {\n      offset = 0;\n    }\n    var len = length;\n    if (typeof len === 'undefined') {\n      len = value.byteLength - offset;\n    }\n    if (offset >= value.byteLength) {\n      throw new RangeError('\\'offset\\' is out of bounds');\n    }\n    if (len > value.byteLength - offset) {\n      throw new RangeError('\\'length\\' is out of bounds');\n    }\n    return new Buffer(value.slice(offset, offset + len));\n  }\n  if (Buffer.isBuffer(value)) {\n    var out = new Buffer(value.length);\n    value.copy(out, 0, 0, value.length);\n    return out;\n  }\n  if (value) {\n    if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) {\n      return new Buffer(value);\n    }\n    if (value.type === 'Buffer' && Array.isArray(value.data)) {\n      return new Buffer(value.data);\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.');\n}\nexports.allocUnsafeSlow = function allocUnsafeSlow(size) {\n  if (typeof Buffer.allocUnsafeSlow === 'function') {\n    return Buffer.allocUnsafeSlow(size);\n  }\n  if (typeof size !== 'number') {\n    throw new TypeError('size must be a number');\n  }\n  if (size >= MAX_LEN) {\n    throw new RangeError('size is too large');\n  }\n  return new SlowBuffer(size);\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"buffer\":77}],77:[function(require,module,exports){\n(function (global){\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *     incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n  ? global.TYPED_ARRAY_SUPPORT\n  : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n    return arr.foo() === 42 && // typed array instances can be augmented\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n}\n\nfunction kMaxLength () {\n  return Buffer.TYPED_ARRAY_SUPPORT\n    ? 0x7fffffff\n    : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n  if (kMaxLength() < length) {\n    throw new RangeError('Invalid typed array length')\n  }\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = new Uint8Array(length)\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    if (that === null) {\n      that = new Buffer(length)\n    }\n    that.length = length\n  }\n\n  return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n    return new Buffer(arg, encodingOrOffset, length)\n  }\n\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new Error(\n        'If encoding is specified then the first argument must be a string'\n      )\n    }\n    return allocUnsafe(this, arg)\n  }\n  return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n  arr.__proto__ = Buffer.prototype\n  return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    return fromArrayBuffer(that, value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(that, value, encodingOrOffset)\n  }\n\n  return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n  Buffer.prototype.__proto__ = Uint8Array.prototype\n  Buffer.__proto__ = Uint8Array\n  if (typeof Symbol !== 'undefined' && Symbol.species &&\n      Buffer[Symbol.species] === Buffer) {\n    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n    Object.defineProperty(Buffer, Symbol.species, {\n      value: null,\n      configurable: true\n    })\n  }\n}\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  } else if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n}\n\nfunction alloc (that, size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(that, size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(that, size).fill(fill, encoding)\n      : createBuffer(that, size).fill(fill)\n  }\n  return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n  assertSize(size)\n  that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < size; ++i) {\n      that[i] = 0\n    }\n  }\n  return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  var length = byteLength(string, encoding) | 0\n  that = createBuffer(that, length)\n\n  var actual = that.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    that = that.slice(0, actual)\n  }\n\n  return that\n}\n\nfunction fromArrayLike (that, array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  that = createBuffer(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n  array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\\'offset\\' is out of bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\\'length\\' is out of bounds')\n  }\n\n  if (byteOffset === undefined && length === undefined) {\n    array = new Uint8Array(array)\n  } else if (length === undefined) {\n    array = new Uint8Array(array, byteOffset)\n  } else {\n    array = new Uint8Array(array, byteOffset, length)\n  }\n\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = array\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that = fromArrayLike(that, array)\n  }\n  return that\n}\n\nfunction fromObject (that, obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    that = createBuffer(that, len)\n\n    if (that.length === 0) {\n      return that\n    }\n\n    obj.copy(that, 0, 0, len)\n    return that\n  }\n\n  if (obj) {\n    if ((typeof ArrayBuffer !== 'undefined' &&\n        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n      if (typeof obj.length !== 'number' || isnan(obj.length)) {\n        return createBuffer(that, 0)\n      }\n      return fromArrayLike(that, obj)\n    }\n\n    if (obj.type === 'Buffer' && isArray(obj.data)) {\n      return fromArrayLike(that, obj.data)\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < kMaxLength()` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= kMaxLength()) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + kMaxLength().toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n      (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    string = '' + string\n  }\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n      case undefined:\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length | 0\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError('Argument must be a Buffer')\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset  // Coerce to Number.\n  if (isNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (Buffer.TYPED_ARRAY_SUPPORT &&\n        typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (isNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset | 0\n    if (isFinite(length)) {\n      length = length | 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  // legacy write(string, encoding, offset, length) - remove in v0.13\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    newBuf = this.subarray(start, end)\n    newBuf.__proto__ = Buffer.prototype\n  } else {\n    var sliceLen = end - start\n    newBuf = new Buffer(sliceLen, undefined)\n    for (var i = 0; i < sliceLen; ++i) {\n      newBuf[i] = this[i + start]\n    }\n  }\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n      (littleEndian ? i : 1 - i) * 8\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffffffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset + 3] = (value >>> 24)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 1] = (value >>> 8)\n    this[offset] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 3] = (value >>> 24)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n    // ascending copy from start\n    for (i = 0; i < len; ++i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, start + len),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if (code < 256) {\n        val = code\n      }\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : utf8ToBytes(new Buffer(val, encoding).toString())\n    var len = bytes.length\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\nfunction isnan (val) {\n  return val !== val // eslint-disable-line no-self-compare\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"base64-js\":39,\"ieee754\":80,\"isarray\":83}],78:[function(require,module,exports){\n(function (Buffer){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\n\nfunction isArray(arg) {\n  if (Array.isArray) {\n    return Array.isArray(arg);\n  }\n  return objectToString(arg) === '[object Array]';\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null ||\n         typeof arg === 'boolean' ||\n         typeof arg === 'number' ||\n         typeof arg === 'string' ||\n         typeof arg === 'symbol' ||  // ES6 symbol\n         typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = Buffer.isBuffer;\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n\n}).call(this,{\"isBuffer\":require(\"../../is-buffer/index.js\")})\n},{\"../../is-buffer/index.js\":82}],79:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n\n  // If there is no 'error' event listener then throw.\n  if (type === 'error') {\n    if (!this._events.error ||\n        (isObject(this._events.error) && !this._events.error.length)) {\n      er = arguments[1];\n      if (er instanceof Error) {\n        throw er; // Unhandled 'error' event\n      } else {\n        // At least give some kind of context to the user\n        var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n        err.context = er;\n        throw err;\n      }\n    }\n  }\n\n  handler = this._events[type];\n\n  if (isUndefined(handler))\n    return false;\n\n  if (isFunction(handler)) {\n    switch (arguments.length) {\n      // fast cases\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      // slower\n      default:\n        args = Array.prototype.slice.call(arguments, 1);\n        handler.apply(this, args);\n    }\n  } else if (isObject(handler)) {\n    args = Array.prototype.slice.call(arguments, 1);\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n\n  // To avoid recursion in the case that type === \"newListener\"! Before\n  // adding it to the listeners, first emit \"newListener\".\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    // Optimize the case of one listener. Don't need the extra array object.\n    this._events[type] = listener;\n  else if (isObject(this._events[type]))\n    // If we've already got an array, just append.\n    this._events[type].push(listener);\n  else\n    // Adding the second element, need to change to array.\n    this._events[type] = [this._events[type], listener];\n\n  // Check for listener leak\n  if (isObject(this._events[type]) && !this._events[type].warned) {\n    if (!isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n      console.error('(node) warning: possible EventEmitter memory ' +\n                    'leak detected. %d listeners added. ' +\n                    'Use emitter.setMaxListeners() to increase limit.',\n                    this._events[type].length);\n      if (typeof console.trace === 'function') {\n        // not supported in IE 10\n        console.trace();\n      }\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n\n  // not listening for removeListener, no need to emit\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n\n  // emit removeListener for all listeners on all events\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else if (listeners) {\n    // LIFO order\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n  if (this._events) {\n    var evlistener = this._events[type];\n\n    if (isFunction(evlistener))\n      return 1;\n    else if (evlistener)\n      return evlistener.length;\n  }\n  return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n\n},{}],80:[function(require,module,exports){\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = nBytes * 8 - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = nBytes * 8 - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = (value * c - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n\n},{}],81:[function(require,module,exports){\nif (typeof Object.create === 'function') {\n  // implementation from standard node.js 'util' module\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  };\n} else {\n  // old school shim for old browsers\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    var TempCtor = function () {}\n    TempCtor.prototype = superCtor.prototype\n    ctor.prototype = new TempCtor()\n    ctor.prototype.constructor = ctor\n  }\n}\n\n},{}],82:[function(require,module,exports){\n/*!\n * Determine if an object is a Buffer\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\n\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nmodule.exports = function (obj) {\n  return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n}\n\nfunction isBuffer (obj) {\n  return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n  return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n}\n\n},{}],83:[function(require,module,exports){\nvar toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n\n},{}],84:[function(require,module,exports){\n'use strict';\n// private property\nvar _keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\n\n// public method for encoding\nexports.encode = function(input, utf8) {\n    var output = \"\";\n    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;\n    var i = 0;\n\n    while (i < input.length) {\n\n        chr1 = input.charCodeAt(i++);\n        chr2 = input.charCodeAt(i++);\n        chr3 = input.charCodeAt(i++);\n\n        enc1 = chr1 >> 2;\n        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n        enc4 = chr3 & 63;\n\n        if (isNaN(chr2)) {\n            enc3 = enc4 = 64;\n        }\n        else if (isNaN(chr3)) {\n            enc4 = 64;\n        }\n\n        output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);\n\n    }\n\n    return output;\n};\n\n// public method for decoding\nexports.decode = function(input, utf8) {\n    var output = \"\";\n    var chr1, chr2, chr3;\n    var enc1, enc2, enc3, enc4;\n    var i = 0;\n\n    input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\n    while (i < input.length) {\n\n        enc1 = _keyStr.indexOf(input.charAt(i++));\n        enc2 = _keyStr.indexOf(input.charAt(i++));\n        enc3 = _keyStr.indexOf(input.charAt(i++));\n        enc4 = _keyStr.indexOf(input.charAt(i++));\n\n        chr1 = (enc1 << 2) | (enc2 >> 4);\n        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n        chr3 = ((enc3 & 3) << 6) | enc4;\n\n        output = output + String.fromCharCode(chr1);\n\n        if (enc3 != 64) {\n            output = output + String.fromCharCode(chr2);\n        }\n        if (enc4 != 64) {\n            output = output + String.fromCharCode(chr3);\n        }\n\n    }\n\n    return output;\n\n};\n\n},{}],85:[function(require,module,exports){\n'use strict';\nfunction CompressedObject() {\n    this.compressedSize = 0;\n    this.uncompressedSize = 0;\n    this.crc32 = 0;\n    this.compressionMethod = null;\n    this.compressedContent = null;\n}\n\nCompressedObject.prototype = {\n    /**\n     * Return the decompressed content in an unspecified format.\n     * The format will depend on the decompressor.\n     * @return {Object} the decompressed content.\n     */\n    getContent: function() {\n        return null; // see implementation\n    },\n    /**\n     * Return the compressed content in an unspecified format.\n     * The format will depend on the compressed conten source.\n     * @return {Object} the compressed content.\n     */\n    getCompressedContent: function() {\n        return null; // see implementation\n    }\n};\nmodule.exports = CompressedObject;\n\n},{}],86:[function(require,module,exports){\n'use strict';\nexports.STORE = {\n    magic: \"\\x00\\x00\",\n    compress: function(content, compressionOptions) {\n        return content; // no compression\n    },\n    uncompress: function(content) {\n        return content; // no compression\n    },\n    compressInputType: null,\n    uncompressInputType: null\n};\nexports.DEFLATE = require('./flate');\n\n},{\"./flate\":91}],87:[function(require,module,exports){\n'use strict';\n\nvar utils = require('./utils');\n\nvar table = [\n    0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,\n    0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,\n    0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,\n    0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,\n    0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,\n    0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,\n    0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,\n    0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,\n    0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,\n    0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,\n    0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,\n    0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,\n    0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,\n    0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,\n    0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,\n    0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,\n    0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,\n    0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,\n    0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,\n    0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,\n    0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,\n    0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,\n    0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,\n    0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,\n    0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,\n    0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,\n    0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,\n    0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,\n    0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,\n    0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,\n    0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,\n    0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,\n    0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,\n    0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,\n    0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,\n    0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,\n    0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,\n    0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,\n    0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,\n    0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,\n    0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,\n    0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,\n    0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,\n    0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,\n    0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,\n    0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,\n    0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,\n    0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,\n    0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,\n    0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,\n    0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,\n    0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,\n    0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,\n    0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,\n    0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,\n    0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,\n    0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,\n    0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,\n    0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,\n    0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,\n    0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,\n    0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,\n    0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,\n    0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D\n];\n\n/**\n *\n *  Javascript crc32\n *  http://www.webtoolkit.info/\n *\n */\nmodule.exports = function crc32(input, crc) {\n    if (typeof input === \"undefined\" || !input.length) {\n        return 0;\n    }\n\n    var isArray = utils.getTypeOf(input) !== \"string\";\n\n    if (typeof(crc) == \"undefined\") {\n        crc = 0;\n    }\n    var x = 0;\n    var y = 0;\n    var b = 0;\n\n    crc = crc ^ (-1);\n    for (var i = 0, iTop = input.length; i < iTop; i++) {\n        b = isArray ? input[i] : input.charCodeAt(i);\n        y = (crc ^ b) & 0xFF;\n        x = table[y];\n        crc = (crc >>> 8) ^ x;\n    }\n\n    return crc ^ (-1);\n};\n// vim: set shiftwidth=4 softtabstop=4:\n\n},{\"./utils\":104}],88:[function(require,module,exports){\n'use strict';\nvar utils = require('./utils');\n\nfunction DataReader(data) {\n    this.data = null; // type : see implementation\n    this.length = 0;\n    this.index = 0;\n}\nDataReader.prototype = {\n    /**\n     * Check that the offset will not go too far.\n     * @param {string} offset the additional offset to check.\n     * @throws {Error} an Error if the offset is out of bounds.\n     */\n    checkOffset: function(offset) {\n        this.checkIndex(this.index + offset);\n    },\n    /**\n     * Check that the specifed index will not be too far.\n     * @param {string} newIndex the index to check.\n     * @throws {Error} an Error if the index is out of bounds.\n     */\n    checkIndex: function(newIndex) {\n        if (this.length < newIndex || newIndex < 0) {\n            throw new Error(\"End of data reached (data length = \" + this.length + \", asked index = \" + (newIndex) + \"). Corrupted zip ?\");\n        }\n    },\n    /**\n     * Change the index.\n     * @param {number} newIndex The new index.\n     * @throws {Error} if the new index is out of the data.\n     */\n    setIndex: function(newIndex) {\n        this.checkIndex(newIndex);\n        this.index = newIndex;\n    },\n    /**\n     * Skip the next n bytes.\n     * @param {number} n the number of bytes to skip.\n     * @throws {Error} if the new index is out of the data.\n     */\n    skip: function(n) {\n        this.setIndex(this.index + n);\n    },\n    /**\n     * Get the byte at the specified index.\n     * @param {number} i the index to use.\n     * @return {number} a byte.\n     */\n    byteAt: function(i) {\n        // see implementations\n    },\n    /**\n     * Get the next number with a given byte size.\n     * @param {number} size the number of bytes to read.\n     * @return {number} the corresponding number.\n     */\n    readInt: function(size) {\n        var result = 0,\n            i;\n        this.checkOffset(size);\n        for (i = this.index + size - 1; i >= this.index; i--) {\n            result = (result << 8) + this.byteAt(i);\n        }\n        this.index += size;\n        return result;\n    },\n    /**\n     * Get the next string with a given byte size.\n     * @param {number} size the number of bytes to read.\n     * @return {string} the corresponding string.\n     */\n    readString: function(size) {\n        return utils.transformTo(\"string\", this.readData(size));\n    },\n    /**\n     * Get raw data without conversion, <size> bytes.\n     * @param {number} size the number of bytes to read.\n     * @return {Object} the raw data, implementation specific.\n     */\n    readData: function(size) {\n        // see implementations\n    },\n    /**\n     * Find the last occurence of a zip signature (4 bytes).\n     * @param {string} sig the signature to find.\n     * @return {number} the index of the last occurence, -1 if not found.\n     */\n    lastIndexOfSignature: function(sig) {\n        // see implementations\n    },\n    /**\n     * Get the next date.\n     * @return {Date} the date.\n     */\n    readDate: function() {\n        var dostime = this.readInt(4);\n        return new Date(\n        ((dostime >> 25) & 0x7f) + 1980, // year\n        ((dostime >> 21) & 0x0f) - 1, // month\n        (dostime >> 16) & 0x1f, // day\n        (dostime >> 11) & 0x1f, // hour\n        (dostime >> 5) & 0x3f, // minute\n        (dostime & 0x1f) << 1); // second\n    }\n};\nmodule.exports = DataReader;\n\n},{\"./utils\":104}],89:[function(require,module,exports){\n'use strict';\nexports.base64 = false;\nexports.binary = false;\nexports.dir = false;\nexports.createFolders = false;\nexports.date = null;\nexports.compression = null;\nexports.compressionOptions = null;\nexports.comment = null;\nexports.unixPermissions = null;\nexports.dosPermissions = null;\n\n},{}],90:[function(require,module,exports){\n'use strict';\nvar utils = require('./utils');\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.string2binary = function(str) {\n    return utils.string2binary(str);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.string2Uint8Array = function(str) {\n    return utils.transformTo(\"uint8array\", str);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.uint8Array2String = function(array) {\n    return utils.transformTo(\"string\", array);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.string2Blob = function(str) {\n    var buffer = utils.transformTo(\"arraybuffer\", str);\n    return utils.arrayBuffer2Blob(buffer);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.arrayBuffer2Blob = function(buffer) {\n    return utils.arrayBuffer2Blob(buffer);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.transformTo = function(outputType, input) {\n    return utils.transformTo(outputType, input);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.getTypeOf = function(input) {\n    return utils.getTypeOf(input);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.checkSupport = function(type) {\n    return utils.checkSupport(type);\n};\n\n/**\n * @deprecated\n * This value will be removed in a future version without replacement.\n */\nexports.MAX_VALUE_16BITS = utils.MAX_VALUE_16BITS;\n\n/**\n * @deprecated\n * This value will be removed in a future version without replacement.\n */\nexports.MAX_VALUE_32BITS = utils.MAX_VALUE_32BITS;\n\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.pretty = function(str) {\n    return utils.pretty(str);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.findCompression = function(compressionMethod) {\n    return utils.findCompression(compressionMethod);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.isRegExp = function (object) {\n    return utils.isRegExp(object);\n};\n\n\n},{\"./utils\":104}],91:[function(require,module,exports){\n'use strict';\nvar USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined');\n\nvar pako = require(\"pako\");\nexports.uncompressInputType = USE_TYPEDARRAY ? \"uint8array\" : \"array\";\nexports.compressInputType = USE_TYPEDARRAY ? \"uint8array\" : \"array\";\n\nexports.magic = \"\\x08\\x00\";\nexports.compress = function(input, compressionOptions) {\n    return pako.deflateRaw(input, {\n        level : compressionOptions.level || -1 // default compression\n    });\n};\nexports.uncompress =  function(input) {\n    return pako.inflateRaw(input);\n};\n\n},{\"pako\":120}],92:[function(require,module,exports){\n'use strict';\n\nvar base64 = require('./base64');\n\n/**\nUsage:\n   zip = new JSZip();\n   zip.file(\"hello.txt\", \"Hello, World!\").file(\"tempfile\", \"nothing\");\n   zip.folder(\"images\").file(\"smile.gif\", base64Data, {base64: true});\n   zip.file(\"Xmas.txt\", \"Ho ho ho !\", {date : new Date(\"December 25, 2007 00:00:01\")});\n   zip.remove(\"tempfile\");\n\n   base64zip = zip.generate();\n\n**/\n\n/**\n * Representation a of zip file in js\n * @constructor\n * @param {String=|ArrayBuffer=|Uint8Array=} data the data to load, if any (optional).\n * @param {Object=} options the options for creating this objects (optional).\n */\nfunction JSZip(data, options) {\n    // if this constructor is used without `new`, it adds `new` before itself:\n    if(!(this instanceof JSZip)) return new JSZip(data, options);\n\n    // object containing the files :\n    // {\n    //   \"folder/\" : {...},\n    //   \"folder/data.txt\" : {...}\n    // }\n    this.files = {};\n\n    this.comment = null;\n\n    // Where we are in the hierarchy\n    this.root = \"\";\n    if (data) {\n        this.load(data, options);\n    }\n    this.clone = function() {\n        var newObj = new JSZip();\n        for (var i in this) {\n            if (typeof this[i] !== \"function\") {\n                newObj[i] = this[i];\n            }\n        }\n        return newObj;\n    };\n}\nJSZip.prototype = require('./object');\nJSZip.prototype.load = require('./load');\nJSZip.support = require('./support');\nJSZip.defaults = require('./defaults');\n\n/**\n * @deprecated\n * This namespace will be removed in a future version without replacement.\n */\nJSZip.utils = require('./deprecatedPublicUtils');\n\nJSZip.base64 = {\n    /**\n     * @deprecated\n     * This method will be removed in a future version without replacement.\n     */\n    encode : function(input) {\n        return base64.encode(input);\n    },\n    /**\n     * @deprecated\n     * This method will be removed in a future version without replacement.\n     */\n    decode : function(input) {\n        return base64.decode(input);\n    }\n};\nJSZip.compressions = require('./compressions');\nmodule.exports = JSZip;\n\n},{\"./base64\":84,\"./compressions\":86,\"./defaults\":89,\"./deprecatedPublicUtils\":90,\"./load\":93,\"./object\":96,\"./support\":100}],93:[function(require,module,exports){\n'use strict';\nvar base64 = require('./base64');\nvar ZipEntries = require('./zipEntries');\nmodule.exports = function(data, options) {\n    var files, zipEntries, i, input;\n    options = options || {};\n    if (options.base64) {\n        data = base64.decode(data);\n    }\n\n    zipEntries = new ZipEntries(data, options);\n    files = zipEntries.files;\n    for (i = 0; i < files.length; i++) {\n        input = files[i];\n        this.file(input.fileName, input.decompressed, {\n            binary: true,\n            optimizedBinaryString: true,\n            date: input.date,\n            dir: input.dir,\n            comment : input.fileComment.length ? input.fileComment : null,\n            unixPermissions : input.unixPermissions,\n            dosPermissions : input.dosPermissions,\n            createFolders: options.createFolders\n        });\n    }\n    if (zipEntries.zipComment.length) {\n        this.comment = zipEntries.zipComment;\n    }\n\n    return this;\n};\n\n},{\"./base64\":84,\"./zipEntries\":105}],94:[function(require,module,exports){\n(function (Buffer){\n'use strict';\nmodule.exports = function(data, encoding){\n    return new Buffer(data, encoding);\n};\nmodule.exports.test = function(b){\n    return Buffer.isBuffer(b);\n};\n\n}).call(this,require(\"buffer\").Buffer)\n},{\"buffer\":77}],95:[function(require,module,exports){\n'use strict';\nvar Uint8ArrayReader = require('./uint8ArrayReader');\n\nfunction NodeBufferReader(data) {\n    this.data = data;\n    this.length = this.data.length;\n    this.index = 0;\n}\nNodeBufferReader.prototype = new Uint8ArrayReader();\n\n/**\n * @see DataReader.readData\n */\nNodeBufferReader.prototype.readData = function(size) {\n    this.checkOffset(size);\n    var result = this.data.slice(this.index, this.index + size);\n    this.index += size;\n    return result;\n};\nmodule.exports = NodeBufferReader;\n\n},{\"./uint8ArrayReader\":101}],96:[function(require,module,exports){\n'use strict';\nvar support = require('./support');\nvar utils = require('./utils');\nvar crc32 = require('./crc32');\nvar signature = require('./signature');\nvar defaults = require('./defaults');\nvar base64 = require('./base64');\nvar compressions = require('./compressions');\nvar CompressedObject = require('./compressedObject');\nvar nodeBuffer = require('./nodeBuffer');\nvar utf8 = require('./utf8');\nvar StringWriter = require('./stringWriter');\nvar Uint8ArrayWriter = require('./uint8ArrayWriter');\n\n/**\n * Returns the raw data of a ZipObject, decompress the content if necessary.\n * @param {ZipObject} file the file to use.\n * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.\n */\nvar getRawData = function(file) {\n    if (file._data instanceof CompressedObject) {\n        file._data = file._data.getContent();\n        file.options.binary = true;\n        file.options.base64 = false;\n\n        if (utils.getTypeOf(file._data) === \"uint8array\") {\n            var copy = file._data;\n            // when reading an arraybuffer, the CompressedObject mechanism will keep it and subarray() a Uint8Array.\n            // if we request a file in the same format, we might get the same Uint8Array or its ArrayBuffer (the original zip file).\n            file._data = new Uint8Array(copy.length);\n            // with an empty Uint8Array, Opera fails with a \"Offset larger than array size\"\n            if (copy.length !== 0) {\n                file._data.set(copy, 0);\n            }\n        }\n    }\n    return file._data;\n};\n\n/**\n * Returns the data of a ZipObject in a binary form. If the content is an unicode string, encode it.\n * @param {ZipObject} file the file to use.\n * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.\n */\nvar getBinaryData = function(file) {\n    var result = getRawData(file),\n        type = utils.getTypeOf(result);\n    if (type === \"string\") {\n        if (!file.options.binary) {\n            // unicode text !\n            // unicode string => binary string is a painful process, check if we can avoid it.\n            if (support.nodebuffer) {\n                return nodeBuffer(result, \"utf-8\");\n            }\n        }\n        return file.asBinary();\n    }\n    return result;\n};\n\n/**\n * Transform this._data into a string.\n * @param {function} filter a function String -> String, applied if not null on the result.\n * @return {String} the string representing this._data.\n */\nvar dataToString = function(asUTF8) {\n    var result = getRawData(this);\n    if (result === null || typeof result === \"undefined\") {\n        return \"\";\n    }\n    // if the data is a base64 string, we decode it before checking the encoding !\n    if (this.options.base64) {\n        result = base64.decode(result);\n    }\n    if (asUTF8 && this.options.binary) {\n        // JSZip.prototype.utf8decode supports arrays as input\n        // skip to array => string step, utf8decode will do it.\n        result = out.utf8decode(result);\n    }\n    else {\n        // no utf8 transformation, do the array => string step.\n        result = utils.transformTo(\"string\", result);\n    }\n\n    if (!asUTF8 && !this.options.binary) {\n        result = utils.transformTo(\"string\", out.utf8encode(result));\n    }\n    return result;\n};\n/**\n * A simple object representing a file in the zip file.\n * @constructor\n * @param {string} name the name of the file\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data\n * @param {Object} options the options of the file\n */\nvar ZipObject = function(name, data, options) {\n    this.name = name;\n    this.dir = options.dir;\n    this.date = options.date;\n    this.comment = options.comment;\n    this.unixPermissions = options.unixPermissions;\n    this.dosPermissions = options.dosPermissions;\n\n    this._data = data;\n    this.options = options;\n\n    /*\n     * This object contains initial values for dir and date.\n     * With them, we can check if the user changed the deprecated metadata in\n     * `ZipObject#options` or not.\n     */\n    this._initialMetadata = {\n      dir : options.dir,\n      date : options.date\n    };\n};\n\nZipObject.prototype = {\n    /**\n     * Return the content as UTF8 string.\n     * @return {string} the UTF8 string.\n     */\n    asText: function() {\n        return dataToString.call(this, true);\n    },\n    /**\n     * Returns the binary content.\n     * @return {string} the content as binary.\n     */\n    asBinary: function() {\n        return dataToString.call(this, false);\n    },\n    /**\n     * Returns the content as a nodejs Buffer.\n     * @return {Buffer} the content as a Buffer.\n     */\n    asNodeBuffer: function() {\n        var result = getBinaryData(this);\n        return utils.transformTo(\"nodebuffer\", result);\n    },\n    /**\n     * Returns the content as an Uint8Array.\n     * @return {Uint8Array} the content as an Uint8Array.\n     */\n    asUint8Array: function() {\n        var result = getBinaryData(this);\n        return utils.transformTo(\"uint8array\", result);\n    },\n    /**\n     * Returns the content as an ArrayBuffer.\n     * @return {ArrayBuffer} the content as an ArrayBufer.\n     */\n    asArrayBuffer: function() {\n        return this.asUint8Array().buffer;\n    }\n};\n\n/**\n * Transform an integer into a string in hexadecimal.\n * @private\n * @param {number} dec the number to convert.\n * @param {number} bytes the number of bytes to generate.\n * @returns {string} the result.\n */\nvar decToHex = function(dec, bytes) {\n    var hex = \"\",\n        i;\n    for (i = 0; i < bytes; i++) {\n        hex += String.fromCharCode(dec & 0xff);\n        dec = dec >>> 8;\n    }\n    return hex;\n};\n\n/**\n * Merge the objects passed as parameters into a new one.\n * @private\n * @param {...Object} var_args All objects to merge.\n * @return {Object} a new object with the data of the others.\n */\nvar extend = function() {\n    var result = {}, i, attr;\n    for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers\n        for (attr in arguments[i]) {\n            if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === \"undefined\") {\n                result[attr] = arguments[i][attr];\n            }\n        }\n    }\n    return result;\n};\n\n/**\n * Transforms the (incomplete) options from the user into the complete\n * set of options to create a file.\n * @private\n * @param {Object} o the options from the user.\n * @return {Object} the complete set of options.\n */\nvar prepareFileAttrs = function(o) {\n    o = o || {};\n    if (o.base64 === true && (o.binary === null || o.binary === undefined)) {\n        o.binary = true;\n    }\n    o = extend(o, defaults);\n    o.date = o.date || new Date();\n    if (o.compression !== null) o.compression = o.compression.toUpperCase();\n\n    return o;\n};\n\n/**\n * Add a file in the current folder.\n * @private\n * @param {string} name the name of the file\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file\n * @param {Object} o the options of the file\n * @return {Object} the new file.\n */\nvar fileAdd = function(name, data, o) {\n    // be sure sub folders exist\n    var dataType = utils.getTypeOf(data),\n        parent;\n\n    o = prepareFileAttrs(o);\n\n    if (typeof o.unixPermissions === \"string\") {\n        o.unixPermissions = parseInt(o.unixPermissions, 8);\n    }\n\n    // UNX_IFDIR  0040000 see zipinfo.c\n    if (o.unixPermissions && (o.unixPermissions & 0x4000)) {\n        o.dir = true;\n    }\n    // Bit 4    Directory\n    if (o.dosPermissions && (o.dosPermissions & 0x0010)) {\n        o.dir = true;\n    }\n\n    if (o.dir) {\n        name = forceTrailingSlash(name);\n    }\n\n    if (o.createFolders && (parent = parentFolder(name))) {\n        folderAdd.call(this, parent, true);\n    }\n\n    if (o.dir || data === null || typeof data === \"undefined\") {\n        o.base64 = false;\n        o.binary = false;\n        data = null;\n        dataType = null;\n    }\n    else if (dataType === \"string\") {\n        if (o.binary && !o.base64) {\n            // optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask\n            if (o.optimizedBinaryString !== true) {\n                // this is a string, not in a base64 format.\n                // Be sure that this is a correct \"binary string\"\n                data = utils.string2binary(data);\n            }\n        }\n    }\n    else { // arraybuffer, uint8array, ...\n        o.base64 = false;\n        o.binary = true;\n\n        if (!dataType && !(data instanceof CompressedObject)) {\n            throw new Error(\"The data of '\" + name + \"' is in an unsupported format !\");\n        }\n\n        // special case : it's way easier to work with Uint8Array than with ArrayBuffer\n        if (dataType === \"arraybuffer\") {\n            data = utils.transformTo(\"uint8array\", data);\n        }\n    }\n\n    var object = new ZipObject(name, data, o);\n    this.files[name] = object;\n    return object;\n};\n\n/**\n * Find the parent folder of the path.\n * @private\n * @param {string} path the path to use\n * @return {string} the parent folder, or \"\"\n */\nvar parentFolder = function (path) {\n    if (path.slice(-1) == '/') {\n        path = path.substring(0, path.length - 1);\n    }\n    var lastSlash = path.lastIndexOf('/');\n    return (lastSlash > 0) ? path.substring(0, lastSlash) : \"\";\n};\n\n\n/**\n * Returns the path with a slash at the end.\n * @private\n * @param {String} path the path to check.\n * @return {String} the path with a trailing slash.\n */\nvar forceTrailingSlash = function(path) {\n    // Check the name ends with a /\n    if (path.slice(-1) != \"/\") {\n        path += \"/\"; // IE doesn't like substr(-1)\n    }\n    return path;\n};\n/**\n * Add a (sub) folder in the current folder.\n * @private\n * @param {string} name the folder's name\n * @param {boolean=} [createFolders] If true, automatically create sub\n *  folders. Defaults to false.\n * @return {Object} the new folder.\n */\nvar folderAdd = function(name, createFolders) {\n    createFolders = (typeof createFolders !== 'undefined') ? createFolders : false;\n\n    name = forceTrailingSlash(name);\n\n    // Does this folder already exist?\n    if (!this.files[name]) {\n        fileAdd.call(this, name, null, {\n            dir: true,\n            createFolders: createFolders\n        });\n    }\n    return this.files[name];\n};\n\n/**\n * Generate a JSZip.CompressedObject for a given zipOject.\n * @param {ZipObject} file the object to read.\n * @param {JSZip.compression} compression the compression to use.\n * @param {Object} compressionOptions the options to use when compressing.\n * @return {JSZip.CompressedObject} the compressed result.\n */\nvar generateCompressedObjectFrom = function(file, compression, compressionOptions) {\n    var result = new CompressedObject(),\n        content;\n\n    // the data has not been decompressed, we might reuse things !\n    if (file._data instanceof CompressedObject) {\n        result.uncompressedSize = file._data.uncompressedSize;\n        result.crc32 = file._data.crc32;\n\n        if (result.uncompressedSize === 0 || file.dir) {\n            compression = compressions['STORE'];\n            result.compressedContent = \"\";\n            result.crc32 = 0;\n        }\n        else if (file._data.compressionMethod === compression.magic) {\n            result.compressedContent = file._data.getCompressedContent();\n        }\n        else {\n            content = file._data.getContent();\n            // need to decompress / recompress\n            result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions);\n        }\n    }\n    else {\n        // have uncompressed data\n        content = getBinaryData(file);\n        if (!content || content.length === 0 || file.dir) {\n            compression = compressions['STORE'];\n            content = \"\";\n        }\n        result.uncompressedSize = content.length;\n        result.crc32 = crc32(content);\n        result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions);\n    }\n\n    result.compressedSize = result.compressedContent.length;\n    result.compressionMethod = compression.magic;\n\n    return result;\n};\n\n\n\n\n/**\n * Generate the UNIX part of the external file attributes.\n * @param {Object} unixPermissions the unix permissions or null.\n * @param {Boolean} isDir true if the entry is a directory, false otherwise.\n * @return {Number} a 32 bit integer.\n *\n * adapted from http://unix.stackexchange.com/questions/14705/the-zip-formats-external-file-attribute :\n *\n * TTTTsstrwxrwxrwx0000000000ADVSHR\n * ^^^^____________________________ file type, see zipinfo.c (UNX_*)\n *     ^^^_________________________ setuid, setgid, sticky\n *        ^^^^^^^^^________________ permissions\n *                 ^^^^^^^^^^______ not used ?\n *                           ^^^^^^ DOS attribute bits : Archive, Directory, Volume label, System file, Hidden, Read only\n */\nvar generateUnixExternalFileAttr = function (unixPermissions, isDir) {\n\n    var result = unixPermissions;\n    if (!unixPermissions) {\n        // I can't use octal values in strict mode, hence the hexa.\n        //  040775 => 0x41fd\n        // 0100664 => 0x81b4\n        result = isDir ? 0x41fd : 0x81b4;\n    }\n\n    return (result & 0xFFFF) << 16;\n};\n\n/**\n * Generate the DOS part of the external file attributes.\n * @param {Object} dosPermissions the dos permissions or null.\n * @param {Boolean} isDir true if the entry is a directory, false otherwise.\n * @return {Number} a 32 bit integer.\n *\n * Bit 0     Read-Only\n * Bit 1     Hidden\n * Bit 2     System\n * Bit 3     Volume Label\n * Bit 4     Directory\n * Bit 5     Archive\n */\nvar generateDosExternalFileAttr = function (dosPermissions, isDir) {\n\n    // the dir flag is already set for compatibility\n\n    return (dosPermissions || 0)  & 0x3F;\n};\n\n/**\n * Generate the various parts used in the construction of the final zip file.\n * @param {string} name the file name.\n * @param {ZipObject} file the file content.\n * @param {JSZip.CompressedObject} compressedObject the compressed object.\n * @param {number} offset the current offset from the start of the zip file.\n * @param {String} platform let's pretend we are this platform (change platform dependents fields)\n * @return {object} the zip parts.\n */\nvar generateZipParts = function(name, file, compressedObject, offset, platform) {\n    var data = compressedObject.compressedContent,\n        utfEncodedFileName = utils.transformTo(\"string\", utf8.utf8encode(file.name)),\n        comment = file.comment || \"\",\n        utfEncodedComment = utils.transformTo(\"string\", utf8.utf8encode(comment)),\n        useUTF8ForFileName = utfEncodedFileName.length !== file.name.length,\n        useUTF8ForComment = utfEncodedComment.length !== comment.length,\n        o = file.options,\n        dosTime,\n        dosDate,\n        extraFields = \"\",\n        unicodePathExtraField = \"\",\n        unicodeCommentExtraField = \"\",\n        dir, date;\n\n\n    // handle the deprecated options.dir\n    if (file._initialMetadata.dir !== file.dir) {\n        dir = file.dir;\n    } else {\n        dir = o.dir;\n    }\n\n    // handle the deprecated options.date\n    if(file._initialMetadata.date !== file.date) {\n        date = file.date;\n    } else {\n        date = o.date;\n    }\n\n    var extFileAttr = 0;\n    var versionMadeBy = 0;\n    if (dir) {\n        // dos or unix, we set the dos dir flag\n        extFileAttr |= 0x00010;\n    }\n    if(platform === \"UNIX\") {\n        versionMadeBy = 0x031E; // UNIX, version 3.0\n        extFileAttr |= generateUnixExternalFileAttr(file.unixPermissions, dir);\n    } else { // DOS or other, fallback to DOS\n        versionMadeBy = 0x0014; // DOS, version 2.0\n        extFileAttr |= generateDosExternalFileAttr(file.dosPermissions, dir);\n    }\n\n    // date\n    // @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html\n    // @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html\n    // @see http://www.delorie.com/djgpp/doc/rbinter/it/66/16.html\n\n    dosTime = date.getHours();\n    dosTime = dosTime << 6;\n    dosTime = dosTime | date.getMinutes();\n    dosTime = dosTime << 5;\n    dosTime = dosTime | date.getSeconds() / 2;\n\n    dosDate = date.getFullYear() - 1980;\n    dosDate = dosDate << 4;\n    dosDate = dosDate | (date.getMonth() + 1);\n    dosDate = dosDate << 5;\n    dosDate = dosDate | date.getDate();\n\n    if (useUTF8ForFileName) {\n        // set the unicode path extra field. unzip needs at least one extra\n        // field to correctly handle unicode path, so using the path is as good\n        // as any other information. This could improve the situation with\n        // other archive managers too.\n        // This field is usually used without the utf8 flag, with a non\n        // unicode path in the header (winrar, winzip). This helps (a bit)\n        // with the messy Windows' default compressed folders feature but\n        // breaks on p7zip which doesn't seek the unicode path extra field.\n        // So for now, UTF-8 everywhere !\n        unicodePathExtraField =\n            // Version\n            decToHex(1, 1) +\n            // NameCRC32\n            decToHex(crc32(utfEncodedFileName), 4) +\n            // UnicodeName\n            utfEncodedFileName;\n\n        extraFields +=\n            // Info-ZIP Unicode Path Extra Field\n            \"\\x75\\x70\" +\n            // size\n            decToHex(unicodePathExtraField.length, 2) +\n            // content\n            unicodePathExtraField;\n    }\n\n    if(useUTF8ForComment) {\n\n        unicodeCommentExtraField =\n            // Version\n            decToHex(1, 1) +\n            // CommentCRC32\n            decToHex(this.crc32(utfEncodedComment), 4) +\n            // UnicodeName\n            utfEncodedComment;\n\n        extraFields +=\n            // Info-ZIP Unicode Path Extra Field\n            \"\\x75\\x63\" +\n            // size\n            decToHex(unicodeCommentExtraField.length, 2) +\n            // content\n            unicodeCommentExtraField;\n    }\n\n    var header = \"\";\n\n    // version needed to extract\n    header += \"\\x0A\\x00\";\n    // general purpose bit flag\n    // set bit 11 if utf8\n    header += (useUTF8ForFileName || useUTF8ForComment) ? \"\\x00\\x08\" : \"\\x00\\x00\";\n    // compression method\n    header += compressedObject.compressionMethod;\n    // last mod file time\n    header += decToHex(dosTime, 2);\n    // last mod file date\n    header += decToHex(dosDate, 2);\n    // crc-32\n    header += decToHex(compressedObject.crc32, 4);\n    // compressed size\n    header += decToHex(compressedObject.compressedSize, 4);\n    // uncompressed size\n    header += decToHex(compressedObject.uncompressedSize, 4);\n    // file name length\n    header += decToHex(utfEncodedFileName.length, 2);\n    // extra field length\n    header += decToHex(extraFields.length, 2);\n\n\n    var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName + extraFields;\n\n    var dirRecord = signature.CENTRAL_FILE_HEADER +\n    // version made by (00: DOS)\n    decToHex(versionMadeBy, 2) +\n    // file header (common to file and central directory)\n    header +\n    // file comment length\n    decToHex(utfEncodedComment.length, 2) +\n    // disk number start\n    \"\\x00\\x00\" +\n    // internal file attributes TODO\n    \"\\x00\\x00\" +\n    // external file attributes\n    decToHex(extFileAttr, 4) +\n    // relative offset of local header\n    decToHex(offset, 4) +\n    // file name\n    utfEncodedFileName +\n    // extra field\n    extraFields +\n    // file comment\n    utfEncodedComment;\n\n    return {\n        fileRecord: fileRecord,\n        dirRecord: dirRecord,\n        compressedObject: compressedObject\n    };\n};\n\n\n// return the actual prototype of JSZip\nvar out = {\n    /**\n     * Read an existing zip and merge the data in the current JSZip object.\n     * The implementation is in jszip-load.js, don't forget to include it.\n     * @param {String|ArrayBuffer|Uint8Array|Buffer} stream  The stream to load\n     * @param {Object} options Options for loading the stream.\n     *  options.base64 : is the stream in base64 ? default : false\n     * @return {JSZip} the current JSZip object\n     */\n    load: function(stream, options) {\n        throw new Error(\"Load method is not defined. Is the file jszip-load.js included ?\");\n    },\n\n    /**\n     * Filter nested files/folders with the specified function.\n     * @param {Function} search the predicate to use :\n     * function (relativePath, file) {...}\n     * It takes 2 arguments : the relative path and the file.\n     * @return {Array} An array of matching elements.\n     */\n    filter: function(search) {\n        var result = [],\n            filename, relativePath, file, fileClone;\n        for (filename in this.files) {\n            if (!this.files.hasOwnProperty(filename)) {\n                continue;\n            }\n            file = this.files[filename];\n            // return a new object, don't let the user mess with our internal objects :)\n            fileClone = new ZipObject(file.name, file._data, extend(file.options));\n            relativePath = filename.slice(this.root.length, filename.length);\n            if (filename.slice(0, this.root.length) === this.root && // the file is in the current root\n            search(relativePath, fileClone)) { // and the file matches the function\n                result.push(fileClone);\n            }\n        }\n        return result;\n    },\n\n    /**\n     * Add a file to the zip file, or search a file.\n     * @param   {string|RegExp} name The name of the file to add (if data is defined),\n     * the name of the file to find (if no data) or a regex to match files.\n     * @param   {String|ArrayBuffer|Uint8Array|Buffer} data  The file data, either raw or base64 encoded\n     * @param   {Object} o     File options\n     * @return  {JSZip|Object|Array} this JSZip object (when adding a file),\n     * a file (when searching by string) or an array of files (when searching by regex).\n     */\n    file: function(name, data, o) {\n        if (arguments.length === 1) {\n            if (utils.isRegExp(name)) {\n                var regexp = name;\n                return this.filter(function(relativePath, file) {\n                    return !file.dir && regexp.test(relativePath);\n                });\n            }\n            else { // text\n                return this.filter(function(relativePath, file) {\n                    return !file.dir && relativePath === name;\n                })[0] || null;\n            }\n        }\n        else { // more than one argument : we have data !\n            name = this.root + name;\n            fileAdd.call(this, name, data, o);\n        }\n        return this;\n    },\n\n    /**\n     * Add a directory to the zip file, or search.\n     * @param   {String|RegExp} arg The name of the directory to add, or a regex to search folders.\n     * @return  {JSZip} an object with the new directory as the root, or an array containing matching folders.\n     */\n    folder: function(arg) {\n        if (!arg) {\n            return this;\n        }\n\n        if (utils.isRegExp(arg)) {\n            return this.filter(function(relativePath, file) {\n                return file.dir && arg.test(relativePath);\n            });\n        }\n\n        // else, name is a new folder\n        var name = this.root + arg;\n        var newFolder = folderAdd.call(this, name);\n\n        // Allow chaining by returning a new object with this folder as the root\n        var ret = this.clone();\n        ret.root = newFolder.name;\n        return ret;\n    },\n\n    /**\n     * Delete a file, or a directory and all sub-files, from the zip\n     * @param {string} name the name of the file to delete\n     * @return {JSZip} this JSZip object\n     */\n    remove: function(name) {\n        name = this.root + name;\n        var file = this.files[name];\n        if (!file) {\n            // Look for any folders\n            if (name.slice(-1) != \"/\") {\n                name += \"/\";\n            }\n            file = this.files[name];\n        }\n\n        if (file && !file.dir) {\n            // file\n            delete this.files[name];\n        } else {\n            // maybe a folder, delete recursively\n            var kids = this.filter(function(relativePath, file) {\n                return file.name.slice(0, name.length) === name;\n            });\n            for (var i = 0; i < kids.length; i++) {\n                delete this.files[kids[i].name];\n            }\n        }\n\n        return this;\n    },\n\n    /**\n     * Generate the complete zip file\n     * @param {Object} options the options to generate the zip file :\n     * - base64, (deprecated, use type instead) true to generate base64.\n     * - compression, \"STORE\" by default.\n     * - type, \"base64\" by default. Values are : string, base64, uint8array, arraybuffer, blob.\n     * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file\n     */\n    generate: function(options) {\n        options = extend(options || {}, {\n            base64: true,\n            compression: \"STORE\",\n            compressionOptions : null,\n            type: \"base64\",\n            platform: \"DOS\",\n            comment: null,\n            mimeType: 'application/zip'\n        });\n\n        utils.checkSupport(options.type);\n\n        // accept nodejs `process.platform`\n        if(\n          options.platform === 'darwin' ||\n          options.platform === 'freebsd' ||\n          options.platform === 'linux' ||\n          options.platform === 'sunos'\n        ) {\n          options.platform = \"UNIX\";\n        }\n        if (options.platform === 'win32') {\n          options.platform = \"DOS\";\n        }\n\n        var zipData = [],\n            localDirLength = 0,\n            centralDirLength = 0,\n            writer, i,\n            utfEncodedComment = utils.transformTo(\"string\", this.utf8encode(options.comment || this.comment || \"\"));\n\n        // first, generate all the zip parts.\n        for (var name in this.files) {\n            if (!this.files.hasOwnProperty(name)) {\n                continue;\n            }\n            var file = this.files[name];\n\n            var compressionName = file.options.compression || options.compression.toUpperCase();\n            var compression = compressions[compressionName];\n            if (!compression) {\n                throw new Error(compressionName + \" is not a valid compression method !\");\n            }\n            var compressionOptions = file.options.compressionOptions || options.compressionOptions || {};\n\n            var compressedObject = generateCompressedObjectFrom.call(this, file, compression, compressionOptions);\n\n            var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength, options.platform);\n            localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize;\n            centralDirLength += zipPart.dirRecord.length;\n            zipData.push(zipPart);\n        }\n\n        var dirEnd = \"\";\n\n        // end of central dir signature\n        dirEnd = signature.CENTRAL_DIRECTORY_END +\n        // number of this disk\n        \"\\x00\\x00\" +\n        // number of the disk with the start of the central directory\n        \"\\x00\\x00\" +\n        // total number of entries in the central directory on this disk\n        decToHex(zipData.length, 2) +\n        // total number of entries in the central directory\n        decToHex(zipData.length, 2) +\n        // size of the central directory   4 bytes\n        decToHex(centralDirLength, 4) +\n        // offset of start of central directory with respect to the starting disk number\n        decToHex(localDirLength, 4) +\n        // .ZIP file comment length\n        decToHex(utfEncodedComment.length, 2) +\n        // .ZIP file comment\n        utfEncodedComment;\n\n\n        // we have all the parts (and the total length)\n        // time to create a writer !\n        var typeName = options.type.toLowerCase();\n        if(typeName===\"uint8array\"||typeName===\"arraybuffer\"||typeName===\"blob\"||typeName===\"nodebuffer\") {\n            writer = new Uint8ArrayWriter(localDirLength + centralDirLength + dirEnd.length);\n        }else{\n            writer = new StringWriter(localDirLength + centralDirLength + dirEnd.length);\n        }\n\n        for (i = 0; i < zipData.length; i++) {\n            writer.append(zipData[i].fileRecord);\n            writer.append(zipData[i].compressedObject.compressedContent);\n        }\n        for (i = 0; i < zipData.length; i++) {\n            writer.append(zipData[i].dirRecord);\n        }\n\n        writer.append(dirEnd);\n\n        var zip = writer.finalize();\n\n\n\n        switch(options.type.toLowerCase()) {\n            // case \"zip is an Uint8Array\"\n            case \"uint8array\" :\n            case \"arraybuffer\" :\n            case \"nodebuffer\" :\n               return utils.transformTo(options.type.toLowerCase(), zip);\n            case \"blob\" :\n               return utils.arrayBuffer2Blob(utils.transformTo(\"arraybuffer\", zip), options.mimeType);\n            // case \"zip is a string\"\n            case \"base64\" :\n               return (options.base64) ? base64.encode(zip) : zip;\n            default : // case \"string\" :\n               return zip;\n         }\n\n    },\n\n    /**\n     * @deprecated\n     * This method will be removed in a future version without replacement.\n     */\n    crc32: function (input, crc) {\n        return crc32(input, crc);\n    },\n\n    /**\n     * @deprecated\n     * This method will be removed in a future version without replacement.\n     */\n    utf8encode: function (string) {\n        return utils.transformTo(\"string\", utf8.utf8encode(string));\n    },\n\n    /**\n     * @deprecated\n     * This method will be removed in a future version without replacement.\n     */\n    utf8decode: function (input) {\n        return utf8.utf8decode(input);\n    }\n};\nmodule.exports = out;\n\n},{\"./base64\":84,\"./compressedObject\":85,\"./compressions\":86,\"./crc32\":87,\"./defaults\":89,\"./nodeBuffer\":94,\"./signature\":97,\"./stringWriter\":99,\"./support\":100,\"./uint8ArrayWriter\":102,\"./utf8\":103,\"./utils\":104}],97:[function(require,module,exports){\n'use strict';\nexports.LOCAL_FILE_HEADER = \"PK\\x03\\x04\";\nexports.CENTRAL_FILE_HEADER = \"PK\\x01\\x02\";\nexports.CENTRAL_DIRECTORY_END = \"PK\\x05\\x06\";\nexports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = \"PK\\x06\\x07\";\nexports.ZIP64_CENTRAL_DIRECTORY_END = \"PK\\x06\\x06\";\nexports.DATA_DESCRIPTOR = \"PK\\x07\\x08\";\n\n},{}],98:[function(require,module,exports){\n'use strict';\nvar DataReader = require('./dataReader');\nvar utils = require('./utils');\n\nfunction StringReader(data, optimizedBinaryString) {\n    this.data = data;\n    if (!optimizedBinaryString) {\n        this.data = utils.string2binary(this.data);\n    }\n    this.length = this.data.length;\n    this.index = 0;\n}\nStringReader.prototype = new DataReader();\n/**\n * @see DataReader.byteAt\n */\nStringReader.prototype.byteAt = function(i) {\n    return this.data.charCodeAt(i);\n};\n/**\n * @see DataReader.lastIndexOfSignature\n */\nStringReader.prototype.lastIndexOfSignature = function(sig) {\n    return this.data.lastIndexOf(sig);\n};\n/**\n * @see DataReader.readData\n */\nStringReader.prototype.readData = function(size) {\n    this.checkOffset(size);\n    // this will work because the constructor applied the \"& 0xff\" mask.\n    var result = this.data.slice(this.index, this.index + size);\n    this.index += size;\n    return result;\n};\nmodule.exports = StringReader;\n\n},{\"./dataReader\":88,\"./utils\":104}],99:[function(require,module,exports){\n'use strict';\n\nvar utils = require('./utils');\n\n/**\n * An object to write any content to a string.\n * @constructor\n */\nvar StringWriter = function() {\n    this.data = [];\n};\nStringWriter.prototype = {\n    /**\n     * Append any content to the current string.\n     * @param {Object} input the content to add.\n     */\n    append: function(input) {\n        input = utils.transformTo(\"string\", input);\n        this.data.push(input);\n    },\n    /**\n     * Finalize the construction an return the result.\n     * @return {string} the generated string.\n     */\n    finalize: function() {\n        return this.data.join(\"\");\n    }\n};\n\nmodule.exports = StringWriter;\n\n},{\"./utils\":104}],100:[function(require,module,exports){\n(function (Buffer){\n'use strict';\nexports.base64 = true;\nexports.array = true;\nexports.string = true;\nexports.arraybuffer = typeof ArrayBuffer !== \"undefined\" && typeof Uint8Array !== \"undefined\";\n// contains true if JSZip can read/generate nodejs Buffer, false otherwise.\n// Browserify will provide a Buffer implementation for browsers, which is\n// an augmented Uint8Array (i.e., can be used as either Buffer or U8).\nexports.nodebuffer = typeof Buffer !== \"undefined\";\n// contains true if JSZip can read/generate Uint8Array, false otherwise.\nexports.uint8array = typeof Uint8Array !== \"undefined\";\n\nif (typeof ArrayBuffer === \"undefined\") {\n    exports.blob = false;\n}\nelse {\n    var buffer = new ArrayBuffer(0);\n    try {\n        exports.blob = new Blob([buffer], {\n            type: \"application/zip\"\n        }).size === 0;\n    }\n    catch (e) {\n        try {\n            var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\n            var builder = new Builder();\n            builder.append(buffer);\n            exports.blob = builder.getBlob('application/zip').size === 0;\n        }\n        catch (e) {\n            exports.blob = false;\n        }\n    }\n}\n\n}).call(this,require(\"buffer\").Buffer)\n},{\"buffer\":77}],101:[function(require,module,exports){\n'use strict';\nvar DataReader = require('./dataReader');\n\nfunction Uint8ArrayReader(data) {\n    if (data) {\n        this.data = data;\n        this.length = this.data.length;\n        this.index = 0;\n    }\n}\nUint8ArrayReader.prototype = new DataReader();\n/**\n * @see DataReader.byteAt\n */\nUint8ArrayReader.prototype.byteAt = function(i) {\n    return this.data[i];\n};\n/**\n * @see DataReader.lastIndexOfSignature\n */\nUint8ArrayReader.prototype.lastIndexOfSignature = function(sig) {\n    var sig0 = sig.charCodeAt(0),\n        sig1 = sig.charCodeAt(1),\n        sig2 = sig.charCodeAt(2),\n        sig3 = sig.charCodeAt(3);\n    for (var i = this.length - 4; i >= 0; --i) {\n        if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) {\n            return i;\n        }\n    }\n\n    return -1;\n};\n/**\n * @see DataReader.readData\n */\nUint8ArrayReader.prototype.readData = function(size) {\n    this.checkOffset(size);\n    if(size === 0) {\n        // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of [].\n        return new Uint8Array(0);\n    }\n    var result = this.data.subarray(this.index, this.index + size);\n    this.index += size;\n    return result;\n};\nmodule.exports = Uint8ArrayReader;\n\n},{\"./dataReader\":88}],102:[function(require,module,exports){\n'use strict';\n\nvar utils = require('./utils');\n\n/**\n * An object to write any content to an Uint8Array.\n * @constructor\n * @param {number} length The length of the array.\n */\nvar Uint8ArrayWriter = function(length) {\n    this.data = new Uint8Array(length);\n    this.index = 0;\n};\nUint8ArrayWriter.prototype = {\n    /**\n     * Append any content to the current array.\n     * @param {Object} input the content to add.\n     */\n    append: function(input) {\n        if (input.length !== 0) {\n            // with an empty Uint8Array, Opera fails with a \"Offset larger than array size\"\n            input = utils.transformTo(\"uint8array\", input);\n            this.data.set(input, this.index);\n            this.index += input.length;\n        }\n    },\n    /**\n     * Finalize the construction an return the result.\n     * @return {Uint8Array} the generated array.\n     */\n    finalize: function() {\n        return this.data;\n    }\n};\n\nmodule.exports = Uint8ArrayWriter;\n\n},{\"./utils\":104}],103:[function(require,module,exports){\n'use strict';\n\nvar utils = require('./utils');\nvar support = require('./support');\nvar nodeBuffer = require('./nodeBuffer');\n\n/**\n * The following functions come from pako, from pako/lib/utils/strings\n * released under the MIT license, see pako https://github.com/nodeca/pako/\n */\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nvar _utf8len = new Array(256);\nfor (var i=0; i<256; i++) {\n  _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);\n}\n_utf8len[254]=_utf8len[254]=1; // Invalid sequence start\n\n// convert string to array (typed, when possible)\nvar string2buf = function (str) {\n    var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n    // count binary size\n    for (m_pos = 0; m_pos < str_len; m_pos++) {\n        c = str.charCodeAt(m_pos);\n        if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {\n            c2 = str.charCodeAt(m_pos+1);\n            if ((c2 & 0xfc00) === 0xdc00) {\n                c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n                m_pos++;\n            }\n        }\n        buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n    }\n\n    // allocate buffer\n    if (support.uint8array) {\n        buf = new Uint8Array(buf_len);\n    } else {\n        buf = new Array(buf_len);\n    }\n\n    // convert\n    for (i=0, m_pos = 0; i < buf_len; m_pos++) {\n        c = str.charCodeAt(m_pos);\n        if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {\n            c2 = str.charCodeAt(m_pos+1);\n            if ((c2 & 0xfc00) === 0xdc00) {\n                c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n                m_pos++;\n            }\n        }\n        if (c < 0x80) {\n            /* one byte */\n            buf[i++] = c;\n        } else if (c < 0x800) {\n            /* two bytes */\n            buf[i++] = 0xC0 | (c >>> 6);\n            buf[i++] = 0x80 | (c & 0x3f);\n        } else if (c < 0x10000) {\n            /* three bytes */\n            buf[i++] = 0xE0 | (c >>> 12);\n            buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n            buf[i++] = 0x80 | (c & 0x3f);\n        } else {\n            /* four bytes */\n            buf[i++] = 0xf0 | (c >>> 18);\n            buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n            buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n            buf[i++] = 0x80 | (c & 0x3f);\n        }\n    }\n\n    return buf;\n};\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max   - length limit (mandatory);\nvar utf8border = function(buf, max) {\n    var pos;\n\n    max = max || buf.length;\n    if (max > buf.length) { max = buf.length; }\n\n    // go back from last position, until start of sequence found\n    pos = max-1;\n    while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n    // Fuckup - very small and broken sequence,\n    // return max, because we should return something anyway.\n    if (pos < 0) { return max; }\n\n    // If we came to start of buffer - that means vuffer is too small,\n    // return max too.\n    if (pos === 0) { return max; }\n\n    return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\n// convert array to string\nvar buf2string = function (buf) {\n    var str, i, out, c, c_len;\n    var len = buf.length;\n\n    // Reserve max possible length (2 words per char)\n    // NB: by unknown reasons, Array is significantly faster for\n    //     String.fromCharCode.apply than Uint16Array.\n    var utf16buf = new Array(len*2);\n\n    for (out=0, i=0; i<len;) {\n        c = buf[i++];\n        // quick process ascii\n        if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n        c_len = _utf8len[c];\n        // skip 5 & 6 byte codes\n        if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }\n\n        // apply mask on first byte\n        c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n        // join the rest\n        while (c_len > 1 && i < len) {\n            c = (c << 6) | (buf[i++] & 0x3f);\n            c_len--;\n        }\n\n        // terminated by end of string?\n        if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n        if (c < 0x10000) {\n            utf16buf[out++] = c;\n        } else {\n            c -= 0x10000;\n            utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n            utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n        }\n    }\n\n    // shrinkBuf(utf16buf, out)\n    if (utf16buf.length !== out) {\n        if(utf16buf.subarray) {\n            utf16buf = utf16buf.subarray(0, out);\n        } else {\n            utf16buf.length = out;\n        }\n    }\n\n    // return String.fromCharCode.apply(null, utf16buf);\n    return utils.applyFromCharCode(utf16buf);\n};\n\n\n// That's all for the pako functions.\n\n\n/**\n * Transform a javascript string into an array (typed if possible) of bytes,\n * UTF-8 encoded.\n * @param {String} str the string to encode\n * @return {Array|Uint8Array|Buffer} the UTF-8 encoded string.\n */\nexports.utf8encode = function utf8encode(str) {\n    if (support.nodebuffer) {\n        return nodeBuffer(str, \"utf-8\");\n    }\n\n    return string2buf(str);\n};\n\n\n/**\n * Transform a bytes array (or a representation) representing an UTF-8 encoded\n * string into a javascript string.\n * @param {Array|Uint8Array|Buffer} buf the data de decode\n * @return {String} the decoded string.\n */\nexports.utf8decode = function utf8decode(buf) {\n    if (support.nodebuffer) {\n        return utils.transformTo(\"nodebuffer\", buf).toString(\"utf-8\");\n    }\n\n    buf = utils.transformTo(support.uint8array ? \"uint8array\" : \"array\", buf);\n\n    // return buf2string(buf);\n    // Chrome prefers to work with \"small\" chunks of data\n    // for the method buf2string.\n    // Firefox and Chrome has their own shortcut, IE doesn't seem to really care.\n    var result = [], k = 0, len = buf.length, chunk = 65536;\n    while (k < len) {\n        var nextBoundary = utf8border(buf, Math.min(k + chunk, len));\n        if (support.uint8array) {\n            result.push(buf2string(buf.subarray(k, nextBoundary)));\n        } else {\n            result.push(buf2string(buf.slice(k, nextBoundary)));\n        }\n        k = nextBoundary;\n    }\n    return result.join(\"\");\n\n};\n// vim: set shiftwidth=4 softtabstop=4:\n\n},{\"./nodeBuffer\":94,\"./support\":100,\"./utils\":104}],104:[function(require,module,exports){\n'use strict';\nvar support = require('./support');\nvar compressions = require('./compressions');\nvar nodeBuffer = require('./nodeBuffer');\n/**\n * Convert a string to a \"binary string\" : a string containing only char codes between 0 and 255.\n * @param {string} str the string to transform.\n * @return {String} the binary string.\n */\nexports.string2binary = function(str) {\n    var result = \"\";\n    for (var i = 0; i < str.length; i++) {\n        result += String.fromCharCode(str.charCodeAt(i) & 0xff);\n    }\n    return result;\n};\nexports.arrayBuffer2Blob = function(buffer, mimeType) {\n    exports.checkSupport(\"blob\");\n\tmimeType = mimeType || 'application/zip';\n\n    try {\n        // Blob constructor\n        return new Blob([buffer], {\n            type: mimeType\n        });\n    }\n    catch (e) {\n\n        try {\n            // deprecated, browser only, old way\n            var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\n            var builder = new Builder();\n            builder.append(buffer);\n            return builder.getBlob(mimeType);\n        }\n        catch (e) {\n\n            // well, fuck ?!\n            throw new Error(\"Bug : can't construct the Blob.\");\n        }\n    }\n\n\n};\n/**\n * The identity function.\n * @param {Object} input the input.\n * @return {Object} the same input.\n */\nfunction identity(input) {\n    return input;\n}\n\n/**\n * Fill in an array with a string.\n * @param {String} str the string to use.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated).\n * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array.\n */\nfunction stringToArrayLike(str, array) {\n    for (var i = 0; i < str.length; ++i) {\n        array[i] = str.charCodeAt(i) & 0xFF;\n    }\n    return array;\n}\n\n/**\n * Transform an array-like object to a string.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.\n * @return {String} the result.\n */\nfunction arrayLikeToString(array) {\n    // Performances notes :\n    // --------------------\n    // String.fromCharCode.apply(null, array) is the fastest, see\n    // see http://jsperf.com/converting-a-uint8array-to-a-string/2\n    // but the stack is limited (and we can get huge arrays !).\n    //\n    // result += String.fromCharCode(array[i]); generate too many strings !\n    //\n    // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2\n    var chunk = 65536;\n    var result = [],\n        len = array.length,\n        type = exports.getTypeOf(array),\n        k = 0,\n        canUseApply = true;\n      try {\n         switch(type) {\n            case \"uint8array\":\n               String.fromCharCode.apply(null, new Uint8Array(0));\n               break;\n            case \"nodebuffer\":\n               String.fromCharCode.apply(null, nodeBuffer(0));\n               break;\n         }\n      } catch(e) {\n         canUseApply = false;\n      }\n\n      // no apply : slow and painful algorithm\n      // default browser on android 4.*\n      if (!canUseApply) {\n         var resultStr = \"\";\n         for(var i = 0; i < array.length;i++) {\n            resultStr += String.fromCharCode(array[i]);\n         }\n    return resultStr;\n    }\n    while (k < len && chunk > 1) {\n        try {\n            if (type === \"array\" || type === \"nodebuffer\") {\n                result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len))));\n            }\n            else {\n                result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len))));\n            }\n            k += chunk;\n        }\n        catch (e) {\n            chunk = Math.floor(chunk / 2);\n        }\n    }\n    return result.join(\"\");\n}\n\nexports.applyFromCharCode = arrayLikeToString;\n\n\n/**\n * Copy the data from an array-like to an other array-like.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated.\n * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array.\n */\nfunction arrayLikeToArrayLike(arrayFrom, arrayTo) {\n    for (var i = 0; i < arrayFrom.length; i++) {\n        arrayTo[i] = arrayFrom[i];\n    }\n    return arrayTo;\n}\n\n// a matrix containing functions to transform everything into everything.\nvar transform = {};\n\n// string to ?\ntransform[\"string\"] = {\n    \"string\": identity,\n    \"array\": function(input) {\n        return stringToArrayLike(input, new Array(input.length));\n    },\n    \"arraybuffer\": function(input) {\n        return transform[\"string\"][\"uint8array\"](input).buffer;\n    },\n    \"uint8array\": function(input) {\n        return stringToArrayLike(input, new Uint8Array(input.length));\n    },\n    \"nodebuffer\": function(input) {\n        return stringToArrayLike(input, nodeBuffer(input.length));\n    }\n};\n\n// array to ?\ntransform[\"array\"] = {\n    \"string\": arrayLikeToString,\n    \"array\": identity,\n    \"arraybuffer\": function(input) {\n        return (new Uint8Array(input)).buffer;\n    },\n    \"uint8array\": function(input) {\n        return new Uint8Array(input);\n    },\n    \"nodebuffer\": function(input) {\n        return nodeBuffer(input);\n    }\n};\n\n// arraybuffer to ?\ntransform[\"arraybuffer\"] = {\n    \"string\": function(input) {\n        return arrayLikeToString(new Uint8Array(input));\n    },\n    \"array\": function(input) {\n        return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));\n    },\n    \"arraybuffer\": identity,\n    \"uint8array\": function(input) {\n        return new Uint8Array(input);\n    },\n    \"nodebuffer\": function(input) {\n        return nodeBuffer(new Uint8Array(input));\n    }\n};\n\n// uint8array to ?\ntransform[\"uint8array\"] = {\n    \"string\": arrayLikeToString,\n    \"array\": function(input) {\n        return arrayLikeToArrayLike(input, new Array(input.length));\n    },\n    \"arraybuffer\": function(input) {\n        return input.buffer;\n    },\n    \"uint8array\": identity,\n    \"nodebuffer\": function(input) {\n        return nodeBuffer(input);\n    }\n};\n\n// nodebuffer to ?\ntransform[\"nodebuffer\"] = {\n    \"string\": arrayLikeToString,\n    \"array\": function(input) {\n        return arrayLikeToArrayLike(input, new Array(input.length));\n    },\n    \"arraybuffer\": function(input) {\n        return transform[\"nodebuffer\"][\"uint8array\"](input).buffer;\n    },\n    \"uint8array\": function(input) {\n        return arrayLikeToArrayLike(input, new Uint8Array(input.length));\n    },\n    \"nodebuffer\": identity\n};\n\n/**\n * Transform an input into any type.\n * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer.\n * If no output type is specified, the unmodified input will be returned.\n * @param {String} outputType the output type.\n * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert.\n * @throws {Error} an Error if the browser doesn't support the requested output type.\n */\nexports.transformTo = function(outputType, input) {\n    if (!input) {\n        // undefined, null, etc\n        // an empty string won't harm.\n        input = \"\";\n    }\n    if (!outputType) {\n        return input;\n    }\n    exports.checkSupport(outputType);\n    var inputType = exports.getTypeOf(input);\n    var result = transform[inputType][outputType](input);\n    return result;\n};\n\n/**\n * Return the type of the input.\n * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer.\n * @param {Object} input the input to identify.\n * @return {String} the (lowercase) type of the input.\n */\nexports.getTypeOf = function(input) {\n    if (typeof input === \"string\") {\n        return \"string\";\n    }\n    if (Object.prototype.toString.call(input) === \"[object Array]\") {\n        return \"array\";\n    }\n    if (support.nodebuffer && nodeBuffer.test(input)) {\n        return \"nodebuffer\";\n    }\n    if (support.uint8array && input instanceof Uint8Array) {\n        return \"uint8array\";\n    }\n    if (support.arraybuffer && input instanceof ArrayBuffer) {\n        return \"arraybuffer\";\n    }\n};\n\n/**\n * Throw an exception if the type is not supported.\n * @param {String} type the type to check.\n * @throws {Error} an Error if the browser doesn't support the requested type.\n */\nexports.checkSupport = function(type) {\n    var supported = support[type.toLowerCase()];\n    if (!supported) {\n        throw new Error(type + \" is not supported by this browser\");\n    }\n};\nexports.MAX_VALUE_16BITS = 65535;\nexports.MAX_VALUE_32BITS = -1; // well, \"\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\" is parsed as -1\n\n/**\n * Prettify a string read as binary.\n * @param {string} str the string to prettify.\n * @return {string} a pretty string.\n */\nexports.pretty = function(str) {\n    var res = '',\n        code, i;\n    for (i = 0; i < (str || \"\").length; i++) {\n        code = str.charCodeAt(i);\n        res += '\\\\x' + (code < 16 ? \"0\" : \"\") + code.toString(16).toUpperCase();\n    }\n    return res;\n};\n\n/**\n * Find a compression registered in JSZip.\n * @param {string} compressionMethod the method magic to find.\n * @return {Object|null} the JSZip compression object, null if none found.\n */\nexports.findCompression = function(compressionMethod) {\n    for (var method in compressions) {\n        if (!compressions.hasOwnProperty(method)) {\n            continue;\n        }\n        if (compressions[method].magic === compressionMethod) {\n            return compressions[method];\n        }\n    }\n    return null;\n};\n/**\n* Cross-window, cross-Node-context regular expression detection\n* @param  {Object}  object Anything\n* @return {Boolean}        true if the object is a regular expression,\n* false otherwise\n*/\nexports.isRegExp = function (object) {\n    return Object.prototype.toString.call(object) === \"[object RegExp]\";\n};\n\n\n},{\"./compressions\":86,\"./nodeBuffer\":94,\"./support\":100}],105:[function(require,module,exports){\n'use strict';\nvar StringReader = require('./stringReader');\nvar NodeBufferReader = require('./nodeBufferReader');\nvar Uint8ArrayReader = require('./uint8ArrayReader');\nvar utils = require('./utils');\nvar sig = require('./signature');\nvar ZipEntry = require('./zipEntry');\nvar support = require('./support');\nvar jszipProto = require('./object');\n//  class ZipEntries {{{\n/**\n * All the entries in the zip file.\n * @constructor\n * @param {String|ArrayBuffer|Uint8Array} data the binary stream to load.\n * @param {Object} loadOptions Options for loading the stream.\n */\nfunction ZipEntries(data, loadOptions) {\n    this.files = [];\n    this.loadOptions = loadOptions;\n    if (data) {\n        this.load(data);\n    }\n}\nZipEntries.prototype = {\n    /**\n     * Check that the reader is on the speficied signature.\n     * @param {string} expectedSignature the expected signature.\n     * @throws {Error} if it is an other signature.\n     */\n    checkSignature: function(expectedSignature) {\n        var signature = this.reader.readString(4);\n        if (signature !== expectedSignature) {\n            throw new Error(\"Corrupted zip or bug : unexpected signature \" + \"(\" + utils.pretty(signature) + \", expected \" + utils.pretty(expectedSignature) + \")\");\n        }\n    },\n    /**\n     * Read the end of the central directory.\n     */\n    readBlockEndOfCentral: function() {\n        this.diskNumber = this.reader.readInt(2);\n        this.diskWithCentralDirStart = this.reader.readInt(2);\n        this.centralDirRecordsOnThisDisk = this.reader.readInt(2);\n        this.centralDirRecords = this.reader.readInt(2);\n        this.centralDirSize = this.reader.readInt(4);\n        this.centralDirOffset = this.reader.readInt(4);\n\n        this.zipCommentLength = this.reader.readInt(2);\n        // warning : the encoding depends of the system locale\n        // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded.\n        // On a windows machine, this field is encoded with the localized windows code page.\n        this.zipComment = this.reader.readString(this.zipCommentLength);\n        // To get consistent behavior with the generation part, we will assume that\n        // this is utf8 encoded.\n        this.zipComment = jszipProto.utf8decode(this.zipComment);\n    },\n    /**\n     * Read the end of the Zip 64 central directory.\n     * Not merged with the method readEndOfCentral :\n     * The end of central can coexist with its Zip64 brother,\n     * I don't want to read the wrong number of bytes !\n     */\n    readBlockZip64EndOfCentral: function() {\n        this.zip64EndOfCentralSize = this.reader.readInt(8);\n        this.versionMadeBy = this.reader.readString(2);\n        this.versionNeeded = this.reader.readInt(2);\n        this.diskNumber = this.reader.readInt(4);\n        this.diskWithCentralDirStart = this.reader.readInt(4);\n        this.centralDirRecordsOnThisDisk = this.reader.readInt(8);\n        this.centralDirRecords = this.reader.readInt(8);\n        this.centralDirSize = this.reader.readInt(8);\n        this.centralDirOffset = this.reader.readInt(8);\n\n        this.zip64ExtensibleData = {};\n        var extraDataSize = this.zip64EndOfCentralSize - 44,\n            index = 0,\n            extraFieldId,\n            extraFieldLength,\n            extraFieldValue;\n        while (index < extraDataSize) {\n            extraFieldId = this.reader.readInt(2);\n            extraFieldLength = this.reader.readInt(4);\n            extraFieldValue = this.reader.readString(extraFieldLength);\n            this.zip64ExtensibleData[extraFieldId] = {\n                id: extraFieldId,\n                length: extraFieldLength,\n                value: extraFieldValue\n            };\n        }\n    },\n    /**\n     * Read the end of the Zip 64 central directory locator.\n     */\n    readBlockZip64EndOfCentralLocator: function() {\n        this.diskWithZip64CentralDirStart = this.reader.readInt(4);\n        this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8);\n        this.disksCount = this.reader.readInt(4);\n        if (this.disksCount > 1) {\n            throw new Error(\"Multi-volumes zip are not supported\");\n        }\n    },\n    /**\n     * Read the local files, based on the offset read in the central part.\n     */\n    readLocalFiles: function() {\n        var i, file;\n        for (i = 0; i < this.files.length; i++) {\n            file = this.files[i];\n            this.reader.setIndex(file.localHeaderOffset);\n            this.checkSignature(sig.LOCAL_FILE_HEADER);\n            file.readLocalPart(this.reader);\n            file.handleUTF8();\n            file.processAttributes();\n        }\n    },\n    /**\n     * Read the central directory.\n     */\n    readCentralDir: function() {\n        var file;\n\n        this.reader.setIndex(this.centralDirOffset);\n        while (this.reader.readString(4) === sig.CENTRAL_FILE_HEADER) {\n            file = new ZipEntry({\n                zip64: this.zip64\n            }, this.loadOptions);\n            file.readCentralPart(this.reader);\n            this.files.push(file);\n        }\n    },\n    /**\n     * Read the end of central directory.\n     */\n    readEndOfCentral: function() {\n        var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END);\n        if (offset === -1) {\n            // Check if the content is a truncated zip or complete garbage.\n            // A \"LOCAL_FILE_HEADER\" is not required at the beginning (auto\n            // extractible zip for example) but it can give a good hint.\n            // If an ajax request was used without responseType, we will also\n            // get unreadable data.\n            var isGarbage = true;\n            try {\n                this.reader.setIndex(0);\n                this.checkSignature(sig.LOCAL_FILE_HEADER);\n                isGarbage = false;\n            } catch (e) {}\n\n            if (isGarbage) {\n                throw new Error(\"Can't find end of central directory : is this a zip file ? \" +\n                                \"If it is, see http://stuk.github.io/jszip/documentation/howto/read_zip.html\");\n            } else {\n                throw new Error(\"Corrupted zip : can't find end of central directory\");\n            }\n        }\n        this.reader.setIndex(offset);\n        this.checkSignature(sig.CENTRAL_DIRECTORY_END);\n        this.readBlockEndOfCentral();\n\n\n        /* extract from the zip spec :\n            4)  If one of the fields in the end of central directory\n                record is too small to hold required data, the field\n                should be set to -1 (0xFFFF or 0xFFFFFFFF) and the\n                ZIP64 format record should be created.\n            5)  The end of central directory record and the\n                Zip64 end of central directory locator record must\n                reside on the same disk when splitting or spanning\n                an archive.\n         */\n        if (this.diskNumber === utils.MAX_VALUE_16BITS || this.diskWithCentralDirStart === utils.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === utils.MAX_VALUE_16BITS || this.centralDirRecords === utils.MAX_VALUE_16BITS || this.centralDirSize === utils.MAX_VALUE_32BITS || this.centralDirOffset === utils.MAX_VALUE_32BITS) {\n            this.zip64 = true;\n\n            /*\n            Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from\n            the zip file can fit into a 32bits integer. This cannot be solved : Javascript represents\n            all numbers as 64-bit double precision IEEE 754 floating point numbers.\n            So, we have 53bits for integers and bitwise operations treat everything as 32bits.\n            see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators\n            and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5\n            */\n\n            // should look for a zip64 EOCD locator\n            offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);\n            if (offset === -1) {\n                throw new Error(\"Corrupted zip : can't find the ZIP64 end of central directory locator\");\n            }\n            this.reader.setIndex(offset);\n            this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);\n            this.readBlockZip64EndOfCentralLocator();\n\n            // now the zip64 EOCD record\n            this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);\n            this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END);\n            this.readBlockZip64EndOfCentral();\n        }\n    },\n    prepareReader: function(data) {\n        var type = utils.getTypeOf(data);\n        if (type === \"string\" && !support.uint8array) {\n            this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString);\n        }\n        else if (type === \"nodebuffer\") {\n            this.reader = new NodeBufferReader(data);\n        }\n        else {\n            this.reader = new Uint8ArrayReader(utils.transformTo(\"uint8array\", data));\n        }\n    },\n    /**\n     * Read a zip file and create ZipEntries.\n     * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file.\n     */\n    load: function(data) {\n        this.prepareReader(data);\n        this.readEndOfCentral();\n        this.readCentralDir();\n        this.readLocalFiles();\n    }\n};\n// }}} end of ZipEntries\nmodule.exports = ZipEntries;\n\n},{\"./nodeBufferReader\":95,\"./object\":96,\"./signature\":97,\"./stringReader\":98,\"./support\":100,\"./uint8ArrayReader\":101,\"./utils\":104,\"./zipEntry\":106}],106:[function(require,module,exports){\n'use strict';\nvar StringReader = require('./stringReader');\nvar utils = require('./utils');\nvar CompressedObject = require('./compressedObject');\nvar jszipProto = require('./object');\n\nvar MADE_BY_DOS = 0x00;\nvar MADE_BY_UNIX = 0x03;\n\n// class ZipEntry {{{\n/**\n * An entry in the zip file.\n * @constructor\n * @param {Object} options Options of the current file.\n * @param {Object} loadOptions Options for loading the stream.\n */\nfunction ZipEntry(options, loadOptions) {\n    this.options = options;\n    this.loadOptions = loadOptions;\n}\nZipEntry.prototype = {\n    /**\n     * say if the file is encrypted.\n     * @return {boolean} true if the file is encrypted, false otherwise.\n     */\n    isEncrypted: function() {\n        // bit 1 is set\n        return (this.bitFlag & 0x0001) === 0x0001;\n    },\n    /**\n     * say if the file has utf-8 filename/comment.\n     * @return {boolean} true if the filename/comment is in utf-8, false otherwise.\n     */\n    useUTF8: function() {\n        // bit 11 is set\n        return (this.bitFlag & 0x0800) === 0x0800;\n    },\n    /**\n     * Prepare the function used to generate the compressed content from this ZipFile.\n     * @param {DataReader} reader the reader to use.\n     * @param {number} from the offset from where we should read the data.\n     * @param {number} length the length of the data to read.\n     * @return {Function} the callback to get the compressed content (the type depends of the DataReader class).\n     */\n    prepareCompressedContent: function(reader, from, length) {\n        return function() {\n            var previousIndex = reader.index;\n            reader.setIndex(from);\n            var compressedFileData = reader.readData(length);\n            reader.setIndex(previousIndex);\n\n            return compressedFileData;\n        };\n    },\n    /**\n     * Prepare the function used to generate the uncompressed content from this ZipFile.\n     * @param {DataReader} reader the reader to use.\n     * @param {number} from the offset from where we should read the data.\n     * @param {number} length the length of the data to read.\n     * @param {JSZip.compression} compression the compression used on this file.\n     * @param {number} uncompressedSize the uncompressed size to expect.\n     * @return {Function} the callback to get the uncompressed content (the type depends of the DataReader class).\n     */\n    prepareContent: function(reader, from, length, compression, uncompressedSize) {\n        return function() {\n\n            var compressedFileData = utils.transformTo(compression.uncompressInputType, this.getCompressedContent());\n            var uncompressedFileData = compression.uncompress(compressedFileData);\n\n            if (uncompressedFileData.length !== uncompressedSize) {\n                throw new Error(\"Bug : uncompressed data size mismatch\");\n            }\n\n            return uncompressedFileData;\n        };\n    },\n    /**\n     * Read the local part of a zip file and add the info in this object.\n     * @param {DataReader} reader the reader to use.\n     */\n    readLocalPart: function(reader) {\n        var compression, localExtraFieldsLength;\n\n        // we already know everything from the central dir !\n        // If the central dir data are false, we are doomed.\n        // On the bright side, the local part is scary  : zip64, data descriptors, both, etc.\n        // The less data we get here, the more reliable this should be.\n        // Let's skip the whole header and dash to the data !\n        reader.skip(22);\n        // in some zip created on windows, the filename stored in the central dir contains \\ instead of /.\n        // Strangely, the filename here is OK.\n        // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes\n        // or APPNOTE#4.4.17.1, \"All slashes MUST be forward slashes '/'\") but there are a lot of bad zip generators...\n        // Search \"unzip mismatching \"local\" filename continuing with \"central\" filename version\" on\n        // the internet.\n        //\n        // I think I see the logic here : the central directory is used to display\n        // content and the local directory is used to extract the files. Mixing / and \\\n        // may be used to display \\ to windows users and use / when extracting the files.\n        // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394\n        this.fileNameLength = reader.readInt(2);\n        localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir\n        this.fileName = reader.readString(this.fileNameLength);\n        reader.skip(localExtraFieldsLength);\n\n        if (this.compressedSize == -1 || this.uncompressedSize == -1) {\n            throw new Error(\"Bug or corrupted zip : didn't get enough informations from the central directory \" + \"(compressedSize == -1 || uncompressedSize == -1)\");\n        }\n\n        compression = utils.findCompression(this.compressionMethod);\n        if (compression === null) { // no compression found\n            throw new Error(\"Corrupted zip : compression \" + utils.pretty(this.compressionMethod) + \" unknown (inner file : \" + this.fileName + \")\");\n        }\n        this.decompressed = new CompressedObject();\n        this.decompressed.compressedSize = this.compressedSize;\n        this.decompressed.uncompressedSize = this.uncompressedSize;\n        this.decompressed.crc32 = this.crc32;\n        this.decompressed.compressionMethod = this.compressionMethod;\n        this.decompressed.getCompressedContent = this.prepareCompressedContent(reader, reader.index, this.compressedSize, compression);\n        this.decompressed.getContent = this.prepareContent(reader, reader.index, this.compressedSize, compression, this.uncompressedSize);\n\n        // we need to compute the crc32...\n        if (this.loadOptions.checkCRC32) {\n            this.decompressed = utils.transformTo(\"string\", this.decompressed.getContent());\n            if (jszipProto.crc32(this.decompressed) !== this.crc32) {\n                throw new Error(\"Corrupted zip : CRC32 mismatch\");\n            }\n        }\n    },\n\n    /**\n     * Read the central part of a zip file and add the info in this object.\n     * @param {DataReader} reader the reader to use.\n     */\n    readCentralPart: function(reader) {\n        this.versionMadeBy = reader.readInt(2);\n        this.versionNeeded = reader.readInt(2);\n        this.bitFlag = reader.readInt(2);\n        this.compressionMethod = reader.readString(2);\n        this.date = reader.readDate();\n        this.crc32 = reader.readInt(4);\n        this.compressedSize = reader.readInt(4);\n        this.uncompressedSize = reader.readInt(4);\n        this.fileNameLength = reader.readInt(2);\n        this.extraFieldsLength = reader.readInt(2);\n        this.fileCommentLength = reader.readInt(2);\n        this.diskNumberStart = reader.readInt(2);\n        this.internalFileAttributes = reader.readInt(2);\n        this.externalFileAttributes = reader.readInt(4);\n        this.localHeaderOffset = reader.readInt(4);\n\n        if (this.isEncrypted()) {\n            throw new Error(\"Encrypted zip are not supported\");\n        }\n\n        this.fileName = reader.readString(this.fileNameLength);\n        this.readExtraFields(reader);\n        this.parseZIP64ExtraField(reader);\n        this.fileComment = reader.readString(this.fileCommentLength);\n    },\n\n    /**\n     * Parse the external file attributes and get the unix/dos permissions.\n     */\n    processAttributes: function () {\n        this.unixPermissions = null;\n        this.dosPermissions = null;\n        var madeBy = this.versionMadeBy >> 8;\n\n        // Check if we have the DOS directory flag set.\n        // We look for it in the DOS and UNIX permissions\n        // but some unknown platform could set it as a compatibility flag.\n        this.dir = this.externalFileAttributes & 0x0010 ? true : false;\n\n        if(madeBy === MADE_BY_DOS) {\n            // first 6 bits (0 to 5)\n            this.dosPermissions = this.externalFileAttributes & 0x3F;\n        }\n\n        if(madeBy === MADE_BY_UNIX) {\n            this.unixPermissions = (this.externalFileAttributes >> 16) & 0xFFFF;\n            // the octal permissions are in (this.unixPermissions & 0x01FF).toString(8);\n        }\n\n        // fail safe : if the name ends with a / it probably means a folder\n        if (!this.dir && this.fileName.slice(-1) === '/') {\n            this.dir = true;\n        }\n    },\n\n    /**\n     * Parse the ZIP64 extra field and merge the info in the current ZipEntry.\n     * @param {DataReader} reader the reader to use.\n     */\n    parseZIP64ExtraField: function(reader) {\n\n        if (!this.extraFields[0x0001]) {\n            return;\n        }\n\n        // should be something, preparing the extra reader\n        var extraReader = new StringReader(this.extraFields[0x0001].value);\n\n        // I really hope that these 64bits integer can fit in 32 bits integer, because js\n        // won't let us have more.\n        if (this.uncompressedSize === utils.MAX_VALUE_32BITS) {\n            this.uncompressedSize = extraReader.readInt(8);\n        }\n        if (this.compressedSize === utils.MAX_VALUE_32BITS) {\n            this.compressedSize = extraReader.readInt(8);\n        }\n        if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) {\n            this.localHeaderOffset = extraReader.readInt(8);\n        }\n        if (this.diskNumberStart === utils.MAX_VALUE_32BITS) {\n            this.diskNumberStart = extraReader.readInt(4);\n        }\n    },\n    /**\n     * Read the central part of a zip file and add the info in this object.\n     * @param {DataReader} reader the reader to use.\n     */\n    readExtraFields: function(reader) {\n        var start = reader.index,\n            extraFieldId,\n            extraFieldLength,\n            extraFieldValue;\n\n        this.extraFields = this.extraFields || {};\n\n        while (reader.index < start + this.extraFieldsLength) {\n            extraFieldId = reader.readInt(2);\n            extraFieldLength = reader.readInt(2);\n            extraFieldValue = reader.readString(extraFieldLength);\n\n            this.extraFields[extraFieldId] = {\n                id: extraFieldId,\n                length: extraFieldLength,\n                value: extraFieldValue\n            };\n        }\n    },\n    /**\n     * Apply an UTF8 transformation if needed.\n     */\n    handleUTF8: function() {\n        if (this.useUTF8()) {\n            this.fileName = jszipProto.utf8decode(this.fileName);\n            this.fileComment = jszipProto.utf8decode(this.fileComment);\n        } else {\n            var upath = this.findExtraFieldUnicodePath();\n            if (upath !== null) {\n                this.fileName = upath;\n            }\n            var ucomment = this.findExtraFieldUnicodeComment();\n            if (ucomment !== null) {\n                this.fileComment = ucomment;\n            }\n        }\n    },\n\n    /**\n     * Find the unicode path declared in the extra field, if any.\n     * @return {String} the unicode path, null otherwise.\n     */\n    findExtraFieldUnicodePath: function() {\n        var upathField = this.extraFields[0x7075];\n        if (upathField) {\n            var extraReader = new StringReader(upathField.value);\n\n            // wrong version\n            if (extraReader.readInt(1) !== 1) {\n                return null;\n            }\n\n            // the crc of the filename changed, this field is out of date.\n            if (jszipProto.crc32(this.fileName) !== extraReader.readInt(4)) {\n                return null;\n            }\n\n            return jszipProto.utf8decode(extraReader.readString(upathField.length - 5));\n        }\n        return null;\n    },\n\n    /**\n     * Find the unicode comment declared in the extra field, if any.\n     * @return {String} the unicode comment, null otherwise.\n     */\n    findExtraFieldUnicodeComment: function() {\n        var ucommentField = this.extraFields[0x6375];\n        if (ucommentField) {\n            var extraReader = new StringReader(ucommentField.value);\n\n            // wrong version\n            if (extraReader.readInt(1) !== 1) {\n                return null;\n            }\n\n            // the crc of the comment changed, this field is out of date.\n            if (jszipProto.crc32(this.fileComment) !== extraReader.readInt(4)) {\n                return null;\n            }\n\n            return jszipProto.utf8decode(extraReader.readString(ucommentField.length - 5));\n        }\n        return null;\n    }\n};\nmodule.exports = ZipEntry;\n\n},{\"./compressedObject\":85,\"./object\":96,\"./stringReader\":98,\"./utils\":104}],107:[function(require,module,exports){\nexports.Parser = require(\"./lib/parser\").Parser;\nexports.rules = require(\"./lib/rules\");\nexports.errors = require(\"./lib/errors\");\nexports.results = require(\"./lib/parsing-results\");\nexports.StringSource = require(\"./lib/StringSource\");\nexports.Token = require(\"./lib/Token\");\nexports.bottomUp = require(\"./lib/bottom-up\");\nexports.RegexTokeniser = require(\"./lib/regex-tokeniser\").RegexTokeniser;\n\nexports.rule = function(ruleBuilder) {\n    var rule;\n    return function(input) {\n        if (!rule) {\n            rule = ruleBuilder();\n        }\n        return rule(input);\n    };\n};\n\n},{\"./lib/StringSource\":108,\"./lib/Token\":109,\"./lib/bottom-up\":111,\"./lib/errors\":112,\"./lib/parser\":114,\"./lib/parsing-results\":115,\"./lib/regex-tokeniser\":116,\"./lib/rules\":117}],108:[function(require,module,exports){\nvar util = require(\"util\");\n\nvar StringSource = module.exports = function(string, description) {\n    var self = {\n        asString: function() {\n            return string;\n        },\n        range: function(startIndex, endIndex) {\n            return new StringSourceRange(string, description, startIndex, endIndex);\n        }\n    };\n    return self;\n};\n\nvar StringSourceRange = function(string, description, startIndex, endIndex) {\n    this._string = string;\n    this._description = description;\n    this._startIndex = startIndex;\n    this._endIndex = endIndex;\n};\n\nStringSourceRange.prototype.to = function(otherRange) {\n    // TODO: Assert that tokens are the same across both iterators\n    return new StringSourceRange(this._string, this._description, this._startIndex, otherRange._endIndex);\n};\n\nStringSourceRange.prototype.describe = function() {\n    var position = this._position();\n    var description = this._description ? this._description + \"\\n\" : \"\";\n    return util.format(\"%sLine number: %s\\nCharacter number: %s\",\n        description, position.lineNumber, position.characterNumber);\n};\n\nStringSourceRange.prototype.lineNumber = function() {\n    return this._position().lineNumber;\n};\n\nStringSourceRange.prototype.characterNumber = function() {\n    return this._position().characterNumber;\n};\n\nStringSourceRange.prototype._position = function() {\n    var self = this;\n    var index = 0;\n    var nextNewLine = function() {\n        return self._string.indexOf(\"\\n\", index);\n    };\n    \n    var lineNumber = 1;\n    while (nextNewLine() !== -1 && nextNewLine() < this._startIndex) {\n        index = nextNewLine() + 1;\n        lineNumber += 1;\n    }\n    var characterNumber = this._startIndex - index + 1;\n    return {lineNumber: lineNumber, characterNumber: characterNumber};\n};\n\n},{\"util\":157}],109:[function(require,module,exports){\nmodule.exports = function(name, value, source) {\n    this.name = name;\n    this.value = value;\n    if (source) {\n        this.source = source;\n    }\n};\n\n},{}],110:[function(require,module,exports){\nvar TokenIterator = module.exports = function(tokens, startIndex) {\n    this._tokens = tokens;\n    this._startIndex = startIndex || 0;\n};\n\nTokenIterator.prototype.head = function() {\n    return this._tokens[this._startIndex];\n};\n\nTokenIterator.prototype.tail = function(startIndex) {\n    return new TokenIterator(this._tokens, this._startIndex + 1);\n};\n\nTokenIterator.prototype.toArray = function() {\n    return this._tokens.slice(this._startIndex);\n};\n\nTokenIterator.prototype.end = function() {\n    return this._tokens[this._tokens.length - 1];\n};\n\n// TODO: doesn't need to be a method, can be a separate function,\n// which simplifies implementation of the TokenIterator interface\nTokenIterator.prototype.to = function(end) {\n    var start = this.head().source;\n    var endToken = end.head() || end.end();\n    return start.to(endToken.source);\n};\n\n},{}],111:[function(require,module,exports){\nvar rules = require(\"./rules\");\nvar results = require(\"./parsing-results\");\n\nexports.parser = function(name, prefixRules, infixRuleBuilders) {\n    var self = {\n        rule: rule,\n        leftAssociative: leftAssociative,\n        rightAssociative: rightAssociative\n    };\n    \n    var infixRules = new InfixRules(infixRuleBuilders.map(createInfixRule));\n    var prefixRule = rules.firstOf(name, prefixRules);\n    \n    function createInfixRule(infixRuleBuilder) {\n        return {\n            name: infixRuleBuilder.name,\n            rule: lazyRule(infixRuleBuilder.ruleBuilder.bind(null, self))\n        };\n    }\n    \n    function rule() {\n        return createRule(infixRules);\n    }\n    \n    function leftAssociative(name) {\n        return createRule(infixRules.untilExclusive(name));\n    }\n    \n    function rightAssociative(name) {\n        return createRule(infixRules.untilInclusive(name));\n    }\n    \n    function createRule(infixRules) {\n        return apply.bind(null, infixRules);\n    }\n    \n    function apply(infixRules, tokens) {\n        var leftResult = prefixRule(tokens);\n        if (leftResult.isSuccess()) {\n            return infixRules.apply(leftResult);\n        } else {\n            return leftResult;\n        }\n    }\n    \n    return self;\n};\n\nfunction InfixRules(infixRules) {\n    function untilExclusive(name) {\n        return new InfixRules(infixRules.slice(0, ruleNames().indexOf(name)));\n    }\n    \n    function untilInclusive(name) {\n        return new InfixRules(infixRules.slice(0, ruleNames().indexOf(name) + 1));\n    }\n    \n    function ruleNames() {\n        return infixRules.map(function(rule) {\n            return rule.name;\n        });\n    }\n    \n    function apply(leftResult) {\n        var currentResult;\n        var source;\n        while (true) {\n            currentResult = applyToTokens(leftResult.remaining());\n            if (currentResult.isSuccess()) {\n                source = leftResult.source().to(currentResult.source());\n                leftResult = results.success(\n                    currentResult.value()(leftResult.value(), source),\n                    currentResult.remaining(),\n                    source\n                )\n            } else if (currentResult.isFailure()) {\n                return leftResult;\n            } else {\n                return currentResult;\n            }\n        }\n    }\n    \n    function applyToTokens(tokens) {\n        return rules.firstOf(\"infix\", infixRules.map(function(infix) {\n            return infix.rule;\n        }))(tokens);\n    }\n    \n    return {\n        apply: apply,\n        untilExclusive: untilExclusive,\n        untilInclusive: untilInclusive\n    }\n}\n\nexports.infix = function(name, ruleBuilder) {\n    function map(func) {\n        return exports.infix(name, function(parser) {\n            var rule = ruleBuilder(parser);\n            return function(tokens) {\n                var result = rule(tokens);\n                return result.map(function(right) {\n                    return function(left, source) {\n                        return func(left, right, source);\n                    };\n                });\n            };\n        });\n    }\n    \n    return {\n        name: name,\n        ruleBuilder: ruleBuilder,\n        map: map\n    };\n}\n\n// TODO: move into a sensible place and remove duplication\nvar lazyRule = function(ruleBuilder) {\n    var rule;\n    return function(input) {\n        if (!rule) {\n            rule = ruleBuilder();\n        }\n        return rule(input);\n    };\n};\n\n},{\"./parsing-results\":115,\"./rules\":117}],112:[function(require,module,exports){\nexports.error = function(options) {\n    return new Error(options);\n};\n\nvar Error = function(options) {\n    this.expected = options.expected;\n    this.actual = options.actual;\n    this._location = options.location;\n};\n\nError.prototype.describe = function() {\n    var locationDescription = this._location ? this._location.describe() + \":\\n\" : \"\";\n    return locationDescription + \"Expected \" + this.expected + \"\\nbut got \" + this.actual;\n};\n\nError.prototype.lineNumber = function() {\n    return this._location.lineNumber();\n};\n\nError.prototype.characterNumber = function() {\n    return this._location.characterNumber();\n};\n\n},{}],113:[function(require,module,exports){\nvar fromArray = exports.fromArray = function(array) {\n    var index = 0;\n    var hasNext = function() {\n        return index < array.length;\n    };\n    return new LazyIterator({\n        hasNext: hasNext,\n        next: function() {\n            if (!hasNext()) {\n                throw new Error(\"No more elements\");\n            } else {\n                return array[index++];\n            }\n        }\n    });\n};\n\nvar LazyIterator = function(iterator) {\n    this._iterator = iterator;\n};\n\nLazyIterator.prototype.map = function(func) {\n    var iterator = this._iterator;\n    return new LazyIterator({\n        hasNext: function() {\n            return iterator.hasNext();\n        },\n        next: function() {\n            return func(iterator.next());\n        }\n    });\n};\n\nLazyIterator.prototype.filter = function(condition) {\n    var iterator = this._iterator;\n    \n    var moved = false;\n    var hasNext = false;\n    var next;\n    var moveIfNecessary = function() {\n        if (moved) {\n            return;\n        }\n        moved = true;\n        hasNext = false;\n        while (iterator.hasNext() && !hasNext) {\n            next = iterator.next();\n            hasNext = condition(next);\n        }\n    };\n    \n    return new LazyIterator({\n        hasNext: function() {\n            moveIfNecessary();\n            return hasNext;\n        },\n        next: function() {\n            moveIfNecessary();\n            var toReturn = next;\n            moved = false;\n            return toReturn;\n        }\n    });\n};\n\nLazyIterator.prototype.first = function() {\n    var iterator = this._iterator;\n    if (this._iterator.hasNext()) {\n        return iterator.next();\n    } else {\n        return null;\n    }\n};\n\nLazyIterator.prototype.toArray = function() {\n    var result = [];\n    while (this._iterator.hasNext()) {\n        result.push(this._iterator.next());\n    }\n    return result;\n};\n\n},{}],114:[function(require,module,exports){\nvar TokenIterator = require(\"./TokenIterator\");\n\nexports.Parser = function(options) {\n    var parseTokens = function(parser, tokens) {\n        return parser(new TokenIterator(tokens));\n    };\n    \n    return {\n        parseTokens: parseTokens\n    };\n};\n\n},{\"./TokenIterator\":110}],115:[function(require,module,exports){\nmodule.exports = {\n    failure: function(errors, remaining) {\n        if (errors.length < 1) {\n            throw new Error(\"Failure must have errors\");\n        }\n        return new Result({\n            status: \"failure\",\n            remaining: remaining,\n            errors: errors\n        });\n    },\n    error: function(errors, remaining) {\n        if (errors.length < 1) {\n            throw new Error(\"Failure must have errors\");\n        }\n        return new Result({\n            status: \"error\",\n            remaining: remaining,\n            errors: errors\n        });\n    },\n    success: function(value, remaining, source) {\n        return new Result({\n            status: \"success\",\n            value: value,\n            source: source,\n            remaining: remaining,\n            errors: []\n        });\n    },\n    cut: function(remaining) {\n        return new Result({\n            status: \"cut\",\n            remaining: remaining,\n            errors: []\n        });\n    }\n};\n\nvar Result = function(options) {\n    this._value = options.value;\n    this._status = options.status;\n    this._hasValue = options.value !== undefined;\n    this._remaining = options.remaining;\n    this._source = options.source;\n    this._errors = options.errors;\n};\n\nResult.prototype.map = function(func) {\n    if (this._hasValue) {\n        return new Result({\n            value: func(this._value, this._source),\n            status: this._status,\n            remaining: this._remaining,\n            source: this._source,\n            errors: this._errors\n        });\n    } else {\n        return this;\n    }\n};\n\nResult.prototype.changeRemaining = function(remaining) {\n    return new Result({\n        value: this._value,\n        status: this._status,\n        remaining: remaining,\n        source: this._source,\n        errors: this._errors\n    });\n};\n\nResult.prototype.isSuccess = function() {\n    return this._status === \"success\" || this._status === \"cut\";\n};\n\nResult.prototype.isFailure = function() {\n    return this._status === \"failure\";\n};\n\nResult.prototype.isError = function() {\n    return this._status === \"error\";\n};\n\nResult.prototype.isCut = function() {\n    return this._status === \"cut\";\n};\n\nResult.prototype.value = function() {\n    return this._value;\n};\n\nResult.prototype.remaining = function() {\n    return this._remaining;\n};\n\nResult.prototype.source = function() {\n    return this._source;\n};\n\nResult.prototype.errors = function() {\n    return this._errors;\n};\n\n},{}],116:[function(require,module,exports){\nvar Token = require(\"./Token\");\nvar StringSource = require(\"./StringSource\");\n\nexports.RegexTokeniser = RegexTokeniser;\n\nfunction RegexTokeniser(rules) {\n    rules = rules.map(function(rule) {\n        return {\n            name: rule.name,\n            regex: new RegExp(rule.regex.source, \"g\")\n        };\n    });\n    \n    function tokenise(input, description) {\n        var source = new StringSource(input, description);\n        var index = 0;\n        var tokens = [];\n    \n        while (index < input.length) {\n            var result = readNextToken(input, index, source);\n            index = result.endIndex;\n            tokens.push(result.token);\n        }\n        \n        tokens.push(endToken(input, source));\n        return tokens;\n    }\n\n    function readNextToken(string, startIndex, source) {\n        for (var i = 0; i < rules.length; i++) {\n            var regex = rules[i].regex;\n            regex.lastIndex = startIndex;\n            var result = regex.exec(string);\n            \n            if (result) {\n                var endIndex = startIndex + result[0].length;\n                if (result.index === startIndex && endIndex > startIndex) {\n                    var value = result[1];\n                    var token = new Token(\n                        rules[i].name,\n                        value,\n                        source.range(startIndex, endIndex)\n                    );\n                    return {token: token, endIndex: endIndex};\n                }\n            }\n        }\n        var endIndex = startIndex + 1;\n        var token = new Token(\n            \"unrecognisedCharacter\",\n            string.substring(startIndex, endIndex),\n            source.range(startIndex, endIndex)\n        );\n        return {token: token, endIndex: endIndex};\n    }\n    \n    function endToken(input, source) {\n        return new Token(\n            \"end\",\n            null,\n            source.range(input.length, input.length)\n        );\n    }\n    \n    return {\n        tokenise: tokenise\n    }\n}\n\n\n\n},{\"./StringSource\":108,\"./Token\":109}],117:[function(require,module,exports){\nvar _ = require(\"underscore\");\nvar options = require(\"option\");\nvar results = require(\"./parsing-results\");\nvar errors = require(\"./errors\");\nvar lazyIterators = require(\"./lazy-iterators\");\n\nexports.token = function(tokenType, value) {\n    var matchValue = value !== undefined;\n    return function(input) {\n        var token = input.head();\n        if (token && token.name === tokenType && (!matchValue || token.value === value)) {\n            return results.success(token.value, input.tail(), token.source);\n        } else {\n            var expected = describeToken({name: tokenType, value: value});\n            return describeTokenMismatch(input, expected);\n        }\n    };\n};\n\nexports.tokenOfType = function(tokenType) {\n    return exports.token(tokenType);\n};\n\nexports.firstOf = function(name, parsers) {\n    if (!_.isArray(parsers)) {\n        parsers = Array.prototype.slice.call(arguments, 1);\n    }\n    return function(input) {\n        return lazyIterators\n            .fromArray(parsers)\n            .map(function(parser) {\n                return parser(input);\n            })\n            .filter(function(result) {\n                return result.isSuccess() || result.isError();\n            })\n            .first() || describeTokenMismatch(input, name);\n    };\n};\n\nexports.then = function(parser, func) {\n    return function(input) {\n        var result = parser(input);\n        if (!result.map) {\n            console.log(result);\n        }\n        return result.map(func);\n    };\n};\n\nexports.sequence = function() {\n    var parsers = Array.prototype.slice.call(arguments, 0);\n    var rule = function(input) {\n        var result = _.foldl(parsers, function(memo, parser) {\n            var result = memo.result;\n            var hasCut = memo.hasCut;\n            if (!result.isSuccess()) {\n                return {result: result, hasCut: hasCut};\n            }\n            var subResult = parser(result.remaining());\n            if (subResult.isCut()) {\n                return {result: result, hasCut: true};\n            } else if (subResult.isSuccess()) {\n                var values;\n                if (parser.isCaptured) {\n                    values = result.value().withValue(parser, subResult.value());\n                } else {\n                    values = result.value();\n                }\n                var remaining = subResult.remaining();\n                var source = input.to(remaining);\n                return {\n                    result: results.success(values, remaining, source),\n                    hasCut: hasCut\n                };\n            } else if (hasCut) {\n                return {result: results.error(subResult.errors(), subResult.remaining()), hasCut: hasCut};\n            } else {\n                return {result: subResult, hasCut: hasCut};\n            }\n        }, {result: results.success(new SequenceValues(), input), hasCut: false}).result;\n        var source = input.to(result.remaining());\n        return result.map(function(values) {\n            return values.withValue(exports.sequence.source, source);\n        });\n    };\n    rule.head = function() {\n        var firstCapture = _.find(parsers, isCapturedRule);\n        return exports.then(\n            rule,\n            exports.sequence.extract(firstCapture)\n        );\n    };\n    rule.map = function(func) {\n        return exports.then(\n            rule,\n            function(result) {\n                return func.apply(this, result.toArray());\n            }\n        );\n    };\n    \n    function isCapturedRule(subRule) {\n        return subRule.isCaptured;\n    }\n    \n    return rule;\n};\n\nvar SequenceValues = function(values, valuesArray) {\n    this._values = values || {};\n    this._valuesArray = valuesArray || [];\n};\n\nSequenceValues.prototype.withValue = function(rule, value) {\n    if (rule.captureName && rule.captureName in this._values) {\n        throw new Error(\"Cannot add second value for capture \\\"\" + rule.captureName + \"\\\"\");\n    } else {\n        var newValues = _.clone(this._values);\n        newValues[rule.captureName] = value;\n        var newValuesArray = this._valuesArray.concat([value]);\n        return new SequenceValues(newValues, newValuesArray);\n    }\n};\n\nSequenceValues.prototype.get = function(rule) {\n    if (rule.captureName in this._values) {\n        return this._values[rule.captureName];\n    } else {\n        throw new Error(\"No value for capture \\\"\" + rule.captureName + \"\\\"\");\n    }\n};\n\nSequenceValues.prototype.toArray = function() {\n    return this._valuesArray;\n};\n\nexports.sequence.capture = function(rule, name) {\n    var captureRule = function() {\n        return rule.apply(this, arguments);\n    };\n    captureRule.captureName = name;\n    captureRule.isCaptured = true;\n    return captureRule;\n};\n\nexports.sequence.extract = function(rule) {\n    return function(result) {\n        return result.get(rule);\n    };\n};\n\nexports.sequence.applyValues = function(func) {\n    // TODO: check captureName doesn't conflict with source or other captures\n    var rules = Array.prototype.slice.call(arguments, 1);\n    return function(result) {\n        var values = rules.map(function(rule) {\n            return result.get(rule);\n        });\n        return func.apply(this, values);\n    };\n};\n\nexports.sequence.source = {\n    captureName: \"☃source☃\"\n};\n\nexports.sequence.cut = function() {\n    return function(input) {\n        return results.cut(input);\n    };\n};\n\nexports.optional = function(rule) {\n    return function(input) {\n        var result = rule(input);\n        if (result.isSuccess()) {\n            return result.map(options.some);\n        } else if (result.isFailure()) {\n            return results.success(options.none, input);\n        } else {\n            return result;\n        }\n    };\n};\n\nexports.zeroOrMoreWithSeparator = function(rule, separator) {\n    return repeatedWithSeparator(rule, separator, false);\n};\n\nexports.oneOrMoreWithSeparator = function(rule, separator) {\n    return repeatedWithSeparator(rule, separator, true);\n};\n\nvar zeroOrMore = exports.zeroOrMore = function(rule) {\n    return function(input) {\n        var values = [];\n        var result;\n        while ((result = rule(input)) && result.isSuccess()) {\n            input = result.remaining();\n            values.push(result.value());\n        }\n        if (result.isError()) {\n            return result;\n        } else {\n            return results.success(values, input);\n        }\n    };\n};\n\nexports.oneOrMore = function(rule) {\n    return exports.oneOrMoreWithSeparator(rule, noOpRule);\n};\n\nfunction noOpRule(input) {\n    return results.success(null, input);\n}\n\nvar repeatedWithSeparator = function(rule, separator, isOneOrMore) {\n    return function(input) {\n        var result = rule(input);\n        if (result.isSuccess()) {\n            var mainRule = exports.sequence.capture(rule, \"main\");\n            var remainingRule = zeroOrMore(exports.then(\n                exports.sequence(separator, mainRule),\n                exports.sequence.extract(mainRule)\n            ));\n            var remainingResult = remainingRule(result.remaining());\n            return results.success([result.value()].concat(remainingResult.value()), remainingResult.remaining());\n        } else if (isOneOrMore || result.isError()) {\n            return result;\n        } else {\n            return results.success([], input);\n        }\n    };\n};\n\nexports.leftAssociative = function(leftRule, rightRule, func) {\n    var rights;\n    if (func) {\n        rights = [{func: func, rule: rightRule}];\n    } else {\n        rights = rightRule;\n    }\n    rights = rights.map(function(right) {\n        return exports.then(right.rule, function(rightValue) {\n            return function(leftValue, source) {\n                return right.func(leftValue, rightValue, source);\n            };\n        });\n    });\n    var repeatedRule = exports.firstOf.apply(null, [\"rules\"].concat(rights));\n    \n    return function(input) {\n        var start = input;\n        var leftResult = leftRule(input);\n        if (!leftResult.isSuccess()) {\n            return leftResult;\n        }\n        var repeatedResult = repeatedRule(leftResult.remaining());\n        while (repeatedResult.isSuccess()) {\n            var remaining = repeatedResult.remaining();\n            var source = start.to(repeatedResult.remaining());\n            var right = repeatedResult.value();\n            leftResult = results.success(\n                right(leftResult.value(), source),\n                remaining,\n                source\n            );\n            repeatedResult = repeatedRule(leftResult.remaining());\n        }\n        if (repeatedResult.isError()) {\n            return repeatedResult;\n        }\n        return leftResult;\n    };\n};\n\nexports.leftAssociative.firstOf = function() {\n    return Array.prototype.slice.call(arguments, 0);\n};\n\nexports.nonConsuming = function(rule) {\n    return function(input) {\n        return rule(input).changeRemaining(input);\n    };\n};\n\nvar describeToken = function(token) {\n    if (token.value) {\n        return token.name + \" \\\"\" + token.value + \"\\\"\";\n    } else {\n        return token.name;\n    }\n};\n\nfunction describeTokenMismatch(input, expected) {\n    var error;\n    var token = input.head();\n    if (token) {\n        error = errors.error({\n            expected: expected,\n            actual: describeToken(token),\n            location: token.source\n        });\n    } else {\n        error = errors.error({\n            expected: expected,\n            actual: \"end of tokens\"\n        });\n    }\n    return results.failure([error], input);\n}\n\n},{\"./errors\":112,\"./lazy-iterators\":113,\"./parsing-results\":115,\"option\":119,\"underscore\":118}],118:[function(require,module,exports){\n//     Underscore.js 1.4.4\n//     http://underscorejs.org\n//     (c) 2009-2013 Jeremy Ashkenas, DocumentCloud Inc.\n//     Underscore may be freely distributed under the MIT license.\n\n(function() {\n\n  // Baseline setup\n  // --------------\n\n  // Establish the root object, `window` in the browser, or `global` on the server.\n  var root = this;\n\n  // Save the previous value of the `_` variable.\n  var previousUnderscore = root._;\n\n  // Establish the object that gets returned to break out of a loop iteration.\n  var breaker = {};\n\n  // Save bytes in the minified (but not gzipped) version:\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n  // Create quick reference variables for speed access to core prototypes.\n  var push             = ArrayProto.push,\n      slice            = ArrayProto.slice,\n      concat           = ArrayProto.concat,\n      toString         = ObjProto.toString,\n      hasOwnProperty   = ObjProto.hasOwnProperty;\n\n  // All **ECMAScript 5** native function implementations that we hope to use\n  // are declared here.\n  var\n    nativeForEach      = ArrayProto.forEach,\n    nativeMap          = ArrayProto.map,\n    nativeReduce       = ArrayProto.reduce,\n    nativeReduceRight  = ArrayProto.reduceRight,\n    nativeFilter       = ArrayProto.filter,\n    nativeEvery        = ArrayProto.every,\n    nativeSome         = ArrayProto.some,\n    nativeIndexOf      = ArrayProto.indexOf,\n    nativeLastIndexOf  = ArrayProto.lastIndexOf,\n    nativeIsArray      = Array.isArray,\n    nativeKeys         = Object.keys,\n    nativeBind         = FuncProto.bind;\n\n  // Create a safe reference to the Underscore object for use below.\n  var _ = function(obj) {\n    if (obj instanceof _) return obj;\n    if (!(this instanceof _)) return new _(obj);\n    this._wrapped = obj;\n  };\n\n  // Export the Underscore object for **Node.js**, with\n  // backwards-compatibility for the old `require()` API. If we're in\n  // the browser, add `_` as a global object via a string identifier,\n  // for Closure Compiler \"advanced\" mode.\n  if (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports) {\n      exports = module.exports = _;\n    }\n    exports._ = _;\n  } else {\n    root._ = _;\n  }\n\n  // Current version.\n  _.VERSION = '1.4.4';\n\n  // Collection Functions\n  // --------------------\n\n  // The cornerstone, an `each` implementation, aka `forEach`.\n  // Handles objects with the built-in `forEach`, arrays, and raw objects.\n  // Delegates to **ECMAScript 5**'s native `forEach` if available.\n  var each = _.each = _.forEach = function(obj, iterator, context) {\n    if (obj == null) return;\n    if (nativeForEach && obj.forEach === nativeForEach) {\n      obj.forEach(iterator, context);\n    } else if (obj.length === +obj.length) {\n      for (var i = 0, l = obj.length; i < l; i++) {\n        if (iterator.call(context, obj[i], i, obj) === breaker) return;\n      }\n    } else {\n      for (var key in obj) {\n        if (_.has(obj, key)) {\n          if (iterator.call(context, obj[key], key, obj) === breaker) return;\n        }\n      }\n    }\n  };\n\n  // Return the results of applying the iterator to each element.\n  // Delegates to **ECMAScript 5**'s native `map` if available.\n  _.map = _.collect = function(obj, iterator, context) {\n    var results = [];\n    if (obj == null) return results;\n    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);\n    each(obj, function(value, index, list) {\n      results[results.length] = iterator.call(context, value, index, list);\n    });\n    return results;\n  };\n\n  var reduceError = 'Reduce of empty array with no initial value';\n\n  // **Reduce** builds up a single result from a list of values, aka `inject`,\n  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.\n  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {\n    var initial = arguments.length > 2;\n    if (obj == null) obj = [];\n    if (nativeReduce && obj.reduce === nativeReduce) {\n      if (context) iterator = _.bind(iterator, context);\n      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);\n    }\n    each(obj, function(value, index, list) {\n      if (!initial) {\n        memo = value;\n        initial = true;\n      } else {\n        memo = iterator.call(context, memo, value, index, list);\n      }\n    });\n    if (!initial) throw new TypeError(reduceError);\n    return memo;\n  };\n\n  // The right-associative version of reduce, also known as `foldr`.\n  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.\n  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {\n    var initial = arguments.length > 2;\n    if (obj == null) obj = [];\n    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {\n      if (context) iterator = _.bind(iterator, context);\n      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);\n    }\n    var length = obj.length;\n    if (length !== +length) {\n      var keys = _.keys(obj);\n      length = keys.length;\n    }\n    each(obj, function(value, index, list) {\n      index = keys ? keys[--length] : --length;\n      if (!initial) {\n        memo = obj[index];\n        initial = true;\n      } else {\n        memo = iterator.call(context, memo, obj[index], index, list);\n      }\n    });\n    if (!initial) throw new TypeError(reduceError);\n    return memo;\n  };\n\n  // Return the first value which passes a truth test. Aliased as `detect`.\n  _.find = _.detect = function(obj, iterator, context) {\n    var result;\n    any(obj, function(value, index, list) {\n      if (iterator.call(context, value, index, list)) {\n        result = value;\n        return true;\n      }\n    });\n    return result;\n  };\n\n  // Return all the elements that pass a truth test.\n  // Delegates to **ECMAScript 5**'s native `filter` if available.\n  // Aliased as `select`.\n  _.filter = _.select = function(obj, iterator, context) {\n    var results = [];\n    if (obj == null) return results;\n    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);\n    each(obj, function(value, index, list) {\n      if (iterator.call(context, value, index, list)) results[results.length] = value;\n    });\n    return results;\n  };\n\n  // Return all the elements for which a truth test fails.\n  _.reject = function(obj, iterator, context) {\n    return _.filter(obj, function(value, index, list) {\n      return !iterator.call(context, value, index, list);\n    }, context);\n  };\n\n  // Determine whether all of the elements match a truth test.\n  // Delegates to **ECMAScript 5**'s native `every` if available.\n  // Aliased as `all`.\n  _.every = _.all = function(obj, iterator, context) {\n    iterator || (iterator = _.identity);\n    var result = true;\n    if (obj == null) return result;\n    if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);\n    each(obj, function(value, index, list) {\n      if (!(result = result && iterator.call(context, value, index, list))) return breaker;\n    });\n    return !!result;\n  };\n\n  // Determine if at least one element in the object matches a truth test.\n  // Delegates to **ECMAScript 5**'s native `some` if available.\n  // Aliased as `any`.\n  var any = _.some = _.any = function(obj, iterator, context) {\n    iterator || (iterator = _.identity);\n    var result = false;\n    if (obj == null) return result;\n    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);\n    each(obj, function(value, index, list) {\n      if (result || (result = iterator.call(context, value, index, list))) return breaker;\n    });\n    return !!result;\n  };\n\n  // Determine if the array or object contains a given value (using `===`).\n  // Aliased as `include`.\n  _.contains = _.include = function(obj, target) {\n    if (obj == null) return false;\n    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;\n    return any(obj, function(value) {\n      return value === target;\n    });\n  };\n\n  // Invoke a method (with arguments) on every item in a collection.\n  _.invoke = function(obj, method) {\n    var args = slice.call(arguments, 2);\n    var isFunc = _.isFunction(method);\n    return _.map(obj, function(value) {\n      return (isFunc ? method : value[method]).apply(value, args);\n    });\n  };\n\n  // Convenience version of a common use case of `map`: fetching a property.\n  _.pluck = function(obj, key) {\n    return _.map(obj, function(value){ return value[key]; });\n  };\n\n  // Convenience version of a common use case of `filter`: selecting only objects\n  // containing specific `key:value` pairs.\n  _.where = function(obj, attrs, first) {\n    if (_.isEmpty(attrs)) return first ? null : [];\n    return _[first ? 'find' : 'filter'](obj, function(value) {\n      for (var key in attrs) {\n        if (attrs[key] !== value[key]) return false;\n      }\n      return true;\n    });\n  };\n\n  // Convenience version of a common use case of `find`: getting the first object\n  // containing specific `key:value` pairs.\n  _.findWhere = function(obj, attrs) {\n    return _.where(obj, attrs, true);\n  };\n\n  // Return the maximum element or (element-based computation).\n  // Can't optimize arrays of integers longer than 65,535 elements.\n  // See: https://bugs.webkit.org/show_bug.cgi?id=80797\n  _.max = function(obj, iterator, context) {\n    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {\n      return Math.max.apply(Math, obj);\n    }\n    if (!iterator && _.isEmpty(obj)) return -Infinity;\n    var result = {computed : -Infinity, value: -Infinity};\n    each(obj, function(value, index, list) {\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\n      computed >= result.computed && (result = {value : value, computed : computed});\n    });\n    return result.value;\n  };\n\n  // Return the minimum element (or element-based computation).\n  _.min = function(obj, iterator, context) {\n    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {\n      return Math.min.apply(Math, obj);\n    }\n    if (!iterator && _.isEmpty(obj)) return Infinity;\n    var result = {computed : Infinity, value: Infinity};\n    each(obj, function(value, index, list) {\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\n      computed < result.computed && (result = {value : value, computed : computed});\n    });\n    return result.value;\n  };\n\n  // Shuffle an array.\n  _.shuffle = function(obj) {\n    var rand;\n    var index = 0;\n    var shuffled = [];\n    each(obj, function(value) {\n      rand = _.random(index++);\n      shuffled[index - 1] = shuffled[rand];\n      shuffled[rand] = value;\n    });\n    return shuffled;\n  };\n\n  // An internal function to generate lookup iterators.\n  var lookupIterator = function(value) {\n    return _.isFunction(value) ? value : function(obj){ return obj[value]; };\n  };\n\n  // Sort the object's values by a criterion produced by an iterator.\n  _.sortBy = function(obj, value, context) {\n    var iterator = lookupIterator(value);\n    return _.pluck(_.map(obj, function(value, index, list) {\n      return {\n        value : value,\n        index : index,\n        criteria : iterator.call(context, value, index, list)\n      };\n    }).sort(function(left, right) {\n      var a = left.criteria;\n      var b = right.criteria;\n      if (a !== b) {\n        if (a > b || a === void 0) return 1;\n        if (a < b || b === void 0) return -1;\n      }\n      return left.index < right.index ? -1 : 1;\n    }), 'value');\n  };\n\n  // An internal function used for aggregate \"group by\" operations.\n  var group = function(obj, value, context, behavior) {\n    var result = {};\n    var iterator = lookupIterator(value || _.identity);\n    each(obj, function(value, index) {\n      var key = iterator.call(context, value, index, obj);\n      behavior(result, key, value);\n    });\n    return result;\n  };\n\n  // Groups the object's values by a criterion. Pass either a string attribute\n  // to group by, or a function that returns the criterion.\n  _.groupBy = function(obj, value, context) {\n    return group(obj, value, context, function(result, key, value) {\n      (_.has(result, key) ? result[key] : (result[key] = [])).push(value);\n    });\n  };\n\n  // Counts instances of an object that group by a certain criterion. Pass\n  // either a string attribute to count by, or a function that returns the\n  // criterion.\n  _.countBy = function(obj, value, context) {\n    return group(obj, value, context, function(result, key) {\n      if (!_.has(result, key)) result[key] = 0;\n      result[key]++;\n    });\n  };\n\n  // Use a comparator function to figure out the smallest index at which\n  // an object should be inserted so as to maintain order. Uses binary search.\n  _.sortedIndex = function(array, obj, iterator, context) {\n    iterator = iterator == null ? _.identity : lookupIterator(iterator);\n    var value = iterator.call(context, obj);\n    var low = 0, high = array.length;\n    while (low < high) {\n      var mid = (low + high) >>> 1;\n      iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;\n    }\n    return low;\n  };\n\n  // Safely convert anything iterable into a real, live array.\n  _.toArray = function(obj) {\n    if (!obj) return [];\n    if (_.isArray(obj)) return slice.call(obj);\n    if (obj.length === +obj.length) return _.map(obj, _.identity);\n    return _.values(obj);\n  };\n\n  // Return the number of elements in an object.\n  _.size = function(obj) {\n    if (obj == null) return 0;\n    return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;\n  };\n\n  // Array Functions\n  // ---------------\n\n  // Get the first element of an array. Passing **n** will return the first N\n  // values in the array. Aliased as `head` and `take`. The **guard** check\n  // allows it to work with `_.map`.\n  _.first = _.head = _.take = function(array, n, guard) {\n    if (array == null) return void 0;\n    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];\n  };\n\n  // Returns everything but the last entry of the array. Especially useful on\n  // the arguments object. Passing **n** will return all the values in\n  // the array, excluding the last N. The **guard** check allows it to work with\n  // `_.map`.\n  _.initial = function(array, n, guard) {\n    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));\n  };\n\n  // Get the last element of an array. Passing **n** will return the last N\n  // values in the array. The **guard** check allows it to work with `_.map`.\n  _.last = function(array, n, guard) {\n    if (array == null) return void 0;\n    if ((n != null) && !guard) {\n      return slice.call(array, Math.max(array.length - n, 0));\n    } else {\n      return array[array.length - 1];\n    }\n  };\n\n  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.\n  // Especially useful on the arguments object. Passing an **n** will return\n  // the rest N values in the array. The **guard**\n  // check allows it to work with `_.map`.\n  _.rest = _.tail = _.drop = function(array, n, guard) {\n    return slice.call(array, (n == null) || guard ? 1 : n);\n  };\n\n  // Trim out all falsy values from an array.\n  _.compact = function(array) {\n    return _.filter(array, _.identity);\n  };\n\n  // Internal implementation of a recursive `flatten` function.\n  var flatten = function(input, shallow, output) {\n    each(input, function(value) {\n      if (_.isArray(value)) {\n        shallow ? push.apply(output, value) : flatten(value, shallow, output);\n      } else {\n        output.push(value);\n      }\n    });\n    return output;\n  };\n\n  // Return a completely flattened version of an array.\n  _.flatten = function(array, shallow) {\n    return flatten(array, shallow, []);\n  };\n\n  // Return a version of the array that does not contain the specified value(s).\n  _.without = function(array) {\n    return _.difference(array, slice.call(arguments, 1));\n  };\n\n  // Produce a duplicate-free version of the array. If the array has already\n  // been sorted, you have the option of using a faster algorithm.\n  // Aliased as `unique`.\n  _.uniq = _.unique = function(array, isSorted, iterator, context) {\n    if (_.isFunction(isSorted)) {\n      context = iterator;\n      iterator = isSorted;\n      isSorted = false;\n    }\n    var initial = iterator ? _.map(array, iterator, context) : array;\n    var results = [];\n    var seen = [];\n    each(initial, function(value, index) {\n      if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {\n        seen.push(value);\n        results.push(array[index]);\n      }\n    });\n    return results;\n  };\n\n  // Produce an array that contains the union: each distinct element from all of\n  // the passed-in arrays.\n  _.union = function() {\n    return _.uniq(concat.apply(ArrayProto, arguments));\n  };\n\n  // Produce an array that contains every item shared between all the\n  // passed-in arrays.\n  _.intersection = function(array) {\n    var rest = slice.call(arguments, 1);\n    return _.filter(_.uniq(array), function(item) {\n      return _.every(rest, function(other) {\n        return _.indexOf(other, item) >= 0;\n      });\n    });\n  };\n\n  // Take the difference between one array and a number of other arrays.\n  // Only the elements present in just the first array will remain.\n  _.difference = function(array) {\n    var rest = concat.apply(ArrayProto, slice.call(arguments, 1));\n    return _.filter(array, function(value){ return !_.contains(rest, value); });\n  };\n\n  // Zip together multiple lists into a single array -- elements that share\n  // an index go together.\n  _.zip = function() {\n    var args = slice.call(arguments);\n    var length = _.max(_.pluck(args, 'length'));\n    var results = new Array(length);\n    for (var i = 0; i < length; i++) {\n      results[i] = _.pluck(args, \"\" + i);\n    }\n    return results;\n  };\n\n  // Converts lists into objects. Pass either a single array of `[key, value]`\n  // pairs, or two parallel arrays of the same length -- one of keys, and one of\n  // the corresponding values.\n  _.object = function(list, values) {\n    if (list == null) return {};\n    var result = {};\n    for (var i = 0, l = list.length; i < l; i++) {\n      if (values) {\n        result[list[i]] = values[i];\n      } else {\n        result[list[i][0]] = list[i][1];\n      }\n    }\n    return result;\n  };\n\n  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),\n  // we need this function. Return the position of the first occurrence of an\n  // item in an array, or -1 if the item is not included in the array.\n  // Delegates to **ECMAScript 5**'s native `indexOf` if available.\n  // If the array is large and already in sort order, pass `true`\n  // for **isSorted** to use binary search.\n  _.indexOf = function(array, item, isSorted) {\n    if (array == null) return -1;\n    var i = 0, l = array.length;\n    if (isSorted) {\n      if (typeof isSorted == 'number') {\n        i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);\n      } else {\n        i = _.sortedIndex(array, item);\n        return array[i] === item ? i : -1;\n      }\n    }\n    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);\n    for (; i < l; i++) if (array[i] === item) return i;\n    return -1;\n  };\n\n  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.\n  _.lastIndexOf = function(array, item, from) {\n    if (array == null) return -1;\n    var hasIndex = from != null;\n    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {\n      return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);\n    }\n    var i = (hasIndex ? from : array.length);\n    while (i--) if (array[i] === item) return i;\n    return -1;\n  };\n\n  // Generate an integer Array containing an arithmetic progression. A port of\n  // the native Python `range()` function. See\n  // [the Python documentation](http://docs.python.org/library/functions.html#range).\n  _.range = function(start, stop, step) {\n    if (arguments.length <= 1) {\n      stop = start || 0;\n      start = 0;\n    }\n    step = arguments[2] || 1;\n\n    var len = Math.max(Math.ceil((stop - start) / step), 0);\n    var idx = 0;\n    var range = new Array(len);\n\n    while(idx < len) {\n      range[idx++] = start;\n      start += step;\n    }\n\n    return range;\n  };\n\n  // Function (ahem) Functions\n  // ------------------\n\n  // Create a function bound to a given object (assigning `this`, and arguments,\n  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n  // available.\n  _.bind = function(func, context) {\n    if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n    var args = slice.call(arguments, 2);\n    return function() {\n      return func.apply(context, args.concat(slice.call(arguments)));\n    };\n  };\n\n  // Partially apply a function by creating a version that has had some of its\n  // arguments pre-filled, without changing its dynamic `this` context.\n  _.partial = function(func) {\n    var args = slice.call(arguments, 1);\n    return function() {\n      return func.apply(this, args.concat(slice.call(arguments)));\n    };\n  };\n\n  // Bind all of an object's methods to that object. Useful for ensuring that\n  // all callbacks defined on an object belong to it.\n  _.bindAll = function(obj) {\n    var funcs = slice.call(arguments, 1);\n    if (funcs.length === 0) funcs = _.functions(obj);\n    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });\n    return obj;\n  };\n\n  // Memoize an expensive function by storing its results.\n  _.memoize = function(func, hasher) {\n    var memo = {};\n    hasher || (hasher = _.identity);\n    return function() {\n      var key = hasher.apply(this, arguments);\n      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));\n    };\n  };\n\n  // Delays a function for the given number of milliseconds, and then calls\n  // it with the arguments supplied.\n  _.delay = function(func, wait) {\n    var args = slice.call(arguments, 2);\n    return setTimeout(function(){ return func.apply(null, args); }, wait);\n  };\n\n  // Defers a function, scheduling it to run after the current call stack has\n  // cleared.\n  _.defer = function(func) {\n    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));\n  };\n\n  // Returns a function, that, when invoked, will only be triggered at most once\n  // during a given window of time.\n  _.throttle = function(func, wait) {\n    var context, args, timeout, result;\n    var previous = 0;\n    var later = function() {\n      previous = new Date;\n      timeout = null;\n      result = func.apply(context, args);\n    };\n    return function() {\n      var now = new Date;\n      var remaining = wait - (now - previous);\n      context = this;\n      args = arguments;\n      if (remaining <= 0) {\n        clearTimeout(timeout);\n        timeout = null;\n        previous = now;\n        result = func.apply(context, args);\n      } else if (!timeout) {\n        timeout = setTimeout(later, remaining);\n      }\n      return result;\n    };\n  };\n\n  // Returns a function, that, as long as it continues to be invoked, will not\n  // be triggered. The function will be called after it stops being called for\n  // N milliseconds. If `immediate` is passed, trigger the function on the\n  // leading edge, instead of the trailing.\n  _.debounce = function(func, wait, immediate) {\n    var timeout, result;\n    return function() {\n      var context = this, args = arguments;\n      var later = function() {\n        timeout = null;\n        if (!immediate) result = func.apply(context, args);\n      };\n      var callNow = immediate && !timeout;\n      clearTimeout(timeout);\n      timeout = setTimeout(later, wait);\n      if (callNow) result = func.apply(context, args);\n      return result;\n    };\n  };\n\n  // Returns a function that will be executed at most one time, no matter how\n  // often you call it. Useful for lazy initialization.\n  _.once = function(func) {\n    var ran = false, memo;\n    return function() {\n      if (ran) return memo;\n      ran = true;\n      memo = func.apply(this, arguments);\n      func = null;\n      return memo;\n    };\n  };\n\n  // Returns the first function passed as an argument to the second,\n  // allowing you to adjust arguments, run code before and after, and\n  // conditionally execute the original function.\n  _.wrap = function(func, wrapper) {\n    return function() {\n      var args = [func];\n      push.apply(args, arguments);\n      return wrapper.apply(this, args);\n    };\n  };\n\n  // Returns a function that is the composition of a list of functions, each\n  // consuming the return value of the function that follows.\n  _.compose = function() {\n    var funcs = arguments;\n    return function() {\n      var args = arguments;\n      for (var i = funcs.length - 1; i >= 0; i--) {\n        args = [funcs[i].apply(this, args)];\n      }\n      return args[0];\n    };\n  };\n\n  // Returns a function that will only be executed after being called N times.\n  _.after = function(times, func) {\n    if (times <= 0) return func();\n    return function() {\n      if (--times < 1) {\n        return func.apply(this, arguments);\n      }\n    };\n  };\n\n  // Object Functions\n  // ----------------\n\n  // Retrieve the names of an object's properties.\n  // Delegates to **ECMAScript 5**'s native `Object.keys`\n  _.keys = nativeKeys || function(obj) {\n    if (obj !== Object(obj)) throw new TypeError('Invalid object');\n    var keys = [];\n    for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;\n    return keys;\n  };\n\n  // Retrieve the values of an object's properties.\n  _.values = function(obj) {\n    var values = [];\n    for (var key in obj) if (_.has(obj, key)) values.push(obj[key]);\n    return values;\n  };\n\n  // Convert an object into a list of `[key, value]` pairs.\n  _.pairs = function(obj) {\n    var pairs = [];\n    for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]);\n    return pairs;\n  };\n\n  // Invert the keys and values of an object. The values must be serializable.\n  _.invert = function(obj) {\n    var result = {};\n    for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key;\n    return result;\n  };\n\n  // Return a sorted list of the function names available on the object.\n  // Aliased as `methods`\n  _.functions = _.methods = function(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (_.isFunction(obj[key])) names.push(key);\n    }\n    return names.sort();\n  };\n\n  // Extend a given object with all the properties in passed-in object(s).\n  _.extend = function(obj) {\n    each(slice.call(arguments, 1), function(source) {\n      if (source) {\n        for (var prop in source) {\n          obj[prop] = source[prop];\n        }\n      }\n    });\n    return obj;\n  };\n\n  // Return a copy of the object only containing the whitelisted properties.\n  _.pick = function(obj) {\n    var copy = {};\n    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));\n    each(keys, function(key) {\n      if (key in obj) copy[key] = obj[key];\n    });\n    return copy;\n  };\n\n   // Return a copy of the object without the blacklisted properties.\n  _.omit = function(obj) {\n    var copy = {};\n    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));\n    for (var key in obj) {\n      if (!_.contains(keys, key)) copy[key] = obj[key];\n    }\n    return copy;\n  };\n\n  // Fill in a given object with default properties.\n  _.defaults = function(obj) {\n    each(slice.call(arguments, 1), function(source) {\n      if (source) {\n        for (var prop in source) {\n          if (obj[prop] == null) obj[prop] = source[prop];\n        }\n      }\n    });\n    return obj;\n  };\n\n  // Create a (shallow-cloned) duplicate of an object.\n  _.clone = function(obj) {\n    if (!_.isObject(obj)) return obj;\n    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n  };\n\n  // Invokes interceptor with the obj, and then returns obj.\n  // The primary purpose of this method is to \"tap into\" a method chain, in\n  // order to perform operations on intermediate results within the chain.\n  _.tap = function(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  };\n\n  // Internal recursive comparison function for `isEqual`.\n  var eq = function(a, b, aStack, bStack) {\n    // Identical objects are equal. `0 === -0`, but they aren't identical.\n    // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.\n    if (a === b) return a !== 0 || 1 / a == 1 / b;\n    // A strict comparison is necessary because `null == undefined`.\n    if (a == null || b == null) return a === b;\n    // Unwrap any wrapped objects.\n    if (a instanceof _) a = a._wrapped;\n    if (b instanceof _) b = b._wrapped;\n    // Compare `[[Class]]` names.\n    var className = toString.call(a);\n    if (className != toString.call(b)) return false;\n    switch (className) {\n      // Strings, numbers, dates, and booleans are compared by value.\n      case '[object String]':\n        // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n        // equivalent to `new String(\"5\")`.\n        return a == String(b);\n      case '[object Number]':\n        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for\n        // other numeric values.\n        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);\n      case '[object Date]':\n      case '[object Boolean]':\n        // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n        // millisecond representations. Note that invalid dates with millisecond representations\n        // of `NaN` are not equivalent.\n        return +a == +b;\n      // RegExps are compared by their source patterns and flags.\n      case '[object RegExp]':\n        return a.source == b.source &&\n               a.global == b.global &&\n               a.multiline == b.multiline &&\n               a.ignoreCase == b.ignoreCase;\n    }\n    if (typeof a != 'object' || typeof b != 'object') return false;\n    // Assume equality for cyclic structures. The algorithm for detecting cyclic\n    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n    var length = aStack.length;\n    while (length--) {\n      // Linear search. Performance is inversely proportional to the number of\n      // unique nested structures.\n      if (aStack[length] == a) return bStack[length] == b;\n    }\n    // Add the first object to the stack of traversed objects.\n    aStack.push(a);\n    bStack.push(b);\n    var size = 0, result = true;\n    // Recursively compare objects and arrays.\n    if (className == '[object Array]') {\n      // Compare array lengths to determine if a deep comparison is necessary.\n      size = a.length;\n      result = size == b.length;\n      if (result) {\n        // Deep compare the contents, ignoring non-numeric properties.\n        while (size--) {\n          if (!(result = eq(a[size], b[size], aStack, bStack))) break;\n        }\n      }\n    } else {\n      // Objects with different constructors are not equivalent, but `Object`s\n      // from different frames are.\n      var aCtor = a.constructor, bCtor = b.constructor;\n      if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&\n                               _.isFunction(bCtor) && (bCtor instanceof bCtor))) {\n        return false;\n      }\n      // Deep compare objects.\n      for (var key in a) {\n        if (_.has(a, key)) {\n          // Count the expected number of properties.\n          size++;\n          // Deep compare each member.\n          if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;\n        }\n      }\n      // Ensure that both objects contain the same number of properties.\n      if (result) {\n        for (key in b) {\n          if (_.has(b, key) && !(size--)) break;\n        }\n        result = !size;\n      }\n    }\n    // Remove the first object from the stack of traversed objects.\n    aStack.pop();\n    bStack.pop();\n    return result;\n  };\n\n  // Perform a deep comparison to check if two objects are equal.\n  _.isEqual = function(a, b) {\n    return eq(a, b, [], []);\n  };\n\n  // Is a given array, string, or object empty?\n  // An \"empty\" object has no enumerable own-properties.\n  _.isEmpty = function(obj) {\n    if (obj == null) return true;\n    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;\n    for (var key in obj) if (_.has(obj, key)) return false;\n    return true;\n  };\n\n  // Is a given value a DOM element?\n  _.isElement = function(obj) {\n    return !!(obj && obj.nodeType === 1);\n  };\n\n  // Is a given value an array?\n  // Delegates to ECMA5's native Array.isArray\n  _.isArray = nativeIsArray || function(obj) {\n    return toString.call(obj) == '[object Array]';\n  };\n\n  // Is a given variable an object?\n  _.isObject = function(obj) {\n    return obj === Object(obj);\n  };\n\n  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.\n  each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {\n    _['is' + name] = function(obj) {\n      return toString.call(obj) == '[object ' + name + ']';\n    };\n  });\n\n  // Define a fallback version of the method in browsers (ahem, IE), where\n  // there isn't any inspectable \"Arguments\" type.\n  if (!_.isArguments(arguments)) {\n    _.isArguments = function(obj) {\n      return !!(obj && _.has(obj, 'callee'));\n    };\n  }\n\n  // Optimize `isFunction` if appropriate.\n  if (typeof (/./) !== 'function') {\n    _.isFunction = function(obj) {\n      return typeof obj === 'function';\n    };\n  }\n\n  // Is a given object a finite number?\n  _.isFinite = function(obj) {\n    return isFinite(obj) && !isNaN(parseFloat(obj));\n  };\n\n  // Is the given value `NaN`? (NaN is the only number which does not equal itself).\n  _.isNaN = function(obj) {\n    return _.isNumber(obj) && obj != +obj;\n  };\n\n  // Is a given value a boolean?\n  _.isBoolean = function(obj) {\n    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';\n  };\n\n  // Is a given value equal to null?\n  _.isNull = function(obj) {\n    return obj === null;\n  };\n\n  // Is a given variable undefined?\n  _.isUndefined = function(obj) {\n    return obj === void 0;\n  };\n\n  // Shortcut function for checking if an object has a given property directly\n  // on itself (in other words, not on a prototype).\n  _.has = function(obj, key) {\n    return hasOwnProperty.call(obj, key);\n  };\n\n  // Utility Functions\n  // -----------------\n\n  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\n  // previous owner. Returns a reference to the Underscore object.\n  _.noConflict = function() {\n    root._ = previousUnderscore;\n    return this;\n  };\n\n  // Keep the identity function around for default iterators.\n  _.identity = function(value) {\n    return value;\n  };\n\n  // Run a function **n** times.\n  _.times = function(n, iterator, context) {\n    var accum = Array(n);\n    for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);\n    return accum;\n  };\n\n  // Return a random integer between min and max (inclusive).\n  _.random = function(min, max) {\n    if (max == null) {\n      max = min;\n      min = 0;\n    }\n    return min + Math.floor(Math.random() * (max - min + 1));\n  };\n\n  // List of HTML entities for escaping.\n  var entityMap = {\n    escape: {\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      \"'\": '&#x27;',\n      '/': '&#x2F;'\n    }\n  };\n  entityMap.unescape = _.invert(entityMap.escape);\n\n  // Regexes containing the keys and values listed immediately above.\n  var entityRegexes = {\n    escape:   new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),\n    unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')\n  };\n\n  // Functions for escaping and unescaping strings to/from HTML interpolation.\n  _.each(['escape', 'unescape'], function(method) {\n    _[method] = function(string) {\n      if (string == null) return '';\n      return ('' + string).replace(entityRegexes[method], function(match) {\n        return entityMap[method][match];\n      });\n    };\n  });\n\n  // If the value of the named property is a function then invoke it;\n  // otherwise, return it.\n  _.result = function(object, property) {\n    if (object == null) return null;\n    var value = object[property];\n    return _.isFunction(value) ? value.call(object) : value;\n  };\n\n  // Add your own custom functions to the Underscore object.\n  _.mixin = function(obj) {\n    each(_.functions(obj), function(name){\n      var func = _[name] = obj[name];\n      _.prototype[name] = function() {\n        var args = [this._wrapped];\n        push.apply(args, arguments);\n        return result.call(this, func.apply(_, args));\n      };\n    });\n  };\n\n  // Generate a unique integer id (unique within the entire client session).\n  // Useful for temporary DOM ids.\n  var idCounter = 0;\n  _.uniqueId = function(prefix) {\n    var id = ++idCounter + '';\n    return prefix ? prefix + id : id;\n  };\n\n  // By default, Underscore uses ERB-style template delimiters, change the\n  // following template settings to use alternative delimiters.\n  _.templateSettings = {\n    evaluate    : /<%([\\s\\S]+?)%>/g,\n    interpolate : /<%=([\\s\\S]+?)%>/g,\n    escape      : /<%-([\\s\\S]+?)%>/g\n  };\n\n  // When customizing `templateSettings`, if you don't want to define an\n  // interpolation, evaluation or escaping regex, we need one that is\n  // guaranteed not to match.\n  var noMatch = /(.)^/;\n\n  // Certain characters need to be escaped so that they can be put into a\n  // string literal.\n  var escapes = {\n    \"'\":      \"'\",\n    '\\\\':     '\\\\',\n    '\\r':     'r',\n    '\\n':     'n',\n    '\\t':     't',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  var escaper = /\\\\|'|\\r|\\n|\\t|\\u2028|\\u2029/g;\n\n  // JavaScript micro-templating, similar to John Resig's implementation.\n  // Underscore templating handles arbitrary delimiters, preserves whitespace,\n  // and correctly escapes quotes within interpolated code.\n  _.template = function(text, data, settings) {\n    var render;\n    settings = _.defaults({}, settings, _.templateSettings);\n\n    // Combine delimiters into one regular expression via alternation.\n    var matcher = new RegExp([\n      (settings.escape || noMatch).source,\n      (settings.interpolate || noMatch).source,\n      (settings.evaluate || noMatch).source\n    ].join('|') + '|$', 'g');\n\n    // Compile the template source, escaping string literals appropriately.\n    var index = 0;\n    var source = \"__p+='\";\n    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n      source += text.slice(index, offset)\n        .replace(escaper, function(match) { return '\\\\' + escapes[match]; });\n\n      if (escape) {\n        source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n      }\n      if (interpolate) {\n        source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n      }\n      if (evaluate) {\n        source += \"';\\n\" + evaluate + \"\\n__p+='\";\n      }\n      index = offset + match.length;\n      return match;\n    });\n    source += \"';\\n\";\n\n    // If a variable is not specified, place data values in local scope.\n    if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n    source = \"var __t,__p='',__j=Array.prototype.join,\" +\n      \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n      source + \"return __p;\\n\";\n\n    try {\n      render = new Function(settings.variable || 'obj', '_', source);\n    } catch (e) {\n      e.source = source;\n      throw e;\n    }\n\n    if (data) return render(data, _);\n    var template = function(data) {\n      return render.call(this, data, _);\n    };\n\n    // Provide the compiled function source as a convenience for precompilation.\n    template.source = 'function(' + (settings.variable || 'obj') + '){\\n' + source + '}';\n\n    return template;\n  };\n\n  // Add a \"chain\" function, which will delegate to the wrapper.\n  _.chain = function(obj) {\n    return _(obj).chain();\n  };\n\n  // OOP\n  // ---------------\n  // If Underscore is called as a function, it returns a wrapped object that\n  // can be used OO-style. This wrapper holds altered versions of all the\n  // underscore functions. Wrapped objects may be chained.\n\n  // Helper function to continue chaining intermediate results.\n  var result = function(obj) {\n    return this._chain ? _(obj).chain() : obj;\n  };\n\n  // Add all of the Underscore functions to the wrapper object.\n  _.mixin(_);\n\n  // Add all mutator Array functions to the wrapper.\n  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      var obj = this._wrapped;\n      method.apply(obj, arguments);\n      if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];\n      return result.call(this, obj);\n    };\n  });\n\n  // Add all accessor Array functions to the wrapper.\n  each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      return result.call(this, method.apply(this._wrapped, arguments));\n    };\n  });\n\n  _.extend(_.prototype, {\n\n    // Start chaining a wrapped Underscore object.\n    chain: function() {\n      this._chain = true;\n      return this;\n    },\n\n    // Extracts the result from a wrapped and chained object.\n    value: function() {\n      return this._wrapped;\n    }\n\n  });\n\n}).call(this);\n\n},{}],119:[function(require,module,exports){\nexports.none = Object.create({\n    value: function() {\n        throw new Error('Called value on none');\n    },\n    isNone: function() {\n        return true;\n    },\n    isSome: function() {\n        return false;\n    },\n    map: function() {\n        return exports.none;\n    },\n    flatMap: function() {\n        return exports.none;\n    },\n    toArray: function() {\n        return [];\n    },\n    orElse: callOrReturn,\n    valueOrElse: callOrReturn\n});\n\nfunction callOrReturn(value) {\n    if (typeof(value) == \"function\") {\n        return value();\n    } else {\n        return value;\n    }\n}\n\nexports.some = function(value) {\n    return new Some(value);\n};\n\nvar Some = function(value) {\n    this._value = value;\n};\n\nSome.prototype.value = function() {\n    return this._value;\n};\n\nSome.prototype.isNone = function() {\n    return false;\n};\n\nSome.prototype.isSome = function() {\n    return true;\n};\n\nSome.prototype.map = function(func) {\n    return new Some(func(this._value));\n};\n\nSome.prototype.flatMap = function(func) {\n    return func(this._value);\n};\n\nSome.prototype.toArray = function() {\n    return [this._value];\n};\n\nSome.prototype.orElse = function(value) {\n    return this;\n};\n\nSome.prototype.valueOrElse = function(value) {\n    return this._value;\n};\n\nexports.isOption = function(value) {\n    return value === exports.none || value instanceof Some;\n};\n\nexports.fromNullable = function(value) {\n    if (value == null) {\n        return exports.none;\n    }\n    return new Some(value);\n}\n\n},{}],120:[function(require,module,exports){\n// Top level file is just a mixin of submodules & constants\n'use strict';\n\nvar assign    = require('./lib/utils/common').assign;\n\nvar deflate   = require('./lib/deflate');\nvar inflate   = require('./lib/inflate');\nvar constants = require('./lib/zlib/constants');\n\nvar pako = {};\n\nassign(pako, deflate, inflate, constants);\n\nmodule.exports = pako;\n\n},{\"./lib/deflate\":121,\"./lib/inflate\":122,\"./lib/utils/common\":123,\"./lib/zlib/constants\":126}],121:[function(require,module,exports){\n'use strict';\n\n\nvar zlib_deflate = require('./zlib/deflate');\nvar utils        = require('./utils/common');\nvar strings      = require('./utils/strings');\nvar msg          = require('./zlib/messages');\nvar ZStream      = require('./zlib/zstream');\n\nvar toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nvar Z_NO_FLUSH      = 0;\nvar Z_FINISH        = 4;\n\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\nvar Z_SYNC_FLUSH    = 2;\n\nvar Z_DEFAULT_COMPRESSION = -1;\n\nvar Z_DEFAULT_STRATEGY    = 0;\n\nvar Z_DEFLATED  = 8;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overriden.\n **/\n\n/**\n * Deflate.result -> Uint8Array|Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param)  or if you\n * push a chunk with explicit flush (call [[Deflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n *    (each char code [0..255])\n * - `header` (Object) - custom header for gzip\n *   - `text` (Boolean) - true if compressed data believed to be text\n *   - `time` (Number) - modification time, unix timestamp\n *   - `os` (Number) - operation system code\n *   - `extra` (Array) - array of bytes with extra data (max 65536)\n *   - `name` (String) - file name (binary string)\n *   - `comment` (String) - comment (binary string)\n *   - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true);  // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate(options) {\n  if (!(this instanceof Deflate)) return new Deflate(options);\n\n  this.options = utils.assign({\n    level: Z_DEFAULT_COMPRESSION,\n    method: Z_DEFLATED,\n    chunkSize: 16384,\n    windowBits: 15,\n    memLevel: 8,\n    strategy: Z_DEFAULT_STRATEGY,\n    to: ''\n  }, options || {});\n\n  var opt = this.options;\n\n  if (opt.raw && (opt.windowBits > 0)) {\n    opt.windowBits = -opt.windowBits;\n  }\n\n  else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n    opt.windowBits += 16;\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm = new ZStream();\n  this.strm.avail_out = 0;\n\n  var status = zlib_deflate.deflateInit2(\n    this.strm,\n    opt.level,\n    opt.method,\n    opt.windowBits,\n    opt.memLevel,\n    opt.strategy\n  );\n\n  if (status !== Z_OK) {\n    throw new Error(msg[status]);\n  }\n\n  if (opt.header) {\n    zlib_deflate.deflateSetHeader(this.strm, opt.header);\n  }\n\n  if (opt.dictionary) {\n    var dict;\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      // If we need to compress text, change encoding to utf8.\n      dict = strings.string2buf(opt.dictionary);\n    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n      dict = new Uint8Array(opt.dictionary);\n    } else {\n      dict = opt.dictionary;\n    }\n\n    status = zlib_deflate.deflateSetDictionary(this.strm, dict);\n\n    if (status !== Z_OK) {\n      throw new Error(msg[status]);\n    }\n\n    this._dict_set = true;\n  }\n}\n\n/**\n * Deflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be\n *   converted to utf8 byte sequence.\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the compression context.\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * array format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nDeflate.prototype.push = function (data, mode) {\n  var strm = this.strm;\n  var chunkSize = this.options.chunkSize;\n  var status, _mode;\n\n  if (this.ended) { return false; }\n\n  _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // If we need to compress text, change encoding to utf8.\n    strm.input = strings.string2buf(data);\n  } else if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  do {\n    if (strm.avail_out === 0) {\n      strm.output = new utils.Buf8(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n    status = zlib_deflate.deflate(strm, _mode);    /* no bad return value */\n\n    if (status !== Z_STREAM_END && status !== Z_OK) {\n      this.onEnd(status);\n      this.ended = true;\n      return false;\n    }\n    if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) {\n      if (this.options.to === 'string') {\n        this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));\n      } else {\n        this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n      }\n    }\n  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);\n\n  // Finalize on the last chunk.\n  if (_mode === Z_FINISH) {\n    status = zlib_deflate.deflateEnd(this.strm);\n    this.onEnd(status);\n    this.ended = true;\n    return status === Z_OK;\n  }\n\n  // callback interim results if Z_SYNC_FLUSH.\n  if (_mode === Z_SYNC_FLUSH) {\n    this.onEnd(Z_OK);\n    strm.avail_out = 0;\n    return true;\n  }\n\n  return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): ouput data. Type of array depends\n *   on js engine support. When string output requested, each chunk\n *   will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === Z_OK) {\n    if (this.options.to === 'string') {\n      this.result = this.chunks.join('');\n    } else {\n      this.result = utils.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n *    (each char code [0..255])\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , data = Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate(input, options) {\n  var deflator = new Deflate(options);\n\n  deflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (deflator.err) { throw deflator.msg; }\n\n  return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw(input, options) {\n  options = options || {};\n  options.raw = true;\n  return deflate(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip(input, options) {\n  options = options || {};\n  options.gzip = true;\n  return deflate(input, options);\n}\n\n\nexports.Deflate = Deflate;\nexports.deflate = deflate;\nexports.deflateRaw = deflateRaw;\nexports.gzip = gzip;\n\n},{\"./utils/common\":123,\"./utils/strings\":124,\"./zlib/deflate\":128,\"./zlib/messages\":133,\"./zlib/zstream\":135}],122:[function(require,module,exports){\n'use strict';\n\n\nvar zlib_inflate = require('./zlib/inflate');\nvar utils        = require('./utils/common');\nvar strings      = require('./utils/strings');\nvar c            = require('./zlib/constants');\nvar msg          = require('./zlib/messages');\nvar ZStream      = require('./zlib/zstream');\nvar GZheader     = require('./zlib/gzheader');\n\nvar toString = Object.prototype.toString;\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overriden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you\n * push a chunk with explicit flush (call [[Inflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true);  // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate(options) {\n  if (!(this instanceof Inflate)) return new Inflate(options);\n\n  this.options = utils.assign({\n    chunkSize: 16384,\n    windowBits: 0,\n    to: ''\n  }, options || {});\n\n  var opt = this.options;\n\n  // Force window size for `raw` data, if not set directly,\n  // because we have no header for autodetect.\n  if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n    opt.windowBits = -opt.windowBits;\n    if (opt.windowBits === 0) { opt.windowBits = -15; }\n  }\n\n  // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n  if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n      !(options && options.windowBits)) {\n    opt.windowBits += 32;\n  }\n\n  // Gzip header has no info about windows size, we can do autodetect only\n  // for deflate. So, if window size not set, force it to max when gzip possible\n  if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n    // bit 3 (16) -> gzipped data\n    // bit 4 (32) -> autodetect gzip/deflate\n    if ((opt.windowBits & 15) === 0) {\n      opt.windowBits |= 15;\n    }\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm   = new ZStream();\n  this.strm.avail_out = 0;\n\n  var status  = zlib_inflate.inflateInit2(\n    this.strm,\n    opt.windowBits\n  );\n\n  if (status !== c.Z_OK) {\n    throw new Error(msg[status]);\n  }\n\n  this.header = new GZheader();\n\n  zlib_inflate.inflateGetHeader(this.strm, this.header);\n}\n\n/**\n * Inflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the decompression context.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nInflate.prototype.push = function (data, mode) {\n  var strm = this.strm;\n  var chunkSize = this.options.chunkSize;\n  var dictionary = this.options.dictionary;\n  var status, _mode;\n  var next_out_utf8, tail, utf8str;\n  var dict;\n\n  // Flag to properly process Z_BUF_ERROR on testing inflate call\n  // when we check that all output data was flushed.\n  var allowBufError = false;\n\n  if (this.ended) { return false; }\n  _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // Only binary strings can be decompressed on practice\n    strm.input = strings.binstring2buf(data);\n  } else if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  do {\n    if (strm.avail_out === 0) {\n      strm.output = new utils.Buf8(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n\n    status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);    /* no bad return value */\n\n    if (status === c.Z_NEED_DICT && dictionary) {\n      // Convert data if needed\n      if (typeof dictionary === 'string') {\n        dict = strings.string2buf(dictionary);\n      } else if (toString.call(dictionary) === '[object ArrayBuffer]') {\n        dict = new Uint8Array(dictionary);\n      } else {\n        dict = dictionary;\n      }\n\n      status = zlib_inflate.inflateSetDictionary(this.strm, dict);\n\n    }\n\n    if (status === c.Z_BUF_ERROR && allowBufError === true) {\n      status = c.Z_OK;\n      allowBufError = false;\n    }\n\n    if (status !== c.Z_STREAM_END && status !== c.Z_OK) {\n      this.onEnd(status);\n      this.ended = true;\n      return false;\n    }\n\n    if (strm.next_out) {\n      if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) {\n\n        if (this.options.to === 'string') {\n\n          next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n          tail = strm.next_out - next_out_utf8;\n          utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n          // move tail\n          strm.next_out = tail;\n          strm.avail_out = chunkSize - tail;\n          if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }\n\n          this.onData(utf8str);\n\n        } else {\n          this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n        }\n      }\n    }\n\n    // When no more input data, we should check that internal inflate buffers\n    // are flushed. The only way to do it when avail_out = 0 - run one more\n    // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.\n    // Here we set flag to process this error properly.\n    //\n    // NOTE. Deflate does not return error in this case and does not needs such\n    // logic.\n    if (strm.avail_in === 0 && strm.avail_out === 0) {\n      allowBufError = true;\n    }\n\n  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END);\n\n  if (status === c.Z_STREAM_END) {\n    _mode = c.Z_FINISH;\n  }\n\n  // Finalize on the last chunk.\n  if (_mode === c.Z_FINISH) {\n    status = zlib_inflate.inflateEnd(this.strm);\n    this.onEnd(status);\n    this.ended = true;\n    return status === c.Z_OK;\n  }\n\n  // callback interim results if Z_SYNC_FLUSH.\n  if (_mode === c.Z_SYNC_FLUSH) {\n    this.onEnd(c.Z_OK);\n    strm.avail_out = 0;\n    return true;\n  }\n\n  return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): ouput data. Type of array depends\n *   on js engine support. When string output requested, each chunk\n *   will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === c.Z_OK) {\n    if (this.options.to === 'string') {\n      // Glue & convert here, until we teach pako to send\n      // utf8 alligned strings to onData\n      this.result = this.chunks.join('');\n    } else {\n      this.result = utils.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , input = pako.deflate([1,2,3,4,5,6,7,8,9])\n *   , output;\n *\n * try {\n *   output = pako.inflate(input);\n * } catch (err)\n *   console.log(err);\n * }\n * ```\n **/\nfunction inflate(input, options) {\n  var inflator = new Inflate(options);\n\n  inflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (inflator.err) { throw inflator.msg; }\n\n  return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw(input, options) {\n  options = options || {};\n  options.raw = true;\n  return inflate(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nexports.Inflate = Inflate;\nexports.inflate = inflate;\nexports.inflateRaw = inflateRaw;\nexports.ungzip  = inflate;\n\n},{\"./utils/common\":123,\"./utils/strings\":124,\"./zlib/constants\":126,\"./zlib/gzheader\":129,\"./zlib/inflate\":131,\"./zlib/messages\":133,\"./zlib/zstream\":135}],123:[function(require,module,exports){\n'use strict';\n\n\nvar TYPED_OK =  (typeof Uint8Array !== 'undefined') &&\n                (typeof Uint16Array !== 'undefined') &&\n                (typeof Int32Array !== 'undefined');\n\n\nexports.assign = function (obj /*from1, from2, from3, ...*/) {\n  var sources = Array.prototype.slice.call(arguments, 1);\n  while (sources.length) {\n    var source = sources.shift();\n    if (!source) { continue; }\n\n    if (typeof source !== 'object') {\n      throw new TypeError(source + 'must be non-object');\n    }\n\n    for (var p in source) {\n      if (source.hasOwnProperty(p)) {\n        obj[p] = source[p];\n      }\n    }\n  }\n\n  return obj;\n};\n\n\n// reduce buffer size, avoiding mem copy\nexports.shrinkBuf = function (buf, size) {\n  if (buf.length === size) { return buf; }\n  if (buf.subarray) { return buf.subarray(0, size); }\n  buf.length = size;\n  return buf;\n};\n\n\nvar fnTyped = {\n  arraySet: function (dest, src, src_offs, len, dest_offs) {\n    if (src.subarray && dest.subarray) {\n      dest.set(src.subarray(src_offs, src_offs + len), dest_offs);\n      return;\n    }\n    // Fallback to ordinary array\n    for (var i = 0; i < len; i++) {\n      dest[dest_offs + i] = src[src_offs + i];\n    }\n  },\n  // Join array of chunks to single array.\n  flattenChunks: function (chunks) {\n    var i, l, len, pos, chunk, result;\n\n    // calculate data length\n    len = 0;\n    for (i = 0, l = chunks.length; i < l; i++) {\n      len += chunks[i].length;\n    }\n\n    // join chunks\n    result = new Uint8Array(len);\n    pos = 0;\n    for (i = 0, l = chunks.length; i < l; i++) {\n      chunk = chunks[i];\n      result.set(chunk, pos);\n      pos += chunk.length;\n    }\n\n    return result;\n  }\n};\n\nvar fnUntyped = {\n  arraySet: function (dest, src, src_offs, len, dest_offs) {\n    for (var i = 0; i < len; i++) {\n      dest[dest_offs + i] = src[src_offs + i];\n    }\n  },\n  // Join array of chunks to single array.\n  flattenChunks: function (chunks) {\n    return [].concat.apply([], chunks);\n  }\n};\n\n\n// Enable/Disable typed arrays use, for testing\n//\nexports.setTyped = function (on) {\n  if (on) {\n    exports.Buf8  = Uint8Array;\n    exports.Buf16 = Uint16Array;\n    exports.Buf32 = Int32Array;\n    exports.assign(exports, fnTyped);\n  } else {\n    exports.Buf8  = Array;\n    exports.Buf16 = Array;\n    exports.Buf32 = Array;\n    exports.assign(exports, fnUntyped);\n  }\n};\n\nexports.setTyped(TYPED_OK);\n\n},{}],124:[function(require,module,exports){\n// String encode/decode helpers\n'use strict';\n\n\nvar utils = require('./common');\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safary\n//\nvar STR_APPLY_OK = true;\nvar STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; }\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nvar _utf8len = new utils.Buf8(256);\nfor (var q = 0; q < 256; q++) {\n  _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nexports.string2buf = function (str) {\n  var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n  // count binary size\n  for (m_pos = 0; m_pos < str_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n  }\n\n  // allocate buffer\n  buf = new utils.Buf8(buf_len);\n\n  // convert\n  for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    if (c < 0x80) {\n      /* one byte */\n      buf[i++] = c;\n    } else if (c < 0x800) {\n      /* two bytes */\n      buf[i++] = 0xC0 | (c >>> 6);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else if (c < 0x10000) {\n      /* three bytes */\n      buf[i++] = 0xE0 | (c >>> 12);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else {\n      /* four bytes */\n      buf[i++] = 0xf0 | (c >>> 18);\n      buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    }\n  }\n\n  return buf;\n};\n\n// Helper (used in 2 places)\nfunction buf2binstring(buf, len) {\n  // use fallback for big arrays to avoid stack overflow\n  if (len < 65537) {\n    if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {\n      return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));\n    }\n  }\n\n  var result = '';\n  for (var i = 0; i < len; i++) {\n    result += String.fromCharCode(buf[i]);\n  }\n  return result;\n}\n\n\n// Convert byte array to binary string\nexports.buf2binstring = function (buf) {\n  return buf2binstring(buf, buf.length);\n};\n\n\n// Convert binary string (typed, when possible)\nexports.binstring2buf = function (str) {\n  var buf = new utils.Buf8(str.length);\n  for (var i = 0, len = buf.length; i < len; i++) {\n    buf[i] = str.charCodeAt(i);\n  }\n  return buf;\n};\n\n\n// convert array to string\nexports.buf2string = function (buf, max) {\n  var i, out, c, c_len;\n  var len = max || buf.length;\n\n  // Reserve max possible length (2 words per char)\n  // NB: by unknown reasons, Array is significantly faster for\n  //     String.fromCharCode.apply than Uint16Array.\n  var utf16buf = new Array(len * 2);\n\n  for (out = 0, i = 0; i < len;) {\n    c = buf[i++];\n    // quick process ascii\n    if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n    c_len = _utf8len[c];\n    // skip 5 & 6 byte codes\n    if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n    // apply mask on first byte\n    c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n    // join the rest\n    while (c_len > 1 && i < len) {\n      c = (c << 6) | (buf[i++] & 0x3f);\n      c_len--;\n    }\n\n    // terminated by end of string?\n    if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n    if (c < 0x10000) {\n      utf16buf[out++] = c;\n    } else {\n      c -= 0x10000;\n      utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n      utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n    }\n  }\n\n  return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max   - length limit (mandatory);\nexports.utf8border = function (buf, max) {\n  var pos;\n\n  max = max || buf.length;\n  if (max > buf.length) { max = buf.length; }\n\n  // go back from last position, until start of sequence found\n  pos = max - 1;\n  while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n  // Fuckup - very small and broken sequence,\n  // return max, because we should return something anyway.\n  if (pos < 0) { return max; }\n\n  // If we came to start of buffer - that means vuffer is too small,\n  // return max too.\n  if (pos === 0) { return max; }\n\n  return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\n},{\"./common\":123}],125:[function(require,module,exports){\n'use strict';\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It doesn't worth to make additional optimizationa as in original.\n// Small size is preferable.\n\nfunction adler32(adler, buf, len, pos) {\n  var s1 = (adler & 0xffff) |0,\n      s2 = ((adler >>> 16) & 0xffff) |0,\n      n = 0;\n\n  while (len !== 0) {\n    // Set limit ~ twice less than 5552, to keep\n    // s2 in 31-bits, because we force signed ints.\n    // in other case %= will fail.\n    n = len > 2000 ? 2000 : len;\n    len -= n;\n\n    do {\n      s1 = (s1 + buf[pos++]) |0;\n      s2 = (s2 + s1) |0;\n    } while (--n);\n\n    s1 %= 65521;\n    s2 %= 65521;\n  }\n\n  return (s1 | (s2 << 16)) |0;\n}\n\n\nmodule.exports = adler32;\n\n},{}],126:[function(require,module,exports){\n'use strict';\n\n\nmodule.exports = {\n\n  /* Allowed flush values; see deflate() and inflate() below for details */\n  Z_NO_FLUSH:         0,\n  Z_PARTIAL_FLUSH:    1,\n  Z_SYNC_FLUSH:       2,\n  Z_FULL_FLUSH:       3,\n  Z_FINISH:           4,\n  Z_BLOCK:            5,\n  Z_TREES:            6,\n\n  /* Return codes for the compression/decompression functions. Negative values\n  * are errors, positive values are used for special but normal events.\n  */\n  Z_OK:               0,\n  Z_STREAM_END:       1,\n  Z_NEED_DICT:        2,\n  Z_ERRNO:           -1,\n  Z_STREAM_ERROR:    -2,\n  Z_DATA_ERROR:      -3,\n  //Z_MEM_ERROR:     -4,\n  Z_BUF_ERROR:       -5,\n  //Z_VERSION_ERROR: -6,\n\n  /* compression levels */\n  Z_NO_COMPRESSION:         0,\n  Z_BEST_SPEED:             1,\n  Z_BEST_COMPRESSION:       9,\n  Z_DEFAULT_COMPRESSION:   -1,\n\n\n  Z_FILTERED:               1,\n  Z_HUFFMAN_ONLY:           2,\n  Z_RLE:                    3,\n  Z_FIXED:                  4,\n  Z_DEFAULT_STRATEGY:       0,\n\n  /* Possible values of the data_type field (though see inflate()) */\n  Z_BINARY:                 0,\n  Z_TEXT:                   1,\n  //Z_ASCII:                1, // = Z_TEXT (deprecated)\n  Z_UNKNOWN:                2,\n\n  /* The deflate compression method */\n  Z_DEFLATED:               8\n  //Z_NULL:                 null // Use -1 or null inline, depending on var type\n};\n\n},{}],127:[function(require,module,exports){\n'use strict';\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n\n// Use ordinary array, since untyped makes no boost here\nfunction makeTable() {\n  var c, table = [];\n\n  for (var n = 0; n < 256; n++) {\n    c = n;\n    for (var k = 0; k < 8; k++) {\n      c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n    }\n    table[n] = c;\n  }\n\n  return table;\n}\n\n// Create table on load. Just 255 signed longs. Not a problem.\nvar crcTable = makeTable();\n\n\nfunction crc32(crc, buf, len, pos) {\n  var t = crcTable,\n      end = pos + len;\n\n  crc ^= -1;\n\n  for (var i = pos; i < end; i++) {\n    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n  }\n\n  return (crc ^ (-1)); // >>> 0;\n}\n\n\nmodule.exports = crc32;\n\n},{}],128:[function(require,module,exports){\n'use strict';\n\nvar utils   = require('../utils/common');\nvar trees   = require('./trees');\nvar adler32 = require('./adler32');\nvar crc32   = require('./crc32');\nvar msg     = require('./messages');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\nvar Z_NO_FLUSH      = 0;\nvar Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH    = 2;\nvar Z_FULL_FLUSH    = 3;\nvar Z_FINISH        = 4;\nvar Z_BLOCK         = 5;\n//var Z_TREES         = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\n//var Z_NEED_DICT     = 2;\n//var Z_ERRNO         = -1;\nvar Z_STREAM_ERROR  = -2;\nvar Z_DATA_ERROR    = -3;\n//var Z_MEM_ERROR     = -4;\nvar Z_BUF_ERROR     = -5;\n//var Z_VERSION_ERROR = -6;\n\n\n/* compression levels */\n//var Z_NO_COMPRESSION      = 0;\n//var Z_BEST_SPEED          = 1;\n//var Z_BEST_COMPRESSION    = 9;\nvar Z_DEFAULT_COMPRESSION = -1;\n\n\nvar Z_FILTERED            = 1;\nvar Z_HUFFMAN_ONLY        = 2;\nvar Z_RLE                 = 3;\nvar Z_FIXED               = 4;\nvar Z_DEFAULT_STRATEGY    = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\n//var Z_BINARY              = 0;\n//var Z_TEXT                = 1;\n//var Z_ASCII               = 1; // = Z_TEXT\nvar Z_UNKNOWN             = 2;\n\n\n/* The deflate compression method */\nvar Z_DEFLATED  = 8;\n\n/*============================================================================*/\n\n\nvar MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_MEM_LEVEL = 8;\n\n\nvar LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nvar LITERALS      = 256;\n/* number of literal bytes 0..255 */\nvar L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nvar D_CODES       = 30;\n/* number of distance codes */\nvar BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\nvar HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\nvar MAX_BITS  = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\nvar MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nvar PRESET_DICT = 0x20;\n\nvar INIT_STATE = 42;\nvar EXTRA_STATE = 69;\nvar NAME_STATE = 73;\nvar COMMENT_STATE = 91;\nvar HCRC_STATE = 103;\nvar BUSY_STATE = 113;\nvar FINISH_STATE = 666;\n\nvar BS_NEED_MORE      = 1; /* block not completed, need more input or more output */\nvar BS_BLOCK_DONE     = 2; /* block flush performed */\nvar BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nvar BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */\n\nvar OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nfunction err(strm, errorCode) {\n  strm.msg = msg[errorCode];\n  return errorCode;\n}\n\nfunction rank(f) {\n  return ((f) << 1) - ((f) > 4 ? 9 : 0);\n}\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nfunction flush_pending(strm) {\n  var s = strm.state;\n\n  //_tr_flush_bits(s);\n  var len = s.pending;\n  if (len > strm.avail_out) {\n    len = strm.avail_out;\n  }\n  if (len === 0) { return; }\n\n  utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);\n  strm.next_out += len;\n  s.pending_out += len;\n  strm.total_out += len;\n  strm.avail_out -= len;\n  s.pending -= len;\n  if (s.pending === 0) {\n    s.pending_out = 0;\n  }\n}\n\n\nfunction flush_block_only(s, last) {\n  trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n  s.block_start = s.strstart;\n  flush_pending(s.strm);\n}\n\n\nfunction put_byte(s, b) {\n  s.pending_buf[s.pending++] = b;\n}\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nfunction putShortMSB(s, b) {\n//  put_byte(s, (Byte)(b >> 8));\n//  put_byte(s, (Byte)(b & 0xff));\n  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n  s.pending_buf[s.pending++] = b & 0xff;\n}\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read.  All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nfunction read_buf(strm, buf, start, size) {\n  var len = strm.avail_in;\n\n  if (len > size) { len = size; }\n  if (len === 0) { return 0; }\n\n  strm.avail_in -= len;\n\n  // zmemcpy(buf, strm->next_in, len);\n  utils.arraySet(buf, strm.input, strm.next_in, len, start);\n  if (strm.state.wrap === 1) {\n    strm.adler = adler32(strm.adler, buf, len, start);\n  }\n\n  else if (strm.state.wrap === 2) {\n    strm.adler = crc32(strm.adler, buf, len, start);\n  }\n\n  strm.next_in += len;\n  strm.total_in += len;\n\n  return len;\n}\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nfunction longest_match(s, cur_match) {\n  var chain_length = s.max_chain_length;      /* max hash chain length */\n  var scan = s.strstart; /* current string */\n  var match;                       /* matched string */\n  var len;                           /* length of current match */\n  var best_len = s.prev_length;              /* best match length so far */\n  var nice_match = s.nice_match;             /* stop if match long enough */\n  var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n  var _win = s.window; // shortcut\n\n  var wmask = s.w_mask;\n  var prev  = s.prev;\n\n  /* Stop when cur_match becomes <= limit. To simplify the code,\n   * we prevent matches with the string of window index 0.\n   */\n\n  var strend = s.strstart + MAX_MATCH;\n  var scan_end1  = _win[scan + best_len - 1];\n  var scan_end   = _win[scan + best_len];\n\n  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n   * It is easy to get rid of this optimization if necessary.\n   */\n  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n  /* Do not waste too much time if we already have a good match: */\n  if (s.prev_length >= s.good_match) {\n    chain_length >>= 2;\n  }\n  /* Do not look for matches beyond the end of the input. This is necessary\n   * to make deflate deterministic.\n   */\n  if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n  do {\n    // Assert(cur_match < s->strstart, \"no future\");\n    match = cur_match;\n\n    /* Skip to next match if the match length cannot increase\n     * or if the match length is less than 2.  Note that the checks below\n     * for insufficient lookahead only occur occasionally for performance\n     * reasons.  Therefore uninitialized memory will be accessed, and\n     * conditional jumps will be made that depend on those values.\n     * However the length of the match is limited to the lookahead, so\n     * the output of deflate is not affected by the uninitialized values.\n     */\n\n    if (_win[match + best_len]     !== scan_end  ||\n        _win[match + best_len - 1] !== scan_end1 ||\n        _win[match]                !== _win[scan] ||\n        _win[++match]              !== _win[scan + 1]) {\n      continue;\n    }\n\n    /* The check at best_len-1 can be removed because it will be made\n     * again later. (This heuristic is not always a win.)\n     * It is not necessary to compare scan[2] and match[2] since they\n     * are always equal when the other bytes match, given that\n     * the hash keys are equal and that HASH_BITS >= 8.\n     */\n    scan += 2;\n    match++;\n    // Assert(*scan == *match, \"match[2]?\");\n\n    /* We check for insufficient lookahead only every 8th comparison;\n     * the 256th check will be made at strstart+258.\n     */\n    do {\n      /*jshint noempty:false*/\n    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             scan < strend);\n\n    // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n    len = MAX_MATCH - (strend - scan);\n    scan = strend - MAX_MATCH;\n\n    if (len > best_len) {\n      s.match_start = cur_match;\n      best_len = len;\n      if (len >= nice_match) {\n        break;\n      }\n      scan_end1  = _win[scan + best_len - 1];\n      scan_end   = _win[scan + best_len];\n    }\n  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n  if (best_len <= s.lookahead) {\n    return best_len;\n  }\n  return s.lookahead;\n}\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n *    At least one byte has been read, or avail_in == 0; reads are\n *    performed for at least two bytes (required for the zip translate_eol\n *    option -- not supported here).\n */\nfunction fill_window(s) {\n  var _w_size = s.w_size;\n  var p, n, m, more, str;\n\n  //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n  do {\n    more = s.window_size - s.lookahead - s.strstart;\n\n    // JS ints have 32 bit, block below not needed\n    /* Deal with !@#$% 64K limit: */\n    //if (sizeof(int) <= 2) {\n    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n    //        more = wsize;\n    //\n    //  } else if (more == (unsigned)(-1)) {\n    //        /* Very unlikely, but possible on 16 bit machine if\n    //         * strstart == 0 && lookahead == 1 (input done a byte at time)\n    //         */\n    //        more--;\n    //    }\n    //}\n\n\n    /* If the window is almost full and there is insufficient lookahead,\n     * move the upper half to the lower one to make room in the upper half.\n     */\n    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n      utils.arraySet(s.window, s.window, _w_size, _w_size, 0);\n      s.match_start -= _w_size;\n      s.strstart -= _w_size;\n      /* we now have strstart >= MAX_DIST */\n      s.block_start -= _w_size;\n\n      /* Slide the hash table (could be avoided with 32 bit values\n       at the expense of memory usage). We slide even when level == 0\n       to keep the hash table consistent if we switch back to level > 0\n       later. (Using level 0 permanently is not an optimal usage of\n       zlib, so we don't care about this pathological case.)\n       */\n\n      n = s.hash_size;\n      p = n;\n      do {\n        m = s.head[--p];\n        s.head[p] = (m >= _w_size ? m - _w_size : 0);\n      } while (--n);\n\n      n = _w_size;\n      p = n;\n      do {\n        m = s.prev[--p];\n        s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n        /* If n is not on any hash chain, prev[n] is garbage but\n         * its value will never be used.\n         */\n      } while (--n);\n\n      more += _w_size;\n    }\n    if (s.strm.avail_in === 0) {\n      break;\n    }\n\n    /* If there was no sliding:\n     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n     *    more == window_size - lookahead - strstart\n     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n     * => more >= window_size - 2*WSIZE + 2\n     * In the BIG_MEM or MMAP case (not yet supported),\n     *   window_size == input_size + MIN_LOOKAHEAD  &&\n     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n     * Otherwise, window_size == 2*WSIZE so more >= 2.\n     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n     */\n    //Assert(more >= 2, \"more < 2\");\n    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n    s.lookahead += n;\n\n    /* Initialize the hash value now that we have some input: */\n    if (s.lookahead + s.insert >= MIN_MATCH) {\n      str = s.strstart - s.insert;\n      s.ins_h = s.window[str];\n\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;\n//#if MIN_MATCH != 3\n//        Call update_hash() MIN_MATCH-3 more times\n//#endif\n      while (s.insert) {\n        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n        s.prev[str & s.w_mask] = s.head[s.ins_h];\n        s.head[s.ins_h] = str;\n        str++;\n        s.insert--;\n        if (s.lookahead + s.insert < MIN_MATCH) {\n          break;\n        }\n      }\n    }\n    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n     * but this is not important since only literal bytes will be emitted.\n     */\n\n  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n  /* If the WIN_INIT bytes after the end of the current data have never been\n   * written, then zero those bytes in order to avoid memory check reports of\n   * the use of uninitialized (or uninitialised as Julian writes) bytes by\n   * the longest match routines.  Update the high water mark for the next\n   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match\n   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n   */\n//  if (s.high_water < s.window_size) {\n//    var curr = s.strstart + s.lookahead;\n//    var init = 0;\n//\n//    if (s.high_water < curr) {\n//      /* Previous high water mark below current data -- zero WIN_INIT\n//       * bytes or up to end of window, whichever is less.\n//       */\n//      init = s.window_size - curr;\n//      if (init > WIN_INIT)\n//        init = WIN_INIT;\n//      zmemzero(s->window + curr, (unsigned)init);\n//      s->high_water = curr + init;\n//    }\n//    else if (s->high_water < (ulg)curr + WIN_INIT) {\n//      /* High water mark at or above current data, but below current data\n//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n//       * to end of window, whichever is less.\n//       */\n//      init = (ulg)curr + WIN_INIT - s->high_water;\n//      if (init > s->window_size - s->high_water)\n//        init = s->window_size - s->high_water;\n//      zmemzero(s->window + s->high_water, (unsigned)init);\n//      s->high_water += init;\n//    }\n//  }\n//\n//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n//    \"not enough room for search\");\n}\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nfunction deflate_stored(s, flush) {\n  /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n   * to pending_buf_size, and each stored block has a 5 byte header:\n   */\n  var max_block_size = 0xffff;\n\n  if (max_block_size > s.pending_buf_size - 5) {\n    max_block_size = s.pending_buf_size - 5;\n  }\n\n  /* Copy as much as possible from input to output: */\n  for (;;) {\n    /* Fill the window as much as possible: */\n    if (s.lookahead <= 1) {\n\n      //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n      //  s->block_start >= (long)s->w_size, \"slide too late\");\n//      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n//        s.block_start >= s.w_size)) {\n//        throw  new Error(\"slide too late\");\n//      }\n\n      fill_window(s);\n      if (s.lookahead === 0 && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n\n      if (s.lookahead === 0) {\n        break;\n      }\n      /* flush the current block */\n    }\n    //Assert(s->block_start >= 0L, \"block gone\");\n//    if (s.block_start < 0) throw new Error(\"block gone\");\n\n    s.strstart += s.lookahead;\n    s.lookahead = 0;\n\n    /* Emit a stored block if pending_buf will be full: */\n    var max_start = s.block_start + max_block_size;\n\n    if (s.strstart === 0 || s.strstart >= max_start) {\n      /* strstart == 0 is possible when wraparound on 16-bit machine */\n      s.lookahead = s.strstart - max_start;\n      s.strstart = max_start;\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n\n\n    }\n    /* Flush if we may have to slide, otherwise block_start may become\n     * negative and the data will be gone:\n     */\n    if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n\n  s.insert = 0;\n\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n\n  if (s.strstart > s.block_start) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_NEED_MORE;\n}\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nfunction deflate_fast(s, flush) {\n  var hash_head;        /* head of the hash chain */\n  var bflush;           /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) {\n        break; /* flush the current block */\n      }\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     * At this point we have always match_length < MIN_MATCH\n     */\n    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n    }\n    if (s.match_length >= MIN_MATCH) {\n      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n      /*** _tr_tally_dist(s, s.strstart - s.match_start,\n                     s.match_length - MIN_MATCH, bflush); ***/\n      bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n\n      /* Insert new strings in the hash table only if the match length\n       * is not too large. This saves time but degrades compression.\n       */\n      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n        s.match_length--; /* string at strstart already in table */\n        do {\n          s.strstart++;\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n          /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n           * always MIN_MATCH bytes ahead.\n           */\n        } while (--s.match_length !== 0);\n        s.strstart++;\n      } else\n      {\n        s.strstart += s.match_length;\n        s.match_length = 0;\n        s.ins_h = s.window[s.strstart];\n        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;\n\n//#if MIN_MATCH != 3\n//                Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n         * matter since it will be recomputed at next deflate call.\n         */\n      }\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nfunction deflate_slow(s, flush) {\n  var hash_head;          /* head of hash chain */\n  var bflush;              /* set if current block must be flushed */\n\n  var max_insert;\n\n  /* Process the input block. */\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     */\n    s.prev_length = s.match_length;\n    s.prev_match = s.match_start;\n    s.match_length = MIN_MATCH - 1;\n\n    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n        s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n\n      if (s.match_length <= 5 &&\n         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n        /* If prev_match is also MIN_MATCH, match_start is garbage\n         * but we will ignore the current match anyway.\n         */\n        s.match_length = MIN_MATCH - 1;\n      }\n    }\n    /* If there was a match at the previous step and the current\n     * match is not better, output the previous match:\n     */\n    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n      max_insert = s.strstart + s.lookahead - MIN_MATCH;\n      /* Do not insert strings in hash table beyond this. */\n\n      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n                     s.prev_length - MIN_MATCH, bflush);***/\n      bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n      /* Insert in hash table all strings up to the end of the match.\n       * strstart-1 and strstart are already inserted. If there is not\n       * enough lookahead, the last two strings are not inserted in\n       * the hash table.\n       */\n      s.lookahead -= s.prev_length - 1;\n      s.prev_length -= 2;\n      do {\n        if (++s.strstart <= max_insert) {\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n        }\n      } while (--s.prev_length !== 0);\n      s.match_available = 0;\n      s.match_length = MIN_MATCH - 1;\n      s.strstart++;\n\n      if (bflush) {\n        /*** FLUSH_BLOCK(s, 0); ***/\n        flush_block_only(s, false);\n        if (s.strm.avail_out === 0) {\n          return BS_NEED_MORE;\n        }\n        /***/\n      }\n\n    } else if (s.match_available) {\n      /* If there was no match at the previous position, output a\n       * single literal. If there was a match but the current match\n       * is longer, truncate the previous match to a single literal.\n       */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n      if (bflush) {\n        /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n        flush_block_only(s, false);\n        /***/\n      }\n      s.strstart++;\n      s.lookahead--;\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n    } else {\n      /* There is no previous match to compare with, wait for\n       * the next step to decide.\n       */\n      s.match_available = 1;\n      s.strstart++;\n      s.lookahead--;\n    }\n  }\n  //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n  if (s.match_available) {\n    //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n    bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n    s.match_available = 0;\n  }\n  s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_BLOCK_DONE;\n}\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one.  Do not maintain a hash table.  (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nfunction deflate_rle(s, flush) {\n  var bflush;            /* set if current block must be flushed */\n  var prev;              /* byte at distance one to match */\n  var scan, strend;      /* scan goes up to strend for length of run */\n\n  var _win = s.window;\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the longest run, plus one for the unrolled loop.\n     */\n    if (s.lookahead <= MAX_MATCH) {\n      fill_window(s);\n      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* See how many times the previous byte repeats */\n    s.match_length = 0;\n    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n      scan = s.strstart - 1;\n      prev = _win[scan];\n      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n        strend = s.strstart + MAX_MATCH;\n        do {\n          /*jshint noempty:false*/\n        } while (prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 scan < strend);\n        s.match_length = MAX_MATCH - (strend - scan);\n        if (s.match_length > s.lookahead) {\n          s.match_length = s.lookahead;\n        }\n      }\n      //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n    }\n\n    /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n    if (s.match_length >= MIN_MATCH) {\n      //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n      bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n      s.strstart += s.match_length;\n      s.match_length = 0;\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nfunction deflate_huff(s, flush) {\n  var bflush;             /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we have a literal to write. */\n    if (s.lookahead === 0) {\n      fill_window(s);\n      if (s.lookahead === 0) {\n        if (flush === Z_NO_FLUSH) {\n          return BS_NEED_MORE;\n        }\n        break;      /* flush the current block */\n      }\n    }\n\n    /* Output a literal byte */\n    s.match_length = 0;\n    //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n    bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n    s.lookahead--;\n    s.strstart++;\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n  this.good_length = good_length;\n  this.max_lazy = max_lazy;\n  this.nice_length = nice_length;\n  this.max_chain = max_chain;\n  this.func = func;\n}\n\nvar configuration_table;\n\nconfiguration_table = [\n  /*      good lazy nice chain */\n  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */\n  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */\n  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */\n  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */\n\n  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */\n  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */\n  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */\n  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */\n  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */\n  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nfunction lm_init(s) {\n  s.window_size = 2 * s.w_size;\n\n  /*** CLEAR_HASH(s); ***/\n  zero(s.head); // Fill with NIL (= 0);\n\n  /* Set the default configuration parameters:\n   */\n  s.max_lazy_match = configuration_table[s.level].max_lazy;\n  s.good_match = configuration_table[s.level].good_length;\n  s.nice_match = configuration_table[s.level].nice_length;\n  s.max_chain_length = configuration_table[s.level].max_chain;\n\n  s.strstart = 0;\n  s.block_start = 0;\n  s.lookahead = 0;\n  s.insert = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  s.ins_h = 0;\n}\n\n\nfunction DeflateState() {\n  this.strm = null;            /* pointer back to this zlib stream */\n  this.status = 0;            /* as the name implies */\n  this.pending_buf = null;      /* output still pending */\n  this.pending_buf_size = 0;  /* size of pending_buf */\n  this.pending_out = 0;       /* next pending byte to output to the stream */\n  this.pending = 0;           /* nb of bytes in the pending buffer */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.gzhead = null;         /* gzip header information to write */\n  this.gzindex = 0;           /* where in extra, name, or comment */\n  this.method = Z_DEFLATED; /* can only be DEFLATED */\n  this.last_flush = -1;   /* value of flush param for previous deflate call */\n\n  this.w_size = 0;  /* LZ77 window size (32K by default) */\n  this.w_bits = 0;  /* log2(w_size)  (8..16) */\n  this.w_mask = 0;  /* w_size - 1 */\n\n  this.window = null;\n  /* Sliding window. Input bytes are read into the second half of the window,\n   * and move to the first half later to keep a dictionary of at least wSize\n   * bytes. With this organization, matches are limited to a distance of\n   * wSize-MAX_MATCH bytes, but this ensures that IO is always\n   * performed with a length multiple of the block size.\n   */\n\n  this.window_size = 0;\n  /* Actual size of window: 2*wSize, except when the user input buffer\n   * is directly used as sliding window.\n   */\n\n  this.prev = null;\n  /* Link to older string with same hash index. To limit the size of this\n   * array to 64K, this link is maintained only for the last 32K strings.\n   * An index in this array is thus a window index modulo 32K.\n   */\n\n  this.head = null;   /* Heads of the hash chains or NIL. */\n\n  this.ins_h = 0;       /* hash index of string to be inserted */\n  this.hash_size = 0;   /* number of elements in hash table */\n  this.hash_bits = 0;   /* log2(hash_size) */\n  this.hash_mask = 0;   /* hash_size-1 */\n\n  this.hash_shift = 0;\n  /* Number of bits by which ins_h must be shifted at each input\n   * step. It must be such that after MIN_MATCH steps, the oldest\n   * byte no longer takes part in the hash key, that is:\n   *   hash_shift * MIN_MATCH >= hash_bits\n   */\n\n  this.block_start = 0;\n  /* Window position at the beginning of the current output block. Gets\n   * negative when the window is moved backwards.\n   */\n\n  this.match_length = 0;      /* length of best match */\n  this.prev_match = 0;        /* previous match */\n  this.match_available = 0;   /* set if previous match exists */\n  this.strstart = 0;          /* start of string to insert */\n  this.match_start = 0;       /* start of matching string */\n  this.lookahead = 0;         /* number of valid bytes ahead in window */\n\n  this.prev_length = 0;\n  /* Length of the best match at previous step. Matches not greater than this\n   * are discarded. This is used in the lazy match evaluation.\n   */\n\n  this.max_chain_length = 0;\n  /* To speed up deflation, hash chains are never searched beyond this\n   * length.  A higher limit improves compression ratio but degrades the\n   * speed.\n   */\n\n  this.max_lazy_match = 0;\n  /* Attempt to find a better match only when the current match is strictly\n   * smaller than this value. This mechanism is used only for compression\n   * levels >= 4.\n   */\n  // That's alias to max_lazy_match, don't use directly\n  //this.max_insert_length = 0;\n  /* Insert new strings in the hash table only if the match length is not\n   * greater than this length. This saves time but degrades compression.\n   * max_insert_length is used only for compression levels <= 3.\n   */\n\n  this.level = 0;     /* compression level (1..9) */\n  this.strategy = 0;  /* favor or force Huffman coding*/\n\n  this.good_match = 0;\n  /* Use a faster search when the previous match is longer than this */\n\n  this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n              /* used by trees.c: */\n\n  /* Didn't use ct_data typedef below to suppress compiler warning */\n\n  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */\n  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */\n\n  // Use flat array of DOUBLE size, with interleaved fata,\n  // because JS does not support effective\n  this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);\n  this.dyn_dtree  = new utils.Buf16((2 * D_CODES + 1) * 2);\n  this.bl_tree    = new utils.Buf16((2 * BL_CODES + 1) * 2);\n  zero(this.dyn_ltree);\n  zero(this.dyn_dtree);\n  zero(this.bl_tree);\n\n  this.l_desc   = null;         /* desc. for literal tree */\n  this.d_desc   = null;         /* desc. for distance tree */\n  this.bl_desc  = null;         /* desc. for bit length tree */\n\n  //ush bl_count[MAX_BITS+1];\n  this.bl_count = new utils.Buf16(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */\n  this.heap = new utils.Buf16(2 * L_CODES + 1);  /* heap used to build the Huffman trees */\n  zero(this.heap);\n\n  this.heap_len = 0;               /* number of elements in the heap */\n  this.heap_max = 0;               /* element of largest frequency */\n  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n   * The same heap array is used to build all trees.\n   */\n\n  this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n  zero(this.depth);\n  /* Depth of each subtree used as tie breaker for trees of equal frequency\n   */\n\n  this.l_buf = 0;          /* buffer index for literals or lengths */\n\n  this.lit_bufsize = 0;\n  /* Size of match buffer for literals/lengths.  There are 4 reasons for\n   * limiting lit_bufsize to 64K:\n   *   - frequencies can be kept in 16 bit counters\n   *   - if compression is not successful for the first block, all input\n   *     data is still in the window so we can still emit a stored block even\n   *     when input comes from standard input.  (This can also be done for\n   *     all blocks if lit_bufsize is not greater than 32K.)\n   *   - if compression is not successful for a file smaller than 64K, we can\n   *     even emit a stored file instead of a stored block (saving 5 bytes).\n   *     This is applicable only for zip (not gzip or zlib).\n   *   - creating new Huffman trees less frequently may not provide fast\n   *     adaptation to changes in the input data statistics. (Take for\n   *     example a binary file with poorly compressible code followed by\n   *     a highly compressible string table.) Smaller buffer sizes give\n   *     fast adaptation but have of course the overhead of transmitting\n   *     trees more frequently.\n   *   - I can't count above 4\n   */\n\n  this.last_lit = 0;      /* running index in l_buf */\n\n  this.d_buf = 0;\n  /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n   * the same number of elements. To use different lengths, an extra flag\n   * array would be necessary.\n   */\n\n  this.opt_len = 0;       /* bit length of current block with optimal trees */\n  this.static_len = 0;    /* bit length of current block with static trees */\n  this.matches = 0;       /* number of string matches in current block */\n  this.insert = 0;        /* bytes at end of window left to insert */\n\n\n  this.bi_buf = 0;\n  /* Output buffer. bits are inserted starting at the bottom (least\n   * significant bits).\n   */\n  this.bi_valid = 0;\n  /* Number of valid bits in bi_buf.  All bits above the last valid bit\n   * are always zero.\n   */\n\n  // Used for window memory init. We safely ignore it for JS. That makes\n  // sense only for pointers and memory check tools.\n  //this.high_water = 0;\n  /* High water mark offset in window for initialized bytes -- bytes above\n   * this are set to zero in order to avoid memory check warnings when\n   * longest match routines access bytes past the input.  This is then\n   * updated to the new high water mark.\n   */\n}\n\n\nfunction deflateResetKeep(strm) {\n  var s;\n\n  if (!strm || !strm.state) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n  strm.total_in = strm.total_out = 0;\n  strm.data_type = Z_UNKNOWN;\n\n  s = strm.state;\n  s.pending = 0;\n  s.pending_out = 0;\n\n  if (s.wrap < 0) {\n    s.wrap = -s.wrap;\n    /* was made negative by deflate(..., Z_FINISH); */\n  }\n  s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n  strm.adler = (s.wrap === 2) ?\n    0  // crc32(0, Z_NULL, 0)\n  :\n    1; // adler32(0, Z_NULL, 0)\n  s.last_flush = Z_NO_FLUSH;\n  trees._tr_init(s);\n  return Z_OK;\n}\n\n\nfunction deflateReset(strm) {\n  var ret = deflateResetKeep(strm);\n  if (ret === Z_OK) {\n    lm_init(strm.state);\n  }\n  return ret;\n}\n\n\nfunction deflateSetHeader(strm, head) {\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }\n  strm.state.gzhead = head;\n  return Z_OK;\n}\n\n\nfunction deflateInit2(strm, level, method, windowBits, memLevel, strategy) {\n  if (!strm) { // === Z_NULL\n    return Z_STREAM_ERROR;\n  }\n  var wrap = 1;\n\n  if (level === Z_DEFAULT_COMPRESSION) {\n    level = 6;\n  }\n\n  if (windowBits < 0) { /* suppress zlib wrapper */\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n\n  else if (windowBits > 15) {\n    wrap = 2;           /* write gzip wrapper instead */\n    windowBits -= 16;\n  }\n\n\n  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||\n    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n    strategy < 0 || strategy > Z_FIXED) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n\n  if (windowBits === 8) {\n    windowBits = 9;\n  }\n  /* until 256-byte window bug fixed */\n\n  var s = new DeflateState();\n\n  strm.state = s;\n  s.strm = strm;\n\n  s.wrap = wrap;\n  s.gzhead = null;\n  s.w_bits = windowBits;\n  s.w_size = 1 << s.w_bits;\n  s.w_mask = s.w_size - 1;\n\n  s.hash_bits = memLevel + 7;\n  s.hash_size = 1 << s.hash_bits;\n  s.hash_mask = s.hash_size - 1;\n  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n  s.window = new utils.Buf8(s.w_size * 2);\n  s.head = new utils.Buf16(s.hash_size);\n  s.prev = new utils.Buf16(s.w_size);\n\n  // Don't need mem init magic for JS.\n  //s.high_water = 0;  /* nothing written to s->window yet */\n\n  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n  s.pending_buf_size = s.lit_bufsize * 4;\n\n  //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n  //s->pending_buf = (uchf *) overlay;\n  s.pending_buf = new utils.Buf8(s.pending_buf_size);\n\n  // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n  //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n  s.d_buf = 1 * s.lit_bufsize;\n\n  //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n  s.l_buf = (1 + 2) * s.lit_bufsize;\n\n  s.level = level;\n  s.strategy = strategy;\n  s.method = method;\n\n  return deflateReset(strm);\n}\n\nfunction deflateInit(strm, level) {\n  return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);\n}\n\n\nfunction deflate(strm, flush) {\n  var old_flush, s;\n  var beg, val; // for gzip header write only\n\n  if (!strm || !strm.state ||\n    flush > Z_BLOCK || flush < 0) {\n    return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;\n  }\n\n  s = strm.state;\n\n  if (!strm.output ||\n      (!strm.input && strm.avail_in !== 0) ||\n      (s.status === FINISH_STATE && flush !== Z_FINISH)) {\n    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);\n  }\n\n  s.strm = strm; /* just in case */\n  old_flush = s.last_flush;\n  s.last_flush = flush;\n\n  /* Write the header */\n  if (s.status === INIT_STATE) {\n\n    if (s.wrap === 2) { // GZIP header\n      strm.adler = 0;  //crc32(0L, Z_NULL, 0);\n      put_byte(s, 31);\n      put_byte(s, 139);\n      put_byte(s, 8);\n      if (!s.gzhead) { // s->gzhead == Z_NULL\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, s.level === 9 ? 2 :\n                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                     4 : 0));\n        put_byte(s, OS_CODE);\n        s.status = BUSY_STATE;\n      }\n      else {\n        put_byte(s, (s.gzhead.text ? 1 : 0) +\n                    (s.gzhead.hcrc ? 2 : 0) +\n                    (!s.gzhead.extra ? 0 : 4) +\n                    (!s.gzhead.name ? 0 : 8) +\n                    (!s.gzhead.comment ? 0 : 16)\n                );\n        put_byte(s, s.gzhead.time & 0xff);\n        put_byte(s, (s.gzhead.time >> 8) & 0xff);\n        put_byte(s, (s.gzhead.time >> 16) & 0xff);\n        put_byte(s, (s.gzhead.time >> 24) & 0xff);\n        put_byte(s, s.level === 9 ? 2 :\n                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                     4 : 0));\n        put_byte(s, s.gzhead.os & 0xff);\n        if (s.gzhead.extra && s.gzhead.extra.length) {\n          put_byte(s, s.gzhead.extra.length & 0xff);\n          put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n        }\n        if (s.gzhead.hcrc) {\n          strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);\n        }\n        s.gzindex = 0;\n        s.status = EXTRA_STATE;\n      }\n    }\n    else // DEFLATE header\n    {\n      var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;\n      var level_flags = -1;\n\n      if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n        level_flags = 0;\n      } else if (s.level < 6) {\n        level_flags = 1;\n      } else if (s.level === 6) {\n        level_flags = 2;\n      } else {\n        level_flags = 3;\n      }\n      header |= (level_flags << 6);\n      if (s.strstart !== 0) { header |= PRESET_DICT; }\n      header += 31 - (header % 31);\n\n      s.status = BUSY_STATE;\n      putShortMSB(s, header);\n\n      /* Save the adler32 of the preset dictionary: */\n      if (s.strstart !== 0) {\n        putShortMSB(s, strm.adler >>> 16);\n        putShortMSB(s, strm.adler & 0xffff);\n      }\n      strm.adler = 1; // adler32(0L, Z_NULL, 0);\n    }\n  }\n\n//#ifdef GZIP\n  if (s.status === EXTRA_STATE) {\n    if (s.gzhead.extra/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n\n      while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            break;\n          }\n        }\n        put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n        s.gzindex++;\n      }\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (s.gzindex === s.gzhead.extra.length) {\n        s.gzindex = 0;\n        s.status = NAME_STATE;\n      }\n    }\n    else {\n      s.status = NAME_STATE;\n    }\n  }\n  if (s.status === NAME_STATE) {\n    if (s.gzhead.name/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n      //int val;\n\n      do {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            val = 1;\n            break;\n          }\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.name.length) {\n          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (val === 0) {\n        s.gzindex = 0;\n        s.status = COMMENT_STATE;\n      }\n    }\n    else {\n      s.status = COMMENT_STATE;\n    }\n  }\n  if (s.status === COMMENT_STATE) {\n    if (s.gzhead.comment/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n      //int val;\n\n      do {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            val = 1;\n            break;\n          }\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.comment.length) {\n          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (val === 0) {\n        s.status = HCRC_STATE;\n      }\n    }\n    else {\n      s.status = HCRC_STATE;\n    }\n  }\n  if (s.status === HCRC_STATE) {\n    if (s.gzhead.hcrc) {\n      if (s.pending + 2 > s.pending_buf_size) {\n        flush_pending(strm);\n      }\n      if (s.pending + 2 <= s.pending_buf_size) {\n        put_byte(s, strm.adler & 0xff);\n        put_byte(s, (strm.adler >> 8) & 0xff);\n        strm.adler = 0; //crc32(0L, Z_NULL, 0);\n        s.status = BUSY_STATE;\n      }\n    }\n    else {\n      s.status = BUSY_STATE;\n    }\n  }\n//#endif\n\n  /* Flush as much pending output as possible */\n  if (s.pending !== 0) {\n    flush_pending(strm);\n    if (strm.avail_out === 0) {\n      /* Since avail_out is 0, deflate will be called again with\n       * more output space, but possibly with both pending and\n       * avail_in equal to zero. There won't be anything to do,\n       * but this is not an error situation so make sure we\n       * return OK instead of BUF_ERROR at next call of deflate:\n       */\n      s.last_flush = -1;\n      return Z_OK;\n    }\n\n    /* Make sure there is something to do and avoid duplicate consecutive\n     * flushes. For repeated and useless calls with Z_FINISH, we keep\n     * returning Z_STREAM_END instead of Z_BUF_ERROR.\n     */\n  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n    flush !== Z_FINISH) {\n    return err(strm, Z_BUF_ERROR);\n  }\n\n  /* User must not provide more input after the first FINISH: */\n  if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n    return err(strm, Z_BUF_ERROR);\n  }\n\n  /* Start a new block or continue the current one.\n   */\n  if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n    (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {\n    var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n      (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n        configuration_table[s.level].func(s, flush));\n\n    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n      s.status = FINISH_STATE;\n    }\n    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n      if (strm.avail_out === 0) {\n        s.last_flush = -1;\n        /* avoid BUF_ERROR next call, see above */\n      }\n      return Z_OK;\n      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n       * of deflate should use the same flush parameter to make sure\n       * that the flush is complete. So we don't have to output an\n       * empty block here, this will be done at next call. This also\n       * ensures that for a very small output buffer, we emit at most\n       * one empty block.\n       */\n    }\n    if (bstate === BS_BLOCK_DONE) {\n      if (flush === Z_PARTIAL_FLUSH) {\n        trees._tr_align(s);\n      }\n      else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\n\n        trees._tr_stored_block(s, 0, 0, false);\n        /* For a full flush, this empty block will be recognized\n         * as a special marker by inflate_sync().\n         */\n        if (flush === Z_FULL_FLUSH) {\n          /*** CLEAR_HASH(s); ***/             /* forget history */\n          zero(s.head); // Fill with NIL (= 0);\n\n          if (s.lookahead === 0) {\n            s.strstart = 0;\n            s.block_start = 0;\n            s.insert = 0;\n          }\n        }\n      }\n      flush_pending(strm);\n      if (strm.avail_out === 0) {\n        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n        return Z_OK;\n      }\n    }\n  }\n  //Assert(strm->avail_out > 0, \"bug2\");\n  //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n  if (flush !== Z_FINISH) { return Z_OK; }\n  if (s.wrap <= 0) { return Z_STREAM_END; }\n\n  /* Write the trailer */\n  if (s.wrap === 2) {\n    put_byte(s, strm.adler & 0xff);\n    put_byte(s, (strm.adler >> 8) & 0xff);\n    put_byte(s, (strm.adler >> 16) & 0xff);\n    put_byte(s, (strm.adler >> 24) & 0xff);\n    put_byte(s, strm.total_in & 0xff);\n    put_byte(s, (strm.total_in >> 8) & 0xff);\n    put_byte(s, (strm.total_in >> 16) & 0xff);\n    put_byte(s, (strm.total_in >> 24) & 0xff);\n  }\n  else\n  {\n    putShortMSB(s, strm.adler >>> 16);\n    putShortMSB(s, strm.adler & 0xffff);\n  }\n\n  flush_pending(strm);\n  /* If avail_out is zero, the application will call deflate again\n   * to flush the rest.\n   */\n  if (s.wrap > 0) { s.wrap = -s.wrap; }\n  /* write the trailer only once! */\n  return s.pending !== 0 ? Z_OK : Z_STREAM_END;\n}\n\nfunction deflateEnd(strm) {\n  var status;\n\n  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  status = strm.state.status;\n  if (status !== INIT_STATE &&\n    status !== EXTRA_STATE &&\n    status !== NAME_STATE &&\n    status !== COMMENT_STATE &&\n    status !== HCRC_STATE &&\n    status !== BUSY_STATE &&\n    status !== FINISH_STATE\n  ) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n  strm.state = null;\n\n  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;\n}\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nfunction deflateSetDictionary(strm, dictionary) {\n  var dictLength = dictionary.length;\n\n  var s;\n  var str, n;\n  var wrap;\n  var avail;\n  var next;\n  var input;\n  var tmpDict;\n\n  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  s = strm.state;\n  wrap = s.wrap;\n\n  if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n    return Z_STREAM_ERROR;\n  }\n\n  /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n  if (wrap === 1) {\n    /* adler32(strm->adler, dictionary, dictLength); */\n    strm.adler = adler32(strm.adler, dictionary, dictLength, 0);\n  }\n\n  s.wrap = 0;   /* avoid computing Adler-32 in read_buf */\n\n  /* if dictionary would fill window, just replace the history */\n  if (dictLength >= s.w_size) {\n    if (wrap === 0) {            /* already empty otherwise */\n      /*** CLEAR_HASH(s); ***/\n      zero(s.head); // Fill with NIL (= 0);\n      s.strstart = 0;\n      s.block_start = 0;\n      s.insert = 0;\n    }\n    /* use the tail */\n    // dictionary = dictionary.slice(dictLength - s.w_size);\n    tmpDict = new utils.Buf8(s.w_size);\n    utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);\n    dictionary = tmpDict;\n    dictLength = s.w_size;\n  }\n  /* insert dictionary into window and hash */\n  avail = strm.avail_in;\n  next = strm.next_in;\n  input = strm.input;\n  strm.avail_in = dictLength;\n  strm.next_in = 0;\n  strm.input = dictionary;\n  fill_window(s);\n  while (s.lookahead >= MIN_MATCH) {\n    str = s.strstart;\n    n = s.lookahead - (MIN_MATCH - 1);\n    do {\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n      s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n      s.head[s.ins_h] = str;\n      str++;\n    } while (--n);\n    s.strstart = str;\n    s.lookahead = MIN_MATCH - 1;\n    fill_window(s);\n  }\n  s.strstart += s.lookahead;\n  s.block_start = s.strstart;\n  s.insert = s.lookahead;\n  s.lookahead = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  strm.next_in = next;\n  strm.input = input;\n  strm.avail_in = avail;\n  s.wrap = wrap;\n  return Z_OK;\n}\n\n\nexports.deflateInit = deflateInit;\nexports.deflateInit2 = deflateInit2;\nexports.deflateReset = deflateReset;\nexports.deflateResetKeep = deflateResetKeep;\nexports.deflateSetHeader = deflateSetHeader;\nexports.deflate = deflate;\nexports.deflateEnd = deflateEnd;\nexports.deflateSetDictionary = deflateSetDictionary;\nexports.deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nexports.deflateBound = deflateBound;\nexports.deflateCopy = deflateCopy;\nexports.deflateParams = deflateParams;\nexports.deflatePending = deflatePending;\nexports.deflatePrime = deflatePrime;\nexports.deflateTune = deflateTune;\n*/\n\n},{\"../utils/common\":123,\"./adler32\":125,\"./crc32\":127,\"./messages\":133,\"./trees\":134}],129:[function(require,module,exports){\n'use strict';\n\n\nfunction GZheader() {\n  /* true if compressed data believed to be text */\n  this.text       = 0;\n  /* modification time */\n  this.time       = 0;\n  /* extra flags (not used when writing a gzip file) */\n  this.xflags     = 0;\n  /* operating system */\n  this.os         = 0;\n  /* pointer to extra field or Z_NULL if none */\n  this.extra      = null;\n  /* extra field length (valid if extra != Z_NULL) */\n  this.extra_len  = 0; // Actually, we don't need it in JS,\n                       // but leave for few code modifications\n\n  //\n  // Setup limits is not necessary because in js we should not preallocate memory\n  // for inflate use constant limit in 65536 bytes\n  //\n\n  /* space at extra (only when reading header) */\n  // this.extra_max  = 0;\n  /* pointer to zero-terminated file name or Z_NULL */\n  this.name       = '';\n  /* space at name (only when reading header) */\n  // this.name_max   = 0;\n  /* pointer to zero-terminated comment or Z_NULL */\n  this.comment    = '';\n  /* space at comment (only when reading header) */\n  // this.comm_max   = 0;\n  /* true if there was or will be a header crc */\n  this.hcrc       = 0;\n  /* true when done reading gzip header (not used when writing a gzip file) */\n  this.done       = false;\n}\n\nmodule.exports = GZheader;\n\n},{}],130:[function(require,module,exports){\n'use strict';\n\n// See state defs from inflate.js\nvar BAD = 30;       /* got a data error -- remain here until reset */\nvar TYPE = 12;      /* i: waiting for type bits, including last-flag bit */\n\n/*\n   Decode literal, length, and distance codes and write out the resulting\n   literal and match bytes until either not enough input or output is\n   available, an end-of-block is encountered, or a data error is encountered.\n   When large enough input and output buffers are supplied to inflate(), for\n   example, a 16K input buffer and a 64K output buffer, more than 95% of the\n   inflate execution time is spent in this routine.\n\n   Entry assumptions:\n\n        state.mode === LEN\n        strm.avail_in >= 6\n        strm.avail_out >= 258\n        start >= strm.avail_out\n        state.bits < 8\n\n   On return, state.mode is one of:\n\n        LEN -- ran out of enough output space or enough available input\n        TYPE -- reached end of block code, inflate() to interpret next block\n        BAD -- error in block data\n\n   Notes:\n\n    - The maximum input bits used by a length/distance pair is 15 bits for the\n      length code, 5 bits for the length extra, 15 bits for the distance code,\n      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.\n      Therefore if strm.avail_in >= 6, then there is enough input to avoid\n      checking for available input while decoding.\n\n    - The maximum bytes that a single length/distance pair can output is 258\n      bytes, which is the maximum length that can be coded.  inflate_fast()\n      requires strm.avail_out >= 258 for each loop to avoid checking for\n      output space.\n */\nmodule.exports = function inflate_fast(strm, start) {\n  var state;\n  var _in;                    /* local strm.input */\n  var last;                   /* have enough input while in < last */\n  var _out;                   /* local strm.output */\n  var beg;                    /* inflate()'s initial strm.output */\n  var end;                    /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n  var dmax;                   /* maximum distance from zlib header */\n//#endif\n  var wsize;                  /* window size or zero if not using window */\n  var whave;                  /* valid bytes in the window */\n  var wnext;                  /* window write index */\n  // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n  var s_window;               /* allocated sliding window, if wsize != 0 */\n  var hold;                   /* local strm.hold */\n  var bits;                   /* local strm.bits */\n  var lcode;                  /* local strm.lencode */\n  var dcode;                  /* local strm.distcode */\n  var lmask;                  /* mask for first level of length codes */\n  var dmask;                  /* mask for first level of distance codes */\n  var here;                   /* retrieved table entry */\n  var op;                     /* code bits, operation, extra bits, or */\n                              /*  window position, window bytes to copy */\n  var len;                    /* match length, unused bytes */\n  var dist;                   /* match distance */\n  var from;                   /* where to copy match from */\n  var from_source;\n\n\n  var input, output; // JS specific, because we have no pointers\n\n  /* copy state to local variables */\n  state = strm.state;\n  //here = state.here;\n  _in = strm.next_in;\n  input = strm.input;\n  last = _in + (strm.avail_in - 5);\n  _out = strm.next_out;\n  output = strm.output;\n  beg = _out - (start - strm.avail_out);\n  end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n  dmax = state.dmax;\n//#endif\n  wsize = state.wsize;\n  whave = state.whave;\n  wnext = state.wnext;\n  s_window = state.window;\n  hold = state.hold;\n  bits = state.bits;\n  lcode = state.lencode;\n  dcode = state.distcode;\n  lmask = (1 << state.lenbits) - 1;\n  dmask = (1 << state.distbits) - 1;\n\n\n  /* decode literals and length/distances until end-of-block or not enough\n     input data or output space */\n\n  top:\n  do {\n    if (bits < 15) {\n      hold += input[_in++] << bits;\n      bits += 8;\n      hold += input[_in++] << bits;\n      bits += 8;\n    }\n\n    here = lcode[hold & lmask];\n\n    dolen:\n    for (;;) { // Goto emulation\n      op = here >>> 24/*here.bits*/;\n      hold >>>= op;\n      bits -= op;\n      op = (here >>> 16) & 0xff/*here.op*/;\n      if (op === 0) {                          /* literal */\n        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n        //        \"inflate:         literal '%c'\\n\" :\n        //        \"inflate:         literal 0x%02x\\n\", here.val));\n        output[_out++] = here & 0xffff/*here.val*/;\n      }\n      else if (op & 16) {                     /* length base */\n        len = here & 0xffff/*here.val*/;\n        op &= 15;                           /* number of extra bits */\n        if (op) {\n          if (bits < op) {\n            hold += input[_in++] << bits;\n            bits += 8;\n          }\n          len += hold & ((1 << op) - 1);\n          hold >>>= op;\n          bits -= op;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", len));\n        if (bits < 15) {\n          hold += input[_in++] << bits;\n          bits += 8;\n          hold += input[_in++] << bits;\n          bits += 8;\n        }\n        here = dcode[hold & dmask];\n\n        dodist:\n        for (;;) { // goto emulation\n          op = here >>> 24/*here.bits*/;\n          hold >>>= op;\n          bits -= op;\n          op = (here >>> 16) & 0xff/*here.op*/;\n\n          if (op & 16) {                      /* distance base */\n            dist = here & 0xffff/*here.val*/;\n            op &= 15;                       /* number of extra bits */\n            if (bits < op) {\n              hold += input[_in++] << bits;\n              bits += 8;\n              if (bits < op) {\n                hold += input[_in++] << bits;\n                bits += 8;\n              }\n            }\n            dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n            if (dist > dmax) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD;\n              break top;\n            }\n//#endif\n            hold >>>= op;\n            bits -= op;\n            //Tracevv((stderr, \"inflate:         distance %u\\n\", dist));\n            op = _out - beg;                /* max distance in output */\n            if (dist > op) {                /* see if copy from window */\n              op = dist - op;               /* distance back in window */\n              if (op > whave) {\n                if (state.sane) {\n                  strm.msg = 'invalid distance too far back';\n                  state.mode = BAD;\n                  break top;\n                }\n\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//                if (len <= op - whave) {\n//                  do {\n//                    output[_out++] = 0;\n//                  } while (--len);\n//                  continue top;\n//                }\n//                len -= op - whave;\n//                do {\n//                  output[_out++] = 0;\n//                } while (--op > whave);\n//                if (op === 0) {\n//                  from = _out - dist;\n//                  do {\n//                    output[_out++] = output[from++];\n//                  } while (--len);\n//                  continue top;\n//                }\n//#endif\n              }\n              from = 0; // window index\n              from_source = s_window;\n              if (wnext === 0) {           /* very common case */\n                from += wsize - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              else if (wnext < op) {      /* wrap around window */\n                from += wsize + wnext - op;\n                op -= wnext;\n                if (op < len) {         /* some from end of window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = 0;\n                  if (wnext < len) {  /* some from start of window */\n                    op = wnext;\n                    len -= op;\n                    do {\n                      output[_out++] = s_window[from++];\n                    } while (--op);\n                    from = _out - dist;      /* rest from output */\n                    from_source = output;\n                  }\n                }\n              }\n              else {                      /* contiguous in window */\n                from += wnext - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              while (len > 2) {\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                len -= 3;\n              }\n              if (len) {\n                output[_out++] = from_source[from++];\n                if (len > 1) {\n                  output[_out++] = from_source[from++];\n                }\n              }\n            }\n            else {\n              from = _out - dist;          /* copy direct from output */\n              do {                        /* minimum length is three */\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                len -= 3;\n              } while (len > 2);\n              if (len) {\n                output[_out++] = output[from++];\n                if (len > 1) {\n                  output[_out++] = output[from++];\n                }\n              }\n            }\n          }\n          else if ((op & 64) === 0) {          /* 2nd level distance code */\n            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n            continue dodist;\n          }\n          else {\n            strm.msg = 'invalid distance code';\n            state.mode = BAD;\n            break top;\n          }\n\n          break; // need to emulate goto via \"continue\"\n        }\n      }\n      else if ((op & 64) === 0) {              /* 2nd level length code */\n        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n        continue dolen;\n      }\n      else if (op & 32) {                     /* end-of-block */\n        //Tracevv((stderr, \"inflate:         end of block\\n\"));\n        state.mode = TYPE;\n        break top;\n      }\n      else {\n        strm.msg = 'invalid literal/length code';\n        state.mode = BAD;\n        break top;\n      }\n\n      break; // need to emulate goto via \"continue\"\n    }\n  } while (_in < last && _out < end);\n\n  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n  len = bits >> 3;\n  _in -= len;\n  bits -= len << 3;\n  hold &= (1 << bits) - 1;\n\n  /* update state and return */\n  strm.next_in = _in;\n  strm.next_out = _out;\n  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n  state.hold = hold;\n  state.bits = bits;\n  return;\n};\n\n},{}],131:[function(require,module,exports){\n'use strict';\n\n\nvar utils         = require('../utils/common');\nvar adler32       = require('./adler32');\nvar crc32         = require('./crc32');\nvar inflate_fast  = require('./inffast');\nvar inflate_table = require('./inftrees');\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\n//var Z_NO_FLUSH      = 0;\n//var Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH    = 2;\n//var Z_FULL_FLUSH    = 3;\nvar Z_FINISH        = 4;\nvar Z_BLOCK         = 5;\nvar Z_TREES         = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\nvar Z_NEED_DICT     = 2;\n//var Z_ERRNO         = -1;\nvar Z_STREAM_ERROR  = -2;\nvar Z_DATA_ERROR    = -3;\nvar Z_MEM_ERROR     = -4;\nvar Z_BUF_ERROR     = -5;\n//var Z_VERSION_ERROR = -6;\n\n/* The deflate compression method */\nvar Z_DEFLATED  = 8;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nvar    HEAD = 1;       /* i: waiting for magic header */\nvar    FLAGS = 2;      /* i: waiting for method and flags (gzip) */\nvar    TIME = 3;       /* i: waiting for modification time (gzip) */\nvar    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */\nvar    EXLEN = 5;      /* i: waiting for extra length (gzip) */\nvar    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */\nvar    NAME = 7;       /* i: waiting for end of file name (gzip) */\nvar    COMMENT = 8;    /* i: waiting for end of comment (gzip) */\nvar    HCRC = 9;       /* i: waiting for header crc (gzip) */\nvar    DICTID = 10;    /* i: waiting for dictionary check value */\nvar    DICT = 11;      /* waiting for inflateSetDictionary() call */\nvar        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */\nvar        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */\nvar        STORED = 14;    /* i: waiting for stored size (length and complement) */\nvar        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */\nvar        COPY = 16;      /* i/o: waiting for input or output to copy stored block */\nvar        TABLE = 17;     /* i: waiting for dynamic block table lengths */\nvar        LENLENS = 18;   /* i: waiting for code length code lengths */\nvar        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */\nvar            LEN_ = 20;      /* i: same as LEN below, but only first time in */\nvar            LEN = 21;       /* i: waiting for length/lit/eob code */\nvar            LENEXT = 22;    /* i: waiting for length extra bits */\nvar            DIST = 23;      /* i: waiting for distance code */\nvar            DISTEXT = 24;   /* i: waiting for distance extra bits */\nvar            MATCH = 25;     /* o: waiting for output space to copy string */\nvar            LIT = 26;       /* o: waiting for output space to write literal */\nvar    CHECK = 27;     /* i: waiting for 32-bit check value */\nvar    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */\nvar    DONE = 29;      /* finished check, done -- remain here until reset */\nvar    BAD = 30;       /* got a data error -- remain here until reset */\nvar    MEM = 31;       /* got an inflate() memory error -- remain here until reset */\nvar    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_WBITS = MAX_WBITS;\n\n\nfunction zswap32(q) {\n  return  (((q >>> 24) & 0xff) +\n          ((q >>> 8) & 0xff00) +\n          ((q & 0xff00) << 8) +\n          ((q & 0xff) << 24));\n}\n\n\nfunction InflateState() {\n  this.mode = 0;             /* current inflate mode */\n  this.last = false;          /* true if processing last block */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.havedict = false;      /* true if dictionary provided */\n  this.flags = 0;             /* gzip header method and flags (0 if zlib) */\n  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */\n  this.check = 0;             /* protected copy of check value */\n  this.total = 0;             /* protected copy of output count */\n  // TODO: may be {}\n  this.head = null;           /* where to save gzip header information */\n\n  /* sliding window */\n  this.wbits = 0;             /* log base 2 of requested window size */\n  this.wsize = 0;             /* window size or zero if not using window */\n  this.whave = 0;             /* valid bytes in the window */\n  this.wnext = 0;             /* window write index */\n  this.window = null;         /* allocated sliding window, if needed */\n\n  /* bit accumulator */\n  this.hold = 0;              /* input bit accumulator */\n  this.bits = 0;              /* number of bits in \"in\" */\n\n  /* for string and stored block copying */\n  this.length = 0;            /* literal or length of data to copy */\n  this.offset = 0;            /* distance back to copy string from */\n\n  /* for table and code decoding */\n  this.extra = 0;             /* extra bits needed */\n\n  /* fixed and dynamic code tables */\n  this.lencode = null;          /* starting table for length/literal codes */\n  this.distcode = null;         /* starting table for distance codes */\n  this.lenbits = 0;           /* index bits for lencode */\n  this.distbits = 0;          /* index bits for distcode */\n\n  /* dynamic table building */\n  this.ncode = 0;             /* number of code length code lengths */\n  this.nlen = 0;              /* number of length code lengths */\n  this.ndist = 0;             /* number of distance code lengths */\n  this.have = 0;              /* number of code lengths in lens[] */\n  this.next = null;              /* next available space in codes[] */\n\n  this.lens = new utils.Buf16(320); /* temporary storage for code lengths */\n  this.work = new utils.Buf16(288); /* work area for code table building */\n\n  /*\n   because we don't have pointers in js, we use lencode and distcode directly\n   as buffers so we don't need codes\n  */\n  //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */\n  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */\n  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */\n  this.sane = 0;                   /* if false, allow invalid distance too far */\n  this.back = 0;                   /* bits back of last unprocessed length/lit */\n  this.was = 0;                    /* initial length of match */\n}\n\nfunction inflateResetKeep(strm) {\n  var state;\n\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  strm.total_in = strm.total_out = state.total = 0;\n  strm.msg = ''; /*Z_NULL*/\n  if (state.wrap) {       /* to support ill-conceived Java test suite */\n    strm.adler = state.wrap & 1;\n  }\n  state.mode = HEAD;\n  state.last = 0;\n  state.havedict = 0;\n  state.dmax = 32768;\n  state.head = null/*Z_NULL*/;\n  state.hold = 0;\n  state.bits = 0;\n  //state.lencode = state.distcode = state.next = state.codes;\n  state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);\n  state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);\n\n  state.sane = 1;\n  state.back = -1;\n  //Tracev((stderr, \"inflate: reset\\n\"));\n  return Z_OK;\n}\n\nfunction inflateReset(strm) {\n  var state;\n\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  state.wsize = 0;\n  state.whave = 0;\n  state.wnext = 0;\n  return inflateResetKeep(strm);\n\n}\n\nfunction inflateReset2(strm, windowBits) {\n  var wrap;\n  var state;\n\n  /* get the state */\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n\n  /* extract wrap request from windowBits parameter */\n  if (windowBits < 0) {\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n  else {\n    wrap = (windowBits >> 4) + 1;\n    if (windowBits < 48) {\n      windowBits &= 15;\n    }\n  }\n\n  /* set number of window bits, free window if different */\n  if (windowBits && (windowBits < 8 || windowBits > 15)) {\n    return Z_STREAM_ERROR;\n  }\n  if (state.window !== null && state.wbits !== windowBits) {\n    state.window = null;\n  }\n\n  /* update state and reset the rest of it */\n  state.wrap = wrap;\n  state.wbits = windowBits;\n  return inflateReset(strm);\n}\n\nfunction inflateInit2(strm, windowBits) {\n  var ret;\n  var state;\n\n  if (!strm) { return Z_STREAM_ERROR; }\n  //strm.msg = Z_NULL;                 /* in case we return an error */\n\n  state = new InflateState();\n\n  //if (state === Z_NULL) return Z_MEM_ERROR;\n  //Tracev((stderr, \"inflate: allocated\\n\"));\n  strm.state = state;\n  state.window = null/*Z_NULL*/;\n  ret = inflateReset2(strm, windowBits);\n  if (ret !== Z_OK) {\n    strm.state = null/*Z_NULL*/;\n  }\n  return ret;\n}\n\nfunction inflateInit(strm) {\n  return inflateInit2(strm, DEF_WBITS);\n}\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding.  Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter.  This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time.  However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nvar virgin = true;\n\nvar lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\nfunction fixedtables(state) {\n  /* build fixed huffman tables if first call (may not be thread safe) */\n  if (virgin) {\n    var sym;\n\n    lenfix = new utils.Buf32(512);\n    distfix = new utils.Buf32(32);\n\n    /* literal/length table */\n    sym = 0;\n    while (sym < 144) { state.lens[sym++] = 8; }\n    while (sym < 256) { state.lens[sym++] = 9; }\n    while (sym < 280) { state.lens[sym++] = 7; }\n    while (sym < 288) { state.lens[sym++] = 8; }\n\n    inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });\n\n    /* distance table */\n    sym = 0;\n    while (sym < 32) { state.lens[sym++] = 5; }\n\n    inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });\n\n    /* do this just once */\n    virgin = false;\n  }\n\n  state.lencode = lenfix;\n  state.lenbits = 9;\n  state.distcode = distfix;\n  state.distbits = 5;\n}\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning.  If window does not exist yet, create it.  This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nfunction updatewindow(strm, src, end, copy) {\n  var dist;\n  var state = strm.state;\n\n  /* if it hasn't been done already, allocate space for the window */\n  if (state.window === null) {\n    state.wsize = 1 << state.wbits;\n    state.wnext = 0;\n    state.whave = 0;\n\n    state.window = new utils.Buf8(state.wsize);\n  }\n\n  /* copy state->wsize or less output bytes into the circular window */\n  if (copy >= state.wsize) {\n    utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);\n    state.wnext = 0;\n    state.whave = state.wsize;\n  }\n  else {\n    dist = state.wsize - state.wnext;\n    if (dist > copy) {\n      dist = copy;\n    }\n    //zmemcpy(state->window + state->wnext, end - copy, dist);\n    utils.arraySet(state.window, src, end - copy, dist, state.wnext);\n    copy -= dist;\n    if (copy) {\n      //zmemcpy(state->window, end - copy, copy);\n      utils.arraySet(state.window, src, end - copy, copy, 0);\n      state.wnext = copy;\n      state.whave = state.wsize;\n    }\n    else {\n      state.wnext += dist;\n      if (state.wnext === state.wsize) { state.wnext = 0; }\n      if (state.whave < state.wsize) { state.whave += dist; }\n    }\n  }\n  return 0;\n}\n\nfunction inflate(strm, flush) {\n  var state;\n  var input, output;          // input/output buffers\n  var next;                   /* next input INDEX */\n  var put;                    /* next output INDEX */\n  var have, left;             /* available input and output */\n  var hold;                   /* bit buffer */\n  var bits;                   /* bits in bit buffer */\n  var _in, _out;              /* save starting available input and output */\n  var copy;                   /* number of stored or match bytes to copy */\n  var from;                   /* where to copy match bytes from */\n  var from_source;\n  var here = 0;               /* current decoding table entry */\n  var here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n  //var last;                   /* parent table entry */\n  var last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n  var len;                    /* length to copy for repeats, bits to drop */\n  var ret;                    /* return code */\n  var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */\n  var opts;\n\n  var n; // temporary var for NEED_BITS\n\n  var order = /* permutation of code lengths */\n    [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];\n\n\n  if (!strm || !strm.state || !strm.output ||\n      (!strm.input && strm.avail_in !== 0)) {\n    return Z_STREAM_ERROR;\n  }\n\n  state = strm.state;\n  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */\n\n\n  //--- LOAD() ---\n  put = strm.next_out;\n  output = strm.output;\n  left = strm.avail_out;\n  next = strm.next_in;\n  input = strm.input;\n  have = strm.avail_in;\n  hold = state.hold;\n  bits = state.bits;\n  //---\n\n  _in = have;\n  _out = left;\n  ret = Z_OK;\n\n  inf_leave: // goto emulation\n  for (;;) {\n    switch (state.mode) {\n    case HEAD:\n      if (state.wrap === 0) {\n        state.mode = TYPEDO;\n        break;\n      }\n      //=== NEEDBITS(16);\n      while (bits < 16) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */\n        state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n        //=== CRC2(state.check, hold);\n        hbuf[0] = hold & 0xff;\n        hbuf[1] = (hold >>> 8) & 0xff;\n        state.check = crc32(state.check, hbuf, 2, 0);\n        //===//\n\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = FLAGS;\n        break;\n      }\n      state.flags = 0;           /* expect zlib header */\n      if (state.head) {\n        state.head.done = false;\n      }\n      if (!(state.wrap & 1) ||   /* check if zlib header allowed */\n        (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n        strm.msg = 'incorrect header check';\n        state.mode = BAD;\n        break;\n      }\n      if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n        strm.msg = 'unknown compression method';\n        state.mode = BAD;\n        break;\n      }\n      //--- DROPBITS(4) ---//\n      hold >>>= 4;\n      bits -= 4;\n      //---//\n      len = (hold & 0x0f)/*BITS(4)*/ + 8;\n      if (state.wbits === 0) {\n        state.wbits = len;\n      }\n      else if (len > state.wbits) {\n        strm.msg = 'invalid window size';\n        state.mode = BAD;\n        break;\n      }\n      state.dmax = 1 << len;\n      //Tracev((stderr, \"inflate:   zlib header ok\\n\"));\n      strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n      state.mode = hold & 0x200 ? DICTID : TYPE;\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      break;\n    case FLAGS:\n      //=== NEEDBITS(16); */\n      while (bits < 16) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      state.flags = hold;\n      if ((state.flags & 0xff) !== Z_DEFLATED) {\n        strm.msg = 'unknown compression method';\n        state.mode = BAD;\n        break;\n      }\n      if (state.flags & 0xe000) {\n        strm.msg = 'unknown header flags set';\n        state.mode = BAD;\n        break;\n      }\n      if (state.head) {\n        state.head.text = ((hold >> 8) & 1);\n      }\n      if (state.flags & 0x0200) {\n        //=== CRC2(state.check, hold);\n        hbuf[0] = hold & 0xff;\n        hbuf[1] = (hold >>> 8) & 0xff;\n        state.check = crc32(state.check, hbuf, 2, 0);\n        //===//\n      }\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = TIME;\n      /* falls through */\n    case TIME:\n      //=== NEEDBITS(32); */\n      while (bits < 32) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      if (state.head) {\n        state.head.time = hold;\n      }\n      if (state.flags & 0x0200) {\n        //=== CRC4(state.check, hold)\n        hbuf[0] = hold & 0xff;\n        hbuf[1] = (hold >>> 8) & 0xff;\n        hbuf[2] = (hold >>> 16) & 0xff;\n        hbuf[3] = (hold >>> 24) & 0xff;\n        state.check = crc32(state.check, hbuf, 4, 0);\n        //===\n      }\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = OS;\n      /* falls through */\n    case OS:\n      //=== NEEDBITS(16); */\n      while (bits < 16) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      if (state.head) {\n        state.head.xflags = (hold & 0xff);\n        state.head.os = (hold >> 8);\n      }\n      if (state.flags & 0x0200) {\n        //=== CRC2(state.check, hold);\n        hbuf[0] = hold & 0xff;\n        hbuf[1] = (hold >>> 8) & 0xff;\n        state.check = crc32(state.check, hbuf, 2, 0);\n        //===//\n      }\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = EXLEN;\n      /* falls through */\n    case EXLEN:\n      if (state.flags & 0x0400) {\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.length = hold;\n        if (state.head) {\n          state.head.extra_len = hold;\n        }\n        if (state.flags & 0x0200) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n      }\n      else if (state.head) {\n        state.head.extra = null/*Z_NULL*/;\n      }\n      state.mode = EXTRA;\n      /* falls through */\n    case EXTRA:\n      if (state.flags & 0x0400) {\n        copy = state.length;\n        if (copy > have) { copy = have; }\n        if (copy) {\n          if (state.head) {\n            len = state.head.extra_len - state.length;\n            if (!state.head.extra) {\n              // Use untyped array for more conveniend processing later\n              state.head.extra = new Array(state.head.extra_len);\n            }\n            utils.arraySet(\n              state.head.extra,\n              input,\n              next,\n              // extra field is limited to 65536 bytes\n              // - no need for additional size check\n              copy,\n              /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n              len\n            );\n            //zmemcpy(state.head.extra + len, next,\n            //        len + copy > state.head.extra_max ?\n            //        state.head.extra_max - len : copy);\n          }\n          if (state.flags & 0x0200) {\n            state.check = crc32(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          state.length -= copy;\n        }\n        if (state.length) { break inf_leave; }\n      }\n      state.length = 0;\n      state.mode = NAME;\n      /* falls through */\n    case NAME:\n      if (state.flags & 0x0800) {\n        if (have === 0) { break inf_leave; }\n        copy = 0;\n        do {\n          // TODO: 2 or 1 bytes?\n          len = input[next + copy++];\n          /* use constant limit because in js we should not preallocate memory */\n          if (state.head && len &&\n              (state.length < 65536 /*state.head.name_max*/)) {\n            state.head.name += String.fromCharCode(len);\n          }\n        } while (len && copy < have);\n\n        if (state.flags & 0x0200) {\n          state.check = crc32(state.check, input, copy, next);\n        }\n        have -= copy;\n        next += copy;\n        if (len) { break inf_leave; }\n      }\n      else if (state.head) {\n        state.head.name = null;\n      }\n      state.length = 0;\n      state.mode = COMMENT;\n      /* falls through */\n    case COMMENT:\n      if (state.flags & 0x1000) {\n        if (have === 0) { break inf_leave; }\n        copy = 0;\n        do {\n          len = input[next + copy++];\n          /* use constant limit because in js we should not preallocate memory */\n          if (state.head && len &&\n              (state.length < 65536 /*state.head.comm_max*/)) {\n            state.head.comment += String.fromCharCode(len);\n          }\n        } while (len && copy < have);\n        if (state.flags & 0x0200) {\n          state.check = crc32(state.check, input, copy, next);\n        }\n        have -= copy;\n        next += copy;\n        if (len) { break inf_leave; }\n      }\n      else if (state.head) {\n        state.head.comment = null;\n      }\n      state.mode = HCRC;\n      /* falls through */\n    case HCRC:\n      if (state.flags & 0x0200) {\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (hold !== (state.check & 0xffff)) {\n          strm.msg = 'header crc mismatch';\n          state.mode = BAD;\n          break;\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n      }\n      if (state.head) {\n        state.head.hcrc = ((state.flags >> 9) & 1);\n        state.head.done = true;\n      }\n      strm.adler = state.check = 0;\n      state.mode = TYPE;\n      break;\n    case DICTID:\n      //=== NEEDBITS(32); */\n      while (bits < 32) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      strm.adler = state.check = zswap32(hold);\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = DICT;\n      /* falls through */\n    case DICT:\n      if (state.havedict === 0) {\n        //--- RESTORE() ---\n        strm.next_out = put;\n        strm.avail_out = left;\n        strm.next_in = next;\n        strm.avail_in = have;\n        state.hold = hold;\n        state.bits = bits;\n        //---\n        return Z_NEED_DICT;\n      }\n      strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n      state.mode = TYPE;\n      /* falls through */\n    case TYPE:\n      if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n      /* falls through */\n    case TYPEDO:\n      if (state.last) {\n        //--- BYTEBITS() ---//\n        hold >>>= bits & 7;\n        bits -= bits & 7;\n        //---//\n        state.mode = CHECK;\n        break;\n      }\n      //=== NEEDBITS(3); */\n      while (bits < 3) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      state.last = (hold & 0x01)/*BITS(1)*/;\n      //--- DROPBITS(1) ---//\n      hold >>>= 1;\n      bits -= 1;\n      //---//\n\n      switch ((hold & 0x03)/*BITS(2)*/) {\n      case 0:                             /* stored block */\n        //Tracev((stderr, \"inflate:     stored block%s\\n\",\n        //        state.last ? \" (last)\" : \"\"));\n        state.mode = STORED;\n        break;\n      case 1:                             /* fixed block */\n        fixedtables(state);\n        //Tracev((stderr, \"inflate:     fixed codes block%s\\n\",\n        //        state.last ? \" (last)\" : \"\"));\n        state.mode = LEN_;             /* decode codes */\n        if (flush === Z_TREES) {\n          //--- DROPBITS(2) ---//\n          hold >>>= 2;\n          bits -= 2;\n          //---//\n          break inf_leave;\n        }\n        break;\n      case 2:                             /* dynamic block */\n        //Tracev((stderr, \"inflate:     dynamic codes block%s\\n\",\n        //        state.last ? \" (last)\" : \"\"));\n        state.mode = TABLE;\n        break;\n      case 3:\n        strm.msg = 'invalid block type';\n        state.mode = BAD;\n      }\n      //--- DROPBITS(2) ---//\n      hold >>>= 2;\n      bits -= 2;\n      //---//\n      break;\n    case STORED:\n      //--- BYTEBITS() ---// /* go to byte boundary */\n      hold >>>= bits & 7;\n      bits -= bits & 7;\n      //---//\n      //=== NEEDBITS(32); */\n      while (bits < 32) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n        strm.msg = 'invalid stored block lengths';\n        state.mode = BAD;\n        break;\n      }\n      state.length = hold & 0xffff;\n      //Tracev((stderr, \"inflate:       stored length %u\\n\",\n      //        state.length));\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = COPY_;\n      if (flush === Z_TREES) { break inf_leave; }\n      /* falls through */\n    case COPY_:\n      state.mode = COPY;\n      /* falls through */\n    case COPY:\n      copy = state.length;\n      if (copy) {\n        if (copy > have) { copy = have; }\n        if (copy > left) { copy = left; }\n        if (copy === 0) { break inf_leave; }\n        //--- zmemcpy(put, next, copy); ---\n        utils.arraySet(output, input, next, copy, put);\n        //---//\n        have -= copy;\n        next += copy;\n        left -= copy;\n        put += copy;\n        state.length -= copy;\n        break;\n      }\n      //Tracev((stderr, \"inflate:       stored end\\n\"));\n      state.mode = TYPE;\n      break;\n    case TABLE:\n      //=== NEEDBITS(14); */\n      while (bits < 14) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n      //--- DROPBITS(5) ---//\n      hold >>>= 5;\n      bits -= 5;\n      //---//\n      state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n      //--- DROPBITS(5) ---//\n      hold >>>= 5;\n      bits -= 5;\n      //---//\n      state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n      //--- DROPBITS(4) ---//\n      hold >>>= 4;\n      bits -= 4;\n      //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n      if (state.nlen > 286 || state.ndist > 30) {\n        strm.msg = 'too many length or distance symbols';\n        state.mode = BAD;\n        break;\n      }\n//#endif\n      //Tracev((stderr, \"inflate:       table sizes ok\\n\"));\n      state.have = 0;\n      state.mode = LENLENS;\n      /* falls through */\n    case LENLENS:\n      while (state.have < state.ncode) {\n        //=== NEEDBITS(3);\n        while (bits < 3) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n        //--- DROPBITS(3) ---//\n        hold >>>= 3;\n        bits -= 3;\n        //---//\n      }\n      while (state.have < 19) {\n        state.lens[order[state.have++]] = 0;\n      }\n      // We have separate tables & no pointers. 2 commented lines below not needed.\n      //state.next = state.codes;\n      //state.lencode = state.next;\n      // Switch to use dynamic table\n      state.lencode = state.lendyn;\n      state.lenbits = 7;\n\n      opts = { bits: state.lenbits };\n      ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n      state.lenbits = opts.bits;\n\n      if (ret) {\n        strm.msg = 'invalid code lengths set';\n        state.mode = BAD;\n        break;\n      }\n      //Tracev((stderr, \"inflate:       code lengths ok\\n\"));\n      state.have = 0;\n      state.mode = CODELENS;\n      /* falls through */\n    case CODELENS:\n      while (state.have < state.nlen + state.ndist) {\n        for (;;) {\n          here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if (here_val < 16) {\n          //--- DROPBITS(here.bits) ---//\n          hold >>>= here_bits;\n          bits -= here_bits;\n          //---//\n          state.lens[state.have++] = here_val;\n        }\n        else {\n          if (here_val === 16) {\n            //=== NEEDBITS(here.bits + 2);\n            n = here_bits + 2;\n            while (bits < n) {\n              if (have === 0) { break inf_leave; }\n              have--;\n              hold += input[next++] << bits;\n              bits += 8;\n            }\n            //===//\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            if (state.have === 0) {\n              strm.msg = 'invalid bit length repeat';\n              state.mode = BAD;\n              break;\n            }\n            len = state.lens[state.have - 1];\n            copy = 3 + (hold & 0x03);//BITS(2);\n            //--- DROPBITS(2) ---//\n            hold >>>= 2;\n            bits -= 2;\n            //---//\n          }\n          else if (here_val === 17) {\n            //=== NEEDBITS(here.bits + 3);\n            n = here_bits + 3;\n            while (bits < n) {\n              if (have === 0) { break inf_leave; }\n              have--;\n              hold += input[next++] << bits;\n              bits += 8;\n            }\n            //===//\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            len = 0;\n            copy = 3 + (hold & 0x07);//BITS(3);\n            //--- DROPBITS(3) ---//\n            hold >>>= 3;\n            bits -= 3;\n            //---//\n          }\n          else {\n            //=== NEEDBITS(here.bits + 7);\n            n = here_bits + 7;\n            while (bits < n) {\n              if (have === 0) { break inf_leave; }\n              have--;\n              hold += input[next++] << bits;\n              bits += 8;\n            }\n            //===//\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            len = 0;\n            copy = 11 + (hold & 0x7f);//BITS(7);\n            //--- DROPBITS(7) ---//\n            hold >>>= 7;\n            bits -= 7;\n            //---//\n          }\n          if (state.have + copy > state.nlen + state.ndist) {\n            strm.msg = 'invalid bit length repeat';\n            state.mode = BAD;\n            break;\n          }\n          while (copy--) {\n            state.lens[state.have++] = len;\n          }\n        }\n      }\n\n      /* handle error breaks in while */\n      if (state.mode === BAD) { break; }\n\n      /* check for end-of-block code (better have one) */\n      if (state.lens[256] === 0) {\n        strm.msg = 'invalid code -- missing end-of-block';\n        state.mode = BAD;\n        break;\n      }\n\n      /* build code tables -- note: do not change the lenbits or distbits\n         values here (9 and 6) without reading the comments in inftrees.h\n         concerning the ENOUGH constants, which depend on those values */\n      state.lenbits = 9;\n\n      opts = { bits: state.lenbits };\n      ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n      // We have separate tables & no pointers. 2 commented lines below not needed.\n      // state.next_index = opts.table_index;\n      state.lenbits = opts.bits;\n      // state.lencode = state.next;\n\n      if (ret) {\n        strm.msg = 'invalid literal/lengths set';\n        state.mode = BAD;\n        break;\n      }\n\n      state.distbits = 6;\n      //state.distcode.copy(state.codes);\n      // Switch to use dynamic table\n      state.distcode = state.distdyn;\n      opts = { bits: state.distbits };\n      ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n      // We have separate tables & no pointers. 2 commented lines below not needed.\n      // state.next_index = opts.table_index;\n      state.distbits = opts.bits;\n      // state.distcode = state.next;\n\n      if (ret) {\n        strm.msg = 'invalid distances set';\n        state.mode = BAD;\n        break;\n      }\n      //Tracev((stderr, 'inflate:       codes ok\\n'));\n      state.mode = LEN_;\n      if (flush === Z_TREES) { break inf_leave; }\n      /* falls through */\n    case LEN_:\n      state.mode = LEN;\n      /* falls through */\n    case LEN:\n      if (have >= 6 && left >= 258) {\n        //--- RESTORE() ---\n        strm.next_out = put;\n        strm.avail_out = left;\n        strm.next_in = next;\n        strm.avail_in = have;\n        state.hold = hold;\n        state.bits = bits;\n        //---\n        inflate_fast(strm, _out);\n        //--- LOAD() ---\n        put = strm.next_out;\n        output = strm.output;\n        left = strm.avail_out;\n        next = strm.next_in;\n        input = strm.input;\n        have = strm.avail_in;\n        hold = state.hold;\n        bits = state.bits;\n        //---\n\n        if (state.mode === TYPE) {\n          state.back = -1;\n        }\n        break;\n      }\n      state.back = 0;\n      for (;;) {\n        here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/\n        here_bits = here >>> 24;\n        here_op = (here >>> 16) & 0xff;\n        here_val = here & 0xffff;\n\n        if (here_bits <= bits) { break; }\n        //--- PULLBYTE() ---//\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n        //---//\n      }\n      if (here_op && (here_op & 0xf0) === 0) {\n        last_bits = here_bits;\n        last_op = here_op;\n        last_val = here_val;\n        for (;;) {\n          here = state.lencode[last_val +\n                  ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((last_bits + here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        //--- DROPBITS(last.bits) ---//\n        hold >>>= last_bits;\n        bits -= last_bits;\n        //---//\n        state.back += last_bits;\n      }\n      //--- DROPBITS(here.bits) ---//\n      hold >>>= here_bits;\n      bits -= here_bits;\n      //---//\n      state.back += here_bits;\n      state.length = here_val;\n      if (here_op === 0) {\n        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n        //        \"inflate:         literal '%c'\\n\" :\n        //        \"inflate:         literal 0x%02x\\n\", here.val));\n        state.mode = LIT;\n        break;\n      }\n      if (here_op & 32) {\n        //Tracevv((stderr, \"inflate:         end of block\\n\"));\n        state.back = -1;\n        state.mode = TYPE;\n        break;\n      }\n      if (here_op & 64) {\n        strm.msg = 'invalid literal/length code';\n        state.mode = BAD;\n        break;\n      }\n      state.extra = here_op & 15;\n      state.mode = LENEXT;\n      /* falls through */\n    case LENEXT:\n      if (state.extra) {\n        //=== NEEDBITS(state.extra);\n        n = state.extra;\n        while (bits < n) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n        //--- DROPBITS(state.extra) ---//\n        hold >>>= state.extra;\n        bits -= state.extra;\n        //---//\n        state.back += state.extra;\n      }\n      //Tracevv((stderr, \"inflate:         length %u\\n\", state.length));\n      state.was = state.length;\n      state.mode = DIST;\n      /* falls through */\n    case DIST:\n      for (;;) {\n        here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n        here_bits = here >>> 24;\n        here_op = (here >>> 16) & 0xff;\n        here_val = here & 0xffff;\n\n        if ((here_bits) <= bits) { break; }\n        //--- PULLBYTE() ---//\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n        //---//\n      }\n      if ((here_op & 0xf0) === 0) {\n        last_bits = here_bits;\n        last_op = here_op;\n        last_val = here_val;\n        for (;;) {\n          here = state.distcode[last_val +\n                  ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((last_bits + here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        //--- DROPBITS(last.bits) ---//\n        hold >>>= last_bits;\n        bits -= last_bits;\n        //---//\n        state.back += last_bits;\n      }\n      //--- DROPBITS(here.bits) ---//\n      hold >>>= here_bits;\n      bits -= here_bits;\n      //---//\n      state.back += here_bits;\n      if (here_op & 64) {\n        strm.msg = 'invalid distance code';\n        state.mode = BAD;\n        break;\n      }\n      state.offset = here_val;\n      state.extra = (here_op) & 15;\n      state.mode = DISTEXT;\n      /* falls through */\n    case DISTEXT:\n      if (state.extra) {\n        //=== NEEDBITS(state.extra);\n        n = state.extra;\n        while (bits < n) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n        //--- DROPBITS(state.extra) ---//\n        hold >>>= state.extra;\n        bits -= state.extra;\n        //---//\n        state.back += state.extra;\n      }\n//#ifdef INFLATE_STRICT\n      if (state.offset > state.dmax) {\n        strm.msg = 'invalid distance too far back';\n        state.mode = BAD;\n        break;\n      }\n//#endif\n      //Tracevv((stderr, \"inflate:         distance %u\\n\", state.offset));\n      state.mode = MATCH;\n      /* falls through */\n    case MATCH:\n      if (left === 0) { break inf_leave; }\n      copy = _out - left;\n      if (state.offset > copy) {         /* copy from window */\n        copy = state.offset - copy;\n        if (copy > state.whave) {\n          if (state.sane) {\n            strm.msg = 'invalid distance too far back';\n            state.mode = BAD;\n            break;\n          }\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//          Trace((stderr, \"inflate.c too far\\n\"));\n//          copy -= state.whave;\n//          if (copy > state.length) { copy = state.length; }\n//          if (copy > left) { copy = left; }\n//          left -= copy;\n//          state.length -= copy;\n//          do {\n//            output[put++] = 0;\n//          } while (--copy);\n//          if (state.length === 0) { state.mode = LEN; }\n//          break;\n//#endif\n        }\n        if (copy > state.wnext) {\n          copy -= state.wnext;\n          from = state.wsize - copy;\n        }\n        else {\n          from = state.wnext - copy;\n        }\n        if (copy > state.length) { copy = state.length; }\n        from_source = state.window;\n      }\n      else {                              /* copy from output */\n        from_source = output;\n        from = put - state.offset;\n        copy = state.length;\n      }\n      if (copy > left) { copy = left; }\n      left -= copy;\n      state.length -= copy;\n      do {\n        output[put++] = from_source[from++];\n      } while (--copy);\n      if (state.length === 0) { state.mode = LEN; }\n      break;\n    case LIT:\n      if (left === 0) { break inf_leave; }\n      output[put++] = state.length;\n      left--;\n      state.mode = LEN;\n      break;\n    case CHECK:\n      if (state.wrap) {\n        //=== NEEDBITS(32);\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          // Use '|' insdead of '+' to make sure that result is signed\n          hold |= input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        _out -= left;\n        strm.total_out += _out;\n        state.total += _out;\n        if (_out) {\n          strm.adler = state.check =\n              /*UPDATE(state.check, put - _out, _out);*/\n              (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));\n\n        }\n        _out = left;\n        // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n        if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n          strm.msg = 'incorrect data check';\n          state.mode = BAD;\n          break;\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        //Tracev((stderr, \"inflate:   check matches trailer\\n\"));\n      }\n      state.mode = LENGTH;\n      /* falls through */\n    case LENGTH:\n      if (state.wrap && state.flags) {\n        //=== NEEDBITS(32);\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (hold !== (state.total & 0xffffffff)) {\n          strm.msg = 'incorrect length check';\n          state.mode = BAD;\n          break;\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        //Tracev((stderr, \"inflate:   length matches trailer\\n\"));\n      }\n      state.mode = DONE;\n      /* falls through */\n    case DONE:\n      ret = Z_STREAM_END;\n      break inf_leave;\n    case BAD:\n      ret = Z_DATA_ERROR;\n      break inf_leave;\n    case MEM:\n      return Z_MEM_ERROR;\n    case SYNC:\n      /* falls through */\n    default:\n      return Z_STREAM_ERROR;\n    }\n  }\n\n  // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n  /*\n     Return from inflate(), updating the total counts and the check value.\n     If there was no progress during the inflate() call, return a buffer\n     error.  Call updatewindow() to create and/or update the window state.\n     Note: a memory error from inflate() is non-recoverable.\n   */\n\n  //--- RESTORE() ---\n  strm.next_out = put;\n  strm.avail_out = left;\n  strm.next_in = next;\n  strm.avail_in = have;\n  state.hold = hold;\n  state.bits = bits;\n  //---\n\n  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n                      (state.mode < CHECK || flush !== Z_FINISH))) {\n    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {\n      state.mode = MEM;\n      return Z_MEM_ERROR;\n    }\n  }\n  _in -= strm.avail_in;\n  _out -= strm.avail_out;\n  strm.total_in += _in;\n  strm.total_out += _out;\n  state.total += _out;\n  if (state.wrap && _out) {\n    strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n      (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));\n  }\n  strm.data_type = state.bits + (state.last ? 64 : 0) +\n                    (state.mode === TYPE ? 128 : 0) +\n                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n  if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {\n    ret = Z_BUF_ERROR;\n  }\n  return ret;\n}\n\nfunction inflateEnd(strm) {\n\n  if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  var state = strm.state;\n  if (state.window) {\n    state.window = null;\n  }\n  strm.state = null;\n  return Z_OK;\n}\n\nfunction inflateGetHeader(strm, head) {\n  var state;\n\n  /* check state */\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }\n\n  /* save header structure */\n  state.head = head;\n  head.done = false;\n  return Z_OK;\n}\n\nfunction inflateSetDictionary(strm, dictionary) {\n  var dictLength = dictionary.length;\n\n  var state;\n  var dictid;\n  var ret;\n\n  /* check state */\n  if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }\n  state = strm.state;\n\n  if (state.wrap !== 0 && state.mode !== DICT) {\n    return Z_STREAM_ERROR;\n  }\n\n  /* check for correct dictionary identifier */\n  if (state.mode === DICT) {\n    dictid = 1; /* adler32(0, null, 0)*/\n    /* dictid = adler32(dictid, dictionary, dictLength); */\n    dictid = adler32(dictid, dictionary, dictLength, 0);\n    if (dictid !== state.check) {\n      return Z_DATA_ERROR;\n    }\n  }\n  /* copy dictionary to window using updatewindow(), which will amend the\n   existing dictionary if appropriate */\n  ret = updatewindow(strm, dictionary, dictLength, dictLength);\n  if (ret) {\n    state.mode = MEM;\n    return Z_MEM_ERROR;\n  }\n  state.havedict = 1;\n  // Tracev((stderr, \"inflate:   dictionary set\\n\"));\n  return Z_OK;\n}\n\nexports.inflateReset = inflateReset;\nexports.inflateReset2 = inflateReset2;\nexports.inflateResetKeep = inflateResetKeep;\nexports.inflateInit = inflateInit;\nexports.inflateInit2 = inflateInit2;\nexports.inflate = inflate;\nexports.inflateEnd = inflateEnd;\nexports.inflateGetHeader = inflateGetHeader;\nexports.inflateSetDictionary = inflateSetDictionary;\nexports.inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nexports.inflateCopy = inflateCopy;\nexports.inflateGetDictionary = inflateGetDictionary;\nexports.inflateMark = inflateMark;\nexports.inflatePrime = inflatePrime;\nexports.inflateSync = inflateSync;\nexports.inflateSyncPoint = inflateSyncPoint;\nexports.inflateUndermine = inflateUndermine;\n*/\n\n},{\"../utils/common\":123,\"./adler32\":125,\"./crc32\":127,\"./inffast\":130,\"./inftrees\":132}],132:[function(require,module,exports){\n'use strict';\n\n\nvar utils = require('../utils/common');\n\nvar MAXBITS = 15;\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\nvar lbase = [ /* Length codes 257..285 base */\n  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n];\n\nvar lext = [ /* Length codes 257..285 extra */\n  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n];\n\nvar dbase = [ /* Distance codes 0..29 base */\n  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n  8193, 12289, 16385, 24577, 0, 0\n];\n\nvar dext = [ /* Distance codes 0..29 extra */\n  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n  28, 28, 29, 29, 64, 64\n];\n\nmodule.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)\n{\n  var bits = opts.bits;\n      //here = opts.here; /* table entry for duplication */\n\n  var len = 0;               /* a code's length in bits */\n  var sym = 0;               /* index of code symbols */\n  var min = 0, max = 0;          /* minimum and maximum code lengths */\n  var root = 0;              /* number of index bits for root table */\n  var curr = 0;              /* number of index bits for current table */\n  var drop = 0;              /* code bits to drop for sub-table */\n  var left = 0;                   /* number of prefix codes available */\n  var used = 0;              /* code entries in table used */\n  var huff = 0;              /* Huffman code */\n  var incr;              /* for incrementing code, index */\n  var fill;              /* index for replicating entries */\n  var low;               /* low bits for current root entry */\n  var mask;              /* mask for low root bits */\n  var next;             /* next available space in table */\n  var base = null;     /* base value table to use */\n  var base_index = 0;\n//  var shoextra;    /* extra bits table to use */\n  var end;                    /* use base and extra for symbol > end */\n  var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */\n  var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */\n  var extra = null;\n  var extra_index = 0;\n\n  var here_bits, here_op, here_val;\n\n  /*\n   Process a set of code lengths to create a canonical Huffman code.  The\n   code lengths are lens[0..codes-1].  Each length corresponds to the\n   symbols 0..codes-1.  The Huffman code is generated by first sorting the\n   symbols by length from short to long, and retaining the symbol order\n   for codes with equal lengths.  Then the code starts with all zero bits\n   for the first code of the shortest length, and the codes are integer\n   increments for the same length, and zeros are appended as the length\n   increases.  For the deflate format, these bits are stored backwards\n   from their more natural integer increment ordering, and so when the\n   decoding tables are built in the large loop below, the integer codes\n   are incremented backwards.\n\n   This routine assumes, but does not check, that all of the entries in\n   lens[] are in the range 0..MAXBITS.  The caller must assure this.\n   1..MAXBITS is interpreted as that code length.  zero means that that\n   symbol does not occur in this code.\n\n   The codes are sorted by computing a count of codes for each length,\n   creating from that a table of starting indices for each length in the\n   sorted table, and then entering the symbols in order in the sorted\n   table.  The sorted table is work[], with that space being provided by\n   the caller.\n\n   The length counts are used for other purposes as well, i.e. finding\n   the minimum and maximum length codes, determining if there are any\n   codes at all, checking for a valid set of lengths, and looking ahead\n   at length counts to determine sub-table sizes when building the\n   decoding tables.\n   */\n\n  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n  for (len = 0; len <= MAXBITS; len++) {\n    count[len] = 0;\n  }\n  for (sym = 0; sym < codes; sym++) {\n    count[lens[lens_index + sym]]++;\n  }\n\n  /* bound code lengths, force root to be within code lengths */\n  root = bits;\n  for (max = MAXBITS; max >= 1; max--) {\n    if (count[max] !== 0) { break; }\n  }\n  if (root > max) {\n    root = max;\n  }\n  if (max === 0) {                     /* no symbols to code at all */\n    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */\n    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;\n    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n    //table.op[opts.table_index] = 64;\n    //table.bits[opts.table_index] = 1;\n    //table.val[opts.table_index++] = 0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n    opts.bits = 1;\n    return 0;     /* no symbols, but wait for decoding to report error */\n  }\n  for (min = 1; min < max; min++) {\n    if (count[min] !== 0) { break; }\n  }\n  if (root < min) {\n    root = min;\n  }\n\n  /* check for an over-subscribed or incomplete set of lengths */\n  left = 1;\n  for (len = 1; len <= MAXBITS; len++) {\n    left <<= 1;\n    left -= count[len];\n    if (left < 0) {\n      return -1;\n    }        /* over-subscribed */\n  }\n  if (left > 0 && (type === CODES || max !== 1)) {\n    return -1;                      /* incomplete set */\n  }\n\n  /* generate offsets into symbol table for each length for sorting */\n  offs[1] = 0;\n  for (len = 1; len < MAXBITS; len++) {\n    offs[len + 1] = offs[len] + count[len];\n  }\n\n  /* sort symbols by length, by symbol order within each length */\n  for (sym = 0; sym < codes; sym++) {\n    if (lens[lens_index + sym] !== 0) {\n      work[offs[lens[lens_index + sym]]++] = sym;\n    }\n  }\n\n  /*\n   Create and fill in decoding tables.  In this loop, the table being\n   filled is at next and has curr index bits.  The code being used is huff\n   with length len.  That code is converted to an index by dropping drop\n   bits off of the bottom.  For codes where len is less than drop + curr,\n   those top drop + curr - len bits are incremented through all values to\n   fill the table with replicated entries.\n\n   root is the number of index bits for the root table.  When len exceeds\n   root, sub-tables are created pointed to by the root entry with an index\n   of the low root bits of huff.  This is saved in low to check for when a\n   new sub-table should be started.  drop is zero when the root table is\n   being filled, and drop is root when sub-tables are being filled.\n\n   When a new sub-table is needed, it is necessary to look ahead in the\n   code lengths to determine what size sub-table is needed.  The length\n   counts are used for this, and so count[] is decremented as codes are\n   entered in the tables.\n\n   used keeps track of how many table entries have been allocated from the\n   provided *table space.  It is checked for LENS and DIST tables against\n   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n   the initial root table size constants.  See the comments in inftrees.h\n   for more information.\n\n   sym increments through all symbols, and the loop terminates when\n   all codes of length max, i.e. all codes, have been processed.  This\n   routine permits incomplete codes, so another loop after this one fills\n   in the rest of the decoding tables with invalid code markers.\n   */\n\n  /* set up for code type */\n  // poor man optimization - use if-else instead of switch,\n  // to avoid deopts in old v8\n  if (type === CODES) {\n    base = extra = work;    /* dummy value--not used */\n    end = 19;\n\n  } else if (type === LENS) {\n    base = lbase;\n    base_index -= 257;\n    extra = lext;\n    extra_index -= 257;\n    end = 256;\n\n  } else {                    /* DISTS */\n    base = dbase;\n    extra = dext;\n    end = -1;\n  }\n\n  /* initialize opts for loop */\n  huff = 0;                   /* starting code */\n  sym = 0;                    /* starting code symbol */\n  len = min;                  /* starting code length */\n  next = table_index;              /* current table to fill in */\n  curr = root;                /* current table index bits */\n  drop = 0;                   /* current bits to drop from code for index */\n  low = -1;                   /* trigger new sub-table when len > root */\n  used = 1 << root;          /* use root table entries */\n  mask = used - 1;            /* mask for comparing low */\n\n  /* check available table space */\n  if ((type === LENS && used > ENOUGH_LENS) ||\n    (type === DISTS && used > ENOUGH_DISTS)) {\n    return 1;\n  }\n\n  var i = 0;\n  /* process all codes and make table entries */\n  for (;;) {\n    i++;\n    /* create table entry */\n    here_bits = len - drop;\n    if (work[sym] < end) {\n      here_op = 0;\n      here_val = work[sym];\n    }\n    else if (work[sym] > end) {\n      here_op = extra[extra_index + work[sym]];\n      here_val = base[base_index + work[sym]];\n    }\n    else {\n      here_op = 32 + 64;         /* end of block */\n      here_val = 0;\n    }\n\n    /* replicate for those indices with low len bits equal to huff */\n    incr = 1 << (len - drop);\n    fill = 1 << curr;\n    min = fill;                 /* save offset to next table */\n    do {\n      fill -= incr;\n      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n    } while (fill !== 0);\n\n    /* backwards increment the len-bit code huff */\n    incr = 1 << (len - 1);\n    while (huff & incr) {\n      incr >>= 1;\n    }\n    if (incr !== 0) {\n      huff &= incr - 1;\n      huff += incr;\n    } else {\n      huff = 0;\n    }\n\n    /* go to next symbol, update count, len */\n    sym++;\n    if (--count[len] === 0) {\n      if (len === max) { break; }\n      len = lens[lens_index + work[sym]];\n    }\n\n    /* create new sub-table if needed */\n    if (len > root && (huff & mask) !== low) {\n      /* if first time, transition to sub-tables */\n      if (drop === 0) {\n        drop = root;\n      }\n\n      /* increment past last table */\n      next += min;            /* here min is 1 << curr */\n\n      /* determine length of next table */\n      curr = len - drop;\n      left = 1 << curr;\n      while (curr + drop < max) {\n        left -= count[curr + drop];\n        if (left <= 0) { break; }\n        curr++;\n        left <<= 1;\n      }\n\n      /* check for enough space */\n      used += 1 << curr;\n      if ((type === LENS && used > ENOUGH_LENS) ||\n        (type === DISTS && used > ENOUGH_DISTS)) {\n        return 1;\n      }\n\n      /* point entry in root table to sub-table */\n      low = huff & mask;\n      /*table.op[low] = curr;\n      table.bits[low] = root;\n      table.val[low] = next - opts.table_index;*/\n      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n    }\n  }\n\n  /* fill in remaining table entry if code is incomplete (guaranteed to have\n   at most one remaining entry, since if the code is incomplete, the\n   maximum code length that was allowed to get this far is one bit) */\n  if (huff !== 0) {\n    //table.op[next + huff] = 64;            /* invalid code marker */\n    //table.bits[next + huff] = len - drop;\n    //table.val[next + huff] = 0;\n    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n  }\n\n  /* set return parameters */\n  //opts.table_index += used;\n  opts.bits = root;\n  return 0;\n};\n\n},{\"../utils/common\":123}],133:[function(require,module,exports){\n'use strict';\n\nmodule.exports = {\n  2:      'need dictionary',     /* Z_NEED_DICT       2  */\n  1:      'stream end',          /* Z_STREAM_END      1  */\n  0:      '',                    /* Z_OK              0  */\n  '-1':   'file error',          /* Z_ERRNO         (-1) */\n  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */\n  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */\n  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */\n  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */\n  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n},{}],134:[function(require,module,exports){\n'use strict';\n\n\nvar utils = require('../utils/common');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//var Z_FILTERED          = 1;\n//var Z_HUFFMAN_ONLY      = 2;\n//var Z_RLE               = 3;\nvar Z_FIXED               = 4;\n//var Z_DEFAULT_STRATEGY  = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nvar Z_BINARY              = 0;\nvar Z_TEXT                = 1;\n//var Z_ASCII             = 1; // = Z_TEXT\nvar Z_UNKNOWN             = 2;\n\n/*============================================================================*/\n\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nvar STORED_BLOCK = 0;\nvar STATIC_TREES = 1;\nvar DYN_TREES    = 2;\n/* The three kinds of block type */\n\nvar MIN_MATCH    = 3;\nvar MAX_MATCH    = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nvar LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nvar LITERALS      = 256;\n/* number of literal bytes 0..255 */\n\nvar L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nvar D_CODES       = 30;\n/* number of distance codes */\n\nvar BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\n\nvar HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\n\nvar MAX_BITS      = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar Buf_size      = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nvar MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nvar END_BLOCK   = 256;\n/* end of block literal code */\n\nvar REP_3_6     = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nvar REPZ_3_10   = 17;\n/* repeat a zero length 3-10 times  (3 bits of repeat count) */\n\nvar REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times  (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nvar extra_lbits =   /* extra bits for each length code */\n  [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];\n\nvar extra_dbits =   /* extra bits for each distance code */\n  [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];\n\nvar extra_blbits =  /* extra bits for each bit length code */\n  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];\n\nvar bl_order =\n  [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nvar DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1\nvar static_ltree  = new Array((L_CODES + 2) * 2);\nzero(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nvar static_dtree  = new Array(D_CODES * 2);\nzero(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nvar _dist_code    = new Array(DIST_CODE_LEN);\nzero(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nvar _length_code  = new Array(MAX_MATCH - MIN_MATCH + 1);\nzero(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nvar base_length   = new Array(LENGTH_CODES);\nzero(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nvar base_dist     = new Array(D_CODES);\nzero(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n  this.static_tree  = static_tree;  /* static tree or NULL */\n  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */\n  this.extra_base   = extra_base;   /* base index for extra_bits */\n  this.elems        = elems;        /* max number of elements in the tree */\n  this.max_length   = max_length;   /* max bit length for the codes */\n\n  // show if `static_tree` has data or dummy - needed for monomorphic objects\n  this.has_stree    = static_tree && static_tree.length;\n}\n\n\nvar static_l_desc;\nvar static_d_desc;\nvar static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n  this.dyn_tree = dyn_tree;     /* the dynamic tree */\n  this.max_code = 0;            /* largest code with non zero frequency */\n  this.stat_desc = stat_desc;   /* the corresponding static tree */\n}\n\n\n\nfunction d_code(dist) {\n  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n}\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nfunction put_short(s, w) {\n//    put_byte(s, (uch)((w) & 0xff));\n//    put_byte(s, (uch)((ush)(w) >> 8));\n  s.pending_buf[s.pending++] = (w) & 0xff;\n  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n}\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nfunction send_bits(s, value, length) {\n  if (s.bi_valid > (Buf_size - length)) {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    put_short(s, s.bi_buf);\n    s.bi_buf = value >> (Buf_size - s.bi_valid);\n    s.bi_valid += length - Buf_size;\n  } else {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    s.bi_valid += length;\n  }\n}\n\n\nfunction send_code(s, c, tree) {\n  send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n}\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nfunction bi_reverse(code, len) {\n  var res = 0;\n  do {\n    res |= code & 1;\n    code >>>= 1;\n    res <<= 1;\n  } while (--len > 0);\n  return res >>> 1;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nfunction bi_flush(s) {\n  if (s.bi_valid === 16) {\n    put_short(s, s.bi_buf);\n    s.bi_buf = 0;\n    s.bi_valid = 0;\n\n  } else if (s.bi_valid >= 8) {\n    s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n    s.bi_buf >>= 8;\n    s.bi_valid -= 8;\n  }\n}\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n *    above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n *     array bl_count contains the frequencies for each bit length.\n *     The length opt_len is updated; static_len is also updated if stree is\n *     not null.\n */\nfunction gen_bitlen(s, desc)\n//    deflate_state *s;\n//    tree_desc *desc;    /* the tree descriptor */\n{\n  var tree            = desc.dyn_tree;\n  var max_code        = desc.max_code;\n  var stree           = desc.stat_desc.static_tree;\n  var has_stree       = desc.stat_desc.has_stree;\n  var extra           = desc.stat_desc.extra_bits;\n  var base            = desc.stat_desc.extra_base;\n  var max_length      = desc.stat_desc.max_length;\n  var h;              /* heap index */\n  var n, m;           /* iterate over the tree elements */\n  var bits;           /* bit length */\n  var xbits;          /* extra bits */\n  var f;              /* frequency */\n  var overflow = 0;   /* number of elements with bit length too large */\n\n  for (bits = 0; bits <= MAX_BITS; bits++) {\n    s.bl_count[bits] = 0;\n  }\n\n  /* In a first pass, compute the optimal bit lengths (which may\n   * overflow in the case of the bit length tree).\n   */\n  tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n  for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {\n    n = s.heap[h];\n    bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n    if (bits > max_length) {\n      bits = max_length;\n      overflow++;\n    }\n    tree[n * 2 + 1]/*.Len*/ = bits;\n    /* We overwrite tree[n].Dad which is no longer needed */\n\n    if (n > max_code) { continue; } /* not a leaf node */\n\n    s.bl_count[bits]++;\n    xbits = 0;\n    if (n >= base) {\n      xbits = extra[n - base];\n    }\n    f = tree[n * 2]/*.Freq*/;\n    s.opt_len += f * (bits + xbits);\n    if (has_stree) {\n      s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n    }\n  }\n  if (overflow === 0) { return; }\n\n  // Trace((stderr,\"\\nbit length overflow\\n\"));\n  /* This happens for example on obj2 and pic of the Calgary corpus */\n\n  /* Find the first bit length which could increase: */\n  do {\n    bits = max_length - 1;\n    while (s.bl_count[bits] === 0) { bits--; }\n    s.bl_count[bits]--;      /* move one leaf down the tree */\n    s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n    s.bl_count[max_length]--;\n    /* The brother of the overflow item also moves one step up,\n     * but this does not affect bl_count[max_length]\n     */\n    overflow -= 2;\n  } while (overflow > 0);\n\n  /* Now recompute all bit lengths, scanning in increasing frequency.\n   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n   * lengths instead of fixing only the wrong ones. This idea is taken\n   * from 'ar' written by Haruhiko Okumura.)\n   */\n  for (bits = max_length; bits !== 0; bits--) {\n    n = s.bl_count[bits];\n    while (n !== 0) {\n      m = s.heap[--h];\n      if (m > max_code) { continue; }\n      if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n        // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n        s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n        tree[m * 2 + 1]/*.Len*/ = bits;\n      }\n      n--;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n *     zero code length.\n */\nfunction gen_codes(tree, max_code, bl_count)\n//    ct_data *tree;             /* the tree to decorate */\n//    int max_code;              /* largest code with non zero frequency */\n//    ushf *bl_count;            /* number of codes at each bit length */\n{\n  var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */\n  var code = 0;              /* running code value */\n  var bits;                  /* bit index */\n  var n;                     /* code index */\n\n  /* The distribution counts are first used to generate the code values\n   * without bit reversal.\n   */\n  for (bits = 1; bits <= MAX_BITS; bits++) {\n    next_code[bits] = code = (code + bl_count[bits - 1]) << 1;\n  }\n  /* Check that the bit counts in bl_count are consistent. The last code\n   * must be all ones.\n   */\n  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n  //        \"inconsistent bit counts\");\n  //Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n  for (n = 0;  n <= max_code; n++) {\n    var len = tree[n * 2 + 1]/*.Len*/;\n    if (len === 0) { continue; }\n    /* Now reverse the bits */\n    tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);\n\n    //Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n  }\n}\n\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nfunction tr_static_init() {\n  var n;        /* iterates over tree elements */\n  var bits;     /* bit counter */\n  var length;   /* length value */\n  var code;     /* code value */\n  var dist;     /* distance index */\n  var bl_count = new Array(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  // do check in _tr_init()\n  //if (static_init_done) return;\n\n  /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n  static_l_desc.static_tree = static_ltree;\n  static_l_desc.extra_bits = extra_lbits;\n  static_d_desc.static_tree = static_dtree;\n  static_d_desc.extra_bits = extra_dbits;\n  static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n  /* Initialize the mapping length (0..255) -> length code (0..28) */\n  length = 0;\n  for (code = 0; code < LENGTH_CODES - 1; code++) {\n    base_length[code] = length;\n    for (n = 0; n < (1 << extra_lbits[code]); n++) {\n      _length_code[length++] = code;\n    }\n  }\n  //Assert (length == 256, \"tr_static_init: length != 256\");\n  /* Note that the length 255 (match length 258) can be represented\n   * in two different ways: code 284 + 5 bits or code 285, so we\n   * overwrite length_code[255] to use the best encoding:\n   */\n  _length_code[length - 1] = code;\n\n  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n  dist = 0;\n  for (code = 0; code < 16; code++) {\n    base_dist[code] = dist;\n    for (n = 0; n < (1 << extra_dbits[code]); n++) {\n      _dist_code[dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: dist != 256\");\n  dist >>= 7; /* from now on, all distances are divided by 128 */\n  for (; code < D_CODES; code++) {\n    base_dist[code] = dist << 7;\n    for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n      _dist_code[256 + dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n  /* Construct the codes of the static literal tree */\n  for (bits = 0; bits <= MAX_BITS; bits++) {\n    bl_count[bits] = 0;\n  }\n\n  n = 0;\n  while (n <= 143) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  while (n <= 255) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 9;\n    n++;\n    bl_count[9]++;\n  }\n  while (n <= 279) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 7;\n    n++;\n    bl_count[7]++;\n  }\n  while (n <= 287) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  /* Codes 286 and 287 do not exist, but we must include them in the\n   * tree construction to get a canonical Huffman tree (longest code\n   * all ones)\n   */\n  gen_codes(static_ltree, L_CODES + 1, bl_count);\n\n  /* The static distance tree is trivial: */\n  for (n = 0; n < D_CODES; n++) {\n    static_dtree[n * 2 + 1]/*.Len*/ = 5;\n    static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n  }\n\n  // Now data ready and we can init static trees\n  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);\n  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);\n  static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);\n\n  //static_init_done = true;\n}\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nfunction init_block(s) {\n  var n; /* iterates over tree elements */\n\n  /* Initialize the trees. */\n  for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n  s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n  s.opt_len = s.static_len = 0;\n  s.last_lit = s.matches = 0;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nfunction bi_windup(s)\n{\n  if (s.bi_valid > 8) {\n    put_short(s, s.bi_buf);\n  } else if (s.bi_valid > 0) {\n    //put_byte(s, (Byte)s->bi_buf);\n    s.pending_buf[s.pending++] = s.bi_buf;\n  }\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n}\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nfunction copy_block(s, buf, len, header)\n//DeflateState *s;\n//charf    *buf;    /* the input data */\n//unsigned len;     /* its length */\n//int      header;  /* true if block header must be written */\n{\n  bi_windup(s);        /* align on byte boundary */\n\n  if (header) {\n    put_short(s, len);\n    put_short(s, ~len);\n  }\n//  while (len--) {\n//    put_byte(s, *buf++);\n//  }\n  utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);\n  s.pending += len;\n}\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nfunction smaller(tree, n, m, depth) {\n  var _n2 = n * 2;\n  var _m2 = m * 2;\n  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n}\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nfunction pqdownheap(s, tree, k)\n//    deflate_state *s;\n//    ct_data *tree;  /* the tree to restore */\n//    int k;               /* node to move down */\n{\n  var v = s.heap[k];\n  var j = k << 1;  /* left son of k */\n  while (j <= s.heap_len) {\n    /* Set j to the smallest of the two sons: */\n    if (j < s.heap_len &&\n      smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n      j++;\n    }\n    /* Exit if v is smaller than both sons */\n    if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n    /* Exchange v with the smallest son */\n    s.heap[k] = s.heap[j];\n    k = j;\n\n    /* And continue down the tree, setting j to the left son of k */\n    j <<= 1;\n  }\n  s.heap[k] = v;\n}\n\n\n// inlined manually\n// var SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nfunction compress_block(s, ltree, dtree)\n//    deflate_state *s;\n//    const ct_data *ltree; /* literal tree */\n//    const ct_data *dtree; /* distance tree */\n{\n  var dist;           /* distance of matched string */\n  var lc;             /* match length or unmatched char (if dist == 0) */\n  var lx = 0;         /* running index in l_buf */\n  var code;           /* the code to send */\n  var extra;          /* number of extra bits to send */\n\n  if (s.last_lit !== 0) {\n    do {\n      dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);\n      lc = s.pending_buf[s.l_buf + lx];\n      lx++;\n\n      if (dist === 0) {\n        send_code(s, lc, ltree); /* send a literal byte */\n        //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n      } else {\n        /* Here, lc is the match length - MIN_MATCH */\n        code = _length_code[lc];\n        send_code(s, code + LITERALS + 1, ltree); /* send the length code */\n        extra = extra_lbits[code];\n        if (extra !== 0) {\n          lc -= base_length[code];\n          send_bits(s, lc, extra);       /* send the extra length bits */\n        }\n        dist--; /* dist is now the match distance - 1 */\n        code = d_code(dist);\n        //Assert (code < D_CODES, \"bad d_code\");\n\n        send_code(s, code, dtree);       /* send the distance code */\n        extra = extra_dbits[code];\n        if (extra !== 0) {\n          dist -= base_dist[code];\n          send_bits(s, dist, extra);   /* send the extra distance bits */\n        }\n      } /* literal or match pair ? */\n\n      /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n      //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n      //       \"pendingBuf overflow\");\n\n    } while (lx < s.last_lit);\n  }\n\n  send_code(s, END_BLOCK, ltree);\n}\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n *     and corresponding code. The length opt_len is updated; static_len is\n *     also updated if stree is not null. The field max_code is set.\n */\nfunction build_tree(s, desc)\n//    deflate_state *s;\n//    tree_desc *desc; /* the tree descriptor */\n{\n  var tree     = desc.dyn_tree;\n  var stree    = desc.stat_desc.static_tree;\n  var has_stree = desc.stat_desc.has_stree;\n  var elems    = desc.stat_desc.elems;\n  var n, m;          /* iterate over heap elements */\n  var max_code = -1; /* largest code with non zero frequency */\n  var node;          /* new node being created */\n\n  /* Construct the initial heap, with least frequent element in\n   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n   * heap[0] is not used.\n   */\n  s.heap_len = 0;\n  s.heap_max = HEAP_SIZE;\n\n  for (n = 0; n < elems; n++) {\n    if (tree[n * 2]/*.Freq*/ !== 0) {\n      s.heap[++s.heap_len] = max_code = n;\n      s.depth[n] = 0;\n\n    } else {\n      tree[n * 2 + 1]/*.Len*/ = 0;\n    }\n  }\n\n  /* The pkzip format requires that at least one distance code exists,\n   * and that at least one bit should be sent even if there is only one\n   * possible code. So to avoid special checks later on we force at least\n   * two codes of non zero frequency.\n   */\n  while (s.heap_len < 2) {\n    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n    tree[node * 2]/*.Freq*/ = 1;\n    s.depth[node] = 0;\n    s.opt_len--;\n\n    if (has_stree) {\n      s.static_len -= stree[node * 2 + 1]/*.Len*/;\n    }\n    /* node is 0 or 1 so it does not have extra bits */\n  }\n  desc.max_code = max_code;\n\n  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n   * establish sub-heaps of increasing lengths:\n   */\n  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n  /* Construct the Huffman tree by repeatedly combining the least two\n   * frequent nodes.\n   */\n  node = elems;              /* next internal node of the tree */\n  do {\n    //pqremove(s, tree, n);  /* n = node of least frequency */\n    /*** pqremove ***/\n    n = s.heap[1/*SMALLEST*/];\n    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n    /***/\n\n    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n    s.heap[--s.heap_max] = m;\n\n    /* Create a new node father of n and m */\n    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n    tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n    /* and insert the new node in the heap */\n    s.heap[1/*SMALLEST*/] = node++;\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n\n  } while (s.heap_len >= 2);\n\n  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n  /* At this point, the fields freq and dad are set. We can now\n   * generate the bit lengths.\n   */\n  gen_bitlen(s, desc);\n\n  /* The field len is now set, we can generate the bit codes */\n  gen_codes(tree, max_code, s.bl_count);\n}\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nfunction scan_tree(s, tree, max_code)\n//    deflate_state *s;\n//    ct_data *tree;   /* the tree to be scanned */\n//    int max_code;    /* and its largest code of non zero frequency */\n{\n  var n;                     /* iterates over all tree elements */\n  var prevlen = -1;          /* last emitted length */\n  var curlen;                /* length of current code */\n\n  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  var count = 0;             /* repeat count of the current code */\n  var max_count = 7;         /* max repeat count */\n  var min_count = 4;         /* min repeat count */\n\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n  tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n    } else if (curlen !== 0) {\n\n      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n      s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n    } else if (count <= 10) {\n      s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n    } else {\n      s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n    }\n\n    count = 0;\n    prevlen = curlen;\n\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nfunction send_tree(s, tree, max_code)\n//    deflate_state *s;\n//    ct_data *tree; /* the tree to be scanned */\n//    int max_code;       /* and its largest code of non zero frequency */\n{\n  var n;                     /* iterates over all tree elements */\n  var prevlen = -1;          /* last emitted length */\n  var curlen;                /* length of current code */\n\n  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  var count = 0;             /* repeat count of the current code */\n  var max_count = 7;         /* max repeat count */\n  var min_count = 4;         /* min repeat count */\n\n  /* tree[max_code+1].Len = -1; */  /* guard already set */\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n    } else if (curlen !== 0) {\n      if (curlen !== prevlen) {\n        send_code(s, curlen, s.bl_tree);\n        count--;\n      }\n      //Assert(count >= 3 && count <= 6, \" 3_6?\");\n      send_code(s, REP_3_6, s.bl_tree);\n      send_bits(s, count - 3, 2);\n\n    } else if (count <= 10) {\n      send_code(s, REPZ_3_10, s.bl_tree);\n      send_bits(s, count - 3, 3);\n\n    } else {\n      send_code(s, REPZ_11_138, s.bl_tree);\n      send_bits(s, count - 11, 7);\n    }\n\n    count = 0;\n    prevlen = curlen;\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nfunction build_bl_tree(s) {\n  var max_blindex;  /* index of last bit length code of non zero freq */\n\n  /* Determine the bit length frequencies for literal and distance trees */\n  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n  /* Build the bit length tree: */\n  build_tree(s, s.bl_desc);\n  /* opt_len now includes the length of the tree representations, except\n   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n   */\n\n  /* Determine the number of bit length codes to send. The pkzip format\n   * requires that at least 4 bit length codes be sent. (appnote.txt says\n   * 3 but the actual value used is 4.)\n   */\n  for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {\n    if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n      break;\n    }\n  }\n  /* Update opt_len to include the bit length tree and counts */\n  s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n  //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n  //        s->opt_len, s->static_len));\n\n  return max_blindex;\n}\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nfunction send_all_trees(s, lcodes, dcodes, blcodes)\n//    deflate_state *s;\n//    int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n  var rank;                    /* index in bl_order */\n\n  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n  //        \"too many codes\");\n  //Tracev((stderr, \"\\nbl counts: \"));\n  send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n  send_bits(s, dcodes - 1,   5);\n  send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */\n  for (rank = 0; rank < blcodes; rank++) {\n    //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n    send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n  }\n  //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n  //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n  //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n}\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n *    a) There are no non-portable control characters belonging to the\n *       \"black list\" (0..6, 14..25, 28..31).\n *    b) There is at least one printable character belonging to the\n *       \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n *   \"gray list\" that is ignored in this detection algorithm:\n *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nfunction detect_data_type(s) {\n  /* black_mask is the bit mask of black-listed bytes\n   * set bits 0..6, 14..25, and 28..31\n   * 0xf3ffc07f = binary 11110011111111111100000001111111\n   */\n  var black_mask = 0xf3ffc07f;\n  var n;\n\n  /* Check for non-textual (\"black-listed\") bytes. */\n  for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n    if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n      return Z_BINARY;\n    }\n  }\n\n  /* Check for textual (\"white-listed\") bytes. */\n  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n    return Z_TEXT;\n  }\n  for (n = 32; n < LITERALS; n++) {\n    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n      return Z_TEXT;\n    }\n  }\n\n  /* There are no \"black-listed\" or \"white-listed\" bytes:\n   * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n   */\n  return Z_BINARY;\n}\n\n\nvar static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nfunction _tr_init(s)\n{\n\n  if (!static_init_done) {\n    tr_static_init();\n    static_init_done = true;\n  }\n\n  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);\n  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);\n  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n\n  /* Initialize the first block of the first file: */\n  init_block(s);\n}\n\n\n/* ===========================================================================\n * Send a stored block\n */\nfunction _tr_stored_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf;       /* input block */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n{\n  send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */\n  copy_block(s, buf, stored_len, true); /* with header */\n}\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nfunction _tr_align(s) {\n  send_bits(s, STATIC_TREES << 1, 3);\n  send_code(s, END_BLOCK, static_ltree);\n  bi_flush(s);\n}\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nfunction _tr_flush_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf;       /* input block, or NULL if too old */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n{\n  var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */\n  var max_blindex = 0;        /* index of last bit length code of non zero freq */\n\n  /* Build the Huffman trees unless a stored block is forced */\n  if (s.level > 0) {\n\n    /* Check if the file is binary or text */\n    if (s.strm.data_type === Z_UNKNOWN) {\n      s.strm.data_type = detect_data_type(s);\n    }\n\n    /* Construct the literal and distance trees */\n    build_tree(s, s.l_desc);\n    // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n\n    build_tree(s, s.d_desc);\n    // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n    /* At this point, opt_len and static_len are the total bit lengths of\n     * the compressed block data, excluding the tree representations.\n     */\n\n    /* Build the bit length tree for the above two trees, and get the index\n     * in bl_order of the last bit length code to send.\n     */\n    max_blindex = build_bl_tree(s);\n\n    /* Determine the best encoding. Compute the block lengths in bytes. */\n    opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n    static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n    // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n    //        s->last_lit));\n\n    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n  } else {\n    // Assert(buf != (char*)0, \"lost buf\");\n    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n  }\n\n  if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n    /* 4: two words for the lengths */\n\n    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n     * Otherwise we can't have processed more than WSIZE input bytes since\n     * the last block flush, because compression would have been\n     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n     * transform a block into a stored block.\n     */\n    _tr_stored_block(s, buf, stored_len, last);\n\n  } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {\n\n    send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n    compress_block(s, static_ltree, static_dtree);\n\n  } else {\n    send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n    send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n    compress_block(s, s.dyn_ltree, s.dyn_dtree);\n  }\n  // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n  /* The above check is made mod 2^32, for files larger than 512 MB\n   * and uLong implemented on 32 bits.\n   */\n  init_block(s);\n\n  if (last) {\n    bi_windup(s);\n  }\n  // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n  //       s->compressed_len-7*last));\n}\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nfunction _tr_tally(s, dist, lc)\n//    deflate_state *s;\n//    unsigned dist;  /* distance of matched string */\n//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n  //var out_length, in_length, dcode;\n\n  s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;\n  s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n  s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n  s.last_lit++;\n\n  if (dist === 0) {\n    /* lc is the unmatched char */\n    s.dyn_ltree[lc * 2]/*.Freq*/++;\n  } else {\n    s.matches++;\n    /* Here, lc is the match length - MIN_MATCH */\n    dist--;             /* dist = match distance - 1 */\n    //Assert((ush)dist < (ush)MAX_DIST(s) &&\n    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n    //       (ush)d_code(dist) < (ush)D_CODES,  \"_tr_tally: bad match\");\n\n    s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;\n    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n  }\n\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n//  /* Try to guess if it is profitable to stop the current block here */\n//  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n//    /* Compute an upper bound for the compressed length */\n//    out_length = s.last_lit*8;\n//    in_length = s.strstart - s.block_start;\n//\n//    for (dcode = 0; dcode < D_CODES; dcode++) {\n//      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n//    }\n//    out_length >>>= 3;\n//    //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n//    //       s->last_lit, in_length, out_length,\n//    //       100L - out_length*100L/in_length));\n//    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n//      return true;\n//    }\n//  }\n//#endif\n\n  return (s.last_lit === s.lit_bufsize - 1);\n  /* We avoid equality with lit_bufsize because of wraparound at 64K\n   * on 16 bit machines and because stored blocks are restricted to\n   * 64K-1 bytes.\n   */\n}\n\nexports._tr_init  = _tr_init;\nexports._tr_stored_block = _tr_stored_block;\nexports._tr_flush_block  = _tr_flush_block;\nexports._tr_tally = _tr_tally;\nexports._tr_align = _tr_align;\n\n},{\"../utils/common\":123}],135:[function(require,module,exports){\n'use strict';\n\n\nfunction ZStream() {\n  /* next input byte */\n  this.input = null; // JS specific, because we have no pointers\n  this.next_in = 0;\n  /* number of bytes available at input */\n  this.avail_in = 0;\n  /* total number of input bytes read so far */\n  this.total_in = 0;\n  /* next output byte should be put there */\n  this.output = null; // JS specific, because we have no pointers\n  this.next_out = 0;\n  /* remaining free space at output */\n  this.avail_out = 0;\n  /* total number of bytes output so far */\n  this.total_out = 0;\n  /* last error message, NULL if no error */\n  this.msg = ''/*Z_NULL*/;\n  /* not visible by applications */\n  this.state = null;\n  /* best guess about the data type: binary or text */\n  this.data_type = 2/*Z_UNKNOWN*/;\n  /* adler32 value of the uncompressed data */\n  this.adler = 0;\n}\n\nmodule.exports = ZStream;\n\n},{}],136:[function(require,module,exports){\n(function (process){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n  // if the path tries to go above the root, `up` ends up > 0\n  var up = 0;\n  for (var i = parts.length - 1; i >= 0; i--) {\n    var last = parts[i];\n    if (last === '.') {\n      parts.splice(i, 1);\n    } else if (last === '..') {\n      parts.splice(i, 1);\n      up++;\n    } else if (up) {\n      parts.splice(i, 1);\n      up--;\n    }\n  }\n\n  // if the path is allowed to go above the root, restore leading ..s\n  if (allowAboveRoot) {\n    for (; up--; up) {\n      parts.unshift('..');\n    }\n  }\n\n  return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n    /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar splitPath = function(filename) {\n  return splitPathRe.exec(filename).slice(1);\n};\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n  var resolvedPath = '',\n      resolvedAbsolute = false;\n\n  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n    var path = (i >= 0) ? arguments[i] : process.cwd();\n\n    // Skip empty and invalid entries\n    if (typeof path !== 'string') {\n      throw new TypeError('Arguments to path.resolve must be strings');\n    } else if (!path) {\n      continue;\n    }\n\n    resolvedPath = path + '/' + resolvedPath;\n    resolvedAbsolute = path.charAt(0) === '/';\n  }\n\n  // At this point the path should be resolved to a full absolute path, but\n  // handle relative paths to be safe (might happen when process.cwd() fails)\n\n  // Normalize the path\n  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n    return !!p;\n  }), !resolvedAbsolute).join('/');\n\n  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n  var isAbsolute = exports.isAbsolute(path),\n      trailingSlash = substr(path, -1) === '/';\n\n  // Normalize the path\n  path = normalizeArray(filter(path.split('/'), function(p) {\n    return !!p;\n  }), !isAbsolute).join('/');\n\n  if (!path && !isAbsolute) {\n    path = '.';\n  }\n  if (path && trailingSlash) {\n    path += '/';\n  }\n\n  return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n  return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n  var paths = Array.prototype.slice.call(arguments, 0);\n  return exports.normalize(filter(paths, function(p, index) {\n    if (typeof p !== 'string') {\n      throw new TypeError('Arguments to path.join must be strings');\n    }\n    return p;\n  }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n  from = exports.resolve(from).substr(1);\n  to = exports.resolve(to).substr(1);\n\n  function trim(arr) {\n    var start = 0;\n    for (; start < arr.length; start++) {\n      if (arr[start] !== '') break;\n    }\n\n    var end = arr.length - 1;\n    for (; end >= 0; end--) {\n      if (arr[end] !== '') break;\n    }\n\n    if (start > end) return [];\n    return arr.slice(start, end - start + 1);\n  }\n\n  var fromParts = trim(from.split('/'));\n  var toParts = trim(to.split('/'));\n\n  var length = Math.min(fromParts.length, toParts.length);\n  var samePartsLength = length;\n  for (var i = 0; i < length; i++) {\n    if (fromParts[i] !== toParts[i]) {\n      samePartsLength = i;\n      break;\n    }\n  }\n\n  var outputParts = [];\n  for (var i = samePartsLength; i < fromParts.length; i++) {\n    outputParts.push('..');\n  }\n\n  outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n  return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function(path) {\n  var result = splitPath(path),\n      root = result[0],\n      dir = result[1];\n\n  if (!root && !dir) {\n    // No dirname whatsoever\n    return '.';\n  }\n\n  if (dir) {\n    // It has a dirname, strip trailing slash\n    dir = dir.substr(0, dir.length - 1);\n  }\n\n  return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n  var f = splitPath(path)[2];\n  // TODO: make this comparison case-insensitive on windows?\n  if (ext && f.substr(-1 * ext.length) === ext) {\n    f = f.substr(0, f.length - ext.length);\n  }\n  return f;\n};\n\n\nexports.extname = function(path) {\n  return splitPath(path)[3];\n};\n\nfunction filter (xs, f) {\n    if (xs.filter) return xs.filter(f);\n    var res = [];\n    for (var i = 0; i < xs.length; i++) {\n        if (f(xs[i], i, xs)) res.push(xs[i]);\n    }\n    return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n    ? function (str, start, len) { return str.substr(start, len) }\n    : function (str, start, len) {\n        if (start < 0) start = str.length + start;\n        return str.substr(start, len);\n    }\n;\n\n}).call(this,require('_process'))\n},{\"_process\":138}],137:[function(require,module,exports){\n(function (process){\n'use strict';\n\nif (!process.version ||\n    process.version.indexOf('v0.') === 0 ||\n    process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {\n  module.exports = nextTick;\n} else {\n  module.exports = process.nextTick;\n}\n\nfunction nextTick(fn, arg1, arg2, arg3) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('\"callback\" argument must be a function');\n  }\n  var len = arguments.length;\n  var args, i;\n  switch (len) {\n  case 0:\n  case 1:\n    return process.nextTick(fn);\n  case 2:\n    return process.nextTick(function afterTickOne() {\n      fn.call(null, arg1);\n    });\n  case 3:\n    return process.nextTick(function afterTickTwo() {\n      fn.call(null, arg1, arg2);\n    });\n  case 4:\n    return process.nextTick(function afterTickThree() {\n      fn.call(null, arg1, arg2, arg3);\n    });\n  default:\n    args = new Array(len - 1);\n    i = 0;\n    while (i < args.length) {\n      args[i++] = arguments[i];\n    }\n    return process.nextTick(function afterTick() {\n      fn.apply(null, args);\n    });\n  }\n}\n\n}).call(this,require('_process'))\n},{\"_process\":138}],138:[function(require,module,exports){\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],139:[function(require,module,exports){\nmodule.exports = require(\"./lib/_stream_duplex.js\")\n\n},{\"./lib/_stream_duplex.js\":140}],140:[function(require,module,exports){\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n\n'use strict';\n\n/*<replacement>*/\n\nvar objectKeys = Object.keys || function (obj) {\n  var keys = [];\n  for (var key in obj) {\n    keys.push(key);\n  }return keys;\n};\n/*</replacement>*/\n\nmodule.exports = Duplex;\n\n/*<replacement>*/\nvar processNextTick = require('process-nextick-args');\n/*</replacement>*/\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nvar Readable = require('./_stream_readable');\nvar Writable = require('./_stream_writable');\n\nutil.inherits(Duplex, Readable);\n\nvar keys = objectKeys(Writable.prototype);\nfor (var v = 0; v < keys.length; v++) {\n  var method = keys[v];\n  if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n}\n\nfunction Duplex(options) {\n  if (!(this instanceof Duplex)) return new Duplex(options);\n\n  Readable.call(this, options);\n  Writable.call(this, options);\n\n  if (options && options.readable === false) this.readable = false;\n\n  if (options && options.writable === false) this.writable = false;\n\n  this.allowHalfOpen = true;\n  if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;\n\n  this.once('end', onend);\n}\n\n// the no-half-open enforcer\nfunction onend() {\n  // if we allow half-open state, or if the writable side ended,\n  // then we're ok.\n  if (this.allowHalfOpen || this._writableState.ended) return;\n\n  // no more data can be written.\n  // But allow more writes to happen in this tick.\n  processNextTick(onEndNT, this);\n}\n\nfunction onEndNT(self) {\n  self.end();\n}\n\nfunction forEach(xs, f) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    f(xs[i], i);\n  }\n}\n},{\"./_stream_readable\":142,\"./_stream_writable\":144,\"core-util-is\":78,\"inherits\":81,\"process-nextick-args\":137}],141:[function(require,module,exports){\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n\n'use strict';\n\nmodule.exports = PassThrough;\n\nvar Transform = require('./_stream_transform');\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nutil.inherits(PassThrough, Transform);\n\nfunction PassThrough(options) {\n  if (!(this instanceof PassThrough)) return new PassThrough(options);\n\n  Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n  cb(null, chunk);\n};\n},{\"./_stream_transform\":143,\"core-util-is\":78,\"inherits\":81}],142:[function(require,module,exports){\n(function (process){\n'use strict';\n\nmodule.exports = Readable;\n\n/*<replacement>*/\nvar processNextTick = require('process-nextick-args');\n/*</replacement>*/\n\n/*<replacement>*/\nvar isArray = require('isarray');\n/*</replacement>*/\n\n/*<replacement>*/\nvar Duplex;\n/*</replacement>*/\n\nReadable.ReadableState = ReadableState;\n\n/*<replacement>*/\nvar EE = require('events').EventEmitter;\n\nvar EElistenerCount = function (emitter, type) {\n  return emitter.listeners(type).length;\n};\n/*</replacement>*/\n\n/*<replacement>*/\nvar Stream;\n(function () {\n  try {\n    Stream = require('st' + 'ream');\n  } catch (_) {} finally {\n    if (!Stream) Stream = require('events').EventEmitter;\n  }\n})();\n/*</replacement>*/\n\nvar Buffer = require('buffer').Buffer;\n/*<replacement>*/\nvar bufferShim = require('buffer-shims');\n/*</replacement>*/\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\n/*<replacement>*/\nvar debugUtil = require('util');\nvar debug = void 0;\nif (debugUtil && debugUtil.debuglog) {\n  debug = debugUtil.debuglog('stream');\n} else {\n  debug = function () {};\n}\n/*</replacement>*/\n\nvar BufferList = require('./internal/streams/BufferList');\nvar StringDecoder;\n\nutil.inherits(Readable, Stream);\n\nfunction prependListener(emitter, event, fn) {\n  // Sadly this is not cacheable as some libraries bundle their own\n  // event emitter implementation with them.\n  if (typeof emitter.prependListener === 'function') {\n    return emitter.prependListener(event, fn);\n  } else {\n    // This is a hack to make sure that our error handler is attached before any\n    // userland ones.  NEVER DO THIS. This is here only because this code needs\n    // to continue to work with older versions of Node.js that do not include\n    // the prependListener() method. The goal is to eventually remove this hack.\n    if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];\n  }\n}\n\nfunction ReadableState(options, stream) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  options = options || {};\n\n  // object stream flag. Used to make read(n) ignore n and to\n  // make all the buffer merging and length checks go away\n  this.objectMode = !!options.objectMode;\n\n  if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode;\n\n  // the point at which it stops calling _read() to fill the buffer\n  // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n  var hwm = options.highWaterMark;\n  var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n  this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;\n\n  // cast to ints.\n  this.highWaterMark = ~~this.highWaterMark;\n\n  // A linked list is used to store data chunks instead of an array because the\n  // linked list can remove elements from the beginning faster than\n  // array.shift()\n  this.buffer = new BufferList();\n  this.length = 0;\n  this.pipes = null;\n  this.pipesCount = 0;\n  this.flowing = null;\n  this.ended = false;\n  this.endEmitted = false;\n  this.reading = false;\n\n  // a flag to be able to tell if the onwrite cb is called immediately,\n  // or on a later tick.  We set this to true at first, because any\n  // actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first write call.\n  this.sync = true;\n\n  // whenever we return null, then we set a flag to say\n  // that we're awaiting a 'readable' event emission.\n  this.needReadable = false;\n  this.emittedReadable = false;\n  this.readableListening = false;\n  this.resumeScheduled = false;\n\n  // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n  this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n  // when piping, we only care about 'readable' events that happen\n  // after read()ing all the bytes and not getting any pushback.\n  this.ranOut = false;\n\n  // the number of writers that are awaiting a drain event in .pipe()s\n  this.awaitDrain = 0;\n\n  // if true, a maybeReadMore has been scheduled\n  this.readingMore = false;\n\n  this.decoder = null;\n  this.encoding = null;\n  if (options.encoding) {\n    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n    this.decoder = new StringDecoder(options.encoding);\n    this.encoding = options.encoding;\n  }\n}\n\nfunction Readable(options) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  if (!(this instanceof Readable)) return new Readable(options);\n\n  this._readableState = new ReadableState(options, this);\n\n  // legacy\n  this.readable = true;\n\n  if (options && typeof options.read === 'function') this._read = options.read;\n\n  Stream.call(this);\n}\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function (chunk, encoding) {\n  var state = this._readableState;\n\n  if (!state.objectMode && typeof chunk === 'string') {\n    encoding = encoding || state.defaultEncoding;\n    if (encoding !== state.encoding) {\n      chunk = bufferShim.from(chunk, encoding);\n      encoding = '';\n    }\n  }\n\n  return readableAddChunk(this, state, chunk, encoding, false);\n};\n\n// Unshift should *always* be something directly out of read()\nReadable.prototype.unshift = function (chunk) {\n  var state = this._readableState;\n  return readableAddChunk(this, state, chunk, '', true);\n};\n\nReadable.prototype.isPaused = function () {\n  return this._readableState.flowing === false;\n};\n\nfunction readableAddChunk(stream, state, chunk, encoding, addToFront) {\n  var er = chunkInvalid(state, chunk);\n  if (er) {\n    stream.emit('error', er);\n  } else if (chunk === null) {\n    state.reading = false;\n    onEofChunk(stream, state);\n  } else if (state.objectMode || chunk && chunk.length > 0) {\n    if (state.ended && !addToFront) {\n      var e = new Error('stream.push() after EOF');\n      stream.emit('error', e);\n    } else if (state.endEmitted && addToFront) {\n      var _e = new Error('stream.unshift() after end event');\n      stream.emit('error', _e);\n    } else {\n      var skipAdd;\n      if (state.decoder && !addToFront && !encoding) {\n        chunk = state.decoder.write(chunk);\n        skipAdd = !state.objectMode && chunk.length === 0;\n      }\n\n      if (!addToFront) state.reading = false;\n\n      // Don't add to the buffer if we've decoded to an empty string chunk and\n      // we're not in object mode\n      if (!skipAdd) {\n        // if we want the data now, just emit it.\n        if (state.flowing && state.length === 0 && !state.sync) {\n          stream.emit('data', chunk);\n          stream.read(0);\n        } else {\n          // update the buffer info.\n          state.length += state.objectMode ? 1 : chunk.length;\n          if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n\n          if (state.needReadable) emitReadable(stream);\n        }\n      }\n\n      maybeReadMore(stream, state);\n    }\n  } else if (!addToFront) {\n    state.reading = false;\n  }\n\n  return needMoreData(state);\n}\n\n// if it's past the high water mark, we can push in some more.\n// Also, if we have no data yet, we can stand some\n// more bytes.  This is to work around cases where hwm=0,\n// such as the repl.  Also, if the push() triggered a\n// readable event, and the user called read(largeNumber) such that\n// needReadable was set, then we ought to push more, so that another\n// 'readable' event will be triggered.\nfunction needMoreData(state) {\n  return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);\n}\n\n// backwards compatibility.\nReadable.prototype.setEncoding = function (enc) {\n  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n  this._readableState.decoder = new StringDecoder(enc);\n  this._readableState.encoding = enc;\n  return this;\n};\n\n// Don't raise the hwm > 8MB\nvar MAX_HWM = 0x800000;\nfunction computeNewHighWaterMark(n) {\n  if (n >= MAX_HWM) {\n    n = MAX_HWM;\n  } else {\n    // Get the next highest power of 2 to prevent increasing hwm excessively in\n    // tiny amounts\n    n--;\n    n |= n >>> 1;\n    n |= n >>> 2;\n    n |= n >>> 4;\n    n |= n >>> 8;\n    n |= n >>> 16;\n    n++;\n  }\n  return n;\n}\n\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction howMuchToRead(n, state) {\n  if (n <= 0 || state.length === 0 && state.ended) return 0;\n  if (state.objectMode) return 1;\n  if (n !== n) {\n    // Only flow one buffer at a time\n    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n  }\n  // If we're asking for more than the current hwm, then raise the hwm.\n  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n  if (n <= state.length) return n;\n  // Don't have enough\n  if (!state.ended) {\n    state.needReadable = true;\n    return 0;\n  }\n  return state.length;\n}\n\n// you can override either this method, or the async _read(n) below.\nReadable.prototype.read = function (n) {\n  debug('read', n);\n  n = parseInt(n, 10);\n  var state = this._readableState;\n  var nOrig = n;\n\n  if (n !== 0) state.emittedReadable = false;\n\n  // if we're doing read(0) to trigger a readable event, but we\n  // already have a bunch of data in the buffer, then just trigger\n  // the 'readable' event and move on.\n  if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {\n    debug('read: emitReadable', state.length, state.ended);\n    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n    return null;\n  }\n\n  n = howMuchToRead(n, state);\n\n  // if we've ended, and we're now clear, then finish it up.\n  if (n === 0 && state.ended) {\n    if (state.length === 0) endReadable(this);\n    return null;\n  }\n\n  // All the actual chunk generation logic needs to be\n  // *below* the call to _read.  The reason is that in certain\n  // synthetic stream cases, such as passthrough streams, _read\n  // may be a completely synchronous operation which may change\n  // the state of the read buffer, providing enough data when\n  // before there was *not* enough.\n  //\n  // So, the steps are:\n  // 1. Figure out what the state of things will be after we do\n  // a read from the buffer.\n  //\n  // 2. If that resulting state will trigger a _read, then call _read.\n  // Note that this may be asynchronous, or synchronous.  Yes, it is\n  // deeply ugly to write APIs this way, but that still doesn't mean\n  // that the Readable class should behave improperly, as streams are\n  // designed to be sync/async agnostic.\n  // Take note if the _read call is sync or async (ie, if the read call\n  // has returned yet), so that we know whether or not it's safe to emit\n  // 'readable' etc.\n  //\n  // 3. Actually pull the requested chunks out of the buffer and return.\n\n  // if we need a readable event, then we need to do some reading.\n  var doRead = state.needReadable;\n  debug('need readable', doRead);\n\n  // if we currently have less than the highWaterMark, then also read some\n  if (state.length === 0 || state.length - n < state.highWaterMark) {\n    doRead = true;\n    debug('length less than watermark', doRead);\n  }\n\n  // however, if we've ended, then there's no point, and if we're already\n  // reading, then it's unnecessary.\n  if (state.ended || state.reading) {\n    doRead = false;\n    debug('reading or ended', doRead);\n  } else if (doRead) {\n    debug('do read');\n    state.reading = true;\n    state.sync = true;\n    // if the length is currently zero, then we *need* a readable event.\n    if (state.length === 0) state.needReadable = true;\n    // call internal read method\n    this._read(state.highWaterMark);\n    state.sync = false;\n    // If _read pushed data synchronously, then `reading` will be false,\n    // and we need to re-evaluate how much data we can return to the user.\n    if (!state.reading) n = howMuchToRead(nOrig, state);\n  }\n\n  var ret;\n  if (n > 0) ret = fromList(n, state);else ret = null;\n\n  if (ret === null) {\n    state.needReadable = true;\n    n = 0;\n  } else {\n    state.length -= n;\n  }\n\n  if (state.length === 0) {\n    // If we have nothing in the buffer, then we want to know\n    // as soon as we *do* get something into the buffer.\n    if (!state.ended) state.needReadable = true;\n\n    // If we tried to read() past the EOF, then emit end on the next tick.\n    if (nOrig !== n && state.ended) endReadable(this);\n  }\n\n  if (ret !== null) this.emit('data', ret);\n\n  return ret;\n};\n\nfunction chunkInvalid(state, chunk) {\n  var er = null;\n  if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) {\n    er = new TypeError('Invalid non-string/buffer chunk');\n  }\n  return er;\n}\n\nfunction onEofChunk(stream, state) {\n  if (state.ended) return;\n  if (state.decoder) {\n    var chunk = state.decoder.end();\n    if (chunk && chunk.length) {\n      state.buffer.push(chunk);\n      state.length += state.objectMode ? 1 : chunk.length;\n    }\n  }\n  state.ended = true;\n\n  // emit 'readable' now to make sure it gets picked up.\n  emitReadable(stream);\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow.  This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n  var state = stream._readableState;\n  state.needReadable = false;\n  if (!state.emittedReadable) {\n    debug('emitReadable', state.flowing);\n    state.emittedReadable = true;\n    if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream);\n  }\n}\n\nfunction emitReadable_(stream) {\n  debug('emit readable');\n  stream.emit('readable');\n  flow(stream);\n}\n\n// at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data.  that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n  if (!state.readingMore) {\n    state.readingMore = true;\n    processNextTick(maybeReadMore_, stream, state);\n  }\n}\n\nfunction maybeReadMore_(stream, state) {\n  var len = state.length;\n  while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {\n    debug('maybeReadMore read 0');\n    stream.read(0);\n    if (len === state.length)\n      // didn't get any data, stop spinning.\n      break;else len = state.length;\n  }\n  state.readingMore = false;\n}\n\n// abstract method.  to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function (n) {\n  this.emit('error', new Error('_read() is not implemented'));\n};\n\nReadable.prototype.pipe = function (dest, pipeOpts) {\n  var src = this;\n  var state = this._readableState;\n\n  switch (state.pipesCount) {\n    case 0:\n      state.pipes = dest;\n      break;\n    case 1:\n      state.pipes = [state.pipes, dest];\n      break;\n    default:\n      state.pipes.push(dest);\n      break;\n  }\n  state.pipesCount += 1;\n  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n\n  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;\n\n  var endFn = doEnd ? onend : cleanup;\n  if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn);\n\n  dest.on('unpipe', onunpipe);\n  function onunpipe(readable) {\n    debug('onunpipe');\n    if (readable === src) {\n      cleanup();\n    }\n  }\n\n  function onend() {\n    debug('onend');\n    dest.end();\n  }\n\n  // when the dest drains, it reduces the awaitDrain counter\n  // on the source.  This would be more elegant with a .once()\n  // handler in flow(), but adding and removing repeatedly is\n  // too slow.\n  var ondrain = pipeOnDrain(src);\n  dest.on('drain', ondrain);\n\n  var cleanedUp = false;\n  function cleanup() {\n    debug('cleanup');\n    // cleanup event handlers once the pipe is broken\n    dest.removeListener('close', onclose);\n    dest.removeListener('finish', onfinish);\n    dest.removeListener('drain', ondrain);\n    dest.removeListener('error', onerror);\n    dest.removeListener('unpipe', onunpipe);\n    src.removeListener('end', onend);\n    src.removeListener('end', cleanup);\n    src.removeListener('data', ondata);\n\n    cleanedUp = true;\n\n    // if the reader is waiting for a drain event from this\n    // specific writer, then it would cause it to never start\n    // flowing again.\n    // So, if this is awaiting a drain, then we just call it now.\n    // If we don't know, then assume that we are waiting for one.\n    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n  }\n\n  // If the user pushes more data while we're writing to dest then we'll end up\n  // in ondata again. However, we only want to increase awaitDrain once because\n  // dest will only emit one 'drain' event for the multiple writes.\n  // => Introduce a guard on increasing awaitDrain.\n  var increasedAwaitDrain = false;\n  src.on('data', ondata);\n  function ondata(chunk) {\n    debug('ondata');\n    increasedAwaitDrain = false;\n    var ret = dest.write(chunk);\n    if (false === ret && !increasedAwaitDrain) {\n      // If the user unpiped during `dest.write()`, it is possible\n      // to get stuck in a permanently paused state if that write\n      // also returned false.\n      // => Check whether `dest` is still a piping destination.\n      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n        debug('false write response, pause', src._readableState.awaitDrain);\n        src._readableState.awaitDrain++;\n        increasedAwaitDrain = true;\n      }\n      src.pause();\n    }\n  }\n\n  // if the dest has an error, then stop piping into it.\n  // however, don't suppress the throwing behavior for this.\n  function onerror(er) {\n    debug('onerror', er);\n    unpipe();\n    dest.removeListener('error', onerror);\n    if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);\n  }\n\n  // Make sure our error handler is attached before userland ones.\n  prependListener(dest, 'error', onerror);\n\n  // Both close and finish should trigger unpipe, but only once.\n  function onclose() {\n    dest.removeListener('finish', onfinish);\n    unpipe();\n  }\n  dest.once('close', onclose);\n  function onfinish() {\n    debug('onfinish');\n    dest.removeListener('close', onclose);\n    unpipe();\n  }\n  dest.once('finish', onfinish);\n\n  function unpipe() {\n    debug('unpipe');\n    src.unpipe(dest);\n  }\n\n  // tell the dest that it's being piped to\n  dest.emit('pipe', src);\n\n  // start the flow if it hasn't been started already.\n  if (!state.flowing) {\n    debug('pipe resume');\n    src.resume();\n  }\n\n  return dest;\n};\n\nfunction pipeOnDrain(src) {\n  return function () {\n    var state = src._readableState;\n    debug('pipeOnDrain', state.awaitDrain);\n    if (state.awaitDrain) state.awaitDrain--;\n    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {\n      state.flowing = true;\n      flow(src);\n    }\n  };\n}\n\nReadable.prototype.unpipe = function (dest) {\n  var state = this._readableState;\n\n  // if we're not piping anywhere, then do nothing.\n  if (state.pipesCount === 0) return this;\n\n  // just one destination.  most common case.\n  if (state.pipesCount === 1) {\n    // passed in one, but it's not the right one.\n    if (dest && dest !== state.pipes) return this;\n\n    if (!dest) dest = state.pipes;\n\n    // got a match.\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n    if (dest) dest.emit('unpipe', this);\n    return this;\n  }\n\n  // slow case. multiple pipe destinations.\n\n  if (!dest) {\n    // remove all.\n    var dests = state.pipes;\n    var len = state.pipesCount;\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n\n    for (var i = 0; i < len; i++) {\n      dests[i].emit('unpipe', this);\n    }return this;\n  }\n\n  // try to find the right one.\n  var index = indexOf(state.pipes, dest);\n  if (index === -1) return this;\n\n  state.pipes.splice(index, 1);\n  state.pipesCount -= 1;\n  if (state.pipesCount === 1) state.pipes = state.pipes[0];\n\n  dest.emit('unpipe', this);\n\n  return this;\n};\n\n// set up data events if they are asked for\n// Ensure readable listeners eventually get something\nReadable.prototype.on = function (ev, fn) {\n  var res = Stream.prototype.on.call(this, ev, fn);\n\n  if (ev === 'data') {\n    // Start flowing on next tick if stream isn't explicitly paused\n    if (this._readableState.flowing !== false) this.resume();\n  } else if (ev === 'readable') {\n    var state = this._readableState;\n    if (!state.endEmitted && !state.readableListening) {\n      state.readableListening = state.needReadable = true;\n      state.emittedReadable = false;\n      if (!state.reading) {\n        processNextTick(nReadingNextTick, this);\n      } else if (state.length) {\n        emitReadable(this, state);\n      }\n    }\n  }\n\n  return res;\n};\nReadable.prototype.addListener = Readable.prototype.on;\n\nfunction nReadingNextTick(self) {\n  debug('readable nexttick read 0');\n  self.read(0);\n}\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function () {\n  var state = this._readableState;\n  if (!state.flowing) {\n    debug('resume');\n    state.flowing = true;\n    resume(this, state);\n  }\n  return this;\n};\n\nfunction resume(stream, state) {\n  if (!state.resumeScheduled) {\n    state.resumeScheduled = true;\n    processNextTick(resume_, stream, state);\n  }\n}\n\nfunction resume_(stream, state) {\n  if (!state.reading) {\n    debug('resume read 0');\n    stream.read(0);\n  }\n\n  state.resumeScheduled = false;\n  state.awaitDrain = 0;\n  stream.emit('resume');\n  flow(stream);\n  if (state.flowing && !state.reading) stream.read(0);\n}\n\nReadable.prototype.pause = function () {\n  debug('call pause flowing=%j', this._readableState.flowing);\n  if (false !== this._readableState.flowing) {\n    debug('pause');\n    this._readableState.flowing = false;\n    this.emit('pause');\n  }\n  return this;\n};\n\nfunction flow(stream) {\n  var state = stream._readableState;\n  debug('flow', state.flowing);\n  while (state.flowing && stream.read() !== null) {}\n}\n\n// wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function (stream) {\n  var state = this._readableState;\n  var paused = false;\n\n  var self = this;\n  stream.on('end', function () {\n    debug('wrapped end');\n    if (state.decoder && !state.ended) {\n      var chunk = state.decoder.end();\n      if (chunk && chunk.length) self.push(chunk);\n    }\n\n    self.push(null);\n  });\n\n  stream.on('data', function (chunk) {\n    debug('wrapped data');\n    if (state.decoder) chunk = state.decoder.write(chunk);\n\n    // don't skip over falsy values in objectMode\n    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n\n    var ret = self.push(chunk);\n    if (!ret) {\n      paused = true;\n      stream.pause();\n    }\n  });\n\n  // proxy all the other methods.\n  // important when wrapping filters and duplexes.\n  for (var i in stream) {\n    if (this[i] === undefined && typeof stream[i] === 'function') {\n      this[i] = function (method) {\n        return function () {\n          return stream[method].apply(stream, arguments);\n        };\n      }(i);\n    }\n  }\n\n  // proxy certain important events.\n  var events = ['error', 'close', 'destroy', 'pause', 'resume'];\n  forEach(events, function (ev) {\n    stream.on(ev, self.emit.bind(self, ev));\n  });\n\n  // when we try to consume some more bytes, simply unpause the\n  // underlying stream.\n  self._read = function (n) {\n    debug('wrapped _read', n);\n    if (paused) {\n      paused = false;\n      stream.resume();\n    }\n  };\n\n  return self;\n};\n\n// exposed for testing purposes only.\nReadable._fromList = fromList;\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromList(n, state) {\n  // nothing buffered\n  if (state.length === 0) return null;\n\n  var ret;\n  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n    // read it all, truncate the list\n    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);\n    state.buffer.clear();\n  } else {\n    // read part of list\n    ret = fromListPartial(n, state.buffer, state.decoder);\n  }\n\n  return ret;\n}\n\n// Extracts only enough buffered data to satisfy the amount requested.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromListPartial(n, list, hasStrings) {\n  var ret;\n  if (n < list.head.data.length) {\n    // slice is the same for buffers and strings\n    ret = list.head.data.slice(0, n);\n    list.head.data = list.head.data.slice(n);\n  } else if (n === list.head.data.length) {\n    // first chunk is a perfect match\n    ret = list.shift();\n  } else {\n    // result spans more than one buffer\n    ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);\n  }\n  return ret;\n}\n\n// Copies a specified amount of characters from the list of buffered data\n// chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBufferString(n, list) {\n  var p = list.head;\n  var c = 1;\n  var ret = p.data;\n  n -= ret.length;\n  while (p = p.next) {\n    var str = p.data;\n    var nb = n > str.length ? str.length : n;\n    if (nb === str.length) ret += str;else ret += str.slice(0, n);\n    n -= nb;\n    if (n === 0) {\n      if (nb === str.length) {\n        ++c;\n        if (p.next) list.head = p.next;else list.head = list.tail = null;\n      } else {\n        list.head = p;\n        p.data = str.slice(nb);\n      }\n      break;\n    }\n    ++c;\n  }\n  list.length -= c;\n  return ret;\n}\n\n// Copies a specified amount of bytes from the list of buffered data chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBuffer(n, list) {\n  var ret = bufferShim.allocUnsafe(n);\n  var p = list.head;\n  var c = 1;\n  p.data.copy(ret);\n  n -= p.data.length;\n  while (p = p.next) {\n    var buf = p.data;\n    var nb = n > buf.length ? buf.length : n;\n    buf.copy(ret, ret.length - n, 0, nb);\n    n -= nb;\n    if (n === 0) {\n      if (nb === buf.length) {\n        ++c;\n        if (p.next) list.head = p.next;else list.head = list.tail = null;\n      } else {\n        list.head = p;\n        p.data = buf.slice(nb);\n      }\n      break;\n    }\n    ++c;\n  }\n  list.length -= c;\n  return ret;\n}\n\nfunction endReadable(stream) {\n  var state = stream._readableState;\n\n  // If we get here before consuming all the bytes, then that is a\n  // bug in node.  Should never happen.\n  if (state.length > 0) throw new Error('\"endReadable()\" called on non-empty stream');\n\n  if (!state.endEmitted) {\n    state.ended = true;\n    processNextTick(endReadableNT, state, stream);\n  }\n}\n\nfunction endReadableNT(state, stream) {\n  // Check that we didn't get one last unshift.\n  if (!state.endEmitted && state.length === 0) {\n    state.endEmitted = true;\n    stream.readable = false;\n    stream.emit('end');\n  }\n}\n\nfunction forEach(xs, f) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    f(xs[i], i);\n  }\n}\n\nfunction indexOf(xs, x) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    if (xs[i] === x) return i;\n  }\n  return -1;\n}\n}).call(this,require('_process'))\n},{\"./_stream_duplex\":140,\"./internal/streams/BufferList\":145,\"_process\":138,\"buffer\":77,\"buffer-shims\":76,\"core-util-is\":78,\"events\":79,\"inherits\":81,\"isarray\":83,\"process-nextick-args\":137,\"string_decoder/\":152,\"util\":75}],143:[function(require,module,exports){\n// a transform stream is a readable/writable stream where you do\n// something with the data.  Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored.  (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation.  For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes.  When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up.  When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer.  When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks.  If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk.  However,\n// a pathological inflate type of transform can cause excessive buffering\n// here.  For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output.  In this case, you could write a very small\n// amount of input, and end up with a very large amount of output.  In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform.  A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n\n'use strict';\n\nmodule.exports = Transform;\n\nvar Duplex = require('./_stream_duplex');\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nutil.inherits(Transform, Duplex);\n\nfunction TransformState(stream) {\n  this.afterTransform = function (er, data) {\n    return afterTransform(stream, er, data);\n  };\n\n  this.needTransform = false;\n  this.transforming = false;\n  this.writecb = null;\n  this.writechunk = null;\n  this.writeencoding = null;\n}\n\nfunction afterTransform(stream, er, data) {\n  var ts = stream._transformState;\n  ts.transforming = false;\n\n  var cb = ts.writecb;\n\n  if (!cb) return stream.emit('error', new Error('no writecb in Transform class'));\n\n  ts.writechunk = null;\n  ts.writecb = null;\n\n  if (data !== null && data !== undefined) stream.push(data);\n\n  cb(er);\n\n  var rs = stream._readableState;\n  rs.reading = false;\n  if (rs.needReadable || rs.length < rs.highWaterMark) {\n    stream._read(rs.highWaterMark);\n  }\n}\n\nfunction Transform(options) {\n  if (!(this instanceof Transform)) return new Transform(options);\n\n  Duplex.call(this, options);\n\n  this._transformState = new TransformState(this);\n\n  var stream = this;\n\n  // start out asking for a readable event once data is transformed.\n  this._readableState.needReadable = true;\n\n  // we have implemented the _read method, and done the other things\n  // that Readable wants before the first _read call, so unset the\n  // sync guard flag.\n  this._readableState.sync = false;\n\n  if (options) {\n    if (typeof options.transform === 'function') this._transform = options.transform;\n\n    if (typeof options.flush === 'function') this._flush = options.flush;\n  }\n\n  // When the writable side finishes, then flush out anything remaining.\n  this.once('prefinish', function () {\n    if (typeof this._flush === 'function') this._flush(function (er, data) {\n      done(stream, er, data);\n    });else done(stream);\n  });\n}\n\nTransform.prototype.push = function (chunk, encoding) {\n  this._transformState.needTransform = false;\n  return Duplex.prototype.push.call(this, chunk, encoding);\n};\n\n// This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side.  You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk.  If you pass\n// an error, then that'll put the hurt on the whole operation.  If you\n// never call cb(), then you'll never get another chunk.\nTransform.prototype._transform = function (chunk, encoding, cb) {\n  throw new Error('_transform() is not implemented');\n};\n\nTransform.prototype._write = function (chunk, encoding, cb) {\n  var ts = this._transformState;\n  ts.writecb = cb;\n  ts.writechunk = chunk;\n  ts.writeencoding = encoding;\n  if (!ts.transforming) {\n    var rs = this._readableState;\n    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n  }\n};\n\n// Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\nTransform.prototype._read = function (n) {\n  var ts = this._transformState;\n\n  if (ts.writechunk !== null && ts.writecb && !ts.transforming) {\n    ts.transforming = true;\n    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n  } else {\n    // mark that we need a transform, so that any data that comes in\n    // will get processed, now that we've asked for it.\n    ts.needTransform = true;\n  }\n};\n\nfunction done(stream, er, data) {\n  if (er) return stream.emit('error', er);\n\n  if (data !== null && data !== undefined) stream.push(data);\n\n  // if there's nothing in the write buffer, then that means\n  // that nothing more will ever be provided\n  var ws = stream._writableState;\n  var ts = stream._transformState;\n\n  if (ws.length) throw new Error('Calling transform done when ws.length != 0');\n\n  if (ts.transforming) throw new Error('Calling transform done when still transforming');\n\n  return stream.push(null);\n}\n},{\"./_stream_duplex\":140,\"core-util-is\":78,\"inherits\":81}],144:[function(require,module,exports){\n(function (process){\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n\n'use strict';\n\nmodule.exports = Writable;\n\n/*<replacement>*/\nvar processNextTick = require('process-nextick-args');\n/*</replacement>*/\n\n/*<replacement>*/\nvar asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick;\n/*</replacement>*/\n\n/*<replacement>*/\nvar Duplex;\n/*</replacement>*/\n\nWritable.WritableState = WritableState;\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\n/*<replacement>*/\nvar internalUtil = {\n  deprecate: require('util-deprecate')\n};\n/*</replacement>*/\n\n/*<replacement>*/\nvar Stream;\n(function () {\n  try {\n    Stream = require('st' + 'ream');\n  } catch (_) {} finally {\n    if (!Stream) Stream = require('events').EventEmitter;\n  }\n})();\n/*</replacement>*/\n\nvar Buffer = require('buffer').Buffer;\n/*<replacement>*/\nvar bufferShim = require('buffer-shims');\n/*</replacement>*/\n\nutil.inherits(Writable, Stream);\n\nfunction nop() {}\n\nfunction WriteReq(chunk, encoding, cb) {\n  this.chunk = chunk;\n  this.encoding = encoding;\n  this.callback = cb;\n  this.next = null;\n}\n\nfunction WritableState(options, stream) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  options = options || {};\n\n  // object stream flag to indicate whether or not this stream\n  // contains buffers or objects.\n  this.objectMode = !!options.objectMode;\n\n  if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode;\n\n  // the point at which write() starts returning false\n  // Note: 0 is a valid value, means that we always return false if\n  // the entire buffer is not flushed immediately on write()\n  var hwm = options.highWaterMark;\n  var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n  this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;\n\n  // cast to ints.\n  this.highWaterMark = ~~this.highWaterMark;\n\n  // drain event flag.\n  this.needDrain = false;\n  // at the start of calling end()\n  this.ending = false;\n  // when end() has been called, and returned\n  this.ended = false;\n  // when 'finish' is emitted\n  this.finished = false;\n\n  // should we decode strings into buffers before passing to _write?\n  // this is here so that some node-core streams can optimize string\n  // handling at a lower level.\n  var noDecode = options.decodeStrings === false;\n  this.decodeStrings = !noDecode;\n\n  // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n  this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n  // not an actual buffer we keep track of, but a measurement\n  // of how much we're waiting to get pushed to some underlying\n  // socket or file.\n  this.length = 0;\n\n  // a flag to see when we're in the middle of a write.\n  this.writing = false;\n\n  // when true all writes will be buffered until .uncork() call\n  this.corked = 0;\n\n  // a flag to be able to tell if the onwrite cb is called immediately,\n  // or on a later tick.  We set this to true at first, because any\n  // actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first write call.\n  this.sync = true;\n\n  // a flag to know if we're processing previously buffered items, which\n  // may call the _write() callback in the same tick, so that we don't\n  // end up in an overlapped onwrite situation.\n  this.bufferProcessing = false;\n\n  // the callback that's passed to _write(chunk,cb)\n  this.onwrite = function (er) {\n    onwrite(stream, er);\n  };\n\n  // the callback that the user supplies to write(chunk,encoding,cb)\n  this.writecb = null;\n\n  // the amount that is being written when _write is called.\n  this.writelen = 0;\n\n  this.bufferedRequest = null;\n  this.lastBufferedRequest = null;\n\n  // number of pending user-supplied write callbacks\n  // this must be 0 before 'finish' can be emitted\n  this.pendingcb = 0;\n\n  // emit prefinish if the only thing we're waiting for is _write cbs\n  // This is relevant for synchronous Transform streams\n  this.prefinished = false;\n\n  // True if the error was already emitted and should not be thrown again\n  this.errorEmitted = false;\n\n  // count buffered requests\n  this.bufferedRequestCount = 0;\n\n  // allocate the first CorkedRequest, there is always\n  // one allocated and free to use, and we maintain at most two\n  this.corkedRequestsFree = new CorkedRequest(this);\n}\n\nWritableState.prototype.getBuffer = function getBuffer() {\n  var current = this.bufferedRequest;\n  var out = [];\n  while (current) {\n    out.push(current);\n    current = current.next;\n  }\n  return out;\n};\n\n(function () {\n  try {\n    Object.defineProperty(WritableState.prototype, 'buffer', {\n      get: internalUtil.deprecate(function () {\n        return this.getBuffer();\n      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.')\n    });\n  } catch (_) {}\n})();\n\n// Test _writableState for inheritance to account for Duplex streams,\n// whose prototype chain only points to Readable.\nvar realHasInstance;\nif (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {\n  realHasInstance = Function.prototype[Symbol.hasInstance];\n  Object.defineProperty(Writable, Symbol.hasInstance, {\n    value: function (object) {\n      if (realHasInstance.call(this, object)) return true;\n\n      return object && object._writableState instanceof WritableState;\n    }\n  });\n} else {\n  realHasInstance = function (object) {\n    return object instanceof this;\n  };\n}\n\nfunction Writable(options) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  // Writable ctor is applied to Duplexes, too.\n  // `realHasInstance` is necessary because using plain `instanceof`\n  // would return false, as no `_writableState` property is attached.\n\n  // Trying to use the custom `instanceof` for Writable here will also break the\n  // Node.js LazyTransform implementation, which has a non-trivial getter for\n  // `_writableState` that would lead to infinite recursion.\n  if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {\n    return new Writable(options);\n  }\n\n  this._writableState = new WritableState(options, this);\n\n  // legacy.\n  this.writable = true;\n\n  if (options) {\n    if (typeof options.write === 'function') this._write = options.write;\n\n    if (typeof options.writev === 'function') this._writev = options.writev;\n  }\n\n  Stream.call(this);\n}\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function () {\n  this.emit('error', new Error('Cannot pipe, not readable'));\n};\n\nfunction writeAfterEnd(stream, cb) {\n  var er = new Error('write after end');\n  // TODO: defer error events consistently everywhere, not just the cb\n  stream.emit('error', er);\n  processNextTick(cb, er);\n}\n\n// Checks that a user-supplied chunk is valid, especially for the particular\n// mode the stream is in. Currently this means that `null` is never accepted\n// and undefined/non-string values are only allowed in object mode.\nfunction validChunk(stream, state, chunk, cb) {\n  var valid = true;\n  var er = false;\n\n  if (chunk === null) {\n    er = new TypeError('May not write null values to stream');\n  } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n    er = new TypeError('Invalid non-string/buffer chunk');\n  }\n  if (er) {\n    stream.emit('error', er);\n    processNextTick(cb, er);\n    valid = false;\n  }\n  return valid;\n}\n\nWritable.prototype.write = function (chunk, encoding, cb) {\n  var state = this._writableState;\n  var ret = false;\n  var isBuf = Buffer.isBuffer(chunk);\n\n  if (typeof encoding === 'function') {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n\n  if (typeof cb !== 'function') cb = nop;\n\n  if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {\n    state.pendingcb++;\n    ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);\n  }\n\n  return ret;\n};\n\nWritable.prototype.cork = function () {\n  var state = this._writableState;\n\n  state.corked++;\n};\n\nWritable.prototype.uncork = function () {\n  var state = this._writableState;\n\n  if (state.corked) {\n    state.corked--;\n\n    if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n  }\n};\n\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n  // node::ParseEncoding() requires lower case.\n  if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);\n  this._writableState.defaultEncoding = encoding;\n  return this;\n};\n\nfunction decodeChunk(state, chunk, encoding) {\n  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n    chunk = bufferShim.from(chunk, encoding);\n  }\n  return chunk;\n}\n\n// if we're already writing something, then just put this\n// in the queue, and wait our turn.  Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {\n  if (!isBuf) {\n    chunk = decodeChunk(state, chunk, encoding);\n    if (Buffer.isBuffer(chunk)) encoding = 'buffer';\n  }\n  var len = state.objectMode ? 1 : chunk.length;\n\n  state.length += len;\n\n  var ret = state.length < state.highWaterMark;\n  // we must ensure that previous needDrain will not be reset to false.\n  if (!ret) state.needDrain = true;\n\n  if (state.writing || state.corked) {\n    var last = state.lastBufferedRequest;\n    state.lastBufferedRequest = new WriteReq(chunk, encoding, cb);\n    if (last) {\n      last.next = state.lastBufferedRequest;\n    } else {\n      state.bufferedRequest = state.lastBufferedRequest;\n    }\n    state.bufferedRequestCount += 1;\n  } else {\n    doWrite(stream, state, false, len, chunk, encoding, cb);\n  }\n\n  return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n  state.writelen = len;\n  state.writecb = cb;\n  state.writing = true;\n  state.sync = true;\n  if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n  state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n  --state.pendingcb;\n  if (sync) processNextTick(cb, er);else cb(er);\n\n  stream._writableState.errorEmitted = true;\n  stream.emit('error', er);\n}\n\nfunction onwriteStateUpdate(state) {\n  state.writing = false;\n  state.writecb = null;\n  state.length -= state.writelen;\n  state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n  var state = stream._writableState;\n  var sync = state.sync;\n  var cb = state.writecb;\n\n  onwriteStateUpdate(state);\n\n  if (er) onwriteError(stream, state, sync, er, cb);else {\n    // Check if we're actually ready to finish, but don't emit yet\n    var finished = needFinish(state);\n\n    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n      clearBuffer(stream, state);\n    }\n\n    if (sync) {\n      /*<replacement>*/\n      asyncWrite(afterWrite, stream, state, finished, cb);\n      /*</replacement>*/\n    } else {\n      afterWrite(stream, state, finished, cb);\n    }\n  }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n  if (!finished) onwriteDrain(stream, state);\n  state.pendingcb--;\n  cb();\n  finishMaybe(stream, state);\n}\n\n// Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\nfunction onwriteDrain(stream, state) {\n  if (state.length === 0 && state.needDrain) {\n    state.needDrain = false;\n    stream.emit('drain');\n  }\n}\n\n// if there's something in the buffer waiting, then process it\nfunction clearBuffer(stream, state) {\n  state.bufferProcessing = true;\n  var entry = state.bufferedRequest;\n\n  if (stream._writev && entry && entry.next) {\n    // Fast case, write everything using _writev()\n    var l = state.bufferedRequestCount;\n    var buffer = new Array(l);\n    var holder = state.corkedRequestsFree;\n    holder.entry = entry;\n\n    var count = 0;\n    while (entry) {\n      buffer[count] = entry;\n      entry = entry.next;\n      count += 1;\n    }\n\n    doWrite(stream, state, true, state.length, buffer, '', holder.finish);\n\n    // doWrite is almost always async, defer these to save a bit of time\n    // as the hot path ends with doWrite\n    state.pendingcb++;\n    state.lastBufferedRequest = null;\n    if (holder.next) {\n      state.corkedRequestsFree = holder.next;\n      holder.next = null;\n    } else {\n      state.corkedRequestsFree = new CorkedRequest(state);\n    }\n  } else {\n    // Slow case, write chunks one-by-one\n    while (entry) {\n      var chunk = entry.chunk;\n      var encoding = entry.encoding;\n      var cb = entry.callback;\n      var len = state.objectMode ? 1 : chunk.length;\n\n      doWrite(stream, state, false, len, chunk, encoding, cb);\n      entry = entry.next;\n      // if we didn't call the onwrite immediately, then\n      // it means that we need to wait until it does.\n      // also, that means that the chunk and cb are currently\n      // being processed, so move the buffer counter past them.\n      if (state.writing) {\n        break;\n      }\n    }\n\n    if (entry === null) state.lastBufferedRequest = null;\n  }\n\n  state.bufferedRequestCount = 0;\n  state.bufferedRequest = entry;\n  state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function (chunk, encoding, cb) {\n  cb(new Error('_write() is not implemented'));\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function (chunk, encoding, cb) {\n  var state = this._writableState;\n\n  if (typeof chunk === 'function') {\n    cb = chunk;\n    chunk = null;\n    encoding = null;\n  } else if (typeof encoding === 'function') {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);\n\n  // .end() fully uncorks\n  if (state.corked) {\n    state.corked = 1;\n    this.uncork();\n  }\n\n  // ignore unnecessary end() calls.\n  if (!state.ending && !state.finished) endWritable(this, state, cb);\n};\n\nfunction needFinish(state) {\n  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\n\nfunction prefinish(stream, state) {\n  if (!state.prefinished) {\n    state.prefinished = true;\n    stream.emit('prefinish');\n  }\n}\n\nfunction finishMaybe(stream, state) {\n  var need = needFinish(state);\n  if (need) {\n    if (state.pendingcb === 0) {\n      prefinish(stream, state);\n      state.finished = true;\n      stream.emit('finish');\n    } else {\n      prefinish(stream, state);\n    }\n  }\n  return need;\n}\n\nfunction endWritable(stream, state, cb) {\n  state.ending = true;\n  finishMaybe(stream, state);\n  if (cb) {\n    if (state.finished) processNextTick(cb);else stream.once('finish', cb);\n  }\n  state.ended = true;\n  stream.writable = false;\n}\n\n// It seems a linked list but it is not\n// there will be only 2 of these for each stream\nfunction CorkedRequest(state) {\n  var _this = this;\n\n  this.next = null;\n  this.entry = null;\n  this.finish = function (err) {\n    var entry = _this.entry;\n    _this.entry = null;\n    while (entry) {\n      var cb = entry.callback;\n      state.pendingcb--;\n      cb(err);\n      entry = entry.next;\n    }\n    if (state.corkedRequestsFree) {\n      state.corkedRequestsFree.next = _this;\n    } else {\n      state.corkedRequestsFree = _this;\n    }\n  };\n}\n}).call(this,require('_process'))\n},{\"./_stream_duplex\":140,\"_process\":138,\"buffer\":77,\"buffer-shims\":76,\"core-util-is\":78,\"events\":79,\"inherits\":81,\"process-nextick-args\":137,\"util-deprecate\":154}],145:[function(require,module,exports){\n'use strict';\n\nvar Buffer = require('buffer').Buffer;\n/*<replacement>*/\nvar bufferShim = require('buffer-shims');\n/*</replacement>*/\n\nmodule.exports = BufferList;\n\nfunction BufferList() {\n  this.head = null;\n  this.tail = null;\n  this.length = 0;\n}\n\nBufferList.prototype.push = function (v) {\n  var entry = { data: v, next: null };\n  if (this.length > 0) this.tail.next = entry;else this.head = entry;\n  this.tail = entry;\n  ++this.length;\n};\n\nBufferList.prototype.unshift = function (v) {\n  var entry = { data: v, next: this.head };\n  if (this.length === 0) this.tail = entry;\n  this.head = entry;\n  ++this.length;\n};\n\nBufferList.prototype.shift = function () {\n  if (this.length === 0) return;\n  var ret = this.head.data;\n  if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n  --this.length;\n  return ret;\n};\n\nBufferList.prototype.clear = function () {\n  this.head = this.tail = null;\n  this.length = 0;\n};\n\nBufferList.prototype.join = function (s) {\n  if (this.length === 0) return '';\n  var p = this.head;\n  var ret = '' + p.data;\n  while (p = p.next) {\n    ret += s + p.data;\n  }return ret;\n};\n\nBufferList.prototype.concat = function (n) {\n  if (this.length === 0) return bufferShim.alloc(0);\n  if (this.length === 1) return this.head.data;\n  var ret = bufferShim.allocUnsafe(n >>> 0);\n  var p = this.head;\n  var i = 0;\n  while (p) {\n    p.data.copy(ret, i);\n    i += p.data.length;\n    p = p.next;\n  }\n  return ret;\n};\n},{\"buffer\":77,\"buffer-shims\":76}],146:[function(require,module,exports){\nmodule.exports = require(\"./lib/_stream_passthrough.js\")\n\n},{\"./lib/_stream_passthrough.js\":141}],147:[function(require,module,exports){\n(function (process){\nvar Stream = (function (){\n  try {\n    return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify\n  } catch(_){}\n}());\nexports = module.exports = require('./lib/_stream_readable.js');\nexports.Stream = Stream || exports;\nexports.Readable = exports;\nexports.Writable = require('./lib/_stream_writable.js');\nexports.Duplex = require('./lib/_stream_duplex.js');\nexports.Transform = require('./lib/_stream_transform.js');\nexports.PassThrough = require('./lib/_stream_passthrough.js');\n\nif (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) {\n  module.exports = Stream;\n}\n\n}).call(this,require('_process'))\n},{\"./lib/_stream_duplex.js\":140,\"./lib/_stream_passthrough.js\":141,\"./lib/_stream_readable.js\":142,\"./lib/_stream_transform.js\":143,\"./lib/_stream_writable.js\":144,\"_process\":138}],148:[function(require,module,exports){\nmodule.exports = require(\"./lib/_stream_transform.js\")\n\n},{\"./lib/_stream_transform.js\":143}],149:[function(require,module,exports){\nmodule.exports = require(\"./lib/_stream_writable.js\")\n\n},{\"./lib/_stream_writable.js\":144}],150:[function(require,module,exports){\n(function (Buffer){\n;(function (sax) { // wrapper for non-node envs\n  sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }\n  sax.SAXParser = SAXParser\n  sax.SAXStream = SAXStream\n  sax.createStream = createStream\n\n  // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.\n  // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),\n  // since that's the earliest that a buffer overrun could occur.  This way, checks are\n  // as rare as required, but as often as necessary to ensure never crossing this bound.\n  // Furthermore, buffers are only tested at most once per write(), so passing a very\n  // large string into write() might have undesirable effects, but this is manageable by\n  // the caller, so it is assumed to be safe.  Thus, a call to write() may, in the extreme\n  // edge case, result in creating at most one complete copy of the string passed in.\n  // Set to Infinity to have unlimited buffers.\n  sax.MAX_BUFFER_LENGTH = 64 * 1024\n\n  var buffers = [\n    'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',\n    'procInstName', 'procInstBody', 'entity', 'attribName',\n    'attribValue', 'cdata', 'script'\n  ]\n\n  sax.EVENTS = [\n    'text',\n    'processinginstruction',\n    'sgmldeclaration',\n    'doctype',\n    'comment',\n    'attribute',\n    'opentag',\n    'closetag',\n    'opencdata',\n    'cdata',\n    'closecdata',\n    'error',\n    'end',\n    'ready',\n    'script',\n    'opennamespace',\n    'closenamespace'\n  ]\n\n  function SAXParser (strict, opt) {\n    if (!(this instanceof SAXParser)) {\n      return new SAXParser(strict, opt)\n    }\n\n    var parser = this\n    clearBuffers(parser)\n    parser.q = parser.c = ''\n    parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH\n    parser.opt = opt || {}\n    parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags\n    parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'\n    parser.tags = []\n    parser.closed = parser.closedRoot = parser.sawRoot = false\n    parser.tag = parser.error = null\n    parser.strict = !!strict\n    parser.noscript = !!(strict || parser.opt.noscript)\n    parser.state = S.BEGIN\n    parser.strictEntities = parser.opt.strictEntities\n    parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)\n    parser.attribList = []\n\n    // namespaces form a prototype chain.\n    // it always points at the current tag,\n    // which protos to its parent tag.\n    if (parser.opt.xmlns) {\n      parser.ns = Object.create(rootNS)\n    }\n\n    // mostly just for error reporting\n    parser.trackPosition = parser.opt.position !== false\n    if (parser.trackPosition) {\n      parser.position = parser.line = parser.column = 0\n    }\n    emit(parser, 'onready')\n  }\n\n  if (!Object.create) {\n    Object.create = function (o) {\n      function F () {}\n      F.prototype = o\n      var newf = new F()\n      return newf\n    }\n  }\n\n  if (!Object.keys) {\n    Object.keys = function (o) {\n      var a = []\n      for (var i in o) if (o.hasOwnProperty(i)) a.push(i)\n      return a\n    }\n  }\n\n  function checkBufferLength (parser) {\n    var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)\n    var maxActual = 0\n    for (var i = 0, l = buffers.length; i < l; i++) {\n      var len = parser[buffers[i]].length\n      if (len > maxAllowed) {\n        // Text/cdata nodes can get big, and since they're buffered,\n        // we can get here under normal conditions.\n        // Avoid issues by emitting the text node now,\n        // so at least it won't get any bigger.\n        switch (buffers[i]) {\n          case 'textNode':\n            closeText(parser)\n            break\n\n          case 'cdata':\n            emitNode(parser, 'oncdata', parser.cdata)\n            parser.cdata = ''\n            break\n\n          case 'script':\n            emitNode(parser, 'onscript', parser.script)\n            parser.script = ''\n            break\n\n          default:\n            error(parser, 'Max buffer length exceeded: ' + buffers[i])\n        }\n      }\n      maxActual = Math.max(maxActual, len)\n    }\n    // schedule the next check for the earliest possible buffer overrun.\n    var m = sax.MAX_BUFFER_LENGTH - maxActual\n    parser.bufferCheckPosition = m + parser.position\n  }\n\n  function clearBuffers (parser) {\n    for (var i = 0, l = buffers.length; i < l; i++) {\n      parser[buffers[i]] = ''\n    }\n  }\n\n  function flushBuffers (parser) {\n    closeText(parser)\n    if (parser.cdata !== '') {\n      emitNode(parser, 'oncdata', parser.cdata)\n      parser.cdata = ''\n    }\n    if (parser.script !== '') {\n      emitNode(parser, 'onscript', parser.script)\n      parser.script = ''\n    }\n  }\n\n  SAXParser.prototype = {\n    end: function () { end(this) },\n    write: write,\n    resume: function () { this.error = null; return this },\n    close: function () { return this.write(null) },\n    flush: function () { flushBuffers(this) }\n  }\n\n  var Stream\n  try {\n    Stream = require('stream').Stream\n  } catch (ex) {\n    Stream = function () {}\n  }\n\n  var streamWraps = sax.EVENTS.filter(function (ev) {\n    return ev !== 'error' && ev !== 'end'\n  })\n\n  function createStream (strict, opt) {\n    return new SAXStream(strict, opt)\n  }\n\n  function SAXStream (strict, opt) {\n    if (!(this instanceof SAXStream)) {\n      return new SAXStream(strict, opt)\n    }\n\n    Stream.apply(this)\n\n    this._parser = new SAXParser(strict, opt)\n    this.writable = true\n    this.readable = true\n\n    var me = this\n\n    this._parser.onend = function () {\n      me.emit('end')\n    }\n\n    this._parser.onerror = function (er) {\n      me.emit('error', er)\n\n      // if didn't throw, then means error was handled.\n      // go ahead and clear error, so we can write again.\n      me._parser.error = null\n    }\n\n    this._decoder = null\n\n    streamWraps.forEach(function (ev) {\n      Object.defineProperty(me, 'on' + ev, {\n        get: function () {\n          return me._parser['on' + ev]\n        },\n        set: function (h) {\n          if (!h) {\n            me.removeAllListeners(ev)\n            me._parser['on' + ev] = h\n            return h\n          }\n          me.on(ev, h)\n        },\n        enumerable: true,\n        configurable: false\n      })\n    })\n  }\n\n  SAXStream.prototype = Object.create(Stream.prototype, {\n    constructor: {\n      value: SAXStream\n    }\n  })\n\n  SAXStream.prototype.write = function (data) {\n    if (typeof Buffer === 'function' &&\n      typeof Buffer.isBuffer === 'function' &&\n      Buffer.isBuffer(data)) {\n      if (!this._decoder) {\n        var SD = require('string_decoder').StringDecoder\n        this._decoder = new SD('utf8')\n      }\n      data = this._decoder.write(data)\n    }\n\n    this._parser.write(data.toString())\n    this.emit('data', data)\n    return true\n  }\n\n  SAXStream.prototype.end = function (chunk) {\n    if (chunk && chunk.length) {\n      this.write(chunk)\n    }\n    this._parser.end()\n    return true\n  }\n\n  SAXStream.prototype.on = function (ev, handler) {\n    var me = this\n    if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {\n      me._parser['on' + ev] = function () {\n        var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)\n        args.splice(0, 0, ev)\n        me.emit.apply(me, args)\n      }\n    }\n\n    return Stream.prototype.on.call(me, ev, handler)\n  }\n\n  // character classes and tokens\n  var whitespace = '\\r\\n\\t '\n\n  // this really needs to be replaced with character classes.\n  // XML allows all manner of ridiculous numbers and digits.\n  var number = '0124356789'\n  var letter = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'\n\n  // (Letter | \"_\" | \":\")\n  var quote = '\\'\"'\n  var attribEnd = whitespace + '>'\n  var CDATA = '[CDATA['\n  var DOCTYPE = 'DOCTYPE'\n  var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'\n  var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'\n  var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }\n\n  // turn all the string character sets into character class objects.\n  whitespace = charClass(whitespace)\n  number = charClass(number)\n  letter = charClass(letter)\n\n  // http://www.w3.org/TR/REC-xml/#NT-NameStartChar\n  // This implementation works on strings, a single character at a time\n  // as such, it cannot ever support astral-plane characters (10000-EFFFF)\n  // without a significant breaking change to either this  parser, or the\n  // JavaScript language.  Implementation of an emoji-capable xml parser\n  // is left as an exercise for the reader.\n  var nameStart = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n\n  var nameBody = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040\\.\\d-]/\n\n  var entityStart = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n  var entityBody = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040\\.\\d-]/\n\n  quote = charClass(quote)\n  attribEnd = charClass(attribEnd)\n\n  function charClass (str) {\n    return str.split('').reduce(function (s, c) {\n      s[c] = true\n      return s\n    }, {})\n  }\n\n  function isRegExp (c) {\n    return Object.prototype.toString.call(c) === '[object RegExp]'\n  }\n\n  function is (charclass, c) {\n    return isRegExp(charclass) ? !!c.match(charclass) : charclass[c]\n  }\n\n  function not (charclass, c) {\n    return !is(charclass, c)\n  }\n\n  var S = 0\n  sax.STATE = {\n    BEGIN: S++, // leading byte order mark or whitespace\n    BEGIN_WHITESPACE: S++, // leading whitespace\n    TEXT: S++, // general stuff\n    TEXT_ENTITY: S++, // &amp and such.\n    OPEN_WAKA: S++, // <\n    SGML_DECL: S++, // <!BLARG\n    SGML_DECL_QUOTED: S++, // <!BLARG foo \"bar\n    DOCTYPE: S++, // <!DOCTYPE\n    DOCTYPE_QUOTED: S++, // <!DOCTYPE \"//blah\n    DOCTYPE_DTD: S++, // <!DOCTYPE \"//blah\" [ ...\n    DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE \"//blah\" [ \"foo\n    COMMENT_STARTING: S++, // <!-\n    COMMENT: S++, // <!--\n    COMMENT_ENDING: S++, // <!-- blah -\n    COMMENT_ENDED: S++, // <!-- blah --\n    CDATA: S++, // <![CDATA[ something\n    CDATA_ENDING: S++, // ]\n    CDATA_ENDING_2: S++, // ]]\n    PROC_INST: S++, // <?hi\n    PROC_INST_BODY: S++, // <?hi there\n    PROC_INST_ENDING: S++, // <?hi \"there\" ?\n    OPEN_TAG: S++, // <strong\n    OPEN_TAG_SLASH: S++, // <strong /\n    ATTRIB: S++, // <a\n    ATTRIB_NAME: S++, // <a foo\n    ATTRIB_NAME_SAW_WHITE: S++, // <a foo _\n    ATTRIB_VALUE: S++, // <a foo=\n    ATTRIB_VALUE_QUOTED: S++, // <a foo=\"bar\n    ATTRIB_VALUE_CLOSED: S++, // <a foo=\"bar\"\n    ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar\n    ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar=\"&quot;\"\n    ATTRIB_VALUE_ENTITY_U: S++, // <foo bar=&quot\n    CLOSE_TAG: S++, // </a\n    CLOSE_TAG_SAW_WHITE: S++, // </a   >\n    SCRIPT: S++, // <script> ...\n    SCRIPT_ENDING: S++ // <script> ... <\n  }\n\n  sax.XML_ENTITIES = {\n    'amp': '&',\n    'gt': '>',\n    'lt': '<',\n    'quot': '\"',\n    'apos': \"'\"\n  }\n\n  sax.ENTITIES = {\n    'amp': '&',\n    'gt': '>',\n    'lt': '<',\n    'quot': '\"',\n    'apos': \"'\",\n    'AElig': 198,\n    'Aacute': 193,\n    'Acirc': 194,\n    'Agrave': 192,\n    'Aring': 197,\n    'Atilde': 195,\n    'Auml': 196,\n    'Ccedil': 199,\n    'ETH': 208,\n    'Eacute': 201,\n    'Ecirc': 202,\n    'Egrave': 200,\n    'Euml': 203,\n    'Iacute': 205,\n    'Icirc': 206,\n    'Igrave': 204,\n    'Iuml': 207,\n    'Ntilde': 209,\n    'Oacute': 211,\n    'Ocirc': 212,\n    'Ograve': 210,\n    'Oslash': 216,\n    'Otilde': 213,\n    'Ouml': 214,\n    'THORN': 222,\n    'Uacute': 218,\n    'Ucirc': 219,\n    'Ugrave': 217,\n    'Uuml': 220,\n    'Yacute': 221,\n    'aacute': 225,\n    'acirc': 226,\n    'aelig': 230,\n    'agrave': 224,\n    'aring': 229,\n    'atilde': 227,\n    'auml': 228,\n    'ccedil': 231,\n    'eacute': 233,\n    'ecirc': 234,\n    'egrave': 232,\n    'eth': 240,\n    'euml': 235,\n    'iacute': 237,\n    'icirc': 238,\n    'igrave': 236,\n    'iuml': 239,\n    'ntilde': 241,\n    'oacute': 243,\n    'ocirc': 244,\n    'ograve': 242,\n    'oslash': 248,\n    'otilde': 245,\n    'ouml': 246,\n    'szlig': 223,\n    'thorn': 254,\n    'uacute': 250,\n    'ucirc': 251,\n    'ugrave': 249,\n    'uuml': 252,\n    'yacute': 253,\n    'yuml': 255,\n    'copy': 169,\n    'reg': 174,\n    'nbsp': 160,\n    'iexcl': 161,\n    'cent': 162,\n    'pound': 163,\n    'curren': 164,\n    'yen': 165,\n    'brvbar': 166,\n    'sect': 167,\n    'uml': 168,\n    'ordf': 170,\n    'laquo': 171,\n    'not': 172,\n    'shy': 173,\n    'macr': 175,\n    'deg': 176,\n    'plusmn': 177,\n    'sup1': 185,\n    'sup2': 178,\n    'sup3': 179,\n    'acute': 180,\n    'micro': 181,\n    'para': 182,\n    'middot': 183,\n    'cedil': 184,\n    'ordm': 186,\n    'raquo': 187,\n    'frac14': 188,\n    'frac12': 189,\n    'frac34': 190,\n    'iquest': 191,\n    'times': 215,\n    'divide': 247,\n    'OElig': 338,\n    'oelig': 339,\n    'Scaron': 352,\n    'scaron': 353,\n    'Yuml': 376,\n    'fnof': 402,\n    'circ': 710,\n    'tilde': 732,\n    'Alpha': 913,\n    'Beta': 914,\n    'Gamma': 915,\n    'Delta': 916,\n    'Epsilon': 917,\n    'Zeta': 918,\n    'Eta': 919,\n    'Theta': 920,\n    'Iota': 921,\n    'Kappa': 922,\n    'Lambda': 923,\n    'Mu': 924,\n    'Nu': 925,\n    'Xi': 926,\n    'Omicron': 927,\n    'Pi': 928,\n    'Rho': 929,\n    'Sigma': 931,\n    'Tau': 932,\n    'Upsilon': 933,\n    'Phi': 934,\n    'Chi': 935,\n    'Psi': 936,\n    'Omega': 937,\n    'alpha': 945,\n    'beta': 946,\n    'gamma': 947,\n    'delta': 948,\n    'epsilon': 949,\n    'zeta': 950,\n    'eta': 951,\n    'theta': 952,\n    'iota': 953,\n    'kappa': 954,\n    'lambda': 955,\n    'mu': 956,\n    'nu': 957,\n    'xi': 958,\n    'omicron': 959,\n    'pi': 960,\n    'rho': 961,\n    'sigmaf': 962,\n    'sigma': 963,\n    'tau': 964,\n    'upsilon': 965,\n    'phi': 966,\n    'chi': 967,\n    'psi': 968,\n    'omega': 969,\n    'thetasym': 977,\n    'upsih': 978,\n    'piv': 982,\n    'ensp': 8194,\n    'emsp': 8195,\n    'thinsp': 8201,\n    'zwnj': 8204,\n    'zwj': 8205,\n    'lrm': 8206,\n    'rlm': 8207,\n    'ndash': 8211,\n    'mdash': 8212,\n    'lsquo': 8216,\n    'rsquo': 8217,\n    'sbquo': 8218,\n    'ldquo': 8220,\n    'rdquo': 8221,\n    'bdquo': 8222,\n    'dagger': 8224,\n    'Dagger': 8225,\n    'bull': 8226,\n    'hellip': 8230,\n    'permil': 8240,\n    'prime': 8242,\n    'Prime': 8243,\n    'lsaquo': 8249,\n    'rsaquo': 8250,\n    'oline': 8254,\n    'frasl': 8260,\n    'euro': 8364,\n    'image': 8465,\n    'weierp': 8472,\n    'real': 8476,\n    'trade': 8482,\n    'alefsym': 8501,\n    'larr': 8592,\n    'uarr': 8593,\n    'rarr': 8594,\n    'darr': 8595,\n    'harr': 8596,\n    'crarr': 8629,\n    'lArr': 8656,\n    'uArr': 8657,\n    'rArr': 8658,\n    'dArr': 8659,\n    'hArr': 8660,\n    'forall': 8704,\n    'part': 8706,\n    'exist': 8707,\n    'empty': 8709,\n    'nabla': 8711,\n    'isin': 8712,\n    'notin': 8713,\n    'ni': 8715,\n    'prod': 8719,\n    'sum': 8721,\n    'minus': 8722,\n    'lowast': 8727,\n    'radic': 8730,\n    'prop': 8733,\n    'infin': 8734,\n    'ang': 8736,\n    'and': 8743,\n    'or': 8744,\n    'cap': 8745,\n    'cup': 8746,\n    'int': 8747,\n    'there4': 8756,\n    'sim': 8764,\n    'cong': 8773,\n    'asymp': 8776,\n    'ne': 8800,\n    'equiv': 8801,\n    'le': 8804,\n    'ge': 8805,\n    'sub': 8834,\n    'sup': 8835,\n    'nsub': 8836,\n    'sube': 8838,\n    'supe': 8839,\n    'oplus': 8853,\n    'otimes': 8855,\n    'perp': 8869,\n    'sdot': 8901,\n    'lceil': 8968,\n    'rceil': 8969,\n    'lfloor': 8970,\n    'rfloor': 8971,\n    'lang': 9001,\n    'rang': 9002,\n    'loz': 9674,\n    'spades': 9824,\n    'clubs': 9827,\n    'hearts': 9829,\n    'diams': 9830\n  }\n\n  Object.keys(sax.ENTITIES).forEach(function (key) {\n    var e = sax.ENTITIES[key]\n    var s = typeof e === 'number' ? String.fromCharCode(e) : e\n    sax.ENTITIES[key] = s\n  })\n\n  for (var s in sax.STATE) {\n    sax.STATE[sax.STATE[s]] = s\n  }\n\n  // shorthand\n  S = sax.STATE\n\n  function emit (parser, event, data) {\n    parser[event] && parser[event](data)\n  }\n\n  function emitNode (parser, nodeType, data) {\n    if (parser.textNode) closeText(parser)\n    emit(parser, nodeType, data)\n  }\n\n  function closeText (parser) {\n    parser.textNode = textopts(parser.opt, parser.textNode)\n    if (parser.textNode) emit(parser, 'ontext', parser.textNode)\n    parser.textNode = ''\n  }\n\n  function textopts (opt, text) {\n    if (opt.trim) text = text.trim()\n    if (opt.normalize) text = text.replace(/\\s+/g, ' ')\n    return text\n  }\n\n  function error (parser, er) {\n    closeText(parser)\n    if (parser.trackPosition) {\n      er += '\\nLine: ' + parser.line +\n        '\\nColumn: ' + parser.column +\n        '\\nChar: ' + parser.c\n    }\n    er = new Error(er)\n    parser.error = er\n    emit(parser, 'onerror', er)\n    return parser\n  }\n\n  function end (parser) {\n    if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')\n    if ((parser.state !== S.BEGIN) &&\n      (parser.state !== S.BEGIN_WHITESPACE) &&\n      (parser.state !== S.TEXT)) {\n      error(parser, 'Unexpected end')\n    }\n    closeText(parser)\n    parser.c = ''\n    parser.closed = true\n    emit(parser, 'onend')\n    SAXParser.call(parser, parser.strict, parser.opt)\n    return parser\n  }\n\n  function strictFail (parser, message) {\n    if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {\n      throw new Error('bad call to strictFail')\n    }\n    if (parser.strict) {\n      error(parser, message)\n    }\n  }\n\n  function newTag (parser) {\n    if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()\n    var parent = parser.tags[parser.tags.length - 1] || parser\n    var tag = parser.tag = { name: parser.tagName, attributes: {} }\n\n    // will be overridden if tag contails an xmlns=\"foo\" or xmlns:foo=\"bar\"\n    if (parser.opt.xmlns) {\n      tag.ns = parent.ns\n    }\n    parser.attribList.length = 0\n  }\n\n  function qname (name, attribute) {\n    var i = name.indexOf(':')\n    var qualName = i < 0 ? [ '', name ] : name.split(':')\n    var prefix = qualName[0]\n    var local = qualName[1]\n\n    // <x \"xmlns\"=\"http://foo\">\n    if (attribute && name === 'xmlns') {\n      prefix = 'xmlns'\n      local = ''\n    }\n\n    return { prefix: prefix, local: local }\n  }\n\n  function attrib (parser) {\n    if (!parser.strict) {\n      parser.attribName = parser.attribName[parser.looseCase]()\n    }\n\n    if (parser.attribList.indexOf(parser.attribName) !== -1 ||\n      parser.tag.attributes.hasOwnProperty(parser.attribName)) {\n      parser.attribName = parser.attribValue = ''\n      return\n    }\n\n    if (parser.opt.xmlns) {\n      var qn = qname(parser.attribName, true)\n      var prefix = qn.prefix\n      var local = qn.local\n\n      if (prefix === 'xmlns') {\n        // namespace binding attribute. push the binding into scope\n        if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {\n          strictFail(parser,\n            'xml: prefix must be bound to ' + XML_NAMESPACE + '\\n' +\n            'Actual: ' + parser.attribValue)\n        } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {\n          strictFail(parser,\n            'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\\n' +\n            'Actual: ' + parser.attribValue)\n        } else {\n          var tag = parser.tag\n          var parent = parser.tags[parser.tags.length - 1] || parser\n          if (tag.ns === parent.ns) {\n            tag.ns = Object.create(parent.ns)\n          }\n          tag.ns[local] = parser.attribValue\n        }\n      }\n\n      // defer onattribute events until all attributes have been seen\n      // so any new bindings can take effect. preserve attribute order\n      // so deferred events can be emitted in document order\n      parser.attribList.push([parser.attribName, parser.attribValue])\n    } else {\n      // in non-xmlns mode, we can emit the event right away\n      parser.tag.attributes[parser.attribName] = parser.attribValue\n      emitNode(parser, 'onattribute', {\n        name: parser.attribName,\n        value: parser.attribValue\n      })\n    }\n\n    parser.attribName = parser.attribValue = ''\n  }\n\n  function openTag (parser, selfClosing) {\n    if (parser.opt.xmlns) {\n      // emit namespace binding events\n      var tag = parser.tag\n\n      // add namespace info to tag\n      var qn = qname(parser.tagName)\n      tag.prefix = qn.prefix\n      tag.local = qn.local\n      tag.uri = tag.ns[qn.prefix] || ''\n\n      if (tag.prefix && !tag.uri) {\n        strictFail(parser, 'Unbound namespace prefix: ' +\n          JSON.stringify(parser.tagName))\n        tag.uri = qn.prefix\n      }\n\n      var parent = parser.tags[parser.tags.length - 1] || parser\n      if (tag.ns && parent.ns !== tag.ns) {\n        Object.keys(tag.ns).forEach(function (p) {\n          emitNode(parser, 'onopennamespace', {\n            prefix: p,\n            uri: tag.ns[p]\n          })\n        })\n      }\n\n      // handle deferred onattribute events\n      // Note: do not apply default ns to attributes:\n      //   http://www.w3.org/TR/REC-xml-names/#defaulting\n      for (var i = 0, l = parser.attribList.length; i < l; i++) {\n        var nv = parser.attribList[i]\n        var name = nv[0]\n        var value = nv[1]\n        var qualName = qname(name, true)\n        var prefix = qualName.prefix\n        var local = qualName.local\n        var uri = prefix === '' ? '' : (tag.ns[prefix] || '')\n        var a = {\n          name: name,\n          value: value,\n          prefix: prefix,\n          local: local,\n          uri: uri\n        }\n\n        // if there's any attributes with an undefined namespace,\n        // then fail on them now.\n        if (prefix && prefix !== 'xmlns' && !uri) {\n          strictFail(parser, 'Unbound namespace prefix: ' +\n            JSON.stringify(prefix))\n          a.uri = prefix\n        }\n        parser.tag.attributes[name] = a\n        emitNode(parser, 'onattribute', a)\n      }\n      parser.attribList.length = 0\n    }\n\n    parser.tag.isSelfClosing = !!selfClosing\n\n    // process the tag\n    parser.sawRoot = true\n    parser.tags.push(parser.tag)\n    emitNode(parser, 'onopentag', parser.tag)\n    if (!selfClosing) {\n      // special case for <script> in non-strict mode.\n      if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {\n        parser.state = S.SCRIPT\n      } else {\n        parser.state = S.TEXT\n      }\n      parser.tag = null\n      parser.tagName = ''\n    }\n    parser.attribName = parser.attribValue = ''\n    parser.attribList.length = 0\n  }\n\n  function closeTag (parser) {\n    if (!parser.tagName) {\n      strictFail(parser, 'Weird empty close tag.')\n      parser.textNode += '</>'\n      parser.state = S.TEXT\n      return\n    }\n\n    if (parser.script) {\n      if (parser.tagName !== 'script') {\n        parser.script += '</' + parser.tagName + '>'\n        parser.tagName = ''\n        parser.state = S.SCRIPT\n        return\n      }\n      emitNode(parser, 'onscript', parser.script)\n      parser.script = ''\n    }\n\n    // first make sure that the closing tag actually exists.\n    // <a><b></c></b></a> will close everything, otherwise.\n    var t = parser.tags.length\n    var tagName = parser.tagName\n    if (!parser.strict) {\n      tagName = tagName[parser.looseCase]()\n    }\n    var closeTo = tagName\n    while (t--) {\n      var close = parser.tags[t]\n      if (close.name !== closeTo) {\n        // fail the first time in strict mode\n        strictFail(parser, 'Unexpected close tag')\n      } else {\n        break\n      }\n    }\n\n    // didn't find it.  we already failed for strict, so just abort.\n    if (t < 0) {\n      strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)\n      parser.textNode += '</' + parser.tagName + '>'\n      parser.state = S.TEXT\n      return\n    }\n    parser.tagName = tagName\n    var s = parser.tags.length\n    while (s-- > t) {\n      var tag = parser.tag = parser.tags.pop()\n      parser.tagName = parser.tag.name\n      emitNode(parser, 'onclosetag', parser.tagName)\n\n      var x = {}\n      for (var i in tag.ns) {\n        x[i] = tag.ns[i]\n      }\n\n      var parent = parser.tags[parser.tags.length - 1] || parser\n      if (parser.opt.xmlns && tag.ns !== parent.ns) {\n        // remove namespace bindings introduced by tag\n        Object.keys(tag.ns).forEach(function (p) {\n          var n = tag.ns[p]\n          emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })\n        })\n      }\n    }\n    if (t === 0) parser.closedRoot = true\n    parser.tagName = parser.attribValue = parser.attribName = ''\n    parser.attribList.length = 0\n    parser.state = S.TEXT\n  }\n\n  function parseEntity (parser) {\n    var entity = parser.entity\n    var entityLC = entity.toLowerCase()\n    var num\n    var numStr = ''\n\n    if (parser.ENTITIES[entity]) {\n      return parser.ENTITIES[entity]\n    }\n    if (parser.ENTITIES[entityLC]) {\n      return parser.ENTITIES[entityLC]\n    }\n    entity = entityLC\n    if (entity.charAt(0) === '#') {\n      if (entity.charAt(1) === 'x') {\n        entity = entity.slice(2)\n        num = parseInt(entity, 16)\n        numStr = num.toString(16)\n      } else {\n        entity = entity.slice(1)\n        num = parseInt(entity, 10)\n        numStr = num.toString(10)\n      }\n    }\n    entity = entity.replace(/^0+/, '')\n    if (numStr.toLowerCase() !== entity) {\n      strictFail(parser, 'Invalid character entity')\n      return '&' + parser.entity + ';'\n    }\n\n    return String.fromCodePoint(num)\n  }\n\n  function beginWhiteSpace (parser, c) {\n    if (c === '<') {\n      parser.state = S.OPEN_WAKA\n      parser.startTagPosition = parser.position\n    } else if (not(whitespace, c)) {\n      // have to process this as a text node.\n      // weird, but happens.\n      strictFail(parser, 'Non-whitespace before first tag.')\n      parser.textNode = c\n      parser.state = S.TEXT\n    }\n  }\n\n  function charAt (chunk, i) {\n    var result = ''\n    if (i < chunk.length) {\n      result = chunk.charAt(i)\n    }\n    return result\n  }\n\n  function write (chunk) {\n    var parser = this\n    if (this.error) {\n      throw this.error\n    }\n    if (parser.closed) {\n      return error(parser,\n        'Cannot write after close. Assign an onready handler.')\n    }\n    if (chunk === null) {\n      return end(parser)\n    }\n    if (typeof chunk === 'object') {\n      chunk = chunk.toString()\n    }\n    var i = 0\n    var c = ''\n    while (true) {\n      c = charAt(chunk, i++)\n      parser.c = c\n      if (!c) {\n        break\n      }\n      if (parser.trackPosition) {\n        parser.position++\n        if (c === '\\n') {\n          parser.line++\n          parser.column = 0\n        } else {\n          parser.column++\n        }\n      }\n      switch (parser.state) {\n        case S.BEGIN:\n          parser.state = S.BEGIN_WHITESPACE\n          if (c === '\\uFEFF') {\n            continue\n          }\n          beginWhiteSpace(parser, c)\n          continue\n\n        case S.BEGIN_WHITESPACE:\n          beginWhiteSpace(parser, c)\n          continue\n\n        case S.TEXT:\n          if (parser.sawRoot && !parser.closedRoot) {\n            var starti = i - 1\n            while (c && c !== '<' && c !== '&') {\n              c = charAt(chunk, i++)\n              if (c && parser.trackPosition) {\n                parser.position++\n                if (c === '\\n') {\n                  parser.line++\n                  parser.column = 0\n                } else {\n                  parser.column++\n                }\n              }\n            }\n            parser.textNode += chunk.substring(starti, i - 1)\n          }\n          if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {\n            parser.state = S.OPEN_WAKA\n            parser.startTagPosition = parser.position\n          } else {\n            if (not(whitespace, c) && (!parser.sawRoot || parser.closedRoot)) {\n              strictFail(parser, 'Text data outside of root node.')\n            }\n            if (c === '&') {\n              parser.state = S.TEXT_ENTITY\n            } else {\n              parser.textNode += c\n            }\n          }\n          continue\n\n        case S.SCRIPT:\n          // only non-strict\n          if (c === '<') {\n            parser.state = S.SCRIPT_ENDING\n          } else {\n            parser.script += c\n          }\n          continue\n\n        case S.SCRIPT_ENDING:\n          if (c === '/') {\n            parser.state = S.CLOSE_TAG\n          } else {\n            parser.script += '<' + c\n            parser.state = S.SCRIPT\n          }\n          continue\n\n        case S.OPEN_WAKA:\n          // either a /, ?, !, or text is coming next.\n          if (c === '!') {\n            parser.state = S.SGML_DECL\n            parser.sgmlDecl = ''\n          } else if (is(whitespace, c)) {\n            // wait for it...\n          } else if (is(nameStart, c)) {\n            parser.state = S.OPEN_TAG\n            parser.tagName = c\n          } else if (c === '/') {\n            parser.state = S.CLOSE_TAG\n            parser.tagName = ''\n          } else if (c === '?') {\n            parser.state = S.PROC_INST\n            parser.procInstName = parser.procInstBody = ''\n          } else {\n            strictFail(parser, 'Unencoded <')\n            // if there was some whitespace, then add that in.\n            if (parser.startTagPosition + 1 < parser.position) {\n              var pad = parser.position - parser.startTagPosition\n              c = new Array(pad).join(' ') + c\n            }\n            parser.textNode += '<' + c\n            parser.state = S.TEXT\n          }\n          continue\n\n        case S.SGML_DECL:\n          if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {\n            emitNode(parser, 'onopencdata')\n            parser.state = S.CDATA\n            parser.sgmlDecl = ''\n            parser.cdata = ''\n          } else if (parser.sgmlDecl + c === '--') {\n            parser.state = S.COMMENT\n            parser.comment = ''\n            parser.sgmlDecl = ''\n          } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {\n            parser.state = S.DOCTYPE\n            if (parser.doctype || parser.sawRoot) {\n              strictFail(parser,\n                'Inappropriately located doctype declaration')\n            }\n            parser.doctype = ''\n            parser.sgmlDecl = ''\n          } else if (c === '>') {\n            emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)\n            parser.sgmlDecl = ''\n            parser.state = S.TEXT\n          } else if (is(quote, c)) {\n            parser.state = S.SGML_DECL_QUOTED\n            parser.sgmlDecl += c\n          } else {\n            parser.sgmlDecl += c\n          }\n          continue\n\n        case S.SGML_DECL_QUOTED:\n          if (c === parser.q) {\n            parser.state = S.SGML_DECL\n            parser.q = ''\n          }\n          parser.sgmlDecl += c\n          continue\n\n        case S.DOCTYPE:\n          if (c === '>') {\n            parser.state = S.TEXT\n            emitNode(parser, 'ondoctype', parser.doctype)\n            parser.doctype = true // just remember that we saw it.\n          } else {\n            parser.doctype += c\n            if (c === '[') {\n              parser.state = S.DOCTYPE_DTD\n            } else if (is(quote, c)) {\n              parser.state = S.DOCTYPE_QUOTED\n              parser.q = c\n            }\n          }\n          continue\n\n        case S.DOCTYPE_QUOTED:\n          parser.doctype += c\n          if (c === parser.q) {\n            parser.q = ''\n            parser.state = S.DOCTYPE\n          }\n          continue\n\n        case S.DOCTYPE_DTD:\n          parser.doctype += c\n          if (c === ']') {\n            parser.state = S.DOCTYPE\n          } else if (is(quote, c)) {\n            parser.state = S.DOCTYPE_DTD_QUOTED\n            parser.q = c\n          }\n          continue\n\n        case S.DOCTYPE_DTD_QUOTED:\n          parser.doctype += c\n          if (c === parser.q) {\n            parser.state = S.DOCTYPE_DTD\n            parser.q = ''\n          }\n          continue\n\n        case S.COMMENT:\n          if (c === '-') {\n            parser.state = S.COMMENT_ENDING\n          } else {\n            parser.comment += c\n          }\n          continue\n\n        case S.COMMENT_ENDING:\n          if (c === '-') {\n            parser.state = S.COMMENT_ENDED\n            parser.comment = textopts(parser.opt, parser.comment)\n            if (parser.comment) {\n              emitNode(parser, 'oncomment', parser.comment)\n            }\n            parser.comment = ''\n          } else {\n            parser.comment += '-' + c\n            parser.state = S.COMMENT\n          }\n          continue\n\n        case S.COMMENT_ENDED:\n          if (c !== '>') {\n            strictFail(parser, 'Malformed comment')\n            // allow <!-- blah -- bloo --> in non-strict mode,\n            // which is a comment of \" blah -- bloo \"\n            parser.comment += '--' + c\n            parser.state = S.COMMENT\n          } else {\n            parser.state = S.TEXT\n          }\n          continue\n\n        case S.CDATA:\n          if (c === ']') {\n            parser.state = S.CDATA_ENDING\n          } else {\n            parser.cdata += c\n          }\n          continue\n\n        case S.CDATA_ENDING:\n          if (c === ']') {\n            parser.state = S.CDATA_ENDING_2\n          } else {\n            parser.cdata += ']' + c\n            parser.state = S.CDATA\n          }\n          continue\n\n        case S.CDATA_ENDING_2:\n          if (c === '>') {\n            if (parser.cdata) {\n              emitNode(parser, 'oncdata', parser.cdata)\n            }\n            emitNode(parser, 'onclosecdata')\n            parser.cdata = ''\n            parser.state = S.TEXT\n          } else if (c === ']') {\n            parser.cdata += ']'\n          } else {\n            parser.cdata += ']]' + c\n            parser.state = S.CDATA\n          }\n          continue\n\n        case S.PROC_INST:\n          if (c === '?') {\n            parser.state = S.PROC_INST_ENDING\n          } else if (is(whitespace, c)) {\n            parser.state = S.PROC_INST_BODY\n          } else {\n            parser.procInstName += c\n          }\n          continue\n\n        case S.PROC_INST_BODY:\n          if (!parser.procInstBody && is(whitespace, c)) {\n            continue\n          } else if (c === '?') {\n            parser.state = S.PROC_INST_ENDING\n          } else {\n            parser.procInstBody += c\n          }\n          continue\n\n        case S.PROC_INST_ENDING:\n          if (c === '>') {\n            emitNode(parser, 'onprocessinginstruction', {\n              name: parser.procInstName,\n              body: parser.procInstBody\n            })\n            parser.procInstName = parser.procInstBody = ''\n            parser.state = S.TEXT\n          } else {\n            parser.procInstBody += '?' + c\n            parser.state = S.PROC_INST_BODY\n          }\n          continue\n\n        case S.OPEN_TAG:\n          if (is(nameBody, c)) {\n            parser.tagName += c\n          } else {\n            newTag(parser)\n            if (c === '>') {\n              openTag(parser)\n            } else if (c === '/') {\n              parser.state = S.OPEN_TAG_SLASH\n            } else {\n              if (not(whitespace, c)) {\n                strictFail(parser, 'Invalid character in tag name')\n              }\n              parser.state = S.ATTRIB\n            }\n          }\n          continue\n\n        case S.OPEN_TAG_SLASH:\n          if (c === '>') {\n            openTag(parser, true)\n            closeTag(parser)\n          } else {\n            strictFail(parser, 'Forward-slash in opening tag not followed by >')\n            parser.state = S.ATTRIB\n          }\n          continue\n\n        case S.ATTRIB:\n          // haven't read the attribute name yet.\n          if (is(whitespace, c)) {\n            continue\n          } else if (c === '>') {\n            openTag(parser)\n          } else if (c === '/') {\n            parser.state = S.OPEN_TAG_SLASH\n          } else if (is(nameStart, c)) {\n            parser.attribName = c\n            parser.attribValue = ''\n            parser.state = S.ATTRIB_NAME\n          } else {\n            strictFail(parser, 'Invalid attribute name')\n          }\n          continue\n\n        case S.ATTRIB_NAME:\n          if (c === '=') {\n            parser.state = S.ATTRIB_VALUE\n          } else if (c === '>') {\n            strictFail(parser, 'Attribute without value')\n            parser.attribValue = parser.attribName\n            attrib(parser)\n            openTag(parser)\n          } else if (is(whitespace, c)) {\n            parser.state = S.ATTRIB_NAME_SAW_WHITE\n          } else if (is(nameBody, c)) {\n            parser.attribName += c\n          } else {\n            strictFail(parser, 'Invalid attribute name')\n          }\n          continue\n\n        case S.ATTRIB_NAME_SAW_WHITE:\n          if (c === '=') {\n            parser.state = S.ATTRIB_VALUE\n          } else if (is(whitespace, c)) {\n            continue\n          } else {\n            strictFail(parser, 'Attribute without value')\n            parser.tag.attributes[parser.attribName] = ''\n            parser.attribValue = ''\n            emitNode(parser, 'onattribute', {\n              name: parser.attribName,\n              value: ''\n            })\n            parser.attribName = ''\n            if (c === '>') {\n              openTag(parser)\n            } else if (is(nameStart, c)) {\n              parser.attribName = c\n              parser.state = S.ATTRIB_NAME\n            } else {\n              strictFail(parser, 'Invalid attribute name')\n              parser.state = S.ATTRIB\n            }\n          }\n          continue\n\n        case S.ATTRIB_VALUE:\n          if (is(whitespace, c)) {\n            continue\n          } else if (is(quote, c)) {\n            parser.q = c\n            parser.state = S.ATTRIB_VALUE_QUOTED\n          } else {\n            strictFail(parser, 'Unquoted attribute value')\n            parser.state = S.ATTRIB_VALUE_UNQUOTED\n            parser.attribValue = c\n          }\n          continue\n\n        case S.ATTRIB_VALUE_QUOTED:\n          if (c !== parser.q) {\n            if (c === '&') {\n              parser.state = S.ATTRIB_VALUE_ENTITY_Q\n            } else {\n              parser.attribValue += c\n            }\n            continue\n          }\n          attrib(parser)\n          parser.q = ''\n          parser.state = S.ATTRIB_VALUE_CLOSED\n          continue\n\n        case S.ATTRIB_VALUE_CLOSED:\n          if (is(whitespace, c)) {\n            parser.state = S.ATTRIB\n          } else if (c === '>') {\n            openTag(parser)\n          } else if (c === '/') {\n            parser.state = S.OPEN_TAG_SLASH\n          } else if (is(nameStart, c)) {\n            strictFail(parser, 'No whitespace between attributes')\n            parser.attribName = c\n            parser.attribValue = ''\n            parser.state = S.ATTRIB_NAME\n          } else {\n            strictFail(parser, 'Invalid attribute name')\n          }\n          continue\n\n        case S.ATTRIB_VALUE_UNQUOTED:\n          if (not(attribEnd, c)) {\n            if (c === '&') {\n              parser.state = S.ATTRIB_VALUE_ENTITY_U\n            } else {\n              parser.attribValue += c\n            }\n            continue\n          }\n          attrib(parser)\n          if (c === '>') {\n            openTag(parser)\n          } else {\n            parser.state = S.ATTRIB\n          }\n          continue\n\n        case S.CLOSE_TAG:\n          if (!parser.tagName) {\n            if (is(whitespace, c)) {\n              continue\n            } else if (not(nameStart, c)) {\n              if (parser.script) {\n                parser.script += '</' + c\n                parser.state = S.SCRIPT\n              } else {\n                strictFail(parser, 'Invalid tagname in closing tag.')\n              }\n            } else {\n              parser.tagName = c\n            }\n          } else if (c === '>') {\n            closeTag(parser)\n          } else if (is(nameBody, c)) {\n            parser.tagName += c\n          } else if (parser.script) {\n            parser.script += '</' + parser.tagName\n            parser.tagName = ''\n            parser.state = S.SCRIPT\n          } else {\n            if (not(whitespace, c)) {\n              strictFail(parser, 'Invalid tagname in closing tag')\n            }\n            parser.state = S.CLOSE_TAG_SAW_WHITE\n          }\n          continue\n\n        case S.CLOSE_TAG_SAW_WHITE:\n          if (is(whitespace, c)) {\n            continue\n          }\n          if (c === '>') {\n            closeTag(parser)\n          } else {\n            strictFail(parser, 'Invalid characters in closing tag')\n          }\n          continue\n\n        case S.TEXT_ENTITY:\n        case S.ATTRIB_VALUE_ENTITY_Q:\n        case S.ATTRIB_VALUE_ENTITY_U:\n          var returnState\n          var buffer\n          switch (parser.state) {\n            case S.TEXT_ENTITY:\n              returnState = S.TEXT\n              buffer = 'textNode'\n              break\n\n            case S.ATTRIB_VALUE_ENTITY_Q:\n              returnState = S.ATTRIB_VALUE_QUOTED\n              buffer = 'attribValue'\n              break\n\n            case S.ATTRIB_VALUE_ENTITY_U:\n              returnState = S.ATTRIB_VALUE_UNQUOTED\n              buffer = 'attribValue'\n              break\n          }\n\n          if (c === ';') {\n            parser[buffer] += parseEntity(parser)\n            parser.entity = ''\n            parser.state = returnState\n          } else if (is(parser.entity.length ? entityBody : entityStart, c)) {\n            parser.entity += c\n          } else {\n            strictFail(parser, 'Invalid character in entity name')\n            parser[buffer] += '&' + parser.entity + c\n            parser.entity = ''\n            parser.state = returnState\n          }\n\n          continue\n\n        default:\n          throw new Error(parser, 'Unknown state: ' + parser.state)\n      }\n    } // while\n\n    if (parser.position >= parser.bufferCheckPosition) {\n      checkBufferLength(parser)\n    }\n    return parser\n  }\n\n  /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */\n  if (!String.fromCodePoint) {\n    (function () {\n      var stringFromCharCode = String.fromCharCode\n      var floor = Math.floor\n      var fromCodePoint = function () {\n        var MAX_SIZE = 0x4000\n        var codeUnits = []\n        var highSurrogate\n        var lowSurrogate\n        var index = -1\n        var length = arguments.length\n        if (!length) {\n          return ''\n        }\n        var result = ''\n        while (++index < length) {\n          var codePoint = Number(arguments[index])\n          if (\n            !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n            codePoint < 0 || // not a valid Unicode code point\n            codePoint > 0x10FFFF || // not a valid Unicode code point\n            floor(codePoint) !== codePoint // not an integer\n          ) {\n            throw RangeError('Invalid code point: ' + codePoint)\n          }\n          if (codePoint <= 0xFFFF) { // BMP code point\n            codeUnits.push(codePoint)\n          } else { // Astral code point; split in surrogate halves\n            // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n            codePoint -= 0x10000\n            highSurrogate = (codePoint >> 10) + 0xD800\n            lowSurrogate = (codePoint % 0x400) + 0xDC00\n            codeUnits.push(highSurrogate, lowSurrogate)\n          }\n          if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n            result += stringFromCharCode.apply(null, codeUnits)\n            codeUnits.length = 0\n          }\n        }\n        return result\n      }\n      if (Object.defineProperty) {\n        Object.defineProperty(String, 'fromCodePoint', {\n          value: fromCodePoint,\n          configurable: true,\n          writable: true\n        })\n      } else {\n        String.fromCodePoint = fromCodePoint\n      }\n    }())\n  }\n})(typeof exports === 'undefined' ? this.sax = {} : exports)\n\n}).call(this,require(\"buffer\").Buffer)\n},{\"buffer\":77,\"stream\":151,\"string_decoder\":152}],151:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = Stream;\n\nvar EE = require('events').EventEmitter;\nvar inherits = require('inherits');\n\ninherits(Stream, EE);\nStream.Readable = require('readable-stream/readable.js');\nStream.Writable = require('readable-stream/writable.js');\nStream.Duplex = require('readable-stream/duplex.js');\nStream.Transform = require('readable-stream/transform.js');\nStream.PassThrough = require('readable-stream/passthrough.js');\n\n// Backwards-compat with node 0.4.x\nStream.Stream = Stream;\n\n\n\n// old-style streams.  Note that the pipe method (the only relevant\n// part of this class) is overridden in the Readable class.\n\nfunction Stream() {\n  EE.call(this);\n}\n\nStream.prototype.pipe = function(dest, options) {\n  var source = this;\n\n  function ondata(chunk) {\n    if (dest.writable) {\n      if (false === dest.write(chunk) && source.pause) {\n        source.pause();\n      }\n    }\n  }\n\n  source.on('data', ondata);\n\n  function ondrain() {\n    if (source.readable && source.resume) {\n      source.resume();\n    }\n  }\n\n  dest.on('drain', ondrain);\n\n  // If the 'end' option is not supplied, dest.end() will be called when\n  // source gets the 'end' or 'close' events.  Only dest.end() once.\n  if (!dest._isStdio && (!options || options.end !== false)) {\n    source.on('end', onend);\n    source.on('close', onclose);\n  }\n\n  var didOnEnd = false;\n  function onend() {\n    if (didOnEnd) return;\n    didOnEnd = true;\n\n    dest.end();\n  }\n\n\n  function onclose() {\n    if (didOnEnd) return;\n    didOnEnd = true;\n\n    if (typeof dest.destroy === 'function') dest.destroy();\n  }\n\n  // don't leave dangling pipes when there are errors.\n  function onerror(er) {\n    cleanup();\n    if (EE.listenerCount(this, 'error') === 0) {\n      throw er; // Unhandled stream error in pipe.\n    }\n  }\n\n  source.on('error', onerror);\n  dest.on('error', onerror);\n\n  // remove all the event listeners that were added.\n  function cleanup() {\n    source.removeListener('data', ondata);\n    dest.removeListener('drain', ondrain);\n\n    source.removeListener('end', onend);\n    source.removeListener('close', onclose);\n\n    source.removeListener('error', onerror);\n    dest.removeListener('error', onerror);\n\n    source.removeListener('end', cleanup);\n    source.removeListener('close', cleanup);\n\n    dest.removeListener('close', cleanup);\n  }\n\n  source.on('end', cleanup);\n  source.on('close', cleanup);\n\n  dest.on('close', cleanup);\n\n  dest.emit('pipe', source);\n\n  // Allow for unix-like usage: A.pipe(B).pipe(C)\n  return dest;\n};\n\n},{\"events\":79,\"inherits\":81,\"readable-stream/duplex.js\":139,\"readable-stream/passthrough.js\":146,\"readable-stream/readable.js\":147,\"readable-stream/transform.js\":148,\"readable-stream/writable.js\":149}],152:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar Buffer = require('buffer').Buffer;\n\nvar isBufferEncoding = Buffer.isEncoding\n  || function(encoding) {\n       switch (encoding && encoding.toLowerCase()) {\n         case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;\n         default: return false;\n       }\n     }\n\n\nfunction assertEncoding(encoding) {\n  if (encoding && !isBufferEncoding(encoding)) {\n    throw new Error('Unknown encoding: ' + encoding);\n  }\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters. CESU-8 is handled as part of the UTF-8 encoding.\n//\n// @TODO Handling all encodings inside a single object makes it very difficult\n// to reason about this code, so it should be split up in the future.\n// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code\n// points as used by CESU-8.\nvar StringDecoder = exports.StringDecoder = function(encoding) {\n  this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');\n  assertEncoding(encoding);\n  switch (this.encoding) {\n    case 'utf8':\n      // CESU-8 represents each of Surrogate Pair by 3-bytes\n      this.surrogateSize = 3;\n      break;\n    case 'ucs2':\n    case 'utf16le':\n      // UTF-16 represents each of Surrogate Pair by 2-bytes\n      this.surrogateSize = 2;\n      this.detectIncompleteChar = utf16DetectIncompleteChar;\n      break;\n    case 'base64':\n      // Base-64 stores 3 bytes in 4 chars, and pads the remainder.\n      this.surrogateSize = 3;\n      this.detectIncompleteChar = base64DetectIncompleteChar;\n      break;\n    default:\n      this.write = passThroughWrite;\n      return;\n  }\n\n  // Enough space to store all bytes of a single character. UTF-8 needs 4\n  // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).\n  this.charBuffer = new Buffer(6);\n  // Number of bytes received for the current incomplete multi-byte character.\n  this.charReceived = 0;\n  // Number of bytes expected for the current incomplete multi-byte character.\n  this.charLength = 0;\n};\n\n\n// write decodes the given buffer and returns it as JS string that is\n// guaranteed to not contain any partial multi-byte characters. Any partial\n// character found at the end of the buffer is buffered up, and will be\n// returned when calling write again with the remaining bytes.\n//\n// Note: Converting a Buffer containing an orphan surrogate to a String\n// currently works, but converting a String to a Buffer (via `new Buffer`, or\n// Buffer#write) will replace incomplete surrogates with the unicode\n// replacement character. See https://codereview.chromium.org/121173009/ .\nStringDecoder.prototype.write = function(buffer) {\n  var charStr = '';\n  // if our last write ended with an incomplete multibyte character\n  while (this.charLength) {\n    // determine how many remaining bytes this buffer has to offer for this char\n    var available = (buffer.length >= this.charLength - this.charReceived) ?\n        this.charLength - this.charReceived :\n        buffer.length;\n\n    // add the new bytes to the char buffer\n    buffer.copy(this.charBuffer, this.charReceived, 0, available);\n    this.charReceived += available;\n\n    if (this.charReceived < this.charLength) {\n      // still not enough chars in this buffer? wait for more ...\n      return '';\n    }\n\n    // remove bytes belonging to the current character from the buffer\n    buffer = buffer.slice(available, buffer.length);\n\n    // get the character that was split\n    charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);\n\n    // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character\n    var charCode = charStr.charCodeAt(charStr.length - 1);\n    if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n      this.charLength += this.surrogateSize;\n      charStr = '';\n      continue;\n    }\n    this.charReceived = this.charLength = 0;\n\n    // if there are no more bytes in this buffer, just emit our char\n    if (buffer.length === 0) {\n      return charStr;\n    }\n    break;\n  }\n\n  // determine and set charLength / charReceived\n  this.detectIncompleteChar(buffer);\n\n  var end = buffer.length;\n  if (this.charLength) {\n    // buffer the incomplete character bytes we got\n    buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);\n    end -= this.charReceived;\n  }\n\n  charStr += buffer.toString(this.encoding, 0, end);\n\n  var end = charStr.length - 1;\n  var charCode = charStr.charCodeAt(end);\n  // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character\n  if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n    var size = this.surrogateSize;\n    this.charLength += size;\n    this.charReceived += size;\n    this.charBuffer.copy(this.charBuffer, size, 0, size);\n    buffer.copy(this.charBuffer, 0, 0, size);\n    return charStr.substring(0, end);\n  }\n\n  // or just emit the charStr\n  return charStr;\n};\n\n// detectIncompleteChar determines if there is an incomplete UTF-8 character at\n// the end of the given buffer. If so, it sets this.charLength to the byte\n// length that character, and sets this.charReceived to the number of bytes\n// that are available for this character.\nStringDecoder.prototype.detectIncompleteChar = function(buffer) {\n  // determine how many bytes we have to check at the end of this buffer\n  var i = (buffer.length >= 3) ? 3 : buffer.length;\n\n  // Figure out if one of the last i bytes of our buffer announces an\n  // incomplete char.\n  for (; i > 0; i--) {\n    var c = buffer[buffer.length - i];\n\n    // See http://en.wikipedia.org/wiki/UTF-8#Description\n\n    // 110XXXXX\n    if (i == 1 && c >> 5 == 0x06) {\n      this.charLength = 2;\n      break;\n    }\n\n    // 1110XXXX\n    if (i <= 2 && c >> 4 == 0x0E) {\n      this.charLength = 3;\n      break;\n    }\n\n    // 11110XXX\n    if (i <= 3 && c >> 3 == 0x1E) {\n      this.charLength = 4;\n      break;\n    }\n  }\n  this.charReceived = i;\n};\n\nStringDecoder.prototype.end = function(buffer) {\n  var res = '';\n  if (buffer && buffer.length)\n    res = this.write(buffer);\n\n  if (this.charReceived) {\n    var cr = this.charReceived;\n    var buf = this.charBuffer;\n    var enc = this.encoding;\n    res += buf.slice(0, cr).toString(enc);\n  }\n\n  return res;\n};\n\nfunction passThroughWrite(buffer) {\n  return buffer.toString(this.encoding);\n}\n\nfunction utf16DetectIncompleteChar(buffer) {\n  this.charReceived = buffer.length % 2;\n  this.charLength = this.charReceived ? 2 : 0;\n}\n\nfunction base64DetectIncompleteChar(buffer) {\n  this.charReceived = buffer.length % 3;\n  this.charLength = this.charReceived ? 3 : 0;\n}\n\n},{\"buffer\":77}],153:[function(require,module,exports){\n//     Underscore.js 1.8.3\n//     http://underscorejs.org\n//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Underscore may be freely distributed under the MIT license.\n\n(function() {\n\n  // Baseline setup\n  // --------------\n\n  // Establish the root object, `window` in the browser, or `exports` on the server.\n  var root = this;\n\n  // Save the previous value of the `_` variable.\n  var previousUnderscore = root._;\n\n  // Save bytes in the minified (but not gzipped) version:\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n  // Create quick reference variables for speed access to core prototypes.\n  var\n    push             = ArrayProto.push,\n    slice            = ArrayProto.slice,\n    toString         = ObjProto.toString,\n    hasOwnProperty   = ObjProto.hasOwnProperty;\n\n  // All **ECMAScript 5** native function implementations that we hope to use\n  // are declared here.\n  var\n    nativeIsArray      = Array.isArray,\n    nativeKeys         = Object.keys,\n    nativeBind         = FuncProto.bind,\n    nativeCreate       = Object.create;\n\n  // Naked function reference for surrogate-prototype-swapping.\n  var Ctor = function(){};\n\n  // Create a safe reference to the Underscore object for use below.\n  var _ = function(obj) {\n    if (obj instanceof _) return obj;\n    if (!(this instanceof _)) return new _(obj);\n    this._wrapped = obj;\n  };\n\n  // Export the Underscore object for **Node.js**, with\n  // backwards-compatibility for the old `require()` API. If we're in\n  // the browser, add `_` as a global object.\n  if (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports) {\n      exports = module.exports = _;\n    }\n    exports._ = _;\n  } else {\n    root._ = _;\n  }\n\n  // Current version.\n  _.VERSION = '1.8.3';\n\n  // Internal function that returns an efficient (for current engines) version\n  // of the passed-in callback, to be repeatedly applied in other Underscore\n  // functions.\n  var optimizeCb = function(func, context, argCount) {\n    if (context === void 0) return func;\n    switch (argCount == null ? 3 : argCount) {\n      case 1: return function(value) {\n        return func.call(context, value);\n      };\n      case 2: return function(value, other) {\n        return func.call(context, value, other);\n      };\n      case 3: return function(value, index, collection) {\n        return func.call(context, value, index, collection);\n      };\n      case 4: return function(accumulator, value, index, collection) {\n        return func.call(context, accumulator, value, index, collection);\n      };\n    }\n    return function() {\n      return func.apply(context, arguments);\n    };\n  };\n\n  // A mostly-internal function to generate callbacks that can be applied\n  // to each element in a collection, returning the desired result — either\n  // identity, an arbitrary callback, a property matcher, or a property accessor.\n  var cb = function(value, context, argCount) {\n    if (value == null) return _.identity;\n    if (_.isFunction(value)) return optimizeCb(value, context, argCount);\n    if (_.isObject(value)) return _.matcher(value);\n    return _.property(value);\n  };\n  _.iteratee = function(value, context) {\n    return cb(value, context, Infinity);\n  };\n\n  // An internal function for creating assigner functions.\n  var createAssigner = function(keysFunc, undefinedOnly) {\n    return function(obj) {\n      var length = arguments.length;\n      if (length < 2 || obj == null) return obj;\n      for (var index = 1; index < length; index++) {\n        var source = arguments[index],\n            keys = keysFunc(source),\n            l = keys.length;\n        for (var i = 0; i < l; i++) {\n          var key = keys[i];\n          if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];\n        }\n      }\n      return obj;\n    };\n  };\n\n  // An internal function for creating a new object that inherits from another.\n  var baseCreate = function(prototype) {\n    if (!_.isObject(prototype)) return {};\n    if (nativeCreate) return nativeCreate(prototype);\n    Ctor.prototype = prototype;\n    var result = new Ctor;\n    Ctor.prototype = null;\n    return result;\n  };\n\n  var property = function(key) {\n    return function(obj) {\n      return obj == null ? void 0 : obj[key];\n    };\n  };\n\n  // Helper for collection methods to determine whether a collection\n  // should be iterated as an array or as an object\n  // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\n  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\n  var getLength = property('length');\n  var isArrayLike = function(collection) {\n    var length = getLength(collection);\n    return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n  };\n\n  // Collection Functions\n  // --------------------\n\n  // The cornerstone, an `each` implementation, aka `forEach`.\n  // Handles raw objects in addition to array-likes. Treats all\n  // sparse array-likes as if they were dense.\n  _.each = _.forEach = function(obj, iteratee, context) {\n    iteratee = optimizeCb(iteratee, context);\n    var i, length;\n    if (isArrayLike(obj)) {\n      for (i = 0, length = obj.length; i < length; i++) {\n        iteratee(obj[i], i, obj);\n      }\n    } else {\n      var keys = _.keys(obj);\n      for (i = 0, length = keys.length; i < length; i++) {\n        iteratee(obj[keys[i]], keys[i], obj);\n      }\n    }\n    return obj;\n  };\n\n  // Return the results of applying the iteratee to each element.\n  _.map = _.collect = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length,\n        results = Array(length);\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      results[index] = iteratee(obj[currentKey], currentKey, obj);\n    }\n    return results;\n  };\n\n  // Create a reducing function iterating left or right.\n  function createReduce(dir) {\n    // Optimized iterator function as using arguments.length\n    // in the main function will deoptimize the, see #1991.\n    function iterator(obj, iteratee, memo, keys, index, length) {\n      for (; index >= 0 && index < length; index += dir) {\n        var currentKey = keys ? keys[index] : index;\n        memo = iteratee(memo, obj[currentKey], currentKey, obj);\n      }\n      return memo;\n    }\n\n    return function(obj, iteratee, memo, context) {\n      iteratee = optimizeCb(iteratee, context, 4);\n      var keys = !isArrayLike(obj) && _.keys(obj),\n          length = (keys || obj).length,\n          index = dir > 0 ? 0 : length - 1;\n      // Determine the initial value if none is provided.\n      if (arguments.length < 3) {\n        memo = obj[keys ? keys[index] : index];\n        index += dir;\n      }\n      return iterator(obj, iteratee, memo, keys, index, length);\n    };\n  }\n\n  // **Reduce** builds up a single result from a list of values, aka `inject`,\n  // or `foldl`.\n  _.reduce = _.foldl = _.inject = createReduce(1);\n\n  // The right-associative version of reduce, also known as `foldr`.\n  _.reduceRight = _.foldr = createReduce(-1);\n\n  // Return the first value which passes a truth test. Aliased as `detect`.\n  _.find = _.detect = function(obj, predicate, context) {\n    var key;\n    if (isArrayLike(obj)) {\n      key = _.findIndex(obj, predicate, context);\n    } else {\n      key = _.findKey(obj, predicate, context);\n    }\n    if (key !== void 0 && key !== -1) return obj[key];\n  };\n\n  // Return all the elements that pass a truth test.\n  // Aliased as `select`.\n  _.filter = _.select = function(obj, predicate, context) {\n    var results = [];\n    predicate = cb(predicate, context);\n    _.each(obj, function(value, index, list) {\n      if (predicate(value, index, list)) results.push(value);\n    });\n    return results;\n  };\n\n  // Return all the elements for which a truth test fails.\n  _.reject = function(obj, predicate, context) {\n    return _.filter(obj, _.negate(cb(predicate)), context);\n  };\n\n  // Determine whether all of the elements match a truth test.\n  // Aliased as `all`.\n  _.every = _.all = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length;\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      if (!predicate(obj[currentKey], currentKey, obj)) return false;\n    }\n    return true;\n  };\n\n  // Determine if at least one element in the object matches a truth test.\n  // Aliased as `any`.\n  _.some = _.any = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length;\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      if (predicate(obj[currentKey], currentKey, obj)) return true;\n    }\n    return false;\n  };\n\n  // Determine if the array or object contains a given item (using `===`).\n  // Aliased as `includes` and `include`.\n  _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {\n    if (!isArrayLike(obj)) obj = _.values(obj);\n    if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n    return _.indexOf(obj, item, fromIndex) >= 0;\n  };\n\n  // Invoke a method (with arguments) on every item in a collection.\n  _.invoke = function(obj, method) {\n    var args = slice.call(arguments, 2);\n    var isFunc = _.isFunction(method);\n    return _.map(obj, function(value) {\n      var func = isFunc ? method : value[method];\n      return func == null ? func : func.apply(value, args);\n    });\n  };\n\n  // Convenience version of a common use case of `map`: fetching a property.\n  _.pluck = function(obj, key) {\n    return _.map(obj, _.property(key));\n  };\n\n  // Convenience version of a common use case of `filter`: selecting only objects\n  // containing specific `key:value` pairs.\n  _.where = function(obj, attrs) {\n    return _.filter(obj, _.matcher(attrs));\n  };\n\n  // Convenience version of a common use case of `find`: getting the first object\n  // containing specific `key:value` pairs.\n  _.findWhere = function(obj, attrs) {\n    return _.find(obj, _.matcher(attrs));\n  };\n\n  // Return the maximum element (or element-based computation).\n  _.max = function(obj, iteratee, context) {\n    var result = -Infinity, lastComputed = -Infinity,\n        value, computed;\n    if (iteratee == null && obj != null) {\n      obj = isArrayLike(obj) ? obj : _.values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value > result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index, list) {\n        computed = iteratee(value, index, list);\n        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {\n          result = value;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  };\n\n  // Return the minimum element (or element-based computation).\n  _.min = function(obj, iteratee, context) {\n    var result = Infinity, lastComputed = Infinity,\n        value, computed;\n    if (iteratee == null && obj != null) {\n      obj = isArrayLike(obj) ? obj : _.values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value < result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index, list) {\n        computed = iteratee(value, index, list);\n        if (computed < lastComputed || computed === Infinity && result === Infinity) {\n          result = value;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  };\n\n  // Shuffle a collection, using the modern version of the\n  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n  _.shuffle = function(obj) {\n    var set = isArrayLike(obj) ? obj : _.values(obj);\n    var length = set.length;\n    var shuffled = Array(length);\n    for (var index = 0, rand; index < length; index++) {\n      rand = _.random(0, index);\n      if (rand !== index) shuffled[index] = shuffled[rand];\n      shuffled[rand] = set[index];\n    }\n    return shuffled;\n  };\n\n  // Sample **n** random values from a collection.\n  // If **n** is not specified, returns a single random element.\n  // The internal `guard` argument allows it to work with `map`.\n  _.sample = function(obj, n, guard) {\n    if (n == null || guard) {\n      if (!isArrayLike(obj)) obj = _.values(obj);\n      return obj[_.random(obj.length - 1)];\n    }\n    return _.shuffle(obj).slice(0, Math.max(0, n));\n  };\n\n  // Sort the object's values by a criterion produced by an iteratee.\n  _.sortBy = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    return _.pluck(_.map(obj, function(value, index, list) {\n      return {\n        value: value,\n        index: index,\n        criteria: iteratee(value, index, list)\n      };\n    }).sort(function(left, right) {\n      var a = left.criteria;\n      var b = right.criteria;\n      if (a !== b) {\n        if (a > b || a === void 0) return 1;\n        if (a < b || b === void 0) return -1;\n      }\n      return left.index - right.index;\n    }), 'value');\n  };\n\n  // An internal function used for aggregate \"group by\" operations.\n  var group = function(behavior) {\n    return function(obj, iteratee, context) {\n      var result = {};\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index) {\n        var key = iteratee(value, index, obj);\n        behavior(result, value, key);\n      });\n      return result;\n    };\n  };\n\n  // Groups the object's values by a criterion. Pass either a string attribute\n  // to group by, or a function that returns the criterion.\n  _.groupBy = group(function(result, value, key) {\n    if (_.has(result, key)) result[key].push(value); else result[key] = [value];\n  });\n\n  // Indexes the object's values by a criterion, similar to `groupBy`, but for\n  // when you know that your index values will be unique.\n  _.indexBy = group(function(result, value, key) {\n    result[key] = value;\n  });\n\n  // Counts instances of an object that group by a certain criterion. Pass\n  // either a string attribute to count by, or a function that returns the\n  // criterion.\n  _.countBy = group(function(result, value, key) {\n    if (_.has(result, key)) result[key]++; else result[key] = 1;\n  });\n\n  // Safely create a real, live array from anything iterable.\n  _.toArray = function(obj) {\n    if (!obj) return [];\n    if (_.isArray(obj)) return slice.call(obj);\n    if (isArrayLike(obj)) return _.map(obj, _.identity);\n    return _.values(obj);\n  };\n\n  // Return the number of elements in an object.\n  _.size = function(obj) {\n    if (obj == null) return 0;\n    return isArrayLike(obj) ? obj.length : _.keys(obj).length;\n  };\n\n  // Split a collection into two arrays: one whose elements all satisfy the given\n  // predicate, and one whose elements all do not satisfy the predicate.\n  _.partition = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var pass = [], fail = [];\n    _.each(obj, function(value, key, obj) {\n      (predicate(value, key, obj) ? pass : fail).push(value);\n    });\n    return [pass, fail];\n  };\n\n  // Array Functions\n  // ---------------\n\n  // Get the first element of an array. Passing **n** will return the first N\n  // values in the array. Aliased as `head` and `take`. The **guard** check\n  // allows it to work with `_.map`.\n  _.first = _.head = _.take = function(array, n, guard) {\n    if (array == null) return void 0;\n    if (n == null || guard) return array[0];\n    return _.initial(array, array.length - n);\n  };\n\n  // Returns everything but the last entry of the array. Especially useful on\n  // the arguments object. Passing **n** will return all the values in\n  // the array, excluding the last N.\n  _.initial = function(array, n, guard) {\n    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n  };\n\n  // Get the last element of an array. Passing **n** will return the last N\n  // values in the array.\n  _.last = function(array, n, guard) {\n    if (array == null) return void 0;\n    if (n == null || guard) return array[array.length - 1];\n    return _.rest(array, Math.max(0, array.length - n));\n  };\n\n  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.\n  // Especially useful on the arguments object. Passing an **n** will return\n  // the rest N values in the array.\n  _.rest = _.tail = _.drop = function(array, n, guard) {\n    return slice.call(array, n == null || guard ? 1 : n);\n  };\n\n  // Trim out all falsy values from an array.\n  _.compact = function(array) {\n    return _.filter(array, _.identity);\n  };\n\n  // Internal implementation of a recursive `flatten` function.\n  var flatten = function(input, shallow, strict, startIndex) {\n    var output = [], idx = 0;\n    for (var i = startIndex || 0, length = getLength(input); i < length; i++) {\n      var value = input[i];\n      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {\n        //flatten current level of array or arguments object\n        if (!shallow) value = flatten(value, shallow, strict);\n        var j = 0, len = value.length;\n        output.length += len;\n        while (j < len) {\n          output[idx++] = value[j++];\n        }\n      } else if (!strict) {\n        output[idx++] = value;\n      }\n    }\n    return output;\n  };\n\n  // Flatten out an array, either recursively (by default), or just one level.\n  _.flatten = function(array, shallow) {\n    return flatten(array, shallow, false);\n  };\n\n  // Return a version of the array that does not contain the specified value(s).\n  _.without = function(array) {\n    return _.difference(array, slice.call(arguments, 1));\n  };\n\n  // Produce a duplicate-free version of the array. If the array has already\n  // been sorted, you have the option of using a faster algorithm.\n  // Aliased as `unique`.\n  _.uniq = _.unique = function(array, isSorted, iteratee, context) {\n    if (!_.isBoolean(isSorted)) {\n      context = iteratee;\n      iteratee = isSorted;\n      isSorted = false;\n    }\n    if (iteratee != null) iteratee = cb(iteratee, context);\n    var result = [];\n    var seen = [];\n    for (var i = 0, length = getLength(array); i < length; i++) {\n      var value = array[i],\n          computed = iteratee ? iteratee(value, i, array) : value;\n      if (isSorted) {\n        if (!i || seen !== computed) result.push(value);\n        seen = computed;\n      } else if (iteratee) {\n        if (!_.contains(seen, computed)) {\n          seen.push(computed);\n          result.push(value);\n        }\n      } else if (!_.contains(result, value)) {\n        result.push(value);\n      }\n    }\n    return result;\n  };\n\n  // Produce an array that contains the union: each distinct element from all of\n  // the passed-in arrays.\n  _.union = function() {\n    return _.uniq(flatten(arguments, true, true));\n  };\n\n  // Produce an array that contains every item shared between all the\n  // passed-in arrays.\n  _.intersection = function(array) {\n    var result = [];\n    var argsLength = arguments.length;\n    for (var i = 0, length = getLength(array); i < length; i++) {\n      var item = array[i];\n      if (_.contains(result, item)) continue;\n      for (var j = 1; j < argsLength; j++) {\n        if (!_.contains(arguments[j], item)) break;\n      }\n      if (j === argsLength) result.push(item);\n    }\n    return result;\n  };\n\n  // Take the difference between one array and a number of other arrays.\n  // Only the elements present in just the first array will remain.\n  _.difference = function(array) {\n    var rest = flatten(arguments, true, true, 1);\n    return _.filter(array, function(value){\n      return !_.contains(rest, value);\n    });\n  };\n\n  // Zip together multiple lists into a single array -- elements that share\n  // an index go together.\n  _.zip = function() {\n    return _.unzip(arguments);\n  };\n\n  // Complement of _.zip. Unzip accepts an array of arrays and groups\n  // each array's elements on shared indices\n  _.unzip = function(array) {\n    var length = array && _.max(array, getLength).length || 0;\n    var result = Array(length);\n\n    for (var index = 0; index < length; index++) {\n      result[index] = _.pluck(array, index);\n    }\n    return result;\n  };\n\n  // Converts lists into objects. Pass either a single array of `[key, value]`\n  // pairs, or two parallel arrays of the same length -- one of keys, and one of\n  // the corresponding values.\n  _.object = function(list, values) {\n    var result = {};\n    for (var i = 0, length = getLength(list); i < length; i++) {\n      if (values) {\n        result[list[i]] = values[i];\n      } else {\n        result[list[i][0]] = list[i][1];\n      }\n    }\n    return result;\n  };\n\n  // Generator function to create the findIndex and findLastIndex functions\n  function createPredicateIndexFinder(dir) {\n    return function(array, predicate, context) {\n      predicate = cb(predicate, context);\n      var length = getLength(array);\n      var index = dir > 0 ? 0 : length - 1;\n      for (; index >= 0 && index < length; index += dir) {\n        if (predicate(array[index], index, array)) return index;\n      }\n      return -1;\n    };\n  }\n\n  // Returns the first index on an array-like that passes a predicate test\n  _.findIndex = createPredicateIndexFinder(1);\n  _.findLastIndex = createPredicateIndexFinder(-1);\n\n  // Use a comparator function to figure out the smallest index at which\n  // an object should be inserted so as to maintain order. Uses binary search.\n  _.sortedIndex = function(array, obj, iteratee, context) {\n    iteratee = cb(iteratee, context, 1);\n    var value = iteratee(obj);\n    var low = 0, high = getLength(array);\n    while (low < high) {\n      var mid = Math.floor((low + high) / 2);\n      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n    }\n    return low;\n  };\n\n  // Generator function to create the indexOf and lastIndexOf functions\n  function createIndexFinder(dir, predicateFind, sortedIndex) {\n    return function(array, item, idx) {\n      var i = 0, length = getLength(array);\n      if (typeof idx == 'number') {\n        if (dir > 0) {\n            i = idx >= 0 ? idx : Math.max(idx + length, i);\n        } else {\n            length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n        }\n      } else if (sortedIndex && idx && length) {\n        idx = sortedIndex(array, item);\n        return array[idx] === item ? idx : -1;\n      }\n      if (item !== item) {\n        idx = predicateFind(slice.call(array, i, length), _.isNaN);\n        return idx >= 0 ? idx + i : -1;\n      }\n      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n        if (array[idx] === item) return idx;\n      }\n      return -1;\n    };\n  }\n\n  // Return the position of the first occurrence of an item in an array,\n  // or -1 if the item is not included in the array.\n  // If the array is large and already in sort order, pass `true`\n  // for **isSorted** to use binary search.\n  _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);\n  _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);\n\n  // Generate an integer Array containing an arithmetic progression. A port of\n  // the native Python `range()` function. See\n  // [the Python documentation](http://docs.python.org/library/functions.html#range).\n  _.range = function(start, stop, step) {\n    if (stop == null) {\n      stop = start || 0;\n      start = 0;\n    }\n    step = step || 1;\n\n    var length = Math.max(Math.ceil((stop - start) / step), 0);\n    var range = Array(length);\n\n    for (var idx = 0; idx < length; idx++, start += step) {\n      range[idx] = start;\n    }\n\n    return range;\n  };\n\n  // Function (ahem) Functions\n  // ------------------\n\n  // Determines whether to execute a function as a constructor\n  // or a normal function with the provided arguments\n  var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {\n    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n    var self = baseCreate(sourceFunc.prototype);\n    var result = sourceFunc.apply(self, args);\n    if (_.isObject(result)) return result;\n    return self;\n  };\n\n  // Create a function bound to a given object (assigning `this`, and arguments,\n  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n  // available.\n  _.bind = function(func, context) {\n    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');\n    var args = slice.call(arguments, 2);\n    var bound = function() {\n      return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));\n    };\n    return bound;\n  };\n\n  // Partially apply a function by creating a version that has had some of its\n  // arguments pre-filled, without changing its dynamic `this` context. _ acts\n  // as a placeholder, allowing any combination of arguments to be pre-filled.\n  _.partial = function(func) {\n    var boundArgs = slice.call(arguments, 1);\n    var bound = function() {\n      var position = 0, length = boundArgs.length;\n      var args = Array(length);\n      for (var i = 0; i < length; i++) {\n        args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];\n      }\n      while (position < arguments.length) args.push(arguments[position++]);\n      return executeBound(func, bound, this, this, args);\n    };\n    return bound;\n  };\n\n  // Bind a number of an object's methods to that object. Remaining arguments\n  // are the method names to be bound. Useful for ensuring that all callbacks\n  // defined on an object belong to it.\n  _.bindAll = function(obj) {\n    var i, length = arguments.length, key;\n    if (length <= 1) throw new Error('bindAll must be passed function names');\n    for (i = 1; i < length; i++) {\n      key = arguments[i];\n      obj[key] = _.bind(obj[key], obj);\n    }\n    return obj;\n  };\n\n  // Memoize an expensive function by storing its results.\n  _.memoize = function(func, hasher) {\n    var memoize = function(key) {\n      var cache = memoize.cache;\n      var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);\n      return cache[address];\n    };\n    memoize.cache = {};\n    return memoize;\n  };\n\n  // Delays a function for the given number of milliseconds, and then calls\n  // it with the arguments supplied.\n  _.delay = function(func, wait) {\n    var args = slice.call(arguments, 2);\n    return setTimeout(function(){\n      return func.apply(null, args);\n    }, wait);\n  };\n\n  // Defers a function, scheduling it to run after the current call stack has\n  // cleared.\n  _.defer = _.partial(_.delay, _, 1);\n\n  // Returns a function, that, when invoked, will only be triggered at most once\n  // during a given window of time. Normally, the throttled function will run\n  // as much as it can, without ever going more than once per `wait` duration;\n  // but if you'd like to disable the execution on the leading edge, pass\n  // `{leading: false}`. To disable execution on the trailing edge, ditto.\n  _.throttle = function(func, wait, options) {\n    var context, args, result;\n    var timeout = null;\n    var previous = 0;\n    if (!options) options = {};\n    var later = function() {\n      previous = options.leading === false ? 0 : _.now();\n      timeout = null;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    };\n    return function() {\n      var now = _.now();\n      if (!previous && options.leading === false) previous = now;\n      var remaining = wait - (now - previous);\n      context = this;\n      args = arguments;\n      if (remaining <= 0 || remaining > wait) {\n        if (timeout) {\n          clearTimeout(timeout);\n          timeout = null;\n        }\n        previous = now;\n        result = func.apply(context, args);\n        if (!timeout) context = args = null;\n      } else if (!timeout && options.trailing !== false) {\n        timeout = setTimeout(later, remaining);\n      }\n      return result;\n    };\n  };\n\n  // Returns a function, that, as long as it continues to be invoked, will not\n  // be triggered. The function will be called after it stops being called for\n  // N milliseconds. If `immediate` is passed, trigger the function on the\n  // leading edge, instead of the trailing.\n  _.debounce = function(func, wait, immediate) {\n    var timeout, args, context, timestamp, result;\n\n    var later = function() {\n      var last = _.now() - timestamp;\n\n      if (last < wait && last >= 0) {\n        timeout = setTimeout(later, wait - last);\n      } else {\n        timeout = null;\n        if (!immediate) {\n          result = func.apply(context, args);\n          if (!timeout) context = args = null;\n        }\n      }\n    };\n\n    return function() {\n      context = this;\n      args = arguments;\n      timestamp = _.now();\n      var callNow = immediate && !timeout;\n      if (!timeout) timeout = setTimeout(later, wait);\n      if (callNow) {\n        result = func.apply(context, args);\n        context = args = null;\n      }\n\n      return result;\n    };\n  };\n\n  // Returns the first function passed as an argument to the second,\n  // allowing you to adjust arguments, run code before and after, and\n  // conditionally execute the original function.\n  _.wrap = function(func, wrapper) {\n    return _.partial(wrapper, func);\n  };\n\n  // Returns a negated version of the passed-in predicate.\n  _.negate = function(predicate) {\n    return function() {\n      return !predicate.apply(this, arguments);\n    };\n  };\n\n  // Returns a function that is the composition of a list of functions, each\n  // consuming the return value of the function that follows.\n  _.compose = function() {\n    var args = arguments;\n    var start = args.length - 1;\n    return function() {\n      var i = start;\n      var result = args[start].apply(this, arguments);\n      while (i--) result = args[i].call(this, result);\n      return result;\n    };\n  };\n\n  // Returns a function that will only be executed on and after the Nth call.\n  _.after = function(times, func) {\n    return function() {\n      if (--times < 1) {\n        return func.apply(this, arguments);\n      }\n    };\n  };\n\n  // Returns a function that will only be executed up to (but not including) the Nth call.\n  _.before = function(times, func) {\n    var memo;\n    return function() {\n      if (--times > 0) {\n        memo = func.apply(this, arguments);\n      }\n      if (times <= 1) func = null;\n      return memo;\n    };\n  };\n\n  // Returns a function that will be executed at most one time, no matter how\n  // often you call it. Useful for lazy initialization.\n  _.once = _.partial(_.before, 2);\n\n  // Object Functions\n  // ----------------\n\n  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\n  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\n  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n                      'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\n  function collectNonEnumProps(obj, keys) {\n    var nonEnumIdx = nonEnumerableProps.length;\n    var constructor = obj.constructor;\n    var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;\n\n    // Constructor is a special case.\n    var prop = 'constructor';\n    if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);\n\n    while (nonEnumIdx--) {\n      prop = nonEnumerableProps[nonEnumIdx];\n      if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {\n        keys.push(prop);\n      }\n    }\n  }\n\n  // Retrieve the names of an object's own properties.\n  // Delegates to **ECMAScript 5**'s native `Object.keys`\n  _.keys = function(obj) {\n    if (!_.isObject(obj)) return [];\n    if (nativeKeys) return nativeKeys(obj);\n    var keys = [];\n    for (var key in obj) if (_.has(obj, key)) keys.push(key);\n    // Ahem, IE < 9.\n    if (hasEnumBug) collectNonEnumProps(obj, keys);\n    return keys;\n  };\n\n  // Retrieve all the property names of an object.\n  _.allKeys = function(obj) {\n    if (!_.isObject(obj)) return [];\n    var keys = [];\n    for (var key in obj) keys.push(key);\n    // Ahem, IE < 9.\n    if (hasEnumBug) collectNonEnumProps(obj, keys);\n    return keys;\n  };\n\n  // Retrieve the values of an object's properties.\n  _.values = function(obj) {\n    var keys = _.keys(obj);\n    var length = keys.length;\n    var values = Array(length);\n    for (var i = 0; i < length; i++) {\n      values[i] = obj[keys[i]];\n    }\n    return values;\n  };\n\n  // Returns the results of applying the iteratee to each element of the object\n  // In contrast to _.map it returns an object\n  _.mapObject = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    var keys =  _.keys(obj),\n          length = keys.length,\n          results = {},\n          currentKey;\n      for (var index = 0; index < length; index++) {\n        currentKey = keys[index];\n        results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n      }\n      return results;\n  };\n\n  // Convert an object into a list of `[key, value]` pairs.\n  _.pairs = function(obj) {\n    var keys = _.keys(obj);\n    var length = keys.length;\n    var pairs = Array(length);\n    for (var i = 0; i < length; i++) {\n      pairs[i] = [keys[i], obj[keys[i]]];\n    }\n    return pairs;\n  };\n\n  // Invert the keys and values of an object. The values must be serializable.\n  _.invert = function(obj) {\n    var result = {};\n    var keys = _.keys(obj);\n    for (var i = 0, length = keys.length; i < length; i++) {\n      result[obj[keys[i]]] = keys[i];\n    }\n    return result;\n  };\n\n  // Return a sorted list of the function names available on the object.\n  // Aliased as `methods`\n  _.functions = _.methods = function(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (_.isFunction(obj[key])) names.push(key);\n    }\n    return names.sort();\n  };\n\n  // Extend a given object with all the properties in passed-in object(s).\n  _.extend = createAssigner(_.allKeys);\n\n  // Assigns a given object with all the own properties in the passed-in object(s)\n  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\n  _.extendOwn = _.assign = createAssigner(_.keys);\n\n  // Returns the first key on an object that passes a predicate test\n  _.findKey = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = _.keys(obj), key;\n    for (var i = 0, length = keys.length; i < length; i++) {\n      key = keys[i];\n      if (predicate(obj[key], key, obj)) return key;\n    }\n  };\n\n  // Return a copy of the object only containing the whitelisted properties.\n  _.pick = function(object, oiteratee, context) {\n    var result = {}, obj = object, iteratee, keys;\n    if (obj == null) return result;\n    if (_.isFunction(oiteratee)) {\n      keys = _.allKeys(obj);\n      iteratee = optimizeCb(oiteratee, context);\n    } else {\n      keys = flatten(arguments, false, false, 1);\n      iteratee = function(value, key, obj) { return key in obj; };\n      obj = Object(obj);\n    }\n    for (var i = 0, length = keys.length; i < length; i++) {\n      var key = keys[i];\n      var value = obj[key];\n      if (iteratee(value, key, obj)) result[key] = value;\n    }\n    return result;\n  };\n\n   // Return a copy of the object without the blacklisted properties.\n  _.omit = function(obj, iteratee, context) {\n    if (_.isFunction(iteratee)) {\n      iteratee = _.negate(iteratee);\n    } else {\n      var keys = _.map(flatten(arguments, false, false, 1), String);\n      iteratee = function(value, key) {\n        return !_.contains(keys, key);\n      };\n    }\n    return _.pick(obj, iteratee, context);\n  };\n\n  // Fill in a given object with default properties.\n  _.defaults = createAssigner(_.allKeys, true);\n\n  // Creates an object that inherits from the given prototype object.\n  // If additional properties are provided then they will be added to the\n  // created object.\n  _.create = function(prototype, props) {\n    var result = baseCreate(prototype);\n    if (props) _.extendOwn(result, props);\n    return result;\n  };\n\n  // Create a (shallow-cloned) duplicate of an object.\n  _.clone = function(obj) {\n    if (!_.isObject(obj)) return obj;\n    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n  };\n\n  // Invokes interceptor with the obj, and then returns obj.\n  // The primary purpose of this method is to \"tap into\" a method chain, in\n  // order to perform operations on intermediate results within the chain.\n  _.tap = function(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  };\n\n  // Returns whether an object has a given set of `key:value` pairs.\n  _.isMatch = function(object, attrs) {\n    var keys = _.keys(attrs), length = keys.length;\n    if (object == null) return !length;\n    var obj = Object(object);\n    for (var i = 0; i < length; i++) {\n      var key = keys[i];\n      if (attrs[key] !== obj[key] || !(key in obj)) return false;\n    }\n    return true;\n  };\n\n\n  // Internal recursive comparison function for `isEqual`.\n  var eq = function(a, b, aStack, bStack) {\n    // Identical objects are equal. `0 === -0`, but they aren't identical.\n    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).\n    if (a === b) return a !== 0 || 1 / a === 1 / b;\n    // A strict comparison is necessary because `null == undefined`.\n    if (a == null || b == null) return a === b;\n    // Unwrap any wrapped objects.\n    if (a instanceof _) a = a._wrapped;\n    if (b instanceof _) b = b._wrapped;\n    // Compare `[[Class]]` names.\n    var className = toString.call(a);\n    if (className !== toString.call(b)) return false;\n    switch (className) {\n      // Strings, numbers, regular expressions, dates, and booleans are compared by value.\n      case '[object RegExp]':\n      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n      case '[object String]':\n        // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n        // equivalent to `new String(\"5\")`.\n        return '' + a === '' + b;\n      case '[object Number]':\n        // `NaN`s are equivalent, but non-reflexive.\n        // Object(NaN) is equivalent to NaN\n        if (+a !== +a) return +b !== +b;\n        // An `egal` comparison is performed for other numeric values.\n        return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n      case '[object Date]':\n      case '[object Boolean]':\n        // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n        // millisecond representations. Note that invalid dates with millisecond representations\n        // of `NaN` are not equivalent.\n        return +a === +b;\n    }\n\n    var areArrays = className === '[object Array]';\n    if (!areArrays) {\n      if (typeof a != 'object' || typeof b != 'object') return false;\n\n      // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n      // from different frames are.\n      var aCtor = a.constructor, bCtor = b.constructor;\n      if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&\n                               _.isFunction(bCtor) && bCtor instanceof bCtor)\n                          && ('constructor' in a && 'constructor' in b)) {\n        return false;\n      }\n    }\n    // Assume equality for cyclic structures. The algorithm for detecting cyclic\n    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n    // Initializing stack of traversed objects.\n    // It's done here since we only need them for objects and arrays comparison.\n    aStack = aStack || [];\n    bStack = bStack || [];\n    var length = aStack.length;\n    while (length--) {\n      // Linear search. Performance is inversely proportional to the number of\n      // unique nested structures.\n      if (aStack[length] === a) return bStack[length] === b;\n    }\n\n    // Add the first object to the stack of traversed objects.\n    aStack.push(a);\n    bStack.push(b);\n\n    // Recursively compare objects and arrays.\n    if (areArrays) {\n      // Compare array lengths to determine if a deep comparison is necessary.\n      length = a.length;\n      if (length !== b.length) return false;\n      // Deep compare the contents, ignoring non-numeric properties.\n      while (length--) {\n        if (!eq(a[length], b[length], aStack, bStack)) return false;\n      }\n    } else {\n      // Deep compare objects.\n      var keys = _.keys(a), key;\n      length = keys.length;\n      // Ensure that both objects contain the same number of properties before comparing deep equality.\n      if (_.keys(b).length !== length) return false;\n      while (length--) {\n        // Deep compare each member\n        key = keys[length];\n        if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n      }\n    }\n    // Remove the first object from the stack of traversed objects.\n    aStack.pop();\n    bStack.pop();\n    return true;\n  };\n\n  // Perform a deep comparison to check if two objects are equal.\n  _.isEqual = function(a, b) {\n    return eq(a, b);\n  };\n\n  // Is a given array, string, or object empty?\n  // An \"empty\" object has no enumerable own-properties.\n  _.isEmpty = function(obj) {\n    if (obj == null) return true;\n    if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;\n    return _.keys(obj).length === 0;\n  };\n\n  // Is a given value a DOM element?\n  _.isElement = function(obj) {\n    return !!(obj && obj.nodeType === 1);\n  };\n\n  // Is a given value an array?\n  // Delegates to ECMA5's native Array.isArray\n  _.isArray = nativeIsArray || function(obj) {\n    return toString.call(obj) === '[object Array]';\n  };\n\n  // Is a given variable an object?\n  _.isObject = function(obj) {\n    var type = typeof obj;\n    return type === 'function' || type === 'object' && !!obj;\n  };\n\n  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.\n  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {\n    _['is' + name] = function(obj) {\n      return toString.call(obj) === '[object ' + name + ']';\n    };\n  });\n\n  // Define a fallback version of the method in browsers (ahem, IE < 9), where\n  // there isn't any inspectable \"Arguments\" type.\n  if (!_.isArguments(arguments)) {\n    _.isArguments = function(obj) {\n      return _.has(obj, 'callee');\n    };\n  }\n\n  // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,\n  // IE 11 (#1621), and in Safari 8 (#1929).\n  if (typeof /./ != 'function' && typeof Int8Array != 'object') {\n    _.isFunction = function(obj) {\n      return typeof obj == 'function' || false;\n    };\n  }\n\n  // Is a given object a finite number?\n  _.isFinite = function(obj) {\n    return isFinite(obj) && !isNaN(parseFloat(obj));\n  };\n\n  // Is the given value `NaN`? (NaN is the only number which does not equal itself).\n  _.isNaN = function(obj) {\n    return _.isNumber(obj) && obj !== +obj;\n  };\n\n  // Is a given value a boolean?\n  _.isBoolean = function(obj) {\n    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n  };\n\n  // Is a given value equal to null?\n  _.isNull = function(obj) {\n    return obj === null;\n  };\n\n  // Is a given variable undefined?\n  _.isUndefined = function(obj) {\n    return obj === void 0;\n  };\n\n  // Shortcut function for checking if an object has a given property directly\n  // on itself (in other words, not on a prototype).\n  _.has = function(obj, key) {\n    return obj != null && hasOwnProperty.call(obj, key);\n  };\n\n  // Utility Functions\n  // -----------------\n\n  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\n  // previous owner. Returns a reference to the Underscore object.\n  _.noConflict = function() {\n    root._ = previousUnderscore;\n    return this;\n  };\n\n  // Keep the identity function around for default iteratees.\n  _.identity = function(value) {\n    return value;\n  };\n\n  // Predicate-generating functions. Often useful outside of Underscore.\n  _.constant = function(value) {\n    return function() {\n      return value;\n    };\n  };\n\n  _.noop = function(){};\n\n  _.property = property;\n\n  // Generates a function for a given object that returns a given property.\n  _.propertyOf = function(obj) {\n    return obj == null ? function(){} : function(key) {\n      return obj[key];\n    };\n  };\n\n  // Returns a predicate for checking whether an object has a given set of\n  // `key:value` pairs.\n  _.matcher = _.matches = function(attrs) {\n    attrs = _.extendOwn({}, attrs);\n    return function(obj) {\n      return _.isMatch(obj, attrs);\n    };\n  };\n\n  // Run a function **n** times.\n  _.times = function(n, iteratee, context) {\n    var accum = Array(Math.max(0, n));\n    iteratee = optimizeCb(iteratee, context, 1);\n    for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n    return accum;\n  };\n\n  // Return a random integer between min and max (inclusive).\n  _.random = function(min, max) {\n    if (max == null) {\n      max = min;\n      min = 0;\n    }\n    return min + Math.floor(Math.random() * (max - min + 1));\n  };\n\n  // A (possibly faster) way to get the current timestamp as an integer.\n  _.now = Date.now || function() {\n    return new Date().getTime();\n  };\n\n   // List of HTML entities for escaping.\n  var escapeMap = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#x27;',\n    '`': '&#x60;'\n  };\n  var unescapeMap = _.invert(escapeMap);\n\n  // Functions for escaping and unescaping strings to/from HTML interpolation.\n  var createEscaper = function(map) {\n    var escaper = function(match) {\n      return map[match];\n    };\n    // Regexes for identifying a key that needs to be escaped\n    var source = '(?:' + _.keys(map).join('|') + ')';\n    var testRegexp = RegExp(source);\n    var replaceRegexp = RegExp(source, 'g');\n    return function(string) {\n      string = string == null ? '' : '' + string;\n      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n    };\n  };\n  _.escape = createEscaper(escapeMap);\n  _.unescape = createEscaper(unescapeMap);\n\n  // If the value of the named `property` is a function then invoke it with the\n  // `object` as context; otherwise, return it.\n  _.result = function(object, property, fallback) {\n    var value = object == null ? void 0 : object[property];\n    if (value === void 0) {\n      value = fallback;\n    }\n    return _.isFunction(value) ? value.call(object) : value;\n  };\n\n  // Generate a unique integer id (unique within the entire client session).\n  // Useful for temporary DOM ids.\n  var idCounter = 0;\n  _.uniqueId = function(prefix) {\n    var id = ++idCounter + '';\n    return prefix ? prefix + id : id;\n  };\n\n  // By default, Underscore uses ERB-style template delimiters, change the\n  // following template settings to use alternative delimiters.\n  _.templateSettings = {\n    evaluate    : /<%([\\s\\S]+?)%>/g,\n    interpolate : /<%=([\\s\\S]+?)%>/g,\n    escape      : /<%-([\\s\\S]+?)%>/g\n  };\n\n  // When customizing `templateSettings`, if you don't want to define an\n  // interpolation, evaluation or escaping regex, we need one that is\n  // guaranteed not to match.\n  var noMatch = /(.)^/;\n\n  // Certain characters need to be escaped so that they can be put into a\n  // string literal.\n  var escapes = {\n    \"'\":      \"'\",\n    '\\\\':     '\\\\',\n    '\\r':     'r',\n    '\\n':     'n',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  var escaper = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\n  var escapeChar = function(match) {\n    return '\\\\' + escapes[match];\n  };\n\n  // JavaScript micro-templating, similar to John Resig's implementation.\n  // Underscore templating handles arbitrary delimiters, preserves whitespace,\n  // and correctly escapes quotes within interpolated code.\n  // NB: `oldSettings` only exists for backwards compatibility.\n  _.template = function(text, settings, oldSettings) {\n    if (!settings && oldSettings) settings = oldSettings;\n    settings = _.defaults({}, settings, _.templateSettings);\n\n    // Combine delimiters into one regular expression via alternation.\n    var matcher = RegExp([\n      (settings.escape || noMatch).source,\n      (settings.interpolate || noMatch).source,\n      (settings.evaluate || noMatch).source\n    ].join('|') + '|$', 'g');\n\n    // Compile the template source, escaping string literals appropriately.\n    var index = 0;\n    var source = \"__p+='\";\n    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n      source += text.slice(index, offset).replace(escaper, escapeChar);\n      index = offset + match.length;\n\n      if (escape) {\n        source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n      } else if (interpolate) {\n        source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n      } else if (evaluate) {\n        source += \"';\\n\" + evaluate + \"\\n__p+='\";\n      }\n\n      // Adobe VMs need the match returned to produce the correct offest.\n      return match;\n    });\n    source += \"';\\n\";\n\n    // If a variable is not specified, place data values in local scope.\n    if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n    source = \"var __t,__p='',__j=Array.prototype.join,\" +\n      \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n      source + 'return __p;\\n';\n\n    try {\n      var render = new Function(settings.variable || 'obj', '_', source);\n    } catch (e) {\n      e.source = source;\n      throw e;\n    }\n\n    var template = function(data) {\n      return render.call(this, data, _);\n    };\n\n    // Provide the compiled source as a convenience for precompilation.\n    var argument = settings.variable || 'obj';\n    template.source = 'function(' + argument + '){\\n' + source + '}';\n\n    return template;\n  };\n\n  // Add a \"chain\" function. Start chaining a wrapped Underscore object.\n  _.chain = function(obj) {\n    var instance = _(obj);\n    instance._chain = true;\n    return instance;\n  };\n\n  // OOP\n  // ---------------\n  // If Underscore is called as a function, it returns a wrapped object that\n  // can be used OO-style. This wrapper holds altered versions of all the\n  // underscore functions. Wrapped objects may be chained.\n\n  // Helper function to continue chaining intermediate results.\n  var result = function(instance, obj) {\n    return instance._chain ? _(obj).chain() : obj;\n  };\n\n  // Add your own custom functions to the Underscore object.\n  _.mixin = function(obj) {\n    _.each(_.functions(obj), function(name) {\n      var func = _[name] = obj[name];\n      _.prototype[name] = function() {\n        var args = [this._wrapped];\n        push.apply(args, arguments);\n        return result(this, func.apply(_, args));\n      };\n    });\n  };\n\n  // Add all of the Underscore functions to the wrapper object.\n  _.mixin(_);\n\n  // Add all mutator Array functions to the wrapper.\n  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      var obj = this._wrapped;\n      method.apply(obj, arguments);\n      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];\n      return result(this, obj);\n    };\n  });\n\n  // Add all accessor Array functions to the wrapper.\n  _.each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      return result(this, method.apply(this._wrapped, arguments));\n    };\n  });\n\n  // Extracts the result from a wrapped and chained object.\n  _.prototype.value = function() {\n    return this._wrapped;\n  };\n\n  // Provide unwrapping proxy for some methods used in engine operations\n  // such as arithmetic and JSON stringification.\n  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;\n\n  _.prototype.toString = function() {\n    return '' + this._wrapped;\n  };\n\n  // AMD registration happens at the end for compatibility with AMD loaders\n  // that may not enforce next-turn semantics on modules. Even though general\n  // practice for AMD registration is to be anonymous, underscore registers\n  // as a named module because, like jQuery, it is a base library that is\n  // popular enough to be bundled in a third party lib, but not be part of\n  // an AMD load request. Those cases could generate an error when an\n  // anonymous define() is called outside of a loader request.\n  if (typeof define === 'function' && define.amd) {\n    define('underscore', [], function() {\n      return _;\n    });\n  }\n}.call(this));\n\n},{}],154:[function(require,module,exports){\n(function (global){\n\n/**\n * Module exports.\n */\n\nmodule.exports = deprecate;\n\n/**\n * Mark that a method should not be used.\n * Returns a modified function which warns once by default.\n *\n * If `localStorage.noDeprecation = true` is set, then it is a no-op.\n *\n * If `localStorage.throwDeprecation = true` is set, then deprecated functions\n * will throw an Error when invoked.\n *\n * If `localStorage.traceDeprecation = true` is set, then deprecated functions\n * will invoke `console.trace()` instead of `console.error()`.\n *\n * @param {Function} fn - the function to deprecate\n * @param {String} msg - the string to print to the console when `fn` is invoked\n * @returns {Function} a new \"deprecated\" version of `fn`\n * @api public\n */\n\nfunction deprecate (fn, msg) {\n  if (config('noDeprecation')) {\n    return fn;\n  }\n\n  var warned = false;\n  function deprecated() {\n    if (!warned) {\n      if (config('throwDeprecation')) {\n        throw new Error(msg);\n      } else if (config('traceDeprecation')) {\n        console.trace(msg);\n      } else {\n        console.warn(msg);\n      }\n      warned = true;\n    }\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n}\n\n/**\n * Checks `localStorage` for boolean values for the given `name`.\n *\n * @param {String} name\n * @returns {Boolean}\n * @api private\n */\n\nfunction config (name) {\n  // accessing global.localStorage can trigger a DOMException in sandboxed iframes\n  try {\n    if (!global.localStorage) return false;\n  } catch (_) {\n    return false;\n  }\n  var val = global.localStorage[name];\n  if (null == val) return false;\n  return String(val).toLowerCase() === 'true';\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],155:[function(require,module,exports){\narguments[4][81][0].apply(exports,arguments)\n},{\"dup\":81}],156:[function(require,module,exports){\nmodule.exports = function isBuffer(arg) {\n  return arg && typeof arg === 'object'\n    && typeof arg.copy === 'function'\n    && typeof arg.fill === 'function'\n    && typeof arg.readUInt8 === 'function';\n}\n},{}],157:[function(require,module,exports){\n(function (process,global){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n  if (!isString(f)) {\n    var objects = [];\n    for (var i = 0; i < arguments.length; i++) {\n      objects.push(inspect(arguments[i]));\n    }\n    return objects.join(' ');\n  }\n\n  var i = 1;\n  var args = arguments;\n  var len = args.length;\n  var str = String(f).replace(formatRegExp, function(x) {\n    if (x === '%%') return '%';\n    if (i >= len) return x;\n    switch (x) {\n      case '%s': return String(args[i++]);\n      case '%d': return Number(args[i++]);\n      case '%j':\n        try {\n          return JSON.stringify(args[i++]);\n        } catch (_) {\n          return '[Circular]';\n        }\n      default:\n        return x;\n    }\n  });\n  for (var x = args[i]; i < len; x = args[++i]) {\n    if (isNull(x) || !isObject(x)) {\n      str += ' ' + x;\n    } else {\n      str += ' ' + inspect(x);\n    }\n  }\n  return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n  // Allow for deprecating things in the process of starting up.\n  if (isUndefined(global.process)) {\n    return function() {\n      return exports.deprecate(fn, msg).apply(this, arguments);\n    };\n  }\n\n  if (process.noDeprecation === true) {\n    return fn;\n  }\n\n  var warned = false;\n  function deprecated() {\n    if (!warned) {\n      if (process.throwDeprecation) {\n        throw new Error(msg);\n      } else if (process.traceDeprecation) {\n        console.trace(msg);\n      } else {\n        console.error(msg);\n      }\n      warned = true;\n    }\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n  if (isUndefined(debugEnviron))\n    debugEnviron = process.env.NODE_DEBUG || '';\n  set = set.toUpperCase();\n  if (!debugs[set]) {\n    if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n      var pid = process.pid;\n      debugs[set] = function() {\n        var msg = exports.format.apply(exports, arguments);\n        console.error('%s %d: %s', set, pid, msg);\n      };\n    } else {\n      debugs[set] = function() {};\n    }\n  }\n  return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n  // default options\n  var ctx = {\n    seen: [],\n    stylize: stylizeNoColor\n  };\n  // legacy...\n  if (arguments.length >= 3) ctx.depth = arguments[2];\n  if (arguments.length >= 4) ctx.colors = arguments[3];\n  if (isBoolean(opts)) {\n    // legacy...\n    ctx.showHidden = opts;\n  } else if (opts) {\n    // got an \"options\" object\n    exports._extend(ctx, opts);\n  }\n  // set default options\n  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n  if (isUndefined(ctx.depth)) ctx.depth = 2;\n  if (isUndefined(ctx.colors)) ctx.colors = false;\n  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n  if (ctx.colors) ctx.stylize = stylizeWithColor;\n  return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n  'bold' : [1, 22],\n  'italic' : [3, 23],\n  'underline' : [4, 24],\n  'inverse' : [7, 27],\n  'white' : [37, 39],\n  'grey' : [90, 39],\n  'black' : [30, 39],\n  'blue' : [34, 39],\n  'cyan' : [36, 39],\n  'green' : [32, 39],\n  'magenta' : [35, 39],\n  'red' : [31, 39],\n  'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n  'special': 'cyan',\n  'number': 'yellow',\n  'boolean': 'yellow',\n  'undefined': 'grey',\n  'null': 'bold',\n  'string': 'green',\n  'date': 'magenta',\n  // \"name\": intentionally not styling\n  'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n  var style = inspect.styles[styleType];\n\n  if (style) {\n    return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n           '\\u001b[' + inspect.colors[style][1] + 'm';\n  } else {\n    return str;\n  }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n  return str;\n}\n\n\nfunction arrayToHash(array) {\n  var hash = {};\n\n  array.forEach(function(val, idx) {\n    hash[val] = true;\n  });\n\n  return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n  // Provide a hook for user-specified inspect functions.\n  // Check that value is an object with an inspect function on it\n  if (ctx.customInspect &&\n      value &&\n      isFunction(value.inspect) &&\n      // Filter out the util module, it's inspect function is special\n      value.inspect !== exports.inspect &&\n      // Also filter out any prototype objects using the circular check.\n      !(value.constructor && value.constructor.prototype === value)) {\n    var ret = value.inspect(recurseTimes, ctx);\n    if (!isString(ret)) {\n      ret = formatValue(ctx, ret, recurseTimes);\n    }\n    return ret;\n  }\n\n  // Primitive types cannot have properties\n  var primitive = formatPrimitive(ctx, value);\n  if (primitive) {\n    return primitive;\n  }\n\n  // Look up the keys of the object.\n  var keys = Object.keys(value);\n  var visibleKeys = arrayToHash(keys);\n\n  if (ctx.showHidden) {\n    keys = Object.getOwnPropertyNames(value);\n  }\n\n  // IE doesn't make error fields non-enumerable\n  // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n  if (isError(value)\n      && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n    return formatError(value);\n  }\n\n  // Some type of object without properties can be shortcutted.\n  if (keys.length === 0) {\n    if (isFunction(value)) {\n      var name = value.name ? ': ' + value.name : '';\n      return ctx.stylize('[Function' + name + ']', 'special');\n    }\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    }\n    if (isDate(value)) {\n      return ctx.stylize(Date.prototype.toString.call(value), 'date');\n    }\n    if (isError(value)) {\n      return formatError(value);\n    }\n  }\n\n  var base = '', array = false, braces = ['{', '}'];\n\n  // Make Array say that they are Array\n  if (isArray(value)) {\n    array = true;\n    braces = ['[', ']'];\n  }\n\n  // Make functions say that they are functions\n  if (isFunction(value)) {\n    var n = value.name ? ': ' + value.name : '';\n    base = ' [Function' + n + ']';\n  }\n\n  // Make RegExps say that they are RegExps\n  if (isRegExp(value)) {\n    base = ' ' + RegExp.prototype.toString.call(value);\n  }\n\n  // Make dates with properties first say the date\n  if (isDate(value)) {\n    base = ' ' + Date.prototype.toUTCString.call(value);\n  }\n\n  // Make error with message first say the error\n  if (isError(value)) {\n    base = ' ' + formatError(value);\n  }\n\n  if (keys.length === 0 && (!array || value.length == 0)) {\n    return braces[0] + base + braces[1];\n  }\n\n  if (recurseTimes < 0) {\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    } else {\n      return ctx.stylize('[Object]', 'special');\n    }\n  }\n\n  ctx.seen.push(value);\n\n  var output;\n  if (array) {\n    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n  } else {\n    output = keys.map(function(key) {\n      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n    });\n  }\n\n  ctx.seen.pop();\n\n  return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n  if (isUndefined(value))\n    return ctx.stylize('undefined', 'undefined');\n  if (isString(value)) {\n    var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n                                             .replace(/'/g, \"\\\\'\")\n                                             .replace(/\\\\\"/g, '\"') + '\\'';\n    return ctx.stylize(simple, 'string');\n  }\n  if (isNumber(value))\n    return ctx.stylize('' + value, 'number');\n  if (isBoolean(value))\n    return ctx.stylize('' + value, 'boolean');\n  // For some reason typeof null is \"object\", so special case here.\n  if (isNull(value))\n    return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n  return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n  var output = [];\n  for (var i = 0, l = value.length; i < l; ++i) {\n    if (hasOwnProperty(value, String(i))) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          String(i), true));\n    } else {\n      output.push('');\n    }\n  }\n  keys.forEach(function(key) {\n    if (!key.match(/^\\d+$/)) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          key, true));\n    }\n  });\n  return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n  var name, str, desc;\n  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n  if (desc.get) {\n    if (desc.set) {\n      str = ctx.stylize('[Getter/Setter]', 'special');\n    } else {\n      str = ctx.stylize('[Getter]', 'special');\n    }\n  } else {\n    if (desc.set) {\n      str = ctx.stylize('[Setter]', 'special');\n    }\n  }\n  if (!hasOwnProperty(visibleKeys, key)) {\n    name = '[' + key + ']';\n  }\n  if (!str) {\n    if (ctx.seen.indexOf(desc.value) < 0) {\n      if (isNull(recurseTimes)) {\n        str = formatValue(ctx, desc.value, null);\n      } else {\n        str = formatValue(ctx, desc.value, recurseTimes - 1);\n      }\n      if (str.indexOf('\\n') > -1) {\n        if (array) {\n          str = str.split('\\n').map(function(line) {\n            return '  ' + line;\n          }).join('\\n').substr(2);\n        } else {\n          str = '\\n' + str.split('\\n').map(function(line) {\n            return '   ' + line;\n          }).join('\\n');\n        }\n      }\n    } else {\n      str = ctx.stylize('[Circular]', 'special');\n    }\n  }\n  if (isUndefined(name)) {\n    if (array && key.match(/^\\d+$/)) {\n      return str;\n    }\n    name = JSON.stringify('' + key);\n    if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n      name = name.substr(1, name.length - 2);\n      name = ctx.stylize(name, 'name');\n    } else {\n      name = name.replace(/'/g, \"\\\\'\")\n                 .replace(/\\\\\"/g, '\"')\n                 .replace(/(^\"|\"$)/g, \"'\");\n      name = ctx.stylize(name, 'string');\n    }\n  }\n\n  return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n  var numLinesEst = 0;\n  var length = output.reduce(function(prev, cur) {\n    numLinesEst++;\n    if (cur.indexOf('\\n') >= 0) numLinesEst++;\n    return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n  }, 0);\n\n  if (length > 60) {\n    return braces[0] +\n           (base === '' ? '' : base + '\\n ') +\n           ' ' +\n           output.join(',\\n  ') +\n           ' ' +\n           braces[1];\n  }\n\n  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n  return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return isObject(e) &&\n      (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null ||\n         typeof arg === 'boolean' ||\n         typeof arg === 'number' ||\n         typeof arg === 'string' ||\n         typeof arg === 'symbol' ||  // ES6 symbol\n         typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n  return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n              'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n  var d = new Date();\n  var time = [pad(d.getHours()),\n              pad(d.getMinutes()),\n              pad(d.getSeconds())].join(':');\n  return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n *     prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n  // Don't do anything if add isn't an object\n  if (!add || !isObject(add)) return origin;\n\n  var keys = Object.keys(add);\n  var i = keys.length;\n  while (i--) {\n    origin[keys[i]] = add[keys[i]];\n  }\n  return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./support/isBuffer\":156,\"_process\":138,\"inherits\":155}],158:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var assign, getValue, isArray, isEmpty, isFunction, isObject, isPlainObject,\n    slice = [].slice,\n    hasProp = {}.hasOwnProperty;\n\n  assign = function() {\n    var i, key, len, source, sources, target;\n    target = arguments[0], sources = 2 <= arguments.length ? slice.call(arguments, 1) : [];\n    if (isFunction(Object.assign)) {\n      Object.assign.apply(null, arguments);\n    } else {\n      for (i = 0, len = sources.length; i < len; i++) {\n        source = sources[i];\n        if (source != null) {\n          for (key in source) {\n            if (!hasProp.call(source, key)) continue;\n            target[key] = source[key];\n          }\n        }\n      }\n    }\n    return target;\n  };\n\n  isFunction = function(val) {\n    return !!val && Object.prototype.toString.call(val) === '[object Function]';\n  };\n\n  isObject = function(val) {\n    var ref;\n    return !!val && ((ref = typeof val) === 'function' || ref === 'object');\n  };\n\n  isArray = function(val) {\n    if (isFunction(Array.isArray)) {\n      return Array.isArray(val);\n    } else {\n      return Object.prototype.toString.call(val) === '[object Array]';\n    }\n  };\n\n  isEmpty = function(val) {\n    var key;\n    if (isArray(val)) {\n      return !val.length;\n    } else {\n      for (key in val) {\n        if (!hasProp.call(val, key)) continue;\n        return false;\n      }\n      return true;\n    }\n  };\n\n  isPlainObject = function(val) {\n    var ctor, proto;\n    return isObject(val) && (proto = Object.getPrototypeOf(val)) && (ctor = proto.constructor) && (typeof ctor === 'function') && (ctor instanceof ctor) && (Function.prototype.toString.call(ctor) === Function.prototype.toString.call(Object));\n  };\n\n  getValue = function(obj) {\n    if (isFunction(obj.valueOf)) {\n      return obj.valueOf();\n    } else {\n      return obj;\n    }\n  };\n\n  module.exports.assign = assign;\n\n  module.exports.isFunction = isFunction;\n\n  module.exports.isObject = isObject;\n\n  module.exports.isArray = isArray;\n\n  module.exports.isEmpty = isEmpty;\n\n  module.exports.isPlainObject = isPlainObject;\n\n  module.exports.getValue = getValue;\n\n}).call(this);\n\n},{}],159:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLAttribute;\n\n  module.exports = XMLAttribute = (function() {\n    function XMLAttribute(parent, name, value) {\n      this.options = parent.options;\n      this.stringify = parent.stringify;\n      this.parent = parent;\n      if (name == null) {\n        throw new Error(\"Missing attribute name. \" + this.debugInfo(name));\n      }\n      if (value == null) {\n        throw new Error(\"Missing attribute value. \" + this.debugInfo(name));\n      }\n      this.name = this.stringify.attName(name);\n      this.value = this.stringify.attValue(value);\n    }\n\n    XMLAttribute.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLAttribute.prototype.toString = function(options) {\n      return this.options.writer.set(options).attribute(this);\n    };\n\n    XMLAttribute.prototype.debugInfo = function(name) {\n      var ref, ref1;\n      name = name || this.name;\n      if ((name == null) && !((ref = this.parent) != null ? ref.name : void 0)) {\n        return \"\";\n      } else if (name == null) {\n        return \"parent: <\" + this.parent.name + \">\";\n      } else if (!((ref1 = this.parent) != null ? ref1.name : void 0)) {\n        return \"attribute: {\" + name + \"}\";\n      } else {\n        return \"attribute: {\" + name + \"}, parent: <\" + this.parent.name + \">\";\n      }\n    };\n\n    return XMLAttribute;\n\n  })();\n\n}).call(this);\n\n},{}],160:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLCData, XMLNode,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLCData = (function(superClass) {\n    extend(XMLCData, superClass);\n\n    function XMLCData(parent, text) {\n      XMLCData.__super__.constructor.call(this, parent);\n      if (text == null) {\n        throw new Error(\"Missing CDATA text. \" + this.debugInfo());\n      }\n      this.text = this.stringify.cdata(text);\n    }\n\n    XMLCData.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLCData.prototype.toString = function(options) {\n      return this.options.writer.set(options).cdata(this);\n    };\n\n    return XMLCData;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],161:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLComment, XMLNode,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLComment = (function(superClass) {\n    extend(XMLComment, superClass);\n\n    function XMLComment(parent, text) {\n      XMLComment.__super__.constructor.call(this, parent);\n      if (text == null) {\n        throw new Error(\"Missing comment text. \" + this.debugInfo());\n      }\n      this.text = this.stringify.comment(text);\n    }\n\n    XMLComment.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLComment.prototype.toString = function(options) {\n      return this.options.writer.set(options).comment(this);\n    };\n\n    return XMLComment;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],162:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDTDAttList, XMLNode,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLDTDAttList = (function(superClass) {\n    extend(XMLDTDAttList, superClass);\n\n    function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) {\n      XMLDTDAttList.__super__.constructor.call(this, parent);\n      if (elementName == null) {\n        throw new Error(\"Missing DTD element name. \" + this.debugInfo());\n      }\n      if (attributeName == null) {\n        throw new Error(\"Missing DTD attribute name. \" + this.debugInfo(elementName));\n      }\n      if (!attributeType) {\n        throw new Error(\"Missing DTD attribute type. \" + this.debugInfo(elementName));\n      }\n      if (!defaultValueType) {\n        throw new Error(\"Missing DTD attribute default. \" + this.debugInfo(elementName));\n      }\n      if (defaultValueType.indexOf('#') !== 0) {\n        defaultValueType = '#' + defaultValueType;\n      }\n      if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) {\n        throw new Error(\"Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT. \" + this.debugInfo(elementName));\n      }\n      if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) {\n        throw new Error(\"Default value only applies to #FIXED or #DEFAULT. \" + this.debugInfo(elementName));\n      }\n      this.elementName = this.stringify.eleName(elementName);\n      this.attributeName = this.stringify.attName(attributeName);\n      this.attributeType = this.stringify.dtdAttType(attributeType);\n      this.defaultValue = this.stringify.dtdAttDefault(defaultValue);\n      this.defaultValueType = defaultValueType;\n    }\n\n    XMLDTDAttList.prototype.toString = function(options) {\n      return this.options.writer.set(options).dtdAttList(this);\n    };\n\n    return XMLDTDAttList;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],163:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDTDElement, XMLNode,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLDTDElement = (function(superClass) {\n    extend(XMLDTDElement, superClass);\n\n    function XMLDTDElement(parent, name, value) {\n      XMLDTDElement.__super__.constructor.call(this, parent);\n      if (name == null) {\n        throw new Error(\"Missing DTD element name. \" + this.debugInfo());\n      }\n      if (!value) {\n        value = '(#PCDATA)';\n      }\n      if (Array.isArray(value)) {\n        value = '(' + value.join(',') + ')';\n      }\n      this.name = this.stringify.eleName(name);\n      this.value = this.stringify.dtdElementValue(value);\n    }\n\n    XMLDTDElement.prototype.toString = function(options) {\n      return this.options.writer.set(options).dtdElement(this);\n    };\n\n    return XMLDTDElement;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],164:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDTDEntity, XMLNode, isObject,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  isObject = require('./Utility').isObject;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLDTDEntity = (function(superClass) {\n    extend(XMLDTDEntity, superClass);\n\n    function XMLDTDEntity(parent, pe, name, value) {\n      XMLDTDEntity.__super__.constructor.call(this, parent);\n      if (name == null) {\n        throw new Error(\"Missing DTD entity name. \" + this.debugInfo(name));\n      }\n      if (value == null) {\n        throw new Error(\"Missing DTD entity value. \" + this.debugInfo(name));\n      }\n      this.pe = !!pe;\n      this.name = this.stringify.eleName(name);\n      if (!isObject(value)) {\n        this.value = this.stringify.dtdEntityValue(value);\n      } else {\n        if (!value.pubID && !value.sysID) {\n          throw new Error(\"Public and/or system identifiers are required for an external entity. \" + this.debugInfo(name));\n        }\n        if (value.pubID && !value.sysID) {\n          throw new Error(\"System identifier is required for a public external entity. \" + this.debugInfo(name));\n        }\n        if (value.pubID != null) {\n          this.pubID = this.stringify.dtdPubID(value.pubID);\n        }\n        if (value.sysID != null) {\n          this.sysID = this.stringify.dtdSysID(value.sysID);\n        }\n        if (value.nData != null) {\n          this.nData = this.stringify.dtdNData(value.nData);\n        }\n        if (this.pe && this.nData) {\n          throw new Error(\"Notation declaration is not allowed in a parameter entity. \" + this.debugInfo(name));\n        }\n      }\n    }\n\n    XMLDTDEntity.prototype.toString = function(options) {\n      return this.options.writer.set(options).dtdEntity(this);\n    };\n\n    return XMLDTDEntity;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLNode\":171}],165:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDTDNotation, XMLNode,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLDTDNotation = (function(superClass) {\n    extend(XMLDTDNotation, superClass);\n\n    function XMLDTDNotation(parent, name, value) {\n      XMLDTDNotation.__super__.constructor.call(this, parent);\n      if (name == null) {\n        throw new Error(\"Missing DTD notation name. \" + this.debugInfo(name));\n      }\n      if (!value.pubID && !value.sysID) {\n        throw new Error(\"Public or system identifiers are required for an external entity. \" + this.debugInfo(name));\n      }\n      this.name = this.stringify.eleName(name);\n      if (value.pubID != null) {\n        this.pubID = this.stringify.dtdPubID(value.pubID);\n      }\n      if (value.sysID != null) {\n        this.sysID = this.stringify.dtdSysID(value.sysID);\n      }\n    }\n\n    XMLDTDNotation.prototype.toString = function(options) {\n      return this.options.writer.set(options).dtdNotation(this);\n    };\n\n    return XMLDTDNotation;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],166:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDeclaration, XMLNode, isObject,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  isObject = require('./Utility').isObject;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLDeclaration = (function(superClass) {\n    extend(XMLDeclaration, superClass);\n\n    function XMLDeclaration(parent, version, encoding, standalone) {\n      var ref;\n      XMLDeclaration.__super__.constructor.call(this, parent);\n      if (isObject(version)) {\n        ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone;\n      }\n      if (!version) {\n        version = '1.0';\n      }\n      this.version = this.stringify.xmlVersion(version);\n      if (encoding != null) {\n        this.encoding = this.stringify.xmlEncoding(encoding);\n      }\n      if (standalone != null) {\n        this.standalone = this.stringify.xmlStandalone(standalone);\n      }\n    }\n\n    XMLDeclaration.prototype.toString = function(options) {\n      return this.options.writer.set(options).declaration(this);\n    };\n\n    return XMLDeclaration;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLNode\":171}],167:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLNode, isObject,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  isObject = require('./Utility').isObject;\n\n  XMLNode = require('./XMLNode');\n\n  XMLDTDAttList = require('./XMLDTDAttList');\n\n  XMLDTDEntity = require('./XMLDTDEntity');\n\n  XMLDTDElement = require('./XMLDTDElement');\n\n  XMLDTDNotation = require('./XMLDTDNotation');\n\n  module.exports = XMLDocType = (function(superClass) {\n    extend(XMLDocType, superClass);\n\n    function XMLDocType(parent, pubID, sysID) {\n      var ref, ref1;\n      XMLDocType.__super__.constructor.call(this, parent);\n      this.name = \"!DOCTYPE\";\n      this.documentObject = parent;\n      if (isObject(pubID)) {\n        ref = pubID, pubID = ref.pubID, sysID = ref.sysID;\n      }\n      if (sysID == null) {\n        ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1];\n      }\n      if (pubID != null) {\n        this.pubID = this.stringify.dtdPubID(pubID);\n      }\n      if (sysID != null) {\n        this.sysID = this.stringify.dtdSysID(sysID);\n      }\n    }\n\n    XMLDocType.prototype.element = function(name, value) {\n      var child;\n      child = new XMLDTDElement(this, name, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {\n      var child;\n      child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLDocType.prototype.entity = function(name, value) {\n      var child;\n      child = new XMLDTDEntity(this, false, name, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLDocType.prototype.pEntity = function(name, value) {\n      var child;\n      child = new XMLDTDEntity(this, true, name, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLDocType.prototype.notation = function(name, value) {\n      var child;\n      child = new XMLDTDNotation(this, name, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLDocType.prototype.toString = function(options) {\n      return this.options.writer.set(options).docType(this);\n    };\n\n    XMLDocType.prototype.ele = function(name, value) {\n      return this.element(name, value);\n    };\n\n    XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {\n      return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue);\n    };\n\n    XMLDocType.prototype.ent = function(name, value) {\n      return this.entity(name, value);\n    };\n\n    XMLDocType.prototype.pent = function(name, value) {\n      return this.pEntity(name, value);\n    };\n\n    XMLDocType.prototype.not = function(name, value) {\n      return this.notation(name, value);\n    };\n\n    XMLDocType.prototype.up = function() {\n      return this.root() || this.documentObject;\n    };\n\n    return XMLDocType;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLDTDAttList\":162,\"./XMLDTDElement\":163,\"./XMLDTDEntity\":164,\"./XMLDTDNotation\":165,\"./XMLNode\":171}],168:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDocument, XMLNode, XMLStringWriter, XMLStringifier, isPlainObject,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  isPlainObject = require('./Utility').isPlainObject;\n\n  XMLNode = require('./XMLNode');\n\n  XMLStringifier = require('./XMLStringifier');\n\n  XMLStringWriter = require('./XMLStringWriter');\n\n  module.exports = XMLDocument = (function(superClass) {\n    extend(XMLDocument, superClass);\n\n    function XMLDocument(options) {\n      XMLDocument.__super__.constructor.call(this, null);\n      this.name = \"?xml\";\n      options || (options = {});\n      if (!options.writer) {\n        options.writer = new XMLStringWriter();\n      }\n      this.options = options;\n      this.stringify = new XMLStringifier(options);\n      this.isDocument = true;\n    }\n\n    XMLDocument.prototype.end = function(writer) {\n      var writerOptions;\n      if (!writer) {\n        writer = this.options.writer;\n      } else if (isPlainObject(writer)) {\n        writerOptions = writer;\n        writer = this.options.writer.set(writerOptions);\n      }\n      return writer.document(this);\n    };\n\n    XMLDocument.prototype.toString = function(options) {\n      return this.options.writer.set(options).document(this);\n    };\n\n    return XMLDocument;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLNode\":171,\"./XMLStringWriter\":175,\"./XMLStringifier\":176}],169:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLAttribute, XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLDocumentCB, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLStringifier, XMLText, getValue, isFunction, isObject, isPlainObject, ref,\n    hasProp = {}.hasOwnProperty;\n\n  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isPlainObject = ref.isPlainObject, getValue = ref.getValue;\n\n  XMLElement = require('./XMLElement');\n\n  XMLCData = require('./XMLCData');\n\n  XMLComment = require('./XMLComment');\n\n  XMLRaw = require('./XMLRaw');\n\n  XMLText = require('./XMLText');\n\n  XMLProcessingInstruction = require('./XMLProcessingInstruction');\n\n  XMLDeclaration = require('./XMLDeclaration');\n\n  XMLDocType = require('./XMLDocType');\n\n  XMLDTDAttList = require('./XMLDTDAttList');\n\n  XMLDTDEntity = require('./XMLDTDEntity');\n\n  XMLDTDElement = require('./XMLDTDElement');\n\n  XMLDTDNotation = require('./XMLDTDNotation');\n\n  XMLAttribute = require('./XMLAttribute');\n\n  XMLStringifier = require('./XMLStringifier');\n\n  XMLStringWriter = require('./XMLStringWriter');\n\n  module.exports = XMLDocumentCB = (function() {\n    function XMLDocumentCB(options, onData, onEnd) {\n      var writerOptions;\n      this.name = \"?xml\";\n      options || (options = {});\n      if (!options.writer) {\n        options.writer = new XMLStringWriter(options);\n      } else if (isPlainObject(options.writer)) {\n        writerOptions = options.writer;\n        options.writer = new XMLStringWriter(writerOptions);\n      }\n      this.options = options;\n      this.writer = options.writer;\n      this.stringify = new XMLStringifier(options);\n      this.onDataCallback = onData || function() {};\n      this.onEndCallback = onEnd || function() {};\n      this.currentNode = null;\n      this.currentLevel = -1;\n      this.openTags = {};\n      this.documentStarted = false;\n      this.documentCompleted = false;\n      this.root = null;\n    }\n\n    XMLDocumentCB.prototype.node = function(name, attributes, text) {\n      var ref1;\n      if (name == null) {\n        throw new Error(\"Missing node name.\");\n      }\n      if (this.root && this.currentLevel === -1) {\n        throw new Error(\"Document can only have one root node. \" + this.debugInfo(name));\n      }\n      this.openCurrent();\n      name = getValue(name);\n      if (attributes == null) {\n        attributes = {};\n      }\n      attributes = getValue(attributes);\n      if (!isObject(attributes)) {\n        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];\n      }\n      this.currentNode = new XMLElement(this, name, attributes);\n      this.currentNode.children = false;\n      this.currentLevel++;\n      this.openTags[this.currentLevel] = this.currentNode;\n      if (text != null) {\n        this.text(text);\n      }\n      return this;\n    };\n\n    XMLDocumentCB.prototype.element = function(name, attributes, text) {\n      if (this.currentNode && this.currentNode instanceof XMLDocType) {\n        return this.dtdElement.apply(this, arguments);\n      } else {\n        return this.node(name, attributes, text);\n      }\n    };\n\n    XMLDocumentCB.prototype.attribute = function(name, value) {\n      var attName, attValue;\n      if (!this.currentNode || this.currentNode.children) {\n        throw new Error(\"att() can only be used immediately after an ele() call in callback mode. \" + this.debugInfo(name));\n      }\n      if (name != null) {\n        name = getValue(name);\n      }\n      if (isObject(name)) {\n        for (attName in name) {\n          if (!hasProp.call(name, attName)) continue;\n          attValue = name[attName];\n          this.attribute(attName, attValue);\n        }\n      } else {\n        if (isFunction(value)) {\n          value = value.apply();\n        }\n        if (!this.options.skipNullAttributes || (value != null)) {\n          this.currentNode.attributes[name] = new XMLAttribute(this, name, value);\n        }\n      }\n      return this;\n    };\n\n    XMLDocumentCB.prototype.text = function(value) {\n      var node;\n      this.openCurrent();\n      node = new XMLText(this, value);\n      this.onData(this.writer.text(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.cdata = function(value) {\n      var node;\n      this.openCurrent();\n      node = new XMLCData(this, value);\n      this.onData(this.writer.cdata(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.comment = function(value) {\n      var node;\n      this.openCurrent();\n      node = new XMLComment(this, value);\n      this.onData(this.writer.comment(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.raw = function(value) {\n      var node;\n      this.openCurrent();\n      node = new XMLRaw(this, value);\n      this.onData(this.writer.raw(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.instruction = function(target, value) {\n      var i, insTarget, insValue, len, node;\n      this.openCurrent();\n      if (target != null) {\n        target = getValue(target);\n      }\n      if (value != null) {\n        value = getValue(value);\n      }\n      if (Array.isArray(target)) {\n        for (i = 0, len = target.length; i < len; i++) {\n          insTarget = target[i];\n          this.instruction(insTarget);\n        }\n      } else if (isObject(target)) {\n        for (insTarget in target) {\n          if (!hasProp.call(target, insTarget)) continue;\n          insValue = target[insTarget];\n          this.instruction(insTarget, insValue);\n        }\n      } else {\n        if (isFunction(value)) {\n          value = value.apply();\n        }\n        node = new XMLProcessingInstruction(this, target, value);\n        this.onData(this.writer.processingInstruction(node, this.currentLevel + 1), this.currentLevel + 1);\n      }\n      return this;\n    };\n\n    XMLDocumentCB.prototype.declaration = function(version, encoding, standalone) {\n      var node;\n      this.openCurrent();\n      if (this.documentStarted) {\n        throw new Error(\"declaration() must be the first node.\");\n      }\n      node = new XMLDeclaration(this, version, encoding, standalone);\n      this.onData(this.writer.declaration(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.doctype = function(root, pubID, sysID) {\n      this.openCurrent();\n      if (root == null) {\n        throw new Error(\"Missing root node name.\");\n      }\n      if (this.root) {\n        throw new Error(\"dtd() must come before the root node.\");\n      }\n      this.currentNode = new XMLDocType(this, pubID, sysID);\n      this.currentNode.rootNodeName = root;\n      this.currentNode.children = false;\n      this.currentLevel++;\n      this.openTags[this.currentLevel] = this.currentNode;\n      return this;\n    };\n\n    XMLDocumentCB.prototype.dtdElement = function(name, value) {\n      var node;\n      this.openCurrent();\n      node = new XMLDTDElement(this, name, value);\n      this.onData(this.writer.dtdElement(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {\n      var node;\n      this.openCurrent();\n      node = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);\n      this.onData(this.writer.dtdAttList(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.entity = function(name, value) {\n      var node;\n      this.openCurrent();\n      node = new XMLDTDEntity(this, false, name, value);\n      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.pEntity = function(name, value) {\n      var node;\n      this.openCurrent();\n      node = new XMLDTDEntity(this, true, name, value);\n      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.notation = function(name, value) {\n      var node;\n      this.openCurrent();\n      node = new XMLDTDNotation(this, name, value);\n      this.onData(this.writer.dtdNotation(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.up = function() {\n      if (this.currentLevel < 0) {\n        throw new Error(\"The document node has no parent.\");\n      }\n      if (this.currentNode) {\n        if (this.currentNode.children) {\n          this.closeNode(this.currentNode);\n        } else {\n          this.openNode(this.currentNode);\n        }\n        this.currentNode = null;\n      } else {\n        this.closeNode(this.openTags[this.currentLevel]);\n      }\n      delete this.openTags[this.currentLevel];\n      this.currentLevel--;\n      return this;\n    };\n\n    XMLDocumentCB.prototype.end = function() {\n      while (this.currentLevel >= 0) {\n        this.up();\n      }\n      return this.onEnd();\n    };\n\n    XMLDocumentCB.prototype.openCurrent = function() {\n      if (this.currentNode) {\n        this.currentNode.children = true;\n        return this.openNode(this.currentNode);\n      }\n    };\n\n    XMLDocumentCB.prototype.openNode = function(node) {\n      if (!node.isOpen) {\n        if (!this.root && this.currentLevel === 0 && node instanceof XMLElement) {\n          this.root = node;\n        }\n        this.onData(this.writer.openNode(node, this.currentLevel), this.currentLevel);\n        return node.isOpen = true;\n      }\n    };\n\n    XMLDocumentCB.prototype.closeNode = function(node) {\n      if (!node.isClosed) {\n        this.onData(this.writer.closeNode(node, this.currentLevel), this.currentLevel);\n        return node.isClosed = true;\n      }\n    };\n\n    XMLDocumentCB.prototype.onData = function(chunk, level) {\n      this.documentStarted = true;\n      return this.onDataCallback(chunk, level + 1);\n    };\n\n    XMLDocumentCB.prototype.onEnd = function() {\n      this.documentCompleted = true;\n      return this.onEndCallback();\n    };\n\n    XMLDocumentCB.prototype.debugInfo = function(name) {\n      if (name == null) {\n        return \"\";\n      } else {\n        return \"node: <\" + name + \">\";\n      }\n    };\n\n    XMLDocumentCB.prototype.ele = function() {\n      return this.element.apply(this, arguments);\n    };\n\n    XMLDocumentCB.prototype.nod = function(name, attributes, text) {\n      return this.node(name, attributes, text);\n    };\n\n    XMLDocumentCB.prototype.txt = function(value) {\n      return this.text(value);\n    };\n\n    XMLDocumentCB.prototype.dat = function(value) {\n      return this.cdata(value);\n    };\n\n    XMLDocumentCB.prototype.com = function(value) {\n      return this.comment(value);\n    };\n\n    XMLDocumentCB.prototype.ins = function(target, value) {\n      return this.instruction(target, value);\n    };\n\n    XMLDocumentCB.prototype.dec = function(version, encoding, standalone) {\n      return this.declaration(version, encoding, standalone);\n    };\n\n    XMLDocumentCB.prototype.dtd = function(root, pubID, sysID) {\n      return this.doctype(root, pubID, sysID);\n    };\n\n    XMLDocumentCB.prototype.e = function(name, attributes, text) {\n      return this.element(name, attributes, text);\n    };\n\n    XMLDocumentCB.prototype.n = function(name, attributes, text) {\n      return this.node(name, attributes, text);\n    };\n\n    XMLDocumentCB.prototype.t = function(value) {\n      return this.text(value);\n    };\n\n    XMLDocumentCB.prototype.d = function(value) {\n      return this.cdata(value);\n    };\n\n    XMLDocumentCB.prototype.c = function(value) {\n      return this.comment(value);\n    };\n\n    XMLDocumentCB.prototype.r = function(value) {\n      return this.raw(value);\n    };\n\n    XMLDocumentCB.prototype.i = function(target, value) {\n      return this.instruction(target, value);\n    };\n\n    XMLDocumentCB.prototype.att = function() {\n      if (this.currentNode && this.currentNode instanceof XMLDocType) {\n        return this.attList.apply(this, arguments);\n      } else {\n        return this.attribute.apply(this, arguments);\n      }\n    };\n\n    XMLDocumentCB.prototype.a = function() {\n      if (this.currentNode && this.currentNode instanceof XMLDocType) {\n        return this.attList.apply(this, arguments);\n      } else {\n        return this.attribute.apply(this, arguments);\n      }\n    };\n\n    XMLDocumentCB.prototype.ent = function(name, value) {\n      return this.entity(name, value);\n    };\n\n    XMLDocumentCB.prototype.pent = function(name, value) {\n      return this.pEntity(name, value);\n    };\n\n    XMLDocumentCB.prototype.not = function(name, value) {\n      return this.notation(name, value);\n    };\n\n    return XMLDocumentCB;\n\n  })();\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLAttribute\":159,\"./XMLCData\":160,\"./XMLComment\":161,\"./XMLDTDAttList\":162,\"./XMLDTDElement\":163,\"./XMLDTDEntity\":164,\"./XMLDTDNotation\":165,\"./XMLDeclaration\":166,\"./XMLDocType\":167,\"./XMLElement\":170,\"./XMLProcessingInstruction\":172,\"./XMLRaw\":173,\"./XMLStringWriter\":175,\"./XMLStringifier\":176,\"./XMLText\":177}],170:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLAttribute, XMLElement, XMLNode, getValue, isFunction, isObject, ref,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, getValue = ref.getValue;\n\n  XMLNode = require('./XMLNode');\n\n  XMLAttribute = require('./XMLAttribute');\n\n  module.exports = XMLElement = (function(superClass) {\n    extend(XMLElement, superClass);\n\n    function XMLElement(parent, name, attributes) {\n      XMLElement.__super__.constructor.call(this, parent);\n      if (name == null) {\n        throw new Error(\"Missing element name. \" + this.debugInfo());\n      }\n      this.name = this.stringify.eleName(name);\n      this.attributes = {};\n      if (attributes != null) {\n        this.attribute(attributes);\n      }\n      if (parent.isDocument) {\n        this.isRoot = true;\n        this.documentObject = parent;\n        parent.rootObject = this;\n      }\n    }\n\n    XMLElement.prototype.clone = function() {\n      var att, attName, clonedSelf, ref1;\n      clonedSelf = Object.create(this);\n      if (clonedSelf.isRoot) {\n        clonedSelf.documentObject = null;\n      }\n      clonedSelf.attributes = {};\n      ref1 = this.attributes;\n      for (attName in ref1) {\n        if (!hasProp.call(ref1, attName)) continue;\n        att = ref1[attName];\n        clonedSelf.attributes[attName] = att.clone();\n      }\n      clonedSelf.children = [];\n      this.children.forEach(function(child) {\n        var clonedChild;\n        clonedChild = child.clone();\n        clonedChild.parent = clonedSelf;\n        return clonedSelf.children.push(clonedChild);\n      });\n      return clonedSelf;\n    };\n\n    XMLElement.prototype.attribute = function(name, value) {\n      var attName, attValue;\n      if (name != null) {\n        name = getValue(name);\n      }\n      if (isObject(name)) {\n        for (attName in name) {\n          if (!hasProp.call(name, attName)) continue;\n          attValue = name[attName];\n          this.attribute(attName, attValue);\n        }\n      } else {\n        if (isFunction(value)) {\n          value = value.apply();\n        }\n        if (!this.options.skipNullAttributes || (value != null)) {\n          this.attributes[name] = new XMLAttribute(this, name, value);\n        }\n      }\n      return this;\n    };\n\n    XMLElement.prototype.removeAttribute = function(name) {\n      var attName, i, len;\n      if (name == null) {\n        throw new Error(\"Missing attribute name. \" + this.debugInfo());\n      }\n      name = getValue(name);\n      if (Array.isArray(name)) {\n        for (i = 0, len = name.length; i < len; i++) {\n          attName = name[i];\n          delete this.attributes[attName];\n        }\n      } else {\n        delete this.attributes[name];\n      }\n      return this;\n    };\n\n    XMLElement.prototype.toString = function(options) {\n      return this.options.writer.set(options).element(this);\n    };\n\n    XMLElement.prototype.att = function(name, value) {\n      return this.attribute(name, value);\n    };\n\n    XMLElement.prototype.a = function(name, value) {\n      return this.attribute(name, value);\n    };\n\n    return XMLElement;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLAttribute\":159,\"./XMLNode\":171}],171:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLProcessingInstruction, XMLRaw, XMLText, getValue, isEmpty, isFunction, isObject, ref,\n    hasProp = {}.hasOwnProperty;\n\n  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isEmpty = ref.isEmpty, getValue = ref.getValue;\n\n  XMLElement = null;\n\n  XMLCData = null;\n\n  XMLComment = null;\n\n  XMLDeclaration = null;\n\n  XMLDocType = null;\n\n  XMLRaw = null;\n\n  XMLText = null;\n\n  XMLProcessingInstruction = null;\n\n  module.exports = XMLNode = (function() {\n    function XMLNode(parent) {\n      this.parent = parent;\n      if (this.parent) {\n        this.options = this.parent.options;\n        this.stringify = this.parent.stringify;\n      }\n      this.children = [];\n      if (!XMLElement) {\n        XMLElement = require('./XMLElement');\n        XMLCData = require('./XMLCData');\n        XMLComment = require('./XMLComment');\n        XMLDeclaration = require('./XMLDeclaration');\n        XMLDocType = require('./XMLDocType');\n        XMLRaw = require('./XMLRaw');\n        XMLText = require('./XMLText');\n        XMLProcessingInstruction = require('./XMLProcessingInstruction');\n      }\n    }\n\n    XMLNode.prototype.element = function(name, attributes, text) {\n      var childNode, item, j, k, key, lastChild, len, len1, ref1, val;\n      lastChild = null;\n      if (attributes == null) {\n        attributes = {};\n      }\n      attributes = getValue(attributes);\n      if (!isObject(attributes)) {\n        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];\n      }\n      if (name != null) {\n        name = getValue(name);\n      }\n      if (Array.isArray(name)) {\n        for (j = 0, len = name.length; j < len; j++) {\n          item = name[j];\n          lastChild = this.element(item);\n        }\n      } else if (isFunction(name)) {\n        lastChild = this.element(name.apply());\n      } else if (isObject(name)) {\n        for (key in name) {\n          if (!hasProp.call(name, key)) continue;\n          val = name[key];\n          if (isFunction(val)) {\n            val = val.apply();\n          }\n          if ((isObject(val)) && (isEmpty(val))) {\n            val = null;\n          }\n          if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) {\n            lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val);\n          } else if (!this.options.separateArrayItems && Array.isArray(val)) {\n            for (k = 0, len1 = val.length; k < len1; k++) {\n              item = val[k];\n              childNode = {};\n              childNode[key] = item;\n              lastChild = this.element(childNode);\n            }\n          } else if (isObject(val)) {\n            lastChild = this.element(key);\n            lastChild.element(val);\n          } else {\n            lastChild = this.element(key, val);\n          }\n        }\n      } else {\n        if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) {\n          lastChild = this.text(text);\n        } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) {\n          lastChild = this.cdata(text);\n        } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) {\n          lastChild = this.comment(text);\n        } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) {\n          lastChild = this.raw(text);\n        } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && name.indexOf(this.stringify.convertPIKey) === 0) {\n          lastChild = this.instruction(name.substr(this.stringify.convertPIKey.length), text);\n        } else {\n          lastChild = this.node(name, attributes, text);\n        }\n      }\n      if (lastChild == null) {\n        throw new Error(\"Could not create any elements with: \" + name + \". \" + this.debugInfo());\n      }\n      return lastChild;\n    };\n\n    XMLNode.prototype.insertBefore = function(name, attributes, text) {\n      var child, i, removed;\n      if (this.isRoot) {\n        throw new Error(\"Cannot insert elements at root level. \" + this.debugInfo(name));\n      }\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i);\n      child = this.parent.element(name, attributes, text);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return child;\n    };\n\n    XMLNode.prototype.insertAfter = function(name, attributes, text) {\n      var child, i, removed;\n      if (this.isRoot) {\n        throw new Error(\"Cannot insert elements at root level. \" + this.debugInfo(name));\n      }\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i + 1);\n      child = this.parent.element(name, attributes, text);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return child;\n    };\n\n    XMLNode.prototype.remove = function() {\n      var i, ref1;\n      if (this.isRoot) {\n        throw new Error(\"Cannot remove the root element. \" + this.debugInfo());\n      }\n      i = this.parent.children.indexOf(this);\n      [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref1 = [])), ref1;\n      return this.parent;\n    };\n\n    XMLNode.prototype.node = function(name, attributes, text) {\n      var child, ref1;\n      if (name != null) {\n        name = getValue(name);\n      }\n      attributes || (attributes = {});\n      attributes = getValue(attributes);\n      if (!isObject(attributes)) {\n        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];\n      }\n      child = new XMLElement(this, name, attributes);\n      if (text != null) {\n        child.text(text);\n      }\n      this.children.push(child);\n      return child;\n    };\n\n    XMLNode.prototype.text = function(value) {\n      var child;\n      child = new XMLText(this, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLNode.prototype.cdata = function(value) {\n      var child;\n      child = new XMLCData(this, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLNode.prototype.comment = function(value) {\n      var child;\n      child = new XMLComment(this, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLNode.prototype.commentBefore = function(value) {\n      var child, i, removed;\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i);\n      child = this.parent.comment(value);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return this;\n    };\n\n    XMLNode.prototype.commentAfter = function(value) {\n      var child, i, removed;\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i + 1);\n      child = this.parent.comment(value);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return this;\n    };\n\n    XMLNode.prototype.raw = function(value) {\n      var child;\n      child = new XMLRaw(this, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLNode.prototype.instruction = function(target, value) {\n      var insTarget, insValue, instruction, j, len;\n      if (target != null) {\n        target = getValue(target);\n      }\n      if (value != null) {\n        value = getValue(value);\n      }\n      if (Array.isArray(target)) {\n        for (j = 0, len = target.length; j < len; j++) {\n          insTarget = target[j];\n          this.instruction(insTarget);\n        }\n      } else if (isObject(target)) {\n        for (insTarget in target) {\n          if (!hasProp.call(target, insTarget)) continue;\n          insValue = target[insTarget];\n          this.instruction(insTarget, insValue);\n        }\n      } else {\n        if (isFunction(value)) {\n          value = value.apply();\n        }\n        instruction = new XMLProcessingInstruction(this, target, value);\n        this.children.push(instruction);\n      }\n      return this;\n    };\n\n    XMLNode.prototype.instructionBefore = function(target, value) {\n      var child, i, removed;\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i);\n      child = this.parent.instruction(target, value);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return this;\n    };\n\n    XMLNode.prototype.instructionAfter = function(target, value) {\n      var child, i, removed;\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i + 1);\n      child = this.parent.instruction(target, value);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return this;\n    };\n\n    XMLNode.prototype.declaration = function(version, encoding, standalone) {\n      var doc, xmldec;\n      doc = this.document();\n      xmldec = new XMLDeclaration(doc, version, encoding, standalone);\n      if (doc.children[0] instanceof XMLDeclaration) {\n        doc.children[0] = xmldec;\n      } else {\n        doc.children.unshift(xmldec);\n      }\n      return doc.root() || doc;\n    };\n\n    XMLNode.prototype.doctype = function(pubID, sysID) {\n      var child, doc, doctype, i, j, k, len, len1, ref1, ref2;\n      doc = this.document();\n      doctype = new XMLDocType(doc, pubID, sysID);\n      ref1 = doc.children;\n      for (i = j = 0, len = ref1.length; j < len; i = ++j) {\n        child = ref1[i];\n        if (child instanceof XMLDocType) {\n          doc.children[i] = doctype;\n          return doctype;\n        }\n      }\n      ref2 = doc.children;\n      for (i = k = 0, len1 = ref2.length; k < len1; i = ++k) {\n        child = ref2[i];\n        if (child.isRoot) {\n          doc.children.splice(i, 0, doctype);\n          return doctype;\n        }\n      }\n      doc.children.push(doctype);\n      return doctype;\n    };\n\n    XMLNode.prototype.up = function() {\n      if (this.isRoot) {\n        throw new Error(\"The root node has no parent. Use doc() if you need to get the document object.\");\n      }\n      return this.parent;\n    };\n\n    XMLNode.prototype.root = function() {\n      var node;\n      node = this;\n      while (node) {\n        if (node.isDocument) {\n          return node.rootObject;\n        } else if (node.isRoot) {\n          return node;\n        } else {\n          node = node.parent;\n        }\n      }\n    };\n\n    XMLNode.prototype.document = function() {\n      var node;\n      node = this;\n      while (node) {\n        if (node.isDocument) {\n          return node;\n        } else {\n          node = node.parent;\n        }\n      }\n    };\n\n    XMLNode.prototype.end = function(options) {\n      return this.document().end(options);\n    };\n\n    XMLNode.prototype.prev = function() {\n      var i;\n      i = this.parent.children.indexOf(this);\n      if (i < 1) {\n        throw new Error(\"Already at the first node. \" + this.debugInfo());\n      }\n      return this.parent.children[i - 1];\n    };\n\n    XMLNode.prototype.next = function() {\n      var i;\n      i = this.parent.children.indexOf(this);\n      if (i === -1 || i === this.parent.children.length - 1) {\n        throw new Error(\"Already at the last node. \" + this.debugInfo());\n      }\n      return this.parent.children[i + 1];\n    };\n\n    XMLNode.prototype.importDocument = function(doc) {\n      var clonedRoot;\n      clonedRoot = doc.root().clone();\n      clonedRoot.parent = this;\n      clonedRoot.isRoot = false;\n      this.children.push(clonedRoot);\n      return this;\n    };\n\n    XMLNode.prototype.debugInfo = function(name) {\n      var ref1, ref2;\n      name = name || this.name;\n      if ((name == null) && !((ref1 = this.parent) != null ? ref1.name : void 0)) {\n        return \"\";\n      } else if (name == null) {\n        return \"parent: <\" + this.parent.name + \">\";\n      } else if (!((ref2 = this.parent) != null ? ref2.name : void 0)) {\n        return \"node: <\" + name + \">\";\n      } else {\n        return \"node: <\" + name + \">, parent: <\" + this.parent.name + \">\";\n      }\n    };\n\n    XMLNode.prototype.ele = function(name, attributes, text) {\n      return this.element(name, attributes, text);\n    };\n\n    XMLNode.prototype.nod = function(name, attributes, text) {\n      return this.node(name, attributes, text);\n    };\n\n    XMLNode.prototype.txt = function(value) {\n      return this.text(value);\n    };\n\n    XMLNode.prototype.dat = function(value) {\n      return this.cdata(value);\n    };\n\n    XMLNode.prototype.com = function(value) {\n      return this.comment(value);\n    };\n\n    XMLNode.prototype.ins = function(target, value) {\n      return this.instruction(target, value);\n    };\n\n    XMLNode.prototype.doc = function() {\n      return this.document();\n    };\n\n    XMLNode.prototype.dec = function(version, encoding, standalone) {\n      return this.declaration(version, encoding, standalone);\n    };\n\n    XMLNode.prototype.dtd = function(pubID, sysID) {\n      return this.doctype(pubID, sysID);\n    };\n\n    XMLNode.prototype.e = function(name, attributes, text) {\n      return this.element(name, attributes, text);\n    };\n\n    XMLNode.prototype.n = function(name, attributes, text) {\n      return this.node(name, attributes, text);\n    };\n\n    XMLNode.prototype.t = function(value) {\n      return this.text(value);\n    };\n\n    XMLNode.prototype.d = function(value) {\n      return this.cdata(value);\n    };\n\n    XMLNode.prototype.c = function(value) {\n      return this.comment(value);\n    };\n\n    XMLNode.prototype.r = function(value) {\n      return this.raw(value);\n    };\n\n    XMLNode.prototype.i = function(target, value) {\n      return this.instruction(target, value);\n    };\n\n    XMLNode.prototype.u = function() {\n      return this.up();\n    };\n\n    XMLNode.prototype.importXMLBuilder = function(doc) {\n      return this.importDocument(doc);\n    };\n\n    return XMLNode;\n\n  })();\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLCData\":160,\"./XMLComment\":161,\"./XMLDeclaration\":166,\"./XMLDocType\":167,\"./XMLElement\":170,\"./XMLProcessingInstruction\":172,\"./XMLRaw\":173,\"./XMLText\":177}],172:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLNode, XMLProcessingInstruction,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLProcessingInstruction = (function(superClass) {\n    extend(XMLProcessingInstruction, superClass);\n\n    function XMLProcessingInstruction(parent, target, value) {\n      XMLProcessingInstruction.__super__.constructor.call(this, parent);\n      if (target == null) {\n        throw new Error(\"Missing instruction target. \" + this.debugInfo());\n      }\n      this.target = this.stringify.insTarget(target);\n      if (value) {\n        this.value = this.stringify.insValue(value);\n      }\n    }\n\n    XMLProcessingInstruction.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLProcessingInstruction.prototype.toString = function(options) {\n      return this.options.writer.set(options).processingInstruction(this);\n    };\n\n    return XMLProcessingInstruction;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],173:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLNode, XMLRaw,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLRaw = (function(superClass) {\n    extend(XMLRaw, superClass);\n\n    function XMLRaw(parent, text) {\n      XMLRaw.__super__.constructor.call(this, parent);\n      if (text == null) {\n        throw new Error(\"Missing raw text. \" + this.debugInfo());\n      }\n      this.value = this.stringify.raw(text);\n    }\n\n    XMLRaw.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLRaw.prototype.toString = function(options) {\n      return this.options.writer.set(options).raw(this);\n    };\n\n    return XMLRaw;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],174:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStreamWriter, XMLText, XMLWriterBase,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLDeclaration = require('./XMLDeclaration');\n\n  XMLDocType = require('./XMLDocType');\n\n  XMLCData = require('./XMLCData');\n\n  XMLComment = require('./XMLComment');\n\n  XMLElement = require('./XMLElement');\n\n  XMLRaw = require('./XMLRaw');\n\n  XMLText = require('./XMLText');\n\n  XMLProcessingInstruction = require('./XMLProcessingInstruction');\n\n  XMLDTDAttList = require('./XMLDTDAttList');\n\n  XMLDTDElement = require('./XMLDTDElement');\n\n  XMLDTDEntity = require('./XMLDTDEntity');\n\n  XMLDTDNotation = require('./XMLDTDNotation');\n\n  XMLWriterBase = require('./XMLWriterBase');\n\n  module.exports = XMLStreamWriter = (function(superClass) {\n    extend(XMLStreamWriter, superClass);\n\n    function XMLStreamWriter(stream, options) {\n      XMLStreamWriter.__super__.constructor.call(this, options);\n      this.stream = stream;\n    }\n\n    XMLStreamWriter.prototype.document = function(doc) {\n      var child, i, j, len, len1, ref, ref1, results;\n      ref = doc.children;\n      for (i = 0, len = ref.length; i < len; i++) {\n        child = ref[i];\n        child.isLastRootNode = false;\n      }\n      doc.children[doc.children.length - 1].isLastRootNode = true;\n      ref1 = doc.children;\n      results = [];\n      for (j = 0, len1 = ref1.length; j < len1; j++) {\n        child = ref1[j];\n        switch (false) {\n          case !(child instanceof XMLDeclaration):\n            results.push(this.declaration(child));\n            break;\n          case !(child instanceof XMLDocType):\n            results.push(this.docType(child));\n            break;\n          case !(child instanceof XMLComment):\n            results.push(this.comment(child));\n            break;\n          case !(child instanceof XMLProcessingInstruction):\n            results.push(this.processingInstruction(child));\n            break;\n          default:\n            results.push(this.element(child));\n        }\n      }\n      return results;\n    };\n\n    XMLStreamWriter.prototype.attribute = function(att) {\n      return this.stream.write(' ' + att.name + '=\"' + att.value + '\"');\n    };\n\n    XMLStreamWriter.prototype.cdata = function(node, level) {\n      return this.stream.write(this.space(level) + '<![CDATA[' + node.text + ']]>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.comment = function(node, level) {\n      return this.stream.write(this.space(level) + '<!-- ' + node.text + ' -->' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.declaration = function(node, level) {\n      this.stream.write(this.space(level));\n      this.stream.write('<?xml version=\"' + node.version + '\"');\n      if (node.encoding != null) {\n        this.stream.write(' encoding=\"' + node.encoding + '\"');\n      }\n      if (node.standalone != null) {\n        this.stream.write(' standalone=\"' + node.standalone + '\"');\n      }\n      this.stream.write(this.spacebeforeslash + '?>');\n      return this.stream.write(this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.docType = function(node, level) {\n      var child, i, len, ref;\n      level || (level = 0);\n      this.stream.write(this.space(level));\n      this.stream.write('<!DOCTYPE ' + node.root().name);\n      if (node.pubID && node.sysID) {\n        this.stream.write(' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"');\n      } else if (node.sysID) {\n        this.stream.write(' SYSTEM \"' + node.sysID + '\"');\n      }\n      if (node.children.length > 0) {\n        this.stream.write(' [');\n        this.stream.write(this.endline(node));\n        ref = node.children;\n        for (i = 0, len = ref.length; i < len; i++) {\n          child = ref[i];\n          switch (false) {\n            case !(child instanceof XMLDTDAttList):\n              this.dtdAttList(child, level + 1);\n              break;\n            case !(child instanceof XMLDTDElement):\n              this.dtdElement(child, level + 1);\n              break;\n            case !(child instanceof XMLDTDEntity):\n              this.dtdEntity(child, level + 1);\n              break;\n            case !(child instanceof XMLDTDNotation):\n              this.dtdNotation(child, level + 1);\n              break;\n            case !(child instanceof XMLCData):\n              this.cdata(child, level + 1);\n              break;\n            case !(child instanceof XMLComment):\n              this.comment(child, level + 1);\n              break;\n            case !(child instanceof XMLProcessingInstruction):\n              this.processingInstruction(child, level + 1);\n              break;\n            default:\n              throw new Error(\"Unknown DTD node type: \" + child.constructor.name);\n          }\n        }\n        this.stream.write(']');\n      }\n      this.stream.write(this.spacebeforeslash + '>');\n      return this.stream.write(this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.element = function(node, level) {\n      var att, child, i, len, name, ref, ref1, space;\n      level || (level = 0);\n      space = this.space(level);\n      this.stream.write(space + '<' + node.name);\n      ref = node.attributes;\n      for (name in ref) {\n        if (!hasProp.call(ref, name)) continue;\n        att = ref[name];\n        this.attribute(att);\n      }\n      if (node.children.length === 0 || node.children.every(function(e) {\n        return e.value === '';\n      })) {\n        if (this.allowEmpty) {\n          this.stream.write('></' + node.name + '>');\n        } else {\n          this.stream.write(this.spacebeforeslash + '/>');\n        }\n      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {\n        this.stream.write('>');\n        this.stream.write(node.children[0].value);\n        this.stream.write('</' + node.name + '>');\n      } else {\n        this.stream.write('>' + this.newline);\n        ref1 = node.children;\n        for (i = 0, len = ref1.length; i < len; i++) {\n          child = ref1[i];\n          switch (false) {\n            case !(child instanceof XMLCData):\n              this.cdata(child, level + 1);\n              break;\n            case !(child instanceof XMLComment):\n              this.comment(child, level + 1);\n              break;\n            case !(child instanceof XMLElement):\n              this.element(child, level + 1);\n              break;\n            case !(child instanceof XMLRaw):\n              this.raw(child, level + 1);\n              break;\n            case !(child instanceof XMLText):\n              this.text(child, level + 1);\n              break;\n            case !(child instanceof XMLProcessingInstruction):\n              this.processingInstruction(child, level + 1);\n              break;\n            default:\n              throw new Error(\"Unknown XML node type: \" + child.constructor.name);\n          }\n        }\n        this.stream.write(space + '</' + node.name + '>');\n      }\n      return this.stream.write(this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.processingInstruction = function(node, level) {\n      this.stream.write(this.space(level) + '<?' + node.target);\n      if (node.value) {\n        this.stream.write(' ' + node.value);\n      }\n      return this.stream.write(this.spacebeforeslash + '?>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.raw = function(node, level) {\n      return this.stream.write(this.space(level) + node.value + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.text = function(node, level) {\n      return this.stream.write(this.space(level) + node.value + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.dtdAttList = function(node, level) {\n      this.stream.write(this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType);\n      if (node.defaultValueType !== '#DEFAULT') {\n        this.stream.write(' ' + node.defaultValueType);\n      }\n      if (node.defaultValue) {\n        this.stream.write(' \"' + node.defaultValue + '\"');\n      }\n      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.dtdElement = function(node, level) {\n      this.stream.write(this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value);\n      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.dtdEntity = function(node, level) {\n      this.stream.write(this.space(level) + '<!ENTITY');\n      if (node.pe) {\n        this.stream.write(' %');\n      }\n      this.stream.write(' ' + node.name);\n      if (node.value) {\n        this.stream.write(' \"' + node.value + '\"');\n      } else {\n        if (node.pubID && node.sysID) {\n          this.stream.write(' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"');\n        } else if (node.sysID) {\n          this.stream.write(' SYSTEM \"' + node.sysID + '\"');\n        }\n        if (node.nData) {\n          this.stream.write(' NDATA ' + node.nData);\n        }\n      }\n      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.dtdNotation = function(node, level) {\n      this.stream.write(this.space(level) + '<!NOTATION ' + node.name);\n      if (node.pubID && node.sysID) {\n        this.stream.write(' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"');\n      } else if (node.pubID) {\n        this.stream.write(' PUBLIC \"' + node.pubID + '\"');\n      } else if (node.sysID) {\n        this.stream.write(' SYSTEM \"' + node.sysID + '\"');\n      }\n      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.endline = function(node) {\n      if (!node.isLastRootNode) {\n        return this.newline;\n      } else {\n        return '';\n      }\n    };\n\n    return XMLStreamWriter;\n\n  })(XMLWriterBase);\n\n}).call(this);\n\n},{\"./XMLCData\":160,\"./XMLComment\":161,\"./XMLDTDAttList\":162,\"./XMLDTDElement\":163,\"./XMLDTDEntity\":164,\"./XMLDTDNotation\":165,\"./XMLDeclaration\":166,\"./XMLDocType\":167,\"./XMLElement\":170,\"./XMLProcessingInstruction\":172,\"./XMLRaw\":173,\"./XMLText\":177,\"./XMLWriterBase\":178}],175:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLText, XMLWriterBase,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLDeclaration = require('./XMLDeclaration');\n\n  XMLDocType = require('./XMLDocType');\n\n  XMLCData = require('./XMLCData');\n\n  XMLComment = require('./XMLComment');\n\n  XMLElement = require('./XMLElement');\n\n  XMLRaw = require('./XMLRaw');\n\n  XMLText = require('./XMLText');\n\n  XMLProcessingInstruction = require('./XMLProcessingInstruction');\n\n  XMLDTDAttList = require('./XMLDTDAttList');\n\n  XMLDTDElement = require('./XMLDTDElement');\n\n  XMLDTDEntity = require('./XMLDTDEntity');\n\n  XMLDTDNotation = require('./XMLDTDNotation');\n\n  XMLWriterBase = require('./XMLWriterBase');\n\n  module.exports = XMLStringWriter = (function(superClass) {\n    extend(XMLStringWriter, superClass);\n\n    function XMLStringWriter(options) {\n      XMLStringWriter.__super__.constructor.call(this, options);\n    }\n\n    XMLStringWriter.prototype.document = function(doc) {\n      var child, i, len, r, ref;\n      this.textispresent = false;\n      r = '';\n      ref = doc.children;\n      for (i = 0, len = ref.length; i < len; i++) {\n        child = ref[i];\n        r += (function() {\n          switch (false) {\n            case !(child instanceof XMLDeclaration):\n              return this.declaration(child);\n            case !(child instanceof XMLDocType):\n              return this.docType(child);\n            case !(child instanceof XMLComment):\n              return this.comment(child);\n            case !(child instanceof XMLProcessingInstruction):\n              return this.processingInstruction(child);\n            default:\n              return this.element(child, 0);\n          }\n        }).call(this);\n      }\n      if (this.pretty && r.slice(-this.newline.length) === this.newline) {\n        r = r.slice(0, -this.newline.length);\n      }\n      return r;\n    };\n\n    XMLStringWriter.prototype.attribute = function(att) {\n      return ' ' + att.name + '=\"' + att.value + '\"';\n    };\n\n    XMLStringWriter.prototype.cdata = function(node, level) {\n      return this.space(level) + '<![CDATA[' + node.text + ']]>' + this.newline;\n    };\n\n    XMLStringWriter.prototype.comment = function(node, level) {\n      return this.space(level) + '<!-- ' + node.text + ' -->' + this.newline;\n    };\n\n    XMLStringWriter.prototype.declaration = function(node, level) {\n      var r;\n      r = this.space(level);\n      r += '<?xml version=\"' + node.version + '\"';\n      if (node.encoding != null) {\n        r += ' encoding=\"' + node.encoding + '\"';\n      }\n      if (node.standalone != null) {\n        r += ' standalone=\"' + node.standalone + '\"';\n      }\n      r += this.spacebeforeslash + '?>';\n      r += this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.docType = function(node, level) {\n      var child, i, len, r, ref;\n      level || (level = 0);\n      r = this.space(level);\n      r += '<!DOCTYPE ' + node.root().name;\n      if (node.pubID && node.sysID) {\n        r += ' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"';\n      } else if (node.sysID) {\n        r += ' SYSTEM \"' + node.sysID + '\"';\n      }\n      if (node.children.length > 0) {\n        r += ' [';\n        r += this.newline;\n        ref = node.children;\n        for (i = 0, len = ref.length; i < len; i++) {\n          child = ref[i];\n          r += (function() {\n            switch (false) {\n              case !(child instanceof XMLDTDAttList):\n                return this.dtdAttList(child, level + 1);\n              case !(child instanceof XMLDTDElement):\n                return this.dtdElement(child, level + 1);\n              case !(child instanceof XMLDTDEntity):\n                return this.dtdEntity(child, level + 1);\n              case !(child instanceof XMLDTDNotation):\n                return this.dtdNotation(child, level + 1);\n              case !(child instanceof XMLCData):\n                return this.cdata(child, level + 1);\n              case !(child instanceof XMLComment):\n                return this.comment(child, level + 1);\n              case !(child instanceof XMLProcessingInstruction):\n                return this.processingInstruction(child, level + 1);\n              default:\n                throw new Error(\"Unknown DTD node type: \" + child.constructor.name);\n            }\n          }).call(this);\n        }\n        r += ']';\n      }\n      r += this.spacebeforeslash + '>';\n      r += this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.element = function(node, level) {\n      var att, child, i, j, len, len1, name, r, ref, ref1, ref2, space, textispresentwasset;\n      level || (level = 0);\n      textispresentwasset = false;\n      if (this.textispresent) {\n        this.newline = '';\n        this.pretty = false;\n      } else {\n        this.newline = this.newlinedefault;\n        this.pretty = this.prettydefault;\n      }\n      space = this.space(level);\n      r = '';\n      r += space + '<' + node.name;\n      ref = node.attributes;\n      for (name in ref) {\n        if (!hasProp.call(ref, name)) continue;\n        att = ref[name];\n        r += this.attribute(att);\n      }\n      if (node.children.length === 0 || node.children.every(function(e) {\n        return e.value === '';\n      })) {\n        if (this.allowEmpty) {\n          r += '></' + node.name + '>' + this.newline;\n        } else {\n          r += this.spacebeforeslash + '/>' + this.newline;\n        }\n      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {\n        r += '>';\n        r += node.children[0].value;\n        r += '</' + node.name + '>' + this.newline;\n      } else {\n        if (this.dontprettytextnodes) {\n          ref1 = node.children;\n          for (i = 0, len = ref1.length; i < len; i++) {\n            child = ref1[i];\n            if (child.value != null) {\n              this.textispresent++;\n              textispresentwasset = true;\n              break;\n            }\n          }\n        }\n        if (this.textispresent) {\n          this.newline = '';\n          this.pretty = false;\n          space = this.space(level);\n        }\n        r += '>' + this.newline;\n        ref2 = node.children;\n        for (j = 0, len1 = ref2.length; j < len1; j++) {\n          child = ref2[j];\n          r += (function() {\n            switch (false) {\n              case !(child instanceof XMLCData):\n                return this.cdata(child, level + 1);\n              case !(child instanceof XMLComment):\n                return this.comment(child, level + 1);\n              case !(child instanceof XMLElement):\n                return this.element(child, level + 1);\n              case !(child instanceof XMLRaw):\n                return this.raw(child, level + 1);\n              case !(child instanceof XMLText):\n                return this.text(child, level + 1);\n              case !(child instanceof XMLProcessingInstruction):\n                return this.processingInstruction(child, level + 1);\n              default:\n                throw new Error(\"Unknown XML node type: \" + child.constructor.name);\n            }\n          }).call(this);\n        }\n        if (textispresentwasset) {\n          this.textispresent--;\n        }\n        if (!this.textispresent) {\n          this.newline = this.newlinedefault;\n          this.pretty = this.prettydefault;\n        }\n        r += space + '</' + node.name + '>' + this.newline;\n      }\n      return r;\n    };\n\n    XMLStringWriter.prototype.processingInstruction = function(node, level) {\n      var r;\n      r = this.space(level) + '<?' + node.target;\n      if (node.value) {\n        r += ' ' + node.value;\n      }\n      r += this.spacebeforeslash + '?>' + this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.raw = function(node, level) {\n      return this.space(level) + node.value + this.newline;\n    };\n\n    XMLStringWriter.prototype.text = function(node, level) {\n      return this.space(level) + node.value + this.newline;\n    };\n\n    XMLStringWriter.prototype.dtdAttList = function(node, level) {\n      var r;\n      r = this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType;\n      if (node.defaultValueType !== '#DEFAULT') {\n        r += ' ' + node.defaultValueType;\n      }\n      if (node.defaultValue) {\n        r += ' \"' + node.defaultValue + '\"';\n      }\n      r += this.spacebeforeslash + '>' + this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.dtdElement = function(node, level) {\n      return this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value + this.spacebeforeslash + '>' + this.newline;\n    };\n\n    XMLStringWriter.prototype.dtdEntity = function(node, level) {\n      var r;\n      r = this.space(level) + '<!ENTITY';\n      if (node.pe) {\n        r += ' %';\n      }\n      r += ' ' + node.name;\n      if (node.value) {\n        r += ' \"' + node.value + '\"';\n      } else {\n        if (node.pubID && node.sysID) {\n          r += ' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"';\n        } else if (node.sysID) {\n          r += ' SYSTEM \"' + node.sysID + '\"';\n        }\n        if (node.nData) {\n          r += ' NDATA ' + node.nData;\n        }\n      }\n      r += this.spacebeforeslash + '>' + this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.dtdNotation = function(node, level) {\n      var r;\n      r = this.space(level) + '<!NOTATION ' + node.name;\n      if (node.pubID && node.sysID) {\n        r += ' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"';\n      } else if (node.pubID) {\n        r += ' PUBLIC \"' + node.pubID + '\"';\n      } else if (node.sysID) {\n        r += ' SYSTEM \"' + node.sysID + '\"';\n      }\n      r += this.spacebeforeslash + '>' + this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.openNode = function(node, level) {\n      var att, name, r, ref;\n      level || (level = 0);\n      if (node instanceof XMLElement) {\n        r = this.space(level) + '<' + node.name;\n        ref = node.attributes;\n        for (name in ref) {\n          if (!hasProp.call(ref, name)) continue;\n          att = ref[name];\n          r += this.attribute(att);\n        }\n        r += (node.children ? '>' : '/>') + this.newline;\n        return r;\n      } else {\n        r = this.space(level) + '<!DOCTYPE ' + node.rootNodeName;\n        if (node.pubID && node.sysID) {\n          r += ' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"';\n        } else if (node.sysID) {\n          r += ' SYSTEM \"' + node.sysID + '\"';\n        }\n        r += (node.children ? ' [' : '>') + this.newline;\n        return r;\n      }\n    };\n\n    XMLStringWriter.prototype.closeNode = function(node, level) {\n      level || (level = 0);\n      switch (false) {\n        case !(node instanceof XMLElement):\n          return this.space(level) + '</' + node.name + '>' + this.newline;\n        case !(node instanceof XMLDocType):\n          return this.space(level) + ']>' + this.newline;\n      }\n    };\n\n    return XMLStringWriter;\n\n  })(XMLWriterBase);\n\n}).call(this);\n\n},{\"./XMLCData\":160,\"./XMLComment\":161,\"./XMLDTDAttList\":162,\"./XMLDTDElement\":163,\"./XMLDTDEntity\":164,\"./XMLDTDNotation\":165,\"./XMLDeclaration\":166,\"./XMLDocType\":167,\"./XMLElement\":170,\"./XMLProcessingInstruction\":172,\"./XMLRaw\":173,\"./XMLText\":177,\"./XMLWriterBase\":178}],176:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLStringifier,\n    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n    hasProp = {}.hasOwnProperty;\n\n  module.exports = XMLStringifier = (function() {\n    function XMLStringifier(options) {\n      this.assertLegalChar = bind(this.assertLegalChar, this);\n      var key, ref, value;\n      options || (options = {});\n      this.noDoubleEncoding = options.noDoubleEncoding;\n      ref = options.stringify || {};\n      for (key in ref) {\n        if (!hasProp.call(ref, key)) continue;\n        value = ref[key];\n        this[key] = value;\n      }\n    }\n\n    XMLStringifier.prototype.eleName = function(val) {\n      val = '' + val || '';\n      return this.assertLegalChar(val);\n    };\n\n    XMLStringifier.prototype.eleText = function(val) {\n      val = '' + val || '';\n      return this.assertLegalChar(this.elEscape(val));\n    };\n\n    XMLStringifier.prototype.cdata = function(val) {\n      val = '' + val || '';\n      val = val.replace(']]>', ']]]]><![CDATA[>');\n      return this.assertLegalChar(val);\n    };\n\n    XMLStringifier.prototype.comment = function(val) {\n      val = '' + val || '';\n      if (val.match(/--/)) {\n        throw new Error(\"Comment text cannot contain double-hypen: \" + val);\n      }\n      return this.assertLegalChar(val);\n    };\n\n    XMLStringifier.prototype.raw = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.attName = function(val) {\n      return val = '' + val || '';\n    };\n\n    XMLStringifier.prototype.attValue = function(val) {\n      val = '' + val || '';\n      return this.attEscape(val);\n    };\n\n    XMLStringifier.prototype.insTarget = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.insValue = function(val) {\n      val = '' + val || '';\n      if (val.match(/\\?>/)) {\n        throw new Error(\"Invalid processing instruction value: \" + val);\n      }\n      return val;\n    };\n\n    XMLStringifier.prototype.xmlVersion = function(val) {\n      val = '' + val || '';\n      if (!val.match(/1\\.[0-9]+/)) {\n        throw new Error(\"Invalid version number: \" + val);\n      }\n      return val;\n    };\n\n    XMLStringifier.prototype.xmlEncoding = function(val) {\n      val = '' + val || '';\n      if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-])*$/)) {\n        throw new Error(\"Invalid encoding: \" + val);\n      }\n      return val;\n    };\n\n    XMLStringifier.prototype.xmlStandalone = function(val) {\n      if (val) {\n        return \"yes\";\n      } else {\n        return \"no\";\n      }\n    };\n\n    XMLStringifier.prototype.dtdPubID = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.dtdSysID = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.dtdElementValue = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.dtdAttType = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.dtdAttDefault = function(val) {\n      if (val != null) {\n        return '' + val || '';\n      } else {\n        return val;\n      }\n    };\n\n    XMLStringifier.prototype.dtdEntityValue = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.dtdNData = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.convertAttKey = '@';\n\n    XMLStringifier.prototype.convertPIKey = '?';\n\n    XMLStringifier.prototype.convertTextKey = '#text';\n\n    XMLStringifier.prototype.convertCDataKey = '#cdata';\n\n    XMLStringifier.prototype.convertCommentKey = '#comment';\n\n    XMLStringifier.prototype.convertRawKey = '#raw';\n\n    XMLStringifier.prototype.assertLegalChar = function(str) {\n      var res;\n      res = str.match(/[\\0\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/);\n      if (res) {\n        throw new Error(\"Invalid character in string: \" + str + \" at index \" + res.index);\n      }\n      return str;\n    };\n\n    XMLStringifier.prototype.elEscape = function(str) {\n      var ampregex;\n      ampregex = this.noDoubleEncoding ? /(?!&\\S+;)&/g : /&/g;\n      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\\r/g, '&#xD;');\n    };\n\n    XMLStringifier.prototype.attEscape = function(str) {\n      var ampregex;\n      ampregex = this.noDoubleEncoding ? /(?!&\\S+;)&/g : /&/g;\n      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/\"/g, '&quot;').replace(/\\t/g, '&#x9;').replace(/\\n/g, '&#xA;').replace(/\\r/g, '&#xD;');\n    };\n\n    return XMLStringifier;\n\n  })();\n\n}).call(this);\n\n},{}],177:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLNode, XMLText,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLText = (function(superClass) {\n    extend(XMLText, superClass);\n\n    function XMLText(parent, text) {\n      XMLText.__super__.constructor.call(this, parent);\n      if (text == null) {\n        throw new Error(\"Missing element text. \" + this.debugInfo());\n      }\n      this.value = this.stringify.eleText(text);\n    }\n\n    XMLText.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLText.prototype.toString = function(options) {\n      return this.options.writer.set(options).text(this);\n    };\n\n    return XMLText;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],178:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLWriterBase,\n    hasProp = {}.hasOwnProperty;\n\n  module.exports = XMLWriterBase = (function() {\n    function XMLWriterBase(options) {\n      var key, ref, ref1, ref2, ref3, ref4, ref5, ref6, value;\n      options || (options = {});\n      this.pretty = options.pretty || false;\n      this.allowEmpty = (ref = options.allowEmpty) != null ? ref : false;\n      if (this.pretty) {\n        this.indent = (ref1 = options.indent) != null ? ref1 : '  ';\n        this.newline = (ref2 = options.newline) != null ? ref2 : '\\n';\n        this.offset = (ref3 = options.offset) != null ? ref3 : 0;\n        this.dontprettytextnodes = (ref4 = options.dontprettytextnodes) != null ? ref4 : 0;\n      } else {\n        this.indent = '';\n        this.newline = '';\n        this.offset = 0;\n        this.dontprettytextnodes = 0;\n      }\n      this.spacebeforeslash = (ref5 = options.spacebeforeslash) != null ? ref5 : '';\n      if (this.spacebeforeslash === true) {\n        this.spacebeforeslash = ' ';\n      }\n      this.newlinedefault = this.newline;\n      this.prettydefault = this.pretty;\n      ref6 = options.writer || {};\n      for (key in ref6) {\n        if (!hasProp.call(ref6, key)) continue;\n        value = ref6[key];\n        this[key] = value;\n      }\n    }\n\n    XMLWriterBase.prototype.set = function(options) {\n      var key, ref, value;\n      options || (options = {});\n      if (\"pretty\" in options) {\n        this.pretty = options.pretty;\n      }\n      if (\"allowEmpty\" in options) {\n        this.allowEmpty = options.allowEmpty;\n      }\n      if (this.pretty) {\n        this.indent = \"indent\" in options ? options.indent : '  ';\n        this.newline = \"newline\" in options ? options.newline : '\\n';\n        this.offset = \"offset\" in options ? options.offset : 0;\n        this.dontprettytextnodes = \"dontprettytextnodes\" in options ? options.dontprettytextnodes : 0;\n      } else {\n        this.indent = '';\n        this.newline = '';\n        this.offset = 0;\n        this.dontprettytextnodes = 0;\n      }\n      this.spacebeforeslash = \"spacebeforeslash\" in options ? options.spacebeforeslash : '';\n      if (this.spacebeforeslash === true) {\n        this.spacebeforeslash = ' ';\n      }\n      this.newlinedefault = this.newline;\n      this.prettydefault = this.pretty;\n      ref = options.writer || {};\n      for (key in ref) {\n        if (!hasProp.call(ref, key)) continue;\n        value = ref[key];\n        this[key] = value;\n      }\n      return this;\n    };\n\n    XMLWriterBase.prototype.space = function(level) {\n      var indent;\n      if (this.pretty) {\n        indent = (level || 0) + this.offset + 1;\n        if (indent > 0) {\n          return new Array(indent).join(this.indent);\n        } else {\n          return '';\n        }\n      } else {\n        return '';\n      }\n    };\n\n    return XMLWriterBase;\n\n  })();\n\n}).call(this);\n\n},{}],179:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDocument, XMLDocumentCB, XMLStreamWriter, XMLStringWriter, assign, isFunction, ref;\n\n  ref = require('./Utility'), assign = ref.assign, isFunction = ref.isFunction;\n\n  XMLDocument = require('./XMLDocument');\n\n  XMLDocumentCB = require('./XMLDocumentCB');\n\n  XMLStringWriter = require('./XMLStringWriter');\n\n  XMLStreamWriter = require('./XMLStreamWriter');\n\n  module.exports.create = function(name, xmldec, doctype, options) {\n    var doc, root;\n    if (name == null) {\n      throw new Error(\"Root element needs a name.\");\n    }\n    options = assign({}, xmldec, doctype, options);\n    doc = new XMLDocument(options);\n    root = doc.element(name);\n    if (!options.headless) {\n      doc.declaration(options);\n      if ((options.pubID != null) || (options.sysID != null)) {\n        doc.doctype(options);\n      }\n    }\n    return root;\n  };\n\n  module.exports.begin = function(options, onData, onEnd) {\n    var ref1;\n    if (isFunction(options)) {\n      ref1 = [options, onData], onData = ref1[0], onEnd = ref1[1];\n      options = {};\n    }\n    if (onData) {\n      return new XMLDocumentCB(options, onData, onEnd);\n    } else {\n      return new XMLDocument(options);\n    }\n  };\n\n  module.exports.stringWriter = function(options) {\n    return new XMLStringWriter(options);\n  };\n\n  module.exports.streamWriter = function(stream, options) {\n    return new XMLStreamWriter(stream, options);\n  };\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLDocument\":168,\"./XMLDocumentCB\":169,\"./XMLStreamWriter\":174,\"./XMLStringWriter\":175}]},{},[21])(21)\n});"
  },
  {
    "path": "example/pages/include/docxjs/jszip-utils.js",
    "content": "/*!\n\nJSZipUtils - A collection of cross-browser utilities to go along with JSZip.\n<http://stuk.github.io/jszip-utils>\n\n(c) 2014 Stuart Knightley, David Duponchel\nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip-utils/master/LICENSE.markdown.\n\n*/\n!function(e){\"object\"==typeof exports?module.exports=e():\"function\"==typeof define&&define.amd?define(e):\"undefined\"!=typeof window?window.JSZipUtils=e():\"undefined\"!=typeof global?global.JSZipUtils=e():\"undefined\"!=typeof self&&(self.JSZipUtils=e())}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error(\"Cannot find module '\"+o+\"'\")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n'use strict';\n\nvar JSZipUtils = {};\n// just use the responseText with xhr1, response with xhr2.\n// The transformation doesn't throw away high-order byte (with responseText)\n// because JSZip handles that case. If not used with JSZip, you may need to\n// do it, see https://developer.mozilla.org/En/Using_XMLHttpRequest#Handling_binary_data\nJSZipUtils._getBinaryFromXHR = function (xhr) {\n    // for xhr.responseText, the 0xFF mask is applied by JSZip\n    return xhr.response || xhr.responseText;\n};\n\n// taken from jQuery\nfunction createStandardXHR() {\n    try {\n        return new window.XMLHttpRequest();\n    } catch( e ) {}\n}\n\nfunction createActiveXHR() {\n    try {\n        return new window.ActiveXObject(\"Microsoft.XMLHTTP\");\n    } catch( e ) {}\n}\n\n// Create the request object\nvar createXHR = window.ActiveXObject ?\n    /* Microsoft failed to properly\n     * implement the XMLHttpRequest in IE7 (can't request local files),\n     * so we use the ActiveXObject when it is available\n     * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n     * we need a fallback.\n     */\n    function() {\n    return createStandardXHR() || createActiveXHR();\n} :\n    // For all other browsers, use the standard XMLHttpRequest object\n    createStandardXHR;\n\n\n\nJSZipUtils.getBinaryContent = function(path, callback) {\n    /*\n     * Here is the tricky part : getting the data.\n     * In firefox/chrome/opera/... setting the mimeType to 'text/plain; charset=x-user-defined'\n     * is enough, the result is in the standard xhr.responseText.\n     * cf https://developer.mozilla.org/En/XMLHttpRequest/Using_XMLHttpRequest#Receiving_binary_data_in_older_browsers\n     * In IE <= 9, we must use (the IE only) attribute responseBody\n     * (for binary data, its content is different from responseText).\n     * In IE 10, the 'charset=x-user-defined' trick doesn't work, only the\n     * responseType will work :\n     * http://msdn.microsoft.com/en-us/library/ie/hh673569%28v=vs.85%29.aspx#Binary_Object_upload_and_download\n     *\n     * I'd like to use jQuery to avoid this XHR madness, but it doesn't support\n     * the responseType attribute : http://bugs.jquery.com/ticket/11461\n     */\n    try {\n\n        var xhr = createXHR();\n\n        xhr.open('GET', path, true);\n\n        // recent browsers\n        if (\"responseType\" in xhr) {\n            xhr.responseType = \"arraybuffer\";\n        }\n\n        // older browser\n        if(xhr.overrideMimeType) {\n            xhr.overrideMimeType(\"text/plain; charset=x-user-defined\");\n        }\n\n        xhr.onreadystatechange = function(evt) {\n            var file, err;\n            // use `xhr` and not `this`... thanks IE\n            if (xhr.readyState === 4) {\n                if (xhr.status === 200 || xhr.status === 0) {\n                    file = null;\n                    err = null;\n                    try {\n                        file = JSZipUtils._getBinaryFromXHR(xhr);\n                    } catch(e) {\n                        err = new Error(e);\n                    }\n                    callback(err, file);\n                } else {\n                    callback(new Error(\"Ajax error for \" + path + \" : \" + this.status + \" \" + this.statusText), null);\n                }\n            }\n        };\n\n        xhr.send();\n\n    } catch (e) {\n        callback(new Error(e), null);\n    }\n};\n\n// export\nmodule.exports = JSZipUtils;\n\n// enforcing Stuk's coding style\n// vim: set shiftwidth=4 softtabstop=4:\n\n},{}]},{},[1])\n(1)\n});\n;"
  },
  {
    "path": "example/pages/include/docxjs/mammoth.browser.js",
    "content": "// Module: base64-js@1.2.0\n// License: MIT\n//\n// Module: bluebird@3.4.7\n// License: MIT\n//\n// Module: buffer-shims@1.0.0\n// License: MIT\n//\n// Module: buffer@4.9.1\n// License: MIT\n//\n// Module: core-util-is@1.0.2\n// License: MIT\n//\n// Module: events@1.1.1\n// License: MIT\n//\n// Module: ieee754@1.1.8\n// License: BSD-3-Clause\n//\n// Module: inherits@2.0.1\n// License: ISC\n//\n// Module: inherits@2.0.3\n// License: ISC\n//\n// Module: isarray@1.0.0\n// License: MIT\n//\n// Module: jszip@2.5.0\n// License: MIT or GPLv3\n//\n// Module: lop@0.4.0\n// License: BSD\n//\n// Module: mammoth@1.4.7\n// License: BSD-2-Clause\n//\n// Module: option@0.2.3\n// License: BSD\n//\n// Module: pako@0.2.9\n// License: MIT\n//\n// Module: path-browserify@0.0.0\n// License: MIT\n//\n// Module: process-nextick-args@1.0.7\n// License: MIT\n//\n// Module: process@0.11.9\n// License: MIT\n//\n// Module: readable-stream@2.2.6\n// License: MIT\n//\n// Module: sax@1.1.6\n// License: ISC\n//\n// Module: stream-browserify@2.0.1\n// License: MIT\n//\n// Module: string_decoder@0.10.31\n// License: MIT\n//\n// Module: underscore@1.4.4\n// License: MIT\n//\n// Module: underscore@1.8.3\n// License: MIT\n//\n// Module: util-deprecate@1.0.2\n// License: MIT\n//\n// Module: util@0.10.3\n// License: MIT\n//\n// Module: xmlbuilder@10.0.0\n// License: MIT\n//\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.mammoth = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\nvar promises = require(\"../../lib/promises\");\n\nexports.Files = Files;\n\n\nfunction Files() {\n    function read(uri) {\n        return promises.reject(new Error(\"could not open external image: '\" + uri + \"'\\ncannot open linked files from a web browser\"));\n    }\n    \n    return {\n        read: read\n    };\n}\n\n},{\"../../lib/promises\":23}],2:[function(require,module,exports){\nvar promises = require(\"../lib/promises\");\nvar zipfile = require(\"../lib/zipfile\");\n\nexports.openZip = openZip;\n\nfunction openZip(options) {\n    if (options.arrayBuffer) {\n        return promises.resolve(zipfile.openArrayBuffer(options.arrayBuffer));\n    } else {\n        return promises.reject(new Error(\"Could not find file in options\"));\n    }\n}\n\n},{\"../lib/promises\":23,\"../lib/zipfile\":38}],3:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar promises = require(\"./promises\");\nvar documents = require(\"./documents\");\nvar htmlPaths = require(\"./styles/html-paths\");\nvar results = require(\"./results\");\nvar images = require(\"./images\");\nvar Html = require(\"./html\");\nvar writers = require(\"./writers\");\n\nexports.DocumentConverter = DocumentConverter;\n\n\nfunction DocumentConverter(options) {\n    return {\n        convertToHtml: function(element) {\n            var comments = _.indexBy(\n                element.type === documents.types.document ? element.comments : [],\n                \"commentId\"\n            );\n            var conversion = new DocumentConversion(options, comments);\n            return conversion.convertToHtml(element);\n        }\n    };\n}\n\nfunction DocumentConversion(options, comments) {\n    var noteNumber = 1;\n    \n    var noteReferences = [];\n    \n    var referencedComments = [];\n    \n    options = _.extend({ignoreEmptyParagraphs: true}, options);\n    var idPrefix = options.idPrefix === undefined ? \"\" : options.idPrefix;\n    var ignoreEmptyParagraphs = options.ignoreEmptyParagraphs;\n    \n    var defaultParagraphStyle = htmlPaths.topLevelElement(\"p\");\n    \n    var styleMap = options.styleMap || [];\n    \n    function convertToHtml(document) {\n        var messages = [];\n        \n        var html = elementToHtml(document, messages, {});\n        \n        var deferredNodes = [];\n        walkHtml(html, function(node) {\n            if (node.type === \"deferred\") {\n                deferredNodes.push(node);\n            }\n        });\n        var deferredValues = {};\n        return promises.mapSeries(deferredNodes, function(deferred) {\n            return deferred.value().then(function(value) {\n                deferredValues[deferred.id] = value;\n            });\n        }).then(function() {\n            function replaceDeferred(nodes) {\n                return flatMap(nodes, function(node) {\n                    if (node.type === \"deferred\") {\n                        return deferredValues[node.id];\n                    } else if (node.children) {\n                        return [\n                            _.extend({}, node, {\n                                children: replaceDeferred(node.children)\n                            })\n                        ];\n                    } else {\n                        return [node];\n                    }\n                });\n            }\n            var writer = writers.writer({\n                prettyPrint: options.prettyPrint,\n                outputFormat: options.outputFormat\n            });\n            Html.write(writer, Html.simplify(replaceDeferred(html)));\n            return new results.Result(writer.asString(), messages);\n        });\n    }\n    \n    function convertElements(elements, messages, options) {\n        return flatMap(elements, function(element) {\n            return elementToHtml(element, messages, options);\n        });\n    }\n\n    function elementToHtml(element, messages, options) {\n        if (!options) {\n            throw new Error(\"options not set\");\n        }\n        var handler = elementConverters[element.type];\n        if (handler) {\n            return handler(element, messages, options);\n        } else {\n            return [];\n        }\n    }\n    \n    function convertParagraph(element, messages, options) {\n        return htmlPathForParagraph(element, messages).wrap(function() {\n            var content = convertElements(element.children, messages, options);\n            if (ignoreEmptyParagraphs) {\n                return content;\n            } else {\n                return [Html.forceWrite].concat(content);\n            }\n        });\n    }\n    \n    function htmlPathForParagraph(element, messages) {\n        var style = findStyle(element);\n        \n        if (style) {\n            return style.to;\n        } else {\n            if (element.styleId) {\n                messages.push(unrecognisedStyleWarning(\"paragraph\", element));\n            }\n            return defaultParagraphStyle;\n        }\n    }\n    \n    function convertRun(run, messages, options) {\n        var nodes = function() {\n            return convertElements(run.children, messages, options);\n        };\n        var paths = [];\n        if (run.isSmallCaps) {\n            paths.push(findHtmlPathForRunProperty(\"smallCaps\"));\n        }\n        if (run.isStrikethrough) {\n            paths.push(findHtmlPathForRunProperty(\"strikethrough\", \"s\"));\n        }\n        if (run.isUnderline) {\n            paths.push(findHtmlPathForRunProperty(\"underline\"));\n        }\n        if (run.verticalAlignment === documents.verticalAlignment.subscript) {\n            paths.push(htmlPaths.element(\"sub\", {}, {fresh: false}));\n        }\n        if (run.verticalAlignment === documents.verticalAlignment.superscript) {\n            paths.push(htmlPaths.element(\"sup\", {}, {fresh: false}));\n        }\n        if (run.isItalic) {\n            paths.push(findHtmlPathForRunProperty(\"italic\", \"em\"));\n        }\n        if (run.isBold) {\n            paths.push(findHtmlPathForRunProperty(\"bold\", \"strong\"));\n        }\n        var stylePath = htmlPaths.empty;\n        var style = findStyle(run);\n        if (style) {\n            stylePath = style.to;\n        } else if (run.styleId) {\n            messages.push(unrecognisedStyleWarning(\"run\", run));\n        }\n        paths.push(stylePath);\n            \n        paths.forEach(function(path) {\n            nodes = path.wrap.bind(path, nodes);\n        });\n        \n        return nodes();\n    }\n    \n    function findHtmlPathForRunProperty(elementType, defaultTagName) {\n        var path = findHtmlPath({type: elementType});\n        if (path) {\n            return path;\n        } else if (defaultTagName) {\n            return htmlPaths.element(defaultTagName, {}, {fresh: false});\n        } else {\n            return htmlPaths.empty;\n        }\n    }\n    \n    function findHtmlPath(element, defaultPath) {\n        var style = findStyle(element);\n        return style ? style.to : defaultPath;\n    }\n    \n    function findStyle(element) {\n        for (var i = 0; i < styleMap.length; i++) {\n            if (styleMap[i].from.matches(element)) {\n                return styleMap[i];\n            }\n        }\n    }\n    \n    function recoveringConvertImage(convertImage) {\n        return function(image, messages) {\n            return promises.attempt(function() {\n                return convertImage(image, messages);\n            }).caught(function(error) {\n                messages.push(results.error(error));\n                return [];\n            });\n        };\n    }\n\n    function noteHtmlId(note) {\n        return referentHtmlId(note.noteType, note.noteId);\n    }\n    \n    function noteRefHtmlId(note) {\n        return referenceHtmlId(note.noteType, note.noteId);\n    }\n    \n    function referentHtmlId(referenceType, referenceId) {\n        return htmlId(referenceType + \"-\" + referenceId);\n    }\n    \n    function referenceHtmlId(referenceType, referenceId) {\n        return htmlId(referenceType + \"-ref-\" + referenceId);\n    }\n    \n    function htmlId(suffix) {\n        return idPrefix + suffix;\n    }\n    \n    var defaultTablePath = htmlPaths.elements([\n        htmlPaths.element(\"table\", {}, {fresh: true})\n    ]);\n\n    function convertTable(element, messages, options) {\n        return findHtmlPath(element, defaultTablePath).wrap(function() {\n            return convertTableChildren(element, messages, options);\n        });\n    }\n\n    function convertTableChildren(element, messages, options) {\n        var bodyIndex = _.findIndex(element.children, function(child) {\n            return !child.type === documents.types.tableRow || !child.isHeader;\n        });\n        if (bodyIndex === -1) {\n            bodyIndex = element.children.length;\n        }\n        var children;\n        if (bodyIndex === 0) {\n            children = convertElements(\n                element.children,\n                messages,\n                _.extend({}, options, {isTableHeader: false})\n            );\n        } else {\n            var headRows = convertElements(\n                element.children.slice(0, bodyIndex),\n                messages,\n                _.extend({}, options, {isTableHeader: true})\n            );\n            var bodyRows = convertElements(\n                element.children.slice(bodyIndex),\n                messages,\n                _.extend({}, options, {isTableHeader: false})\n            );\n            children = [\n                Html.freshElement(\"thead\", {}, headRows),\n                Html.freshElement(\"tbody\", {}, bodyRows)\n            ];\n        }\n        return [Html.forceWrite].concat(children);\n    }\n    \n    function convertTableRow(element, messages, options) {\n        return wrapChildrenInFreshElement(element, \"tr\", messages, options);\n    }\n    \n    function convertTableCell(element, messages, options) {\n        var tagName = options.isTableHeader ? \"th\" : \"td\";\n        var children = convertElements(element.children, messages, options);\n        var attributes = {};\n        if (element.colSpan !== 1) {\n            attributes.colspan = element.colSpan.toString();\n        }\n        if (element.rowSpan !== 1) {\n            attributes.rowspan = element.rowSpan.toString();\n        }\n            \n        return [\n            Html.freshElement(tagName, attributes, [Html.forceWrite].concat(children))\n        ];\n    }\n    \n    function convertCommentReference(reference, messages, options) {\n        return findHtmlPath(reference, htmlPaths.ignore).wrap(function() {\n            var comment = comments[reference.commentId];\n            var count = referencedComments.length + 1;\n            var label = \"[\" + commentAuthorLabel(comment) + count + \"]\";\n            referencedComments.push({label: label, comment: comment});\n            // TODO: remove duplication with note references\n            return [\n                Html.freshElement(\"a\", {\n                    href: \"#\" + referentHtmlId(\"comment\", reference.commentId),\n                    id: referenceHtmlId(\"comment\", reference.commentId)\n                }, [Html.text(label)])\n            ];\n        });\n    }\n    \n    function convertComment(referencedComment, messages, options) {\n        // TODO: remove duplication with note references\n        \n        var label = referencedComment.label;\n        var comment = referencedComment.comment;\n        var body = convertElements(comment.body, messages, options).concat([\n            Html.nonFreshElement(\"p\", {}, [\n                Html.text(\" \"),\n                Html.freshElement(\"a\", {\"href\": \"#\" + referenceHtmlId(\"comment\", comment.commentId)}, [\n                    Html.text(\"↑\")\n                ])\n            ])\n        ]);\n        \n        return [\n            Html.freshElement(\n                \"dt\",\n                {\"id\": referentHtmlId(\"comment\", comment.commentId)},\n                [Html.text(\"Comment \" + label)]\n            ),\n            Html.freshElement(\"dd\", {}, body)\n        ];\n    }\n    \n    function convertBreak(element, messages, options) {\n        return htmlPathForBreak(element).wrap(function() {\n            return [];\n        });\n    }\n    \n    function htmlPathForBreak(element) {\n        var style = findStyle(element);\n        if (style) {\n            return style.to;\n        } else if (element.breakType === \"line\") {\n            return htmlPaths.topLevelElement(\"br\");\n        } else {\n            return htmlPaths.empty;\n        }\n    }\n    \n    function wrapChildrenInFreshElement(element, wrapElementName, messages, options) {\n        var children = convertElements(element.children, messages, options);\n        return [\n            Html.freshElement(wrapElementName, {}, [Html.forceWrite].concat(children))\n        ];\n    }\n\n    var elementConverters = {\n        \"document\": function(document, messages, options) {\n            var children = convertElements(document.children, messages, options);\n            var notes = noteReferences.map(function(noteReference) {\n                return document.notes.resolve(noteReference);\n            });\n            var notesNodes = convertElements(notes, messages, options);\n            return children.concat([\n                Html.freshElement(\"ol\", {}, notesNodes),\n                Html.freshElement(\"dl\", {}, flatMap(referencedComments, function(referencedComment) {\n                    return convertComment(referencedComment, messages, options);\n                }))\n            ]);\n        },\n        \"paragraph\": convertParagraph,\n        \"run\": convertRun,\n        \"text\": function(element, messages, options) {\n            return [Html.text(element.value)];\n        },\n        \"tab\": function(element, messages, options) {\n            return [Html.text(\"\\t\")];\n        },\n        \"hyperlink\": function(element, messages, options) {\n            var href = element.anchor ? \"#\" + htmlId(element.anchor) : element.href;\n            var attributes = {href: href};\n            if (element.targetFrame != null) {\n                attributes.target = element.targetFrame;\n            }\n\n            var children = convertElements(element.children, messages, options);\n            return [Html.freshElement(\"a\", attributes, children)];\n        },\n        \"bookmarkStart\": function(element, messages, options) {\n            var anchor = Html.freshElement(\"a\", {\n                id: htmlId(element.name)\n            }, [Html.forceWrite]);\n            return [anchor];\n        },\n        \"noteReference\": function(element, messages, options) {\n            noteReferences.push(element);\n            var anchor = Html.freshElement(\"a\", {\n                href: \"#\" + noteHtmlId(element),\n                id: noteRefHtmlId(element)\n            }, [Html.text(\"[\" + (noteNumber++) + \"]\")]);\n            \n            return [Html.freshElement(\"sup\", {}, [anchor])];\n        },\n        \"note\": function(element, messages, options) {\n            var children = convertElements(element.body, messages, options);\n            var backLink = Html.elementWithTag(htmlPaths.element(\"p\", {}, {fresh: false}), [\n                Html.text(\" \"),\n                Html.freshElement(\"a\", {href: \"#\" + noteRefHtmlId(element)}, [Html.text(\"↑\")])\n            ]);\n            var body = children.concat([backLink]);\n            \n            return Html.freshElement(\"li\", {id: noteHtmlId(element)}, body);\n        },\n        \"commentReference\": convertCommentReference,\n        \"comment\": convertComment,\n        \"image\": deferredConversion(recoveringConvertImage(options.convertImage || images.dataUri)),\n        \"table\": convertTable,\n        \"tableRow\": convertTableRow,\n        \"tableCell\": convertTableCell,\n        \"break\": convertBreak\n    };\n    return {\n        convertToHtml: convertToHtml\n    };\n}\n\nvar deferredId = 1;\n\nfunction deferredConversion(func) {\n    return function(element, messages, options) {\n        return [\n            {\n                type: \"deferred\",\n                id: deferredId++,\n                value: function() {\n                    return func(element, messages, options);\n                }\n            }\n        ];\n    };\n}\n\nfunction unrecognisedStyleWarning(type, element) {\n    return results.warning(\n        \"Unrecognised \" + type + \" style: '\" + element.styleName + \"'\" +\n        \" (Style ID: \" + element.styleId + \")\"\n    );\n}\n\nfunction flatMap(values, func) {\n    return _.flatten(values.map(func), true);\n}\n\nfunction walkHtml(nodes, callback) {\n    nodes.forEach(function(node) {\n        callback(node);\n        if (node.children) {\n            walkHtml(node.children, callback);\n        }\n    });\n}\n\nvar commentAuthorLabel = exports.commentAuthorLabel = function commentAuthorLabel(comment) {\n    return comment.authorInitials || \"\";\n};\n\n},{\"./documents\":4,\"./html\":18,\"./images\":20,\"./promises\":23,\"./results\":24,\"./styles/html-paths\":27,\"./writers\":32,\"underscore\":153}],4:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar types = exports.types = {\n    document: \"document\",\n    paragraph: \"paragraph\",\n    run: \"run\",\n    text: \"text\",\n    tab: \"tab\",\n    hyperlink: \"hyperlink\",\n    noteReference: \"noteReference\",\n    image: \"image\",\n    note: \"note\",\n    commentReference: \"commentReference\",\n    comment: \"comment\",\n    table: \"table\",\n    tableRow: \"tableRow\",\n    tableCell: \"tableCell\",\n    \"break\": \"break\",\n    bookmarkStart: \"bookmarkStart\"\n};\n\nfunction Document(children, options) {\n    options = options || {};\n    return {\n        type: types.document,\n        children: children,\n        notes: options.notes || new Notes({}),\n        comments: options.comments || []\n    };\n}\n\nfunction Paragraph(children, properties) {\n    properties = properties || {};\n    var indent = properties.indent || {};\n    return {\n        type: types.paragraph,\n        children: children,\n        styleId: properties.styleId || null,\n        styleName: properties.styleName || null,\n        numbering: properties.numbering || null,\n        alignment: properties.alignment || null,\n        indent: {\n            start: indent.start || null,\n            end: indent.end || null,\n            firstLine: indent.firstLine || null,\n            hanging: indent.hanging || null\n        }\n    };\n}\n\nfunction Run(children, properties) {\n    properties = properties || {};\n    return {\n        type: types.run,\n        children: children,\n        styleId: properties.styleId || null,\n        styleName: properties.styleName || null,\n        isBold: properties.isBold,\n        isUnderline: properties.isUnderline,\n        isItalic: properties.isItalic,\n        isStrikethrough: properties.isStrikethrough,\n        isSmallCaps: properties.isSmallCaps,\n        verticalAlignment: properties.verticalAlignment || verticalAlignment.baseline,\n        font: properties.font || null\n    };\n}\n\nvar verticalAlignment = {\n    baseline: \"baseline\",\n    superscript: \"superscript\",\n    subscript: \"subscript\"\n};\n\nfunction Text(value) {\n    return {\n        type: types.text,\n        value: value\n    };\n}\n\nfunction Tab() {\n    return {\n        type: types.tab\n    };\n}\n\nfunction Hyperlink(children, options) {\n    return {\n        type: types.hyperlink,\n        children: children,\n        href: options.href,\n        anchor: options.anchor,\n        targetFrame: options.targetFrame\n    };\n}\n\nfunction NoteReference(options) {\n    return {\n        type: types.noteReference,\n        noteType: options.noteType,\n        noteId: options.noteId\n    };\n}\n\nfunction Notes(notes) {\n    this._notes = _.indexBy(notes, function(note) {\n        return noteKey(note.noteType, note.noteId);\n    });\n}\n\nNotes.prototype.resolve = function(reference) {\n    return this.findNoteByKey(noteKey(reference.noteType, reference.noteId));\n};\n\nNotes.prototype.findNoteByKey = function(key) {\n    return this._notes[key] || null;\n};\n\nfunction Note(options) {\n    return {\n        type: types.note,\n        noteType: options.noteType,\n        noteId: options.noteId,\n        body: options.body\n    };\n}\n\nfunction commentReference(options) {\n    return {\n        type: types.commentReference,\n        commentId: options.commentId\n    };\n}\n\nfunction comment(options) {\n    return {\n        type: types.comment,\n        commentId: options.commentId,\n        body: options.body,\n        authorName: options.authorName,\n        authorInitials: options.authorInitials\n    };\n}\n\nfunction noteKey(noteType, id) {\n    return noteType + \"-\" + id;\n}\n\nfunction Image(options) {\n    return {\n        type: types.image,\n        read: options.readImage,\n        altText: options.altText,\n        contentType: options.contentType\n    };\n}\n\nfunction Table(children, properties) {\n    properties = properties || {};\n    return {\n        type: types.table,\n        children: children,\n        styleId: properties.styleId || null,\n        styleName: properties.styleName || null\n    };\n}\n\nfunction TableRow(children, options) {\n    options = options || {};\n    return {\n        type: types.tableRow,\n        children: children,\n        isHeader: options.isHeader || false\n    };\n}\n\nfunction TableCell(children, options) {\n    options = options || {};\n    return {\n        type: types.tableCell,\n        children: children,\n        colSpan: options.colSpan == null ? 1 : options.colSpan,\n        rowSpan: options.rowSpan == null ? 1 : options.rowSpan\n    };\n}\n\nfunction Break(breakType) {\n    return {\n        type: types[\"break\"],\n        breakType: breakType\n    };\n}\n\nfunction BookmarkStart(options) {\n    return {\n        type: types.bookmarkStart,\n        name: options.name\n    };\n}\n\nexports.document = exports.Document = Document;\nexports.paragraph = exports.Paragraph = Paragraph;\nexports.run = exports.Run = Run;\nexports.Text = Text;\nexports.tab = exports.Tab = Tab;\nexports.Hyperlink = Hyperlink;\nexports.noteReference = exports.NoteReference = NoteReference;\nexports.Notes = Notes;\nexports.Note = Note;\nexports.commentReference = commentReference;\nexports.comment = comment;\nexports.Image = Image;\nexports.Table = Table;\nexports.TableRow = TableRow;\nexports.TableCell = TableCell;\nexports.lineBreak = Break(\"line\");\nexports.pageBreak = Break(\"page\");\nexports.columnBreak = Break(\"column\");\nexports.BookmarkStart = BookmarkStart;\n\nexports.verticalAlignment = verticalAlignment;\n\n},{\"underscore\":153}],5:[function(require,module,exports){\nexports.createBodyReader = createBodyReader;\nexports._readNumberingProperties = readNumberingProperties;\n\nvar _ = require(\"underscore\");\n\nvar documents = require(\"../documents\");\nvar Result = require(\"../results\").Result;\nvar warning = require(\"../results\").warning;\nvar uris = require(\"./uris\");\n\nfunction createBodyReader(options) {\n    return {\n        readXmlElement: function(element) {\n            return new BodyReader(options).readXmlElement(element);\n        },\n        readXmlElements: function(elements) {\n            return new BodyReader(options).readXmlElements(elements);\n        }\n    };\n}\n\nfunction BodyReader(options) {\n    var complexFieldStack = [];\n    var currentInstrText = [];\n    var relationships = options.relationships;\n    var contentTypes = options.contentTypes;\n    var docxFile = options.docxFile;\n    var files = options.files;\n    var numbering = options.numbering;\n    var styles = options.styles;\n\n    function readXmlElements(elements) {\n        var results = elements.map(readXmlElement);\n        return combineResults(results);\n    }\n\n    function readXmlElement(element) {\n        if (element.type === \"element\") {\n            var handler = xmlElementReaders[element.name];\n            if (handler) {\n                return handler(element);\n            } else if (!Object.prototype.hasOwnProperty.call(ignoreElements, element.name)) {\n                var message = warning(\"An unrecognised element was ignored: \" + element.name);\n                return emptyResultWithMessages([message]);\n            }\n        }\n        return emptyResult();\n    }\n    \n    function readParagraphIndent(element) {\n        return {\n            start: element.attributes[\"w:start\"] || element.attributes[\"w:left\"],\n            end: element.attributes[\"w:end\"] || element.attributes[\"w:right\"],\n            firstLine: element.attributes[\"w:firstLine\"],\n            hanging: element.attributes[\"w:hanging\"]\n        };\n    }\n    \n    function readRunProperties(element) {\n        return readRunStyle(element).map(function(style) {\n            return {\n                type: \"runProperties\",\n                styleId: style.styleId,\n                styleName: style.name,\n                verticalAlignment: element.firstOrEmpty(\"w:vertAlign\").attributes[\"w:val\"],\n                font: element.firstOrEmpty(\"w:rFonts\").attributes[\"w:ascii\"],\n                isBold: readBooleanElement(element.first(\"w:b\")),\n                isUnderline: readBooleanElement(element.first(\"w:u\")),\n                isItalic: readBooleanElement(element.first(\"w:i\")),\n                isStrikethrough: readBooleanElement(element.first(\"w:strike\")),\n                isSmallCaps: readBooleanElement(element.first(\"w:smallCaps\"))\n            };\n        });\n    }\n    \n    function readBooleanElement(element) {\n        if (element) {\n            var value = element.attributes[\"w:val\"];\n            return value !== \"false\" && value !== \"0\";\n        } else {\n            return false;\n        }\n    }\n    \n    function readParagraphStyle(element) {\n        return readStyle(element, \"w:pStyle\", \"Paragraph\", styles.findParagraphStyleById);\n    }\n    \n    function readRunStyle(element) {\n        return readStyle(element, \"w:rStyle\", \"Run\", styles.findCharacterStyleById);\n    }\n    \n    function readTableStyle(element) {\n        return readStyle(element, \"w:tblStyle\", \"Table\", styles.findTableStyleById);\n    }\n    \n    function readStyle(element, styleTagName, styleType, findStyleById) {\n        var messages = [];\n        var styleElement = element.first(styleTagName);\n        var styleId = null;\n        var name = null;\n        if (styleElement) {\n            styleId = styleElement.attributes[\"w:val\"];\n            if (styleId) {\n                var style = findStyleById(styleId);\n                if (style) {\n                    name = style.name;\n                } else {\n                    messages.push(undefinedStyleWarning(styleType, styleId));\n                }\n            }\n        }\n        return elementResultWithMessages({styleId: styleId, name: name}, messages);\n    }\n    \n    var unknownComplexField = {type: \"unknown\"};\n    \n    function readFldChar(element) {\n        var type = element.attributes[\"w:fldCharType\"];\n        if (type === \"begin\") {\n            complexFieldStack.push(unknownComplexField);\n            currentInstrText = [];\n        } else if (type === \"end\") {\n            complexFieldStack.pop();\n        } else if (type === \"separate\") {\n            var href = parseHyperlinkFieldCode(currentInstrText.join(''));\n            var complexField = href === null ? unknownComplexField : {type: \"hyperlink\", href: href};\n            complexFieldStack.pop();\n            complexFieldStack.push(complexField);\n        }\n        return emptyResult();\n    }\n    \n    function currentHyperlinkHref() {\n        var topHyperlink = _.last(complexFieldStack.filter(function(complexField) {\n            return complexField.type === \"hyperlink\";\n        }));\n        return topHyperlink ? topHyperlink.href : null;\n    }\n\n    function parseHyperlinkFieldCode(code) {\n        var result = /\\s*HYPERLINK \"(.*)\"/.exec(code);\n        if (result) {\n            return result[1];\n        } else {\n            return null;\n        }\n    }\n    \n    function readInstrText(element) {\n        currentInstrText.push(element.text());\n        return emptyResult();\n    }\n    \n    function noteReferenceReader(noteType) {\n        return function(element) {\n            var noteId = element.attributes[\"w:id\"];\n            return elementResult(new documents.NoteReference({\n                noteType: noteType,\n                noteId: noteId\n            }));\n        };\n    }\n    \n    function readCommentReference(element) {\n        return elementResult(documents.commentReference({\n            commentId: element.attributes[\"w:id\"]\n        }));\n    }\n    \n    function readChildElements(element) {\n        return readXmlElements(element.children);\n    }\n    \n    var xmlElementReaders = {\n        \"w:p\": function(element) {\n            return readXmlElements(element.children)\n                .map(function(children) {\n                    var properties = _.find(children, isParagraphProperties);\n                    return new documents.Paragraph(\n                        children.filter(negate(isParagraphProperties)),\n                        properties\n                    );\n                })\n                .insertExtra();\n        },\n        \"w:pPr\": function(element) {\n            return readParagraphStyle(element).map(function(style) {\n                return {\n                    type: \"paragraphProperties\",\n                    styleId: style.styleId,\n                    styleName: style.name,\n                    alignment: element.firstOrEmpty(\"w:jc\").attributes[\"w:val\"],\n                    numbering: readNumberingProperties(element.firstOrEmpty(\"w:numPr\"), numbering),\n                    indent: readParagraphIndent(element.firstOrEmpty(\"w:ind\"))\n                };\n            });\n        },\n        \"w:r\": function(element) {\n            return readXmlElements(element.children)\n                .map(function(children) {\n                    var properties = _.find(children, isRunProperties);\n                    children = children.filter(negate(isRunProperties));\n\n                    var hyperlinkHref = currentHyperlinkHref();\n                    if (hyperlinkHref !== null) {\n                        children = [new documents.Hyperlink(children, {href: hyperlinkHref})];\n                    }\n\n                    return new documents.Run(children, properties);\n                });\n        },\n        \"w:rPr\": readRunProperties,\n        \"w:fldChar\": readFldChar,\n        \"w:instrText\": readInstrText,\n        \"w:t\": function(element) {\n            return elementResult(new documents.Text(element.text()));\n        },\n        \"w:tab\": function(element) {\n            return elementResult(new documents.Tab());\n        },\n        \"w:noBreakHyphen\": function() {\n            return elementResult(new documents.Text(\"\\u2011\"));\n        },\n        \"w:hyperlink\": function(element) {\n            var relationshipId = element.attributes[\"r:id\"];\n            var anchor = element.attributes[\"w:anchor\"];\n            return readXmlElements(element.children).map(function(children) {\n                function create(options) {\n                    var targetFrame = element.attributes[\"w:tgtFrame\"] || null;\n                    \n                    return new documents.Hyperlink(\n                        children,\n                        _.extend({targetFrame: targetFrame}, options)\n                    );\n                }\n                \n                if (relationshipId) {\n                    var href = relationships.findTargetByRelationshipId(relationshipId);\n                    if (anchor) {\n                        href = uris.replaceFragment(href, anchor);\n                    }\n                    return create({href: href});\n                } else if (anchor) {\n                    return create({anchor: anchor});\n                } else {\n                    return children;\n                }\n            });\n        },\n        \"w:tbl\": readTable,\n        \"w:tr\": readTableRow,\n        \"w:tc\": readTableCell,\n        \"w:footnoteReference\": noteReferenceReader(\"footnote\"),\n        \"w:endnoteReference\": noteReferenceReader(\"endnote\"),\n        \"w:commentReference\": readCommentReference,\n        \"w:br\": function(element) {\n            var breakType = element.attributes[\"w:type\"];\n            if (breakType == null || breakType === \"textWrapping\") {\n                return elementResult(documents.lineBreak);\n            } else if (breakType === \"page\") {\n                return elementResult(documents.pageBreak);\n            } else if (breakType === \"column\") {\n                return elementResult(documents.columnBreak);\n            } else {\n                return emptyResultWithMessages([warning(\"Unsupported break type: \" + breakType)]);\n            }\n        },\n        \"w:bookmarkStart\": function(element){\n            var name = element.attributes[\"w:name\"];\n            if (name === \"_GoBack\") {\n                return emptyResult();\n            } else {\n                return elementResult(new documents.BookmarkStart({name: name}));\n            }\n        },\n        \n        \"mc:AlternateContent\": function(element) {\n            return readChildElements(element.first(\"mc:Fallback\"));\n        },\n        \n        \"w:sdt\": function(element) {\n            return readXmlElements(element.firstOrEmpty(\"w:sdtContent\").children);\n        },\n\n        \"w:ins\": readChildElements,\n        \"w:object\": readChildElements,\n        \"w:smartTag\": readChildElements,\n        \"w:drawing\": readChildElements,\n        \"w:pict\": function(element) {\n            return readChildElements(element).toExtra();\n        },\n        \"v:roundrect\": readChildElements,\n        \"v:shape\": readChildElements,\n        \"v:textbox\": readChildElements,\n        \"w:txbxContent\": readChildElements,\n        \"wp:inline\": readDrawingElement,\n        \"wp:anchor\": readDrawingElement,\n        \"v:imagedata\": readImageData,\n        \"v:group\": readChildElements,\n        \"v:rect\": readChildElements\n    };\n    \n    return {\n        readXmlElement: readXmlElement,\n        readXmlElements: readXmlElements\n    };\n\n    \n    function readTable(element) {\n        var propertiesResult = readTableProperties(element.firstOrEmpty(\"w:tblPr\"));\n        return readXmlElements(element.children)\n            .flatMap(calculateRowSpans)\n            .flatMap(function(children) {\n                return propertiesResult.map(function(properties) {\n                    return documents.Table(children, properties);\n                });\n            });\n    }\n    \n    function readTableProperties(element) {\n        return readTableStyle(element).map(function(style) {\n            return {\n                styleId: style.styleId,\n                styleName: style.name\n            };\n        });\n    }\n    \n    function readTableRow(element) {\n        var properties = element.firstOrEmpty(\"w:trPr\");\n        var isHeader = !!properties.first(\"w:tblHeader\");\n        return readXmlElements(element.children).map(function(children) {\n            return documents.TableRow(children, {isHeader: isHeader});\n        });\n    }\n    \n    function readTableCell(element) {\n        return readXmlElements(element.children).map(function(children) {\n            var properties = element.firstOrEmpty(\"w:tcPr\");\n            \n            var gridSpan = properties.firstOrEmpty(\"w:gridSpan\").attributes[\"w:val\"];\n            var colSpan = gridSpan ? parseInt(gridSpan, 10) : 1;\n            \n            var cell = documents.TableCell(children, {colSpan: colSpan});\n            cell._vMerge = readVMerge(properties);\n            return cell;\n        });\n    }\n    \n    function readVMerge(properties) {\n        var element = properties.first(\"w:vMerge\");\n        if (element) {\n            var val = element.attributes[\"w:val\"];\n            return val === \"continue\" || !val;\n        } else {\n            return null;\n        }\n    }\n    \n    function calculateRowSpans(rows) {\n        var unexpectedNonRows = _.any(rows, function(row) {\n            return row.type !== documents.types.tableRow;\n        });\n        if (unexpectedNonRows) {\n            return elementResultWithMessages(rows, [warning(\n                \"unexpected non-row element in table, cell merging may be incorrect\"\n            )]);\n        }\n        var unexpectedNonCells = _.any(rows, function(row) {\n            return _.any(row.children, function(cell) {\n                return cell.type !== documents.types.tableCell;\n            });\n        });\n        if (unexpectedNonCells) {\n            return elementResultWithMessages(rows, [warning(\n                \"unexpected non-cell element in table row, cell merging may be incorrect\"\n            )]);\n        }\n        \n        var columns = {};\n        \n        rows.forEach(function(row) {\n            var cellIndex = 0;\n            row.children.forEach(function(cell) {\n                if (cell._vMerge && columns[cellIndex]) {\n                    columns[cellIndex].rowSpan++;\n                } else {\n                    columns[cellIndex] = cell;\n                    cell._vMerge = false;\n                }\n                cellIndex += cell.colSpan;\n            });\n        });\n        \n        rows.forEach(function(row) {\n            row.children = row.children.filter(function(cell) {\n                return !cell._vMerge;\n            });\n            row.children.forEach(function(cell) {\n                delete cell._vMerge;\n            });\n        });\n        \n        return elementResult(rows);\n    }\n\n    function readDrawingElement(element) {\n        var blips = element\n            .getElementsByTagName(\"a:graphic\")\n            .getElementsByTagName(\"a:graphicData\")\n            .getElementsByTagName(\"pic:pic\")\n            .getElementsByTagName(\"pic:blipFill\")\n            .getElementsByTagName(\"a:blip\");\n        \n        return combineResults(blips.map(readBlip.bind(null, element)));\n    }\n    \n    function readBlip(element, blip) {\n        var properties = element.first(\"wp:docPr\").attributes;\n        var altText = isBlank(properties.descr) ? properties.title : properties.descr;\n        return readImage(findBlipImageFile(blip), altText);\n    }\n    \n    function isBlank(value) {\n        return value == null || /^\\s*$/.test(value);\n    }\n    \n    function findBlipImageFile(blip) {\n        var embedRelationshipId = blip.attributes[\"r:embed\"];\n        var linkRelationshipId = blip.attributes[\"r:link\"];\n        if (embedRelationshipId) {\n            return findEmbeddedImageFile(embedRelationshipId);\n        } else {\n            var imagePath = relationships.findTargetByRelationshipId(linkRelationshipId);\n            return {\n                path: imagePath,\n                read: files.read.bind(files, imagePath)\n            };\n        }\n    }\n    \n    function readImageData(element) {\n        var relationshipId = element.attributes['r:id'];\n        \n        if (relationshipId) {\n            return readImage(\n                findEmbeddedImageFile(relationshipId),\n                element.attributes[\"o:title\"]);\n        } else {\n            return emptyResultWithMessages([warning(\"A v:imagedata element without a relationship ID was ignored\")]);\n        }\n    }\n    \n    function findEmbeddedImageFile(relationshipId) {\n        var path = uris.uriToZipEntryName(\"word\", relationships.findTargetByRelationshipId(relationshipId));\n        return {\n            path: path,\n            read: docxFile.read.bind(docxFile, path)\n        };\n    }\n    \n    function readImage(imageFile, altText) {\n        var contentType = contentTypes.findContentType(imageFile.path);\n        \n        var image = documents.Image({\n            readImage: imageFile.read,\n            altText: altText,\n            contentType: contentType\n        });\n        var warnings = supportedImageTypes[contentType] ?\n            [] : warning(\"Image of type \" + contentType + \" is unlikely to display in web browsers\");\n        return elementResultWithMessages(image, warnings);\n    }\n    \n    function undefinedStyleWarning(type, styleId) {\n        return warning(\n            type + \" style with ID \" + styleId + \" was referenced but not defined in the document\");\n    }\n}\n\n\nfunction readNumberingProperties(element, numbering) {\n    var level = element.firstOrEmpty(\"w:ilvl\").attributes[\"w:val\"];\n    var numId = element.firstOrEmpty(\"w:numId\").attributes[\"w:val\"];\n    if (level === undefined || numId === undefined) {\n        return null;\n    } else {\n        return numbering.findLevel(numId, level);\n    }\n}\n    \nvar supportedImageTypes = {\n    \"image/png\": true,\n    \"image/gif\": true,\n    \"image/jpeg\": true,\n    \"image/svg+xml\": true,\n    \"image/tiff\": true\n};\n\nvar ignoreElements = {\n    \"office-word:wrap\": true,\n    \"v:shadow\": true,\n    \"v:shapetype\": true,\n    \"w:annotationRef\": true,\n    \"w:bookmarkEnd\": true,\n    \"w:sectPr\": true,\n    \"w:proofErr\": true,\n    \"w:lastRenderedPageBreak\": true,\n    \"w:commentRangeStart\": true,\n    \"w:commentRangeEnd\": true,\n    \"w:del\": true,\n    \"w:footnoteRef\": true,\n    \"w:endnoteRef\": true,\n    \"w:tblPr\": true,\n    \"w:tblGrid\": true,\n    \"w:trPr\": true,\n    \"w:tcPr\": true\n};\n\nfunction isParagraphProperties(element) {\n    return element.type === \"paragraphProperties\";\n}\n\nfunction isRunProperties(element) {\n    return element.type === \"runProperties\";\n}\n\nfunction negate(predicate) {\n    return function(value) {\n        return !predicate(value);\n    };\n}\n\n\nfunction emptyResultWithMessages(messages) {\n    return new ReadResult(null, null, messages);\n}\n\nfunction emptyResult() {\n    return new ReadResult(null);\n}\n\nfunction elementResult(element) {\n    return new ReadResult(element);\n}\n\nfunction elementResultWithMessages(element, messages) {\n    return new ReadResult(element, null, messages);\n}\n\nfunction ReadResult(element, extra, messages) {\n    this.value = element || [];\n    this.extra = extra;\n    this._result = new Result({\n        element: this.value,\n        extra: extra\n    }, messages);\n    this.messages = this._result.messages;\n}\n\nReadResult.prototype.toExtra = function() {\n    return new ReadResult(null, joinElements(this.extra, this.value), this.messages);\n};\n\nReadResult.prototype.insertExtra = function() {\n    var extra = this.extra;\n    if (extra && extra.length) {\n        return new ReadResult(joinElements(this.value, extra), null, this.messages);\n    } else {\n        return this;\n    }\n};\n\nReadResult.prototype.map = function(func) {\n    var result = this._result.map(function(value) {\n        return func(value.element);\n    });\n    return new ReadResult(result.value, this.extra, result.messages);\n};\n\nReadResult.prototype.flatMap = function(func) {\n    var result = this._result.flatMap(function(value) {\n        return func(value.element)._result;\n    });\n    return new ReadResult(result.value.element, joinElements(this.extra, result.value.extra), result.messages);\n};\n\nfunction combineResults(results) {\n    var result = Result.combine(_.pluck(results, \"_result\"));\n    return new ReadResult(\n        _.flatten(_.pluck(result.value, \"element\")),\n        _.filter(_.flatten(_.pluck(result.value, \"extra\")), identity),\n        result.messages\n    );\n}\n\nfunction joinElements(first, second) {\n    return _.flatten([first, second]);\n}\n\nfunction identity(value) {\n    return value;\n}\n\n},{\"../documents\":4,\"../results\":24,\"./uris\":16,\"underscore\":153}],6:[function(require,module,exports){\nvar documents = require(\"../documents\");\nvar Result = require(\"../results\").Result;\n\nfunction createCommentsReader(bodyReader) {\n    function readCommentsXml(element) {\n        return Result.combine(element.getElementsByTagName(\"w:comment\")\n            .map(readCommentElement));\n    }\n\n    function readCommentElement(element) {\n        var id = element.attributes[\"w:id\"];\n\n        function readOptionalAttribute(name) {\n            return (element.attributes[name] || \"\").trim() || null;\n        }\n\n        return bodyReader.readXmlElements(element.children)\n            .map(function(body) {\n                return documents.comment({\n                    commentId: id,\n                    body: body,\n                    authorName: readOptionalAttribute(\"w:author\"),\n                    authorInitials: readOptionalAttribute(\"w:initials\")\n                });\n            });\n    }\n    \n    return readCommentsXml;\n}\n\nexports.createCommentsReader = createCommentsReader;\n\n},{\"../documents\":4,\"../results\":24}],7:[function(require,module,exports){\nexports.readContentTypesFromXml = readContentTypesFromXml;\n\nvar fallbackContentTypes = {\n    \"png\": \"png\",\n    \"gif\": \"gif\",\n    \"jpeg\": \"jpeg\",\n    \"jpg\": \"jpeg\",\n    \"tif\": \"tiff\",\n    \"tiff\": \"tiff\",\n    \"bmp\": \"bmp\"\n};\n\nexports.defaultContentTypes = contentTypes({}, {});\n\n\nfunction readContentTypesFromXml(element) {\n    var extensionDefaults = {};\n    var overrides = {};\n    \n    element.children.forEach(function(child) {\n        if (child.name === \"content-types:Default\") {\n            extensionDefaults[child.attributes.Extension] = child.attributes.ContentType;\n        }\n        if (child.name === \"content-types:Override\") {\n            var name = child.attributes.PartName;\n            if (name.charAt(0) === \"/\") {\n                name = name.substring(1);\n            }\n            overrides[name] = child.attributes.ContentType;\n        }\n    });\n    return contentTypes(overrides, extensionDefaults);\n}\n\nfunction contentTypes(overrides, extensionDefaults) {\n    return {\n        findContentType: function(path) {\n            var overrideContentType = overrides[path];\n            if (overrideContentType) {\n                return overrideContentType;\n            } else {\n                var pathParts = path.split(\".\");\n                var extension = pathParts[pathParts.length - 1];\n                if (extensionDefaults.hasOwnProperty(extension)) {\n                    return extensionDefaults[extension];\n                } else {\n                    var fallback = fallbackContentTypes[extension.toLowerCase()];\n                    if (fallback) {\n                        return \"image/\" + fallback;\n                    } else {\n                        return null;\n                    }\n                }\n            }\n        }\n    };\n    \n}\n\n},{}],8:[function(require,module,exports){\nexports.DocumentXmlReader = DocumentXmlReader;\n\nvar documents = require(\"../documents\");\nvar Result = require(\"../results\").Result;\n\n\nfunction DocumentXmlReader(options) {\n    var bodyReader = options.bodyReader;\n    \n    function convertXmlToDocument(element) {\n        var body = element.first(\"w:body\");\n        \n        var result = bodyReader.readXmlElements(body.children)\n            .map(function(children) {\n                return new documents.Document(children, {\n                    notes: options.notes,\n                    comments: options.comments\n                });\n            });\n        return new Result(result.value, result.messages);\n    }\n    \n    return {\n        convertXmlToDocument: convertXmlToDocument\n    };\n}\n\n},{\"../documents\":4,\"../results\":24}],9:[function(require,module,exports){\nexports.read = read;\nexports._findPartPaths = findPartPaths;\n\nvar path = require(\"path\");\n\nvar promises = require(\"../promises\");\nvar documents = require(\"../documents\");\nvar Result = require(\"../results\").Result;\nvar zipfile = require(\"../zipfile\");\n\nvar readXmlFromZipFile = require(\"./office-xml-reader\").readXmlFromZipFile;\nvar createBodyReader = require(\"./body-reader\").createBodyReader;\nvar DocumentXmlReader = require(\"./document-xml-reader\").DocumentXmlReader;\nvar relationshipsReader = require(\"./relationships-reader\");\nvar contentTypesReader = require(\"./content-types-reader\");\nvar numberingXml = require(\"./numbering-xml\");\nvar stylesReader = require(\"./styles-reader\");\nvar notesReader = require(\"./notes-reader\");\nvar commentsReader = require(\"./comments-reader\");\nvar Files = require(\"./files\").Files;\n\n\nfunction read(docxFile, input) {\n    input = input || {};\n    \n    return promises.props({\n        contentTypes: readContentTypesFromZipFile(docxFile),\n        partPaths: findPartPaths(docxFile),\n        docxFile: docxFile,\n        files: new Files(input.path ? path.dirname(input.path) : null)\n    }).also(function(result) {\n        return {\n            numbering: readNumberingFromZipFile(docxFile, result.partPaths.numbering),\n            styles: readStylesFromZipFile(docxFile, result.partPaths.styles)\n        };\n    }).also(function(result) {\n        return {\n            footnotes: readXmlFileWithBody(result.partPaths.footnotes, result, function(bodyReader, xml) {\n                if (xml) {\n                    return notesReader.createFootnotesReader(bodyReader)(xml);\n                } else {\n                    return new Result([]);\n                }\n            }),\n            endnotes: readXmlFileWithBody(result.partPaths.endnotes, result, function(bodyReader, xml) {\n                if (xml) {\n                    return notesReader.createEndnotesReader(bodyReader)(xml);\n                } else {\n                    return new Result([]);\n                }\n            }),\n            comments: readXmlFileWithBody(result.partPaths.comments, result, function(bodyReader, xml) {\n                if (xml) {\n                    return commentsReader.createCommentsReader(bodyReader)(xml);\n                } else {\n                    return new Result([]);\n                }\n            })\n        };\n    }).also(function(result) {\n        return {\n            notes: result.footnotes.flatMap(function(footnotes) {\n                return result.endnotes.map(function(endnotes) {\n                    return new documents.Notes(footnotes.concat(endnotes));\n                });\n            })\n        };\n    }).then(function(result) {\n        return readXmlFileWithBody(result.partPaths.mainDocument, result, function(bodyReader, xml) {\n            return result.notes.flatMap(function(notes) {\n                return result.comments.flatMap(function(comments) {\n                    var reader = new DocumentXmlReader({\n                        bodyReader: bodyReader,\n                        notes: notes,\n                        comments: comments\n                    });\n                    return reader.convertXmlToDocument(xml);\n                });\n            });\n        });\n    });\n}\n\nfunction findPartPaths(docxFile) {\n    return readPackageRelationships(docxFile).then(function(packageRelationships) {\n        var mainDocumentPath = findPartPath({\n            docxFile: docxFile,\n            relationships: packageRelationships,\n            relationshipType: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n            basePath: \"\",\n            fallbackPath: \"word/document.xml\"\n        });\n        \n        if (!docxFile.exists(mainDocumentPath)) {\n            throw new Error(\"Could not find main document part. Are you sure this is a valid .docx file?\");\n        }\n        \n        return xmlFileReader({\n            filename: relationshipsFilename(mainDocumentPath),\n            readElement: relationshipsReader.readRelationships,\n            defaultValue: relationshipsReader.defaultValue\n        })(docxFile).then(function(documentRelationships) {\n            function findPartRelatedToMainDocument(name) {\n                return findPartPath({\n                    docxFile: docxFile,\n                    relationships: documentRelationships,\n                    relationshipType: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/\" + name,\n                    basePath: zipfile.splitPath(mainDocumentPath).dirname,\n                    fallbackPath: \"word/\" + name + \".xml\"\n                });\n            }\n        \n            return {\n                mainDocument: mainDocumentPath,\n                comments: findPartRelatedToMainDocument(\"comments\"),\n                endnotes: findPartRelatedToMainDocument(\"endnotes\"),\n                footnotes: findPartRelatedToMainDocument(\"footnotes\"),\n                numbering: findPartRelatedToMainDocument(\"numbering\"),\n                styles: findPartRelatedToMainDocument(\"styles\")\n            };\n        });\n    });\n}\n\nfunction findPartPath(options) {\n    var docxFile = options.docxFile;\n    var relationships = options.relationships;\n    var relationshipType = options.relationshipType;\n    var basePath = options.basePath;\n    var fallbackPath = options.fallbackPath;\n    \n    var targets = relationships.findTargetsByType(relationshipType);\n    var normalisedTargets = targets.map(function(target) {\n        return stripPrefix(zipfile.joinPath(basePath, target), \"/\");\n    });\n    var validTargets = normalisedTargets.filter(function(target) {\n        return docxFile.exists(target);\n    });\n    if (validTargets.length === 0) {\n        return fallbackPath;\n    } else {\n        return validTargets[0];\n    }\n}\n\nfunction stripPrefix(value, prefix) {\n    if (value.substring(0, prefix.length) === prefix) {\n        return value.substring(prefix.length);\n    } else {\n        return value;\n    }\n}\n\nfunction xmlFileReader(options) {\n    return function(zipFile) {\n        return readXmlFromZipFile(zipFile, options.filename)\n            .then(function(element) {\n                return element ? options.readElement(element) : options.defaultValue;\n            });\n    };\n}\n\nfunction readXmlFileWithBody(filename, options, func) {\n    var readRelationshipsFromZipFile = xmlFileReader({\n        filename: relationshipsFilename(filename),\n        readElement: relationshipsReader.readRelationships,\n        defaultValue: relationshipsReader.defaultValue\n    });\n    \n    return readRelationshipsFromZipFile(options.docxFile).then(function(relationships) {\n        var bodyReader = new createBodyReader({\n            relationships: relationships,\n            contentTypes: options.contentTypes,\n            docxFile: options.docxFile,\n            numbering: options.numbering,\n            styles: options.styles,\n            files: options.files\n        });\n        return readXmlFromZipFile(options.docxFile, filename)\n            .then(function(xml) {\n                return func(bodyReader, xml);\n            });\n    });\n}\n\nfunction relationshipsFilename(filename) {\n    var split = zipfile.splitPath(filename);\n    return zipfile.joinPath(split.dirname, \"_rels\", split.basename + \".rels\");\n}\n\nvar readContentTypesFromZipFile = xmlFileReader({\n    filename: \"[Content_Types].xml\",\n    readElement: contentTypesReader.readContentTypesFromXml,\n    defaultValue: contentTypesReader.defaultContentTypes\n});\n\nfunction readNumberingFromZipFile(zipFile, path) {\n    return xmlFileReader({\n        filename: path,\n        readElement: numberingXml.readNumberingXml,\n        defaultValue: numberingXml.defaultNumbering\n    })(zipFile);\n}\n\nfunction readStylesFromZipFile(zipFile, path) {\n    return xmlFileReader({\n        filename: path,\n        readElement: stylesReader.readStylesXml,\n        defaultValue: stylesReader.defaultStyles\n    })(zipFile);\n}\n\nvar readPackageRelationships = xmlFileReader({\n    filename: \"_rels/.rels\",\n    readElement: relationshipsReader.readRelationships,\n    defaultValue: relationshipsReader.defaultValue\n});\n\n},{\"../documents\":4,\"../promises\":23,\"../results\":24,\"../zipfile\":38,\"./body-reader\":5,\"./comments-reader\":6,\"./content-types-reader\":7,\"./document-xml-reader\":8,\"./files\":1,\"./notes-reader\":10,\"./numbering-xml\":11,\"./office-xml-reader\":12,\"./relationships-reader\":13,\"./styles-reader\":15,\"path\":136}],10:[function(require,module,exports){\nvar documents = require(\"../documents\");\nvar Result = require(\"../results\").Result;\n\nexports.createFootnotesReader = createReader.bind(this, \"footnote\");\nexports.createEndnotesReader = createReader.bind(this, \"endnote\");\n\nfunction createReader(noteType, bodyReader) {\n    function readNotesXml(element) {\n        return Result.combine(element.getElementsByTagName(\"w:\" + noteType)\n            .filter(isFootnoteElement)\n            .map(readFootnoteElement));\n    }\n\n    function isFootnoteElement(element) {\n        var type = element.attributes[\"w:type\"];\n        return type !== \"continuationSeparator\" && type !== \"separator\";\n    }\n\n    function readFootnoteElement(footnoteElement) {\n        var id = footnoteElement.attributes[\"w:id\"];\n        return bodyReader.readXmlElements(footnoteElement.children)\n            .map(function(body) {\n                return documents.Note({noteType: noteType, noteId: id, body: body});\n            });\n    }\n    \n    return readNotesXml;\n}\n\n},{\"../documents\":4,\"../results\":24}],11:[function(require,module,exports){\nexports.readNumberingXml = readNumberingXml;\nexports.Numbering = Numbering;\nexports.defaultNumbering = new Numbering({});\n\nfunction Numbering(nums) {\n    return {\n        findLevel: function(numId, level) {\n            var num = nums[numId];\n            if (num) {\n                return num[level];\n            } else {\n                return null;\n            }\n        }\n    };\n}\n\nfunction readNumberingXml(root) {\n    var abstractNums = readAbstractNums(root);\n    var nums = readNums(root, abstractNums);\n    return new Numbering(nums);\n}\n\nfunction readAbstractNums(root) {\n    var abstractNums = {};\n    root.getElementsByTagName(\"w:abstractNum\").forEach(function(element) {\n        var id = element.attributes[\"w:abstractNumId\"];\n        abstractNums[id] = readAbstractNum(element);\n    });\n    return abstractNums;\n}\n\nfunction readAbstractNum(element) {\n    var levels = {};\n    element.getElementsByTagName(\"w:lvl\").forEach(function(levelElement) {\n        var levelIndex = levelElement.attributes[\"w:ilvl\"];\n        var numFmt = levelElement.first(\"w:numFmt\").attributes[\"w:val\"];\n        levels[levelIndex] = {\n            isOrdered: numFmt !== \"bullet\",\n            level: levelIndex\n        };\n    });\n    return levels;\n}\n\nfunction readNums(root, abstractNums) {\n    var nums = {};\n    root.getElementsByTagName(\"w:num\").forEach(function(element) {\n        var id = element.attributes[\"w:numId\"];\n        var abstractNumId = element.first(\"w:abstractNumId\").attributes[\"w:val\"];\n        nums[id] = abstractNums[abstractNumId];\n    });\n    return nums;\n}\n\n},{}],12:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar promises = require(\"../promises\");\nvar xml = require(\"../xml\");\n\n\nexports.read = read;\nexports.readXmlFromZipFile = readXmlFromZipFile;\n\nvar xmlNamespaceMap = {\n    \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\": \"w\",\n    \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\": \"r\",\n    \"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\": \"wp\",\n    \"http://schemas.openxmlformats.org/drawingml/2006/main\": \"a\",\n    \"http://schemas.openxmlformats.org/drawingml/2006/picture\": \"pic\",\n    \"http://schemas.openxmlformats.org/package/2006/content-types\": \"content-types\",\n    \"urn:schemas-microsoft-com:vml\": \"v\",\n    \"http://schemas.openxmlformats.org/markup-compatibility/2006\": \"mc\",\n    \"urn:schemas-microsoft-com:office:word\": \"office-word\"\n};\n\n\nfunction read(xmlString) {\n    return xml.readString(xmlString, xmlNamespaceMap)\n        .then(function(document) {\n            return collapseAlternateContent(document)[0];\n        });\n}\n\n\nfunction readXmlFromZipFile(docxFile, path) {\n    if (docxFile.exists(path)) {\n        return docxFile.read(path, \"utf-8\")\n            .then(stripUtf8Bom)\n            .then(read);\n    } else {\n        return promises.resolve(null);\n    }\n}\n\n\nfunction stripUtf8Bom(xmlString) {\n    return xmlString.replace(/^\\uFEFF/g, '');\n}\n\n\nfunction collapseAlternateContent(node) {\n    if (node.type === \"element\") {\n        if (node.name === \"mc:AlternateContent\") {\n            return node.first(\"mc:Fallback\").children;\n        } else {\n            node.children = _.flatten(node.children.map(collapseAlternateContent, true));\n            return [node];\n        }\n    } else {\n        return [node];\n    }\n}\n\n},{\"../promises\":23,\"../xml\":34,\"underscore\":153}],13:[function(require,module,exports){\nexports.readRelationships = readRelationships;\nexports.defaultValue = new Relationships([]);\nexports.Relationships = Relationships;\n\n\nfunction readRelationships(element) {\n    var relationships = [];\n    element.children.forEach(function(child) {\n        if (child.name === \"{http://schemas.openxmlformats.org/package/2006/relationships}Relationship\") {\n            var relationship = {\n                relationshipId: child.attributes.Id,\n                target: child.attributes.Target,\n                type: child.attributes.Type\n            };\n            relationships.push(relationship);\n        }\n    });\n    return new Relationships(relationships);\n}\n\nfunction Relationships(relationships) {\n    var targetsByRelationshipId = {};\n    relationships.forEach(function(relationship) {\n        targetsByRelationshipId[relationship.relationshipId] = relationship.target;\n    });\n    \n    var targetsByType = {};\n    relationships.forEach(function(relationship) {\n        if (!targetsByType[relationship.type]) {\n            targetsByType[relationship.type] = [];\n        }\n        targetsByType[relationship.type].push(relationship.target);\n    });\n            \n    return {\n        findTargetByRelationshipId: function(relationshipId) {\n            return targetsByRelationshipId[relationshipId];\n        },\n        findTargetsByType: function(type) {\n            return targetsByType[type] || [];\n        }\n    };\n}\n\n},{}],14:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar promises = require(\"../promises\");\nvar xml = require(\"../xml\");\n\nexports.writeStyleMap = writeStyleMap;\nexports.readStyleMap = readStyleMap;\n\n\nvar schema = \"http://schemas.zwobble.org/mammoth/style-map\";\nvar styleMapPath = \"mammoth/style-map\";\nvar styleMapAbsolutePath = \"/\" + styleMapPath;\n\nfunction writeStyleMap(docxFile, styleMap) {\n    docxFile.write(styleMapPath, styleMap);\n    return updateRelationships(docxFile).then(function() {\n        return updateContentTypes(docxFile);\n    });\n}\n\nfunction updateRelationships(docxFile) {\n    var path = \"word/_rels/document.xml.rels\";\n    var relationshipsUri = \"http://schemas.openxmlformats.org/package/2006/relationships\";\n    var relationshipElementName = \"{\" + relationshipsUri + \"}Relationship\";\n    return docxFile.read(path, \"utf8\")\n        .then(xml.readString)\n        .then(function(relationshipsContainer) {\n            var relationships = relationshipsContainer.children;\n            addOrUpdateElement(relationships, relationshipElementName, \"Id\", {\n                \"Id\": \"rMammothStyleMap\",\n                \"Type\": schema,\n                \"Target\": styleMapAbsolutePath\n            });\n            \n            var namespaces = {\"\": relationshipsUri};\n            return docxFile.write(path, xml.writeString(relationshipsContainer, namespaces));\n        });\n}\n\nfunction updateContentTypes(docxFile) {\n    var path = \"[Content_Types].xml\";\n    var contentTypesUri = \"http://schemas.openxmlformats.org/package/2006/content-types\";\n    var overrideName = \"{\" + contentTypesUri + \"}Override\";\n    return docxFile.read(path, \"utf8\")\n        .then(xml.readString)\n        .then(function(typesElement) {\n            var children = typesElement.children;\n            addOrUpdateElement(children, overrideName, \"PartName\", {\n                \"PartName\": styleMapAbsolutePath,\n                \"ContentType\": \"text/prs.mammoth.style-map\"\n            });\n            var namespaces = {\"\": contentTypesUri};\n            return docxFile.write(path, xml.writeString(typesElement, namespaces));\n        });\n}\n\nfunction addOrUpdateElement(elements, name, identifyingAttribute, attributes) {\n    var existingElement = _.find(elements, function(element) {\n        return element.name === name &&\n            element.attributes[identifyingAttribute] === attributes[identifyingAttribute];\n    });\n    if (existingElement) {\n        existingElement.attributes = attributes;\n    } else {\n        elements.push(xml.element(name, attributes));\n    }\n}\n\nfunction readStyleMap(docxFile) {\n    if (docxFile.exists(styleMapPath)) {\n        return docxFile.read(styleMapPath, \"utf8\");\n    } else {\n        return promises.resolve(null);\n    }\n}\n\n},{\"../promises\":23,\"../xml\":34,\"underscore\":153}],15:[function(require,module,exports){\nexports.readStylesXml = readStylesXml;\nexports.Styles = Styles;\nexports.defaultStyles = new Styles({}, {});\n\nfunction Styles(paragraphStyles, characterStyles, tableStyles) {\n    return {\n        findParagraphStyleById: function(styleId) {\n            return paragraphStyles[styleId];\n        },\n        findCharacterStyleById: function(styleId) {\n            return characterStyles[styleId];\n        },\n        findTableStyleById: function(styleId) {\n            return tableStyles[styleId];\n        }\n    };\n}\n\nStyles.EMPTY = new Styles({}, {}, {});\n\nfunction readStylesXml(root) {\n    var paragraphStyles = {};\n    var characterStyles = {};\n    var tableStyles = {};\n    \n    var styles = {\n        \"paragraph\": paragraphStyles,\n        \"character\": characterStyles,\n        \"table\": tableStyles\n    };\n    \n    root.getElementsByTagName(\"w:style\").forEach(function(styleElement) {\n        var style = readStyleElement(styleElement);\n        var styleSet = styles[style.type];\n        if (styleSet) {\n            styleSet[style.styleId] = style;\n        }\n    });\n    \n    return new Styles(paragraphStyles, characterStyles, tableStyles);\n}\n\nfunction readStyleElement(styleElement) {\n    var type = styleElement.attributes[\"w:type\"];\n    var styleId = styleElement.attributes[\"w:styleId\"];\n    var name = styleName(styleElement);\n    return {type: type, styleId: styleId, name: name};\n}\n\nfunction styleName(styleElement) {\n    var nameElement = styleElement.first(\"w:name\");\n    return nameElement ? nameElement.attributes[\"w:val\"] : null;\n}\n\n},{}],16:[function(require,module,exports){\nexports.uriToZipEntryName = uriToZipEntryName;\nexports.replaceFragment = replaceFragment;\n\nfunction uriToZipEntryName(base, uri) {\n    if (uri.charAt(0) === \"/\") {\n        return uri.substr(1);\n    } else {\n        // In general, we should check first and second for trailing and leading slashes,\n        // but in our specific case this seems to be sufficient\n        return base + \"/\" + uri;\n    }\n}\n\n\nfunction replaceFragment(uri, fragment) {\n    var hashIndex = uri.indexOf(\"#\");\n    if (hashIndex !== -1) {\n        uri = uri.substring(0, hashIndex);\n    }\n    return uri + \"#\" + fragment;\n}\n\n},{}],17:[function(require,module,exports){\nvar htmlPaths = require(\"../styles/html-paths\");\n\n\nfunction nonFreshElement(tagName, attributes, children) {\n    return elementWithTag(\n        htmlPaths.element(tagName, attributes, {fresh: false}),\n        children);\n}\n\nfunction freshElement(tagName, attributes, children) {\n    var tag = htmlPaths.element(tagName, attributes, {fresh: true});\n    return elementWithTag(tag, children);\n}\n\nfunction elementWithTag(tag, children) {\n    return {\n        type: \"element\",\n        tag: tag,\n        children: children || []\n    };\n}\n\nfunction text(value) {\n    return {\n        type: \"text\",\n        value: value\n    };\n}\n\nvar forceWrite = {\n    type: \"forceWrite\"\n};\n\nexports.freshElement = freshElement;\nexports.nonFreshElement = nonFreshElement;\nexports.elementWithTag = elementWithTag;\nexports.text = text;\nexports.forceWrite = forceWrite;\n\nvar voidTagNames = {\n    \"br\": true,\n    \"hr\": true,\n    \"img\": true\n};\n\nfunction isVoidElement(node) {\n    return (node.children.length === 0) && voidTagNames[node.tag.tagName];\n}\n\nexports.isVoidElement = isVoidElement;\n\n},{\"../styles/html-paths\":27}],18:[function(require,module,exports){\nvar ast = require(\"./ast\");\n\nexports.freshElement = ast.freshElement;\nexports.nonFreshElement = ast.nonFreshElement;\nexports.elementWithTag = ast.elementWithTag;\nexports.text = ast.text;\nexports.forceWrite = ast.forceWrite;\n\nexports.simplify = require(\"./simplify\");\n\nfunction write(writer, nodes) {\n    nodes.forEach(function(node) {\n        writeNode(writer, node);\n    });\n}\n\nfunction writeNode(writer, node) {\n    toStrings[node.type](writer, node);\n}\n\nvar toStrings = {\n    element: generateElementString,\n    text: generateTextString,\n    forceWrite: function() { }\n};\n\nfunction generateElementString(writer, node) {\n    if (ast.isVoidElement(node)) {\n        writer.selfClosing(node.tag.tagName, node.tag.attributes);\n    } else {\n        writer.open(node.tag.tagName, node.tag.attributes);\n        write(writer, node.children);\n        writer.close(node.tag.tagName);\n    }\n}\n\nfunction generateTextString(writer, node) {\n    writer.text(node.value);\n}\n\nexports.write = write;\n\n},{\"./ast\":17,\"./simplify\":19}],19:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar ast = require(\"./ast\");\n\nfunction simplify(nodes) {\n    return collapse(removeEmpty(nodes));\n}\n\nfunction collapse(nodes) {\n    var children = [];\n    \n    nodes.map(collapseNode).forEach(function(child) {\n        appendChild(children, child);\n    });\n    return children;\n}\n\nfunction collapseNode(node) {\n    return collapsers[node.type](node);\n}\n\nvar collapsers = {\n    element: collapseElement,\n    text: identity,\n    forceWrite: identity\n};\n\nfunction collapseElement(node) {\n    return ast.elementWithTag(node.tag, collapse(node.children));\n}\n\nfunction identity(value) {\n    return value;\n}\n\nfunction appendChild(children, child) {\n    var lastChild = children[children.length - 1];\n    if (child.type === \"element\" && !child.tag.fresh && lastChild && lastChild.type === \"element\" && child.tag.matchesElement(lastChild.tag)) {\n        if (child.tag.separator) {\n            appendChild(lastChild.children, ast.text(child.tag.separator));\n        }\n        child.children.forEach(function(grandChild) {\n            // Mutation is fine since simplifying elements create a copy of the children.\n            appendChild(lastChild.children, grandChild);\n        });\n    } else {\n        children.push(child);\n    }\n}\n\nfunction removeEmpty(nodes) {\n    return flatMap(nodes, function(node) {\n        return emptiers[node.type](node);\n    });\n}\n\nfunction flatMap(values, func) {\n    return _.flatten(_.map(values, func), true);\n}\n\nvar emptiers = {\n    element: elementEmptier,\n    text: textEmptier,\n    forceWrite: neverEmpty\n};\n\nfunction neverEmpty(node) {\n    return [node];\n}\n\nfunction elementEmptier(element) {\n    var children = removeEmpty(element.children);\n    if (children.length === 0 && !ast.isVoidElement(element)) {\n        return [];\n    } else {\n        return [ast.elementWithTag(element.tag, children)];\n    }\n}\n\nfunction textEmptier(node) {\n    if (node.value.length === 0) {\n        return [];\n    } else {\n        return [node];\n    }\n}\n\nmodule.exports = simplify;\n\n},{\"./ast\":17,\"underscore\":153}],20:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar promises = require(\"./promises\");\nvar Html = require(\"./html\");\n\nexports.imgElement = imgElement;\n\nfunction imgElement(func) {\n    return function(element, messages) {\n        return promises.when(func(element)).then(function(result) {\n            var attributes = _.clone(result);\n            if (element.altText) {\n                attributes.alt = element.altText;\n            }\n            return [Html.freshElement(\"img\", attributes)];\n        });\n    };\n}\n\n// Undocumented, but retained for backwards-compatibility with 0.3.x\nexports.inline = exports.imgElement;\n\nexports.dataUri = imgElement(function(element) {\n    return element.read(\"base64\").then(function(imageBuffer) {\n        return {\n            src: \"data:\" + element.contentType + \";base64,\" + imageBuffer\n        };\n    });\n});\n\n},{\"./html\":18,\"./promises\":23,\"underscore\":153}],21:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar docxReader = require(\"./docx/docx-reader\");\nvar docxStyleMap = require(\"./docx/style-map\");\nvar DocumentConverter = require(\"./document-to-html\").DocumentConverter;\nvar readStyle = require(\"./style-reader\").readStyle;\nvar readOptions = require(\"./options-reader\").readOptions;\nvar unzip = require(\"./unzip\");\nvar Result = require(\"./results\").Result;\n\nexports.convertToHtml = convertToHtml;\nexports.convertToMarkdown = convertToMarkdown;\nexports.convert = convert;\nexports.extractRawText = extractRawText;\nexports.images = require(\"./images\");\nexports.transforms = require(\"./transforms\");\nexports.underline = require(\"./underline\");\nexports.embedStyleMap = embedStyleMap;\nexports.readEmbeddedStyleMap = readEmbeddedStyleMap;\n\nfunction convertToHtml(input, options) {\n    return convert(input, options);\n}\n\nfunction convertToMarkdown(input, options) {\n    var markdownOptions = Object.create(options || {});\n    markdownOptions.outputFormat = \"markdown\";\n    return convert(input, markdownOptions);\n}\n\nfunction convert(input, options) {\n    options = readOptions(options);\n    \n    return unzip.openZip(input)\n        .tap(function(docxFile) {\n            return docxStyleMap.readStyleMap(docxFile).then(function(styleMap) {\n                options.embeddedStyleMap = styleMap;\n            });\n        })\n        .then(function(docxFile) {\n            return docxReader.read(docxFile, input)\n                .then(function(documentResult) {\n                    return documentResult.map(options.transformDocument);\n                })\n                .then(function(documentResult) {\n                    return convertDocumentToHtml(documentResult, options);\n                });\n        });\n}\n\nfunction readEmbeddedStyleMap(input) {\n    return unzip.openZip(input)\n        .then(docxStyleMap.readStyleMap);\n}\n\nfunction convertDocumentToHtml(documentResult, options) {\n    var styleMapResult = parseStyleMap(options.readStyleMap());\n    var parsedOptions = _.extend({}, options, {\n        styleMap: styleMapResult.value\n    });\n    var documentConverter = new DocumentConverter(parsedOptions);\n    \n    return documentResult.flatMapThen(function(document) {\n        return styleMapResult.flatMapThen(function(styleMap) {\n            return documentConverter.convertToHtml(document);\n        });\n    });\n}\n\nfunction parseStyleMap(styleMap) {\n    return Result.combine((styleMap || []).map(readStyle))\n        .map(function(styleMap) {\n            return styleMap.filter(function(styleMapping) {\n                return !!styleMapping;\n            });\n        });\n}\n\n\nfunction extractRawText(input) {\n    return unzip.openZip(input)\n        .then(docxReader.read)\n        .then(function(documentResult) {\n            return documentResult.map(convertElementToRawText);\n        });\n}\n\nfunction convertElementToRawText(element) {\n    if (element.type === \"text\") {\n        return element.value;\n    } else {\n        var tail = element.type === \"paragraph\" ? \"\\n\\n\" : \"\";\n        return (element.children || []).map(convertElementToRawText).join(\"\") + tail;\n    }\n}\n\nfunction embedStyleMap(input, styleMap) {\n    return unzip.openZip(input)\n        .tap(function(docxFile) {\n            return docxStyleMap.writeStyleMap(docxFile, styleMap);\n        })\n        .then(function(docxFile) {\n            return {\n                toBuffer: docxFile.toBuffer\n            };\n        });\n}\n\nexports.styleMapping = function() {\n    throw new Error('Use a raw string instead of mammoth.styleMapping e.g. \"p[style-name=\\'Title\\'] => h1\" instead of mammoth.styleMapping(\"p[style-name=\\'Title\\'] => h1\")');\n};\n\n},{\"./document-to-html\":3,\"./docx/docx-reader\":9,\"./docx/style-map\":14,\"./images\":20,\"./options-reader\":22,\"./results\":24,\"./style-reader\":25,\"./transforms\":29,\"./underline\":30,\"./unzip\":2,\"underscore\":153}],22:[function(require,module,exports){\nexports.readOptions = readOptions;\n\n\nvar _ = require(\"underscore\");\n\nvar defaultStyleMap = exports._defaultStyleMap = [\n    \"p.Heading1 => h1:fresh\",\n    \"p.Heading2 => h2:fresh\",\n    \"p.Heading3 => h3:fresh\",\n    \"p.Heading4 => h4:fresh\",\n    \"p.Heading5 => h5:fresh\",\n    \"p.Heading6 => h6:fresh\",\n    \"p[style-name='Heading 1'] => h1:fresh\",\n    \"p[style-name='Heading 2'] => h2:fresh\",\n    \"p[style-name='Heading 3'] => h3:fresh\",\n    \"p[style-name='Heading 4'] => h4:fresh\",\n    \"p[style-name='Heading 5'] => h5:fresh\",\n    \"p[style-name='Heading 6'] => h6:fresh\",\n    \"p[style-name='heading 1'] => h1:fresh\",\n    \"p[style-name='heading 2'] => h2:fresh\",\n    \"p[style-name='heading 3'] => h3:fresh\",\n    \"p[style-name='heading 4'] => h4:fresh\",\n    \"p[style-name='heading 5'] => h5:fresh\",\n    \"p[style-name='heading 6'] => h6:fresh\",\n    \n    \"r[style-name='Strong'] => strong\",\n    \n    \"p[style-name='footnote text'] => p:fresh\",\n    \"r[style-name='footnote reference'] =>\",\n    \"p[style-name='endnote text'] => p:fresh\",\n    \"r[style-name='endnote reference'] =>\",\n    \"p[style-name='annotation text'] => p:fresh\",\n    \"r[style-name='annotation reference'] =>\",\n    \n    // LibreOffice\n    \"p[style-name='Footnote'] => p:fresh\",\n    \"r[style-name='Footnote anchor'] =>\",\n    \"p[style-name='Endnote'] => p:fresh\",\n    \"r[style-name='Endnote anchor'] =>\",\n    \n    \"p:unordered-list(1) => ul > li:fresh\",\n    \"p:unordered-list(2) => ul|ol > li > ul > li:fresh\",\n    \"p:unordered-list(3) => ul|ol > li > ul|ol > li > ul > li:fresh\",\n    \"p:unordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh\",\n    \"p:unordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh\",\n    \"p:ordered-list(1) => ol > li:fresh\",\n    \"p:ordered-list(2) => ul|ol > li > ol > li:fresh\",\n    \"p:ordered-list(3) => ul|ol > li > ul|ol > li > ol > li:fresh\",\n    \"p:ordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh\",\n    \"p:ordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh\",\n    \n    \"r[style-name='Hyperlink'] =>\",\n    \n    \"p[style-name='Normal'] => p:fresh\"\n];\n\nvar standardOptions = exports._standardOptions = {\n    transformDocument: identity,\n    includeDefaultStyleMap: true,\n    includeEmbeddedStyleMap: true\n};\n\nfunction readOptions(options) {\n    options = options || {};\n    return _.extend({}, standardOptions, options, {\n        customStyleMap: readStyleMap(options.styleMap),\n        readStyleMap: function() {\n            var styleMap = this.customStyleMap;\n            if (this.includeEmbeddedStyleMap) {\n                styleMap = styleMap.concat(readStyleMap(this.embeddedStyleMap));\n            }\n            if (this.includeDefaultStyleMap) {\n                styleMap = styleMap.concat(defaultStyleMap);\n            }\n            return styleMap;\n        }\n    });\n}\n\nfunction readStyleMap(styleMap) {\n    if (!styleMap) {\n        return [];\n    } else if (_.isString(styleMap)) {\n        return styleMap.split(\"\\n\")\n            .map(function(line) {\n                return line.trim();\n            })\n            .filter(function(line) {\n                return line !== \"\" && line.charAt(0) !== \"#\";\n            });\n    } else {\n        return styleMap;\n    }\n}\n\nfunction identity(value) {\n    return value;\n}\n\n},{\"underscore\":153}],23:[function(require,module,exports){\nvar _ = require(\"underscore\");\nvar bluebird = require(\"bluebird/js/release/promise\")();\n\nexports.defer = defer;\nexports.when = bluebird.resolve;\nexports.resolve = bluebird.resolve;\nexports.all = bluebird.all;\nexports.props = bluebird.props;\nexports.reject = bluebird.reject;\nexports.promisify = bluebird.promisify;\nexports.mapSeries = bluebird.mapSeries;\nexports.attempt = bluebird.attempt;\n\nexports.nfcall = function(func) {\n    var args = Array.prototype.slice.call(arguments, 1);\n    var promisedFunc = bluebird.promisify(func);\n    return promisedFunc.apply(null, args);\n};\n\nbluebird.prototype.fail = bluebird.prototype.caught;\n\nbluebird.prototype.also = function(func) {\n    return this.then(function(value) {\n        var returnValue = _.extend({}, value, func(value));\n        return bluebird.props(returnValue);\n    });\n};\n\nfunction defer() {\n    var resolve;\n    var reject;\n    var promise = new bluebird.Promise(function(resolveArg, rejectArg) {\n        resolve = resolveArg;\n        reject = rejectArg;\n    });\n\n    return {\n        resolve: resolve,\n        reject: reject,\n        promise: promise\n    };\n}\n\n},{\"bluebird/js/release/promise\":60,\"underscore\":153}],24:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\n\nexports.Result = Result;\nexports.success = success;\nexports.warning = warning;\nexports.error = error;\n\n\nfunction Result(value, messages) {\n    this.value = value;\n    this.messages = messages || [];\n}\n\nResult.prototype.map = function(func) {\n    return new Result(func(this.value), this.messages);\n};\n\nResult.prototype.flatMap = function(func) {\n    var funcResult = func(this.value);\n    return new Result(funcResult.value, combineMessages([this, funcResult]));\n};\n\nResult.prototype.flatMapThen = function(func) {\n    var that = this;\n    return func(this.value).then(function(otherResult) {\n        return new Result(otherResult.value, combineMessages([that, otherResult]));\n    });\n};\n\nResult.combine = function(results) {\n    var values = _.flatten(_.pluck(results, \"value\"));\n    var messages = combineMessages(results);\n    return new Result(values, messages);\n};\n\nfunction success(value) {\n    return new Result(value, []);\n}\n\nfunction warning(message) {\n    return {\n        type: \"warning\",\n        message: message\n    };\n}\n\nfunction error(exception) {\n    return {\n        type: \"error\",\n        message: exception.message,\n        error: exception\n    };\n}\n\nfunction combineMessages(results) {\n    var messages = [];\n    _.flatten(_.pluck(results, \"messages\"), true).forEach(function(message) {\n        if (!containsMessage(messages, message)) {\n            messages.push(message);\n        }\n    });\n    return messages;\n}\n\nfunction containsMessage(messages, message) {\n    return _.find(messages, isSameMessage.bind(null, message)) !== undefined;\n}\n\nfunction isSameMessage(first, second) {\n    return first.type === second.type && first.message === second.message;\n}\n\n},{\"underscore\":153}],25:[function(require,module,exports){\nvar _ = require(\"underscore\");\nvar lop = require(\"lop\");\n\nvar documentMatchers = require(\"./styles/document-matchers\");\nvar htmlPaths = require(\"./styles/html-paths\");\nvar tokenise = require(\"./styles/parser/tokeniser\").tokenise;\nvar results = require(\"./results\");\n\nexports.readHtmlPath = readHtmlPath;\nexports.readDocumentMatcher = readDocumentMatcher;\nexports.readStyle = readStyle;\n\n\nfunction readStyle(string) {\n    return parseString(styleRule, string);\n}\n\nfunction createStyleRule() {\n    return lop.rules.sequence(\n        lop.rules.sequence.capture(documentMatcherRule()),\n        lop.rules.tokenOfType(\"whitespace\"),\n        lop.rules.tokenOfType(\"arrow\"),\n        lop.rules.sequence.capture(lop.rules.optional(lop.rules.sequence(\n            lop.rules.tokenOfType(\"whitespace\"),\n            lop.rules.sequence.capture(htmlPathRule())\n        ).head())),\n        lop.rules.tokenOfType(\"end\")\n    ).map(function(documentMatcher, htmlPath) {\n        return {\n            from: documentMatcher,\n            to: htmlPath.valueOrElse(htmlPaths.empty)\n        };\n    });\n}\n\nfunction readDocumentMatcher(string) {\n    return parseString(documentMatcherRule(), string);\n}\n\nfunction documentMatcherRule() {\n    var sequence = lop.rules.sequence;\n    \n    var identifierToConstant = function(identifier, constant) {\n        return lop.rules.then(\n            lop.rules.token(\"identifier\", identifier),\n            function() {\n                return constant;\n            }\n        );\n    };\n    \n    var paragraphRule = identifierToConstant(\"p\", documentMatchers.paragraph);\n    var runRule = identifierToConstant(\"r\", documentMatchers.run);\n    \n    var elementTypeRule = lop.rules.firstOf(\"p or r or table\",\n        paragraphRule,\n        runRule\n    );\n    \n    var styleIdRule = lop.rules.then(\n        classRule,\n        function(styleId) {\n            return {styleId: styleId};\n        }\n    );\n\n    var styleNameMatcherRule = lop.rules.firstOf(\"style name matcher\",\n        lop.rules.then(\n            lop.rules.sequence(\n                lop.rules.tokenOfType(\"equals\"),\n                lop.rules.sequence.cut(),\n                lop.rules.sequence.capture(stringRule)\n            ).head(),\n            function(styleName) {\n                return {styleName: documentMatchers.equalTo(styleName)};\n            }\n        ),\n        lop.rules.then(\n            lop.rules.sequence(\n                lop.rules.tokenOfType(\"startsWith\"),\n                lop.rules.sequence.cut(),\n                lop.rules.sequence.capture(stringRule)\n            ).head(),\n            function(styleName) {\n                return {styleName: documentMatchers.startsWith(styleName)};\n            }\n        )\n    );\n    \n    var styleNameRule = lop.rules.sequence(\n        lop.rules.tokenOfType(\"open-square-bracket\"),\n        lop.rules.sequence.cut(),\n        lop.rules.token(\"identifier\", \"style-name\"),\n        lop.rules.sequence.capture(styleNameMatcherRule),\n        lop.rules.tokenOfType(\"close-square-bracket\")\n    ).head();\n\n    \n    var listTypeRule = lop.rules.firstOf(\"list type\",\n        identifierToConstant(\"ordered-list\", {isOrdered: true}),\n        identifierToConstant(\"unordered-list\", {isOrdered: false})\n    );\n    var listRule = sequence(\n        lop.rules.tokenOfType(\"colon\"),\n        sequence.capture(listTypeRule),\n        sequence.cut(),\n        lop.rules.tokenOfType(\"open-paren\"),\n        sequence.capture(integerRule),\n        lop.rules.tokenOfType(\"close-paren\")\n    ).map(function(listType, levelNumber) {\n        return {\n            list: {\n                isOrdered: listType.isOrdered,\n                levelIndex: levelNumber - 1\n            }\n        };\n    });\n\n    function createMatcherSuffixesRule(rules) {\n        var matcherSuffix = lop.rules.firstOf.apply(\n            lop.rules.firstOf,\n            [\"matcher suffix\"].concat(rules)\n        );\n        var matcherSuffixes = lop.rules.zeroOrMore(matcherSuffix);\n        return lop.rules.then(matcherSuffixes, function(suffixes) {\n            var matcherOptions = {};\n            suffixes.forEach(function(suffix) {\n                _.extend(matcherOptions, suffix);\n            });\n            return matcherOptions;\n        });\n    }\n    \n    var paragraphOrRun = sequence(\n        sequence.capture(elementTypeRule),\n        sequence.capture(createMatcherSuffixesRule([\n            styleIdRule,\n            styleNameRule,\n            listRule\n        ]))\n    ).map(function(createMatcher, matcherOptions) {\n        return createMatcher(matcherOptions);\n    });\n    \n    var table = sequence(\n        lop.rules.token(\"identifier\", \"table\"),\n        sequence.capture(createMatcherSuffixesRule([\n            styleIdRule,\n            styleNameRule\n        ]))\n    ).map(function(options) {\n        return documentMatchers.table(options);\n    });\n\n    var bold = identifierToConstant(\"b\", documentMatchers.bold);\n    var italic = identifierToConstant(\"i\", documentMatchers.italic);\n    var underline = identifierToConstant(\"u\", documentMatchers.underline);\n    var strikethrough = identifierToConstant(\"strike\", documentMatchers.strikethrough);\n    var smallCaps = identifierToConstant(\"small-caps\", documentMatchers.smallCaps);\n    var commentReference = identifierToConstant(\"comment-reference\", documentMatchers.commentReference);\n    \n    var breakMatcher = sequence(\n        lop.rules.token(\"identifier\", \"br\"),\n        sequence.cut(),\n        lop.rules.tokenOfType(\"open-square-bracket\"),\n        lop.rules.token(\"identifier\", \"type\"),\n        lop.rules.tokenOfType(\"equals\"),\n        sequence.capture(stringRule),\n        lop.rules.tokenOfType(\"close-square-bracket\")\n    ).map(function(breakType) {\n        switch (breakType) {\n        case \"line\":\n            return documentMatchers.lineBreak;\n        case \"page\":\n            return documentMatchers.pageBreak;\n        case \"column\":\n            return documentMatchers.columnBreak;\n        default:\n            // TODO: handle unknown document matchers\n        }\n    });\n\n    return lop.rules.firstOf(\"element type\",\n        paragraphOrRun,\n        table,\n        bold,\n        italic,\n        underline,\n        strikethrough,\n        smallCaps,\n        commentReference,\n        breakMatcher\n    );\n}\n\nfunction readHtmlPath(string) {\n    return parseString(htmlPathRule(), string);\n}\n\nfunction htmlPathRule() {\n    var capture = lop.rules.sequence.capture;\n    var whitespaceRule = lop.rules.tokenOfType(\"whitespace\");\n    var freshRule = lop.rules.then(\n        lop.rules.optional(lop.rules.sequence(\n            lop.rules.tokenOfType(\"colon\"),\n            lop.rules.token(\"identifier\", \"fresh\")\n        )),\n        function(option) {\n            return option.map(function() {\n                return true;\n            }).valueOrElse(false);\n        }\n    );\n    \n    var separatorRule = lop.rules.then(\n        lop.rules.optional(lop.rules.sequence(\n            lop.rules.tokenOfType(\"colon\"),\n            lop.rules.token(\"identifier\", \"separator\"),\n            lop.rules.tokenOfType(\"open-paren\"),\n            capture(stringRule),\n            lop.rules.tokenOfType(\"close-paren\")\n        ).head()),\n        function(option) {\n            return option.valueOrElse(\"\");\n        }\n    );\n\n    var tagNamesRule = lop.rules.oneOrMoreWithSeparator(\n        identifierRule,\n        lop.rules.tokenOfType(\"choice\")\n    );\n    \n    var styleElementRule = lop.rules.sequence(\n        capture(tagNamesRule),\n        capture(lop.rules.zeroOrMore(classRule)),\n        capture(freshRule),\n        capture(separatorRule)\n    ).map(function(tagName, classNames, fresh, separator) {\n        var attributes = {};\n        var options = {};\n        if (classNames.length > 0) {\n            attributes[\"class\"] = classNames.join(\" \");\n        }\n        if (fresh) {\n            options.fresh = true;\n        }\n        if (separator) {\n            options.separator = separator;\n        }\n        return htmlPaths.element(tagName, attributes, options);\n    });\n    \n    return lop.rules.firstOf(\"html path\",\n        lop.rules.then(lop.rules.tokenOfType(\"bang\"), function() {\n            return htmlPaths.ignore;\n        }),\n        lop.rules.then(\n            lop.rules.zeroOrMoreWithSeparator(\n                styleElementRule,\n                lop.rules.sequence(\n                    whitespaceRule,\n                    lop.rules.tokenOfType(\"gt\"),\n                    whitespaceRule\n                )\n            ),\n            htmlPaths.elements\n        )\n    );\n}\n    \nvar identifierRule = lop.rules.then(\n    lop.rules.tokenOfType(\"identifier\"),\n    decodeEscapeSequences\n);\nvar integerRule = lop.rules.tokenOfType(\"integer\");\n\nvar stringRule = lop.rules.then(\n    lop.rules.tokenOfType(\"string\"),\n    decodeEscapeSequences\n);\n\nvar escapeSequences = {\n    \"n\": \"\\n\",\n    \"r\": \"\\r\",\n    \"t\": \"\\t\"\n};\n\nfunction decodeEscapeSequences(value) {\n    return value.replace(/\\\\(.)/g, function(match, code) {\n        return escapeSequences[code] || code;\n    });\n}\n\nvar classRule = lop.rules.sequence(\n    lop.rules.tokenOfType(\"dot\"),\n    lop.rules.sequence.cut(),\n    lop.rules.sequence.capture(identifierRule)\n).head();\n\nfunction parseString(rule, string) {\n    var tokens = tokenise(string);\n    var parser = lop.Parser();\n    var parseResult = parser.parseTokens(rule, tokens);\n    if (parseResult.isSuccess()) {\n        return results.success(parseResult.value());\n    } else {\n        return new results.Result(null, [results.warning(describeFailure(string, parseResult))]);\n    }\n}\n\nfunction describeFailure(input, parseResult) {\n    return \"Did not understand this style mapping, so ignored it: \" + input + \"\\n\" +\n        parseResult.errors().map(describeError).join(\"\\n\");\n}\n\nfunction describeError(error) {\n    return \"Error was at character number \" + error.characterNumber() + \": \" +\n        \"Expected \" + error.expected + \" but got \" + error.actual;\n}\n\nvar styleRule = createStyleRule();\n\n},{\"./results\":24,\"./styles/document-matchers\":26,\"./styles/html-paths\":27,\"./styles/parser/tokeniser\":28,\"lop\":107,\"underscore\":153}],26:[function(require,module,exports){\nexports.paragraph = paragraph;\nexports.run = run;\nexports.table = table;\nexports.bold = new Matcher(\"bold\");\nexports.italic = new Matcher(\"italic\");\nexports.underline = new Matcher(\"underline\");\nexports.strikethrough = new Matcher(\"strikethrough\");\nexports.smallCaps = new Matcher(\"smallCaps\");\nexports.commentReference = new Matcher(\"commentReference\");\nexports.lineBreak = new Matcher(\"break\", {breakType: \"line\"});\nexports.pageBreak = new Matcher(\"break\", {breakType: \"page\"});\nexports.columnBreak = new Matcher(\"break\", {breakType: \"column\"});\nexports.equalTo = equalTo;\nexports.startsWith = startsWith;\n\n\nfunction paragraph(options) {\n    return new Matcher(\"paragraph\", options);\n}\n\nfunction run(options) {\n    return new Matcher(\"run\", options);\n}\n\nfunction table(options) {\n    return new Matcher(\"table\", options);\n}\n\nfunction Matcher(elementType, options) {\n    options = options || {};\n    this._elementType = elementType;\n    this._styleId = options.styleId;\n    this._styleName = options.styleName;\n    if (options.list) {\n        this._listIndex = options.list.levelIndex;\n        this._listIsOrdered = options.list.isOrdered;\n    }\n}\n\nMatcher.prototype.matches = function(element) {\n    return element.type === this._elementType &&\n        (this._styleId === undefined || element.styleId === this._styleId) &&\n        (this._styleName === undefined || (element.styleName && this._styleName.operator(this._styleName.operand, element.styleName))) &&\n        (this._listIndex === undefined || isList(element, this._listIndex, this._listIsOrdered)) &&\n        (this._breakType === undefined || this._breakType === element.breakType);\n};\n\nfunction isList(element, levelIndex, isOrdered) {\n    return element.numbering &&\n        element.numbering.level == levelIndex &&\n        element.numbering.isOrdered == isOrdered;\n}\n\nfunction equalTo(value) {\n    return {\n        operator: operatorEqualTo,\n        operand: value\n    };\n}\n\nfunction startsWith(value) {\n    return {\n        operator: operatorStartsWith,\n        operand: value\n    };\n}\n\nfunction operatorEqualTo(first, second) {\n    return first.toUpperCase() === second.toUpperCase();\n}\n\nfunction operatorStartsWith(first, second) {\n    return second.toUpperCase().indexOf(first.toUpperCase()) === 0;\n}\n\n},{}],27:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar html = require(\"../html\");\n\nexports.topLevelElement = topLevelElement;\nexports.elements = elements;\nexports.element = element;\n\nfunction topLevelElement(tagName, attributes) {\n    return elements([element(tagName, attributes, {fresh: true})]);\n}\n\nfunction elements(elementStyles) {\n    return new HtmlPath(elementStyles.map(function(elementStyle) {\n        if (_.isString(elementStyle)) {\n            return element(elementStyle);\n        } else {\n            return elementStyle;\n        }\n    }));\n}\n\nfunction HtmlPath(elements) {\n    this._elements = elements;\n}\n\nHtmlPath.prototype.wrap = function wrap(children) {\n    var result = children();\n    for (var index = this._elements.length - 1; index >= 0; index--) {\n        result = this._elements[index].wrapNodes(result);\n    }\n    return result;\n};\n\nfunction element(tagName, attributes, options) {\n    options = options || {};\n    return new Element(tagName, attributes, options);\n}\n\nfunction Element(tagName, attributes, options) {\n    var tagNames = {};\n    if (_.isArray(tagName)) {\n        tagName.forEach(function(tagName) {\n            tagNames[tagName] = true;\n        });\n        tagName = tagName[0];\n    } else {\n        tagNames[tagName] = true;\n    }\n    \n    this.tagName = tagName;\n    this.tagNames = tagNames;\n    this.attributes = attributes || {};\n    this.fresh = options.fresh;\n    this.separator = options.separator;\n}\n\nElement.prototype.matchesElement = function(element) {\n    return this.tagNames[element.tagName] && _.isEqual(this.attributes || {}, element.attributes || {});\n};\n\nElement.prototype.wrap = function wrap(generateNodes) {\n    return this.wrapNodes(generateNodes());\n};\n\nElement.prototype.wrapNodes = function wrapNodes(nodes) {\n    return [html.elementWithTag(this, nodes)];\n};\n\nexports.empty = elements([]);\nexports.ignore = {\n    wrap: function() {\n        return [];\n    }\n};\n\n},{\"../html\":18,\"underscore\":153}],28:[function(require,module,exports){\nvar lop = require(\"lop\");\nvar RegexTokeniser = lop.RegexTokeniser;\n\nexports.tokenise = tokenise;\n\nvar stringPrefix = \"'((?:\\\\\\\\.|[^'])*)\";\n\nfunction tokenise(string) {\n    var identifierCharacter = \"(?:[a-zA-Z\\\\-_]|\\\\\\\\.)\";\n    var tokeniser = new RegexTokeniser([\n        {name: \"identifier\", regex: new RegExp(\"(\" + identifierCharacter + \"(?:\" + identifierCharacter + \"|[0-9])*)\")},\n        {name: \"dot\", regex: /\\./},\n        {name: \"colon\", regex: /:/},\n        {name: \"gt\", regex: />/},\n        {name: \"whitespace\", regex: /\\s+/},\n        {name: \"arrow\", regex: /=>/},\n        {name: \"equals\", regex: /=/},\n        {name: \"startsWith\", regex: /\\^=/},\n        {name: \"open-paren\", regex: /\\(/},\n        {name: \"close-paren\", regex: /\\)/},\n        {name: \"open-square-bracket\", regex: /\\[/},\n        {name: \"close-square-bracket\", regex: /\\]/},\n        {name: \"string\", regex: new RegExp(stringPrefix + \"'\")},\n        {name: \"unterminated-string\", regex: new RegExp(stringPrefix)},\n        {name: \"integer\", regex: /([0-9]+)/},\n        {name: \"choice\", regex: /\\|/},\n        {name: \"bang\", regex: /(!)/}\n    ]);\n    return tokeniser.tokenise(string);\n}\n\n},{\"lop\":107}],29:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nexports.paragraph = paragraph;\nexports.run = run;\nexports._elements = elements;\nexports.getDescendantsOfType = getDescendantsOfType;\nexports.getDescendants = getDescendants;\n\nfunction paragraph(transform) {\n    return elementsOfType(\"paragraph\", transform);\n}\n\nfunction run(transform) {\n    return elementsOfType(\"run\", transform);\n}\n\nfunction elementsOfType(elementType, transform) {\n    return elements(function(element) {\n        if (element.type === elementType) {\n            return transform(element);\n        } else {\n            return element;\n        }\n    });\n}\n\nfunction elements(transform) {\n    return function transformElement(element) {\n        if (element.children) {\n            var children = _.map(element.children, transformElement);\n            element = _.extend(element, {children: children});\n        }\n        return transform(element);\n    };\n}\n\n\nfunction getDescendantsOfType(element, type) {\n    return getDescendants(element).filter(function(descendant) {\n        return descendant.type === type;\n    });\n}\n\nfunction getDescendants(element) {\n    var descendants = [];\n\n    visitDescendants(element, function(descendant) {\n        descendants.push(descendant);\n    });\n\n    return descendants;\n}\n\nfunction visitDescendants(element, visit) {\n    if (element.children) {\n        element.children.forEach(function(child) {\n            visitDescendants(child, visit);\n            visit(child);\n        });\n    }\n}\n\n},{\"underscore\":153}],30:[function(require,module,exports){\nvar htmlPaths = require(\"./styles/html-paths\");\nvar Html = require(\"./html\");\n\n\nexports.element = element;\n\nfunction element(name) {\n    return function(html) {\n        return Html.elementWithTag(htmlPaths.element(name), [html]);\n    };\n}\n\n},{\"./html\":18,\"./styles/html-paths\":27}],31:[function(require,module,exports){\nvar util = require(\"util\");\nvar _ = require(\"underscore\");\n\nexports.writer = writer;\n\nfunction writer(options) {\n    options = options || {};\n    if (options.prettyPrint) {\n        return prettyWriter();\n    } else {\n        return simpleWriter();\n    }\n}\n\n\nvar indentedElements = {\n    div: true,\n    p: true,\n    ul: true,\n    li: true\n};\n\n\nfunction prettyWriter() {\n    var indentationLevel = 0;\n    var indentation = \"  \";\n    var stack = [];\n    var start = true;\n    var inText = false;\n    \n    var writer = simpleWriter();\n    \n    function open(tagName, attributes) {\n        if (indentedElements[tagName]) {\n            indent();\n        }\n        stack.push(tagName);\n        writer.open(tagName, attributes);\n        if (indentedElements[tagName]) {\n            indentationLevel++;\n        }\n        start = false;\n    }\n    \n    function close(tagName) {\n        if (indentedElements[tagName]) {\n            indentationLevel--;\n            indent();\n        }\n        stack.pop();\n        writer.close(tagName);\n    }\n    \n    function text(value) {\n        startText();\n        var text = isInPre() ? value : value.replace(\"\\n\", \"\\n\" + indentation);\n        writer.text(text);\n    }\n    \n    function selfClosing(tagName, attributes) {\n        indent();\n        writer.selfClosing(tagName, attributes);\n    }\n    \n    function insideIndentedElement() {\n        return stack.length === 0 || indentedElements[stack[stack.length - 1]];\n    }\n    \n    function startText() {\n        if (!inText) {\n            indent();\n            inText = true;\n        }\n    }\n    \n    function indent() {\n        inText = false;\n        if (!start && insideIndentedElement() && !isInPre()) {\n            writer._append(\"\\n\");\n            for (var i = 0; i < indentationLevel; i++) {\n                writer._append(indentation);\n            }\n        }\n    }\n    \n    function isInPre() {\n        return _.some(stack, function(tagName) {\n            return tagName === \"pre\";\n        });\n    }\n    \n    return {\n        asString: writer.asString,\n        open: open,\n        close: close,\n        text: text,\n        selfClosing: selfClosing\n    };\n}\n\n\nfunction simpleWriter() {\n    var fragments = [];\n    \n    function open(tagName, attributes) {\n        var attributeString = generateAttributeString(attributes);\n        fragments.push(util.format(\"<%s%s>\", tagName, attributeString));\n    }\n    \n    function close(tagName) {\n        fragments.push(util.format(\"</%s>\", tagName));\n    }\n    \n    function selfClosing(tagName, attributes) {\n        var attributeString = generateAttributeString(attributes);\n        fragments.push(util.format(\"<%s%s />\", tagName, attributeString));\n    }\n    \n    function generateAttributeString(attributes) {\n        return _.map(attributes, function(value, key) {\n            return util.format(' %s=\"%s\"', key, escapeHtmlAttribute(value));\n        }).join(\"\");\n    }\n    \n    function text(value) {\n        fragments.push(escapeHtmlText(value));\n    }\n    \n    function append(html) {\n        fragments.push(html);\n    }\n    \n    function asString() {\n        return fragments.join(\"\");\n    }\n    \n    return {\n        asString: asString,\n        open: open,\n        close: close,\n        text: text,\n        selfClosing: selfClosing,\n        _append: append\n    };\n}\n\nfunction escapeHtmlText(value) {\n    return value\n        .replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;');\n}\n\nfunction escapeHtmlAttribute(value) {\n    return value\n        .replace(/&/g, '&amp;')\n        .replace(/\"/g, '&quot;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;');\n}\n\n},{\"underscore\":153,\"util\":157}],32:[function(require,module,exports){\nvar htmlWriter = require(\"./html-writer\");\nvar markdownWriter = require(\"./markdown-writer\");\n\nexports.writer = writer;\n\n\nfunction writer(options) {\n    options = options || {};\n    if (options.outputFormat === \"markdown\") {\n        return markdownWriter.writer();\n    } else {\n        return htmlWriter.writer(options);\n    }\n}\n\n},{\"./html-writer\":31,\"./markdown-writer\":33}],33:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\n\nfunction symmetricMarkdownElement(end) {\n    return markdownElement(end, end);\n}\n\nfunction markdownElement(start, end) {\n    return function() {\n        return {start: start, end: end};\n    };\n}\n\nfunction markdownLink(attributes) {\n    var href = attributes.href || \"\";\n    if (href) {\n        return {\n            start: \"[\",\n            end: \"](\" + href + \")\",\n            anchorPosition: \"before\"\n        };\n    } else {\n        return {};\n    }\n}\n\nfunction markdownImage(attributes) {\n    var src = attributes.src || \"\";\n    var altText = attributes.alt || \"\";\n    if (src || altText) {\n        return {start: \"![\" + altText + \"](\" + src + \")\"};\n    } else {\n        return {};\n    }\n}\n\nfunction markdownList(options) {\n    return function(attributes, list) {\n        return {\n            start: list ? \"\\n\" : \"\",\n            end: list ? \"\" : \"\\n\",\n            list: {\n                isOrdered: options.isOrdered,\n                indent: list ? list.indent + 1 : 0,\n                count: 0\n            }\n        };\n    };\n}\n\nfunction markdownListItem(attributes, list, listItem) {\n    list = list || {indent: 0, isOrdered: false, count: 0};\n    list.count++;\n    listItem.hasClosed = false;\n    \n    var bullet = list.isOrdered ? list.count + \".\" : \"-\";\n    var start = repeatString(\"\\t\", list.indent) + bullet + \" \";\n        \n    return {\n        start: start,\n        end: function() {\n            if (!listItem.hasClosed) {\n                listItem.hasClosed = true;\n                return \"\\n\";\n            }\n        }\n    };\n}\n\nvar htmlToMarkdown = {\n    \"p\": markdownElement(\"\", \"\\n\\n\"),\n    \"br\": markdownElement(\"\", \"  \\n\"),\n    \"ul\": markdownList({isOrdered: false}),\n    \"ol\": markdownList({isOrdered: true}),\n    \"li\": markdownListItem,\n    \"strong\": symmetricMarkdownElement(\"__\"),\n    \"em\": symmetricMarkdownElement(\"*\"),\n    \"a\": markdownLink,\n    \"img\": markdownImage\n};\n\n(function() {\n    for (var i = 1; i <= 6; i++) {\n        htmlToMarkdown[\"h\" + i] = markdownElement(repeatString(\"#\", i) + \" \", \"\\n\\n\");\n    }\n})();\n\nfunction repeatString(value, count) {\n    return new Array(count + 1).join(value);\n}\n\nfunction markdownWriter() {\n    var fragments = [];\n    var elementStack = [];\n    var list = null;\n    var listItem = {};\n    \n    function open(tagName, attributes) {\n        attributes = attributes || {};\n        \n        var createElement = htmlToMarkdown[tagName] || function() {\n            return {};\n        };\n        var element = createElement(attributes, list, listItem);\n        elementStack.push({end: element.end, list: list});\n        \n        if (element.list) {\n            list = element.list;\n        }\n        \n        var anchorBeforeStart = element.anchorPosition === \"before\";\n        if (anchorBeforeStart) {\n            writeAnchor(attributes);\n        }\n\n        fragments.push(element.start || \"\");\n        if (!anchorBeforeStart) {\n            writeAnchor(attributes);\n        }\n    }\n    \n    function writeAnchor(attributes) {\n        if (attributes.id) {\n            fragments.push('<a id=\"' + attributes.id + '\"></a>');\n        }\n    }\n    \n    function close(tagName) {\n        var element = elementStack.pop();\n        list = element.list;\n        var end = _.isFunction(element.end) ? element.end() : element.end;\n        fragments.push(end || \"\");\n    }\n    \n    function selfClosing(tagName, attributes) {\n        open(tagName, attributes);\n        close(tagName);\n    }\n    \n    function text(value) {\n        fragments.push(escapeMarkdown(value));\n    }\n    \n    function asString() {\n        return fragments.join(\"\");\n    }\n\n    return {\n        asString: asString,\n        open: open,\n        close: close,\n        text: text,\n        selfClosing: selfClosing\n    };\n}\n\nexports.writer = markdownWriter;\n\nfunction escapeMarkdown(value) {\n    return value\n        .replace(/\\\\/g, '\\\\\\\\')\n        .replace(/([\\`\\*_\\{\\}\\[\\]\\(\\)\\#\\+\\-\\.\\!])/g, '\\\\$1');\n}\n\n},{\"underscore\":153}],34:[function(require,module,exports){\nvar nodes = require(\"./nodes\");\n\nexports.Element = nodes.Element;\nexports.element = nodes.element;\nexports.text = nodes.text;\nexports.readString = require(\"./reader\").readString;\nexports.writeString = require(\"./writer\").writeString;\n\n},{\"./nodes\":35,\"./reader\":36,\"./writer\":37}],35:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\n\nexports.Element = Element;\nexports.element = function(name, attributes, children) {\n    return new Element(name, attributes, children);\n};\nexports.text = function(value) {\n    return {\n        type: \"text\",\n        value: value\n    };\n};\n\n\nvar emptyElement = {\n    first: function() {\n        return null;\n    },\n    firstOrEmpty: function() {\n        return emptyElement;\n    },\n    attributes: {}\n};\n\nfunction Element(name, attributes, children) {\n    this.type = \"element\";\n    this.name = name;\n    this.attributes = attributes || {};\n    this.children = children || [];\n}\n\nElement.prototype.first = function(name) {\n    return _.find(this.children, function(child) {\n        return child.name === name;\n    });\n};\n\nElement.prototype.firstOrEmpty = function(name) {\n    return this.first(name) || emptyElement;\n};\n\nElement.prototype.getElementsByTagName = function(name) {\n    var elements = _.filter(this.children, function(child) {\n        return child.name === name;\n    });\n    return toElementList(elements);\n};\n\nElement.prototype.text = function() {\n    if (this.children.length === 0) {\n        return \"\";\n    } else if (this.children.length !== 1 || this.children[0].type !== \"text\") {\n        throw new Error(\"Not implemented\");\n    }\n    return this.children[0].value;\n};\n\nvar elementListPrototype = {\n    getElementsByTagName: function(name) {\n        return toElementList(_.flatten(this.map(function(element) {\n            return element.getElementsByTagName(name);\n        }, true)));\n    }\n};\n\nfunction toElementList(array) {\n    return _.extend(array, elementListPrototype);\n}\n\n},{\"underscore\":153}],36:[function(require,module,exports){\nvar promises = require(\"../promises\");\nvar sax = require(\"sax\");\nvar _ = require(\"underscore\");\n\nvar nodes = require(\"./nodes\");\nvar Element = nodes.Element;\n\nexports.readString = readString;\n\nfunction readString(xmlString, namespaceMap) {\n    namespaceMap = namespaceMap || {};\n    \n    var finished = false;\n    var parser = sax.parser(true, {xmlns: true, position: false});\n    \n    var rootElement = {children: []};\n    var currentElement = rootElement;\n    var stack = [];\n    \n    var deferred = promises.defer();\n    \n    parser.onopentag = function(node) {\n        var attributes = mapObject(node.attributes, function(attribute) {\n            return attribute.value;\n        }, mapName);\n        \n        var element = new Element(mapName(node), attributes);\n        currentElement.children.push(element);\n        stack.push(currentElement);\n        currentElement = element;\n    };\n    \n    function mapName(node) {\n        if (node.uri) {\n            var mappedPrefix = namespaceMap[node.uri];\n            var prefix;\n            if (mappedPrefix) {\n                prefix = mappedPrefix + \":\";\n            } else {\n                prefix = \"{\" + node.uri + \"}\";\n            }\n            return prefix + node.local;\n        } else {\n            return node.local;\n        }\n    }\n    \n    parser.onclosetag = function(node) {\n        currentElement = stack.pop();\n    };\n    \n    parser.ontext = function(text) {\n        if (currentElement !== rootElement) {\n            currentElement.children.push(nodes.text(text));\n        }\n    };\n    \n    parser.onend = function() {\n        if (!finished) {\n            finished = true;\n            deferred.resolve(rootElement.children[0]);\n        }\n    };\n    \n    parser.onerror = function(error) {\n        if (!finished) {\n            finished = true;\n            deferred.reject(error);\n        }\n    };\n    \n    parser.write(xmlString).close();\n    \n    return deferred.promise;\n}\n\nfunction mapObject(input, valueFunc, keyFunc) {\n    return _.reduce(input, function(result, value, key) {\n        var mappedKey = keyFunc(value, key, input);\n        result[mappedKey] = valueFunc(value, key, input);\n        return result;\n    }, {});\n}\n\n},{\"../promises\":23,\"./nodes\":35,\"sax\":150,\"underscore\":153}],37:[function(require,module,exports){\nvar _ = require(\"underscore\");\nvar xmlbuilder = require(\"xmlbuilder\");\n\n\nexports.writeString = writeString;\n\n\nfunction writeString(root, namespaces) {\n    var uriToPrefix = _.invert(namespaces);\n    \n    var nodeWriters = {\n        element: writeElement,\n        text: writeTextNode\n    };\n\n    function writeNode(builder, node) {\n        return nodeWriters[node.type](builder, node);\n    }\n\n    function writeElement(builder, element) {\n        var elementBuilder = builder.element(mapElementName(element.name), element.attributes);\n        element.children.forEach(function(child) {\n            writeNode(elementBuilder, child);\n        });\n    }\n    \n    function mapElementName(name) {\n        var longFormMatch = /^\\{(.*)\\}(.*)$/.exec(name);\n        if (longFormMatch) {\n            var prefix = uriToPrefix[longFormMatch[1]];\n            return prefix + (prefix === \"\" ? \"\" : \":\") + longFormMatch[2];\n        } else {\n            return name;\n        }\n    }\n    \n    function writeDocument(root) {\n        var builder = xmlbuilder\n            .create(mapElementName(root.name), {\n                version: '1.0',\n                encoding: 'UTF-8',\n                standalone: true\n            });\n        \n        _.forEach(namespaces, function(uri, prefix) {\n            var key = \"xmlns\" + (prefix === \"\" ? \"\" : \":\" + prefix);\n            builder.attribute(key, uri);\n        });\n        \n        root.children.forEach(function(child) {\n            writeNode(builder, child);\n        });\n        return builder.end();\n    }\n\n    return writeDocument(root);\n}\n\nfunction writeTextNode(builder, node) {\n    builder.text(node.value);\n}\n\n},{\"underscore\":153,\"xmlbuilder\":179}],38:[function(require,module,exports){\n(function (Buffer){\nvar JSZip = require(\"jszip\");\n\nvar promises = require(\"./promises\");\n\nexports.openArrayBuffer = openArrayBuffer;\nexports.splitPath = splitPath;\nexports.joinPath = joinPath;\n\nfunction openArrayBuffer(arrayBuffer) {\n    var zipFile = new JSZip(arrayBuffer);\n    function exists(name) {\n        return zipFile.file(name) !== null;\n    }\n    \n    function read(name, encoding) {\n        var array = zipFile.file(name).asUint8Array();\n        var buffer = new Buffer(array);\n        if (encoding) {\n            return promises.when(buffer.toString(encoding));\n        } else {\n            return promises.when(buffer);\n        }\n    }\n    \n    function write(name, contents) {\n        zipFile.file(name, contents);\n    }\n    \n    function toBuffer() {\n        return zipFile.generate({type: \"nodebuffer\"});\n    }\n    \n    return {\n        exists: exists,\n        read: read,\n        write: write,\n        toBuffer: toBuffer\n    };\n}\n\nfunction splitPath(path) {\n    var lastIndex = path.lastIndexOf(\"/\");\n    if (lastIndex === -1) {\n        return {dirname: \"\", basename: path};\n    } else {\n        return {\n            dirname: path.substring(0, lastIndex),\n            basename: path.substring(lastIndex + 1)\n        };\n    }\n}\n\nfunction joinPath() {\n    var nonEmptyPaths = Array.prototype.filter.call(arguments, function(path) {\n        return path;\n    });\n    \n    var relevantPaths = [];\n    \n    nonEmptyPaths.forEach(function(path) {\n        if (/^\\//.test(path)) {\n            relevantPaths = [path];\n        } else {\n            relevantPaths.push(path);\n        }\n    });\n    \n    return relevantPaths.join(\"/\");\n}\n\n}).call(this,require(\"buffer\").Buffer)\n},{\"./promises\":23,\"buffer\":77,\"jszip\":92}],39:[function(require,module,exports){\n'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction placeHoldersCount (b64) {\n  var len = b64.length\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // the number of equal signs (place holders)\n  // if there are two placeholders, than the two characters before it\n  // represent one byte\n  // if there is only one, then the three characters before it represent 2 bytes\n  // this is just a cheap hack to not do indexOf twice\n  return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0\n}\n\nfunction byteLength (b64) {\n  // base64 is 4/3 + up to two characters of the original data\n  return b64.length * 3 / 4 - placeHoldersCount(b64)\n}\n\nfunction toByteArray (b64) {\n  var i, j, l, tmp, placeHolders, arr\n  var len = b64.length\n  placeHolders = placeHoldersCount(b64)\n\n  arr = new Arr(len * 3 / 4 - placeHolders)\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  l = placeHolders > 0 ? len - 4 : len\n\n  var L = 0\n\n  for (i = 0, j = 0; i < l; i += 4, j += 3) {\n    tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]\n    arr[L++] = (tmp >> 16) & 0xFF\n    arr[L++] = (tmp >> 8) & 0xFF\n    arr[L++] = tmp & 0xFF\n  }\n\n  if (placeHolders === 2) {\n    tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[L++] = tmp & 0xFF\n  } else if (placeHolders === 1) {\n    tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[L++] = (tmp >> 8) & 0xFF\n    arr[L++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var output = ''\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    output += lookup[tmp >> 2]\n    output += lookup[(tmp << 4) & 0x3F]\n    output += '=='\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + (uint8[len - 1])\n    output += lookup[tmp >> 10]\n    output += lookup[(tmp >> 4) & 0x3F]\n    output += lookup[(tmp << 2) & 0x3F]\n    output += '='\n  }\n\n  parts.push(output)\n\n  return parts.join('')\n}\n\n},{}],40:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nvar SomePromiseArray = Promise._SomePromiseArray;\nfunction any(promises) {\n    var ret = new SomePromiseArray(promises);\n    var promise = ret.promise();\n    ret.setHowMany(1);\n    ret.setUnwrap();\n    ret.init();\n    return promise;\n}\n\nPromise.any = function (promises) {\n    return any(promises);\n};\n\nPromise.prototype.any = function () {\n    return any(this);\n};\n\n};\n\n},{}],41:[function(require,module,exports){\n(function (process){\n\"use strict\";\nvar firstLineError;\ntry {throw new Error(); } catch (e) {firstLineError = e;}\nvar schedule = require(\"./schedule\");\nvar Queue = require(\"./queue\");\nvar util = require(\"./util\");\n\nfunction Async() {\n    this._customScheduler = false;\n    this._isTickUsed = false;\n    this._lateQueue = new Queue(16);\n    this._normalQueue = new Queue(16);\n    this._haveDrainedQueues = false;\n    this._trampolineEnabled = true;\n    var self = this;\n    this.drainQueues = function () {\n        self._drainQueues();\n    };\n    this._schedule = schedule;\n}\n\nAsync.prototype.setScheduler = function(fn) {\n    var prev = this._schedule;\n    this._schedule = fn;\n    this._customScheduler = true;\n    return prev;\n};\n\nAsync.prototype.hasCustomScheduler = function() {\n    return this._customScheduler;\n};\n\nAsync.prototype.enableTrampoline = function() {\n    this._trampolineEnabled = true;\n};\n\nAsync.prototype.disableTrampolineIfNecessary = function() {\n    if (util.hasDevTools) {\n        this._trampolineEnabled = false;\n    }\n};\n\nAsync.prototype.haveItemsQueued = function () {\n    return this._isTickUsed || this._haveDrainedQueues;\n};\n\n\nAsync.prototype.fatalError = function(e, isNode) {\n    if (isNode) {\n        process.stderr.write(\"Fatal \" + (e instanceof Error ? e.stack : e) +\n            \"\\n\");\n        process.exit(2);\n    } else {\n        this.throwLater(e);\n    }\n};\n\nAsync.prototype.throwLater = function(fn, arg) {\n    if (arguments.length === 1) {\n        arg = fn;\n        fn = function () { throw arg; };\n    }\n    if (typeof setTimeout !== \"undefined\") {\n        setTimeout(function() {\n            fn(arg);\n        }, 0);\n    } else try {\n        this._schedule(function() {\n            fn(arg);\n        });\n    } catch (e) {\n        throw new Error(\"No async scheduler available\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n};\n\nfunction AsyncInvokeLater(fn, receiver, arg) {\n    this._lateQueue.push(fn, receiver, arg);\n    this._queueTick();\n}\n\nfunction AsyncInvoke(fn, receiver, arg) {\n    this._normalQueue.push(fn, receiver, arg);\n    this._queueTick();\n}\n\nfunction AsyncSettlePromises(promise) {\n    this._normalQueue._pushOne(promise);\n    this._queueTick();\n}\n\nif (!util.hasDevTools) {\n    Async.prototype.invokeLater = AsyncInvokeLater;\n    Async.prototype.invoke = AsyncInvoke;\n    Async.prototype.settlePromises = AsyncSettlePromises;\n} else {\n    Async.prototype.invokeLater = function (fn, receiver, arg) {\n        if (this._trampolineEnabled) {\n            AsyncInvokeLater.call(this, fn, receiver, arg);\n        } else {\n            this._schedule(function() {\n                setTimeout(function() {\n                    fn.call(receiver, arg);\n                }, 100);\n            });\n        }\n    };\n\n    Async.prototype.invoke = function (fn, receiver, arg) {\n        if (this._trampolineEnabled) {\n            AsyncInvoke.call(this, fn, receiver, arg);\n        } else {\n            this._schedule(function() {\n                fn.call(receiver, arg);\n            });\n        }\n    };\n\n    Async.prototype.settlePromises = function(promise) {\n        if (this._trampolineEnabled) {\n            AsyncSettlePromises.call(this, promise);\n        } else {\n            this._schedule(function() {\n                promise._settlePromises();\n            });\n        }\n    };\n}\n\nAsync.prototype._drainQueue = function(queue) {\n    while (queue.length() > 0) {\n        var fn = queue.shift();\n        if (typeof fn !== \"function\") {\n            fn._settlePromises();\n            continue;\n        }\n        var receiver = queue.shift();\n        var arg = queue.shift();\n        fn.call(receiver, arg);\n    }\n};\n\nAsync.prototype._drainQueues = function () {\n    this._drainQueue(this._normalQueue);\n    this._reset();\n    this._haveDrainedQueues = true;\n    this._drainQueue(this._lateQueue);\n};\n\nAsync.prototype._queueTick = function () {\n    if (!this._isTickUsed) {\n        this._isTickUsed = true;\n        this._schedule(this.drainQueues);\n    }\n};\n\nAsync.prototype._reset = function () {\n    this._isTickUsed = false;\n};\n\nmodule.exports = Async;\nmodule.exports.firstLineError = firstLineError;\n\n}).call(this,require('_process'))\n},{\"./queue\":64,\"./schedule\":67,\"./util\":74,\"_process\":138}],42:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) {\nvar calledBind = false;\nvar rejectThis = function(_, e) {\n    this._reject(e);\n};\n\nvar targetRejected = function(e, context) {\n    context.promiseRejectionQueued = true;\n    context.bindingPromise._then(rejectThis, rejectThis, null, this, e);\n};\n\nvar bindingResolved = function(thisArg, context) {\n    if (((this._bitField & 50397184) === 0)) {\n        this._resolveCallback(context.target);\n    }\n};\n\nvar bindingRejected = function(e, context) {\n    if (!context.promiseRejectionQueued) this._reject(e);\n};\n\nPromise.prototype.bind = function (thisArg) {\n    if (!calledBind) {\n        calledBind = true;\n        Promise.prototype._propagateFrom = debug.propagateFromFunction();\n        Promise.prototype._boundValue = debug.boundValueFunction();\n    }\n    var maybePromise = tryConvertToPromise(thisArg);\n    var ret = new Promise(INTERNAL);\n    ret._propagateFrom(this, 1);\n    var target = this._target();\n    ret._setBoundTo(maybePromise);\n    if (maybePromise instanceof Promise) {\n        var context = {\n            promiseRejectionQueued: false,\n            promise: ret,\n            target: target,\n            bindingPromise: maybePromise\n        };\n        target._then(INTERNAL, targetRejected, undefined, ret, context);\n        maybePromise._then(\n            bindingResolved, bindingRejected, undefined, ret, context);\n        ret._setOnCancel(maybePromise);\n    } else {\n        ret._resolveCallback(target);\n    }\n    return ret;\n};\n\nPromise.prototype._setBoundTo = function (obj) {\n    if (obj !== undefined) {\n        this._bitField = this._bitField | 2097152;\n        this._boundTo = obj;\n    } else {\n        this._bitField = this._bitField & (~2097152);\n    }\n};\n\nPromise.prototype._isBound = function () {\n    return (this._bitField & 2097152) === 2097152;\n};\n\nPromise.bind = function (thisArg, value) {\n    return Promise.resolve(value).bind(thisArg);\n};\n};\n\n},{}],43:[function(require,module,exports){\n\"use strict\";\nvar cr = Object.create;\nif (cr) {\n    var callerCache = cr(null);\n    var getterCache = cr(null);\n    callerCache[\" size\"] = getterCache[\" size\"] = 0;\n}\n\nmodule.exports = function(Promise) {\nvar util = require(\"./util\");\nvar canEvaluate = util.canEvaluate;\nvar isIdentifier = util.isIdentifier;\n\nvar getMethodCaller;\nvar getGetter;\nif (!false) {\nvar makeMethodCaller = function (methodName) {\n    return new Function(\"ensureMethod\", \"                                    \\n\\\n        return function(obj) {                                               \\n\\\n            'use strict'                                                     \\n\\\n            var len = this.length;                                           \\n\\\n            ensureMethod(obj, 'methodName');                                 \\n\\\n            switch(len) {                                                    \\n\\\n                case 1: return obj.methodName(this[0]);                      \\n\\\n                case 2: return obj.methodName(this[0], this[1]);             \\n\\\n                case 3: return obj.methodName(this[0], this[1], this[2]);    \\n\\\n                case 0: return obj.methodName();                             \\n\\\n                default:                                                     \\n\\\n                    return obj.methodName.apply(obj, this);                  \\n\\\n            }                                                                \\n\\\n        };                                                                   \\n\\\n        \".replace(/methodName/g, methodName))(ensureMethod);\n};\n\nvar makeGetter = function (propertyName) {\n    return new Function(\"obj\", \"                                             \\n\\\n        'use strict';                                                        \\n\\\n        return obj.propertyName;                                             \\n\\\n        \".replace(\"propertyName\", propertyName));\n};\n\nvar getCompiled = function(name, compiler, cache) {\n    var ret = cache[name];\n    if (typeof ret !== \"function\") {\n        if (!isIdentifier(name)) {\n            return null;\n        }\n        ret = compiler(name);\n        cache[name] = ret;\n        cache[\" size\"]++;\n        if (cache[\" size\"] > 512) {\n            var keys = Object.keys(cache);\n            for (var i = 0; i < 256; ++i) delete cache[keys[i]];\n            cache[\" size\"] = keys.length - 256;\n        }\n    }\n    return ret;\n};\n\ngetMethodCaller = function(name) {\n    return getCompiled(name, makeMethodCaller, callerCache);\n};\n\ngetGetter = function(name) {\n    return getCompiled(name, makeGetter, getterCache);\n};\n}\n\nfunction ensureMethod(obj, methodName) {\n    var fn;\n    if (obj != null) fn = obj[methodName];\n    if (typeof fn !== \"function\") {\n        var message = \"Object \" + util.classString(obj) + \" has no method '\" +\n            util.toString(methodName) + \"'\";\n        throw new Promise.TypeError(message);\n    }\n    return fn;\n}\n\nfunction caller(obj) {\n    var methodName = this.pop();\n    var fn = ensureMethod(obj, methodName);\n    return fn.apply(obj, this);\n}\nPromise.prototype.call = function (methodName) {\n    var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};\n    if (!false) {\n        if (canEvaluate) {\n            var maybeCaller = getMethodCaller(methodName);\n            if (maybeCaller !== null) {\n                return this._then(\n                    maybeCaller, undefined, undefined, args, undefined);\n            }\n        }\n    }\n    args.push(methodName);\n    return this._then(caller, undefined, undefined, args, undefined);\n};\n\nfunction namedGetter(obj) {\n    return obj[this];\n}\nfunction indexedGetter(obj) {\n    var index = +this;\n    if (index < 0) index = Math.max(0, index + obj.length);\n    return obj[index];\n}\nPromise.prototype.get = function (propertyName) {\n    var isIndex = (typeof propertyName === \"number\");\n    var getter;\n    if (!isIndex) {\n        if (canEvaluate) {\n            var maybeGetter = getGetter(propertyName);\n            getter = maybeGetter !== null ? maybeGetter : namedGetter;\n        } else {\n            getter = namedGetter;\n        }\n    } else {\n        getter = indexedGetter;\n    }\n    return this._then(getter, undefined, undefined, propertyName, undefined);\n};\n};\n\n},{\"./util\":74}],44:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, PromiseArray, apiRejection, debug) {\nvar util = require(\"./util\");\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\nvar async = Promise._async;\n\nPromise.prototype[\"break\"] = Promise.prototype.cancel = function() {\n    if (!debug.cancellation()) return this._warn(\"cancellation is disabled\");\n\n    var promise = this;\n    var child = promise;\n    while (promise._isCancellable()) {\n        if (!promise._cancelBy(child)) {\n            if (child._isFollowing()) {\n                child._followee().cancel();\n            } else {\n                child._cancelBranched();\n            }\n            break;\n        }\n\n        var parent = promise._cancellationParent;\n        if (parent == null || !parent._isCancellable()) {\n            if (promise._isFollowing()) {\n                promise._followee().cancel();\n            } else {\n                promise._cancelBranched();\n            }\n            break;\n        } else {\n            if (promise._isFollowing()) promise._followee().cancel();\n            promise._setWillBeCancelled();\n            child = promise;\n            promise = parent;\n        }\n    }\n};\n\nPromise.prototype._branchHasCancelled = function() {\n    this._branchesRemainingToCancel--;\n};\n\nPromise.prototype._enoughBranchesHaveCancelled = function() {\n    return this._branchesRemainingToCancel === undefined ||\n           this._branchesRemainingToCancel <= 0;\n};\n\nPromise.prototype._cancelBy = function(canceller) {\n    if (canceller === this) {\n        this._branchesRemainingToCancel = 0;\n        this._invokeOnCancel();\n        return true;\n    } else {\n        this._branchHasCancelled();\n        if (this._enoughBranchesHaveCancelled()) {\n            this._invokeOnCancel();\n            return true;\n        }\n    }\n    return false;\n};\n\nPromise.prototype._cancelBranched = function() {\n    if (this._enoughBranchesHaveCancelled()) {\n        this._cancel();\n    }\n};\n\nPromise.prototype._cancel = function() {\n    if (!this._isCancellable()) return;\n    this._setCancelled();\n    async.invoke(this._cancelPromises, this, undefined);\n};\n\nPromise.prototype._cancelPromises = function() {\n    if (this._length() > 0) this._settlePromises();\n};\n\nPromise.prototype._unsetOnCancel = function() {\n    this._onCancelField = undefined;\n};\n\nPromise.prototype._isCancellable = function() {\n    return this.isPending() && !this._isCancelled();\n};\n\nPromise.prototype.isCancellable = function() {\n    return this.isPending() && !this.isCancelled();\n};\n\nPromise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) {\n    if (util.isArray(onCancelCallback)) {\n        for (var i = 0; i < onCancelCallback.length; ++i) {\n            this._doInvokeOnCancel(onCancelCallback[i], internalOnly);\n        }\n    } else if (onCancelCallback !== undefined) {\n        if (typeof onCancelCallback === \"function\") {\n            if (!internalOnly) {\n                var e = tryCatch(onCancelCallback).call(this._boundValue());\n                if (e === errorObj) {\n                    this._attachExtraTrace(e.e);\n                    async.throwLater(e.e);\n                }\n            }\n        } else {\n            onCancelCallback._resultCancelled(this);\n        }\n    }\n};\n\nPromise.prototype._invokeOnCancel = function() {\n    var onCancelCallback = this._onCancel();\n    this._unsetOnCancel();\n    async.invoke(this._doInvokeOnCancel, this, onCancelCallback);\n};\n\nPromise.prototype._invokeInternalOnCancel = function() {\n    if (this._isCancellable()) {\n        this._doInvokeOnCancel(this._onCancel(), true);\n        this._unsetOnCancel();\n    }\n};\n\nPromise.prototype._resultCancelled = function() {\n    this.cancel();\n};\n\n};\n\n},{\"./util\":74}],45:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(NEXT_FILTER) {\nvar util = require(\"./util\");\nvar getKeys = require(\"./es5\").keys;\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\n\nfunction catchFilter(instances, cb, promise) {\n    return function(e) {\n        var boundTo = promise._boundValue();\n        predicateLoop: for (var i = 0; i < instances.length; ++i) {\n            var item = instances[i];\n\n            if (item === Error ||\n                (item != null && item.prototype instanceof Error)) {\n                if (e instanceof item) {\n                    return tryCatch(cb).call(boundTo, e);\n                }\n            } else if (typeof item === \"function\") {\n                var matchesPredicate = tryCatch(item).call(boundTo, e);\n                if (matchesPredicate === errorObj) {\n                    return matchesPredicate;\n                } else if (matchesPredicate) {\n                    return tryCatch(cb).call(boundTo, e);\n                }\n            } else if (util.isObject(e)) {\n                var keys = getKeys(item);\n                for (var j = 0; j < keys.length; ++j) {\n                    var key = keys[j];\n                    if (item[key] != e[key]) {\n                        continue predicateLoop;\n                    }\n                }\n                return tryCatch(cb).call(boundTo, e);\n            }\n        }\n        return NEXT_FILTER;\n    };\n}\n\nreturn catchFilter;\n};\n\n},{\"./es5\":51,\"./util\":74}],46:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nvar longStackTraces = false;\nvar contextStack = [];\n\nPromise.prototype._promiseCreated = function() {};\nPromise.prototype._pushContext = function() {};\nPromise.prototype._popContext = function() {return null;};\nPromise._peekContext = Promise.prototype._peekContext = function() {};\n\nfunction Context() {\n    this._trace = new Context.CapturedTrace(peekContext());\n}\nContext.prototype._pushContext = function () {\n    if (this._trace !== undefined) {\n        this._trace._promiseCreated = null;\n        contextStack.push(this._trace);\n    }\n};\n\nContext.prototype._popContext = function () {\n    if (this._trace !== undefined) {\n        var trace = contextStack.pop();\n        var ret = trace._promiseCreated;\n        trace._promiseCreated = null;\n        return ret;\n    }\n    return null;\n};\n\nfunction createContext() {\n    if (longStackTraces) return new Context();\n}\n\nfunction peekContext() {\n    var lastIndex = contextStack.length - 1;\n    if (lastIndex >= 0) {\n        return contextStack[lastIndex];\n    }\n    return undefined;\n}\nContext.CapturedTrace = null;\nContext.create = createContext;\nContext.deactivateLongStackTraces = function() {};\nContext.activateLongStackTraces = function() {\n    var Promise_pushContext = Promise.prototype._pushContext;\n    var Promise_popContext = Promise.prototype._popContext;\n    var Promise_PeekContext = Promise._peekContext;\n    var Promise_peekContext = Promise.prototype._peekContext;\n    var Promise_promiseCreated = Promise.prototype._promiseCreated;\n    Context.deactivateLongStackTraces = function() {\n        Promise.prototype._pushContext = Promise_pushContext;\n        Promise.prototype._popContext = Promise_popContext;\n        Promise._peekContext = Promise_PeekContext;\n        Promise.prototype._peekContext = Promise_peekContext;\n        Promise.prototype._promiseCreated = Promise_promiseCreated;\n        longStackTraces = false;\n    };\n    longStackTraces = true;\n    Promise.prototype._pushContext = Context.prototype._pushContext;\n    Promise.prototype._popContext = Context.prototype._popContext;\n    Promise._peekContext = Promise.prototype._peekContext = peekContext;\n    Promise.prototype._promiseCreated = function() {\n        var ctx = this._peekContext();\n        if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this;\n    };\n};\nreturn Context;\n};\n\n},{}],47:[function(require,module,exports){\n(function (process){\n\"use strict\";\nmodule.exports = function(Promise, Context) {\nvar getDomain = Promise._getDomain;\nvar async = Promise._async;\nvar Warning = require(\"./errors\").Warning;\nvar util = require(\"./util\");\nvar canAttachTrace = util.canAttachTrace;\nvar unhandledRejectionHandled;\nvar possiblyUnhandledRejection;\nvar bluebirdFramePattern =\n    /[\\\\\\/]bluebird[\\\\\\/]js[\\\\\\/](release|debug|instrumented)/;\nvar nodeFramePattern = /\\((?:timers\\.js):\\d+:\\d+\\)/;\nvar parseLinePattern = /[\\/<\\(](.+?):(\\d+):(\\d+)\\)?\\s*$/;\nvar stackFramePattern = null;\nvar formatStack = null;\nvar indentStackFrames = false;\nvar printWarning;\nvar debugging = !!(util.env(\"BLUEBIRD_DEBUG\") != 0 &&\n                        (false ||\n                         util.env(\"BLUEBIRD_DEBUG\") ||\n                         util.env(\"NODE_ENV\") === \"development\"));\n\nvar warnings = !!(util.env(\"BLUEBIRD_WARNINGS\") != 0 &&\n    (debugging || util.env(\"BLUEBIRD_WARNINGS\")));\n\nvar longStackTraces = !!(util.env(\"BLUEBIRD_LONG_STACK_TRACES\") != 0 &&\n    (debugging || util.env(\"BLUEBIRD_LONG_STACK_TRACES\")));\n\nvar wForgottenReturn = util.env(\"BLUEBIRD_W_FORGOTTEN_RETURN\") != 0 &&\n    (warnings || !!util.env(\"BLUEBIRD_W_FORGOTTEN_RETURN\"));\n\nPromise.prototype.suppressUnhandledRejections = function() {\n    var target = this._target();\n    target._bitField = ((target._bitField & (~1048576)) |\n                      524288);\n};\n\nPromise.prototype._ensurePossibleRejectionHandled = function () {\n    if ((this._bitField & 524288) !== 0) return;\n    this._setRejectionIsUnhandled();\n    async.invokeLater(this._notifyUnhandledRejection, this, undefined);\n};\n\nPromise.prototype._notifyUnhandledRejectionIsHandled = function () {\n    fireRejectionEvent(\"rejectionHandled\",\n                                  unhandledRejectionHandled, undefined, this);\n};\n\nPromise.prototype._setReturnedNonUndefined = function() {\n    this._bitField = this._bitField | 268435456;\n};\n\nPromise.prototype._returnedNonUndefined = function() {\n    return (this._bitField & 268435456) !== 0;\n};\n\nPromise.prototype._notifyUnhandledRejection = function () {\n    if (this._isRejectionUnhandled()) {\n        var reason = this._settledValue();\n        this._setUnhandledRejectionIsNotified();\n        fireRejectionEvent(\"unhandledRejection\",\n                                      possiblyUnhandledRejection, reason, this);\n    }\n};\n\nPromise.prototype._setUnhandledRejectionIsNotified = function () {\n    this._bitField = this._bitField | 262144;\n};\n\nPromise.prototype._unsetUnhandledRejectionIsNotified = function () {\n    this._bitField = this._bitField & (~262144);\n};\n\nPromise.prototype._isUnhandledRejectionNotified = function () {\n    return (this._bitField & 262144) > 0;\n};\n\nPromise.prototype._setRejectionIsUnhandled = function () {\n    this._bitField = this._bitField | 1048576;\n};\n\nPromise.prototype._unsetRejectionIsUnhandled = function () {\n    this._bitField = this._bitField & (~1048576);\n    if (this._isUnhandledRejectionNotified()) {\n        this._unsetUnhandledRejectionIsNotified();\n        this._notifyUnhandledRejectionIsHandled();\n    }\n};\n\nPromise.prototype._isRejectionUnhandled = function () {\n    return (this._bitField & 1048576) > 0;\n};\n\nPromise.prototype._warn = function(message, shouldUseOwnTrace, promise) {\n    return warn(message, shouldUseOwnTrace, promise || this);\n};\n\nPromise.onPossiblyUnhandledRejection = function (fn) {\n    var domain = getDomain();\n    possiblyUnhandledRejection =\n        typeof fn === \"function\" ? (domain === null ?\n                                            fn : util.domainBind(domain, fn))\n                                 : undefined;\n};\n\nPromise.onUnhandledRejectionHandled = function (fn) {\n    var domain = getDomain();\n    unhandledRejectionHandled =\n        typeof fn === \"function\" ? (domain === null ?\n                                            fn : util.domainBind(domain, fn))\n                                 : undefined;\n};\n\nvar disableLongStackTraces = function() {};\nPromise.longStackTraces = function () {\n    if (async.haveItemsQueued() && !config.longStackTraces) {\n        throw new Error(\"cannot enable long stack traces after promises have been created\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    if (!config.longStackTraces && longStackTracesIsSupported()) {\n        var Promise_captureStackTrace = Promise.prototype._captureStackTrace;\n        var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace;\n        config.longStackTraces = true;\n        disableLongStackTraces = function() {\n            if (async.haveItemsQueued() && !config.longStackTraces) {\n                throw new Error(\"cannot enable long stack traces after promises have been created\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n            }\n            Promise.prototype._captureStackTrace = Promise_captureStackTrace;\n            Promise.prototype._attachExtraTrace = Promise_attachExtraTrace;\n            Context.deactivateLongStackTraces();\n            async.enableTrampoline();\n            config.longStackTraces = false;\n        };\n        Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace;\n        Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace;\n        Context.activateLongStackTraces();\n        async.disableTrampolineIfNecessary();\n    }\n};\n\nPromise.hasLongStackTraces = function () {\n    return config.longStackTraces && longStackTracesIsSupported();\n};\n\nvar fireDomEvent = (function() {\n    try {\n        if (typeof CustomEvent === \"function\") {\n            var event = new CustomEvent(\"CustomEvent\");\n            util.global.dispatchEvent(event);\n            return function(name, event) {\n                var domEvent = new CustomEvent(name.toLowerCase(), {\n                    detail: event,\n                    cancelable: true\n                });\n                return !util.global.dispatchEvent(domEvent);\n            };\n        } else if (typeof Event === \"function\") {\n            var event = new Event(\"CustomEvent\");\n            util.global.dispatchEvent(event);\n            return function(name, event) {\n                var domEvent = new Event(name.toLowerCase(), {\n                    cancelable: true\n                });\n                domEvent.detail = event;\n                return !util.global.dispatchEvent(domEvent);\n            };\n        } else {\n            var event = document.createEvent(\"CustomEvent\");\n            event.initCustomEvent(\"testingtheevent\", false, true, {});\n            util.global.dispatchEvent(event);\n            return function(name, event) {\n                var domEvent = document.createEvent(\"CustomEvent\");\n                domEvent.initCustomEvent(name.toLowerCase(), false, true,\n                    event);\n                return !util.global.dispatchEvent(domEvent);\n            };\n        }\n    } catch (e) {}\n    return function() {\n        return false;\n    };\n})();\n\nvar fireGlobalEvent = (function() {\n    if (util.isNode) {\n        return function() {\n            return process.emit.apply(process, arguments);\n        };\n    } else {\n        if (!util.global) {\n            return function() {\n                return false;\n            };\n        }\n        return function(name) {\n            var methodName = \"on\" + name.toLowerCase();\n            var method = util.global[methodName];\n            if (!method) return false;\n            method.apply(util.global, [].slice.call(arguments, 1));\n            return true;\n        };\n    }\n})();\n\nfunction generatePromiseLifecycleEventObject(name, promise) {\n    return {promise: promise};\n}\n\nvar eventToObjectGenerator = {\n    promiseCreated: generatePromiseLifecycleEventObject,\n    promiseFulfilled: generatePromiseLifecycleEventObject,\n    promiseRejected: generatePromiseLifecycleEventObject,\n    promiseResolved: generatePromiseLifecycleEventObject,\n    promiseCancelled: generatePromiseLifecycleEventObject,\n    promiseChained: function(name, promise, child) {\n        return {promise: promise, child: child};\n    },\n    warning: function(name, warning) {\n        return {warning: warning};\n    },\n    unhandledRejection: function (name, reason, promise) {\n        return {reason: reason, promise: promise};\n    },\n    rejectionHandled: generatePromiseLifecycleEventObject\n};\n\nvar activeFireEvent = function (name) {\n    var globalEventFired = false;\n    try {\n        globalEventFired = fireGlobalEvent.apply(null, arguments);\n    } catch (e) {\n        async.throwLater(e);\n        globalEventFired = true;\n    }\n\n    var domEventFired = false;\n    try {\n        domEventFired = fireDomEvent(name,\n                    eventToObjectGenerator[name].apply(null, arguments));\n    } catch (e) {\n        async.throwLater(e);\n        domEventFired = true;\n    }\n\n    return domEventFired || globalEventFired;\n};\n\nPromise.config = function(opts) {\n    opts = Object(opts);\n    if (\"longStackTraces\" in opts) {\n        if (opts.longStackTraces) {\n            Promise.longStackTraces();\n        } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {\n            disableLongStackTraces();\n        }\n    }\n    if (\"warnings\" in opts) {\n        var warningsOption = opts.warnings;\n        config.warnings = !!warningsOption;\n        wForgottenReturn = config.warnings;\n\n        if (util.isObject(warningsOption)) {\n            if (\"wForgottenReturn\" in warningsOption) {\n                wForgottenReturn = !!warningsOption.wForgottenReturn;\n            }\n        }\n    }\n    if (\"cancellation\" in opts && opts.cancellation && !config.cancellation) {\n        if (async.haveItemsQueued()) {\n            throw new Error(\n                \"cannot enable cancellation after promises are in use\");\n        }\n        Promise.prototype._clearCancellationData =\n            cancellationClearCancellationData;\n        Promise.prototype._propagateFrom = cancellationPropagateFrom;\n        Promise.prototype._onCancel = cancellationOnCancel;\n        Promise.prototype._setOnCancel = cancellationSetOnCancel;\n        Promise.prototype._attachCancellationCallback =\n            cancellationAttachCancellationCallback;\n        Promise.prototype._execute = cancellationExecute;\n        propagateFromFunction = cancellationPropagateFrom;\n        config.cancellation = true;\n    }\n    if (\"monitoring\" in opts) {\n        if (opts.monitoring && !config.monitoring) {\n            config.monitoring = true;\n            Promise.prototype._fireEvent = activeFireEvent;\n        } else if (!opts.monitoring && config.monitoring) {\n            config.monitoring = false;\n            Promise.prototype._fireEvent = defaultFireEvent;\n        }\n    }\n    return Promise;\n};\n\nfunction defaultFireEvent() { return false; }\n\nPromise.prototype._fireEvent = defaultFireEvent;\nPromise.prototype._execute = function(executor, resolve, reject) {\n    try {\n        executor(resolve, reject);\n    } catch (e) {\n        return e;\n    }\n};\nPromise.prototype._onCancel = function () {};\nPromise.prototype._setOnCancel = function (handler) { ; };\nPromise.prototype._attachCancellationCallback = function(onCancel) {\n    ;\n};\nPromise.prototype._captureStackTrace = function () {};\nPromise.prototype._attachExtraTrace = function () {};\nPromise.prototype._clearCancellationData = function() {};\nPromise.prototype._propagateFrom = function (parent, flags) {\n    ;\n    ;\n};\n\nfunction cancellationExecute(executor, resolve, reject) {\n    var promise = this;\n    try {\n        executor(resolve, reject, function(onCancel) {\n            if (typeof onCancel !== \"function\") {\n                throw new TypeError(\"onCancel must be a function, got: \" +\n                                    util.toString(onCancel));\n            }\n            promise._attachCancellationCallback(onCancel);\n        });\n    } catch (e) {\n        return e;\n    }\n}\n\nfunction cancellationAttachCancellationCallback(onCancel) {\n    if (!this._isCancellable()) return this;\n\n    var previousOnCancel = this._onCancel();\n    if (previousOnCancel !== undefined) {\n        if (util.isArray(previousOnCancel)) {\n            previousOnCancel.push(onCancel);\n        } else {\n            this._setOnCancel([previousOnCancel, onCancel]);\n        }\n    } else {\n        this._setOnCancel(onCancel);\n    }\n}\n\nfunction cancellationOnCancel() {\n    return this._onCancelField;\n}\n\nfunction cancellationSetOnCancel(onCancel) {\n    this._onCancelField = onCancel;\n}\n\nfunction cancellationClearCancellationData() {\n    this._cancellationParent = undefined;\n    this._onCancelField = undefined;\n}\n\nfunction cancellationPropagateFrom(parent, flags) {\n    if ((flags & 1) !== 0) {\n        this._cancellationParent = parent;\n        var branchesRemainingToCancel = parent._branchesRemainingToCancel;\n        if (branchesRemainingToCancel === undefined) {\n            branchesRemainingToCancel = 0;\n        }\n        parent._branchesRemainingToCancel = branchesRemainingToCancel + 1;\n    }\n    if ((flags & 2) !== 0 && parent._isBound()) {\n        this._setBoundTo(parent._boundTo);\n    }\n}\n\nfunction bindingPropagateFrom(parent, flags) {\n    if ((flags & 2) !== 0 && parent._isBound()) {\n        this._setBoundTo(parent._boundTo);\n    }\n}\nvar propagateFromFunction = bindingPropagateFrom;\n\nfunction boundValueFunction() {\n    var ret = this._boundTo;\n    if (ret !== undefined) {\n        if (ret instanceof Promise) {\n            if (ret.isFulfilled()) {\n                return ret.value();\n            } else {\n                return undefined;\n            }\n        }\n    }\n    return ret;\n}\n\nfunction longStackTracesCaptureStackTrace() {\n    this._trace = new CapturedTrace(this._peekContext());\n}\n\nfunction longStackTracesAttachExtraTrace(error, ignoreSelf) {\n    if (canAttachTrace(error)) {\n        var trace = this._trace;\n        if (trace !== undefined) {\n            if (ignoreSelf) trace = trace._parent;\n        }\n        if (trace !== undefined) {\n            trace.attachExtraTrace(error);\n        } else if (!error.__stackCleaned__) {\n            var parsed = parseStackAndMessage(error);\n            util.notEnumerableProp(error, \"stack\",\n                parsed.message + \"\\n\" + parsed.stack.join(\"\\n\"));\n            util.notEnumerableProp(error, \"__stackCleaned__\", true);\n        }\n    }\n}\n\nfunction checkForgottenReturns(returnValue, promiseCreated, name, promise,\n                               parent) {\n    if (returnValue === undefined && promiseCreated !== null &&\n        wForgottenReturn) {\n        if (parent !== undefined && parent._returnedNonUndefined()) return;\n        if ((promise._bitField & 65535) === 0) return;\n\n        if (name) name = name + \" \";\n        var handlerLine = \"\";\n        var creatorLine = \"\";\n        if (promiseCreated._trace) {\n            var traceLines = promiseCreated._trace.stack.split(\"\\n\");\n            var stack = cleanStack(traceLines);\n            for (var i = stack.length - 1; i >= 0; --i) {\n                var line = stack[i];\n                if (!nodeFramePattern.test(line)) {\n                    var lineMatches = line.match(parseLinePattern);\n                    if (lineMatches) {\n                        handlerLine  = \"at \" + lineMatches[1] +\n                            \":\" + lineMatches[2] + \":\" + lineMatches[3] + \" \";\n                    }\n                    break;\n                }\n            }\n\n            if (stack.length > 0) {\n                var firstUserLine = stack[0];\n                for (var i = 0; i < traceLines.length; ++i) {\n\n                    if (traceLines[i] === firstUserLine) {\n                        if (i > 0) {\n                            creatorLine = \"\\n\" + traceLines[i - 1];\n                        }\n                        break;\n                    }\n                }\n\n            }\n        }\n        var msg = \"a promise was created in a \" + name +\n            \"handler \" + handlerLine + \"but was not returned from it, \" +\n            \"see http://goo.gl/rRqMUw\" +\n            creatorLine;\n        promise._warn(msg, true, promiseCreated);\n    }\n}\n\nfunction deprecated(name, replacement) {\n    var message = name +\n        \" is deprecated and will be removed in a future version.\";\n    if (replacement) message += \" Use \" + replacement + \" instead.\";\n    return warn(message);\n}\n\nfunction warn(message, shouldUseOwnTrace, promise) {\n    if (!config.warnings) return;\n    var warning = new Warning(message);\n    var ctx;\n    if (shouldUseOwnTrace) {\n        promise._attachExtraTrace(warning);\n    } else if (config.longStackTraces && (ctx = Promise._peekContext())) {\n        ctx.attachExtraTrace(warning);\n    } else {\n        var parsed = parseStackAndMessage(warning);\n        warning.stack = parsed.message + \"\\n\" + parsed.stack.join(\"\\n\");\n    }\n\n    if (!activeFireEvent(\"warning\", warning)) {\n        formatAndLogError(warning, \"\", true);\n    }\n}\n\nfunction reconstructStack(message, stacks) {\n    for (var i = 0; i < stacks.length - 1; ++i) {\n        stacks[i].push(\"From previous event:\");\n        stacks[i] = stacks[i].join(\"\\n\");\n    }\n    if (i < stacks.length) {\n        stacks[i] = stacks[i].join(\"\\n\");\n    }\n    return message + \"\\n\" + stacks.join(\"\\n\");\n}\n\nfunction removeDuplicateOrEmptyJumps(stacks) {\n    for (var i = 0; i < stacks.length; ++i) {\n        if (stacks[i].length === 0 ||\n            ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {\n            stacks.splice(i, 1);\n            i--;\n        }\n    }\n}\n\nfunction removeCommonRoots(stacks) {\n    var current = stacks[0];\n    for (var i = 1; i < stacks.length; ++i) {\n        var prev = stacks[i];\n        var currentLastIndex = current.length - 1;\n        var currentLastLine = current[currentLastIndex];\n        var commonRootMeetPoint = -1;\n\n        for (var j = prev.length - 1; j >= 0; --j) {\n            if (prev[j] === currentLastLine) {\n                commonRootMeetPoint = j;\n                break;\n            }\n        }\n\n        for (var j = commonRootMeetPoint; j >= 0; --j) {\n            var line = prev[j];\n            if (current[currentLastIndex] === line) {\n                current.pop();\n                currentLastIndex--;\n            } else {\n                break;\n            }\n        }\n        current = prev;\n    }\n}\n\nfunction cleanStack(stack) {\n    var ret = [];\n    for (var i = 0; i < stack.length; ++i) {\n        var line = stack[i];\n        var isTraceLine = \"    (No stack trace)\" === line ||\n            stackFramePattern.test(line);\n        var isInternalFrame = isTraceLine && shouldIgnore(line);\n        if (isTraceLine && !isInternalFrame) {\n            if (indentStackFrames && line.charAt(0) !== \" \") {\n                line = \"    \" + line;\n            }\n            ret.push(line);\n        }\n    }\n    return ret;\n}\n\nfunction stackFramesAsArray(error) {\n    var stack = error.stack.replace(/\\s+$/g, \"\").split(\"\\n\");\n    for (var i = 0; i < stack.length; ++i) {\n        var line = stack[i];\n        if (\"    (No stack trace)\" === line || stackFramePattern.test(line)) {\n            break;\n        }\n    }\n    if (i > 0 && error.name != \"SyntaxError\") {\n        stack = stack.slice(i);\n    }\n    return stack;\n}\n\nfunction parseStackAndMessage(error) {\n    var stack = error.stack;\n    var message = error.toString();\n    stack = typeof stack === \"string\" && stack.length > 0\n                ? stackFramesAsArray(error) : [\"    (No stack trace)\"];\n    return {\n        message: message,\n        stack: error.name == \"SyntaxError\" ? stack : cleanStack(stack)\n    };\n}\n\nfunction formatAndLogError(error, title, isSoft) {\n    if (typeof console !== \"undefined\") {\n        var message;\n        if (util.isObject(error)) {\n            var stack = error.stack;\n            message = title + formatStack(stack, error);\n        } else {\n            message = title + String(error);\n        }\n        if (typeof printWarning === \"function\") {\n            printWarning(message, isSoft);\n        } else if (typeof console.log === \"function\" ||\n            typeof console.log === \"object\") {\n            console.log(message);\n        }\n    }\n}\n\nfunction fireRejectionEvent(name, localHandler, reason, promise) {\n    var localEventFired = false;\n    try {\n        if (typeof localHandler === \"function\") {\n            localEventFired = true;\n            if (name === \"rejectionHandled\") {\n                localHandler(promise);\n            } else {\n                localHandler(reason, promise);\n            }\n        }\n    } catch (e) {\n        async.throwLater(e);\n    }\n\n    if (name === \"unhandledRejection\") {\n        if (!activeFireEvent(name, reason, promise) && !localEventFired) {\n            formatAndLogError(reason, \"Unhandled rejection \");\n        }\n    } else {\n        activeFireEvent(name, promise);\n    }\n}\n\nfunction formatNonError(obj) {\n    var str;\n    if (typeof obj === \"function\") {\n        str = \"[function \" +\n            (obj.name || \"anonymous\") +\n            \"]\";\n    } else {\n        str = obj && typeof obj.toString === \"function\"\n            ? obj.toString() : util.toString(obj);\n        var ruselessToString = /\\[object [a-zA-Z0-9$_]+\\]/;\n        if (ruselessToString.test(str)) {\n            try {\n                var newStr = JSON.stringify(obj);\n                str = newStr;\n            }\n            catch(e) {\n\n            }\n        }\n        if (str.length === 0) {\n            str = \"(empty array)\";\n        }\n    }\n    return (\"(<\" + snip(str) + \">, no stack trace)\");\n}\n\nfunction snip(str) {\n    var maxChars = 41;\n    if (str.length < maxChars) {\n        return str;\n    }\n    return str.substr(0, maxChars - 3) + \"...\";\n}\n\nfunction longStackTracesIsSupported() {\n    return typeof captureStackTrace === \"function\";\n}\n\nvar shouldIgnore = function() { return false; };\nvar parseLineInfoRegex = /[\\/<\\(]([^:\\/]+):(\\d+):(?:\\d+)\\)?\\s*$/;\nfunction parseLineInfo(line) {\n    var matches = line.match(parseLineInfoRegex);\n    if (matches) {\n        return {\n            fileName: matches[1],\n            line: parseInt(matches[2], 10)\n        };\n    }\n}\n\nfunction setBounds(firstLineError, lastLineError) {\n    if (!longStackTracesIsSupported()) return;\n    var firstStackLines = firstLineError.stack.split(\"\\n\");\n    var lastStackLines = lastLineError.stack.split(\"\\n\");\n    var firstIndex = -1;\n    var lastIndex = -1;\n    var firstFileName;\n    var lastFileName;\n    for (var i = 0; i < firstStackLines.length; ++i) {\n        var result = parseLineInfo(firstStackLines[i]);\n        if (result) {\n            firstFileName = result.fileName;\n            firstIndex = result.line;\n            break;\n        }\n    }\n    for (var i = 0; i < lastStackLines.length; ++i) {\n        var result = parseLineInfo(lastStackLines[i]);\n        if (result) {\n            lastFileName = result.fileName;\n            lastIndex = result.line;\n            break;\n        }\n    }\n    if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||\n        firstFileName !== lastFileName || firstIndex >= lastIndex) {\n        return;\n    }\n\n    shouldIgnore = function(line) {\n        if (bluebirdFramePattern.test(line)) return true;\n        var info = parseLineInfo(line);\n        if (info) {\n            if (info.fileName === firstFileName &&\n                (firstIndex <= info.line && info.line <= lastIndex)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\n\nfunction CapturedTrace(parent) {\n    this._parent = parent;\n    this._promisesCreated = 0;\n    var length = this._length = 1 + (parent === undefined ? 0 : parent._length);\n    captureStackTrace(this, CapturedTrace);\n    if (length > 32) this.uncycle();\n}\nutil.inherits(CapturedTrace, Error);\nContext.CapturedTrace = CapturedTrace;\n\nCapturedTrace.prototype.uncycle = function() {\n    var length = this._length;\n    if (length < 2) return;\n    var nodes = [];\n    var stackToIndex = {};\n\n    for (var i = 0, node = this; node !== undefined; ++i) {\n        nodes.push(node);\n        node = node._parent;\n    }\n    length = this._length = i;\n    for (var i = length - 1; i >= 0; --i) {\n        var stack = nodes[i].stack;\n        if (stackToIndex[stack] === undefined) {\n            stackToIndex[stack] = i;\n        }\n    }\n    for (var i = 0; i < length; ++i) {\n        var currentStack = nodes[i].stack;\n        var index = stackToIndex[currentStack];\n        if (index !== undefined && index !== i) {\n            if (index > 0) {\n                nodes[index - 1]._parent = undefined;\n                nodes[index - 1]._length = 1;\n            }\n            nodes[i]._parent = undefined;\n            nodes[i]._length = 1;\n            var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;\n\n            if (index < length - 1) {\n                cycleEdgeNode._parent = nodes[index + 1];\n                cycleEdgeNode._parent.uncycle();\n                cycleEdgeNode._length =\n                    cycleEdgeNode._parent._length + 1;\n            } else {\n                cycleEdgeNode._parent = undefined;\n                cycleEdgeNode._length = 1;\n            }\n            var currentChildLength = cycleEdgeNode._length + 1;\n            for (var j = i - 2; j >= 0; --j) {\n                nodes[j]._length = currentChildLength;\n                currentChildLength++;\n            }\n            return;\n        }\n    }\n};\n\nCapturedTrace.prototype.attachExtraTrace = function(error) {\n    if (error.__stackCleaned__) return;\n    this.uncycle();\n    var parsed = parseStackAndMessage(error);\n    var message = parsed.message;\n    var stacks = [parsed.stack];\n\n    var trace = this;\n    while (trace !== undefined) {\n        stacks.push(cleanStack(trace.stack.split(\"\\n\")));\n        trace = trace._parent;\n    }\n    removeCommonRoots(stacks);\n    removeDuplicateOrEmptyJumps(stacks);\n    util.notEnumerableProp(error, \"stack\", reconstructStack(message, stacks));\n    util.notEnumerableProp(error, \"__stackCleaned__\", true);\n};\n\nvar captureStackTrace = (function stackDetection() {\n    var v8stackFramePattern = /^\\s*at\\s*/;\n    var v8stackFormatter = function(stack, error) {\n        if (typeof stack === \"string\") return stack;\n\n        if (error.name !== undefined &&\n            error.message !== undefined) {\n            return error.toString();\n        }\n        return formatNonError(error);\n    };\n\n    if (typeof Error.stackTraceLimit === \"number\" &&\n        typeof Error.captureStackTrace === \"function\") {\n        Error.stackTraceLimit += 6;\n        stackFramePattern = v8stackFramePattern;\n        formatStack = v8stackFormatter;\n        var captureStackTrace = Error.captureStackTrace;\n\n        shouldIgnore = function(line) {\n            return bluebirdFramePattern.test(line);\n        };\n        return function(receiver, ignoreUntil) {\n            Error.stackTraceLimit += 6;\n            captureStackTrace(receiver, ignoreUntil);\n            Error.stackTraceLimit -= 6;\n        };\n    }\n    var err = new Error();\n\n    if (typeof err.stack === \"string\" &&\n        err.stack.split(\"\\n\")[0].indexOf(\"stackDetection@\") >= 0) {\n        stackFramePattern = /@/;\n        formatStack = v8stackFormatter;\n        indentStackFrames = true;\n        return function captureStackTrace(o) {\n            o.stack = new Error().stack;\n        };\n    }\n\n    var hasStackAfterThrow;\n    try { throw new Error(); }\n    catch(e) {\n        hasStackAfterThrow = (\"stack\" in e);\n    }\n    if (!(\"stack\" in err) && hasStackAfterThrow &&\n        typeof Error.stackTraceLimit === \"number\") {\n        stackFramePattern = v8stackFramePattern;\n        formatStack = v8stackFormatter;\n        return function captureStackTrace(o) {\n            Error.stackTraceLimit += 6;\n            try { throw new Error(); }\n            catch(e) { o.stack = e.stack; }\n            Error.stackTraceLimit -= 6;\n        };\n    }\n\n    formatStack = function(stack, error) {\n        if (typeof stack === \"string\") return stack;\n\n        if ((typeof error === \"object\" ||\n            typeof error === \"function\") &&\n            error.name !== undefined &&\n            error.message !== undefined) {\n            return error.toString();\n        }\n        return formatNonError(error);\n    };\n\n    return null;\n\n})([]);\n\nif (typeof console !== \"undefined\" && typeof console.warn !== \"undefined\") {\n    printWarning = function (message) {\n        console.warn(message);\n    };\n    if (util.isNode && process.stderr.isTTY) {\n        printWarning = function(message, isSoft) {\n            var color = isSoft ? \"\\u001b[33m\" : \"\\u001b[31m\";\n            console.warn(color + message + \"\\u001b[0m\\n\");\n        };\n    } else if (!util.isNode && typeof (new Error().stack) === \"string\") {\n        printWarning = function(message, isSoft) {\n            console.warn(\"%c\" + message,\n                        isSoft ? \"color: darkorange\" : \"color: red\");\n        };\n    }\n}\n\nvar config = {\n    warnings: warnings,\n    longStackTraces: false,\n    cancellation: false,\n    monitoring: false\n};\n\nif (longStackTraces) Promise.longStackTraces();\n\nreturn {\n    longStackTraces: function() {\n        return config.longStackTraces;\n    },\n    warnings: function() {\n        return config.warnings;\n    },\n    cancellation: function() {\n        return config.cancellation;\n    },\n    monitoring: function() {\n        return config.monitoring;\n    },\n    propagateFromFunction: function() {\n        return propagateFromFunction;\n    },\n    boundValueFunction: function() {\n        return boundValueFunction;\n    },\n    checkForgottenReturns: checkForgottenReturns,\n    setBounds: setBounds,\n    warn: warn,\n    deprecated: deprecated,\n    CapturedTrace: CapturedTrace,\n    fireDomEvent: fireDomEvent,\n    fireGlobalEvent: fireGlobalEvent\n};\n};\n\n}).call(this,require('_process'))\n},{\"./errors\":50,\"./util\":74,\"_process\":138}],48:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nfunction returner() {\n    return this.value;\n}\nfunction thrower() {\n    throw this.reason;\n}\n\nPromise.prototype[\"return\"] =\nPromise.prototype.thenReturn = function (value) {\n    if (value instanceof Promise) value.suppressUnhandledRejections();\n    return this._then(\n        returner, undefined, undefined, {value: value}, undefined);\n};\n\nPromise.prototype[\"throw\"] =\nPromise.prototype.thenThrow = function (reason) {\n    return this._then(\n        thrower, undefined, undefined, {reason: reason}, undefined);\n};\n\nPromise.prototype.catchThrow = function (reason) {\n    if (arguments.length <= 1) {\n        return this._then(\n            undefined, thrower, undefined, {reason: reason}, undefined);\n    } else {\n        var _reason = arguments[1];\n        var handler = function() {throw _reason;};\n        return this.caught(reason, handler);\n    }\n};\n\nPromise.prototype.catchReturn = function (value) {\n    if (arguments.length <= 1) {\n        if (value instanceof Promise) value.suppressUnhandledRejections();\n        return this._then(\n            undefined, returner, undefined, {value: value}, undefined);\n    } else {\n        var _value = arguments[1];\n        if (_value instanceof Promise) _value.suppressUnhandledRejections();\n        var handler = function() {return _value;};\n        return this.caught(value, handler);\n    }\n};\n};\n\n},{}],49:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar PromiseReduce = Promise.reduce;\nvar PromiseAll = Promise.all;\n\nfunction promiseAllThis() {\n    return PromiseAll(this);\n}\n\nfunction PromiseMapSeries(promises, fn) {\n    return PromiseReduce(promises, fn, INTERNAL, INTERNAL);\n}\n\nPromise.prototype.each = function (fn) {\n    return PromiseReduce(this, fn, INTERNAL, 0)\n              ._then(promiseAllThis, undefined, undefined, this, undefined);\n};\n\nPromise.prototype.mapSeries = function (fn) {\n    return PromiseReduce(this, fn, INTERNAL, INTERNAL);\n};\n\nPromise.each = function (promises, fn) {\n    return PromiseReduce(promises, fn, INTERNAL, 0)\n              ._then(promiseAllThis, undefined, undefined, promises, undefined);\n};\n\nPromise.mapSeries = PromiseMapSeries;\n};\n\n\n},{}],50:[function(require,module,exports){\n\"use strict\";\nvar es5 = require(\"./es5\");\nvar Objectfreeze = es5.freeze;\nvar util = require(\"./util\");\nvar inherits = util.inherits;\nvar notEnumerableProp = util.notEnumerableProp;\n\nfunction subError(nameProperty, defaultMessage) {\n    function SubError(message) {\n        if (!(this instanceof SubError)) return new SubError(message);\n        notEnumerableProp(this, \"message\",\n            typeof message === \"string\" ? message : defaultMessage);\n        notEnumerableProp(this, \"name\", nameProperty);\n        if (Error.captureStackTrace) {\n            Error.captureStackTrace(this, this.constructor);\n        } else {\n            Error.call(this);\n        }\n    }\n    inherits(SubError, Error);\n    return SubError;\n}\n\nvar _TypeError, _RangeError;\nvar Warning = subError(\"Warning\", \"warning\");\nvar CancellationError = subError(\"CancellationError\", \"cancellation error\");\nvar TimeoutError = subError(\"TimeoutError\", \"timeout error\");\nvar AggregateError = subError(\"AggregateError\", \"aggregate error\");\ntry {\n    _TypeError = TypeError;\n    _RangeError = RangeError;\n} catch(e) {\n    _TypeError = subError(\"TypeError\", \"type error\");\n    _RangeError = subError(\"RangeError\", \"range error\");\n}\n\nvar methods = (\"join pop push shift unshift slice filter forEach some \" +\n    \"every map indexOf lastIndexOf reduce reduceRight sort reverse\").split(\" \");\n\nfor (var i = 0; i < methods.length; ++i) {\n    if (typeof Array.prototype[methods[i]] === \"function\") {\n        AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];\n    }\n}\n\nes5.defineProperty(AggregateError.prototype, \"length\", {\n    value: 0,\n    configurable: false,\n    writable: true,\n    enumerable: true\n});\nAggregateError.prototype[\"isOperational\"] = true;\nvar level = 0;\nAggregateError.prototype.toString = function() {\n    var indent = Array(level * 4 + 1).join(\" \");\n    var ret = \"\\n\" + indent + \"AggregateError of:\" + \"\\n\";\n    level++;\n    indent = Array(level * 4 + 1).join(\" \");\n    for (var i = 0; i < this.length; ++i) {\n        var str = this[i] === this ? \"[Circular AggregateError]\" : this[i] + \"\";\n        var lines = str.split(\"\\n\");\n        for (var j = 0; j < lines.length; ++j) {\n            lines[j] = indent + lines[j];\n        }\n        str = lines.join(\"\\n\");\n        ret += str + \"\\n\";\n    }\n    level--;\n    return ret;\n};\n\nfunction OperationalError(message) {\n    if (!(this instanceof OperationalError))\n        return new OperationalError(message);\n    notEnumerableProp(this, \"name\", \"OperationalError\");\n    notEnumerableProp(this, \"message\", message);\n    this.cause = message;\n    this[\"isOperational\"] = true;\n\n    if (message instanceof Error) {\n        notEnumerableProp(this, \"message\", message.message);\n        notEnumerableProp(this, \"stack\", message.stack);\n    } else if (Error.captureStackTrace) {\n        Error.captureStackTrace(this, this.constructor);\n    }\n\n}\ninherits(OperationalError, Error);\n\nvar errorTypes = Error[\"__BluebirdErrorTypes__\"];\nif (!errorTypes) {\n    errorTypes = Objectfreeze({\n        CancellationError: CancellationError,\n        TimeoutError: TimeoutError,\n        OperationalError: OperationalError,\n        RejectionError: OperationalError,\n        AggregateError: AggregateError\n    });\n    es5.defineProperty(Error, \"__BluebirdErrorTypes__\", {\n        value: errorTypes,\n        writable: false,\n        enumerable: false,\n        configurable: false\n    });\n}\n\nmodule.exports = {\n    Error: Error,\n    TypeError: _TypeError,\n    RangeError: _RangeError,\n    CancellationError: errorTypes.CancellationError,\n    OperationalError: errorTypes.OperationalError,\n    TimeoutError: errorTypes.TimeoutError,\n    AggregateError: errorTypes.AggregateError,\n    Warning: Warning\n};\n\n},{\"./es5\":51,\"./util\":74}],51:[function(require,module,exports){\nvar isES5 = (function(){\n    \"use strict\";\n    return this === undefined;\n})();\n\nif (isES5) {\n    module.exports = {\n        freeze: Object.freeze,\n        defineProperty: Object.defineProperty,\n        getDescriptor: Object.getOwnPropertyDescriptor,\n        keys: Object.keys,\n        names: Object.getOwnPropertyNames,\n        getPrototypeOf: Object.getPrototypeOf,\n        isArray: Array.isArray,\n        isES5: isES5,\n        propertyIsWritable: function(obj, prop) {\n            var descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n            return !!(!descriptor || descriptor.writable || descriptor.set);\n        }\n    };\n} else {\n    var has = {}.hasOwnProperty;\n    var str = {}.toString;\n    var proto = {}.constructor.prototype;\n\n    var ObjectKeys = function (o) {\n        var ret = [];\n        for (var key in o) {\n            if (has.call(o, key)) {\n                ret.push(key);\n            }\n        }\n        return ret;\n    };\n\n    var ObjectGetDescriptor = function(o, key) {\n        return {value: o[key]};\n    };\n\n    var ObjectDefineProperty = function (o, key, desc) {\n        o[key] = desc.value;\n        return o;\n    };\n\n    var ObjectFreeze = function (obj) {\n        return obj;\n    };\n\n    var ObjectGetPrototypeOf = function (obj) {\n        try {\n            return Object(obj).constructor.prototype;\n        }\n        catch (e) {\n            return proto;\n        }\n    };\n\n    var ArrayIsArray = function (obj) {\n        try {\n            return str.call(obj) === \"[object Array]\";\n        }\n        catch(e) {\n            return false;\n        }\n    };\n\n    module.exports = {\n        isArray: ArrayIsArray,\n        keys: ObjectKeys,\n        names: ObjectKeys,\n        defineProperty: ObjectDefineProperty,\n        getDescriptor: ObjectGetDescriptor,\n        freeze: ObjectFreeze,\n        getPrototypeOf: ObjectGetPrototypeOf,\n        isES5: isES5,\n        propertyIsWritable: function() {\n            return true;\n        }\n    };\n}\n\n},{}],52:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar PromiseMap = Promise.map;\n\nPromise.prototype.filter = function (fn, options) {\n    return PromiseMap(this, fn, options, INTERNAL);\n};\n\nPromise.filter = function (promises, fn, options) {\n    return PromiseMap(promises, fn, options, INTERNAL);\n};\n};\n\n},{}],53:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, tryConvertToPromise) {\nvar util = require(\"./util\");\nvar CancellationError = Promise.CancellationError;\nvar errorObj = util.errorObj;\n\nfunction PassThroughHandlerContext(promise, type, handler) {\n    this.promise = promise;\n    this.type = type;\n    this.handler = handler;\n    this.called = false;\n    this.cancelPromise = null;\n}\n\nPassThroughHandlerContext.prototype.isFinallyHandler = function() {\n    return this.type === 0;\n};\n\nfunction FinallyHandlerCancelReaction(finallyHandler) {\n    this.finallyHandler = finallyHandler;\n}\n\nFinallyHandlerCancelReaction.prototype._resultCancelled = function() {\n    checkCancel(this.finallyHandler);\n};\n\nfunction checkCancel(ctx, reason) {\n    if (ctx.cancelPromise != null) {\n        if (arguments.length > 1) {\n            ctx.cancelPromise._reject(reason);\n        } else {\n            ctx.cancelPromise._cancel();\n        }\n        ctx.cancelPromise = null;\n        return true;\n    }\n    return false;\n}\n\nfunction succeed() {\n    return finallyHandler.call(this, this.promise._target()._settledValue());\n}\nfunction fail(reason) {\n    if (checkCancel(this, reason)) return;\n    errorObj.e = reason;\n    return errorObj;\n}\nfunction finallyHandler(reasonOrValue) {\n    var promise = this.promise;\n    var handler = this.handler;\n\n    if (!this.called) {\n        this.called = true;\n        var ret = this.isFinallyHandler()\n            ? handler.call(promise._boundValue())\n            : handler.call(promise._boundValue(), reasonOrValue);\n        if (ret !== undefined) {\n            promise._setReturnedNonUndefined();\n            var maybePromise = tryConvertToPromise(ret, promise);\n            if (maybePromise instanceof Promise) {\n                if (this.cancelPromise != null) {\n                    if (maybePromise._isCancelled()) {\n                        var reason =\n                            new CancellationError(\"late cancellation observer\");\n                        promise._attachExtraTrace(reason);\n                        errorObj.e = reason;\n                        return errorObj;\n                    } else if (maybePromise.isPending()) {\n                        maybePromise._attachCancellationCallback(\n                            new FinallyHandlerCancelReaction(this));\n                    }\n                }\n                return maybePromise._then(\n                    succeed, fail, undefined, this, undefined);\n            }\n        }\n    }\n\n    if (promise.isRejected()) {\n        checkCancel(this);\n        errorObj.e = reasonOrValue;\n        return errorObj;\n    } else {\n        checkCancel(this);\n        return reasonOrValue;\n    }\n}\n\nPromise.prototype._passThrough = function(handler, type, success, fail) {\n    if (typeof handler !== \"function\") return this.then();\n    return this._then(success,\n                      fail,\n                      undefined,\n                      new PassThroughHandlerContext(this, type, handler),\n                      undefined);\n};\n\nPromise.prototype.lastly =\nPromise.prototype[\"finally\"] = function (handler) {\n    return this._passThrough(handler,\n                             0,\n                             finallyHandler,\n                             finallyHandler);\n};\n\nPromise.prototype.tap = function (handler) {\n    return this._passThrough(handler, 1, finallyHandler);\n};\n\nreturn PassThroughHandlerContext;\n};\n\n},{\"./util\":74}],54:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise,\n                          apiRejection,\n                          INTERNAL,\n                          tryConvertToPromise,\n                          Proxyable,\n                          debug) {\nvar errors = require(\"./errors\");\nvar TypeError = errors.TypeError;\nvar util = require(\"./util\");\nvar errorObj = util.errorObj;\nvar tryCatch = util.tryCatch;\nvar yieldHandlers = [];\n\nfunction promiseFromYieldHandler(value, yieldHandlers, traceParent) {\n    for (var i = 0; i < yieldHandlers.length; ++i) {\n        traceParent._pushContext();\n        var result = tryCatch(yieldHandlers[i])(value);\n        traceParent._popContext();\n        if (result === errorObj) {\n            traceParent._pushContext();\n            var ret = Promise.reject(errorObj.e);\n            traceParent._popContext();\n            return ret;\n        }\n        var maybePromise = tryConvertToPromise(result, traceParent);\n        if (maybePromise instanceof Promise) return maybePromise;\n    }\n    return null;\n}\n\nfunction PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {\n    if (debug.cancellation()) {\n        var internal = new Promise(INTERNAL);\n        var _finallyPromise = this._finallyPromise = new Promise(INTERNAL);\n        this._promise = internal.lastly(function() {\n            return _finallyPromise;\n        });\n        internal._captureStackTrace();\n        internal._setOnCancel(this);\n    } else {\n        var promise = this._promise = new Promise(INTERNAL);\n        promise._captureStackTrace();\n    }\n    this._stack = stack;\n    this._generatorFunction = generatorFunction;\n    this._receiver = receiver;\n    this._generator = undefined;\n    this._yieldHandlers = typeof yieldHandler === \"function\"\n        ? [yieldHandler].concat(yieldHandlers)\n        : yieldHandlers;\n    this._yieldedPromise = null;\n    this._cancellationPhase = false;\n}\nutil.inherits(PromiseSpawn, Proxyable);\n\nPromiseSpawn.prototype._isResolved = function() {\n    return this._promise === null;\n};\n\nPromiseSpawn.prototype._cleanup = function() {\n    this._promise = this._generator = null;\n    if (debug.cancellation() && this._finallyPromise !== null) {\n        this._finallyPromise._fulfill();\n        this._finallyPromise = null;\n    }\n};\n\nPromiseSpawn.prototype._promiseCancelled = function() {\n    if (this._isResolved()) return;\n    var implementsReturn = typeof this._generator[\"return\"] !== \"undefined\";\n\n    var result;\n    if (!implementsReturn) {\n        var reason = new Promise.CancellationError(\n            \"generator .return() sentinel\");\n        Promise.coroutine.returnSentinel = reason;\n        this._promise._attachExtraTrace(reason);\n        this._promise._pushContext();\n        result = tryCatch(this._generator[\"throw\"]).call(this._generator,\n                                                         reason);\n        this._promise._popContext();\n    } else {\n        this._promise._pushContext();\n        result = tryCatch(this._generator[\"return\"]).call(this._generator,\n                                                          undefined);\n        this._promise._popContext();\n    }\n    this._cancellationPhase = true;\n    this._yieldedPromise = null;\n    this._continue(result);\n};\n\nPromiseSpawn.prototype._promiseFulfilled = function(value) {\n    this._yieldedPromise = null;\n    this._promise._pushContext();\n    var result = tryCatch(this._generator.next).call(this._generator, value);\n    this._promise._popContext();\n    this._continue(result);\n};\n\nPromiseSpawn.prototype._promiseRejected = function(reason) {\n    this._yieldedPromise = null;\n    this._promise._attachExtraTrace(reason);\n    this._promise._pushContext();\n    var result = tryCatch(this._generator[\"throw\"])\n        .call(this._generator, reason);\n    this._promise._popContext();\n    this._continue(result);\n};\n\nPromiseSpawn.prototype._resultCancelled = function() {\n    if (this._yieldedPromise instanceof Promise) {\n        var promise = this._yieldedPromise;\n        this._yieldedPromise = null;\n        promise.cancel();\n    }\n};\n\nPromiseSpawn.prototype.promise = function () {\n    return this._promise;\n};\n\nPromiseSpawn.prototype._run = function () {\n    this._generator = this._generatorFunction.call(this._receiver);\n    this._receiver =\n        this._generatorFunction = undefined;\n    this._promiseFulfilled(undefined);\n};\n\nPromiseSpawn.prototype._continue = function (result) {\n    var promise = this._promise;\n    if (result === errorObj) {\n        this._cleanup();\n        if (this._cancellationPhase) {\n            return promise.cancel();\n        } else {\n            return promise._rejectCallback(result.e, false);\n        }\n    }\n\n    var value = result.value;\n    if (result.done === true) {\n        this._cleanup();\n        if (this._cancellationPhase) {\n            return promise.cancel();\n        } else {\n            return promise._resolveCallback(value);\n        }\n    } else {\n        var maybePromise = tryConvertToPromise(value, this._promise);\n        if (!(maybePromise instanceof Promise)) {\n            maybePromise =\n                promiseFromYieldHandler(maybePromise,\n                                        this._yieldHandlers,\n                                        this._promise);\n            if (maybePromise === null) {\n                this._promiseRejected(\n                    new TypeError(\n                        \"A value %s was yielded that could not be treated as a promise\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\\u000a\".replace(\"%s\", value) +\n                        \"From coroutine:\\u000a\" +\n                        this._stack.split(\"\\n\").slice(1, -7).join(\"\\n\")\n                    )\n                );\n                return;\n            }\n        }\n        maybePromise = maybePromise._target();\n        var bitField = maybePromise._bitField;\n        ;\n        if (((bitField & 50397184) === 0)) {\n            this._yieldedPromise = maybePromise;\n            maybePromise._proxy(this, null);\n        } else if (((bitField & 33554432) !== 0)) {\n            Promise._async.invoke(\n                this._promiseFulfilled, this, maybePromise._value()\n            );\n        } else if (((bitField & 16777216) !== 0)) {\n            Promise._async.invoke(\n                this._promiseRejected, this, maybePromise._reason()\n            );\n        } else {\n            this._promiseCancelled();\n        }\n    }\n};\n\nPromise.coroutine = function (generatorFunction, options) {\n    if (typeof generatorFunction !== \"function\") {\n        throw new TypeError(\"generatorFunction must be a function\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    var yieldHandler = Object(options).yieldHandler;\n    var PromiseSpawn$ = PromiseSpawn;\n    var stack = new Error().stack;\n    return function () {\n        var generator = generatorFunction.apply(this, arguments);\n        var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler,\n                                      stack);\n        var ret = spawn.promise();\n        spawn._generator = generator;\n        spawn._promiseFulfilled(undefined);\n        return ret;\n    };\n};\n\nPromise.coroutine.addYieldHandler = function(fn) {\n    if (typeof fn !== \"function\") {\n        throw new TypeError(\"expecting a function but got \" + util.classString(fn));\n    }\n    yieldHandlers.push(fn);\n};\n\nPromise.spawn = function (generatorFunction) {\n    debug.deprecated(\"Promise.spawn()\", \"Promise.coroutine()\");\n    if (typeof generatorFunction !== \"function\") {\n        return apiRejection(\"generatorFunction must be a function\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    var spawn = new PromiseSpawn(generatorFunction, this);\n    var ret = spawn.promise();\n    spawn._run(Promise.spawn);\n    return ret;\n};\n};\n\n},{\"./errors\":50,\"./util\":74}],55:[function(require,module,exports){\n\"use strict\";\nmodule.exports =\nfunction(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async,\n         getDomain) {\nvar util = require(\"./util\");\nvar canEvaluate = util.canEvaluate;\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\nvar reject;\n\nif (!false) {\nif (canEvaluate) {\n    var thenCallback = function(i) {\n        return new Function(\"value\", \"holder\", \"                             \\n\\\n            'use strict';                                                    \\n\\\n            holder.pIndex = value;                                           \\n\\\n            holder.checkFulfillment(this);                                   \\n\\\n            \".replace(/Index/g, i));\n    };\n\n    var promiseSetter = function(i) {\n        return new Function(\"promise\", \"holder\", \"                           \\n\\\n            'use strict';                                                    \\n\\\n            holder.pIndex = promise;                                         \\n\\\n            \".replace(/Index/g, i));\n    };\n\n    var generateHolderClass = function(total) {\n        var props = new Array(total);\n        for (var i = 0; i < props.length; ++i) {\n            props[i] = \"this.p\" + (i+1);\n        }\n        var assignment = props.join(\" = \") + \" = null;\";\n        var cancellationCode= \"var promise;\\n\" + props.map(function(prop) {\n            return \"                                                         \\n\\\n                promise = \" + prop + \";                                      \\n\\\n                if (promise instanceof Promise) {                            \\n\\\n                    promise.cancel();                                        \\n\\\n                }                                                            \\n\\\n            \";\n        }).join(\"\\n\");\n        var passedArguments = props.join(\", \");\n        var name = \"Holder$\" + total;\n\n\n        var code = \"return function(tryCatch, errorObj, Promise, async) {    \\n\\\n            'use strict';                                                    \\n\\\n            function [TheName](fn) {                                         \\n\\\n                [TheProperties]                                              \\n\\\n                this.fn = fn;                                                \\n\\\n                this.asyncNeeded = true;                                     \\n\\\n                this.now = 0;                                                \\n\\\n            }                                                                \\n\\\n                                                                             \\n\\\n            [TheName].prototype._callFunction = function(promise) {          \\n\\\n                promise._pushContext();                                      \\n\\\n                var ret = tryCatch(this.fn)([ThePassedArguments]);           \\n\\\n                promise._popContext();                                       \\n\\\n                if (ret === errorObj) {                                      \\n\\\n                    promise._rejectCallback(ret.e, false);                   \\n\\\n                } else {                                                     \\n\\\n                    promise._resolveCallback(ret);                           \\n\\\n                }                                                            \\n\\\n            };                                                               \\n\\\n                                                                             \\n\\\n            [TheName].prototype.checkFulfillment = function(promise) {       \\n\\\n                var now = ++this.now;                                        \\n\\\n                if (now === [TheTotal]) {                                    \\n\\\n                    if (this.asyncNeeded) {                                  \\n\\\n                        async.invoke(this._callFunction, this, promise);     \\n\\\n                    } else {                                                 \\n\\\n                        this._callFunction(promise);                         \\n\\\n                    }                                                        \\n\\\n                                                                             \\n\\\n                }                                                            \\n\\\n            };                                                               \\n\\\n                                                                             \\n\\\n            [TheName].prototype._resultCancelled = function() {              \\n\\\n                [CancellationCode]                                           \\n\\\n            };                                                               \\n\\\n                                                                             \\n\\\n            return [TheName];                                                \\n\\\n        }(tryCatch, errorObj, Promise, async);                               \\n\\\n        \";\n\n        code = code.replace(/\\[TheName\\]/g, name)\n            .replace(/\\[TheTotal\\]/g, total)\n            .replace(/\\[ThePassedArguments\\]/g, passedArguments)\n            .replace(/\\[TheProperties\\]/g, assignment)\n            .replace(/\\[CancellationCode\\]/g, cancellationCode);\n\n        return new Function(\"tryCatch\", \"errorObj\", \"Promise\", \"async\", code)\n                           (tryCatch, errorObj, Promise, async);\n    };\n\n    var holderClasses = [];\n    var thenCallbacks = [];\n    var promiseSetters = [];\n\n    for (var i = 0; i < 8; ++i) {\n        holderClasses.push(generateHolderClass(i + 1));\n        thenCallbacks.push(thenCallback(i + 1));\n        promiseSetters.push(promiseSetter(i + 1));\n    }\n\n    reject = function (reason) {\n        this._reject(reason);\n    };\n}}\n\nPromise.join = function () {\n    var last = arguments.length - 1;\n    var fn;\n    if (last > 0 && typeof arguments[last] === \"function\") {\n        fn = arguments[last];\n        if (!false) {\n            if (last <= 8 && canEvaluate) {\n                var ret = new Promise(INTERNAL);\n                ret._captureStackTrace();\n                var HolderClass = holderClasses[last - 1];\n                var holder = new HolderClass(fn);\n                var callbacks = thenCallbacks;\n\n                for (var i = 0; i < last; ++i) {\n                    var maybePromise = tryConvertToPromise(arguments[i], ret);\n                    if (maybePromise instanceof Promise) {\n                        maybePromise = maybePromise._target();\n                        var bitField = maybePromise._bitField;\n                        ;\n                        if (((bitField & 50397184) === 0)) {\n                            maybePromise._then(callbacks[i], reject,\n                                               undefined, ret, holder);\n                            promiseSetters[i](maybePromise, holder);\n                            holder.asyncNeeded = false;\n                        } else if (((bitField & 33554432) !== 0)) {\n                            callbacks[i].call(ret,\n                                              maybePromise._value(), holder);\n                        } else if (((bitField & 16777216) !== 0)) {\n                            ret._reject(maybePromise._reason());\n                        } else {\n                            ret._cancel();\n                        }\n                    } else {\n                        callbacks[i].call(ret, maybePromise, holder);\n                    }\n                }\n\n                if (!ret._isFateSealed()) {\n                    if (holder.asyncNeeded) {\n                        var domain = getDomain();\n                        if (domain !== null) {\n                            holder.fn = util.domainBind(domain, holder.fn);\n                        }\n                    }\n                    ret._setAsyncGuaranteed();\n                    ret._setOnCancel(holder);\n                }\n                return ret;\n            }\n        }\n    }\n    var $_len = arguments.length;var args = new Array($_len); for(var $_i = 0; $_i < $_len; ++$_i) {args[$_i] = arguments[$_i];};\n    if (fn) args.pop();\n    var ret = new PromiseArray(args).promise();\n    return fn !== undefined ? ret.spread(fn) : ret;\n};\n\n};\n\n},{\"./util\":74}],56:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise,\n                          PromiseArray,\n                          apiRejection,\n                          tryConvertToPromise,\n                          INTERNAL,\n                          debug) {\nvar getDomain = Promise._getDomain;\nvar util = require(\"./util\");\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\nvar async = Promise._async;\n\nfunction MappingPromiseArray(promises, fn, limit, _filter) {\n    this.constructor$(promises);\n    this._promise._captureStackTrace();\n    var domain = getDomain();\n    this._callback = domain === null ? fn : util.domainBind(domain, fn);\n    this._preservedValues = _filter === INTERNAL\n        ? new Array(this.length())\n        : null;\n    this._limit = limit;\n    this._inFlight = 0;\n    this._queue = [];\n    async.invoke(this._asyncInit, this, undefined);\n}\nutil.inherits(MappingPromiseArray, PromiseArray);\n\nMappingPromiseArray.prototype._asyncInit = function() {\n    this._init$(undefined, -2);\n};\n\nMappingPromiseArray.prototype._init = function () {};\n\nMappingPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    var values = this._values;\n    var length = this.length();\n    var preservedValues = this._preservedValues;\n    var limit = this._limit;\n\n    if (index < 0) {\n        index = (index * -1) - 1;\n        values[index] = value;\n        if (limit >= 1) {\n            this._inFlight--;\n            this._drainQueue();\n            if (this._isResolved()) return true;\n        }\n    } else {\n        if (limit >= 1 && this._inFlight >= limit) {\n            values[index] = value;\n            this._queue.push(index);\n            return false;\n        }\n        if (preservedValues !== null) preservedValues[index] = value;\n\n        var promise = this._promise;\n        var callback = this._callback;\n        var receiver = promise._boundValue();\n        promise._pushContext();\n        var ret = tryCatch(callback).call(receiver, value, index, length);\n        var promiseCreated = promise._popContext();\n        debug.checkForgottenReturns(\n            ret,\n            promiseCreated,\n            preservedValues !== null ? \"Promise.filter\" : \"Promise.map\",\n            promise\n        );\n        if (ret === errorObj) {\n            this._reject(ret.e);\n            return true;\n        }\n\n        var maybePromise = tryConvertToPromise(ret, this._promise);\n        if (maybePromise instanceof Promise) {\n            maybePromise = maybePromise._target();\n            var bitField = maybePromise._bitField;\n            ;\n            if (((bitField & 50397184) === 0)) {\n                if (limit >= 1) this._inFlight++;\n                values[index] = maybePromise;\n                maybePromise._proxy(this, (index + 1) * -1);\n                return false;\n            } else if (((bitField & 33554432) !== 0)) {\n                ret = maybePromise._value();\n            } else if (((bitField & 16777216) !== 0)) {\n                this._reject(maybePromise._reason());\n                return true;\n            } else {\n                this._cancel();\n                return true;\n            }\n        }\n        values[index] = ret;\n    }\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= length) {\n        if (preservedValues !== null) {\n            this._filter(values, preservedValues);\n        } else {\n            this._resolve(values);\n        }\n        return true;\n    }\n    return false;\n};\n\nMappingPromiseArray.prototype._drainQueue = function () {\n    var queue = this._queue;\n    var limit = this._limit;\n    var values = this._values;\n    while (queue.length > 0 && this._inFlight < limit) {\n        if (this._isResolved()) return;\n        var index = queue.pop();\n        this._promiseFulfilled(values[index], index);\n    }\n};\n\nMappingPromiseArray.prototype._filter = function (booleans, values) {\n    var len = values.length;\n    var ret = new Array(len);\n    var j = 0;\n    for (var i = 0; i < len; ++i) {\n        if (booleans[i]) ret[j++] = values[i];\n    }\n    ret.length = j;\n    this._resolve(ret);\n};\n\nMappingPromiseArray.prototype.preservedValues = function () {\n    return this._preservedValues;\n};\n\nfunction map(promises, fn, options, _filter) {\n    if (typeof fn !== \"function\") {\n        return apiRejection(\"expecting a function but got \" + util.classString(fn));\n    }\n\n    var limit = 0;\n    if (options !== undefined) {\n        if (typeof options === \"object\" && options !== null) {\n            if (typeof options.concurrency !== \"number\") {\n                return Promise.reject(\n                    new TypeError(\"'concurrency' must be a number but it is \" +\n                                    util.classString(options.concurrency)));\n            }\n            limit = options.concurrency;\n        } else {\n            return Promise.reject(new TypeError(\n                            \"options argument must be an object but it is \" +\n                             util.classString(options)));\n        }\n    }\n    limit = typeof limit === \"number\" &&\n        isFinite(limit) && limit >= 1 ? limit : 0;\n    return new MappingPromiseArray(promises, fn, limit, _filter).promise();\n}\n\nPromise.prototype.map = function (fn, options) {\n    return map(this, fn, options, null);\n};\n\nPromise.map = function (promises, fn, options, _filter) {\n    return map(promises, fn, options, _filter);\n};\n\n\n};\n\n},{\"./util\":74}],57:[function(require,module,exports){\n\"use strict\";\nmodule.exports =\nfunction(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) {\nvar util = require(\"./util\");\nvar tryCatch = util.tryCatch;\n\nPromise.method = function (fn) {\n    if (typeof fn !== \"function\") {\n        throw new Promise.TypeError(\"expecting a function but got \" + util.classString(fn));\n    }\n    return function () {\n        var ret = new Promise(INTERNAL);\n        ret._captureStackTrace();\n        ret._pushContext();\n        var value = tryCatch(fn).apply(this, arguments);\n        var promiseCreated = ret._popContext();\n        debug.checkForgottenReturns(\n            value, promiseCreated, \"Promise.method\", ret);\n        ret._resolveFromSyncValue(value);\n        return ret;\n    };\n};\n\nPromise.attempt = Promise[\"try\"] = function (fn) {\n    if (typeof fn !== \"function\") {\n        return apiRejection(\"expecting a function but got \" + util.classString(fn));\n    }\n    var ret = new Promise(INTERNAL);\n    ret._captureStackTrace();\n    ret._pushContext();\n    var value;\n    if (arguments.length > 1) {\n        debug.deprecated(\"calling Promise.try with more than 1 argument\");\n        var arg = arguments[1];\n        var ctx = arguments[2];\n        value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg)\n                                  : tryCatch(fn).call(ctx, arg);\n    } else {\n        value = tryCatch(fn)();\n    }\n    var promiseCreated = ret._popContext();\n    debug.checkForgottenReturns(\n        value, promiseCreated, \"Promise.try\", ret);\n    ret._resolveFromSyncValue(value);\n    return ret;\n};\n\nPromise.prototype._resolveFromSyncValue = function (value) {\n    if (value === util.errorObj) {\n        this._rejectCallback(value.e, false);\n    } else {\n        this._resolveCallback(value, true);\n    }\n};\n};\n\n},{\"./util\":74}],58:[function(require,module,exports){\n\"use strict\";\nvar util = require(\"./util\");\nvar maybeWrapAsError = util.maybeWrapAsError;\nvar errors = require(\"./errors\");\nvar OperationalError = errors.OperationalError;\nvar es5 = require(\"./es5\");\n\nfunction isUntypedError(obj) {\n    return obj instanceof Error &&\n        es5.getPrototypeOf(obj) === Error.prototype;\n}\n\nvar rErrorKey = /^(?:name|message|stack|cause)$/;\nfunction wrapAsOperationalError(obj) {\n    var ret;\n    if (isUntypedError(obj)) {\n        ret = new OperationalError(obj);\n        ret.name = obj.name;\n        ret.message = obj.message;\n        ret.stack = obj.stack;\n        var keys = es5.keys(obj);\n        for (var i = 0; i < keys.length; ++i) {\n            var key = keys[i];\n            if (!rErrorKey.test(key)) {\n                ret[key] = obj[key];\n            }\n        }\n        return ret;\n    }\n    util.markAsOriginatingFromRejection(obj);\n    return obj;\n}\n\nfunction nodebackForPromise(promise, multiArgs) {\n    return function(err, value) {\n        if (promise === null) return;\n        if (err) {\n            var wrapped = wrapAsOperationalError(maybeWrapAsError(err));\n            promise._attachExtraTrace(wrapped);\n            promise._reject(wrapped);\n        } else if (!multiArgs) {\n            promise._fulfill(value);\n        } else {\n            var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};\n            promise._fulfill(args);\n        }\n        promise = null;\n    };\n}\n\nmodule.exports = nodebackForPromise;\n\n},{\"./errors\":50,\"./es5\":51,\"./util\":74}],59:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nvar util = require(\"./util\");\nvar async = Promise._async;\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\n\nfunction spreadAdapter(val, nodeback) {\n    var promise = this;\n    if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback);\n    var ret =\n        tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val));\n    if (ret === errorObj) {\n        async.throwLater(ret.e);\n    }\n}\n\nfunction successAdapter(val, nodeback) {\n    var promise = this;\n    var receiver = promise._boundValue();\n    var ret = val === undefined\n        ? tryCatch(nodeback).call(receiver, null)\n        : tryCatch(nodeback).call(receiver, null, val);\n    if (ret === errorObj) {\n        async.throwLater(ret.e);\n    }\n}\nfunction errorAdapter(reason, nodeback) {\n    var promise = this;\n    if (!reason) {\n        var newReason = new Error(reason + \"\");\n        newReason.cause = reason;\n        reason = newReason;\n    }\n    var ret = tryCatch(nodeback).call(promise._boundValue(), reason);\n    if (ret === errorObj) {\n        async.throwLater(ret.e);\n    }\n}\n\nPromise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback,\n                                                                     options) {\n    if (typeof nodeback == \"function\") {\n        var adapter = successAdapter;\n        if (options !== undefined && Object(options).spread) {\n            adapter = spreadAdapter;\n        }\n        this._then(\n            adapter,\n            errorAdapter,\n            undefined,\n            this,\n            nodeback\n        );\n    }\n    return this;\n};\n};\n\n},{\"./util\":74}],60:[function(require,module,exports){\n(function (process){\n\"use strict\";\nmodule.exports = function() {\nvar makeSelfResolutionError = function () {\n    return new TypeError(\"circular promise resolution chain\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n};\nvar reflectHandler = function() {\n    return new Promise.PromiseInspection(this._target());\n};\nvar apiRejection = function(msg) {\n    return Promise.reject(new TypeError(msg));\n};\nfunction Proxyable() {}\nvar UNDEFINED_BINDING = {};\nvar util = require(\"./util\");\n\nvar getDomain;\nif (util.isNode) {\n    getDomain = function() {\n        var ret = process.domain;\n        if (ret === undefined) ret = null;\n        return ret;\n    };\n} else {\n    getDomain = function() {\n        return null;\n    };\n}\nutil.notEnumerableProp(Promise, \"_getDomain\", getDomain);\n\nvar es5 = require(\"./es5\");\nvar Async = require(\"./async\");\nvar async = new Async();\nes5.defineProperty(Promise, \"_async\", {value: async});\nvar errors = require(\"./errors\");\nvar TypeError = Promise.TypeError = errors.TypeError;\nPromise.RangeError = errors.RangeError;\nvar CancellationError = Promise.CancellationError = errors.CancellationError;\nPromise.TimeoutError = errors.TimeoutError;\nPromise.OperationalError = errors.OperationalError;\nPromise.RejectionError = errors.OperationalError;\nPromise.AggregateError = errors.AggregateError;\nvar INTERNAL = function(){};\nvar APPLY = {};\nvar NEXT_FILTER = {};\nvar tryConvertToPromise = require(\"./thenables\")(Promise, INTERNAL);\nvar PromiseArray =\n    require(\"./promise_array\")(Promise, INTERNAL,\n                               tryConvertToPromise, apiRejection, Proxyable);\nvar Context = require(\"./context\")(Promise);\n /*jshint unused:false*/\nvar createContext = Context.create;\nvar debug = require(\"./debuggability\")(Promise, Context);\nvar CapturedTrace = debug.CapturedTrace;\nvar PassThroughHandlerContext =\n    require(\"./finally\")(Promise, tryConvertToPromise);\nvar catchFilter = require(\"./catch_filter\")(NEXT_FILTER);\nvar nodebackForPromise = require(\"./nodeback\");\nvar errorObj = util.errorObj;\nvar tryCatch = util.tryCatch;\nfunction check(self, executor) {\n    if (typeof executor !== \"function\") {\n        throw new TypeError(\"expecting a function but got \" + util.classString(executor));\n    }\n    if (self.constructor !== Promise) {\n        throw new TypeError(\"the promise constructor cannot be invoked directly\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n}\n\nfunction Promise(executor) {\n    this._bitField = 0;\n    this._fulfillmentHandler0 = undefined;\n    this._rejectionHandler0 = undefined;\n    this._promise0 = undefined;\n    this._receiver0 = undefined;\n    if (executor !== INTERNAL) {\n        check(this, executor);\n        this._resolveFromExecutor(executor);\n    }\n    this._promiseCreated();\n    this._fireEvent(\"promiseCreated\", this);\n}\n\nPromise.prototype.toString = function () {\n    return \"[object Promise]\";\n};\n\nPromise.prototype.caught = Promise.prototype[\"catch\"] = function (fn) {\n    var len = arguments.length;\n    if (len > 1) {\n        var catchInstances = new Array(len - 1),\n            j = 0, i;\n        for (i = 0; i < len - 1; ++i) {\n            var item = arguments[i];\n            if (util.isObject(item)) {\n                catchInstances[j++] = item;\n            } else {\n                return apiRejection(\"expecting an object but got \" +\n                    \"A catch statement predicate \" + util.classString(item));\n            }\n        }\n        catchInstances.length = j;\n        fn = arguments[i];\n        return this.then(undefined, catchFilter(catchInstances, fn, this));\n    }\n    return this.then(undefined, fn);\n};\n\nPromise.prototype.reflect = function () {\n    return this._then(reflectHandler,\n        reflectHandler, undefined, this, undefined);\n};\n\nPromise.prototype.then = function (didFulfill, didReject) {\n    if (debug.warnings() && arguments.length > 0 &&\n        typeof didFulfill !== \"function\" &&\n        typeof didReject !== \"function\") {\n        var msg = \".then() only accepts functions but was passed: \" +\n                util.classString(didFulfill);\n        if (arguments.length > 1) {\n            msg += \", \" + util.classString(didReject);\n        }\n        this._warn(msg);\n    }\n    return this._then(didFulfill, didReject, undefined, undefined, undefined);\n};\n\nPromise.prototype.done = function (didFulfill, didReject) {\n    var promise =\n        this._then(didFulfill, didReject, undefined, undefined, undefined);\n    promise._setIsFinal();\n};\n\nPromise.prototype.spread = function (fn) {\n    if (typeof fn !== \"function\") {\n        return apiRejection(\"expecting a function but got \" + util.classString(fn));\n    }\n    return this.all()._then(fn, undefined, undefined, APPLY, undefined);\n};\n\nPromise.prototype.toJSON = function () {\n    var ret = {\n        isFulfilled: false,\n        isRejected: false,\n        fulfillmentValue: undefined,\n        rejectionReason: undefined\n    };\n    if (this.isFulfilled()) {\n        ret.fulfillmentValue = this.value();\n        ret.isFulfilled = true;\n    } else if (this.isRejected()) {\n        ret.rejectionReason = this.reason();\n        ret.isRejected = true;\n    }\n    return ret;\n};\n\nPromise.prototype.all = function () {\n    if (arguments.length > 0) {\n        this._warn(\".all() was passed arguments but it does not take any\");\n    }\n    return new PromiseArray(this).promise();\n};\n\nPromise.prototype.error = function (fn) {\n    return this.caught(util.originatesFromRejection, fn);\n};\n\nPromise.getNewLibraryCopy = module.exports;\n\nPromise.is = function (val) {\n    return val instanceof Promise;\n};\n\nPromise.fromNode = Promise.fromCallback = function(fn) {\n    var ret = new Promise(INTERNAL);\n    ret._captureStackTrace();\n    var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs\n                                         : false;\n    var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs));\n    if (result === errorObj) {\n        ret._rejectCallback(result.e, true);\n    }\n    if (!ret._isFateSealed()) ret._setAsyncGuaranteed();\n    return ret;\n};\n\nPromise.all = function (promises) {\n    return new PromiseArray(promises).promise();\n};\n\nPromise.cast = function (obj) {\n    var ret = tryConvertToPromise(obj);\n    if (!(ret instanceof Promise)) {\n        ret = new Promise(INTERNAL);\n        ret._captureStackTrace();\n        ret._setFulfilled();\n        ret._rejectionHandler0 = obj;\n    }\n    return ret;\n};\n\nPromise.resolve = Promise.fulfilled = Promise.cast;\n\nPromise.reject = Promise.rejected = function (reason) {\n    var ret = new Promise(INTERNAL);\n    ret._captureStackTrace();\n    ret._rejectCallback(reason, true);\n    return ret;\n};\n\nPromise.setScheduler = function(fn) {\n    if (typeof fn !== \"function\") {\n        throw new TypeError(\"expecting a function but got \" + util.classString(fn));\n    }\n    return async.setScheduler(fn);\n};\n\nPromise.prototype._then = function (\n    didFulfill,\n    didReject,\n    _,    receiver,\n    internalData\n) {\n    var haveInternalData = internalData !== undefined;\n    var promise = haveInternalData ? internalData : new Promise(INTERNAL);\n    var target = this._target();\n    var bitField = target._bitField;\n\n    if (!haveInternalData) {\n        promise._propagateFrom(this, 3);\n        promise._captureStackTrace();\n        if (receiver === undefined &&\n            ((this._bitField & 2097152) !== 0)) {\n            if (!((bitField & 50397184) === 0)) {\n                receiver = this._boundValue();\n            } else {\n                receiver = target === this ? undefined : this._boundTo;\n            }\n        }\n        this._fireEvent(\"promiseChained\", this, promise);\n    }\n\n    var domain = getDomain();\n    if (!((bitField & 50397184) === 0)) {\n        var handler, value, settler = target._settlePromiseCtx;\n        if (((bitField & 33554432) !== 0)) {\n            value = target._rejectionHandler0;\n            handler = didFulfill;\n        } else if (((bitField & 16777216) !== 0)) {\n            value = target._fulfillmentHandler0;\n            handler = didReject;\n            target._unsetRejectionIsUnhandled();\n        } else {\n            settler = target._settlePromiseLateCancellationObserver;\n            value = new CancellationError(\"late cancellation observer\");\n            target._attachExtraTrace(value);\n            handler = didReject;\n        }\n\n        async.invoke(settler, target, {\n            handler: domain === null ? handler\n                : (typeof handler === \"function\" &&\n                    util.domainBind(domain, handler)),\n            promise: promise,\n            receiver: receiver,\n            value: value\n        });\n    } else {\n        target._addCallbacks(didFulfill, didReject, promise, receiver, domain);\n    }\n\n    return promise;\n};\n\nPromise.prototype._length = function () {\n    return this._bitField & 65535;\n};\n\nPromise.prototype._isFateSealed = function () {\n    return (this._bitField & 117506048) !== 0;\n};\n\nPromise.prototype._isFollowing = function () {\n    return (this._bitField & 67108864) === 67108864;\n};\n\nPromise.prototype._setLength = function (len) {\n    this._bitField = (this._bitField & -65536) |\n        (len & 65535);\n};\n\nPromise.prototype._setFulfilled = function () {\n    this._bitField = this._bitField | 33554432;\n    this._fireEvent(\"promiseFulfilled\", this);\n};\n\nPromise.prototype._setRejected = function () {\n    this._bitField = this._bitField | 16777216;\n    this._fireEvent(\"promiseRejected\", this);\n};\n\nPromise.prototype._setFollowing = function () {\n    this._bitField = this._bitField | 67108864;\n    this._fireEvent(\"promiseResolved\", this);\n};\n\nPromise.prototype._setIsFinal = function () {\n    this._bitField = this._bitField | 4194304;\n};\n\nPromise.prototype._isFinal = function () {\n    return (this._bitField & 4194304) > 0;\n};\n\nPromise.prototype._unsetCancelled = function() {\n    this._bitField = this._bitField & (~65536);\n};\n\nPromise.prototype._setCancelled = function() {\n    this._bitField = this._bitField | 65536;\n    this._fireEvent(\"promiseCancelled\", this);\n};\n\nPromise.prototype._setWillBeCancelled = function() {\n    this._bitField = this._bitField | 8388608;\n};\n\nPromise.prototype._setAsyncGuaranteed = function() {\n    if (async.hasCustomScheduler()) return;\n    this._bitField = this._bitField | 134217728;\n};\n\nPromise.prototype._receiverAt = function (index) {\n    var ret = index === 0 ? this._receiver0 : this[\n            index * 4 - 4 + 3];\n    if (ret === UNDEFINED_BINDING) {\n        return undefined;\n    } else if (ret === undefined && this._isBound()) {\n        return this._boundValue();\n    }\n    return ret;\n};\n\nPromise.prototype._promiseAt = function (index) {\n    return this[\n            index * 4 - 4 + 2];\n};\n\nPromise.prototype._fulfillmentHandlerAt = function (index) {\n    return this[\n            index * 4 - 4 + 0];\n};\n\nPromise.prototype._rejectionHandlerAt = function (index) {\n    return this[\n            index * 4 - 4 + 1];\n};\n\nPromise.prototype._boundValue = function() {};\n\nPromise.prototype._migrateCallback0 = function (follower) {\n    var bitField = follower._bitField;\n    var fulfill = follower._fulfillmentHandler0;\n    var reject = follower._rejectionHandler0;\n    var promise = follower._promise0;\n    var receiver = follower._receiverAt(0);\n    if (receiver === undefined) receiver = UNDEFINED_BINDING;\n    this._addCallbacks(fulfill, reject, promise, receiver, null);\n};\n\nPromise.prototype._migrateCallbackAt = function (follower, index) {\n    var fulfill = follower._fulfillmentHandlerAt(index);\n    var reject = follower._rejectionHandlerAt(index);\n    var promise = follower._promiseAt(index);\n    var receiver = follower._receiverAt(index);\n    if (receiver === undefined) receiver = UNDEFINED_BINDING;\n    this._addCallbacks(fulfill, reject, promise, receiver, null);\n};\n\nPromise.prototype._addCallbacks = function (\n    fulfill,\n    reject,\n    promise,\n    receiver,\n    domain\n) {\n    var index = this._length();\n\n    if (index >= 65535 - 4) {\n        index = 0;\n        this._setLength(0);\n    }\n\n    if (index === 0) {\n        this._promise0 = promise;\n        this._receiver0 = receiver;\n        if (typeof fulfill === \"function\") {\n            this._fulfillmentHandler0 =\n                domain === null ? fulfill : util.domainBind(domain, fulfill);\n        }\n        if (typeof reject === \"function\") {\n            this._rejectionHandler0 =\n                domain === null ? reject : util.domainBind(domain, reject);\n        }\n    } else {\n        var base = index * 4 - 4;\n        this[base + 2] = promise;\n        this[base + 3] = receiver;\n        if (typeof fulfill === \"function\") {\n            this[base + 0] =\n                domain === null ? fulfill : util.domainBind(domain, fulfill);\n        }\n        if (typeof reject === \"function\") {\n            this[base + 1] =\n                domain === null ? reject : util.domainBind(domain, reject);\n        }\n    }\n    this._setLength(index + 1);\n    return index;\n};\n\nPromise.prototype._proxy = function (proxyable, arg) {\n    this._addCallbacks(undefined, undefined, arg, proxyable, null);\n};\n\nPromise.prototype._resolveCallback = function(value, shouldBind) {\n    if (((this._bitField & 117506048) !== 0)) return;\n    if (value === this)\n        return this._rejectCallback(makeSelfResolutionError(), false);\n    var maybePromise = tryConvertToPromise(value, this);\n    if (!(maybePromise instanceof Promise)) return this._fulfill(value);\n\n    if (shouldBind) this._propagateFrom(maybePromise, 2);\n\n    var promise = maybePromise._target();\n\n    if (promise === this) {\n        this._reject(makeSelfResolutionError());\n        return;\n    }\n\n    var bitField = promise._bitField;\n    if (((bitField & 50397184) === 0)) {\n        var len = this._length();\n        if (len > 0) promise._migrateCallback0(this);\n        for (var i = 1; i < len; ++i) {\n            promise._migrateCallbackAt(this, i);\n        }\n        this._setFollowing();\n        this._setLength(0);\n        this._setFollowee(promise);\n    } else if (((bitField & 33554432) !== 0)) {\n        this._fulfill(promise._value());\n    } else if (((bitField & 16777216) !== 0)) {\n        this._reject(promise._reason());\n    } else {\n        var reason = new CancellationError(\"late cancellation observer\");\n        promise._attachExtraTrace(reason);\n        this._reject(reason);\n    }\n};\n\nPromise.prototype._rejectCallback =\nfunction(reason, synchronous, ignoreNonErrorWarnings) {\n    var trace = util.ensureErrorObject(reason);\n    var hasStack = trace === reason;\n    if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) {\n        var message = \"a promise was rejected with a non-error: \" +\n            util.classString(reason);\n        this._warn(message, true);\n    }\n    this._attachExtraTrace(trace, synchronous ? hasStack : false);\n    this._reject(reason);\n};\n\nPromise.prototype._resolveFromExecutor = function (executor) {\n    var promise = this;\n    this._captureStackTrace();\n    this._pushContext();\n    var synchronous = true;\n    var r = this._execute(executor, function(value) {\n        promise._resolveCallback(value);\n    }, function (reason) {\n        promise._rejectCallback(reason, synchronous);\n    });\n    synchronous = false;\n    this._popContext();\n\n    if (r !== undefined) {\n        promise._rejectCallback(r, true);\n    }\n};\n\nPromise.prototype._settlePromiseFromHandler = function (\n    handler, receiver, value, promise\n) {\n    var bitField = promise._bitField;\n    if (((bitField & 65536) !== 0)) return;\n    promise._pushContext();\n    var x;\n    if (receiver === APPLY) {\n        if (!value || typeof value.length !== \"number\") {\n            x = errorObj;\n            x.e = new TypeError(\"cannot .spread() a non-array: \" +\n                                    util.classString(value));\n        } else {\n            x = tryCatch(handler).apply(this._boundValue(), value);\n        }\n    } else {\n        x = tryCatch(handler).call(receiver, value);\n    }\n    var promiseCreated = promise._popContext();\n    bitField = promise._bitField;\n    if (((bitField & 65536) !== 0)) return;\n\n    if (x === NEXT_FILTER) {\n        promise._reject(value);\n    } else if (x === errorObj) {\n        promise._rejectCallback(x.e, false);\n    } else {\n        debug.checkForgottenReturns(x, promiseCreated, \"\",  promise, this);\n        promise._resolveCallback(x);\n    }\n};\n\nPromise.prototype._target = function() {\n    var ret = this;\n    while (ret._isFollowing()) ret = ret._followee();\n    return ret;\n};\n\nPromise.prototype._followee = function() {\n    return this._rejectionHandler0;\n};\n\nPromise.prototype._setFollowee = function(promise) {\n    this._rejectionHandler0 = promise;\n};\n\nPromise.prototype._settlePromise = function(promise, handler, receiver, value) {\n    var isPromise = promise instanceof Promise;\n    var bitField = this._bitField;\n    var asyncGuaranteed = ((bitField & 134217728) !== 0);\n    if (((bitField & 65536) !== 0)) {\n        if (isPromise) promise._invokeInternalOnCancel();\n\n        if (receiver instanceof PassThroughHandlerContext &&\n            receiver.isFinallyHandler()) {\n            receiver.cancelPromise = promise;\n            if (tryCatch(handler).call(receiver, value) === errorObj) {\n                promise._reject(errorObj.e);\n            }\n        } else if (handler === reflectHandler) {\n            promise._fulfill(reflectHandler.call(receiver));\n        } else if (receiver instanceof Proxyable) {\n            receiver._promiseCancelled(promise);\n        } else if (isPromise || promise instanceof PromiseArray) {\n            promise._cancel();\n        } else {\n            receiver.cancel();\n        }\n    } else if (typeof handler === \"function\") {\n        if (!isPromise) {\n            handler.call(receiver, value, promise);\n        } else {\n            if (asyncGuaranteed) promise._setAsyncGuaranteed();\n            this._settlePromiseFromHandler(handler, receiver, value, promise);\n        }\n    } else if (receiver instanceof Proxyable) {\n        if (!receiver._isResolved()) {\n            if (((bitField & 33554432) !== 0)) {\n                receiver._promiseFulfilled(value, promise);\n            } else {\n                receiver._promiseRejected(value, promise);\n            }\n        }\n    } else if (isPromise) {\n        if (asyncGuaranteed) promise._setAsyncGuaranteed();\n        if (((bitField & 33554432) !== 0)) {\n            promise._fulfill(value);\n        } else {\n            promise._reject(value);\n        }\n    }\n};\n\nPromise.prototype._settlePromiseLateCancellationObserver = function(ctx) {\n    var handler = ctx.handler;\n    var promise = ctx.promise;\n    var receiver = ctx.receiver;\n    var value = ctx.value;\n    if (typeof handler === \"function\") {\n        if (!(promise instanceof Promise)) {\n            handler.call(receiver, value, promise);\n        } else {\n            this._settlePromiseFromHandler(handler, receiver, value, promise);\n        }\n    } else if (promise instanceof Promise) {\n        promise._reject(value);\n    }\n};\n\nPromise.prototype._settlePromiseCtx = function(ctx) {\n    this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value);\n};\n\nPromise.prototype._settlePromise0 = function(handler, value, bitField) {\n    var promise = this._promise0;\n    var receiver = this._receiverAt(0);\n    this._promise0 = undefined;\n    this._receiver0 = undefined;\n    this._settlePromise(promise, handler, receiver, value);\n};\n\nPromise.prototype._clearCallbackDataAtIndex = function(index) {\n    var base = index * 4 - 4;\n    this[base + 2] =\n    this[base + 3] =\n    this[base + 0] =\n    this[base + 1] = undefined;\n};\n\nPromise.prototype._fulfill = function (value) {\n    var bitField = this._bitField;\n    if (((bitField & 117506048) >>> 16)) return;\n    if (value === this) {\n        var err = makeSelfResolutionError();\n        this._attachExtraTrace(err);\n        return this._reject(err);\n    }\n    this._setFulfilled();\n    this._rejectionHandler0 = value;\n\n    if ((bitField & 65535) > 0) {\n        if (((bitField & 134217728) !== 0)) {\n            this._settlePromises();\n        } else {\n            async.settlePromises(this);\n        }\n    }\n};\n\nPromise.prototype._reject = function (reason) {\n    var bitField = this._bitField;\n    if (((bitField & 117506048) >>> 16)) return;\n    this._setRejected();\n    this._fulfillmentHandler0 = reason;\n\n    if (this._isFinal()) {\n        return async.fatalError(reason, util.isNode);\n    }\n\n    if ((bitField & 65535) > 0) {\n        async.settlePromises(this);\n    } else {\n        this._ensurePossibleRejectionHandled();\n    }\n};\n\nPromise.prototype._fulfillPromises = function (len, value) {\n    for (var i = 1; i < len; i++) {\n        var handler = this._fulfillmentHandlerAt(i);\n        var promise = this._promiseAt(i);\n        var receiver = this._receiverAt(i);\n        this._clearCallbackDataAtIndex(i);\n        this._settlePromise(promise, handler, receiver, value);\n    }\n};\n\nPromise.prototype._rejectPromises = function (len, reason) {\n    for (var i = 1; i < len; i++) {\n        var handler = this._rejectionHandlerAt(i);\n        var promise = this._promiseAt(i);\n        var receiver = this._receiverAt(i);\n        this._clearCallbackDataAtIndex(i);\n        this._settlePromise(promise, handler, receiver, reason);\n    }\n};\n\nPromise.prototype._settlePromises = function () {\n    var bitField = this._bitField;\n    var len = (bitField & 65535);\n\n    if (len > 0) {\n        if (((bitField & 16842752) !== 0)) {\n            var reason = this._fulfillmentHandler0;\n            this._settlePromise0(this._rejectionHandler0, reason, bitField);\n            this._rejectPromises(len, reason);\n        } else {\n            var value = this._rejectionHandler0;\n            this._settlePromise0(this._fulfillmentHandler0, value, bitField);\n            this._fulfillPromises(len, value);\n        }\n        this._setLength(0);\n    }\n    this._clearCancellationData();\n};\n\nPromise.prototype._settledValue = function() {\n    var bitField = this._bitField;\n    if (((bitField & 33554432) !== 0)) {\n        return this._rejectionHandler0;\n    } else if (((bitField & 16777216) !== 0)) {\n        return this._fulfillmentHandler0;\n    }\n};\n\nfunction deferResolve(v) {this.promise._resolveCallback(v);}\nfunction deferReject(v) {this.promise._rejectCallback(v, false);}\n\nPromise.defer = Promise.pending = function() {\n    debug.deprecated(\"Promise.defer\", \"new Promise\");\n    var promise = new Promise(INTERNAL);\n    return {\n        promise: promise,\n        resolve: deferResolve,\n        reject: deferReject\n    };\n};\n\nutil.notEnumerableProp(Promise,\n                       \"_makeSelfResolutionError\",\n                       makeSelfResolutionError);\n\nrequire(\"./method\")(Promise, INTERNAL, tryConvertToPromise, apiRejection,\n    debug);\nrequire(\"./bind\")(Promise, INTERNAL, tryConvertToPromise, debug);\nrequire(\"./cancel\")(Promise, PromiseArray, apiRejection, debug);\nrequire(\"./direct_resolve\")(Promise);\nrequire(\"./synchronous_inspection\")(Promise);\nrequire(\"./join\")(\n    Promise, PromiseArray, tryConvertToPromise, INTERNAL, async, getDomain);\nPromise.Promise = Promise;\nPromise.version = \"3.4.7\";\nrequire('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);\nrequire('./call_get.js')(Promise);\nrequire('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug);\nrequire('./timers.js')(Promise, INTERNAL, debug);\nrequire('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug);\nrequire('./nodeify.js')(Promise);\nrequire('./promisify.js')(Promise, INTERNAL);\nrequire('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);\nrequire('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);\nrequire('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);\nrequire('./settle.js')(Promise, PromiseArray, debug);\nrequire('./some.js')(Promise, PromiseArray, apiRejection);\nrequire('./filter.js')(Promise, INTERNAL);\nrequire('./each.js')(Promise, INTERNAL);\nrequire('./any.js')(Promise);\n                                                         \n    util.toFastProperties(Promise);                                          \n    util.toFastProperties(Promise.prototype);                                \n    function fillTypes(value) {                                              \n        var p = new Promise(INTERNAL);                                       \n        p._fulfillmentHandler0 = value;                                      \n        p._rejectionHandler0 = value;                                        \n        p._promise0 = value;                                                 \n        p._receiver0 = value;                                                \n    }                                                                        \n    // Complete slack tracking, opt out of field-type tracking and           \n    // stabilize map                                                         \n    fillTypes({a: 1});                                                       \n    fillTypes({b: 2});                                                       \n    fillTypes({c: 3});                                                       \n    fillTypes(1);                                                            \n    fillTypes(function(){});                                                 \n    fillTypes(undefined);                                                    \n    fillTypes(false);                                                        \n    fillTypes(new Promise(INTERNAL));                                        \n    debug.setBounds(Async.firstLineError, util.lastLineError);               \n    return Promise;                                                          \n\n};\n\n}).call(this,require('_process'))\n},{\"./any.js\":40,\"./async\":41,\"./bind\":42,\"./call_get.js\":43,\"./cancel\":44,\"./catch_filter\":45,\"./context\":46,\"./debuggability\":47,\"./direct_resolve\":48,\"./each.js\":49,\"./errors\":50,\"./es5\":51,\"./filter.js\":52,\"./finally\":53,\"./generators.js\":54,\"./join\":55,\"./map.js\":56,\"./method\":57,\"./nodeback\":58,\"./nodeify.js\":59,\"./promise_array\":61,\"./promisify.js\":62,\"./props.js\":63,\"./race.js\":65,\"./reduce.js\":66,\"./settle.js\":68,\"./some.js\":69,\"./synchronous_inspection\":70,\"./thenables\":71,\"./timers.js\":72,\"./using.js\":73,\"./util\":74,\"_process\":138}],61:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL, tryConvertToPromise,\n    apiRejection, Proxyable) {\nvar util = require(\"./util\");\nvar isArray = util.isArray;\n\nfunction toResolutionValue(val) {\n    switch(val) {\n    case -2: return [];\n    case -3: return {};\n    }\n}\n\nfunction PromiseArray(values) {\n    var promise = this._promise = new Promise(INTERNAL);\n    if (values instanceof Promise) {\n        promise._propagateFrom(values, 3);\n    }\n    promise._setOnCancel(this);\n    this._values = values;\n    this._length = 0;\n    this._totalResolved = 0;\n    this._init(undefined, -2);\n}\nutil.inherits(PromiseArray, Proxyable);\n\nPromiseArray.prototype.length = function () {\n    return this._length;\n};\n\nPromiseArray.prototype.promise = function () {\n    return this._promise;\n};\n\nPromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {\n    var values = tryConvertToPromise(this._values, this._promise);\n    if (values instanceof Promise) {\n        values = values._target();\n        var bitField = values._bitField;\n        ;\n        this._values = values;\n\n        if (((bitField & 50397184) === 0)) {\n            this._promise._setAsyncGuaranteed();\n            return values._then(\n                init,\n                this._reject,\n                undefined,\n                this,\n                resolveValueIfEmpty\n           );\n        } else if (((bitField & 33554432) !== 0)) {\n            values = values._value();\n        } else if (((bitField & 16777216) !== 0)) {\n            return this._reject(values._reason());\n        } else {\n            return this._cancel();\n        }\n    }\n    values = util.asArray(values);\n    if (values === null) {\n        var err = apiRejection(\n            \"expecting an array or an iterable object but got \" + util.classString(values)).reason();\n        this._promise._rejectCallback(err, false);\n        return;\n    }\n\n    if (values.length === 0) {\n        if (resolveValueIfEmpty === -5) {\n            this._resolveEmptyArray();\n        }\n        else {\n            this._resolve(toResolutionValue(resolveValueIfEmpty));\n        }\n        return;\n    }\n    this._iterate(values);\n};\n\nPromiseArray.prototype._iterate = function(values) {\n    var len = this.getActualLength(values.length);\n    this._length = len;\n    this._values = this.shouldCopyValues() ? new Array(len) : this._values;\n    var result = this._promise;\n    var isResolved = false;\n    var bitField = null;\n    for (var i = 0; i < len; ++i) {\n        var maybePromise = tryConvertToPromise(values[i], result);\n\n        if (maybePromise instanceof Promise) {\n            maybePromise = maybePromise._target();\n            bitField = maybePromise._bitField;\n        } else {\n            bitField = null;\n        }\n\n        if (isResolved) {\n            if (bitField !== null) {\n                maybePromise.suppressUnhandledRejections();\n            }\n        } else if (bitField !== null) {\n            if (((bitField & 50397184) === 0)) {\n                maybePromise._proxy(this, i);\n                this._values[i] = maybePromise;\n            } else if (((bitField & 33554432) !== 0)) {\n                isResolved = this._promiseFulfilled(maybePromise._value(), i);\n            } else if (((bitField & 16777216) !== 0)) {\n                isResolved = this._promiseRejected(maybePromise._reason(), i);\n            } else {\n                isResolved = this._promiseCancelled(i);\n            }\n        } else {\n            isResolved = this._promiseFulfilled(maybePromise, i);\n        }\n    }\n    if (!isResolved) result._setAsyncGuaranteed();\n};\n\nPromiseArray.prototype._isResolved = function () {\n    return this._values === null;\n};\n\nPromiseArray.prototype._resolve = function (value) {\n    this._values = null;\n    this._promise._fulfill(value);\n};\n\nPromiseArray.prototype._cancel = function() {\n    if (this._isResolved() || !this._promise._isCancellable()) return;\n    this._values = null;\n    this._promise._cancel();\n};\n\nPromiseArray.prototype._reject = function (reason) {\n    this._values = null;\n    this._promise._rejectCallback(reason, false);\n};\n\nPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    this._values[index] = value;\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= this._length) {\n        this._resolve(this._values);\n        return true;\n    }\n    return false;\n};\n\nPromiseArray.prototype._promiseCancelled = function() {\n    this._cancel();\n    return true;\n};\n\nPromiseArray.prototype._promiseRejected = function (reason) {\n    this._totalResolved++;\n    this._reject(reason);\n    return true;\n};\n\nPromiseArray.prototype._resultCancelled = function() {\n    if (this._isResolved()) return;\n    var values = this._values;\n    this._cancel();\n    if (values instanceof Promise) {\n        values.cancel();\n    } else {\n        for (var i = 0; i < values.length; ++i) {\n            if (values[i] instanceof Promise) {\n                values[i].cancel();\n            }\n        }\n    }\n};\n\nPromiseArray.prototype.shouldCopyValues = function () {\n    return true;\n};\n\nPromiseArray.prototype.getActualLength = function (len) {\n    return len;\n};\n\nreturn PromiseArray;\n};\n\n},{\"./util\":74}],62:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar THIS = {};\nvar util = require(\"./util\");\nvar nodebackForPromise = require(\"./nodeback\");\nvar withAppended = util.withAppended;\nvar maybeWrapAsError = util.maybeWrapAsError;\nvar canEvaluate = util.canEvaluate;\nvar TypeError = require(\"./errors\").TypeError;\nvar defaultSuffix = \"Async\";\nvar defaultPromisified = {__isPromisified__: true};\nvar noCopyProps = [\n    \"arity\",    \"length\",\n    \"name\",\n    \"arguments\",\n    \"caller\",\n    \"callee\",\n    \"prototype\",\n    \"__isPromisified__\"\n];\nvar noCopyPropsPattern = new RegExp(\"^(?:\" + noCopyProps.join(\"|\") + \")$\");\n\nvar defaultFilter = function(name) {\n    return util.isIdentifier(name) &&\n        name.charAt(0) !== \"_\" &&\n        name !== \"constructor\";\n};\n\nfunction propsFilter(key) {\n    return !noCopyPropsPattern.test(key);\n}\n\nfunction isPromisified(fn) {\n    try {\n        return fn.__isPromisified__ === true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n\nfunction hasPromisified(obj, key, suffix) {\n    var val = util.getDataPropertyOrDefault(obj, key + suffix,\n                                            defaultPromisified);\n    return val ? isPromisified(val) : false;\n}\nfunction checkValid(ret, suffix, suffixRegexp) {\n    for (var i = 0; i < ret.length; i += 2) {\n        var key = ret[i];\n        if (suffixRegexp.test(key)) {\n            var keyWithoutAsyncSuffix = key.replace(suffixRegexp, \"\");\n            for (var j = 0; j < ret.length; j += 2) {\n                if (ret[j] === keyWithoutAsyncSuffix) {\n                    throw new TypeError(\"Cannot promisify an API that has normal methods with '%s'-suffix\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\"\n                        .replace(\"%s\", suffix));\n                }\n            }\n        }\n    }\n}\n\nfunction promisifiableMethods(obj, suffix, suffixRegexp, filter) {\n    var keys = util.inheritedDataKeys(obj);\n    var ret = [];\n    for (var i = 0; i < keys.length; ++i) {\n        var key = keys[i];\n        var value = obj[key];\n        var passesDefaultFilter = filter === defaultFilter\n            ? true : defaultFilter(key, value, obj);\n        if (typeof value === \"function\" &&\n            !isPromisified(value) &&\n            !hasPromisified(obj, key, suffix) &&\n            filter(key, value, obj, passesDefaultFilter)) {\n            ret.push(key, value);\n        }\n    }\n    checkValid(ret, suffix, suffixRegexp);\n    return ret;\n}\n\nvar escapeIdentRegex = function(str) {\n    return str.replace(/([$])/, \"\\\\$\");\n};\n\nvar makeNodePromisifiedEval;\nif (!false) {\nvar switchCaseArgumentOrder = function(likelyArgumentCount) {\n    var ret = [likelyArgumentCount];\n    var min = Math.max(0, likelyArgumentCount - 1 - 3);\n    for(var i = likelyArgumentCount - 1; i >= min; --i) {\n        ret.push(i);\n    }\n    for(var i = likelyArgumentCount + 1; i <= 3; ++i) {\n        ret.push(i);\n    }\n    return ret;\n};\n\nvar argumentSequence = function(argumentCount) {\n    return util.filledRange(argumentCount, \"_arg\", \"\");\n};\n\nvar parameterDeclaration = function(parameterCount) {\n    return util.filledRange(\n        Math.max(parameterCount, 3), \"_arg\", \"\");\n};\n\nvar parameterCount = function(fn) {\n    if (typeof fn.length === \"number\") {\n        return Math.max(Math.min(fn.length, 1023 + 1), 0);\n    }\n    return 0;\n};\n\nmakeNodePromisifiedEval =\nfunction(callback, receiver, originalName, fn, _, multiArgs) {\n    var newParameterCount = Math.max(0, parameterCount(fn) - 1);\n    var argumentOrder = switchCaseArgumentOrder(newParameterCount);\n    var shouldProxyThis = typeof callback === \"string\" || receiver === THIS;\n\n    function generateCallForArgumentCount(count) {\n        var args = argumentSequence(count).join(\", \");\n        var comma = count > 0 ? \", \" : \"\";\n        var ret;\n        if (shouldProxyThis) {\n            ret = \"ret = callback.call(this, {{args}}, nodeback); break;\\n\";\n        } else {\n            ret = receiver === undefined\n                ? \"ret = callback({{args}}, nodeback); break;\\n\"\n                : \"ret = callback.call(receiver, {{args}}, nodeback); break;\\n\";\n        }\n        return ret.replace(\"{{args}}\", args).replace(\", \", comma);\n    }\n\n    function generateArgumentSwitchCase() {\n        var ret = \"\";\n        for (var i = 0; i < argumentOrder.length; ++i) {\n            ret += \"case \" + argumentOrder[i] +\":\" +\n                generateCallForArgumentCount(argumentOrder[i]);\n        }\n\n        ret += \"                                                             \\n\\\n        default:                                                             \\n\\\n            var args = new Array(len + 1);                                   \\n\\\n            var i = 0;                                                       \\n\\\n            for (var i = 0; i < len; ++i) {                                  \\n\\\n               args[i] = arguments[i];                                       \\n\\\n            }                                                                \\n\\\n            args[i] = nodeback;                                              \\n\\\n            [CodeForCall]                                                    \\n\\\n            break;                                                           \\n\\\n        \".replace(\"[CodeForCall]\", (shouldProxyThis\n                                ? \"ret = callback.apply(this, args);\\n\"\n                                : \"ret = callback.apply(receiver, args);\\n\"));\n        return ret;\n    }\n\n    var getFunctionCode = typeof callback === \"string\"\n                                ? (\"this != null ? this['\"+callback+\"'] : fn\")\n                                : \"fn\";\n    var body = \"'use strict';                                                \\n\\\n        var ret = function (Parameters) {                                    \\n\\\n            'use strict';                                                    \\n\\\n            var len = arguments.length;                                      \\n\\\n            var promise = new Promise(INTERNAL);                             \\n\\\n            promise._captureStackTrace();                                    \\n\\\n            var nodeback = nodebackForPromise(promise, \" + multiArgs + \");   \\n\\\n            var ret;                                                         \\n\\\n            var callback = tryCatch([GetFunctionCode]);                      \\n\\\n            switch(len) {                                                    \\n\\\n                [CodeForSwitchCase]                                          \\n\\\n            }                                                                \\n\\\n            if (ret === errorObj) {                                          \\n\\\n                promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\\n\\\n            }                                                                \\n\\\n            if (!promise._isFateSealed()) promise._setAsyncGuaranteed();     \\n\\\n            return promise;                                                  \\n\\\n        };                                                                   \\n\\\n        notEnumerableProp(ret, '__isPromisified__', true);                   \\n\\\n        return ret;                                                          \\n\\\n    \".replace(\"[CodeForSwitchCase]\", generateArgumentSwitchCase())\n        .replace(\"[GetFunctionCode]\", getFunctionCode);\n    body = body.replace(\"Parameters\", parameterDeclaration(newParameterCount));\n    return new Function(\"Promise\",\n                        \"fn\",\n                        \"receiver\",\n                        \"withAppended\",\n                        \"maybeWrapAsError\",\n                        \"nodebackForPromise\",\n                        \"tryCatch\",\n                        \"errorObj\",\n                        \"notEnumerableProp\",\n                        \"INTERNAL\",\n                        body)(\n                    Promise,\n                    fn,\n                    receiver,\n                    withAppended,\n                    maybeWrapAsError,\n                    nodebackForPromise,\n                    util.tryCatch,\n                    util.errorObj,\n                    util.notEnumerableProp,\n                    INTERNAL);\n};\n}\n\nfunction makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) {\n    var defaultThis = (function() {return this;})();\n    var method = callback;\n    if (typeof method === \"string\") {\n        callback = fn;\n    }\n    function promisified() {\n        var _receiver = receiver;\n        if (receiver === THIS) _receiver = this;\n        var promise = new Promise(INTERNAL);\n        promise._captureStackTrace();\n        var cb = typeof method === \"string\" && this !== defaultThis\n            ? this[method] : callback;\n        var fn = nodebackForPromise(promise, multiArgs);\n        try {\n            cb.apply(_receiver, withAppended(arguments, fn));\n        } catch(e) {\n            promise._rejectCallback(maybeWrapAsError(e), true, true);\n        }\n        if (!promise._isFateSealed()) promise._setAsyncGuaranteed();\n        return promise;\n    }\n    util.notEnumerableProp(promisified, \"__isPromisified__\", true);\n    return promisified;\n}\n\nvar makeNodePromisified = canEvaluate\n    ? makeNodePromisifiedEval\n    : makeNodePromisifiedClosure;\n\nfunction promisifyAll(obj, suffix, filter, promisifier, multiArgs) {\n    var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + \"$\");\n    var methods =\n        promisifiableMethods(obj, suffix, suffixRegexp, filter);\n\n    for (var i = 0, len = methods.length; i < len; i+= 2) {\n        var key = methods[i];\n        var fn = methods[i+1];\n        var promisifiedKey = key + suffix;\n        if (promisifier === makeNodePromisified) {\n            obj[promisifiedKey] =\n                makeNodePromisified(key, THIS, key, fn, suffix, multiArgs);\n        } else {\n            var promisified = promisifier(fn, function() {\n                return makeNodePromisified(key, THIS, key,\n                                           fn, suffix, multiArgs);\n            });\n            util.notEnumerableProp(promisified, \"__isPromisified__\", true);\n            obj[promisifiedKey] = promisified;\n        }\n    }\n    util.toFastProperties(obj);\n    return obj;\n}\n\nfunction promisify(callback, receiver, multiArgs) {\n    return makeNodePromisified(callback, receiver, undefined,\n                                callback, null, multiArgs);\n}\n\nPromise.promisify = function (fn, options) {\n    if (typeof fn !== \"function\") {\n        throw new TypeError(\"expecting a function but got \" + util.classString(fn));\n    }\n    if (isPromisified(fn)) {\n        return fn;\n    }\n    options = Object(options);\n    var receiver = options.context === undefined ? THIS : options.context;\n    var multiArgs = !!options.multiArgs;\n    var ret = promisify(fn, receiver, multiArgs);\n    util.copyDescriptors(fn, ret, propsFilter);\n    return ret;\n};\n\nPromise.promisifyAll = function (target, options) {\n    if (typeof target !== \"function\" && typeof target !== \"object\") {\n        throw new TypeError(\"the target of promisifyAll must be an object or a function\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    options = Object(options);\n    var multiArgs = !!options.multiArgs;\n    var suffix = options.suffix;\n    if (typeof suffix !== \"string\") suffix = defaultSuffix;\n    var filter = options.filter;\n    if (typeof filter !== \"function\") filter = defaultFilter;\n    var promisifier = options.promisifier;\n    if (typeof promisifier !== \"function\") promisifier = makeNodePromisified;\n\n    if (!util.isIdentifier(suffix)) {\n        throw new RangeError(\"suffix must be a valid identifier\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n\n    var keys = util.inheritedDataKeys(target);\n    for (var i = 0; i < keys.length; ++i) {\n        var value = target[keys[i]];\n        if (keys[i] !== \"constructor\" &&\n            util.isClass(value)) {\n            promisifyAll(value.prototype, suffix, filter, promisifier,\n                multiArgs);\n            promisifyAll(value, suffix, filter, promisifier, multiArgs);\n        }\n    }\n\n    return promisifyAll(target, suffix, filter, promisifier, multiArgs);\n};\n};\n\n\n},{\"./errors\":50,\"./nodeback\":58,\"./util\":74}],63:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(\n    Promise, PromiseArray, tryConvertToPromise, apiRejection) {\nvar util = require(\"./util\");\nvar isObject = util.isObject;\nvar es5 = require(\"./es5\");\nvar Es6Map;\nif (typeof Map === \"function\") Es6Map = Map;\n\nvar mapToEntries = (function() {\n    var index = 0;\n    var size = 0;\n\n    function extractEntry(value, key) {\n        this[index] = value;\n        this[index + size] = key;\n        index++;\n    }\n\n    return function mapToEntries(map) {\n        size = map.size;\n        index = 0;\n        var ret = new Array(map.size * 2);\n        map.forEach(extractEntry, ret);\n        return ret;\n    };\n})();\n\nvar entriesToMap = function(entries) {\n    var ret = new Es6Map();\n    var length = entries.length / 2 | 0;\n    for (var i = 0; i < length; ++i) {\n        var key = entries[length + i];\n        var value = entries[i];\n        ret.set(key, value);\n    }\n    return ret;\n};\n\nfunction PropertiesPromiseArray(obj) {\n    var isMap = false;\n    var entries;\n    if (Es6Map !== undefined && obj instanceof Es6Map) {\n        entries = mapToEntries(obj);\n        isMap = true;\n    } else {\n        var keys = es5.keys(obj);\n        var len = keys.length;\n        entries = new Array(len * 2);\n        for (var i = 0; i < len; ++i) {\n            var key = keys[i];\n            entries[i] = obj[key];\n            entries[i + len] = key;\n        }\n    }\n    this.constructor$(entries);\n    this._isMap = isMap;\n    this._init$(undefined, -3);\n}\nutil.inherits(PropertiesPromiseArray, PromiseArray);\n\nPropertiesPromiseArray.prototype._init = function () {};\n\nPropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    this._values[index] = value;\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= this._length) {\n        var val;\n        if (this._isMap) {\n            val = entriesToMap(this._values);\n        } else {\n            val = {};\n            var keyOffset = this.length();\n            for (var i = 0, len = this.length(); i < len; ++i) {\n                val[this._values[i + keyOffset]] = this._values[i];\n            }\n        }\n        this._resolve(val);\n        return true;\n    }\n    return false;\n};\n\nPropertiesPromiseArray.prototype.shouldCopyValues = function () {\n    return false;\n};\n\nPropertiesPromiseArray.prototype.getActualLength = function (len) {\n    return len >> 1;\n};\n\nfunction props(promises) {\n    var ret;\n    var castValue = tryConvertToPromise(promises);\n\n    if (!isObject(castValue)) {\n        return apiRejection(\"cannot await properties of a non-object\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    } else if (castValue instanceof Promise) {\n        ret = castValue._then(\n            Promise.props, undefined, undefined, undefined, undefined);\n    } else {\n        ret = new PropertiesPromiseArray(castValue).promise();\n    }\n\n    if (castValue instanceof Promise) {\n        ret._propagateFrom(castValue, 2);\n    }\n    return ret;\n}\n\nPromise.prototype.props = function () {\n    return props(this);\n};\n\nPromise.props = function (promises) {\n    return props(promises);\n};\n};\n\n},{\"./es5\":51,\"./util\":74}],64:[function(require,module,exports){\n\"use strict\";\nfunction arrayMove(src, srcIndex, dst, dstIndex, len) {\n    for (var j = 0; j < len; ++j) {\n        dst[j + dstIndex] = src[j + srcIndex];\n        src[j + srcIndex] = void 0;\n    }\n}\n\nfunction Queue(capacity) {\n    this._capacity = capacity;\n    this._length = 0;\n    this._front = 0;\n}\n\nQueue.prototype._willBeOverCapacity = function (size) {\n    return this._capacity < size;\n};\n\nQueue.prototype._pushOne = function (arg) {\n    var length = this.length();\n    this._checkCapacity(length + 1);\n    var i = (this._front + length) & (this._capacity - 1);\n    this[i] = arg;\n    this._length = length + 1;\n};\n\nQueue.prototype.push = function (fn, receiver, arg) {\n    var length = this.length() + 3;\n    if (this._willBeOverCapacity(length)) {\n        this._pushOne(fn);\n        this._pushOne(receiver);\n        this._pushOne(arg);\n        return;\n    }\n    var j = this._front + length - 3;\n    this._checkCapacity(length);\n    var wrapMask = this._capacity - 1;\n    this[(j + 0) & wrapMask] = fn;\n    this[(j + 1) & wrapMask] = receiver;\n    this[(j + 2) & wrapMask] = arg;\n    this._length = length;\n};\n\nQueue.prototype.shift = function () {\n    var front = this._front,\n        ret = this[front];\n\n    this[front] = undefined;\n    this._front = (front + 1) & (this._capacity - 1);\n    this._length--;\n    return ret;\n};\n\nQueue.prototype.length = function () {\n    return this._length;\n};\n\nQueue.prototype._checkCapacity = function (size) {\n    if (this._capacity < size) {\n        this._resizeTo(this._capacity << 1);\n    }\n};\n\nQueue.prototype._resizeTo = function (capacity) {\n    var oldCapacity = this._capacity;\n    this._capacity = capacity;\n    var front = this._front;\n    var length = this._length;\n    var moveItemsCount = (front + length) & (oldCapacity - 1);\n    arrayMove(this, 0, this, oldCapacity, moveItemsCount);\n};\n\nmodule.exports = Queue;\n\n},{}],65:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(\n    Promise, INTERNAL, tryConvertToPromise, apiRejection) {\nvar util = require(\"./util\");\n\nvar raceLater = function (promise) {\n    return promise.then(function(array) {\n        return race(array, promise);\n    });\n};\n\nfunction race(promises, parent) {\n    var maybePromise = tryConvertToPromise(promises);\n\n    if (maybePromise instanceof Promise) {\n        return raceLater(maybePromise);\n    } else {\n        promises = util.asArray(promises);\n        if (promises === null)\n            return apiRejection(\"expecting an array or an iterable object but got \" + util.classString(promises));\n    }\n\n    var ret = new Promise(INTERNAL);\n    if (parent !== undefined) {\n        ret._propagateFrom(parent, 3);\n    }\n    var fulfill = ret._fulfill;\n    var reject = ret._reject;\n    for (var i = 0, len = promises.length; i < len; ++i) {\n        var val = promises[i];\n\n        if (val === undefined && !(i in promises)) {\n            continue;\n        }\n\n        Promise.cast(val)._then(fulfill, reject, undefined, ret, null);\n    }\n    return ret;\n}\n\nPromise.race = function (promises) {\n    return race(promises, undefined);\n};\n\nPromise.prototype.race = function () {\n    return race(this, undefined);\n};\n\n};\n\n},{\"./util\":74}],66:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise,\n                          PromiseArray,\n                          apiRejection,\n                          tryConvertToPromise,\n                          INTERNAL,\n                          debug) {\nvar getDomain = Promise._getDomain;\nvar util = require(\"./util\");\nvar tryCatch = util.tryCatch;\n\nfunction ReductionPromiseArray(promises, fn, initialValue, _each) {\n    this.constructor$(promises);\n    var domain = getDomain();\n    this._fn = domain === null ? fn : util.domainBind(domain, fn);\n    if (initialValue !== undefined) {\n        initialValue = Promise.resolve(initialValue);\n        initialValue._attachCancellationCallback(this);\n    }\n    this._initialValue = initialValue;\n    this._currentCancellable = null;\n    if(_each === INTERNAL) {\n        this._eachValues = Array(this._length);\n    } else if (_each === 0) {\n        this._eachValues = null;\n    } else {\n        this._eachValues = undefined;\n    }\n    this._promise._captureStackTrace();\n    this._init$(undefined, -5);\n}\nutil.inherits(ReductionPromiseArray, PromiseArray);\n\nReductionPromiseArray.prototype._gotAccum = function(accum) {\n    if (this._eachValues !== undefined && \n        this._eachValues !== null && \n        accum !== INTERNAL) {\n        this._eachValues.push(accum);\n    }\n};\n\nReductionPromiseArray.prototype._eachComplete = function(value) {\n    if (this._eachValues !== null) {\n        this._eachValues.push(value);\n    }\n    return this._eachValues;\n};\n\nReductionPromiseArray.prototype._init = function() {};\n\nReductionPromiseArray.prototype._resolveEmptyArray = function() {\n    this._resolve(this._eachValues !== undefined ? this._eachValues\n                                                 : this._initialValue);\n};\n\nReductionPromiseArray.prototype.shouldCopyValues = function () {\n    return false;\n};\n\nReductionPromiseArray.prototype._resolve = function(value) {\n    this._promise._resolveCallback(value);\n    this._values = null;\n};\n\nReductionPromiseArray.prototype._resultCancelled = function(sender) {\n    if (sender === this._initialValue) return this._cancel();\n    if (this._isResolved()) return;\n    this._resultCancelled$();\n    if (this._currentCancellable instanceof Promise) {\n        this._currentCancellable.cancel();\n    }\n    if (this._initialValue instanceof Promise) {\n        this._initialValue.cancel();\n    }\n};\n\nReductionPromiseArray.prototype._iterate = function (values) {\n    this._values = values;\n    var value;\n    var i;\n    var length = values.length;\n    if (this._initialValue !== undefined) {\n        value = this._initialValue;\n        i = 0;\n    } else {\n        value = Promise.resolve(values[0]);\n        i = 1;\n    }\n\n    this._currentCancellable = value;\n\n    if (!value.isRejected()) {\n        for (; i < length; ++i) {\n            var ctx = {\n                accum: null,\n                value: values[i],\n                index: i,\n                length: length,\n                array: this\n            };\n            value = value._then(gotAccum, undefined, undefined, ctx, undefined);\n        }\n    }\n\n    if (this._eachValues !== undefined) {\n        value = value\n            ._then(this._eachComplete, undefined, undefined, this, undefined);\n    }\n    value._then(completed, completed, undefined, value, this);\n};\n\nPromise.prototype.reduce = function (fn, initialValue) {\n    return reduce(this, fn, initialValue, null);\n};\n\nPromise.reduce = function (promises, fn, initialValue, _each) {\n    return reduce(promises, fn, initialValue, _each);\n};\n\nfunction completed(valueOrReason, array) {\n    if (this.isFulfilled()) {\n        array._resolve(valueOrReason);\n    } else {\n        array._reject(valueOrReason);\n    }\n}\n\nfunction reduce(promises, fn, initialValue, _each) {\n    if (typeof fn !== \"function\") {\n        return apiRejection(\"expecting a function but got \" + util.classString(fn));\n    }\n    var array = new ReductionPromiseArray(promises, fn, initialValue, _each);\n    return array.promise();\n}\n\nfunction gotAccum(accum) {\n    this.accum = accum;\n    this.array._gotAccum(accum);\n    var value = tryConvertToPromise(this.value, this.array._promise);\n    if (value instanceof Promise) {\n        this.array._currentCancellable = value;\n        return value._then(gotValue, undefined, undefined, this, undefined);\n    } else {\n        return gotValue.call(this, value);\n    }\n}\n\nfunction gotValue(value) {\n    var array = this.array;\n    var promise = array._promise;\n    var fn = tryCatch(array._fn);\n    promise._pushContext();\n    var ret;\n    if (array._eachValues !== undefined) {\n        ret = fn.call(promise._boundValue(), value, this.index, this.length);\n    } else {\n        ret = fn.call(promise._boundValue(),\n                              this.accum, value, this.index, this.length);\n    }\n    if (ret instanceof Promise) {\n        array._currentCancellable = ret;\n    }\n    var promiseCreated = promise._popContext();\n    debug.checkForgottenReturns(\n        ret,\n        promiseCreated,\n        array._eachValues !== undefined ? \"Promise.each\" : \"Promise.reduce\",\n        promise\n    );\n    return ret;\n}\n};\n\n},{\"./util\":74}],67:[function(require,module,exports){\n(function (process,global){\n\"use strict\";\nvar util = require(\"./util\");\nvar schedule;\nvar noAsyncScheduler = function() {\n    throw new Error(\"No async scheduler available\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n};\nvar NativePromise = util.getNativePromise();\nif (util.isNode && typeof MutationObserver === \"undefined\") {\n    var GlobalSetImmediate = global.setImmediate;\n    var ProcessNextTick = process.nextTick;\n    schedule = util.isRecentNode\n                ? function(fn) { GlobalSetImmediate.call(global, fn); }\n                : function(fn) { ProcessNextTick.call(process, fn); };\n} else if (typeof NativePromise === \"function\" &&\n           typeof NativePromise.resolve === \"function\") {\n    var nativePromise = NativePromise.resolve();\n    schedule = function(fn) {\n        nativePromise.then(fn);\n    };\n} else if ((typeof MutationObserver !== \"undefined\") &&\n          !(typeof window !== \"undefined\" &&\n            window.navigator &&\n            (window.navigator.standalone || window.cordova))) {\n    schedule = (function() {\n        var div = document.createElement(\"div\");\n        var opts = {attributes: true};\n        var toggleScheduled = false;\n        var div2 = document.createElement(\"div\");\n        var o2 = new MutationObserver(function() {\n            div.classList.toggle(\"foo\");\n            toggleScheduled = false;\n        });\n        o2.observe(div2, opts);\n\n        var scheduleToggle = function() {\n            if (toggleScheduled) return;\n                toggleScheduled = true;\n                div2.classList.toggle(\"foo\");\n            };\n\n            return function schedule(fn) {\n            var o = new MutationObserver(function() {\n                o.disconnect();\n                fn();\n            });\n            o.observe(div, opts);\n            scheduleToggle();\n        };\n    })();\n} else if (typeof setImmediate !== \"undefined\") {\n    schedule = function (fn) {\n        setImmediate(fn);\n    };\n} else if (typeof setTimeout !== \"undefined\") {\n    schedule = function (fn) {\n        setTimeout(fn, 0);\n    };\n} else {\n    schedule = noAsyncScheduler;\n}\nmodule.exports = schedule;\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./util\":74,\"_process\":138}],68:[function(require,module,exports){\n\"use strict\";\nmodule.exports =\n    function(Promise, PromiseArray, debug) {\nvar PromiseInspection = Promise.PromiseInspection;\nvar util = require(\"./util\");\n\nfunction SettledPromiseArray(values) {\n    this.constructor$(values);\n}\nutil.inherits(SettledPromiseArray, PromiseArray);\n\nSettledPromiseArray.prototype._promiseResolved = function (index, inspection) {\n    this._values[index] = inspection;\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= this._length) {\n        this._resolve(this._values);\n        return true;\n    }\n    return false;\n};\n\nSettledPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    var ret = new PromiseInspection();\n    ret._bitField = 33554432;\n    ret._settledValueField = value;\n    return this._promiseResolved(index, ret);\n};\nSettledPromiseArray.prototype._promiseRejected = function (reason, index) {\n    var ret = new PromiseInspection();\n    ret._bitField = 16777216;\n    ret._settledValueField = reason;\n    return this._promiseResolved(index, ret);\n};\n\nPromise.settle = function (promises) {\n    debug.deprecated(\".settle()\", \".reflect()\");\n    return new SettledPromiseArray(promises).promise();\n};\n\nPromise.prototype.settle = function () {\n    return Promise.settle(this);\n};\n};\n\n},{\"./util\":74}],69:[function(require,module,exports){\n\"use strict\";\nmodule.exports =\nfunction(Promise, PromiseArray, apiRejection) {\nvar util = require(\"./util\");\nvar RangeError = require(\"./errors\").RangeError;\nvar AggregateError = require(\"./errors\").AggregateError;\nvar isArray = util.isArray;\nvar CANCELLATION = {};\n\n\nfunction SomePromiseArray(values) {\n    this.constructor$(values);\n    this._howMany = 0;\n    this._unwrap = false;\n    this._initialized = false;\n}\nutil.inherits(SomePromiseArray, PromiseArray);\n\nSomePromiseArray.prototype._init = function () {\n    if (!this._initialized) {\n        return;\n    }\n    if (this._howMany === 0) {\n        this._resolve([]);\n        return;\n    }\n    this._init$(undefined, -5);\n    var isArrayResolved = isArray(this._values);\n    if (!this._isResolved() &&\n        isArrayResolved &&\n        this._howMany > this._canPossiblyFulfill()) {\n        this._reject(this._getRangeError(this.length()));\n    }\n};\n\nSomePromiseArray.prototype.init = function () {\n    this._initialized = true;\n    this._init();\n};\n\nSomePromiseArray.prototype.setUnwrap = function () {\n    this._unwrap = true;\n};\n\nSomePromiseArray.prototype.howMany = function () {\n    return this._howMany;\n};\n\nSomePromiseArray.prototype.setHowMany = function (count) {\n    this._howMany = count;\n};\n\nSomePromiseArray.prototype._promiseFulfilled = function (value) {\n    this._addFulfilled(value);\n    if (this._fulfilled() === this.howMany()) {\n        this._values.length = this.howMany();\n        if (this.howMany() === 1 && this._unwrap) {\n            this._resolve(this._values[0]);\n        } else {\n            this._resolve(this._values);\n        }\n        return true;\n    }\n    return false;\n\n};\nSomePromiseArray.prototype._promiseRejected = function (reason) {\n    this._addRejected(reason);\n    return this._checkOutcome();\n};\n\nSomePromiseArray.prototype._promiseCancelled = function () {\n    if (this._values instanceof Promise || this._values == null) {\n        return this._cancel();\n    }\n    this._addRejected(CANCELLATION);\n    return this._checkOutcome();\n};\n\nSomePromiseArray.prototype._checkOutcome = function() {\n    if (this.howMany() > this._canPossiblyFulfill()) {\n        var e = new AggregateError();\n        for (var i = this.length(); i < this._values.length; ++i) {\n            if (this._values[i] !== CANCELLATION) {\n                e.push(this._values[i]);\n            }\n        }\n        if (e.length > 0) {\n            this._reject(e);\n        } else {\n            this._cancel();\n        }\n        return true;\n    }\n    return false;\n};\n\nSomePromiseArray.prototype._fulfilled = function () {\n    return this._totalResolved;\n};\n\nSomePromiseArray.prototype._rejected = function () {\n    return this._values.length - this.length();\n};\n\nSomePromiseArray.prototype._addRejected = function (reason) {\n    this._values.push(reason);\n};\n\nSomePromiseArray.prototype._addFulfilled = function (value) {\n    this._values[this._totalResolved++] = value;\n};\n\nSomePromiseArray.prototype._canPossiblyFulfill = function () {\n    return this.length() - this._rejected();\n};\n\nSomePromiseArray.prototype._getRangeError = function (count) {\n    var message = \"Input array must contain at least \" +\n            this._howMany + \" items but contains only \" + count + \" items\";\n    return new RangeError(message);\n};\n\nSomePromiseArray.prototype._resolveEmptyArray = function () {\n    this._reject(this._getRangeError(0));\n};\n\nfunction some(promises, howMany) {\n    if ((howMany | 0) !== howMany || howMany < 0) {\n        return apiRejection(\"expecting a positive integer\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    var ret = new SomePromiseArray(promises);\n    var promise = ret.promise();\n    ret.setHowMany(howMany);\n    ret.init();\n    return promise;\n}\n\nPromise.some = function (promises, howMany) {\n    return some(promises, howMany);\n};\n\nPromise.prototype.some = function (howMany) {\n    return some(this, howMany);\n};\n\nPromise._SomePromiseArray = SomePromiseArray;\n};\n\n},{\"./errors\":50,\"./util\":74}],70:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nfunction PromiseInspection(promise) {\n    if (promise !== undefined) {\n        promise = promise._target();\n        this._bitField = promise._bitField;\n        this._settledValueField = promise._isFateSealed()\n            ? promise._settledValue() : undefined;\n    }\n    else {\n        this._bitField = 0;\n        this._settledValueField = undefined;\n    }\n}\n\nPromiseInspection.prototype._settledValue = function() {\n    return this._settledValueField;\n};\n\nvar value = PromiseInspection.prototype.value = function () {\n    if (!this.isFulfilled()) {\n        throw new TypeError(\"cannot get fulfillment value of a non-fulfilled promise\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    return this._settledValue();\n};\n\nvar reason = PromiseInspection.prototype.error =\nPromiseInspection.prototype.reason = function () {\n    if (!this.isRejected()) {\n        throw new TypeError(\"cannot get rejection reason of a non-rejected promise\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    return this._settledValue();\n};\n\nvar isFulfilled = PromiseInspection.prototype.isFulfilled = function() {\n    return (this._bitField & 33554432) !== 0;\n};\n\nvar isRejected = PromiseInspection.prototype.isRejected = function () {\n    return (this._bitField & 16777216) !== 0;\n};\n\nvar isPending = PromiseInspection.prototype.isPending = function () {\n    return (this._bitField & 50397184) === 0;\n};\n\nvar isResolved = PromiseInspection.prototype.isResolved = function () {\n    return (this._bitField & 50331648) !== 0;\n};\n\nPromiseInspection.prototype.isCancelled = function() {\n    return (this._bitField & 8454144) !== 0;\n};\n\nPromise.prototype.__isCancelled = function() {\n    return (this._bitField & 65536) === 65536;\n};\n\nPromise.prototype._isCancelled = function() {\n    return this._target().__isCancelled();\n};\n\nPromise.prototype.isCancelled = function() {\n    return (this._target()._bitField & 8454144) !== 0;\n};\n\nPromise.prototype.isPending = function() {\n    return isPending.call(this._target());\n};\n\nPromise.prototype.isRejected = function() {\n    return isRejected.call(this._target());\n};\n\nPromise.prototype.isFulfilled = function() {\n    return isFulfilled.call(this._target());\n};\n\nPromise.prototype.isResolved = function() {\n    return isResolved.call(this._target());\n};\n\nPromise.prototype.value = function() {\n    return value.call(this._target());\n};\n\nPromise.prototype.reason = function() {\n    var target = this._target();\n    target._unsetRejectionIsUnhandled();\n    return reason.call(target);\n};\n\nPromise.prototype._value = function() {\n    return this._settledValue();\n};\n\nPromise.prototype._reason = function() {\n    this._unsetRejectionIsUnhandled();\n    return this._settledValue();\n};\n\nPromise.PromiseInspection = PromiseInspection;\n};\n\n},{}],71:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar util = require(\"./util\");\nvar errorObj = util.errorObj;\nvar isObject = util.isObject;\n\nfunction tryConvertToPromise(obj, context) {\n    if (isObject(obj)) {\n        if (obj instanceof Promise) return obj;\n        var then = getThen(obj);\n        if (then === errorObj) {\n            if (context) context._pushContext();\n            var ret = Promise.reject(then.e);\n            if (context) context._popContext();\n            return ret;\n        } else if (typeof then === \"function\") {\n            if (isAnyBluebirdPromise(obj)) {\n                var ret = new Promise(INTERNAL);\n                obj._then(\n                    ret._fulfill,\n                    ret._reject,\n                    undefined,\n                    ret,\n                    null\n                );\n                return ret;\n            }\n            return doThenable(obj, then, context);\n        }\n    }\n    return obj;\n}\n\nfunction doGetThen(obj) {\n    return obj.then;\n}\n\nfunction getThen(obj) {\n    try {\n        return doGetThen(obj);\n    } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n    }\n}\n\nvar hasProp = {}.hasOwnProperty;\nfunction isAnyBluebirdPromise(obj) {\n    try {\n        return hasProp.call(obj, \"_promise0\");\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction doThenable(x, then, context) {\n    var promise = new Promise(INTERNAL);\n    var ret = promise;\n    if (context) context._pushContext();\n    promise._captureStackTrace();\n    if (context) context._popContext();\n    var synchronous = true;\n    var result = util.tryCatch(then).call(x, resolve, reject);\n    synchronous = false;\n\n    if (promise && result === errorObj) {\n        promise._rejectCallback(result.e, true, true);\n        promise = null;\n    }\n\n    function resolve(value) {\n        if (!promise) return;\n        promise._resolveCallback(value);\n        promise = null;\n    }\n\n    function reject(reason) {\n        if (!promise) return;\n        promise._rejectCallback(reason, synchronous, true);\n        promise = null;\n    }\n    return ret;\n}\n\nreturn tryConvertToPromise;\n};\n\n},{\"./util\":74}],72:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL, debug) {\nvar util = require(\"./util\");\nvar TimeoutError = Promise.TimeoutError;\n\nfunction HandleWrapper(handle)  {\n    this.handle = handle;\n}\n\nHandleWrapper.prototype._resultCancelled = function() {\n    clearTimeout(this.handle);\n};\n\nvar afterValue = function(value) { return delay(+this).thenReturn(value); };\nvar delay = Promise.delay = function (ms, value) {\n    var ret;\n    var handle;\n    if (value !== undefined) {\n        ret = Promise.resolve(value)\n                ._then(afterValue, null, null, ms, undefined);\n        if (debug.cancellation() && value instanceof Promise) {\n            ret._setOnCancel(value);\n        }\n    } else {\n        ret = new Promise(INTERNAL);\n        handle = setTimeout(function() { ret._fulfill(); }, +ms);\n        if (debug.cancellation()) {\n            ret._setOnCancel(new HandleWrapper(handle));\n        }\n        ret._captureStackTrace();\n    }\n    ret._setAsyncGuaranteed();\n    return ret;\n};\n\nPromise.prototype.delay = function (ms) {\n    return delay(ms, this);\n};\n\nvar afterTimeout = function (promise, message, parent) {\n    var err;\n    if (typeof message !== \"string\") {\n        if (message instanceof Error) {\n            err = message;\n        } else {\n            err = new TimeoutError(\"operation timed out\");\n        }\n    } else {\n        err = new TimeoutError(message);\n    }\n    util.markAsOriginatingFromRejection(err);\n    promise._attachExtraTrace(err);\n    promise._reject(err);\n\n    if (parent != null) {\n        parent.cancel();\n    }\n};\n\nfunction successClear(value) {\n    clearTimeout(this.handle);\n    return value;\n}\n\nfunction failureClear(reason) {\n    clearTimeout(this.handle);\n    throw reason;\n}\n\nPromise.prototype.timeout = function (ms, message) {\n    ms = +ms;\n    var ret, parent;\n\n    var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() {\n        if (ret.isPending()) {\n            afterTimeout(ret, message, parent);\n        }\n    }, ms));\n\n    if (debug.cancellation()) {\n        parent = this.then();\n        ret = parent._then(successClear, failureClear,\n                            undefined, handleWrapper, undefined);\n        ret._setOnCancel(handleWrapper);\n    } else {\n        ret = this._then(successClear, failureClear,\n                            undefined, handleWrapper, undefined);\n    }\n\n    return ret;\n};\n\n};\n\n},{\"./util\":74}],73:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function (Promise, apiRejection, tryConvertToPromise,\n    createContext, INTERNAL, debug) {\n    var util = require(\"./util\");\n    var TypeError = require(\"./errors\").TypeError;\n    var inherits = require(\"./util\").inherits;\n    var errorObj = util.errorObj;\n    var tryCatch = util.tryCatch;\n    var NULL = {};\n\n    function thrower(e) {\n        setTimeout(function(){throw e;}, 0);\n    }\n\n    function castPreservingDisposable(thenable) {\n        var maybePromise = tryConvertToPromise(thenable);\n        if (maybePromise !== thenable &&\n            typeof thenable._isDisposable === \"function\" &&\n            typeof thenable._getDisposer === \"function\" &&\n            thenable._isDisposable()) {\n            maybePromise._setDisposable(thenable._getDisposer());\n        }\n        return maybePromise;\n    }\n    function dispose(resources, inspection) {\n        var i = 0;\n        var len = resources.length;\n        var ret = new Promise(INTERNAL);\n        function iterator() {\n            if (i >= len) return ret._fulfill();\n            var maybePromise = castPreservingDisposable(resources[i++]);\n            if (maybePromise instanceof Promise &&\n                maybePromise._isDisposable()) {\n                try {\n                    maybePromise = tryConvertToPromise(\n                        maybePromise._getDisposer().tryDispose(inspection),\n                        resources.promise);\n                } catch (e) {\n                    return thrower(e);\n                }\n                if (maybePromise instanceof Promise) {\n                    return maybePromise._then(iterator, thrower,\n                                              null, null, null);\n                }\n            }\n            iterator();\n        }\n        iterator();\n        return ret;\n    }\n\n    function Disposer(data, promise, context) {\n        this._data = data;\n        this._promise = promise;\n        this._context = context;\n    }\n\n    Disposer.prototype.data = function () {\n        return this._data;\n    };\n\n    Disposer.prototype.promise = function () {\n        return this._promise;\n    };\n\n    Disposer.prototype.resource = function () {\n        if (this.promise().isFulfilled()) {\n            return this.promise().value();\n        }\n        return NULL;\n    };\n\n    Disposer.prototype.tryDispose = function(inspection) {\n        var resource = this.resource();\n        var context = this._context;\n        if (context !== undefined) context._pushContext();\n        var ret = resource !== NULL\n            ? this.doDispose(resource, inspection) : null;\n        if (context !== undefined) context._popContext();\n        this._promise._unsetDisposable();\n        this._data = null;\n        return ret;\n    };\n\n    Disposer.isDisposer = function (d) {\n        return (d != null &&\n                typeof d.resource === \"function\" &&\n                typeof d.tryDispose === \"function\");\n    };\n\n    function FunctionDisposer(fn, promise, context) {\n        this.constructor$(fn, promise, context);\n    }\n    inherits(FunctionDisposer, Disposer);\n\n    FunctionDisposer.prototype.doDispose = function (resource, inspection) {\n        var fn = this.data();\n        return fn.call(resource, resource, inspection);\n    };\n\n    function maybeUnwrapDisposer(value) {\n        if (Disposer.isDisposer(value)) {\n            this.resources[this.index]._setDisposable(value);\n            return value.promise();\n        }\n        return value;\n    }\n\n    function ResourceList(length) {\n        this.length = length;\n        this.promise = null;\n        this[length-1] = null;\n    }\n\n    ResourceList.prototype._resultCancelled = function() {\n        var len = this.length;\n        for (var i = 0; i < len; ++i) {\n            var item = this[i];\n            if (item instanceof Promise) {\n                item.cancel();\n            }\n        }\n    };\n\n    Promise.using = function () {\n        var len = arguments.length;\n        if (len < 2) return apiRejection(\n                        \"you must pass at least 2 arguments to Promise.using\");\n        var fn = arguments[len - 1];\n        if (typeof fn !== \"function\") {\n            return apiRejection(\"expecting a function but got \" + util.classString(fn));\n        }\n        var input;\n        var spreadArgs = true;\n        if (len === 2 && Array.isArray(arguments[0])) {\n            input = arguments[0];\n            len = input.length;\n            spreadArgs = false;\n        } else {\n            input = arguments;\n            len--;\n        }\n        var resources = new ResourceList(len);\n        for (var i = 0; i < len; ++i) {\n            var resource = input[i];\n            if (Disposer.isDisposer(resource)) {\n                var disposer = resource;\n                resource = resource.promise();\n                resource._setDisposable(disposer);\n            } else {\n                var maybePromise = tryConvertToPromise(resource);\n                if (maybePromise instanceof Promise) {\n                    resource =\n                        maybePromise._then(maybeUnwrapDisposer, null, null, {\n                            resources: resources,\n                            index: i\n                    }, undefined);\n                }\n            }\n            resources[i] = resource;\n        }\n\n        var reflectedResources = new Array(resources.length);\n        for (var i = 0; i < reflectedResources.length; ++i) {\n            reflectedResources[i] = Promise.resolve(resources[i]).reflect();\n        }\n\n        var resultPromise = Promise.all(reflectedResources)\n            .then(function(inspections) {\n                for (var i = 0; i < inspections.length; ++i) {\n                    var inspection = inspections[i];\n                    if (inspection.isRejected()) {\n                        errorObj.e = inspection.error();\n                        return errorObj;\n                    } else if (!inspection.isFulfilled()) {\n                        resultPromise.cancel();\n                        return;\n                    }\n                    inspections[i] = inspection.value();\n                }\n                promise._pushContext();\n\n                fn = tryCatch(fn);\n                var ret = spreadArgs\n                    ? fn.apply(undefined, inspections) : fn(inspections);\n                var promiseCreated = promise._popContext();\n                debug.checkForgottenReturns(\n                    ret, promiseCreated, \"Promise.using\", promise);\n                return ret;\n            });\n\n        var promise = resultPromise.lastly(function() {\n            var inspection = new Promise.PromiseInspection(resultPromise);\n            return dispose(resources, inspection);\n        });\n        resources.promise = promise;\n        promise._setOnCancel(resources);\n        return promise;\n    };\n\n    Promise.prototype._setDisposable = function (disposer) {\n        this._bitField = this._bitField | 131072;\n        this._disposer = disposer;\n    };\n\n    Promise.prototype._isDisposable = function () {\n        return (this._bitField & 131072) > 0;\n    };\n\n    Promise.prototype._getDisposer = function () {\n        return this._disposer;\n    };\n\n    Promise.prototype._unsetDisposable = function () {\n        this._bitField = this._bitField & (~131072);\n        this._disposer = undefined;\n    };\n\n    Promise.prototype.disposer = function (fn) {\n        if (typeof fn === \"function\") {\n            return new FunctionDisposer(fn, this, createContext());\n        }\n        throw new TypeError();\n    };\n\n};\n\n},{\"./errors\":50,\"./util\":74}],74:[function(require,module,exports){\n(function (process,global){\n\"use strict\";\nvar es5 = require(\"./es5\");\nvar canEvaluate = typeof navigator == \"undefined\";\n\nvar errorObj = {e: {}};\nvar tryCatchTarget;\nvar globalObject = typeof self !== \"undefined\" ? self :\n    typeof window !== \"undefined\" ? window :\n    typeof global !== \"undefined\" ? global :\n    this !== undefined ? this : null;\n\nfunction tryCatcher() {\n    try {\n        var target = tryCatchTarget;\n        tryCatchTarget = null;\n        return target.apply(this, arguments);\n    } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n    }\n}\nfunction tryCatch(fn) {\n    tryCatchTarget = fn;\n    return tryCatcher;\n}\n\nvar inherits = function(Child, Parent) {\n    var hasProp = {}.hasOwnProperty;\n\n    function T() {\n        this.constructor = Child;\n        this.constructor$ = Parent;\n        for (var propertyName in Parent.prototype) {\n            if (hasProp.call(Parent.prototype, propertyName) &&\n                propertyName.charAt(propertyName.length-1) !== \"$\"\n           ) {\n                this[propertyName + \"$\"] = Parent.prototype[propertyName];\n            }\n        }\n    }\n    T.prototype = Parent.prototype;\n    Child.prototype = new T();\n    return Child.prototype;\n};\n\n\nfunction isPrimitive(val) {\n    return val == null || val === true || val === false ||\n        typeof val === \"string\" || typeof val === \"number\";\n\n}\n\nfunction isObject(value) {\n    return typeof value === \"function\" ||\n           typeof value === \"object\" && value !== null;\n}\n\nfunction maybeWrapAsError(maybeError) {\n    if (!isPrimitive(maybeError)) return maybeError;\n\n    return new Error(safeToString(maybeError));\n}\n\nfunction withAppended(target, appendee) {\n    var len = target.length;\n    var ret = new Array(len + 1);\n    var i;\n    for (i = 0; i < len; ++i) {\n        ret[i] = target[i];\n    }\n    ret[i] = appendee;\n    return ret;\n}\n\nfunction getDataPropertyOrDefault(obj, key, defaultValue) {\n    if (es5.isES5) {\n        var desc = Object.getOwnPropertyDescriptor(obj, key);\n\n        if (desc != null) {\n            return desc.get == null && desc.set == null\n                    ? desc.value\n                    : defaultValue;\n        }\n    } else {\n        return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;\n    }\n}\n\nfunction notEnumerableProp(obj, name, value) {\n    if (isPrimitive(obj)) return obj;\n    var descriptor = {\n        value: value,\n        configurable: true,\n        enumerable: false,\n        writable: true\n    };\n    es5.defineProperty(obj, name, descriptor);\n    return obj;\n}\n\nfunction thrower(r) {\n    throw r;\n}\n\nvar inheritedDataKeys = (function() {\n    var excludedPrototypes = [\n        Array.prototype,\n        Object.prototype,\n        Function.prototype\n    ];\n\n    var isExcludedProto = function(val) {\n        for (var i = 0; i < excludedPrototypes.length; ++i) {\n            if (excludedPrototypes[i] === val) {\n                return true;\n            }\n        }\n        return false;\n    };\n\n    if (es5.isES5) {\n        var getKeys = Object.getOwnPropertyNames;\n        return function(obj) {\n            var ret = [];\n            var visitedKeys = Object.create(null);\n            while (obj != null && !isExcludedProto(obj)) {\n                var keys;\n                try {\n                    keys = getKeys(obj);\n                } catch (e) {\n                    return ret;\n                }\n                for (var i = 0; i < keys.length; ++i) {\n                    var key = keys[i];\n                    if (visitedKeys[key]) continue;\n                    visitedKeys[key] = true;\n                    var desc = Object.getOwnPropertyDescriptor(obj, key);\n                    if (desc != null && desc.get == null && desc.set == null) {\n                        ret.push(key);\n                    }\n                }\n                obj = es5.getPrototypeOf(obj);\n            }\n            return ret;\n        };\n    } else {\n        var hasProp = {}.hasOwnProperty;\n        return function(obj) {\n            if (isExcludedProto(obj)) return [];\n            var ret = [];\n\n            /*jshint forin:false */\n            enumeration: for (var key in obj) {\n                if (hasProp.call(obj, key)) {\n                    ret.push(key);\n                } else {\n                    for (var i = 0; i < excludedPrototypes.length; ++i) {\n                        if (hasProp.call(excludedPrototypes[i], key)) {\n                            continue enumeration;\n                        }\n                    }\n                    ret.push(key);\n                }\n            }\n            return ret;\n        };\n    }\n\n})();\n\nvar thisAssignmentPattern = /this\\s*\\.\\s*\\S+\\s*=/;\nfunction isClass(fn) {\n    try {\n        if (typeof fn === \"function\") {\n            var keys = es5.names(fn.prototype);\n\n            var hasMethods = es5.isES5 && keys.length > 1;\n            var hasMethodsOtherThanConstructor = keys.length > 0 &&\n                !(keys.length === 1 && keys[0] === \"constructor\");\n            var hasThisAssignmentAndStaticMethods =\n                thisAssignmentPattern.test(fn + \"\") && es5.names(fn).length > 0;\n\n            if (hasMethods || hasMethodsOtherThanConstructor ||\n                hasThisAssignmentAndStaticMethods) {\n                return true;\n            }\n        }\n        return false;\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction toFastProperties(obj) {\n    /*jshint -W027,-W055,-W031*/\n    function FakeConstructor() {}\n    FakeConstructor.prototype = obj;\n    var l = 8;\n    while (l--) new FakeConstructor();\n    return obj;\n    eval(obj);\n}\n\nvar rident = /^[a-z$_][a-z$_0-9]*$/i;\nfunction isIdentifier(str) {\n    return rident.test(str);\n}\n\nfunction filledRange(count, prefix, suffix) {\n    var ret = new Array(count);\n    for(var i = 0; i < count; ++i) {\n        ret[i] = prefix + i + suffix;\n    }\n    return ret;\n}\n\nfunction safeToString(obj) {\n    try {\n        return obj + \"\";\n    } catch (e) {\n        return \"[no string representation]\";\n    }\n}\n\nfunction isError(obj) {\n    return obj !== null &&\n           typeof obj === \"object\" &&\n           typeof obj.message === \"string\" &&\n           typeof obj.name === \"string\";\n}\n\nfunction markAsOriginatingFromRejection(e) {\n    try {\n        notEnumerableProp(e, \"isOperational\", true);\n    }\n    catch(ignore) {}\n}\n\nfunction originatesFromRejection(e) {\n    if (e == null) return false;\n    return ((e instanceof Error[\"__BluebirdErrorTypes__\"].OperationalError) ||\n        e[\"isOperational\"] === true);\n}\n\nfunction canAttachTrace(obj) {\n    return isError(obj) && es5.propertyIsWritable(obj, \"stack\");\n}\n\nvar ensureErrorObject = (function() {\n    if (!(\"stack\" in new Error())) {\n        return function(value) {\n            if (canAttachTrace(value)) return value;\n            try {throw new Error(safeToString(value));}\n            catch(err) {return err;}\n        };\n    } else {\n        return function(value) {\n            if (canAttachTrace(value)) return value;\n            return new Error(safeToString(value));\n        };\n    }\n})();\n\nfunction classString(obj) {\n    return {}.toString.call(obj);\n}\n\nfunction copyDescriptors(from, to, filter) {\n    var keys = es5.names(from);\n    for (var i = 0; i < keys.length; ++i) {\n        var key = keys[i];\n        if (filter(key)) {\n            try {\n                es5.defineProperty(to, key, es5.getDescriptor(from, key));\n            } catch (ignore) {}\n        }\n    }\n}\n\nvar asArray = function(v) {\n    if (es5.isArray(v)) {\n        return v;\n    }\n    return null;\n};\n\nif (typeof Symbol !== \"undefined\" && Symbol.iterator) {\n    var ArrayFrom = typeof Array.from === \"function\" ? function(v) {\n        return Array.from(v);\n    } : function(v) {\n        var ret = [];\n        var it = v[Symbol.iterator]();\n        var itResult;\n        while (!((itResult = it.next()).done)) {\n            ret.push(itResult.value);\n        }\n        return ret;\n    };\n\n    asArray = function(v) {\n        if (es5.isArray(v)) {\n            return v;\n        } else if (v != null && typeof v[Symbol.iterator] === \"function\") {\n            return ArrayFrom(v);\n        }\n        return null;\n    };\n}\n\nvar isNode = typeof process !== \"undefined\" &&\n        classString(process).toLowerCase() === \"[object process]\";\n\nvar hasEnvVariables = typeof process !== \"undefined\" &&\n    typeof process.env !== \"undefined\";\n\nfunction env(key) {\n    return hasEnvVariables ? process.env[key] : undefined;\n}\n\nfunction getNativePromise() {\n    if (typeof Promise === \"function\") {\n        try {\n            var promise = new Promise(function(){});\n            if ({}.toString.call(promise) === \"[object Promise]\") {\n                return Promise;\n            }\n        } catch (e) {}\n    }\n}\n\nfunction domainBind(self, cb) {\n    return self.bind(cb);\n}\n\nvar ret = {\n    isClass: isClass,\n    isIdentifier: isIdentifier,\n    inheritedDataKeys: inheritedDataKeys,\n    getDataPropertyOrDefault: getDataPropertyOrDefault,\n    thrower: thrower,\n    isArray: es5.isArray,\n    asArray: asArray,\n    notEnumerableProp: notEnumerableProp,\n    isPrimitive: isPrimitive,\n    isObject: isObject,\n    isError: isError,\n    canEvaluate: canEvaluate,\n    errorObj: errorObj,\n    tryCatch: tryCatch,\n    inherits: inherits,\n    withAppended: withAppended,\n    maybeWrapAsError: maybeWrapAsError,\n    toFastProperties: toFastProperties,\n    filledRange: filledRange,\n    toString: safeToString,\n    canAttachTrace: canAttachTrace,\n    ensureErrorObject: ensureErrorObject,\n    originatesFromRejection: originatesFromRejection,\n    markAsOriginatingFromRejection: markAsOriginatingFromRejection,\n    classString: classString,\n    copyDescriptors: copyDescriptors,\n    hasDevTools: typeof chrome !== \"undefined\" && chrome &&\n                 typeof chrome.loadTimes === \"function\",\n    isNode: isNode,\n    hasEnvVariables: hasEnvVariables,\n    env: env,\n    global: globalObject,\n    getNativePromise: getNativePromise,\n    domainBind: domainBind\n};\nret.isRecentNode = ret.isNode && (function() {\n    var version = process.versions.node.split(\".\").map(Number);\n    return (version[0] === 0 && version[1] > 10) || (version[0] > 0);\n})();\n\nif (ret.isNode) ret.toFastProperties(process);\n\ntry {throw new Error(); } catch (e) {ret.lastLineError = e;}\nmodule.exports = ret;\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./es5\":51,\"_process\":138}],75:[function(require,module,exports){\n\n},{}],76:[function(require,module,exports){\n(function (global){\n'use strict';\n\nvar buffer = require('buffer');\nvar Buffer = buffer.Buffer;\nvar SlowBuffer = buffer.SlowBuffer;\nvar MAX_LEN = buffer.kMaxLength || 2147483647;\nexports.alloc = function alloc(size, fill, encoding) {\n  if (typeof Buffer.alloc === 'function') {\n    return Buffer.alloc(size, fill, encoding);\n  }\n  if (typeof encoding === 'number') {\n    throw new TypeError('encoding must not be number');\n  }\n  if (typeof size !== 'number') {\n    throw new TypeError('size must be a number');\n  }\n  if (size > MAX_LEN) {\n    throw new RangeError('size is too large');\n  }\n  var enc = encoding;\n  var _fill = fill;\n  if (_fill === undefined) {\n    enc = undefined;\n    _fill = 0;\n  }\n  var buf = new Buffer(size);\n  if (typeof _fill === 'string') {\n    var fillBuf = new Buffer(_fill, enc);\n    var flen = fillBuf.length;\n    var i = -1;\n    while (++i < size) {\n      buf[i] = fillBuf[i % flen];\n    }\n  } else {\n    buf.fill(_fill);\n  }\n  return buf;\n}\nexports.allocUnsafe = function allocUnsafe(size) {\n  if (typeof Buffer.allocUnsafe === 'function') {\n    return Buffer.allocUnsafe(size);\n  }\n  if (typeof size !== 'number') {\n    throw new TypeError('size must be a number');\n  }\n  if (size > MAX_LEN) {\n    throw new RangeError('size is too large');\n  }\n  return new Buffer(size);\n}\nexports.from = function from(value, encodingOrOffset, length) {\n  if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) {\n    return Buffer.from(value, encodingOrOffset, length);\n  }\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number');\n  }\n  if (typeof value === 'string') {\n    return new Buffer(value, encodingOrOffset);\n  }\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    var offset = encodingOrOffset;\n    if (arguments.length === 1) {\n      return new Buffer(value);\n    }\n    if (typeof offset === 'undefined') {\n      offset = 0;\n    }\n    var len = length;\n    if (typeof len === 'undefined') {\n      len = value.byteLength - offset;\n    }\n    if (offset >= value.byteLength) {\n      throw new RangeError('\\'offset\\' is out of bounds');\n    }\n    if (len > value.byteLength - offset) {\n      throw new RangeError('\\'length\\' is out of bounds');\n    }\n    return new Buffer(value.slice(offset, offset + len));\n  }\n  if (Buffer.isBuffer(value)) {\n    var out = new Buffer(value.length);\n    value.copy(out, 0, 0, value.length);\n    return out;\n  }\n  if (value) {\n    if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) {\n      return new Buffer(value);\n    }\n    if (value.type === 'Buffer' && Array.isArray(value.data)) {\n      return new Buffer(value.data);\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.');\n}\nexports.allocUnsafeSlow = function allocUnsafeSlow(size) {\n  if (typeof Buffer.allocUnsafeSlow === 'function') {\n    return Buffer.allocUnsafeSlow(size);\n  }\n  if (typeof size !== 'number') {\n    throw new TypeError('size must be a number');\n  }\n  if (size >= MAX_LEN) {\n    throw new RangeError('size is too large');\n  }\n  return new SlowBuffer(size);\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"buffer\":77}],77:[function(require,module,exports){\n(function (global){\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *     incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n  ? global.TYPED_ARRAY_SUPPORT\n  : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n    return arr.foo() === 42 && // typed array instances can be augmented\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n}\n\nfunction kMaxLength () {\n  return Buffer.TYPED_ARRAY_SUPPORT\n    ? 0x7fffffff\n    : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n  if (kMaxLength() < length) {\n    throw new RangeError('Invalid typed array length')\n  }\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = new Uint8Array(length)\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    if (that === null) {\n      that = new Buffer(length)\n    }\n    that.length = length\n  }\n\n  return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n    return new Buffer(arg, encodingOrOffset, length)\n  }\n\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new Error(\n        'If encoding is specified then the first argument must be a string'\n      )\n    }\n    return allocUnsafe(this, arg)\n  }\n  return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n  arr.__proto__ = Buffer.prototype\n  return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    return fromArrayBuffer(that, value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(that, value, encodingOrOffset)\n  }\n\n  return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n  Buffer.prototype.__proto__ = Uint8Array.prototype\n  Buffer.__proto__ = Uint8Array\n  if (typeof Symbol !== 'undefined' && Symbol.species &&\n      Buffer[Symbol.species] === Buffer) {\n    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n    Object.defineProperty(Buffer, Symbol.species, {\n      value: null,\n      configurable: true\n    })\n  }\n}\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  } else if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n}\n\nfunction alloc (that, size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(that, size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(that, size).fill(fill, encoding)\n      : createBuffer(that, size).fill(fill)\n  }\n  return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n  assertSize(size)\n  that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < size; ++i) {\n      that[i] = 0\n    }\n  }\n  return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  var length = byteLength(string, encoding) | 0\n  that = createBuffer(that, length)\n\n  var actual = that.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    that = that.slice(0, actual)\n  }\n\n  return that\n}\n\nfunction fromArrayLike (that, array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  that = createBuffer(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n  array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\\'offset\\' is out of bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\\'length\\' is out of bounds')\n  }\n\n  if (byteOffset === undefined && length === undefined) {\n    array = new Uint8Array(array)\n  } else if (length === undefined) {\n    array = new Uint8Array(array, byteOffset)\n  } else {\n    array = new Uint8Array(array, byteOffset, length)\n  }\n\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = array\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that = fromArrayLike(that, array)\n  }\n  return that\n}\n\nfunction fromObject (that, obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    that = createBuffer(that, len)\n\n    if (that.length === 0) {\n      return that\n    }\n\n    obj.copy(that, 0, 0, len)\n    return that\n  }\n\n  if (obj) {\n    if ((typeof ArrayBuffer !== 'undefined' &&\n        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n      if (typeof obj.length !== 'number' || isnan(obj.length)) {\n        return createBuffer(that, 0)\n      }\n      return fromArrayLike(that, obj)\n    }\n\n    if (obj.type === 'Buffer' && isArray(obj.data)) {\n      return fromArrayLike(that, obj.data)\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < kMaxLength()` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= kMaxLength()) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + kMaxLength().toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n      (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    string = '' + string\n  }\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n      case undefined:\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length | 0\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError('Argument must be a Buffer')\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset  // Coerce to Number.\n  if (isNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (Buffer.TYPED_ARRAY_SUPPORT &&\n        typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (isNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset | 0\n    if (isFinite(length)) {\n      length = length | 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  // legacy write(string, encoding, offset, length) - remove in v0.13\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    newBuf = this.subarray(start, end)\n    newBuf.__proto__ = Buffer.prototype\n  } else {\n    var sliceLen = end - start\n    newBuf = new Buffer(sliceLen, undefined)\n    for (var i = 0; i < sliceLen; ++i) {\n      newBuf[i] = this[i + start]\n    }\n  }\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n      (littleEndian ? i : 1 - i) * 8\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffffffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset + 3] = (value >>> 24)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 1] = (value >>> 8)\n    this[offset] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 3] = (value >>> 24)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n    // ascending copy from start\n    for (i = 0; i < len; ++i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, start + len),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if (code < 256) {\n        val = code\n      }\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : utf8ToBytes(new Buffer(val, encoding).toString())\n    var len = bytes.length\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\nfunction isnan (val) {\n  return val !== val // eslint-disable-line no-self-compare\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"base64-js\":39,\"ieee754\":80,\"isarray\":83}],78:[function(require,module,exports){\n(function (Buffer){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\n\nfunction isArray(arg) {\n  if (Array.isArray) {\n    return Array.isArray(arg);\n  }\n  return objectToString(arg) === '[object Array]';\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null ||\n         typeof arg === 'boolean' ||\n         typeof arg === 'number' ||\n         typeof arg === 'string' ||\n         typeof arg === 'symbol' ||  // ES6 symbol\n         typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = Buffer.isBuffer;\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n\n}).call(this,{\"isBuffer\":require(\"../../is-buffer/index.js\")})\n},{\"../../is-buffer/index.js\":82}],79:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n\n  // If there is no 'error' event listener then throw.\n  if (type === 'error') {\n    if (!this._events.error ||\n        (isObject(this._events.error) && !this._events.error.length)) {\n      er = arguments[1];\n      if (er instanceof Error) {\n        throw er; // Unhandled 'error' event\n      } else {\n        // At least give some kind of context to the user\n        var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n        err.context = er;\n        throw err;\n      }\n    }\n  }\n\n  handler = this._events[type];\n\n  if (isUndefined(handler))\n    return false;\n\n  if (isFunction(handler)) {\n    switch (arguments.length) {\n      // fast cases\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      // slower\n      default:\n        args = Array.prototype.slice.call(arguments, 1);\n        handler.apply(this, args);\n    }\n  } else if (isObject(handler)) {\n    args = Array.prototype.slice.call(arguments, 1);\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n\n  // To avoid recursion in the case that type === \"newListener\"! Before\n  // adding it to the listeners, first emit \"newListener\".\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    // Optimize the case of one listener. Don't need the extra array object.\n    this._events[type] = listener;\n  else if (isObject(this._events[type]))\n    // If we've already got an array, just append.\n    this._events[type].push(listener);\n  else\n    // Adding the second element, need to change to array.\n    this._events[type] = [this._events[type], listener];\n\n  // Check for listener leak\n  if (isObject(this._events[type]) && !this._events[type].warned) {\n    if (!isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n      console.error('(node) warning: possible EventEmitter memory ' +\n                    'leak detected. %d listeners added. ' +\n                    'Use emitter.setMaxListeners() to increase limit.',\n                    this._events[type].length);\n      if (typeof console.trace === 'function') {\n        // not supported in IE 10\n        console.trace();\n      }\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n\n  // not listening for removeListener, no need to emit\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n\n  // emit removeListener for all listeners on all events\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else if (listeners) {\n    // LIFO order\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n  if (this._events) {\n    var evlistener = this._events[type];\n\n    if (isFunction(evlistener))\n      return 1;\n    else if (evlistener)\n      return evlistener.length;\n  }\n  return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n\n},{}],80:[function(require,module,exports){\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = nBytes * 8 - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = nBytes * 8 - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = (value * c - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n\n},{}],81:[function(require,module,exports){\nif (typeof Object.create === 'function') {\n  // implementation from standard node.js 'util' module\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  };\n} else {\n  // old school shim for old browsers\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    var TempCtor = function () {}\n    TempCtor.prototype = superCtor.prototype\n    ctor.prototype = new TempCtor()\n    ctor.prototype.constructor = ctor\n  }\n}\n\n},{}],82:[function(require,module,exports){\n/*!\n * Determine if an object is a Buffer\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\n\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nmodule.exports = function (obj) {\n  return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n}\n\nfunction isBuffer (obj) {\n  return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n  return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n}\n\n},{}],83:[function(require,module,exports){\nvar toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n\n},{}],84:[function(require,module,exports){\n'use strict';\n// private property\nvar _keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\n\n// public method for encoding\nexports.encode = function(input, utf8) {\n    var output = \"\";\n    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;\n    var i = 0;\n\n    while (i < input.length) {\n\n        chr1 = input.charCodeAt(i++);\n        chr2 = input.charCodeAt(i++);\n        chr3 = input.charCodeAt(i++);\n\n        enc1 = chr1 >> 2;\n        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n        enc4 = chr3 & 63;\n\n        if (isNaN(chr2)) {\n            enc3 = enc4 = 64;\n        }\n        else if (isNaN(chr3)) {\n            enc4 = 64;\n        }\n\n        output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);\n\n    }\n\n    return output;\n};\n\n// public method for decoding\nexports.decode = function(input, utf8) {\n    var output = \"\";\n    var chr1, chr2, chr3;\n    var enc1, enc2, enc3, enc4;\n    var i = 0;\n\n    input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\n    while (i < input.length) {\n\n        enc1 = _keyStr.indexOf(input.charAt(i++));\n        enc2 = _keyStr.indexOf(input.charAt(i++));\n        enc3 = _keyStr.indexOf(input.charAt(i++));\n        enc4 = _keyStr.indexOf(input.charAt(i++));\n\n        chr1 = (enc1 << 2) | (enc2 >> 4);\n        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n        chr3 = ((enc3 & 3) << 6) | enc4;\n\n        output = output + String.fromCharCode(chr1);\n\n        if (enc3 != 64) {\n            output = output + String.fromCharCode(chr2);\n        }\n        if (enc4 != 64) {\n            output = output + String.fromCharCode(chr3);\n        }\n\n    }\n\n    return output;\n\n};\n\n},{}],85:[function(require,module,exports){\n'use strict';\nfunction CompressedObject() {\n    this.compressedSize = 0;\n    this.uncompressedSize = 0;\n    this.crc32 = 0;\n    this.compressionMethod = null;\n    this.compressedContent = null;\n}\n\nCompressedObject.prototype = {\n    /**\n     * Return the decompressed content in an unspecified format.\n     * The format will depend on the decompressor.\n     * @return {Object} the decompressed content.\n     */\n    getContent: function() {\n        return null; // see implementation\n    },\n    /**\n     * Return the compressed content in an unspecified format.\n     * The format will depend on the compressed conten source.\n     * @return {Object} the compressed content.\n     */\n    getCompressedContent: function() {\n        return null; // see implementation\n    }\n};\nmodule.exports = CompressedObject;\n\n},{}],86:[function(require,module,exports){\n'use strict';\nexports.STORE = {\n    magic: \"\\x00\\x00\",\n    compress: function(content, compressionOptions) {\n        return content; // no compression\n    },\n    uncompress: function(content) {\n        return content; // no compression\n    },\n    compressInputType: null,\n    uncompressInputType: null\n};\nexports.DEFLATE = require('./flate');\n\n},{\"./flate\":91}],87:[function(require,module,exports){\n'use strict';\n\nvar utils = require('./utils');\n\nvar table = [\n    0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,\n    0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,\n    0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,\n    0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,\n    0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,\n    0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,\n    0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,\n    0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,\n    0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,\n    0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,\n    0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,\n    0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,\n    0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,\n    0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,\n    0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,\n    0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,\n    0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,\n    0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,\n    0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,\n    0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,\n    0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,\n    0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,\n    0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,\n    0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,\n    0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,\n    0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,\n    0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,\n    0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,\n    0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,\n    0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,\n    0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,\n    0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,\n    0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,\n    0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,\n    0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,\n    0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,\n    0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,\n    0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,\n    0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,\n    0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,\n    0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,\n    0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,\n    0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,\n    0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,\n    0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,\n    0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,\n    0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,\n    0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,\n    0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,\n    0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,\n    0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,\n    0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,\n    0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,\n    0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,\n    0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,\n    0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,\n    0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,\n    0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,\n    0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,\n    0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,\n    0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,\n    0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,\n    0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,\n    0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D\n];\n\n/**\n *\n *  Javascript crc32\n *  http://www.webtoolkit.info/\n *\n */\nmodule.exports = function crc32(input, crc) {\n    if (typeof input === \"undefined\" || !input.length) {\n        return 0;\n    }\n\n    var isArray = utils.getTypeOf(input) !== \"string\";\n\n    if (typeof(crc) == \"undefined\") {\n        crc = 0;\n    }\n    var x = 0;\n    var y = 0;\n    var b = 0;\n\n    crc = crc ^ (-1);\n    for (var i = 0, iTop = input.length; i < iTop; i++) {\n        b = isArray ? input[i] : input.charCodeAt(i);\n        y = (crc ^ b) & 0xFF;\n        x = table[y];\n        crc = (crc >>> 8) ^ x;\n    }\n\n    return crc ^ (-1);\n};\n// vim: set shiftwidth=4 softtabstop=4:\n\n},{\"./utils\":104}],88:[function(require,module,exports){\n'use strict';\nvar utils = require('./utils');\n\nfunction DataReader(data) {\n    this.data = null; // type : see implementation\n    this.length = 0;\n    this.index = 0;\n}\nDataReader.prototype = {\n    /**\n     * Check that the offset will not go too far.\n     * @param {string} offset the additional offset to check.\n     * @throws {Error} an Error if the offset is out of bounds.\n     */\n    checkOffset: function(offset) {\n        this.checkIndex(this.index + offset);\n    },\n    /**\n     * Check that the specifed index will not be too far.\n     * @param {string} newIndex the index to check.\n     * @throws {Error} an Error if the index is out of bounds.\n     */\n    checkIndex: function(newIndex) {\n        if (this.length < newIndex || newIndex < 0) {\n            throw new Error(\"End of data reached (data length = \" + this.length + \", asked index = \" + (newIndex) + \"). Corrupted zip ?\");\n        }\n    },\n    /**\n     * Change the index.\n     * @param {number} newIndex The new index.\n     * @throws {Error} if the new index is out of the data.\n     */\n    setIndex: function(newIndex) {\n        this.checkIndex(newIndex);\n        this.index = newIndex;\n    },\n    /**\n     * Skip the next n bytes.\n     * @param {number} n the number of bytes to skip.\n     * @throws {Error} if the new index is out of the data.\n     */\n    skip: function(n) {\n        this.setIndex(this.index + n);\n    },\n    /**\n     * Get the byte at the specified index.\n     * @param {number} i the index to use.\n     * @return {number} a byte.\n     */\n    byteAt: function(i) {\n        // see implementations\n    },\n    /**\n     * Get the next number with a given byte size.\n     * @param {number} size the number of bytes to read.\n     * @return {number} the corresponding number.\n     */\n    readInt: function(size) {\n        var result = 0,\n            i;\n        this.checkOffset(size);\n        for (i = this.index + size - 1; i >= this.index; i--) {\n            result = (result << 8) + this.byteAt(i);\n        }\n        this.index += size;\n        return result;\n    },\n    /**\n     * Get the next string with a given byte size.\n     * @param {number} size the number of bytes to read.\n     * @return {string} the corresponding string.\n     */\n    readString: function(size) {\n        return utils.transformTo(\"string\", this.readData(size));\n    },\n    /**\n     * Get raw data without conversion, <size> bytes.\n     * @param {number} size the number of bytes to read.\n     * @return {Object} the raw data, implementation specific.\n     */\n    readData: function(size) {\n        // see implementations\n    },\n    /**\n     * Find the last occurence of a zip signature (4 bytes).\n     * @param {string} sig the signature to find.\n     * @return {number} the index of the last occurence, -1 if not found.\n     */\n    lastIndexOfSignature: function(sig) {\n        // see implementations\n    },\n    /**\n     * Get the next date.\n     * @return {Date} the date.\n     */\n    readDate: function() {\n        var dostime = this.readInt(4);\n        return new Date(\n        ((dostime >> 25) & 0x7f) + 1980, // year\n        ((dostime >> 21) & 0x0f) - 1, // month\n        (dostime >> 16) & 0x1f, // day\n        (dostime >> 11) & 0x1f, // hour\n        (dostime >> 5) & 0x3f, // minute\n        (dostime & 0x1f) << 1); // second\n    }\n};\nmodule.exports = DataReader;\n\n},{\"./utils\":104}],89:[function(require,module,exports){\n'use strict';\nexports.base64 = false;\nexports.binary = false;\nexports.dir = false;\nexports.createFolders = false;\nexports.date = null;\nexports.compression = null;\nexports.compressionOptions = null;\nexports.comment = null;\nexports.unixPermissions = null;\nexports.dosPermissions = null;\n\n},{}],90:[function(require,module,exports){\n'use strict';\nvar utils = require('./utils');\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.string2binary = function(str) {\n    return utils.string2binary(str);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.string2Uint8Array = function(str) {\n    return utils.transformTo(\"uint8array\", str);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.uint8Array2String = function(array) {\n    return utils.transformTo(\"string\", array);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.string2Blob = function(str) {\n    var buffer = utils.transformTo(\"arraybuffer\", str);\n    return utils.arrayBuffer2Blob(buffer);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.arrayBuffer2Blob = function(buffer) {\n    return utils.arrayBuffer2Blob(buffer);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.transformTo = function(outputType, input) {\n    return utils.transformTo(outputType, input);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.getTypeOf = function(input) {\n    return utils.getTypeOf(input);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.checkSupport = function(type) {\n    return utils.checkSupport(type);\n};\n\n/**\n * @deprecated\n * This value will be removed in a future version without replacement.\n */\nexports.MAX_VALUE_16BITS = utils.MAX_VALUE_16BITS;\n\n/**\n * @deprecated\n * This value will be removed in a future version without replacement.\n */\nexports.MAX_VALUE_32BITS = utils.MAX_VALUE_32BITS;\n\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.pretty = function(str) {\n    return utils.pretty(str);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.findCompression = function(compressionMethod) {\n    return utils.findCompression(compressionMethod);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.isRegExp = function (object) {\n    return utils.isRegExp(object);\n};\n\n\n},{\"./utils\":104}],91:[function(require,module,exports){\n'use strict';\nvar USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined');\n\nvar pako = require(\"pako\");\nexports.uncompressInputType = USE_TYPEDARRAY ? \"uint8array\" : \"array\";\nexports.compressInputType = USE_TYPEDARRAY ? \"uint8array\" : \"array\";\n\nexports.magic = \"\\x08\\x00\";\nexports.compress = function(input, compressionOptions) {\n    return pako.deflateRaw(input, {\n        level : compressionOptions.level || -1 // default compression\n    });\n};\nexports.uncompress =  function(input) {\n    return pako.inflateRaw(input);\n};\n\n},{\"pako\":120}],92:[function(require,module,exports){\n'use strict';\n\nvar base64 = require('./base64');\n\n/**\nUsage:\n   zip = new JSZip();\n   zip.file(\"hello.txt\", \"Hello, World!\").file(\"tempfile\", \"nothing\");\n   zip.folder(\"images\").file(\"smile.gif\", base64Data, {base64: true});\n   zip.file(\"Xmas.txt\", \"Ho ho ho !\", {date : new Date(\"December 25, 2007 00:00:01\")});\n   zip.remove(\"tempfile\");\n\n   base64zip = zip.generate();\n\n**/\n\n/**\n * Representation a of zip file in js\n * @constructor\n * @param {String=|ArrayBuffer=|Uint8Array=} data the data to load, if any (optional).\n * @param {Object=} options the options for creating this objects (optional).\n */\nfunction JSZip(data, options) {\n    // if this constructor is used without `new`, it adds `new` before itself:\n    if(!(this instanceof JSZip)) return new JSZip(data, options);\n\n    // object containing the files :\n    // {\n    //   \"folder/\" : {...},\n    //   \"folder/data.txt\" : {...}\n    // }\n    this.files = {};\n\n    this.comment = null;\n\n    // Where we are in the hierarchy\n    this.root = \"\";\n    if (data) {\n        this.load(data, options);\n    }\n    this.clone = function() {\n        var newObj = new JSZip();\n        for (var i in this) {\n            if (typeof this[i] !== \"function\") {\n                newObj[i] = this[i];\n            }\n        }\n        return newObj;\n    };\n}\nJSZip.prototype = require('./object');\nJSZip.prototype.load = require('./load');\nJSZip.support = require('./support');\nJSZip.defaults = require('./defaults');\n\n/**\n * @deprecated\n * This namespace will be removed in a future version without replacement.\n */\nJSZip.utils = require('./deprecatedPublicUtils');\n\nJSZip.base64 = {\n    /**\n     * @deprecated\n     * This method will be removed in a future version without replacement.\n     */\n    encode : function(input) {\n        return base64.encode(input);\n    },\n    /**\n     * @deprecated\n     * This method will be removed in a future version without replacement.\n     */\n    decode : function(input) {\n        return base64.decode(input);\n    }\n};\nJSZip.compressions = require('./compressions');\nmodule.exports = JSZip;\n\n},{\"./base64\":84,\"./compressions\":86,\"./defaults\":89,\"./deprecatedPublicUtils\":90,\"./load\":93,\"./object\":96,\"./support\":100}],93:[function(require,module,exports){\n'use strict';\nvar base64 = require('./base64');\nvar ZipEntries = require('./zipEntries');\nmodule.exports = function(data, options) {\n    var files, zipEntries, i, input;\n    options = options || {};\n    if (options.base64) {\n        data = base64.decode(data);\n    }\n\n    zipEntries = new ZipEntries(data, options);\n    files = zipEntries.files;\n    for (i = 0; i < files.length; i++) {\n        input = files[i];\n        this.file(input.fileName, input.decompressed, {\n            binary: true,\n            optimizedBinaryString: true,\n            date: input.date,\n            dir: input.dir,\n            comment : input.fileComment.length ? input.fileComment : null,\n            unixPermissions : input.unixPermissions,\n            dosPermissions : input.dosPermissions,\n            createFolders: options.createFolders\n        });\n    }\n    if (zipEntries.zipComment.length) {\n        this.comment = zipEntries.zipComment;\n    }\n\n    return this;\n};\n\n},{\"./base64\":84,\"./zipEntries\":105}],94:[function(require,module,exports){\n(function (Buffer){\n'use strict';\nmodule.exports = function(data, encoding){\n    return new Buffer(data, encoding);\n};\nmodule.exports.test = function(b){\n    return Buffer.isBuffer(b);\n};\n\n}).call(this,require(\"buffer\").Buffer)\n},{\"buffer\":77}],95:[function(require,module,exports){\n'use strict';\nvar Uint8ArrayReader = require('./uint8ArrayReader');\n\nfunction NodeBufferReader(data) {\n    this.data = data;\n    this.length = this.data.length;\n    this.index = 0;\n}\nNodeBufferReader.prototype = new Uint8ArrayReader();\n\n/**\n * @see DataReader.readData\n */\nNodeBufferReader.prototype.readData = function(size) {\n    this.checkOffset(size);\n    var result = this.data.slice(this.index, this.index + size);\n    this.index += size;\n    return result;\n};\nmodule.exports = NodeBufferReader;\n\n},{\"./uint8ArrayReader\":101}],96:[function(require,module,exports){\n'use strict';\nvar support = require('./support');\nvar utils = require('./utils');\nvar crc32 = require('./crc32');\nvar signature = require('./signature');\nvar defaults = require('./defaults');\nvar base64 = require('./base64');\nvar compressions = require('./compressions');\nvar CompressedObject = require('./compressedObject');\nvar nodeBuffer = require('./nodeBuffer');\nvar utf8 = require('./utf8');\nvar StringWriter = require('./stringWriter');\nvar Uint8ArrayWriter = require('./uint8ArrayWriter');\n\n/**\n * Returns the raw data of a ZipObject, decompress the content if necessary.\n * @param {ZipObject} file the file to use.\n * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.\n */\nvar getRawData = function(file) {\n    if (file._data instanceof CompressedObject) {\n        file._data = file._data.getContent();\n        file.options.binary = true;\n        file.options.base64 = false;\n\n        if (utils.getTypeOf(file._data) === \"uint8array\") {\n            var copy = file._data;\n            // when reading an arraybuffer, the CompressedObject mechanism will keep it and subarray() a Uint8Array.\n            // if we request a file in the same format, we might get the same Uint8Array or its ArrayBuffer (the original zip file).\n            file._data = new Uint8Array(copy.length);\n            // with an empty Uint8Array, Opera fails with a \"Offset larger than array size\"\n            if (copy.length !== 0) {\n                file._data.set(copy, 0);\n            }\n        }\n    }\n    return file._data;\n};\n\n/**\n * Returns the data of a ZipObject in a binary form. If the content is an unicode string, encode it.\n * @param {ZipObject} file the file to use.\n * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.\n */\nvar getBinaryData = function(file) {\n    var result = getRawData(file),\n        type = utils.getTypeOf(result);\n    if (type === \"string\") {\n        if (!file.options.binary) {\n            // unicode text !\n            // unicode string => binary string is a painful process, check if we can avoid it.\n            if (support.nodebuffer) {\n                return nodeBuffer(result, \"utf-8\");\n            }\n        }\n        return file.asBinary();\n    }\n    return result;\n};\n\n/**\n * Transform this._data into a string.\n * @param {function} filter a function String -> String, applied if not null on the result.\n * @return {String} the string representing this._data.\n */\nvar dataToString = function(asUTF8) {\n    var result = getRawData(this);\n    if (result === null || typeof result === \"undefined\") {\n        return \"\";\n    }\n    // if the data is a base64 string, we decode it before checking the encoding !\n    if (this.options.base64) {\n        result = base64.decode(result);\n    }\n    if (asUTF8 && this.options.binary) {\n        // JSZip.prototype.utf8decode supports arrays as input\n        // skip to array => string step, utf8decode will do it.\n        result = out.utf8decode(result);\n    }\n    else {\n        // no utf8 transformation, do the array => string step.\n        result = utils.transformTo(\"string\", result);\n    }\n\n    if (!asUTF8 && !this.options.binary) {\n        result = utils.transformTo(\"string\", out.utf8encode(result));\n    }\n    return result;\n};\n/**\n * A simple object representing a file in the zip file.\n * @constructor\n * @param {string} name the name of the file\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data\n * @param {Object} options the options of the file\n */\nvar ZipObject = function(name, data, options) {\n    this.name = name;\n    this.dir = options.dir;\n    this.date = options.date;\n    this.comment = options.comment;\n    this.unixPermissions = options.unixPermissions;\n    this.dosPermissions = options.dosPermissions;\n\n    this._data = data;\n    this.options = options;\n\n    /*\n     * This object contains initial values for dir and date.\n     * With them, we can check if the user changed the deprecated metadata in\n     * `ZipObject#options` or not.\n     */\n    this._initialMetadata = {\n      dir : options.dir,\n      date : options.date\n    };\n};\n\nZipObject.prototype = {\n    /**\n     * Return the content as UTF8 string.\n     * @return {string} the UTF8 string.\n     */\n    asText: function() {\n        return dataToString.call(this, true);\n    },\n    /**\n     * Returns the binary content.\n     * @return {string} the content as binary.\n     */\n    asBinary: function() {\n        return dataToString.call(this, false);\n    },\n    /**\n     * Returns the content as a nodejs Buffer.\n     * @return {Buffer} the content as a Buffer.\n     */\n    asNodeBuffer: function() {\n        var result = getBinaryData(this);\n        return utils.transformTo(\"nodebuffer\", result);\n    },\n    /**\n     * Returns the content as an Uint8Array.\n     * @return {Uint8Array} the content as an Uint8Array.\n     */\n    asUint8Array: function() {\n        var result = getBinaryData(this);\n        return utils.transformTo(\"uint8array\", result);\n    },\n    /**\n     * Returns the content as an ArrayBuffer.\n     * @return {ArrayBuffer} the content as an ArrayBufer.\n     */\n    asArrayBuffer: function() {\n        return this.asUint8Array().buffer;\n    }\n};\n\n/**\n * Transform an integer into a string in hexadecimal.\n * @private\n * @param {number} dec the number to convert.\n * @param {number} bytes the number of bytes to generate.\n * @returns {string} the result.\n */\nvar decToHex = function(dec, bytes) {\n    var hex = \"\",\n        i;\n    for (i = 0; i < bytes; i++) {\n        hex += String.fromCharCode(dec & 0xff);\n        dec = dec >>> 8;\n    }\n    return hex;\n};\n\n/**\n * Merge the objects passed as parameters into a new one.\n * @private\n * @param {...Object} var_args All objects to merge.\n * @return {Object} a new object with the data of the others.\n */\nvar extend = function() {\n    var result = {}, i, attr;\n    for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers\n        for (attr in arguments[i]) {\n            if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === \"undefined\") {\n                result[attr] = arguments[i][attr];\n            }\n        }\n    }\n    return result;\n};\n\n/**\n * Transforms the (incomplete) options from the user into the complete\n * set of options to create a file.\n * @private\n * @param {Object} o the options from the user.\n * @return {Object} the complete set of options.\n */\nvar prepareFileAttrs = function(o) {\n    o = o || {};\n    if (o.base64 === true && (o.binary === null || o.binary === undefined)) {\n        o.binary = true;\n    }\n    o = extend(o, defaults);\n    o.date = o.date || new Date();\n    if (o.compression !== null) o.compression = o.compression.toUpperCase();\n\n    return o;\n};\n\n/**\n * Add a file in the current folder.\n * @private\n * @param {string} name the name of the file\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file\n * @param {Object} o the options of the file\n * @return {Object} the new file.\n */\nvar fileAdd = function(name, data, o) {\n    // be sure sub folders exist\n    var dataType = utils.getTypeOf(data),\n        parent;\n\n    o = prepareFileAttrs(o);\n\n    if (typeof o.unixPermissions === \"string\") {\n        o.unixPermissions = parseInt(o.unixPermissions, 8);\n    }\n\n    // UNX_IFDIR  0040000 see zipinfo.c\n    if (o.unixPermissions && (o.unixPermissions & 0x4000)) {\n        o.dir = true;\n    }\n    // Bit 4    Directory\n    if (o.dosPermissions && (o.dosPermissions & 0x0010)) {\n        o.dir = true;\n    }\n\n    if (o.dir) {\n        name = forceTrailingSlash(name);\n    }\n\n    if (o.createFolders && (parent = parentFolder(name))) {\n        folderAdd.call(this, parent, true);\n    }\n\n    if (o.dir || data === null || typeof data === \"undefined\") {\n        o.base64 = false;\n        o.binary = false;\n        data = null;\n        dataType = null;\n    }\n    else if (dataType === \"string\") {\n        if (o.binary && !o.base64) {\n            // optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask\n            if (o.optimizedBinaryString !== true) {\n                // this is a string, not in a base64 format.\n                // Be sure that this is a correct \"binary string\"\n                data = utils.string2binary(data);\n            }\n        }\n    }\n    else { // arraybuffer, uint8array, ...\n        o.base64 = false;\n        o.binary = true;\n\n        if (!dataType && !(data instanceof CompressedObject)) {\n            throw new Error(\"The data of '\" + name + \"' is in an unsupported format !\");\n        }\n\n        // special case : it's way easier to work with Uint8Array than with ArrayBuffer\n        if (dataType === \"arraybuffer\") {\n            data = utils.transformTo(\"uint8array\", data);\n        }\n    }\n\n    var object = new ZipObject(name, data, o);\n    this.files[name] = object;\n    return object;\n};\n\n/**\n * Find the parent folder of the path.\n * @private\n * @param {string} path the path to use\n * @return {string} the parent folder, or \"\"\n */\nvar parentFolder = function (path) {\n    if (path.slice(-1) == '/') {\n        path = path.substring(0, path.length - 1);\n    }\n    var lastSlash = path.lastIndexOf('/');\n    return (lastSlash > 0) ? path.substring(0, lastSlash) : \"\";\n};\n\n\n/**\n * Returns the path with a slash at the end.\n * @private\n * @param {String} path the path to check.\n * @return {String} the path with a trailing slash.\n */\nvar forceTrailingSlash = function(path) {\n    // Check the name ends with a /\n    if (path.slice(-1) != \"/\") {\n        path += \"/\"; // IE doesn't like substr(-1)\n    }\n    return path;\n};\n/**\n * Add a (sub) folder in the current folder.\n * @private\n * @param {string} name the folder's name\n * @param {boolean=} [createFolders] If true, automatically create sub\n *  folders. Defaults to false.\n * @return {Object} the new folder.\n */\nvar folderAdd = function(name, createFolders) {\n    createFolders = (typeof createFolders !== 'undefined') ? createFolders : false;\n\n    name = forceTrailingSlash(name);\n\n    // Does this folder already exist?\n    if (!this.files[name]) {\n        fileAdd.call(this, name, null, {\n            dir: true,\n            createFolders: createFolders\n        });\n    }\n    return this.files[name];\n};\n\n/**\n * Generate a JSZip.CompressedObject for a given zipOject.\n * @param {ZipObject} file the object to read.\n * @param {JSZip.compression} compression the compression to use.\n * @param {Object} compressionOptions the options to use when compressing.\n * @return {JSZip.CompressedObject} the compressed result.\n */\nvar generateCompressedObjectFrom = function(file, compression, compressionOptions) {\n    var result = new CompressedObject(),\n        content;\n\n    // the data has not been decompressed, we might reuse things !\n    if (file._data instanceof CompressedObject) {\n        result.uncompressedSize = file._data.uncompressedSize;\n        result.crc32 = file._data.crc32;\n\n        if (result.uncompressedSize === 0 || file.dir) {\n            compression = compressions['STORE'];\n            result.compressedContent = \"\";\n            result.crc32 = 0;\n        }\n        else if (file._data.compressionMethod === compression.magic) {\n            result.compressedContent = file._data.getCompressedContent();\n        }\n        else {\n            content = file._data.getContent();\n            // need to decompress / recompress\n            result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions);\n        }\n    }\n    else {\n        // have uncompressed data\n        content = getBinaryData(file);\n        if (!content || content.length === 0 || file.dir) {\n            compression = compressions['STORE'];\n            content = \"\";\n        }\n        result.uncompressedSize = content.length;\n        result.crc32 = crc32(content);\n        result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions);\n    }\n\n    result.compressedSize = result.compressedContent.length;\n    result.compressionMethod = compression.magic;\n\n    return result;\n};\n\n\n\n\n/**\n * Generate the UNIX part of the external file attributes.\n * @param {Object} unixPermissions the unix permissions or null.\n * @param {Boolean} isDir true if the entry is a directory, false otherwise.\n * @return {Number} a 32 bit integer.\n *\n * adapted from http://unix.stackexchange.com/questions/14705/the-zip-formats-external-file-attribute :\n *\n * TTTTsstrwxrwxrwx0000000000ADVSHR\n * ^^^^____________________________ file type, see zipinfo.c (UNX_*)\n *     ^^^_________________________ setuid, setgid, sticky\n *        ^^^^^^^^^________________ permissions\n *                 ^^^^^^^^^^______ not used ?\n *                           ^^^^^^ DOS attribute bits : Archive, Directory, Volume label, System file, Hidden, Read only\n */\nvar generateUnixExternalFileAttr = function (unixPermissions, isDir) {\n\n    var result = unixPermissions;\n    if (!unixPermissions) {\n        // I can't use octal values in strict mode, hence the hexa.\n        //  040775 => 0x41fd\n        // 0100664 => 0x81b4\n        result = isDir ? 0x41fd : 0x81b4;\n    }\n\n    return (result & 0xFFFF) << 16;\n};\n\n/**\n * Generate the DOS part of the external file attributes.\n * @param {Object} dosPermissions the dos permissions or null.\n * @param {Boolean} isDir true if the entry is a directory, false otherwise.\n * @return {Number} a 32 bit integer.\n *\n * Bit 0     Read-Only\n * Bit 1     Hidden\n * Bit 2     System\n * Bit 3     Volume Label\n * Bit 4     Directory\n * Bit 5     Archive\n */\nvar generateDosExternalFileAttr = function (dosPermissions, isDir) {\n\n    // the dir flag is already set for compatibility\n\n    return (dosPermissions || 0)  & 0x3F;\n};\n\n/**\n * Generate the various parts used in the construction of the final zip file.\n * @param {string} name the file name.\n * @param {ZipObject} file the file content.\n * @param {JSZip.CompressedObject} compressedObject the compressed object.\n * @param {number} offset the current offset from the start of the zip file.\n * @param {String} platform let's pretend we are this platform (change platform dependents fields)\n * @return {object} the zip parts.\n */\nvar generateZipParts = function(name, file, compressedObject, offset, platform) {\n    var data = compressedObject.compressedContent,\n        utfEncodedFileName = utils.transformTo(\"string\", utf8.utf8encode(file.name)),\n        comment = file.comment || \"\",\n        utfEncodedComment = utils.transformTo(\"string\", utf8.utf8encode(comment)),\n        useUTF8ForFileName = utfEncodedFileName.length !== file.name.length,\n        useUTF8ForComment = utfEncodedComment.length !== comment.length,\n        o = file.options,\n        dosTime,\n        dosDate,\n        extraFields = \"\",\n        unicodePathExtraField = \"\",\n        unicodeCommentExtraField = \"\",\n        dir, date;\n\n\n    // handle the deprecated options.dir\n    if (file._initialMetadata.dir !== file.dir) {\n        dir = file.dir;\n    } else {\n        dir = o.dir;\n    }\n\n    // handle the deprecated options.date\n    if(file._initialMetadata.date !== file.date) {\n        date = file.date;\n    } else {\n        date = o.date;\n    }\n\n    var extFileAttr = 0;\n    var versionMadeBy = 0;\n    if (dir) {\n        // dos or unix, we set the dos dir flag\n        extFileAttr |= 0x00010;\n    }\n    if(platform === \"UNIX\") {\n        versionMadeBy = 0x031E; // UNIX, version 3.0\n        extFileAttr |= generateUnixExternalFileAttr(file.unixPermissions, dir);\n    } else { // DOS or other, fallback to DOS\n        versionMadeBy = 0x0014; // DOS, version 2.0\n        extFileAttr |= generateDosExternalFileAttr(file.dosPermissions, dir);\n    }\n\n    // date\n    // @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html\n    // @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html\n    // @see http://www.delorie.com/djgpp/doc/rbinter/it/66/16.html\n\n    dosTime = date.getHours();\n    dosTime = dosTime << 6;\n    dosTime = dosTime | date.getMinutes();\n    dosTime = dosTime << 5;\n    dosTime = dosTime | date.getSeconds() / 2;\n\n    dosDate = date.getFullYear() - 1980;\n    dosDate = dosDate << 4;\n    dosDate = dosDate | (date.getMonth() + 1);\n    dosDate = dosDate << 5;\n    dosDate = dosDate | date.getDate();\n\n    if (useUTF8ForFileName) {\n        // set the unicode path extra field. unzip needs at least one extra\n        // field to correctly handle unicode path, so using the path is as good\n        // as any other information. This could improve the situation with\n        // other archive managers too.\n        // This field is usually used without the utf8 flag, with a non\n        // unicode path in the header (winrar, winzip). This helps (a bit)\n        // with the messy Windows' default compressed folders feature but\n        // breaks on p7zip which doesn't seek the unicode path extra field.\n        // So for now, UTF-8 everywhere !\n        unicodePathExtraField =\n            // Version\n            decToHex(1, 1) +\n            // NameCRC32\n            decToHex(crc32(utfEncodedFileName), 4) +\n            // UnicodeName\n            utfEncodedFileName;\n\n        extraFields +=\n            // Info-ZIP Unicode Path Extra Field\n            \"\\x75\\x70\" +\n            // size\n            decToHex(unicodePathExtraField.length, 2) +\n            // content\n            unicodePathExtraField;\n    }\n\n    if(useUTF8ForComment) {\n\n        unicodeCommentExtraField =\n            // Version\n            decToHex(1, 1) +\n            // CommentCRC32\n            decToHex(this.crc32(utfEncodedComment), 4) +\n            // UnicodeName\n            utfEncodedComment;\n\n        extraFields +=\n            // Info-ZIP Unicode Path Extra Field\n            \"\\x75\\x63\" +\n            // size\n            decToHex(unicodeCommentExtraField.length, 2) +\n            // content\n            unicodeCommentExtraField;\n    }\n\n    var header = \"\";\n\n    // version needed to extract\n    header += \"\\x0A\\x00\";\n    // general purpose bit flag\n    // set bit 11 if utf8\n    header += (useUTF8ForFileName || useUTF8ForComment) ? \"\\x00\\x08\" : \"\\x00\\x00\";\n    // compression method\n    header += compressedObject.compressionMethod;\n    // last mod file time\n    header += decToHex(dosTime, 2);\n    // last mod file date\n    header += decToHex(dosDate, 2);\n    // crc-32\n    header += decToHex(compressedObject.crc32, 4);\n    // compressed size\n    header += decToHex(compressedObject.compressedSize, 4);\n    // uncompressed size\n    header += decToHex(compressedObject.uncompressedSize, 4);\n    // file name length\n    header += decToHex(utfEncodedFileName.length, 2);\n    // extra field length\n    header += decToHex(extraFields.length, 2);\n\n\n    var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName + extraFields;\n\n    var dirRecord = signature.CENTRAL_FILE_HEADER +\n    // version made by (00: DOS)\n    decToHex(versionMadeBy, 2) +\n    // file header (common to file and central directory)\n    header +\n    // file comment length\n    decToHex(utfEncodedComment.length, 2) +\n    // disk number start\n    \"\\x00\\x00\" +\n    // internal file attributes TODO\n    \"\\x00\\x00\" +\n    // external file attributes\n    decToHex(extFileAttr, 4) +\n    // relative offset of local header\n    decToHex(offset, 4) +\n    // file name\n    utfEncodedFileName +\n    // extra field\n    extraFields +\n    // file comment\n    utfEncodedComment;\n\n    return {\n        fileRecord: fileRecord,\n        dirRecord: dirRecord,\n        compressedObject: compressedObject\n    };\n};\n\n\n// return the actual prototype of JSZip\nvar out = {\n    /**\n     * Read an existing zip and merge the data in the current JSZip object.\n     * The implementation is in jszip-load.js, don't forget to include it.\n     * @param {String|ArrayBuffer|Uint8Array|Buffer} stream  The stream to load\n     * @param {Object} options Options for loading the stream.\n     *  options.base64 : is the stream in base64 ? default : false\n     * @return {JSZip} the current JSZip object\n     */\n    load: function(stream, options) {\n        throw new Error(\"Load method is not defined. Is the file jszip-load.js included ?\");\n    },\n\n    /**\n     * Filter nested files/folders with the specified function.\n     * @param {Function} search the predicate to use :\n     * function (relativePath, file) {...}\n     * It takes 2 arguments : the relative path and the file.\n     * @return {Array} An array of matching elements.\n     */\n    filter: function(search) {\n        var result = [],\n            filename, relativePath, file, fileClone;\n        for (filename in this.files) {\n            if (!this.files.hasOwnProperty(filename)) {\n                continue;\n            }\n            file = this.files[filename];\n            // return a new object, don't let the user mess with our internal objects :)\n            fileClone = new ZipObject(file.name, file._data, extend(file.options));\n            relativePath = filename.slice(this.root.length, filename.length);\n            if (filename.slice(0, this.root.length) === this.root && // the file is in the current root\n            search(relativePath, fileClone)) { // and the file matches the function\n                result.push(fileClone);\n            }\n        }\n        return result;\n    },\n\n    /**\n     * Add a file to the zip file, or search a file.\n     * @param   {string|RegExp} name The name of the file to add (if data is defined),\n     * the name of the file to find (if no data) or a regex to match files.\n     * @param   {String|ArrayBuffer|Uint8Array|Buffer} data  The file data, either raw or base64 encoded\n     * @param   {Object} o     File options\n     * @return  {JSZip|Object|Array} this JSZip object (when adding a file),\n     * a file (when searching by string) or an array of files (when searching by regex).\n     */\n    file: function(name, data, o) {\n        if (arguments.length === 1) {\n            if (utils.isRegExp(name)) {\n                var regexp = name;\n                return this.filter(function(relativePath, file) {\n                    return !file.dir && regexp.test(relativePath);\n                });\n            }\n            else { // text\n                return this.filter(function(relativePath, file) {\n                    return !file.dir && relativePath === name;\n                })[0] || null;\n            }\n        }\n        else { // more than one argument : we have data !\n            name = this.root + name;\n            fileAdd.call(this, name, data, o);\n        }\n        return this;\n    },\n\n    /**\n     * Add a directory to the zip file, or search.\n     * @param   {String|RegExp} arg The name of the directory to add, or a regex to search folders.\n     * @return  {JSZip} an object with the new directory as the root, or an array containing matching folders.\n     */\n    folder: function(arg) {\n        if (!arg) {\n            return this;\n        }\n\n        if (utils.isRegExp(arg)) {\n            return this.filter(function(relativePath, file) {\n                return file.dir && arg.test(relativePath);\n            });\n        }\n\n        // else, name is a new folder\n        var name = this.root + arg;\n        var newFolder = folderAdd.call(this, name);\n\n        // Allow chaining by returning a new object with this folder as the root\n        var ret = this.clone();\n        ret.root = newFolder.name;\n        return ret;\n    },\n\n    /**\n     * Delete a file, or a directory and all sub-files, from the zip\n     * @param {string} name the name of the file to delete\n     * @return {JSZip} this JSZip object\n     */\n    remove: function(name) {\n        name = this.root + name;\n        var file = this.files[name];\n        if (!file) {\n            // Look for any folders\n            if (name.slice(-1) != \"/\") {\n                name += \"/\";\n            }\n            file = this.files[name];\n        }\n\n        if (file && !file.dir) {\n            // file\n            delete this.files[name];\n        } else {\n            // maybe a folder, delete recursively\n            var kids = this.filter(function(relativePath, file) {\n                return file.name.slice(0, name.length) === name;\n            });\n            for (var i = 0; i < kids.length; i++) {\n                delete this.files[kids[i].name];\n            }\n        }\n\n        return this;\n    },\n\n    /**\n     * Generate the complete zip file\n     * @param {Object} options the options to generate the zip file :\n     * - base64, (deprecated, use type instead) true to generate base64.\n     * - compression, \"STORE\" by default.\n     * - type, \"base64\" by default. Values are : string, base64, uint8array, arraybuffer, blob.\n     * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file\n     */\n    generate: function(options) {\n        options = extend(options || {}, {\n            base64: true,\n            compression: \"STORE\",\n            compressionOptions : null,\n            type: \"base64\",\n            platform: \"DOS\",\n            comment: null,\n            mimeType: 'application/zip'\n        });\n\n        utils.checkSupport(options.type);\n\n        // accept nodejs `process.platform`\n        if(\n          options.platform === 'darwin' ||\n          options.platform === 'freebsd' ||\n          options.platform === 'linux' ||\n          options.platform === 'sunos'\n        ) {\n          options.platform = \"UNIX\";\n        }\n        if (options.platform === 'win32') {\n          options.platform = \"DOS\";\n        }\n\n        var zipData = [],\n            localDirLength = 0,\n            centralDirLength = 0,\n            writer, i,\n            utfEncodedComment = utils.transformTo(\"string\", this.utf8encode(options.comment || this.comment || \"\"));\n\n        // first, generate all the zip parts.\n        for (var name in this.files) {\n            if (!this.files.hasOwnProperty(name)) {\n                continue;\n            }\n            var file = this.files[name];\n\n            var compressionName = file.options.compression || options.compression.toUpperCase();\n            var compression = compressions[compressionName];\n            if (!compression) {\n                throw new Error(compressionName + \" is not a valid compression method !\");\n            }\n            var compressionOptions = file.options.compressionOptions || options.compressionOptions || {};\n\n            var compressedObject = generateCompressedObjectFrom.call(this, file, compression, compressionOptions);\n\n            var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength, options.platform);\n            localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize;\n            centralDirLength += zipPart.dirRecord.length;\n            zipData.push(zipPart);\n        }\n\n        var dirEnd = \"\";\n\n        // end of central dir signature\n        dirEnd = signature.CENTRAL_DIRECTORY_END +\n        // number of this disk\n        \"\\x00\\x00\" +\n        // number of the disk with the start of the central directory\n        \"\\x00\\x00\" +\n        // total number of entries in the central directory on this disk\n        decToHex(zipData.length, 2) +\n        // total number of entries in the central directory\n        decToHex(zipData.length, 2) +\n        // size of the central directory   4 bytes\n        decToHex(centralDirLength, 4) +\n        // offset of start of central directory with respect to the starting disk number\n        decToHex(localDirLength, 4) +\n        // .ZIP file comment length\n        decToHex(utfEncodedComment.length, 2) +\n        // .ZIP file comment\n        utfEncodedComment;\n\n\n        // we have all the parts (and the total length)\n        // time to create a writer !\n        var typeName = options.type.toLowerCase();\n        if(typeName===\"uint8array\"||typeName===\"arraybuffer\"||typeName===\"blob\"||typeName===\"nodebuffer\") {\n            writer = new Uint8ArrayWriter(localDirLength + centralDirLength + dirEnd.length);\n        }else{\n            writer = new StringWriter(localDirLength + centralDirLength + dirEnd.length);\n        }\n\n        for (i = 0; i < zipData.length; i++) {\n            writer.append(zipData[i].fileRecord);\n            writer.append(zipData[i].compressedObject.compressedContent);\n        }\n        for (i = 0; i < zipData.length; i++) {\n            writer.append(zipData[i].dirRecord);\n        }\n\n        writer.append(dirEnd);\n\n        var zip = writer.finalize();\n\n\n\n        switch(options.type.toLowerCase()) {\n            // case \"zip is an Uint8Array\"\n            case \"uint8array\" :\n            case \"arraybuffer\" :\n            case \"nodebuffer\" :\n               return utils.transformTo(options.type.toLowerCase(), zip);\n            case \"blob\" :\n               return utils.arrayBuffer2Blob(utils.transformTo(\"arraybuffer\", zip), options.mimeType);\n            // case \"zip is a string\"\n            case \"base64\" :\n               return (options.base64) ? base64.encode(zip) : zip;\n            default : // case \"string\" :\n               return zip;\n         }\n\n    },\n\n    /**\n     * @deprecated\n     * This method will be removed in a future version without replacement.\n     */\n    crc32: function (input, crc) {\n        return crc32(input, crc);\n    },\n\n    /**\n     * @deprecated\n     * This method will be removed in a future version without replacement.\n     */\n    utf8encode: function (string) {\n        return utils.transformTo(\"string\", utf8.utf8encode(string));\n    },\n\n    /**\n     * @deprecated\n     * This method will be removed in a future version without replacement.\n     */\n    utf8decode: function (input) {\n        return utf8.utf8decode(input);\n    }\n};\nmodule.exports = out;\n\n},{\"./base64\":84,\"./compressedObject\":85,\"./compressions\":86,\"./crc32\":87,\"./defaults\":89,\"./nodeBuffer\":94,\"./signature\":97,\"./stringWriter\":99,\"./support\":100,\"./uint8ArrayWriter\":102,\"./utf8\":103,\"./utils\":104}],97:[function(require,module,exports){\n'use strict';\nexports.LOCAL_FILE_HEADER = \"PK\\x03\\x04\";\nexports.CENTRAL_FILE_HEADER = \"PK\\x01\\x02\";\nexports.CENTRAL_DIRECTORY_END = \"PK\\x05\\x06\";\nexports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = \"PK\\x06\\x07\";\nexports.ZIP64_CENTRAL_DIRECTORY_END = \"PK\\x06\\x06\";\nexports.DATA_DESCRIPTOR = \"PK\\x07\\x08\";\n\n},{}],98:[function(require,module,exports){\n'use strict';\nvar DataReader = require('./dataReader');\nvar utils = require('./utils');\n\nfunction StringReader(data, optimizedBinaryString) {\n    this.data = data;\n    if (!optimizedBinaryString) {\n        this.data = utils.string2binary(this.data);\n    }\n    this.length = this.data.length;\n    this.index = 0;\n}\nStringReader.prototype = new DataReader();\n/**\n * @see DataReader.byteAt\n */\nStringReader.prototype.byteAt = function(i) {\n    return this.data.charCodeAt(i);\n};\n/**\n * @see DataReader.lastIndexOfSignature\n */\nStringReader.prototype.lastIndexOfSignature = function(sig) {\n    return this.data.lastIndexOf(sig);\n};\n/**\n * @see DataReader.readData\n */\nStringReader.prototype.readData = function(size) {\n    this.checkOffset(size);\n    // this will work because the constructor applied the \"& 0xff\" mask.\n    var result = this.data.slice(this.index, this.index + size);\n    this.index += size;\n    return result;\n};\nmodule.exports = StringReader;\n\n},{\"./dataReader\":88,\"./utils\":104}],99:[function(require,module,exports){\n'use strict';\n\nvar utils = require('./utils');\n\n/**\n * An object to write any content to a string.\n * @constructor\n */\nvar StringWriter = function() {\n    this.data = [];\n};\nStringWriter.prototype = {\n    /**\n     * Append any content to the current string.\n     * @param {Object} input the content to add.\n     */\n    append: function(input) {\n        input = utils.transformTo(\"string\", input);\n        this.data.push(input);\n    },\n    /**\n     * Finalize the construction an return the result.\n     * @return {string} the generated string.\n     */\n    finalize: function() {\n        return this.data.join(\"\");\n    }\n};\n\nmodule.exports = StringWriter;\n\n},{\"./utils\":104}],100:[function(require,module,exports){\n(function (Buffer){\n'use strict';\nexports.base64 = true;\nexports.array = true;\nexports.string = true;\nexports.arraybuffer = typeof ArrayBuffer !== \"undefined\" && typeof Uint8Array !== \"undefined\";\n// contains true if JSZip can read/generate nodejs Buffer, false otherwise.\n// Browserify will provide a Buffer implementation for browsers, which is\n// an augmented Uint8Array (i.e., can be used as either Buffer or U8).\nexports.nodebuffer = typeof Buffer !== \"undefined\";\n// contains true if JSZip can read/generate Uint8Array, false otherwise.\nexports.uint8array = typeof Uint8Array !== \"undefined\";\n\nif (typeof ArrayBuffer === \"undefined\") {\n    exports.blob = false;\n}\nelse {\n    var buffer = new ArrayBuffer(0);\n    try {\n        exports.blob = new Blob([buffer], {\n            type: \"application/zip\"\n        }).size === 0;\n    }\n    catch (e) {\n        try {\n            var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\n            var builder = new Builder();\n            builder.append(buffer);\n            exports.blob = builder.getBlob('application/zip').size === 0;\n        }\n        catch (e) {\n            exports.blob = false;\n        }\n    }\n}\n\n}).call(this,require(\"buffer\").Buffer)\n},{\"buffer\":77}],101:[function(require,module,exports){\n'use strict';\nvar DataReader = require('./dataReader');\n\nfunction Uint8ArrayReader(data) {\n    if (data) {\n        this.data = data;\n        this.length = this.data.length;\n        this.index = 0;\n    }\n}\nUint8ArrayReader.prototype = new DataReader();\n/**\n * @see DataReader.byteAt\n */\nUint8ArrayReader.prototype.byteAt = function(i) {\n    return this.data[i];\n};\n/**\n * @see DataReader.lastIndexOfSignature\n */\nUint8ArrayReader.prototype.lastIndexOfSignature = function(sig) {\n    var sig0 = sig.charCodeAt(0),\n        sig1 = sig.charCodeAt(1),\n        sig2 = sig.charCodeAt(2),\n        sig3 = sig.charCodeAt(3);\n    for (var i = this.length - 4; i >= 0; --i) {\n        if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) {\n            return i;\n        }\n    }\n\n    return -1;\n};\n/**\n * @see DataReader.readData\n */\nUint8ArrayReader.prototype.readData = function(size) {\n    this.checkOffset(size);\n    if(size === 0) {\n        // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of [].\n        return new Uint8Array(0);\n    }\n    var result = this.data.subarray(this.index, this.index + size);\n    this.index += size;\n    return result;\n};\nmodule.exports = Uint8ArrayReader;\n\n},{\"./dataReader\":88}],102:[function(require,module,exports){\n'use strict';\n\nvar utils = require('./utils');\n\n/**\n * An object to write any content to an Uint8Array.\n * @constructor\n * @param {number} length The length of the array.\n */\nvar Uint8ArrayWriter = function(length) {\n    this.data = new Uint8Array(length);\n    this.index = 0;\n};\nUint8ArrayWriter.prototype = {\n    /**\n     * Append any content to the current array.\n     * @param {Object} input the content to add.\n     */\n    append: function(input) {\n        if (input.length !== 0) {\n            // with an empty Uint8Array, Opera fails with a \"Offset larger than array size\"\n            input = utils.transformTo(\"uint8array\", input);\n            this.data.set(input, this.index);\n            this.index += input.length;\n        }\n    },\n    /**\n     * Finalize the construction an return the result.\n     * @return {Uint8Array} the generated array.\n     */\n    finalize: function() {\n        return this.data;\n    }\n};\n\nmodule.exports = Uint8ArrayWriter;\n\n},{\"./utils\":104}],103:[function(require,module,exports){\n'use strict';\n\nvar utils = require('./utils');\nvar support = require('./support');\nvar nodeBuffer = require('./nodeBuffer');\n\n/**\n * The following functions come from pako, from pako/lib/utils/strings\n * released under the MIT license, see pako https://github.com/nodeca/pako/\n */\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nvar _utf8len = new Array(256);\nfor (var i=0; i<256; i++) {\n  _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);\n}\n_utf8len[254]=_utf8len[254]=1; // Invalid sequence start\n\n// convert string to array (typed, when possible)\nvar string2buf = function (str) {\n    var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n    // count binary size\n    for (m_pos = 0; m_pos < str_len; m_pos++) {\n        c = str.charCodeAt(m_pos);\n        if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {\n            c2 = str.charCodeAt(m_pos+1);\n            if ((c2 & 0xfc00) === 0xdc00) {\n                c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n                m_pos++;\n            }\n        }\n        buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n    }\n\n    // allocate buffer\n    if (support.uint8array) {\n        buf = new Uint8Array(buf_len);\n    } else {\n        buf = new Array(buf_len);\n    }\n\n    // convert\n    for (i=0, m_pos = 0; i < buf_len; m_pos++) {\n        c = str.charCodeAt(m_pos);\n        if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {\n            c2 = str.charCodeAt(m_pos+1);\n            if ((c2 & 0xfc00) === 0xdc00) {\n                c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n                m_pos++;\n            }\n        }\n        if (c < 0x80) {\n            /* one byte */\n            buf[i++] = c;\n        } else if (c < 0x800) {\n            /* two bytes */\n            buf[i++] = 0xC0 | (c >>> 6);\n            buf[i++] = 0x80 | (c & 0x3f);\n        } else if (c < 0x10000) {\n            /* three bytes */\n            buf[i++] = 0xE0 | (c >>> 12);\n            buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n            buf[i++] = 0x80 | (c & 0x3f);\n        } else {\n            /* four bytes */\n            buf[i++] = 0xf0 | (c >>> 18);\n            buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n            buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n            buf[i++] = 0x80 | (c & 0x3f);\n        }\n    }\n\n    return buf;\n};\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max   - length limit (mandatory);\nvar utf8border = function(buf, max) {\n    var pos;\n\n    max = max || buf.length;\n    if (max > buf.length) { max = buf.length; }\n\n    // go back from last position, until start of sequence found\n    pos = max-1;\n    while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n    // Fuckup - very small and broken sequence,\n    // return max, because we should return something anyway.\n    if (pos < 0) { return max; }\n\n    // If we came to start of buffer - that means vuffer is too small,\n    // return max too.\n    if (pos === 0) { return max; }\n\n    return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\n// convert array to string\nvar buf2string = function (buf) {\n    var str, i, out, c, c_len;\n    var len = buf.length;\n\n    // Reserve max possible length (2 words per char)\n    // NB: by unknown reasons, Array is significantly faster for\n    //     String.fromCharCode.apply than Uint16Array.\n    var utf16buf = new Array(len*2);\n\n    for (out=0, i=0; i<len;) {\n        c = buf[i++];\n        // quick process ascii\n        if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n        c_len = _utf8len[c];\n        // skip 5 & 6 byte codes\n        if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }\n\n        // apply mask on first byte\n        c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n        // join the rest\n        while (c_len > 1 && i < len) {\n            c = (c << 6) | (buf[i++] & 0x3f);\n            c_len--;\n        }\n\n        // terminated by end of string?\n        if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n        if (c < 0x10000) {\n            utf16buf[out++] = c;\n        } else {\n            c -= 0x10000;\n            utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n            utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n        }\n    }\n\n    // shrinkBuf(utf16buf, out)\n    if (utf16buf.length !== out) {\n        if(utf16buf.subarray) {\n            utf16buf = utf16buf.subarray(0, out);\n        } else {\n            utf16buf.length = out;\n        }\n    }\n\n    // return String.fromCharCode.apply(null, utf16buf);\n    return utils.applyFromCharCode(utf16buf);\n};\n\n\n// That's all for the pako functions.\n\n\n/**\n * Transform a javascript string into an array (typed if possible) of bytes,\n * UTF-8 encoded.\n * @param {String} str the string to encode\n * @return {Array|Uint8Array|Buffer} the UTF-8 encoded string.\n */\nexports.utf8encode = function utf8encode(str) {\n    if (support.nodebuffer) {\n        return nodeBuffer(str, \"utf-8\");\n    }\n\n    return string2buf(str);\n};\n\n\n/**\n * Transform a bytes array (or a representation) representing an UTF-8 encoded\n * string into a javascript string.\n * @param {Array|Uint8Array|Buffer} buf the data de decode\n * @return {String} the decoded string.\n */\nexports.utf8decode = function utf8decode(buf) {\n    if (support.nodebuffer) {\n        return utils.transformTo(\"nodebuffer\", buf).toString(\"utf-8\");\n    }\n\n    buf = utils.transformTo(support.uint8array ? \"uint8array\" : \"array\", buf);\n\n    // return buf2string(buf);\n    // Chrome prefers to work with \"small\" chunks of data\n    // for the method buf2string.\n    // Firefox and Chrome has their own shortcut, IE doesn't seem to really care.\n    var result = [], k = 0, len = buf.length, chunk = 65536;\n    while (k < len) {\n        var nextBoundary = utf8border(buf, Math.min(k + chunk, len));\n        if (support.uint8array) {\n            result.push(buf2string(buf.subarray(k, nextBoundary)));\n        } else {\n            result.push(buf2string(buf.slice(k, nextBoundary)));\n        }\n        k = nextBoundary;\n    }\n    return result.join(\"\");\n\n};\n// vim: set shiftwidth=4 softtabstop=4:\n\n},{\"./nodeBuffer\":94,\"./support\":100,\"./utils\":104}],104:[function(require,module,exports){\n'use strict';\nvar support = require('./support');\nvar compressions = require('./compressions');\nvar nodeBuffer = require('./nodeBuffer');\n/**\n * Convert a string to a \"binary string\" : a string containing only char codes between 0 and 255.\n * @param {string} str the string to transform.\n * @return {String} the binary string.\n */\nexports.string2binary = function(str) {\n    var result = \"\";\n    for (var i = 0; i < str.length; i++) {\n        result += String.fromCharCode(str.charCodeAt(i) & 0xff);\n    }\n    return result;\n};\nexports.arrayBuffer2Blob = function(buffer, mimeType) {\n    exports.checkSupport(\"blob\");\n\tmimeType = mimeType || 'application/zip';\n\n    try {\n        // Blob constructor\n        return new Blob([buffer], {\n            type: mimeType\n        });\n    }\n    catch (e) {\n\n        try {\n            // deprecated, browser only, old way\n            var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\n            var builder = new Builder();\n            builder.append(buffer);\n            return builder.getBlob(mimeType);\n        }\n        catch (e) {\n\n            // well, fuck ?!\n            throw new Error(\"Bug : can't construct the Blob.\");\n        }\n    }\n\n\n};\n/**\n * The identity function.\n * @param {Object} input the input.\n * @return {Object} the same input.\n */\nfunction identity(input) {\n    return input;\n}\n\n/**\n * Fill in an array with a string.\n * @param {String} str the string to use.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated).\n * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array.\n */\nfunction stringToArrayLike(str, array) {\n    for (var i = 0; i < str.length; ++i) {\n        array[i] = str.charCodeAt(i) & 0xFF;\n    }\n    return array;\n}\n\n/**\n * Transform an array-like object to a string.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.\n * @return {String} the result.\n */\nfunction arrayLikeToString(array) {\n    // Performances notes :\n    // --------------------\n    // String.fromCharCode.apply(null, array) is the fastest, see\n    // see http://jsperf.com/converting-a-uint8array-to-a-string/2\n    // but the stack is limited (and we can get huge arrays !).\n    //\n    // result += String.fromCharCode(array[i]); generate too many strings !\n    //\n    // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2\n    var chunk = 65536;\n    var result = [],\n        len = array.length,\n        type = exports.getTypeOf(array),\n        k = 0,\n        canUseApply = true;\n      try {\n         switch(type) {\n            case \"uint8array\":\n               String.fromCharCode.apply(null, new Uint8Array(0));\n               break;\n            case \"nodebuffer\":\n               String.fromCharCode.apply(null, nodeBuffer(0));\n               break;\n         }\n      } catch(e) {\n         canUseApply = false;\n      }\n\n      // no apply : slow and painful algorithm\n      // default browser on android 4.*\n      if (!canUseApply) {\n         var resultStr = \"\";\n         for(var i = 0; i < array.length;i++) {\n            resultStr += String.fromCharCode(array[i]);\n         }\n    return resultStr;\n    }\n    while (k < len && chunk > 1) {\n        try {\n            if (type === \"array\" || type === \"nodebuffer\") {\n                result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len))));\n            }\n            else {\n                result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len))));\n            }\n            k += chunk;\n        }\n        catch (e) {\n            chunk = Math.floor(chunk / 2);\n        }\n    }\n    return result.join(\"\");\n}\n\nexports.applyFromCharCode = arrayLikeToString;\n\n\n/**\n * Copy the data from an array-like to an other array-like.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated.\n * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array.\n */\nfunction arrayLikeToArrayLike(arrayFrom, arrayTo) {\n    for (var i = 0; i < arrayFrom.length; i++) {\n        arrayTo[i] = arrayFrom[i];\n    }\n    return arrayTo;\n}\n\n// a matrix containing functions to transform everything into everything.\nvar transform = {};\n\n// string to ?\ntransform[\"string\"] = {\n    \"string\": identity,\n    \"array\": function(input) {\n        return stringToArrayLike(input, new Array(input.length));\n    },\n    \"arraybuffer\": function(input) {\n        return transform[\"string\"][\"uint8array\"](input).buffer;\n    },\n    \"uint8array\": function(input) {\n        return stringToArrayLike(input, new Uint8Array(input.length));\n    },\n    \"nodebuffer\": function(input) {\n        return stringToArrayLike(input, nodeBuffer(input.length));\n    }\n};\n\n// array to ?\ntransform[\"array\"] = {\n    \"string\": arrayLikeToString,\n    \"array\": identity,\n    \"arraybuffer\": function(input) {\n        return (new Uint8Array(input)).buffer;\n    },\n    \"uint8array\": function(input) {\n        return new Uint8Array(input);\n    },\n    \"nodebuffer\": function(input) {\n        return nodeBuffer(input);\n    }\n};\n\n// arraybuffer to ?\ntransform[\"arraybuffer\"] = {\n    \"string\": function(input) {\n        return arrayLikeToString(new Uint8Array(input));\n    },\n    \"array\": function(input) {\n        return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));\n    },\n    \"arraybuffer\": identity,\n    \"uint8array\": function(input) {\n        return new Uint8Array(input);\n    },\n    \"nodebuffer\": function(input) {\n        return nodeBuffer(new Uint8Array(input));\n    }\n};\n\n// uint8array to ?\ntransform[\"uint8array\"] = {\n    \"string\": arrayLikeToString,\n    \"array\": function(input) {\n        return arrayLikeToArrayLike(input, new Array(input.length));\n    },\n    \"arraybuffer\": function(input) {\n        return input.buffer;\n    },\n    \"uint8array\": identity,\n    \"nodebuffer\": function(input) {\n        return nodeBuffer(input);\n    }\n};\n\n// nodebuffer to ?\ntransform[\"nodebuffer\"] = {\n    \"string\": arrayLikeToString,\n    \"array\": function(input) {\n        return arrayLikeToArrayLike(input, new Array(input.length));\n    },\n    \"arraybuffer\": function(input) {\n        return transform[\"nodebuffer\"][\"uint8array\"](input).buffer;\n    },\n    \"uint8array\": function(input) {\n        return arrayLikeToArrayLike(input, new Uint8Array(input.length));\n    },\n    \"nodebuffer\": identity\n};\n\n/**\n * Transform an input into any type.\n * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer.\n * If no output type is specified, the unmodified input will be returned.\n * @param {String} outputType the output type.\n * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert.\n * @throws {Error} an Error if the browser doesn't support the requested output type.\n */\nexports.transformTo = function(outputType, input) {\n    if (!input) {\n        // undefined, null, etc\n        // an empty string won't harm.\n        input = \"\";\n    }\n    if (!outputType) {\n        return input;\n    }\n    exports.checkSupport(outputType);\n    var inputType = exports.getTypeOf(input);\n    var result = transform[inputType][outputType](input);\n    return result;\n};\n\n/**\n * Return the type of the input.\n * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer.\n * @param {Object} input the input to identify.\n * @return {String} the (lowercase) type of the input.\n */\nexports.getTypeOf = function(input) {\n    if (typeof input === \"string\") {\n        return \"string\";\n    }\n    if (Object.prototype.toString.call(input) === \"[object Array]\") {\n        return \"array\";\n    }\n    if (support.nodebuffer && nodeBuffer.test(input)) {\n        return \"nodebuffer\";\n    }\n    if (support.uint8array && input instanceof Uint8Array) {\n        return \"uint8array\";\n    }\n    if (support.arraybuffer && input instanceof ArrayBuffer) {\n        return \"arraybuffer\";\n    }\n};\n\n/**\n * Throw an exception if the type is not supported.\n * @param {String} type the type to check.\n * @throws {Error} an Error if the browser doesn't support the requested type.\n */\nexports.checkSupport = function(type) {\n    var supported = support[type.toLowerCase()];\n    if (!supported) {\n        throw new Error(type + \" is not supported by this browser\");\n    }\n};\nexports.MAX_VALUE_16BITS = 65535;\nexports.MAX_VALUE_32BITS = -1; // well, \"\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\" is parsed as -1\n\n/**\n * Prettify a string read as binary.\n * @param {string} str the string to prettify.\n * @return {string} a pretty string.\n */\nexports.pretty = function(str) {\n    var res = '',\n        code, i;\n    for (i = 0; i < (str || \"\").length; i++) {\n        code = str.charCodeAt(i);\n        res += '\\\\x' + (code < 16 ? \"0\" : \"\") + code.toString(16).toUpperCase();\n    }\n    return res;\n};\n\n/**\n * Find a compression registered in JSZip.\n * @param {string} compressionMethod the method magic to find.\n * @return {Object|null} the JSZip compression object, null if none found.\n */\nexports.findCompression = function(compressionMethod) {\n    for (var method in compressions) {\n        if (!compressions.hasOwnProperty(method)) {\n            continue;\n        }\n        if (compressions[method].magic === compressionMethod) {\n            return compressions[method];\n        }\n    }\n    return null;\n};\n/**\n* Cross-window, cross-Node-context regular expression detection\n* @param  {Object}  object Anything\n* @return {Boolean}        true if the object is a regular expression,\n* false otherwise\n*/\nexports.isRegExp = function (object) {\n    return Object.prototype.toString.call(object) === \"[object RegExp]\";\n};\n\n\n},{\"./compressions\":86,\"./nodeBuffer\":94,\"./support\":100}],105:[function(require,module,exports){\n'use strict';\nvar StringReader = require('./stringReader');\nvar NodeBufferReader = require('./nodeBufferReader');\nvar Uint8ArrayReader = require('./uint8ArrayReader');\nvar utils = require('./utils');\nvar sig = require('./signature');\nvar ZipEntry = require('./zipEntry');\nvar support = require('./support');\nvar jszipProto = require('./object');\n//  class ZipEntries {{{\n/**\n * All the entries in the zip file.\n * @constructor\n * @param {String|ArrayBuffer|Uint8Array} data the binary stream to load.\n * @param {Object} loadOptions Options for loading the stream.\n */\nfunction ZipEntries(data, loadOptions) {\n    this.files = [];\n    this.loadOptions = loadOptions;\n    if (data) {\n        this.load(data);\n    }\n}\nZipEntries.prototype = {\n    /**\n     * Check that the reader is on the speficied signature.\n     * @param {string} expectedSignature the expected signature.\n     * @throws {Error} if it is an other signature.\n     */\n    checkSignature: function(expectedSignature) {\n        var signature = this.reader.readString(4);\n        if (signature !== expectedSignature) {\n            throw new Error(\"Corrupted zip or bug : unexpected signature \" + \"(\" + utils.pretty(signature) + \", expected \" + utils.pretty(expectedSignature) + \")\");\n        }\n    },\n    /**\n     * Read the end of the central directory.\n     */\n    readBlockEndOfCentral: function() {\n        this.diskNumber = this.reader.readInt(2);\n        this.diskWithCentralDirStart = this.reader.readInt(2);\n        this.centralDirRecordsOnThisDisk = this.reader.readInt(2);\n        this.centralDirRecords = this.reader.readInt(2);\n        this.centralDirSize = this.reader.readInt(4);\n        this.centralDirOffset = this.reader.readInt(4);\n\n        this.zipCommentLength = this.reader.readInt(2);\n        // warning : the encoding depends of the system locale\n        // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded.\n        // On a windows machine, this field is encoded with the localized windows code page.\n        this.zipComment = this.reader.readString(this.zipCommentLength);\n        // To get consistent behavior with the generation part, we will assume that\n        // this is utf8 encoded.\n        this.zipComment = jszipProto.utf8decode(this.zipComment);\n    },\n    /**\n     * Read the end of the Zip 64 central directory.\n     * Not merged with the method readEndOfCentral :\n     * The end of central can coexist with its Zip64 brother,\n     * I don't want to read the wrong number of bytes !\n     */\n    readBlockZip64EndOfCentral: function() {\n        this.zip64EndOfCentralSize = this.reader.readInt(8);\n        this.versionMadeBy = this.reader.readString(2);\n        this.versionNeeded = this.reader.readInt(2);\n        this.diskNumber = this.reader.readInt(4);\n        this.diskWithCentralDirStart = this.reader.readInt(4);\n        this.centralDirRecordsOnThisDisk = this.reader.readInt(8);\n        this.centralDirRecords = this.reader.readInt(8);\n        this.centralDirSize = this.reader.readInt(8);\n        this.centralDirOffset = this.reader.readInt(8);\n\n        this.zip64ExtensibleData = {};\n        var extraDataSize = this.zip64EndOfCentralSize - 44,\n            index = 0,\n            extraFieldId,\n            extraFieldLength,\n            extraFieldValue;\n        while (index < extraDataSize) {\n            extraFieldId = this.reader.readInt(2);\n            extraFieldLength = this.reader.readInt(4);\n            extraFieldValue = this.reader.readString(extraFieldLength);\n            this.zip64ExtensibleData[extraFieldId] = {\n                id: extraFieldId,\n                length: extraFieldLength,\n                value: extraFieldValue\n            };\n        }\n    },\n    /**\n     * Read the end of the Zip 64 central directory locator.\n     */\n    readBlockZip64EndOfCentralLocator: function() {\n        this.diskWithZip64CentralDirStart = this.reader.readInt(4);\n        this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8);\n        this.disksCount = this.reader.readInt(4);\n        if (this.disksCount > 1) {\n            throw new Error(\"Multi-volumes zip are not supported\");\n        }\n    },\n    /**\n     * Read the local files, based on the offset read in the central part.\n     */\n    readLocalFiles: function() {\n        var i, file;\n        for (i = 0; i < this.files.length; i++) {\n            file = this.files[i];\n            this.reader.setIndex(file.localHeaderOffset);\n            this.checkSignature(sig.LOCAL_FILE_HEADER);\n            file.readLocalPart(this.reader);\n            file.handleUTF8();\n            file.processAttributes();\n        }\n    },\n    /**\n     * Read the central directory.\n     */\n    readCentralDir: function() {\n        var file;\n\n        this.reader.setIndex(this.centralDirOffset);\n        while (this.reader.readString(4) === sig.CENTRAL_FILE_HEADER) {\n            file = new ZipEntry({\n                zip64: this.zip64\n            }, this.loadOptions);\n            file.readCentralPart(this.reader);\n            this.files.push(file);\n        }\n    },\n    /**\n     * Read the end of central directory.\n     */\n    readEndOfCentral: function() {\n        var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END);\n        if (offset === -1) {\n            // Check if the content is a truncated zip or complete garbage.\n            // A \"LOCAL_FILE_HEADER\" is not required at the beginning (auto\n            // extractible zip for example) but it can give a good hint.\n            // If an ajax request was used without responseType, we will also\n            // get unreadable data.\n            var isGarbage = true;\n            try {\n                this.reader.setIndex(0);\n                this.checkSignature(sig.LOCAL_FILE_HEADER);\n                isGarbage = false;\n            } catch (e) {}\n\n            if (isGarbage) {\n                throw new Error(\"Can't find end of central directory : is this a zip file ? \" +\n                                \"If it is, see http://stuk.github.io/jszip/documentation/howto/read_zip.html\");\n            } else {\n                throw new Error(\"Corrupted zip : can't find end of central directory\");\n            }\n        }\n        this.reader.setIndex(offset);\n        this.checkSignature(sig.CENTRAL_DIRECTORY_END);\n        this.readBlockEndOfCentral();\n\n\n        /* extract from the zip spec :\n            4)  If one of the fields in the end of central directory\n                record is too small to hold required data, the field\n                should be set to -1 (0xFFFF or 0xFFFFFFFF) and the\n                ZIP64 format record should be created.\n            5)  The end of central directory record and the\n                Zip64 end of central directory locator record must\n                reside on the same disk when splitting or spanning\n                an archive.\n         */\n        if (this.diskNumber === utils.MAX_VALUE_16BITS || this.diskWithCentralDirStart === utils.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === utils.MAX_VALUE_16BITS || this.centralDirRecords === utils.MAX_VALUE_16BITS || this.centralDirSize === utils.MAX_VALUE_32BITS || this.centralDirOffset === utils.MAX_VALUE_32BITS) {\n            this.zip64 = true;\n\n            /*\n            Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from\n            the zip file can fit into a 32bits integer. This cannot be solved : Javascript represents\n            all numbers as 64-bit double precision IEEE 754 floating point numbers.\n            So, we have 53bits for integers and bitwise operations treat everything as 32bits.\n            see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators\n            and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5\n            */\n\n            // should look for a zip64 EOCD locator\n            offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);\n            if (offset === -1) {\n                throw new Error(\"Corrupted zip : can't find the ZIP64 end of central directory locator\");\n            }\n            this.reader.setIndex(offset);\n            this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);\n            this.readBlockZip64EndOfCentralLocator();\n\n            // now the zip64 EOCD record\n            this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);\n            this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END);\n            this.readBlockZip64EndOfCentral();\n        }\n    },\n    prepareReader: function(data) {\n        var type = utils.getTypeOf(data);\n        if (type === \"string\" && !support.uint8array) {\n            this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString);\n        }\n        else if (type === \"nodebuffer\") {\n            this.reader = new NodeBufferReader(data);\n        }\n        else {\n            this.reader = new Uint8ArrayReader(utils.transformTo(\"uint8array\", data));\n        }\n    },\n    /**\n     * Read a zip file and create ZipEntries.\n     * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file.\n     */\n    load: function(data) {\n        this.prepareReader(data);\n        this.readEndOfCentral();\n        this.readCentralDir();\n        this.readLocalFiles();\n    }\n};\n// }}} end of ZipEntries\nmodule.exports = ZipEntries;\n\n},{\"./nodeBufferReader\":95,\"./object\":96,\"./signature\":97,\"./stringReader\":98,\"./support\":100,\"./uint8ArrayReader\":101,\"./utils\":104,\"./zipEntry\":106}],106:[function(require,module,exports){\n'use strict';\nvar StringReader = require('./stringReader');\nvar utils = require('./utils');\nvar CompressedObject = require('./compressedObject');\nvar jszipProto = require('./object');\n\nvar MADE_BY_DOS = 0x00;\nvar MADE_BY_UNIX = 0x03;\n\n// class ZipEntry {{{\n/**\n * An entry in the zip file.\n * @constructor\n * @param {Object} options Options of the current file.\n * @param {Object} loadOptions Options for loading the stream.\n */\nfunction ZipEntry(options, loadOptions) {\n    this.options = options;\n    this.loadOptions = loadOptions;\n}\nZipEntry.prototype = {\n    /**\n     * say if the file is encrypted.\n     * @return {boolean} true if the file is encrypted, false otherwise.\n     */\n    isEncrypted: function() {\n        // bit 1 is set\n        return (this.bitFlag & 0x0001) === 0x0001;\n    },\n    /**\n     * say if the file has utf-8 filename/comment.\n     * @return {boolean} true if the filename/comment is in utf-8, false otherwise.\n     */\n    useUTF8: function() {\n        // bit 11 is set\n        return (this.bitFlag & 0x0800) === 0x0800;\n    },\n    /**\n     * Prepare the function used to generate the compressed content from this ZipFile.\n     * @param {DataReader} reader the reader to use.\n     * @param {number} from the offset from where we should read the data.\n     * @param {number} length the length of the data to read.\n     * @return {Function} the callback to get the compressed content (the type depends of the DataReader class).\n     */\n    prepareCompressedContent: function(reader, from, length) {\n        return function() {\n            var previousIndex = reader.index;\n            reader.setIndex(from);\n            var compressedFileData = reader.readData(length);\n            reader.setIndex(previousIndex);\n\n            return compressedFileData;\n        };\n    },\n    /**\n     * Prepare the function used to generate the uncompressed content from this ZipFile.\n     * @param {DataReader} reader the reader to use.\n     * @param {number} from the offset from where we should read the data.\n     * @param {number} length the length of the data to read.\n     * @param {JSZip.compression} compression the compression used on this file.\n     * @param {number} uncompressedSize the uncompressed size to expect.\n     * @return {Function} the callback to get the uncompressed content (the type depends of the DataReader class).\n     */\n    prepareContent: function(reader, from, length, compression, uncompressedSize) {\n        return function() {\n\n            var compressedFileData = utils.transformTo(compression.uncompressInputType, this.getCompressedContent());\n            var uncompressedFileData = compression.uncompress(compressedFileData);\n\n            if (uncompressedFileData.length !== uncompressedSize) {\n                throw new Error(\"Bug : uncompressed data size mismatch\");\n            }\n\n            return uncompressedFileData;\n        };\n    },\n    /**\n     * Read the local part of a zip file and add the info in this object.\n     * @param {DataReader} reader the reader to use.\n     */\n    readLocalPart: function(reader) {\n        var compression, localExtraFieldsLength;\n\n        // we already know everything from the central dir !\n        // If the central dir data are false, we are doomed.\n        // On the bright side, the local part is scary  : zip64, data descriptors, both, etc.\n        // The less data we get here, the more reliable this should be.\n        // Let's skip the whole header and dash to the data !\n        reader.skip(22);\n        // in some zip created on windows, the filename stored in the central dir contains \\ instead of /.\n        // Strangely, the filename here is OK.\n        // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes\n        // or APPNOTE#4.4.17.1, \"All slashes MUST be forward slashes '/'\") but there are a lot of bad zip generators...\n        // Search \"unzip mismatching \"local\" filename continuing with \"central\" filename version\" on\n        // the internet.\n        //\n        // I think I see the logic here : the central directory is used to display\n        // content and the local directory is used to extract the files. Mixing / and \\\n        // may be used to display \\ to windows users and use / when extracting the files.\n        // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394\n        this.fileNameLength = reader.readInt(2);\n        localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir\n        this.fileName = reader.readString(this.fileNameLength);\n        reader.skip(localExtraFieldsLength);\n\n        if (this.compressedSize == -1 || this.uncompressedSize == -1) {\n            throw new Error(\"Bug or corrupted zip : didn't get enough informations from the central directory \" + \"(compressedSize == -1 || uncompressedSize == -1)\");\n        }\n\n        compression = utils.findCompression(this.compressionMethod);\n        if (compression === null) { // no compression found\n            throw new Error(\"Corrupted zip : compression \" + utils.pretty(this.compressionMethod) + \" unknown (inner file : \" + this.fileName + \")\");\n        }\n        this.decompressed = new CompressedObject();\n        this.decompressed.compressedSize = this.compressedSize;\n        this.decompressed.uncompressedSize = this.uncompressedSize;\n        this.decompressed.crc32 = this.crc32;\n        this.decompressed.compressionMethod = this.compressionMethod;\n        this.decompressed.getCompressedContent = this.prepareCompressedContent(reader, reader.index, this.compressedSize, compression);\n        this.decompressed.getContent = this.prepareContent(reader, reader.index, this.compressedSize, compression, this.uncompressedSize);\n\n        // we need to compute the crc32...\n        if (this.loadOptions.checkCRC32) {\n            this.decompressed = utils.transformTo(\"string\", this.decompressed.getContent());\n            if (jszipProto.crc32(this.decompressed) !== this.crc32) {\n                throw new Error(\"Corrupted zip : CRC32 mismatch\");\n            }\n        }\n    },\n\n    /**\n     * Read the central part of a zip file and add the info in this object.\n     * @param {DataReader} reader the reader to use.\n     */\n    readCentralPart: function(reader) {\n        this.versionMadeBy = reader.readInt(2);\n        this.versionNeeded = reader.readInt(2);\n        this.bitFlag = reader.readInt(2);\n        this.compressionMethod = reader.readString(2);\n        this.date = reader.readDate();\n        this.crc32 = reader.readInt(4);\n        this.compressedSize = reader.readInt(4);\n        this.uncompressedSize = reader.readInt(4);\n        this.fileNameLength = reader.readInt(2);\n        this.extraFieldsLength = reader.readInt(2);\n        this.fileCommentLength = reader.readInt(2);\n        this.diskNumberStart = reader.readInt(2);\n        this.internalFileAttributes = reader.readInt(2);\n        this.externalFileAttributes = reader.readInt(4);\n        this.localHeaderOffset = reader.readInt(4);\n\n        if (this.isEncrypted()) {\n            throw new Error(\"Encrypted zip are not supported\");\n        }\n\n        this.fileName = reader.readString(this.fileNameLength);\n        this.readExtraFields(reader);\n        this.parseZIP64ExtraField(reader);\n        this.fileComment = reader.readString(this.fileCommentLength);\n    },\n\n    /**\n     * Parse the external file attributes and get the unix/dos permissions.\n     */\n    processAttributes: function () {\n        this.unixPermissions = null;\n        this.dosPermissions = null;\n        var madeBy = this.versionMadeBy >> 8;\n\n        // Check if we have the DOS directory flag set.\n        // We look for it in the DOS and UNIX permissions\n        // but some unknown platform could set it as a compatibility flag.\n        this.dir = this.externalFileAttributes & 0x0010 ? true : false;\n\n        if(madeBy === MADE_BY_DOS) {\n            // first 6 bits (0 to 5)\n            this.dosPermissions = this.externalFileAttributes & 0x3F;\n        }\n\n        if(madeBy === MADE_BY_UNIX) {\n            this.unixPermissions = (this.externalFileAttributes >> 16) & 0xFFFF;\n            // the octal permissions are in (this.unixPermissions & 0x01FF).toString(8);\n        }\n\n        // fail safe : if the name ends with a / it probably means a folder\n        if (!this.dir && this.fileName.slice(-1) === '/') {\n            this.dir = true;\n        }\n    },\n\n    /**\n     * Parse the ZIP64 extra field and merge the info in the current ZipEntry.\n     * @param {DataReader} reader the reader to use.\n     */\n    parseZIP64ExtraField: function(reader) {\n\n        if (!this.extraFields[0x0001]) {\n            return;\n        }\n\n        // should be something, preparing the extra reader\n        var extraReader = new StringReader(this.extraFields[0x0001].value);\n\n        // I really hope that these 64bits integer can fit in 32 bits integer, because js\n        // won't let us have more.\n        if (this.uncompressedSize === utils.MAX_VALUE_32BITS) {\n            this.uncompressedSize = extraReader.readInt(8);\n        }\n        if (this.compressedSize === utils.MAX_VALUE_32BITS) {\n            this.compressedSize = extraReader.readInt(8);\n        }\n        if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) {\n            this.localHeaderOffset = extraReader.readInt(8);\n        }\n        if (this.diskNumberStart === utils.MAX_VALUE_32BITS) {\n            this.diskNumberStart = extraReader.readInt(4);\n        }\n    },\n    /**\n     * Read the central part of a zip file and add the info in this object.\n     * @param {DataReader} reader the reader to use.\n     */\n    readExtraFields: function(reader) {\n        var start = reader.index,\n            extraFieldId,\n            extraFieldLength,\n            extraFieldValue;\n\n        this.extraFields = this.extraFields || {};\n\n        while (reader.index < start + this.extraFieldsLength) {\n            extraFieldId = reader.readInt(2);\n            extraFieldLength = reader.readInt(2);\n            extraFieldValue = reader.readString(extraFieldLength);\n\n            this.extraFields[extraFieldId] = {\n                id: extraFieldId,\n                length: extraFieldLength,\n                value: extraFieldValue\n            };\n        }\n    },\n    /**\n     * Apply an UTF8 transformation if needed.\n     */\n    handleUTF8: function() {\n        if (this.useUTF8()) {\n            this.fileName = jszipProto.utf8decode(this.fileName);\n            this.fileComment = jszipProto.utf8decode(this.fileComment);\n        } else {\n            var upath = this.findExtraFieldUnicodePath();\n            if (upath !== null) {\n                this.fileName = upath;\n            }\n            var ucomment = this.findExtraFieldUnicodeComment();\n            if (ucomment !== null) {\n                this.fileComment = ucomment;\n            }\n        }\n    },\n\n    /**\n     * Find the unicode path declared in the extra field, if any.\n     * @return {String} the unicode path, null otherwise.\n     */\n    findExtraFieldUnicodePath: function() {\n        var upathField = this.extraFields[0x7075];\n        if (upathField) {\n            var extraReader = new StringReader(upathField.value);\n\n            // wrong version\n            if (extraReader.readInt(1) !== 1) {\n                return null;\n            }\n\n            // the crc of the filename changed, this field is out of date.\n            if (jszipProto.crc32(this.fileName) !== extraReader.readInt(4)) {\n                return null;\n            }\n\n            return jszipProto.utf8decode(extraReader.readString(upathField.length - 5));\n        }\n        return null;\n    },\n\n    /**\n     * Find the unicode comment declared in the extra field, if any.\n     * @return {String} the unicode comment, null otherwise.\n     */\n    findExtraFieldUnicodeComment: function() {\n        var ucommentField = this.extraFields[0x6375];\n        if (ucommentField) {\n            var extraReader = new StringReader(ucommentField.value);\n\n            // wrong version\n            if (extraReader.readInt(1) !== 1) {\n                return null;\n            }\n\n            // the crc of the comment changed, this field is out of date.\n            if (jszipProto.crc32(this.fileComment) !== extraReader.readInt(4)) {\n                return null;\n            }\n\n            return jszipProto.utf8decode(extraReader.readString(ucommentField.length - 5));\n        }\n        return null;\n    }\n};\nmodule.exports = ZipEntry;\n\n},{\"./compressedObject\":85,\"./object\":96,\"./stringReader\":98,\"./utils\":104}],107:[function(require,module,exports){\nexports.Parser = require(\"./lib/parser\").Parser;\nexports.rules = require(\"./lib/rules\");\nexports.errors = require(\"./lib/errors\");\nexports.results = require(\"./lib/parsing-results\");\nexports.StringSource = require(\"./lib/StringSource\");\nexports.Token = require(\"./lib/Token\");\nexports.bottomUp = require(\"./lib/bottom-up\");\nexports.RegexTokeniser = require(\"./lib/regex-tokeniser\").RegexTokeniser;\n\nexports.rule = function(ruleBuilder) {\n    var rule;\n    return function(input) {\n        if (!rule) {\n            rule = ruleBuilder();\n        }\n        return rule(input);\n    };\n};\n\n},{\"./lib/StringSource\":108,\"./lib/Token\":109,\"./lib/bottom-up\":111,\"./lib/errors\":112,\"./lib/parser\":114,\"./lib/parsing-results\":115,\"./lib/regex-tokeniser\":116,\"./lib/rules\":117}],108:[function(require,module,exports){\nvar util = require(\"util\");\n\nvar StringSource = module.exports = function(string, description) {\n    var self = {\n        asString: function() {\n            return string;\n        },\n        range: function(startIndex, endIndex) {\n            return new StringSourceRange(string, description, startIndex, endIndex);\n        }\n    };\n    return self;\n};\n\nvar StringSourceRange = function(string, description, startIndex, endIndex) {\n    this._string = string;\n    this._description = description;\n    this._startIndex = startIndex;\n    this._endIndex = endIndex;\n};\n\nStringSourceRange.prototype.to = function(otherRange) {\n    // TODO: Assert that tokens are the same across both iterators\n    return new StringSourceRange(this._string, this._description, this._startIndex, otherRange._endIndex);\n};\n\nStringSourceRange.prototype.describe = function() {\n    var position = this._position();\n    var description = this._description ? this._description + \"\\n\" : \"\";\n    return util.format(\"%sLine number: %s\\nCharacter number: %s\",\n        description, position.lineNumber, position.characterNumber);\n};\n\nStringSourceRange.prototype.lineNumber = function() {\n    return this._position().lineNumber;\n};\n\nStringSourceRange.prototype.characterNumber = function() {\n    return this._position().characterNumber;\n};\n\nStringSourceRange.prototype._position = function() {\n    var self = this;\n    var index = 0;\n    var nextNewLine = function() {\n        return self._string.indexOf(\"\\n\", index);\n    };\n    \n    var lineNumber = 1;\n    while (nextNewLine() !== -1 && nextNewLine() < this._startIndex) {\n        index = nextNewLine() + 1;\n        lineNumber += 1;\n    }\n    var characterNumber = this._startIndex - index + 1;\n    return {lineNumber: lineNumber, characterNumber: characterNumber};\n};\n\n},{\"util\":157}],109:[function(require,module,exports){\nmodule.exports = function(name, value, source) {\n    this.name = name;\n    this.value = value;\n    if (source) {\n        this.source = source;\n    }\n};\n\n},{}],110:[function(require,module,exports){\nvar TokenIterator = module.exports = function(tokens, startIndex) {\n    this._tokens = tokens;\n    this._startIndex = startIndex || 0;\n};\n\nTokenIterator.prototype.head = function() {\n    return this._tokens[this._startIndex];\n};\n\nTokenIterator.prototype.tail = function(startIndex) {\n    return new TokenIterator(this._tokens, this._startIndex + 1);\n};\n\nTokenIterator.prototype.toArray = function() {\n    return this._tokens.slice(this._startIndex);\n};\n\nTokenIterator.prototype.end = function() {\n    return this._tokens[this._tokens.length - 1];\n};\n\n// TODO: doesn't need to be a method, can be a separate function,\n// which simplifies implementation of the TokenIterator interface\nTokenIterator.prototype.to = function(end) {\n    var start = this.head().source;\n    var endToken = end.head() || end.end();\n    return start.to(endToken.source);\n};\n\n},{}],111:[function(require,module,exports){\nvar rules = require(\"./rules\");\nvar results = require(\"./parsing-results\");\n\nexports.parser = function(name, prefixRules, infixRuleBuilders) {\n    var self = {\n        rule: rule,\n        leftAssociative: leftAssociative,\n        rightAssociative: rightAssociative\n    };\n    \n    var infixRules = new InfixRules(infixRuleBuilders.map(createInfixRule));\n    var prefixRule = rules.firstOf(name, prefixRules);\n    \n    function createInfixRule(infixRuleBuilder) {\n        return {\n            name: infixRuleBuilder.name,\n            rule: lazyRule(infixRuleBuilder.ruleBuilder.bind(null, self))\n        };\n    }\n    \n    function rule() {\n        return createRule(infixRules);\n    }\n    \n    function leftAssociative(name) {\n        return createRule(infixRules.untilExclusive(name));\n    }\n    \n    function rightAssociative(name) {\n        return createRule(infixRules.untilInclusive(name));\n    }\n    \n    function createRule(infixRules) {\n        return apply.bind(null, infixRules);\n    }\n    \n    function apply(infixRules, tokens) {\n        var leftResult = prefixRule(tokens);\n        if (leftResult.isSuccess()) {\n            return infixRules.apply(leftResult);\n        } else {\n            return leftResult;\n        }\n    }\n    \n    return self;\n};\n\nfunction InfixRules(infixRules) {\n    function untilExclusive(name) {\n        return new InfixRules(infixRules.slice(0, ruleNames().indexOf(name)));\n    }\n    \n    function untilInclusive(name) {\n        return new InfixRules(infixRules.slice(0, ruleNames().indexOf(name) + 1));\n    }\n    \n    function ruleNames() {\n        return infixRules.map(function(rule) {\n            return rule.name;\n        });\n    }\n    \n    function apply(leftResult) {\n        var currentResult;\n        var source;\n        while (true) {\n            currentResult = applyToTokens(leftResult.remaining());\n            if (currentResult.isSuccess()) {\n                source = leftResult.source().to(currentResult.source());\n                leftResult = results.success(\n                    currentResult.value()(leftResult.value(), source),\n                    currentResult.remaining(),\n                    source\n                )\n            } else if (currentResult.isFailure()) {\n                return leftResult;\n            } else {\n                return currentResult;\n            }\n        }\n    }\n    \n    function applyToTokens(tokens) {\n        return rules.firstOf(\"infix\", infixRules.map(function(infix) {\n            return infix.rule;\n        }))(tokens);\n    }\n    \n    return {\n        apply: apply,\n        untilExclusive: untilExclusive,\n        untilInclusive: untilInclusive\n    }\n}\n\nexports.infix = function(name, ruleBuilder) {\n    function map(func) {\n        return exports.infix(name, function(parser) {\n            var rule = ruleBuilder(parser);\n            return function(tokens) {\n                var result = rule(tokens);\n                return result.map(function(right) {\n                    return function(left, source) {\n                        return func(left, right, source);\n                    };\n                });\n            };\n        });\n    }\n    \n    return {\n        name: name,\n        ruleBuilder: ruleBuilder,\n        map: map\n    };\n}\n\n// TODO: move into a sensible place and remove duplication\nvar lazyRule = function(ruleBuilder) {\n    var rule;\n    return function(input) {\n        if (!rule) {\n            rule = ruleBuilder();\n        }\n        return rule(input);\n    };\n};\n\n},{\"./parsing-results\":115,\"./rules\":117}],112:[function(require,module,exports){\nexports.error = function(options) {\n    return new Error(options);\n};\n\nvar Error = function(options) {\n    this.expected = options.expected;\n    this.actual = options.actual;\n    this._location = options.location;\n};\n\nError.prototype.describe = function() {\n    var locationDescription = this._location ? this._location.describe() + \":\\n\" : \"\";\n    return locationDescription + \"Expected \" + this.expected + \"\\nbut got \" + this.actual;\n};\n\nError.prototype.lineNumber = function() {\n    return this._location.lineNumber();\n};\n\nError.prototype.characterNumber = function() {\n    return this._location.characterNumber();\n};\n\n},{}],113:[function(require,module,exports){\nvar fromArray = exports.fromArray = function(array) {\n    var index = 0;\n    var hasNext = function() {\n        return index < array.length;\n    };\n    return new LazyIterator({\n        hasNext: hasNext,\n        next: function() {\n            if (!hasNext()) {\n                throw new Error(\"No more elements\");\n            } else {\n                return array[index++];\n            }\n        }\n    });\n};\n\nvar LazyIterator = function(iterator) {\n    this._iterator = iterator;\n};\n\nLazyIterator.prototype.map = function(func) {\n    var iterator = this._iterator;\n    return new LazyIterator({\n        hasNext: function() {\n            return iterator.hasNext();\n        },\n        next: function() {\n            return func(iterator.next());\n        }\n    });\n};\n\nLazyIterator.prototype.filter = function(condition) {\n    var iterator = this._iterator;\n    \n    var moved = false;\n    var hasNext = false;\n    var next;\n    var moveIfNecessary = function() {\n        if (moved) {\n            return;\n        }\n        moved = true;\n        hasNext = false;\n        while (iterator.hasNext() && !hasNext) {\n            next = iterator.next();\n            hasNext = condition(next);\n        }\n    };\n    \n    return new LazyIterator({\n        hasNext: function() {\n            moveIfNecessary();\n            return hasNext;\n        },\n        next: function() {\n            moveIfNecessary();\n            var toReturn = next;\n            moved = false;\n            return toReturn;\n        }\n    });\n};\n\nLazyIterator.prototype.first = function() {\n    var iterator = this._iterator;\n    if (this._iterator.hasNext()) {\n        return iterator.next();\n    } else {\n        return null;\n    }\n};\n\nLazyIterator.prototype.toArray = function() {\n    var result = [];\n    while (this._iterator.hasNext()) {\n        result.push(this._iterator.next());\n    }\n    return result;\n};\n\n},{}],114:[function(require,module,exports){\nvar TokenIterator = require(\"./TokenIterator\");\n\nexports.Parser = function(options) {\n    var parseTokens = function(parser, tokens) {\n        return parser(new TokenIterator(tokens));\n    };\n    \n    return {\n        parseTokens: parseTokens\n    };\n};\n\n},{\"./TokenIterator\":110}],115:[function(require,module,exports){\nmodule.exports = {\n    failure: function(errors, remaining) {\n        if (errors.length < 1) {\n            throw new Error(\"Failure must have errors\");\n        }\n        return new Result({\n            status: \"failure\",\n            remaining: remaining,\n            errors: errors\n        });\n    },\n    error: function(errors, remaining) {\n        if (errors.length < 1) {\n            throw new Error(\"Failure must have errors\");\n        }\n        return new Result({\n            status: \"error\",\n            remaining: remaining,\n            errors: errors\n        });\n    },\n    success: function(value, remaining, source) {\n        return new Result({\n            status: \"success\",\n            value: value,\n            source: source,\n            remaining: remaining,\n            errors: []\n        });\n    },\n    cut: function(remaining) {\n        return new Result({\n            status: \"cut\",\n            remaining: remaining,\n            errors: []\n        });\n    }\n};\n\nvar Result = function(options) {\n    this._value = options.value;\n    this._status = options.status;\n    this._hasValue = options.value !== undefined;\n    this._remaining = options.remaining;\n    this._source = options.source;\n    this._errors = options.errors;\n};\n\nResult.prototype.map = function(func) {\n    if (this._hasValue) {\n        return new Result({\n            value: func(this._value, this._source),\n            status: this._status,\n            remaining: this._remaining,\n            source: this._source,\n            errors: this._errors\n        });\n    } else {\n        return this;\n    }\n};\n\nResult.prototype.changeRemaining = function(remaining) {\n    return new Result({\n        value: this._value,\n        status: this._status,\n        remaining: remaining,\n        source: this._source,\n        errors: this._errors\n    });\n};\n\nResult.prototype.isSuccess = function() {\n    return this._status === \"success\" || this._status === \"cut\";\n};\n\nResult.prototype.isFailure = function() {\n    return this._status === \"failure\";\n};\n\nResult.prototype.isError = function() {\n    return this._status === \"error\";\n};\n\nResult.prototype.isCut = function() {\n    return this._status === \"cut\";\n};\n\nResult.prototype.value = function() {\n    return this._value;\n};\n\nResult.prototype.remaining = function() {\n    return this._remaining;\n};\n\nResult.prototype.source = function() {\n    return this._source;\n};\n\nResult.prototype.errors = function() {\n    return this._errors;\n};\n\n},{}],116:[function(require,module,exports){\nvar Token = require(\"./Token\");\nvar StringSource = require(\"./StringSource\");\n\nexports.RegexTokeniser = RegexTokeniser;\n\nfunction RegexTokeniser(rules) {\n    rules = rules.map(function(rule) {\n        return {\n            name: rule.name,\n            regex: new RegExp(rule.regex.source, \"g\")\n        };\n    });\n    \n    function tokenise(input, description) {\n        var source = new StringSource(input, description);\n        var index = 0;\n        var tokens = [];\n    \n        while (index < input.length) {\n            var result = readNextToken(input, index, source);\n            index = result.endIndex;\n            tokens.push(result.token);\n        }\n        \n        tokens.push(endToken(input, source));\n        return tokens;\n    }\n\n    function readNextToken(string, startIndex, source) {\n        for (var i = 0; i < rules.length; i++) {\n            var regex = rules[i].regex;\n            regex.lastIndex = startIndex;\n            var result = regex.exec(string);\n            \n            if (result) {\n                var endIndex = startIndex + result[0].length;\n                if (result.index === startIndex && endIndex > startIndex) {\n                    var value = result[1];\n                    var token = new Token(\n                        rules[i].name,\n                        value,\n                        source.range(startIndex, endIndex)\n                    );\n                    return {token: token, endIndex: endIndex};\n                }\n            }\n        }\n        var endIndex = startIndex + 1;\n        var token = new Token(\n            \"unrecognisedCharacter\",\n            string.substring(startIndex, endIndex),\n            source.range(startIndex, endIndex)\n        );\n        return {token: token, endIndex: endIndex};\n    }\n    \n    function endToken(input, source) {\n        return new Token(\n            \"end\",\n            null,\n            source.range(input.length, input.length)\n        );\n    }\n    \n    return {\n        tokenise: tokenise\n    }\n}\n\n\n\n},{\"./StringSource\":108,\"./Token\":109}],117:[function(require,module,exports){\nvar _ = require(\"underscore\");\nvar options = require(\"option\");\nvar results = require(\"./parsing-results\");\nvar errors = require(\"./errors\");\nvar lazyIterators = require(\"./lazy-iterators\");\n\nexports.token = function(tokenType, value) {\n    var matchValue = value !== undefined;\n    return function(input) {\n        var token = input.head();\n        if (token && token.name === tokenType && (!matchValue || token.value === value)) {\n            return results.success(token.value, input.tail(), token.source);\n        } else {\n            var expected = describeToken({name: tokenType, value: value});\n            return describeTokenMismatch(input, expected);\n        }\n    };\n};\n\nexports.tokenOfType = function(tokenType) {\n    return exports.token(tokenType);\n};\n\nexports.firstOf = function(name, parsers) {\n    if (!_.isArray(parsers)) {\n        parsers = Array.prototype.slice.call(arguments, 1);\n    }\n    return function(input) {\n        return lazyIterators\n            .fromArray(parsers)\n            .map(function(parser) {\n                return parser(input);\n            })\n            .filter(function(result) {\n                return result.isSuccess() || result.isError();\n            })\n            .first() || describeTokenMismatch(input, name);\n    };\n};\n\nexports.then = function(parser, func) {\n    return function(input) {\n        var result = parser(input);\n        if (!result.map) {\n            console.log(result);\n        }\n        return result.map(func);\n    };\n};\n\nexports.sequence = function() {\n    var parsers = Array.prototype.slice.call(arguments, 0);\n    var rule = function(input) {\n        var result = _.foldl(parsers, function(memo, parser) {\n            var result = memo.result;\n            var hasCut = memo.hasCut;\n            if (!result.isSuccess()) {\n                return {result: result, hasCut: hasCut};\n            }\n            var subResult = parser(result.remaining());\n            if (subResult.isCut()) {\n                return {result: result, hasCut: true};\n            } else if (subResult.isSuccess()) {\n                var values;\n                if (parser.isCaptured) {\n                    values = result.value().withValue(parser, subResult.value());\n                } else {\n                    values = result.value();\n                }\n                var remaining = subResult.remaining();\n                var source = input.to(remaining);\n                return {\n                    result: results.success(values, remaining, source),\n                    hasCut: hasCut\n                };\n            } else if (hasCut) {\n                return {result: results.error(subResult.errors(), subResult.remaining()), hasCut: hasCut};\n            } else {\n                return {result: subResult, hasCut: hasCut};\n            }\n        }, {result: results.success(new SequenceValues(), input), hasCut: false}).result;\n        var source = input.to(result.remaining());\n        return result.map(function(values) {\n            return values.withValue(exports.sequence.source, source);\n        });\n    };\n    rule.head = function() {\n        var firstCapture = _.find(parsers, isCapturedRule);\n        return exports.then(\n            rule,\n            exports.sequence.extract(firstCapture)\n        );\n    };\n    rule.map = function(func) {\n        return exports.then(\n            rule,\n            function(result) {\n                return func.apply(this, result.toArray());\n            }\n        );\n    };\n    \n    function isCapturedRule(subRule) {\n        return subRule.isCaptured;\n    }\n    \n    return rule;\n};\n\nvar SequenceValues = function(values, valuesArray) {\n    this._values = values || {};\n    this._valuesArray = valuesArray || [];\n};\n\nSequenceValues.prototype.withValue = function(rule, value) {\n    if (rule.captureName && rule.captureName in this._values) {\n        throw new Error(\"Cannot add second value for capture \\\"\" + rule.captureName + \"\\\"\");\n    } else {\n        var newValues = _.clone(this._values);\n        newValues[rule.captureName] = value;\n        var newValuesArray = this._valuesArray.concat([value]);\n        return new SequenceValues(newValues, newValuesArray);\n    }\n};\n\nSequenceValues.prototype.get = function(rule) {\n    if (rule.captureName in this._values) {\n        return this._values[rule.captureName];\n    } else {\n        throw new Error(\"No value for capture \\\"\" + rule.captureName + \"\\\"\");\n    }\n};\n\nSequenceValues.prototype.toArray = function() {\n    return this._valuesArray;\n};\n\nexports.sequence.capture = function(rule, name) {\n    var captureRule = function() {\n        return rule.apply(this, arguments);\n    };\n    captureRule.captureName = name;\n    captureRule.isCaptured = true;\n    return captureRule;\n};\n\nexports.sequence.extract = function(rule) {\n    return function(result) {\n        return result.get(rule);\n    };\n};\n\nexports.sequence.applyValues = function(func) {\n    // TODO: check captureName doesn't conflict with source or other captures\n    var rules = Array.prototype.slice.call(arguments, 1);\n    return function(result) {\n        var values = rules.map(function(rule) {\n            return result.get(rule);\n        });\n        return func.apply(this, values);\n    };\n};\n\nexports.sequence.source = {\n    captureName: \"☃source☃\"\n};\n\nexports.sequence.cut = function() {\n    return function(input) {\n        return results.cut(input);\n    };\n};\n\nexports.optional = function(rule) {\n    return function(input) {\n        var result = rule(input);\n        if (result.isSuccess()) {\n            return result.map(options.some);\n        } else if (result.isFailure()) {\n            return results.success(options.none, input);\n        } else {\n            return result;\n        }\n    };\n};\n\nexports.zeroOrMoreWithSeparator = function(rule, separator) {\n    return repeatedWithSeparator(rule, separator, false);\n};\n\nexports.oneOrMoreWithSeparator = function(rule, separator) {\n    return repeatedWithSeparator(rule, separator, true);\n};\n\nvar zeroOrMore = exports.zeroOrMore = function(rule) {\n    return function(input) {\n        var values = [];\n        var result;\n        while ((result = rule(input)) && result.isSuccess()) {\n            input = result.remaining();\n            values.push(result.value());\n        }\n        if (result.isError()) {\n            return result;\n        } else {\n            return results.success(values, input);\n        }\n    };\n};\n\nexports.oneOrMore = function(rule) {\n    return exports.oneOrMoreWithSeparator(rule, noOpRule);\n};\n\nfunction noOpRule(input) {\n    return results.success(null, input);\n}\n\nvar repeatedWithSeparator = function(rule, separator, isOneOrMore) {\n    return function(input) {\n        var result = rule(input);\n        if (result.isSuccess()) {\n            var mainRule = exports.sequence.capture(rule, \"main\");\n            var remainingRule = zeroOrMore(exports.then(\n                exports.sequence(separator, mainRule),\n                exports.sequence.extract(mainRule)\n            ));\n            var remainingResult = remainingRule(result.remaining());\n            return results.success([result.value()].concat(remainingResult.value()), remainingResult.remaining());\n        } else if (isOneOrMore || result.isError()) {\n            return result;\n        } else {\n            return results.success([], input);\n        }\n    };\n};\n\nexports.leftAssociative = function(leftRule, rightRule, func) {\n    var rights;\n    if (func) {\n        rights = [{func: func, rule: rightRule}];\n    } else {\n        rights = rightRule;\n    }\n    rights = rights.map(function(right) {\n        return exports.then(right.rule, function(rightValue) {\n            return function(leftValue, source) {\n                return right.func(leftValue, rightValue, source);\n            };\n        });\n    });\n    var repeatedRule = exports.firstOf.apply(null, [\"rules\"].concat(rights));\n    \n    return function(input) {\n        var start = input;\n        var leftResult = leftRule(input);\n        if (!leftResult.isSuccess()) {\n            return leftResult;\n        }\n        var repeatedResult = repeatedRule(leftResult.remaining());\n        while (repeatedResult.isSuccess()) {\n            var remaining = repeatedResult.remaining();\n            var source = start.to(repeatedResult.remaining());\n            var right = repeatedResult.value();\n            leftResult = results.success(\n                right(leftResult.value(), source),\n                remaining,\n                source\n            );\n            repeatedResult = repeatedRule(leftResult.remaining());\n        }\n        if (repeatedResult.isError()) {\n            return repeatedResult;\n        }\n        return leftResult;\n    };\n};\n\nexports.leftAssociative.firstOf = function() {\n    return Array.prototype.slice.call(arguments, 0);\n};\n\nexports.nonConsuming = function(rule) {\n    return function(input) {\n        return rule(input).changeRemaining(input);\n    };\n};\n\nvar describeToken = function(token) {\n    if (token.value) {\n        return token.name + \" \\\"\" + token.value + \"\\\"\";\n    } else {\n        return token.name;\n    }\n};\n\nfunction describeTokenMismatch(input, expected) {\n    var error;\n    var token = input.head();\n    if (token) {\n        error = errors.error({\n            expected: expected,\n            actual: describeToken(token),\n            location: token.source\n        });\n    } else {\n        error = errors.error({\n            expected: expected,\n            actual: \"end of tokens\"\n        });\n    }\n    return results.failure([error], input);\n}\n\n},{\"./errors\":112,\"./lazy-iterators\":113,\"./parsing-results\":115,\"option\":119,\"underscore\":118}],118:[function(require,module,exports){\n//     Underscore.js 1.4.4\n//     http://underscorejs.org\n//     (c) 2009-2013 Jeremy Ashkenas, DocumentCloud Inc.\n//     Underscore may be freely distributed under the MIT license.\n\n(function() {\n\n  // Baseline setup\n  // --------------\n\n  // Establish the root object, `window` in the browser, or `global` on the server.\n  var root = this;\n\n  // Save the previous value of the `_` variable.\n  var previousUnderscore = root._;\n\n  // Establish the object that gets returned to break out of a loop iteration.\n  var breaker = {};\n\n  // Save bytes in the minified (but not gzipped) version:\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n  // Create quick reference variables for speed access to core prototypes.\n  var push             = ArrayProto.push,\n      slice            = ArrayProto.slice,\n      concat           = ArrayProto.concat,\n      toString         = ObjProto.toString,\n      hasOwnProperty   = ObjProto.hasOwnProperty;\n\n  // All **ECMAScript 5** native function implementations that we hope to use\n  // are declared here.\n  var\n    nativeForEach      = ArrayProto.forEach,\n    nativeMap          = ArrayProto.map,\n    nativeReduce       = ArrayProto.reduce,\n    nativeReduceRight  = ArrayProto.reduceRight,\n    nativeFilter       = ArrayProto.filter,\n    nativeEvery        = ArrayProto.every,\n    nativeSome         = ArrayProto.some,\n    nativeIndexOf      = ArrayProto.indexOf,\n    nativeLastIndexOf  = ArrayProto.lastIndexOf,\n    nativeIsArray      = Array.isArray,\n    nativeKeys         = Object.keys,\n    nativeBind         = FuncProto.bind;\n\n  // Create a safe reference to the Underscore object for use below.\n  var _ = function(obj) {\n    if (obj instanceof _) return obj;\n    if (!(this instanceof _)) return new _(obj);\n    this._wrapped = obj;\n  };\n\n  // Export the Underscore object for **Node.js**, with\n  // backwards-compatibility for the old `require()` API. If we're in\n  // the browser, add `_` as a global object via a string identifier,\n  // for Closure Compiler \"advanced\" mode.\n  if (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports) {\n      exports = module.exports = _;\n    }\n    exports._ = _;\n  } else {\n    root._ = _;\n  }\n\n  // Current version.\n  _.VERSION = '1.4.4';\n\n  // Collection Functions\n  // --------------------\n\n  // The cornerstone, an `each` implementation, aka `forEach`.\n  // Handles objects with the built-in `forEach`, arrays, and raw objects.\n  // Delegates to **ECMAScript 5**'s native `forEach` if available.\n  var each = _.each = _.forEach = function(obj, iterator, context) {\n    if (obj == null) return;\n    if (nativeForEach && obj.forEach === nativeForEach) {\n      obj.forEach(iterator, context);\n    } else if (obj.length === +obj.length) {\n      for (var i = 0, l = obj.length; i < l; i++) {\n        if (iterator.call(context, obj[i], i, obj) === breaker) return;\n      }\n    } else {\n      for (var key in obj) {\n        if (_.has(obj, key)) {\n          if (iterator.call(context, obj[key], key, obj) === breaker) return;\n        }\n      }\n    }\n  };\n\n  // Return the results of applying the iterator to each element.\n  // Delegates to **ECMAScript 5**'s native `map` if available.\n  _.map = _.collect = function(obj, iterator, context) {\n    var results = [];\n    if (obj == null) return results;\n    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);\n    each(obj, function(value, index, list) {\n      results[results.length] = iterator.call(context, value, index, list);\n    });\n    return results;\n  };\n\n  var reduceError = 'Reduce of empty array with no initial value';\n\n  // **Reduce** builds up a single result from a list of values, aka `inject`,\n  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.\n  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {\n    var initial = arguments.length > 2;\n    if (obj == null) obj = [];\n    if (nativeReduce && obj.reduce === nativeReduce) {\n      if (context) iterator = _.bind(iterator, context);\n      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);\n    }\n    each(obj, function(value, index, list) {\n      if (!initial) {\n        memo = value;\n        initial = true;\n      } else {\n        memo = iterator.call(context, memo, value, index, list);\n      }\n    });\n    if (!initial) throw new TypeError(reduceError);\n    return memo;\n  };\n\n  // The right-associative version of reduce, also known as `foldr`.\n  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.\n  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {\n    var initial = arguments.length > 2;\n    if (obj == null) obj = [];\n    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {\n      if (context) iterator = _.bind(iterator, context);\n      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);\n    }\n    var length = obj.length;\n    if (length !== +length) {\n      var keys = _.keys(obj);\n      length = keys.length;\n    }\n    each(obj, function(value, index, list) {\n      index = keys ? keys[--length] : --length;\n      if (!initial) {\n        memo = obj[index];\n        initial = true;\n      } else {\n        memo = iterator.call(context, memo, obj[index], index, list);\n      }\n    });\n    if (!initial) throw new TypeError(reduceError);\n    return memo;\n  };\n\n  // Return the first value which passes a truth test. Aliased as `detect`.\n  _.find = _.detect = function(obj, iterator, context) {\n    var result;\n    any(obj, function(value, index, list) {\n      if (iterator.call(context, value, index, list)) {\n        result = value;\n        return true;\n      }\n    });\n    return result;\n  };\n\n  // Return all the elements that pass a truth test.\n  // Delegates to **ECMAScript 5**'s native `filter` if available.\n  // Aliased as `select`.\n  _.filter = _.select = function(obj, iterator, context) {\n    var results = [];\n    if (obj == null) return results;\n    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);\n    each(obj, function(value, index, list) {\n      if (iterator.call(context, value, index, list)) results[results.length] = value;\n    });\n    return results;\n  };\n\n  // Return all the elements for which a truth test fails.\n  _.reject = function(obj, iterator, context) {\n    return _.filter(obj, function(value, index, list) {\n      return !iterator.call(context, value, index, list);\n    }, context);\n  };\n\n  // Determine whether all of the elements match a truth test.\n  // Delegates to **ECMAScript 5**'s native `every` if available.\n  // Aliased as `all`.\n  _.every = _.all = function(obj, iterator, context) {\n    iterator || (iterator = _.identity);\n    var result = true;\n    if (obj == null) return result;\n    if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);\n    each(obj, function(value, index, list) {\n      if (!(result = result && iterator.call(context, value, index, list))) return breaker;\n    });\n    return !!result;\n  };\n\n  // Determine if at least one element in the object matches a truth test.\n  // Delegates to **ECMAScript 5**'s native `some` if available.\n  // Aliased as `any`.\n  var any = _.some = _.any = function(obj, iterator, context) {\n    iterator || (iterator = _.identity);\n    var result = false;\n    if (obj == null) return result;\n    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);\n    each(obj, function(value, index, list) {\n      if (result || (result = iterator.call(context, value, index, list))) return breaker;\n    });\n    return !!result;\n  };\n\n  // Determine if the array or object contains a given value (using `===`).\n  // Aliased as `include`.\n  _.contains = _.include = function(obj, target) {\n    if (obj == null) return false;\n    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;\n    return any(obj, function(value) {\n      return value === target;\n    });\n  };\n\n  // Invoke a method (with arguments) on every item in a collection.\n  _.invoke = function(obj, method) {\n    var args = slice.call(arguments, 2);\n    var isFunc = _.isFunction(method);\n    return _.map(obj, function(value) {\n      return (isFunc ? method : value[method]).apply(value, args);\n    });\n  };\n\n  // Convenience version of a common use case of `map`: fetching a property.\n  _.pluck = function(obj, key) {\n    return _.map(obj, function(value){ return value[key]; });\n  };\n\n  // Convenience version of a common use case of `filter`: selecting only objects\n  // containing specific `key:value` pairs.\n  _.where = function(obj, attrs, first) {\n    if (_.isEmpty(attrs)) return first ? null : [];\n    return _[first ? 'find' : 'filter'](obj, function(value) {\n      for (var key in attrs) {\n        if (attrs[key] !== value[key]) return false;\n      }\n      return true;\n    });\n  };\n\n  // Convenience version of a common use case of `find`: getting the first object\n  // containing specific `key:value` pairs.\n  _.findWhere = function(obj, attrs) {\n    return _.where(obj, attrs, true);\n  };\n\n  // Return the maximum element or (element-based computation).\n  // Can't optimize arrays of integers longer than 65,535 elements.\n  // See: https://bugs.webkit.org/show_bug.cgi?id=80797\n  _.max = function(obj, iterator, context) {\n    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {\n      return Math.max.apply(Math, obj);\n    }\n    if (!iterator && _.isEmpty(obj)) return -Infinity;\n    var result = {computed : -Infinity, value: -Infinity};\n    each(obj, function(value, index, list) {\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\n      computed >= result.computed && (result = {value : value, computed : computed});\n    });\n    return result.value;\n  };\n\n  // Return the minimum element (or element-based computation).\n  _.min = function(obj, iterator, context) {\n    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {\n      return Math.min.apply(Math, obj);\n    }\n    if (!iterator && _.isEmpty(obj)) return Infinity;\n    var result = {computed : Infinity, value: Infinity};\n    each(obj, function(value, index, list) {\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\n      computed < result.computed && (result = {value : value, computed : computed});\n    });\n    return result.value;\n  };\n\n  // Shuffle an array.\n  _.shuffle = function(obj) {\n    var rand;\n    var index = 0;\n    var shuffled = [];\n    each(obj, function(value) {\n      rand = _.random(index++);\n      shuffled[index - 1] = shuffled[rand];\n      shuffled[rand] = value;\n    });\n    return shuffled;\n  };\n\n  // An internal function to generate lookup iterators.\n  var lookupIterator = function(value) {\n    return _.isFunction(value) ? value : function(obj){ return obj[value]; };\n  };\n\n  // Sort the object's values by a criterion produced by an iterator.\n  _.sortBy = function(obj, value, context) {\n    var iterator = lookupIterator(value);\n    return _.pluck(_.map(obj, function(value, index, list) {\n      return {\n        value : value,\n        index : index,\n        criteria : iterator.call(context, value, index, list)\n      };\n    }).sort(function(left, right) {\n      var a = left.criteria;\n      var b = right.criteria;\n      if (a !== b) {\n        if (a > b || a === void 0) return 1;\n        if (a < b || b === void 0) return -1;\n      }\n      return left.index < right.index ? -1 : 1;\n    }), 'value');\n  };\n\n  // An internal function used for aggregate \"group by\" operations.\n  var group = function(obj, value, context, behavior) {\n    var result = {};\n    var iterator = lookupIterator(value || _.identity);\n    each(obj, function(value, index) {\n      var key = iterator.call(context, value, index, obj);\n      behavior(result, key, value);\n    });\n    return result;\n  };\n\n  // Groups the object's values by a criterion. Pass either a string attribute\n  // to group by, or a function that returns the criterion.\n  _.groupBy = function(obj, value, context) {\n    return group(obj, value, context, function(result, key, value) {\n      (_.has(result, key) ? result[key] : (result[key] = [])).push(value);\n    });\n  };\n\n  // Counts instances of an object that group by a certain criterion. Pass\n  // either a string attribute to count by, or a function that returns the\n  // criterion.\n  _.countBy = function(obj, value, context) {\n    return group(obj, value, context, function(result, key) {\n      if (!_.has(result, key)) result[key] = 0;\n      result[key]++;\n    });\n  };\n\n  // Use a comparator function to figure out the smallest index at which\n  // an object should be inserted so as to maintain order. Uses binary search.\n  _.sortedIndex = function(array, obj, iterator, context) {\n    iterator = iterator == null ? _.identity : lookupIterator(iterator);\n    var value = iterator.call(context, obj);\n    var low = 0, high = array.length;\n    while (low < high) {\n      var mid = (low + high) >>> 1;\n      iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;\n    }\n    return low;\n  };\n\n  // Safely convert anything iterable into a real, live array.\n  _.toArray = function(obj) {\n    if (!obj) return [];\n    if (_.isArray(obj)) return slice.call(obj);\n    if (obj.length === +obj.length) return _.map(obj, _.identity);\n    return _.values(obj);\n  };\n\n  // Return the number of elements in an object.\n  _.size = function(obj) {\n    if (obj == null) return 0;\n    return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;\n  };\n\n  // Array Functions\n  // ---------------\n\n  // Get the first element of an array. Passing **n** will return the first N\n  // values in the array. Aliased as `head` and `take`. The **guard** check\n  // allows it to work with `_.map`.\n  _.first = _.head = _.take = function(array, n, guard) {\n    if (array == null) return void 0;\n    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];\n  };\n\n  // Returns everything but the last entry of the array. Especially useful on\n  // the arguments object. Passing **n** will return all the values in\n  // the array, excluding the last N. The **guard** check allows it to work with\n  // `_.map`.\n  _.initial = function(array, n, guard) {\n    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));\n  };\n\n  // Get the last element of an array. Passing **n** will return the last N\n  // values in the array. The **guard** check allows it to work with `_.map`.\n  _.last = function(array, n, guard) {\n    if (array == null) return void 0;\n    if ((n != null) && !guard) {\n      return slice.call(array, Math.max(array.length - n, 0));\n    } else {\n      return array[array.length - 1];\n    }\n  };\n\n  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.\n  // Especially useful on the arguments object. Passing an **n** will return\n  // the rest N values in the array. The **guard**\n  // check allows it to work with `_.map`.\n  _.rest = _.tail = _.drop = function(array, n, guard) {\n    return slice.call(array, (n == null) || guard ? 1 : n);\n  };\n\n  // Trim out all falsy values from an array.\n  _.compact = function(array) {\n    return _.filter(array, _.identity);\n  };\n\n  // Internal implementation of a recursive `flatten` function.\n  var flatten = function(input, shallow, output) {\n    each(input, function(value) {\n      if (_.isArray(value)) {\n        shallow ? push.apply(output, value) : flatten(value, shallow, output);\n      } else {\n        output.push(value);\n      }\n    });\n    return output;\n  };\n\n  // Return a completely flattened version of an array.\n  _.flatten = function(array, shallow) {\n    return flatten(array, shallow, []);\n  };\n\n  // Return a version of the array that does not contain the specified value(s).\n  _.without = function(array) {\n    return _.difference(array, slice.call(arguments, 1));\n  };\n\n  // Produce a duplicate-free version of the array. If the array has already\n  // been sorted, you have the option of using a faster algorithm.\n  // Aliased as `unique`.\n  _.uniq = _.unique = function(array, isSorted, iterator, context) {\n    if (_.isFunction(isSorted)) {\n      context = iterator;\n      iterator = isSorted;\n      isSorted = false;\n    }\n    var initial = iterator ? _.map(array, iterator, context) : array;\n    var results = [];\n    var seen = [];\n    each(initial, function(value, index) {\n      if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {\n        seen.push(value);\n        results.push(array[index]);\n      }\n    });\n    return results;\n  };\n\n  // Produce an array that contains the union: each distinct element from all of\n  // the passed-in arrays.\n  _.union = function() {\n    return _.uniq(concat.apply(ArrayProto, arguments));\n  };\n\n  // Produce an array that contains every item shared between all the\n  // passed-in arrays.\n  _.intersection = function(array) {\n    var rest = slice.call(arguments, 1);\n    return _.filter(_.uniq(array), function(item) {\n      return _.every(rest, function(other) {\n        return _.indexOf(other, item) >= 0;\n      });\n    });\n  };\n\n  // Take the difference between one array and a number of other arrays.\n  // Only the elements present in just the first array will remain.\n  _.difference = function(array) {\n    var rest = concat.apply(ArrayProto, slice.call(arguments, 1));\n    return _.filter(array, function(value){ return !_.contains(rest, value); });\n  };\n\n  // Zip together multiple lists into a single array -- elements that share\n  // an index go together.\n  _.zip = function() {\n    var args = slice.call(arguments);\n    var length = _.max(_.pluck(args, 'length'));\n    var results = new Array(length);\n    for (var i = 0; i < length; i++) {\n      results[i] = _.pluck(args, \"\" + i);\n    }\n    return results;\n  };\n\n  // Converts lists into objects. Pass either a single array of `[key, value]`\n  // pairs, or two parallel arrays of the same length -- one of keys, and one of\n  // the corresponding values.\n  _.object = function(list, values) {\n    if (list == null) return {};\n    var result = {};\n    for (var i = 0, l = list.length; i < l; i++) {\n      if (values) {\n        result[list[i]] = values[i];\n      } else {\n        result[list[i][0]] = list[i][1];\n      }\n    }\n    return result;\n  };\n\n  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),\n  // we need this function. Return the position of the first occurrence of an\n  // item in an array, or -1 if the item is not included in the array.\n  // Delegates to **ECMAScript 5**'s native `indexOf` if available.\n  // If the array is large and already in sort order, pass `true`\n  // for **isSorted** to use binary search.\n  _.indexOf = function(array, item, isSorted) {\n    if (array == null) return -1;\n    var i = 0, l = array.length;\n    if (isSorted) {\n      if (typeof isSorted == 'number') {\n        i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);\n      } else {\n        i = _.sortedIndex(array, item);\n        return array[i] === item ? i : -1;\n      }\n    }\n    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);\n    for (; i < l; i++) if (array[i] === item) return i;\n    return -1;\n  };\n\n  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.\n  _.lastIndexOf = function(array, item, from) {\n    if (array == null) return -1;\n    var hasIndex = from != null;\n    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {\n      return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);\n    }\n    var i = (hasIndex ? from : array.length);\n    while (i--) if (array[i] === item) return i;\n    return -1;\n  };\n\n  // Generate an integer Array containing an arithmetic progression. A port of\n  // the native Python `range()` function. See\n  // [the Python documentation](http://docs.python.org/library/functions.html#range).\n  _.range = function(start, stop, step) {\n    if (arguments.length <= 1) {\n      stop = start || 0;\n      start = 0;\n    }\n    step = arguments[2] || 1;\n\n    var len = Math.max(Math.ceil((stop - start) / step), 0);\n    var idx = 0;\n    var range = new Array(len);\n\n    while(idx < len) {\n      range[idx++] = start;\n      start += step;\n    }\n\n    return range;\n  };\n\n  // Function (ahem) Functions\n  // ------------------\n\n  // Create a function bound to a given object (assigning `this`, and arguments,\n  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n  // available.\n  _.bind = function(func, context) {\n    if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n    var args = slice.call(arguments, 2);\n    return function() {\n      return func.apply(context, args.concat(slice.call(arguments)));\n    };\n  };\n\n  // Partially apply a function by creating a version that has had some of its\n  // arguments pre-filled, without changing its dynamic `this` context.\n  _.partial = function(func) {\n    var args = slice.call(arguments, 1);\n    return function() {\n      return func.apply(this, args.concat(slice.call(arguments)));\n    };\n  };\n\n  // Bind all of an object's methods to that object. Useful for ensuring that\n  // all callbacks defined on an object belong to it.\n  _.bindAll = function(obj) {\n    var funcs = slice.call(arguments, 1);\n    if (funcs.length === 0) funcs = _.functions(obj);\n    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });\n    return obj;\n  };\n\n  // Memoize an expensive function by storing its results.\n  _.memoize = function(func, hasher) {\n    var memo = {};\n    hasher || (hasher = _.identity);\n    return function() {\n      var key = hasher.apply(this, arguments);\n      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));\n    };\n  };\n\n  // Delays a function for the given number of milliseconds, and then calls\n  // it with the arguments supplied.\n  _.delay = function(func, wait) {\n    var args = slice.call(arguments, 2);\n    return setTimeout(function(){ return func.apply(null, args); }, wait);\n  };\n\n  // Defers a function, scheduling it to run after the current call stack has\n  // cleared.\n  _.defer = function(func) {\n    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));\n  };\n\n  // Returns a function, that, when invoked, will only be triggered at most once\n  // during a given window of time.\n  _.throttle = function(func, wait) {\n    var context, args, timeout, result;\n    var previous = 0;\n    var later = function() {\n      previous = new Date;\n      timeout = null;\n      result = func.apply(context, args);\n    };\n    return function() {\n      var now = new Date;\n      var remaining = wait - (now - previous);\n      context = this;\n      args = arguments;\n      if (remaining <= 0) {\n        clearTimeout(timeout);\n        timeout = null;\n        previous = now;\n        result = func.apply(context, args);\n      } else if (!timeout) {\n        timeout = setTimeout(later, remaining);\n      }\n      return result;\n    };\n  };\n\n  // Returns a function, that, as long as it continues to be invoked, will not\n  // be triggered. The function will be called after it stops being called for\n  // N milliseconds. If `immediate` is passed, trigger the function on the\n  // leading edge, instead of the trailing.\n  _.debounce = function(func, wait, immediate) {\n    var timeout, result;\n    return function() {\n      var context = this, args = arguments;\n      var later = function() {\n        timeout = null;\n        if (!immediate) result = func.apply(context, args);\n      };\n      var callNow = immediate && !timeout;\n      clearTimeout(timeout);\n      timeout = setTimeout(later, wait);\n      if (callNow) result = func.apply(context, args);\n      return result;\n    };\n  };\n\n  // Returns a function that will be executed at most one time, no matter how\n  // often you call it. Useful for lazy initialization.\n  _.once = function(func) {\n    var ran = false, memo;\n    return function() {\n      if (ran) return memo;\n      ran = true;\n      memo = func.apply(this, arguments);\n      func = null;\n      return memo;\n    };\n  };\n\n  // Returns the first function passed as an argument to the second,\n  // allowing you to adjust arguments, run code before and after, and\n  // conditionally execute the original function.\n  _.wrap = function(func, wrapper) {\n    return function() {\n      var args = [func];\n      push.apply(args, arguments);\n      return wrapper.apply(this, args);\n    };\n  };\n\n  // Returns a function that is the composition of a list of functions, each\n  // consuming the return value of the function that follows.\n  _.compose = function() {\n    var funcs = arguments;\n    return function() {\n      var args = arguments;\n      for (var i = funcs.length - 1; i >= 0; i--) {\n        args = [funcs[i].apply(this, args)];\n      }\n      return args[0];\n    };\n  };\n\n  // Returns a function that will only be executed after being called N times.\n  _.after = function(times, func) {\n    if (times <= 0) return func();\n    return function() {\n      if (--times < 1) {\n        return func.apply(this, arguments);\n      }\n    };\n  };\n\n  // Object Functions\n  // ----------------\n\n  // Retrieve the names of an object's properties.\n  // Delegates to **ECMAScript 5**'s native `Object.keys`\n  _.keys = nativeKeys || function(obj) {\n    if (obj !== Object(obj)) throw new TypeError('Invalid object');\n    var keys = [];\n    for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;\n    return keys;\n  };\n\n  // Retrieve the values of an object's properties.\n  _.values = function(obj) {\n    var values = [];\n    for (var key in obj) if (_.has(obj, key)) values.push(obj[key]);\n    return values;\n  };\n\n  // Convert an object into a list of `[key, value]` pairs.\n  _.pairs = function(obj) {\n    var pairs = [];\n    for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]);\n    return pairs;\n  };\n\n  // Invert the keys and values of an object. The values must be serializable.\n  _.invert = function(obj) {\n    var result = {};\n    for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key;\n    return result;\n  };\n\n  // Return a sorted list of the function names available on the object.\n  // Aliased as `methods`\n  _.functions = _.methods = function(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (_.isFunction(obj[key])) names.push(key);\n    }\n    return names.sort();\n  };\n\n  // Extend a given object with all the properties in passed-in object(s).\n  _.extend = function(obj) {\n    each(slice.call(arguments, 1), function(source) {\n      if (source) {\n        for (var prop in source) {\n          obj[prop] = source[prop];\n        }\n      }\n    });\n    return obj;\n  };\n\n  // Return a copy of the object only containing the whitelisted properties.\n  _.pick = function(obj) {\n    var copy = {};\n    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));\n    each(keys, function(key) {\n      if (key in obj) copy[key] = obj[key];\n    });\n    return copy;\n  };\n\n   // Return a copy of the object without the blacklisted properties.\n  _.omit = function(obj) {\n    var copy = {};\n    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));\n    for (var key in obj) {\n      if (!_.contains(keys, key)) copy[key] = obj[key];\n    }\n    return copy;\n  };\n\n  // Fill in a given object with default properties.\n  _.defaults = function(obj) {\n    each(slice.call(arguments, 1), function(source) {\n      if (source) {\n        for (var prop in source) {\n          if (obj[prop] == null) obj[prop] = source[prop];\n        }\n      }\n    });\n    return obj;\n  };\n\n  // Create a (shallow-cloned) duplicate of an object.\n  _.clone = function(obj) {\n    if (!_.isObject(obj)) return obj;\n    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n  };\n\n  // Invokes interceptor with the obj, and then returns obj.\n  // The primary purpose of this method is to \"tap into\" a method chain, in\n  // order to perform operations on intermediate results within the chain.\n  _.tap = function(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  };\n\n  // Internal recursive comparison function for `isEqual`.\n  var eq = function(a, b, aStack, bStack) {\n    // Identical objects are equal. `0 === -0`, but they aren't identical.\n    // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.\n    if (a === b) return a !== 0 || 1 / a == 1 / b;\n    // A strict comparison is necessary because `null == undefined`.\n    if (a == null || b == null) return a === b;\n    // Unwrap any wrapped objects.\n    if (a instanceof _) a = a._wrapped;\n    if (b instanceof _) b = b._wrapped;\n    // Compare `[[Class]]` names.\n    var className = toString.call(a);\n    if (className != toString.call(b)) return false;\n    switch (className) {\n      // Strings, numbers, dates, and booleans are compared by value.\n      case '[object String]':\n        // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n        // equivalent to `new String(\"5\")`.\n        return a == String(b);\n      case '[object Number]':\n        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for\n        // other numeric values.\n        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);\n      case '[object Date]':\n      case '[object Boolean]':\n        // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n        // millisecond representations. Note that invalid dates with millisecond representations\n        // of `NaN` are not equivalent.\n        return +a == +b;\n      // RegExps are compared by their source patterns and flags.\n      case '[object RegExp]':\n        return a.source == b.source &&\n               a.global == b.global &&\n               a.multiline == b.multiline &&\n               a.ignoreCase == b.ignoreCase;\n    }\n    if (typeof a != 'object' || typeof b != 'object') return false;\n    // Assume equality for cyclic structures. The algorithm for detecting cyclic\n    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n    var length = aStack.length;\n    while (length--) {\n      // Linear search. Performance is inversely proportional to the number of\n      // unique nested structures.\n      if (aStack[length] == a) return bStack[length] == b;\n    }\n    // Add the first object to the stack of traversed objects.\n    aStack.push(a);\n    bStack.push(b);\n    var size = 0, result = true;\n    // Recursively compare objects and arrays.\n    if (className == '[object Array]') {\n      // Compare array lengths to determine if a deep comparison is necessary.\n      size = a.length;\n      result = size == b.length;\n      if (result) {\n        // Deep compare the contents, ignoring non-numeric properties.\n        while (size--) {\n          if (!(result = eq(a[size], b[size], aStack, bStack))) break;\n        }\n      }\n    } else {\n      // Objects with different constructors are not equivalent, but `Object`s\n      // from different frames are.\n      var aCtor = a.constructor, bCtor = b.constructor;\n      if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&\n                               _.isFunction(bCtor) && (bCtor instanceof bCtor))) {\n        return false;\n      }\n      // Deep compare objects.\n      for (var key in a) {\n        if (_.has(a, key)) {\n          // Count the expected number of properties.\n          size++;\n          // Deep compare each member.\n          if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;\n        }\n      }\n      // Ensure that both objects contain the same number of properties.\n      if (result) {\n        for (key in b) {\n          if (_.has(b, key) && !(size--)) break;\n        }\n        result = !size;\n      }\n    }\n    // Remove the first object from the stack of traversed objects.\n    aStack.pop();\n    bStack.pop();\n    return result;\n  };\n\n  // Perform a deep comparison to check if two objects are equal.\n  _.isEqual = function(a, b) {\n    return eq(a, b, [], []);\n  };\n\n  // Is a given array, string, or object empty?\n  // An \"empty\" object has no enumerable own-properties.\n  _.isEmpty = function(obj) {\n    if (obj == null) return true;\n    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;\n    for (var key in obj) if (_.has(obj, key)) return false;\n    return true;\n  };\n\n  // Is a given value a DOM element?\n  _.isElement = function(obj) {\n    return !!(obj && obj.nodeType === 1);\n  };\n\n  // Is a given value an array?\n  // Delegates to ECMA5's native Array.isArray\n  _.isArray = nativeIsArray || function(obj) {\n    return toString.call(obj) == '[object Array]';\n  };\n\n  // Is a given variable an object?\n  _.isObject = function(obj) {\n    return obj === Object(obj);\n  };\n\n  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.\n  each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {\n    _['is' + name] = function(obj) {\n      return toString.call(obj) == '[object ' + name + ']';\n    };\n  });\n\n  // Define a fallback version of the method in browsers (ahem, IE), where\n  // there isn't any inspectable \"Arguments\" type.\n  if (!_.isArguments(arguments)) {\n    _.isArguments = function(obj) {\n      return !!(obj && _.has(obj, 'callee'));\n    };\n  }\n\n  // Optimize `isFunction` if appropriate.\n  if (typeof (/./) !== 'function') {\n    _.isFunction = function(obj) {\n      return typeof obj === 'function';\n    };\n  }\n\n  // Is a given object a finite number?\n  _.isFinite = function(obj) {\n    return isFinite(obj) && !isNaN(parseFloat(obj));\n  };\n\n  // Is the given value `NaN`? (NaN is the only number which does not equal itself).\n  _.isNaN = function(obj) {\n    return _.isNumber(obj) && obj != +obj;\n  };\n\n  // Is a given value a boolean?\n  _.isBoolean = function(obj) {\n    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';\n  };\n\n  // Is a given value equal to null?\n  _.isNull = function(obj) {\n    return obj === null;\n  };\n\n  // Is a given variable undefined?\n  _.isUndefined = function(obj) {\n    return obj === void 0;\n  };\n\n  // Shortcut function for checking if an object has a given property directly\n  // on itself (in other words, not on a prototype).\n  _.has = function(obj, key) {\n    return hasOwnProperty.call(obj, key);\n  };\n\n  // Utility Functions\n  // -----------------\n\n  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\n  // previous owner. Returns a reference to the Underscore object.\n  _.noConflict = function() {\n    root._ = previousUnderscore;\n    return this;\n  };\n\n  // Keep the identity function around for default iterators.\n  _.identity = function(value) {\n    return value;\n  };\n\n  // Run a function **n** times.\n  _.times = function(n, iterator, context) {\n    var accum = Array(n);\n    for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);\n    return accum;\n  };\n\n  // Return a random integer between min and max (inclusive).\n  _.random = function(min, max) {\n    if (max == null) {\n      max = min;\n      min = 0;\n    }\n    return min + Math.floor(Math.random() * (max - min + 1));\n  };\n\n  // List of HTML entities for escaping.\n  var entityMap = {\n    escape: {\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      \"'\": '&#x27;',\n      '/': '&#x2F;'\n    }\n  };\n  entityMap.unescape = _.invert(entityMap.escape);\n\n  // Regexes containing the keys and values listed immediately above.\n  var entityRegexes = {\n    escape:   new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),\n    unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')\n  };\n\n  // Functions for escaping and unescaping strings to/from HTML interpolation.\n  _.each(['escape', 'unescape'], function(method) {\n    _[method] = function(string) {\n      if (string == null) return '';\n      return ('' + string).replace(entityRegexes[method], function(match) {\n        return entityMap[method][match];\n      });\n    };\n  });\n\n  // If the value of the named property is a function then invoke it;\n  // otherwise, return it.\n  _.result = function(object, property) {\n    if (object == null) return null;\n    var value = object[property];\n    return _.isFunction(value) ? value.call(object) : value;\n  };\n\n  // Add your own custom functions to the Underscore object.\n  _.mixin = function(obj) {\n    each(_.functions(obj), function(name){\n      var func = _[name] = obj[name];\n      _.prototype[name] = function() {\n        var args = [this._wrapped];\n        push.apply(args, arguments);\n        return result.call(this, func.apply(_, args));\n      };\n    });\n  };\n\n  // Generate a unique integer id (unique within the entire client session).\n  // Useful for temporary DOM ids.\n  var idCounter = 0;\n  _.uniqueId = function(prefix) {\n    var id = ++idCounter + '';\n    return prefix ? prefix + id : id;\n  };\n\n  // By default, Underscore uses ERB-style template delimiters, change the\n  // following template settings to use alternative delimiters.\n  _.templateSettings = {\n    evaluate    : /<%([\\s\\S]+?)%>/g,\n    interpolate : /<%=([\\s\\S]+?)%>/g,\n    escape      : /<%-([\\s\\S]+?)%>/g\n  };\n\n  // When customizing `templateSettings`, if you don't want to define an\n  // interpolation, evaluation or escaping regex, we need one that is\n  // guaranteed not to match.\n  var noMatch = /(.)^/;\n\n  // Certain characters need to be escaped so that they can be put into a\n  // string literal.\n  var escapes = {\n    \"'\":      \"'\",\n    '\\\\':     '\\\\',\n    '\\r':     'r',\n    '\\n':     'n',\n    '\\t':     't',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  var escaper = /\\\\|'|\\r|\\n|\\t|\\u2028|\\u2029/g;\n\n  // JavaScript micro-templating, similar to John Resig's implementation.\n  // Underscore templating handles arbitrary delimiters, preserves whitespace,\n  // and correctly escapes quotes within interpolated code.\n  _.template = function(text, data, settings) {\n    var render;\n    settings = _.defaults({}, settings, _.templateSettings);\n\n    // Combine delimiters into one regular expression via alternation.\n    var matcher = new RegExp([\n      (settings.escape || noMatch).source,\n      (settings.interpolate || noMatch).source,\n      (settings.evaluate || noMatch).source\n    ].join('|') + '|$', 'g');\n\n    // Compile the template source, escaping string literals appropriately.\n    var index = 0;\n    var source = \"__p+='\";\n    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n      source += text.slice(index, offset)\n        .replace(escaper, function(match) { return '\\\\' + escapes[match]; });\n\n      if (escape) {\n        source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n      }\n      if (interpolate) {\n        source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n      }\n      if (evaluate) {\n        source += \"';\\n\" + evaluate + \"\\n__p+='\";\n      }\n      index = offset + match.length;\n      return match;\n    });\n    source += \"';\\n\";\n\n    // If a variable is not specified, place data values in local scope.\n    if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n    source = \"var __t,__p='',__j=Array.prototype.join,\" +\n      \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n      source + \"return __p;\\n\";\n\n    try {\n      render = new Function(settings.variable || 'obj', '_', source);\n    } catch (e) {\n      e.source = source;\n      throw e;\n    }\n\n    if (data) return render(data, _);\n    var template = function(data) {\n      return render.call(this, data, _);\n    };\n\n    // Provide the compiled function source as a convenience for precompilation.\n    template.source = 'function(' + (settings.variable || 'obj') + '){\\n' + source + '}';\n\n    return template;\n  };\n\n  // Add a \"chain\" function, which will delegate to the wrapper.\n  _.chain = function(obj) {\n    return _(obj).chain();\n  };\n\n  // OOP\n  // ---------------\n  // If Underscore is called as a function, it returns a wrapped object that\n  // can be used OO-style. This wrapper holds altered versions of all the\n  // underscore functions. Wrapped objects may be chained.\n\n  // Helper function to continue chaining intermediate results.\n  var result = function(obj) {\n    return this._chain ? _(obj).chain() : obj;\n  };\n\n  // Add all of the Underscore functions to the wrapper object.\n  _.mixin(_);\n\n  // Add all mutator Array functions to the wrapper.\n  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      var obj = this._wrapped;\n      method.apply(obj, arguments);\n      if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];\n      return result.call(this, obj);\n    };\n  });\n\n  // Add all accessor Array functions to the wrapper.\n  each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      return result.call(this, method.apply(this._wrapped, arguments));\n    };\n  });\n\n  _.extend(_.prototype, {\n\n    // Start chaining a wrapped Underscore object.\n    chain: function() {\n      this._chain = true;\n      return this;\n    },\n\n    // Extracts the result from a wrapped and chained object.\n    value: function() {\n      return this._wrapped;\n    }\n\n  });\n\n}).call(this);\n\n},{}],119:[function(require,module,exports){\nexports.none = Object.create({\n    value: function() {\n        throw new Error('Called value on none');\n    },\n    isNone: function() {\n        return true;\n    },\n    isSome: function() {\n        return false;\n    },\n    map: function() {\n        return exports.none;\n    },\n    flatMap: function() {\n        return exports.none;\n    },\n    toArray: function() {\n        return [];\n    },\n    orElse: callOrReturn,\n    valueOrElse: callOrReturn\n});\n\nfunction callOrReturn(value) {\n    if (typeof(value) == \"function\") {\n        return value();\n    } else {\n        return value;\n    }\n}\n\nexports.some = function(value) {\n    return new Some(value);\n};\n\nvar Some = function(value) {\n    this._value = value;\n};\n\nSome.prototype.value = function() {\n    return this._value;\n};\n\nSome.prototype.isNone = function() {\n    return false;\n};\n\nSome.prototype.isSome = function() {\n    return true;\n};\n\nSome.prototype.map = function(func) {\n    return new Some(func(this._value));\n};\n\nSome.prototype.flatMap = function(func) {\n    return func(this._value);\n};\n\nSome.prototype.toArray = function() {\n    return [this._value];\n};\n\nSome.prototype.orElse = function(value) {\n    return this;\n};\n\nSome.prototype.valueOrElse = function(value) {\n    return this._value;\n};\n\nexports.isOption = function(value) {\n    return value === exports.none || value instanceof Some;\n};\n\nexports.fromNullable = function(value) {\n    if (value == null) {\n        return exports.none;\n    }\n    return new Some(value);\n}\n\n},{}],120:[function(require,module,exports){\n// Top level file is just a mixin of submodules & constants\n'use strict';\n\nvar assign    = require('./lib/utils/common').assign;\n\nvar deflate   = require('./lib/deflate');\nvar inflate   = require('./lib/inflate');\nvar constants = require('./lib/zlib/constants');\n\nvar pako = {};\n\nassign(pako, deflate, inflate, constants);\n\nmodule.exports = pako;\n\n},{\"./lib/deflate\":121,\"./lib/inflate\":122,\"./lib/utils/common\":123,\"./lib/zlib/constants\":126}],121:[function(require,module,exports){\n'use strict';\n\n\nvar zlib_deflate = require('./zlib/deflate');\nvar utils        = require('./utils/common');\nvar strings      = require('./utils/strings');\nvar msg          = require('./zlib/messages');\nvar ZStream      = require('./zlib/zstream');\n\nvar toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nvar Z_NO_FLUSH      = 0;\nvar Z_FINISH        = 4;\n\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\nvar Z_SYNC_FLUSH    = 2;\n\nvar Z_DEFAULT_COMPRESSION = -1;\n\nvar Z_DEFAULT_STRATEGY    = 0;\n\nvar Z_DEFLATED  = 8;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overriden.\n **/\n\n/**\n * Deflate.result -> Uint8Array|Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param)  or if you\n * push a chunk with explicit flush (call [[Deflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n *    (each char code [0..255])\n * - `header` (Object) - custom header for gzip\n *   - `text` (Boolean) - true if compressed data believed to be text\n *   - `time` (Number) - modification time, unix timestamp\n *   - `os` (Number) - operation system code\n *   - `extra` (Array) - array of bytes with extra data (max 65536)\n *   - `name` (String) - file name (binary string)\n *   - `comment` (String) - comment (binary string)\n *   - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true);  // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate(options) {\n  if (!(this instanceof Deflate)) return new Deflate(options);\n\n  this.options = utils.assign({\n    level: Z_DEFAULT_COMPRESSION,\n    method: Z_DEFLATED,\n    chunkSize: 16384,\n    windowBits: 15,\n    memLevel: 8,\n    strategy: Z_DEFAULT_STRATEGY,\n    to: ''\n  }, options || {});\n\n  var opt = this.options;\n\n  if (opt.raw && (opt.windowBits > 0)) {\n    opt.windowBits = -opt.windowBits;\n  }\n\n  else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n    opt.windowBits += 16;\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm = new ZStream();\n  this.strm.avail_out = 0;\n\n  var status = zlib_deflate.deflateInit2(\n    this.strm,\n    opt.level,\n    opt.method,\n    opt.windowBits,\n    opt.memLevel,\n    opt.strategy\n  );\n\n  if (status !== Z_OK) {\n    throw new Error(msg[status]);\n  }\n\n  if (opt.header) {\n    zlib_deflate.deflateSetHeader(this.strm, opt.header);\n  }\n\n  if (opt.dictionary) {\n    var dict;\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      // If we need to compress text, change encoding to utf8.\n      dict = strings.string2buf(opt.dictionary);\n    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n      dict = new Uint8Array(opt.dictionary);\n    } else {\n      dict = opt.dictionary;\n    }\n\n    status = zlib_deflate.deflateSetDictionary(this.strm, dict);\n\n    if (status !== Z_OK) {\n      throw new Error(msg[status]);\n    }\n\n    this._dict_set = true;\n  }\n}\n\n/**\n * Deflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be\n *   converted to utf8 byte sequence.\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the compression context.\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * array format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nDeflate.prototype.push = function (data, mode) {\n  var strm = this.strm;\n  var chunkSize = this.options.chunkSize;\n  var status, _mode;\n\n  if (this.ended) { return false; }\n\n  _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // If we need to compress text, change encoding to utf8.\n    strm.input = strings.string2buf(data);\n  } else if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  do {\n    if (strm.avail_out === 0) {\n      strm.output = new utils.Buf8(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n    status = zlib_deflate.deflate(strm, _mode);    /* no bad return value */\n\n    if (status !== Z_STREAM_END && status !== Z_OK) {\n      this.onEnd(status);\n      this.ended = true;\n      return false;\n    }\n    if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) {\n      if (this.options.to === 'string') {\n        this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));\n      } else {\n        this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n      }\n    }\n  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);\n\n  // Finalize on the last chunk.\n  if (_mode === Z_FINISH) {\n    status = zlib_deflate.deflateEnd(this.strm);\n    this.onEnd(status);\n    this.ended = true;\n    return status === Z_OK;\n  }\n\n  // callback interim results if Z_SYNC_FLUSH.\n  if (_mode === Z_SYNC_FLUSH) {\n    this.onEnd(Z_OK);\n    strm.avail_out = 0;\n    return true;\n  }\n\n  return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): ouput data. Type of array depends\n *   on js engine support. When string output requested, each chunk\n *   will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === Z_OK) {\n    if (this.options.to === 'string') {\n      this.result = this.chunks.join('');\n    } else {\n      this.result = utils.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n *    (each char code [0..255])\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , data = Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate(input, options) {\n  var deflator = new Deflate(options);\n\n  deflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (deflator.err) { throw deflator.msg; }\n\n  return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw(input, options) {\n  options = options || {};\n  options.raw = true;\n  return deflate(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip(input, options) {\n  options = options || {};\n  options.gzip = true;\n  return deflate(input, options);\n}\n\n\nexports.Deflate = Deflate;\nexports.deflate = deflate;\nexports.deflateRaw = deflateRaw;\nexports.gzip = gzip;\n\n},{\"./utils/common\":123,\"./utils/strings\":124,\"./zlib/deflate\":128,\"./zlib/messages\":133,\"./zlib/zstream\":135}],122:[function(require,module,exports){\n'use strict';\n\n\nvar zlib_inflate = require('./zlib/inflate');\nvar utils        = require('./utils/common');\nvar strings      = require('./utils/strings');\nvar c            = require('./zlib/constants');\nvar msg          = require('./zlib/messages');\nvar ZStream      = require('./zlib/zstream');\nvar GZheader     = require('./zlib/gzheader');\n\nvar toString = Object.prototype.toString;\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overriden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you\n * push a chunk with explicit flush (call [[Inflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true);  // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate(options) {\n  if (!(this instanceof Inflate)) return new Inflate(options);\n\n  this.options = utils.assign({\n    chunkSize: 16384,\n    windowBits: 0,\n    to: ''\n  }, options || {});\n\n  var opt = this.options;\n\n  // Force window size for `raw` data, if not set directly,\n  // because we have no header for autodetect.\n  if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n    opt.windowBits = -opt.windowBits;\n    if (opt.windowBits === 0) { opt.windowBits = -15; }\n  }\n\n  // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n  if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n      !(options && options.windowBits)) {\n    opt.windowBits += 32;\n  }\n\n  // Gzip header has no info about windows size, we can do autodetect only\n  // for deflate. So, if window size not set, force it to max when gzip possible\n  if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n    // bit 3 (16) -> gzipped data\n    // bit 4 (32) -> autodetect gzip/deflate\n    if ((opt.windowBits & 15) === 0) {\n      opt.windowBits |= 15;\n    }\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm   = new ZStream();\n  this.strm.avail_out = 0;\n\n  var status  = zlib_inflate.inflateInit2(\n    this.strm,\n    opt.windowBits\n  );\n\n  if (status !== c.Z_OK) {\n    throw new Error(msg[status]);\n  }\n\n  this.header = new GZheader();\n\n  zlib_inflate.inflateGetHeader(this.strm, this.header);\n}\n\n/**\n * Inflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the decompression context.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nInflate.prototype.push = function (data, mode) {\n  var strm = this.strm;\n  var chunkSize = this.options.chunkSize;\n  var dictionary = this.options.dictionary;\n  var status, _mode;\n  var next_out_utf8, tail, utf8str;\n  var dict;\n\n  // Flag to properly process Z_BUF_ERROR on testing inflate call\n  // when we check that all output data was flushed.\n  var allowBufError = false;\n\n  if (this.ended) { return false; }\n  _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // Only binary strings can be decompressed on practice\n    strm.input = strings.binstring2buf(data);\n  } else if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  do {\n    if (strm.avail_out === 0) {\n      strm.output = new utils.Buf8(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n\n    status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);    /* no bad return value */\n\n    if (status === c.Z_NEED_DICT && dictionary) {\n      // Convert data if needed\n      if (typeof dictionary === 'string') {\n        dict = strings.string2buf(dictionary);\n      } else if (toString.call(dictionary) === '[object ArrayBuffer]') {\n        dict = new Uint8Array(dictionary);\n      } else {\n        dict = dictionary;\n      }\n\n      status = zlib_inflate.inflateSetDictionary(this.strm, dict);\n\n    }\n\n    if (status === c.Z_BUF_ERROR && allowBufError === true) {\n      status = c.Z_OK;\n      allowBufError = false;\n    }\n\n    if (status !== c.Z_STREAM_END && status !== c.Z_OK) {\n      this.onEnd(status);\n      this.ended = true;\n      return false;\n    }\n\n    if (strm.next_out) {\n      if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) {\n\n        if (this.options.to === 'string') {\n\n          next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n          tail = strm.next_out - next_out_utf8;\n          utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n          // move tail\n          strm.next_out = tail;\n          strm.avail_out = chunkSize - tail;\n          if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }\n\n          this.onData(utf8str);\n\n        } else {\n          this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n        }\n      }\n    }\n\n    // When no more input data, we should check that internal inflate buffers\n    // are flushed. The only way to do it when avail_out = 0 - run one more\n    // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.\n    // Here we set flag to process this error properly.\n    //\n    // NOTE. Deflate does not return error in this case and does not needs such\n    // logic.\n    if (strm.avail_in === 0 && strm.avail_out === 0) {\n      allowBufError = true;\n    }\n\n  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END);\n\n  if (status === c.Z_STREAM_END) {\n    _mode = c.Z_FINISH;\n  }\n\n  // Finalize on the last chunk.\n  if (_mode === c.Z_FINISH) {\n    status = zlib_inflate.inflateEnd(this.strm);\n    this.onEnd(status);\n    this.ended = true;\n    return status === c.Z_OK;\n  }\n\n  // callback interim results if Z_SYNC_FLUSH.\n  if (_mode === c.Z_SYNC_FLUSH) {\n    this.onEnd(c.Z_OK);\n    strm.avail_out = 0;\n    return true;\n  }\n\n  return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): ouput data. Type of array depends\n *   on js engine support. When string output requested, each chunk\n *   will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === c.Z_OK) {\n    if (this.options.to === 'string') {\n      // Glue & convert here, until we teach pako to send\n      // utf8 alligned strings to onData\n      this.result = this.chunks.join('');\n    } else {\n      this.result = utils.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , input = pako.deflate([1,2,3,4,5,6,7,8,9])\n *   , output;\n *\n * try {\n *   output = pako.inflate(input);\n * } catch (err)\n *   console.log(err);\n * }\n * ```\n **/\nfunction inflate(input, options) {\n  var inflator = new Inflate(options);\n\n  inflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (inflator.err) { throw inflator.msg; }\n\n  return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw(input, options) {\n  options = options || {};\n  options.raw = true;\n  return inflate(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nexports.Inflate = Inflate;\nexports.inflate = inflate;\nexports.inflateRaw = inflateRaw;\nexports.ungzip  = inflate;\n\n},{\"./utils/common\":123,\"./utils/strings\":124,\"./zlib/constants\":126,\"./zlib/gzheader\":129,\"./zlib/inflate\":131,\"./zlib/messages\":133,\"./zlib/zstream\":135}],123:[function(require,module,exports){\n'use strict';\n\n\nvar TYPED_OK =  (typeof Uint8Array !== 'undefined') &&\n                (typeof Uint16Array !== 'undefined') &&\n                (typeof Int32Array !== 'undefined');\n\n\nexports.assign = function (obj /*from1, from2, from3, ...*/) {\n  var sources = Array.prototype.slice.call(arguments, 1);\n  while (sources.length) {\n    var source = sources.shift();\n    if (!source) { continue; }\n\n    if (typeof source !== 'object') {\n      throw new TypeError(source + 'must be non-object');\n    }\n\n    for (var p in source) {\n      if (source.hasOwnProperty(p)) {\n        obj[p] = source[p];\n      }\n    }\n  }\n\n  return obj;\n};\n\n\n// reduce buffer size, avoiding mem copy\nexports.shrinkBuf = function (buf, size) {\n  if (buf.length === size) { return buf; }\n  if (buf.subarray) { return buf.subarray(0, size); }\n  buf.length = size;\n  return buf;\n};\n\n\nvar fnTyped = {\n  arraySet: function (dest, src, src_offs, len, dest_offs) {\n    if (src.subarray && dest.subarray) {\n      dest.set(src.subarray(src_offs, src_offs + len), dest_offs);\n      return;\n    }\n    // Fallback to ordinary array\n    for (var i = 0; i < len; i++) {\n      dest[dest_offs + i] = src[src_offs + i];\n    }\n  },\n  // Join array of chunks to single array.\n  flattenChunks: function (chunks) {\n    var i, l, len, pos, chunk, result;\n\n    // calculate data length\n    len = 0;\n    for (i = 0, l = chunks.length; i < l; i++) {\n      len += chunks[i].length;\n    }\n\n    // join chunks\n    result = new Uint8Array(len);\n    pos = 0;\n    for (i = 0, l = chunks.length; i < l; i++) {\n      chunk = chunks[i];\n      result.set(chunk, pos);\n      pos += chunk.length;\n    }\n\n    return result;\n  }\n};\n\nvar fnUntyped = {\n  arraySet: function (dest, src, src_offs, len, dest_offs) {\n    for (var i = 0; i < len; i++) {\n      dest[dest_offs + i] = src[src_offs + i];\n    }\n  },\n  // Join array of chunks to single array.\n  flattenChunks: function (chunks) {\n    return [].concat.apply([], chunks);\n  }\n};\n\n\n// Enable/Disable typed arrays use, for testing\n//\nexports.setTyped = function (on) {\n  if (on) {\n    exports.Buf8  = Uint8Array;\n    exports.Buf16 = Uint16Array;\n    exports.Buf32 = Int32Array;\n    exports.assign(exports, fnTyped);\n  } else {\n    exports.Buf8  = Array;\n    exports.Buf16 = Array;\n    exports.Buf32 = Array;\n    exports.assign(exports, fnUntyped);\n  }\n};\n\nexports.setTyped(TYPED_OK);\n\n},{}],124:[function(require,module,exports){\n// String encode/decode helpers\n'use strict';\n\n\nvar utils = require('./common');\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safary\n//\nvar STR_APPLY_OK = true;\nvar STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; }\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nvar _utf8len = new utils.Buf8(256);\nfor (var q = 0; q < 256; q++) {\n  _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nexports.string2buf = function (str) {\n  var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n  // count binary size\n  for (m_pos = 0; m_pos < str_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n  }\n\n  // allocate buffer\n  buf = new utils.Buf8(buf_len);\n\n  // convert\n  for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    if (c < 0x80) {\n      /* one byte */\n      buf[i++] = c;\n    } else if (c < 0x800) {\n      /* two bytes */\n      buf[i++] = 0xC0 | (c >>> 6);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else if (c < 0x10000) {\n      /* three bytes */\n      buf[i++] = 0xE0 | (c >>> 12);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else {\n      /* four bytes */\n      buf[i++] = 0xf0 | (c >>> 18);\n      buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    }\n  }\n\n  return buf;\n};\n\n// Helper (used in 2 places)\nfunction buf2binstring(buf, len) {\n  // use fallback for big arrays to avoid stack overflow\n  if (len < 65537) {\n    if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {\n      return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));\n    }\n  }\n\n  var result = '';\n  for (var i = 0; i < len; i++) {\n    result += String.fromCharCode(buf[i]);\n  }\n  return result;\n}\n\n\n// Convert byte array to binary string\nexports.buf2binstring = function (buf) {\n  return buf2binstring(buf, buf.length);\n};\n\n\n// Convert binary string (typed, when possible)\nexports.binstring2buf = function (str) {\n  var buf = new utils.Buf8(str.length);\n  for (var i = 0, len = buf.length; i < len; i++) {\n    buf[i] = str.charCodeAt(i);\n  }\n  return buf;\n};\n\n\n// convert array to string\nexports.buf2string = function (buf, max) {\n  var i, out, c, c_len;\n  var len = max || buf.length;\n\n  // Reserve max possible length (2 words per char)\n  // NB: by unknown reasons, Array is significantly faster for\n  //     String.fromCharCode.apply than Uint16Array.\n  var utf16buf = new Array(len * 2);\n\n  for (out = 0, i = 0; i < len;) {\n    c = buf[i++];\n    // quick process ascii\n    if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n    c_len = _utf8len[c];\n    // skip 5 & 6 byte codes\n    if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n    // apply mask on first byte\n    c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n    // join the rest\n    while (c_len > 1 && i < len) {\n      c = (c << 6) | (buf[i++] & 0x3f);\n      c_len--;\n    }\n\n    // terminated by end of string?\n    if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n    if (c < 0x10000) {\n      utf16buf[out++] = c;\n    } else {\n      c -= 0x10000;\n      utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n      utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n    }\n  }\n\n  return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max   - length limit (mandatory);\nexports.utf8border = function (buf, max) {\n  var pos;\n\n  max = max || buf.length;\n  if (max > buf.length) { max = buf.length; }\n\n  // go back from last position, until start of sequence found\n  pos = max - 1;\n  while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n  // Fuckup - very small and broken sequence,\n  // return max, because we should return something anyway.\n  if (pos < 0) { return max; }\n\n  // If we came to start of buffer - that means vuffer is too small,\n  // return max too.\n  if (pos === 0) { return max; }\n\n  return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\n},{\"./common\":123}],125:[function(require,module,exports){\n'use strict';\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It doesn't worth to make additional optimizationa as in original.\n// Small size is preferable.\n\nfunction adler32(adler, buf, len, pos) {\n  var s1 = (adler & 0xffff) |0,\n      s2 = ((adler >>> 16) & 0xffff) |0,\n      n = 0;\n\n  while (len !== 0) {\n    // Set limit ~ twice less than 5552, to keep\n    // s2 in 31-bits, because we force signed ints.\n    // in other case %= will fail.\n    n = len > 2000 ? 2000 : len;\n    len -= n;\n\n    do {\n      s1 = (s1 + buf[pos++]) |0;\n      s2 = (s2 + s1) |0;\n    } while (--n);\n\n    s1 %= 65521;\n    s2 %= 65521;\n  }\n\n  return (s1 | (s2 << 16)) |0;\n}\n\n\nmodule.exports = adler32;\n\n},{}],126:[function(require,module,exports){\n'use strict';\n\n\nmodule.exports = {\n\n  /* Allowed flush values; see deflate() and inflate() below for details */\n  Z_NO_FLUSH:         0,\n  Z_PARTIAL_FLUSH:    1,\n  Z_SYNC_FLUSH:       2,\n  Z_FULL_FLUSH:       3,\n  Z_FINISH:           4,\n  Z_BLOCK:            5,\n  Z_TREES:            6,\n\n  /* Return codes for the compression/decompression functions. Negative values\n  * are errors, positive values are used for special but normal events.\n  */\n  Z_OK:               0,\n  Z_STREAM_END:       1,\n  Z_NEED_DICT:        2,\n  Z_ERRNO:           -1,\n  Z_STREAM_ERROR:    -2,\n  Z_DATA_ERROR:      -3,\n  //Z_MEM_ERROR:     -4,\n  Z_BUF_ERROR:       -5,\n  //Z_VERSION_ERROR: -6,\n\n  /* compression levels */\n  Z_NO_COMPRESSION:         0,\n  Z_BEST_SPEED:             1,\n  Z_BEST_COMPRESSION:       9,\n  Z_DEFAULT_COMPRESSION:   -1,\n\n\n  Z_FILTERED:               1,\n  Z_HUFFMAN_ONLY:           2,\n  Z_RLE:                    3,\n  Z_FIXED:                  4,\n  Z_DEFAULT_STRATEGY:       0,\n\n  /* Possible values of the data_type field (though see inflate()) */\n  Z_BINARY:                 0,\n  Z_TEXT:                   1,\n  //Z_ASCII:                1, // = Z_TEXT (deprecated)\n  Z_UNKNOWN:                2,\n\n  /* The deflate compression method */\n  Z_DEFLATED:               8\n  //Z_NULL:                 null // Use -1 or null inline, depending on var type\n};\n\n},{}],127:[function(require,module,exports){\n'use strict';\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n\n// Use ordinary array, since untyped makes no boost here\nfunction makeTable() {\n  var c, table = [];\n\n  for (var n = 0; n < 256; n++) {\n    c = n;\n    for (var k = 0; k < 8; k++) {\n      c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n    }\n    table[n] = c;\n  }\n\n  return table;\n}\n\n// Create table on load. Just 255 signed longs. Not a problem.\nvar crcTable = makeTable();\n\n\nfunction crc32(crc, buf, len, pos) {\n  var t = crcTable,\n      end = pos + len;\n\n  crc ^= -1;\n\n  for (var i = pos; i < end; i++) {\n    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n  }\n\n  return (crc ^ (-1)); // >>> 0;\n}\n\n\nmodule.exports = crc32;\n\n},{}],128:[function(require,module,exports){\n'use strict';\n\nvar utils   = require('../utils/common');\nvar trees   = require('./trees');\nvar adler32 = require('./adler32');\nvar crc32   = require('./crc32');\nvar msg     = require('./messages');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\nvar Z_NO_FLUSH      = 0;\nvar Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH    = 2;\nvar Z_FULL_FLUSH    = 3;\nvar Z_FINISH        = 4;\nvar Z_BLOCK         = 5;\n//var Z_TREES         = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\n//var Z_NEED_DICT     = 2;\n//var Z_ERRNO         = -1;\nvar Z_STREAM_ERROR  = -2;\nvar Z_DATA_ERROR    = -3;\n//var Z_MEM_ERROR     = -4;\nvar Z_BUF_ERROR     = -5;\n//var Z_VERSION_ERROR = -6;\n\n\n/* compression levels */\n//var Z_NO_COMPRESSION      = 0;\n//var Z_BEST_SPEED          = 1;\n//var Z_BEST_COMPRESSION    = 9;\nvar Z_DEFAULT_COMPRESSION = -1;\n\n\nvar Z_FILTERED            = 1;\nvar Z_HUFFMAN_ONLY        = 2;\nvar Z_RLE                 = 3;\nvar Z_FIXED               = 4;\nvar Z_DEFAULT_STRATEGY    = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\n//var Z_BINARY              = 0;\n//var Z_TEXT                = 1;\n//var Z_ASCII               = 1; // = Z_TEXT\nvar Z_UNKNOWN             = 2;\n\n\n/* The deflate compression method */\nvar Z_DEFLATED  = 8;\n\n/*============================================================================*/\n\n\nvar MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_MEM_LEVEL = 8;\n\n\nvar LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nvar LITERALS      = 256;\n/* number of literal bytes 0..255 */\nvar L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nvar D_CODES       = 30;\n/* number of distance codes */\nvar BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\nvar HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\nvar MAX_BITS  = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\nvar MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nvar PRESET_DICT = 0x20;\n\nvar INIT_STATE = 42;\nvar EXTRA_STATE = 69;\nvar NAME_STATE = 73;\nvar COMMENT_STATE = 91;\nvar HCRC_STATE = 103;\nvar BUSY_STATE = 113;\nvar FINISH_STATE = 666;\n\nvar BS_NEED_MORE      = 1; /* block not completed, need more input or more output */\nvar BS_BLOCK_DONE     = 2; /* block flush performed */\nvar BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nvar BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */\n\nvar OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nfunction err(strm, errorCode) {\n  strm.msg = msg[errorCode];\n  return errorCode;\n}\n\nfunction rank(f) {\n  return ((f) << 1) - ((f) > 4 ? 9 : 0);\n}\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nfunction flush_pending(strm) {\n  var s = strm.state;\n\n  //_tr_flush_bits(s);\n  var len = s.pending;\n  if (len > strm.avail_out) {\n    len = strm.avail_out;\n  }\n  if (len === 0) { return; }\n\n  utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);\n  strm.next_out += len;\n  s.pending_out += len;\n  strm.total_out += len;\n  strm.avail_out -= len;\n  s.pending -= len;\n  if (s.pending === 0) {\n    s.pending_out = 0;\n  }\n}\n\n\nfunction flush_block_only(s, last) {\n  trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n  s.block_start = s.strstart;\n  flush_pending(s.strm);\n}\n\n\nfunction put_byte(s, b) {\n  s.pending_buf[s.pending++] = b;\n}\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nfunction putShortMSB(s, b) {\n//  put_byte(s, (Byte)(b >> 8));\n//  put_byte(s, (Byte)(b & 0xff));\n  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n  s.pending_buf[s.pending++] = b & 0xff;\n}\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read.  All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nfunction read_buf(strm, buf, start, size) {\n  var len = strm.avail_in;\n\n  if (len > size) { len = size; }\n  if (len === 0) { return 0; }\n\n  strm.avail_in -= len;\n\n  // zmemcpy(buf, strm->next_in, len);\n  utils.arraySet(buf, strm.input, strm.next_in, len, start);\n  if (strm.state.wrap === 1) {\n    strm.adler = adler32(strm.adler, buf, len, start);\n  }\n\n  else if (strm.state.wrap === 2) {\n    strm.adler = crc32(strm.adler, buf, len, start);\n  }\n\n  strm.next_in += len;\n  strm.total_in += len;\n\n  return len;\n}\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nfunction longest_match(s, cur_match) {\n  var chain_length = s.max_chain_length;      /* max hash chain length */\n  var scan = s.strstart; /* current string */\n  var match;                       /* matched string */\n  var len;                           /* length of current match */\n  var best_len = s.prev_length;              /* best match length so far */\n  var nice_match = s.nice_match;             /* stop if match long enough */\n  var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n  var _win = s.window; // shortcut\n\n  var wmask = s.w_mask;\n  var prev  = s.prev;\n\n  /* Stop when cur_match becomes <= limit. To simplify the code,\n   * we prevent matches with the string of window index 0.\n   */\n\n  var strend = s.strstart + MAX_MATCH;\n  var scan_end1  = _win[scan + best_len - 1];\n  var scan_end   = _win[scan + best_len];\n\n  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n   * It is easy to get rid of this optimization if necessary.\n   */\n  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n  /* Do not waste too much time if we already have a good match: */\n  if (s.prev_length >= s.good_match) {\n    chain_length >>= 2;\n  }\n  /* Do not look for matches beyond the end of the input. This is necessary\n   * to make deflate deterministic.\n   */\n  if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n  do {\n    // Assert(cur_match < s->strstart, \"no future\");\n    match = cur_match;\n\n    /* Skip to next match if the match length cannot increase\n     * or if the match length is less than 2.  Note that the checks below\n     * for insufficient lookahead only occur occasionally for performance\n     * reasons.  Therefore uninitialized memory will be accessed, and\n     * conditional jumps will be made that depend on those values.\n     * However the length of the match is limited to the lookahead, so\n     * the output of deflate is not affected by the uninitialized values.\n     */\n\n    if (_win[match + best_len]     !== scan_end  ||\n        _win[match + best_len - 1] !== scan_end1 ||\n        _win[match]                !== _win[scan] ||\n        _win[++match]              !== _win[scan + 1]) {\n      continue;\n    }\n\n    /* The check at best_len-1 can be removed because it will be made\n     * again later. (This heuristic is not always a win.)\n     * It is not necessary to compare scan[2] and match[2] since they\n     * are always equal when the other bytes match, given that\n     * the hash keys are equal and that HASH_BITS >= 8.\n     */\n    scan += 2;\n    match++;\n    // Assert(*scan == *match, \"match[2]?\");\n\n    /* We check for insufficient lookahead only every 8th comparison;\n     * the 256th check will be made at strstart+258.\n     */\n    do {\n      /*jshint noempty:false*/\n    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             scan < strend);\n\n    // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n    len = MAX_MATCH - (strend - scan);\n    scan = strend - MAX_MATCH;\n\n    if (len > best_len) {\n      s.match_start = cur_match;\n      best_len = len;\n      if (len >= nice_match) {\n        break;\n      }\n      scan_end1  = _win[scan + best_len - 1];\n      scan_end   = _win[scan + best_len];\n    }\n  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n  if (best_len <= s.lookahead) {\n    return best_len;\n  }\n  return s.lookahead;\n}\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n *    At least one byte has been read, or avail_in == 0; reads are\n *    performed for at least two bytes (required for the zip translate_eol\n *    option -- not supported here).\n */\nfunction fill_window(s) {\n  var _w_size = s.w_size;\n  var p, n, m, more, str;\n\n  //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n  do {\n    more = s.window_size - s.lookahead - s.strstart;\n\n    // JS ints have 32 bit, block below not needed\n    /* Deal with !@#$% 64K limit: */\n    //if (sizeof(int) <= 2) {\n    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n    //        more = wsize;\n    //\n    //  } else if (more == (unsigned)(-1)) {\n    //        /* Very unlikely, but possible on 16 bit machine if\n    //         * strstart == 0 && lookahead == 1 (input done a byte at time)\n    //         */\n    //        more--;\n    //    }\n    //}\n\n\n    /* If the window is almost full and there is insufficient lookahead,\n     * move the upper half to the lower one to make room in the upper half.\n     */\n    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n      utils.arraySet(s.window, s.window, _w_size, _w_size, 0);\n      s.match_start -= _w_size;\n      s.strstart -= _w_size;\n      /* we now have strstart >= MAX_DIST */\n      s.block_start -= _w_size;\n\n      /* Slide the hash table (could be avoided with 32 bit values\n       at the expense of memory usage). We slide even when level == 0\n       to keep the hash table consistent if we switch back to level > 0\n       later. (Using level 0 permanently is not an optimal usage of\n       zlib, so we don't care about this pathological case.)\n       */\n\n      n = s.hash_size;\n      p = n;\n      do {\n        m = s.head[--p];\n        s.head[p] = (m >= _w_size ? m - _w_size : 0);\n      } while (--n);\n\n      n = _w_size;\n      p = n;\n      do {\n        m = s.prev[--p];\n        s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n        /* If n is not on any hash chain, prev[n] is garbage but\n         * its value will never be used.\n         */\n      } while (--n);\n\n      more += _w_size;\n    }\n    if (s.strm.avail_in === 0) {\n      break;\n    }\n\n    /* If there was no sliding:\n     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n     *    more == window_size - lookahead - strstart\n     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n     * => more >= window_size - 2*WSIZE + 2\n     * In the BIG_MEM or MMAP case (not yet supported),\n     *   window_size == input_size + MIN_LOOKAHEAD  &&\n     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n     * Otherwise, window_size == 2*WSIZE so more >= 2.\n     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n     */\n    //Assert(more >= 2, \"more < 2\");\n    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n    s.lookahead += n;\n\n    /* Initialize the hash value now that we have some input: */\n    if (s.lookahead + s.insert >= MIN_MATCH) {\n      str = s.strstart - s.insert;\n      s.ins_h = s.window[str];\n\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;\n//#if MIN_MATCH != 3\n//        Call update_hash() MIN_MATCH-3 more times\n//#endif\n      while (s.insert) {\n        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n        s.prev[str & s.w_mask] = s.head[s.ins_h];\n        s.head[s.ins_h] = str;\n        str++;\n        s.insert--;\n        if (s.lookahead + s.insert < MIN_MATCH) {\n          break;\n        }\n      }\n    }\n    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n     * but this is not important since only literal bytes will be emitted.\n     */\n\n  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n  /* If the WIN_INIT bytes after the end of the current data have never been\n   * written, then zero those bytes in order to avoid memory check reports of\n   * the use of uninitialized (or uninitialised as Julian writes) bytes by\n   * the longest match routines.  Update the high water mark for the next\n   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match\n   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n   */\n//  if (s.high_water < s.window_size) {\n//    var curr = s.strstart + s.lookahead;\n//    var init = 0;\n//\n//    if (s.high_water < curr) {\n//      /* Previous high water mark below current data -- zero WIN_INIT\n//       * bytes or up to end of window, whichever is less.\n//       */\n//      init = s.window_size - curr;\n//      if (init > WIN_INIT)\n//        init = WIN_INIT;\n//      zmemzero(s->window + curr, (unsigned)init);\n//      s->high_water = curr + init;\n//    }\n//    else if (s->high_water < (ulg)curr + WIN_INIT) {\n//      /* High water mark at or above current data, but below current data\n//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n//       * to end of window, whichever is less.\n//       */\n//      init = (ulg)curr + WIN_INIT - s->high_water;\n//      if (init > s->window_size - s->high_water)\n//        init = s->window_size - s->high_water;\n//      zmemzero(s->window + s->high_water, (unsigned)init);\n//      s->high_water += init;\n//    }\n//  }\n//\n//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n//    \"not enough room for search\");\n}\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nfunction deflate_stored(s, flush) {\n  /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n   * to pending_buf_size, and each stored block has a 5 byte header:\n   */\n  var max_block_size = 0xffff;\n\n  if (max_block_size > s.pending_buf_size - 5) {\n    max_block_size = s.pending_buf_size - 5;\n  }\n\n  /* Copy as much as possible from input to output: */\n  for (;;) {\n    /* Fill the window as much as possible: */\n    if (s.lookahead <= 1) {\n\n      //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n      //  s->block_start >= (long)s->w_size, \"slide too late\");\n//      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n//        s.block_start >= s.w_size)) {\n//        throw  new Error(\"slide too late\");\n//      }\n\n      fill_window(s);\n      if (s.lookahead === 0 && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n\n      if (s.lookahead === 0) {\n        break;\n      }\n      /* flush the current block */\n    }\n    //Assert(s->block_start >= 0L, \"block gone\");\n//    if (s.block_start < 0) throw new Error(\"block gone\");\n\n    s.strstart += s.lookahead;\n    s.lookahead = 0;\n\n    /* Emit a stored block if pending_buf will be full: */\n    var max_start = s.block_start + max_block_size;\n\n    if (s.strstart === 0 || s.strstart >= max_start) {\n      /* strstart == 0 is possible when wraparound on 16-bit machine */\n      s.lookahead = s.strstart - max_start;\n      s.strstart = max_start;\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n\n\n    }\n    /* Flush if we may have to slide, otherwise block_start may become\n     * negative and the data will be gone:\n     */\n    if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n\n  s.insert = 0;\n\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n\n  if (s.strstart > s.block_start) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_NEED_MORE;\n}\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nfunction deflate_fast(s, flush) {\n  var hash_head;        /* head of the hash chain */\n  var bflush;           /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) {\n        break; /* flush the current block */\n      }\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     * At this point we have always match_length < MIN_MATCH\n     */\n    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n    }\n    if (s.match_length >= MIN_MATCH) {\n      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n      /*** _tr_tally_dist(s, s.strstart - s.match_start,\n                     s.match_length - MIN_MATCH, bflush); ***/\n      bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n\n      /* Insert new strings in the hash table only if the match length\n       * is not too large. This saves time but degrades compression.\n       */\n      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n        s.match_length--; /* string at strstart already in table */\n        do {\n          s.strstart++;\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n          /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n           * always MIN_MATCH bytes ahead.\n           */\n        } while (--s.match_length !== 0);\n        s.strstart++;\n      } else\n      {\n        s.strstart += s.match_length;\n        s.match_length = 0;\n        s.ins_h = s.window[s.strstart];\n        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;\n\n//#if MIN_MATCH != 3\n//                Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n         * matter since it will be recomputed at next deflate call.\n         */\n      }\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nfunction deflate_slow(s, flush) {\n  var hash_head;          /* head of hash chain */\n  var bflush;              /* set if current block must be flushed */\n\n  var max_insert;\n\n  /* Process the input block. */\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     */\n    s.prev_length = s.match_length;\n    s.prev_match = s.match_start;\n    s.match_length = MIN_MATCH - 1;\n\n    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n        s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n\n      if (s.match_length <= 5 &&\n         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n        /* If prev_match is also MIN_MATCH, match_start is garbage\n         * but we will ignore the current match anyway.\n         */\n        s.match_length = MIN_MATCH - 1;\n      }\n    }\n    /* If there was a match at the previous step and the current\n     * match is not better, output the previous match:\n     */\n    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n      max_insert = s.strstart + s.lookahead - MIN_MATCH;\n      /* Do not insert strings in hash table beyond this. */\n\n      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n                     s.prev_length - MIN_MATCH, bflush);***/\n      bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n      /* Insert in hash table all strings up to the end of the match.\n       * strstart-1 and strstart are already inserted. If there is not\n       * enough lookahead, the last two strings are not inserted in\n       * the hash table.\n       */\n      s.lookahead -= s.prev_length - 1;\n      s.prev_length -= 2;\n      do {\n        if (++s.strstart <= max_insert) {\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n        }\n      } while (--s.prev_length !== 0);\n      s.match_available = 0;\n      s.match_length = MIN_MATCH - 1;\n      s.strstart++;\n\n      if (bflush) {\n        /*** FLUSH_BLOCK(s, 0); ***/\n        flush_block_only(s, false);\n        if (s.strm.avail_out === 0) {\n          return BS_NEED_MORE;\n        }\n        /***/\n      }\n\n    } else if (s.match_available) {\n      /* If there was no match at the previous position, output a\n       * single literal. If there was a match but the current match\n       * is longer, truncate the previous match to a single literal.\n       */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n      if (bflush) {\n        /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n        flush_block_only(s, false);\n        /***/\n      }\n      s.strstart++;\n      s.lookahead--;\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n    } else {\n      /* There is no previous match to compare with, wait for\n       * the next step to decide.\n       */\n      s.match_available = 1;\n      s.strstart++;\n      s.lookahead--;\n    }\n  }\n  //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n  if (s.match_available) {\n    //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n    bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n    s.match_available = 0;\n  }\n  s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_BLOCK_DONE;\n}\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one.  Do not maintain a hash table.  (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nfunction deflate_rle(s, flush) {\n  var bflush;            /* set if current block must be flushed */\n  var prev;              /* byte at distance one to match */\n  var scan, strend;      /* scan goes up to strend for length of run */\n\n  var _win = s.window;\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the longest run, plus one for the unrolled loop.\n     */\n    if (s.lookahead <= MAX_MATCH) {\n      fill_window(s);\n      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* See how many times the previous byte repeats */\n    s.match_length = 0;\n    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n      scan = s.strstart - 1;\n      prev = _win[scan];\n      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n        strend = s.strstart + MAX_MATCH;\n        do {\n          /*jshint noempty:false*/\n        } while (prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 scan < strend);\n        s.match_length = MAX_MATCH - (strend - scan);\n        if (s.match_length > s.lookahead) {\n          s.match_length = s.lookahead;\n        }\n      }\n      //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n    }\n\n    /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n    if (s.match_length >= MIN_MATCH) {\n      //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n      bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n      s.strstart += s.match_length;\n      s.match_length = 0;\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nfunction deflate_huff(s, flush) {\n  var bflush;             /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we have a literal to write. */\n    if (s.lookahead === 0) {\n      fill_window(s);\n      if (s.lookahead === 0) {\n        if (flush === Z_NO_FLUSH) {\n          return BS_NEED_MORE;\n        }\n        break;      /* flush the current block */\n      }\n    }\n\n    /* Output a literal byte */\n    s.match_length = 0;\n    //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n    bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n    s.lookahead--;\n    s.strstart++;\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n  this.good_length = good_length;\n  this.max_lazy = max_lazy;\n  this.nice_length = nice_length;\n  this.max_chain = max_chain;\n  this.func = func;\n}\n\nvar configuration_table;\n\nconfiguration_table = [\n  /*      good lazy nice chain */\n  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */\n  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */\n  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */\n  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */\n\n  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */\n  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */\n  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */\n  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */\n  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */\n  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nfunction lm_init(s) {\n  s.window_size = 2 * s.w_size;\n\n  /*** CLEAR_HASH(s); ***/\n  zero(s.head); // Fill with NIL (= 0);\n\n  /* Set the default configuration parameters:\n   */\n  s.max_lazy_match = configuration_table[s.level].max_lazy;\n  s.good_match = configuration_table[s.level].good_length;\n  s.nice_match = configuration_table[s.level].nice_length;\n  s.max_chain_length = configuration_table[s.level].max_chain;\n\n  s.strstart = 0;\n  s.block_start = 0;\n  s.lookahead = 0;\n  s.insert = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  s.ins_h = 0;\n}\n\n\nfunction DeflateState() {\n  this.strm = null;            /* pointer back to this zlib stream */\n  this.status = 0;            /* as the name implies */\n  this.pending_buf = null;      /* output still pending */\n  this.pending_buf_size = 0;  /* size of pending_buf */\n  this.pending_out = 0;       /* next pending byte to output to the stream */\n  this.pending = 0;           /* nb of bytes in the pending buffer */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.gzhead = null;         /* gzip header information to write */\n  this.gzindex = 0;           /* where in extra, name, or comment */\n  this.method = Z_DEFLATED; /* can only be DEFLATED */\n  this.last_flush = -1;   /* value of flush param for previous deflate call */\n\n  this.w_size = 0;  /* LZ77 window size (32K by default) */\n  this.w_bits = 0;  /* log2(w_size)  (8..16) */\n  this.w_mask = 0;  /* w_size - 1 */\n\n  this.window = null;\n  /* Sliding window. Input bytes are read into the second half of the window,\n   * and move to the first half later to keep a dictionary of at least wSize\n   * bytes. With this organization, matches are limited to a distance of\n   * wSize-MAX_MATCH bytes, but this ensures that IO is always\n   * performed with a length multiple of the block size.\n   */\n\n  this.window_size = 0;\n  /* Actual size of window: 2*wSize, except when the user input buffer\n   * is directly used as sliding window.\n   */\n\n  this.prev = null;\n  /* Link to older string with same hash index. To limit the size of this\n   * array to 64K, this link is maintained only for the last 32K strings.\n   * An index in this array is thus a window index modulo 32K.\n   */\n\n  this.head = null;   /* Heads of the hash chains or NIL. */\n\n  this.ins_h = 0;       /* hash index of string to be inserted */\n  this.hash_size = 0;   /* number of elements in hash table */\n  this.hash_bits = 0;   /* log2(hash_size) */\n  this.hash_mask = 0;   /* hash_size-1 */\n\n  this.hash_shift = 0;\n  /* Number of bits by which ins_h must be shifted at each input\n   * step. It must be such that after MIN_MATCH steps, the oldest\n   * byte no longer takes part in the hash key, that is:\n   *   hash_shift * MIN_MATCH >= hash_bits\n   */\n\n  this.block_start = 0;\n  /* Window position at the beginning of the current output block. Gets\n   * negative when the window is moved backwards.\n   */\n\n  this.match_length = 0;      /* length of best match */\n  this.prev_match = 0;        /* previous match */\n  this.match_available = 0;   /* set if previous match exists */\n  this.strstart = 0;          /* start of string to insert */\n  this.match_start = 0;       /* start of matching string */\n  this.lookahead = 0;         /* number of valid bytes ahead in window */\n\n  this.prev_length = 0;\n  /* Length of the best match at previous step. Matches not greater than this\n   * are discarded. This is used in the lazy match evaluation.\n   */\n\n  this.max_chain_length = 0;\n  /* To speed up deflation, hash chains are never searched beyond this\n   * length.  A higher limit improves compression ratio but degrades the\n   * speed.\n   */\n\n  this.max_lazy_match = 0;\n  /* Attempt to find a better match only when the current match is strictly\n   * smaller than this value. This mechanism is used only for compression\n   * levels >= 4.\n   */\n  // That's alias to max_lazy_match, don't use directly\n  //this.max_insert_length = 0;\n  /* Insert new strings in the hash table only if the match length is not\n   * greater than this length. This saves time but degrades compression.\n   * max_insert_length is used only for compression levels <= 3.\n   */\n\n  this.level = 0;     /* compression level (1..9) */\n  this.strategy = 0;  /* favor or force Huffman coding*/\n\n  this.good_match = 0;\n  /* Use a faster search when the previous match is longer than this */\n\n  this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n              /* used by trees.c: */\n\n  /* Didn't use ct_data typedef below to suppress compiler warning */\n\n  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */\n  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */\n\n  // Use flat array of DOUBLE size, with interleaved fata,\n  // because JS does not support effective\n  this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);\n  this.dyn_dtree  = new utils.Buf16((2 * D_CODES + 1) * 2);\n  this.bl_tree    = new utils.Buf16((2 * BL_CODES + 1) * 2);\n  zero(this.dyn_ltree);\n  zero(this.dyn_dtree);\n  zero(this.bl_tree);\n\n  this.l_desc   = null;         /* desc. for literal tree */\n  this.d_desc   = null;         /* desc. for distance tree */\n  this.bl_desc  = null;         /* desc. for bit length tree */\n\n  //ush bl_count[MAX_BITS+1];\n  this.bl_count = new utils.Buf16(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */\n  this.heap = new utils.Buf16(2 * L_CODES + 1);  /* heap used to build the Huffman trees */\n  zero(this.heap);\n\n  this.heap_len = 0;               /* number of elements in the heap */\n  this.heap_max = 0;               /* element of largest frequency */\n  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n   * The same heap array is used to build all trees.\n   */\n\n  this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n  zero(this.depth);\n  /* Depth of each subtree used as tie breaker for trees of equal frequency\n   */\n\n  this.l_buf = 0;          /* buffer index for literals or lengths */\n\n  this.lit_bufsize = 0;\n  /* Size of match buffer for literals/lengths.  There are 4 reasons for\n   * limiting lit_bufsize to 64K:\n   *   - frequencies can be kept in 16 bit counters\n   *   - if compression is not successful for the first block, all input\n   *     data is still in the window so we can still emit a stored block even\n   *     when input comes from standard input.  (This can also be done for\n   *     all blocks if lit_bufsize is not greater than 32K.)\n   *   - if compression is not successful for a file smaller than 64K, we can\n   *     even emit a stored file instead of a stored block (saving 5 bytes).\n   *     This is applicable only for zip (not gzip or zlib).\n   *   - creating new Huffman trees less frequently may not provide fast\n   *     adaptation to changes in the input data statistics. (Take for\n   *     example a binary file with poorly compressible code followed by\n   *     a highly compressible string table.) Smaller buffer sizes give\n   *     fast adaptation but have of course the overhead of transmitting\n   *     trees more frequently.\n   *   - I can't count above 4\n   */\n\n  this.last_lit = 0;      /* running index in l_buf */\n\n  this.d_buf = 0;\n  /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n   * the same number of elements. To use different lengths, an extra flag\n   * array would be necessary.\n   */\n\n  this.opt_len = 0;       /* bit length of current block with optimal trees */\n  this.static_len = 0;    /* bit length of current block with static trees */\n  this.matches = 0;       /* number of string matches in current block */\n  this.insert = 0;        /* bytes at end of window left to insert */\n\n\n  this.bi_buf = 0;\n  /* Output buffer. bits are inserted starting at the bottom (least\n   * significant bits).\n   */\n  this.bi_valid = 0;\n  /* Number of valid bits in bi_buf.  All bits above the last valid bit\n   * are always zero.\n   */\n\n  // Used for window memory init. We safely ignore it for JS. That makes\n  // sense only for pointers and memory check tools.\n  //this.high_water = 0;\n  /* High water mark offset in window for initialized bytes -- bytes above\n   * this are set to zero in order to avoid memory check warnings when\n   * longest match routines access bytes past the input.  This is then\n   * updated to the new high water mark.\n   */\n}\n\n\nfunction deflateResetKeep(strm) {\n  var s;\n\n  if (!strm || !strm.state) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n  strm.total_in = strm.total_out = 0;\n  strm.data_type = Z_UNKNOWN;\n\n  s = strm.state;\n  s.pending = 0;\n  s.pending_out = 0;\n\n  if (s.wrap < 0) {\n    s.wrap = -s.wrap;\n    /* was made negative by deflate(..., Z_FINISH); */\n  }\n  s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n  strm.adler = (s.wrap === 2) ?\n    0  // crc32(0, Z_NULL, 0)\n  :\n    1; // adler32(0, Z_NULL, 0)\n  s.last_flush = Z_NO_FLUSH;\n  trees._tr_init(s);\n  return Z_OK;\n}\n\n\nfunction deflateReset(strm) {\n  var ret = deflateResetKeep(strm);\n  if (ret === Z_OK) {\n    lm_init(strm.state);\n  }\n  return ret;\n}\n\n\nfunction deflateSetHeader(strm, head) {\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }\n  strm.state.gzhead = head;\n  return Z_OK;\n}\n\n\nfunction deflateInit2(strm, level, method, windowBits, memLevel, strategy) {\n  if (!strm) { // === Z_NULL\n    return Z_STREAM_ERROR;\n  }\n  var wrap = 1;\n\n  if (level === Z_DEFAULT_COMPRESSION) {\n    level = 6;\n  }\n\n  if (windowBits < 0) { /* suppress zlib wrapper */\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n\n  else if (windowBits > 15) {\n    wrap = 2;           /* write gzip wrapper instead */\n    windowBits -= 16;\n  }\n\n\n  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||\n    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n    strategy < 0 || strategy > Z_FIXED) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n\n  if (windowBits === 8) {\n    windowBits = 9;\n  }\n  /* until 256-byte window bug fixed */\n\n  var s = new DeflateState();\n\n  strm.state = s;\n  s.strm = strm;\n\n  s.wrap = wrap;\n  s.gzhead = null;\n  s.w_bits = windowBits;\n  s.w_size = 1 << s.w_bits;\n  s.w_mask = s.w_size - 1;\n\n  s.hash_bits = memLevel + 7;\n  s.hash_size = 1 << s.hash_bits;\n  s.hash_mask = s.hash_size - 1;\n  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n  s.window = new utils.Buf8(s.w_size * 2);\n  s.head = new utils.Buf16(s.hash_size);\n  s.prev = new utils.Buf16(s.w_size);\n\n  // Don't need mem init magic for JS.\n  //s.high_water = 0;  /* nothing written to s->window yet */\n\n  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n  s.pending_buf_size = s.lit_bufsize * 4;\n\n  //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n  //s->pending_buf = (uchf *) overlay;\n  s.pending_buf = new utils.Buf8(s.pending_buf_size);\n\n  // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n  //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n  s.d_buf = 1 * s.lit_bufsize;\n\n  //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n  s.l_buf = (1 + 2) * s.lit_bufsize;\n\n  s.level = level;\n  s.strategy = strategy;\n  s.method = method;\n\n  return deflateReset(strm);\n}\n\nfunction deflateInit(strm, level) {\n  return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);\n}\n\n\nfunction deflate(strm, flush) {\n  var old_flush, s;\n  var beg, val; // for gzip header write only\n\n  if (!strm || !strm.state ||\n    flush > Z_BLOCK || flush < 0) {\n    return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;\n  }\n\n  s = strm.state;\n\n  if (!strm.output ||\n      (!strm.input && strm.avail_in !== 0) ||\n      (s.status === FINISH_STATE && flush !== Z_FINISH)) {\n    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);\n  }\n\n  s.strm = strm; /* just in case */\n  old_flush = s.last_flush;\n  s.last_flush = flush;\n\n  /* Write the header */\n  if (s.status === INIT_STATE) {\n\n    if (s.wrap === 2) { // GZIP header\n      strm.adler = 0;  //crc32(0L, Z_NULL, 0);\n      put_byte(s, 31);\n      put_byte(s, 139);\n      put_byte(s, 8);\n      if (!s.gzhead) { // s->gzhead == Z_NULL\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, s.level === 9 ? 2 :\n                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                     4 : 0));\n        put_byte(s, OS_CODE);\n        s.status = BUSY_STATE;\n      }\n      else {\n        put_byte(s, (s.gzhead.text ? 1 : 0) +\n                    (s.gzhead.hcrc ? 2 : 0) +\n                    (!s.gzhead.extra ? 0 : 4) +\n                    (!s.gzhead.name ? 0 : 8) +\n                    (!s.gzhead.comment ? 0 : 16)\n                );\n        put_byte(s, s.gzhead.time & 0xff);\n        put_byte(s, (s.gzhead.time >> 8) & 0xff);\n        put_byte(s, (s.gzhead.time >> 16) & 0xff);\n        put_byte(s, (s.gzhead.time >> 24) & 0xff);\n        put_byte(s, s.level === 9 ? 2 :\n                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                     4 : 0));\n        put_byte(s, s.gzhead.os & 0xff);\n        if (s.gzhead.extra && s.gzhead.extra.length) {\n          put_byte(s, s.gzhead.extra.length & 0xff);\n          put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n        }\n        if (s.gzhead.hcrc) {\n          strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);\n        }\n        s.gzindex = 0;\n        s.status = EXTRA_STATE;\n      }\n    }\n    else // DEFLATE header\n    {\n      var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;\n      var level_flags = -1;\n\n      if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n        level_flags = 0;\n      } else if (s.level < 6) {\n        level_flags = 1;\n      } else if (s.level === 6) {\n        level_flags = 2;\n      } else {\n        level_flags = 3;\n      }\n      header |= (level_flags << 6);\n      if (s.strstart !== 0) { header |= PRESET_DICT; }\n      header += 31 - (header % 31);\n\n      s.status = BUSY_STATE;\n      putShortMSB(s, header);\n\n      /* Save the adler32 of the preset dictionary: */\n      if (s.strstart !== 0) {\n        putShortMSB(s, strm.adler >>> 16);\n        putShortMSB(s, strm.adler & 0xffff);\n      }\n      strm.adler = 1; // adler32(0L, Z_NULL, 0);\n    }\n  }\n\n//#ifdef GZIP\n  if (s.status === EXTRA_STATE) {\n    if (s.gzhead.extra/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n\n      while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            break;\n          }\n        }\n        put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n        s.gzindex++;\n      }\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (s.gzindex === s.gzhead.extra.length) {\n        s.gzindex = 0;\n        s.status = NAME_STATE;\n      }\n    }\n    else {\n      s.status = NAME_STATE;\n    }\n  }\n  if (s.status === NAME_STATE) {\n    if (s.gzhead.name/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n      //int val;\n\n      do {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            val = 1;\n            break;\n          }\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.name.length) {\n          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (val === 0) {\n        s.gzindex = 0;\n        s.status = COMMENT_STATE;\n      }\n    }\n    else {\n      s.status = COMMENT_STATE;\n    }\n  }\n  if (s.status === COMMENT_STATE) {\n    if (s.gzhead.comment/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n      //int val;\n\n      do {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            val = 1;\n            break;\n          }\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.comment.length) {\n          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (val === 0) {\n        s.status = HCRC_STATE;\n      }\n    }\n    else {\n      s.status = HCRC_STATE;\n    }\n  }\n  if (s.status === HCRC_STATE) {\n    if (s.gzhead.hcrc) {\n      if (s.pending + 2 > s.pending_buf_size) {\n        flush_pending(strm);\n      }\n      if (s.pending + 2 <= s.pending_buf_size) {\n        put_byte(s, strm.adler & 0xff);\n        put_byte(s, (strm.adler >> 8) & 0xff);\n        strm.adler = 0; //crc32(0L, Z_NULL, 0);\n        s.status = BUSY_STATE;\n      }\n    }\n    else {\n      s.status = BUSY_STATE;\n    }\n  }\n//#endif\n\n  /* Flush as much pending output as possible */\n  if (s.pending !== 0) {\n    flush_pending(strm);\n    if (strm.avail_out === 0) {\n      /* Since avail_out is 0, deflate will be called again with\n       * more output space, but possibly with both pending and\n       * avail_in equal to zero. There won't be anything to do,\n       * but this is not an error situation so make sure we\n       * return OK instead of BUF_ERROR at next call of deflate:\n       */\n      s.last_flush = -1;\n      return Z_OK;\n    }\n\n    /* Make sure there is something to do and avoid duplicate consecutive\n     * flushes. For repeated and useless calls with Z_FINISH, we keep\n     * returning Z_STREAM_END instead of Z_BUF_ERROR.\n     */\n  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n    flush !== Z_FINISH) {\n    return err(strm, Z_BUF_ERROR);\n  }\n\n  /* User must not provide more input after the first FINISH: */\n  if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n    return err(strm, Z_BUF_ERROR);\n  }\n\n  /* Start a new block or continue the current one.\n   */\n  if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n    (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {\n    var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n      (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n        configuration_table[s.level].func(s, flush));\n\n    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n      s.status = FINISH_STATE;\n    }\n    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n      if (strm.avail_out === 0) {\n        s.last_flush = -1;\n        /* avoid BUF_ERROR next call, see above */\n      }\n      return Z_OK;\n      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n       * of deflate should use the same flush parameter to make sure\n       * that the flush is complete. So we don't have to output an\n       * empty block here, this will be done at next call. This also\n       * ensures that for a very small output buffer, we emit at most\n       * one empty block.\n       */\n    }\n    if (bstate === BS_BLOCK_DONE) {\n      if (flush === Z_PARTIAL_FLUSH) {\n        trees._tr_align(s);\n      }\n      else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\n\n        trees._tr_stored_block(s, 0, 0, false);\n        /* For a full flush, this empty block will be recognized\n         * as a special marker by inflate_sync().\n         */\n        if (flush === Z_FULL_FLUSH) {\n          /*** CLEAR_HASH(s); ***/             /* forget history */\n          zero(s.head); // Fill with NIL (= 0);\n\n          if (s.lookahead === 0) {\n            s.strstart = 0;\n            s.block_start = 0;\n            s.insert = 0;\n          }\n        }\n      }\n      flush_pending(strm);\n      if (strm.avail_out === 0) {\n        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n        return Z_OK;\n      }\n    }\n  }\n  //Assert(strm->avail_out > 0, \"bug2\");\n  //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n  if (flush !== Z_FINISH) { return Z_OK; }\n  if (s.wrap <= 0) { return Z_STREAM_END; }\n\n  /* Write the trailer */\n  if (s.wrap === 2) {\n    put_byte(s, strm.adler & 0xff);\n    put_byte(s, (strm.adler >> 8) & 0xff);\n    put_byte(s, (strm.adler >> 16) & 0xff);\n    put_byte(s, (strm.adler >> 24) & 0xff);\n    put_byte(s, strm.total_in & 0xff);\n    put_byte(s, (strm.total_in >> 8) & 0xff);\n    put_byte(s, (strm.total_in >> 16) & 0xff);\n    put_byte(s, (strm.total_in >> 24) & 0xff);\n  }\n  else\n  {\n    putShortMSB(s, strm.adler >>> 16);\n    putShortMSB(s, strm.adler & 0xffff);\n  }\n\n  flush_pending(strm);\n  /* If avail_out is zero, the application will call deflate again\n   * to flush the rest.\n   */\n  if (s.wrap > 0) { s.wrap = -s.wrap; }\n  /* write the trailer only once! */\n  return s.pending !== 0 ? Z_OK : Z_STREAM_END;\n}\n\nfunction deflateEnd(strm) {\n  var status;\n\n  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  status = strm.state.status;\n  if (status !== INIT_STATE &&\n    status !== EXTRA_STATE &&\n    status !== NAME_STATE &&\n    status !== COMMENT_STATE &&\n    status !== HCRC_STATE &&\n    status !== BUSY_STATE &&\n    status !== FINISH_STATE\n  ) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n  strm.state = null;\n\n  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;\n}\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nfunction deflateSetDictionary(strm, dictionary) {\n  var dictLength = dictionary.length;\n\n  var s;\n  var str, n;\n  var wrap;\n  var avail;\n  var next;\n  var input;\n  var tmpDict;\n\n  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  s = strm.state;\n  wrap = s.wrap;\n\n  if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n    return Z_STREAM_ERROR;\n  }\n\n  /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n  if (wrap === 1) {\n    /* adler32(strm->adler, dictionary, dictLength); */\n    strm.adler = adler32(strm.adler, dictionary, dictLength, 0);\n  }\n\n  s.wrap = 0;   /* avoid computing Adler-32 in read_buf */\n\n  /* if dictionary would fill window, just replace the history */\n  if (dictLength >= s.w_size) {\n    if (wrap === 0) {            /* already empty otherwise */\n      /*** CLEAR_HASH(s); ***/\n      zero(s.head); // Fill with NIL (= 0);\n      s.strstart = 0;\n      s.block_start = 0;\n      s.insert = 0;\n    }\n    /* use the tail */\n    // dictionary = dictionary.slice(dictLength - s.w_size);\n    tmpDict = new utils.Buf8(s.w_size);\n    utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);\n    dictionary = tmpDict;\n    dictLength = s.w_size;\n  }\n  /* insert dictionary into window and hash */\n  avail = strm.avail_in;\n  next = strm.next_in;\n  input = strm.input;\n  strm.avail_in = dictLength;\n  strm.next_in = 0;\n  strm.input = dictionary;\n  fill_window(s);\n  while (s.lookahead >= MIN_MATCH) {\n    str = s.strstart;\n    n = s.lookahead - (MIN_MATCH - 1);\n    do {\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n      s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n      s.head[s.ins_h] = str;\n      str++;\n    } while (--n);\n    s.strstart = str;\n    s.lookahead = MIN_MATCH - 1;\n    fill_window(s);\n  }\n  s.strstart += s.lookahead;\n  s.block_start = s.strstart;\n  s.insert = s.lookahead;\n  s.lookahead = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  strm.next_in = next;\n  strm.input = input;\n  strm.avail_in = avail;\n  s.wrap = wrap;\n  return Z_OK;\n}\n\n\nexports.deflateInit = deflateInit;\nexports.deflateInit2 = deflateInit2;\nexports.deflateReset = deflateReset;\nexports.deflateResetKeep = deflateResetKeep;\nexports.deflateSetHeader = deflateSetHeader;\nexports.deflate = deflate;\nexports.deflateEnd = deflateEnd;\nexports.deflateSetDictionary = deflateSetDictionary;\nexports.deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nexports.deflateBound = deflateBound;\nexports.deflateCopy = deflateCopy;\nexports.deflateParams = deflateParams;\nexports.deflatePending = deflatePending;\nexports.deflatePrime = deflatePrime;\nexports.deflateTune = deflateTune;\n*/\n\n},{\"../utils/common\":123,\"./adler32\":125,\"./crc32\":127,\"./messages\":133,\"./trees\":134}],129:[function(require,module,exports){\n'use strict';\n\n\nfunction GZheader() {\n  /* true if compressed data believed to be text */\n  this.text       = 0;\n  /* modification time */\n  this.time       = 0;\n  /* extra flags (not used when writing a gzip file) */\n  this.xflags     = 0;\n  /* operating system */\n  this.os         = 0;\n  /* pointer to extra field or Z_NULL if none */\n  this.extra      = null;\n  /* extra field length (valid if extra != Z_NULL) */\n  this.extra_len  = 0; // Actually, we don't need it in JS,\n                       // but leave for few code modifications\n\n  //\n  // Setup limits is not necessary because in js we should not preallocate memory\n  // for inflate use constant limit in 65536 bytes\n  //\n\n  /* space at extra (only when reading header) */\n  // this.extra_max  = 0;\n  /* pointer to zero-terminated file name or Z_NULL */\n  this.name       = '';\n  /* space at name (only when reading header) */\n  // this.name_max   = 0;\n  /* pointer to zero-terminated comment or Z_NULL */\n  this.comment    = '';\n  /* space at comment (only when reading header) */\n  // this.comm_max   = 0;\n  /* true if there was or will be a header crc */\n  this.hcrc       = 0;\n  /* true when done reading gzip header (not used when writing a gzip file) */\n  this.done       = false;\n}\n\nmodule.exports = GZheader;\n\n},{}],130:[function(require,module,exports){\n'use strict';\n\n// See state defs from inflate.js\nvar BAD = 30;       /* got a data error -- remain here until reset */\nvar TYPE = 12;      /* i: waiting for type bits, including last-flag bit */\n\n/*\n   Decode literal, length, and distance codes and write out the resulting\n   literal and match bytes until either not enough input or output is\n   available, an end-of-block is encountered, or a data error is encountered.\n   When large enough input and output buffers are supplied to inflate(), for\n   example, a 16K input buffer and a 64K output buffer, more than 95% of the\n   inflate execution time is spent in this routine.\n\n   Entry assumptions:\n\n        state.mode === LEN\n        strm.avail_in >= 6\n        strm.avail_out >= 258\n        start >= strm.avail_out\n        state.bits < 8\n\n   On return, state.mode is one of:\n\n        LEN -- ran out of enough output space or enough available input\n        TYPE -- reached end of block code, inflate() to interpret next block\n        BAD -- error in block data\n\n   Notes:\n\n    - The maximum input bits used by a length/distance pair is 15 bits for the\n      length code, 5 bits for the length extra, 15 bits for the distance code,\n      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.\n      Therefore if strm.avail_in >= 6, then there is enough input to avoid\n      checking for available input while decoding.\n\n    - The maximum bytes that a single length/distance pair can output is 258\n      bytes, which is the maximum length that can be coded.  inflate_fast()\n      requires strm.avail_out >= 258 for each loop to avoid checking for\n      output space.\n */\nmodule.exports = function inflate_fast(strm, start) {\n  var state;\n  var _in;                    /* local strm.input */\n  var last;                   /* have enough input while in < last */\n  var _out;                   /* local strm.output */\n  var beg;                    /* inflate()'s initial strm.output */\n  var end;                    /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n  var dmax;                   /* maximum distance from zlib header */\n//#endif\n  var wsize;                  /* window size or zero if not using window */\n  var whave;                  /* valid bytes in the window */\n  var wnext;                  /* window write index */\n  // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n  var s_window;               /* allocated sliding window, if wsize != 0 */\n  var hold;                   /* local strm.hold */\n  var bits;                   /* local strm.bits */\n  var lcode;                  /* local strm.lencode */\n  var dcode;                  /* local strm.distcode */\n  var lmask;                  /* mask for first level of length codes */\n  var dmask;                  /* mask for first level of distance codes */\n  var here;                   /* retrieved table entry */\n  var op;                     /* code bits, operation, extra bits, or */\n                              /*  window position, window bytes to copy */\n  var len;                    /* match length, unused bytes */\n  var dist;                   /* match distance */\n  var from;                   /* where to copy match from */\n  var from_source;\n\n\n  var input, output; // JS specific, because we have no pointers\n\n  /* copy state to local variables */\n  state = strm.state;\n  //here = state.here;\n  _in = strm.next_in;\n  input = strm.input;\n  last = _in + (strm.avail_in - 5);\n  _out = strm.next_out;\n  output = strm.output;\n  beg = _out - (start - strm.avail_out);\n  end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n  dmax = state.dmax;\n//#endif\n  wsize = state.wsize;\n  whave = state.whave;\n  wnext = state.wnext;\n  s_window = state.window;\n  hold = state.hold;\n  bits = state.bits;\n  lcode = state.lencode;\n  dcode = state.distcode;\n  lmask = (1 << state.lenbits) - 1;\n  dmask = (1 << state.distbits) - 1;\n\n\n  /* decode literals and length/distances until end-of-block or not enough\n     input data or output space */\n\n  top:\n  do {\n    if (bits < 15) {\n      hold += input[_in++] << bits;\n      bits += 8;\n      hold += input[_in++] << bits;\n      bits += 8;\n    }\n\n    here = lcode[hold & lmask];\n\n    dolen:\n    for (;;) { // Goto emulation\n      op = here >>> 24/*here.bits*/;\n      hold >>>= op;\n      bits -= op;\n      op = (here >>> 16) & 0xff/*here.op*/;\n      if (op === 0) {                          /* literal */\n        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n        //        \"inflate:         literal '%c'\\n\" :\n        //        \"inflate:         literal 0x%02x\\n\", here.val));\n        output[_out++] = here & 0xffff/*here.val*/;\n      }\n      else if (op & 16) {                     /* length base */\n        len = here & 0xffff/*here.val*/;\n        op &= 15;                           /* number of extra bits */\n        if (op) {\n          if (bits < op) {\n            hold += input[_in++] << bits;\n            bits += 8;\n          }\n          len += hold & ((1 << op) - 1);\n          hold >>>= op;\n          bits -= op;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", len));\n        if (bits < 15) {\n          hold += input[_in++] << bits;\n          bits += 8;\n          hold += input[_in++] << bits;\n          bits += 8;\n        }\n        here = dcode[hold & dmask];\n\n        dodist:\n        for (;;) { // goto emulation\n          op = here >>> 24/*here.bits*/;\n          hold >>>= op;\n          bits -= op;\n          op = (here >>> 16) & 0xff/*here.op*/;\n\n          if (op & 16) {                      /* distance base */\n            dist = here & 0xffff/*here.val*/;\n            op &= 15;                       /* number of extra bits */\n            if (bits < op) {\n              hold += input[_in++] << bits;\n              bits += 8;\n              if (bits < op) {\n                hold += input[_in++] << bits;\n                bits += 8;\n              }\n            }\n            dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n            if (dist > dmax) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD;\n              break top;\n            }\n//#endif\n            hold >>>= op;\n            bits -= op;\n            //Tracevv((stderr, \"inflate:         distance %u\\n\", dist));\n            op = _out - beg;                /* max distance in output */\n            if (dist > op) {                /* see if copy from window */\n              op = dist - op;               /* distance back in window */\n              if (op > whave) {\n                if (state.sane) {\n                  strm.msg = 'invalid distance too far back';\n                  state.mode = BAD;\n                  break top;\n                }\n\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//                if (len <= op - whave) {\n//                  do {\n//                    output[_out++] = 0;\n//                  } while (--len);\n//                  continue top;\n//                }\n//                len -= op - whave;\n//                do {\n//                  output[_out++] = 0;\n//                } while (--op > whave);\n//                if (op === 0) {\n//                  from = _out - dist;\n//                  do {\n//                    output[_out++] = output[from++];\n//                  } while (--len);\n//                  continue top;\n//                }\n//#endif\n              }\n              from = 0; // window index\n              from_source = s_window;\n              if (wnext === 0) {           /* very common case */\n                from += wsize - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              else if (wnext < op) {      /* wrap around window */\n                from += wsize + wnext - op;\n                op -= wnext;\n                if (op < len) {         /* some from end of window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = 0;\n                  if (wnext < len) {  /* some from start of window */\n                    op = wnext;\n                    len -= op;\n                    do {\n                      output[_out++] = s_window[from++];\n                    } while (--op);\n                    from = _out - dist;      /* rest from output */\n                    from_source = output;\n                  }\n                }\n              }\n              else {                      /* contiguous in window */\n                from += wnext - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              while (len > 2) {\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                len -= 3;\n              }\n              if (len) {\n                output[_out++] = from_source[from++];\n                if (len > 1) {\n                  output[_out++] = from_source[from++];\n                }\n              }\n            }\n            else {\n              from = _out - dist;          /* copy direct from output */\n              do {                        /* minimum length is three */\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                len -= 3;\n              } while (len > 2);\n              if (len) {\n                output[_out++] = output[from++];\n                if (len > 1) {\n                  output[_out++] = output[from++];\n                }\n              }\n            }\n          }\n          else if ((op & 64) === 0) {          /* 2nd level distance code */\n            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n            continue dodist;\n          }\n          else {\n            strm.msg = 'invalid distance code';\n            state.mode = BAD;\n            break top;\n          }\n\n          break; // need to emulate goto via \"continue\"\n        }\n      }\n      else if ((op & 64) === 0) {              /* 2nd level length code */\n        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n        continue dolen;\n      }\n      else if (op & 32) {                     /* end-of-block */\n        //Tracevv((stderr, \"inflate:         end of block\\n\"));\n        state.mode = TYPE;\n        break top;\n      }\n      else {\n        strm.msg = 'invalid literal/length code';\n        state.mode = BAD;\n        break top;\n      }\n\n      break; // need to emulate goto via \"continue\"\n    }\n  } while (_in < last && _out < end);\n\n  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n  len = bits >> 3;\n  _in -= len;\n  bits -= len << 3;\n  hold &= (1 << bits) - 1;\n\n  /* update state and return */\n  strm.next_in = _in;\n  strm.next_out = _out;\n  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n  state.hold = hold;\n  state.bits = bits;\n  return;\n};\n\n},{}],131:[function(require,module,exports){\n'use strict';\n\n\nvar utils         = require('../utils/common');\nvar adler32       = require('./adler32');\nvar crc32         = require('./crc32');\nvar inflate_fast  = require('./inffast');\nvar inflate_table = require('./inftrees');\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\n//var Z_NO_FLUSH      = 0;\n//var Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH    = 2;\n//var Z_FULL_FLUSH    = 3;\nvar Z_FINISH        = 4;\nvar Z_BLOCK         = 5;\nvar Z_TREES         = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\nvar Z_NEED_DICT     = 2;\n//var Z_ERRNO         = -1;\nvar Z_STREAM_ERROR  = -2;\nvar Z_DATA_ERROR    = -3;\nvar Z_MEM_ERROR     = -4;\nvar Z_BUF_ERROR     = -5;\n//var Z_VERSION_ERROR = -6;\n\n/* The deflate compression method */\nvar Z_DEFLATED  = 8;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nvar    HEAD = 1;       /* i: waiting for magic header */\nvar    FLAGS = 2;      /* i: waiting for method and flags (gzip) */\nvar    TIME = 3;       /* i: waiting for modification time (gzip) */\nvar    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */\nvar    EXLEN = 5;      /* i: waiting for extra length (gzip) */\nvar    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */\nvar    NAME = 7;       /* i: waiting for end of file name (gzip) */\nvar    COMMENT = 8;    /* i: waiting for end of comment (gzip) */\nvar    HCRC = 9;       /* i: waiting for header crc (gzip) */\nvar    DICTID = 10;    /* i: waiting for dictionary check value */\nvar    DICT = 11;      /* waiting for inflateSetDictionary() call */\nvar        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */\nvar        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */\nvar        STORED = 14;    /* i: waiting for stored size (length and complement) */\nvar        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */\nvar        COPY = 16;      /* i/o: waiting for input or output to copy stored block */\nvar        TABLE = 17;     /* i: waiting for dynamic block table lengths */\nvar        LENLENS = 18;   /* i: waiting for code length code lengths */\nvar        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */\nvar            LEN_ = 20;      /* i: same as LEN below, but only first time in */\nvar            LEN = 21;       /* i: waiting for length/lit/eob code */\nvar            LENEXT = 22;    /* i: waiting for length extra bits */\nvar            DIST = 23;      /* i: waiting for distance code */\nvar            DISTEXT = 24;   /* i: waiting for distance extra bits */\nvar            MATCH = 25;     /* o: waiting for output space to copy string */\nvar            LIT = 26;       /* o: waiting for output space to write literal */\nvar    CHECK = 27;     /* i: waiting for 32-bit check value */\nvar    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */\nvar    DONE = 29;      /* finished check, done -- remain here until reset */\nvar    BAD = 30;       /* got a data error -- remain here until reset */\nvar    MEM = 31;       /* got an inflate() memory error -- remain here until reset */\nvar    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_WBITS = MAX_WBITS;\n\n\nfunction zswap32(q) {\n  return  (((q >>> 24) & 0xff) +\n          ((q >>> 8) & 0xff00) +\n          ((q & 0xff00) << 8) +\n          ((q & 0xff) << 24));\n}\n\n\nfunction InflateState() {\n  this.mode = 0;             /* current inflate mode */\n  this.last = false;          /* true if processing last block */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.havedict = false;      /* true if dictionary provided */\n  this.flags = 0;             /* gzip header method and flags (0 if zlib) */\n  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */\n  this.check = 0;             /* protected copy of check value */\n  this.total = 0;             /* protected copy of output count */\n  // TODO: may be {}\n  this.head = null;           /* where to save gzip header information */\n\n  /* sliding window */\n  this.wbits = 0;             /* log base 2 of requested window size */\n  this.wsize = 0;             /* window size or zero if not using window */\n  this.whave = 0;             /* valid bytes in the window */\n  this.wnext = 0;             /* window write index */\n  this.window = null;         /* allocated sliding window, if needed */\n\n  /* bit accumulator */\n  this.hold = 0;              /* input bit accumulator */\n  this.bits = 0;              /* number of bits in \"in\" */\n\n  /* for string and stored block copying */\n  this.length = 0;            /* literal or length of data to copy */\n  this.offset = 0;            /* distance back to copy string from */\n\n  /* for table and code decoding */\n  this.extra = 0;             /* extra bits needed */\n\n  /* fixed and dynamic code tables */\n  this.lencode = null;          /* starting table for length/literal codes */\n  this.distcode = null;         /* starting table for distance codes */\n  this.lenbits = 0;           /* index bits for lencode */\n  this.distbits = 0;          /* index bits for distcode */\n\n  /* dynamic table building */\n  this.ncode = 0;             /* number of code length code lengths */\n  this.nlen = 0;              /* number of length code lengths */\n  this.ndist = 0;             /* number of distance code lengths */\n  this.have = 0;              /* number of code lengths in lens[] */\n  this.next = null;              /* next available space in codes[] */\n\n  this.lens = new utils.Buf16(320); /* temporary storage for code lengths */\n  this.work = new utils.Buf16(288); /* work area for code table building */\n\n  /*\n   because we don't have pointers in js, we use lencode and distcode directly\n   as buffers so we don't need codes\n  */\n  //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */\n  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */\n  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */\n  this.sane = 0;                   /* if false, allow invalid distance too far */\n  this.back = 0;                   /* bits back of last unprocessed length/lit */\n  this.was = 0;                    /* initial length of match */\n}\n\nfunction inflateResetKeep(strm) {\n  var state;\n\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  strm.total_in = strm.total_out = state.total = 0;\n  strm.msg = ''; /*Z_NULL*/\n  if (state.wrap) {       /* to support ill-conceived Java test suite */\n    strm.adler = state.wrap & 1;\n  }\n  state.mode = HEAD;\n  state.last = 0;\n  state.havedict = 0;\n  state.dmax = 32768;\n  state.head = null/*Z_NULL*/;\n  state.hold = 0;\n  state.bits = 0;\n  //state.lencode = state.distcode = state.next = state.codes;\n  state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);\n  state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);\n\n  state.sane = 1;\n  state.back = -1;\n  //Tracev((stderr, \"inflate: reset\\n\"));\n  return Z_OK;\n}\n\nfunction inflateReset(strm) {\n  var state;\n\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  state.wsize = 0;\n  state.whave = 0;\n  state.wnext = 0;\n  return inflateResetKeep(strm);\n\n}\n\nfunction inflateReset2(strm, windowBits) {\n  var wrap;\n  var state;\n\n  /* get the state */\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n\n  /* extract wrap request from windowBits parameter */\n  if (windowBits < 0) {\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n  else {\n    wrap = (windowBits >> 4) + 1;\n    if (windowBits < 48) {\n      windowBits &= 15;\n    }\n  }\n\n  /* set number of window bits, free window if different */\n  if (windowBits && (windowBits < 8 || windowBits > 15)) {\n    return Z_STREAM_ERROR;\n  }\n  if (state.window !== null && state.wbits !== windowBits) {\n    state.window = null;\n  }\n\n  /* update state and reset the rest of it */\n  state.wrap = wrap;\n  state.wbits = windowBits;\n  return inflateReset(strm);\n}\n\nfunction inflateInit2(strm, windowBits) {\n  var ret;\n  var state;\n\n  if (!strm) { return Z_STREAM_ERROR; }\n  //strm.msg = Z_NULL;                 /* in case we return an error */\n\n  state = new InflateState();\n\n  //if (state === Z_NULL) return Z_MEM_ERROR;\n  //Tracev((stderr, \"inflate: allocated\\n\"));\n  strm.state = state;\n  state.window = null/*Z_NULL*/;\n  ret = inflateReset2(strm, windowBits);\n  if (ret !== Z_OK) {\n    strm.state = null/*Z_NULL*/;\n  }\n  return ret;\n}\n\nfunction inflateInit(strm) {\n  return inflateInit2(strm, DEF_WBITS);\n}\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding.  Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter.  This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time.  However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nvar virgin = true;\n\nvar lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\nfunction fixedtables(state) {\n  /* build fixed huffman tables if first call (may not be thread safe) */\n  if (virgin) {\n    var sym;\n\n    lenfix = new utils.Buf32(512);\n    distfix = new utils.Buf32(32);\n\n    /* literal/length table */\n    sym = 0;\n    while (sym < 144) { state.lens[sym++] = 8; }\n    while (sym < 256) { state.lens[sym++] = 9; }\n    while (sym < 280) { state.lens[sym++] = 7; }\n    while (sym < 288) { state.lens[sym++] = 8; }\n\n    inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });\n\n    /* distance table */\n    sym = 0;\n    while (sym < 32) { state.lens[sym++] = 5; }\n\n    inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });\n\n    /* do this just once */\n    virgin = false;\n  }\n\n  state.lencode = lenfix;\n  state.lenbits = 9;\n  state.distcode = distfix;\n  state.distbits = 5;\n}\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning.  If window does not exist yet, create it.  This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nfunction updatewindow(strm, src, end, copy) {\n  var dist;\n  var state = strm.state;\n\n  /* if it hasn't been done already, allocate space for the window */\n  if (state.window === null) {\n    state.wsize = 1 << state.wbits;\n    state.wnext = 0;\n    state.whave = 0;\n\n    state.window = new utils.Buf8(state.wsize);\n  }\n\n  /* copy state->wsize or less output bytes into the circular window */\n  if (copy >= state.wsize) {\n    utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);\n    state.wnext = 0;\n    state.whave = state.wsize;\n  }\n  else {\n    dist = state.wsize - state.wnext;\n    if (dist > copy) {\n      dist = copy;\n    }\n    //zmemcpy(state->window + state->wnext, end - copy, dist);\n    utils.arraySet(state.window, src, end - copy, dist, state.wnext);\n    copy -= dist;\n    if (copy) {\n      //zmemcpy(state->window, end - copy, copy);\n      utils.arraySet(state.window, src, end - copy, copy, 0);\n      state.wnext = copy;\n      state.whave = state.wsize;\n    }\n    else {\n      state.wnext += dist;\n      if (state.wnext === state.wsize) { state.wnext = 0; }\n      if (state.whave < state.wsize) { state.whave += dist; }\n    }\n  }\n  return 0;\n}\n\nfunction inflate(strm, flush) {\n  var state;\n  var input, output;          // input/output buffers\n  var next;                   /* next input INDEX */\n  var put;                    /* next output INDEX */\n  var have, left;             /* available input and output */\n  var hold;                   /* bit buffer */\n  var bits;                   /* bits in bit buffer */\n  var _in, _out;              /* save starting available input and output */\n  var copy;                   /* number of stored or match bytes to copy */\n  var from;                   /* where to copy match bytes from */\n  var from_source;\n  var here = 0;               /* current decoding table entry */\n  var here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n  //var last;                   /* parent table entry */\n  var last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n  var len;                    /* length to copy for repeats, bits to drop */\n  var ret;                    /* return code */\n  var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */\n  var opts;\n\n  var n; // temporary var for NEED_BITS\n\n  var order = /* permutation of code lengths */\n    [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];\n\n\n  if (!strm || !strm.state || !strm.output ||\n      (!strm.input && strm.avail_in !== 0)) {\n    return Z_STREAM_ERROR;\n  }\n\n  state = strm.state;\n  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */\n\n\n  //--- LOAD() ---\n  put = strm.next_out;\n  output = strm.output;\n  left = strm.avail_out;\n  next = strm.next_in;\n  input = strm.input;\n  have = strm.avail_in;\n  hold = state.hold;\n  bits = state.bits;\n  //---\n\n  _in = have;\n  _out = left;\n  ret = Z_OK;\n\n  inf_leave: // goto emulation\n  for (;;) {\n    switch (state.mode) {\n    case HEAD:\n      if (state.wrap === 0) {\n        state.mode = TYPEDO;\n        break;\n      }\n      //=== NEEDBITS(16);\n      while (bits < 16) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */\n        state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n        //=== CRC2(state.check, hold);\n        hbuf[0] = hold & 0xff;\n        hbuf[1] = (hold >>> 8) & 0xff;\n        state.check = crc32(state.check, hbuf, 2, 0);\n        //===//\n\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = FLAGS;\n        break;\n      }\n      state.flags = 0;           /* expect zlib header */\n      if (state.head) {\n        state.head.done = false;\n      }\n      if (!(state.wrap & 1) ||   /* check if zlib header allowed */\n        (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n        strm.msg = 'incorrect header check';\n        state.mode = BAD;\n        break;\n      }\n      if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n        strm.msg = 'unknown compression method';\n        state.mode = BAD;\n        break;\n      }\n      //--- DROPBITS(4) ---//\n      hold >>>= 4;\n      bits -= 4;\n      //---//\n      len = (hold & 0x0f)/*BITS(4)*/ + 8;\n      if (state.wbits === 0) {\n        state.wbits = len;\n      }\n      else if (len > state.wbits) {\n        strm.msg = 'invalid window size';\n        state.mode = BAD;\n        break;\n      }\n      state.dmax = 1 << len;\n      //Tracev((stderr, \"inflate:   zlib header ok\\n\"));\n      strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n      state.mode = hold & 0x200 ? DICTID : TYPE;\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      break;\n    case FLAGS:\n      //=== NEEDBITS(16); */\n      while (bits < 16) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      state.flags = hold;\n      if ((state.flags & 0xff) !== Z_DEFLATED) {\n        strm.msg = 'unknown compression method';\n        state.mode = BAD;\n        break;\n      }\n      if (state.flags & 0xe000) {\n        strm.msg = 'unknown header flags set';\n        state.mode = BAD;\n        break;\n      }\n      if (state.head) {\n        state.head.text = ((hold >> 8) & 1);\n      }\n      if (state.flags & 0x0200) {\n        //=== CRC2(state.check, hold);\n        hbuf[0] = hold & 0xff;\n        hbuf[1] = (hold >>> 8) & 0xff;\n        state.check = crc32(state.check, hbuf, 2, 0);\n        //===//\n      }\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = TIME;\n      /* falls through */\n    case TIME:\n      //=== NEEDBITS(32); */\n      while (bits < 32) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      if (state.head) {\n        state.head.time = hold;\n      }\n      if (state.flags & 0x0200) {\n        //=== CRC4(state.check, hold)\n        hbuf[0] = hold & 0xff;\n        hbuf[1] = (hold >>> 8) & 0xff;\n        hbuf[2] = (hold >>> 16) & 0xff;\n        hbuf[3] = (hold >>> 24) & 0xff;\n        state.check = crc32(state.check, hbuf, 4, 0);\n        //===\n      }\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = OS;\n      /* falls through */\n    case OS:\n      //=== NEEDBITS(16); */\n      while (bits < 16) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      if (state.head) {\n        state.head.xflags = (hold & 0xff);\n        state.head.os = (hold >> 8);\n      }\n      if (state.flags & 0x0200) {\n        //=== CRC2(state.check, hold);\n        hbuf[0] = hold & 0xff;\n        hbuf[1] = (hold >>> 8) & 0xff;\n        state.check = crc32(state.check, hbuf, 2, 0);\n        //===//\n      }\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = EXLEN;\n      /* falls through */\n    case EXLEN:\n      if (state.flags & 0x0400) {\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.length = hold;\n        if (state.head) {\n          state.head.extra_len = hold;\n        }\n        if (state.flags & 0x0200) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n      }\n      else if (state.head) {\n        state.head.extra = null/*Z_NULL*/;\n      }\n      state.mode = EXTRA;\n      /* falls through */\n    case EXTRA:\n      if (state.flags & 0x0400) {\n        copy = state.length;\n        if (copy > have) { copy = have; }\n        if (copy) {\n          if (state.head) {\n            len = state.head.extra_len - state.length;\n            if (!state.head.extra) {\n              // Use untyped array for more conveniend processing later\n              state.head.extra = new Array(state.head.extra_len);\n            }\n            utils.arraySet(\n              state.head.extra,\n              input,\n              next,\n              // extra field is limited to 65536 bytes\n              // - no need for additional size check\n              copy,\n              /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n              len\n            );\n            //zmemcpy(state.head.extra + len, next,\n            //        len + copy > state.head.extra_max ?\n            //        state.head.extra_max - len : copy);\n          }\n          if (state.flags & 0x0200) {\n            state.check = crc32(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          state.length -= copy;\n        }\n        if (state.length) { break inf_leave; }\n      }\n      state.length = 0;\n      state.mode = NAME;\n      /* falls through */\n    case NAME:\n      if (state.flags & 0x0800) {\n        if (have === 0) { break inf_leave; }\n        copy = 0;\n        do {\n          // TODO: 2 or 1 bytes?\n          len = input[next + copy++];\n          /* use constant limit because in js we should not preallocate memory */\n          if (state.head && len &&\n              (state.length < 65536 /*state.head.name_max*/)) {\n            state.head.name += String.fromCharCode(len);\n          }\n        } while (len && copy < have);\n\n        if (state.flags & 0x0200) {\n          state.check = crc32(state.check, input, copy, next);\n        }\n        have -= copy;\n        next += copy;\n        if (len) { break inf_leave; }\n      }\n      else if (state.head) {\n        state.head.name = null;\n      }\n      state.length = 0;\n      state.mode = COMMENT;\n      /* falls through */\n    case COMMENT:\n      if (state.flags & 0x1000) {\n        if (have === 0) { break inf_leave; }\n        copy = 0;\n        do {\n          len = input[next + copy++];\n          /* use constant limit because in js we should not preallocate memory */\n          if (state.head && len &&\n              (state.length < 65536 /*state.head.comm_max*/)) {\n            state.head.comment += String.fromCharCode(len);\n          }\n        } while (len && copy < have);\n        if (state.flags & 0x0200) {\n          state.check = crc32(state.check, input, copy, next);\n        }\n        have -= copy;\n        next += copy;\n        if (len) { break inf_leave; }\n      }\n      else if (state.head) {\n        state.head.comment = null;\n      }\n      state.mode = HCRC;\n      /* falls through */\n    case HCRC:\n      if (state.flags & 0x0200) {\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (hold !== (state.check & 0xffff)) {\n          strm.msg = 'header crc mismatch';\n          state.mode = BAD;\n          break;\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n      }\n      if (state.head) {\n        state.head.hcrc = ((state.flags >> 9) & 1);\n        state.head.done = true;\n      }\n      strm.adler = state.check = 0;\n      state.mode = TYPE;\n      break;\n    case DICTID:\n      //=== NEEDBITS(32); */\n      while (bits < 32) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      strm.adler = state.check = zswap32(hold);\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = DICT;\n      /* falls through */\n    case DICT:\n      if (state.havedict === 0) {\n        //--- RESTORE() ---\n        strm.next_out = put;\n        strm.avail_out = left;\n        strm.next_in = next;\n        strm.avail_in = have;\n        state.hold = hold;\n        state.bits = bits;\n        //---\n        return Z_NEED_DICT;\n      }\n      strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n      state.mode = TYPE;\n      /* falls through */\n    case TYPE:\n      if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n      /* falls through */\n    case TYPEDO:\n      if (state.last) {\n        //--- BYTEBITS() ---//\n        hold >>>= bits & 7;\n        bits -= bits & 7;\n        //---//\n        state.mode = CHECK;\n        break;\n      }\n      //=== NEEDBITS(3); */\n      while (bits < 3) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      state.last = (hold & 0x01)/*BITS(1)*/;\n      //--- DROPBITS(1) ---//\n      hold >>>= 1;\n      bits -= 1;\n      //---//\n\n      switch ((hold & 0x03)/*BITS(2)*/) {\n      case 0:                             /* stored block */\n        //Tracev((stderr, \"inflate:     stored block%s\\n\",\n        //        state.last ? \" (last)\" : \"\"));\n        state.mode = STORED;\n        break;\n      case 1:                             /* fixed block */\n        fixedtables(state);\n        //Tracev((stderr, \"inflate:     fixed codes block%s\\n\",\n        //        state.last ? \" (last)\" : \"\"));\n        state.mode = LEN_;             /* decode codes */\n        if (flush === Z_TREES) {\n          //--- DROPBITS(2) ---//\n          hold >>>= 2;\n          bits -= 2;\n          //---//\n          break inf_leave;\n        }\n        break;\n      case 2:                             /* dynamic block */\n        //Tracev((stderr, \"inflate:     dynamic codes block%s\\n\",\n        //        state.last ? \" (last)\" : \"\"));\n        state.mode = TABLE;\n        break;\n      case 3:\n        strm.msg = 'invalid block type';\n        state.mode = BAD;\n      }\n      //--- DROPBITS(2) ---//\n      hold >>>= 2;\n      bits -= 2;\n      //---//\n      break;\n    case STORED:\n      //--- BYTEBITS() ---// /* go to byte boundary */\n      hold >>>= bits & 7;\n      bits -= bits & 7;\n      //---//\n      //=== NEEDBITS(32); */\n      while (bits < 32) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n        strm.msg = 'invalid stored block lengths';\n        state.mode = BAD;\n        break;\n      }\n      state.length = hold & 0xffff;\n      //Tracev((stderr, \"inflate:       stored length %u\\n\",\n      //        state.length));\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = COPY_;\n      if (flush === Z_TREES) { break inf_leave; }\n      /* falls through */\n    case COPY_:\n      state.mode = COPY;\n      /* falls through */\n    case COPY:\n      copy = state.length;\n      if (copy) {\n        if (copy > have) { copy = have; }\n        if (copy > left) { copy = left; }\n        if (copy === 0) { break inf_leave; }\n        //--- zmemcpy(put, next, copy); ---\n        utils.arraySet(output, input, next, copy, put);\n        //---//\n        have -= copy;\n        next += copy;\n        left -= copy;\n        put += copy;\n        state.length -= copy;\n        break;\n      }\n      //Tracev((stderr, \"inflate:       stored end\\n\"));\n      state.mode = TYPE;\n      break;\n    case TABLE:\n      //=== NEEDBITS(14); */\n      while (bits < 14) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n      //--- DROPBITS(5) ---//\n      hold >>>= 5;\n      bits -= 5;\n      //---//\n      state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n      //--- DROPBITS(5) ---//\n      hold >>>= 5;\n      bits -= 5;\n      //---//\n      state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n      //--- DROPBITS(4) ---//\n      hold >>>= 4;\n      bits -= 4;\n      //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n      if (state.nlen > 286 || state.ndist > 30) {\n        strm.msg = 'too many length or distance symbols';\n        state.mode = BAD;\n        break;\n      }\n//#endif\n      //Tracev((stderr, \"inflate:       table sizes ok\\n\"));\n      state.have = 0;\n      state.mode = LENLENS;\n      /* falls through */\n    case LENLENS:\n      while (state.have < state.ncode) {\n        //=== NEEDBITS(3);\n        while (bits < 3) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n        //--- DROPBITS(3) ---//\n        hold >>>= 3;\n        bits -= 3;\n        //---//\n      }\n      while (state.have < 19) {\n        state.lens[order[state.have++]] = 0;\n      }\n      // We have separate tables & no pointers. 2 commented lines below not needed.\n      //state.next = state.codes;\n      //state.lencode = state.next;\n      // Switch to use dynamic table\n      state.lencode = state.lendyn;\n      state.lenbits = 7;\n\n      opts = { bits: state.lenbits };\n      ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n      state.lenbits = opts.bits;\n\n      if (ret) {\n        strm.msg = 'invalid code lengths set';\n        state.mode = BAD;\n        break;\n      }\n      //Tracev((stderr, \"inflate:       code lengths ok\\n\"));\n      state.have = 0;\n      state.mode = CODELENS;\n      /* falls through */\n    case CODELENS:\n      while (state.have < state.nlen + state.ndist) {\n        for (;;) {\n          here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if (here_val < 16) {\n          //--- DROPBITS(here.bits) ---//\n          hold >>>= here_bits;\n          bits -= here_bits;\n          //---//\n          state.lens[state.have++] = here_val;\n        }\n        else {\n          if (here_val === 16) {\n            //=== NEEDBITS(here.bits + 2);\n            n = here_bits + 2;\n            while (bits < n) {\n              if (have === 0) { break inf_leave; }\n              have--;\n              hold += input[next++] << bits;\n              bits += 8;\n            }\n            //===//\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            if (state.have === 0) {\n              strm.msg = 'invalid bit length repeat';\n              state.mode = BAD;\n              break;\n            }\n            len = state.lens[state.have - 1];\n            copy = 3 + (hold & 0x03);//BITS(2);\n            //--- DROPBITS(2) ---//\n            hold >>>= 2;\n            bits -= 2;\n            //---//\n          }\n          else if (here_val === 17) {\n            //=== NEEDBITS(here.bits + 3);\n            n = here_bits + 3;\n            while (bits < n) {\n              if (have === 0) { break inf_leave; }\n              have--;\n              hold += input[next++] << bits;\n              bits += 8;\n            }\n            //===//\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            len = 0;\n            copy = 3 + (hold & 0x07);//BITS(3);\n            //--- DROPBITS(3) ---//\n            hold >>>= 3;\n            bits -= 3;\n            //---//\n          }\n          else {\n            //=== NEEDBITS(here.bits + 7);\n            n = here_bits + 7;\n            while (bits < n) {\n              if (have === 0) { break inf_leave; }\n              have--;\n              hold += input[next++] << bits;\n              bits += 8;\n            }\n            //===//\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            len = 0;\n            copy = 11 + (hold & 0x7f);//BITS(7);\n            //--- DROPBITS(7) ---//\n            hold >>>= 7;\n            bits -= 7;\n            //---//\n          }\n          if (state.have + copy > state.nlen + state.ndist) {\n            strm.msg = 'invalid bit length repeat';\n            state.mode = BAD;\n            break;\n          }\n          while (copy--) {\n            state.lens[state.have++] = len;\n          }\n        }\n      }\n\n      /* handle error breaks in while */\n      if (state.mode === BAD) { break; }\n\n      /* check for end-of-block code (better have one) */\n      if (state.lens[256] === 0) {\n        strm.msg = 'invalid code -- missing end-of-block';\n        state.mode = BAD;\n        break;\n      }\n\n      /* build code tables -- note: do not change the lenbits or distbits\n         values here (9 and 6) without reading the comments in inftrees.h\n         concerning the ENOUGH constants, which depend on those values */\n      state.lenbits = 9;\n\n      opts = { bits: state.lenbits };\n      ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n      // We have separate tables & no pointers. 2 commented lines below not needed.\n      // state.next_index = opts.table_index;\n      state.lenbits = opts.bits;\n      // state.lencode = state.next;\n\n      if (ret) {\n        strm.msg = 'invalid literal/lengths set';\n        state.mode = BAD;\n        break;\n      }\n\n      state.distbits = 6;\n      //state.distcode.copy(state.codes);\n      // Switch to use dynamic table\n      state.distcode = state.distdyn;\n      opts = { bits: state.distbits };\n      ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n      // We have separate tables & no pointers. 2 commented lines below not needed.\n      // state.next_index = opts.table_index;\n      state.distbits = opts.bits;\n      // state.distcode = state.next;\n\n      if (ret) {\n        strm.msg = 'invalid distances set';\n        state.mode = BAD;\n        break;\n      }\n      //Tracev((stderr, 'inflate:       codes ok\\n'));\n      state.mode = LEN_;\n      if (flush === Z_TREES) { break inf_leave; }\n      /* falls through */\n    case LEN_:\n      state.mode = LEN;\n      /* falls through */\n    case LEN:\n      if (have >= 6 && left >= 258) {\n        //--- RESTORE() ---\n        strm.next_out = put;\n        strm.avail_out = left;\n        strm.next_in = next;\n        strm.avail_in = have;\n        state.hold = hold;\n        state.bits = bits;\n        //---\n        inflate_fast(strm, _out);\n        //--- LOAD() ---\n        put = strm.next_out;\n        output = strm.output;\n        left = strm.avail_out;\n        next = strm.next_in;\n        input = strm.input;\n        have = strm.avail_in;\n        hold = state.hold;\n        bits = state.bits;\n        //---\n\n        if (state.mode === TYPE) {\n          state.back = -1;\n        }\n        break;\n      }\n      state.back = 0;\n      for (;;) {\n        here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/\n        here_bits = here >>> 24;\n        here_op = (here >>> 16) & 0xff;\n        here_val = here & 0xffff;\n\n        if (here_bits <= bits) { break; }\n        //--- PULLBYTE() ---//\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n        //---//\n      }\n      if (here_op && (here_op & 0xf0) === 0) {\n        last_bits = here_bits;\n        last_op = here_op;\n        last_val = here_val;\n        for (;;) {\n          here = state.lencode[last_val +\n                  ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((last_bits + here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        //--- DROPBITS(last.bits) ---//\n        hold >>>= last_bits;\n        bits -= last_bits;\n        //---//\n        state.back += last_bits;\n      }\n      //--- DROPBITS(here.bits) ---//\n      hold >>>= here_bits;\n      bits -= here_bits;\n      //---//\n      state.back += here_bits;\n      state.length = here_val;\n      if (here_op === 0) {\n        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n        //        \"inflate:         literal '%c'\\n\" :\n        //        \"inflate:         literal 0x%02x\\n\", here.val));\n        state.mode = LIT;\n        break;\n      }\n      if (here_op & 32) {\n        //Tracevv((stderr, \"inflate:         end of block\\n\"));\n        state.back = -1;\n        state.mode = TYPE;\n        break;\n      }\n      if (here_op & 64) {\n        strm.msg = 'invalid literal/length code';\n        state.mode = BAD;\n        break;\n      }\n      state.extra = here_op & 15;\n      state.mode = LENEXT;\n      /* falls through */\n    case LENEXT:\n      if (state.extra) {\n        //=== NEEDBITS(state.extra);\n        n = state.extra;\n        while (bits < n) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n        //--- DROPBITS(state.extra) ---//\n        hold >>>= state.extra;\n        bits -= state.extra;\n        //---//\n        state.back += state.extra;\n      }\n      //Tracevv((stderr, \"inflate:         length %u\\n\", state.length));\n      state.was = state.length;\n      state.mode = DIST;\n      /* falls through */\n    case DIST:\n      for (;;) {\n        here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n        here_bits = here >>> 24;\n        here_op = (here >>> 16) & 0xff;\n        here_val = here & 0xffff;\n\n        if ((here_bits) <= bits) { break; }\n        //--- PULLBYTE() ---//\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n        //---//\n      }\n      if ((here_op & 0xf0) === 0) {\n        last_bits = here_bits;\n        last_op = here_op;\n        last_val = here_val;\n        for (;;) {\n          here = state.distcode[last_val +\n                  ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((last_bits + here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        //--- DROPBITS(last.bits) ---//\n        hold >>>= last_bits;\n        bits -= last_bits;\n        //---//\n        state.back += last_bits;\n      }\n      //--- DROPBITS(here.bits) ---//\n      hold >>>= here_bits;\n      bits -= here_bits;\n      //---//\n      state.back += here_bits;\n      if (here_op & 64) {\n        strm.msg = 'invalid distance code';\n        state.mode = BAD;\n        break;\n      }\n      state.offset = here_val;\n      state.extra = (here_op) & 15;\n      state.mode = DISTEXT;\n      /* falls through */\n    case DISTEXT:\n      if (state.extra) {\n        //=== NEEDBITS(state.extra);\n        n = state.extra;\n        while (bits < n) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n        //--- DROPBITS(state.extra) ---//\n        hold >>>= state.extra;\n        bits -= state.extra;\n        //---//\n        state.back += state.extra;\n      }\n//#ifdef INFLATE_STRICT\n      if (state.offset > state.dmax) {\n        strm.msg = 'invalid distance too far back';\n        state.mode = BAD;\n        break;\n      }\n//#endif\n      //Tracevv((stderr, \"inflate:         distance %u\\n\", state.offset));\n      state.mode = MATCH;\n      /* falls through */\n    case MATCH:\n      if (left === 0) { break inf_leave; }\n      copy = _out - left;\n      if (state.offset > copy) {         /* copy from window */\n        copy = state.offset - copy;\n        if (copy > state.whave) {\n          if (state.sane) {\n            strm.msg = 'invalid distance too far back';\n            state.mode = BAD;\n            break;\n          }\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//          Trace((stderr, \"inflate.c too far\\n\"));\n//          copy -= state.whave;\n//          if (copy > state.length) { copy = state.length; }\n//          if (copy > left) { copy = left; }\n//          left -= copy;\n//          state.length -= copy;\n//          do {\n//            output[put++] = 0;\n//          } while (--copy);\n//          if (state.length === 0) { state.mode = LEN; }\n//          break;\n//#endif\n        }\n        if (copy > state.wnext) {\n          copy -= state.wnext;\n          from = state.wsize - copy;\n        }\n        else {\n          from = state.wnext - copy;\n        }\n        if (copy > state.length) { copy = state.length; }\n        from_source = state.window;\n      }\n      else {                              /* copy from output */\n        from_source = output;\n        from = put - state.offset;\n        copy = state.length;\n      }\n      if (copy > left) { copy = left; }\n      left -= copy;\n      state.length -= copy;\n      do {\n        output[put++] = from_source[from++];\n      } while (--copy);\n      if (state.length === 0) { state.mode = LEN; }\n      break;\n    case LIT:\n      if (left === 0) { break inf_leave; }\n      output[put++] = state.length;\n      left--;\n      state.mode = LEN;\n      break;\n    case CHECK:\n      if (state.wrap) {\n        //=== NEEDBITS(32);\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          // Use '|' insdead of '+' to make sure that result is signed\n          hold |= input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        _out -= left;\n        strm.total_out += _out;\n        state.total += _out;\n        if (_out) {\n          strm.adler = state.check =\n              /*UPDATE(state.check, put - _out, _out);*/\n              (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));\n\n        }\n        _out = left;\n        // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n        if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n          strm.msg = 'incorrect data check';\n          state.mode = BAD;\n          break;\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        //Tracev((stderr, \"inflate:   check matches trailer\\n\"));\n      }\n      state.mode = LENGTH;\n      /* falls through */\n    case LENGTH:\n      if (state.wrap && state.flags) {\n        //=== NEEDBITS(32);\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (hold !== (state.total & 0xffffffff)) {\n          strm.msg = 'incorrect length check';\n          state.mode = BAD;\n          break;\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        //Tracev((stderr, \"inflate:   length matches trailer\\n\"));\n      }\n      state.mode = DONE;\n      /* falls through */\n    case DONE:\n      ret = Z_STREAM_END;\n      break inf_leave;\n    case BAD:\n      ret = Z_DATA_ERROR;\n      break inf_leave;\n    case MEM:\n      return Z_MEM_ERROR;\n    case SYNC:\n      /* falls through */\n    default:\n      return Z_STREAM_ERROR;\n    }\n  }\n\n  // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n  /*\n     Return from inflate(), updating the total counts and the check value.\n     If there was no progress during the inflate() call, return a buffer\n     error.  Call updatewindow() to create and/or update the window state.\n     Note: a memory error from inflate() is non-recoverable.\n   */\n\n  //--- RESTORE() ---\n  strm.next_out = put;\n  strm.avail_out = left;\n  strm.next_in = next;\n  strm.avail_in = have;\n  state.hold = hold;\n  state.bits = bits;\n  //---\n\n  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n                      (state.mode < CHECK || flush !== Z_FINISH))) {\n    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {\n      state.mode = MEM;\n      return Z_MEM_ERROR;\n    }\n  }\n  _in -= strm.avail_in;\n  _out -= strm.avail_out;\n  strm.total_in += _in;\n  strm.total_out += _out;\n  state.total += _out;\n  if (state.wrap && _out) {\n    strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n      (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));\n  }\n  strm.data_type = state.bits + (state.last ? 64 : 0) +\n                    (state.mode === TYPE ? 128 : 0) +\n                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n  if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {\n    ret = Z_BUF_ERROR;\n  }\n  return ret;\n}\n\nfunction inflateEnd(strm) {\n\n  if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  var state = strm.state;\n  if (state.window) {\n    state.window = null;\n  }\n  strm.state = null;\n  return Z_OK;\n}\n\nfunction inflateGetHeader(strm, head) {\n  var state;\n\n  /* check state */\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }\n\n  /* save header structure */\n  state.head = head;\n  head.done = false;\n  return Z_OK;\n}\n\nfunction inflateSetDictionary(strm, dictionary) {\n  var dictLength = dictionary.length;\n\n  var state;\n  var dictid;\n  var ret;\n\n  /* check state */\n  if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }\n  state = strm.state;\n\n  if (state.wrap !== 0 && state.mode !== DICT) {\n    return Z_STREAM_ERROR;\n  }\n\n  /* check for correct dictionary identifier */\n  if (state.mode === DICT) {\n    dictid = 1; /* adler32(0, null, 0)*/\n    /* dictid = adler32(dictid, dictionary, dictLength); */\n    dictid = adler32(dictid, dictionary, dictLength, 0);\n    if (dictid !== state.check) {\n      return Z_DATA_ERROR;\n    }\n  }\n  /* copy dictionary to window using updatewindow(), which will amend the\n   existing dictionary if appropriate */\n  ret = updatewindow(strm, dictionary, dictLength, dictLength);\n  if (ret) {\n    state.mode = MEM;\n    return Z_MEM_ERROR;\n  }\n  state.havedict = 1;\n  // Tracev((stderr, \"inflate:   dictionary set\\n\"));\n  return Z_OK;\n}\n\nexports.inflateReset = inflateReset;\nexports.inflateReset2 = inflateReset2;\nexports.inflateResetKeep = inflateResetKeep;\nexports.inflateInit = inflateInit;\nexports.inflateInit2 = inflateInit2;\nexports.inflate = inflate;\nexports.inflateEnd = inflateEnd;\nexports.inflateGetHeader = inflateGetHeader;\nexports.inflateSetDictionary = inflateSetDictionary;\nexports.inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nexports.inflateCopy = inflateCopy;\nexports.inflateGetDictionary = inflateGetDictionary;\nexports.inflateMark = inflateMark;\nexports.inflatePrime = inflatePrime;\nexports.inflateSync = inflateSync;\nexports.inflateSyncPoint = inflateSyncPoint;\nexports.inflateUndermine = inflateUndermine;\n*/\n\n},{\"../utils/common\":123,\"./adler32\":125,\"./crc32\":127,\"./inffast\":130,\"./inftrees\":132}],132:[function(require,module,exports){\n'use strict';\n\n\nvar utils = require('../utils/common');\n\nvar MAXBITS = 15;\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\nvar lbase = [ /* Length codes 257..285 base */\n  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n];\n\nvar lext = [ /* Length codes 257..285 extra */\n  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n];\n\nvar dbase = [ /* Distance codes 0..29 base */\n  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n  8193, 12289, 16385, 24577, 0, 0\n];\n\nvar dext = [ /* Distance codes 0..29 extra */\n  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n  28, 28, 29, 29, 64, 64\n];\n\nmodule.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)\n{\n  var bits = opts.bits;\n      //here = opts.here; /* table entry for duplication */\n\n  var len = 0;               /* a code's length in bits */\n  var sym = 0;               /* index of code symbols */\n  var min = 0, max = 0;          /* minimum and maximum code lengths */\n  var root = 0;              /* number of index bits for root table */\n  var curr = 0;              /* number of index bits for current table */\n  var drop = 0;              /* code bits to drop for sub-table */\n  var left = 0;                   /* number of prefix codes available */\n  var used = 0;              /* code entries in table used */\n  var huff = 0;              /* Huffman code */\n  var incr;              /* for incrementing code, index */\n  var fill;              /* index for replicating entries */\n  var low;               /* low bits for current root entry */\n  var mask;              /* mask for low root bits */\n  var next;             /* next available space in table */\n  var base = null;     /* base value table to use */\n  var base_index = 0;\n//  var shoextra;    /* extra bits table to use */\n  var end;                    /* use base and extra for symbol > end */\n  var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */\n  var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */\n  var extra = null;\n  var extra_index = 0;\n\n  var here_bits, here_op, here_val;\n\n  /*\n   Process a set of code lengths to create a canonical Huffman code.  The\n   code lengths are lens[0..codes-1].  Each length corresponds to the\n   symbols 0..codes-1.  The Huffman code is generated by first sorting the\n   symbols by length from short to long, and retaining the symbol order\n   for codes with equal lengths.  Then the code starts with all zero bits\n   for the first code of the shortest length, and the codes are integer\n   increments for the same length, and zeros are appended as the length\n   increases.  For the deflate format, these bits are stored backwards\n   from their more natural integer increment ordering, and so when the\n   decoding tables are built in the large loop below, the integer codes\n   are incremented backwards.\n\n   This routine assumes, but does not check, that all of the entries in\n   lens[] are in the range 0..MAXBITS.  The caller must assure this.\n   1..MAXBITS is interpreted as that code length.  zero means that that\n   symbol does not occur in this code.\n\n   The codes are sorted by computing a count of codes for each length,\n   creating from that a table of starting indices for each length in the\n   sorted table, and then entering the symbols in order in the sorted\n   table.  The sorted table is work[], with that space being provided by\n   the caller.\n\n   The length counts are used for other purposes as well, i.e. finding\n   the minimum and maximum length codes, determining if there are any\n   codes at all, checking for a valid set of lengths, and looking ahead\n   at length counts to determine sub-table sizes when building the\n   decoding tables.\n   */\n\n  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n  for (len = 0; len <= MAXBITS; len++) {\n    count[len] = 0;\n  }\n  for (sym = 0; sym < codes; sym++) {\n    count[lens[lens_index + sym]]++;\n  }\n\n  /* bound code lengths, force root to be within code lengths */\n  root = bits;\n  for (max = MAXBITS; max >= 1; max--) {\n    if (count[max] !== 0) { break; }\n  }\n  if (root > max) {\n    root = max;\n  }\n  if (max === 0) {                     /* no symbols to code at all */\n    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */\n    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;\n    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n    //table.op[opts.table_index] = 64;\n    //table.bits[opts.table_index] = 1;\n    //table.val[opts.table_index++] = 0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n    opts.bits = 1;\n    return 0;     /* no symbols, but wait for decoding to report error */\n  }\n  for (min = 1; min < max; min++) {\n    if (count[min] !== 0) { break; }\n  }\n  if (root < min) {\n    root = min;\n  }\n\n  /* check for an over-subscribed or incomplete set of lengths */\n  left = 1;\n  for (len = 1; len <= MAXBITS; len++) {\n    left <<= 1;\n    left -= count[len];\n    if (left < 0) {\n      return -1;\n    }        /* over-subscribed */\n  }\n  if (left > 0 && (type === CODES || max !== 1)) {\n    return -1;                      /* incomplete set */\n  }\n\n  /* generate offsets into symbol table for each length for sorting */\n  offs[1] = 0;\n  for (len = 1; len < MAXBITS; len++) {\n    offs[len + 1] = offs[len] + count[len];\n  }\n\n  /* sort symbols by length, by symbol order within each length */\n  for (sym = 0; sym < codes; sym++) {\n    if (lens[lens_index + sym] !== 0) {\n      work[offs[lens[lens_index + sym]]++] = sym;\n    }\n  }\n\n  /*\n   Create and fill in decoding tables.  In this loop, the table being\n   filled is at next and has curr index bits.  The code being used is huff\n   with length len.  That code is converted to an index by dropping drop\n   bits off of the bottom.  For codes where len is less than drop + curr,\n   those top drop + curr - len bits are incremented through all values to\n   fill the table with replicated entries.\n\n   root is the number of index bits for the root table.  When len exceeds\n   root, sub-tables are created pointed to by the root entry with an index\n   of the low root bits of huff.  This is saved in low to check for when a\n   new sub-table should be started.  drop is zero when the root table is\n   being filled, and drop is root when sub-tables are being filled.\n\n   When a new sub-table is needed, it is necessary to look ahead in the\n   code lengths to determine what size sub-table is needed.  The length\n   counts are used for this, and so count[] is decremented as codes are\n   entered in the tables.\n\n   used keeps track of how many table entries have been allocated from the\n   provided *table space.  It is checked for LENS and DIST tables against\n   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n   the initial root table size constants.  See the comments in inftrees.h\n   for more information.\n\n   sym increments through all symbols, and the loop terminates when\n   all codes of length max, i.e. all codes, have been processed.  This\n   routine permits incomplete codes, so another loop after this one fills\n   in the rest of the decoding tables with invalid code markers.\n   */\n\n  /* set up for code type */\n  // poor man optimization - use if-else instead of switch,\n  // to avoid deopts in old v8\n  if (type === CODES) {\n    base = extra = work;    /* dummy value--not used */\n    end = 19;\n\n  } else if (type === LENS) {\n    base = lbase;\n    base_index -= 257;\n    extra = lext;\n    extra_index -= 257;\n    end = 256;\n\n  } else {                    /* DISTS */\n    base = dbase;\n    extra = dext;\n    end = -1;\n  }\n\n  /* initialize opts for loop */\n  huff = 0;                   /* starting code */\n  sym = 0;                    /* starting code symbol */\n  len = min;                  /* starting code length */\n  next = table_index;              /* current table to fill in */\n  curr = root;                /* current table index bits */\n  drop = 0;                   /* current bits to drop from code for index */\n  low = -1;                   /* trigger new sub-table when len > root */\n  used = 1 << root;          /* use root table entries */\n  mask = used - 1;            /* mask for comparing low */\n\n  /* check available table space */\n  if ((type === LENS && used > ENOUGH_LENS) ||\n    (type === DISTS && used > ENOUGH_DISTS)) {\n    return 1;\n  }\n\n  var i = 0;\n  /* process all codes and make table entries */\n  for (;;) {\n    i++;\n    /* create table entry */\n    here_bits = len - drop;\n    if (work[sym] < end) {\n      here_op = 0;\n      here_val = work[sym];\n    }\n    else if (work[sym] > end) {\n      here_op = extra[extra_index + work[sym]];\n      here_val = base[base_index + work[sym]];\n    }\n    else {\n      here_op = 32 + 64;         /* end of block */\n      here_val = 0;\n    }\n\n    /* replicate for those indices with low len bits equal to huff */\n    incr = 1 << (len - drop);\n    fill = 1 << curr;\n    min = fill;                 /* save offset to next table */\n    do {\n      fill -= incr;\n      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n    } while (fill !== 0);\n\n    /* backwards increment the len-bit code huff */\n    incr = 1 << (len - 1);\n    while (huff & incr) {\n      incr >>= 1;\n    }\n    if (incr !== 0) {\n      huff &= incr - 1;\n      huff += incr;\n    } else {\n      huff = 0;\n    }\n\n    /* go to next symbol, update count, len */\n    sym++;\n    if (--count[len] === 0) {\n      if (len === max) { break; }\n      len = lens[lens_index + work[sym]];\n    }\n\n    /* create new sub-table if needed */\n    if (len > root && (huff & mask) !== low) {\n      /* if first time, transition to sub-tables */\n      if (drop === 0) {\n        drop = root;\n      }\n\n      /* increment past last table */\n      next += min;            /* here min is 1 << curr */\n\n      /* determine length of next table */\n      curr = len - drop;\n      left = 1 << curr;\n      while (curr + drop < max) {\n        left -= count[curr + drop];\n        if (left <= 0) { break; }\n        curr++;\n        left <<= 1;\n      }\n\n      /* check for enough space */\n      used += 1 << curr;\n      if ((type === LENS && used > ENOUGH_LENS) ||\n        (type === DISTS && used > ENOUGH_DISTS)) {\n        return 1;\n      }\n\n      /* point entry in root table to sub-table */\n      low = huff & mask;\n      /*table.op[low] = curr;\n      table.bits[low] = root;\n      table.val[low] = next - opts.table_index;*/\n      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n    }\n  }\n\n  /* fill in remaining table entry if code is incomplete (guaranteed to have\n   at most one remaining entry, since if the code is incomplete, the\n   maximum code length that was allowed to get this far is one bit) */\n  if (huff !== 0) {\n    //table.op[next + huff] = 64;            /* invalid code marker */\n    //table.bits[next + huff] = len - drop;\n    //table.val[next + huff] = 0;\n    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n  }\n\n  /* set return parameters */\n  //opts.table_index += used;\n  opts.bits = root;\n  return 0;\n};\n\n},{\"../utils/common\":123}],133:[function(require,module,exports){\n'use strict';\n\nmodule.exports = {\n  2:      'need dictionary',     /* Z_NEED_DICT       2  */\n  1:      'stream end',          /* Z_STREAM_END      1  */\n  0:      '',                    /* Z_OK              0  */\n  '-1':   'file error',          /* Z_ERRNO         (-1) */\n  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */\n  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */\n  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */\n  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */\n  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n},{}],134:[function(require,module,exports){\n'use strict';\n\n\nvar utils = require('../utils/common');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//var Z_FILTERED          = 1;\n//var Z_HUFFMAN_ONLY      = 2;\n//var Z_RLE               = 3;\nvar Z_FIXED               = 4;\n//var Z_DEFAULT_STRATEGY  = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nvar Z_BINARY              = 0;\nvar Z_TEXT                = 1;\n//var Z_ASCII             = 1; // = Z_TEXT\nvar Z_UNKNOWN             = 2;\n\n/*============================================================================*/\n\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nvar STORED_BLOCK = 0;\nvar STATIC_TREES = 1;\nvar DYN_TREES    = 2;\n/* The three kinds of block type */\n\nvar MIN_MATCH    = 3;\nvar MAX_MATCH    = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nvar LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nvar LITERALS      = 256;\n/* number of literal bytes 0..255 */\n\nvar L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nvar D_CODES       = 30;\n/* number of distance codes */\n\nvar BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\n\nvar HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\n\nvar MAX_BITS      = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar Buf_size      = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nvar MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nvar END_BLOCK   = 256;\n/* end of block literal code */\n\nvar REP_3_6     = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nvar REPZ_3_10   = 17;\n/* repeat a zero length 3-10 times  (3 bits of repeat count) */\n\nvar REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times  (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nvar extra_lbits =   /* extra bits for each length code */\n  [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];\n\nvar extra_dbits =   /* extra bits for each distance code */\n  [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];\n\nvar extra_blbits =  /* extra bits for each bit length code */\n  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];\n\nvar bl_order =\n  [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nvar DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1\nvar static_ltree  = new Array((L_CODES + 2) * 2);\nzero(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nvar static_dtree  = new Array(D_CODES * 2);\nzero(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nvar _dist_code    = new Array(DIST_CODE_LEN);\nzero(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nvar _length_code  = new Array(MAX_MATCH - MIN_MATCH + 1);\nzero(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nvar base_length   = new Array(LENGTH_CODES);\nzero(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nvar base_dist     = new Array(D_CODES);\nzero(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n  this.static_tree  = static_tree;  /* static tree or NULL */\n  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */\n  this.extra_base   = extra_base;   /* base index for extra_bits */\n  this.elems        = elems;        /* max number of elements in the tree */\n  this.max_length   = max_length;   /* max bit length for the codes */\n\n  // show if `static_tree` has data or dummy - needed for monomorphic objects\n  this.has_stree    = static_tree && static_tree.length;\n}\n\n\nvar static_l_desc;\nvar static_d_desc;\nvar static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n  this.dyn_tree = dyn_tree;     /* the dynamic tree */\n  this.max_code = 0;            /* largest code with non zero frequency */\n  this.stat_desc = stat_desc;   /* the corresponding static tree */\n}\n\n\n\nfunction d_code(dist) {\n  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n}\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nfunction put_short(s, w) {\n//    put_byte(s, (uch)((w) & 0xff));\n//    put_byte(s, (uch)((ush)(w) >> 8));\n  s.pending_buf[s.pending++] = (w) & 0xff;\n  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n}\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nfunction send_bits(s, value, length) {\n  if (s.bi_valid > (Buf_size - length)) {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    put_short(s, s.bi_buf);\n    s.bi_buf = value >> (Buf_size - s.bi_valid);\n    s.bi_valid += length - Buf_size;\n  } else {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    s.bi_valid += length;\n  }\n}\n\n\nfunction send_code(s, c, tree) {\n  send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n}\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nfunction bi_reverse(code, len) {\n  var res = 0;\n  do {\n    res |= code & 1;\n    code >>>= 1;\n    res <<= 1;\n  } while (--len > 0);\n  return res >>> 1;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nfunction bi_flush(s) {\n  if (s.bi_valid === 16) {\n    put_short(s, s.bi_buf);\n    s.bi_buf = 0;\n    s.bi_valid = 0;\n\n  } else if (s.bi_valid >= 8) {\n    s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n    s.bi_buf >>= 8;\n    s.bi_valid -= 8;\n  }\n}\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n *    above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n *     array bl_count contains the frequencies for each bit length.\n *     The length opt_len is updated; static_len is also updated if stree is\n *     not null.\n */\nfunction gen_bitlen(s, desc)\n//    deflate_state *s;\n//    tree_desc *desc;    /* the tree descriptor */\n{\n  var tree            = desc.dyn_tree;\n  var max_code        = desc.max_code;\n  var stree           = desc.stat_desc.static_tree;\n  var has_stree       = desc.stat_desc.has_stree;\n  var extra           = desc.stat_desc.extra_bits;\n  var base            = desc.stat_desc.extra_base;\n  var max_length      = desc.stat_desc.max_length;\n  var h;              /* heap index */\n  var n, m;           /* iterate over the tree elements */\n  var bits;           /* bit length */\n  var xbits;          /* extra bits */\n  var f;              /* frequency */\n  var overflow = 0;   /* number of elements with bit length too large */\n\n  for (bits = 0; bits <= MAX_BITS; bits++) {\n    s.bl_count[bits] = 0;\n  }\n\n  /* In a first pass, compute the optimal bit lengths (which may\n   * overflow in the case of the bit length tree).\n   */\n  tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n  for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {\n    n = s.heap[h];\n    bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n    if (bits > max_length) {\n      bits = max_length;\n      overflow++;\n    }\n    tree[n * 2 + 1]/*.Len*/ = bits;\n    /* We overwrite tree[n].Dad which is no longer needed */\n\n    if (n > max_code) { continue; } /* not a leaf node */\n\n    s.bl_count[bits]++;\n    xbits = 0;\n    if (n >= base) {\n      xbits = extra[n - base];\n    }\n    f = tree[n * 2]/*.Freq*/;\n    s.opt_len += f * (bits + xbits);\n    if (has_stree) {\n      s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n    }\n  }\n  if (overflow === 0) { return; }\n\n  // Trace((stderr,\"\\nbit length overflow\\n\"));\n  /* This happens for example on obj2 and pic of the Calgary corpus */\n\n  /* Find the first bit length which could increase: */\n  do {\n    bits = max_length - 1;\n    while (s.bl_count[bits] === 0) { bits--; }\n    s.bl_count[bits]--;      /* move one leaf down the tree */\n    s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n    s.bl_count[max_length]--;\n    /* The brother of the overflow item also moves one step up,\n     * but this does not affect bl_count[max_length]\n     */\n    overflow -= 2;\n  } while (overflow > 0);\n\n  /* Now recompute all bit lengths, scanning in increasing frequency.\n   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n   * lengths instead of fixing only the wrong ones. This idea is taken\n   * from 'ar' written by Haruhiko Okumura.)\n   */\n  for (bits = max_length; bits !== 0; bits--) {\n    n = s.bl_count[bits];\n    while (n !== 0) {\n      m = s.heap[--h];\n      if (m > max_code) { continue; }\n      if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n        // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n        s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n        tree[m * 2 + 1]/*.Len*/ = bits;\n      }\n      n--;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n *     zero code length.\n */\nfunction gen_codes(tree, max_code, bl_count)\n//    ct_data *tree;             /* the tree to decorate */\n//    int max_code;              /* largest code with non zero frequency */\n//    ushf *bl_count;            /* number of codes at each bit length */\n{\n  var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */\n  var code = 0;              /* running code value */\n  var bits;                  /* bit index */\n  var n;                     /* code index */\n\n  /* The distribution counts are first used to generate the code values\n   * without bit reversal.\n   */\n  for (bits = 1; bits <= MAX_BITS; bits++) {\n    next_code[bits] = code = (code + bl_count[bits - 1]) << 1;\n  }\n  /* Check that the bit counts in bl_count are consistent. The last code\n   * must be all ones.\n   */\n  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n  //        \"inconsistent bit counts\");\n  //Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n  for (n = 0;  n <= max_code; n++) {\n    var len = tree[n * 2 + 1]/*.Len*/;\n    if (len === 0) { continue; }\n    /* Now reverse the bits */\n    tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);\n\n    //Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n  }\n}\n\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nfunction tr_static_init() {\n  var n;        /* iterates over tree elements */\n  var bits;     /* bit counter */\n  var length;   /* length value */\n  var code;     /* code value */\n  var dist;     /* distance index */\n  var bl_count = new Array(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  // do check in _tr_init()\n  //if (static_init_done) return;\n\n  /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n  static_l_desc.static_tree = static_ltree;\n  static_l_desc.extra_bits = extra_lbits;\n  static_d_desc.static_tree = static_dtree;\n  static_d_desc.extra_bits = extra_dbits;\n  static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n  /* Initialize the mapping length (0..255) -> length code (0..28) */\n  length = 0;\n  for (code = 0; code < LENGTH_CODES - 1; code++) {\n    base_length[code] = length;\n    for (n = 0; n < (1 << extra_lbits[code]); n++) {\n      _length_code[length++] = code;\n    }\n  }\n  //Assert (length == 256, \"tr_static_init: length != 256\");\n  /* Note that the length 255 (match length 258) can be represented\n   * in two different ways: code 284 + 5 bits or code 285, so we\n   * overwrite length_code[255] to use the best encoding:\n   */\n  _length_code[length - 1] = code;\n\n  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n  dist = 0;\n  for (code = 0; code < 16; code++) {\n    base_dist[code] = dist;\n    for (n = 0; n < (1 << extra_dbits[code]); n++) {\n      _dist_code[dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: dist != 256\");\n  dist >>= 7; /* from now on, all distances are divided by 128 */\n  for (; code < D_CODES; code++) {\n    base_dist[code] = dist << 7;\n    for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n      _dist_code[256 + dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n  /* Construct the codes of the static literal tree */\n  for (bits = 0; bits <= MAX_BITS; bits++) {\n    bl_count[bits] = 0;\n  }\n\n  n = 0;\n  while (n <= 143) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  while (n <= 255) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 9;\n    n++;\n    bl_count[9]++;\n  }\n  while (n <= 279) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 7;\n    n++;\n    bl_count[7]++;\n  }\n  while (n <= 287) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  /* Codes 286 and 287 do not exist, but we must include them in the\n   * tree construction to get a canonical Huffman tree (longest code\n   * all ones)\n   */\n  gen_codes(static_ltree, L_CODES + 1, bl_count);\n\n  /* The static distance tree is trivial: */\n  for (n = 0; n < D_CODES; n++) {\n    static_dtree[n * 2 + 1]/*.Len*/ = 5;\n    static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n  }\n\n  // Now data ready and we can init static trees\n  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);\n  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);\n  static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);\n\n  //static_init_done = true;\n}\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nfunction init_block(s) {\n  var n; /* iterates over tree elements */\n\n  /* Initialize the trees. */\n  for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n  s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n  s.opt_len = s.static_len = 0;\n  s.last_lit = s.matches = 0;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nfunction bi_windup(s)\n{\n  if (s.bi_valid > 8) {\n    put_short(s, s.bi_buf);\n  } else if (s.bi_valid > 0) {\n    //put_byte(s, (Byte)s->bi_buf);\n    s.pending_buf[s.pending++] = s.bi_buf;\n  }\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n}\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nfunction copy_block(s, buf, len, header)\n//DeflateState *s;\n//charf    *buf;    /* the input data */\n//unsigned len;     /* its length */\n//int      header;  /* true if block header must be written */\n{\n  bi_windup(s);        /* align on byte boundary */\n\n  if (header) {\n    put_short(s, len);\n    put_short(s, ~len);\n  }\n//  while (len--) {\n//    put_byte(s, *buf++);\n//  }\n  utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);\n  s.pending += len;\n}\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nfunction smaller(tree, n, m, depth) {\n  var _n2 = n * 2;\n  var _m2 = m * 2;\n  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n}\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nfunction pqdownheap(s, tree, k)\n//    deflate_state *s;\n//    ct_data *tree;  /* the tree to restore */\n//    int k;               /* node to move down */\n{\n  var v = s.heap[k];\n  var j = k << 1;  /* left son of k */\n  while (j <= s.heap_len) {\n    /* Set j to the smallest of the two sons: */\n    if (j < s.heap_len &&\n      smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n      j++;\n    }\n    /* Exit if v is smaller than both sons */\n    if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n    /* Exchange v with the smallest son */\n    s.heap[k] = s.heap[j];\n    k = j;\n\n    /* And continue down the tree, setting j to the left son of k */\n    j <<= 1;\n  }\n  s.heap[k] = v;\n}\n\n\n// inlined manually\n// var SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nfunction compress_block(s, ltree, dtree)\n//    deflate_state *s;\n//    const ct_data *ltree; /* literal tree */\n//    const ct_data *dtree; /* distance tree */\n{\n  var dist;           /* distance of matched string */\n  var lc;             /* match length or unmatched char (if dist == 0) */\n  var lx = 0;         /* running index in l_buf */\n  var code;           /* the code to send */\n  var extra;          /* number of extra bits to send */\n\n  if (s.last_lit !== 0) {\n    do {\n      dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);\n      lc = s.pending_buf[s.l_buf + lx];\n      lx++;\n\n      if (dist === 0) {\n        send_code(s, lc, ltree); /* send a literal byte */\n        //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n      } else {\n        /* Here, lc is the match length - MIN_MATCH */\n        code = _length_code[lc];\n        send_code(s, code + LITERALS + 1, ltree); /* send the length code */\n        extra = extra_lbits[code];\n        if (extra !== 0) {\n          lc -= base_length[code];\n          send_bits(s, lc, extra);       /* send the extra length bits */\n        }\n        dist--; /* dist is now the match distance - 1 */\n        code = d_code(dist);\n        //Assert (code < D_CODES, \"bad d_code\");\n\n        send_code(s, code, dtree);       /* send the distance code */\n        extra = extra_dbits[code];\n        if (extra !== 0) {\n          dist -= base_dist[code];\n          send_bits(s, dist, extra);   /* send the extra distance bits */\n        }\n      } /* literal or match pair ? */\n\n      /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n      //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n      //       \"pendingBuf overflow\");\n\n    } while (lx < s.last_lit);\n  }\n\n  send_code(s, END_BLOCK, ltree);\n}\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n *     and corresponding code. The length opt_len is updated; static_len is\n *     also updated if stree is not null. The field max_code is set.\n */\nfunction build_tree(s, desc)\n//    deflate_state *s;\n//    tree_desc *desc; /* the tree descriptor */\n{\n  var tree     = desc.dyn_tree;\n  var stree    = desc.stat_desc.static_tree;\n  var has_stree = desc.stat_desc.has_stree;\n  var elems    = desc.stat_desc.elems;\n  var n, m;          /* iterate over heap elements */\n  var max_code = -1; /* largest code with non zero frequency */\n  var node;          /* new node being created */\n\n  /* Construct the initial heap, with least frequent element in\n   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n   * heap[0] is not used.\n   */\n  s.heap_len = 0;\n  s.heap_max = HEAP_SIZE;\n\n  for (n = 0; n < elems; n++) {\n    if (tree[n * 2]/*.Freq*/ !== 0) {\n      s.heap[++s.heap_len] = max_code = n;\n      s.depth[n] = 0;\n\n    } else {\n      tree[n * 2 + 1]/*.Len*/ = 0;\n    }\n  }\n\n  /* The pkzip format requires that at least one distance code exists,\n   * and that at least one bit should be sent even if there is only one\n   * possible code. So to avoid special checks later on we force at least\n   * two codes of non zero frequency.\n   */\n  while (s.heap_len < 2) {\n    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n    tree[node * 2]/*.Freq*/ = 1;\n    s.depth[node] = 0;\n    s.opt_len--;\n\n    if (has_stree) {\n      s.static_len -= stree[node * 2 + 1]/*.Len*/;\n    }\n    /* node is 0 or 1 so it does not have extra bits */\n  }\n  desc.max_code = max_code;\n\n  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n   * establish sub-heaps of increasing lengths:\n   */\n  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n  /* Construct the Huffman tree by repeatedly combining the least two\n   * frequent nodes.\n   */\n  node = elems;              /* next internal node of the tree */\n  do {\n    //pqremove(s, tree, n);  /* n = node of least frequency */\n    /*** pqremove ***/\n    n = s.heap[1/*SMALLEST*/];\n    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n    /***/\n\n    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n    s.heap[--s.heap_max] = m;\n\n    /* Create a new node father of n and m */\n    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n    tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n    /* and insert the new node in the heap */\n    s.heap[1/*SMALLEST*/] = node++;\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n\n  } while (s.heap_len >= 2);\n\n  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n  /* At this point, the fields freq and dad are set. We can now\n   * generate the bit lengths.\n   */\n  gen_bitlen(s, desc);\n\n  /* The field len is now set, we can generate the bit codes */\n  gen_codes(tree, max_code, s.bl_count);\n}\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nfunction scan_tree(s, tree, max_code)\n//    deflate_state *s;\n//    ct_data *tree;   /* the tree to be scanned */\n//    int max_code;    /* and its largest code of non zero frequency */\n{\n  var n;                     /* iterates over all tree elements */\n  var prevlen = -1;          /* last emitted length */\n  var curlen;                /* length of current code */\n\n  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  var count = 0;             /* repeat count of the current code */\n  var max_count = 7;         /* max repeat count */\n  var min_count = 4;         /* min repeat count */\n\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n  tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n    } else if (curlen !== 0) {\n\n      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n      s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n    } else if (count <= 10) {\n      s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n    } else {\n      s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n    }\n\n    count = 0;\n    prevlen = curlen;\n\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nfunction send_tree(s, tree, max_code)\n//    deflate_state *s;\n//    ct_data *tree; /* the tree to be scanned */\n//    int max_code;       /* and its largest code of non zero frequency */\n{\n  var n;                     /* iterates over all tree elements */\n  var prevlen = -1;          /* last emitted length */\n  var curlen;                /* length of current code */\n\n  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  var count = 0;             /* repeat count of the current code */\n  var max_count = 7;         /* max repeat count */\n  var min_count = 4;         /* min repeat count */\n\n  /* tree[max_code+1].Len = -1; */  /* guard already set */\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n    } else if (curlen !== 0) {\n      if (curlen !== prevlen) {\n        send_code(s, curlen, s.bl_tree);\n        count--;\n      }\n      //Assert(count >= 3 && count <= 6, \" 3_6?\");\n      send_code(s, REP_3_6, s.bl_tree);\n      send_bits(s, count - 3, 2);\n\n    } else if (count <= 10) {\n      send_code(s, REPZ_3_10, s.bl_tree);\n      send_bits(s, count - 3, 3);\n\n    } else {\n      send_code(s, REPZ_11_138, s.bl_tree);\n      send_bits(s, count - 11, 7);\n    }\n\n    count = 0;\n    prevlen = curlen;\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nfunction build_bl_tree(s) {\n  var max_blindex;  /* index of last bit length code of non zero freq */\n\n  /* Determine the bit length frequencies for literal and distance trees */\n  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n  /* Build the bit length tree: */\n  build_tree(s, s.bl_desc);\n  /* opt_len now includes the length of the tree representations, except\n   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n   */\n\n  /* Determine the number of bit length codes to send. The pkzip format\n   * requires that at least 4 bit length codes be sent. (appnote.txt says\n   * 3 but the actual value used is 4.)\n   */\n  for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {\n    if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n      break;\n    }\n  }\n  /* Update opt_len to include the bit length tree and counts */\n  s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n  //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n  //        s->opt_len, s->static_len));\n\n  return max_blindex;\n}\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nfunction send_all_trees(s, lcodes, dcodes, blcodes)\n//    deflate_state *s;\n//    int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n  var rank;                    /* index in bl_order */\n\n  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n  //        \"too many codes\");\n  //Tracev((stderr, \"\\nbl counts: \"));\n  send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n  send_bits(s, dcodes - 1,   5);\n  send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */\n  for (rank = 0; rank < blcodes; rank++) {\n    //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n    send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n  }\n  //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n  //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n  //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n}\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n *    a) There are no non-portable control characters belonging to the\n *       \"black list\" (0..6, 14..25, 28..31).\n *    b) There is at least one printable character belonging to the\n *       \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n *   \"gray list\" that is ignored in this detection algorithm:\n *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nfunction detect_data_type(s) {\n  /* black_mask is the bit mask of black-listed bytes\n   * set bits 0..6, 14..25, and 28..31\n   * 0xf3ffc07f = binary 11110011111111111100000001111111\n   */\n  var black_mask = 0xf3ffc07f;\n  var n;\n\n  /* Check for non-textual (\"black-listed\") bytes. */\n  for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n    if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n      return Z_BINARY;\n    }\n  }\n\n  /* Check for textual (\"white-listed\") bytes. */\n  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n    return Z_TEXT;\n  }\n  for (n = 32; n < LITERALS; n++) {\n    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n      return Z_TEXT;\n    }\n  }\n\n  /* There are no \"black-listed\" or \"white-listed\" bytes:\n   * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n   */\n  return Z_BINARY;\n}\n\n\nvar static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nfunction _tr_init(s)\n{\n\n  if (!static_init_done) {\n    tr_static_init();\n    static_init_done = true;\n  }\n\n  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);\n  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);\n  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n\n  /* Initialize the first block of the first file: */\n  init_block(s);\n}\n\n\n/* ===========================================================================\n * Send a stored block\n */\nfunction _tr_stored_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf;       /* input block */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n{\n  send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */\n  copy_block(s, buf, stored_len, true); /* with header */\n}\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nfunction _tr_align(s) {\n  send_bits(s, STATIC_TREES << 1, 3);\n  send_code(s, END_BLOCK, static_ltree);\n  bi_flush(s);\n}\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nfunction _tr_flush_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf;       /* input block, or NULL if too old */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n{\n  var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */\n  var max_blindex = 0;        /* index of last bit length code of non zero freq */\n\n  /* Build the Huffman trees unless a stored block is forced */\n  if (s.level > 0) {\n\n    /* Check if the file is binary or text */\n    if (s.strm.data_type === Z_UNKNOWN) {\n      s.strm.data_type = detect_data_type(s);\n    }\n\n    /* Construct the literal and distance trees */\n    build_tree(s, s.l_desc);\n    // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n\n    build_tree(s, s.d_desc);\n    // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n    /* At this point, opt_len and static_len are the total bit lengths of\n     * the compressed block data, excluding the tree representations.\n     */\n\n    /* Build the bit length tree for the above two trees, and get the index\n     * in bl_order of the last bit length code to send.\n     */\n    max_blindex = build_bl_tree(s);\n\n    /* Determine the best encoding. Compute the block lengths in bytes. */\n    opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n    static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n    // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n    //        s->last_lit));\n\n    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n  } else {\n    // Assert(buf != (char*)0, \"lost buf\");\n    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n  }\n\n  if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n    /* 4: two words for the lengths */\n\n    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n     * Otherwise we can't have processed more than WSIZE input bytes since\n     * the last block flush, because compression would have been\n     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n     * transform a block into a stored block.\n     */\n    _tr_stored_block(s, buf, stored_len, last);\n\n  } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {\n\n    send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n    compress_block(s, static_ltree, static_dtree);\n\n  } else {\n    send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n    send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n    compress_block(s, s.dyn_ltree, s.dyn_dtree);\n  }\n  // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n  /* The above check is made mod 2^32, for files larger than 512 MB\n   * and uLong implemented on 32 bits.\n   */\n  init_block(s);\n\n  if (last) {\n    bi_windup(s);\n  }\n  // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n  //       s->compressed_len-7*last));\n}\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nfunction _tr_tally(s, dist, lc)\n//    deflate_state *s;\n//    unsigned dist;  /* distance of matched string */\n//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n  //var out_length, in_length, dcode;\n\n  s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;\n  s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n  s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n  s.last_lit++;\n\n  if (dist === 0) {\n    /* lc is the unmatched char */\n    s.dyn_ltree[lc * 2]/*.Freq*/++;\n  } else {\n    s.matches++;\n    /* Here, lc is the match length - MIN_MATCH */\n    dist--;             /* dist = match distance - 1 */\n    //Assert((ush)dist < (ush)MAX_DIST(s) &&\n    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n    //       (ush)d_code(dist) < (ush)D_CODES,  \"_tr_tally: bad match\");\n\n    s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;\n    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n  }\n\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n//  /* Try to guess if it is profitable to stop the current block here */\n//  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n//    /* Compute an upper bound for the compressed length */\n//    out_length = s.last_lit*8;\n//    in_length = s.strstart - s.block_start;\n//\n//    for (dcode = 0; dcode < D_CODES; dcode++) {\n//      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n//    }\n//    out_length >>>= 3;\n//    //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n//    //       s->last_lit, in_length, out_length,\n//    //       100L - out_length*100L/in_length));\n//    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n//      return true;\n//    }\n//  }\n//#endif\n\n  return (s.last_lit === s.lit_bufsize - 1);\n  /* We avoid equality with lit_bufsize because of wraparound at 64K\n   * on 16 bit machines and because stored blocks are restricted to\n   * 64K-1 bytes.\n   */\n}\n\nexports._tr_init  = _tr_init;\nexports._tr_stored_block = _tr_stored_block;\nexports._tr_flush_block  = _tr_flush_block;\nexports._tr_tally = _tr_tally;\nexports._tr_align = _tr_align;\n\n},{\"../utils/common\":123}],135:[function(require,module,exports){\n'use strict';\n\n\nfunction ZStream() {\n  /* next input byte */\n  this.input = null; // JS specific, because we have no pointers\n  this.next_in = 0;\n  /* number of bytes available at input */\n  this.avail_in = 0;\n  /* total number of input bytes read so far */\n  this.total_in = 0;\n  /* next output byte should be put there */\n  this.output = null; // JS specific, because we have no pointers\n  this.next_out = 0;\n  /* remaining free space at output */\n  this.avail_out = 0;\n  /* total number of bytes output so far */\n  this.total_out = 0;\n  /* last error message, NULL if no error */\n  this.msg = ''/*Z_NULL*/;\n  /* not visible by applications */\n  this.state = null;\n  /* best guess about the data type: binary or text */\n  this.data_type = 2/*Z_UNKNOWN*/;\n  /* adler32 value of the uncompressed data */\n  this.adler = 0;\n}\n\nmodule.exports = ZStream;\n\n},{}],136:[function(require,module,exports){\n(function (process){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n  // if the path tries to go above the root, `up` ends up > 0\n  var up = 0;\n  for (var i = parts.length - 1; i >= 0; i--) {\n    var last = parts[i];\n    if (last === '.') {\n      parts.splice(i, 1);\n    } else if (last === '..') {\n      parts.splice(i, 1);\n      up++;\n    } else if (up) {\n      parts.splice(i, 1);\n      up--;\n    }\n  }\n\n  // if the path is allowed to go above the root, restore leading ..s\n  if (allowAboveRoot) {\n    for (; up--; up) {\n      parts.unshift('..');\n    }\n  }\n\n  return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n    /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar splitPath = function(filename) {\n  return splitPathRe.exec(filename).slice(1);\n};\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n  var resolvedPath = '',\n      resolvedAbsolute = false;\n\n  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n    var path = (i >= 0) ? arguments[i] : process.cwd();\n\n    // Skip empty and invalid entries\n    if (typeof path !== 'string') {\n      throw new TypeError('Arguments to path.resolve must be strings');\n    } else if (!path) {\n      continue;\n    }\n\n    resolvedPath = path + '/' + resolvedPath;\n    resolvedAbsolute = path.charAt(0) === '/';\n  }\n\n  // At this point the path should be resolved to a full absolute path, but\n  // handle relative paths to be safe (might happen when process.cwd() fails)\n\n  // Normalize the path\n  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n    return !!p;\n  }), !resolvedAbsolute).join('/');\n\n  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n  var isAbsolute = exports.isAbsolute(path),\n      trailingSlash = substr(path, -1) === '/';\n\n  // Normalize the path\n  path = normalizeArray(filter(path.split('/'), function(p) {\n    return !!p;\n  }), !isAbsolute).join('/');\n\n  if (!path && !isAbsolute) {\n    path = '.';\n  }\n  if (path && trailingSlash) {\n    path += '/';\n  }\n\n  return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n  return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n  var paths = Array.prototype.slice.call(arguments, 0);\n  return exports.normalize(filter(paths, function(p, index) {\n    if (typeof p !== 'string') {\n      throw new TypeError('Arguments to path.join must be strings');\n    }\n    return p;\n  }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n  from = exports.resolve(from).substr(1);\n  to = exports.resolve(to).substr(1);\n\n  function trim(arr) {\n    var start = 0;\n    for (; start < arr.length; start++) {\n      if (arr[start] !== '') break;\n    }\n\n    var end = arr.length - 1;\n    for (; end >= 0; end--) {\n      if (arr[end] !== '') break;\n    }\n\n    if (start > end) return [];\n    return arr.slice(start, end - start + 1);\n  }\n\n  var fromParts = trim(from.split('/'));\n  var toParts = trim(to.split('/'));\n\n  var length = Math.min(fromParts.length, toParts.length);\n  var samePartsLength = length;\n  for (var i = 0; i < length; i++) {\n    if (fromParts[i] !== toParts[i]) {\n      samePartsLength = i;\n      break;\n    }\n  }\n\n  var outputParts = [];\n  for (var i = samePartsLength; i < fromParts.length; i++) {\n    outputParts.push('..');\n  }\n\n  outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n  return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function(path) {\n  var result = splitPath(path),\n      root = result[0],\n      dir = result[1];\n\n  if (!root && !dir) {\n    // No dirname whatsoever\n    return '.';\n  }\n\n  if (dir) {\n    // It has a dirname, strip trailing slash\n    dir = dir.substr(0, dir.length - 1);\n  }\n\n  return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n  var f = splitPath(path)[2];\n  // TODO: make this comparison case-insensitive on windows?\n  if (ext && f.substr(-1 * ext.length) === ext) {\n    f = f.substr(0, f.length - ext.length);\n  }\n  return f;\n};\n\n\nexports.extname = function(path) {\n  return splitPath(path)[3];\n};\n\nfunction filter (xs, f) {\n    if (xs.filter) return xs.filter(f);\n    var res = [];\n    for (var i = 0; i < xs.length; i++) {\n        if (f(xs[i], i, xs)) res.push(xs[i]);\n    }\n    return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n    ? function (str, start, len) { return str.substr(start, len) }\n    : function (str, start, len) {\n        if (start < 0) start = str.length + start;\n        return str.substr(start, len);\n    }\n;\n\n}).call(this,require('_process'))\n},{\"_process\":138}],137:[function(require,module,exports){\n(function (process){\n'use strict';\n\nif (!process.version ||\n    process.version.indexOf('v0.') === 0 ||\n    process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {\n  module.exports = nextTick;\n} else {\n  module.exports = process.nextTick;\n}\n\nfunction nextTick(fn, arg1, arg2, arg3) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('\"callback\" argument must be a function');\n  }\n  var len = arguments.length;\n  var args, i;\n  switch (len) {\n  case 0:\n  case 1:\n    return process.nextTick(fn);\n  case 2:\n    return process.nextTick(function afterTickOne() {\n      fn.call(null, arg1);\n    });\n  case 3:\n    return process.nextTick(function afterTickTwo() {\n      fn.call(null, arg1, arg2);\n    });\n  case 4:\n    return process.nextTick(function afterTickThree() {\n      fn.call(null, arg1, arg2, arg3);\n    });\n  default:\n    args = new Array(len - 1);\n    i = 0;\n    while (i < args.length) {\n      args[i++] = arguments[i];\n    }\n    return process.nextTick(function afterTick() {\n      fn.apply(null, args);\n    });\n  }\n}\n\n}).call(this,require('_process'))\n},{\"_process\":138}],138:[function(require,module,exports){\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],139:[function(require,module,exports){\nmodule.exports = require(\"./lib/_stream_duplex.js\")\n\n},{\"./lib/_stream_duplex.js\":140}],140:[function(require,module,exports){\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n\n'use strict';\n\n/*<replacement>*/\n\nvar objectKeys = Object.keys || function (obj) {\n  var keys = [];\n  for (var key in obj) {\n    keys.push(key);\n  }return keys;\n};\n/*</replacement>*/\n\nmodule.exports = Duplex;\n\n/*<replacement>*/\nvar processNextTick = require('process-nextick-args');\n/*</replacement>*/\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nvar Readable = require('./_stream_readable');\nvar Writable = require('./_stream_writable');\n\nutil.inherits(Duplex, Readable);\n\nvar keys = objectKeys(Writable.prototype);\nfor (var v = 0; v < keys.length; v++) {\n  var method = keys[v];\n  if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n}\n\nfunction Duplex(options) {\n  if (!(this instanceof Duplex)) return new Duplex(options);\n\n  Readable.call(this, options);\n  Writable.call(this, options);\n\n  if (options && options.readable === false) this.readable = false;\n\n  if (options && options.writable === false) this.writable = false;\n\n  this.allowHalfOpen = true;\n  if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;\n\n  this.once('end', onend);\n}\n\n// the no-half-open enforcer\nfunction onend() {\n  // if we allow half-open state, or if the writable side ended,\n  // then we're ok.\n  if (this.allowHalfOpen || this._writableState.ended) return;\n\n  // no more data can be written.\n  // But allow more writes to happen in this tick.\n  processNextTick(onEndNT, this);\n}\n\nfunction onEndNT(self) {\n  self.end();\n}\n\nfunction forEach(xs, f) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    f(xs[i], i);\n  }\n}\n},{\"./_stream_readable\":142,\"./_stream_writable\":144,\"core-util-is\":78,\"inherits\":81,\"process-nextick-args\":137}],141:[function(require,module,exports){\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n\n'use strict';\n\nmodule.exports = PassThrough;\n\nvar Transform = require('./_stream_transform');\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nutil.inherits(PassThrough, Transform);\n\nfunction PassThrough(options) {\n  if (!(this instanceof PassThrough)) return new PassThrough(options);\n\n  Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n  cb(null, chunk);\n};\n},{\"./_stream_transform\":143,\"core-util-is\":78,\"inherits\":81}],142:[function(require,module,exports){\n(function (process){\n'use strict';\n\nmodule.exports = Readable;\n\n/*<replacement>*/\nvar processNextTick = require('process-nextick-args');\n/*</replacement>*/\n\n/*<replacement>*/\nvar isArray = require('isarray');\n/*</replacement>*/\n\n/*<replacement>*/\nvar Duplex;\n/*</replacement>*/\n\nReadable.ReadableState = ReadableState;\n\n/*<replacement>*/\nvar EE = require('events').EventEmitter;\n\nvar EElistenerCount = function (emitter, type) {\n  return emitter.listeners(type).length;\n};\n/*</replacement>*/\n\n/*<replacement>*/\nvar Stream;\n(function () {\n  try {\n    Stream = require('st' + 'ream');\n  } catch (_) {} finally {\n    if (!Stream) Stream = require('events').EventEmitter;\n  }\n})();\n/*</replacement>*/\n\nvar Buffer = require('buffer').Buffer;\n/*<replacement>*/\nvar bufferShim = require('buffer-shims');\n/*</replacement>*/\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\n/*<replacement>*/\nvar debugUtil = require('util');\nvar debug = void 0;\nif (debugUtil && debugUtil.debuglog) {\n  debug = debugUtil.debuglog('stream');\n} else {\n  debug = function () {};\n}\n/*</replacement>*/\n\nvar BufferList = require('./internal/streams/BufferList');\nvar StringDecoder;\n\nutil.inherits(Readable, Stream);\n\nfunction prependListener(emitter, event, fn) {\n  // Sadly this is not cacheable as some libraries bundle their own\n  // event emitter implementation with them.\n  if (typeof emitter.prependListener === 'function') {\n    return emitter.prependListener(event, fn);\n  } else {\n    // This is a hack to make sure that our error handler is attached before any\n    // userland ones.  NEVER DO THIS. This is here only because this code needs\n    // to continue to work with older versions of Node.js that do not include\n    // the prependListener() method. The goal is to eventually remove this hack.\n    if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];\n  }\n}\n\nfunction ReadableState(options, stream) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  options = options || {};\n\n  // object stream flag. Used to make read(n) ignore n and to\n  // make all the buffer merging and length checks go away\n  this.objectMode = !!options.objectMode;\n\n  if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode;\n\n  // the point at which it stops calling _read() to fill the buffer\n  // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n  var hwm = options.highWaterMark;\n  var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n  this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;\n\n  // cast to ints.\n  this.highWaterMark = ~~this.highWaterMark;\n\n  // A linked list is used to store data chunks instead of an array because the\n  // linked list can remove elements from the beginning faster than\n  // array.shift()\n  this.buffer = new BufferList();\n  this.length = 0;\n  this.pipes = null;\n  this.pipesCount = 0;\n  this.flowing = null;\n  this.ended = false;\n  this.endEmitted = false;\n  this.reading = false;\n\n  // a flag to be able to tell if the onwrite cb is called immediately,\n  // or on a later tick.  We set this to true at first, because any\n  // actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first write call.\n  this.sync = true;\n\n  // whenever we return null, then we set a flag to say\n  // that we're awaiting a 'readable' event emission.\n  this.needReadable = false;\n  this.emittedReadable = false;\n  this.readableListening = false;\n  this.resumeScheduled = false;\n\n  // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n  this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n  // when piping, we only care about 'readable' events that happen\n  // after read()ing all the bytes and not getting any pushback.\n  this.ranOut = false;\n\n  // the number of writers that are awaiting a drain event in .pipe()s\n  this.awaitDrain = 0;\n\n  // if true, a maybeReadMore has been scheduled\n  this.readingMore = false;\n\n  this.decoder = null;\n  this.encoding = null;\n  if (options.encoding) {\n    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n    this.decoder = new StringDecoder(options.encoding);\n    this.encoding = options.encoding;\n  }\n}\n\nfunction Readable(options) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  if (!(this instanceof Readable)) return new Readable(options);\n\n  this._readableState = new ReadableState(options, this);\n\n  // legacy\n  this.readable = true;\n\n  if (options && typeof options.read === 'function') this._read = options.read;\n\n  Stream.call(this);\n}\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function (chunk, encoding) {\n  var state = this._readableState;\n\n  if (!state.objectMode && typeof chunk === 'string') {\n    encoding = encoding || state.defaultEncoding;\n    if (encoding !== state.encoding) {\n      chunk = bufferShim.from(chunk, encoding);\n      encoding = '';\n    }\n  }\n\n  return readableAddChunk(this, state, chunk, encoding, false);\n};\n\n// Unshift should *always* be something directly out of read()\nReadable.prototype.unshift = function (chunk) {\n  var state = this._readableState;\n  return readableAddChunk(this, state, chunk, '', true);\n};\n\nReadable.prototype.isPaused = function () {\n  return this._readableState.flowing === false;\n};\n\nfunction readableAddChunk(stream, state, chunk, encoding, addToFront) {\n  var er = chunkInvalid(state, chunk);\n  if (er) {\n    stream.emit('error', er);\n  } else if (chunk === null) {\n    state.reading = false;\n    onEofChunk(stream, state);\n  } else if (state.objectMode || chunk && chunk.length > 0) {\n    if (state.ended && !addToFront) {\n      var e = new Error('stream.push() after EOF');\n      stream.emit('error', e);\n    } else if (state.endEmitted && addToFront) {\n      var _e = new Error('stream.unshift() after end event');\n      stream.emit('error', _e);\n    } else {\n      var skipAdd;\n      if (state.decoder && !addToFront && !encoding) {\n        chunk = state.decoder.write(chunk);\n        skipAdd = !state.objectMode && chunk.length === 0;\n      }\n\n      if (!addToFront) state.reading = false;\n\n      // Don't add to the buffer if we've decoded to an empty string chunk and\n      // we're not in object mode\n      if (!skipAdd) {\n        // if we want the data now, just emit it.\n        if (state.flowing && state.length === 0 && !state.sync) {\n          stream.emit('data', chunk);\n          stream.read(0);\n        } else {\n          // update the buffer info.\n          state.length += state.objectMode ? 1 : chunk.length;\n          if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n\n          if (state.needReadable) emitReadable(stream);\n        }\n      }\n\n      maybeReadMore(stream, state);\n    }\n  } else if (!addToFront) {\n    state.reading = false;\n  }\n\n  return needMoreData(state);\n}\n\n// if it's past the high water mark, we can push in some more.\n// Also, if we have no data yet, we can stand some\n// more bytes.  This is to work around cases where hwm=0,\n// such as the repl.  Also, if the push() triggered a\n// readable event, and the user called read(largeNumber) such that\n// needReadable was set, then we ought to push more, so that another\n// 'readable' event will be triggered.\nfunction needMoreData(state) {\n  return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);\n}\n\n// backwards compatibility.\nReadable.prototype.setEncoding = function (enc) {\n  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n  this._readableState.decoder = new StringDecoder(enc);\n  this._readableState.encoding = enc;\n  return this;\n};\n\n// Don't raise the hwm > 8MB\nvar MAX_HWM = 0x800000;\nfunction computeNewHighWaterMark(n) {\n  if (n >= MAX_HWM) {\n    n = MAX_HWM;\n  } else {\n    // Get the next highest power of 2 to prevent increasing hwm excessively in\n    // tiny amounts\n    n--;\n    n |= n >>> 1;\n    n |= n >>> 2;\n    n |= n >>> 4;\n    n |= n >>> 8;\n    n |= n >>> 16;\n    n++;\n  }\n  return n;\n}\n\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction howMuchToRead(n, state) {\n  if (n <= 0 || state.length === 0 && state.ended) return 0;\n  if (state.objectMode) return 1;\n  if (n !== n) {\n    // Only flow one buffer at a time\n    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n  }\n  // If we're asking for more than the current hwm, then raise the hwm.\n  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n  if (n <= state.length) return n;\n  // Don't have enough\n  if (!state.ended) {\n    state.needReadable = true;\n    return 0;\n  }\n  return state.length;\n}\n\n// you can override either this method, or the async _read(n) below.\nReadable.prototype.read = function (n) {\n  debug('read', n);\n  n = parseInt(n, 10);\n  var state = this._readableState;\n  var nOrig = n;\n\n  if (n !== 0) state.emittedReadable = false;\n\n  // if we're doing read(0) to trigger a readable event, but we\n  // already have a bunch of data in the buffer, then just trigger\n  // the 'readable' event and move on.\n  if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {\n    debug('read: emitReadable', state.length, state.ended);\n    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n    return null;\n  }\n\n  n = howMuchToRead(n, state);\n\n  // if we've ended, and we're now clear, then finish it up.\n  if (n === 0 && state.ended) {\n    if (state.length === 0) endReadable(this);\n    return null;\n  }\n\n  // All the actual chunk generation logic needs to be\n  // *below* the call to _read.  The reason is that in certain\n  // synthetic stream cases, such as passthrough streams, _read\n  // may be a completely synchronous operation which may change\n  // the state of the read buffer, providing enough data when\n  // before there was *not* enough.\n  //\n  // So, the steps are:\n  // 1. Figure out what the state of things will be after we do\n  // a read from the buffer.\n  //\n  // 2. If that resulting state will trigger a _read, then call _read.\n  // Note that this may be asynchronous, or synchronous.  Yes, it is\n  // deeply ugly to write APIs this way, but that still doesn't mean\n  // that the Readable class should behave improperly, as streams are\n  // designed to be sync/async agnostic.\n  // Take note if the _read call is sync or async (ie, if the read call\n  // has returned yet), so that we know whether or not it's safe to emit\n  // 'readable' etc.\n  //\n  // 3. Actually pull the requested chunks out of the buffer and return.\n\n  // if we need a readable event, then we need to do some reading.\n  var doRead = state.needReadable;\n  debug('need readable', doRead);\n\n  // if we currently have less than the highWaterMark, then also read some\n  if (state.length === 0 || state.length - n < state.highWaterMark) {\n    doRead = true;\n    debug('length less than watermark', doRead);\n  }\n\n  // however, if we've ended, then there's no point, and if we're already\n  // reading, then it's unnecessary.\n  if (state.ended || state.reading) {\n    doRead = false;\n    debug('reading or ended', doRead);\n  } else if (doRead) {\n    debug('do read');\n    state.reading = true;\n    state.sync = true;\n    // if the length is currently zero, then we *need* a readable event.\n    if (state.length === 0) state.needReadable = true;\n    // call internal read method\n    this._read(state.highWaterMark);\n    state.sync = false;\n    // If _read pushed data synchronously, then `reading` will be false,\n    // and we need to re-evaluate how much data we can return to the user.\n    if (!state.reading) n = howMuchToRead(nOrig, state);\n  }\n\n  var ret;\n  if (n > 0) ret = fromList(n, state);else ret = null;\n\n  if (ret === null) {\n    state.needReadable = true;\n    n = 0;\n  } else {\n    state.length -= n;\n  }\n\n  if (state.length === 0) {\n    // If we have nothing in the buffer, then we want to know\n    // as soon as we *do* get something into the buffer.\n    if (!state.ended) state.needReadable = true;\n\n    // If we tried to read() past the EOF, then emit end on the next tick.\n    if (nOrig !== n && state.ended) endReadable(this);\n  }\n\n  if (ret !== null) this.emit('data', ret);\n\n  return ret;\n};\n\nfunction chunkInvalid(state, chunk) {\n  var er = null;\n  if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) {\n    er = new TypeError('Invalid non-string/buffer chunk');\n  }\n  return er;\n}\n\nfunction onEofChunk(stream, state) {\n  if (state.ended) return;\n  if (state.decoder) {\n    var chunk = state.decoder.end();\n    if (chunk && chunk.length) {\n      state.buffer.push(chunk);\n      state.length += state.objectMode ? 1 : chunk.length;\n    }\n  }\n  state.ended = true;\n\n  // emit 'readable' now to make sure it gets picked up.\n  emitReadable(stream);\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow.  This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n  var state = stream._readableState;\n  state.needReadable = false;\n  if (!state.emittedReadable) {\n    debug('emitReadable', state.flowing);\n    state.emittedReadable = true;\n    if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream);\n  }\n}\n\nfunction emitReadable_(stream) {\n  debug('emit readable');\n  stream.emit('readable');\n  flow(stream);\n}\n\n// at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data.  that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n  if (!state.readingMore) {\n    state.readingMore = true;\n    processNextTick(maybeReadMore_, stream, state);\n  }\n}\n\nfunction maybeReadMore_(stream, state) {\n  var len = state.length;\n  while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {\n    debug('maybeReadMore read 0');\n    stream.read(0);\n    if (len === state.length)\n      // didn't get any data, stop spinning.\n      break;else len = state.length;\n  }\n  state.readingMore = false;\n}\n\n// abstract method.  to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function (n) {\n  this.emit('error', new Error('_read() is not implemented'));\n};\n\nReadable.prototype.pipe = function (dest, pipeOpts) {\n  var src = this;\n  var state = this._readableState;\n\n  switch (state.pipesCount) {\n    case 0:\n      state.pipes = dest;\n      break;\n    case 1:\n      state.pipes = [state.pipes, dest];\n      break;\n    default:\n      state.pipes.push(dest);\n      break;\n  }\n  state.pipesCount += 1;\n  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n\n  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;\n\n  var endFn = doEnd ? onend : cleanup;\n  if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn);\n\n  dest.on('unpipe', onunpipe);\n  function onunpipe(readable) {\n    debug('onunpipe');\n    if (readable === src) {\n      cleanup();\n    }\n  }\n\n  function onend() {\n    debug('onend');\n    dest.end();\n  }\n\n  // when the dest drains, it reduces the awaitDrain counter\n  // on the source.  This would be more elegant with a .once()\n  // handler in flow(), but adding and removing repeatedly is\n  // too slow.\n  var ondrain = pipeOnDrain(src);\n  dest.on('drain', ondrain);\n\n  var cleanedUp = false;\n  function cleanup() {\n    debug('cleanup');\n    // cleanup event handlers once the pipe is broken\n    dest.removeListener('close', onclose);\n    dest.removeListener('finish', onfinish);\n    dest.removeListener('drain', ondrain);\n    dest.removeListener('error', onerror);\n    dest.removeListener('unpipe', onunpipe);\n    src.removeListener('end', onend);\n    src.removeListener('end', cleanup);\n    src.removeListener('data', ondata);\n\n    cleanedUp = true;\n\n    // if the reader is waiting for a drain event from this\n    // specific writer, then it would cause it to never start\n    // flowing again.\n    // So, if this is awaiting a drain, then we just call it now.\n    // If we don't know, then assume that we are waiting for one.\n    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n  }\n\n  // If the user pushes more data while we're writing to dest then we'll end up\n  // in ondata again. However, we only want to increase awaitDrain once because\n  // dest will only emit one 'drain' event for the multiple writes.\n  // => Introduce a guard on increasing awaitDrain.\n  var increasedAwaitDrain = false;\n  src.on('data', ondata);\n  function ondata(chunk) {\n    debug('ondata');\n    increasedAwaitDrain = false;\n    var ret = dest.write(chunk);\n    if (false === ret && !increasedAwaitDrain) {\n      // If the user unpiped during `dest.write()`, it is possible\n      // to get stuck in a permanently paused state if that write\n      // also returned false.\n      // => Check whether `dest` is still a piping destination.\n      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n        debug('false write response, pause', src._readableState.awaitDrain);\n        src._readableState.awaitDrain++;\n        increasedAwaitDrain = true;\n      }\n      src.pause();\n    }\n  }\n\n  // if the dest has an error, then stop piping into it.\n  // however, don't suppress the throwing behavior for this.\n  function onerror(er) {\n    debug('onerror', er);\n    unpipe();\n    dest.removeListener('error', onerror);\n    if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);\n  }\n\n  // Make sure our error handler is attached before userland ones.\n  prependListener(dest, 'error', onerror);\n\n  // Both close and finish should trigger unpipe, but only once.\n  function onclose() {\n    dest.removeListener('finish', onfinish);\n    unpipe();\n  }\n  dest.once('close', onclose);\n  function onfinish() {\n    debug('onfinish');\n    dest.removeListener('close', onclose);\n    unpipe();\n  }\n  dest.once('finish', onfinish);\n\n  function unpipe() {\n    debug('unpipe');\n    src.unpipe(dest);\n  }\n\n  // tell the dest that it's being piped to\n  dest.emit('pipe', src);\n\n  // start the flow if it hasn't been started already.\n  if (!state.flowing) {\n    debug('pipe resume');\n    src.resume();\n  }\n\n  return dest;\n};\n\nfunction pipeOnDrain(src) {\n  return function () {\n    var state = src._readableState;\n    debug('pipeOnDrain', state.awaitDrain);\n    if (state.awaitDrain) state.awaitDrain--;\n    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {\n      state.flowing = true;\n      flow(src);\n    }\n  };\n}\n\nReadable.prototype.unpipe = function (dest) {\n  var state = this._readableState;\n\n  // if we're not piping anywhere, then do nothing.\n  if (state.pipesCount === 0) return this;\n\n  // just one destination.  most common case.\n  if (state.pipesCount === 1) {\n    // passed in one, but it's not the right one.\n    if (dest && dest !== state.pipes) return this;\n\n    if (!dest) dest = state.pipes;\n\n    // got a match.\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n    if (dest) dest.emit('unpipe', this);\n    return this;\n  }\n\n  // slow case. multiple pipe destinations.\n\n  if (!dest) {\n    // remove all.\n    var dests = state.pipes;\n    var len = state.pipesCount;\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n\n    for (var i = 0; i < len; i++) {\n      dests[i].emit('unpipe', this);\n    }return this;\n  }\n\n  // try to find the right one.\n  var index = indexOf(state.pipes, dest);\n  if (index === -1) return this;\n\n  state.pipes.splice(index, 1);\n  state.pipesCount -= 1;\n  if (state.pipesCount === 1) state.pipes = state.pipes[0];\n\n  dest.emit('unpipe', this);\n\n  return this;\n};\n\n// set up data events if they are asked for\n// Ensure readable listeners eventually get something\nReadable.prototype.on = function (ev, fn) {\n  var res = Stream.prototype.on.call(this, ev, fn);\n\n  if (ev === 'data') {\n    // Start flowing on next tick if stream isn't explicitly paused\n    if (this._readableState.flowing !== false) this.resume();\n  } else if (ev === 'readable') {\n    var state = this._readableState;\n    if (!state.endEmitted && !state.readableListening) {\n      state.readableListening = state.needReadable = true;\n      state.emittedReadable = false;\n      if (!state.reading) {\n        processNextTick(nReadingNextTick, this);\n      } else if (state.length) {\n        emitReadable(this, state);\n      }\n    }\n  }\n\n  return res;\n};\nReadable.prototype.addListener = Readable.prototype.on;\n\nfunction nReadingNextTick(self) {\n  debug('readable nexttick read 0');\n  self.read(0);\n}\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function () {\n  var state = this._readableState;\n  if (!state.flowing) {\n    debug('resume');\n    state.flowing = true;\n    resume(this, state);\n  }\n  return this;\n};\n\nfunction resume(stream, state) {\n  if (!state.resumeScheduled) {\n    state.resumeScheduled = true;\n    processNextTick(resume_, stream, state);\n  }\n}\n\nfunction resume_(stream, state) {\n  if (!state.reading) {\n    debug('resume read 0');\n    stream.read(0);\n  }\n\n  state.resumeScheduled = false;\n  state.awaitDrain = 0;\n  stream.emit('resume');\n  flow(stream);\n  if (state.flowing && !state.reading) stream.read(0);\n}\n\nReadable.prototype.pause = function () {\n  debug('call pause flowing=%j', this._readableState.flowing);\n  if (false !== this._readableState.flowing) {\n    debug('pause');\n    this._readableState.flowing = false;\n    this.emit('pause');\n  }\n  return this;\n};\n\nfunction flow(stream) {\n  var state = stream._readableState;\n  debug('flow', state.flowing);\n  while (state.flowing && stream.read() !== null) {}\n}\n\n// wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function (stream) {\n  var state = this._readableState;\n  var paused = false;\n\n  var self = this;\n  stream.on('end', function () {\n    debug('wrapped end');\n    if (state.decoder && !state.ended) {\n      var chunk = state.decoder.end();\n      if (chunk && chunk.length) self.push(chunk);\n    }\n\n    self.push(null);\n  });\n\n  stream.on('data', function (chunk) {\n    debug('wrapped data');\n    if (state.decoder) chunk = state.decoder.write(chunk);\n\n    // don't skip over falsy values in objectMode\n    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n\n    var ret = self.push(chunk);\n    if (!ret) {\n      paused = true;\n      stream.pause();\n    }\n  });\n\n  // proxy all the other methods.\n  // important when wrapping filters and duplexes.\n  for (var i in stream) {\n    if (this[i] === undefined && typeof stream[i] === 'function') {\n      this[i] = function (method) {\n        return function () {\n          return stream[method].apply(stream, arguments);\n        };\n      }(i);\n    }\n  }\n\n  // proxy certain important events.\n  var events = ['error', 'close', 'destroy', 'pause', 'resume'];\n  forEach(events, function (ev) {\n    stream.on(ev, self.emit.bind(self, ev));\n  });\n\n  // when we try to consume some more bytes, simply unpause the\n  // underlying stream.\n  self._read = function (n) {\n    debug('wrapped _read', n);\n    if (paused) {\n      paused = false;\n      stream.resume();\n    }\n  };\n\n  return self;\n};\n\n// exposed for testing purposes only.\nReadable._fromList = fromList;\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromList(n, state) {\n  // nothing buffered\n  if (state.length === 0) return null;\n\n  var ret;\n  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n    // read it all, truncate the list\n    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);\n    state.buffer.clear();\n  } else {\n    // read part of list\n    ret = fromListPartial(n, state.buffer, state.decoder);\n  }\n\n  return ret;\n}\n\n// Extracts only enough buffered data to satisfy the amount requested.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromListPartial(n, list, hasStrings) {\n  var ret;\n  if (n < list.head.data.length) {\n    // slice is the same for buffers and strings\n    ret = list.head.data.slice(0, n);\n    list.head.data = list.head.data.slice(n);\n  } else if (n === list.head.data.length) {\n    // first chunk is a perfect match\n    ret = list.shift();\n  } else {\n    // result spans more than one buffer\n    ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);\n  }\n  return ret;\n}\n\n// Copies a specified amount of characters from the list of buffered data\n// chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBufferString(n, list) {\n  var p = list.head;\n  var c = 1;\n  var ret = p.data;\n  n -= ret.length;\n  while (p = p.next) {\n    var str = p.data;\n    var nb = n > str.length ? str.length : n;\n    if (nb === str.length) ret += str;else ret += str.slice(0, n);\n    n -= nb;\n    if (n === 0) {\n      if (nb === str.length) {\n        ++c;\n        if (p.next) list.head = p.next;else list.head = list.tail = null;\n      } else {\n        list.head = p;\n        p.data = str.slice(nb);\n      }\n      break;\n    }\n    ++c;\n  }\n  list.length -= c;\n  return ret;\n}\n\n// Copies a specified amount of bytes from the list of buffered data chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBuffer(n, list) {\n  var ret = bufferShim.allocUnsafe(n);\n  var p = list.head;\n  var c = 1;\n  p.data.copy(ret);\n  n -= p.data.length;\n  while (p = p.next) {\n    var buf = p.data;\n    var nb = n > buf.length ? buf.length : n;\n    buf.copy(ret, ret.length - n, 0, nb);\n    n -= nb;\n    if (n === 0) {\n      if (nb === buf.length) {\n        ++c;\n        if (p.next) list.head = p.next;else list.head = list.tail = null;\n      } else {\n        list.head = p;\n        p.data = buf.slice(nb);\n      }\n      break;\n    }\n    ++c;\n  }\n  list.length -= c;\n  return ret;\n}\n\nfunction endReadable(stream) {\n  var state = stream._readableState;\n\n  // If we get here before consuming all the bytes, then that is a\n  // bug in node.  Should never happen.\n  if (state.length > 0) throw new Error('\"endReadable()\" called on non-empty stream');\n\n  if (!state.endEmitted) {\n    state.ended = true;\n    processNextTick(endReadableNT, state, stream);\n  }\n}\n\nfunction endReadableNT(state, stream) {\n  // Check that we didn't get one last unshift.\n  if (!state.endEmitted && state.length === 0) {\n    state.endEmitted = true;\n    stream.readable = false;\n    stream.emit('end');\n  }\n}\n\nfunction forEach(xs, f) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    f(xs[i], i);\n  }\n}\n\nfunction indexOf(xs, x) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    if (xs[i] === x) return i;\n  }\n  return -1;\n}\n}).call(this,require('_process'))\n},{\"./_stream_duplex\":140,\"./internal/streams/BufferList\":145,\"_process\":138,\"buffer\":77,\"buffer-shims\":76,\"core-util-is\":78,\"events\":79,\"inherits\":81,\"isarray\":83,\"process-nextick-args\":137,\"string_decoder/\":152,\"util\":75}],143:[function(require,module,exports){\n// a transform stream is a readable/writable stream where you do\n// something with the data.  Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored.  (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation.  For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes.  When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up.  When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer.  When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks.  If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk.  However,\n// a pathological inflate type of transform can cause excessive buffering\n// here.  For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output.  In this case, you could write a very small\n// amount of input, and end up with a very large amount of output.  In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform.  A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n\n'use strict';\n\nmodule.exports = Transform;\n\nvar Duplex = require('./_stream_duplex');\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nutil.inherits(Transform, Duplex);\n\nfunction TransformState(stream) {\n  this.afterTransform = function (er, data) {\n    return afterTransform(stream, er, data);\n  };\n\n  this.needTransform = false;\n  this.transforming = false;\n  this.writecb = null;\n  this.writechunk = null;\n  this.writeencoding = null;\n}\n\nfunction afterTransform(stream, er, data) {\n  var ts = stream._transformState;\n  ts.transforming = false;\n\n  var cb = ts.writecb;\n\n  if (!cb) return stream.emit('error', new Error('no writecb in Transform class'));\n\n  ts.writechunk = null;\n  ts.writecb = null;\n\n  if (data !== null && data !== undefined) stream.push(data);\n\n  cb(er);\n\n  var rs = stream._readableState;\n  rs.reading = false;\n  if (rs.needReadable || rs.length < rs.highWaterMark) {\n    stream._read(rs.highWaterMark);\n  }\n}\n\nfunction Transform(options) {\n  if (!(this instanceof Transform)) return new Transform(options);\n\n  Duplex.call(this, options);\n\n  this._transformState = new TransformState(this);\n\n  var stream = this;\n\n  // start out asking for a readable event once data is transformed.\n  this._readableState.needReadable = true;\n\n  // we have implemented the _read method, and done the other things\n  // that Readable wants before the first _read call, so unset the\n  // sync guard flag.\n  this._readableState.sync = false;\n\n  if (options) {\n    if (typeof options.transform === 'function') this._transform = options.transform;\n\n    if (typeof options.flush === 'function') this._flush = options.flush;\n  }\n\n  // When the writable side finishes, then flush out anything remaining.\n  this.once('prefinish', function () {\n    if (typeof this._flush === 'function') this._flush(function (er, data) {\n      done(stream, er, data);\n    });else done(stream);\n  });\n}\n\nTransform.prototype.push = function (chunk, encoding) {\n  this._transformState.needTransform = false;\n  return Duplex.prototype.push.call(this, chunk, encoding);\n};\n\n// This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side.  You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk.  If you pass\n// an error, then that'll put the hurt on the whole operation.  If you\n// never call cb(), then you'll never get another chunk.\nTransform.prototype._transform = function (chunk, encoding, cb) {\n  throw new Error('_transform() is not implemented');\n};\n\nTransform.prototype._write = function (chunk, encoding, cb) {\n  var ts = this._transformState;\n  ts.writecb = cb;\n  ts.writechunk = chunk;\n  ts.writeencoding = encoding;\n  if (!ts.transforming) {\n    var rs = this._readableState;\n    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n  }\n};\n\n// Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\nTransform.prototype._read = function (n) {\n  var ts = this._transformState;\n\n  if (ts.writechunk !== null && ts.writecb && !ts.transforming) {\n    ts.transforming = true;\n    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n  } else {\n    // mark that we need a transform, so that any data that comes in\n    // will get processed, now that we've asked for it.\n    ts.needTransform = true;\n  }\n};\n\nfunction done(stream, er, data) {\n  if (er) return stream.emit('error', er);\n\n  if (data !== null && data !== undefined) stream.push(data);\n\n  // if there's nothing in the write buffer, then that means\n  // that nothing more will ever be provided\n  var ws = stream._writableState;\n  var ts = stream._transformState;\n\n  if (ws.length) throw new Error('Calling transform done when ws.length != 0');\n\n  if (ts.transforming) throw new Error('Calling transform done when still transforming');\n\n  return stream.push(null);\n}\n},{\"./_stream_duplex\":140,\"core-util-is\":78,\"inherits\":81}],144:[function(require,module,exports){\n(function (process){\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n\n'use strict';\n\nmodule.exports = Writable;\n\n/*<replacement>*/\nvar processNextTick = require('process-nextick-args');\n/*</replacement>*/\n\n/*<replacement>*/\nvar asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick;\n/*</replacement>*/\n\n/*<replacement>*/\nvar Duplex;\n/*</replacement>*/\n\nWritable.WritableState = WritableState;\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\n/*<replacement>*/\nvar internalUtil = {\n  deprecate: require('util-deprecate')\n};\n/*</replacement>*/\n\n/*<replacement>*/\nvar Stream;\n(function () {\n  try {\n    Stream = require('st' + 'ream');\n  } catch (_) {} finally {\n    if (!Stream) Stream = require('events').EventEmitter;\n  }\n})();\n/*</replacement>*/\n\nvar Buffer = require('buffer').Buffer;\n/*<replacement>*/\nvar bufferShim = require('buffer-shims');\n/*</replacement>*/\n\nutil.inherits(Writable, Stream);\n\nfunction nop() {}\n\nfunction WriteReq(chunk, encoding, cb) {\n  this.chunk = chunk;\n  this.encoding = encoding;\n  this.callback = cb;\n  this.next = null;\n}\n\nfunction WritableState(options, stream) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  options = options || {};\n\n  // object stream flag to indicate whether or not this stream\n  // contains buffers or objects.\n  this.objectMode = !!options.objectMode;\n\n  if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode;\n\n  // the point at which write() starts returning false\n  // Note: 0 is a valid value, means that we always return false if\n  // the entire buffer is not flushed immediately on write()\n  var hwm = options.highWaterMark;\n  var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n  this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;\n\n  // cast to ints.\n  this.highWaterMark = ~~this.highWaterMark;\n\n  // drain event flag.\n  this.needDrain = false;\n  // at the start of calling end()\n  this.ending = false;\n  // when end() has been called, and returned\n  this.ended = false;\n  // when 'finish' is emitted\n  this.finished = false;\n\n  // should we decode strings into buffers before passing to _write?\n  // this is here so that some node-core streams can optimize string\n  // handling at a lower level.\n  var noDecode = options.decodeStrings === false;\n  this.decodeStrings = !noDecode;\n\n  // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n  this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n  // not an actual buffer we keep track of, but a measurement\n  // of how much we're waiting to get pushed to some underlying\n  // socket or file.\n  this.length = 0;\n\n  // a flag to see when we're in the middle of a write.\n  this.writing = false;\n\n  // when true all writes will be buffered until .uncork() call\n  this.corked = 0;\n\n  // a flag to be able to tell if the onwrite cb is called immediately,\n  // or on a later tick.  We set this to true at first, because any\n  // actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first write call.\n  this.sync = true;\n\n  // a flag to know if we're processing previously buffered items, which\n  // may call the _write() callback in the same tick, so that we don't\n  // end up in an overlapped onwrite situation.\n  this.bufferProcessing = false;\n\n  // the callback that's passed to _write(chunk,cb)\n  this.onwrite = function (er) {\n    onwrite(stream, er);\n  };\n\n  // the callback that the user supplies to write(chunk,encoding,cb)\n  this.writecb = null;\n\n  // the amount that is being written when _write is called.\n  this.writelen = 0;\n\n  this.bufferedRequest = null;\n  this.lastBufferedRequest = null;\n\n  // number of pending user-supplied write callbacks\n  // this must be 0 before 'finish' can be emitted\n  this.pendingcb = 0;\n\n  // emit prefinish if the only thing we're waiting for is _write cbs\n  // This is relevant for synchronous Transform streams\n  this.prefinished = false;\n\n  // True if the error was already emitted and should not be thrown again\n  this.errorEmitted = false;\n\n  // count buffered requests\n  this.bufferedRequestCount = 0;\n\n  // allocate the first CorkedRequest, there is always\n  // one allocated and free to use, and we maintain at most two\n  this.corkedRequestsFree = new CorkedRequest(this);\n}\n\nWritableState.prototype.getBuffer = function getBuffer() {\n  var current = this.bufferedRequest;\n  var out = [];\n  while (current) {\n    out.push(current);\n    current = current.next;\n  }\n  return out;\n};\n\n(function () {\n  try {\n    Object.defineProperty(WritableState.prototype, 'buffer', {\n      get: internalUtil.deprecate(function () {\n        return this.getBuffer();\n      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.')\n    });\n  } catch (_) {}\n})();\n\n// Test _writableState for inheritance to account for Duplex streams,\n// whose prototype chain only points to Readable.\nvar realHasInstance;\nif (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {\n  realHasInstance = Function.prototype[Symbol.hasInstance];\n  Object.defineProperty(Writable, Symbol.hasInstance, {\n    value: function (object) {\n      if (realHasInstance.call(this, object)) return true;\n\n      return object && object._writableState instanceof WritableState;\n    }\n  });\n} else {\n  realHasInstance = function (object) {\n    return object instanceof this;\n  };\n}\n\nfunction Writable(options) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  // Writable ctor is applied to Duplexes, too.\n  // `realHasInstance` is necessary because using plain `instanceof`\n  // would return false, as no `_writableState` property is attached.\n\n  // Trying to use the custom `instanceof` for Writable here will also break the\n  // Node.js LazyTransform implementation, which has a non-trivial getter for\n  // `_writableState` that would lead to infinite recursion.\n  if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {\n    return new Writable(options);\n  }\n\n  this._writableState = new WritableState(options, this);\n\n  // legacy.\n  this.writable = true;\n\n  if (options) {\n    if (typeof options.write === 'function') this._write = options.write;\n\n    if (typeof options.writev === 'function') this._writev = options.writev;\n  }\n\n  Stream.call(this);\n}\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function () {\n  this.emit('error', new Error('Cannot pipe, not readable'));\n};\n\nfunction writeAfterEnd(stream, cb) {\n  var er = new Error('write after end');\n  // TODO: defer error events consistently everywhere, not just the cb\n  stream.emit('error', er);\n  processNextTick(cb, er);\n}\n\n// Checks that a user-supplied chunk is valid, especially for the particular\n// mode the stream is in. Currently this means that `null` is never accepted\n// and undefined/non-string values are only allowed in object mode.\nfunction validChunk(stream, state, chunk, cb) {\n  var valid = true;\n  var er = false;\n\n  if (chunk === null) {\n    er = new TypeError('May not write null values to stream');\n  } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n    er = new TypeError('Invalid non-string/buffer chunk');\n  }\n  if (er) {\n    stream.emit('error', er);\n    processNextTick(cb, er);\n    valid = false;\n  }\n  return valid;\n}\n\nWritable.prototype.write = function (chunk, encoding, cb) {\n  var state = this._writableState;\n  var ret = false;\n  var isBuf = Buffer.isBuffer(chunk);\n\n  if (typeof encoding === 'function') {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n\n  if (typeof cb !== 'function') cb = nop;\n\n  if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {\n    state.pendingcb++;\n    ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);\n  }\n\n  return ret;\n};\n\nWritable.prototype.cork = function () {\n  var state = this._writableState;\n\n  state.corked++;\n};\n\nWritable.prototype.uncork = function () {\n  var state = this._writableState;\n\n  if (state.corked) {\n    state.corked--;\n\n    if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n  }\n};\n\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n  // node::ParseEncoding() requires lower case.\n  if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);\n  this._writableState.defaultEncoding = encoding;\n  return this;\n};\n\nfunction decodeChunk(state, chunk, encoding) {\n  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n    chunk = bufferShim.from(chunk, encoding);\n  }\n  return chunk;\n}\n\n// if we're already writing something, then just put this\n// in the queue, and wait our turn.  Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {\n  if (!isBuf) {\n    chunk = decodeChunk(state, chunk, encoding);\n    if (Buffer.isBuffer(chunk)) encoding = 'buffer';\n  }\n  var len = state.objectMode ? 1 : chunk.length;\n\n  state.length += len;\n\n  var ret = state.length < state.highWaterMark;\n  // we must ensure that previous needDrain will not be reset to false.\n  if (!ret) state.needDrain = true;\n\n  if (state.writing || state.corked) {\n    var last = state.lastBufferedRequest;\n    state.lastBufferedRequest = new WriteReq(chunk, encoding, cb);\n    if (last) {\n      last.next = state.lastBufferedRequest;\n    } else {\n      state.bufferedRequest = state.lastBufferedRequest;\n    }\n    state.bufferedRequestCount += 1;\n  } else {\n    doWrite(stream, state, false, len, chunk, encoding, cb);\n  }\n\n  return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n  state.writelen = len;\n  state.writecb = cb;\n  state.writing = true;\n  state.sync = true;\n  if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n  state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n  --state.pendingcb;\n  if (sync) processNextTick(cb, er);else cb(er);\n\n  stream._writableState.errorEmitted = true;\n  stream.emit('error', er);\n}\n\nfunction onwriteStateUpdate(state) {\n  state.writing = false;\n  state.writecb = null;\n  state.length -= state.writelen;\n  state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n  var state = stream._writableState;\n  var sync = state.sync;\n  var cb = state.writecb;\n\n  onwriteStateUpdate(state);\n\n  if (er) onwriteError(stream, state, sync, er, cb);else {\n    // Check if we're actually ready to finish, but don't emit yet\n    var finished = needFinish(state);\n\n    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n      clearBuffer(stream, state);\n    }\n\n    if (sync) {\n      /*<replacement>*/\n      asyncWrite(afterWrite, stream, state, finished, cb);\n      /*</replacement>*/\n    } else {\n      afterWrite(stream, state, finished, cb);\n    }\n  }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n  if (!finished) onwriteDrain(stream, state);\n  state.pendingcb--;\n  cb();\n  finishMaybe(stream, state);\n}\n\n// Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\nfunction onwriteDrain(stream, state) {\n  if (state.length === 0 && state.needDrain) {\n    state.needDrain = false;\n    stream.emit('drain');\n  }\n}\n\n// if there's something in the buffer waiting, then process it\nfunction clearBuffer(stream, state) {\n  state.bufferProcessing = true;\n  var entry = state.bufferedRequest;\n\n  if (stream._writev && entry && entry.next) {\n    // Fast case, write everything using _writev()\n    var l = state.bufferedRequestCount;\n    var buffer = new Array(l);\n    var holder = state.corkedRequestsFree;\n    holder.entry = entry;\n\n    var count = 0;\n    while (entry) {\n      buffer[count] = entry;\n      entry = entry.next;\n      count += 1;\n    }\n\n    doWrite(stream, state, true, state.length, buffer, '', holder.finish);\n\n    // doWrite is almost always async, defer these to save a bit of time\n    // as the hot path ends with doWrite\n    state.pendingcb++;\n    state.lastBufferedRequest = null;\n    if (holder.next) {\n      state.corkedRequestsFree = holder.next;\n      holder.next = null;\n    } else {\n      state.corkedRequestsFree = new CorkedRequest(state);\n    }\n  } else {\n    // Slow case, write chunks one-by-one\n    while (entry) {\n      var chunk = entry.chunk;\n      var encoding = entry.encoding;\n      var cb = entry.callback;\n      var len = state.objectMode ? 1 : chunk.length;\n\n      doWrite(stream, state, false, len, chunk, encoding, cb);\n      entry = entry.next;\n      // if we didn't call the onwrite immediately, then\n      // it means that we need to wait until it does.\n      // also, that means that the chunk and cb are currently\n      // being processed, so move the buffer counter past them.\n      if (state.writing) {\n        break;\n      }\n    }\n\n    if (entry === null) state.lastBufferedRequest = null;\n  }\n\n  state.bufferedRequestCount = 0;\n  state.bufferedRequest = entry;\n  state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function (chunk, encoding, cb) {\n  cb(new Error('_write() is not implemented'));\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function (chunk, encoding, cb) {\n  var state = this._writableState;\n\n  if (typeof chunk === 'function') {\n    cb = chunk;\n    chunk = null;\n    encoding = null;\n  } else if (typeof encoding === 'function') {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);\n\n  // .end() fully uncorks\n  if (state.corked) {\n    state.corked = 1;\n    this.uncork();\n  }\n\n  // ignore unnecessary end() calls.\n  if (!state.ending && !state.finished) endWritable(this, state, cb);\n};\n\nfunction needFinish(state) {\n  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\n\nfunction prefinish(stream, state) {\n  if (!state.prefinished) {\n    state.prefinished = true;\n    stream.emit('prefinish');\n  }\n}\n\nfunction finishMaybe(stream, state) {\n  var need = needFinish(state);\n  if (need) {\n    if (state.pendingcb === 0) {\n      prefinish(stream, state);\n      state.finished = true;\n      stream.emit('finish');\n    } else {\n      prefinish(stream, state);\n    }\n  }\n  return need;\n}\n\nfunction endWritable(stream, state, cb) {\n  state.ending = true;\n  finishMaybe(stream, state);\n  if (cb) {\n    if (state.finished) processNextTick(cb);else stream.once('finish', cb);\n  }\n  state.ended = true;\n  stream.writable = false;\n}\n\n// It seems a linked list but it is not\n// there will be only 2 of these for each stream\nfunction CorkedRequest(state) {\n  var _this = this;\n\n  this.next = null;\n  this.entry = null;\n  this.finish = function (err) {\n    var entry = _this.entry;\n    _this.entry = null;\n    while (entry) {\n      var cb = entry.callback;\n      state.pendingcb--;\n      cb(err);\n      entry = entry.next;\n    }\n    if (state.corkedRequestsFree) {\n      state.corkedRequestsFree.next = _this;\n    } else {\n      state.corkedRequestsFree = _this;\n    }\n  };\n}\n}).call(this,require('_process'))\n},{\"./_stream_duplex\":140,\"_process\":138,\"buffer\":77,\"buffer-shims\":76,\"core-util-is\":78,\"events\":79,\"inherits\":81,\"process-nextick-args\":137,\"util-deprecate\":154}],145:[function(require,module,exports){\n'use strict';\n\nvar Buffer = require('buffer').Buffer;\n/*<replacement>*/\nvar bufferShim = require('buffer-shims');\n/*</replacement>*/\n\nmodule.exports = BufferList;\n\nfunction BufferList() {\n  this.head = null;\n  this.tail = null;\n  this.length = 0;\n}\n\nBufferList.prototype.push = function (v) {\n  var entry = { data: v, next: null };\n  if (this.length > 0) this.tail.next = entry;else this.head = entry;\n  this.tail = entry;\n  ++this.length;\n};\n\nBufferList.prototype.unshift = function (v) {\n  var entry = { data: v, next: this.head };\n  if (this.length === 0) this.tail = entry;\n  this.head = entry;\n  ++this.length;\n};\n\nBufferList.prototype.shift = function () {\n  if (this.length === 0) return;\n  var ret = this.head.data;\n  if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n  --this.length;\n  return ret;\n};\n\nBufferList.prototype.clear = function () {\n  this.head = this.tail = null;\n  this.length = 0;\n};\n\nBufferList.prototype.join = function (s) {\n  if (this.length === 0) return '';\n  var p = this.head;\n  var ret = '' + p.data;\n  while (p = p.next) {\n    ret += s + p.data;\n  }return ret;\n};\n\nBufferList.prototype.concat = function (n) {\n  if (this.length === 0) return bufferShim.alloc(0);\n  if (this.length === 1) return this.head.data;\n  var ret = bufferShim.allocUnsafe(n >>> 0);\n  var p = this.head;\n  var i = 0;\n  while (p) {\n    p.data.copy(ret, i);\n    i += p.data.length;\n    p = p.next;\n  }\n  return ret;\n};\n},{\"buffer\":77,\"buffer-shims\":76}],146:[function(require,module,exports){\nmodule.exports = require(\"./lib/_stream_passthrough.js\")\n\n},{\"./lib/_stream_passthrough.js\":141}],147:[function(require,module,exports){\n(function (process){\nvar Stream = (function (){\n  try {\n    return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify\n  } catch(_){}\n}());\nexports = module.exports = require('./lib/_stream_readable.js');\nexports.Stream = Stream || exports;\nexports.Readable = exports;\nexports.Writable = require('./lib/_stream_writable.js');\nexports.Duplex = require('./lib/_stream_duplex.js');\nexports.Transform = require('./lib/_stream_transform.js');\nexports.PassThrough = require('./lib/_stream_passthrough.js');\n\nif (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) {\n  module.exports = Stream;\n}\n\n}).call(this,require('_process'))\n},{\"./lib/_stream_duplex.js\":140,\"./lib/_stream_passthrough.js\":141,\"./lib/_stream_readable.js\":142,\"./lib/_stream_transform.js\":143,\"./lib/_stream_writable.js\":144,\"_process\":138}],148:[function(require,module,exports){\nmodule.exports = require(\"./lib/_stream_transform.js\")\n\n},{\"./lib/_stream_transform.js\":143}],149:[function(require,module,exports){\nmodule.exports = require(\"./lib/_stream_writable.js\")\n\n},{\"./lib/_stream_writable.js\":144}],150:[function(require,module,exports){\n(function (Buffer){\n;(function (sax) { // wrapper for non-node envs\n  sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }\n  sax.SAXParser = SAXParser\n  sax.SAXStream = SAXStream\n  sax.createStream = createStream\n\n  // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.\n  // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),\n  // since that's the earliest that a buffer overrun could occur.  This way, checks are\n  // as rare as required, but as often as necessary to ensure never crossing this bound.\n  // Furthermore, buffers are only tested at most once per write(), so passing a very\n  // large string into write() might have undesirable effects, but this is manageable by\n  // the caller, so it is assumed to be safe.  Thus, a call to write() may, in the extreme\n  // edge case, result in creating at most one complete copy of the string passed in.\n  // Set to Infinity to have unlimited buffers.\n  sax.MAX_BUFFER_LENGTH = 64 * 1024\n\n  var buffers = [\n    'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',\n    'procInstName', 'procInstBody', 'entity', 'attribName',\n    'attribValue', 'cdata', 'script'\n  ]\n\n  sax.EVENTS = [\n    'text',\n    'processinginstruction',\n    'sgmldeclaration',\n    'doctype',\n    'comment',\n    'attribute',\n    'opentag',\n    'closetag',\n    'opencdata',\n    'cdata',\n    'closecdata',\n    'error',\n    'end',\n    'ready',\n    'script',\n    'opennamespace',\n    'closenamespace'\n  ]\n\n  function SAXParser (strict, opt) {\n    if (!(this instanceof SAXParser)) {\n      return new SAXParser(strict, opt)\n    }\n\n    var parser = this\n    clearBuffers(parser)\n    parser.q = parser.c = ''\n    parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH\n    parser.opt = opt || {}\n    parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags\n    parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'\n    parser.tags = []\n    parser.closed = parser.closedRoot = parser.sawRoot = false\n    parser.tag = parser.error = null\n    parser.strict = !!strict\n    parser.noscript = !!(strict || parser.opt.noscript)\n    parser.state = S.BEGIN\n    parser.strictEntities = parser.opt.strictEntities\n    parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)\n    parser.attribList = []\n\n    // namespaces form a prototype chain.\n    // it always points at the current tag,\n    // which protos to its parent tag.\n    if (parser.opt.xmlns) {\n      parser.ns = Object.create(rootNS)\n    }\n\n    // mostly just for error reporting\n    parser.trackPosition = parser.opt.position !== false\n    if (parser.trackPosition) {\n      parser.position = parser.line = parser.column = 0\n    }\n    emit(parser, 'onready')\n  }\n\n  if (!Object.create) {\n    Object.create = function (o) {\n      function F () {}\n      F.prototype = o\n      var newf = new F()\n      return newf\n    }\n  }\n\n  if (!Object.keys) {\n    Object.keys = function (o) {\n      var a = []\n      for (var i in o) if (o.hasOwnProperty(i)) a.push(i)\n      return a\n    }\n  }\n\n  function checkBufferLength (parser) {\n    var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)\n    var maxActual = 0\n    for (var i = 0, l = buffers.length; i < l; i++) {\n      var len = parser[buffers[i]].length\n      if (len > maxAllowed) {\n        // Text/cdata nodes can get big, and since they're buffered,\n        // we can get here under normal conditions.\n        // Avoid issues by emitting the text node now,\n        // so at least it won't get any bigger.\n        switch (buffers[i]) {\n          case 'textNode':\n            closeText(parser)\n            break\n\n          case 'cdata':\n            emitNode(parser, 'oncdata', parser.cdata)\n            parser.cdata = ''\n            break\n\n          case 'script':\n            emitNode(parser, 'onscript', parser.script)\n            parser.script = ''\n            break\n\n          default:\n            error(parser, 'Max buffer length exceeded: ' + buffers[i])\n        }\n      }\n      maxActual = Math.max(maxActual, len)\n    }\n    // schedule the next check for the earliest possible buffer overrun.\n    var m = sax.MAX_BUFFER_LENGTH - maxActual\n    parser.bufferCheckPosition = m + parser.position\n  }\n\n  function clearBuffers (parser) {\n    for (var i = 0, l = buffers.length; i < l; i++) {\n      parser[buffers[i]] = ''\n    }\n  }\n\n  function flushBuffers (parser) {\n    closeText(parser)\n    if (parser.cdata !== '') {\n      emitNode(parser, 'oncdata', parser.cdata)\n      parser.cdata = ''\n    }\n    if (parser.script !== '') {\n      emitNode(parser, 'onscript', parser.script)\n      parser.script = ''\n    }\n  }\n\n  SAXParser.prototype = {\n    end: function () { end(this) },\n    write: write,\n    resume: function () { this.error = null; return this },\n    close: function () { return this.write(null) },\n    flush: function () { flushBuffers(this) }\n  }\n\n  var Stream\n  try {\n    Stream = require('stream').Stream\n  } catch (ex) {\n    Stream = function () {}\n  }\n\n  var streamWraps = sax.EVENTS.filter(function (ev) {\n    return ev !== 'error' && ev !== 'end'\n  })\n\n  function createStream (strict, opt) {\n    return new SAXStream(strict, opt)\n  }\n\n  function SAXStream (strict, opt) {\n    if (!(this instanceof SAXStream)) {\n      return new SAXStream(strict, opt)\n    }\n\n    Stream.apply(this)\n\n    this._parser = new SAXParser(strict, opt)\n    this.writable = true\n    this.readable = true\n\n    var me = this\n\n    this._parser.onend = function () {\n      me.emit('end')\n    }\n\n    this._parser.onerror = function (er) {\n      me.emit('error', er)\n\n      // if didn't throw, then means error was handled.\n      // go ahead and clear error, so we can write again.\n      me._parser.error = null\n    }\n\n    this._decoder = null\n\n    streamWraps.forEach(function (ev) {\n      Object.defineProperty(me, 'on' + ev, {\n        get: function () {\n          return me._parser['on' + ev]\n        },\n        set: function (h) {\n          if (!h) {\n            me.removeAllListeners(ev)\n            me._parser['on' + ev] = h\n            return h\n          }\n          me.on(ev, h)\n        },\n        enumerable: true,\n        configurable: false\n      })\n    })\n  }\n\n  SAXStream.prototype = Object.create(Stream.prototype, {\n    constructor: {\n      value: SAXStream\n    }\n  })\n\n  SAXStream.prototype.write = function (data) {\n    if (typeof Buffer === 'function' &&\n      typeof Buffer.isBuffer === 'function' &&\n      Buffer.isBuffer(data)) {\n      if (!this._decoder) {\n        var SD = require('string_decoder').StringDecoder\n        this._decoder = new SD('utf8')\n      }\n      data = this._decoder.write(data)\n    }\n\n    this._parser.write(data.toString())\n    this.emit('data', data)\n    return true\n  }\n\n  SAXStream.prototype.end = function (chunk) {\n    if (chunk && chunk.length) {\n      this.write(chunk)\n    }\n    this._parser.end()\n    return true\n  }\n\n  SAXStream.prototype.on = function (ev, handler) {\n    var me = this\n    if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {\n      me._parser['on' + ev] = function () {\n        var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)\n        args.splice(0, 0, ev)\n        me.emit.apply(me, args)\n      }\n    }\n\n    return Stream.prototype.on.call(me, ev, handler)\n  }\n\n  // character classes and tokens\n  var whitespace = '\\r\\n\\t '\n\n  // this really needs to be replaced with character classes.\n  // XML allows all manner of ridiculous numbers and digits.\n  var number = '0124356789'\n  var letter = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'\n\n  // (Letter | \"_\" | \":\")\n  var quote = '\\'\"'\n  var attribEnd = whitespace + '>'\n  var CDATA = '[CDATA['\n  var DOCTYPE = 'DOCTYPE'\n  var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'\n  var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'\n  var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }\n\n  // turn all the string character sets into character class objects.\n  whitespace = charClass(whitespace)\n  number = charClass(number)\n  letter = charClass(letter)\n\n  // http://www.w3.org/TR/REC-xml/#NT-NameStartChar\n  // This implementation works on strings, a single character at a time\n  // as such, it cannot ever support astral-plane characters (10000-EFFFF)\n  // without a significant breaking change to either this  parser, or the\n  // JavaScript language.  Implementation of an emoji-capable xml parser\n  // is left as an exercise for the reader.\n  var nameStart = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n\n  var nameBody = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040\\.\\d-]/\n\n  var entityStart = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n  var entityBody = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040\\.\\d-]/\n\n  quote = charClass(quote)\n  attribEnd = charClass(attribEnd)\n\n  function charClass (str) {\n    return str.split('').reduce(function (s, c) {\n      s[c] = true\n      return s\n    }, {})\n  }\n\n  function isRegExp (c) {\n    return Object.prototype.toString.call(c) === '[object RegExp]'\n  }\n\n  function is (charclass, c) {\n    return isRegExp(charclass) ? !!c.match(charclass) : charclass[c]\n  }\n\n  function not (charclass, c) {\n    return !is(charclass, c)\n  }\n\n  var S = 0\n  sax.STATE = {\n    BEGIN: S++, // leading byte order mark or whitespace\n    BEGIN_WHITESPACE: S++, // leading whitespace\n    TEXT: S++, // general stuff\n    TEXT_ENTITY: S++, // &amp and such.\n    OPEN_WAKA: S++, // <\n    SGML_DECL: S++, // <!BLARG\n    SGML_DECL_QUOTED: S++, // <!BLARG foo \"bar\n    DOCTYPE: S++, // <!DOCTYPE\n    DOCTYPE_QUOTED: S++, // <!DOCTYPE \"//blah\n    DOCTYPE_DTD: S++, // <!DOCTYPE \"//blah\" [ ...\n    DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE \"//blah\" [ \"foo\n    COMMENT_STARTING: S++, // <!-\n    COMMENT: S++, // <!--\n    COMMENT_ENDING: S++, // <!-- blah -\n    COMMENT_ENDED: S++, // <!-- blah --\n    CDATA: S++, // <![CDATA[ something\n    CDATA_ENDING: S++, // ]\n    CDATA_ENDING_2: S++, // ]]\n    PROC_INST: S++, // <?hi\n    PROC_INST_BODY: S++, // <?hi there\n    PROC_INST_ENDING: S++, // <?hi \"there\" ?\n    OPEN_TAG: S++, // <strong\n    OPEN_TAG_SLASH: S++, // <strong /\n    ATTRIB: S++, // <a\n    ATTRIB_NAME: S++, // <a foo\n    ATTRIB_NAME_SAW_WHITE: S++, // <a foo _\n    ATTRIB_VALUE: S++, // <a foo=\n    ATTRIB_VALUE_QUOTED: S++, // <a foo=\"bar\n    ATTRIB_VALUE_CLOSED: S++, // <a foo=\"bar\"\n    ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar\n    ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar=\"&quot;\"\n    ATTRIB_VALUE_ENTITY_U: S++, // <foo bar=&quot\n    CLOSE_TAG: S++, // </a\n    CLOSE_TAG_SAW_WHITE: S++, // </a   >\n    SCRIPT: S++, // <script> ...\n    SCRIPT_ENDING: S++ // <script> ... <\n  }\n\n  sax.XML_ENTITIES = {\n    'amp': '&',\n    'gt': '>',\n    'lt': '<',\n    'quot': '\"',\n    'apos': \"'\"\n  }\n\n  sax.ENTITIES = {\n    'amp': '&',\n    'gt': '>',\n    'lt': '<',\n    'quot': '\"',\n    'apos': \"'\",\n    'AElig': 198,\n    'Aacute': 193,\n    'Acirc': 194,\n    'Agrave': 192,\n    'Aring': 197,\n    'Atilde': 195,\n    'Auml': 196,\n    'Ccedil': 199,\n    'ETH': 208,\n    'Eacute': 201,\n    'Ecirc': 202,\n    'Egrave': 200,\n    'Euml': 203,\n    'Iacute': 205,\n    'Icirc': 206,\n    'Igrave': 204,\n    'Iuml': 207,\n    'Ntilde': 209,\n    'Oacute': 211,\n    'Ocirc': 212,\n    'Ograve': 210,\n    'Oslash': 216,\n    'Otilde': 213,\n    'Ouml': 214,\n    'THORN': 222,\n    'Uacute': 218,\n    'Ucirc': 219,\n    'Ugrave': 217,\n    'Uuml': 220,\n    'Yacute': 221,\n    'aacute': 225,\n    'acirc': 226,\n    'aelig': 230,\n    'agrave': 224,\n    'aring': 229,\n    'atilde': 227,\n    'auml': 228,\n    'ccedil': 231,\n    'eacute': 233,\n    'ecirc': 234,\n    'egrave': 232,\n    'eth': 240,\n    'euml': 235,\n    'iacute': 237,\n    'icirc': 238,\n    'igrave': 236,\n    'iuml': 239,\n    'ntilde': 241,\n    'oacute': 243,\n    'ocirc': 244,\n    'ograve': 242,\n    'oslash': 248,\n    'otilde': 245,\n    'ouml': 246,\n    'szlig': 223,\n    'thorn': 254,\n    'uacute': 250,\n    'ucirc': 251,\n    'ugrave': 249,\n    'uuml': 252,\n    'yacute': 253,\n    'yuml': 255,\n    'copy': 169,\n    'reg': 174,\n    'nbsp': 160,\n    'iexcl': 161,\n    'cent': 162,\n    'pound': 163,\n    'curren': 164,\n    'yen': 165,\n    'brvbar': 166,\n    'sect': 167,\n    'uml': 168,\n    'ordf': 170,\n    'laquo': 171,\n    'not': 172,\n    'shy': 173,\n    'macr': 175,\n    'deg': 176,\n    'plusmn': 177,\n    'sup1': 185,\n    'sup2': 178,\n    'sup3': 179,\n    'acute': 180,\n    'micro': 181,\n    'para': 182,\n    'middot': 183,\n    'cedil': 184,\n    'ordm': 186,\n    'raquo': 187,\n    'frac14': 188,\n    'frac12': 189,\n    'frac34': 190,\n    'iquest': 191,\n    'times': 215,\n    'divide': 247,\n    'OElig': 338,\n    'oelig': 339,\n    'Scaron': 352,\n    'scaron': 353,\n    'Yuml': 376,\n    'fnof': 402,\n    'circ': 710,\n    'tilde': 732,\n    'Alpha': 913,\n    'Beta': 914,\n    'Gamma': 915,\n    'Delta': 916,\n    'Epsilon': 917,\n    'Zeta': 918,\n    'Eta': 919,\n    'Theta': 920,\n    'Iota': 921,\n    'Kappa': 922,\n    'Lambda': 923,\n    'Mu': 924,\n    'Nu': 925,\n    'Xi': 926,\n    'Omicron': 927,\n    'Pi': 928,\n    'Rho': 929,\n    'Sigma': 931,\n    'Tau': 932,\n    'Upsilon': 933,\n    'Phi': 934,\n    'Chi': 935,\n    'Psi': 936,\n    'Omega': 937,\n    'alpha': 945,\n    'beta': 946,\n    'gamma': 947,\n    'delta': 948,\n    'epsilon': 949,\n    'zeta': 950,\n    'eta': 951,\n    'theta': 952,\n    'iota': 953,\n    'kappa': 954,\n    'lambda': 955,\n    'mu': 956,\n    'nu': 957,\n    'xi': 958,\n    'omicron': 959,\n    'pi': 960,\n    'rho': 961,\n    'sigmaf': 962,\n    'sigma': 963,\n    'tau': 964,\n    'upsilon': 965,\n    'phi': 966,\n    'chi': 967,\n    'psi': 968,\n    'omega': 969,\n    'thetasym': 977,\n    'upsih': 978,\n    'piv': 982,\n    'ensp': 8194,\n    'emsp': 8195,\n    'thinsp': 8201,\n    'zwnj': 8204,\n    'zwj': 8205,\n    'lrm': 8206,\n    'rlm': 8207,\n    'ndash': 8211,\n    'mdash': 8212,\n    'lsquo': 8216,\n    'rsquo': 8217,\n    'sbquo': 8218,\n    'ldquo': 8220,\n    'rdquo': 8221,\n    'bdquo': 8222,\n    'dagger': 8224,\n    'Dagger': 8225,\n    'bull': 8226,\n    'hellip': 8230,\n    'permil': 8240,\n    'prime': 8242,\n    'Prime': 8243,\n    'lsaquo': 8249,\n    'rsaquo': 8250,\n    'oline': 8254,\n    'frasl': 8260,\n    'euro': 8364,\n    'image': 8465,\n    'weierp': 8472,\n    'real': 8476,\n    'trade': 8482,\n    'alefsym': 8501,\n    'larr': 8592,\n    'uarr': 8593,\n    'rarr': 8594,\n    'darr': 8595,\n    'harr': 8596,\n    'crarr': 8629,\n    'lArr': 8656,\n    'uArr': 8657,\n    'rArr': 8658,\n    'dArr': 8659,\n    'hArr': 8660,\n    'forall': 8704,\n    'part': 8706,\n    'exist': 8707,\n    'empty': 8709,\n    'nabla': 8711,\n    'isin': 8712,\n    'notin': 8713,\n    'ni': 8715,\n    'prod': 8719,\n    'sum': 8721,\n    'minus': 8722,\n    'lowast': 8727,\n    'radic': 8730,\n    'prop': 8733,\n    'infin': 8734,\n    'ang': 8736,\n    'and': 8743,\n    'or': 8744,\n    'cap': 8745,\n    'cup': 8746,\n    'int': 8747,\n    'there4': 8756,\n    'sim': 8764,\n    'cong': 8773,\n    'asymp': 8776,\n    'ne': 8800,\n    'equiv': 8801,\n    'le': 8804,\n    'ge': 8805,\n    'sub': 8834,\n    'sup': 8835,\n    'nsub': 8836,\n    'sube': 8838,\n    'supe': 8839,\n    'oplus': 8853,\n    'otimes': 8855,\n    'perp': 8869,\n    'sdot': 8901,\n    'lceil': 8968,\n    'rceil': 8969,\n    'lfloor': 8970,\n    'rfloor': 8971,\n    'lang': 9001,\n    'rang': 9002,\n    'loz': 9674,\n    'spades': 9824,\n    'clubs': 9827,\n    'hearts': 9829,\n    'diams': 9830\n  }\n\n  Object.keys(sax.ENTITIES).forEach(function (key) {\n    var e = sax.ENTITIES[key]\n    var s = typeof e === 'number' ? String.fromCharCode(e) : e\n    sax.ENTITIES[key] = s\n  })\n\n  for (var s in sax.STATE) {\n    sax.STATE[sax.STATE[s]] = s\n  }\n\n  // shorthand\n  S = sax.STATE\n\n  function emit (parser, event, data) {\n    parser[event] && parser[event](data)\n  }\n\n  function emitNode (parser, nodeType, data) {\n    if (parser.textNode) closeText(parser)\n    emit(parser, nodeType, data)\n  }\n\n  function closeText (parser) {\n    parser.textNode = textopts(parser.opt, parser.textNode)\n    if (parser.textNode) emit(parser, 'ontext', parser.textNode)\n    parser.textNode = ''\n  }\n\n  function textopts (opt, text) {\n    if (opt.trim) text = text.trim()\n    if (opt.normalize) text = text.replace(/\\s+/g, ' ')\n    return text\n  }\n\n  function error (parser, er) {\n    closeText(parser)\n    if (parser.trackPosition) {\n      er += '\\nLine: ' + parser.line +\n        '\\nColumn: ' + parser.column +\n        '\\nChar: ' + parser.c\n    }\n    er = new Error(er)\n    parser.error = er\n    emit(parser, 'onerror', er)\n    return parser\n  }\n\n  function end (parser) {\n    if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')\n    if ((parser.state !== S.BEGIN) &&\n      (parser.state !== S.BEGIN_WHITESPACE) &&\n      (parser.state !== S.TEXT)) {\n      error(parser, 'Unexpected end')\n    }\n    closeText(parser)\n    parser.c = ''\n    parser.closed = true\n    emit(parser, 'onend')\n    SAXParser.call(parser, parser.strict, parser.opt)\n    return parser\n  }\n\n  function strictFail (parser, message) {\n    if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {\n      throw new Error('bad call to strictFail')\n    }\n    if (parser.strict) {\n      error(parser, message)\n    }\n  }\n\n  function newTag (parser) {\n    if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()\n    var parent = parser.tags[parser.tags.length - 1] || parser\n    var tag = parser.tag = { name: parser.tagName, attributes: {} }\n\n    // will be overridden if tag contails an xmlns=\"foo\" or xmlns:foo=\"bar\"\n    if (parser.opt.xmlns) {\n      tag.ns = parent.ns\n    }\n    parser.attribList.length = 0\n  }\n\n  function qname (name, attribute) {\n    var i = name.indexOf(':')\n    var qualName = i < 0 ? [ '', name ] : name.split(':')\n    var prefix = qualName[0]\n    var local = qualName[1]\n\n    // <x \"xmlns\"=\"http://foo\">\n    if (attribute && name === 'xmlns') {\n      prefix = 'xmlns'\n      local = ''\n    }\n\n    return { prefix: prefix, local: local }\n  }\n\n  function attrib (parser) {\n    if (!parser.strict) {\n      parser.attribName = parser.attribName[parser.looseCase]()\n    }\n\n    if (parser.attribList.indexOf(parser.attribName) !== -1 ||\n      parser.tag.attributes.hasOwnProperty(parser.attribName)) {\n      parser.attribName = parser.attribValue = ''\n      return\n    }\n\n    if (parser.opt.xmlns) {\n      var qn = qname(parser.attribName, true)\n      var prefix = qn.prefix\n      var local = qn.local\n\n      if (prefix === 'xmlns') {\n        // namespace binding attribute. push the binding into scope\n        if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {\n          strictFail(parser,\n            'xml: prefix must be bound to ' + XML_NAMESPACE + '\\n' +\n            'Actual: ' + parser.attribValue)\n        } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {\n          strictFail(parser,\n            'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\\n' +\n            'Actual: ' + parser.attribValue)\n        } else {\n          var tag = parser.tag\n          var parent = parser.tags[parser.tags.length - 1] || parser\n          if (tag.ns === parent.ns) {\n            tag.ns = Object.create(parent.ns)\n          }\n          tag.ns[local] = parser.attribValue\n        }\n      }\n\n      // defer onattribute events until all attributes have been seen\n      // so any new bindings can take effect. preserve attribute order\n      // so deferred events can be emitted in document order\n      parser.attribList.push([parser.attribName, parser.attribValue])\n    } else {\n      // in non-xmlns mode, we can emit the event right away\n      parser.tag.attributes[parser.attribName] = parser.attribValue\n      emitNode(parser, 'onattribute', {\n        name: parser.attribName,\n        value: parser.attribValue\n      })\n    }\n\n    parser.attribName = parser.attribValue = ''\n  }\n\n  function openTag (parser, selfClosing) {\n    if (parser.opt.xmlns) {\n      // emit namespace binding events\n      var tag = parser.tag\n\n      // add namespace info to tag\n      var qn = qname(parser.tagName)\n      tag.prefix = qn.prefix\n      tag.local = qn.local\n      tag.uri = tag.ns[qn.prefix] || ''\n\n      if (tag.prefix && !tag.uri) {\n        strictFail(parser, 'Unbound namespace prefix: ' +\n          JSON.stringify(parser.tagName))\n        tag.uri = qn.prefix\n      }\n\n      var parent = parser.tags[parser.tags.length - 1] || parser\n      if (tag.ns && parent.ns !== tag.ns) {\n        Object.keys(tag.ns).forEach(function (p) {\n          emitNode(parser, 'onopennamespace', {\n            prefix: p,\n            uri: tag.ns[p]\n          })\n        })\n      }\n\n      // handle deferred onattribute events\n      // Note: do not apply default ns to attributes:\n      //   http://www.w3.org/TR/REC-xml-names/#defaulting\n      for (var i = 0, l = parser.attribList.length; i < l; i++) {\n        var nv = parser.attribList[i]\n        var name = nv[0]\n        var value = nv[1]\n        var qualName = qname(name, true)\n        var prefix = qualName.prefix\n        var local = qualName.local\n        var uri = prefix === '' ? '' : (tag.ns[prefix] || '')\n        var a = {\n          name: name,\n          value: value,\n          prefix: prefix,\n          local: local,\n          uri: uri\n        }\n\n        // if there's any attributes with an undefined namespace,\n        // then fail on them now.\n        if (prefix && prefix !== 'xmlns' && !uri) {\n          strictFail(parser, 'Unbound namespace prefix: ' +\n            JSON.stringify(prefix))\n          a.uri = prefix\n        }\n        parser.tag.attributes[name] = a\n        emitNode(parser, 'onattribute', a)\n      }\n      parser.attribList.length = 0\n    }\n\n    parser.tag.isSelfClosing = !!selfClosing\n\n    // process the tag\n    parser.sawRoot = true\n    parser.tags.push(parser.tag)\n    emitNode(parser, 'onopentag', parser.tag)\n    if (!selfClosing) {\n      // special case for <script> in non-strict mode.\n      if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {\n        parser.state = S.SCRIPT\n      } else {\n        parser.state = S.TEXT\n      }\n      parser.tag = null\n      parser.tagName = ''\n    }\n    parser.attribName = parser.attribValue = ''\n    parser.attribList.length = 0\n  }\n\n  function closeTag (parser) {\n    if (!parser.tagName) {\n      strictFail(parser, 'Weird empty close tag.')\n      parser.textNode += '</>'\n      parser.state = S.TEXT\n      return\n    }\n\n    if (parser.script) {\n      if (parser.tagName !== 'script') {\n        parser.script += '</' + parser.tagName + '>'\n        parser.tagName = ''\n        parser.state = S.SCRIPT\n        return\n      }\n      emitNode(parser, 'onscript', parser.script)\n      parser.script = ''\n    }\n\n    // first make sure that the closing tag actually exists.\n    // <a><b></c></b></a> will close everything, otherwise.\n    var t = parser.tags.length\n    var tagName = parser.tagName\n    if (!parser.strict) {\n      tagName = tagName[parser.looseCase]()\n    }\n    var closeTo = tagName\n    while (t--) {\n      var close = parser.tags[t]\n      if (close.name !== closeTo) {\n        // fail the first time in strict mode\n        strictFail(parser, 'Unexpected close tag')\n      } else {\n        break\n      }\n    }\n\n    // didn't find it.  we already failed for strict, so just abort.\n    if (t < 0) {\n      strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)\n      parser.textNode += '</' + parser.tagName + '>'\n      parser.state = S.TEXT\n      return\n    }\n    parser.tagName = tagName\n    var s = parser.tags.length\n    while (s-- > t) {\n      var tag = parser.tag = parser.tags.pop()\n      parser.tagName = parser.tag.name\n      emitNode(parser, 'onclosetag', parser.tagName)\n\n      var x = {}\n      for (var i in tag.ns) {\n        x[i] = tag.ns[i]\n      }\n\n      var parent = parser.tags[parser.tags.length - 1] || parser\n      if (parser.opt.xmlns && tag.ns !== parent.ns) {\n        // remove namespace bindings introduced by tag\n        Object.keys(tag.ns).forEach(function (p) {\n          var n = tag.ns[p]\n          emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })\n        })\n      }\n    }\n    if (t === 0) parser.closedRoot = true\n    parser.tagName = parser.attribValue = parser.attribName = ''\n    parser.attribList.length = 0\n    parser.state = S.TEXT\n  }\n\n  function parseEntity (parser) {\n    var entity = parser.entity\n    var entityLC = entity.toLowerCase()\n    var num\n    var numStr = ''\n\n    if (parser.ENTITIES[entity]) {\n      return parser.ENTITIES[entity]\n    }\n    if (parser.ENTITIES[entityLC]) {\n      return parser.ENTITIES[entityLC]\n    }\n    entity = entityLC\n    if (entity.charAt(0) === '#') {\n      if (entity.charAt(1) === 'x') {\n        entity = entity.slice(2)\n        num = parseInt(entity, 16)\n        numStr = num.toString(16)\n      } else {\n        entity = entity.slice(1)\n        num = parseInt(entity, 10)\n        numStr = num.toString(10)\n      }\n    }\n    entity = entity.replace(/^0+/, '')\n    if (numStr.toLowerCase() !== entity) {\n      strictFail(parser, 'Invalid character entity')\n      return '&' + parser.entity + ';'\n    }\n\n    return String.fromCodePoint(num)\n  }\n\n  function beginWhiteSpace (parser, c) {\n    if (c === '<') {\n      parser.state = S.OPEN_WAKA\n      parser.startTagPosition = parser.position\n    } else if (not(whitespace, c)) {\n      // have to process this as a text node.\n      // weird, but happens.\n      strictFail(parser, 'Non-whitespace before first tag.')\n      parser.textNode = c\n      parser.state = S.TEXT\n    }\n  }\n\n  function charAt (chunk, i) {\n    var result = ''\n    if (i < chunk.length) {\n      result = chunk.charAt(i)\n    }\n    return result\n  }\n\n  function write (chunk) {\n    var parser = this\n    if (this.error) {\n      throw this.error\n    }\n    if (parser.closed) {\n      return error(parser,\n        'Cannot write after close. Assign an onready handler.')\n    }\n    if (chunk === null) {\n      return end(parser)\n    }\n    if (typeof chunk === 'object') {\n      chunk = chunk.toString()\n    }\n    var i = 0\n    var c = ''\n    while (true) {\n      c = charAt(chunk, i++)\n      parser.c = c\n      if (!c) {\n        break\n      }\n      if (parser.trackPosition) {\n        parser.position++\n        if (c === '\\n') {\n          parser.line++\n          parser.column = 0\n        } else {\n          parser.column++\n        }\n      }\n      switch (parser.state) {\n        case S.BEGIN:\n          parser.state = S.BEGIN_WHITESPACE\n          if (c === '\\uFEFF') {\n            continue\n          }\n          beginWhiteSpace(parser, c)\n          continue\n\n        case S.BEGIN_WHITESPACE:\n          beginWhiteSpace(parser, c)\n          continue\n\n        case S.TEXT:\n          if (parser.sawRoot && !parser.closedRoot) {\n            var starti = i - 1\n            while (c && c !== '<' && c !== '&') {\n              c = charAt(chunk, i++)\n              if (c && parser.trackPosition) {\n                parser.position++\n                if (c === '\\n') {\n                  parser.line++\n                  parser.column = 0\n                } else {\n                  parser.column++\n                }\n              }\n            }\n            parser.textNode += chunk.substring(starti, i - 1)\n          }\n          if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {\n            parser.state = S.OPEN_WAKA\n            parser.startTagPosition = parser.position\n          } else {\n            if (not(whitespace, c) && (!parser.sawRoot || parser.closedRoot)) {\n              strictFail(parser, 'Text data outside of root node.')\n            }\n            if (c === '&') {\n              parser.state = S.TEXT_ENTITY\n            } else {\n              parser.textNode += c\n            }\n          }\n          continue\n\n        case S.SCRIPT:\n          // only non-strict\n          if (c === '<') {\n            parser.state = S.SCRIPT_ENDING\n          } else {\n            parser.script += c\n          }\n          continue\n\n        case S.SCRIPT_ENDING:\n          if (c === '/') {\n            parser.state = S.CLOSE_TAG\n          } else {\n            parser.script += '<' + c\n            parser.state = S.SCRIPT\n          }\n          continue\n\n        case S.OPEN_WAKA:\n          // either a /, ?, !, or text is coming next.\n          if (c === '!') {\n            parser.state = S.SGML_DECL\n            parser.sgmlDecl = ''\n          } else if (is(whitespace, c)) {\n            // wait for it...\n          } else if (is(nameStart, c)) {\n            parser.state = S.OPEN_TAG\n            parser.tagName = c\n          } else if (c === '/') {\n            parser.state = S.CLOSE_TAG\n            parser.tagName = ''\n          } else if (c === '?') {\n            parser.state = S.PROC_INST\n            parser.procInstName = parser.procInstBody = ''\n          } else {\n            strictFail(parser, 'Unencoded <')\n            // if there was some whitespace, then add that in.\n            if (parser.startTagPosition + 1 < parser.position) {\n              var pad = parser.position - parser.startTagPosition\n              c = new Array(pad).join(' ') + c\n            }\n            parser.textNode += '<' + c\n            parser.state = S.TEXT\n          }\n          continue\n\n        case S.SGML_DECL:\n          if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {\n            emitNode(parser, 'onopencdata')\n            parser.state = S.CDATA\n            parser.sgmlDecl = ''\n            parser.cdata = ''\n          } else if (parser.sgmlDecl + c === '--') {\n            parser.state = S.COMMENT\n            parser.comment = ''\n            parser.sgmlDecl = ''\n          } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {\n            parser.state = S.DOCTYPE\n            if (parser.doctype || parser.sawRoot) {\n              strictFail(parser,\n                'Inappropriately located doctype declaration')\n            }\n            parser.doctype = ''\n            parser.sgmlDecl = ''\n          } else if (c === '>') {\n            emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)\n            parser.sgmlDecl = ''\n            parser.state = S.TEXT\n          } else if (is(quote, c)) {\n            parser.state = S.SGML_DECL_QUOTED\n            parser.sgmlDecl += c\n          } else {\n            parser.sgmlDecl += c\n          }\n          continue\n\n        case S.SGML_DECL_QUOTED:\n          if (c === parser.q) {\n            parser.state = S.SGML_DECL\n            parser.q = ''\n          }\n          parser.sgmlDecl += c\n          continue\n\n        case S.DOCTYPE:\n          if (c === '>') {\n            parser.state = S.TEXT\n            emitNode(parser, 'ondoctype', parser.doctype)\n            parser.doctype = true // just remember that we saw it.\n          } else {\n            parser.doctype += c\n            if (c === '[') {\n              parser.state = S.DOCTYPE_DTD\n            } else if (is(quote, c)) {\n              parser.state = S.DOCTYPE_QUOTED\n              parser.q = c\n            }\n          }\n          continue\n\n        case S.DOCTYPE_QUOTED:\n          parser.doctype += c\n          if (c === parser.q) {\n            parser.q = ''\n            parser.state = S.DOCTYPE\n          }\n          continue\n\n        case S.DOCTYPE_DTD:\n          parser.doctype += c\n          if (c === ']') {\n            parser.state = S.DOCTYPE\n          } else if (is(quote, c)) {\n            parser.state = S.DOCTYPE_DTD_QUOTED\n            parser.q = c\n          }\n          continue\n\n        case S.DOCTYPE_DTD_QUOTED:\n          parser.doctype += c\n          if (c === parser.q) {\n            parser.state = S.DOCTYPE_DTD\n            parser.q = ''\n          }\n          continue\n\n        case S.COMMENT:\n          if (c === '-') {\n            parser.state = S.COMMENT_ENDING\n          } else {\n            parser.comment += c\n          }\n          continue\n\n        case S.COMMENT_ENDING:\n          if (c === '-') {\n            parser.state = S.COMMENT_ENDED\n            parser.comment = textopts(parser.opt, parser.comment)\n            if (parser.comment) {\n              emitNode(parser, 'oncomment', parser.comment)\n            }\n            parser.comment = ''\n          } else {\n            parser.comment += '-' + c\n            parser.state = S.COMMENT\n          }\n          continue\n\n        case S.COMMENT_ENDED:\n          if (c !== '>') {\n            strictFail(parser, 'Malformed comment')\n            // allow <!-- blah -- bloo --> in non-strict mode,\n            // which is a comment of \" blah -- bloo \"\n            parser.comment += '--' + c\n            parser.state = S.COMMENT\n          } else {\n            parser.state = S.TEXT\n          }\n          continue\n\n        case S.CDATA:\n          if (c === ']') {\n            parser.state = S.CDATA_ENDING\n          } else {\n            parser.cdata += c\n          }\n          continue\n\n        case S.CDATA_ENDING:\n          if (c === ']') {\n            parser.state = S.CDATA_ENDING_2\n          } else {\n            parser.cdata += ']' + c\n            parser.state = S.CDATA\n          }\n          continue\n\n        case S.CDATA_ENDING_2:\n          if (c === '>') {\n            if (parser.cdata) {\n              emitNode(parser, 'oncdata', parser.cdata)\n            }\n            emitNode(parser, 'onclosecdata')\n            parser.cdata = ''\n            parser.state = S.TEXT\n          } else if (c === ']') {\n            parser.cdata += ']'\n          } else {\n            parser.cdata += ']]' + c\n            parser.state = S.CDATA\n          }\n          continue\n\n        case S.PROC_INST:\n          if (c === '?') {\n            parser.state = S.PROC_INST_ENDING\n          } else if (is(whitespace, c)) {\n            parser.state = S.PROC_INST_BODY\n          } else {\n            parser.procInstName += c\n          }\n          continue\n\n        case S.PROC_INST_BODY:\n          if (!parser.procInstBody && is(whitespace, c)) {\n            continue\n          } else if (c === '?') {\n            parser.state = S.PROC_INST_ENDING\n          } else {\n            parser.procInstBody += c\n          }\n          continue\n\n        case S.PROC_INST_ENDING:\n          if (c === '>') {\n            emitNode(parser, 'onprocessinginstruction', {\n              name: parser.procInstName,\n              body: parser.procInstBody\n            })\n            parser.procInstName = parser.procInstBody = ''\n            parser.state = S.TEXT\n          } else {\n            parser.procInstBody += '?' + c\n            parser.state = S.PROC_INST_BODY\n          }\n          continue\n\n        case S.OPEN_TAG:\n          if (is(nameBody, c)) {\n            parser.tagName += c\n          } else {\n            newTag(parser)\n            if (c === '>') {\n              openTag(parser)\n            } else if (c === '/') {\n              parser.state = S.OPEN_TAG_SLASH\n            } else {\n              if (not(whitespace, c)) {\n                strictFail(parser, 'Invalid character in tag name')\n              }\n              parser.state = S.ATTRIB\n            }\n          }\n          continue\n\n        case S.OPEN_TAG_SLASH:\n          if (c === '>') {\n            openTag(parser, true)\n            closeTag(parser)\n          } else {\n            strictFail(parser, 'Forward-slash in opening tag not followed by >')\n            parser.state = S.ATTRIB\n          }\n          continue\n\n        case S.ATTRIB:\n          // haven't read the attribute name yet.\n          if (is(whitespace, c)) {\n            continue\n          } else if (c === '>') {\n            openTag(parser)\n          } else if (c === '/') {\n            parser.state = S.OPEN_TAG_SLASH\n          } else if (is(nameStart, c)) {\n            parser.attribName = c\n            parser.attribValue = ''\n            parser.state = S.ATTRIB_NAME\n          } else {\n            strictFail(parser, 'Invalid attribute name')\n          }\n          continue\n\n        case S.ATTRIB_NAME:\n          if (c === '=') {\n            parser.state = S.ATTRIB_VALUE\n          } else if (c === '>') {\n            strictFail(parser, 'Attribute without value')\n            parser.attribValue = parser.attribName\n            attrib(parser)\n            openTag(parser)\n          } else if (is(whitespace, c)) {\n            parser.state = S.ATTRIB_NAME_SAW_WHITE\n          } else if (is(nameBody, c)) {\n            parser.attribName += c\n          } else {\n            strictFail(parser, 'Invalid attribute name')\n          }\n          continue\n\n        case S.ATTRIB_NAME_SAW_WHITE:\n          if (c === '=') {\n            parser.state = S.ATTRIB_VALUE\n          } else if (is(whitespace, c)) {\n            continue\n          } else {\n            strictFail(parser, 'Attribute without value')\n            parser.tag.attributes[parser.attribName] = ''\n            parser.attribValue = ''\n            emitNode(parser, 'onattribute', {\n              name: parser.attribName,\n              value: ''\n            })\n            parser.attribName = ''\n            if (c === '>') {\n              openTag(parser)\n            } else if (is(nameStart, c)) {\n              parser.attribName = c\n              parser.state = S.ATTRIB_NAME\n            } else {\n              strictFail(parser, 'Invalid attribute name')\n              parser.state = S.ATTRIB\n            }\n          }\n          continue\n\n        case S.ATTRIB_VALUE:\n          if (is(whitespace, c)) {\n            continue\n          } else if (is(quote, c)) {\n            parser.q = c\n            parser.state = S.ATTRIB_VALUE_QUOTED\n          } else {\n            strictFail(parser, 'Unquoted attribute value')\n            parser.state = S.ATTRIB_VALUE_UNQUOTED\n            parser.attribValue = c\n          }\n          continue\n\n        case S.ATTRIB_VALUE_QUOTED:\n          if (c !== parser.q) {\n            if (c === '&') {\n              parser.state = S.ATTRIB_VALUE_ENTITY_Q\n            } else {\n              parser.attribValue += c\n            }\n            continue\n          }\n          attrib(parser)\n          parser.q = ''\n          parser.state = S.ATTRIB_VALUE_CLOSED\n          continue\n\n        case S.ATTRIB_VALUE_CLOSED:\n          if (is(whitespace, c)) {\n            parser.state = S.ATTRIB\n          } else if (c === '>') {\n            openTag(parser)\n          } else if (c === '/') {\n            parser.state = S.OPEN_TAG_SLASH\n          } else if (is(nameStart, c)) {\n            strictFail(parser, 'No whitespace between attributes')\n            parser.attribName = c\n            parser.attribValue = ''\n            parser.state = S.ATTRIB_NAME\n          } else {\n            strictFail(parser, 'Invalid attribute name')\n          }\n          continue\n\n        case S.ATTRIB_VALUE_UNQUOTED:\n          if (not(attribEnd, c)) {\n            if (c === '&') {\n              parser.state = S.ATTRIB_VALUE_ENTITY_U\n            } else {\n              parser.attribValue += c\n            }\n            continue\n          }\n          attrib(parser)\n          if (c === '>') {\n            openTag(parser)\n          } else {\n            parser.state = S.ATTRIB\n          }\n          continue\n\n        case S.CLOSE_TAG:\n          if (!parser.tagName) {\n            if (is(whitespace, c)) {\n              continue\n            } else if (not(nameStart, c)) {\n              if (parser.script) {\n                parser.script += '</' + c\n                parser.state = S.SCRIPT\n              } else {\n                strictFail(parser, 'Invalid tagname in closing tag.')\n              }\n            } else {\n              parser.tagName = c\n            }\n          } else if (c === '>') {\n            closeTag(parser)\n          } else if (is(nameBody, c)) {\n            parser.tagName += c\n          } else if (parser.script) {\n            parser.script += '</' + parser.tagName\n            parser.tagName = ''\n            parser.state = S.SCRIPT\n          } else {\n            if (not(whitespace, c)) {\n              strictFail(parser, 'Invalid tagname in closing tag')\n            }\n            parser.state = S.CLOSE_TAG_SAW_WHITE\n          }\n          continue\n\n        case S.CLOSE_TAG_SAW_WHITE:\n          if (is(whitespace, c)) {\n            continue\n          }\n          if (c === '>') {\n            closeTag(parser)\n          } else {\n            strictFail(parser, 'Invalid characters in closing tag')\n          }\n          continue\n\n        case S.TEXT_ENTITY:\n        case S.ATTRIB_VALUE_ENTITY_Q:\n        case S.ATTRIB_VALUE_ENTITY_U:\n          var returnState\n          var buffer\n          switch (parser.state) {\n            case S.TEXT_ENTITY:\n              returnState = S.TEXT\n              buffer = 'textNode'\n              break\n\n            case S.ATTRIB_VALUE_ENTITY_Q:\n              returnState = S.ATTRIB_VALUE_QUOTED\n              buffer = 'attribValue'\n              break\n\n            case S.ATTRIB_VALUE_ENTITY_U:\n              returnState = S.ATTRIB_VALUE_UNQUOTED\n              buffer = 'attribValue'\n              break\n          }\n\n          if (c === ';') {\n            parser[buffer] += parseEntity(parser)\n            parser.entity = ''\n            parser.state = returnState\n          } else if (is(parser.entity.length ? entityBody : entityStart, c)) {\n            parser.entity += c\n          } else {\n            strictFail(parser, 'Invalid character in entity name')\n            parser[buffer] += '&' + parser.entity + c\n            parser.entity = ''\n            parser.state = returnState\n          }\n\n          continue\n\n        default:\n          throw new Error(parser, 'Unknown state: ' + parser.state)\n      }\n    } // while\n\n    if (parser.position >= parser.bufferCheckPosition) {\n      checkBufferLength(parser)\n    }\n    return parser\n  }\n\n  /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */\n  if (!String.fromCodePoint) {\n    (function () {\n      var stringFromCharCode = String.fromCharCode\n      var floor = Math.floor\n      var fromCodePoint = function () {\n        var MAX_SIZE = 0x4000\n        var codeUnits = []\n        var highSurrogate\n        var lowSurrogate\n        var index = -1\n        var length = arguments.length\n        if (!length) {\n          return ''\n        }\n        var result = ''\n        while (++index < length) {\n          var codePoint = Number(arguments[index])\n          if (\n            !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n            codePoint < 0 || // not a valid Unicode code point\n            codePoint > 0x10FFFF || // not a valid Unicode code point\n            floor(codePoint) !== codePoint // not an integer\n          ) {\n            throw RangeError('Invalid code point: ' + codePoint)\n          }\n          if (codePoint <= 0xFFFF) { // BMP code point\n            codeUnits.push(codePoint)\n          } else { // Astral code point; split in surrogate halves\n            // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n            codePoint -= 0x10000\n            highSurrogate = (codePoint >> 10) + 0xD800\n            lowSurrogate = (codePoint % 0x400) + 0xDC00\n            codeUnits.push(highSurrogate, lowSurrogate)\n          }\n          if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n            result += stringFromCharCode.apply(null, codeUnits)\n            codeUnits.length = 0\n          }\n        }\n        return result\n      }\n      if (Object.defineProperty) {\n        Object.defineProperty(String, 'fromCodePoint', {\n          value: fromCodePoint,\n          configurable: true,\n          writable: true\n        })\n      } else {\n        String.fromCodePoint = fromCodePoint\n      }\n    }())\n  }\n})(typeof exports === 'undefined' ? this.sax = {} : exports)\n\n}).call(this,require(\"buffer\").Buffer)\n},{\"buffer\":77,\"stream\":151,\"string_decoder\":152}],151:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = Stream;\n\nvar EE = require('events').EventEmitter;\nvar inherits = require('inherits');\n\ninherits(Stream, EE);\nStream.Readable = require('readable-stream/readable.js');\nStream.Writable = require('readable-stream/writable.js');\nStream.Duplex = require('readable-stream/duplex.js');\nStream.Transform = require('readable-stream/transform.js');\nStream.PassThrough = require('readable-stream/passthrough.js');\n\n// Backwards-compat with node 0.4.x\nStream.Stream = Stream;\n\n\n\n// old-style streams.  Note that the pipe method (the only relevant\n// part of this class) is overridden in the Readable class.\n\nfunction Stream() {\n  EE.call(this);\n}\n\nStream.prototype.pipe = function(dest, options) {\n  var source = this;\n\n  function ondata(chunk) {\n    if (dest.writable) {\n      if (false === dest.write(chunk) && source.pause) {\n        source.pause();\n      }\n    }\n  }\n\n  source.on('data', ondata);\n\n  function ondrain() {\n    if (source.readable && source.resume) {\n      source.resume();\n    }\n  }\n\n  dest.on('drain', ondrain);\n\n  // If the 'end' option is not supplied, dest.end() will be called when\n  // source gets the 'end' or 'close' events.  Only dest.end() once.\n  if (!dest._isStdio && (!options || options.end !== false)) {\n    source.on('end', onend);\n    source.on('close', onclose);\n  }\n\n  var didOnEnd = false;\n  function onend() {\n    if (didOnEnd) return;\n    didOnEnd = true;\n\n    dest.end();\n  }\n\n\n  function onclose() {\n    if (didOnEnd) return;\n    didOnEnd = true;\n\n    if (typeof dest.destroy === 'function') dest.destroy();\n  }\n\n  // don't leave dangling pipes when there are errors.\n  function onerror(er) {\n    cleanup();\n    if (EE.listenerCount(this, 'error') === 0) {\n      throw er; // Unhandled stream error in pipe.\n    }\n  }\n\n  source.on('error', onerror);\n  dest.on('error', onerror);\n\n  // remove all the event listeners that were added.\n  function cleanup() {\n    source.removeListener('data', ondata);\n    dest.removeListener('drain', ondrain);\n\n    source.removeListener('end', onend);\n    source.removeListener('close', onclose);\n\n    source.removeListener('error', onerror);\n    dest.removeListener('error', onerror);\n\n    source.removeListener('end', cleanup);\n    source.removeListener('close', cleanup);\n\n    dest.removeListener('close', cleanup);\n  }\n\n  source.on('end', cleanup);\n  source.on('close', cleanup);\n\n  dest.on('close', cleanup);\n\n  dest.emit('pipe', source);\n\n  // Allow for unix-like usage: A.pipe(B).pipe(C)\n  return dest;\n};\n\n},{\"events\":79,\"inherits\":81,\"readable-stream/duplex.js\":139,\"readable-stream/passthrough.js\":146,\"readable-stream/readable.js\":147,\"readable-stream/transform.js\":148,\"readable-stream/writable.js\":149}],152:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar Buffer = require('buffer').Buffer;\n\nvar isBufferEncoding = Buffer.isEncoding\n  || function(encoding) {\n       switch (encoding && encoding.toLowerCase()) {\n         case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;\n         default: return false;\n       }\n     }\n\n\nfunction assertEncoding(encoding) {\n  if (encoding && !isBufferEncoding(encoding)) {\n    throw new Error('Unknown encoding: ' + encoding);\n  }\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters. CESU-8 is handled as part of the UTF-8 encoding.\n//\n// @TODO Handling all encodings inside a single object makes it very difficult\n// to reason about this code, so it should be split up in the future.\n// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code\n// points as used by CESU-8.\nvar StringDecoder = exports.StringDecoder = function(encoding) {\n  this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');\n  assertEncoding(encoding);\n  switch (this.encoding) {\n    case 'utf8':\n      // CESU-8 represents each of Surrogate Pair by 3-bytes\n      this.surrogateSize = 3;\n      break;\n    case 'ucs2':\n    case 'utf16le':\n      // UTF-16 represents each of Surrogate Pair by 2-bytes\n      this.surrogateSize = 2;\n      this.detectIncompleteChar = utf16DetectIncompleteChar;\n      break;\n    case 'base64':\n      // Base-64 stores 3 bytes in 4 chars, and pads the remainder.\n      this.surrogateSize = 3;\n      this.detectIncompleteChar = base64DetectIncompleteChar;\n      break;\n    default:\n      this.write = passThroughWrite;\n      return;\n  }\n\n  // Enough space to store all bytes of a single character. UTF-8 needs 4\n  // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).\n  this.charBuffer = new Buffer(6);\n  // Number of bytes received for the current incomplete multi-byte character.\n  this.charReceived = 0;\n  // Number of bytes expected for the current incomplete multi-byte character.\n  this.charLength = 0;\n};\n\n\n// write decodes the given buffer and returns it as JS string that is\n// guaranteed to not contain any partial multi-byte characters. Any partial\n// character found at the end of the buffer is buffered up, and will be\n// returned when calling write again with the remaining bytes.\n//\n// Note: Converting a Buffer containing an orphan surrogate to a String\n// currently works, but converting a String to a Buffer (via `new Buffer`, or\n// Buffer#write) will replace incomplete surrogates with the unicode\n// replacement character. See https://codereview.chromium.org/121173009/ .\nStringDecoder.prototype.write = function(buffer) {\n  var charStr = '';\n  // if our last write ended with an incomplete multibyte character\n  while (this.charLength) {\n    // determine how many remaining bytes this buffer has to offer for this char\n    var available = (buffer.length >= this.charLength - this.charReceived) ?\n        this.charLength - this.charReceived :\n        buffer.length;\n\n    // add the new bytes to the char buffer\n    buffer.copy(this.charBuffer, this.charReceived, 0, available);\n    this.charReceived += available;\n\n    if (this.charReceived < this.charLength) {\n      // still not enough chars in this buffer? wait for more ...\n      return '';\n    }\n\n    // remove bytes belonging to the current character from the buffer\n    buffer = buffer.slice(available, buffer.length);\n\n    // get the character that was split\n    charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);\n\n    // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character\n    var charCode = charStr.charCodeAt(charStr.length - 1);\n    if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n      this.charLength += this.surrogateSize;\n      charStr = '';\n      continue;\n    }\n    this.charReceived = this.charLength = 0;\n\n    // if there are no more bytes in this buffer, just emit our char\n    if (buffer.length === 0) {\n      return charStr;\n    }\n    break;\n  }\n\n  // determine and set charLength / charReceived\n  this.detectIncompleteChar(buffer);\n\n  var end = buffer.length;\n  if (this.charLength) {\n    // buffer the incomplete character bytes we got\n    buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);\n    end -= this.charReceived;\n  }\n\n  charStr += buffer.toString(this.encoding, 0, end);\n\n  var end = charStr.length - 1;\n  var charCode = charStr.charCodeAt(end);\n  // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character\n  if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n    var size = this.surrogateSize;\n    this.charLength += size;\n    this.charReceived += size;\n    this.charBuffer.copy(this.charBuffer, size, 0, size);\n    buffer.copy(this.charBuffer, 0, 0, size);\n    return charStr.substring(0, end);\n  }\n\n  // or just emit the charStr\n  return charStr;\n};\n\n// detectIncompleteChar determines if there is an incomplete UTF-8 character at\n// the end of the given buffer. If so, it sets this.charLength to the byte\n// length that character, and sets this.charReceived to the number of bytes\n// that are available for this character.\nStringDecoder.prototype.detectIncompleteChar = function(buffer) {\n  // determine how many bytes we have to check at the end of this buffer\n  var i = (buffer.length >= 3) ? 3 : buffer.length;\n\n  // Figure out if one of the last i bytes of our buffer announces an\n  // incomplete char.\n  for (; i > 0; i--) {\n    var c = buffer[buffer.length - i];\n\n    // See http://en.wikipedia.org/wiki/UTF-8#Description\n\n    // 110XXXXX\n    if (i == 1 && c >> 5 == 0x06) {\n      this.charLength = 2;\n      break;\n    }\n\n    // 1110XXXX\n    if (i <= 2 && c >> 4 == 0x0E) {\n      this.charLength = 3;\n      break;\n    }\n\n    // 11110XXX\n    if (i <= 3 && c >> 3 == 0x1E) {\n      this.charLength = 4;\n      break;\n    }\n  }\n  this.charReceived = i;\n};\n\nStringDecoder.prototype.end = function(buffer) {\n  var res = '';\n  if (buffer && buffer.length)\n    res = this.write(buffer);\n\n  if (this.charReceived) {\n    var cr = this.charReceived;\n    var buf = this.charBuffer;\n    var enc = this.encoding;\n    res += buf.slice(0, cr).toString(enc);\n  }\n\n  return res;\n};\n\nfunction passThroughWrite(buffer) {\n  return buffer.toString(this.encoding);\n}\n\nfunction utf16DetectIncompleteChar(buffer) {\n  this.charReceived = buffer.length % 2;\n  this.charLength = this.charReceived ? 2 : 0;\n}\n\nfunction base64DetectIncompleteChar(buffer) {\n  this.charReceived = buffer.length % 3;\n  this.charLength = this.charReceived ? 3 : 0;\n}\n\n},{\"buffer\":77}],153:[function(require,module,exports){\n//     Underscore.js 1.8.3\n//     http://underscorejs.org\n//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Underscore may be freely distributed under the MIT license.\n\n(function() {\n\n  // Baseline setup\n  // --------------\n\n  // Establish the root object, `window` in the browser, or `exports` on the server.\n  var root = this;\n\n  // Save the previous value of the `_` variable.\n  var previousUnderscore = root._;\n\n  // Save bytes in the minified (but not gzipped) version:\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n  // Create quick reference variables for speed access to core prototypes.\n  var\n    push             = ArrayProto.push,\n    slice            = ArrayProto.slice,\n    toString         = ObjProto.toString,\n    hasOwnProperty   = ObjProto.hasOwnProperty;\n\n  // All **ECMAScript 5** native function implementations that we hope to use\n  // are declared here.\n  var\n    nativeIsArray      = Array.isArray,\n    nativeKeys         = Object.keys,\n    nativeBind         = FuncProto.bind,\n    nativeCreate       = Object.create;\n\n  // Naked function reference for surrogate-prototype-swapping.\n  var Ctor = function(){};\n\n  // Create a safe reference to the Underscore object for use below.\n  var _ = function(obj) {\n    if (obj instanceof _) return obj;\n    if (!(this instanceof _)) return new _(obj);\n    this._wrapped = obj;\n  };\n\n  // Export the Underscore object for **Node.js**, with\n  // backwards-compatibility for the old `require()` API. If we're in\n  // the browser, add `_` as a global object.\n  if (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports) {\n      exports = module.exports = _;\n    }\n    exports._ = _;\n  } else {\n    root._ = _;\n  }\n\n  // Current version.\n  _.VERSION = '1.8.3';\n\n  // Internal function that returns an efficient (for current engines) version\n  // of the passed-in callback, to be repeatedly applied in other Underscore\n  // functions.\n  var optimizeCb = function(func, context, argCount) {\n    if (context === void 0) return func;\n    switch (argCount == null ? 3 : argCount) {\n      case 1: return function(value) {\n        return func.call(context, value);\n      };\n      case 2: return function(value, other) {\n        return func.call(context, value, other);\n      };\n      case 3: return function(value, index, collection) {\n        return func.call(context, value, index, collection);\n      };\n      case 4: return function(accumulator, value, index, collection) {\n        return func.call(context, accumulator, value, index, collection);\n      };\n    }\n    return function() {\n      return func.apply(context, arguments);\n    };\n  };\n\n  // A mostly-internal function to generate callbacks that can be applied\n  // to each element in a collection, returning the desired result — either\n  // identity, an arbitrary callback, a property matcher, or a property accessor.\n  var cb = function(value, context, argCount) {\n    if (value == null) return _.identity;\n    if (_.isFunction(value)) return optimizeCb(value, context, argCount);\n    if (_.isObject(value)) return _.matcher(value);\n    return _.property(value);\n  };\n  _.iteratee = function(value, context) {\n    return cb(value, context, Infinity);\n  };\n\n  // An internal function for creating assigner functions.\n  var createAssigner = function(keysFunc, undefinedOnly) {\n    return function(obj) {\n      var length = arguments.length;\n      if (length < 2 || obj == null) return obj;\n      for (var index = 1; index < length; index++) {\n        var source = arguments[index],\n            keys = keysFunc(source),\n            l = keys.length;\n        for (var i = 0; i < l; i++) {\n          var key = keys[i];\n          if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];\n        }\n      }\n      return obj;\n    };\n  };\n\n  // An internal function for creating a new object that inherits from another.\n  var baseCreate = function(prototype) {\n    if (!_.isObject(prototype)) return {};\n    if (nativeCreate) return nativeCreate(prototype);\n    Ctor.prototype = prototype;\n    var result = new Ctor;\n    Ctor.prototype = null;\n    return result;\n  };\n\n  var property = function(key) {\n    return function(obj) {\n      return obj == null ? void 0 : obj[key];\n    };\n  };\n\n  // Helper for collection methods to determine whether a collection\n  // should be iterated as an array or as an object\n  // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\n  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\n  var getLength = property('length');\n  var isArrayLike = function(collection) {\n    var length = getLength(collection);\n    return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n  };\n\n  // Collection Functions\n  // --------------------\n\n  // The cornerstone, an `each` implementation, aka `forEach`.\n  // Handles raw objects in addition to array-likes. Treats all\n  // sparse array-likes as if they were dense.\n  _.each = _.forEach = function(obj, iteratee, context) {\n    iteratee = optimizeCb(iteratee, context);\n    var i, length;\n    if (isArrayLike(obj)) {\n      for (i = 0, length = obj.length; i < length; i++) {\n        iteratee(obj[i], i, obj);\n      }\n    } else {\n      var keys = _.keys(obj);\n      for (i = 0, length = keys.length; i < length; i++) {\n        iteratee(obj[keys[i]], keys[i], obj);\n      }\n    }\n    return obj;\n  };\n\n  // Return the results of applying the iteratee to each element.\n  _.map = _.collect = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length,\n        results = Array(length);\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      results[index] = iteratee(obj[currentKey], currentKey, obj);\n    }\n    return results;\n  };\n\n  // Create a reducing function iterating left or right.\n  function createReduce(dir) {\n    // Optimized iterator function as using arguments.length\n    // in the main function will deoptimize the, see #1991.\n    function iterator(obj, iteratee, memo, keys, index, length) {\n      for (; index >= 0 && index < length; index += dir) {\n        var currentKey = keys ? keys[index] : index;\n        memo = iteratee(memo, obj[currentKey], currentKey, obj);\n      }\n      return memo;\n    }\n\n    return function(obj, iteratee, memo, context) {\n      iteratee = optimizeCb(iteratee, context, 4);\n      var keys = !isArrayLike(obj) && _.keys(obj),\n          length = (keys || obj).length,\n          index = dir > 0 ? 0 : length - 1;\n      // Determine the initial value if none is provided.\n      if (arguments.length < 3) {\n        memo = obj[keys ? keys[index] : index];\n        index += dir;\n      }\n      return iterator(obj, iteratee, memo, keys, index, length);\n    };\n  }\n\n  // **Reduce** builds up a single result from a list of values, aka `inject`,\n  // or `foldl`.\n  _.reduce = _.foldl = _.inject = createReduce(1);\n\n  // The right-associative version of reduce, also known as `foldr`.\n  _.reduceRight = _.foldr = createReduce(-1);\n\n  // Return the first value which passes a truth test. Aliased as `detect`.\n  _.find = _.detect = function(obj, predicate, context) {\n    var key;\n    if (isArrayLike(obj)) {\n      key = _.findIndex(obj, predicate, context);\n    } else {\n      key = _.findKey(obj, predicate, context);\n    }\n    if (key !== void 0 && key !== -1) return obj[key];\n  };\n\n  // Return all the elements that pass a truth test.\n  // Aliased as `select`.\n  _.filter = _.select = function(obj, predicate, context) {\n    var results = [];\n    predicate = cb(predicate, context);\n    _.each(obj, function(value, index, list) {\n      if (predicate(value, index, list)) results.push(value);\n    });\n    return results;\n  };\n\n  // Return all the elements for which a truth test fails.\n  _.reject = function(obj, predicate, context) {\n    return _.filter(obj, _.negate(cb(predicate)), context);\n  };\n\n  // Determine whether all of the elements match a truth test.\n  // Aliased as `all`.\n  _.every = _.all = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length;\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      if (!predicate(obj[currentKey], currentKey, obj)) return false;\n    }\n    return true;\n  };\n\n  // Determine if at least one element in the object matches a truth test.\n  // Aliased as `any`.\n  _.some = _.any = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length;\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      if (predicate(obj[currentKey], currentKey, obj)) return true;\n    }\n    return false;\n  };\n\n  // Determine if the array or object contains a given item (using `===`).\n  // Aliased as `includes` and `include`.\n  _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {\n    if (!isArrayLike(obj)) obj = _.values(obj);\n    if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n    return _.indexOf(obj, item, fromIndex) >= 0;\n  };\n\n  // Invoke a method (with arguments) on every item in a collection.\n  _.invoke = function(obj, method) {\n    var args = slice.call(arguments, 2);\n    var isFunc = _.isFunction(method);\n    return _.map(obj, function(value) {\n      var func = isFunc ? method : value[method];\n      return func == null ? func : func.apply(value, args);\n    });\n  };\n\n  // Convenience version of a common use case of `map`: fetching a property.\n  _.pluck = function(obj, key) {\n    return _.map(obj, _.property(key));\n  };\n\n  // Convenience version of a common use case of `filter`: selecting only objects\n  // containing specific `key:value` pairs.\n  _.where = function(obj, attrs) {\n    return _.filter(obj, _.matcher(attrs));\n  };\n\n  // Convenience version of a common use case of `find`: getting the first object\n  // containing specific `key:value` pairs.\n  _.findWhere = function(obj, attrs) {\n    return _.find(obj, _.matcher(attrs));\n  };\n\n  // Return the maximum element (or element-based computation).\n  _.max = function(obj, iteratee, context) {\n    var result = -Infinity, lastComputed = -Infinity,\n        value, computed;\n    if (iteratee == null && obj != null) {\n      obj = isArrayLike(obj) ? obj : _.values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value > result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index, list) {\n        computed = iteratee(value, index, list);\n        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {\n          result = value;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  };\n\n  // Return the minimum element (or element-based computation).\n  _.min = function(obj, iteratee, context) {\n    var result = Infinity, lastComputed = Infinity,\n        value, computed;\n    if (iteratee == null && obj != null) {\n      obj = isArrayLike(obj) ? obj : _.values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value < result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index, list) {\n        computed = iteratee(value, index, list);\n        if (computed < lastComputed || computed === Infinity && result === Infinity) {\n          result = value;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  };\n\n  // Shuffle a collection, using the modern version of the\n  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n  _.shuffle = function(obj) {\n    var set = isArrayLike(obj) ? obj : _.values(obj);\n    var length = set.length;\n    var shuffled = Array(length);\n    for (var index = 0, rand; index < length; index++) {\n      rand = _.random(0, index);\n      if (rand !== index) shuffled[index] = shuffled[rand];\n      shuffled[rand] = set[index];\n    }\n    return shuffled;\n  };\n\n  // Sample **n** random values from a collection.\n  // If **n** is not specified, returns a single random element.\n  // The internal `guard` argument allows it to work with `map`.\n  _.sample = function(obj, n, guard) {\n    if (n == null || guard) {\n      if (!isArrayLike(obj)) obj = _.values(obj);\n      return obj[_.random(obj.length - 1)];\n    }\n    return _.shuffle(obj).slice(0, Math.max(0, n));\n  };\n\n  // Sort the object's values by a criterion produced by an iteratee.\n  _.sortBy = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    return _.pluck(_.map(obj, function(value, index, list) {\n      return {\n        value: value,\n        index: index,\n        criteria: iteratee(value, index, list)\n      };\n    }).sort(function(left, right) {\n      var a = left.criteria;\n      var b = right.criteria;\n      if (a !== b) {\n        if (a > b || a === void 0) return 1;\n        if (a < b || b === void 0) return -1;\n      }\n      return left.index - right.index;\n    }), 'value');\n  };\n\n  // An internal function used for aggregate \"group by\" operations.\n  var group = function(behavior) {\n    return function(obj, iteratee, context) {\n      var result = {};\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index) {\n        var key = iteratee(value, index, obj);\n        behavior(result, value, key);\n      });\n      return result;\n    };\n  };\n\n  // Groups the object's values by a criterion. Pass either a string attribute\n  // to group by, or a function that returns the criterion.\n  _.groupBy = group(function(result, value, key) {\n    if (_.has(result, key)) result[key].push(value); else result[key] = [value];\n  });\n\n  // Indexes the object's values by a criterion, similar to `groupBy`, but for\n  // when you know that your index values will be unique.\n  _.indexBy = group(function(result, value, key) {\n    result[key] = value;\n  });\n\n  // Counts instances of an object that group by a certain criterion. Pass\n  // either a string attribute to count by, or a function that returns the\n  // criterion.\n  _.countBy = group(function(result, value, key) {\n    if (_.has(result, key)) result[key]++; else result[key] = 1;\n  });\n\n  // Safely create a real, live array from anything iterable.\n  _.toArray = function(obj) {\n    if (!obj) return [];\n    if (_.isArray(obj)) return slice.call(obj);\n    if (isArrayLike(obj)) return _.map(obj, _.identity);\n    return _.values(obj);\n  };\n\n  // Return the number of elements in an object.\n  _.size = function(obj) {\n    if (obj == null) return 0;\n    return isArrayLike(obj) ? obj.length : _.keys(obj).length;\n  };\n\n  // Split a collection into two arrays: one whose elements all satisfy the given\n  // predicate, and one whose elements all do not satisfy the predicate.\n  _.partition = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var pass = [], fail = [];\n    _.each(obj, function(value, key, obj) {\n      (predicate(value, key, obj) ? pass : fail).push(value);\n    });\n    return [pass, fail];\n  };\n\n  // Array Functions\n  // ---------------\n\n  // Get the first element of an array. Passing **n** will return the first N\n  // values in the array. Aliased as `head` and `take`. The **guard** check\n  // allows it to work with `_.map`.\n  _.first = _.head = _.take = function(array, n, guard) {\n    if (array == null) return void 0;\n    if (n == null || guard) return array[0];\n    return _.initial(array, array.length - n);\n  };\n\n  // Returns everything but the last entry of the array. Especially useful on\n  // the arguments object. Passing **n** will return all the values in\n  // the array, excluding the last N.\n  _.initial = function(array, n, guard) {\n    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n  };\n\n  // Get the last element of an array. Passing **n** will return the last N\n  // values in the array.\n  _.last = function(array, n, guard) {\n    if (array == null) return void 0;\n    if (n == null || guard) return array[array.length - 1];\n    return _.rest(array, Math.max(0, array.length - n));\n  };\n\n  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.\n  // Especially useful on the arguments object. Passing an **n** will return\n  // the rest N values in the array.\n  _.rest = _.tail = _.drop = function(array, n, guard) {\n    return slice.call(array, n == null || guard ? 1 : n);\n  };\n\n  // Trim out all falsy values from an array.\n  _.compact = function(array) {\n    return _.filter(array, _.identity);\n  };\n\n  // Internal implementation of a recursive `flatten` function.\n  var flatten = function(input, shallow, strict, startIndex) {\n    var output = [], idx = 0;\n    for (var i = startIndex || 0, length = getLength(input); i < length; i++) {\n      var value = input[i];\n      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {\n        //flatten current level of array or arguments object\n        if (!shallow) value = flatten(value, shallow, strict);\n        var j = 0, len = value.length;\n        output.length += len;\n        while (j < len) {\n          output[idx++] = value[j++];\n        }\n      } else if (!strict) {\n        output[idx++] = value;\n      }\n    }\n    return output;\n  };\n\n  // Flatten out an array, either recursively (by default), or just one level.\n  _.flatten = function(array, shallow) {\n    return flatten(array, shallow, false);\n  };\n\n  // Return a version of the array that does not contain the specified value(s).\n  _.without = function(array) {\n    return _.difference(array, slice.call(arguments, 1));\n  };\n\n  // Produce a duplicate-free version of the array. If the array has already\n  // been sorted, you have the option of using a faster algorithm.\n  // Aliased as `unique`.\n  _.uniq = _.unique = function(array, isSorted, iteratee, context) {\n    if (!_.isBoolean(isSorted)) {\n      context = iteratee;\n      iteratee = isSorted;\n      isSorted = false;\n    }\n    if (iteratee != null) iteratee = cb(iteratee, context);\n    var result = [];\n    var seen = [];\n    for (var i = 0, length = getLength(array); i < length; i++) {\n      var value = array[i],\n          computed = iteratee ? iteratee(value, i, array) : value;\n      if (isSorted) {\n        if (!i || seen !== computed) result.push(value);\n        seen = computed;\n      } else if (iteratee) {\n        if (!_.contains(seen, computed)) {\n          seen.push(computed);\n          result.push(value);\n        }\n      } else if (!_.contains(result, value)) {\n        result.push(value);\n      }\n    }\n    return result;\n  };\n\n  // Produce an array that contains the union: each distinct element from all of\n  // the passed-in arrays.\n  _.union = function() {\n    return _.uniq(flatten(arguments, true, true));\n  };\n\n  // Produce an array that contains every item shared between all the\n  // passed-in arrays.\n  _.intersection = function(array) {\n    var result = [];\n    var argsLength = arguments.length;\n    for (var i = 0, length = getLength(array); i < length; i++) {\n      var item = array[i];\n      if (_.contains(result, item)) continue;\n      for (var j = 1; j < argsLength; j++) {\n        if (!_.contains(arguments[j], item)) break;\n      }\n      if (j === argsLength) result.push(item);\n    }\n    return result;\n  };\n\n  // Take the difference between one array and a number of other arrays.\n  // Only the elements present in just the first array will remain.\n  _.difference = function(array) {\n    var rest = flatten(arguments, true, true, 1);\n    return _.filter(array, function(value){\n      return !_.contains(rest, value);\n    });\n  };\n\n  // Zip together multiple lists into a single array -- elements that share\n  // an index go together.\n  _.zip = function() {\n    return _.unzip(arguments);\n  };\n\n  // Complement of _.zip. Unzip accepts an array of arrays and groups\n  // each array's elements on shared indices\n  _.unzip = function(array) {\n    var length = array && _.max(array, getLength).length || 0;\n    var result = Array(length);\n\n    for (var index = 0; index < length; index++) {\n      result[index] = _.pluck(array, index);\n    }\n    return result;\n  };\n\n  // Converts lists into objects. Pass either a single array of `[key, value]`\n  // pairs, or two parallel arrays of the same length -- one of keys, and one of\n  // the corresponding values.\n  _.object = function(list, values) {\n    var result = {};\n    for (var i = 0, length = getLength(list); i < length; i++) {\n      if (values) {\n        result[list[i]] = values[i];\n      } else {\n        result[list[i][0]] = list[i][1];\n      }\n    }\n    return result;\n  };\n\n  // Generator function to create the findIndex and findLastIndex functions\n  function createPredicateIndexFinder(dir) {\n    return function(array, predicate, context) {\n      predicate = cb(predicate, context);\n      var length = getLength(array);\n      var index = dir > 0 ? 0 : length - 1;\n      for (; index >= 0 && index < length; index += dir) {\n        if (predicate(array[index], index, array)) return index;\n      }\n      return -1;\n    };\n  }\n\n  // Returns the first index on an array-like that passes a predicate test\n  _.findIndex = createPredicateIndexFinder(1);\n  _.findLastIndex = createPredicateIndexFinder(-1);\n\n  // Use a comparator function to figure out the smallest index at which\n  // an object should be inserted so as to maintain order. Uses binary search.\n  _.sortedIndex = function(array, obj, iteratee, context) {\n    iteratee = cb(iteratee, context, 1);\n    var value = iteratee(obj);\n    var low = 0, high = getLength(array);\n    while (low < high) {\n      var mid = Math.floor((low + high) / 2);\n      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n    }\n    return low;\n  };\n\n  // Generator function to create the indexOf and lastIndexOf functions\n  function createIndexFinder(dir, predicateFind, sortedIndex) {\n    return function(array, item, idx) {\n      var i = 0, length = getLength(array);\n      if (typeof idx == 'number') {\n        if (dir > 0) {\n            i = idx >= 0 ? idx : Math.max(idx + length, i);\n        } else {\n            length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n        }\n      } else if (sortedIndex && idx && length) {\n        idx = sortedIndex(array, item);\n        return array[idx] === item ? idx : -1;\n      }\n      if (item !== item) {\n        idx = predicateFind(slice.call(array, i, length), _.isNaN);\n        return idx >= 0 ? idx + i : -1;\n      }\n      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n        if (array[idx] === item) return idx;\n      }\n      return -1;\n    };\n  }\n\n  // Return the position of the first occurrence of an item in an array,\n  // or -1 if the item is not included in the array.\n  // If the array is large and already in sort order, pass `true`\n  // for **isSorted** to use binary search.\n  _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);\n  _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);\n\n  // Generate an integer Array containing an arithmetic progression. A port of\n  // the native Python `range()` function. See\n  // [the Python documentation](http://docs.python.org/library/functions.html#range).\n  _.range = function(start, stop, step) {\n    if (stop == null) {\n      stop = start || 0;\n      start = 0;\n    }\n    step = step || 1;\n\n    var length = Math.max(Math.ceil((stop - start) / step), 0);\n    var range = Array(length);\n\n    for (var idx = 0; idx < length; idx++, start += step) {\n      range[idx] = start;\n    }\n\n    return range;\n  };\n\n  // Function (ahem) Functions\n  // ------------------\n\n  // Determines whether to execute a function as a constructor\n  // or a normal function with the provided arguments\n  var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {\n    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n    var self = baseCreate(sourceFunc.prototype);\n    var result = sourceFunc.apply(self, args);\n    if (_.isObject(result)) return result;\n    return self;\n  };\n\n  // Create a function bound to a given object (assigning `this`, and arguments,\n  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n  // available.\n  _.bind = function(func, context) {\n    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');\n    var args = slice.call(arguments, 2);\n    var bound = function() {\n      return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));\n    };\n    return bound;\n  };\n\n  // Partially apply a function by creating a version that has had some of its\n  // arguments pre-filled, without changing its dynamic `this` context. _ acts\n  // as a placeholder, allowing any combination of arguments to be pre-filled.\n  _.partial = function(func) {\n    var boundArgs = slice.call(arguments, 1);\n    var bound = function() {\n      var position = 0, length = boundArgs.length;\n      var args = Array(length);\n      for (var i = 0; i < length; i++) {\n        args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];\n      }\n      while (position < arguments.length) args.push(arguments[position++]);\n      return executeBound(func, bound, this, this, args);\n    };\n    return bound;\n  };\n\n  // Bind a number of an object's methods to that object. Remaining arguments\n  // are the method names to be bound. Useful for ensuring that all callbacks\n  // defined on an object belong to it.\n  _.bindAll = function(obj) {\n    var i, length = arguments.length, key;\n    if (length <= 1) throw new Error('bindAll must be passed function names');\n    for (i = 1; i < length; i++) {\n      key = arguments[i];\n      obj[key] = _.bind(obj[key], obj);\n    }\n    return obj;\n  };\n\n  // Memoize an expensive function by storing its results.\n  _.memoize = function(func, hasher) {\n    var memoize = function(key) {\n      var cache = memoize.cache;\n      var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);\n      return cache[address];\n    };\n    memoize.cache = {};\n    return memoize;\n  };\n\n  // Delays a function for the given number of milliseconds, and then calls\n  // it with the arguments supplied.\n  _.delay = function(func, wait) {\n    var args = slice.call(arguments, 2);\n    return setTimeout(function(){\n      return func.apply(null, args);\n    }, wait);\n  };\n\n  // Defers a function, scheduling it to run after the current call stack has\n  // cleared.\n  _.defer = _.partial(_.delay, _, 1);\n\n  // Returns a function, that, when invoked, will only be triggered at most once\n  // during a given window of time. Normally, the throttled function will run\n  // as much as it can, without ever going more than once per `wait` duration;\n  // but if you'd like to disable the execution on the leading edge, pass\n  // `{leading: false}`. To disable execution on the trailing edge, ditto.\n  _.throttle = function(func, wait, options) {\n    var context, args, result;\n    var timeout = null;\n    var previous = 0;\n    if (!options) options = {};\n    var later = function() {\n      previous = options.leading === false ? 0 : _.now();\n      timeout = null;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    };\n    return function() {\n      var now = _.now();\n      if (!previous && options.leading === false) previous = now;\n      var remaining = wait - (now - previous);\n      context = this;\n      args = arguments;\n      if (remaining <= 0 || remaining > wait) {\n        if (timeout) {\n          clearTimeout(timeout);\n          timeout = null;\n        }\n        previous = now;\n        result = func.apply(context, args);\n        if (!timeout) context = args = null;\n      } else if (!timeout && options.trailing !== false) {\n        timeout = setTimeout(later, remaining);\n      }\n      return result;\n    };\n  };\n\n  // Returns a function, that, as long as it continues to be invoked, will not\n  // be triggered. The function will be called after it stops being called for\n  // N milliseconds. If `immediate` is passed, trigger the function on the\n  // leading edge, instead of the trailing.\n  _.debounce = function(func, wait, immediate) {\n    var timeout, args, context, timestamp, result;\n\n    var later = function() {\n      var last = _.now() - timestamp;\n\n      if (last < wait && last >= 0) {\n        timeout = setTimeout(later, wait - last);\n      } else {\n        timeout = null;\n        if (!immediate) {\n          result = func.apply(context, args);\n          if (!timeout) context = args = null;\n        }\n      }\n    };\n\n    return function() {\n      context = this;\n      args = arguments;\n      timestamp = _.now();\n      var callNow = immediate && !timeout;\n      if (!timeout) timeout = setTimeout(later, wait);\n      if (callNow) {\n        result = func.apply(context, args);\n        context = args = null;\n      }\n\n      return result;\n    };\n  };\n\n  // Returns the first function passed as an argument to the second,\n  // allowing you to adjust arguments, run code before and after, and\n  // conditionally execute the original function.\n  _.wrap = function(func, wrapper) {\n    return _.partial(wrapper, func);\n  };\n\n  // Returns a negated version of the passed-in predicate.\n  _.negate = function(predicate) {\n    return function() {\n      return !predicate.apply(this, arguments);\n    };\n  };\n\n  // Returns a function that is the composition of a list of functions, each\n  // consuming the return value of the function that follows.\n  _.compose = function() {\n    var args = arguments;\n    var start = args.length - 1;\n    return function() {\n      var i = start;\n      var result = args[start].apply(this, arguments);\n      while (i--) result = args[i].call(this, result);\n      return result;\n    };\n  };\n\n  // Returns a function that will only be executed on and after the Nth call.\n  _.after = function(times, func) {\n    return function() {\n      if (--times < 1) {\n        return func.apply(this, arguments);\n      }\n    };\n  };\n\n  // Returns a function that will only be executed up to (but not including) the Nth call.\n  _.before = function(times, func) {\n    var memo;\n    return function() {\n      if (--times > 0) {\n        memo = func.apply(this, arguments);\n      }\n      if (times <= 1) func = null;\n      return memo;\n    };\n  };\n\n  // Returns a function that will be executed at most one time, no matter how\n  // often you call it. Useful for lazy initialization.\n  _.once = _.partial(_.before, 2);\n\n  // Object Functions\n  // ----------------\n\n  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\n  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\n  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n                      'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\n  function collectNonEnumProps(obj, keys) {\n    var nonEnumIdx = nonEnumerableProps.length;\n    var constructor = obj.constructor;\n    var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;\n\n    // Constructor is a special case.\n    var prop = 'constructor';\n    if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);\n\n    while (nonEnumIdx--) {\n      prop = nonEnumerableProps[nonEnumIdx];\n      if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {\n        keys.push(prop);\n      }\n    }\n  }\n\n  // Retrieve the names of an object's own properties.\n  // Delegates to **ECMAScript 5**'s native `Object.keys`\n  _.keys = function(obj) {\n    if (!_.isObject(obj)) return [];\n    if (nativeKeys) return nativeKeys(obj);\n    var keys = [];\n    for (var key in obj) if (_.has(obj, key)) keys.push(key);\n    // Ahem, IE < 9.\n    if (hasEnumBug) collectNonEnumProps(obj, keys);\n    return keys;\n  };\n\n  // Retrieve all the property names of an object.\n  _.allKeys = function(obj) {\n    if (!_.isObject(obj)) return [];\n    var keys = [];\n    for (var key in obj) keys.push(key);\n    // Ahem, IE < 9.\n    if (hasEnumBug) collectNonEnumProps(obj, keys);\n    return keys;\n  };\n\n  // Retrieve the values of an object's properties.\n  _.values = function(obj) {\n    var keys = _.keys(obj);\n    var length = keys.length;\n    var values = Array(length);\n    for (var i = 0; i < length; i++) {\n      values[i] = obj[keys[i]];\n    }\n    return values;\n  };\n\n  // Returns the results of applying the iteratee to each element of the object\n  // In contrast to _.map it returns an object\n  _.mapObject = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    var keys =  _.keys(obj),\n          length = keys.length,\n          results = {},\n          currentKey;\n      for (var index = 0; index < length; index++) {\n        currentKey = keys[index];\n        results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n      }\n      return results;\n  };\n\n  // Convert an object into a list of `[key, value]` pairs.\n  _.pairs = function(obj) {\n    var keys = _.keys(obj);\n    var length = keys.length;\n    var pairs = Array(length);\n    for (var i = 0; i < length; i++) {\n      pairs[i] = [keys[i], obj[keys[i]]];\n    }\n    return pairs;\n  };\n\n  // Invert the keys and values of an object. The values must be serializable.\n  _.invert = function(obj) {\n    var result = {};\n    var keys = _.keys(obj);\n    for (var i = 0, length = keys.length; i < length; i++) {\n      result[obj[keys[i]]] = keys[i];\n    }\n    return result;\n  };\n\n  // Return a sorted list of the function names available on the object.\n  // Aliased as `methods`\n  _.functions = _.methods = function(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (_.isFunction(obj[key])) names.push(key);\n    }\n    return names.sort();\n  };\n\n  // Extend a given object with all the properties in passed-in object(s).\n  _.extend = createAssigner(_.allKeys);\n\n  // Assigns a given object with all the own properties in the passed-in object(s)\n  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\n  _.extendOwn = _.assign = createAssigner(_.keys);\n\n  // Returns the first key on an object that passes a predicate test\n  _.findKey = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = _.keys(obj), key;\n    for (var i = 0, length = keys.length; i < length; i++) {\n      key = keys[i];\n      if (predicate(obj[key], key, obj)) return key;\n    }\n  };\n\n  // Return a copy of the object only containing the whitelisted properties.\n  _.pick = function(object, oiteratee, context) {\n    var result = {}, obj = object, iteratee, keys;\n    if (obj == null) return result;\n    if (_.isFunction(oiteratee)) {\n      keys = _.allKeys(obj);\n      iteratee = optimizeCb(oiteratee, context);\n    } else {\n      keys = flatten(arguments, false, false, 1);\n      iteratee = function(value, key, obj) { return key in obj; };\n      obj = Object(obj);\n    }\n    for (var i = 0, length = keys.length; i < length; i++) {\n      var key = keys[i];\n      var value = obj[key];\n      if (iteratee(value, key, obj)) result[key] = value;\n    }\n    return result;\n  };\n\n   // Return a copy of the object without the blacklisted properties.\n  _.omit = function(obj, iteratee, context) {\n    if (_.isFunction(iteratee)) {\n      iteratee = _.negate(iteratee);\n    } else {\n      var keys = _.map(flatten(arguments, false, false, 1), String);\n      iteratee = function(value, key) {\n        return !_.contains(keys, key);\n      };\n    }\n    return _.pick(obj, iteratee, context);\n  };\n\n  // Fill in a given object with default properties.\n  _.defaults = createAssigner(_.allKeys, true);\n\n  // Creates an object that inherits from the given prototype object.\n  // If additional properties are provided then they will be added to the\n  // created object.\n  _.create = function(prototype, props) {\n    var result = baseCreate(prototype);\n    if (props) _.extendOwn(result, props);\n    return result;\n  };\n\n  // Create a (shallow-cloned) duplicate of an object.\n  _.clone = function(obj) {\n    if (!_.isObject(obj)) return obj;\n    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n  };\n\n  // Invokes interceptor with the obj, and then returns obj.\n  // The primary purpose of this method is to \"tap into\" a method chain, in\n  // order to perform operations on intermediate results within the chain.\n  _.tap = function(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  };\n\n  // Returns whether an object has a given set of `key:value` pairs.\n  _.isMatch = function(object, attrs) {\n    var keys = _.keys(attrs), length = keys.length;\n    if (object == null) return !length;\n    var obj = Object(object);\n    for (var i = 0; i < length; i++) {\n      var key = keys[i];\n      if (attrs[key] !== obj[key] || !(key in obj)) return false;\n    }\n    return true;\n  };\n\n\n  // Internal recursive comparison function for `isEqual`.\n  var eq = function(a, b, aStack, bStack) {\n    // Identical objects are equal. `0 === -0`, but they aren't identical.\n    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).\n    if (a === b) return a !== 0 || 1 / a === 1 / b;\n    // A strict comparison is necessary because `null == undefined`.\n    if (a == null || b == null) return a === b;\n    // Unwrap any wrapped objects.\n    if (a instanceof _) a = a._wrapped;\n    if (b instanceof _) b = b._wrapped;\n    // Compare `[[Class]]` names.\n    var className = toString.call(a);\n    if (className !== toString.call(b)) return false;\n    switch (className) {\n      // Strings, numbers, regular expressions, dates, and booleans are compared by value.\n      case '[object RegExp]':\n      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n      case '[object String]':\n        // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n        // equivalent to `new String(\"5\")`.\n        return '' + a === '' + b;\n      case '[object Number]':\n        // `NaN`s are equivalent, but non-reflexive.\n        // Object(NaN) is equivalent to NaN\n        if (+a !== +a) return +b !== +b;\n        // An `egal` comparison is performed for other numeric values.\n        return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n      case '[object Date]':\n      case '[object Boolean]':\n        // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n        // millisecond representations. Note that invalid dates with millisecond representations\n        // of `NaN` are not equivalent.\n        return +a === +b;\n    }\n\n    var areArrays = className === '[object Array]';\n    if (!areArrays) {\n      if (typeof a != 'object' || typeof b != 'object') return false;\n\n      // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n      // from different frames are.\n      var aCtor = a.constructor, bCtor = b.constructor;\n      if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&\n                               _.isFunction(bCtor) && bCtor instanceof bCtor)\n                          && ('constructor' in a && 'constructor' in b)) {\n        return false;\n      }\n    }\n    // Assume equality for cyclic structures. The algorithm for detecting cyclic\n    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n    // Initializing stack of traversed objects.\n    // It's done here since we only need them for objects and arrays comparison.\n    aStack = aStack || [];\n    bStack = bStack || [];\n    var length = aStack.length;\n    while (length--) {\n      // Linear search. Performance is inversely proportional to the number of\n      // unique nested structures.\n      if (aStack[length] === a) return bStack[length] === b;\n    }\n\n    // Add the first object to the stack of traversed objects.\n    aStack.push(a);\n    bStack.push(b);\n\n    // Recursively compare objects and arrays.\n    if (areArrays) {\n      // Compare array lengths to determine if a deep comparison is necessary.\n      length = a.length;\n      if (length !== b.length) return false;\n      // Deep compare the contents, ignoring non-numeric properties.\n      while (length--) {\n        if (!eq(a[length], b[length], aStack, bStack)) return false;\n      }\n    } else {\n      // Deep compare objects.\n      var keys = _.keys(a), key;\n      length = keys.length;\n      // Ensure that both objects contain the same number of properties before comparing deep equality.\n      if (_.keys(b).length !== length) return false;\n      while (length--) {\n        // Deep compare each member\n        key = keys[length];\n        if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n      }\n    }\n    // Remove the first object from the stack of traversed objects.\n    aStack.pop();\n    bStack.pop();\n    return true;\n  };\n\n  // Perform a deep comparison to check if two objects are equal.\n  _.isEqual = function(a, b) {\n    return eq(a, b);\n  };\n\n  // Is a given array, string, or object empty?\n  // An \"empty\" object has no enumerable own-properties.\n  _.isEmpty = function(obj) {\n    if (obj == null) return true;\n    if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;\n    return _.keys(obj).length === 0;\n  };\n\n  // Is a given value a DOM element?\n  _.isElement = function(obj) {\n    return !!(obj && obj.nodeType === 1);\n  };\n\n  // Is a given value an array?\n  // Delegates to ECMA5's native Array.isArray\n  _.isArray = nativeIsArray || function(obj) {\n    return toString.call(obj) === '[object Array]';\n  };\n\n  // Is a given variable an object?\n  _.isObject = function(obj) {\n    var type = typeof obj;\n    return type === 'function' || type === 'object' && !!obj;\n  };\n\n  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.\n  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {\n    _['is' + name] = function(obj) {\n      return toString.call(obj) === '[object ' + name + ']';\n    };\n  });\n\n  // Define a fallback version of the method in browsers (ahem, IE < 9), where\n  // there isn't any inspectable \"Arguments\" type.\n  if (!_.isArguments(arguments)) {\n    _.isArguments = function(obj) {\n      return _.has(obj, 'callee');\n    };\n  }\n\n  // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,\n  // IE 11 (#1621), and in Safari 8 (#1929).\n  if (typeof /./ != 'function' && typeof Int8Array != 'object') {\n    _.isFunction = function(obj) {\n      return typeof obj == 'function' || false;\n    };\n  }\n\n  // Is a given object a finite number?\n  _.isFinite = function(obj) {\n    return isFinite(obj) && !isNaN(parseFloat(obj));\n  };\n\n  // Is the given value `NaN`? (NaN is the only number which does not equal itself).\n  _.isNaN = function(obj) {\n    return _.isNumber(obj) && obj !== +obj;\n  };\n\n  // Is a given value a boolean?\n  _.isBoolean = function(obj) {\n    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n  };\n\n  // Is a given value equal to null?\n  _.isNull = function(obj) {\n    return obj === null;\n  };\n\n  // Is a given variable undefined?\n  _.isUndefined = function(obj) {\n    return obj === void 0;\n  };\n\n  // Shortcut function for checking if an object has a given property directly\n  // on itself (in other words, not on a prototype).\n  _.has = function(obj, key) {\n    return obj != null && hasOwnProperty.call(obj, key);\n  };\n\n  // Utility Functions\n  // -----------------\n\n  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\n  // previous owner. Returns a reference to the Underscore object.\n  _.noConflict = function() {\n    root._ = previousUnderscore;\n    return this;\n  };\n\n  // Keep the identity function around for default iteratees.\n  _.identity = function(value) {\n    return value;\n  };\n\n  // Predicate-generating functions. Often useful outside of Underscore.\n  _.constant = function(value) {\n    return function() {\n      return value;\n    };\n  };\n\n  _.noop = function(){};\n\n  _.property = property;\n\n  // Generates a function for a given object that returns a given property.\n  _.propertyOf = function(obj) {\n    return obj == null ? function(){} : function(key) {\n      return obj[key];\n    };\n  };\n\n  // Returns a predicate for checking whether an object has a given set of\n  // `key:value` pairs.\n  _.matcher = _.matches = function(attrs) {\n    attrs = _.extendOwn({}, attrs);\n    return function(obj) {\n      return _.isMatch(obj, attrs);\n    };\n  };\n\n  // Run a function **n** times.\n  _.times = function(n, iteratee, context) {\n    var accum = Array(Math.max(0, n));\n    iteratee = optimizeCb(iteratee, context, 1);\n    for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n    return accum;\n  };\n\n  // Return a random integer between min and max (inclusive).\n  _.random = function(min, max) {\n    if (max == null) {\n      max = min;\n      min = 0;\n    }\n    return min + Math.floor(Math.random() * (max - min + 1));\n  };\n\n  // A (possibly faster) way to get the current timestamp as an integer.\n  _.now = Date.now || function() {\n    return new Date().getTime();\n  };\n\n   // List of HTML entities for escaping.\n  var escapeMap = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#x27;',\n    '`': '&#x60;'\n  };\n  var unescapeMap = _.invert(escapeMap);\n\n  // Functions for escaping and unescaping strings to/from HTML interpolation.\n  var createEscaper = function(map) {\n    var escaper = function(match) {\n      return map[match];\n    };\n    // Regexes for identifying a key that needs to be escaped\n    var source = '(?:' + _.keys(map).join('|') + ')';\n    var testRegexp = RegExp(source);\n    var replaceRegexp = RegExp(source, 'g');\n    return function(string) {\n      string = string == null ? '' : '' + string;\n      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n    };\n  };\n  _.escape = createEscaper(escapeMap);\n  _.unescape = createEscaper(unescapeMap);\n\n  // If the value of the named `property` is a function then invoke it with the\n  // `object` as context; otherwise, return it.\n  _.result = function(object, property, fallback) {\n    var value = object == null ? void 0 : object[property];\n    if (value === void 0) {\n      value = fallback;\n    }\n    return _.isFunction(value) ? value.call(object) : value;\n  };\n\n  // Generate a unique integer id (unique within the entire client session).\n  // Useful for temporary DOM ids.\n  var idCounter = 0;\n  _.uniqueId = function(prefix) {\n    var id = ++idCounter + '';\n    return prefix ? prefix + id : id;\n  };\n\n  // By default, Underscore uses ERB-style template delimiters, change the\n  // following template settings to use alternative delimiters.\n  _.templateSettings = {\n    evaluate    : /<%([\\s\\S]+?)%>/g,\n    interpolate : /<%=([\\s\\S]+?)%>/g,\n    escape      : /<%-([\\s\\S]+?)%>/g\n  };\n\n  // When customizing `templateSettings`, if you don't want to define an\n  // interpolation, evaluation or escaping regex, we need one that is\n  // guaranteed not to match.\n  var noMatch = /(.)^/;\n\n  // Certain characters need to be escaped so that they can be put into a\n  // string literal.\n  var escapes = {\n    \"'\":      \"'\",\n    '\\\\':     '\\\\',\n    '\\r':     'r',\n    '\\n':     'n',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  var escaper = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\n  var escapeChar = function(match) {\n    return '\\\\' + escapes[match];\n  };\n\n  // JavaScript micro-templating, similar to John Resig's implementation.\n  // Underscore templating handles arbitrary delimiters, preserves whitespace,\n  // and correctly escapes quotes within interpolated code.\n  // NB: `oldSettings` only exists for backwards compatibility.\n  _.template = function(text, settings, oldSettings) {\n    if (!settings && oldSettings) settings = oldSettings;\n    settings = _.defaults({}, settings, _.templateSettings);\n\n    // Combine delimiters into one regular expression via alternation.\n    var matcher = RegExp([\n      (settings.escape || noMatch).source,\n      (settings.interpolate || noMatch).source,\n      (settings.evaluate || noMatch).source\n    ].join('|') + '|$', 'g');\n\n    // Compile the template source, escaping string literals appropriately.\n    var index = 0;\n    var source = \"__p+='\";\n    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n      source += text.slice(index, offset).replace(escaper, escapeChar);\n      index = offset + match.length;\n\n      if (escape) {\n        source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n      } else if (interpolate) {\n        source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n      } else if (evaluate) {\n        source += \"';\\n\" + evaluate + \"\\n__p+='\";\n      }\n\n      // Adobe VMs need the match returned to produce the correct offest.\n      return match;\n    });\n    source += \"';\\n\";\n\n    // If a variable is not specified, place data values in local scope.\n    if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n    source = \"var __t,__p='',__j=Array.prototype.join,\" +\n      \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n      source + 'return __p;\\n';\n\n    try {\n      var render = new Function(settings.variable || 'obj', '_', source);\n    } catch (e) {\n      e.source = source;\n      throw e;\n    }\n\n    var template = function(data) {\n      return render.call(this, data, _);\n    };\n\n    // Provide the compiled source as a convenience for precompilation.\n    var argument = settings.variable || 'obj';\n    template.source = 'function(' + argument + '){\\n' + source + '}';\n\n    return template;\n  };\n\n  // Add a \"chain\" function. Start chaining a wrapped Underscore object.\n  _.chain = function(obj) {\n    var instance = _(obj);\n    instance._chain = true;\n    return instance;\n  };\n\n  // OOP\n  // ---------------\n  // If Underscore is called as a function, it returns a wrapped object that\n  // can be used OO-style. This wrapper holds altered versions of all the\n  // underscore functions. Wrapped objects may be chained.\n\n  // Helper function to continue chaining intermediate results.\n  var result = function(instance, obj) {\n    return instance._chain ? _(obj).chain() : obj;\n  };\n\n  // Add your own custom functions to the Underscore object.\n  _.mixin = function(obj) {\n    _.each(_.functions(obj), function(name) {\n      var func = _[name] = obj[name];\n      _.prototype[name] = function() {\n        var args = [this._wrapped];\n        push.apply(args, arguments);\n        return result(this, func.apply(_, args));\n      };\n    });\n  };\n\n  // Add all of the Underscore functions to the wrapper object.\n  _.mixin(_);\n\n  // Add all mutator Array functions to the wrapper.\n  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      var obj = this._wrapped;\n      method.apply(obj, arguments);\n      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];\n      return result(this, obj);\n    };\n  });\n\n  // Add all accessor Array functions to the wrapper.\n  _.each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      return result(this, method.apply(this._wrapped, arguments));\n    };\n  });\n\n  // Extracts the result from a wrapped and chained object.\n  _.prototype.value = function() {\n    return this._wrapped;\n  };\n\n  // Provide unwrapping proxy for some methods used in engine operations\n  // such as arithmetic and JSON stringification.\n  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;\n\n  _.prototype.toString = function() {\n    return '' + this._wrapped;\n  };\n\n  // AMD registration happens at the end for compatibility with AMD loaders\n  // that may not enforce next-turn semantics on modules. Even though general\n  // practice for AMD registration is to be anonymous, underscore registers\n  // as a named module because, like jQuery, it is a base library that is\n  // popular enough to be bundled in a third party lib, but not be part of\n  // an AMD load request. Those cases could generate an error when an\n  // anonymous define() is called outside of a loader request.\n  if (typeof define === 'function' && define.amd) {\n    define('underscore', [], function() {\n      return _;\n    });\n  }\n}.call(this));\n\n},{}],154:[function(require,module,exports){\n(function (global){\n\n/**\n * Module exports.\n */\n\nmodule.exports = deprecate;\n\n/**\n * Mark that a method should not be used.\n * Returns a modified function which warns once by default.\n *\n * If `localStorage.noDeprecation = true` is set, then it is a no-op.\n *\n * If `localStorage.throwDeprecation = true` is set, then deprecated functions\n * will throw an Error when invoked.\n *\n * If `localStorage.traceDeprecation = true` is set, then deprecated functions\n * will invoke `console.trace()` instead of `console.error()`.\n *\n * @param {Function} fn - the function to deprecate\n * @param {String} msg - the string to print to the console when `fn` is invoked\n * @returns {Function} a new \"deprecated\" version of `fn`\n * @api public\n */\n\nfunction deprecate (fn, msg) {\n  if (config('noDeprecation')) {\n    return fn;\n  }\n\n  var warned = false;\n  function deprecated() {\n    if (!warned) {\n      if (config('throwDeprecation')) {\n        throw new Error(msg);\n      } else if (config('traceDeprecation')) {\n        console.trace(msg);\n      } else {\n        console.warn(msg);\n      }\n      warned = true;\n    }\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n}\n\n/**\n * Checks `localStorage` for boolean values for the given `name`.\n *\n * @param {String} name\n * @returns {Boolean}\n * @api private\n */\n\nfunction config (name) {\n  // accessing global.localStorage can trigger a DOMException in sandboxed iframes\n  try {\n    if (!global.localStorage) return false;\n  } catch (_) {\n    return false;\n  }\n  var val = global.localStorage[name];\n  if (null == val) return false;\n  return String(val).toLowerCase() === 'true';\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],155:[function(require,module,exports){\narguments[4][81][0].apply(exports,arguments)\n},{\"dup\":81}],156:[function(require,module,exports){\nmodule.exports = function isBuffer(arg) {\n  return arg && typeof arg === 'object'\n    && typeof arg.copy === 'function'\n    && typeof arg.fill === 'function'\n    && typeof arg.readUInt8 === 'function';\n}\n},{}],157:[function(require,module,exports){\n(function (process,global){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n  if (!isString(f)) {\n    var objects = [];\n    for (var i = 0; i < arguments.length; i++) {\n      objects.push(inspect(arguments[i]));\n    }\n    return objects.join(' ');\n  }\n\n  var i = 1;\n  var args = arguments;\n  var len = args.length;\n  var str = String(f).replace(formatRegExp, function(x) {\n    if (x === '%%') return '%';\n    if (i >= len) return x;\n    switch (x) {\n      case '%s': return String(args[i++]);\n      case '%d': return Number(args[i++]);\n      case '%j':\n        try {\n          return JSON.stringify(args[i++]);\n        } catch (_) {\n          return '[Circular]';\n        }\n      default:\n        return x;\n    }\n  });\n  for (var x = args[i]; i < len; x = args[++i]) {\n    if (isNull(x) || !isObject(x)) {\n      str += ' ' + x;\n    } else {\n      str += ' ' + inspect(x);\n    }\n  }\n  return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n  // Allow for deprecating things in the process of starting up.\n  if (isUndefined(global.process)) {\n    return function() {\n      return exports.deprecate(fn, msg).apply(this, arguments);\n    };\n  }\n\n  if (process.noDeprecation === true) {\n    return fn;\n  }\n\n  var warned = false;\n  function deprecated() {\n    if (!warned) {\n      if (process.throwDeprecation) {\n        throw new Error(msg);\n      } else if (process.traceDeprecation) {\n        console.trace(msg);\n      } else {\n        console.error(msg);\n      }\n      warned = true;\n    }\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n  if (isUndefined(debugEnviron))\n    debugEnviron = process.env.NODE_DEBUG || '';\n  set = set.toUpperCase();\n  if (!debugs[set]) {\n    if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n      var pid = process.pid;\n      debugs[set] = function() {\n        var msg = exports.format.apply(exports, arguments);\n        console.error('%s %d: %s', set, pid, msg);\n      };\n    } else {\n      debugs[set] = function() {};\n    }\n  }\n  return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n  // default options\n  var ctx = {\n    seen: [],\n    stylize: stylizeNoColor\n  };\n  // legacy...\n  if (arguments.length >= 3) ctx.depth = arguments[2];\n  if (arguments.length >= 4) ctx.colors = arguments[3];\n  if (isBoolean(opts)) {\n    // legacy...\n    ctx.showHidden = opts;\n  } else if (opts) {\n    // got an \"options\" object\n    exports._extend(ctx, opts);\n  }\n  // set default options\n  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n  if (isUndefined(ctx.depth)) ctx.depth = 2;\n  if (isUndefined(ctx.colors)) ctx.colors = false;\n  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n  if (ctx.colors) ctx.stylize = stylizeWithColor;\n  return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n  'bold' : [1, 22],\n  'italic' : [3, 23],\n  'underline' : [4, 24],\n  'inverse' : [7, 27],\n  'white' : [37, 39],\n  'grey' : [90, 39],\n  'black' : [30, 39],\n  'blue' : [34, 39],\n  'cyan' : [36, 39],\n  'green' : [32, 39],\n  'magenta' : [35, 39],\n  'red' : [31, 39],\n  'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n  'special': 'cyan',\n  'number': 'yellow',\n  'boolean': 'yellow',\n  'undefined': 'grey',\n  'null': 'bold',\n  'string': 'green',\n  'date': 'magenta',\n  // \"name\": intentionally not styling\n  'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n  var style = inspect.styles[styleType];\n\n  if (style) {\n    return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n           '\\u001b[' + inspect.colors[style][1] + 'm';\n  } else {\n    return str;\n  }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n  return str;\n}\n\n\nfunction arrayToHash(array) {\n  var hash = {};\n\n  array.forEach(function(val, idx) {\n    hash[val] = true;\n  });\n\n  return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n  // Provide a hook for user-specified inspect functions.\n  // Check that value is an object with an inspect function on it\n  if (ctx.customInspect &&\n      value &&\n      isFunction(value.inspect) &&\n      // Filter out the util module, it's inspect function is special\n      value.inspect !== exports.inspect &&\n      // Also filter out any prototype objects using the circular check.\n      !(value.constructor && value.constructor.prototype === value)) {\n    var ret = value.inspect(recurseTimes, ctx);\n    if (!isString(ret)) {\n      ret = formatValue(ctx, ret, recurseTimes);\n    }\n    return ret;\n  }\n\n  // Primitive types cannot have properties\n  var primitive = formatPrimitive(ctx, value);\n  if (primitive) {\n    return primitive;\n  }\n\n  // Look up the keys of the object.\n  var keys = Object.keys(value);\n  var visibleKeys = arrayToHash(keys);\n\n  if (ctx.showHidden) {\n    keys = Object.getOwnPropertyNames(value);\n  }\n\n  // IE doesn't make error fields non-enumerable\n  // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n  if (isError(value)\n      && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n    return formatError(value);\n  }\n\n  // Some type of object without properties can be shortcutted.\n  if (keys.length === 0) {\n    if (isFunction(value)) {\n      var name = value.name ? ': ' + value.name : '';\n      return ctx.stylize('[Function' + name + ']', 'special');\n    }\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    }\n    if (isDate(value)) {\n      return ctx.stylize(Date.prototype.toString.call(value), 'date');\n    }\n    if (isError(value)) {\n      return formatError(value);\n    }\n  }\n\n  var base = '', array = false, braces = ['{', '}'];\n\n  // Make Array say that they are Array\n  if (isArray(value)) {\n    array = true;\n    braces = ['[', ']'];\n  }\n\n  // Make functions say that they are functions\n  if (isFunction(value)) {\n    var n = value.name ? ': ' + value.name : '';\n    base = ' [Function' + n + ']';\n  }\n\n  // Make RegExps say that they are RegExps\n  if (isRegExp(value)) {\n    base = ' ' + RegExp.prototype.toString.call(value);\n  }\n\n  // Make dates with properties first say the date\n  if (isDate(value)) {\n    base = ' ' + Date.prototype.toUTCString.call(value);\n  }\n\n  // Make error with message first say the error\n  if (isError(value)) {\n    base = ' ' + formatError(value);\n  }\n\n  if (keys.length === 0 && (!array || value.length == 0)) {\n    return braces[0] + base + braces[1];\n  }\n\n  if (recurseTimes < 0) {\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    } else {\n      return ctx.stylize('[Object]', 'special');\n    }\n  }\n\n  ctx.seen.push(value);\n\n  var output;\n  if (array) {\n    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n  } else {\n    output = keys.map(function(key) {\n      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n    });\n  }\n\n  ctx.seen.pop();\n\n  return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n  if (isUndefined(value))\n    return ctx.stylize('undefined', 'undefined');\n  if (isString(value)) {\n    var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n                                             .replace(/'/g, \"\\\\'\")\n                                             .replace(/\\\\\"/g, '\"') + '\\'';\n    return ctx.stylize(simple, 'string');\n  }\n  if (isNumber(value))\n    return ctx.stylize('' + value, 'number');\n  if (isBoolean(value))\n    return ctx.stylize('' + value, 'boolean');\n  // For some reason typeof null is \"object\", so special case here.\n  if (isNull(value))\n    return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n  return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n  var output = [];\n  for (var i = 0, l = value.length; i < l; ++i) {\n    if (hasOwnProperty(value, String(i))) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          String(i), true));\n    } else {\n      output.push('');\n    }\n  }\n  keys.forEach(function(key) {\n    if (!key.match(/^\\d+$/)) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          key, true));\n    }\n  });\n  return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n  var name, str, desc;\n  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n  if (desc.get) {\n    if (desc.set) {\n      str = ctx.stylize('[Getter/Setter]', 'special');\n    } else {\n      str = ctx.stylize('[Getter]', 'special');\n    }\n  } else {\n    if (desc.set) {\n      str = ctx.stylize('[Setter]', 'special');\n    }\n  }\n  if (!hasOwnProperty(visibleKeys, key)) {\n    name = '[' + key + ']';\n  }\n  if (!str) {\n    if (ctx.seen.indexOf(desc.value) < 0) {\n      if (isNull(recurseTimes)) {\n        str = formatValue(ctx, desc.value, null);\n      } else {\n        str = formatValue(ctx, desc.value, recurseTimes - 1);\n      }\n      if (str.indexOf('\\n') > -1) {\n        if (array) {\n          str = str.split('\\n').map(function(line) {\n            return '  ' + line;\n          }).join('\\n').substr(2);\n        } else {\n          str = '\\n' + str.split('\\n').map(function(line) {\n            return '   ' + line;\n          }).join('\\n');\n        }\n      }\n    } else {\n      str = ctx.stylize('[Circular]', 'special');\n    }\n  }\n  if (isUndefined(name)) {\n    if (array && key.match(/^\\d+$/)) {\n      return str;\n    }\n    name = JSON.stringify('' + key);\n    if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n      name = name.substr(1, name.length - 2);\n      name = ctx.stylize(name, 'name');\n    } else {\n      name = name.replace(/'/g, \"\\\\'\")\n                 .replace(/\\\\\"/g, '\"')\n                 .replace(/(^\"|\"$)/g, \"'\");\n      name = ctx.stylize(name, 'string');\n    }\n  }\n\n  return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n  var numLinesEst = 0;\n  var length = output.reduce(function(prev, cur) {\n    numLinesEst++;\n    if (cur.indexOf('\\n') >= 0) numLinesEst++;\n    return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n  }, 0);\n\n  if (length > 60) {\n    return braces[0] +\n           (base === '' ? '' : base + '\\n ') +\n           ' ' +\n           output.join(',\\n  ') +\n           ' ' +\n           braces[1];\n  }\n\n  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n  return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return isObject(e) &&\n      (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null ||\n         typeof arg === 'boolean' ||\n         typeof arg === 'number' ||\n         typeof arg === 'string' ||\n         typeof arg === 'symbol' ||  // ES6 symbol\n         typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n  return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n              'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n  var d = new Date();\n  var time = [pad(d.getHours()),\n              pad(d.getMinutes()),\n              pad(d.getSeconds())].join(':');\n  return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n *     prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n  // Don't do anything if add isn't an object\n  if (!add || !isObject(add)) return origin;\n\n  var keys = Object.keys(add);\n  var i = keys.length;\n  while (i--) {\n    origin[keys[i]] = add[keys[i]];\n  }\n  return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./support/isBuffer\":156,\"_process\":138,\"inherits\":155}],158:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var assign, getValue, isArray, isEmpty, isFunction, isObject, isPlainObject,\n    slice = [].slice,\n    hasProp = {}.hasOwnProperty;\n\n  assign = function() {\n    var i, key, len, source, sources, target;\n    target = arguments[0], sources = 2 <= arguments.length ? slice.call(arguments, 1) : [];\n    if (isFunction(Object.assign)) {\n      Object.assign.apply(null, arguments);\n    } else {\n      for (i = 0, len = sources.length; i < len; i++) {\n        source = sources[i];\n        if (source != null) {\n          for (key in source) {\n            if (!hasProp.call(source, key)) continue;\n            target[key] = source[key];\n          }\n        }\n      }\n    }\n    return target;\n  };\n\n  isFunction = function(val) {\n    return !!val && Object.prototype.toString.call(val) === '[object Function]';\n  };\n\n  isObject = function(val) {\n    var ref;\n    return !!val && ((ref = typeof val) === 'function' || ref === 'object');\n  };\n\n  isArray = function(val) {\n    if (isFunction(Array.isArray)) {\n      return Array.isArray(val);\n    } else {\n      return Object.prototype.toString.call(val) === '[object Array]';\n    }\n  };\n\n  isEmpty = function(val) {\n    var key;\n    if (isArray(val)) {\n      return !val.length;\n    } else {\n      for (key in val) {\n        if (!hasProp.call(val, key)) continue;\n        return false;\n      }\n      return true;\n    }\n  };\n\n  isPlainObject = function(val) {\n    var ctor, proto;\n    return isObject(val) && (proto = Object.getPrototypeOf(val)) && (ctor = proto.constructor) && (typeof ctor === 'function') && (ctor instanceof ctor) && (Function.prototype.toString.call(ctor) === Function.prototype.toString.call(Object));\n  };\n\n  getValue = function(obj) {\n    if (isFunction(obj.valueOf)) {\n      return obj.valueOf();\n    } else {\n      return obj;\n    }\n  };\n\n  module.exports.assign = assign;\n\n  module.exports.isFunction = isFunction;\n\n  module.exports.isObject = isObject;\n\n  module.exports.isArray = isArray;\n\n  module.exports.isEmpty = isEmpty;\n\n  module.exports.isPlainObject = isPlainObject;\n\n  module.exports.getValue = getValue;\n\n}).call(this);\n\n},{}],159:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLAttribute;\n\n  module.exports = XMLAttribute = (function() {\n    function XMLAttribute(parent, name, value) {\n      this.options = parent.options;\n      this.stringify = parent.stringify;\n      this.parent = parent;\n      if (name == null) {\n        throw new Error(\"Missing attribute name. \" + this.debugInfo(name));\n      }\n      if (value == null) {\n        throw new Error(\"Missing attribute value. \" + this.debugInfo(name));\n      }\n      this.name = this.stringify.attName(name);\n      this.value = this.stringify.attValue(value);\n    }\n\n    XMLAttribute.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLAttribute.prototype.toString = function(options) {\n      return this.options.writer.set(options).attribute(this);\n    };\n\n    XMLAttribute.prototype.debugInfo = function(name) {\n      var ref, ref1;\n      name = name || this.name;\n      if ((name == null) && !((ref = this.parent) != null ? ref.name : void 0)) {\n        return \"\";\n      } else if (name == null) {\n        return \"parent: <\" + this.parent.name + \">\";\n      } else if (!((ref1 = this.parent) != null ? ref1.name : void 0)) {\n        return \"attribute: {\" + name + \"}\";\n      } else {\n        return \"attribute: {\" + name + \"}, parent: <\" + this.parent.name + \">\";\n      }\n    };\n\n    return XMLAttribute;\n\n  })();\n\n}).call(this);\n\n},{}],160:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLCData, XMLNode,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLCData = (function(superClass) {\n    extend(XMLCData, superClass);\n\n    function XMLCData(parent, text) {\n      XMLCData.__super__.constructor.call(this, parent);\n      if (text == null) {\n        throw new Error(\"Missing CDATA text. \" + this.debugInfo());\n      }\n      this.text = this.stringify.cdata(text);\n    }\n\n    XMLCData.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLCData.prototype.toString = function(options) {\n      return this.options.writer.set(options).cdata(this);\n    };\n\n    return XMLCData;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],161:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLComment, XMLNode,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLComment = (function(superClass) {\n    extend(XMLComment, superClass);\n\n    function XMLComment(parent, text) {\n      XMLComment.__super__.constructor.call(this, parent);\n      if (text == null) {\n        throw new Error(\"Missing comment text. \" + this.debugInfo());\n      }\n      this.text = this.stringify.comment(text);\n    }\n\n    XMLComment.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLComment.prototype.toString = function(options) {\n      return this.options.writer.set(options).comment(this);\n    };\n\n    return XMLComment;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],162:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDTDAttList, XMLNode,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLDTDAttList = (function(superClass) {\n    extend(XMLDTDAttList, superClass);\n\n    function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) {\n      XMLDTDAttList.__super__.constructor.call(this, parent);\n      if (elementName == null) {\n        throw new Error(\"Missing DTD element name. \" + this.debugInfo());\n      }\n      if (attributeName == null) {\n        throw new Error(\"Missing DTD attribute name. \" + this.debugInfo(elementName));\n      }\n      if (!attributeType) {\n        throw new Error(\"Missing DTD attribute type. \" + this.debugInfo(elementName));\n      }\n      if (!defaultValueType) {\n        throw new Error(\"Missing DTD attribute default. \" + this.debugInfo(elementName));\n      }\n      if (defaultValueType.indexOf('#') !== 0) {\n        defaultValueType = '#' + defaultValueType;\n      }\n      if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) {\n        throw new Error(\"Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT. \" + this.debugInfo(elementName));\n      }\n      if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) {\n        throw new Error(\"Default value only applies to #FIXED or #DEFAULT. \" + this.debugInfo(elementName));\n      }\n      this.elementName = this.stringify.eleName(elementName);\n      this.attributeName = this.stringify.attName(attributeName);\n      this.attributeType = this.stringify.dtdAttType(attributeType);\n      this.defaultValue = this.stringify.dtdAttDefault(defaultValue);\n      this.defaultValueType = defaultValueType;\n    }\n\n    XMLDTDAttList.prototype.toString = function(options) {\n      return this.options.writer.set(options).dtdAttList(this);\n    };\n\n    return XMLDTDAttList;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],163:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDTDElement, XMLNode,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLDTDElement = (function(superClass) {\n    extend(XMLDTDElement, superClass);\n\n    function XMLDTDElement(parent, name, value) {\n      XMLDTDElement.__super__.constructor.call(this, parent);\n      if (name == null) {\n        throw new Error(\"Missing DTD element name. \" + this.debugInfo());\n      }\n      if (!value) {\n        value = '(#PCDATA)';\n      }\n      if (Array.isArray(value)) {\n        value = '(' + value.join(',') + ')';\n      }\n      this.name = this.stringify.eleName(name);\n      this.value = this.stringify.dtdElementValue(value);\n    }\n\n    XMLDTDElement.prototype.toString = function(options) {\n      return this.options.writer.set(options).dtdElement(this);\n    };\n\n    return XMLDTDElement;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],164:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDTDEntity, XMLNode, isObject,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  isObject = require('./Utility').isObject;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLDTDEntity = (function(superClass) {\n    extend(XMLDTDEntity, superClass);\n\n    function XMLDTDEntity(parent, pe, name, value) {\n      XMLDTDEntity.__super__.constructor.call(this, parent);\n      if (name == null) {\n        throw new Error(\"Missing DTD entity name. \" + this.debugInfo(name));\n      }\n      if (value == null) {\n        throw new Error(\"Missing DTD entity value. \" + this.debugInfo(name));\n      }\n      this.pe = !!pe;\n      this.name = this.stringify.eleName(name);\n      if (!isObject(value)) {\n        this.value = this.stringify.dtdEntityValue(value);\n      } else {\n        if (!value.pubID && !value.sysID) {\n          throw new Error(\"Public and/or system identifiers are required for an external entity. \" + this.debugInfo(name));\n        }\n        if (value.pubID && !value.sysID) {\n          throw new Error(\"System identifier is required for a public external entity. \" + this.debugInfo(name));\n        }\n        if (value.pubID != null) {\n          this.pubID = this.stringify.dtdPubID(value.pubID);\n        }\n        if (value.sysID != null) {\n          this.sysID = this.stringify.dtdSysID(value.sysID);\n        }\n        if (value.nData != null) {\n          this.nData = this.stringify.dtdNData(value.nData);\n        }\n        if (this.pe && this.nData) {\n          throw new Error(\"Notation declaration is not allowed in a parameter entity. \" + this.debugInfo(name));\n        }\n      }\n    }\n\n    XMLDTDEntity.prototype.toString = function(options) {\n      return this.options.writer.set(options).dtdEntity(this);\n    };\n\n    return XMLDTDEntity;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLNode\":171}],165:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDTDNotation, XMLNode,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLDTDNotation = (function(superClass) {\n    extend(XMLDTDNotation, superClass);\n\n    function XMLDTDNotation(parent, name, value) {\n      XMLDTDNotation.__super__.constructor.call(this, parent);\n      if (name == null) {\n        throw new Error(\"Missing DTD notation name. \" + this.debugInfo(name));\n      }\n      if (!value.pubID && !value.sysID) {\n        throw new Error(\"Public or system identifiers are required for an external entity. \" + this.debugInfo(name));\n      }\n      this.name = this.stringify.eleName(name);\n      if (value.pubID != null) {\n        this.pubID = this.stringify.dtdPubID(value.pubID);\n      }\n      if (value.sysID != null) {\n        this.sysID = this.stringify.dtdSysID(value.sysID);\n      }\n    }\n\n    XMLDTDNotation.prototype.toString = function(options) {\n      return this.options.writer.set(options).dtdNotation(this);\n    };\n\n    return XMLDTDNotation;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],166:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDeclaration, XMLNode, isObject,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  isObject = require('./Utility').isObject;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLDeclaration = (function(superClass) {\n    extend(XMLDeclaration, superClass);\n\n    function XMLDeclaration(parent, version, encoding, standalone) {\n      var ref;\n      XMLDeclaration.__super__.constructor.call(this, parent);\n      if (isObject(version)) {\n        ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone;\n      }\n      if (!version) {\n        version = '1.0';\n      }\n      this.version = this.stringify.xmlVersion(version);\n      if (encoding != null) {\n        this.encoding = this.stringify.xmlEncoding(encoding);\n      }\n      if (standalone != null) {\n        this.standalone = this.stringify.xmlStandalone(standalone);\n      }\n    }\n\n    XMLDeclaration.prototype.toString = function(options) {\n      return this.options.writer.set(options).declaration(this);\n    };\n\n    return XMLDeclaration;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLNode\":171}],167:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLNode, isObject,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  isObject = require('./Utility').isObject;\n\n  XMLNode = require('./XMLNode');\n\n  XMLDTDAttList = require('./XMLDTDAttList');\n\n  XMLDTDEntity = require('./XMLDTDEntity');\n\n  XMLDTDElement = require('./XMLDTDElement');\n\n  XMLDTDNotation = require('./XMLDTDNotation');\n\n  module.exports = XMLDocType = (function(superClass) {\n    extend(XMLDocType, superClass);\n\n    function XMLDocType(parent, pubID, sysID) {\n      var ref, ref1;\n      XMLDocType.__super__.constructor.call(this, parent);\n      this.name = \"!DOCTYPE\";\n      this.documentObject = parent;\n      if (isObject(pubID)) {\n        ref = pubID, pubID = ref.pubID, sysID = ref.sysID;\n      }\n      if (sysID == null) {\n        ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1];\n      }\n      if (pubID != null) {\n        this.pubID = this.stringify.dtdPubID(pubID);\n      }\n      if (sysID != null) {\n        this.sysID = this.stringify.dtdSysID(sysID);\n      }\n    }\n\n    XMLDocType.prototype.element = function(name, value) {\n      var child;\n      child = new XMLDTDElement(this, name, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {\n      var child;\n      child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLDocType.prototype.entity = function(name, value) {\n      var child;\n      child = new XMLDTDEntity(this, false, name, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLDocType.prototype.pEntity = function(name, value) {\n      var child;\n      child = new XMLDTDEntity(this, true, name, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLDocType.prototype.notation = function(name, value) {\n      var child;\n      child = new XMLDTDNotation(this, name, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLDocType.prototype.toString = function(options) {\n      return this.options.writer.set(options).docType(this);\n    };\n\n    XMLDocType.prototype.ele = function(name, value) {\n      return this.element(name, value);\n    };\n\n    XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {\n      return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue);\n    };\n\n    XMLDocType.prototype.ent = function(name, value) {\n      return this.entity(name, value);\n    };\n\n    XMLDocType.prototype.pent = function(name, value) {\n      return this.pEntity(name, value);\n    };\n\n    XMLDocType.prototype.not = function(name, value) {\n      return this.notation(name, value);\n    };\n\n    XMLDocType.prototype.up = function() {\n      return this.root() || this.documentObject;\n    };\n\n    return XMLDocType;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLDTDAttList\":162,\"./XMLDTDElement\":163,\"./XMLDTDEntity\":164,\"./XMLDTDNotation\":165,\"./XMLNode\":171}],168:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDocument, XMLNode, XMLStringWriter, XMLStringifier, isPlainObject,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  isPlainObject = require('./Utility').isPlainObject;\n\n  XMLNode = require('./XMLNode');\n\n  XMLStringifier = require('./XMLStringifier');\n\n  XMLStringWriter = require('./XMLStringWriter');\n\n  module.exports = XMLDocument = (function(superClass) {\n    extend(XMLDocument, superClass);\n\n    function XMLDocument(options) {\n      XMLDocument.__super__.constructor.call(this, null);\n      this.name = \"?xml\";\n      options || (options = {});\n      if (!options.writer) {\n        options.writer = new XMLStringWriter();\n      }\n      this.options = options;\n      this.stringify = new XMLStringifier(options);\n      this.isDocument = true;\n    }\n\n    XMLDocument.prototype.end = function(writer) {\n      var writerOptions;\n      if (!writer) {\n        writer = this.options.writer;\n      } else if (isPlainObject(writer)) {\n        writerOptions = writer;\n        writer = this.options.writer.set(writerOptions);\n      }\n      return writer.document(this);\n    };\n\n    XMLDocument.prototype.toString = function(options) {\n      return this.options.writer.set(options).document(this);\n    };\n\n    return XMLDocument;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLNode\":171,\"./XMLStringWriter\":175,\"./XMLStringifier\":176}],169:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLAttribute, XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLDocumentCB, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLStringifier, XMLText, getValue, isFunction, isObject, isPlainObject, ref,\n    hasProp = {}.hasOwnProperty;\n\n  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isPlainObject = ref.isPlainObject, getValue = ref.getValue;\n\n  XMLElement = require('./XMLElement');\n\n  XMLCData = require('./XMLCData');\n\n  XMLComment = require('./XMLComment');\n\n  XMLRaw = require('./XMLRaw');\n\n  XMLText = require('./XMLText');\n\n  XMLProcessingInstruction = require('./XMLProcessingInstruction');\n\n  XMLDeclaration = require('./XMLDeclaration');\n\n  XMLDocType = require('./XMLDocType');\n\n  XMLDTDAttList = require('./XMLDTDAttList');\n\n  XMLDTDEntity = require('./XMLDTDEntity');\n\n  XMLDTDElement = require('./XMLDTDElement');\n\n  XMLDTDNotation = require('./XMLDTDNotation');\n\n  XMLAttribute = require('./XMLAttribute');\n\n  XMLStringifier = require('./XMLStringifier');\n\n  XMLStringWriter = require('./XMLStringWriter');\n\n  module.exports = XMLDocumentCB = (function() {\n    function XMLDocumentCB(options, onData, onEnd) {\n      var writerOptions;\n      this.name = \"?xml\";\n      options || (options = {});\n      if (!options.writer) {\n        options.writer = new XMLStringWriter(options);\n      } else if (isPlainObject(options.writer)) {\n        writerOptions = options.writer;\n        options.writer = new XMLStringWriter(writerOptions);\n      }\n      this.options = options;\n      this.writer = options.writer;\n      this.stringify = new XMLStringifier(options);\n      this.onDataCallback = onData || function() {};\n      this.onEndCallback = onEnd || function() {};\n      this.currentNode = null;\n      this.currentLevel = -1;\n      this.openTags = {};\n      this.documentStarted = false;\n      this.documentCompleted = false;\n      this.root = null;\n    }\n\n    XMLDocumentCB.prototype.node = function(name, attributes, text) {\n      var ref1;\n      if (name == null) {\n        throw new Error(\"Missing node name.\");\n      }\n      if (this.root && this.currentLevel === -1) {\n        throw new Error(\"Document can only have one root node. \" + this.debugInfo(name));\n      }\n      this.openCurrent();\n      name = getValue(name);\n      if (attributes == null) {\n        attributes = {};\n      }\n      attributes = getValue(attributes);\n      if (!isObject(attributes)) {\n        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];\n      }\n      this.currentNode = new XMLElement(this, name, attributes);\n      this.currentNode.children = false;\n      this.currentLevel++;\n      this.openTags[this.currentLevel] = this.currentNode;\n      if (text != null) {\n        this.text(text);\n      }\n      return this;\n    };\n\n    XMLDocumentCB.prototype.element = function(name, attributes, text) {\n      if (this.currentNode && this.currentNode instanceof XMLDocType) {\n        return this.dtdElement.apply(this, arguments);\n      } else {\n        return this.node(name, attributes, text);\n      }\n    };\n\n    XMLDocumentCB.prototype.attribute = function(name, value) {\n      var attName, attValue;\n      if (!this.currentNode || this.currentNode.children) {\n        throw new Error(\"att() can only be used immediately after an ele() call in callback mode. \" + this.debugInfo(name));\n      }\n      if (name != null) {\n        name = getValue(name);\n      }\n      if (isObject(name)) {\n        for (attName in name) {\n          if (!hasProp.call(name, attName)) continue;\n          attValue = name[attName];\n          this.attribute(attName, attValue);\n        }\n      } else {\n        if (isFunction(value)) {\n          value = value.apply();\n        }\n        if (!this.options.skipNullAttributes || (value != null)) {\n          this.currentNode.attributes[name] = new XMLAttribute(this, name, value);\n        }\n      }\n      return this;\n    };\n\n    XMLDocumentCB.prototype.text = function(value) {\n      var node;\n      this.openCurrent();\n      node = new XMLText(this, value);\n      this.onData(this.writer.text(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.cdata = function(value) {\n      var node;\n      this.openCurrent();\n      node = new XMLCData(this, value);\n      this.onData(this.writer.cdata(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.comment = function(value) {\n      var node;\n      this.openCurrent();\n      node = new XMLComment(this, value);\n      this.onData(this.writer.comment(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.raw = function(value) {\n      var node;\n      this.openCurrent();\n      node = new XMLRaw(this, value);\n      this.onData(this.writer.raw(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.instruction = function(target, value) {\n      var i, insTarget, insValue, len, node;\n      this.openCurrent();\n      if (target != null) {\n        target = getValue(target);\n      }\n      if (value != null) {\n        value = getValue(value);\n      }\n      if (Array.isArray(target)) {\n        for (i = 0, len = target.length; i < len; i++) {\n          insTarget = target[i];\n          this.instruction(insTarget);\n        }\n      } else if (isObject(target)) {\n        for (insTarget in target) {\n          if (!hasProp.call(target, insTarget)) continue;\n          insValue = target[insTarget];\n          this.instruction(insTarget, insValue);\n        }\n      } else {\n        if (isFunction(value)) {\n          value = value.apply();\n        }\n        node = new XMLProcessingInstruction(this, target, value);\n        this.onData(this.writer.processingInstruction(node, this.currentLevel + 1), this.currentLevel + 1);\n      }\n      return this;\n    };\n\n    XMLDocumentCB.prototype.declaration = function(version, encoding, standalone) {\n      var node;\n      this.openCurrent();\n      if (this.documentStarted) {\n        throw new Error(\"declaration() must be the first node.\");\n      }\n      node = new XMLDeclaration(this, version, encoding, standalone);\n      this.onData(this.writer.declaration(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.doctype = function(root, pubID, sysID) {\n      this.openCurrent();\n      if (root == null) {\n        throw new Error(\"Missing root node name.\");\n      }\n      if (this.root) {\n        throw new Error(\"dtd() must come before the root node.\");\n      }\n      this.currentNode = new XMLDocType(this, pubID, sysID);\n      this.currentNode.rootNodeName = root;\n      this.currentNode.children = false;\n      this.currentLevel++;\n      this.openTags[this.currentLevel] = this.currentNode;\n      return this;\n    };\n\n    XMLDocumentCB.prototype.dtdElement = function(name, value) {\n      var node;\n      this.openCurrent();\n      node = new XMLDTDElement(this, name, value);\n      this.onData(this.writer.dtdElement(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {\n      var node;\n      this.openCurrent();\n      node = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);\n      this.onData(this.writer.dtdAttList(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.entity = function(name, value) {\n      var node;\n      this.openCurrent();\n      node = new XMLDTDEntity(this, false, name, value);\n      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.pEntity = function(name, value) {\n      var node;\n      this.openCurrent();\n      node = new XMLDTDEntity(this, true, name, value);\n      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.notation = function(name, value) {\n      var node;\n      this.openCurrent();\n      node = new XMLDTDNotation(this, name, value);\n      this.onData(this.writer.dtdNotation(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.up = function() {\n      if (this.currentLevel < 0) {\n        throw new Error(\"The document node has no parent.\");\n      }\n      if (this.currentNode) {\n        if (this.currentNode.children) {\n          this.closeNode(this.currentNode);\n        } else {\n          this.openNode(this.currentNode);\n        }\n        this.currentNode = null;\n      } else {\n        this.closeNode(this.openTags[this.currentLevel]);\n      }\n      delete this.openTags[this.currentLevel];\n      this.currentLevel--;\n      return this;\n    };\n\n    XMLDocumentCB.prototype.end = function() {\n      while (this.currentLevel >= 0) {\n        this.up();\n      }\n      return this.onEnd();\n    };\n\n    XMLDocumentCB.prototype.openCurrent = function() {\n      if (this.currentNode) {\n        this.currentNode.children = true;\n        return this.openNode(this.currentNode);\n      }\n    };\n\n    XMLDocumentCB.prototype.openNode = function(node) {\n      if (!node.isOpen) {\n        if (!this.root && this.currentLevel === 0 && node instanceof XMLElement) {\n          this.root = node;\n        }\n        this.onData(this.writer.openNode(node, this.currentLevel), this.currentLevel);\n        return node.isOpen = true;\n      }\n    };\n\n    XMLDocumentCB.prototype.closeNode = function(node) {\n      if (!node.isClosed) {\n        this.onData(this.writer.closeNode(node, this.currentLevel), this.currentLevel);\n        return node.isClosed = true;\n      }\n    };\n\n    XMLDocumentCB.prototype.onData = function(chunk, level) {\n      this.documentStarted = true;\n      return this.onDataCallback(chunk, level + 1);\n    };\n\n    XMLDocumentCB.prototype.onEnd = function() {\n      this.documentCompleted = true;\n      return this.onEndCallback();\n    };\n\n    XMLDocumentCB.prototype.debugInfo = function(name) {\n      if (name == null) {\n        return \"\";\n      } else {\n        return \"node: <\" + name + \">\";\n      }\n    };\n\n    XMLDocumentCB.prototype.ele = function() {\n      return this.element.apply(this, arguments);\n    };\n\n    XMLDocumentCB.prototype.nod = function(name, attributes, text) {\n      return this.node(name, attributes, text);\n    };\n\n    XMLDocumentCB.prototype.txt = function(value) {\n      return this.text(value);\n    };\n\n    XMLDocumentCB.prototype.dat = function(value) {\n      return this.cdata(value);\n    };\n\n    XMLDocumentCB.prototype.com = function(value) {\n      return this.comment(value);\n    };\n\n    XMLDocumentCB.prototype.ins = function(target, value) {\n      return this.instruction(target, value);\n    };\n\n    XMLDocumentCB.prototype.dec = function(version, encoding, standalone) {\n      return this.declaration(version, encoding, standalone);\n    };\n\n    XMLDocumentCB.prototype.dtd = function(root, pubID, sysID) {\n      return this.doctype(root, pubID, sysID);\n    };\n\n    XMLDocumentCB.prototype.e = function(name, attributes, text) {\n      return this.element(name, attributes, text);\n    };\n\n    XMLDocumentCB.prototype.n = function(name, attributes, text) {\n      return this.node(name, attributes, text);\n    };\n\n    XMLDocumentCB.prototype.t = function(value) {\n      return this.text(value);\n    };\n\n    XMLDocumentCB.prototype.d = function(value) {\n      return this.cdata(value);\n    };\n\n    XMLDocumentCB.prototype.c = function(value) {\n      return this.comment(value);\n    };\n\n    XMLDocumentCB.prototype.r = function(value) {\n      return this.raw(value);\n    };\n\n    XMLDocumentCB.prototype.i = function(target, value) {\n      return this.instruction(target, value);\n    };\n\n    XMLDocumentCB.prototype.att = function() {\n      if (this.currentNode && this.currentNode instanceof XMLDocType) {\n        return this.attList.apply(this, arguments);\n      } else {\n        return this.attribute.apply(this, arguments);\n      }\n    };\n\n    XMLDocumentCB.prototype.a = function() {\n      if (this.currentNode && this.currentNode instanceof XMLDocType) {\n        return this.attList.apply(this, arguments);\n      } else {\n        return this.attribute.apply(this, arguments);\n      }\n    };\n\n    XMLDocumentCB.prototype.ent = function(name, value) {\n      return this.entity(name, value);\n    };\n\n    XMLDocumentCB.prototype.pent = function(name, value) {\n      return this.pEntity(name, value);\n    };\n\n    XMLDocumentCB.prototype.not = function(name, value) {\n      return this.notation(name, value);\n    };\n\n    return XMLDocumentCB;\n\n  })();\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLAttribute\":159,\"./XMLCData\":160,\"./XMLComment\":161,\"./XMLDTDAttList\":162,\"./XMLDTDElement\":163,\"./XMLDTDEntity\":164,\"./XMLDTDNotation\":165,\"./XMLDeclaration\":166,\"./XMLDocType\":167,\"./XMLElement\":170,\"./XMLProcessingInstruction\":172,\"./XMLRaw\":173,\"./XMLStringWriter\":175,\"./XMLStringifier\":176,\"./XMLText\":177}],170:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLAttribute, XMLElement, XMLNode, getValue, isFunction, isObject, ref,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, getValue = ref.getValue;\n\n  XMLNode = require('./XMLNode');\n\n  XMLAttribute = require('./XMLAttribute');\n\n  module.exports = XMLElement = (function(superClass) {\n    extend(XMLElement, superClass);\n\n    function XMLElement(parent, name, attributes) {\n      XMLElement.__super__.constructor.call(this, parent);\n      if (name == null) {\n        throw new Error(\"Missing element name. \" + this.debugInfo());\n      }\n      this.name = this.stringify.eleName(name);\n      this.attributes = {};\n      if (attributes != null) {\n        this.attribute(attributes);\n      }\n      if (parent.isDocument) {\n        this.isRoot = true;\n        this.documentObject = parent;\n        parent.rootObject = this;\n      }\n    }\n\n    XMLElement.prototype.clone = function() {\n      var att, attName, clonedSelf, ref1;\n      clonedSelf = Object.create(this);\n      if (clonedSelf.isRoot) {\n        clonedSelf.documentObject = null;\n      }\n      clonedSelf.attributes = {};\n      ref1 = this.attributes;\n      for (attName in ref1) {\n        if (!hasProp.call(ref1, attName)) continue;\n        att = ref1[attName];\n        clonedSelf.attributes[attName] = att.clone();\n      }\n      clonedSelf.children = [];\n      this.children.forEach(function(child) {\n        var clonedChild;\n        clonedChild = child.clone();\n        clonedChild.parent = clonedSelf;\n        return clonedSelf.children.push(clonedChild);\n      });\n      return clonedSelf;\n    };\n\n    XMLElement.prototype.attribute = function(name, value) {\n      var attName, attValue;\n      if (name != null) {\n        name = getValue(name);\n      }\n      if (isObject(name)) {\n        for (attName in name) {\n          if (!hasProp.call(name, attName)) continue;\n          attValue = name[attName];\n          this.attribute(attName, attValue);\n        }\n      } else {\n        if (isFunction(value)) {\n          value = value.apply();\n        }\n        if (!this.options.skipNullAttributes || (value != null)) {\n          this.attributes[name] = new XMLAttribute(this, name, value);\n        }\n      }\n      return this;\n    };\n\n    XMLElement.prototype.removeAttribute = function(name) {\n      var attName, i, len;\n      if (name == null) {\n        throw new Error(\"Missing attribute name. \" + this.debugInfo());\n      }\n      name = getValue(name);\n      if (Array.isArray(name)) {\n        for (i = 0, len = name.length; i < len; i++) {\n          attName = name[i];\n          delete this.attributes[attName];\n        }\n      } else {\n        delete this.attributes[name];\n      }\n      return this;\n    };\n\n    XMLElement.prototype.toString = function(options) {\n      return this.options.writer.set(options).element(this);\n    };\n\n    XMLElement.prototype.att = function(name, value) {\n      return this.attribute(name, value);\n    };\n\n    XMLElement.prototype.a = function(name, value) {\n      return this.attribute(name, value);\n    };\n\n    return XMLElement;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLAttribute\":159,\"./XMLNode\":171}],171:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLProcessingInstruction, XMLRaw, XMLText, getValue, isEmpty, isFunction, isObject, ref,\n    hasProp = {}.hasOwnProperty;\n\n  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isEmpty = ref.isEmpty, getValue = ref.getValue;\n\n  XMLElement = null;\n\n  XMLCData = null;\n\n  XMLComment = null;\n\n  XMLDeclaration = null;\n\n  XMLDocType = null;\n\n  XMLRaw = null;\n\n  XMLText = null;\n\n  XMLProcessingInstruction = null;\n\n  module.exports = XMLNode = (function() {\n    function XMLNode(parent) {\n      this.parent = parent;\n      if (this.parent) {\n        this.options = this.parent.options;\n        this.stringify = this.parent.stringify;\n      }\n      this.children = [];\n      if (!XMLElement) {\n        XMLElement = require('./XMLElement');\n        XMLCData = require('./XMLCData');\n        XMLComment = require('./XMLComment');\n        XMLDeclaration = require('./XMLDeclaration');\n        XMLDocType = require('./XMLDocType');\n        XMLRaw = require('./XMLRaw');\n        XMLText = require('./XMLText');\n        XMLProcessingInstruction = require('./XMLProcessingInstruction');\n      }\n    }\n\n    XMLNode.prototype.element = function(name, attributes, text) {\n      var childNode, item, j, k, key, lastChild, len, len1, ref1, val;\n      lastChild = null;\n      if (attributes == null) {\n        attributes = {};\n      }\n      attributes = getValue(attributes);\n      if (!isObject(attributes)) {\n        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];\n      }\n      if (name != null) {\n        name = getValue(name);\n      }\n      if (Array.isArray(name)) {\n        for (j = 0, len = name.length; j < len; j++) {\n          item = name[j];\n          lastChild = this.element(item);\n        }\n      } else if (isFunction(name)) {\n        lastChild = this.element(name.apply());\n      } else if (isObject(name)) {\n        for (key in name) {\n          if (!hasProp.call(name, key)) continue;\n          val = name[key];\n          if (isFunction(val)) {\n            val = val.apply();\n          }\n          if ((isObject(val)) && (isEmpty(val))) {\n            val = null;\n          }\n          if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) {\n            lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val);\n          } else if (!this.options.separateArrayItems && Array.isArray(val)) {\n            for (k = 0, len1 = val.length; k < len1; k++) {\n              item = val[k];\n              childNode = {};\n              childNode[key] = item;\n              lastChild = this.element(childNode);\n            }\n          } else if (isObject(val)) {\n            lastChild = this.element(key);\n            lastChild.element(val);\n          } else {\n            lastChild = this.element(key, val);\n          }\n        }\n      } else {\n        if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) {\n          lastChild = this.text(text);\n        } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) {\n          lastChild = this.cdata(text);\n        } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) {\n          lastChild = this.comment(text);\n        } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) {\n          lastChild = this.raw(text);\n        } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && name.indexOf(this.stringify.convertPIKey) === 0) {\n          lastChild = this.instruction(name.substr(this.stringify.convertPIKey.length), text);\n        } else {\n          lastChild = this.node(name, attributes, text);\n        }\n      }\n      if (lastChild == null) {\n        throw new Error(\"Could not create any elements with: \" + name + \". \" + this.debugInfo());\n      }\n      return lastChild;\n    };\n\n    XMLNode.prototype.insertBefore = function(name, attributes, text) {\n      var child, i, removed;\n      if (this.isRoot) {\n        throw new Error(\"Cannot insert elements at root level. \" + this.debugInfo(name));\n      }\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i);\n      child = this.parent.element(name, attributes, text);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return child;\n    };\n\n    XMLNode.prototype.insertAfter = function(name, attributes, text) {\n      var child, i, removed;\n      if (this.isRoot) {\n        throw new Error(\"Cannot insert elements at root level. \" + this.debugInfo(name));\n      }\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i + 1);\n      child = this.parent.element(name, attributes, text);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return child;\n    };\n\n    XMLNode.prototype.remove = function() {\n      var i, ref1;\n      if (this.isRoot) {\n        throw new Error(\"Cannot remove the root element. \" + this.debugInfo());\n      }\n      i = this.parent.children.indexOf(this);\n      [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref1 = [])), ref1;\n      return this.parent;\n    };\n\n    XMLNode.prototype.node = function(name, attributes, text) {\n      var child, ref1;\n      if (name != null) {\n        name = getValue(name);\n      }\n      attributes || (attributes = {});\n      attributes = getValue(attributes);\n      if (!isObject(attributes)) {\n        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];\n      }\n      child = new XMLElement(this, name, attributes);\n      if (text != null) {\n        child.text(text);\n      }\n      this.children.push(child);\n      return child;\n    };\n\n    XMLNode.prototype.text = function(value) {\n      var child;\n      child = new XMLText(this, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLNode.prototype.cdata = function(value) {\n      var child;\n      child = new XMLCData(this, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLNode.prototype.comment = function(value) {\n      var child;\n      child = new XMLComment(this, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLNode.prototype.commentBefore = function(value) {\n      var child, i, removed;\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i);\n      child = this.parent.comment(value);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return this;\n    };\n\n    XMLNode.prototype.commentAfter = function(value) {\n      var child, i, removed;\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i + 1);\n      child = this.parent.comment(value);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return this;\n    };\n\n    XMLNode.prototype.raw = function(value) {\n      var child;\n      child = new XMLRaw(this, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLNode.prototype.instruction = function(target, value) {\n      var insTarget, insValue, instruction, j, len;\n      if (target != null) {\n        target = getValue(target);\n      }\n      if (value != null) {\n        value = getValue(value);\n      }\n      if (Array.isArray(target)) {\n        for (j = 0, len = target.length; j < len; j++) {\n          insTarget = target[j];\n          this.instruction(insTarget);\n        }\n      } else if (isObject(target)) {\n        for (insTarget in target) {\n          if (!hasProp.call(target, insTarget)) continue;\n          insValue = target[insTarget];\n          this.instruction(insTarget, insValue);\n        }\n      } else {\n        if (isFunction(value)) {\n          value = value.apply();\n        }\n        instruction = new XMLProcessingInstruction(this, target, value);\n        this.children.push(instruction);\n      }\n      return this;\n    };\n\n    XMLNode.prototype.instructionBefore = function(target, value) {\n      var child, i, removed;\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i);\n      child = this.parent.instruction(target, value);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return this;\n    };\n\n    XMLNode.prototype.instructionAfter = function(target, value) {\n      var child, i, removed;\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i + 1);\n      child = this.parent.instruction(target, value);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return this;\n    };\n\n    XMLNode.prototype.declaration = function(version, encoding, standalone) {\n      var doc, xmldec;\n      doc = this.document();\n      xmldec = new XMLDeclaration(doc, version, encoding, standalone);\n      if (doc.children[0] instanceof XMLDeclaration) {\n        doc.children[0] = xmldec;\n      } else {\n        doc.children.unshift(xmldec);\n      }\n      return doc.root() || doc;\n    };\n\n    XMLNode.prototype.doctype = function(pubID, sysID) {\n      var child, doc, doctype, i, j, k, len, len1, ref1, ref2;\n      doc = this.document();\n      doctype = new XMLDocType(doc, pubID, sysID);\n      ref1 = doc.children;\n      for (i = j = 0, len = ref1.length; j < len; i = ++j) {\n        child = ref1[i];\n        if (child instanceof XMLDocType) {\n          doc.children[i] = doctype;\n          return doctype;\n        }\n      }\n      ref2 = doc.children;\n      for (i = k = 0, len1 = ref2.length; k < len1; i = ++k) {\n        child = ref2[i];\n        if (child.isRoot) {\n          doc.children.splice(i, 0, doctype);\n          return doctype;\n        }\n      }\n      doc.children.push(doctype);\n      return doctype;\n    };\n\n    XMLNode.prototype.up = function() {\n      if (this.isRoot) {\n        throw new Error(\"The root node has no parent. Use doc() if you need to get the document object.\");\n      }\n      return this.parent;\n    };\n\n    XMLNode.prototype.root = function() {\n      var node;\n      node = this;\n      while (node) {\n        if (node.isDocument) {\n          return node.rootObject;\n        } else if (node.isRoot) {\n          return node;\n        } else {\n          node = node.parent;\n        }\n      }\n    };\n\n    XMLNode.prototype.document = function() {\n      var node;\n      node = this;\n      while (node) {\n        if (node.isDocument) {\n          return node;\n        } else {\n          node = node.parent;\n        }\n      }\n    };\n\n    XMLNode.prototype.end = function(options) {\n      return this.document().end(options);\n    };\n\n    XMLNode.prototype.prev = function() {\n      var i;\n      i = this.parent.children.indexOf(this);\n      if (i < 1) {\n        throw new Error(\"Already at the first node. \" + this.debugInfo());\n      }\n      return this.parent.children[i - 1];\n    };\n\n    XMLNode.prototype.next = function() {\n      var i;\n      i = this.parent.children.indexOf(this);\n      if (i === -1 || i === this.parent.children.length - 1) {\n        throw new Error(\"Already at the last node. \" + this.debugInfo());\n      }\n      return this.parent.children[i + 1];\n    };\n\n    XMLNode.prototype.importDocument = function(doc) {\n      var clonedRoot;\n      clonedRoot = doc.root().clone();\n      clonedRoot.parent = this;\n      clonedRoot.isRoot = false;\n      this.children.push(clonedRoot);\n      return this;\n    };\n\n    XMLNode.prototype.debugInfo = function(name) {\n      var ref1, ref2;\n      name = name || this.name;\n      if ((name == null) && !((ref1 = this.parent) != null ? ref1.name : void 0)) {\n        return \"\";\n      } else if (name == null) {\n        return \"parent: <\" + this.parent.name + \">\";\n      } else if (!((ref2 = this.parent) != null ? ref2.name : void 0)) {\n        return \"node: <\" + name + \">\";\n      } else {\n        return \"node: <\" + name + \">, parent: <\" + this.parent.name + \">\";\n      }\n    };\n\n    XMLNode.prototype.ele = function(name, attributes, text) {\n      return this.element(name, attributes, text);\n    };\n\n    XMLNode.prototype.nod = function(name, attributes, text) {\n      return this.node(name, attributes, text);\n    };\n\n    XMLNode.prototype.txt = function(value) {\n      return this.text(value);\n    };\n\n    XMLNode.prototype.dat = function(value) {\n      return this.cdata(value);\n    };\n\n    XMLNode.prototype.com = function(value) {\n      return this.comment(value);\n    };\n\n    XMLNode.prototype.ins = function(target, value) {\n      return this.instruction(target, value);\n    };\n\n    XMLNode.prototype.doc = function() {\n      return this.document();\n    };\n\n    XMLNode.prototype.dec = function(version, encoding, standalone) {\n      return this.declaration(version, encoding, standalone);\n    };\n\n    XMLNode.prototype.dtd = function(pubID, sysID) {\n      return this.doctype(pubID, sysID);\n    };\n\n    XMLNode.prototype.e = function(name, attributes, text) {\n      return this.element(name, attributes, text);\n    };\n\n    XMLNode.prototype.n = function(name, attributes, text) {\n      return this.node(name, attributes, text);\n    };\n\n    XMLNode.prototype.t = function(value) {\n      return this.text(value);\n    };\n\n    XMLNode.prototype.d = function(value) {\n      return this.cdata(value);\n    };\n\n    XMLNode.prototype.c = function(value) {\n      return this.comment(value);\n    };\n\n    XMLNode.prototype.r = function(value) {\n      return this.raw(value);\n    };\n\n    XMLNode.prototype.i = function(target, value) {\n      return this.instruction(target, value);\n    };\n\n    XMLNode.prototype.u = function() {\n      return this.up();\n    };\n\n    XMLNode.prototype.importXMLBuilder = function(doc) {\n      return this.importDocument(doc);\n    };\n\n    return XMLNode;\n\n  })();\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLCData\":160,\"./XMLComment\":161,\"./XMLDeclaration\":166,\"./XMLDocType\":167,\"./XMLElement\":170,\"./XMLProcessingInstruction\":172,\"./XMLRaw\":173,\"./XMLText\":177}],172:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLNode, XMLProcessingInstruction,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLProcessingInstruction = (function(superClass) {\n    extend(XMLProcessingInstruction, superClass);\n\n    function XMLProcessingInstruction(parent, target, value) {\n      XMLProcessingInstruction.__super__.constructor.call(this, parent);\n      if (target == null) {\n        throw new Error(\"Missing instruction target. \" + this.debugInfo());\n      }\n      this.target = this.stringify.insTarget(target);\n      if (value) {\n        this.value = this.stringify.insValue(value);\n      }\n    }\n\n    XMLProcessingInstruction.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLProcessingInstruction.prototype.toString = function(options) {\n      return this.options.writer.set(options).processingInstruction(this);\n    };\n\n    return XMLProcessingInstruction;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],173:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLNode, XMLRaw,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLRaw = (function(superClass) {\n    extend(XMLRaw, superClass);\n\n    function XMLRaw(parent, text) {\n      XMLRaw.__super__.constructor.call(this, parent);\n      if (text == null) {\n        throw new Error(\"Missing raw text. \" + this.debugInfo());\n      }\n      this.value = this.stringify.raw(text);\n    }\n\n    XMLRaw.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLRaw.prototype.toString = function(options) {\n      return this.options.writer.set(options).raw(this);\n    };\n\n    return XMLRaw;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],174:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStreamWriter, XMLText, XMLWriterBase,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLDeclaration = require('./XMLDeclaration');\n\n  XMLDocType = require('./XMLDocType');\n\n  XMLCData = require('./XMLCData');\n\n  XMLComment = require('./XMLComment');\n\n  XMLElement = require('./XMLElement');\n\n  XMLRaw = require('./XMLRaw');\n\n  XMLText = require('./XMLText');\n\n  XMLProcessingInstruction = require('./XMLProcessingInstruction');\n\n  XMLDTDAttList = require('./XMLDTDAttList');\n\n  XMLDTDElement = require('./XMLDTDElement');\n\n  XMLDTDEntity = require('./XMLDTDEntity');\n\n  XMLDTDNotation = require('./XMLDTDNotation');\n\n  XMLWriterBase = require('./XMLWriterBase');\n\n  module.exports = XMLStreamWriter = (function(superClass) {\n    extend(XMLStreamWriter, superClass);\n\n    function XMLStreamWriter(stream, options) {\n      XMLStreamWriter.__super__.constructor.call(this, options);\n      this.stream = stream;\n    }\n\n    XMLStreamWriter.prototype.document = function(doc) {\n      var child, i, j, len, len1, ref, ref1, results;\n      ref = doc.children;\n      for (i = 0, len = ref.length; i < len; i++) {\n        child = ref[i];\n        child.isLastRootNode = false;\n      }\n      doc.children[doc.children.length - 1].isLastRootNode = true;\n      ref1 = doc.children;\n      results = [];\n      for (j = 0, len1 = ref1.length; j < len1; j++) {\n        child = ref1[j];\n        switch (false) {\n          case !(child instanceof XMLDeclaration):\n            results.push(this.declaration(child));\n            break;\n          case !(child instanceof XMLDocType):\n            results.push(this.docType(child));\n            break;\n          case !(child instanceof XMLComment):\n            results.push(this.comment(child));\n            break;\n          case !(child instanceof XMLProcessingInstruction):\n            results.push(this.processingInstruction(child));\n            break;\n          default:\n            results.push(this.element(child));\n        }\n      }\n      return results;\n    };\n\n    XMLStreamWriter.prototype.attribute = function(att) {\n      return this.stream.write(' ' + att.name + '=\"' + att.value + '\"');\n    };\n\n    XMLStreamWriter.prototype.cdata = function(node, level) {\n      return this.stream.write(this.space(level) + '<![CDATA[' + node.text + ']]>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.comment = function(node, level) {\n      return this.stream.write(this.space(level) + '<!-- ' + node.text + ' -->' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.declaration = function(node, level) {\n      this.stream.write(this.space(level));\n      this.stream.write('<?xml version=\"' + node.version + '\"');\n      if (node.encoding != null) {\n        this.stream.write(' encoding=\"' + node.encoding + '\"');\n      }\n      if (node.standalone != null) {\n        this.stream.write(' standalone=\"' + node.standalone + '\"');\n      }\n      this.stream.write(this.spacebeforeslash + '?>');\n      return this.stream.write(this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.docType = function(node, level) {\n      var child, i, len, ref;\n      level || (level = 0);\n      this.stream.write(this.space(level));\n      this.stream.write('<!DOCTYPE ' + node.root().name);\n      if (node.pubID && node.sysID) {\n        this.stream.write(' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"');\n      } else if (node.sysID) {\n        this.stream.write(' SYSTEM \"' + node.sysID + '\"');\n      }\n      if (node.children.length > 0) {\n        this.stream.write(' [');\n        this.stream.write(this.endline(node));\n        ref = node.children;\n        for (i = 0, len = ref.length; i < len; i++) {\n          child = ref[i];\n          switch (false) {\n            case !(child instanceof XMLDTDAttList):\n              this.dtdAttList(child, level + 1);\n              break;\n            case !(child instanceof XMLDTDElement):\n              this.dtdElement(child, level + 1);\n              break;\n            case !(child instanceof XMLDTDEntity):\n              this.dtdEntity(child, level + 1);\n              break;\n            case !(child instanceof XMLDTDNotation):\n              this.dtdNotation(child, level + 1);\n              break;\n            case !(child instanceof XMLCData):\n              this.cdata(child, level + 1);\n              break;\n            case !(child instanceof XMLComment):\n              this.comment(child, level + 1);\n              break;\n            case !(child instanceof XMLProcessingInstruction):\n              this.processingInstruction(child, level + 1);\n              break;\n            default:\n              throw new Error(\"Unknown DTD node type: \" + child.constructor.name);\n          }\n        }\n        this.stream.write(']');\n      }\n      this.stream.write(this.spacebeforeslash + '>');\n      return this.stream.write(this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.element = function(node, level) {\n      var att, child, i, len, name, ref, ref1, space;\n      level || (level = 0);\n      space = this.space(level);\n      this.stream.write(space + '<' + node.name);\n      ref = node.attributes;\n      for (name in ref) {\n        if (!hasProp.call(ref, name)) continue;\n        att = ref[name];\n        this.attribute(att);\n      }\n      if (node.children.length === 0 || node.children.every(function(e) {\n        return e.value === '';\n      })) {\n        if (this.allowEmpty) {\n          this.stream.write('></' + node.name + '>');\n        } else {\n          this.stream.write(this.spacebeforeslash + '/>');\n        }\n      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {\n        this.stream.write('>');\n        this.stream.write(node.children[0].value);\n        this.stream.write('</' + node.name + '>');\n      } else {\n        this.stream.write('>' + this.newline);\n        ref1 = node.children;\n        for (i = 0, len = ref1.length; i < len; i++) {\n          child = ref1[i];\n          switch (false) {\n            case !(child instanceof XMLCData):\n              this.cdata(child, level + 1);\n              break;\n            case !(child instanceof XMLComment):\n              this.comment(child, level + 1);\n              break;\n            case !(child instanceof XMLElement):\n              this.element(child, level + 1);\n              break;\n            case !(child instanceof XMLRaw):\n              this.raw(child, level + 1);\n              break;\n            case !(child instanceof XMLText):\n              this.text(child, level + 1);\n              break;\n            case !(child instanceof XMLProcessingInstruction):\n              this.processingInstruction(child, level + 1);\n              break;\n            default:\n              throw new Error(\"Unknown XML node type: \" + child.constructor.name);\n          }\n        }\n        this.stream.write(space + '</' + node.name + '>');\n      }\n      return this.stream.write(this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.processingInstruction = function(node, level) {\n      this.stream.write(this.space(level) + '<?' + node.target);\n      if (node.value) {\n        this.stream.write(' ' + node.value);\n      }\n      return this.stream.write(this.spacebeforeslash + '?>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.raw = function(node, level) {\n      return this.stream.write(this.space(level) + node.value + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.text = function(node, level) {\n      return this.stream.write(this.space(level) + node.value + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.dtdAttList = function(node, level) {\n      this.stream.write(this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType);\n      if (node.defaultValueType !== '#DEFAULT') {\n        this.stream.write(' ' + node.defaultValueType);\n      }\n      if (node.defaultValue) {\n        this.stream.write(' \"' + node.defaultValue + '\"');\n      }\n      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.dtdElement = function(node, level) {\n      this.stream.write(this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value);\n      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.dtdEntity = function(node, level) {\n      this.stream.write(this.space(level) + '<!ENTITY');\n      if (node.pe) {\n        this.stream.write(' %');\n      }\n      this.stream.write(' ' + node.name);\n      if (node.value) {\n        this.stream.write(' \"' + node.value + '\"');\n      } else {\n        if (node.pubID && node.sysID) {\n          this.stream.write(' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"');\n        } else if (node.sysID) {\n          this.stream.write(' SYSTEM \"' + node.sysID + '\"');\n        }\n        if (node.nData) {\n          this.stream.write(' NDATA ' + node.nData);\n        }\n      }\n      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.dtdNotation = function(node, level) {\n      this.stream.write(this.space(level) + '<!NOTATION ' + node.name);\n      if (node.pubID && node.sysID) {\n        this.stream.write(' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"');\n      } else if (node.pubID) {\n        this.stream.write(' PUBLIC \"' + node.pubID + '\"');\n      } else if (node.sysID) {\n        this.stream.write(' SYSTEM \"' + node.sysID + '\"');\n      }\n      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.endline = function(node) {\n      if (!node.isLastRootNode) {\n        return this.newline;\n      } else {\n        return '';\n      }\n    };\n\n    return XMLStreamWriter;\n\n  })(XMLWriterBase);\n\n}).call(this);\n\n},{\"./XMLCData\":160,\"./XMLComment\":161,\"./XMLDTDAttList\":162,\"./XMLDTDElement\":163,\"./XMLDTDEntity\":164,\"./XMLDTDNotation\":165,\"./XMLDeclaration\":166,\"./XMLDocType\":167,\"./XMLElement\":170,\"./XMLProcessingInstruction\":172,\"./XMLRaw\":173,\"./XMLText\":177,\"./XMLWriterBase\":178}],175:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLText, XMLWriterBase,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLDeclaration = require('./XMLDeclaration');\n\n  XMLDocType = require('./XMLDocType');\n\n  XMLCData = require('./XMLCData');\n\n  XMLComment = require('./XMLComment');\n\n  XMLElement = require('./XMLElement');\n\n  XMLRaw = require('./XMLRaw');\n\n  XMLText = require('./XMLText');\n\n  XMLProcessingInstruction = require('./XMLProcessingInstruction');\n\n  XMLDTDAttList = require('./XMLDTDAttList');\n\n  XMLDTDElement = require('./XMLDTDElement');\n\n  XMLDTDEntity = require('./XMLDTDEntity');\n\n  XMLDTDNotation = require('./XMLDTDNotation');\n\n  XMLWriterBase = require('./XMLWriterBase');\n\n  module.exports = XMLStringWriter = (function(superClass) {\n    extend(XMLStringWriter, superClass);\n\n    function XMLStringWriter(options) {\n      XMLStringWriter.__super__.constructor.call(this, options);\n    }\n\n    XMLStringWriter.prototype.document = function(doc) {\n      var child, i, len, r, ref;\n      this.textispresent = false;\n      r = '';\n      ref = doc.children;\n      for (i = 0, len = ref.length; i < len; i++) {\n        child = ref[i];\n        r += (function() {\n          switch (false) {\n            case !(child instanceof XMLDeclaration):\n              return this.declaration(child);\n            case !(child instanceof XMLDocType):\n              return this.docType(child);\n            case !(child instanceof XMLComment):\n              return this.comment(child);\n            case !(child instanceof XMLProcessingInstruction):\n              return this.processingInstruction(child);\n            default:\n              return this.element(child, 0);\n          }\n        }).call(this);\n      }\n      if (this.pretty && r.slice(-this.newline.length) === this.newline) {\n        r = r.slice(0, -this.newline.length);\n      }\n      return r;\n    };\n\n    XMLStringWriter.prototype.attribute = function(att) {\n      return ' ' + att.name + '=\"' + att.value + '\"';\n    };\n\n    XMLStringWriter.prototype.cdata = function(node, level) {\n      return this.space(level) + '<![CDATA[' + node.text + ']]>' + this.newline;\n    };\n\n    XMLStringWriter.prototype.comment = function(node, level) {\n      return this.space(level) + '<!-- ' + node.text + ' -->' + this.newline;\n    };\n\n    XMLStringWriter.prototype.declaration = function(node, level) {\n      var r;\n      r = this.space(level);\n      r += '<?xml version=\"' + node.version + '\"';\n      if (node.encoding != null) {\n        r += ' encoding=\"' + node.encoding + '\"';\n      }\n      if (node.standalone != null) {\n        r += ' standalone=\"' + node.standalone + '\"';\n      }\n      r += this.spacebeforeslash + '?>';\n      r += this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.docType = function(node, level) {\n      var child, i, len, r, ref;\n      level || (level = 0);\n      r = this.space(level);\n      r += '<!DOCTYPE ' + node.root().name;\n      if (node.pubID && node.sysID) {\n        r += ' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"';\n      } else if (node.sysID) {\n        r += ' SYSTEM \"' + node.sysID + '\"';\n      }\n      if (node.children.length > 0) {\n        r += ' [';\n        r += this.newline;\n        ref = node.children;\n        for (i = 0, len = ref.length; i < len; i++) {\n          child = ref[i];\n          r += (function() {\n            switch (false) {\n              case !(child instanceof XMLDTDAttList):\n                return this.dtdAttList(child, level + 1);\n              case !(child instanceof XMLDTDElement):\n                return this.dtdElement(child, level + 1);\n              case !(child instanceof XMLDTDEntity):\n                return this.dtdEntity(child, level + 1);\n              case !(child instanceof XMLDTDNotation):\n                return this.dtdNotation(child, level + 1);\n              case !(child instanceof XMLCData):\n                return this.cdata(child, level + 1);\n              case !(child instanceof XMLComment):\n                return this.comment(child, level + 1);\n              case !(child instanceof XMLProcessingInstruction):\n                return this.processingInstruction(child, level + 1);\n              default:\n                throw new Error(\"Unknown DTD node type: \" + child.constructor.name);\n            }\n          }).call(this);\n        }\n        r += ']';\n      }\n      r += this.spacebeforeslash + '>';\n      r += this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.element = function(node, level) {\n      var att, child, i, j, len, len1, name, r, ref, ref1, ref2, space, textispresentwasset;\n      level || (level = 0);\n      textispresentwasset = false;\n      if (this.textispresent) {\n        this.newline = '';\n        this.pretty = false;\n      } else {\n        this.newline = this.newlinedefault;\n        this.pretty = this.prettydefault;\n      }\n      space = this.space(level);\n      r = '';\n      r += space + '<' + node.name;\n      ref = node.attributes;\n      for (name in ref) {\n        if (!hasProp.call(ref, name)) continue;\n        att = ref[name];\n        r += this.attribute(att);\n      }\n      if (node.children.length === 0 || node.children.every(function(e) {\n        return e.value === '';\n      })) {\n        if (this.allowEmpty) {\n          r += '></' + node.name + '>' + this.newline;\n        } else {\n          r += this.spacebeforeslash + '/>' + this.newline;\n        }\n      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {\n        r += '>';\n        r += node.children[0].value;\n        r += '</' + node.name + '>' + this.newline;\n      } else {\n        if (this.dontprettytextnodes) {\n          ref1 = node.children;\n          for (i = 0, len = ref1.length; i < len; i++) {\n            child = ref1[i];\n            if (child.value != null) {\n              this.textispresent++;\n              textispresentwasset = true;\n              break;\n            }\n          }\n        }\n        if (this.textispresent) {\n          this.newline = '';\n          this.pretty = false;\n          space = this.space(level);\n        }\n        r += '>' + this.newline;\n        ref2 = node.children;\n        for (j = 0, len1 = ref2.length; j < len1; j++) {\n          child = ref2[j];\n          r += (function() {\n            switch (false) {\n              case !(child instanceof XMLCData):\n                return this.cdata(child, level + 1);\n              case !(child instanceof XMLComment):\n                return this.comment(child, level + 1);\n              case !(child instanceof XMLElement):\n                return this.element(child, level + 1);\n              case !(child instanceof XMLRaw):\n                return this.raw(child, level + 1);\n              case !(child instanceof XMLText):\n                return this.text(child, level + 1);\n              case !(child instanceof XMLProcessingInstruction):\n                return this.processingInstruction(child, level + 1);\n              default:\n                throw new Error(\"Unknown XML node type: \" + child.constructor.name);\n            }\n          }).call(this);\n        }\n        if (textispresentwasset) {\n          this.textispresent--;\n        }\n        if (!this.textispresent) {\n          this.newline = this.newlinedefault;\n          this.pretty = this.prettydefault;\n        }\n        r += space + '</' + node.name + '>' + this.newline;\n      }\n      return r;\n    };\n\n    XMLStringWriter.prototype.processingInstruction = function(node, level) {\n      var r;\n      r = this.space(level) + '<?' + node.target;\n      if (node.value) {\n        r += ' ' + node.value;\n      }\n      r += this.spacebeforeslash + '?>' + this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.raw = function(node, level) {\n      return this.space(level) + node.value + this.newline;\n    };\n\n    XMLStringWriter.prototype.text = function(node, level) {\n      return this.space(level) + node.value + this.newline;\n    };\n\n    XMLStringWriter.prototype.dtdAttList = function(node, level) {\n      var r;\n      r = this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType;\n      if (node.defaultValueType !== '#DEFAULT') {\n        r += ' ' + node.defaultValueType;\n      }\n      if (node.defaultValue) {\n        r += ' \"' + node.defaultValue + '\"';\n      }\n      r += this.spacebeforeslash + '>' + this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.dtdElement = function(node, level) {\n      return this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value + this.spacebeforeslash + '>' + this.newline;\n    };\n\n    XMLStringWriter.prototype.dtdEntity = function(node, level) {\n      var r;\n      r = this.space(level) + '<!ENTITY';\n      if (node.pe) {\n        r += ' %';\n      }\n      r += ' ' + node.name;\n      if (node.value) {\n        r += ' \"' + node.value + '\"';\n      } else {\n        if (node.pubID && node.sysID) {\n          r += ' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"';\n        } else if (node.sysID) {\n          r += ' SYSTEM \"' + node.sysID + '\"';\n        }\n        if (node.nData) {\n          r += ' NDATA ' + node.nData;\n        }\n      }\n      r += this.spacebeforeslash + '>' + this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.dtdNotation = function(node, level) {\n      var r;\n      r = this.space(level) + '<!NOTATION ' + node.name;\n      if (node.pubID && node.sysID) {\n        r += ' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"';\n      } else if (node.pubID) {\n        r += ' PUBLIC \"' + node.pubID + '\"';\n      } else if (node.sysID) {\n        r += ' SYSTEM \"' + node.sysID + '\"';\n      }\n      r += this.spacebeforeslash + '>' + this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.openNode = function(node, level) {\n      var att, name, r, ref;\n      level || (level = 0);\n      if (node instanceof XMLElement) {\n        r = this.space(level) + '<' + node.name;\n        ref = node.attributes;\n        for (name in ref) {\n          if (!hasProp.call(ref, name)) continue;\n          att = ref[name];\n          r += this.attribute(att);\n        }\n        r += (node.children ? '>' : '/>') + this.newline;\n        return r;\n      } else {\n        r = this.space(level) + '<!DOCTYPE ' + node.rootNodeName;\n        if (node.pubID && node.sysID) {\n          r += ' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"';\n        } else if (node.sysID) {\n          r += ' SYSTEM \"' + node.sysID + '\"';\n        }\n        r += (node.children ? ' [' : '>') + this.newline;\n        return r;\n      }\n    };\n\n    XMLStringWriter.prototype.closeNode = function(node, level) {\n      level || (level = 0);\n      switch (false) {\n        case !(node instanceof XMLElement):\n          return this.space(level) + '</' + node.name + '>' + this.newline;\n        case !(node instanceof XMLDocType):\n          return this.space(level) + ']>' + this.newline;\n      }\n    };\n\n    return XMLStringWriter;\n\n  })(XMLWriterBase);\n\n}).call(this);\n\n},{\"./XMLCData\":160,\"./XMLComment\":161,\"./XMLDTDAttList\":162,\"./XMLDTDElement\":163,\"./XMLDTDEntity\":164,\"./XMLDTDNotation\":165,\"./XMLDeclaration\":166,\"./XMLDocType\":167,\"./XMLElement\":170,\"./XMLProcessingInstruction\":172,\"./XMLRaw\":173,\"./XMLText\":177,\"./XMLWriterBase\":178}],176:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLStringifier,\n    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n    hasProp = {}.hasOwnProperty;\n\n  module.exports = XMLStringifier = (function() {\n    function XMLStringifier(options) {\n      this.assertLegalChar = bind(this.assertLegalChar, this);\n      var key, ref, value;\n      options || (options = {});\n      this.noDoubleEncoding = options.noDoubleEncoding;\n      ref = options.stringify || {};\n      for (key in ref) {\n        if (!hasProp.call(ref, key)) continue;\n        value = ref[key];\n        this[key] = value;\n      }\n    }\n\n    XMLStringifier.prototype.eleName = function(val) {\n      val = '' + val || '';\n      return this.assertLegalChar(val);\n    };\n\n    XMLStringifier.prototype.eleText = function(val) {\n      val = '' + val || '';\n      return this.assertLegalChar(this.elEscape(val));\n    };\n\n    XMLStringifier.prototype.cdata = function(val) {\n      val = '' + val || '';\n      val = val.replace(']]>', ']]]]><![CDATA[>');\n      return this.assertLegalChar(val);\n    };\n\n    XMLStringifier.prototype.comment = function(val) {\n      val = '' + val || '';\n      if (val.match(/--/)) {\n        throw new Error(\"Comment text cannot contain double-hypen: \" + val);\n      }\n      return this.assertLegalChar(val);\n    };\n\n    XMLStringifier.prototype.raw = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.attName = function(val) {\n      return val = '' + val || '';\n    };\n\n    XMLStringifier.prototype.attValue = function(val) {\n      val = '' + val || '';\n      return this.attEscape(val);\n    };\n\n    XMLStringifier.prototype.insTarget = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.insValue = function(val) {\n      val = '' + val || '';\n      if (val.match(/\\?>/)) {\n        throw new Error(\"Invalid processing instruction value: \" + val);\n      }\n      return val;\n    };\n\n    XMLStringifier.prototype.xmlVersion = function(val) {\n      val = '' + val || '';\n      if (!val.match(/1\\.[0-9]+/)) {\n        throw new Error(\"Invalid version number: \" + val);\n      }\n      return val;\n    };\n\n    XMLStringifier.prototype.xmlEncoding = function(val) {\n      val = '' + val || '';\n      if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-])*$/)) {\n        throw new Error(\"Invalid encoding: \" + val);\n      }\n      return val;\n    };\n\n    XMLStringifier.prototype.xmlStandalone = function(val) {\n      if (val) {\n        return \"yes\";\n      } else {\n        return \"no\";\n      }\n    };\n\n    XMLStringifier.prototype.dtdPubID = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.dtdSysID = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.dtdElementValue = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.dtdAttType = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.dtdAttDefault = function(val) {\n      if (val != null) {\n        return '' + val || '';\n      } else {\n        return val;\n      }\n    };\n\n    XMLStringifier.prototype.dtdEntityValue = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.dtdNData = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.convertAttKey = '@';\n\n    XMLStringifier.prototype.convertPIKey = '?';\n\n    XMLStringifier.prototype.convertTextKey = '#text';\n\n    XMLStringifier.prototype.convertCDataKey = '#cdata';\n\n    XMLStringifier.prototype.convertCommentKey = '#comment';\n\n    XMLStringifier.prototype.convertRawKey = '#raw';\n\n    XMLStringifier.prototype.assertLegalChar = function(str) {\n      var res;\n      res = str.match(/[\\0\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/);\n      if (res) {\n        throw new Error(\"Invalid character in string: \" + str + \" at index \" + res.index);\n      }\n      return str;\n    };\n\n    XMLStringifier.prototype.elEscape = function(str) {\n      var ampregex;\n      ampregex = this.noDoubleEncoding ? /(?!&\\S+;)&/g : /&/g;\n      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\\r/g, '&#xD;');\n    };\n\n    XMLStringifier.prototype.attEscape = function(str) {\n      var ampregex;\n      ampregex = this.noDoubleEncoding ? /(?!&\\S+;)&/g : /&/g;\n      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/\"/g, '&quot;').replace(/\\t/g, '&#x9;').replace(/\\n/g, '&#xA;').replace(/\\r/g, '&#xD;');\n    };\n\n    return XMLStringifier;\n\n  })();\n\n}).call(this);\n\n},{}],177:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLNode, XMLText,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLText = (function(superClass) {\n    extend(XMLText, superClass);\n\n    function XMLText(parent, text) {\n      XMLText.__super__.constructor.call(this, parent);\n      if (text == null) {\n        throw new Error(\"Missing element text. \" + this.debugInfo());\n      }\n      this.value = this.stringify.eleText(text);\n    }\n\n    XMLText.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLText.prototype.toString = function(options) {\n      return this.options.writer.set(options).text(this);\n    };\n\n    return XMLText;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],178:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLWriterBase,\n    hasProp = {}.hasOwnProperty;\n\n  module.exports = XMLWriterBase = (function() {\n    function XMLWriterBase(options) {\n      var key, ref, ref1, ref2, ref3, ref4, ref5, ref6, value;\n      options || (options = {});\n      this.pretty = options.pretty || false;\n      this.allowEmpty = (ref = options.allowEmpty) != null ? ref : false;\n      if (this.pretty) {\n        this.indent = (ref1 = options.indent) != null ? ref1 : '  ';\n        this.newline = (ref2 = options.newline) != null ? ref2 : '\\n';\n        this.offset = (ref3 = options.offset) != null ? ref3 : 0;\n        this.dontprettytextnodes = (ref4 = options.dontprettytextnodes) != null ? ref4 : 0;\n      } else {\n        this.indent = '';\n        this.newline = '';\n        this.offset = 0;\n        this.dontprettytextnodes = 0;\n      }\n      this.spacebeforeslash = (ref5 = options.spacebeforeslash) != null ? ref5 : '';\n      if (this.spacebeforeslash === true) {\n        this.spacebeforeslash = ' ';\n      }\n      this.newlinedefault = this.newline;\n      this.prettydefault = this.pretty;\n      ref6 = options.writer || {};\n      for (key in ref6) {\n        if (!hasProp.call(ref6, key)) continue;\n        value = ref6[key];\n        this[key] = value;\n      }\n    }\n\n    XMLWriterBase.prototype.set = function(options) {\n      var key, ref, value;\n      options || (options = {});\n      if (\"pretty\" in options) {\n        this.pretty = options.pretty;\n      }\n      if (\"allowEmpty\" in options) {\n        this.allowEmpty = options.allowEmpty;\n      }\n      if (this.pretty) {\n        this.indent = \"indent\" in options ? options.indent : '  ';\n        this.newline = \"newline\" in options ? options.newline : '\\n';\n        this.offset = \"offset\" in options ? options.offset : 0;\n        this.dontprettytextnodes = \"dontprettytextnodes\" in options ? options.dontprettytextnodes : 0;\n      } else {\n        this.indent = '';\n        this.newline = '';\n        this.offset = 0;\n        this.dontprettytextnodes = 0;\n      }\n      this.spacebeforeslash = \"spacebeforeslash\" in options ? options.spacebeforeslash : '';\n      if (this.spacebeforeslash === true) {\n        this.spacebeforeslash = ' ';\n      }\n      this.newlinedefault = this.newline;\n      this.prettydefault = this.pretty;\n      ref = options.writer || {};\n      for (key in ref) {\n        if (!hasProp.call(ref, key)) continue;\n        value = ref[key];\n        this[key] = value;\n      }\n      return this;\n    };\n\n    XMLWriterBase.prototype.space = function(level) {\n      var indent;\n      if (this.pretty) {\n        indent = (level || 0) + this.offset + 1;\n        if (indent > 0) {\n          return new Array(indent).join(this.indent);\n        } else {\n          return '';\n        }\n      } else {\n        return '';\n      }\n    };\n\n    return XMLWriterBase;\n\n  })();\n\n}).call(this);\n\n},{}],179:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDocument, XMLDocumentCB, XMLStreamWriter, XMLStringWriter, assign, isFunction, ref;\n\n  ref = require('./Utility'), assign = ref.assign, isFunction = ref.isFunction;\n\n  XMLDocument = require('./XMLDocument');\n\n  XMLDocumentCB = require('./XMLDocumentCB');\n\n  XMLStringWriter = require('./XMLStringWriter');\n\n  XMLStreamWriter = require('./XMLStreamWriter');\n\n  module.exports.create = function(name, xmldec, doctype, options) {\n    var doc, root;\n    if (name == null) {\n      throw new Error(\"Root element needs a name.\");\n    }\n    options = assign({}, xmldec, doctype, options);\n    doc = new XMLDocument(options);\n    root = doc.element(name);\n    if (!options.headless) {\n      doc.declaration(options);\n      if ((options.pubID != null) || (options.sysID != null)) {\n        doc.doctype(options);\n      }\n    }\n    return root;\n  };\n\n  module.exports.begin = function(options, onData, onEnd) {\n    var ref1;\n    if (isFunction(options)) {\n      ref1 = [options, onData], onData = ref1[0], onEnd = ref1[1];\n      options = {};\n    }\n    if (onData) {\n      return new XMLDocumentCB(options, onData, onEnd);\n    } else {\n      return new XMLDocument(options);\n    }\n  };\n\n  module.exports.stringWriter = function(options) {\n    return new XMLStringWriter(options);\n  };\n\n  module.exports.streamWriter = function(stream, options) {\n    return new XMLStreamWriter(stream, options);\n  };\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLDocument\":168,\"./XMLDocumentCB\":169,\"./XMLStreamWriter\":174,\"./XMLStringWriter\":175}]},{},[21])(21)\n});"
  },
  {
    "path": "example/pages/include/jquery_ui/AUTHORS.txt",
    "content": "Authors ordered by first contribution\nA list of current team members is available at http://jqueryui.com/about\n\nPaul Bakaus <paul.bakaus@gmail.com>\nRichard Worth <rdworth@gmail.com>\nYehuda Katz <wycats@gmail.com>\nSean Catchpole <sean@sunsean.com>\nJohn Resig <jeresig@gmail.com>\nTane Piper <piper.tane@gmail.com>\nDmitri Gaskin <dmitrig01@gmail.com>\nKlaus Hartl <klaus.hartl@gmail.com>\nStefan Petre <stefan.petre@gmail.com>\nGilles van den Hoven <gilles@webunity.nl>\nMicheil Bryan Smith <micheil@brandedcode.com>\nJörn Zaefferer <joern.zaefferer@gmail.com>\nMarc Grabanski <m@marcgrabanski.com>\nKeith Wood <kbwood@iinet.com.au>\nBrandon Aaron <brandon.aaron@gmail.com>\nScott González <scott.gonzalez@gmail.com>\nEduardo Lundgren <eduardolundgren@gmail.com>\nAaron Eisenberger <aaronchi@gmail.com>\nJoan Piedra <theneojp@gmail.com>\nBruno Basto <b.basto@gmail.com>\nRemy Sharp <remy@leftlogic.com>\nBohdan Ganicky <bohdan.ganicky@gmail.com>\nDavid Bolter <david.bolter@gmail.com>\nChi Cheng <cloudream@gmail.com>\nCa-Phun Ung <pazu2k@gmail.com>\nAriel Flesler <aflesler@gmail.com>\nMaggie Wachs <maggie@filamentgroup.com>\nScott Jehl <scottjehl@gmail.com>\nTodd Parker <todd@filamentgroup.com>\nAndrew Powell <andrew@shellscape.org>\nBrant Burnett <btburnett3@gmail.com>\nDouglas Neiner <doug@dougneiner.com>\nPaul Irish <paul.irish@gmail.com>\nRalph Whitbeck <ralph.whitbeck@gmail.com>\nThibault Duplessis <thibault.duplessis@gmail.com>\nDominique Vincent <dominique.vincent@toitl.com>\nJack Hsu <jack.hsu@gmail.com>\nAdam Sontag <ajpiano@ajpiano.com>\nCarl Fürstenberg <carl@excito.com>\nKevin Dalman <development@allpro.net>\nAlberto Fernández Capel <afcapel@gmail.com>\nJacek Jędrzejewski (http://jacek.jedrzejewski.name)\nTing Kuei <ting@kuei.com>\nSamuel Cormier-Iijima <sam@chide.it>\nJon Palmer <jonspalmer@gmail.com>\nBen Hollis <bhollis@amazon.com>\nJustin MacCarthy <Justin@Rubystars.biz>\nEyal Kobrigo <kobrigo@hotmail.com>\nTiago Freire <tiago.freire@gmail.com>\nDiego Tres <diegotres@gmail.com>\nHolger Rüprich <holger@rueprich.de>\nZiling Zhao <zilingzhao@gmail.com>\nMike Alsup <malsup@gmail.com>\nRobson Braga Araujo <robsonbraga@gmail.com>\nPierre-Henri Ausseil <ph.ausseil@gmail.com>\nChristopher McCulloh <cmcculloh@gmail.com>\nAndrew Newcomb <ext.github@preceptsoftware.co.uk>\nLim Chee Aun <cheeaun@gmail.com>\nJorge Barreiro <yortx.barry@gmail.com>\nDaniel Steigerwald <daniel@steigerwald.cz>\nJohn Firebaugh <john_firebaugh@bigfix.com>\nJohn Enters <github@darkdark.net>\nAndrey Kapitcyn <ru.m157y@gmail.com>\nDmitry Petrov <dpetroff@gmail.com>\nEric Hynds <eric@hynds.net>\nChairat Sunthornwiphat <pipo@sixhead.com>\nJosh Varner <josh.varner@gmail.com>\nStéphane Raimbault <stephane.raimbault@gmail.com>\nJay Merrifield <fracmak@gmail.com>\nJ. Ryan Stinnett <jryans@gmail.com>\nPeter Heiberg <peter@heiberg.se>\nAlex Dovenmuehle <adovenmuehle@gmail.com>\nJamie Gegerson <git@jamiegegerson.com>\nRaymond Schwartz <skeetergraphics@gmail.com>\nPhillip Barnes <philbar@gmail.com>\nKyle Wilkinson <kai@wikyd.org>\nKhaled AlHourani <me@khaledalhourani.com>\nMarian Rudzynski <mr@impaled.org>\nJean-Francois Remy <jeff@melix.org>\nDoug Blood <dougblood@gmail.com>\nFilippo Cavallarin <filippo.cavallarin@codseq.it>\nHeiko Henning <heiko@thehennings.ch>\nAliaksandr Rahalevich <saksmlz@gmail.com>\nMario Visic <mario@mariovisic.com>\nXavi Ramirez <xavi.rmz@gmail.com>\nMax Schnur <max.schnur@gmail.com>\nSaji Nediyanchath <saji89@gmail.com>\nCorey Frang <gnarf37@gmail.com>\nAaron Peterson <aaronp123@yahoo.com>\nIvan Peters <ivan@ivanpeters.com>\nMohamed Cherif Bouchelaghem <cherifbouchelaghem@yahoo.fr>\nMarcos Sousa <falecomigo@marcossousa.com>\nMichael DellaNoce <mdellanoce@mailtrust.com>\nGeorge Marshall <echosx@gmail.com>\nTobias Brunner <tobias@strongswan.org>\nMartin Solli <msolli@gmail.com>\nDavid Petersen <public@petersendidit.com>\nDan Heberden <danheberden@gmail.com>\nWilliam Kevin Manire <williamkmanire@gmail.com>\nGilmore Davidson <gilmoreorless@gmail.com>\nMichael Wu <michaelmwu@gmail.com>\nAdam Parod <mystic414@gmail.com>\nGuillaume Gautreau <guillaume+github@ghusse.com>\nMarcel Toele <EleotleCram@gmail.com>\nDan Streetman <ddstreet@ieee.org>\nMatt Hoskins <matt@nipltd.com>\nGiovanni Giacobbi <giovanni@giacobbi.net>\nKyle Florence <kyle.florence@gmail.com>\nPavol Hluchý <lopo@losys.sk>\nHans Hillen <hans.hillen@gmail.com>\nMark Johnson <virgofx@live.com>\nTrey Hunner <treyhunner@gmail.com>\nShane Whittet <whittet@gmail.com>\nEdward A Faulkner <ef@alum.mit.edu>\nAdam Baratz <adam@adambaratz.com>\nKato Kazuyoshi <kato.kazuyoshi@gmail.com>\nEike Send <eike.send@gmail.com>\nKris Borchers <kris.borchers@gmail.com>\nEddie Monge <eddie@eddiemonge.com>\nIsrael Tsadok <itsadok@gmail.com>\nCarson McDonald <carson@ioncannon.net>\nJason Davies <jason@jasondavies.com>\nGarrison Locke <gplocke@gmail.com>\nDavid Murdoch <david@davidmurdoch.com>\nBenjamin Scott Boyle <benjamins.boyle@gmail.com>\nJesse Baird <jebaird@gmail.com>\nJonathan Vingiano <jvingiano@gmail.com>\nDylan Just <dev@ephox.com>\nHiroshi Tomita <tomykaira@gmail.com>\nGlenn Goodrich <glenn.goodrich@gmail.com>\nTarafder Ashek-E-Elahi <mail.ashek@gmail.com>\nRyan Neufeld <ryan@neufeldmail.com>\nMarc Neuwirth <marc.neuwirth@gmail.com>\nPhilip Graham <philip.robert.graham@gmail.com>\nBenjamin Sterling <benjamin.sterling@kenzomedia.com>\nWesley Walser <waw325@gmail.com>\nKouhei Sutou <kou@clear-code.com>\nKarl Kirch <karlkrch@gmail.com>\nChris Kelly <ckdake@ckdake.com>\nJason Oster <jay@kodewerx.org>\nFelix Nagel <info@felixnagel.com>\nAlexander Polomoshnov <alex.polomoshnov@gmail.com>\nDavid Leal <dgleal@gmail.com>\nIgor Milla <igor.fsp.milla@gmail.com>\nDave Methvin <dave.methvin@gmail.com>\nFlorian Gutmann <f.gutmann@chronimo.com>\nMarwan Al Jubeh <marwan.aljubeh@gmail.com>\nMilan Broum <midlis@googlemail.com>\nSebastian Sauer <info@dynpages.de>\nGaëtan Muller <m.gaetan89@gmail.com>\nMichel Weimerskirch <michel@weimerskirch.net>\nWilliam Griffiths <william@ycymro.com>\nStojce Slavkovski <stojce@gmail.com>\nDavid Soms <david.soms@gmail.com>\nDavid De Sloovere <david.desloovere@outlook.com>\nMichael P. Jung <michael.jung@terreon.de>\nShannon Pekary <spekary@gmail.com>\nDan Wellman <danwellman@hotmail.com>\nMatthew Edward Hutton <meh@corefiling.co.uk>\nJames Khoury <james@jameskhoury.com>\nRob Loach <robloach@gmail.com>\nAlberto Monteiro <betimbrasil@gmail.com>\nAlex Rhea <alex.rhea@gmail.com>\nKrzysztof Rosiński <rozwell69@gmail.com>\nRyan Olton <oltonr@gmail.com>\nGenie <386@mail.com>\nRick Waldron <waldron.rick@gmail.com>\nIan Simpson <spoonlikesham@gmail.com>\nLev Kitsis <spam4lev@gmail.com>\nTJ VanToll <tj.vantoll@gmail.com>\nJustin Domnitz <jdomnitz@gmail.com>\nDouglas Cerna <douglascerna@yahoo.com>\nBert ter Heide <bertjh@hotmail.com>\nJasvir Nagra <jasvir@gmail.com>\nYuriy Khabarov <13real008@gmail.com>\nHarri Kilpiö <harri.kilpio@gmail.com>\nLado Lomidze <lado.lomidze@gmail.com>\nAmir E. Aharoni <amir.aharoni@mail.huji.ac.il>\nSimon Sattes <simon.sattes@gmail.com>\nJo Liss <joliss42@gmail.com>\nGuntupalli Karunakar <karunakarg@yahoo.com>\nShahyar Ghobadpour <shahyar@gmail.com>\nLukasz Lipinski <uzza17@gmail.com>\nTimo Tijhof <krinklemail@gmail.com>\nJason Moon <jmoon@socialcast.com>\nMartin Frost <martinf55@hotmail.com>\nEneko Illarramendi <eneko@illarra.com>\nEungJun Yi <semtlenori@gmail.com>\nCourtland Allen <courtlandallen@gmail.com>\nViktar Varvanovich <non4eg@gmail.com>\nDanny Trunk <dtrunk90@gmail.com>\nPavel Stetina <pavel.stetina@nangu.tv>\nMichael Stay <metaweta@gmail.com>\nSteven Roussey <sroussey@gmail.com>\nMichael Hollis <hollis21@gmail.com>\nLee Rowlands <lee.rowlands@previousnext.com.au>\nTimmy Willison <timmywillisn@gmail.com>\nKarl Swedberg <kswedberg@gmail.com>\nBaoju Yuan <the_guy_1987@hotmail.com>\nMaciej Mroziński <maciej.k.mrozinski@gmail.com>\nLuis Dalmolin <luis.nh@gmail.com>\nMark Aaron Shirley <maspwr@gmail.com>\nMartin Hoch <martin@fidion.de>\nJiayi Yang <tr870829@gmail.com>\nPhilipp Benjamin Köppchen <xgxtpbk@gws.ms>\nSindre Sorhus <sindresorhus@gmail.com>\nBernhard Sirlinger <bernhard.sirlinger@tele2.de>\nJared A. Scheel <jared@jaredscheel.com>\nRafael Xavier de Souza <rxaviers@gmail.com>\nJohn Chen <zhang.z.chen@intel.com>\nRobert Beuligmann <robertbeuligmann@gmail.com>\nDale Kocian <dale.kocian@gmail.com>\nMike Sherov <mike.sherov@gmail.com>\nAndrew Couch <andy@couchand.com>\nMarc-Andre Lafortune <github@marc-andre.ca>\nNate Eagle <nate.eagle@teamaol.com>\nDavid Souther <davidsouther@gmail.com>\nMathias Stenbom <mathias@stenbom.com>\nSergey Kartashov <ebishkek@yandex.ru>\nAvinash R <nashpapa@gmail.com>\nEthan Romba <ethanromba@gmail.com>\nCory Gackenheimer <cory.gack@gmail.com>\nJuan Pablo Kaniefsky <jpkaniefsky@gmail.com>\nRoman Salnikov <bardt.dz@gmail.com>\nAnika Henke <anika@selfthinker.org>\nSamuel Bovée <samycookie2000@yahoo.fr>\nFabrício Matté <ult_combo@hotmail.com>\nViktor Kojouharov <vkojouharov@gmail.com>\nPawel Maruszczyk (http://hrabstwo.net)\nPavel Selitskas <p.selitskas@gmail.com>\nBjørn Johansen <post@bjornjohansen.no>\nMatthieu Penant <thieum22@hotmail.com>\nDominic Barnes <dominic@dbarnes.info>\nDavid Sullivan <david.sullivan@gmail.com>\nThomas Jaggi <thomas@responsive.ch>\nVahid Sohrabloo <vahid4134@gmail.com>\nTravis Carden <travis.carden@gmail.com>\nBruno M. Custódio <bruno@brunomcustodio.com>\nNathanael Silverman <nathanael.silverman@gmail.com>\nChristian Wenz <christian@wenz.org>\nSteve Urmston <steve@urm.st>\nZaven Muradyan <megalivoithos@gmail.com>\nWoody Gilk <shadowhand@deviantart.com>\nZbigniew Motyka <zbigniew.motyka@gmail.com>\nSuhail Alkowaileet <xsoh.k7@gmail.com>\nToshi MARUYAMA <marutosijp2@yahoo.co.jp>\nDavid Hansen <hansede@gmail.com>\nBrian Grinstead <briangrinstead@gmail.com>\nChristian Klammer <christian314159@gmail.com>\nSteven Luscher <jquerycla@steveluscher.com>\nGan Eng Chin <engchin.gan@gmail.com>\nGabriel Schulhof <gabriel.schulhof@intel.com>\nAlexander Schmitz <arschmitz@gmail.com>\nVilhjálmur Skúlason <vis@dmm.is>\nSiebrand Mazeland <siebrand@kitano.nl>\nMohsen Ekhtiari <mohsenekhtiari@yahoo.com>\nPere Orga <gotrunks@gmail.com>\nJasper de Groot <mail@ugomobi.com>\nStephane Deschamps <stephane.deschamps@gmail.com>\nJyoti Deka <dekajp@gmail.com>\nAndrei Picus <office.nightcrawler@gmail.com>\nOndrej Novy <novy@ondrej.org>\nJacob McCutcheon <jacob.mccutcheon@gmail.com>\nMonika Piotrowicz <monika.piotrowicz@gmail.com>\nImants Horsts <imants.horsts@inbox.lv>\nEric Dahl <eric.c.dahl@gmail.com>\nDave Stein <dave@behance.com>\nDylan Barrell <dylan@barrell.com>\nDaniel DeGroff <djdegroff@gmail.com>\nMichael Wiencek <mwtuea@gmail.com>\nThomas Meyer <meyertee@gmail.com>\nRuslan Yakhyaev <ruslan@ruslan.io>\nBrian J. Dowling <bjd-dev@simplicity.net>\nBen Higgins <ben@extrahop.com>\nYermo Lamers <yml@yml.com>\nPatrick Stapleton <github@gdi2290.com>\nTrisha Crowley <trisha.crowley@gmail.com>\nUsman Akeju <akeju00+github@gmail.com>\nRodrigo Menezes <rod333@gmail.com>\nJacques Perrault <jacques_perrault@us.ibm.com>\nFrederik Elvhage <frederik.elvhage@googlemail.com>\nWill Holley <willholley@gmail.com>\nUri Gilad <antishok@gmail.com>\nRichard Gibson <richard.gibson@gmail.com>\nSimen Bekkhus <sbekkhus91@gmail.com>\nChen Eshchar <eshcharc@gmail.com>\nBruno Pérel <brunoperel@gmail.com>\nMohammed Alshehri <m@dralshehri.com>\nLisa Seacat DeLuca <ldeluca@us.ibm.com>\nAnne-Gaelle Colom <coloma@westminster.ac.uk>\nAdam Foster <slimfoster@gmail.com>\nLuke Page <luke.a.page@gmail.com>\nDaniel Owens <daniel@matchstickmixup.com>\nMichael Orchard <morchard@scottlogic.co.uk>\nMarcus Warren <marcus@envoke.com>\nNils Heuermann <nils@world-of-scripts.de>\nMarco Ziech <marco@ziech.net>\nPatricia Juarez <patrixd@gmail.com>\nBen Mosher <me@benmosher.com>\nAblay Keldibek <atomio.ak@gmail.com>\nThomas Applencourt <thomas.applencourt@irsamc.ups-tlse.fr>\nJiabao Wu <jiabao.foss@gmail.com>\nEric Lee Carraway <github@ericcarraway.com>\nVictor Homyakov <vkhomyackov@gmail.com>\nMyeongjin Lee <aranet100@gmail.com>\nLiran Sharir <lsharir@gmail.com>\nWeston Ruter <weston@xwp.co>\nMani Mishra <manimishra902@gmail.com>\nHannah Methvin <hannahmethvin@gmail.com>\nLeonardo Balter <leonardo.balter@gmail.com>\nBenjamin Albert <benjamin_a5@yahoo.com>\nMichał Gołębiowski <m.goleb@gmail.com>\nAlyosha Pushak <alyosha.pushak@gmail.com>\nFahad Ahmad <fahadahmad41@hotmail.com>\nMatt Brundage <github@mattbrundage.com>\nFrancesc Baeta <francesc.baeta@gmail.com>\nPiotr Baran <piotros@wp.pl>\nMukul Hase <mukulhase@gmail.com>\nKonstantin Dinev <kdinev@mail.bw.edu>\nRand Scullard <rand@randscullard.com>\nDan Strohl <dan@wjcg.net>\nMaksim Ryzhikov <rv.maksim@gmail.com>\nAmine HADDAD <haddad@allegorie.tv>\nAmanpreet Singh <apsdehal@gmail.com>\nAlexey Balchunas <bleshik@gmail.com>\nPeter Kehl <peter.kehl@gmail.com>\nPeter Dave Hello <hsu@peterdavehello.org>\nJohannes Schäfer <johnschaefer@gmx.de>\nVille Skyttä <ville.skytta@iki.fi>\nRyan Oriecuia <ryan.oriecuia@visioncritical.com>\n"
  },
  {
    "path": "example/pages/include/jquery_ui/jquery-ui.css",
    "content": "/*! jQuery UI - v1.12.1 - 2016-09-14\n* http://jqueryui.com\n* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css\n* To view and modify this theme, visit http://jqueryui.com/themeroller/?bgShadowXPos=&bgOverlayXPos=&bgErrorXPos=&bgHighlightXPos=&bgContentXPos=&bgHeaderXPos=&bgActiveXPos=&bgHoverXPos=&bgDefaultXPos=&bgShadowYPos=&bgOverlayYPos=&bgErrorYPos=&bgHighlightYPos=&bgContentYPos=&bgHeaderYPos=&bgActiveYPos=&bgHoverYPos=&bgDefaultYPos=&bgShadowRepeat=&bgOverlayRepeat=&bgErrorRepeat=&bgHighlightRepeat=&bgContentRepeat=&bgHeaderRepeat=&bgActiveRepeat=&bgHoverRepeat=&bgDefaultRepeat=&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&bgImgUrlShadow=&bgImgUrlOverlay=&bgImgUrlHover=&bgImgUrlHighlight=&bgImgUrlHeader=&bgImgUrlError=&bgImgUrlDefault=&bgImgUrlContent=&bgImgUrlActive=&opacityFilterShadow=Alpha(Opacity%3D30)&opacityFilterOverlay=Alpha(Opacity%3D30)&opacityShadowPerc=30&opacityOverlayPerc=30&iconColorHover=%23555555&iconColorHighlight=%23777620&iconColorHeader=%23444444&iconColorError=%23cc0000&iconColorDefault=%23777777&iconColorContent=%23444444&iconColorActive=%23ffffff&bgImgOpacityShadow=0&bgImgOpacityOverlay=0&bgImgOpacityError=95&bgImgOpacityHighlight=55&bgImgOpacityContent=75&bgImgOpacityHeader=75&bgImgOpacityActive=65&bgImgOpacityHover=75&bgImgOpacityDefault=75&bgTextureShadow=flat&bgTextureOverlay=flat&bgTextureError=flat&bgTextureHighlight=flat&bgTextureContent=flat&bgTextureHeader=flat&bgTextureActive=flat&bgTextureHover=flat&bgTextureDefault=flat&cornerRadius=3px&fwDefault=normal&ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&cornerRadiusShadow=8px&thicknessShadow=5px&offsetLeftShadow=0px&offsetTopShadow=0px&opacityShadow=.3&bgColorShadow=%23666666&opacityOverlay=.3&bgColorOverlay=%23aaaaaa&fcError=%235f3f3f&borderColorError=%23f1a899&bgColorError=%23fddfdf&fcHighlight=%23777620&borderColorHighlight=%23dad55e&bgColorHighlight=%23fffa90&fcContent=%23333333&borderColorContent=%23dddddd&bgColorContent=%23ffffff&fcHeader=%23333333&borderColorHeader=%23dddddd&bgColorHeader=%23e9e9e9&fcActive=%23ffffff&borderColorActive=%23003eff&bgColorActive=%23007fff&fcHover=%232b2b2b&borderColorHover=%23cccccc&bgColorHover=%23ededed&fcDefault=%23454545&borderColorDefault=%23c5c5c5&bgColorDefault=%23f6f6f6\n* Copyright jQuery Foundation and other contributors; Licensed MIT */\n\n/* Layout helpers\n----------------------------------*/\n.ui-helper-hidden {\n\tdisplay: none;\n}\n.ui-helper-hidden-accessible {\n\tborder: 0;\n\tclip: rect(0 0 0 0);\n\theight: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\twidth: 1px;\n}\n.ui-helper-reset {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\toutline: 0;\n\tline-height: 1.3;\n\ttext-decoration: none;\n\tfont-size: 100%;\n\tlist-style: none;\n}\n.ui-helper-clearfix:before,\n.ui-helper-clearfix:after {\n\tcontent: \"\";\n\tdisplay: table;\n\tborder-collapse: collapse;\n}\n.ui-helper-clearfix:after {\n\tclear: both;\n}\n.ui-helper-zfix {\n\twidth: 100%;\n\theight: 100%;\n\ttop: 0;\n\tleft: 0;\n\tposition: absolute;\n\topacity: 0;\n\tfilter:Alpha(Opacity=0); /* support: IE8 */\n}\n\n.ui-front {\n\tz-index: 100;\n}\n\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-disabled {\n\tcursor: default !important;\n\tpointer-events: none;\n}\n\n\n/* Icons\n----------------------------------*/\n.ui-icon {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tmargin-top: -.25em;\n\tposition: relative;\n\ttext-indent: -99999px;\n\toverflow: hidden;\n\tbackground-repeat: no-repeat;\n}\n\n.ui-widget-icon-block {\n\tleft: 50%;\n\tmargin-left: -8px;\n\tdisplay: block;\n}\n\n/* Misc visuals\n----------------------------------*/\n\n/* Overlays */\n.ui-widget-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n}\n.ui-accordion .ui-accordion-header {\n\tdisplay: block;\n\tcursor: pointer;\n\tposition: relative;\n\tmargin: 2px 0 0 0;\n\tpadding: .5em .5em .5em .7em;\n\tfont-size: 100%;\n}\n.ui-accordion .ui-accordion-content {\n\tpadding: 1em 2.2em;\n\tborder-top: 0;\n\toverflow: auto;\n}\n.ui-autocomplete {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tcursor: default;\n}\n.ui-menu {\n\tlist-style: none;\n\tpadding: 0;\n\tmargin: 0;\n\tdisplay: block;\n\toutline: 0;\n}\n.ui-menu .ui-menu {\n\tposition: absolute;\n}\n.ui-menu .ui-menu-item {\n\tmargin: 0;\n\tcursor: pointer;\n\t/* support: IE10, see #8844 */\n\tlist-style-image: url(\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\");\n}\n.ui-menu .ui-menu-item-wrapper {\n\tposition: relative;\n\tpadding: 3px 1em 3px .4em;\n}\n.ui-menu .ui-menu-divider {\n\tmargin: 5px 0;\n\theight: 0;\n\tfont-size: 0;\n\tline-height: 0;\n\tborder-width: 1px 0 0 0;\n}\n.ui-menu .ui-state-focus,\n.ui-menu .ui-state-active {\n\tmargin: -1px;\n}\n\n/* icon support */\n.ui-menu-icons {\n\tposition: relative;\n}\n.ui-menu-icons .ui-menu-item-wrapper {\n\tpadding-left: 2em;\n}\n\n/* left-aligned */\n.ui-menu .ui-icon {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: .2em;\n\tmargin: auto 0;\n}\n\n/* right-aligned */\n.ui-menu .ui-menu-icon {\n\tleft: auto;\n\tright: 0;\n}\n.ui-button {\n\tpadding: .4em 1em;\n\tdisplay: inline-block;\n\tposition: relative;\n\tline-height: normal;\n\tmargin-right: .1em;\n\tcursor: pointer;\n\tvertical-align: middle;\n\ttext-align: center;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\n\t/* Support: IE <= 11 */\n\toverflow: visible;\n}\n\n.ui-button,\n.ui-button:link,\n.ui-button:visited,\n.ui-button:hover,\n.ui-button:active {\n\ttext-decoration: none;\n}\n\n/* to make room for the icon, a width needs to be set here */\n.ui-button-icon-only {\n\twidth: 2em;\n\tbox-sizing: border-box;\n\ttext-indent: -9999px;\n\twhite-space: nowrap;\n}\n\n/* no icon support for input elements */\ninput.ui-button.ui-button-icon-only {\n\ttext-indent: 0;\n}\n\n/* button icon element(s) */\n.ui-button-icon-only .ui-icon {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\tmargin-top: -8px;\n\tmargin-left: -8px;\n}\n\n.ui-button.ui-icon-notext .ui-icon {\n\tpadding: 0;\n\twidth: 2.1em;\n\theight: 2.1em;\n\ttext-indent: -9999px;\n\twhite-space: nowrap;\n\n}\n\ninput.ui-button.ui-icon-notext .ui-icon {\n\twidth: auto;\n\theight: auto;\n\ttext-indent: 0;\n\twhite-space: normal;\n\tpadding: .4em 1em;\n}\n\n/* workarounds */\n/* Support: Firefox 5 - 40 */\ninput.ui-button::-moz-focus-inner,\nbutton.ui-button::-moz-focus-inner {\n\tborder: 0;\n\tpadding: 0;\n}\n.ui-controlgroup {\n\tvertical-align: middle;\n\tdisplay: inline-block;\n}\n.ui-controlgroup > .ui-controlgroup-item {\n\tfloat: left;\n\tmargin-left: 0;\n\tmargin-right: 0;\n}\n.ui-controlgroup > .ui-controlgroup-item:focus,\n.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {\n\tz-index: 9999;\n}\n.ui-controlgroup-vertical > .ui-controlgroup-item {\n\tdisplay: block;\n\tfloat: none;\n\twidth: 100%;\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n\ttext-align: left;\n}\n.ui-controlgroup-vertical .ui-controlgroup-item {\n\tbox-sizing: border-box;\n}\n.ui-controlgroup .ui-controlgroup-label {\n\tpadding: .4em 1em;\n}\n.ui-controlgroup .ui-controlgroup-label span {\n\tfont-size: 80%;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {\n\tborder-left: none;\n}\n.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {\n\tborder-top: none;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {\n\tborder-right: none;\n}\n.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {\n\tborder-bottom: none;\n}\n\n/* Spinner specific style fixes */\n.ui-controlgroup-vertical .ui-spinner-input {\n\n\t/* Support: IE8 only, Android < 4.4 only */\n\twidth: 75%;\n\twidth: calc( 100% - 2.4em );\n}\n.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {\n\tborder-top-style: solid;\n}\n\n.ui-checkboxradio-label .ui-icon-background {\n\tbox-shadow: inset 1px 1px 1px #ccc;\n\tborder-radius: .12em;\n\tborder: none;\n}\n.ui-checkboxradio-radio-label .ui-icon-background {\n\twidth: 16px;\n\theight: 16px;\n\tborder-radius: 1em;\n\toverflow: visible;\n\tborder: none;\n}\n.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,\n.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {\n\tbackground-image: none;\n\twidth: 8px;\n\theight: 8px;\n\tborder-width: 4px;\n\tborder-style: solid;\n}\n.ui-checkboxradio-disabled {\n\tpointer-events: none;\n}\n.ui-datepicker {\n\twidth: 17em;\n\tpadding: .2em .2em 0;\n\tdisplay: none;\n}\n.ui-datepicker .ui-datepicker-header {\n\tposition: relative;\n\tpadding: .2em 0;\n}\n.ui-datepicker .ui-datepicker-prev,\n.ui-datepicker .ui-datepicker-next {\n\tposition: absolute;\n\ttop: 2px;\n\twidth: 1.8em;\n\theight: 1.8em;\n}\n.ui-datepicker .ui-datepicker-prev-hover,\n.ui-datepicker .ui-datepicker-next-hover {\n\ttop: 1px;\n}\n.ui-datepicker .ui-datepicker-prev {\n\tleft: 2px;\n}\n.ui-datepicker .ui-datepicker-next {\n\tright: 2px;\n}\n.ui-datepicker .ui-datepicker-prev-hover {\n\tleft: 1px;\n}\n.ui-datepicker .ui-datepicker-next-hover {\n\tright: 1px;\n}\n.ui-datepicker .ui-datepicker-prev span,\n.ui-datepicker .ui-datepicker-next span {\n\tdisplay: block;\n\tposition: absolute;\n\tleft: 50%;\n\tmargin-left: -8px;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n.ui-datepicker .ui-datepicker-title {\n\tmargin: 0 2.3em;\n\tline-height: 1.8em;\n\ttext-align: center;\n}\n.ui-datepicker .ui-datepicker-title select {\n\tfont-size: 1em;\n\tmargin: 1px 0;\n}\n.ui-datepicker select.ui-datepicker-month,\n.ui-datepicker select.ui-datepicker-year {\n\twidth: 45%;\n}\n.ui-datepicker table {\n\twidth: 100%;\n\tfont-size: .9em;\n\tborder-collapse: collapse;\n\tmargin: 0 0 .4em;\n}\n.ui-datepicker th {\n\tpadding: .7em .3em;\n\ttext-align: center;\n\tfont-weight: bold;\n\tborder: 0;\n}\n.ui-datepicker td {\n\tborder: 0;\n\tpadding: 1px;\n}\n.ui-datepicker td span,\n.ui-datepicker td a {\n\tdisplay: block;\n\tpadding: .2em;\n\ttext-align: right;\n\ttext-decoration: none;\n}\n.ui-datepicker .ui-datepicker-buttonpane {\n\tbackground-image: none;\n\tmargin: .7em 0 0 0;\n\tpadding: 0 .2em;\n\tborder-left: 0;\n\tborder-right: 0;\n\tborder-bottom: 0;\n}\n.ui-datepicker .ui-datepicker-buttonpane button {\n\tfloat: right;\n\tmargin: .5em .2em .4em;\n\tcursor: pointer;\n\tpadding: .2em .6em .3em .6em;\n\twidth: auto;\n\toverflow: visible;\n}\n.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {\n\tfloat: left;\n}\n\n/* with multiple calendars */\n.ui-datepicker.ui-datepicker-multi {\n\twidth: auto;\n}\n.ui-datepicker-multi .ui-datepicker-group {\n\tfloat: left;\n}\n.ui-datepicker-multi .ui-datepicker-group table {\n\twidth: 95%;\n\tmargin: 0 auto .4em;\n}\n.ui-datepicker-multi-2 .ui-datepicker-group {\n\twidth: 50%;\n}\n.ui-datepicker-multi-3 .ui-datepicker-group {\n\twidth: 33.3%;\n}\n.ui-datepicker-multi-4 .ui-datepicker-group {\n\twidth: 25%;\n}\n.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-left-width: 0;\n}\n.ui-datepicker-multi .ui-datepicker-buttonpane {\n\tclear: left;\n}\n.ui-datepicker-row-break {\n\tclear: both;\n\twidth: 100%;\n\tfont-size: 0;\n}\n\n/* RTL support */\n.ui-datepicker-rtl {\n\tdirection: rtl;\n}\n.ui-datepicker-rtl .ui-datepicker-prev {\n\tright: 2px;\n\tleft: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-next {\n\tleft: 2px;\n\tright: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-prev:hover {\n\tright: 1px;\n\tleft: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-next:hover {\n\tleft: 1px;\n\tright: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane {\n\tclear: right;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane button {\n\tfloat: left;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,\n.ui-datepicker-rtl .ui-datepicker-group {\n\tfloat: right;\n}\n.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-right-width: 0;\n\tborder-left-width: 1px;\n}\n\n/* Icons */\n.ui-datepicker .ui-icon {\n\tdisplay: block;\n\ttext-indent: -99999px;\n\toverflow: hidden;\n\tbackground-repeat: no-repeat;\n\tleft: .5em;\n\ttop: .3em;\n}\n.ui-dialog {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tpadding: .2em;\n\toutline: 0;\n}\n.ui-dialog .ui-dialog-titlebar {\n\tpadding: .4em 1em;\n\tposition: relative;\n}\n.ui-dialog .ui-dialog-title {\n\tfloat: left;\n\tmargin: .1em 0;\n\twhite-space: nowrap;\n\twidth: 90%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n.ui-dialog .ui-dialog-titlebar-close {\n\tposition: absolute;\n\tright: .3em;\n\ttop: 50%;\n\twidth: 20px;\n\tmargin: -10px 0 0 0;\n\tpadding: 1px;\n\theight: 20px;\n}\n.ui-dialog .ui-dialog-content {\n\tposition: relative;\n\tborder: 0;\n\tpadding: .5em 1em;\n\tbackground: none;\n\toverflow: auto;\n}\n.ui-dialog .ui-dialog-buttonpane {\n\ttext-align: left;\n\tborder-width: 1px 0 0 0;\n\tbackground-image: none;\n\tmargin-top: .5em;\n\tpadding: .3em 1em .5em .4em;\n}\n.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {\n\tfloat: right;\n}\n.ui-dialog .ui-dialog-buttonpane button {\n\tmargin: .5em .4em .5em 0;\n\tcursor: pointer;\n}\n.ui-dialog .ui-resizable-n {\n\theight: 2px;\n\ttop: 0;\n}\n.ui-dialog .ui-resizable-e {\n\twidth: 2px;\n\tright: 0;\n}\n.ui-dialog .ui-resizable-s {\n\theight: 2px;\n\tbottom: 0;\n}\n.ui-dialog .ui-resizable-w {\n\twidth: 2px;\n\tleft: 0;\n}\n.ui-dialog .ui-resizable-se,\n.ui-dialog .ui-resizable-sw,\n.ui-dialog .ui-resizable-ne,\n.ui-dialog .ui-resizable-nw {\n\twidth: 7px;\n\theight: 7px;\n}\n.ui-dialog .ui-resizable-se {\n\tright: 0;\n\tbottom: 0;\n}\n.ui-dialog .ui-resizable-sw {\n\tleft: 0;\n\tbottom: 0;\n}\n.ui-dialog .ui-resizable-ne {\n\tright: 0;\n\ttop: 0;\n}\n.ui-dialog .ui-resizable-nw {\n\tleft: 0;\n\ttop: 0;\n}\n.ui-draggable .ui-dialog-titlebar {\n\tcursor: move;\n}\n.ui-draggable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-resizable {\n\tposition: relative;\n}\n.ui-resizable-handle {\n\tposition: absolute;\n\tfont-size: 0.1px;\n\tdisplay: block;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-resizable-disabled .ui-resizable-handle,\n.ui-resizable-autohide .ui-resizable-handle {\n\tdisplay: none;\n}\n.ui-resizable-n {\n\tcursor: n-resize;\n\theight: 7px;\n\twidth: 100%;\n\ttop: -5px;\n\tleft: 0;\n}\n.ui-resizable-s {\n\tcursor: s-resize;\n\theight: 7px;\n\twidth: 100%;\n\tbottom: -5px;\n\tleft: 0;\n}\n.ui-resizable-e {\n\tcursor: e-resize;\n\twidth: 7px;\n\tright: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n.ui-resizable-w {\n\tcursor: w-resize;\n\twidth: 7px;\n\tleft: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n.ui-resizable-se {\n\tcursor: se-resize;\n\twidth: 12px;\n\theight: 12px;\n\tright: 1px;\n\tbottom: 1px;\n}\n.ui-resizable-sw {\n\tcursor: sw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\tbottom: -5px;\n}\n.ui-resizable-nw {\n\tcursor: nw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\ttop: -5px;\n}\n.ui-resizable-ne {\n\tcursor: ne-resize;\n\twidth: 9px;\n\theight: 9px;\n\tright: -5px;\n\ttop: -5px;\n}\n.ui-progressbar {\n\theight: 2em;\n\ttext-align: left;\n\toverflow: hidden;\n}\n.ui-progressbar .ui-progressbar-value {\n\tmargin: -1px;\n\theight: 100%;\n}\n.ui-progressbar .ui-progressbar-overlay {\n\tbackground: url(\"data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==\");\n\theight: 100%;\n\tfilter: alpha(opacity=25); /* support: IE8 */\n\topacity: 0.25;\n}\n.ui-progressbar-indeterminate .ui-progressbar-value {\n\tbackground-image: none;\n}\n.ui-selectable {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-selectable-helper {\n\tposition: absolute;\n\tz-index: 100;\n\tborder: 1px dotted black;\n}\n.ui-selectmenu-menu {\n\tpadding: 0;\n\tmargin: 0;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tdisplay: none;\n}\n.ui-selectmenu-menu .ui-menu {\n\toverflow: auto;\n\toverflow-x: hidden;\n\tpadding-bottom: 1px;\n}\n.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {\n\tfont-size: 1em;\n\tfont-weight: bold;\n\tline-height: 1.5;\n\tpadding: 2px 0.4em;\n\tmargin: 0.5em 0 0 0;\n\theight: auto;\n\tborder: 0;\n}\n.ui-selectmenu-open {\n\tdisplay: block;\n}\n.ui-selectmenu-text {\n\tdisplay: block;\n\tmargin-right: 20px;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n.ui-selectmenu-button.ui-button {\n\ttext-align: left;\n\twhite-space: nowrap;\n\twidth: 14em;\n}\n.ui-selectmenu-icon.ui-icon {\n\tfloat: right;\n\tmargin-top: 0;\n}\n.ui-slider {\n\tposition: relative;\n\ttext-align: left;\n}\n.ui-slider .ui-slider-handle {\n\tposition: absolute;\n\tz-index: 2;\n\twidth: 1.2em;\n\theight: 1.2em;\n\tcursor: default;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-slider .ui-slider-range {\n\tposition: absolute;\n\tz-index: 1;\n\tfont-size: .7em;\n\tdisplay: block;\n\tborder: 0;\n\tbackground-position: 0 0;\n}\n\n/* support: IE8 - See #6727 */\n.ui-slider.ui-state-disabled .ui-slider-handle,\n.ui-slider.ui-state-disabled .ui-slider-range {\n\tfilter: inherit;\n}\n\n.ui-slider-horizontal {\n\theight: .8em;\n}\n.ui-slider-horizontal .ui-slider-handle {\n\ttop: -.3em;\n\tmargin-left: -.6em;\n}\n.ui-slider-horizontal .ui-slider-range {\n\ttop: 0;\n\theight: 100%;\n}\n.ui-slider-horizontal .ui-slider-range-min {\n\tleft: 0;\n}\n.ui-slider-horizontal .ui-slider-range-max {\n\tright: 0;\n}\n\n.ui-slider-vertical {\n\twidth: .8em;\n\theight: 100px;\n}\n.ui-slider-vertical .ui-slider-handle {\n\tleft: -.3em;\n\tmargin-left: 0;\n\tmargin-bottom: -.6em;\n}\n.ui-slider-vertical .ui-slider-range {\n\tleft: 0;\n\twidth: 100%;\n}\n.ui-slider-vertical .ui-slider-range-min {\n\tbottom: 0;\n}\n.ui-slider-vertical .ui-slider-range-max {\n\ttop: 0;\n}\n.ui-sortable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-spinner {\n\tposition: relative;\n\tdisplay: inline-block;\n\toverflow: hidden;\n\tpadding: 0;\n\tvertical-align: middle;\n}\n.ui-spinner-input {\n\tborder: none;\n\tbackground: none;\n\tcolor: inherit;\n\tpadding: .222em 0;\n\tmargin: .2em 0;\n\tvertical-align: middle;\n\tmargin-left: .4em;\n\tmargin-right: 2em;\n}\n.ui-spinner-button {\n\twidth: 1.6em;\n\theight: 50%;\n\tfont-size: .5em;\n\tpadding: 0;\n\tmargin: 0;\n\ttext-align: center;\n\tposition: absolute;\n\tcursor: default;\n\tdisplay: block;\n\toverflow: hidden;\n\tright: 0;\n}\n/* more specificity required here to override default borders */\n.ui-spinner a.ui-spinner-button {\n\tborder-top-style: none;\n\tborder-bottom-style: none;\n\tborder-right-style: none;\n}\n.ui-spinner-up {\n\ttop: 0;\n}\n.ui-spinner-down {\n\tbottom: 0;\n}\n.ui-tabs {\n\tposition: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as \"fixed\") */\n\tpadding: .2em;\n}\n.ui-tabs .ui-tabs-nav {\n\tmargin: 0;\n\tpadding: .2em .2em 0;\n}\n.ui-tabs .ui-tabs-nav li {\n\tlist-style: none;\n\tfloat: left;\n\tposition: relative;\n\ttop: 0;\n\tmargin: 1px .2em 0 0;\n\tborder-bottom-width: 0;\n\tpadding: 0;\n\twhite-space: nowrap;\n}\n.ui-tabs .ui-tabs-nav .ui-tabs-anchor {\n\tfloat: left;\n\tpadding: .5em 1em;\n\ttext-decoration: none;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-active {\n\tmargin-bottom: -1px;\n\tpadding-bottom: 1px;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,\n.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,\n.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {\n\tcursor: text;\n}\n.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {\n\tcursor: pointer;\n}\n.ui-tabs .ui-tabs-panel {\n\tdisplay: block;\n\tborder-width: 0;\n\tpadding: 1em 1.4em;\n\tbackground: none;\n}\n.ui-tooltip {\n\tpadding: 8px;\n\tposition: absolute;\n\tz-index: 9999;\n\tmax-width: 300px;\n}\nbody .ui-tooltip {\n\tborder-width: 2px;\n}\n\n/* Component containers\n----------------------------------*/\n.ui-widget {\n\tfont-family: Arial,Helvetica,sans-serif;\n\tfont-size: 1em;\n}\n.ui-widget .ui-widget {\n\tfont-size: 1em;\n}\n.ui-widget input,\n.ui-widget select,\n.ui-widget textarea,\n.ui-widget button {\n\tfont-family: Arial,Helvetica,sans-serif;\n\tfont-size: 1em;\n}\n.ui-widget.ui-widget-content {\n\tborder: 1px solid #c5c5c5;\n}\n.ui-widget-content {\n\tborder: 1px solid #dddddd;\n\tbackground: #ffffff;\n\tcolor: #333333;\n}\n.ui-widget-content a {\n\tcolor: #333333;\n}\n.ui-widget-header {\n\tborder: 1px solid #dddddd;\n\tbackground: #e9e9e9;\n\tcolor: #333333;\n\tfont-weight: bold;\n}\n.ui-widget-header a {\n\tcolor: #333333;\n}\n\n/* Interaction states\n----------------------------------*/\n.ui-state-default,\n.ui-widget-content .ui-state-default,\n.ui-widget-header .ui-state-default,\n.ui-button,\n\n/* We use html here because we need a greater specificity to make sure disabled\nworks properly when clicked or hovered */\nhtml .ui-button.ui-state-disabled:hover,\nhtml .ui-button.ui-state-disabled:active {\n\tborder: 1px solid #c5c5c5;\n\tbackground: #f6f6f6;\n\tfont-weight: normal;\n\tcolor: #454545;\n}\n.ui-state-default a,\n.ui-state-default a:link,\n.ui-state-default a:visited,\na.ui-button,\na:link.ui-button,\na:visited.ui-button,\n.ui-button {\n\tcolor: #454545;\n\ttext-decoration: none;\n}\n.ui-state-hover,\n.ui-widget-content .ui-state-hover,\n.ui-widget-header .ui-state-hover,\n.ui-state-focus,\n.ui-widget-content .ui-state-focus,\n.ui-widget-header .ui-state-focus,\n.ui-button:hover,\n.ui-button:focus {\n\tborder: 1px solid #cccccc;\n\tbackground: #ededed;\n\tfont-weight: normal;\n\tcolor: #2b2b2b;\n}\n.ui-state-hover a,\n.ui-state-hover a:hover,\n.ui-state-hover a:link,\n.ui-state-hover a:visited,\n.ui-state-focus a,\n.ui-state-focus a:hover,\n.ui-state-focus a:link,\n.ui-state-focus a:visited,\na.ui-button:hover,\na.ui-button:focus {\n\tcolor: #2b2b2b;\n\ttext-decoration: none;\n}\n\n.ui-visual-focus {\n\tbox-shadow: 0 0 3px 1px rgb(94, 158, 214);\n}\n.ui-state-active,\n.ui-widget-content .ui-state-active,\n.ui-widget-header .ui-state-active,\na.ui-button:active,\n.ui-button:active,\n.ui-button.ui-state-active:hover {\n\tborder: 1px solid #003eff;\n\tbackground: #007fff;\n\tfont-weight: normal;\n\tcolor: #ffffff;\n}\n.ui-icon-background,\n.ui-state-active .ui-icon-background {\n\tborder: #003eff;\n\tbackground-color: #ffffff;\n}\n.ui-state-active a,\n.ui-state-active a:link,\n.ui-state-active a:visited {\n\tcolor: #ffffff;\n\ttext-decoration: none;\n}\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-highlight,\n.ui-widget-content .ui-state-highlight,\n.ui-widget-header .ui-state-highlight {\n\tborder: 1px solid #dad55e;\n\tbackground: #fffa90;\n\tcolor: #777620;\n}\n.ui-state-checked {\n\tborder: 1px solid #dad55e;\n\tbackground: #fffa90;\n}\n.ui-state-highlight a,\n.ui-widget-content .ui-state-highlight a,\n.ui-widget-header .ui-state-highlight a {\n\tcolor: #777620;\n}\n.ui-state-error,\n.ui-widget-content .ui-state-error,\n.ui-widget-header .ui-state-error {\n\tborder: 1px solid #f1a899;\n\tbackground: #fddfdf;\n\tcolor: #5f3f3f;\n}\n.ui-state-error a,\n.ui-widget-content .ui-state-error a,\n.ui-widget-header .ui-state-error a {\n\tcolor: #5f3f3f;\n}\n.ui-state-error-text,\n.ui-widget-content .ui-state-error-text,\n.ui-widget-header .ui-state-error-text {\n\tcolor: #5f3f3f;\n}\n.ui-priority-primary,\n.ui-widget-content .ui-priority-primary,\n.ui-widget-header .ui-priority-primary {\n\tfont-weight: bold;\n}\n.ui-priority-secondary,\n.ui-widget-content .ui-priority-secondary,\n.ui-widget-header .ui-priority-secondary {\n\topacity: .7;\n\tfilter:Alpha(Opacity=70); /* support: IE8 */\n\tfont-weight: normal;\n}\n.ui-state-disabled,\n.ui-widget-content .ui-state-disabled,\n.ui-widget-header .ui-state-disabled {\n\topacity: .35;\n\tfilter:Alpha(Opacity=35); /* support: IE8 */\n\tbackground-image: none;\n}\n.ui-state-disabled .ui-icon {\n\tfilter:Alpha(Opacity=35); /* support: IE8 - See #6059 */\n}\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon {\n\twidth: 16px;\n\theight: 16px;\n}\n.ui-icon,\n.ui-widget-content .ui-icon {\n\tbackground-image: url(\"images/ui-icons_444444_256x240.png\");\n}\n.ui-widget-header .ui-icon {\n\tbackground-image: url(\"images/ui-icons_444444_256x240.png\");\n}\n.ui-state-hover .ui-icon,\n.ui-state-focus .ui-icon,\n.ui-button:hover .ui-icon,\n.ui-button:focus .ui-icon {\n\tbackground-image: url(\"images/ui-icons_555555_256x240.png\");\n}\n.ui-state-active .ui-icon,\n.ui-button:active .ui-icon {\n\tbackground-image: url(\"images/ui-icons_ffffff_256x240.png\");\n}\n.ui-state-highlight .ui-icon,\n.ui-button .ui-state-highlight.ui-icon {\n\tbackground-image: url(\"images/ui-icons_777620_256x240.png\");\n}\n.ui-state-error .ui-icon,\n.ui-state-error-text .ui-icon {\n\tbackground-image: url(\"images/ui-icons_cc0000_256x240.png\");\n}\n.ui-button .ui-icon {\n\tbackground-image: url(\"images/ui-icons_777777_256x240.png\");\n}\n\n/* positioning */\n.ui-icon-blank { background-position: 16px 16px; }\n.ui-icon-caret-1-n { background-position: 0 0; }\n.ui-icon-caret-1-ne { background-position: -16px 0; }\n.ui-icon-caret-1-e { background-position: -32px 0; }\n.ui-icon-caret-1-se { background-position: -48px 0; }\n.ui-icon-caret-1-s { background-position: -65px 0; }\n.ui-icon-caret-1-sw { background-position: -80px 0; }\n.ui-icon-caret-1-w { background-position: -96px 0; }\n.ui-icon-caret-1-nw { background-position: -112px 0; }\n.ui-icon-caret-2-n-s { background-position: -128px 0; }\n.ui-icon-caret-2-e-w { background-position: -144px 0; }\n.ui-icon-triangle-1-n { background-position: 0 -16px; }\n.ui-icon-triangle-1-ne { background-position: -16px -16px; }\n.ui-icon-triangle-1-e { background-position: -32px -16px; }\n.ui-icon-triangle-1-se { background-position: -48px -16px; }\n.ui-icon-triangle-1-s { background-position: -65px -16px; }\n.ui-icon-triangle-1-sw { background-position: -80px -16px; }\n.ui-icon-triangle-1-w { background-position: -96px -16px; }\n.ui-icon-triangle-1-nw { background-position: -112px -16px; }\n.ui-icon-triangle-2-n-s { background-position: -128px -16px; }\n.ui-icon-triangle-2-e-w { background-position: -144px -16px; }\n.ui-icon-arrow-1-n { background-position: 0 -32px; }\n.ui-icon-arrow-1-ne { background-position: -16px -32px; }\n.ui-icon-arrow-1-e { background-position: -32px -32px; }\n.ui-icon-arrow-1-se { background-position: -48px -32px; }\n.ui-icon-arrow-1-s { background-position: -65px -32px; }\n.ui-icon-arrow-1-sw { background-position: -80px -32px; }\n.ui-icon-arrow-1-w { background-position: -96px -32px; }\n.ui-icon-arrow-1-nw { background-position: -112px -32px; }\n.ui-icon-arrow-2-n-s { background-position: -128px -32px; }\n.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }\n.ui-icon-arrow-2-e-w { background-position: -160px -32px; }\n.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }\n.ui-icon-arrowstop-1-n { background-position: -192px -32px; }\n.ui-icon-arrowstop-1-e { background-position: -208px -32px; }\n.ui-icon-arrowstop-1-s { background-position: -224px -32px; }\n.ui-icon-arrowstop-1-w { background-position: -240px -32px; }\n.ui-icon-arrowthick-1-n { background-position: 1px -48px; }\n.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }\n.ui-icon-arrowthick-1-e { background-position: -32px -48px; }\n.ui-icon-arrowthick-1-se { background-position: -48px -48px; }\n.ui-icon-arrowthick-1-s { background-position: -64px -48px; }\n.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }\n.ui-icon-arrowthick-1-w { background-position: -96px -48px; }\n.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }\n.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }\n.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }\n.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }\n.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }\n.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }\n.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }\n.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }\n.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }\n.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }\n.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }\n.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }\n.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }\n.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }\n.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }\n.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }\n.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }\n.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }\n.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }\n.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }\n.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }\n.ui-icon-arrow-4 { background-position: 0 -80px; }\n.ui-icon-arrow-4-diag { background-position: -16px -80px; }\n.ui-icon-extlink { background-position: -32px -80px; }\n.ui-icon-newwin { background-position: -48px -80px; }\n.ui-icon-refresh { background-position: -64px -80px; }\n.ui-icon-shuffle { background-position: -80px -80px; }\n.ui-icon-transfer-e-w { background-position: -96px -80px; }\n.ui-icon-transferthick-e-w { background-position: -112px -80px; }\n.ui-icon-folder-collapsed { background-position: 0 -96px; }\n.ui-icon-folder-open { background-position: -16px -96px; }\n.ui-icon-document { background-position: -32px -96px; }\n.ui-icon-document-b { background-position: -48px -96px; }\n.ui-icon-note { background-position: -64px -96px; }\n.ui-icon-mail-closed { background-position: -80px -96px; }\n.ui-icon-mail-open { background-position: -96px -96px; }\n.ui-icon-suitcase { background-position: -112px -96px; }\n.ui-icon-comment { background-position: -128px -96px; }\n.ui-icon-person { background-position: -144px -96px; }\n.ui-icon-print { background-position: -160px -96px; }\n.ui-icon-trash { background-position: -176px -96px; }\n.ui-icon-locked { background-position: -192px -96px; }\n.ui-icon-unlocked { background-position: -208px -96px; }\n.ui-icon-bookmark { background-position: -224px -96px; }\n.ui-icon-tag { background-position: -240px -96px; }\n.ui-icon-home { background-position: 0 -112px; }\n.ui-icon-flag { background-position: -16px -112px; }\n.ui-icon-calendar { background-position: -32px -112px; }\n.ui-icon-cart { background-position: -48px -112px; }\n.ui-icon-pencil { background-position: -64px -112px; }\n.ui-icon-clock { background-position: -80px -112px; }\n.ui-icon-disk { background-position: -96px -112px; }\n.ui-icon-calculator { background-position: -112px -112px; }\n.ui-icon-zoomin { background-position: -128px -112px; }\n.ui-icon-zoomout { background-position: -144px -112px; }\n.ui-icon-search { background-position: -160px -112px; }\n.ui-icon-wrench { background-position: -176px -112px; }\n.ui-icon-gear { background-position: -192px -112px; }\n.ui-icon-heart { background-position: -208px -112px; }\n.ui-icon-star { background-position: -224px -112px; }\n.ui-icon-link { background-position: -240px -112px; }\n.ui-icon-cancel { background-position: 0 -128px; }\n.ui-icon-plus { background-position: -16px -128px; }\n.ui-icon-plusthick { background-position: -32px -128px; }\n.ui-icon-minus { background-position: -48px -128px; }\n.ui-icon-minusthick { background-position: -64px -128px; }\n.ui-icon-close { background-position: -80px -128px; }\n.ui-icon-closethick { background-position: -96px -128px; }\n.ui-icon-key { background-position: -112px -128px; }\n.ui-icon-lightbulb { background-position: -128px -128px; }\n.ui-icon-scissors { background-position: -144px -128px; }\n.ui-icon-clipboard { background-position: -160px -128px; }\n.ui-icon-copy { background-position: -176px -128px; }\n.ui-icon-contact { background-position: -192px -128px; }\n.ui-icon-image { background-position: -208px -128px; }\n.ui-icon-video { background-position: -224px -128px; }\n.ui-icon-script { background-position: -240px -128px; }\n.ui-icon-alert { background-position: 0 -144px; }\n.ui-icon-info { background-position: -16px -144px; }\n.ui-icon-notice { background-position: -32px -144px; }\n.ui-icon-help { background-position: -48px -144px; }\n.ui-icon-check { background-position: -64px -144px; }\n.ui-icon-bullet { background-position: -80px -144px; }\n.ui-icon-radio-on { background-position: -96px -144px; }\n.ui-icon-radio-off { background-position: -112px -144px; }\n.ui-icon-pin-w { background-position: -128px -144px; }\n.ui-icon-pin-s { background-position: -144px -144px; }\n.ui-icon-play { background-position: 0 -160px; }\n.ui-icon-pause { background-position: -16px -160px; }\n.ui-icon-seek-next { background-position: -32px -160px; }\n.ui-icon-seek-prev { background-position: -48px -160px; }\n.ui-icon-seek-end { background-position: -64px -160px; }\n.ui-icon-seek-start { background-position: -80px -160px; }\n/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */\n.ui-icon-seek-first { background-position: -80px -160px; }\n.ui-icon-stop { background-position: -96px -160px; }\n.ui-icon-eject { background-position: -112px -160px; }\n.ui-icon-volume-off { background-position: -128px -160px; }\n.ui-icon-volume-on { background-position: -144px -160px; }\n.ui-icon-power { background-position: 0 -176px; }\n.ui-icon-signal-diag { background-position: -16px -176px; }\n.ui-icon-signal { background-position: -32px -176px; }\n.ui-icon-battery-0 { background-position: -48px -176px; }\n.ui-icon-battery-1 { background-position: -64px -176px; }\n.ui-icon-battery-2 { background-position: -80px -176px; }\n.ui-icon-battery-3 { background-position: -96px -176px; }\n.ui-icon-circle-plus { background-position: 0 -192px; }\n.ui-icon-circle-minus { background-position: -16px -192px; }\n.ui-icon-circle-close { background-position: -32px -192px; }\n.ui-icon-circle-triangle-e { background-position: -48px -192px; }\n.ui-icon-circle-triangle-s { background-position: -64px -192px; }\n.ui-icon-circle-triangle-w { background-position: -80px -192px; }\n.ui-icon-circle-triangle-n { background-position: -96px -192px; }\n.ui-icon-circle-arrow-e { background-position: -112px -192px; }\n.ui-icon-circle-arrow-s { background-position: -128px -192px; }\n.ui-icon-circle-arrow-w { background-position: -144px -192px; }\n.ui-icon-circle-arrow-n { background-position: -160px -192px; }\n.ui-icon-circle-zoomin { background-position: -176px -192px; }\n.ui-icon-circle-zoomout { background-position: -192px -192px; }\n.ui-icon-circle-check { background-position: -208px -192px; }\n.ui-icon-circlesmall-plus { background-position: 0 -208px; }\n.ui-icon-circlesmall-minus { background-position: -16px -208px; }\n.ui-icon-circlesmall-close { background-position: -32px -208px; }\n.ui-icon-squaresmall-plus { background-position: -48px -208px; }\n.ui-icon-squaresmall-minus { background-position: -64px -208px; }\n.ui-icon-squaresmall-close { background-position: -80px -208px; }\n.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }\n.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }\n.ui-icon-grip-solid-vertical { background-position: -32px -224px; }\n.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }\n.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }\n.ui-icon-grip-diagonal-se { background-position: -80px -224px; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Corner radius */\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-left,\n.ui-corner-tl {\n\tborder-top-left-radius: 3px;\n}\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-right,\n.ui-corner-tr {\n\tborder-top-right-radius: 3px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-left,\n.ui-corner-bl {\n\tborder-bottom-left-radius: 3px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-right,\n.ui-corner-br {\n\tborder-bottom-right-radius: 3px;\n}\n\n/* Overlays */\n.ui-widget-overlay {\n\tbackground: #aaaaaa;\n\topacity: .003;\n\tfilter: Alpha(Opacity=.3); /* support: IE8 */\n}\n.ui-widget-shadow {\n\t-webkit-box-shadow: 0px 0px 5px #666666;\n\tbox-shadow: 0px 0px 5px #666666;\n}\n"
  },
  {
    "path": "example/pages/include/jquery_ui/jquery-ui.js",
    "content": "/*! jQuery UI - v1.12.1 - 2018-03-25\n* http://jqueryui.com\n* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/selectmenu.js, widgets/slider.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js\n* Copyright jQuery Foundation and other contributors; Licensed MIT */\n\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([ \"jquery\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n$.ui = $.ui || {};\n\nvar version = $.ui.version = \"1.12.1\";\n\n\n/*!\n * jQuery UI Widget 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Widget\n//>>group: Core\n//>>description: Provides a factory for creating stateful widgets with a common API.\n//>>docs: http://api.jqueryui.com/jQuery.widget/\n//>>demos: http://jqueryui.com/widget/\n\n\n\nvar widgetUuid = 0;\nvar widgetSlice = Array.prototype.slice;\n\n$.cleanData = ( function( orig ) {\n\treturn function( elems ) {\n\t\tvar events, elem, i;\n\t\tfor ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\ttry {\n\n\t\t\t\t// Only trigger remove when necessary to save time\n\t\t\t\tevents = $._data( elem, \"events\" );\n\t\t\t\tif ( events && events.remove ) {\n\t\t\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t\t\t}\n\n\t\t\t// Http://bugs.jquery.com/ticket/8235\n\t\t\t} catch ( e ) {}\n\t\t}\n\t\torig( elems );\n\t};\n} )( $.cleanData );\n\n$.widget = function( name, base, prototype ) {\n\tvar existingConstructor, constructor, basePrototype;\n\n\t// ProxiedPrototype allows the provided prototype to remain unmodified\n\t// so that it can be used as a mixin for multiple widgets (#8876)\n\tvar proxiedPrototype = {};\n\n\tvar namespace = name.split( \".\" )[ 0 ];\n\tname = name.split( \".\" )[ 1 ];\n\tvar fullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\tif ( $.isArray( prototype ) ) {\n\t\tprototype = $.extend.apply( null, [ {} ].concat( prototype ) );\n\t}\n\n\t// Create selector for plugin\n\t$.expr[ \":\" ][ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\n\t\t// Allow instantiation without \"new\" keyword\n\t\tif ( !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t// Allow instantiation without initializing for simple inheritance\n\t\t// must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\n\t// Extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\n\t\t// Copy the object used to create the prototype in case we need to\n\t\t// redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\n\t\t// Track widgets that inherit from this widget in case this widget is\n\t\t// redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t} );\n\n\tbasePrototype = new base();\n\n\t// We need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( !$.isFunction( value ) ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = ( function() {\n\t\t\tfunction _super() {\n\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t}\n\n\t\t\tfunction _superApply( args ) {\n\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t}\n\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super;\n\t\t\t\tvar __superApply = this._superApply;\n\t\t\t\tvar returnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t} )();\n\t} );\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\n\t\t// TODO: remove support for widgetEventPrefix\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\n\t\t// don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t} );\n\n\t// If this widget is being redefined then we need to find all widgets that\n\t// are inheriting from it and redefine all of them so that they inherit from\n\t// the new version of this widget. We're essentially trying to replace one\n\t// level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t// Redefine the child widget using the same prototype that was\n\t\t\t// originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor,\n\t\t\t\tchild._proto );\n\t\t} );\n\n\t\t// Remove the list of existing child constructors from the old constructor\n\t\t// so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n\n\treturn constructor;\n};\n\n$.widget.extend = function( target ) {\n\tvar input = widgetSlice.call( arguments, 1 );\n\tvar inputIndex = 0;\n\tvar inputLength = input.length;\n\tvar key;\n\tvar value;\n\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\n\n\t\t\t\t// Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\n\t\t\t\t// Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\";\n\t\tvar args = widgetSlice.call( arguments, 1 );\n\t\tvar returnValue = this;\n\n\t\tif ( isMethodCall ) {\n\n\t\t\t// If this is an empty collection, we need to have the instance method\n\t\t\t// return undefined instead of the jQuery instance\n\t\t\tif ( !this.length && options === \"instance\" ) {\n\t\t\t\treturnValue = undefined;\n\t\t\t} else {\n\t\t\t\tthis.each( function() {\n\t\t\t\t\tvar methodValue;\n\t\t\t\t\tvar instance = $.data( this, fullName );\n\n\t\t\t\t\tif ( options === \"instance\" ) {\n\t\t\t\t\t\treturnValue = instance;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !instance ) {\n\t\t\t\t\t\treturn $.error( \"cannot call methods on \" + name +\n\t\t\t\t\t\t\t\" prior to initialization; \" +\n\t\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name +\n\t\t\t\t\t\t\t\" widget instance\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\n\t\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\t\tmethodValue;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// Allow multiple hashes to be passed on init\n\t\t\tif ( args.length ) {\n\t\t\t\toptions = $.widget.extend.apply( null, [ options ].concat( args ) );\n\t\t\t}\n\n\t\t\tthis.each( function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} );\n\t\t\t\t\tif ( instance._init ) {\n\t\t\t\t\t\tinstance._init();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( /* options, element */ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"<div>\",\n\n\toptions: {\n\t\tclasses: {},\n\t\tdisabled: false,\n\n\t\t// Callbacks\n\t\tcreate: null\n\t},\n\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = widgetUuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\t\tthis.classesElementLookup = {};\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t\tthis.document = $( element.style ?\n\n\t\t\t\t// Element within the document\n\t\t\t\telement.ownerDocument :\n\n\t\t\t\t// Element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );\n\t\t}\n\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis._create();\n\n\t\tif ( this.options.disabled ) {\n\t\t\tthis._setOptionDisabled( this.options.disabled );\n\t\t}\n\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\n\t_getCreateOptions: function() {\n\t\treturn {};\n\t},\n\n\t_getCreateEventData: $.noop,\n\n\t_create: $.noop,\n\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tvar that = this;\n\n\t\tthis._destroy();\n\t\t$.each( this.classesElementLookup, function( key, value ) {\n\t\t\tthat._removeClass( value, key );\n\t\t} );\n\n\t\t// We can probably remove the unbind calls in 2.0\n\t\t// all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeData( this.widgetFullName );\n\t\tthis.widget()\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" );\n\n\t\t// Clean up events and states\n\t\tthis.bindings.off( this.eventNamespace );\n\t},\n\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key;\n\t\tvar parts;\n\t\tvar curOption;\n\t\tvar i;\n\n\t\tif ( arguments.length === 0 ) {\n\n\t\t\t// Don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\n\t\t\t// Handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"classes\" ) {\n\t\t\tthis._setOptionClasses( value );\n\t\t}\n\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._setOptionDisabled( value );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOptionClasses: function( value ) {\n\t\tvar classKey, elements, currentElements;\n\n\t\tfor ( classKey in value ) {\n\t\t\tcurrentElements = this.classesElementLookup[ classKey ];\n\t\t\tif ( value[ classKey ] === this.options.classes[ classKey ] ||\n\t\t\t\t\t!currentElements ||\n\t\t\t\t\t!currentElements.length ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// We are doing this to create a new jQuery object because the _removeClass() call\n\t\t\t// on the next line is going to destroy the reference to the current elements being\n\t\t\t// tracked. We need to save a copy of this collection so that we can add the new classes\n\t\t\t// below.\n\t\t\telements = $( currentElements.get() );\n\t\t\tthis._removeClass( currentElements, classKey );\n\n\t\t\t// We don't use _addClass() here, because that uses this.options.classes\n\t\t\t// for generating the string of classes. We want to use the value passed in from\n\t\t\t// _setOption(), this is the new value of the classes option which was passed to\n\t\t\t// _setOption(). We pass this value directly to _classes().\n\t\t\telements.addClass( this._classes( {\n\t\t\t\telement: elements,\n\t\t\t\tkeys: classKey,\n\t\t\t\tclasses: value,\n\t\t\t\tadd: true\n\t\t\t} ) );\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._toggleClass( this.widget(), this.widgetFullName + \"-disabled\", null, !!value );\n\n\t\t// If the widget is becoming disabled, then nothing is interactive\n\t\tif ( value ) {\n\t\t\tthis._removeClass( this.hoverable, null, \"ui-state-hover\" );\n\t\t\tthis._removeClass( this.focusable, null, \"ui-state-focus\" );\n\t\t}\n\t},\n\n\tenable: function() {\n\t\treturn this._setOptions( { disabled: false } );\n\t},\n\n\tdisable: function() {\n\t\treturn this._setOptions( { disabled: true } );\n\t},\n\n\t_classes: function( options ) {\n\t\tvar full = [];\n\t\tvar that = this;\n\n\t\toptions = $.extend( {\n\t\t\telement: this.element,\n\t\t\tclasses: this.options.classes || {}\n\t\t}, options );\n\n\t\tfunction processClassString( classes, checkOption ) {\n\t\t\tvar current, i;\n\t\t\tfor ( i = 0; i < classes.length; i++ ) {\n\t\t\t\tcurrent = that.classesElementLookup[ classes[ i ] ] || $();\n\t\t\t\tif ( options.add ) {\n\t\t\t\t\tcurrent = $( $.unique( current.get().concat( options.element.get() ) ) );\n\t\t\t\t} else {\n\t\t\t\t\tcurrent = $( current.not( options.element ).get() );\n\t\t\t\t}\n\t\t\t\tthat.classesElementLookup[ classes[ i ] ] = current;\n\t\t\t\tfull.push( classes[ i ] );\n\t\t\t\tif ( checkOption && options.classes[ classes[ i ] ] ) {\n\t\t\t\t\tfull.push( options.classes[ classes[ i ] ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._on( options.element, {\n\t\t\t\"remove\": \"_untrackClassesElement\"\n\t\t} );\n\n\t\tif ( options.keys ) {\n\t\t\tprocessClassString( options.keys.match( /\\S+/g ) || [], true );\n\t\t}\n\t\tif ( options.extra ) {\n\t\t\tprocessClassString( options.extra.match( /\\S+/g ) || [] );\n\t\t}\n\n\t\treturn full.join( \" \" );\n\t},\n\n\t_untrackClassesElement: function( event ) {\n\t\tvar that = this;\n\t\t$.each( that.classesElementLookup, function( key, value ) {\n\t\t\tif ( $.inArray( event.target, value ) !== -1 ) {\n\t\t\t\tthat.classesElementLookup[ key ] = $( value.not( event.target ).get() );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_removeClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, false );\n\t},\n\n\t_addClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, true );\n\t},\n\n\t_toggleClass: function( element, keys, extra, add ) {\n\t\tadd = ( typeof add === \"boolean\" ) ? add : extra;\n\t\tvar shift = ( typeof element === \"string\" || element === null ),\n\t\t\toptions = {\n\t\t\t\textra: shift ? keys : extra,\n\t\t\t\tkeys: shift ? element : keys,\n\t\t\t\telement: shift ? this.element : element,\n\t\t\t\tadd: add\n\t\t\t};\n\t\toptions.element.toggleClass( this._classes( options ), add );\n\t\treturn this;\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement;\n\t\tvar instance = this;\n\n\t\t// No suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t// No element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\n\t\t\t\t// Allow widgets to customize the disabled handling\n\t\t\t\t// - disabled as an array instead of boolean\n\t\t\t\t// - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t// Copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( /^([\\w:-]*)\\s*(.*)$/ );\n\t\t\tvar eventName = match[ 1 ] + instance.eventNamespace;\n\t\t\tvar selector = match[ 2 ];\n\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.on( eventName, selector, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.on( eventName, handlerProxy );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = ( eventName || \"\" ).split( \" \" ).join( this.eventNamespace + \" \" ) +\n\t\t\tthis.eventNamespace;\n\t\telement.off( eventName ).off( eventName );\n\n\t\t// Clear the stack to avoid memory leaks (#10056)\n\t\tthis.bindings = $( this.bindings.not( element ).get() );\n\t\tthis.focusable = $( this.focusable.not( element ).get() );\n\t\tthis.hoverable = $( this.hoverable.not( element ).get() );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig;\n\t\tvar callback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\n\t\t// The original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// Copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( $.isFunction( callback ) &&\n\t\t\tcallback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\n\t\tvar hasOptions;\n\t\tvar effectName = !options ?\n\t\t\tmethod :\n\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\tdefaultEffect :\n\t\t\t\toptions.effect || defaultEffect;\n\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t}\n\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue( function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t} );\n\t\t}\n\t};\n} );\n\nvar widget = $.widget;\n\n\n/*!\n * jQuery UI Position 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/position/\n */\n\n//>>label: Position\n//>>group: Core\n//>>description: Positions elements relative to other elements.\n//>>docs: http://api.jqueryui.com/position/\n//>>demos: http://jqueryui.com/position/\n\n\n( function() {\nvar cachedScrollbarWidth,\n\tmax = Math.max,\n\tabs = Math.abs,\n\trhorizontal = /left|center|right/,\n\trvertical = /top|center|bottom/,\n\troffset = /[\\+\\-]\\d+(\\.[\\d]+)?%?/,\n\trposition = /^\\w+/,\n\trpercent = /%$/,\n\t_position = $.fn.position;\n\nfunction getOffsets( offsets, width, height ) {\n\treturn [\n\t\tparseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),\n\t\tparseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )\n\t];\n}\n\nfunction parseCss( element, property ) {\n\treturn parseInt( $.css( element, property ), 10 ) || 0;\n}\n\nfunction getDimensions( elem ) {\n\tvar raw = elem[ 0 ];\n\tif ( raw.nodeType === 9 ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: 0, left: 0 }\n\t\t};\n\t}\n\tif ( $.isWindow( raw ) ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: elem.scrollTop(), left: elem.scrollLeft() }\n\t\t};\n\t}\n\tif ( raw.preventDefault ) {\n\t\treturn {\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\toffset: { top: raw.pageY, left: raw.pageX }\n\t\t};\n\t}\n\treturn {\n\t\twidth: elem.outerWidth(),\n\t\theight: elem.outerHeight(),\n\t\toffset: elem.offset()\n\t};\n}\n\n$.position = {\n\tscrollbarWidth: function() {\n\t\tif ( cachedScrollbarWidth !== undefined ) {\n\t\t\treturn cachedScrollbarWidth;\n\t\t}\n\t\tvar w1, w2,\n\t\t\tdiv = $( \"<div \" +\n\t\t\t\t\"style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'>\" +\n\t\t\t\t\"<div style='height:100px;width:auto;'></div></div>\" ),\n\t\t\tinnerDiv = div.children()[ 0 ];\n\n\t\t$( \"body\" ).append( div );\n\t\tw1 = innerDiv.offsetWidth;\n\t\tdiv.css( \"overflow\", \"scroll\" );\n\n\t\tw2 = innerDiv.offsetWidth;\n\n\t\tif ( w1 === w2 ) {\n\t\t\tw2 = div[ 0 ].clientWidth;\n\t\t}\n\n\t\tdiv.remove();\n\n\t\treturn ( cachedScrollbarWidth = w1 - w2 );\n\t},\n\tgetScrollInfo: function( within ) {\n\t\tvar overflowX = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-x\" ),\n\t\t\toverflowY = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-y\" ),\n\t\t\thasOverflowX = overflowX === \"scroll\" ||\n\t\t\t\t( overflowX === \"auto\" && within.width < within.element[ 0 ].scrollWidth ),\n\t\t\thasOverflowY = overflowY === \"scroll\" ||\n\t\t\t\t( overflowY === \"auto\" && within.height < within.element[ 0 ].scrollHeight );\n\t\treturn {\n\t\t\twidth: hasOverflowY ? $.position.scrollbarWidth() : 0,\n\t\t\theight: hasOverflowX ? $.position.scrollbarWidth() : 0\n\t\t};\n\t},\n\tgetWithinInfo: function( element ) {\n\t\tvar withinElement = $( element || window ),\n\t\t\tisWindow = $.isWindow( withinElement[ 0 ] ),\n\t\t\tisDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,\n\t\t\thasOffset = !isWindow && !isDocument;\n\t\treturn {\n\t\t\telement: withinElement,\n\t\t\tisWindow: isWindow,\n\t\t\tisDocument: isDocument,\n\t\t\toffset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },\n\t\t\tscrollLeft: withinElement.scrollLeft(),\n\t\t\tscrollTop: withinElement.scrollTop(),\n\t\t\twidth: withinElement.outerWidth(),\n\t\t\theight: withinElement.outerHeight()\n\t\t};\n\t}\n};\n\n$.fn.position = function( options ) {\n\tif ( !options || !options.of ) {\n\t\treturn _position.apply( this, arguments );\n\t}\n\n\t// Make a copy, we don't want to modify arguments\n\toptions = $.extend( {}, options );\n\n\tvar atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,\n\t\ttarget = $( options.of ),\n\t\twithin = $.position.getWithinInfo( options.within ),\n\t\tscrollInfo = $.position.getScrollInfo( within ),\n\t\tcollision = ( options.collision || \"flip\" ).split( \" \" ),\n\t\toffsets = {};\n\n\tdimensions = getDimensions( target );\n\tif ( target[ 0 ].preventDefault ) {\n\n\t\t// Force left top to allow flipping\n\t\toptions.at = \"left top\";\n\t}\n\ttargetWidth = dimensions.width;\n\ttargetHeight = dimensions.height;\n\ttargetOffset = dimensions.offset;\n\n\t// Clone to reuse original targetOffset later\n\tbasePosition = $.extend( {}, targetOffset );\n\n\t// Force my and at to have valid horizontal and vertical positions\n\t// if a value is missing or invalid, it will be converted to center\n\t$.each( [ \"my\", \"at\" ], function() {\n\t\tvar pos = ( options[ this ] || \"\" ).split( \" \" ),\n\t\t\thorizontalOffset,\n\t\t\tverticalOffset;\n\n\t\tif ( pos.length === 1 ) {\n\t\t\tpos = rhorizontal.test( pos[ 0 ] ) ?\n\t\t\t\tpos.concat( [ \"center\" ] ) :\n\t\t\t\trvertical.test( pos[ 0 ] ) ?\n\t\t\t\t\t[ \"center\" ].concat( pos ) :\n\t\t\t\t\t[ \"center\", \"center\" ];\n\t\t}\n\t\tpos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : \"center\";\n\t\tpos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : \"center\";\n\n\t\t// Calculate offsets\n\t\thorizontalOffset = roffset.exec( pos[ 0 ] );\n\t\tverticalOffset = roffset.exec( pos[ 1 ] );\n\t\toffsets[ this ] = [\n\t\t\thorizontalOffset ? horizontalOffset[ 0 ] : 0,\n\t\t\tverticalOffset ? verticalOffset[ 0 ] : 0\n\t\t];\n\n\t\t// Reduce to just the positions without the offsets\n\t\toptions[ this ] = [\n\t\t\trposition.exec( pos[ 0 ] )[ 0 ],\n\t\t\trposition.exec( pos[ 1 ] )[ 0 ]\n\t\t];\n\t} );\n\n\t// Normalize collision option\n\tif ( collision.length === 1 ) {\n\t\tcollision[ 1 ] = collision[ 0 ];\n\t}\n\n\tif ( options.at[ 0 ] === \"right\" ) {\n\t\tbasePosition.left += targetWidth;\n\t} else if ( options.at[ 0 ] === \"center\" ) {\n\t\tbasePosition.left += targetWidth / 2;\n\t}\n\n\tif ( options.at[ 1 ] === \"bottom\" ) {\n\t\tbasePosition.top += targetHeight;\n\t} else if ( options.at[ 1 ] === \"center\" ) {\n\t\tbasePosition.top += targetHeight / 2;\n\t}\n\n\tatOffset = getOffsets( offsets.at, targetWidth, targetHeight );\n\tbasePosition.left += atOffset[ 0 ];\n\tbasePosition.top += atOffset[ 1 ];\n\n\treturn this.each( function() {\n\t\tvar collisionPosition, using,\n\t\t\telem = $( this ),\n\t\t\telemWidth = elem.outerWidth(),\n\t\t\telemHeight = elem.outerHeight(),\n\t\t\tmarginLeft = parseCss( this, \"marginLeft\" ),\n\t\t\tmarginTop = parseCss( this, \"marginTop\" ),\n\t\t\tcollisionWidth = elemWidth + marginLeft + parseCss( this, \"marginRight\" ) +\n\t\t\t\tscrollInfo.width,\n\t\t\tcollisionHeight = elemHeight + marginTop + parseCss( this, \"marginBottom\" ) +\n\t\t\t\tscrollInfo.height,\n\t\t\tposition = $.extend( {}, basePosition ),\n\t\t\tmyOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );\n\n\t\tif ( options.my[ 0 ] === \"right\" ) {\n\t\t\tposition.left -= elemWidth;\n\t\t} else if ( options.my[ 0 ] === \"center\" ) {\n\t\t\tposition.left -= elemWidth / 2;\n\t\t}\n\n\t\tif ( options.my[ 1 ] === \"bottom\" ) {\n\t\t\tposition.top -= elemHeight;\n\t\t} else if ( options.my[ 1 ] === \"center\" ) {\n\t\t\tposition.top -= elemHeight / 2;\n\t\t}\n\n\t\tposition.left += myOffset[ 0 ];\n\t\tposition.top += myOffset[ 1 ];\n\n\t\tcollisionPosition = {\n\t\t\tmarginLeft: marginLeft,\n\t\t\tmarginTop: marginTop\n\t\t};\n\n\t\t$.each( [ \"left\", \"top\" ], function( i, dir ) {\n\t\t\tif ( $.ui.position[ collision[ i ] ] ) {\n\t\t\t\t$.ui.position[ collision[ i ] ][ dir ]( position, {\n\t\t\t\t\ttargetWidth: targetWidth,\n\t\t\t\t\ttargetHeight: targetHeight,\n\t\t\t\t\telemWidth: elemWidth,\n\t\t\t\t\telemHeight: elemHeight,\n\t\t\t\t\tcollisionPosition: collisionPosition,\n\t\t\t\t\tcollisionWidth: collisionWidth,\n\t\t\t\t\tcollisionHeight: collisionHeight,\n\t\t\t\t\toffset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],\n\t\t\t\t\tmy: options.my,\n\t\t\t\t\tat: options.at,\n\t\t\t\t\twithin: within,\n\t\t\t\t\telem: elem\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\tif ( options.using ) {\n\n\t\t\t// Adds feedback as second argument to using callback, if present\n\t\t\tusing = function( props ) {\n\t\t\t\tvar left = targetOffset.left - position.left,\n\t\t\t\t\tright = left + targetWidth - elemWidth,\n\t\t\t\t\ttop = targetOffset.top - position.top,\n\t\t\t\t\tbottom = top + targetHeight - elemHeight,\n\t\t\t\t\tfeedback = {\n\t\t\t\t\t\ttarget: {\n\t\t\t\t\t\t\telement: target,\n\t\t\t\t\t\t\tleft: targetOffset.left,\n\t\t\t\t\t\t\ttop: targetOffset.top,\n\t\t\t\t\t\t\twidth: targetWidth,\n\t\t\t\t\t\t\theight: targetHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\telement: {\n\t\t\t\t\t\t\telement: elem,\n\t\t\t\t\t\t\tleft: position.left,\n\t\t\t\t\t\t\ttop: position.top,\n\t\t\t\t\t\t\twidth: elemWidth,\n\t\t\t\t\t\t\theight: elemHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\thorizontal: right < 0 ? \"left\" : left > 0 ? \"right\" : \"center\",\n\t\t\t\t\t\tvertical: bottom < 0 ? \"top\" : top > 0 ? \"bottom\" : \"middle\"\n\t\t\t\t\t};\n\t\t\t\tif ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {\n\t\t\t\t\tfeedback.horizontal = \"center\";\n\t\t\t\t}\n\t\t\t\tif ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {\n\t\t\t\t\tfeedback.vertical = \"middle\";\n\t\t\t\t}\n\t\t\t\tif ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {\n\t\t\t\t\tfeedback.important = \"horizontal\";\n\t\t\t\t} else {\n\t\t\t\t\tfeedback.important = \"vertical\";\n\t\t\t\t}\n\t\t\t\toptions.using.call( this, props, feedback );\n\t\t\t};\n\t\t}\n\n\t\telem.offset( $.extend( position, { using: using } ) );\n\t} );\n};\n\n$.ui.position = {\n\tfit: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\touterWidth = within.width,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = withinOffset - collisionPosLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,\n\t\t\t\tnewOverRight;\n\n\t\t\t// Element is wider than within\n\t\t\tif ( data.collisionWidth > outerWidth ) {\n\n\t\t\t\t// Element is initially over the left side of within\n\t\t\t\tif ( overLeft > 0 && overRight <= 0 ) {\n\t\t\t\t\tnewOverRight = position.left + overLeft + data.collisionWidth - outerWidth -\n\t\t\t\t\t\twithinOffset;\n\t\t\t\t\tposition.left += overLeft - newOverRight;\n\n\t\t\t\t// Element is initially over right side of within\n\t\t\t\t} else if ( overRight > 0 && overLeft <= 0 ) {\n\t\t\t\t\tposition.left = withinOffset;\n\n\t\t\t\t// Element is initially over both left and right sides of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overLeft > overRight ) {\n\t\t\t\t\t\tposition.left = withinOffset + outerWidth - data.collisionWidth;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.left = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Too far left -> align with left edge\n\t\t\t} else if ( overLeft > 0 ) {\n\t\t\t\tposition.left += overLeft;\n\n\t\t\t// Too far right -> align with right edge\n\t\t\t} else if ( overRight > 0 ) {\n\t\t\t\tposition.left -= overRight;\n\n\t\t\t// Adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.left = max( position.left - collisionPosLeft, position.left );\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\touterHeight = data.within.height,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = withinOffset - collisionPosTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,\n\t\t\t\tnewOverBottom;\n\n\t\t\t// Element is taller than within\n\t\t\tif ( data.collisionHeight > outerHeight ) {\n\n\t\t\t\t// Element is initially over the top of within\n\t\t\t\tif ( overTop > 0 && overBottom <= 0 ) {\n\t\t\t\t\tnewOverBottom = position.top + overTop + data.collisionHeight - outerHeight -\n\t\t\t\t\t\twithinOffset;\n\t\t\t\t\tposition.top += overTop - newOverBottom;\n\n\t\t\t\t// Element is initially over bottom of within\n\t\t\t\t} else if ( overBottom > 0 && overTop <= 0 ) {\n\t\t\t\t\tposition.top = withinOffset;\n\n\t\t\t\t// Element is initially over both top and bottom of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overTop > overBottom ) {\n\t\t\t\t\t\tposition.top = withinOffset + outerHeight - data.collisionHeight;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.top = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Too far up -> align with top\n\t\t\t} else if ( overTop > 0 ) {\n\t\t\t\tposition.top += overTop;\n\n\t\t\t// Too far down -> align with bottom edge\n\t\t\t} else if ( overBottom > 0 ) {\n\t\t\t\tposition.top -= overBottom;\n\n\t\t\t// Adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.top = max( position.top - collisionPosTop, position.top );\n\t\t\t}\n\t\t}\n\t},\n\tflip: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.left + within.scrollLeft,\n\t\t\t\touterWidth = within.width,\n\t\t\t\toffsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = collisionPosLeft - offsetLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,\n\t\t\t\tmyOffset = data.my[ 0 ] === \"left\" ?\n\t\t\t\t\t-data.elemWidth :\n\t\t\t\t\tdata.my[ 0 ] === \"right\" ?\n\t\t\t\t\t\tdata.elemWidth :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 0 ] === \"left\" ?\n\t\t\t\t\tdata.targetWidth :\n\t\t\t\t\tdata.at[ 0 ] === \"right\" ?\n\t\t\t\t\t\t-data.targetWidth :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 0 ],\n\t\t\t\tnewOverRight,\n\t\t\t\tnewOverLeft;\n\n\t\t\tif ( overLeft < 0 ) {\n\t\t\t\tnewOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -\n\t\t\t\t\touterWidth - withinOffset;\n\t\t\t\tif ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t} else if ( overRight > 0 ) {\n\t\t\t\tnewOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +\n\t\t\t\t\tatOffset + offset - offsetLeft;\n\t\t\t\tif ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.top + within.scrollTop,\n\t\t\t\touterHeight = within.height,\n\t\t\t\toffsetTop = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = collisionPosTop - offsetTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,\n\t\t\t\ttop = data.my[ 1 ] === \"top\",\n\t\t\t\tmyOffset = top ?\n\t\t\t\t\t-data.elemHeight :\n\t\t\t\t\tdata.my[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\tdata.elemHeight :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 1 ] === \"top\" ?\n\t\t\t\t\tdata.targetHeight :\n\t\t\t\t\tdata.at[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\t-data.targetHeight :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 1 ],\n\t\t\t\tnewOverTop,\n\t\t\t\tnewOverBottom;\n\t\t\tif ( overTop < 0 ) {\n\t\t\t\tnewOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -\n\t\t\t\t\touterHeight - withinOffset;\n\t\t\t\tif ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t} else if ( overBottom > 0 ) {\n\t\t\t\tnewOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +\n\t\t\t\t\toffset - offsetTop;\n\t\t\t\tif ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tflipfit: {\n\t\tleft: function() {\n\t\t\t$.ui.position.flip.left.apply( this, arguments );\n\t\t\t$.ui.position.fit.left.apply( this, arguments );\n\t\t},\n\t\ttop: function() {\n\t\t\t$.ui.position.flip.top.apply( this, arguments );\n\t\t\t$.ui.position.fit.top.apply( this, arguments );\n\t\t}\n\t}\n};\n\n} )();\n\nvar position = $.ui.position;\n\n\n/*!\n * jQuery UI :data 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: :data Selector\n//>>group: Core\n//>>description: Selects elements which have data stored under the specified key.\n//>>docs: http://api.jqueryui.com/data-selector/\n\n\nvar data = $.extend( $.expr[ \":\" ], {\n\tdata: $.expr.createPseudo ?\n\t\t$.expr.createPseudo( function( dataName ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn !!$.data( elem, dataName );\n\t\t\t};\n\t\t} ) :\n\n\t\t// Support: jQuery <1.8\n\t\tfunction( elem, i, match ) {\n\t\t\treturn !!$.data( elem, match[ 3 ] );\n\t\t}\n} );\n\n/*!\n * jQuery UI Disable Selection 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: disableSelection\n//>>group: Core\n//>>description: Disable selection of text content within the set of matched elements.\n//>>docs: http://api.jqueryui.com/disableSelection/\n\n// This file is deprecated\n\n\nvar disableSelection = $.fn.extend( {\n\tdisableSelection: ( function() {\n\t\tvar eventType = \"onselectstart\" in document.createElement( \"div\" ) ?\n\t\t\t\"selectstart\" :\n\t\t\t\"mousedown\";\n\n\t\treturn function() {\n\t\t\treturn this.on( eventType + \".ui-disableSelection\", function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t} );\n\t\t};\n\t} )(),\n\n\tenableSelection: function() {\n\t\treturn this.off( \".ui-disableSelection\" );\n\t}\n} );\n\n\n/*!\n * jQuery UI Focusable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: :focusable Selector\n//>>group: Core\n//>>description: Selects elements which can be focused.\n//>>docs: http://api.jqueryui.com/focusable-selector/\n\n\n\n// Selectors\n$.ui.focusable = function( element, hasTabindex ) {\n\tvar map, mapName, img, focusableIfVisible, fieldset,\n\t\tnodeName = element.nodeName.toLowerCase();\n\n\tif ( \"area\" === nodeName ) {\n\t\tmap = element.parentNode;\n\t\tmapName = map.name;\n\t\tif ( !element.href || !mapName || map.nodeName.toLowerCase() !== \"map\" ) {\n\t\t\treturn false;\n\t\t}\n\t\timg = $( \"img[usemap='#\" + mapName + \"']\" );\n\t\treturn img.length > 0 && img.is( \":visible\" );\n\t}\n\n\tif ( /^(input|select|textarea|button|object)$/.test( nodeName ) ) {\n\t\tfocusableIfVisible = !element.disabled;\n\n\t\tif ( focusableIfVisible ) {\n\n\t\t\t// Form controls within a disabled fieldset are disabled.\n\t\t\t// However, controls within the fieldset's legend do not get disabled.\n\t\t\t// Since controls generally aren't placed inside legends, we skip\n\t\t\t// this portion of the check.\n\t\t\tfieldset = $( element ).closest( \"fieldset\" )[ 0 ];\n\t\t\tif ( fieldset ) {\n\t\t\t\tfocusableIfVisible = !fieldset.disabled;\n\t\t\t}\n\t\t}\n\t} else if ( \"a\" === nodeName ) {\n\t\tfocusableIfVisible = element.href || hasTabindex;\n\t} else {\n\t\tfocusableIfVisible = hasTabindex;\n\t}\n\n\treturn focusableIfVisible && $( element ).is( \":visible\" ) && visible( $( element ) );\n};\n\n// Support: IE 8 only\n// IE 8 doesn't resolve inherit to visible/hidden for computed values\nfunction visible( element ) {\n\tvar visibility = element.css( \"visibility\" );\n\twhile ( visibility === \"inherit\" ) {\n\t\telement = element.parent();\n\t\tvisibility = element.css( \"visibility\" );\n\t}\n\treturn visibility !== \"hidden\";\n}\n\n$.extend( $.expr[ \":\" ], {\n\tfocusable: function( element ) {\n\t\treturn $.ui.focusable( element, $.attr( element, \"tabindex\" ) != null );\n\t}\n} );\n\nvar focusable = $.ui.focusable;\n\n\n\n\n// Support: IE8 Only\n// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop\n// with a string, so we need to find the proper form.\nvar form = $.fn.form = function() {\n\treturn typeof this[ 0 ].form === \"string\" ? this.closest( \"form\" ) : $( this[ 0 ].form );\n};\n\n\n/*!\n * jQuery UI Form Reset Mixin 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Form Reset Mixin\n//>>group: Core\n//>>description: Refresh input widgets when their form is reset\n//>>docs: http://api.jqueryui.com/form-reset-mixin/\n\n\n\nvar formResetMixin = $.ui.formResetMixin = {\n\t_formResetHandler: function() {\n\t\tvar form = $( this );\n\n\t\t// Wait for the form reset to actually happen before refreshing\n\t\tsetTimeout( function() {\n\t\t\tvar instances = form.data( \"ui-form-reset-instances\" );\n\t\t\t$.each( instances, function() {\n\t\t\t\tthis.refresh();\n\t\t\t} );\n\t\t} );\n\t},\n\n\t_bindFormResetHandler: function() {\n\t\tthis.form = this.element.form();\n\t\tif ( !this.form.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar instances = this.form.data( \"ui-form-reset-instances\" ) || [];\n\t\tif ( !instances.length ) {\n\n\t\t\t// We don't use _on() here because we use a single event handler per form\n\t\t\tthis.form.on( \"reset.ui-form-reset\", this._formResetHandler );\n\t\t}\n\t\tinstances.push( this );\n\t\tthis.form.data( \"ui-form-reset-instances\", instances );\n\t},\n\n\t_unbindFormResetHandler: function() {\n\t\tif ( !this.form.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar instances = this.form.data( \"ui-form-reset-instances\" );\n\t\tinstances.splice( $.inArray( this, instances ), 1 );\n\t\tif ( instances.length ) {\n\t\t\tthis.form.data( \"ui-form-reset-instances\", instances );\n\t\t} else {\n\t\t\tthis.form\n\t\t\t\t.removeData( \"ui-form-reset-instances\" )\n\t\t\t\t.off( \"reset.ui-form-reset\" );\n\t\t}\n\t}\n};\n\n\n/*!\n * jQuery UI Support for jQuery core 1.7.x 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n */\n\n//>>label: jQuery 1.7 Support\n//>>group: Core\n//>>description: Support version 1.7.x of jQuery core\n\n\n\n// Support: jQuery 1.7 only\n// Not a great way to check versions, but since we only support 1.7+ and only\n// need to detect <1.8, this is a simple check that should suffice. Checking\n// for \"1.7.\" would be a bit safer, but the version string is 1.7, not 1.7.0\n// and we'll never reach 1.70.0 (if we do, we certainly won't be supporting\n// 1.7 anymore). See #11197 for why we're not using feature detection.\nif ( $.fn.jquery.substring( 0, 3 ) === \"1.7\" ) {\n\n\t// Setters for .innerWidth(), .innerHeight(), .outerWidth(), .outerHeight()\n\t// Unlike jQuery Core 1.8+, these only support numeric values to set the\n\t// dimensions in pixels\n\t$.each( [ \"Width\", \"Height\" ], function( i, name ) {\n\t\tvar side = name === \"Width\" ? [ \"Left\", \"Right\" ] : [ \"Top\", \"Bottom\" ],\n\t\t\ttype = name.toLowerCase(),\n\t\t\torig = {\n\t\t\t\tinnerWidth: $.fn.innerWidth,\n\t\t\t\tinnerHeight: $.fn.innerHeight,\n\t\t\t\touterWidth: $.fn.outerWidth,\n\t\t\t\touterHeight: $.fn.outerHeight\n\t\t\t};\n\n\t\tfunction reduce( elem, size, border, margin ) {\n\t\t\t$.each( side, function() {\n\t\t\t\tsize -= parseFloat( $.css( elem, \"padding\" + this ) ) || 0;\n\t\t\t\tif ( border ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"border\" + this + \"Width\" ) ) || 0;\n\t\t\t\t}\n\t\t\t\tif ( margin ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"margin\" + this ) ) || 0;\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn size;\n\t\t}\n\n\t\t$.fn[ \"inner\" + name ] = function( size ) {\n\t\t\tif ( size === undefined ) {\n\t\t\t\treturn orig[ \"inner\" + name ].call( this );\n\t\t\t}\n\n\t\t\treturn this.each( function() {\n\t\t\t\t$( this ).css( type, reduce( this, size ) + \"px\" );\n\t\t\t} );\n\t\t};\n\n\t\t$.fn[ \"outer\" + name ] = function( size, margin ) {\n\t\t\tif ( typeof size !== \"number\" ) {\n\t\t\t\treturn orig[ \"outer\" + name ].call( this, size );\n\t\t\t}\n\n\t\t\treturn this.each( function() {\n\t\t\t\t$( this ).css( type, reduce( this, size, true, margin ) + \"px\" );\n\t\t\t} );\n\t\t};\n\t} );\n\n\t$.fn.addBack = function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t};\n}\n\n;\n/*!\n * jQuery UI Keycode 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Keycode\n//>>group: Core\n//>>description: Provide keycodes as keynames\n//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/\n\n\nvar keycode = $.ui.keyCode = {\n\tBACKSPACE: 8,\n\tCOMMA: 188,\n\tDELETE: 46,\n\tDOWN: 40,\n\tEND: 35,\n\tENTER: 13,\n\tESCAPE: 27,\n\tHOME: 36,\n\tLEFT: 37,\n\tPAGE_DOWN: 34,\n\tPAGE_UP: 33,\n\tPERIOD: 190,\n\tRIGHT: 39,\n\tSPACE: 32,\n\tTAB: 9,\n\tUP: 38\n};\n\n\n\n\n// Internal use only\nvar escapeSelector = $.ui.escapeSelector = ( function() {\n\tvar selectorEscape = /([!\"#$%&'()*+,./:;<=>?@[\\]^`{|}~])/g;\n\treturn function( selector ) {\n\t\treturn selector.replace( selectorEscape, \"\\\\$1\" );\n\t};\n} )();\n\n\n/*!\n * jQuery UI Labels 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: labels\n//>>group: Core\n//>>description: Find all the labels associated with a given input\n//>>docs: http://api.jqueryui.com/labels/\n\n\n\nvar labels = $.fn.labels = function() {\n\tvar ancestor, selector, id, labels, ancestors;\n\n\t// Check control.labels first\n\tif ( this[ 0 ].labels && this[ 0 ].labels.length ) {\n\t\treturn this.pushStack( this[ 0 ].labels );\n\t}\n\n\t// Support: IE <= 11, FF <= 37, Android <= 2.3 only\n\t// Above browsers do not support control.labels. Everything below is to support them\n\t// as well as document fragments. control.labels does not work on document fragments\n\tlabels = this.eq( 0 ).parents( \"label\" );\n\n\t// Look for the label based on the id\n\tid = this.attr( \"id\" );\n\tif ( id ) {\n\n\t\t// We don't search against the document in case the element\n\t\t// is disconnected from the DOM\n\t\tancestor = this.eq( 0 ).parents().last();\n\n\t\t// Get a full set of top level ancestors\n\t\tancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() );\n\n\t\t// Create a selector for the label based on the id\n\t\tselector = \"label[for='\" + $.ui.escapeSelector( id ) + \"']\";\n\n\t\tlabels = labels.add( ancestors.find( selector ).addBack( selector ) );\n\n\t}\n\n\t// Return whatever we have found for labels\n\treturn this.pushStack( labels );\n};\n\n\n/*!\n * jQuery UI Scroll Parent 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: scrollParent\n//>>group: Core\n//>>description: Get the closest ancestor element that is scrollable.\n//>>docs: http://api.jqueryui.com/scrollParent/\n\n\n\nvar scrollParent = $.fn.scrollParent = function( includeHidden ) {\n\tvar position = this.css( \"position\" ),\n\t\texcludeStaticParent = position === \"absolute\",\n\t\toverflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,\n\t\tscrollParent = this.parents().filter( function() {\n\t\t\tvar parent = $( this );\n\t\t\tif ( excludeStaticParent && parent.css( \"position\" ) === \"static\" ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn overflowRegex.test( parent.css( \"overflow\" ) + parent.css( \"overflow-y\" ) +\n\t\t\t\tparent.css( \"overflow-x\" ) );\n\t\t} ).eq( 0 );\n\n\treturn position === \"fixed\" || !scrollParent.length ?\n\t\t$( this[ 0 ].ownerDocument || document ) :\n\t\tscrollParent;\n};\n\n\n/*!\n * jQuery UI Tabbable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: :tabbable Selector\n//>>group: Core\n//>>description: Selects elements which can be tabbed to.\n//>>docs: http://api.jqueryui.com/tabbable-selector/\n\n\n\nvar tabbable = $.extend( $.expr[ \":\" ], {\n\ttabbable: function( element ) {\n\t\tvar tabIndex = $.attr( element, \"tabindex\" ),\n\t\t\thasTabindex = tabIndex != null;\n\t\treturn ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex );\n\t}\n} );\n\n\n/*!\n * jQuery UI Unique ID 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: uniqueId\n//>>group: Core\n//>>description: Functions to generate and remove uniqueId's\n//>>docs: http://api.jqueryui.com/uniqueId/\n\n\n\nvar uniqueId = $.fn.extend( {\n\tuniqueId: ( function() {\n\t\tvar uuid = 0;\n\n\t\treturn function() {\n\t\t\treturn this.each( function() {\n\t\t\t\tif ( !this.id ) {\n\t\t\t\t\tthis.id = \"ui-id-\" + ( ++uuid );\n\t\t\t\t}\n\t\t\t} );\n\t\t};\n\t} )(),\n\n\tremoveUniqueId: function() {\n\t\treturn this.each( function() {\n\t\t\tif ( /^ui-id-\\d+$/.test( this.id ) ) {\n\t\t\t\t$( this ).removeAttr( \"id\" );\n\t\t\t}\n\t\t} );\n\t}\n} );\n\n\n\n\n// This file is deprecated\nvar ie = $.ui.ie = !!/msie [\\w.]+/.exec( navigator.userAgent.toLowerCase() );\n\n/*!\n * jQuery UI Mouse 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Mouse\n//>>group: Widgets\n//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.\n//>>docs: http://api.jqueryui.com/mouse/\n\n\n\nvar mouseHandled = false;\n$( document ).on( \"mouseup\", function() {\n\tmouseHandled = false;\n} );\n\nvar widgetsMouse = $.widget( \"ui.mouse\", {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tcancel: \"input, textarea, button, select, option\",\n\t\tdistance: 1,\n\t\tdelay: 0\n\t},\n\t_mouseInit: function() {\n\t\tvar that = this;\n\n\t\tthis.element\n\t\t\t.on( \"mousedown.\" + this.widgetName, function( event ) {\n\t\t\t\treturn that._mouseDown( event );\n\t\t\t} )\n\t\t\t.on( \"click.\" + this.widgetName, function( event ) {\n\t\t\t\tif ( true === $.data( event.target, that.widgetName + \".preventClickEvent\" ) ) {\n\t\t\t\t\t$.removeData( event.target, that.widgetName + \".preventClickEvent\" );\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\n\t\tthis.started = false;\n\t},\n\n\t// TODO: make sure destroying one instance of mouse doesn't mess with\n\t// other instances of mouse\n\t_mouseDestroy: function() {\n\t\tthis.element.off( \".\" + this.widgetName );\n\t\tif ( this._mouseMoveDelegate ) {\n\t\t\tthis.document\n\t\t\t\t.off( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t\t.off( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\t\t}\n\t},\n\n\t_mouseDown: function( event ) {\n\n\t\t// don't let more than one widget handle mouseStart\n\t\tif ( mouseHandled ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._mouseMoved = false;\n\n\t\t// We may have missed mouseup (out of window)\n\t\t( this._mouseStarted && this._mouseUp( event ) );\n\n\t\tthis._mouseDownEvent = event;\n\n\t\tvar that = this,\n\t\t\tbtnIsLeft = ( event.which === 1 ),\n\n\t\t\t// event.target.nodeName works around a bug in IE 8 with\n\t\t\t// disabled inputs (#7620)\n\t\t\telIsCancel = ( typeof this.options.cancel === \"string\" && event.target.nodeName ?\n\t\t\t\t$( event.target ).closest( this.options.cancel ).length : false );\n\t\tif ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.mouseDelayMet = !this.options.delay;\n\t\tif ( !this.mouseDelayMet ) {\n\t\t\tthis._mouseDelayTimer = setTimeout( function() {\n\t\t\t\tthat.mouseDelayMet = true;\n\t\t\t}, this.options.delay );\n\t\t}\n\n\t\tif ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {\n\t\t\tthis._mouseStarted = ( this._mouseStart( event ) !== false );\n\t\t\tif ( !this._mouseStarted ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Click event may never have fired (Gecko & Opera)\n\t\tif ( true === $.data( event.target, this.widgetName + \".preventClickEvent\" ) ) {\n\t\t\t$.removeData( event.target, this.widgetName + \".preventClickEvent\" );\n\t\t}\n\n\t\t// These delegates are required to keep context\n\t\tthis._mouseMoveDelegate = function( event ) {\n\t\t\treturn that._mouseMove( event );\n\t\t};\n\t\tthis._mouseUpDelegate = function( event ) {\n\t\t\treturn that._mouseUp( event );\n\t\t};\n\n\t\tthis.document\n\t\t\t.on( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t.on( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\n\t\tevent.preventDefault();\n\n\t\tmouseHandled = true;\n\t\treturn true;\n\t},\n\n\t_mouseMove: function( event ) {\n\n\t\t// Only check for mouseups outside the document if you've moved inside the document\n\t\t// at least once. This prevents the firing of mouseup in the case of IE<9, which will\n\t\t// fire a mousemove event if content is placed under the cursor. See #7778\n\t\t// Support: IE <9\n\t\tif ( this._mouseMoved ) {\n\n\t\t\t// IE mouseup check - mouseup happened when mouse was out of window\n\t\t\tif ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&\n\t\t\t\t\t!event.button ) {\n\t\t\t\treturn this._mouseUp( event );\n\n\t\t\t// Iframe mouseup check - mouseup occurred in another document\n\t\t\t} else if ( !event.which ) {\n\n\t\t\t\t// Support: Safari <=8 - 9\n\t\t\t\t// Safari sets which to 0 if you press any of the following keys\n\t\t\t\t// during a drag (#14461)\n\t\t\t\tif ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||\n\t\t\t\t\t\tevent.originalEvent.metaKey || event.originalEvent.shiftKey ) {\n\t\t\t\t\tthis.ignoreMissingWhich = true;\n\t\t\t\t} else if ( !this.ignoreMissingWhich ) {\n\t\t\t\t\treturn this._mouseUp( event );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( event.which || event.button ) {\n\t\t\tthis._mouseMoved = true;\n\t\t}\n\n\t\tif ( this._mouseStarted ) {\n\t\t\tthis._mouseDrag( event );\n\t\t\treturn event.preventDefault();\n\t\t}\n\n\t\tif ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {\n\t\t\tthis._mouseStarted =\n\t\t\t\t( this._mouseStart( this._mouseDownEvent, event ) !== false );\n\t\t\t( this._mouseStarted ? this._mouseDrag( event ) : this._mouseUp( event ) );\n\t\t}\n\n\t\treturn !this._mouseStarted;\n\t},\n\n\t_mouseUp: function( event ) {\n\t\tthis.document\n\t\t\t.off( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t.off( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\n\t\tif ( this._mouseStarted ) {\n\t\t\tthis._mouseStarted = false;\n\n\t\t\tif ( event.target === this._mouseDownEvent.target ) {\n\t\t\t\t$.data( event.target, this.widgetName + \".preventClickEvent\", true );\n\t\t\t}\n\n\t\t\tthis._mouseStop( event );\n\t\t}\n\n\t\tif ( this._mouseDelayTimer ) {\n\t\t\tclearTimeout( this._mouseDelayTimer );\n\t\t\tdelete this._mouseDelayTimer;\n\t\t}\n\n\t\tthis.ignoreMissingWhich = false;\n\t\tmouseHandled = false;\n\t\tevent.preventDefault();\n\t},\n\n\t_mouseDistanceMet: function( event ) {\n\t\treturn ( Math.max(\n\t\t\t\tMath.abs( this._mouseDownEvent.pageX - event.pageX ),\n\t\t\t\tMath.abs( this._mouseDownEvent.pageY - event.pageY )\n\t\t\t) >= this.options.distance\n\t\t);\n\t},\n\n\t_mouseDelayMet: function( /* event */ ) {\n\t\treturn this.mouseDelayMet;\n\t},\n\n\t// These are placeholder methods, to be overriden by extending plugin\n\t_mouseStart: function( /* event */ ) {},\n\t_mouseDrag: function( /* event */ ) {},\n\t_mouseStop: function( /* event */ ) {},\n\t_mouseCapture: function( /* event */ ) { return true; }\n} );\n\n\n\n\n// $.ui.plugin is deprecated. Use $.widget() extensions instead.\nvar plugin = $.ui.plugin = {\n\tadd: function( module, option, set ) {\n\t\tvar i,\n\t\t\tproto = $.ui[ module ].prototype;\n\t\tfor ( i in set ) {\n\t\t\tproto.plugins[ i ] = proto.plugins[ i ] || [];\n\t\t\tproto.plugins[ i ].push( [ option, set[ i ] ] );\n\t\t}\n\t},\n\tcall: function( instance, name, args, allowDisconnected ) {\n\t\tvar i,\n\t\t\tset = instance.plugins[ name ];\n\n\t\tif ( !set ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||\n\t\t\t\tinstance.element[ 0 ].parentNode.nodeType === 11 ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( i = 0; i < set.length; i++ ) {\n\t\t\tif ( instance.options[ set[ i ][ 0 ] ] ) {\n\t\t\t\tset[ i ][ 1 ].apply( instance.element, args );\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nvar safeActiveElement = $.ui.safeActiveElement = function( document ) {\n\tvar activeElement;\n\n\t// Support: IE 9 only\n\t// IE9 throws an \"Unspecified error\" accessing document.activeElement from an <iframe>\n\ttry {\n\t\tactiveElement = document.activeElement;\n\t} catch ( error ) {\n\t\tactiveElement = document.body;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE may return null instead of an element\n\t// Interestingly, this only seems to occur when NOT in an iframe\n\tif ( !activeElement ) {\n\t\tactiveElement = document.body;\n\t}\n\n\t// Support: IE 11 only\n\t// IE11 returns a seemingly empty object in some cases when accessing\n\t// document.activeElement from an <iframe>\n\tif ( !activeElement.nodeName ) {\n\t\tactiveElement = document.body;\n\t}\n\n\treturn activeElement;\n};\n\n\n\nvar safeBlur = $.ui.safeBlur = function( element ) {\n\n\t// Support: IE9 - 10 only\n\t// If the <body> is blurred, IE will switch windows, see #9420\n\tif ( element && element.nodeName.toLowerCase() !== \"body\" ) {\n\t\t$( element ).trigger( \"blur\" );\n\t}\n};\n\n\n/*!\n * jQuery UI Draggable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Draggable\n//>>group: Interactions\n//>>description: Enables dragging functionality for any element.\n//>>docs: http://api.jqueryui.com/draggable/\n//>>demos: http://jqueryui.com/draggable/\n//>>css.structure: ../../themes/base/draggable.css\n\n\n\n$.widget( \"ui.draggable\", $.ui.mouse, {\n\tversion: \"1.12.1\",\n\twidgetEventPrefix: \"drag\",\n\toptions: {\n\t\taddClasses: true,\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectToSortable: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\tiframeFix: false,\n\t\topacity: false,\n\t\trefreshPositions: false,\n\t\trevert: false,\n\t\trevertDuration: 500,\n\t\tscope: \"default\",\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tsnap: false,\n\t\tsnapMode: \"both\",\n\t\tsnapTolerance: 20,\n\t\tstack: false,\n\t\tzIndex: false,\n\n\t\t// Callbacks\n\t\tdrag: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\t_create: function() {\n\n\t\tif ( this.options.helper === \"original\" ) {\n\t\t\tthis._setPositionRelative();\n\t\t}\n\t\tif ( this.options.addClasses ) {\n\t\t\tthis._addClass( \"ui-draggable\" );\n\t\t}\n\t\tthis._setHandleClassName();\n\n\t\tthis._mouseInit();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\t\tif ( key === \"handle\" ) {\n\t\t\tthis._removeHandleClassName();\n\t\t\tthis._setHandleClassName();\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tif ( ( this.helper || this.element ).is( \".ui-draggable-dragging\" ) ) {\n\t\t\tthis.destroyOnClear = true;\n\t\t\treturn;\n\t\t}\n\t\tthis._removeHandleClassName();\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseCapture: function( event ) {\n\t\tvar o = this.options;\n\n\t\t// Among others, prevent a drag on a resizable-handle\n\t\tif ( this.helper || o.disabled ||\n\t\t\t\t$( event.target ).closest( \".ui-resizable-handle\" ).length > 0 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t//Quit if we're not on a valid handle\n\t\tthis.handle = this._getHandle( event );\n\t\tif ( !this.handle ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis._blurActiveElement( event );\n\n\t\tthis._blockFrames( o.iframeFix === true ? \"iframe\" : o.iframeFix );\n\n\t\treturn true;\n\n\t},\n\n\t_blockFrames: function( selector ) {\n\t\tthis.iframeBlocks = this.document.find( selector ).map( function() {\n\t\t\tvar iframe = $( this );\n\n\t\t\treturn $( \"<div>\" )\n\t\t\t\t.css( \"position\", \"absolute\" )\n\t\t\t\t.appendTo( iframe.parent() )\n\t\t\t\t.outerWidth( iframe.outerWidth() )\n\t\t\t\t.outerHeight( iframe.outerHeight() )\n\t\t\t\t.offset( iframe.offset() )[ 0 ];\n\t\t} );\n\t},\n\n\t_unblockFrames: function() {\n\t\tif ( this.iframeBlocks ) {\n\t\t\tthis.iframeBlocks.remove();\n\t\t\tdelete this.iframeBlocks;\n\t\t}\n\t},\n\n\t_blurActiveElement: function( event ) {\n\t\tvar activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),\n\t\t\ttarget = $( event.target );\n\n\t\t// Don't blur if the event occurred on an element that is within\n\t\t// the currently focused element\n\t\t// See #10527, #12472\n\t\tif ( target.closest( activeElement ).length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Blur any element that currently has focus, see #4261\n\t\t$.ui.safeBlur( activeElement );\n\t},\n\n\t_mouseStart: function( event ) {\n\n\t\tvar o = this.options;\n\n\t\t//Create and append the visible helper\n\t\tthis.helper = this._createHelper( event );\n\n\t\tthis._addClass( this.helper, \"ui-draggable-dragging\" );\n\n\t\t//Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t//If ddmanager is used for droppables, set the global draggable\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\t/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */\n\n\t\t//Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t//Store the helper's css position\n\t\tthis.cssPosition = this.helper.css( \"position\" );\n\t\tthis.scrollParent = this.helper.scrollParent( true );\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tthis.hasFixedAncestor = this.helper.parents().filter( function() {\n\t\t\t\treturn $( this ).css( \"position\" ) === \"fixed\";\n\t\t\t} ).length > 0;\n\n\t\t//The element's absolute position on the page minus margins\n\t\tthis.positionAbs = this.element.offset();\n\t\tthis._refreshOffsets( event );\n\n\t\t//Generate the original position\n\t\tthis.originalPosition = this.position = this._generatePosition( event, false );\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\t( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );\n\n\t\t//Set a containment if given in the options\n\t\tthis._setContainment();\n\n\t\t//Trigger event + callbacks\n\t\tif ( this._trigger( \"start\", event ) === false ) {\n\t\t\tthis._clear();\n\t\t\treturn false;\n\t\t}\n\n\t\t//Recache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t//Prepare the droppable offsets\n\t\tif ( $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t}\n\n\t\t// Execute the drag once - this causes the helper not to be visible before getting its\n\t\t// correct position\n\t\tthis._mouseDrag( event, true );\n\n\t\t// If the ddmanager is used for droppables, inform the manager that dragging has started\n\t\t// (see #5003)\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.dragStart( this, event );\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t_refreshOffsets: function( event ) {\n\t\tthis.offset = {\n\t\t\ttop: this.positionAbs.top - this.margins.top,\n\t\t\tleft: this.positionAbs.left - this.margins.left,\n\t\t\tscroll: false,\n\t\t\tparent: this._getParentOffset(),\n\t\t\trelative: this._getRelativeOffset()\n\t\t};\n\n\t\tthis.offset.click = {\n\t\t\tleft: event.pageX - this.offset.left,\n\t\t\ttop: event.pageY - this.offset.top\n\t\t};\n\t},\n\n\t_mouseDrag: function( event, noPropagation ) {\n\n\t\t// reset any necessary cached properties (see #5009)\n\t\tif ( this.hasFixedAncestor ) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition( event, true );\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\t//Call plugins and callbacks and use the resulting position if something is returned\n\t\tif ( !noPropagation ) {\n\t\t\tvar ui = this._uiHash();\n\t\t\tif ( this._trigger( \"drag\", event, ui ) === false ) {\n\t\t\t\tthis._mouseUp( new $.Event( \"mouseup\", event ) );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.position = ui.position;\n\t\t}\n\n\t\tthis.helper[ 0 ].style.left = this.position.left + \"px\";\n\t\tthis.helper[ 0 ].style.top = this.position.top + \"px\";\n\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.drag( this, event );\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function( event ) {\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tvar that = this,\n\t\t\tdropped = false;\n\t\tif ( $.ui.ddmanager && !this.options.dropBehaviour ) {\n\t\t\tdropped = $.ui.ddmanager.drop( this, event );\n\t\t}\n\n\t\t//if a drop comes from outside (a sortable)\n\t\tif ( this.dropped ) {\n\t\t\tdropped = this.dropped;\n\t\t\tthis.dropped = false;\n\t\t}\n\n\t\tif ( ( this.options.revert === \"invalid\" && !dropped ) ||\n\t\t\t\t( this.options.revert === \"valid\" && dropped ) ||\n\t\t\t\tthis.options.revert === true || ( $.isFunction( this.options.revert ) &&\n\t\t\t\tthis.options.revert.call( this.element, dropped ) )\n\t\t) {\n\t\t\t$( this.helper ).animate(\n\t\t\t\tthis.originalPosition,\n\t\t\t\tparseInt( this.options.revertDuration, 10 ),\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( that._trigger( \"stop\", event ) !== false ) {\n\t\t\t\t\t\tthat._clear();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tif ( this._trigger( \"stop\", event ) !== false ) {\n\t\t\t\tthis._clear();\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseUp: function( event ) {\n\t\tthis._unblockFrames();\n\n\t\t// If the ddmanager is used for droppables, inform the manager that dragging has stopped\n\t\t// (see #5003)\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.dragStop( this, event );\n\t\t}\n\n\t\t// Only need to focus if the event occurred on the draggable itself, see #10527\n\t\tif ( this.handleElement.is( event.target ) ) {\n\n\t\t\t// The interaction is over; whether or not the click resulted in a drag,\n\t\t\t// focus the element\n\t\t\tthis.element.trigger( \"focus\" );\n\t\t}\n\n\t\treturn $.ui.mouse.prototype._mouseUp.call( this, event );\n\t},\n\n\tcancel: function() {\n\n\t\tif ( this.helper.is( \".ui-draggable-dragging\" ) ) {\n\t\t\tthis._mouseUp( new $.Event( \"mouseup\", { target: this.element[ 0 ] } ) );\n\t\t} else {\n\t\t\tthis._clear();\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t_getHandle: function( event ) {\n\t\treturn this.options.handle ?\n\t\t\t!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :\n\t\t\ttrue;\n\t},\n\n\t_setHandleClassName: function() {\n\t\tthis.handleElement = this.options.handle ?\n\t\t\tthis.element.find( this.options.handle ) : this.element;\n\t\tthis._addClass( this.handleElement, \"ui-draggable-handle\" );\n\t},\n\n\t_removeHandleClassName: function() {\n\t\tthis._removeClass( this.handleElement, \"ui-draggable-handle\" );\n\t},\n\n\t_createHelper: function( event ) {\n\n\t\tvar o = this.options,\n\t\t\thelperIsFunction = $.isFunction( o.helper ),\n\t\t\thelper = helperIsFunction ?\n\t\t\t\t$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :\n\t\t\t\t( o.helper === \"clone\" ?\n\t\t\t\t\tthis.element.clone().removeAttr( \"id\" ) :\n\t\t\t\t\tthis.element );\n\n\t\tif ( !helper.parents( \"body\" ).length ) {\n\t\t\thelper.appendTo( ( o.appendTo === \"parent\" ?\n\t\t\t\tthis.element[ 0 ].parentNode :\n\t\t\t\to.appendTo ) );\n\t\t}\n\n\t\t// Http://bugs.jqueryui.com/ticket/9446\n\t\t// a helper function can return the original element\n\t\t// which wouldn't have been set to relative in _create\n\t\tif ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {\n\t\t\tthis._setPositionRelative();\n\t\t}\n\n\t\tif ( helper[ 0 ] !== this.element[ 0 ] &&\n\t\t\t\t!( /(fixed|absolute)/ ).test( helper.css( \"position\" ) ) ) {\n\t\t\thelper.css( \"position\", \"absolute\" );\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_setPositionRelative: function() {\n\t\tif ( !( /^(?:r|a|f)/ ).test( this.element.css( \"position\" ) ) ) {\n\t\t\tthis.element[ 0 ].style.position = \"relative\";\n\t\t}\n\t},\n\n\t_adjustOffsetFromHelper: function( obj ) {\n\t\tif ( typeof obj === \"string\" ) {\n\t\t\tobj = obj.split( \" \" );\n\t\t}\n\t\tif ( $.isArray( obj ) ) {\n\t\t\tobj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };\n\t\t}\n\t\tif ( \"left\" in obj ) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif ( \"right\" in obj ) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif ( \"top\" in obj ) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif ( \"bottom\" in obj ) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_isRootNode: function( element ) {\n\t\treturn ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t//Get the offsetParent and cache its position\n\t\tvar po = this.offsetParent.offset(),\n\t\t\tdocument = this.document[ 0 ];\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the\n\t\t// following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the\n\t\t// next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't\n\t\t// the document, which means that the scroll is included in the initial calculation of the\n\t\t// offset of the parent, and never recalculated upon drag\n\t\tif ( this.cssPosition === \"absolute\" && this.scrollParent[ 0 ] !== document &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\tif ( this._isRootNode( this.offsetParent[ 0 ] ) ) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + ( parseInt( this.offsetParent.css( \"borderTopWidth\" ), 10 ) || 0 ),\n\t\t\tleft: po.left + ( parseInt( this.offsetParent.css( \"borderLeftWidth\" ), 10 ) || 0 )\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\t\tif ( this.cssPosition !== \"relative\" ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\tvar p = this.element.position(),\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );\n\n\t\treturn {\n\t\t\ttop: p.top - ( parseInt( this.helper.css( \"top\" ), 10 ) || 0 ) +\n\t\t\t\t( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),\n\t\t\tleft: p.left - ( parseInt( this.helper.css( \"left\" ), 10 ) || 0 ) +\n\t\t\t\t( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )\n\t\t};\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: ( parseInt( this.element.css( \"marginLeft\" ), 10 ) || 0 ),\n\t\t\ttop: ( parseInt( this.element.css( \"marginTop\" ), 10 ) || 0 ),\n\t\t\tright: ( parseInt( this.element.css( \"marginRight\" ), 10 ) || 0 ),\n\t\t\tbottom: ( parseInt( this.element.css( \"marginBottom\" ), 10 ) || 0 )\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar isUserScrollable, c, ce,\n\t\t\to = this.options,\n\t\t\tdocument = this.document[ 0 ];\n\n\t\tthis.relativeContainer = null;\n\n\t\tif ( !o.containment ) {\n\t\t\tthis.containment = null;\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"window\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\t$( window ).scrollLeft() + $( window ).width() -\n\t\t\t\t\tthis.helperProportions.width - this.margins.left,\n\t\t\t\t$( window ).scrollTop() +\n\t\t\t\t\t( $( window ).height() || document.body.parentNode.scrollHeight ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"document\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t$( document ).width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t( $( document ).height() || document.body.parentNode.scrollHeight ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment.constructor === Array ) {\n\t\t\tthis.containment = o.containment;\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"parent\" ) {\n\t\t\to.containment = this.helper[ 0 ].parentNode;\n\t\t}\n\n\t\tc = $( o.containment );\n\t\tce = c[ 0 ];\n\n\t\tif ( !ce ) {\n\t\t\treturn;\n\t\t}\n\n\t\tisUserScrollable = /(scroll|auto)/.test( c.css( \"overflow\" ) );\n\n\t\tthis.containment = [\n\t\t\t( parseInt( c.css( \"borderLeftWidth\" ), 10 ) || 0 ) +\n\t\t\t\t( parseInt( c.css( \"paddingLeft\" ), 10 ) || 0 ),\n\t\t\t( parseInt( c.css( \"borderTopWidth\" ), 10 ) || 0 ) +\n\t\t\t\t( parseInt( c.css( \"paddingTop\" ), 10 ) || 0 ),\n\t\t\t( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -\n\t\t\t\t( parseInt( c.css( \"borderRightWidth\" ), 10 ) || 0 ) -\n\t\t\t\t( parseInt( c.css( \"paddingRight\" ), 10 ) || 0 ) -\n\t\t\t\tthis.helperProportions.width -\n\t\t\t\tthis.margins.left -\n\t\t\t\tthis.margins.right,\n\t\t\t( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -\n\t\t\t\t( parseInt( c.css( \"borderBottomWidth\" ), 10 ) || 0 ) -\n\t\t\t\t( parseInt( c.css( \"paddingBottom\" ), 10 ) || 0 ) -\n\t\t\t\tthis.helperProportions.height -\n\t\t\t\tthis.margins.top -\n\t\t\t\tthis.margins.bottom\n\t\t];\n\t\tthis.relativeContainer = c;\n\t},\n\n\t_convertPositionTo: function( d, pos ) {\n\n\t\tif ( !pos ) {\n\t\t\tpos = this.position;\n\t\t}\n\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.top\t+\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top * mod -\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.offset.scroll.top :\n\t\t\t\t\t( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.left +\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left * mod\t-\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.offset.scroll.left :\n\t\t\t\t\t( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function( event, constrainPosition ) {\n\n\t\tvar containment, co, top, left,\n\t\t\to = this.options,\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY;\n\n\t\t// Cache the scroll\n\t\tif ( !scrollIsRootNode || !this.offset.scroll ) {\n\t\t\tthis.offset.scroll = {\n\t\t\t\ttop: this.scrollParent.scrollTop(),\n\t\t\t\tleft: this.scrollParent.scrollLeft()\n\t\t\t};\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\t// If we are not dragging yet, we won't check for options\n\t\tif ( constrainPosition ) {\n\t\t\tif ( this.containment ) {\n\t\t\t\tif ( this.relativeContainer ) {\n\t\t\t\t\tco = this.relativeContainer.offset();\n\t\t\t\t\tcontainment = [\n\t\t\t\t\t\tthis.containment[ 0 ] + co.left,\n\t\t\t\t\t\tthis.containment[ 1 ] + co.top,\n\t\t\t\t\t\tthis.containment[ 2 ] + co.left,\n\t\t\t\t\t\tthis.containment[ 3 ] + co.top\n\t\t\t\t\t];\n\t\t\t\t} else {\n\t\t\t\t\tcontainment = this.containment;\n\t\t\t\t}\n\n\t\t\t\tif ( event.pageX - this.offset.click.left < containment[ 0 ] ) {\n\t\t\t\t\tpageX = containment[ 0 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top < containment[ 1 ] ) {\n\t\t\t\t\tpageY = containment[ 1 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif ( event.pageX - this.offset.click.left > containment[ 2 ] ) {\n\t\t\t\t\tpageX = containment[ 2 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top > containment[ 3 ] ) {\n\t\t\t\t\tpageY = containment[ 3 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( o.grid ) {\n\n\t\t\t\t//Check for grid elements set to 0 to prevent divide by 0 error causing invalid\n\t\t\t\t// argument errors in IE (see ticket #6950)\n\t\t\t\ttop = o.grid[ 1 ] ? this.originalPageY + Math.round( ( pageY -\n\t\t\t\t\tthis.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY;\n\t\t\t\tpageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] ||\n\t\t\t\t\ttop - this.offset.click.top > containment[ 3 ] ) ?\n\t\t\t\t\t\ttop :\n\t\t\t\t\t\t( ( top - this.offset.click.top >= containment[ 1 ] ) ?\n\t\t\t\t\t\t\ttop - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top;\n\n\t\t\t\tleft = o.grid[ 0 ] ? this.originalPageX +\n\t\t\t\t\tMath.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] :\n\t\t\t\t\tthis.originalPageX;\n\t\t\t\tpageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] ||\n\t\t\t\t\tleft - this.offset.click.left > containment[ 2 ] ) ?\n\t\t\t\t\t\tleft :\n\t\t\t\t\t\t( ( left - this.offset.click.left >= containment[ 0 ] ) ?\n\t\t\t\t\t\t\tleft - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left;\n\t\t\t}\n\n\t\t\tif ( o.axis === \"y\" ) {\n\t\t\t\tpageX = this.originalPageX;\n\t\t\t}\n\n\t\t\tif ( o.axis === \"x\" ) {\n\t\t\t\tpageY = this.originalPageY;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageY -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.top -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top +\n\t\t\t\t( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.offset.scroll.top :\n\t\t\t\t\t( scrollIsRootNode ? 0 : this.offset.scroll.top ) )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageX -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.left -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left +\n\t\t\t\t( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.offset.scroll.left :\n\t\t\t\t\t( scrollIsRootNode ? 0 : this.offset.scroll.left ) )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_clear: function() {\n\t\tthis._removeClass( this.helper, \"ui-draggable-dragging\" );\n\t\tif ( this.helper[ 0 ] !== this.element[ 0 ] && !this.cancelHelperRemoval ) {\n\t\t\tthis.helper.remove();\n\t\t}\n\t\tthis.helper = null;\n\t\tthis.cancelHelperRemoval = false;\n\t\tif ( this.destroyOnClear ) {\n\t\t\tthis.destroy();\n\t\t}\n\t},\n\n\t// From now on bulk stuff - mainly helpers\n\n\t_trigger: function( type, event, ui ) {\n\t\tui = ui || this._uiHash();\n\t\t$.ui.plugin.call( this, type, [ event, ui, this ], true );\n\n\t\t// Absolute position and offset (see #6884 ) have to be recalculated after plugins\n\t\tif ( /^(drag|start|stop)/.test( type ) ) {\n\t\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\t\t\tui.offset = this.positionAbs;\n\t\t}\n\t\treturn $.Widget.prototype._trigger.call( this, type, event, ui );\n\t},\n\n\tplugins: {},\n\n\t_uiHash: function() {\n\t\treturn {\n\t\t\thelper: this.helper,\n\t\t\tposition: this.position,\n\t\t\toriginalPosition: this.originalPosition,\n\t\t\toffset: this.positionAbs\n\t\t};\n\t}\n\n} );\n\n$.ui.plugin.add( \"draggable\", \"connectToSortable\", {\n\tstart: function( event, ui, draggable ) {\n\t\tvar uiSortable = $.extend( {}, ui, {\n\t\t\titem: draggable.element\n\t\t} );\n\n\t\tdraggable.sortables = [];\n\t\t$( draggable.options.connectToSortable ).each( function() {\n\t\t\tvar sortable = $( this ).sortable( \"instance\" );\n\n\t\t\tif ( sortable && !sortable.options.disabled ) {\n\t\t\t\tdraggable.sortables.push( sortable );\n\n\t\t\t\t// RefreshPositions is called at drag start to refresh the containerCache\n\t\t\t\t// which is used in drag. This ensures it's initialized and synchronized\n\t\t\t\t// with any changes that might have happened on the page since initialization.\n\t\t\t\tsortable.refreshPositions();\n\t\t\t\tsortable._trigger( \"activate\", event, uiSortable );\n\t\t\t}\n\t\t} );\n\t},\n\tstop: function( event, ui, draggable ) {\n\t\tvar uiSortable = $.extend( {}, ui, {\n\t\t\titem: draggable.element\n\t\t} );\n\n\t\tdraggable.cancelHelperRemoval = false;\n\n\t\t$.each( draggable.sortables, function() {\n\t\t\tvar sortable = this;\n\n\t\t\tif ( sortable.isOver ) {\n\t\t\t\tsortable.isOver = 0;\n\n\t\t\t\t// Allow this sortable to handle removing the helper\n\t\t\t\tdraggable.cancelHelperRemoval = true;\n\t\t\t\tsortable.cancelHelperRemoval = false;\n\n\t\t\t\t// Use _storedCSS To restore properties in the sortable,\n\t\t\t\t// as this also handles revert (#9675) since the draggable\n\t\t\t\t// may have modified them in unexpected ways (#8809)\n\t\t\t\tsortable._storedCSS = {\n\t\t\t\t\tposition: sortable.placeholder.css( \"position\" ),\n\t\t\t\t\ttop: sortable.placeholder.css( \"top\" ),\n\t\t\t\t\tleft: sortable.placeholder.css( \"left\" )\n\t\t\t\t};\n\n\t\t\t\tsortable._mouseStop( event );\n\n\t\t\t\t// Once drag has ended, the sortable should return to using\n\t\t\t\t// its original helper, not the shared helper from draggable\n\t\t\t\tsortable.options.helper = sortable.options._helper;\n\t\t\t} else {\n\n\t\t\t\t// Prevent this Sortable from removing the helper.\n\t\t\t\t// However, don't set the draggable to remove the helper\n\t\t\t\t// either as another connected Sortable may yet handle the removal.\n\t\t\t\tsortable.cancelHelperRemoval = true;\n\n\t\t\t\tsortable._trigger( \"deactivate\", event, uiSortable );\n\t\t\t}\n\t\t} );\n\t},\n\tdrag: function( event, ui, draggable ) {\n\t\t$.each( draggable.sortables, function() {\n\t\t\tvar innermostIntersecting = false,\n\t\t\t\tsortable = this;\n\n\t\t\t// Copy over variables that sortable's _intersectsWith uses\n\t\t\tsortable.positionAbs = draggable.positionAbs;\n\t\t\tsortable.helperProportions = draggable.helperProportions;\n\t\t\tsortable.offset.click = draggable.offset.click;\n\n\t\t\tif ( sortable._intersectsWith( sortable.containerCache ) ) {\n\t\t\t\tinnermostIntersecting = true;\n\n\t\t\t\t$.each( draggable.sortables, function() {\n\n\t\t\t\t\t// Copy over variables that sortable's _intersectsWith uses\n\t\t\t\t\tthis.positionAbs = draggable.positionAbs;\n\t\t\t\t\tthis.helperProportions = draggable.helperProportions;\n\t\t\t\t\tthis.offset.click = draggable.offset.click;\n\n\t\t\t\t\tif ( this !== sortable &&\n\t\t\t\t\t\t\tthis._intersectsWith( this.containerCache ) &&\n\t\t\t\t\t\t\t$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {\n\t\t\t\t\t\tinnermostIntersecting = false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn innermostIntersecting;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tif ( innermostIntersecting ) {\n\n\t\t\t\t// If it intersects, we use a little isOver variable and set it once,\n\t\t\t\t// so that the move-in stuff gets fired only once.\n\t\t\t\tif ( !sortable.isOver ) {\n\t\t\t\t\tsortable.isOver = 1;\n\n\t\t\t\t\t// Store draggable's parent in case we need to reappend to it later.\n\t\t\t\t\tdraggable._parent = ui.helper.parent();\n\n\t\t\t\t\tsortable.currentItem = ui.helper\n\t\t\t\t\t\t.appendTo( sortable.element )\n\t\t\t\t\t\t.data( \"ui-sortable-item\", true );\n\n\t\t\t\t\t// Store helper option to later restore it\n\t\t\t\t\tsortable.options._helper = sortable.options.helper;\n\n\t\t\t\t\tsortable.options.helper = function() {\n\t\t\t\t\t\treturn ui.helper[ 0 ];\n\t\t\t\t\t};\n\n\t\t\t\t\t// Fire the start events of the sortable with our passed browser event,\n\t\t\t\t\t// and our own helper (so it doesn't create a new one)\n\t\t\t\t\tevent.target = sortable.currentItem[ 0 ];\n\t\t\t\t\tsortable._mouseCapture( event, true );\n\t\t\t\t\tsortable._mouseStart( event, true, true );\n\n\t\t\t\t\t// Because the browser event is way off the new appended portlet,\n\t\t\t\t\t// modify necessary variables to reflect the changes\n\t\t\t\t\tsortable.offset.click.top = draggable.offset.click.top;\n\t\t\t\t\tsortable.offset.click.left = draggable.offset.click.left;\n\t\t\t\t\tsortable.offset.parent.left -= draggable.offset.parent.left -\n\t\t\t\t\t\tsortable.offset.parent.left;\n\t\t\t\t\tsortable.offset.parent.top -= draggable.offset.parent.top -\n\t\t\t\t\t\tsortable.offset.parent.top;\n\n\t\t\t\t\tdraggable._trigger( \"toSortable\", event );\n\n\t\t\t\t\t// Inform draggable that the helper is in a valid drop zone,\n\t\t\t\t\t// used solely in the revert option to handle \"valid/invalid\".\n\t\t\t\t\tdraggable.dropped = sortable.element;\n\n\t\t\t\t\t// Need to refreshPositions of all sortables in the case that\n\t\t\t\t\t// adding to one sortable changes the location of the other sortables (#9675)\n\t\t\t\t\t$.each( draggable.sortables, function() {\n\t\t\t\t\t\tthis.refreshPositions();\n\t\t\t\t\t} );\n\n\t\t\t\t\t// Hack so receive/update callbacks work (mostly)\n\t\t\t\t\tdraggable.currentItem = draggable.element;\n\t\t\t\t\tsortable.fromOutside = draggable;\n\t\t\t\t}\n\n\t\t\t\tif ( sortable.currentItem ) {\n\t\t\t\t\tsortable._mouseDrag( event );\n\n\t\t\t\t\t// Copy the sortable's position because the draggable's can potentially reflect\n\t\t\t\t\t// a relative position, while sortable is always absolute, which the dragged\n\t\t\t\t\t// element has now become. (#8809)\n\t\t\t\t\tui.position = sortable.position;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// If it doesn't intersect with the sortable, and it intersected before,\n\t\t\t\t// we fake the drag stop of the sortable, but make sure it doesn't remove\n\t\t\t\t// the helper by using cancelHelperRemoval.\n\t\t\t\tif ( sortable.isOver ) {\n\n\t\t\t\t\tsortable.isOver = 0;\n\t\t\t\t\tsortable.cancelHelperRemoval = true;\n\n\t\t\t\t\t// Calling sortable's mouseStop would trigger a revert,\n\t\t\t\t\t// so revert must be temporarily false until after mouseStop is called.\n\t\t\t\t\tsortable.options._revert = sortable.options.revert;\n\t\t\t\t\tsortable.options.revert = false;\n\n\t\t\t\t\tsortable._trigger( \"out\", event, sortable._uiHash( sortable ) );\n\t\t\t\t\tsortable._mouseStop( event, true );\n\n\t\t\t\t\t// Restore sortable behaviors that were modfied\n\t\t\t\t\t// when the draggable entered the sortable area (#9481)\n\t\t\t\t\tsortable.options.revert = sortable.options._revert;\n\t\t\t\t\tsortable.options.helper = sortable.options._helper;\n\n\t\t\t\t\tif ( sortable.placeholder ) {\n\t\t\t\t\t\tsortable.placeholder.remove();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Restore and recalculate the draggable's offset considering the sortable\n\t\t\t\t\t// may have modified them in unexpected ways. (#8809, #10669)\n\t\t\t\t\tui.helper.appendTo( draggable._parent );\n\t\t\t\t\tdraggable._refreshOffsets( event );\n\t\t\t\t\tui.position = draggable._generatePosition( event, true );\n\n\t\t\t\t\tdraggable._trigger( \"fromSortable\", event );\n\n\t\t\t\t\t// Inform draggable that the helper is no longer in a valid drop zone\n\t\t\t\t\tdraggable.dropped = false;\n\n\t\t\t\t\t// Need to refreshPositions of all sortables just in case removing\n\t\t\t\t\t// from one sortable changes the location of other sortables (#9675)\n\t\t\t\t\t$.each( draggable.sortables, function() {\n\t\t\t\t\t\tthis.refreshPositions();\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"cursor\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( \"body\" ),\n\t\t\to = instance.options;\n\n\t\tif ( t.css( \"cursor\" ) ) {\n\t\t\to._cursor = t.css( \"cursor\" );\n\t\t}\n\t\tt.css( \"cursor\", o.cursor );\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\t\tif ( o._cursor ) {\n\t\t\t$( \"body\" ).css( \"cursor\", o._cursor );\n\t\t}\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"opacity\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( ui.helper ),\n\t\t\to = instance.options;\n\t\tif ( t.css( \"opacity\" ) ) {\n\t\t\to._opacity = t.css( \"opacity\" );\n\t\t}\n\t\tt.css( \"opacity\", o.opacity );\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\t\tif ( o._opacity ) {\n\t\t\t$( ui.helper ).css( \"opacity\", o._opacity );\n\t\t}\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"scroll\", {\n\tstart: function( event, ui, i ) {\n\t\tif ( !i.scrollParentNotHidden ) {\n\t\t\ti.scrollParentNotHidden = i.helper.scrollParent( false );\n\t\t}\n\n\t\tif ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&\n\t\t\t\ti.scrollParentNotHidden[ 0 ].tagName !== \"HTML\" ) {\n\t\t\ti.overflowOffset = i.scrollParentNotHidden.offset();\n\t\t}\n\t},\n\tdrag: function( event, ui, i  ) {\n\n\t\tvar o = i.options,\n\t\t\tscrolled = false,\n\t\t\tscrollParent = i.scrollParentNotHidden[ 0 ],\n\t\t\tdocument = i.document[ 0 ];\n\n\t\tif ( scrollParent !== document && scrollParent.tagName !== \"HTML\" ) {\n\t\t\tif ( !o.axis || o.axis !== \"x\" ) {\n\t\t\t\tif ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !o.axis || o.axis !== \"y\" ) {\n\t\t\t\tif ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( !o.axis || o.axis !== \"x\" ) {\n\t\t\t\tif ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed );\n\t\t\t\t} else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !o.axis || o.axis !== \"y\" ) {\n\t\t\t\tif ( event.pageX - $( document ).scrollLeft() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = $( document ).scrollLeft(\n\t\t\t\t\t\t$( document ).scrollLeft() - o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t} else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = $( document ).scrollLeft(\n\t\t\t\t\t\t$( document ).scrollLeft() + o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( i, event );\n\t\t}\n\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"snap\", {\n\tstart: function( event, ui, i ) {\n\n\t\tvar o = i.options;\n\n\t\ti.snapElements = [];\n\n\t\t$( o.snap.constructor !== String ? ( o.snap.items || \":data(ui-draggable)\" ) : o.snap )\n\t\t\t.each( function() {\n\t\t\t\tvar $t = $( this ),\n\t\t\t\t\t$o = $t.offset();\n\t\t\t\tif ( this !== i.element[ 0 ] ) {\n\t\t\t\t\ti.snapElements.push( {\n\t\t\t\t\t\titem: this,\n\t\t\t\t\t\twidth: $t.outerWidth(), height: $t.outerHeight(),\n\t\t\t\t\t\ttop: $o.top, left: $o.left\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\n\t},\n\tdrag: function( event, ui, inst ) {\n\n\t\tvar ts, bs, ls, rs, l, r, t, b, i, first,\n\t\t\to = inst.options,\n\t\t\td = o.snapTolerance,\n\t\t\tx1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,\n\t\t\ty1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;\n\n\t\tfor ( i = inst.snapElements.length - 1; i >= 0; i-- ) {\n\n\t\t\tl = inst.snapElements[ i ].left - inst.margins.left;\n\t\t\tr = l + inst.snapElements[ i ].width;\n\t\t\tt = inst.snapElements[ i ].top - inst.margins.top;\n\t\t\tb = t + inst.snapElements[ i ].height;\n\n\t\t\tif ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d ||\n\t\t\t\t\t!$.contains( inst.snapElements[ i ].item.ownerDocument,\n\t\t\t\t\tinst.snapElements[ i ].item ) ) {\n\t\t\t\tif ( inst.snapElements[ i ].snapping ) {\n\t\t\t\t\t( inst.options.snap.release &&\n\t\t\t\t\t\tinst.options.snap.release.call(\n\t\t\t\t\t\t\tinst.element,\n\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t$.extend( inst._uiHash(), { snapItem: inst.snapElements[ i ].item } )\n\t\t\t\t\t\t) );\n\t\t\t\t}\n\t\t\t\tinst.snapElements[ i ].snapping = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( o.snapMode !== \"inner\" ) {\n\t\t\t\tts = Math.abs( t - y2 ) <= d;\n\t\t\t\tbs = Math.abs( b - y1 ) <= d;\n\t\t\t\tls = Math.abs( l - x2 ) <= d;\n\t\t\t\trs = Math.abs( r - x1 ) <= d;\n\t\t\t\tif ( ts ) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: t - inst.helperProportions.height,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t} ).top;\n\t\t\t\t}\n\t\t\t\tif ( bs ) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: b,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t} ).top;\n\t\t\t\t}\n\t\t\t\tif ( ls ) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: l - inst.helperProportions.width\n\t\t\t\t\t} ).left;\n\t\t\t\t}\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: r\n\t\t\t\t\t} ).left;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfirst = ( ts || bs || ls || rs );\n\n\t\t\tif ( o.snapMode !== \"outer\" ) {\n\t\t\t\tts = Math.abs( t - y1 ) <= d;\n\t\t\t\tbs = Math.abs( b - y2 ) <= d;\n\t\t\t\tls = Math.abs( l - x1 ) <= d;\n\t\t\t\trs = Math.abs( r - x2 ) <= d;\n\t\t\t\tif ( ts ) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: t,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t} ).top;\n\t\t\t\t}\n\t\t\t\tif ( bs ) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: b - inst.helperProportions.height,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t} ).top;\n\t\t\t\t}\n\t\t\t\tif ( ls ) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: l\n\t\t\t\t\t} ).left;\n\t\t\t\t}\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: r - inst.helperProportions.width\n\t\t\t\t\t} ).left;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !inst.snapElements[ i ].snapping && ( ts || bs || ls || rs || first ) ) {\n\t\t\t\t( inst.options.snap.snap &&\n\t\t\t\t\tinst.options.snap.snap.call(\n\t\t\t\t\t\tinst.element,\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\t$.extend( inst._uiHash(), {\n\t\t\t\t\t\t\tsnapItem: inst.snapElements[ i ].item\n\t\t\t\t\t\t} ) ) );\n\t\t\t}\n\t\t\tinst.snapElements[ i ].snapping = ( ts || bs || ls || rs || first );\n\n\t\t}\n\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"stack\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar min,\n\t\t\to = instance.options,\n\t\t\tgroup = $.makeArray( $( o.stack ) ).sort( function( a, b ) {\n\t\t\t\treturn ( parseInt( $( a ).css( \"zIndex\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( b ).css( \"zIndex\" ), 10 ) || 0 );\n\t\t\t} );\n\n\t\tif ( !group.length ) { return; }\n\n\t\tmin = parseInt( $( group[ 0 ] ).css( \"zIndex\" ), 10 ) || 0;\n\t\t$( group ).each( function( i ) {\n\t\t\t$( this ).css( \"zIndex\", min + i );\n\t\t} );\n\t\tthis.css( \"zIndex\", ( min + group.length ) );\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"zIndex\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( ui.helper ),\n\t\t\to = instance.options;\n\n\t\tif ( t.css( \"zIndex\" ) ) {\n\t\t\to._zIndex = t.css( \"zIndex\" );\n\t\t}\n\t\tt.css( \"zIndex\", o.zIndex );\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\n\t\tif ( o._zIndex ) {\n\t\t\t$( ui.helper ).css( \"zIndex\", o._zIndex );\n\t\t}\n\t}\n} );\n\nvar widgetsDraggable = $.ui.draggable;\n\n\n/*!\n * jQuery UI Droppable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Droppable\n//>>group: Interactions\n//>>description: Enables drop targets for draggable elements.\n//>>docs: http://api.jqueryui.com/droppable/\n//>>demos: http://jqueryui.com/droppable/\n\n\n\n$.widget( \"ui.droppable\", {\n\tversion: \"1.12.1\",\n\twidgetEventPrefix: \"drop\",\n\toptions: {\n\t\taccept: \"*\",\n\t\taddClasses: true,\n\t\tgreedy: false,\n\t\tscope: \"default\",\n\t\ttolerance: \"intersect\",\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tdeactivate: null,\n\t\tdrop: null,\n\t\tout: null,\n\t\tover: null\n\t},\n\t_create: function() {\n\n\t\tvar proportions,\n\t\t\to = this.options,\n\t\t\taccept = o.accept;\n\n\t\tthis.isover = false;\n\t\tthis.isout = true;\n\n\t\tthis.accept = $.isFunction( accept ) ? accept : function( d ) {\n\t\t\treturn d.is( accept );\n\t\t};\n\n\t\tthis.proportions = function( /* valueToWrite */ ) {\n\t\t\tif ( arguments.length ) {\n\n\t\t\t\t// Store the droppable's proportions\n\t\t\t\tproportions = arguments[ 0 ];\n\t\t\t} else {\n\n\t\t\t\t// Retrieve or derive the droppable's proportions\n\t\t\t\treturn proportions ?\n\t\t\t\t\tproportions :\n\t\t\t\t\tproportions = {\n\t\t\t\t\t\twidth: this.element[ 0 ].offsetWidth,\n\t\t\t\t\t\theight: this.element[ 0 ].offsetHeight\n\t\t\t\t\t};\n\t\t\t}\n\t\t};\n\n\t\tthis._addToManager( o.scope );\n\n\t\to.addClasses && this._addClass( \"ui-droppable\" );\n\n\t},\n\n\t_addToManager: function( scope ) {\n\n\t\t// Add the reference and positions to the manager\n\t\t$.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];\n\t\t$.ui.ddmanager.droppables[ scope ].push( this );\n\t},\n\n\t_splice: function( drop ) {\n\t\tvar i = 0;\n\t\tfor ( ; i < drop.length; i++ ) {\n\t\t\tif ( drop[ i ] === this ) {\n\t\t\t\tdrop.splice( i, 1 );\n\t\t\t}\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tvar drop = $.ui.ddmanager.droppables[ this.options.scope ];\n\n\t\tthis._splice( drop );\n\t},\n\n\t_setOption: function( key, value ) {\n\n\t\tif ( key === \"accept\" ) {\n\t\t\tthis.accept = $.isFunction( value ) ? value : function( d ) {\n\t\t\t\treturn d.is( value );\n\t\t\t};\n\t\t} else if ( key === \"scope\" ) {\n\t\t\tvar drop = $.ui.ddmanager.droppables[ this.options.scope ];\n\n\t\t\tthis._splice( drop );\n\t\t\tthis._addToManager( value );\n\t\t}\n\n\t\tthis._super( key, value );\n\t},\n\n\t_activate: function( event ) {\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\tthis._addActiveClass();\n\t\tif ( draggable ) {\n\t\t\tthis._trigger( \"activate\", event, this.ui( draggable ) );\n\t\t}\n\t},\n\n\t_deactivate: function( event ) {\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\tthis._removeActiveClass();\n\t\tif ( draggable ) {\n\t\t\tthis._trigger( \"deactivate\", event, this.ui( draggable ) );\n\t\t}\n\t},\n\n\t_over: function( event ) {\n\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\t// Bail if draggable and droppable are same element\n\t\tif ( !draggable || ( draggable.currentItem ||\n\t\t\t\tdraggable.element )[ 0 ] === this.element[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||\n\t\t\t\tdraggable.element ) ) ) {\n\t\t\tthis._addHoverClass();\n\t\t\tthis._trigger( \"over\", event, this.ui( draggable ) );\n\t\t}\n\n\t},\n\n\t_out: function( event ) {\n\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\t// Bail if draggable and droppable are same element\n\t\tif ( !draggable || ( draggable.currentItem ||\n\t\t\t\tdraggable.element )[ 0 ] === this.element[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||\n\t\t\t\tdraggable.element ) ) ) {\n\t\t\tthis._removeHoverClass();\n\t\t\tthis._trigger( \"out\", event, this.ui( draggable ) );\n\t\t}\n\n\t},\n\n\t_drop: function( event, custom ) {\n\n\t\tvar draggable = custom || $.ui.ddmanager.current,\n\t\t\tchildrenIntersection = false;\n\n\t\t// Bail if draggable and droppable are same element\n\t\tif ( !draggable || ( draggable.currentItem ||\n\t\t\t\tdraggable.element )[ 0 ] === this.element[ 0 ] ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.element\n\t\t\t.find( \":data(ui-droppable)\" )\n\t\t\t.not( \".ui-draggable-dragging\" )\n\t\t\t.each( function() {\n\t\t\t\tvar inst = $( this ).droppable( \"instance\" );\n\t\t\t\tif (\n\t\t\t\t\tinst.options.greedy &&\n\t\t\t\t\t!inst.options.disabled &&\n\t\t\t\t\tinst.options.scope === draggable.options.scope &&\n\t\t\t\t\tinst.accept.call(\n\t\t\t\t\t\tinst.element[ 0 ], ( draggable.currentItem || draggable.element )\n\t\t\t\t\t) &&\n\t\t\t\t\tintersect(\n\t\t\t\t\t\tdraggable,\n\t\t\t\t\t\t$.extend( inst, { offset: inst.element.offset() } ),\n\t\t\t\t\t\tinst.options.tolerance, event\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tchildrenIntersection = true;\n\t\t\t\t\treturn false; }\n\t\t\t} );\n\t\tif ( childrenIntersection ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( this.accept.call( this.element[ 0 ],\n\t\t\t\t( draggable.currentItem || draggable.element ) ) ) {\n\t\t\tthis._removeActiveClass();\n\t\t\tthis._removeHoverClass();\n\n\t\t\tthis._trigger( \"drop\", event, this.ui( draggable ) );\n\t\t\treturn this.element;\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tui: function( c ) {\n\t\treturn {\n\t\t\tdraggable: ( c.currentItem || c.element ),\n\t\t\thelper: c.helper,\n\t\t\tposition: c.position,\n\t\t\toffset: c.positionAbs\n\t\t};\n\t},\n\n\t// Extension points just to make backcompat sane and avoid duplicating logic\n\t// TODO: Remove in 1.13 along with call to it below\n\t_addHoverClass: function() {\n\t\tthis._addClass( \"ui-droppable-hover\" );\n\t},\n\n\t_removeHoverClass: function() {\n\t\tthis._removeClass( \"ui-droppable-hover\" );\n\t},\n\n\t_addActiveClass: function() {\n\t\tthis._addClass( \"ui-droppable-active\" );\n\t},\n\n\t_removeActiveClass: function() {\n\t\tthis._removeClass( \"ui-droppable-active\" );\n\t}\n} );\n\nvar intersect = $.ui.intersect = ( function() {\n\tfunction isOverAxis( x, reference, size ) {\n\t\treturn ( x >= reference ) && ( x < ( reference + size ) );\n\t}\n\n\treturn function( draggable, droppable, toleranceMode, event ) {\n\n\t\tif ( !droppable.offset ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar x1 = ( draggable.positionAbs ||\n\t\t\t\tdraggable.position.absolute ).left + draggable.margins.left,\n\t\t\ty1 = ( draggable.positionAbs ||\n\t\t\t\tdraggable.position.absolute ).top + draggable.margins.top,\n\t\t\tx2 = x1 + draggable.helperProportions.width,\n\t\t\ty2 = y1 + draggable.helperProportions.height,\n\t\t\tl = droppable.offset.left,\n\t\t\tt = droppable.offset.top,\n\t\t\tr = l + droppable.proportions().width,\n\t\t\tb = t + droppable.proportions().height;\n\n\t\tswitch ( toleranceMode ) {\n\t\tcase \"fit\":\n\t\t\treturn ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );\n\t\tcase \"intersect\":\n\t\t\treturn ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half\n\t\t\t\tx2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half\n\t\t\t\tt < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half\n\t\t\t\ty2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half\n\t\tcase \"pointer\":\n\t\t\treturn isOverAxis( event.pageY, t, droppable.proportions().height ) &&\n\t\t\t\tisOverAxis( event.pageX, l, droppable.proportions().width );\n\t\tcase \"touch\":\n\t\t\treturn (\n\t\t\t\t( y1 >= t && y1 <= b ) || // Top edge touching\n\t\t\t\t( y2 >= t && y2 <= b ) || // Bottom edge touching\n\t\t\t\t( y1 < t && y2 > b ) // Surrounded vertically\n\t\t\t) && (\n\t\t\t\t( x1 >= l && x1 <= r ) || // Left edge touching\n\t\t\t\t( x2 >= l && x2 <= r ) || // Right edge touching\n\t\t\t\t( x1 < l && x2 > r ) // Surrounded horizontally\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t};\n} )();\n\n/*\n\tThis manager tracks offsets of draggables and droppables\n*/\n$.ui.ddmanager = {\n\tcurrent: null,\n\tdroppables: { \"default\": [] },\n\tprepareOffsets: function( t, event ) {\n\n\t\tvar i, j,\n\t\t\tm = $.ui.ddmanager.droppables[ t.options.scope ] || [],\n\t\t\ttype = event ? event.type : null, // workaround for #2317\n\t\t\tlist = ( t.currentItem || t.element ).find( \":data(ui-droppable)\" ).addBack();\n\n\t\tdroppablesLoop: for ( i = 0; i < m.length; i++ ) {\n\n\t\t\t// No disabled and non-accepted\n\t\t\tif ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ],\n\t\t\t\t\t( t.currentItem || t.element ) ) ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Filter out elements in the current dragged item\n\t\t\tfor ( j = 0; j < list.length; j++ ) {\n\t\t\t\tif ( list[ j ] === m[ i ].element[ 0 ] ) {\n\t\t\t\t\tm[ i ].proportions().height = 0;\n\t\t\t\t\tcontinue droppablesLoop;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tm[ i ].visible = m[ i ].element.css( \"display\" ) !== \"none\";\n\t\t\tif ( !m[ i ].visible ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Activate the droppable if used directly from draggables\n\t\t\tif ( type === \"mousedown\" ) {\n\t\t\t\tm[ i ]._activate.call( m[ i ], event );\n\t\t\t}\n\n\t\t\tm[ i ].offset = m[ i ].element.offset();\n\t\t\tm[ i ].proportions( {\n\t\t\t\twidth: m[ i ].element[ 0 ].offsetWidth,\n\t\t\t\theight: m[ i ].element[ 0 ].offsetHeight\n\t\t\t} );\n\n\t\t}\n\n\t},\n\tdrop: function( draggable, event ) {\n\n\t\tvar dropped = false;\n\n\t\t// Create a copy of the droppables in case the list changes during the drop (#9116)\n\t\t$.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {\n\n\t\t\tif ( !this.options ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( !this.options.disabled && this.visible &&\n\t\t\t\t\tintersect( draggable, this, this.options.tolerance, event ) ) {\n\t\t\t\tdropped = this._drop.call( this, event ) || dropped;\n\t\t\t}\n\n\t\t\tif ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ],\n\t\t\t\t\t( draggable.currentItem || draggable.element ) ) ) {\n\t\t\t\tthis.isout = true;\n\t\t\t\tthis.isover = false;\n\t\t\t\tthis._deactivate.call( this, event );\n\t\t\t}\n\n\t\t} );\n\t\treturn dropped;\n\n\t},\n\tdragStart: function( draggable, event ) {\n\n\t\t// Listen for scrolling so that if the dragging causes scrolling the position of the\n\t\t// droppables can be recalculated (see #5003)\n\t\tdraggable.element.parentsUntil( \"body\" ).on( \"scroll.droppable\", function() {\n\t\t\tif ( !draggable.options.refreshPositions ) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\n\t\t\t}\n\t\t} );\n\t},\n\tdrag: function( draggable, event ) {\n\n\t\t// If you have a highly dynamic page, you might try this option. It renders positions\n\t\t// every time you move the mouse.\n\t\tif ( draggable.options.refreshPositions ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\n\t\t}\n\n\t\t// Run through all droppables and check their positions based on specific tolerance options\n\t\t$.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {\n\n\t\t\tif ( this.options.disabled || this.greedyChild || !this.visible ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar parentInstance, scope, parent,\n\t\t\t\tintersects = intersect( draggable, this, this.options.tolerance, event ),\n\t\t\t\tc = !intersects && this.isover ?\n\t\t\t\t\t\"isout\" :\n\t\t\t\t\t( intersects && !this.isover ? \"isover\" : null );\n\t\t\tif ( !c ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.options.greedy ) {\n\n\t\t\t\t// find droppable parents with same scope\n\t\t\t\tscope = this.options.scope;\n\t\t\t\tparent = this.element.parents( \":data(ui-droppable)\" ).filter( function() {\n\t\t\t\t\treturn $( this ).droppable( \"instance\" ).options.scope === scope;\n\t\t\t\t} );\n\n\t\t\t\tif ( parent.length ) {\n\t\t\t\t\tparentInstance = $( parent[ 0 ] ).droppable( \"instance\" );\n\t\t\t\t\tparentInstance.greedyChild = ( c === \"isover\" );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// We just moved into a greedy child\n\t\t\tif ( parentInstance && c === \"isover\" ) {\n\t\t\t\tparentInstance.isover = false;\n\t\t\t\tparentInstance.isout = true;\n\t\t\t\tparentInstance._out.call( parentInstance, event );\n\t\t\t}\n\n\t\t\tthis[ c ] = true;\n\t\t\tthis[ c === \"isout\" ? \"isover\" : \"isout\" ] = false;\n\t\t\tthis[ c === \"isover\" ? \"_over\" : \"_out\" ].call( this, event );\n\n\t\t\t// We just moved out of a greedy child\n\t\t\tif ( parentInstance && c === \"isout\" ) {\n\t\t\t\tparentInstance.isout = false;\n\t\t\t\tparentInstance.isover = true;\n\t\t\t\tparentInstance._over.call( parentInstance, event );\n\t\t\t}\n\t\t} );\n\n\t},\n\tdragStop: function( draggable, event ) {\n\t\tdraggable.element.parentsUntil( \"body\" ).off( \"scroll.droppable\" );\n\n\t\t// Call prepareOffsets one final time since IE does not fire return scroll events when\n\t\t// overflow was caused by drag (see #5003)\n\t\tif ( !draggable.options.refreshPositions ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\n\t\t}\n\t}\n};\n\n// DEPRECATED\n// TODO: switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for activeClass and hoverClass options\n\t$.widget( \"ui.droppable\", $.ui.droppable, {\n\t\toptions: {\n\t\t\thoverClass: false,\n\t\t\tactiveClass: false\n\t\t},\n\t\t_addActiveClass: function() {\n\t\t\tthis._super();\n\t\t\tif ( this.options.activeClass ) {\n\t\t\t\tthis.element.addClass( this.options.activeClass );\n\t\t\t}\n\t\t},\n\t\t_removeActiveClass: function() {\n\t\t\tthis._super();\n\t\t\tif ( this.options.activeClass ) {\n\t\t\t\tthis.element.removeClass( this.options.activeClass );\n\t\t\t}\n\t\t},\n\t\t_addHoverClass: function() {\n\t\t\tthis._super();\n\t\t\tif ( this.options.hoverClass ) {\n\t\t\t\tthis.element.addClass( this.options.hoverClass );\n\t\t\t}\n\t\t},\n\t\t_removeHoverClass: function() {\n\t\t\tthis._super();\n\t\t\tif ( this.options.hoverClass ) {\n\t\t\t\tthis.element.removeClass( this.options.hoverClass );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nvar widgetsDroppable = $.ui.droppable;\n\n\n/*!\n * jQuery UI Resizable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Resizable\n//>>group: Interactions\n//>>description: Enables resize functionality for any element.\n//>>docs: http://api.jqueryui.com/resizable/\n//>>demos: http://jqueryui.com/resizable/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/resizable.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.resizable\", $.ui.mouse, {\n\tversion: \"1.12.1\",\n\twidgetEventPrefix: \"resize\",\n\toptions: {\n\t\talsoResize: false,\n\t\tanimate: false,\n\t\tanimateDuration: \"slow\",\n\t\tanimateEasing: \"swing\",\n\t\taspectRatio: false,\n\t\tautoHide: false,\n\t\tclasses: {\n\t\t\t\"ui-resizable-se\": \"ui-icon ui-icon-gripsmall-diagonal-se\"\n\t\t},\n\t\tcontainment: false,\n\t\tghost: false,\n\t\tgrid: false,\n\t\thandles: \"e,s,se\",\n\t\thelper: false,\n\t\tmaxHeight: null,\n\t\tmaxWidth: null,\n\t\tminHeight: 10,\n\t\tminWidth: 10,\n\n\t\t// See #7960\n\t\tzIndex: 90,\n\n\t\t// Callbacks\n\t\tresize: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t_num: function( value ) {\n\t\treturn parseFloat( value ) || 0;\n\t},\n\n\t_isNumber: function( value ) {\n\t\treturn !isNaN( parseFloat( value ) );\n\t},\n\n\t_hasScroll: function( el, a ) {\n\n\t\tif ( $( el ).css( \"overflow\" ) === \"hidden\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar scroll = ( a && a === \"left\" ) ? \"scrollLeft\" : \"scrollTop\",\n\t\t\thas = false;\n\n\t\tif ( el[ scroll ] > 0 ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// TODO: determine which cases actually cause this to happen\n\t\t// if the element doesn't have the scroll set, see if it's possible to\n\t\t// set the scroll\n\t\tel[ scroll ] = 1;\n\t\thas = ( el[ scroll ] > 0 );\n\t\tel[ scroll ] = 0;\n\t\treturn has;\n\t},\n\n\t_create: function() {\n\n\t\tvar margins,\n\t\t\to = this.options,\n\t\t\tthat = this;\n\t\tthis._addClass( \"ui-resizable\" );\n\n\t\t$.extend( this, {\n\t\t\t_aspectRatio: !!( o.aspectRatio ),\n\t\t\taspectRatio: o.aspectRatio,\n\t\t\toriginalElement: this.element,\n\t\t\t_proportionallyResizeElements: [],\n\t\t\t_helper: o.helper || o.ghost || o.animate ? o.helper || \"ui-resizable-helper\" : null\n\t\t} );\n\n\t\t// Wrap the element if it cannot hold child nodes\n\t\tif ( this.element[ 0 ].nodeName.match( /^(canvas|textarea|input|select|button|img)$/i ) ) {\n\n\t\t\tthis.element.wrap(\n\t\t\t\t$( \"<div class='ui-wrapper' style='overflow: hidden;'></div>\" ).css( {\n\t\t\t\t\tposition: this.element.css( \"position\" ),\n\t\t\t\t\twidth: this.element.outerWidth(),\n\t\t\t\t\theight: this.element.outerHeight(),\n\t\t\t\t\ttop: this.element.css( \"top\" ),\n\t\t\t\t\tleft: this.element.css( \"left\" )\n\t\t\t\t} )\n\t\t\t);\n\n\t\t\tthis.element = this.element.parent().data(\n\t\t\t\t\"ui-resizable\", this.element.resizable( \"instance\" )\n\t\t\t);\n\n\t\t\tthis.elementIsWrapper = true;\n\n\t\t\tmargins = {\n\t\t\t\tmarginTop: this.originalElement.css( \"marginTop\" ),\n\t\t\t\tmarginRight: this.originalElement.css( \"marginRight\" ),\n\t\t\t\tmarginBottom: this.originalElement.css( \"marginBottom\" ),\n\t\t\t\tmarginLeft: this.originalElement.css( \"marginLeft\" )\n\t\t\t};\n\n\t\t\tthis.element.css( margins );\n\t\t\tthis.originalElement.css( \"margin\", 0 );\n\n\t\t\t// support: Safari\n\t\t\t// Prevent Safari textarea resize\n\t\t\tthis.originalResizeStyle = this.originalElement.css( \"resize\" );\n\t\t\tthis.originalElement.css( \"resize\", \"none\" );\n\n\t\t\tthis._proportionallyResizeElements.push( this.originalElement.css( {\n\t\t\t\tposition: \"static\",\n\t\t\t\tzoom: 1,\n\t\t\t\tdisplay: \"block\"\n\t\t\t} ) );\n\n\t\t\t// Support: IE9\n\t\t\t// avoid IE jump (hard set the margin)\n\t\t\tthis.originalElement.css( margins );\n\n\t\t\tthis._proportionallyResize();\n\t\t}\n\n\t\tthis._setupHandles();\n\n\t\tif ( o.autoHide ) {\n\t\t\t$( this.element )\n\t\t\t\t.on( \"mouseenter\", function() {\n\t\t\t\t\tif ( o.disabled ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthat._removeClass( \"ui-resizable-autohide\" );\n\t\t\t\t\tthat._handles.show();\n\t\t\t\t} )\n\t\t\t\t.on( \"mouseleave\", function() {\n\t\t\t\t\tif ( o.disabled ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif ( !that.resizing ) {\n\t\t\t\t\t\tthat._addClass( \"ui-resizable-autohide\" );\n\t\t\t\t\t\tthat._handles.hide();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}\n\n\t\tthis._mouseInit();\n\t},\n\n\t_destroy: function() {\n\n\t\tthis._mouseDestroy();\n\n\t\tvar wrapper,\n\t\t\t_destroy = function( exp ) {\n\t\t\t\t$( exp )\n\t\t\t\t\t.removeData( \"resizable\" )\n\t\t\t\t\t.removeData( \"ui-resizable\" )\n\t\t\t\t\t.off( \".resizable\" )\n\t\t\t\t\t.find( \".ui-resizable-handle\" )\n\t\t\t\t\t\t.remove();\n\t\t\t};\n\n\t\t// TODO: Unwrap at same DOM position\n\t\tif ( this.elementIsWrapper ) {\n\t\t\t_destroy( this.element );\n\t\t\twrapper = this.element;\n\t\t\tthis.originalElement.css( {\n\t\t\t\tposition: wrapper.css( \"position\" ),\n\t\t\t\twidth: wrapper.outerWidth(),\n\t\t\t\theight: wrapper.outerHeight(),\n\t\t\t\ttop: wrapper.css( \"top\" ),\n\t\t\t\tleft: wrapper.css( \"left\" )\n\t\t\t} ).insertAfter( wrapper );\n\t\t\twrapper.remove();\n\t\t}\n\n\t\tthis.originalElement.css( \"resize\", this.originalResizeStyle );\n\t\t_destroy( this.originalElement );\n\n\t\treturn this;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\n\t\tswitch ( key ) {\n\t\tcase \"handles\":\n\t\t\tthis._removeHandles();\n\t\t\tthis._setupHandles();\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t},\n\n\t_setupHandles: function() {\n\t\tvar o = this.options, handle, i, n, hname, axis, that = this;\n\t\tthis.handles = o.handles ||\n\t\t\t( !$( \".ui-resizable-handle\", this.element ).length ?\n\t\t\t\t\"e,s,se\" : {\n\t\t\t\t\tn: \".ui-resizable-n\",\n\t\t\t\t\te: \".ui-resizable-e\",\n\t\t\t\t\ts: \".ui-resizable-s\",\n\t\t\t\t\tw: \".ui-resizable-w\",\n\t\t\t\t\tse: \".ui-resizable-se\",\n\t\t\t\t\tsw: \".ui-resizable-sw\",\n\t\t\t\t\tne: \".ui-resizable-ne\",\n\t\t\t\t\tnw: \".ui-resizable-nw\"\n\t\t\t\t} );\n\n\t\tthis._handles = $();\n\t\tif ( this.handles.constructor === String ) {\n\n\t\t\tif ( this.handles === \"all\" ) {\n\t\t\t\tthis.handles = \"n,e,s,w,se,sw,ne,nw\";\n\t\t\t}\n\n\t\t\tn = this.handles.split( \",\" );\n\t\t\tthis.handles = {};\n\n\t\t\tfor ( i = 0; i < n.length; i++ ) {\n\n\t\t\t\thandle = $.trim( n[ i ] );\n\t\t\t\thname = \"ui-resizable-\" + handle;\n\t\t\t\taxis = $( \"<div>\" );\n\t\t\t\tthis._addClass( axis, \"ui-resizable-handle \" + hname );\n\n\t\t\t\taxis.css( { zIndex: o.zIndex } );\n\n\t\t\t\tthis.handles[ handle ] = \".ui-resizable-\" + handle;\n\t\t\t\tthis.element.append( axis );\n\t\t\t}\n\n\t\t}\n\n\t\tthis._renderAxis = function( target ) {\n\n\t\t\tvar i, axis, padPos, padWrapper;\n\n\t\t\ttarget = target || this.element;\n\n\t\t\tfor ( i in this.handles ) {\n\n\t\t\t\tif ( this.handles[ i ].constructor === String ) {\n\t\t\t\t\tthis.handles[ i ] = this.element.children( this.handles[ i ] ).first().show();\n\t\t\t\t} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {\n\t\t\t\t\tthis.handles[ i ] = $( this.handles[ i ] );\n\t\t\t\t\tthis._on( this.handles[ i ], { \"mousedown\": that._mouseDown } );\n\t\t\t\t}\n\n\t\t\t\tif ( this.elementIsWrapper &&\n\t\t\t\t\t\tthis.originalElement[ 0 ]\n\t\t\t\t\t\t\t.nodeName\n\t\t\t\t\t\t\t.match( /^(textarea|input|select|button)$/i ) ) {\n\t\t\t\t\taxis = $( this.handles[ i ], this.element );\n\n\t\t\t\t\tpadWrapper = /sw|ne|nw|se|n|s/.test( i ) ?\n\t\t\t\t\t\taxis.outerHeight() :\n\t\t\t\t\t\taxis.outerWidth();\n\n\t\t\t\t\tpadPos = [ \"padding\",\n\t\t\t\t\t\t/ne|nw|n/.test( i ) ? \"Top\" :\n\t\t\t\t\t\t/se|sw|s/.test( i ) ? \"Bottom\" :\n\t\t\t\t\t\t/^e$/.test( i ) ? \"Right\" : \"Left\" ].join( \"\" );\n\n\t\t\t\t\ttarget.css( padPos, padWrapper );\n\n\t\t\t\t\tthis._proportionallyResize();\n\t\t\t\t}\n\n\t\t\t\tthis._handles = this._handles.add( this.handles[ i ] );\n\t\t\t}\n\t\t};\n\n\t\t// TODO: make renderAxis a prototype function\n\t\tthis._renderAxis( this.element );\n\n\t\tthis._handles = this._handles.add( this.element.find( \".ui-resizable-handle\" ) );\n\t\tthis._handles.disableSelection();\n\n\t\tthis._handles.on( \"mouseover\", function() {\n\t\t\tif ( !that.resizing ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\taxis = this.className.match( /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i );\n\t\t\t\t}\n\t\t\t\tthat.axis = axis && axis[ 1 ] ? axis[ 1 ] : \"se\";\n\t\t\t}\n\t\t} );\n\n\t\tif ( o.autoHide ) {\n\t\t\tthis._handles.hide();\n\t\t\tthis._addClass( \"ui-resizable-autohide\" );\n\t\t}\n\t},\n\n\t_removeHandles: function() {\n\t\tthis._handles.remove();\n\t},\n\n\t_mouseCapture: function( event ) {\n\t\tvar i, handle,\n\t\t\tcapture = false;\n\n\t\tfor ( i in this.handles ) {\n\t\t\thandle = $( this.handles[ i ] )[ 0 ];\n\t\t\tif ( handle === event.target || $.contains( handle, event.target ) ) {\n\t\t\t\tcapture = true;\n\t\t\t}\n\t\t}\n\n\t\treturn !this.options.disabled && capture;\n\t},\n\n\t_mouseStart: function( event ) {\n\n\t\tvar curleft, curtop, cursor,\n\t\t\to = this.options,\n\t\t\tel = this.element;\n\n\t\tthis.resizing = true;\n\n\t\tthis._renderProxy();\n\n\t\tcurleft = this._num( this.helper.css( \"left\" ) );\n\t\tcurtop = this._num( this.helper.css( \"top\" ) );\n\n\t\tif ( o.containment ) {\n\t\t\tcurleft += $( o.containment ).scrollLeft() || 0;\n\t\t\tcurtop += $( o.containment ).scrollTop() || 0;\n\t\t}\n\n\t\tthis.offset = this.helper.offset();\n\t\tthis.position = { left: curleft, top: curtop };\n\n\t\tthis.size = this._helper ? {\n\t\t\t\twidth: this.helper.width(),\n\t\t\t\theight: this.helper.height()\n\t\t\t} : {\n\t\t\t\twidth: el.width(),\n\t\t\t\theight: el.height()\n\t\t\t};\n\n\t\tthis.originalSize = this._helper ? {\n\t\t\t\twidth: el.outerWidth(),\n\t\t\t\theight: el.outerHeight()\n\t\t\t} : {\n\t\t\t\twidth: el.width(),\n\t\t\t\theight: el.height()\n\t\t\t};\n\n\t\tthis.sizeDiff = {\n\t\t\twidth: el.outerWidth() - el.width(),\n\t\t\theight: el.outerHeight() - el.height()\n\t\t};\n\n\t\tthis.originalPosition = { left: curleft, top: curtop };\n\t\tthis.originalMousePosition = { left: event.pageX, top: event.pageY };\n\n\t\tthis.aspectRatio = ( typeof o.aspectRatio === \"number\" ) ?\n\t\t\to.aspectRatio :\n\t\t\t( ( this.originalSize.width / this.originalSize.height ) || 1 );\n\n\t\tcursor = $( \".ui-resizable-\" + this.axis ).css( \"cursor\" );\n\t\t$( \"body\" ).css( \"cursor\", cursor === \"auto\" ? this.axis + \"-resize\" : cursor );\n\n\t\tthis._addClass( \"ui-resizable-resizing\" );\n\t\tthis._propagate( \"start\", event );\n\t\treturn true;\n\t},\n\n\t_mouseDrag: function( event ) {\n\n\t\tvar data, props,\n\t\t\tsmp = this.originalMousePosition,\n\t\t\ta = this.axis,\n\t\t\tdx = ( event.pageX - smp.left ) || 0,\n\t\t\tdy = ( event.pageY - smp.top ) || 0,\n\t\t\ttrigger = this._change[ a ];\n\n\t\tthis._updatePrevProperties();\n\n\t\tif ( !trigger ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tdata = trigger.apply( this, [ event, dx, dy ] );\n\n\t\tthis._updateVirtualBoundaries( event.shiftKey );\n\t\tif ( this._aspectRatio || event.shiftKey ) {\n\t\t\tdata = this._updateRatio( data, event );\n\t\t}\n\n\t\tdata = this._respectSize( data, event );\n\n\t\tthis._updateCache( data );\n\n\t\tthis._propagate( \"resize\", event );\n\n\t\tprops = this._applyChanges();\n\n\t\tif ( !this._helper && this._proportionallyResizeElements.length ) {\n\t\t\tthis._proportionallyResize();\n\t\t}\n\n\t\tif ( !$.isEmptyObject( props ) ) {\n\t\t\tthis._updatePrevProperties();\n\t\t\tthis._trigger( \"resize\", event, this.ui() );\n\t\t\tthis._applyChanges();\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function( event ) {\n\n\t\tthis.resizing = false;\n\t\tvar pr, ista, soffseth, soffsetw, s, left, top,\n\t\t\to = this.options, that = this;\n\n\t\tif ( this._helper ) {\n\n\t\t\tpr = this._proportionallyResizeElements;\n\t\t\tista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName );\n\t\t\tsoffseth = ista && this._hasScroll( pr[ 0 ], \"left\" ) ? 0 : that.sizeDiff.height;\n\t\t\tsoffsetw = ista ? 0 : that.sizeDiff.width;\n\n\t\t\ts = {\n\t\t\t\twidth: ( that.helper.width()  - soffsetw ),\n\t\t\t\theight: ( that.helper.height() - soffseth )\n\t\t\t};\n\t\t\tleft = ( parseFloat( that.element.css( \"left\" ) ) +\n\t\t\t\t( that.position.left - that.originalPosition.left ) ) || null;\n\t\t\ttop = ( parseFloat( that.element.css( \"top\" ) ) +\n\t\t\t\t( that.position.top - that.originalPosition.top ) ) || null;\n\n\t\t\tif ( !o.animate ) {\n\t\t\t\tthis.element.css( $.extend( s, { top: top, left: left } ) );\n\t\t\t}\n\n\t\t\tthat.helper.height( that.size.height );\n\t\t\tthat.helper.width( that.size.width );\n\n\t\t\tif ( this._helper && !o.animate ) {\n\t\t\t\tthis._proportionallyResize();\n\t\t\t}\n\t\t}\n\n\t\t$( \"body\" ).css( \"cursor\", \"auto\" );\n\n\t\tthis._removeClass( \"ui-resizable-resizing\" );\n\n\t\tthis._propagate( \"stop\", event );\n\n\t\tif ( this._helper ) {\n\t\t\tthis.helper.remove();\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\t_updatePrevProperties: function() {\n\t\tthis.prevPosition = {\n\t\t\ttop: this.position.top,\n\t\t\tleft: this.position.left\n\t\t};\n\t\tthis.prevSize = {\n\t\t\twidth: this.size.width,\n\t\t\theight: this.size.height\n\t\t};\n\t},\n\n\t_applyChanges: function() {\n\t\tvar props = {};\n\n\t\tif ( this.position.top !== this.prevPosition.top ) {\n\t\t\tprops.top = this.position.top + \"px\";\n\t\t}\n\t\tif ( this.position.left !== this.prevPosition.left ) {\n\t\t\tprops.left = this.position.left + \"px\";\n\t\t}\n\t\tif ( this.size.width !== this.prevSize.width ) {\n\t\t\tprops.width = this.size.width + \"px\";\n\t\t}\n\t\tif ( this.size.height !== this.prevSize.height ) {\n\t\t\tprops.height = this.size.height + \"px\";\n\t\t}\n\n\t\tthis.helper.css( props );\n\n\t\treturn props;\n\t},\n\n\t_updateVirtualBoundaries: function( forceAspectRatio ) {\n\t\tvar pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,\n\t\t\to = this.options;\n\n\t\tb = {\n\t\t\tminWidth: this._isNumber( o.minWidth ) ? o.minWidth : 0,\n\t\t\tmaxWidth: this._isNumber( o.maxWidth ) ? o.maxWidth : Infinity,\n\t\t\tminHeight: this._isNumber( o.minHeight ) ? o.minHeight : 0,\n\t\t\tmaxHeight: this._isNumber( o.maxHeight ) ? o.maxHeight : Infinity\n\t\t};\n\n\t\tif ( this._aspectRatio || forceAspectRatio ) {\n\t\t\tpMinWidth = b.minHeight * this.aspectRatio;\n\t\t\tpMinHeight = b.minWidth / this.aspectRatio;\n\t\t\tpMaxWidth = b.maxHeight * this.aspectRatio;\n\t\t\tpMaxHeight = b.maxWidth / this.aspectRatio;\n\n\t\t\tif ( pMinWidth > b.minWidth ) {\n\t\t\t\tb.minWidth = pMinWidth;\n\t\t\t}\n\t\t\tif ( pMinHeight > b.minHeight ) {\n\t\t\t\tb.minHeight = pMinHeight;\n\t\t\t}\n\t\t\tif ( pMaxWidth < b.maxWidth ) {\n\t\t\t\tb.maxWidth = pMaxWidth;\n\t\t\t}\n\t\t\tif ( pMaxHeight < b.maxHeight ) {\n\t\t\t\tb.maxHeight = pMaxHeight;\n\t\t\t}\n\t\t}\n\t\tthis._vBoundaries = b;\n\t},\n\n\t_updateCache: function( data ) {\n\t\tthis.offset = this.helper.offset();\n\t\tif ( this._isNumber( data.left ) ) {\n\t\t\tthis.position.left = data.left;\n\t\t}\n\t\tif ( this._isNumber( data.top ) ) {\n\t\t\tthis.position.top = data.top;\n\t\t}\n\t\tif ( this._isNumber( data.height ) ) {\n\t\t\tthis.size.height = data.height;\n\t\t}\n\t\tif ( this._isNumber( data.width ) ) {\n\t\t\tthis.size.width = data.width;\n\t\t}\n\t},\n\n\t_updateRatio: function( data ) {\n\n\t\tvar cpos = this.position,\n\t\t\tcsize = this.size,\n\t\t\ta = this.axis;\n\n\t\tif ( this._isNumber( data.height ) ) {\n\t\t\tdata.width = ( data.height * this.aspectRatio );\n\t\t} else if ( this._isNumber( data.width ) ) {\n\t\t\tdata.height = ( data.width / this.aspectRatio );\n\t\t}\n\n\t\tif ( a === \"sw\" ) {\n\t\t\tdata.left = cpos.left + ( csize.width - data.width );\n\t\t\tdata.top = null;\n\t\t}\n\t\tif ( a === \"nw\" ) {\n\t\t\tdata.top = cpos.top + ( csize.height - data.height );\n\t\t\tdata.left = cpos.left + ( csize.width - data.width );\n\t\t}\n\n\t\treturn data;\n\t},\n\n\t_respectSize: function( data ) {\n\n\t\tvar o = this._vBoundaries,\n\t\t\ta = this.axis,\n\t\t\tismaxw = this._isNumber( data.width ) && o.maxWidth && ( o.maxWidth < data.width ),\n\t\t\tismaxh = this._isNumber( data.height ) && o.maxHeight && ( o.maxHeight < data.height ),\n\t\t\tisminw = this._isNumber( data.width ) && o.minWidth && ( o.minWidth > data.width ),\n\t\t\tisminh = this._isNumber( data.height ) && o.minHeight && ( o.minHeight > data.height ),\n\t\t\tdw = this.originalPosition.left + this.originalSize.width,\n\t\t\tdh = this.originalPosition.top + this.originalSize.height,\n\t\t\tcw = /sw|nw|w/.test( a ), ch = /nw|ne|n/.test( a );\n\t\tif ( isminw ) {\n\t\t\tdata.width = o.minWidth;\n\t\t}\n\t\tif ( isminh ) {\n\t\t\tdata.height = o.minHeight;\n\t\t}\n\t\tif ( ismaxw ) {\n\t\t\tdata.width = o.maxWidth;\n\t\t}\n\t\tif ( ismaxh ) {\n\t\t\tdata.height = o.maxHeight;\n\t\t}\n\n\t\tif ( isminw && cw ) {\n\t\t\tdata.left = dw - o.minWidth;\n\t\t}\n\t\tif ( ismaxw && cw ) {\n\t\t\tdata.left = dw - o.maxWidth;\n\t\t}\n\t\tif ( isminh && ch ) {\n\t\t\tdata.top = dh - o.minHeight;\n\t\t}\n\t\tif ( ismaxh && ch ) {\n\t\t\tdata.top = dh - o.maxHeight;\n\t\t}\n\n\t\t// Fixing jump error on top/left - bug #2330\n\t\tif ( !data.width && !data.height && !data.left && data.top ) {\n\t\t\tdata.top = null;\n\t\t} else if ( !data.width && !data.height && !data.top && data.left ) {\n\t\t\tdata.left = null;\n\t\t}\n\n\t\treturn data;\n\t},\n\n\t_getPaddingPlusBorderDimensions: function( element ) {\n\t\tvar i = 0,\n\t\t\twidths = [],\n\t\t\tborders = [\n\t\t\t\telement.css( \"borderTopWidth\" ),\n\t\t\t\telement.css( \"borderRightWidth\" ),\n\t\t\t\telement.css( \"borderBottomWidth\" ),\n\t\t\t\telement.css( \"borderLeftWidth\" )\n\t\t\t],\n\t\t\tpaddings = [\n\t\t\t\telement.css( \"paddingTop\" ),\n\t\t\t\telement.css( \"paddingRight\" ),\n\t\t\t\telement.css( \"paddingBottom\" ),\n\t\t\t\telement.css( \"paddingLeft\" )\n\t\t\t];\n\n\t\tfor ( ; i < 4; i++ ) {\n\t\t\twidths[ i ] = ( parseFloat( borders[ i ] ) || 0 );\n\t\t\twidths[ i ] += ( parseFloat( paddings[ i ] ) || 0 );\n\t\t}\n\n\t\treturn {\n\t\t\theight: widths[ 0 ] + widths[ 2 ],\n\t\t\twidth: widths[ 1 ] + widths[ 3 ]\n\t\t};\n\t},\n\n\t_proportionallyResize: function() {\n\n\t\tif ( !this._proportionallyResizeElements.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar prel,\n\t\t\ti = 0,\n\t\t\telement = this.helper || this.element;\n\n\t\tfor ( ; i < this._proportionallyResizeElements.length; i++ ) {\n\n\t\t\tprel = this._proportionallyResizeElements[ i ];\n\n\t\t\t// TODO: Seems like a bug to cache this.outerDimensions\n\t\t\t// considering that we are in a loop.\n\t\t\tif ( !this.outerDimensions ) {\n\t\t\t\tthis.outerDimensions = this._getPaddingPlusBorderDimensions( prel );\n\t\t\t}\n\n\t\t\tprel.css( {\n\t\t\t\theight: ( element.height() - this.outerDimensions.height ) || 0,\n\t\t\t\twidth: ( element.width() - this.outerDimensions.width ) || 0\n\t\t\t} );\n\n\t\t}\n\n\t},\n\n\t_renderProxy: function() {\n\n\t\tvar el = this.element, o = this.options;\n\t\tthis.elementOffset = el.offset();\n\n\t\tif ( this._helper ) {\n\n\t\t\tthis.helper = this.helper || $( \"<div style='overflow:hidden;'></div>\" );\n\n\t\t\tthis._addClass( this.helper, this._helper );\n\t\t\tthis.helper.css( {\n\t\t\t\twidth: this.element.outerWidth(),\n\t\t\t\theight: this.element.outerHeight(),\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: this.elementOffset.left + \"px\",\n\t\t\t\ttop: this.elementOffset.top + \"px\",\n\t\t\t\tzIndex: ++o.zIndex //TODO: Don't modify option\n\t\t\t} );\n\n\t\t\tthis.helper\n\t\t\t\t.appendTo( \"body\" )\n\t\t\t\t.disableSelection();\n\n\t\t} else {\n\t\t\tthis.helper = this.element;\n\t\t}\n\n\t},\n\n\t_change: {\n\t\te: function( event, dx ) {\n\t\t\treturn { width: this.originalSize.width + dx };\n\t\t},\n\t\tw: function( event, dx ) {\n\t\t\tvar cs = this.originalSize, sp = this.originalPosition;\n\t\t\treturn { left: sp.left + dx, width: cs.width - dx };\n\t\t},\n\t\tn: function( event, dx, dy ) {\n\t\t\tvar cs = this.originalSize, sp = this.originalPosition;\n\t\t\treturn { top: sp.top + dy, height: cs.height - dy };\n\t\t},\n\t\ts: function( event, dx, dy ) {\n\t\t\treturn { height: this.originalSize.height + dy };\n\t\t},\n\t\tse: function( event, dx, dy ) {\n\t\t\treturn $.extend( this._change.s.apply( this, arguments ),\n\t\t\t\tthis._change.e.apply( this, [ event, dx, dy ] ) );\n\t\t},\n\t\tsw: function( event, dx, dy ) {\n\t\t\treturn $.extend( this._change.s.apply( this, arguments ),\n\t\t\t\tthis._change.w.apply( this, [ event, dx, dy ] ) );\n\t\t},\n\t\tne: function( event, dx, dy ) {\n\t\t\treturn $.extend( this._change.n.apply( this, arguments ),\n\t\t\t\tthis._change.e.apply( this, [ event, dx, dy ] ) );\n\t\t},\n\t\tnw: function( event, dx, dy ) {\n\t\t\treturn $.extend( this._change.n.apply( this, arguments ),\n\t\t\t\tthis._change.w.apply( this, [ event, dx, dy ] ) );\n\t\t}\n\t},\n\n\t_propagate: function( n, event ) {\n\t\t$.ui.plugin.call( this, n, [ event, this.ui() ] );\n\t\t( n !== \"resize\" && this._trigger( n, event, this.ui() ) );\n\t},\n\n\tplugins: {},\n\n\tui: function() {\n\t\treturn {\n\t\t\toriginalElement: this.originalElement,\n\t\t\telement: this.element,\n\t\t\thelper: this.helper,\n\t\t\tposition: this.position,\n\t\t\tsize: this.size,\n\t\t\toriginalSize: this.originalSize,\n\t\t\toriginalPosition: this.originalPosition\n\t\t};\n\t}\n\n} );\n\n/*\n * Resizable Extensions\n */\n\n$.ui.plugin.add( \"resizable\", \"animate\", {\n\n\tstop: function( event ) {\n\t\tvar that = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tpr = that._proportionallyResizeElements,\n\t\t\tista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName ),\n\t\t\tsoffseth = ista && that._hasScroll( pr[ 0 ], \"left\" ) ? 0 : that.sizeDiff.height,\n\t\t\tsoffsetw = ista ? 0 : that.sizeDiff.width,\n\t\t\tstyle = {\n\t\t\t\twidth: ( that.size.width - soffsetw ),\n\t\t\t\theight: ( that.size.height - soffseth )\n\t\t\t},\n\t\t\tleft = ( parseFloat( that.element.css( \"left\" ) ) +\n\t\t\t\t( that.position.left - that.originalPosition.left ) ) || null,\n\t\t\ttop = ( parseFloat( that.element.css( \"top\" ) ) +\n\t\t\t\t( that.position.top - that.originalPosition.top ) ) || null;\n\n\t\tthat.element.animate(\n\t\t\t$.extend( style, top && left ? { top: top, left: left } : {} ), {\n\t\t\t\tduration: o.animateDuration,\n\t\t\t\teasing: o.animateEasing,\n\t\t\t\tstep: function() {\n\n\t\t\t\t\tvar data = {\n\t\t\t\t\t\twidth: parseFloat( that.element.css( \"width\" ) ),\n\t\t\t\t\t\theight: parseFloat( that.element.css( \"height\" ) ),\n\t\t\t\t\t\ttop: parseFloat( that.element.css( \"top\" ) ),\n\t\t\t\t\t\tleft: parseFloat( that.element.css( \"left\" ) )\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( pr && pr.length ) {\n\t\t\t\t\t\t$( pr[ 0 ] ).css( { width: data.width, height: data.height } );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Propagating resize, and updating values for each animation step\n\t\t\t\t\tthat._updateCache( data );\n\t\t\t\t\tthat._propagate( \"resize\", event );\n\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n} );\n\n$.ui.plugin.add( \"resizable\", \"containment\", {\n\n\tstart: function() {\n\t\tvar element, p, co, ch, cw, width, height,\n\t\t\tthat = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tel = that.element,\n\t\t\toc = o.containment,\n\t\t\tce = ( oc instanceof $ ) ?\n\t\t\t\toc.get( 0 ) :\n\t\t\t\t( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;\n\n\t\tif ( !ce ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthat.containerElement = $( ce );\n\n\t\tif ( /document/.test( oc ) || oc === document ) {\n\t\t\tthat.containerOffset = {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0\n\t\t\t};\n\t\t\tthat.containerPosition = {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0\n\t\t\t};\n\n\t\t\tthat.parentData = {\n\t\t\t\telement: $( document ),\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0,\n\t\t\t\twidth: $( document ).width(),\n\t\t\t\theight: $( document ).height() || document.body.parentNode.scrollHeight\n\t\t\t};\n\t\t} else {\n\t\t\telement = $( ce );\n\t\t\tp = [];\n\t\t\t$( [ \"Top\", \"Right\", \"Left\", \"Bottom\" ] ).each( function( i, name ) {\n\t\t\t\tp[ i ] = that._num( element.css( \"padding\" + name ) );\n\t\t\t} );\n\n\t\t\tthat.containerOffset = element.offset();\n\t\t\tthat.containerPosition = element.position();\n\t\t\tthat.containerSize = {\n\t\t\t\theight: ( element.innerHeight() - p[ 3 ] ),\n\t\t\t\twidth: ( element.innerWidth() - p[ 1 ] )\n\t\t\t};\n\n\t\t\tco = that.containerOffset;\n\t\t\tch = that.containerSize.height;\n\t\t\tcw = that.containerSize.width;\n\t\t\twidth = ( that._hasScroll ( ce, \"left\" ) ? ce.scrollWidth : cw );\n\t\t\theight = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;\n\n\t\t\tthat.parentData = {\n\t\t\t\telement: ce,\n\t\t\t\tleft: co.left,\n\t\t\t\ttop: co.top,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\t\t}\n\t},\n\n\tresize: function( event ) {\n\t\tvar woset, hoset, isParent, isOffsetRelative,\n\t\t\tthat = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tco = that.containerOffset,\n\t\t\tcp = that.position,\n\t\t\tpRatio = that._aspectRatio || event.shiftKey,\n\t\t\tcop = {\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0\n\t\t\t},\n\t\t\tce = that.containerElement,\n\t\t\tcontinueResize = true;\n\n\t\tif ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( \"position\" ) ) ) {\n\t\t\tcop = co;\n\t\t}\n\n\t\tif ( cp.left < ( that._helper ? co.left : 0 ) ) {\n\t\t\tthat.size.width = that.size.width +\n\t\t\t\t( that._helper ?\n\t\t\t\t\t( that.position.left - co.left ) :\n\t\t\t\t\t( that.position.left - cop.left ) );\n\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.height = that.size.width / that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t\tthat.position.left = o.helper ? co.left : 0;\n\t\t}\n\n\t\tif ( cp.top < ( that._helper ? co.top : 0 ) ) {\n\t\t\tthat.size.height = that.size.height +\n\t\t\t\t( that._helper ?\n\t\t\t\t\t( that.position.top - co.top ) :\n\t\t\t\t\tthat.position.top );\n\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.width = that.size.height * that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t\tthat.position.top = that._helper ? co.top : 0;\n\t\t}\n\n\t\tisParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );\n\t\tisOffsetRelative = /relative|absolute/.test( that.containerElement.css( \"position\" ) );\n\n\t\tif ( isParent && isOffsetRelative ) {\n\t\t\tthat.offset.left = that.parentData.left + that.position.left;\n\t\t\tthat.offset.top = that.parentData.top + that.position.top;\n\t\t} else {\n\t\t\tthat.offset.left = that.element.offset().left;\n\t\t\tthat.offset.top = that.element.offset().top;\n\t\t}\n\n\t\twoset = Math.abs( that.sizeDiff.width +\n\t\t\t( that._helper ?\n\t\t\t\tthat.offset.left - cop.left :\n\t\t\t\t( that.offset.left - co.left ) ) );\n\n\t\thoset = Math.abs( that.sizeDiff.height +\n\t\t\t( that._helper ?\n\t\t\t\tthat.offset.top - cop.top :\n\t\t\t\t( that.offset.top - co.top ) ) );\n\n\t\tif ( woset + that.size.width >= that.parentData.width ) {\n\t\t\tthat.size.width = that.parentData.width - woset;\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.height = that.size.width / that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t}\n\n\t\tif ( hoset + that.size.height >= that.parentData.height ) {\n\t\t\tthat.size.height = that.parentData.height - hoset;\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.width = that.size.height * that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t}\n\n\t\tif ( !continueResize ) {\n\t\t\tthat.position.left = that.prevPosition.left;\n\t\t\tthat.position.top = that.prevPosition.top;\n\t\t\tthat.size.width = that.prevSize.width;\n\t\t\tthat.size.height = that.prevSize.height;\n\t\t}\n\t},\n\n\tstop: function() {\n\t\tvar that = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tco = that.containerOffset,\n\t\t\tcop = that.containerPosition,\n\t\t\tce = that.containerElement,\n\t\t\thelper = $( that.helper ),\n\t\t\tho = helper.offset(),\n\t\t\tw = helper.outerWidth() - that.sizeDiff.width,\n\t\t\th = helper.outerHeight() - that.sizeDiff.height;\n\n\t\tif ( that._helper && !o.animate && ( /relative/ ).test( ce.css( \"position\" ) ) ) {\n\t\t\t$( this ).css( {\n\t\t\t\tleft: ho.left - cop.left - co.left,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t} );\n\t\t}\n\n\t\tif ( that._helper && !o.animate && ( /static/ ).test( ce.css( \"position\" ) ) ) {\n\t\t\t$( this ).css( {\n\t\t\t\tleft: ho.left - cop.left - co.left,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t} );\n\t\t}\n\t}\n} );\n\n$.ui.plugin.add( \"resizable\", \"alsoResize\", {\n\n\tstart: function() {\n\t\tvar that = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options;\n\n\t\t$( o.alsoResize ).each( function() {\n\t\t\tvar el = $( this );\n\t\t\tel.data( \"ui-resizable-alsoresize\", {\n\t\t\t\twidth: parseFloat( el.width() ), height: parseFloat( el.height() ),\n\t\t\t\tleft: parseFloat( el.css( \"left\" ) ), top: parseFloat( el.css( \"top\" ) )\n\t\t\t} );\n\t\t} );\n\t},\n\n\tresize: function( event, ui ) {\n\t\tvar that = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tos = that.originalSize,\n\t\t\top = that.originalPosition,\n\t\t\tdelta = {\n\t\t\t\theight: ( that.size.height - os.height ) || 0,\n\t\t\t\twidth: ( that.size.width - os.width ) || 0,\n\t\t\t\ttop: ( that.position.top - op.top ) || 0,\n\t\t\t\tleft: ( that.position.left - op.left ) || 0\n\t\t\t};\n\n\t\t\t$( o.alsoResize ).each( function() {\n\t\t\t\tvar el = $( this ), start = $( this ).data( \"ui-resizable-alsoresize\" ), style = {},\n\t\t\t\t\tcss = el.parents( ui.originalElement[ 0 ] ).length ?\n\t\t\t\t\t\t\t[ \"width\", \"height\" ] :\n\t\t\t\t\t\t\t[ \"width\", \"height\", \"top\", \"left\" ];\n\n\t\t\t\t$.each( css, function( i, prop ) {\n\t\t\t\t\tvar sum = ( start[ prop ] || 0 ) + ( delta[ prop ] || 0 );\n\t\t\t\t\tif ( sum && sum >= 0 ) {\n\t\t\t\t\t\tstyle[ prop ] = sum || null;\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tel.css( style );\n\t\t\t} );\n\t},\n\n\tstop: function() {\n\t\t$( this ).removeData( \"ui-resizable-alsoresize\" );\n\t}\n} );\n\n$.ui.plugin.add( \"resizable\", \"ghost\", {\n\n\tstart: function() {\n\n\t\tvar that = $( this ).resizable( \"instance\" ), cs = that.size;\n\n\t\tthat.ghost = that.originalElement.clone();\n\t\tthat.ghost.css( {\n\t\t\topacity: 0.25,\n\t\t\tdisplay: \"block\",\n\t\t\tposition: \"relative\",\n\t\t\theight: cs.height,\n\t\t\twidth: cs.width,\n\t\t\tmargin: 0,\n\t\t\tleft: 0,\n\t\t\ttop: 0\n\t\t} );\n\n\t\tthat._addClass( that.ghost, \"ui-resizable-ghost\" );\n\n\t\t// DEPRECATED\n\t\t// TODO: remove after 1.12\n\t\tif ( $.uiBackCompat !== false && typeof that.options.ghost === \"string\" ) {\n\n\t\t\t// Ghost option\n\t\t\tthat.ghost.addClass( this.options.ghost );\n\t\t}\n\n\t\tthat.ghost.appendTo( that.helper );\n\n\t},\n\n\tresize: function() {\n\t\tvar that = $( this ).resizable( \"instance\" );\n\t\tif ( that.ghost ) {\n\t\t\tthat.ghost.css( {\n\t\t\t\tposition: \"relative\",\n\t\t\t\theight: that.size.height,\n\t\t\t\twidth: that.size.width\n\t\t\t} );\n\t\t}\n\t},\n\n\tstop: function() {\n\t\tvar that = $( this ).resizable( \"instance\" );\n\t\tif ( that.ghost && that.helper ) {\n\t\t\tthat.helper.get( 0 ).removeChild( that.ghost.get( 0 ) );\n\t\t}\n\t}\n\n} );\n\n$.ui.plugin.add( \"resizable\", \"grid\", {\n\n\tresize: function() {\n\t\tvar outerDimensions,\n\t\t\tthat = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tcs = that.size,\n\t\t\tos = that.originalSize,\n\t\t\top = that.originalPosition,\n\t\t\ta = that.axis,\n\t\t\tgrid = typeof o.grid === \"number\" ? [ o.grid, o.grid ] : o.grid,\n\t\t\tgridX = ( grid[ 0 ] || 1 ),\n\t\t\tgridY = ( grid[ 1 ] || 1 ),\n\t\t\tox = Math.round( ( cs.width - os.width ) / gridX ) * gridX,\n\t\t\toy = Math.round( ( cs.height - os.height ) / gridY ) * gridY,\n\t\t\tnewWidth = os.width + ox,\n\t\t\tnewHeight = os.height + oy,\n\t\t\tisMaxWidth = o.maxWidth && ( o.maxWidth < newWidth ),\n\t\t\tisMaxHeight = o.maxHeight && ( o.maxHeight < newHeight ),\n\t\t\tisMinWidth = o.minWidth && ( o.minWidth > newWidth ),\n\t\t\tisMinHeight = o.minHeight && ( o.minHeight > newHeight );\n\n\t\to.grid = grid;\n\n\t\tif ( isMinWidth ) {\n\t\t\tnewWidth += gridX;\n\t\t}\n\t\tif ( isMinHeight ) {\n\t\t\tnewHeight += gridY;\n\t\t}\n\t\tif ( isMaxWidth ) {\n\t\t\tnewWidth -= gridX;\n\t\t}\n\t\tif ( isMaxHeight ) {\n\t\t\tnewHeight -= gridY;\n\t\t}\n\n\t\tif ( /^(se|s|e)$/.test( a ) ) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t} else if ( /^(ne)$/.test( a ) ) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t\tthat.position.top = op.top - oy;\n\t\t} else if ( /^(sw)$/.test( a ) ) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t\tthat.position.left = op.left - ox;\n\t\t} else {\n\t\t\tif ( newHeight - gridY <= 0 || newWidth - gridX <= 0 ) {\n\t\t\t\touterDimensions = that._getPaddingPlusBorderDimensions( this );\n\t\t\t}\n\n\t\t\tif ( newHeight - gridY > 0 ) {\n\t\t\t\tthat.size.height = newHeight;\n\t\t\t\tthat.position.top = op.top - oy;\n\t\t\t} else {\n\t\t\t\tnewHeight = gridY - outerDimensions.height;\n\t\t\t\tthat.size.height = newHeight;\n\t\t\t\tthat.position.top = op.top + os.height - newHeight;\n\t\t\t}\n\t\t\tif ( newWidth - gridX > 0 ) {\n\t\t\t\tthat.size.width = newWidth;\n\t\t\t\tthat.position.left = op.left - ox;\n\t\t\t} else {\n\t\t\t\tnewWidth = gridX - outerDimensions.width;\n\t\t\t\tthat.size.width = newWidth;\n\t\t\t\tthat.position.left = op.left + os.width - newWidth;\n\t\t\t}\n\t\t}\n\t}\n\n} );\n\nvar widgetsResizable = $.ui.resizable;\n\n\n/*!\n * jQuery UI Selectable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Selectable\n//>>group: Interactions\n//>>description: Allows groups of elements to be selected with the mouse.\n//>>docs: http://api.jqueryui.com/selectable/\n//>>demos: http://jqueryui.com/selectable/\n//>>css.structure: ../../themes/base/selectable.css\n\n\n\nvar widgetsSelectable = $.widget( \"ui.selectable\", $.ui.mouse, {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tappendTo: \"body\",\n\t\tautoRefresh: true,\n\t\tdistance: 0,\n\t\tfilter: \"*\",\n\t\ttolerance: \"touch\",\n\n\t\t// Callbacks\n\t\tselected: null,\n\t\tselecting: null,\n\t\tstart: null,\n\t\tstop: null,\n\t\tunselected: null,\n\t\tunselecting: null\n\t},\n\t_create: function() {\n\t\tvar that = this;\n\n\t\tthis._addClass( \"ui-selectable\" );\n\n\t\tthis.dragged = false;\n\n\t\t// Cache selectee children based on filter\n\t\tthis.refresh = function() {\n\t\t\tthat.elementPos = $( that.element[ 0 ] ).offset();\n\t\t\tthat.selectees = $( that.options.filter, that.element[ 0 ] );\n\t\t\tthat._addClass( that.selectees, \"ui-selectee\" );\n\t\t\tthat.selectees.each( function() {\n\t\t\t\tvar $this = $( this ),\n\t\t\t\t\tselecteeOffset = $this.offset(),\n\t\t\t\t\tpos = {\n\t\t\t\t\t\tleft: selecteeOffset.left - that.elementPos.left,\n\t\t\t\t\t\ttop: selecteeOffset.top - that.elementPos.top\n\t\t\t\t\t};\n\t\t\t\t$.data( this, \"selectable-item\", {\n\t\t\t\t\telement: this,\n\t\t\t\t\t$element: $this,\n\t\t\t\t\tleft: pos.left,\n\t\t\t\t\ttop: pos.top,\n\t\t\t\t\tright: pos.left + $this.outerWidth(),\n\t\t\t\t\tbottom: pos.top + $this.outerHeight(),\n\t\t\t\t\tstartselected: false,\n\t\t\t\t\tselected: $this.hasClass( \"ui-selected\" ),\n\t\t\t\t\tselecting: $this.hasClass( \"ui-selecting\" ),\n\t\t\t\t\tunselecting: $this.hasClass( \"ui-unselecting\" )\n\t\t\t\t} );\n\t\t\t} );\n\t\t};\n\t\tthis.refresh();\n\n\t\tthis._mouseInit();\n\n\t\tthis.helper = $( \"<div>\" );\n\t\tthis._addClass( this.helper, \"ui-selectable-helper\" );\n\t},\n\n\t_destroy: function() {\n\t\tthis.selectees.removeData( \"selectable-item\" );\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseStart: function( event ) {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tthis.opos = [ event.pageX, event.pageY ];\n\t\tthis.elementPos = $( this.element[ 0 ] ).offset();\n\n\t\tif ( this.options.disabled ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.selectees = $( options.filter, this.element[ 0 ] );\n\n\t\tthis._trigger( \"start\", event );\n\n\t\t$( options.appendTo ).append( this.helper );\n\n\t\t// position helper (lasso)\n\t\tthis.helper.css( {\n\t\t\t\"left\": event.pageX,\n\t\t\t\"top\": event.pageY,\n\t\t\t\"width\": 0,\n\t\t\t\"height\": 0\n\t\t} );\n\n\t\tif ( options.autoRefresh ) {\n\t\t\tthis.refresh();\n\t\t}\n\n\t\tthis.selectees.filter( \".ui-selected\" ).each( function() {\n\t\t\tvar selectee = $.data( this, \"selectable-item\" );\n\t\t\tselectee.startselected = true;\n\t\t\tif ( !event.metaKey && !event.ctrlKey ) {\n\t\t\t\tthat._removeClass( selectee.$element, \"ui-selected\" );\n\t\t\t\tselectee.selected = false;\n\t\t\t\tthat._addClass( selectee.$element, \"ui-unselecting\" );\n\t\t\t\tselectee.unselecting = true;\n\n\t\t\t\t// selectable UNSELECTING callback\n\t\t\t\tthat._trigger( \"unselecting\", event, {\n\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\t$( event.target ).parents().addBack().each( function() {\n\t\t\tvar doSelect,\n\t\t\t\tselectee = $.data( this, \"selectable-item\" );\n\t\t\tif ( selectee ) {\n\t\t\t\tdoSelect = ( !event.metaKey && !event.ctrlKey ) ||\n\t\t\t\t\t!selectee.$element.hasClass( \"ui-selected\" );\n\t\t\t\tthat._removeClass( selectee.$element, doSelect ? \"ui-unselecting\" : \"ui-selected\" )\n\t\t\t\t\t._addClass( selectee.$element, doSelect ? \"ui-selecting\" : \"ui-unselecting\" );\n\t\t\t\tselectee.unselecting = !doSelect;\n\t\t\t\tselectee.selecting = doSelect;\n\t\t\t\tselectee.selected = doSelect;\n\n\t\t\t\t// selectable (UN)SELECTING callback\n\t\t\t\tif ( doSelect ) {\n\t\t\t\t\tthat._trigger( \"selecting\", event, {\n\t\t\t\t\t\tselecting: selectee.element\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\tthat._trigger( \"unselecting\", event, {\n\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} );\n\n\t},\n\n\t_mouseDrag: function( event ) {\n\n\t\tthis.dragged = true;\n\n\t\tif ( this.options.disabled ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar tmp,\n\t\t\tthat = this,\n\t\t\toptions = this.options,\n\t\t\tx1 = this.opos[ 0 ],\n\t\t\ty1 = this.opos[ 1 ],\n\t\t\tx2 = event.pageX,\n\t\t\ty2 = event.pageY;\n\n\t\tif ( x1 > x2 ) { tmp = x2; x2 = x1; x1 = tmp; }\n\t\tif ( y1 > y2 ) { tmp = y2; y2 = y1; y1 = tmp; }\n\t\tthis.helper.css( { left: x1, top: y1, width: x2 - x1, height: y2 - y1 } );\n\n\t\tthis.selectees.each( function() {\n\t\t\tvar selectee = $.data( this, \"selectable-item\" ),\n\t\t\t\thit = false,\n\t\t\t\toffset = {};\n\n\t\t\t//prevent helper from being selected if appendTo: selectable\n\t\t\tif ( !selectee || selectee.element === that.element[ 0 ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\toffset.left   = selectee.left   + that.elementPos.left;\n\t\t\toffset.right  = selectee.right  + that.elementPos.left;\n\t\t\toffset.top    = selectee.top    + that.elementPos.top;\n\t\t\toffset.bottom = selectee.bottom + that.elementPos.top;\n\n\t\t\tif ( options.tolerance === \"touch\" ) {\n\t\t\t\thit = ( !( offset.left > x2 || offset.right < x1 || offset.top > y2 ||\n                    offset.bottom < y1 ) );\n\t\t\t} else if ( options.tolerance === \"fit\" ) {\n\t\t\t\thit = ( offset.left > x1 && offset.right < x2 && offset.top > y1 &&\n                    offset.bottom < y2 );\n\t\t\t}\n\n\t\t\tif ( hit ) {\n\n\t\t\t\t// SELECT\n\t\t\t\tif ( selectee.selected ) {\n\t\t\t\t\tthat._removeClass( selectee.$element, \"ui-selected\" );\n\t\t\t\t\tselectee.selected = false;\n\t\t\t\t}\n\t\t\t\tif ( selectee.unselecting ) {\n\t\t\t\t\tthat._removeClass( selectee.$element, \"ui-unselecting\" );\n\t\t\t\t\tselectee.unselecting = false;\n\t\t\t\t}\n\t\t\t\tif ( !selectee.selecting ) {\n\t\t\t\t\tthat._addClass( selectee.$element, \"ui-selecting\" );\n\t\t\t\t\tselectee.selecting = true;\n\n\t\t\t\t\t// selectable SELECTING callback\n\t\t\t\t\tthat._trigger( \"selecting\", event, {\n\t\t\t\t\t\tselecting: selectee.element\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// UNSELECT\n\t\t\t\tif ( selectee.selecting ) {\n\t\t\t\t\tif ( ( event.metaKey || event.ctrlKey ) && selectee.startselected ) {\n\t\t\t\t\t\tthat._removeClass( selectee.$element, \"ui-selecting\" );\n\t\t\t\t\t\tselectee.selecting = false;\n\t\t\t\t\t\tthat._addClass( selectee.$element, \"ui-selected\" );\n\t\t\t\t\t\tselectee.selected = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthat._removeClass( selectee.$element, \"ui-selecting\" );\n\t\t\t\t\t\tselectee.selecting = false;\n\t\t\t\t\t\tif ( selectee.startselected ) {\n\t\t\t\t\t\t\tthat._addClass( selectee.$element, \"ui-unselecting\" );\n\t\t\t\t\t\t\tselectee.unselecting = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// selectable UNSELECTING callback\n\t\t\t\t\t\tthat._trigger( \"unselecting\", event, {\n\t\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( selectee.selected ) {\n\t\t\t\t\tif ( !event.metaKey && !event.ctrlKey && !selectee.startselected ) {\n\t\t\t\t\t\tthat._removeClass( selectee.$element, \"ui-selected\" );\n\t\t\t\t\t\tselectee.selected = false;\n\n\t\t\t\t\t\tthat._addClass( selectee.$element, \"ui-unselecting\" );\n\t\t\t\t\t\tselectee.unselecting = true;\n\n\t\t\t\t\t\t// selectable UNSELECTING callback\n\t\t\t\t\t\tthat._trigger( \"unselecting\", event, {\n\t\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function( event ) {\n\t\tvar that = this;\n\n\t\tthis.dragged = false;\n\n\t\t$( \".ui-unselecting\", this.element[ 0 ] ).each( function() {\n\t\t\tvar selectee = $.data( this, \"selectable-item\" );\n\t\t\tthat._removeClass( selectee.$element, \"ui-unselecting\" );\n\t\t\tselectee.unselecting = false;\n\t\t\tselectee.startselected = false;\n\t\t\tthat._trigger( \"unselected\", event, {\n\t\t\t\tunselected: selectee.element\n\t\t\t} );\n\t\t} );\n\t\t$( \".ui-selecting\", this.element[ 0 ] ).each( function() {\n\t\t\tvar selectee = $.data( this, \"selectable-item\" );\n\t\t\tthat._removeClass( selectee.$element, \"ui-selecting\" )\n\t\t\t\t._addClass( selectee.$element, \"ui-selected\" );\n\t\t\tselectee.selecting = false;\n\t\t\tselectee.selected = true;\n\t\t\tselectee.startselected = true;\n\t\t\tthat._trigger( \"selected\", event, {\n\t\t\t\tselected: selectee.element\n\t\t\t} );\n\t\t} );\n\t\tthis._trigger( \"stop\", event );\n\n\t\tthis.helper.remove();\n\n\t\treturn false;\n\t}\n\n} );\n\n\n/*!\n * jQuery UI Sortable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Sortable\n//>>group: Interactions\n//>>description: Enables items in a list to be sorted using the mouse.\n//>>docs: http://api.jqueryui.com/sortable/\n//>>demos: http://jqueryui.com/sortable/\n//>>css.structure: ../../themes/base/sortable.css\n\n\n\nvar widgetsSortable = $.widget( \"ui.sortable\", $.ui.mouse, {\n\tversion: \"1.12.1\",\n\twidgetEventPrefix: \"sort\",\n\tready: false,\n\toptions: {\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectWith: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tdropOnEmpty: true,\n\t\tforcePlaceholderSize: false,\n\t\tforceHelperSize: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\titems: \"> *\",\n\t\topacity: false,\n\t\tplaceholder: false,\n\t\trevert: false,\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tscope: \"default\",\n\t\ttolerance: \"intersect\",\n\t\tzIndex: 1000,\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tbeforeStop: null,\n\t\tchange: null,\n\t\tdeactivate: null,\n\t\tout: null,\n\t\tover: null,\n\t\treceive: null,\n\t\tremove: null,\n\t\tsort: null,\n\t\tstart: null,\n\t\tstop: null,\n\t\tupdate: null\n\t},\n\n\t_isOverAxis: function( x, reference, size ) {\n\t\treturn ( x >= reference ) && ( x < ( reference + size ) );\n\t},\n\n\t_isFloating: function( item ) {\n\t\treturn ( /left|right/ ).test( item.css( \"float\" ) ) ||\n\t\t\t( /inline|table-cell/ ).test( item.css( \"display\" ) );\n\t},\n\n\t_create: function() {\n\t\tthis.containerCache = {};\n\t\tthis._addClass( \"ui-sortable\" );\n\n\t\t//Get the items\n\t\tthis.refresh();\n\n\t\t//Let's determine the parent's offset\n\t\tthis.offset = this.element.offset();\n\n\t\t//Initialize mouse events for interaction\n\t\tthis._mouseInit();\n\n\t\tthis._setHandleClassName();\n\n\t\t//We're ready to go\n\t\tthis.ready = true;\n\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"handle\" ) {\n\t\t\tthis._setHandleClassName();\n\t\t}\n\t},\n\n\t_setHandleClassName: function() {\n\t\tvar that = this;\n\t\tthis._removeClass( this.element.find( \".ui-sortable-handle\" ), \"ui-sortable-handle\" );\n\t\t$.each( this.items, function() {\n\t\t\tthat._addClass(\n\t\t\t\tthis.instance.options.handle ?\n\t\t\t\t\tthis.item.find( this.instance.options.handle ) :\n\t\t\t\t\tthis.item,\n\t\t\t\t\"ui-sortable-handle\"\n\t\t\t);\n\t\t} );\n\t},\n\n\t_destroy: function() {\n\t\tthis._mouseDestroy();\n\n\t\tfor ( var i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\tthis.items[ i ].item.removeData( this.widgetName + \"-item\" );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_mouseCapture: function( event, overrideHandle ) {\n\t\tvar currentItem = null,\n\t\t\tvalidHandle = false,\n\t\t\tthat = this;\n\n\t\tif ( this.reverting ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( this.options.disabled || this.options.type === \"static\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t//We have to refresh the items data once first\n\t\tthis._refreshItems( event );\n\n\t\t//Find out if the clicked node (or one of its parents) is a actual item in this.items\n\t\t$( event.target ).parents().each( function() {\n\t\t\tif ( $.data( this, that.widgetName + \"-item\" ) === that ) {\n\t\t\t\tcurrentItem = $( this );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} );\n\t\tif ( $.data( event.target, that.widgetName + \"-item\" ) === that ) {\n\t\t\tcurrentItem = $( event.target );\n\t\t}\n\n\t\tif ( !currentItem ) {\n\t\t\treturn false;\n\t\t}\n\t\tif ( this.options.handle && !overrideHandle ) {\n\t\t\t$( this.options.handle, currentItem ).find( \"*\" ).addBack().each( function() {\n\t\t\t\tif ( this === event.target ) {\n\t\t\t\t\tvalidHandle = true;\n\t\t\t\t}\n\t\t\t} );\n\t\t\tif ( !validHandle ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis.currentItem = currentItem;\n\t\tthis._removeCurrentsFromItems();\n\t\treturn true;\n\n\t},\n\n\t_mouseStart: function( event, overrideHandle, noActivation ) {\n\n\t\tvar i, body,\n\t\t\to = this.options;\n\n\t\tthis.currentContainer = this;\n\n\t\t//We only need to call refreshPositions, because the refreshItems call has been moved to\n\t\t// mouseCapture\n\t\tthis.refreshPositions();\n\n\t\t//Create and append the visible helper\n\t\tthis.helper = this._createHelper( event );\n\n\t\t//Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */\n\n\t\t//Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t//Get the next scrolling parent\n\t\tthis.scrollParent = this.helper.scrollParent();\n\n\t\t//The element's absolute position on the page minus margins\n\t\tthis.offset = this.currentItem.offset();\n\t\tthis.offset = {\n\t\t\ttop: this.offset.top - this.margins.top,\n\t\t\tleft: this.offset.left - this.margins.left\n\t\t};\n\n\t\t$.extend( this.offset, {\n\t\t\tclick: { //Where the click happened, relative to the element\n\t\t\t\tleft: event.pageX - this.offset.left,\n\t\t\t\ttop: event.pageY - this.offset.top\n\t\t\t},\n\t\t\tparent: this._getParentOffset(),\n\n\t\t\t// This is a relative to absolute position minus the actual position calculation -\n\t\t\t// only used for relative positioned helper\n\t\t\trelative: this._getRelativeOffset()\n\t\t} );\n\n\t\t// Only after we got the offset, we can change the helper's position to absolute\n\t\t// TODO: Still need to figure out a way to make relative sorting possible\n\t\tthis.helper.css( \"position\", \"absolute\" );\n\t\tthis.cssPosition = this.helper.css( \"position\" );\n\n\t\t//Generate the original position\n\t\tthis.originalPosition = this._generatePosition( event );\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\t( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );\n\n\t\t//Cache the former DOM position\n\t\tthis.domPosition = {\n\t\t\tprev: this.currentItem.prev()[ 0 ],\n\t\t\tparent: this.currentItem.parent()[ 0 ]\n\t\t};\n\n\t\t// If the helper is not the original, hide the original so it's not playing any role during\n\t\t// the drag, won't cause anything bad this way\n\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\tthis.currentItem.hide();\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthis._createPlaceholder();\n\n\t\t//Set a containment if given in the options\n\t\tif ( o.containment ) {\n\t\t\tthis._setContainment();\n\t\t}\n\n\t\tif ( o.cursor && o.cursor !== \"auto\" ) { // cursor option\n\t\t\tbody = this.document.find( \"body\" );\n\n\t\t\t// Support: IE\n\t\t\tthis.storedCursor = body.css( \"cursor\" );\n\t\t\tbody.css( \"cursor\", o.cursor );\n\n\t\t\tthis.storedStylesheet =\n\t\t\t\t$( \"<style>*{ cursor: \" + o.cursor + \" !important; }</style>\" ).appendTo( body );\n\t\t}\n\n\t\tif ( o.opacity ) { // opacity option\n\t\t\tif ( this.helper.css( \"opacity\" ) ) {\n\t\t\t\tthis._storedOpacity = this.helper.css( \"opacity\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"opacity\", o.opacity );\n\t\t}\n\n\t\tif ( o.zIndex ) { // zIndex option\n\t\t\tif ( this.helper.css( \"zIndex\" ) ) {\n\t\t\t\tthis._storedZIndex = this.helper.css( \"zIndex\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"zIndex\", o.zIndex );\n\t\t}\n\n\t\t//Prepare scrolling\n\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\t\t\tthis.overflowOffset = this.scrollParent.offset();\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"start\", event, this._uiHash() );\n\n\t\t//Recache the helper size\n\t\tif ( !this._preserveHelperProportions ) {\n\t\t\tthis._cacheHelperProportions();\n\t\t}\n\n\t\t//Post \"activate\" events to possible containers\n\t\tif ( !noActivation ) {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"activate\", event, this._uiHash( this ) );\n\t\t\t}\n\t\t}\n\n\t\t//Prepare possible droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\tif ( $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\tthis._addClass( this.helper, \"ui-sortable-helper\" );\n\n\t\t// Execute the drag once - this causes the helper not to be visiblebefore getting its\n\t\t// correct position\n\t\tthis._mouseDrag( event );\n\t\treturn true;\n\n\t},\n\n\t_mouseDrag: function( event ) {\n\t\tvar i, item, itemElement, intersection,\n\t\t\to = this.options,\n\t\t\tscrolled = false;\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition( event );\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\tif ( !this.lastPositionAbs ) {\n\t\t\tthis.lastPositionAbs = this.positionAbs;\n\t\t}\n\n\t\t//Do scrolling\n\t\tif ( this.options.scroll ) {\n\t\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\n\t\t\t\tif ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -\n\t\t\t\t\t\tevent.pageY < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t\tif ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -\n\t\t\t\t\t\tevent.pageX < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );\n\t\t\t\t} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );\n\t\t\t\t}\n\n\t\t\t\tif ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\t\tthis.document.scrollLeft() - o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\t\tthis.document.scrollLeft() + o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t\t}\n\t\t}\n\n\t\t//Regenerate the absolute position used for position checks\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\t//Set the helper position\n\t\tif ( !this.options.axis || this.options.axis !== \"y\" ) {\n\t\t\tthis.helper[ 0 ].style.left = this.position.left + \"px\";\n\t\t}\n\t\tif ( !this.options.axis || this.options.axis !== \"x\" ) {\n\t\t\tthis.helper[ 0 ].style.top = this.position.top + \"px\";\n\t\t}\n\n\t\t//Rearrange\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\n\t\t\t//Cache variables and intersection, continue if no intersection\n\t\t\titem = this.items[ i ];\n\t\t\titemElement = item.item[ 0 ];\n\t\t\tintersection = this._intersectsWithPointer( item );\n\t\t\tif ( !intersection ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Only put the placeholder inside the current Container, skip all\n\t\t\t// items from other containers. This works because when moving\n\t\t\t// an item from one container to another the\n\t\t\t// currentContainer is switched before the placeholder is moved.\n\t\t\t//\n\t\t\t// Without this, moving items in \"sub-sortables\" can cause\n\t\t\t// the placeholder to jitter between the outer and inner container.\n\t\t\tif ( item.instance !== this.currentContainer ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Cannot intersect with itself\n\t\t\t// no useless actions that have been done before\n\t\t\t// no action if the item moved is the parent of the item checked\n\t\t\tif ( itemElement !== this.currentItem[ 0 ] &&\n\t\t\t\tthis.placeholder[ intersection === 1 ? \"next\" : \"prev\" ]()[ 0 ] !== itemElement &&\n\t\t\t\t!$.contains( this.placeholder[ 0 ], itemElement ) &&\n\t\t\t\t( this.options.type === \"semi-dynamic\" ?\n\t\t\t\t\t!$.contains( this.element[ 0 ], itemElement ) :\n\t\t\t\t\ttrue\n\t\t\t\t)\n\t\t\t) {\n\n\t\t\t\tthis.direction = intersection === 1 ? \"down\" : \"up\";\n\n\t\t\t\tif ( this.options.tolerance === \"pointer\" || this._intersectsWithSides( item ) ) {\n\t\t\t\t\tthis._rearrange( event, item );\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tthis._contactContainers( event );\n\n\t\t//Interconnect with droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.drag( this, event );\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"sort\", event, this._uiHash() );\n\n\t\tthis.lastPositionAbs = this.positionAbs;\n\t\treturn false;\n\n\t},\n\n\t_mouseStop: function( event, noPropagation ) {\n\n\t\tif ( !event ) {\n\t\t\treturn;\n\t\t}\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tif ( $.ui.ddmanager && !this.options.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.drop( this, event );\n\t\t}\n\n\t\tif ( this.options.revert ) {\n\t\t\tvar that = this,\n\t\t\t\tcur = this.placeholder.offset(),\n\t\t\t\taxis = this.options.axis,\n\t\t\t\tanimation = {};\n\n\t\t\tif ( !axis || axis === \"x\" ) {\n\t\t\t\tanimation.left = cur.left - this.offset.parent.left - this.margins.left +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollLeft\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tif ( !axis || axis === \"y\" ) {\n\t\t\t\tanimation.top = cur.top - this.offset.parent.top - this.margins.top +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollTop\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tthis.reverting = true;\n\t\t\t$( this.helper ).animate(\n\t\t\t\tanimation,\n\t\t\t\tparseInt( this.options.revert, 10 ) || 500,\n\t\t\t\tfunction() {\n\t\t\t\t\tthat._clear( event );\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tthis._clear( event, noPropagation );\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tcancel: function() {\n\n\t\tif ( this.dragging ) {\n\n\t\t\tthis._mouseUp( new $.Event( \"mouseup\", { target: null } ) );\n\n\t\t\tif ( this.options.helper === \"original\" ) {\n\t\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t\t} else {\n\t\t\t\tthis.currentItem.show();\n\t\t\t}\n\n\t\t\t//Post deactivating events to containers\n\t\t\tfor ( var i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"deactivate\", null, this._uiHash( this ) );\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", null, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.placeholder ) {\n\n\t\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t\t// it unbinds ALL events from the original node!\n\t\t\tif ( this.placeholder[ 0 ].parentNode ) {\n\t\t\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\t\t\t}\n\t\t\tif ( this.options.helper !== \"original\" && this.helper &&\n\t\t\t\t\tthis.helper[ 0 ].parentNode ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\n\t\t\t$.extend( this, {\n\t\t\t\thelper: null,\n\t\t\t\tdragging: false,\n\t\t\t\treverting: false,\n\t\t\t\t_noFinalSort: null\n\t\t\t} );\n\n\t\t\tif ( this.domPosition.prev ) {\n\t\t\t\t$( this.domPosition.prev ).after( this.currentItem );\n\t\t\t} else {\n\t\t\t\t$( this.domPosition.parent ).prepend( this.currentItem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tserialize: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tstr = [];\n\t\to = o || {};\n\n\t\t$( items ).each( function() {\n\t\t\tvar res = ( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" )\n\t\t\t\t.match( o.expression || ( /(.+)[\\-=_](.+)/ ) );\n\t\t\tif ( res ) {\n\t\t\t\tstr.push(\n\t\t\t\t\t( o.key || res[ 1 ] + \"[]\" ) +\n\t\t\t\t\t\"=\" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );\n\t\t\t}\n\t\t} );\n\n\t\tif ( !str.length && o.key ) {\n\t\t\tstr.push( o.key + \"=\" );\n\t\t}\n\n\t\treturn str.join( \"&\" );\n\n\t},\n\n\ttoArray: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tret = [];\n\n\t\to = o || {};\n\n\t\titems.each( function() {\n\t\t\tret.push( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" );\n\t\t} );\n\t\treturn ret;\n\n\t},\n\n\t/* Be careful with the following core functions */\n\t_intersectsWith: function( item ) {\n\n\t\tvar x1 = this.positionAbs.left,\n\t\t\tx2 = x1 + this.helperProportions.width,\n\t\t\ty1 = this.positionAbs.top,\n\t\t\ty2 = y1 + this.helperProportions.height,\n\t\t\tl = item.left,\n\t\t\tr = l + item.width,\n\t\t\tt = item.top,\n\t\t\tb = t + item.height,\n\t\t\tdyClick = this.offset.click.top,\n\t\t\tdxClick = this.offset.click.left,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) || ( ( y1 + dyClick ) > t &&\n\t\t\t\t( y1 + dyClick ) < b ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) || ( ( x1 + dxClick ) > l &&\n\t\t\t\t( x1 + dxClick ) < r ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( this.options.tolerance === \"pointer\" ||\n\t\t\tthis.options.forcePointerForContainers ||\n\t\t\t( this.options.tolerance !== \"pointer\" &&\n\t\t\t\tthis.helperProportions[ this.floating ? \"width\" : \"height\" ] >\n\t\t\t\titem[ this.floating ? \"width\" : \"height\" ] )\n\t\t) {\n\t\t\treturn isOverElement;\n\t\t} else {\n\n\t\t\treturn ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half\n\t\t\t\tx2 - ( this.helperProportions.width / 2 ) < r && // Left Half\n\t\t\t\tt < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half\n\t\t\t\ty2 - ( this.helperProportions.height / 2 ) < b ); // Top Half\n\n\t\t}\n\t},\n\n\t_intersectsWithPointer: function( item ) {\n\t\tvar verticalDirection, horizontalDirection,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.top + this.offset.click.top, item.top, item.height ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.left + this.offset.click.left, item.left, item.width ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( !isOverElement ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tverticalDirection = this._getDragVerticalDirection();\n\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\treturn this.floating ?\n\t\t\t( ( horizontalDirection === \"right\" || verticalDirection === \"down\" ) ? 2 : 1 )\n\t\t\t: ( verticalDirection && ( verticalDirection === \"down\" ? 2 : 1 ) );\n\n\t},\n\n\t_intersectsWithSides: function( item ) {\n\n\t\tvar isOverBottomHalf = this._isOverAxis( this.positionAbs.top +\n\t\t\t\tthis.offset.click.top, item.top + ( item.height / 2 ), item.height ),\n\t\t\tisOverRightHalf = this._isOverAxis( this.positionAbs.left +\n\t\t\t\tthis.offset.click.left, item.left + ( item.width / 2 ), item.width ),\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif ( this.floating && horizontalDirection ) {\n\t\t\treturn ( ( horizontalDirection === \"right\" && isOverRightHalf ) ||\n\t\t\t\t( horizontalDirection === \"left\" && !isOverRightHalf ) );\n\t\t} else {\n\t\t\treturn verticalDirection && ( ( verticalDirection === \"down\" && isOverBottomHalf ) ||\n\t\t\t\t( verticalDirection === \"up\" && !isOverBottomHalf ) );\n\t\t}\n\n\t},\n\n\t_getDragVerticalDirection: function() {\n\t\tvar delta = this.positionAbs.top - this.lastPositionAbs.top;\n\t\treturn delta !== 0 && ( delta > 0 ? \"down\" : \"up\" );\n\t},\n\n\t_getDragHorizontalDirection: function() {\n\t\tvar delta = this.positionAbs.left - this.lastPositionAbs.left;\n\t\treturn delta !== 0 && ( delta > 0 ? \"right\" : \"left\" );\n\t},\n\n\trefresh: function( event ) {\n\t\tthis._refreshItems( event );\n\t\tthis._setHandleClassName();\n\t\tthis.refreshPositions();\n\t\treturn this;\n\t},\n\n\t_connectWith: function() {\n\t\tvar options = this.options;\n\t\treturn options.connectWith.constructor === String ?\n\t\t\t[ options.connectWith ] :\n\t\t\toptions.connectWith;\n\t},\n\n\t_getItemsAsjQuery: function( connected ) {\n\n\t\tvar i, j, cur, inst,\n\t\t\titems = [],\n\t\t\tqueries = [],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif ( connectWith && connected ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ $.isFunction( inst.options.items ) ?\n\t\t\t\t\t\t\tinst.options.items.call( inst.element ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-placeholder\" ), inst ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tqueries.push( [ $.isFunction( this.options.items ) ?\n\t\t\tthis.options.items\n\t\t\t\t.call( this.element, null, { options: this.options, item: this.currentItem } ) :\n\t\t\t$( this.options.items, this.element )\n\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t.not( \".ui-sortable-placeholder\" ), this ] );\n\n\t\tfunction addItems() {\n\t\t\titems.push( this );\n\t\t}\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\tqueries[ i ][ 0 ].each( addItems );\n\t\t}\n\n\t\treturn $( items );\n\n\t},\n\n\t_removeCurrentsFromItems: function() {\n\n\t\tvar list = this.currentItem.find( \":data(\" + this.widgetName + \"-item)\" );\n\n\t\tthis.items = $.grep( this.items, function( item ) {\n\t\t\tfor ( var j = 0; j < list.length; j++ ) {\n\t\t\t\tif ( list[ j ] === item.item[ 0 ] ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} );\n\n\t},\n\n\t_refreshItems: function( event ) {\n\n\t\tthis.items = [];\n\t\tthis.containers = [ this ];\n\n\t\tvar i, j, cur, inst, targetData, _queries, item, queriesLength,\n\t\t\titems = this.items,\n\t\t\tqueries = [ [ $.isFunction( this.options.items ) ?\n\t\t\t\tthis.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t$( this.options.items, this.element ), this ] ],\n\t\t\tconnectWith = this._connectWith();\n\n\t\t//Shouldn't be run the first time through due to massive slow-down\n\t\tif ( connectWith && this.ready ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ $.isFunction( inst.options.items ) ?\n\t\t\t\t\t\t\tinst.options.items\n\t\t\t\t\t\t\t\t.call( inst.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element ), inst ] );\n\t\t\t\t\t\tthis.containers.push( inst );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\ttargetData = queries[ i ][ 1 ];\n\t\t\t_queries = queries[ i ][ 0 ];\n\n\t\t\tfor ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {\n\t\t\t\titem = $( _queries[ j ] );\n\n\t\t\t\t// Data for target checking (mouse manager)\n\t\t\t\titem.data( this.widgetName + \"-item\", targetData );\n\n\t\t\t\titems.push( {\n\t\t\t\t\titem: item,\n\t\t\t\t\tinstance: targetData,\n\t\t\t\t\twidth: 0, height: 0,\n\t\t\t\t\tleft: 0, top: 0\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t},\n\n\trefreshPositions: function( fast ) {\n\n\t\t// Determine whether items are being displayed horizontally\n\t\tthis.floating = this.items.length ?\n\t\t\tthis.options.axis === \"x\" || this._isFloating( this.items[ 0 ].item ) :\n\t\t\tfalse;\n\n\t\t//This has to be redone because due to the item being moved out/into the offsetParent,\n\t\t// the offsetParent's position will change\n\t\tif ( this.offsetParent && this.helper ) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\tvar i, item, t, p;\n\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\titem = this.items[ i ];\n\n\t\t\t//We ignore calculating positions of all connected containers when we're not over them\n\t\t\tif ( item.instance !== this.currentContainer && this.currentContainer &&\n\t\t\t\t\titem.item[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tt = this.options.toleranceElement ?\n\t\t\t\t$( this.options.toleranceElement, item.item ) :\n\t\t\t\titem.item;\n\n\t\t\tif ( !fast ) {\n\t\t\t\titem.width = t.outerWidth();\n\t\t\t\titem.height = t.outerHeight();\n\t\t\t}\n\n\t\t\tp = t.offset();\n\t\t\titem.left = p.left;\n\t\t\titem.top = p.top;\n\t\t}\n\n\t\tif ( this.options.custom && this.options.custom.refreshContainers ) {\n\t\t\tthis.options.custom.refreshContainers.call( this );\n\t\t} else {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tp = this.containers[ i ].element.offset();\n\t\t\t\tthis.containers[ i ].containerCache.left = p.left;\n\t\t\t\tthis.containers[ i ].containerCache.top = p.top;\n\t\t\t\tthis.containers[ i ].containerCache.width =\n\t\t\t\t\tthis.containers[ i ].element.outerWidth();\n\t\t\t\tthis.containers[ i ].containerCache.height =\n\t\t\t\t\tthis.containers[ i ].element.outerHeight();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_createPlaceholder: function( that ) {\n\t\tthat = that || this;\n\t\tvar className,\n\t\t\to = that.options;\n\n\t\tif ( !o.placeholder || o.placeholder.constructor === String ) {\n\t\t\tclassName = o.placeholder;\n\t\t\to.placeholder = {\n\t\t\t\telement: function() {\n\n\t\t\t\t\tvar nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(),\n\t\t\t\t\t\telement = $( \"<\" + nodeName + \">\", that.document[ 0 ] );\n\n\t\t\t\t\t\tthat._addClass( element, \"ui-sortable-placeholder\",\n\t\t\t\t\t\t\t\tclassName || that.currentItem[ 0 ].className )\n\t\t\t\t\t\t\t._removeClass( element, \"ui-sortable-helper\" );\n\n\t\t\t\t\tif ( nodeName === \"tbody\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder(\n\t\t\t\t\t\t\tthat.currentItem.find( \"tr\" ).eq( 0 ),\n\t\t\t\t\t\t\t$( \"<tr>\", that.document[ 0 ] ).appendTo( element )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if ( nodeName === \"tr\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder( that.currentItem, element );\n\t\t\t\t\t} else if ( nodeName === \"img\" ) {\n\t\t\t\t\t\telement.attr( \"src\", that.currentItem.attr( \"src\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !className ) {\n\t\t\t\t\t\telement.css( \"visibility\", \"hidden\" );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\t\t\t\tupdate: function( container, p ) {\n\n\t\t\t\t\t// 1. If a className is set as 'placeholder option, we don't force sizes -\n\t\t\t\t\t// the class is responsible for that\n\t\t\t\t\t// 2. The option 'forcePlaceholderSize can be enabled to force it even if a\n\t\t\t\t\t// class name is specified\n\t\t\t\t\tif ( className && !o.forcePlaceholderSize ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t//If the element doesn't have a actual height by itself (without styles coming\n\t\t\t\t\t// from a stylesheet), it receives the inline height from the dragged item\n\t\t\t\t\tif ( !p.height() ) {\n\t\t\t\t\t\tp.height(\n\t\t\t\t\t\t\tthat.currentItem.innerHeight() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingTop\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingBottom\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t\tif ( !p.width() ) {\n\t\t\t\t\t\tp.width(\n\t\t\t\t\t\t\tthat.currentItem.innerWidth() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingLeft\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingRight\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthat.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );\n\n\t\t//Append it after the actual current item\n\t\tthat.currentItem.after( that.placeholder );\n\n\t\t//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)\n\t\to.placeholder.update( that, that.placeholder );\n\n\t},\n\n\t_createTrPlaceholder: function( sourceTr, targetTr ) {\n\t\tvar that = this;\n\n\t\tsourceTr.children().each( function() {\n\t\t\t$( \"<td>&#160;</td>\", that.document[ 0 ] )\n\t\t\t\t.attr( \"colspan\", $( this ).attr( \"colspan\" ) || 1 )\n\t\t\t\t.appendTo( targetTr );\n\t\t} );\n\t},\n\n\t_contactContainers: function( event ) {\n\t\tvar i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,\n\t\t\tfloating, axis,\n\t\t\tinnermostContainer = null,\n\t\t\tinnermostIndex = null;\n\n\t\t// Get innermost container that intersects with item\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\n\t\t\t// Never consider a container that's located within the item itself\n\t\t\tif ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( this._intersectsWith( this.containers[ i ].containerCache ) ) {\n\n\t\t\t\t// If we've already found a container and it's more \"inner\" than this, then continue\n\t\t\t\tif ( innermostContainer &&\n\t\t\t\t\t\t$.contains(\n\t\t\t\t\t\t\tthis.containers[ i ].element[ 0 ],\n\t\t\t\t\t\t\tinnermostContainer.element[ 0 ] ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tinnermostContainer = this.containers[ i ];\n\t\t\t\tinnermostIndex = i;\n\n\t\t\t} else {\n\n\t\t\t\t// container doesn't intersect. trigger \"out\" event if necessary\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", event, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t// If no intersecting containers found, return\n\t\tif ( !innermostContainer ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Move the item into the container if it's not there already\n\t\tif ( this.containers.length === 1 ) {\n\t\t\tif ( !this.containers[ innermostIndex ].containerCache.over ) {\n\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t\t}\n\t\t} else {\n\n\t\t\t// When entering a new container, we will find the item with the least distance and\n\t\t\t// append our item near it\n\t\t\tdist = 10000;\n\t\t\titemWithLeastDistance = null;\n\t\t\tfloating = innermostContainer.floating || this._isFloating( this.currentItem );\n\t\t\tposProperty = floating ? \"left\" : \"top\";\n\t\t\tsizeProperty = floating ? \"width\" : \"height\";\n\t\t\taxis = floating ? \"pageX\" : \"pageY\";\n\n\t\t\tfor ( j = this.items.length - 1; j >= 0; j-- ) {\n\t\t\t\tif ( !$.contains(\n\t\t\t\t\t\tthis.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcur = this.items[ j ].item.offset()[ posProperty ];\n\t\t\t\tnearBottom = false;\n\t\t\t\tif ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {\n\t\t\t\t\tnearBottom = true;\n\t\t\t\t}\n\n\t\t\t\tif ( Math.abs( event[ axis ] - cur ) < dist ) {\n\t\t\t\t\tdist = Math.abs( event[ axis ] - cur );\n\t\t\t\t\titemWithLeastDistance = this.items[ j ];\n\t\t\t\t\tthis.direction = nearBottom ? \"up\" : \"down\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Check if dropOnEmpty is enabled\n\t\t\tif ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.currentContainer === this.containers[ innermostIndex ] ) {\n\t\t\t\tif ( !this.currentContainer.containerCache.over ) {\n\t\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash() );\n\t\t\t\t\tthis.currentContainer.containerCache.over = 1;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\titemWithLeastDistance ?\n\t\t\t\tthis._rearrange( event, itemWithLeastDistance, null, true ) :\n\t\t\t\tthis._rearrange( event, null, this.containers[ innermostIndex ].element, true );\n\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"change\", event, this._uiHash( this ) );\n\t\t\tthis.currentContainer = this.containers[ innermostIndex ];\n\n\t\t\t//Update the placeholder\n\t\t\tthis.options.placeholder.update( this.currentContainer, this.placeholder );\n\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t}\n\n\t},\n\n\t_createHelper: function( event ) {\n\n\t\tvar o = this.options,\n\t\t\thelper = $.isFunction( o.helper ) ?\n\t\t\t\t$( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :\n\t\t\t\t( o.helper === \"clone\" ? this.currentItem.clone() : this.currentItem );\n\n\t\t//Add the helper to the DOM if that didn't happen already\n\t\tif ( !helper.parents( \"body\" ).length ) {\n\t\t\t$( o.appendTo !== \"parent\" ?\n\t\t\t\to.appendTo :\n\t\t\t\tthis.currentItem[ 0 ].parentNode )[ 0 ].appendChild( helper[ 0 ] );\n\t\t}\n\n\t\tif ( helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tthis._storedCSS = {\n\t\t\t\twidth: this.currentItem[ 0 ].style.width,\n\t\t\t\theight: this.currentItem[ 0 ].style.height,\n\t\t\t\tposition: this.currentItem.css( \"position\" ),\n\t\t\t\ttop: this.currentItem.css( \"top\" ),\n\t\t\t\tleft: this.currentItem.css( \"left\" )\n\t\t\t};\n\t\t}\n\n\t\tif ( !helper[ 0 ].style.width || o.forceHelperSize ) {\n\t\t\thelper.width( this.currentItem.width() );\n\t\t}\n\t\tif ( !helper[ 0 ].style.height || o.forceHelperSize ) {\n\t\t\thelper.height( this.currentItem.height() );\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_adjustOffsetFromHelper: function( obj ) {\n\t\tif ( typeof obj === \"string\" ) {\n\t\t\tobj = obj.split( \" \" );\n\t\t}\n\t\tif ( $.isArray( obj ) ) {\n\t\t\tobj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };\n\t\t}\n\t\tif ( \"left\" in obj ) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif ( \"right\" in obj ) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif ( \"top\" in obj ) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif ( \"bottom\" in obj ) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t//Get the offsetParent and cache its position\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tvar po = this.offsetParent.offset();\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the\n\t\t// following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the\n\t\t// next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't\n\t\t// the document, which means that the scroll is included in the initial calculation of the\n\t\t// offset of the parent, and never recalculated upon drag\n\t\tif ( this.cssPosition === \"absolute\" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\t// This needs to be actually done for all browsers, since pageX/pageY includes this\n\t\t// information with an ugly IE fix\n\t\tif ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||\n\t\t\t\t( this.offsetParent[ 0 ].tagName &&\n\t\t\t\tthis.offsetParent[ 0 ].tagName.toLowerCase() === \"html\" && $.ui.ie ) ) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + ( parseInt( this.offsetParent.css( \"borderTopWidth\" ), 10 ) || 0 ),\n\t\t\tleft: po.left + ( parseInt( this.offsetParent.css( \"borderLeftWidth\" ), 10 ) || 0 )\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\n\t\tif ( this.cssPosition === \"relative\" ) {\n\t\t\tvar p = this.currentItem.position();\n\t\t\treturn {\n\t\t\t\ttop: p.top - ( parseInt( this.helper.css( \"top\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollTop(),\n\t\t\t\tleft: p.left - ( parseInt( this.helper.css( \"left\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollLeft()\n\t\t\t};\n\t\t} else {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: ( parseInt( this.currentItem.css( \"marginLeft\" ), 10 ) || 0 ),\n\t\t\ttop: ( parseInt( this.currentItem.css( \"marginTop\" ), 10 ) || 0 )\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar ce, co, over,\n\t\t\to = this.options;\n\t\tif ( o.containment === \"parent\" ) {\n\t\t\to.containment = this.helper[ 0 ].parentNode;\n\t\t}\n\t\tif ( o.containment === \"document\" || o.containment === \"window\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t0 - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t0 - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\to.containment === \"document\" ?\n\t\t\t\t\tthis.document.width() :\n\t\t\t\t\tthis.window.width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t( o.containment === \"document\" ?\n\t\t\t\t\t( this.document.height() || document.body.parentNode.scrollHeight ) :\n\t\t\t\t\tthis.window.height() || this.document[ 0 ].body.parentNode.scrollHeight\n\t\t\t\t) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t\tif ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {\n\t\t\tce = $( o.containment )[ 0 ];\n\t\t\tco = $( o.containment ).offset();\n\t\t\tover = ( $( ce ).css( \"overflow\" ) !== \"hidden\" );\n\n\t\t\tthis.containment = [\n\t\t\t\tco.left + ( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingLeft\" ), 10 ) || 0 ) - this.margins.left,\n\t\t\t\tco.top + ( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingTop\" ), 10 ) || 0 ) - this.margins.top,\n\t\t\t\tco.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingRight\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.width - this.margins.left,\n\t\t\t\tco.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingBottom\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t},\n\n\t_convertPositionTo: function( d, pos ) {\n\n\t\tif ( !pos ) {\n\t\t\tpos = this.position;\n\t\t}\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.top\t+\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top * mod -\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.left +\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left * mod\t-\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :\n\t\t\t\t\tscroll.scrollLeft() ) * mod )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function( event ) {\n\n\t\tvar top, left,\n\t\t\to = this.options,\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\t// This is another very weird special case that only happens for relative elements:\n\t\t// 1. If the css position is relative\n\t\t// 2. and the scroll parent is the document or similar to the offset parent\n\t\t// we have to refresh the relative offset during the scroll so there are no jumps\n\t\tif ( this.cssPosition === \"relative\" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {\n\t\t\tthis.offset.relative = this._getRelativeOffset();\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\tif ( this.originalPosition ) { //If we are not dragging yet, we won't check for options\n\n\t\t\tif ( this.containment ) {\n\t\t\t\tif ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {\n\t\t\t\t\tpageX = this.containment[ 0 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {\n\t\t\t\t\tpageY = this.containment[ 1 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {\n\t\t\t\t\tpageX = this.containment[ 2 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {\n\t\t\t\t\tpageY = this.containment[ 3 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( o.grid ) {\n\t\t\t\ttop = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /\n\t\t\t\t\to.grid[ 1 ] ) * o.grid[ 1 ];\n\t\t\t\tpageY = this.containment ?\n\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] &&\n\t\t\t\t\t\ttop - this.offset.click.top <= this.containment[ 3 ] ) ?\n\t\t\t\t\t\t\ttop :\n\t\t\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?\n\t\t\t\t\t\t\t\ttop - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :\n\t\t\t\t\t\t\t\ttop;\n\n\t\t\t\tleft = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /\n\t\t\t\t\to.grid[ 0 ] ) * o.grid[ 0 ];\n\t\t\t\tpageX = this.containment ?\n\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] &&\n\t\t\t\t\t\tleft - this.offset.click.left <= this.containment[ 2 ] ) ?\n\t\t\t\t\t\t\tleft :\n\t\t\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?\n\t\t\t\t\t\t\t\tleft - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :\n\t\t\t\t\t\t\t\tleft;\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageY -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.top -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageX -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.left -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() :\n\t\t\t\t\tscrollIsRootNode ? 0 : scroll.scrollLeft() ) )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_rearrange: function( event, i, a, hardRefresh ) {\n\n\t\ta ? a[ 0 ].appendChild( this.placeholder[ 0 ] ) :\n\t\t\ti.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],\n\t\t\t\t( this.direction === \"down\" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );\n\n\t\t//Various things done here to improve the performance:\n\t\t// 1. we create a setTimeout, that calls refreshPositions\n\t\t// 2. on the instance, we have a counter variable, that get's higher after every append\n\t\t// 3. on the local scope, we copy the counter variable, and check in the timeout,\n\t\t// if it's still the same\n\t\t// 4. this lets only the last addition to the timeout stack through\n\t\tthis.counter = this.counter ? ++this.counter : 1;\n\t\tvar counter = this.counter;\n\n\t\tthis._delay( function() {\n\t\t\tif ( counter === this.counter ) {\n\n\t\t\t\t//Precompute after each DOM insertion, NOT on mousemove\n\t\t\t\tthis.refreshPositions( !hardRefresh );\n\t\t\t}\n\t\t} );\n\n\t},\n\n\t_clear: function( event, noPropagation ) {\n\n\t\tthis.reverting = false;\n\n\t\t// We delay all events that have to be triggered to after the point where the placeholder\n\t\t// has been removed and everything else normalized again\n\t\tvar i,\n\t\t\tdelayedTriggers = [];\n\n\t\t// We first have to update the dom position of the actual currentItem\n\t\t// Note: don't do it if the current item is already removed (by a user), or it gets\n\t\t// reappended (see #4088)\n\t\tif ( !this._noFinalSort && this.currentItem.parent().length ) {\n\t\t\tthis.placeholder.before( this.currentItem );\n\t\t}\n\t\tthis._noFinalSort = null;\n\n\t\tif ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tfor ( i in this._storedCSS ) {\n\t\t\t\tif ( this._storedCSS[ i ] === \"auto\" || this._storedCSS[ i ] === \"static\" ) {\n\t\t\t\t\tthis._storedCSS[ i ] = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t} else {\n\t\t\tthis.currentItem.show();\n\t\t}\n\n\t\tif ( this.fromOutside && !noPropagation ) {\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"receive\", event, this._uiHash( this.fromOutside ) );\n\t\t\t} );\n\t\t}\n\t\tif ( ( this.fromOutside ||\n\t\t\t\tthis.domPosition.prev !==\n\t\t\t\tthis.currentItem.prev().not( \".ui-sortable-helper\" )[ 0 ] ||\n\t\t\t\tthis.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {\n\n\t\t\t// Trigger update callback if the DOM position has changed\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"update\", event, this._uiHash() );\n\t\t\t} );\n\t\t}\n\n\t\t// Check if the items Container has Changed and trigger appropriate\n\t\t// events.\n\t\tif ( this !== this.currentContainer ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\t\tthis._trigger( \"remove\", event, this._uiHash() );\n\t\t\t\t} );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"receive\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"update\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tfunction delayEvent( type, instance, container ) {\n\t\t\treturn function( event ) {\n\t\t\t\tcontainer._trigger( type, event, instance._uiHash( instance ) );\n\t\t\t};\n\t\t}\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"deactivate\", this, this.containers[ i ] ) );\n\t\t\t}\n\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"out\", this, this.containers[ i ] ) );\n\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t}\n\t\t}\n\n\t\t//Do what was originally in plugins\n\t\tif ( this.storedCursor ) {\n\t\t\tthis.document.find( \"body\" ).css( \"cursor\", this.storedCursor );\n\t\t\tthis.storedStylesheet.remove();\n\t\t}\n\t\tif ( this._storedOpacity ) {\n\t\t\tthis.helper.css( \"opacity\", this._storedOpacity );\n\t\t}\n\t\tif ( this._storedZIndex ) {\n\t\t\tthis.helper.css( \"zIndex\", this._storedZIndex === \"auto\" ? \"\" : this._storedZIndex );\n\t\t}\n\n\t\tthis.dragging = false;\n\n\t\tif ( !noPropagation ) {\n\t\t\tthis._trigger( \"beforeStop\", event, this._uiHash() );\n\t\t}\n\n\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t// it unbinds ALL events from the original node!\n\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\n\t\tif ( !this.cancelHelperRemoval ) {\n\t\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\t\t\tthis.helper = null;\n\t\t}\n\n\t\tif ( !noPropagation ) {\n\t\t\tfor ( i = 0; i < delayedTriggers.length; i++ ) {\n\n\t\t\t\t// Trigger all delayed events\n\t\t\t\tdelayedTriggers[ i ].call( this, event );\n\t\t\t}\n\t\t\tthis._trigger( \"stop\", event, this._uiHash() );\n\t\t}\n\n\t\tthis.fromOutside = false;\n\t\treturn !this.cancelHelperRemoval;\n\n\t},\n\n\t_trigger: function() {\n\t\tif ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {\n\t\t\tthis.cancel();\n\t\t}\n\t},\n\n\t_uiHash: function( _inst ) {\n\t\tvar inst = _inst || this;\n\t\treturn {\n\t\t\thelper: inst.helper,\n\t\t\tplaceholder: inst.placeholder || $( [] ),\n\t\t\tposition: inst.position,\n\t\t\toriginalPosition: inst.originalPosition,\n\t\t\toffset: inst.positionAbs,\n\t\t\titem: inst.currentItem,\n\t\t\tsender: _inst ? _inst.element : null\n\t\t};\n\t}\n\n} );\n\n\n/*!\n * jQuery UI Accordion 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Accordion\n//>>group: Widgets\n// jscs:disable maximumLineLength\n//>>description: Displays collapsible content panels for presenting information in a limited amount of space.\n// jscs:enable maximumLineLength\n//>>docs: http://api.jqueryui.com/accordion/\n//>>demos: http://jqueryui.com/accordion/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/accordion.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\nvar widgetsAccordion = $.widget( \"ui.accordion\", {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tactive: 0,\n\t\tanimate: {},\n\t\tclasses: {\n\t\t\t\"ui-accordion-header\": \"ui-corner-top\",\n\t\t\t\"ui-accordion-header-collapsed\": \"ui-corner-all\",\n\t\t\t\"ui-accordion-content\": \"ui-corner-bottom\"\n\t\t},\n\t\tcollapsible: false,\n\t\tevent: \"click\",\n\t\theader: \"> li > :first-child, > :not(li):even\",\n\t\theightStyle: \"auto\",\n\t\ticons: {\n\t\t\tactiveHeader: \"ui-icon-triangle-1-s\",\n\t\t\theader: \"ui-icon-triangle-1-e\"\n\t\t},\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tbeforeActivate: null\n\t},\n\n\thideProps: {\n\t\tborderTopWidth: \"hide\",\n\t\tborderBottomWidth: \"hide\",\n\t\tpaddingTop: \"hide\",\n\t\tpaddingBottom: \"hide\",\n\t\theight: \"hide\"\n\t},\n\n\tshowProps: {\n\t\tborderTopWidth: \"show\",\n\t\tborderBottomWidth: \"show\",\n\t\tpaddingTop: \"show\",\n\t\tpaddingBottom: \"show\",\n\t\theight: \"show\"\n\t},\n\n\t_create: function() {\n\t\tvar options = this.options;\n\n\t\tthis.prevShow = this.prevHide = $();\n\t\tthis._addClass( \"ui-accordion\", \"ui-widget ui-helper-reset\" );\n\t\tthis.element.attr( \"role\", \"tablist\" );\n\n\t\t// Don't allow collapsible: false and active: false / null\n\t\tif ( !options.collapsible && ( options.active === false || options.active == null ) ) {\n\t\t\toptions.active = 0;\n\t\t}\n\n\t\tthis._processPanels();\n\n\t\t// handle negative values\n\t\tif ( options.active < 0 ) {\n\t\t\toptions.active += this.headers.length;\n\t\t}\n\t\tthis._refresh();\n\t},\n\n\t_getCreateEventData: function() {\n\t\treturn {\n\t\t\theader: this.active,\n\t\t\tpanel: !this.active.length ? $() : this.active.next()\n\t\t};\n\t},\n\n\t_createIcons: function() {\n\t\tvar icon, children,\n\t\t\ticons = this.options.icons;\n\n\t\tif ( icons ) {\n\t\t\ticon = $( \"<span>\" );\n\t\t\tthis._addClass( icon, \"ui-accordion-header-icon\", \"ui-icon \" + icons.header );\n\t\t\ticon.prependTo( this.headers );\n\t\t\tchildren = this.active.children( \".ui-accordion-header-icon\" );\n\t\t\tthis._removeClass( children, icons.header )\n\t\t\t\t._addClass( children, null, icons.activeHeader )\n\t\t\t\t._addClass( this.headers, \"ui-accordion-icons\" );\n\t\t}\n\t},\n\n\t_destroyIcons: function() {\n\t\tthis._removeClass( this.headers, \"ui-accordion-icons\" );\n\t\tthis.headers.children( \".ui-accordion-header-icon\" ).remove();\n\t},\n\n\t_destroy: function() {\n\t\tvar contents;\n\n\t\t// Clean up main element\n\t\tthis.element.removeAttr( \"role\" );\n\n\t\t// Clean up headers\n\t\tthis.headers\n\t\t\t.removeAttr( \"role aria-expanded aria-selected aria-controls tabIndex\" )\n\t\t\t.removeUniqueId();\n\n\t\tthis._destroyIcons();\n\n\t\t// Clean up content panels\n\t\tcontents = this.headers.next()\n\t\t\t.css( \"display\", \"\" )\n\t\t\t.removeAttr( \"role aria-hidden aria-labelledby\" )\n\t\t\t.removeUniqueId();\n\n\t\tif ( this.options.heightStyle !== \"content\" ) {\n\t\t\tcontents.css( \"height\", \"\" );\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"active\" ) {\n\n\t\t\t// _activate() will handle invalid values and update this.options\n\t\t\tthis._activate( value );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"event\" ) {\n\t\t\tif ( this.options.event ) {\n\t\t\t\tthis._off( this.headers, this.options.event );\n\t\t\t}\n\t\t\tthis._setupEvents( value );\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\t// Setting collapsible: false while collapsed; open first panel\n\t\tif ( key === \"collapsible\" && !value && this.options.active === false ) {\n\t\t\tthis._activate( 0 );\n\t\t}\n\n\t\tif ( key === \"icons\" ) {\n\t\t\tthis._destroyIcons();\n\t\t\tif ( value ) {\n\t\t\t\tthis._createIcons();\n\t\t\t}\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis.element.attr( \"aria-disabled\", value );\n\n\t\t// Support: IE8 Only\n\t\t// #5332 / #6059 - opacity doesn't cascade to positioned elements in IE\n\t\t// so we need to add the disabled class to the headers and panels\n\t\tthis._toggleClass( null, \"ui-state-disabled\", !!value );\n\t\tthis._toggleClass( this.headers.add( this.headers.next() ), null, \"ui-state-disabled\",\n\t\t\t!!value );\n\t},\n\n\t_keydown: function( event ) {\n\t\tif ( event.altKey || event.ctrlKey ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar keyCode = $.ui.keyCode,\n\t\t\tlength = this.headers.length,\n\t\t\tcurrentIndex = this.headers.index( event.target ),\n\t\t\ttoFocus = false;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase keyCode.RIGHT:\n\t\tcase keyCode.DOWN:\n\t\t\ttoFocus = this.headers[ ( currentIndex + 1 ) % length ];\n\t\t\tbreak;\n\t\tcase keyCode.LEFT:\n\t\tcase keyCode.UP:\n\t\t\ttoFocus = this.headers[ ( currentIndex - 1 + length ) % length ];\n\t\t\tbreak;\n\t\tcase keyCode.SPACE:\n\t\tcase keyCode.ENTER:\n\t\t\tthis._eventHandler( event );\n\t\t\tbreak;\n\t\tcase keyCode.HOME:\n\t\t\ttoFocus = this.headers[ 0 ];\n\t\t\tbreak;\n\t\tcase keyCode.END:\n\t\t\ttoFocus = this.headers[ length - 1 ];\n\t\t\tbreak;\n\t\t}\n\n\t\tif ( toFocus ) {\n\t\t\t$( event.target ).attr( \"tabIndex\", -1 );\n\t\t\t$( toFocus ).attr( \"tabIndex\", 0 );\n\t\t\t$( toFocus ).trigger( \"focus\" );\n\t\t\tevent.preventDefault();\n\t\t}\n\t},\n\n\t_panelKeyDown: function( event ) {\n\t\tif ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {\n\t\t\t$( event.currentTarget ).prev().trigger( \"focus\" );\n\t\t}\n\t},\n\n\trefresh: function() {\n\t\tvar options = this.options;\n\t\tthis._processPanels();\n\n\t\t// Was collapsed or no panel\n\t\tif ( ( options.active === false && options.collapsible === true ) ||\n\t\t\t\t!this.headers.length ) {\n\t\t\toptions.active = false;\n\t\t\tthis.active = $();\n\n\t\t// active false only when collapsible is true\n\t\t} else if ( options.active === false ) {\n\t\t\tthis._activate( 0 );\n\n\t\t// was active, but active panel is gone\n\t\t} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {\n\n\t\t\t// all remaining panel are disabled\n\t\t\tif ( this.headers.length === this.headers.find( \".ui-state-disabled\" ).length ) {\n\t\t\t\toptions.active = false;\n\t\t\t\tthis.active = $();\n\n\t\t\t// activate previous panel\n\t\t\t} else {\n\t\t\t\tthis._activate( Math.max( 0, options.active - 1 ) );\n\t\t\t}\n\n\t\t// was active, active panel still exists\n\t\t} else {\n\n\t\t\t// make sure active index is correct\n\t\t\toptions.active = this.headers.index( this.active );\n\t\t}\n\n\t\tthis._destroyIcons();\n\n\t\tthis._refresh();\n\t},\n\n\t_processPanels: function() {\n\t\tvar prevHeaders = this.headers,\n\t\t\tprevPanels = this.panels;\n\n\t\tthis.headers = this.element.find( this.options.header );\n\t\tthis._addClass( this.headers, \"ui-accordion-header ui-accordion-header-collapsed\",\n\t\t\t\"ui-state-default\" );\n\n\t\tthis.panels = this.headers.next().filter( \":not(.ui-accordion-content-active)\" ).hide();\n\t\tthis._addClass( this.panels, \"ui-accordion-content\", \"ui-helper-reset ui-widget-content\" );\n\n\t\t// Avoid memory leaks (#10056)\n\t\tif ( prevPanels ) {\n\t\t\tthis._off( prevHeaders.not( this.headers ) );\n\t\t\tthis._off( prevPanels.not( this.panels ) );\n\t\t}\n\t},\n\n\t_refresh: function() {\n\t\tvar maxHeight,\n\t\t\toptions = this.options,\n\t\t\theightStyle = options.heightStyle,\n\t\t\tparent = this.element.parent();\n\n\t\tthis.active = this._findActive( options.active );\n\t\tthis._addClass( this.active, \"ui-accordion-header-active\", \"ui-state-active\" )\n\t\t\t._removeClass( this.active, \"ui-accordion-header-collapsed\" );\n\t\tthis._addClass( this.active.next(), \"ui-accordion-content-active\" );\n\t\tthis.active.next().show();\n\n\t\tthis.headers\n\t\t\t.attr( \"role\", \"tab\" )\n\t\t\t.each( function() {\n\t\t\t\tvar header = $( this ),\n\t\t\t\t\theaderId = header.uniqueId().attr( \"id\" ),\n\t\t\t\t\tpanel = header.next(),\n\t\t\t\t\tpanelId = panel.uniqueId().attr( \"id\" );\n\t\t\t\theader.attr( \"aria-controls\", panelId );\n\t\t\t\tpanel.attr( \"aria-labelledby\", headerId );\n\t\t\t} )\n\t\t\t.next()\n\t\t\t\t.attr( \"role\", \"tabpanel\" );\n\n\t\tthis.headers\n\t\t\t.not( this.active )\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-selected\": \"false\",\n\t\t\t\t\t\"aria-expanded\": \"false\",\n\t\t\t\t\ttabIndex: -1\n\t\t\t\t} )\n\t\t\t\t.next()\n\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t\t\t} )\n\t\t\t\t\t.hide();\n\n\t\t// Make sure at least one header is in the tab order\n\t\tif ( !this.active.length ) {\n\t\t\tthis.headers.eq( 0 ).attr( \"tabIndex\", 0 );\n\t\t} else {\n\t\t\tthis.active.attr( {\n\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\ttabIndex: 0\n\t\t\t} )\n\t\t\t\t.next()\n\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t\t\t} );\n\t\t}\n\n\t\tthis._createIcons();\n\n\t\tthis._setupEvents( options.event );\n\n\t\tif ( heightStyle === \"fill\" ) {\n\t\t\tmaxHeight = parent.height();\n\t\t\tthis.element.siblings( \":visible\" ).each( function() {\n\t\t\t\tvar elem = $( this ),\n\t\t\t\t\tposition = elem.css( \"position\" );\n\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.headers.each( function() {\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.headers.next()\n\t\t\t\t.each( function() {\n\t\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\n\t\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\n\t\t\t\t} )\n\t\t\t\t.css( \"overflow\", \"auto\" );\n\t\t} else if ( heightStyle === \"auto\" ) {\n\t\t\tmaxHeight = 0;\n\t\t\tthis.headers.next()\n\t\t\t\t.each( function() {\n\t\t\t\t\tvar isVisible = $( this ).is( \":visible\" );\n\t\t\t\t\tif ( !isVisible ) {\n\t\t\t\t\t\t$( this ).show();\n\t\t\t\t\t}\n\t\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).css( \"height\", \"\" ).height() );\n\t\t\t\t\tif ( !isVisible ) {\n\t\t\t\t\t\t$( this ).hide();\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t\t.height( maxHeight );\n\t\t}\n\t},\n\n\t_activate: function( index ) {\n\t\tvar active = this._findActive( index )[ 0 ];\n\n\t\t// Trying to activate the already active panel\n\t\tif ( active === this.active[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Trying to collapse, simulate a click on the currently active header\n\t\tactive = active || this.active[ 0 ];\n\n\t\tthis._eventHandler( {\n\t\t\ttarget: active,\n\t\t\tcurrentTarget: active,\n\t\t\tpreventDefault: $.noop\n\t\t} );\n\t},\n\n\t_findActive: function( selector ) {\n\t\treturn typeof selector === \"number\" ? this.headers.eq( selector ) : $();\n\t},\n\n\t_setupEvents: function( event ) {\n\t\tvar events = {\n\t\t\tkeydown: \"_keydown\"\n\t\t};\n\t\tif ( event ) {\n\t\t\t$.each( event.split( \" \" ), function( index, eventName ) {\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\n\t\t\t} );\n\t\t}\n\n\t\tthis._off( this.headers.add( this.headers.next() ) );\n\t\tthis._on( this.headers, events );\n\t\tthis._on( this.headers.next(), { keydown: \"_panelKeyDown\" } );\n\t\tthis._hoverable( this.headers );\n\t\tthis._focusable( this.headers );\n\t},\n\n\t_eventHandler: function( event ) {\n\t\tvar activeChildren, clickedChildren,\n\t\t\toptions = this.options,\n\t\t\tactive = this.active,\n\t\t\tclicked = $( event.currentTarget ),\n\t\t\tclickedIsActive = clicked[ 0 ] === active[ 0 ],\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\n\t\t\ttoShow = collapsing ? $() : clicked.next(),\n\t\t\ttoHide = active.next(),\n\t\t\teventData = {\n\t\t\t\toldHeader: active,\n\t\t\t\toldPanel: toHide,\n\t\t\t\tnewHeader: collapsing ? $() : clicked,\n\t\t\t\tnewPanel: toShow\n\t\t\t};\n\n\t\tevent.preventDefault();\n\n\t\tif (\n\n\t\t\t\t// click on active header, but not collapsible\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\n\n\t\t\t\t// allow canceling activation\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\toptions.active = collapsing ? false : this.headers.index( clicked );\n\n\t\t// When the call to ._toggle() comes after the class changes\n\t\t// it causes a very odd bug in IE 8 (see #6720)\n\t\tthis.active = clickedIsActive ? $() : clicked;\n\t\tthis._toggle( eventData );\n\n\t\t// Switch classes\n\t\t// corner classes on the previously active header stay after the animation\n\t\tthis._removeClass( active, \"ui-accordion-header-active\", \"ui-state-active\" );\n\t\tif ( options.icons ) {\n\t\t\tactiveChildren = active.children( \".ui-accordion-header-icon\" );\n\t\t\tthis._removeClass( activeChildren, null, options.icons.activeHeader )\n\t\t\t\t._addClass( activeChildren, null, options.icons.header );\n\t\t}\n\n\t\tif ( !clickedIsActive ) {\n\t\t\tthis._removeClass( clicked, \"ui-accordion-header-collapsed\" )\n\t\t\t\t._addClass( clicked, \"ui-accordion-header-active\", \"ui-state-active\" );\n\t\t\tif ( options.icons ) {\n\t\t\t\tclickedChildren = clicked.children( \".ui-accordion-header-icon\" );\n\t\t\t\tthis._removeClass( clickedChildren, null, options.icons.header )\n\t\t\t\t\t._addClass( clickedChildren, null, options.icons.activeHeader );\n\t\t\t}\n\n\t\t\tthis._addClass( clicked.next(), \"ui-accordion-content-active\" );\n\t\t}\n\t},\n\n\t_toggle: function( data ) {\n\t\tvar toShow = data.newPanel,\n\t\t\ttoHide = this.prevShow.length ? this.prevShow : data.oldPanel;\n\n\t\t// Handle activating a panel during the animation for another activation\n\t\tthis.prevShow.add( this.prevHide ).stop( true, true );\n\t\tthis.prevShow = toShow;\n\t\tthis.prevHide = toHide;\n\n\t\tif ( this.options.animate ) {\n\t\t\tthis._animate( toShow, toHide, data );\n\t\t} else {\n\t\t\ttoHide.hide();\n\t\t\ttoShow.show();\n\t\t\tthis._toggleComplete( data );\n\t\t}\n\n\t\ttoHide.attr( {\n\t\t\t\"aria-hidden\": \"true\"\n\t\t} );\n\t\ttoHide.prev().attr( {\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\"\n\t\t} );\n\n\t\t// if we're switching panels, remove the old header from the tab order\n\t\t// if we're opening from collapsed state, remove the previous header from the tab order\n\t\t// if we're collapsing, then keep the collapsing header in the tab order\n\t\tif ( toShow.length && toHide.length ) {\n\t\t\ttoHide.prev().attr( {\n\t\t\t\t\"tabIndex\": -1,\n\t\t\t\t\"aria-expanded\": \"false\"\n\t\t\t} );\n\t\t} else if ( toShow.length ) {\n\t\t\tthis.headers.filter( function() {\n\t\t\t\treturn parseInt( $( this ).attr( \"tabIndex\" ), 10 ) === 0;\n\t\t\t} )\n\t\t\t\t.attr( \"tabIndex\", -1 );\n\t\t}\n\n\t\ttoShow\n\t\t\t.attr( \"aria-hidden\", \"false\" )\n\t\t\t.prev()\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t} );\n\t},\n\n\t_animate: function( toShow, toHide, data ) {\n\t\tvar total, easing, duration,\n\t\t\tthat = this,\n\t\t\tadjust = 0,\n\t\t\tboxSizing = toShow.css( \"box-sizing\" ),\n\t\t\tdown = toShow.length &&\n\t\t\t\t( !toHide.length || ( toShow.index() < toHide.index() ) ),\n\t\t\tanimate = this.options.animate || {},\n\t\t\toptions = down && animate.down || animate,\n\t\t\tcomplete = function() {\n\t\t\t\tthat._toggleComplete( data );\n\t\t\t};\n\n\t\tif ( typeof options === \"number\" ) {\n\t\t\tduration = options;\n\t\t}\n\t\tif ( typeof options === \"string\" ) {\n\t\t\teasing = options;\n\t\t}\n\n\t\t// fall back from options to animation in case of partial down settings\n\t\teasing = easing || options.easing || animate.easing;\n\t\tduration = duration || options.duration || animate.duration;\n\n\t\tif ( !toHide.length ) {\n\t\t\treturn toShow.animate( this.showProps, duration, easing, complete );\n\t\t}\n\t\tif ( !toShow.length ) {\n\t\t\treturn toHide.animate( this.hideProps, duration, easing, complete );\n\t\t}\n\n\t\ttotal = toShow.show().outerHeight();\n\t\ttoHide.animate( this.hideProps, {\n\t\t\tduration: duration,\n\t\t\teasing: easing,\n\t\t\tstep: function( now, fx ) {\n\t\t\t\tfx.now = Math.round( now );\n\t\t\t}\n\t\t} );\n\t\ttoShow\n\t\t\t.hide()\n\t\t\t.animate( this.showProps, {\n\t\t\t\tduration: duration,\n\t\t\t\teasing: easing,\n\t\t\t\tcomplete: complete,\n\t\t\t\tstep: function( now, fx ) {\n\t\t\t\t\tfx.now = Math.round( now );\n\t\t\t\t\tif ( fx.prop !== \"height\" ) {\n\t\t\t\t\t\tif ( boxSizing === \"content-box\" ) {\n\t\t\t\t\t\t\tadjust += fx.now;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( that.options.heightStyle !== \"content\" ) {\n\t\t\t\t\t\tfx.now = Math.round( total - toHide.outerHeight() - adjust );\n\t\t\t\t\t\tadjust = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t},\n\n\t_toggleComplete: function( data ) {\n\t\tvar toHide = data.oldPanel,\n\t\t\tprev = toHide.prev();\n\n\t\tthis._removeClass( toHide, \"ui-accordion-content-active\" );\n\t\tthis._removeClass( prev, \"ui-accordion-header-active\" )\n\t\t\t._addClass( prev, \"ui-accordion-header-collapsed\" );\n\n\t\t// Work around for rendering bug in IE (#5421)\n\t\tif ( toHide.length ) {\n\t\t\ttoHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;\n\t\t}\n\t\tthis._trigger( \"activate\", null, data );\n\t}\n} );\n\n\n/*!\n * jQuery UI Menu 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Menu\n//>>group: Widgets\n//>>description: Creates nestable menus.\n//>>docs: http://api.jqueryui.com/menu/\n//>>demos: http://jqueryui.com/menu/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/menu.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\nvar widgetsMenu = $.widget( \"ui.menu\", {\n\tversion: \"1.12.1\",\n\tdefaultElement: \"<ul>\",\n\tdelay: 300,\n\toptions: {\n\t\ticons: {\n\t\t\tsubmenu: \"ui-icon-caret-1-e\"\n\t\t},\n\t\titems: \"> *\",\n\t\tmenus: \"ul\",\n\t\tposition: {\n\t\t\tmy: \"left top\",\n\t\t\tat: \"right top\"\n\t\t},\n\t\trole: \"menu\",\n\n\t\t// Callbacks\n\t\tblur: null,\n\t\tfocus: null,\n\t\tselect: null\n\t},\n\n\t_create: function() {\n\t\tthis.activeMenu = this.element;\n\n\t\t// Flag used to prevent firing of the click handler\n\t\t// as the event bubbles up through nested menus\n\t\tthis.mouseHandled = false;\n\t\tthis.element\n\t\t\t.uniqueId()\n\t\t\t.attr( {\n\t\t\t\trole: this.options.role,\n\t\t\t\ttabIndex: 0\n\t\t\t} );\n\n\t\tthis._addClass( \"ui-menu\", \"ui-widget ui-widget-content\" );\n\t\tthis._on( {\n\n\t\t\t// Prevent focus from sticking to links inside menu after clicking\n\t\t\t// them (focus should always stay on UL during navigation).\n\t\t\t\"mousedown .ui-menu-item\": function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t},\n\t\t\t\"click .ui-menu-item\": function( event ) {\n\t\t\t\tvar target = $( event.target );\n\t\t\t\tvar active = $( $.ui.safeActiveElement( this.document[ 0 ] ) );\n\t\t\t\tif ( !this.mouseHandled && target.not( \".ui-state-disabled\" ).length ) {\n\t\t\t\t\tthis.select( event );\n\n\t\t\t\t\t// Only set the mouseHandled flag if the event will bubble, see #9469.\n\t\t\t\t\tif ( !event.isPropagationStopped() ) {\n\t\t\t\t\t\tthis.mouseHandled = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Open submenu on click\n\t\t\t\t\tif ( target.has( \".ui-menu\" ).length ) {\n\t\t\t\t\t\tthis.expand( event );\n\t\t\t\t\t} else if ( !this.element.is( \":focus\" ) &&\n\t\t\t\t\t\t\tactive.closest( \".ui-menu\" ).length ) {\n\n\t\t\t\t\t\t// Redirect focus to the menu\n\t\t\t\t\t\tthis.element.trigger( \"focus\", [ true ] );\n\n\t\t\t\t\t\t// If the active item is on the top level, let it stay active.\n\t\t\t\t\t\t// Otherwise, blur the active item since it is no longer visible.\n\t\t\t\t\t\tif ( this.active && this.active.parents( \".ui-menu\" ).length === 1 ) {\n\t\t\t\t\t\t\tclearTimeout( this.timer );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"mouseenter .ui-menu-item\": function( event ) {\n\n\t\t\t\t// Ignore mouse events while typeahead is active, see #10458.\n\t\t\t\t// Prevents focusing the wrong item when typeahead causes a scroll while the mouse\n\t\t\t\t// is over an item in the menu\n\t\t\t\tif ( this.previousFilter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar actualTarget = $( event.target ).closest( \".ui-menu-item\" ),\n\t\t\t\t\ttarget = $( event.currentTarget );\n\n\t\t\t\t// Ignore bubbled events on parent items, see #11641\n\t\t\t\tif ( actualTarget[ 0 ] !== target[ 0 ] ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Remove ui-state-active class from siblings of the newly focused menu item\n\t\t\t\t// to avoid a jump caused by adjacent elements both having a class with a border\n\t\t\t\tthis._removeClass( target.siblings().children( \".ui-state-active\" ),\n\t\t\t\t\tnull, \"ui-state-active\" );\n\t\t\t\tthis.focus( event, target );\n\t\t\t},\n\t\t\tmouseleave: \"collapseAll\",\n\t\t\t\"mouseleave .ui-menu\": \"collapseAll\",\n\t\t\tfocus: function( event, keepActiveItem ) {\n\n\t\t\t\t// If there's already an active item, keep it active\n\t\t\t\t// If not, activate the first item\n\t\t\t\tvar item = this.active || this.element.find( this.options.items ).eq( 0 );\n\n\t\t\t\tif ( !keepActiveItem ) {\n\t\t\t\t\tthis.focus( event, item );\n\t\t\t\t}\n\t\t\t},\n\t\t\tblur: function( event ) {\n\t\t\t\tthis._delay( function() {\n\t\t\t\t\tvar notContained = !$.contains(\n\t\t\t\t\t\tthis.element[ 0 ],\n\t\t\t\t\t\t$.ui.safeActiveElement( this.document[ 0 ] )\n\t\t\t\t\t);\n\t\t\t\t\tif ( notContained ) {\n\t\t\t\t\t\tthis.collapseAll( event );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t},\n\t\t\tkeydown: \"_keydown\"\n\t\t} );\n\n\t\tthis.refresh();\n\n\t\t// Clicks outside of a menu collapse any open menus\n\t\tthis._on( this.document, {\n\t\t\tclick: function( event ) {\n\t\t\t\tif ( this._closeOnDocumentClick( event ) ) {\n\t\t\t\t\tthis.collapseAll( event );\n\t\t\t\t}\n\n\t\t\t\t// Reset the mouseHandled flag\n\t\t\t\tthis.mouseHandled = false;\n\t\t\t}\n\t\t} );\n\t},\n\n\t_destroy: function() {\n\t\tvar items = this.element.find( \".ui-menu-item\" )\n\t\t\t\t.removeAttr( \"role aria-disabled\" ),\n\t\t\tsubmenus = items.children( \".ui-menu-item-wrapper\" )\n\t\t\t\t.removeUniqueId()\n\t\t\t\t.removeAttr( \"tabIndex role aria-haspopup\" );\n\n\t\t// Destroy (sub)menus\n\t\tthis.element\n\t\t\t.removeAttr( \"aria-activedescendant\" )\n\t\t\t.find( \".ui-menu\" ).addBack()\n\t\t\t\t.removeAttr( \"role aria-labelledby aria-expanded aria-hidden aria-disabled \" +\n\t\t\t\t\t\"tabIndex\" )\n\t\t\t\t.removeUniqueId()\n\t\t\t\t.show();\n\n\t\tsubmenus.children().each( function() {\n\t\t\tvar elem = $( this );\n\t\t\tif ( elem.data( \"ui-menu-submenu-caret\" ) ) {\n\t\t\t\telem.remove();\n\t\t\t}\n\t\t} );\n\t},\n\n\t_keydown: function( event ) {\n\t\tvar match, prev, character, skip,\n\t\t\tpreventDefault = true;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\tthis.previousPage( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\tthis.nextPage( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.HOME:\n\t\t\tthis._move( \"first\", \"first\", event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.END:\n\t\t\tthis._move( \"last\", \"last\", event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.UP:\n\t\t\tthis.previous( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.DOWN:\n\t\t\tthis.next( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.LEFT:\n\t\t\tthis.collapse( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.RIGHT:\n\t\t\tif ( this.active && !this.active.is( \".ui-state-disabled\" ) ) {\n\t\t\t\tthis.expand( event );\n\t\t\t}\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.ENTER:\n\t\tcase $.ui.keyCode.SPACE:\n\t\t\tthis._activate( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.ESCAPE:\n\t\t\tthis.collapse( event );\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tpreventDefault = false;\n\t\t\tprev = this.previousFilter || \"\";\n\t\t\tskip = false;\n\n\t\t\t// Support number pad values\n\t\t\tcharacter = event.keyCode >= 96 && event.keyCode <= 105 ?\n\t\t\t\t( event.keyCode - 96 ).toString() : String.fromCharCode( event.keyCode );\n\n\t\t\tclearTimeout( this.filterTimer );\n\n\t\t\tif ( character === prev ) {\n\t\t\t\tskip = true;\n\t\t\t} else {\n\t\t\t\tcharacter = prev + character;\n\t\t\t}\n\n\t\t\tmatch = this._filterMenuItems( character );\n\t\t\tmatch = skip && match.index( this.active.next() ) !== -1 ?\n\t\t\t\tthis.active.nextAll( \".ui-menu-item\" ) :\n\t\t\t\tmatch;\n\n\t\t\t// If no matches on the current filter, reset to the last character pressed\n\t\t\t// to move down the menu to the first item that starts with that character\n\t\t\tif ( !match.length ) {\n\t\t\t\tcharacter = String.fromCharCode( event.keyCode );\n\t\t\t\tmatch = this._filterMenuItems( character );\n\t\t\t}\n\n\t\t\tif ( match.length ) {\n\t\t\t\tthis.focus( event, match );\n\t\t\t\tthis.previousFilter = character;\n\t\t\t\tthis.filterTimer = this._delay( function() {\n\t\t\t\t\tdelete this.previousFilter;\n\t\t\t\t}, 1000 );\n\t\t\t} else {\n\t\t\t\tdelete this.previousFilter;\n\t\t\t}\n\t\t}\n\n\t\tif ( preventDefault ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t},\n\n\t_activate: function( event ) {\n\t\tif ( this.active && !this.active.is( \".ui-state-disabled\" ) ) {\n\t\t\tif ( this.active.children( \"[aria-haspopup='true']\" ).length ) {\n\t\t\t\tthis.expand( event );\n\t\t\t} else {\n\t\t\t\tthis.select( event );\n\t\t\t}\n\t\t}\n\t},\n\n\trefresh: function() {\n\t\tvar menus, items, newSubmenus, newItems, newWrappers,\n\t\t\tthat = this,\n\t\t\ticon = this.options.icons.submenu,\n\t\t\tsubmenus = this.element.find( this.options.menus );\n\n\t\tthis._toggleClass( \"ui-menu-icons\", null, !!this.element.find( \".ui-icon\" ).length );\n\n\t\t// Initialize nested menus\n\t\tnewSubmenus = submenus.filter( \":not(.ui-menu)\" )\n\t\t\t.hide()\n\t\t\t.attr( {\n\t\t\t\trole: this.options.role,\n\t\t\t\t\"aria-hidden\": \"true\",\n\t\t\t\t\"aria-expanded\": \"false\"\n\t\t\t} )\n\t\t\t.each( function() {\n\t\t\t\tvar menu = $( this ),\n\t\t\t\t\titem = menu.prev(),\n\t\t\t\t\tsubmenuCaret = $( \"<span>\" ).data( \"ui-menu-submenu-caret\", true );\n\n\t\t\t\tthat._addClass( submenuCaret, \"ui-menu-icon\", \"ui-icon \" + icon );\n\t\t\t\titem\n\t\t\t\t\t.attr( \"aria-haspopup\", \"true\" )\n\t\t\t\t\t.prepend( submenuCaret );\n\t\t\t\tmenu.attr( \"aria-labelledby\", item.attr( \"id\" ) );\n\t\t\t} );\n\n\t\tthis._addClass( newSubmenus, \"ui-menu\", \"ui-widget ui-widget-content ui-front\" );\n\n\t\tmenus = submenus.add( this.element );\n\t\titems = menus.find( this.options.items );\n\n\t\t// Initialize menu-items containing spaces and/or dashes only as dividers\n\t\titems.not( \".ui-menu-item\" ).each( function() {\n\t\t\tvar item = $( this );\n\t\t\tif ( that._isDivider( item ) ) {\n\t\t\t\tthat._addClass( item, \"ui-menu-divider\", \"ui-widget-content\" );\n\t\t\t}\n\t\t} );\n\n\t\t// Don't refresh list items that are already adapted\n\t\tnewItems = items.not( \".ui-menu-item, .ui-menu-divider\" );\n\t\tnewWrappers = newItems.children()\n\t\t\t.not( \".ui-menu\" )\n\t\t\t\t.uniqueId()\n\t\t\t\t.attr( {\n\t\t\t\t\ttabIndex: -1,\n\t\t\t\t\trole: this._itemRole()\n\t\t\t\t} );\n\t\tthis._addClass( newItems, \"ui-menu-item\" )\n\t\t\t._addClass( newWrappers, \"ui-menu-item-wrapper\" );\n\n\t\t// Add aria-disabled attribute to any disabled menu item\n\t\titems.filter( \".ui-state-disabled\" ).attr( \"aria-disabled\", \"true\" );\n\n\t\t// If the active item has been removed, blur the menu\n\t\tif ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {\n\t\t\tthis.blur();\n\t\t}\n\t},\n\n\t_itemRole: function() {\n\t\treturn {\n\t\t\tmenu: \"menuitem\",\n\t\t\tlistbox: \"option\"\n\t\t}[ this.options.role ];\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"icons\" ) {\n\t\t\tvar icons = this.element.find( \".ui-menu-icon\" );\n\t\t\tthis._removeClass( icons, null, this.options.icons.submenu )\n\t\t\t\t._addClass( icons, null, value.submenu );\n\t\t}\n\t\tthis._super( key, value );\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis.element.attr( \"aria-disabled\", String( value ) );\n\t\tthis._toggleClass( null, \"ui-state-disabled\", !!value );\n\t},\n\n\tfocus: function( event, item ) {\n\t\tvar nested, focused, activeParent;\n\t\tthis.blur( event, event && event.type === \"focus\" );\n\n\t\tthis._scrollIntoView( item );\n\n\t\tthis.active = item.first();\n\n\t\tfocused = this.active.children( \".ui-menu-item-wrapper\" );\n\t\tthis._addClass( focused, null, \"ui-state-active\" );\n\n\t\t// Only update aria-activedescendant if there's a role\n\t\t// otherwise we assume focus is managed elsewhere\n\t\tif ( this.options.role ) {\n\t\t\tthis.element.attr( \"aria-activedescendant\", focused.attr( \"id\" ) );\n\t\t}\n\n\t\t// Highlight active parent menu item, if any\n\t\tactiveParent = this.active\n\t\t\t.parent()\n\t\t\t\t.closest( \".ui-menu-item\" )\n\t\t\t\t\t.children( \".ui-menu-item-wrapper\" );\n\t\tthis._addClass( activeParent, null, \"ui-state-active\" );\n\n\t\tif ( event && event.type === \"keydown\" ) {\n\t\t\tthis._close();\n\t\t} else {\n\t\t\tthis.timer = this._delay( function() {\n\t\t\t\tthis._close();\n\t\t\t}, this.delay );\n\t\t}\n\n\t\tnested = item.children( \".ui-menu\" );\n\t\tif ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {\n\t\t\tthis._startOpening( nested );\n\t\t}\n\t\tthis.activeMenu = item.parent();\n\n\t\tthis._trigger( \"focus\", event, { item: item } );\n\t},\n\n\t_scrollIntoView: function( item ) {\n\t\tvar borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;\n\t\tif ( this._hasScroll() ) {\n\t\t\tborderTop = parseFloat( $.css( this.activeMenu[ 0 ], \"borderTopWidth\" ) ) || 0;\n\t\t\tpaddingTop = parseFloat( $.css( this.activeMenu[ 0 ], \"paddingTop\" ) ) || 0;\n\t\t\toffset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;\n\t\t\tscroll = this.activeMenu.scrollTop();\n\t\t\telementHeight = this.activeMenu.height();\n\t\t\titemHeight = item.outerHeight();\n\n\t\t\tif ( offset < 0 ) {\n\t\t\t\tthis.activeMenu.scrollTop( scroll + offset );\n\t\t\t} else if ( offset + itemHeight > elementHeight ) {\n\t\t\t\tthis.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );\n\t\t\t}\n\t\t}\n\t},\n\n\tblur: function( event, fromFocus ) {\n\t\tif ( !fromFocus ) {\n\t\t\tclearTimeout( this.timer );\n\t\t}\n\n\t\tif ( !this.active ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._removeClass( this.active.children( \".ui-menu-item-wrapper\" ),\n\t\t\tnull, \"ui-state-active\" );\n\n\t\tthis._trigger( \"blur\", event, { item: this.active } );\n\t\tthis.active = null;\n\t},\n\n\t_startOpening: function( submenu ) {\n\t\tclearTimeout( this.timer );\n\n\t\t// Don't open if already open fixes a Firefox bug that caused a .5 pixel\n\t\t// shift in the submenu position when mousing over the caret icon\n\t\tif ( submenu.attr( \"aria-hidden\" ) !== \"true\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.timer = this._delay( function() {\n\t\t\tthis._close();\n\t\t\tthis._open( submenu );\n\t\t}, this.delay );\n\t},\n\n\t_open: function( submenu ) {\n\t\tvar position = $.extend( {\n\t\t\tof: this.active\n\t\t}, this.options.position );\n\n\t\tclearTimeout( this.timer );\n\t\tthis.element.find( \".ui-menu\" ).not( submenu.parents( \".ui-menu\" ) )\n\t\t\t.hide()\n\t\t\t.attr( \"aria-hidden\", \"true\" );\n\n\t\tsubmenu\n\t\t\t.show()\n\t\t\t.removeAttr( \"aria-hidden\" )\n\t\t\t.attr( \"aria-expanded\", \"true\" )\n\t\t\t.position( position );\n\t},\n\n\tcollapseAll: function( event, all ) {\n\t\tclearTimeout( this.timer );\n\t\tthis.timer = this._delay( function() {\n\n\t\t\t// If we were passed an event, look for the submenu that contains the event\n\t\t\tvar currentMenu = all ? this.element :\n\t\t\t\t$( event && event.target ).closest( this.element.find( \".ui-menu\" ) );\n\n\t\t\t// If we found no valid submenu ancestor, use the main menu to close all\n\t\t\t// sub menus anyway\n\t\t\tif ( !currentMenu.length ) {\n\t\t\t\tcurrentMenu = this.element;\n\t\t\t}\n\n\t\t\tthis._close( currentMenu );\n\n\t\t\tthis.blur( event );\n\n\t\t\t// Work around active item staying active after menu is blurred\n\t\t\tthis._removeClass( currentMenu.find( \".ui-state-active\" ), null, \"ui-state-active\" );\n\n\t\t\tthis.activeMenu = currentMenu;\n\t\t}, this.delay );\n\t},\n\n\t// With no arguments, closes the currently active menu - if nothing is active\n\t// it closes all menus.  If passed an argument, it will search for menus BELOW\n\t_close: function( startMenu ) {\n\t\tif ( !startMenu ) {\n\t\t\tstartMenu = this.active ? this.active.parent() : this.element;\n\t\t}\n\n\t\tstartMenu.find( \".ui-menu\" )\n\t\t\t.hide()\n\t\t\t.attr( \"aria-hidden\", \"true\" )\n\t\t\t.attr( \"aria-expanded\", \"false\" );\n\t},\n\n\t_closeOnDocumentClick: function( event ) {\n\t\treturn !$( event.target ).closest( \".ui-menu\" ).length;\n\t},\n\n\t_isDivider: function( item ) {\n\n\t\t// Match hyphen, em dash, en dash\n\t\treturn !/[^\\-\\u2014\\u2013\\s]/.test( item.text() );\n\t},\n\n\tcollapse: function( event ) {\n\t\tvar newItem = this.active &&\n\t\t\tthis.active.parent().closest( \".ui-menu-item\", this.element );\n\t\tif ( newItem && newItem.length ) {\n\t\t\tthis._close();\n\t\t\tthis.focus( event, newItem );\n\t\t}\n\t},\n\n\texpand: function( event ) {\n\t\tvar newItem = this.active &&\n\t\t\tthis.active\n\t\t\t\t.children( \".ui-menu \" )\n\t\t\t\t\t.find( this.options.items )\n\t\t\t\t\t\t.first();\n\n\t\tif ( newItem && newItem.length ) {\n\t\t\tthis._open( newItem.parent() );\n\n\t\t\t// Delay so Firefox will not hide activedescendant change in expanding submenu from AT\n\t\t\tthis._delay( function() {\n\t\t\t\tthis.focus( event, newItem );\n\t\t\t} );\n\t\t}\n\t},\n\n\tnext: function( event ) {\n\t\tthis._move( \"next\", \"first\", event );\n\t},\n\n\tprevious: function( event ) {\n\t\tthis._move( \"prev\", \"last\", event );\n\t},\n\n\tisFirstItem: function() {\n\t\treturn this.active && !this.active.prevAll( \".ui-menu-item\" ).length;\n\t},\n\n\tisLastItem: function() {\n\t\treturn this.active && !this.active.nextAll( \".ui-menu-item\" ).length;\n\t},\n\n\t_move: function( direction, filter, event ) {\n\t\tvar next;\n\t\tif ( this.active ) {\n\t\t\tif ( direction === \"first\" || direction === \"last\" ) {\n\t\t\t\tnext = this.active\n\t\t\t\t\t[ direction === \"first\" ? \"prevAll\" : \"nextAll\" ]( \".ui-menu-item\" )\n\t\t\t\t\t.eq( -1 );\n\t\t\t} else {\n\t\t\t\tnext = this.active\n\t\t\t\t\t[ direction + \"All\" ]( \".ui-menu-item\" )\n\t\t\t\t\t.eq( 0 );\n\t\t\t}\n\t\t}\n\t\tif ( !next || !next.length || !this.active ) {\n\t\t\tnext = this.activeMenu.find( this.options.items )[ filter ]();\n\t\t}\n\n\t\tthis.focus( event, next );\n\t},\n\n\tnextPage: function( event ) {\n\t\tvar item, base, height;\n\n\t\tif ( !this.active ) {\n\t\t\tthis.next( event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.isLastItem() ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( this._hasScroll() ) {\n\t\t\tbase = this.active.offset().top;\n\t\t\theight = this.element.height();\n\t\t\tthis.active.nextAll( \".ui-menu-item\" ).each( function() {\n\t\t\t\titem = $( this );\n\t\t\t\treturn item.offset().top - base - height < 0;\n\t\t\t} );\n\n\t\t\tthis.focus( event, item );\n\t\t} else {\n\t\t\tthis.focus( event, this.activeMenu.find( this.options.items )\n\t\t\t\t[ !this.active ? \"first\" : \"last\" ]() );\n\t\t}\n\t},\n\n\tpreviousPage: function( event ) {\n\t\tvar item, base, height;\n\t\tif ( !this.active ) {\n\t\t\tthis.next( event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.isFirstItem() ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( this._hasScroll() ) {\n\t\t\tbase = this.active.offset().top;\n\t\t\theight = this.element.height();\n\t\t\tthis.active.prevAll( \".ui-menu-item\" ).each( function() {\n\t\t\t\titem = $( this );\n\t\t\t\treturn item.offset().top - base + height > 0;\n\t\t\t} );\n\n\t\t\tthis.focus( event, item );\n\t\t} else {\n\t\t\tthis.focus( event, this.activeMenu.find( this.options.items ).first() );\n\t\t}\n\t},\n\n\t_hasScroll: function() {\n\t\treturn this.element.outerHeight() < this.element.prop( \"scrollHeight\" );\n\t},\n\n\tselect: function( event ) {\n\n\t\t// TODO: It should never be possible to not have an active item at this\n\t\t// point, but the tests don't trigger mouseenter before click.\n\t\tthis.active = this.active || $( event.target ).closest( \".ui-menu-item\" );\n\t\tvar ui = { item: this.active };\n\t\tif ( !this.active.has( \".ui-menu\" ).length ) {\n\t\t\tthis.collapseAll( event, true );\n\t\t}\n\t\tthis._trigger( \"select\", event, ui );\n\t},\n\n\t_filterMenuItems: function( character ) {\n\t\tvar escapedCharacter = character.replace( /[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\" ),\n\t\t\tregex = new RegExp( \"^\" + escapedCharacter, \"i\" );\n\n\t\treturn this.activeMenu\n\t\t\t.find( this.options.items )\n\n\t\t\t\t// Only match on items, not dividers or other content (#10571)\n\t\t\t\t.filter( \".ui-menu-item\" )\n\t\t\t\t\t.filter( function() {\n\t\t\t\t\t\treturn regex.test(\n\t\t\t\t\t\t\t$.trim( $( this ).children( \".ui-menu-item-wrapper\" ).text() ) );\n\t\t\t\t\t} );\n\t}\n} );\n\n\n/*!\n * jQuery UI Autocomplete 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Autocomplete\n//>>group: Widgets\n//>>description: Lists suggested words as the user is typing.\n//>>docs: http://api.jqueryui.com/autocomplete/\n//>>demos: http://jqueryui.com/autocomplete/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/autocomplete.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.autocomplete\", {\n\tversion: \"1.12.1\",\n\tdefaultElement: \"<input>\",\n\toptions: {\n\t\tappendTo: null,\n\t\tautoFocus: false,\n\t\tdelay: 300,\n\t\tminLength: 1,\n\t\tposition: {\n\t\t\tmy: \"left top\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"none\"\n\t\t},\n\t\tsource: null,\n\n\t\t// Callbacks\n\t\tchange: null,\n\t\tclose: null,\n\t\tfocus: null,\n\t\topen: null,\n\t\tresponse: null,\n\t\tsearch: null,\n\t\tselect: null\n\t},\n\n\trequestIndex: 0,\n\tpending: 0,\n\n\t_create: function() {\n\n\t\t// Some browsers only repeat keydown events, not keypress events,\n\t\t// so we use the suppressKeyPress flag to determine if we've already\n\t\t// handled the keydown event. #7269\n\t\t// Unfortunately the code for & in keypress is the same as the up arrow,\n\t\t// so we use the suppressKeyPressRepeat flag to avoid handling keypress\n\t\t// events when we know the keydown event was used to modify the\n\t\t// search term. #7799\n\t\tvar suppressKeyPress, suppressKeyPressRepeat, suppressInput,\n\t\t\tnodeName = this.element[ 0 ].nodeName.toLowerCase(),\n\t\t\tisTextarea = nodeName === \"textarea\",\n\t\t\tisInput = nodeName === \"input\";\n\n\t\t// Textareas are always multi-line\n\t\t// Inputs are always single-line, even if inside a contentEditable element\n\t\t// IE also treats inputs as contentEditable\n\t\t// All other element types are determined by whether or not they're contentEditable\n\t\tthis.isMultiLine = isTextarea || !isInput && this._isContentEditable( this.element );\n\n\t\tthis.valueMethod = this.element[ isTextarea || isInput ? \"val\" : \"text\" ];\n\t\tthis.isNewMenu = true;\n\n\t\tthis._addClass( \"ui-autocomplete-input\" );\n\t\tthis.element.attr( \"autocomplete\", \"off\" );\n\n\t\tthis._on( this.element, {\n\t\t\tkeydown: function( event ) {\n\t\t\t\tif ( this.element.prop( \"readOnly\" ) ) {\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tsuppressInput = true;\n\t\t\t\t\tsuppressKeyPressRepeat = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsuppressKeyPress = false;\n\t\t\t\tsuppressInput = false;\n\t\t\t\tsuppressKeyPressRepeat = false;\n\t\t\t\tvar keyCode = $.ui.keyCode;\n\t\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase keyCode.PAGE_UP:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._move( \"previousPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.PAGE_DOWN:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._move( \"nextPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.UP:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._keyEvent( \"previous\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.DOWN:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._keyEvent( \"next\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.ENTER:\n\n\t\t\t\t\t// when menu is open and has focus\n\t\t\t\t\tif ( this.menu.active ) {\n\n\t\t\t\t\t\t// #6055 - Opera still allows the keypress to occur\n\t\t\t\t\t\t// which causes forms to submit\n\t\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tthis.menu.select( event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.TAB:\n\t\t\t\t\tif ( this.menu.active ) {\n\t\t\t\t\t\tthis.menu.select( event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.ESCAPE:\n\t\t\t\t\tif ( this.menu.element.is( \":visible\" ) ) {\n\t\t\t\t\t\tif ( !this.isMultiLine ) {\n\t\t\t\t\t\t\tthis._value( this.term );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.close( event );\n\n\t\t\t\t\t\t// Different browsers have different default behavior for escape\n\t\t\t\t\t\t// Single press can mean undo or clear\n\t\t\t\t\t\t// Double press in IE means clear the whole form\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tsuppressKeyPressRepeat = true;\n\n\t\t\t\t\t// search timeout should be triggered before the input value is changed\n\t\t\t\t\tthis._searchTimeout( event );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tkeypress: function( event ) {\n\t\t\t\tif ( suppressKeyPress ) {\n\t\t\t\t\tsuppressKeyPress = false;\n\t\t\t\t\tif ( !this.isMultiLine || this.menu.element.is( \":visible\" ) ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( suppressKeyPressRepeat ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Replicate some key handlers to allow them to repeat in Firefox and Opera\n\t\t\t\tvar keyCode = $.ui.keyCode;\n\t\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase keyCode.PAGE_UP:\n\t\t\t\t\tthis._move( \"previousPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.PAGE_DOWN:\n\t\t\t\t\tthis._move( \"nextPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.UP:\n\t\t\t\t\tthis._keyEvent( \"previous\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.DOWN:\n\t\t\t\t\tthis._keyEvent( \"next\", event );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tinput: function( event ) {\n\t\t\t\tif ( suppressInput ) {\n\t\t\t\t\tsuppressInput = false;\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis._searchTimeout( event );\n\t\t\t},\n\t\t\tfocus: function() {\n\t\t\t\tthis.selectedItem = null;\n\t\t\t\tthis.previous = this._value();\n\t\t\t},\n\t\t\tblur: function( event ) {\n\t\t\t\tif ( this.cancelBlur ) {\n\t\t\t\t\tdelete this.cancelBlur;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tclearTimeout( this.searching );\n\t\t\t\tthis.close( event );\n\t\t\t\tthis._change( event );\n\t\t\t}\n\t\t} );\n\n\t\tthis._initSource();\n\t\tthis.menu = $( \"<ul>\" )\n\t\t\t.appendTo( this._appendTo() )\n\t\t\t.menu( {\n\n\t\t\t\t// disable ARIA support, the live region takes care of that\n\t\t\t\trole: null\n\t\t\t} )\n\t\t\t.hide()\n\t\t\t.menu( \"instance\" );\n\n\t\tthis._addClass( this.menu.element, \"ui-autocomplete\", \"ui-front\" );\n\t\tthis._on( this.menu.element, {\n\t\t\tmousedown: function( event ) {\n\n\t\t\t\t// prevent moving focus out of the text field\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t// IE doesn't prevent moving focus even with event.preventDefault()\n\t\t\t\t// so we set a flag to know when we should ignore the blur event\n\t\t\t\tthis.cancelBlur = true;\n\t\t\t\tthis._delay( function() {\n\t\t\t\t\tdelete this.cancelBlur;\n\n\t\t\t\t\t// Support: IE 8 only\n\t\t\t\t\t// Right clicking a menu item or selecting text from the menu items will\n\t\t\t\t\t// result in focus moving out of the input. However, we've already received\n\t\t\t\t\t// and ignored the blur event because of the cancelBlur flag set above. So\n\t\t\t\t\t// we restore focus to ensure that the menu closes properly based on the user's\n\t\t\t\t\t// next actions.\n\t\t\t\t\tif ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {\n\t\t\t\t\t\tthis.element.trigger( \"focus\" );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t},\n\t\t\tmenufocus: function( event, ui ) {\n\t\t\t\tvar label, item;\n\n\t\t\t\t// support: Firefox\n\t\t\t\t// Prevent accidental activation of menu items in Firefox (#7024 #9118)\n\t\t\t\tif ( this.isNewMenu ) {\n\t\t\t\t\tthis.isNewMenu = false;\n\t\t\t\t\tif ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {\n\t\t\t\t\t\tthis.menu.blur();\n\n\t\t\t\t\t\tthis.document.one( \"mousemove\", function() {\n\t\t\t\t\t\t\t$( event.target ).trigger( event.originalEvent );\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\titem = ui.item.data( \"ui-autocomplete-item\" );\n\t\t\t\tif ( false !== this._trigger( \"focus\", event, { item: item } ) ) {\n\n\t\t\t\t\t// use value to match what will end up in the input, if it was a key event\n\t\t\t\t\tif ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {\n\t\t\t\t\t\tthis._value( item.value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Announce the value in the liveRegion\n\t\t\t\tlabel = ui.item.attr( \"aria-label\" ) || item.value;\n\t\t\t\tif ( label && $.trim( label ).length ) {\n\t\t\t\t\tthis.liveRegion.children().hide();\n\t\t\t\t\t$( \"<div>\" ).text( label ).appendTo( this.liveRegion );\n\t\t\t\t}\n\t\t\t},\n\t\t\tmenuselect: function( event, ui ) {\n\t\t\t\tvar item = ui.item.data( \"ui-autocomplete-item\" ),\n\t\t\t\t\tprevious = this.previous;\n\n\t\t\t\t// Only trigger when focus was lost (click on menu)\n\t\t\t\tif ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {\n\t\t\t\t\tthis.element.trigger( \"focus\" );\n\t\t\t\t\tthis.previous = previous;\n\n\t\t\t\t\t// #6109 - IE triggers two focus events and the second\n\t\t\t\t\t// is asynchronous, so we need to reset the previous\n\t\t\t\t\t// term synchronously and asynchronously :-(\n\t\t\t\t\tthis._delay( function() {\n\t\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t\tthis.selectedItem = item;\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\tif ( false !== this._trigger( \"select\", event, { item: item } ) ) {\n\t\t\t\t\tthis._value( item.value );\n\t\t\t\t}\n\n\t\t\t\t// reset the term after the select event\n\t\t\t\t// this allows custom select handling to work properly\n\t\t\t\tthis.term = this._value();\n\n\t\t\t\tthis.close( event );\n\t\t\t\tthis.selectedItem = item;\n\t\t\t}\n\t\t} );\n\n\t\tthis.liveRegion = $( \"<div>\", {\n\t\t\trole: \"status\",\n\t\t\t\"aria-live\": \"assertive\",\n\t\t\t\"aria-relevant\": \"additions\"\n\t\t} )\n\t\t\t.appendTo( this.document[ 0 ].body );\n\n\t\tthis._addClass( this.liveRegion, null, \"ui-helper-hidden-accessible\" );\n\n\t\t// Turning off autocomplete prevents the browser from remembering the\n\t\t// value when navigating through history, so we re-enable autocomplete\n\t\t// if the page is unloaded before the widget is destroyed. #7790\n\t\tthis._on( this.window, {\n\t\t\tbeforeunload: function() {\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_destroy: function() {\n\t\tclearTimeout( this.searching );\n\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\tthis.menu.element.remove();\n\t\tthis.liveRegion.remove();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\t\tif ( key === \"source\" ) {\n\t\t\tthis._initSource();\n\t\t}\n\t\tif ( key === \"appendTo\" ) {\n\t\t\tthis.menu.element.appendTo( this._appendTo() );\n\t\t}\n\t\tif ( key === \"disabled\" && value && this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\t},\n\n\t_isEventTargetInWidget: function( event ) {\n\t\tvar menuElement = this.menu.element[ 0 ];\n\n\t\treturn event.target === this.element[ 0 ] ||\n\t\t\tevent.target === menuElement ||\n\t\t\t$.contains( menuElement, event.target );\n\t},\n\n\t_closeOnClickOutside: function( event ) {\n\t\tif ( !this._isEventTargetInWidget( event ) ) {\n\t\t\tthis.close();\n\t\t}\n\t},\n\n\t_appendTo: function() {\n\t\tvar element = this.options.appendTo;\n\n\t\tif ( element ) {\n\t\t\telement = element.jquery || element.nodeType ?\n\t\t\t\t$( element ) :\n\t\t\t\tthis.document.find( element ).eq( 0 );\n\t\t}\n\n\t\tif ( !element || !element[ 0 ] ) {\n\t\t\telement = this.element.closest( \".ui-front, dialog\" );\n\t\t}\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[ 0 ].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_initSource: function() {\n\t\tvar array, url,\n\t\t\tthat = this;\n\t\tif ( $.isArray( this.options.source ) ) {\n\t\t\tarray = this.options.source;\n\t\t\tthis.source = function( request, response ) {\n\t\t\t\tresponse( $.ui.autocomplete.filter( array, request.term ) );\n\t\t\t};\n\t\t} else if ( typeof this.options.source === \"string\" ) {\n\t\t\turl = this.options.source;\n\t\t\tthis.source = function( request, response ) {\n\t\t\t\tif ( that.xhr ) {\n\t\t\t\t\tthat.xhr.abort();\n\t\t\t\t}\n\t\t\t\tthat.xhr = $.ajax( {\n\t\t\t\t\turl: url,\n\t\t\t\t\tdata: request,\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\tsuccess: function( data ) {\n\t\t\t\t\t\tresponse( data );\n\t\t\t\t\t},\n\t\t\t\t\terror: function() {\n\t\t\t\t\t\tresponse( [] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t};\n\t\t} else {\n\t\t\tthis.source = this.options.source;\n\t\t}\n\t},\n\n\t_searchTimeout: function( event ) {\n\t\tclearTimeout( this.searching );\n\t\tthis.searching = this._delay( function() {\n\n\t\t\t// Search if the value has changed, or if the user retypes the same value (see #7434)\n\t\t\tvar equalValues = this.term === this._value(),\n\t\t\t\tmenuVisible = this.menu.element.is( \":visible\" ),\n\t\t\t\tmodifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;\n\n\t\t\tif ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {\n\t\t\t\tthis.selectedItem = null;\n\t\t\t\tthis.search( null, event );\n\t\t\t}\n\t\t}, this.options.delay );\n\t},\n\n\tsearch: function( value, event ) {\n\t\tvalue = value != null ? value : this._value();\n\n\t\t// Always save the actual value, not the one passed as an argument\n\t\tthis.term = this._value();\n\n\t\tif ( value.length < this.options.minLength ) {\n\t\t\treturn this.close( event );\n\t\t}\n\n\t\tif ( this._trigger( \"search\", event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this._search( value );\n\t},\n\n\t_search: function( value ) {\n\t\tthis.pending++;\n\t\tthis._addClass( \"ui-autocomplete-loading\" );\n\t\tthis.cancelSearch = false;\n\n\t\tthis.source( { term: value }, this._response() );\n\t},\n\n\t_response: function() {\n\t\tvar index = ++this.requestIndex;\n\n\t\treturn $.proxy( function( content ) {\n\t\t\tif ( index === this.requestIndex ) {\n\t\t\t\tthis.__response( content );\n\t\t\t}\n\n\t\t\tthis.pending--;\n\t\t\tif ( !this.pending ) {\n\t\t\t\tthis._removeClass( \"ui-autocomplete-loading\" );\n\t\t\t}\n\t\t}, this );\n\t},\n\n\t__response: function( content ) {\n\t\tif ( content ) {\n\t\t\tcontent = this._normalize( content );\n\t\t}\n\t\tthis._trigger( \"response\", null, { content: content } );\n\t\tif ( !this.options.disabled && content && content.length && !this.cancelSearch ) {\n\t\t\tthis._suggest( content );\n\t\t\tthis._trigger( \"open\" );\n\t\t} else {\n\n\t\t\t// use ._close() instead of .close() so we don't cancel future searches\n\t\t\tthis._close();\n\t\t}\n\t},\n\n\tclose: function( event ) {\n\t\tthis.cancelSearch = true;\n\t\tthis._close( event );\n\t},\n\n\t_close: function( event ) {\n\n\t\t// Remove the handler that closes the menu on outside clicks\n\t\tthis._off( this.document, \"mousedown\" );\n\n\t\tif ( this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis.menu.element.hide();\n\t\t\tthis.menu.blur();\n\t\t\tthis.isNewMenu = true;\n\t\t\tthis._trigger( \"close\", event );\n\t\t}\n\t},\n\n\t_change: function( event ) {\n\t\tif ( this.previous !== this._value() ) {\n\t\t\tthis._trigger( \"change\", event, { item: this.selectedItem } );\n\t\t}\n\t},\n\n\t_normalize: function( items ) {\n\n\t\t// assume all items have the right format when the first item is complete\n\t\tif ( items.length && items[ 0 ].label && items[ 0 ].value ) {\n\t\t\treturn items;\n\t\t}\n\t\treturn $.map( items, function( item ) {\n\t\t\tif ( typeof item === \"string\" ) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: item,\n\t\t\t\t\tvalue: item\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn $.extend( {}, item, {\n\t\t\t\tlabel: item.label || item.value,\n\t\t\t\tvalue: item.value || item.label\n\t\t\t} );\n\t\t} );\n\t},\n\n\t_suggest: function( items ) {\n\t\tvar ul = this.menu.element.empty();\n\t\tthis._renderMenu( ul, items );\n\t\tthis.isNewMenu = true;\n\t\tthis.menu.refresh();\n\n\t\t// Size and position menu\n\t\tul.show();\n\t\tthis._resizeMenu();\n\t\tul.position( $.extend( {\n\t\t\tof: this.element\n\t\t}, this.options.position ) );\n\n\t\tif ( this.options.autoFocus ) {\n\t\t\tthis.menu.next();\n\t\t}\n\n\t\t// Listen for interactions outside of the widget (#6642)\n\t\tthis._on( this.document, {\n\t\t\tmousedown: \"_closeOnClickOutside\"\n\t\t} );\n\t},\n\n\t_resizeMenu: function() {\n\t\tvar ul = this.menu.element;\n\t\tul.outerWidth( Math.max(\n\n\t\t\t// Firefox wraps long text (possibly a rounding bug)\n\t\t\t// so we add 1px to avoid the wrapping (#7513)\n\t\t\tul.width( \"\" ).outerWidth() + 1,\n\t\t\tthis.element.outerWidth()\n\t\t) );\n\t},\n\n\t_renderMenu: function( ul, items ) {\n\t\tvar that = this;\n\t\t$.each( items, function( index, item ) {\n\t\t\tthat._renderItemData( ul, item );\n\t\t} );\n\t},\n\n\t_renderItemData: function( ul, item ) {\n\t\treturn this._renderItem( ul, item ).data( \"ui-autocomplete-item\", item );\n\t},\n\n\t_renderItem: function( ul, item ) {\n\t\treturn $( \"<li>\" )\n\t\t\t.append( $( \"<div>\" ).text( item.label ) )\n\t\t\t.appendTo( ul );\n\t},\n\n\t_move: function( direction, event ) {\n\t\tif ( !this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis.search( null, event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.menu.isFirstItem() && /^previous/.test( direction ) ||\n\t\t\t\tthis.menu.isLastItem() && /^next/.test( direction ) ) {\n\n\t\t\tif ( !this.isMultiLine ) {\n\t\t\t\tthis._value( this.term );\n\t\t\t}\n\n\t\t\tthis.menu.blur();\n\t\t\treturn;\n\t\t}\n\t\tthis.menu[ direction ]( event );\n\t},\n\n\twidget: function() {\n\t\treturn this.menu.element;\n\t},\n\n\t_value: function() {\n\t\treturn this.valueMethod.apply( this.element, arguments );\n\t},\n\n\t_keyEvent: function( keyEvent, event ) {\n\t\tif ( !this.isMultiLine || this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis._move( keyEvent, event );\n\n\t\t\t// Prevents moving cursor to beginning/end of the text field in some browsers\n\t\t\tevent.preventDefault();\n\t\t}\n\t},\n\n\t// Support: Chrome <=50\n\t// We should be able to just use this.element.prop( \"isContentEditable\" )\n\t// but hidden elements always report false in Chrome.\n\t// https://code.google.com/p/chromium/issues/detail?id=313082\n\t_isContentEditable: function( element ) {\n\t\tif ( !element.length ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar editable = element.prop( \"contentEditable\" );\n\n\t\tif ( editable === \"inherit\" ) {\n\t\t  return this._isContentEditable( element.parent() );\n\t\t}\n\n\t\treturn editable === \"true\";\n\t}\n} );\n\n$.extend( $.ui.autocomplete, {\n\tescapeRegex: function( value ) {\n\t\treturn value.replace( /[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\" );\n\t},\n\tfilter: function( array, term ) {\n\t\tvar matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), \"i\" );\n\t\treturn $.grep( array, function( value ) {\n\t\t\treturn matcher.test( value.label || value.value || value );\n\t\t} );\n\t}\n} );\n\n// Live region extension, adding a `messages` option\n// NOTE: This is an experimental API. We are still investigating\n// a full solution for string manipulation and internationalization.\n$.widget( \"ui.autocomplete\", $.ui.autocomplete, {\n\toptions: {\n\t\tmessages: {\n\t\t\tnoResults: \"No search results.\",\n\t\t\tresults: function( amount ) {\n\t\t\t\treturn amount + ( amount > 1 ? \" results are\" : \" result is\" ) +\n\t\t\t\t\t\" available, use up and down arrow keys to navigate.\";\n\t\t\t}\n\t\t}\n\t},\n\n\t__response: function( content ) {\n\t\tvar message;\n\t\tthis._superApply( arguments );\n\t\tif ( this.options.disabled || this.cancelSearch ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( content && content.length ) {\n\t\t\tmessage = this.options.messages.results( content.length );\n\t\t} else {\n\t\t\tmessage = this.options.messages.noResults;\n\t\t}\n\t\tthis.liveRegion.children().hide();\n\t\t$( \"<div>\" ).text( message ).appendTo( this.liveRegion );\n\t}\n} );\n\nvar widgetsAutocomplete = $.ui.autocomplete;\n\n\n/*!\n * jQuery UI Controlgroup 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Controlgroup\n//>>group: Widgets\n//>>description: Visually groups form control widgets\n//>>docs: http://api.jqueryui.com/controlgroup/\n//>>demos: http://jqueryui.com/controlgroup/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/controlgroup.css\n//>>css.theme: ../../themes/base/theme.css\n\n\nvar controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g;\n\nvar widgetsControlgroup = $.widget( \"ui.controlgroup\", {\n\tversion: \"1.12.1\",\n\tdefaultElement: \"<div>\",\n\toptions: {\n\t\tdirection: \"horizontal\",\n\t\tdisabled: null,\n\t\tonlyVisible: true,\n\t\titems: {\n\t\t\t\"button\": \"input[type=button], input[type=submit], input[type=reset], button, a\",\n\t\t\t\"controlgroupLabel\": \".ui-controlgroup-label\",\n\t\t\t\"checkboxradio\": \"input[type='checkbox'], input[type='radio']\",\n\t\t\t\"selectmenu\": \"select\",\n\t\t\t\"spinner\": \".ui-spinner-input\"\n\t\t}\n\t},\n\n\t_create: function() {\n\t\tthis._enhance();\n\t},\n\n\t// To support the enhanced option in jQuery Mobile, we isolate DOM manipulation\n\t_enhance: function() {\n\t\tthis.element.attr( \"role\", \"toolbar\" );\n\t\tthis.refresh();\n\t},\n\n\t_destroy: function() {\n\t\tthis._callChildMethod( \"destroy\" );\n\t\tthis.childWidgets.removeData( \"ui-controlgroup-data\" );\n\t\tthis.element.removeAttr( \"role\" );\n\t\tif ( this.options.items.controlgroupLabel ) {\n\t\t\tthis.element\n\t\t\t\t.find( this.options.items.controlgroupLabel )\n\t\t\t\t.find( \".ui-controlgroup-label-contents\" )\n\t\t\t\t.contents().unwrap();\n\t\t}\n\t},\n\n\t_initWidgets: function() {\n\t\tvar that = this,\n\t\t\tchildWidgets = [];\n\n\t\t// First we iterate over each of the items options\n\t\t$.each( this.options.items, function( widget, selector ) {\n\t\t\tvar labels;\n\t\t\tvar options = {};\n\n\t\t\t// Make sure the widget has a selector set\n\t\t\tif ( !selector ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( widget === \"controlgroupLabel\" ) {\n\t\t\t\tlabels = that.element.find( selector );\n\t\t\t\tlabels.each( function() {\n\t\t\t\t\tvar element = $( this );\n\n\t\t\t\t\tif ( element.children( \".ui-controlgroup-label-contents\" ).length ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telement.contents()\n\t\t\t\t\t\t.wrapAll( \"<span class='ui-controlgroup-label-contents'></span>\" );\n\t\t\t\t} );\n\t\t\t\tthat._addClass( labels, null, \"ui-widget ui-widget-content ui-state-default\" );\n\t\t\t\tchildWidgets = childWidgets.concat( labels.get() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Make sure the widget actually exists\n\t\t\tif ( !$.fn[ widget ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// We assume everything is in the middle to start because we can't determine\n\t\t\t// first / last elements until all enhancments are done.\n\t\t\tif ( that[ \"_\" + widget + \"Options\" ] ) {\n\t\t\t\toptions = that[ \"_\" + widget + \"Options\" ]( \"middle\" );\n\t\t\t} else {\n\t\t\t\toptions = { classes: {} };\n\t\t\t}\n\n\t\t\t// Find instances of this widget inside controlgroup and init them\n\t\t\tthat.element\n\t\t\t\t.find( selector )\n\t\t\t\t.each( function() {\n\t\t\t\t\tvar element = $( this );\n\t\t\t\t\tvar instance = element[ widget ]( \"instance\" );\n\n\t\t\t\t\t// We need to clone the default options for this type of widget to avoid\n\t\t\t\t\t// polluting the variable options which has a wider scope than a single widget.\n\t\t\t\t\tvar instanceOptions = $.widget.extend( {}, options );\n\n\t\t\t\t\t// If the button is the child of a spinner ignore it\n\t\t\t\t\t// TODO: Find a more generic solution\n\t\t\t\t\tif ( widget === \"button\" && element.parent( \".ui-spinner\" ).length ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Create the widget if it doesn't exist\n\t\t\t\t\tif ( !instance ) {\n\t\t\t\t\t\tinstance = element[ widget ]()[ widget ]( \"instance\" );\n\t\t\t\t\t}\n\t\t\t\t\tif ( instance ) {\n\t\t\t\t\t\tinstanceOptions.classes =\n\t\t\t\t\t\t\tthat._resolveClassesValues( instanceOptions.classes, instance );\n\t\t\t\t\t}\n\t\t\t\t\telement[ widget ]( instanceOptions );\n\n\t\t\t\t\t// Store an instance of the controlgroup to be able to reference\n\t\t\t\t\t// from the outermost element for changing options and refresh\n\t\t\t\t\tvar widgetElement = element[ widget ]( \"widget\" );\n\t\t\t\t\t$.data( widgetElement[ 0 ], \"ui-controlgroup-data\",\n\t\t\t\t\t\tinstance ? instance : element[ widget ]( \"instance\" ) );\n\n\t\t\t\t\tchildWidgets.push( widgetElement[ 0 ] );\n\t\t\t\t} );\n\t\t} );\n\n\t\tthis.childWidgets = $( $.unique( childWidgets ) );\n\t\tthis._addClass( this.childWidgets, \"ui-controlgroup-item\" );\n\t},\n\n\t_callChildMethod: function( method ) {\n\t\tthis.childWidgets.each( function() {\n\t\t\tvar element = $( this ),\n\t\t\t\tdata = element.data( \"ui-controlgroup-data\" );\n\t\t\tif ( data && data[ method ] ) {\n\t\t\t\tdata[ method ]();\n\t\t\t}\n\t\t} );\n\t},\n\n\t_updateCornerClass: function( element, position ) {\n\t\tvar remove = \"ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all\";\n\t\tvar add = this._buildSimpleOptions( position, \"label\" ).classes.label;\n\n\t\tthis._removeClass( element, null, remove );\n\t\tthis._addClass( element, null, add );\n\t},\n\n\t_buildSimpleOptions: function( position, key ) {\n\t\tvar direction = this.options.direction === \"vertical\";\n\t\tvar result = {\n\t\t\tclasses: {}\n\t\t};\n\t\tresult.classes[ key ] = {\n\t\t\t\"middle\": \"\",\n\t\t\t\"first\": \"ui-corner-\" + ( direction ? \"top\" : \"left\" ),\n\t\t\t\"last\": \"ui-corner-\" + ( direction ? \"bottom\" : \"right\" ),\n\t\t\t\"only\": \"ui-corner-all\"\n\t\t}[ position ];\n\n\t\treturn result;\n\t},\n\n\t_spinnerOptions: function( position ) {\n\t\tvar options = this._buildSimpleOptions( position, \"ui-spinner\" );\n\n\t\toptions.classes[ \"ui-spinner-up\" ] = \"\";\n\t\toptions.classes[ \"ui-spinner-down\" ] = \"\";\n\n\t\treturn options;\n\t},\n\n\t_buttonOptions: function( position ) {\n\t\treturn this._buildSimpleOptions( position, \"ui-button\" );\n\t},\n\n\t_checkboxradioOptions: function( position ) {\n\t\treturn this._buildSimpleOptions( position, \"ui-checkboxradio-label\" );\n\t},\n\n\t_selectmenuOptions: function( position ) {\n\t\tvar direction = this.options.direction === \"vertical\";\n\t\treturn {\n\t\t\twidth: direction ? \"auto\" : false,\n\t\t\tclasses: {\n\t\t\t\tmiddle: {\n\t\t\t\t\t\"ui-selectmenu-button-open\": \"\",\n\t\t\t\t\t\"ui-selectmenu-button-closed\": \"\"\n\t\t\t\t},\n\t\t\t\tfirst: {\n\t\t\t\t\t\"ui-selectmenu-button-open\": \"ui-corner-\" + ( direction ? \"top\" : \"tl\" ),\n\t\t\t\t\t\"ui-selectmenu-button-closed\": \"ui-corner-\" + ( direction ? \"top\" : \"left\" )\n\t\t\t\t},\n\t\t\t\tlast: {\n\t\t\t\t\t\"ui-selectmenu-button-open\": direction ? \"\" : \"ui-corner-tr\",\n\t\t\t\t\t\"ui-selectmenu-button-closed\": \"ui-corner-\" + ( direction ? \"bottom\" : \"right\" )\n\t\t\t\t},\n\t\t\t\tonly: {\n\t\t\t\t\t\"ui-selectmenu-button-open\": \"ui-corner-top\",\n\t\t\t\t\t\"ui-selectmenu-button-closed\": \"ui-corner-all\"\n\t\t\t\t}\n\n\t\t\t}[ position ]\n\t\t};\n\t},\n\n\t_resolveClassesValues: function( classes, instance ) {\n\t\tvar result = {};\n\t\t$.each( classes, function( key ) {\n\t\t\tvar current = instance.options.classes[ key ] || \"\";\n\t\t\tcurrent = $.trim( current.replace( controlgroupCornerRegex, \"\" ) );\n\t\t\tresult[ key ] = ( current + \" \" + classes[ key ] ).replace( /\\s+/g, \" \" );\n\t\t} );\n\t\treturn result;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"direction\" ) {\n\t\t\tthis._removeClass( \"ui-controlgroup-\" + this.options.direction );\n\t\t}\n\n\t\tthis._super( key, value );\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._callChildMethod( value ? \"disable\" : \"enable\" );\n\t\t\treturn;\n\t\t}\n\n\t\tthis.refresh();\n\t},\n\n\trefresh: function() {\n\t\tvar children,\n\t\t\tthat = this;\n\n\t\tthis._addClass( \"ui-controlgroup ui-controlgroup-\" + this.options.direction );\n\n\t\tif ( this.options.direction === \"horizontal\" ) {\n\t\t\tthis._addClass( null, \"ui-helper-clearfix\" );\n\t\t}\n\t\tthis._initWidgets();\n\n\t\tchildren = this.childWidgets;\n\n\t\t// We filter here because we need to track all childWidgets not just the visible ones\n\t\tif ( this.options.onlyVisible ) {\n\t\t\tchildren = children.filter( \":visible\" );\n\t\t}\n\n\t\tif ( children.length ) {\n\n\t\t\t// We do this last because we need to make sure all enhancment is done\n\t\t\t// before determining first and last\n\t\t\t$.each( [ \"first\", \"last\" ], function( index, value ) {\n\t\t\t\tvar instance = children[ value ]().data( \"ui-controlgroup-data\" );\n\n\t\t\t\tif ( instance && that[ \"_\" + instance.widgetName + \"Options\" ] ) {\n\t\t\t\t\tvar options = that[ \"_\" + instance.widgetName + \"Options\" ](\n\t\t\t\t\t\tchildren.length === 1 ? \"only\" : value\n\t\t\t\t\t);\n\t\t\t\t\toptions.classes = that._resolveClassesValues( options.classes, instance );\n\t\t\t\t\tinstance.element[ instance.widgetName ]( options );\n\t\t\t\t} else {\n\t\t\t\t\tthat._updateCornerClass( children[ value ](), value );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Finally call the refresh method on each of the child widgets.\n\t\t\tthis._callChildMethod( \"refresh\" );\n\t\t}\n\t}\n} );\n\n/*!\n * jQuery UI Checkboxradio 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Checkboxradio\n//>>group: Widgets\n//>>description: Enhances a form with multiple themeable checkboxes or radio buttons.\n//>>docs: http://api.jqueryui.com/checkboxradio/\n//>>demos: http://jqueryui.com/checkboxradio/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/button.css\n//>>css.structure: ../../themes/base/checkboxradio.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.checkboxradio\", [ $.ui.formResetMixin, {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tdisabled: null,\n\t\tlabel: null,\n\t\ticon: true,\n\t\tclasses: {\n\t\t\t\"ui-checkboxradio-label\": \"ui-corner-all\",\n\t\t\t\"ui-checkboxradio-icon\": \"ui-corner-all\"\n\t\t}\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar disabled, labels;\n\t\tvar that = this;\n\t\tvar options = this._super() || {};\n\n\t\t// We read the type here, because it makes more sense to throw a element type error first,\n\t\t// rather then the error for lack of a label. Often if its the wrong type, it\n\t\t// won't have a label (e.g. calling on a div, btn, etc)\n\t\tthis._readType();\n\n\t\tlabels = this.element.labels();\n\n\t\t// If there are multiple labels, use the last one\n\t\tthis.label = $( labels[ labels.length - 1 ] );\n\t\tif ( !this.label.length ) {\n\t\t\t$.error( \"No label found for checkboxradio widget\" );\n\t\t}\n\n\t\tthis.originalLabel = \"\";\n\n\t\t// We need to get the label text but this may also need to make sure it does not contain the\n\t\t// input itself.\n\t\tthis.label.contents().not( this.element[ 0 ] ).each( function() {\n\n\t\t\t// The label contents could be text, html, or a mix. We concat each element to get a\n\t\t\t// string representation of the label, without the input as part of it.\n\t\t\tthat.originalLabel += this.nodeType === 3 ? $( this ).text() : this.outerHTML;\n\t\t} );\n\n\t\t// Set the label option if we found label text\n\t\tif ( this.originalLabel ) {\n\t\t\toptions.label = this.originalLabel;\n\t\t}\n\n\t\tdisabled = this.element[ 0 ].disabled;\n\t\tif ( disabled != null ) {\n\t\t\toptions.disabled = disabled;\n\t\t}\n\t\treturn options;\n\t},\n\n\t_create: function() {\n\t\tvar checked = this.element[ 0 ].checked;\n\n\t\tthis._bindFormResetHandler();\n\n\t\tif ( this.options.disabled == null ) {\n\t\t\tthis.options.disabled = this.element[ 0 ].disabled;\n\t\t}\n\n\t\tthis._setOption( \"disabled\", this.options.disabled );\n\t\tthis._addClass( \"ui-checkboxradio\", \"ui-helper-hidden-accessible\" );\n\t\tthis._addClass( this.label, \"ui-checkboxradio-label\", \"ui-button ui-widget\" );\n\n\t\tif ( this.type === \"radio\" ) {\n\t\t\tthis._addClass( this.label, \"ui-checkboxradio-radio-label\" );\n\t\t}\n\n\t\tif ( this.options.label && this.options.label !== this.originalLabel ) {\n\t\t\tthis._updateLabel();\n\t\t} else if ( this.originalLabel ) {\n\t\t\tthis.options.label = this.originalLabel;\n\t\t}\n\n\t\tthis._enhance();\n\n\t\tif ( checked ) {\n\t\t\tthis._addClass( this.label, \"ui-checkboxradio-checked\", \"ui-state-active\" );\n\t\t\tif ( this.icon ) {\n\t\t\t\tthis._addClass( this.icon, null, \"ui-state-hover\" );\n\t\t\t}\n\t\t}\n\n\t\tthis._on( {\n\t\t\tchange: \"_toggleClasses\",\n\t\t\tfocus: function() {\n\t\t\t\tthis._addClass( this.label, null, \"ui-state-focus ui-visual-focus\" );\n\t\t\t},\n\t\t\tblur: function() {\n\t\t\t\tthis._removeClass( this.label, null, \"ui-state-focus ui-visual-focus\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_readType: function() {\n\t\tvar nodeName = this.element[ 0 ].nodeName.toLowerCase();\n\t\tthis.type = this.element[ 0 ].type;\n\t\tif ( nodeName !== \"input\" || !/radio|checkbox/.test( this.type ) ) {\n\t\t\t$.error( \"Can't create checkboxradio on element.nodeName=\" + nodeName +\n\t\t\t\t\" and element.type=\" + this.type );\n\t\t}\n\t},\n\n\t// Support jQuery Mobile enhanced option\n\t_enhance: function() {\n\t\tthis._updateIcon( this.element[ 0 ].checked );\n\t},\n\n\twidget: function() {\n\t\treturn this.label;\n\t},\n\n\t_getRadioGroup: function() {\n\t\tvar group;\n\t\tvar name = this.element[ 0 ].name;\n\t\tvar nameSelector = \"input[name='\" + $.ui.escapeSelector( name ) + \"']\";\n\n\t\tif ( !name ) {\n\t\t\treturn $( [] );\n\t\t}\n\n\t\tif ( this.form.length ) {\n\t\t\tgroup = $( this.form[ 0 ].elements ).filter( nameSelector );\n\t\t} else {\n\n\t\t\t// Not inside a form, check all inputs that also are not inside a form\n\t\t\tgroup = $( nameSelector ).filter( function() {\n\t\t\t\treturn $( this ).form().length === 0;\n\t\t\t} );\n\t\t}\n\n\t\treturn group.not( this.element );\n\t},\n\n\t_toggleClasses: function() {\n\t\tvar checked = this.element[ 0 ].checked;\n\t\tthis._toggleClass( this.label, \"ui-checkboxradio-checked\", \"ui-state-active\", checked );\n\n\t\tif ( this.options.icon && this.type === \"checkbox\" ) {\n\t\t\tthis._toggleClass( this.icon, null, \"ui-icon-check ui-state-checked\", checked )\n\t\t\t\t._toggleClass( this.icon, null, \"ui-icon-blank\", !checked );\n\t\t}\n\n\t\tif ( this.type === \"radio\" ) {\n\t\t\tthis._getRadioGroup()\n\t\t\t\t.each( function() {\n\t\t\t\t\tvar instance = $( this ).checkboxradio( \"instance\" );\n\n\t\t\t\t\tif ( instance ) {\n\t\t\t\t\t\tinstance._removeClass( instance.label,\n\t\t\t\t\t\t\t\"ui-checkboxradio-checked\", \"ui-state-active\" );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tthis._unbindFormResetHandler();\n\n\t\tif ( this.icon ) {\n\t\t\tthis.icon.remove();\n\t\t\tthis.iconSpace.remove();\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\n\t\t// We don't allow the value to be set to nothing\n\t\tif ( key === \"label\" && !value ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._toggleClass( this.label, null, \"ui-state-disabled\", value );\n\t\t\tthis.element[ 0 ].disabled = value;\n\n\t\t\t// Don't refresh when setting disabled\n\t\t\treturn;\n\t\t}\n\t\tthis.refresh();\n\t},\n\n\t_updateIcon: function( checked ) {\n\t\tvar toAdd = \"ui-icon ui-icon-background \";\n\n\t\tif ( this.options.icon ) {\n\t\t\tif ( !this.icon ) {\n\t\t\t\tthis.icon = $( \"<span>\" );\n\t\t\t\tthis.iconSpace = $( \"<span> </span>\" );\n\t\t\t\tthis._addClass( this.iconSpace, \"ui-checkboxradio-icon-space\" );\n\t\t\t}\n\n\t\t\tif ( this.type === \"checkbox\" ) {\n\t\t\t\ttoAdd += checked ? \"ui-icon-check ui-state-checked\" : \"ui-icon-blank\";\n\t\t\t\tthis._removeClass( this.icon, null, checked ? \"ui-icon-blank\" : \"ui-icon-check\" );\n\t\t\t} else {\n\t\t\t\ttoAdd += \"ui-icon-blank\";\n\t\t\t}\n\t\t\tthis._addClass( this.icon, \"ui-checkboxradio-icon\", toAdd );\n\t\t\tif ( !checked ) {\n\t\t\t\tthis._removeClass( this.icon, null, \"ui-icon-check ui-state-checked\" );\n\t\t\t}\n\t\t\tthis.icon.prependTo( this.label ).after( this.iconSpace );\n\t\t} else if ( this.icon !== undefined ) {\n\t\t\tthis.icon.remove();\n\t\t\tthis.iconSpace.remove();\n\t\t\tdelete this.icon;\n\t\t}\n\t},\n\n\t_updateLabel: function() {\n\n\t\t// Remove the contents of the label ( minus the icon, icon space, and input )\n\t\tvar contents = this.label.contents().not( this.element[ 0 ] );\n\t\tif ( this.icon ) {\n\t\t\tcontents = contents.not( this.icon[ 0 ] );\n\t\t}\n\t\tif ( this.iconSpace ) {\n\t\t\tcontents = contents.not( this.iconSpace[ 0 ] );\n\t\t}\n\t\tcontents.remove();\n\n\t\tthis.label.append( this.options.label );\n\t},\n\n\trefresh: function() {\n\t\tvar checked = this.element[ 0 ].checked,\n\t\t\tisDisabled = this.element[ 0 ].disabled;\n\n\t\tthis._updateIcon( checked );\n\t\tthis._toggleClass( this.label, \"ui-checkboxradio-checked\", \"ui-state-active\", checked );\n\t\tif ( this.options.label !== null ) {\n\t\t\tthis._updateLabel();\n\t\t}\n\n\t\tif ( isDisabled !== this.options.disabled ) {\n\t\t\tthis._setOptions( { \"disabled\": isDisabled } );\n\t\t}\n\t}\n\n} ] );\n\nvar widgetsCheckboxradio = $.ui.checkboxradio;\n\n\n/*!\n * jQuery UI Button 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Button\n//>>group: Widgets\n//>>description: Enhances a form with themeable buttons.\n//>>docs: http://api.jqueryui.com/button/\n//>>demos: http://jqueryui.com/button/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/button.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.button\", {\n\tversion: \"1.12.1\",\n\tdefaultElement: \"<button>\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-button\": \"ui-corner-all\"\n\t\t},\n\t\tdisabled: null,\n\t\ticon: null,\n\t\ticonPosition: \"beginning\",\n\t\tlabel: null,\n\t\tshowLabel: true\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar disabled,\n\n\t\t\t// This is to support cases like in jQuery Mobile where the base widget does have\n\t\t\t// an implementation of _getCreateOptions\n\t\t\toptions = this._super() || {};\n\n\t\tthis.isInput = this.element.is( \"input\" );\n\n\t\tdisabled = this.element[ 0 ].disabled;\n\t\tif ( disabled != null ) {\n\t\t\toptions.disabled = disabled;\n\t\t}\n\n\t\tthis.originalLabel = this.isInput ? this.element.val() : this.element.html();\n\t\tif ( this.originalLabel ) {\n\t\t\toptions.label = this.originalLabel;\n\t\t}\n\n\t\treturn options;\n\t},\n\n\t_create: function() {\n\t\tif ( !this.option.showLabel & !this.options.icon ) {\n\t\t\tthis.options.showLabel = true;\n\t\t}\n\n\t\t// We have to check the option again here even though we did in _getCreateOptions,\n\t\t// because null may have been passed on init which would override what was set in\n\t\t// _getCreateOptions\n\t\tif ( this.options.disabled == null ) {\n\t\t\tthis.options.disabled = this.element[ 0 ].disabled || false;\n\t\t}\n\n\t\tthis.hasTitle = !!this.element.attr( \"title\" );\n\n\t\t// Check to see if the label needs to be set or if its already correct\n\t\tif ( this.options.label && this.options.label !== this.originalLabel ) {\n\t\t\tif ( this.isInput ) {\n\t\t\t\tthis.element.val( this.options.label );\n\t\t\t} else {\n\t\t\t\tthis.element.html( this.options.label );\n\t\t\t}\n\t\t}\n\t\tthis._addClass( \"ui-button\", \"ui-widget\" );\n\t\tthis._setOption( \"disabled\", this.options.disabled );\n\t\tthis._enhance();\n\n\t\tif ( this.element.is( \"a\" ) ) {\n\t\t\tthis._on( {\n\t\t\t\t\"keyup\": function( event ) {\n\t\t\t\t\tif ( event.keyCode === $.ui.keyCode.SPACE ) {\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Support: PhantomJS <= 1.9, IE 8 Only\n\t\t\t\t\t\t// If a native click is available use it so we actually cause navigation\n\t\t\t\t\t\t// otherwise just trigger a click event\n\t\t\t\t\t\tif ( this.element[ 0 ].click ) {\n\t\t\t\t\t\t\tthis.element[ 0 ].click();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.element.trigger( \"click\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t},\n\n\t_enhance: function() {\n\t\tif ( !this.element.is( \"button\" ) ) {\n\t\t\tthis.element.attr( \"role\", \"button\" );\n\t\t}\n\n\t\tif ( this.options.icon ) {\n\t\t\tthis._updateIcon( \"icon\", this.options.icon );\n\t\t\tthis._updateTooltip();\n\t\t}\n\t},\n\n\t_updateTooltip: function() {\n\t\tthis.title = this.element.attr( \"title\" );\n\n\t\tif ( !this.options.showLabel && !this.title ) {\n\t\t\tthis.element.attr( \"title\", this.options.label );\n\t\t}\n\t},\n\n\t_updateIcon: function( option, value ) {\n\t\tvar icon = option !== \"iconPosition\",\n\t\t\tposition = icon ? this.options.iconPosition : value,\n\t\t\tdisplayBlock = position === \"top\" || position === \"bottom\";\n\n\t\t// Create icon\n\t\tif ( !this.icon ) {\n\t\t\tthis.icon = $( \"<span>\" );\n\n\t\t\tthis._addClass( this.icon, \"ui-button-icon\", \"ui-icon\" );\n\n\t\t\tif ( !this.options.showLabel ) {\n\t\t\t\tthis._addClass( \"ui-button-icon-only\" );\n\t\t\t}\n\t\t} else if ( icon ) {\n\n\t\t\t// If we are updating the icon remove the old icon class\n\t\t\tthis._removeClass( this.icon, null, this.options.icon );\n\t\t}\n\n\t\t// If we are updating the icon add the new icon class\n\t\tif ( icon ) {\n\t\t\tthis._addClass( this.icon, null, value );\n\t\t}\n\n\t\tthis._attachIcon( position );\n\n\t\t// If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove\n\t\t// the iconSpace if there is one.\n\t\tif ( displayBlock ) {\n\t\t\tthis._addClass( this.icon, null, \"ui-widget-icon-block\" );\n\t\t\tif ( this.iconSpace ) {\n\t\t\t\tthis.iconSpace.remove();\n\t\t\t}\n\t\t} else {\n\n\t\t\t// Position is beginning or end so remove the ui-widget-icon-block class and add the\n\t\t\t// space if it does not exist\n\t\t\tif ( !this.iconSpace ) {\n\t\t\t\tthis.iconSpace = $( \"<span> </span>\" );\n\t\t\t\tthis._addClass( this.iconSpace, \"ui-button-icon-space\" );\n\t\t\t}\n\t\t\tthis._removeClass( this.icon, null, \"ui-wiget-icon-block\" );\n\t\t\tthis._attachIconSpace( position );\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tthis.element.removeAttr( \"role\" );\n\n\t\tif ( this.icon ) {\n\t\t\tthis.icon.remove();\n\t\t}\n\t\tif ( this.iconSpace ) {\n\t\t\tthis.iconSpace.remove();\n\t\t}\n\t\tif ( !this.hasTitle ) {\n\t\t\tthis.element.removeAttr( \"title\" );\n\t\t}\n\t},\n\n\t_attachIconSpace: function( iconPosition ) {\n\t\tthis.icon[ /^(?:end|bottom)/.test( iconPosition ) ? \"before\" : \"after\" ]( this.iconSpace );\n\t},\n\n\t_attachIcon: function( iconPosition ) {\n\t\tthis.element[ /^(?:end|bottom)/.test( iconPosition ) ? \"append\" : \"prepend\" ]( this.icon );\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar newShowLabel = options.showLabel === undefined ?\n\t\t\t\tthis.options.showLabel :\n\t\t\t\toptions.showLabel,\n\t\t\tnewIcon = options.icon === undefined ? this.options.icon : options.icon;\n\n\t\tif ( !newShowLabel && !newIcon ) {\n\t\t\toptions.showLabel = true;\n\t\t}\n\t\tthis._super( options );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"icon\" ) {\n\t\t\tif ( value ) {\n\t\t\t\tthis._updateIcon( key, value );\n\t\t\t} else if ( this.icon ) {\n\t\t\t\tthis.icon.remove();\n\t\t\t\tif ( this.iconSpace ) {\n\t\t\t\t\tthis.iconSpace.remove();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"iconPosition\" ) {\n\t\t\tthis._updateIcon( key, value );\n\t\t}\n\n\t\t// Make sure we can't end up with a button that has neither text nor icon\n\t\tif ( key === \"showLabel\" ) {\n\t\t\t\tthis._toggleClass( \"ui-button-icon-only\", null, !value );\n\t\t\t\tthis._updateTooltip();\n\t\t}\n\n\t\tif ( key === \"label\" ) {\n\t\t\tif ( this.isInput ) {\n\t\t\t\tthis.element.val( value );\n\t\t\t} else {\n\n\t\t\t\t// If there is an icon, append it, else nothing then append the value\n\t\t\t\t// this avoids removal of the icon when setting label text\n\t\t\t\tthis.element.html( value );\n\t\t\t\tif ( this.icon ) {\n\t\t\t\t\tthis._attachIcon( this.options.iconPosition );\n\t\t\t\t\tthis._attachIconSpace( this.options.iconPosition );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._toggleClass( null, \"ui-state-disabled\", value );\n\t\t\tthis.element[ 0 ].disabled = value;\n\t\t\tif ( value ) {\n\t\t\t\tthis.element.blur();\n\t\t\t}\n\t\t}\n\t},\n\n\trefresh: function() {\n\n\t\t// Make sure to only check disabled if its an element that supports this otherwise\n\t\t// check for the disabled class to determine state\n\t\tvar isDisabled = this.element.is( \"input, button\" ) ?\n\t\t\tthis.element[ 0 ].disabled : this.element.hasClass( \"ui-button-disabled\" );\n\n\t\tif ( isDisabled !== this.options.disabled ) {\n\t\t\tthis._setOptions( { disabled: isDisabled } );\n\t\t}\n\n\t\tthis._updateTooltip();\n\t}\n} );\n\n// DEPRECATED\nif ( $.uiBackCompat !== false ) {\n\n\t// Text and Icons options\n\t$.widget( \"ui.button\", $.ui.button, {\n\t\toptions: {\n\t\t\ttext: true,\n\t\t\ticons: {\n\t\t\t\tprimary: null,\n\t\t\t\tsecondary: null\n\t\t\t}\n\t\t},\n\n\t\t_create: function() {\n\t\t\tif ( this.options.showLabel && !this.options.text ) {\n\t\t\t\tthis.options.showLabel = this.options.text;\n\t\t\t}\n\t\t\tif ( !this.options.showLabel && this.options.text ) {\n\t\t\t\tthis.options.text = this.options.showLabel;\n\t\t\t}\n\t\t\tif ( !this.options.icon && ( this.options.icons.primary ||\n\t\t\t\t\tthis.options.icons.secondary ) ) {\n\t\t\t\tif ( this.options.icons.primary ) {\n\t\t\t\t\tthis.options.icon = this.options.icons.primary;\n\t\t\t\t} else {\n\t\t\t\t\tthis.options.icon = this.options.icons.secondary;\n\t\t\t\t\tthis.options.iconPosition = \"end\";\n\t\t\t\t}\n\t\t\t} else if ( this.options.icon ) {\n\t\t\t\tthis.options.icons.primary = this.options.icon;\n\t\t\t}\n\t\t\tthis._super();\n\t\t},\n\n\t\t_setOption: function( key, value ) {\n\t\t\tif ( key === \"text\" ) {\n\t\t\t\tthis._super( \"showLabel\", value );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( key === \"showLabel\" ) {\n\t\t\t\tthis.options.text = value;\n\t\t\t}\n\t\t\tif ( key === \"icon\" ) {\n\t\t\t\tthis.options.icons.primary = value;\n\t\t\t}\n\t\t\tif ( key === \"icons\" ) {\n\t\t\t\tif ( value.primary ) {\n\t\t\t\t\tthis._super( \"icon\", value.primary );\n\t\t\t\t\tthis._super( \"iconPosition\", \"beginning\" );\n\t\t\t\t} else if ( value.secondary ) {\n\t\t\t\t\tthis._super( \"icon\", value.secondary );\n\t\t\t\t\tthis._super( \"iconPosition\", \"end\" );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._superApply( arguments );\n\t\t}\n\t} );\n\n\t$.fn.button = ( function( orig ) {\n\t\treturn function() {\n\t\t\tif ( !this.length || ( this.length && this[ 0 ].tagName !== \"INPUT\" ) ||\n\t\t\t\t\t( this.length && this[ 0 ].tagName === \"INPUT\" && (\n\t\t\t\t\t\tthis.attr( \"type\" ) !== \"checkbox\" && this.attr( \"type\" ) !== \"radio\"\n\t\t\t\t\t) ) ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t}\n\t\t\tif ( !$.ui.checkboxradio ) {\n\t\t\t\t$.error( \"Checkboxradio widget missing\" );\n\t\t\t}\n\t\t\tif ( arguments.length === 0 ) {\n\t\t\t\treturn this.checkboxradio( {\n\t\t\t\t\t\"icon\": false\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn this.checkboxradio.apply( this, arguments );\n\t\t};\n\t} )( $.fn.button );\n\n\t$.fn.buttonset = function() {\n\t\tif ( !$.ui.controlgroup ) {\n\t\t\t$.error( \"Controlgroup widget missing\" );\n\t\t}\n\t\tif ( arguments[ 0 ] === \"option\" && arguments[ 1 ] === \"items\" && arguments[ 2 ] ) {\n\t\t\treturn this.controlgroup.apply( this,\n\t\t\t\t[ arguments[ 0 ], \"items.button\", arguments[ 2 ] ] );\n\t\t}\n\t\tif ( arguments[ 0 ] === \"option\" && arguments[ 1 ] === \"items\" ) {\n\t\t\treturn this.controlgroup.apply( this, [ arguments[ 0 ], \"items.button\" ] );\n\t\t}\n\t\tif ( typeof arguments[ 0 ] === \"object\" && arguments[ 0 ].items ) {\n\t\t\targuments[ 0 ].items = {\n\t\t\t\tbutton: arguments[ 0 ].items\n\t\t\t};\n\t\t}\n\t\treturn this.controlgroup.apply( this, arguments );\n\t};\n}\n\nvar widgetsButton = $.ui.button;\n\n\n// jscs:disable maximumLineLength\n/* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */\n/*!\n * jQuery UI Datepicker 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Datepicker\n//>>group: Widgets\n//>>description: Displays a calendar from an input or inline for selecting dates.\n//>>docs: http://api.jqueryui.com/datepicker/\n//>>demos: http://jqueryui.com/datepicker/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/datepicker.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.extend( $.ui, { datepicker: { version: \"1.12.1\" } } );\n\nvar datepicker_instActive;\n\nfunction datepicker_getZindex( elem ) {\n\tvar position, value;\n\twhile ( elem.length && elem[ 0 ] !== document ) {\n\n\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t// This makes behavior of this function consistent across browsers\n\t\t// WebKit always returns auto if the element is positioned\n\t\tposition = elem.css( \"position\" );\n\t\tif ( position === \"absolute\" || position === \"relative\" || position === \"fixed\" ) {\n\n\t\t\t// IE returns 0 when zIndex is not specified\n\t\t\t// other browsers return a string\n\t\t\t// we ignore the case of nested elements with an explicit value of 0\n\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\n\t\t\tvalue = parseInt( elem.css( \"zIndex\" ), 10 );\n\t\t\tif ( !isNaN( value ) && value !== 0 ) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t\telem = elem.parent();\n\t}\n\n\treturn 0;\n}\n/* Date picker manager.\n   Use the singleton instance of this class, $.datepicker, to interact with the date picker.\n   Settings for (groups of) date pickers are maintained in an instance object,\n   allowing multiple different settings on the same page. */\n\nfunction Datepicker() {\n\tthis._curInst = null; // The current instance in use\n\tthis._keyEvent = false; // If the last event was a key event\n\tthis._disabledInputs = []; // List of date picker inputs that have been disabled\n\tthis._datepickerShowing = false; // True if the popup picker is showing , false if not\n\tthis._inDialog = false; // True if showing within a \"dialog\", false if not\n\tthis._mainDivId = \"ui-datepicker-div\"; // The ID of the main datepicker division\n\tthis._inlineClass = \"ui-datepicker-inline\"; // The name of the inline marker class\n\tthis._appendClass = \"ui-datepicker-append\"; // The name of the append marker class\n\tthis._triggerClass = \"ui-datepicker-trigger\"; // The name of the trigger marker class\n\tthis._dialogClass = \"ui-datepicker-dialog\"; // The name of the dialog marker class\n\tthis._disableClass = \"ui-datepicker-disabled\"; // The name of the disabled covering marker class\n\tthis._unselectableClass = \"ui-datepicker-unselectable\"; // The name of the unselectable cell marker class\n\tthis._currentClass = \"ui-datepicker-current-day\"; // The name of the current day marker class\n\tthis._dayOverClass = \"ui-datepicker-days-cell-over\"; // The name of the day hover marker class\n\tthis.regional = []; // Available regional settings, indexed by language code\n\tthis.regional[ \"\" ] = { // Default regional settings\n\t\tcloseText: \"Done\", // Display text for close link\n\t\tprevText: \"Prev\", // Display text for previous month link\n\t\tnextText: \"Next\", // Display text for next month link\n\t\tcurrentText: \"Today\", // Display text for current month link\n\t\tmonthNames: [ \"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\n\t\t\t\"July\",\"August\",\"September\",\"October\",\"November\",\"December\" ], // Names of months for drop-down and formatting\n\t\tmonthNamesShort: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ], // For formatting\n\t\tdayNames: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ], // For formatting\n\t\tdayNamesShort: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ], // For formatting\n\t\tdayNamesMin: [ \"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\" ], // Column headings for days starting at Sunday\n\t\tweekHeader: \"Wk\", // Column header for week of the year\n\t\tdateFormat: \"mm/dd/yy\", // See format options on parseDate\n\t\tfirstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...\n\t\tisRTL: false, // True if right-to-left language, false if left-to-right\n\t\tshowMonthAfterYear: false, // True if the year select precedes month, false for month then year\n\t\tyearSuffix: \"\" // Additional text to append to the year in the month headers\n\t};\n\tthis._defaults = { // Global defaults for all the date picker instances\n\t\tshowOn: \"focus\", // \"focus\" for popup on focus,\n\t\t\t// \"button\" for trigger button, or \"both\" for either\n\t\tshowAnim: \"fadeIn\", // Name of jQuery animation for popup\n\t\tshowOptions: {}, // Options for enhanced animations\n\t\tdefaultDate: null, // Used when field is blank: actual date,\n\t\t\t// +/-number for offset from today, null for today\n\t\tappendText: \"\", // Display text following the input box, e.g. showing the format\n\t\tbuttonText: \"...\", // Text for trigger button\n\t\tbuttonImage: \"\", // URL for trigger button image\n\t\tbuttonImageOnly: false, // True if the image appears alone, false if it appears on a button\n\t\thideIfNoPrevNext: false, // True to hide next/previous month links\n\t\t\t// if not applicable, false to just disable them\n\t\tnavigationAsDateFormat: false, // True if date formatting applied to prev/today/next links\n\t\tgotoCurrent: false, // True if today link goes back to current selection instead\n\t\tchangeMonth: false, // True if month can be selected directly, false if only prev/next\n\t\tchangeYear: false, // True if year can be selected directly, false if only prev/next\n\t\tyearRange: \"c-10:c+10\", // Range of years to display in drop-down,\n\t\t\t// either relative to today's year (-nn:+nn), relative to currently displayed year\n\t\t\t// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)\n\t\tshowOtherMonths: false, // True to show dates in other months, false to leave blank\n\t\tselectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable\n\t\tshowWeek: false, // True to show week of the year, false to not show it\n\t\tcalculateWeek: this.iso8601Week, // How to calculate the week of the year,\n\t\t\t// takes a Date and returns the number of the week for it\n\t\tshortYearCutoff: \"+10\", // Short year values < this are in the current century,\n\t\t\t// > this are in the previous century,\n\t\t\t// string value starting with \"+\" for current year + value\n\t\tminDate: null, // The earliest selectable date, or null for no limit\n\t\tmaxDate: null, // The latest selectable date, or null for no limit\n\t\tduration: \"fast\", // Duration of display/closure\n\t\tbeforeShowDay: null, // Function that takes a date and returns an array with\n\t\t\t// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or \"\",\n\t\t\t// [2] = cell title (optional), e.g. $.datepicker.noWeekends\n\t\tbeforeShow: null, // Function that takes an input field and\n\t\t\t// returns a set of custom settings for the date picker\n\t\tonSelect: null, // Define a callback function when a date is selected\n\t\tonChangeMonthYear: null, // Define a callback function when the month or year is changed\n\t\tonClose: null, // Define a callback function when the datepicker is closed\n\t\tnumberOfMonths: 1, // Number of months to show at a time\n\t\tshowCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)\n\t\tstepMonths: 1, // Number of months to step back/forward\n\t\tstepBigMonths: 12, // Number of months to step back/forward for the big links\n\t\taltField: \"\", // Selector for an alternate field to store selected dates into\n\t\taltFormat: \"\", // The date format to use for the alternate field\n\t\tconstrainInput: true, // The input is constrained by the current date format\n\t\tshowButtonPanel: false, // True to show button panel, false to not show it\n\t\tautoSize: false, // True to size the input for the date format, false to leave as is\n\t\tdisabled: false // The initial disabled state\n\t};\n\t$.extend( this._defaults, this.regional[ \"\" ] );\n\tthis.regional.en = $.extend( true, {}, this.regional[ \"\" ] );\n\tthis.regional[ \"en-US\" ] = $.extend( true, {}, this.regional.en );\n\tthis.dpDiv = datepicker_bindHover( $( \"<div id='\" + this._mainDivId + \"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\" ) );\n}\n\n$.extend( Datepicker.prototype, {\n\t/* Class name added to elements to indicate already configured with a date picker. */\n\tmarkerClassName: \"hasDatepicker\",\n\n\t//Keep track of the maximum number of rows displayed (see #7043)\n\tmaxRows: 4,\n\n\t// TODO rename to \"widget\" when switching to widget factory\n\t_widgetDatepicker: function() {\n\t\treturn this.dpDiv;\n\t},\n\n\t/* Override the default settings for all instances of the date picker.\n\t * @param  settings  object - the new settings to use as defaults (anonymous object)\n\t * @return the manager object\n\t */\n\tsetDefaults: function( settings ) {\n\t\tdatepicker_extendRemove( this._defaults, settings || {} );\n\t\treturn this;\n\t},\n\n\t/* Attach the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t * @param  settings  object - the new settings to use for this date picker instance (anonymous)\n\t */\n\t_attachDatepicker: function( target, settings ) {\n\t\tvar nodeName, inline, inst;\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tinline = ( nodeName === \"div\" || nodeName === \"span\" );\n\t\tif ( !target.id ) {\n\t\t\tthis.uuid += 1;\n\t\t\ttarget.id = \"dp\" + this.uuid;\n\t\t}\n\t\tinst = this._newInst( $( target ), inline );\n\t\tinst.settings = $.extend( {}, settings || {} );\n\t\tif ( nodeName === \"input\" ) {\n\t\t\tthis._connectDatepicker( target, inst );\n\t\t} else if ( inline ) {\n\t\t\tthis._inlineDatepicker( target, inst );\n\t\t}\n\t},\n\n\t/* Create a new instance object. */\n\t_newInst: function( target, inline ) {\n\t\tvar id = target[ 0 ].id.replace( /([^A-Za-z0-9_\\-])/g, \"\\\\\\\\$1\" ); // escape jQuery meta chars\n\t\treturn { id: id, input: target, // associated target\n\t\t\tselectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection\n\t\t\tdrawMonth: 0, drawYear: 0, // month being drawn\n\t\t\tinline: inline, // is datepicker inline or not\n\t\t\tdpDiv: ( !inline ? this.dpDiv : // presentation div\n\t\t\tdatepicker_bindHover( $( \"<div class='\" + this._inlineClass + \" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\" ) ) ) };\n\t},\n\n\t/* Attach the date picker to an input field. */\n\t_connectDatepicker: function( target, inst ) {\n\t\tvar input = $( target );\n\t\tinst.append = $( [] );\n\t\tinst.trigger = $( [] );\n\t\tif ( input.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\t\tthis._attachments( input, inst );\n\t\tinput.addClass( this.markerClassName ).on( \"keydown\", this._doKeyDown ).\n\t\t\ton( \"keypress\", this._doKeyPress ).on( \"keyup\", this._doKeyUp );\n\t\tthis._autoSize( inst );\n\t\t$.data( target, \"datepicker\", inst );\n\n\t\t//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)\n\t\tif ( inst.settings.disabled ) {\n\t\t\tthis._disableDatepicker( target );\n\t\t}\n\t},\n\n\t/* Make attachments based on settings. */\n\t_attachments: function( input, inst ) {\n\t\tvar showOn, buttonText, buttonImage,\n\t\t\tappendText = this._get( inst, \"appendText\" ),\n\t\t\tisRTL = this._get( inst, \"isRTL\" );\n\n\t\tif ( inst.append ) {\n\t\t\tinst.append.remove();\n\t\t}\n\t\tif ( appendText ) {\n\t\t\tinst.append = $( \"<span class='\" + this._appendClass + \"'>\" + appendText + \"</span>\" );\n\t\t\tinput[ isRTL ? \"before\" : \"after\" ]( inst.append );\n\t\t}\n\n\t\tinput.off( \"focus\", this._showDatepicker );\n\n\t\tif ( inst.trigger ) {\n\t\t\tinst.trigger.remove();\n\t\t}\n\n\t\tshowOn = this._get( inst, \"showOn\" );\n\t\tif ( showOn === \"focus\" || showOn === \"both\" ) { // pop-up date picker when in the marked field\n\t\t\tinput.on( \"focus\", this._showDatepicker );\n\t\t}\n\t\tif ( showOn === \"button\" || showOn === \"both\" ) { // pop-up date picker when button clicked\n\t\t\tbuttonText = this._get( inst, \"buttonText\" );\n\t\t\tbuttonImage = this._get( inst, \"buttonImage\" );\n\t\t\tinst.trigger = $( this._get( inst, \"buttonImageOnly\" ) ?\n\t\t\t\t$( \"<img/>\" ).addClass( this._triggerClass ).\n\t\t\t\t\tattr( { src: buttonImage, alt: buttonText, title: buttonText } ) :\n\t\t\t\t$( \"<button type='button'></button>\" ).addClass( this._triggerClass ).\n\t\t\t\t\thtml( !buttonImage ? buttonText : $( \"<img/>\" ).attr(\n\t\t\t\t\t{ src:buttonImage, alt:buttonText, title:buttonText } ) ) );\n\t\t\tinput[ isRTL ? \"before\" : \"after\" ]( inst.trigger );\n\t\t\tinst.trigger.on( \"click\", function() {\n\t\t\t\tif ( $.datepicker._datepickerShowing && $.datepicker._lastInput === input[ 0 ] ) {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t} else if ( $.datepicker._datepickerShowing && $.datepicker._lastInput !== input[ 0 ] ) {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t$.datepicker._showDatepicker( input[ 0 ] );\n\t\t\t\t} else {\n\t\t\t\t\t$.datepicker._showDatepicker( input[ 0 ] );\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t} );\n\t\t}\n\t},\n\n\t/* Apply the maximum length for the date format. */\n\t_autoSize: function( inst ) {\n\t\tif ( this._get( inst, \"autoSize\" ) && !inst.inline ) {\n\t\t\tvar findMax, max, maxI, i,\n\t\t\t\tdate = new Date( 2009, 12 - 1, 20 ), // Ensure double digits\n\t\t\t\tdateFormat = this._get( inst, \"dateFormat\" );\n\n\t\t\tif ( dateFormat.match( /[DM]/ ) ) {\n\t\t\t\tfindMax = function( names ) {\n\t\t\t\t\tmax = 0;\n\t\t\t\t\tmaxI = 0;\n\t\t\t\t\tfor ( i = 0; i < names.length; i++ ) {\n\t\t\t\t\t\tif ( names[ i ].length > max ) {\n\t\t\t\t\t\t\tmax = names[ i ].length;\n\t\t\t\t\t\t\tmaxI = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn maxI;\n\t\t\t\t};\n\t\t\t\tdate.setMonth( findMax( this._get( inst, ( dateFormat.match( /MM/ ) ?\n\t\t\t\t\t\"monthNames\" : \"monthNamesShort\" ) ) ) );\n\t\t\t\tdate.setDate( findMax( this._get( inst, ( dateFormat.match( /DD/ ) ?\n\t\t\t\t\t\"dayNames\" : \"dayNamesShort\" ) ) ) + 20 - date.getDay() );\n\t\t\t}\n\t\t\tinst.input.attr( \"size\", this._formatDate( inst, date ).length );\n\t\t}\n\t},\n\n\t/* Attach an inline date picker to a div. */\n\t_inlineDatepicker: function( target, inst ) {\n\t\tvar divSpan = $( target );\n\t\tif ( divSpan.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\t\tdivSpan.addClass( this.markerClassName ).append( inst.dpDiv );\n\t\t$.data( target, \"datepicker\", inst );\n\t\tthis._setDate( inst, this._getDefaultDate( inst ), true );\n\t\tthis._updateDatepicker( inst );\n\t\tthis._updateAlternate( inst );\n\n\t\t//If disabled option is true, disable the datepicker before showing it (see ticket #5665)\n\t\tif ( inst.settings.disabled ) {\n\t\t\tthis._disableDatepicker( target );\n\t\t}\n\n\t\t// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements\n\t\t// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height\n\t\tinst.dpDiv.css( \"display\", \"block\" );\n\t},\n\n\t/* Pop-up the date picker in a \"dialog\" box.\n\t * @param  input element - ignored\n\t * @param  date\tstring or Date - the initial date to display\n\t * @param  onSelect  function - the function to call when a date is selected\n\t * @param  settings  object - update the dialog date picker instance's settings (anonymous object)\n\t * @param  pos int[2] - coordinates for the dialog's position within the screen or\n\t *\t\t\t\t\tevent - with x/y coordinates or\n\t *\t\t\t\t\tleave empty for default (screen centre)\n\t * @return the manager object\n\t */\n\t_dialogDatepicker: function( input, date, onSelect, settings, pos ) {\n\t\tvar id, browserWidth, browserHeight, scrollX, scrollY,\n\t\t\tinst = this._dialogInst; // internal instance\n\n\t\tif ( !inst ) {\n\t\t\tthis.uuid += 1;\n\t\t\tid = \"dp\" + this.uuid;\n\t\t\tthis._dialogInput = $( \"<input type='text' id='\" + id +\n\t\t\t\t\"' style='position: absolute; top: -100px; width: 0px;'/>\" );\n\t\t\tthis._dialogInput.on( \"keydown\", this._doKeyDown );\n\t\t\t$( \"body\" ).append( this._dialogInput );\n\t\t\tinst = this._dialogInst = this._newInst( this._dialogInput, false );\n\t\t\tinst.settings = {};\n\t\t\t$.data( this._dialogInput[ 0 ], \"datepicker\", inst );\n\t\t}\n\t\tdatepicker_extendRemove( inst.settings, settings || {} );\n\t\tdate = ( date && date.constructor === Date ? this._formatDate( inst, date ) : date );\n\t\tthis._dialogInput.val( date );\n\n\t\tthis._pos = ( pos ? ( pos.length ? pos : [ pos.pageX, pos.pageY ] ) : null );\n\t\tif ( !this._pos ) {\n\t\t\tbrowserWidth = document.documentElement.clientWidth;\n\t\t\tbrowserHeight = document.documentElement.clientHeight;\n\t\t\tscrollX = document.documentElement.scrollLeft || document.body.scrollLeft;\n\t\t\tscrollY = document.documentElement.scrollTop || document.body.scrollTop;\n\t\t\tthis._pos = // should use actual width/height below\n\t\t\t\t[ ( browserWidth / 2 ) - 100 + scrollX, ( browserHeight / 2 ) - 150 + scrollY ];\n\t\t}\n\n\t\t// Move input on screen for focus, but hidden behind dialog\n\t\tthis._dialogInput.css( \"left\", ( this._pos[ 0 ] + 20 ) + \"px\" ).css( \"top\", this._pos[ 1 ] + \"px\" );\n\t\tinst.settings.onSelect = onSelect;\n\t\tthis._inDialog = true;\n\t\tthis.dpDiv.addClass( this._dialogClass );\n\t\tthis._showDatepicker( this._dialogInput[ 0 ] );\n\t\tif ( $.blockUI ) {\n\t\t\t$.blockUI( this.dpDiv );\n\t\t}\n\t\t$.data( this._dialogInput[ 0 ], \"datepicker\", inst );\n\t\treturn this;\n\t},\n\n\t/* Detach a datepicker from its control.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_destroyDatepicker: function( target ) {\n\t\tvar nodeName,\n\t\t\t$target = $( target ),\n\t\t\tinst = $.data( target, \"datepicker\" );\n\n\t\tif ( !$target.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\t$.removeData( target, \"datepicker\" );\n\t\tif ( nodeName === \"input\" ) {\n\t\t\tinst.append.remove();\n\t\t\tinst.trigger.remove();\n\t\t\t$target.removeClass( this.markerClassName ).\n\t\t\t\toff( \"focus\", this._showDatepicker ).\n\t\t\t\toff( \"keydown\", this._doKeyDown ).\n\t\t\t\toff( \"keypress\", this._doKeyPress ).\n\t\t\t\toff( \"keyup\", this._doKeyUp );\n\t\t} else if ( nodeName === \"div\" || nodeName === \"span\" ) {\n\t\t\t$target.removeClass( this.markerClassName ).empty();\n\t\t}\n\n\t\tif ( datepicker_instActive === inst ) {\n\t\t\tdatepicker_instActive = null;\n\t\t}\n\t},\n\n\t/* Enable the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_enableDatepicker: function( target ) {\n\t\tvar nodeName, inline,\n\t\t\t$target = $( target ),\n\t\t\tinst = $.data( target, \"datepicker\" );\n\n\t\tif ( !$target.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tif ( nodeName === \"input\" ) {\n\t\t\ttarget.disabled = false;\n\t\t\tinst.trigger.filter( \"button\" ).\n\t\t\t\teach( function() { this.disabled = false; } ).end().\n\t\t\t\tfilter( \"img\" ).css( { opacity: \"1.0\", cursor: \"\" } );\n\t\t} else if ( nodeName === \"div\" || nodeName === \"span\" ) {\n\t\t\tinline = $target.children( \".\" + this._inlineClass );\n\t\t\tinline.children().removeClass( \"ui-state-disabled\" );\n\t\t\tinline.find( \"select.ui-datepicker-month, select.ui-datepicker-year\" ).\n\t\t\t\tprop( \"disabled\", false );\n\t\t}\n\t\tthis._disabledInputs = $.map( this._disabledInputs,\n\t\t\tfunction( value ) { return ( value === target ? null : value ); } ); // delete entry\n\t},\n\n\t/* Disable the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_disableDatepicker: function( target ) {\n\t\tvar nodeName, inline,\n\t\t\t$target = $( target ),\n\t\t\tinst = $.data( target, \"datepicker\" );\n\n\t\tif ( !$target.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tif ( nodeName === \"input\" ) {\n\t\t\ttarget.disabled = true;\n\t\t\tinst.trigger.filter( \"button\" ).\n\t\t\t\teach( function() { this.disabled = true; } ).end().\n\t\t\t\tfilter( \"img\" ).css( { opacity: \"0.5\", cursor: \"default\" } );\n\t\t} else if ( nodeName === \"div\" || nodeName === \"span\" ) {\n\t\t\tinline = $target.children( \".\" + this._inlineClass );\n\t\t\tinline.children().addClass( \"ui-state-disabled\" );\n\t\t\tinline.find( \"select.ui-datepicker-month, select.ui-datepicker-year\" ).\n\t\t\t\tprop( \"disabled\", true );\n\t\t}\n\t\tthis._disabledInputs = $.map( this._disabledInputs,\n\t\t\tfunction( value ) { return ( value === target ? null : value ); } ); // delete entry\n\t\tthis._disabledInputs[ this._disabledInputs.length ] = target;\n\t},\n\n\t/* Is the first field in a jQuery collection disabled as a datepicker?\n\t * @param  target\telement - the target input field or division or span\n\t * @return boolean - true if disabled, false if enabled\n\t */\n\t_isDisabledDatepicker: function( target ) {\n\t\tif ( !target ) {\n\t\t\treturn false;\n\t\t}\n\t\tfor ( var i = 0; i < this._disabledInputs.length; i++ ) {\n\t\t\tif ( this._disabledInputs[ i ] === target ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\t/* Retrieve the instance data for the target control.\n\t * @param  target  element - the target input field or division or span\n\t * @return  object - the associated instance data\n\t * @throws  error if a jQuery problem getting data\n\t */\n\t_getInst: function( target ) {\n\t\ttry {\n\t\t\treturn $.data( target, \"datepicker\" );\n\t\t}\n\t\tcatch ( err ) {\n\t\t\tthrow \"Missing instance data for this datepicker\";\n\t\t}\n\t},\n\n\t/* Update or retrieve the settings for a date picker attached to an input field or division.\n\t * @param  target  element - the target input field or division or span\n\t * @param  name\tobject - the new settings to update or\n\t *\t\t\t\tstring - the name of the setting to change or retrieve,\n\t *\t\t\t\twhen retrieving also \"all\" for all instance settings or\n\t *\t\t\t\t\"defaults\" for all global defaults\n\t * @param  value   any - the new value for the setting\n\t *\t\t\t\t(omit if above is an object or to retrieve a value)\n\t */\n\t_optionDatepicker: function( target, name, value ) {\n\t\tvar settings, date, minDate, maxDate,\n\t\t\tinst = this._getInst( target );\n\n\t\tif ( arguments.length === 2 && typeof name === \"string\" ) {\n\t\t\treturn ( name === \"defaults\" ? $.extend( {}, $.datepicker._defaults ) :\n\t\t\t\t( inst ? ( name === \"all\" ? $.extend( {}, inst.settings ) :\n\t\t\t\tthis._get( inst, name ) ) : null ) );\n\t\t}\n\n\t\tsettings = name || {};\n\t\tif ( typeof name === \"string\" ) {\n\t\t\tsettings = {};\n\t\t\tsettings[ name ] = value;\n\t\t}\n\n\t\tif ( inst ) {\n\t\t\tif ( this._curInst === inst ) {\n\t\t\t\tthis._hideDatepicker();\n\t\t\t}\n\n\t\t\tdate = this._getDateDatepicker( target, true );\n\t\t\tminDate = this._getMinMaxDate( inst, \"min\" );\n\t\t\tmaxDate = this._getMinMaxDate( inst, \"max\" );\n\t\t\tdatepicker_extendRemove( inst.settings, settings );\n\n\t\t\t// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided\n\t\t\tif ( minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined ) {\n\t\t\t\tinst.settings.minDate = this._formatDate( inst, minDate );\n\t\t\t}\n\t\t\tif ( maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined ) {\n\t\t\t\tinst.settings.maxDate = this._formatDate( inst, maxDate );\n\t\t\t}\n\t\t\tif ( \"disabled\" in settings ) {\n\t\t\t\tif ( settings.disabled ) {\n\t\t\t\t\tthis._disableDatepicker( target );\n\t\t\t\t} else {\n\t\t\t\t\tthis._enableDatepicker( target );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._attachments( $( target ), inst );\n\t\t\tthis._autoSize( inst );\n\t\t\tthis._setDate( inst, date );\n\t\t\tthis._updateAlternate( inst );\n\t\t\tthis._updateDatepicker( inst );\n\t\t}\n\t},\n\n\t// Change method deprecated\n\t_changeDatepicker: function( target, name, value ) {\n\t\tthis._optionDatepicker( target, name, value );\n\t},\n\n\t/* Redraw the date picker attached to an input field or division.\n\t * @param  target  element - the target input field or division or span\n\t */\n\t_refreshDatepicker: function( target ) {\n\t\tvar inst = this._getInst( target );\n\t\tif ( inst ) {\n\t\t\tthis._updateDatepicker( inst );\n\t\t}\n\t},\n\n\t/* Set the dates for a jQuery selection.\n\t * @param  target element - the target input field or division or span\n\t * @param  date\tDate - the new date\n\t */\n\t_setDateDatepicker: function( target, date ) {\n\t\tvar inst = this._getInst( target );\n\t\tif ( inst ) {\n\t\t\tthis._setDate( inst, date );\n\t\t\tthis._updateDatepicker( inst );\n\t\t\tthis._updateAlternate( inst );\n\t\t}\n\t},\n\n\t/* Get the date(s) for the first entry in a jQuery selection.\n\t * @param  target element - the target input field or division or span\n\t * @param  noDefault boolean - true if no default date is to be used\n\t * @return Date - the current date\n\t */\n\t_getDateDatepicker: function( target, noDefault ) {\n\t\tvar inst = this._getInst( target );\n\t\tif ( inst && !inst.inline ) {\n\t\t\tthis._setDateFromField( inst, noDefault );\n\t\t}\n\t\treturn ( inst ? this._getDate( inst ) : null );\n\t},\n\n\t/* Handle keystrokes. */\n\t_doKeyDown: function( event ) {\n\t\tvar onSelect, dateStr, sel,\n\t\t\tinst = $.datepicker._getInst( event.target ),\n\t\t\thandled = true,\n\t\t\tisRTL = inst.dpDiv.is( \".ui-datepicker-rtl\" );\n\n\t\tinst._keyEvent = true;\n\t\tif ( $.datepicker._datepickerShowing ) {\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase 9: $.datepicker._hideDatepicker();\n\t\t\t\t\t\thandled = false;\n\t\t\t\t\t\tbreak; // hide on tab out\n\t\t\t\tcase 13: sel = $( \"td.\" + $.datepicker._dayOverClass + \":not(.\" +\n\t\t\t\t\t\t\t\t\t$.datepicker._currentClass + \")\", inst.dpDiv );\n\t\t\t\t\t\tif ( sel[ 0 ] ) {\n\t\t\t\t\t\t\t$.datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonSelect = $.datepicker._get( inst, \"onSelect\" );\n\t\t\t\t\t\tif ( onSelect ) {\n\t\t\t\t\t\t\tdateStr = $.datepicker._formatDate( inst );\n\n\t\t\t\t\t\t\t// Trigger custom callback\n\t\t\t\t\t\t\tonSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn false; // don't submit the form\n\t\t\t\tcase 27: $.datepicker._hideDatepicker();\n\t\t\t\t\t\tbreak; // hide on escape\n\t\t\t\tcase 33: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?\n\t\t\t\t\t\t\t-$.datepicker._get( inst, \"stepBigMonths\" ) :\n\t\t\t\t\t\t\t-$.datepicker._get( inst, \"stepMonths\" ) ), \"M\" );\n\t\t\t\t\t\tbreak; // previous month/year on page up/+ ctrl\n\t\t\t\tcase 34: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?\n\t\t\t\t\t\t\t+$.datepicker._get( inst, \"stepBigMonths\" ) :\n\t\t\t\t\t\t\t+$.datepicker._get( inst, \"stepMonths\" ) ), \"M\" );\n\t\t\t\t\t\tbreak; // next month/year on page down/+ ctrl\n\t\t\t\tcase 35: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._clearDate( event.target );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // clear on ctrl or command +end\n\t\t\t\tcase 36: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._gotoToday( event.target );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // current on ctrl or command +home\n\t\t\t\tcase 37: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, ( isRTL ? +1 : -1 ), \"D\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\n\t\t\t\t\t\t// -1 day on ctrl or command +left\n\t\t\t\t\t\tif ( event.originalEvent.altKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, ( event.ctrlKey ?\n\t\t\t\t\t\t\t\t-$.datepicker._get( inst, \"stepBigMonths\" ) :\n\t\t\t\t\t\t\t\t-$.datepicker._get( inst, \"stepMonths\" ) ), \"M\" );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// next month/year on alt +left on Mac\n\t\t\t\t\t\tbreak;\n\t\t\t\tcase 38: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, -7, \"D\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // -1 week on ctrl or command +up\n\t\t\t\tcase 39: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, ( isRTL ? -1 : +1 ), \"D\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\n\t\t\t\t\t\t// +1 day on ctrl or command +right\n\t\t\t\t\t\tif ( event.originalEvent.altKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, ( event.ctrlKey ?\n\t\t\t\t\t\t\t\t+$.datepicker._get( inst, \"stepBigMonths\" ) :\n\t\t\t\t\t\t\t\t+$.datepicker._get( inst, \"stepMonths\" ) ), \"M\" );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// next month/year on alt +right\n\t\t\t\t\t\tbreak;\n\t\t\t\tcase 40: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, +7, \"D\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // +1 week on ctrl or command +down\n\t\t\t\tdefault: handled = false;\n\t\t\t}\n\t\t} else if ( event.keyCode === 36 && event.ctrlKey ) { // display the date picker on ctrl+home\n\t\t\t$.datepicker._showDatepicker( this );\n\t\t} else {\n\t\t\thandled = false;\n\t\t}\n\n\t\tif ( handled ) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t},\n\n\t/* Filter entered characters - based on date format. */\n\t_doKeyPress: function( event ) {\n\t\tvar chars, chr,\n\t\t\tinst = $.datepicker._getInst( event.target );\n\n\t\tif ( $.datepicker._get( inst, \"constrainInput\" ) ) {\n\t\t\tchars = $.datepicker._possibleChars( $.datepicker._get( inst, \"dateFormat\" ) );\n\t\t\tchr = String.fromCharCode( event.charCode == null ? event.keyCode : event.charCode );\n\t\t\treturn event.ctrlKey || event.metaKey || ( chr < \" \" || !chars || chars.indexOf( chr ) > -1 );\n\t\t}\n\t},\n\n\t/* Synchronise manual entry and field/alternate field. */\n\t_doKeyUp: function( event ) {\n\t\tvar date,\n\t\t\tinst = $.datepicker._getInst( event.target );\n\n\t\tif ( inst.input.val() !== inst.lastVal ) {\n\t\t\ttry {\n\t\t\t\tdate = $.datepicker.parseDate( $.datepicker._get( inst, \"dateFormat\" ),\n\t\t\t\t\t( inst.input ? inst.input.val() : null ),\n\t\t\t\t\t$.datepicker._getFormatConfig( inst ) );\n\n\t\t\t\tif ( date ) { // only if valid\n\t\t\t\t\t$.datepicker._setDateFromField( inst );\n\t\t\t\t\t$.datepicker._updateAlternate( inst );\n\t\t\t\t\t$.datepicker._updateDatepicker( inst );\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch ( err ) {\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t},\n\n\t/* Pop-up the date picker for a given input field.\n\t * If false returned from beforeShow event handler do not show.\n\t * @param  input  element - the input field attached to the date picker or\n\t *\t\t\t\t\tevent - if triggered by focus\n\t */\n\t_showDatepicker: function( input ) {\n\t\tinput = input.target || input;\n\t\tif ( input.nodeName.toLowerCase() !== \"input\" ) { // find from button/image trigger\n\t\t\tinput = $( \"input\", input.parentNode )[ 0 ];\n\t\t}\n\n\t\tif ( $.datepicker._isDisabledDatepicker( input ) || $.datepicker._lastInput === input ) { // already here\n\t\t\treturn;\n\t\t}\n\n\t\tvar inst, beforeShow, beforeShowSettings, isFixed,\n\t\t\toffset, showAnim, duration;\n\n\t\tinst = $.datepicker._getInst( input );\n\t\tif ( $.datepicker._curInst && $.datepicker._curInst !== inst ) {\n\t\t\t$.datepicker._curInst.dpDiv.stop( true, true );\n\t\t\tif ( inst && $.datepicker._datepickerShowing ) {\n\t\t\t\t$.datepicker._hideDatepicker( $.datepicker._curInst.input[ 0 ] );\n\t\t\t}\n\t\t}\n\n\t\tbeforeShow = $.datepicker._get( inst, \"beforeShow\" );\n\t\tbeforeShowSettings = beforeShow ? beforeShow.apply( input, [ input, inst ] ) : {};\n\t\tif ( beforeShowSettings === false ) {\n\t\t\treturn;\n\t\t}\n\t\tdatepicker_extendRemove( inst.settings, beforeShowSettings );\n\n\t\tinst.lastVal = null;\n\t\t$.datepicker._lastInput = input;\n\t\t$.datepicker._setDateFromField( inst );\n\n\t\tif ( $.datepicker._inDialog ) { // hide cursor\n\t\t\tinput.value = \"\";\n\t\t}\n\t\tif ( !$.datepicker._pos ) { // position below input\n\t\t\t$.datepicker._pos = $.datepicker._findPos( input );\n\t\t\t$.datepicker._pos[ 1 ] += input.offsetHeight; // add the height\n\t\t}\n\n\t\tisFixed = false;\n\t\t$( input ).parents().each( function() {\n\t\t\tisFixed |= $( this ).css( \"position\" ) === \"fixed\";\n\t\t\treturn !isFixed;\n\t\t} );\n\n\t\toffset = { left: $.datepicker._pos[ 0 ], top: $.datepicker._pos[ 1 ] };\n\t\t$.datepicker._pos = null;\n\n\t\t//to avoid flashes on Firefox\n\t\tinst.dpDiv.empty();\n\n\t\t// determine sizing offscreen\n\t\tinst.dpDiv.css( { position: \"absolute\", display: \"block\", top: \"-1000px\" } );\n\t\t$.datepicker._updateDatepicker( inst );\n\n\t\t// fix width for dynamic number of date pickers\n\t\t// and adjust position before showing\n\t\toffset = $.datepicker._checkOffset( inst, offset, isFixed );\n\t\tinst.dpDiv.css( { position: ( $.datepicker._inDialog && $.blockUI ?\n\t\t\t\"static\" : ( isFixed ? \"fixed\" : \"absolute\" ) ), display: \"none\",\n\t\t\tleft: offset.left + \"px\", top: offset.top + \"px\" } );\n\n\t\tif ( !inst.inline ) {\n\t\t\tshowAnim = $.datepicker._get( inst, \"showAnim\" );\n\t\t\tduration = $.datepicker._get( inst, \"duration\" );\n\t\t\tinst.dpDiv.css( \"z-index\", datepicker_getZindex( $( input ) ) + 1 );\n\t\t\t$.datepicker._datepickerShowing = true;\n\n\t\t\tif ( $.effects && $.effects.effect[ showAnim ] ) {\n\t\t\t\tinst.dpDiv.show( showAnim, $.datepicker._get( inst, \"showOptions\" ), duration );\n\t\t\t} else {\n\t\t\t\tinst.dpDiv[ showAnim || \"show\" ]( showAnim ? duration : null );\n\t\t\t}\n\n\t\t\tif ( $.datepicker._shouldFocusInput( inst ) ) {\n\t\t\t\tinst.input.trigger( \"focus\" );\n\t\t\t}\n\n\t\t\t$.datepicker._curInst = inst;\n\t\t}\n\t},\n\n\t/* Generate the date picker content. */\n\t_updateDatepicker: function( inst ) {\n\t\tthis.maxRows = 4; //Reset the max number of rows being displayed (see #7043)\n\t\tdatepicker_instActive = inst; // for delegate hover events\n\t\tinst.dpDiv.empty().append( this._generateHTML( inst ) );\n\t\tthis._attachHandlers( inst );\n\n\t\tvar origyearshtml,\n\t\t\tnumMonths = this._getNumberOfMonths( inst ),\n\t\t\tcols = numMonths[ 1 ],\n\t\t\twidth = 17,\n\t\t\tactiveCell = inst.dpDiv.find( \".\" + this._dayOverClass + \" a\" );\n\n\t\tif ( activeCell.length > 0 ) {\n\t\t\tdatepicker_handleMouseover.apply( activeCell.get( 0 ) );\n\t\t}\n\n\t\tinst.dpDiv.removeClass( \"ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4\" ).width( \"\" );\n\t\tif ( cols > 1 ) {\n\t\t\tinst.dpDiv.addClass( \"ui-datepicker-multi-\" + cols ).css( \"width\", ( width * cols ) + \"em\" );\n\t\t}\n\t\tinst.dpDiv[ ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ? \"add\" : \"remove\" ) +\n\t\t\t\"Class\" ]( \"ui-datepicker-multi\" );\n\t\tinst.dpDiv[ ( this._get( inst, \"isRTL\" ) ? \"add\" : \"remove\" ) +\n\t\t\t\"Class\" ]( \"ui-datepicker-rtl\" );\n\n\t\tif ( inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {\n\t\t\tinst.input.trigger( \"focus\" );\n\t\t}\n\n\t\t// Deffered render of the years select (to avoid flashes on Firefox)\n\t\tif ( inst.yearshtml ) {\n\t\t\torigyearshtml = inst.yearshtml;\n\t\t\tsetTimeout( function() {\n\n\t\t\t\t//assure that inst.yearshtml didn't change.\n\t\t\t\tif ( origyearshtml === inst.yearshtml && inst.yearshtml ) {\n\t\t\t\t\tinst.dpDiv.find( \"select.ui-datepicker-year:first\" ).replaceWith( inst.yearshtml );\n\t\t\t\t}\n\t\t\t\torigyearshtml = inst.yearshtml = null;\n\t\t\t}, 0 );\n\t\t}\n\t},\n\n\t// #6694 - don't focus the input if it's already focused\n\t// this breaks the change event in IE\n\t// Support: IE and jQuery <1.9\n\t_shouldFocusInput: function( inst ) {\n\t\treturn inst.input && inst.input.is( \":visible\" ) && !inst.input.is( \":disabled\" ) && !inst.input.is( \":focus\" );\n\t},\n\n\t/* Check positioning to remain on screen. */\n\t_checkOffset: function( inst, offset, isFixed ) {\n\t\tvar dpWidth = inst.dpDiv.outerWidth(),\n\t\t\tdpHeight = inst.dpDiv.outerHeight(),\n\t\t\tinputWidth = inst.input ? inst.input.outerWidth() : 0,\n\t\t\tinputHeight = inst.input ? inst.input.outerHeight() : 0,\n\t\t\tviewWidth = document.documentElement.clientWidth + ( isFixed ? 0 : $( document ).scrollLeft() ),\n\t\t\tviewHeight = document.documentElement.clientHeight + ( isFixed ? 0 : $( document ).scrollTop() );\n\n\t\toffset.left -= ( this._get( inst, \"isRTL\" ) ? ( dpWidth - inputWidth ) : 0 );\n\t\toffset.left -= ( isFixed && offset.left === inst.input.offset().left ) ? $( document ).scrollLeft() : 0;\n\t\toffset.top -= ( isFixed && offset.top === ( inst.input.offset().top + inputHeight ) ) ? $( document ).scrollTop() : 0;\n\n\t\t// Now check if datepicker is showing outside window viewport - move to a better place if so.\n\t\toffset.left -= Math.min( offset.left, ( offset.left + dpWidth > viewWidth && viewWidth > dpWidth ) ?\n\t\t\tMath.abs( offset.left + dpWidth - viewWidth ) : 0 );\n\t\toffset.top -= Math.min( offset.top, ( offset.top + dpHeight > viewHeight && viewHeight > dpHeight ) ?\n\t\t\tMath.abs( dpHeight + inputHeight ) : 0 );\n\n\t\treturn offset;\n\t},\n\n\t/* Find an object's position on the screen. */\n\t_findPos: function( obj ) {\n\t\tvar position,\n\t\t\tinst = this._getInst( obj ),\n\t\t\tisRTL = this._get( inst, \"isRTL\" );\n\n\t\twhile ( obj && ( obj.type === \"hidden\" || obj.nodeType !== 1 || $.expr.filters.hidden( obj ) ) ) {\n\t\t\tobj = obj[ isRTL ? \"previousSibling\" : \"nextSibling\" ];\n\t\t}\n\n\t\tposition = $( obj ).offset();\n\t\treturn [ position.left, position.top ];\n\t},\n\n\t/* Hide the date picker from view.\n\t * @param  input  element - the input field attached to the date picker\n\t */\n\t_hideDatepicker: function( input ) {\n\t\tvar showAnim, duration, postProcess, onClose,\n\t\t\tinst = this._curInst;\n\n\t\tif ( !inst || ( input && inst !== $.data( input, \"datepicker\" ) ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this._datepickerShowing ) {\n\t\t\tshowAnim = this._get( inst, \"showAnim\" );\n\t\t\tduration = this._get( inst, \"duration\" );\n\t\t\tpostProcess = function() {\n\t\t\t\t$.datepicker._tidyDialog( inst );\n\t\t\t};\n\n\t\t\t// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed\n\t\t\tif ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {\n\t\t\t\tinst.dpDiv.hide( showAnim, $.datepicker._get( inst, \"showOptions\" ), duration, postProcess );\n\t\t\t} else {\n\t\t\t\tinst.dpDiv[ ( showAnim === \"slideDown\" ? \"slideUp\" :\n\t\t\t\t\t( showAnim === \"fadeIn\" ? \"fadeOut\" : \"hide\" ) ) ]( ( showAnim ? duration : null ), postProcess );\n\t\t\t}\n\n\t\t\tif ( !showAnim ) {\n\t\t\t\tpostProcess();\n\t\t\t}\n\t\t\tthis._datepickerShowing = false;\n\n\t\t\tonClose = this._get( inst, \"onClose\" );\n\t\t\tif ( onClose ) {\n\t\t\t\tonClose.apply( ( inst.input ? inst.input[ 0 ] : null ), [ ( inst.input ? inst.input.val() : \"\" ), inst ] );\n\t\t\t}\n\n\t\t\tthis._lastInput = null;\n\t\t\tif ( this._inDialog ) {\n\t\t\t\tthis._dialogInput.css( { position: \"absolute\", left: \"0\", top: \"-100px\" } );\n\t\t\t\tif ( $.blockUI ) {\n\t\t\t\t\t$.unblockUI();\n\t\t\t\t\t$( \"body\" ).append( this.dpDiv );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._inDialog = false;\n\t\t}\n\t},\n\n\t/* Tidy up after a dialog display. */\n\t_tidyDialog: function( inst ) {\n\t\tinst.dpDiv.removeClass( this._dialogClass ).off( \".ui-datepicker-calendar\" );\n\t},\n\n\t/* Close date picker if clicked elsewhere. */\n\t_checkExternalClick: function( event ) {\n\t\tif ( !$.datepicker._curInst ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar $target = $( event.target ),\n\t\t\tinst = $.datepicker._getInst( $target[ 0 ] );\n\n\t\tif ( ( ( $target[ 0 ].id !== $.datepicker._mainDivId &&\n\t\t\t\t$target.parents( \"#\" + $.datepicker._mainDivId ).length === 0 &&\n\t\t\t\t!$target.hasClass( $.datepicker.markerClassName ) &&\n\t\t\t\t!$target.closest( \".\" + $.datepicker._triggerClass ).length &&\n\t\t\t\t$.datepicker._datepickerShowing && !( $.datepicker._inDialog && $.blockUI ) ) ) ||\n\t\t\t( $target.hasClass( $.datepicker.markerClassName ) && $.datepicker._curInst !== inst ) ) {\n\t\t\t\t$.datepicker._hideDatepicker();\n\t\t}\n\t},\n\n\t/* Adjust one of the date sub-fields. */\n\t_adjustDate: function( id, offset, period ) {\n\t\tvar target = $( id ),\n\t\t\tinst = this._getInst( target[ 0 ] );\n\n\t\tif ( this._isDisabledDatepicker( target[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\t\tthis._adjustInstDate( inst, offset +\n\t\t\t( period === \"M\" ? this._get( inst, \"showCurrentAtPos\" ) : 0 ), // undo positioning\n\t\t\tperiod );\n\t\tthis._updateDatepicker( inst );\n\t},\n\n\t/* Action for current link. */\n\t_gotoToday: function( id ) {\n\t\tvar date,\n\t\t\ttarget = $( id ),\n\t\t\tinst = this._getInst( target[ 0 ] );\n\n\t\tif ( this._get( inst, \"gotoCurrent\" ) && inst.currentDay ) {\n\t\t\tinst.selectedDay = inst.currentDay;\n\t\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth;\n\t\t\tinst.drawYear = inst.selectedYear = inst.currentYear;\n\t\t} else {\n\t\t\tdate = new Date();\n\t\t\tinst.selectedDay = date.getDate();\n\t\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\t}\n\t\tthis._notifyChange( inst );\n\t\tthis._adjustDate( target );\n\t},\n\n\t/* Action for selecting a new month/year. */\n\t_selectMonthYear: function( id, select, period ) {\n\t\tvar target = $( id ),\n\t\t\tinst = this._getInst( target[ 0 ] );\n\n\t\tinst[ \"selected\" + ( period === \"M\" ? \"Month\" : \"Year\" ) ] =\n\t\tinst[ \"draw\" + ( period === \"M\" ? \"Month\" : \"Year\" ) ] =\n\t\t\tparseInt( select.options[ select.selectedIndex ].value, 10 );\n\n\t\tthis._notifyChange( inst );\n\t\tthis._adjustDate( target );\n\t},\n\n\t/* Action for selecting a day. */\n\t_selectDay: function( id, month, year, td ) {\n\t\tvar inst,\n\t\t\ttarget = $( id );\n\n\t\tif ( $( td ).hasClass( this._unselectableClass ) || this._isDisabledDatepicker( target[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tinst = this._getInst( target[ 0 ] );\n\t\tinst.selectedDay = inst.currentDay = $( \"a\", td ).html();\n\t\tinst.selectedMonth = inst.currentMonth = month;\n\t\tinst.selectedYear = inst.currentYear = year;\n\t\tthis._selectDate( id, this._formatDate( inst,\n\t\t\tinst.currentDay, inst.currentMonth, inst.currentYear ) );\n\t},\n\n\t/* Erase the input field and hide the date picker. */\n\t_clearDate: function( id ) {\n\t\tvar target = $( id );\n\t\tthis._selectDate( target, \"\" );\n\t},\n\n\t/* Update the input field with the selected date. */\n\t_selectDate: function( id, dateStr ) {\n\t\tvar onSelect,\n\t\t\ttarget = $( id ),\n\t\t\tinst = this._getInst( target[ 0 ] );\n\n\t\tdateStr = ( dateStr != null ? dateStr : this._formatDate( inst ) );\n\t\tif ( inst.input ) {\n\t\t\tinst.input.val( dateStr );\n\t\t}\n\t\tthis._updateAlternate( inst );\n\n\t\tonSelect = this._get( inst, \"onSelect\" );\n\t\tif ( onSelect ) {\n\t\t\tonSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );  // trigger custom callback\n\t\t} else if ( inst.input ) {\n\t\t\tinst.input.trigger( \"change\" ); // fire the change event\n\t\t}\n\n\t\tif ( inst.inline ) {\n\t\t\tthis._updateDatepicker( inst );\n\t\t} else {\n\t\t\tthis._hideDatepicker();\n\t\t\tthis._lastInput = inst.input[ 0 ];\n\t\t\tif ( typeof( inst.input[ 0 ] ) !== \"object\" ) {\n\t\t\t\tinst.input.trigger( \"focus\" ); // restore focus\n\t\t\t}\n\t\t\tthis._lastInput = null;\n\t\t}\n\t},\n\n\t/* Update any alternate field to synchronise with the main field. */\n\t_updateAlternate: function( inst ) {\n\t\tvar altFormat, date, dateStr,\n\t\t\taltField = this._get( inst, \"altField\" );\n\n\t\tif ( altField ) { // update alternate field too\n\t\t\taltFormat = this._get( inst, \"altFormat\" ) || this._get( inst, \"dateFormat\" );\n\t\t\tdate = this._getDate( inst );\n\t\t\tdateStr = this.formatDate( altFormat, date, this._getFormatConfig( inst ) );\n\t\t\t$( altField ).val( dateStr );\n\t\t}\n\t},\n\n\t/* Set as beforeShowDay function to prevent selection of weekends.\n\t * @param  date  Date - the date to customise\n\t * @return [boolean, string] - is this date selectable?, what is its CSS class?\n\t */\n\tnoWeekends: function( date ) {\n\t\tvar day = date.getDay();\n\t\treturn [ ( day > 0 && day < 6 ), \"\" ];\n\t},\n\n\t/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.\n\t * @param  date  Date - the date to get the week for\n\t * @return  number - the number of the week within the year that contains this date\n\t */\n\tiso8601Week: function( date ) {\n\t\tvar time,\n\t\t\tcheckDate = new Date( date.getTime() );\n\n\t\t// Find Thursday of this week starting on Monday\n\t\tcheckDate.setDate( checkDate.getDate() + 4 - ( checkDate.getDay() || 7 ) );\n\n\t\ttime = checkDate.getTime();\n\t\tcheckDate.setMonth( 0 ); // Compare with Jan 1\n\t\tcheckDate.setDate( 1 );\n\t\treturn Math.floor( Math.round( ( time - checkDate ) / 86400000 ) / 7 ) + 1;\n\t},\n\n\t/* Parse a string value into a date object.\n\t * See formatDate below for the possible formats.\n\t *\n\t * @param  format string - the expected format of the date\n\t * @param  value string - the date in the above format\n\t * @param  settings Object - attributes include:\n\t *\t\t\t\t\tshortYearCutoff  number - the cutoff year for determining the century (optional)\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n\t * @return  Date - the extracted date value or null if value is blank\n\t */\n\tparseDate: function( format, value, settings ) {\n\t\tif ( format == null || value == null ) {\n\t\t\tthrow \"Invalid arguments\";\n\t\t}\n\n\t\tvalue = ( typeof value === \"object\" ? value.toString() : value + \"\" );\n\t\tif ( value === \"\" ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar iFormat, dim, extra,\n\t\t\tiValue = 0,\n\t\t\tshortYearCutoffTemp = ( settings ? settings.shortYearCutoff : null ) || this._defaults.shortYearCutoff,\n\t\t\tshortYearCutoff = ( typeof shortYearCutoffTemp !== \"string\" ? shortYearCutoffTemp :\n\t\t\t\tnew Date().getFullYear() % 100 + parseInt( shortYearCutoffTemp, 10 ) ),\n\t\t\tdayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,\n\t\t\tdayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,\n\t\t\tmonthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,\n\t\t\tmonthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,\n\t\t\tyear = -1,\n\t\t\tmonth = -1,\n\t\t\tday = -1,\n\t\t\tdoy = -1,\n\t\t\tliteral = false,\n\t\t\tdate,\n\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function( match ) {\n\t\t\t\tvar matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );\n\t\t\t\tif ( matches ) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t},\n\n\t\t\t// Extract a number from the string value\n\t\t\tgetNumber = function( match ) {\n\t\t\t\tvar isDoubled = lookAhead( match ),\n\t\t\t\t\tsize = ( match === \"@\" ? 14 : ( match === \"!\" ? 20 :\n\t\t\t\t\t( match === \"y\" && isDoubled ? 4 : ( match === \"o\" ? 3 : 2 ) ) ) ),\n\t\t\t\t\tminSize = ( match === \"y\" ? size : 1 ),\n\t\t\t\t\tdigits = new RegExp( \"^\\\\d{\" + minSize + \",\" + size + \"}\" ),\n\t\t\t\t\tnum = value.substring( iValue ).match( digits );\n\t\t\t\tif ( !num ) {\n\t\t\t\t\tthrow \"Missing number at position \" + iValue;\n\t\t\t\t}\n\t\t\t\tiValue += num[ 0 ].length;\n\t\t\t\treturn parseInt( num[ 0 ], 10 );\n\t\t\t},\n\n\t\t\t// Extract a name from the string value and convert to an index\n\t\t\tgetName = function( match, shortNames, longNames ) {\n\t\t\t\tvar index = -1,\n\t\t\t\t\tnames = $.map( lookAhead( match ) ? longNames : shortNames, function( v, k ) {\n\t\t\t\t\t\treturn [ [ k, v ] ];\n\t\t\t\t\t} ).sort( function( a, b ) {\n\t\t\t\t\t\treturn -( a[ 1 ].length - b[ 1 ].length );\n\t\t\t\t\t} );\n\n\t\t\t\t$.each( names, function( i, pair ) {\n\t\t\t\t\tvar name = pair[ 1 ];\n\t\t\t\t\tif ( value.substr( iValue, name.length ).toLowerCase() === name.toLowerCase() ) {\n\t\t\t\t\t\tindex = pair[ 0 ];\n\t\t\t\t\t\tiValue += name.length;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tif ( index !== -1 ) {\n\t\t\t\t\treturn index + 1;\n\t\t\t\t} else {\n\t\t\t\t\tthrow \"Unknown name at position \" + iValue;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Confirm that a literal character matches the string value\n\t\t\tcheckLiteral = function() {\n\t\t\t\tif ( value.charAt( iValue ) !== format.charAt( iFormat ) ) {\n\t\t\t\t\tthrow \"Unexpected literal at position \" + iValue;\n\t\t\t\t}\n\t\t\t\tiValue++;\n\t\t\t};\n\n\t\tfor ( iFormat = 0; iFormat < format.length; iFormat++ ) {\n\t\t\tif ( literal ) {\n\t\t\t\tif ( format.charAt( iFormat ) === \"'\" && !lookAhead( \"'\" ) ) {\n\t\t\t\t\tliteral = false;\n\t\t\t\t} else {\n\t\t\t\t\tcheckLiteral();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch ( format.charAt( iFormat ) ) {\n\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\tday = getNumber( \"d\" );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\tgetName( \"D\", dayNamesShort, dayNames );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"o\":\n\t\t\t\t\t\tdoy = getNumber( \"o\" );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\tmonth = getNumber( \"m\" );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\tmonth = getName( \"M\", monthNamesShort, monthNames );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\tyear = getNumber( \"y\" );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"@\":\n\t\t\t\t\t\tdate = new Date( getNumber( \"@\" ) );\n\t\t\t\t\t\tyear = date.getFullYear();\n\t\t\t\t\t\tmonth = date.getMonth() + 1;\n\t\t\t\t\t\tday = date.getDate();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"!\":\n\t\t\t\t\t\tdate = new Date( ( getNumber( \"!\" ) - this._ticksTo1970 ) / 10000 );\n\t\t\t\t\t\tyear = date.getFullYear();\n\t\t\t\t\t\tmonth = date.getMonth() + 1;\n\t\t\t\t\t\tday = date.getDate();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\tif ( lookAhead( \"'\" ) ) {\n\t\t\t\t\t\t\tcheckLiteral();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcheckLiteral();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( iValue < value.length ) {\n\t\t\textra = value.substr( iValue );\n\t\t\tif ( !/^\\s+/.test( extra ) ) {\n\t\t\t\tthrow \"Extra/unparsed characters found in date: \" + extra;\n\t\t\t}\n\t\t}\n\n\t\tif ( year === -1 ) {\n\t\t\tyear = new Date().getFullYear();\n\t\t} else if ( year < 100 ) {\n\t\t\tyear += new Date().getFullYear() - new Date().getFullYear() % 100 +\n\t\t\t\t( year <= shortYearCutoff ? 0 : -100 );\n\t\t}\n\n\t\tif ( doy > -1 ) {\n\t\t\tmonth = 1;\n\t\t\tday = doy;\n\t\t\tdo {\n\t\t\t\tdim = this._getDaysInMonth( year, month - 1 );\n\t\t\t\tif ( day <= dim ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tmonth++;\n\t\t\t\tday -= dim;\n\t\t\t} while ( true );\n\t\t}\n\n\t\tdate = this._daylightSavingAdjust( new Date( year, month - 1, day ) );\n\t\tif ( date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day ) {\n\t\t\tthrow \"Invalid date\"; // E.g. 31/02/00\n\t\t}\n\t\treturn date;\n\t},\n\n\t/* Standard date formats. */\n\tATOM: \"yy-mm-dd\", // RFC 3339 (ISO 8601)\n\tCOOKIE: \"D, dd M yy\",\n\tISO_8601: \"yy-mm-dd\",\n\tRFC_822: \"D, d M y\",\n\tRFC_850: \"DD, dd-M-y\",\n\tRFC_1036: \"D, d M y\",\n\tRFC_1123: \"D, d M yy\",\n\tRFC_2822: \"D, d M yy\",\n\tRSS: \"D, d M y\", // RFC 822\n\tTICKS: \"!\",\n\tTIMESTAMP: \"@\",\n\tW3C: \"yy-mm-dd\", // ISO 8601\n\n\t_ticksTo1970: ( ( ( 1970 - 1 ) * 365 + Math.floor( 1970 / 4 ) - Math.floor( 1970 / 100 ) +\n\t\tMath.floor( 1970 / 400 ) ) * 24 * 60 * 60 * 10000000 ),\n\n\t/* Format a date object into a string value.\n\t * The format can be combinations of the following:\n\t * d  - day of month (no leading zero)\n\t * dd - day of month (two digit)\n\t * o  - day of year (no leading zeros)\n\t * oo - day of year (three digit)\n\t * D  - day name short\n\t * DD - day name long\n\t * m  - month of year (no leading zero)\n\t * mm - month of year (two digit)\n\t * M  - month name short\n\t * MM - month name long\n\t * y  - year (two digit)\n\t * yy - year (four digit)\n\t * @ - Unix timestamp (ms since 01/01/1970)\n\t * ! - Windows ticks (100ns since 01/01/0001)\n\t * \"...\" - literal text\n\t * '' - single quote\n\t *\n\t * @param  format string - the desired format of the date\n\t * @param  date Date - the date value to format\n\t * @param  settings Object - attributes include:\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n\t * @return  string - the date in the above format\n\t */\n\tformatDate: function( format, date, settings ) {\n\t\tif ( !date ) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tvar iFormat,\n\t\t\tdayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,\n\t\t\tdayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,\n\t\t\tmonthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,\n\t\t\tmonthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,\n\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function( match ) {\n\t\t\t\tvar matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );\n\t\t\t\tif ( matches ) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t},\n\n\t\t\t// Format a number, with leading zero if necessary\n\t\t\tformatNumber = function( match, value, len ) {\n\t\t\t\tvar num = \"\" + value;\n\t\t\t\tif ( lookAhead( match ) ) {\n\t\t\t\t\twhile ( num.length < len ) {\n\t\t\t\t\t\tnum = \"0\" + num;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn num;\n\t\t\t},\n\n\t\t\t// Format a name, short or long as requested\n\t\t\tformatName = function( match, value, shortNames, longNames ) {\n\t\t\t\treturn ( lookAhead( match ) ? longNames[ value ] : shortNames[ value ] );\n\t\t\t},\n\t\t\toutput = \"\",\n\t\t\tliteral = false;\n\n\t\tif ( date ) {\n\t\t\tfor ( iFormat = 0; iFormat < format.length; iFormat++ ) {\n\t\t\t\tif ( literal ) {\n\t\t\t\t\tif ( format.charAt( iFormat ) === \"'\" && !lookAhead( \"'\" ) ) {\n\t\t\t\t\t\tliteral = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += format.charAt( iFormat );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tswitch ( format.charAt( iFormat ) ) {\n\t\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\t\toutput += formatNumber( \"d\", date.getDate(), 2 );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\t\toutput += formatName( \"D\", date.getDay(), dayNamesShort, dayNames );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"o\":\n\t\t\t\t\t\t\toutput += formatNumber( \"o\",\n\t\t\t\t\t\t\t\tMath.round( ( new Date( date.getFullYear(), date.getMonth(), date.getDate() ).getTime() - new Date( date.getFullYear(), 0, 0 ).getTime() ) / 86400000 ), 3 );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\t\toutput += formatNumber( \"m\", date.getMonth() + 1, 2 );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\t\toutput += formatName( \"M\", date.getMonth(), monthNamesShort, monthNames );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\t\toutput += ( lookAhead( \"y\" ) ? date.getFullYear() :\n\t\t\t\t\t\t\t\t( date.getFullYear() % 100 < 10 ? \"0\" : \"\" ) + date.getFullYear() % 100 );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"@\":\n\t\t\t\t\t\t\toutput += date.getTime();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"!\":\n\t\t\t\t\t\t\toutput += date.getTime() * 10000 + this._ticksTo1970;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\t\tif ( lookAhead( \"'\" ) ) {\n\t\t\t\t\t\t\t\toutput += \"'\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\toutput += format.charAt( iFormat );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t},\n\n\t/* Extract all possible characters from the date format. */\n\t_possibleChars: function( format ) {\n\t\tvar iFormat,\n\t\t\tchars = \"\",\n\t\t\tliteral = false,\n\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function( match ) {\n\t\t\t\tvar matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );\n\t\t\t\tif ( matches ) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t};\n\n\t\tfor ( iFormat = 0; iFormat < format.length; iFormat++ ) {\n\t\t\tif ( literal ) {\n\t\t\t\tif ( format.charAt( iFormat ) === \"'\" && !lookAhead( \"'\" ) ) {\n\t\t\t\t\tliteral = false;\n\t\t\t\t} else {\n\t\t\t\t\tchars += format.charAt( iFormat );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch ( format.charAt( iFormat ) ) {\n\t\t\t\t\tcase \"d\": case \"m\": case \"y\": case \"@\":\n\t\t\t\t\t\tchars += \"0123456789\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"D\": case \"M\":\n\t\t\t\t\t\treturn null; // Accept anything\n\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\tif ( lookAhead( \"'\" ) ) {\n\t\t\t\t\t\t\tchars += \"'\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tchars += format.charAt( iFormat );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn chars;\n\t},\n\n\t/* Get a setting value, defaulting if necessary. */\n\t_get: function( inst, name ) {\n\t\treturn inst.settings[ name ] !== undefined ?\n\t\t\tinst.settings[ name ] : this._defaults[ name ];\n\t},\n\n\t/* Parse existing date and initialise date picker. */\n\t_setDateFromField: function( inst, noDefault ) {\n\t\tif ( inst.input.val() === inst.lastVal ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar dateFormat = this._get( inst, \"dateFormat\" ),\n\t\t\tdates = inst.lastVal = inst.input ? inst.input.val() : null,\n\t\t\tdefaultDate = this._getDefaultDate( inst ),\n\t\t\tdate = defaultDate,\n\t\t\tsettings = this._getFormatConfig( inst );\n\n\t\ttry {\n\t\t\tdate = this.parseDate( dateFormat, dates, settings ) || defaultDate;\n\t\t} catch ( event ) {\n\t\t\tdates = ( noDefault ? \"\" : dates );\n\t\t}\n\t\tinst.selectedDay = date.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\tinst.currentDay = ( dates ? date.getDate() : 0 );\n\t\tinst.currentMonth = ( dates ? date.getMonth() : 0 );\n\t\tinst.currentYear = ( dates ? date.getFullYear() : 0 );\n\t\tthis._adjustInstDate( inst );\n\t},\n\n\t/* Retrieve the default date shown on opening. */\n\t_getDefaultDate: function( inst ) {\n\t\treturn this._restrictMinMax( inst,\n\t\t\tthis._determineDate( inst, this._get( inst, \"defaultDate\" ), new Date() ) );\n\t},\n\n\t/* A date may be specified as an exact value or a relative one. */\n\t_determineDate: function( inst, date, defaultDate ) {\n\t\tvar offsetNumeric = function( offset ) {\n\t\t\t\tvar date = new Date();\n\t\t\t\tdate.setDate( date.getDate() + offset );\n\t\t\t\treturn date;\n\t\t\t},\n\t\t\toffsetString = function( offset ) {\n\t\t\t\ttry {\n\t\t\t\t\treturn $.datepicker.parseDate( $.datepicker._get( inst, \"dateFormat\" ),\n\t\t\t\t\t\toffset, $.datepicker._getFormatConfig( inst ) );\n\t\t\t\t}\n\t\t\t\tcatch ( e ) {\n\n\t\t\t\t\t// Ignore\n\t\t\t\t}\n\n\t\t\t\tvar date = ( offset.toLowerCase().match( /^c/ ) ?\n\t\t\t\t\t$.datepicker._getDate( inst ) : null ) || new Date(),\n\t\t\t\t\tyear = date.getFullYear(),\n\t\t\t\t\tmonth = date.getMonth(),\n\t\t\t\t\tday = date.getDate(),\n\t\t\t\t\tpattern = /([+\\-]?[0-9]+)\\s*(d|D|w|W|m|M|y|Y)?/g,\n\t\t\t\t\tmatches = pattern.exec( offset );\n\n\t\t\t\twhile ( matches ) {\n\t\t\t\t\tswitch ( matches[ 2 ] || \"d\" ) {\n\t\t\t\t\t\tcase \"d\" : case \"D\" :\n\t\t\t\t\t\t\tday += parseInt( matches[ 1 ], 10 ); break;\n\t\t\t\t\t\tcase \"w\" : case \"W\" :\n\t\t\t\t\t\t\tday += parseInt( matches[ 1 ], 10 ) * 7; break;\n\t\t\t\t\t\tcase \"m\" : case \"M\" :\n\t\t\t\t\t\t\tmonth += parseInt( matches[ 1 ], 10 );\n\t\t\t\t\t\t\tday = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"y\": case \"Y\" :\n\t\t\t\t\t\t\tyear += parseInt( matches[ 1 ], 10 );\n\t\t\t\t\t\t\tday = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tmatches = pattern.exec( offset );\n\t\t\t\t}\n\t\t\t\treturn new Date( year, month, day );\n\t\t\t},\n\t\t\tnewDate = ( date == null || date === \"\" ? defaultDate : ( typeof date === \"string\" ? offsetString( date ) :\n\t\t\t\t( typeof date === \"number\" ? ( isNaN( date ) ? defaultDate : offsetNumeric( date ) ) : new Date( date.getTime() ) ) ) );\n\n\t\tnewDate = ( newDate && newDate.toString() === \"Invalid Date\" ? defaultDate : newDate );\n\t\tif ( newDate ) {\n\t\t\tnewDate.setHours( 0 );\n\t\t\tnewDate.setMinutes( 0 );\n\t\t\tnewDate.setSeconds( 0 );\n\t\t\tnewDate.setMilliseconds( 0 );\n\t\t}\n\t\treturn this._daylightSavingAdjust( newDate );\n\t},\n\n\t/* Handle switch to/from daylight saving.\n\t * Hours may be non-zero on daylight saving cut-over:\n\t * > 12 when midnight changeover, but then cannot generate\n\t * midnight datetime, so jump to 1AM, otherwise reset.\n\t * @param  date  (Date) the date to check\n\t * @return  (Date) the corrected date\n\t */\n\t_daylightSavingAdjust: function( date ) {\n\t\tif ( !date ) {\n\t\t\treturn null;\n\t\t}\n\t\tdate.setHours( date.getHours() > 12 ? date.getHours() + 2 : 0 );\n\t\treturn date;\n\t},\n\n\t/* Set the date(s) directly. */\n\t_setDate: function( inst, date, noChange ) {\n\t\tvar clear = !date,\n\t\t\torigMonth = inst.selectedMonth,\n\t\t\torigYear = inst.selectedYear,\n\t\t\tnewDate = this._restrictMinMax( inst, this._determineDate( inst, date, new Date() ) );\n\n\t\tinst.selectedDay = inst.currentDay = newDate.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();\n\t\tinst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();\n\t\tif ( ( origMonth !== inst.selectedMonth || origYear !== inst.selectedYear ) && !noChange ) {\n\t\t\tthis._notifyChange( inst );\n\t\t}\n\t\tthis._adjustInstDate( inst );\n\t\tif ( inst.input ) {\n\t\t\tinst.input.val( clear ? \"\" : this._formatDate( inst ) );\n\t\t}\n\t},\n\n\t/* Retrieve the date(s) directly. */\n\t_getDate: function( inst ) {\n\t\tvar startDate = ( !inst.currentYear || ( inst.input && inst.input.val() === \"\" ) ? null :\n\t\t\tthis._daylightSavingAdjust( new Date(\n\t\t\tinst.currentYear, inst.currentMonth, inst.currentDay ) ) );\n\t\t\treturn startDate;\n\t},\n\n\t/* Attach the onxxx handlers.  These are declared statically so\n\t * they work with static code transformers like Caja.\n\t */\n\t_attachHandlers: function( inst ) {\n\t\tvar stepMonths = this._get( inst, \"stepMonths\" ),\n\t\t\tid = \"#\" + inst.id.replace( /\\\\\\\\/g, \"\\\\\" );\n\t\tinst.dpDiv.find( \"[data-handler]\" ).map( function() {\n\t\t\tvar handler = {\n\t\t\t\tprev: function() {\n\t\t\t\t\t$.datepicker._adjustDate( id, -stepMonths, \"M\" );\n\t\t\t\t},\n\t\t\t\tnext: function() {\n\t\t\t\t\t$.datepicker._adjustDate( id, +stepMonths, \"M\" );\n\t\t\t\t},\n\t\t\t\thide: function() {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t},\n\t\t\t\ttoday: function() {\n\t\t\t\t\t$.datepicker._gotoToday( id );\n\t\t\t\t},\n\t\t\t\tselectDay: function() {\n\t\t\t\t\t$.datepicker._selectDay( id, +this.getAttribute( \"data-month\" ), +this.getAttribute( \"data-year\" ), this );\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\tselectMonth: function() {\n\t\t\t\t\t$.datepicker._selectMonthYear( id, this, \"M\" );\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\tselectYear: function() {\n\t\t\t\t\t$.datepicker._selectMonthYear( id, this, \"Y\" );\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t};\n\t\t\t$( this ).on( this.getAttribute( \"data-event\" ), handler[ this.getAttribute( \"data-handler\" ) ] );\n\t\t} );\n\t},\n\n\t/* Generate the HTML for the current state of the date picker. */\n\t_generateHTML: function( inst ) {\n\t\tvar maxDraw, prevText, prev, nextText, next, currentText, gotoDate,\n\t\t\tcontrols, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,\n\t\t\tmonthNames, monthNamesShort, beforeShowDay, showOtherMonths,\n\t\t\tselectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,\n\t\t\tcornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,\n\t\t\tprintDate, dRow, tbody, daySettings, otherMonth, unselectable,\n\t\t\ttempDate = new Date(),\n\t\t\ttoday = this._daylightSavingAdjust(\n\t\t\t\tnew Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) ), // clear time\n\t\t\tisRTL = this._get( inst, \"isRTL\" ),\n\t\t\tshowButtonPanel = this._get( inst, \"showButtonPanel\" ),\n\t\t\thideIfNoPrevNext = this._get( inst, \"hideIfNoPrevNext\" ),\n\t\t\tnavigationAsDateFormat = this._get( inst, \"navigationAsDateFormat\" ),\n\t\t\tnumMonths = this._getNumberOfMonths( inst ),\n\t\t\tshowCurrentAtPos = this._get( inst, \"showCurrentAtPos\" ),\n\t\t\tstepMonths = this._get( inst, \"stepMonths\" ),\n\t\t\tisMultiMonth = ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ),\n\t\t\tcurrentDate = this._daylightSavingAdjust( ( !inst.currentDay ? new Date( 9999, 9, 9 ) :\n\t\t\t\tnew Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) ),\n\t\t\tminDate = this._getMinMaxDate( inst, \"min\" ),\n\t\t\tmaxDate = this._getMinMaxDate( inst, \"max\" ),\n\t\t\tdrawMonth = inst.drawMonth - showCurrentAtPos,\n\t\t\tdrawYear = inst.drawYear;\n\n\t\tif ( drawMonth < 0 ) {\n\t\t\tdrawMonth += 12;\n\t\t\tdrawYear--;\n\t\t}\n\t\tif ( maxDate ) {\n\t\t\tmaxDraw = this._daylightSavingAdjust( new Date( maxDate.getFullYear(),\n\t\t\t\tmaxDate.getMonth() - ( numMonths[ 0 ] * numMonths[ 1 ] ) + 1, maxDate.getDate() ) );\n\t\t\tmaxDraw = ( minDate && maxDraw < minDate ? minDate : maxDraw );\n\t\t\twhile ( this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 ) ) > maxDraw ) {\n\t\t\t\tdrawMonth--;\n\t\t\t\tif ( drawMonth < 0 ) {\n\t\t\t\t\tdrawMonth = 11;\n\t\t\t\t\tdrawYear--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tinst.drawMonth = drawMonth;\n\t\tinst.drawYear = drawYear;\n\n\t\tprevText = this._get( inst, \"prevText\" );\n\t\tprevText = ( !navigationAsDateFormat ? prevText : this.formatDate( prevText,\n\t\t\tthis._daylightSavingAdjust( new Date( drawYear, drawMonth - stepMonths, 1 ) ),\n\t\t\tthis._getFormatConfig( inst ) ) );\n\n\t\tprev = ( this._canAdjustMonth( inst, -1, drawYear, drawMonth ) ?\n\t\t\t\"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'\" +\n\t\t\t\" title='\" + prevText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"e\" : \"w\" ) + \"'>\" + prevText + \"</span></a>\" :\n\t\t\t( hideIfNoPrevNext ? \"\" : \"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='\" + prevText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"e\" : \"w\" ) + \"'>\" + prevText + \"</span></a>\" ) );\n\n\t\tnextText = this._get( inst, \"nextText\" );\n\t\tnextText = ( !navigationAsDateFormat ? nextText : this.formatDate( nextText,\n\t\t\tthis._daylightSavingAdjust( new Date( drawYear, drawMonth + stepMonths, 1 ) ),\n\t\t\tthis._getFormatConfig( inst ) ) );\n\n\t\tnext = ( this._canAdjustMonth( inst, +1, drawYear, drawMonth ) ?\n\t\t\t\"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'\" +\n\t\t\t\" title='\" + nextText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"w\" : \"e\" ) + \"'>\" + nextText + \"</span></a>\" :\n\t\t\t( hideIfNoPrevNext ? \"\" : \"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='\" + nextText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"w\" : \"e\" ) + \"'>\" + nextText + \"</span></a>\" ) );\n\n\t\tcurrentText = this._get( inst, \"currentText\" );\n\t\tgotoDate = ( this._get( inst, \"gotoCurrent\" ) && inst.currentDay ? currentDate : today );\n\t\tcurrentText = ( !navigationAsDateFormat ? currentText :\n\t\t\tthis.formatDate( currentText, gotoDate, this._getFormatConfig( inst ) ) );\n\n\t\tcontrols = ( !inst.inline ? \"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>\" +\n\t\t\tthis._get( inst, \"closeText\" ) + \"</button>\" : \"\" );\n\n\t\tbuttonPanel = ( showButtonPanel ) ? \"<div class='ui-datepicker-buttonpane ui-widget-content'>\" + ( isRTL ? controls : \"\" ) +\n\t\t\t( this._isInRange( inst, gotoDate ) ? \"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'\" +\n\t\t\t\">\" + currentText + \"</button>\" : \"\" ) + ( isRTL ? \"\" : controls ) + \"</div>\" : \"\";\n\n\t\tfirstDay = parseInt( this._get( inst, \"firstDay\" ), 10 );\n\t\tfirstDay = ( isNaN( firstDay ) ? 0 : firstDay );\n\n\t\tshowWeek = this._get( inst, \"showWeek\" );\n\t\tdayNames = this._get( inst, \"dayNames\" );\n\t\tdayNamesMin = this._get( inst, \"dayNamesMin\" );\n\t\tmonthNames = this._get( inst, \"monthNames\" );\n\t\tmonthNamesShort = this._get( inst, \"monthNamesShort\" );\n\t\tbeforeShowDay = this._get( inst, \"beforeShowDay\" );\n\t\tshowOtherMonths = this._get( inst, \"showOtherMonths\" );\n\t\tselectOtherMonths = this._get( inst, \"selectOtherMonths\" );\n\t\tdefaultDate = this._getDefaultDate( inst );\n\t\thtml = \"\";\n\n\t\tfor ( row = 0; row < numMonths[ 0 ]; row++ ) {\n\t\t\tgroup = \"\";\n\t\t\tthis.maxRows = 4;\n\t\t\tfor ( col = 0; col < numMonths[ 1 ]; col++ ) {\n\t\t\t\tselectedDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, inst.selectedDay ) );\n\t\t\t\tcornerClass = \" ui-corner-all\";\n\t\t\t\tcalender = \"\";\n\t\t\t\tif ( isMultiMonth ) {\n\t\t\t\t\tcalender += \"<div class='ui-datepicker-group\";\n\t\t\t\t\tif ( numMonths[ 1 ] > 1 ) {\n\t\t\t\t\t\tswitch ( col ) {\n\t\t\t\t\t\t\tcase 0: calender += \" ui-datepicker-group-first\";\n\t\t\t\t\t\t\t\tcornerClass = \" ui-corner-\" + ( isRTL ? \"right\" : \"left\" ); break;\n\t\t\t\t\t\t\tcase numMonths[ 1 ] - 1: calender += \" ui-datepicker-group-last\";\n\t\t\t\t\t\t\t\tcornerClass = \" ui-corner-\" + ( isRTL ? \"left\" : \"right\" ); break;\n\t\t\t\t\t\t\tdefault: calender += \" ui-datepicker-group-middle\"; cornerClass = \"\"; break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcalender += \"'>\";\n\t\t\t\t}\n\t\t\t\tcalender += \"<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix\" + cornerClass + \"'>\" +\n\t\t\t\t\t( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? next : prev ) : \"\" ) +\n\t\t\t\t\t( /all|right/.test( cornerClass ) && row === 0 ? ( isRTL ? prev : next ) : \"\" ) +\n\t\t\t\t\tthis._generateMonthYearHeader( inst, drawMonth, drawYear, minDate, maxDate,\n\t\t\t\t\trow > 0 || col > 0, monthNames, monthNamesShort ) + // draw month headers\n\t\t\t\t\t\"</div><table class='ui-datepicker-calendar'><thead>\" +\n\t\t\t\t\t\"<tr>\";\n\t\t\t\tthead = ( showWeek ? \"<th class='ui-datepicker-week-col'>\" + this._get( inst, \"weekHeader\" ) + \"</th>\" : \"\" );\n\t\t\t\tfor ( dow = 0; dow < 7; dow++ ) { // days of the week\n\t\t\t\t\tday = ( dow + firstDay ) % 7;\n\t\t\t\t\tthead += \"<th scope='col'\" + ( ( dow + firstDay + 6 ) % 7 >= 5 ? \" class='ui-datepicker-week-end'\" : \"\" ) + \">\" +\n\t\t\t\t\t\t\"<span title='\" + dayNames[ day ] + \"'>\" + dayNamesMin[ day ] + \"</span></th>\";\n\t\t\t\t}\n\t\t\t\tcalender += thead + \"</tr></thead><tbody>\";\n\t\t\t\tdaysInMonth = this._getDaysInMonth( drawYear, drawMonth );\n\t\t\t\tif ( drawYear === inst.selectedYear && drawMonth === inst.selectedMonth ) {\n\t\t\t\t\tinst.selectedDay = Math.min( inst.selectedDay, daysInMonth );\n\t\t\t\t}\n\t\t\t\tleadDays = ( this._getFirstDayOfMonth( drawYear, drawMonth ) - firstDay + 7 ) % 7;\n\t\t\t\tcurRows = Math.ceil( ( leadDays + daysInMonth ) / 7 ); // calculate the number of rows to generate\n\t\t\t\tnumRows = ( isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows ); //If multiple months, use the higher number of rows (see #7043)\n\t\t\t\tthis.maxRows = numRows;\n\t\t\t\tprintDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 - leadDays ) );\n\t\t\t\tfor ( dRow = 0; dRow < numRows; dRow++ ) { // create date picker rows\n\t\t\t\t\tcalender += \"<tr>\";\n\t\t\t\t\ttbody = ( !showWeek ? \"\" : \"<td class='ui-datepicker-week-col'>\" +\n\t\t\t\t\t\tthis._get( inst, \"calculateWeek\" )( printDate ) + \"</td>\" );\n\t\t\t\t\tfor ( dow = 0; dow < 7; dow++ ) { // create date picker days\n\t\t\t\t\t\tdaySettings = ( beforeShowDay ?\n\t\t\t\t\t\t\tbeforeShowDay.apply( ( inst.input ? inst.input[ 0 ] : null ), [ printDate ] ) : [ true, \"\" ] );\n\t\t\t\t\t\totherMonth = ( printDate.getMonth() !== drawMonth );\n\t\t\t\t\t\tunselectable = ( otherMonth && !selectOtherMonths ) || !daySettings[ 0 ] ||\n\t\t\t\t\t\t\t( minDate && printDate < minDate ) || ( maxDate && printDate > maxDate );\n\t\t\t\t\t\ttbody += \"<td class='\" +\n\t\t\t\t\t\t\t( ( dow + firstDay + 6 ) % 7 >= 5 ? \" ui-datepicker-week-end\" : \"\" ) + // highlight weekends\n\t\t\t\t\t\t\t( otherMonth ? \" ui-datepicker-other-month\" : \"\" ) + // highlight days from other months\n\t\t\t\t\t\t\t( ( printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent ) || // user pressed key\n\t\t\t\t\t\t\t( defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime() ) ?\n\n\t\t\t\t\t\t\t// or defaultDate is current printedDate and defaultDate is selectedDate\n\t\t\t\t\t\t\t\" \" + this._dayOverClass : \"\" ) + // highlight selected day\n\t\t\t\t\t\t\t( unselectable ? \" \" + this._unselectableClass + \" ui-state-disabled\" : \"\" ) +  // highlight unselectable days\n\t\t\t\t\t\t\t( otherMonth && !showOtherMonths ? \"\" : \" \" + daySettings[ 1 ] + // highlight custom dates\n\t\t\t\t\t\t\t( printDate.getTime() === currentDate.getTime() ? \" \" + this._currentClass : \"\" ) + // highlight selected day\n\t\t\t\t\t\t\t( printDate.getTime() === today.getTime() ? \" ui-datepicker-today\" : \"\" ) ) + \"'\" + // highlight today (if different)\n\t\t\t\t\t\t\t( ( !otherMonth || showOtherMonths ) && daySettings[ 2 ] ? \" title='\" + daySettings[ 2 ].replace( /'/g, \"&#39;\" ) + \"'\" : \"\" ) + // cell title\n\t\t\t\t\t\t\t( unselectable ? \"\" : \" data-handler='selectDay' data-event='click' data-month='\" + printDate.getMonth() + \"' data-year='\" + printDate.getFullYear() + \"'\" ) + \">\" + // actions\n\t\t\t\t\t\t\t( otherMonth && !showOtherMonths ? \"&#xa0;\" : // display for other months\n\t\t\t\t\t\t\t( unselectable ? \"<span class='ui-state-default'>\" + printDate.getDate() + \"</span>\" : \"<a class='ui-state-default\" +\n\t\t\t\t\t\t\t( printDate.getTime() === today.getTime() ? \" ui-state-highlight\" : \"\" ) +\n\t\t\t\t\t\t\t( printDate.getTime() === currentDate.getTime() ? \" ui-state-active\" : \"\" ) + // highlight selected day\n\t\t\t\t\t\t\t( otherMonth ? \" ui-priority-secondary\" : \"\" ) + // distinguish dates from other months\n\t\t\t\t\t\t\t\"' href='#'>\" + printDate.getDate() + \"</a>\" ) ) + \"</td>\"; // display selectable date\n\t\t\t\t\t\tprintDate.setDate( printDate.getDate() + 1 );\n\t\t\t\t\t\tprintDate = this._daylightSavingAdjust( printDate );\n\t\t\t\t\t}\n\t\t\t\t\tcalender += tbody + \"</tr>\";\n\t\t\t\t}\n\t\t\t\tdrawMonth++;\n\t\t\t\tif ( drawMonth > 11 ) {\n\t\t\t\t\tdrawMonth = 0;\n\t\t\t\t\tdrawYear++;\n\t\t\t\t}\n\t\t\t\tcalender += \"</tbody></table>\" + ( isMultiMonth ? \"</div>\" +\n\t\t\t\t\t\t\t( ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ) ? \"<div class='ui-datepicker-row-break'></div>\" : \"\" ) : \"\" );\n\t\t\t\tgroup += calender;\n\t\t\t}\n\t\t\thtml += group;\n\t\t}\n\t\thtml += buttonPanel;\n\t\tinst._keyEvent = false;\n\t\treturn html;\n\t},\n\n\t/* Generate the month and year header. */\n\t_generateMonthYearHeader: function( inst, drawMonth, drawYear, minDate, maxDate,\n\t\t\tsecondary, monthNames, monthNamesShort ) {\n\n\t\tvar inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,\n\t\t\tchangeMonth = this._get( inst, \"changeMonth\" ),\n\t\t\tchangeYear = this._get( inst, \"changeYear\" ),\n\t\t\tshowMonthAfterYear = this._get( inst, \"showMonthAfterYear\" ),\n\t\t\thtml = \"<div class='ui-datepicker-title'>\",\n\t\t\tmonthHtml = \"\";\n\n\t\t// Month selection\n\t\tif ( secondary || !changeMonth ) {\n\t\t\tmonthHtml += \"<span class='ui-datepicker-month'>\" + monthNames[ drawMonth ] + \"</span>\";\n\t\t} else {\n\t\t\tinMinYear = ( minDate && minDate.getFullYear() === drawYear );\n\t\t\tinMaxYear = ( maxDate && maxDate.getFullYear() === drawYear );\n\t\t\tmonthHtml += \"<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>\";\n\t\t\tfor ( month = 0; month < 12; month++ ) {\n\t\t\t\tif ( ( !inMinYear || month >= minDate.getMonth() ) && ( !inMaxYear || month <= maxDate.getMonth() ) ) {\n\t\t\t\t\tmonthHtml += \"<option value='\" + month + \"'\" +\n\t\t\t\t\t\t( month === drawMonth ? \" selected='selected'\" : \"\" ) +\n\t\t\t\t\t\t\">\" + monthNamesShort[ month ] + \"</option>\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tmonthHtml += \"</select>\";\n\t\t}\n\n\t\tif ( !showMonthAfterYear ) {\n\t\t\thtml += monthHtml + ( secondary || !( changeMonth && changeYear ) ? \"&#xa0;\" : \"\" );\n\t\t}\n\n\t\t// Year selection\n\t\tif ( !inst.yearshtml ) {\n\t\t\tinst.yearshtml = \"\";\n\t\t\tif ( secondary || !changeYear ) {\n\t\t\t\thtml += \"<span class='ui-datepicker-year'>\" + drawYear + \"</span>\";\n\t\t\t} else {\n\n\t\t\t\t// determine range of years to display\n\t\t\t\tyears = this._get( inst, \"yearRange\" ).split( \":\" );\n\t\t\t\tthisYear = new Date().getFullYear();\n\t\t\t\tdetermineYear = function( value ) {\n\t\t\t\t\tvar year = ( value.match( /c[+\\-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) :\n\t\t\t\t\t\t( value.match( /[+\\-].*/ ) ? thisYear + parseInt( value, 10 ) :\n\t\t\t\t\t\tparseInt( value, 10 ) ) );\n\t\t\t\t\treturn ( isNaN( year ) ? thisYear : year );\n\t\t\t\t};\n\t\t\t\tyear = determineYear( years[ 0 ] );\n\t\t\t\tendYear = Math.max( year, determineYear( years[ 1 ] || \"\" ) );\n\t\t\t\tyear = ( minDate ? Math.max( year, minDate.getFullYear() ) : year );\n\t\t\t\tendYear = ( maxDate ? Math.min( endYear, maxDate.getFullYear() ) : endYear );\n\t\t\t\tinst.yearshtml += \"<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>\";\n\t\t\t\tfor ( ; year <= endYear; year++ ) {\n\t\t\t\t\tinst.yearshtml += \"<option value='\" + year + \"'\" +\n\t\t\t\t\t\t( year === drawYear ? \" selected='selected'\" : \"\" ) +\n\t\t\t\t\t\t\">\" + year + \"</option>\";\n\t\t\t\t}\n\t\t\t\tinst.yearshtml += \"</select>\";\n\n\t\t\t\thtml += inst.yearshtml;\n\t\t\t\tinst.yearshtml = null;\n\t\t\t}\n\t\t}\n\n\t\thtml += this._get( inst, \"yearSuffix\" );\n\t\tif ( showMonthAfterYear ) {\n\t\t\thtml += ( secondary || !( changeMonth && changeYear ) ? \"&#xa0;\" : \"\" ) + monthHtml;\n\t\t}\n\t\thtml += \"</div>\"; // Close datepicker_header\n\t\treturn html;\n\t},\n\n\t/* Adjust one of the date sub-fields. */\n\t_adjustInstDate: function( inst, offset, period ) {\n\t\tvar year = inst.selectedYear + ( period === \"Y\" ? offset : 0 ),\n\t\t\tmonth = inst.selectedMonth + ( period === \"M\" ? offset : 0 ),\n\t\t\tday = Math.min( inst.selectedDay, this._getDaysInMonth( year, month ) ) + ( period === \"D\" ? offset : 0 ),\n\t\t\tdate = this._restrictMinMax( inst, this._daylightSavingAdjust( new Date( year, month, day ) ) );\n\n\t\tinst.selectedDay = date.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\tif ( period === \"M\" || period === \"Y\" ) {\n\t\t\tthis._notifyChange( inst );\n\t\t}\n\t},\n\n\t/* Ensure a date is within any min/max bounds. */\n\t_restrictMinMax: function( inst, date ) {\n\t\tvar minDate = this._getMinMaxDate( inst, \"min\" ),\n\t\t\tmaxDate = this._getMinMaxDate( inst, \"max\" ),\n\t\t\tnewDate = ( minDate && date < minDate ? minDate : date );\n\t\treturn ( maxDate && newDate > maxDate ? maxDate : newDate );\n\t},\n\n\t/* Notify change of month/year. */\n\t_notifyChange: function( inst ) {\n\t\tvar onChange = this._get( inst, \"onChangeMonthYear\" );\n\t\tif ( onChange ) {\n\t\t\tonChange.apply( ( inst.input ? inst.input[ 0 ] : null ),\n\t\t\t\t[ inst.selectedYear, inst.selectedMonth + 1, inst ] );\n\t\t}\n\t},\n\n\t/* Determine the number of months to show. */\n\t_getNumberOfMonths: function( inst ) {\n\t\tvar numMonths = this._get( inst, \"numberOfMonths\" );\n\t\treturn ( numMonths == null ? [ 1, 1 ] : ( typeof numMonths === \"number\" ? [ 1, numMonths ] : numMonths ) );\n\t},\n\n\t/* Determine the current maximum date - ensure no time components are set. */\n\t_getMinMaxDate: function( inst, minMax ) {\n\t\treturn this._determineDate( inst, this._get( inst, minMax + \"Date\" ), null );\n\t},\n\n\t/* Find the number of days in a given month. */\n\t_getDaysInMonth: function( year, month ) {\n\t\treturn 32 - this._daylightSavingAdjust( new Date( year, month, 32 ) ).getDate();\n\t},\n\n\t/* Find the day of the week of the first of a month. */\n\t_getFirstDayOfMonth: function( year, month ) {\n\t\treturn new Date( year, month, 1 ).getDay();\n\t},\n\n\t/* Determines if we should allow a \"next/prev\" month display change. */\n\t_canAdjustMonth: function( inst, offset, curYear, curMonth ) {\n\t\tvar numMonths = this._getNumberOfMonths( inst ),\n\t\t\tdate = this._daylightSavingAdjust( new Date( curYear,\n\t\t\tcurMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) );\n\n\t\tif ( offset < 0 ) {\n\t\t\tdate.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) );\n\t\t}\n\t\treturn this._isInRange( inst, date );\n\t},\n\n\t/* Is the given date in the accepted range? */\n\t_isInRange: function( inst, date ) {\n\t\tvar yearSplit, currentYear,\n\t\t\tminDate = this._getMinMaxDate( inst, \"min\" ),\n\t\t\tmaxDate = this._getMinMaxDate( inst, \"max\" ),\n\t\t\tminYear = null,\n\t\t\tmaxYear = null,\n\t\t\tyears = this._get( inst, \"yearRange\" );\n\t\t\tif ( years ) {\n\t\t\t\tyearSplit = years.split( \":\" );\n\t\t\t\tcurrentYear = new Date().getFullYear();\n\t\t\t\tminYear = parseInt( yearSplit[ 0 ], 10 );\n\t\t\t\tmaxYear = parseInt( yearSplit[ 1 ], 10 );\n\t\t\t\tif ( yearSplit[ 0 ].match( /[+\\-].*/ ) ) {\n\t\t\t\t\tminYear += currentYear;\n\t\t\t\t}\n\t\t\t\tif ( yearSplit[ 1 ].match( /[+\\-].*/ ) ) {\n\t\t\t\t\tmaxYear += currentYear;\n\t\t\t\t}\n\t\t\t}\n\n\t\treturn ( ( !minDate || date.getTime() >= minDate.getTime() ) &&\n\t\t\t( !maxDate || date.getTime() <= maxDate.getTime() ) &&\n\t\t\t( !minYear || date.getFullYear() >= minYear ) &&\n\t\t\t( !maxYear || date.getFullYear() <= maxYear ) );\n\t},\n\n\t/* Provide the configuration settings for formatting/parsing. */\n\t_getFormatConfig: function( inst ) {\n\t\tvar shortYearCutoff = this._get( inst, \"shortYearCutoff\" );\n\t\tshortYearCutoff = ( typeof shortYearCutoff !== \"string\" ? shortYearCutoff :\n\t\t\tnew Date().getFullYear() % 100 + parseInt( shortYearCutoff, 10 ) );\n\t\treturn { shortYearCutoff: shortYearCutoff,\n\t\t\tdayNamesShort: this._get( inst, \"dayNamesShort\" ), dayNames: this._get( inst, \"dayNames\" ),\n\t\t\tmonthNamesShort: this._get( inst, \"monthNamesShort\" ), monthNames: this._get( inst, \"monthNames\" ) };\n\t},\n\n\t/* Format the given date for display. */\n\t_formatDate: function( inst, day, month, year ) {\n\t\tif ( !day ) {\n\t\t\tinst.currentDay = inst.selectedDay;\n\t\t\tinst.currentMonth = inst.selectedMonth;\n\t\t\tinst.currentYear = inst.selectedYear;\n\t\t}\n\t\tvar date = ( day ? ( typeof day === \"object\" ? day :\n\t\t\tthis._daylightSavingAdjust( new Date( year, month, day ) ) ) :\n\t\t\tthis._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) );\n\t\treturn this.formatDate( this._get( inst, \"dateFormat\" ), date, this._getFormatConfig( inst ) );\n\t}\n} );\n\n/*\n * Bind hover events for datepicker elements.\n * Done via delegate so the binding only occurs once in the lifetime of the parent div.\n * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.\n */\nfunction datepicker_bindHover( dpDiv ) {\n\tvar selector = \"button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a\";\n\treturn dpDiv.on( \"mouseout\", selector, function() {\n\t\t\t$( this ).removeClass( \"ui-state-hover\" );\n\t\t\tif ( this.className.indexOf( \"ui-datepicker-prev\" ) !== -1 ) {\n\t\t\t\t$( this ).removeClass( \"ui-datepicker-prev-hover\" );\n\t\t\t}\n\t\t\tif ( this.className.indexOf( \"ui-datepicker-next\" ) !== -1 ) {\n\t\t\t\t$( this ).removeClass( \"ui-datepicker-next-hover\" );\n\t\t\t}\n\t\t} )\n\t\t.on( \"mouseover\", selector, datepicker_handleMouseover );\n}\n\nfunction datepicker_handleMouseover() {\n\tif ( !$.datepicker._isDisabledDatepicker( datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[ 0 ] : datepicker_instActive.input[ 0 ] ) ) {\n\t\t$( this ).parents( \".ui-datepicker-calendar\" ).find( \"a\" ).removeClass( \"ui-state-hover\" );\n\t\t$( this ).addClass( \"ui-state-hover\" );\n\t\tif ( this.className.indexOf( \"ui-datepicker-prev\" ) !== -1 ) {\n\t\t\t$( this ).addClass( \"ui-datepicker-prev-hover\" );\n\t\t}\n\t\tif ( this.className.indexOf( \"ui-datepicker-next\" ) !== -1 ) {\n\t\t\t$( this ).addClass( \"ui-datepicker-next-hover\" );\n\t\t}\n\t}\n}\n\n/* jQuery extend now ignores nulls! */\nfunction datepicker_extendRemove( target, props ) {\n\t$.extend( target, props );\n\tfor ( var name in props ) {\n\t\tif ( props[ name ] == null ) {\n\t\t\ttarget[ name ] = props[ name ];\n\t\t}\n\t}\n\treturn target;\n}\n\n/* Invoke the datepicker functionality.\n   @param  options  string - a command, optionally followed by additional parameters or\n\t\t\t\t\tObject - settings for attaching new datepicker functionality\n   @return  jQuery object */\n$.fn.datepicker = function( options ) {\n\n\t/* Verify an empty collection wasn't passed - Fixes #6976 */\n\tif ( !this.length ) {\n\t\treturn this;\n\t}\n\n\t/* Initialise the date picker. */\n\tif ( !$.datepicker.initialized ) {\n\t\t$( document ).on( \"mousedown\", $.datepicker._checkExternalClick );\n\t\t$.datepicker.initialized = true;\n\t}\n\n\t/* Append datepicker main container to body if not exist. */\n\tif ( $( \"#\" + $.datepicker._mainDivId ).length === 0 ) {\n\t\t$( \"body\" ).append( $.datepicker.dpDiv );\n\t}\n\n\tvar otherArgs = Array.prototype.slice.call( arguments, 1 );\n\tif ( typeof options === \"string\" && ( options === \"isDisabled\" || options === \"getDate\" || options === \"widget\" ) ) {\n\t\treturn $.datepicker[ \"_\" + options + \"Datepicker\" ].\n\t\t\tapply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );\n\t}\n\tif ( options === \"option\" && arguments.length === 2 && typeof arguments[ 1 ] === \"string\" ) {\n\t\treturn $.datepicker[ \"_\" + options + \"Datepicker\" ].\n\t\t\tapply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );\n\t}\n\treturn this.each( function() {\n\t\ttypeof options === \"string\" ?\n\t\t\t$.datepicker[ \"_\" + options + \"Datepicker\" ].\n\t\t\t\tapply( $.datepicker, [ this ].concat( otherArgs ) ) :\n\t\t\t$.datepicker._attachDatepicker( this, options );\n\t} );\n};\n\n$.datepicker = new Datepicker(); // singleton instance\n$.datepicker.initialized = false;\n$.datepicker.uuid = new Date().getTime();\n$.datepicker.version = \"1.12.1\";\n\nvar widgetsDatepicker = $.datepicker;\n\n\n/*!\n * jQuery UI Dialog 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Dialog\n//>>group: Widgets\n//>>description: Displays customizable dialog windows.\n//>>docs: http://api.jqueryui.com/dialog/\n//>>demos: http://jqueryui.com/dialog/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/dialog.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.dialog\", {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tappendTo: \"body\",\n\t\tautoOpen: true,\n\t\tbuttons: [],\n\t\tclasses: {\n\t\t\t\"ui-dialog\": \"ui-corner-all\",\n\t\t\t\"ui-dialog-titlebar\": \"ui-corner-all\"\n\t\t},\n\t\tcloseOnEscape: true,\n\t\tcloseText: \"Close\",\n\t\tdraggable: true,\n\t\thide: null,\n\t\theight: \"auto\",\n\t\tmaxHeight: null,\n\t\tmaxWidth: null,\n\t\tminHeight: 150,\n\t\tminWidth: 150,\n\t\tmodal: false,\n\t\tposition: {\n\t\t\tmy: \"center\",\n\t\t\tat: \"center\",\n\t\t\tof: window,\n\t\t\tcollision: \"fit\",\n\n\t\t\t// Ensure the titlebar is always visible\n\t\t\tusing: function( pos ) {\n\t\t\t\tvar topOffset = $( this ).css( pos ).offset().top;\n\t\t\t\tif ( topOffset < 0 ) {\n\t\t\t\t\t$( this ).css( \"top\", pos.top - topOffset );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tresizable: true,\n\t\tshow: null,\n\t\ttitle: null,\n\t\twidth: 300,\n\n\t\t// Callbacks\n\t\tbeforeClose: null,\n\t\tclose: null,\n\t\tdrag: null,\n\t\tdragStart: null,\n\t\tdragStop: null,\n\t\tfocus: null,\n\t\topen: null,\n\t\tresize: null,\n\t\tresizeStart: null,\n\t\tresizeStop: null\n\t},\n\n\tsizeRelatedOptions: {\n\t\tbuttons: true,\n\t\theight: true,\n\t\tmaxHeight: true,\n\t\tmaxWidth: true,\n\t\tminHeight: true,\n\t\tminWidth: true,\n\t\twidth: true\n\t},\n\n\tresizableRelatedOptions: {\n\t\tmaxHeight: true,\n\t\tmaxWidth: true,\n\t\tminHeight: true,\n\t\tminWidth: true\n\t},\n\n\t_create: function() {\n\t\tthis.originalCss = {\n\t\t\tdisplay: this.element[ 0 ].style.display,\n\t\t\twidth: this.element[ 0 ].style.width,\n\t\t\tminHeight: this.element[ 0 ].style.minHeight,\n\t\t\tmaxHeight: this.element[ 0 ].style.maxHeight,\n\t\t\theight: this.element[ 0 ].style.height\n\t\t};\n\t\tthis.originalPosition = {\n\t\t\tparent: this.element.parent(),\n\t\t\tindex: this.element.parent().children().index( this.element )\n\t\t};\n\t\tthis.originalTitle = this.element.attr( \"title\" );\n\t\tif ( this.options.title == null && this.originalTitle != null ) {\n\t\t\tthis.options.title = this.originalTitle;\n\t\t}\n\n\t\t// Dialogs can't be disabled\n\t\tif ( this.options.disabled ) {\n\t\t\tthis.options.disabled = false;\n\t\t}\n\n\t\tthis._createWrapper();\n\n\t\tthis.element\n\t\t\t.show()\n\t\t\t.removeAttr( \"title\" )\n\t\t\t.appendTo( this.uiDialog );\n\n\t\tthis._addClass( \"ui-dialog-content\", \"ui-widget-content\" );\n\n\t\tthis._createTitlebar();\n\t\tthis._createButtonPane();\n\n\t\tif ( this.options.draggable && $.fn.draggable ) {\n\t\t\tthis._makeDraggable();\n\t\t}\n\t\tif ( this.options.resizable && $.fn.resizable ) {\n\t\t\tthis._makeResizable();\n\t\t}\n\n\t\tthis._isOpen = false;\n\n\t\tthis._trackFocus();\n\t},\n\n\t_init: function() {\n\t\tif ( this.options.autoOpen ) {\n\t\t\tthis.open();\n\t\t}\n\t},\n\n\t_appendTo: function() {\n\t\tvar element = this.options.appendTo;\n\t\tif ( element && ( element.jquery || element.nodeType ) ) {\n\t\t\treturn $( element );\n\t\t}\n\t\treturn this.document.find( element || \"body\" ).eq( 0 );\n\t},\n\n\t_destroy: function() {\n\t\tvar next,\n\t\t\toriginalPosition = this.originalPosition;\n\n\t\tthis._untrackInstance();\n\t\tthis._destroyOverlay();\n\n\t\tthis.element\n\t\t\t.removeUniqueId()\n\t\t\t.css( this.originalCss )\n\n\t\t\t// Without detaching first, the following becomes really slow\n\t\t\t.detach();\n\n\t\tthis.uiDialog.remove();\n\n\t\tif ( this.originalTitle ) {\n\t\t\tthis.element.attr( \"title\", this.originalTitle );\n\t\t}\n\n\t\tnext = originalPosition.parent.children().eq( originalPosition.index );\n\n\t\t// Don't try to place the dialog next to itself (#8613)\n\t\tif ( next.length && next[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tnext.before( this.element );\n\t\t} else {\n\t\t\toriginalPosition.parent.append( this.element );\n\t\t}\n\t},\n\n\twidget: function() {\n\t\treturn this.uiDialog;\n\t},\n\n\tdisable: $.noop,\n\tenable: $.noop,\n\n\tclose: function( event ) {\n\t\tvar that = this;\n\n\t\tif ( !this._isOpen || this._trigger( \"beforeClose\", event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isOpen = false;\n\t\tthis._focusedElement = null;\n\t\tthis._destroyOverlay();\n\t\tthis._untrackInstance();\n\n\t\tif ( !this.opener.filter( \":focusable\" ).trigger( \"focus\" ).length ) {\n\n\t\t\t// Hiding a focused element doesn't trigger blur in WebKit\n\t\t\t// so in case we have nothing to focus on, explicitly blur the active element\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=47182\n\t\t\t$.ui.safeBlur( $.ui.safeActiveElement( this.document[ 0 ] ) );\n\t\t}\n\n\t\tthis._hide( this.uiDialog, this.options.hide, function() {\n\t\t\tthat._trigger( \"close\", event );\n\t\t} );\n\t},\n\n\tisOpen: function() {\n\t\treturn this._isOpen;\n\t},\n\n\tmoveToTop: function() {\n\t\tthis._moveToTop();\n\t},\n\n\t_moveToTop: function( event, silent ) {\n\t\tvar moved = false,\n\t\t\tzIndices = this.uiDialog.siblings( \".ui-front:visible\" ).map( function() {\n\t\t\t\treturn +$( this ).css( \"z-index\" );\n\t\t\t} ).get(),\n\t\t\tzIndexMax = Math.max.apply( null, zIndices );\n\n\t\tif ( zIndexMax >= +this.uiDialog.css( \"z-index\" ) ) {\n\t\t\tthis.uiDialog.css( \"z-index\", zIndexMax + 1 );\n\t\t\tmoved = true;\n\t\t}\n\n\t\tif ( moved && !silent ) {\n\t\t\tthis._trigger( \"focus\", event );\n\t\t}\n\t\treturn moved;\n\t},\n\n\topen: function() {\n\t\tvar that = this;\n\t\tif ( this._isOpen ) {\n\t\t\tif ( this._moveToTop() ) {\n\t\t\t\tthis._focusTabbable();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isOpen = true;\n\t\tthis.opener = $( $.ui.safeActiveElement( this.document[ 0 ] ) );\n\n\t\tthis._size();\n\t\tthis._position();\n\t\tthis._createOverlay();\n\t\tthis._moveToTop( null, true );\n\n\t\t// Ensure the overlay is moved to the top with the dialog, but only when\n\t\t// opening. The overlay shouldn't move after the dialog is open so that\n\t\t// modeless dialogs opened after the modal dialog stack properly.\n\t\tif ( this.overlay ) {\n\t\t\tthis.overlay.css( \"z-index\", this.uiDialog.css( \"z-index\" ) - 1 );\n\t\t}\n\n\t\tthis._show( this.uiDialog, this.options.show, function() {\n\t\t\tthat._focusTabbable();\n\t\t\tthat._trigger( \"focus\" );\n\t\t} );\n\n\t\t// Track the dialog immediately upon openening in case a focus event\n\t\t// somehow occurs outside of the dialog before an element inside the\n\t\t// dialog is focused (#10152)\n\t\tthis._makeFocusTarget();\n\n\t\tthis._trigger( \"open\" );\n\t},\n\n\t_focusTabbable: function() {\n\n\t\t// Set focus to the first match:\n\t\t// 1. An element that was focused previously\n\t\t// 2. First element inside the dialog matching [autofocus]\n\t\t// 3. Tabbable element inside the content element\n\t\t// 4. Tabbable element inside the buttonpane\n\t\t// 5. The close button\n\t\t// 6. The dialog itself\n\t\tvar hasFocus = this._focusedElement;\n\t\tif ( !hasFocus ) {\n\t\t\thasFocus = this.element.find( \"[autofocus]\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.element.find( \":tabbable\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialogButtonPane.find( \":tabbable\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialogTitlebarClose.filter( \":tabbable\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialog;\n\t\t}\n\t\thasFocus.eq( 0 ).trigger( \"focus\" );\n\t},\n\n\t_keepFocus: function( event ) {\n\t\tfunction checkFocus() {\n\t\t\tvar activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),\n\t\t\t\tisActive = this.uiDialog[ 0 ] === activeElement ||\n\t\t\t\t\t$.contains( this.uiDialog[ 0 ], activeElement );\n\t\t\tif ( !isActive ) {\n\t\t\t\tthis._focusTabbable();\n\t\t\t}\n\t\t}\n\t\tevent.preventDefault();\n\t\tcheckFocus.call( this );\n\n\t\t// support: IE\n\t\t// IE <= 8 doesn't prevent moving focus even with event.preventDefault()\n\t\t// so we check again later\n\t\tthis._delay( checkFocus );\n\t},\n\n\t_createWrapper: function() {\n\t\tthis.uiDialog = $( \"<div>\" )\n\t\t\t.hide()\n\t\t\t.attr( {\n\n\t\t\t\t// Setting tabIndex makes the div focusable\n\t\t\t\ttabIndex: -1,\n\t\t\t\trole: \"dialog\"\n\t\t\t} )\n\t\t\t.appendTo( this._appendTo() );\n\n\t\tthis._addClass( this.uiDialog, \"ui-dialog\", \"ui-widget ui-widget-content ui-front\" );\n\t\tthis._on( this.uiDialog, {\n\t\t\tkeydown: function( event ) {\n\t\t\t\tif ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&\n\t\t\t\t\t\tevent.keyCode === $.ui.keyCode.ESCAPE ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tthis.close( event );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Prevent tabbing out of dialogs\n\t\t\t\tif ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar tabbables = this.uiDialog.find( \":tabbable\" ),\n\t\t\t\t\tfirst = tabbables.filter( \":first\" ),\n\t\t\t\t\tlast = tabbables.filter( \":last\" );\n\n\t\t\t\tif ( ( event.target === last[ 0 ] || event.target === this.uiDialog[ 0 ] ) &&\n\t\t\t\t\t\t!event.shiftKey ) {\n\t\t\t\t\tthis._delay( function() {\n\t\t\t\t\t\tfirst.trigger( \"focus\" );\n\t\t\t\t\t} );\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t} else if ( ( event.target === first[ 0 ] ||\n\t\t\t\t\t\tevent.target === this.uiDialog[ 0 ] ) && event.shiftKey ) {\n\t\t\t\t\tthis._delay( function() {\n\t\t\t\t\t\tlast.trigger( \"focus\" );\n\t\t\t\t\t} );\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t},\n\t\t\tmousedown: function( event ) {\n\t\t\t\tif ( this._moveToTop( event ) ) {\n\t\t\t\t\tthis._focusTabbable();\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// We assume that any existing aria-describedby attribute means\n\t\t// that the dialog content is marked up properly\n\t\t// otherwise we brute force the content as the description\n\t\tif ( !this.element.find( \"[aria-describedby]\" ).length ) {\n\t\t\tthis.uiDialog.attr( {\n\t\t\t\t\"aria-describedby\": this.element.uniqueId().attr( \"id\" )\n\t\t\t} );\n\t\t}\n\t},\n\n\t_createTitlebar: function() {\n\t\tvar uiDialogTitle;\n\n\t\tthis.uiDialogTitlebar = $( \"<div>\" );\n\t\tthis._addClass( this.uiDialogTitlebar,\n\t\t\t\"ui-dialog-titlebar\", \"ui-widget-header ui-helper-clearfix\" );\n\t\tthis._on( this.uiDialogTitlebar, {\n\t\t\tmousedown: function( event ) {\n\n\t\t\t\t// Don't prevent click on close button (#8838)\n\t\t\t\t// Focusing a dialog that is partially scrolled out of view\n\t\t\t\t// causes the browser to scroll it into view, preventing the click event\n\t\t\t\tif ( !$( event.target ).closest( \".ui-dialog-titlebar-close\" ) ) {\n\n\t\t\t\t\t// Dialog isn't getting focus when dragging (#8063)\n\t\t\t\t\tthis.uiDialog.trigger( \"focus\" );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Support: IE\n\t\t// Use type=\"button\" to prevent enter keypresses in textboxes from closing the\n\t\t// dialog in IE (#9312)\n\t\tthis.uiDialogTitlebarClose = $( \"<button type='button'></button>\" )\n\t\t\t.button( {\n\t\t\t\tlabel: $( \"<a>\" ).text( this.options.closeText ).html(),\n\t\t\t\ticon: \"ui-icon-closethick\",\n\t\t\t\tshowLabel: false\n\t\t\t} )\n\t\t\t.appendTo( this.uiDialogTitlebar );\n\n\t\tthis._addClass( this.uiDialogTitlebarClose, \"ui-dialog-titlebar-close\" );\n\t\tthis._on( this.uiDialogTitlebarClose, {\n\t\t\tclick: function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.close( event );\n\t\t\t}\n\t\t} );\n\n\t\tuiDialogTitle = $( \"<span>\" ).uniqueId().prependTo( this.uiDialogTitlebar );\n\t\tthis._addClass( uiDialogTitle, \"ui-dialog-title\" );\n\t\tthis._title( uiDialogTitle );\n\n\t\tthis.uiDialogTitlebar.prependTo( this.uiDialog );\n\n\t\tthis.uiDialog.attr( {\n\t\t\t\"aria-labelledby\": uiDialogTitle.attr( \"id\" )\n\t\t} );\n\t},\n\n\t_title: function( title ) {\n\t\tif ( this.options.title ) {\n\t\t\ttitle.text( this.options.title );\n\t\t} else {\n\t\t\ttitle.html( \"&#160;\" );\n\t\t}\n\t},\n\n\t_createButtonPane: function() {\n\t\tthis.uiDialogButtonPane = $( \"<div>\" );\n\t\tthis._addClass( this.uiDialogButtonPane, \"ui-dialog-buttonpane\",\n\t\t\t\"ui-widget-content ui-helper-clearfix\" );\n\n\t\tthis.uiButtonSet = $( \"<div>\" )\n\t\t\t.appendTo( this.uiDialogButtonPane );\n\t\tthis._addClass( this.uiButtonSet, \"ui-dialog-buttonset\" );\n\n\t\tthis._createButtons();\n\t},\n\n\t_createButtons: function() {\n\t\tvar that = this,\n\t\t\tbuttons = this.options.buttons;\n\n\t\t// If we already have a button pane, remove it\n\t\tthis.uiDialogButtonPane.remove();\n\t\tthis.uiButtonSet.empty();\n\n\t\tif ( $.isEmptyObject( buttons ) || ( $.isArray( buttons ) && !buttons.length ) ) {\n\t\t\tthis._removeClass( this.uiDialog, \"ui-dialog-buttons\" );\n\t\t\treturn;\n\t\t}\n\n\t\t$.each( buttons, function( name, props ) {\n\t\t\tvar click, buttonOptions;\n\t\t\tprops = $.isFunction( props ) ?\n\t\t\t\t{ click: props, text: name } :\n\t\t\t\tprops;\n\n\t\t\t// Default to a non-submitting button\n\t\t\tprops = $.extend( { type: \"button\" }, props );\n\n\t\t\t// Change the context for the click callback to be the main element\n\t\t\tclick = props.click;\n\t\t\tbuttonOptions = {\n\t\t\t\ticon: props.icon,\n\t\t\t\ticonPosition: props.iconPosition,\n\t\t\t\tshowLabel: props.showLabel,\n\n\t\t\t\t// Deprecated options\n\t\t\t\ticons: props.icons,\n\t\t\t\ttext: props.text\n\t\t\t};\n\n\t\t\tdelete props.click;\n\t\t\tdelete props.icon;\n\t\t\tdelete props.iconPosition;\n\t\t\tdelete props.showLabel;\n\n\t\t\t// Deprecated options\n\t\t\tdelete props.icons;\n\t\t\tif ( typeof props.text === \"boolean\" ) {\n\t\t\t\tdelete props.text;\n\t\t\t}\n\n\t\t\t$( \"<button></button>\", props )\n\t\t\t\t.button( buttonOptions )\n\t\t\t\t.appendTo( that.uiButtonSet )\n\t\t\t\t.on( \"click\", function() {\n\t\t\t\t\tclick.apply( that.element[ 0 ], arguments );\n\t\t\t\t} );\n\t\t} );\n\t\tthis._addClass( this.uiDialog, \"ui-dialog-buttons\" );\n\t\tthis.uiDialogButtonPane.appendTo( this.uiDialog );\n\t},\n\n\t_makeDraggable: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tfunction filteredUi( ui ) {\n\t\t\treturn {\n\t\t\t\tposition: ui.position,\n\t\t\t\toffset: ui.offset\n\t\t\t};\n\t\t}\n\n\t\tthis.uiDialog.draggable( {\n\t\t\tcancel: \".ui-dialog-content, .ui-dialog-titlebar-close\",\n\t\t\thandle: \".ui-dialog-titlebar\",\n\t\t\tcontainment: \"document\",\n\t\t\tstart: function( event, ui ) {\n\t\t\t\tthat._addClass( $( this ), \"ui-dialog-dragging\" );\n\t\t\t\tthat._blockFrames();\n\t\t\t\tthat._trigger( \"dragStart\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tdrag: function( event, ui ) {\n\t\t\t\tthat._trigger( \"drag\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tstop: function( event, ui ) {\n\t\t\t\tvar left = ui.offset.left - that.document.scrollLeft(),\n\t\t\t\t\ttop = ui.offset.top - that.document.scrollTop();\n\n\t\t\t\toptions.position = {\n\t\t\t\t\tmy: \"left top\",\n\t\t\t\t\tat: \"left\" + ( left >= 0 ? \"+\" : \"\" ) + left + \" \" +\n\t\t\t\t\t\t\"top\" + ( top >= 0 ? \"+\" : \"\" ) + top,\n\t\t\t\t\tof: that.window\n\t\t\t\t};\n\t\t\t\tthat._removeClass( $( this ), \"ui-dialog-dragging\" );\n\t\t\t\tthat._unblockFrames();\n\t\t\t\tthat._trigger( \"dragStop\", event, filteredUi( ui ) );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_makeResizable: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options,\n\t\t\thandles = options.resizable,\n\n\t\t\t// .ui-resizable has position: relative defined in the stylesheet\n\t\t\t// but dialogs have to use absolute or fixed positioning\n\t\t\tposition = this.uiDialog.css( \"position\" ),\n\t\t\tresizeHandles = typeof handles === \"string\" ?\n\t\t\t\thandles :\n\t\t\t\t\"n,e,s,w,se,sw,ne,nw\";\n\n\t\tfunction filteredUi( ui ) {\n\t\t\treturn {\n\t\t\t\toriginalPosition: ui.originalPosition,\n\t\t\t\toriginalSize: ui.originalSize,\n\t\t\t\tposition: ui.position,\n\t\t\t\tsize: ui.size\n\t\t\t};\n\t\t}\n\n\t\tthis.uiDialog.resizable( {\n\t\t\tcancel: \".ui-dialog-content\",\n\t\t\tcontainment: \"document\",\n\t\t\talsoResize: this.element,\n\t\t\tmaxWidth: options.maxWidth,\n\t\t\tmaxHeight: options.maxHeight,\n\t\t\tminWidth: options.minWidth,\n\t\t\tminHeight: this._minHeight(),\n\t\t\thandles: resizeHandles,\n\t\t\tstart: function( event, ui ) {\n\t\t\t\tthat._addClass( $( this ), \"ui-dialog-resizing\" );\n\t\t\t\tthat._blockFrames();\n\t\t\t\tthat._trigger( \"resizeStart\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tresize: function( event, ui ) {\n\t\t\t\tthat._trigger( \"resize\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tstop: function( event, ui ) {\n\t\t\t\tvar offset = that.uiDialog.offset(),\n\t\t\t\t\tleft = offset.left - that.document.scrollLeft(),\n\t\t\t\t\ttop = offset.top - that.document.scrollTop();\n\n\t\t\t\toptions.height = that.uiDialog.height();\n\t\t\t\toptions.width = that.uiDialog.width();\n\t\t\t\toptions.position = {\n\t\t\t\t\tmy: \"left top\",\n\t\t\t\t\tat: \"left\" + ( left >= 0 ? \"+\" : \"\" ) + left + \" \" +\n\t\t\t\t\t\t\"top\" + ( top >= 0 ? \"+\" : \"\" ) + top,\n\t\t\t\t\tof: that.window\n\t\t\t\t};\n\t\t\t\tthat._removeClass( $( this ), \"ui-dialog-resizing\" );\n\t\t\t\tthat._unblockFrames();\n\t\t\t\tthat._trigger( \"resizeStop\", event, filteredUi( ui ) );\n\t\t\t}\n\t\t} )\n\t\t\t.css( \"position\", position );\n\t},\n\n\t_trackFocus: function() {\n\t\tthis._on( this.widget(), {\n\t\t\tfocusin: function( event ) {\n\t\t\t\tthis._makeFocusTarget();\n\t\t\t\tthis._focusedElement = $( event.target );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_makeFocusTarget: function() {\n\t\tthis._untrackInstance();\n\t\tthis._trackingInstances().unshift( this );\n\t},\n\n\t_untrackInstance: function() {\n\t\tvar instances = this._trackingInstances(),\n\t\t\texists = $.inArray( this, instances );\n\t\tif ( exists !== -1 ) {\n\t\t\tinstances.splice( exists, 1 );\n\t\t}\n\t},\n\n\t_trackingInstances: function() {\n\t\tvar instances = this.document.data( \"ui-dialog-instances\" );\n\t\tif ( !instances ) {\n\t\t\tinstances = [];\n\t\t\tthis.document.data( \"ui-dialog-instances\", instances );\n\t\t}\n\t\treturn instances;\n\t},\n\n\t_minHeight: function() {\n\t\tvar options = this.options;\n\n\t\treturn options.height === \"auto\" ?\n\t\t\toptions.minHeight :\n\t\t\tMath.min( options.minHeight, options.height );\n\t},\n\n\t_position: function() {\n\n\t\t// Need to show the dialog to get the actual offset in the position plugin\n\t\tvar isVisible = this.uiDialog.is( \":visible\" );\n\t\tif ( !isVisible ) {\n\t\t\tthis.uiDialog.show();\n\t\t}\n\t\tthis.uiDialog.position( this.options.position );\n\t\tif ( !isVisible ) {\n\t\t\tthis.uiDialog.hide();\n\t\t}\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar that = this,\n\t\t\tresize = false,\n\t\t\tresizableOptions = {};\n\n\t\t$.each( options, function( key, value ) {\n\t\t\tthat._setOption( key, value );\n\n\t\t\tif ( key in that.sizeRelatedOptions ) {\n\t\t\t\tresize = true;\n\t\t\t}\n\t\t\tif ( key in that.resizableRelatedOptions ) {\n\t\t\t\tresizableOptions[ key ] = value;\n\t\t\t}\n\t\t} );\n\n\t\tif ( resize ) {\n\t\t\tthis._size();\n\t\t\tthis._position();\n\t\t}\n\t\tif ( this.uiDialog.is( \":data(ui-resizable)\" ) ) {\n\t\t\tthis.uiDialog.resizable( \"option\", resizableOptions );\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar isDraggable, isResizable,\n\t\t\tuiDialog = this.uiDialog;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"appendTo\" ) {\n\t\t\tthis.uiDialog.appendTo( this._appendTo() );\n\t\t}\n\n\t\tif ( key === \"buttons\" ) {\n\t\t\tthis._createButtons();\n\t\t}\n\n\t\tif ( key === \"closeText\" ) {\n\t\t\tthis.uiDialogTitlebarClose.button( {\n\n\t\t\t\t// Ensure that we always pass a string\n\t\t\t\tlabel: $( \"<a>\" ).text( \"\" + this.options.closeText ).html()\n\t\t\t} );\n\t\t}\n\n\t\tif ( key === \"draggable\" ) {\n\t\t\tisDraggable = uiDialog.is( \":data(ui-draggable)\" );\n\t\t\tif ( isDraggable && !value ) {\n\t\t\t\tuiDialog.draggable( \"destroy\" );\n\t\t\t}\n\n\t\t\tif ( !isDraggable && value ) {\n\t\t\t\tthis._makeDraggable();\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"position\" ) {\n\t\t\tthis._position();\n\t\t}\n\n\t\tif ( key === \"resizable\" ) {\n\n\t\t\t// currently resizable, becoming non-resizable\n\t\t\tisResizable = uiDialog.is( \":data(ui-resizable)\" );\n\t\t\tif ( isResizable && !value ) {\n\t\t\t\tuiDialog.resizable( \"destroy\" );\n\t\t\t}\n\n\t\t\t// Currently resizable, changing handles\n\t\t\tif ( isResizable && typeof value === \"string\" ) {\n\t\t\t\tuiDialog.resizable( \"option\", \"handles\", value );\n\t\t\t}\n\n\t\t\t// Currently non-resizable, becoming resizable\n\t\t\tif ( !isResizable && value !== false ) {\n\t\t\t\tthis._makeResizable();\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"title\" ) {\n\t\t\tthis._title( this.uiDialogTitlebar.find( \".ui-dialog-title\" ) );\n\t\t}\n\t},\n\n\t_size: function() {\n\n\t\t// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content\n\t\t// divs will both have width and height set, so we need to reset them\n\t\tvar nonContentHeight, minContentHeight, maxContentHeight,\n\t\t\toptions = this.options;\n\n\t\t// Reset content sizing\n\t\tthis.element.show().css( {\n\t\t\twidth: \"auto\",\n\t\t\tminHeight: 0,\n\t\t\tmaxHeight: \"none\",\n\t\t\theight: 0\n\t\t} );\n\n\t\tif ( options.minWidth > options.width ) {\n\t\t\toptions.width = options.minWidth;\n\t\t}\n\n\t\t// Reset wrapper sizing\n\t\t// determine the height of all the non-content elements\n\t\tnonContentHeight = this.uiDialog.css( {\n\t\t\theight: \"auto\",\n\t\t\twidth: options.width\n\t\t} )\n\t\t\t.outerHeight();\n\t\tminContentHeight = Math.max( 0, options.minHeight - nonContentHeight );\n\t\tmaxContentHeight = typeof options.maxHeight === \"number\" ?\n\t\t\tMath.max( 0, options.maxHeight - nonContentHeight ) :\n\t\t\t\"none\";\n\n\t\tif ( options.height === \"auto\" ) {\n\t\t\tthis.element.css( {\n\t\t\t\tminHeight: minContentHeight,\n\t\t\t\tmaxHeight: maxContentHeight,\n\t\t\t\theight: \"auto\"\n\t\t\t} );\n\t\t} else {\n\t\t\tthis.element.height( Math.max( 0, options.height - nonContentHeight ) );\n\t\t}\n\n\t\tif ( this.uiDialog.is( \":data(ui-resizable)\" ) ) {\n\t\t\tthis.uiDialog.resizable( \"option\", \"minHeight\", this._minHeight() );\n\t\t}\n\t},\n\n\t_blockFrames: function() {\n\t\tthis.iframeBlocks = this.document.find( \"iframe\" ).map( function() {\n\t\t\tvar iframe = $( this );\n\n\t\t\treturn $( \"<div>\" )\n\t\t\t\t.css( {\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\twidth: iframe.outerWidth(),\n\t\t\t\t\theight: iframe.outerHeight()\n\t\t\t\t} )\n\t\t\t\t.appendTo( iframe.parent() )\n\t\t\t\t.offset( iframe.offset() )[ 0 ];\n\t\t} );\n\t},\n\n\t_unblockFrames: function() {\n\t\tif ( this.iframeBlocks ) {\n\t\t\tthis.iframeBlocks.remove();\n\t\t\tdelete this.iframeBlocks;\n\t\t}\n\t},\n\n\t_allowInteraction: function( event ) {\n\t\tif ( $( event.target ).closest( \".ui-dialog\" ).length ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// TODO: Remove hack when datepicker implements\n\t\t// the .ui-front logic (#8989)\n\t\treturn !!$( event.target ).closest( \".ui-datepicker\" ).length;\n\t},\n\n\t_createOverlay: function() {\n\t\tif ( !this.options.modal ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// We use a delay in case the overlay is created from an\n\t\t// event that we're going to be cancelling (#2804)\n\t\tvar isOpening = true;\n\t\tthis._delay( function() {\n\t\t\tisOpening = false;\n\t\t} );\n\n\t\tif ( !this.document.data( \"ui-dialog-overlays\" ) ) {\n\n\t\t\t// Prevent use of anchors and inputs\n\t\t\t// Using _on() for an event handler shared across many instances is\n\t\t\t// safe because the dialogs stack and must be closed in reverse order\n\t\t\tthis._on( this.document, {\n\t\t\t\tfocusin: function( event ) {\n\t\t\t\t\tif ( isOpening ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !this._allowInteraction( event ) ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tthis._trackingInstances()[ 0 ]._focusTabbable();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tthis.overlay = $( \"<div>\" )\n\t\t\t.appendTo( this._appendTo() );\n\n\t\tthis._addClass( this.overlay, null, \"ui-widget-overlay ui-front\" );\n\t\tthis._on( this.overlay, {\n\t\t\tmousedown: \"_keepFocus\"\n\t\t} );\n\t\tthis.document.data( \"ui-dialog-overlays\",\n\t\t\t( this.document.data( \"ui-dialog-overlays\" ) || 0 ) + 1 );\n\t},\n\n\t_destroyOverlay: function() {\n\t\tif ( !this.options.modal ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.overlay ) {\n\t\t\tvar overlays = this.document.data( \"ui-dialog-overlays\" ) - 1;\n\n\t\t\tif ( !overlays ) {\n\t\t\t\tthis._off( this.document, \"focusin\" );\n\t\t\t\tthis.document.removeData( \"ui-dialog-overlays\" );\n\t\t\t} else {\n\t\t\t\tthis.document.data( \"ui-dialog-overlays\", overlays );\n\t\t\t}\n\n\t\t\tthis.overlay.remove();\n\t\t\tthis.overlay = null;\n\t\t}\n\t}\n} );\n\n// DEPRECATED\n// TODO: switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for dialogClass option\n\t$.widget( \"ui.dialog\", $.ui.dialog, {\n\t\toptions: {\n\t\t\tdialogClass: \"\"\n\t\t},\n\t\t_createWrapper: function() {\n\t\t\tthis._super();\n\t\t\tthis.uiDialog.addClass( this.options.dialogClass );\n\t\t},\n\t\t_setOption: function( key, value ) {\n\t\t\tif ( key === \"dialogClass\" ) {\n\t\t\t\tthis.uiDialog\n\t\t\t\t\t.removeClass( this.options.dialogClass )\n\t\t\t\t\t.addClass( value );\n\t\t\t}\n\t\t\tthis._superApply( arguments );\n\t\t}\n\t} );\n}\n\nvar widgetsDialog = $.ui.dialog;\n\n\n/*!\n * jQuery UI Progressbar 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Progressbar\n//>>group: Widgets\n// jscs:disable maximumLineLength\n//>>description: Displays a status indicator for loading state, standard percentage, and other progress indicators.\n// jscs:enable maximumLineLength\n//>>docs: http://api.jqueryui.com/progressbar/\n//>>demos: http://jqueryui.com/progressbar/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/progressbar.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\nvar widgetsProgressbar = $.widget( \"ui.progressbar\", {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-progressbar\": \"ui-corner-all\",\n\t\t\t\"ui-progressbar-value\": \"ui-corner-left\",\n\t\t\t\"ui-progressbar-complete\": \"ui-corner-right\"\n\t\t},\n\t\tmax: 100,\n\t\tvalue: 0,\n\n\t\tchange: null,\n\t\tcomplete: null\n\t},\n\n\tmin: 0,\n\n\t_create: function() {\n\n\t\t// Constrain initial value\n\t\tthis.oldValue = this.options.value = this._constrainedValue();\n\n\t\tthis.element.attr( {\n\n\t\t\t// Only set static values; aria-valuenow and aria-valuemax are\n\t\t\t// set inside _refreshValue()\n\t\t\trole: \"progressbar\",\n\t\t\t\"aria-valuemin\": this.min\n\t\t} );\n\t\tthis._addClass( \"ui-progressbar\", \"ui-widget ui-widget-content\" );\n\n\t\tthis.valueDiv = $( \"<div>\" ).appendTo( this.element );\n\t\tthis._addClass( this.valueDiv, \"ui-progressbar-value\", \"ui-widget-header\" );\n\t\tthis._refreshValue();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element.removeAttr( \"role aria-valuemin aria-valuemax aria-valuenow\" );\n\n\t\tthis.valueDiv.remove();\n\t},\n\n\tvalue: function( newValue ) {\n\t\tif ( newValue === undefined ) {\n\t\t\treturn this.options.value;\n\t\t}\n\n\t\tthis.options.value = this._constrainedValue( newValue );\n\t\tthis._refreshValue();\n\t},\n\n\t_constrainedValue: function( newValue ) {\n\t\tif ( newValue === undefined ) {\n\t\t\tnewValue = this.options.value;\n\t\t}\n\n\t\tthis.indeterminate = newValue === false;\n\n\t\t// Sanitize value\n\t\tif ( typeof newValue !== \"number\" ) {\n\t\t\tnewValue = 0;\n\t\t}\n\n\t\treturn this.indeterminate ? false :\n\t\t\tMath.min( this.options.max, Math.max( this.min, newValue ) );\n\t},\n\n\t_setOptions: function( options ) {\n\n\t\t// Ensure \"value\" option is set after other values (like max)\n\t\tvar value = options.value;\n\t\tdelete options.value;\n\n\t\tthis._super( options );\n\n\t\tthis.options.value = this._constrainedValue( value );\n\t\tthis._refreshValue();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"max\" ) {\n\n\t\t\t// Don't allow a max less than min\n\t\t\tvalue = Math.max( this.min, value );\n\t\t}\n\t\tthis._super( key, value );\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis.element.attr( \"aria-disabled\", value );\n\t\tthis._toggleClass( null, \"ui-state-disabled\", !!value );\n\t},\n\n\t_percentage: function() {\n\t\treturn this.indeterminate ?\n\t\t\t100 :\n\t\t\t100 * ( this.options.value - this.min ) / ( this.options.max - this.min );\n\t},\n\n\t_refreshValue: function() {\n\t\tvar value = this.options.value,\n\t\t\tpercentage = this._percentage();\n\n\t\tthis.valueDiv\n\t\t\t.toggle( this.indeterminate || value > this.min )\n\t\t\t.width( percentage.toFixed( 0 ) + \"%\" );\n\n\t\tthis\n\t\t\t._toggleClass( this.valueDiv, \"ui-progressbar-complete\", null,\n\t\t\t\tvalue === this.options.max )\n\t\t\t._toggleClass( \"ui-progressbar-indeterminate\", null, this.indeterminate );\n\n\t\tif ( this.indeterminate ) {\n\t\t\tthis.element.removeAttr( \"aria-valuenow\" );\n\t\t\tif ( !this.overlayDiv ) {\n\t\t\t\tthis.overlayDiv = $( \"<div>\" ).appendTo( this.valueDiv );\n\t\t\t\tthis._addClass( this.overlayDiv, \"ui-progressbar-overlay\" );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.element.attr( {\n\t\t\t\t\"aria-valuemax\": this.options.max,\n\t\t\t\t\"aria-valuenow\": value\n\t\t\t} );\n\t\t\tif ( this.overlayDiv ) {\n\t\t\t\tthis.overlayDiv.remove();\n\t\t\t\tthis.overlayDiv = null;\n\t\t\t}\n\t\t}\n\n\t\tif ( this.oldValue !== value ) {\n\t\t\tthis.oldValue = value;\n\t\t\tthis._trigger( \"change\" );\n\t\t}\n\t\tif ( value === this.options.max ) {\n\t\t\tthis._trigger( \"complete\" );\n\t\t}\n\t}\n} );\n\n\n/*!\n * jQuery UI Selectmenu 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Selectmenu\n//>>group: Widgets\n// jscs:disable maximumLineLength\n//>>description: Duplicates and extends the functionality of a native HTML select element, allowing it to be customizable in behavior and appearance far beyond the limitations of a native select.\n// jscs:enable maximumLineLength\n//>>docs: http://api.jqueryui.com/selectmenu/\n//>>demos: http://jqueryui.com/selectmenu/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/selectmenu.css, ../../themes/base/button.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\nvar widgetsSelectmenu = $.widget( \"ui.selectmenu\", [ $.ui.formResetMixin, {\n\tversion: \"1.12.1\",\n\tdefaultElement: \"<select>\",\n\toptions: {\n\t\tappendTo: null,\n\t\tclasses: {\n\t\t\t\"ui-selectmenu-button-open\": \"ui-corner-top\",\n\t\t\t\"ui-selectmenu-button-closed\": \"ui-corner-all\"\n\t\t},\n\t\tdisabled: null,\n\t\ticons: {\n\t\t\tbutton: \"ui-icon-triangle-1-s\"\n\t\t},\n\t\tposition: {\n\t\t\tmy: \"left top\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"none\"\n\t\t},\n\t\twidth: false,\n\n\t\t// Callbacks\n\t\tchange: null,\n\t\tclose: null,\n\t\tfocus: null,\n\t\topen: null,\n\t\tselect: null\n\t},\n\n\t_create: function() {\n\t\tvar selectmenuId = this.element.uniqueId().attr( \"id\" );\n\t\tthis.ids = {\n\t\t\telement: selectmenuId,\n\t\t\tbutton: selectmenuId + \"-button\",\n\t\t\tmenu: selectmenuId + \"-menu\"\n\t\t};\n\n\t\tthis._drawButton();\n\t\tthis._drawMenu();\n\t\tthis._bindFormResetHandler();\n\n\t\tthis._rendered = false;\n\t\tthis.menuItems = $();\n\t},\n\n\t_drawButton: function() {\n\t\tvar icon,\n\t\t\tthat = this,\n\t\t\titem = this._parseOption(\n\t\t\t\tthis.element.find( \"option:selected\" ),\n\t\t\t\tthis.element[ 0 ].selectedIndex\n\t\t\t);\n\n\t\t// Associate existing label with the new button\n\t\tthis.labels = this.element.labels().attr( \"for\", this.ids.button );\n\t\tthis._on( this.labels, {\n\t\t\tclick: function( event ) {\n\t\t\t\tthis.button.focus();\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t} );\n\n\t\t// Hide original select element\n\t\tthis.element.hide();\n\n\t\t// Create button\n\t\tthis.button = $( \"<span>\", {\n\t\t\ttabindex: this.options.disabled ? -1 : 0,\n\t\t\tid: this.ids.button,\n\t\t\trole: \"combobox\",\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\t\"aria-autocomplete\": \"list\",\n\t\t\t\"aria-owns\": this.ids.menu,\n\t\t\t\"aria-haspopup\": \"true\",\n\t\t\ttitle: this.element.attr( \"title\" )\n\t\t} )\n\t\t\t.insertAfter( this.element );\n\n\t\tthis._addClass( this.button, \"ui-selectmenu-button ui-selectmenu-button-closed\",\n\t\t\t\"ui-button ui-widget\" );\n\n\t\ticon = $( \"<span>\" ).appendTo( this.button );\n\t\tthis._addClass( icon, \"ui-selectmenu-icon\", \"ui-icon \" + this.options.icons.button );\n\t\tthis.buttonItem = this._renderButtonItem( item )\n\t\t\t.appendTo( this.button );\n\n\t\tif ( this.options.width !== false ) {\n\t\t\tthis._resizeButton();\n\t\t}\n\n\t\tthis._on( this.button, this._buttonEvents );\n\t\tthis.button.one( \"focusin\", function() {\n\n\t\t\t// Delay rendering the menu items until the button receives focus.\n\t\t\t// The menu may have already been rendered via a programmatic open.\n\t\t\tif ( !that._rendered ) {\n\t\t\t\tthat._refreshMenu();\n\t\t\t}\n\t\t} );\n\t},\n\n\t_drawMenu: function() {\n\t\tvar that = this;\n\n\t\t// Create menu\n\t\tthis.menu = $( \"<ul>\", {\n\t\t\t\"aria-hidden\": \"true\",\n\t\t\t\"aria-labelledby\": this.ids.button,\n\t\t\tid: this.ids.menu\n\t\t} );\n\n\t\t// Wrap menu\n\t\tthis.menuWrap = $( \"<div>\" ).append( this.menu );\n\t\tthis._addClass( this.menuWrap, \"ui-selectmenu-menu\", \"ui-front\" );\n\t\tthis.menuWrap.appendTo( this._appendTo() );\n\n\t\t// Initialize menu widget\n\t\tthis.menuInstance = this.menu\n\t\t\t.menu( {\n\t\t\t\tclasses: {\n\t\t\t\t\t\"ui-menu\": \"ui-corner-bottom\"\n\t\t\t\t},\n\t\t\t\trole: \"listbox\",\n\t\t\t\tselect: function( event, ui ) {\n\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t// Support: IE8\n\t\t\t\t\t// If the item was selected via a click, the text selection\n\t\t\t\t\t// will be destroyed in IE\n\t\t\t\t\tthat._setSelection();\n\n\t\t\t\t\tthat._select( ui.item.data( \"ui-selectmenu-item\" ), event );\n\t\t\t\t},\n\t\t\t\tfocus: function( event, ui ) {\n\t\t\t\t\tvar item = ui.item.data( \"ui-selectmenu-item\" );\n\n\t\t\t\t\t// Prevent inital focus from firing and check if its a newly focused item\n\t\t\t\t\tif ( that.focusIndex != null && item.index !== that.focusIndex ) {\n\t\t\t\t\t\tthat._trigger( \"focus\", event, { item: item } );\n\t\t\t\t\t\tif ( !that.isOpen ) {\n\t\t\t\t\t\t\tthat._select( item, event );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthat.focusIndex = item.index;\n\n\t\t\t\t\tthat.button.attr( \"aria-activedescendant\",\n\t\t\t\t\t\tthat.menuItems.eq( item.index ).attr( \"id\" ) );\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.menu( \"instance\" );\n\n\t\t// Don't close the menu on mouseleave\n\t\tthis.menuInstance._off( this.menu, \"mouseleave\" );\n\n\t\t// Cancel the menu's collapseAll on document click\n\t\tthis.menuInstance._closeOnDocumentClick = function() {\n\t\t\treturn false;\n\t\t};\n\n\t\t// Selects often contain empty items, but never contain dividers\n\t\tthis.menuInstance._isDivider = function() {\n\t\t\treturn false;\n\t\t};\n\t},\n\n\trefresh: function() {\n\t\tthis._refreshMenu();\n\t\tthis.buttonItem.replaceWith(\n\t\t\tthis.buttonItem = this._renderButtonItem(\n\n\t\t\t\t// Fall back to an empty object in case there are no options\n\t\t\t\tthis._getSelectedItem().data( \"ui-selectmenu-item\" ) || {}\n\t\t\t)\n\t\t);\n\t\tif ( this.options.width === null ) {\n\t\t\tthis._resizeButton();\n\t\t}\n\t},\n\n\t_refreshMenu: function() {\n\t\tvar item,\n\t\t\toptions = this.element.find( \"option\" );\n\n\t\tthis.menu.empty();\n\n\t\tthis._parseOptions( options );\n\t\tthis._renderMenu( this.menu, this.items );\n\n\t\tthis.menuInstance.refresh();\n\t\tthis.menuItems = this.menu.find( \"li\" )\n\t\t\t.not( \".ui-selectmenu-optgroup\" )\n\t\t\t\t.find( \".ui-menu-item-wrapper\" );\n\n\t\tthis._rendered = true;\n\n\t\tif ( !options.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\titem = this._getSelectedItem();\n\n\t\t// Update the menu to have the correct item focused\n\t\tthis.menuInstance.focus( null, item );\n\t\tthis._setAria( item.data( \"ui-selectmenu-item\" ) );\n\n\t\t// Set disabled state\n\t\tthis._setOption( \"disabled\", this.element.prop( \"disabled\" ) );\n\t},\n\n\topen: function( event ) {\n\t\tif ( this.options.disabled ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If this is the first time the menu is being opened, render the items\n\t\tif ( !this._rendered ) {\n\t\t\tthis._refreshMenu();\n\t\t} else {\n\n\t\t\t// Menu clears focus on close, reset focus to selected item\n\t\t\tthis._removeClass( this.menu.find( \".ui-state-active\" ), null, \"ui-state-active\" );\n\t\t\tthis.menuInstance.focus( null, this._getSelectedItem() );\n\t\t}\n\n\t\t// If there are no options, don't open the menu\n\t\tif ( !this.menuItems.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isOpen = true;\n\t\tthis._toggleAttr();\n\t\tthis._resizeMenu();\n\t\tthis._position();\n\n\t\tthis._on( this.document, this._documentClick );\n\n\t\tthis._trigger( \"open\", event );\n\t},\n\n\t_position: function() {\n\t\tthis.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );\n\t},\n\n\tclose: function( event ) {\n\t\tif ( !this.isOpen ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isOpen = false;\n\t\tthis._toggleAttr();\n\n\t\tthis.range = null;\n\t\tthis._off( this.document );\n\n\t\tthis._trigger( \"close\", event );\n\t},\n\n\twidget: function() {\n\t\treturn this.button;\n\t},\n\n\tmenuWidget: function() {\n\t\treturn this.menu;\n\t},\n\n\t_renderButtonItem: function( item ) {\n\t\tvar buttonItem = $( \"<span>\" );\n\n\t\tthis._setText( buttonItem, item.label );\n\t\tthis._addClass( buttonItem, \"ui-selectmenu-text\" );\n\n\t\treturn buttonItem;\n\t},\n\n\t_renderMenu: function( ul, items ) {\n\t\tvar that = this,\n\t\t\tcurrentOptgroup = \"\";\n\n\t\t$.each( items, function( index, item ) {\n\t\t\tvar li;\n\n\t\t\tif ( item.optgroup !== currentOptgroup ) {\n\t\t\t\tli = $( \"<li>\", {\n\t\t\t\t\ttext: item.optgroup\n\t\t\t\t} );\n\t\t\t\tthat._addClass( li, \"ui-selectmenu-optgroup\", \"ui-menu-divider\" +\n\t\t\t\t\t( item.element.parent( \"optgroup\" ).prop( \"disabled\" ) ?\n\t\t\t\t\t\t\" ui-state-disabled\" :\n\t\t\t\t\t\t\"\" ) );\n\n\t\t\t\tli.appendTo( ul );\n\n\t\t\t\tcurrentOptgroup = item.optgroup;\n\t\t\t}\n\n\t\t\tthat._renderItemData( ul, item );\n\t\t} );\n\t},\n\n\t_renderItemData: function( ul, item ) {\n\t\treturn this._renderItem( ul, item ).data( \"ui-selectmenu-item\", item );\n\t},\n\n\t_renderItem: function( ul, item ) {\n\t\tvar li = $( \"<li>\" ),\n\t\t\twrapper = $( \"<div>\", {\n\t\t\t\ttitle: item.element.attr( \"title\" )\n\t\t\t} );\n\n\t\tif ( item.disabled ) {\n\t\t\tthis._addClass( li, null, \"ui-state-disabled\" );\n\t\t}\n\t\tthis._setText( wrapper, item.label );\n\n\t\treturn li.append( wrapper ).appendTo( ul );\n\t},\n\n\t_setText: function( element, value ) {\n\t\tif ( value ) {\n\t\t\telement.text( value );\n\t\t} else {\n\t\t\telement.html( \"&#160;\" );\n\t\t}\n\t},\n\n\t_move: function( direction, event ) {\n\t\tvar item, next,\n\t\t\tfilter = \".ui-menu-item\";\n\n\t\tif ( this.isOpen ) {\n\t\t\titem = this.menuItems.eq( this.focusIndex ).parent( \"li\" );\n\t\t} else {\n\t\t\titem = this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( \"li\" );\n\t\t\tfilter += \":not(.ui-state-disabled)\";\n\t\t}\n\n\t\tif ( direction === \"first\" || direction === \"last\" ) {\n\t\t\tnext = item[ direction === \"first\" ? \"prevAll\" : \"nextAll\" ]( filter ).eq( -1 );\n\t\t} else {\n\t\t\tnext = item[ direction + \"All\" ]( filter ).eq( 0 );\n\t\t}\n\n\t\tif ( next.length ) {\n\t\t\tthis.menuInstance.focus( event, next );\n\t\t}\n\t},\n\n\t_getSelectedItem: function() {\n\t\treturn this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( \"li\" );\n\t},\n\n\t_toggle: function( event ) {\n\t\tthis[ this.isOpen ? \"close\" : \"open\" ]( event );\n\t},\n\n\t_setSelection: function() {\n\t\tvar selection;\n\n\t\tif ( !this.range ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( window.getSelection ) {\n\t\t\tselection = window.getSelection();\n\t\t\tselection.removeAllRanges();\n\t\t\tselection.addRange( this.range );\n\n\t\t// Support: IE8\n\t\t} else {\n\t\t\tthis.range.select();\n\t\t}\n\n\t\t// Support: IE\n\t\t// Setting the text selection kills the button focus in IE, but\n\t\t// restoring the focus doesn't kill the selection.\n\t\tthis.button.focus();\n\t},\n\n\t_documentClick: {\n\t\tmousedown: function( event ) {\n\t\t\tif ( !this.isOpen ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( !$( event.target ).closest( \".ui-selectmenu-menu, #\" +\n\t\t\t\t\t$.ui.escapeSelector( this.ids.button ) ).length ) {\n\t\t\t\tthis.close( event );\n\t\t\t}\n\t\t}\n\t},\n\n\t_buttonEvents: {\n\n\t\t// Prevent text selection from being reset when interacting with the selectmenu (#10144)\n\t\tmousedown: function() {\n\t\t\tvar selection;\n\n\t\t\tif ( window.getSelection ) {\n\t\t\t\tselection = window.getSelection();\n\t\t\t\tif ( selection.rangeCount ) {\n\t\t\t\t\tthis.range = selection.getRangeAt( 0 );\n\t\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t} else {\n\t\t\t\tthis.range = document.selection.createRange();\n\t\t\t}\n\t\t},\n\n\t\tclick: function( event ) {\n\t\t\tthis._setSelection();\n\t\t\tthis._toggle( event );\n\t\t},\n\n\t\tkeydown: function( event ) {\n\t\t\tvar preventDefault = true;\n\t\t\tswitch ( event.keyCode ) {\n\t\t\tcase $.ui.keyCode.TAB:\n\t\t\tcase $.ui.keyCode.ESCAPE:\n\t\t\t\tthis.close( event );\n\t\t\t\tpreventDefault = false;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.ENTER:\n\t\t\t\tif ( this.isOpen ) {\n\t\t\t\t\tthis._selectFocusedItem( event );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\tif ( event.altKey ) {\n\t\t\t\t\tthis._toggle( event );\n\t\t\t\t} else {\n\t\t\t\t\tthis._move( \"prev\", event );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tif ( event.altKey ) {\n\t\t\t\t\tthis._toggle( event );\n\t\t\t\t} else {\n\t\t\t\t\tthis._move( \"next\", event );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.SPACE:\n\t\t\t\tif ( this.isOpen ) {\n\t\t\t\t\tthis._selectFocusedItem( event );\n\t\t\t\t} else {\n\t\t\t\t\tthis._toggle( event );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\tthis._move( \"prev\", event );\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\tthis._move( \"next\", event );\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.HOME:\n\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\tthis._move( \"first\", event );\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.END:\n\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\tthis._move( \"last\", event );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.menu.trigger( event );\n\t\t\t\tpreventDefault = false;\n\t\t\t}\n\n\t\t\tif ( preventDefault ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t},\n\n\t_selectFocusedItem: function( event ) {\n\t\tvar item = this.menuItems.eq( this.focusIndex ).parent( \"li\" );\n\t\tif ( !item.hasClass( \"ui-state-disabled\" ) ) {\n\t\t\tthis._select( item.data( \"ui-selectmenu-item\" ), event );\n\t\t}\n\t},\n\n\t_select: function( item, event ) {\n\t\tvar oldIndex = this.element[ 0 ].selectedIndex;\n\n\t\t// Change native select element\n\t\tthis.element[ 0 ].selectedIndex = item.index;\n\t\tthis.buttonItem.replaceWith( this.buttonItem = this._renderButtonItem( item ) );\n\t\tthis._setAria( item );\n\t\tthis._trigger( \"select\", event, { item: item } );\n\n\t\tif ( item.index !== oldIndex ) {\n\t\t\tthis._trigger( \"change\", event, { item: item } );\n\t\t}\n\n\t\tthis.close( event );\n\t},\n\n\t_setAria: function( item ) {\n\t\tvar id = this.menuItems.eq( item.index ).attr( \"id\" );\n\n\t\tthis.button.attr( {\n\t\t\t\"aria-labelledby\": id,\n\t\t\t\"aria-activedescendant\": id\n\t\t} );\n\t\tthis.menu.attr( \"aria-activedescendant\", id );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"icons\" ) {\n\t\t\tvar icon = this.button.find( \"span.ui-icon\" );\n\t\t\tthis._removeClass( icon, null, this.options.icons.button )\n\t\t\t\t._addClass( icon, null, value.button );\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"appendTo\" ) {\n\t\t\tthis.menuWrap.appendTo( this._appendTo() );\n\t\t}\n\n\t\tif ( key === \"width\" ) {\n\t\t\tthis._resizeButton();\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis.menuInstance.option( \"disabled\", value );\n\t\tthis.button.attr( \"aria-disabled\", value );\n\t\tthis._toggleClass( this.button, null, \"ui-state-disabled\", value );\n\n\t\tthis.element.prop( \"disabled\", value );\n\t\tif ( value ) {\n\t\t\tthis.button.attr( \"tabindex\", -1 );\n\t\t\tthis.close();\n\t\t} else {\n\t\t\tthis.button.attr( \"tabindex\", 0 );\n\t\t}\n\t},\n\n\t_appendTo: function() {\n\t\tvar element = this.options.appendTo;\n\n\t\tif ( element ) {\n\t\t\telement = element.jquery || element.nodeType ?\n\t\t\t\t$( element ) :\n\t\t\t\tthis.document.find( element ).eq( 0 );\n\t\t}\n\n\t\tif ( !element || !element[ 0 ] ) {\n\t\t\telement = this.element.closest( \".ui-front, dialog\" );\n\t\t}\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[ 0 ].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_toggleAttr: function() {\n\t\tthis.button.attr( \"aria-expanded\", this.isOpen );\n\n\t\t// We can't use two _toggleClass() calls here, because we need to make sure\n\t\t// we always remove classes first and add them second, otherwise if both classes have the\n\t\t// same theme class, it will be removed after we add it.\n\t\tthis._removeClass( this.button, \"ui-selectmenu-button-\" +\n\t\t\t( this.isOpen ? \"closed\" : \"open\" ) )\n\t\t\t._addClass( this.button, \"ui-selectmenu-button-\" +\n\t\t\t\t( this.isOpen ? \"open\" : \"closed\" ) )\n\t\t\t._toggleClass( this.menuWrap, \"ui-selectmenu-open\", null, this.isOpen );\n\n\t\tthis.menu.attr( \"aria-hidden\", !this.isOpen );\n\t},\n\n\t_resizeButton: function() {\n\t\tvar width = this.options.width;\n\n\t\t// For `width: false`, just remove inline style and stop\n\t\tif ( width === false ) {\n\t\t\tthis.button.css( \"width\", \"\" );\n\t\t\treturn;\n\t\t}\n\n\t\t// For `width: null`, match the width of the original element\n\t\tif ( width === null ) {\n\t\t\twidth = this.element.show().outerWidth();\n\t\t\tthis.element.hide();\n\t\t}\n\n\t\tthis.button.outerWidth( width );\n\t},\n\n\t_resizeMenu: function() {\n\t\tthis.menu.outerWidth( Math.max(\n\t\t\tthis.button.outerWidth(),\n\n\t\t\t// Support: IE10\n\t\t\t// IE10 wraps long text (possibly a rounding bug)\n\t\t\t// so we add 1px to avoid the wrapping\n\t\t\tthis.menu.width( \"\" ).outerWidth() + 1\n\t\t) );\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar options = this._super();\n\n\t\toptions.disabled = this.element.prop( \"disabled\" );\n\n\t\treturn options;\n\t},\n\n\t_parseOptions: function( options ) {\n\t\tvar that = this,\n\t\t\tdata = [];\n\t\toptions.each( function( index, item ) {\n\t\t\tdata.push( that._parseOption( $( item ), index ) );\n\t\t} );\n\t\tthis.items = data;\n\t},\n\n\t_parseOption: function( option, index ) {\n\t\tvar optgroup = option.parent( \"optgroup\" );\n\n\t\treturn {\n\t\t\telement: option,\n\t\t\tindex: index,\n\t\t\tvalue: option.val(),\n\t\t\tlabel: option.text(),\n\t\t\toptgroup: optgroup.attr( \"label\" ) || \"\",\n\t\t\tdisabled: optgroup.prop( \"disabled\" ) || option.prop( \"disabled\" )\n\t\t};\n\t},\n\n\t_destroy: function() {\n\t\tthis._unbindFormResetHandler();\n\t\tthis.menuWrap.remove();\n\t\tthis.button.remove();\n\t\tthis.element.show();\n\t\tthis.element.removeUniqueId();\n\t\tthis.labels.attr( \"for\", this.ids.element );\n\t}\n} ] );\n\n\n/*!\n * jQuery UI Slider 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Slider\n//>>group: Widgets\n//>>description: Displays a flexible slider with ranges and accessibility via keyboard.\n//>>docs: http://api.jqueryui.com/slider/\n//>>demos: http://jqueryui.com/slider/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/slider.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\nvar widgetsSlider = $.widget( \"ui.slider\", $.ui.mouse, {\n\tversion: \"1.12.1\",\n\twidgetEventPrefix: \"slide\",\n\n\toptions: {\n\t\tanimate: false,\n\t\tclasses: {\n\t\t\t\"ui-slider\": \"ui-corner-all\",\n\t\t\t\"ui-slider-handle\": \"ui-corner-all\",\n\n\t\t\t// Note: ui-widget-header isn't the most fittingly semantic framework class for this\n\t\t\t// element, but worked best visually with a variety of themes\n\t\t\t\"ui-slider-range\": \"ui-corner-all ui-widget-header\"\n\t\t},\n\t\tdistance: 0,\n\t\tmax: 100,\n\t\tmin: 0,\n\t\torientation: \"horizontal\",\n\t\trange: false,\n\t\tstep: 1,\n\t\tvalue: 0,\n\t\tvalues: null,\n\n\t\t// Callbacks\n\t\tchange: null,\n\t\tslide: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t// Number of pages in a slider\n\t// (how many times can you page up/down to go through the whole range)\n\tnumPages: 5,\n\n\t_create: function() {\n\t\tthis._keySliding = false;\n\t\tthis._mouseSliding = false;\n\t\tthis._animateOff = true;\n\t\tthis._handleIndex = null;\n\t\tthis._detectOrientation();\n\t\tthis._mouseInit();\n\t\tthis._calculateNewMax();\n\n\t\tthis._addClass( \"ui-slider ui-slider-\" + this.orientation,\n\t\t\t\"ui-widget ui-widget-content\" );\n\n\t\tthis._refresh();\n\n\t\tthis._animateOff = false;\n\t},\n\n\t_refresh: function() {\n\t\tthis._createRange();\n\t\tthis._createHandles();\n\t\tthis._setupEvents();\n\t\tthis._refreshValue();\n\t},\n\n\t_createHandles: function() {\n\t\tvar i, handleCount,\n\t\t\toptions = this.options,\n\t\t\texistingHandles = this.element.find( \".ui-slider-handle\" ),\n\t\t\thandle = \"<span tabindex='0'></span>\",\n\t\t\thandles = [];\n\n\t\thandleCount = ( options.values && options.values.length ) || 1;\n\n\t\tif ( existingHandles.length > handleCount ) {\n\t\t\texistingHandles.slice( handleCount ).remove();\n\t\t\texistingHandles = existingHandles.slice( 0, handleCount );\n\t\t}\n\n\t\tfor ( i = existingHandles.length; i < handleCount; i++ ) {\n\t\t\thandles.push( handle );\n\t\t}\n\n\t\tthis.handles = existingHandles.add( $( handles.join( \"\" ) ).appendTo( this.element ) );\n\n\t\tthis._addClass( this.handles, \"ui-slider-handle\", \"ui-state-default\" );\n\n\t\tthis.handle = this.handles.eq( 0 );\n\n\t\tthis.handles.each( function( i ) {\n\t\t\t$( this )\n\t\t\t\t.data( \"ui-slider-handle-index\", i )\n\t\t\t\t.attr( \"tabIndex\", 0 );\n\t\t} );\n\t},\n\n\t_createRange: function() {\n\t\tvar options = this.options;\n\n\t\tif ( options.range ) {\n\t\t\tif ( options.range === true ) {\n\t\t\t\tif ( !options.values ) {\n\t\t\t\t\toptions.values = [ this._valueMin(), this._valueMin() ];\n\t\t\t\t} else if ( options.values.length && options.values.length !== 2 ) {\n\t\t\t\t\toptions.values = [ options.values[ 0 ], options.values[ 0 ] ];\n\t\t\t\t} else if ( $.isArray( options.values ) ) {\n\t\t\t\t\toptions.values = options.values.slice( 0 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !this.range || !this.range.length ) {\n\t\t\t\tthis.range = $( \"<div>\" )\n\t\t\t\t\t.appendTo( this.element );\n\n\t\t\t\tthis._addClass( this.range, \"ui-slider-range\" );\n\t\t\t} else {\n\t\t\t\tthis._removeClass( this.range, \"ui-slider-range-min ui-slider-range-max\" );\n\n\t\t\t\t// Handle range switching from true to min/max\n\t\t\t\tthis.range.css( {\n\t\t\t\t\t\"left\": \"\",\n\t\t\t\t\t\"bottom\": \"\"\n\t\t\t\t} );\n\t\t\t}\n\t\t\tif ( options.range === \"min\" || options.range === \"max\" ) {\n\t\t\t\tthis._addClass( this.range, \"ui-slider-range-\" + options.range );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( this.range ) {\n\t\t\t\tthis.range.remove();\n\t\t\t}\n\t\t\tthis.range = null;\n\t\t}\n\t},\n\n\t_setupEvents: function() {\n\t\tthis._off( this.handles );\n\t\tthis._on( this.handles, this._handleEvents );\n\t\tthis._hoverable( this.handles );\n\t\tthis._focusable( this.handles );\n\t},\n\n\t_destroy: function() {\n\t\tthis.handles.remove();\n\t\tif ( this.range ) {\n\t\t\tthis.range.remove();\n\t\t}\n\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseCapture: function( event ) {\n\t\tvar position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,\n\t\t\tthat = this,\n\t\t\to = this.options;\n\n\t\tif ( o.disabled ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.elementSize = {\n\t\t\twidth: this.element.outerWidth(),\n\t\t\theight: this.element.outerHeight()\n\t\t};\n\t\tthis.elementOffset = this.element.offset();\n\n\t\tposition = { x: event.pageX, y: event.pageY };\n\t\tnormValue = this._normValueFromMouse( position );\n\t\tdistance = this._valueMax() - this._valueMin() + 1;\n\t\tthis.handles.each( function( i ) {\n\t\t\tvar thisDistance = Math.abs( normValue - that.values( i ) );\n\t\t\tif ( ( distance > thisDistance ) ||\n\t\t\t\t( distance === thisDistance &&\n\t\t\t\t\t( i === that._lastChangedValue || that.values( i ) === o.min ) ) ) {\n\t\t\t\tdistance = thisDistance;\n\t\t\t\tclosestHandle = $( this );\n\t\t\t\tindex = i;\n\t\t\t}\n\t\t} );\n\n\t\tallowed = this._start( event, index );\n\t\tif ( allowed === false ) {\n\t\t\treturn false;\n\t\t}\n\t\tthis._mouseSliding = true;\n\n\t\tthis._handleIndex = index;\n\n\t\tthis._addClass( closestHandle, null, \"ui-state-active\" );\n\t\tclosestHandle.trigger( \"focus\" );\n\n\t\toffset = closestHandle.offset();\n\t\tmouseOverHandle = !$( event.target ).parents().addBack().is( \".ui-slider-handle\" );\n\t\tthis._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {\n\t\t\tleft: event.pageX - offset.left - ( closestHandle.width() / 2 ),\n\t\t\ttop: event.pageY - offset.top -\n\t\t\t\t( closestHandle.height() / 2 ) -\n\t\t\t\t( parseInt( closestHandle.css( \"borderTopWidth\" ), 10 ) || 0 ) -\n\t\t\t\t( parseInt( closestHandle.css( \"borderBottomWidth\" ), 10 ) || 0 ) +\n\t\t\t\t( parseInt( closestHandle.css( \"marginTop\" ), 10 ) || 0 )\n\t\t};\n\n\t\tif ( !this.handles.hasClass( \"ui-state-hover\" ) ) {\n\t\t\tthis._slide( event, index, normValue );\n\t\t}\n\t\tthis._animateOff = true;\n\t\treturn true;\n\t},\n\n\t_mouseStart: function() {\n\t\treturn true;\n\t},\n\n\t_mouseDrag: function( event ) {\n\t\tvar position = { x: event.pageX, y: event.pageY },\n\t\t\tnormValue = this._normValueFromMouse( position );\n\n\t\tthis._slide( event, this._handleIndex, normValue );\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function( event ) {\n\t\tthis._removeClass( this.handles, null, \"ui-state-active\" );\n\t\tthis._mouseSliding = false;\n\n\t\tthis._stop( event, this._handleIndex );\n\t\tthis._change( event, this._handleIndex );\n\n\t\tthis._handleIndex = null;\n\t\tthis._clickOffset = null;\n\t\tthis._animateOff = false;\n\n\t\treturn false;\n\t},\n\n\t_detectOrientation: function() {\n\t\tthis.orientation = ( this.options.orientation === \"vertical\" ) ? \"vertical\" : \"horizontal\";\n\t},\n\n\t_normValueFromMouse: function( position ) {\n\t\tvar pixelTotal,\n\t\t\tpixelMouse,\n\t\t\tpercentMouse,\n\t\t\tvalueTotal,\n\t\t\tvalueMouse;\n\n\t\tif ( this.orientation === \"horizontal\" ) {\n\t\t\tpixelTotal = this.elementSize.width;\n\t\t\tpixelMouse = position.x - this.elementOffset.left -\n\t\t\t\t( this._clickOffset ? this._clickOffset.left : 0 );\n\t\t} else {\n\t\t\tpixelTotal = this.elementSize.height;\n\t\t\tpixelMouse = position.y - this.elementOffset.top -\n\t\t\t\t( this._clickOffset ? this._clickOffset.top : 0 );\n\t\t}\n\n\t\tpercentMouse = ( pixelMouse / pixelTotal );\n\t\tif ( percentMouse > 1 ) {\n\t\t\tpercentMouse = 1;\n\t\t}\n\t\tif ( percentMouse < 0 ) {\n\t\t\tpercentMouse = 0;\n\t\t}\n\t\tif ( this.orientation === \"vertical\" ) {\n\t\t\tpercentMouse = 1 - percentMouse;\n\t\t}\n\n\t\tvalueTotal = this._valueMax() - this._valueMin();\n\t\tvalueMouse = this._valueMin() + percentMouse * valueTotal;\n\n\t\treturn this._trimAlignValue( valueMouse );\n\t},\n\n\t_uiHash: function( index, value, values ) {\n\t\tvar uiHash = {\n\t\t\thandle: this.handles[ index ],\n\t\t\thandleIndex: index,\n\t\t\tvalue: value !== undefined ? value : this.value()\n\t\t};\n\n\t\tif ( this._hasMultipleValues() ) {\n\t\t\tuiHash.value = value !== undefined ? value : this.values( index );\n\t\t\tuiHash.values = values || this.values();\n\t\t}\n\n\t\treturn uiHash;\n\t},\n\n\t_hasMultipleValues: function() {\n\t\treturn this.options.values && this.options.values.length;\n\t},\n\n\t_start: function( event, index ) {\n\t\treturn this._trigger( \"start\", event, this._uiHash( index ) );\n\t},\n\n\t_slide: function( event, index, newVal ) {\n\t\tvar allowed, otherVal,\n\t\t\tcurrentValue = this.value(),\n\t\t\tnewValues = this.values();\n\n\t\tif ( this._hasMultipleValues() ) {\n\t\t\totherVal = this.values( index ? 0 : 1 );\n\t\t\tcurrentValue = this.values( index );\n\n\t\t\tif ( this.options.values.length === 2 && this.options.range === true ) {\n\t\t\t\tnewVal =  index === 0 ? Math.min( otherVal, newVal ) : Math.max( otherVal, newVal );\n\t\t\t}\n\n\t\t\tnewValues[ index ] = newVal;\n\t\t}\n\n\t\tif ( newVal === currentValue ) {\n\t\t\treturn;\n\t\t}\n\n\t\tallowed = this._trigger( \"slide\", event, this._uiHash( index, newVal, newValues ) );\n\n\t\t// A slide can be canceled by returning false from the slide callback\n\t\tif ( allowed === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this._hasMultipleValues() ) {\n\t\t\tthis.values( index, newVal );\n\t\t} else {\n\t\t\tthis.value( newVal );\n\t\t}\n\t},\n\n\t_stop: function( event, index ) {\n\t\tthis._trigger( \"stop\", event, this._uiHash( index ) );\n\t},\n\n\t_change: function( event, index ) {\n\t\tif ( !this._keySliding && !this._mouseSliding ) {\n\n\t\t\t//store the last changed value index for reference when handles overlap\n\t\t\tthis._lastChangedValue = index;\n\t\t\tthis._trigger( \"change\", event, this._uiHash( index ) );\n\t\t}\n\t},\n\n\tvalue: function( newValue ) {\n\t\tif ( arguments.length ) {\n\t\t\tthis.options.value = this._trimAlignValue( newValue );\n\t\t\tthis._refreshValue();\n\t\t\tthis._change( null, 0 );\n\t\t\treturn;\n\t\t}\n\n\t\treturn this._value();\n\t},\n\n\tvalues: function( index, newValue ) {\n\t\tvar vals,\n\t\t\tnewValues,\n\t\t\ti;\n\n\t\tif ( arguments.length > 1 ) {\n\t\t\tthis.options.values[ index ] = this._trimAlignValue( newValue );\n\t\t\tthis._refreshValue();\n\t\t\tthis._change( null, index );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( arguments.length ) {\n\t\t\tif ( $.isArray( arguments[ 0 ] ) ) {\n\t\t\t\tvals = this.options.values;\n\t\t\t\tnewValues = arguments[ 0 ];\n\t\t\t\tfor ( i = 0; i < vals.length; i += 1 ) {\n\t\t\t\t\tvals[ i ] = this._trimAlignValue( newValues[ i ] );\n\t\t\t\t\tthis._change( null, i );\n\t\t\t\t}\n\t\t\t\tthis._refreshValue();\n\t\t\t} else {\n\t\t\t\tif ( this._hasMultipleValues() ) {\n\t\t\t\t\treturn this._values( index );\n\t\t\t\t} else {\n\t\t\t\t\treturn this.value();\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn this._values();\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar i,\n\t\t\tvalsLength = 0;\n\n\t\tif ( key === \"range\" && this.options.range === true ) {\n\t\t\tif ( value === \"min\" ) {\n\t\t\t\tthis.options.value = this._values( 0 );\n\t\t\t\tthis.options.values = null;\n\t\t\t} else if ( value === \"max\" ) {\n\t\t\t\tthis.options.value = this._values( this.options.values.length - 1 );\n\t\t\t\tthis.options.values = null;\n\t\t\t}\n\t\t}\n\n\t\tif ( $.isArray( this.options.values ) ) {\n\t\t\tvalsLength = this.options.values.length;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tswitch ( key ) {\n\t\t\tcase \"orientation\":\n\t\t\t\tthis._detectOrientation();\n\t\t\t\tthis._removeClass( \"ui-slider-horizontal ui-slider-vertical\" )\n\t\t\t\t\t._addClass( \"ui-slider-\" + this.orientation );\n\t\t\t\tthis._refreshValue();\n\t\t\t\tif ( this.options.range ) {\n\t\t\t\t\tthis._refreshRange( value );\n\t\t\t\t}\n\n\t\t\t\t// Reset positioning from previous orientation\n\t\t\t\tthis.handles.css( value === \"horizontal\" ? \"bottom\" : \"left\", \"\" );\n\t\t\t\tbreak;\n\t\t\tcase \"value\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refreshValue();\n\t\t\t\tthis._change( null, 0 );\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"values\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refreshValue();\n\n\t\t\t\t// Start from the last handle to prevent unreachable handles (#9046)\n\t\t\t\tfor ( i = valsLength - 1; i >= 0; i-- ) {\n\t\t\t\t\tthis._change( null, i );\n\t\t\t\t}\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"step\":\n\t\t\tcase \"min\":\n\t\t\tcase \"max\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._calculateNewMax();\n\t\t\t\tthis._refreshValue();\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"range\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refresh();\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis._toggleClass( null, \"ui-state-disabled\", !!value );\n\t},\n\n\t//internal value getter\n\t// _value() returns value trimmed by min and max, aligned by step\n\t_value: function() {\n\t\tvar val = this.options.value;\n\t\tval = this._trimAlignValue( val );\n\n\t\treturn val;\n\t},\n\n\t//internal values getter\n\t// _values() returns array of values trimmed by min and max, aligned by step\n\t// _values( index ) returns single value trimmed by min and max, aligned by step\n\t_values: function( index ) {\n\t\tvar val,\n\t\t\tvals,\n\t\t\ti;\n\n\t\tif ( arguments.length ) {\n\t\t\tval = this.options.values[ index ];\n\t\t\tval = this._trimAlignValue( val );\n\n\t\t\treturn val;\n\t\t} else if ( this._hasMultipleValues() ) {\n\n\t\t\t// .slice() creates a copy of the array\n\t\t\t// this copy gets trimmed by min and max and then returned\n\t\t\tvals = this.options.values.slice();\n\t\t\tfor ( i = 0; i < vals.length; i += 1 ) {\n\t\t\t\tvals[ i ] = this._trimAlignValue( vals[ i ] );\n\t\t\t}\n\n\t\t\treturn vals;\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t},\n\n\t// Returns the step-aligned value that val is closest to, between (inclusive) min and max\n\t_trimAlignValue: function( val ) {\n\t\tif ( val <= this._valueMin() ) {\n\t\t\treturn this._valueMin();\n\t\t}\n\t\tif ( val >= this._valueMax() ) {\n\t\t\treturn this._valueMax();\n\t\t}\n\t\tvar step = ( this.options.step > 0 ) ? this.options.step : 1,\n\t\t\tvalModStep = ( val - this._valueMin() ) % step,\n\t\t\talignValue = val - valModStep;\n\n\t\tif ( Math.abs( valModStep ) * 2 >= step ) {\n\t\t\talignValue += ( valModStep > 0 ) ? step : ( -step );\n\t\t}\n\n\t\t// Since JavaScript has problems with large floats, round\n\t\t// the final value to 5 digits after the decimal point (see #4124)\n\t\treturn parseFloat( alignValue.toFixed( 5 ) );\n\t},\n\n\t_calculateNewMax: function() {\n\t\tvar max = this.options.max,\n\t\t\tmin = this._valueMin(),\n\t\t\tstep = this.options.step,\n\t\t\taboveMin = Math.round( ( max - min ) / step ) * step;\n\t\tmax = aboveMin + min;\n\t\tif ( max > this.options.max ) {\n\n\t\t\t//If max is not divisible by step, rounding off may increase its value\n\t\t\tmax -= step;\n\t\t}\n\t\tthis.max = parseFloat( max.toFixed( this._precision() ) );\n\t},\n\n\t_precision: function() {\n\t\tvar precision = this._precisionOf( this.options.step );\n\t\tif ( this.options.min !== null ) {\n\t\t\tprecision = Math.max( precision, this._precisionOf( this.options.min ) );\n\t\t}\n\t\treturn precision;\n\t},\n\n\t_precisionOf: function( num ) {\n\t\tvar str = num.toString(),\n\t\t\tdecimal = str.indexOf( \".\" );\n\t\treturn decimal === -1 ? 0 : str.length - decimal - 1;\n\t},\n\n\t_valueMin: function() {\n\t\treturn this.options.min;\n\t},\n\n\t_valueMax: function() {\n\t\treturn this.max;\n\t},\n\n\t_refreshRange: function( orientation ) {\n\t\tif ( orientation === \"vertical\" ) {\n\t\t\tthis.range.css( { \"width\": \"\", \"left\": \"\" } );\n\t\t}\n\t\tif ( orientation === \"horizontal\" ) {\n\t\t\tthis.range.css( { \"height\": \"\", \"bottom\": \"\" } );\n\t\t}\n\t},\n\n\t_refreshValue: function() {\n\t\tvar lastValPercent, valPercent, value, valueMin, valueMax,\n\t\t\toRange = this.options.range,\n\t\t\to = this.options,\n\t\t\tthat = this,\n\t\t\tanimate = ( !this._animateOff ) ? o.animate : false,\n\t\t\t_set = {};\n\n\t\tif ( this._hasMultipleValues() ) {\n\t\t\tthis.handles.each( function( i ) {\n\t\t\t\tvalPercent = ( that.values( i ) - that._valueMin() ) / ( that._valueMax() -\n\t\t\t\t\tthat._valueMin() ) * 100;\n\t\t\t\t_set[ that.orientation === \"horizontal\" ? \"left\" : \"bottom\" ] = valPercent + \"%\";\n\t\t\t\t$( this ).stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( _set, o.animate );\n\t\t\t\tif ( that.options.range === true ) {\n\t\t\t\t\tif ( that.orientation === \"horizontal\" ) {\n\t\t\t\t\t\tif ( i === 0 ) {\n\t\t\t\t\t\t\tthat.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\t\t\t\tleft: valPercent + \"%\"\n\t\t\t\t\t\t\t}, o.animate );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( i === 1 ) {\n\t\t\t\t\t\t\tthat.range[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\t\t\t\twidth: ( valPercent - lastValPercent ) + \"%\"\n\t\t\t\t\t\t\t}, {\n\t\t\t\t\t\t\t\tqueue: false,\n\t\t\t\t\t\t\t\tduration: o.animate\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( i === 0 ) {\n\t\t\t\t\t\t\tthat.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\t\t\t\tbottom: ( valPercent ) + \"%\"\n\t\t\t\t\t\t\t}, o.animate );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( i === 1 ) {\n\t\t\t\t\t\t\tthat.range[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\t\t\t\theight: ( valPercent - lastValPercent ) + \"%\"\n\t\t\t\t\t\t\t}, {\n\t\t\t\t\t\t\t\tqueue: false,\n\t\t\t\t\t\t\t\tduration: o.animate\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlastValPercent = valPercent;\n\t\t\t} );\n\t\t} else {\n\t\t\tvalue = this.value();\n\t\t\tvalueMin = this._valueMin();\n\t\t\tvalueMax = this._valueMax();\n\t\t\tvalPercent = ( valueMax !== valueMin ) ?\n\t\t\t\t\t( value - valueMin ) / ( valueMax - valueMin ) * 100 :\n\t\t\t\t\t0;\n\t\t\t_set[ this.orientation === \"horizontal\" ? \"left\" : \"bottom\" ] = valPercent + \"%\";\n\t\t\tthis.handle.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( _set, o.animate );\n\n\t\t\tif ( oRange === \"min\" && this.orientation === \"horizontal\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\twidth: valPercent + \"%\"\n\t\t\t\t}, o.animate );\n\t\t\t}\n\t\t\tif ( oRange === \"max\" && this.orientation === \"horizontal\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\twidth: ( 100 - valPercent ) + \"%\"\n\t\t\t\t}, o.animate );\n\t\t\t}\n\t\t\tif ( oRange === \"min\" && this.orientation === \"vertical\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\theight: valPercent + \"%\"\n\t\t\t\t}, o.animate );\n\t\t\t}\n\t\t\tif ( oRange === \"max\" && this.orientation === \"vertical\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\theight: ( 100 - valPercent ) + \"%\"\n\t\t\t\t}, o.animate );\n\t\t\t}\n\t\t}\n\t},\n\n\t_handleEvents: {\n\t\tkeydown: function( event ) {\n\t\t\tvar allowed, curVal, newVal, step,\n\t\t\t\tindex = $( event.target ).data( \"ui-slider-handle-index\" );\n\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\tcase $.ui.keyCode.END:\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tif ( !this._keySliding ) {\n\t\t\t\t\t\tthis._keySliding = true;\n\t\t\t\t\t\tthis._addClass( $( event.target ), null, \"ui-state-active\" );\n\t\t\t\t\t\tallowed = this._start( event, index );\n\t\t\t\t\t\tif ( allowed === false ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tstep = this.options.step;\n\t\t\tif ( this._hasMultipleValues() ) {\n\t\t\t\tcurVal = newVal = this.values( index );\n\t\t\t} else {\n\t\t\t\tcurVal = newVal = this.value();\n\t\t\t}\n\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\t\tnewVal = this._valueMin();\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.END:\n\t\t\t\t\tnewVal = this._valueMax();\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\t\tnewVal = this._trimAlignValue(\n\t\t\t\t\t\tcurVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\t\tnewVal = this._trimAlignValue(\n\t\t\t\t\t\tcurVal - ( ( this._valueMax() - this._valueMin() ) / this.numPages ) );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\t\tif ( curVal === this._valueMax() ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal + step );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\t\tif ( curVal === this._valueMin() ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal - step );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis._slide( event, index, newVal );\n\t\t},\n\t\tkeyup: function( event ) {\n\t\t\tvar index = $( event.target ).data( \"ui-slider-handle-index\" );\n\n\t\t\tif ( this._keySliding ) {\n\t\t\t\tthis._keySliding = false;\n\t\t\t\tthis._stop( event, index );\n\t\t\t\tthis._change( event, index );\n\t\t\t\tthis._removeClass( $( event.target ), null, \"ui-state-active\" );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n\n/*!\n * jQuery UI Spinner 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Spinner\n//>>group: Widgets\n//>>description: Displays buttons to easily input numbers via the keyboard or mouse.\n//>>docs: http://api.jqueryui.com/spinner/\n//>>demos: http://jqueryui.com/spinner/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/spinner.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\nfunction spinnerModifer( fn ) {\n\treturn function() {\n\t\tvar previous = this.element.val();\n\t\tfn.apply( this, arguments );\n\t\tthis._refresh();\n\t\tif ( previous !== this.element.val() ) {\n\t\t\tthis._trigger( \"change\" );\n\t\t}\n\t};\n}\n\n$.widget( \"ui.spinner\", {\n\tversion: \"1.12.1\",\n\tdefaultElement: \"<input>\",\n\twidgetEventPrefix: \"spin\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-spinner\": \"ui-corner-all\",\n\t\t\t\"ui-spinner-down\": \"ui-corner-br\",\n\t\t\t\"ui-spinner-up\": \"ui-corner-tr\"\n\t\t},\n\t\tculture: null,\n\t\ticons: {\n\t\t\tdown: \"ui-icon-triangle-1-s\",\n\t\t\tup: \"ui-icon-triangle-1-n\"\n\t\t},\n\t\tincremental: true,\n\t\tmax: null,\n\t\tmin: null,\n\t\tnumberFormat: null,\n\t\tpage: 10,\n\t\tstep: 1,\n\n\t\tchange: null,\n\t\tspin: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t_create: function() {\n\n\t\t// handle string values that need to be parsed\n\t\tthis._setOption( \"max\", this.options.max );\n\t\tthis._setOption( \"min\", this.options.min );\n\t\tthis._setOption( \"step\", this.options.step );\n\n\t\t// Only format if there is a value, prevents the field from being marked\n\t\t// as invalid in Firefox, see #9573.\n\t\tif ( this.value() !== \"\" ) {\n\n\t\t\t// Format the value, but don't constrain.\n\t\t\tthis._value( this.element.val(), true );\n\t\t}\n\n\t\tthis._draw();\n\t\tthis._on( this._events );\n\t\tthis._refresh();\n\n\t\t// Turning off autocomplete prevents the browser from remembering the\n\t\t// value when navigating through history, so we re-enable autocomplete\n\t\t// if the page is unloaded before the widget is destroyed. #7790\n\t\tthis._on( this.window, {\n\t\t\tbeforeunload: function() {\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar options = this._super();\n\t\tvar element = this.element;\n\n\t\t$.each( [ \"min\", \"max\", \"step\" ], function( i, option ) {\n\t\t\tvar value = element.attr( option );\n\t\t\tif ( value != null && value.length ) {\n\t\t\t\toptions[ option ] = value;\n\t\t\t}\n\t\t} );\n\n\t\treturn options;\n\t},\n\n\t_events: {\n\t\tkeydown: function( event ) {\n\t\t\tif ( this._start( event ) && this._keydown( event ) ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t},\n\t\tkeyup: \"_stop\",\n\t\tfocus: function() {\n\t\t\tthis.previous = this.element.val();\n\t\t},\n\t\tblur: function( event ) {\n\t\t\tif ( this.cancelBlur ) {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._stop();\n\t\t\tthis._refresh();\n\t\t\tif ( this.previous !== this.element.val() ) {\n\t\t\t\tthis._trigger( \"change\", event );\n\t\t\t}\n\t\t},\n\t\tmousewheel: function( event, delta ) {\n\t\t\tif ( !delta ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( !this.spinning && !this._start( event ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis._spin( ( delta > 0 ? 1 : -1 ) * this.options.step, event );\n\t\t\tclearTimeout( this.mousewheelTimer );\n\t\t\tthis.mousewheelTimer = this._delay( function() {\n\t\t\t\tif ( this.spinning ) {\n\t\t\t\t\tthis._stop( event );\n\t\t\t\t}\n\t\t\t}, 100 );\n\t\t\tevent.preventDefault();\n\t\t},\n\t\t\"mousedown .ui-spinner-button\": function( event ) {\n\t\t\tvar previous;\n\n\t\t\t// We never want the buttons to have focus; whenever the user is\n\t\t\t// interacting with the spinner, the focus should be on the input.\n\t\t\t// If the input is focused then this.previous is properly set from\n\t\t\t// when the input first received focus. If the input is not focused\n\t\t\t// then we need to set this.previous based on the value before spinning.\n\t\t\tprevious = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] ) ?\n\t\t\t\tthis.previous : this.element.val();\n\t\t\tfunction checkFocus() {\n\t\t\t\tvar isActive = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] );\n\t\t\t\tif ( !isActive ) {\n\t\t\t\t\tthis.element.trigger( \"focus\" );\n\t\t\t\t\tthis.previous = previous;\n\n\t\t\t\t\t// support: IE\n\t\t\t\t\t// IE sets focus asynchronously, so we need to check if focus\n\t\t\t\t\t// moved off of the input because the user clicked on the button.\n\t\t\t\t\tthis._delay( function() {\n\t\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Ensure focus is on (or stays on) the text field\n\t\t\tevent.preventDefault();\n\t\t\tcheckFocus.call( this );\n\n\t\t\t// Support: IE\n\t\t\t// IE doesn't prevent moving focus even with event.preventDefault()\n\t\t\t// so we set a flag to know when we should ignore the blur event\n\t\t\t// and check (again) if focus moved off of the input.\n\t\t\tthis.cancelBlur = true;\n\t\t\tthis._delay( function() {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\tcheckFocus.call( this );\n\t\t\t} );\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._repeat( null, $( event.currentTarget )\n\t\t\t\t.hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\t\t\"mouseup .ui-spinner-button\": \"_stop\",\n\t\t\"mouseenter .ui-spinner-button\": function( event ) {\n\n\t\t\t// button will add ui-state-active if mouse was down while mouseleave and kept down\n\t\t\tif ( !$( event.currentTarget ).hasClass( \"ui-state-active\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis._repeat( null, $( event.currentTarget )\n\t\t\t\t.hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\n\t\t// TODO: do we really want to consider this a stop?\n\t\t// shouldn't we just stop the repeater and wait until mouseup before\n\t\t// we trigger the stop event?\n\t\t\"mouseleave .ui-spinner-button\": \"_stop\"\n\t},\n\n\t// Support mobile enhanced option and make backcompat more sane\n\t_enhance: function() {\n\t\tthis.uiSpinner = this.element\n\t\t\t.attr( \"autocomplete\", \"off\" )\n\t\t\t.wrap( \"<span>\" )\n\t\t\t.parent()\n\n\t\t\t\t// Add buttons\n\t\t\t\t.append(\n\t\t\t\t\t\"<a></a><a></a>\"\n\t\t\t\t);\n\t},\n\n\t_draw: function() {\n\t\tthis._enhance();\n\n\t\tthis._addClass( this.uiSpinner, \"ui-spinner\", \"ui-widget ui-widget-content\" );\n\t\tthis._addClass( \"ui-spinner-input\" );\n\n\t\tthis.element.attr( \"role\", \"spinbutton\" );\n\n\t\t// Button bindings\n\t\tthis.buttons = this.uiSpinner.children( \"a\" )\n\t\t\t.attr( \"tabIndex\", -1 )\n\t\t\t.attr( \"aria-hidden\", true )\n\t\t\t.button( {\n\t\t\t\tclasses: {\n\t\t\t\t\t\"ui-button\": \"\"\n\t\t\t\t}\n\t\t\t} );\n\n\t\t// TODO: Right now button does not support classes this is already updated in button PR\n\t\tthis._removeClass( this.buttons, \"ui-corner-all\" );\n\n\t\tthis._addClass( this.buttons.first(), \"ui-spinner-button ui-spinner-up\" );\n\t\tthis._addClass( this.buttons.last(), \"ui-spinner-button ui-spinner-down\" );\n\t\tthis.buttons.first().button( {\n\t\t\t\"icon\": this.options.icons.up,\n\t\t\t\"showLabel\": false\n\t\t} );\n\t\tthis.buttons.last().button( {\n\t\t\t\"icon\": this.options.icons.down,\n\t\t\t\"showLabel\": false\n\t\t} );\n\n\t\t// IE 6 doesn't understand height: 50% for the buttons\n\t\t// unless the wrapper has an explicit height\n\t\tif ( this.buttons.height() > Math.ceil( this.uiSpinner.height() * 0.5 ) &&\n\t\t\t\tthis.uiSpinner.height() > 0 ) {\n\t\t\tthis.uiSpinner.height( this.uiSpinner.height() );\n\t\t}\n\t},\n\n\t_keydown: function( event ) {\n\t\tvar options = this.options,\n\t\t\tkeyCode = $.ui.keyCode;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase keyCode.UP:\n\t\t\tthis._repeat( null, 1, event );\n\t\t\treturn true;\n\t\tcase keyCode.DOWN:\n\t\t\tthis._repeat( null, -1, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_UP:\n\t\t\tthis._repeat( null, options.page, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_DOWN:\n\t\t\tthis._repeat( null, -options.page, event );\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_start: function( event ) {\n\t\tif ( !this.spinning && this._trigger( \"start\", event ) === false ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\t\tthis.spinning = true;\n\t\treturn true;\n\t},\n\n\t_repeat: function( i, steps, event ) {\n\t\ti = i || 500;\n\n\t\tclearTimeout( this.timer );\n\t\tthis.timer = this._delay( function() {\n\t\t\tthis._repeat( 40, steps, event );\n\t\t}, i );\n\n\t\tthis._spin( steps * this.options.step, event );\n\t},\n\n\t_spin: function( step, event ) {\n\t\tvar value = this.value() || 0;\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\n\t\tvalue = this._adjustValue( value + step * this._increment( this.counter ) );\n\n\t\tif ( !this.spinning || this._trigger( \"spin\", event, { value: value } ) !== false ) {\n\t\t\tthis._value( value );\n\t\t\tthis.counter++;\n\t\t}\n\t},\n\n\t_increment: function( i ) {\n\t\tvar incremental = this.options.incremental;\n\n\t\tif ( incremental ) {\n\t\t\treturn $.isFunction( incremental ) ?\n\t\t\t\tincremental( i ) :\n\t\t\t\tMath.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );\n\t\t}\n\n\t\treturn 1;\n\t},\n\n\t_precision: function() {\n\t\tvar precision = this._precisionOf( this.options.step );\n\t\tif ( this.options.min !== null ) {\n\t\t\tprecision = Math.max( precision, this._precisionOf( this.options.min ) );\n\t\t}\n\t\treturn precision;\n\t},\n\n\t_precisionOf: function( num ) {\n\t\tvar str = num.toString(),\n\t\t\tdecimal = str.indexOf( \".\" );\n\t\treturn decimal === -1 ? 0 : str.length - decimal - 1;\n\t},\n\n\t_adjustValue: function( value ) {\n\t\tvar base, aboveMin,\n\t\t\toptions = this.options;\n\n\t\t// Make sure we're at a valid step\n\t\t// - find out where we are relative to the base (min or 0)\n\t\tbase = options.min !== null ? options.min : 0;\n\t\taboveMin = value - base;\n\n\t\t// - round to the nearest step\n\t\taboveMin = Math.round( aboveMin / options.step ) * options.step;\n\n\t\t// - rounding is based on 0, so adjust back to our base\n\t\tvalue = base + aboveMin;\n\n\t\t// Fix precision from bad JS floating point math\n\t\tvalue = parseFloat( value.toFixed( this._precision() ) );\n\n\t\t// Clamp the value\n\t\tif ( options.max !== null && value > options.max ) {\n\t\t\treturn options.max;\n\t\t}\n\t\tif ( options.min !== null && value < options.min ) {\n\t\t\treturn options.min;\n\t\t}\n\n\t\treturn value;\n\t},\n\n\t_stop: function( event ) {\n\t\tif ( !this.spinning ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( this.timer );\n\t\tclearTimeout( this.mousewheelTimer );\n\t\tthis.counter = 0;\n\t\tthis.spinning = false;\n\t\tthis._trigger( \"stop\", event );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar prevValue, first, last;\n\n\t\tif ( key === \"culture\" || key === \"numberFormat\" ) {\n\t\t\tprevValue = this._parse( this.element.val() );\n\t\t\tthis.options[ key ] = value;\n\t\t\tthis.element.val( this._format( prevValue ) );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"max\" || key === \"min\" || key === \"step\" ) {\n\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\tvalue = this._parse( value );\n\t\t\t}\n\t\t}\n\t\tif ( key === \"icons\" ) {\n\t\t\tfirst = this.buttons.first().find( \".ui-icon\" );\n\t\t\tthis._removeClass( first, null, this.options.icons.up );\n\t\t\tthis._addClass( first, null, value.up );\n\t\t\tlast = this.buttons.last().find( \".ui-icon\" );\n\t\t\tthis._removeClass( last, null, this.options.icons.down );\n\t\t\tthis._addClass( last, null, value.down );\n\t\t}\n\n\t\tthis._super( key, value );\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis._toggleClass( this.uiSpinner, null, \"ui-state-disabled\", !!value );\n\t\tthis.element.prop( \"disabled\", !!value );\n\t\tthis.buttons.button( value ? \"disable\" : \"enable\" );\n\t},\n\n\t_setOptions: spinnerModifer( function( options ) {\n\t\tthis._super( options );\n\t} ),\n\n\t_parse: function( val ) {\n\t\tif ( typeof val === \"string\" && val !== \"\" ) {\n\t\t\tval = window.Globalize && this.options.numberFormat ?\n\t\t\t\tGlobalize.parseFloat( val, 10, this.options.culture ) : +val;\n\t\t}\n\t\treturn val === \"\" || isNaN( val ) ? null : val;\n\t},\n\n\t_format: function( value ) {\n\t\tif ( value === \"\" ) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn window.Globalize && this.options.numberFormat ?\n\t\t\tGlobalize.format( value, this.options.numberFormat, this.options.culture ) :\n\t\t\tvalue;\n\t},\n\n\t_refresh: function() {\n\t\tthis.element.attr( {\n\t\t\t\"aria-valuemin\": this.options.min,\n\t\t\t\"aria-valuemax\": this.options.max,\n\n\t\t\t// TODO: what should we do with values that can't be parsed?\n\t\t\t\"aria-valuenow\": this._parse( this.element.val() )\n\t\t} );\n\t},\n\n\tisValid: function() {\n\t\tvar value = this.value();\n\n\t\t// Null is invalid\n\t\tif ( value === null ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If value gets adjusted, it's invalid\n\t\treturn value === this._adjustValue( value );\n\t},\n\n\t// Update the value without triggering change\n\t_value: function( value, allowAny ) {\n\t\tvar parsed;\n\t\tif ( value !== \"\" ) {\n\t\t\tparsed = this._parse( value );\n\t\t\tif ( parsed !== null ) {\n\t\t\t\tif ( !allowAny ) {\n\t\t\t\t\tparsed = this._adjustValue( parsed );\n\t\t\t\t}\n\t\t\t\tvalue = this._format( parsed );\n\t\t\t}\n\t\t}\n\t\tthis.element.val( value );\n\t\tthis._refresh();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.prop( \"disabled\", false )\n\t\t\t.removeAttr( \"autocomplete role aria-valuemin aria-valuemax aria-valuenow\" );\n\n\t\tthis.uiSpinner.replaceWith( this.element );\n\t},\n\n\tstepUp: spinnerModifer( function( steps ) {\n\t\tthis._stepUp( steps );\n\t} ),\n\t_stepUp: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( ( steps || 1 ) * this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tstepDown: spinnerModifer( function( steps ) {\n\t\tthis._stepDown( steps );\n\t} ),\n\t_stepDown: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( ( steps || 1 ) * -this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tpageUp: spinnerModifer( function( pages ) {\n\t\tthis._stepUp( ( pages || 1 ) * this.options.page );\n\t} ),\n\n\tpageDown: spinnerModifer( function( pages ) {\n\t\tthis._stepDown( ( pages || 1 ) * this.options.page );\n\t} ),\n\n\tvalue: function( newVal ) {\n\t\tif ( !arguments.length ) {\n\t\t\treturn this._parse( this.element.val() );\n\t\t}\n\t\tspinnerModifer( this._value ).call( this, newVal );\n\t},\n\n\twidget: function() {\n\t\treturn this.uiSpinner;\n\t}\n} );\n\n// DEPRECATED\n// TODO: switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for spinner html extension points\n\t$.widget( \"ui.spinner\", $.ui.spinner, {\n\t\t_enhance: function() {\n\t\t\tthis.uiSpinner = this.element\n\t\t\t\t.attr( \"autocomplete\", \"off\" )\n\t\t\t\t.wrap( this._uiSpinnerHtml() )\n\t\t\t\t.parent()\n\n\t\t\t\t\t// Add buttons\n\t\t\t\t\t.append( this._buttonHtml() );\n\t\t},\n\t\t_uiSpinnerHtml: function() {\n\t\t\treturn \"<span>\";\n\t\t},\n\n\t\t_buttonHtml: function() {\n\t\t\treturn \"<a></a><a></a>\";\n\t\t}\n\t} );\n}\n\nvar widgetsSpinner = $.ui.spinner;\n\n\n/*!\n * jQuery UI Tabs 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Tabs\n//>>group: Widgets\n//>>description: Transforms a set of container elements into a tab structure.\n//>>docs: http://api.jqueryui.com/tabs/\n//>>demos: http://jqueryui.com/tabs/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/tabs.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.tabs\", {\n\tversion: \"1.12.1\",\n\tdelay: 300,\n\toptions: {\n\t\tactive: null,\n\t\tclasses: {\n\t\t\t\"ui-tabs\": \"ui-corner-all\",\n\t\t\t\"ui-tabs-nav\": \"ui-corner-all\",\n\t\t\t\"ui-tabs-panel\": \"ui-corner-bottom\",\n\t\t\t\"ui-tabs-tab\": \"ui-corner-top\"\n\t\t},\n\t\tcollapsible: false,\n\t\tevent: \"click\",\n\t\theightStyle: \"content\",\n\t\thide: null,\n\t\tshow: null,\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tbeforeActivate: null,\n\t\tbeforeLoad: null,\n\t\tload: null\n\t},\n\n\t_isLocal: ( function() {\n\t\tvar rhash = /#.*$/;\n\n\t\treturn function( anchor ) {\n\t\t\tvar anchorUrl, locationUrl;\n\n\t\t\tanchorUrl = anchor.href.replace( rhash, \"\" );\n\t\t\tlocationUrl = location.href.replace( rhash, \"\" );\n\n\t\t\t// Decoding may throw an error if the URL isn't UTF-8 (#9518)\n\t\t\ttry {\n\t\t\t\tanchorUrl = decodeURIComponent( anchorUrl );\n\t\t\t} catch ( error ) {}\n\t\t\ttry {\n\t\t\t\tlocationUrl = decodeURIComponent( locationUrl );\n\t\t\t} catch ( error ) {}\n\n\t\t\treturn anchor.hash.length > 1 && anchorUrl === locationUrl;\n\t\t};\n\t} )(),\n\n\t_create: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tthis.running = false;\n\n\t\tthis._addClass( \"ui-tabs\", \"ui-widget ui-widget-content\" );\n\t\tthis._toggleClass( \"ui-tabs-collapsible\", null, options.collapsible );\n\n\t\tthis._processTabs();\n\t\toptions.active = this._initialActive();\n\n\t\t// Take disabling tabs via class attribute from HTML\n\t\t// into account and update option properly.\n\t\tif ( $.isArray( options.disabled ) ) {\n\t\t\toptions.disabled = $.unique( options.disabled.concat(\n\t\t\t\t$.map( this.tabs.filter( \".ui-state-disabled\" ), function( li ) {\n\t\t\t\t\treturn that.tabs.index( li );\n\t\t\t\t} )\n\t\t\t) ).sort();\n\t\t}\n\n\t\t// Check for length avoids error when initializing empty list\n\t\tif ( this.options.active !== false && this.anchors.length ) {\n\t\t\tthis.active = this._findActive( options.active );\n\t\t} else {\n\t\t\tthis.active = $();\n\t\t}\n\n\t\tthis._refresh();\n\n\t\tif ( this.active.length ) {\n\t\t\tthis.load( options.active );\n\t\t}\n\t},\n\n\t_initialActive: function() {\n\t\tvar active = this.options.active,\n\t\t\tcollapsible = this.options.collapsible,\n\t\t\tlocationHash = location.hash.substring( 1 );\n\n\t\tif ( active === null ) {\n\n\t\t\t// check the fragment identifier in the URL\n\t\t\tif ( locationHash ) {\n\t\t\t\tthis.tabs.each( function( i, tab ) {\n\t\t\t\t\tif ( $( tab ).attr( \"aria-controls\" ) === locationHash ) {\n\t\t\t\t\t\tactive = i;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// Check for a tab marked active via a class\n\t\t\tif ( active === null ) {\n\t\t\t\tactive = this.tabs.index( this.tabs.filter( \".ui-tabs-active\" ) );\n\t\t\t}\n\n\t\t\t// No active tab, set to false\n\t\t\tif ( active === null || active === -1 ) {\n\t\t\t\tactive = this.tabs.length ? 0 : false;\n\t\t\t}\n\t\t}\n\n\t\t// Handle numbers: negative, out of range\n\t\tif ( active !== false ) {\n\t\t\tactive = this.tabs.index( this.tabs.eq( active ) );\n\t\t\tif ( active === -1 ) {\n\t\t\t\tactive = collapsible ? false : 0;\n\t\t\t}\n\t\t}\n\n\t\t// Don't allow collapsible: false and active: false\n\t\tif ( !collapsible && active === false && this.anchors.length ) {\n\t\t\tactive = 0;\n\t\t}\n\n\t\treturn active;\n\t},\n\n\t_getCreateEventData: function() {\n\t\treturn {\n\t\t\ttab: this.active,\n\t\t\tpanel: !this.active.length ? $() : this._getPanelForTab( this.active )\n\t\t};\n\t},\n\n\t_tabKeydown: function( event ) {\n\t\tvar focusedTab = $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( \"li\" ),\n\t\t\tselectedIndex = this.tabs.index( focusedTab ),\n\t\t\tgoingForward = true;\n\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase $.ui.keyCode.RIGHT:\n\t\tcase $.ui.keyCode.DOWN:\n\t\t\tselectedIndex++;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.UP:\n\t\tcase $.ui.keyCode.LEFT:\n\t\t\tgoingForward = false;\n\t\t\tselectedIndex--;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.END:\n\t\t\tselectedIndex = this.anchors.length - 1;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.HOME:\n\t\t\tselectedIndex = 0;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.SPACE:\n\n\t\t\t// Activate only, no collapsing\n\t\t\tevent.preventDefault();\n\t\t\tclearTimeout( this.activating );\n\t\t\tthis._activate( selectedIndex );\n\t\t\treturn;\n\t\tcase $.ui.keyCode.ENTER:\n\n\t\t\t// Toggle (cancel delayed activation, allow collapsing)\n\t\t\tevent.preventDefault();\n\t\t\tclearTimeout( this.activating );\n\n\t\t\t// Determine if we should collapse or activate\n\t\t\tthis._activate( selectedIndex === this.options.active ? false : selectedIndex );\n\t\t\treturn;\n\t\tdefault:\n\t\t\treturn;\n\t\t}\n\n\t\t// Focus the appropriate tab, based on which key was pressed\n\t\tevent.preventDefault();\n\t\tclearTimeout( this.activating );\n\t\tselectedIndex = this._focusNextTab( selectedIndex, goingForward );\n\n\t\t// Navigating with control/command key will prevent automatic activation\n\t\tif ( !event.ctrlKey && !event.metaKey ) {\n\n\t\t\t// Update aria-selected immediately so that AT think the tab is already selected.\n\t\t\t// Otherwise AT may confuse the user by stating that they need to activate the tab,\n\t\t\t// but the tab will already be activated by the time the announcement finishes.\n\t\t\tfocusedTab.attr( \"aria-selected\", \"false\" );\n\t\t\tthis.tabs.eq( selectedIndex ).attr( \"aria-selected\", \"true\" );\n\n\t\t\tthis.activating = this._delay( function() {\n\t\t\t\tthis.option( \"active\", selectedIndex );\n\t\t\t}, this.delay );\n\t\t}\n\t},\n\n\t_panelKeydown: function( event ) {\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+up moves focus to the current tab\n\t\tif ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.active.trigger( \"focus\" );\n\t\t}\n\t},\n\n\t// Alt+page up/down moves focus to the previous/next tab (and activates)\n\t_handlePageNav: function( event ) {\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active - 1, false ) );\n\t\t\treturn true;\n\t\t}\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active + 1, true ) );\n\t\t\treturn true;\n\t\t}\n\t},\n\n\t_findNextTab: function( index, goingForward ) {\n\t\tvar lastTabIndex = this.tabs.length - 1;\n\n\t\tfunction constrain() {\n\t\t\tif ( index > lastTabIndex ) {\n\t\t\t\tindex = 0;\n\t\t\t}\n\t\t\tif ( index < 0 ) {\n\t\t\t\tindex = lastTabIndex;\n\t\t\t}\n\t\t\treturn index;\n\t\t}\n\n\t\twhile ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {\n\t\t\tindex = goingForward ? index + 1 : index - 1;\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_focusNextTab: function( index, goingForward ) {\n\t\tindex = this._findNextTab( index, goingForward );\n\t\tthis.tabs.eq( index ).trigger( \"focus\" );\n\t\treturn index;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"active\" ) {\n\n\t\t\t// _activate() will handle invalid values and update this.options\n\t\t\tthis._activate( value );\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"collapsible\" ) {\n\t\t\tthis._toggleClass( \"ui-tabs-collapsible\", null, value );\n\n\t\t\t// Setting collapsible: false while collapsed; open first panel\n\t\t\tif ( !value && this.options.active === false ) {\n\t\t\t\tthis._activate( 0 );\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"event\" ) {\n\t\t\tthis._setupEvents( value );\n\t\t}\n\n\t\tif ( key === \"heightStyle\" ) {\n\t\t\tthis._setupHeightStyle( value );\n\t\t}\n\t},\n\n\t_sanitizeSelector: function( hash ) {\n\t\treturn hash ? hash.replace( /[!\"$%&'()*+,.\\/:;<=>?@\\[\\]\\^`{|}~]/g, \"\\\\$&\" ) : \"\";\n\t},\n\n\trefresh: function() {\n\t\tvar options = this.options,\n\t\t\tlis = this.tablist.children( \":has(a[href])\" );\n\n\t\t// Get disabled tabs from class attribute from HTML\n\t\t// this will get converted to a boolean if needed in _refresh()\n\t\toptions.disabled = $.map( lis.filter( \".ui-state-disabled\" ), function( tab ) {\n\t\t\treturn lis.index( tab );\n\t\t} );\n\n\t\tthis._processTabs();\n\n\t\t// Was collapsed or no tabs\n\t\tif ( options.active === false || !this.anchors.length ) {\n\t\t\toptions.active = false;\n\t\t\tthis.active = $();\n\n\t\t// was active, but active tab is gone\n\t\t} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {\n\n\t\t\t// all remaining tabs are disabled\n\t\t\tif ( this.tabs.length === options.disabled.length ) {\n\t\t\t\toptions.active = false;\n\t\t\t\tthis.active = $();\n\n\t\t\t// activate previous tab\n\t\t\t} else {\n\t\t\t\tthis._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );\n\t\t\t}\n\n\t\t// was active, active tab still exists\n\t\t} else {\n\n\t\t\t// make sure active index is correct\n\t\t\toptions.active = this.tabs.index( this.active );\n\t\t}\n\n\t\tthis._refresh();\n\t},\n\n\t_refresh: function() {\n\t\tthis._setOptionDisabled( this.options.disabled );\n\t\tthis._setupEvents( this.options.event );\n\t\tthis._setupHeightStyle( this.options.heightStyle );\n\n\t\tthis.tabs.not( this.active ).attr( {\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\ttabIndex: -1\n\t\t} );\n\t\tthis.panels.not( this._getPanelForTab( this.active ) )\n\t\t\t.hide()\n\t\t\t.attr( {\n\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t} );\n\n\t\t// Make sure one tab is in the tab order\n\t\tif ( !this.active.length ) {\n\t\t\tthis.tabs.eq( 0 ).attr( \"tabIndex\", 0 );\n\t\t} else {\n\t\t\tthis.active\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t} );\n\t\t\tthis._addClass( this.active, \"ui-tabs-active\", \"ui-state-active\" );\n\t\t\tthis._getPanelForTab( this.active )\n\t\t\t\t.show()\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t_processTabs: function() {\n\t\tvar that = this,\n\t\t\tprevTabs = this.tabs,\n\t\t\tprevAnchors = this.anchors,\n\t\t\tprevPanels = this.panels;\n\n\t\tthis.tablist = this._getList().attr( \"role\", \"tablist\" );\n\t\tthis._addClass( this.tablist, \"ui-tabs-nav\",\n\t\t\t\"ui-helper-reset ui-helper-clearfix ui-widget-header\" );\n\n\t\t// Prevent users from focusing disabled tabs via click\n\t\tthis.tablist\n\t\t\t.on( \"mousedown\" + this.eventNamespace, \"> li\", function( event ) {\n\t\t\t\tif ( $( this ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t} )\n\n\t\t\t// Support: IE <9\n\t\t\t// Preventing the default action in mousedown doesn't prevent IE\n\t\t\t// from focusing the element, so if the anchor gets focused, blur.\n\t\t\t// We don't have to worry about focusing the previously focused\n\t\t\t// element since clicking on a non-focusable element should focus\n\t\t\t// the body anyway.\n\t\t\t.on( \"focus\" + this.eventNamespace, \".ui-tabs-anchor\", function() {\n\t\t\t\tif ( $( this ).closest( \"li\" ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t}\n\t\t\t} );\n\n\t\tthis.tabs = this.tablist.find( \"> li:has(a[href])\" )\n\t\t\t.attr( {\n\t\t\t\trole: \"tab\",\n\t\t\t\ttabIndex: -1\n\t\t\t} );\n\t\tthis._addClass( this.tabs, \"ui-tabs-tab\", \"ui-state-default\" );\n\n\t\tthis.anchors = this.tabs.map( function() {\n\t\t\treturn $( \"a\", this )[ 0 ];\n\t\t} )\n\t\t\t.attr( {\n\t\t\t\trole: \"presentation\",\n\t\t\t\ttabIndex: -1\n\t\t\t} );\n\t\tthis._addClass( this.anchors, \"ui-tabs-anchor\" );\n\n\t\tthis.panels = $();\n\n\t\tthis.anchors.each( function( i, anchor ) {\n\t\t\tvar selector, panel, panelId,\n\t\t\t\tanchorId = $( anchor ).uniqueId().attr( \"id\" ),\n\t\t\t\ttab = $( anchor ).closest( \"li\" ),\n\t\t\t\toriginalAriaControls = tab.attr( \"aria-controls\" );\n\n\t\t\t// Inline tab\n\t\t\tif ( that._isLocal( anchor ) ) {\n\t\t\t\tselector = anchor.hash;\n\t\t\t\tpanelId = selector.substring( 1 );\n\t\t\t\tpanel = that.element.find( that._sanitizeSelector( selector ) );\n\n\t\t\t// remote tab\n\t\t\t} else {\n\n\t\t\t\t// If the tab doesn't already have aria-controls,\n\t\t\t\t// generate an id by using a throw-away element\n\t\t\t\tpanelId = tab.attr( \"aria-controls\" ) || $( {} ).uniqueId()[ 0 ].id;\n\t\t\t\tselector = \"#\" + panelId;\n\t\t\t\tpanel = that.element.find( selector );\n\t\t\t\tif ( !panel.length ) {\n\t\t\t\t\tpanel = that._createPanel( panelId );\n\t\t\t\t\tpanel.insertAfter( that.panels[ i - 1 ] || that.tablist );\n\t\t\t\t}\n\t\t\t\tpanel.attr( \"aria-live\", \"polite\" );\n\t\t\t}\n\n\t\t\tif ( panel.length ) {\n\t\t\t\tthat.panels = that.panels.add( panel );\n\t\t\t}\n\t\t\tif ( originalAriaControls ) {\n\t\t\t\ttab.data( \"ui-tabs-aria-controls\", originalAriaControls );\n\t\t\t}\n\t\t\ttab.attr( {\n\t\t\t\t\"aria-controls\": panelId,\n\t\t\t\t\"aria-labelledby\": anchorId\n\t\t\t} );\n\t\t\tpanel.attr( \"aria-labelledby\", anchorId );\n\t\t} );\n\n\t\tthis.panels.attr( \"role\", \"tabpanel\" );\n\t\tthis._addClass( this.panels, \"ui-tabs-panel\", \"ui-widget-content\" );\n\n\t\t// Avoid memory leaks (#10056)\n\t\tif ( prevTabs ) {\n\t\t\tthis._off( prevTabs.not( this.tabs ) );\n\t\t\tthis._off( prevAnchors.not( this.anchors ) );\n\t\t\tthis._off( prevPanels.not( this.panels ) );\n\t\t}\n\t},\n\n\t// Allow overriding how to find the list for rare usage scenarios (#7715)\n\t_getList: function() {\n\t\treturn this.tablist || this.element.find( \"ol, ul\" ).eq( 0 );\n\t},\n\n\t_createPanel: function( id ) {\n\t\treturn $( \"<div>\" )\n\t\t\t.attr( \"id\", id )\n\t\t\t.data( \"ui-tabs-destroy\", true );\n\t},\n\n\t_setOptionDisabled: function( disabled ) {\n\t\tvar currentItem, li, i;\n\n\t\tif ( $.isArray( disabled ) ) {\n\t\t\tif ( !disabled.length ) {\n\t\t\t\tdisabled = false;\n\t\t\t} else if ( disabled.length === this.anchors.length ) {\n\t\t\t\tdisabled = true;\n\t\t\t}\n\t\t}\n\n\t\t// Disable tabs\n\t\tfor ( i = 0; ( li = this.tabs[ i ] ); i++ ) {\n\t\t\tcurrentItem = $( li );\n\t\t\tif ( disabled === true || $.inArray( i, disabled ) !== -1 ) {\n\t\t\t\tcurrentItem.attr( \"aria-disabled\", \"true\" );\n\t\t\t\tthis._addClass( currentItem, null, \"ui-state-disabled\" );\n\t\t\t} else {\n\t\t\t\tcurrentItem.removeAttr( \"aria-disabled\" );\n\t\t\t\tthis._removeClass( currentItem, null, \"ui-state-disabled\" );\n\t\t\t}\n\t\t}\n\n\t\tthis.options.disabled = disabled;\n\n\t\tthis._toggleClass( this.widget(), this.widgetFullName + \"-disabled\", null,\n\t\t\tdisabled === true );\n\t},\n\n\t_setupEvents: function( event ) {\n\t\tvar events = {};\n\t\tif ( event ) {\n\t\t\t$.each( event.split( \" \" ), function( index, eventName ) {\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\n\t\t\t} );\n\t\t}\n\n\t\tthis._off( this.anchors.add( this.tabs ).add( this.panels ) );\n\n\t\t// Always prevent the default action, even when disabled\n\t\tthis._on( true, this.anchors, {\n\t\t\tclick: function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t} );\n\t\tthis._on( this.anchors, events );\n\t\tthis._on( this.tabs, { keydown: \"_tabKeydown\" } );\n\t\tthis._on( this.panels, { keydown: \"_panelKeydown\" } );\n\n\t\tthis._focusable( this.tabs );\n\t\tthis._hoverable( this.tabs );\n\t},\n\n\t_setupHeightStyle: function( heightStyle ) {\n\t\tvar maxHeight,\n\t\t\tparent = this.element.parent();\n\n\t\tif ( heightStyle === \"fill\" ) {\n\t\t\tmaxHeight = parent.height();\n\t\t\tmaxHeight -= this.element.outerHeight() - this.element.height();\n\n\t\t\tthis.element.siblings( \":visible\" ).each( function() {\n\t\t\t\tvar elem = $( this ),\n\t\t\t\t\tposition = elem.css( \"position\" );\n\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.element.children().not( this.panels ).each( function() {\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.panels.each( function() {\n\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\n\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\n\t\t\t} )\n\t\t\t\t.css( \"overflow\", \"auto\" );\n\t\t} else if ( heightStyle === \"auto\" ) {\n\t\t\tmaxHeight = 0;\n\t\t\tthis.panels.each( function() {\n\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).height( \"\" ).height() );\n\t\t\t} ).height( maxHeight );\n\t\t}\n\t},\n\n\t_eventHandler: function( event ) {\n\t\tvar options = this.options,\n\t\t\tactive = this.active,\n\t\t\tanchor = $( event.currentTarget ),\n\t\t\ttab = anchor.closest( \"li\" ),\n\t\t\tclickedIsActive = tab[ 0 ] === active[ 0 ],\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\n\t\t\ttoShow = collapsing ? $() : this._getPanelForTab( tab ),\n\t\t\ttoHide = !active.length ? $() : this._getPanelForTab( active ),\n\t\t\teventData = {\n\t\t\t\toldTab: active,\n\t\t\t\toldPanel: toHide,\n\t\t\t\tnewTab: collapsing ? $() : tab,\n\t\t\t\tnewPanel: toShow\n\t\t\t};\n\n\t\tevent.preventDefault();\n\n\t\tif ( tab.hasClass( \"ui-state-disabled\" ) ||\n\n\t\t\t\t// tab is already loading\n\t\t\t\ttab.hasClass( \"ui-tabs-loading\" ) ||\n\n\t\t\t\t// can't switch durning an animation\n\t\t\t\tthis.running ||\n\n\t\t\t\t// click on active header, but not collapsible\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\n\n\t\t\t\t// allow canceling activation\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\toptions.active = collapsing ? false : this.tabs.index( tab );\n\n\t\tthis.active = clickedIsActive ? $() : tab;\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tif ( !toHide.length && !toShow.length ) {\n\t\t\t$.error( \"jQuery UI Tabs: Mismatching fragment identifier.\" );\n\t\t}\n\n\t\tif ( toShow.length ) {\n\t\t\tthis.load( this.tabs.index( tab ), event );\n\t\t}\n\t\tthis._toggle( event, eventData );\n\t},\n\n\t// Handles show/hide for selecting tabs\n\t_toggle: function( event, eventData ) {\n\t\tvar that = this,\n\t\t\ttoShow = eventData.newPanel,\n\t\t\ttoHide = eventData.oldPanel;\n\n\t\tthis.running = true;\n\n\t\tfunction complete() {\n\t\t\tthat.running = false;\n\t\t\tthat._trigger( \"activate\", event, eventData );\n\t\t}\n\n\t\tfunction show() {\n\t\t\tthat._addClass( eventData.newTab.closest( \"li\" ), \"ui-tabs-active\", \"ui-state-active\" );\n\n\t\t\tif ( toShow.length && that.options.show ) {\n\t\t\t\tthat._show( toShow, that.options.show, complete );\n\t\t\t} else {\n\t\t\t\ttoShow.show();\n\t\t\t\tcomplete();\n\t\t\t}\n\t\t}\n\n\t\t// Start out by hiding, then showing, then completing\n\t\tif ( toHide.length && this.options.hide ) {\n\t\t\tthis._hide( toHide, this.options.hide, function() {\n\t\t\t\tthat._removeClass( eventData.oldTab.closest( \"li\" ),\n\t\t\t\t\t\"ui-tabs-active\", \"ui-state-active\" );\n\t\t\t\tshow();\n\t\t\t} );\n\t\t} else {\n\t\t\tthis._removeClass( eventData.oldTab.closest( \"li\" ),\n\t\t\t\t\"ui-tabs-active\", \"ui-state-active\" );\n\t\t\ttoHide.hide();\n\t\t\tshow();\n\t\t}\n\n\t\ttoHide.attr( \"aria-hidden\", \"true\" );\n\t\teventData.oldTab.attr( {\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\"\n\t\t} );\n\n\t\t// If we're switching tabs, remove the old tab from the tab order.\n\t\t// If we're opening from collapsed state, remove the previous tab from the tab order.\n\t\t// If we're collapsing, then keep the collapsing tab in the tab order.\n\t\tif ( toShow.length && toHide.length ) {\n\t\t\teventData.oldTab.attr( \"tabIndex\", -1 );\n\t\t} else if ( toShow.length ) {\n\t\t\tthis.tabs.filter( function() {\n\t\t\t\treturn $( this ).attr( \"tabIndex\" ) === 0;\n\t\t\t} )\n\t\t\t\t.attr( \"tabIndex\", -1 );\n\t\t}\n\n\t\ttoShow.attr( \"aria-hidden\", \"false\" );\n\t\teventData.newTab.attr( {\n\t\t\t\"aria-selected\": \"true\",\n\t\t\t\"aria-expanded\": \"true\",\n\t\t\ttabIndex: 0\n\t\t} );\n\t},\n\n\t_activate: function( index ) {\n\t\tvar anchor,\n\t\t\tactive = this._findActive( index );\n\n\t\t// Trying to activate the already active panel\n\t\tif ( active[ 0 ] === this.active[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Trying to collapse, simulate a click on the current active header\n\t\tif ( !active.length ) {\n\t\t\tactive = this.active;\n\t\t}\n\n\t\tanchor = active.find( \".ui-tabs-anchor\" )[ 0 ];\n\t\tthis._eventHandler( {\n\t\t\ttarget: anchor,\n\t\t\tcurrentTarget: anchor,\n\t\t\tpreventDefault: $.noop\n\t\t} );\n\t},\n\n\t_findActive: function( index ) {\n\t\treturn index === false ? $() : this.tabs.eq( index );\n\t},\n\n\t_getIndex: function( index ) {\n\n\t\t// meta-function to give users option to provide a href string instead of a numerical index.\n\t\tif ( typeof index === \"string\" ) {\n\t\t\tindex = this.anchors.index( this.anchors.filter( \"[href$='\" +\n\t\t\t\t$.ui.escapeSelector( index ) + \"']\" ) );\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_destroy: function() {\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tthis.tablist\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.off( this.eventNamespace );\n\n\t\tthis.anchors\n\t\t\t.removeAttr( \"role tabIndex\" )\n\t\t\t.removeUniqueId();\n\n\t\tthis.tabs.add( this.panels ).each( function() {\n\t\t\tif ( $.data( this, \"ui-tabs-destroy\" ) ) {\n\t\t\t\t$( this ).remove();\n\t\t\t} else {\n\t\t\t\t$( this ).removeAttr( \"role tabIndex \" +\n\t\t\t\t\t\"aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded\" );\n\t\t\t}\n\t\t} );\n\n\t\tthis.tabs.each( function() {\n\t\t\tvar li = $( this ),\n\t\t\t\tprev = li.data( \"ui-tabs-aria-controls\" );\n\t\t\tif ( prev ) {\n\t\t\t\tli\n\t\t\t\t\t.attr( \"aria-controls\", prev )\n\t\t\t\t\t.removeData( \"ui-tabs-aria-controls\" );\n\t\t\t} else {\n\t\t\t\tli.removeAttr( \"aria-controls\" );\n\t\t\t}\n\t\t} );\n\n\t\tthis.panels.show();\n\n\t\tif ( this.options.heightStyle !== \"content\" ) {\n\t\t\tthis.panels.css( \"height\", \"\" );\n\t\t}\n\t},\n\n\tenable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = false;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.map( disabled, function( num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tdisabled = $.map( this.tabs, function( li, num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\tthis._setOptionDisabled( disabled );\n\t},\n\n\tdisable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === true ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = true;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.inArray( index, disabled ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.merge( [ index ], disabled ).sort();\n\t\t\t} else {\n\t\t\t\tdisabled = [ index ];\n\t\t\t}\n\t\t}\n\t\tthis._setOptionDisabled( disabled );\n\t},\n\n\tload: function( index, event ) {\n\t\tindex = this._getIndex( index );\n\t\tvar that = this,\n\t\t\ttab = this.tabs.eq( index ),\n\t\t\tanchor = tab.find( \".ui-tabs-anchor\" ),\n\t\t\tpanel = this._getPanelForTab( tab ),\n\t\t\teventData = {\n\t\t\t\ttab: tab,\n\t\t\t\tpanel: panel\n\t\t\t},\n\t\t\tcomplete = function( jqXHR, status ) {\n\t\t\t\tif ( status === \"abort\" ) {\n\t\t\t\t\tthat.panels.stop( false, true );\n\t\t\t\t}\n\n\t\t\t\tthat._removeClass( tab, \"ui-tabs-loading\" );\n\t\t\t\tpanel.removeAttr( \"aria-busy\" );\n\n\t\t\t\tif ( jqXHR === that.xhr ) {\n\t\t\t\t\tdelete that.xhr;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Not remote\n\t\tif ( this._isLocal( anchor[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );\n\n\t\t// Support: jQuery <1.8\n\t\t// jQuery <1.8 returns false if the request is canceled in beforeSend,\n\t\t// but as of 1.8, $.ajax() always returns a jqXHR object.\n\t\tif ( this.xhr && this.xhr.statusText !== \"canceled\" ) {\n\t\t\tthis._addClass( tab, \"ui-tabs-loading\" );\n\t\t\tpanel.attr( \"aria-busy\", \"true\" );\n\n\t\t\tthis.xhr\n\t\t\t\t.done( function( response, status, jqXHR ) {\n\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\tpanel.html( response );\n\t\t\t\t\t\tthat._trigger( \"load\", event, eventData );\n\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t} )\n\t\t\t\t.fail( function( jqXHR, status ) {\n\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t_ajaxSettings: function( anchor, event, eventData ) {\n\t\tvar that = this;\n\t\treturn {\n\n\t\t\t// Support: IE <11 only\n\t\t\t// Strip any hash that exists to prevent errors with the Ajax request\n\t\t\turl: anchor.attr( \"href\" ).replace( /#.*$/, \"\" ),\n\t\t\tbeforeSend: function( jqXHR, settings ) {\n\t\t\t\treturn that._trigger( \"beforeLoad\", event,\n\t\t\t\t\t$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );\n\t\t\t}\n\t\t};\n\t},\n\n\t_getPanelForTab: function( tab ) {\n\t\tvar id = $( tab ).attr( \"aria-controls\" );\n\t\treturn this.element.find( this._sanitizeSelector( \"#\" + id ) );\n\t}\n} );\n\n// DEPRECATED\n// TODO: Switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for ui-tab class (now ui-tabs-tab)\n\t$.widget( \"ui.tabs\", $.ui.tabs, {\n\t\t_processTabs: function() {\n\t\t\tthis._superApply( arguments );\n\t\t\tthis._addClass( this.tabs, \"ui-tab\" );\n\t\t}\n\t} );\n}\n\nvar widgetsTabs = $.ui.tabs;\n\n\n/*!\n * jQuery UI Tooltip 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Tooltip\n//>>group: Widgets\n//>>description: Shows additional information for any element on hover or focus.\n//>>docs: http://api.jqueryui.com/tooltip/\n//>>demos: http://jqueryui.com/tooltip/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/tooltip.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.tooltip\", {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-tooltip\": \"ui-corner-all ui-widget-shadow\"\n\t\t},\n\t\tcontent: function() {\n\n\t\t\t// support: IE<9, Opera in jQuery <1.7\n\t\t\t// .text() can't accept undefined, so coerce to a string\n\t\t\tvar title = $( this ).attr( \"title\" ) || \"\";\n\n\t\t\t// Escape title, since we're going from an attribute to raw HTML\n\t\t\treturn $( \"<a>\" ).text( title ).html();\n\t\t},\n\t\thide: true,\n\n\t\t// Disabled elements have inconsistent behavior across browsers (#8661)\n\t\titems: \"[title]:not([disabled])\",\n\t\tposition: {\n\t\t\tmy: \"left top+15\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"flipfit flip\"\n\t\t},\n\t\tshow: true,\n\t\ttrack: false,\n\n\t\t// Callbacks\n\t\tclose: null,\n\t\topen: null\n\t},\n\n\t_addDescribedBy: function( elem, id ) {\n\t\tvar describedby = ( elem.attr( \"aria-describedby\" ) || \"\" ).split( /\\s+/ );\n\t\tdescribedby.push( id );\n\t\telem\n\t\t\t.data( \"ui-tooltip-id\", id )\n\t\t\t.attr( \"aria-describedby\", $.trim( describedby.join( \" \" ) ) );\n\t},\n\n\t_removeDescribedBy: function( elem ) {\n\t\tvar id = elem.data( \"ui-tooltip-id\" ),\n\t\t\tdescribedby = ( elem.attr( \"aria-describedby\" ) || \"\" ).split( /\\s+/ ),\n\t\t\tindex = $.inArray( id, describedby );\n\n\t\tif ( index !== -1 ) {\n\t\t\tdescribedby.splice( index, 1 );\n\t\t}\n\n\t\telem.removeData( \"ui-tooltip-id\" );\n\t\tdescribedby = $.trim( describedby.join( \" \" ) );\n\t\tif ( describedby ) {\n\t\t\telem.attr( \"aria-describedby\", describedby );\n\t\t} else {\n\t\t\telem.removeAttr( \"aria-describedby\" );\n\t\t}\n\t},\n\n\t_create: function() {\n\t\tthis._on( {\n\t\t\tmouseover: \"open\",\n\t\t\tfocusin: \"open\"\n\t\t} );\n\n\t\t// IDs of generated tooltips, needed for destroy\n\t\tthis.tooltips = {};\n\n\t\t// IDs of parent tooltips where we removed the title attribute\n\t\tthis.parents = {};\n\n\t\t// Append the aria-live region so tooltips announce correctly\n\t\tthis.liveRegion = $( \"<div>\" )\n\t\t\t.attr( {\n\t\t\t\trole: \"log\",\n\t\t\t\t\"aria-live\": \"assertive\",\n\t\t\t\t\"aria-relevant\": \"additions\"\n\t\t\t} )\n\t\t\t.appendTo( this.document[ 0 ].body );\n\t\tthis._addClass( this.liveRegion, null, \"ui-helper-hidden-accessible\" );\n\n\t\tthis.disabledTitles = $( [] );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar that = this;\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"content\" ) {\n\t\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\t\tthat._updateContent( tooltipData.element );\n\t\t\t} );\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis[ value ? \"_disable\" : \"_enable\" ]();\n\t},\n\n\t_disable: function() {\n\t\tvar that = this;\n\n\t\t// Close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\tvar event = $.Event( \"blur\" );\n\t\t\tevent.target = event.currentTarget = tooltipData.element[ 0 ];\n\t\t\tthat.close( event, true );\n\t\t} );\n\n\t\t// Remove title attributes to prevent native tooltips\n\t\tthis.disabledTitles = this.disabledTitles.add(\n\t\t\tthis.element.find( this.options.items ).addBack()\n\t\t\t\t.filter( function() {\n\t\t\t\t\tvar element = $( this );\n\t\t\t\t\tif ( element.is( \"[title]\" ) ) {\n\t\t\t\t\t\treturn element\n\t\t\t\t\t\t\t.data( \"ui-tooltip-title\", element.attr( \"title\" ) )\n\t\t\t\t\t\t\t.removeAttr( \"title\" );\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t);\n\t},\n\n\t_enable: function() {\n\n\t\t// restore title attributes\n\t\tthis.disabledTitles.each( function() {\n\t\t\tvar element = $( this );\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t}\n\t\t} );\n\t\tthis.disabledTitles = $( [] );\n\t},\n\n\topen: function( event ) {\n\t\tvar that = this,\n\t\t\ttarget = $( event ? event.target : this.element )\n\n\t\t\t\t// we need closest here due to mouseover bubbling,\n\t\t\t\t// but always pointing at the same event target\n\t\t\t\t.closest( this.options.items );\n\n\t\t// No element to show a tooltip for or the tooltip is already open\n\t\tif ( !target.length || target.data( \"ui-tooltip-id\" ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( target.attr( \"title\" ) ) {\n\t\t\ttarget.data( \"ui-tooltip-title\", target.attr( \"title\" ) );\n\t\t}\n\n\t\ttarget.data( \"ui-tooltip-open\", true );\n\n\t\t// Kill parent tooltips, custom or native, for hover\n\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\ttarget.parents().each( function() {\n\t\t\t\tvar parent = $( this ),\n\t\t\t\t\tblurEvent;\n\t\t\t\tif ( parent.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\tblurEvent = $.Event( \"blur\" );\n\t\t\t\t\tblurEvent.target = blurEvent.currentTarget = this;\n\t\t\t\t\tthat.close( blurEvent, true );\n\t\t\t\t}\n\t\t\t\tif ( parent.attr( \"title\" ) ) {\n\t\t\t\t\tparent.uniqueId();\n\t\t\t\t\tthat.parents[ this.id ] = {\n\t\t\t\t\t\telement: this,\n\t\t\t\t\t\ttitle: parent.attr( \"title\" )\n\t\t\t\t\t};\n\t\t\t\t\tparent.attr( \"title\", \"\" );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tthis._registerCloseHandlers( event, target );\n\t\tthis._updateContent( target, event );\n\t},\n\n\t_updateContent: function( target, event ) {\n\t\tvar content,\n\t\t\tcontentOption = this.options.content,\n\t\t\tthat = this,\n\t\t\teventType = event ? event.type : null;\n\n\t\tif ( typeof contentOption === \"string\" || contentOption.nodeType ||\n\t\t\t\tcontentOption.jquery ) {\n\t\t\treturn this._open( event, target, contentOption );\n\t\t}\n\n\t\tcontent = contentOption.call( target[ 0 ], function( response ) {\n\n\t\t\t// IE may instantly serve a cached response for ajax requests\n\t\t\t// delay this call to _open so the other call to _open runs first\n\t\t\tthat._delay( function() {\n\n\t\t\t\t// Ignore async response if tooltip was closed already\n\t\t\t\tif ( !target.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// JQuery creates a special event for focusin when it doesn't\n\t\t\t\t// exist natively. To improve performance, the native event\n\t\t\t\t// object is reused and the type is changed. Therefore, we can't\n\t\t\t\t// rely on the type being correct after the event finished\n\t\t\t\t// bubbling, so we set it back to the previous value. (#8740)\n\t\t\t\tif ( event ) {\n\t\t\t\t\tevent.type = eventType;\n\t\t\t\t}\n\t\t\t\tthis._open( event, target, response );\n\t\t\t} );\n\t\t} );\n\t\tif ( content ) {\n\t\t\tthis._open( event, target, content );\n\t\t}\n\t},\n\n\t_open: function( event, target, content ) {\n\t\tvar tooltipData, tooltip, delayedShow, a11yContent,\n\t\t\tpositionOption = $.extend( {}, this.options.position );\n\n\t\tif ( !content ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Content can be updated multiple times. If the tooltip already\n\t\t// exists, then just update the content and bail.\n\t\ttooltipData = this._find( target );\n\t\tif ( tooltipData ) {\n\t\t\ttooltipData.tooltip.find( \".ui-tooltip-content\" ).html( content );\n\t\t\treturn;\n\t\t}\n\n\t\t// If we have a title, clear it to prevent the native tooltip\n\t\t// we have to check first to avoid defining a title if none exists\n\t\t// (we don't want to cause an element to start matching [title])\n\t\t//\n\t\t// We use removeAttr only for key events, to allow IE to export the correct\n\t\t// accessible attributes. For mouse events, set to empty string to avoid\n\t\t// native tooltip showing up (happens only when removing inside mouseover).\n\t\tif ( target.is( \"[title]\" ) ) {\n\t\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\t\ttarget.attr( \"title\", \"\" );\n\t\t\t} else {\n\t\t\t\ttarget.removeAttr( \"title\" );\n\t\t\t}\n\t\t}\n\n\t\ttooltipData = this._tooltip( target );\n\t\ttooltip = tooltipData.tooltip;\n\t\tthis._addDescribedBy( target, tooltip.attr( \"id\" ) );\n\t\ttooltip.find( \".ui-tooltip-content\" ).html( content );\n\n\t\t// Support: Voiceover on OS X, JAWS on IE <= 9\n\t\t// JAWS announces deletions even when aria-relevant=\"additions\"\n\t\t// Voiceover will sometimes re-read the entire log region's contents from the beginning\n\t\tthis.liveRegion.children().hide();\n\t\ta11yContent = $( \"<div>\" ).html( tooltip.find( \".ui-tooltip-content\" ).html() );\n\t\ta11yContent.removeAttr( \"name\" ).find( \"[name]\" ).removeAttr( \"name\" );\n\t\ta11yContent.removeAttr( \"id\" ).find( \"[id]\" ).removeAttr( \"id\" );\n\t\ta11yContent.appendTo( this.liveRegion );\n\n\t\tfunction position( event ) {\n\t\t\tpositionOption.of = event;\n\t\t\tif ( tooltip.is( \":hidden\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttooltip.position( positionOption );\n\t\t}\n\t\tif ( this.options.track && event && /^mouse/.test( event.type ) ) {\n\t\t\tthis._on( this.document, {\n\t\t\t\tmousemove: position\n\t\t\t} );\n\n\t\t\t// trigger once to override element-relative positioning\n\t\t\tposition( event );\n\t\t} else {\n\t\t\ttooltip.position( $.extend( {\n\t\t\t\tof: target\n\t\t\t}, this.options.position ) );\n\t\t}\n\n\t\ttooltip.hide();\n\n\t\tthis._show( tooltip, this.options.show );\n\n\t\t// Handle tracking tooltips that are shown with a delay (#8644). As soon\n\t\t// as the tooltip is visible, position the tooltip using the most recent\n\t\t// event.\n\t\t// Adds the check to add the timers only when both delay and track options are set (#14682)\n\t\tif ( this.options.track && this.options.show && this.options.show.delay ) {\n\t\t\tdelayedShow = this.delayedShow = setInterval( function() {\n\t\t\t\tif ( tooltip.is( \":visible\" ) ) {\n\t\t\t\t\tposition( positionOption.of );\n\t\t\t\t\tclearInterval( delayedShow );\n\t\t\t\t}\n\t\t\t}, $.fx.interval );\n\t\t}\n\n\t\tthis._trigger( \"open\", event, { tooltip: tooltip } );\n\t},\n\n\t_registerCloseHandlers: function( event, target ) {\n\t\tvar events = {\n\t\t\tkeyup: function( event ) {\n\t\t\t\tif ( event.keyCode === $.ui.keyCode.ESCAPE ) {\n\t\t\t\t\tvar fakeEvent = $.Event( event );\n\t\t\t\t\tfakeEvent.currentTarget = target[ 0 ];\n\t\t\t\t\tthis.close( fakeEvent, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Only bind remove handler for delegated targets. Non-delegated\n\t\t// tooltips will handle this in destroy.\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tevents.remove = function() {\n\t\t\t\tthis._removeTooltip( this._find( target ).tooltip );\n\t\t\t};\n\t\t}\n\n\t\tif ( !event || event.type === \"mouseover\" ) {\n\t\t\tevents.mouseleave = \"close\";\n\t\t}\n\t\tif ( !event || event.type === \"focusin\" ) {\n\t\t\tevents.focusout = \"close\";\n\t\t}\n\t\tthis._on( true, target, events );\n\t},\n\n\tclose: function( event ) {\n\t\tvar tooltip,\n\t\t\tthat = this,\n\t\t\ttarget = $( event ? event.currentTarget : this.element ),\n\t\t\ttooltipData = this._find( target );\n\n\t\t// The tooltip may already be closed\n\t\tif ( !tooltipData ) {\n\n\t\t\t// We set ui-tooltip-open immediately upon open (in open()), but only set the\n\t\t\t// additional data once there's actually content to show (in _open()). So even if the\n\t\t\t// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in\n\t\t\t// the period between open() and _open().\n\t\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\t\treturn;\n\t\t}\n\n\t\ttooltip = tooltipData.tooltip;\n\n\t\t// Disabling closes the tooltip, so we need to track when we're closing\n\t\t// to avoid an infinite loop in case the tooltip becomes disabled on close\n\t\tif ( tooltipData.closing ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear the interval for delayed tracking tooltips\n\t\tclearInterval( this.delayedShow );\n\n\t\t// Only set title if we had one before (see comment in _open())\n\t\t// If the title attribute has changed since open(), don't restore\n\t\tif ( target.data( \"ui-tooltip-title\" ) && !target.attr( \"title\" ) ) {\n\t\t\ttarget.attr( \"title\", target.data( \"ui-tooltip-title\" ) );\n\t\t}\n\n\t\tthis._removeDescribedBy( target );\n\n\t\ttooltipData.hiding = true;\n\t\ttooltip.stop( true );\n\t\tthis._hide( tooltip, this.options.hide, function() {\n\t\t\tthat._removeTooltip( $( this ) );\n\t\t} );\n\n\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\tthis._off( target, \"mouseleave focusout keyup\" );\n\n\t\t// Remove 'remove' binding only on delegated targets\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tthis._off( target, \"remove\" );\n\t\t}\n\t\tthis._off( this.document, \"mousemove\" );\n\n\t\tif ( event && event.type === \"mouseleave\" ) {\n\t\t\t$.each( this.parents, function( id, parent ) {\n\t\t\t\t$( parent.element ).attr( \"title\", parent.title );\n\t\t\t\tdelete that.parents[ id ];\n\t\t\t} );\n\t\t}\n\n\t\ttooltipData.closing = true;\n\t\tthis._trigger( \"close\", event, { tooltip: tooltip } );\n\t\tif ( !tooltipData.hiding ) {\n\t\t\ttooltipData.closing = false;\n\t\t}\n\t},\n\n\t_tooltip: function( element ) {\n\t\tvar tooltip = $( \"<div>\" ).attr( \"role\", \"tooltip\" ),\n\t\t\tcontent = $( \"<div>\" ).appendTo( tooltip ),\n\t\t\tid = tooltip.uniqueId().attr( \"id\" );\n\n\t\tthis._addClass( content, \"ui-tooltip-content\" );\n\t\tthis._addClass( tooltip, \"ui-tooltip\", \"ui-widget ui-widget-content\" );\n\n\t\ttooltip.appendTo( this._appendTo( element ) );\n\n\t\treturn this.tooltips[ id ] = {\n\t\t\telement: element,\n\t\t\ttooltip: tooltip\n\t\t};\n\t},\n\n\t_find: function( target ) {\n\t\tvar id = target.data( \"ui-tooltip-id\" );\n\t\treturn id ? this.tooltips[ id ] : null;\n\t},\n\n\t_removeTooltip: function( tooltip ) {\n\t\ttooltip.remove();\n\t\tdelete this.tooltips[ tooltip.attr( \"id\" ) ];\n\t},\n\n\t_appendTo: function( target ) {\n\t\tvar element = target.closest( \".ui-front, dialog\" );\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[ 0 ].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_destroy: function() {\n\t\tvar that = this;\n\n\t\t// Close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\n\t\t\t// Delegate to close method to handle common cleanup\n\t\t\tvar event = $.Event( \"blur\" ),\n\t\t\t\telement = tooltipData.element;\n\t\t\tevent.target = event.currentTarget = element[ 0 ];\n\t\t\tthat.close( event, true );\n\n\t\t\t// Remove immediately; destroying an open tooltip doesn't use the\n\t\t\t// hide animation\n\t\t\t$( \"#\" + id ).remove();\n\n\t\t\t// Restore the title\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\n\t\t\t\t// If the title attribute has changed since open(), don't restore\n\t\t\t\tif ( !element.attr( \"title\" ) ) {\n\t\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t\t}\n\t\t\t\telement.removeData( \"ui-tooltip-title\" );\n\t\t\t}\n\t\t} );\n\t\tthis.liveRegion.remove();\n\t}\n} );\n\n// DEPRECATED\n// TODO: Switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for tooltipClass option\n\t$.widget( \"ui.tooltip\", $.ui.tooltip, {\n\t\toptions: {\n\t\t\ttooltipClass: null\n\t\t},\n\t\t_tooltip: function() {\n\t\t\tvar tooltipData = this._superApply( arguments );\n\t\t\tif ( this.options.tooltipClass ) {\n\t\t\t\ttooltipData.tooltip.addClass( this.options.tooltipClass );\n\t\t\t}\n\t\t\treturn tooltipData;\n\t\t}\n\t} );\n}\n\nvar widgetsTooltip = $.ui.tooltip;\n\n\n/*!\n * jQuery UI Effects 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Effects Core\n//>>group: Effects\n// jscs:disable maximumLineLength\n//>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects.\n// jscs:enable maximumLineLength\n//>>docs: http://api.jqueryui.com/category/effects-core/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar dataSpace = \"ui-effects-\",\n\tdataSpaceStyle = \"ui-effects-style\",\n\tdataSpaceAnimated = \"ui-effects-animated\",\n\n\t// Create a local jQuery because jQuery Color relies on it and the\n\t// global may not exist with AMD and a custom build (#10199)\n\tjQuery = $;\n\n$.effects = {\n\teffect: {}\n};\n\n/*!\n * jQuery Color Animations v2.1.2\n * https://github.com/jquery/jquery-color\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * Date: Wed Jan 16 08:47:09 2013 -0600\n */\n( function( jQuery, undefined ) {\n\n\tvar stepHooks = \"backgroundColor borderBottomColor borderLeftColor borderRightColor \" +\n\t\t\"borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor\",\n\n\t// Plusequals test for += 100 -= 100\n\trplusequals = /^([\\-+])=\\s*(\\d+\\.?\\d*)/,\n\n\t// A set of RE's that can match strings and generate color tuples.\n\tstringParsers = [ {\n\t\t\tre: /rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ],\n\t\t\t\t\texecResult[ 2 ],\n\t\t\t\t\texecResult[ 3 ],\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\tre: /rgba?\\(\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ] * 2.55,\n\t\t\t\t\texecResult[ 2 ] * 2.55,\n\t\t\t\t\texecResult[ 3 ] * 2.55,\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\n\t\t\t// This regex ignores A-F because it's compared against an already lowercased string\n\t\t\tre: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\tparseInt( execResult[ 1 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 2 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 3 ], 16 )\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\n\t\t\t// This regex ignores A-F because it's compared against an already lowercased string\n\t\t\tre: /#([a-f0-9])([a-f0-9])([a-f0-9])/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\tparseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 3 ] + execResult[ 3 ], 16 )\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\tre: /hsla?\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tspace: \"hsla\",\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ],\n\t\t\t\t\texecResult[ 2 ] / 100,\n\t\t\t\t\texecResult[ 3 ] / 100,\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t} ],\n\n\t// JQuery.Color( )\n\tcolor = jQuery.Color = function( color, green, blue, alpha ) {\n\t\treturn new jQuery.Color.fn.parse( color, green, blue, alpha );\n\t},\n\tspaces = {\n\t\trgba: {\n\t\t\tprops: {\n\t\t\t\tred: {\n\t\t\t\t\tidx: 0,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t},\n\t\t\t\tgreen: {\n\t\t\t\t\tidx: 1,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t},\n\t\t\t\tblue: {\n\t\t\t\t\tidx: 2,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\thsla: {\n\t\t\tprops: {\n\t\t\t\thue: {\n\t\t\t\t\tidx: 0,\n\t\t\t\t\ttype: \"degrees\"\n\t\t\t\t},\n\t\t\t\tsaturation: {\n\t\t\t\t\tidx: 1,\n\t\t\t\t\ttype: \"percent\"\n\t\t\t\t},\n\t\t\t\tlightness: {\n\t\t\t\t\tidx: 2,\n\t\t\t\t\ttype: \"percent\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tpropTypes = {\n\t\t\"byte\": {\n\t\t\tfloor: true,\n\t\t\tmax: 255\n\t\t},\n\t\t\"percent\": {\n\t\t\tmax: 1\n\t\t},\n\t\t\"degrees\": {\n\t\t\tmod: 360,\n\t\t\tfloor: true\n\t\t}\n\t},\n\tsupport = color.support = {},\n\n\t// Element for support tests\n\tsupportElem = jQuery( \"<p>\" )[ 0 ],\n\n\t// Colors = jQuery.Color.names\n\tcolors,\n\n\t// Local aliases of functions called often\n\teach = jQuery.each;\n\n// Determine rgba support immediately\nsupportElem.style.cssText = \"background-color:rgba(1,1,1,.5)\";\nsupport.rgba = supportElem.style.backgroundColor.indexOf( \"rgba\" ) > -1;\n\n// Define cache name and alpha properties\n// for rgba and hsla spaces\neach( spaces, function( spaceName, space ) {\n\tspace.cache = \"_\" + spaceName;\n\tspace.props.alpha = {\n\t\tidx: 3,\n\t\ttype: \"percent\",\n\t\tdef: 1\n\t};\n} );\n\nfunction clamp( value, prop, allowEmpty ) {\n\tvar type = propTypes[ prop.type ] || {};\n\n\tif ( value == null ) {\n\t\treturn ( allowEmpty || !prop.def ) ? null : prop.def;\n\t}\n\n\t// ~~ is an short way of doing floor for positive numbers\n\tvalue = type.floor ? ~~value : parseFloat( value );\n\n\t// IE will pass in empty strings as value for alpha,\n\t// which will hit this case\n\tif ( isNaN( value ) ) {\n\t\treturn prop.def;\n\t}\n\n\tif ( type.mod ) {\n\n\t\t// We add mod before modding to make sure that negatives values\n\t\t// get converted properly: -10 -> 350\n\t\treturn ( value + type.mod ) % type.mod;\n\t}\n\n\t// For now all property types without mod have min and max\n\treturn 0 > value ? 0 : type.max < value ? type.max : value;\n}\n\nfunction stringParse( string ) {\n\tvar inst = color(),\n\t\trgba = inst._rgba = [];\n\n\tstring = string.toLowerCase();\n\n\teach( stringParsers, function( i, parser ) {\n\t\tvar parsed,\n\t\t\tmatch = parser.re.exec( string ),\n\t\t\tvalues = match && parser.parse( match ),\n\t\t\tspaceName = parser.space || \"rgba\";\n\n\t\tif ( values ) {\n\t\t\tparsed = inst[ spaceName ]( values );\n\n\t\t\t// If this was an rgba parse the assignment might happen twice\n\t\t\t// oh well....\n\t\t\tinst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];\n\t\t\trgba = inst._rgba = parsed._rgba;\n\n\t\t\t// Exit each( stringParsers ) here because we matched\n\t\t\treturn false;\n\t\t}\n\t} );\n\n\t// Found a stringParser that handled it\n\tif ( rgba.length ) {\n\n\t\t// If this came from a parsed string, force \"transparent\" when alpha is 0\n\t\t// chrome, (and maybe others) return \"transparent\" as rgba(0,0,0,0)\n\t\tif ( rgba.join() === \"0,0,0,0\" ) {\n\t\t\tjQuery.extend( rgba, colors.transparent );\n\t\t}\n\t\treturn inst;\n\t}\n\n\t// Named colors\n\treturn colors[ string ];\n}\n\ncolor.fn = jQuery.extend( color.prototype, {\n\tparse: function( red, green, blue, alpha ) {\n\t\tif ( red === undefined ) {\n\t\t\tthis._rgba = [ null, null, null, null ];\n\t\t\treturn this;\n\t\t}\n\t\tif ( red.jquery || red.nodeType ) {\n\t\t\tred = jQuery( red ).css( green );\n\t\t\tgreen = undefined;\n\t\t}\n\n\t\tvar inst = this,\n\t\t\ttype = jQuery.type( red ),\n\t\t\trgba = this._rgba = [];\n\n\t\t// More than 1 argument specified - assume ( red, green, blue, alpha )\n\t\tif ( green !== undefined ) {\n\t\t\tred = [ red, green, blue, alpha ];\n\t\t\ttype = \"array\";\n\t\t}\n\n\t\tif ( type === \"string\" ) {\n\t\t\treturn this.parse( stringParse( red ) || colors._default );\n\t\t}\n\n\t\tif ( type === \"array\" ) {\n\t\t\teach( spaces.rgba.props, function( key, prop ) {\n\t\t\t\trgba[ prop.idx ] = clamp( red[ prop.idx ], prop );\n\t\t\t} );\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( type === \"object\" ) {\n\t\t\tif ( red instanceof color ) {\n\t\t\t\teach( spaces, function( spaceName, space ) {\n\t\t\t\t\tif ( red[ space.cache ] ) {\n\t\t\t\t\t\tinst[ space.cache ] = red[ space.cache ].slice();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\teach( spaces, function( spaceName, space ) {\n\t\t\t\t\tvar cache = space.cache;\n\t\t\t\t\teach( space.props, function( key, prop ) {\n\n\t\t\t\t\t\t// If the cache doesn't exist, and we know how to convert\n\t\t\t\t\t\tif ( !inst[ cache ] && space.to ) {\n\n\t\t\t\t\t\t\t// If the value was null, we don't need to copy it\n\t\t\t\t\t\t\t// if the key was alpha, we don't need to copy it either\n\t\t\t\t\t\t\tif ( key === \"alpha\" || red[ key ] == null ) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tinst[ cache ] = space.to( inst._rgba );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// This is the only case where we allow nulls for ALL properties.\n\t\t\t\t\t\t// call clamp with alwaysAllowEmpty\n\t\t\t\t\t\tinst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );\n\t\t\t\t\t} );\n\n\t\t\t\t\t// Everything defined but alpha?\n\t\t\t\t\tif ( inst[ cache ] &&\n\t\t\t\t\t\t\tjQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {\n\n\t\t\t\t\t\t// Use the default of 1\n\t\t\t\t\t\tinst[ cache ][ 3 ] = 1;\n\t\t\t\t\t\tif ( space.from ) {\n\t\t\t\t\t\t\tinst._rgba = space.from( inst[ cache ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t},\n\tis: function( compare ) {\n\t\tvar is = color( compare ),\n\t\t\tsame = true,\n\t\t\tinst = this;\n\n\t\teach( spaces, function( _, space ) {\n\t\t\tvar localCache,\n\t\t\t\tisCache = is[ space.cache ];\n\t\t\tif ( isCache ) {\n\t\t\t\tlocalCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];\n\t\t\t\teach( space.props, function( _, prop ) {\n\t\t\t\t\tif ( isCache[ prop.idx ] != null ) {\n\t\t\t\t\t\tsame = ( isCache[ prop.idx ] === localCache[ prop.idx ] );\n\t\t\t\t\t\treturn same;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn same;\n\t\t} );\n\t\treturn same;\n\t},\n\t_space: function() {\n\t\tvar used = [],\n\t\t\tinst = this;\n\t\teach( spaces, function( spaceName, space ) {\n\t\t\tif ( inst[ space.cache ] ) {\n\t\t\t\tused.push( spaceName );\n\t\t\t}\n\t\t} );\n\t\treturn used.pop();\n\t},\n\ttransition: function( other, distance ) {\n\t\tvar end = color( other ),\n\t\t\tspaceName = end._space(),\n\t\t\tspace = spaces[ spaceName ],\n\t\t\tstartColor = this.alpha() === 0 ? color( \"transparent\" ) : this,\n\t\t\tstart = startColor[ space.cache ] || space.to( startColor._rgba ),\n\t\t\tresult = start.slice();\n\n\t\tend = end[ space.cache ];\n\t\teach( space.props, function( key, prop ) {\n\t\t\tvar index = prop.idx,\n\t\t\t\tstartValue = start[ index ],\n\t\t\t\tendValue = end[ index ],\n\t\t\t\ttype = propTypes[ prop.type ] || {};\n\n\t\t\t// If null, don't override start value\n\t\t\tif ( endValue === null ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If null - use end\n\t\t\tif ( startValue === null ) {\n\t\t\t\tresult[ index ] = endValue;\n\t\t\t} else {\n\t\t\t\tif ( type.mod ) {\n\t\t\t\t\tif ( endValue - startValue > type.mod / 2 ) {\n\t\t\t\t\t\tstartValue += type.mod;\n\t\t\t\t\t} else if ( startValue - endValue > type.mod / 2 ) {\n\t\t\t\t\t\tstartValue -= type.mod;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );\n\t\t\t}\n\t\t} );\n\t\treturn this[ spaceName ]( result );\n\t},\n\tblend: function( opaque ) {\n\n\t\t// If we are already opaque - return ourself\n\t\tif ( this._rgba[ 3 ] === 1 ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tvar rgb = this._rgba.slice(),\n\t\t\ta = rgb.pop(),\n\t\t\tblend = color( opaque )._rgba;\n\n\t\treturn color( jQuery.map( rgb, function( v, i ) {\n\t\t\treturn ( 1 - a ) * blend[ i ] + a * v;\n\t\t} ) );\n\t},\n\ttoRgbaString: function() {\n\t\tvar prefix = \"rgba(\",\n\t\t\trgba = jQuery.map( this._rgba, function( v, i ) {\n\t\t\t\treturn v == null ? ( i > 2 ? 1 : 0 ) : v;\n\t\t\t} );\n\n\t\tif ( rgba[ 3 ] === 1 ) {\n\t\t\trgba.pop();\n\t\t\tprefix = \"rgb(\";\n\t\t}\n\n\t\treturn prefix + rgba.join() + \")\";\n\t},\n\ttoHslaString: function() {\n\t\tvar prefix = \"hsla(\",\n\t\t\thsla = jQuery.map( this.hsla(), function( v, i ) {\n\t\t\t\tif ( v == null ) {\n\t\t\t\t\tv = i > 2 ? 1 : 0;\n\t\t\t\t}\n\n\t\t\t\t// Catch 1 and 2\n\t\t\t\tif ( i && i < 3 ) {\n\t\t\t\t\tv = Math.round( v * 100 ) + \"%\";\n\t\t\t\t}\n\t\t\t\treturn v;\n\t\t\t} );\n\n\t\tif ( hsla[ 3 ] === 1 ) {\n\t\t\thsla.pop();\n\t\t\tprefix = \"hsl(\";\n\t\t}\n\t\treturn prefix + hsla.join() + \")\";\n\t},\n\ttoHexString: function( includeAlpha ) {\n\t\tvar rgba = this._rgba.slice(),\n\t\t\talpha = rgba.pop();\n\n\t\tif ( includeAlpha ) {\n\t\t\trgba.push( ~~( alpha * 255 ) );\n\t\t}\n\n\t\treturn \"#\" + jQuery.map( rgba, function( v ) {\n\n\t\t\t// Default to 0 when nulls exist\n\t\t\tv = ( v || 0 ).toString( 16 );\n\t\t\treturn v.length === 1 ? \"0\" + v : v;\n\t\t} ).join( \"\" );\n\t},\n\ttoString: function() {\n\t\treturn this._rgba[ 3 ] === 0 ? \"transparent\" : this.toRgbaString();\n\t}\n} );\ncolor.fn.parse.prototype = color.fn;\n\n// Hsla conversions adapted from:\n// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021\n\nfunction hue2rgb( p, q, h ) {\n\th = ( h + 1 ) % 1;\n\tif ( h * 6 < 1 ) {\n\t\treturn p + ( q - p ) * h * 6;\n\t}\n\tif ( h * 2 < 1 ) {\n\t\treturn q;\n\t}\n\tif ( h * 3 < 2 ) {\n\t\treturn p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;\n\t}\n\treturn p;\n}\n\nspaces.hsla.to = function( rgba ) {\n\tif ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {\n\t\treturn [ null, null, null, rgba[ 3 ] ];\n\t}\n\tvar r = rgba[ 0 ] / 255,\n\t\tg = rgba[ 1 ] / 255,\n\t\tb = rgba[ 2 ] / 255,\n\t\ta = rgba[ 3 ],\n\t\tmax = Math.max( r, g, b ),\n\t\tmin = Math.min( r, g, b ),\n\t\tdiff = max - min,\n\t\tadd = max + min,\n\t\tl = add * 0.5,\n\t\th, s;\n\n\tif ( min === max ) {\n\t\th = 0;\n\t} else if ( r === max ) {\n\t\th = ( 60 * ( g - b ) / diff ) + 360;\n\t} else if ( g === max ) {\n\t\th = ( 60 * ( b - r ) / diff ) + 120;\n\t} else {\n\t\th = ( 60 * ( r - g ) / diff ) + 240;\n\t}\n\n\t// Chroma (diff) == 0 means greyscale which, by definition, saturation = 0%\n\t// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)\n\tif ( diff === 0 ) {\n\t\ts = 0;\n\t} else if ( l <= 0.5 ) {\n\t\ts = diff / add;\n\t} else {\n\t\ts = diff / ( 2 - add );\n\t}\n\treturn [ Math.round( h ) % 360, s, l, a == null ? 1 : a ];\n};\n\nspaces.hsla.from = function( hsla ) {\n\tif ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {\n\t\treturn [ null, null, null, hsla[ 3 ] ];\n\t}\n\tvar h = hsla[ 0 ] / 360,\n\t\ts = hsla[ 1 ],\n\t\tl = hsla[ 2 ],\n\t\ta = hsla[ 3 ],\n\t\tq = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,\n\t\tp = 2 * l - q;\n\n\treturn [\n\t\tMath.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),\n\t\tMath.round( hue2rgb( p, q, h ) * 255 ),\n\t\tMath.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),\n\t\ta\n\t];\n};\n\neach( spaces, function( spaceName, space ) {\n\tvar props = space.props,\n\t\tcache = space.cache,\n\t\tto = space.to,\n\t\tfrom = space.from;\n\n\t// Makes rgba() and hsla()\n\tcolor.fn[ spaceName ] = function( value ) {\n\n\t\t// Generate a cache for this space if it doesn't exist\n\t\tif ( to && !this[ cache ] ) {\n\t\t\tthis[ cache ] = to( this._rgba );\n\t\t}\n\t\tif ( value === undefined ) {\n\t\t\treturn this[ cache ].slice();\n\t\t}\n\n\t\tvar ret,\n\t\t\ttype = jQuery.type( value ),\n\t\t\tarr = ( type === \"array\" || type === \"object\" ) ? value : arguments,\n\t\t\tlocal = this[ cache ].slice();\n\n\t\teach( props, function( key, prop ) {\n\t\t\tvar val = arr[ type === \"object\" ? key : prop.idx ];\n\t\t\tif ( val == null ) {\n\t\t\t\tval = local[ prop.idx ];\n\t\t\t}\n\t\t\tlocal[ prop.idx ] = clamp( val, prop );\n\t\t} );\n\n\t\tif ( from ) {\n\t\t\tret = color( from( local ) );\n\t\t\tret[ cache ] = local;\n\t\t\treturn ret;\n\t\t} else {\n\t\t\treturn color( local );\n\t\t}\n\t};\n\n\t// Makes red() green() blue() alpha() hue() saturation() lightness()\n\teach( props, function( key, prop ) {\n\n\t\t// Alpha is included in more than one space\n\t\tif ( color.fn[ key ] ) {\n\t\t\treturn;\n\t\t}\n\t\tcolor.fn[ key ] = function( value ) {\n\t\t\tvar vtype = jQuery.type( value ),\n\t\t\t\tfn = ( key === \"alpha\" ? ( this._hsla ? \"hsla\" : \"rgba\" ) : spaceName ),\n\t\t\t\tlocal = this[ fn ](),\n\t\t\t\tcur = local[ prop.idx ],\n\t\t\t\tmatch;\n\n\t\t\tif ( vtype === \"undefined\" ) {\n\t\t\t\treturn cur;\n\t\t\t}\n\n\t\t\tif ( vtype === \"function\" ) {\n\t\t\t\tvalue = value.call( this, cur );\n\t\t\t\tvtype = jQuery.type( value );\n\t\t\t}\n\t\t\tif ( value == null && prop.empty ) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tif ( vtype === \"string\" ) {\n\t\t\t\tmatch = rplusequals.exec( value );\n\t\t\t\tif ( match ) {\n\t\t\t\t\tvalue = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === \"+\" ? 1 : -1 );\n\t\t\t\t}\n\t\t\t}\n\t\t\tlocal[ prop.idx ] = value;\n\t\t\treturn this[ fn ]( local );\n\t\t};\n\t} );\n} );\n\n// Add cssHook and .fx.step function for each named hook.\n// accept a space separated string of properties\ncolor.hook = function( hook ) {\n\tvar hooks = hook.split( \" \" );\n\teach( hooks, function( i, hook ) {\n\t\tjQuery.cssHooks[ hook ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar parsed, curElem,\n\t\t\t\t\tbackgroundColor = \"\";\n\n\t\t\t\tif ( value !== \"transparent\" && ( jQuery.type( value ) !== \"string\" ||\n\t\t\t\t\t\t( parsed = stringParse( value ) ) ) ) {\n\t\t\t\t\tvalue = color( parsed || value );\n\t\t\t\t\tif ( !support.rgba && value._rgba[ 3 ] !== 1 ) {\n\t\t\t\t\t\tcurElem = hook === \"backgroundColor\" ? elem.parentNode : elem;\n\t\t\t\t\t\twhile (\n\t\t\t\t\t\t\t( backgroundColor === \"\" || backgroundColor === \"transparent\" ) &&\n\t\t\t\t\t\t\tcurElem && curElem.style\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tbackgroundColor = jQuery.css( curElem, \"backgroundColor\" );\n\t\t\t\t\t\t\t\tcurElem = curElem.parentNode;\n\t\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvalue = value.blend( backgroundColor && backgroundColor !== \"transparent\" ?\n\t\t\t\t\t\t\tbackgroundColor :\n\t\t\t\t\t\t\t\"_default\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tvalue = value.toRgbaString();\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\telem.style[ hook ] = value;\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// Wrapped to prevent IE from throwing errors on \"invalid\" values like\n\t\t\t\t\t// 'auto' or 'inherit'\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tjQuery.fx.step[ hook ] = function( fx ) {\n\t\t\tif ( !fx.colorInit ) {\n\t\t\t\tfx.start = color( fx.elem, hook );\n\t\t\t\tfx.end = color( fx.end );\n\t\t\t\tfx.colorInit = true;\n\t\t\t}\n\t\t\tjQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );\n\t\t};\n\t} );\n\n};\n\ncolor.hook( stepHooks );\n\njQuery.cssHooks.borderColor = {\n\texpand: function( value ) {\n\t\tvar expanded = {};\n\n\t\teach( [ \"Top\", \"Right\", \"Bottom\", \"Left\" ], function( i, part ) {\n\t\t\texpanded[ \"border\" + part + \"Color\" ] = value;\n\t\t} );\n\t\treturn expanded;\n\t}\n};\n\n// Basic color names only.\n// Usage of any of the other color names requires adding yourself or including\n// jquery.color.svg-names.js.\ncolors = jQuery.Color.names = {\n\n\t// 4.1. Basic color keywords\n\taqua: \"#00ffff\",\n\tblack: \"#000000\",\n\tblue: \"#0000ff\",\n\tfuchsia: \"#ff00ff\",\n\tgray: \"#808080\",\n\tgreen: \"#008000\",\n\tlime: \"#00ff00\",\n\tmaroon: \"#800000\",\n\tnavy: \"#000080\",\n\tolive: \"#808000\",\n\tpurple: \"#800080\",\n\tred: \"#ff0000\",\n\tsilver: \"#c0c0c0\",\n\tteal: \"#008080\",\n\twhite: \"#ffffff\",\n\tyellow: \"#ffff00\",\n\n\t// 4.2.3. \"transparent\" color keyword\n\ttransparent: [ null, null, null, 0 ],\n\n\t_default: \"#ffffff\"\n};\n\n} )( jQuery );\n\n/******************************************************************************/\n/****************************** CLASS ANIMATIONS ******************************/\n/******************************************************************************/\n( function() {\n\nvar classAnimationActions = [ \"add\", \"remove\", \"toggle\" ],\n\tshorthandStyles = {\n\t\tborder: 1,\n\t\tborderBottom: 1,\n\t\tborderColor: 1,\n\t\tborderLeft: 1,\n\t\tborderRight: 1,\n\t\tborderTop: 1,\n\t\tborderWidth: 1,\n\t\tmargin: 1,\n\t\tpadding: 1\n\t};\n\n$.each(\n\t[ \"borderLeftStyle\", \"borderRightStyle\", \"borderBottomStyle\", \"borderTopStyle\" ],\n\tfunction( _, prop ) {\n\t\t$.fx.step[ prop ] = function( fx ) {\n\t\t\tif ( fx.end !== \"none\" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {\n\t\t\t\tjQuery.style( fx.elem, prop, fx.end );\n\t\t\t\tfx.setAttr = true;\n\t\t\t}\n\t\t};\n\t}\n);\n\nfunction getElementStyles( elem ) {\n\tvar key, len,\n\t\tstyle = elem.ownerDocument.defaultView ?\n\t\t\telem.ownerDocument.defaultView.getComputedStyle( elem, null ) :\n\t\t\telem.currentStyle,\n\t\tstyles = {};\n\n\tif ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {\n\t\tlen = style.length;\n\t\twhile ( len-- ) {\n\t\t\tkey = style[ len ];\n\t\t\tif ( typeof style[ key ] === \"string\" ) {\n\t\t\t\tstyles[ $.camelCase( key ) ] = style[ key ];\n\t\t\t}\n\t\t}\n\n\t// Support: Opera, IE <9\n\t} else {\n\t\tfor ( key in style ) {\n\t\t\tif ( typeof style[ key ] === \"string\" ) {\n\t\t\t\tstyles[ key ] = style[ key ];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn styles;\n}\n\nfunction styleDifference( oldStyle, newStyle ) {\n\tvar diff = {},\n\t\tname, value;\n\n\tfor ( name in newStyle ) {\n\t\tvalue = newStyle[ name ];\n\t\tif ( oldStyle[ name ] !== value ) {\n\t\t\tif ( !shorthandStyles[ name ] ) {\n\t\t\t\tif ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {\n\t\t\t\t\tdiff[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn diff;\n}\n\n// Support: jQuery <1.8\nif ( !$.fn.addBack ) {\n\t$.fn.addBack = function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t};\n}\n\n$.effects.animateClass = function( value, duration, easing, callback ) {\n\tvar o = $.speed( duration, easing, callback );\n\n\treturn this.queue( function() {\n\t\tvar animated = $( this ),\n\t\t\tbaseClass = animated.attr( \"class\" ) || \"\",\n\t\t\tapplyClassChange,\n\t\t\tallAnimations = o.children ? animated.find( \"*\" ).addBack() : animated;\n\n\t\t// Map the animated objects to store the original styles.\n\t\tallAnimations = allAnimations.map( function() {\n\t\t\tvar el = $( this );\n\t\t\treturn {\n\t\t\t\tel: el,\n\t\t\t\tstart: getElementStyles( this )\n\t\t\t};\n\t\t} );\n\n\t\t// Apply class change\n\t\tapplyClassChange = function() {\n\t\t\t$.each( classAnimationActions, function( i, action ) {\n\t\t\t\tif ( value[ action ] ) {\n\t\t\t\t\tanimated[ action + \"Class\" ]( value[ action ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t};\n\t\tapplyClassChange();\n\n\t\t// Map all animated objects again - calculate new styles and diff\n\t\tallAnimations = allAnimations.map( function() {\n\t\t\tthis.end = getElementStyles( this.el[ 0 ] );\n\t\t\tthis.diff = styleDifference( this.start, this.end );\n\t\t\treturn this;\n\t\t} );\n\n\t\t// Apply original class\n\t\tanimated.attr( \"class\", baseClass );\n\n\t\t// Map all animated objects again - this time collecting a promise\n\t\tallAnimations = allAnimations.map( function() {\n\t\t\tvar styleInfo = this,\n\t\t\t\tdfd = $.Deferred(),\n\t\t\t\topts = $.extend( {}, o, {\n\t\t\t\t\tqueue: false,\n\t\t\t\t\tcomplete: function() {\n\t\t\t\t\t\tdfd.resolve( styleInfo );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\tthis.el.animate( this.diff, opts );\n\t\t\treturn dfd.promise();\n\t\t} );\n\n\t\t// Once all animations have completed:\n\t\t$.when.apply( $, allAnimations.get() ).done( function() {\n\n\t\t\t// Set the final class\n\t\t\tapplyClassChange();\n\n\t\t\t// For each animated element,\n\t\t\t// clear all css properties that were animated\n\t\t\t$.each( arguments, function() {\n\t\t\t\tvar el = this.el;\n\t\t\t\t$.each( this.diff, function( key ) {\n\t\t\t\t\tel.css( key, \"\" );\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\t// This is guarnteed to be there if you use jQuery.speed()\n\t\t\t// it also handles dequeuing the next anim...\n\t\t\to.complete.call( animated[ 0 ] );\n\t\t} );\n\t} );\n};\n\n$.fn.extend( {\n\taddClass: ( function( orig ) {\n\t\treturn function( classNames, speed, easing, callback ) {\n\t\t\treturn speed ?\n\t\t\t\t$.effects.animateClass.call( this,\n\t\t\t\t\t{ add: classNames }, speed, easing, callback ) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t} )( $.fn.addClass ),\n\n\tremoveClass: ( function( orig ) {\n\t\treturn function( classNames, speed, easing, callback ) {\n\t\t\treturn arguments.length > 1 ?\n\t\t\t\t$.effects.animateClass.call( this,\n\t\t\t\t\t{ remove: classNames }, speed, easing, callback ) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t} )( $.fn.removeClass ),\n\n\ttoggleClass: ( function( orig ) {\n\t\treturn function( classNames, force, speed, easing, callback ) {\n\t\t\tif ( typeof force === \"boolean\" || force === undefined ) {\n\t\t\t\tif ( !speed ) {\n\n\t\t\t\t\t// Without speed parameter\n\t\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t\t} else {\n\t\t\t\t\treturn $.effects.animateClass.call( this,\n\t\t\t\t\t\t( force ? { add: classNames } : { remove: classNames } ),\n\t\t\t\t\t\tspeed, easing, callback );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Without force parameter\n\t\t\t\treturn $.effects.animateClass.call( this,\n\t\t\t\t\t{ toggle: classNames }, force, speed, easing );\n\t\t\t}\n\t\t};\n\t} )( $.fn.toggleClass ),\n\n\tswitchClass: function( remove, add, speed, easing, callback ) {\n\t\treturn $.effects.animateClass.call( this, {\n\t\t\tadd: add,\n\t\t\tremove: remove\n\t\t}, speed, easing, callback );\n\t}\n} );\n\n} )();\n\n/******************************************************************************/\n/*********************************** EFFECTS **********************************/\n/******************************************************************************/\n\n( function() {\n\nif ( $.expr && $.expr.filters && $.expr.filters.animated ) {\n\t$.expr.filters.animated = ( function( orig ) {\n\t\treturn function( elem ) {\n\t\t\treturn !!$( elem ).data( dataSpaceAnimated ) || orig( elem );\n\t\t};\n\t} )( $.expr.filters.animated );\n}\n\nif ( $.uiBackCompat !== false ) {\n\t$.extend( $.effects, {\n\n\t\t// Saves a set of properties in a data storage\n\t\tsave: function( element, set ) {\n\t\t\tvar i = 0, length = set.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( set[ i ] !== null ) {\n\t\t\t\t\telement.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Restores a set of previously saved properties from a data storage\n\t\trestore: function( element, set ) {\n\t\t\tvar val, i = 0, length = set.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( set[ i ] !== null ) {\n\t\t\t\t\tval = element.data( dataSpace + set[ i ] );\n\t\t\t\t\telement.css( set[ i ], val );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tsetMode: function( el, mode ) {\n\t\t\tif ( mode === \"toggle\" ) {\n\t\t\t\tmode = el.is( \":hidden\" ) ? \"show\" : \"hide\";\n\t\t\t}\n\t\t\treturn mode;\n\t\t},\n\n\t\t// Wraps the element around a wrapper that copies position properties\n\t\tcreateWrapper: function( element ) {\n\n\t\t\t// If the element is already wrapped, return it\n\t\t\tif ( element.parent().is( \".ui-effects-wrapper\" ) ) {\n\t\t\t\treturn element.parent();\n\t\t\t}\n\n\t\t\t// Wrap the element\n\t\t\tvar props = {\n\t\t\t\t\twidth: element.outerWidth( true ),\n\t\t\t\t\theight: element.outerHeight( true ),\n\t\t\t\t\t\"float\": element.css( \"float\" )\n\t\t\t\t},\n\t\t\t\twrapper = $( \"<div></div>\" )\n\t\t\t\t\t.addClass( \"ui-effects-wrapper\" )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\tfontSize: \"100%\",\n\t\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\tpadding: 0\n\t\t\t\t\t} ),\n\n\t\t\t\t// Store the size in case width/height are defined in % - Fixes #5245\n\t\t\t\tsize = {\n\t\t\t\t\twidth: element.width(),\n\t\t\t\t\theight: element.height()\n\t\t\t\t},\n\t\t\t\tactive = document.activeElement;\n\n\t\t\t// Support: Firefox\n\t\t\t// Firefox incorrectly exposes anonymous content\n\t\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=561664\n\t\t\ttry {\n\t\t\t\tactive.id;\n\t\t\t} catch ( e ) {\n\t\t\t\tactive = document.body;\n\t\t\t}\n\n\t\t\telement.wrap( wrapper );\n\n\t\t\t// Fixes #7595 - Elements lose focus when wrapped.\n\t\t\tif ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n\t\t\t\t$( active ).trigger( \"focus\" );\n\t\t\t}\n\n\t\t\t// Hotfix for jQuery 1.4 since some change in wrap() seems to actually\n\t\t\t// lose the reference to the wrapped element\n\t\t\twrapper = element.parent();\n\n\t\t\t// Transfer positioning properties to the wrapper\n\t\t\tif ( element.css( \"position\" ) === \"static\" ) {\n\t\t\t\twrapper.css( { position: \"relative\" } );\n\t\t\t\telement.css( { position: \"relative\" } );\n\t\t\t} else {\n\t\t\t\t$.extend( props, {\n\t\t\t\t\tposition: element.css( \"position\" ),\n\t\t\t\t\tzIndex: element.css( \"z-index\" )\n\t\t\t\t} );\n\t\t\t\t$.each( [ \"top\", \"left\", \"bottom\", \"right\" ], function( i, pos ) {\n\t\t\t\t\tprops[ pos ] = element.css( pos );\n\t\t\t\t\tif ( isNaN( parseInt( props[ pos ], 10 ) ) ) {\n\t\t\t\t\t\tprops[ pos ] = \"auto\";\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\telement.css( {\n\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: \"auto\",\n\t\t\t\t\tbottom: \"auto\"\n\t\t\t\t} );\n\t\t\t}\n\t\t\telement.css( size );\n\n\t\t\treturn wrapper.css( props ).show();\n\t\t},\n\n\t\tremoveWrapper: function( element ) {\n\t\t\tvar active = document.activeElement;\n\n\t\t\tif ( element.parent().is( \".ui-effects-wrapper\" ) ) {\n\t\t\t\telement.parent().replaceWith( element );\n\n\t\t\t\t// Fixes #7595 - Elements lose focus when wrapped.\n\t\t\t\tif ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n\t\t\t\t\t$( active ).trigger( \"focus\" );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn element;\n\t\t}\n\t} );\n}\n\n$.extend( $.effects, {\n\tversion: \"1.12.1\",\n\n\tdefine: function( name, mode, effect ) {\n\t\tif ( !effect ) {\n\t\t\teffect = mode;\n\t\t\tmode = \"effect\";\n\t\t}\n\n\t\t$.effects.effect[ name ] = effect;\n\t\t$.effects.effect[ name ].mode = mode;\n\n\t\treturn effect;\n\t},\n\n\tscaledDimensions: function( element, percent, direction ) {\n\t\tif ( percent === 0 ) {\n\t\t\treturn {\n\t\t\t\theight: 0,\n\t\t\t\twidth: 0,\n\t\t\t\touterHeight: 0,\n\t\t\t\touterWidth: 0\n\t\t\t};\n\t\t}\n\n\t\tvar x = direction !== \"horizontal\" ? ( ( percent || 100 ) / 100 ) : 1,\n\t\t\ty = direction !== \"vertical\" ? ( ( percent || 100 ) / 100 ) : 1;\n\n\t\treturn {\n\t\t\theight: element.height() * y,\n\t\t\twidth: element.width() * x,\n\t\t\touterHeight: element.outerHeight() * y,\n\t\t\touterWidth: element.outerWidth() * x\n\t\t};\n\n\t},\n\n\tclipToBox: function( animation ) {\n\t\treturn {\n\t\t\twidth: animation.clip.right - animation.clip.left,\n\t\t\theight: animation.clip.bottom - animation.clip.top,\n\t\t\tleft: animation.clip.left,\n\t\t\ttop: animation.clip.top\n\t\t};\n\t},\n\n\t// Injects recently queued functions to be first in line (after \"inprogress\")\n\tunshift: function( element, queueLength, count ) {\n\t\tvar queue = element.queue();\n\n\t\tif ( queueLength > 1 ) {\n\t\t\tqueue.splice.apply( queue,\n\t\t\t\t[ 1, 0 ].concat( queue.splice( queueLength, count ) ) );\n\t\t}\n\t\telement.dequeue();\n\t},\n\n\tsaveStyle: function( element ) {\n\t\telement.data( dataSpaceStyle, element[ 0 ].style.cssText );\n\t},\n\n\trestoreStyle: function( element ) {\n\t\telement[ 0 ].style.cssText = element.data( dataSpaceStyle ) || \"\";\n\t\telement.removeData( dataSpaceStyle );\n\t},\n\n\tmode: function( element, mode ) {\n\t\tvar hidden = element.is( \":hidden\" );\n\n\t\tif ( mode === \"toggle\" ) {\n\t\t\tmode = hidden ? \"show\" : \"hide\";\n\t\t}\n\t\tif ( hidden ? mode === \"hide\" : mode === \"show\" ) {\n\t\t\tmode = \"none\";\n\t\t}\n\t\treturn mode;\n\t},\n\n\t// Translates a [top,left] array into a baseline value\n\tgetBaseline: function( origin, original ) {\n\t\tvar y, x;\n\n\t\tswitch ( origin[ 0 ] ) {\n\t\tcase \"top\":\n\t\t\ty = 0;\n\t\t\tbreak;\n\t\tcase \"middle\":\n\t\t\ty = 0.5;\n\t\t\tbreak;\n\t\tcase \"bottom\":\n\t\t\ty = 1;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\ty = origin[ 0 ] / original.height;\n\t\t}\n\n\t\tswitch ( origin[ 1 ] ) {\n\t\tcase \"left\":\n\t\t\tx = 0;\n\t\t\tbreak;\n\t\tcase \"center\":\n\t\t\tx = 0.5;\n\t\t\tbreak;\n\t\tcase \"right\":\n\t\t\tx = 1;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tx = origin[ 1 ] / original.width;\n\t\t}\n\n\t\treturn {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t},\n\n\t// Creates a placeholder element so that the original element can be made absolute\n\tcreatePlaceholder: function( element ) {\n\t\tvar placeholder,\n\t\t\tcssPosition = element.css( \"position\" ),\n\t\t\tposition = element.position();\n\n\t\t// Lock in margins first to account for form elements, which\n\t\t// will change margin if you explicitly set height\n\t\t// see: http://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380\n\t\t// Support: Safari\n\t\telement.css( {\n\t\t\tmarginTop: element.css( \"marginTop\" ),\n\t\t\tmarginBottom: element.css( \"marginBottom\" ),\n\t\t\tmarginLeft: element.css( \"marginLeft\" ),\n\t\t\tmarginRight: element.css( \"marginRight\" )\n\t\t} )\n\t\t.outerWidth( element.outerWidth() )\n\t\t.outerHeight( element.outerHeight() );\n\n\t\tif ( /^(static|relative)/.test( cssPosition ) ) {\n\t\t\tcssPosition = \"absolute\";\n\n\t\t\tplaceholder = $( \"<\" + element[ 0 ].nodeName + \">\" ).insertAfter( element ).css( {\n\n\t\t\t\t// Convert inline to inline block to account for inline elements\n\t\t\t\t// that turn to inline block based on content (like img)\n\t\t\t\tdisplay: /^(inline|ruby)/.test( element.css( \"display\" ) ) ?\n\t\t\t\t\t\"inline-block\" :\n\t\t\t\t\t\"block\",\n\t\t\t\tvisibility: \"hidden\",\n\n\t\t\t\t// Margins need to be set to account for margin collapse\n\t\t\t\tmarginTop: element.css( \"marginTop\" ),\n\t\t\t\tmarginBottom: element.css( \"marginBottom\" ),\n\t\t\t\tmarginLeft: element.css( \"marginLeft\" ),\n\t\t\t\tmarginRight: element.css( \"marginRight\" ),\n\t\t\t\t\"float\": element.css( \"float\" )\n\t\t\t} )\n\t\t\t.outerWidth( element.outerWidth() )\n\t\t\t.outerHeight( element.outerHeight() )\n\t\t\t.addClass( \"ui-effects-placeholder\" );\n\n\t\t\telement.data( dataSpace + \"placeholder\", placeholder );\n\t\t}\n\n\t\telement.css( {\n\t\t\tposition: cssPosition,\n\t\t\tleft: position.left,\n\t\t\ttop: position.top\n\t\t} );\n\n\t\treturn placeholder;\n\t},\n\n\tremovePlaceholder: function( element ) {\n\t\tvar dataKey = dataSpace + \"placeholder\",\n\t\t\t\tplaceholder = element.data( dataKey );\n\n\t\tif ( placeholder ) {\n\t\t\tplaceholder.remove();\n\t\t\telement.removeData( dataKey );\n\t\t}\n\t},\n\n\t// Removes a placeholder if it exists and restores\n\t// properties that were modified during placeholder creation\n\tcleanUp: function( element ) {\n\t\t$.effects.restoreStyle( element );\n\t\t$.effects.removePlaceholder( element );\n\t},\n\n\tsetTransition: function( element, list, factor, value ) {\n\t\tvalue = value || {};\n\t\t$.each( list, function( i, x ) {\n\t\t\tvar unit = element.cssUnit( x );\n\t\t\tif ( unit[ 0 ] > 0 ) {\n\t\t\t\tvalue[ x ] = unit[ 0 ] * factor + unit[ 1 ];\n\t\t\t}\n\t\t} );\n\t\treturn value;\n\t}\n} );\n\n// Return an effect options object for the given parameters:\nfunction _normalizeArguments( effect, options, speed, callback ) {\n\n\t// Allow passing all options as the first parameter\n\tif ( $.isPlainObject( effect ) ) {\n\t\toptions = effect;\n\t\teffect = effect.effect;\n\t}\n\n\t// Convert to an object\n\teffect = { effect: effect };\n\n\t// Catch (effect, null, ...)\n\tif ( options == null ) {\n\t\toptions = {};\n\t}\n\n\t// Catch (effect, callback)\n\tif ( $.isFunction( options ) ) {\n\t\tcallback = options;\n\t\tspeed = null;\n\t\toptions = {};\n\t}\n\n\t// Catch (effect, speed, ?)\n\tif ( typeof options === \"number\" || $.fx.speeds[ options ] ) {\n\t\tcallback = speed;\n\t\tspeed = options;\n\t\toptions = {};\n\t}\n\n\t// Catch (effect, options, callback)\n\tif ( $.isFunction( speed ) ) {\n\t\tcallback = speed;\n\t\tspeed = null;\n\t}\n\n\t// Add options to effect\n\tif ( options ) {\n\t\t$.extend( effect, options );\n\t}\n\n\tspeed = speed || options.duration;\n\teffect.duration = $.fx.off ? 0 :\n\t\ttypeof speed === \"number\" ? speed :\n\t\tspeed in $.fx.speeds ? $.fx.speeds[ speed ] :\n\t\t$.fx.speeds._default;\n\n\teffect.complete = callback || options.complete;\n\n\treturn effect;\n}\n\nfunction standardAnimationOption( option ) {\n\n\t// Valid standard speeds (nothing, number, named speed)\n\tif ( !option || typeof option === \"number\" || $.fx.speeds[ option ] ) {\n\t\treturn true;\n\t}\n\n\t// Invalid strings - treat as \"normal\" speed\n\tif ( typeof option === \"string\" && !$.effects.effect[ option ] ) {\n\t\treturn true;\n\t}\n\n\t// Complete callback\n\tif ( $.isFunction( option ) ) {\n\t\treturn true;\n\t}\n\n\t// Options hash (but not naming an effect)\n\tif ( typeof option === \"object\" && !option.effect ) {\n\t\treturn true;\n\t}\n\n\t// Didn't match any standard API\n\treturn false;\n}\n\n$.fn.extend( {\n\teffect: function( /* effect, options, speed, callback */ ) {\n\t\tvar args = _normalizeArguments.apply( this, arguments ),\n\t\t\teffectMethod = $.effects.effect[ args.effect ],\n\t\t\tdefaultMode = effectMethod.mode,\n\t\t\tqueue = args.queue,\n\t\t\tqueueName = queue || \"fx\",\n\t\t\tcomplete = args.complete,\n\t\t\tmode = args.mode,\n\t\t\tmodes = [],\n\t\t\tprefilter = function( next ) {\n\t\t\t\tvar el = $( this ),\n\t\t\t\t\tnormalizedMode = $.effects.mode( el, mode ) || defaultMode;\n\n\t\t\t\t// Sentinel for duck-punching the :animated psuedo-selector\n\t\t\t\tel.data( dataSpaceAnimated, true );\n\n\t\t\t\t// Save effect mode for later use,\n\t\t\t\t// we can't just call $.effects.mode again later,\n\t\t\t\t// as the .show() below destroys the initial state\n\t\t\t\tmodes.push( normalizedMode );\n\n\t\t\t\t// See $.uiBackCompat inside of run() for removal of defaultMode in 1.13\n\t\t\t\tif ( defaultMode && ( normalizedMode === \"show\" ||\n\t\t\t\t\t\t( normalizedMode === defaultMode && normalizedMode === \"hide\" ) ) ) {\n\t\t\t\t\tel.show();\n\t\t\t\t}\n\n\t\t\t\tif ( !defaultMode || normalizedMode !== \"none\" ) {\n\t\t\t\t\t$.effects.saveStyle( el );\n\t\t\t\t}\n\n\t\t\t\tif ( $.isFunction( next ) ) {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( $.fx.off || !effectMethod ) {\n\n\t\t\t// Delegate to the original method (e.g., .show()) if possible\n\t\t\tif ( mode ) {\n\t\t\t\treturn this[ mode ]( args.duration, complete );\n\t\t\t} else {\n\t\t\t\treturn this.each( function() {\n\t\t\t\t\tif ( complete ) {\n\t\t\t\t\t\tcomplete.call( this );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\tfunction run( next ) {\n\t\t\tvar elem = $( this );\n\n\t\t\tfunction cleanup() {\n\t\t\t\telem.removeData( dataSpaceAnimated );\n\n\t\t\t\t$.effects.cleanUp( elem );\n\n\t\t\t\tif ( args.mode === \"hide\" ) {\n\t\t\t\t\telem.hide();\n\t\t\t\t}\n\n\t\t\t\tdone();\n\t\t\t}\n\n\t\t\tfunction done() {\n\t\t\t\tif ( $.isFunction( complete ) ) {\n\t\t\t\t\tcomplete.call( elem[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\tif ( $.isFunction( next ) ) {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override mode option on a per element basis,\n\t\t\t// as toggle can be either show or hide depending on element state\n\t\t\targs.mode = modes.shift();\n\n\t\t\tif ( $.uiBackCompat !== false && !defaultMode ) {\n\t\t\t\tif ( elem.is( \":hidden\" ) ? mode === \"hide\" : mode === \"show\" ) {\n\n\t\t\t\t\t// Call the core method to track \"olddisplay\" properly\n\t\t\t\t\telem[ mode ]();\n\t\t\t\t\tdone();\n\t\t\t\t} else {\n\t\t\t\t\teffectMethod.call( elem[ 0 ], args, done );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( args.mode === \"none\" ) {\n\n\t\t\t\t\t// Call the core method to track \"olddisplay\" properly\n\t\t\t\t\telem[ mode ]();\n\t\t\t\t\tdone();\n\t\t\t\t} else {\n\t\t\t\t\teffectMethod.call( elem[ 0 ], args, cleanup );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Run prefilter on all elements first to ensure that\n\t\t// any showing or hiding happens before placeholder creation,\n\t\t// which ensures that any layout changes are correctly captured.\n\t\treturn queue === false ?\n\t\t\tthis.each( prefilter ).each( run ) :\n\t\t\tthis.queue( queueName, prefilter ).queue( queueName, run );\n\t},\n\n\tshow: ( function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"show\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t} )( $.fn.show ),\n\n\thide: ( function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"hide\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t} )( $.fn.hide ),\n\n\ttoggle: ( function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) || typeof option === \"boolean\" ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"toggle\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t} )( $.fn.toggle ),\n\n\tcssUnit: function( key ) {\n\t\tvar style = this.css( key ),\n\t\t\tval = [];\n\n\t\t$.each( [ \"em\", \"px\", \"%\", \"pt\" ], function( i, unit ) {\n\t\t\tif ( style.indexOf( unit ) > 0 ) {\n\t\t\t\tval = [ parseFloat( style ), unit ];\n\t\t\t}\n\t\t} );\n\t\treturn val;\n\t},\n\n\tcssClip: function( clipObj ) {\n\t\tif ( clipObj ) {\n\t\t\treturn this.css( \"clip\", \"rect(\" + clipObj.top + \"px \" + clipObj.right + \"px \" +\n\t\t\t\tclipObj.bottom + \"px \" + clipObj.left + \"px)\" );\n\t\t}\n\t\treturn parseClip( this.css( \"clip\" ), this );\n\t},\n\n\ttransfer: function( options, done ) {\n\t\tvar element = $( this ),\n\t\t\ttarget = $( options.to ),\n\t\t\ttargetFixed = target.css( \"position\" ) === \"fixed\",\n\t\t\tbody = $( \"body\" ),\n\t\t\tfixTop = targetFixed ? body.scrollTop() : 0,\n\t\t\tfixLeft = targetFixed ? body.scrollLeft() : 0,\n\t\t\tendPosition = target.offset(),\n\t\t\tanimation = {\n\t\t\t\ttop: endPosition.top - fixTop,\n\t\t\t\tleft: endPosition.left - fixLeft,\n\t\t\t\theight: target.innerHeight(),\n\t\t\t\twidth: target.innerWidth()\n\t\t\t},\n\t\t\tstartPosition = element.offset(),\n\t\t\ttransfer = $( \"<div class='ui-effects-transfer'></div>\" )\n\t\t\t\t.appendTo( \"body\" )\n\t\t\t\t.addClass( options.className )\n\t\t\t\t.css( {\n\t\t\t\t\ttop: startPosition.top - fixTop,\n\t\t\t\t\tleft: startPosition.left - fixLeft,\n\t\t\t\t\theight: element.innerHeight(),\n\t\t\t\t\twidth: element.innerWidth(),\n\t\t\t\t\tposition: targetFixed ? \"fixed\" : \"absolute\"\n\t\t\t\t} )\n\t\t\t\t.animate( animation, options.duration, options.easing, function() {\n\t\t\t\t\ttransfer.remove();\n\t\t\t\t\tif ( $.isFunction( done ) ) {\n\t\t\t\t\t\tdone();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t}\n} );\n\nfunction parseClip( str, element ) {\n\t\tvar outerWidth = element.outerWidth(),\n\t\t\touterHeight = element.outerHeight(),\n\t\t\tclipRegex = /^rect\\((-?\\d*\\.?\\d*px|-?\\d+%|auto),?\\s*(-?\\d*\\.?\\d*px|-?\\d+%|auto),?\\s*(-?\\d*\\.?\\d*px|-?\\d+%|auto),?\\s*(-?\\d*\\.?\\d*px|-?\\d+%|auto)\\)$/,\n\t\t\tvalues = clipRegex.exec( str ) || [ \"\", 0, outerWidth, outerHeight, 0 ];\n\n\t\treturn {\n\t\t\ttop: parseFloat( values[ 1 ] ) || 0,\n\t\t\tright: values[ 2 ] === \"auto\" ? outerWidth : parseFloat( values[ 2 ] ),\n\t\t\tbottom: values[ 3 ] === \"auto\" ? outerHeight : parseFloat( values[ 3 ] ),\n\t\t\tleft: parseFloat( values[ 4 ] ) || 0\n\t\t};\n}\n\n$.fx.step.clip = function( fx ) {\n\tif ( !fx.clipInit ) {\n\t\tfx.start = $( fx.elem ).cssClip();\n\t\tif ( typeof fx.end === \"string\" ) {\n\t\t\tfx.end = parseClip( fx.end, fx.elem );\n\t\t}\n\t\tfx.clipInit = true;\n\t}\n\n\t$( fx.elem ).cssClip( {\n\t\ttop: fx.pos * ( fx.end.top - fx.start.top ) + fx.start.top,\n\t\tright: fx.pos * ( fx.end.right - fx.start.right ) + fx.start.right,\n\t\tbottom: fx.pos * ( fx.end.bottom - fx.start.bottom ) + fx.start.bottom,\n\t\tleft: fx.pos * ( fx.end.left - fx.start.left ) + fx.start.left\n\t} );\n};\n\n} )();\n\n/******************************************************************************/\n/*********************************** EASING ***********************************/\n/******************************************************************************/\n\n( function() {\n\n// Based on easing equations from Robert Penner (http://www.robertpenner.com/easing)\n\nvar baseEasings = {};\n\n$.each( [ \"Quad\", \"Cubic\", \"Quart\", \"Quint\", \"Expo\" ], function( i, name ) {\n\tbaseEasings[ name ] = function( p ) {\n\t\treturn Math.pow( p, i + 2 );\n\t};\n} );\n\n$.extend( baseEasings, {\n\tSine: function( p ) {\n\t\treturn 1 - Math.cos( p * Math.PI / 2 );\n\t},\n\tCirc: function( p ) {\n\t\treturn 1 - Math.sqrt( 1 - p * p );\n\t},\n\tElastic: function( p ) {\n\t\treturn p === 0 || p === 1 ? p :\n\t\t\t-Math.pow( 2, 8 * ( p - 1 ) ) * Math.sin( ( ( p - 1 ) * 80 - 7.5 ) * Math.PI / 15 );\n\t},\n\tBack: function( p ) {\n\t\treturn p * p * ( 3 * p - 2 );\n\t},\n\tBounce: function( p ) {\n\t\tvar pow2,\n\t\t\tbounce = 4;\n\n\t\twhile ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}\n\t\treturn 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );\n\t}\n} );\n\n$.each( baseEasings, function( name, easeIn ) {\n\t$.easing[ \"easeIn\" + name ] = easeIn;\n\t$.easing[ \"easeOut\" + name ] = function( p ) {\n\t\treturn 1 - easeIn( 1 - p );\n\t};\n\t$.easing[ \"easeInOut\" + name ] = function( p ) {\n\t\treturn p < 0.5 ?\n\t\t\teaseIn( p * 2 ) / 2 :\n\t\t\t1 - easeIn( p * -2 + 2 ) / 2;\n\t};\n} );\n\n} )();\n\nvar effect = $.effects;\n\n\n/*!\n * jQuery UI Effects Blind 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Blind Effect\n//>>group: Effects\n//>>description: Blinds the element.\n//>>docs: http://api.jqueryui.com/blind-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectBlind = $.effects.define( \"blind\", \"hide\", function( options, done ) {\n\tvar map = {\n\t\t\tup: [ \"bottom\", \"top\" ],\n\t\t\tvertical: [ \"bottom\", \"top\" ],\n\t\t\tdown: [ \"top\", \"bottom\" ],\n\t\t\tleft: [ \"right\", \"left\" ],\n\t\t\thorizontal: [ \"right\", \"left\" ],\n\t\t\tright: [ \"left\", \"right\" ]\n\t\t},\n\t\telement = $( this ),\n\t\tdirection = options.direction || \"up\",\n\t\tstart = element.cssClip(),\n\t\tanimate = { clip: $.extend( {}, start ) },\n\t\tplaceholder = $.effects.createPlaceholder( element );\n\n\tanimate.clip[ map[ direction ][ 0 ] ] = animate.clip[ map[ direction ][ 1 ] ];\n\n\tif ( options.mode === \"show\" ) {\n\t\telement.cssClip( animate.clip );\n\t\tif ( placeholder ) {\n\t\t\tplaceholder.css( $.effects.clipToBox( animate ) );\n\t\t}\n\n\t\tanimate.clip = start;\n\t}\n\n\tif ( placeholder ) {\n\t\tplaceholder.animate( $.effects.clipToBox( animate ), options.duration, options.easing );\n\t}\n\n\telement.animate( animate, {\n\t\tqueue: false,\n\t\tduration: options.duration,\n\t\teasing: options.easing,\n\t\tcomplete: done\n\t} );\n} );\n\n\n/*!\n * jQuery UI Effects Bounce 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Bounce Effect\n//>>group: Effects\n//>>description: Bounces an element horizontally or vertically n times.\n//>>docs: http://api.jqueryui.com/bounce-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectBounce = $.effects.define( \"bounce\", function( options, done ) {\n\tvar upAnim, downAnim, refValue,\n\t\telement = $( this ),\n\n\t\t// Defaults:\n\t\tmode = options.mode,\n\t\thide = mode === \"hide\",\n\t\tshow = mode === \"show\",\n\t\tdirection = options.direction || \"up\",\n\t\tdistance = options.distance,\n\t\ttimes = options.times || 5,\n\n\t\t// Number of internal animations\n\t\tanims = times * 2 + ( show || hide ? 1 : 0 ),\n\t\tspeed = options.duration / anims,\n\t\teasing = options.easing,\n\n\t\t// Utility:\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tmotion = ( direction === \"up\" || direction === \"left\" ),\n\t\ti = 0,\n\n\t\tqueuelen = element.queue().length;\n\n\t$.effects.createPlaceholder( element );\n\n\trefValue = element.css( ref );\n\n\t// Default distance for the BIGGEST bounce is the outer Distance / 3\n\tif ( !distance ) {\n\t\tdistance = element[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]() / 3;\n\t}\n\n\tif ( show ) {\n\t\tdownAnim = { opacity: 1 };\n\t\tdownAnim[ ref ] = refValue;\n\n\t\t// If we are showing, force opacity 0 and set the initial position\n\t\t// then do the \"first\" animation\n\t\telement\n\t\t\t.css( \"opacity\", 0 )\n\t\t\t.css( ref, motion ? -distance * 2 : distance * 2 )\n\t\t\t.animate( downAnim, speed, easing );\n\t}\n\n\t// Start at the smallest distance if we are hiding\n\tif ( hide ) {\n\t\tdistance = distance / Math.pow( 2, times - 1 );\n\t}\n\n\tdownAnim = {};\n\tdownAnim[ ref ] = refValue;\n\n\t// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here\n\tfor ( ; i < times; i++ ) {\n\t\tupAnim = {};\n\t\tupAnim[ ref ] = ( motion ? \"-=\" : \"+=\" ) + distance;\n\n\t\telement\n\t\t\t.animate( upAnim, speed, easing )\n\t\t\t.animate( downAnim, speed, easing );\n\n\t\tdistance = hide ? distance * 2 : distance / 2;\n\t}\n\n\t// Last Bounce when Hiding\n\tif ( hide ) {\n\t\tupAnim = { opacity: 0 };\n\t\tupAnim[ ref ] = ( motion ? \"-=\" : \"+=\" ) + distance;\n\n\t\telement.animate( upAnim, speed, easing );\n\t}\n\n\telement.queue( done );\n\n\t$.effects.unshift( element, queuelen, anims + 1 );\n} );\n\n\n/*!\n * jQuery UI Effects Clip 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Clip Effect\n//>>group: Effects\n//>>description: Clips the element on and off like an old TV.\n//>>docs: http://api.jqueryui.com/clip-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectClip = $.effects.define( \"clip\", \"hide\", function( options, done ) {\n\tvar start,\n\t\tanimate = {},\n\t\telement = $( this ),\n\t\tdirection = options.direction || \"vertical\",\n\t\tboth = direction === \"both\",\n\t\thorizontal = both || direction === \"horizontal\",\n\t\tvertical = both || direction === \"vertical\";\n\n\tstart = element.cssClip();\n\tanimate.clip = {\n\t\ttop: vertical ? ( start.bottom - start.top ) / 2 : start.top,\n\t\tright: horizontal ? ( start.right - start.left ) / 2 : start.right,\n\t\tbottom: vertical ? ( start.bottom - start.top ) / 2 : start.bottom,\n\t\tleft: horizontal ? ( start.right - start.left ) / 2 : start.left\n\t};\n\n\t$.effects.createPlaceholder( element );\n\n\tif ( options.mode === \"show\" ) {\n\t\telement.cssClip( animate.clip );\n\t\tanimate.clip = start;\n\t}\n\n\telement.animate( animate, {\n\t\tqueue: false,\n\t\tduration: options.duration,\n\t\teasing: options.easing,\n\t\tcomplete: done\n\t} );\n\n} );\n\n\n/*!\n * jQuery UI Effects Drop 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Drop Effect\n//>>group: Effects\n//>>description: Moves an element in one direction and hides it at the same time.\n//>>docs: http://api.jqueryui.com/drop-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectDrop = $.effects.define( \"drop\", \"hide\", function( options, done ) {\n\n\tvar distance,\n\t\telement = $( this ),\n\t\tmode = options.mode,\n\t\tshow = mode === \"show\",\n\t\tdirection = options.direction || \"left\",\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tmotion = ( direction === \"up\" || direction === \"left\" ) ? \"-=\" : \"+=\",\n\t\toppositeMotion = ( motion === \"+=\" ) ? \"-=\" : \"+=\",\n\t\tanimation = {\n\t\t\topacity: 0\n\t\t};\n\n\t$.effects.createPlaceholder( element );\n\n\tdistance = options.distance ||\n\t\telement[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]( true ) / 2;\n\n\tanimation[ ref ] = motion + distance;\n\n\tif ( show ) {\n\t\telement.css( animation );\n\n\t\tanimation[ ref ] = oppositeMotion + distance;\n\t\tanimation.opacity = 1;\n\t}\n\n\t// Animate\n\telement.animate( animation, {\n\t\tqueue: false,\n\t\tduration: options.duration,\n\t\teasing: options.easing,\n\t\tcomplete: done\n\t} );\n} );\n\n\n/*!\n * jQuery UI Effects Explode 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Explode Effect\n//>>group: Effects\n// jscs:disable maximumLineLength\n//>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness.\n// jscs:enable maximumLineLength\n//>>docs: http://api.jqueryui.com/explode-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectExplode = $.effects.define( \"explode\", \"hide\", function( options, done ) {\n\n\tvar i, j, left, top, mx, my,\n\t\trows = options.pieces ? Math.round( Math.sqrt( options.pieces ) ) : 3,\n\t\tcells = rows,\n\t\telement = $( this ),\n\t\tmode = options.mode,\n\t\tshow = mode === \"show\",\n\n\t\t// Show and then visibility:hidden the element before calculating offset\n\t\toffset = element.show().css( \"visibility\", \"hidden\" ).offset(),\n\n\t\t// Width and height of a piece\n\t\twidth = Math.ceil( element.outerWidth() / cells ),\n\t\theight = Math.ceil( element.outerHeight() / rows ),\n\t\tpieces = [];\n\n\t// Children animate complete:\n\tfunction childComplete() {\n\t\tpieces.push( this );\n\t\tif ( pieces.length === rows * cells ) {\n\t\t\tanimComplete();\n\t\t}\n\t}\n\n\t// Clone the element for each row and cell.\n\tfor ( i = 0; i < rows; i++ ) { // ===>\n\t\ttop = offset.top + i * height;\n\t\tmy = i - ( rows - 1 ) / 2;\n\n\t\tfor ( j = 0; j < cells; j++ ) { // |||\n\t\t\tleft = offset.left + j * width;\n\t\t\tmx = j - ( cells - 1 ) / 2;\n\n\t\t\t// Create a clone of the now hidden main element that will be absolute positioned\n\t\t\t// within a wrapper div off the -left and -top equal to size of our pieces\n\t\t\telement\n\t\t\t\t.clone()\n\t\t\t\t.appendTo( \"body\" )\n\t\t\t\t.wrap( \"<div></div>\" )\n\t\t\t\t.css( {\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tvisibility: \"visible\",\n\t\t\t\t\tleft: -j * width,\n\t\t\t\t\ttop: -i * height\n\t\t\t\t} )\n\n\t\t\t\t// Select the wrapper - make it overflow: hidden and absolute positioned based on\n\t\t\t\t// where the original was located +left and +top equal to the size of pieces\n\t\t\t\t.parent()\n\t\t\t\t\t.addClass( \"ui-effects-explode\" )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\twidth: width,\n\t\t\t\t\t\theight: height,\n\t\t\t\t\t\tleft: left + ( show ? mx * width : 0 ),\n\t\t\t\t\t\ttop: top + ( show ? my * height : 0 ),\n\t\t\t\t\t\topacity: show ? 0 : 1\n\t\t\t\t\t} )\n\t\t\t\t\t.animate( {\n\t\t\t\t\t\tleft: left + ( show ? 0 : mx * width ),\n\t\t\t\t\t\ttop: top + ( show ? 0 : my * height ),\n\t\t\t\t\t\topacity: show ? 1 : 0\n\t\t\t\t\t}, options.duration || 500, options.easing, childComplete );\n\t\t}\n\t}\n\n\tfunction animComplete() {\n\t\telement.css( {\n\t\t\tvisibility: \"visible\"\n\t\t} );\n\t\t$( pieces ).remove();\n\t\tdone();\n\t}\n} );\n\n\n/*!\n * jQuery UI Effects Fade 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Fade Effect\n//>>group: Effects\n//>>description: Fades the element.\n//>>docs: http://api.jqueryui.com/fade-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectFade = $.effects.define( \"fade\", \"toggle\", function( options, done ) {\n\tvar show = options.mode === \"show\";\n\n\t$( this )\n\t\t.css( \"opacity\", show ? 0 : 1 )\n\t\t.animate( {\n\t\t\topacity: show ? 1 : 0\n\t\t}, {\n\t\t\tqueue: false,\n\t\t\tduration: options.duration,\n\t\t\teasing: options.easing,\n\t\t\tcomplete: done\n\t\t} );\n} );\n\n\n/*!\n * jQuery UI Effects Fold 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Fold Effect\n//>>group: Effects\n//>>description: Folds an element first horizontally and then vertically.\n//>>docs: http://api.jqueryui.com/fold-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectFold = $.effects.define( \"fold\", \"hide\", function( options, done ) {\n\n\t// Create element\n\tvar element = $( this ),\n\t\tmode = options.mode,\n\t\tshow = mode === \"show\",\n\t\thide = mode === \"hide\",\n\t\tsize = options.size || 15,\n\t\tpercent = /([0-9]+)%/.exec( size ),\n\t\thorizFirst = !!options.horizFirst,\n\t\tref = horizFirst ? [ \"right\", \"bottom\" ] : [ \"bottom\", \"right\" ],\n\t\tduration = options.duration / 2,\n\n\t\tplaceholder = $.effects.createPlaceholder( element ),\n\n\t\tstart = element.cssClip(),\n\t\tanimation1 = { clip: $.extend( {}, start ) },\n\t\tanimation2 = { clip: $.extend( {}, start ) },\n\n\t\tdistance = [ start[ ref[ 0 ] ], start[ ref[ 1 ] ] ],\n\n\t\tqueuelen = element.queue().length;\n\n\tif ( percent ) {\n\t\tsize = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];\n\t}\n\tanimation1.clip[ ref[ 0 ] ] = size;\n\tanimation2.clip[ ref[ 0 ] ] = size;\n\tanimation2.clip[ ref[ 1 ] ] = 0;\n\n\tif ( show ) {\n\t\telement.cssClip( animation2.clip );\n\t\tif ( placeholder ) {\n\t\t\tplaceholder.css( $.effects.clipToBox( animation2 ) );\n\t\t}\n\n\t\tanimation2.clip = start;\n\t}\n\n\t// Animate\n\telement\n\t\t.queue( function( next ) {\n\t\t\tif ( placeholder ) {\n\t\t\t\tplaceholder\n\t\t\t\t\t.animate( $.effects.clipToBox( animation1 ), duration, options.easing )\n\t\t\t\t\t.animate( $.effects.clipToBox( animation2 ), duration, options.easing );\n\t\t\t}\n\n\t\t\tnext();\n\t\t} )\n\t\t.animate( animation1, duration, options.easing )\n\t\t.animate( animation2, duration, options.easing )\n\t\t.queue( done );\n\n\t$.effects.unshift( element, queuelen, 4 );\n} );\n\n\n/*!\n * jQuery UI Effects Highlight 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Highlight Effect\n//>>group: Effects\n//>>description: Highlights the background of an element in a defined color for a custom duration.\n//>>docs: http://api.jqueryui.com/highlight-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectHighlight = $.effects.define( \"highlight\", \"show\", function( options, done ) {\n\tvar element = $( this ),\n\t\tanimation = {\n\t\t\tbackgroundColor: element.css( \"backgroundColor\" )\n\t\t};\n\n\tif ( options.mode === \"hide\" ) {\n\t\tanimation.opacity = 0;\n\t}\n\n\t$.effects.saveStyle( element );\n\n\telement\n\t\t.css( {\n\t\t\tbackgroundImage: \"none\",\n\t\t\tbackgroundColor: options.color || \"#ffff99\"\n\t\t} )\n\t\t.animate( animation, {\n\t\t\tqueue: false,\n\t\t\tduration: options.duration,\n\t\t\teasing: options.easing,\n\t\t\tcomplete: done\n\t\t} );\n} );\n\n\n/*!\n * jQuery UI Effects Size 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Size Effect\n//>>group: Effects\n//>>description: Resize an element to a specified width and height.\n//>>docs: http://api.jqueryui.com/size-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectSize = $.effects.define( \"size\", function( options, done ) {\n\n\t// Create element\n\tvar baseline, factor, temp,\n\t\telement = $( this ),\n\n\t\t// Copy for children\n\t\tcProps = [ \"fontSize\" ],\n\t\tvProps = [ \"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\" ],\n\t\thProps = [ \"borderLeftWidth\", \"borderRightWidth\", \"paddingLeft\", \"paddingRight\" ],\n\n\t\t// Set options\n\t\tmode = options.mode,\n\t\trestore = mode !== \"effect\",\n\t\tscale = options.scale || \"both\",\n\t\torigin = options.origin || [ \"middle\", \"center\" ],\n\t\tposition = element.css( \"position\" ),\n\t\tpos = element.position(),\n\t\toriginal = $.effects.scaledDimensions( element ),\n\t\tfrom = options.from || original,\n\t\tto = options.to || $.effects.scaledDimensions( element, 0 );\n\n\t$.effects.createPlaceholder( element );\n\n\tif ( mode === \"show\" ) {\n\t\ttemp = from;\n\t\tfrom = to;\n\t\tto = temp;\n\t}\n\n\t// Set scaling factor\n\tfactor = {\n\t\tfrom: {\n\t\t\ty: from.height / original.height,\n\t\t\tx: from.width / original.width\n\t\t},\n\t\tto: {\n\t\t\ty: to.height / original.height,\n\t\t\tx: to.width / original.width\n\t\t}\n\t};\n\n\t// Scale the css box\n\tif ( scale === \"box\" || scale === \"both\" ) {\n\n\t\t// Vertical props scaling\n\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\tfrom = $.effects.setTransition( element, vProps, factor.from.y, from );\n\t\t\tto = $.effects.setTransition( element, vProps, factor.to.y, to );\n\t\t}\n\n\t\t// Horizontal props scaling\n\t\tif ( factor.from.x !== factor.to.x ) {\n\t\t\tfrom = $.effects.setTransition( element, hProps, factor.from.x, from );\n\t\t\tto = $.effects.setTransition( element, hProps, factor.to.x, to );\n\t\t}\n\t}\n\n\t// Scale the content\n\tif ( scale === \"content\" || scale === \"both\" ) {\n\n\t\t// Vertical props scaling\n\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\tfrom = $.effects.setTransition( element, cProps, factor.from.y, from );\n\t\t\tto = $.effects.setTransition( element, cProps, factor.to.y, to );\n\t\t}\n\t}\n\n\t// Adjust the position properties based on the provided origin points\n\tif ( origin ) {\n\t\tbaseline = $.effects.getBaseline( origin, original );\n\t\tfrom.top = ( original.outerHeight - from.outerHeight ) * baseline.y + pos.top;\n\t\tfrom.left = ( original.outerWidth - from.outerWidth ) * baseline.x + pos.left;\n\t\tto.top = ( original.outerHeight - to.outerHeight ) * baseline.y + pos.top;\n\t\tto.left = ( original.outerWidth - to.outerWidth ) * baseline.x + pos.left;\n\t}\n\telement.css( from );\n\n\t// Animate the children if desired\n\tif ( scale === \"content\" || scale === \"both\" ) {\n\n\t\tvProps = vProps.concat( [ \"marginTop\", \"marginBottom\" ] ).concat( cProps );\n\t\thProps = hProps.concat( [ \"marginLeft\", \"marginRight\" ] );\n\n\t\t// Only animate children with width attributes specified\n\t\t// TODO: is this right? should we include anything with css width specified as well\n\t\telement.find( \"*[width]\" ).each( function() {\n\t\t\tvar child = $( this ),\n\t\t\t\tchildOriginal = $.effects.scaledDimensions( child ),\n\t\t\t\tchildFrom = {\n\t\t\t\t\theight: childOriginal.height * factor.from.y,\n\t\t\t\t\twidth: childOriginal.width * factor.from.x,\n\t\t\t\t\touterHeight: childOriginal.outerHeight * factor.from.y,\n\t\t\t\t\touterWidth: childOriginal.outerWidth * factor.from.x\n\t\t\t\t},\n\t\t\t\tchildTo = {\n\t\t\t\t\theight: childOriginal.height * factor.to.y,\n\t\t\t\t\twidth: childOriginal.width * factor.to.x,\n\t\t\t\t\touterHeight: childOriginal.height * factor.to.y,\n\t\t\t\t\touterWidth: childOriginal.width * factor.to.x\n\t\t\t\t};\n\n\t\t\t// Vertical props scaling\n\t\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\t\tchildFrom = $.effects.setTransition( child, vProps, factor.from.y, childFrom );\n\t\t\t\tchildTo = $.effects.setTransition( child, vProps, factor.to.y, childTo );\n\t\t\t}\n\n\t\t\t// Horizontal props scaling\n\t\t\tif ( factor.from.x !== factor.to.x ) {\n\t\t\t\tchildFrom = $.effects.setTransition( child, hProps, factor.from.x, childFrom );\n\t\t\t\tchildTo = $.effects.setTransition( child, hProps, factor.to.x, childTo );\n\t\t\t}\n\n\t\t\tif ( restore ) {\n\t\t\t\t$.effects.saveStyle( child );\n\t\t\t}\n\n\t\t\t// Animate children\n\t\t\tchild.css( childFrom );\n\t\t\tchild.animate( childTo, options.duration, options.easing, function() {\n\n\t\t\t\t// Restore children\n\t\t\t\tif ( restore ) {\n\t\t\t\t\t$.effects.restoreStyle( child );\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Animate\n\telement.animate( to, {\n\t\tqueue: false,\n\t\tduration: options.duration,\n\t\teasing: options.easing,\n\t\tcomplete: function() {\n\n\t\t\tvar offset = element.offset();\n\n\t\t\tif ( to.opacity === 0 ) {\n\t\t\t\telement.css( \"opacity\", from.opacity );\n\t\t\t}\n\n\t\t\tif ( !restore ) {\n\t\t\t\telement\n\t\t\t\t\t.css( \"position\", position === \"static\" ? \"relative\" : position )\n\t\t\t\t\t.offset( offset );\n\n\t\t\t\t// Need to save style here so that automatic style restoration\n\t\t\t\t// doesn't restore to the original styles from before the animation.\n\t\t\t\t$.effects.saveStyle( element );\n\t\t\t}\n\n\t\t\tdone();\n\t\t}\n\t} );\n\n} );\n\n\n/*!\n * jQuery UI Effects Scale 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Scale Effect\n//>>group: Effects\n//>>description: Grows or shrinks an element and its content.\n//>>docs: http://api.jqueryui.com/scale-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectScale = $.effects.define( \"scale\", function( options, done ) {\n\n\t// Create element\n\tvar el = $( this ),\n\t\tmode = options.mode,\n\t\tpercent = parseInt( options.percent, 10 ) ||\n\t\t\t( parseInt( options.percent, 10 ) === 0 ? 0 : ( mode !== \"effect\" ? 0 : 100 ) ),\n\n\t\tnewOptions = $.extend( true, {\n\t\t\tfrom: $.effects.scaledDimensions( el ),\n\t\t\tto: $.effects.scaledDimensions( el, percent, options.direction || \"both\" ),\n\t\t\torigin: options.origin || [ \"middle\", \"center\" ]\n\t\t}, options );\n\n\t// Fade option to support puff\n\tif ( options.fade ) {\n\t\tnewOptions.from.opacity = 1;\n\t\tnewOptions.to.opacity = 0;\n\t}\n\n\t$.effects.effect.size.call( this, newOptions, done );\n} );\n\n\n/*!\n * jQuery UI Effects Puff 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Puff Effect\n//>>group: Effects\n//>>description: Creates a puff effect by scaling the element up and hiding it at the same time.\n//>>docs: http://api.jqueryui.com/puff-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectPuff = $.effects.define( \"puff\", \"hide\", function( options, done ) {\n\tvar newOptions = $.extend( true, {}, options, {\n\t\tfade: true,\n\t\tpercent: parseInt( options.percent, 10 ) || 150\n\t} );\n\n\t$.effects.effect.scale.call( this, newOptions, done );\n} );\n\n\n/*!\n * jQuery UI Effects Pulsate 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Pulsate Effect\n//>>group: Effects\n//>>description: Pulsates an element n times by changing the opacity to zero and back.\n//>>docs: http://api.jqueryui.com/pulsate-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectPulsate = $.effects.define( \"pulsate\", \"show\", function( options, done ) {\n\tvar element = $( this ),\n\t\tmode = options.mode,\n\t\tshow = mode === \"show\",\n\t\thide = mode === \"hide\",\n\t\tshowhide = show || hide,\n\n\t\t// Showing or hiding leaves off the \"last\" animation\n\t\tanims = ( ( options.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),\n\t\tduration = options.duration / anims,\n\t\tanimateTo = 0,\n\t\ti = 1,\n\t\tqueuelen = element.queue().length;\n\n\tif ( show || !element.is( \":visible\" ) ) {\n\t\telement.css( \"opacity\", 0 ).show();\n\t\tanimateTo = 1;\n\t}\n\n\t// Anims - 1 opacity \"toggles\"\n\tfor ( ; i < anims; i++ ) {\n\t\telement.animate( { opacity: animateTo }, duration, options.easing );\n\t\tanimateTo = 1 - animateTo;\n\t}\n\n\telement.animate( { opacity: animateTo }, duration, options.easing );\n\n\telement.queue( done );\n\n\t$.effects.unshift( element, queuelen, anims + 1 );\n} );\n\n\n/*!\n * jQuery UI Effects Shake 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Shake Effect\n//>>group: Effects\n//>>description: Shakes an element horizontally or vertically n times.\n//>>docs: http://api.jqueryui.com/shake-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectShake = $.effects.define( \"shake\", function( options, done ) {\n\n\tvar i = 1,\n\t\telement = $( this ),\n\t\tdirection = options.direction || \"left\",\n\t\tdistance = options.distance || 20,\n\t\ttimes = options.times || 3,\n\t\tanims = times * 2 + 1,\n\t\tspeed = Math.round( options.duration / anims ),\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tpositiveMotion = ( direction === \"up\" || direction === \"left\" ),\n\t\tanimation = {},\n\t\tanimation1 = {},\n\t\tanimation2 = {},\n\n\t\tqueuelen = element.queue().length;\n\n\t$.effects.createPlaceholder( element );\n\n\t// Animation\n\tanimation[ ref ] = ( positiveMotion ? \"-=\" : \"+=\" ) + distance;\n\tanimation1[ ref ] = ( positiveMotion ? \"+=\" : \"-=\" ) + distance * 2;\n\tanimation2[ ref ] = ( positiveMotion ? \"-=\" : \"+=\" ) + distance * 2;\n\n\t// Animate\n\telement.animate( animation, speed, options.easing );\n\n\t// Shakes\n\tfor ( ; i < times; i++ ) {\n\t\telement\n\t\t\t.animate( animation1, speed, options.easing )\n\t\t\t.animate( animation2, speed, options.easing );\n\t}\n\n\telement\n\t\t.animate( animation1, speed, options.easing )\n\t\t.animate( animation, speed / 2, options.easing )\n\t\t.queue( done );\n\n\t$.effects.unshift( element, queuelen, anims + 1 );\n} );\n\n\n/*!\n * jQuery UI Effects Slide 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Slide Effect\n//>>group: Effects\n//>>description: Slides an element in and out of the viewport.\n//>>docs: http://api.jqueryui.com/slide-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectSlide = $.effects.define( \"slide\", \"show\", function( options, done ) {\n\tvar startClip, startRef,\n\t\telement = $( this ),\n\t\tmap = {\n\t\t\tup: [ \"bottom\", \"top\" ],\n\t\t\tdown: [ \"top\", \"bottom\" ],\n\t\t\tleft: [ \"right\", \"left\" ],\n\t\t\tright: [ \"left\", \"right\" ]\n\t\t},\n\t\tmode = options.mode,\n\t\tdirection = options.direction || \"left\",\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tpositiveMotion = ( direction === \"up\" || direction === \"left\" ),\n\t\tdistance = options.distance ||\n\t\t\telement[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]( true ),\n\t\tanimation = {};\n\n\t$.effects.createPlaceholder( element );\n\n\tstartClip = element.cssClip();\n\tstartRef = element.position()[ ref ];\n\n\t// Define hide animation\n\tanimation[ ref ] = ( positiveMotion ? -1 : 1 ) * distance + startRef;\n\tanimation.clip = element.cssClip();\n\tanimation.clip[ map[ direction ][ 1 ] ] = animation.clip[ map[ direction ][ 0 ] ];\n\n\t// Reverse the animation if we're showing\n\tif ( mode === \"show\" ) {\n\t\telement.cssClip( animation.clip );\n\t\telement.css( ref, animation[ ref ] );\n\t\tanimation.clip = startClip;\n\t\tanimation[ ref ] = startRef;\n\t}\n\n\t// Actually animate\n\telement.animate( animation, {\n\t\tqueue: false,\n\t\tduration: options.duration,\n\t\teasing: options.easing,\n\t\tcomplete: done\n\t} );\n} );\n\n\n/*!\n * jQuery UI Effects Transfer 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Transfer Effect\n//>>group: Effects\n//>>description: Displays a transfer effect from one element to another.\n//>>docs: http://api.jqueryui.com/transfer-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effect;\nif ( $.uiBackCompat !== false ) {\n\teffect = $.effects.define( \"transfer\", function( options, done ) {\n\t\t$( this ).transfer( options, done );\n\t} );\n}\nvar effectsEffectTransfer = effect;\n\n\n\n\n}));"
  },
  {
    "path": "example/pages/include/jquery_ui/themes/start/jquery-ui.css",
    "content": "/*! jQuery UI - v1.12.1 - 2016-09-14\n* http://jqueryui.com\n* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css\n* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=2191c0&bgTextureHeader=gloss_wave&bgImgOpacityHeader=75&borderColorHeader=4297d7&fcHeader=eaf5f7&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=0078ae&bgColorDefault=0078ae&bgTextureDefault=glass&bgImgOpacityDefault=45&borderColorDefault=77d5f7&fcDefault=ffffff&iconColorDefault=e0fdff&bgColorHover=79c9ec&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=448dae&fcHover=026890&iconColorHover=056b93&bgColorActive=6eac2c&bgTextureActive=gloss_wave&bgImgOpacityActive=50&borderColorActive=acdd4a&fcActive=ffffff&iconColorActive=f5e175&bgColorHighlight=f8da4e&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcd113&fcHighlight=915608&iconColorHighlight=f7a50d&bgColorError=e14f1c&bgTextureError=gloss_wave&bgImgOpacityError=45&borderColorError=cd0a0a&fcError=ffffff&iconColorError=fcd113&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=75&opacityOverlay=30&bgColorShadow=999999&bgTextureShadow=flat&bgImgOpacityShadow=55&opacityShadow=45&thicknessShadow=0px&offsetTopShadow=5px&offsetLeftShadow=5px&cornerRadiusShadow=5px\n* Copyright jQuery Foundation and other contributors; Licensed MIT */\n\n/* Layout helpers\n----------------------------------*/\n.ui-helper-hidden {\n\tdisplay: none;\n}\n.ui-helper-hidden-accessible {\n\tborder: 0;\n\tclip: rect(0 0 0 0);\n\theight: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\twidth: 1px;\n}\n.ui-helper-reset {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\toutline: 0;\n\tline-height: 1.3;\n\ttext-decoration: none;\n\tfont-size: 100%;\n\tlist-style: none;\n}\n.ui-helper-clearfix:before,\n.ui-helper-clearfix:after {\n\tcontent: \"\";\n\tdisplay: table;\n\tborder-collapse: collapse;\n}\n.ui-helper-clearfix:after {\n\tclear: both;\n}\n.ui-helper-zfix {\n\twidth: 100%;\n\theight: 100%;\n\ttop: 0;\n\tleft: 0;\n\tposition: absolute;\n\topacity: 0;\n\tfilter:Alpha(Opacity=0); /* support: IE8 */\n}\n\n.ui-front {\n\tz-index: 100;\n}\n\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-disabled {\n\tcursor: default !important;\n\tpointer-events: none;\n}\n\n\n/* Icons\n----------------------------------*/\n.ui-icon {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tmargin-top: -.25em;\n\tposition: relative;\n\ttext-indent: -99999px;\n\toverflow: hidden;\n\tbackground-repeat: no-repeat;\n}\n\n.ui-widget-icon-block {\n\tleft: 50%;\n\tmargin-left: -8px;\n\tdisplay: block;\n}\n\n/* Misc visuals\n----------------------------------*/\n\n/* Overlays */\n.ui-widget-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n}\n.ui-accordion .ui-accordion-header {\n\tdisplay: block;\n\tcursor: pointer;\n\tposition: relative;\n\tmargin: 2px 0 0 0;\n\tpadding: .5em .5em .5em .7em;\n\tfont-size: 100%;\n}\n.ui-accordion .ui-accordion-content {\n\tpadding: 1em 2.2em;\n\tborder-top: 0;\n\toverflow: auto;\n}\n.ui-autocomplete {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tcursor: default;\n}\n.ui-menu {\n\tlist-style: none;\n\tpadding: 0;\n\tmargin: 0;\n\tdisplay: block;\n\toutline: 0;\n}\n.ui-menu .ui-menu {\n\tposition: absolute;\n}\n.ui-menu .ui-menu-item {\n\tmargin: 0;\n\tcursor: pointer;\n\t/* support: IE10, see #8844 */\n\tlist-style-image: url(\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\");\n}\n.ui-menu .ui-menu-item-wrapper {\n\tposition: relative;\n\tpadding: 3px 1em 3px .4em;\n}\n.ui-menu .ui-menu-divider {\n\tmargin: 5px 0;\n\theight: 0;\n\tfont-size: 0;\n\tline-height: 0;\n\tborder-width: 1px 0 0 0;\n}\n.ui-menu .ui-state-focus,\n.ui-menu .ui-state-active {\n\tmargin: -1px;\n}\n\n/* icon support */\n.ui-menu-icons {\n\tposition: relative;\n}\n.ui-menu-icons .ui-menu-item-wrapper {\n\tpadding-left: 2em;\n}\n\n/* left-aligned */\n.ui-menu .ui-icon {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: .2em;\n\tmargin: auto 0;\n}\n\n/* right-aligned */\n.ui-menu .ui-menu-icon {\n\tleft: auto;\n\tright: 0;\n}\n.ui-button {\n\tpadding: .4em 1em;\n\tdisplay: inline-block;\n\tposition: relative;\n\tline-height: normal;\n\tmargin-right: .1em;\n\tcursor: pointer;\n\tvertical-align: middle;\n\ttext-align: center;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\n\t/* Support: IE <= 11 */\n\toverflow: visible;\n}\n\n.ui-button,\n.ui-button:link,\n.ui-button:visited,\n.ui-button:hover,\n.ui-button:active {\n\ttext-decoration: none;\n}\n\n/* to make room for the icon, a width needs to be set here */\n.ui-button-icon-only {\n\twidth: 2em;\n\tbox-sizing: border-box;\n\ttext-indent: -9999px;\n\twhite-space: nowrap;\n}\n\n/* no icon support for input elements */\ninput.ui-button.ui-button-icon-only {\n\ttext-indent: 0;\n}\n\n/* button icon element(s) */\n.ui-button-icon-only .ui-icon {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\tmargin-top: -8px;\n\tmargin-left: -8px;\n}\n\n.ui-button.ui-icon-notext .ui-icon {\n\tpadding: 0;\n\twidth: 2.1em;\n\theight: 2.1em;\n\ttext-indent: -9999px;\n\twhite-space: nowrap;\n\n}\n\ninput.ui-button.ui-icon-notext .ui-icon {\n\twidth: auto;\n\theight: auto;\n\ttext-indent: 0;\n\twhite-space: normal;\n\tpadding: .4em 1em;\n}\n\n/* workarounds */\n/* Support: Firefox 5 - 40 */\ninput.ui-button::-moz-focus-inner,\nbutton.ui-button::-moz-focus-inner {\n\tborder: 0;\n\tpadding: 0;\n}\n.ui-controlgroup {\n\tvertical-align: middle;\n\tdisplay: inline-block;\n}\n.ui-controlgroup > .ui-controlgroup-item {\n\tfloat: left;\n\tmargin-left: 0;\n\tmargin-right: 0;\n}\n.ui-controlgroup > .ui-controlgroup-item:focus,\n.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {\n\tz-index: 9999;\n}\n.ui-controlgroup-vertical > .ui-controlgroup-item {\n\tdisplay: block;\n\tfloat: none;\n\twidth: 100%;\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n\ttext-align: left;\n}\n.ui-controlgroup-vertical .ui-controlgroup-item {\n\tbox-sizing: border-box;\n}\n.ui-controlgroup .ui-controlgroup-label {\n\tpadding: .4em 1em;\n}\n.ui-controlgroup .ui-controlgroup-label span {\n\tfont-size: 80%;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {\n\tborder-left: none;\n}\n.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {\n\tborder-top: none;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {\n\tborder-right: none;\n}\n.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {\n\tborder-bottom: none;\n}\n\n/* Spinner specific style fixes */\n.ui-controlgroup-vertical .ui-spinner-input {\n\n\t/* Support: IE8 only, Android < 4.4 only */\n\twidth: 75%;\n\twidth: calc( 100% - 2.4em );\n}\n.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {\n\tborder-top-style: solid;\n}\n\n.ui-checkboxradio-label .ui-icon-background {\n\tbox-shadow: inset 1px 1px 1px #ccc;\n\tborder-radius: .12em;\n\tborder: none;\n}\n.ui-checkboxradio-radio-label .ui-icon-background {\n\twidth: 16px;\n\theight: 16px;\n\tborder-radius: 1em;\n\toverflow: visible;\n\tborder: none;\n}\n.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,\n.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {\n\tbackground-image: none;\n\twidth: 8px;\n\theight: 8px;\n\tborder-width: 4px;\n\tborder-style: solid;\n}\n.ui-checkboxradio-disabled {\n\tpointer-events: none;\n}\n.ui-datepicker {\n\twidth: 17em;\n\tpadding: .2em .2em 0;\n\tdisplay: none;\n}\n.ui-datepicker .ui-datepicker-header {\n\tposition: relative;\n\tpadding: .2em 0;\n}\n.ui-datepicker .ui-datepicker-prev,\n.ui-datepicker .ui-datepicker-next {\n\tposition: absolute;\n\ttop: 2px;\n\twidth: 1.8em;\n\theight: 1.8em;\n}\n.ui-datepicker .ui-datepicker-prev-hover,\n.ui-datepicker .ui-datepicker-next-hover {\n\ttop: 1px;\n}\n.ui-datepicker .ui-datepicker-prev {\n\tleft: 2px;\n}\n.ui-datepicker .ui-datepicker-next {\n\tright: 2px;\n}\n.ui-datepicker .ui-datepicker-prev-hover {\n\tleft: 1px;\n}\n.ui-datepicker .ui-datepicker-next-hover {\n\tright: 1px;\n}\n.ui-datepicker .ui-datepicker-prev span,\n.ui-datepicker .ui-datepicker-next span {\n\tdisplay: block;\n\tposition: absolute;\n\tleft: 50%;\n\tmargin-left: -8px;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n.ui-datepicker .ui-datepicker-title {\n\tmargin: 0 2.3em;\n\tline-height: 1.8em;\n\ttext-align: center;\n}\n.ui-datepicker .ui-datepicker-title select {\n\tfont-size: 1em;\n\tmargin: 1px 0;\n}\n.ui-datepicker select.ui-datepicker-month,\n.ui-datepicker select.ui-datepicker-year {\n\twidth: 45%;\n}\n.ui-datepicker table {\n\twidth: 100%;\n\tfont-size: .9em;\n\tborder-collapse: collapse;\n\tmargin: 0 0 .4em;\n}\n.ui-datepicker th {\n\tpadding: .7em .3em;\n\ttext-align: center;\n\tfont-weight: bold;\n\tborder: 0;\n}\n.ui-datepicker td {\n\tborder: 0;\n\tpadding: 1px;\n}\n.ui-datepicker td span,\n.ui-datepicker td a {\n\tdisplay: block;\n\tpadding: .2em;\n\ttext-align: right;\n\ttext-decoration: none;\n}\n.ui-datepicker .ui-datepicker-buttonpane {\n\tbackground-image: none;\n\tmargin: .7em 0 0 0;\n\tpadding: 0 .2em;\n\tborder-left: 0;\n\tborder-right: 0;\n\tborder-bottom: 0;\n}\n.ui-datepicker .ui-datepicker-buttonpane button {\n\tfloat: right;\n\tmargin: .5em .2em .4em;\n\tcursor: pointer;\n\tpadding: .2em .6em .3em .6em;\n\twidth: auto;\n\toverflow: visible;\n}\n.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {\n\tfloat: left;\n}\n\n/* with multiple calendars */\n.ui-datepicker.ui-datepicker-multi {\n\twidth: auto;\n}\n.ui-datepicker-multi .ui-datepicker-group {\n\tfloat: left;\n}\n.ui-datepicker-multi .ui-datepicker-group table {\n\twidth: 95%;\n\tmargin: 0 auto .4em;\n}\n.ui-datepicker-multi-2 .ui-datepicker-group {\n\twidth: 50%;\n}\n.ui-datepicker-multi-3 .ui-datepicker-group {\n\twidth: 33.3%;\n}\n.ui-datepicker-multi-4 .ui-datepicker-group {\n\twidth: 25%;\n}\n.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-left-width: 0;\n}\n.ui-datepicker-multi .ui-datepicker-buttonpane {\n\tclear: left;\n}\n.ui-datepicker-row-break {\n\tclear: both;\n\twidth: 100%;\n\tfont-size: 0;\n}\n\n/* RTL support */\n.ui-datepicker-rtl {\n\tdirection: rtl;\n}\n.ui-datepicker-rtl .ui-datepicker-prev {\n\tright: 2px;\n\tleft: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-next {\n\tleft: 2px;\n\tright: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-prev:hover {\n\tright: 1px;\n\tleft: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-next:hover {\n\tleft: 1px;\n\tright: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane {\n\tclear: right;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane button {\n\tfloat: left;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,\n.ui-datepicker-rtl .ui-datepicker-group {\n\tfloat: right;\n}\n.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-right-width: 0;\n\tborder-left-width: 1px;\n}\n\n/* Icons */\n.ui-datepicker .ui-icon {\n\tdisplay: block;\n\ttext-indent: -99999px;\n\toverflow: hidden;\n\tbackground-repeat: no-repeat;\n\tleft: .5em;\n\ttop: .3em;\n}\n.ui-dialog {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tpadding: .2em;\n\toutline: 0;\n}\n.ui-dialog .ui-dialog-titlebar {\n\tpadding: .4em 1em;\n\tposition: relative;\n}\n.ui-dialog .ui-dialog-title {\n\tfloat: left;\n\tmargin: .1em 0;\n\twhite-space: nowrap;\n\twidth: 90%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n.ui-dialog .ui-dialog-titlebar-close {\n\tposition: absolute;\n\tright: .3em;\n\ttop: 50%;\n\twidth: 20px;\n\tmargin: -10px 0 0 0;\n\tpadding: 1px;\n\theight: 20px;\n}\n.ui-dialog .ui-dialog-content {\n\tposition: relative;\n\tborder: 0;\n\tpadding: .5em 1em;\n\tbackground: none;\n\toverflow: auto;\n}\n.ui-dialog .ui-dialog-buttonpane {\n\ttext-align: left;\n\tborder-width: 1px 0 0 0;\n\tbackground-image: none;\n\tmargin-top: .5em;\n\tpadding: .3em 1em .5em .4em;\n}\n.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {\n\tfloat: right;\n}\n.ui-dialog .ui-dialog-buttonpane button {\n\tmargin: .5em .4em .5em 0;\n\tcursor: pointer;\n}\n.ui-dialog .ui-resizable-n {\n\theight: 2px;\n\ttop: 0;\n}\n.ui-dialog .ui-resizable-e {\n\twidth: 2px;\n\tright: 0;\n}\n.ui-dialog .ui-resizable-s {\n\theight: 2px;\n\tbottom: 0;\n}\n.ui-dialog .ui-resizable-w {\n\twidth: 2px;\n\tleft: 0;\n}\n.ui-dialog .ui-resizable-se,\n.ui-dialog .ui-resizable-sw,\n.ui-dialog .ui-resizable-ne,\n.ui-dialog .ui-resizable-nw {\n\twidth: 7px;\n\theight: 7px;\n}\n.ui-dialog .ui-resizable-se {\n\tright: 0;\n\tbottom: 0;\n}\n.ui-dialog .ui-resizable-sw {\n\tleft: 0;\n\tbottom: 0;\n}\n.ui-dialog .ui-resizable-ne {\n\tright: 0;\n\ttop: 0;\n}\n.ui-dialog .ui-resizable-nw {\n\tleft: 0;\n\ttop: 0;\n}\n.ui-draggable .ui-dialog-titlebar {\n\tcursor: move;\n}\n.ui-draggable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-resizable {\n\tposition: relative;\n}\n.ui-resizable-handle {\n\tposition: absolute;\n\tfont-size: 0.1px;\n\tdisplay: block;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-resizable-disabled .ui-resizable-handle,\n.ui-resizable-autohide .ui-resizable-handle {\n\tdisplay: none;\n}\n.ui-resizable-n {\n\tcursor: n-resize;\n\theight: 7px;\n\twidth: 100%;\n\ttop: -5px;\n\tleft: 0;\n}\n.ui-resizable-s {\n\tcursor: s-resize;\n\theight: 7px;\n\twidth: 100%;\n\tbottom: -5px;\n\tleft: 0;\n}\n.ui-resizable-e {\n\tcursor: e-resize;\n\twidth: 7px;\n\tright: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n.ui-resizable-w {\n\tcursor: w-resize;\n\twidth: 7px;\n\tleft: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n.ui-resizable-se {\n\tcursor: se-resize;\n\twidth: 12px;\n\theight: 12px;\n\tright: 1px;\n\tbottom: 1px;\n}\n.ui-resizable-sw {\n\tcursor: sw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\tbottom: -5px;\n}\n.ui-resizable-nw {\n\tcursor: nw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\ttop: -5px;\n}\n.ui-resizable-ne {\n\tcursor: ne-resize;\n\twidth: 9px;\n\theight: 9px;\n\tright: -5px;\n\ttop: -5px;\n}\n.ui-progressbar {\n\theight: 2em;\n\ttext-align: left;\n\toverflow: hidden;\n}\n.ui-progressbar .ui-progressbar-value {\n\tmargin: -1px;\n\theight: 100%;\n}\n.ui-progressbar .ui-progressbar-overlay {\n\tbackground: url(\"data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==\");\n\theight: 100%;\n\tfilter: alpha(opacity=25); /* support: IE8 */\n\topacity: 0.25;\n}\n.ui-progressbar-indeterminate .ui-progressbar-value {\n\tbackground-image: none;\n}\n.ui-selectable {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-selectable-helper {\n\tposition: absolute;\n\tz-index: 100;\n\tborder: 1px dotted black;\n}\n.ui-selectmenu-menu {\n\tpadding: 0;\n\tmargin: 0;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tdisplay: none;\n}\n.ui-selectmenu-menu .ui-menu {\n\toverflow: auto;\n\toverflow-x: hidden;\n\tpadding-bottom: 1px;\n}\n.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {\n\tfont-size: 1em;\n\tfont-weight: bold;\n\tline-height: 1.5;\n\tpadding: 2px 0.4em;\n\tmargin: 0.5em 0 0 0;\n\theight: auto;\n\tborder: 0;\n}\n.ui-selectmenu-open {\n\tdisplay: block;\n}\n.ui-selectmenu-text {\n\tdisplay: block;\n\tmargin-right: 20px;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n.ui-selectmenu-button.ui-button {\n\ttext-align: left;\n\twhite-space: nowrap;\n\twidth: 14em;\n}\n.ui-selectmenu-icon.ui-icon {\n\tfloat: right;\n\tmargin-top: 0;\n}\n.ui-slider {\n\tposition: relative;\n\ttext-align: left;\n}\n.ui-slider .ui-slider-handle {\n\tposition: absolute;\n\tz-index: 2;\n\twidth: 1.2em;\n\theight: 1.2em;\n\tcursor: default;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-slider .ui-slider-range {\n\tposition: absolute;\n\tz-index: 1;\n\tfont-size: .7em;\n\tdisplay: block;\n\tborder: 0;\n\tbackground-position: 0 0;\n}\n\n/* support: IE8 - See #6727 */\n.ui-slider.ui-state-disabled .ui-slider-handle,\n.ui-slider.ui-state-disabled .ui-slider-range {\n\tfilter: inherit;\n}\n\n.ui-slider-horizontal {\n\theight: .8em;\n}\n.ui-slider-horizontal .ui-slider-handle {\n\ttop: -.3em;\n\tmargin-left: -.6em;\n}\n.ui-slider-horizontal .ui-slider-range {\n\ttop: 0;\n\theight: 100%;\n}\n.ui-slider-horizontal .ui-slider-range-min {\n\tleft: 0;\n}\n.ui-slider-horizontal .ui-slider-range-max {\n\tright: 0;\n}\n\n.ui-slider-vertical {\n\twidth: .8em;\n\theight: 100px;\n}\n.ui-slider-vertical .ui-slider-handle {\n\tleft: -.3em;\n\tmargin-left: 0;\n\tmargin-bottom: -.6em;\n}\n.ui-slider-vertical .ui-slider-range {\n\tleft: 0;\n\twidth: 100%;\n}\n.ui-slider-vertical .ui-slider-range-min {\n\tbottom: 0;\n}\n.ui-slider-vertical .ui-slider-range-max {\n\ttop: 0;\n}\n.ui-sortable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-spinner {\n\tposition: relative;\n\tdisplay: inline-block;\n\toverflow: hidden;\n\tpadding: 0;\n\tvertical-align: middle;\n}\n.ui-spinner-input {\n\tborder: none;\n\tbackground: none;\n\tcolor: inherit;\n\tpadding: .222em 0;\n\tmargin: .2em 0;\n\tvertical-align: middle;\n\tmargin-left: .4em;\n\tmargin-right: 2em;\n}\n.ui-spinner-button {\n\twidth: 1.6em;\n\theight: 50%;\n\tfont-size: .5em;\n\tpadding: 0;\n\tmargin: 0;\n\ttext-align: center;\n\tposition: absolute;\n\tcursor: default;\n\tdisplay: block;\n\toverflow: hidden;\n\tright: 0;\n}\n/* more specificity required here to override default borders */\n.ui-spinner a.ui-spinner-button {\n\tborder-top-style: none;\n\tborder-bottom-style: none;\n\tborder-right-style: none;\n}\n.ui-spinner-up {\n\ttop: 0;\n}\n.ui-spinner-down {\n\tbottom: 0;\n}\n.ui-tabs {\n\tposition: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as \"fixed\") */\n\tpadding: .2em;\n}\n.ui-tabs .ui-tabs-nav {\n\tmargin: 0;\n\tpadding: .2em .2em 0;\n}\n.ui-tabs .ui-tabs-nav li {\n\tlist-style: none;\n\tfloat: left;\n\tposition: relative;\n\ttop: 0;\n\tmargin: 1px .2em 0 0;\n\tborder-bottom-width: 0;\n\tpadding: 0;\n\twhite-space: nowrap;\n}\n.ui-tabs .ui-tabs-nav .ui-tabs-anchor {\n\tfloat: left;\n\tpadding: .5em 1em;\n\ttext-decoration: none;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-active {\n\tmargin-bottom: -1px;\n\tpadding-bottom: 1px;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,\n.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,\n.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {\n\tcursor: text;\n}\n.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {\n\tcursor: pointer;\n}\n.ui-tabs .ui-tabs-panel {\n\tdisplay: block;\n\tborder-width: 0;\n\tpadding: 1em 1.4em;\n\tbackground: none;\n}\n.ui-tooltip {\n\tpadding: 8px;\n\tposition: absolute;\n\tz-index: 9999;\n\tmax-width: 300px;\n}\nbody .ui-tooltip {\n\tborder-width: 2px;\n}\n/* Component containers\n----------------------------------*/\n.ui-widget {\n\tfont-family: Verdana,Arial,sans-serif;\n\tfont-size: 1.1em;\n}\n.ui-widget .ui-widget {\n\tfont-size: 1em;\n}\n.ui-widget input,\n.ui-widget select,\n.ui-widget textarea,\n.ui-widget button {\n\tfont-family: Verdana,Arial,sans-serif;\n\tfont-size: 1em;\n}\n.ui-widget.ui-widget-content {\n\tborder: 1px solid #77d5f7;\n}\n.ui-widget-content {\n\tborder: 1px solid #a6c9e2;\n\tbackground: #fcfdfd url(\"images/ui-bg_inset-hard_100_fcfdfd_1x100.png\") 50% bottom repeat-x;\n\tcolor: #222222;\n}\n.ui-widget-content a {\n\tcolor: #222222;\n}\n.ui-widget-header {\n\tborder: 1px solid #4297d7;\n\tbackground: #2191c0 url(\"images/ui-bg_gloss-wave_75_2191c0_500x100.png\") 50% 50% repeat-x;\n\tcolor: #eaf5f7;\n\tfont-weight: bold;\n}\n.ui-widget-header a {\n\tcolor: #eaf5f7;\n}\n\n/* Interaction states\n----------------------------------*/\n.ui-state-default,\n.ui-widget-content .ui-state-default,\n.ui-widget-header .ui-state-default,\n.ui-button,\n\n/* We use html here because we need a greater specificity to make sure disabled\nworks properly when clicked or hovered */\nhtml .ui-button.ui-state-disabled:hover,\nhtml .ui-button.ui-state-disabled:active {\n\tborder: 1px solid #77d5f7;\n\tbackground: #0078ae url(\"images/ui-bg_glass_45_0078ae_1x400.png\") 50% 50% repeat-x;\n\tfont-weight: normal;\n\tcolor: #ffffff;\n}\n.ui-state-default a,\n.ui-state-default a:link,\n.ui-state-default a:visited,\na.ui-button,\na:link.ui-button,\na:visited.ui-button,\n.ui-button {\n\tcolor: #ffffff;\n\ttext-decoration: none;\n}\n.ui-state-hover,\n.ui-widget-content .ui-state-hover,\n.ui-widget-header .ui-state-hover,\n.ui-state-focus,\n.ui-widget-content .ui-state-focus,\n.ui-widget-header .ui-state-focus,\n.ui-button:hover,\n.ui-button:focus {\n\tborder: 1px solid #448dae;\n\tbackground: #79c9ec url(\"images/ui-bg_glass_75_79c9ec_1x400.png\") 50% 50% repeat-x;\n\tfont-weight: normal;\n\tcolor: #026890;\n}\n.ui-state-hover a,\n.ui-state-hover a:hover,\n.ui-state-hover a:link,\n.ui-state-hover a:visited,\n.ui-state-focus a,\n.ui-state-focus a:hover,\n.ui-state-focus a:link,\n.ui-state-focus a:visited,\na.ui-button:hover,\na.ui-button:focus {\n\tcolor: #026890;\n\ttext-decoration: none;\n}\n\n.ui-visual-focus {\n\tbox-shadow: 0 0 3px 1px rgb(94, 158, 214);\n}\n.ui-state-active,\n.ui-widget-content .ui-state-active,\n.ui-widget-header .ui-state-active,\na.ui-button:active,\n.ui-button:active,\n.ui-button.ui-state-active:hover {\n\tborder: 1px solid #acdd4a;\n\tbackground: #6eac2c url(\"images/ui-bg_gloss-wave_50_6eac2c_500x100.png\") 50% 50% repeat-x;\n\tfont-weight: normal;\n\tcolor: #ffffff;\n}\n.ui-icon-background,\n.ui-state-active .ui-icon-background {\n\tborder: #acdd4a;\n\tbackground-color: #ffffff;\n}\n.ui-state-active a,\n.ui-state-active a:link,\n.ui-state-active a:visited {\n\tcolor: #ffffff;\n\ttext-decoration: none;\n}\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-highlight,\n.ui-widget-content .ui-state-highlight,\n.ui-widget-header .ui-state-highlight {\n\tborder: 1px solid #fcd113;\n\tbackground: #f8da4e url(\"images/ui-bg_glass_55_f8da4e_1x400.png\") 50% 50% repeat-x;\n\tcolor: #915608;\n}\n.ui-state-checked {\n\tborder: 1px solid #fcd113;\n\tbackground: #f8da4e;\n}\n.ui-state-highlight a,\n.ui-widget-content .ui-state-highlight a,\n.ui-widget-header .ui-state-highlight a {\n\tcolor: #915608;\n}\n.ui-state-error,\n.ui-widget-content .ui-state-error,\n.ui-widget-header .ui-state-error {\n\tborder: 1px solid #cd0a0a;\n\tbackground: #e14f1c url(\"images/ui-bg_gloss-wave_45_e14f1c_500x100.png\") 50% top repeat-x;\n\tcolor: #ffffff;\n}\n.ui-state-error a,\n.ui-widget-content .ui-state-error a,\n.ui-widget-header .ui-state-error a {\n\tcolor: #ffffff;\n}\n.ui-state-error-text,\n.ui-widget-content .ui-state-error-text,\n.ui-widget-header .ui-state-error-text {\n\tcolor: #ffffff;\n}\n.ui-priority-primary,\n.ui-widget-content .ui-priority-primary,\n.ui-widget-header .ui-priority-primary {\n\tfont-weight: bold;\n}\n.ui-priority-secondary,\n.ui-widget-content .ui-priority-secondary,\n.ui-widget-header .ui-priority-secondary {\n\topacity: .7;\n\tfilter:Alpha(Opacity=70); /* support: IE8 */\n\tfont-weight: normal;\n}\n.ui-state-disabled,\n.ui-widget-content .ui-state-disabled,\n.ui-widget-header .ui-state-disabled {\n\topacity: .35;\n\tfilter:Alpha(Opacity=35); /* support: IE8 */\n\tbackground-image: none;\n}\n.ui-state-disabled .ui-icon {\n\tfilter:Alpha(Opacity=35); /* support: IE8 - See #6059 */\n}\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon {\n\twidth: 16px;\n\theight: 16px;\n}\n.ui-icon,\n.ui-widget-content .ui-icon {\n\tbackground-image: url(\"images/ui-icons_0078ae_256x240.png\");\n}\n.ui-widget-header .ui-icon {\n\tbackground-image: url(\"images/ui-icons_d8e7f3_256x240.png\");\n}\n.ui-state-hover .ui-icon,\n.ui-state-focus .ui-icon,\n.ui-button:hover .ui-icon,\n.ui-button:focus .ui-icon {\n\tbackground-image: url(\"images/ui-icons_056b93_256x240.png\");\n}\n.ui-state-active .ui-icon,\n.ui-button:active .ui-icon {\n\tbackground-image: url(\"images/ui-icons_f5e175_256x240.png\");\n}\n.ui-state-highlight .ui-icon,\n.ui-button .ui-state-highlight.ui-icon {\n\tbackground-image: url(\"images/ui-icons_f7a50d_256x240.png\");\n}\n.ui-state-error .ui-icon,\n.ui-state-error-text .ui-icon {\n\tbackground-image: url(\"images/ui-icons_fcd113_256x240.png\");\n}\n.ui-button .ui-icon {\n\tbackground-image: url(\"images/ui-icons_e0fdff_256x240.png\");\n}\n\n/* positioning */\n.ui-icon-blank { background-position: 16px 16px; }\n.ui-icon-caret-1-n { background-position: 0 0; }\n.ui-icon-caret-1-ne { background-position: -16px 0; }\n.ui-icon-caret-1-e { background-position: -32px 0; }\n.ui-icon-caret-1-se { background-position: -48px 0; }\n.ui-icon-caret-1-s { background-position: -65px 0; }\n.ui-icon-caret-1-sw { background-position: -80px 0; }\n.ui-icon-caret-1-w { background-position: -96px 0; }\n.ui-icon-caret-1-nw { background-position: -112px 0; }\n.ui-icon-caret-2-n-s { background-position: -128px 0; }\n.ui-icon-caret-2-e-w { background-position: -144px 0; }\n.ui-icon-triangle-1-n { background-position: 0 -16px; }\n.ui-icon-triangle-1-ne { background-position: -16px -16px; }\n.ui-icon-triangle-1-e { background-position: -32px -16px; }\n.ui-icon-triangle-1-se { background-position: -48px -16px; }\n.ui-icon-triangle-1-s { background-position: -65px -16px; }\n.ui-icon-triangle-1-sw { background-position: -80px -16px; }\n.ui-icon-triangle-1-w { background-position: -96px -16px; }\n.ui-icon-triangle-1-nw { background-position: -112px -16px; }\n.ui-icon-triangle-2-n-s { background-position: -128px -16px; }\n.ui-icon-triangle-2-e-w { background-position: -144px -16px; }\n.ui-icon-arrow-1-n { background-position: 0 -32px; }\n.ui-icon-arrow-1-ne { background-position: -16px -32px; }\n.ui-icon-arrow-1-e { background-position: -32px -32px; }\n.ui-icon-arrow-1-se { background-position: -48px -32px; }\n.ui-icon-arrow-1-s { background-position: -65px -32px; }\n.ui-icon-arrow-1-sw { background-position: -80px -32px; }\n.ui-icon-arrow-1-w { background-position: -96px -32px; }\n.ui-icon-arrow-1-nw { background-position: -112px -32px; }\n.ui-icon-arrow-2-n-s { background-position: -128px -32px; }\n.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }\n.ui-icon-arrow-2-e-w { background-position: -160px -32px; }\n.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }\n.ui-icon-arrowstop-1-n { background-position: -192px -32px; }\n.ui-icon-arrowstop-1-e { background-position: -208px -32px; }\n.ui-icon-arrowstop-1-s { background-position: -224px -32px; }\n.ui-icon-arrowstop-1-w { background-position: -240px -32px; }\n.ui-icon-arrowthick-1-n { background-position: 1px -48px; }\n.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }\n.ui-icon-arrowthick-1-e { background-position: -32px -48px; }\n.ui-icon-arrowthick-1-se { background-position: -48px -48px; }\n.ui-icon-arrowthick-1-s { background-position: -64px -48px; }\n.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }\n.ui-icon-arrowthick-1-w { background-position: -96px -48px; }\n.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }\n.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }\n.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }\n.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }\n.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }\n.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }\n.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }\n.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }\n.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }\n.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }\n.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }\n.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }\n.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }\n.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }\n.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }\n.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }\n.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }\n.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }\n.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }\n.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }\n.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }\n.ui-icon-arrow-4 { background-position: 0 -80px; }\n.ui-icon-arrow-4-diag { background-position: -16px -80px; }\n.ui-icon-extlink { background-position: -32px -80px; }\n.ui-icon-newwin { background-position: -48px -80px; }\n.ui-icon-refresh { background-position: -64px -80px; }\n.ui-icon-shuffle { background-position: -80px -80px; }\n.ui-icon-transfer-e-w { background-position: -96px -80px; }\n.ui-icon-transferthick-e-w { background-position: -112px -80px; }\n.ui-icon-folder-collapsed { background-position: 0 -96px; }\n.ui-icon-folder-open { background-position: -16px -96px; }\n.ui-icon-document { background-position: -32px -96px; }\n.ui-icon-document-b { background-position: -48px -96px; }\n.ui-icon-note { background-position: -64px -96px; }\n.ui-icon-mail-closed { background-position: -80px -96px; }\n.ui-icon-mail-open { background-position: -96px -96px; }\n.ui-icon-suitcase { background-position: -112px -96px; }\n.ui-icon-comment { background-position: -128px -96px; }\n.ui-icon-person { background-position: -144px -96px; }\n.ui-icon-print { background-position: -160px -96px; }\n.ui-icon-trash { background-position: -176px -96px; }\n.ui-icon-locked { background-position: -192px -96px; }\n.ui-icon-unlocked { background-position: -208px -96px; }\n.ui-icon-bookmark { background-position: -224px -96px; }\n.ui-icon-tag { background-position: -240px -96px; }\n.ui-icon-home { background-position: 0 -112px; }\n.ui-icon-flag { background-position: -16px -112px; }\n.ui-icon-calendar { background-position: -32px -112px; }\n.ui-icon-cart { background-position: -48px -112px; }\n.ui-icon-pencil { background-position: -64px -112px; }\n.ui-icon-clock { background-position: -80px -112px; }\n.ui-icon-disk { background-position: -96px -112px; }\n.ui-icon-calculator { background-position: -112px -112px; }\n.ui-icon-zoomin { background-position: -128px -112px; }\n.ui-icon-zoomout { background-position: -144px -112px; }\n.ui-icon-search { background-position: -160px -112px; }\n.ui-icon-wrench { background-position: -176px -112px; }\n.ui-icon-gear { background-position: -192px -112px; }\n.ui-icon-heart { background-position: -208px -112px; }\n.ui-icon-star { background-position: -224px -112px; }\n.ui-icon-link { background-position: -240px -112px; }\n.ui-icon-cancel { background-position: 0 -128px; }\n.ui-icon-plus { background-position: -16px -128px; }\n.ui-icon-plusthick { background-position: -32px -128px; }\n.ui-icon-minus { background-position: -48px -128px; }\n.ui-icon-minusthick { background-position: -64px -128px; }\n.ui-icon-close { background-position: -80px -128px; }\n.ui-icon-closethick { background-position: -96px -128px; }\n.ui-icon-key { background-position: -112px -128px; }\n.ui-icon-lightbulb { background-position: -128px -128px; }\n.ui-icon-scissors { background-position: -144px -128px; }\n.ui-icon-clipboard { background-position: -160px -128px; }\n.ui-icon-copy { background-position: -176px -128px; }\n.ui-icon-contact { background-position: -192px -128px; }\n.ui-icon-image { background-position: -208px -128px; }\n.ui-icon-video { background-position: -224px -128px; }\n.ui-icon-script { background-position: -240px -128px; }\n.ui-icon-alert { background-position: 0 -144px; }\n.ui-icon-info { background-position: -16px -144px; }\n.ui-icon-notice { background-position: -32px -144px; }\n.ui-icon-help { background-position: -48px -144px; }\n.ui-icon-check { background-position: -64px -144px; }\n.ui-icon-bullet { background-position: -80px -144px; }\n.ui-icon-radio-on { background-position: -96px -144px; }\n.ui-icon-radio-off { background-position: -112px -144px; }\n.ui-icon-pin-w { background-position: -128px -144px; }\n.ui-icon-pin-s { background-position: -144px -144px; }\n.ui-icon-play { background-position: 0 -160px; }\n.ui-icon-pause { background-position: -16px -160px; }\n.ui-icon-seek-next { background-position: -32px -160px; }\n.ui-icon-seek-prev { background-position: -48px -160px; }\n.ui-icon-seek-end { background-position: -64px -160px; }\n.ui-icon-seek-start { background-position: -80px -160px; }\n/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */\n.ui-icon-seek-first { background-position: -80px -160px; }\n.ui-icon-stop { background-position: -96px -160px; }\n.ui-icon-eject { background-position: -112px -160px; }\n.ui-icon-volume-off { background-position: -128px -160px; }\n.ui-icon-volume-on { background-position: -144px -160px; }\n.ui-icon-power { background-position: 0 -176px; }\n.ui-icon-signal-diag { background-position: -16px -176px; }\n.ui-icon-signal { background-position: -32px -176px; }\n.ui-icon-battery-0 { background-position: -48px -176px; }\n.ui-icon-battery-1 { background-position: -64px -176px; }\n.ui-icon-battery-2 { background-position: -80px -176px; }\n.ui-icon-battery-3 { background-position: -96px -176px; }\n.ui-icon-circle-plus { background-position: 0 -192px; }\n.ui-icon-circle-minus { background-position: -16px -192px; }\n.ui-icon-circle-close { background-position: -32px -192px; }\n.ui-icon-circle-triangle-e { background-position: -48px -192px; }\n.ui-icon-circle-triangle-s { background-position: -64px -192px; }\n.ui-icon-circle-triangle-w { background-position: -80px -192px; }\n.ui-icon-circle-triangle-n { background-position: -96px -192px; }\n.ui-icon-circle-arrow-e { background-position: -112px -192px; }\n.ui-icon-circle-arrow-s { background-position: -128px -192px; }\n.ui-icon-circle-arrow-w { background-position: -144px -192px; }\n.ui-icon-circle-arrow-n { background-position: -160px -192px; }\n.ui-icon-circle-zoomin { background-position: -176px -192px; }\n.ui-icon-circle-zoomout { background-position: -192px -192px; }\n.ui-icon-circle-check { background-position: -208px -192px; }\n.ui-icon-circlesmall-plus { background-position: 0 -208px; }\n.ui-icon-circlesmall-minus { background-position: -16px -208px; }\n.ui-icon-circlesmall-close { background-position: -32px -208px; }\n.ui-icon-squaresmall-plus { background-position: -48px -208px; }\n.ui-icon-squaresmall-minus { background-position: -64px -208px; }\n.ui-icon-squaresmall-close { background-position: -80px -208px; }\n.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }\n.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }\n.ui-icon-grip-solid-vertical { background-position: -32px -224px; }\n.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }\n.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }\n.ui-icon-grip-diagonal-se { background-position: -80px -224px; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Corner radius */\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-left,\n.ui-corner-tl {\n\tborder-top-left-radius: 5px;\n}\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-right,\n.ui-corner-tr {\n\tborder-top-right-radius: 5px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-left,\n.ui-corner-bl {\n\tborder-bottom-left-radius: 5px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-right,\n.ui-corner-br {\n\tborder-bottom-right-radius: 5px;\n}\n\n/* Overlays */\n.ui-widget-overlay {\n\tbackground: #aaaaaa;\n\topacity: .3;\n\tfilter: Alpha(Opacity=30); /* support: IE8 */\n}\n.ui-widget-shadow {\n\t-webkit-box-shadow: 5px 5px 0px #999999;\n\tbox-shadow: 5px 5px 0px #999999;\n}\n"
  },
  {
    "path": "example/pages/include/jquery_ui/themes/start/theme.css",
    "content": "/*!\n * jQuery UI CSS Framework 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/theming/\n *\n * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=2191c0&bgTextureHeader=gloss_wave&bgImgOpacityHeader=75&borderColorHeader=4297d7&fcHeader=eaf5f7&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=0078ae&bgColorDefault=0078ae&bgTextureDefault=glass&bgImgOpacityDefault=45&borderColorDefault=77d5f7&fcDefault=ffffff&iconColorDefault=e0fdff&bgColorHover=79c9ec&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=448dae&fcHover=026890&iconColorHover=056b93&bgColorActive=6eac2c&bgTextureActive=gloss_wave&bgImgOpacityActive=50&borderColorActive=acdd4a&fcActive=ffffff&iconColorActive=f5e175&bgColorHighlight=f8da4e&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcd113&fcHighlight=915608&iconColorHighlight=f7a50d&bgColorError=e14f1c&bgTextureError=gloss_wave&bgImgOpacityError=45&borderColorError=cd0a0a&fcError=ffffff&iconColorError=fcd113&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=75&opacityOverlay=30&bgColorShadow=999999&bgTextureShadow=flat&bgImgOpacityShadow=55&opacityShadow=45&thicknessShadow=0px&offsetTopShadow=5px&offsetLeftShadow=5px&cornerRadiusShadow=5px\n */\n\n\n/* Component containers\n----------------------------------*/\n.ui-widget {\n\tfont-family: Verdana,Arial,sans-serif;\n\tfont-size: 1.1em;\n}\n.ui-widget .ui-widget {\n\tfont-size: 1em;\n}\n.ui-widget input,\n.ui-widget select,\n.ui-widget textarea,\n.ui-widget button {\n\tfont-family: Verdana,Arial,sans-serif;\n\tfont-size: 1em;\n}\n.ui-widget.ui-widget-content {\n\tborder: 1px solid #77d5f7;\n}\n.ui-widget-content {\n\tborder: 1px solid #a6c9e2;\n\tbackground: #fcfdfd url(\"images/ui-bg_inset-hard_100_fcfdfd_1x100.png\") 50% bottom repeat-x;\n\tcolor: #222222;\n}\n.ui-widget-content a {\n\tcolor: #222222;\n}\n.ui-widget-header {\n\tborder: 1px solid #4297d7;\n\tbackground: #2191c0 url(\"images/ui-bg_gloss-wave_75_2191c0_500x100.png\") 50% 50% repeat-x;\n\tcolor: #eaf5f7;\n\tfont-weight: bold;\n}\n.ui-widget-header a {\n\tcolor: #eaf5f7;\n}\n\n/* Interaction states\n----------------------------------*/\n.ui-state-default,\n.ui-widget-content .ui-state-default,\n.ui-widget-header .ui-state-default,\n.ui-button,\n\n/* We use html here because we need a greater specificity to make sure disabled\nworks properly when clicked or hovered */\nhtml .ui-button.ui-state-disabled:hover,\nhtml .ui-button.ui-state-disabled:active {\n\tborder: 1px solid #77d5f7;\n\tbackground: #0078ae url(\"images/ui-bg_glass_45_0078ae_1x400.png\") 50% 50% repeat-x;\n\tfont-weight: normal;\n\tcolor: #ffffff;\n}\n.ui-state-default a,\n.ui-state-default a:link,\n.ui-state-default a:visited,\na.ui-button,\na:link.ui-button,\na:visited.ui-button,\n.ui-button {\n\tcolor: #ffffff;\n\ttext-decoration: none;\n}\n.ui-state-hover,\n.ui-widget-content .ui-state-hover,\n.ui-widget-header .ui-state-hover,\n.ui-state-focus,\n.ui-widget-content .ui-state-focus,\n.ui-widget-header .ui-state-focus,\n.ui-button:hover,\n.ui-button:focus {\n\tborder: 1px solid #448dae;\n\tbackground: #79c9ec url(\"images/ui-bg_glass_75_79c9ec_1x400.png\") 50% 50% repeat-x;\n\tfont-weight: normal;\n\tcolor: #026890;\n}\n.ui-state-hover a,\n.ui-state-hover a:hover,\n.ui-state-hover a:link,\n.ui-state-hover a:visited,\n.ui-state-focus a,\n.ui-state-focus a:hover,\n.ui-state-focus a:link,\n.ui-state-focus a:visited,\na.ui-button:hover,\na.ui-button:focus {\n\tcolor: #026890;\n\ttext-decoration: none;\n}\n\n.ui-visual-focus {\n\tbox-shadow: 0 0 3px 1px rgb(94, 158, 214);\n}\n.ui-state-active,\n.ui-widget-content .ui-state-active,\n.ui-widget-header .ui-state-active,\na.ui-button:active,\n.ui-button:active,\n.ui-button.ui-state-active:hover {\n\tborder: 1px solid #acdd4a;\n\tbackground: #6eac2c url(\"images/ui-bg_gloss-wave_50_6eac2c_500x100.png\") 50% 50% repeat-x;\n\tfont-weight: normal;\n\tcolor: #ffffff;\n}\n.ui-icon-background,\n.ui-state-active .ui-icon-background {\n\tborder: #acdd4a;\n\tbackground-color: #ffffff;\n}\n.ui-state-active a,\n.ui-state-active a:link,\n.ui-state-active a:visited {\n\tcolor: #ffffff;\n\ttext-decoration: none;\n}\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-highlight,\n.ui-widget-content .ui-state-highlight,\n.ui-widget-header .ui-state-highlight {\n\tborder: 1px solid #fcd113;\n\tbackground: #f8da4e url(\"images/ui-bg_glass_55_f8da4e_1x400.png\") 50% 50% repeat-x;\n\tcolor: #915608;\n}\n.ui-state-checked {\n\tborder: 1px solid #fcd113;\n\tbackground: #f8da4e;\n}\n.ui-state-highlight a,\n.ui-widget-content .ui-state-highlight a,\n.ui-widget-header .ui-state-highlight a {\n\tcolor: #915608;\n}\n.ui-state-error,\n.ui-widget-content .ui-state-error,\n.ui-widget-header .ui-state-error {\n\tborder: 1px solid #cd0a0a;\n\tbackground: #e14f1c url(\"images/ui-bg_gloss-wave_45_e14f1c_500x100.png\") 50% top repeat-x;\n\tcolor: #ffffff;\n}\n.ui-state-error a,\n.ui-widget-content .ui-state-error a,\n.ui-widget-header .ui-state-error a {\n\tcolor: #ffffff;\n}\n.ui-state-error-text,\n.ui-widget-content .ui-state-error-text,\n.ui-widget-header .ui-state-error-text {\n\tcolor: #ffffff;\n}\n.ui-priority-primary,\n.ui-widget-content .ui-priority-primary,\n.ui-widget-header .ui-priority-primary {\n\tfont-weight: bold;\n}\n.ui-priority-secondary,\n.ui-widget-content .ui-priority-secondary,\n.ui-widget-header .ui-priority-secondary {\n\topacity: .7;\n\tfilter:Alpha(Opacity=70); /* support: IE8 */\n\tfont-weight: normal;\n}\n.ui-state-disabled,\n.ui-widget-content .ui-state-disabled,\n.ui-widget-header .ui-state-disabled {\n\topacity: .35;\n\tfilter:Alpha(Opacity=35); /* support: IE8 */\n\tbackground-image: none;\n}\n.ui-state-disabled .ui-icon {\n\tfilter:Alpha(Opacity=35); /* support: IE8 - See #6059 */\n}\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon {\n\twidth: 16px;\n\theight: 16px;\n}\n.ui-icon,\n.ui-widget-content .ui-icon {\n\tbackground-image: url(\"images/ui-icons_0078ae_256x240.png\");\n}\n.ui-widget-header .ui-icon {\n\tbackground-image: url(\"images/ui-icons_d8e7f3_256x240.png\");\n}\n.ui-state-hover .ui-icon,\n.ui-state-focus .ui-icon,\n.ui-button:hover .ui-icon,\n.ui-button:focus .ui-icon {\n\tbackground-image: url(\"images/ui-icons_056b93_256x240.png\");\n}\n.ui-state-active .ui-icon,\n.ui-button:active .ui-icon {\n\tbackground-image: url(\"images/ui-icons_f5e175_256x240.png\");\n}\n.ui-state-highlight .ui-icon,\n.ui-button .ui-state-highlight.ui-icon {\n\tbackground-image: url(\"images/ui-icons_f7a50d_256x240.png\");\n}\n.ui-state-error .ui-icon,\n.ui-state-error-text .ui-icon {\n\tbackground-image: url(\"images/ui-icons_fcd113_256x240.png\");\n}\n.ui-button .ui-icon {\n\tbackground-image: url(\"images/ui-icons_e0fdff_256x240.png\");\n}\n\n/* positioning */\n.ui-icon-blank { background-position: 16px 16px; }\n.ui-icon-caret-1-n { background-position: 0 0; }\n.ui-icon-caret-1-ne { background-position: -16px 0; }\n.ui-icon-caret-1-e { background-position: -32px 0; }\n.ui-icon-caret-1-se { background-position: -48px 0; }\n.ui-icon-caret-1-s { background-position: -65px 0; }\n.ui-icon-caret-1-sw { background-position: -80px 0; }\n.ui-icon-caret-1-w { background-position: -96px 0; }\n.ui-icon-caret-1-nw { background-position: -112px 0; }\n.ui-icon-caret-2-n-s { background-position: -128px 0; }\n.ui-icon-caret-2-e-w { background-position: -144px 0; }\n.ui-icon-triangle-1-n { background-position: 0 -16px; }\n.ui-icon-triangle-1-ne { background-position: -16px -16px; }\n.ui-icon-triangle-1-e { background-position: -32px -16px; }\n.ui-icon-triangle-1-se { background-position: -48px -16px; }\n.ui-icon-triangle-1-s { background-position: -65px -16px; }\n.ui-icon-triangle-1-sw { background-position: -80px -16px; }\n.ui-icon-triangle-1-w { background-position: -96px -16px; }\n.ui-icon-triangle-1-nw { background-position: -112px -16px; }\n.ui-icon-triangle-2-n-s { background-position: -128px -16px; }\n.ui-icon-triangle-2-e-w { background-position: -144px -16px; }\n.ui-icon-arrow-1-n { background-position: 0 -32px; }\n.ui-icon-arrow-1-ne { background-position: -16px -32px; }\n.ui-icon-arrow-1-e { background-position: -32px -32px; }\n.ui-icon-arrow-1-se { background-position: -48px -32px; }\n.ui-icon-arrow-1-s { background-position: -65px -32px; }\n.ui-icon-arrow-1-sw { background-position: -80px -32px; }\n.ui-icon-arrow-1-w { background-position: -96px -32px; }\n.ui-icon-arrow-1-nw { background-position: -112px -32px; }\n.ui-icon-arrow-2-n-s { background-position: -128px -32px; }\n.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }\n.ui-icon-arrow-2-e-w { background-position: -160px -32px; }\n.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }\n.ui-icon-arrowstop-1-n { background-position: -192px -32px; }\n.ui-icon-arrowstop-1-e { background-position: -208px -32px; }\n.ui-icon-arrowstop-1-s { background-position: -224px -32px; }\n.ui-icon-arrowstop-1-w { background-position: -240px -32px; }\n.ui-icon-arrowthick-1-n { background-position: 1px -48px; }\n.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }\n.ui-icon-arrowthick-1-e { background-position: -32px -48px; }\n.ui-icon-arrowthick-1-se { background-position: -48px -48px; }\n.ui-icon-arrowthick-1-s { background-position: -64px -48px; }\n.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }\n.ui-icon-arrowthick-1-w { background-position: -96px -48px; }\n.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }\n.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }\n.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }\n.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }\n.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }\n.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }\n.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }\n.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }\n.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }\n.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }\n.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }\n.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }\n.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }\n.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }\n.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }\n.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }\n.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }\n.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }\n.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }\n.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }\n.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }\n.ui-icon-arrow-4 { background-position: 0 -80px; }\n.ui-icon-arrow-4-diag { background-position: -16px -80px; }\n.ui-icon-extlink { background-position: -32px -80px; }\n.ui-icon-newwin { background-position: -48px -80px; }\n.ui-icon-refresh { background-position: -64px -80px; }\n.ui-icon-shuffle { background-position: -80px -80px; }\n.ui-icon-transfer-e-w { background-position: -96px -80px; }\n.ui-icon-transferthick-e-w { background-position: -112px -80px; }\n.ui-icon-folder-collapsed { background-position: 0 -96px; }\n.ui-icon-folder-open { background-position: -16px -96px; }\n.ui-icon-document { background-position: -32px -96px; }\n.ui-icon-document-b { background-position: -48px -96px; }\n.ui-icon-note { background-position: -64px -96px; }\n.ui-icon-mail-closed { background-position: -80px -96px; }\n.ui-icon-mail-open { background-position: -96px -96px; }\n.ui-icon-suitcase { background-position: -112px -96px; }\n.ui-icon-comment { background-position: -128px -96px; }\n.ui-icon-person { background-position: -144px -96px; }\n.ui-icon-print { background-position: -160px -96px; }\n.ui-icon-trash { background-position: -176px -96px; }\n.ui-icon-locked { background-position: -192px -96px; }\n.ui-icon-unlocked { background-position: -208px -96px; }\n.ui-icon-bookmark { background-position: -224px -96px; }\n.ui-icon-tag { background-position: -240px -96px; }\n.ui-icon-home { background-position: 0 -112px; }\n.ui-icon-flag { background-position: -16px -112px; }\n.ui-icon-calendar { background-position: -32px -112px; }\n.ui-icon-cart { background-position: -48px -112px; }\n.ui-icon-pencil { background-position: -64px -112px; }\n.ui-icon-clock { background-position: -80px -112px; }\n.ui-icon-disk { background-position: -96px -112px; }\n.ui-icon-calculator { background-position: -112px -112px; }\n.ui-icon-zoomin { background-position: -128px -112px; }\n.ui-icon-zoomout { background-position: -144px -112px; }\n.ui-icon-search { background-position: -160px -112px; }\n.ui-icon-wrench { background-position: -176px -112px; }\n.ui-icon-gear { background-position: -192px -112px; }\n.ui-icon-heart { background-position: -208px -112px; }\n.ui-icon-star { background-position: -224px -112px; }\n.ui-icon-link { background-position: -240px -112px; }\n.ui-icon-cancel { background-position: 0 -128px; }\n.ui-icon-plus { background-position: -16px -128px; }\n.ui-icon-plusthick { background-position: -32px -128px; }\n.ui-icon-minus { background-position: -48px -128px; }\n.ui-icon-minusthick { background-position: -64px -128px; }\n.ui-icon-close { background-position: -80px -128px; }\n.ui-icon-closethick { background-position: -96px -128px; }\n.ui-icon-key { background-position: -112px -128px; }\n.ui-icon-lightbulb { background-position: -128px -128px; }\n.ui-icon-scissors { background-position: -144px -128px; }\n.ui-icon-clipboard { background-position: -160px -128px; }\n.ui-icon-copy { background-position: -176px -128px; }\n.ui-icon-contact { background-position: -192px -128px; }\n.ui-icon-image { background-position: -208px -128px; }\n.ui-icon-video { background-position: -224px -128px; }\n.ui-icon-script { background-position: -240px -128px; }\n.ui-icon-alert { background-position: 0 -144px; }\n.ui-icon-info { background-position: -16px -144px; }\n.ui-icon-notice { background-position: -32px -144px; }\n.ui-icon-help { background-position: -48px -144px; }\n.ui-icon-check { background-position: -64px -144px; }\n.ui-icon-bullet { background-position: -80px -144px; }\n.ui-icon-radio-on { background-position: -96px -144px; }\n.ui-icon-radio-off { background-position: -112px -144px; }\n.ui-icon-pin-w { background-position: -128px -144px; }\n.ui-icon-pin-s { background-position: -144px -144px; }\n.ui-icon-play { background-position: 0 -160px; }\n.ui-icon-pause { background-position: -16px -160px; }\n.ui-icon-seek-next { background-position: -32px -160px; }\n.ui-icon-seek-prev { background-position: -48px -160px; }\n.ui-icon-seek-end { background-position: -64px -160px; }\n.ui-icon-seek-start { background-position: -80px -160px; }\n/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */\n.ui-icon-seek-first { background-position: -80px -160px; }\n.ui-icon-stop { background-position: -96px -160px; }\n.ui-icon-eject { background-position: -112px -160px; }\n.ui-icon-volume-off { background-position: -128px -160px; }\n.ui-icon-volume-on { background-position: -144px -160px; }\n.ui-icon-power { background-position: 0 -176px; }\n.ui-icon-signal-diag { background-position: -16px -176px; }\n.ui-icon-signal { background-position: -32px -176px; }\n.ui-icon-battery-0 { background-position: -48px -176px; }\n.ui-icon-battery-1 { background-position: -64px -176px; }\n.ui-icon-battery-2 { background-position: -80px -176px; }\n.ui-icon-battery-3 { background-position: -96px -176px; }\n.ui-icon-circle-plus { background-position: 0 -192px; }\n.ui-icon-circle-minus { background-position: -16px -192px; }\n.ui-icon-circle-close { background-position: -32px -192px; }\n.ui-icon-circle-triangle-e { background-position: -48px -192px; }\n.ui-icon-circle-triangle-s { background-position: -64px -192px; }\n.ui-icon-circle-triangle-w { background-position: -80px -192px; }\n.ui-icon-circle-triangle-n { background-position: -96px -192px; }\n.ui-icon-circle-arrow-e { background-position: -112px -192px; }\n.ui-icon-circle-arrow-s { background-position: -128px -192px; }\n.ui-icon-circle-arrow-w { background-position: -144px -192px; }\n.ui-icon-circle-arrow-n { background-position: -160px -192px; }\n.ui-icon-circle-zoomin { background-position: -176px -192px; }\n.ui-icon-circle-zoomout { background-position: -192px -192px; }\n.ui-icon-circle-check { background-position: -208px -192px; }\n.ui-icon-circlesmall-plus { background-position: 0 -208px; }\n.ui-icon-circlesmall-minus { background-position: -16px -208px; }\n.ui-icon-circlesmall-close { background-position: -32px -208px; }\n.ui-icon-squaresmall-plus { background-position: -48px -208px; }\n.ui-icon-squaresmall-minus { background-position: -64px -208px; }\n.ui-icon-squaresmall-close { background-position: -80px -208px; }\n.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }\n.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }\n.ui-icon-grip-solid-vertical { background-position: -32px -224px; }\n.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }\n.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }\n.ui-icon-grip-diagonal-se { background-position: -80px -224px; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Corner radius */\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-left,\n.ui-corner-tl {\n\tborder-top-left-radius: 5px;\n}\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-right,\n.ui-corner-tr {\n\tborder-top-right-radius: 5px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-left,\n.ui-corner-bl {\n\tborder-bottom-left-radius: 5px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-right,\n.ui-corner-br {\n\tborder-bottom-right-radius: 5px;\n}\n\n/* Overlays */\n.ui-widget-overlay {\n\tbackground: #aaaaaa;\n\topacity: .3;\n\tfilter: Alpha(Opacity=30); /* support: IE8 */\n}\n.ui-widget-shadow {\n\t-webkit-box-shadow: 5px 5px 0px #999999;\n\tbox-shadow: 5px 5px 0px #999999;\n}\n"
  },
  {
    "path": "example/pages/include/officeToHtml/officeToHtml.css",
    "content": "﻿.wbSheets_clas {\n  position: relative;\n  padding: 1em;\n  border: 1px solid #ccc;\n  border-radius: 5px;\n}\n.wbSheets_clas .ui-tabs-nav {\n  position: absolute;\n  left: 0.25em;\n  right: 0.25em;\n  bottom: 0.25em;\n  padding: 0em 0.2em 0.2em;\n}\n.wbSheets_clas .ui-tabs-nav li {\n  border-top: none;\n  border-bottom: 1px solid #ccc;\n  -moz-border-radius: 0px 0px 4px 4px;\n  -webkit-border-radius: 0px 0px 4px 4px;\n  border-radius: 0px 0px 4px 4px;\n}\n.wbSheets_clas .ui-tabs-nav li.ui-tabs-selected,\n.wbSheets_clas .ui-tabs-nav li.ui-state-active {\n  top: -1px;\n}\n.wbSheets_clas_ul {\n  text-align: center;\n  list-style: none;\n  margin: 200px 0 20px;\n  line-height: 35px;\n  height: 37px;\n  overflow: hidden;\n  font-size: 12px;\n  position: absolute;\n  left: 0.25em;\n  right: 0.25em;\n  bottom: 0.25em;\n  padding: 0em 0.2em 0.2em;\n  z-index: 1000;\n}\n\n.wbSheets_clas_ul li {\n  border: 1px solid #aaa;\n  background: #d1d1d1;\n  background: linear-gradient(top, #ececec 50%, #d1d1d1 100%);\n  display: inline-block;\n  position: relative;\n  z-index: 0;\n  border-bottom-left-radius: 6px;\n  border-bottom-right-radius: 6px;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4), inset 0 1px 0 #fff;\n  text-shadow: 0 1px #fff;\n  margin: 0 -5px;\n  padding: 0 30px;\n}\n\n.wbSheets_clas_ul a {\n  color: #555;\n  text-decoration: none;\n}\n\n.wbSheets_clas_ul li.selected {\n  background: #fff;\n  color: #333;\n  z-index: 2;\n  border-top-color: #fff;\n}\n\n.wbSheets_clas_ul:before {\n  position: absolute;\n  content: \"\";\n  width: 100%;\n  top: 0;\n  left: 0;\n  border-top: 1px solid #aaa;\n  z-index: 1;\n}\n\n.wbSheets_clas_ul li:before,\n.wbSheets_clas_ul li:after {\n  border: 1px solid #aaa;\n  position: absolute;\n  top: -1px;\n  width: 6px;\n  height: 6px;\n  content: \"\";\n}\n\n.wbSheets_clas_ul li:before {\n  left: -7px;\n  border-top-right-radius: 6px;\n  border-width: 1px 1px 0px 0px;\n  box-shadow: 2px 0px 0 #ececec;\n}\n\n.wbSheets_clas_ul li:after {\n  right: -7px;\n  border-top-left-radius: 6px;\n  border-width: 1px 0px 0px 1px;\n  box-shadow: -2px 0px 0 #ececec;\n}\n\n.wbSheets_clas_ul li.selected:before {\n  box-shadow: 2px 0px 0 #fff;\n}\n\n.wbSheets_clas_ul li.selected:after {\n  box-shadow: -2px 0px 0 #fff;\n}\n#wbSheets_search_warpper{\n  padding: 10px;\n}"
  },
  {
    "path": "example/pages/include/officeToHtml/officeToHtml.js",
    "content": "﻿/**\n * officeToHtml.js\n * Ver. : 1.2.1\n * last update: 15/02/2019\n * Author: meshesha , https://github.com/meshesha\n * LICENSE: MIT\n * url:https://officetohtml.js.org/\n */\n(function ($) {\n    $.event.special.destroyed = {\n        remove: function (o) {\n            if (o.handler) {\n                o.handler()\n            }\n        }\n    }\n    $.fn.officeToHtml = function (options) {\n        var $result = $(this);\n        var divId = $result.attr(\"id\");\n        var defaults = {\n            // These are the defaults.\n            url: \"\",\n            inputObjId: \"\",\n            pdfSetting: {\n                thumbnailViewBtn: true,\n                searchBtn: true,\n                nextPreviousBtn: true,\n                pageNumberTxt: true,\n                totalPagesLabel: true,\n                zoomBtns: true,\n                scaleSelector: true,\n                presantationModeBtn: true,\n                openFileBtn: true,\n                printBtn: true,\n                downloadBtn: true,\n                bookmarkBtn: true,\n                secondaryToolbarBtn: true,\n                firstPageBtn: true,\n                lastPageBtn: true,\n                pageRotateCwBtn: true,\n                pageRotateCcwBtn: true,\n                cursorSelectTextToolbarBtn: true,\n                cursorHandToolbarBtn: true,\n                setLang: \"\",\n                setLangFilesPath: \"\"\n            },\n            docxSetting: {\n                styleMap: null,\n                includeEmbeddedStyleMap: true,\n                includeDefaultStyleMap: true,\n                convertImage: null,\n                ignoreEmptyParagraphs: false,\n                idPrefix: \"\",\n                isRtl: \"auto\"\n            },\n            pptxSetting: {\n                slidesScale: \"\", //Change Slides scale by percent\n                slideMode: true /** true,false*/,\n                keyBoardShortCut: false /** true,false ,condition: slideMode: true*/,\n                mediaProcess: true /** true,false: if true then process video and audio files */,\n                jsZipV2: false,\n                slideModeConfig: {\n                    first: 1,\n                    nav: true /** true,false : show or not nav buttons*/,\n                    navTxtColor: \"black\" /** color */,\n                    keyBoardShortCut: true /** true,false ,condition: */,\n                    showSlideNum: true /** true,false */,\n                    showTotalSlideNum: true /** true,false */,\n                    autoSlide: 1 /** false or seconds , F8 to active ,keyBoardShortCut: true */,\n                    randomAutoSlide: false /** true,false ,autoSlide: > 1 */,\n                    loop: false /** true,false */,\n                    background: false /** false or color*/,\n                    transition:\n                        \"default\" /** transition type: \"slid\",\"fade\",\"default\",\"random\" , to show transition efects :transitionTime > 0.5 */,\n                    transitionTime: 1 /** transition time between slides in seconds */\n                }\n            },\n            sheetSetting: {\n                jqueryui: false,\n                activeHeaderClassName: \"\",\n                allowEmpty: true,\n                autoColumnSize: true,\n                autoRowSize: false,\n                columns: false,\n                columnSorting: true,\n                contextMenu: false,\n                copyable: true,\n                customBorders: false,\n                fixedColumnsLeft: 0,\n                fixedRowsTop: 0,\n                language: \"en-US\",\n                search: false,\n                selectionMode: \"single\",\n                sortIndicator: false,\n                readOnly: false,\n                startRows: 1,\n                startCols: 1,\n                rowHeaders: true,\n                colHeaders: true,\n                width: false,\n                height: false\n            },\n            imageSetting: {\n                frame: [\"100%\", \"100%\", false],\n                maxZoom: \"900%\",\n                zoomFactor: \"10%\",\n                mouse: true,\n                keyboard: true,\n                toolbar: true,\n                rotateToolbar: false\n            }\n        };\n        var settings = $.extend(true, {}, defaults, options);\n        //1.get file memeType\n        //2.load all js file needed to read the file\n        var file = settings.url;\n        var inputId = settings.inputObjId;\n        var fileObj = null;\n        //var pdfScale = settings.pdfScale;\n\n        $(\"#\" + divId).addClass(\"main_officejs_container\");\n\n        if (file != \"\") {\n            fileObj = {\n                Obj: file,\n                ext: file.split('.').pop().toLowerCase()\n            }\n            getContent(fileObj, divId, settings.pdfSetting, settings.docxSetting, settings.pptxSetting, settings.sheetSetting, settings.imageSetting);\n        }\n        if (inputId != \"\") {\n            //TODO\n            $(\"#\" + inputId).on(\"change\", function (e) {\n                //var inputFileObj = $(this)[0].files[0];\n                var inputFileObj = e.target.files[0];\n                if (inputFileObj !== undefined) {\n                    var fName = inputFileObj.name;\n                    fileBlob = URL.createObjectURL(inputFileObj);\n                    fileObj = {\n                        Obj: fileBlob,\n                        ext: fName.split('.').pop().toLowerCase()\n                    }\n                }\n                getContent(fileObj, divId, settings.pdfSetting, settings.docxSetting, settings.pptxSetting, settings.sheetSetting, settings.imageSetting);\n            });\n        }\n    }\n    function getContent(fObj, divId, pdfSet, docxSet, pptxSet, sheetSet, imgSet) {\n        var ext = fObj.ext;\n        var file = fObj.file;\n        switch (ext) {\n            case \"pdf\":\n                //handel pdf file (https://mozilla.github.io/pdf.js/) -- V\n                getPdfContent(fObj, divId, pdfSet);\n                break;\n            case \"docx\":\n                //handel docx (https://github.com/mwilliamson/mammoth.js) -- V\n                getDocxContent(fObj, divId, docxSet);\n                break;\n            case \"doc\":\n                //handel doc file () -- X\n                getDocContent(fObj, divId, docxSet);\n                break;\n            case \"pptx\":\n                //handel pptx file (https://meshesha.github.io/pptxjs/) -- V\n                getPptxContent(fObj, divId, pptxSet);\n                break;\n            case \"ppt\":\n                //handel ppt file () -- X\n                getPptContent(fObj, divId, pptxSet);\n                break;\n            case \"xlsx\":\n            case \"xls\":\n            case \"xlw\":\n            case \"xlsb\":\n            case \"xlsm\":\n            case \"csv\":\n            case \"dbf\":\n            case \"dif\":\n            case \"slk\":\n            case \"sylk\":\n            case \"prn\":\n            case \"ods\":\n            case \"fods\":\n                //handel sheet file (https://github.com/sheetjs/js-xlsx) -- V\n                getSheetContent(fObj, divId, sheetSet);\n                break;\n            case \"gif\":\n            case \"jpg\":\n            case \"jpeg\":\n            case \"bmp\":\n            case \"tiff\":\n            case \"tif\":\n            case \"png\":\n            case \"svg\":\n                //handel imge  -- V\n                getImgContent(fObj, divId, imgSet);\n                break;\n            default:\n                unknownMsg(divId);\n        }\n        return\n    }\n    /////////////////////////////////////////////////PDF//////////////////////////////////////////\n    function getPdfContent(fObj, divId, pdfSet) {\n        $(\"#\" + divId).html(\"\");\n        //console.log(pdfSet)\n        //bug to fix : add to <html> dir if not exists- TODO\n        //var htmldir = $(\"html\").attr(\"dir\");\n        //console.log(htmldir)\n        var thumbnailViewOpt = (pdfSet.thumbnailViewBtn) ? \"\" : \"hidden\",\n            searchOpt = (pdfSet.searchBtn) ? \"\" : \"hidden\",\n            nextPreviousOpt = (pdfSet.nextPreviousBtn) ? \"\" : \"hidden\",\n            pageNumberOpt = (pdfSet.pageNumberTxt) ? \"\" : \"hidden\",\n            totalPagesOpt = (pdfSet.totalPagesLabel) ? \"\" : \"hidden\",\n            zoomOpt = (pdfSet.zoomBtns) ? \"\" : \"hidden\",\n            scaleSelectOpt = (pdfSet.scaleSelector) ? \"\" : \"hidden\",\n            presentationModeOpt = (pdfSet.presantationModeBtn) ? \"\" : \"hidden\",\n            openFileOpt = (pdfSet.openFileBtn) ? \"\" : \"hidden\",\n            printOpt = (pdfSet.printBtn) ? \"\" : \"hidden\",\n            downloadOpt = (pdfSet.downloadBtn) ? \"\" : \"hidden\",\n            bookmarkOpt = (pdfSet.bookmarkBtn) ? \"\" : \"hidden\",\n            secondaryToolbarOpt = (pdfSet.secondaryToolbarBtn) ? \"\" : \"hidden\",\n            firstPageOpt = (pdfSet.firstPageBtn) ? \"\" : \"hidden\",\n            lastPageOpt = (pdfSet.lastPageBtn) ? \"\" : \"hidden\",\n            pageRotateCwOpt = (pdfSet.pageRotateCwBtn) ? \"\" : \"hidden\",\n            pageRotateCcwOpt = (pdfSet.pageRotateCcwBtn) ? \"\" : \"hidden\",\n            cursorSelectTextOpt = (pdfSet.cursorSelectTextToolbarBtn) ? \"\" : \"hidden\",\n            cursorHandOpt = (pdfSet.cursorHandToolbarBtn) ? \"\" : \"hidden\";\n        setLang = pdfSet.setLang;\n        setLangFilesPath = pdfSet.setLangFilesPath;\n        ////////////////////////////////////////////\n        $(\"<div></div>\", {\n            class: \"loadingInProgress\",\n            id: \"mainPdfWarrper\"\n        }).appendTo('div#' + divId);\n        ////////////////////////////////////////////\n        $(\"<div></div>\", {\n            id: \"outerContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress\");\n\n        $(\"<div></div>\", {\n            id: \"printContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress\");\n        ///////////////////////////////////////////////////////\n        $(\"<div></div>\", {\n            id: \"sidebarContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer\");\n\n        $(\"<div></div>\", {\n            id: \"mainContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer\");\n\n        $(\"<div></div>\", {\n            id: \"overlayContainer\",\n            class: \"hidden\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer\");\n        ///////////////////////////////////////////////////////\n        $(\"<div></div>\", {\n            id: \"toolbarSidebar\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer\");\n\n        $(\"<div></div>\", {\n            id: \"sidebarContent\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer\");\n        ///////////////////////////////////////////////////////\n        $(\"<div></div>\", {\n            class: \"splitToolbarButton toggled\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar\");\n        ///////////////////////////////////////////////////////\n        $(\"<button></button>\", {\n            id: \"viewThumbnail\",\n            class: \"toolbarButton toggled\",\n            title: \"Show Thumbnails\",\n            tabindex: \"2\",\n            \"data-l10n-id\": \"thumbs\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"thumbs_label\",\n            text: \"Thumbnails\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton #viewThumbnail\");\n\n\n        $(\"<button></button>\", {\n            id: \"viewOutline\",\n            class: \"toolbarButton\",\n            title: \"Show Document Outline (double-click to expand/collapse all items)\",\n            tabindex: \"3\",\n            \"data-l10n-id\": \"document_outline\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"document_outline_label\",\n            text: \"Document Outline\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton #viewOutline\");\n\n\n        $(\"<button></button>\", {\n            id: \"viewAttachments\",\n            class: \"toolbarButton\",\n            title: \"Show Attachments\",\n            tabindex: \"4\",\n            \"data-l10n-id\": \"attachments\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"attachments_label\",\n            text: \"Attachments\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton #viewAttachments\");\n        ///////////////////////////////////////////////////////////////////////////////////////////\n        $(\"<div></div>\", {\n            id: \"thumbnailView\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #sidebarContent\");\n        $(\"<div></div>\", {\n            id: \"outlineView\",\n            class: \"hidden\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #sidebarContent\");\n        $(\"<div></div>\", {\n            id: \"attachmentsView\",\n            class: \"hidden\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #sidebarContent\");\n        ////////////////////////////////////////////////////////////////////////////////////////////////\n        $(\"<div></div>\", {\n            id: \"findbar\",\n            class: \"findbar hidden doorHanger\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\n        $(\"<div></div>\", {\n            id: \"findbarInputContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar\");\n\n        $(\"<input></input>\", {\n            id: \"findInput\",\n            class: \"toolbarField\",\n            title: \"Find\",\n            placeholder: \"Find in document…\",\n            tabindex: \"91\",\n            \"data-l10n-id\": \"find_input\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer\");\n        $(\"<div></div>\", {\n            class: \"splitToolbarButton\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer\");\n        $(\"<button></button>\", {\n            id: \"findPrevious\",\n            class: \"toolbarButton findPrevious\",\n            title: \"Find the previous occurrence of the phrase\",\n            tabindex: \"92\",\n            \"data-l10n-id\": \"find_previous\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer .splitToolbarButton\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"find_previous_label\",\n            text: \"Previous\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer .splitToolbarButton #findPrevious\");\n        $(\"<div></div>\", {\n            class: \"splitToolbarButtonSeparator\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer .splitToolbarButton\");\n        $(\"<button></button>\", {\n            id: \"findNext\",\n            class: \"toolbarButton findNext\",\n            title: \"Find the next occurrence of the phrase\",\n            tabindex: \"93\",\n            \"data-l10n-id\": \"find_next\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer .splitToolbarButton\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"find_next_label\",\n            text: \"Next\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer .splitToolbarButton #findNext\");\n\n        $(\"<div></div>\", {\n            id: \"findbarOptionsContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar\");\n        $(\"<input></input>\", {\n            id: \"findHighlightAll\",\n            type: \"checkbox\",\n            class: \"toolbarField\",\n            tabindex: \"94\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarOptionsContainer\");\n        $(\"<label></label>\", {\n            for: \"findHighlightAll\",\n            class: \"toolbarLabel\",\n            \"data-l10n-id\": \"find_highlight\",\n            text: \"Highlight all\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarOptionsContainer\");\n        $(\"<input></input>\", {\n            id: \"findMatchCase\",\n            type: \"checkbox\",\n            class: \"toolbarField\",\n            tabindex: \"95\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarOptionsContainer\");\n        $(\"<label></label>\", {\n            for: \"findMatchCase\",\n            class: \"toolbarLabel\",\n            \"data-l10n-id\": \"find_match_case_label\",\n            text: \"Match case\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarOptionsContainer\");\n        $(\"<span></span>\", {\n            id: \"findResultsCount\",\n            class: \"toolbarLabel hidden\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarOptionsContainer\");\n\n\n        $(\"<div></div>\", {\n            id: \"findbarMessageContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar\");\n        $(\"<span></span>\", {\n            id: \"findMsg\",\n            class: \"toolbarLabel\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarMessageContainer\");\n\n        $(\"<div></div>\", {\n            id: \"secondaryToolbar\",\n            class: \"secondaryToolbar hidden doorHangerRight\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\n        $(\"<div></div>\", {\n            id: \"secondaryToolbarButtonContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar\");\n        $(\"<button></button>\", {\n            id: \"secondaryPresentationMode\",\n            class: \"secondaryToolbarButton presentationMode visibleLargeView\",\n            title: \"Switch to Presentation Mode\",\n            tabindex: \"51\",\n            \"data-l10n-id\": \"presentation_mode\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"presentation_mode_label\",\n            text: \"Presentation Mode\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #secondaryPresentationMode\");\n\n        $(\"<button></button>\", {\n            id: \"secondaryOpenFile\",\n            class: \"secondaryToolbarButton openFile visibleLargeView\",\n            title: \"Open File\",\n            tabindex: \"52\",\n            \"data-l10n-id\": \"open_file\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"open_file_label\",\n            text: \"Open\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #secondaryOpenFile\");\n\n        $(\"<button></button>\", {\n            id: \"secondaryPrint\",\n            class: \"secondaryToolbarButton print visibleMediumView\",\n            title: \"Print\",\n            tabindex: \"53\",\n            \"data-l10n-id\": \"print\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"print_label\",\n            text: \"Print\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #secondaryPrint\");\n\n        $(\"<button></button>\", {\n            id: \"secondaryDownload\",\n            class: \"secondaryToolbarButton download visibleMediumView\",\n            title: \"Download\",\n            tabindex: \"54\",\n            \"data-l10n-id\": \"download\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"download_label\",\n            text: \"Download\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #secondaryDownload\");\n        $(\"<a></a>\", {\n            href: \"#\",\n            id: \"secondaryViewBookmark\",\n            class: \"secondaryToolbarButton bookmark visibleSmallView\",\n            title: \"Current view (copy or open in new window)\",\n            tabindex: \"55\",\n            \"data-l10n-id\": \"bookmark\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"bookmark_label\",\n            text: \"Current View\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #secondaryViewBookmark\");\n\n        $(\"<div></div>\", {\n            class: \"horizontalToolbarSeparator visibleLargeView\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<button></button>\", {\n            id: \"firstPage\",\n            class: \"secondaryToolbarButton firstPage \" + firstPageOpt,\n            title: \"Go to First Page\",\n            tabindex: \"56\",\n            \"data-l10n-id\": \"first_page\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"first_page_label\",\n            text: \"Go to First Page\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #firstPage\");\n\n        $(\"<button></button>\", {\n            id: \"lastPage\",\n            class: \"secondaryToolbarButton lastPage \" + lastPageOpt,\n            title: \"Go to Last Page\",\n            tabindex: \"57\",\n            \"data-l10n-id\": \"last_page\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"last_page_label\",\n            text: \"Go to Last Page\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #lastPage\");\n        $(\"<div></div>\", {\n            class: \"horizontalToolbarSeparator\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<button></button>\", {\n            id: \"pageRotateCw\",\n            class: \"secondaryToolbarButton rotateCw \" + pageRotateCwOpt,\n            title: \"Rotate Clockwise\",\n            tabindex: \"58\",\n            \"data-l10n-id\": \"page_rotate_cw\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"page_rotate_cw_label\",\n            text: \"Rotate Clockwise\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #pageRotateCw\");\n\n        $(\"<button></button>\", {\n            id: \"pageRotateCcw\",\n            class: \"secondaryToolbarButton rotateCcw \" + pageRotateCcwOpt,\n            title: \"Rotate Counterclockwise\",\n            tabindex: \"59\",\n            \"data-l10n-id\": \"page_rotate_ccw\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"page_rotate_ccw_label\",\n            text: \"Rotate Counterclockwise\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #pageRotateCcw\");\n\n        $(\"<div></div>\", {\n            class: \"horizontalToolbarSeparator\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n\n        $(\"<button></button>\", {\n            id: \"cursorSelectTool\",\n            class: \"secondaryToolbarButton selectTool toggled \" + cursorSelectTextOpt,\n            title: \"Enable Text Selection Tool\",\n            tabindex: \"60\",\n            \"data-l10n-id\": \"cursor_text_select_tool\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"cursor_text_select_tool_label\",\n            text: \"Text Selection Tool\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #cursorSelectTool\");\n\n        $(\"<button></button>\", {\n            id: \"cursorHandTool\",\n            class: \"secondaryToolbarButton handTool \" + cursorHandOpt,\n            title: \"Enable Hand Tool\",\n            tabindex: \"61\",\n            \"data-l10n-id\": \"cursor_hand_tool\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"cursor_hand_tool_label\",\n            text: \"Hand Tool\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #cursorHandTool\");\n\n        $(\"<div></div>\", {\n            class: \"horizontalToolbarSeparator hidden\"\n        }).appendTo(\"div#\" + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n\n        $(\"<button></button>\", {\n            id: \"pdfDocumentProperties\",\n            class: \"secondaryToolbarButton pdfDocumentProperties hidden\",\n            title: \"Document Properties…\",\n            tabindex: \"62\",\n            \"data-l10n-id\": \"document_properties\"\n        }).appendTo(\"div#\" + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"document_properties_label\",\n            text: \"Document Properties…\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #pdfDocumentProperties\");\n\n        $(\"<div></div>\", {\n            class: \"toolbar\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\n        $(\"<div></div>\", {\n            id: \"toolbarContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar\");\n        $(\"<div></div>\", {\n            id: \"toolbarViewer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer\");\n        $(\"<div></div>\", {\n            id: \"toolbarViewerLeft\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer\");\n        $(\"<button></button>\", {\n            id: \"sidebarToggle\",\n            class: \"toolbarButton \" + thumbnailViewOpt,\n            title: \"Toggle Sidebar\",\n            tabindex: \"11\",\n            \"data-l10n-id\": \"toggle_sidebar\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"toggle_sidebar_label\",\n            title: \"Toggle Sidebar\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft #sidebarToggle\");\n        $(\"<div></div>\", {\n            class: \"toolbarButtonSpacer\",\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\n        $(\"<button></button>\", {\n            id: \"viewFind\",\n            class: \"toolbarButton \" + searchOpt,\n            title: \"Find in Document\",\n            tabindex: \"12\",\n            \"data-l10n-id\": \"findbar\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"findbar_label\",\n            title: \"Find\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft #viewFind\");\n        $(\"<div></div>\", {\n            class: \"splitToolbarButton hiddenSmallView \" + nextPreviousOpt,\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\n        $(\"<button></button>\", {\n            class: \"toolbarButton pageUp\",\n            title: \"Previous Page\",\n            id: \"previous\",\n            tabindex: \"13\",\n            \"data-l10n-id\": \"previous\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft .hiddenSmallView\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"previous_label\",\n            text: \"Previous\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft .hiddenSmallView #previous\");\n        $(\"<div></div>\", {\n            class: \"splitToolbarButtonSeparator\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft .hiddenSmallView\");\n        $(\"<button></button>\", {\n            class: \"toolbarButton pageDown\",\n            title: \"Next Pagee\",\n            id: \"next\",\n            tabindex: \"14\",\n            \"data-l10n-id\": \"next\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft .hiddenSmallView\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"next_label\",\n            text: \"Next\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft .hiddenSmallView #next\");\n        $(\"<input></input>\", {\n            type: \"number\",\n            id: \"pageNumber\",\n            class: \"toolbarField pageNumber \" + pageNumberOpt,\n            title: \"Page\",\n            value: \"1\",\n            size: \"4\",\n            min: \"1\",\n            tabindex: \"15\",\n            \"data-l10n-id\": \"page\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\n        $(\"<span></span>\", {\n            id: \"numPages\",\n            class: \"toolbarLabel \" + totalPagesOpt\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\n\n        $(\"<div></div>\", {\n            id: \"toolbarViewerRight\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer\");\n        $(\"<button></button>\", {\n            id: \"presentationMode\",\n            class: \"toolbarButton presentationMode hiddenLargeView \" + presentationModeOpt,\n            title: \"Switch to Presentation Mode\",\n            tabindex: \"31\",\n            \"data-l10n-id\": \"presentation_mode\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"presentation_mode_label\",\n            text: \"Presentation Mode\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #presentationMode\");\n        $(\"<button></button>\", {\n            id: \"openFile\",\n            class: \"toolbarButton openFile hiddenLargeView \" + openFileOpt,\n            title: \"Open File\",\n            tabindex: \"32\",\n            \"data-l10n-id\": \"open_file\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"open_file_label\",\n            text: \"Open\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #openFile\");\n        $(\"<button></button>\", {\n            id: \"print\",\n            class: \"toolbarButton print hiddenMediumView \" + printOpt,\n            title: \"Print\",\n            tabindex: \"33\",\n            \"data-l10n-id\": \"print\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"print_label\",\n            text: \"Print\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #print\");\n        $(\"<button></button>\", {\n            id: \"download\",\n            class: \"toolbarButton download hiddenMediumView \" + downloadOpt,\n            title: \"Download\",\n            tabindex: \"34\",\n            \"data-l10n-id\": \"download\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"download_label\",\n            text: \"Download\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #download\");\n        $(\"<a></a>\", {\n            href: \"#\",\n            id: \"viewBookmark\",\n            class: \"toolbarButton bookmark hiddenSmallView \" + bookmarkOpt,\n            title: \"Current view (copy or open in new window)\",\n            tabindex: \"35\",\n            \"data-l10n-id\": \"bookmark\",\n            target: \"_blank\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"bookmark_label\",\n            text: \"Current View\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #viewBookmark\");\n        $(\"<div></div>\", {\n            class: \"verticalToolbarSeparator hiddenSmallView\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\n        $(\"<button></button>\", {\n            id: \"secondaryToolbarToggle\",\n            class: \"toolbarButton \" + secondaryToolbarOpt,\n            title: \"Tools\",\n            tabindex: \"35\",\n            \"data-l10n-id\": \"tools\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"tools_label\",\n            text: \"Tools\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #secondaryToolbarToggle\");\n\n        $(\"<div></div>\", {\n            id: \"toolbarViewerMiddle\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer\");\n        $(\"<div></div>\", {\n            class: \"splitToolbarButton \" + zoomOpt\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle\");\n        $(\"<button></button>\", {\n            id: \"zoomOut\",\n            class: \"toolbarButton zoomOut\",\n            title: \"Zoom Out\",\n            tabindex: \"21\",\n            \"data-l10n-id\": \"zoom_out\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle .splitToolbarButton\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"zoom_out_label\",\n            text: \"Zoom Out\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle .splitToolbarButton #zoomOut\");\n        $(\"<div></div>\", {\n            class: \"splitToolbarButtonSeparator\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle .splitToolbarButton\");\n        $(\"<button></button>\", {\n            id: \"zoomIn\",\n            class: \"toolbarButton zoomIn\",\n            title: \"Zoom In\",\n            tabindex: \"22\",\n            \"data-l10n-id\": \"zoom_in\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle .splitToolbarButton\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"zoom_in_label\",\n            text: \"Zoom In\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle .splitToolbarButton #zoomIn\");\n\n        $(\"<span></span>\", {\n            id: \"scaleSelectContainer\",\n            class: \"dropdownToolbarButton\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle\");\n        $(\"<select></select>\", {\n            id: \"scaleSelect\",\n            title: \"Zoom\",\n            tabindex: \"23\",\n            \"data-l10n-id\": \"zoom\",\n            class: scaleSelectOpt\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer\");\n        $(\"<option></option>\", {\n            id: \"pageAutoOption\",\n            title: \"\",\n            value: \"auto\",\n            selected: \"selected\",\n            \"data-l10n-id\": \"page_scale_auto\",\n            text: \"Automatic Zoom\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            id: \"pageActualOption\",\n            title: \"\",\n            value: \"page-actual\",\n            \"data-l10n-id\": \"page_scale_actual\",\n            text: \"Actual Size\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            id: \"pageFitOption\",\n            title: \"\",\n            value: \"page-fit\",\n            \"data-l10n-id\": \"page_scale_fit\",\n            text: \"Page Fit\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            id: \"pageWidthOption\",\n            title: \"\",\n            value: \"page-width\",\n            \"data-l10n-id\": \"page_scale_width\",\n            text: \"Page Width\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            id: \"customScaleOption\",\n            title: \"\",\n            value: \"custom\",\n            disabled: \"disabled\",\n            hidden: \"true\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            title: \"\",\n            value: \"0.5\",\n            \"data-l10n-id\": \"page_scale_percent\",\n            \"data-l10n-args\": '{ \"scale\": 50 }',\n            text: \"50%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            title: \"\",\n            value: \"0.75\",\n            \"data-l10n-id\": \"page_scale_percent\",\n            \"data-l10n-args\": '{ \"scale\": 75 }',\n            text: \"75%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            title: \"\",\n            value: \"1\",\n            \"data-l10n-id\": \"page_scale_percent\",\n            \"data-l10n-args\": '{ \"scale\": 100 }',\n            text: \"100%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            title: \"\",\n            value: \"1.25\",\n            \"data-l10n-id\": \"page_scale_percent\",\n            \"data-l10n-args\": '{ \"scale\": 125 }',\n            text: \"125%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            title: \"\",\n            value: \"1.5\",\n            \"data-l10n-id\": \"page_scale_percent\",\n            \"data-l10n-args\": '{ \"scale\": 150 }',\n            text: \"150%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            title: \"\",\n            value: \"2\",\n            \"data-l10n-id\": \"page_scale_percent\",\n            \"data-l10n-args\": '{ \"scale\": 200 }',\n            text: \"200%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            title: \"\",\n            value: \"3\",\n            \"data-l10n-id\": \"page_scale_percent\",\n            \"data-l10n-args\": '{ \"scale\": 300 }',\n            text: \"300%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            title: \"\",\n            value: \"4\",\n            \"data-l10n-id\": \"page_scale_percent\",\n            \"data-l10n-args\": '{ \"scale\": 400 }',\n            text: \"400%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n\n        $(\"<div></div>\", {\n            id: \"loadingBar\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer\");\n        $(\"<div></div>\", {\n            class: \"progress\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #loadingBar\");\n        $(\"<div></div>\", {\n            class: \"glimmer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #loadingBar .progress\");\n\n        $(\"<menu></menu>\", {\n            id: \"viewerContextMenu\",\n            type: \"context\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\n        $(\"<menuitem></menuitem>\", {\n            id: \"contextFirstPage\",\n            label: \"First Page\",\n            \"data-l10n-id\": \"first_page\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #viewerContextMenu\");\n\n        $(\"<menuitem></menuitem>\", {\n            id: \"contextLastPage\",\n            label: \"Last Page\",\n            \"data-l10n-id\": \"last_page\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #viewerContextMenu\");\n        $(\"<menuitem></menuitem>\", {\n            id: \"contextPageRotateCw\",\n            label: \"Rotate Clockwise\",\n            \"data-l10n-id\": \"page_rotate_cw\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #viewerContextMenu\");\n        $(\"<menuitem></menuitem>\", {\n            id: \"contextPageRotateCcw\",\n            label: \"Rotate Counter-Clockwise\",\n            \"data-l10n-id\": \"page_rotate_ccw\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #viewerContextMenu\");\n\n        $(\"<div></div>\", {\n            id: \"viewerContainer\",\n            tabindex: \"0\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\n        $(\"<div></div>\", {\n            id: \"viewer\",\n            class: \"pdfViewer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #viewerContainer\");\n\n        $(\"<div></div>\", {\n            id: \"errorWrapper\",\n            hidden: \"true\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\n        $(\"<div></div>\", {\n            id: \"errorMessageLeft\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper\");\n        $(\"<span></span>\", {\n            id: \"errorMessage\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper #errorMessageLeft\");\n        $(\"<button></button>\", {\n            id: \"errorShowMore\",\n            \"data-l10n-id\": \"error_more_info\",\n            text: \"More Information\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper #errorMessageLeft\");\n        $(\"<button></button>\", {\n            id: \"errorShowLess\",\n            \"data-l10n-id\": \"error_less_info\",\n            text: \"Less Information\",\n            hidden: \"true\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper #errorMessageLeft\");\n\n        $(\"<div></div>\", {\n            id: \"errorMessageRight\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper\");\n        $(\"<button></button>\", {\n            id: \"errorClose\",\n            \"data-l10n-id\": \"error_close\",\n            text: \"Close\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper #errorMessageRight\");\n\n        $(\"<div></div>\", {\n            class: \"clearBoth\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper\");\n        $(\"<textarea></textarea>\", {\n            id: \"errorMoreInfo\",\n            hidden: 'true',\n            readonly: \"readonly\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper\");\n        $(\"<div></div>\", {\n            id: \"passwordOverlay\",\n            class: \"container hidden\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer\");\n        $(\"<div></div>\", {\n            class: \"dialog\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay\");\n        $(\"<div></div>\", {\n            class: \"row\",\n            id: \"firstRow\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog\");\n        $(\"<p></p>\", {\n            id: \"passwordText\",\n            \"data-l10n-id\": \"password_label\",\n            text: \"Enter the password to open this PDF file:\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog #firstRow\");\n        $(\"<div></div>\", {\n            class: \"row\",\n            id: \"midleRow\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog\");\n        $(\"<input/>\", {\n            type: \"password\",\n            id: \"password\",\n            class: \"toolbarField\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog #midleRow\");\n        $(\"<div></div>\", {\n            class: \"buttonRow\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog\");\n        $(\"<button></button>\", {\n            id: \"passwordCancel\",\n            class: \"overlayButton\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog .buttonRow\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"password_cancel\",\n            text: \"Cancel\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog .buttonRow #passwordCancel\");\n        $(\"<button></button>\", {\n            id: \"passwordSubmit\",\n            class: \"overlayButton\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog .buttonRow\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"password_ok\",\n            text: \"OK\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog .buttonRow #passwordSubmit\");\n\n        $(\"<div></div>\", {\n            id: \"documentPropertiesOverlay\",\n            class: \"container hidden\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer\");\n\n        $(\"<div></div>\", {\n            id: \"printServiceOverlay\",\n            class: \"container hidden\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer\");\n        $(\"<div></div>\", {\n            class: \"dialog\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay\");\n        $(\"<div></div>\", {\n            class: \"row\",\n            id: \"printFirsRwo\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"print_progress_message\",\n            text: \"Preparing document for printing…\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog #printFirsRwo\");\n        $(\"<div></div>\", {\n            class: \"row\",\n            id: \"printSecondRwo\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog\");\n        $(\"<progress></progress>\", {\n            value: \"0\",\n            max: \"100\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog #printSecondRwo\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"print_progress_percent\",\n            \"data-l10n-args\": '{ \"progress\": 0 }',\n            class: \"relative-progress\",\n            text: \"0%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog #printSecondRwo\");\n        $(\"<div></div>\", {\n            class: \"buttonRow\",\n            id: \"printThirdRwo\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog\");\n        $(\"<button></button>\", {\n            class: \"overlayButton\",\n            id: \"printCancel\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog #printThirdRwo\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"print_progress_close\",\n            text: \"Cancel\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog #printThirdRwo\");\n\n        var my_pdf_file = fObj.Obj;\n\n        var currentScriptPath = function () {\n            var dir = document.querySelector('script[src$=\"pdf.js\"]').getAttribute('src');\n            var name = dir.split('/').pop();\n            return dir.replace('/' + name, \"\");\n        };\n        function diff2(a, b) {\n            var i, la = a.length, lb = b.length, res = [];\n            if (!la) return b;\n            else if (!lb) return a;\n            for (i = 0; i < la; i++) {\n                if (b.indexOf(a[i]) === -1) res.push(a[i]);\n            }\n            for (i = 0; i < lb; i++) {\n                if (a.indexOf(b[i]) === -1) res.push(b[i]);\n            }\n            return res;\n        }\n        var full_path = location.href;\n        var pdfScriptPath = currentScriptPath();\n        if (pdfScriptPath.indexOf(full_path) > -1) {\n            var link_a_array = pdfScriptPath.split(\"/\");\n            var link_b_array = full_path.split(\"/\");\n            var link_diff = diff2(link_a_array, link_b_array).join(\"/\");\n            pdfScriptPath = link_diff;\n            /*\n            console.log(\n                \"\\nscript path: \", currentScriptPath(),\n                \"\\nfull path:\", full_path,\n                \"\\nlink_diff: \", link_diff,\n                \"\\nsetLangFilesPath: \", setLangFilesPath\n            );\n            */\n        }\n        setLangFilesPath = (setLangFilesPath != \"\") ? full_path + setLangFilesPath + \"/locale.properties\" : \"\";\n        $(\"<link>\", {\n            rel: \"resource\",\n            type: \"application/l10n\",\n            href: (setLangFilesPath != \"\") ? setLangFilesPath : pdfScriptPath + \"/locale/locale.properties\"\n        }).appendTo(\"#\" + divId);\n\n        $(\"#mainPdfWarrper\").bind('destroyed', function () {\n            //if exit from pdf viewer mode\n            //return orginal Warrper dir\n            var orgnlHtmldir = sessionStorage.getItem(\"o2h_orginal_html_dir\");\n            if (orgnlHtmldir !== undefined) {\n                $(\"#mainPdfWarrper\").attr(\"dir\", orgnlHtmldir);\n            }\n        });\n    /* Copyright 2017 Mozilla Foundation\n    *\n    * Licensed under the Apache License, Version 2.0 (the \"License\");\n    * you may not use this file except in compliance with the License.\n    * You may obtain a copy of the License at\n    *\n    *     http://www.apache.org/licenses/LICENSE-2.0\n    *\n    * Unless required by applicable law or agreed to in writing, software\n    * distributed under the License is distributed on an \"AS IS\" BASIS,\n    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    * See the License for the specific language governing permissions and\n    * limitations under the License.\n    */\n\n    /******/ (function (modules) { // webpackBootstrap\n    /******/ \t// The module cache\n    /******/ \tvar installedModules = {};\n    /******/\n    /******/ \t// The require function\n    /******/ \tfunction __webpack_require__(moduleId) {\n    /******/\n    /******/ \t\t// Check if module is in cache\n    /******/ \t\tif (installedModules[moduleId]) {\n    /******/ \t\t\treturn installedModules[moduleId].exports;\n                    /******/\n                }\n    /******/ \t\t// Create a new module (and put it into the cache)\n    /******/ \t\tvar module = installedModules[moduleId] = {\n    /******/ \t\t\ti: moduleId,\n    /******/ \t\t\tl: false,\n    /******/ \t\t\texports: {}\n                    /******/\n                };\n    /******/\n    /******/ \t\t// Execute the module function\n    /******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n    /******/\n    /******/ \t\t// Flag the module as loaded\n    /******/ \t\tmodule.l = true;\n    /******/\n    /******/ \t\t// Return the exports of the module\n    /******/ \t\treturn module.exports;\n                /******/\n            }\n    /******/\n    /******/\n    /******/ \t// expose the modules object (__webpack_modules__)\n    /******/ \t__webpack_require__.m = modules;\n    /******/\n    /******/ \t// expose the module cache\n    /******/ \t__webpack_require__.c = installedModules;\n    /******/\n    /******/ \t// identity function for calling harmony imports with the correct context\n    /******/ \t__webpack_require__.i = function (value) { return value; };\n    /******/\n    /******/ \t// define getter function for harmony exports\n    /******/ \t__webpack_require__.d = function (exports, name, getter) {\n    /******/ \t\tif (!__webpack_require__.o(exports, name)) {\n    /******/ \t\t\tObject.defineProperty(exports, name, {\n    /******/ \t\t\t\tconfigurable: false,\n    /******/ \t\t\t\tenumerable: true,\n    /******/ \t\t\t\tget: getter\n                /******/\n            });\n                    /******/\n                }\n                /******/\n            };\n    /******/\n    /******/ \t// getDefaultExport function for compatibility with non-harmony modules\n    /******/ \t__webpack_require__.n = function (module) {\n    /******/ \t\tvar getter = module && module.__esModule ?\n    /******/ \t\t\tfunction getDefault() { return module['default']; } :\n    /******/ \t\t\tfunction getModuleExports() { return module; };\n    /******/ \t\t__webpack_require__.d(getter, 'a', getter);\n    /******/ \t\treturn getter;\n                /******/\n            };\n    /******/\n    /******/ \t// Object.prototype.hasOwnProperty.call\n    /******/ \t__webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n    /******/\n    /******/ \t// __webpack_public_path__\n    /******/ \t__webpack_require__.p = \"\";\n    /******/\n    /******/ \t// Load entry module and return exports\n    /******/ \treturn __webpack_require__(__webpack_require__.s = 33);\n            /******/\n        })\n    /************************************************************************/\n    /******/([\n    /* 0 */\n    /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.localized = exports.animationStarted = exports.normalizeWheelEventDelta = exports.binarySearchFirstItem = exports.watchScroll = exports.scrollIntoView = exports.getOutputScale = exports.approximateFraction = exports.roundToDivide = exports.getVisibleElements = exports.parseQueryString = exports.noContextMenuHandler = exports.getPDFFileNameFromURL = exports.ProgressBar = exports.EventBus = exports.NullL10n = exports.mozL10n = exports.RendererType = exports.cloneObj = exports.VERTICAL_PADDING = exports.SCROLLBAR_PADDING = exports.MAX_AUTO_SCALE = exports.UNKNOWN_SCALE = exports.MAX_SCALE = exports.MIN_SCALE = exports.DEFAULT_SCALE = exports.DEFAULT_SCALE_VALUE = exports.CSS_UNITS = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var CSS_UNITS = 96.0 / 72.0;\n                var DEFAULT_SCALE_VALUE = 'auto';\n                var DEFAULT_SCALE = 1.0;\n                var MIN_SCALE = 0.25;\n                var MAX_SCALE = 10.0;\n                var UNKNOWN_SCALE = 0;\n                var MAX_AUTO_SCALE = 1.25;\n                var SCROLLBAR_PADDING = 40;\n                var VERTICAL_PADDING = 5;\n                var RendererType = {\n                    CANVAS: 'canvas',\n                    SVG: 'svg'\n                };\n                function formatL10nValue(text, args) {\n                    if (!args) {\n                        return text;\n                    }\n                    return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, function (all, name) {\n                        return name in args ? args[name] : '{{' + name + '}}';\n                    });\n                }\n                var NullL10n = {\n                    get: function get(property, args, fallback) {\n                        return Promise.resolve(formatL10nValue(fallback, args));\n                    },\n                    translate: function translate(element) {\n                        return Promise.resolve();\n                    }\n                };\n                _pdfjsLib.PDFJS.disableFullscreen = _pdfjsLib.PDFJS.disableFullscreen === undefined ? false : _pdfjsLib.PDFJS.disableFullscreen;\n                _pdfjsLib.PDFJS.useOnlyCssZoom = _pdfjsLib.PDFJS.useOnlyCssZoom === undefined ? false : _pdfjsLib.PDFJS.useOnlyCssZoom;\n                _pdfjsLib.PDFJS.maxCanvasPixels = _pdfjsLib.PDFJS.maxCanvasPixels === undefined ? 16777216 : _pdfjsLib.PDFJS.maxCanvasPixels;\n                _pdfjsLib.PDFJS.disableHistory = _pdfjsLib.PDFJS.disableHistory === undefined ? false : _pdfjsLib.PDFJS.disableHistory;\n                _pdfjsLib.PDFJS.disableTextLayer = _pdfjsLib.PDFJS.disableTextLayer === undefined ? false : _pdfjsLib.PDFJS.disableTextLayer;\n                _pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom = _pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom === undefined ? false : _pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom;\n                {\n                    //_pdfjsLib.PDFJS.locale = _pdfjsLib.PDFJS.locale === undefined && typeof navigator !== 'undefined' ? navigator.language : _pdfjsLib.PDFJS.locale;\n                    if (_pdfjsLib.PDFJS.locale === undefined && typeof navigator !== 'undefined') {\n                        if (setLang != \"\") {\n                            _pdfjsLib.PDFJS.locale = setLang;\n                        } else {\n                            _pdfjsLib.PDFJS.locale = navigator.language; //set lang here - TODO\n                        }\n                        //console.log(\"_pdfjsLib.PDFJS.locale (lang)= \" + _pdfjsLib.PDFJS.locale); \n                    }\n                }\n                function getOutputScale(ctx) {\n                    var devicePixelRatio = window.devicePixelRatio || 1;\n                    var backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;\n                    var pixelRatio = devicePixelRatio / backingStoreRatio;\n                    return {\n                        sx: pixelRatio,\n                        sy: pixelRatio,\n                        scaled: pixelRatio !== 1\n                    };\n                }\n                function scrollIntoView(element, spot) {\n                    var skipOverflowHiddenElements = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n                    var parent = element.offsetParent;\n                    if (!parent) {\n                        console.error('offsetParent is not set -- cannot scroll');\n                        return;\n                    }\n                    var offsetY = element.offsetTop + element.clientTop;\n                    var offsetX = element.offsetLeft + element.clientLeft;\n                    while (parent.clientHeight === parent.scrollHeight || skipOverflowHiddenElements && getComputedStyle(parent).overflow === 'hidden') {\n                        if (parent.dataset._scaleY) {\n                            offsetY /= parent.dataset._scaleY;\n                            offsetX /= parent.dataset._scaleX;\n                        }\n                        offsetY += parent.offsetTop;\n                        offsetX += parent.offsetLeft;\n                        parent = parent.offsetParent;\n                        if (!parent) {\n                            return;\n                        }\n                    }\n                    if (spot) {\n                        if (spot.top !== undefined) {\n                            offsetY += spot.top;\n                        }\n                        if (spot.left !== undefined) {\n                            offsetX += spot.left;\n                            parent.scrollLeft = offsetX;\n                        }\n                    }\n                    parent.scrollTop = offsetY;\n                }\n                function watchScroll(viewAreaElement, callback) {\n                    var debounceScroll = function debounceScroll(evt) {\n                        if (rAF) {\n                            return;\n                        }\n                        rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {\n                            rAF = null;\n                            var currentY = viewAreaElement.scrollTop;\n                            var lastY = state.lastY;\n                            if (currentY !== lastY) {\n                                state.down = currentY > lastY;\n                            }\n                            state.lastY = currentY;\n                            callback(state);\n                        });\n                    };\n                    var state = {\n                        down: true,\n                        lastY: viewAreaElement.scrollTop,\n                        _eventHandler: debounceScroll\n                    };\n                    var rAF = null;\n                    viewAreaElement.addEventListener('scroll', debounceScroll, true);\n                    return state;\n                }\n                function parseQueryString(query) {\n                    var parts = query.split('&');\n                    var params = Object.create(null);\n                    for (var i = 0, ii = parts.length; i < ii; ++i) {\n                        var param = parts[i].split('=');\n                        var key = param[0].toLowerCase();\n                        var value = param.length > 1 ? param[1] : null;\n                        params[decodeURIComponent(key)] = decodeURIComponent(value);\n                    }\n                    return params;\n                }\n                function binarySearchFirstItem(items, condition) {\n                    var minIndex = 0;\n                    var maxIndex = items.length - 1;\n                    if (items.length === 0 || !condition(items[maxIndex])) {\n                        return items.length;\n                    }\n                    if (condition(items[minIndex])) {\n                        return minIndex;\n                    }\n                    while (minIndex < maxIndex) {\n                        var currentIndex = minIndex + maxIndex >> 1;\n                        var currentItem = items[currentIndex];\n                        if (condition(currentItem)) {\n                            maxIndex = currentIndex;\n                        } else {\n                            minIndex = currentIndex + 1;\n                        }\n                    }\n                    return minIndex;\n                }\n                function approximateFraction(x) {\n                    if (Math.floor(x) === x) {\n                        return [x, 1];\n                    }\n                    var xinv = 1 / x;\n                    var limit = 8;\n                    if (xinv > limit) {\n                        return [1, limit];\n                    } else if (Math.floor(xinv) === xinv) {\n                        return [1, xinv];\n                    }\n                    var x_ = x > 1 ? xinv : x;\n                    var a = 0,\n                        b = 1,\n                        c = 1,\n                        d = 1;\n                    while (true) {\n                        var p = a + c,\n                            q = b + d;\n                        if (q > limit) {\n                            break;\n                        }\n                        if (x_ <= p / q) {\n                            c = p;\n                            d = q;\n                        } else {\n                            a = p;\n                            b = q;\n                        }\n                    }\n                    var result = void 0;\n                    if (x_ - a / b < c / d - x_) {\n                        result = x_ === x ? [a, b] : [b, a];\n                    } else {\n                        result = x_ === x ? [c, d] : [d, c];\n                    }\n                    return result;\n                }\n                function roundToDivide(x, div) {\n                    var r = x % div;\n                    return r === 0 ? x : Math.round(x - r + div);\n                }\n                function getVisibleElements(scrollEl, views) {\n                    var sortByVisibility = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n                    var top = scrollEl.scrollTop,\n                        bottom = top + scrollEl.clientHeight;\n                    var left = scrollEl.scrollLeft,\n                        right = left + scrollEl.clientWidth;\n                    function isElementBottomBelowViewTop(view) {\n                        var element = view.div;\n                        var elementBottom = element.offsetTop + element.clientTop + element.clientHeight;\n                        return elementBottom > top;\n                    }\n                    var visible = [],\n                        view = void 0,\n                        element = void 0;\n                    var currentHeight = void 0,\n                        viewHeight = void 0,\n                        hiddenHeight = void 0,\n                        percentHeight = void 0;\n                    var currentWidth = void 0,\n                        viewWidth = void 0;\n                    var firstVisibleElementInd = views.length === 0 ? 0 : binarySearchFirstItem(views, isElementBottomBelowViewTop);\n                    for (var i = firstVisibleElementInd, ii = views.length; i < ii; i++) {\n                        view = views[i];\n                        element = view.div;\n                        currentHeight = element.offsetTop + element.clientTop;\n                        viewHeight = element.clientHeight;\n                        if (currentHeight > bottom) {\n                            break;\n                        }\n                        currentWidth = element.offsetLeft + element.clientLeft;\n                        viewWidth = element.clientWidth;\n                        if (currentWidth + viewWidth < left || currentWidth > right) {\n                            continue;\n                        }\n                        hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, currentHeight + viewHeight - bottom);\n                        percentHeight = (viewHeight - hiddenHeight) * 100 / viewHeight | 0;\n                        visible.push({\n                            id: view.id,\n                            x: currentWidth,\n                            y: currentHeight,\n                            view: view,\n                            percent: percentHeight\n                        });\n                    }\n                    var first = visible[0];\n                    var last = visible[visible.length - 1];\n                    if (sortByVisibility) {\n                        visible.sort(function (a, b) {\n                            var pc = a.percent - b.percent;\n                            if (Math.abs(pc) > 0.001) {\n                                return -pc;\n                            }\n                            return a.id - b.id;\n                        });\n                    }\n                    return {\n                        first: first,\n                        last: last,\n                        views: visible\n                    };\n                }\n                function noContextMenuHandler(evt) {\n                    evt.preventDefault();\n                }\n                function isDataSchema(url) {\n                    var i = 0,\n                        ii = url.length;\n                    while (i < ii && url[i].trim() === '') {\n                        i++;\n                    }\n                    return url.substr(i, 5).toLowerCase() === 'data:';\n                }\n                function getPDFFileNameFromURL(url) {\n                    var defaultFilename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'document.pdf';\n\n                    if (isDataSchema(url)) {\n                        console.warn('getPDFFileNameFromURL: ' + 'ignoring \"data:\" URL for performance reasons.');\n                        return defaultFilename;\n                    }\n                    var reURI = /^(?:(?:[^:]+:)?\\/\\/[^\\/]+)?([^?#]*)(\\?[^#]*)?(#.*)?$/;\n                    var reFilename = /[^\\/?#=]+\\.pdf\\b(?!.*\\.pdf\\b)/i;\n                    var splitURI = reURI.exec(url);\n                    var suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]);\n                    if (suggestedFilename) {\n                        suggestedFilename = suggestedFilename[0];\n                        if (suggestedFilename.indexOf('%') !== -1) {\n                            try {\n                                suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0];\n                            } catch (ex) { }\n                        }\n                    }\n                    return suggestedFilename || defaultFilename;\n                }\n                function normalizeWheelEventDelta(evt) {\n                    var delta = Math.sqrt(evt.deltaX * evt.deltaX + evt.deltaY * evt.deltaY);\n                    var angle = Math.atan2(evt.deltaY, evt.deltaX);\n                    if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {\n                        delta = -delta;\n                    }\n                    var MOUSE_DOM_DELTA_PIXEL_MODE = 0;\n                    var MOUSE_DOM_DELTA_LINE_MODE = 1;\n                    var MOUSE_PIXELS_PER_LINE = 30;\n                    var MOUSE_LINES_PER_PAGE = 30;\n                    if (evt.deltaMode === MOUSE_DOM_DELTA_PIXEL_MODE) {\n                        delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;\n                    } else if (evt.deltaMode === MOUSE_DOM_DELTA_LINE_MODE) {\n                        delta /= MOUSE_LINES_PER_PAGE;\n                    }\n                    return delta;\n                }\n                function cloneObj(obj) {\n                    var result = Object.create(null);\n                    for (var i in obj) {\n                        if (Object.prototype.hasOwnProperty.call(obj, i)) {\n                            result[i] = obj[i];\n                        }\n                    }\n                    return result;\n                }\n                var animationStarted = new Promise(function (resolve) {\n                    window.requestAnimationFrame(resolve);\n                });\n                var mozL10n = void 0;\n                var localized = Promise.resolve();\n\n                var EventBus = function () {\n                    function EventBus() {\n                        _classCallCheck(this, EventBus);\n\n                        this._listeners = Object.create(null);\n                    }\n\n                    _createClass(EventBus, [{\n                        key: 'on',\n                        value: function on(eventName, listener) {\n                            var eventListeners = this._listeners[eventName];\n                            if (!eventListeners) {\n                                eventListeners = [];\n                                this._listeners[eventName] = eventListeners;\n                            }\n                            eventListeners.push(listener);\n                        }\n                    }, {\n                        key: 'off',\n                        value: function off(eventName, listener) {\n                            var eventListeners = this._listeners[eventName];\n                            var i = void 0;\n                            if (!eventListeners || (i = eventListeners.indexOf(listener)) < 0) {\n                                return;\n                            }\n                            eventListeners.splice(i, 1);\n                        }\n                    }, {\n                        key: 'dispatch',\n                        value: function dispatch(eventName) {\n                            var eventListeners = this._listeners[eventName];\n                            if (!eventListeners || eventListeners.length === 0) {\n                                return;\n                            }\n                            var args = Array.prototype.slice.call(arguments, 1);\n                            eventListeners.slice(0).forEach(function (listener) {\n                                listener.apply(null, args);\n                            });\n                        }\n                    }]);\n\n                    return EventBus;\n                }();\n\n                function clamp(v, min, max) {\n                    return Math.min(Math.max(v, min), max);\n                }\n\n                var ProgressBar = function () {\n                    function ProgressBar(id) {\n                        var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n                            height = _ref.height,\n                            width = _ref.width,\n                            units = _ref.units;\n\n                        _classCallCheck(this, ProgressBar);\n\n                        this.visible = true;\n                        this.div = document.querySelector(id + ' .progress');\n                        this.bar = this.div.parentNode;\n                        this.height = height || 100;\n                        this.width = width || 100;\n                        this.units = units || '%';\n                        this.div.style.height = this.height + this.units;\n                        this.percent = 0;\n                    }\n\n                    _createClass(ProgressBar, [{\n                        key: '_updateBar',\n                        value: function _updateBar() {\n                            if (this._indeterminate) {\n                                this.div.classList.add('indeterminate');\n                                this.div.style.width = this.width + this.units;\n                                return;\n                            }\n                            this.div.classList.remove('indeterminate');\n                            var progressSize = this.width * this._percent / 100;\n                            this.div.style.width = progressSize + this.units;\n                        }\n                    }, {\n                        key: 'setWidth',\n                        value: function setWidth(viewer) {\n                            if (!viewer) {\n                                return;\n                            }\n                            var container = viewer.parentNode;\n                            var scrollbarWidth = container.offsetWidth - viewer.offsetWidth;\n                            if (scrollbarWidth > 0) {\n                                this.bar.setAttribute('style', 'width: calc(100% - ' + scrollbarWidth + 'px);');\n                            }\n                        }\n                    }, {\n                        key: 'hide',\n                        value: function hide() {\n                            if (!this.visible) {\n                                return;\n                            }\n                            this.visible = false;\n                            this.bar.classList.add('hidden');\n                            document.body.classList.remove('loadingInProgress');\n                        }\n                    }, {\n                        key: 'show',\n                        value: function show() {\n                            if (this.visible) {\n                                return;\n                            }\n                            this.visible = true;\n                            document.body.classList.add('loadingInProgress');\n                            this.bar.classList.remove('hidden');\n                        }\n                    }, {\n                        key: 'percent',\n                        get: function get() {\n                            return this._percent;\n                        },\n                        set: function set(val) {\n                            this._indeterminate = isNaN(val);\n                            this._percent = clamp(val, 0, 100);\n                            this._updateBar();\n                        }\n                    }]);\n\n                    return ProgressBar;\n                }();\n\n                exports.CSS_UNITS = CSS_UNITS;\n                exports.DEFAULT_SCALE_VALUE = DEFAULT_SCALE_VALUE;\n                exports.DEFAULT_SCALE = DEFAULT_SCALE;\n                exports.MIN_SCALE = MIN_SCALE;\n                exports.MAX_SCALE = MAX_SCALE;\n                exports.UNKNOWN_SCALE = UNKNOWN_SCALE;\n                exports.MAX_AUTO_SCALE = MAX_AUTO_SCALE;\n                exports.SCROLLBAR_PADDING = SCROLLBAR_PADDING;\n                exports.VERTICAL_PADDING = VERTICAL_PADDING;\n                exports.cloneObj = cloneObj;\n                exports.RendererType = RendererType;\n                exports.mozL10n = mozL10n;\n                exports.NullL10n = NullL10n;\n                exports.EventBus = EventBus;\n                exports.ProgressBar = ProgressBar;\n                exports.getPDFFileNameFromURL = getPDFFileNameFromURL;\n                exports.noContextMenuHandler = noContextMenuHandler;\n                exports.parseQueryString = parseQueryString;\n                exports.getVisibleElements = getVisibleElements;\n                exports.roundToDivide = roundToDivide;\n                exports.approximateFraction = approximateFraction;\n                exports.getOutputScale = getOutputScale;\n                exports.scrollIntoView = scrollIntoView;\n                exports.watchScroll = watchScroll;\n                exports.binarySearchFirstItem = binarySearchFirstItem;\n                exports.normalizeWheelEventDelta = normalizeWheelEventDelta;\n                exports.animationStarted = animationStarted;\n                exports.localized = localized;\n\n                /***/\n            }),\n        /* 1 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                var pdfjsLib;\n                if (typeof window !== 'undefined' && window['pdfjs-dist/build/pdf']) {\n                    pdfjsLib = window['pdfjs-dist/build/pdf'];\n                } else {\n                    pdfjsLib = require('./' + link_diff + '/pdf/pdf.js');\n                }\n                module.exports = pdfjsLib;\n\n                /***/\n            }),\n        /* 2 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.getGlobalEventBus = exports.attachDOMEventsToEventBus = undefined;\n\n                var _ui_utils = __webpack_require__(0);\n\n                function attachDOMEventsToEventBus(eventBus) {\n                    eventBus.on('documentload', function () {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('documentload', true, true, {});\n                        window.dispatchEvent(event);\n                    });\n                    eventBus.on('pagerendered', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('pagerendered', true, true, {\n                            pageNumber: evt.pageNumber,\n                            cssTransform: evt.cssTransform\n                        });\n                        evt.source.div.dispatchEvent(event);\n                    });\n                    eventBus.on('textlayerrendered', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('textlayerrendered', true, true, { pageNumber: evt.pageNumber });\n                        evt.source.textLayerDiv.dispatchEvent(event);\n                    });\n                    eventBus.on('pagechange', function (evt) {\n                        var event = document.createEvent('UIEvents');\n                        event.initUIEvent('pagechange', true, true, window, 0);\n                        event.pageNumber = evt.pageNumber;\n                        evt.source.container.dispatchEvent(event);\n                    });\n                    eventBus.on('pagesinit', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('pagesinit', true, true, null);\n                        evt.source.container.dispatchEvent(event);\n                    });\n                    eventBus.on('pagesloaded', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('pagesloaded', true, true, { pagesCount: evt.pagesCount });\n                        evt.source.container.dispatchEvent(event);\n                    });\n                    eventBus.on('scalechange', function (evt) {\n                        var event = document.createEvent('UIEvents');\n                        event.initUIEvent('scalechange', true, true, window, 0);\n                        event.scale = evt.scale;\n                        event.presetValue = evt.presetValue;\n                        evt.source.container.dispatchEvent(event);\n                    });\n                    eventBus.on('updateviewarea', function (evt) {\n                        var event = document.createEvent('UIEvents');\n                        event.initUIEvent('updateviewarea', true, true, window, 0);\n                        event.location = evt.location;\n                        evt.source.container.dispatchEvent(event);\n                    });\n                    eventBus.on('find', function (evt) {\n                        if (evt.source === window) {\n                            return;\n                        }\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('find' + evt.type, true, true, {\n                            query: evt.query,\n                            phraseSearch: evt.phraseSearch,\n                            caseSensitive: evt.caseSensitive,\n                            highlightAll: evt.highlightAll,\n                            findPrevious: evt.findPrevious\n                        });\n                        window.dispatchEvent(event);\n                    });\n                    eventBus.on('attachmentsloaded', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('attachmentsloaded', true, true, { attachmentsCount: evt.attachmentsCount });\n                        evt.source.container.dispatchEvent(event);\n                    });\n                    eventBus.on('sidebarviewchanged', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('sidebarviewchanged', true, true, { view: evt.view });\n                        evt.source.outerContainer.dispatchEvent(event);\n                    });\n                    eventBus.on('pagemode', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('pagemode', true, true, { mode: evt.mode });\n                        evt.source.pdfViewer.container.dispatchEvent(event);\n                    });\n                    eventBus.on('namedaction', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('namedaction', true, true, { action: evt.action });\n                        evt.source.pdfViewer.container.dispatchEvent(event);\n                    });\n                    eventBus.on('presentationmodechanged', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('presentationmodechanged', true, true, {\n                            active: evt.active,\n                            switchInProgress: evt.switchInProgress\n                        });\n                        window.dispatchEvent(event);\n                    });\n                    eventBus.on('outlineloaded', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('outlineloaded', true, true, { outlineCount: evt.outlineCount });\n                        evt.source.container.dispatchEvent(event);\n                    });\n                }\n                var globalEventBus = null;\n                function getGlobalEventBus() {\n                    if (globalEventBus) {\n                        return globalEventBus;\n                    }\n                    globalEventBus = new _ui_utils.EventBus();\n                    attachDOMEventsToEventBus(globalEventBus);\n                    return globalEventBus;\n                }\n                exports.attachDOMEventsToEventBus = attachDOMEventsToEventBus;\n                exports.getGlobalEventBus = getGlobalEventBus;\n\n                /***/\n            }),\n        /* 3 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var CLEANUP_TIMEOUT = 30000;\n                var RenderingStates = {\n                    INITIAL: 0,\n                    RUNNING: 1,\n                    PAUSED: 2,\n                    FINISHED: 3\n                };\n\n                var PDFRenderingQueue = function () {\n                    function PDFRenderingQueue() {\n                        _classCallCheck(this, PDFRenderingQueue);\n\n                        this.pdfViewer = null;\n                        this.pdfThumbnailViewer = null;\n                        this.onIdle = null;\n                        this.highestPriorityPage = null;\n                        this.idleTimeout = null;\n                        this.printing = false;\n                        this.isThumbnailViewEnabled = false;\n                    }\n\n                    _createClass(PDFRenderingQueue, [{\n                        key: \"setViewer\",\n                        value: function setViewer(pdfViewer) {\n                            this.pdfViewer = pdfViewer;\n                        }\n                    }, {\n                        key: \"setThumbnailViewer\",\n                        value: function setThumbnailViewer(pdfThumbnailViewer) {\n                            this.pdfThumbnailViewer = pdfThumbnailViewer;\n                        }\n                    }, {\n                        key: \"isHighestPriority\",\n                        value: function isHighestPriority(view) {\n                            return this.highestPriorityPage === view.renderingId;\n                        }\n                    }, {\n                        key: \"renderHighestPriority\",\n                        value: function renderHighestPriority(currentlyVisiblePages) {\n                            if (this.idleTimeout) {\n                                clearTimeout(this.idleTimeout);\n                                this.idleTimeout = null;\n                            }\n                            if (this.pdfViewer.forceRendering(currentlyVisiblePages)) {\n                                return;\n                            }\n                            if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) {\n                                if (this.pdfThumbnailViewer.forceRendering()) {\n                                    return;\n                                }\n                            }\n                            if (this.printing) {\n                                return;\n                            }\n                            if (this.onIdle) {\n                                this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);\n                            }\n                        }\n                    }, {\n                        key: \"getHighestPriority\",\n                        value: function getHighestPriority(visible, views, scrolledDown) {\n                            var visibleViews = visible.views;\n                            var numVisible = visibleViews.length;\n                            if (numVisible === 0) {\n                                return false;\n                            }\n                            for (var i = 0; i < numVisible; ++i) {\n                                var view = visibleViews[i].view;\n                                if (!this.isViewFinished(view)) {\n                                    return view;\n                                }\n                            }\n                            if (scrolledDown) {\n                                var nextPageIndex = visible.last.id;\n                                if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) {\n                                    return views[nextPageIndex];\n                                }\n                            } else {\n                                var previousPageIndex = visible.first.id - 2;\n                                if (views[previousPageIndex] && !this.isViewFinished(views[previousPageIndex])) {\n                                    return views[previousPageIndex];\n                                }\n                            }\n                            return null;\n                        }\n                    }, {\n                        key: \"isViewFinished\",\n                        value: function isViewFinished(view) {\n                            return view.renderingState === RenderingStates.FINISHED;\n                        }\n                    }, {\n                        key: \"renderView\",\n                        value: function renderView(view) {\n                            var _this = this;\n\n                            switch (view.renderingState) {\n                                case RenderingStates.FINISHED:\n                                    return false;\n                                case RenderingStates.PAUSED:\n                                    this.highestPriorityPage = view.renderingId;\n                                    view.resume();\n                                    break;\n                                case RenderingStates.RUNNING:\n                                    this.highestPriorityPage = view.renderingId;\n                                    break;\n                                case RenderingStates.INITIAL:\n                                    this.highestPriorityPage = view.renderingId;\n                                    var continueRendering = function continueRendering() {\n                                        _this.renderHighestPriority();\n                                    };\n                                    view.draw().then(continueRendering, continueRendering);\n                                    break;\n                            }\n                            return true;\n                        }\n                    }]);\n\n                    return PDFRenderingQueue;\n                }();\n\n                exports.RenderingStates = RenderingStates;\n                exports.PDFRenderingQueue = PDFRenderingQueue;\n\n                /***/\n            }),\n        /* 4 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFPrintServiceFactory = exports.DefaultExternalServices = exports.PDFViewerApplication = undefined;\n\n                var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                var _pdf_cursor_tools = __webpack_require__(6);\n\n                var _pdf_rendering_queue = __webpack_require__(3);\n\n                var _pdf_sidebar = __webpack_require__(24);\n\n                var _pdf_viewer = __webpack_require__(27);\n\n                var _dom_events = __webpack_require__(2);\n\n                var _overlay_manager = __webpack_require__(15);\n\n                var _password_prompt = __webpack_require__(16);\n\n                var _pdf_attachment_viewer = __webpack_require__(17);\n\n                var _pdf_document_properties = __webpack_require__(18);\n\n                var _pdf_find_bar = __webpack_require__(19);\n\n                var _pdf_find_controller = __webpack_require__(7);\n\n                var _pdf_history = __webpack_require__(20);\n\n                var _pdf_link_service = __webpack_require__(5);\n\n                var _pdf_outline_viewer = __webpack_require__(21);\n\n                var _pdf_presentation_mode = __webpack_require__(23);\n\n                var _pdf_thumbnail_viewer = __webpack_require__(26);\n\n                var _secondary_toolbar = __webpack_require__(29);\n\n                var _toolbar = __webpack_require__(31);\n\n                var _view_history = __webpack_require__(32);\n\n                var DEFAULT_SCALE_DELTA = 1.1;\n                var DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000;\n                function configure(PDFJS) {\n                    PDFJS.imageResourcesPath = \"./images/\";\n                    PDFJS.workerSrc = pdfScriptPath + \"/pdf.worker.js\";\n                    PDFJS.cMapUrl = pdfScriptPath + \"/cmaps/\";\n                    PDFJS.cMapPacked = true;\n                }\n                var DefaultExternalServices = {\n                    updateFindControlState: function updateFindControlState(data) { },\n                    initPassiveLoading: function initPassiveLoading(callbacks) { },\n                    fallback: function fallback(data, callback) { },\n                    reportTelemetry: function reportTelemetry(data) { },\n                    createDownloadManager: function createDownloadManager() {\n                        throw new Error('Not implemented: createDownloadManager');\n                    },\n                    createPreferences: function createPreferences() {\n                        throw new Error('Not implemented: createPreferences');\n                    },\n                    createL10n: function createL10n() {\n                        throw new Error('Not implemented: createL10n');\n                    },\n\n                    supportsIntegratedFind: false,\n                    supportsDocumentFonts: true,\n                    supportsDocumentColors: true,\n                    supportedMouseWheelZoomModifierKeys: {\n                        ctrlKey: true,\n                        metaKey: true\n                    }\n                };\n                var PDFViewerApplication = {\n                    initialBookmark: document.location.hash.substring(1),\n                    initialDestination: null,\n                    initialized: false,\n                    fellback: false,\n                    appConfig: null,\n                    pdfDocument: null,\n                    pdfLoadingTask: null,\n                    printService: null,\n                    pdfViewer: null,\n                    pdfThumbnailViewer: null,\n                    pdfRenderingQueue: null,\n                    pdfPresentationMode: null,\n                    pdfDocumentProperties: null,\n                    pdfLinkService: null,\n                    pdfHistory: null,\n                    pdfSidebar: null,\n                    pdfOutlineViewer: null,\n                    pdfAttachmentViewer: null,\n                    pdfCursorTools: null,\n                    store: null,\n                    downloadManager: null,\n                    overlayManager: null,\n                    preferences: null,\n                    toolbar: null,\n                    secondaryToolbar: null,\n                    eventBus: null,\n                    l10n: null,\n                    isInitialViewSet: false,\n                    downloadComplete: false,\n                    viewerPrefs: {\n                        sidebarViewOnLoad: _pdf_sidebar.SidebarView.NONE,\n                        pdfBugEnabled: false,\n                        showPreviousViewOnLoad: true,\n                        defaultZoomValue: '',\n                        disablePageMode: false,\n                        disablePageLabels: false,\n                        renderer: 'canvas',\n                        enhanceTextSelection: false,\n                        renderInteractiveForms: false,\n                        enablePrintAutoRotate: false\n                    },\n                    isViewerEmbedded: window.parent !== window,\n                    url: '',\n                    baseUrl: '',\n                    externalServices: DefaultExternalServices,\n                    _boundEvents: {},\n                    initialize: function initialize(appConfig) {\n                        var _this = this;\n\n                        this.preferences = this.externalServices.createPreferences();\n                        configure(_pdfjsLib.PDFJS);\n                        this.appConfig = appConfig;\n                        return this._readPreferences().then(function () {\n                            return _this._initializeL10n();\n                        }).then(function () {\n                            return _this._initializeViewerComponents();\n                        }).then(function () {\n                            _this.bindEvents();\n                            _this.bindWindowEvents();\n                            var appContainer = appConfig.appContainer || document.documentElement;\n                            _this.l10n.translate(appContainer).then(function () {\n                                _this.eventBus.dispatch('localized');\n                            });\n                            if (_this.isViewerEmbedded && !_pdfjsLib.PDFJS.isExternalLinkTargetSet()) {\n                                _pdfjsLib.PDFJS.externalLinkTarget = _pdfjsLib.PDFJS.LinkTarget.TOP;\n                            }\n                            _this.initialized = true;\n                        });\n                    },\n                    _readPreferences: function _readPreferences() {\n                        var preferences = this.preferences,\n                            viewerPrefs = this.viewerPrefs;\n\n                        return Promise.all([preferences.get('enableWebGL').then(function resolved(value) {\n                            _pdfjsLib.PDFJS.disableWebGL = !value;\n                        }), preferences.get('sidebarViewOnLoad').then(function resolved(value) {\n                            viewerPrefs['sidebarViewOnLoad'] = value;\n                        }), preferences.get('pdfBugEnabled').then(function resolved(value) {\n                            viewerPrefs['pdfBugEnabled'] = value;\n                        }), preferences.get('showPreviousViewOnLoad').then(function resolved(value) {\n                            viewerPrefs['showPreviousViewOnLoad'] = value;\n                        }), preferences.get('defaultZoomValue').then(function resolved(value) {\n                            viewerPrefs['defaultZoomValue'] = value;\n                        }), preferences.get('enhanceTextSelection').then(function resolved(value) {\n                            viewerPrefs['enhanceTextSelection'] = value;\n                        }), preferences.get('disableTextLayer').then(function resolved(value) {\n                            if (_pdfjsLib.PDFJS.disableTextLayer === true) {\n                                return;\n                            }\n                            _pdfjsLib.PDFJS.disableTextLayer = value;\n                        }), preferences.get('disableRange').then(function resolved(value) {\n                            if (_pdfjsLib.PDFJS.disableRange === true) {\n                                return;\n                            }\n                            _pdfjsLib.PDFJS.disableRange = value;\n                        }), preferences.get('disableStream').then(function resolved(value) {\n                            if (_pdfjsLib.PDFJS.disableStream === true) {\n                                return;\n                            }\n                            _pdfjsLib.PDFJS.disableStream = value;\n                        }), preferences.get('disableAutoFetch').then(function resolved(value) {\n                            _pdfjsLib.PDFJS.disableAutoFetch = value;\n                        }), preferences.get('disableFontFace').then(function resolved(value) {\n                            if (_pdfjsLib.PDFJS.disableFontFace === true) {\n                                return;\n                            }\n                            _pdfjsLib.PDFJS.disableFontFace = value;\n                        }), preferences.get('useOnlyCssZoom').then(function resolved(value) {\n                            _pdfjsLib.PDFJS.useOnlyCssZoom = value;\n                        }), preferences.get('externalLinkTarget').then(function resolved(value) {\n                            if (_pdfjsLib.PDFJS.isExternalLinkTargetSet()) {\n                                return;\n                            }\n                            _pdfjsLib.PDFJS.externalLinkTarget = value;\n                        }), preferences.get('renderer').then(function resolved(value) {\n                            viewerPrefs['renderer'] = value;\n                        }), preferences.get('renderInteractiveForms').then(function resolved(value) {\n                            viewerPrefs['renderInteractiveForms'] = value;\n                        }), preferences.get('disablePageMode').then(function resolved(value) {\n                            viewerPrefs['disablePageMode'] = value;\n                        }), preferences.get('disablePageLabels').then(function resolved(value) {\n                            viewerPrefs['disablePageLabels'] = value;\n                        }), preferences.get('enablePrintAutoRotate').then(function resolved(value) {\n                            viewerPrefs['enablePrintAutoRotate'] = value;\n                        })]).catch(function (reason) { });\n                    },\n                    _initializeL10n: function _initializeL10n() {\n                        if (this.viewerPrefs['pdfBugEnabled']) {\n                            var hash = document.location.hash.substring(1);\n                            var hashParams = (0, _ui_utils.parseQueryString)(hash);\n                            if ('locale' in hashParams) {\n                                _pdfjsLib.PDFJS.locale = hashParams['locale'];\n                            }\n                        }\n                        this.l10n = this.externalServices.createL10n();\n                        return this.l10n.getDirection().then(function (dir) {\n                            var orginalHtmlDir = $(\"#mainPdfWarrper\").attr(\"dir\");\n                            //console.log(\"orginal html dir: \" + orginalHtmlDir + \", new html dir: \" + dir)\n                            if (orginalHtmlDir !== undefined) {\n                                sessionStorage.setItem(\"o2h_orginal_html_dir\", orginalHtmlDir);\n                            } else {\n                                sessionStorage.setItem(\"o2h_orginal_html_dir\", \"\");\n                            }\n                            document.getElementById('mainPdfWarrper').dir = dir;\n                        });\n                    },\n                    _initializeViewerComponents: function _initializeViewerComponents() {\n                        var _this2 = this;\n\n                        var appConfig = this.appConfig;\n                        return new Promise(function (resolve, reject) {\n                            _this2.overlayManager = new _overlay_manager.OverlayManager();\n                            var eventBus = appConfig.eventBus || (0, _dom_events.getGlobalEventBus)();\n                            _this2.eventBus = eventBus;\n                            var pdfRenderingQueue = new _pdf_rendering_queue.PDFRenderingQueue();\n                            pdfRenderingQueue.onIdle = _this2.cleanup.bind(_this2);\n                            _this2.pdfRenderingQueue = pdfRenderingQueue;\n                            var pdfLinkService = new _pdf_link_service.PDFLinkService({ eventBus: eventBus });\n                            _this2.pdfLinkService = pdfLinkService;\n                            var downloadManager = _this2.externalServices.createDownloadManager();\n                            _this2.downloadManager = downloadManager;\n                            var container = appConfig.mainContainer;\n                            var viewer = appConfig.viewerContainer;\n                            _this2.pdfViewer = new _pdf_viewer.PDFViewer({\n                                container: container,\n                                viewer: viewer,\n                                eventBus: eventBus,\n                                renderingQueue: pdfRenderingQueue,\n                                linkService: pdfLinkService,\n                                downloadManager: downloadManager,\n                                renderer: _this2.viewerPrefs['renderer'],\n                                l10n: _this2.l10n,\n                                enhanceTextSelection: _this2.viewerPrefs['enhanceTextSelection'],\n                                renderInteractiveForms: _this2.viewerPrefs['renderInteractiveForms'],\n                                enablePrintAutoRotate: _this2.viewerPrefs['enablePrintAutoRotate']\n                            });\n                            pdfRenderingQueue.setViewer(_this2.pdfViewer);\n                            pdfLinkService.setViewer(_this2.pdfViewer);\n                            var thumbnailContainer = appConfig.sidebar.thumbnailView;\n                            _this2.pdfThumbnailViewer = new _pdf_thumbnail_viewer.PDFThumbnailViewer({\n                                container: thumbnailContainer,\n                                renderingQueue: pdfRenderingQueue,\n                                linkService: pdfLinkService,\n                                l10n: _this2.l10n\n                            });\n                            pdfRenderingQueue.setThumbnailViewer(_this2.pdfThumbnailViewer);\n                            _this2.pdfHistory = new _pdf_history.PDFHistory({\n                                linkService: pdfLinkService,\n                                eventBus: eventBus\n                            });\n                            pdfLinkService.setHistory(_this2.pdfHistory);\n                            _this2.findController = new _pdf_find_controller.PDFFindController({ pdfViewer: _this2.pdfViewer });\n                            _this2.findController.onUpdateResultsCount = function (matchCount) {\n                                if (_this2.supportsIntegratedFind) {\n                                    return;\n                                }\n                                _this2.findBar.updateResultsCount(matchCount);\n                            };\n                            _this2.findController.onUpdateState = function (state, previous, matchCount) {\n                                if (_this2.supportsIntegratedFind) {\n                                    _this2.externalServices.updateFindControlState({\n                                        result: state,\n                                        findPrevious: previous\n                                    });\n                                } else {\n                                    _this2.findBar.updateUIState(state, previous, matchCount);\n                                }\n                            };\n                            _this2.pdfViewer.setFindController(_this2.findController);\n                            var findBarConfig = Object.create(appConfig.findBar);\n                            findBarConfig.findController = _this2.findController;\n                            findBarConfig.eventBus = eventBus;\n                            _this2.findBar = new _pdf_find_bar.PDFFindBar(findBarConfig, _this2.l10n);\n                            _this2.pdfDocumentProperties = new _pdf_document_properties.PDFDocumentProperties(appConfig.pdfDocumentProperties, _this2.overlayManager, _this2.l10n);\n                            _this2.pdfCursorTools = new _pdf_cursor_tools.PDFCursorTools({\n                                container: container,\n                                eventBus: eventBus,\n                                preferences: _this2.preferences\n                            });\n                            _this2.toolbar = new _toolbar.Toolbar(appConfig.toolbar, container, eventBus, _this2.l10n);\n                            _this2.secondaryToolbar = new _secondary_toolbar.SecondaryToolbar(appConfig.secondaryToolbar, container, eventBus);\n                            if (_this2.supportsFullscreen) {\n                                _this2.pdfPresentationMode = new _pdf_presentation_mode.PDFPresentationMode({\n                                    container: container,\n                                    viewer: viewer,\n                                    pdfViewer: _this2.pdfViewer,\n                                    eventBus: eventBus,\n                                    contextMenuItems: appConfig.fullscreen\n                                });\n                            }\n                            _this2.passwordPrompt = new _password_prompt.PasswordPrompt(appConfig.passwordOverlay, _this2.overlayManager, _this2.l10n);\n                            _this2.pdfOutlineViewer = new _pdf_outline_viewer.PDFOutlineViewer({\n                                container: appConfig.sidebar.outlineView,\n                                eventBus: eventBus,\n                                linkService: pdfLinkService\n                            });\n                            _this2.pdfAttachmentViewer = new _pdf_attachment_viewer.PDFAttachmentViewer({\n                                container: appConfig.sidebar.attachmentsView,\n                                eventBus: eventBus,\n                                downloadManager: downloadManager\n                            });\n                            var sidebarConfig = Object.create(appConfig.sidebar);\n                            sidebarConfig.pdfViewer = _this2.pdfViewer;\n                            sidebarConfig.pdfThumbnailViewer = _this2.pdfThumbnailViewer;\n                            sidebarConfig.pdfOutlineViewer = _this2.pdfOutlineViewer;\n                            sidebarConfig.eventBus = eventBus;\n                            _this2.pdfSidebar = new _pdf_sidebar.PDFSidebar(sidebarConfig, _this2.l10n);\n                            _this2.pdfSidebar.onToggled = _this2.forceRendering.bind(_this2);\n                            resolve(undefined);\n                        });\n                    },\n                    run: function run(config) {\n                        this.initialize(config).then(webViewerInitialized);\n                    },\n                    zoomIn: function zoomIn(ticks) {\n                        var newScale = this.pdfViewer.currentScale;\n                        do {\n                            newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);\n                            newScale = Math.ceil(newScale * 10) / 10;\n                            newScale = Math.min(_ui_utils.MAX_SCALE, newScale);\n                        } while (--ticks > 0 && newScale < _ui_utils.MAX_SCALE);\n                        this.pdfViewer.currentScaleValue = newScale;\n                    },\n                    zoomOut: function zoomOut(ticks) {\n                        var newScale = this.pdfViewer.currentScale;\n                        do {\n                            newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);\n                            newScale = Math.floor(newScale * 10) / 10;\n                            newScale = Math.max(_ui_utils.MIN_SCALE, newScale);\n                        } while (--ticks > 0 && newScale > _ui_utils.MIN_SCALE);\n                        this.pdfViewer.currentScaleValue = newScale;\n                    },\n\n                    get pagesCount() {\n                        return this.pdfDocument ? this.pdfDocument.numPages : 0;\n                    },\n                    get pageRotation() {\n                        return this.pdfViewer.pagesRotation;\n                    },\n                    set page(val) {\n                        this.pdfViewer.currentPageNumber = val;\n                    },\n                    get page() {\n                        return this.pdfViewer.currentPageNumber;\n                    },\n                    get printing() {\n                        return !!this.printService;\n                    },\n                    get supportsPrinting() {\n                        return PDFPrintServiceFactory.instance.supportsPrinting;\n                    },\n                    get supportsFullscreen() {\n                        var support = void 0;\n                        var doc = document.documentElement;\n                        support = !!(doc.requestFullscreen || doc.mozRequestFullScreen || doc.webkitRequestFullScreen || doc.msRequestFullscreen);\n                        if (document.fullscreenEnabled === false || document.mozFullScreenEnabled === false || document.webkitFullscreenEnabled === false || document.msFullscreenEnabled === false) {\n                            support = false;\n                        }\n                        if (support && _pdfjsLib.PDFJS.disableFullscreen === true) {\n                            support = false;\n                        }\n                        return (0, _pdfjsLib.shadow)(this, 'supportsFullscreen', support);\n                    },\n                    get supportsIntegratedFind() {\n                        return this.externalServices.supportsIntegratedFind;\n                    },\n                    get supportsDocumentFonts() {\n                        return this.externalServices.supportsDocumentFonts;\n                    },\n                    get supportsDocumentColors() {\n                        return this.externalServices.supportsDocumentColors;\n                    },\n                    get loadingBar() {\n                        var bar = new _ui_utils.ProgressBar('#loadingBar');\n                        return (0, _pdfjsLib.shadow)(this, 'loadingBar', bar);\n                    },\n                    get supportedMouseWheelZoomModifierKeys() {\n                        return this.externalServices.supportedMouseWheelZoomModifierKeys;\n                    },\n                    initPassiveLoading: function initPassiveLoading() {\n                        throw new Error('Not implemented: initPassiveLoading');\n                    },\n                    setTitleUsingUrl: function setTitleUsingUrl(url) {\n                        this.url = url;\n                        this.baseUrl = url.split('#')[0];\n                        var title = (0, _ui_utils.getPDFFileNameFromURL)(url, '');\n                        if (!title) {\n                            try {\n                                title = decodeURIComponent((0, _pdfjsLib.getFilenameFromUrl)(url)) || url;\n                            } catch (ex) {\n                                title = url;\n                            }\n                        }\n                        this.setTitle(title);\n                    },\n                    setTitle: function setTitle(title) {\n                        if (this.isViewerEmbedded) {\n                            return;\n                        }\n                        document.title = title;\n                    },\n                    close: function close() {\n                        var errorWrapper = this.appConfig.errorWrapper.container;\n                        errorWrapper.setAttribute('hidden', 'true');\n                        if (!this.pdfLoadingTask) {\n                            return Promise.resolve();\n                        }\n                        var promise = this.pdfLoadingTask.destroy();\n                        this.pdfLoadingTask = null;\n                        if (this.pdfDocument) {\n                            this.pdfDocument = null;\n                            this.pdfThumbnailViewer.setDocument(null);\n                            this.pdfViewer.setDocument(null);\n                            this.pdfLinkService.setDocument(null, null);\n                            this.pdfDocumentProperties.setDocument(null, null);\n                        }\n                        this.store = null;\n                        this.isInitialViewSet = false;\n                        this.downloadComplete = false;\n                        this.pdfSidebar.reset();\n                        this.pdfOutlineViewer.reset();\n                        this.pdfAttachmentViewer.reset();\n                        this.findController.reset();\n                        this.findBar.reset();\n                        this.toolbar.reset();\n                        this.secondaryToolbar.reset();\n                        if (typeof PDFBug !== 'undefined') {\n                            PDFBug.cleanup();\n                        }\n                        return promise;\n                    },\n                    open: function open(file, args) {\n                        var _this3 = this;\n\n                        if (arguments.length > 2 || typeof args === 'number') {\n                            return Promise.reject(new Error('Call of open() with obsolete signature.'));\n                        }\n                        if (this.pdfLoadingTask) {\n                            return this.close().then(function () {\n                                _this3.preferences.reload();\n                                return _this3.open(file, args);\n                            });\n                        }\n                        var parameters = Object.create(null),\n                            scale = void 0;\n                        if (typeof file === 'string') {\n                            this.setTitleUsingUrl(file);\n                            parameters.url = file;\n                        } else if (file && 'byteLength' in file) {\n                            parameters.data = file;\n                        } else if (file.url && file.originalUrl) {\n                            this.setTitleUsingUrl(file.originalUrl);\n                            parameters.url = file.url;\n                        }\n                        if (args) {\n                            for (var prop in args) {\n                                parameters[prop] = args[prop];\n                            }\n                            if (args.scale) {\n                                scale = args.scale;\n                            }\n                            if (args.length) {\n                                this.pdfDocumentProperties.setFileSize(args.length);\n                            }\n                        }\n                        var loadingTask = (0, _pdfjsLib.getDocument)(parameters);\n                        this.pdfLoadingTask = loadingTask;\n                        loadingTask.onPassword = function (updateCallback, reason) {\n                            _this3.passwordPrompt.setUpdateCallback(updateCallback, reason);\n                            _this3.passwordPrompt.open();\n                        };\n                        loadingTask.onProgress = function (_ref) {\n                            var loaded = _ref.loaded,\n                                total = _ref.total;\n\n                            _this3.progress(loaded / total);\n                        };\n                        loadingTask.onUnsupportedFeature = this.fallback.bind(this);\n                        return loadingTask.promise.then(function (pdfDocument) {\n                            _this3.load(pdfDocument, scale);\n                        }, function (exception) {\n                            var message = exception && exception.message;\n                            var loadingErrorMessage = void 0;\n                            if (exception instanceof _pdfjsLib.InvalidPDFException) {\n                                loadingErrorMessage = _this3.l10n.get('invalid_file_error', null, 'Invalid or corrupted PDF file.');\n                            } else if (exception instanceof _pdfjsLib.MissingPDFException) {\n                                loadingErrorMessage = _this3.l10n.get('missing_file_error', null, 'Missing PDF file.');\n                            } else if (exception instanceof _pdfjsLib.UnexpectedResponseException) {\n                                loadingErrorMessage = _this3.l10n.get('unexpected_response_error', null, 'Unexpected server response.');\n                            } else {\n                                loadingErrorMessage = _this3.l10n.get('loading_error', null, 'An error occurred while loading the PDF.');\n                            }\n                            return loadingErrorMessage.then(function (msg) {\n                                _this3.error(msg, { message: message });\n                                throw new Error(msg);\n                            });\n                        });\n                    },\n                    download: function download() {\n                        var _this4 = this;\n\n                        function downloadByUrl() {\n                            downloadManager.downloadUrl(url, filename);\n                        }\n                        var url = this.baseUrl;\n                        var filename = (0, _ui_utils.getPDFFileNameFromURL)(this.url);\n                        var downloadManager = this.downloadManager;\n                        downloadManager.onerror = function (err) {\n                            _this4.error('PDF failed to download: ' + err);\n                        };\n                        if (!this.pdfDocument || !this.downloadComplete) {\n                            downloadByUrl();\n                            return;\n                        }\n                        this.pdfDocument.getData().then(function (data) {\n                            var blob = (0, _pdfjsLib.createBlob)(data, 'application/pdf');\n                            downloadManager.download(blob, url, filename);\n                        }).catch(downloadByUrl);\n                    },\n                    fallback: function fallback(featureId) { },\n                    error: function error(message, moreInfo) {\n                        var moreInfoText = [this.l10n.get('error_version_info', {\n                            version: _pdfjsLib.version || '?',\n                            build: _pdfjsLib.build || '?'\n                        }, 'PDF.js v{{version}} (build: {{build}})')];\n                        if (moreInfo) {\n                            moreInfoText.push(this.l10n.get('error_message', { message: moreInfo.message }, 'Message: {{message}}'));\n                            if (moreInfo.stack) {\n                                moreInfoText.push(this.l10n.get('error_stack', { stack: moreInfo.stack }, 'Stack: {{stack}}'));\n                            } else {\n                                if (moreInfo.filename) {\n                                    moreInfoText.push(this.l10n.get('error_file', { file: moreInfo.filename }, 'File: {{file}}'));\n                                }\n                                if (moreInfo.lineNumber) {\n                                    moreInfoText.push(this.l10n.get('error_line', { line: moreInfo.lineNumber }, 'Line: {{line}}'));\n                                }\n                            }\n                        }\n                        var errorWrapperConfig = this.appConfig.errorWrapper;\n                        var errorWrapper = errorWrapperConfig.container;\n                        errorWrapper.removeAttribute('hidden');\n                        var errorMessage = errorWrapperConfig.errorMessage;\n                        errorMessage.textContent = message;\n                        var closeButton = errorWrapperConfig.closeButton;\n                        closeButton.onclick = function () {\n                            errorWrapper.setAttribute('hidden', 'true');\n                        };\n                        var errorMoreInfo = errorWrapperConfig.errorMoreInfo;\n                        var moreInfoButton = errorWrapperConfig.moreInfoButton;\n                        var lessInfoButton = errorWrapperConfig.lessInfoButton;\n                        moreInfoButton.onclick = function () {\n                            errorMoreInfo.removeAttribute('hidden');\n                            moreInfoButton.setAttribute('hidden', 'true');\n                            lessInfoButton.removeAttribute('hidden');\n                            errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px';\n                        };\n                        lessInfoButton.onclick = function () {\n                            errorMoreInfo.setAttribute('hidden', 'true');\n                            moreInfoButton.removeAttribute('hidden');\n                            lessInfoButton.setAttribute('hidden', 'true');\n                        };\n                        moreInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler;\n                        lessInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler;\n                        closeButton.oncontextmenu = _ui_utils.noContextMenuHandler;\n                        moreInfoButton.removeAttribute('hidden');\n                        lessInfoButton.setAttribute('hidden', 'true');\n                        Promise.all(moreInfoText).then(function (parts) {\n                            errorMoreInfo.value = parts.join('\\n');\n                        });\n                    },\n                    progress: function progress(level) {\n                        var _this5 = this;\n\n                        if (this.downloadComplete) {\n                            return;\n                        }\n                        var percent = Math.round(level * 100);\n                        if (percent > this.loadingBar.percent || isNaN(percent)) {\n                            this.loadingBar.percent = percent;\n                            if (_pdfjsLib.PDFJS.disableAutoFetch && percent) {\n                                if (this.disableAutoFetchLoadingBarTimeout) {\n                                    clearTimeout(this.disableAutoFetchLoadingBarTimeout);\n                                    this.disableAutoFetchLoadingBarTimeout = null;\n                                }\n                                this.loadingBar.show();\n                                this.disableAutoFetchLoadingBarTimeout = setTimeout(function () {\n                                    _this5.loadingBar.hide();\n                                    _this5.disableAutoFetchLoadingBarTimeout = null;\n                                }, DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT);\n                            }\n                        }\n                    },\n                    load: function load(pdfDocument, scale) {\n                        var _this6 = this;\n\n                        scale = scale || _ui_utils.UNKNOWN_SCALE;\n                        this.pdfDocument = pdfDocument;\n                        pdfDocument.getDownloadInfo().then(function () {\n                            _this6.downloadComplete = true;\n                            _this6.loadingBar.hide();\n                            firstPagePromise.then(function () {\n                                _this6.eventBus.dispatch('documentload', { source: _this6 });\n                            });\n                        });\n                        var pageModePromise = pdfDocument.getPageMode().catch(function () { });\n                        this.toolbar.setPagesCount(pdfDocument.numPages, false);\n                        this.secondaryToolbar.setPagesCount(pdfDocument.numPages);\n                        var id = this.documentFingerprint = pdfDocument.fingerprint;\n                        var store = this.store = new _view_history.ViewHistory(id);\n                        var baseDocumentUrl = void 0;\n                        baseDocumentUrl = null;\n                        this.pdfLinkService.setDocument(pdfDocument, baseDocumentUrl);\n                        this.pdfDocumentProperties.setDocument(pdfDocument, this.url);\n                        var pdfViewer = this.pdfViewer;\n                        pdfViewer.setDocument(pdfDocument);\n                        var firstPagePromise = pdfViewer.firstPagePromise;\n                        var pagesPromise = pdfViewer.pagesPromise;\n                        var onePageRendered = pdfViewer.onePageRendered;\n                        var pdfThumbnailViewer = this.pdfThumbnailViewer;\n                        pdfThumbnailViewer.setDocument(pdfDocument);\n                        firstPagePromise.then(function (pdfPage) {\n                            _this6.loadingBar.setWidth(_this6.appConfig.viewerContainer);\n                            if (!_pdfjsLib.PDFJS.disableHistory && !_this6.isViewerEmbedded) {\n                                if (!_this6.viewerPrefs['showPreviousViewOnLoad']) {\n                                    _this6.pdfHistory.clearHistoryState();\n                                }\n                                _this6.pdfHistory.initialize(_this6.documentFingerprint);\n                                if (_this6.pdfHistory.initialDestination) {\n                                    _this6.initialDestination = _this6.pdfHistory.initialDestination;\n                                } else if (_this6.pdfHistory.initialBookmark) {\n                                    _this6.initialBookmark = _this6.pdfHistory.initialBookmark;\n                                }\n                            }\n                            var initialParams = {\n                                destination: _this6.initialDestination,\n                                bookmark: _this6.initialBookmark,\n                                hash: null\n                            };\n                            var storePromise = store.getMultiple({\n                                exists: false,\n                                page: '1',\n                                zoom: _ui_utils.DEFAULT_SCALE_VALUE,\n                                scrollLeft: '0',\n                                scrollTop: '0',\n                                sidebarView: _pdf_sidebar.SidebarView.NONE\n                            }).catch(function () { });\n                            Promise.all([storePromise, pageModePromise]).then(function (_ref2) {\n                                var _ref3 = _slicedToArray(_ref2, 2),\n                                    _ref3$ = _ref3[0],\n                                    values = _ref3$ === undefined ? {} : _ref3$,\n                                    pageMode = _ref3[1];\n\n                                var hash = _this6.viewerPrefs['defaultZoomValue'] ? 'zoom=' + _this6.viewerPrefs['defaultZoomValue'] : null;\n                                var sidebarView = _this6.viewerPrefs['sidebarViewOnLoad'];\n                                if (values.exists && _this6.viewerPrefs['showPreviousViewOnLoad']) {\n                                    hash = 'page=' + values.page + '&zoom=' + (_this6.viewerPrefs['defaultZoomValue'] || values.zoom) + ',' + values.scrollLeft + ',' + values.scrollTop;\n                                    sidebarView = sidebarView || values.sidebarView | 0;\n                                }\n                                if (pageMode && !_this6.viewerPrefs['disablePageMode']) {\n                                    sidebarView = sidebarView || apiPageModeToSidebarView(pageMode);\n                                }\n                                return {\n                                    hash: hash,\n                                    sidebarView: sidebarView\n                                };\n                            }).then(function (_ref4) {\n                                var hash = _ref4.hash,\n                                    sidebarView = _ref4.sidebarView;\n\n                                _this6.setInitialView(hash, {\n                                    sidebarView: sidebarView,\n                                    scale: scale\n                                });\n                                initialParams.hash = hash;\n                                if (!_this6.isViewerEmbedded) {\n                                    pdfViewer.focus();\n                                }\n                                return pagesPromise;\n                            }).then(function () {\n                                if (!initialParams.destination && !initialParams.bookmark && !initialParams.hash) {\n                                    return;\n                                }\n                                if (pdfViewer.hasEqualPageSizes) {\n                                    return;\n                                }\n                                _this6.initialDestination = initialParams.destination;\n                                _this6.initialBookmark = initialParams.bookmark;\n                                pdfViewer.currentScaleValue = pdfViewer.currentScaleValue;\n                                _this6.setInitialView(initialParams.hash);\n                            }).then(function () {\n                                pdfViewer.update();\n                            });\n                        });\n                        pdfDocument.getPageLabels().then(function (labels) {\n                            if (!labels || _this6.viewerPrefs['disablePageLabels']) {\n                                return;\n                            }\n                            var i = 0,\n                                numLabels = labels.length;\n                            if (numLabels !== _this6.pagesCount) {\n                                console.error('The number of Page Labels does not match ' + 'the number of pages in the document.');\n                                return;\n                            }\n                            while (i < numLabels && labels[i] === (i + 1).toString()) {\n                                i++;\n                            }\n                            if (i === numLabels) {\n                                return;\n                            }\n                            pdfViewer.setPageLabels(labels);\n                            pdfThumbnailViewer.setPageLabels(labels);\n                            _this6.toolbar.setPagesCount(pdfDocument.numPages, true);\n                            _this6.toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);\n                        });\n                        pagesPromise.then(function () {\n                            if (!_this6.supportsPrinting) {\n                                return;\n                            }\n                            pdfDocument.getJavaScript().then(function (javaScript) {\n                                if (javaScript.length) {\n                                    console.warn('Warning: JavaScript is not supported');\n                                    _this6.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.javaScript);\n                                }\n                                var regex = /\\bprint\\s*\\(/;\n                                for (var i = 0, ii = javaScript.length; i < ii; i++) {\n                                    var js = javaScript[i];\n                                    if (js && regex.test(js)) {\n                                        setTimeout(function () {\n                                            window.print();\n                                        });\n                                        return;\n                                    }\n                                }\n                            });\n                        });\n                        Promise.all([onePageRendered, _ui_utils.animationStarted]).then(function () {\n                            pdfDocument.getOutline().then(function (outline) {\n                                _this6.pdfOutlineViewer.render({ outline: outline });\n                            });\n                            pdfDocument.getAttachments().then(function (attachments) {\n                                _this6.pdfAttachmentViewer.render({ attachments: attachments });\n                            });\n                        });\n                        pdfDocument.getMetadata().then(function (_ref5) {\n                            var info = _ref5.info,\n                                metadata = _ref5.metadata;\n\n                            _this6.documentInfo = info;\n                            _this6.metadata = metadata;\n                            console.log('PDF ' + pdfDocument.fingerprint + ' [' + info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() + ' / ' + (info.Creator || '-').trim() + ']' + ' (PDF.js: ' + (_pdfjsLib.version || '-') + (!_pdfjsLib.PDFJS.disableWebGL ? ' [WebGL]' : '') + ')');\n                            var pdfTitle = void 0;\n                            if (metadata && metadata.has('dc:title')) {\n                                var title = metadata.get('dc:title');\n                                if (title !== 'Untitled') {\n                                    pdfTitle = title;\n                                }\n                            }\n                            if (!pdfTitle && info && info['Title']) {\n                                pdfTitle = info['Title'];\n                            }\n                            if (pdfTitle) {\n                                _this6.setTitle(pdfTitle + ' - ' + document.title);\n                            }\n                            if (info.IsAcroFormPresent) {\n                                console.warn('Warning: AcroForm/XFA is not supported');\n                                _this6.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.forms);\n                            }\n\n                        });\n                    },\n                    setInitialView: function setInitialView(storedHash) {\n                        var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                        var _options$scale = options.scale,\n                            scale = _options$scale === undefined ? 0 : _options$scale,\n                            _options$sidebarView = options.sidebarView,\n                            sidebarView = _options$sidebarView === undefined ? _pdf_sidebar.SidebarView.NONE : _options$sidebarView;\n\n                        this.isInitialViewSet = true;\n                        this.pdfSidebar.setInitialView(sidebarView);\n                        if (this.initialDestination) {\n                            this.pdfLinkService.navigateTo(this.initialDestination);\n                            this.initialDestination = null;\n                        } else if (this.initialBookmark) {\n                            this.pdfLinkService.setHash(this.initialBookmark);\n                            this.pdfHistory.push({ hash: this.initialBookmark }, true);\n                            this.initialBookmark = null;\n                        } else if (storedHash) {\n                            this.pdfLinkService.setHash(storedHash);\n                        } else if (scale) {\n                            this.pdfViewer.currentScaleValue = scale;\n                            this.page = 1;\n                        }\n                        this.toolbar.setPageNumber(this.pdfViewer.currentPageNumber, this.pdfViewer.currentPageLabel);\n                        this.secondaryToolbar.setPageNumber(this.pdfViewer.currentPageNumber);\n                        if (!this.pdfViewer.currentScaleValue) {\n                            this.pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;\n                        }\n                    },\n                    cleanup: function cleanup() {\n                        if (!this.pdfDocument) {\n                            return;\n                        }\n                        this.pdfViewer.cleanup();\n                        this.pdfThumbnailViewer.cleanup();\n                        if (this.pdfViewer.renderer !== _ui_utils.RendererType.SVG) {\n                            this.pdfDocument.cleanup();\n                        }\n                    },\n                    forceRendering: function forceRendering() {\n                        this.pdfRenderingQueue.printing = this.printing;\n                        this.pdfRenderingQueue.isThumbnailViewEnabled = this.pdfSidebar.isThumbnailViewVisible;\n                        this.pdfRenderingQueue.renderHighestPriority();\n                    },\n                    beforePrint: function beforePrint() {\n                        var _this7 = this;\n\n                        if (this.printService) {\n                            return;\n                        }\n                        if (!this.supportsPrinting) {\n                            this.l10n.get('printing_not_supported', null, 'Warning: Printing is not fully supported by ' + 'this browser.').then(function (printMessage) {\n                                _this7.error(printMessage);\n                            });\n                            return;\n                        }\n                        if (!this.pdfViewer.pageViewsReady) {\n                            this.l10n.get('printing_not_ready', null, 'Warning: The PDF is not fully loaded for printing.').then(function (notReadyMessage) {\n                                window.alert(notReadyMessage);\n                            });\n                            return;\n                        }\n                        var pagesOverview = this.pdfViewer.getPagesOverview();\n                        var printContainer = this.appConfig.printContainer;\n                        var printService = PDFPrintServiceFactory.instance.createPrintService(this.pdfDocument, pagesOverview, printContainer, this.l10n);\n                        this.printService = printService;\n                        this.forceRendering();\n                        printService.layout();\n                    },\n\n                    afterPrint: function pdfViewSetupAfterPrint() {\n                        if (this.printService) {\n                            this.printService.destroy();\n                            this.printService = null;\n                        }\n                        this.forceRendering();\n                    },\n                    rotatePages: function rotatePages(delta) {\n                        if (!this.pdfDocument) {\n                            return;\n                        }\n                        var pdfViewer = this.pdfViewer,\n                            pdfThumbnailViewer = this.pdfThumbnailViewer;\n\n                        var pageNumber = pdfViewer.currentPageNumber;\n                        var newRotation = (pdfViewer.pagesRotation + 360 + delta) % 360;\n                        pdfViewer.pagesRotation = newRotation;\n                        pdfThumbnailViewer.pagesRotation = newRotation;\n                        this.forceRendering();\n                        pdfViewer.currentPageNumber = pageNumber;\n                    },\n                    requestPresentationMode: function requestPresentationMode() {\n                        if (!this.pdfPresentationMode) {\n                            return;\n                        }\n                        this.pdfPresentationMode.request();\n                    },\n                    bindEvents: function bindEvents() {\n                        var eventBus = this.eventBus,\n                            _boundEvents = this._boundEvents;\n\n                        _boundEvents.beforePrint = this.beforePrint.bind(this);\n                        _boundEvents.afterPrint = this.afterPrint.bind(this);\n                        eventBus.on('resize', webViewerResize);\n                        eventBus.on('hashchange', webViewerHashchange);\n                        eventBus.on('beforeprint', _boundEvents.beforePrint);\n                        eventBus.on('afterprint', _boundEvents.afterPrint);\n                        eventBus.on('pagerendered', webViewerPageRendered);\n                        eventBus.on('textlayerrendered', webViewerTextLayerRendered);\n                        eventBus.on('updateviewarea', webViewerUpdateViewarea);\n                        eventBus.on('pagechanging', webViewerPageChanging);\n                        eventBus.on('scalechanging', webViewerScaleChanging);\n                        eventBus.on('sidebarviewchanged', webViewerSidebarViewChanged);\n                        eventBus.on('pagemode', webViewerPageMode);\n                        eventBus.on('namedaction', webViewerNamedAction);\n                        eventBus.on('presentationmodechanged', webViewerPresentationModeChanged);\n                        eventBus.on('presentationmode', webViewerPresentationMode);\n                        eventBus.on('openfile', webViewerOpenFile);\n                        eventBus.on('print', webViewerPrint);\n                        eventBus.on('download', webViewerDownload);\n                        eventBus.on('firstpage', webViewerFirstPage);\n                        eventBus.on('lastpage', webViewerLastPage);\n                        eventBus.on('nextpage', webViewerNextPage);\n                        eventBus.on('previouspage', webViewerPreviousPage);\n                        eventBus.on('zoomin', webViewerZoomIn);\n                        eventBus.on('zoomout', webViewerZoomOut);\n                        eventBus.on('pagenumberchanged', webViewerPageNumberChanged);\n                        eventBus.on('scalechanged', webViewerScaleChanged);\n                        eventBus.on('rotatecw', webViewerRotateCw);\n                        eventBus.on('rotateccw', webViewerRotateCcw);\n                        eventBus.on('documentproperties', webViewerDocumentProperties);\n                        eventBus.on('find', webViewerFind);\n                        eventBus.on('findfromurlhash', webViewerFindFromUrlHash);\n                        eventBus.on('fileinputchange', webViewerFileInputChange);\n                    },\n                    bindWindowEvents: function bindWindowEvents() {\n                        var eventBus = this.eventBus,\n                            _boundEvents = this._boundEvents;\n\n                        _boundEvents.windowResize = function () {\n                            eventBus.dispatch('resize');\n                        };\n                        _boundEvents.windowHashChange = function () {\n                            eventBus.dispatch('hashchange', { hash: document.location.hash.substring(1) });\n                        };\n                        _boundEvents.windowBeforePrint = function () {\n                            eventBus.dispatch('beforeprint');\n                        };\n                        _boundEvents.windowAfterPrint = function () {\n                            eventBus.dispatch('afterprint');\n                        };\n                        window.addEventListener('wheel', webViewerWheel);\n                        window.addEventListener('click', webViewerClick);\n                        window.addEventListener('keydown', webViewerKeyDown);\n                        window.addEventListener('resize', _boundEvents.windowResize);\n                        window.addEventListener('hashchange', _boundEvents.windowHashChange);\n                        window.addEventListener('beforeprint', _boundEvents.windowBeforePrint);\n                        window.addEventListener('afterprint', _boundEvents.windowAfterPrint);\n                        _boundEvents.windowChange = function (evt) {\n                            var files = evt.target.files;\n                            if (!files || files.length === 0) {\n                                return;\n                            }\n                            eventBus.dispatch('fileinputchange', { fileInput: evt.target });\n                        };\n                        window.addEventListener('change', _boundEvents.windowChange);\n                    },\n                    unbindEvents: function unbindEvents() {\n                        var eventBus = this.eventBus,\n                            _boundEvents = this._boundEvents;\n\n                        eventBus.off('resize', webViewerResize);\n                        eventBus.off('hashchange', webViewerHashchange);\n                        eventBus.off('beforeprint', _boundEvents.beforePrint);\n                        eventBus.off('afterprint', _boundEvents.afterPrint);\n                        eventBus.off('pagerendered', webViewerPageRendered);\n                        eventBus.off('textlayerrendered', webViewerTextLayerRendered);\n                        eventBus.off('updateviewarea', webViewerUpdateViewarea);\n                        eventBus.off('pagechanging', webViewerPageChanging);\n                        eventBus.off('scalechanging', webViewerScaleChanging);\n                        eventBus.off('sidebarviewchanged', webViewerSidebarViewChanged);\n                        eventBus.off('pagemode', webViewerPageMode);\n                        eventBus.off('namedaction', webViewerNamedAction);\n                        eventBus.off('presentationmodechanged', webViewerPresentationModeChanged);\n                        eventBus.off('presentationmode', webViewerPresentationMode);\n                        eventBus.off('openfile', webViewerOpenFile);\n                        eventBus.off('print', webViewerPrint);\n                        eventBus.off('download', webViewerDownload);\n                        eventBus.off('firstpage', webViewerFirstPage);\n                        eventBus.off('lastpage', webViewerLastPage);\n                        eventBus.off('nextpage', webViewerNextPage);\n                        eventBus.off('previouspage', webViewerPreviousPage);\n                        eventBus.off('zoomin', webViewerZoomIn);\n                        eventBus.off('zoomout', webViewerZoomOut);\n                        eventBus.off('pagenumberchanged', webViewerPageNumberChanged);\n                        eventBus.off('scalechanged', webViewerScaleChanged);\n                        eventBus.off('rotatecw', webViewerRotateCw);\n                        eventBus.off('rotateccw', webViewerRotateCcw);\n                        eventBus.off('documentproperties', webViewerDocumentProperties);\n                        eventBus.off('find', webViewerFind);\n                        eventBus.off('findfromurlhash', webViewerFindFromUrlHash);\n                        eventBus.off('fileinputchange', webViewerFileInputChange);\n                        _boundEvents.beforePrint = null;\n                        _boundEvents.afterPrint = null;\n                    },\n                    unbindWindowEvents: function unbindWindowEvents() {\n                        var _boundEvents = this._boundEvents;\n\n                        window.removeEventListener('wheel', webViewerWheel);\n                        window.removeEventListener('click', webViewerClick);\n                        window.removeEventListener('keydown', webViewerKeyDown);\n                        window.removeEventListener('resize', _boundEvents.windowResize);\n                        window.removeEventListener('hashchange', _boundEvents.windowHashChange);\n                        window.removeEventListener('beforeprint', _boundEvents.windowBeforePrint);\n                        window.removeEventListener('afterprint', _boundEvents.windowAfterPrint);\n                        window.removeEventListener('change', _boundEvents.windowChange);\n                        _boundEvents.windowChange = null;\n                        _boundEvents.windowResize = null;\n                        _boundEvents.windowHashChange = null;\n                        _boundEvents.windowBeforePrint = null;\n                        _boundEvents.windowAfterPrint = null;\n                    }\n                };\n                var validateFileURL = void 0;\n                {\n                    var HOSTED_VIEWER_ORIGINS = ['null', 'http://mozilla.github.io', 'https://mozilla.github.io'];\n                    validateFileURL = function validateFileURL(file) {\n                        if (file === undefined) {\n                            return;\n                        }\n                        try {\n                            var viewerOrigin = new URL(window.location.href).origin || 'null';\n                            if (HOSTED_VIEWER_ORIGINS.indexOf(viewerOrigin) >= 0) {\n                                return;\n                            }\n                            var fileOrigin = new URL(file, window.location.href).origin;\n                            if (fileOrigin !== viewerOrigin) {\n                                throw new Error('file origin does not match viewer\\'s');\n                            }\n                        } catch (ex) {\n                            var message = ex && ex.message;\n                            PDFViewerApplication.l10n.get('loading_error', null, 'An error occurred while loading the PDF.').then(function (loadingErrorMessage) {\n                                PDFViewerApplication.error(loadingErrorMessage, { message: message });\n                            });\n                            throw ex;\n                        }\n                    };\n                }\n                function loadAndEnablePDFBug(enabledTabs) {\n                    return new Promise(function (resolve, reject) {\n                        var appConfig = PDFViewerApplication.appConfig;\n                        var script = document.createElement('script');\n                        script.src = appConfig.debuggerScriptPath;\n                        script.onload = function () {\n                            PDFBug.enable(enabledTabs);\n                            PDFBug.init({\n                                PDFJS: _pdfjsLib.PDFJS,\n                                OPS: _pdfjsLib.OPS\n                            }, appConfig.mainContainer);\n                            resolve();\n                        };\n                        script.onerror = function () {\n                            reject(new Error('Cannot load debugger at ' + script.src));\n                        };\n                        (document.getElementsByTagName('head')[0] || document.body).appendChild(script);\n                    });\n                }\n                function webViewerInitialized() {\n                    var appConfig = PDFViewerApplication.appConfig;\n                    var file = void 0;\n                    var queryString = document.location.search.substring(1);\n                    var params = (0, _ui_utils.parseQueryString)(queryString);\n                    file = 'file' in params ? params.file : appConfig.defaultUrl;\n                    validateFileURL(file);\n                    var waitForBeforeOpening = [];\n                    var fileInput = document.createElement('input');\n                    fileInput.id = appConfig.openFileInputName;\n                    fileInput.className = 'fileInput';\n                    fileInput.setAttribute('type', 'file');\n                    fileInput.oncontextmenu = _ui_utils.noContextMenuHandler;\n                    document.body.appendChild(fileInput);\n                    if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {\n                        appConfig.toolbar.openFile.setAttribute('hidden', 'true');\n                        appConfig.secondaryToolbar.openFileButton.setAttribute('hidden', 'true');\n                    } else {\n                        fileInput.value = null;\n                    }\n                    if (PDFViewerApplication.viewerPrefs['pdfBugEnabled']) {\n                        var hash = document.location.hash.substring(1);\n                        var hashParams = (0, _ui_utils.parseQueryString)(hash);\n                        if ('disableworker' in hashParams) {\n                            pdfjsLib.PDFJS.disableWorker = hashParams['disableworker'] === 'true';\n                        }\n                        if ('disablerange' in hashParams) {\n                            _pdfjsLib.PDFJS.disableRange = hashParams['disablerange'] === 'true';\n                        }\n                        if ('disablestream' in hashParams) {\n                            _pdfjsLib.PDFJS.disableStream = hashParams['disablestream'] === 'true';\n                        }\n                        if ('disableautofetch' in hashParams) {\n                            _pdfjsLib.PDFJS.disableAutoFetch = hashParams['disableautofetch'] === 'true';\n                        }\n                        if ('disablefontface' in hashParams) {\n                            _pdfjsLib.PDFJS.disableFontFace = hashParams['disablefontface'] === 'true';\n                        }\n                        if ('disablehistory' in hashParams) {\n                            _pdfjsLib.PDFJS.disableHistory = hashParams['disablehistory'] === 'true';\n                        }\n                        if ('webgl' in hashParams) {\n                            _pdfjsLib.PDFJS.disableWebGL = hashParams['webgl'] !== 'true';\n                        }\n                        if ('useonlycsszoom' in hashParams) {\n                            _pdfjsLib.PDFJS.useOnlyCssZoom = hashParams['useonlycsszoom'] === 'true';\n                        }\n                        if ('verbosity' in hashParams) {\n                            _pdfjsLib.PDFJS.verbosity = hashParams['verbosity'] | 0;\n                        }\n                        if ('ignorecurrentpositiononzoom' in hashParams) {\n                            _pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom = hashParams['ignorecurrentpositiononzoom'] === 'true';\n                        }\n                        if ('textlayer' in hashParams) {\n                            switch (hashParams['textlayer']) {\n                                case 'off':\n                                    _pdfjsLib.PDFJS.disableTextLayer = true;\n                                    break;\n                                case 'visible':\n                                case 'shadow':\n                                case 'hover':\n                                    var viewer = appConfig.viewerContainer;\n                                    viewer.classList.add('textLayer-' + hashParams['textlayer']);\n                                    break;\n                            }\n                        }\n                        if ('pdfbug' in hashParams) {\n                            _pdfjsLib.PDFJS.pdfBug = true;\n                            var pdfBug = hashParams['pdfbug'];\n                            var enabled = pdfBug.split(',');\n                            waitForBeforeOpening.push(loadAndEnablePDFBug(enabled));\n                        }\n                    }\n                    if (!PDFViewerApplication.supportsPrinting) {\n                        appConfig.toolbar.print.classList.add('hidden');\n                        appConfig.secondaryToolbar.printButton.classList.add('hidden');\n                    }\n                    if (!PDFViewerApplication.supportsFullscreen) {\n                        appConfig.toolbar.presentationModeButton.classList.add('hidden');\n                        appConfig.secondaryToolbar.presentationModeButton.classList.add('hidden');\n                    }\n                    if (PDFViewerApplication.supportsIntegratedFind) {\n                        appConfig.toolbar.viewFind.classList.add('hidden');\n                    }\n                    appConfig.sidebar.mainContainer.addEventListener('transitionend', function (evt) {\n                        if (evt.target === this) {\n                            PDFViewerApplication.eventBus.dispatch('resize');\n                        }\n                    }, true);\n                    appConfig.sidebar.toggleButton.addEventListener('click', function () {\n                        PDFViewerApplication.pdfSidebar.toggle();\n                    });\n                    Promise.all(waitForBeforeOpening).then(function () {\n                        webViewerOpenFileViaURL(file);\n                    }).catch(function (reason) {\n                        PDFViewerApplication.l10n.get('loading_error', null, 'An error occurred while opening.').then(function (msg) {\n                            PDFViewerApplication.error(msg, reason);\n                        });\n                    });\n                }\n                var webViewerOpenFileViaURL = void 0;\n                {\n                    webViewerOpenFileViaURL = function webViewerOpenFileViaURL(file) {\n                        if (file && file.lastIndexOf('file:', 0) === 0) {\n                            PDFViewerApplication.setTitleUsingUrl(file);\n                            var xhr = new XMLHttpRequest();\n                            xhr.onload = function () {\n                                PDFViewerApplication.open(new Uint8Array(xhr.response));\n                            };\n                            try {\n                                xhr.open('GET', file);\n                                xhr.responseType = 'arraybuffer';\n                                xhr.send();\n                            } catch (ex) {\n                                PDFViewerApplication.l10n.get('loading_error', null, 'An error occurred while loading the PDF.').then(function (msg) {\n                                    PDFViewerApplication.error(msg, ex);\n                                });\n                            }\n                            return;\n                        }\n                        if (file) {\n                            PDFViewerApplication.open(file);\n                        }\n                    };\n                }\n                function webViewerPageRendered(evt) {\n                    var pageNumber = evt.pageNumber;\n                    var pageIndex = pageNumber - 1;\n                    var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex);\n                    if (pageNumber === PDFViewerApplication.page) {\n                        PDFViewerApplication.toolbar.updateLoadingIndicatorState(false);\n                    }\n                    if (!pageView) {\n                        return;\n                    }\n                    if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {\n                        var thumbnailView = PDFViewerApplication.pdfThumbnailViewer.getThumbnail(pageIndex);\n                        thumbnailView.setImage(pageView);\n                    }\n                    if (_pdfjsLib.PDFJS.pdfBug && Stats.enabled && pageView.stats) {\n                        Stats.add(pageNumber, pageView.stats);\n                    }\n                    if (pageView.error) {\n                        PDFViewerApplication.l10n.get('rendering_error', null, 'An error occurred while rendering the page.').then(function (msg) {\n                            PDFViewerApplication.error(msg, pageView.error);\n                        });\n                    }\n                }\n                function webViewerTextLayerRendered(evt) { }\n                function webViewerPageMode(evt) {\n                    var mode = evt.mode,\n                        view = void 0;\n                    switch (mode) {\n                        case 'thumbs':\n                            view = _pdf_sidebar.SidebarView.THUMBS;\n                            break;\n                        case 'bookmarks':\n                        case 'outline':\n                            view = _pdf_sidebar.SidebarView.OUTLINE;\n                            break;\n                        case 'attachments':\n                            view = _pdf_sidebar.SidebarView.ATTACHMENTS;\n                            break;\n                        case 'none':\n                            view = _pdf_sidebar.SidebarView.NONE;\n                            break;\n                        default:\n                            console.error('Invalid \"pagemode\" hash parameter: ' + mode);\n                            return;\n                    }\n                    PDFViewerApplication.pdfSidebar.switchView(view, true);\n                }\n                function webViewerNamedAction(evt) {\n                    var action = evt.action;\n                    switch (action) {\n                        case 'GoToPage':\n                            PDFViewerApplication.appConfig.toolbar.pageNumber.select();\n                            break;\n                        case 'Find':\n                            if (!PDFViewerApplication.supportsIntegratedFind) {\n                                PDFViewerApplication.findBar.toggle();\n                            }\n                            break;\n                    }\n                }\n                function webViewerPresentationModeChanged(evt) {\n                    var active = evt.active,\n                        switchInProgress = evt.switchInProgress;\n\n                    PDFViewerApplication.pdfViewer.presentationModeState = switchInProgress ? _pdf_viewer.PresentationModeState.CHANGING : active ? _pdf_viewer.PresentationModeState.FULLSCREEN : _pdf_viewer.PresentationModeState.NORMAL;\n                }\n                function webViewerSidebarViewChanged(evt) {\n                    PDFViewerApplication.pdfRenderingQueue.isThumbnailViewEnabled = PDFViewerApplication.pdfSidebar.isThumbnailViewVisible;\n                    var store = PDFViewerApplication.store;\n                    if (store && PDFViewerApplication.isInitialViewSet) {\n                        store.set('sidebarView', evt.view).catch(function () { });\n                    }\n                }\n                function webViewerUpdateViewarea(evt) {\n                    var location = evt.location,\n                        store = PDFViewerApplication.store;\n                    if (store && PDFViewerApplication.isInitialViewSet) {\n                        store.setMultiple({\n                            'exists': true,\n                            'page': location.pageNumber,\n                            'zoom': location.scale,\n                            'scrollLeft': location.left,\n                            'scrollTop': location.top\n                        }).catch(function () { });\n                    }\n                    var href = PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams);\n                    PDFViewerApplication.appConfig.toolbar.viewBookmark.href = href;\n                    PDFViewerApplication.appConfig.secondaryToolbar.viewBookmarkButton.href = href;\n                    PDFViewerApplication.pdfHistory.updateCurrentBookmark(location.pdfOpenParams, location.pageNumber);\n                    var currentPage = PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1);\n                    var loading = currentPage.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED;\n                    PDFViewerApplication.toolbar.updateLoadingIndicatorState(loading);\n                }\n                function webViewerResize() {\n                    var pdfDocument = PDFViewerApplication.pdfDocument,\n                        pdfViewer = PDFViewerApplication.pdfViewer;\n\n                    if (!pdfDocument) {\n                        return;\n                    }\n                    var currentScaleValue = pdfViewer.currentScaleValue;\n                    if (currentScaleValue === 'auto' || currentScaleValue === 'page-fit' || currentScaleValue === 'page-width') {\n                        pdfViewer.currentScaleValue = currentScaleValue;\n                    }\n                    pdfViewer.update();\n                }\n                function webViewerHashchange(evt) {\n                    if (PDFViewerApplication.pdfHistory.isHashChangeUnlocked) {\n                        var hash = evt.hash;\n                        if (!hash) {\n                            return;\n                        }\n                        if (!PDFViewerApplication.isInitialViewSet) {\n                            PDFViewerApplication.initialBookmark = hash;\n                        } else {\n                            PDFViewerApplication.pdfLinkService.setHash(hash);\n                        }\n                    }\n                }\n                var webViewerFileInputChange = void 0;\n                {\n                    webViewerFileInputChange = function webViewerFileInputChange(evt) {\n                        var file = evt.fileInput.files[0];\n                        if (!_pdfjsLib.PDFJS.disableCreateObjectURL && URL.createObjectURL) {\n                            PDFViewerApplication.open(URL.createObjectURL(file));\n                        } else {\n                            var fileReader = new FileReader();\n                            fileReader.onload = function webViewerChangeFileReaderOnload(evt) {\n                                var buffer = evt.target.result;\n                                PDFViewerApplication.open(new Uint8Array(buffer));\n                            };\n                            fileReader.readAsArrayBuffer(file);\n                        }\n                        PDFViewerApplication.setTitleUsingUrl(file.name);\n                        var appConfig = PDFViewerApplication.appConfig;\n                        appConfig.toolbar.viewBookmark.setAttribute('hidden', 'true');\n                        appConfig.secondaryToolbar.viewBookmarkButton.setAttribute('hidden', 'true');\n                        appConfig.toolbar.download.setAttribute('hidden', 'true');\n                        appConfig.secondaryToolbar.downloadButton.setAttribute('hidden', 'true');\n                    };\n                }\n                function webViewerPresentationMode() {\n                    PDFViewerApplication.requestPresentationMode();\n                }\n                function webViewerOpenFile() {\n                    var openFileInputName = PDFViewerApplication.appConfig.openFileInputName;\n                    document.getElementById(openFileInputName).click();\n                }\n                function webViewerPrint() {\n                    window.print();\n                }\n                function webViewerDownload() {\n                    PDFViewerApplication.download();\n                }\n                function webViewerFirstPage() {\n                    if (PDFViewerApplication.pdfDocument) {\n                        PDFViewerApplication.page = 1;\n                    }\n                }\n                function webViewerLastPage() {\n                    if (PDFViewerApplication.pdfDocument) {\n                        PDFViewerApplication.page = PDFViewerApplication.pagesCount;\n                    }\n                }\n                function webViewerNextPage() {\n                    PDFViewerApplication.page++;\n                }\n                function webViewerPreviousPage() {\n                    PDFViewerApplication.page--;\n                }\n                function webViewerZoomIn() {\n                    PDFViewerApplication.zoomIn();\n                }\n                function webViewerZoomOut() {\n                    PDFViewerApplication.zoomOut();\n                }\n                function webViewerPageNumberChanged(evt) {\n                    var pdfViewer = PDFViewerApplication.pdfViewer;\n                    pdfViewer.currentPageLabel = evt.value;\n                    if (evt.value !== pdfViewer.currentPageNumber.toString() && evt.value !== pdfViewer.currentPageLabel) {\n                        PDFViewerApplication.toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);\n                    }\n                }\n                function webViewerScaleChanged(evt) {\n                    PDFViewerApplication.pdfViewer.currentScaleValue = evt.value;\n                }\n                function webViewerRotateCw() {\n                    PDFViewerApplication.rotatePages(90);\n                }\n                function webViewerRotateCcw() {\n                    PDFViewerApplication.rotatePages(-90);\n                }\n                function webViewerDocumentProperties() {\n                    PDFViewerApplication.pdfDocumentProperties.open();\n                }\n                function webViewerFind(evt) {\n                    PDFViewerApplication.findController.executeCommand('find' + evt.type, {\n                        query: evt.query,\n                        phraseSearch: evt.phraseSearch,\n                        caseSensitive: evt.caseSensitive,\n                        highlightAll: evt.highlightAll,\n                        findPrevious: evt.findPrevious\n                    });\n                }\n                function webViewerFindFromUrlHash(evt) {\n                    PDFViewerApplication.findController.executeCommand('find', {\n                        query: evt.query,\n                        phraseSearch: evt.phraseSearch,\n                        caseSensitive: false,\n                        highlightAll: true,\n                        findPrevious: false\n                    });\n                }\n                function webViewerScaleChanging(evt) {\n                    PDFViewerApplication.toolbar.setPageScale(evt.presetValue, evt.scale);\n                    PDFViewerApplication.pdfViewer.update();\n                }\n                function webViewerPageChanging(evt) {\n                    var page = evt.pageNumber;\n                    PDFViewerApplication.toolbar.setPageNumber(page, evt.pageLabel || null);\n                    PDFViewerApplication.secondaryToolbar.setPageNumber(page);\n                    if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {\n                        PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(page);\n                    }\n                    if (_pdfjsLib.PDFJS.pdfBug && Stats.enabled) {\n                        var pageView = PDFViewerApplication.pdfViewer.getPageView(page - 1);\n                        if (pageView.stats) {\n                            Stats.add(page, pageView.stats);\n                        }\n                    }\n                }\n                var zoomDisabled = false,\n                    zoomDisabledTimeout = void 0;\n                function webViewerWheel(evt) {\n                    var pdfViewer = PDFViewerApplication.pdfViewer;\n                    if (pdfViewer.isInPresentationMode) {\n                        return;\n                    }\n                    if (evt.ctrlKey || evt.metaKey) {\n                        var support = PDFViewerApplication.supportedMouseWheelZoomModifierKeys;\n                        if (evt.ctrlKey && !support.ctrlKey || evt.metaKey && !support.metaKey) {\n                            return;\n                        }\n                        evt.preventDefault();\n                        if (zoomDisabled) {\n                            return;\n                        }\n                        var previousScale = pdfViewer.currentScale;\n                        var delta = (0, _ui_utils.normalizeWheelEventDelta)(evt);\n                        var MOUSE_WHEEL_DELTA_PER_PAGE_SCALE = 3.0;\n                        var ticks = delta * MOUSE_WHEEL_DELTA_PER_PAGE_SCALE;\n                        if (ticks < 0) {\n                            PDFViewerApplication.zoomOut(-ticks);\n                        } else {\n                            PDFViewerApplication.zoomIn(ticks);\n                        }\n                        var currentScale = pdfViewer.currentScale;\n                        if (previousScale !== currentScale) {\n                            var scaleCorrectionFactor = currentScale / previousScale - 1;\n                            var rect = pdfViewer.container.getBoundingClientRect();\n                            var dx = evt.clientX - rect.left;\n                            var dy = evt.clientY - rect.top;\n                            pdfViewer.container.scrollLeft += dx * scaleCorrectionFactor;\n                            pdfViewer.container.scrollTop += dy * scaleCorrectionFactor;\n                        }\n                    } else {\n                        zoomDisabled = true;\n                        clearTimeout(zoomDisabledTimeout);\n                        zoomDisabledTimeout = setTimeout(function () {\n                            zoomDisabled = false;\n                        }, 1000);\n                    }\n                }\n                function webViewerClick(evt) {\n                    if (!PDFViewerApplication.secondaryToolbar.isOpen) {\n                        return;\n                    }\n                    var appConfig = PDFViewerApplication.appConfig;\n                    if (PDFViewerApplication.pdfViewer.containsElement(evt.target) || appConfig.toolbar.container.contains(evt.target) && evt.target !== appConfig.secondaryToolbar.toggleButton) {\n                        PDFViewerApplication.secondaryToolbar.close();\n                    }\n                }\n                function webViewerKeyDown(evt) {\n                    if (PDFViewerApplication.overlayManager.active) {\n                        return;\n                    }\n                    var handled = false,\n                        ensureViewerFocused = false;\n                    var cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0);\n                    var pdfViewer = PDFViewerApplication.pdfViewer;\n                    var isViewerInPresentationMode = pdfViewer && pdfViewer.isInPresentationMode;\n                    if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {\n                        switch (evt.keyCode) {\n                            case 70:\n                                if (!PDFViewerApplication.supportsIntegratedFind) {\n                                    PDFViewerApplication.findBar.open();\n                                    handled = true;\n                                }\n                                break;\n                            case 71:\n                                if (!PDFViewerApplication.supportsIntegratedFind) {\n                                    var findState = PDFViewerApplication.findController.state;\n                                    if (findState) {\n                                        PDFViewerApplication.findController.executeCommand('findagain', {\n                                            query: findState.query,\n                                            phraseSearch: findState.phraseSearch,\n                                            caseSensitive: findState.caseSensitive,\n                                            highlightAll: findState.highlightAll,\n                                            findPrevious: cmd === 5 || cmd === 12\n                                        });\n                                    }\n                                    handled = true;\n                                }\n                                break;\n                            case 61:\n                            case 107:\n                            case 187:\n                            case 171:\n                                if (!isViewerInPresentationMode) {\n                                    PDFViewerApplication.zoomIn();\n                                }\n                                handled = true;\n                                break;\n                            case 173:\n                            case 109:\n                            case 189:\n                                if (!isViewerInPresentationMode) {\n                                    PDFViewerApplication.zoomOut();\n                                }\n                                handled = true;\n                                break;\n                            case 48:\n                            case 96:\n                                if (!isViewerInPresentationMode) {\n                                    setTimeout(function () {\n                                        pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;\n                                    });\n                                    handled = false;\n                                }\n                                break;\n                            case 38:\n                                if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {\n                                    PDFViewerApplication.page = 1;\n                                    handled = true;\n                                    ensureViewerFocused = true;\n                                }\n                                break;\n                            case 40:\n                                if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) {\n                                    PDFViewerApplication.page = PDFViewerApplication.pagesCount;\n                                    handled = true;\n                                    ensureViewerFocused = true;\n                                }\n                                break;\n                        }\n                    }\n                    if (cmd === 1 || cmd === 8) {\n                        switch (evt.keyCode) {\n                            case 83:\n                                PDFViewerApplication.download();\n                                handled = true;\n                                break;\n                        }\n                    }\n                    if (cmd === 3 || cmd === 10) {\n                        switch (evt.keyCode) {\n                            case 80:\n                                PDFViewerApplication.requestPresentationMode();\n                                handled = true;\n                                break;\n                            case 71:\n                                PDFViewerApplication.appConfig.toolbar.pageNumber.select();\n                                handled = true;\n                                break;\n                        }\n                    }\n                    if (handled) {\n                        if (ensureViewerFocused && !isViewerInPresentationMode) {\n                            pdfViewer.focus();\n                        }\n                        evt.preventDefault();\n                        return;\n                    }\n                    var curElement = document.activeElement || document.querySelector(':focus');\n                    var curElementTagName = curElement && curElement.tagName.toUpperCase();\n                    if (curElementTagName === 'INPUT' || curElementTagName === 'TEXTAREA' || curElementTagName === 'SELECT') {\n                        if (evt.keyCode !== 27) {\n                            return;\n                        }\n                    }\n                    if (cmd === 0) {\n                        switch (evt.keyCode) {\n                            case 38:\n                            case 33:\n                            case 8:\n                                if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') {\n                                    break;\n                                }\n                            case 37:\n                                if (pdfViewer.isHorizontalScrollbarEnabled) {\n                                    break;\n                                }\n                            case 75:\n                            case 80:\n                                if (PDFViewerApplication.page > 1) {\n                                    PDFViewerApplication.page--;\n                                }\n                                handled = true;\n                                break;\n                            case 27:\n                                if (PDFViewerApplication.secondaryToolbar.isOpen) {\n                                    PDFViewerApplication.secondaryToolbar.close();\n                                    handled = true;\n                                }\n                                if (!PDFViewerApplication.supportsIntegratedFind && PDFViewerApplication.findBar.opened) {\n                                    PDFViewerApplication.findBar.close();\n                                    handled = true;\n                                }\n                                break;\n                            case 40:\n                            case 34:\n                            case 32:\n                                if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') {\n                                    break;\n                                }\n                            case 39:\n                                if (pdfViewer.isHorizontalScrollbarEnabled) {\n                                    break;\n                                }\n                            case 74:\n                            case 78:\n                                if (PDFViewerApplication.page < PDFViewerApplication.pagesCount) {\n                                    PDFViewerApplication.page++;\n                                }\n                                handled = true;\n                                break;\n                            case 36:\n                                if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {\n                                    PDFViewerApplication.page = 1;\n                                    handled = true;\n                                    ensureViewerFocused = true;\n                                }\n                                break;\n                            case 35:\n                                if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) {\n                                    PDFViewerApplication.page = PDFViewerApplication.pagesCount;\n                                    handled = true;\n                                    ensureViewerFocused = true;\n                                }\n                                break;\n                            case 83:\n                                PDFViewerApplication.pdfCursorTools.switchTool(_pdf_cursor_tools.CursorTool.SELECT);\n                                break;\n                            case 72:\n                                PDFViewerApplication.pdfCursorTools.switchTool(_pdf_cursor_tools.CursorTool.HAND);\n                                break;\n                            case 82:\n                                PDFViewerApplication.rotatePages(90);\n                                break;\n                        }\n                    }\n                    if (cmd === 4) {\n                        switch (evt.keyCode) {\n                            case 32:\n                                if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') {\n                                    break;\n                                }\n                                if (PDFViewerApplication.page > 1) {\n                                    PDFViewerApplication.page--;\n                                }\n                                handled = true;\n                                break;\n                            case 82:\n                                PDFViewerApplication.rotatePages(-90);\n                                break;\n                        }\n                    }\n                    if (!handled && !isViewerInPresentationMode) {\n                        if (evt.keyCode >= 33 && evt.keyCode <= 40 || evt.keyCode === 32 && curElementTagName !== 'BUTTON') {\n                            ensureViewerFocused = true;\n                        }\n                    }\n                    if (cmd === 2) {\n                        switch (evt.keyCode) {\n                            case 37:\n                                if (isViewerInPresentationMode) {\n                                    PDFViewerApplication.pdfHistory.back();\n                                    handled = true;\n                                }\n                                break;\n                            case 39:\n                                if (isViewerInPresentationMode) {\n                                    PDFViewerApplication.pdfHistory.forward();\n                                    handled = true;\n                                }\n                                break;\n                        }\n                    }\n                    if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) {\n                        pdfViewer.focus();\n                    }\n                    if (handled) {\n                        evt.preventDefault();\n                    }\n                }\n                function apiPageModeToSidebarView(mode) {\n                    switch (mode) {\n                        case 'UseNone':\n                            return _pdf_sidebar.SidebarView.NONE;\n                        case 'UseThumbs':\n                            return _pdf_sidebar.SidebarView.THUMBS;\n                        case 'UseOutlines':\n                            return _pdf_sidebar.SidebarView.OUTLINE;\n                        case 'UseAttachments':\n                            return _pdf_sidebar.SidebarView.ATTACHMENTS;\n                        case 'UseOC':\n                    }\n                    return _pdf_sidebar.SidebarView.NONE;\n                }\n                var PDFPrintServiceFactory = {\n                    instance: {\n                        supportsPrinting: false,\n                        createPrintService: function createPrintService() {\n                            throw new Error('Not implemented: createPrintService');\n                        }\n                    }\n                };\n                exports.PDFViewerApplication = PDFViewerApplication;\n                exports.DefaultExternalServices = DefaultExternalServices;\n                exports.PDFPrintServiceFactory = PDFPrintServiceFactory;\n\n                /***/\n            }),\n        /* 5 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.SimpleLinkService = exports.PDFLinkService = undefined;\n\n                var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _dom_events = __webpack_require__(2);\n\n                var _ui_utils = __webpack_require__(0);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var PDFLinkService = function () {\n                    function PDFLinkService() {\n                        var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n                            eventBus = _ref.eventBus;\n\n                        _classCallCheck(this, PDFLinkService);\n\n                        this.eventBus = eventBus || (0, _dom_events.getGlobalEventBus)();\n                        this.baseUrl = null;\n                        this.pdfDocument = null;\n                        this.pdfViewer = null;\n                        this.pdfHistory = null;\n                        this._pagesRefCache = null;\n                    }\n\n                    _createClass(PDFLinkService, [{\n                        key: 'setDocument',\n                        value: function setDocument(pdfDocument, baseUrl) {\n                            this.baseUrl = baseUrl;\n                            this.pdfDocument = pdfDocument;\n                            this._pagesRefCache = Object.create(null);\n                        }\n                    }, {\n                        key: 'setViewer',\n                        value: function setViewer(pdfViewer) {\n                            this.pdfViewer = pdfViewer;\n                        }\n                    }, {\n                        key: 'setHistory',\n                        value: function setHistory(pdfHistory) {\n                            this.pdfHistory = pdfHistory;\n                        }\n                    }, {\n                        key: 'navigateTo',\n                        value: function navigateTo(dest) {\n                            var _this = this;\n\n                            var goToDestination = function goToDestination(_ref2) {\n                                var namedDest = _ref2.namedDest,\n                                    explicitDest = _ref2.explicitDest;\n\n                                var destRef = explicitDest[0],\n                                    pageNumber = void 0;\n                                if (destRef instanceof Object) {\n                                    pageNumber = _this._cachedPageNumber(destRef);\n                                    if (pageNumber === null) {\n                                        _this.pdfDocument.getPageIndex(destRef).then(function (pageIndex) {\n                                            _this.cachePageRef(pageIndex + 1, destRef);\n                                            goToDestination({\n                                                namedDest: namedDest,\n                                                explicitDest: explicitDest\n                                            });\n                                        }).catch(function () {\n                                            console.error('PDFLinkService.navigateTo: \"' + destRef + '\" is not ' + ('a valid page reference, for dest=\"' + dest + '\".'));\n                                        });\n                                        return;\n                                    }\n                                } else if ((destRef | 0) === destRef) {\n                                    pageNumber = destRef + 1;\n                                } else {\n                                    console.error('PDFLinkService.navigateTo: \"' + destRef + '\" is not ' + ('a valid destination reference, for dest=\"' + dest + '\".'));\n                                    return;\n                                }\n                                if (!pageNumber || pageNumber < 1 || pageNumber > _this.pagesCount) {\n                                    console.error('PDFLinkService.navigateTo: \"' + pageNumber + '\" is not ' + ('a valid page number, for dest=\"' + dest + '\".'));\n                                    return;\n                                }\n                                _this.pdfViewer.scrollPageIntoView({\n                                    pageNumber: pageNumber,\n                                    destArray: explicitDest\n                                });\n                                if (_this.pdfHistory) {\n                                    _this.pdfHistory.push({\n                                        dest: explicitDest,\n                                        hash: namedDest,\n                                        page: pageNumber\n                                    });\n                                }\n                            };\n                            new Promise(function (resolve, reject) {\n                                if (typeof dest === 'string') {\n                                    _this.pdfDocument.getDestination(dest).then(function (destArray) {\n                                        resolve({\n                                            namedDest: dest,\n                                            explicitDest: destArray\n                                        });\n                                    });\n                                    return;\n                                }\n                                resolve({\n                                    namedDest: '',\n                                    explicitDest: dest\n                                });\n                            }).then(function (data) {\n                                if (!(data.explicitDest instanceof Array)) {\n                                    console.error('PDFLinkService.navigateTo: \"' + data.explicitDest + '\" is' + (' not a valid destination array, for dest=\"' + dest + '\".'));\n                                    return;\n                                }\n                                goToDestination(data);\n                            });\n                        }\n                    }, {\n                        key: 'getDestinationHash',\n                        value: function getDestinationHash(dest) {\n                            if (typeof dest === 'string') {\n                                return this.getAnchorUrl('#' + escape(dest));\n                            }\n                            if (dest instanceof Array) {\n                                var str = JSON.stringify(dest);\n                                return this.getAnchorUrl('#' + escape(str));\n                            }\n                            return this.getAnchorUrl('');\n                        }\n                    }, {\n                        key: 'getAnchorUrl',\n                        value: function getAnchorUrl(anchor) {\n                            return (this.baseUrl || '') + anchor;\n                        }\n                    }, {\n                        key: 'setHash',\n                        value: function setHash(hash) {\n                            var pageNumber = void 0,\n                                dest = void 0;\n                            if (hash.indexOf('=') >= 0) {\n                                var params = (0, _ui_utils.parseQueryString)(hash);\n                                if ('search' in params) {\n                                    this.eventBus.dispatch('findfromurlhash', {\n                                        source: this,\n                                        query: params['search'].replace(/\"/g, ''),\n                                        phraseSearch: params['phrase'] === 'true'\n                                    });\n                                }\n                                if ('nameddest' in params) {\n                                    if (this.pdfHistory) {\n                                        this.pdfHistory.updateNextHashParam(params.nameddest);\n                                    }\n                                    this.navigateTo(params.nameddest);\n                                    return;\n                                }\n                                if ('page' in params) {\n                                    pageNumber = params.page | 0 || 1;\n                                }\n                                if ('zoom' in params) {\n                                    var zoomArgs = params.zoom.split(',');\n                                    var zoomArg = zoomArgs[0];\n                                    var zoomArgNumber = parseFloat(zoomArg);\n                                    if (zoomArg.indexOf('Fit') === -1) {\n                                        dest = [null, { name: 'XYZ' }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg];\n                                    } else {\n                                        if (zoomArg === 'Fit' || zoomArg === 'FitB') {\n                                            dest = [null, { name: zoomArg }];\n                                        } else if (zoomArg === 'FitH' || zoomArg === 'FitBH' || zoomArg === 'FitV' || zoomArg === 'FitBV') {\n                                            dest = [null, { name: zoomArg }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null];\n                                        } else if (zoomArg === 'FitR') {\n                                            if (zoomArgs.length !== 5) {\n                                                console.error('PDFLinkService.setHash: Not enough parameters for \"FitR\".');\n                                            } else {\n                                                dest = [null, { name: zoomArg }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0];\n                                            }\n                                        } else {\n                                            console.error('PDFLinkService.setHash: \"' + zoomArg + '\" is not ' + 'a valid zoom value.');\n                                        }\n                                    }\n                                }\n                                if (dest) {\n                                    this.pdfViewer.scrollPageIntoView({\n                                        pageNumber: pageNumber || this.page,\n                                        destArray: dest,\n                                        allowNegativeOffset: true\n                                    });\n                                } else if (pageNumber) {\n                                    this.page = pageNumber;\n                                }\n                                if ('pagemode' in params) {\n                                    this.eventBus.dispatch('pagemode', {\n                                        source: this,\n                                        mode: params.pagemode\n                                    });\n                                }\n                            } else {\n                                if (/^\\d+$/.test(hash) && hash <= this.pagesCount) {\n                                    console.warn('PDFLinkService_setHash: specifying a page number ' + 'directly after the hash symbol (#) is deprecated, ' + ('please use the \"#page=' + hash + '\" form instead.'));\n                                    this.page = hash | 0;\n                                }\n                                dest = unescape(hash);\n                                try {\n                                    dest = JSON.parse(dest);\n                                    if (!(dest instanceof Array)) {\n                                        dest = dest.toString();\n                                    }\n                                } catch (ex) { }\n                                if (typeof dest === 'string' || isValidExplicitDestination(dest)) {\n                                    if (this.pdfHistory) {\n                                        this.pdfHistory.updateNextHashParam(dest);\n                                    }\n                                    this.navigateTo(dest);\n                                    return;\n                                }\n                                console.error('PDFLinkService.setHash: \"' + unescape(hash) + '\" is not ' + 'a valid destination.');\n                            }\n                        }\n                    }, {\n                        key: 'executeNamedAction',\n                        value: function executeNamedAction(action) {\n                            switch (action) {\n                                case 'GoBack':\n                                    if (this.pdfHistory) {\n                                        this.pdfHistory.back();\n                                    }\n                                    break;\n                                case 'GoForward':\n                                    if (this.pdfHistory) {\n                                        this.pdfHistory.forward();\n                                    }\n                                    break;\n                                case 'NextPage':\n                                    if (this.page < this.pagesCount) {\n                                        this.page++;\n                                    }\n                                    break;\n                                case 'PrevPage':\n                                    if (this.page > 1) {\n                                        this.page--;\n                                    }\n                                    break;\n                                case 'LastPage':\n                                    this.page = this.pagesCount;\n                                    break;\n                                case 'FirstPage':\n                                    this.page = 1;\n                                    break;\n                                default:\n                                    break;\n                            }\n                            this.eventBus.dispatch('namedaction', {\n                                source: this,\n                                action: action\n                            });\n                        }\n                    }, {\n                        key: 'onFileAttachmentAnnotation',\n                        value: function onFileAttachmentAnnotation(_ref3) {\n                            var id = _ref3.id,\n                                filename = _ref3.filename,\n                                content = _ref3.content;\n\n                            this.eventBus.dispatch('fileattachmentannotation', {\n                                source: this,\n                                id: id,\n                                filename: filename,\n                                content: content\n                            });\n                        }\n                    }, {\n                        key: 'cachePageRef',\n                        value: function cachePageRef(pageNum, pageRef) {\n                            var refStr = pageRef.num + ' ' + pageRef.gen + ' R';\n                            this._pagesRefCache[refStr] = pageNum;\n                        }\n                    }, {\n                        key: '_cachedPageNumber',\n                        value: function _cachedPageNumber(pageRef) {\n                            var refStr = pageRef.num + ' ' + pageRef.gen + ' R';\n                            return this._pagesRefCache && this._pagesRefCache[refStr] || null;\n                        }\n                    }, {\n                        key: 'pagesCount',\n                        get: function get() {\n                            return this.pdfDocument ? this.pdfDocument.numPages : 0;\n                        }\n                    }, {\n                        key: 'page',\n                        get: function get() {\n                            return this.pdfViewer.currentPageNumber;\n                        },\n                        set: function set(value) {\n                            this.pdfViewer.currentPageNumber = value;\n                        }\n                    }]);\n\n                    return PDFLinkService;\n                }();\n\n                function isValidExplicitDestination(dest) {\n                    if (!(dest instanceof Array)) {\n                        return false;\n                    }\n                    var destLength = dest.length,\n                        allowNull = true;\n                    if (destLength < 2) {\n                        return false;\n                    }\n                    var page = dest[0];\n                    if (!((typeof page === 'undefined' ? 'undefined' : _typeof(page)) === 'object' && typeof page.num === 'number' && (page.num | 0) === page.num && typeof page.gen === 'number' && (page.gen | 0) === page.gen) && !(typeof page === 'number' && (page | 0) === page && page >= 0)) {\n                        return false;\n                    }\n                    var zoom = dest[1];\n                    if (!((typeof zoom === 'undefined' ? 'undefined' : _typeof(zoom)) === 'object' && typeof zoom.name === 'string')) {\n                        return false;\n                    }\n                    switch (zoom.name) {\n                        case 'XYZ':\n                            if (destLength !== 5) {\n                                return false;\n                            }\n                            break;\n                        case 'Fit':\n                        case 'FitB':\n                            return destLength === 2;\n                        case 'FitH':\n                        case 'FitBH':\n                        case 'FitV':\n                        case 'FitBV':\n                            if (destLength !== 3) {\n                                return false;\n                            }\n                            break;\n                        case 'FitR':\n                            if (destLength !== 6) {\n                                return false;\n                            }\n                            allowNull = false;\n                            break;\n                        default:\n                            return false;\n                    }\n                    for (var i = 2; i < destLength; i++) {\n                        var param = dest[i];\n                        if (!(typeof param === 'number' || allowNull && param === null)) {\n                            return false;\n                        }\n                    }\n                    return true;\n                }\n\n                var SimpleLinkService = function () {\n                    function SimpleLinkService() {\n                        _classCallCheck(this, SimpleLinkService);\n                    }\n\n                    _createClass(SimpleLinkService, [{\n                        key: 'navigateTo',\n                        value: function navigateTo(dest) { }\n                    }, {\n                        key: 'getDestinationHash',\n                        value: function getDestinationHash(dest) {\n                            return '#';\n                        }\n                    }, {\n                        key: 'getAnchorUrl',\n                        value: function getAnchorUrl(hash) {\n                            return '#';\n                        }\n                    }, {\n                        key: 'setHash',\n                        value: function setHash(hash) { }\n                    }, {\n                        key: 'executeNamedAction',\n                        value: function executeNamedAction(action) { }\n                    }, {\n                        key: 'onFileAttachmentAnnotation',\n                        value: function onFileAttachmentAnnotation(_ref4) {\n                            var id = _ref4.id,\n                                filename = _ref4.filename,\n                                content = _ref4.content;\n                        }\n                    }, {\n                        key: 'cachePageRef',\n                        value: function cachePageRef(pageNum, pageRef) { }\n                    }, {\n                        key: 'page',\n                        get: function get() {\n                            return 0;\n                        },\n                        set: function set(value) { }\n                    }]);\n\n                    return SimpleLinkService;\n                }();\n\n                exports.PDFLinkService = PDFLinkService;\n                exports.SimpleLinkService = SimpleLinkService;\n\n                /***/\n            }),\n        /* 6 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFCursorTools = exports.CursorTool = undefined;\n\n                var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _grab_to_pan = __webpack_require__(14);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var CursorTool = {\n                    SELECT: 0,\n                    HAND: 1,\n                    ZOOM: 2\n                };\n\n                var PDFCursorTools = function () {\n                    function PDFCursorTools(_ref) {\n                        var _this = this;\n\n                        var container = _ref.container,\n                            eventBus = _ref.eventBus,\n                            preferences = _ref.preferences;\n\n                        _classCallCheck(this, PDFCursorTools);\n\n                        this.container = container;\n                        this.eventBus = eventBus;\n                        this.active = CursorTool.SELECT;\n                        this.activeBeforePresentationMode = null;\n                        this.handTool = new _grab_to_pan.GrabToPan({ element: this.container });\n                        this._addEventListeners();\n                        Promise.all([preferences.get('cursorToolOnLoad'), preferences.get('enableHandToolOnLoad')]).then(function (_ref2) {\n                            var _ref3 = _slicedToArray(_ref2, 2),\n                                cursorToolPref = _ref3[0],\n                                handToolPref = _ref3[1];\n\n                            if (handToolPref === true) {\n                                preferences.set('enableHandToolOnLoad', false);\n                                if (cursorToolPref === CursorTool.SELECT) {\n                                    cursorToolPref = CursorTool.HAND;\n                                    preferences.set('cursorToolOnLoad', cursorToolPref).catch(function () { });\n                                }\n                            }\n                            _this.switchTool(cursorToolPref);\n                        }).catch(function () { });\n                    }\n\n                    _createClass(PDFCursorTools, [{\n                        key: 'switchTool',\n                        value: function switchTool(tool) {\n                            var _this2 = this;\n\n                            if (this.activeBeforePresentationMode !== null) {\n                                return;\n                            }\n                            if (tool === this.active) {\n                                return;\n                            }\n                            var disableActiveTool = function disableActiveTool() {\n                                switch (_this2.active) {\n                                    case CursorTool.SELECT:\n                                        break;\n                                    case CursorTool.HAND:\n                                        _this2.handTool.deactivate();\n                                        break;\n                                    case CursorTool.ZOOM:\n                                }\n                            };\n                            switch (tool) {\n                                case CursorTool.SELECT:\n                                    disableActiveTool();\n                                    break;\n                                case CursorTool.HAND:\n                                    disableActiveTool();\n                                    this.handTool.activate();\n                                    break;\n                                case CursorTool.ZOOM:\n                                default:\n                                    console.error('switchTool: \"' + tool + '\" is an unsupported value.');\n                                    return;\n                            }\n                            this.active = tool;\n                            this._dispatchEvent();\n                        }\n                    }, {\n                        key: '_dispatchEvent',\n                        value: function _dispatchEvent() {\n                            this.eventBus.dispatch('cursortoolchanged', {\n                                source: this,\n                                tool: this.active\n                            });\n                        }\n                    }, {\n                        key: '_addEventListeners',\n                        value: function _addEventListeners() {\n                            var _this3 = this;\n\n                            this.eventBus.on('switchcursortool', function (evt) {\n                                _this3.switchTool(evt.tool);\n                            });\n                            this.eventBus.on('presentationmodechanged', function (evt) {\n                                if (evt.switchInProgress) {\n                                    return;\n                                }\n                                var previouslyActive = void 0;\n                                if (evt.active) {\n                                    previouslyActive = _this3.active;\n                                    _this3.switchTool(CursorTool.SELECT);\n                                    _this3.activeBeforePresentationMode = previouslyActive;\n                                } else {\n                                    previouslyActive = _this3.activeBeforePresentationMode;\n                                    _this3.activeBeforePresentationMode = null;\n                                    _this3.switchTool(previouslyActive);\n                                }\n                            });\n                        }\n                    }, {\n                        key: 'activeTool',\n                        get: function get() {\n                            return this.active;\n                        }\n                    }]);\n\n                    return PDFCursorTools;\n                }();\n\n                exports.CursorTool = CursorTool;\n                exports.PDFCursorTools = PDFCursorTools;\n\n                /***/\n            }),\n        /* 7 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFFindController = exports.FindState = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                var _ui_utils = __webpack_require__(0);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var FindState = {\n                    FOUND: 0,\n                    NOT_FOUND: 1,\n                    WRAPPED: 2,\n                    PENDING: 3\n                };\n                var FIND_SCROLL_OFFSET_TOP = -50;\n                var FIND_SCROLL_OFFSET_LEFT = -400;\n                var FIND_TIMEOUT = 250;\n                var CHARACTERS_TO_NORMALIZE = {\n                    '\\u2018': '\\'',\n                    '\\u2019': '\\'',\n                    '\\u201A': '\\'',\n                    '\\u201B': '\\'',\n                    '\\u201C': '\"',\n                    '\\u201D': '\"',\n                    '\\u201E': '\"',\n                    '\\u201F': '\"',\n                    '\\xBC': '1/4',\n                    '\\xBD': '1/2',\n                    '\\xBE': '3/4'\n                };\n\n                var PDFFindController = function () {\n                    function PDFFindController(_ref) {\n                        var pdfViewer = _ref.pdfViewer;\n\n                        _classCallCheck(this, PDFFindController);\n\n                        this.pdfViewer = pdfViewer;\n                        this.onUpdateResultsCount = null;\n                        this.onUpdateState = null;\n                        this.reset();\n                        var replace = Object.keys(CHARACTERS_TO_NORMALIZE).join('');\n                        this.normalizationRegex = new RegExp('[' + replace + ']', 'g');\n                    }\n\n                    _createClass(PDFFindController, [{\n                        key: 'reset',\n                        value: function reset() {\n                            var _this = this;\n\n                            this.startedTextExtraction = false;\n                            this.extractTextPromises = [];\n                            this.pendingFindMatches = Object.create(null);\n                            this.active = false;\n                            this.pageContents = [];\n                            this.pageMatches = [];\n                            this.pageMatchesLength = null;\n                            this.matchCount = 0;\n                            this.selected = {\n                                pageIdx: -1,\n                                matchIdx: -1\n                            };\n                            this.offset = {\n                                pageIdx: null,\n                                matchIdx: null\n                            };\n                            this.pagesToSearch = null;\n                            this.resumePageIdx = null;\n                            this.state = null;\n                            this.dirtyMatch = false;\n                            this.findTimeout = null;\n                            this._firstPagePromise = new Promise(function (resolve) {\n                                _this.resolveFirstPage = resolve;\n                            });\n                        }\n                    }, {\n                        key: 'normalize',\n                        value: function normalize(text) {\n                            return text.replace(this.normalizationRegex, function (ch) {\n                                return CHARACTERS_TO_NORMALIZE[ch];\n                            });\n                        }\n                    }, {\n                        key: '_prepareMatches',\n                        value: function _prepareMatches(matchesWithLength, matches, matchesLength) {\n                            function isSubTerm(matchesWithLength, currentIndex) {\n                                var currentElem = matchesWithLength[currentIndex];\n                                var nextElem = matchesWithLength[currentIndex + 1];\n                                if (currentIndex < matchesWithLength.length - 1 && currentElem.match === nextElem.match) {\n                                    currentElem.skipped = true;\n                                    return true;\n                                }\n                                for (var i = currentIndex - 1; i >= 0; i--) {\n                                    var prevElem = matchesWithLength[i];\n                                    if (prevElem.skipped) {\n                                        continue;\n                                    }\n                                    if (prevElem.match + prevElem.matchLength < currentElem.match) {\n                                        break;\n                                    }\n                                    if (prevElem.match + prevElem.matchLength >= currentElem.match + currentElem.matchLength) {\n                                        currentElem.skipped = true;\n                                        return true;\n                                    }\n                                }\n                                return false;\n                            }\n                            matchesWithLength.sort(function (a, b) {\n                                return a.match === b.match ? a.matchLength - b.matchLength : a.match - b.match;\n                            });\n                            for (var i = 0, len = matchesWithLength.length; i < len; i++) {\n                                if (isSubTerm(matchesWithLength, i)) {\n                                    continue;\n                                }\n                                matches.push(matchesWithLength[i].match);\n                                matchesLength.push(matchesWithLength[i].matchLength);\n                            }\n                        }\n                    }, {\n                        key: 'calcFindPhraseMatch',\n                        value: function calcFindPhraseMatch(query, pageIndex, pageContent) {\n                            var matches = [];\n                            var queryLen = query.length;\n                            var matchIdx = -queryLen;\n                            while (true) {\n                                matchIdx = pageContent.indexOf(query, matchIdx + queryLen);\n                                if (matchIdx === -1) {\n                                    break;\n                                }\n                                matches.push(matchIdx);\n                            }\n                            this.pageMatches[pageIndex] = matches;\n                        }\n                    }, {\n                        key: 'calcFindWordMatch',\n                        value: function calcFindWordMatch(query, pageIndex, pageContent) {\n                            var matchesWithLength = [];\n                            var queryArray = query.match(/\\S+/g);\n                            for (var i = 0, len = queryArray.length; i < len; i++) {\n                                var subquery = queryArray[i];\n                                var subqueryLen = subquery.length;\n                                var matchIdx = -subqueryLen;\n                                while (true) {\n                                    matchIdx = pageContent.indexOf(subquery, matchIdx + subqueryLen);\n                                    if (matchIdx === -1) {\n                                        break;\n                                    }\n                                    matchesWithLength.push({\n                                        match: matchIdx,\n                                        matchLength: subqueryLen,\n                                        skipped: false\n                                    });\n                                }\n                            }\n                            if (!this.pageMatchesLength) {\n                                this.pageMatchesLength = [];\n                            }\n                            this.pageMatchesLength[pageIndex] = [];\n                            this.pageMatches[pageIndex] = [];\n                            this._prepareMatches(matchesWithLength, this.pageMatches[pageIndex], this.pageMatchesLength[pageIndex]);\n                        }\n                    }, {\n                        key: 'calcFindMatch',\n                        value: function calcFindMatch(pageIndex) {\n                            var pageContent = this.normalize(this.pageContents[pageIndex]);\n                            var query = this.normalize(this.state.query);\n                            var caseSensitive = this.state.caseSensitive;\n                            var phraseSearch = this.state.phraseSearch;\n                            var queryLen = query.length;\n                            if (queryLen === 0) {\n                                return;\n                            }\n                            if (!caseSensitive) {\n                                pageContent = pageContent.toLowerCase();\n                                query = query.toLowerCase();\n                            }\n                            if (phraseSearch) {\n                                this.calcFindPhraseMatch(query, pageIndex, pageContent);\n                            } else {\n                                this.calcFindWordMatch(query, pageIndex, pageContent);\n                            }\n                            this.updatePage(pageIndex);\n                            if (this.resumePageIdx === pageIndex) {\n                                this.resumePageIdx = null;\n                                this.nextPageMatch();\n                            }\n                            if (this.pageMatches[pageIndex].length > 0) {\n                                this.matchCount += this.pageMatches[pageIndex].length;\n                                this.updateUIResultsCount();\n                            }\n                        }\n                    }, {\n                        key: 'extractText',\n                        value: function extractText() {\n                            var _this2 = this;\n\n                            if (this.startedTextExtraction) {\n                                return;\n                            }\n                            this.startedTextExtraction = true;\n                            this.pageContents.length = 0;\n                            var promise = Promise.resolve();\n\n                            var _loop = function _loop(i, ii) {\n                                var extractTextCapability = (0, _pdfjsLib.createPromiseCapability)();\n                                _this2.extractTextPromises[i] = extractTextCapability.promise;\n                                promise = promise.then(function () {\n                                    return _this2.pdfViewer.getPageTextContent(i).then(function (textContent) {\n                                        var textItems = textContent.items;\n                                        var strBuf = [];\n                                        for (var j = 0, jj = textItems.length; j < jj; j++) {\n                                            strBuf.push(textItems[j].str);\n                                        }\n                                        _this2.pageContents[i] = strBuf.join('');\n                                        extractTextCapability.resolve(i);\n                                    }, function (reason) {\n                                        console.error('Unable to get page ' + (i + 1) + ' text content', reason);\n                                        _this2.pageContents[i] = '';\n                                        extractTextCapability.resolve(i);\n                                    });\n                                });\n                            };\n\n                            for (var i = 0, ii = this.pdfViewer.pagesCount; i < ii; i++) {\n                                _loop(i, ii);\n                            }\n                        }\n                    }, {\n                        key: 'executeCommand',\n                        value: function executeCommand(cmd, state) {\n                            var _this3 = this;\n\n                            if (this.state === null || cmd !== 'findagain') {\n                                this.dirtyMatch = true;\n                            }\n                            this.state = state;\n                            this.updateUIState(FindState.PENDING);\n                            this._firstPagePromise.then(function () {\n                                _this3.extractText();\n                                clearTimeout(_this3.findTimeout);\n                                if (cmd === 'find') {\n                                    _this3.findTimeout = setTimeout(_this3.nextMatch.bind(_this3), FIND_TIMEOUT);\n                                } else {\n                                    _this3.nextMatch();\n                                }\n                            });\n                        }\n                    }, {\n                        key: 'updatePage',\n                        value: function updatePage(index) {\n                            if (this.selected.pageIdx === index) {\n                                this.pdfViewer.currentPageNumber = index + 1;\n                            }\n                            var page = this.pdfViewer.getPageView(index);\n                            if (page.textLayer) {\n                                page.textLayer.updateMatches();\n                            }\n                        }\n                    }, {\n                        key: 'nextMatch',\n                        value: function nextMatch() {\n                            var _this4 = this;\n\n                            var previous = this.state.findPrevious;\n                            var currentPageIndex = this.pdfViewer.currentPageNumber - 1;\n                            var numPages = this.pdfViewer.pagesCount;\n                            this.active = true;\n                            if (this.dirtyMatch) {\n                                this.dirtyMatch = false;\n                                this.selected.pageIdx = this.selected.matchIdx = -1;\n                                this.offset.pageIdx = currentPageIndex;\n                                this.offset.matchIdx = null;\n                                this.hadMatch = false;\n                                this.resumePageIdx = null;\n                                this.pageMatches = [];\n                                this.matchCount = 0;\n                                this.pageMatchesLength = null;\n                                for (var i = 0; i < numPages; i++) {\n                                    this.updatePage(i);\n                                    if (!(i in this.pendingFindMatches)) {\n                                        this.pendingFindMatches[i] = true;\n                                        this.extractTextPromises[i].then(function (pageIdx) {\n                                            delete _this4.pendingFindMatches[pageIdx];\n                                            _this4.calcFindMatch(pageIdx);\n                                        });\n                                    }\n                                }\n                            }\n                            if (this.state.query === '') {\n                                this.updateUIState(FindState.FOUND);\n                                return;\n                            }\n                            if (this.resumePageIdx) {\n                                return;\n                            }\n                            var offset = this.offset;\n                            this.pagesToSearch = numPages;\n                            if (offset.matchIdx !== null) {\n                                var numPageMatches = this.pageMatches[offset.pageIdx].length;\n                                if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) {\n                                    this.hadMatch = true;\n                                    offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1;\n                                    this.updateMatch(true);\n                                    return;\n                                }\n                                this.advanceOffsetPage(previous);\n                            }\n                            this.nextPageMatch();\n                        }\n                    }, {\n                        key: 'matchesReady',\n                        value: function matchesReady(matches) {\n                            var offset = this.offset;\n                            var numMatches = matches.length;\n                            var previous = this.state.findPrevious;\n                            if (numMatches) {\n                                this.hadMatch = true;\n                                offset.matchIdx = previous ? numMatches - 1 : 0;\n                                this.updateMatch(true);\n                                return true;\n                            }\n                            this.advanceOffsetPage(previous);\n                            if (offset.wrapped) {\n                                offset.matchIdx = null;\n                                if (this.pagesToSearch < 0) {\n                                    this.updateMatch(false);\n                                    return true;\n                                }\n                            }\n                            return false;\n                        }\n                    }, {\n                        key: 'updateMatchPosition',\n                        value: function updateMatchPosition(pageIndex, matchIndex, elements, beginIdx) {\n                            if (this.selected.matchIdx === matchIndex && this.selected.pageIdx === pageIndex) {\n                                var spot = {\n                                    top: FIND_SCROLL_OFFSET_TOP,\n                                    left: FIND_SCROLL_OFFSET_LEFT\n                                };\n                                (0, _ui_utils.scrollIntoView)(elements[beginIdx], spot, true);\n                            }\n                        }\n                    }, {\n                        key: 'nextPageMatch',\n                        value: function nextPageMatch() {\n                            if (this.resumePageIdx !== null) {\n                                console.error('There can only be one pending page.');\n                            }\n                            var matches = null;\n                            do {\n                                var pageIdx = this.offset.pageIdx;\n                                matches = this.pageMatches[pageIdx];\n                                if (!matches) {\n                                    this.resumePageIdx = pageIdx;\n                                    break;\n                                }\n                            } while (!this.matchesReady(matches));\n                        }\n                    }, {\n                        key: 'advanceOffsetPage',\n                        value: function advanceOffsetPage(previous) {\n                            var offset = this.offset;\n                            var numPages = this.extractTextPromises.length;\n                            offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1;\n                            offset.matchIdx = null;\n                            this.pagesToSearch--;\n                            if (offset.pageIdx >= numPages || offset.pageIdx < 0) {\n                                offset.pageIdx = previous ? numPages - 1 : 0;\n                                offset.wrapped = true;\n                            }\n                        }\n                    }, {\n                        key: 'updateMatch',\n                        value: function updateMatch() {\n                            var found = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n                            var state = FindState.NOT_FOUND;\n                            var wrapped = this.offset.wrapped;\n                            this.offset.wrapped = false;\n                            if (found) {\n                                var previousPage = this.selected.pageIdx;\n                                this.selected.pageIdx = this.offset.pageIdx;\n                                this.selected.matchIdx = this.offset.matchIdx;\n                                state = wrapped ? FindState.WRAPPED : FindState.FOUND;\n                                if (previousPage !== -1 && previousPage !== this.selected.pageIdx) {\n                                    this.updatePage(previousPage);\n                                }\n                            }\n                            this.updateUIState(state, this.state.findPrevious);\n                            if (this.selected.pageIdx !== -1) {\n                                this.updatePage(this.selected.pageIdx);\n                            }\n                        }\n                    }, {\n                        key: 'updateUIResultsCount',\n                        value: function updateUIResultsCount() {\n                            if (this.onUpdateResultsCount) {\n                                this.onUpdateResultsCount(this.matchCount);\n                            }\n                        }\n                    }, {\n                        key: 'updateUIState',\n                        value: function updateUIState(state, previous) {\n                            if (this.onUpdateState) {\n                                this.onUpdateState(state, previous, this.matchCount);\n                            }\n                        }\n                    }]);\n\n                    return PDFFindController;\n                }();\n\n                exports.FindState = FindState;\n                exports.PDFFindController = PDFFindController;\n\n                /***/\n            }),\n        /* 8 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.GenericCom = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _app = __webpack_require__(4);\n\n                var _preferences = __webpack_require__(28);\n\n                var _download_manager = __webpack_require__(12);\n\n                var _genericl10n = __webpack_require__(13);\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n                function _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n                ;\n                var GenericCom = {};\n\n                var GenericPreferences = function (_BasePreferences) {\n                    _inherits(GenericPreferences, _BasePreferences);\n\n                    function GenericPreferences() {\n                        _classCallCheck(this, GenericPreferences);\n\n                        return _possibleConstructorReturn(this, (GenericPreferences.__proto__ || Object.getPrototypeOf(GenericPreferences)).apply(this, arguments));\n                    }\n\n                    _createClass(GenericPreferences, [{\n                        key: '_writeToStorage',\n                        value: function _writeToStorage(prefObj) {\n                            return new Promise(function (resolve) {\n                                localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));\n                                resolve();\n                            });\n                        }\n                    }, {\n                        key: '_readFromStorage',\n                        value: function _readFromStorage(prefObj) {\n                            return new Promise(function (resolve) {\n                                var readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences'));\n                                resolve(readPrefs);\n                            });\n                        }\n                    }]);\n\n                    return GenericPreferences;\n                }(_preferences.BasePreferences);\n\n                var GenericExternalServices = Object.create(_app.DefaultExternalServices);\n                GenericExternalServices.createDownloadManager = function () {\n                    return new _download_manager.DownloadManager();\n                };\n                GenericExternalServices.createPreferences = function () {\n                    return new GenericPreferences();\n                };\n                GenericExternalServices.createL10n = function () {\n                    return new _genericl10n.GenericL10n(_pdfjsLib.PDFJS.locale);\n                };\n                _app.PDFViewerApplication.externalServices = GenericExternalServices;\n                exports.GenericCom = GenericCom;\n\n                /***/\n            }),\n        /* 9 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFPrintService = undefined;\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _app = __webpack_require__(4);\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                var activeService = null;\n                var overlayManager = null;\n                function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size) {\n                    var scratchCanvas = activeService.scratchCanvas;\n                    var PRINT_RESOLUTION = 150;\n                    var PRINT_UNITS = PRINT_RESOLUTION / 72.0;\n                    scratchCanvas.width = Math.floor(size.width * PRINT_UNITS);\n                    scratchCanvas.height = Math.floor(size.height * PRINT_UNITS);\n                    var width = Math.floor(size.width * _ui_utils.CSS_UNITS) + 'px';\n                    var height = Math.floor(size.height * _ui_utils.CSS_UNITS) + 'px';\n                    var ctx = scratchCanvas.getContext('2d');\n                    ctx.save();\n                    ctx.fillStyle = 'rgb(255, 255, 255)';\n                    ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height);\n                    ctx.restore();\n                    return pdfDocument.getPage(pageNumber).then(function (pdfPage) {\n                        var renderContext = {\n                            canvasContext: ctx,\n                            transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0],\n                            viewport: pdfPage.getViewport(1, size.rotation),\n                            intent: 'print'\n                        };\n                        return pdfPage.render(renderContext).promise;\n                    }).then(function () {\n                        return {\n                            width: width,\n                            height: height\n                        };\n                    });\n                }\n                function PDFPrintService(pdfDocument, pagesOverview, printContainer, l10n) {\n                    this.pdfDocument = pdfDocument;\n                    this.pagesOverview = pagesOverview;\n                    this.printContainer = printContainer;\n                    this.l10n = l10n || _ui_utils.NullL10n;\n                    this.currentPage = -1;\n                    this.scratchCanvas = document.createElement('canvas');\n                }\n                PDFPrintService.prototype = {\n                    layout: function layout() {\n                        this.throwIfInactive();\n                        var body = document.querySelector('body');\n                        body.setAttribute('data-pdfjsprinting', true);\n                        var hasEqualPageSizes = this.pagesOverview.every(function (size) {\n                            return size.width === this.pagesOverview[0].width && size.height === this.pagesOverview[0].height;\n                        }, this);\n                        if (!hasEqualPageSizes) {\n                            console.warn('Not all pages have the same size. The printed ' + 'result may be incorrect!');\n                        }\n                        this.pageStyleSheet = document.createElement('style');\n                        var pageSize = this.pagesOverview[0];\n                        this.pageStyleSheet.textContent = '@supports ((size:A4) and (size:1pt 1pt)) {' + '@page { size: ' + pageSize.width + 'pt ' + pageSize.height + 'pt;}' + '}';\n                        body.appendChild(this.pageStyleSheet);\n                    },\n                    destroy: function destroy() {\n                        if (activeService !== this) {\n                            return;\n                        }\n                        this.printContainer.textContent = '';\n                        if (this.pageStyleSheet && this.pageStyleSheet.parentNode) {\n                            this.pageStyleSheet.parentNode.removeChild(this.pageStyleSheet);\n                            this.pageStyleSheet = null;\n                        }\n                        this.scratchCanvas.width = this.scratchCanvas.height = 0;\n                        this.scratchCanvas = null;\n                        activeService = null;\n                        ensureOverlay().then(function () {\n                            if (overlayManager.active !== 'printServiceOverlay') {\n                                return;\n                            }\n                            overlayManager.close('printServiceOverlay');\n                        });\n                    },\n                    renderPages: function renderPages() {\n                        var _this = this;\n\n                        var pageCount = this.pagesOverview.length;\n                        var renderNextPage = function renderNextPage(resolve, reject) {\n                            _this.throwIfInactive();\n                            if (++_this.currentPage >= pageCount) {\n                                renderProgress(pageCount, pageCount, _this.l10n);\n                                resolve();\n                                return;\n                            }\n                            var index = _this.currentPage;\n                            renderProgress(index, pageCount, _this.l10n);\n                            renderPage(_this, _this.pdfDocument, index + 1, _this.pagesOverview[index]).then(_this.useRenderedPage.bind(_this)).then(function () {\n                                renderNextPage(resolve, reject);\n                            }, reject);\n                        };\n                        return new Promise(renderNextPage);\n                    },\n                    useRenderedPage: function useRenderedPage(printItem) {\n                        this.throwIfInactive();\n                        var img = document.createElement('img');\n                        img.style.width = printItem.width;\n                        img.style.height = printItem.height;\n                        var scratchCanvas = this.scratchCanvas;\n                        if ('toBlob' in scratchCanvas && !_pdfjsLib.PDFJS.disableCreateObjectURL) {\n                            scratchCanvas.toBlob(function (blob) {\n                                img.src = URL.createObjectURL(blob);\n                            });\n                        } else {\n                            img.src = scratchCanvas.toDataURL();\n                        }\n                        var wrapper = document.createElement('div');\n                        wrapper.appendChild(img);\n                        this.printContainer.appendChild(wrapper);\n                        return new Promise(function (resolve, reject) {\n                            img.onload = resolve;\n                            img.onerror = reject;\n                        });\n                    },\n                    performPrint: function performPrint() {\n                        var _this2 = this;\n\n                        this.throwIfInactive();\n                        return new Promise(function (resolve) {\n                            setTimeout(function () {\n                                if (!_this2.active) {\n                                    resolve();\n                                    return;\n                                }\n                                print.call(window);\n                                setTimeout(resolve, 20);\n                            }, 0);\n                        });\n                    },\n\n                    get active() {\n                        return this === activeService;\n                    },\n                    throwIfInactive: function throwIfInactive() {\n                        if (!this.active) {\n                            throw new Error('This print request was cancelled or completed.');\n                        }\n                    }\n                };\n                var print = window.print;\n                window.print = function print() {\n                    if (activeService) {\n                        console.warn('Ignored window.print() because of a pending print job.');\n                        return;\n                    }\n                    ensureOverlay().then(function () {\n                        if (activeService) {\n                            overlayManager.open('printServiceOverlay');\n                        }\n                    });\n                    try {\n                        dispatchEvent('beforeprint');\n                    } finally {\n                        if (!activeService) {\n                            console.error('Expected print service to be initialized.');\n                            ensureOverlay().then(function () {\n                                if (overlayManager.active === 'printServiceOverlay') {\n                                    overlayManager.close('printServiceOverlay');\n                                }\n                            });\n                            return;\n                        }\n                        var activeServiceOnEntry = activeService;\n                        activeService.renderPages().then(function () {\n                            return activeServiceOnEntry.performPrint();\n                        }).catch(function () { }).then(function () {\n                            if (activeServiceOnEntry.active) {\n                                abort();\n                            }\n                        });\n                    }\n                };\n                function dispatchEvent(eventType) {\n                    var event = document.createEvent('CustomEvent');\n                    event.initCustomEvent(eventType, false, false, 'custom');\n                    window.dispatchEvent(event);\n                }\n                function abort() {\n                    if (activeService) {\n                        activeService.destroy();\n                        dispatchEvent('afterprint');\n                    }\n                }\n                function renderProgress(index, total, l10n) {\n                    var progressContainer = document.getElementById('printServiceOverlay');\n                    var progress = Math.round(100 * index / total);\n                    var progressBar = progressContainer.querySelector('progress');\n                    var progressPerc = progressContainer.querySelector('.relative-progress');\n                    progressBar.value = progress;\n                    l10n.get('print_progress_percent', { progress: progress }, progress + '%').then(function (msg) {\n                        progressPerc.textContent = msg;\n                    });\n                }\n                var hasAttachEvent = !!document.attachEvent;\n                window.addEventListener('keydown', function (event) {\n                    if (event.keyCode === 80 && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {\n                        window.print();\n                        if (hasAttachEvent) {\n                            return;\n                        }\n                        event.preventDefault();\n                        if (event.stopImmediatePropagation) {\n                            event.stopImmediatePropagation();\n                        } else {\n                            event.stopPropagation();\n                        }\n                        return;\n                    }\n                }, true);\n                if (hasAttachEvent) {\n                    document.attachEvent('onkeydown', function (event) {\n                        event = event || window.event;\n                        if (event.keyCode === 80 && event.ctrlKey) {\n                            event.keyCode = 0;\n                            return false;\n                        }\n                    });\n                }\n                if ('onbeforeprint' in window) {\n                    var stopPropagationIfNeeded = function stopPropagationIfNeeded(event) {\n                        if (event.detail !== 'custom' && event.stopImmediatePropagation) {\n                            event.stopImmediatePropagation();\n                        }\n                    };\n                    window.addEventListener('beforeprint', stopPropagationIfNeeded);\n                    window.addEventListener('afterprint', stopPropagationIfNeeded);\n                }\n                var overlayPromise;\n                function ensureOverlay() {\n                    if (!overlayPromise) {\n                        overlayManager = _app.PDFViewerApplication.overlayManager;\n                        if (!overlayManager) {\n                            throw new Error('The overlay manager has not yet been initialized.');\n                        }\n                        overlayPromise = overlayManager.register('printServiceOverlay', document.getElementById('printServiceOverlay'), abort, true);\n                        document.getElementById('printCancel').onclick = abort;\n                    }\n                    return overlayPromise;\n                }\n                _app.PDFPrintServiceFactory.instance = {\n                    supportsPrinting: true,\n                    createPrintService: function createPrintService(pdfDocument, pagesOverview, printContainer, l10n) {\n                        if (activeService) {\n                            throw new Error('The print service is created and active.');\n                        }\n                        activeService = new PDFPrintService(pdfDocument, pagesOverview, printContainer, l10n);\n                        return activeService;\n                    }\n                };\n                exports.PDFPrintService = PDFPrintService;\n\n                /***/\n            }),\n        /* 10 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                document.webL10n = function (window, document, undefined) {\n                    var gL10nData = {};\n                    var gTextData = '';\n                    var gTextProp = 'textContent';\n                    var gLanguage = '';\n                    var gMacros = {};\n                    var gReadyState = 'loading';\n                    var gAsyncResourceLoading = true;\n                    function getL10nResourceLinks() {\n                        return document.querySelectorAll('link[type=\"application/l10n\"]');\n                    }\n                    function getL10nDictionary() {\n                        var script = document.querySelector('script[type=\"application/l10n\"]');\n                        return script ? JSON.parse(script.innerHTML) : null;\n                    }\n                    function getTranslatableChildren(element) {\n                        return element ? element.querySelectorAll('*[data-l10n-id]') : [];\n                    }\n                    function getL10nAttributes(element) {\n                        if (!element) return {};\n                        var l10nId = element.getAttribute('data-l10n-id');\n                        var l10nArgs = element.getAttribute('data-l10n-args');\n                        var args = {};\n                        if (l10nArgs) {\n                            try {\n                                args = JSON.parse(l10nArgs);\n                            } catch (e) {\n                                console.warn('could not parse arguments for #' + l10nId);\n                            }\n                        }\n                        return {\n                            id: l10nId,\n                            args: args\n                        };\n                    }\n                    function fireL10nReadyEvent(lang) {\n                        var evtObject = document.createEvent('Event');\n                        evtObject.initEvent('localized', true, false);\n                        evtObject.language = lang;\n                        document.dispatchEvent(evtObject);\n                    }\n                    function xhrLoadText(url, onSuccess, onFailure) {\n                        onSuccess = onSuccess || function _onSuccess(data) { };\n                        onFailure = onFailure || function _onFailure() { };\n                        var xhr = new XMLHttpRequest();\n                        xhr.open('GET', url, gAsyncResourceLoading);\n                        if (xhr.overrideMimeType) {\n                            xhr.overrideMimeType('text/plain; charset=utf-8');\n                        }\n                        xhr.onreadystatechange = function () {\n                            if (xhr.readyState == 4) {\n                                if (xhr.status == 200 || xhr.status === 0) {\n                                    onSuccess(xhr.responseText);\n                                } else {\n                                    onFailure();\n                                }\n                            }\n                        };\n                        xhr.onerror = onFailure;\n                        xhr.ontimeout = onFailure;\n                        try {\n                            xhr.send(null);\n                        } catch (e) {\n                            onFailure();\n                        }\n                    }\n                    function parseResource(href, lang, successCallback, failureCallback) {\n                        var baseURL = href.replace(/[^\\/]*$/, '') || './';\n                        function evalString(text) {\n                            if (text.lastIndexOf('\\\\') < 0) return text;\n                            return text.replace(/\\\\\\\\/g, '\\\\').replace(/\\\\n/g, '\\n').replace(/\\\\r/g, '\\r').replace(/\\\\t/g, '\\t').replace(/\\\\b/g, '\\b').replace(/\\\\f/g, '\\f').replace(/\\\\{/g, '{').replace(/\\\\}/g, '}').replace(/\\\\\"/g, '\"').replace(/\\\\'/g, \"'\");\n                        }\n                        function parseProperties(text, parsedPropertiesCallback) {\n                            var dictionary = {};\n                            var reBlank = /^\\s*|\\s*$/;\n                            var reComment = /^\\s*#|^\\s*$/;\n                            var reSection = /^\\s*\\[(.*)\\]\\s*$/;\n                            var reImport = /^\\s*@import\\s+url\\((.*)\\)\\s*$/i;\n                            var reSplit = /^([^=\\s]*)\\s*=\\s*(.+)$/;\n                            function parseRawLines(rawText, extendedSyntax, parsedRawLinesCallback) {\n                                var entries = rawText.replace(reBlank, '').split(/[\\r\\n]+/);\n                                var currentLang = '*';\n                                var genericLang = lang.split('-', 1)[0];\n                                var skipLang = false;\n                                var match = '';\n                                function nextEntry() {\n                                    while (true) {\n                                        if (!entries.length) {\n                                            parsedRawLinesCallback();\n                                            return;\n                                        }\n                                        var line = entries.shift();\n                                        if (reComment.test(line)) continue;\n                                        if (extendedSyntax) {\n                                            match = reSection.exec(line);\n                                            if (match) {\n                                                currentLang = match[1].toLowerCase();\n                                                skipLang = currentLang !== '*' && currentLang !== lang && currentLang !== genericLang;\n                                                continue;\n                                            } else if (skipLang) {\n                                                continue;\n                                            }\n                                            match = reImport.exec(line);\n                                            if (match) {\n                                                loadImport(baseURL + match[1], nextEntry);\n                                                return;\n                                            }\n                                        }\n                                        var tmp = line.match(reSplit);\n                                        if (tmp && tmp.length == 3) {\n                                            dictionary[tmp[1]] = evalString(tmp[2]);\n                                        }\n                                    }\n                                }\n                                nextEntry();\n                            }\n                            function loadImport(url, callback) {\n                                xhrLoadText(url, function (content) {\n                                    parseRawLines(content, false, callback);\n                                }, function () {\n                                    console.warn(url + ' not found.');\n                                    callback();\n                                });\n                            }\n                            parseRawLines(text, true, function () {\n                                parsedPropertiesCallback(dictionary);\n                            });\n                        }\n                        xhrLoadText(href, function (response) {\n                            gTextData += response;\n                            parseProperties(response, function (data) {\n                                for (var key in data) {\n                                    var id,\n                                        prop,\n                                        index = key.lastIndexOf('.');\n                                    if (index > 0) {\n                                        id = key.substring(0, index);\n                                        prop = key.substr(index + 1);\n                                    } else {\n                                        id = key;\n                                        prop = gTextProp;\n                                    }\n                                    if (!gL10nData[id]) {\n                                        gL10nData[id] = {};\n                                    }\n                                    gL10nData[id][prop] = data[key];\n                                }\n                                if (successCallback) {\n                                    successCallback();\n                                }\n                            });\n                        }, failureCallback);\n                    }\n                    function loadLocale(lang, callback) {\n                        if (lang) {\n                            lang = lang.toLowerCase();\n                        }\n                        callback = callback || function _callback() { };\n                        clear();\n                        gLanguage = lang;\n                        var langLinks = getL10nResourceLinks();\n                        var langCount = langLinks.length;\n                        if (langCount === 0) {\n                            var dict = getL10nDictionary();\n                            if (dict && dict.locales && dict.default_locale) {\n                                console.log('using the embedded JSON directory, early way out');\n                                gL10nData = dict.locales[lang];\n                                if (!gL10nData) {\n                                    var defaultLocale = dict.default_locale.toLowerCase();\n                                    for (var anyCaseLang in dict.locales) {\n                                        anyCaseLang = anyCaseLang.toLowerCase();\n                                        if (anyCaseLang === lang) {\n                                            gL10nData = dict.locales[lang];\n                                            break;\n                                        } else if (anyCaseLang === defaultLocale) {\n                                            gL10nData = dict.locales[defaultLocale];\n                                        }\n                                    }\n                                }\n                                callback();\n                            } else {\n                                console.log('no resource to load, early way out');\n                            }\n                            fireL10nReadyEvent(lang);\n                            gReadyState = 'complete';\n                            return;\n                        }\n                        var onResourceLoaded = null;\n                        var gResourceCount = 0;\n                        onResourceLoaded = function onResourceLoaded() {\n                            gResourceCount++;\n                            if (gResourceCount >= langCount) {\n                                callback();\n                                fireL10nReadyEvent(lang);\n                                gReadyState = 'complete';\n                            }\n                        };\n                        function L10nResourceLink(link) {\n                            var href = link.href;\n                            this.load = function (lang, callback) {\n                                parseResource(href, lang, callback, function () {\n                                    console.warn(href + ' not found.');\n                                    console.warn('\"' + lang + '\" resource not found');\n                                    gLanguage = '';\n                                    callback();\n                                });\n                            };\n                        }\n                        for (var i = 0; i < langCount; i++) {\n                            var resource = new L10nResourceLink(langLinks[i]);\n                            resource.load(lang, onResourceLoaded);\n                        }\n                    }\n                    function clear() {\n                        gL10nData = {};\n                        gTextData = '';\n                        gLanguage = '';\n                    }\n                    function getPluralRules(lang) {\n                        var locales2rules = {\n                            'af': 3,\n                            'ak': 4,\n                            'am': 4,\n                            'ar': 1,\n                            'asa': 3,\n                            'az': 0,\n                            'be': 11,\n                            'bem': 3,\n                            'bez': 3,\n                            'bg': 3,\n                            'bh': 4,\n                            'bm': 0,\n                            'bn': 3,\n                            'bo': 0,\n                            'br': 20,\n                            'brx': 3,\n                            'bs': 11,\n                            'ca': 3,\n                            'cgg': 3,\n                            'chr': 3,\n                            'cs': 12,\n                            'cy': 17,\n                            'da': 3,\n                            'de': 3,\n                            'dv': 3,\n                            'dz': 0,\n                            'ee': 3,\n                            'el': 3,\n                            'en': 3,\n                            'eo': 3,\n                            'es': 3,\n                            'et': 3,\n                            'eu': 3,\n                            'fa': 0,\n                            'ff': 5,\n                            'fi': 3,\n                            'fil': 4,\n                            'fo': 3,\n                            'fr': 5,\n                            'fur': 3,\n                            'fy': 3,\n                            'ga': 8,\n                            'gd': 24,\n                            'gl': 3,\n                            'gsw': 3,\n                            'gu': 3,\n                            'guw': 4,\n                            'gv': 23,\n                            'ha': 3,\n                            'haw': 3,\n                            'he': 2,\n                            'hi': 4,\n                            'hr': 11,\n                            'hu': 0,\n                            'id': 0,\n                            'ig': 0,\n                            'ii': 0,\n                            'is': 3,\n                            'it': 3,\n                            'iu': 7,\n                            'ja': 0,\n                            'jmc': 3,\n                            'jv': 0,\n                            'ka': 0,\n                            'kab': 5,\n                            'kaj': 3,\n                            'kcg': 3,\n                            'kde': 0,\n                            'kea': 0,\n                            'kk': 3,\n                            'kl': 3,\n                            'km': 0,\n                            'kn': 0,\n                            'ko': 0,\n                            'ksb': 3,\n                            'ksh': 21,\n                            'ku': 3,\n                            'kw': 7,\n                            'lag': 18,\n                            'lb': 3,\n                            'lg': 3,\n                            'ln': 4,\n                            'lo': 0,\n                            'lt': 10,\n                            'lv': 6,\n                            'mas': 3,\n                            'mg': 4,\n                            'mk': 16,\n                            'ml': 3,\n                            'mn': 3,\n                            'mo': 9,\n                            'mr': 3,\n                            'ms': 0,\n                            'mt': 15,\n                            'my': 0,\n                            'nah': 3,\n                            'naq': 7,\n                            'nb': 3,\n                            'nd': 3,\n                            'ne': 3,\n                            'nl': 3,\n                            'nn': 3,\n                            'no': 3,\n                            'nr': 3,\n                            'nso': 4,\n                            'ny': 3,\n                            'nyn': 3,\n                            'om': 3,\n                            'or': 3,\n                            'pa': 3,\n                            'pap': 3,\n                            'pl': 13,\n                            'ps': 3,\n                            'pt': 3,\n                            'rm': 3,\n                            'ro': 9,\n                            'rof': 3,\n                            'ru': 11,\n                            'rwk': 3,\n                            'sah': 0,\n                            'saq': 3,\n                            'se': 7,\n                            'seh': 3,\n                            'ses': 0,\n                            'sg': 0,\n                            'sh': 11,\n                            'shi': 19,\n                            'sk': 12,\n                            'sl': 14,\n                            'sma': 7,\n                            'smi': 7,\n                            'smj': 7,\n                            'smn': 7,\n                            'sms': 7,\n                            'sn': 3,\n                            'so': 3,\n                            'sq': 3,\n                            'sr': 11,\n                            'ss': 3,\n                            'ssy': 3,\n                            'st': 3,\n                            'sv': 3,\n                            'sw': 3,\n                            'syr': 3,\n                            'ta': 3,\n                            'te': 3,\n                            'teo': 3,\n                            'th': 0,\n                            'ti': 4,\n                            'tig': 3,\n                            'tk': 3,\n                            'tl': 4,\n                            'tn': 3,\n                            'to': 0,\n                            'tr': 0,\n                            'ts': 3,\n                            'tzm': 22,\n                            'uk': 11,\n                            'ur': 3,\n                            've': 3,\n                            'vi': 0,\n                            'vun': 3,\n                            'wa': 4,\n                            'wae': 3,\n                            'wo': 0,\n                            'xh': 3,\n                            'xog': 3,\n                            'yo': 0,\n                            'zh': 0,\n                            'zu': 3\n                        };\n                        function isIn(n, list) {\n                            return list.indexOf(n) !== -1;\n                        }\n                        function isBetween(n, start, end) {\n                            return start <= n && n <= end;\n                        }\n                        var pluralRules = {\n                            '0': function _(n) {\n                                return 'other';\n                            },\n                            '1': function _(n) {\n                                if (isBetween(n % 100, 3, 10)) return 'few';\n                                if (n === 0) return 'zero';\n                                if (isBetween(n % 100, 11, 99)) return 'many';\n                                if (n == 2) return 'two';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '2': function _(n) {\n                                if (n !== 0 && n % 10 === 0) return 'many';\n                                if (n == 2) return 'two';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '3': function _(n) {\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '4': function _(n) {\n                                if (isBetween(n, 0, 1)) return 'one';\n                                return 'other';\n                            },\n                            '5': function _(n) {\n                                if (isBetween(n, 0, 2) && n != 2) return 'one';\n                                return 'other';\n                            },\n                            '6': function _(n) {\n                                if (n === 0) return 'zero';\n                                if (n % 10 == 1 && n % 100 != 11) return 'one';\n                                return 'other';\n                            },\n                            '7': function _(n) {\n                                if (n == 2) return 'two';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '8': function _(n) {\n                                if (isBetween(n, 3, 6)) return 'few';\n                                if (isBetween(n, 7, 10)) return 'many';\n                                if (n == 2) return 'two';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '9': function _(n) {\n                                if (n === 0 || n != 1 && isBetween(n % 100, 1, 19)) return 'few';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '10': function _(n) {\n                                if (isBetween(n % 10, 2, 9) && !isBetween(n % 100, 11, 19)) return 'few';\n                                if (n % 10 == 1 && !isBetween(n % 100, 11, 19)) return 'one';\n                                return 'other';\n                            },\n                            '11': function _(n) {\n                                if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few';\n                                if (n % 10 === 0 || isBetween(n % 10, 5, 9) || isBetween(n % 100, 11, 14)) return 'many';\n                                if (n % 10 == 1 && n % 100 != 11) return 'one';\n                                return 'other';\n                            },\n                            '12': function _(n) {\n                                if (isBetween(n, 2, 4)) return 'few';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '13': function _(n) {\n                                if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few';\n                                if (n != 1 && isBetween(n % 10, 0, 1) || isBetween(n % 10, 5, 9) || isBetween(n % 100, 12, 14)) return 'many';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '14': function _(n) {\n                                if (isBetween(n % 100, 3, 4)) return 'few';\n                                if (n % 100 == 2) return 'two';\n                                if (n % 100 == 1) return 'one';\n                                return 'other';\n                            },\n                            '15': function _(n) {\n                                if (n === 0 || isBetween(n % 100, 2, 10)) return 'few';\n                                if (isBetween(n % 100, 11, 19)) return 'many';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '16': function _(n) {\n                                if (n % 10 == 1 && n != 11) return 'one';\n                                return 'other';\n                            },\n                            '17': function _(n) {\n                                if (n == 3) return 'few';\n                                if (n === 0) return 'zero';\n                                if (n == 6) return 'many';\n                                if (n == 2) return 'two';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '18': function _(n) {\n                                if (n === 0) return 'zero';\n                                if (isBetween(n, 0, 2) && n !== 0 && n != 2) return 'one';\n                                return 'other';\n                            },\n                            '19': function _(n) {\n                                if (isBetween(n, 2, 10)) return 'few';\n                                if (isBetween(n, 0, 1)) return 'one';\n                                return 'other';\n                            },\n                            '20': function _(n) {\n                                if ((isBetween(n % 10, 3, 4) || n % 10 == 9) && !(isBetween(n % 100, 10, 19) || isBetween(n % 100, 70, 79) || isBetween(n % 100, 90, 99))) return 'few';\n                                if (n % 1000000 === 0 && n !== 0) return 'many';\n                                if (n % 10 == 2 && !isIn(n % 100, [12, 72, 92])) return 'two';\n                                if (n % 10 == 1 && !isIn(n % 100, [11, 71, 91])) return 'one';\n                                return 'other';\n                            },\n                            '21': function _(n) {\n                                if (n === 0) return 'zero';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '22': function _(n) {\n                                if (isBetween(n, 0, 1) || isBetween(n, 11, 99)) return 'one';\n                                return 'other';\n                            },\n                            '23': function _(n) {\n                                if (isBetween(n % 10, 1, 2) || n % 20 === 0) return 'one';\n                                return 'other';\n                            },\n                            '24': function _(n) {\n                                if (isBetween(n, 3, 10) || isBetween(n, 13, 19)) return 'few';\n                                if (isIn(n, [2, 12])) return 'two';\n                                if (isIn(n, [1, 11])) return 'one';\n                                return 'other';\n                            }\n                        };\n                        var index = locales2rules[lang.replace(/-.*$/, '')];\n                        if (!(index in pluralRules)) {\n                            console.warn('plural form unknown for [' + lang + ']');\n                            return function () {\n                                return 'other';\n                            };\n                        }\n                        return pluralRules[index];\n                    }\n                    gMacros.plural = function (str, param, key, prop) {\n                        var n = parseFloat(param);\n                        if (isNaN(n)) return str;\n                        if (prop != gTextProp) return str;\n                        if (!gMacros._pluralRules) {\n                            gMacros._pluralRules = getPluralRules(gLanguage);\n                        }\n                        var index = '[' + gMacros._pluralRules(n) + ']';\n                        if (n === 0 && key + '[zero]' in gL10nData) {\n                            str = gL10nData[key + '[zero]'][prop];\n                        } else if (n == 1 && key + '[one]' in gL10nData) {\n                            str = gL10nData[key + '[one]'][prop];\n                        } else if (n == 2 && key + '[two]' in gL10nData) {\n                            str = gL10nData[key + '[two]'][prop];\n                        } else if (key + index in gL10nData) {\n                            str = gL10nData[key + index][prop];\n                        } else if (key + '[other]' in gL10nData) {\n                            str = gL10nData[key + '[other]'][prop];\n                        }\n                        return str;\n                    };\n                    function getL10nData(key, args, fallback) {\n                        var data = gL10nData[key];\n                        if (!data) {\n                            console.warn('#' + key + ' is undefined.');\n                            if (!fallback) {\n                                return null;\n                            }\n                            data = fallback;\n                        }\n                        var rv = {};\n                        for (var prop in data) {\n                            var str = data[prop];\n                            str = substIndexes(str, args, key, prop);\n                            str = substArguments(str, args, key);\n                            rv[prop] = str;\n                        }\n                        return rv;\n                    }\n                    function substIndexes(str, args, key, prop) {\n                        var reIndex = /\\{\\[\\s*([a-zA-Z]+)\\(([a-zA-Z]+)\\)\\s*\\]\\}/;\n                        var reMatch = reIndex.exec(str);\n                        if (!reMatch || !reMatch.length) return str;\n                        var macroName = reMatch[1];\n                        var paramName = reMatch[2];\n                        var param;\n                        if (args && paramName in args) {\n                            param = args[paramName];\n                        } else if (paramName in gL10nData) {\n                            param = gL10nData[paramName];\n                        }\n                        if (macroName in gMacros) {\n                            var macro = gMacros[macroName];\n                            str = macro(str, param, key, prop);\n                        }\n                        return str;\n                    }\n                    function substArguments(str, args, key) {\n                        var reArgs = /\\{\\{\\s*(.+?)\\s*\\}\\}/g;\n                        return str.replace(reArgs, function (matched_text, arg) {\n                            if (args && arg in args) {\n                                return args[arg];\n                            }\n                            if (arg in gL10nData) {\n                                return gL10nData[arg];\n                            }\n                            console.log('argument {{' + arg + '}} for #' + key + ' is undefined.');\n                            return matched_text;\n                        });\n                    }\n                    function translateElement(element) {\n                        var l10n = getL10nAttributes(element);\n                        if (!l10n.id) return;\n                        var data = getL10nData(l10n.id, l10n.args);\n                        if (!data) {\n                            console.warn('#' + l10n.id + ' is undefined.');\n                            return;\n                        }\n                        if (data[gTextProp]) {\n                            if (getChildElementCount(element) === 0) {\n                                element[gTextProp] = data[gTextProp];\n                            } else {\n                                var children = element.childNodes;\n                                var found = false;\n                                for (var i = 0, l = children.length; i < l; i++) {\n                                    if (children[i].nodeType === 3 && /\\S/.test(children[i].nodeValue)) {\n                                        if (found) {\n                                            children[i].nodeValue = '';\n                                        } else {\n                                            children[i].nodeValue = data[gTextProp];\n                                            found = true;\n                                        }\n                                    }\n                                }\n                                if (!found) {\n                                    var textNode = document.createTextNode(data[gTextProp]);\n                                    element.insertBefore(textNode, element.firstChild);\n                                }\n                            }\n                            delete data[gTextProp];\n                        }\n                        for (var k in data) {\n                            element[k] = data[k];\n                        }\n                    }\n                    function getChildElementCount(element) {\n                        if (element.children) {\n                            return element.children.length;\n                        }\n                        if (typeof element.childElementCount !== 'undefined') {\n                            return element.childElementCount;\n                        }\n                        var count = 0;\n                        for (var i = 0; i < element.childNodes.length; i++) {\n                            count += element.nodeType === 1 ? 1 : 0;\n                        }\n                        return count;\n                    }\n                    function translateFragment(element) {\n                        element = element || document.documentElement;\n                        var children = getTranslatableChildren(element);\n                        var elementCount = children.length;\n                        for (var i = 0; i < elementCount; i++) {\n                            translateElement(children[i]);\n                        }\n                        translateElement(element);\n                    }\n                    return {\n                        get: function get(key, args, fallbackString) {\n                            var index = key.lastIndexOf('.');\n                            var prop = gTextProp;\n                            if (index > 0) {\n                                prop = key.substr(index + 1);\n                                key = key.substring(0, index);\n                            }\n                            var fallback;\n                            if (fallbackString) {\n                                fallback = {};\n                                fallback[prop] = fallbackString;\n                            }\n                            var data = getL10nData(key, args, fallback);\n                            if (data && prop in data) {\n                                return data[prop];\n                            }\n                            return '{{' + key + '}}';\n                        },\n                        getData: function getData() {\n                            return gL10nData;\n                        },\n                        getText: function getText() {\n                            return gTextData;\n                        },\n                        getLanguage: function getLanguage() {\n                            return gLanguage;\n                        },\n                        setLanguage: function setLanguage(lang, callback) {\n                            loadLocale(lang, function () {\n                                if (callback) callback();\n                            });\n                        },\n                        getDirection: function getDirection() {\n                            var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];\n                            var shortCode = gLanguage.split('-', 1)[0];\n                            return rtlList.indexOf(shortCode) >= 0 ? 'rtl' : 'ltr';\n                        },\n                        translate: translateFragment,\n                        getReadyState: function getReadyState() {\n                            return gReadyState;\n                        },\n                        ready: function ready(callback) {\n                            if (!callback) {\n                                return;\n                            } else if (gReadyState == 'complete' || gReadyState == 'interactive') {\n                                window.setTimeout(function () {\n                                    callback();\n                                });\n                            } else if (document.addEventListener) {\n                                document.addEventListener('localized', function once() {\n                                    document.removeEventListener('localized', once);\n                                    callback();\n                                });\n                            }\n                        }\n                    };\n                }(window, document);\n\n                /***/\n            }),\n        /* 11 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.DefaultAnnotationLayerFactory = exports.AnnotationLayerBuilder = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdf_link_service = __webpack_require__(5);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var AnnotationLayerBuilder = function () {\n                    function AnnotationLayerBuilder(_ref) {\n                        var pageDiv = _ref.pageDiv,\n                            pdfPage = _ref.pdfPage,\n                            linkService = _ref.linkService,\n                            downloadManager = _ref.downloadManager,\n                            _ref$renderInteractiv = _ref.renderInteractiveForms,\n                            renderInteractiveForms = _ref$renderInteractiv === undefined ? false : _ref$renderInteractiv,\n                            _ref$l10n = _ref.l10n,\n                            l10n = _ref$l10n === undefined ? _ui_utils.NullL10n : _ref$l10n;\n\n                        _classCallCheck(this, AnnotationLayerBuilder);\n\n                        this.pageDiv = pageDiv;\n                        this.pdfPage = pdfPage;\n                        this.linkService = linkService;\n                        this.downloadManager = downloadManager;\n                        this.renderInteractiveForms = renderInteractiveForms;\n                        this.l10n = l10n;\n                        this.div = null;\n                    }\n\n                    _createClass(AnnotationLayerBuilder, [{\n                        key: 'render',\n                        value: function render(viewport) {\n                            var _this = this;\n\n                            var intent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'display';\n\n                            this.pdfPage.getAnnotations({ intent: intent }).then(function (annotations) {\n                                var parameters = {\n                                    viewport: viewport.clone({ dontFlip: true }),\n                                    div: _this.div,\n                                    annotations: annotations,\n                                    page: _this.pdfPage,\n                                    renderInteractiveForms: _this.renderInteractiveForms,\n                                    linkService: _this.linkService,\n                                    downloadManager: _this.downloadManager\n                                };\n                                if (_this.div) {\n                                    _pdfjsLib.AnnotationLayer.update(parameters);\n                                } else {\n                                    if (annotations.length === 0) {\n                                        return;\n                                    }\n                                    _this.div = document.createElement('div');\n                                    _this.div.className = 'annotationLayer';\n                                    _this.pageDiv.appendChild(_this.div);\n                                    parameters.div = _this.div;\n                                    _pdfjsLib.AnnotationLayer.render(parameters);\n                                    _this.l10n.translate(_this.div);\n                                }\n                            });\n                        }\n                    }, {\n                        key: 'hide',\n                        value: function hide() {\n                            if (!this.div) {\n                                return;\n                            }\n                            this.div.setAttribute('hidden', 'true');\n                        }\n                    }]);\n\n                    return AnnotationLayerBuilder;\n                }();\n\n                var DefaultAnnotationLayerFactory = function () {\n                    function DefaultAnnotationLayerFactory() {\n                        _classCallCheck(this, DefaultAnnotationLayerFactory);\n                    }\n\n                    _createClass(DefaultAnnotationLayerFactory, [{\n                        key: 'createAnnotationLayerBuilder',\n                        value: function createAnnotationLayerBuilder(pageDiv, pdfPage) {\n                            var renderInteractiveForms = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n                            var l10n = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _ui_utils.NullL10n;\n\n                            return new AnnotationLayerBuilder({\n                                pageDiv: pageDiv,\n                                pdfPage: pdfPage,\n                                renderInteractiveForms: renderInteractiveForms,\n                                linkService: new _pdf_link_service.SimpleLinkService(),\n                                l10n: l10n\n                            });\n                        }\n                    }]);\n\n                    return DefaultAnnotationLayerFactory;\n                }();\n\n                exports.AnnotationLayerBuilder = AnnotationLayerBuilder;\n                exports.DefaultAnnotationLayerFactory = DefaultAnnotationLayerFactory;\n\n                /***/\n            }),\n        /* 12 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.DownloadManager = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                ;\n                function _download(blobUrl, filename) {\n                    var a = document.createElement('a');\n                    if (a.click) {\n                        a.href = blobUrl;\n                        a.target = '_parent';\n                        if ('download' in a) {\n                            a.download = filename;\n                        }\n                        (document.body || document.documentElement).appendChild(a);\n                        a.click();\n                        a.parentNode.removeChild(a);\n                    } else {\n                        if (window.top === window && blobUrl.split('#')[0] === window.location.href.split('#')[0]) {\n                            var padCharacter = blobUrl.indexOf('?') === -1 ? '?' : '&';\n                            blobUrl = blobUrl.replace(/#|$/, padCharacter + '$&');\n                        }\n                        window.open(blobUrl, '_parent');\n                    }\n                }\n\n                var DownloadManager = function () {\n                    function DownloadManager() {\n                        _classCallCheck(this, DownloadManager);\n                    }\n\n                    _createClass(DownloadManager, [{\n                        key: 'downloadUrl',\n                        value: function downloadUrl(url, filename) {\n                            if (!(0, _pdfjsLib.createValidAbsoluteUrl)(url, 'http://example.com')) {\n                                return;\n                            }\n                            _download(url + '#pdfjs.action=download', filename);\n                        }\n                    }, {\n                        key: 'downloadData',\n                        value: function downloadData(data, filename, contentType) {\n                            if (navigator.msSaveBlob) {\n                                return navigator.msSaveBlob(new Blob([data], { type: contentType }), filename);\n                            }\n                            var blobUrl = (0, _pdfjsLib.createObjectURL)(data, contentType, _pdfjsLib.PDFJS.disableCreateObjectURL);\n                            _download(blobUrl, filename);\n                        }\n                    }, {\n                        key: 'download',\n                        value: function download(blob, url, filename) {\n                            if (navigator.msSaveBlob) {\n                                if (!navigator.msSaveBlob(blob, filename)) {\n                                    this.downloadUrl(url, filename);\n                                }\n                                return;\n                            }\n                            if (_pdfjsLib.PDFJS.disableCreateObjectURL) {\n                                this.downloadUrl(url, filename);\n                                return;\n                            }\n                            var blobUrl = URL.createObjectURL(blob);\n                            _download(blobUrl, filename);\n                        }\n                    }]);\n\n                    return DownloadManager;\n                }();\n\n                exports.DownloadManager = DownloadManager;\n\n                /***/\n            }),\n        /* 13 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.GenericL10n = undefined;\n\n                var _createClass = function () {\n                    function defineProperties(target, props) {\n                        for (var i = 0; i < props.length; i++) {\n                            var descriptor = props[i];\n                            descriptor.enumerable = descriptor.enumerable || false;\n                            descriptor.configurable = true;\n                            if (\"value\" in descriptor) descriptor.writable = true;\n                            Object.defineProperty(target, descriptor.key, descriptor);\n                        }\n                    }\n                    return function (Constructor, protoProps, staticProps) {\n                        if (protoProps) defineProperties(Constructor.prototype, protoProps);\n                        if (staticProps) defineProperties(Constructor, staticProps);\n                        return Constructor;\n                    };\n                }();\n\n                __webpack_require__(10);\n\n                function _classCallCheck(instance, Constructor) {\n                    if (!(instance instanceof Constructor)) {\n                        throw new TypeError(\"Cannot call a class as a function\");\n                    }\n                }\n\n                var webL10n = document.webL10n;\n\n                var GenericL10n = function () {\n                    function GenericL10n(lang) {\n                        _classCallCheck(this, GenericL10n);\n\n                        this._lang = lang;\n                        this._ready = new Promise(function (resolve, reject) {\n                            webL10n.setLanguage(lang, function () {\n                                resolve(webL10n);\n                            });\n                        });\n                    }\n\n                    _createClass(GenericL10n, [{\n                        key: 'getDirection',\n                        value: function getDirection() {\n                            return this._ready.then(function (l10n) {\n                                return l10n.getDirection();\n                            });\n                        }\n                    }, {\n                        key: 'get',\n                        value: function get(property, args, fallback) {\n                            return this._ready.then(function (l10n) {\n                                return l10n.get(property, args, fallback);\n                            });\n                        }\n                    }, {\n                        key: 'translate',\n                        value: function translate(element) {\n                            return this._ready.then(function (l10n) {\n                                return l10n.translate(element);\n                            });\n                        }\n                    }]);\n\n                    return GenericL10n;\n                }();\n\n                exports.GenericL10n = GenericL10n;\n\n                /***/\n            }),\n        /* 14 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                function GrabToPan(options) {\n                    this.element = options.element;\n                    this.document = options.element.ownerDocument;\n                    if (typeof options.ignoreTarget === 'function') {\n                        this.ignoreTarget = options.ignoreTarget;\n                    }\n                    this.onActiveChanged = options.onActiveChanged;\n                    this.activate = this.activate.bind(this);\n                    this.deactivate = this.deactivate.bind(this);\n                    this.toggle = this.toggle.bind(this);\n                    this._onmousedown = this._onmousedown.bind(this);\n                    this._onmousemove = this._onmousemove.bind(this);\n                    this._endPan = this._endPan.bind(this);\n                    var overlay = this.overlay = document.createElement('div');\n                    overlay.className = 'grab-to-pan-grabbing';\n                }\n                GrabToPan.prototype = {\n                    CSS_CLASS_GRAB: 'grab-to-pan-grab',\n                    activate: function GrabToPan_activate() {\n                        if (!this.active) {\n                            this.active = true;\n                            this.element.addEventListener('mousedown', this._onmousedown, true);\n                            this.element.classList.add(this.CSS_CLASS_GRAB);\n                            if (this.onActiveChanged) {\n                                this.onActiveChanged(true);\n                            }\n                        }\n                    },\n                    deactivate: function GrabToPan_deactivate() {\n                        if (this.active) {\n                            this.active = false;\n                            this.element.removeEventListener('mousedown', this._onmousedown, true);\n                            this._endPan();\n                            this.element.classList.remove(this.CSS_CLASS_GRAB);\n                            if (this.onActiveChanged) {\n                                this.onActiveChanged(false);\n                            }\n                        }\n                    },\n                    toggle: function GrabToPan_toggle() {\n                        if (this.active) {\n                            this.deactivate();\n                        } else {\n                            this.activate();\n                        }\n                    },\n                    ignoreTarget: function GrabToPan_ignoreTarget(node) {\n                        return node[matchesSelector]('a[href], a[href] *, input, textarea, button, button *, select, option');\n                    },\n                    _onmousedown: function GrabToPan__onmousedown(event) {\n                        if (event.button !== 0 || this.ignoreTarget(event.target)) {\n                            return;\n                        }\n                        if (event.originalTarget) {\n                            try {\n                                event.originalTarget.tagName;\n                            } catch (e) {\n                                return;\n                            }\n                        }\n                        this.scrollLeftStart = this.element.scrollLeft;\n                        this.scrollTopStart = this.element.scrollTop;\n                        this.clientXStart = event.clientX;\n                        this.clientYStart = event.clientY;\n                        this.document.addEventListener('mousemove', this._onmousemove, true);\n                        this.document.addEventListener('mouseup', this._endPan, true);\n                        this.element.addEventListener('scroll', this._endPan, true);\n                        event.preventDefault();\n                        event.stopPropagation();\n                        var focusedElement = document.activeElement;\n                        if (focusedElement && !focusedElement.contains(event.target)) {\n                            focusedElement.blur();\n                        }\n                    },\n                    _onmousemove: function GrabToPan__onmousemove(event) {\n                        this.element.removeEventListener('scroll', this._endPan, true);\n                        if (isLeftMouseReleased(event)) {\n                            this._endPan();\n                            return;\n                        }\n                        var xDiff = event.clientX - this.clientXStart;\n                        var yDiff = event.clientY - this.clientYStart;\n                        var scrollTop = this.scrollTopStart - yDiff;\n                        var scrollLeft = this.scrollLeftStart - xDiff;\n                        if (this.element.scrollTo) {\n                            this.element.scrollTo({\n                                top: scrollTop,\n                                left: scrollLeft,\n                                behavior: 'instant'\n                            });\n                        } else {\n                            this.element.scrollTop = scrollTop;\n                            this.element.scrollLeft = scrollLeft;\n                        }\n                        if (!this.overlay.parentNode) {\n                            document.body.appendChild(this.overlay);\n                        }\n                    },\n                    _endPan: function GrabToPan__endPan() {\n                        this.element.removeEventListener('scroll', this._endPan, true);\n                        this.document.removeEventListener('mousemove', this._onmousemove, true);\n                        this.document.removeEventListener('mouseup', this._endPan, true);\n                        this.overlay.remove();\n                    }\n                };\n                var matchesSelector;\n                ['webkitM', 'mozM', 'msM', 'oM', 'm'].some(function (prefix) {\n                    var name = prefix + 'atches';\n                    if (name in document.documentElement) {\n                        matchesSelector = name;\n                    }\n                    name += 'Selector';\n                    if (name in document.documentElement) {\n                        matchesSelector = name;\n                    }\n                    return matchesSelector;\n                });\n                var isNotIEorIsIE10plus = !document.documentMode || document.documentMode > 9;\n                var chrome = window.chrome;\n                var isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app);\n                var isSafari6plus = /Apple/.test(navigator.vendor) && /Version\\/([6-9]\\d*|[1-5]\\d+)/.test(navigator.userAgent);\n                function isLeftMouseReleased(event) {\n                    if ('buttons' in event && isNotIEorIsIE10plus) {\n                        return !(event.buttons & 1);\n                    }\n                    if (isChrome15OrOpera15plus || isSafari6plus) {\n                        return event.which === 0;\n                    }\n                }\n                exports.GrabToPan = GrabToPan;\n\n                /***/\n            }),\n        /* 15 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var OverlayManager = function () {\n                    function OverlayManager() {\n                        _classCallCheck(this, OverlayManager);\n\n                        this._overlays = {};\n                        this._active = null;\n                        this._keyDownBound = this._keyDown.bind(this);\n                    }\n\n                    _createClass(OverlayManager, [{\n                        key: 'register',\n                        value: function register(name, element) {\n                            var _this = this;\n\n                            var callerCloseMethod = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n                            var canForceClose = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n                            return new Promise(function (resolve) {\n                                var container = void 0;\n                                //console.log(\"name: \",name,\",element: \",element ,\",container: \",container);\n                                if (!name || !element || !(container = element.parentNode)) {\n                                    throw new Error('Not enough parameters.');\n                                } else if (_this._overlays[name]) {\n                                    throw new Error('The overlay is already registered.');\n                                }\n                                _this._overlays[name] = {\n                                    element: element,\n                                    container: container,\n                                    callerCloseMethod: callerCloseMethod,\n                                    canForceClose: canForceClose\n                                };\n                                resolve();\n                            });\n                        }\n                    }, {\n                        key: 'unregister',\n                        value: function unregister(name) {\n                            var _this2 = this;\n\n                            return new Promise(function (resolve) {\n                                if (!_this2._overlays[name]) {\n                                    throw new Error('The overlay does not exist.');\n                                } else if (_this2._active === name) {\n                                    throw new Error('The overlay cannot be removed while it is active.');\n                                }\n                                delete _this2._overlays[name];\n                                resolve();\n                            });\n                        }\n                    }, {\n                        key: 'open',\n                        value: function open(name) {\n                            var _this3 = this;\n\n                            return new Promise(function (resolve) {\n                                if (!_this3._overlays[name]) {\n                                    throw new Error('The overlay does not exist.');\n                                } else if (_this3._active) {\n                                    if (_this3._overlays[name].canForceClose) {\n                                        _this3._closeThroughCaller();\n                                    } else if (_this3._active === name) {\n                                        throw new Error('The overlay is already active.');\n                                    } else {\n                                        throw new Error('Another overlay is currently active.');\n                                    }\n                                }\n                                _this3._active = name;\n                                _this3._overlays[_this3._active].element.classList.remove('hidden');\n                                _this3._overlays[_this3._active].container.classList.remove('hidden');\n                                window.addEventListener('keydown', _this3._keyDownBound);\n                                resolve();\n                            });\n                        }\n                    }, {\n                        key: 'close',\n                        value: function close(name) {\n                            var _this4 = this;\n\n                            return new Promise(function (resolve) {\n                                if (!_this4._overlays[name]) {\n                                    throw new Error('The overlay does not exist.');\n                                } else if (!_this4._active) {\n                                    throw new Error('The overlay is currently not active.');\n                                } else if (_this4._active !== name) {\n                                    throw new Error('Another overlay is currently active.');\n                                }\n                                _this4._overlays[_this4._active].container.classList.add('hidden');\n                                _this4._overlays[_this4._active].element.classList.add('hidden');\n                                _this4._active = null;\n                                window.removeEventListener('keydown', _this4._keyDownBound);\n                                resolve();\n                            });\n                        }\n                    }, {\n                        key: '_keyDown',\n                        value: function _keyDown(evt) {\n                            if (this._active && evt.keyCode === 27) {\n                                this._closeThroughCaller();\n                                evt.preventDefault();\n                            }\n                        }\n                    }, {\n                        key: '_closeThroughCaller',\n                        value: function _closeThroughCaller() {\n                            if (this._overlays[this._active].callerCloseMethod) {\n                                this._overlays[this._active].callerCloseMethod();\n                            }\n                            if (this._active) {\n                                this.close(this._active);\n                            }\n                        }\n                    }, {\n                        key: 'active',\n                        get: function get() {\n                            return this._active;\n                        }\n                    }]);\n\n                    return OverlayManager;\n                }();\n\n                exports.OverlayManager = OverlayManager;\n\n                /***/\n            }),\n        /* 16 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PasswordPrompt = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var PasswordPrompt = function () {\n                    function PasswordPrompt(options, overlayManager) {\n                        var _this = this;\n\n                        var l10n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ui_utils.NullL10n;\n\n                        _classCallCheck(this, PasswordPrompt);\n\n                        this.overlayName = options.overlayName;\n                        this.container = options.container;\n                        this.label = options.label;\n                        this.input = options.input;\n                        this.submitButton = options.submitButton;\n                        this.cancelButton = options.cancelButton;\n                        this.overlayManager = overlayManager;\n                        this.l10n = l10n;\n                        this.updateCallback = null;\n                        this.reason = null;\n                        this.submitButton.addEventListener('click', this.verify.bind(this));\n                        this.cancelButton.addEventListener('click', this.close.bind(this));\n                        this.input.addEventListener('keydown', function (e) {\n                            if (e.keyCode === 13) {\n                                _this.verify();\n                            }\n                        });\n                        this.overlayManager.register(this.overlayName, this.container, this.close.bind(this), true);\n                    }\n\n                    _createClass(PasswordPrompt, [{\n                        key: 'open',\n                        value: function open() {\n                            var _this2 = this;\n\n                            this.overlayManager.open(this.overlayName).then(function () {\n                                _this2.input.focus();\n                                var promptString = void 0;\n                                if (_this2.reason === _pdfjsLib.PasswordResponses.INCORRECT_PASSWORD) {\n                                    promptString = _this2.l10n.get('password_invalid', null, 'Invalid password. Please try again.');\n                                } else {\n                                    promptString = _this2.l10n.get('password_label', null, 'Enter the password to open this PDF file.');\n                                }\n                                promptString.then(function (msg) {\n                                    _this2.label.textContent = msg;\n                                });\n                            });\n                        }\n                    }, {\n                        key: 'close',\n                        value: function close() {\n                            var _this3 = this;\n\n                            this.overlayManager.close(this.overlayName).then(function () {\n                                _this3.input.value = '';\n                            });\n                        }\n                    }, {\n                        key: 'verify',\n                        value: function verify() {\n                            var password = this.input.value;\n                            if (password && password.length > 0) {\n                                this.close();\n                                return this.updateCallback(password);\n                            }\n                        }\n                    }, {\n                        key: 'setUpdateCallback',\n                        value: function setUpdateCallback(updateCallback, reason) {\n                            this.updateCallback = updateCallback;\n                            this.reason = reason;\n                        }\n                    }]);\n\n                    return PasswordPrompt;\n                }();\n\n                exports.PasswordPrompt = PasswordPrompt;\n\n                /***/\n            }),\n        /* 17 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFAttachmentViewer = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var PDFAttachmentViewer = function () {\n                    function PDFAttachmentViewer(_ref) {\n                        var container = _ref.container,\n                            eventBus = _ref.eventBus,\n                            downloadManager = _ref.downloadManager;\n\n                        _classCallCheck(this, PDFAttachmentViewer);\n\n                        this.attachments = null;\n                        this.container = container;\n                        this.eventBus = eventBus;\n                        this.downloadManager = downloadManager;\n                        this._renderedCapability = (0, _pdfjsLib.createPromiseCapability)();\n                        this.eventBus.on('fileattachmentannotation', this._appendAttachment.bind(this));\n                    }\n\n                    _createClass(PDFAttachmentViewer, [{\n                        key: 'reset',\n                        value: function reset() {\n                            var keepRenderedCapability = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n                            this.attachments = null;\n                            this.container.textContent = '';\n                            if (!keepRenderedCapability) {\n                                this._renderedCapability = (0, _pdfjsLib.createPromiseCapability)();\n                            }\n                        }\n                    }, {\n                        key: '_dispatchEvent',\n                        value: function _dispatchEvent(attachmentsCount) {\n                            this.eventBus.dispatch('attachmentsloaded', {\n                                source: this,\n                                attachmentsCount: attachmentsCount\n                            });\n                            this._renderedCapability.resolve();\n                        }\n                    }, {\n                        key: '_bindPdfLink',\n                        value: function _bindPdfLink(button, content, filename) {\n                            if (_pdfjsLib.PDFJS.disableCreateObjectURL) {\n                                throw new Error('bindPdfLink: ' + 'Unsupported \"PDFJS.disableCreateObjectURL\" value.');\n                            }\n                            var blobUrl = void 0;\n                            button.onclick = function () {\n                                if (!blobUrl) {\n                                    blobUrl = (0, _pdfjsLib.createObjectURL)(content, 'application/pdf');\n                                }\n                                var viewerUrl = void 0;\n                                viewerUrl = '?file=' + encodeURIComponent(blobUrl + '#' + filename);\n                                window.open(viewerUrl);\n                                return false;\n                            };\n                        }\n                    }, {\n                        key: '_bindLink',\n                        value: function _bindLink(button, content, filename) {\n                            var _this = this;\n\n                            button.onclick = function () {\n                                _this.downloadManager.downloadData(content, filename, '');\n                                return false;\n                            };\n                        }\n                    }, {\n                        key: 'render',\n                        value: function render(_ref2) {\n                            var attachments = _ref2.attachments,\n                                _ref2$keepRenderedCap = _ref2.keepRenderedCapability,\n                                keepRenderedCapability = _ref2$keepRenderedCap === undefined ? false : _ref2$keepRenderedCap;\n\n                            var attachmentsCount = 0;\n                            if (this.attachments) {\n                                this.reset(keepRenderedCapability === true);\n                            }\n                            this.attachments = attachments || null;\n                            if (!attachments) {\n                                this._dispatchEvent(attachmentsCount);\n                                return;\n                            }\n                            var names = Object.keys(attachments).sort(function (a, b) {\n                                return a.toLowerCase().localeCompare(b.toLowerCase());\n                            });\n                            attachmentsCount = names.length;\n                            for (var i = 0; i < attachmentsCount; i++) {\n                                var item = attachments[names[i]];\n                                var filename = (0, _pdfjsLib.removeNullCharacters)((0, _pdfjsLib.getFilenameFromUrl)(item.filename));\n                                var div = document.createElement('div');\n                                div.className = 'attachmentsItem';\n                                var button = document.createElement('button');\n                                button.textContent = filename;\n                                if (/\\.pdf$/i.test(filename) && !_pdfjsLib.PDFJS.disableCreateObjectURL) {\n                                    this._bindPdfLink(button, item.content, filename);\n                                } else {\n                                    this._bindLink(button, item.content, filename);\n                                }\n                                div.appendChild(button);\n                                this.container.appendChild(div);\n                            }\n                            this._dispatchEvent(attachmentsCount);\n                        }\n                    }, {\n                        key: '_appendAttachment',\n                        value: function _appendAttachment(_ref3) {\n                            var _this2 = this;\n\n                            var id = _ref3.id,\n                                filename = _ref3.filename,\n                                content = _ref3.content;\n\n                            this._renderedCapability.promise.then(function () {\n                                var attachments = _this2.attachments;\n                                if (!attachments) {\n                                    attachments = Object.create(null);\n                                } else {\n                                    for (var name in attachments) {\n                                        if (id === name) {\n                                            return;\n                                        }\n                                    }\n                                }\n                                attachments[id] = {\n                                    filename: filename,\n                                    content: content\n                                };\n                                _this2.render({\n                                    attachments: attachments,\n                                    keepRenderedCapability: true\n                                });\n                            });\n                        }\n                    }]);\n\n                    return PDFAttachmentViewer;\n                }();\n\n                exports.PDFAttachmentViewer = PDFAttachmentViewer;\n\n                /***/\n            }),\n        /* 18 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFDocumentProperties = undefined;\n\n                var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var DEFAULT_FIELD_CONTENT = '-';\n\n                var PDFDocumentProperties = function () {\n                    function PDFDocumentProperties(_ref, overlayManager) {\n                        var overlayName = _ref.overlayName,\n                            fields = _ref.fields,\n                            container = _ref.container,\n                            closeButton = _ref.closeButton;\n                        var l10n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ui_utils.NullL10n;\n\n                        _classCallCheck(this, PDFDocumentProperties);\n\n                        this.overlayName = overlayName;\n                        this.fields = fields;\n                        this.container = container;\n                        this.overlayManager = overlayManager;\n                        this.l10n = l10n;\n                        this._reset();\n                        if (closeButton) {\n                            closeButton.addEventListener('click', this.close.bind(this));\n                        }\n                        this.overlayManager.register(this.overlayName, this.container, this.close.bind(this));\n                    }\n\n                    _createClass(PDFDocumentProperties, [{\n                        key: 'open',\n                        value: function open() {\n                            var _this = this;\n\n                            var freezeFieldData = function freezeFieldData(data) {\n                                Object.defineProperty(_this, 'fieldData', {\n                                    value: Object.freeze(data),\n                                    writable: false,\n                                    enumerable: true,\n                                    configurable: true\n                                });\n                            };\n                            Promise.all([this.overlayManager.open(this.overlayName), this._dataAvailableCapability.promise]).then(function () {\n                                if (_this.fieldData) {\n                                    _this._updateUI();\n                                    return;\n                                }\n                                _this.pdfDocument.getMetadata().then(function (_ref2) {\n                                    var info = _ref2.info,\n                                        metadata = _ref2.metadata;\n\n                                    return Promise.all([info, metadata, _this._parseFileSize(_this.maybeFileSize), _this._parseDate(info.CreationDate), _this._parseDate(info.ModDate)]);\n                                }).then(function (_ref3) {\n                                    var _ref4 = _slicedToArray(_ref3, 5),\n                                        info = _ref4[0],\n                                        metadata = _ref4[1],\n                                        fileSize = _ref4[2],\n                                        creationDate = _ref4[3],\n                                        modificationDate = _ref4[4];\n\n                                    freezeFieldData({\n                                        'fileName': (0, _ui_utils.getPDFFileNameFromURL)(_this.url),\n                                        'fileSize': fileSize,\n                                        'title': info.Title,\n                                        'author': info.Author,\n                                        'subject': info.Subject,\n                                        'keywords': info.Keywords,\n                                        'creationDate': creationDate,\n                                        'modificationDate': modificationDate,\n                                        'creator': info.Creator,\n                                        'producer': info.Producer,\n                                        'version': info.PDFFormatVersion,\n                                        'pageCount': _this.pdfDocument.numPages\n                                    });\n                                    _this._updateUI();\n                                    return _this.pdfDocument.getDownloadInfo();\n                                }).then(function (_ref5) {\n                                    var length = _ref5.length;\n\n                                    return _this._parseFileSize(length);\n                                }).then(function (fileSize) {\n                                    var data = (0, _ui_utils.cloneObj)(_this.fieldData);\n                                    data['fileSize'] = fileSize;\n                                    freezeFieldData(data);\n                                    _this._updateUI();\n                                });\n                            });\n                        }\n                    }, {\n                        key: 'close',\n                        value: function close() {\n                            this.overlayManager.close(this.overlayName);\n                        }\n                    }, {\n                        key: 'setDocument',\n                        value: function setDocument(pdfDocument, url) {\n                            if (this.pdfDocument) {\n                                this._reset();\n                                this._updateUI(true);\n                            }\n                            if (!pdfDocument) {\n                                return;\n                            }\n                            this.pdfDocument = pdfDocument;\n                            this.url = url;\n                            this._dataAvailableCapability.resolve();\n                        }\n                    }, {\n                        key: 'setFileSize',\n                        value: function setFileSize(fileSize) {\n                            if (typeof fileSize === 'number' && fileSize > 0) {\n                                this.maybeFileSize = fileSize;\n                            }\n                        }\n                    }, {\n                        key: '_reset',\n                        value: function _reset() {\n                            this.pdfDocument = null;\n                            this.url = null;\n                            this.maybeFileSize = 0;\n                            delete this.fieldData;\n                            this._dataAvailableCapability = (0, _pdfjsLib.createPromiseCapability)();\n                        }\n                    }, {\n                        key: '_updateUI',\n                        value: function _updateUI() {\n                            var reset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n                            //console.log(DEFAULT_FIELD_CONTENT);\n                            if (reset || !this.fieldData) {\n                                for (var id in this.fields) {\n                                    if (this.fields[id] !== null) {\n                                        this.fields[id].textContent = DEFAULT_FIELD_CONTENT;\n                                    }\n                                }\n                                return;\n                            }\n                            if (this.overlayManager.active !== this.overlayName) {\n                                return;\n                            }\n                            for (var _id in this.fields) {\n                                var content = this.fieldData[_id];\n                                if (this.fields[_id] !== null) {\n                                    this.fields[_id].textContent = content || content === 0 ? content : DEFAULT_FIELD_CONTENT;\n                                }\n                            }\n                        }\n                    }, {\n                        key: '_parseFileSize',\n                        value: function _parseFileSize() {\n                            var fileSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n                            var kb = fileSize / 1024;\n                            if (!kb) {\n                                return Promise.resolve(undefined);\n                            } else if (kb < 1024) {\n                                return this.l10n.get('document_properties_kb', {\n                                    size_kb: (+kb.toPrecision(3)).toLocaleString(),\n                                    size_b: fileSize.toLocaleString()\n                                }, '{{size_kb}} KB ({{size_b}} bytes)');\n                            }\n                            return this.l10n.get('document_properties_mb', {\n                                size_mb: (+(kb / 1024).toPrecision(3)).toLocaleString(),\n                                size_b: fileSize.toLocaleString()\n                            }, '{{size_mb}} MB ({{size_b}} bytes)');\n                        }\n                    }, {\n                        key: '_parseDate',\n                        value: function _parseDate(inputDate) {\n                            if (!inputDate) {\n                                return;\n                            }\n                            var dateToParse = inputDate;\n                            if (dateToParse.substring(0, 2) === 'D:') {\n                                dateToParse = dateToParse.substring(2);\n                            }\n                            var year = parseInt(dateToParse.substring(0, 4), 10);\n                            var month = parseInt(dateToParse.substring(4, 6), 10) - 1;\n                            var day = parseInt(dateToParse.substring(6, 8), 10);\n                            var hours = parseInt(dateToParse.substring(8, 10), 10);\n                            var minutes = parseInt(dateToParse.substring(10, 12), 10);\n                            var seconds = parseInt(dateToParse.substring(12, 14), 10);\n                            var utRel = dateToParse.substring(14, 15);\n                            var offsetHours = parseInt(dateToParse.substring(15, 17), 10);\n                            var offsetMinutes = parseInt(dateToParse.substring(18, 20), 10);\n                            if (utRel === '-') {\n                                hours += offsetHours;\n                                minutes += offsetMinutes;\n                            } else if (utRel === '+') {\n                                hours -= offsetHours;\n                                minutes -= offsetMinutes;\n                            }\n                            var date = new Date(Date.UTC(year, month, day, hours, minutes, seconds));\n                            var dateString = date.toLocaleDateString();\n                            var timeString = date.toLocaleTimeString();\n                            return this.l10n.get('document_properties_date_string', {\n                                date: dateString,\n                                time: timeString\n                            }, '{{date}}, {{time}}');\n                        }\n                    }]);\n\n                    return PDFDocumentProperties;\n                }();\n\n                exports.PDFDocumentProperties = PDFDocumentProperties;\n\n                /***/\n            }),\n        /* 19 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFFindBar = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdf_find_controller = __webpack_require__(7);\n\n                var _ui_utils = __webpack_require__(0);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var PDFFindBar = function () {\n                    function PDFFindBar(options) {\n                        var _this = this;\n\n                        var l10n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _ui_utils.NullL10n;\n\n                        _classCallCheck(this, PDFFindBar);\n\n                        this.opened = false;\n                        this.bar = options.bar || null;\n                        this.toggleButton = options.toggleButton || null;\n                        this.findField = options.findField || null;\n                        this.highlightAll = options.highlightAllCheckbox || null;\n                        this.caseSensitive = options.caseSensitiveCheckbox || null;\n                        this.findMsg = options.findMsg || null;\n                        this.findResultsCount = options.findResultsCount || null;\n                        this.findStatusIcon = options.findStatusIcon || null;\n                        this.findPreviousButton = options.findPreviousButton || null;\n                        this.findNextButton = options.findNextButton || null;\n                        this.findController = options.findController || null;\n                        this.eventBus = options.eventBus;\n                        this.l10n = l10n;\n                        if (this.findController === null) {\n                            throw new Error('PDFFindBar cannot be used without a ' + 'PDFFindController instance.');\n                        }\n                        this.toggleButton.addEventListener('click', function () {\n                            _this.toggle();\n                        });\n                        this.findField.addEventListener('input', function () {\n                            _this.dispatchEvent('');\n                        });\n                        this.bar.addEventListener('keydown', function (e) {\n                            switch (e.keyCode) {\n                                case 13:\n                                    if (e.target === _this.findField) {\n                                        _this.dispatchEvent('again', e.shiftKey);\n                                    }\n                                    break;\n                                case 27:\n                                    _this.close();\n                                    break;\n                            }\n                        });\n                        this.findPreviousButton.addEventListener('click', function () {\n                            _this.dispatchEvent('again', true);\n                        });\n                        this.findNextButton.addEventListener('click', function () {\n                            _this.dispatchEvent('again', false);\n                        });\n                        this.highlightAll.addEventListener('click', function () {\n                            _this.dispatchEvent('highlightallchange');\n                        });\n                        this.caseSensitive.addEventListener('click', function () {\n                            _this.dispatchEvent('casesensitivitychange');\n                        });\n                        this.eventBus.on('resize', this._adjustWidth.bind(this));\n                    }\n\n                    _createClass(PDFFindBar, [{\n                        key: 'reset',\n                        value: function reset() {\n                            this.updateUIState();\n                        }\n                    }, {\n                        key: 'dispatchEvent',\n                        value: function dispatchEvent(type, findPrev) {\n                            this.eventBus.dispatch('find', {\n                                source: this,\n                                type: type,\n                                query: this.findField.value,\n                                caseSensitive: this.caseSensitive.checked,\n                                phraseSearch: true,\n                                highlightAll: this.highlightAll.checked,\n                                findPrevious: findPrev\n                            });\n                        }\n                    }, {\n                        key: 'updateUIState',\n                        value: function updateUIState(state, previous, matchCount) {\n                            var _this2 = this;\n\n                            var notFound = false;\n                            var findMsg = '';\n                            var status = '';\n                            switch (state) {\n                                case _pdf_find_controller.FindState.FOUND:\n                                    break;\n                                case _pdf_find_controller.FindState.PENDING:\n                                    status = 'pending';\n                                    break;\n                                case _pdf_find_controller.FindState.NOT_FOUND:\n                                    findMsg = this.l10n.get('find_not_found', null, 'Phrase not found');\n                                    notFound = true;\n                                    break;\n                                case _pdf_find_controller.FindState.WRAPPED:\n                                    if (previous) {\n                                        findMsg = this.l10n.get('find_reached_top', null, 'Reached top of document, continued from bottom');\n                                    } else {\n                                        findMsg = this.l10n.get('find_reached_bottom', null, 'Reached end of document, continued from top');\n                                    }\n                                    break;\n                            }\n                            if (notFound) {\n                                this.findField.classList.add('notFound');\n                            } else {\n                                this.findField.classList.remove('notFound');\n                            }\n                            this.findField.setAttribute('data-status', status);\n                            Promise.resolve(findMsg).then(function (msg) {\n                                _this2.findMsg.textContent = msg;\n                                _this2._adjustWidth();\n                            });\n                            this.updateResultsCount(matchCount);\n                        }\n                    }, {\n                        key: 'updateResultsCount',\n                        value: function updateResultsCount(matchCount) {\n                            if (!this.findResultsCount) {\n                                return;\n                            }\n                            if (!matchCount) {\n                                this.findResultsCount.classList.add('hidden');\n                                this.findResultsCount.textContent = '';\n                            } else {\n                                this.findResultsCount.textContent = matchCount.toLocaleString();\n                                this.findResultsCount.classList.remove('hidden');\n                            }\n                            this._adjustWidth();\n                        }\n                    }, {\n                        key: 'open',\n                        value: function open() {\n                            if (!this.opened) {\n                                this.opened = true;\n                                this.toggleButton.classList.add('toggled');\n                                this.bar.classList.remove('hidden');\n                            }\n                            this.findField.select();\n                            this.findField.focus();\n                            this._adjustWidth();\n                        }\n                    }, {\n                        key: 'close',\n                        value: function close() {\n                            if (!this.opened) {\n                                return;\n                            }\n                            this.opened = false;\n                            this.toggleButton.classList.remove('toggled');\n                            this.bar.classList.add('hidden');\n                            this.findController.active = false;\n                        }\n                    }, {\n                        key: 'toggle',\n                        value: function toggle() {\n                            if (this.opened) {\n                                this.close();\n                            } else {\n                                this.open();\n                            }\n                        }\n                    }, {\n                        key: '_adjustWidth',\n                        value: function _adjustWidth() {\n                            if (!this.opened) {\n                                return;\n                            }\n                            this.bar.classList.remove('wrapContainers');\n                            var findbarHeight = this.bar.clientHeight;\n                            var inputContainerHeight = this.bar.firstElementChild.clientHeight;\n                            if (findbarHeight > inputContainerHeight) {\n                                this.bar.classList.add('wrapContainers');\n                            }\n                        }\n                    }]);\n\n                    return PDFFindBar;\n                }();\n\n                exports.PDFFindBar = PDFFindBar;\n\n                /***/\n            }),\n        /* 20 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFHistory = undefined;\n\n                var _dom_events = __webpack_require__(2);\n\n                function PDFHistory(options) {\n                    this.linkService = options.linkService;\n                    this.eventBus = options.eventBus || (0, _dom_events.getGlobalEventBus)();\n                    this.initialized = false;\n                    this.initialDestination = null;\n                    this.initialBookmark = null;\n                }\n                PDFHistory.prototype = {\n                    initialize: function pdfHistoryInitialize(fingerprint) {\n                        this.initialized = true;\n                        this.reInitialized = false;\n                        this.allowHashChange = true;\n                        this.historyUnlocked = true;\n                        this.isViewerInPresentationMode = false;\n                        this.previousHash = window.location.hash.substring(1);\n                        this.currentBookmark = '';\n                        this.currentPage = 0;\n                        this.updatePreviousBookmark = false;\n                        this.previousBookmark = '';\n                        this.previousPage = 0;\n                        this.nextHashParam = '';\n                        this.fingerprint = fingerprint;\n                        this.currentUid = this.uid = 0;\n                        this.current = {};\n                        var state = window.history.state;\n                        if (this._isStateObjectDefined(state)) {\n                            if (state.target.dest) {\n                                this.initialDestination = state.target.dest;\n                            } else {\n                                this.initialBookmark = state.target.hash;\n                            }\n                            this.currentUid = state.uid;\n                            this.uid = state.uid + 1;\n                            this.current = state.target;\n                        } else {\n                            if (state && state.fingerprint && this.fingerprint !== state.fingerprint) {\n                                this.reInitialized = true;\n                            }\n                            this._pushOrReplaceState({ fingerprint: this.fingerprint }, true);\n                        }\n                        var self = this;\n                        window.addEventListener('popstate', function pdfHistoryPopstate(evt) {\n                            if (!self.historyUnlocked) {\n                                return;\n                            }\n                            if (evt.state) {\n                                self._goTo(evt.state);\n                                return;\n                            }\n                            if (self.uid === 0) {\n                                var previousParams = self.previousHash && self.currentBookmark && self.previousHash !== self.currentBookmark ? {\n                                    hash: self.currentBookmark,\n                                    page: self.currentPage\n                                } : { page: 1 };\n                                replacePreviousHistoryState(previousParams, function () {\n                                    updateHistoryWithCurrentHash();\n                                });\n                            } else {\n                                updateHistoryWithCurrentHash();\n                            }\n                        });\n                        function updateHistoryWithCurrentHash() {\n                            self.previousHash = window.location.hash.slice(1);\n                            self._pushToHistory({ hash: self.previousHash }, false, true);\n                            self._updatePreviousBookmark();\n                        }\n                        function replacePreviousHistoryState(params, callback) {\n                            self.historyUnlocked = false;\n                            self.allowHashChange = false;\n                            window.addEventListener('popstate', rewriteHistoryAfterBack);\n                            history.back();\n                            function rewriteHistoryAfterBack() {\n                                window.removeEventListener('popstate', rewriteHistoryAfterBack);\n                                window.addEventListener('popstate', rewriteHistoryAfterForward);\n                                self._pushToHistory(params, false, true);\n                                history.forward();\n                            }\n                            function rewriteHistoryAfterForward() {\n                                window.removeEventListener('popstate', rewriteHistoryAfterForward);\n                                self.allowHashChange = true;\n                                self.historyUnlocked = true;\n                                callback();\n                            }\n                        }\n                        function pdfHistoryBeforeUnload() {\n                            var previousParams = self._getPreviousParams(null, true);\n                            if (previousParams) {\n                                var replacePrevious = !self.current.dest && self.current.hash !== self.previousHash;\n                                self._pushToHistory(previousParams, false, replacePrevious);\n                                self._updatePreviousBookmark();\n                            }\n                            window.removeEventListener('beforeunload', pdfHistoryBeforeUnload);\n                        }\n                        window.addEventListener('beforeunload', pdfHistoryBeforeUnload);\n                        window.addEventListener('pageshow', function pdfHistoryPageShow(evt) {\n                            window.addEventListener('beforeunload', pdfHistoryBeforeUnload);\n                        });\n                        self.eventBus.on('presentationmodechanged', function (e) {\n                            self.isViewerInPresentationMode = e.active;\n                        });\n                    },\n                    clearHistoryState: function pdfHistory_clearHistoryState() {\n                        this._pushOrReplaceState(null, true);\n                    },\n                    _isStateObjectDefined: function pdfHistory_isStateObjectDefined(state) {\n                        return state && state.uid >= 0 && state.fingerprint && this.fingerprint === state.fingerprint && state.target && state.target.hash ? true : false;\n                    },\n                    _pushOrReplaceState: function pdfHistory_pushOrReplaceState(stateObj, replace) {\n                        if (replace) {\n                            window.history.replaceState(stateObj, '', document.URL);\n                        } else {\n                            window.history.pushState(stateObj, '', document.URL);\n                        }\n                    },\n                    get isHashChangeUnlocked() {\n                        if (!this.initialized) {\n                            return true;\n                        }\n                        return this.allowHashChange;\n                    },\n                    _updatePreviousBookmark: function pdfHistory_updatePreviousBookmark() {\n                        if (this.updatePreviousBookmark && this.currentBookmark && this.currentPage) {\n                            this.previousBookmark = this.currentBookmark;\n                            this.previousPage = this.currentPage;\n                            this.updatePreviousBookmark = false;\n                        }\n                    },\n                    updateCurrentBookmark: function pdfHistoryUpdateCurrentBookmark(bookmark, pageNum) {\n                        if (this.initialized) {\n                            this.currentBookmark = bookmark.substring(1);\n                            this.currentPage = pageNum | 0;\n                            this._updatePreviousBookmark();\n                        }\n                    },\n                    updateNextHashParam: function pdfHistoryUpdateNextHashParam(param) {\n                        if (this.initialized) {\n                            this.nextHashParam = param;\n                        }\n                    },\n                    push: function pdfHistoryPush(params, isInitialBookmark) {\n                        if (!(this.initialized && this.historyUnlocked)) {\n                            return;\n                        }\n                        if (params.dest && !params.hash) {\n                            params.hash = this.current.hash && this.current.dest && this.current.dest === params.dest ? this.current.hash : this.linkService.getDestinationHash(params.dest).split('#')[1];\n                        }\n                        if (params.page) {\n                            params.page |= 0;\n                        }\n                        if (isInitialBookmark) {\n                            var target = window.history.state.target;\n                            if (!target) {\n                                this._pushToHistory(params, false);\n                                this.previousHash = window.location.hash.substring(1);\n                            }\n                            this.updatePreviousBookmark = this.nextHashParam ? false : true;\n                            if (target) {\n                                this._updatePreviousBookmark();\n                            }\n                            return;\n                        }\n                        if (this.nextHashParam) {\n                            if (this.nextHashParam === params.hash) {\n                                this.nextHashParam = null;\n                                this.updatePreviousBookmark = true;\n                                return;\n                            }\n                            this.nextHashParam = null;\n                        }\n                        if (params.hash) {\n                            if (this.current.hash) {\n                                if (this.current.hash !== params.hash) {\n                                    this._pushToHistory(params, true);\n                                } else {\n                                    if (!this.current.page && params.page) {\n                                        this._pushToHistory(params, false, true);\n                                    }\n                                    this.updatePreviousBookmark = true;\n                                }\n                            } else {\n                                this._pushToHistory(params, true);\n                            }\n                        } else if (this.current.page && params.page && this.current.page !== params.page) {\n                            this._pushToHistory(params, true);\n                        }\n                    },\n                    _getPreviousParams: function pdfHistory_getPreviousParams(onlyCheckPage, beforeUnload) {\n                        if (!(this.currentBookmark && this.currentPage)) {\n                            return null;\n                        } else if (this.updatePreviousBookmark) {\n                            this.updatePreviousBookmark = false;\n                        }\n                        if (this.uid > 0 && !(this.previousBookmark && this.previousPage)) {\n                            return null;\n                        }\n                        if (!this.current.dest && !onlyCheckPage || beforeUnload) {\n                            if (this.previousBookmark === this.currentBookmark) {\n                                return null;\n                            }\n                        } else if (this.current.page || onlyCheckPage) {\n                            if (this.previousPage === this.currentPage) {\n                                return null;\n                            }\n                        } else {\n                            return null;\n                        }\n                        var params = {\n                            hash: this.currentBookmark,\n                            page: this.currentPage\n                        };\n                        if (this.isViewerInPresentationMode) {\n                            params.hash = null;\n                        }\n                        return params;\n                    },\n                    _stateObj: function pdfHistory_stateObj(params) {\n                        return {\n                            fingerprint: this.fingerprint,\n                            uid: this.uid,\n                            target: params\n                        };\n                    },\n                    _pushToHistory: function pdfHistory_pushToHistory(params, addPrevious, overwrite) {\n                        if (!this.initialized) {\n                            return;\n                        }\n                        if (!params.hash && params.page) {\n                            params.hash = 'page=' + params.page;\n                        }\n                        if (addPrevious && !overwrite) {\n                            var previousParams = this._getPreviousParams();\n                            if (previousParams) {\n                                var replacePrevious = !this.current.dest && this.current.hash !== this.previousHash;\n                                this._pushToHistory(previousParams, false, replacePrevious);\n                            }\n                        }\n                        this._pushOrReplaceState(this._stateObj(params), overwrite || this.uid === 0);\n                        this.currentUid = this.uid++;\n                        this.current = params;\n                        this.updatePreviousBookmark = true;\n                    },\n                    _goTo: function pdfHistory_goTo(state) {\n                        if (!(this.initialized && this.historyUnlocked && this._isStateObjectDefined(state))) {\n                            return;\n                        }\n                        if (!this.reInitialized && state.uid < this.currentUid) {\n                            var previousParams = this._getPreviousParams(true);\n                            if (previousParams) {\n                                this._pushToHistory(this.current, false);\n                                this._pushToHistory(previousParams, false);\n                                this.currentUid = state.uid;\n                                window.history.back();\n                                return;\n                            }\n                        }\n                        this.historyUnlocked = false;\n                        if (state.target.dest) {\n                            this.linkService.navigateTo(state.target.dest);\n                        } else {\n                            this.linkService.setHash(state.target.hash);\n                        }\n                        this.currentUid = state.uid;\n                        if (state.uid > this.uid) {\n                            this.uid = state.uid;\n                        }\n                        this.current = state.target;\n                        this.updatePreviousBookmark = true;\n                        var currentHash = window.location.hash.substring(1);\n                        if (this.previousHash !== currentHash) {\n                            this.allowHashChange = false;\n                        }\n                        this.previousHash = currentHash;\n                        this.historyUnlocked = true;\n                    },\n                    back: function pdfHistoryBack() {\n                        this.go(-1);\n                    },\n                    forward: function pdfHistoryForward() {\n                        this.go(1);\n                    },\n                    go: function pdfHistoryGo(direction) {\n                        if (this.initialized && this.historyUnlocked) {\n                            var state = window.history.state;\n                            if (direction === -1 && state && state.uid > 0) {\n                                window.history.back();\n                            } else if (direction === 1 && state && state.uid < this.uid - 1) {\n                                window.history.forward();\n                            }\n                        }\n                    }\n                };\n                exports.PDFHistory = PDFHistory;\n\n                /***/\n            }),\n        /* 21 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFOutlineViewer = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var DEFAULT_TITLE = '\\u2013';\n\n                var PDFOutlineViewer = function () {\n                    function PDFOutlineViewer(_ref) {\n                        var container = _ref.container,\n                            linkService = _ref.linkService,\n                            eventBus = _ref.eventBus;\n\n                        _classCallCheck(this, PDFOutlineViewer);\n\n                        this.outline = null;\n                        this.lastToggleIsShow = true;\n                        this.container = container;\n                        this.linkService = linkService;\n                        this.eventBus = eventBus;\n                    }\n\n                    _createClass(PDFOutlineViewer, [{\n                        key: 'reset',\n                        value: function reset() {\n                            this.outline = null;\n                            this.lastToggleIsShow = true;\n                            this.container.textContent = '';\n                            this.container.classList.remove('outlineWithDeepNesting');\n                        }\n                    }, {\n                        key: '_dispatchEvent',\n                        value: function _dispatchEvent(outlineCount) {\n                            this.eventBus.dispatch('outlineloaded', {\n                                source: this,\n                                outlineCount: outlineCount\n                            });\n                        }\n                    }, {\n                        key: '_bindLink',\n                        value: function _bindLink(element, item) {\n                            var _this = this;\n\n                            if (item.url) {\n                                (0, _pdfjsLib.addLinkAttributes)(element, {\n                                    url: item.url,\n                                    target: item.newWindow ? _pdfjsLib.PDFJS.LinkTarget.BLANK : undefined\n                                });\n                                return;\n                            }\n                            var destination = item.dest;\n                            element.href = this.linkService.getDestinationHash(destination);\n                            element.onclick = function () {\n                                if (destination) {\n                                    _this.linkService.navigateTo(destination);\n                                }\n                                return false;\n                            };\n                        }\n                    }, {\n                        key: '_setStyles',\n                        value: function _setStyles(element, item) {\n                            var styleStr = '';\n                            if (item.bold) {\n                                styleStr += 'font-weight: bold;';\n                            }\n                            if (item.italic) {\n                                styleStr += 'font-style: italic;';\n                            }\n                            if (styleStr) {\n                                element.setAttribute('style', styleStr);\n                            }\n                        }\n                    }, {\n                        key: '_addToggleButton',\n                        value: function _addToggleButton(div) {\n                            var _this2 = this;\n\n                            var toggler = document.createElement('div');\n                            toggler.className = 'outlineItemToggler';\n                            toggler.onclick = function (evt) {\n                                evt.stopPropagation();\n                                toggler.classList.toggle('outlineItemsHidden');\n                                if (evt.shiftKey) {\n                                    var shouldShowAll = !toggler.classList.contains('outlineItemsHidden');\n                                    _this2._toggleOutlineItem(div, shouldShowAll);\n                                }\n                            };\n                            div.insertBefore(toggler, div.firstChild);\n                        }\n                    }, {\n                        key: '_toggleOutlineItem',\n                        value: function _toggleOutlineItem(root, show) {\n                            this.lastToggleIsShow = show;\n                            var togglers = root.querySelectorAll('.outlineItemToggler');\n                            for (var i = 0, ii = togglers.length; i < ii; ++i) {\n                                togglers[i].classList[show ? 'remove' : 'add']('outlineItemsHidden');\n                            }\n                        }\n                    }, {\n                        key: 'toggleOutlineTree',\n                        value: function toggleOutlineTree() {\n                            if (!this.outline) {\n                                return;\n                            }\n                            this._toggleOutlineItem(this.container, !this.lastToggleIsShow);\n                        }\n                    }, {\n                        key: 'render',\n                        value: function render(_ref2) {\n                            var outline = _ref2.outline;\n\n                            var outlineCount = 0;\n                            if (this.outline) {\n                                this.reset();\n                            }\n                            this.outline = outline || null;\n                            if (!outline) {\n                                this._dispatchEvent(outlineCount);\n                                return;\n                            }\n                            var fragment = document.createDocumentFragment();\n                            var queue = [{\n                                parent: fragment,\n                                items: this.outline\n                            }];\n                            var hasAnyNesting = false;\n                            while (queue.length > 0) {\n                                var levelData = queue.shift();\n                                for (var i = 0, len = levelData.items.length; i < len; i++) {\n                                    var item = levelData.items[i];\n                                    var div = document.createElement('div');\n                                    div.className = 'outlineItem';\n                                    var element = document.createElement('a');\n                                    this._bindLink(element, item);\n                                    this._setStyles(element, item);\n                                    element.textContent = (0, _pdfjsLib.removeNullCharacters)(item.title) || DEFAULT_TITLE;\n                                    div.appendChild(element);\n                                    if (item.items.length > 0) {\n                                        hasAnyNesting = true;\n                                        this._addToggleButton(div);\n                                        var itemsDiv = document.createElement('div');\n                                        itemsDiv.className = 'outlineItems';\n                                        div.appendChild(itemsDiv);\n                                        queue.push({\n                                            parent: itemsDiv,\n                                            items: item.items\n                                        });\n                                    }\n                                    levelData.parent.appendChild(div);\n                                    outlineCount++;\n                                }\n                            }\n                            if (hasAnyNesting) {\n                                this.container.classList.add('outlineWithDeepNesting');\n                            }\n                            this.container.appendChild(fragment);\n                            this._dispatchEvent(outlineCount);\n                        }\n                    }]);\n\n                    return PDFOutlineViewer;\n                }();\n\n                exports.PDFOutlineViewer = PDFOutlineViewer;\n\n                /***/\n            }),\n        /* 22 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFPageView = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                var _dom_events = __webpack_require__(2);\n\n                var _pdf_rendering_queue = __webpack_require__(3);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var PDFPageView = function () {\n                    function PDFPageView(options) {\n                        _classCallCheck(this, PDFPageView);\n\n                        var container = options.container;\n                        var defaultViewport = options.defaultViewport;\n                        this.id = options.id;\n                        this.renderingId = 'page' + this.id;\n                        this.pdfPage = null;\n                        this.pageLabel = null;\n                        this.rotation = 0;\n                        this.scale = options.scale || _ui_utils.DEFAULT_SCALE;\n                        this.viewport = defaultViewport;\n                        this.pdfPageRotate = defaultViewport.rotation;\n                        this.hasRestrictedScaling = false;\n                        this.enhanceTextSelection = options.enhanceTextSelection || false;\n                        this.renderInteractiveForms = options.renderInteractiveForms || false;\n                        this.eventBus = options.eventBus || (0, _dom_events.getGlobalEventBus)();\n                        this.renderingQueue = options.renderingQueue;\n                        this.textLayerFactory = options.textLayerFactory;\n                        this.annotationLayerFactory = options.annotationLayerFactory;\n                        this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;\n                        this.l10n = options.l10n || _ui_utils.NullL10n;\n                        this.paintTask = null;\n                        this.paintedViewportMap = new WeakMap();\n                        this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\n                        this.resume = null;\n                        this.error = null;\n                        this.onBeforeDraw = null;\n                        this.onAfterDraw = null;\n                        this.annotationLayer = null;\n                        this.textLayer = null;\n                        this.zoomLayer = null;\n                        var div = document.createElement('div');\n                        div.className = 'page';\n                        div.style.width = Math.floor(this.viewport.width) + 'px';\n                        div.style.height = Math.floor(this.viewport.height) + 'px';\n                        div.setAttribute('data-page-number', this.id);\n                        this.div = div;\n                        container.appendChild(div);\n                    }\n\n                    _createClass(PDFPageView, [{\n                        key: 'setPdfPage',\n                        value: function setPdfPage(pdfPage) {\n                            this.pdfPage = pdfPage;\n                            this.pdfPageRotate = pdfPage.rotate;\n                            var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n                            this.viewport = pdfPage.getViewport(this.scale * _ui_utils.CSS_UNITS, totalRotation);\n                            this.stats = pdfPage.stats;\n                            this.reset();\n                        }\n                    }, {\n                        key: 'destroy',\n                        value: function destroy() {\n                            this.reset();\n                            if (this.pdfPage) {\n                                this.pdfPage.cleanup();\n                                this.pdfPage = null;\n                            }\n                        }\n                    }, {\n                        key: '_resetZoomLayer',\n                        value: function _resetZoomLayer() {\n                            var removeFromDOM = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n                            if (!this.zoomLayer) {\n                                return;\n                            }\n                            var zoomLayerCanvas = this.zoomLayer.firstChild;\n                            this.paintedViewportMap.delete(zoomLayerCanvas);\n                            zoomLayerCanvas.width = 0;\n                            zoomLayerCanvas.height = 0;\n                            if (removeFromDOM) {\n                                this.zoomLayer.remove();\n                            }\n                            this.zoomLayer = null;\n                        }\n                    }, {\n                        key: 'reset',\n                        value: function reset() {\n                            var keepZoomLayer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n                            var keepAnnotations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n                            this.cancelRendering();\n                            var div = this.div;\n                            div.style.width = Math.floor(this.viewport.width) + 'px';\n                            div.style.height = Math.floor(this.viewport.height) + 'px';\n                            var childNodes = div.childNodes;\n                            var currentZoomLayerNode = keepZoomLayer && this.zoomLayer || null;\n                            var currentAnnotationNode = keepAnnotations && this.annotationLayer && this.annotationLayer.div || null;\n                            for (var i = childNodes.length - 1; i >= 0; i--) {\n                                var node = childNodes[i];\n                                if (currentZoomLayerNode === node || currentAnnotationNode === node) {\n                                    continue;\n                                }\n                                div.removeChild(node);\n                            }\n                            div.removeAttribute('data-loaded');\n                            if (currentAnnotationNode) {\n                                this.annotationLayer.hide();\n                            } else {\n                                this.annotationLayer = null;\n                            }\n                            if (!currentZoomLayerNode) {\n                                if (this.canvas) {\n                                    this.paintedViewportMap.delete(this.canvas);\n                                    this.canvas.width = 0;\n                                    this.canvas.height = 0;\n                                    delete this.canvas;\n                                }\n                                this._resetZoomLayer();\n                            }\n                            if (this.svg) {\n                                this.paintedViewportMap.delete(this.svg);\n                                delete this.svg;\n                            }\n                            this.loadingIconDiv = document.createElement('div');\n                            this.loadingIconDiv.className = 'loadingIcon';\n                            div.appendChild(this.loadingIconDiv);\n                        }\n                    }, {\n                        key: 'update',\n                        value: function update(scale, rotation) {\n                            this.scale = scale || this.scale;\n                            if (typeof rotation !== 'undefined') {\n                                this.rotation = rotation;\n                            }\n                            var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n                            this.viewport = this.viewport.clone({\n                                scale: this.scale * _ui_utils.CSS_UNITS,\n                                rotation: totalRotation\n                            });\n                            if (this.svg) {\n                                this.cssTransform(this.svg, true);\n                                this.eventBus.dispatch('pagerendered', {\n                                    source: this,\n                                    pageNumber: this.id,\n                                    cssTransform: true\n                                });\n                                return;\n                            }\n                            var isScalingRestricted = false;\n                            if (this.canvas && _pdfjsLib.PDFJS.maxCanvasPixels > 0) {\n                                var outputScale = this.outputScale;\n                                if ((Math.floor(this.viewport.width) * outputScale.sx | 0) * (Math.floor(this.viewport.height) * outputScale.sy | 0) > _pdfjsLib.PDFJS.maxCanvasPixels) {\n                                    isScalingRestricted = true;\n                                }\n                            }\n                            if (this.canvas) {\n                                if (_pdfjsLib.PDFJS.useOnlyCssZoom || this.hasRestrictedScaling && isScalingRestricted) {\n                                    this.cssTransform(this.canvas, true);\n                                    this.eventBus.dispatch('pagerendered', {\n                                        source: this,\n                                        pageNumber: this.id,\n                                        cssTransform: true\n                                    });\n                                    return;\n                                }\n                                if (!this.zoomLayer && !this.canvas.hasAttribute('hidden')) {\n                                    this.zoomLayer = this.canvas.parentNode;\n                                    this.zoomLayer.style.position = 'absolute';\n                                }\n                            }\n                            if (this.zoomLayer) {\n                                this.cssTransform(this.zoomLayer.firstChild);\n                            }\n                            this.reset(true, true);\n                        }\n                    }, {\n                        key: 'cancelRendering',\n                        value: function cancelRendering() {\n                            if (this.paintTask) {\n                                this.paintTask.cancel();\n                                this.paintTask = null;\n                            }\n                            this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\n                            this.resume = null;\n                            if (this.textLayer) {\n                                this.textLayer.cancel();\n                                this.textLayer = null;\n                            }\n                        }\n                    }, {\n                        key: 'cssTransform',\n                        value: function cssTransform(target) {\n                            var redrawAnnotations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n                            var width = this.viewport.width;\n                            var height = this.viewport.height;\n                            var div = this.div;\n                            target.style.width = target.parentNode.style.width = div.style.width = Math.floor(width) + 'px';\n                            target.style.height = target.parentNode.style.height = div.style.height = Math.floor(height) + 'px';\n                            var relativeRotation = this.viewport.rotation - this.paintedViewportMap.get(target).rotation;\n                            var absRotation = Math.abs(relativeRotation);\n                            var scaleX = 1,\n                                scaleY = 1;\n                            if (absRotation === 90 || absRotation === 270) {\n                                scaleX = height / width;\n                                scaleY = width / height;\n                            }\n                            var cssTransform = 'rotate(' + relativeRotation + 'deg) ' + 'scale(' + scaleX + ',' + scaleY + ')';\n                            _pdfjsLib.CustomStyle.setProp('transform', target, cssTransform);\n                            if (this.textLayer) {\n                                var textLayerViewport = this.textLayer.viewport;\n                                var textRelativeRotation = this.viewport.rotation - textLayerViewport.rotation;\n                                var textAbsRotation = Math.abs(textRelativeRotation);\n                                var scale = width / textLayerViewport.width;\n                                if (textAbsRotation === 90 || textAbsRotation === 270) {\n                                    scale = width / textLayerViewport.height;\n                                }\n                                var textLayerDiv = this.textLayer.textLayerDiv;\n                                var transX = void 0,\n                                    transY = void 0;\n                                switch (textAbsRotation) {\n                                    case 0:\n                                        transX = transY = 0;\n                                        break;\n                                    case 90:\n                                        transX = 0;\n                                        transY = '-' + textLayerDiv.style.height;\n                                        break;\n                                    case 180:\n                                        transX = '-' + textLayerDiv.style.width;\n                                        transY = '-' + textLayerDiv.style.height;\n                                        break;\n                                    case 270:\n                                        transX = '-' + textLayerDiv.style.width;\n                                        transY = 0;\n                                        break;\n                                    default:\n                                        console.error('Bad rotation value.');\n                                        break;\n                                }\n                                _pdfjsLib.CustomStyle.setProp('transform', textLayerDiv, 'rotate(' + textAbsRotation + 'deg) ' + 'scale(' + scale + ', ' + scale + ') ' + 'translate(' + transX + ', ' + transY + ')');\n                                _pdfjsLib.CustomStyle.setProp('transformOrigin', textLayerDiv, '0% 0%');\n                            }\n                            if (redrawAnnotations && this.annotationLayer) {\n                                this.annotationLayer.render(this.viewport, 'display');\n                            }\n                        }\n                    }, {\n                        key: 'getPagePoint',\n                        value: function getPagePoint(x, y) {\n                            return this.viewport.convertToPdfPoint(x, y);\n                        }\n                    }, {\n                        key: 'draw',\n                        value: function draw() {\n                            var _this = this;\n\n                            if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {\n                                console.error('Must be in new state before drawing');\n                                this.reset();\n                            }\n                            if (!this.pdfPage) {\n                                this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n                                return Promise.reject(new Error('Page is not loaded'));\n                            }\n                            this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\n                            var pdfPage = this.pdfPage;\n                            var div = this.div;\n                            var canvasWrapper = document.createElement('div');\n                            canvasWrapper.style.width = div.style.width;\n                            canvasWrapper.style.height = div.style.height;\n                            canvasWrapper.classList.add('canvasWrapper');\n                            if (this.annotationLayer && this.annotationLayer.div) {\n                                div.insertBefore(canvasWrapper, this.annotationLayer.div);\n                            } else {\n                                div.appendChild(canvasWrapper);\n                            }\n                            var textLayer = null;\n                            if (this.textLayerFactory) {\n                                var textLayerDiv = document.createElement('div');\n                                textLayerDiv.className = 'textLayer';\n                                textLayerDiv.style.width = canvasWrapper.style.width;\n                                textLayerDiv.style.height = canvasWrapper.style.height;\n                                if (this.annotationLayer && this.annotationLayer.div) {\n                                    div.insertBefore(textLayerDiv, this.annotationLayer.div);\n                                } else {\n                                    div.appendChild(textLayerDiv);\n                                }\n                                textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv, this.id - 1, this.viewport, this.enhanceTextSelection);\n                            }\n                            this.textLayer = textLayer;\n                            var renderContinueCallback = null;\n                            if (this.renderingQueue) {\n                                renderContinueCallback = function renderContinueCallback(cont) {\n                                    if (!_this.renderingQueue.isHighestPriority(_this)) {\n                                        _this.renderingState = _pdf_rendering_queue.RenderingStates.PAUSED;\n                                        _this.resume = function () {\n                                            _this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\n                                            cont();\n                                        };\n                                        return;\n                                    }\n                                    cont();\n                                };\n                            }\n                            var finishPaintTask = function finishPaintTask(error) {\n                                if (paintTask === _this.paintTask) {\n                                    _this.paintTask = null;\n                                }\n                                if (error === 'cancelled' || error instanceof _pdfjsLib.RenderingCancelledException) {\n                                    _this.error = null;\n                                    return Promise.resolve(undefined);\n                                }\n                                _this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n                                if (_this.loadingIconDiv) {\n                                    div.removeChild(_this.loadingIconDiv);\n                                    delete _this.loadingIconDiv;\n                                }\n                                _this._resetZoomLayer(true);\n                                _this.error = error;\n                                _this.stats = pdfPage.stats;\n                                if (_this.onAfterDraw) {\n                                    _this.onAfterDraw();\n                                }\n                                _this.eventBus.dispatch('pagerendered', {\n                                    source: _this,\n                                    pageNumber: _this.id,\n                                    cssTransform: false\n                                });\n                                if (error) {\n                                    return Promise.reject(error);\n                                }\n                                return Promise.resolve(undefined);\n                            };\n                            var paintTask = this.renderer === _ui_utils.RendererType.SVG ? this.paintOnSvg(canvasWrapper) : this.paintOnCanvas(canvasWrapper);\n                            paintTask.onRenderContinue = renderContinueCallback;\n                            this.paintTask = paintTask;\n                            var resultPromise = paintTask.promise.then(function () {\n                                return finishPaintTask(null).then(function () {\n                                    if (textLayer) {\n                                        var readableStream = pdfPage.streamTextContent({ normalizeWhitespace: true });\n                                        textLayer.setTextContentStream(readableStream);\n                                        textLayer.render();\n                                    }\n                                });\n                            }, function (reason) {\n                                return finishPaintTask(reason);\n                            });\n                            if (this.annotationLayerFactory) {\n                                if (!this.annotationLayer) {\n                                    this.annotationLayer = this.annotationLayerFactory.createAnnotationLayerBuilder(div, pdfPage, this.renderInteractiveForms, this.l10n);\n                                }\n                                this.annotationLayer.render(this.viewport, 'display');\n                            }\n                            div.setAttribute('data-loaded', true);\n                            if (this.onBeforeDraw) {\n                                this.onBeforeDraw();\n                            }\n                            return resultPromise;\n                        }\n                    }, {\n                        key: 'paintOnCanvas',\n                        value: function paintOnCanvas(canvasWrapper) {\n                            var renderCapability = (0, _pdfjsLib.createPromiseCapability)();\n                            var result = {\n                                promise: renderCapability.promise,\n                                onRenderContinue: function onRenderContinue(cont) {\n                                    cont();\n                                },\n                                cancel: function cancel() {\n                                    renderTask.cancel();\n                                }\n                            };\n                            var viewport = this.viewport;\n                            var canvas = document.createElement('canvas');\n                            canvas.id = this.renderingId;\n                            canvas.setAttribute('hidden', 'hidden');\n                            var isCanvasHidden = true;\n                            var showCanvas = function showCanvas() {\n                                if (isCanvasHidden) {\n                                    canvas.removeAttribute('hidden');\n                                    isCanvasHidden = false;\n                                }\n                            };\n                            canvasWrapper.appendChild(canvas);\n                            this.canvas = canvas;\n                            canvas.mozOpaque = true;\n                            var ctx = canvas.getContext('2d', { alpha: false });\n                            var outputScale = (0, _ui_utils.getOutputScale)(ctx);\n                            this.outputScale = outputScale;\n                            if (_pdfjsLib.PDFJS.useOnlyCssZoom) {\n                                var actualSizeViewport = viewport.clone({ scale: _ui_utils.CSS_UNITS });\n                                outputScale.sx *= actualSizeViewport.width / viewport.width;\n                                outputScale.sy *= actualSizeViewport.height / viewport.height;\n                                outputScale.scaled = true;\n                            }\n                            if (_pdfjsLib.PDFJS.maxCanvasPixels > 0) {\n                                var pixelsInViewport = viewport.width * viewport.height;\n                                var maxScale = Math.sqrt(_pdfjsLib.PDFJS.maxCanvasPixels / pixelsInViewport);\n                                if (outputScale.sx > maxScale || outputScale.sy > maxScale) {\n                                    outputScale.sx = maxScale;\n                                    outputScale.sy = maxScale;\n                                    outputScale.scaled = true;\n                                    this.hasRestrictedScaling = true;\n                                } else {\n                                    this.hasRestrictedScaling = false;\n                                }\n                            }\n                            var sfx = (0, _ui_utils.approximateFraction)(outputScale.sx);\n                            var sfy = (0, _ui_utils.approximateFraction)(outputScale.sy);\n                            canvas.width = (0, _ui_utils.roundToDivide)(viewport.width * outputScale.sx, sfx[0]);\n                            canvas.height = (0, _ui_utils.roundToDivide)(viewport.height * outputScale.sy, sfy[0]);\n                            canvas.style.width = (0, _ui_utils.roundToDivide)(viewport.width, sfx[1]) + 'px';\n                            canvas.style.height = (0, _ui_utils.roundToDivide)(viewport.height, sfy[1]) + 'px';\n                            this.paintedViewportMap.set(canvas, viewport);\n                            var transform = !outputScale.scaled ? null : [outputScale.sx, 0, 0, outputScale.sy, 0, 0];\n                            var renderContext = {\n                                canvasContext: ctx,\n                                transform: transform,\n                                viewport: this.viewport,\n                                renderInteractiveForms: this.renderInteractiveForms\n                            };\n                            var renderTask = this.pdfPage.render(renderContext);\n                            renderTask.onContinue = function (cont) {\n                                showCanvas();\n                                if (result.onRenderContinue) {\n                                    result.onRenderContinue(cont);\n                                } else {\n                                    cont();\n                                }\n                            };\n                            renderTask.promise.then(function () {\n                                showCanvas();\n                                renderCapability.resolve(undefined);\n                            }, function (error) {\n                                showCanvas();\n                                renderCapability.reject(error);\n                            });\n                            return result;\n                        }\n                    }, {\n                        key: 'paintOnSvg',\n                        value: function paintOnSvg(wrapper) {\n                            var _this2 = this;\n\n                            var cancelled = false;\n                            var ensureNotCancelled = function ensureNotCancelled() {\n                                if (cancelled) {\n                                    if (_pdfjsLib.PDFJS.pdfjsNext) {\n                                        throw new _pdfjsLib.RenderingCancelledException('Rendering cancelled, page ' + _this2.id, 'svg');\n                                    } else {\n                                        throw 'cancelled';\n                                    }\n                                }\n                            };\n                            var pdfPage = this.pdfPage;\n                            var actualSizeViewport = this.viewport.clone({ scale: _ui_utils.CSS_UNITS });\n                            var promise = pdfPage.getOperatorList().then(function (opList) {\n                                ensureNotCancelled();\n                                var svgGfx = new _pdfjsLib.SVGGraphics(pdfPage.commonObjs, pdfPage.objs);\n                                return svgGfx.getSVG(opList, actualSizeViewport).then(function (svg) {\n                                    ensureNotCancelled();\n                                    _this2.svg = svg;\n                                    _this2.paintedViewportMap.set(svg, actualSizeViewport);\n                                    svg.style.width = wrapper.style.width;\n                                    svg.style.height = wrapper.style.height;\n                                    _this2.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n                                    wrapper.appendChild(svg);\n                                });\n                            });\n                            return {\n                                promise: promise,\n                                onRenderContinue: function onRenderContinue(cont) {\n                                    cont();\n                                },\n                                cancel: function cancel() {\n                                    cancelled = true;\n                                }\n                            };\n                        }\n                    }, {\n                        key: 'setPageLabel',\n                        value: function setPageLabel(label) {\n                            this.pageLabel = typeof label === 'string' ? label : null;\n                            if (this.pageLabel !== null) {\n                                this.div.setAttribute('data-page-label', this.pageLabel);\n                            } else {\n                                this.div.removeAttribute('data-page-label');\n                            }\n                        }\n                    }, {\n                        key: 'width',\n                        get: function get() {\n                            return this.viewport.width;\n                        }\n                    }, {\n                        key: 'height',\n                        get: function get() {\n                            return this.viewport.height;\n                        }\n                    }]);\n\n                    return PDFPageView;\n                }();\n\n                exports.PDFPageView = PDFPageView;\n\n                /***/\n            }),\n        /* 23 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFPresentationMode = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1500;\n                var DELAY_BEFORE_HIDING_CONTROLS = 3000;\n                var ACTIVE_SELECTOR = 'pdfPresentationMode';\n                var CONTROLS_SELECTOR = 'pdfPresentationModeControls';\n                var MOUSE_SCROLL_COOLDOWN_TIME = 50;\n                var PAGE_SWITCH_THRESHOLD = 0.1;\n                var SWIPE_MIN_DISTANCE_THRESHOLD = 50;\n                var SWIPE_ANGLE_THRESHOLD = Math.PI / 6;\n\n                var PDFPresentationMode = function () {\n                    function PDFPresentationMode(_ref) {\n                        var _this = this;\n\n                        var container = _ref.container,\n                            _ref$viewer = _ref.viewer,\n                            viewer = _ref$viewer === undefined ? null : _ref$viewer,\n                            pdfViewer = _ref.pdfViewer,\n                            eventBus = _ref.eventBus,\n                            _ref$contextMenuItems = _ref.contextMenuItems,\n                            contextMenuItems = _ref$contextMenuItems === undefined ? null : _ref$contextMenuItems;\n\n                        _classCallCheck(this, PDFPresentationMode);\n\n                        this.container = container;\n                        this.viewer = viewer || container.firstElementChild;\n                        this.pdfViewer = pdfViewer;\n                        this.eventBus = eventBus;\n                        this.active = false;\n                        this.args = null;\n                        this.contextMenuOpen = false;\n                        this.mouseScrollTimeStamp = 0;\n                        this.mouseScrollDelta = 0;\n                        this.touchSwipeState = null;\n                        if (contextMenuItems) {\n                            contextMenuItems.contextFirstPage.addEventListener('click', function () {\n                                _this.contextMenuOpen = false;\n                                _this.eventBus.dispatch('firstpage');\n                            });\n                            contextMenuItems.contextLastPage.addEventListener('click', function () {\n                                _this.contextMenuOpen = false;\n                                _this.eventBus.dispatch('lastpage');\n                            });\n                            contextMenuItems.contextPageRotateCw.addEventListener('click', function () {\n                                _this.contextMenuOpen = false;\n                                _this.eventBus.dispatch('rotatecw');\n                            });\n                            contextMenuItems.contextPageRotateCcw.addEventListener('click', function () {\n                                _this.contextMenuOpen = false;\n                                _this.eventBus.dispatch('rotateccw');\n                            });\n                        }\n                    }\n\n                    _createClass(PDFPresentationMode, [{\n                        key: 'request',\n                        value: function request() {\n                            if (this.switchInProgress || this.active || !this.viewer.hasChildNodes()) {\n                                return false;\n                            }\n                            this._addFullscreenChangeListeners();\n                            this._setSwitchInProgress();\n                            this._notifyStateChange();\n                            if (this.container.requestFullscreen) {\n                                this.container.requestFullscreen();\n                            } else if (this.container.mozRequestFullScreen) {\n                                this.container.mozRequestFullScreen();\n                            } else if (this.container.webkitRequestFullscreen) {\n                                this.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);\n                            } else if (this.container.msRequestFullscreen) {\n                                this.container.msRequestFullscreen();\n                            } else {\n                                return false;\n                            }\n                            this.args = {\n                                page: this.pdfViewer.currentPageNumber,\n                                previousScale: this.pdfViewer.currentScaleValue\n                            };\n                            return true;\n                        }\n                    }, {\n                        key: '_mouseWheel',\n                        value: function _mouseWheel(evt) {\n                            if (!this.active) {\n                                return;\n                            }\n                            evt.preventDefault();\n                            var delta = (0, _ui_utils.normalizeWheelEventDelta)(evt);\n                            var currentTime = new Date().getTime();\n                            var storedTime = this.mouseScrollTimeStamp;\n                            if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) {\n                                return;\n                            }\n                            if (this.mouseScrollDelta > 0 && delta < 0 || this.mouseScrollDelta < 0 && delta > 0) {\n                                this._resetMouseScrollState();\n                            }\n                            this.mouseScrollDelta += delta;\n                            if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) {\n                                var totalDelta = this.mouseScrollDelta;\n                                this._resetMouseScrollState();\n                                var success = totalDelta > 0 ? this._goToPreviousPage() : this._goToNextPage();\n                                if (success) {\n                                    this.mouseScrollTimeStamp = currentTime;\n                                }\n                            }\n                        }\n                    }, {\n                        key: '_goToPreviousPage',\n                        value: function _goToPreviousPage() {\n                            var page = this.pdfViewer.currentPageNumber;\n                            if (page <= 1) {\n                                return false;\n                            }\n                            this.pdfViewer.currentPageNumber = page - 1;\n                            return true;\n                        }\n                    }, {\n                        key: '_goToNextPage',\n                        value: function _goToNextPage() {\n                            var page = this.pdfViewer.currentPageNumber;\n                            if (page >= this.pdfViewer.pagesCount) {\n                                return false;\n                            }\n                            this.pdfViewer.currentPageNumber = page + 1;\n                            return true;\n                        }\n                    }, {\n                        key: '_notifyStateChange',\n                        value: function _notifyStateChange() {\n                            this.eventBus.dispatch('presentationmodechanged', {\n                                source: this,\n                                active: this.active,\n                                switchInProgress: !!this.switchInProgress\n                            });\n                        }\n                    }, {\n                        key: '_setSwitchInProgress',\n                        value: function _setSwitchInProgress() {\n                            var _this2 = this;\n\n                            if (this.switchInProgress) {\n                                clearTimeout(this.switchInProgress);\n                            }\n                            this.switchInProgress = setTimeout(function () {\n                                _this2._removeFullscreenChangeListeners();\n                                delete _this2.switchInProgress;\n                                _this2._notifyStateChange();\n                            }, DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);\n                        }\n                    }, {\n                        key: '_resetSwitchInProgress',\n                        value: function _resetSwitchInProgress() {\n                            if (this.switchInProgress) {\n                                clearTimeout(this.switchInProgress);\n                                delete this.switchInProgress;\n                            }\n                        }\n                    }, {\n                        key: '_enter',\n                        value: function _enter() {\n                            var _this3 = this;\n\n                            this.active = true;\n                            this._resetSwitchInProgress();\n                            this._notifyStateChange();\n                            this.container.classList.add(ACTIVE_SELECTOR);\n                            setTimeout(function () {\n                                _this3.pdfViewer.currentPageNumber = _this3.args.page;\n                                _this3.pdfViewer.currentScaleValue = 'page-fit';\n                            }, 0);\n                            this._addWindowListeners();\n                            this._showControls();\n                            this.contextMenuOpen = false;\n                            this.container.setAttribute('contextmenu', 'viewerContextMenu');\n                            window.getSelection().removeAllRanges();\n                        }\n                    }, {\n                        key: '_exit',\n                        value: function _exit() {\n                            var _this4 = this;\n\n                            var page = this.pdfViewer.currentPageNumber;\n                            this.container.classList.remove(ACTIVE_SELECTOR);\n                            setTimeout(function () {\n                                _this4.active = false;\n                                _this4._removeFullscreenChangeListeners();\n                                _this4._notifyStateChange();\n                                _this4.pdfViewer.currentScaleValue = _this4.args.previousScale;\n                                _this4.pdfViewer.currentPageNumber = page;\n                                _this4.args = null;\n                            }, 0);\n                            this._removeWindowListeners();\n                            this._hideControls();\n                            this._resetMouseScrollState();\n                            this.container.removeAttribute('contextmenu');\n                            this.contextMenuOpen = false;\n                        }\n                    }, {\n                        key: '_mouseDown',\n                        value: function _mouseDown(evt) {\n                            if (this.contextMenuOpen) {\n                                this.contextMenuOpen = false;\n                                evt.preventDefault();\n                                return;\n                            }\n                            if (evt.button === 0) {\n                                var isInternalLink = evt.target.href && evt.target.classList.contains('internalLink');\n                                if (!isInternalLink) {\n                                    evt.preventDefault();\n                                    if (evt.shiftKey) {\n                                        this._goToPreviousPage();\n                                    } else {\n                                        this._goToNextPage();\n                                    }\n                                }\n                            }\n                        }\n                    }, {\n                        key: '_contextMenu',\n                        value: function _contextMenu() {\n                            this.contextMenuOpen = true;\n                        }\n                    }, {\n                        key: '_showControls',\n                        value: function _showControls() {\n                            var _this5 = this;\n\n                            if (this.controlsTimeout) {\n                                clearTimeout(this.controlsTimeout);\n                            } else {\n                                this.container.classList.add(CONTROLS_SELECTOR);\n                            }\n                            this.controlsTimeout = setTimeout(function () {\n                                _this5.container.classList.remove(CONTROLS_SELECTOR);\n                                delete _this5.controlsTimeout;\n                            }, DELAY_BEFORE_HIDING_CONTROLS);\n                        }\n                    }, {\n                        key: '_hideControls',\n                        value: function _hideControls() {\n                            if (!this.controlsTimeout) {\n                                return;\n                            }\n                            clearTimeout(this.controlsTimeout);\n                            this.container.classList.remove(CONTROLS_SELECTOR);\n                            delete this.controlsTimeout;\n                        }\n                    }, {\n                        key: '_resetMouseScrollState',\n                        value: function _resetMouseScrollState() {\n                            this.mouseScrollTimeStamp = 0;\n                            this.mouseScrollDelta = 0;\n                        }\n                    }, {\n                        key: '_touchSwipe',\n                        value: function _touchSwipe(evt) {\n                            if (!this.active) {\n                                return;\n                            }\n                            if (evt.touches.length > 1) {\n                                this.touchSwipeState = null;\n                                return;\n                            }\n                            switch (evt.type) {\n                                case 'touchstart':\n                                    this.touchSwipeState = {\n                                        startX: evt.touches[0].pageX,\n                                        startY: evt.touches[0].pageY,\n                                        endX: evt.touches[0].pageX,\n                                        endY: evt.touches[0].pageY\n                                    };\n                                    break;\n                                case 'touchmove':\n                                    if (this.touchSwipeState === null) {\n                                        return;\n                                    }\n                                    this.touchSwipeState.endX = evt.touches[0].pageX;\n                                    this.touchSwipeState.endY = evt.touches[0].pageY;\n                                    evt.preventDefault();\n                                    break;\n                                case 'touchend':\n                                    if (this.touchSwipeState === null) {\n                                        return;\n                                    }\n                                    var delta = 0;\n                                    var dx = this.touchSwipeState.endX - this.touchSwipeState.startX;\n                                    var dy = this.touchSwipeState.endY - this.touchSwipeState.startY;\n                                    var absAngle = Math.abs(Math.atan2(dy, dx));\n                                    if (Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD && (absAngle <= SWIPE_ANGLE_THRESHOLD || absAngle >= Math.PI - SWIPE_ANGLE_THRESHOLD)) {\n                                        delta = dx;\n                                    } else if (Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD && Math.abs(absAngle - Math.PI / 2) <= SWIPE_ANGLE_THRESHOLD) {\n                                        delta = dy;\n                                    }\n                                    if (delta > 0) {\n                                        this._goToPreviousPage();\n                                    } else if (delta < 0) {\n                                        this._goToNextPage();\n                                    }\n                                    break;\n                            }\n                        }\n                    }, {\n                        key: '_addWindowListeners',\n                        value: function _addWindowListeners() {\n                            this.showControlsBind = this._showControls.bind(this);\n                            this.mouseDownBind = this._mouseDown.bind(this);\n                            this.mouseWheelBind = this._mouseWheel.bind(this);\n                            this.resetMouseScrollStateBind = this._resetMouseScrollState.bind(this);\n                            this.contextMenuBind = this._contextMenu.bind(this);\n                            this.touchSwipeBind = this._touchSwipe.bind(this);\n                            window.addEventListener('mousemove', this.showControlsBind);\n                            window.addEventListener('mousedown', this.mouseDownBind);\n                            window.addEventListener('wheel', this.mouseWheelBind);\n                            window.addEventListener('keydown', this.resetMouseScrollStateBind);\n                            window.addEventListener('contextmenu', this.contextMenuBind);\n                            window.addEventListener('touchstart', this.touchSwipeBind);\n                            window.addEventListener('touchmove', this.touchSwipeBind);\n                            window.addEventListener('touchend', this.touchSwipeBind);\n                        }\n                    }, {\n                        key: '_removeWindowListeners',\n                        value: function _removeWindowListeners() {\n                            window.removeEventListener('mousemove', this.showControlsBind);\n                            window.removeEventListener('mousedown', this.mouseDownBind);\n                            window.removeEventListener('wheel', this.mouseWheelBind);\n                            window.removeEventListener('keydown', this.resetMouseScrollStateBind);\n                            window.removeEventListener('contextmenu', this.contextMenuBind);\n                            window.removeEventListener('touchstart', this.touchSwipeBind);\n                            window.removeEventListener('touchmove', this.touchSwipeBind);\n                            window.removeEventListener('touchend', this.touchSwipeBind);\n                            delete this.showControlsBind;\n                            delete this.mouseDownBind;\n                            delete this.mouseWheelBind;\n                            delete this.resetMouseScrollStateBind;\n                            delete this.contextMenuBind;\n                            delete this.touchSwipeBind;\n                        }\n                    }, {\n                        key: '_fullscreenChange',\n                        value: function _fullscreenChange() {\n                            if (this.isFullscreen) {\n                                this._enter();\n                            } else {\n                                this._exit();\n                            }\n                        }\n                    }, {\n                        key: '_addFullscreenChangeListeners',\n                        value: function _addFullscreenChangeListeners() {\n                            this.fullscreenChangeBind = this._fullscreenChange.bind(this);\n                            window.addEventListener('fullscreenchange', this.fullscreenChangeBind);\n                            window.addEventListener('mozfullscreenchange', this.fullscreenChangeBind);\n                            window.addEventListener('webkitfullscreenchange', this.fullscreenChangeBind);\n                            window.addEventListener('MSFullscreenChange', this.fullscreenChangeBind);\n                        }\n                    }, {\n                        key: '_removeFullscreenChangeListeners',\n                        value: function _removeFullscreenChangeListeners() {\n                            window.removeEventListener('fullscreenchange', this.fullscreenChangeBind);\n                            window.removeEventListener('mozfullscreenchange', this.fullscreenChangeBind);\n                            window.removeEventListener('webkitfullscreenchange', this.fullscreenChangeBind);\n                            window.removeEventListener('MSFullscreenChange', this.fullscreenChangeBind);\n                            delete this.fullscreenChangeBind;\n                        }\n                    }, {\n                        key: 'isFullscreen',\n                        get: function get() {\n                            return !!(document.fullscreenElement || document.mozFullScreen || document.webkitIsFullScreen || document.msFullscreenElement);\n                        }\n                    }]);\n\n                    return PDFPresentationMode;\n                }();\n\n                exports.PDFPresentationMode = PDFPresentationMode;\n\n                /***/\n            }),\n        /* 24 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFSidebar = exports.SidebarView = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdf_rendering_queue = __webpack_require__(3);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var UI_NOTIFICATION_CLASS = 'pdfSidebarNotification';\n                var SidebarView = {\n                    NONE: 0,\n                    THUMBS: 1,\n                    OUTLINE: 2,\n                    ATTACHMENTS: 3\n                };\n\n                var PDFSidebar = function () {\n                    function PDFSidebar(options) {\n                        var l10n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _ui_utils.NullL10n;\n\n                        _classCallCheck(this, PDFSidebar);\n\n                        this.isOpen = false;\n                        this.active = SidebarView.THUMBS;\n                        this.isInitialViewSet = false;\n                        this.onToggled = null;\n                        this.pdfViewer = options.pdfViewer;\n                        this.pdfThumbnailViewer = options.pdfThumbnailViewer;\n                        this.pdfOutlineViewer = options.pdfOutlineViewer;\n                        this.mainContainer = options.mainContainer;\n                        this.outerContainer = options.outerContainer;\n                        this.eventBus = options.eventBus;\n                        this.toggleButton = options.toggleButton;\n                        this.thumbnailButton = options.thumbnailButton;\n                        this.outlineButton = options.outlineButton;\n                        this.attachmentsButton = options.attachmentsButton;\n                        this.thumbnailView = options.thumbnailView;\n                        this.outlineView = options.outlineView;\n                        this.attachmentsView = options.attachmentsView;\n                        this.disableNotification = options.disableNotification || false;\n                        this.l10n = l10n;\n                        this._addEventListeners();\n                    }\n\n                    _createClass(PDFSidebar, [{\n                        key: 'reset',\n                        value: function reset() {\n                            this.isInitialViewSet = false;\n                            this._hideUINotification(null);\n                            this.switchView(SidebarView.THUMBS);\n                            this.outlineButton.disabled = false;\n                            this.attachmentsButton.disabled = false;\n                        }\n                    }, {\n                        key: 'setInitialView',\n                        value: function setInitialView(view) {\n                            if (this.isInitialViewSet) {\n                                return;\n                            }\n                            this.isInitialViewSet = true;\n                            if (this.isOpen && view === SidebarView.NONE) {\n                                this._dispatchEvent();\n                                return;\n                            }\n                            var isViewPreserved = view === this.visibleView;\n                            this.switchView(view, true);\n                            if (isViewPreserved) {\n                                this._dispatchEvent();\n                            }\n                        }\n                    }, {\n                        key: 'switchView',\n                        value: function switchView(view) {\n                            var forceOpen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n                            if (view === SidebarView.NONE) {\n                                this.close();\n                                return;\n                            }\n                            var isViewChanged = view !== this.active;\n                            var shouldForceRendering = false;\n                            switch (view) {\n                                case SidebarView.THUMBS:\n                                    this.thumbnailButton.classList.add('toggled');\n                                    this.outlineButton.classList.remove('toggled');\n                                    this.attachmentsButton.classList.remove('toggled');\n                                    this.thumbnailView.classList.remove('hidden');\n                                    this.outlineView.classList.add('hidden');\n                                    this.attachmentsView.classList.add('hidden');\n                                    if (this.isOpen && isViewChanged) {\n                                        this._updateThumbnailViewer();\n                                        shouldForceRendering = true;\n                                    }\n                                    break;\n                                case SidebarView.OUTLINE:\n                                    if (this.outlineButton.disabled) {\n                                        return;\n                                    }\n                                    this.thumbnailButton.classList.remove('toggled');\n                                    this.outlineButton.classList.add('toggled');\n                                    this.attachmentsButton.classList.remove('toggled');\n                                    this.thumbnailView.classList.add('hidden');\n                                    this.outlineView.classList.remove('hidden');\n                                    this.attachmentsView.classList.add('hidden');\n                                    break;\n                                case SidebarView.ATTACHMENTS:\n                                    if (this.attachmentsButton.disabled) {\n                                        return;\n                                    }\n                                    this.thumbnailButton.classList.remove('toggled');\n                                    this.outlineButton.classList.remove('toggled');\n                                    this.attachmentsButton.classList.add('toggled');\n                                    this.thumbnailView.classList.add('hidden');\n                                    this.outlineView.classList.add('hidden');\n                                    this.attachmentsView.classList.remove('hidden');\n                                    break;\n                                default:\n                                    console.error('PDFSidebar_switchView: \"' + view + '\" is an unsupported value.');\n                                    return;\n                            }\n                            this.active = view | 0;\n                            if (forceOpen && !this.isOpen) {\n                                this.open();\n                                return;\n                            }\n                            if (shouldForceRendering) {\n                                this._forceRendering();\n                            }\n                            if (isViewChanged) {\n                                this._dispatchEvent();\n                            }\n                            this._hideUINotification(this.active);\n                        }\n                    }, {\n                        key: 'open',\n                        value: function open() {\n                            if (this.isOpen) {\n                                return;\n                            }\n                            this.isOpen = true;\n                            this.toggleButton.classList.add('toggled');\n                            this.outerContainer.classList.add('sidebarMoving');\n                            this.outerContainer.classList.add('sidebarOpen');\n                            if (this.active === SidebarView.THUMBS) {\n                                this._updateThumbnailViewer();\n                            }\n                            this._forceRendering();\n                            this._dispatchEvent();\n                            this._hideUINotification(this.active);\n                        }\n                    }, {\n                        key: 'close',\n                        value: function close() {\n                            if (!this.isOpen) {\n                                return;\n                            }\n                            this.isOpen = false;\n                            this.toggleButton.classList.remove('toggled');\n                            this.outerContainer.classList.add('sidebarMoving');\n                            this.outerContainer.classList.remove('sidebarOpen');\n                            this._forceRendering();\n                            this._dispatchEvent();\n                        }\n                    }, {\n                        key: 'toggle',\n                        value: function toggle() {\n                            if (this.isOpen) {\n                                this.close();\n                            } else {\n                                this.open();\n                            }\n                        }\n                    }, {\n                        key: '_dispatchEvent',\n                        value: function _dispatchEvent() {\n                            this.eventBus.dispatch('sidebarviewchanged', {\n                                source: this,\n                                view: this.visibleView\n                            });\n                        }\n                    }, {\n                        key: '_forceRendering',\n                        value: function _forceRendering() {\n                            if (this.onToggled) {\n                                this.onToggled();\n                            } else {\n                                this.pdfViewer.forceRendering();\n                                this.pdfThumbnailViewer.forceRendering();\n                            }\n                        }\n                    }, {\n                        key: '_updateThumbnailViewer',\n                        value: function _updateThumbnailViewer() {\n                            var pdfViewer = this.pdfViewer,\n                                pdfThumbnailViewer = this.pdfThumbnailViewer;\n\n                            var pagesCount = pdfViewer.pagesCount;\n                            for (var pageIndex = 0; pageIndex < pagesCount; pageIndex++) {\n                                var pageView = pdfViewer.getPageView(pageIndex);\n                                if (pageView && pageView.renderingState === _pdf_rendering_queue.RenderingStates.FINISHED) {\n                                    var thumbnailView = pdfThumbnailViewer.getThumbnail(pageIndex);\n                                    thumbnailView.setImage(pageView);\n                                }\n                            }\n                            pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber);\n                        }\n                    }, {\n                        key: '_showUINotification',\n                        value: function _showUINotification(view) {\n                            var _this = this;\n\n                            if (this.disableNotification) {\n                                return;\n                            }\n                            this.l10n.get('toggle_sidebar_notification.title', null, 'Toggle Sidebar (document contains outline/attachments)').then(function (msg) {\n                                _this.toggleButton.title = msg;\n                            });\n                            if (!this.isOpen) {\n                                this.toggleButton.classList.add(UI_NOTIFICATION_CLASS);\n                            } else if (view === this.active) {\n                                return;\n                            }\n                            switch (view) {\n                                case SidebarView.OUTLINE:\n                                    this.outlineButton.classList.add(UI_NOTIFICATION_CLASS);\n                                    break;\n                                case SidebarView.ATTACHMENTS:\n                                    this.attachmentsButton.classList.add(UI_NOTIFICATION_CLASS);\n                                    break;\n                            }\n                        }\n                    }, {\n                        key: '_hideUINotification',\n                        value: function _hideUINotification(view) {\n                            var _this2 = this;\n\n                            if (this.disableNotification) {\n                                return;\n                            }\n                            var removeNotification = function removeNotification(view) {\n                                switch (view) {\n                                    case SidebarView.OUTLINE:\n                                        _this2.outlineButton.classList.remove(UI_NOTIFICATION_CLASS);\n                                        break;\n                                    case SidebarView.ATTACHMENTS:\n                                        _this2.attachmentsButton.classList.remove(UI_NOTIFICATION_CLASS);\n                                        break;\n                                }\n                            };\n                            if (!this.isOpen && view !== null) {\n                                return;\n                            }\n                            this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS);\n                            if (view !== null) {\n                                removeNotification(view);\n                                return;\n                            }\n                            for (view in SidebarView) {\n                                removeNotification(SidebarView[view]);\n                            }\n                            this.l10n.get('toggle_sidebar.title', null, 'Toggle Sidebar').then(function (msg) {\n                                _this2.toggleButton.title = msg;\n                            });\n                        }\n                    }, {\n                        key: '_addEventListeners',\n                        value: function _addEventListeners() {\n                            var _this3 = this;\n\n                            this.mainContainer.addEventListener('transitionend', function (evt) {\n                                if (evt.target === _this3.mainContainer) {\n                                    _this3.outerContainer.classList.remove('sidebarMoving');\n                                }\n                            });\n                            this.thumbnailButton.addEventListener('click', function () {\n                                _this3.switchView(SidebarView.THUMBS);\n                            });\n                            this.outlineButton.addEventListener('click', function () {\n                                _this3.switchView(SidebarView.OUTLINE);\n                            });\n                            this.outlineButton.addEventListener('dblclick', function () {\n                                _this3.pdfOutlineViewer.toggleOutlineTree();\n                            });\n                            this.attachmentsButton.addEventListener('click', function () {\n                                _this3.switchView(SidebarView.ATTACHMENTS);\n                            });\n                            this.eventBus.on('outlineloaded', function (evt) {\n                                var outlineCount = evt.outlineCount;\n                                _this3.outlineButton.disabled = !outlineCount;\n                                if (outlineCount) {\n                                    _this3._showUINotification(SidebarView.OUTLINE);\n                                } else if (_this3.active === SidebarView.OUTLINE) {\n                                    _this3.switchView(SidebarView.THUMBS);\n                                }\n                            });\n                            this.eventBus.on('attachmentsloaded', function (evt) {\n                                var attachmentsCount = evt.attachmentsCount;\n                                _this3.attachmentsButton.disabled = !attachmentsCount;\n                                if (attachmentsCount) {\n                                    _this3._showUINotification(SidebarView.ATTACHMENTS);\n                                } else if (_this3.active === SidebarView.ATTACHMENTS) {\n                                    _this3.switchView(SidebarView.THUMBS);\n                                }\n                            });\n                            this.eventBus.on('presentationmodechanged', function (evt) {\n                                if (!evt.active && !evt.switchInProgress && _this3.isThumbnailViewVisible) {\n                                    _this3._updateThumbnailViewer();\n                                }\n                            });\n                        }\n                    }, {\n                        key: 'visibleView',\n                        get: function get() {\n                            return this.isOpen ? this.active : SidebarView.NONE;\n                        }\n                    }, {\n                        key: 'isThumbnailViewVisible',\n                        get: function get() {\n                            return this.isOpen && this.active === SidebarView.THUMBS;\n                        }\n                    }, {\n                        key: 'isOutlineViewVisible',\n                        get: function get() {\n                            return this.isOpen && this.active === SidebarView.OUTLINE;\n                        }\n                    }, {\n                        key: 'isAttachmentsViewVisible',\n                        get: function get() {\n                            return this.isOpen && this.active === SidebarView.ATTACHMENTS;\n                        }\n                    }]);\n\n                    return PDFSidebar;\n                }();\n\n                exports.SidebarView = SidebarView;\n                exports.PDFSidebar = PDFSidebar;\n\n                /***/\n            }),\n        /* 25 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFThumbnailView = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdf_rendering_queue = __webpack_require__(3);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var MAX_NUM_SCALING_STEPS = 3;\n                var THUMBNAIL_CANVAS_BORDER_WIDTH = 1;\n                var THUMBNAIL_WIDTH = 98;\n                var TempImageFactory = function TempImageFactoryClosure() {\n                    var tempCanvasCache = null;\n                    return {\n                        getCanvas: function getCanvas(width, height) {\n                            var tempCanvas = tempCanvasCache;\n                            if (!tempCanvas) {\n                                tempCanvas = document.createElement('canvas');\n                                tempCanvasCache = tempCanvas;\n                            }\n                            tempCanvas.width = width;\n                            tempCanvas.height = height;\n                            tempCanvas.mozOpaque = true;\n                            var ctx = tempCanvas.getContext('2d', { alpha: false });\n                            ctx.save();\n                            ctx.fillStyle = 'rgb(255, 255, 255)';\n                            ctx.fillRect(0, 0, width, height);\n                            ctx.restore();\n                            return tempCanvas;\n                        },\n                        destroyCanvas: function destroyCanvas() {\n                            var tempCanvas = tempCanvasCache;\n                            if (tempCanvas) {\n                                tempCanvas.width = 0;\n                                tempCanvas.height = 0;\n                            }\n                            tempCanvasCache = null;\n                        }\n                    };\n                }();\n\n                var PDFThumbnailView = function () {\n                    function PDFThumbnailView(_ref) {\n                        var container = _ref.container,\n                            id = _ref.id,\n                            defaultViewport = _ref.defaultViewport,\n                            linkService = _ref.linkService,\n                            renderingQueue = _ref.renderingQueue,\n                            _ref$disableCanvasToI = _ref.disableCanvasToImageConversion,\n                            disableCanvasToImageConversion = _ref$disableCanvasToI === undefined ? false : _ref$disableCanvasToI,\n                            _ref$l10n = _ref.l10n,\n                            l10n = _ref$l10n === undefined ? _ui_utils.NullL10n : _ref$l10n;\n\n                        _classCallCheck(this, PDFThumbnailView);\n\n                        this.id = id;\n                        this.renderingId = 'thumbnail' + id;\n                        this.pageLabel = null;\n                        this.pdfPage = null;\n                        this.rotation = 0;\n                        this.viewport = defaultViewport;\n                        this.pdfPageRotate = defaultViewport.rotation;\n                        this.linkService = linkService;\n                        this.renderingQueue = renderingQueue;\n                        this.renderTask = null;\n                        this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\n                        this.resume = null;\n                        this.disableCanvasToImageConversion = disableCanvasToImageConversion;\n                        this.pageWidth = this.viewport.width;\n                        this.pageHeight = this.viewport.height;\n                        this.pageRatio = this.pageWidth / this.pageHeight;\n                        this.canvasWidth = THUMBNAIL_WIDTH;\n                        this.canvasHeight = this.canvasWidth / this.pageRatio | 0;\n                        this.scale = this.canvasWidth / this.pageWidth;\n                        this.l10n = l10n;\n                        var anchor = document.createElement('a');\n                        anchor.href = linkService.getAnchorUrl('#page=' + id);\n                        this.l10n.get('thumb_page_title', { page: id }, 'Page {{page}}').then(function (msg) {\n                            anchor.title = msg;\n                        });\n                        anchor.onclick = function () {\n                            linkService.page = id;\n                            return false;\n                        };\n                        this.anchor = anchor;\n                        var div = document.createElement('div');\n                        div.className = 'thumbnail';\n                        div.setAttribute('data-page-number', this.id);\n                        this.div = div;\n                        if (id === 1) {\n                            div.classList.add('selected');\n                        }\n                        var ring = document.createElement('div');\n                        ring.className = 'thumbnailSelectionRing';\n                        var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;\n                        ring.style.width = this.canvasWidth + borderAdjustment + 'px';\n                        ring.style.height = this.canvasHeight + borderAdjustment + 'px';\n                        this.ring = ring;\n                        div.appendChild(ring);\n                        anchor.appendChild(div);\n                        container.appendChild(anchor);\n                    }\n\n                    _createClass(PDFThumbnailView, [{\n                        key: 'setPdfPage',\n                        value: function setPdfPage(pdfPage) {\n                            this.pdfPage = pdfPage;\n                            this.pdfPageRotate = pdfPage.rotate;\n                            var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n                            this.viewport = pdfPage.getViewport(1, totalRotation);\n                            this.reset();\n                        }\n                    }, {\n                        key: 'reset',\n                        value: function reset() {\n                            this.cancelRendering();\n                            this.pageWidth = this.viewport.width;\n                            this.pageHeight = this.viewport.height;\n                            this.pageRatio = this.pageWidth / this.pageHeight;\n                            this.canvasHeight = this.canvasWidth / this.pageRatio | 0;\n                            this.scale = this.canvasWidth / this.pageWidth;\n                            this.div.removeAttribute('data-loaded');\n                            var ring = this.ring;\n                            var childNodes = ring.childNodes;\n                            for (var i = childNodes.length - 1; i >= 0; i--) {\n                                ring.removeChild(childNodes[i]);\n                            }\n                            var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;\n                            ring.style.width = this.canvasWidth + borderAdjustment + 'px';\n                            ring.style.height = this.canvasHeight + borderAdjustment + 'px';\n                            if (this.canvas) {\n                                this.canvas.width = 0;\n                                this.canvas.height = 0;\n                                delete this.canvas;\n                            }\n                            if (this.image) {\n                                this.image.removeAttribute('src');\n                                delete this.image;\n                            }\n                        }\n                    }, {\n                        key: 'update',\n                        value: function update(rotation) {\n                            if (typeof rotation !== 'undefined') {\n                                this.rotation = rotation;\n                            }\n                            var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n                            this.viewport = this.viewport.clone({\n                                scale: 1,\n                                rotation: totalRotation\n                            });\n                            this.reset();\n                        }\n                    }, {\n                        key: 'cancelRendering',\n                        value: function cancelRendering() {\n                            if (this.renderTask) {\n                                this.renderTask.cancel();\n                                this.renderTask = null;\n                            }\n                            this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\n                            this.resume = null;\n                        }\n                    }, {\n                        key: '_getPageDrawContext',\n                        value: function _getPageDrawContext() {\n                            var noCtxScale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n                            var canvas = document.createElement('canvas');\n                            this.canvas = canvas;\n                            canvas.mozOpaque = true;\n                            var ctx = canvas.getContext('2d', { alpha: false });\n                            var outputScale = (0, _ui_utils.getOutputScale)(ctx);\n                            canvas.width = this.canvasWidth * outputScale.sx | 0;\n                            canvas.height = this.canvasHeight * outputScale.sy | 0;\n                            canvas.style.width = this.canvasWidth + 'px';\n                            canvas.style.height = this.canvasHeight + 'px';\n                            if (!noCtxScale && outputScale.scaled) {\n                                ctx.scale(outputScale.sx, outputScale.sy);\n                            }\n                            return ctx;\n                        }\n                    }, {\n                        key: '_convertCanvasToImage',\n                        value: function _convertCanvasToImage() {\n                            var _this = this;\n\n                            if (!this.canvas) {\n                                return;\n                            }\n                            if (this.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {\n                                return;\n                            }\n                            var id = this.renderingId;\n                            var className = 'thumbnailImage';\n                            if (this.disableCanvasToImageConversion) {\n                                this.canvas.id = id;\n                                this.canvas.className = className;\n                                this.l10n.get('thumb_page_canvas', { page: this.pageId }, 'Thumbnail of Page {{page}}').then(function (msg) {\n                                    _this.canvas.setAttribute('aria-label', msg);\n                                });\n                                this.div.setAttribute('data-loaded', true);\n                                this.ring.appendChild(this.canvas);\n                                return;\n                            }\n                            var image = document.createElement('img');\n                            image.id = id;\n                            image.className = className;\n                            this.l10n.get('thumb_page_canvas', { page: this.pageId }, 'Thumbnail of Page {{page}}').then(function (msg) {\n                                image.setAttribute('aria-label', msg);\n                            });\n                            image.style.width = this.canvasWidth + 'px';\n                            image.style.height = this.canvasHeight + 'px';\n                            image.src = this.canvas.toDataURL();\n                            this.image = image;\n                            this.div.setAttribute('data-loaded', true);\n                            this.ring.appendChild(image);\n                            this.canvas.width = 0;\n                            this.canvas.height = 0;\n                            delete this.canvas;\n                        }\n                    }, {\n                        key: 'draw',\n                        value: function draw() {\n                            var _this2 = this;\n\n                            if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {\n                                console.error('Must be in new state before drawing');\n                                return Promise.resolve(undefined);\n                            }\n                            this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\n                            var renderCapability = (0, _pdfjsLib.createPromiseCapability)();\n                            var finishRenderTask = function finishRenderTask(error) {\n                                if (renderTask === _this2.renderTask) {\n                                    _this2.renderTask = null;\n                                }\n                                if (error === 'cancelled' || error instanceof _pdfjsLib.RenderingCancelledException) {\n                                    renderCapability.resolve(undefined);\n                                    return;\n                                }\n                                _this2.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n                                _this2._convertCanvasToImage();\n                                if (!error) {\n                                    renderCapability.resolve(undefined);\n                                } else {\n                                    renderCapability.reject(error);\n                                }\n                            };\n                            var ctx = this._getPageDrawContext();\n                            var drawViewport = this.viewport.clone({ scale: this.scale });\n                            var renderContinueCallback = function renderContinueCallback(cont) {\n                                if (!_this2.renderingQueue.isHighestPriority(_this2)) {\n                                    _this2.renderingState = _pdf_rendering_queue.RenderingStates.PAUSED;\n                                    _this2.resume = function () {\n                                        _this2.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\n                                        cont();\n                                    };\n                                    return;\n                                }\n                                cont();\n                            };\n                            var renderContext = {\n                                canvasContext: ctx,\n                                viewport: drawViewport\n                            };\n                            var renderTask = this.renderTask = this.pdfPage.render(renderContext);\n                            renderTask.onContinue = renderContinueCallback;\n                            renderTask.promise.then(function () {\n                                finishRenderTask(null);\n                            }, function (error) {\n                                finishRenderTask(error);\n                            });\n                            return renderCapability.promise;\n                        }\n                    }, {\n                        key: 'setImage',\n                        value: function setImage(pageView) {\n                            if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {\n                                return;\n                            }\n                            var img = pageView.canvas;\n                            if (!img) {\n                                return;\n                            }\n                            if (!this.pdfPage) {\n                                this.setPdfPage(pageView.pdfPage);\n                            }\n                            this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n                            var ctx = this._getPageDrawContext(true);\n                            var canvas = ctx.canvas;\n                            if (img.width <= 2 * canvas.width) {\n                                ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height);\n                                this._convertCanvasToImage();\n                                return;\n                            }\n                            var reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS;\n                            var reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS;\n                            var reducedImage = TempImageFactory.getCanvas(reducedWidth, reducedHeight);\n                            var reducedImageCtx = reducedImage.getContext('2d');\n                            while (reducedWidth > img.width || reducedHeight > img.height) {\n                                reducedWidth >>= 1;\n                                reducedHeight >>= 1;\n                            }\n                            reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, 0, 0, reducedWidth, reducedHeight);\n                            while (reducedWidth > 2 * canvas.width) {\n                                reducedImageCtx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, reducedWidth >> 1, reducedHeight >> 1);\n                                reducedWidth >>= 1;\n                                reducedHeight >>= 1;\n                            }\n                            ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, canvas.width, canvas.height);\n                            this._convertCanvasToImage();\n                        }\n                    }, {\n                        key: 'setPageLabel',\n                        value: function setPageLabel(label) {\n                            var _this3 = this;\n\n                            this.pageLabel = typeof label === 'string' ? label : null;\n                            this.l10n.get('thumb_page_title', { page: this.pageId }, 'Page {{page}}').then(function (msg) {\n                                _this3.anchor.title = msg;\n                            });\n                            if (this.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {\n                                return;\n                            }\n                            this.l10n.get('thumb_page_canvas', { page: this.pageId }, 'Thumbnail of Page {{page}}').then(function (ariaLabel) {\n                                if (_this3.image) {\n                                    _this3.image.setAttribute('aria-label', ariaLabel);\n                                } else if (_this3.disableCanvasToImageConversion && _this3.canvas) {\n                                    _this3.canvas.setAttribute('aria-label', ariaLabel);\n                                }\n                            });\n                        }\n                    }, {\n                        key: 'pageId',\n                        get: function get() {\n                            return this.pageLabel !== null ? this.pageLabel : this.id;\n                        }\n                    }], [{\n                        key: 'cleanup',\n                        value: function cleanup() {\n                            TempImageFactory.destroyCanvas();\n                        }\n                    }]);\n\n                    return PDFThumbnailView;\n                }();\n\n                exports.PDFThumbnailView = PDFThumbnailView;\n\n                /***/\n            }),\n        /* 26 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFThumbnailViewer = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdf_thumbnail_view = __webpack_require__(25);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var THUMBNAIL_SCROLL_MARGIN = -19;\n\n                var PDFThumbnailViewer = function () {\n                    function PDFThumbnailViewer(_ref) {\n                        var container = _ref.container,\n                            linkService = _ref.linkService,\n                            renderingQueue = _ref.renderingQueue,\n                            _ref$l10n = _ref.l10n,\n                            l10n = _ref$l10n === undefined ? _ui_utils.NullL10n : _ref$l10n;\n\n                        _classCallCheck(this, PDFThumbnailViewer);\n\n                        this.container = container;\n                        this.linkService = linkService;\n                        this.renderingQueue = renderingQueue;\n                        this.l10n = l10n;\n                        this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdated.bind(this));\n                        this._resetView();\n                    }\n\n                    _createClass(PDFThumbnailViewer, [{\n                        key: '_scrollUpdated',\n                        value: function _scrollUpdated() {\n                            this.renderingQueue.renderHighestPriority();\n                        }\n                    }, {\n                        key: 'getThumbnail',\n                        value: function getThumbnail(index) {\n                            return this._thumbnails[index];\n                        }\n                    }, {\n                        key: '_getVisibleThumbs',\n                        value: function _getVisibleThumbs() {\n                            return (0, _ui_utils.getVisibleElements)(this.container, this._thumbnails);\n                        }\n                    }, {\n                        key: 'scrollThumbnailIntoView',\n                        value: function scrollThumbnailIntoView(page) {\n                            var selected = document.querySelector('.thumbnail.selected');\n                            if (selected) {\n                                selected.classList.remove('selected');\n                            }\n                            var thumbnail = document.querySelector('div.thumbnail[data-page-number=\"' + page + '\"]');\n                            if (thumbnail) {\n                                thumbnail.classList.add('selected');\n                            }\n                            var visibleThumbs = this._getVisibleThumbs();\n                            var numVisibleThumbs = visibleThumbs.views.length;\n                            if (numVisibleThumbs > 0) {\n                                var first = visibleThumbs.first.id;\n                                var last = numVisibleThumbs > 1 ? visibleThumbs.last.id : first;\n                                if (page <= first || page >= last) {\n                                    (0, _ui_utils.scrollIntoView)(thumbnail, { top: THUMBNAIL_SCROLL_MARGIN });\n                                }\n                            }\n                        }\n                    }, {\n                        key: 'cleanup',\n                        value: function cleanup() {\n                            _pdf_thumbnail_view.PDFThumbnailView.cleanup();\n                        }\n                    }, {\n                        key: '_resetView',\n                        value: function _resetView() {\n                            this._thumbnails = [];\n                            this._pageLabels = null;\n                            this._pagesRotation = 0;\n                            this._pagesRequests = [];\n                            this.container.textContent = '';\n                        }\n                    }, {\n                        key: 'setDocument',\n                        value: function setDocument(pdfDocument) {\n                            var _this = this;\n\n                            if (this.pdfDocument) {\n                                this._cancelRendering();\n                                this._resetView();\n                            }\n                            this.pdfDocument = pdfDocument;\n                            if (!pdfDocument) {\n                                return;\n                            }\n                            pdfDocument.getPage(1).then(function (firstPage) {\n                                var pagesCount = pdfDocument.numPages;\n                                var viewport = firstPage.getViewport(1.0);\n                                for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n                                    var thumbnail = new _pdf_thumbnail_view.PDFThumbnailView({\n                                        container: _this.container,\n                                        id: pageNum,\n                                        defaultViewport: viewport.clone(),\n                                        linkService: _this.linkService,\n                                        renderingQueue: _this.renderingQueue,\n                                        disableCanvasToImageConversion: false,\n                                        l10n: _this.l10n\n                                    });\n                                    _this._thumbnails.push(thumbnail);\n                                }\n                            }).catch(function (reason) {\n                                console.error('Unable to initialize thumbnail viewer', reason);\n                            });\n                        }\n                    }, {\n                        key: '_cancelRendering',\n                        value: function _cancelRendering() {\n                            for (var i = 0, ii = this._thumbnails.length; i < ii; i++) {\n                                if (this._thumbnails[i]) {\n                                    this._thumbnails[i].cancelRendering();\n                                }\n                            }\n                        }\n                    }, {\n                        key: 'setPageLabels',\n                        value: function setPageLabels(labels) {\n                            if (!this.pdfDocument) {\n                                return;\n                            }\n                            if (!labels) {\n                                this._pageLabels = null;\n                            } else if (!(labels instanceof Array && this.pdfDocument.numPages === labels.length)) {\n                                this._pageLabels = null;\n                                console.error('PDFThumbnailViewer_setPageLabels: Invalid page labels.');\n                            } else {\n                                this._pageLabels = labels;\n                            }\n                            for (var i = 0, ii = this._thumbnails.length; i < ii; i++) {\n                                var label = this._pageLabels && this._pageLabels[i];\n                                this._thumbnails[i].setPageLabel(label);\n                            }\n                        }\n                    }, {\n                        key: '_ensurePdfPageLoaded',\n                        value: function _ensurePdfPageLoaded(thumbView) {\n                            var _this2 = this;\n\n                            if (thumbView.pdfPage) {\n                                return Promise.resolve(thumbView.pdfPage);\n                            }\n                            var pageNumber = thumbView.id;\n                            if (this._pagesRequests[pageNumber]) {\n                                return this._pagesRequests[pageNumber];\n                            }\n                            var promise = this.pdfDocument.getPage(pageNumber).then(function (pdfPage) {\n                                thumbView.setPdfPage(pdfPage);\n                                _this2._pagesRequests[pageNumber] = null;\n                                return pdfPage;\n                            }).catch(function (reason) {\n                                console.error('Unable to get page for thumb view', reason);\n                                _this2._pagesRequests[pageNumber] = null;\n                            });\n                            this._pagesRequests[pageNumber] = promise;\n                            return promise;\n                        }\n                    }, {\n                        key: 'forceRendering',\n                        value: function forceRendering() {\n                            var _this3 = this;\n\n                            var visibleThumbs = this._getVisibleThumbs();\n                            var thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this._thumbnails, this.scroll.down);\n                            if (thumbView) {\n                                this._ensurePdfPageLoaded(thumbView).then(function () {\n                                    _this3.renderingQueue.renderView(thumbView);\n                                });\n                                return true;\n                            }\n                            return false;\n                        }\n                    }, {\n                        key: 'pagesRotation',\n                        get: function get() {\n                            return this._pagesRotation;\n                        },\n                        set: function set(rotation) {\n                            if (!(typeof rotation === 'number' && rotation % 90 === 0)) {\n                                throw new Error('Invalid thumbnails rotation angle.');\n                            }\n                            if (!this.pdfDocument) {\n                                return;\n                            }\n                            this._pagesRotation = rotation;\n                            for (var i = 0, ii = this._thumbnails.length; i < ii; i++) {\n                                this._thumbnails[i].update(rotation);\n                            }\n                        }\n                    }]);\n\n                    return PDFThumbnailViewer;\n                }();\n\n                exports.PDFThumbnailViewer = PDFThumbnailViewer;\n\n                /***/\n            }),\n        /* 27 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFViewer = exports.PresentationModeState = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdf_rendering_queue = __webpack_require__(3);\n\n                var _annotation_layer_builder = __webpack_require__(11);\n\n                var _dom_events = __webpack_require__(2);\n\n                var _pdf_page_view = __webpack_require__(22);\n\n                var _pdf_link_service = __webpack_require__(5);\n\n                var _text_layer_builder = __webpack_require__(30);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var PresentationModeState = {\n                    UNKNOWN: 0,\n                    NORMAL: 1,\n                    CHANGING: 2,\n                    FULLSCREEN: 3\n                };\n                var DEFAULT_CACHE_SIZE = 10;\n                function PDFPageViewBuffer(size) {\n                    var data = [];\n                    this.push = function cachePush(view) {\n                        var i = data.indexOf(view);\n                        if (i >= 0) {\n                            data.splice(i, 1);\n                        }\n                        data.push(view);\n                        if (data.length > size) {\n                            data.shift().destroy();\n                        }\n                    };\n                    this.resize = function (newSize) {\n                        size = newSize;\n                        while (data.length > size) {\n                            data.shift().destroy();\n                        }\n                    };\n                }\n                function isSameScale(oldScale, newScale) {\n                    if (newScale === oldScale) {\n                        return true;\n                    }\n                    if (Math.abs(newScale - oldScale) < 1e-15) {\n                        return true;\n                    }\n                    return false;\n                }\n                function isPortraitOrientation(size) {\n                    return size.width <= size.height;\n                }\n\n                var PDFViewer = function () {\n                    function PDFViewer(options) {\n                        _classCallCheck(this, PDFViewer);\n\n                        this.container = options.container;\n                        this.viewer = options.viewer || options.container.firstElementChild;\n                        this.eventBus = options.eventBus || (0, _dom_events.getGlobalEventBus)();\n                        this.linkService = options.linkService || new _pdf_link_service.SimpleLinkService();\n                        this.downloadManager = options.downloadManager || null;\n                        this.removePageBorders = options.removePageBorders || false;\n                        this.enhanceTextSelection = options.enhanceTextSelection || false;\n                        this.renderInteractiveForms = options.renderInteractiveForms || false;\n                        this.enablePrintAutoRotate = options.enablePrintAutoRotate || false;\n                        this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;\n                        this.l10n = options.l10n || _ui_utils.NullL10n;\n                        this.defaultRenderingQueue = !options.renderingQueue;\n                        if (this.defaultRenderingQueue) {\n                            this.renderingQueue = new _pdf_rendering_queue.PDFRenderingQueue();\n                            this.renderingQueue.setViewer(this);\n                        } else {\n                            this.renderingQueue = options.renderingQueue;\n                        }\n                        this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdate.bind(this));\n                        this.presentationModeState = PresentationModeState.UNKNOWN;\n                        this._resetView();\n                        if (this.removePageBorders) {\n                            this.viewer.classList.add('removePageBorders');\n                        }\n                    }\n\n                    _createClass(PDFViewer, [{\n                        key: 'getPageView',\n                        value: function getPageView(index) {\n                            return this._pages[index];\n                        }\n                    }, {\n                        key: '_setCurrentPageNumber',\n                        value: function _setCurrentPageNumber(val) {\n                            var resetCurrentPageView = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n                            if (this._currentPageNumber === val) {\n                                if (resetCurrentPageView) {\n                                    this._resetCurrentPageView();\n                                }\n                                return;\n                            }\n                            if (!(0 < val && val <= this.pagesCount)) {\n                                console.error('PDFViewer._setCurrentPageNumber: \"' + val + '\" is out of bounds.');\n                                return;\n                            }\n                            var arg = {\n                                source: this,\n                                pageNumber: val,\n                                pageLabel: this._pageLabels && this._pageLabels[val - 1]\n                            };\n                            this._currentPageNumber = val;\n                            this.eventBus.dispatch('pagechanging', arg);\n                            this.eventBus.dispatch('pagechange', arg);\n                            if (resetCurrentPageView) {\n                                this._resetCurrentPageView();\n                            }\n                        }\n                    }, {\n                        key: 'setDocument',\n                        value: function setDocument(pdfDocument) {\n                            var _this = this;\n\n                            if (this.pdfDocument) {\n                                this._cancelRendering();\n                                this._resetView();\n                            }\n                            this.pdfDocument = pdfDocument;\n                            if (!pdfDocument) {\n                                return;\n                            }\n                            var pagesCount = pdfDocument.numPages;\n                            var pagesCapability = (0, _pdfjsLib.createPromiseCapability)();\n                            this.pagesPromise = pagesCapability.promise;\n                            pagesCapability.promise.then(function () {\n                                _this._pageViewsReady = true;\n                                _this.eventBus.dispatch('pagesloaded', {\n                                    source: _this,\n                                    pagesCount: pagesCount\n                                });\n                            });\n                            var isOnePageRenderedResolved = false;\n                            var onePageRenderedCapability = (0, _pdfjsLib.createPromiseCapability)();\n                            this.onePageRendered = onePageRenderedCapability.promise;\n                            var bindOnAfterAndBeforeDraw = function bindOnAfterAndBeforeDraw(pageView) {\n                                pageView.onBeforeDraw = function () {\n                                    _this._buffer.push(pageView);\n                                };\n                                pageView.onAfterDraw = function () {\n                                    if (!isOnePageRenderedResolved) {\n                                        isOnePageRenderedResolved = true;\n                                        onePageRenderedCapability.resolve();\n                                    }\n                                };\n                            };\n                            var firstPagePromise = pdfDocument.getPage(1);\n                            this.firstPagePromise = firstPagePromise;\n                            firstPagePromise.then(function (pdfPage) {\n                                var scale = _this.currentScale;\n                                var viewport = pdfPage.getViewport(scale * _ui_utils.CSS_UNITS);\n                                for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n                                    var textLayerFactory = null;\n                                    if (!_pdfjsLib.PDFJS.disableTextLayer) {\n                                        textLayerFactory = _this;\n                                    }\n                                    var pageView = new _pdf_page_view.PDFPageView({\n                                        container: _this.viewer,\n                                        eventBus: _this.eventBus,\n                                        id: pageNum,\n                                        scale: scale,\n                                        defaultViewport: viewport.clone(),\n                                        renderingQueue: _this.renderingQueue,\n                                        textLayerFactory: textLayerFactory,\n                                        annotationLayerFactory: _this,\n                                        enhanceTextSelection: _this.enhanceTextSelection,\n                                        renderInteractiveForms: _this.renderInteractiveForms,\n                                        renderer: _this.renderer,\n                                        l10n: _this.l10n\n                                    });\n                                    bindOnAfterAndBeforeDraw(pageView);\n                                    _this._pages.push(pageView);\n                                }\n                                onePageRenderedCapability.promise.then(function () {\n                                    if (_pdfjsLib.PDFJS.disableAutoFetch) {\n                                        pagesCapability.resolve();\n                                        return;\n                                    }\n                                    var getPagesLeft = pagesCount;\n\n                                    var _loop = function _loop(_pageNum) {\n                                        pdfDocument.getPage(_pageNum).then(function (pdfPage) {\n                                            var pageView = _this._pages[_pageNum - 1];\n                                            if (!pageView.pdfPage) {\n                                                pageView.setPdfPage(pdfPage);\n                                            }\n                                            _this.linkService.cachePageRef(_pageNum, pdfPage.ref);\n                                            if (--getPagesLeft === 0) {\n                                                pagesCapability.resolve();\n                                            }\n                                        }, function (reason) {\n                                            console.error('Unable to get page ' + _pageNum + ' to initialize viewer', reason);\n                                            if (--getPagesLeft === 0) {\n                                                pagesCapability.resolve();\n                                            }\n                                        });\n                                    };\n\n                                    for (var _pageNum = 1; _pageNum <= pagesCount; ++_pageNum) {\n                                        _loop(_pageNum);\n                                    }\n                                });\n                                _this.eventBus.dispatch('pagesinit', { source: _this });\n                                if (_this.defaultRenderingQueue) {\n                                    _this.update();\n                                }\n                                if (_this.findController) {\n                                    _this.findController.resolveFirstPage();\n                                }\n                            }).catch(function (reason) {\n                                console.error('Unable to initialize viewer', reason);\n                            });\n                        }\n                    }, {\n                        key: 'setPageLabels',\n                        value: function setPageLabels(labels) {\n                            if (!this.pdfDocument) {\n                                return;\n                            }\n                            if (!labels) {\n                                this._pageLabels = null;\n                            } else if (!(labels instanceof Array && this.pdfDocument.numPages === labels.length)) {\n                                this._pageLabels = null;\n                                console.error('PDFViewer.setPageLabels: Invalid page labels.');\n                            } else {\n                                this._pageLabels = labels;\n                            }\n                            for (var i = 0, ii = this._pages.length; i < ii; i++) {\n                                var pageView = this._pages[i];\n                                var label = this._pageLabels && this._pageLabels[i];\n                                pageView.setPageLabel(label);\n                            }\n                        }\n                    }, {\n                        key: '_resetView',\n                        value: function _resetView() {\n                            this._pages = [];\n                            this._currentPageNumber = 1;\n                            this._currentScale = _ui_utils.UNKNOWN_SCALE;\n                            this._currentScaleValue = null;\n                            this._pageLabels = null;\n                            this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE);\n                            this._location = null;\n                            this._pagesRotation = 0;\n                            this._pagesRequests = [];\n                            this._pageViewsReady = false;\n                            this.viewer.textContent = '';\n                        }\n                    }, {\n                        key: '_scrollUpdate',\n                        value: function _scrollUpdate() {\n                            if (this.pagesCount === 0) {\n                                return;\n                            }\n                            this.update();\n                        }\n                    }, {\n                        key: '_setScaleDispatchEvent',\n                        value: function _setScaleDispatchEvent(newScale, newValue) {\n                            var preset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n                            var arg = {\n                                source: this,\n                                scale: newScale,\n                                presetValue: preset ? newValue : undefined\n                            };\n                            this.eventBus.dispatch('scalechanging', arg);\n                            this.eventBus.dispatch('scalechange', arg);\n                        }\n                    }, {\n                        key: '_setScaleUpdatePages',\n                        value: function _setScaleUpdatePages(newScale, newValue) {\n                            var noScroll = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n                            var preset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n                            this._currentScaleValue = newValue.toString();\n                            if (isSameScale(this._currentScale, newScale)) {\n                                if (preset) {\n                                    this._setScaleDispatchEvent(newScale, newValue, true);\n                                }\n                                return;\n                            }\n                            for (var i = 0, ii = this._pages.length; i < ii; i++) {\n                                this._pages[i].update(newScale);\n                            }\n                            this._currentScale = newScale;\n                            if (!noScroll) {\n                                var page = this._currentPageNumber,\n                                    dest = void 0;\n                                if (this._location && !_pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom && !(this.isInPresentationMode || this.isChangingPresentationMode)) {\n                                    page = this._location.pageNumber;\n                                    dest = [null, { name: 'XYZ' }, this._location.left, this._location.top, null];\n                                }\n                                this.scrollPageIntoView({\n                                    pageNumber: page,\n                                    destArray: dest,\n                                    allowNegativeOffset: true\n                                });\n                            }\n                            this._setScaleDispatchEvent(newScale, newValue, preset);\n                            if (this.defaultRenderingQueue) {\n                                this.update();\n                            }\n                        }\n                    }, {\n                        key: '_setScale',\n                        value: function _setScale(value) {\n                            var noScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n                            var scale = parseFloat(value);\n                            if (scale > 0) {\n                                this._setScaleUpdatePages(scale, value, noScroll, false);\n                            } else {\n                                var currentPage = this._pages[this._currentPageNumber - 1];\n                                if (!currentPage) {\n                                    return;\n                                }\n                                var hPadding = this.isInPresentationMode || this.removePageBorders ? 0 : _ui_utils.SCROLLBAR_PADDING;\n                                var vPadding = this.isInPresentationMode || this.removePageBorders ? 0 : _ui_utils.VERTICAL_PADDING;\n                                var pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale;\n                                var pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale;\n                                switch (value) {\n                                    case 'page-actual':\n                                        scale = 1;\n                                        break;\n                                    case 'page-width':\n                                        scale = pageWidthScale;\n                                        break;\n                                    case 'page-height':\n                                        scale = pageHeightScale;\n                                        break;\n                                    case 'page-fit':\n                                        scale = Math.min(pageWidthScale, pageHeightScale);\n                                        break;\n                                    case 'auto':\n                                        var isLandscape = currentPage.width > currentPage.height;\n                                        var horizontalScale = isLandscape ? Math.min(pageHeightScale, pageWidthScale) : pageWidthScale;\n                                        scale = Math.min(_ui_utils.MAX_AUTO_SCALE, horizontalScale);\n                                        break;\n                                    default:\n                                        console.error('PDFViewer._setScale: \"' + value + '\" is an unknown zoom value.');\n                                        return;\n                                }\n                                this._setScaleUpdatePages(scale, value, noScroll, true);\n                            }\n                        }\n                    }, {\n                        key: '_resetCurrentPageView',\n                        value: function _resetCurrentPageView() {\n                            if (this.isInPresentationMode) {\n                                this._setScale(this._currentScaleValue, true);\n                            }\n                            var pageView = this._pages[this._currentPageNumber - 1];\n                            (0, _ui_utils.scrollIntoView)(pageView.div);\n                        }\n                    }, {\n                        key: 'scrollPageIntoView',\n                        value: function scrollPageIntoView(params) {\n                            if (!this.pdfDocument) {\n                                return;\n                            }\n                            if (arguments.length > 1 || typeof params === 'number') {\n                                console.warn('Call of scrollPageIntoView() with obsolete signature.');\n                                var paramObj = {};\n                                if (typeof params === 'number') {\n                                    paramObj.pageNumber = params;\n                                }\n                                if (arguments[1] instanceof Array) {\n                                    paramObj.destArray = arguments[1];\n                                }\n                                params = paramObj;\n                            }\n                            var pageNumber = params.pageNumber || 0;\n                            var dest = params.destArray || null;\n                            var allowNegativeOffset = params.allowNegativeOffset || false;\n                            if (this.isInPresentationMode || !dest) {\n                                this._setCurrentPageNumber(pageNumber, true);\n                                return;\n                            }\n                            var pageView = this._pages[pageNumber - 1];\n                            if (!pageView) {\n                                console.error('PDFViewer.scrollPageIntoView: Invalid \"pageNumber\" parameter.');\n                                return;\n                            }\n                            var x = 0,\n                                y = 0;\n                            var width = 0,\n                                height = 0,\n                                widthScale = void 0,\n                                heightScale = void 0;\n                            var changeOrientation = pageView.rotation % 180 === 0 ? false : true;\n                            var pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / _ui_utils.CSS_UNITS;\n                            var pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / _ui_utils.CSS_UNITS;\n                            var scale = 0;\n                            switch (dest[1].name) {\n                                case 'XYZ':\n                                    x = dest[2];\n                                    y = dest[3];\n                                    scale = dest[4];\n                                    x = x !== null ? x : 0;\n                                    y = y !== null ? y : pageHeight;\n                                    break;\n                                case 'Fit':\n                                case 'FitB':\n                                    scale = 'page-fit';\n                                    break;\n                                case 'FitH':\n                                case 'FitBH':\n                                    y = dest[2];\n                                    scale = 'page-width';\n                                    if (y === null && this._location) {\n                                        x = this._location.left;\n                                        y = this._location.top;\n                                    }\n                                    break;\n                                case 'FitV':\n                                case 'FitBV':\n                                    x = dest[2];\n                                    width = pageWidth;\n                                    height = pageHeight;\n                                    scale = 'page-height';\n                                    break;\n                                case 'FitR':\n                                    x = dest[2];\n                                    y = dest[3];\n                                    width = dest[4] - x;\n                                    height = dest[5] - y;\n                                    var hPadding = this.removePageBorders ? 0 : _ui_utils.SCROLLBAR_PADDING;\n                                    var vPadding = this.removePageBorders ? 0 : _ui_utils.VERTICAL_PADDING;\n                                    widthScale = (this.container.clientWidth - hPadding) / width / _ui_utils.CSS_UNITS;\n                                    heightScale = (this.container.clientHeight - vPadding) / height / _ui_utils.CSS_UNITS;\n                                    scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));\n                                    break;\n                                default:\n                                    console.error('PDFViewer.scrollPageIntoView: \"' + dest[1].name + '\" ' + 'is not a valid destination type.');\n                                    return;\n                            }\n                            if (scale && scale !== this._currentScale) {\n                                this.currentScaleValue = scale;\n                            } else if (this._currentScale === _ui_utils.UNKNOWN_SCALE) {\n                                this.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;\n                            }\n                            if (scale === 'page-fit' && !dest[4]) {\n                                (0, _ui_utils.scrollIntoView)(pageView.div);\n                                return;\n                            }\n                            var boundingRect = [pageView.viewport.convertToViewportPoint(x, y), pageView.viewport.convertToViewportPoint(x + width, y + height)];\n                            var left = Math.min(boundingRect[0][0], boundingRect[1][0]);\n                            var top = Math.min(boundingRect[0][1], boundingRect[1][1]);\n                            if (!allowNegativeOffset) {\n                                left = Math.max(left, 0);\n                                top = Math.max(top, 0);\n                            }\n                            (0, _ui_utils.scrollIntoView)(pageView.div, {\n                                left: left,\n                                top: top\n                            });\n                        }\n                    }, {\n                        key: '_updateLocation',\n                        value: function _updateLocation(firstPage) {\n                            var currentScale = this._currentScale;\n                            var currentScaleValue = this._currentScaleValue;\n                            var normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ? Math.round(currentScale * 10000) / 100 : currentScaleValue;\n                            var pageNumber = firstPage.id;\n                            var pdfOpenParams = '#page=' + pageNumber;\n                            pdfOpenParams += '&zoom=' + normalizedScaleValue;\n                            var currentPageView = this._pages[pageNumber - 1];\n                            var container = this.container;\n                            var topLeft = currentPageView.getPagePoint(container.scrollLeft - firstPage.x, container.scrollTop - firstPage.y);\n                            var intLeft = Math.round(topLeft[0]);\n                            var intTop = Math.round(topLeft[1]);\n                            pdfOpenParams += ',' + intLeft + ',' + intTop;\n                            this._location = {\n                                pageNumber: pageNumber,\n                                scale: normalizedScaleValue,\n                                top: intTop,\n                                left: intLeft,\n                                pdfOpenParams: pdfOpenParams\n                            };\n                        }\n                    }, {\n                        key: 'update',\n                        value: function update() {\n                            var visible = this._getVisiblePages();\n                            var visiblePages = visible.views;\n                            if (visiblePages.length === 0) {\n                                return;\n                            }\n                            var suggestedCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * visiblePages.length + 1);\n                            this._buffer.resize(suggestedCacheSize);\n                            this.renderingQueue.renderHighestPriority(visible);\n                            var currentId = this._currentPageNumber;\n                            var firstPage = visible.first;\n                            var stillFullyVisible = false;\n                            for (var i = 0, ii = visiblePages.length; i < ii; ++i) {\n                                var page = visiblePages[i];\n                                if (page.percent < 100) {\n                                    break;\n                                }\n                                if (page.id === currentId) {\n                                    stillFullyVisible = true;\n                                    break;\n                                }\n                            }\n                            if (!stillFullyVisible) {\n                                currentId = visiblePages[0].id;\n                            }\n                            if (!this.isInPresentationMode) {\n                                this._setCurrentPageNumber(currentId);\n                            }\n                            this._updateLocation(firstPage);\n                            this.eventBus.dispatch('updateviewarea', {\n                                source: this,\n                                location: this._location\n                            });\n                        }\n                    }, {\n                        key: 'containsElement',\n                        value: function containsElement(element) {\n                            return this.container.contains(element);\n                        }\n                    }, {\n                        key: 'focus',\n                        value: function focus() {\n                            this.container.focus();\n                        }\n                    }, {\n                        key: '_getVisiblePages',\n                        value: function _getVisiblePages() {\n                            if (!this.isInPresentationMode) {\n                                return (0, _ui_utils.getVisibleElements)(this.container, this._pages, true);\n                            }\n                            var visible = [];\n                            var currentPage = this._pages[this._currentPageNumber - 1];\n                            visible.push({\n                                id: currentPage.id,\n                                view: currentPage\n                            });\n                            return {\n                                first: currentPage,\n                                last: currentPage,\n                                views: visible\n                            };\n                        }\n                    }, {\n                        key: 'cleanup',\n                        value: function cleanup() {\n                            for (var i = 0, ii = this._pages.length; i < ii; i++) {\n                                if (this._pages[i] && this._pages[i].renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {\n                                    this._pages[i].reset();\n                                }\n                            }\n                        }\n                    }, {\n                        key: '_cancelRendering',\n                        value: function _cancelRendering() {\n                            for (var i = 0, ii = this._pages.length; i < ii; i++) {\n                                if (this._pages[i]) {\n                                    this._pages[i].cancelRendering();\n                                }\n                            }\n                        }\n                    }, {\n                        key: '_ensurePdfPageLoaded',\n                        value: function _ensurePdfPageLoaded(pageView) {\n                            var _this2 = this;\n\n                            if (pageView.pdfPage) {\n                                return Promise.resolve(pageView.pdfPage);\n                            }\n                            var pageNumber = pageView.id;\n                            if (this._pagesRequests[pageNumber]) {\n                                return this._pagesRequests[pageNumber];\n                            }\n                            var promise = this.pdfDocument.getPage(pageNumber).then(function (pdfPage) {\n                                if (!pageView.pdfPage) {\n                                    pageView.setPdfPage(pdfPage);\n                                }\n                                _this2._pagesRequests[pageNumber] = null;\n                                return pdfPage;\n                            }).catch(function (reason) {\n                                console.error('Unable to get page for page view', reason);\n                                _this2._pagesRequests[pageNumber] = null;\n                            });\n                            this._pagesRequests[pageNumber] = promise;\n                            return promise;\n                        }\n                    }, {\n                        key: 'forceRendering',\n                        value: function forceRendering(currentlyVisiblePages) {\n                            var _this3 = this;\n\n                            var visiblePages = currentlyVisiblePages || this._getVisiblePages();\n                            var pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, this.scroll.down);\n                            if (pageView) {\n                                this._ensurePdfPageLoaded(pageView).then(function () {\n                                    _this3.renderingQueue.renderView(pageView);\n                                });\n                                return true;\n                            }\n                            return false;\n                        }\n                    }, {\n                        key: 'getPageTextContent',\n                        value: function getPageTextContent(pageIndex) {\n                            return this.pdfDocument.getPage(pageIndex + 1).then(function (page) {\n                                return page.getTextContent({ normalizeWhitespace: true });\n                            });\n                        }\n                    }, {\n                        key: 'createTextLayerBuilder',\n                        value: function createTextLayerBuilder(textLayerDiv, pageIndex, viewport) {\n                            var enhanceTextSelection = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n                            return new _text_layer_builder.TextLayerBuilder({\n                                textLayerDiv: textLayerDiv,\n                                eventBus: this.eventBus,\n                                pageIndex: pageIndex,\n                                viewport: viewport,\n                                findController: this.isInPresentationMode ? null : this.findController,\n                                enhanceTextSelection: this.isInPresentationMode ? false : enhanceTextSelection\n                            });\n                        }\n                    }, {\n                        key: 'createAnnotationLayerBuilder',\n                        value: function createAnnotationLayerBuilder(pageDiv, pdfPage) {\n                            var renderInteractiveForms = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n                            var l10n = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _ui_utils.NullL10n;\n\n                            return new _annotation_layer_builder.AnnotationLayerBuilder({\n                                pageDiv: pageDiv,\n                                pdfPage: pdfPage,\n                                renderInteractiveForms: renderInteractiveForms,\n                                linkService: this.linkService,\n                                downloadManager: this.downloadManager,\n                                l10n: l10n\n                            });\n                        }\n                    }, {\n                        key: 'setFindController',\n                        value: function setFindController(findController) {\n                            this.findController = findController;\n                        }\n                    }, {\n                        key: 'getPagesOverview',\n                        value: function getPagesOverview() {\n                            var pagesOverview = this._pages.map(function (pageView) {\n                                var viewport = pageView.pdfPage.getViewport(1);\n                                return {\n                                    width: viewport.width,\n                                    height: viewport.height,\n                                    rotation: viewport.rotation\n                                };\n                            });\n                            if (!this.enablePrintAutoRotate) {\n                                return pagesOverview;\n                            }\n                            var isFirstPagePortrait = isPortraitOrientation(pagesOverview[0]);\n                            return pagesOverview.map(function (size) {\n                                if (isFirstPagePortrait === isPortraitOrientation(size)) {\n                                    return size;\n                                }\n                                return {\n                                    width: size.height,\n                                    height: size.width,\n                                    rotation: (size.rotation + 90) % 360\n                                };\n                            });\n                        }\n                    }, {\n                        key: 'pagesCount',\n                        get: function get() {\n                            return this._pages.length;\n                        }\n                    }, {\n                        key: 'pageViewsReady',\n                        get: function get() {\n                            return this._pageViewsReady;\n                        }\n                    }, {\n                        key: 'currentPageNumber',\n                        get: function get() {\n                            return this._currentPageNumber;\n                        },\n                        set: function set(val) {\n                            if ((val | 0) !== val) {\n                                throw new Error('Invalid page number.');\n                            }\n                            if (!this.pdfDocument) {\n                                return;\n                            }\n                            this._setCurrentPageNumber(val, true);\n                        }\n                    }, {\n                        key: 'currentPageLabel',\n                        get: function get() {\n                            return this._pageLabels && this._pageLabels[this._currentPageNumber - 1];\n                        },\n                        set: function set(val) {\n                            var pageNumber = val | 0;\n                            if (this._pageLabels) {\n                                var i = this._pageLabels.indexOf(val);\n                                if (i >= 0) {\n                                    pageNumber = i + 1;\n                                }\n                            }\n                            this.currentPageNumber = pageNumber;\n                        }\n                    }, {\n                        key: 'currentScale',\n                        get: function get() {\n                            return this._currentScale !== _ui_utils.UNKNOWN_SCALE ? this._currentScale : _ui_utils.DEFAULT_SCALE;\n                        },\n                        set: function set(val) {\n                            if (isNaN(val)) {\n                                throw new Error('Invalid numeric scale');\n                            }\n                            if (!this.pdfDocument) {\n                                return;\n                            }\n                            this._setScale(val, false);\n                        }\n                    }, {\n                        key: 'currentScaleValue',\n                        get: function get() {\n                            return this._currentScaleValue;\n                        },\n                        set: function set(val) {\n                            if (!this.pdfDocument) {\n                                return;\n                            }\n                            this._setScale(val, false);\n                        }\n                    }, {\n                        key: 'pagesRotation',\n                        get: function get() {\n                            return this._pagesRotation;\n                        },\n                        set: function set(rotation) {\n                            if (!(typeof rotation === 'number' && rotation % 90 === 0)) {\n                                throw new Error('Invalid pages rotation angle.');\n                            }\n                            if (!this.pdfDocument) {\n                                return;\n                            }\n                            this._pagesRotation = rotation;\n                            for (var i = 0, ii = this._pages.length; i < ii; i++) {\n                                var pageView = this._pages[i];\n                                pageView.update(pageView.scale, rotation);\n                            }\n                            this._setScale(this._currentScaleValue, true);\n                            if (this.defaultRenderingQueue) {\n                                this.update();\n                            }\n                        }\n                    }, {\n                        key: 'isInPresentationMode',\n                        get: function get() {\n                            return this.presentationModeState === PresentationModeState.FULLSCREEN;\n                        }\n                    }, {\n                        key: 'isChangingPresentationMode',\n                        get: function get() {\n                            return this.presentationModeState === PresentationModeState.CHANGING;\n                        }\n                    }, {\n                        key: 'isHorizontalScrollbarEnabled',\n                        get: function get() {\n                            return this.isInPresentationMode ? false : this.container.scrollWidth > this.container.clientWidth;\n                        }\n                    }, {\n                        key: 'hasEqualPageSizes',\n                        get: function get() {\n                            var firstPageView = this._pages[0];\n                            for (var i = 1, ii = this._pages.length; i < ii; ++i) {\n                                var pageView = this._pages[i];\n                                if (pageView.width !== firstPageView.width || pageView.height !== firstPageView.height) {\n                                    return false;\n                                }\n                            }\n                            return true;\n                        }\n                    }]);\n\n                    return PDFViewer;\n                }();\n\n                exports.PresentationModeState = PresentationModeState;\n                exports.PDFViewer = PDFViewer;\n\n                /***/\n            }),\n        /* 28 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.BasePreferences = undefined;\n\n                var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var defaultPreferences = null;\n                function getDefaultPreferences() {\n                    if (!defaultPreferences) {\n                        defaultPreferences = Promise.resolve({\n                            \"showPreviousViewOnLoad\": true,\n                            \"defaultZoomValue\": \"\",\n                            \"sidebarViewOnLoad\": 0,\n                            \"enableHandToolOnLoad\": false,\n                            \"cursorToolOnLoad\": 0,\n                            \"enableWebGL\": false,\n                            \"pdfBugEnabled\": false,\n                            \"disableRange\": false,\n                            \"disableStream\": false,\n                            \"disableAutoFetch\": false,\n                            \"disableFontFace\": false,\n                            \"disableTextLayer\": false,\n                            \"useOnlyCssZoom\": false,\n                            \"externalLinkTarget\": 0,\n                            \"enhanceTextSelection\": false,\n                            \"renderer\": \"canvas\",\n                            \"renderInteractiveForms\": false,\n                            \"enablePrintAutoRotate\": false,\n                            \"disablePageMode\": false,\n                            \"disablePageLabels\": false\n                        });\n                    }\n                    return defaultPreferences;\n                }\n\n                var BasePreferences = function () {\n                    function BasePreferences() {\n                        var _this = this;\n\n                        _classCallCheck(this, BasePreferences);\n\n                        if (this.constructor === BasePreferences) {\n                            throw new Error('Cannot initialize BasePreferences.');\n                        }\n                        this.prefs = null;\n                        this._initializedPromise = getDefaultPreferences().then(function (defaults) {\n                            Object.defineProperty(_this, 'defaults', {\n                                value: Object.freeze(defaults),\n                                writable: false,\n                                enumerable: true,\n                                configurable: false\n                            });\n                            _this.prefs = (0, _ui_utils.cloneObj)(defaults);\n                            return _this._readFromStorage(defaults);\n                        }).then(function (prefObj) {\n                            if (prefObj) {\n                                _this.prefs = prefObj;\n                            }\n                        });\n                    }\n\n                    _createClass(BasePreferences, [{\n                        key: \"_writeToStorage\",\n                        value: function _writeToStorage(prefObj) {\n                            return Promise.reject(new Error('Not implemented: _writeToStorage'));\n                        }\n                    }, {\n                        key: \"_readFromStorage\",\n                        value: function _readFromStorage(prefObj) {\n                            return Promise.reject(new Error('Not implemented: _readFromStorage'));\n                        }\n                    }, {\n                        key: \"reset\",\n                        value: function reset() {\n                            var _this2 = this;\n\n                            return this._initializedPromise.then(function () {\n                                _this2.prefs = (0, _ui_utils.cloneObj)(_this2.defaults);\n                                return _this2._writeToStorage(_this2.defaults);\n                            });\n                        }\n                    }, {\n                        key: \"reload\",\n                        value: function reload() {\n                            var _this3 = this;\n\n                            return this._initializedPromise.then(function () {\n                                return _this3._readFromStorage(_this3.defaults);\n                            }).then(function (prefObj) {\n                                if (prefObj) {\n                                    _this3.prefs = prefObj;\n                                }\n                            });\n                        }\n                    }, {\n                        key: \"set\",\n                        value: function set(name, value) {\n                            var _this4 = this;\n\n                            return this._initializedPromise.then(function () {\n                                if (_this4.defaults[name] === undefined) {\n                                    throw new Error(\"Set preference: \\\"\" + name + \"\\\" is undefined.\");\n                                } else if (value === undefined) {\n                                    throw new Error('Set preference: no value is specified.');\n                                }\n                                var valueType = typeof value === \"undefined\" ? \"undefined\" : _typeof(value);\n                                var defaultType = _typeof(_this4.defaults[name]);\n                                if (valueType !== defaultType) {\n                                    if (valueType === 'number' && defaultType === 'string') {\n                                        value = value.toString();\n                                    } else {\n                                        throw new Error(\"Set preference: \\\"\" + value + \"\\\" is a \" + valueType + \", \" + (\"expected a \" + defaultType + \".\"));\n                                    }\n                                } else {\n                                    if (valueType === 'number' && (value | 0) !== value) {\n                                        throw new Error(\"Set preference: \\\"\" + value + \"\\\" must be an integer.\");\n                                    }\n                                }\n                                _this4.prefs[name] = value;\n                                return _this4._writeToStorage(_this4.prefs);\n                            });\n                        }\n                    }, {\n                        key: \"get\",\n                        value: function get(name) {\n                            var _this5 = this;\n\n                            return this._initializedPromise.then(function () {\n                                var defaultValue = _this5.defaults[name];\n                                if (defaultValue === undefined) {\n                                    throw new Error(\"Get preference: \\\"\" + name + \"\\\" is undefined.\");\n                                } else {\n                                    var prefValue = _this5.prefs[name];\n                                    if (prefValue !== undefined) {\n                                        return prefValue;\n                                    }\n                                }\n                                return defaultValue;\n                            });\n                        }\n                    }]);\n\n                    return BasePreferences;\n                }();\n\n                exports.BasePreferences = BasePreferences;\n\n                /***/\n            }),\n        /* 29 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.SecondaryToolbar = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdf_cursor_tools = __webpack_require__(6);\n\n                var _ui_utils = __webpack_require__(0);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var SecondaryToolbar = function () {\n                    function SecondaryToolbar(options, mainContainer, eventBus) {\n                        _classCallCheck(this, SecondaryToolbar);\n\n                        this.toolbar = options.toolbar;\n                        this.toggleButton = options.toggleButton;\n                        this.toolbarButtonContainer = options.toolbarButtonContainer;\n                        this.buttons = [{\n                            element: options.presentationModeButton,\n                            eventName: 'presentationmode',\n                            close: true\n                        }, {\n                            element: options.openFileButton,\n                            eventName: 'openfile',\n                            close: true\n                        }, {\n                            element: options.printButton,\n                            eventName: 'print',\n                            close: true\n                        }, {\n                            element: options.downloadButton,\n                            eventName: 'download',\n                            close: true\n                        }, {\n                            element: options.viewBookmarkButton,\n                            eventName: null,\n                            close: true\n                        }, {\n                            element: options.firstPageButton,\n                            eventName: 'firstpage',\n                            close: true\n                        }, {\n                            element: options.lastPageButton,\n                            eventName: 'lastpage',\n                            close: true\n                        }, {\n                            element: options.pageRotateCwButton,\n                            eventName: 'rotatecw',\n                            close: false\n                        }, {\n                            element: options.pageRotateCcwButton,\n                            eventName: 'rotateccw',\n                            close: false\n                        }, {\n                            element: options.cursorSelectToolButton,\n                            eventName: 'switchcursortool',\n                            eventDetails: { tool: _pdf_cursor_tools.CursorTool.SELECT },\n                            close: true\n                        }, {\n                            element: options.cursorHandToolButton,\n                            eventName: 'switchcursortool',\n                            eventDetails: { tool: _pdf_cursor_tools.CursorTool.HAND },\n                            close: true\n                        }, {\n                            element: options.documentPropertiesButton,\n                            eventName: 'documentproperties',\n                            close: true\n                        }];\n                        this.items = {\n                            firstPage: options.firstPageButton,\n                            lastPage: options.lastPageButton,\n                            pageRotateCw: options.pageRotateCwButton,\n                            pageRotateCcw: options.pageRotateCcwButton\n                        };\n                        this.mainContainer = mainContainer;\n                        this.eventBus = eventBus;\n                        this.opened = false;\n                        this.containerHeight = null;\n                        this.previousContainerHeight = null;\n                        this.reset();\n                        this._bindClickListeners();\n                        this._bindCursorToolsListener(options);\n                        this.eventBus.on('resize', this._setMaxHeight.bind(this));\n                    }\n\n                    _createClass(SecondaryToolbar, [{\n                        key: 'setPageNumber',\n                        value: function setPageNumber(pageNumber) {\n                            this.pageNumber = pageNumber;\n                            this._updateUIState();\n                        }\n                    }, {\n                        key: 'setPagesCount',\n                        value: function setPagesCount(pagesCount) {\n                            this.pagesCount = pagesCount;\n                            this._updateUIState();\n                        }\n                    }, {\n                        key: 'reset',\n                        value: function reset() {\n                            this.pageNumber = 0;\n                            this.pagesCount = 0;\n                            this._updateUIState();\n                        }\n                    }, {\n                        key: '_updateUIState',\n                        value: function _updateUIState() {\n                            this.items.firstPage.disabled = this.pageNumber <= 1;\n                            this.items.lastPage.disabled = this.pageNumber >= this.pagesCount;\n                            this.items.pageRotateCw.disabled = this.pagesCount === 0;\n                            this.items.pageRotateCcw.disabled = this.pagesCount === 0;\n                        }\n                    }, {\n                        key: '_bindClickListeners',\n                        value: function _bindClickListeners() {\n                            var _this = this;\n\n                            this.toggleButton.addEventListener('click', this.toggle.bind(this));\n\n                            var _loop = function _loop(button) {\n                                var _buttons$button = _this.buttons[button],\n                                    element = _buttons$button.element,\n                                    eventName = _buttons$button.eventName,\n                                    close = _buttons$button.close,\n                                    eventDetails = _buttons$button.eventDetails;\n\n                                element.addEventListener('click', function (evt) {\n                                    if (eventName !== null) {\n                                        var details = { source: _this };\n                                        for (var property in eventDetails) {\n                                            details[property] = eventDetails[property];\n                                        }\n                                        _this.eventBus.dispatch(eventName, details);\n                                    }\n                                    if (close) {\n                                        _this.close();\n                                    }\n                                });\n                            };\n\n                            for (var button in this.buttons) {\n                                _loop(button);\n                            }\n                        }\n                    }, {\n                        key: '_bindCursorToolsListener',\n                        value: function _bindCursorToolsListener(buttons) {\n                            this.eventBus.on('cursortoolchanged', function (evt) {\n                                buttons.cursorSelectToolButton.classList.remove('toggled');\n                                buttons.cursorHandToolButton.classList.remove('toggled');\n                                switch (evt.tool) {\n                                    case _pdf_cursor_tools.CursorTool.SELECT:\n                                        buttons.cursorSelectToolButton.classList.add('toggled');\n                                        break;\n                                    case _pdf_cursor_tools.CursorTool.HAND:\n                                        buttons.cursorHandToolButton.classList.add('toggled');\n                                        break;\n                                }\n                            });\n                        }\n                    }, {\n                        key: 'open',\n                        value: function open() {\n                            if (this.opened) {\n                                return;\n                            }\n                            this.opened = true;\n                            this._setMaxHeight();\n                            this.toggleButton.classList.add('toggled');\n                            this.toolbar.classList.remove('hidden');\n                        }\n                    }, {\n                        key: 'close',\n                        value: function close() {\n                            if (!this.opened) {\n                                return;\n                            }\n                            this.opened = false;\n                            this.toolbar.classList.add('hidden');\n                            this.toggleButton.classList.remove('toggled');\n                        }\n                    }, {\n                        key: 'toggle',\n                        value: function toggle() {\n                            if (this.opened) {\n                                this.close();\n                            } else {\n                                this.open();\n                            }\n                        }\n                    }, {\n                        key: '_setMaxHeight',\n                        value: function _setMaxHeight() {\n                            if (!this.opened) {\n                                return;\n                            }\n                            this.containerHeight = this.mainContainer.clientHeight;\n                            if (this.containerHeight === this.previousContainerHeight) {\n                                return;\n                            }\n                            this.toolbarButtonContainer.setAttribute('style', 'max-height: ' + (this.containerHeight - _ui_utils.SCROLLBAR_PADDING) + 'px;');\n                            this.previousContainerHeight = this.containerHeight;\n                        }\n                    }, {\n                        key: 'isOpen',\n                        get: function get() {\n                            return this.opened;\n                        }\n                    }]);\n\n                    return SecondaryToolbar;\n                }();\n\n                exports.SecondaryToolbar = SecondaryToolbar;\n\n                /***/\n            }),\n        /* 30 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.DefaultTextLayerFactory = exports.TextLayerBuilder = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _dom_events = __webpack_require__(2);\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var EXPAND_DIVS_TIMEOUT = 300;\n\n                var TextLayerBuilder = function () {\n                    function TextLayerBuilder(_ref) {\n                        var textLayerDiv = _ref.textLayerDiv,\n                            eventBus = _ref.eventBus,\n                            pageIndex = _ref.pageIndex,\n                            viewport = _ref.viewport,\n                            _ref$findController = _ref.findController,\n                            findController = _ref$findController === undefined ? null : _ref$findController,\n                            _ref$enhanceTextSelec = _ref.enhanceTextSelection,\n                            enhanceTextSelection = _ref$enhanceTextSelec === undefined ? false : _ref$enhanceTextSelec;\n\n                        _classCallCheck(this, TextLayerBuilder);\n\n                        this.textLayerDiv = textLayerDiv;\n                        this.eventBus = eventBus || (0, _dom_events.getGlobalEventBus)();\n                        this.textContent = null;\n                        this.textContentItemsStr = [];\n                        this.textContentStream = null;\n                        this.renderingDone = false;\n                        this.pageIdx = pageIndex;\n                        this.pageNumber = this.pageIdx + 1;\n                        this.matches = [];\n                        this.viewport = viewport;\n                        this.textDivs = [];\n                        this.findController = findController;\n                        this.textLayerRenderTask = null;\n                        this.enhanceTextSelection = enhanceTextSelection;\n                        this._bindMouse();\n                    }\n\n                    _createClass(TextLayerBuilder, [{\n                        key: '_finishRendering',\n                        value: function _finishRendering() {\n                            this.renderingDone = true;\n                            if (!this.enhanceTextSelection) {\n                                var endOfContent = document.createElement('div');\n                                endOfContent.className = 'endOfContent';\n                                this.textLayerDiv.appendChild(endOfContent);\n                            }\n                            this.eventBus.dispatch('textlayerrendered', {\n                                source: this,\n                                pageNumber: this.pageNumber,\n                                numTextDivs: this.textDivs.length\n                            });\n                        }\n                    }, {\n                        key: 'render',\n                        value: function render() {\n                            var _this = this;\n\n                            var timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n                            if (!(this.textContent || this.textContentStream) || this.renderingDone) {\n                                return;\n                            }\n                            this.cancel();\n                            this.textDivs = [];\n                            var textLayerFrag = document.createDocumentFragment();\n                            this.textLayerRenderTask = (0, _pdfjsLib.renderTextLayer)({\n                                textContent: this.textContent,\n                                textContentStream: this.textContentStream,\n                                container: textLayerFrag,\n                                viewport: this.viewport,\n                                textDivs: this.textDivs,\n                                textContentItemsStr: this.textContentItemsStr,\n                                timeout: timeout,\n                                enhanceTextSelection: this.enhanceTextSelection\n                            });\n                            this.textLayerRenderTask.promise.then(function () {\n                                _this.textLayerDiv.appendChild(textLayerFrag);\n                                _this._finishRendering();\n                                _this.updateMatches();\n                            }, function (reason) { });\n                        }\n                    }, {\n                        key: 'cancel',\n                        value: function cancel() {\n                            if (this.textLayerRenderTask) {\n                                this.textLayerRenderTask.cancel();\n                                this.textLayerRenderTask = null;\n                            }\n                        }\n                    }, {\n                        key: 'setTextContentStream',\n                        value: function setTextContentStream(readableStream) {\n                            this.cancel();\n                            this.textContentStream = readableStream;\n                        }\n                    }, {\n                        key: 'setTextContent',\n                        value: function setTextContent(textContent) {\n                            this.cancel();\n                            this.textContent = textContent;\n                        }\n                    }, {\n                        key: 'convertMatches',\n                        value: function convertMatches(matches, matchesLength) {\n                            var i = 0;\n                            var iIndex = 0;\n                            var textContentItemsStr = this.textContentItemsStr;\n                            var end = textContentItemsStr.length - 1;\n                            var queryLen = this.findController === null ? 0 : this.findController.state.query.length;\n                            var ret = [];\n                            if (!matches) {\n                                return ret;\n                            }\n                            for (var m = 0, len = matches.length; m < len; m++) {\n                                var matchIdx = matches[m];\n                                while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) {\n                                    iIndex += textContentItemsStr[i].length;\n                                    i++;\n                                }\n                                if (i === textContentItemsStr.length) {\n                                    console.error('Could not find a matching mapping');\n                                }\n                                var match = {\n                                    begin: {\n                                        divIdx: i,\n                                        offset: matchIdx - iIndex\n                                    }\n                                };\n                                if (matchesLength) {\n                                    matchIdx += matchesLength[m];\n                                } else {\n                                    matchIdx += queryLen;\n                                }\n                                while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) {\n                                    iIndex += textContentItemsStr[i].length;\n                                    i++;\n                                }\n                                match.end = {\n                                    divIdx: i,\n                                    offset: matchIdx - iIndex\n                                };\n                                ret.push(match);\n                            }\n                            return ret;\n                        }\n                    }, {\n                        key: 'renderMatches',\n                        value: function renderMatches(matches) {\n                            if (matches.length === 0) {\n                                return;\n                            }\n                            var textContentItemsStr = this.textContentItemsStr;\n                            var textDivs = this.textDivs;\n                            var prevEnd = null;\n                            var pageIdx = this.pageIdx;\n                            var isSelectedPage = this.findController === null ? false : pageIdx === this.findController.selected.pageIdx;\n                            var selectedMatchIdx = this.findController === null ? -1 : this.findController.selected.matchIdx;\n                            var highlightAll = this.findController === null ? false : this.findController.state.highlightAll;\n                            var infinity = {\n                                divIdx: -1,\n                                offset: undefined\n                            };\n                            function beginText(begin, className) {\n                                var divIdx = begin.divIdx;\n                                textDivs[divIdx].textContent = '';\n                                appendTextToDiv(divIdx, 0, begin.offset, className);\n                            }\n                            function appendTextToDiv(divIdx, fromOffset, toOffset, className) {\n                                var div = textDivs[divIdx];\n                                var content = textContentItemsStr[divIdx].substring(fromOffset, toOffset);\n                                var node = document.createTextNode(content);\n                                if (className) {\n                                    var span = document.createElement('span');\n                                    span.className = className;\n                                    span.appendChild(node);\n                                    div.appendChild(span);\n                                    return;\n                                }\n                                div.appendChild(node);\n                            }\n                            var i0 = selectedMatchIdx,\n                                i1 = i0 + 1;\n                            if (highlightAll) {\n                                i0 = 0;\n                                i1 = matches.length;\n                            } else if (!isSelectedPage) {\n                                return;\n                            }\n                            for (var i = i0; i < i1; i++) {\n                                var match = matches[i];\n                                var begin = match.begin;\n                                var end = match.end;\n                                var isSelected = isSelectedPage && i === selectedMatchIdx;\n                                var highlightSuffix = isSelected ? ' selected' : '';\n                                if (this.findController) {\n                                    this.findController.updateMatchPosition(pageIdx, i, textDivs, begin.divIdx);\n                                }\n                                if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {\n                                    if (prevEnd !== null) {\n                                        appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n                                    }\n                                    beginText(begin);\n                                } else {\n                                    appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);\n                                }\n                                if (begin.divIdx === end.divIdx) {\n                                    appendTextToDiv(begin.divIdx, begin.offset, end.offset, 'highlight' + highlightSuffix);\n                                } else {\n                                    appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, 'highlight begin' + highlightSuffix);\n                                    for (var n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {\n                                        textDivs[n0].className = 'highlight middle' + highlightSuffix;\n                                    }\n                                    beginText(end, 'highlight end' + highlightSuffix);\n                                }\n                                prevEnd = end;\n                            }\n                            if (prevEnd) {\n                                appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n                            }\n                        }\n                    }, {\n                        key: 'updateMatches',\n                        value: function updateMatches() {\n                            if (!this.renderingDone) {\n                                return;\n                            }\n                            var matches = this.matches;\n                            var textDivs = this.textDivs;\n                            var textContentItemsStr = this.textContentItemsStr;\n                            var clearedUntilDivIdx = -1;\n                            for (var i = 0, len = matches.length; i < len; i++) {\n                                var match = matches[i];\n                                var begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);\n                                for (var n = begin, end = match.end.divIdx; n <= end; n++) {\n                                    var div = textDivs[n];\n                                    div.textContent = textContentItemsStr[n];\n                                    div.className = '';\n                                }\n                                clearedUntilDivIdx = match.end.divIdx + 1;\n                            }\n                            if (this.findController === null || !this.findController.active) {\n                                return;\n                            }\n                            var pageMatches = void 0,\n                                pageMatchesLength = void 0;\n                            if (this.findController !== null) {\n                                pageMatches = this.findController.pageMatches[this.pageIdx] || null;\n                                pageMatchesLength = this.findController.pageMatchesLength ? this.findController.pageMatchesLength[this.pageIdx] || null : null;\n                            }\n                            this.matches = this.convertMatches(pageMatches, pageMatchesLength);\n                            this.renderMatches(this.matches);\n                        }\n                    }, {\n                        key: '_bindMouse',\n                        value: function _bindMouse() {\n                            var _this2 = this;\n\n                            var div = this.textLayerDiv;\n                            var expandDivsTimer = null;\n                            div.addEventListener('mousedown', function (evt) {\n                                if (_this2.enhanceTextSelection && _this2.textLayerRenderTask) {\n                                    _this2.textLayerRenderTask.expandTextDivs(true);\n                                    if (expandDivsTimer) {\n                                        clearTimeout(expandDivsTimer);\n                                        expandDivsTimer = null;\n                                    }\n                                    return;\n                                }\n                                var end = div.querySelector('.endOfContent');\n                                if (!end) {\n                                    return;\n                                }\n                                var adjustTop = evt.target !== div;\n                                adjustTop = adjustTop && window.getComputedStyle(end).getPropertyValue('-moz-user-select') !== 'none';\n                                if (adjustTop) {\n                                    var divBounds = div.getBoundingClientRect();\n                                    var r = Math.max(0, (evt.pageY - divBounds.top) / divBounds.height);\n                                    end.style.top = (r * 100).toFixed(2) + '%';\n                                }\n                                end.classList.add('active');\n                            });\n                            div.addEventListener('mouseup', function () {\n                                if (_this2.enhanceTextSelection && _this2.textLayerRenderTask) {\n                                    expandDivsTimer = setTimeout(function () {\n                                        if (_this2.textLayerRenderTask) {\n                                            _this2.textLayerRenderTask.expandTextDivs(false);\n                                        }\n                                        expandDivsTimer = null;\n                                    }, EXPAND_DIVS_TIMEOUT);\n                                    return;\n                                }\n                                var end = div.querySelector('.endOfContent');\n                                if (!end) {\n                                    return;\n                                }\n                                end.style.top = '';\n                                end.classList.remove('active');\n                            });\n                        }\n                    }]);\n\n                    return TextLayerBuilder;\n                }();\n\n                var DefaultTextLayerFactory = function () {\n                    function DefaultTextLayerFactory() {\n                        _classCallCheck(this, DefaultTextLayerFactory);\n                    }\n\n                    _createClass(DefaultTextLayerFactory, [{\n                        key: 'createTextLayerBuilder',\n                        value: function createTextLayerBuilder(textLayerDiv, pageIndex, viewport) {\n                            var enhanceTextSelection = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n                            return new TextLayerBuilder({\n                                textLayerDiv: textLayerDiv,\n                                pageIndex: pageIndex,\n                                viewport: viewport,\n                                enhanceTextSelection: enhanceTextSelection\n                            });\n                        }\n                    }]);\n\n                    return DefaultTextLayerFactory;\n                }();\n\n                exports.TextLayerBuilder = TextLayerBuilder;\n                exports.DefaultTextLayerFactory = DefaultTextLayerFactory;\n\n                /***/\n            }),\n        /* 31 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.Toolbar = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var PAGE_NUMBER_LOADING_INDICATOR = 'visiblePageIsLoading';\n                var SCALE_SELECT_CONTAINER_PADDING = 8;\n                var SCALE_SELECT_PADDING = 22;\n\n                var Toolbar = function () {\n                    function Toolbar(options, mainContainer, eventBus) {\n                        var l10n = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _ui_utils.NullL10n;\n\n                        _classCallCheck(this, Toolbar);\n\n                        this.toolbar = options.container;\n                        this.mainContainer = mainContainer;\n                        this.eventBus = eventBus;\n                        this.l10n = l10n;\n                        this.items = options;\n                        this._wasLocalized = false;\n                        this.reset();\n                        this._bindListeners();\n                    }\n\n                    _createClass(Toolbar, [{\n                        key: 'setPageNumber',\n                        value: function setPageNumber(pageNumber, pageLabel) {\n                            this.pageNumber = pageNumber;\n                            this.pageLabel = pageLabel;\n                            this._updateUIState(false);\n                        }\n                    }, {\n                        key: 'setPagesCount',\n                        value: function setPagesCount(pagesCount, hasPageLabels) {\n                            this.pagesCount = pagesCount;\n                            this.hasPageLabels = hasPageLabels;\n                            this._updateUIState(true);\n                        }\n                    }, {\n                        key: 'setPageScale',\n                        value: function setPageScale(pageScaleValue, pageScale) {\n                            this.pageScaleValue = pageScaleValue;\n                            this.pageScale = pageScale;\n                            this._updateUIState(false);\n                        }\n                    }, {\n                        key: 'reset',\n                        value: function reset() {\n                            this.pageNumber = 0;\n                            this.pageLabel = null;\n                            this.hasPageLabels = false;\n                            this.pagesCount = 0;\n                            this.pageScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;\n                            this.pageScale = _ui_utils.DEFAULT_SCALE;\n                            this._updateUIState(true);\n                        }\n                    }, {\n                        key: '_bindListeners',\n                        value: function _bindListeners() {\n                            var _this = this;\n\n                            var eventBus = this.eventBus,\n                                items = this.items;\n\n                            var self = this;\n                            items.previous.addEventListener('click', function () {\n                                eventBus.dispatch('previouspage');\n                            });\n                            items.next.addEventListener('click', function () {\n                                eventBus.dispatch('nextpage');\n                            });\n                            items.zoomIn.addEventListener('click', function () {\n                                eventBus.dispatch('zoomin');\n                            });\n                            items.zoomOut.addEventListener('click', function () {\n                                eventBus.dispatch('zoomout');\n                            });\n                            items.pageNumber.addEventListener('click', function () {\n                                this.select();\n                            });\n                            items.pageNumber.addEventListener('change', function () {\n                                eventBus.dispatch('pagenumberchanged', {\n                                    source: self,\n                                    value: this.value\n                                });\n                            });\n                            items.scaleSelect.addEventListener('change', function () {\n                                if (this.value === 'custom') {\n                                    return;\n                                }\n                                eventBus.dispatch('scalechanged', {\n                                    source: self,\n                                    value: this.value\n                                });\n                            });\n                            items.presentationModeButton.addEventListener('click', function () {\n                                eventBus.dispatch('presentationmode');\n                            });\n                            items.openFile.addEventListener('click', function () {\n                                eventBus.dispatch('openfile');\n                            });\n                            items.print.addEventListener('click', function () {\n                                eventBus.dispatch('print');\n                            });\n                            items.download.addEventListener('click', function () {\n                                eventBus.dispatch('download');\n                            });\n                            items.scaleSelect.oncontextmenu = _ui_utils.noContextMenuHandler;\n                            eventBus.on('localized', function () {\n                                _this._localized();\n                            });\n                        }\n                    }, {\n                        key: '_localized',\n                        value: function _localized() {\n                            this._wasLocalized = true;\n                            this._adjustScaleWidth();\n                            this._updateUIState(true);\n                        }\n                    }, {\n                        key: '_updateUIState',\n                        value: function _updateUIState() {\n                            var resetNumPages = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n                            if (!this._wasLocalized) {\n                                return;\n                            }\n                            var pageNumber = this.pageNumber,\n                                pagesCount = this.pagesCount,\n                                items = this.items;\n\n                            var scaleValue = (this.pageScaleValue || this.pageScale).toString();\n                            var scale = this.pageScale;\n                            if (resetNumPages) {\n                                if (this.hasPageLabels) {\n                                    items.pageNumber.type = 'text';\n                                } else {\n                                    items.pageNumber.type = 'number';\n                                    this.l10n.get('of_pages', { pagesCount: pagesCount }, 'of {{pagesCount}}').then(function (msg) {\n                                        items.numPages.textContent = msg;\n                                    });\n                                }\n                                items.pageNumber.max = pagesCount;\n                            }\n                            if (this.hasPageLabels) {\n                                items.pageNumber.value = this.pageLabel;\n                                this.l10n.get('page_of_pages', {\n                                    pageNumber: pageNumber,\n                                    pagesCount: pagesCount\n                                }, '({{pageNumber}} of {{pagesCount}})').then(function (msg) {\n                                    items.numPages.textContent = msg;\n                                });\n                            } else {\n                                items.pageNumber.value = pageNumber;\n                            }\n                            items.previous.disabled = pageNumber <= 1;\n                            items.next.disabled = pageNumber >= pagesCount;\n                            items.zoomOut.disabled = scale <= _ui_utils.MIN_SCALE;\n                            items.zoomIn.disabled = scale >= _ui_utils.MAX_SCALE;\n                            var customScale = Math.round(scale * 10000) / 100;\n                            this.l10n.get('page_scale_percent', { scale: customScale }, '{{scale}}%').then(function (msg) {\n                                var options = items.scaleSelect.options;\n                                var predefinedValueFound = false;\n                                for (var i = 0, ii = options.length; i < ii; i++) {\n                                    var option = options[i];\n                                    if (option.value !== scaleValue) {\n                                        option.selected = false;\n                                        continue;\n                                    }\n                                    option.selected = true;\n                                    predefinedValueFound = true;\n                                }\n                                if (!predefinedValueFound) {\n                                    items.customScaleOption.textContent = msg;\n                                    items.customScaleOption.selected = true;\n                                }\n                            });\n                        }\n                    }, {\n                        key: 'updateLoadingIndicatorState',\n                        value: function updateLoadingIndicatorState() {\n                            var loading = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n                            var pageNumberInput = this.items.pageNumber;\n                            if (loading) {\n                                pageNumberInput.classList.add(PAGE_NUMBER_LOADING_INDICATOR);\n                            } else {\n                                pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR);\n                            }\n                        }\n                    }, {\n                        key: '_adjustScaleWidth',\n                        value: function _adjustScaleWidth() {\n                            var container = this.items.scaleSelectContainer;\n                            var select = this.items.scaleSelect;\n                            _ui_utils.animationStarted.then(function () {\n                                if (container.clientWidth === 0) {\n                                    container.setAttribute('style', 'display: inherit;');\n                                }\n                                if (container.clientWidth > 0) {\n                                    select.setAttribute('style', 'min-width: inherit;');\n                                    var width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING;\n                                    select.setAttribute('style', 'min-width: ' + (width + SCALE_SELECT_PADDING) + 'px;');\n                                    container.setAttribute('style', 'min-width: ' + width + 'px; ' + 'max-width: ' + width + 'px;');\n                                }\n                            });\n                        }\n                    }]);\n\n                    return Toolbar;\n                }();\n\n                exports.Toolbar = Toolbar;\n\n                /***/\n            }),\n        /* 32 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20;\n\n                var ViewHistory = function () {\n                    function ViewHistory(fingerprint) {\n                        var _this = this;\n\n                        var cacheSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_VIEW_HISTORY_CACHE_SIZE;\n\n                        _classCallCheck(this, ViewHistory);\n\n                        this.fingerprint = fingerprint;\n                        this.cacheSize = cacheSize;\n                        this._initializedPromise = this._readFromStorage().then(function (databaseStr) {\n                            var database = JSON.parse(databaseStr || '{}');\n                            if (!('files' in database)) {\n                                database.files = [];\n                            }\n                            if (database.files.length >= _this.cacheSize) {\n                                database.files.shift();\n                            }\n                            var index = void 0;\n                            for (var i = 0, length = database.files.length; i < length; i++) {\n                                var branch = database.files[i];\n                                if (branch.fingerprint === _this.fingerprint) {\n                                    index = i;\n                                    break;\n                                }\n                            }\n                            if (typeof index !== 'number') {\n                                index = database.files.push({ fingerprint: _this.fingerprint }) - 1;\n                            }\n                            _this.file = database.files[index];\n                            _this.database = database;\n                        });\n                    }\n\n                    _createClass(ViewHistory, [{\n                        key: '_writeToStorage',\n                        value: function _writeToStorage() {\n                            var _this2 = this;\n\n                            return new Promise(function (resolve) {\n                                var databaseStr = JSON.stringify(_this2.database);\n                                localStorage.setItem('pdfjs.history', databaseStr);\n                                resolve();\n                            });\n                        }\n                    }, {\n                        key: '_readFromStorage',\n                        value: function _readFromStorage() {\n                            return new Promise(function (resolve) {\n                                var value = localStorage.getItem('pdfjs.history');\n                                if (!value) {\n                                    var databaseStr = localStorage.getItem('database');\n                                    if (databaseStr) {\n                                        try {\n                                            var database = JSON.parse(databaseStr);\n                                            if (typeof database.files[0].fingerprint === 'string') {\n                                                localStorage.setItem('pdfjs.history', databaseStr);\n                                                localStorage.removeItem('database');\n                                                value = databaseStr;\n                                            }\n                                        } catch (ex) { }\n                                    }\n                                }\n                                resolve(value);\n                            });\n                        }\n                    }, {\n                        key: 'set',\n                        value: function set(name, val) {\n                            var _this3 = this;\n\n                            return this._initializedPromise.then(function () {\n                                _this3.file[name] = val;\n                                return _this3._writeToStorage();\n                            });\n                        }\n                    }, {\n                        key: 'setMultiple',\n                        value: function setMultiple(properties) {\n                            var _this4 = this;\n\n                            return this._initializedPromise.then(function () {\n                                for (var name in properties) {\n                                    _this4.file[name] = properties[name];\n                                }\n                                return _this4._writeToStorage();\n                            });\n                        }\n                    }, {\n                        key: 'get',\n                        value: function get(name, defaultValue) {\n                            var _this5 = this;\n\n                            return this._initializedPromise.then(function () {\n                                var val = _this5.file[name];\n                                return val !== undefined ? val : defaultValue;\n                            });\n                        }\n                    }, {\n                        key: 'getMultiple',\n                        value: function getMultiple(properties) {\n                            var _this6 = this;\n\n                            return this._initializedPromise.then(function () {\n                                var values = Object.create(null);\n                                for (var name in properties) {\n                                    var val = _this6.file[name];\n                                    values[name] = val !== undefined ? val : properties[name];\n                                }\n                                return values;\n                            });\n                        }\n                    }]);\n\n                    return ViewHistory;\n                }();\n\n                exports.ViewHistory = ViewHistory;\n\n                /***/\n            }),\n        /* 33 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                var DEFAULT_URL = my_pdf_file;//'compressed.tracemonkey-pldi-09.pdf';\n                ;\n                var pdfjsWebApp = void 0;\n                {\n                    pdfjsWebApp = __webpack_require__(4);\n                }\n                ;\n                {\n                    __webpack_require__(8);\n                }\n                ;\n                {\n                    __webpack_require__(9);\n                }\n                function getViewerConfiguration() {\n                    return {\n                        appContainer: document.body,\n                        mainContainer: document.getElementById('viewerContainer'),\n                        viewerContainer: document.getElementById('viewer'),\n                        eventBus: null,\n                        toolbar: {\n                            container: document.getElementById('toolbarViewer'),\n                            numPages: document.getElementById('numPages'),\n                            pageNumber: document.getElementById('pageNumber'),\n                            scaleSelectContainer: document.getElementById('scaleSelectContainer'),\n                            scaleSelect: document.getElementById('scaleSelect'),\n                            customScaleOption: document.getElementById('customScaleOption'),\n                            previous: document.getElementById('previous'),\n                            next: document.getElementById('next'),\n                            zoomIn: document.getElementById('zoomIn'),\n                            zoomOut: document.getElementById('zoomOut'),\n                            viewFind: document.getElementById('viewFind'),\n                            openFile: document.getElementById('openFile'),\n                            print: document.getElementById('print'),\n                            presentationModeButton: document.getElementById('presentationMode'),\n                            download: document.getElementById('download'),\n                            viewBookmark: document.getElementById('viewBookmark')\n                        },\n                        secondaryToolbar: {\n                            toolbar: document.getElementById('secondaryToolbar'),\n                            toggleButton: document.getElementById('secondaryToolbarToggle'),\n                            toolbarButtonContainer: document.getElementById('secondaryToolbarButtonContainer'),\n                            presentationModeButton: document.getElementById('secondaryPresentationMode'),\n                            openFileButton: document.getElementById('secondaryOpenFile'),\n                            printButton: document.getElementById('secondaryPrint'),\n                            downloadButton: document.getElementById('secondaryDownload'),\n                            viewBookmarkButton: document.getElementById('secondaryViewBookmark'),\n                            firstPageButton: document.getElementById('firstPage'),\n                            lastPageButton: document.getElementById('lastPage'),\n                            pageRotateCwButton: document.getElementById('pageRotateCw'),\n                            pageRotateCcwButton: document.getElementById('pageRotateCcw'),\n                            cursorSelectToolButton: document.getElementById('cursorSelectTool'),\n                            cursorHandToolButton: document.getElementById('cursorHandTool'),\n                            documentPropertiesButton: document.getElementById('pdfDocumentProperties')\n                        },\n                        fullscreen: {\n                            contextFirstPage: document.getElementById('contextFirstPage'),\n                            contextLastPage: document.getElementById('contextLastPage'),\n                            contextPageRotateCw: document.getElementById('contextPageRotateCw'),\n                            contextPageRotateCcw: document.getElementById('contextPageRotateCcw')\n                        },\n                        sidebar: {\n                            mainContainer: document.getElementById('mainContainer'),\n                            outerContainer: document.getElementById('outerContainer'),\n                            toggleButton: document.getElementById('sidebarToggle'),\n                            thumbnailButton: document.getElementById('viewThumbnail'),\n                            outlineButton: document.getElementById('viewOutline'),\n                            attachmentsButton: document.getElementById('viewAttachments'),\n                            thumbnailView: document.getElementById('thumbnailView'),\n                            outlineView: document.getElementById('outlineView'),\n                            attachmentsView: document.getElementById('attachmentsView')\n                        },\n                        findBar: {\n                            bar: document.getElementById('findbar'),\n                            toggleButton: document.getElementById('viewFind'),\n                            findField: document.getElementById('findInput'),\n                            highlightAllCheckbox: document.getElementById('findHighlightAll'),\n                            caseSensitiveCheckbox: document.getElementById('findMatchCase'),\n                            findMsg: document.getElementById('findMsg'),\n                            findResultsCount: document.getElementById('findResultsCount'),\n                            findStatusIcon: document.getElementById('findStatusIcon'),\n                            findPreviousButton: document.getElementById('findPrevious'),\n                            findNextButton: document.getElementById('findNext')\n                        },\n                        passwordOverlay: {\n                            overlayName: 'passwordOverlay',\n                            container: document.getElementById('passwordOverlay'),\n                            label: document.getElementById('passwordText'),\n                            input: document.getElementById('password'),\n                            submitButton: document.getElementById('passwordSubmit'),\n                            cancelButton: document.getElementById('passwordCancel')\n                        },\n                        pdfDocumentProperties: {\n                            overlayName: 'documentPropertiesOverlay',\n                            container: document.getElementById('documentPropertiesOverlay'),\n                            closeButton: document.getElementById('documentPropertiesClose'),\n                            fields: {\n                                'fileName': document.getElementById('fileNameField'),\n                                'fileSize': document.getElementById('fileSizeField'),\n                                'title': document.getElementById('titleField'),\n                                'author': document.getElementById('authorField'),\n                                'subject': document.getElementById('subjectField'),\n                                'keywords': document.getElementById('keywordsField'),\n                                'creationDate': document.getElementById('creationDateField'),\n                                'modificationDate': document.getElementById('modificationDateField'),\n                                'creator': document.getElementById('creatorField'),\n                                'producer': document.getElementById('producerField'),\n                                'version': document.getElementById('versionField'),\n                                'pageCount': document.getElementById('pageCountField')\n                            }\n                        },\n                        errorWrapper: {\n                            container: document.getElementById('errorWrapper'),\n                            errorMessage: document.getElementById('errorMessage'),\n                            closeButton: document.getElementById('errorClose'),\n                            errorMoreInfo: document.getElementById('errorMoreInfo'),\n                            moreInfoButton: document.getElementById('errorShowMore'),\n                            lessInfoButton: document.getElementById('errorShowLess')\n                        },\n                        printContainer: document.getElementById('printContainer'),\n                        openFileInputName: 'fileInput',\n                        debuggerScriptPath: './debugger.js',\n                        defaultUrl: DEFAULT_URL\n                    };\n                }\n                function webViewerLoad() {\n                    var config = getViewerConfiguration();\n                    window.PDFViewerApplication = pdfjsWebApp.PDFViewerApplication;\n                    pdfjsWebApp.PDFViewerApplication.run(config);\n                }\n                if (document.readyState === 'interactive' || document.readyState === 'complete') {\n                    webViewerLoad();\n                } else {\n                    document.addEventListener('DOMContentLoaded', webViewerLoad, true);\n                }\n\n                /***/\n            })\n        /******/]);\n        //# sourceMappingURL=viewer.js.map\n\n        // open a file in the viewer\n        // The workerSrc property shall be specified.\n        //PDFJS.workerSrc = './Content/pdfViewer/pdf.worker.js';\n        /*\n        var file = fObj.Obj;\n\n        scale = 0.5||pdfSet.pdfScale;\n\n        PDFJS.disableWorker = true;\n        PDFJS.getDocument(file).then(function(pdfDoc){\n            for(var num = 1; num <= pdfDoc.numPages; num++){\n                pdfDoc.getPage(num).then(function(page){\n                    var viewport = page.getViewport(scale); //options.scale\n                    var canvas = document.createElement('canvas');\n                    var ctx = canvas.getContext('2d');\n                    var renderContext = {\n                    canvasContext: ctx,\n                    viewport: viewport\n                    };\n                    \n                    canvas.height = viewport.height;\n                    canvas.width = viewport.width;\n                    $(\"#\"+divId + \" #viewer\").append(canvas);\n                    \n                    page.render(renderContext);\n                });\n            }\n        });\n        */\n        return true;\n    }\n    /////////////////////////////////////////////////Docx//////////////////////////////////////////\n    function getDocxContent(fObj, divId, docxSet) {\n\n        $(\"#\" + divId).html(\"\");\n        var file = fObj.Obj;\n        var mammothOptions = {\n            styleMap: docxSet.styleMap,\n            includeEmbeddedStyleMap: docxSet.includeEmbeddedStyleMap,\n            includeDefaultStyleMap: docxSet.includeDefaultStyleMap,\n            convertImage: docxSet.convertImage,\n            ignoreEmptyParagraphs: docxSet.ignoreEmptyParagraphs,\n            idPrefix: docxSet.idPrefix,\n            isRtl: docxSet.isRtl\n        };\n        JSZipUtils.getBinaryContent(file, function (err, content) {\n            mammoth.convertToHtml({ arrayBuffer: content }, mammothOptions)\n                .then(displayResult)\n                .done();\n        });\n\n        function displayResult(result) {\n            var isRtl = mammothOptions.isRtl;\n            var rslt = result.value;\n            if (isRtl == \"auto\") {\n                var position = rslt.search(/[\\u0590-\\u05FF]/);\n                if (position >= 0) {\n                    $('#' + divId).attr(\"dir\", \"rtl\");\n                } else {\n                    $('#' + divId).attr(\"dir\", \"ltr\");\n                }\n            } else if (isRtl === true) {\n                $('#' + divId).attr(\"dir\", \"rtl\");\n            } else if (isRtl === false) {\n                $('#' + divId).attr(\"dir\", \"ltr\");\n            }\n            $('#' + divId).html(rslt);\n            if (result.messages != \"\") {\n                var messageHtml = result.messages.map(function (message) {\n                    return message.type + ': ' + message.message + \"\\n\";\n                }).join(\"\");\n\n                console.log(\"Docx viewer Messages: \\n\" + messageHtml + \"\\n\");\n            }\n\n        }\n        return true;\n    }\n    /////////////////////////////////////////////////doc//////////////////////////////////////////\n    function getDocContent(fObj, divId, docxSet) {\n\n        $(\"#\" + divId).html(\"\");\n        var file = fObj.Obj;\n\n        var ran5 = 10000 + Math.round(Math.floor() * 90000);\n        var subDiv = $('<div/>').attr({ class: 'doc_files', id: \"doc_file_\" + ran5, style: \"color:#9d9999;font-size:30pt\" });\n        $(\"#\" + divId).append(subDiv);\n        $(\"#doc_file_\" + ran5).html(\".doc file is not supported, convert it to .docx file\");\n        return\n    }\n    /////////////////////////////////////////////////pptx//////////////////////////////////////////\n    function getPptxContent(fObj, divId, pptxSet) {\n\n        $(\"#\" + divId).html(\"\");\n\n        //console.log(fObj,divId);\n        var file = fObj.Obj;\n        $(\"#\" + divId).pptxToHtml({\n            pptxFileUrl: file,\n            slidesScale: pptxSet.slidesScale, //Change Slides scale by percent\n            slideMode: pptxSet.slideMode, /** true,false*/\n            keyBoardShortCut: pptxSet.keyBoardShortCut,  /** true,false ,condition: slideMode: true XXXXX - need to remove - this is doublcated*/\n            mediaProcess: pptxSet.mediaProcess, /** true,false: if true then process video and audio files */\n            jsZipV2: pptxSet.jsZipV2,\n            slideModeConfig: {\n                first: pptxSet.slideModeConfig.first,\n                nav: pptxSet.slideModeConfig.nav, /** true,false : show or not nav buttons*/\n                navTxtColor: pptxSet.slideModeConfig.navTxtColor, /** color */\n                keyBoardShortCut: pptxSet.slideModeConfig.keyBoardShortCut, /** true,false ,condition: */\n                showSlideNum: pptxSet.slideModeConfig.showSlideNum, /** true,false */\n                showTotalSlideNum: pptxSet.slideModeConfig.showTotalSlideNum, /** true,false */\n                autoSlide: pptxSet.slideModeConfig.autoSlide, /** false or seconds , F8 to active ,keyBoardShortCut: true */\n                randomAutoSlide: pptxSet.slideModeConfig.randomAutoSlide, /** true,false ,autoSlide:true */\n                loop: pptxSet.slideModeConfig.loop,  /** true,false */\n                background: pptxSet.slideModeConfig.background, /** false or color*/\n                transition: pptxSet.slideModeConfig.transition, /** transition type: \"slid\",\"fade\",\"default\",\"random\" , to show transition efects :transitionTime > 0.5 */\n                transitionTime: pptxSet.slideModeConfig.transitionTime /** transition time between slides in seconds */\n            }\n        });\n        return true;\n    }\n    /////////////////////////////////////////////////ppt//////////////////////////////////////////\n    function getPptContent(fObj, divId, pptxSet) {\n\n        $(\"#\" + divId).html(\"\");\n        var file = fObj.Obj;\n\n        var ran5 = 10000 + Math.round(Math.floor() * 90000);\n        var subDiv = $('<div/>').attr({ class: 'ppt_files', id: \"ppt_file_\" + ran5, style: \"color:#9d9999;font-size:30pt\" });\n        $(\"#\" + divId).append(subDiv);\n        $(\"#ppt_file_\" + ran5).html(\".ppt file is not supported, convert it to .pptx file\");\n\n        return true;\n    }\n    /////////////////////////////////////////////////Sheet//////////////////////////////////////////\n    function getSheetContent(fObj, divId, sheetSet) {\n\n\n        if (jQuery.ui === undefined && sheetSet.jqueryui) {\n            console.log(\"You set jqueryui as true , but you not included jquery-ui.js and jquery-ui.css\");\n            sheetSet.jqueryui = false;\n        }\n        if (jQuery.ui && sheetSet.jqueryui) {\n            $(\".\" + divId + \"_clas\").tabs(\"destroy\");\n        }\n\n        var file = fObj.Obj;\n\n        var $container, availableWidth, availableHeight;\n\n        var hot, hot_ary = [];\n\n        $container = $(\"#\" + divId);\n        $container.addClass(divId + \"_clas\");\n        $container.addClass(\"wbSheets_clas\");\n\n        if (sheetSet.search) {\n            $(\"<div></div>\", {\n                id: \"wbSheets_search_warpper\"\n            }).appendTo('#' + divId);\n            $(\"<input/>\", {\n                id: \"wbSheets_search_field\",\n                type: \"text\",\n                placeholder: \"Search...\",\n                style: \"border-radius: 5px; width:20%;\"\n            }).appendTo('#' + divId + \" #wbSheets_search_warpper\");\n\n            $(\"<hr>\", {\n            }).appendTo('#' + divId);\n        }\n        //function process_wb(wb) {\n        //}\n        var url = file;\n\n        var req = new XMLHttpRequest();\n        req.open(\"GET\", url, true);\n        req.responseType = \"arraybuffer\";\n        req.onload = function (e) {\n            var data = new Uint8Array(req.response);\n            var wb = XLSX.read(data, { type: \"array\" });\n            var sheetNames = wb.SheetNames;\n            $container.append('<ul class=\"wbSheets_clas_ul\">');\n            var li_container = \"\";\n            sheetNames.forEach(function (sheetName, idx) {\n                var subDivId = 'wbSheets_' + idx;\n                var slcted = \"\";\n                if (!sheetSet.jqueryui && idx == 0) {\n                    slcted = \"selected\"\n                }\n                $(\"#\" + divId + \" ul\").append('<li class = \"' + slcted + '\"><a href=\"#' + subDivId + '\">' + sheetName + '</a></li>');\n            });\n            sheetNames.forEach(function (sheetName, idx) {\n                var subDivId = 'wbSheets_' + idx;\n                var json = XLSX.utils.sheet_to_json(wb.Sheets[sheetName], { header: 1 });\n                var dsply = \"\";\n                if (!sheetSet.jqueryui) {\n                    if (idx == 0) {\n                        dsply = \"display:block;\";\n                    } else {\n                        dsply = \"display:none;\";\n                    }\n                }\n                var subDiv = $('<div/>').attr({\n                    class: 'wbSheets',\n                    id: subDivId,\n                    style: dsply\n                });\n                $container.append(subDiv);\n                //availableWidth = Math.max(subDiv.width(),600);\n                //availableHeight = Math.max(subDiv.height(), 500);\n                availableWidth = $container.width() - 20;\n                availableHeight = $container.height() - ((sheetSet.search) ? 90 : 50);\n                /* add header row for table */\n                if (!json) json = [];\n                json.forEach(function (r) {\n                    //must \"...,{header:1}\"\n                    if (json[0].length < r.length) json[0].length = r.length;\n                });\n                //console.log(json)\n                var container = document.getElementById(subDivId);\n                hot = new Handsontable(container, {\n                    data: json,\n                    activeHeaderClassName: sheetSet.activeHeaderClassName,\n                    allowEmpty: sheetSet.allowEmpty,\n                    autoColumnSize: sheetSet.autoColumnSize,\n                    autoRowSize: sheetSet.autoRowSize,\n                    columns: sheetSet.columns,\n                    columnSorting: sheetSet.columnSorting,\n                    contextMenu: sheetSet.contextMenu,\n                    copyable: sheetSet.copyable,\n                    fixedColumnsLeft: sheetSet.fixedColumnsLeft,\n                    fixedRowsTop: sheetSet.fixedRowsTop,\n                    language: sheetSet.language,\n                    search: sheetSet.search,\n                    selectionMode: sheetSet.selectionMode,\n                    sortIndicator: sheetSet.sortIndicator,\n                    readOnly: sheetSet.readOnly,\n                    startRows: sheetSet.startRows,\n                    startCols: sheetSet.startCols,\n                    rowHeaders: sheetSet.rowHeaders,\n                    colHeaders: sheetSet.colHeaders,\n                    width: (!sheetSet.width) ? availableWidth : sheetSet.width,\n                    height: (!sheetSet.height) ? availableHeight : sheetSet.height\n                });\n                hot_ary.push(hot);\n            });\n\n            if (jQuery.ui && sheetSet.jqueryui) {\n                $(\".\" + divId + \"_clas\").tabs();\n            } else {\n                $(\".\" + divId + \"_clas li\").click(function (e) {\n                    e.preventDefault();\n                    $(\".\" + divId + \"_clas li\").removeClass(\"selected\");\n                    $(this).addClass(\"selected\");\n                    var hrf = $($(this)[0].firstChild).attr(\"href\").substr(1);\n                    $(\".\" + divId + \"_clas .wbSheets\").hide();\n                    $(\".\" + divId + \"_clas #\" + hrf).show();\n                });\n            }\n            if (sheetSet.search) {\n                var searchFiled = document.getElementById('wbSheets_search_field');\n                Handsontable.dom.addEvent(searchFiled, 'keyup', function (event) {\n                    var srch_txt = this.value;\n                    hot_ary.forEach(function (hot_val) {\n                        var search = hot_val.getPlugin('search');\n                        var queryResult = search.query(srch_txt);\n                        hot_val.render();\n                    })\n                });\n\n            }\n            //$(\".\"+divId+\"_clas\").tabs(\"refresh\");\n            /*\n            availableWidth = $container.width()-105;\n            availableHeight = $container.height()-70;\n           $(\".\"+divId+\"_clas .wbSheets .ht_master .wtHolder\").css({\n                width: availableWidth,\n                height:availableHeight\n           });\n           $(\".\"+divId+\"_clas .wbSheets .ht_master .wtHolder\").on(\"scroll\",function(){\n               \n                $(\".\"+divId+\"_clas .wbSheets .ht_master .wtHolder\").css({\n                    width: availableWidth,\n                    height:availableHeight\n                });\n           })\n           */\n        };\n        req.send();\n        return true;\n    }\n    /////////////////////////////////////////////////Images//////////////////////////////////////////\n    function getImgContent(fObj, divId, imgSet) {\n\n        $(\"#\" + divId).html(\"\");\n        var file = fObj.Obj;\n\n        var img_div = $(\"#\" + divId);\n        $(\"#\" + divId).verySimpleImageViewer({\n            imageSource: file,\n            frame: imgSet.frame,\n            maxZoom: imgSet.maxZoom,\n            zoomFactor: imgSet.zoomFactor,\n            mouse: imgSet.mouse,\n            keyboard: imgSet.keyboard,\n            toolbar: imgSet.toolbar,\n            rotateToolbar: imgSet.rotateToolbar\n        });\n        return true;\n    }\n    /////////////////////////////////////////////////Unknown file//////////////////////////////////////////\n    function unknownMsg(divId) {\n\n        $(\"#\" + divId).html(\"\");\n\n        var ran5 = 10000 + Math.round(Math.floor() * 90000);\n        var subDiv = $('<div/>').attr({ class: 'unknown_files', id: \"unknown_file_\" + ran5, style: \"color:#9d9999;font-size:30pt\" });\n        $(\"#\" + divId).append(subDiv);\n        $(\"#unknown_file_\" + ran5).html(\"The file is not supported!\");\n        return true;\n    }\n}(jQuery));"
  },
  {
    "path": "example/pages/include/pdf/debugger.js",
    "content": "/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'use strict';\n\nvar FontInspector = (function FontInspectorClosure() {\n  var fonts;\n  var active = false;\n  var fontAttribute = 'data-font-name';\n  function removeSelection() {\n    var divs = document.querySelectorAll('div[' + fontAttribute + ']');\n    for (var i = 0, ii = divs.length; i < ii; ++i) {\n      var div = divs[i];\n      div.className = '';\n    }\n  }\n  function resetSelection() {\n    var divs = document.querySelectorAll('div[' + fontAttribute + ']');\n    for (var i = 0, ii = divs.length; i < ii; ++i) {\n      var div = divs[i];\n      div.className = 'debuggerHideText';\n    }\n  }\n  function selectFont(fontName, show) {\n    var divs = document.querySelectorAll('div[' + fontAttribute + '=' +\n                                         fontName + ']');\n    for (var i = 0, ii = divs.length; i < ii; ++i) {\n      var div = divs[i];\n      div.className = show ? 'debuggerShowText' : 'debuggerHideText';\n    }\n  }\n  function textLayerClick(e) {\n    if (!e.target.dataset.fontName ||\n        e.target.tagName.toUpperCase() !== 'DIV') {\n      return;\n    }\n    var fontName = e.target.dataset.fontName;\n    var selects = document.getElementsByTagName('input');\n    for (var i = 0; i < selects.length; ++i) {\n      var select = selects[i];\n      if (select.dataset.fontName !== fontName) {\n        continue;\n      }\n      select.checked = !select.checked;\n      selectFont(fontName, select.checked);\n      select.scrollIntoView();\n    }\n  }\n  return {\n    // Properties/functions needed by PDFBug.\n    id: 'FontInspector',\n    name: 'Font Inspector',\n    panel: null,\n    manager: null,\n    init: function init(pdfjsLib) {\n      var panel = this.panel;\n      panel.setAttribute('style', 'padding: 5px;');\n      var tmp = document.createElement('button');\n      tmp.addEventListener('click', resetSelection);\n      tmp.textContent = 'Refresh';\n      panel.appendChild(tmp);\n\n      fonts = document.createElement('div');\n      panel.appendChild(fonts);\n    },\n    cleanup: function cleanup() {\n      fonts.textContent = '';\n    },\n    enabled: false,\n    get active() {\n      return active;\n    },\n    set active(value) {\n      active = value;\n      if (active) {\n        document.body.addEventListener('click', textLayerClick, true);\n        resetSelection();\n      } else {\n        document.body.removeEventListener('click', textLayerClick, true);\n        removeSelection();\n      }\n    },\n    // FontInspector specific functions.\n    fontAdded: function fontAdded(fontObj, url) {\n      function properties(obj, list) {\n        var moreInfo = document.createElement('table');\n        for (var i = 0; i < list.length; i++) {\n          var tr = document.createElement('tr');\n          var td1 = document.createElement('td');\n          td1.textContent = list[i];\n          tr.appendChild(td1);\n          var td2 = document.createElement('td');\n          td2.textContent = obj[list[i]].toString();\n          tr.appendChild(td2);\n          moreInfo.appendChild(tr);\n        }\n        return moreInfo;\n      }\n      var moreInfo = properties(fontObj, ['name', 'type']);\n      var fontName = fontObj.loadedName;\n      var font = document.createElement('div');\n      var name = document.createElement('span');\n      name.textContent = fontName;\n      var download = document.createElement('a');\n      if (url) {\n        url = /url\\(['\"]?([^\\)\"']+)/.exec(url);\n        download.href = url[1];\n      } else if (fontObj.data) {\n        url = URL.createObjectURL(new Blob([fontObj.data], {\n          type: fontObj.mimeType,\n        }));\n        download.href = url;\n      }\n      download.textContent = 'Download';\n      var logIt = document.createElement('a');\n      logIt.href = '';\n      logIt.textContent = 'Log';\n      logIt.addEventListener('click', function(event) {\n        event.preventDefault();\n        console.log(fontObj);\n      });\n      var select = document.createElement('input');\n      select.setAttribute('type', 'checkbox');\n      select.dataset.fontName = fontName;\n      select.addEventListener('click', (function(select, fontName) {\n        return (function() {\n           selectFont(fontName, select.checked);\n        });\n      })(select, fontName));\n      font.appendChild(select);\n      font.appendChild(name);\n      font.appendChild(document.createTextNode(' '));\n      font.appendChild(download);\n      font.appendChild(document.createTextNode(' '));\n      font.appendChild(logIt);\n      font.appendChild(moreInfo);\n      fonts.appendChild(font);\n      // Somewhat of a hack, should probably add a hook for when the text layer\n      // is done rendering.\n      setTimeout(() => {\n        if (this.active) {\n          resetSelection();\n        }\n      }, 2000);\n    },\n  };\n})();\n\nvar opMap;\n\n// Manages all the page steppers.\nvar StepperManager = (function StepperManagerClosure() {\n  var steppers = [];\n  var stepperDiv = null;\n  var stepperControls = null;\n  var stepperChooser = null;\n  var breakPoints = Object.create(null);\n  return {\n    // Properties/functions needed by PDFBug.\n    id: 'Stepper',\n    name: 'Stepper',\n    panel: null,\n    manager: null,\n    init: function init(pdfjsLib) {\n      var self = this;\n      this.panel.setAttribute('style', 'padding: 5px;');\n      stepperControls = document.createElement('div');\n      stepperChooser = document.createElement('select');\n      stepperChooser.addEventListener('change', function(event) {\n        self.selectStepper(this.value);\n      });\n      stepperControls.appendChild(stepperChooser);\n      stepperDiv = document.createElement('div');\n      this.panel.appendChild(stepperControls);\n      this.panel.appendChild(stepperDiv);\n      if (sessionStorage.getItem('pdfjsBreakPoints')) {\n        breakPoints = JSON.parse(sessionStorage.getItem('pdfjsBreakPoints'));\n      }\n\n      opMap = Object.create(null);\n      for (var key in pdfjsLib.OPS) {\n        opMap[pdfjsLib.OPS[key]] = key;\n      }\n    },\n    cleanup: function cleanup() {\n      stepperChooser.textContent = '';\n      stepperDiv.textContent = '';\n      steppers = [];\n    },\n    enabled: false,\n    active: false,\n    // Stepper specific functions.\n    create: function create(pageIndex) {\n      var debug = document.createElement('div');\n      debug.id = 'stepper' + pageIndex;\n      debug.setAttribute('hidden', true);\n      debug.className = 'stepper';\n      stepperDiv.appendChild(debug);\n      var b = document.createElement('option');\n      b.textContent = 'Page ' + (pageIndex + 1);\n      b.value = pageIndex;\n      stepperChooser.appendChild(b);\n      var initBreakPoints = breakPoints[pageIndex] || [];\n      var stepper = new Stepper(debug, pageIndex, initBreakPoints);\n      steppers.push(stepper);\n      if (steppers.length === 1) {\n        this.selectStepper(pageIndex, false);\n      }\n      return stepper;\n    },\n    selectStepper: function selectStepper(pageIndex, selectPanel) {\n      var i;\n      pageIndex = pageIndex | 0;\n      if (selectPanel) {\n        this.manager.selectPanel(this);\n      }\n      for (i = 0; i < steppers.length; ++i) {\n        var stepper = steppers[i];\n        if (stepper.pageIndex === pageIndex) {\n          stepper.panel.removeAttribute('hidden');\n        } else {\n          stepper.panel.setAttribute('hidden', true);\n        }\n      }\n      var options = stepperChooser.options;\n      for (i = 0; i < options.length; ++i) {\n        var option = options[i];\n        option.selected = (option.value | 0) === pageIndex;\n      }\n    },\n    saveBreakPoints: function saveBreakPoints(pageIndex, bps) {\n      breakPoints[pageIndex] = bps;\n      sessionStorage.setItem('pdfjsBreakPoints', JSON.stringify(breakPoints));\n    },\n  };\n})();\n\n// The stepper for each page's IRQueue.\nvar Stepper = (function StepperClosure() {\n  // Shorter way to create element and optionally set textContent.\n  function c(tag, textContent) {\n    var d = document.createElement(tag);\n    if (textContent) {\n      d.textContent = textContent;\n    }\n    return d;\n  }\n\n  function simplifyArgs(args) {\n    if (typeof args === 'string') {\n      var MAX_STRING_LENGTH = 75;\n      return args.length <= MAX_STRING_LENGTH ? args :\n        args.substr(0, MAX_STRING_LENGTH) + '...';\n    }\n    if (typeof args !== 'object' || args === null) {\n      return args;\n    }\n    if ('length' in args) { // array\n      var simpleArgs = [], i, ii;\n      var MAX_ITEMS = 10;\n      for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) {\n        simpleArgs.push(simplifyArgs(args[i]));\n      }\n      if (i < args.length) {\n        simpleArgs.push('...');\n      }\n      return simpleArgs;\n    }\n    var simpleObj = {};\n    for (var key in args) {\n      simpleObj[key] = simplifyArgs(args[key]);\n    }\n    return simpleObj;\n  }\n\n  function Stepper(panel, pageIndex, initialBreakPoints) {\n    this.panel = panel;\n    this.breakPoint = 0;\n    this.nextBreakPoint = null;\n    this.pageIndex = pageIndex;\n    this.breakPoints = initialBreakPoints;\n    this.currentIdx = -1;\n    this.operatorListIdx = 0;\n  }\n  Stepper.prototype = {\n    init: function init(operatorList) {\n      var panel = this.panel;\n      var content = c('div', 'c=continue, s=step');\n      var table = c('table');\n      content.appendChild(table);\n      table.cellSpacing = 0;\n      var headerRow = c('tr');\n      table.appendChild(headerRow);\n      headerRow.appendChild(c('th', 'Break'));\n      headerRow.appendChild(c('th', 'Idx'));\n      headerRow.appendChild(c('th', 'fn'));\n      headerRow.appendChild(c('th', 'args'));\n      panel.appendChild(content);\n      this.table = table;\n      this.updateOperatorList(operatorList);\n    },\n    updateOperatorList: function updateOperatorList(operatorList) {\n      var self = this;\n\n      function cboxOnClick() {\n        var x = +this.dataset.idx;\n        if (this.checked) {\n          self.breakPoints.push(x);\n        } else {\n          self.breakPoints.splice(self.breakPoints.indexOf(x), 1);\n        }\n        StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints);\n      }\n\n      var MAX_OPERATORS_COUNT = 15000;\n      if (this.operatorListIdx > MAX_OPERATORS_COUNT) {\n        return;\n      }\n\n      var chunk = document.createDocumentFragment();\n      var operatorsToDisplay = Math.min(MAX_OPERATORS_COUNT,\n                                        operatorList.fnArray.length);\n      for (var i = this.operatorListIdx; i < operatorsToDisplay; i++) {\n        var line = c('tr');\n        line.className = 'line';\n        line.dataset.idx = i;\n        chunk.appendChild(line);\n        var checked = this.breakPoints.indexOf(i) !== -1;\n        var args = operatorList.argsArray[i] || [];\n\n        var breakCell = c('td');\n        var cbox = c('input');\n        cbox.type = 'checkbox';\n        cbox.className = 'points';\n        cbox.checked = checked;\n        cbox.dataset.idx = i;\n        cbox.onclick = cboxOnClick;\n\n        breakCell.appendChild(cbox);\n        line.appendChild(breakCell);\n        line.appendChild(c('td', i.toString()));\n        var fn = opMap[operatorList.fnArray[i]];\n        var decArgs = args;\n        if (fn === 'showText') {\n          var glyphs = args[0];\n          var newArgs = [];\n          var str = [];\n          for (var j = 0; j < glyphs.length; j++) {\n            var glyph = glyphs[j];\n            if (typeof glyph === 'object' && glyph !== null) {\n              str.push(glyph.fontChar);\n            } else {\n              if (str.length > 0) {\n                newArgs.push(str.join(''));\n                str = [];\n              }\n              newArgs.push(glyph); // null or number\n            }\n          }\n          if (str.length > 0) {\n            newArgs.push(str.join(''));\n          }\n          decArgs = [newArgs];\n        }\n        line.appendChild(c('td', fn));\n        line.appendChild(c('td', JSON.stringify(simplifyArgs(decArgs))));\n      }\n      if (operatorsToDisplay < operatorList.fnArray.length) {\n        line = c('tr');\n        var lastCell = c('td', '...');\n        lastCell.colspan = 4;\n        chunk.appendChild(lastCell);\n      }\n      this.operatorListIdx = operatorList.fnArray.length;\n      this.table.appendChild(chunk);\n    },\n    getNextBreakPoint: function getNextBreakPoint() {\n      this.breakPoints.sort(function(a, b) {\n        return a - b;\n      });\n      for (var i = 0; i < this.breakPoints.length; i++) {\n        if (this.breakPoints[i] > this.currentIdx) {\n          return this.breakPoints[i];\n        }\n      }\n      return null;\n    },\n    breakIt: function breakIt(idx, callback) {\n      StepperManager.selectStepper(this.pageIndex, true);\n      var self = this;\n      var dom = document;\n      self.currentIdx = idx;\n      var listener = function(e) {\n        switch (e.keyCode) {\n          case 83: // step\n            dom.removeEventListener('keydown', listener);\n            self.nextBreakPoint = self.currentIdx + 1;\n            self.goTo(-1);\n            callback();\n            break;\n          case 67: // continue\n            dom.removeEventListener('keydown', listener);\n            var breakPoint = self.getNextBreakPoint();\n            self.nextBreakPoint = breakPoint;\n            self.goTo(-1);\n            callback();\n            break;\n        }\n      };\n      dom.addEventListener('keydown', listener);\n      self.goTo(idx);\n    },\n    goTo: function goTo(idx) {\n      var allRows = this.panel.getElementsByClassName('line');\n      for (var x = 0, xx = allRows.length; x < xx; ++x) {\n        var row = allRows[x];\n        if ((row.dataset.idx | 0) === idx) {\n          row.style.backgroundColor = 'rgb(251,250,207)';\n          row.scrollIntoView();\n        } else {\n          row.style.backgroundColor = null;\n        }\n      }\n    },\n  };\n  return Stepper;\n})();\n\nvar Stats = (function Stats() {\n  var stats = [];\n  function clear(node) {\n    while (node.hasChildNodes()) {\n      node.removeChild(node.lastChild);\n    }\n  }\n  function getStatIndex(pageNumber) {\n    for (var i = 0, ii = stats.length; i < ii; ++i) {\n      if (stats[i].pageNumber === pageNumber) {\n        return i;\n      }\n    }\n    return false;\n  }\n  return {\n    // Properties/functions needed by PDFBug.\n    id: 'Stats',\n    name: 'Stats',\n    panel: null,\n    manager: null,\n    init(pdfjsLib) {\n      this.panel.setAttribute('style', 'padding: 5px;');\n      pdfjsLib.PDFJS.enableStats = true;\n    },\n    enabled: false,\n    active: false,\n    // Stats specific functions.\n    add(pageNumber, stat) {\n      if (!stat) {\n        return;\n      }\n      var statsIndex = getStatIndex(pageNumber);\n      if (statsIndex !== false) {\n        var b = stats[statsIndex];\n        this.panel.removeChild(b.div);\n        stats.splice(statsIndex, 1);\n      }\n      var wrapper = document.createElement('div');\n      wrapper.className = 'stats';\n      var title = document.createElement('div');\n      title.className = 'title';\n      title.textContent = 'Page: ' + pageNumber;\n      var statsDiv = document.createElement('div');\n      statsDiv.textContent = stat.toString();\n      wrapper.appendChild(title);\n      wrapper.appendChild(statsDiv);\n      stats.push({ pageNumber, div: wrapper, });\n      stats.sort(function(a, b) {\n        return a.pageNumber - b.pageNumber;\n      });\n      clear(this.panel);\n      for (var i = 0, ii = stats.length; i < ii; ++i) {\n        this.panel.appendChild(stats[i].div);\n      }\n    },\n    cleanup() {\n      stats = [];\n      clear(this.panel);\n    },\n  };\n})();\n\n// Manages all the debugging tools.\nwindow.PDFBug = (function PDFBugClosure() {\n  var panelWidth = 300;\n  var buttons = [];\n  var activePanel = null;\n\n  return {\n    tools: [\n      FontInspector,\n      StepperManager,\n      Stats\n    ],\n    enable(ids) {\n      var all = false, tools = this.tools;\n      if (ids.length === 1 && ids[0] === 'all') {\n        all = true;\n      }\n      for (var i = 0; i < tools.length; ++i) {\n        var tool = tools[i];\n        if (all || ids.indexOf(tool.id) !== -1) {\n          tool.enabled = true;\n        }\n      }\n      if (!all) {\n        // Sort the tools by the order they are enabled.\n        tools.sort(function(a, b) {\n          var indexA = ids.indexOf(a.id);\n          indexA = indexA < 0 ? tools.length : indexA;\n          var indexB = ids.indexOf(b.id);\n          indexB = indexB < 0 ? tools.length : indexB;\n          return indexA - indexB;\n        });\n      }\n    },\n    init(pdfjsLib, container) {\n      /*\n       * Basic Layout:\n       * PDFBug\n       *  Controls\n       *  Panels\n       *    Panel\n       *    Panel\n       *    ...\n       */\n      var ui = document.createElement('div');\n      ui.id = 'PDFBug';\n\n      var controls = document.createElement('div');\n      controls.setAttribute('class', 'controls');\n      ui.appendChild(controls);\n\n      var panels = document.createElement('div');\n      panels.setAttribute('class', 'panels');\n      ui.appendChild(panels);\n\n      container.appendChild(ui);\n      container.style.right = panelWidth + 'px';\n\n      // Initialize all the debugging tools.\n      var tools = this.tools;\n      var self = this;\n      for (var i = 0; i < tools.length; ++i) {\n        var tool = tools[i];\n        var panel = document.createElement('div');\n        var panelButton = document.createElement('button');\n        panelButton.textContent = tool.name;\n        panelButton.addEventListener('click', (function(selected) {\n          return function(event) {\n            event.preventDefault();\n            self.selectPanel(selected);\n          };\n        })(i));\n        controls.appendChild(panelButton);\n        panels.appendChild(panel);\n        tool.panel = panel;\n        tool.manager = this;\n        if (tool.enabled) {\n          tool.init(pdfjsLib);\n        } else {\n          panel.textContent = tool.name + ' is disabled. To enable add ' +\n                              ' \"' + tool.id + '\" to the pdfBug parameter ' +\n                              'and refresh (separate multiple by commas).';\n        }\n        buttons.push(panelButton);\n      }\n      this.selectPanel(0);\n    },\n    cleanup() {\n      for (var i = 0, ii = this.tools.length; i < ii; i++) {\n        if (this.tools[i].enabled) {\n          this.tools[i].cleanup();\n        }\n      }\n    },\n    selectPanel(index) {\n      if (typeof index !== 'number') {\n        index = this.tools.indexOf(index);\n      }\n      if (index === activePanel) {\n        return;\n      }\n      activePanel = index;\n      var tools = this.tools;\n      for (var j = 0; j < tools.length; ++j) {\n        if (j === index) {\n          buttons[j].setAttribute('class', 'active');\n          tools[j].active = true;\n          tools[j].panel.removeAttribute('hidden');\n        } else {\n          buttons[j].setAttribute('class', '');\n          tools[j].active = false;\n          tools[j].panel.setAttribute('hidden', 'true');\n        }\n      }\n    },\n  };\n})();\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ach/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pot buk mukato\nprevious_label=Mukato\nnext.title=Pot buk malubo\nnext_label=Malubo\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pot buk\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=pi {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} me {{pagesCount}})\n\nzoom_out.title=Jwik Matidi\nzoom_out_label=Jwik Matidi\nzoom_in.title=Kwot Madit\nzoom_in_label=Kwot Madit\nzoom.title=Kwoti\npresentation_mode.title=Lokke i kit me tyer\npresentation_mode_label=Kit me tyer\nopen_file.title=Yab Pwail\nopen_file_label=Yab\nprint.title=Go\nprint_label=Go\ndownload.title=Gam\ndownload_label=Gam\nbookmark.title=Neno ma kombedi (lok onyo yab i dirica manyen)\nbookmark_label=Neno ma kombedi\n\n# Secondary toolbar and context menu\ntools.title=Gintic\ntools_label=Gintic\nfirst_page.title=Cit i pot buk mukwongo\nfirst_page.label=Cit i pot buk mukwongo\nfirst_page_label=Cit i pot buk mukwongo\nlast_page.title=Cit i pot buk magiko\nlast_page.label=Cit i pot buk magiko\nlast_page_label=Cit i pot buk magiko\npage_rotate_cw.title=Wire i tung lacuc\npage_rotate_cw.label=Wire i tung lacuc\npage_rotate_cw_label=Wire i tung lacuc\npage_rotate_ccw.title=Wire i tung lacam\npage_rotate_ccw.label=Wire i tung lacam\npage_rotate_ccw_label=Wire i tung lacam\n\ncursor_hand_tool.title=Cak gitic me cing\n\n# Document properties dialog box\ndocument_properties.title=Jami me gin acoya…\ndocument_properties_label=Jami me gin acoya…\ndocument_properties_file_name=Nying pwail:\ndocument_properties_file_size=Dit pa pwail:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Wiye:\ndocument_properties_author=Ngat mucoyo:\ndocument_properties_subject=Subjek:\ndocument_properties_keywords=Lok mapire tek:\ndocument_properties_creation_date=Nino dwe me cwec:\ndocument_properties_modification_date=Nino dwe me yub:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Lacwec:\ndocument_properties_producer=Layub PDF:\ndocument_properties_version=Kit PDF:\ndocument_properties_page_count=Kwan me pot buk:\ndocument_properties_close=Lor\n\nprint_progress_message=Yubo coc me agoya…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Juki\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Lok gintic ma inget\ntoggle_sidebar_label=Lok gintic ma inget\ndocument_outline_label=Pek pa gin acoya\nattachments.title=Nyut twec\nattachments_label=Twec\nthumbs.title=Nyut cal\nthumbs_label=Cal\nfindbar.title=Nong iye gin acoya\nfindbar_label=Nong\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pot buk {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Cal me pot buk {{page}}\n\n# Find panel button title and messages\nfind_input.title=Nong\nfind_input.placeholder=Nong i dokumen…\nfind_previous.title=Nong timme pa lok mukato\nfind_previous_label=Mukato\nfind_next.title=Nong timme pa lok malubo\nfind_next_label=Malubo\nfind_highlight=Wer weng\nfind_match_case_label=Lok marwate\nfind_reached_top=Oo iwi gin acoya, omede ki i tere\nfind_reached_bottom=Oo i agiki me gin acoya, omede ki iwiye\nfind_not_found=Lok pe ononge\n\n# Error panel labels\nerror_more_info=Ngec Mukene\nerror_less_info=Ngec Manok\nerror_close=Lor\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Kwena: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Can kikore {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Pwail: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rek: {{line}}\nrendering_error=Bal otime i kare me nyuto pot buk.\n\n# Predefined zoom values\npage_scale_width=Lac me iye pot buk\npage_scale_fit=Porre me pot buk\npage_scale_auto=Kwot pire kene\npage_scale_actual=Dite kikome\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Bal\nloading_error=Bal otime kun cano PDF.\ninvalid_file_error=Pwail me PDF ma pe atir onyo obale woko.\nmissing_file_error=Pwail me PDF tye ka rem.\nunexpected_response_error=Lagam mape kigeno pa lapok tic.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Lok angea manok]\npassword_label=Ket mung me donyo me yabo pwail me PDF man.\npassword_invalid=Mung me donyo pe atir. Tim ber i tem doki.\npassword_ok=OK\npassword_cancel=Juki\n\nprinting_not_supported=Ciko: Layeny ma pe teno goyo liweng.\nprinting_not_ready=Ciko: PDF pe ocane weng me agoya.\nweb_fonts_disabled=Kijuko dit pa coc me kakube woko: pe romo tic ki dit pa coc me PDF ma kiketo i kine.\ndocument_colors_not_allowed=Pe ki yee ki gin acoya me PDF me tic ki rangi gi kengi: Kijuko woko “Yee pot buk me yero rangi mamegi kengi” ki i layeny.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/af/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Vorige bladsy\nprevious_label=Vorige\nnext.title=Volgende bladsy\nnext_label=Volgende\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Bladsy\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=van {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} van {{pagesCount}})\n\nzoom_out.title=Zoem uit\nzoom_out_label=Zoem uit\nzoom_in.title=Zoem in\nzoom_in_label=Zoem in\nzoom.title=Zoem\npresentation_mode.title=Wissel na voorleggingsmodus\npresentation_mode_label=Voorleggingsmodus\nopen_file.title=Open lêer\nopen_file_label=Open\nprint.title=Druk\nprint_label=Druk\ndownload.title=Laai af\ndownload_label=Laai af\nbookmark.title=Huidige aansig (kopieer of open in nuwe venster)\nbookmark_label=Huidige aansig\n\n# Secondary toolbar and context menu\ntools.title=Nutsgoed\ntools_label=Nutsgoed\nfirst_page.title=Gaan na eerste bladsy\nfirst_page.label=Gaan na eerste bladsy\nfirst_page_label=Gaan na eerste bladsy\nlast_page.title=Gaan na laaste bladsy\nlast_page.label=Gaan na laaste bladsy\nlast_page_label=Gaan na laaste bladsy\npage_rotate_cw.title=Roteer kloksgewys\npage_rotate_cw.label=Roteer kloksgewys\npage_rotate_cw_label=Roteer kloksgewys\npage_rotate_ccw.title=Roteer anti-kloksgewys\npage_rotate_ccw.label=Roteer anti-kloksgewys\npage_rotate_ccw_label=Roteer anti-kloksgewys\n\ncursor_text_select_tool.title=Aktiveer gereedskap om teks te merk\ncursor_text_select_tool_label=Teksmerkgereedskap\ncursor_hand_tool.title=Aktiveer handjie\ncursor_hand_tool_label=Handjie\n\n# Document properties dialog box\ndocument_properties.title=Dokumenteienskappe…\ndocument_properties_label=Dokumenteienskappe…\ndocument_properties_file_name=Lêernaam:\ndocument_properties_file_size=Lêergrootte:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kG ({{size_b}} grepe)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MG ({{size_b}} grepe)\ndocument_properties_title=Titel:\ndocument_properties_author=Outeur:\ndocument_properties_subject=Onderwerp:\ndocument_properties_keywords=Sleutelwoorde:\ndocument_properties_creation_date=Skeppingsdatum:\ndocument_properties_modification_date=Wysigingsdatum:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Skepper:\ndocument_properties_producer=PDF-vervaardiger:\ndocument_properties_version=PDF-weergawe:\ndocument_properties_page_count=Aantal bladsye:\ndocument_properties_close=Sluit\n\nprint_progress_message=Berei tans dokument voor om te druk…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Kanselleer\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Sypaneel aan/af\ntoggle_sidebar_notification.title=Sypaneel aan/af (dokument bevat skema/aanhegsels)\ntoggle_sidebar_label=Sypaneel aan/af\ndocument_outline.title=Wys dokumentskema (dubbelklik om alle items oop/toe te vou)\ndocument_outline_label=Dokumentoorsig\nattachments.title=Wys aanhegsels\nattachments_label=Aanhegsels\nthumbs.title=Wys duimnaels\nthumbs_label=Duimnaels\nfindbar.title=Soek in dokument\nfindbar_label=Vind\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Bladsy {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Duimnael van bladsy {{page}}\n\n# Find panel button title and messages\nfind_input.title=Vind\nfind_input.placeholder=Soek in dokument…\nfind_previous.title=Vind die vorige voorkoms van die frase\nfind_previous_label=Vorige\nfind_next.title=Vind die volgende voorkoms van die frase\nfind_next_label=Volgende\nfind_highlight=Verlig almal\nfind_match_case_label=Kassensitief\nfind_reached_top=Bokant van dokument is bereik; gaan voort van onder af\nfind_reached_bottom=Einde van dokument is bereik; gaan voort van bo af\nfind_not_found=Frase nie gevind nie\n\n# Error panel labels\nerror_more_info=Meer inligting\nerror_less_info=Minder inligting\nerror_close=Sluit\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (ID: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Boodskap: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stapel: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Lêer: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Lyn: {{line}}\nrendering_error='n Fout het voorgekom toe die bladsy weergegee is.\n\n# Predefined zoom values\npage_scale_width=Bladsywydte\npage_scale_fit=Pas bladsy\npage_scale_auto=Outomatiese zoem\npage_scale_actual=Werklike grootte\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Fout\nloading_error='n Fout het voorgekom met die laai van die PDF.\ninvalid_file_error=Ongeldige of korrupte PDF-lêer.\nmissing_file_error=PDF-lêer is weg.\nunexpected_response_error=Onverwagse antwoord van bediener.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-annotasie]\npassword_label=Gee die wagwoord om dié PDF-lêer mee te open.\npassword_invalid=Ongeldige wagwoord. Probeer gerus weer.\npassword_ok=OK\npassword_cancel=Kanselleer\n\nprinting_not_supported=Waarskuwing: Dié blaaier ondersteun nie drukwerk ten volle nie.\nprinting_not_ready=Waarskuwing: Die PDF is nog nie volledig gelaai vir drukwerk nie.\nweb_fonts_disabled=Webfonte is gedeaktiveer: kan nie PDF-fonte wat ingebed is, gebruik nie.\ndocument_colors_not_allowed=PDF-dokumente word nie toegelaat om hul eie kleure te gebruik nie: “Laat bladsye toe om hul eie kleure te kies” is gedeaktiveer in die blaaier.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ak/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Krataafa baako a etwa mu\nprevious_label=Ekyiri-baako\nnext.title=Krataafa a edi so baako\nnext_label=Dea-ɛ-di-so-baako\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Zuum pue\nzoom_out_label=Zuum ba abɔnten\nzoom_in.title=Zuum kɔ mu\nzoom_in_label=Zuum kɔ mu\nzoom.title=Zuum\npresentation_mode.title=Sesa kɔ Yɛkyerɛ Tebea mu\npresentation_mode_label=Yɛkyerɛ Tebea\nopen_file.title=Bue Fael\nopen_file_label=Bue\nprint.title=Prente\nprint_label=Prente\ndownload.title=Twe\ndownload_label=Twe\nbookmark.title=Seisei nhwɛ (fa anaaso bue wɔ tokuro foforo mu)\nbookmark_label=Seisei nhwɛ\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Ti asɛm:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Sɔ anaaso dum saedbaa\ntoggle_sidebar_label=Sɔ anaaso dum saedbaa\ndocument_outline_label=Dɔkomɛnt bɔbea\nthumbs.title=Kyerɛ mfoniwaa\nthumbs_label=Mfoniwaa\nfindbar.title=Hu wɔ dɔkomɛnt no mu\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Krataafa {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Krataafa ne mfoniwaa {{page}}\n\n# Find panel button title and messages\nfind_previous.title=San hu fres wɔ ekyiri baako\nfind_previous_label=Ekyiri baako\nfind_next.title=San hu fres no wɔ enim baako\nfind_next_label=Ndiso\nfind_highlight=Hyɛ bibiara nso\nfind_match_case_label=Fa susu kaase\nfind_reached_top=Edu krataafa ne soro, atoa so efiri ase\nfind_reached_bottom=Edu krataafa n'ewiei, atoa so efiri soro\nfind_not_found=Ennhu fres\n\n# Error panel labels\nerror_more_info=Infɔmehyɛn bio a wɔka ho\nerror_less_info=Te infɔmehyɛn bio a wɔka ho so\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{vɛɛhyen}} (nsi: {{si}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Nkrato: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Staake: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fael: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Laen: {{line}}\nrendering_error=Mfomso bae wɔ bere a wɔ rekyerɛ krataafa no.\n\n# Predefined zoom values\npage_scale_width=Krataafa tɛtrɛtɛ\npage_scale_fit=Krataafa ehimtwa\npage_scale_auto=Zuum otomatik\npage_scale_actual=Kɛseyɛ ankasa\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Mfomso\nloading_error=Mfomso bae wɔ bere a wɔreloode PDF no.\ninvalid_file_error=PDF fael no nndi mu anaaso ho atɔ kyima.\nmissing_file_error=PDF fael no ayera.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Tɛkst-nyiano]\npassword_ok=OK\n\nprinting_not_supported=Kɔkɔbɔ: Brawsa yi nnhyɛ daa mma prent ho kwan.\nprinting_not_ready=Kɔkɔbɔ: Wɔnntwee PDF fael no nyinara mmbaee ama wo ɛ tumi aprente.\nweb_fonts_disabled=Ɔedum wɛb-mfɔnt: nntumi mmfa PDF mfɔnt a wɔhyɛ mu nndi dwuma.\ndocument_colors_not_allowed=Wɔmma ho kwan sɛ PDF adɔkomɛnt de wɔn ara wɔn ahosu bɛdi dwuma: wɔ adum 'Ma ho kwan ma nkrataafa mpaw wɔn ara wɔn ahosu' wɔ brawsa yi mu.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/an/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pachina anterior\nprevious_label=Anterior\nnext.title=Pachina siguient\nnext_label=Siguient\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pachina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Achiquir\nzoom_out_label=Achiquir\nzoom_in.title=Agrandir\nzoom_in_label=Agrandir\nzoom.title=Grandaria\npresentation_mode.title=Cambear t'o modo de presentación\npresentation_mode_label=Modo de presentación\nopen_file.title=Ubrir o fichero\nopen_file_label=Ubrir\nprint.title=Imprentar\nprint_label=Imprentar\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar u ubrir en una nueva finestra)\nbookmark_label=Anvista actual\n\n# Secondary toolbar and context menu\ntools.title=Ferramientas\ntools_label=Ferramientas\nfirst_page.title=Ir ta la primer pachina\nfirst_page.label=Ir ta la primer pachina\nfirst_page_label=Ir ta la primer pachina\nlast_page.title=Ir ta la zaguer pachina\nlast_page.label=Ir ta la zaguera pachina\nlast_page_label=Ir ta la zaguer pachina\npage_rotate_cw.title=Chirar enta la dreita\npage_rotate_cw.label=Chirar enta la dreita\npage_rotate_cw_label=Chira enta la dreita\npage_rotate_ccw.title=Chirar enta la zurda\npage_rotate_ccw.label=Chirar en sentiu antihorario\npage_rotate_ccw_label=Chirar enta la zurda\n\n\n# Document properties dialog box\ndocument_properties.title=Propiedatz d'o documento...\ndocument_properties_label=Propiedatz d'o documento...\ndocument_properties_file_name=Nombre de fichero:\ndocument_properties_file_size=Grandaria d'o fichero:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titol:\ndocument_properties_author=Autor:\ndocument_properties_subject=Afer:\ndocument_properties_keywords=Parolas clau:\ndocument_properties_creation_date=Calendata de creyación:\ndocument_properties_modification_date=Calendata de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creyador:\ndocument_properties_producer=Creyador de PDF:\ndocument_properties_version=Versión de PDF:\ndocument_properties_page_count=Numero de pachinas:\ndocument_properties_close=Zarrar\n\nprint_progress_message=Se ye preparando la documentación pa imprentar…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Amostrar u amagar a barra lateral\ntoggle_sidebar_notification.title=Cambiar barra lateral (lo documento contiene esquema/adchuntos)\ntoggle_sidebar_label=Amostrar a barra lateral\ndocument_outline.title=Amostrar esquema d'o documento (fer doble clic pa expandir/compactar totz los items)\ndocument_outline_label=Esquema d'o documento\nattachments.title=Amostrar os adchuntos\nattachments_label=Adchuntos\nthumbs.title=Amostrar as miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Trobar en o documento\nfindbar_label=Trobar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pachina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura d'a pachina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Trobar\nfind_input.placeholder=Trobar en o documento…\nfind_previous.title=Trobar l'anterior coincidencia d'a frase\nfind_previous_label=Anterior\nfind_next.title=Trobar a siguient coincidencia d'a frase\nfind_next_label=Siguient\nfind_highlight=Resaltar-lo tot\nfind_match_case_label=Coincidencia de mayusclas/minusclas\nfind_reached_top=S'ha plegau a l'inicio d'o documento, se contina dende baixo\nfind_reached_bottom=S'ha plegau a la fin d'o documento, se contina dende alto\nfind_not_found=No s'ha trobau a frase\n\n# Error panel labels\nerror_more_info=Mas información\nerror_less_info=Menos información\nerror_close=Zarrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensache: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fichero: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linia: {{line}}\nrendering_error=Ha ocurriu una error en renderizar a pachina.\n\n# Predefined zoom values\npage_scale_width=Amplaria d'a pachina\npage_scale_fit=Achuste d'a pachina\npage_scale_auto=Grandaria automatica\npage_scale_actual=Grandaria actual\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=S'ha produciu una error en cargar o PDF.\ninvalid_file_error=O PDF no ye valido u ye estorbau.\nmissing_file_error=No i ha fichero PDF.\nunexpected_response_error=Respuesta a lo servicio inasperada.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotación {{type}}]\npassword_label=Introduzca a clau ta ubrir iste fichero PDF.\npassword_invalid=Clau invalida. Torna a intentar-lo.\npassword_ok=Acceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Pare cuenta: Iste navegador no maneya totalment as impresions.\nprinting_not_ready=Aviso: Encara no se ha cargau completament o PDF ta imprentar-lo.\nweb_fonts_disabled=As fuents web son desactivadas: no se puet incrustar fichers PDF.\ndocument_colors_not_allowed=Los documentos PDF no pueden fer servir las suyas propias colors: 'Permitir que as pachinas triguen as suyas propias colors' ye desactivau en o navegador.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ar/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=الصفحة السابقة\nprevious_label=السابقة\nnext.title=الصفحة التالية\nnext_label=التالية\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=صفحة\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=من {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} من {{pagesCount}})\n\nzoom_out.title=بعّد\nzoom_out_label=بعّد\nzoom_in.title=قرّب\nzoom_in_label=قرّب\nzoom.title=التقريب\npresentation_mode.title=انتقل لوضع العرض التقديمي\npresentation_mode_label=وضع العرض التقديمي\nopen_file.title=افتح ملفًا\nopen_file_label=افتح\nprint.title=اطبع\nprint_label=اطبع\ndownload.title=نزّل\ndownload_label=نزّل\nbookmark.title=المنظور الحالي (انسخ أو افتح في نافذة جديدة)\nbookmark_label=المنظور الحالي\n\n# Secondary toolbar and context menu\ntools.title=الأدوات\ntools_label=الأدوات\nfirst_page.title=اذهب إلى الصفحة الأولى\nfirst_page.label=اذهب إلى الصفحة الأولى\nfirst_page_label=اذهب إلى الصفحة الأولى\nlast_page.title=اذهب إلى الصفحة الأخيرة\nlast_page.label=اذهب إلى الصفحة الأخيرة\nlast_page_label=اذهب إلى الصفحة الأخيرة\npage_rotate_cw.title=أدر باتجاه عقارب الساعة\npage_rotate_cw.label=أدر باتجاه عقارب الساعة\npage_rotate_cw_label=أدر باتجاه عقارب الساعة\npage_rotate_ccw.title=أدر بعكس اتجاه عقارب الساعة\npage_rotate_ccw.label=أدر بعكس اتجاه عقارب الساعة\npage_rotate_ccw_label=أدر بعكس اتجاه عقارب الساعة\n\ncursor_text_select_tool.title=فعّل أداة اختيار النص\ncursor_text_select_tool_label=أداة اختيار النص\ncursor_hand_tool.title=فعّل أداة اليد\ncursor_hand_tool_label=أداة اليد\n\n# Document properties dialog box\ndocument_properties.title=خصائص المستند…\ndocument_properties_label=خصائص المستند…\ndocument_properties_file_name=اسم الملف:\ndocument_properties_file_size=حجم الملف:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} ك.بايت ({{size_b}} بايت)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} م.بايت ({{size_b}} بايت)\ndocument_properties_title=العنوان:\ndocument_properties_author=المؤلف:\ndocument_properties_subject=الموضوع:\ndocument_properties_keywords=الكلمات الأساسية:\ndocument_properties_creation_date=تاريخ الإنشاء:\ndocument_properties_modification_date=تاريخ التعديل:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}، {{time}}\ndocument_properties_creator=المنشئ:\ndocument_properties_producer=منتج PDF:\ndocument_properties_version=إصدارة PDF:\ndocument_properties_page_count=عدد الصفحات:\ndocument_properties_close=أغلق\n\nprint_progress_message=يُحضّر المستند للطباعة…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}٪\nprint_progress_close=ألغِ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=بدّل ظهور الشريط الجانبي\ntoggle_sidebar_notification.title=بدّل ظهور الشريط الجانبي (يحتوي المستند على مخطط أو مرفقات)\ntoggle_sidebar_label=بدّل ظهور الشريط الجانبي\ndocument_outline.title=اعرض فهرس المستند (نقر مزدوج لتمديد أو تقليص كل العناصر)\ndocument_outline_label=مخطط المستند\nattachments.title=اعرض المرفقات\nattachments_label=المُرفقات\nthumbs.title=اعرض مُصغرات\nthumbs_label=مُصغّرات\nfindbar.title=ابحث في المستند\nfindbar_label=ابحث\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=صفحة {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=مصغّرة صفحة {{page}}\n\n# Find panel button title and messages\nfind_input.title=ابحث\nfind_input.placeholder=ابحث في المستند…\nfind_previous.title=ابحث عن التّواجد السّابق للعبارة\nfind_previous_label=السابق\nfind_next.title=ابحث عن التّواجد التّالي للعبارة\nfind_next_label=التالي\nfind_highlight=أبرِز الكل\nfind_match_case_label=طابق حالة الأحرف\nfind_reached_top=تابعت من الأسفل بعدما وصلت إلى بداية المستند\nfind_reached_bottom=تابعت من الأعلى بعدما وصلت إلى نهاية المستند\nfind_not_found=لا وجود للعبارة\n\n# Error panel labels\nerror_more_info=معلومات أكثر\nerror_less_info=معلومات أقل\nerror_close=أغلق\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=‏PDF.js ن{{version}} ‏(بناء: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=الرسالة: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=الرصّة: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=الملف: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=السطر: {{line}}\nrendering_error=حدث خطأ أثناء عرض الصفحة.\n\n# Predefined zoom values\npage_scale_width=عرض الصفحة\npage_scale_fit=ملائمة الصفحة\npage_scale_auto=تقريب تلقائي\npage_scale_actual=الحجم الحقيقي\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}٪\n\n# Loading indicator messages\nloading_error_indicator=عطل\nloading_error=حدث عطل أثناء تحميل ملف PDF.\ninvalid_file_error=ملف PDF تالف أو غير صحيح.\nmissing_file_error=ملف PDF غير موجود.\nunexpected_response_error=استجابة خادوم غير متوقعة.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[تعليق {{type}}]\npassword_label=أدخل لكلمة السر لفتح هذا الملف.\npassword_invalid=كلمة سر خطأ. من فضلك أعد المحاولة.\npassword_ok=حسنا\npassword_cancel=ألغِ\n\nprinting_not_supported=تحذير: لا يدعم هذا المتصفح الطباعة بشكل كامل.\nprinting_not_ready=تحذير: ملف PDF لم يُحمّل كاملًا للطباعة.\nweb_fonts_disabled=خطوط الوب مُعطّلة: تعذّر استخدام خطوط PDF المُضمّنة.\ndocument_colors_not_allowed=ليس مسموحًا لملفات PDF باستخدام ألوانها الخاصة: خيار ”اسمح للصفحات باختيار ألوانها الخاصة“ ليس مُفعّلًا في المتصفح.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/as/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=পূৰ্বৱৰ্তী পৃষ্ঠা\nprevious_label=পূৰ্বৱৰ্তী\nnext.title=পৰৱৰ্তী পৃষ্ঠা\nnext_label=পৰৱৰ্তী\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=জুম আউট\nzoom_out_label=জুম আউট\nzoom_in.title=জুম ইন\nzoom_in_label=জুম ইন\nzoom.title=জুম কৰক\npresentation_mode.title=উপস্থাপন অৱস্থালে যাওক\npresentation_mode_label=উপস্থাপন অৱস্থা\nopen_file.title=ফাইল খোলক\nopen_file_label=খোলক\nprint.title=প্ৰিন্ট কৰক\nprint_label=প্ৰিন্ট কৰক\ndownload.title=ডাউনল'ড কৰক\ndownload_label=ডাউনল'ড কৰক\nbookmark.title=বৰ্তমান দৃশ্য (কপি কৰক অথবা নতুন উইন্ডোত খোলক)\nbookmark_label=বৰ্তমান দৃশ্য\n\n# Secondary toolbar and context menu\ntools.title=সঁজুলিসমূহ\ntools_label=সঁজুলিসমূহ\nfirst_page.title=প্ৰথম পৃষ্ঠাত যাওক\nfirst_page.label=প্ৰথম পৃষ্ঠাত যাওক\nfirst_page_label=প্ৰথম পৃষ্ঠাত যাওক\nlast_page.title=সৰ্বশেষ পৃষ্ঠাত যাওক\nlast_page.label=সৰ্বশেষ পৃষ্ঠাত যাওক\nlast_page_label=সৰ্বশেষ পৃষ্ঠাত যাওক\npage_rotate_cw.title=ঘড়ীৰ দিশত ঘুৰাওক\npage_rotate_cw.label=ঘড়ীৰ দিশত ঘুৰাওক\npage_rotate_cw_label=ঘড়ীৰ দিশত ঘুৰাওক\npage_rotate_ccw.title=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক\npage_rotate_ccw.label=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক\npage_rotate_ccw_label=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক\n\n\n# Document properties dialog box\ndocument_properties.title=দস্তাবেজৰ বৈশিষ্ট্যসমূহ…\ndocument_properties_label=দস্তাবেজৰ বৈশিষ্ট্যসমূহ…\ndocument_properties_file_name=ফাইল নাম:\ndocument_properties_file_size=ফাইলৰ আকাৰ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=শীৰ্ষক:\ndocument_properties_author=লেখক:\ndocument_properties_subject=বিষয়:\ndocument_properties_keywords=কিৱাৰ্ডসমূহ:\ndocument_properties_creation_date=সৃষ্টিৰ তাৰিখ:\ndocument_properties_modification_date=পৰিবৰ্তনৰ তাৰিখ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=সৃষ্টিকৰ্তা:\ndocument_properties_producer=PDF উৎপাদক:\ndocument_properties_version=PDF সংস্কৰণ:\ndocument_properties_page_count=পৃষ্ঠাৰ গণনা:\ndocument_properties_close=বন্ধ কৰক\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=কাষবাৰ টগল কৰক\ntoggle_sidebar_label=কাষবাৰ টগল কৰক\ndocument_outline_label=দস্তাবেজ আউটলাইন\nattachments.title=এটাচমেন্টসমূহ দেখুৱাওক\nattachments_label=এটাচমেন্টসমূহ\nthumbs.title=থাম্বনেইলসমূহ দেখুৱাওক\nthumbs_label=থাম্বনেইলসমূহ\nfindbar.title=দস্তাবেজত সন্ধান কৰক\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=পৃষ্ঠা {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=পৃষ্ঠাৰ থাম্বনেইল {{page}}\n\n# Find panel button title and messages\nfind_previous.title=বাক্যাংশৰ পূৰ্বৱৰ্তী উপস্থিতি সন্ধান কৰক\nfind_previous_label=পূৰ্বৱৰ্তী\nfind_next.title=বাক্যাংশৰ পৰৱৰ্তী উপস্থিতি সন্ধান কৰক\nfind_next_label=পৰৱৰ্তী\nfind_highlight=সকলো উজ্জ্বল কৰক\nfind_match_case_label=ফলা মিলাওক\nfind_reached_top=তলৰ পৰা আৰম্ভ কৰি, দস্তাবেজৰ ওপৰলৈ অহা হৈছে\nfind_reached_bottom=ওপৰৰ পৰা আৰম্ভ কৰি, দস্তাবেজৰ তললৈ অহা হৈছে\nfind_not_found=বাক্যাংশ পোৱা নগল\n\n# Error panel labels\nerror_more_info=অধিক তথ্য\nerror_less_info=কম তথ্য\nerror_close=বন্ধ কৰক\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=বাৰ্তা: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=স্টেক: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ফাইল: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=শাৰী: {{line}}\nrendering_error=এই পৃষ্ঠা ৰেণ্ডাৰ কৰোতে এটা ত্ৰুটি দেখা দিলে।\n\n# Predefined zoom values\npage_scale_width=পৃষ্ঠাৰ প্ৰস্থ\npage_scale_fit=পৃষ্ঠা খাপ\npage_scale_auto=স্বচালিত জুম\npage_scale_actual=প্ৰকৃত আকাৰ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=ত্ৰুটি\nloading_error=PDF ল'ড কৰোতে এটা ত্ৰুটি দেখা দিলে।\ninvalid_file_error=অবৈধ অথবা ক্ষতিগ্ৰস্থ PDF file।\nmissing_file_error=সন্ধানহিন PDF ফাইল।\nunexpected_response_error=অপ্ৰত্যাশিত চাৰ্ভাৰ প্ৰতিক্ৰিয়া।\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} টোকা]\npassword_label=এই PDF ফাইল খোলিবলৈ পাছৱৰ্ড সুমুৱাওক।\npassword_invalid=অবৈধ পাছৱৰ্ড। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক।\npassword_ok=ঠিক আছে\n\nprinting_not_supported=সতৰ্কবাৰ্তা: প্ৰিন্টিং এই ব্ৰাউছাৰ দ্বাৰা সম্পূৰ্ণভাৱে সমৰ্থিত নহয়।\nprinting_not_ready=সতৰ্কবাৰ্তা: PDF প্ৰিন্টিংৰ বাবে সম্পূৰ্ণভাৱে ল'ডেড নহয়।\nweb_fonts_disabled=ৱেব ফন্টসমূহ অসামৰ্থবান কৰা আছে: অন্তৰ্ভুক্ত PDF ফন্টসমূহ ব্যৱহাৰ কৰিবলে অক্ষম।\ndocument_colors_not_allowed=PDF দস্তাবেজসমূহৰ সিহতৰ নিজস্ব ৰঙ ব্যৱহাৰ কৰাৰ অনুমতি নাই: ব্ৰাউছাৰত 'পৃষ্ঠাসমূহক সিহতৰ নিজস্ব ৰঙ নিৰ্বাচন কৰাৰ অনুমতি দিয়ক' অসামৰ্থবান কৰা আছে।\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ast/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Páxina anterior\nprevious_label=Anterior\nnext.title=Páxina siguiente\nnext_label=Siguiente\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Páxina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Reducir\nzoom_out_label=Reducir\nzoom_in.title=Aumentar\nzoom_in_label=Aumentar\nzoom.title=Tamañu\npresentation_mode.title=\npresentation_mode_label=\nopen_file.title=Abrir ficheru\nopen_file_label=Abrir\nprint.title=Imprentar\nprint_label=Imprentar\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar o abrir nuna nueva ventana)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Ferramientes\ntools_label=Ferramientes\nfirst_page.title=Dir a la primer páxina\nfirst_page.label=Dir a la primer páxina\nfirst_page_label=Dir a la primer páxina\nlast_page.title=Dir a la postrer páxina\nlast_page.label=Dir a la cabera páxina\nlast_page_label=Dir a la postrer páxina\npage_rotate_cw.title=Xirar en sen horariu\npage_rotate_cw.label=\npage_rotate_cw_label=Xirar en sen horariu\npage_rotate_ccw.title=Xirar en sen antihorariu\npage_rotate_ccw.label=\npage_rotate_ccw_label=Xirar en sen antihorariu\n\n\n# Document properties dialog box\ndocument_properties.title=Propiedaes del documentu…\ndocument_properties_label=Propiedaes del documentu…\ndocument_properties_file_name=Nome de ficheru:\ndocument_properties_file_size=Tamañu de ficheru:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Títulu:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asuntu:\ndocument_properties_keywords=Pallabres clave:\ndocument_properties_creation_date=Data de creación:\ndocument_properties_modification_date=Data de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=Productor PDF:\ndocument_properties_version=Versión PDF:\ndocument_properties_page_count=Númberu de páxines:\ndocument_properties_close=Zarrar\n\nprint_progress_message=Tresnando documentu pa imprentar…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Encaboxar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Camudar barra llateral\ntoggle_sidebar_label=Camudar barra llateral\ndocument_outline.title=Amosar esquema del documentu (duble clic pa espander/contrayer tolos elementos)\ndocument_outline_label=Esquema del documentu\nattachments.title=Amosar axuntos\nattachments_label=Axuntos\nthumbs.title=Amosar miniatures\nthumbs_label=Miniatures\nfindbar.title=Guetar nel documentu\nfindbar_label=Guetar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Páxina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de la páxina {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Alcontrar l'anterior apaición de la fras\nfind_previous_label=Anterior\nfind_next.title=Alcontrar la siguiente apaición d'esta fras\nfind_next_label=Siguiente\nfind_highlight=Remarcar toos\nfind_match_case_label=Coincidencia de mayús./minús.\nfind_reached_top=Algamóse'l principiu del documentu, siguir dende'l final\nfind_reached_bottom=Algamóse'l final del documentu, siguir dende'l principiu\nfind_not_found=Frase non atopada\n\n# Error panel labels\nerror_more_info=Más información\nerror_less_info=Menos información\nerror_close=Zarrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaxe: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ficheru: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Llinia: {{line}}\nrendering_error=Hebo un fallu al renderizar la páxina.\n\n# Predefined zoom values\npage_scale_width=Anchor de la páxina\npage_scale_fit=Axuste de la páxina\npage_scale_auto=Tamañu automáticu\npage_scale_actual=Tamañu actual\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Fallu\nloading_error=Hebo un fallu al cargar el PDF.\ninvalid_file_error=Ficheru PDF inválidu o corruptu.\nmissing_file_error=Nun hai ficheru PDF.\nunexpected_response_error=Rempuesta inesperada del sirvidor.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotación {{type}}]\npassword_label=Introduz la contraseña p'abrir esti ficheru PDF\npassword_invalid=Contraseña non válida. Vuelvi a intentalo.\npassword_ok=Aceutar\npassword_cancel=Encaboxar\n\nprinting_not_supported=Alvertencia: La imprentación entá nun ta sofitada dafechu nesti restolador.\nprinting_not_ready=Avisu: Esti PDF nun se cargó completamente pa poder imprentase.\nweb_fonts_disabled=Les fontes web tán desactivaes: ye imposible usar les fontes PDF embebíes.\ndocument_colors_not_allowed=Los documentos PDF nun tienen permisu pa usar les sos colores: «Permitir que les páxines escueyan les sos colores» ta desactivao nel restolador.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/az/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Əvvəlki səhifə\nprevious_label=Əvvəlkini tap\nnext.title=Növbəti səhifə\nnext_label=İrəli\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Səhifə\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=Uzaqlaş\nzoom_out_label=Uzaqlaş\nzoom_in.title=Yaxınlaş\nzoom_in_label=Yaxınlaş\nzoom.title=Yaxınlaşdırma\npresentation_mode.title=Təqdimat Rejiminə Keç\npresentation_mode_label=Təqdimat Rejimi\nopen_file.title=Fayl Aç\nopen_file_label=Aç\nprint.title=Yazdır\nprint_label=Yazdır\ndownload.title=Yüklə\ndownload_label=Yüklə\nbookmark.title=Hazırkı görünüş (köçür və ya yeni pəncərədə aç)\nbookmark_label=Hazırki görünüş\n\n# Secondary toolbar and context menu\ntools.title=Alətlər\ntools_label=Alətlər\nfirst_page.title=İlk Səhifəyə get\nfirst_page.label=İlk Səhifəyə get\nfirst_page_label=İlk Səhifəyə get\nlast_page.title=Son Səhifəyə get\nlast_page.label=Son Səhifəyə get\nlast_page_label=Son Səhifəyə get\npage_rotate_cw.title=Saat İstiqamətində Fırlat\npage_rotate_cw.label=Saat İstiqamətində Fırlat\npage_rotate_cw_label=Saat İstiqamətində Fırlat\npage_rotate_ccw.title=Saat İstiqamətinin Əksinə Fırlat\npage_rotate_ccw.label=Saat İstiqamətinin Əksinə Fırlat\npage_rotate_ccw_label=Saat İstiqamətinin Əksinə Fırlat\n\ncursor_text_select_tool.title=Yazı seçmə alətini aktivləşdir\ncursor_text_select_tool_label=Yazı seçmə aləti\ncursor_hand_tool.title=Əl alətini aktivləşdir\ncursor_hand_tool_label=Əl aləti\n\n# Document properties dialog box\ndocument_properties.title=Sənəd xüsusiyyətləri…\ndocument_properties_label=Sənəd xüsusiyyətləri…\ndocument_properties_file_name=Fayl adı:\ndocument_properties_file_size=Fayl ölçüsü:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bayt)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bayt)\ndocument_properties_title=Başlık:\ndocument_properties_author=Müəllif:\ndocument_properties_subject=Mövzu:\ndocument_properties_keywords=Açar sözlər:\ndocument_properties_creation_date=Yaradılış Tarixi :\ndocument_properties_modification_date=Dəyişdirilmə Tarixi :\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Yaradan:\ndocument_properties_producer=PDF yaradıcısı:\ndocument_properties_version=PDF versiyası:\ndocument_properties_page_count=Səhifə sayı:\ndocument_properties_close=Qapat\n\nprint_progress_message=Sənəd çap üçün hazırlanır…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Ləğv et\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Yan Paneli Aç/Bağla\ntoggle_sidebar_notification.title=Yan paneli çevir (sənəddə icmal/bağlama var)\ntoggle_sidebar_label=Yan Paneli Aç/Bağla\ndocument_outline.title=Sənədin eskizini göstər (bütün bəndləri açmaq/yığmaq üçün iki dəfə klikləyin)\ndocument_outline_label=Sənəd strukturu\nattachments.title=Bağlamaları göstər\nattachments_label=Bağlamalar\nthumbs.title=Kiçik şəkilləri göstər\nthumbs_label=Kiçik şəkillər\nfindbar.title=Sənəddə Tap\nfindbar_label=Tap\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Səhifə{{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} səhifəsinin kiçik vəziyyəti\n\n# Find panel button title and messages\nfind_input.title=Tap\nfind_input.placeholder=Sənəddə tap…\nfind_previous.title=Bir öncəki uyğun gələn sözü tapır\nfind_previous_label=Geri\nfind_next.title=Bir sonrakı uyğun gələn sözü tapır\nfind_next_label=İrəli\nfind_highlight=İşarələ\nfind_match_case_label=Böyük/kiçik hərfə həssaslıq\nfind_reached_top=Sənədin yuxarısına çatdı, aşağıdan davam edir\nfind_reached_bottom=Sənədin sonuna çatdı, yuxarıdan davam edir\nfind_not_found=Uyğunlaşma tapılmadı\n\n# Error panel labels\nerror_more_info=Daha çox məlumati\nerror_less_info=Daha az məlumat\nerror_close=Qapat\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (yığma: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=İsmarıc: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stek: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fayl: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Sətir: {{line}}\nrendering_error=Səhifə göstərilərkən səhv yarandı.\n\n# Predefined zoom values\npage_scale_width=Səhifə genişliyi\npage_scale_fit=Səhifəni sığdır\npage_scale_auto=Avtomatik yaxınlaşdır\npage_scale_actual=Hazırki Həcm\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Səhv\nloading_error=PDF yüklenərkən bir səhv yarandı.\ninvalid_file_error=Səhv və ya zədələnmiş olmuş PDF fayl.\nmissing_file_error=PDF fayl yoxdur.\nunexpected_response_error=Gözlənilməz server cavabı.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotasiyası]\npassword_label=Bu PDF faylı açmaq üçün şifrəni daxil edin.\npassword_invalid=Şifrə yanlışdır. Bir daha sınayın.\npassword_ok=Tamam\npassword_cancel=Ləğv et\n\nprinting_not_supported=Xəbərdarlıq: Çap bu səyyah tərəfindən tam olaraq dəstəklənmir.\nprinting_not_ready=Xəbərdarlıq: PDF çap üçün tam yüklənməyib.\nweb_fonts_disabled=Web Şriftlər söndürülüb: yerləşdirilmiş PDF şriftlərini istifadə etmək mümkün deyil.\ndocument_colors_not_allowed=PDF sənədlərə öz rənglərini işlətməyə icazə verilmir: “Səhifələrə öz rənglərini istifadə etməyə icazə ver”mə səyyahda söndürülüb.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/be/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Папярэдняя старонка\nprevious_label=Папярэдняя\nnext.title=Наступная старонка\nnext_label=Наступная\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Старонка\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=з {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} з {{pagesCount}})\n\nzoom_out.title=Паменшыць\nzoom_out_label=Паменшыць\nzoom_in.title=Павялічыць\nzoom_in_label=Павялічыць\nzoom.title=Павялічэнне тэксту\npresentation_mode.title=Пераключыцца ў рэжым паказу\npresentation_mode_label=Рэжым паказу\nopen_file.title=Адкрыць файл\nopen_file_label=Адкрыць\nprint.title=Друкаваць\nprint_label=Друкаваць\ndownload.title=Сцягнуць\ndownload_label=Сцягнуць\nbookmark.title=Цяперашняя праява (скапіяваць або адчыніць у новым акне)\nbookmark_label=Цяперашняя праява\n\n# Secondary toolbar and context menu\ntools.title=Прылады\ntools_label=Прылады\nfirst_page.title=Перайсці на першую старонку\nfirst_page.label=Перайсці на першую старонку\nfirst_page_label=Перайсці на першую старонку\nlast_page.title=Перайсці на апошнюю старонку\nlast_page.label=Перайсці на апошнюю старонку\nlast_page_label=Перайсці на апошнюю старонку\npage_rotate_cw.title=Павярнуць па сонцу\npage_rotate_cw.label=Павярнуць па сонцу\npage_rotate_cw_label=Павярнуць па сонцу\npage_rotate_ccw.title=Павярнуць супраць сонца\npage_rotate_ccw.label=Павярнуць супраць сонца\npage_rotate_ccw_label=Павярнуць супраць сонца\n\ncursor_text_select_tool.title=Уключыць прыладу выбару тэксту\ncursor_text_select_tool_label=Прылада выбару тэксту\ncursor_hand_tool.title=Уключыць ручную прыладу\ncursor_hand_tool_label=Ручная прылада\n\n# Document properties dialog box\ndocument_properties.title=Уласцівасці дакумента…\ndocument_properties_label=Уласцівасці дакумента…\ndocument_properties_file_name=Назва файла:\ndocument_properties_file_size=Памер файла:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} байт)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} байт)\ndocument_properties_title=Загаловак:\ndocument_properties_author=Аўтар:\ndocument_properties_subject=Тэма:\ndocument_properties_keywords=Ключавыя словы:\ndocument_properties_creation_date=Дата стварэння:\ndocument_properties_modification_date=Дата змянення:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Стваральнік:\ndocument_properties_producer=Вырабнік PDF:\ndocument_properties_version=Версія PDF:\ndocument_properties_page_count=Колькасць старонак:\ndocument_properties_close=Закрыць\n\nprint_progress_message=Падрыхтоўка дакумента да друку…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Скасаваць\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Паказаць/схаваць бакавую панэль\ntoggle_sidebar_notification.title=Паказаць/схаваць бакавую панэль (дакумент мае змест/укладанні)\ntoggle_sidebar_label=Паказаць/схаваць бакавую панэль\ndocument_outline.title=Паказаць структуру дакумента (двайная пстрычка, каб разгарнуць /згарнуць усе элементы)\ndocument_outline_label=Структура дакумента\nattachments.title=Паказаць далучэнні\nattachments_label=Далучэнні\nthumbs.title=Паказ мініяцюр\nthumbs_label=Мініяцюры\nfindbar.title=Пошук у дакуменце\nfindbar_label=Знайсці\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Старонка {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Мініяцюра старонкі {{page}}\n\n# Find panel button title and messages\nfind_input.title=Шукаць\nfind_input.placeholder=Шукаць у дакуменце…\nfind_previous.title=Знайсці папярэдні выпадак выразу\nfind_previous_label=Папярэдні\nfind_next.title=Знайсці наступны выпадак выразу\nfind_next_label=Наступны\nfind_highlight=Падфарбаваць усе\nfind_match_case_label=Адрозніваць вялікія/малыя літары\nfind_reached_top=Дасягнуты пачатак дакумента, працяг з канца\nfind_reached_bottom=Дасягнуты канец дакумента, працяг з пачатку\nfind_not_found=Выраз не знойдзены\n\n# Error panel labels\nerror_more_info=Падрабязней\nerror_less_info=Сцісла\nerror_close=Закрыць\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js в{{version}} (зборка: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Паведамленне: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стос: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Радок: {{line}}\nrendering_error=Здарылася памылка падчас адлюстравання старонкі.\n\n# Predefined zoom values\npage_scale_width=Шырыня старонкі\npage_scale_fit=Уцісненне старонкі\npage_scale_auto=Аўтаматычнае павелічэнне\npage_scale_actual=Сапраўдны памер\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Памылка\nloading_error=Здарылася памылка падчас загрузкі PDF.\ninvalid_file_error=Няспраўны або пашкоджаны файл PDF.\nmissing_file_error=Адсутны файл PDF.\nunexpected_response_error=Нечаканы адказ сервера.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Увядзіце пароль, каб адкрыць гэты файл PDF.\npassword_invalid=Нядзейсны пароль. Паспрабуйце зноў.\npassword_ok=Добра\npassword_cancel=Скасаваць\n\nprinting_not_supported=Папярэджанне: друк не падтрымліваецца цалкам гэтым браўзерам.\nprinting_not_ready=Увага: PDF не сцягнуты цалкам для друкавання.\nweb_fonts_disabled=Шрыфты Сеціва забаронены: немагчыма ўжываць укладзеныя шрыфты PDF.\ndocument_colors_not_allowed=PDF-дакументам не дазволена выкарыстоўваць свае колеры: у браўзеры адключаны параметр \"Дазволіць вэб-сайтам выкарыстоўваць свае колеры\".\n"
  },
  {
    "path": "example/pages/include/pdf/locale/bg/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Предишна страница\nprevious_label=Предишна\nnext.title=Следваща страница\nnext_label=Следваща\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Страница\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=от {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} от {{pagesCount}})\n\nzoom_out.title=Намаляване\nzoom_out_label=Намаляване\nzoom_in.title=Увеличаване\nzoom_in_label=Увеличаване\nzoom.title=Мащабиране\npresentation_mode.title=Превключване към режим на представяне\npresentation_mode_label=Режим на представяне\nopen_file.title=Отваряне на файл\nopen_file_label=Отваряне\nprint.title=Отпечатване\nprint_label=Отпечатване\ndownload.title=Изтегляне\ndownload_label=Изтегляне\nbookmark.title=Текущ изглед (копиране или отваряне в нов прозорец)\nbookmark_label=Текущ изглед\n\n# Secondary toolbar and context menu\ntools.title=Инструменти\ntools_label=Инструменти\nfirst_page.title=Към първата страница\nfirst_page.label=Към първата страница\nfirst_page_label=Към първата страница\nlast_page.title=Към последната страница\nlast_page.label=Към последната страница\nlast_page_label=Към последната страница\npage_rotate_cw.title=Завъртане по часовниковата стрелка\npage_rotate_cw.label=Завъртане по часовниковата стрелка\npage_rotate_cw_label=Завъртане по часовниковата стрелка\npage_rotate_ccw.title=Завъртане обратно на часовниковата стрелка\npage_rotate_ccw.label=Завъртане обратно на часовниковата стрелка\npage_rotate_ccw_label=Завъртане обратно на часовниковата стрелка\n\ncursor_text_select_tool.title=Включване на инструмента за избор на текст\ncursor_text_select_tool_label=Инструмент за избор на текст\ncursor_hand_tool.title=Включване на инструмента ръка\ncursor_hand_tool_label=Инструмент ръка\n\n# Document properties dialog box\ndocument_properties.title=Свойства на документа…\ndocument_properties_label=Свойства на документа…\ndocument_properties_file_name=Име на файл:\ndocument_properties_file_size=Големина на файл:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} байта)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} байта)\ndocument_properties_title=Заглавие:\ndocument_properties_author=Автор:\ndocument_properties_subject=Тема:\ndocument_properties_keywords=Ключови думи:\ndocument_properties_creation_date=Дата на създаване:\ndocument_properties_modification_date=Дата на промяна:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Създател:\ndocument_properties_producer=PDF произведен от:\ndocument_properties_version=PDF версия:\ndocument_properties_page_count=Брой страници:\ndocument_properties_close=Затваряне\n\nprint_progress_message=Подготвяне на документа за отпечатване…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Отказ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Превключване на страничната лента\ntoggle_sidebar_notification.title=Превключване на страничната лента (документи със структура/прикачени файлове)\ntoggle_sidebar_label=Превключване на страничната лента\ndocument_outline.title=Показване на структурата на документа (двукратно щракване за свиване/разгъване на всичко)\ndocument_outline_label=Структура на документа\nattachments.title=Показване на притурките\nattachments_label=Притурки\nthumbs.title=Показване на миниатюрите\nthumbs_label=Миниатюри\nfindbar.title=Намиране в документа\nfindbar_label=Търсене\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Страница {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Миниатюра на страница {{page}}\n\n# Find panel button title and messages\nfind_input.title=Търсене\nfind_input.placeholder=Търсене в документа…\nfind_previous.title=Намиране на предишно съвпадение на фразата\nfind_previous_label=Предишна\nfind_next.title=Намиране на следващо съвпадение на фразата\nfind_next_label=Следваща\nfind_highlight=Открояване на всички\nfind_match_case_label=Чувствителност към регистъра\nfind_reached_top=Достигнато е началото на документа, продължаване от края\nfind_reached_bottom=Достигнат е краят на документа, продължаване от началото\nfind_not_found=Фразата не е намерена\n\n# Error panel labels\nerror_more_info=Повече информация\nerror_less_info=По-малко информация\nerror_close=Затваряне\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js версия {{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Съобщение: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стек: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Ред: {{line}}\nrendering_error=Грешка при изчертаване на страницата.\n\n# Predefined zoom values\npage_scale_width=Ширина на страницата\npage_scale_fit=Вместване в страницата\npage_scale_auto=Автоматично мащабиране\npage_scale_actual=Действителен размер\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Грешка\nloading_error=Получи се грешка при зареждане на PDF-а.\ninvalid_file_error=Невалиден или повреден PDF файл.\nmissing_file_error=Липсващ PDF файл.\nunexpected_response_error=Неочакван отговор от сървъра.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Анотация {{type}}]\npassword_label=Въведете парола за отваряне на този PDF файл.\npassword_invalid=Невалидна парола. Моля, опитайте отново.\npassword_ok=Добре\npassword_cancel=Отказ\n\nprinting_not_supported=Внимание: Този браузър няма пълна поддръжка на отпечатване.\nprinting_not_ready=Внимание: Този PDF файл не е напълно зареден за печат.\nweb_fonts_disabled=Уеб-шрифтовете са забранени: разрешаване на използването на вградените PDF шрифтове.\ndocument_colors_not_allowed=На PDF-документите не е разрешено да използват собствени цветове: „Разрешаване на страниците да избират собствени цветове“ е изключено в браузъра.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/bn-BD/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=পূর্ববর্তী পৃষ্ঠা\nprevious_label=পূর্ববর্তী\nnext.title=পরবর্তী পৃষ্ঠা\nnext_label=পরবর্তী\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=পাতা\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} এর\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pagesCount}} এর {{pageNumber}})\n\nzoom_out.title=ছোট আকারে প্রদর্শন\nzoom_out_label=ছোট আকারে প্রদর্শন\nzoom_in.title=বড় আকারে প্রদর্শন\nzoom_in_label=বড় আকারে প্রদর্শন\nzoom.title=বড় আকারে প্রদর্শন\npresentation_mode.title=উপস্থাপনা মোডে স্যুইচ করুন\npresentation_mode_label=উপস্থাপনা মোড\nopen_file.title=ফাইল খুলুন\nopen_file_label=খুলুন\nprint.title=মুদ্রণ\nprint_label=মুদ্রণ\ndownload.title=ডাউনলোড\ndownload_label=ডাউনলোড\nbookmark.title=বর্তমান অবস্থা (অনুলিপি অথবা নতুন উইন্ডো তে খুলুন)\nbookmark_label=বর্তমান অবস্থা\n\n# Secondary toolbar and context menu\ntools.title=টুল\ntools_label=টুল\nfirst_page.title=প্রথম পাতায় যাও\nfirst_page.label=প্রথম পাতায় যাও\nfirst_page_label=প্রথম পাতায় যাও\nlast_page.title=শেষ পাতায় যাও\nlast_page.label=শেষ পাতায় যাও\nlast_page_label=শেষ পাতায় যাও\npage_rotate_cw.title=ঘড়ির কাঁটার দিকে ঘোরাও\npage_rotate_cw.label=ঘড়ির কাঁটার দিকে ঘোরাও\npage_rotate_cw_label=ঘড়ির কাঁটার দিকে ঘোরাও\npage_rotate_ccw.title=ঘড়ির কাঁটার বিপরীতে ঘোরাও\npage_rotate_ccw.label=ঘড়ির কাঁটার বিপরীতে ঘোরাও\npage_rotate_ccw_label=ঘড়ির কাঁটার বিপরীতে ঘোরাও\n\ncursor_hand_tool.title=হ্যান্ড টুল সক্রিয় করুন\n\n# Document properties dialog box\ndocument_properties.title=নথি বৈশিষ্ট্য…\ndocument_properties_label=নথি বৈশিষ্ট্য…\ndocument_properties_file_name=ফাইলের নাম:\ndocument_properties_file_size=ফাইলের আকার:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} কেবি ({{size_b}} বাইট)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} এমবি ({{size_b}} বাইট)\ndocument_properties_title=শিরোনাম:\ndocument_properties_author=লেখক:\ndocument_properties_subject=বিষয়:\ndocument_properties_keywords=কীওয়ার্ড:\ndocument_properties_creation_date=তৈরির তারিখ:\ndocument_properties_modification_date=পরিবর্তনের তারিখ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=প্রস্তুতকারক:\ndocument_properties_producer=পিডিএফ প্রস্তুতকারক:\ndocument_properties_version=পিডিএফ সংষ্করণ:\ndocument_properties_page_count=মোট পাতা:\ndocument_properties_close=বন্ধ\n\nprint_progress_message=মুদ্রণের জন্য নথি প্রস্তুত করা হচ্ছে…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=বাতিল\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=সাইডবার টগল করুন\ntoggle_sidebar_notification.title=সাইডবার টগল (নথিতে আউটলাইন/এটাচমেন্ট রয়েছে)\ntoggle_sidebar_label=সাইডবার টগল করুন\ndocument_outline.title=নথির আউটলাইন দেখাও (সব আইটেম প্রসারিত/সঙ্কুচিত করতে ডবল ক্লিক করুন)\ndocument_outline_label=নথির রূপরেখা\nattachments.title=সংযুক্তি দেখাও\nattachments_label=সংযুক্তি\nthumbs.title=থাম্বনেইল সমূহ প্রদর্শন করুন\nthumbs_label=থাম্বনেইল সমূহ\nfindbar.title=নথির মধ্যে খুঁজুন\nfindbar_label=খুঁজুন\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=পৃষ্ঠা {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} পৃষ্ঠার থাম্বনেইল\n\n# Find panel button title and messages\nfind_input.title=খুঁজুন\nfind_input.placeholder=নথির মধ্যে খুঁজুন…\nfind_previous.title=বাক্যাংশের পূর্ববর্তী উপস্থিতি অনুসন্ধান\nfind_previous_label=পূর্ববর্তী\nfind_next.title=বাক্যাংশের পরবর্তী উপস্থিতি অনুসন্ধান\nfind_next_label=পরবর্তী\nfind_highlight=সব হাইলাইট করা হবে\nfind_match_case_label=অক্ষরের ছাঁদ মেলানো\nfind_reached_top=পৃষ্ঠার শুরুতে পৌছে গেছে, নীচ থেকে আরম্ভ করা হয়েছে\nfind_reached_bottom=পৃষ্ঠার শেষে পৌছে গেছে, উপর থেকে আরম্ভ করা হয়েছে\nfind_not_found=বাক্যাংশ পাওয়া যায়নি\n\n# Error panel labels\nerror_more_info=আরও তথ্য\nerror_less_info=কম তথ্য\nerror_close=বন্ধ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=বার্তা: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=নথি: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=লাইন: {{line}}\nrendering_error=পৃষ্ঠা উপস্থাপনার সময় ত্রুটি দেখা দিয়েছে।\n\n# Predefined zoom values\npage_scale_width=পৃষ্ঠার প্রস্থ\npage_scale_fit=পৃষ্ঠা ফিট করুন\npage_scale_auto=স্বয়ংক্রিয় জুম\npage_scale_actual=প্রকৃত আকার\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=ত্রুটি\nloading_error=পিডিএফ লোড করার সময় ত্রুটি দেখা দিয়েছে।\ninvalid_file_error=অকার্যকর অথবা ক্ষতিগ্রস্ত পিডিএফ ফাইল।\nmissing_file_error=নিখোঁজ PDF ফাইল।\nunexpected_response_error=অপ্রত্যাশীত সার্ভার প্রতিক্রিয়া।\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} টীকা]\npassword_label=পিডিএফ ফাইলটি ওপেন করতে পাসওয়ার্ড দিন।\npassword_invalid=ভুল পাসওয়ার্ড। অনুগ্রহ করে আবার চেষ্টা করুন।\npassword_ok=ঠিক আছে\npassword_cancel=বাতিল\n\nprinting_not_supported=সতর্কতা: এই ব্রাউজারে মুদ্রণ সম্পূর্ণভাবে সমর্থিত নয়।\nprinting_not_ready=সতর্কীকরণ: পিডিএফটি মুদ্রণের জন্য সম্পূর্ণ লোড হয়নি।\nweb_fonts_disabled=ওয়েব ফন্ট নিষ্ক্রিয়: সংযুক্ত পিডিএফ ফন্ট ব্যবহার করা যাচ্ছে না।\ndocument_colors_not_allowed=পিডিএফ ডকুমেন্টকে তাদের নিজস্ব রঙ ব্যবহারে অনুমতি নেই: 'পাতা তাদের নিজেস্ব রঙ নির্বাচন করতে অনুমতি দিন' এই ব্রাউজারে নিষ্ক্রিয় রয়েছে।\n"
  },
  {
    "path": "example/pages/include/pdf/locale/bn-IN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=পূর্ববর্তী পৃষ্ঠা\nprevious_label=পূর্ববর্তী\nnext.title=পরবর্তী পৃষ্ঠা\nnext_label=পরবর্তী\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=পেজ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pagesCount}} এর {{pageNumber}})\n\nzoom_out.title=ছোট মাপে প্রদর্শন\nzoom_out_label=ছোট মাপে প্রদর্শন\nzoom_in.title=বড় মাপে প্রদর্শন\nzoom_in_label=বড় মাপে প্রদর্শন\nzoom.title=প্রদর্শনের মাপ\npresentation_mode.title=উপস্থাপনা মোড স্যুইচ করুন\npresentation_mode_label=উপস্থাপনা মোড\nopen_file.title=ফাইল খুলুন\nopen_file_label=খুলুন\nprint.title=প্রিন্ট করুন\nprint_label=প্রিন্ট করুন\ndownload.title=ডাউনলোড করুন\ndownload_label=ডাউনলোড করুন\nbookmark.title=বর্তমান প্রদর্শন (কপি করুন অথবা নতুন উইন্ডোতে খুলুন)\nbookmark_label=বর্তমান প্রদর্শন\n\n# Secondary toolbar and context menu\ntools.title=সরঞ্জাম\ntools_label=সরঞ্জাম\nfirst_page.title=প্রথম পৃষ্ঠায় চলুন\nfirst_page.label=প্রথম পৃষ্ঠায় চলুন\nfirst_page_label=প্রথম পৃষ্ঠায় চলুন\nlast_page.title=সর্বশেষ পৃষ্ঠায় চলুন\nlast_page.label=সর্বশেষ পৃষ্ঠায় চলুন\nlast_page_label=সর্বশেষ পৃষ্ঠায় চলুন\npage_rotate_cw.title=ডানদিকে ঘোরানো হবে\npage_rotate_cw.label=ডানদিকে ঘোরানো হবে\npage_rotate_cw_label=ডানদিকে ঘোরানো হবে\npage_rotate_ccw.title=বাঁদিকে ঘোরানো হবে\npage_rotate_ccw.label=বাঁদিকে ঘোরানো হবে\npage_rotate_ccw_label=বাঁদিকে ঘোরানো হবে\n\n\n# Document properties dialog box\ndocument_properties.title=নথির বৈশিষ্ট্য…\ndocument_properties_label=নথির বৈশিষ্ট্য…\ndocument_properties_file_name=ফাইলের নাম:\ndocument_properties_file_size=ফাইলের মাপ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} মেগাবাইট ({{size_b}} bytes)\ndocument_properties_title=শিরোনাম:\ndocument_properties_author=লেখক:\ndocument_properties_subject=বিষয়:\ndocument_properties_keywords=নির্দেশক শব্দ:\ndocument_properties_creation_date=নির্মাণের তারিখ:\ndocument_properties_modification_date=পরিবর্তনের তারিখ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=নির্মাতা:\ndocument_properties_producer=PDF নির্মাতা:\ndocument_properties_version=PDF সংস্করণ:\ndocument_properties_page_count=মোট পৃষ্ঠা:\ndocument_properties_close=বন্ধ করুন\n\nprint_progress_message=ডকুমেন্ট প্রিন্টিং-র জন্য তৈরি করা হচ্ছে...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=বাতিল\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=সাইডবার টগল করুন\ntoggle_sidebar_label=সাইডবার টগল করুন\ndocument_outline.title=ডকুমেন্ট আউটলাইন দেখান (দুবার ক্লিক করুন বাড়াতে//collapse সমস্ত আইটেম)\ndocument_outline_label=ডকুমেন্ট আউটলাইন\nattachments.title=সংযুক্তিসমূহ দেখান\nattachments_label=সংযুক্ত বস্তু\nthumbs.title=থাম্ব-নেইল প্রদর্শন\nthumbs_label=থাম্ব-নেইল প্রদর্শন\nfindbar.title=নথিতে খুঁজুন\nfindbar_label=অনুসন্ধান করুন\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=পৃষ্ঠা {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=পৃষ্ঠা {{page}}-র থাম্ব-নেইল\n\n# Find panel button title and messages\nfind_previous.title=চিহ্নিত পংক্তির পূর্ববর্তী উপস্থিতি অনুসন্ধান করুন\nfind_previous_label=পূর্ববর্তী\nfind_next.title=চিহ্নিত পংক্তির পরবর্তী উপস্থিতি অনুসন্ধান করুন\nfind_next_label=পরবর্তী\nfind_highlight=সমগ্র উজ্জ্বল করুন\nfind_match_case_label=হরফের ছাঁদ মেলানো হবে\nfind_reached_top=পৃষ্ঠার প্রারম্ভে পৌছে গেছে, নীচের অংশ থেকে আরম্ভ করা হবে\nfind_reached_bottom=পৃষ্ঠার অন্তিম প্রান্তে পৌছে গেছে, প্রথম অংশ থেকে আরম্ভ করা হবে\nfind_not_found=পংক্তি পাওয়া যায়নি\n\n# Error panel labels\nerror_more_info=অতিরিক্ত তথ্য\nerror_less_info=কম তথ্য\nerror_close=বন্ধ করুন\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=পৃষ্ঠা প্রদর্শনকালে একটি সমস্যা দেখা দিয়েছে।\n\n# Predefined zoom values\npage_scale_width=পৃষ্ঠার প্রস্থ অনুযায়ী\npage_scale_fit=পৃষ্ঠার মাপ অনুযায়ী\npage_scale_auto=স্বয়ংক্রিয় মাপ নির্ধারণ\npage_scale_actual=প্রকৃত মাপ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=ত্রুটি\nloading_error=PDF লোড করার সময় সমস্যা দেখা দিয়েছে।\ninvalid_file_error=অবৈধ বা ক্ষতিগ্রস্ত পিডিএফ ফাইল।\nmissing_file_error=অনুপস্থিত PDF ফাইল\nunexpected_response_error=সার্ভার থেকে অপ্রত্যাশিত সাড়া পাওয়া গেছে।\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=এই PDF ফাইল খোলার জন্য পাসওয়ার্ড দিন।\npassword_invalid=পাসওয়ার্ড সঠিক নয়। অনুগ্রহ করে পুনরায় প্রচেষ্টা করুন।\npassword_ok=OK\npassword_cancel=বাতিল করুন\n\nprinting_not_supported=সতর্কবার্তা: এই ব্রাউজার দ্বারা প্রিন্ট ব্যবস্থা সম্পূর্ণরূপে সমর্থিত নয়।\nprinting_not_ready=সতর্কবাণী: পিডিএফ সম্পূর্ণরূপে মুদ্রণের জন্য লোড করা হয় না.\nweb_fonts_disabled=ওয়েব ফন্ট নিষ্ক্রিয় করা হয়েছে: এমবেডেড পিডিএফ ফন্ট ব্যবহার করতে অক্ষম.\ndocument_colors_not_allowed=পিডিএফ নথি তাদের নিজস্ব রং ব্যবহার করার জন্য অনুমতিপ্রাপ্ত নয়: ব্রাউজারে নিষ্ক্রিয় করা হয়েছে য়েন  'পেজ তাদের নিজস্ব রং নির্বাচন করার অনুমতি প্রদান করা য়ায়।'\n"
  },
  {
    "path": "example/pages/include/pdf/locale/br/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pajenn a-raok\nprevious_label=A-raok\nnext.title=Pajenn war-lerc'h\nnext_label=War-lerc'h\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pajenn\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=eus {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} war {{pagesCount}})\n\nzoom_out.title=Zoum bihanaat\nzoom_out_label=Zoum bihanaat\nzoom_in.title=Zoum brasaat\nzoom_in_label=Zoum brasaat\nzoom.title=Zoum\npresentation_mode.title=Trec'haoliñ etrezek ar mod kinnigadenn\npresentation_mode_label=Mod kinnigadenn\nopen_file.title=Digeriñ ur restr\nopen_file_label=Digeriñ ur restr\nprint.title=Moullañ\nprint_label=Moullañ\ndownload.title=Pellgargañ\ndownload_label=Pellgargañ\nbookmark.title=Gwel bremanel (eilañ pe zigeriñ e-barzh ur prenestr nevez)\nbookmark_label=Gwel bremanel\n\n# Secondary toolbar and context menu\ntools.title=Ostilhoù\ntools_label=Ostilhoù\nfirst_page.title=Mont d'ar bajenn gentañ\nfirst_page.label=Mont d'ar bajenn gentañ\nfirst_page_label=Mont d'ar bajenn gentañ\nlast_page.title=Mont d'ar bajenn diwezhañ\nlast_page.label=Mont d'ar bajenn diwezhañ\nlast_page_label=Mont d'ar bajenn diwezhañ\npage_rotate_cw.title=C'hwelañ gant roud ar bizied\npage_rotate_cw.label=C'hwelañ gant roud ar bizied\npage_rotate_cw_label=C'hwelañ gant roud ar bizied\npage_rotate_ccw.title=C'hwelañ gant roud gin ar bizied\npage_rotate_ccw.label=C'hwelañ gant roud gin ar bizied\npage_rotate_ccw_label=C'hwelañ gant roud gin ar bizied\n\n\n# Document properties dialog box\ndocument_properties.title=Perzhioù an teul…\ndocument_properties_label=Perzhioù an teul…\ndocument_properties_file_name=Anv restr :\ndocument_properties_file_size=Ment ar restr :\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} Ke ({{size_b}} eizhbit)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} Me ({{size_b}} eizhbit)\ndocument_properties_title=Titl :\ndocument_properties_author=Aozer :\ndocument_properties_subject=Danvez :\ndocument_properties_keywords=Gerioù-alc'hwez :\ndocument_properties_creation_date=Deiziad krouiñ :\ndocument_properties_modification_date=Deiziad kemmañ :\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Krouer :\ndocument_properties_producer=Kenderc'her PDF :\ndocument_properties_version=Handelv PDF :\ndocument_properties_page_count=Niver a bajennoù :\ndocument_properties_close=Serriñ\n\nprint_progress_message=O prientiñ an teul evit moullañ...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Nullañ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Diskouez/kuzhat ar varrenn gostez\ntoggle_sidebar_notification.title=Trec'haoliñ ar verrenn-gostez (ur steuñv pe stagadennoù a zo en teul)\ntoggle_sidebar_label=Diskouez/kuzhat ar varrenn gostez\ndocument_outline.title=Diskouez steuñv an teul (daouglikit evit brasaat/bihanaat an holl elfennoù)\ndocument_outline_label=Sinedoù an teuliad\nattachments.title=Diskouez ar c'henstagadurioù\nattachments_label=Kenstagadurioù\nthumbs.title=Diskouez ar melvennoù\nthumbs_label=Melvennoù\nfindbar.title=Klask e-barzh an teuliad\nfindbar_label=Klask\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pajenn {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Melvenn ar bajenn {{page}}\n\n# Find panel button title and messages\nfind_input.title=Klask\nfind_input.placeholder=Klask e-barzh an teuliad\nfind_previous.title=Kavout an tamm frazenn kent o klotañ ganti\nfind_previous_label=Kent\nfind_next.title=Kavout an tamm frazenn war-lerc'h o klotañ ganti\nfind_next_label=War-lerc'h\nfind_highlight=Usskediñ pep tra\nfind_match_case_label=Teurel evezh ouzh ar pennlizherennoù\nfind_reached_top=Tizhet eo bet derou ar bajenn, kenderc'hel diouzh an diaz\nfind_reached_bottom=Tizhet eo bet dibenn ar bajenn, kenderc'hel diouzh ar c'hrec'h\nfind_not_found=N'haller ket kavout ar frazenn\n\n# Error panel labels\nerror_more_info=Muioc'h a ditouroù\nerror_less_info=Nebeutoc'h a ditouroù\nerror_close=Serriñ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js handelv {{version}} (kempunadur : {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Kemennadenn : {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Torn : {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Restr : {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linenn : {{line}}\nrendering_error=Degouezhet ez eus bet ur fazi e-pad skrammañ ar bajennad.\n\n# Predefined zoom values\npage_scale_width=Led ar bajenn\npage_scale_fit=Pajenn a-bezh\npage_scale_auto=Zoum emgefreek\npage_scale_actual=Ment wir\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Fazi\nloading_error=Degouezhet ez eus bet ur fazi e-pad kargañ ar PDF.\ninvalid_file_error=Restr PDF didalvoudek pe kontronet.\nmissing_file_error=Restr PDF o vankout.\nunexpected_response_error=Respont dic'hortoz a-berzh an dafariad\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Notennañ]\npassword_label=Enankit ar ger-tremen evit digeriñ ar restr PDF-mañ.\npassword_invalid=Ger-tremen didalvoudek. Klaskit en-dro mar plij.\npassword_ok=Mat eo\npassword_cancel=Nullañ\n\nprinting_not_supported=Kemenn : N'eo ket skoret penn-da-benn ar moullañ gant ar merdeer-mañ.\nprinting_not_ready=Kemenn : N'hall ket bezañ moullet ar restr PDF rak n'eo ket karget penn-da-benn.\nweb_fonts_disabled=Diweredekaet eo an nodrezhoù web : n'haller ket arverañ an nodrezhoù PDF enframmet.\ndocument_colors_not_allowed=N'eo ket aotreet an teuliadoù PDF da arverañ o livioù dezho : diweredekaet eo “Aotren ar pajennoù da zibab o livioù dezho” e-barzh ar merdeer.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/bs/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Prethodna strana\nprevious_label=Prethodna\nnext.title=Sljedeća strna\nnext_label=Sljedeća\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Strana\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=od {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} od {{pagesCount}})\n\nzoom_out.title=Umanji\nzoom_out_label=Umanji\nzoom_in.title=Uvećaj\nzoom_in_label=Uvećaj\nzoom.title=Uvećanje\npresentation_mode.title=Prebaci se u prezentacijski režim\npresentation_mode_label=Prezentacijski režim\nopen_file.title=Otvori fajl\nopen_file_label=Otvori\nprint.title=Štampaj\nprint_label=Štampaj\ndownload.title=Preuzmi\ndownload_label=Preuzmi\nbookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru)\nbookmark_label=Trenutni prikaz\n\n# Secondary toolbar and context menu\ntools.title=Alati\ntools_label=Alati\nfirst_page.title=Idi na prvu stranu\nfirst_page.label=Idi na prvu stranu\nfirst_page_label=Idi na prvu stranu\nlast_page.title=Idi na zadnju stranu\nlast_page.label=Idi na zadnju stranu\nlast_page_label=Idi na zadnju stranu\npage_rotate_cw.title=Rotiraj u smjeru kazaljke na satu\npage_rotate_cw.label=Rotiraj u smjeru kazaljke na satu\npage_rotate_cw_label=Rotiraj u smjeru kazaljke na satu\npage_rotate_ccw.title=Rotiraj suprotno smjeru kazaljke na satu\npage_rotate_ccw.label=Rotiraj suprotno smjeru kazaljke na satu\npage_rotate_ccw_label=Rotiraj suprotno smjeru kazaljke na satu\n\n\n# Document properties dialog box\ndocument_properties.title=Svojstva dokumenta...\ndocument_properties_label=Svojstva dokumenta...\ndocument_properties_file_name=Naziv fajla:\ndocument_properties_file_size=Veličina fajla:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajta)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajta)\ndocument_properties_title=Naslov:\ndocument_properties_author=Autor:\ndocument_properties_subject=Predmet:\ndocument_properties_keywords=Ključne riječi:\ndocument_properties_creation_date=Datum kreiranja:\ndocument_properties_modification_date=Datum promjene:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Kreator:\ndocument_properties_producer=PDF stvaratelj:\ndocument_properties_version=PDF verzija:\ndocument_properties_page_count=Broj stranica:\ndocument_properties_close=Zatvori\n\nprint_progress_message=Pripremam dokument za štampu…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Otkaži\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Uključi/isključi bočnu traku\ntoggle_sidebar_notification.title=Uključi/isključi sidebar (dokument sadrži outline/priloge)\ntoggle_sidebar_label=Uključi/isključi bočnu traku\ndocument_outline.title=Prikaži outline dokumenta (dvoklik za skupljanje/širenje svih stavki)\ndocument_outline_label=Konture dokumenta\nattachments.title=Prikaži priloge\nattachments_label=Prilozi\nthumbs.title=Prikaži thumbnailove\nthumbs_label=Thumbnailovi\nfindbar.title=Pronađi u dokumentu\nfindbar_label=Pronađi\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strana {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail strane {{page}}\n\n# Find panel button title and messages\nfind_input.title=Pronađi\nfind_input.placeholder=Pronađi u dokumentu…\nfind_previous.title=Pronađi prethodno pojavljivanje fraze\nfind_previous_label=Prethodno\nfind_next.title=Pronađi sljedeće pojavljivanje fraze\nfind_next_label=Sljedeće\nfind_highlight=Označi sve\nfind_match_case_label=Osjetljivost na karaktere\nfind_reached_top=Dostigao sam vrh dokumenta, nastavljam sa dna\nfind_reached_bottom=Dostigao sam kraj dokumenta, nastavljam sa vrha\nfind_not_found=Fraza nije pronađena\n\n# Error panel labels\nerror_more_info=Više informacija\nerror_less_info=Manje informacija\nerror_close=Zatvori\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Poruka: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fajl: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linija: {{line}}\nrendering_error=Došlo je do greške prilikom renderiranja strane.\n\n# Predefined zoom values\npage_scale_width=Širina strane\npage_scale_fit=Uklopi stranu\npage_scale_auto=Automatsko uvećanje\npage_scale_actual=Stvarna veličina\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Greška\nloading_error=Došlo je do greške prilikom učitavanja PDF-a.\ninvalid_file_error=Neispravan ili oštećen PDF fajl.\nmissing_file_error=Nedostaje PDF fajl.\nunexpected_response_error=Neočekivani odgovor servera.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} pribilješka]\npassword_label=Upišite lozinku da biste otvorili ovaj PDF fajl.\npassword_invalid=Pogrešna lozinka. Pokušajte ponovo.\npassword_ok=OK\npassword_cancel=Otkaži\n\nprinting_not_supported=Upozorenje: Štampanje nije u potpunosti podržano u ovom browseru.\nprinting_not_ready=Upozorenje: PDF nije u potpunosti učitan za štampanje.\nweb_fonts_disabled=Web fontovi su onemogućeni: nemoguće koristiti ubačene PDF fontove.\ndocument_colors_not_allowed=PDF dokumentima nije dozvoljeno da koriste vlastite boje: 'Dozvoli stranicama da izaberu vlastite boje' je deaktivirano u browseru.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ca/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pàgina anterior\nprevious_label=Anterior\nnext.title=Pàgina següent\nnext_label=Següent\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pàgina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Allunya\nzoom_out_label=Allunya\nzoom_in.title=Apropa\nzoom_in_label=Apropa\nzoom.title=Escala\npresentation_mode.title=Canvia al mode de presentació\npresentation_mode_label=Mode de presentació\nopen_file.title=Obre el fitxer\nopen_file_label=Obre\nprint.title=Imprimeix\nprint_label=Imprimeix\ndownload.title=Baixa\ndownload_label=Baixa\nbookmark.title=Vista actual (copia o obre en una finestra nova)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Eines\ntools_label=Eines\nfirst_page.title=Vés a la primera pàgina\nfirst_page.label=Vés a la primera pàgina\nfirst_page_label=Vés a la primera pàgina\nlast_page.title=Vés a l'última pàgina\nlast_page.label=Vés a l'última pàgina\nlast_page_label=Vés a l'última pàgina\npage_rotate_cw.title=Gira cap a la dreta\npage_rotate_cw.label=Gira cap a la dreta\npage_rotate_cw_label=Gira cap a la dreta\npage_rotate_ccw.title=Gira cap a l'esquerra\npage_rotate_ccw.label=Gira cap a l'esquerra\npage_rotate_ccw_label=Gira cap a l'esquerra\n\ncursor_text_select_tool.title=Habilita l'eina de selecció de text\ncursor_text_select_tool_label=Eina de selecció de text\ncursor_hand_tool.title=Habilita l'eina de mà\ncursor_hand_tool_label=Eina de mà\n\n# Document properties dialog box\ndocument_properties.title=Propietats del document…\ndocument_properties_label=Propietats del document…\ndocument_properties_file_name=Nom del fitxer:\ndocument_properties_file_size=Mida del fitxer:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Títol:\ndocument_properties_author=Autor:\ndocument_properties_subject=Assumpte:\ndocument_properties_keywords=Paraules clau:\ndocument_properties_creation_date=Data de creació:\ndocument_properties_modification_date=Data de modificació:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=Generador de PDF:\ndocument_properties_version=Versió de PDF:\ndocument_properties_page_count=Nombre de pàgines:\ndocument_properties_close=Tanca\n\nprint_progress_message=S'està preparant la impressió del document…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancel·la\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Mostra/amaga la barra lateral\ntoggle_sidebar_notification.title=Mostra/amaga la barra lateral (el document conté un esquema o adjuncions)\ntoggle_sidebar_label=Mostra/amaga la barra lateral\ndocument_outline.title=Mostra l'esquema del document (doble clic per ampliar/reduir tots els elements)\ndocument_outline_label=Contorn del document\nattachments.title=Mostra les adjuncions\nattachments_label=Adjuncions\nthumbs.title=Mostra les miniatures\nthumbs_label=Miniatures\nfindbar.title=Cerca al document\nfindbar_label=Cerca\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pàgina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de la pàgina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Cerca\nfind_input.placeholder=Cerca al document…\nfind_previous.title=Cerca l'anterior coincidència de l'expressió\nfind_previous_label=Anterior\nfind_next.title=Cerca la següent coincidència de l'expressió\nfind_next_label=Següent\nfind_highlight=Ressalta-ho tot\nfind_match_case_label=Distingeix entre majúscules i minúscules\nfind_reached_top=S'ha arribat al principi del document, es continua pel final\nfind_reached_bottom=S'ha arribat al final del document, es continua pel principi\nfind_not_found=No s'ha trobat l'expressió\n\n# Error panel labels\nerror_more_info=Més informació\nerror_less_info=Menys informació\nerror_close=Tanca\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (muntatge: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Missatge: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fitxer: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Línia: {{line}}\nrendering_error=S'ha produït un error mentre es renderitzava la pàgina.\n\n# Predefined zoom values\npage_scale_width=Amplària de la pàgina\npage_scale_fit=Ajusta la pàgina\npage_scale_auto=Zoom automàtic\npage_scale_actual=Mida real\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=S'ha produït un error en carregar el PDF.\ninvalid_file_error=El fitxer PDF no és vàlid o està malmès.\nmissing_file_error=Falta el fitxer PDF.\nunexpected_response_error=Resposta inesperada del servidor.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotació {{type}}]\npassword_label=Introduïu la contrasenya per obrir aquest fitxer PDF.\npassword_invalid=La contrasenya no és vàlida. Torneu-ho a provar.\npassword_ok=D'acord\npassword_cancel=Cancel·la\n\nprinting_not_supported=Avís: la impressió no és plenament funcional en aquest navegador.\nprinting_not_ready=Atenció: el PDF no s'ha acabat de carregar per imprimir-lo.\nweb_fonts_disabled=Els tipus de lletra web estan desactivats: no es poden utilitzar els tipus de lletra incrustats al PDF.\ndocument_colors_not_allowed=Els documents PDF no poden usar els seus colors propis: «Permet a les pàgines triar els colors propis» es troba desactivat al navegador.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/cs/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Přejde na předchozí stránku\nprevious_label=Předchozí\nnext.title=Přejde na následující stránku\nnext_label=Další\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Stránka\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=z {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} z {{pagesCount}})\n\nzoom_out.title=Zmenší velikost\nzoom_out_label=Zmenšit\nzoom_in.title=Zvětší velikost\nzoom_in_label=Zvětšit\nzoom.title=Nastaví velikost\npresentation_mode.title=Přepne do režimu prezentace\npresentation_mode_label=Režim prezentace\nopen_file.title=Otevře soubor\nopen_file_label=Otevřít\nprint.title=Vytiskne dokument\nprint_label=Tisk\ndownload.title=Stáhne dokument\ndownload_label=Stáhnout\nbookmark.title=Současný pohled (kopírovat nebo otevřít v novém okně)\nbookmark_label=Současný pohled\n\n# Secondary toolbar and context menu\ntools.title=Nástroje\ntools_label=Nástroje\nfirst_page.title=Přejde na první stránku\nfirst_page.label=Přejít na první stránku\nfirst_page_label=Přejít na první stránku\nlast_page.title=Přejde na poslední stránku\nlast_page.label=Přejít na poslední stránku\nlast_page_label=Přejít na poslední stránku\npage_rotate_cw.title=Otočí po směru hodin\npage_rotate_cw.label=Otočit po směru hodin\npage_rotate_cw_label=Otočit po směru hodin\npage_rotate_ccw.title=Otočí proti směru hodin\npage_rotate_ccw.label=Otočit proti směru hodin\npage_rotate_ccw_label=Otočit proti směru hodin\n\ncursor_text_select_tool.title=Povolí výběr textu\ncursor_text_select_tool_label=Výběr textu\ncursor_hand_tool.title=Povolí nástroj ručička\ncursor_hand_tool_label=Nástroj ručička\n\n# Document properties dialog box\ndocument_properties.title=Vlastnosti dokumentu…\ndocument_properties_label=Vlastnosti dokumentu…\ndocument_properties_file_name=Název souboru:\ndocument_properties_file_size=Velikost souboru:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajtů)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajtů)\ndocument_properties_title=Nadpis:\ndocument_properties_author=Autor:\ndocument_properties_subject=Předmět:\ndocument_properties_keywords=Klíčová slova:\ndocument_properties_creation_date=Datum vytvoření:\ndocument_properties_modification_date=Datum úpravy:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Vytvořil:\ndocument_properties_producer=Tvůrce PDF:\ndocument_properties_version=Verze PDF:\ndocument_properties_page_count=Počet stránek:\ndocument_properties_close=Zavřít\n\nprint_progress_message=Příprava dokumentu pro tisk…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}} %\nprint_progress_close=Zrušit\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Postranní lišta\ntoggle_sidebar_notification.title=Přepne postranní lištu (dokument obsahuje osnovu/přílohy)\ntoggle_sidebar_label=Postranní lišta\ndocument_outline.title=Zobrazí osnovu dokumentu (dvojité klepnutí rozbalí/sbalí všechny položky)\ndocument_outline_label=Osnova dokumentu\nattachments.title=Zobrazí přílohy\nattachments_label=Přílohy\nthumbs.title=Zobrazí náhledy\nthumbs_label=Náhledy\nfindbar.title=Najde v dokumentu\nfindbar_label=Najít\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strana {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Náhled strany {{page}}\n\n# Find panel button title and messages\nfind_input.title=Najít\nfind_input.placeholder=Najít v dokumentu…\nfind_previous.title=Najde předchozí výskyt hledaného textu\nfind_previous_label=Předchozí\nfind_next.title=Najde další výskyt hledaného textu\nfind_next_label=Další\nfind_highlight=Zvýraznit\nfind_match_case_label=Rozlišovat velikost\nfind_reached_top=Dosažen začátek dokumentu, pokračuje se od konce\nfind_reached_bottom=Dosažen konec dokumentu, pokračuje se od začátku\nfind_not_found=Hledaný text nenalezen\n\n# Error panel labels\nerror_more_info=Více informací\nerror_less_info=Méně informací\nerror_close=Zavřít\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (sestavení: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Zpráva: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Zásobník: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Soubor: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Řádek: {{line}}\nrendering_error=Při vykreslování stránky nastala chyba.\n\n# Predefined zoom values\npage_scale_width=Podle šířky\npage_scale_fit=Podle výšky\npage_scale_auto=Automatická velikost\npage_scale_actual=Skutečná velikost\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Chyba\nloading_error=Při nahrávání PDF nastala chyba.\ninvalid_file_error=Neplatný nebo chybný soubor PDF.\nmissing_file_error=Chybí soubor PDF.\nunexpected_response_error=Neočekávaná odpověď serveru.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotace typu {{type}}]\npassword_label=Pro otevření PDF souboru vložte heslo.\npassword_invalid=Neplatné heslo. Zkuste to znovu.\npassword_ok=OK\npassword_cancel=Zrušit\n\nprinting_not_supported=Upozornění: Tisk není v tomto prohlížeči plně podporován.\nprinting_not_ready=Upozornění: Dokument PDF není kompletně načten.\nweb_fonts_disabled=Webová písma jsou zakázána, proto není možné použít vložená písma PDF.\ndocument_colors_not_allowed=PDF dokumenty nemají povoleno používat vlastní barvy: volba 'Povolit stránkám používat vlastní barvy' je v prohlížeči deaktivována.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/csb/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pòprzédnô strona\nprevious_label=Pòprzédnô\nnext.title=Nôslédnô strona\nnext_label=Nôslédnô\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Strona:\npage_of=z {{pageCount}}\n\nzoom_out.title=Zmniészë\nzoom_out_label=Zmniészë\nzoom_in.title=Zwikszë\nzoom_in_label=Wiôlgòsc\nzoom.title=Wiôlgòsc\nprint.title=Drëkùjë\nprint_label=Drëkùjë\npresentation_mode.title=Przéńdzë w trib prezentacje \npresentation_mode_label=Trib prezentacje \nopen_file.title=Òtemkni lopk\nopen_file_label=Òtemkni\ndownload.title=Zladënk\ndownload_label=Zladënk\nbookmark.title=Spamiãtôj wëzdrzatk (kòpérëje, abò òtemkni w nowim òknnie)\nbookmark_label=Aktualny wëzdrzatk\n\nfind_label=Szëkôj:\nfind_previous.title=Biéj do pòprzédnégò wënikù szëkbë\nfind_previous_label=Pòprzédny\nfind_next.title=Biéj do nôslédnégò wënikù szëkbë\nfind_next_label=Nôslédny\nfind_highlight=Pòdszkrzëni wszëtczé\nfind_match_case_label=Rozeznôwôj miarã lëterów\nfind_not_found=Nie nalôzł tekstu\nfind_reached_bottom=Doszedł do kùńca dokùmentu, zaczinającë òd górë\nfind_reached_top=Doszedł do pòczątkù dokùmentu, zaczinającë òd dołù\n\ntoggle_sidebar.title=Pòsuwk wëbiérkù\ntoggle_sidebar_label=Pòsuwk wëbiérkù\n\noutline.title=Wëskrzëni òbcéch dokùmentu\noutline_label=Òbcéch dokùmentu\nthumbs.title=Wëskrzëni miniaturë\nthumbs_label=Miniaturë\nfindbar.title=Przeszëkôj dokùment\nfindbar_label=Nalezë\ntools_label=Nôrzãdła\nfirst_page.title=Biéj do pierszi stronë\nfirst_page.label=Biéj do pierszi stronë\nlast_page.label=Biéj do òstatny stronë\ninvalid_file_error=Lëchi ôrt, abò pòpsëti lopk PDF.\n\n\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strona {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura stronë {{page}}\n\n# Error panel labels\nerror_more_info=Wicy infòrmacje\nerror_less_info=Mni infòrmacje\nerror_close=Close\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n\n\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{wiadło}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stóg}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{lopk}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=Pòkôza sã fela przë renderowanim stronë.\n\n# Predefined zoom values\npage_scale_width=Szérzawa stronë\npage_scale_fit=Dopasëje stronã\npage_scale_auto=Aùtomatnô wiôlgòsc\npage_scale_actual=Naturalnô wiôlgòsc\n\n# Loading indicator messages\n# LOCALIZATION NOTE (error_line): \"{{[percent}}\" will be replaced with a percentage\nloading_error_indicator=Fela\nloading_error=Pòkôza sã fela przë wczëtiwanim PDFù.\n\n# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.\n# \"{{[type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\n\nrequest_password=PDF je zabezpieczony parolą:\nprinting_not_supported = Òstrzéga: przezérnik nie je do kùńca wspieróny przez drëkôrze \n\n# Context menu\npage_rotate_cw.label=Òbkrãcë w prawò\npage_rotate_ccw.label=Òbkrãcë w lewò\n\n\nlast_page.title=Biéj do pòprzédny stronë\nlast_page_label=Biéj do pòprzédny stronë\npage_rotate_cw.title=Òbkrãcë w prawò\npage_rotate_cw_label=Òbkrãcë w prawò\npage_rotate_ccw.title=Òbkrãcë w lewò\npage_rotate_ccw_label=Òbkrãcë w lewò\n\n\nweb_fonts_disabled=Sécowé czconczi są wëłączoné: włączë je, bë móc ùżiwac òsadzonëch czconków w lopkach PDF.\n\n\nmissing_file_error=Felëje lopka PDF.\nprinting_not_ready = Òstrzéga: lopk mùszi sã do kùńca wczëtac zanim gò mòże drëkòwac\n\ndocument_colors_disabled=Dokùmentë PDF nie mògą ù swòjich farwów: \\'Pòzwòlë stronóm wëbierac swòje farwë\\' je wëłączoné w przezérnikù.\ninvalid_password=Lëchô parola.\ntext_annotation_type.alt=[Adnotacjô {{type}}]\n\ntools.title=Tools\nfirst_page_label=Go to First Page\n\n\n"
  },
  {
    "path": "example/pages/include/pdf/locale/cy/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Tudalen Flaenorol\nprevious_label=Blaenorol\nnext.title=Tudalen Nesaf\nnext_label=Nesaf\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Tudalen\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=o {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} o {{pagesCount}})\n\nzoom_out.title=Chwyddo Allan\nzoom_out_label=Chwyddo Allan\nzoom_in.title=Chwyddo Mewn\nzoom_in_label=Chwyddo Mewn\nzoom.title=Chwyddo\npresentation_mode.title=Newid i'r Modd Cyflwyno\npresentation_mode_label=Modd Cyflwyno\nopen_file.title=Agor Ffeil\nopen_file_label=Agor\nprint.title=Argraffu\nprint_label=Argraffu\ndownload.title=Llwyth\ndownload_label=Llwytho i Lawr\nbookmark.title=Golwg cyfredol (copïo neu agor ffenestr newydd)\nbookmark_label=Golwg Gyfredol\n\n# Secondary toolbar and context menu\ntools.title=Offer\ntools_label=Offer\nfirst_page.title=Mynd i'r Dudalen Gyntaf\nfirst_page.label=Mynd i'r Dudalen Gyntaf\nfirst_page_label=Mynd i'r Dudalen Gyntaf\nlast_page.title=Mynd i'r Dudalen Olaf\nlast_page.label=Mynd i'r Dudalen Olaf\nlast_page_label=Mynd i'r Dudalen Olaf\npage_rotate_cw.title=Cylchdroi Clocwedd\npage_rotate_cw.label=Cylchdroi Clocwedd\npage_rotate_cw_label=Cylchdroi Clocwedd\npage_rotate_ccw.title=Cylchdroi Gwrthglocwedd\npage_rotate_ccw.label=Cylchdroi Gwrthglocwedd\npage_rotate_ccw_label=Cylchdroi Gwrthglocwedd\n\ncursor_text_select_tool.title=Galluogi Dewis Offeryn Testun\ncursor_text_select_tool_label=Offeryn Dewis Testun\ncursor_hand_tool.title=Galluogi Offeryn Llaw\ncursor_hand_tool_label=Offeryn Llaw\n\n# Document properties dialog box\ndocument_properties.title=Priodweddau Dogfen…\ndocument_properties_label=Priodweddau Dogfen…\ndocument_properties_file_name=Enw ffeil:\ndocument_properties_file_size=Maint ffeil:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} beit)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} beit)\ndocument_properties_title=Teitl:\ndocument_properties_author=Awdur:\ndocument_properties_subject=Pwnc:\ndocument_properties_keywords=Allweddair:\ndocument_properties_creation_date=Dyddiad Creu:\ndocument_properties_modification_date=Dyddiad Addasu:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Crewr:\ndocument_properties_producer=Cynhyrchydd PDF:\ndocument_properties_version=Fersiwn PDF:\ndocument_properties_page_count=Cyfrif Tudalen:\ndocument_properties_close=Cau\n\nprint_progress_message=Paratoi dogfen ar gyfer ei hargraffu…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Diddymu\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toglo'r Bar Ochr\ntoggle_sidebar_notification.title=Toglo'r Bar Ochr (mae'r ddogfen yn cynnwys outline/attachments)\ntoggle_sidebar_label=Toglo'r Bar Ochr\ndocument_outline.title=Dangos Amlinell Dogfen (clic dwbl i ymestyn/cau pob eitem)\ndocument_outline_label=Amlinelliad Dogfen\nattachments.title=Dangos Atodiadau\nattachments_label=Atodiadau\nthumbs.title=Dangos Lluniau Bach\nthumbs_label=Lluniau Bach\nfindbar.title=Canfod yn y Ddogfen\nfindbar_label=Canfod\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Tudalen {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Llun Bach Tudalen {{page}}\n\n# Find panel button title and messages\nfind_input.title=Canfod\nfind_input.placeholder=Canfod yn y ddogfen…\nfind_previous.title=Canfod enghraifft flaenorol o'r ymadrodd\nfind_previous_label=Blaenorol\nfind_next.title=Canfod enghraifft nesaf yr ymadrodd\nfind_next_label=Nesaf\nfind_highlight=Amlygu popeth\nfind_match_case_label=Cydweddu maint\nfind_reached_top=Wedi cyrraedd brig y dudalen, parhau o'r gwaelod\nfind_reached_bottom=Wedi cyrraedd diwedd y dudalen, parhau o'r brig\nfind_not_found=Heb ganfod ymadrodd\n\n# Error panel labels\nerror_more_info=Rhagor o Wybodaeth\nerror_less_info=Llai o wybodaeth\nerror_close=Cau\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Neges: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stac: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ffeil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Llinell: {{line}}\nrendering_error=Digwyddodd gwall wrth adeiladu'r dudalen.\n\n# Predefined zoom values\npage_scale_width=Lled Tudalen\npage_scale_fit=Ffit Tudalen\npage_scale_auto=Chwyddo Awtomatig\npage_scale_actual=Maint Gwirioneddol\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Gwall\nloading_error=Digwyddodd gwall wrth lwytho'r PDF.\ninvalid_file_error=Ffeil PDF annilys neu llwgr.\nmissing_file_error=Ffeil PDF coll.\nunexpected_response_error=Ymateb annisgwyl gan y gweinydd.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anodiad {{type}} ]\npassword_label=Rhowch gyfrinair i agor y PDF.\npassword_invalid=Cyfrinair annilys. Ceisiwch eto.\npassword_ok=Iawn\npassword_cancel=Diddymu\n\nprinting_not_supported=Rhybudd: Nid yw argraffu yn cael ei gynnal yn llawn gan y porwr.\nprinting_not_ready=Rhybudd: Nid yw'r PDF wedi ei lwytho'n llawn ar gyfer argraffu.\nweb_fonts_disabled=Ffontiau gwe wedi eu hanalluogi: methu defnyddio ffontiau PDF mewnblanedig.\ndocument_colors_not_allowed=Nid oes caniatâd i ddogfennau PDF i ddefnyddio eu lliwiau eu hunain: Mae “Caniatáu i dudalennau ddefnyddio eu lliwiau eu hunain” wedi ei atal yn y porwr.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/da/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Forrige side\nprevious_label=Forrige\nnext.title=Næste side\nnext_label=Næste\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Side\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=af {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} af {{pagesCount}})\n\nzoom_out.title=Zoom ud\nzoom_out_label=Zoom ud\nzoom_in.title=Zoom ind\nzoom_in_label=Zoom ind\nzoom.title=Zoom\nprint.title=Udskriv\nprint_label=Udskriv\npresentation_mode.title=Skift til fuldskærmsvisning\npresentation_mode_label=Fuldskærmsvisning\nopen_file.title=Åbn fil\nopen_file_label=Åbn\ndownload.title=Hent\ndownload_label=Hent\nbookmark.title=Aktuel visning (kopier eller åbn i et nyt vindue)\nbookmark_label=Aktuel visning\n\n# Secondary toolbar and context menu\ntools.title=Funktioner\ntools_label=Funktioner\nfirst_page.title=Gå til første side\nfirst_page.label=Gå til første side\nfirst_page_label=Gå til første side\nlast_page.title=Gå til sidste side\nlast_page.label=Gå til sidste side\nlast_page_label=Gå til sidste side\npage_rotate_cw.title=Roter med uret\npage_rotate_cw.label=Roter med uret\npage_rotate_cw_label=Roter med uret\npage_rotate_ccw.title=Roter mod uret\npage_rotate_ccw.label=Roter mod uret\npage_rotate_ccw_label=Roter mod uret\n\ncursor_text_select_tool.title=Aktiver markeringsværktøj\ncursor_text_select_tool_label=Markeringsværktøj\ncursor_hand_tool.title=Aktiver håndværktøj\ncursor_hand_tool_label=Håndværktøj\n\n# Document properties dialog box\ndocument_properties.title=Dokumentegenskaber…\ndocument_properties_label=Dokumentegenskaber…\ndocument_properties_file_name=Filnavn:\ndocument_properties_file_size=Filstørrelse:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Forfatter:\ndocument_properties_subject=Emne:\ndocument_properties_keywords=Nøgleord:\ndocument_properties_creation_date=Oprettet:\ndocument_properties_modification_date=Redigeret:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Program:\ndocument_properties_producer=PDF-producent:\ndocument_properties_version=PDF-version:\ndocument_properties_page_count=Antal sider:\ndocument_properties_close=Luk\n\nprint_progress_message=Forbereder dokument til udskrivning…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Annuller\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Slå sidepanel til eller fra\ntoggle_sidebar_notification.title=Slå sidepanel til eller fra (dokumentet indeholder disposition/vedhæftede filer)\ntoggle_sidebar_label=Slå sidepanel til eller fra\ndocument_outline.title=Vis dokumentets disposition (dobbeltklik for at vise/skjule alle elementer)\ndocument_outline_label=Dokument-disposition\nattachments.title=Vis vedhæftede filer\nattachments_label=Vedhæftede filer\nthumbs.title=Vis miniaturer\nthumbs_label=Miniaturer\nfindbar.title=Find i dokument\nfindbar_label=Find\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Side {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniature af side {{page}}\n\n# Find panel button title and messages\nfind_input.title=Find\nfind_input.placeholder=Find i dokument…\nfind_previous.title=Find den forrige forekomst\nfind_previous_label=Forrige\nfind_next.title=Find den næste forekomst\nfind_next_label=Næste\nfind_highlight=Fremhæv alle\nfind_match_case_label=Forskel på store og små bogstaver\nfind_reached_top=Toppen af siden blev nået, fortsatte fra bunden\nfind_reached_bottom=Bunden af siden blev nået, fortsatte fra toppen\nfind_not_found=Der blev ikke fundet noget\n\n# Error panel labels\nerror_more_info=Mere information\nerror_less_info=Mindre information\nerror_close=Luk\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Fejlmeddelelse: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linje: {{line}}\nrendering_error=Der opstod en fejl ved generering af siden.\n\n# Predefined zoom values\npage_scale_width=Sidebredde\npage_scale_fit=Tilpas til side\npage_scale_auto=Automatisk zoom\npage_scale_actual=Faktisk størrelse\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Fejl\nloading_error=Der opstod en fejl ved indlæsning af PDF-filen.\ninvalid_file_error=PDF-filen er ugyldig eller ødelagt.\nmissing_file_error=Manglende PDF-fil.\nunexpected_response_error=Uventet svar fra serveren.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}kommentar]\npassword_label=Angiv adgangskode til at åbne denne PDF-fil.\npassword_invalid=Ugyldig adgangskode. Prøv igen.\npassword_ok=OK\npassword_cancel=Fortryd\n\nprinting_not_supported=Advarsel: Udskrivning er ikke fuldt understøttet af browseren.\nprinting_not_ready=Advarsel: PDF-filen er ikke fuldt indlæst til udskrivning.\nweb_fonts_disabled=Webskrifttyper er deaktiverede. De indlejrede skrifttyper i PDF-filen kan ikke anvendes.\ndocument_colors_not_allowed=PDF-dokumenter må ikke bruge deres egne farver: 'Tillad sider at vælge deres egne farver' er deaktiveret i browseren.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/de/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Eine Seite zurück\nprevious_label=Zurück\nnext.title=Eine Seite vor\nnext_label=Vor\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Seite\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=von {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} von {{pagesCount}})\n\nzoom_out.title=Verkleinern\nzoom_out_label=Verkleinern\nzoom_in.title=Vergrößern\nzoom_in_label=Vergrößern\nzoom.title=Zoom\nprint.title=Drucken\nprint_label=Drucken\npresentation_mode.title=In Präsentationsmodus wechseln\npresentation_mode_label=Präsentationsmodus\nopen_file.title=Datei öffnen\nopen_file_label=Öffnen\ndownload.title=Dokument speichern\ndownload_label=Speichern\nbookmark.title=Aktuelle Ansicht (zum Kopieren oder Öffnen in einem neuen Fenster)\nbookmark_label=Aktuelle Ansicht\n\n# Secondary toolbar and context menu\ntools.title=Werkzeuge\ntools_label=Werkzeuge\nfirst_page.title=Erste Seite anzeigen\nfirst_page.label=Erste Seite anzeigen\nfirst_page_label=Erste Seite anzeigen\nlast_page.title=Letzte Seite anzeigen\nlast_page.label=Letzte Seite anzeigen\nlast_page_label=Letzte Seite anzeigen\npage_rotate_cw.title=Im Uhrzeigersinn drehen\npage_rotate_cw.label=Im Uhrzeigersinn drehen\npage_rotate_cw_label=Im Uhrzeigersinn drehen\npage_rotate_ccw.title=Gegen Uhrzeigersinn drehen\npage_rotate_ccw.label=Gegen Uhrzeigersinn drehen\npage_rotate_ccw_label=Gegen Uhrzeigersinn drehen\n\ncursor_text_select_tool.title=Textauswahl-Werkzeug aktivieren\ncursor_text_select_tool_label=Textauswahl-Werkzeug\ncursor_hand_tool.title=Hand-Werkzeug aktivieren\ncursor_hand_tool_label=Hand-Werkzeug\n\n# Document properties dialog box\ndocument_properties.title=Dokumenteigenschaften\ndocument_properties_label=Dokumenteigenschaften…\ndocument_properties_file_name=Dateiname:\ndocument_properties_file_size=Dateigröße:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} Bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} Bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Autor:\ndocument_properties_subject=Thema:\ndocument_properties_keywords=Stichwörter:\ndocument_properties_creation_date=Erstelldatum:\ndocument_properties_modification_date=Bearbeitungsdatum:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}} {{time}}\ndocument_properties_creator=Anwendung:\ndocument_properties_producer=PDF erstellt mit:\ndocument_properties_version=PDF-Version:\ndocument_properties_page_count=Seitenzahl:\ndocument_properties_close=Schließen\n\nprint_progress_message=Dokument wird für Drucken vorbereitet…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Abbrechen\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Sidebar umschalten\ntoggle_sidebar_notification.title=Sidebar umschalten (Dokument enthält Dokumentstruktur/Anhänge)\ntoggle_sidebar_label=Sidebar umschalten\ndocument_outline.title=Dokumentstruktur anzeigen (Doppelklicken, um alle Einträge aus- bzw. einzuklappen)\ndocument_outline_label=Dokumentstruktur\nattachments.title=Anhänge anzeigen\nattachments_label=Anhänge\nthumbs.title=Miniaturansichten anzeigen\nthumbs_label=Miniaturansichten\nfindbar.title=Dokument durchsuchen\nfindbar_label=Suchen\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Seite {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniaturansicht von Seite {{page}}\n\n# Find panel button title and messages\nfind_input.title=Suchen\nfind_input.placeholder=Im Dokument suchen…\nfind_previous.title=Vorheriges Vorkommen des Suchbegriffs finden\nfind_previous_label=Zurück\nfind_next.title=Nächstes Vorkommen des Suchbegriffs finden\nfind_next_label=Weiter\nfind_highlight=Alle hervorheben\nfind_match_case_label=Groß-/Kleinschreibung beachten\nfind_reached_top=Anfang des Dokuments erreicht, fahre am Ende fort\nfind_reached_bottom=Ende des Dokuments erreicht, fahre am Anfang fort\nfind_not_found=Suchbegriff nicht gefunden\n\n# Error panel labels\nerror_more_info=Mehr Informationen\nerror_less_info=Weniger Informationen\nerror_close=Schließen\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js Version {{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Nachricht: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Aufrufliste: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Datei: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Zeile: {{line}}\nrendering_error=Beim Darstellen der Seite trat ein Fehler auf.\n\n# Predefined zoom values\npage_scale_width=Seitenbreite\npage_scale_fit=Seitengröße\npage_scale_auto=Automatischer Zoom\npage_scale_actual=Originalgröße\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Fehler\nloading_error=Beim Laden der PDF-Datei trat ein Fehler auf.\ninvalid_file_error=Ungültige oder beschädigte PDF-Datei\nmissing_file_error=Fehlende PDF-Datei\nunexpected_response_error=Unerwartete Antwort des Servers\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anlage: {{type}}]\npassword_label=Geben Sie zum Öffnen der PDF-Datei deren Passwort ein.\npassword_invalid=Falsches Passwort. Bitte versuchen Sie es erneut.\npassword_ok=OK\npassword_cancel=Abbrechen\n\nprinting_not_supported=Warnung: Die Drucken-Funktion wird durch diesen Browser nicht vollständig unterstützt.\nprinting_not_ready=Warnung: Die PDF-Datei ist nicht vollständig geladen, dies ist für das Drucken aber empfohlen.\nweb_fonts_disabled=Web-Schriftarten sind deaktiviert: Eingebettete PDF-Schriftarten konnten nicht geladen werden.\ndocument_colors_not_allowed=PDF-Dokumenten ist es nicht erlaubt, ihre eigenen Farben zu verwenden: 'Seiten das Verwenden von eigenen Farben erlauben' ist im Browser deaktiviert.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/el/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Προηγούμενη σελίδα\nprevious_label=Προηγούμενη\nnext.title=Επόμενη σελίδα\nnext_label=Επόμενη\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Σελίδα\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=από {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} από {{pagesCount}})\n\nzoom_out.title=Σμίκρυνση\nzoom_out_label=Σμίκρυνση\nzoom_in.title=Μεγέθυνση\nzoom_in_label=Μεγέθυνση\nzoom.title=Ζουμ\npresentation_mode.title=Εναλλαγή σε λειτουργία παρουσίασης\npresentation_mode_label=Λειτουργία παρουσίασης\nopen_file.title=Άνοιγμα αρχείου\nopen_file_label=Άνοιγμα\nprint.title=Εκτύπωση\nprint_label=Εκτύπωση\ndownload.title=Λήψη\ndownload_label=Λήψη\nbookmark.title=Τρέχουσα προβολή (αντιγραφή ή άνοιγμα σε νέο παράθυρο)\nbookmark_label=Τρέχουσα προβολή\n\n# Secondary toolbar and context menu\ntools.title=Εργαλεία\ntools_label=Εργαλεία\nfirst_page.title=Μετάβαση στην πρώτη σελίδα\nfirst_page.label=Μετάβαση στην πρώτη σελίδα\nfirst_page_label=Μετάβαση στην πρώτη σελίδα\nlast_page.title=Μετάβαση στην τελευταία σελίδα\nlast_page.label=Μετάβαση στην τελευταία σελίδα\nlast_page_label=Μετάβαση στην τελευταία σελίδα\npage_rotate_cw.title=Δεξιόστροφη περιστροφή\npage_rotate_cw.label=Δεξιόστροφη περιστροφή\npage_rotate_cw_label=Δεξιόστροφη περιστροφή\npage_rotate_ccw.title=Αριστερόστροφη περιστροφή\npage_rotate_ccw.label=Αριστερόστροφη περιστροφή\npage_rotate_ccw_label=Αριστερόστροφη περιστροφή\n\ncursor_text_select_tool.title=Ενεργοποίηση εργαλείου επιλογής κειμένου\ncursor_text_select_tool_label=Εργαλείο επιλογής κειμένου\ncursor_hand_tool.title=Ενεργοποίηση εργαλείου χεριού\ncursor_hand_tool_label=Εργαλείο χεριού\n\n# Document properties dialog box\ndocument_properties.title=Ιδιότητες εγγράφου…\ndocument_properties_label=Ιδιότητες εγγράφου…\ndocument_properties_file_name=Όνομα αρχείου:\ndocument_properties_file_size=Μέγεθος αρχείου:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Τίτλος:\ndocument_properties_author=Συγγραφέας:\ndocument_properties_subject=Θέμα:\ndocument_properties_keywords=Λέξεις κλειδιά:\ndocument_properties_creation_date=Ημερομηνία δημιουργίας:\ndocument_properties_modification_date=Ημερομηνία τροποποίησης:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Δημιουργός:\ndocument_properties_producer=Παραγωγός PDF:\ndocument_properties_version=Έκδοση PDF:\ndocument_properties_page_count=Αριθμός σελίδων:\ndocument_properties_close=Κλείσιμο\n\nprint_progress_message=Προετοιμασία του εγγράφου για εκτύπωση…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Άκυρο\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=(Απ)ενεργοποίηση πλευρικής στήλης\ntoggle_sidebar_notification.title=(Απ)ενεργοποίηση πλευρικής στήλης (το έγγραφο περιέχει περίγραμμα/συνημμένα)\ntoggle_sidebar_label=(Απ)ενεργοποίηση πλευρικής στήλης\ndocument_outline.title=Εμφάνιση διάρθρωσης εγγράφου (διπλό κλικ για ανάπτυξη/σύμπτυξη όλων των στοιχείων)\ndocument_outline_label=Διάρθρωση εγγράφου\nattachments.title=Προβολή συνημμένων\nattachments_label=Συνημμένα\nthumbs.title=Προβολή μικρογραφιών\nthumbs_label=Μικρογραφίες\nfindbar.title=Εύρεση στο έγγραφο\nfindbar_label=Εύρεση\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Σελίδα {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Μικρογραφία της σελίδας {{page}}\n\n# Find panel button title and messages\nfind_input.title=Εύρεση\nfind_input.placeholder=Εύρεση στο έγγραφο…\nfind_previous.title=Εύρεση της προηγούμενης εμφάνισης της φράσης\nfind_previous_label=Προηγούμενο\nfind_next.title=Εύρεση της επόμενης εμφάνισης της φράσης\nfind_next_label=Επόμενο\nfind_highlight=Επισήμανση όλων\nfind_match_case_label=Ταίριασμα χαρακτήρα\nfind_reached_top=Έλευση στην αρχή του εγγράφου, συνέχεια από το τέλος\nfind_reached_bottom=Έλευση στο τέλος του εγγράφου, συνέχεια από την αρχή\nfind_not_found=Η φράση δεν βρέθηκε\n\n# Error panel labels\nerror_more_info=Περισσότερες πληροφορίες\nerror_less_info=Λιγότερες πληροφορίες\nerror_close=Κλείσιμο\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Μήνυμα: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Στοίβα: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Αρχείο: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Γραμμή: {{line}}\nrendering_error=Προέκυψε σφάλμα κατά την ανάλυση της σελίδας.\n\n# Predefined zoom values\npage_scale_width=Πλάτος σελίδας\npage_scale_fit=Μέγεθος σελίδας\npage_scale_auto=Αυτόματο ζουμ\npage_scale_actual=Πραγματικό μέγεθος\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Σφάλμα\nloading_error=Προέκυψε ένα σφάλμα κατά τη φόρτωση του PDF.\ninvalid_file_error=Μη έγκυρο ή κατεστραμμένο αρχείο PDF.\nmissing_file_error=Λείπει αρχείο PDF.\nunexpected_response_error=Μη αναμενόμενη απόκριση από το διακομιστή.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Σχόλιο]\npassword_label=Εισαγωγή κωδικού για το άνοιγμα του PDF αρχείου.\npassword_invalid=Μη έγκυρος κωδικός. Προσπαθείστε ξανά.\npassword_ok=ΟΚ\npassword_cancel=Ακύρωση\n\nprinting_not_supported=Προειδοποίηση: Η εκτύπωση δεν υποστηρίζεται πλήρως από αυτόν τον περιηγητή.\nprinting_not_ready=Προειδοποίηση: Το PDF δεν φορτώθηκε πλήρως για εκτύπωση.\nweb_fonts_disabled=Οι γραμματοσειρές Web απενεργοποιημένες: αδυναμία χρήσης των ενσωματωμένων γραμματοσειρών PDF.\ndocument_colors_not_allowed=Στα PDF έγγραφα δεν επιτρέπεται να χρησιμοποιούν τα δικά τους χρώματα: Το “Να επιτρέπεται στις σελίδες να επιλέγουν τα δικά τους χρώματα” είναι απενεργοποιημένο στον περιηγητή.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/en-GB/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Previous Page\nprevious_label=Previous\nnext.title=Next Page\nnext_label=Next\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Page\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=of {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=Zoom Out\nzoom_out_label=Zoom Out\nzoom_in.title=Zoom In\nzoom_in_label=Zoom In\nzoom.title=Zoom\npresentation_mode.title=Switch to Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Open File\nopen_file_label=Open\nprint.title=Print\nprint_label=Print\ndownload.title=Download\ndownload_label=Download\nbookmark.title=Current view (copy or open in new window)\nbookmark_label=Current View\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Go to First Page\nfirst_page.label=Go to First Page\nfirst_page_label=Go to First Page\nlast_page.title=Go to Last Page\nlast_page.label=Go to Last Page\nlast_page_label=Go to Last Page\npage_rotate_cw.title=Rotate Clockwise\npage_rotate_cw.label=Rotate Clockwise\npage_rotate_cw_label=Rotate Clockwise\npage_rotate_ccw.title=Rotate Anti-Clockwise\npage_rotate_ccw.label=Rotate Anti-Clockwise\npage_rotate_ccw_label=Rotate Anti-Clockwise\n\ncursor_text_select_tool.title=Enable Text Selection Tool\ncursor_text_select_tool_label=Text Selection Tool\ncursor_hand_tool.title=Enable Hand Tool\ncursor_hand_tool_label=Hand Tool\n\n# Document properties dialog box\ndocument_properties.title=Document Properties…\ndocument_properties_label=Document Properties…\ndocument_properties_file_name=File name:\ndocument_properties_file_size=File size:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Title:\ndocument_properties_author=Author:\ndocument_properties_subject=Subject:\ndocument_properties_keywords=Keywords:\ndocument_properties_creation_date=Creation Date:\ndocument_properties_modification_date=Modification Date:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creator:\ndocument_properties_producer=PDF Producer:\ndocument_properties_version=PDF Version:\ndocument_properties_page_count=Page Count:\ndocument_properties_close=Close\n\nprint_progress_message=Preparing document for printing…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancel\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggle Sidebar\ntoggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)\ntoggle_sidebar_label=Toggle Sidebar\ndocument_outline.title=Show Document Outline (double-click to expand/collapse all items)\ndocument_outline_label=Document Outline\nattachments.title=Show Attachments\nattachments_label=Attachments\nthumbs.title=Show Thumbnails\nthumbs_label=Thumbnails\nfindbar.title=Find in Document\nfindbar_label=Find\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail of Page {{page}}\n\n# Find panel button title and messages\nfind_input.title=Find\nfind_input.placeholder=Find in document…\nfind_previous.title=Find the previous occurrence of the phrase\nfind_previous_label=Previous\nfind_next.title=Find the next occurrence of the phrase\nfind_next_label=Next\nfind_highlight=Highlight all\nfind_match_case_label=Match case\nfind_reached_top=Reached top of document, continued from bottom\nfind_reached_bottom=Reached end of document, continued from top\nfind_not_found=Phrase not found\n\n# Error panel labels\nerror_more_info=More Information\nerror_less_info=Less Information\nerror_close=Close\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=An error occurred while rendering the page.\n\n# Predefined zoom values\npage_scale_width=Page Width\npage_scale_fit=Page Fit\npage_scale_auto=Automatic Zoom\npage_scale_actual=Actual Size\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=An error occurred while loading the PDF.\ninvalid_file_error=Invalid or corrupted PDF file.\nmissing_file_error=Missing PDF file.\nunexpected_response_error=Unexpected server response.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Enter the password to open this PDF file.\npassword_invalid=Invalid password. Please try again.\npassword_ok=OK\npassword_cancel=Cancel\n\nprinting_not_supported=Warning: Printing is not fully supported by this browser.\nprinting_not_ready=Warning: The PDF is not fully loaded for printing.\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\ndocument_colors_not_allowed=PDF documents are not allowed to use their own colours: “Allow pages to choose their own colours” is deactivated in the browser.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/en-US/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Previous Page\nprevious_label=Previous\nnext.title=Next Page\nnext_label=Next\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Page\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=of {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=Zoom Out\nzoom_out_label=Zoom Out\nzoom_in.title=Zoom In\nzoom_in_label=Zoom In\nzoom.title=Zoom\npresentation_mode.title=Switch to Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Open File\nopen_file_label=Open\nprint.title=Print\nprint_label=Print\ndownload.title=Download\ndownload_label=Download\nbookmark.title=Current view (copy or open in new window)\nbookmark_label=Current View\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Go to First Page\nfirst_page.label=Go to First Page\nfirst_page_label=Go to First Page\nlast_page.title=Go to Last Page\nlast_page.label=Go to Last Page\nlast_page_label=Go to Last Page\npage_rotate_cw.title=Rotate Clockwise\npage_rotate_cw.label=Rotate Clockwise\npage_rotate_cw_label=Rotate Clockwise\npage_rotate_ccw.title=Rotate Counterclockwise\npage_rotate_ccw.label=Rotate Counterclockwise\npage_rotate_ccw_label=Rotate Counterclockwise\n\ncursor_text_select_tool.title=Enable Text Selection Tool\ncursor_text_select_tool_label=Text Selection Tool\ncursor_hand_tool.title=Enable Hand Tool\ncursor_hand_tool_label=Hand Tool\n\n# Document properties dialog box\ndocument_properties.title=Document Properties…\ndocument_properties_label=Document Properties…\ndocument_properties_file_name=File name:\ndocument_properties_file_size=File size:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Title:\ndocument_properties_author=Author:\ndocument_properties_subject=Subject:\ndocument_properties_keywords=Keywords:\ndocument_properties_creation_date=Creation Date:\ndocument_properties_modification_date=Modification Date:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creator:\ndocument_properties_producer=PDF Producer:\ndocument_properties_version=PDF Version:\ndocument_properties_page_count=Page Count:\ndocument_properties_close=Close\n\nprint_progress_message=Preparing document for printing…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancel\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggle Sidebar\ntoggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)\ntoggle_sidebar_label=Toggle Sidebar\ndocument_outline.title=Show Document Outline (double-click to expand/collapse all items)\ndocument_outline_label=Document Outline\nattachments.title=Show Attachments\nattachments_label=Attachments\nthumbs.title=Show Thumbnails\nthumbs_label=Thumbnails\nfindbar.title=Find in Document\nfindbar_label=Find\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail of Page {{page}}\n\n# Find panel button title and messages\nfind_input.title=Find\nfind_input.placeholder=Find in document…\nfind_previous.title=Find the previous occurrence of the phrase\nfind_previous_label=Previous\nfind_next.title=Find the next occurrence of the phrase\nfind_next_label=Next\nfind_highlight=Highlight all\nfind_match_case_label=Match case\nfind_reached_top=Reached top of document, continued from bottom\nfind_reached_bottom=Reached end of document, continued from top\nfind_not_found=Phrase not found\n\n# Error panel labels\nerror_more_info=More Information\nerror_less_info=Less Information\nerror_close=Close\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=An error occurred while rendering the page.\n\n# Predefined zoom values\npage_scale_width=Page Width\npage_scale_fit=Page Fit\npage_scale_auto=Automatic Zoom\npage_scale_actual=Actual Size\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=An error occurred while loading the PDF.\ninvalid_file_error=Invalid or corrupted PDF file.\nmissing_file_error=Missing PDF file.\nunexpected_response_error=Unexpected server response.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Enter the password to open this PDF file.\npassword_invalid=Invalid password. Please try again.\npassword_ok=OK\npassword_cancel=Cancel\n\nprinting_not_supported=Warning: Printing is not fully supported by this browser.\nprinting_not_ready=Warning: The PDF is not fully loaded for printing.\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\ndocument_colors_not_allowed=PDF documents are not allowed to use their own colors: “Allow pages to choose their own colors” is deactivated in the browser.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/en-ZA/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Previous Page\nprevious_label=Previous\nnext.title=Next Page\nnext_label=Next\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=of {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Zoom Out\nzoom_out_label=Zoom Out\nzoom_in.title=Zoom In\nzoom_in_label=Zoom In\nzoom.title=Zoom\npresentation_mode.title=Switch to Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Open File\nopen_file_label=Open\nprint.title=Print\nprint_label=Print\ndownload.title=Download\ndownload_label=Download\nbookmark.title=Current view (copy or open in new window)\nbookmark_label=Current View\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Go to First Page\nfirst_page.label=Go to First Page\nfirst_page_label=Go to First Page\nlast_page.title=Go to Last Page\nlast_page.label=Go to Last Page\nlast_page_label=Go to Last Page\npage_rotate_cw.title=Rotate Clockwise\npage_rotate_cw.label=Rotate Clockwise\npage_rotate_cw_label=Rotate Clockwise\npage_rotate_ccw.title=Rotate Counterclockwise\npage_rotate_ccw.label=Rotate Counterclockwise\npage_rotate_ccw_label=Rotate Counterclockwise\n\n\n# Document properties dialog box\ndocument_properties.title=Document Properties…\ndocument_properties_label=Document Properties…\ndocument_properties_file_name=File name:\ndocument_properties_file_size=File size:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Title:\ndocument_properties_author=Author:\ndocument_properties_subject=Subject:\ndocument_properties_keywords=Keywords:\ndocument_properties_creation_date=Creation Date:\ndocument_properties_modification_date=Modification Date:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creator:\ndocument_properties_producer=PDF Producer:\ndocument_properties_version=PDF Version:\ndocument_properties_page_count=Page Count:\ndocument_properties_close=Close\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggle Sidebar\ntoggle_sidebar_label=Toggle Sidebar\ndocument_outline.title=Show Document Outline (double-click to expand/collapse all items)\ndocument_outline_label=Document Outline\nattachments.title=Show Attachments\nattachments_label=Attachments\nthumbs.title=Show Thumbnails\nthumbs_label=Thumbnails\nfindbar.title=Find in Document\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail of Page {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Find the previous occurrence of the phrase\nfind_previous_label=Previous\nfind_next.title=Find the next occurrence of the phrase\nfind_next_label=Next\nfind_highlight=Highlight all\nfind_match_case_label=Match case\nfind_reached_top=Reached top of document, continued from bottom\nfind_reached_bottom=Reached end of document, continued from top\nfind_not_found=Phrase not found\n\n# Error panel labels\nerror_more_info=More Information\nerror_less_info=Less Information\nerror_close=Close\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=An error occurred while rendering the page.\n\n# Predefined zoom values\npage_scale_width=Page Width\npage_scale_fit=Page Fit\npage_scale_auto=Automatic Zoom\npage_scale_actual=Actual Size\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=An error occurred while loading the PDF.\ninvalid_file_error=Invalid or corrupted PDF file.\nmissing_file_error=Missing PDF file.\nunexpected_response_error=Unexpected server response.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Enter the password to open this PDF file.\npassword_invalid=Invalid password. Please try again.\npassword_ok=OK\n\nprinting_not_supported=Warning: Printing is not fully supported by this browser.\nprinting_not_ready=Warning: The PDF is not fully loaded for printing.\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\ndocument_colors_not_allowed=PDF documents are not allowed to use their own colours: “Allow pages to choose their own colours” is deactivated in the browser.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/eo/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Antaŭa paĝo\nprevious_label=Malantaŭen\nnext.title=Venonta paĝo\nnext_label=Antaŭen\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Paĝo\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=el {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} el {{pagesCount}})\n\nzoom_out.title=Malpligrandigi\nzoom_out_label=Malpligrandigi\nzoom_in.title=Pligrandigi\nzoom_in_label=Pligrandigi\nzoom.title=Pligrandigilo\npresentation_mode.title=Iri al prezenta reĝimo\npresentation_mode_label=Prezenta reĝimo\nopen_file.title=Malfermi dosieron\nopen_file_label=Malfermi\nprint.title=Presi\nprint_label=Presi\ndownload.title=Elŝuti\ndownload_label=Elŝuti\nbookmark.title=Nuna vido (kopii aŭ malfermi en nova fenestro)\nbookmark_label=Nuna vido\n\n# Secondary toolbar and context menu\ntools.title=Iloj\ntools_label=Iloj\nfirst_page.title=Iri al la unua paĝo\nfirst_page.label=Iri al la unua paĝo\nfirst_page_label=Iri al la unua paĝo\nlast_page.title=Iri al la lasta paĝo\nlast_page.label=Iri al la lasta paĝo\nlast_page_label=Iri al la lasta paĝo\npage_rotate_cw.title=Rotaciigi dekstrume\npage_rotate_cw.label=Rotaciigi dekstrume\npage_rotate_cw_label=Rotaciigi dekstrume\npage_rotate_ccw.title=Rotaciigi maldekstrume\npage_rotate_ccw.label=Rotaciigi maldekstrume\npage_rotate_ccw_label=Rotaciigi maldekstrume\n\ncursor_text_select_tool.title=Aktivigi tekstan elektilon\ncursor_text_select_tool_label=Teksta elektilo\ncursor_hand_tool.title=Aktivigi ilon de mano\ncursor_hand_tool_label=Ilo de mano\n\n# Document properties dialog box\ndocument_properties.title=Atributoj de dokumento…\ndocument_properties_label=Atributoj de dokumento…\ndocument_properties_file_name=Nomo de dosiero:\ndocument_properties_file_size=Grado de dosiero:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KO ({{size_b}} oktetoj)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MO ({{size_b}} oktetoj)\ndocument_properties_title=Titolo:\ndocument_properties_author=Aŭtoro:\ndocument_properties_subject=Temo:\ndocument_properties_keywords=Ŝlosilvorto:\ndocument_properties_creation_date=Dato de kreado:\ndocument_properties_modification_date=Dato de modifo:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Kreinto:\ndocument_properties_producer=Produktinto de PDF:\ndocument_properties_version=Versio de PDF:\ndocument_properties_page_count=Nombro de paĝoj:\ndocument_properties_close=Fermi\n\nprint_progress_message=Preparo de dokumento por presi ĝin …\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Nuligi\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Montri/kaŝi flankan strion\ntoggle_sidebar_notification.title=Montri/kaŝi flankan strion (la dokumento enhavas konturon/aneksaĵojn)\ntoggle_sidebar_label=Montri/kaŝi flankan strion\ndocument_outline.title=Montri la konturon de dokumento (alklaku duoble por faldi/malfaldi ĉiujn elementojn)\ndocument_outline_label=Konturo de dokumento\nattachments.title=Montri kunsendaĵojn\nattachments_label=Kunsendaĵojn\nthumbs.title=Montri miniaturojn\nthumbs_label=Miniaturoj\nfindbar.title=Serĉi en dokumento\nfindbar_label=Serĉi\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Paĝo {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniaturo de paĝo {{page}}\n\n# Find panel button title and messages\nfind_input.title=Serĉi\nfind_input.placeholder=Serĉi en dokumento…\nfind_previous.title=Serĉi la antaŭan aperon de la frazo\nfind_previous_label=Malantaŭen\nfind_next.title=Serĉi la venontan aperon de la frazo\nfind_next_label=Antaŭen\nfind_highlight=Elstarigi ĉiujn\nfind_match_case_label=Distingi inter majuskloj kaj minuskloj\nfind_reached_top=Komenco de la dokumento atingita, daŭrigado ekde la fino\nfind_reached_bottom=Fino de la dokumento atingita, daŭrigado ekde la komenco\nfind_not_found=Frazo ne trovita\n\n# Error panel labels\nerror_more_info=Pli da informo\nerror_less_info=Mapli da informo\nerror_close=Fermi\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesaĝo: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stako: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Dosiero: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linio: {{line}}\nrendering_error=Okazis eraro dum la montrado de la paĝo.\n\n# Predefined zoom values\npage_scale_width=Larĝo de paĝo\npage_scale_fit=Adapti paĝon\npage_scale_auto=Aŭtomata skalo\npage_scale_actual=Reala gandeco\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Eraro\nloading_error=Okazis eraro dum la ŝargado de la PDF dosiero.\ninvalid_file_error=Nevalida aŭ difektita PDF dosiero.\nmissing_file_error=Mankas dosiero PDF.\nunexpected_response_error=Neatendita respondo de servilo.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Prinoto: {{type}}]\npassword_label=Tajpu pasvorton por malfermi tiun ĉi dosieron PDF.\npassword_invalid=Nevalida pasvorto. Bonvolu provi denove.\npassword_ok=Akcepti\npassword_cancel=Nuligi\n\nprinting_not_supported=Averto: tiu ĉi retumilo ne plene subtenas presadon.\nprinting_not_ready=Averto: La PDF dosiero ne estas plene ŝargita por presado.\nweb_fonts_disabled=Neaktivaj teksaĵaj tiparoj: ne elbas uzi enmetitajn tiparojn de PDF.\ndocument_colors_not_allowed=PDF dokumentoj ne rajtas uzi siajn proprajn kolorojn: 'Permesi al paĝoj uzi siajn proprajn kolorojn' ne estas aktiva en la retumilo.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/es-AR/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Página siguiente\nnext_label=Siguiente\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Página\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=( {{pageNumber}} de {{pagesCount}} )\n\nzoom_out.title=Alejar\nzoom_out_label=Alejar\nzoom_in.title=Acercar\nzoom_in_label=Acercar\nzoom.title=Zoom\npresentation_mode.title=Cambiar a modo presentación\npresentation_mode_label=Modo presentación\nopen_file.title=Abrir archivo\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar o abrir en nueva ventana)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Herramientas\ntools_label=Herramientas\nfirst_page.title=Ir a primera página\nfirst_page.label=Ir a primera página\nfirst_page_label=Ir a primera página\nlast_page.title=Ir a última página\nlast_page.label=Ir a última página\nlast_page_label=Ir a última página\npage_rotate_cw.title=Rotar horario\npage_rotate_cw.label=Rotar horario\npage_rotate_cw_label=Rotar horario\npage_rotate_ccw.title=Rotar antihorario\npage_rotate_ccw.label=Rotar antihorario\npage_rotate_ccw_label=Rotar antihorario\n\ncursor_text_select_tool.title=Habilitar herramienta de selección de texto\ncursor_text_select_tool_label=Herramienta de selección de texto\ncursor_hand_tool.title=Habilitar herramienta mano\ncursor_hand_tool_label=Herramienta mano\n\n# Document properties dialog box\ndocument_properties.title=Propiedades del documento…\ndocument_properties_label=Propiedades del documento…\ndocument_properties_file_name=Nombre de archivo:\ndocument_properties_file_size=Tamaño de archovo:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asunto:\ndocument_properties_keywords=Palabras clave:\ndocument_properties_creation_date=Fecha de creación:\ndocument_properties_modification_date=Fecha de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=PDF Productor:\ndocument_properties_version=Versión de PDF:\ndocument_properties_page_count=Cantidad de páginas:\ndocument_properties_close=Cerrar\n\nprint_progress_message=Preparando documento para imprimir…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Alternar barra lateral\ntoggle_sidebar_notification.title=Intercambiar barra lateral (el documento contiene esquema/adjuntos)\ntoggle_sidebar_label=Alternar barra lateral\ndocument_outline.title=Mostrar esquema del documento (doble clic para expandir/colapsar todos los ítems)\ndocument_outline_label=Esquema del documento\nattachments.title=Mostrar adjuntos\nattachments_label=Adjuntos\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Buscar en documento\nfindbar_label=Buscar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de página {{page}}\n\n# Find panel button title and messages\nfind_input.title=Buscar\nfind_input.placeholder=Buscar en documento…\nfind_previous.title=Buscar la aparición anterior de la frase\nfind_previous_label=Anterior\nfind_next.title=Buscar la siguiente aparición de la frase\nfind_next_label=Siguiente\nfind_highlight=Resaltar todo\nfind_match_case_label=Coincidir mayúsculas\nfind_reached_top=Inicio de documento alcanzado, continuando desde abajo\nfind_reached_bottom=Fin de documento alcanzando, continuando desde arriba\nfind_not_found=Frase no encontrada\n\n# Error panel labels\nerror_more_info=Más información\nerror_less_info=Menos información\nerror_close=Cerrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaje: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Archivo: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Línea: {{line}}\nrendering_error=Ocurrió un error al dibujar la página.\n\n# Predefined zoom values\npage_scale_width=Ancho de página\npage_scale_fit=Ajustar página\npage_scale_auto=Zoom automático\npage_scale_actual=Tamaño real\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=Ocurrió un error al cargar el PDF.\ninvalid_file_error=Archivo PDF no válido o cocrrupto.\nmissing_file_error=Archivo PDF faltante.\nunexpected_response_error=Respuesta del servidor inesperada.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Anotación]\npassword_label=Ingrese la contraseña para abrir este archivo PDF\npassword_invalid=Contraseña inválida. Intente nuevamente.\npassword_ok=Aceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Advertencia: La impresión no está totalmente soportada por este navegador.\nprinting_not_ready=Advertencia: El PDF no está completamente cargado para impresión.\nweb_fonts_disabled=Tipografía web deshabilitada: no se pueden usar tipos incrustados en PDF.\ndocument_colors_not_allowed=Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las páginas elegir sus propios colores' está desactivado en el navegador.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/es-CL/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Página siguiente\nnext_label=Siguiente\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Página\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Alejar\nzoom_out_label=Alejar\nzoom_in.title=Acercar\nzoom_in_label=Acercar\nzoom.title=Ampliación\npresentation_mode.title=Cambiar al modo de presentación\npresentation_mode_label=Modo de presentación\nopen_file.title=Abrir archivo\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar o abrir en nueva ventana)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Herramientas\ntools_label=Herramientas\nfirst_page.title=Ir a la primera página\nfirst_page.label=Ir a la primera página\nfirst_page_label=Ir a la primera página\nlast_page.title=Ir a la última página\nlast_page.label=Ir a la última página\nlast_page_label=Ir a la última página\npage_rotate_cw.title=Girar a la derecha\npage_rotate_cw.label=Girar a la derecha\npage_rotate_cw_label=Girar a la derecha\npage_rotate_ccw.title=Girar a la izquierda\npage_rotate_ccw.label=Girar a la izquierda\npage_rotate_ccw_label=Girar a la izquierda\n\ncursor_text_select_tool.title=Activar la herramienta de selección de texto\ncursor_text_select_tool_label=Herramienta de selección de texto\ncursor_hand_tool.title=Activar la herramienta de mano\ncursor_hand_tool_label=Herramienta de mano\n\n# Document properties dialog box\ndocument_properties.title=Propiedades del documento…\ndocument_properties_label=Propiedades del documento…\ndocument_properties_file_name=Nombre de archivo:\ndocument_properties_file_size=Tamaño del archivo:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asunto:\ndocument_properties_keywords=Palabras clave:\ndocument_properties_creation_date=Fecha de creación:\ndocument_properties_modification_date=Fecha de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=Productor del PDF:\ndocument_properties_version=Versión de PDF:\ndocument_properties_page_count=Cantidad de páginas:\ndocument_properties_close=Cerrar\n\nprint_progress_message=Preparando documento para impresión…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Barra lateral\ntoggle_sidebar_notification.title=Cambiar barra lateral (índice de contenidos del documento/adjuntos)\ntoggle_sidebar_label=Mostrar u ocultar la barra lateral\ndocument_outline.title=Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos)\ndocument_outline_label=Esquema del documento\nattachments.title=Mostrar adjuntos\nattachments_label=Adjuntos\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Buscar en el documento\nfindbar_label=Buscar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de la página {{page}}\n\n# Find panel button title and messages\nfind_input.title=Encontrar\nfind_input.placeholder=Encontrar en el documento…\nfind_previous.title=Buscar la aparición anterior de la frase\nfind_previous_label=Previo\nfind_next.title=Buscar la siguiente aparición de la frase\nfind_next_label=Siguiente\nfind_highlight=Destacar todos\nfind_match_case_label=Coincidir mayús./minús.\nfind_reached_top=Se alcanzó el inicio del documento, continuando desde el final\nfind_reached_bottom=Se alcanzó el final del documento, continuando desde el inicio\nfind_not_found=Frase no encontrada\n\n# Error panel labels\nerror_more_info=Más información\nerror_less_info=Menos información\nerror_close=Cerrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (compilación: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaje: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Archivo: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Línea: {{line}}\nrendering_error=Ha ocurrido un error al renderizar la página.\n\n# Predefined zoom values\npage_scale_width=Ancho de página\npage_scale_fit=Ajuste de página\npage_scale_auto=Aumento automático\npage_scale_actual=Tamaño actual\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=Ha ocurrido un error al cargar el PDF.\ninvalid_file_error=Archivo PDF inválido o corrupto.\nmissing_file_error=Falta el archivo PDF.\nunexpected_response_error=Respuesta del servidor inesperada.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Anotación]\npassword_label=Ingrese la contraseña para abrir este archivo PDF.\npassword_invalid=Contraseña inválida. Por favor, vuelve a intentarlo.\npassword_ok=Aceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Advertencia: Imprimir no está soportado completamente por este navegador.\nprinting_not_ready=Advertencia: El PDF no está completamente cargado para ser impreso.\nweb_fonts_disabled=Las tipografías web están desactivadas: imposible usar las fuentes PDF embebidas.\ndocument_colors_not_allowed=Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las páginas elegir sus propios colores' está desactivado en el navegador.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/es-ES/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nprevious.title = Página anterior\nprevious_label = Anterior\nnext.title = Página siguiente\nnext_label = Siguiente\npage.title = Página\nof_pages = de {{pagesCount}}\npage_of_pages = ({{pageNumber}} de {{pagesCount}})\nzoom_out.title = Reducir\nzoom_out_label = Reducir\nzoom_in.title = Aumentar\nzoom_in_label = Aumentar\nzoom.title = Tamaño\npresentation_mode.title = Cambiar al modo presentación\npresentation_mode_label = Modo presentación\nopen_file.title = Abrir archivo\nopen_file_label = Abrir\nprint.title = Imprimir\nprint_label = Imprimir\ndownload.title = Descargar\ndownload_label = Descargar\nbookmark.title = Vista actual (copiar o abrir en una nueva ventana)\nbookmark_label = Vista actual\ntools.title = Herramientas\ntools_label = Herramientas\nfirst_page.title = Ir a la primera página\nfirst_page.label = Ir a la primera página\nfirst_page_label = Ir a la primera página\nlast_page.title = Ir a la última página\nlast_page.label = Ir a la última página\nlast_page_label = Ir a la última página\npage_rotate_cw.title = Rotar en sentido horario\npage_rotate_cw.label = Rotar en sentido horario\npage_rotate_cw_label = Rotar en sentido horario\npage_rotate_ccw.title = Rotar en sentido antihorario\npage_rotate_ccw.label = Rotar en sentido antihorario\npage_rotate_ccw_label = Rotar en sentido antihorario\ncursor_text_select_tool.title = Activar herramienta de selección de texto\ncursor_text_select_tool_label = Herramienta de selección de texto\ncursor_hand_tool.title = Activar herramienta de mano\ncursor_hand_tool_label = Herramienta de mano\ndocument_properties.title = Propiedades del documento…\ndocument_properties_label = Propiedades del documento…\ndocument_properties_file_name = Nombre de archivo:\ndocument_properties_file_size = Tamaño de archivo:\ndocument_properties_kb = {{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb = {{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title = Título:\ndocument_properties_author = Autor:\ndocument_properties_subject = Asunto:\ndocument_properties_keywords = Palabras clave:\ndocument_properties_creation_date = Fecha de creación:\ndocument_properties_modification_date = Fecha de modificación:\ndocument_properties_date_string = {{date}}, {{time}}\ndocument_properties_creator = Creador:\ndocument_properties_producer = Productor PDF:\ndocument_properties_version = Versión PDF:\ndocument_properties_page_count = Número de páginas:\ndocument_properties_close = Cerrar\nprint_progress_message = Preparando documento para impresión…\nprint_progress_percent = {{progress}}%\nprint_progress_close = Cancelar\ntoggle_sidebar.title = Cambiar barra lateral\ntoggle_sidebar_notification.title = Alternar panel lateral (el documento contiene un esquema o adjuntos)\ntoggle_sidebar_label = Cambiar barra lateral\ndocument_outline.title = Mostrar resumen del documento (doble clic para expandir/contraer todos los elementos)\ndocument_outline_label = Resumen de documento\nattachments.title = Mostrar adjuntos\nattachments_label = Adjuntos\nthumbs.title = Mostrar miniaturas\nthumbs_label = Miniaturas\nfindbar.title = Buscar en el documento\nfindbar_label = Buscar\nthumb_page_title = Página {{page}}\nthumb_page_canvas = Miniatura de la página {{page}}\nfind_input.title = Buscar\nfind_input.placeholder = Buscar en el documento…\nfind_previous.title = Encontrar la anterior aparición de la frase\nfind_previous_label = Anterior\nfind_next.title = Encontrar la siguiente aparición de esta frase\nfind_next_label = Siguiente\nfind_highlight = Resaltar todos\nfind_match_case_label = Coincidencia de mayús./minús.\nfind_reached_top = Se alcanzó el inicio del documento, se continúa desde el final\nfind_reached_bottom = Se alcanzó el final del documento, se continúa desde el inicio\nfind_not_found = Frase no encontrada\nerror_more_info = Más información\nerror_less_info = Menos información\nerror_close = Cerrar\nerror_version_info = PDF.js v{{version}} (build: {{build}})\nerror_message = Mensaje: {{message}}\nerror_stack = Pila: {{stack}}\nerror_file = Archivo: {{file}}\nerror_line = Línea: {{line}}\nrendering_error = Ocurrió un error al renderizar la página.\npage_scale_width = Anchura de la página\npage_scale_fit = Ajuste de la página\npage_scale_auto = Tamaño automático\npage_scale_actual = Tamaño real\npage_scale_percent = {{scale}}%\nloading_error_indicator = Error\nloading_error = Ocurrió un error al cargar el PDF.\ninvalid_file_error = Fichero PDF no válido o corrupto.\nmissing_file_error = No hay fichero PDF.\nunexpected_response_error = Respuesta inesperada del servidor.\ntext_annotation_type.alt = [Anotación {{type}}]\npassword_label = Introduzca la contraseña para abrir este archivo PDF.\npassword_invalid = Contraseña no válida. Vuelva a intentarlo.\npassword_ok = Aceptar\npassword_cancel = Cancelar\nprinting_not_supported = Advertencia: Imprimir no está totalmente soportado por este navegador.\nprinting_not_ready = Advertencia: Este PDF no se ha cargado completamente para poder imprimirse.\nweb_fonts_disabled = Las tipografías web están desactivadas: es imposible usar las tipografías PDF embebidas.\ndocument_colors_not_allowed = Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las páginas elegir sus propios colores' está desactivado en el navegador.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/es-MX/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Página siguiente\nnext_label=Siguiente\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Página\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Reducir\nzoom_out_label=Reducir\nzoom_in.title=Aumentar\nzoom_in_label=Aumentar\nzoom.title=Zoom\npresentation_mode.title=Cambiar al modo presentación\npresentation_mode_label=Modo presentación\nopen_file.title=Abrir archivo\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar o abrir en una nueva ventana)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Herramientas\ntools_label=Herramientas\nfirst_page.title=Ir a la primera página\nfirst_page.label=Ir a la primera página\nfirst_page_label=Ir a la primera página\nlast_page.title=Ir a la última página\nlast_page.label=Ir a la última página\nlast_page_label=Ir a la última página\npage_rotate_cw.title=Girar a la derecha\npage_rotate_cw.label=Girar a la derecha\npage_rotate_cw_label=Girar a la derecha\npage_rotate_ccw.title=Girar a la izquierda\npage_rotate_ccw.label=Girar a la izquierda\npage_rotate_ccw_label=Girar a la izquierda\n\ncursor_text_select_tool.title=Activar la herramienta de selección de texto\ncursor_text_select_tool_label=Herramienta de selección de texto\ncursor_hand_tool.title=Activar la herramienta de mano\ncursor_hand_tool_label=Herramienta de mano\n\n# Document properties dialog box\ndocument_properties.title=Propiedades del documento…\ndocument_properties_label=Propiedades del documento…\ndocument_properties_file_name=Nombre del archivo:\ndocument_properties_file_size=Tamaño del archivo:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asunto:\ndocument_properties_keywords=Palabras claves:\ndocument_properties_creation_date=Fecha de creación:\ndocument_properties_modification_date=Fecha de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=Productor PDF:\ndocument_properties_version=Versión PDF:\ndocument_properties_page_count=Número de páginas:\ndocument_properties_close=Cerrar\n\nprint_progress_message=Preparando documento para impresión…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Cambiar barra lateral\ntoggle_sidebar_notification.title=Cambiar barra lateral (índice de contenidos del documento/adjuntos)\ntoggle_sidebar_label=Cambiar barra lateral\ndocument_outline.title=Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos)\ndocument_outline_label=Esquema del documento\nattachments.title=Mostrar adjuntos\nattachments_label=Adjuntos\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Buscar en el documento\nfindbar_label=Buscar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de la página {{page}}\n\n# Find panel button title and messages\nfind_input.title=Buscar\nfind_input.placeholder=Buscar en el documento…\nfind_previous.title=Ir a la anterior frase encontrada\nfind_previous_label=Anterior\nfind_next.title=Ir a la siguiente frase encontrada\nfind_next_label=Siguiente\nfind_highlight=Resaltar todo\nfind_match_case_label=Coincidir con mayúsculas y minúsculas\nfind_reached_top=Se alcanzó el inicio del documento, se buscará al final\nfind_reached_bottom=Se alcanzó el final del documento, se buscará al inicio\nfind_not_found=No se encontró la frase\n\n# Error panel labels\nerror_more_info=Más información\nerror_less_info=Menos información\nerror_close=Cerrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaje: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Archivo: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Línea: {{line}}\nrendering_error=Un error ocurrió al renderizar la página.\n\n# Predefined zoom values\npage_scale_width=Ancho de página\npage_scale_fit=Ajustar página\npage_scale_auto=Zoom automático\npage_scale_actual=Tamaño real\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=Un error ocurrió al cargar el PDF.\ninvalid_file_error=Archivo PDF invalido o dañado.\nmissing_file_error=Archivo PDF no encontrado.\nunexpected_response_error=Respuesta inesperada del servidor.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} anotación]\npassword_label=Ingresa la contraseña para abrir este archivo PDF.\npassword_invalid=Contraseña inválida. Por favor intenta de nuevo.\npassword_ok=Aceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Advertencia: La impresión no esta completamente soportada por este navegador.\nprinting_not_ready=Advertencia: El PDF no cargo completamente para impresión.\nweb_fonts_disabled=Las fuentes web están desactivadas: es imposible usar las fuentes PDF embebidas.\ndocument_colors_not_allowed=Los documentos PDF no tienen permiso de usar sus propios colores: 'Permitir que las páginas elijan sus propios colores' esta desactivada en el navegador.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/et/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Eelmine lehekülg\nprevious_label=Eelmine\nnext.title=Järgmine lehekülg\nnext_label=Järgmine\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Leht\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}}/{{pagesCount}})\n\nzoom_out.title=Vähenda\nzoom_out_label=Vähenda\nzoom_in.title=Suurenda\nzoom_in_label=Suurenda\nzoom.title=Suurendamine\npresentation_mode.title=Lülitu esitlusrežiimi\npresentation_mode_label=Esitlusrežiim\nopen_file.title=Ava fail\nopen_file_label=Ava\nprint.title=Prindi\nprint_label=Prindi\ndownload.title=Laadi alla\ndownload_label=Laadi alla\nbookmark.title=Praegune vaade (kopeeri või ava uues aknas)\nbookmark_label=Praegune vaade\n\n# Secondary toolbar and context menu\ntools.title=Tööriistad\ntools_label=Tööriistad\nfirst_page.title=Mine esimesele leheküljele\nfirst_page.label=Mine esimesele leheküljele\nfirst_page_label=Mine esimesele leheküljele\nlast_page.title=Mine viimasele leheküljele\nlast_page.label=Mine viimasele leheküljele\nlast_page_label=Mine viimasele leheküljele\npage_rotate_cw.title=Pööra päripäeva\npage_rotate_cw.label=Pööra päripäeva\npage_rotate_cw_label=Pööra päripäeva\npage_rotate_ccw.title=Pööra vastupäeva\npage_rotate_ccw.label=Pööra vastupäeva\npage_rotate_ccw_label=Pööra vastupäeva\n\n\n# Document properties dialog box\ndocument_properties.title=Dokumendi omadused…\ndocument_properties_label=Dokumendi omadused…\ndocument_properties_file_name=Faili nimi:\ndocument_properties_file_size=Faili suurus:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KiB ({{size_b}} baiti)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MiB ({{size_b}} baiti)\ndocument_properties_title=Pealkiri:\ndocument_properties_author=Autor:\ndocument_properties_subject=Teema:\ndocument_properties_keywords=Märksõnad:\ndocument_properties_creation_date=Loodud:\ndocument_properties_modification_date=Muudetud:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}} {{time}}\ndocument_properties_creator=Looja:\ndocument_properties_producer=Generaator:\ndocument_properties_version=Generaatori versioon:\ndocument_properties_page_count=Lehekülgi:\ndocument_properties_close=Sulge\n\nprint_progress_message=Dokumendi ettevalmistamine printimiseks…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Loobu\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Näita külgriba\ntoggle_sidebar_notification.title=Näita külgriba (dokument sisaldab sisukorda/manuseid)\ntoggle_sidebar_label=Näita külgriba\ndocument_outline.title=Näita sisukorda (kõigi punktide laiendamiseks/ahendamiseks topeltklõpsa)\ndocument_outline_label=Näita sisukorda\nattachments.title=Näita manuseid\nattachments_label=Manused\nthumbs.title=Näita pisipilte\nthumbs_label=Pisipildid\nfindbar.title=Otsi dokumendist\nfindbar_label=Otsi\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}}. lehekülg\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}. lehekülje pisipilt\n\n# Find panel button title and messages\nfind_input.title=Otsi\nfind_input.placeholder=Otsi dokumendist…\nfind_previous.title=Otsi fraasi eelmine esinemiskoht\nfind_previous_label=Eelmine\nfind_next.title=Otsi fraasi järgmine esinemiskoht\nfind_next_label=Järgmine\nfind_highlight=Too kõik esile\nfind_match_case_label=Tõstutundlik\nfind_reached_top=Jõuti dokumendi algusesse, jätkati lõpust\nfind_reached_bottom=Jõuti dokumendi lõppu, jätkati algusest\nfind_not_found=Fraasi ei leitud\n\n# Error panel labels\nerror_more_info=Rohkem teavet\nerror_less_info=Vähem teavet\nerror_close=Sulge\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Teade: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fail: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rida: {{line}}\nrendering_error=Lehe renderdamisel esines viga.\n\n# Predefined zoom values\npage_scale_width=Mahuta laiusele\npage_scale_fit=Mahuta leheküljele\npage_scale_auto=Automaatne suurendamine\npage_scale_actual=Tegelik suurus\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Viga\nloading_error=PDFi laadimisel esines viga.\ninvalid_file_error=Vigane või rikutud PDF-fail.\nmissing_file_error=PDF-fail puudub.\nunexpected_response_error=Ootamatu vastus serverilt.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=PDF-faili avamiseks sisesta parool.\npassword_invalid=Vigane parool. Palun proovi uuesti.\npassword_ok=Sobib\npassword_cancel=Loobu\n\nprinting_not_supported=Hoiatus: printimine pole selle brauseri poolt täielikult toetatud.\nprinting_not_ready=Hoiatus: PDF pole printimiseks täielikult laaditud.\nweb_fonts_disabled=Veebifondid on keelatud: PDFiga kaasatud fonte pole võimalik kasutada.\ndocument_colors_not_allowed=PDF-dokumentidel pole oma värvide kasutamine lubatud: “Veebilehtedel on lubatud kasutada oma värve” on brauseris deaktiveeritud.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/eu/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Aurreko orria\nprevious_label=Aurrekoa\nnext.title=Hurrengo orria\nnext_label=Hurrengoa\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Orria\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages={{pagesCount}}/{{pageNumber}}\n\nzoom_out.title=Urrundu zooma\nzoom_out_label=Urrundu zooma\nzoom_in.title=Gerturatu zooma\nzoom_in_label=Gerturatu zooma\nzoom.title=Zooma\npresentation_mode.title=Aldatu aurkezpen modura\npresentation_mode_label=Arkezpen modua\nopen_file.title=Ireki fitxategia\nopen_file_label=Ireki\nprint.title=Inprimatu\nprint_label=Inprimatu\ndownload.title=Deskargatu\ndownload_label=Deskargatu\nbookmark.title=Uneko ikuspegia (kopiatu edo ireki leiho berrian)\nbookmark_label=Uneko ikuspegia\n\n# Secondary toolbar and context menu\ntools.title=Tresnak\ntools_label=Tresnak\nfirst_page.title=Joan lehen orrira\nfirst_page.label=Joan lehen orrira\nfirst_page_label=Joan lehen orrira\nlast_page.title=Joan azken orrira\nlast_page.label=Joan azken orrira\nlast_page_label=Joan azken orrira\npage_rotate_cw.title=Biratu erlojuaren norantzan\npage_rotate_cw.label=Biratu erlojuaren norantzan\npage_rotate_cw_label=Biratu erlojuaren norantzan\npage_rotate_ccw.title=Biratu erlojuaren aurkako norantzan\npage_rotate_ccw.label=Biratu erlojuaren aurkako norantzan\npage_rotate_ccw_label=Biratu erlojuaren aurkako norantzan\n\ncursor_text_select_tool.title=Gaitu testuaren hautapen tresna\ncursor_text_select_tool_label=Testuaren hautapen tresna\ncursor_hand_tool.title=Gaitu eskuaren tresna\ncursor_hand_tool_label=Eskuaren tresna\n\n# Document properties dialog box\ndocument_properties.title=Dokumentuaren propietateak…\ndocument_properties_label=Dokumentuaren propietateak…\ndocument_properties_file_name=Fitxategi-izena:\ndocument_properties_file_size=Fitxategiaren tamaina:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} byte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title=Izenburua:\ndocument_properties_author=Egilea:\ndocument_properties_subject=Gaia:\ndocument_properties_keywords=Gako-hitzak:\ndocument_properties_creation_date=Sortze-data:\ndocument_properties_modification_date=Aldatze-data:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Sortzailea:\ndocument_properties_producer=PDFaren ekoizlea:\ndocument_properties_version=PDF bertsioa:\ndocument_properties_page_count=Orrialde kopurua:\ndocument_properties_close=Itxi\n\nprint_progress_message=Dokumentua inprimatzeko prestatzen…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent=%{{progress}}\nprint_progress_close=Utzi\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Txandakatu alboko barra\ntoggle_sidebar_notification.title=Txandakatu alboko barra (dokumentuak eskema/eranskinak ditu)\ntoggle_sidebar_label=Txandakatu alboko barra\ndocument_outline.title=Erakutsi dokumentuaren eskema (klik bikoitza elementu guztiak zabaltzeko/tolesteko)\ndocument_outline_label=Dokumentuaren eskema\nattachments.title=Erakutsi eranskinak\nattachments_label=Eranskinak\nthumbs.title=Erakutsi koadro txikiak\nthumbs_label=Koadro txikiak\nfindbar.title=Bilatu dokumentuan\nfindbar_label=Bilatu\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}}. orria\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}. orriaren koadro txikia\n\n# Find panel button title and messages\nfind_input.title=Bilatu\nfind_input.placeholder=Bilatu dokumentuan…\nfind_previous.title=Bilatu esaldiaren aurreko parekatzea\nfind_previous_label=Aurrekoa\nfind_next.title=Bilatu esaldiaren hurrengo parekatzea\nfind_next_label=Hurrengoa\nfind_highlight=Nabarmendu guztia\nfind_match_case_label=Bat etorri maiuskulekin/minuskulekin\nfind_reached_top=Dokumentuaren hasierara heldu da, bukaeratik jarraitzen\nfind_reached_bottom=Dokumentuaren bukaerara heldu da, hasieratik jarraitzen\nfind_not_found=Esaldia ez da aurkitu\n\n# Error panel labels\nerror_more_info=Informazio gehiago\nerror_less_info=Informazio gutxiago\nerror_close=Itxi\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (eraikuntza: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mezua: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fitxategia: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Lerroa: {{line}}\nrendering_error=Errorea gertatu da orria errendatzean.\n\n# Predefined zoom values\npage_scale_width=Orriaren zabalera\npage_scale_fit=Doitu orrira\npage_scale_auto=Zoom automatikoa\npage_scale_actual=Benetako tamaina\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent=%{{scale}}\n\n# Loading indicator messages\nloading_error_indicator=Errorea\nloading_error=Errorea gertatu da PDFa kargatzean.\ninvalid_file_error=PDF fitxategi baliogabe edo hondatua.\nmissing_file_error=PDF fitxategia falta da.\nunexpected_response_error=Espero gabeko zerbitzariaren erantzuna.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} ohartarazpena]\npassword_label=Idatzi PDF fitxategi hau irekitzeko pasahitza.\npassword_invalid=Pasahitz baliogabea. Saiatu berriro mesedez.\npassword_ok=Ados\npassword_cancel=Utzi\n\nprinting_not_supported=Abisua: inprimatzeko euskarria ez da erabatekoa nabigatzaile honetan.\nprinting_not_ready=Abisua: PDFa ez dago erabat kargatuta inprimatzeko.\nweb_fonts_disabled=Webeko letra-tipoak desgaituta daude: ezin dira kapsulatutako PDF letra-tipoak erabili.\ndocument_colors_not_allowed=PDF dokumentuek ez dute beraien koloreak erabiltzeko baimenik: 'Baimendu orriak beraien letra-tipoak aukeratzea' desaktibatuta dago nabigatzailean.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/fa/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=صفحهٔ قبلی\nprevious_label=قبلی\nnext.title=صفحهٔ بعدی\nnext_label=بعدی\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=صفحه\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=از {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}}از {{pagesCount}})\n\nzoom_out.title=کوچک‌نمایی\nzoom_out_label=کوچک‌نمایی\nzoom_in.title=بزرگ‌نمایی\nzoom_in_label=بزرگ‌نمایی\nzoom.title=زوم\npresentation_mode.title=تغییر به حالت ارائه\npresentation_mode_label=حالت ارائه\nopen_file.title=باز کردن پرونده\nopen_file_label=باز کردن\nprint.title=چاپ\nprint_label=چاپ\ndownload.title=بارگیری\ndownload_label=بارگیری\nbookmark.title=نمای فعلی (رونوشت و یا نشان دادن در پنجره جدید)\nbookmark_label=نمای فعلی\n\n# Secondary toolbar and context menu\ntools.title=ابزارها\ntools_label=ابزارها\nfirst_page.title=برو به اولین صفحه\nfirst_page.label=برو یه اولین صفحه\nfirst_page_label=برو به اولین صفحه\nlast_page.title=برو به آخرین صفحه\nlast_page.label=برو به آخرین صفحه\nlast_page_label=برو به آخرین صفحه\npage_rotate_cw.title=چرخش ساعتگرد\npage_rotate_cw.label=چرخش ساعتگرد\npage_rotate_cw_label=چرخش ساعتگرد\npage_rotate_ccw.title=چرخش پاد ساعتگرد\npage_rotate_ccw.label=چرخش پاد ساعتگرد\npage_rotate_ccw_label=چرخش پاد ساعتگرد\n\ncursor_text_select_tool.title=فعال کردن ابزارِ انتخابِ متن\ncursor_text_select_tool_label=ابزارِ انتخابِ متن\ncursor_hand_tool.title=فعال کردن ابزارِ دست\ncursor_hand_tool_label=ابزار دست\n\n# Document properties dialog box\ndocument_properties.title=خصوصیات سند...\ndocument_properties_label=خصوصیات سند...\ndocument_properties_file_name=نام فایل:\ndocument_properties_file_size=حجم پرونده:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} کیلوبایت ({{size_b}} بایت)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} مگابایت ({{size_b}} بایت)\ndocument_properties_title=عنوان:\ndocument_properties_author=نویسنده:\ndocument_properties_subject=موضوع:\ndocument_properties_keywords=کلیدواژه‌ها:\ndocument_properties_creation_date=تاریخ ایجاد:\ndocument_properties_modification_date=تاریخ ویرایش:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}، {{time}}\ndocument_properties_creator=ایجاد کننده:\ndocument_properties_producer=ایجاد کننده PDF:\ndocument_properties_version=نسخه PDF:\ndocument_properties_page_count=تعداد صفحات:\ndocument_properties_close=بستن\n\nprint_progress_message=آماده سازی مدارک برای چاپ کردن…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=لغو\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=باز و بسته کردن نوار کناری\ntoggle_sidebar_notification.title=تغییر وضعیت نوار کناری (سند حاوی طرح/پیوست است)\ntoggle_sidebar_label=تغییرحالت نوارکناری\ndocument_outline.title=نمایش رئوس مطالب مدارک(برای بازشدن/جمع شدن همه موارد دوبار کلیک کنید)\ndocument_outline_label=طرح نوشتار\nattachments.title=نمایش پیوست‌ها\nattachments_label=پیوست‌ها\nthumbs.title=نمایش تصاویر بندانگشتی\nthumbs_label=تصاویر بندانگشتی\nfindbar.title=جستجو در سند\nfindbar_label=پیدا کردن\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=صفحه {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=تصویر بند‌ انگشتی صفحه {{page}}\n\n# Find panel button title and messages\nfind_input.title=پیدا کردن\nfind_input.placeholder=پیدا کردن در سند…\nfind_previous.title=پیدا کردن رخداد قبلی عبارت\nfind_previous_label=قبلی\nfind_next.title=پیدا کردن رخداد بعدی عبارت\nfind_next_label=بعدی\nfind_highlight=برجسته و هایلایت کردن همه موارد\nfind_match_case_label=تطبیق کوچکی و بزرگی حروف\nfind_reached_top=به بالای صفحه رسیدیم، از پایین ادامه می‌دهیم\nfind_reached_bottom=به آخر صفحه رسیدیم، از بالا ادامه می‌دهیم\nfind_not_found=عبارت پیدا نشد\n\n# Error panel labels\nerror_more_info=اطلاعات بیشتر\nerror_less_info=اطلاعات کمتر\nerror_close=بستن\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=‏PDF.js ورژن{{version}} ‏(ساخت: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=پیام: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=توده: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=پرونده: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=سطر: {{line}}\nrendering_error=هنگام بارگیری صفحه خطایی رخ داد.\n\n# Predefined zoom values\npage_scale_width=عرض صفحه\npage_scale_fit=اندازه کردن صفحه\npage_scale_auto=بزرگنمایی خودکار\npage_scale_actual=اندازه واقعی‌\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=خطا\nloading_error=هنگام بارگیری پرونده PDF خطایی رخ داد.\ninvalid_file_error=پرونده PDF نامعتبر یامعیوب می‌باشد.\nmissing_file_error=پرونده PDF یافت نشد.\nunexpected_response_error=پاسخ پیش بینی نشده سرور\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=جهت باز کردن پرونده PDF گذرواژه را وارد نمائید.\npassword_invalid=گذرواژه نامعتبر. لطفا مجددا تلاش کنید.\npassword_ok=تأیید\npassword_cancel=لغو\n\nprinting_not_supported=هشدار: قابلیت چاپ به‌طور کامل در این مرورگر پشتیبانی نمی‌شود.\nprinting_not_ready=اخطار: پرونده PDF بطور کامل بارگیری نشده و امکان چاپ وجود ندارد.\nweb_fonts_disabled=فونت های تحت وب غیر فعال شده اند: امکان استفاده از نمایش دهنده داخلی PDF وجود ندارد.\ndocument_colors_not_allowed=فایلهای PDF اجازه ندارند تا از رنگ‌های خود استفاده کنند: گزینه «به صفحات اجازه بده تا از رنگ‌های خود استفاده کنند» در مرورگر غیر فعال است.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ff/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Hello Ɓennungo\nprevious_label=Ɓennuɗo\nnext.title=Hello faango\nnext_label=Yeeso\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Hello\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=e nder {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=Lonngo Woɗɗa\nzoom_out_label=Lonngo Woɗɗa\nzoom_in.title=Lonngo Ara\nzoom_in_label=Lonngo Ara\nzoom.title=Lonngo\npresentation_mode.title=Faytu to  Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Uddit Fiilde\nopen_file_label=Uddit\nprint.title=Winndito\nprint_label=Winndito\ndownload.title=Aawto\ndownload_label=Aawto\nbookmark.title=Jiytol gonangol (natto walla uddit e henorde)\nbookmark_label=Jiytol Gonangol\n\n# Secondary toolbar and context menu\ntools.title=Kuutorɗe\ntools_label=Kuutorɗe\nfirst_page.title=Yah to hello adanngo\nfirst_page.label=Yah to hello adanngo\nfirst_page_label=Yah to hello adanngo\nlast_page.title=Yah to hello wattindiingo\nlast_page.label=Yah to hello wattindiingo\nlast_page_label=Yah to hello wattindiingo\npage_rotate_cw.title=Yiiltu Faya Ñaamo\npage_rotate_cw.label=Yiiltu Faya Ñaamo\npage_rotate_cw_label=Yiiltu Faya Ñaamo\npage_rotate_ccw.title=Yiiltu Faya Nano\npage_rotate_ccw.label=Yiiltu Faya Nano\npage_rotate_ccw_label=Yiiltu Faya Nano\n\ncursor_text_select_tool.title=Gollin kaɓirgel cuɓirgel binndi\ncursor_text_select_tool_label=Kaɓirgel cuɓirgel binndi\ncursor_hand_tool.title=Hurmin kuutorgal junngo\ncursor_hand_tool_label=Kaɓirgel junngo\n\n# Document properties dialog box\ndocument_properties.title=Keeroraaɗi Winndannde…\ndocument_properties_label=Keeroraaɗi Winndannde…\ndocument_properties_file_name=Innde fiilde:\ndocument_properties_file_size=Ɓetol fiilde:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bite)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bite)\ndocument_properties_title=Tiitoonde:\ndocument_properties_author=Binnduɗo:\ndocument_properties_subject=Toɓɓere:\ndocument_properties_keywords=Kelmekele jiytirɗe:\ndocument_properties_creation_date=Ñalnde Sosaa:\ndocument_properties_modification_date=Ñalnde Waylaa:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Cosɗo:\ndocument_properties_producer=Paggiiɗo PDF:\ndocument_properties_version=Yamre PDF:\ndocument_properties_page_count=Limoore Kelle:\ndocument_properties_close=Uddu\n\nprint_progress_message=Nana heboo winnditaade fiilannde…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Haaytu\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggilo Palal Sawndo\ntoggle_sidebar_notification.title=Palal sawndo (dokimaa oo ina waɗi taarngo/cinnde)\ntoggle_sidebar_label=Toggilo Palal Sawndo\ndocument_outline.title=Hollu Ƴiyal Fiilannde (dobdobo ngam wertude/taggude teme fof)\ndocument_outline_label=Toɓɓe Fiilannde\nattachments.title=Hollu Ɗisanɗe\nattachments_label=Ɗisanɗe\nthumbs.title=Hollu Dooɓe\nthumbs_label=Dooɓe\nfindbar.title=Yiylo e fiilannde\nfindbar_label=Yiytu\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Hello {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Dooɓre Hello {{page}}\n\n# Find panel button title and messages\nfind_input.title=Yiytu\nfind_input.placeholder=Yiylo nder dokimaa\nfind_previous.title=Yiylo cilol ɓennugol konngol ngol\nfind_previous_label=Ɓennuɗo\nfind_next.title=Yiylo cilol garowol konngol ngol\nfind_next_label=Yeeso\nfind_highlight=Jalbin fof\nfind_match_case_label=Jaaɓnu darnde\nfind_reached_top=Heɓii fuɗɗorde fiilannde, jokku faya les\nfind_reached_bottom=Heɓii hoore fiilannde, jokku faya les\nfind_not_found=Konngi njiyataa\n\n# Error panel labels\nerror_more_info=Ɓeydu Humpito\nerror_less_info=Ustu Humpito\nerror_close=Uddu\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Ɓatakuure: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fiilde: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Gorol: {{line}}\nrendering_error=Juumre waɗii tuma nde yoŋkittoo hello.\n\n# Predefined zoom values\npage_scale_width=Njaajeendi Hello\npage_scale_fit=Keƴeendi Hello\npage_scale_auto=Loongorde Jaajol\npage_scale_actual=Ɓetol Jaati\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Juumre\nloading_error=Juumre waɗii tuma nde loowata PDF oo.\ninvalid_file_error=Fiilde PDF moƴƴaani walla jiibii.\nmissing_file_error=Fiilde PDF ena ŋakki.\nunexpected_response_error=Jaabtol sarworde tijjinooka.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Siiftannde]\npassword_label=Naatu finnde ngam uddite ndee fiilde PDF.\npassword_invalid=Finnde moƴƴaani. Tiiɗno eto kadi.\npassword_ok=OK\npassword_cancel=Haaytu\n\nprinting_not_supported=Reentino: Winnditagol tammbitaaka no feewi e ndee wanngorde.\nprinting_not_ready=Reentino: PDF oo loowaaki haa timmi ngam winnditagol.\nweb_fonts_disabled=Ponte geese ko daaƴaaɗe: horiima huutoraade ponte PDF coomtoraaɗe.\ndocument_colors_not_allowed=Piilanɗe PDF njamiraaka yoo kuutoro goobuuji mum'en keeriiɗi: 'Yamir kello yoo kuutoro goobuuki keeriiɗi' koko daaƴaa e wanngorde ndee.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/fi/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Edellinen sivu\nprevious_label=Edellinen\nnext.title=Seuraava sivu\nnext_label=Seuraava\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Sivu\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=Loitonna\nzoom_out_label=Loitonna\nzoom_in.title=Lähennä\nzoom_in_label=Lähennä\nzoom.title=Suurennus\npresentation_mode.title=Siirry esitystilaan\npresentation_mode_label=Esitystila\nopen_file.title=Avaa tiedosto\nopen_file_label=Avaa\nprint.title=Tulosta\nprint_label=Tulosta\ndownload.title=Lataa\ndownload_label=Lataa\nbookmark.title=Avoin ikkuna (kopioi tai avaa uuteen ikkunaan)\nbookmark_label=Avoin ikkuna\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Siirry ensimmäiselle sivulle\nfirst_page.label=Siirry ensimmäiselle sivulle\nfirst_page_label=Siirry ensimmäiselle sivulle\nlast_page.title=Siirry viimeiselle sivulle\nlast_page.label=Siirry viimeiselle sivulle\nlast_page_label=Siirry viimeiselle sivulle\npage_rotate_cw.title=Kierrä oikealle\npage_rotate_cw.label=Kierrä oikealle\npage_rotate_cw_label=Kierrä oikealle\npage_rotate_ccw.title=Kierrä vasemmalle\npage_rotate_ccw.label=Kierrä vasemmalle\npage_rotate_ccw_label=Kierrä vasemmalle\n\ncursor_text_select_tool.title=Käytä tekstinvalintatyökalua\ncursor_text_select_tool_label=Tekstinvalintatyökalu\ncursor_hand_tool.title=Käytä käsityökalua\ncursor_hand_tool_label=Käsityökalu\n\n# Document properties dialog box\ndocument_properties.title=Dokumentin ominaisuudet…\ndocument_properties_label=Dokumentin ominaisuudet…\ndocument_properties_file_name=Tiedostonimi:\ndocument_properties_file_size=Tiedoston koko:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kt ({{size_b}} tavua)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} Mt ({{size_b}} tavua)\ndocument_properties_title=Otsikko:\ndocument_properties_author=Tekijä:\ndocument_properties_subject=Aihe:\ndocument_properties_keywords=Avainsanat:\ndocument_properties_creation_date=Luomispäivämäärä:\ndocument_properties_modification_date=Muokkauspäivämäärä:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Luoja:\ndocument_properties_producer=PDF-tuottaja:\ndocument_properties_version=PDF-versio:\ndocument_properties_page_count=Sivujen määrä:\ndocument_properties_close=Sulje\n\nprint_progress_message=Valmistellaan dokumenttia tulostamista varten…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}} %\nprint_progress_close=Peruuta\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Näytä/piilota sivupaneeli\ntoggle_sidebar_notification.title=Näytä/piilota sivupaneeli (dokumentissa on sisällys tai liitteitä)\ntoggle_sidebar_label=Näytä/piilota sivupaneeli\ndocument_outline.title=Näytä dokumentin sisällys (laajenna tai kutista kohdat kaksoisnapsauttamalla)\ndocument_outline_label=Dokumentin sisällys\nattachments.title=Näytä liitteet\nattachments_label=Liitteet\nthumbs.title=Näytä pienoiskuvat\nthumbs_label=Pienoiskuvat\nfindbar.title=Etsi dokumentista\nfindbar_label=Etsi\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Sivu {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Pienoiskuva sivusta {{page}}\n\n# Find panel button title and messages\nfind_input.title=Etsi\nfind_input.placeholder=Etsi dokumentista…\nfind_previous.title=Etsi hakusanan edellinen osuma\nfind_previous_label=Edellinen\nfind_next.title=Etsi hakusanan seuraava osuma\nfind_next_label=Seuraava\nfind_highlight=Korosta kaikki\nfind_match_case_label=Huomioi kirjainkoko\nfind_reached_top=Päästiin dokumentin alkuun, jatketaan lopusta\nfind_reached_bottom=Päästiin dokumentin loppuun, continued from top\nfind_not_found=Hakusanaa ei löytynyt\n\n# Error panel labels\nerror_more_info=Lisätietoja\nerror_less_info=Lisätietoja\nerror_close=Sulje\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (kooste: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Virheilmoitus: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pino: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Tiedosto: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rivi: {{line}}\nrendering_error=Tapahtui virhe piirrettäessä sivua.\n\n# Predefined zoom values\npage_scale_width=Sivun leveys\npage_scale_fit=Koko sivu\npage_scale_auto=Automaattinen suurennus\npage_scale_actual=Todellinen koko\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}} %\n\n# Loading indicator messages\nloading_error_indicator=Virhe\nloading_error=Tapahtui virhe ladattaessa PDF-tiedostoa.\ninvalid_file_error=Virheellinen tai vioittunut PDF-tiedosto.\nmissing_file_error=Puuttuva PDF-tiedosto.\nunexpected_response_error=Odottamaton vastaus palvelimelta.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Kirjoita PDF-tiedoston salasana.\npassword_invalid=Virheellinen salasana. Yritä uudestaan.\npassword_ok=OK\npassword_cancel=Peruuta\n\nprinting_not_supported=Varoitus: Selain ei tue kaikkia tulostustapoja.\nprinting_not_ready=Varoitus: PDF-tiedosto ei ole vielä latautunut kokonaan, eikä sitä voi vielä tulostaa.\nweb_fonts_disabled=Verkkosivujen omat kirjasinlajit on estetty: ei voida käyttää upotettuja PDF-kirjasinlajeja.\ndocument_colors_not_allowed=PDF-dokumenttien ei ole sallittua käyttää omia värejään: Asetusta ”Sivut saavat käyttää omia värejään oletusten sijaan” ei ole valittu selaimen asetuksissa.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/fr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Page précédente\nprevious_label=Précédent\nnext.title=Page suivante\nnext_label=Suivant\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Page\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=sur {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} sur {{pagesCount}})\n\nzoom_out.title=Zoom arrière\nzoom_out_label=Zoom arrière\nzoom_in.title=Zoom avant\nzoom_in_label=Zoom avant\nzoom.title=Zoom\npresentation_mode.title=Basculer en mode présentation\npresentation_mode_label=Mode présentation\nopen_file.title=Ouvrir le fichier\nopen_file_label=Ouvrir le fichier\nprint.title=Imprimer\nprint_label=Imprimer\ndownload.title=Télécharger\ndownload_label=Télécharger\nbookmark.title=Affichage courant (copier ou ouvrir dans une nouvelle fenêtre)\nbookmark_label=Affichage actuel\n\n# Secondary toolbar and context menu\ntools.title=Outils\ntools_label=Outils\nfirst_page.title=Aller à la première page\nfirst_page.label=Aller à la première page\nfirst_page_label=Aller à la première page\nlast_page.title=Aller à la dernière page\nlast_page.label=Aller à la dernière page\nlast_page_label=Aller à la dernière page\npage_rotate_cw.title=Rotation horaire\npage_rotate_cw.label=Rotation horaire\npage_rotate_cw_label=Rotation horaire\npage_rotate_ccw.title=Rotation anti-horaire\npage_rotate_ccw.label=Rotation anti-horaire\npage_rotate_ccw_label=Rotation anti-horaire\n\ncursor_text_select_tool.title=Activer l’outil de sélection de texte\ncursor_text_select_tool_label=Outil de sélection de texte\ncursor_hand_tool.title=Activer l’outil main\ncursor_hand_tool_label=Outil main\n\n# Document properties dialog box\ndocument_properties.title=Propriétés du document…\ndocument_properties_label=Propriétés du document…\ndocument_properties_file_name=Nom du fichier :\ndocument_properties_file_size=Taille du fichier :\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} Ko ({{size_b}} octets)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} Mo ({{size_b}} octets)\ndocument_properties_title=Titre :\ndocument_properties_author=Auteur :\ndocument_properties_subject=Sujet :\ndocument_properties_keywords=Mots-clés :\ndocument_properties_creation_date=Date de création :\ndocument_properties_modification_date=Modifié le :\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}} à {{time}}\ndocument_properties_creator=Créé par :\ndocument_properties_producer=Outil de conversion PDF :\ndocument_properties_version=Version PDF :\ndocument_properties_page_count=Nombre de pages :\ndocument_properties_close=Fermer\n\nprint_progress_message=Préparation du document pour l’impression…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}} %\nprint_progress_close=Annuler\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Afficher/Masquer le panneau latéral\ntoggle_sidebar_notification.title=Afficher/Masquer le panneau latéral (le document contient des signets/pièces jointes)\ntoggle_sidebar_label=Afficher/Masquer le panneau latéral\ndocument_outline.title=Afficher les signets du document (double-cliquer pour développer/réduire tous les éléments)\ndocument_outline_label=Signets du document\nattachments.title=Afficher les pièces jointes\nattachments_label=Pièces jointes\nthumbs.title=Afficher les vignettes\nthumbs_label=Vignettes\nfindbar.title=Rechercher dans le document\nfindbar_label=Rechercher\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Vignette de la page {{page}}\n\n# Find panel button title and messages\nfind_input.title=Rechercher\nfind_input.placeholder=Rechercher dans le document…\nfind_previous.title=Trouver l’occurrence précédente de la phrase\nfind_previous_label=Précédent\nfind_next.title=Trouver la prochaine occurrence de la phrase\nfind_next_label=Suivant\nfind_highlight=Tout surligner\nfind_match_case_label=Respecter la casse\nfind_reached_top=Haut de la page atteint, poursuite depuis la fin\nfind_reached_bottom=Bas de la page atteint, poursuite au début\nfind_not_found=Phrase introuvable\n\n# Error panel labels\nerror_more_info=Plus d’informations\nerror_less_info=Moins d’informations\nerror_close=Fermer\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (identifiant de compilation : {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message : {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pile : {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fichier : {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Ligne : {{line}}\nrendering_error=Une erreur s’est produite lors de l’affichage de la page.\n\n# Predefined zoom values\npage_scale_width=Pleine largeur\npage_scale_fit=Page entière\npage_scale_auto=Zoom automatique\npage_scale_actual=Taille réelle\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}} %\n\n# Loading indicator messages\nloading_error_indicator=Erreur\nloading_error=Une erreur s’est produite lors du chargement du fichier PDF.\ninvalid_file_error=Fichier PDF invalide ou corrompu.\nmissing_file_error=Fichier PDF manquant.\nunexpected_response_error=Réponse inattendue du serveur.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Annotation {{type}}]\npassword_label=Veuillez saisir le mot de passe pour ouvrir ce fichier PDF.\npassword_invalid=Mot de passe incorrect. Veuillez réessayer.\npassword_ok=OK\npassword_cancel=Annuler\n\nprinting_not_supported=Attention : l’impression n’est pas totalement prise en charge par ce navigateur.\nprinting_not_ready=Attention : le PDF n’est pas entièrement chargé pour pouvoir l’imprimer.\nweb_fonts_disabled=Les polices web sont désactivées : impossible d’utiliser les polices intégrées au PDF.\ndocument_colors_not_allowed=Les documents PDF ne peuvent pas utiliser leurs propres couleurs : « Autoriser les pages web à utiliser leurs propres couleurs » est désactivé dans le navigateur.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/fy-NL/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Foarige side\nprevious_label=Foarige\nnext.title=Folgjende side\nnext_label=Folgjende\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Side\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=fa {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} fan {{pagesCount}})\n\nzoom_out.title=Utzoome\nzoom_out_label=Utzoome\nzoom_in.title=Ynzoome\nzoom_in_label=Ynzoome\nzoom.title=Zoome\npresentation_mode.title=Wikselje nei presintaasjemodus\npresentation_mode_label=Presintaasjemodus\nopen_file.title=Bestân iepenje\nopen_file_label=Iepenje\nprint.title=Ofdrukke\nprint_label=Ofdrukke\ndownload.title=Downloade\ndownload_label=Downloade\nbookmark.title=Aktuele finster (kopiearje of iepenje yn nij finster)\nbookmark_label=Aktuele finster\n\n# Secondary toolbar and context menu\ntools.title=Ark\ntools_label=Ark\nfirst_page.title=Gean nei earste side\nfirst_page.label=Nei earste side gean\nfirst_page_label=Gean nei earste side\nlast_page.title=Gean nei lêste side\nlast_page.label=Nei lêste side gean\nlast_page_label=Gean nei lêste side\npage_rotate_cw.title=Rjochtsom draaie\npage_rotate_cw.label=Rjochtsom draaie\npage_rotate_cw_label=Rjochtsom draaie\npage_rotate_ccw.title=Loftsom draaie\npage_rotate_ccw.label=Loftsom draaie\npage_rotate_ccw_label=Loftsom draaie\n\ncursor_text_select_tool.title=Tekstseleksjehelpmiddel ynskeakelje\ncursor_text_select_tool_label=Tekstseleksjehelpmiddel\ncursor_hand_tool.title=Hânhelpmiddel ynskeakelje\ncursor_hand_tool_label=Hânhelpmiddel\n\n# Document properties dialog box\ndocument_properties.title=Dokuminteigenskippen…\ndocument_properties_label=Dokuminteigenskippen…\ndocument_properties_file_name=Bestânsnamme:\ndocument_properties_file_size=Bestânsgrutte:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Auteur:\ndocument_properties_subject=Underwerp:\ndocument_properties_keywords=Kaaiwurden:\ndocument_properties_creation_date=Oanmaakdatum:\ndocument_properties_modification_date=Bewurkingsdatum:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Makker:\ndocument_properties_producer=PDF-makker:\ndocument_properties_version=PDF-ferzje:\ndocument_properties_page_count=Siden:\ndocument_properties_close=Slute\n\nprint_progress_message=Dokumint tariede oar ôfdrukken…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Annulearje\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Sidebalke yn-/útskeakelje\ntoggle_sidebar_notification.title=Sidebalke yn-/útskeakelje (dokumint befettet outline/bylagen)\ntoggle_sidebar_label=Sidebalke yn-/útskeakelje\ndocument_outline.title=Dokumintoersjoch toane (dûbelklik om alle items út/yn te klappen)\ndocument_outline_label=Dokumintoersjoch\nattachments.title=Bylagen toane\nattachments_label=Bylagen\nthumbs.title=Foarbylden toane\nthumbs_label=Foarbylden\nfindbar.title=Sykje yn dokumint\nfindbar_label=Sykje\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Side {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Foarbyld fan side {{page}}\n\n# Find panel button title and messages\nfind_input.title=Sykje\nfind_input.placeholder=Sykje yn dokumint…\nfind_previous.title=It foarige foarkommen fan de tekst sykje\nfind_previous_label=Foarige\nfind_next.title=It folgjende foarkommen fan de tekst sykje\nfind_next_label=Folgjende\nfind_highlight=Alles markearje\nfind_match_case_label=Haadlettergefoelich\nfind_reached_top=Boppekant fan dokumint berikt, trochgien fan ûnder ôf\nfind_reached_bottom=Ein fan dokumint berikt, trochgien fan boppe ôf\nfind_not_found=Tekst net fûn\n\n# Error panel labels\nerror_more_info=Mear ynformaasje\nerror_less_info=Minder ynformaasje\nerror_close=Slute\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js f{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Berjocht: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Bestân: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rigel: {{line}}\nrendering_error=Der is in flater bard by it renderjen fan de side.\n\n# Predefined zoom values\npage_scale_width=Sidebreedte\npage_scale_fit=Hiele side\npage_scale_auto=Automatysk zoome\npage_scale_actual=Werklike grutte\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Flater\nloading_error=Der is in flater bard by it laden fan de PDF.\ninvalid_file_error=Ynfalide of korruptearre PDF-bestân.\nmissing_file_error=PDF-bestân ûntbrekt.\nunexpected_response_error=Unferwacht serverantwurd.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-annotaasje]\npassword_label=Jou it wachtwurd om dit PDF-bestân te iepenjen.\npassword_invalid=Ferkeard wachtwurd. Probearje opnij.\npassword_ok=OK\npassword_cancel=Annulearje\n\nprinting_not_supported=Warning: Printen is net folslein stipe troch dizze browser.\nprinting_not_ready=Warning: PDF is net folslein laden om ôf te drukken.\nweb_fonts_disabled=Weblettertypen binne útskeakele: gebrûk fan ynsluten PDF-lettertypen is net mooglik.\ndocument_colors_not_allowed=PDF-dokuminten meie harren eigen kleuren net brûke: ‘Siden tastean om harren eigen kleuren te kiezen’ is útskeakele yn de browser.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ga-IE/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=An Leathanach Roimhe Seo\nprevious_label=Roimhe Seo\nnext.title=An Chéad Leathanach Eile\nnext_label=Ar Aghaidh\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Leathanach\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=as {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} as {{pagesCount}})\n\nzoom_out.title=Súmáil Amach\nzoom_out_label=Súmáil Amach\nzoom_in.title=Súmáil Isteach\nzoom_in_label=Súmáil Isteach\nzoom.title=Súmáil\npresentation_mode.title=Úsáid an Mód Láithreoireachta\npresentation_mode_label=Mód Láithreoireachta\nopen_file.title=Oscail Comhad\nopen_file_label=Oscail\nprint.title=Priontáil\nprint_label=Priontáil\ndownload.title=Íoslódáil\ndownload_label=Íoslódáil\nbookmark.title=An t-amharc reatha (cóipeáil nó oscail i bhfuinneog nua)\nbookmark_label=An tAmharc Reatha\n\n# Secondary toolbar and context menu\ntools.title=Uirlisí\ntools_label=Uirlisí\nfirst_page.title=Go dtí an chéad leathanach\nfirst_page.label=Go dtí an chéad leathanach\nfirst_page_label=Go dtí an chéad leathanach\nlast_page.title=Go dtí an leathanach deiridh\nlast_page.label=Go dtí an leathanach deiridh\nlast_page_label=Go dtí an leathanach deiridh\npage_rotate_cw.title=Rothlaigh ar deiseal\npage_rotate_cw.label=Rothlaigh ar deiseal\npage_rotate_cw_label=Rothlaigh ar deiseal\npage_rotate_ccw.title=Rothlaigh ar tuathal\npage_rotate_ccw.label=Rothlaigh ar tuathal\npage_rotate_ccw_label=Rothlaigh ar tuathal\n\ncursor_text_select_tool.title=Cumasaigh an Uirlis Roghnaithe Téacs\ncursor_text_select_tool_label=Uirlis Roghnaithe Téacs\ncursor_hand_tool.title=Cumasaigh an Uirlis Láimhe\ncursor_hand_tool_label=Uirlis Láimhe\n\n# Document properties dialog box\ndocument_properties.title=Airíonna na Cáipéise…\ndocument_properties_label=Airíonna na Cáipéise…\ndocument_properties_file_name=Ainm an chomhaid:\ndocument_properties_file_size=Méid an chomhaid:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kB ({{size_b}} beart)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} beart)\ndocument_properties_title=Teideal:\ndocument_properties_author=Údar:\ndocument_properties_subject=Ábhar:\ndocument_properties_keywords=Eochairfhocail:\ndocument_properties_creation_date=Dáta Cruthaithe:\ndocument_properties_modification_date=Dáta Athraithe:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Cruthaitheoir:\ndocument_properties_producer=Cruthaitheoir an PDF:\ndocument_properties_version=Leagan PDF:\ndocument_properties_page_count=Líon Leathanach:\ndocument_properties_close=Dún\n\nprint_progress_message=Cáipéis á hullmhú le priontáil…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cealaigh\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Scoránaigh an Barra Taoibh\ntoggle_sidebar_notification.title=Scoránaigh an Barra Taoibh (achoimre/iatáin sa cháipéis)\ntoggle_sidebar_label=Scoránaigh an Barra Taoibh\ndocument_outline.title=Taispeáin Imlíne na Cáipéise (déchliceáil chun chuile rud a leathnú nó a laghdú)\ndocument_outline_label=Creatlach na Cáipéise\nattachments.title=Taispeáin Iatáin\nattachments_label=Iatáin\nthumbs.title=Taispeáin Mionsamhlacha\nthumbs_label=Mionsamhlacha\nfindbar.title=Aimsigh sa Cháipéis\nfindbar_label=Aimsigh\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Leathanach {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Mionsamhail Leathanaigh {{page}}\n\n# Find panel button title and messages\nfind_input.title=Aimsigh\nfind_input.placeholder=Aimsigh sa cháipéis…\nfind_previous.title=Aimsigh an sampla roimhe seo den nath seo\nfind_previous_label=Roimhe seo\nfind_next.title=Aimsigh an chéad sampla eile den nath sin\nfind_next_label=Ar aghaidh\nfind_highlight=Aibhsigh uile\nfind_match_case_label=Cásíogair\nfind_reached_top=Ag barr na cáipéise, ag leanúint ón mbun\nfind_reached_bottom=Ag bun na cáipéise, ag leanúint ón mbarr\nfind_not_found=Frása gan aimsiú\n\n# Error panel labels\nerror_more_info=Tuilleadh Eolais\nerror_less_info=Níos Lú Eolais\nerror_close=Dún\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Teachtaireacht: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Cruach: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Comhad: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Líne: {{line}}\nrendering_error=Tharla earráid agus an leathanach á leagan amach.\n\n# Predefined zoom values\npage_scale_width=Leithead Leathanaigh\npage_scale_fit=Laghdaigh go dtí an Leathanach\npage_scale_auto=Súmáil Uathoibríoch\npage_scale_actual=Fíormhéid\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Earráid\nloading_error=Tharla earráid agus an cháipéis PDF á lódáil.\ninvalid_file_error=Comhad neamhbhailí nó truaillithe PDF.\nmissing_file_error=Comhad PDF ar iarraidh.\nunexpected_response_error=Freagra ón bhfreastalaí nach rabhthas ag súil leis.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anótáil {{type}}]\npassword_label=Cuir an focal faire isteach chun an comhad PDF seo a oscailt.\npassword_invalid=Focal faire mícheart. Déan iarracht eile.\npassword_ok=OK\npassword_cancel=Cealaigh\n\nprinting_not_supported=Rabhadh: Ní thacaíonn an brabhsálaí le priontáil go hiomlán.\nprinting_not_ready=Rabhadh: Ní féidir an PDF a phriontáil go dtí go mbeidh an cháipéis iomlán lódáilte.\nweb_fonts_disabled=Tá clófhoirne Gréasáin díchumasaithe: ní féidir clófhoirne leabaithe PDF a úsáid.\ndocument_colors_not_allowed=Níl cead ag cáipéisí PDF a ndathanna féin a roghnú: tá “Tabhair cead do leathanaigh a ndathanna féin a roghnú” díchumasaithe sa mbrabhsálaí.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/gd/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=An duilleag roimhe\nprevious_label=Air ais\nnext.title=An ath-dhuilleag\nnext_label=Air adhart\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Duilleag\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=à {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} à {{pagesCount}})\n\nzoom_out.title=Sùm a-mach\nzoom_out_label=Sùm a-mach\nzoom_in.title=Sùm a-steach\nzoom_in_label=Sùm a-steach\nzoom.title=Sùm\npresentation_mode.title=Gearr leum dhan mhodh taisbeanaidh\npresentation_mode_label=Am modh taisbeanaidh\nopen_file.title=Fosgail faidhle\nopen_file_label=Fosgail\nprint.title=Clò-bhuail\nprint_label=Clò-bhuail\ndownload.title=Luchdaich a-nuas\ndownload_label=Luchdaich a-nuas\nbookmark.title=An sealladh làithreach (dèan lethbhreac no fosgail e ann an uinneag ùr)\nbookmark_label=An sealladh làithreach\n\n# Secondary toolbar and context menu\ntools.title=Innealan\ntools_label=Innealan\nfirst_page.title=Rach gun chiad duilleag\nfirst_page.label=Rach gun chiad duilleag\nfirst_page_label=Rach gun chiad duilleag\nlast_page.title=Rach gun duilleag mu dheireadh\nlast_page.label=Rach gun duilleag mu dheireadh\nlast_page_label=Rach gun duilleag mu dheireadh\npage_rotate_cw.title=Cuairtich gu deiseil\npage_rotate_cw.label=Cuairtich gu deiseil\npage_rotate_cw_label=Cuairtich gu deiseil\npage_rotate_ccw.title=Cuairtich gu tuathail\npage_rotate_ccw.label=Cuairtich gu tuathail\npage_rotate_ccw_label=Cuairtich gu tuathail\n\ncursor_text_select_tool.title=Cuir an comas inneal taghadh an teacsa\ncursor_text_select_tool_label=Inneal taghadh an teacsa\ncursor_hand_tool.title=Cuir inneal na làimhe an comas\ncursor_hand_tool_label=Inneal na làimhe\n\n# Document properties dialog box\ndocument_properties.title=Roghainnean na sgrìobhainne…\ndocument_properties_label=Roghainnean na sgrìobhainne…\ndocument_properties_file_name=Ainm an fhaidhle:\ndocument_properties_file_size=Meud an fhaidhle:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Tiotal:\ndocument_properties_author=Ùghdar:\ndocument_properties_subject=Cuspair:\ndocument_properties_keywords=Faclan-luirg:\ndocument_properties_creation_date=Latha a chruthachaidh:\ndocument_properties_modification_date=Latha atharrachaidh:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Cruthadair:\ndocument_properties_producer=Saothraiche a' PDF:\ndocument_properties_version=Tionndadh a' PDF:\ndocument_properties_page_count=Àireamh de dhuilleagan:\ndocument_properties_close=Dùin\n\nprint_progress_message=Ag ullachadh na sgrìobhainn airson clò-bhualadh…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Sguir dheth\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toglaich am bàr-taoibh\ntoggle_sidebar_notification.title=Toglaich am bàr-taoibh (tha oir-loidhne/ceanglachain aig an sgrìobhainn)\ntoggle_sidebar_label=Toglaich am bàr-taoibh\ndocument_outline.title=Seall oir-loidhne na sgrìobhainn (dèan briogadh dùbailte airson a h-uile nì a leudachadh/a cho-theannadh)\ndocument_outline_label=Oir-loidhne na sgrìobhainne\nattachments.title=Seall na ceanglachain\nattachments_label=Ceanglachain\nthumbs.title=Seall na dealbhagan\nthumbs_label=Dealbhagan\nfindbar.title=Lorg san sgrìobhainn\nfindbar_label=Lorg\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Duilleag a {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Dealbhag duilleag a {{page}}\n\n# Find panel button title and messages\nfind_input.title=Lorg\nfind_input.placeholder=Lorg san sgrìobhainn...\nfind_previous.title=Lorg làthair roimhe na h-abairt seo\nfind_previous_label=Air ais\nfind_next.title=Lorg ath-làthair na h-abairt seo\nfind_next_label=Air adhart\nfind_highlight=Soillsich a h-uile\nfind_match_case_label=Aire do litrichean mòra is beaga\nfind_reached_top=Ràinig sinn barr na duilleige, a' leantainn air adhart o bhonn na duilleige\nfind_reached_bottom=Ràinig sinn bonn na duilleige, a' leantainn air adhart o bharr na duilleige\nfind_not_found=Cha deach an abairt a lorg\n\n# Error panel labels\nerror_more_info=Barrachd fiosrachaidh\nerror_less_info=Nas lugha de dh'fhiosrachadh\nerror_close=Dùin\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Teachdaireachd: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stac: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Faidhle: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Loidhne: {{line}}\nrendering_error=Thachair mearachd rè reandaradh na duilleige.\n\n# Predefined zoom values\npage_scale_width=Leud na duilleige\npage_scale_fit=Freagair ri meud na duilleige\npage_scale_auto=Sùm fèin-obrachail\npage_scale_actual=Am fìor-mheud\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Mearachd\nloading_error=Thachair mearachd rè luchdadh a' PDF.\ninvalid_file_error=Faidhle PDF a tha mì-dhligheach no coirbte.\nmissing_file_error=Faidhle PDF a tha a dhìth.\nunexpected_response_error=Freagairt on fhrithealaiche ris nach robh dùil.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Nòtachadh {{type}}]\npassword_label=Cuir a-steach am facal-faire gus am faidhle PDF seo fhosgladh.\npassword_invalid=Tha am facal-faire cearr. Nach fheuch thu ris a-rithist?\npassword_ok=Ceart ma-tha\npassword_cancel=Sguir dheth\n\nprinting_not_supported=Rabhadh: Chan eil am brabhsair seo a' cur làn-taic ri clò-bhualadh.\nprinting_not_ready=Rabhadh: Cha deach am PDF a luchdadh gu tur airson clò-bhualadh.\nweb_fonts_disabled=Tha cruthan-clò lìn à comas: Chan urrainn dhuinn cruthan-clò PDF leabaichte a chleachdadh.\ndocument_colors_not_allowed=Chan fhaod sgrìobhainnean PDF na dathan aca fhèin a chleachdadh: Tha “Leig le duilleagan na dathan aca fhèin a chleachdadh” à comas sa bhrabhsair.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/gl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Páxina anterior\nprevious_label=Anterior\nnext.title=Seguinte páxina\nnext_label=Seguinte\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Reducir\nzoom_out_label=Reducir\nzoom_in.title=Ampliar\nzoom_in_label=Ampliar\nzoom.title=Zoom\npresentation_mode.title=Cambiar ao modo presentación\npresentation_mode_label=Modo presentación\nopen_file.title=Abrir ficheiro\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar ou abrir nunha nova xanela)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Ferramentas\ntools_label=Ferramentas\nfirst_page.title=Ir á primeira páxina\nfirst_page.label=Ir á primeira páxina\nfirst_page_label=Ir á primeira páxina\nlast_page.title=Ir á última páxina\nlast_page.label=Ir á última páxina\nlast_page_label=Ir á última páxina\npage_rotate_cw.title=Rotar no sentido das agullas do reloxo\npage_rotate_cw.label=Rotar no sentido das agullas do reloxo\npage_rotate_cw_label=Rotar no sentido das agullas do reloxo\npage_rotate_ccw.title=Rotar no sentido contrario ás agullas do reloxo\npage_rotate_ccw.label=Rotar no sentido contrario ás agullas do reloxo\npage_rotate_ccw_label=Rotar no sentido contrario ás agullas do reloxo\n\n\n# Document properties dialog box\ndocument_properties.title=Propiedades do documento…\ndocument_properties_label=Propiedades do documento…\ndocument_properties_file_name=Nome do ficheiro:\ndocument_properties_file_size=Tamaño do ficheiro:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asunto: \ndocument_properties_keywords=Palabras clave:\ndocument_properties_creation_date=Data de creación:\ndocument_properties_modification_date=Data de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creado por:\ndocument_properties_producer=Xenerador do PDF:\ndocument_properties_version=Versión de PDF:\ndocument_properties_page_count=Número de páxinas:\ndocument_properties_close=Pechar\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Amosar/agochar a barra lateral\ntoggle_sidebar_label=Amosar/agochar a barra lateral\nattachments.title=Amosar anexos\nattachments_label=Anexos\nthumbs.title=Amosar miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Atopar no documento\nfindbar_label=Atopar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Páxina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura da páxina {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Atopar a anterior aparición da frase\nfind_previous_label=Anterior\nfind_next.title=Atopar a seguinte aparición da frase\nfind_next_label=Seguinte\nfind_highlight=Realzar todo\nfind_match_case_label=Diferenciar maiúsculas de minúsculas\nfind_reached_top=Chegouse ao inicio do documento, continuar desde o final\nfind_reached_bottom=Chegouse ao final do documento, continuar desde o inicio\nfind_not_found=Non se atopou a frase\n\n# Error panel labels\nerror_more_info=Máis información\nerror_less_info=Menos información\nerror_close=Pechar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (Identificador da compilación: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaxe: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ficheiro: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Liña: {{line}}\nrendering_error=Produciuse un erro ao representar a páxina.\n\n# Predefined zoom values\npage_scale_width=Largura da páxina\npage_scale_fit=Axuste de páxina\npage_scale_auto=Zoom automático\npage_scale_actual=Tamaño actual\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Erro\nloading_error=Produciuse un erro ao cargar o PDF.\ninvalid_file_error=Ficheiro PDF danado ou incorrecto.\nmissing_file_error=Falta o ficheiro PDF.\nunexpected_response_error=Resposta inesperada do servidor.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotación {{type}}]\npassword_label=Escriba o contrasinal para abrir este ficheiro PDF.\npassword_invalid=Contrasinal incorrecto. Tente de novo.\npassword_ok=Aceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Aviso: A impresión non é compatíbel de todo con este navegador.\nprinting_not_ready=Aviso: O PDF non se cargou completamente para imprimirse.\nweb_fonts_disabled=Desactiváronse as fontes web:  foi imposíbel usar as fontes incrustadas no PDF.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/gu-IN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=પહેલાનુ પાનું\nprevious_label=પહેલાનુ\nnext.title=આગળનુ પાનું\nnext_label=આગળનું\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=મોટુ કરો\nzoom_out_label=મોટુ કરો\nzoom_in.title=નાનું કરો\nzoom_in_label=નાનું કરો\nzoom.title=નાનું મોટુ કરો\npresentation_mode.title=રજૂઆત સ્થિતિમાં જાવ\npresentation_mode_label=રજૂઆત સ્થિતિ\nopen_file.title=ફાઇલ ખોલો\nopen_file_label=ખોલો\nprint.title=છાપો\nprint_label=છારો\ndownload.title=ડાઉનલોડ\ndownload_label=ડાઉનલોડ\nbookmark.title=વર્તમાન દૃશ્ય (નવી વિન્ડોમાં નકલ કરો અથવા ખોલો)\nbookmark_label=વર્તમાન દૃશ્ય\n\n# Secondary toolbar and context menu\ntools.title=સાધનો\ntools_label=સાધનો\nfirst_page.label=પહેલાં પાનામાં જાવ\nfirst_page_label=પ્રથમ પાનાં પર જાવ\nlast_page.label=છેલ્લા પાનામાં જાવ\nlast_page_label=છેલ્લા પાનાં પર જાવ\npage_rotate_cw.label=ઘડિયાળનાં કાંટાની જેમ ફેરવો\npage_rotate_cw_label=ઘડિયાળનાં કાંટા તરફ ફેરવો\npage_rotate_ccw.label=ઘડિયાળનાં કાંટાની ઉલટી દિશામાં ફેરવો\npage_rotate_ccw_label=ઘડિયાળનાં કાંટાની વિરુદ્દ ફેરવો\n\n\n# Document properties dialog box\ndocument_properties.title=દસ્તાવેજ ગુણધર્મો…\ndocument_properties_label=દસ્તાવેજ ગુણધર્મો…\ndocument_properties_file_name=ફાઇલ નામ:\ndocument_properties_file_size=ફાઇલ માપ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} બાઇટ)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} બાઇટ)\ndocument_properties_title=શીર્ષક:\ndocument_properties_author=લેખક:\ndocument_properties_subject=વિષય:\ndocument_properties_keywords=કિવર્ડ:\ndocument_properties_creation_date=નિર્માણ તારીખ:\ndocument_properties_modification_date=ફેરફાર તારીખ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=નિર્માતા:\ndocument_properties_producer=PDF નિર્માતા:\ndocument_properties_version=PDF આવૃત્તિ:\ndocument_properties_page_count=પાનાં ગણતરી:\ndocument_properties_close=બંધ કરો\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ટૉગલ બાજુપટ્ટી\ntoggle_sidebar_label=ટૉગલ બાજુપટ્ટી\ndocument_outline_label=દસ્તાવેજ રૂપરેખા\nattachments.title=જોડાણોને બતાવો\nattachments_label=જોડાણો\nthumbs.title=થંબનેલ્સ બતાવો\nthumbs_label=થંબનેલ્સ\nfindbar.title=દસ્તાવેજમાં શોધો\nfindbar_label=શોધો\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=પાનું {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=પાનાં {{page}} નું થંબનેલ્સ\n\n# Find panel button title and messages\nfind_previous.title=શબ્દસમૂહની પાછલી ઘટનાને શોધો\nfind_previous_label=પહેલાંનુ\nfind_next.title=શબ્દસમૂહની આગળની ઘટનાને શોધો\nfind_next_label=આગળનું\nfind_highlight=બધુ પ્રકાશિત કરો\nfind_match_case_label=કેસ બંધબેસાડો\nfind_reached_top=દસ્તાવેજનાં ટોચે પહોંચી ગયા, તળિયેથી ચાલુ કરેલ હતુ\nfind_reached_bottom=દસ્તાવેજનાં અંતે પહોંચી ગયા, ઉપરથી ચાલુ કરેલ હતુ\nfind_not_found=શબ્દસમૂહ મળ્યુ નથી\n\n# Error panel labels\nerror_more_info=વધારે જાણકારી\nerror_less_info=ઓછી જાણકારી\nerror_close=બંધ કરો\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=સંદેશો: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=સ્ટેક: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ફાઇલ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=વાક્ય: {{line}}\nrendering_error=ભૂલ ઉદ્ભવી જ્યારે પાનાંનુ રેન્ડ કરી રહ્યા હોય.\n\n# Predefined zoom values\npage_scale_width=પાનાની પહોળાઇ\npage_scale_fit=પાનું બંધબેસતુ\npage_scale_auto=આપમેળે નાનુંમોટુ કરો\npage_scale_actual=ચોક્કસ માપ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=ભૂલ\nloading_error=ભૂલ ઉદ્ભવી જ્યારે PDF ને લાવી રહ્યા હોય.\ninvalid_file_error=અયોગ્ય અથવા ભાંગેલ PDF ફાઇલ.\nmissing_file_error=ગુમ થયેલ PDF ફાઇલ.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=આ PDF ફાઇલને ખોલવા પાસવર્ડને દાખલ કરો.\npassword_invalid=અયોગ્ય પાસવર્ડ. મહેરબાની કરીને ફરી પ્રયત્ન કરો.\npassword_ok=બરાબર\n\nprinting_not_supported=ચેતવણી: છાપવાનું આ બ્રાઉઝર દ્દારા સંપૂર્ણપણે આધારભૂત નથી.\nprinting_not_ready=Warning: PDF એ છાપવા માટે સંપૂર્ણપણે લાવેલ છે.\nweb_fonts_disabled=વેબ ફોન્ટ નિષ્ક્રિય થયેલ છે: ઍમ્બેડ થયેલ PDF ફોન્ટને વાપરવાનું અસમર્થ.\ndocument_colors_not_allowed=PDF દસ્તાવેજો તેનાં પોતાના રંગોને વાપરવા પરવાનગી આપતા નથી: 'તેનાં પોતાનાં રંગોને પસંદ કરવા માટે પાનાંને પરવાનગી આપો' બ્રાઉઝરમાં નિષ્ક્રિય થયેલ છે.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/he/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=דף קודם\nprevious_label=קודם\nnext.title=דף הבא\nnext_label=הבא\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=דף\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=מתוך {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} מתוך {{pagesCount}})\n\nzoom_out.title=התרחקות\nzoom_out_label=התרחקות\nzoom_in.title=התקרבות\nzoom_in_label=התקרבות\nzoom.title=מרחק מתצוגה\npresentation_mode.title=מעבר למצב מצגת\npresentation_mode_label=מצב מצגת\nopen_file.title=פתיחת קובץ\nopen_file_label=פתיחה\nprint.title=הדפסה\nprint_label=הדפסה\ndownload.title=הורדה\ndownload_label=הורדה\nbookmark.title=תצוגה נוכחית (העתקה או פתיחה בחלון חדש)\nbookmark_label=תצוגה נוכחית\n\n# Secondary toolbar and context menu\ntools.title=כלים\ntools_label=כלים\nfirst_page.title=מעבר לעמוד הראשון\nfirst_page.label=מעבר לעמוד הראשון\nfirst_page_label=מעבר לעמוד הראשון\nlast_page.title=מעבר לעמוד האחרון\nlast_page.label=מעבר לעמוד האחרון\nlast_page_label=מעבר לעמוד האחרון\npage_rotate_cw.title=הטיה עם כיוון השעון\npage_rotate_cw.label=הטיה עם כיוון השעון\npage_rotate_cw_label=הטיה עם כיוון השעון\npage_rotate_ccw.title=הטיה כנגד כיוון השעון\npage_rotate_ccw.label=הטיה כנגד כיוון השעון\npage_rotate_ccw_label=הטיה כנגד כיוון השעון\n\ncursor_text_select_tool.title=הפעלת כלי בחירת טקסט\ncursor_text_select_tool_label=כלי בחירת טקסט\ncursor_hand_tool.title=הפעלת כלי היד\ncursor_hand_tool_label=כלי יד\n\n# Document properties dialog box\ndocument_properties.title=מאפייני מסמך…\ndocument_properties_label=מאפייני מסמך…\ndocument_properties_file_name=שם קובץ:\ndocument_properties_file_size=גודל הקובץ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} ק״ב ({{size_b}} בתים)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} מ״ב ({{size_b}} בתים)\ndocument_properties_title=כותרת:\ndocument_properties_author=מחבר:\ndocument_properties_subject=נושא:\ndocument_properties_keywords=מילות מפתח:\ndocument_properties_creation_date=תאריך יצירה:\ndocument_properties_modification_date=תאריך שינוי:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=יוצר:\ndocument_properties_producer=יצרן PDF:\ndocument_properties_version=גרסת PDF:\ndocument_properties_page_count=מספר דפים:\ndocument_properties_close=סגירה\n\nprint_progress_message=מסמך בהכנה להדפסה…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=ביטול\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=הצגה/הסתרה של סרגל הצד\ntoggle_sidebar_notification.title=החלפת תצוגת סרגל צד (מסמך שמכיל מתאר/צרופות)\ntoggle_sidebar_label=הצגה/הסתרה של סרגל הצד\ndocument_outline.title=הצגת מתאר מסמך (לחיצה כפולה כדי להרחיב או לצמצם את כל הפריטים)\ndocument_outline_label=מתאר מסמך\nattachments.title=הצגת צרופות\nattachments_label=צרופות\nthumbs.title=הצגת תצוגה מקדימה\nthumbs_label=תצוגה מקדימה\nfindbar.title=חיפוש במסמך\nfindbar_label=חיפוש\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=עמוד {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=תצוגה מקדימה של עמוד {{page}}\n\n# Find panel button title and messages\nfind_input.title=חיפוש\nfind_input.placeholder=חיפוש במסמך…\nfind_previous.title=חיפוש מופע קודם של הביטוי\nfind_previous_label=קודם\nfind_next.title=חיפוש המופע הבא של הביטוי\nfind_next_label=הבא\nfind_highlight=הדגשת הכול\nfind_match_case_label=התאמת אותיות\nfind_reached_top=הגיע לראש הדף, ממשיך מלמטה\nfind_reached_bottom=הגיע לסוף הדף, ממשיך מלמעלה\nfind_not_found=ביטוי לא נמצא\n\n# Error panel labels\nerror_more_info=מידע נוסף\nerror_less_info=פחות מידע\nerror_close=סגירה\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js גרסה {{version}} (בנייה: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=הודעה: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=תוכן מחסנית: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=קובץ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=שורה: {{line}}\nrendering_error=אירעה שגיאה בעת עיבוד הדף.\n\n# Predefined zoom values\npage_scale_width=רוחב העמוד\npage_scale_fit=התאמה לעמוד\npage_scale_auto=מרחק מתצוגה אוטומטי\npage_scale_actual=גודל אמתי\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=שגיאה\nloading_error=אירעה שגיאה בעת טעינת ה־PDF.\ninvalid_file_error=קובץ PDF פגום או לא תקין.\nmissing_file_error=קובץ PDF חסר.\nunexpected_response_error=תגובת שרת לא צפויה.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[הערת {{type}}]\npassword_label=נא להכניס את הססמה לפתיחת קובץ PDF זה.\npassword_invalid=ססמה שגויה. נא לנסות שנית.\npassword_ok=אישור\npassword_cancel=ביטול\n\nprinting_not_supported=אזהרה: הדפסה אינה נתמכת במלואה בדפדפן זה.\nprinting_not_ready=אזהרה: ה־PDF לא ניתן לחלוטין עד מצב שמאפשר הדפסה.\nweb_fonts_disabled=גופני רשת מנוטרלים: לא ניתן להשתמש בגופני PDF מוטבעים.\ndocument_colors_not_allowed=מסמכי PDF אינם מורשים להשתמש בצבעים משלהם: האפשרות „אפשר לעמודים לבחור צבעים משלהם” אינה פעילה בדפדפן.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/hi-IN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=पिछला पृष्ठ\nprevious_label=पिछला\nnext.title=अगला पृष्ठ\nnext_label=आगे\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=पृष्ठ:\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} का\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=\\u0020छोटा करें\nzoom_out_label=\\u0020छोटा करें\nzoom_in.title=बड़ा करें\nzoom_in_label=बड़ा करें\nzoom.title=बड़ा-छोटा करें\npresentation_mode.title=प्रस्तुति अवस्था में जाएँ\npresentation_mode_label=\\u0020प्रस्तुति अवस्था\nopen_file.title=फ़ाइल खोलें\nopen_file_label=\\u0020खोलें\nprint.title=छापें\nprint_label=\\u0020छापें\ndownload.title=डाउनलोड\ndownload_label=डाउनलोड\nbookmark.title=मौजूदा दृश्य (नए विंडो में नक़ल लें या खोलें)\nbookmark_label=\\u0020मौजूदा दृश्य\n\n# Secondary toolbar and context menu\ntools.title=औज़ार\ntools_label=औज़ार\nfirst_page.title=प्रथम पृष्ठ पर जाएँ\nfirst_page.label=\\u0020प्रथम पृष्ठ पर जाएँ\nfirst_page_label=प्रथम पृष्ठ पर जाएँ\nlast_page.title=अंतिम पृष्ठ पर जाएँ\nlast_page.label=\\u0020अंतिम पृष्ठ पर जाएँ\nlast_page_label=\\u0020अंतिम पृष्ठ पर जाएँ\npage_rotate_cw.title=घड़ी की दिशा में घुमाएँ\npage_rotate_cw.label=घड़ी की दिशा में घुमाएँ\npage_rotate_cw_label=घड़ी की दिशा में घुमाएँ\npage_rotate_ccw.title=घड़ी की दिशा से उल्टा घुमाएँ\npage_rotate_ccw.label=घड़ी की दिशा से उल्टा घुमाएँ\npage_rotate_ccw_label=\\u0020घड़ी की दिशा से उल्टा घुमाएँ\n\n\n# Document properties dialog box\ndocument_properties.title=दस्तावेज़ विशेषता...\ndocument_properties_label=दस्तावेज़ विशेषता...\ndocument_properties_file_name=फ़ाइल नाम:\ndocument_properties_file_size=फाइल आकारः\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=शीर्षक:\ndocument_properties_author=लेखकः\ndocument_properties_subject=विषय:\ndocument_properties_keywords=कुंजी-शब्द:\ndocument_properties_creation_date=निर्माण दिनांक:\ndocument_properties_modification_date=संशोधन दिनांक:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=निर्माता:\ndocument_properties_producer=PDF उत्पादक:\ndocument_properties_version=PDF संस्करण:\ndocument_properties_page_count=पृष्ठ गिनती:\ndocument_properties_close=बंद करें\n\nprint_progress_message=छपाई के लिए दस्तावेज़ को तैयार किया जा रहा है...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=रद्द करें\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=\\u0020स्लाइडर टॉगल करें\ntoggle_sidebar_label=स्लाइडर टॉगल करें\ndocument_outline.title=दस्तावेज़ की रूपरेखा दिखाइए (सारी वस्तुओं को फलने अथवा समेटने के लिए दो बार क्लिक करें)\ndocument_outline_label=दस्तावेज़ आउटलाइन\nattachments.title=संलग्नक दिखायें\nattachments_label=संलग्नक\nthumbs.title=लघुछवियाँ दिखाएँ\nthumbs_label=लघु छवि\nfindbar.title=\\u0020दस्तावेज़ में ढूँढ़ें\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=पृष्ठ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=पृष्ठ {{page}} की लघु-छवि\n\n# Find panel button title and messages\nfind_previous.title=वाक्यांश की पिछली उपस्थिति ढूँढ़ें\nfind_previous_label=पिछला\nfind_next.title=वाक्यांश की अगली उपस्थिति ढूँढ़ें\nfind_next_label=आगे\nfind_highlight=\\u0020सभी आलोकित करें\nfind_match_case_label=मिलान स्थिति\nfind_reached_top=पृष्ठ के ऊपर पहुंच गया, नीचे से जारी रखें\nfind_reached_bottom=पृष्ठ के नीचे में जा पहुँचा, ऊपर से जारी\nfind_not_found=वाक्यांश नहीं मिला\n\n# Error panel labels\nerror_more_info=अधिक सूचना\nerror_less_info=कम सूचना\nerror_close=बंद करें\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=\\u0020संदेश: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=स्टैक: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=फ़ाइल: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=पंक्ति: {{line}}\nrendering_error=पृष्ठ रेंडरिंग के दौरान त्रुटि आई.\n\n# Predefined zoom values\npage_scale_width=\\u0020पृष्ठ चौड़ाई\npage_scale_fit=पृष्ठ फिट\npage_scale_auto=स्वचालित जूम\npage_scale_actual=वास्तविक आकार\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=त्रुटि\nloading_error=PDF लोड करते समय एक त्रुटि हुई.\ninvalid_file_error=अमान्य या भ्रष्ट PDF फ़ाइल.\nmissing_file_error=\\u0020अनुपस्थित PDF फ़ाइल.\nunexpected_response_error=अप्रत्याशित सर्वर प्रतिक्रिया.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=\\u0020[{{type}} Annotation]\npassword_label=इस PDF फ़ाइल को खोलने के लिए कृपया कूटशब्द भरें.\npassword_invalid=अवैध कूटशब्द, कृपया फिर कोशिश करें.\npassword_ok=OK\npassword_cancel=रद्द करें\n\nprinting_not_supported=चेतावनी: इस ब्राउज़र पर छपाई पूरी तरह से समर्थित नहीं है.\nprinting_not_ready=चेतावनी: PDF छपाई के लिए पूरी तरह से लोड नहीं है.\nweb_fonts_disabled=वेब फॉन्ट्स निष्क्रिय हैं: अंतःस्थापित PDF फॉन्टस के उपयोग में असमर्थ.\ndocument_colors_not_allowed=PDF दस्तावेज़ उनके अपने रंग को उपयोग करने के लिए अनुमति प्राप्त नहीं है: \"पृष्ठों को उनके अपने रंग को चुनने के लिए स्वीकृति दें\" कि वह उस ब्राउज़र में निष्क्रिय है.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/hr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Prethodna stranica\nprevious_label=Prethodna\nnext.title=Sljedeća stranica\nnext_label=Sljedeća\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Stranica\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=od {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} od {{pagesCount}})\n\nzoom_out.title=Uvećaj\nzoom_out_label=Smanji\nzoom_in.title=Uvećaj\nzoom_in_label=Smanji\nzoom.title=Uvećanje\npresentation_mode.title=Prebaci u prezentacijski način rada\npresentation_mode_label=Prezentacijski način rada\nopen_file.title=Otvori datoteku\nopen_file_label=Otvori\nprint.title=Ispis\nprint_label=Ispis\ndownload.title=Preuzmi\ndownload_label=Preuzmi\nbookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru)\nbookmark_label=Trenutni prikaz\n\n# Secondary toolbar and context menu\ntools.title=Alati\ntools_label=Alati\nfirst_page.title=Idi na prvu stranicu\nfirst_page.label=Idi na prvu stranicu\nfirst_page_label=Idi na prvu stranicu\nlast_page.title=Idi na posljednju stranicu\nlast_page.label=Idi na posljednju stranicu\nlast_page_label=Idi na posljednju stranicu\npage_rotate_cw.title=Rotiraj u smjeru kazaljke na satu\npage_rotate_cw.label=Rotiraj u smjeru kazaljke na satu\npage_rotate_cw_label=Rotiraj u smjeru kazaljke na satu\npage_rotate_ccw.title=Rotiraj obrnutno od smjera kazaljke na satu\npage_rotate_ccw.label=Rotiraj obrnutno od smjera kazaljke na satu\npage_rotate_ccw_label=Rotiraj obrnutno od smjera kazaljke na satu\n\ncursor_text_select_tool.title=Omogući alat za označavanje teksta\ncursor_text_select_tool_label=Alat za označavanje teksta\ncursor_hand_tool.title=Omogući ručni alat\ncursor_hand_tool_label=Ručni alat\n\n# Document properties dialog box\ndocument_properties.title=Svojstva dokumenta...\ndocument_properties_label=Svojstva dokumenta...\ndocument_properties_file_name=Naziv datoteke:\ndocument_properties_file_size=Veličina datoteke:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajtova)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajtova)\ndocument_properties_title=Naslov:\ndocument_properties_author=Autor:\ndocument_properties_subject=Predmet:\ndocument_properties_keywords=Ključne riječi:\ndocument_properties_creation_date=Datum stvaranja:\ndocument_properties_modification_date=Datum promjene:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Stvaratelj:\ndocument_properties_producer=PDF stvaratelj:\ndocument_properties_version=PDF inačica:\ndocument_properties_page_count=Broj stranica:\ndocument_properties_close=Zatvori\n\nprint_progress_message=Pripremanje dokumenta za ispis…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Odustani\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Prikaži/sakrij bočnu traku\ntoggle_sidebar_notification.title=Prikazivanje i sklanjanje bočne trake (dokument sadrži konturu/privitke)\ntoggle_sidebar_label=Prikaži/sakrij bočnu traku\ndocument_outline.title=Prikaži obris dokumenta (dvostruki klik za proširivanje/skupljanje svih stavki)\ndocument_outline_label=Obris dokumenta\nattachments.title=Prikaži privitke\nattachments_label=Privitci\nthumbs.title=Prikaži sličice\nthumbs_label=Sličice\nfindbar.title=Traži u dokumentu\nfindbar_label=Traži\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Stranica {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Sličica stranice {{page}}\n\n# Find panel button title and messages\nfind_input.title=Traži\nfind_input.placeholder=Traži u dokumentu…\nfind_previous.title=Pronađi prethodno javljanje ovog izraza\nfind_previous_label=Prethodno\nfind_next.title=Pronađi iduće javljanje ovog izraza\nfind_next_label=Sljedeće\nfind_highlight=Istankni sve\nfind_match_case_label=Slučaj podudaranja\nfind_reached_top=Dosegnut vrh dokumenta, nastavak od dna\nfind_reached_bottom=Dosegnut vrh dokumenta, nastavak od vrha\nfind_not_found=Izraz nije pronađen\n\n# Error panel labels\nerror_more_info=Više informacija\nerror_less_info=Manje informacija\nerror_close=Zatvori\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Poruka: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stog: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Datoteka: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Redak: {{line}}\nrendering_error=Došlo je do greške prilikom iscrtavanja stranice.\n\n# Predefined zoom values\npage_scale_width=Širina stranice\npage_scale_fit=Pristajanje stranici\npage_scale_auto=Automatsko uvećanje\npage_scale_actual=Prava veličina\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Greška\nloading_error=Došlo je do greške pri učitavanju PDF-a.\ninvalid_file_error=Kriva ili oštećena PDF datoteka.\nmissing_file_error=Nedostaje PDF datoteka.\nunexpected_response_error=Neočekivani odgovor poslužitelja.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Bilješka]\npassword_label=Upišite lozinku da biste otvorili ovu PDF datoteku.\npassword_invalid=Neispravna lozinka. Pokušajte ponovo.\npassword_ok=U redu\npassword_cancel=Odustani\n\nprinting_not_supported=Upozorenje: Ispisivanje nije potpuno podržano u ovom pregledniku.\nprinting_not_ready=Upozorenje: PDF nije u potpunosti učitan za ispis.\nweb_fonts_disabled=Web fontovi su onemogućeni: nije moguće koristiti umetnute PDF fontove.\ndocument_colors_not_allowed=PDF dokumenti nemaju dopuštene koristiti vlastite boje: opcija 'Dopusti stranicama da koriste vlastite boje' je deaktivirana.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/hu/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Előző oldal\nprevious_label=Előző\nnext.title=Következő oldal\nnext_label=Tovább\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Oldal\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=összesen: {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=Kicsinyítés\nzoom_out_label=Kicsinyítés\nzoom_in.title=Nagyítás\nzoom_in_label=Nagyítás\nzoom.title=Nagyítás\npresentation_mode.title=Váltás bemutató módba\npresentation_mode_label=Bemutató mód\nopen_file.title=Fájl megnyitása\nopen_file_label=Megnyitás\nprint.title=Nyomtatás\nprint_label=Nyomtatás\ndownload.title=Letöltés\ndownload_label=Letöltés\nbookmark.title=Jelenlegi nézet (másolás vagy megnyitás új ablakban)\nbookmark_label=Aktuális nézet\n\n# Secondary toolbar and context menu\ntools.title=Eszközök\ntools_label=Eszközök\nfirst_page.title=Ugrás az első oldalra\nfirst_page.label=Ugrás az első oldalra\nfirst_page_label=Ugrás az első oldalra\nlast_page.title=Ugrás az utolsó oldalra\nlast_page.label=Ugrás az utolsó oldalra\nlast_page_label=Ugrás az utolsó oldalra\npage_rotate_cw.title=Forgatás az óramutató járásával egyezően\npage_rotate_cw.label=Forgatás az óramutató járásával egyezően\npage_rotate_cw_label=Forgatás az óramutató járásával egyezően\npage_rotate_ccw.title=Forgatás az óramutató járásával ellentétesen\npage_rotate_ccw.label=Forgatás az óramutató járásával ellentétesen\npage_rotate_ccw_label=Forgatás az óramutató járásával ellentétesen\n\ncursor_text_select_tool.title=Szövegkijelölő eszköz bekapcsolása\ncursor_text_select_tool_label=Szövegkijelölő eszköz\ncursor_hand_tool.title=Kéz eszköz bekapcsolása\ncursor_hand_tool_label=Kéz eszköz\n\n# Document properties dialog box\ndocument_properties.title=Dokumentum tulajdonságai…\ndocument_properties_label=Dokumentum tulajdonságai…\ndocument_properties_file_name=Fájlnév:\ndocument_properties_file_size=Fájlméret:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bájt)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bájt)\ndocument_properties_title=Cím:\ndocument_properties_author=Szerző:\ndocument_properties_subject=Tárgy:\ndocument_properties_keywords=Kulcsszavak:\ndocument_properties_creation_date=Létrehozás dátuma:\ndocument_properties_modification_date=Módosítás dátuma:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Létrehozta:\ndocument_properties_producer=PDF előállító:\ndocument_properties_version=PDF verzió:\ndocument_properties_page_count=Oldalszám:\ndocument_properties_close=Bezárás\n\nprint_progress_message=Dokumentum előkészítése nyomtatáshoz…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Mégse\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Oldalsáv be/ki\ntoggle_sidebar_notification.title=Oldalsáv be/ki (a dokumentum vázlatot/mellékleteket tartalmaz)\ntoggle_sidebar_label=Oldalsáv be/ki\ndocument_outline.title=Dokumentum megjelenítése online (dupla kattintás minden elem kinyitásához/összecsukásához)\ndocument_outline_label=Dokumentumvázlat\nattachments.title=Mellékletek megjelenítése\nattachments_label=Van melléklet\nthumbs.title=Bélyegképek megjelenítése\nthumbs_label=Bélyegképek\nfindbar.title=Keresés a dokumentumban\nfindbar_label=Keresés\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}}. oldal\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}. oldal bélyegképe\n\n# Find panel button title and messages\nfind_input.title=Keresés\nfind_input.placeholder=Keresés a dokumentumban…\nfind_previous.title=A kifejezés előző előfordulásának keresése\nfind_previous_label=Előző\nfind_next.title=A kifejezés következő előfordulásának keresése\nfind_next_label=Tovább\nfind_highlight=Összes kiemelése\nfind_match_case_label=Kis- és nagybetűk megkülönböztetése\nfind_reached_top=A dokumentum eleje elérve, folytatás a végétől\nfind_reached_bottom=A dokumentum vége elérve, folytatás az elejétől\nfind_not_found=A kifejezés nem található\n\n# Error panel labels\nerror_more_info=További tudnivalók\nerror_less_info=Kevesebb információ\nerror_close=Bezárás\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Üzenet: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Nyomkövetés: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fájl: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Sor: {{line}}\nrendering_error=Hiba történt az oldal feldolgozása közben.\n\n# Predefined zoom values\npage_scale_width=Oldalszélesség\npage_scale_fit=Teljes oldal\npage_scale_auto=Automatikus nagyítás\npage_scale_actual=Valódi méret\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Hiba\nloading_error=Hiba történt a PDF betöltésekor.\ninvalid_file_error=Érvénytelen vagy sérült PDF fájl.\nmissing_file_error=Hiányzó PDF fájl.\nunexpected_response_error=Váratlan kiszolgálóválasz.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} megjegyzés]\npassword_label=Adja meg a jelszót a PDF fájl megnyitásához.\npassword_invalid=Helytelen jelszó. Próbálja újra.\npassword_ok=OK\npassword_cancel=Mégse\n\nprinting_not_supported=Figyelmeztetés: Ez a böngésző nem teljesen támogatja a nyomtatást.\nprinting_not_ready=Figyelmeztetés: A PDF nincs teljesen betöltve a nyomtatáshoz.\nweb_fonts_disabled=Webes betűkészletek letiltva: nem használhatók a beágyazott PDF betűkészletek.\ndocument_colors_not_allowed=A PDF dokumentumok nem használhatják saját színeiket: „Az oldalak a saját maguk által kiválasztott színeket használhatják” beállítás ki van kapcsolva a böngészőben.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/hy-AM/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Նախորդ էջը\nprevious_label=Նախորդը\nnext.title=Հաջորդ էջը\nnext_label=Հաջորդը\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Էջ.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}}-ից\\u0020\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}}-ը {{pagesCount}})-ից\n\nzoom_out.title=Փոքրացնել\nzoom_out_label=Փոքրացնել\nzoom_in.title=Խոշորացնել\nzoom_in_label=Խոշորացնել\nzoom.title=Մասշտաբը\\u0020\npresentation_mode.title=Անցնել Ներկայացման եղանակին\npresentation_mode_label=Ներկայացման եղանակ\nopen_file.title=Բացել Ֆայլ\nopen_file_label=Բացել\nprint.title=Տպել\nprint_label=Տպել\ndownload.title=Բեռնել\ndownload_label=Բեռնել\nbookmark.title=Ընթացիկ տեսքով (պատճենել կամ բացել նոր պատուհանում)\nbookmark_label=Ընթացիկ տեսքը\n\n# Secondary toolbar and context menu\ntools.title=Գործիքներ\ntools_label=Գործիքներ\nfirst_page.title=Անցնել առաջին էջին\nfirst_page.label=Անցնել առաջին էջին\nfirst_page_label=Անցնել առաջին էջին\nlast_page.title=Անցնել վերջին էջին\nlast_page.label=Անցնել վերջին էջին\nlast_page_label=Անցնել վերջին էջին\npage_rotate_cw.title=Պտտել ըստ ժամացույցի սլաքի\npage_rotate_cw.label=Պտտել ըստ ժամացույցի սլաքի\npage_rotate_cw_label=Պտտել ըստ ժամացույցի սլաքի\npage_rotate_ccw.title=Պտտել հակառակ ժամացույցի սլաքի\npage_rotate_ccw.label=Պտտել հակառակ ժամացույցի սլաքի\npage_rotate_ccw_label=Պտտել հակառակ ժամացույցի սլաքի\n\n\n# Document properties dialog box\ndocument_properties.title=Փաստաթղթի հատկությունները...\ndocument_properties_label=Փաստաթղթի հատկությունները...\ndocument_properties_file_name=Ֆայլի անունը.\ndocument_properties_file_size=Ֆայլի չափը.\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} ԿԲ ({{size_b}} բայթ)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} ՄԲ ({{size_b}} բայթ)\ndocument_properties_title=Վերնագիր.\ndocument_properties_author=Հեղինակ․\ndocument_properties_subject=Վերնագիր.\ndocument_properties_keywords=Հիմնաբառ.\ndocument_properties_creation_date=Ստեղծելու ամսաթիվը.\ndocument_properties_modification_date=Փոփոխելու ամսաթիվը.\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Ստեղծող.\ndocument_properties_producer=PDF-ի հեղինակը.\ndocument_properties_version=PDF-ի տարբերակը.\ndocument_properties_page_count=Էջերի քանակը.\ndocument_properties_close=Փակել\n\nprint_progress_message=Նախապատրաստում է փաստաթուղթը տպելուն...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Չեղարկել\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Բացել/Փակել Կողային վահանակը\ntoggle_sidebar_notification.title=Փոխանջատել Կողային գոտին (փաստաթուղթը պարունակում է ուրվագիծ/կցորդ)\ntoggle_sidebar_label=Բացել/Փակել Կողային վահանակը\ndocument_outline.title=Ցուցադրել փաստաթղթի ուրվագիծը (կրկնակի սեղմեք՝ միույթները ընդարձակելու/կոծկելու համար)\ndocument_outline_label=Փաստաթղթի բովանդակությունը\nattachments.title=Ցուցադրել կցորդները\nattachments_label=Կցորդներ\nthumbs.title=Ցուցադրել Մանրապատկերը\nthumbs_label=Մանրապատկերը\nfindbar.title=Գտնել փաստաթղթում\nfindbar_label=Որոնում\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Էջը {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Էջի մանրապատկերը {{page}}\n\n# Find panel button title and messages\nfind_input.title=Որոնում\nfind_input.placeholder=Գտնել փաստաթղթում...\nfind_previous.title=Գտնել անրահայտության նախորդ հանդիպումը\nfind_previous_label=Նախորդը\nfind_next.title=Գտիր արտահայտության հաջորդ հանդիպումը\nfind_next_label=Հաջորդը\nfind_highlight=Գունանշել բոլորը\nfind_match_case_label=Մեծ(փոքր)ատառ հաշվի առնել\nfind_reached_top=Հասել եք փաստաթղթի վերևին, կշարունակվի ներքևից\nfind_reached_bottom=Հասել եք փաստաթղթի վերջին, կշարունակվի վերևից\nfind_not_found=Արտահայտությունը չգտնվեց\n\n# Error panel labels\nerror_more_info=Ավելի շատ տեղեկություն\nerror_less_info=Քիչ տեղեկություն\nerror_close=Փակել\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (կառուցումը. {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Գրությունը. {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Շեղջ. {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ֆայլ. {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Տողը. {{line}}\nrendering_error=Սխալ՝ էջը ստեղծելիս:\n\n# Predefined zoom values\npage_scale_width=Էջի լայնքը\npage_scale_fit=Ձգել էջը\npage_scale_auto=Ինքնաշխատ\npage_scale_actual=Իրական չափը\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Սխալ\nloading_error=Սխալ՝ PDF ֆայլը բացելիս։\ninvalid_file_error=Սխալ կամ բնասված PDF ֆայլ:\nmissing_file_error=PDF ֆայլը բացակայում է:\nunexpected_response_error=Սպասարկիչի անսպասելի պատասխան:\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Ծանոթություն]\npassword_label=Մուտքագրեք PDF-ի գաղտնաբառը:\npassword_invalid=Գաղտնաբառը սխալ է: Կրկին փորձեք:\npassword_ok=Լավ\npassword_cancel=Չեղարկել\n\nprinting_not_supported=Զգուշացում. Տպելը ամբողջությամբ չի աջակցվում դիտարկիչի կողմից։\nprinting_not_ready=Զգուշացում. PDF-ը ամբողջությամբ չի բեռնավորվել տպելու համար:\nweb_fonts_disabled=Վեբ-տառատեսակները անջատված են. հնարավոր չէ օգտագործել ներկառուցված PDF տառատեսակները:\ndocument_colors_not_allowed=PDF փաստաթղթերին թույլատրված չէ օգտագործել իրենց սեփական գույները: “Թույլատրել էջերին ընտրել իրենց սեփական գույները“ ընտրանքը անջատված է դիտարկիչում:\n"
  },
  {
    "path": "example/pages/include/pdf/locale/id/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Laman Sebelumnya\nprevious_label=Sebelumnya\nnext.title=Laman Selanjutnya\nnext_label=Selanjutnya\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Halaman\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=dari {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} dari {{pagesCount}})\n\nzoom_out.title=Perkecil\nzoom_out_label=Perkecil\nzoom_in.title=Perbesar\nzoom_in_label=Perbesar\nzoom.title=Perbesaran\npresentation_mode.title=Ganti ke Mode Presentasi\npresentation_mode_label=Mode Presentasi\nopen_file.title=Buka Berkas\nopen_file_label=Buka\nprint.title=Cetak\nprint_label=Cetak\ndownload.title=Unduh\ndownload_label=Unduh\nbookmark.title=Tampilan Sekarang (salin atau buka di jendela baru)\nbookmark_label=Tampilan Sekarang\n\n# Secondary toolbar and context menu\ntools.title=Alat\ntools_label=Alat\nfirst_page.title=Buka Halaman Pertama\nfirst_page.label=Ke Halaman Pertama\nfirst_page_label=Buka Halaman Pertama\nlast_page.title=Buka Halaman Terakhir\nlast_page.label=Ke Halaman Terakhir\nlast_page_label=Buka Halaman Terakhir\npage_rotate_cw.title=Putar Searah Jarum Jam\npage_rotate_cw.label=Putar Searah Jarum Jam\npage_rotate_cw_label=Putar Searah Jarum Jam\npage_rotate_ccw.title=Putar Berlawanan Arah Jarum Jam\npage_rotate_ccw.label=Putar Berlawanan Arah Jarum Jam\npage_rotate_ccw_label=Putar Berlawanan Arah Jarum Jam\n\ncursor_text_select_tool.title=Aktifkan Alat Seleksi Teks\ncursor_text_select_tool_label=Alat Seleksi Teks\ncursor_hand_tool.title=Aktifkan Alat Tangan\ncursor_hand_tool_label=Alat Tangan\n\n# Document properties dialog box\ndocument_properties.title=Properti Dokumen…\ndocument_properties_label=Properti Dokumen…\ndocument_properties_file_name=Nama berkas:\ndocument_properties_file_size=Ukuran berkas:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} byte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title=Judul:\ndocument_properties_author=Penyusun:\ndocument_properties_subject=Subjek:\ndocument_properties_keywords=Kata Kunci:\ndocument_properties_creation_date=Tanggal Dibuat:\ndocument_properties_modification_date=Tanggal Dimodifikasi:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Pembuat:\ndocument_properties_producer=Pemroduksi PDF:\ndocument_properties_version=Versi PDF:\ndocument_properties_page_count=Jumlah Halaman:\ndocument_properties_close=Tutup\n\nprint_progress_message=Menyiapkan dokumen untuk pencetakan…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Batalkan\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Aktif/Nonaktifkan Bilah Samping\ntoggle_sidebar_notification.title=Aktif/Nonaktifkan Bilah Samping (dokumen berisi kerangka/lampiran)\ntoggle_sidebar_label=Aktif/Nonaktifkan Bilah Samping\ndocument_outline.title=Tampilkan Kerangka Dokumen (klik ganda untuk membentangkan/menciutkan semua item)\ndocument_outline_label=Kerangka Dokumen\nattachments.title=Tampilkan Lampiran\nattachments_label=Lampiran\nthumbs.title=Tampilkan Miniatur\nthumbs_label=Miniatur\nfindbar.title=Temukan di Dokumen\nfindbar_label=Temukan\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Laman {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatur Laman {{page}}\n\n# Find panel button title and messages\nfind_input.title=Temukan\nfind_input.placeholder=Temukan di dokumen…\nfind_previous.title=Temukan kata sebelumnya\nfind_previous_label=Sebelumnya\nfind_next.title=Temukan lebih lanjut\nfind_next_label=Selanjutnya\nfind_highlight=Sorot semuanya\nfind_match_case_label=Cocokkan BESAR/kecil\nfind_reached_top=Sampai di awal dokumen, dilanjutkan dari bawah\nfind_reached_bottom=Sampai di akhir dokumen, dilanjutkan dari atas\nfind_not_found=Frasa tidak ditemukan\n\n# Error panel labels\nerror_more_info=Lebih Banyak Informasi\nerror_less_info=Lebih Sedikit Informasi\nerror_close=Tutup\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Pesan: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Berkas: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Baris: {{line}}\nrendering_error=Galat terjadi saat merender laman.\n\n# Predefined zoom values\npage_scale_width=Lebar Laman\npage_scale_fit=Muat Laman\npage_scale_auto=Perbesaran Otomatis\npage_scale_actual=Ukuran Asli\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Galat\nloading_error=Galat terjadi saat memuat PDF.\ninvalid_file_error=Berkas PDF tidak valid atau rusak.\nmissing_file_error=Berkas PDF tidak ada.\nunexpected_response_error=Balasan server yang tidak diharapkan.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotasi {{type}}]\npassword_label=Masukkan sandi untuk membuka berkas PDF ini.\npassword_invalid=Sandi tidak valid. Silakan coba lagi.\npassword_ok=Oke\npassword_cancel=Batal\n\nprinting_not_supported=Peringatan: Pencetakan tidak didukung secara lengkap pada peramban ini.\nprinting_not_ready=Peringatan: Berkas PDF masih belum dimuat secara lengkap untuk dapat dicetak.\nweb_fonts_disabled=Font web dinonaktifkan: tidak dapat menggunakan font PDF yang tersemat.\ndocument_colors_not_allowed=Dokumen PDF tidak diizinkan untuk menggunakan warnanya sendiri karena setelan 'Izinkan laman memilih warna sendiri' dinonaktifkan pada pengaturan.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/is/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Fyrri síða\nprevious_label=Fyrri\nnext.title=Næsta síða\nnext_label=Næsti\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Síða\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=af {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} af {{pagesCount}})\n\nzoom_out.title=Minnka\nzoom_out_label=Minnka\nzoom_in.title=Stækka\nzoom_in_label=Stækka\nzoom.title=Aðdráttur\npresentation_mode.title=Skipta yfir á kynningarham\npresentation_mode_label=Kynningarhamur\nopen_file.title=Opna skrá\nopen_file_label=Opna\nprint.title=Prenta\nprint_label=Prenta\ndownload.title=Hala niður\ndownload_label=Hala niður\nbookmark.title=Núverandi sýn (afritaðu eða opnaðu í nýjum glugga)\nbookmark_label=Núverandi sýn\n\n# Secondary toolbar and context menu\ntools.title=Verkfæri\ntools_label=Verkfæri\nfirst_page.title=Fara á fyrstu síðu\nfirst_page.label=Fara á fyrstu síðu\nfirst_page_label=Fara á fyrstu síðu\nlast_page.title=Fara á síðustu síðu\nlast_page.label=Fara á síðustu síðu\nlast_page_label=Fara á síðustu síðu\npage_rotate_cw.title=Snúa réttsælis\npage_rotate_cw.label=Snúa réttsælis\npage_rotate_cw_label=Snúa réttsælis\npage_rotate_ccw.title=Snúa rangsælis\npage_rotate_ccw.label=Snúa rangsælis\npage_rotate_ccw_label=Snúa rangsælis\n\ncursor_text_select_tool.title=Virkja textavalsáhald\ncursor_text_select_tool_label=Textavalsáhald\ncursor_hand_tool.title=Virkja handarverkfæri\ncursor_hand_tool_label=Handarverkfæri\n\n# Document properties dialog box\ndocument_properties.title=Eiginleikar skjals…\ndocument_properties_label=Eiginleikar skjals…\ndocument_properties_file_name=Skráarnafn:\ndocument_properties_file_size=Skrárstærð:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titill:\ndocument_properties_author=Hönnuður:\ndocument_properties_subject=Efni:\ndocument_properties_keywords=Stikkorð:\ndocument_properties_creation_date=Búið til:\ndocument_properties_modification_date=Dags breytingar:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Höfundur:\ndocument_properties_producer=PDF framleiðandi:\ndocument_properties_version=PDF útgáfa:\ndocument_properties_page_count=Blaðsíðufjöldi:\ndocument_properties_close=Loka\n\nprint_progress_message=Undirbý skjal fyrir prentun…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Hætta við\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Víxla hliðslá\ntoggle_sidebar_notification.title=Víxla hliðarslá (skjal inniheldur yfirlit/viðhengi)\ntoggle_sidebar_label=Víxla hliðslá\ndocument_outline.title=Sýna yfirlit skjals (tvísmelltu til að opna/loka öllum hlutum)\ndocument_outline_label=Efnisskipan skjals\nattachments.title=Sýna viðhengi\nattachments_label=Viðhengi\nthumbs.title=Sýna smámyndir\nthumbs_label=Smámyndir\nfindbar.title=Leita í skjali\nfindbar_label=Leita\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Síða {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Smámynd af síðu {{page}}\n\n# Find panel button title and messages\nfind_input.title=Leita\nfind_input.placeholder=Leita í skjali…\nfind_previous.title=Leita að fyrra tilfelli þessara orða\nfind_previous_label=Fyrri\nfind_next.title=Leita að næsta tilfelli þessara orða\nfind_next_label=Næsti\nfind_highlight=Lita allt\nfind_match_case_label=Passa við stafstöðu\nfind_reached_top=Náði efst í skjal, held áfram neðst\nfind_reached_bottom=Náði enda skjals, held áfram efst\nfind_not_found=Fann ekki orðið\n\n# Error panel labels\nerror_more_info=Meiri upplýsingar\nerror_less_info=Minni upplýsingar\nerror_close=Loka\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Skilaboð: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stafli: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Skrá: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Lína: {{line}}\nrendering_error=Upp kom villa við að birta síðuna.\n\n# Predefined zoom values\npage_scale_width=Síðubreidd\npage_scale_fit=Passa á síðu\npage_scale_auto=Sjálfvirkur aðdráttur\npage_scale_actual=Raunstærð\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Villa\nloading_error=Villa kom upp við að hlaða inn PDF.\ninvalid_file_error=Ógild eða skemmd PDF skrá.\nmissing_file_error=Vantar PDF skrá.\nunexpected_response_error=Óvænt svar frá netþjóni.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Skýring]\npassword_label=Sláðu inn lykilorð til að opna þessa PDF skrá.\npassword_invalid=Ógilt lykilorð. Reyndu aftur.\npassword_ok=Í lagi\npassword_cancel=Hætta við\n\nprinting_not_supported=Aðvörun: Prentun er ekki með fyllilegan stuðning á þessum vafra.\nprinting_not_ready=Aðvörun: Ekki er búið að hlaða inn allri PDF skránni fyrir prentun.\nweb_fonts_disabled=Vef leturgerðir eru óvirkar: get ekki notað innbyggðar PDF leturgerðir.\ndocument_colors_not_allowed=PDF skjöl hafa ekki leyfi til að nota sína eigin liti: “Leyfa síðum að velja eigin liti” er óvirkt í vafranum.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/it/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nprevious.title = Pagina precedente\nprevious_label = Precedente\nnext.title = Pagina successiva\nnext_label = Successiva\npage.title = Pagina\nof_pages = di {{pagesCount}}\npage_of_pages = ({{pageNumber}} di {{pagesCount}})\nzoom_out.title = Riduci zoom\nzoom_out_label = Riduci zoom\nzoom_in.title = Aumenta zoom\nzoom_in_label = Aumenta zoom\nzoom.title = Zoom\npresentation_mode.title = Passa alla modalità presentazione\npresentation_mode_label = Modalità presentazione\nopen_file.title = Apri file\nopen_file_label = Apri\nprint.title = Stampa\nprint_label = Stampa\ndownload.title = Scarica questo documento\ndownload_label = Download\nbookmark.title = Visualizzazione corrente (copia o apri in una nuova finestra)\nbookmark_label = Visualizzazione corrente\ntools.title = Strumenti\ntools_label = Strumenti\nfirst_page.title = Vai alla prima pagina\nfirst_page.label = Vai alla prima pagina\nfirst_page_label = Vai alla prima pagina\nlast_page.title = Vai all’ultima pagina\nlast_page.label = Vai all’ultima pagina\nlast_page_label = Vai all’ultima pagina\npage_rotate_cw.title = Ruota in senso orario\npage_rotate_cw.label = Ruota in senso orario\npage_rotate_cw_label = Ruota in senso orario\npage_rotate_ccw.title = Ruota in senso antiorario\npage_rotate_ccw.label = Ruota in senso antiorario\npage_rotate_ccw_label = Ruota in senso antiorario\ncursor_text_select_tool.title = Attiva strumento di selezione testo\ncursor_text_select_tool_label = Strumento di selezione testo\ncursor_hand_tool.title = Attiva strumento mano\ncursor_hand_tool_label = Strumento mano\ndocument_properties.title = Proprietà del documento…\ndocument_properties_label = Proprietà del documento…\ndocument_properties_file_name = Nome file:\ndocument_properties_file_size = Dimensione file:\ndocument_properties_kb = {{size_kb}} kB ({{size_b}} byte)\ndocument_properties_mb = {{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title = Titolo:\ndocument_properties_author = Autore:\ndocument_properties_subject = Oggetto:\ndocument_properties_keywords = Parole chiave:\ndocument_properties_creation_date = Data creazione:\ndocument_properties_modification_date = Data modifica:\ndocument_properties_date_string = {{date}}, {{time}}\ndocument_properties_creator = Autore originale:\ndocument_properties_producer = Produttore PDF:\ndocument_properties_version = Versione PDF:\ndocument_properties_page_count = Conteggio pagine:\ndocument_properties_close = Chiudi\nprint_progress_message = Preparazione documento per la stampa…\nprint_progress_percent = {{progress}}%\nprint_progress_close = Annulla\ntoggle_sidebar.title = Attiva/disattiva barra laterale\ntoggle_sidebar_notification.title = Attiva/disattiva barra laterale (il documento contiene struttura/allegati)\ntoggle_sidebar_label = Attiva/disattiva barra laterale\ndocument_outline.title = Visualizza la struttura del documento (doppio clic per visualizzare/nascondere tutti gli elementi)\ndocument_outline_label = Struttura documento\nattachments.title = Visualizza allegati\nattachments_label = Allegati\nthumbs.title = Mostra le miniature\nthumbs_label = Miniature\nfindbar.title = Trova nel documento\nfindbar_label = Trova\nthumb_page_title = Pagina {{page}}\nthumb_page_canvas = Miniatura della pagina {{page}}\nfind_input.title = Trova\nfind_input.placeholder = Trova nel documento…\nfind_previous.title = Trova l’occorrenza precedente del testo da cercare\nfind_previous_label = Precedente\nfind_next.title = Trova l’occorrenza successiva del testo da cercare\nfind_next_label = Successivo\nfind_highlight = Evidenzia\nfind_match_case_label = Maiuscole/minuscole\nfind_reached_top = Raggiunto l’inizio della pagina, continua dalla fine\nfind_reached_bottom = Raggiunta la fine della pagina, continua dall’inizio\nfind_not_found = Testo non trovato\nerror_more_info = Ulteriori informazioni\nerror_less_info = Nascondi dettagli\nerror_close = Chiudi\nerror_version_info = PDF.js v{{version}} (build: {{build}})\nerror_message = Messaggio: {{message}}\nerror_stack = Stack: {{stack}}\nerror_file = File: {{file}}\nerror_line = Riga: {{line}}\nrendering_error = Si è verificato un errore durante il rendering della pagina.\npage_scale_width = Larghezza pagina\npage_scale_fit = Adatta a una pagina\npage_scale_auto = Zoom automatico\npage_scale_actual = Dimensioni effettive\npage_scale_percent = {{scale}}%\nloading_error_indicator = Errore\nloading_error = Si è verificato un errore durante il caricamento del PDF.\ninvalid_file_error = File PDF non valido o danneggiato.\nmissing_file_error = File PDF non disponibile.\nunexpected_response_error = Risposta imprevista del server\ntext_annotation_type.alt = [Annotazione: {{type}}]\npassword_label = Inserire la password per aprire questo file PDF.\npassword_invalid = Password non corretta. Riprovare.\npassword_ok = OK\npassword_cancel = Annulla\nprinting_not_supported = Attenzione: la stampa non è completamente supportata da questo browser.\nprinting_not_ready = Attenzione: il PDF non è ancora stato caricato completamente per la stampa.\nweb_fonts_disabled = I web font risultano disattivati: impossibile utilizzare i caratteri inclusi nel PDF.\ndocument_colors_not_allowed = Non è possibile visualizzare i colori originali definiti nel file PDF: l’opzione del browser “Consenti alle pagine di scegliere i propri colori invece di quelli impostati” è disattivata.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ja/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=前のページへ戻ります\nprevious_label=前へ\nnext.title=次のページへ進みます\nnext_label=次へ\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=ページ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=表示を縮小します\nzoom_out_label=縮小\nzoom_in.title=表示を拡大します\nzoom_in_label=拡大\nzoom.title=拡大/縮小\npresentation_mode.title=プレゼンテーションモードに切り替えます\npresentation_mode_label=プレゼンテーションモード\nopen_file.title=ファイルを開きます\nopen_file_label=開く\nprint.title=印刷します\nprint_label=印刷\ndownload.title=ダウンロードします\ndownload_label=ダウンロード\nbookmark.title=現在のビューの URL です (コピーまたは新しいウィンドウに開く)\nbookmark_label=現在のビュー\n\n# Secondary toolbar and context menu\ntools.title=ツール\ntools_label=ツール\nfirst_page.title=最初のページへ移動します\nfirst_page.label=最初のページへ移動\nfirst_page_label=最初のページへ移動\nlast_page.title=最後のページへ移動します\nlast_page.label=最後のページへ移動\nlast_page_label=最後のページへ移動\npage_rotate_cw.title=ページを右へ回転します\npage_rotate_cw.label=右回転\npage_rotate_cw_label=右回転\npage_rotate_ccw.title=ページを左へ回転します\npage_rotate_ccw.label=左回転\npage_rotate_ccw_label=左回転\n\ncursor_text_select_tool.title=テキスト選択ツールを有効にする\ncursor_text_select_tool_label=テキスト選択ツール\ncursor_hand_tool.title=手のひらツールを有効にする\ncursor_hand_tool_label=手のひらツール\n\n# Document properties dialog box\ndocument_properties.title=文書のプロパティ...\ndocument_properties_label=文書のプロパティ...\ndocument_properties_file_name=ファイル名:\ndocument_properties_file_size=ファイルサイズ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=タイトル:\ndocument_properties_author=作成者:\ndocument_properties_subject=件名:\ndocument_properties_keywords=キーワード:\ndocument_properties_creation_date=作成日:\ndocument_properties_modification_date=更新日:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=アプリケーション:\ndocument_properties_producer=PDF 作成:\ndocument_properties_version=PDF のバージョン:\ndocument_properties_page_count=ページ数:\ndocument_properties_close=閉じる\n\nprint_progress_message=文書の印刷を準備しています...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=キャンセル\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=サイドバー表示を切り替えます\ntoggle_sidebar_notification.title=サイドバー表示を切り替えます (文書に含まれるアウトライン / 添付)\ntoggle_sidebar_label=サイドバーの切り替え\ndocument_outline.title=文書の目次を表示します (ダブルクリックで項目を開閉します)\ndocument_outline_label=文書の目次\nattachments.title=添付ファイルを表示します\nattachments_label=添付ファイル\nthumbs.title=縮小版を表示します\nthumbs_label=縮小版\nfindbar.title=文書内を検索します\nfindbar_label=検索\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} ページ\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=ページの縮小版 {{page}}\n\n# Find panel button title and messages\nfind_input.title=検索\nfind_input.placeholder=文書内を検索...\nfind_previous.title=現在より前の位置で指定文字列が現れる部分を検索します\nfind_previous_label=前へ\nfind_next.title=現在より後の位置で指定文字列が現れる部分を検索します\nfind_next_label=次へ\nfind_highlight=すべて強調表示\nfind_match_case_label=大文字/小文字を区別\nfind_reached_top=文書先頭に到達したので末尾から続けて検索します\nfind_reached_bottom=文書末尾に到達したので先頭から続けて検索します\nfind_not_found=見つかりませんでした\n\n# Error panel labels\nerror_more_info=詳細情報\nerror_less_info=詳細情報を隠す\nerror_close=閉じる\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (ビルド: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=メッセージ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=スタック: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ファイル: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=行: {{line}}\nrendering_error=ページのレンダリング中にエラーが発生しました。\n\n# Predefined zoom values\npage_scale_width=幅に合わせる\npage_scale_fit=ページのサイズに合わせる\npage_scale_auto=自動ズーム\npage_scale_actual=実際のサイズ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=エラー\nloading_error=PDF の読み込み中にエラーが発生しました。\ninvalid_file_error=無効または破損した PDF ファイル。\nmissing_file_error=PDF ファイルが見つかりません。\nunexpected_response_error=サーバーから予期せぬ応答がありました。\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} 注釈]\npassword_label=この PDF ファイルを開くためのパスワードを入力してください。\npassword_invalid=無効なパスワードです。もう一度やり直してください。\npassword_ok=OK\npassword_cancel=キャンセル\n\nprinting_not_supported=警告: このブラウザーでは印刷が完全にサポートされていません。\nprinting_not_ready=警告: PDF を印刷するための読み込みが終了していません。\nweb_fonts_disabled=ウェブフォントが無効になっています: 埋め込まれた PDF のフォントを使用できません。\ndocument_colors_not_allowed=PDF 文書は、ウェブページが指定した配色を使用することができません: 'ウェブページが指定した配色' はブラウザーで無効になっています。\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ka/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=წინა გვერდი\nprevious_label=წინა\nnext.title=შემდეგი გვერდი\nnext_label=შემდეგი\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=გვერდი\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}}-დან\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} {{pagesCount}}-დან)\n\nzoom_out.title=დაშორება\nzoom_out_label=დაშორება\nzoom_in.title=მიახლოება\nzoom_in_label=მიახლოება\nzoom.title=ზომის ცვლილება\npresentation_mode.title=პრეზენტაციის რეჟიმზე გადართვა\npresentation_mode_label=პრეზენტაციის რეჟიმი\nopen_file.title=ფაილის გახსნა\nopen_file_label=გახსნა\nprint.title=დაბეჭდვა\nprint_label=დაბეჭდვა\ndownload.title=ჩამოტვირთვა\ndownload_label=ჩამოტვირთვა\nbookmark.title=მიმდინარე ხედი (დაკოპირება ან გახსნა ახალ ფანჯარაში)\nbookmark_label=მიმდინარე ხედი\n\n# Secondary toolbar and context menu\ntools.title=ხელსაწყოები\ntools_label=ხელსაწყოები\nfirst_page.title=პირველ გვერდზე გადასვლა\nfirst_page.label=პირველ გვერდზე გადასვლა\nfirst_page_label=პირველ გვერდზე გადასვლა\nlast_page.title=ბოლო გვერდზე გადასვლა\nlast_page.label=ბოლო გვერდზე გადასვლა\nlast_page_label=ბოლო გვერდზე გადასვლა\npage_rotate_cw.title=ისრის მიმართულებით შებრუნება\npage_rotate_cw.label=ისრის მიმართულებით შებრუნება\npage_rotate_cw_label=ისრის მიმართულებით შებრუნება\npage_rotate_ccw.title=ისრის საპირისპიროდ შებრუნება\npage_rotate_ccw.label=ისრის საპირისპიროდ შებრუნება\npage_rotate_ccw_label=ისრის საპირისპიროდ შებრუნება\n\ncursor_text_select_tool.title=მოსანიშნი კურსორის ჩართვა\ncursor_text_select_tool_label=მოსანიშნი კურსორი\ncursor_hand_tool.title=გადასაადგილებელი კურსორის ჩართვა\ncursor_hand_tool_label=გადასაადგილებელი კურსორი\n\n# Document properties dialog box\ndocument_properties.title=დოკუმენტის თვისებები…\ndocument_properties_label=დოკუმენტის თვისებები…\ndocument_properties_file_name=ფაილის სახელი:\ndocument_properties_file_size=ფაილის ზომა:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} კბ ({{size_b}} ბაიტი)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} მბ ({{size_b}} ბაიტი)\ndocument_properties_title=სათაური:\ndocument_properties_author=ავტორი:\ndocument_properties_subject=თემა:\ndocument_properties_keywords=საკვანძო სიტყვები:\ndocument_properties_creation_date=შექმნის თარიღი:\ndocument_properties_modification_date=სახეცვალების თარიღი:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=შემქმნელი:\ndocument_properties_producer=PDF მწარმოებელი:\ndocument_properties_version=PDF ვერსია:\ndocument_properties_page_count=გვერდების რაოდენობა:\ndocument_properties_close=დახურვა\n\nprint_progress_message=დოკუმენტი მზადდება ამოსაბეჭდად…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=გაუქმება\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=გვერდითა ზოლის გამოჩენა\ntoggle_sidebar_notification.title=გვერდითა ზოლის ჩართვა/გამორთვა (დოკუმენტი შეიცავს მოხაზულობა/დანართს)\ntoggle_sidebar_label=გვერდითა ზოლის გამოჩენა\ndocument_outline.title=დოკუმენტის მოხაზულობის ჩვენება (ორჯერ დაწკაპებით ყველა ელემენტის გაშლა/აკეცვა)\ndocument_outline_label=დოკუმენტის მოხაზულობა\nattachments.title=დანართების ჩვენება\nattachments_label=დანართები\nthumbs.title=ესკიზების ჩვენება\nthumbs_label=ესკიზები\nfindbar.title=ძიება დოკუმენტში\nfindbar_label=ძიება\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=გვერდი {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=გვერდის ესკიზი {{page}}\n\n# Find panel button title and messages\nfind_input.title=ძიება\nfind_input.placeholder=ძიება დოკუმენტში…\nfind_previous.title=ფრაზის წინა კონტექსტის პოვნა\nfind_previous_label=წინა\nfind_next.title=ფრაზის შემდეგი კონტექსტის პოვნა\nfind_next_label=შემდეგი\nfind_highlight=ყველას მონიშვნა\nfind_match_case_label=მთავრულის გათვალისწინება\nfind_reached_top=მიღწეულია დოკუმენტის ზედა წერტილამდე, გრძელდება ქვემოდან\nfind_reached_bottom=მიღწეულია დოკუმენტის ბოლო წერტილამდე, გრძელდება ზემოდან\nfind_not_found=კონტექსტი ვერ მოიძებნა\n\n# Error panel labels\nerror_more_info=დამატებითი ინფორმაცია\nerror_less_info=ნაკლები ინფორმაცია\nerror_close=დახურვა\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=შეტყობინება: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=სტეკი: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ფაილი: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ხაზი: {{line}}\nrendering_error=გვერდის რენდერისას დაფიქსირდა შეცდომა.\n\n# Predefined zoom values\npage_scale_width=გვერდის სიგანე\npage_scale_fit=გვერდის მორგება\npage_scale_auto=ზომის ავტომატური ცვლილება\npage_scale_actual=აქტუალური ზომა\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=შეცდომა\nloading_error=PDF-ის ჩატვირთვისას დაფიქსირდა შეცდომა.\ninvalid_file_error=არამართებული ან დაზიანებული PDF ფაილი.\nmissing_file_error=ნაკლული PDF ფაილი.\nunexpected_response_error=სერვერის მოულოდნელი პასუხი.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} ანოტაცია]\npassword_label=შეიყვანეთ პაროლი, რათა გახსნათ ეს PDF ფაილი.\npassword_invalid=არასწორი პაროლი. გთხოვთ, სცადეთ ხელახლა.\npassword_ok=კარგი\npassword_cancel=გაუქმება\n\nprinting_not_supported=გაფრთხილება: ამ ბრაუზერის მიერ დაბეჭდვა ბოლომდე მხარდაჭერილი არაა.\nprinting_not_ready=გაფრთხილება: PDF ამობეჭდვისთვის ბოლომდე ჩატვირთული არაა.\nweb_fonts_disabled=ვებშრიფტები გამორთულია: ჩაშენებული PDF შრიფტების გამოყენება ვერ ხერხდება.\ndocument_colors_not_allowed=PDF დოკუმენტებს არ აქვთ საკუთარი ფერების გამოყენების უფლება: ბრაუზერში გამორთულია \"გვერდებისთვის საკუთარი ფერების გამოყენების უფლება\".\n"
  },
  {
    "path": "example/pages/include/pdf/locale/kk/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Алдыңғы парақ\nprevious_label=Алдыңғысы\nnext.title=Келесі парақ\nnext_label=Келесі\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Парақ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} ішінен\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=(парақ {{pageNumber}}, {{pagesCount}} ішінен)\n\nzoom_out.title=Кішірейту\nzoom_out_label=Кішірейту\nzoom_in.title=Үлкейту\nzoom_in_label=Үлкейту\nzoom.title=Масштаб\npresentation_mode.title=Презентация режиміне ауысу\npresentation_mode_label=Презентация режимі\nopen_file.title=Файлды ашу\nopen_file_label=Ашу\nprint.title=Баспаға шығару\nprint_label=Баспаға шығару\ndownload.title=Жүктеп алу\ndownload_label=Жүктеп алу\nbookmark.title=Ағымдағы көрініс (көшіру не жаңа терезеде ашу)\nbookmark_label=Ағымдағы көрініс\n\n# Secondary toolbar and context menu\ntools.title=Саймандар\ntools_label=Саймандар\nfirst_page.title=Алғашқы параққа өту\nfirst_page.label=Алғашқы параққа өту\nfirst_page_label=Алғашқы параққа өту\nlast_page.title=Соңғы параққа өту\nlast_page.label=Соңғы параққа өту\nlast_page_label=Соңғы параққа өту\npage_rotate_cw.title=Сағат тілі бағытымен айналдыру\npage_rotate_cw.label=Сағат тілі бағытымен бұру\npage_rotate_cw_label=Сағат тілі бағытымен бұру\npage_rotate_ccw.title=Сағат тілі бағытына қарсы бұру\npage_rotate_ccw.label=Сағат тілі бағытына қарсы бұру\npage_rotate_ccw_label=Сағат тілі бағытына қарсы бұру\n\ncursor_text_select_tool.title=Мәтінді таңдау сайманын іске қосу\ncursor_text_select_tool_label=Мәтінді таңдау сайманы\ncursor_hand_tool.title=Қол сайманын іске қосу\ncursor_hand_tool_label=Қол сайманы\n\n# Document properties dialog box\ndocument_properties.title=Құжат қасиеттері…\ndocument_properties_label=Құжат қасиеттері…\ndocument_properties_file_name=Файл аты:\ndocument_properties_file_size=Файл өлшемі:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} байт)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} байт)\ndocument_properties_title=Тақырыбы:\ndocument_properties_author=Авторы:\ndocument_properties_subject=Тақырыбы:\ndocument_properties_keywords=Кілт сөздер:\ndocument_properties_creation_date=Жасалған күні:\ndocument_properties_modification_date=Түзету күні:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Жасаған:\ndocument_properties_producer=PDF өндірген:\ndocument_properties_version=PDF нұсқасы:\ndocument_properties_page_count=Беттер саны:\ndocument_properties_close=Жабу\n\nprint_progress_message=Құжатты баспаға шығару үшін дайындау…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Бас тарту\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Бүйір панелін көрсету/жасыру\ntoggle_sidebar_notification.title=Бүйір панелін көрсету/жасыру (құжатта құрылымы/салынымдар бар)\ntoggle_sidebar_label=Бүйір панелін көрсету/жасыру\ndocument_outline.title=Құжат құрылымын көрсету (барлық нәрселерді жазық қылу/жинау үшін қос шерту керек)\ndocument_outline_label=Құжат құрамасы\nattachments.title=Салынымдарды көрсету\nattachments_label=Салынымдар\nthumbs.title=Кіші көріністерді көрсету\nthumbs_label=Кіші көріністер\nfindbar.title=Құжаттан табу\nfindbar_label=Табу\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} парағы\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} парағы үшін кіші көрінісі\n\n# Find panel button title and messages\nfind_input.title=Табу\nfind_input.placeholder=Құжаттан табу…\nfind_previous.title=Осы сөздердің мәтіннен алдыңғы кездесуін табу\nfind_previous_label=Алдыңғысы\nfind_next.title=Осы сөздердің мәтіннен келесі кездесуін табу\nfind_next_label=Келесі\nfind_highlight=Барлығын түспен ерекшелеу\nfind_match_case_label=Регистрді ескеру\nfind_reached_top=Құжаттың басына жеттік, соңынан бастап жалғастырамыз\nfind_reached_bottom=Құжаттың соңына жеттік, басынан бастап жалғастырамыз\nfind_not_found=Сөз(дер) табылмады\n\n# Error panel labels\nerror_more_info=Көбірек ақпарат\nerror_less_info=Азырақ ақпарат\nerror_close=Жабу\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (жинақ: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Хабарлама: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стек: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Жол: {{line}}\nrendering_error=Парақты өңдеу кезінде қате кетті.\n\n# Predefined zoom values\npage_scale_width=Парақ ені\npage_scale_fit=Парақты сыйдыру\npage_scale_auto=Автомасштабтау\npage_scale_actual=Нақты өлшемі\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Қате\nloading_error=PDF жүктеу кезінде қате кетті.\ninvalid_file_error=Зақымдалған немесе қате PDF файл.\nmissing_file_error=PDF файлы жоқ.\nunexpected_response_error=Сервердің күтпеген жауабы.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} аңдатпасы]\npassword_label=Бұл PDF файлын ашу үшін парольді енгізіңіз.\npassword_invalid=Пароль дұрыс емес. Қайталап көріңіз.\npassword_ok=ОК\npassword_cancel=Бас тарту\n\nprinting_not_supported=Ескерту: Баспаға шығаруды бұл браузер толығымен қолдамайды.\nprinting_not_ready=Ескерту: Баспаға шығару үшін, бұл PDF толығымен жүктеліп алынбады.\nweb_fonts_disabled=Веб қаріптері сөндірілген: құрамына енгізілген PDF қаріптерін қолдану мүмкін емес.\ndocument_colors_not_allowed=PDF құжаттарына өздік түстерді қолдану рұқсат етілмеген: бұл браузерде 'Веб-сайттарға өздерінің түстерін қолдануға рұқсат беру' мүмкіндігі сөндірулі тұр.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/km/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=ទំព័រ​មុន\nprevious_label=មុន\nnext.title=ទំព័រ​បន្ទាប់\nnext_label=បន្ទាប់\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=ទំព័រ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=នៃ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} នៃ {{pagesCount}})\n\nzoom_out.title=​បង្រួម\nzoom_out_label=​បង្រួម\nzoom_in.title=​ពង្រីក\nzoom_in_label=​ពង្រីក\nzoom.title=ពង្រីក\npresentation_mode.title=ប្ដូរ​ទៅ​របៀប​បទ​បង្ហាញ\npresentation_mode_label=របៀប​បទ​បង្ហាញ\nopen_file.title=បើក​ឯកសារ\nopen_file_label=បើក\nprint.title=បោះពុម្ព\nprint_label=បោះពុម្ព\ndownload.title=ទាញ​យក\ndownload_label=ទាញ​យក\nbookmark.title=ទិដ្ឋភាព​បច្ចុប្បន្ន (ចម្លង ឬ​បើក​នៅ​ក្នុង​បង្អួច​ថ្មី)\nbookmark_label=ទិដ្ឋភាព​បច្ចុប្បន្ន\n\n# Secondary toolbar and context menu\ntools.title=ឧបករណ៍\ntools_label=ឧបករណ៍\nfirst_page.title=ទៅកាន់​ទំព័រ​ដំបូង​\nfirst_page.label=ទៅកាន់​ទំព័រ​ដំបូង​\nfirst_page_label=ទៅកាន់​ទំព័រ​ដំបូង​\nlast_page.title=ទៅកាន់​ទំព័រ​ចុងក្រោយ​\nlast_page.label=ទៅកាន់​ទំព័រ​ចុងក្រោយ​\nlast_page_label=ទៅកាន់​ទំព័រ​ចុងក្រោយ\npage_rotate_cw.title=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា\npage_rotate_cw.label=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា\npage_rotate_cw_label=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា\npage_rotate_ccw.title=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​\npage_rotate_ccw.label=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​\npage_rotate_ccw_label=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​\n\ncursor_text_select_tool.title=បើក​ឧបករណ៍​ជ្រើស​អត្ថបទ\ncursor_text_select_tool_label=ឧបករណ៍​ជ្រើស​អត្ថបទ\ncursor_hand_tool.title=បើក​ឧបករណ៍​ដៃ\ncursor_hand_tool_label=ឧបករណ៍​ដៃ\n\n# Document properties dialog box\ndocument_properties.title=លក្ខណ​សម្បត្តិ​ឯកសារ…\ndocument_properties_label=លក្ខណ​សម្បត្តិ​ឯកសារ…\ndocument_properties_file_name=ឈ្មោះ​ឯកសារ៖\ndocument_properties_file_size=ទំហំ​ឯកសារ៖\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} បៃ)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} បៃ)\ndocument_properties_title=ចំណងជើង៖\ndocument_properties_author=អ្នក​និពន្ធ៖\ndocument_properties_subject=ប្រធានបទ៖\ndocument_properties_keywords=ពាក្យ​គន្លឹះ៖\ndocument_properties_creation_date=កាលបរិច្ឆេទ​បង្កើត៖\ndocument_properties_modification_date=កាលបរិច្ឆេទ​កែប្រែ៖\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=អ្នក​បង្កើត៖\ndocument_properties_producer=កម្មវិធី​បង្កើត PDF ៖\ndocument_properties_version=កំណែ PDF ៖\ndocument_properties_page_count=ចំនួន​ទំព័រ៖\ndocument_properties_close=បិទ\n\nprint_progress_message=កំពុង​រៀបចំ​ឯកសារ​សម្រាប់​បោះពុម្ព…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=បោះបង់\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=បិទ/បើក​គ្រាប់​រំកិល\ntoggle_sidebar_notification.title=បិទ/បើក​របារ​ចំហៀង (ឯកសារ​មាន​មាតិកា​នៅ​ក្រៅ/attachments)\ntoggle_sidebar_label=បិទ/បើក​គ្រាប់​រំកិល\ndocument_outline.title=បង្ហាញ​គ្រោង​ឯកសារ (ចុច​ទ្វេ​ដង​ដើម្បី​ពង្រីក/បង្រួម​ធាតុ​ទាំងអស់)\ndocument_outline_label=គ្រោង​ឯកសារ\nattachments.title=បង្ហាញ​ឯកសារ​ភ្ជាប់\nattachments_label=ឯកសារ​ភ្ជាប់\nthumbs.title=បង្ហាញ​រូបភាព​តូចៗ\nthumbs_label=រួបភាព​តូចៗ\nfindbar.title=រក​នៅ​ក្នុង​ឯកសារ\nfindbar_label=រក\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=ទំព័រ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=រូបភាព​តូច​របស់​ទំព័រ {{page}}\n\n# Find panel button title and messages\nfind_input.title=រក\nfind_input.placeholder=រក​នៅ​ក្នុង​ឯកសារ...\nfind_previous.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​មុន\nfind_previous_label=មុន\nfind_next.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​បន្ទាប់\nfind_next_label=បន្ទាប់\nfind_highlight=បន្លិច​ទាំងអស់\nfind_match_case_label=ករណី​ដំណូច\nfind_reached_top=បាន​បន្ត​ពី​ខាង​ក្រោម ទៅ​ដល់​ខាង​​លើ​នៃ​ឯកសារ\nfind_reached_bottom=បាន​បន្ត​ពី​ខាងលើ ទៅដល់​ចុង​​នៃ​ឯកសារ\nfind_not_found=រក​មិន​ឃើញ​ពាក្យ ឬ​ឃ្លា\n\n# Error panel labels\nerror_more_info=ព័ត៌មាន​បន្ថែម\nerror_less_info=ព័ត៌មាន​តិចតួច\nerror_close=បិទ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=សារ ៖ {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ជង់ ៖ {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ឯកសារ ៖ {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ជួរ ៖ {{line}}\nrendering_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​បង្ហាញ​ទំព័រ ។\n\n# Predefined zoom values\npage_scale_width=ទទឹង​ទំព័រ\npage_scale_fit=សម​ទំព័រ\npage_scale_auto=ពង្រីក​ស្វ័យប្រវត្តិ\npage_scale_actual=ទំហំ​ជាក់ស្ដែង\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=កំហុស\nloading_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​កំពុង​ផ្ទុក PDF ។\ninvalid_file_error=ឯកសារ PDF ខូច ឬ​មិន​ត្រឹមត្រូវ ។\nmissing_file_error=បាត់​ឯកសារ PDF\nunexpected_response_error=ការ​ឆ្លើយ​តម​ម៉ាស៊ីន​មេ​ដែល​មិន​បាន​រំពឹង។\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} ចំណារ​ពន្យល់]\npassword_label=បញ្ចូល​ពាក្យសម្ងាត់​ដើម្បី​បើក​ឯកសារ PDF នេះ។\npassword_invalid=ពាក្យសម្ងាត់​មិន​ត្រឹមត្រូវ។ សូម​ព្យាយាម​ម្ដងទៀត។\npassword_ok=យល់​ព្រម\npassword_cancel=បោះបង់\n\nprinting_not_supported=ការ​ព្រមាន ៖ កា​រ​បោះពុម្ព​មិន​ត្រូវ​បាន​គាំទ្រ​ពេញលេញ​ដោយ​កម្មវិធី​រុករក​នេះ​ទេ ។\nprinting_not_ready=ព្រមាន៖ PDF មិន​ត្រូវ​បាន​ផ្ទុក​ទាំងស្រុង​ដើម្បី​បោះពុម្ព​ទេ។\nweb_fonts_disabled=បាន​បិទ​ពុម្ពអក្សរ​បណ្ដាញ ៖ មិន​អាច​ប្រើ​ពុម្ពអក្សរ PDF ដែល​បាន​បង្កប់​បាន​ទេ ។\ndocument_colors_not_allowed=ឯកសារ PDF មិន​ត្រូវ​បាន​អនុញ្ញាត​ឲ្យ​ប្រើ​ពណ៌​ផ្ទាល់​របស់​វា​ទេ៖ 'អនុញ្ញាត​​ឲ្យ​ទំព័រ​ជ្រើស​ពណ៌​ផ្ទាល់​ខ្លួន' ត្រូវ​បាន​ធ្វើ​ឲ្យ​អសកម្ម​ក្នុង​​កម្មវិធី​រុករក។\n"
  },
  {
    "path": "example/pages/include/pdf/locale/kn/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=ಹಿಂದಿನ ಪುಟ\nprevious_label=ಹಿಂದಿನ\nnext.title=ಮುಂದಿನ ಪುಟ\nnext_label=ಮುಂದಿನ\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} ರಲ್ಲಿ\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=ಕಿರಿದಾಗಿಸು\nzoom_out_label=ಕಿರಿದಾಗಿಸಿ\nzoom_in.title=ಹಿರಿದಾಗಿಸು\nzoom_in_label=ಹಿರಿದಾಗಿಸಿ\nzoom.title=ಗಾತ್ರಬದಲಿಸು\npresentation_mode.title=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮಕ್ಕೆ ಬದಲಾಯಿಸು\npresentation_mode_label=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮ\nopen_file.title=ಕಡತವನ್ನು ತೆರೆ\nopen_file_label=ತೆರೆಯಿರಿ\nprint.title=ಮುದ್ರಿಸು\nprint_label=ಮುದ್ರಿಸಿ\ndownload.title=ಇಳಿಸು\ndownload_label=ಇಳಿಸಿಕೊಳ್ಳಿ\nbookmark.title=ಪ್ರಸಕ್ತ ನೋಟ (ಪ್ರತಿ ಮಾಡು ಅಥವ ಹೊಸ ಕಿಟಕಿಯಲ್ಲಿ ತೆರೆ)\nbookmark_label=ಪ್ರಸಕ್ತ ನೋಟ\n\n# Secondary toolbar and context menu\ntools.title=ಉಪಕರಣಗಳು\ntools_label=ಉಪಕರಣಗಳು\nfirst_page.title=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು\nfirst_page.label=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು\nfirst_page_label=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು\nlast_page.title=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು\nlast_page.label=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು\nlast_page_label=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು\npage_rotate_cw.title=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\npage_rotate_cw.label=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\npage_rotate_cw_label=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\npage_rotate_ccw.title=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\npage_rotate_ccw.label=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\npage_rotate_ccw_label=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\n\n\n# Document properties dialog box\ndocument_properties.title=ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು...\ndocument_properties_label=ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು...\ndocument_properties_file_name=ಕಡತದ ಹೆಸರು:\ndocument_properties_file_size=ಕಡತದ ಗಾತ್ರ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} ಬೈಟ್‍ಗಳು)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} ಬೈಟ್‍ಗಳು)\ndocument_properties_title=ಶೀರ್ಷಿಕೆ:\ndocument_properties_author=ಕರ್ತೃ:\ndocument_properties_subject=ವಿಷಯ:\ndocument_properties_keywords=ಮುಖ್ಯಪದಗಳು:\ndocument_properties_creation_date=ರಚಿಸಿದ ದಿನಾಂಕ:\ndocument_properties_modification_date=ಮಾರ್ಪಡಿಸಲಾದ ದಿನಾಂಕ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=ರಚಿಸಿದವರು:\ndocument_properties_producer=PDF ಉತ್ಪಾದಕ:\ndocument_properties_version=PDF ಆವೃತ್ತಿ:\ndocument_properties_page_count=ಪುಟದ ಎಣಿಕೆ:\ndocument_properties_close=ಮುಚ್ಚು\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು\ntoggle_sidebar_label=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು\ndocument_outline_label=ದಸ್ತಾವೇಜಿನ ಹೊರರೇಖೆ\nattachments.title=ಲಗತ್ತುಗಳನ್ನು ತೋರಿಸು\nattachments_label=ಲಗತ್ತುಗಳು\nthumbs.title=ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು\nthumbs_label=ಚಿಕ್ಕಚಿತ್ರಗಳು\nfindbar.title=ದಸ್ತಾವೇಜಿನಲ್ಲಿ ಹುಡುಕು\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=ಪುಟ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=ಪುಟವನ್ನು ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು {{page}}\n\n# Find panel button title and messages\nfind_previous.title=ವಾಕ್ಯದ ಹಿಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು\nfind_previous_label=ಹಿಂದಿನ\nfind_next.title=ವಾಕ್ಯದ ಮುಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು\nfind_next_label=ಮುಂದಿನ\nfind_highlight=ಎಲ್ಲವನ್ನು ಹೈಲೈಟ್ ಮಾಡು\nfind_match_case_label=ಕೇಸನ್ನು ಹೊಂದಿಸು\nfind_reached_top=ದಸ್ತಾವೇಜಿನ ಮೇಲ್ಭಾಗವನ್ನು ತಲುಪಿದೆ, ಕೆಳಗಿನಿಂದ ಆರಂಭಿಸು\nfind_reached_bottom=ದಸ್ತಾವೇಜಿನ ಕೊನೆಯನ್ನು ತಲುಪಿದೆ, ಮೇಲಿನಿಂದ ಆರಂಭಿಸು\nfind_not_found=ವಾಕ್ಯವು ಕಂಡು ಬಂದಿಲ್ಲ\n\n# Error panel labels\nerror_more_info=ಹೆಚ್ಚಿನ ಮಾಹಿತಿ\nerror_less_info=ಕಡಿಮೆ ಮಾಹಿತಿ\nerror_close=ಮುಚ್ಚು\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=ಸಂದೇಶ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ರಾಶಿ: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ಕಡತ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ಸಾಲು: {{line}}\nrendering_error=ಪುಟವನ್ನು ನಿರೂಪಿಸುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ.\n\n# Predefined zoom values\npage_scale_width=ಪುಟದ ಅಗಲ\npage_scale_fit=ಪುಟದ ಸರಿಹೊಂದಿಕೆ\npage_scale_auto=ಸ್ವಯಂಚಾಲಿತ ಗಾತ್ರಬದಲಾವಣೆ\npage_scale_actual=ನಿಜವಾದ ಗಾತ್ರ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=ದೋಷ\nloading_error=PDF ಅನ್ನು ಲೋಡ್ ಮಾಡುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ.\ninvalid_file_error=ಅಮಾನ್ಯವಾದ ಅಥವ ಹಾಳಾದ PDF ಕಡತ.\nmissing_file_error=PDF ಕಡತ ಇಲ್ಲ.\nunexpected_response_error=ಅನಿರೀಕ್ಷಿತವಾದ ಪೂರೈಕೆಗಣಕದ ಪ್ರತಿಕ್ರಿಯೆ.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} ಟಿಪ್ಪಣಿ]\npassword_label=PDF ಅನ್ನು ತೆರೆಯಲು ಗುಪ್ತಪದವನ್ನು ನಮೂದಿಸಿ.\npassword_invalid=ಅಮಾನ್ಯವಾದ ಗುಪ್ತಪದ, ದಯವಿಟ್ಟು ಇನ್ನೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.\npassword_ok=OK\n\nprinting_not_supported=ಎಚ್ಚರಿಕೆ: ಈ ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ ಮುದ್ರಣಕ್ಕೆ ಸಂಪೂರ್ಣ ಬೆಂಬಲವಿಲ್ಲ.\nprinting_not_ready=ಎಚ್ಚರಿಕೆ: PDF ಕಡತವು ಮುದ್ರಿಸಲು ಸಂಪೂರ್ಣವಾಗಿ ಲೋಡ್ ಆಗಿಲ್ಲ.\nweb_fonts_disabled=ಜಾಲ ಅಕ್ಷರಶೈಲಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ: ಅಡಕಗೊಳಿಸಿದ PDF ಅಕ್ಷರಶೈಲಿಗಳನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ.\ndocument_colors_not_allowed=PDF ದಸ್ತಾವೇಜುಗಳು ತಮ್ಮದೆ ಆದ ಬಣ್ಣಗಳನ್ನು ಬಳಸಲು ಅನುಮತಿ ಇರುವುದಿಲ್ಲ: 'ಪುಟಗಳು ತಮ್ಮದೆ ಆದ ಬಣ್ಣವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಅನುಮತಿಸು' ಅನ್ನು ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿರುತ್ತದೆ.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ko/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=이전 페이지\nprevious_label=이전\nnext.title=다음 페이지\nnext_label=다음\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=페이지\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=전체 {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pagesCount}} 중 {{pageNumber}})\n\nzoom_out.title=축소\nzoom_out_label=축소\nzoom_in.title=확대\nzoom_in_label=확대\nzoom.title=크기\npresentation_mode.title=발표 모드로 전환\npresentation_mode_label=발표 모드\nopen_file.title=파일 열기\nopen_file_label=열기\nprint.title=인쇄\nprint_label=인쇄\ndownload.title=다운로드\ndownload_label=다운로드\nbookmark.title=지금 보이는 그대로 (복사하거나 새 창에 열기)\nbookmark_label=지금 보이는 그대로\n\n# Secondary toolbar and context menu\ntools.title=도구\ntools_label=도구\nfirst_page.title=첫 페이지로 이동\nfirst_page.label=첫 페이지로 이동\nfirst_page_label=첫 페이지로 이동\nlast_page.title=마지막 페이지로 이동\nlast_page.label=마지막 페이지로 이동\nlast_page_label=마지막 페이지로 이동\npage_rotate_cw.title=시계방향으로 회전\npage_rotate_cw.label=시계방향으로 회전\npage_rotate_cw_label=시계방향으로 회전\npage_rotate_ccw.title=시계 반대방향으로 회전\npage_rotate_ccw.label=시계 반대방향으로 회전\npage_rotate_ccw_label=시계 반대방향으로 회전\n\ncursor_text_select_tool.title=텍스트 선택 도구 활성화\ncursor_text_select_tool_label=텍스트 선택 도구\ncursor_hand_tool.title=손 도구 활성화\ncursor_hand_tool_label=손 도구\n\n# Document properties dialog box\ndocument_properties.title=문서 속성…\ndocument_properties_label=문서 속성…\ndocument_properties_file_name=파일 이름:\ndocument_properties_file_size=파일 사이즈:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}}바이트)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}}바이트)\ndocument_properties_title=제목:\ndocument_properties_author=저자:\ndocument_properties_subject=주제:\ndocument_properties_keywords=키워드:\ndocument_properties_creation_date=생성일:\ndocument_properties_modification_date=수정일:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=생성자:\ndocument_properties_producer=PDF 생성기:\ndocument_properties_version=PDF 버전:\ndocument_properties_page_count=총 페이지:\ndocument_properties_close=닫기\n\nprint_progress_message=문서 출력 준비중…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=취소\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=탐색창 열고 닫기\ntoggle_sidebar_notification.title=탐색창 열고 닫기 (문서에 아웃라인이나 첨부파일이 들어있음)\ntoggle_sidebar_label=탐색창 열고 닫기\ndocument_outline.title=문서 아웃라인 보기(더블 클릭해서 모든 항목 열고 닫기)\ndocument_outline_label=문서 아웃라인\nattachments.title=첨부파일 보기\nattachments_label=첨부파일\nthumbs.title=미리보기\nthumbs_label=미리보기\nfindbar.title=검색\nfindbar_label=검색\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}}쪽\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}쪽 미리보기\n\n# Find panel button title and messages\nfind_input.title=찾기\nfind_input.placeholder=문서에서 찾기…\nfind_previous.title=지정 문자열에 일치하는 1개 부분을 검색\nfind_previous_label=이전\nfind_next.title=지정 문자열에 일치하는 다음 부분을 검색\nfind_next_label=다음\nfind_highlight=모두 강조 표시\nfind_match_case_label=대문자/소문자 구별\nfind_reached_top=문서 처음까지 검색하고 끝으로 돌아와 검색했습니다.\nfind_reached_bottom=문서 끝까지 검색하고 앞으로 돌아와 검색했습니다.\nfind_not_found=검색 결과 없음\n\n# Error panel labels\nerror_more_info=정보 더 보기\nerror_less_info=정보 간단히 보기\nerror_close=닫기\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (빌드: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=메시지: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=스택: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=파일: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=줄 번호: {{line}}\nrendering_error=페이지를 렌더링하다 오류가 났습니다.\n\n# Predefined zoom values\npage_scale_width=페이지 너비에 맞춤\npage_scale_fit=페이지에 맞춤\npage_scale_auto=알아서 맞춤\npage_scale_actual=실제 크기에 맞춤\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=오류\nloading_error=PDF를 읽는 중 오류가 생겼습니다.\ninvalid_file_error=유효하지 않거나 파손된 PDF 파일\nmissing_file_error=PDF 파일이 없습니다.\nunexpected_response_error=알 수 없는 서버 응답입니다.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} 주석]\npassword_label=이 PDF 파일을 열 수 있는 암호를 입력하십시오.\npassword_invalid=잘못된 암호입니다. 다시 시도해 주십시오.\npassword_ok=확인\npassword_cancel=취소\n\nprinting_not_supported=경고: 이 브라우저는 인쇄를 완전히 지원하지 않습니다.\nprinting_not_ready=경고: 이 PDF를 인쇄를 할 수 있을 정도로 읽어들이지 못했습니다.\nweb_fonts_disabled=웹 폰트가 꺼져있음: 내장된 PDF 글꼴을 쓸 수 없습니다.\ndocument_colors_not_allowed=PDF 문서의 색상을 쓰지 못하게 되어 있음: '웹 페이지 자체 색상 사용 허용'이 브라우저에서 꺼져 있습니다.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ku/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Rûpela berê\nprevious_label=Paşve\nnext.title=Rûpela pêş\nnext_label=Pêş\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Dûr bike\nzoom_out_label=Dûr bike\nzoom_in.title=Nêzîk bike\nzoom_in_label=Nêzîk bike\nzoom.title=Nêzîk Bike\npresentation_mode.title=Derbasî mûda pêşkêşkariyê bibe\npresentation_mode_label=Moda Pêşkêşkariyê\nopen_file.title=Pelî veke\nopen_file_label=Veke\nprint.title=Çap bike\nprint_label=Çap bike\ndownload.title=Jêbar bike\ndownload_label=Jêbar bike\nbookmark.title=Xuyakirina niha (kopî yan jî di pencereyeke nû de veke)\nbookmark_label=Xuyakirina niha\n\n# Secondary toolbar and context menu\ntools.title=Amûr\ntools_label=Amûr\nfirst_page.title=Here rûpela yekemîn\nfirst_page.label=Here rûpela yekemîn\nfirst_page_label=Here rûpela yekemîn\nlast_page.title=Here rûpela dawîn\nlast_page.label=Here rûpela dawîn\nlast_page_label=Here rûpela dawîn\npage_rotate_cw.title=Bi aliyê saetê ve bizivirîne\npage_rotate_cw.label=Bi aliyê saetê ve bizivirîne\npage_rotate_cw_label=Bi aliyê saetê ve bizivirîne\npage_rotate_ccw.title=Berevajî aliyê saetê ve bizivirîne\npage_rotate_ccw.label=Berevajî aliyê saetê ve bizivirîne\npage_rotate_ccw_label=Berevajî aliyê saetê ve bizivirîne\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Sernav:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Darikê kêlekê veke/bigire\ntoggle_sidebar_label=Darikê kêlekê veke/bigire\ndocument_outline_label=Şemaya belgeyê\nthumbs.title=Wênekokan nîşan bide\nthumbs_label=Wênekok\nfindbar.title=Di belgeyê de bibîne\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Rûpel {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Wênekoka rûpelê {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Peyva berê bibîne\nfind_previous_label=Paşve\nfind_next.title=Peyya pêş bibîne\nfind_next_label=Pêşve\nfind_highlight=Tevî beloq bike\nfind_match_case_label=Ji bo tîpên hûrdek-girdek bihîstyar\nfind_reached_top=Gihîşt serê rûpelê, ji dawiya rûpelê bidomîne\nfind_reached_bottom=Gihîşt dawiya rûpelê, ji serê rûpelê bidomîne\nfind_not_found=Peyv nehat dîtin\n\n# Error panel labels\nerror_more_info=Zêdetir agahî\nerror_less_info=Zêdetir agahî\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js versiyon {{version}} (avanî: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Peyam: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Komik: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Pel: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rêzik: {{line}}\nrendering_error=Di vehûrandina rûpelê de çewtî çêbû.\n\n# Predefined zoom values\npage_scale_width=Firehiya rûpelê\npage_scale_fit=Di rûpelê de bicî bike\npage_scale_auto=Xweber nêzîk bike\npage_scale_actual=Mezinahiya rastîn\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Xeletî\nloading_error=Dema ku PDF dihat barkirin çewtiyek çêbû.\ninvalid_file_error=Pelê PDFê nederbasdar yan jî xirabe ye.\nmissing_file_error=Pelê PDFê kêm e.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Nîşaneya {{type}}ê]\npassword_label=Ji bo PDFê vekî şîfreyê binivîse.\npassword_invalid=Şîfre çewt e. Tika ye dîsa biceribîne.\npassword_ok=Temam\n\nprinting_not_supported=Hişyarî: Çapkirin ji hêla vê gerokê ve bi temamî nayê destekirin.\nprinting_not_ready=Hişyarî: PDF bi temamî nehat barkirin û ji bo çapê ne amade ye.\nweb_fonts_disabled=Fontên Webê neçalak in: Fontên PDFê yên veşartî nayên bikaranîn.\ndocument_colors_not_allowed=Destûr tune ye ku belgeyên PDFê rengên xwe bi kar bînin: Di gerokê de 'destûrê bide rûpelan ku rengên xwe bi kar bînin' nehatiye çalakirin.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/lg/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Omuko  Ogubadewo\nnext.title=Omuko Oguddako\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=ku {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Zimbulukusa\nzoom_out_label=Zimbulukusa\nzoom_in.title=Funza Munda\nzoom_in_label=Funza Munda\nzoom.title=Gezzamu\nopen_file.title=Bikula Fayiro\nopen_file_label=Ggulawo\nprint.title=Fulumya\nprint_label=Fulumya\ndownload.title=Tikula\ndownload_label=Tikula\nbookmark.title=Endabika eriwo (koppa oba gulawo mu diriisa epya)\nbookmark_label=Endabika Eriwo\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ndocument_outline_label=Ensalo ze Ekiwandiko\nthumbs.title=Laga Ekifanyi Mubufunze\nthumbs_label=Ekifanyi Mubufunze\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Omuko {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Ekifananyi kyo Omuko Mubufunze {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Zuula awayise mukweddamu mumiteddera\nfind_next.title=Zuula ekidako mukweddamu mumiteddera\nfind_highlight=Londa byonna\nfind_not_found=Emiteddera tezuuliddwa\n\n# Error panel labels\nerror_more_info=Ebisingawo\nerror_less_info=Mubumpimpi\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Obubaaka: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Ebipangiddwa: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fayiro {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Layini: {{line}}\nrendering_error=Wabadewo ensobi muku tekawo omuko.\n\n# Predefined zoom values\npage_scale_width=Obugazi bwo Omuko\npage_scale_fit=Okutuka kwo Omuko\npage_scale_auto=Okwefunza no Kwegeza\npage_scale_actual=Obunene Obutufu\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Ensobi\nloading_error=Wabadewo ensobi mukutika PDF.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Enyonyola]\npassword_ok=OK\n\nprinting_not_supported=Okulaabula: Okulumya empapula tekuwagirwa enonyeso enno.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/lij/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pagina primma\nprevious_label=Precedente\nnext.title=Pagina dòppo\nnext_label=Pròscima\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pagina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Diminoisci zoom\nzoom_out_label=Diminoisci zoom\nzoom_in.title=Aomenta zoom\nzoom_in_label=Aomenta zoom\nzoom.title=Zoom\npresentation_mode.title=Vanni into mòddo de prezentaçion\npresentation_mode_label=Mòddo de prezentaçion\nopen_file.title=Arvi file\nopen_file_label=Arvi\nprint.title=Stanpa\nprint_label=Stanpa\ndownload.title=Descaregamento\ndownload_label=Descaregamento\nbookmark.title=Vixon corente (còpia ò arvi inte 'n neuvo barcon)\nbookmark_label=Vixon corente\n\n# Secondary toolbar and context menu\ntools.title=Strumenti\ntools_label=Strumenti\nfirst_page.title=Vanni a-a primma pagina\nfirst_page.label=Vanni a-a primma pagina\nfirst_page_label=Vanni a-a primma pagina\nlast_page.title=Vanni a l'urtima pagina\nlast_page.label=Vanni a l'urtima pagina\nlast_page_label=Vanni a l'urtima pagina\npage_rotate_cw.title=Gia into verso oraio\npage_rotate_cw.label=Gia in senso do releuio\npage_rotate_cw_label=Gia into verso oraio\npage_rotate_ccw.title=Gia into verso antioraio\npage_rotate_ccw.label=Gia in senso do releuio a-a reversa\npage_rotate_ccw_label=Gia into verso antioraio\n\n\n# Document properties dialog box\ndocument_properties.title=Propietæ do documento…\ndocument_properties_label=Propietæ do documento…\ndocument_properties_file_name=Nomme file:\ndocument_properties_file_size=Dimenscion file:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kB ({{size_b}} byte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_kb}} MB ({{size_b}} byte)\ndocument_properties_title=Titolo:\ndocument_properties_author=Aoto:\ndocument_properties_subject=Ogetto:\ndocument_properties_keywords=Paròlle ciave:\ndocument_properties_creation_date=Dæta creaçion:\ndocument_properties_modification_date=Dæta cangiamento:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Aotô originale:\ndocument_properties_producer=Produtô PDF:\ndocument_properties_version=Verscion PDF:\ndocument_properties_page_count=Contezzo pagine:\ndocument_properties_close=Særa\n\nprint_progress_message=Praparo o documento pe-a stanpa…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Anulla\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Ativa/dizativa bara de scianco\ntoggle_sidebar_notification.title=Cangia bara de löo (o documento o contegne di alegæ)\ntoggle_sidebar_label=Ativa/dizativa bara de scianco\ndocument_outline.title=Fanni vedde o contorno do documento (scicca doggio pe espande/ridue tutti i elementi)\ndocument_outline_label=Contorno do documento\nattachments.title=Fanni vedde alegæ\nattachments_label=Alegæ\nthumbs.title=Mostra miniatue\nthumbs_label=Miniatue\nfindbar.title=Treuva into documento\nfindbar_label=Treuva\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatua da pagina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Treuva\nfind_input.placeholder=Treuva into documento…\nfind_previous.title=Treuva a ripetiçion precedente do testo da çercâ\nfind_previous_label=Precedente\nfind_next.title=Treuva a ripetiçion dòppo do testo da çercâ\nfind_next_label=Segoente\nfind_highlight=Evidençia\nfind_match_case_label=Maioscole/minoscole\nfind_reached_top=Razonto a fin da pagina, continoa da l'iniçio\nfind_reached_bottom=Razonto l'iniçio da pagina, continoa da-a fin\nfind_not_found=Testo no trovou\n\n# Error panel labels\nerror_more_info=Ciù informaçioin\nerror_less_info=Meno informaçioin\nerror_close=Særa\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesaggio: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linia: {{line}}\nrendering_error=Gh'é stæto 'n'erô itno rendering da pagina.\n\n# Predefined zoom values\npage_scale_width=Larghessa pagina\npage_scale_fit=Adatta a una pagina\npage_scale_auto=Zoom aotomatico\npage_scale_actual=Dimenscioin efetive\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Erô\nloading_error=S'é verificou 'n'erô itno caregamento do PDF.\ninvalid_file_error=O file PDF o l'é no valido ò aroinou.\nmissing_file_error=O file PDF o no gh'é.\nunexpected_response_error=Risposta inprevista do-u server\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotaçion: {{type}}]\npassword_label=Dimme a paròlla segreta pe arvî sto file PDF.\npassword_invalid=Paròlla segreta sbalia. Preuva torna.\npassword_ok=Va ben\npassword_cancel=Anulla\n\nprinting_not_supported=Atençion: a stanpa a no l'é conpletamente soportâ da sto navegatô.\nprinting_not_ready=Atençion: o PDF o no l'é ancon caregou conpletamente pe-a stanpa.\nweb_fonts_disabled=I font do web en dizativæ: inposcibile adeuviâ i carateri do PDF.\ndocument_colors_not_allowed=No l'é poscibile adeuviâ i pròpi coî pe-i documenti PDF: l'opçion do navegatô  “Permetti a-e pagine de çerne i pròpi coî in cangio de quelli inpostæ” a l'é dizativâ.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/locale.properties",
    "content": "[ach]\n@import url(ach/viewer.properties)\n\n[af]\n@import url(af/viewer.properties)\n\n[ak]\n@import url(ak/viewer.properties)\n\n[an]\n@import url(an/viewer.properties)\n\n[ar]\n@import url(ar/viewer.properties)\n\n[as]\n@import url(as/viewer.properties)\n\n[ast]\n@import url(ast/viewer.properties)\n\n[az]\n@import url(az/viewer.properties)\n\n[be]\n@import url(be/viewer.properties)\n\n[bg]\n@import url(bg/viewer.properties)\n\n[bn-BD]\n@import url(bn-BD/viewer.properties)\n\n[bn-IN]\n@import url(bn-IN/viewer.properties)\n\n[br]\n@import url(br/viewer.properties)\n\n[bs]\n@import url(bs/viewer.properties)\n\n[ca]\n@import url(ca/viewer.properties)\n\n[cs]\n@import url(cs/viewer.properties)\n\n[csb]\n@import url(csb/viewer.properties)\n\n[cy]\n@import url(cy/viewer.properties)\n\n[da]\n@import url(da/viewer.properties)\n\n[de]\n@import url(de/viewer.properties)\n\n[el]\n@import url(el/viewer.properties)\n\n[en-GB]\n@import url(en-GB/viewer.properties)\n\n[en-US]\n@import url(en-US/viewer.properties)\n\n[en-ZA]\n@import url(en-ZA/viewer.properties)\n\n[eo]\n@import url(eo/viewer.properties)\n\n[es-AR]\n@import url(es-AR/viewer.properties)\n\n[es-CL]\n@import url(es-CL/viewer.properties)\n\n[es-ES]\n@import url(es-ES/viewer.properties)\n\n[es-MX]\n@import url(es-MX/viewer.properties)\n\n[et]\n@import url(et/viewer.properties)\n\n[eu]\n@import url(eu/viewer.properties)\n\n[fa]\n@import url(fa/viewer.properties)\n\n[ff]\n@import url(ff/viewer.properties)\n\n[fi]\n@import url(fi/viewer.properties)\n\n[fr]\n@import url(fr/viewer.properties)\n\n[fy-NL]\n@import url(fy-NL/viewer.properties)\n\n[ga-IE]\n@import url(ga-IE/viewer.properties)\n\n[gd]\n@import url(gd/viewer.properties)\n\n[gl]\n@import url(gl/viewer.properties)\n\n[gu-IN]\n@import url(gu-IN/viewer.properties)\n\n[he]\n@import url(he/viewer.properties)\n\n[hi-IN]\n@import url(hi-IN/viewer.properties)\n\n[hr]\n@import url(hr/viewer.properties)\n\n[hu]\n@import url(hu/viewer.properties)\n\n[hy-AM]\n@import url(hy-AM/viewer.properties)\n\n[id]\n@import url(id/viewer.properties)\n\n[is]\n@import url(is/viewer.properties)\n\n[it]\n@import url(it/viewer.properties)\n\n[ja]\n@import url(ja/viewer.properties)\n\n[ka]\n@import url(ka/viewer.properties)\n\n[kk]\n@import url(kk/viewer.properties)\n\n[km]\n@import url(km/viewer.properties)\n\n[kn]\n@import url(kn/viewer.properties)\n\n[ko]\n@import url(ko/viewer.properties)\n\n[ku]\n@import url(ku/viewer.properties)\n\n[lg]\n@import url(lg/viewer.properties)\n\n[lij]\n@import url(lij/viewer.properties)\n\n[lt]\n@import url(lt/viewer.properties)\n\n[lv]\n@import url(lv/viewer.properties)\n\n[mai]\n@import url(mai/viewer.properties)\n\n[mk]\n@import url(mk/viewer.properties)\n\n[ml]\n@import url(ml/viewer.properties)\n\n[mn]\n@import url(mn/viewer.properties)\n\n[mr]\n@import url(mr/viewer.properties)\n\n[ms]\n@import url(ms/viewer.properties)\n\n[my]\n@import url(my/viewer.properties)\n\n[nb-NO]\n@import url(nb-NO/viewer.properties)\n\n[nl]\n@import url(nl/viewer.properties)\n\n[nn-NO]\n@import url(nn-NO/viewer.properties)\n\n[nso]\n@import url(nso/viewer.properties)\n\n[oc]\n@import url(oc/viewer.properties)\n\n[or]\n@import url(or/viewer.properties)\n\n[pa-IN]\n@import url(pa-IN/viewer.properties)\n\n[pl]\n@import url(pl/viewer.properties)\n\n[pt-BR]\n@import url(pt-BR/viewer.properties)\n\n[pt-PT]\n@import url(pt-PT/viewer.properties)\n\n[rm]\n@import url(rm/viewer.properties)\n\n[ro]\n@import url(ro/viewer.properties)\n\n[ru]\n@import url(ru/viewer.properties)\n\n[rw]\n@import url(rw/viewer.properties)\n\n[sah]\n@import url(sah/viewer.properties)\n\n[si]\n@import url(si/viewer.properties)\n\n[sk]\n@import url(sk/viewer.properties)\n\n[sl]\n@import url(sl/viewer.properties)\n\n[son]\n@import url(son/viewer.properties)\n\n[sq]\n@import url(sq/viewer.properties)\n\n[sr]\n@import url(sr/viewer.properties)\n\n[sv-SE]\n@import url(sv-SE/viewer.properties)\n\n[sw]\n@import url(sw/viewer.properties)\n\n[ta]\n@import url(ta/viewer.properties)\n\n[ta-LK]\n@import url(ta-LK/viewer.properties)\n\n[te]\n@import url(te/viewer.properties)\n\n[th]\n@import url(th/viewer.properties)\n\n[tl]\n@import url(tl/viewer.properties)\n\n[tn]\n@import url(tn/viewer.properties)\n\n[tr]\n@import url(tr/viewer.properties)\n\n[uk]\n@import url(uk/viewer.properties)\n\n[ur]\n@import url(ur/viewer.properties)\n\n[vi]\n@import url(vi/viewer.properties)\n\n[wo]\n@import url(wo/viewer.properties)\n\n[xh]\n@import url(xh/viewer.properties)\n\n[zh-CN]\n@import url(zh-CN/viewer.properties)\n\n[zh-TW]\n@import url(zh-TW/viewer.properties)\n\n[zu]\n@import url(zu/viewer.properties)\n\n"
  },
  {
    "path": "example/pages/include/pdf/locale/lt/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Ankstesnis puslapis\nprevious_label=Ankstesnis\nnext.title=Kitas puslapis\nnext_label=Kitas\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Puslapis\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=iš {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} iš {{pagesCount}})\n\nzoom_out.title=Sumažinti\nzoom_out_label=Sumažinti\nzoom_in.title=Padidinti\nzoom_in_label=Padidinti\nzoom.title=Mastelis\npresentation_mode.title=Pereiti į pateikties veikseną\npresentation_mode_label=Pateikties veiksena\nopen_file.title=Atverti failą\nopen_file_label=Atverti\nprint.title=Spausdinti\nprint_label=Spausdinti\ndownload.title=Parsiųsti\ndownload_label=Parsiųsti\nbookmark.title=Esamojo rodinio saitas (kopijavimui ar atvėrimui kitame lange)\nbookmark_label=Esamasis rodinys\n\n# Secondary toolbar and context menu\ntools.title=Priemonės\ntools_label=Priemonės\nfirst_page.title=Eiti į pirmą puslapį\nfirst_page.label=Eiti į pirmą puslapį\nfirst_page_label=Eiti į pirmą puslapį\nlast_page.title=Eiti į paskutinį puslapį\nlast_page.label=Eiti į paskutinį puslapį\nlast_page_label=Eiti į paskutinį puslapį\npage_rotate_cw.title=Pasukti pagal laikrodžio rodyklę\npage_rotate_cw.label=Pasukti pagal laikrodžio rodyklę\npage_rotate_cw_label=Pasukti pagal laikrodžio rodyklę\npage_rotate_ccw.title=Pasukti prieš laikrodžio rodyklę\npage_rotate_ccw.label=Pasukti prieš laikrodžio rodyklę\npage_rotate_ccw_label=Pasukti prieš laikrodžio rodyklę\n\ncursor_text_select_tool.title=Įjungti teksto žymėjimo įrankį\ncursor_text_select_tool_label=Teksto žymėjimo įrankis\ncursor_hand_tool.title=Įjungti vilkimo įrankį\ncursor_hand_tool_label=Vilkimo įrankis\n\n# Document properties dialog box\ndocument_properties.title=Dokumento savybės…\ndocument_properties_label=Dokumento savybės…\ndocument_properties_file_name=Failo vardas:\ndocument_properties_file_size=Failo dydis:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} B)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} B)\ndocument_properties_title=Antraštė:\ndocument_properties_author=Autorius:\ndocument_properties_subject=Tema:\ndocument_properties_keywords=Reikšminiai žodžiai:\ndocument_properties_creation_date=Sukūrimo data:\ndocument_properties_modification_date=Modifikavimo data:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Kūrėjas:\ndocument_properties_producer=PDF generatorius:\ndocument_properties_version=PDF versija:\ndocument_properties_page_count=Puslapių skaičius:\ndocument_properties_close=Užverti\n\nprint_progress_message=Dokumentas ruošiamas spausdinimui…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Atsisakyti\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Rodyti / slėpti šoninį polangį\ntoggle_sidebar_notification.title=Parankinė (dokumentas turi struktūrą / priedų)\ntoggle_sidebar_label=Šoninis polangis\ndocument_outline.title=Rodyti dokumento struktūrą (spustelėkite dukart norėdami išplėsti/suskleisti visus elementus)\ndocument_outline_label=Dokumento struktūra\nattachments.title=Rodyti priedus\nattachments_label=Priedai\nthumbs.title=Rodyti puslapių miniatiūras\nthumbs_label=Miniatiūros\nfindbar.title=Ieškoti dokumente\nfindbar_label=Rasti\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} puslapis\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} puslapio miniatiūra\n\n# Find panel button title and messages\nfind_input.title=Rasti\nfind_input.placeholder=Rasti dokumente…\nfind_previous.title=Ieškoti ankstesnio frazės egzemplioriaus\nfind_previous_label=Ankstesnis\nfind_next.title=Ieškoti tolesnio frazės egzemplioriaus\nfind_next_label=Tolesnis\nfind_highlight=Viską paryškinti\nfind_match_case_label=Skirti didžiąsias ir mažąsias raides\nfind_reached_top=Pasiekus dokumento pradžią, paieška pratęsta nuo pabaigos\nfind_reached_bottom=Pasiekus dokumento pabaigą, paieška pratęsta nuo pradžios\nfind_not_found=Ieškoma frazė nerasta\n\n# Error panel labels\nerror_more_info=Išsamiau\nerror_less_info=Glausčiau\nerror_close=Užverti\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v. {{version}} (darinys: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Pranešimas: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Dėklas: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Failas: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Eilutė: {{line}}\nrendering_error=Atvaizduojant puslapį įvyko klaida.\n\n# Predefined zoom values\npage_scale_width=Priderinti prie lapo pločio\npage_scale_fit=Pritaikyti prie lapo dydžio\npage_scale_auto=Automatinis mastelis\npage_scale_actual=Tikras dydis\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Klaida\nloading_error=Įkeliant PDF failą įvyko klaida.\ninvalid_file_error=Tai nėra PDF failas arba jis yra sugadintas.\nmissing_file_error=PDF failas nerastas.\nunexpected_response_error=Netikėtas serverio atsakas.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[„{{type}}“ tipo anotacija]\npassword_label=Įveskite slaptažodį šiam PDF failui atverti.\npassword_invalid=Slaptažodis neteisingas. Bandykite dar kartą.\npassword_ok=Gerai\npassword_cancel=Atsisakyti\n\nprinting_not_supported=Dėmesio! Spausdinimas šioje naršyklėje nėra pilnai realizuotas.\nprinting_not_ready=Dėmesio! PDF failas dar nėra pilnai įkeltas spausdinimui.\nweb_fonts_disabled=Saityno šriftai išjungti – PDF faile esančių šriftų naudoti negalima.\ndocument_colors_not_allowed=PDF dokumentams neleidžiama nurodyti savo spalvų, nes išjungta naršyklės nuostata „Leisti tinklalapiams nurodyti spalvas“.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/lv/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Iepriekšējā lapa\nprevious_label=Iepriekšējā\nnext.title=Nākamā lapa\nnext_label=Nākamā\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Lapa\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=no {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} no {{pagesCount}})\n\nzoom_out.title=Attālināt\\u0020\nzoom_out_label=Attālināt\nzoom_in.title=Pietuvināt\nzoom_in_label=Pietuvināt\nzoom.title=Palielinājums\npresentation_mode.title=Pārslēgties uz Prezentācijas režīmu\npresentation_mode_label=Prezentācijas režīms\nopen_file.title=Atvērt failu\nopen_file_label=Atvērt\nprint.title=Drukāšana\nprint_label=Drukāt\ndownload.title=Lejupielāde\ndownload_label=Lejupielādēt\nbookmark.title=Pašreizējais skats (kopēt vai atvērt jaunā logā)\nbookmark_label=Pašreizējais skats\n\n# Secondary toolbar and context menu\ntools.title=Rīki\ntools_label=Rīki\nfirst_page.title=Iet uz pirmo lapu\nfirst_page.label=Iet uz pirmo lapu\nfirst_page_label=Iet uz pirmo lapu\nlast_page.title=Iet uz pēdējo lapu\nlast_page.label=Iet uz pēdējo lapu\nlast_page_label=Iet uz pēdējo lapu\npage_rotate_cw.title=Pagriezt pa pulksteni\npage_rotate_cw.label=Pagriezt pa pulksteni\npage_rotate_cw_label=Pagriezt pa pulksteni\npage_rotate_ccw.title=Pagriezt pret pulksteni\npage_rotate_ccw.label=Pagriezt pret pulksteni\npage_rotate_ccw_label=Pagriezt pret pulksteni\n\n\n# Document properties dialog box\ndocument_properties.title=Dokumenta iestatījumi…\ndocument_properties_label=Dokumenta iestatījumi…\ndocument_properties_file_name=Faila nosaukums:\ndocument_properties_file_size=Faila izmērs:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} biti)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} biti)\ndocument_properties_title=Nosaukums:\ndocument_properties_author=Autors:\ndocument_properties_subject=Tēma:\ndocument_properties_keywords=Atslēgas vārdi:\ndocument_properties_creation_date=Izveides datums:\ndocument_properties_modification_date=LAbošanas datums:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Radītājs:\ndocument_properties_producer=PDF producents:\ndocument_properties_version=PDF versija:\ndocument_properties_page_count=Lapu skaits:\ndocument_properties_close=Aizvērt\n\nprint_progress_message=Gatavo dokumentu drukāšanai...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Atcelt\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Pārslēgt sānu joslu\ntoggle_sidebar_notification.title=Pārslēgt sānu joslu (dokumenta saturu un pielikumus)\ntoggle_sidebar_label=Pārslēgt sānu joslu\ndocument_outline.title=Rādīt dokumenta struktūru (veiciet dubultklikšķi lai izvērstu/sakļautu visus vienumus)\ndocument_outline_label=Dokumenta saturs\nattachments.title=Rādīt pielikumus\nattachments_label=Pielikumi\nthumbs.title=Parādīt sīktēlus\nthumbs_label=Sīktēli\nfindbar.title=Meklēt dokumentā\nfindbar_label=Meklēt\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Lapa {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Lapas {{page}} sīktēls\n\n# Find panel button title and messages\nfind_input.title=Meklēt\nfind_input.placeholder=Meklēt dokumentā…\nfind_previous.title=Atrast iepriekšējo\nfind_previous_label=Iepriekšējā\nfind_next.title=Atrast nākamo\nfind_next_label=Nākamā\nfind_highlight=Iekrāsot visas\nfind_match_case_label=Lielo, mazo burtu jutīgs\nfind_reached_top=Sasniegts dokumenta sākums, turpinām no beigām\nfind_reached_bottom=Sasniegtas dokumenta beigas, turpinām no sākuma\nfind_not_found=Frāze nav atrasta\n\n# Error panel labels\nerror_more_info=Vairāk informācijas\nerror_less_info=MAzāk informācijas\nerror_close=Close\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Ziņojums: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Steks: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rindiņa: {{line}}\nrendering_error=Attēlojot lapu radās kļūda\n\n# Predefined zoom values\npage_scale_width=Lapas platumā\npage_scale_fit=Ietilpinot lapu\npage_scale_auto=Automātiskais izmērs\npage_scale_actual=Patiesais izmērs\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Kļūda\nloading_error=Ielādējot PDF notika kļūda.\ninvalid_file_error=Nederīgs vai bojāts PDF fails.\nmissing_file_error=PDF fails nav atrasts.\nunexpected_response_error=Negaidīa servera atbilde.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} anotācija]\npassword_label=Ievadiet paroli, lai atvērtu PDF failu.\npassword_invalid=Nepareiza parole, mēģiniet vēlreiz.\npassword_ok=Labi\npassword_cancel=Atcelt\n\nprinting_not_supported=Uzmanību: Drukāšana no šī pārlūka darbojas tikai daļēji.\nprinting_not_ready=Uzmanību: PDF nav pilnībā ielādēts drukāšanai.\nweb_fonts_disabled=Tīmekļa fonti nav aktivizēti: Nevar iegult PDF fontus.\ndocument_colors_not_allowed=PDF dokumentiem nav atļauts izmantot pašiem savas krāsas: „Atļaut lapām izvēlēties pašām savas krāsas“ ir deaktivēts pārlūkā.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/mai/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=पछिला पृष्ठ\nprevious_label=पछिला\nnext.title=अगिला पृष्ठ\nnext_label=आगाँ\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=छोट करू\nzoom_out_label=छोट करू\nzoom_in.title=पैघ करू\nzoom_in_label=जूम इन\nzoom.title=छोट-पैघ करू\\u0020\npresentation_mode.title=प्रस्तुति अवस्थामे जाउ\npresentation_mode_label=प्रस्तुति अवस्था\nopen_file.title=फाइल खोलू\nopen_file_label=खोलू\nprint.title=छापू\nprint_label=छापू\ndownload.title=डाउनलोड\ndownload_label=डाउनलोड\nbookmark.title=मोजुदा दृश्य (नव विंडोमे नकल लिअ अथवा खोलू)\nbookmark_label=वर्तमान दृश्य\n\n# Secondary toolbar and context menu\ntools.title=अओजार\ntools_label=अओजार\nfirst_page.title=प्रथम पृष्ठ पर जाउ\nfirst_page.label=प्रथम पृष्ठ पर जाउ\nfirst_page_label=प्रथम पृष्ठ पर जाउ\nlast_page.title=अंतिम पृष्ठ पर जाउ\nlast_page.label=अंतिम पृष्ठ पर जाउ\nlast_page_label=अंतिम पृष्ठ पर जाउ\npage_rotate_cw.title=घड़ीक दिशा मे घुमाउ\npage_rotate_cw.label=घड़ीक दिशा मे घुमाउ\npage_rotate_cw_label=घड़ीक दिशा मे घुमाउ\npage_rotate_ccw.title=घड़ीक दिशा सँ उनटा घुमाउ\npage_rotate_ccw.label=घड़ीक दिशा सँ उनटा घुमाउ\npage_rotate_ccw_label=घड़ीक दिशा सँ उनटा घुमाउ\n\n\n# Document properties dialog box\ndocument_properties.title=दस्तावेज़ विशेषता...\ndocument_properties_label=दस्तावेज़ विशेषता...\ndocument_properties_file_name=फाइल नाम:\ndocument_properties_file_size=फ़ाइल आकार:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} बाइट)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} बाइट)\ndocument_properties_title=शीर्षक:\ndocument_properties_author=लेखकः\ndocument_properties_subject=विषय\ndocument_properties_keywords=बीजशब्द\ndocument_properties_creation_date=निर्माण तिथि:\ndocument_properties_modification_date=संशोधन दिनांक:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=सृजक:\ndocument_properties_producer=PDF उत्पादक:\ndocument_properties_version=PDF संस्करण:\ndocument_properties_page_count=पृष्ठ गिनती:\ndocument_properties_close=बन्न करू\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=स्लाइडर टागल\ntoggle_sidebar_label=स्लाइडर टागल\ndocument_outline_label=दस्तावेज खाका\nattachments.title=संलग्नक देखाबू\nattachments_label=संलग्नक\nthumbs.title=लघु-छवि देखाउ\nthumbs_label=लघु छवि\nfindbar.title=दस्तावेजमे ढूँढू\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=पृष्ठ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=पृष्ठ {{page}} का लघु-चित्र\n\n# Find panel button title and messages\nfind_previous.title=खोजक पछिला उपस्थिति ताकू\nfind_previous_label=पछिला\nfind_next.title=खोजक अगिला उपस्थिति ताकू\nfind_next_label=आगाँ\nfind_highlight=सभटा आलोकित करू\nfind_match_case_label=मिलान स्थिति\nfind_reached_top=पृष्ठक शीर्ष जाए पहुँचल, तल सँ जारी\nfind_reached_bottom=पृष्ठक तल मे जाए पहुँचल, शीर्ष सँ जारी\nfind_not_found=वाकींश नहि भेटल\n\n# Error panel labels\nerror_more_info=बेसी  सूचना\nerror_less_info=कम सूचना\nerror_close=बन्न करू\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=संदेश: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=स्टैक: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=फ़ाइल: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=पंक्ति: {{line}}\nrendering_error=पृष्ठ रेंडरिंगक समय त्रुटि आएल.\n\n# Predefined zoom values\npage_scale_width=पृष्ठ चओड़ाइ\npage_scale_fit=पृष्ठ फिट\npage_scale_auto=स्वचालित जूम\npage_scale_actual=सही आकार\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=त्रुटि\nloading_error=पीडीएफ लोड करैत समय एकटा त्रुटि भेल.\ninvalid_file_error=अमान्य अथवा भ्रष्ट PDF फाइल.\nmissing_file_error=अनुपस्थित PDF फाइल.\nunexpected_response_error=सर्वर सँ अप्रत्याशित प्रतिक्रिया.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=एहि पीडीएफ फ़ाइल केँ खोलबाक लेल कृपया कूटशब्द भरू.\npassword_invalid=अवैध कूटशब्द, कृपया फिनु कोशिश करू.\npassword_ok=बेस\n\nprinting_not_supported=चेतावनी: ई ब्राउजर पर छपाइ पूर्ण तरह सँ समर्थित नहि अछि.\nprinting_not_ready=चेतावनी: पीडीएफ छपाइक लेल पूर्ण तरह सँ लोड नहि अछि.\nweb_fonts_disabled=वेब फॉन्ट्स निष्क्रिय अछि: अंतःस्थापित PDF फान्टसक उपयोगमे असमर्थ.\ndocument_colors_not_allowed=PDF दस्तावेज़ हुकर अपन रंग केँ उपयोग करबाक लेल अनुमति प्राप्त नहि अछि: 'पृष्ठ केँ हुकर अपन रंग केँ चुनबाक लेल स्वीकृति दिअ जे ओ ओहि ब्राउज़र मे निष्क्रिय अछि.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/mk/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Претходна страница\nprevious_label=Претходна\nnext.title=Следна страница\nnext_label=Следна\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Намалување\nzoom_out_label=Намали\nzoom_in.title=Зголемување\nzoom_in_label=Зголеми\nzoom.title=Променување на големина\npresentation_mode.title=Премини во презентациски режим\npresentation_mode_label=Презентациски режим\nopen_file.title=Отворање датотека\nopen_file_label=Отвори\nprint.title=Печатење\nprint_label=Печати\ndownload.title=Преземање\ndownload_label=Преземи\nbookmark.title=Овој преглед (копирај или отвори во нов прозорец)\nbookmark_label=Овој преглед\n\n# Secondary toolbar and context menu\ntools.title=Алатки\nfirst_page.label=Оди до првата страница\nlast_page.label=Оди до последната страница\npage_rotate_cw.label=Ротирај по стрелките на часовникот\npage_rotate_ccw.label=Ротирај спротивно од стрелките на часовникот\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Вклучи странична лента\ntoggle_sidebar_label=Вклучи странична лента\nthumbs.title=Прикажување на икони\nthumbs_label=Икони\nfindbar.title=Најди во документот\nfindbar_label=Најди\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Страница {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Икона од страница {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Најди ја предходната појава на фразата\nfind_previous_label=Претходно\nfind_next.title=Најди ја следната појава на фразата\nfind_next_label=Следно\nfind_highlight=Означи сѐ\nfind_match_case_label=Токму така\nfind_reached_top=Барањето стигна до почетокот на документот и почнува од крајот\nfind_reached_bottom=Барањето стигна до крајот на документот и почнува од почеток\nfind_not_found=Фразата не е пронајдена\n\n# Error panel labels\nerror_more_info=Повеќе информации\nerror_less_info=Помалку информации\nerror_close=Затвори\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Порака: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Датотека: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Линија: {{line}}\nrendering_error=Настана грешка при прикажувањето на страницата.\n\n# Predefined zoom values\npage_scale_width=Ширина на страница\npage_scale_fit=Цела страница\npage_scale_auto=Автоматска големина\npage_scale_actual=Вистинска големина\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Грешка\nloading_error=Настана грешка при вчитувањето на PDF-от.\ninvalid_file_error=Невалидна или корумпирана PDF датотека.\nmissing_file_error=Недостасува PDF документ.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\n\nprinting_not_supported=Предупредување: Печатењето не е целосно поддржано во овој прелистувач.\nprinting_not_ready=Предупредување: PDF документот не е целосно вчитан за печатење.\nweb_fonts_disabled=Интернет фонтовите се оневозможени: не може да се користат вградените PDF фонтови.\ndocument_colors_not_allowed=PDF-документите немаат дозвола да користат сопствени бои: Поставката „Дозволи страниците сами да ги избираат своите бои“ е деактивирана од прелистувачот.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ml/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=മുമ്പുള്ള താള്‍\nprevious_label=മുമ്പു്\nnext.title=അടുത്ത താള്‍\nnext_label=അടുത്തതു്\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=ചെറുതാക്കുക\nzoom_out_label=ചെറുതാക്കുക\nzoom_in.title=വലുതാക്കുക\nzoom_in_label=വലുതാക്കുക\nzoom.title=വ്യാപ്തി മാറ്റുക\npresentation_mode.title=പ്രസന്റേഷന്‍ രീതിയിലേക്കു് മാറ്റുക\npresentation_mode_label=പ്രസന്റേഷന്‍ രീതി\nopen_file.title=ഫയല്‍ തുറക്കുക\nopen_file_label=തുറക്കുക\nprint.title=പ്രിന്റ് ചെയ്യുക\nprint_label=പ്രിന്റ് ചെയ്യുക\ndownload.title=ഡൌണ്‍ലോഡ് ചെയ്യുക\ndownload_label=ഡൌണ്‍ലോഡ് ചെയ്യുക\nbookmark.title=നിലവിലുള്ള കാഴ്ച (പുതിയ ജാലകത്തില്‍ പകര്‍ത്തുക അല്ലെങ്കില്‍ തുറക്കുക)\nbookmark_label=നിലവിലുള്ള കാഴ്ച\n\n# Secondary toolbar and context menu\ntools.title=ഉപകരണങ്ങള്‍\ntools_label=ഉപകരണങ്ങള്‍\nfirst_page.title=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക\nfirst_page.label=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക\nfirst_page_label=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക\nlast_page.title=അവസാന താളിലേയ്ക്കു് പോകുക\nlast_page.label=അവസാന താളിലേയ്ക്കു് പോകുക\nlast_page_label=അവസാന താളിലേയ്ക്കു് പോകുക\npage_rotate_cw.title=ഘടികാരദിശയില്‍ കറക്കുക\npage_rotate_cw.label=ഘടികാരദിശയില്‍ കറക്കുക\npage_rotate_cw_label=ഘടികാരദിശയില്‍ കറക്കുക\npage_rotate_ccw.title=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക\npage_rotate_ccw.label=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക\npage_rotate_ccw_label=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക\n\n\n# Document properties dialog box\ndocument_properties.title=രേഖയുടെ വിശേഷതകള്‍...\ndocument_properties_label=രേഖയുടെ വിശേഷതകള്‍...\ndocument_properties_file_name=ഫയലിന്റെ പേര്‌:\ndocument_properties_file_size=ഫയലിന്റെ വലിപ്പം:‌‌\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} കെബി ({{size_b}} ബൈറ്റുകള്‍)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} എംബി ({{size_b}} ബൈറ്റുകള്‍)\ndocument_properties_title=തലക്കെട്ട്‌\\u0020\ndocument_properties_author=രചയിതാവ്:\ndocument_properties_subject=വിഷയം:\ndocument_properties_keywords=കീവേര്‍ഡുകള്‍:\ndocument_properties_creation_date=പൂര്‍ത്തിയാകുന്ന തീയതി:\ndocument_properties_modification_date=മാറ്റം വരുത്തിയ തീയതി:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=സൃഷ്ടികര്‍ത്താവ്:\ndocument_properties_producer=പിഡിഎഫ് പ്രൊഡ്യൂസര്‍:\ndocument_properties_version=പിഡിഎഫ് പതിപ്പ്:\ndocument_properties_page_count=താളിന്റെ എണ്ണം:\ndocument_properties_close=അടയ്ക്കുക\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=സൈഡ് ബാറിലേക്കു് മാറ്റുക\ntoggle_sidebar_label=സൈഡ് ബാറിലേക്കു് മാറ്റുക\ndocument_outline_label=രേഖയുടെ ഔട്ട്ലൈന്‍\nattachments.title=അറ്റാച്മെന്റുകള്‍ കാണിയ്ക്കുക\nattachments_label=അറ്റാച്മെന്റുകള്‍\nthumbs.title=തംബ്നെയിലുകള്‍ കാണിയ്ക്കുക\nthumbs_label=തംബ്നെയിലുകള്‍\nfindbar.title=രേഖയില്‍ കണ്ടുപിടിയ്ക്കുക\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=താള്‍ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} താളിനുള്ള തംബ്നെയില്‍\n\n# Find panel button title and messages\nfind_previous.title=വാചകം ഇതിനു മുന്‍പ്‌ ആവര്‍ത്തിച്ചത്‌ കണ്ടെത്തുക\\u0020\nfind_previous_label=മുമ്പു്\nfind_next.title=വാചകം വീണ്ടും ആവര്‍ത്തിക്കുന്നത്‌ കണ്ടെത്തുക\\u0020\nfind_next_label=അടുത്തതു്\nfind_highlight=എല്ലാം എടുത്തുകാണിയ്ക്കുക\nfind_match_case_label=അക്ഷരങ്ങള്‍ ഒത്തുനോക്കുക\nfind_reached_top=രേഖയുടെ മുകളില്‍ എത്തിയിരിക്കുന്നു, താഴെ നിന്നും തുടരുന്നു\nfind_reached_bottom=രേഖയുടെ അവസാനം വരെ എത്തിയിരിക്കുന്നു, മുകളില്‍ നിന്നും തുടരുന്നു\\u0020\nfind_not_found=വാചകം കണ്ടെത്താനായില്ല\\u0020\n\n# Error panel labels\nerror_more_info=കൂടുതല്‍ വിവരം\nerror_less_info=കുറച്ച് വിവരം\nerror_close=അടയ്ക്കുക\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=സന്ദേശം: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=സ്റ്റാക്ക്: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ഫയല്‍: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=വരി: {{line}}\nrendering_error=താള്‍ റെണ്ടര്‍ ചെയ്യുമ്പോള്‍‌ പിശകുണ്ടായിരിയ്ക്കുന്നു.\n\n# Predefined zoom values\npage_scale_width=താളിന്റെ വീതി\npage_scale_fit=താള്‍ പാകത്തിനാക്കുക\npage_scale_auto=സ്വയമായി വലുതാക്കുക\npage_scale_actual=യഥാര്‍ത്ഥ വ്യാപ്തി\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=പിശക്\nloading_error=പിഡിഎഫ് ലഭ്യമാക്കുമ്പോള്‍ പിശക് ഉണ്ടായിരിയ്ക്കുന്നു.\ninvalid_file_error=തെറ്റായ അല്ലെങ്കില്‍ തകരാറുള്ള പിഡിഎഫ് ഫയല്‍.\nmissing_file_error=പിഡിഎഫ് ഫയല്‍ ലഭ്യമല്ല.\nunexpected_response_error=പ്രതീക്ഷിക്കാത്ത സെര്‍വര്‍ മറുപടി.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=ഈ പിഡിഎഫ് ഫയല്‍ തുറക്കുന്നതിനു് രഹസ്യവാക്ക് നല്‍കുക.\npassword_invalid=തെറ്റായ രഹസ്യവാക്ക്, ദയവായി വീണ്ടും ശ്രമിയ്ക്കുക.\npassword_ok=ശരി\n\nprinting_not_supported=മുന്നറിയിപ്പു്: ഈ ബ്രൌസര്‍ പൂര്‍ണ്ണമായി പ്രിന്റിങ് പിന്തുണയ്ക്കുന്നില്ല.\nprinting_not_ready=മുന്നറിയിപ്പു്: പ്രിന്റ് ചെയ്യുന്നതിനു് പിഡിഎഫ് പൂര്‍ണ്ണമായി ലഭ്യമല്ല.\nweb_fonts_disabled=വെബിനുള്ള അക്ഷരസഞ്ചയങ്ങള്‍ പ്രവര്‍ത്തന രഹിതം: എംബഡ്ഡ് ചെയ്ത പിഡിഎഫ് അക്ഷരസഞ്ചയങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ സാധ്യമല്ല.\ndocument_colors_not_allowed=സ്വന്തം നിറങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ പിഡിഎഫ് രേഖകള്‍ക്കു് അനുവാദമില്ല:  'സ്വന്തം നിറങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ താളുകളെ അനുവദിയ്ക്കുക' എന്നതു് ബ്രൌസറില്‍ നിര്‍ജീവമാണു്.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/mn/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom.title=Тэлэлт\nopen_file.title=Файл нээ\nopen_file_label=Нээ\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\ndocument_properties_file_name=Файлын нэр:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Гарчиг:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\n\n# Find panel button title and messages\nfind_previous.title=Хайлтын өмнөх олдцыг харуулна\nfind_next.title=Хайлтын дараагийн олдцыг харуулна\nfind_not_found=Олдсонгүй\n\n# Error panel labels\nerror_more_info=Нэмэлт мэдээлэл\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\n\n# Predefined zoom values\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Алдаа\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_ok=OK\n\n"
  },
  {
    "path": "example/pages/include/pdf/locale/mr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=मागील पृष्ठ\nprevious_label=मागील\nnext.title=पुढील पृष्ठ\nnext_label=पुढील\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=पृष्ठ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pageCount}}पैकी\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pagesCount}} पैकी {{pageNumber}})\n\nzoom_out.title=छोटे करा\nzoom_out_label=छोटे करा\nzoom_in.title=मोठे करा\nzoom_in_label=मोठे करा\nzoom.title=लहान किंवा मोठे करा\npresentation_mode.title=प्रस्तुतिकरण मोडचा वापर करा\npresentation_mode_label=प्रस्तुतिकरण मोड\nopen_file.title=फाइल उघडा\nopen_file_label=उघडा\nprint.title=छपाई करा\nprint_label=छपाई करा\ndownload.title=डाउनलोड करा\ndownload_label=डाउनलोड करा\nbookmark.title=सध्याचे अवलोकन (नवीन पटलात प्रत बनवा किंवा उघडा)\nbookmark_label=सध्याचे अवलोकन\n\n# Secondary toolbar and context menu\ntools.title=साधने\ntools_label=साधने\nfirst_page.title=पहिल्या पृष्ठावर जा\nfirst_page.label=पहिल्या पृष्ठावर जा\nfirst_page_label=पहिल्या पृष्ठावर जा\nlast_page.title=शेवटच्या पृष्ठावर जा\nlast_page.label=शेवटच्या पृष्ठावर जा\nlast_page_label=शेवटच्या पृष्ठावर जा\npage_rotate_cw.title=घड्याळाच्या काट्याच्या दिशेने फिरवा\npage_rotate_cw.label=घड्याळाच्या काट्याच्या दिशेने फिरवा\npage_rotate_cw_label=घड्याळाच्या काट्याच्या दिशेने फिरवा\npage_rotate_ccw.title=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा\npage_rotate_ccw.label=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा\npage_rotate_ccw_label=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा\n\ncursor_text_select_tool.title=मजकूर निवड साधन कार्यान्वयीत करा\ncursor_text_select_tool_label=मजकूर निवड साधन\ncursor_hand_tool.title=हात साधन कार्यान्वित करा\ncursor_hand_tool_label=हस्त साधन\n\n# Document properties dialog box\ndocument_properties.title=दस्तऐवज गुणधर्म…\ndocument_properties_label=दस्तऐवज गुणधर्म…\ndocument_properties_file_name=फाइलचे नाव:\ndocument_properties_file_size=फाइल आकार:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} बाइट्स)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} बाइट्स)\ndocument_properties_title=शिर्षक:\ndocument_properties_author=लेखक:\ndocument_properties_subject=विषय:\ndocument_properties_keywords=मुख्यशब्द:\ndocument_properties_creation_date=निर्माण दिनांक:\ndocument_properties_modification_date=दुरूस्ती दिनांक:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=निर्माता:\ndocument_properties_producer=PDF निर्माता:\ndocument_properties_version=PDF आवृत्ती:\ndocument_properties_page_count=पृष्ठ संख्या:\ndocument_properties_close=बंद करा\n\nprint_progress_message=छपाई करीता पृष्ठ तयार करीत आहे…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=रद्द करा\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=बाजूचीपट्टी टॉगल करा\ntoggle_sidebar_notification.title=बाजूची पट्टी टॉगल करा (दस्तऐवजामध्ये रुपरेषा/जोडण्या आहेत)\ntoggle_sidebar_label=बाजूचीपट्टी टॉगल करा\ndocument_outline.title=दस्तऐवज बाह्यरेखा दर्शवा (विस्तृत करण्यासाठी दोनवेळा क्लिक करा /सर्व घटक दाखवा)\ndocument_outline_label=दस्तऐवज रूपरेषा\nattachments.title=जोडपत्र दाखवा\nattachments_label=जोडपत्र\nthumbs.title=थंबनेल्स् दाखवा\nthumbs_label=थंबनेल्स्\nfindbar.title=दस्तऐवजात शोधा\nfindbar_label=शोधा\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=पृष्ठ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=पृष्ठाचे थंबनेल {{page}}\n\n# Find panel button title and messages\nfind_input.title=शोधा\nfind_input.placeholder=दस्तऐवजात शोधा…\nfind_previous.title=वाकप्रयोगची मागील घटना शोधा\nfind_previous_label=मागील\nfind_next.title=वाकप्रयोगची पुढील घटना शोधा\nfind_next_label=पुढील\nfind_highlight=सर्व ठळक करा\nfind_match_case_label=आकार जुळवा\nfind_reached_top=दस्तऐवजाच्या शीर्षकास पोहचले, तळपासून पुढे\nfind_reached_bottom=दस्तऐवजाच्या तळाला पोहचले, शीर्षकापासून पुढे\nfind_not_found=वाकप्रयोग आढळले नाही\n\n# Error panel labels\nerror_more_info=आणखी माहिती\nerror_less_info=कमी माहिती\nerror_close=बंद करा\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=संदेश: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=स्टॅक: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=फाइल: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=रेष: {{line}}\nrendering_error=पृष्ठ दाखवतेवेळी त्रुटी आढळली.\n\n# Predefined zoom values\npage_scale_width=पृष्ठाची रूंदी\npage_scale_fit=पृष्ठ बसवा\npage_scale_auto=स्वयं लाहन किंवा मोठे करणे\npage_scale_actual=प्रत्यक्ष आकार\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=त्रुटी\nloading_error=PDF लोड करतेवेळी त्रुटी आढळली.\ninvalid_file_error=अवैध किंवा दोषीत PDF फाइल.\nmissing_file_error=न आढळणारी PDF फाइल.\nunexpected_response_error=अनपेक्षित सर्व्हर प्रतिसाद.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} टिपण्णी]\npassword_label=ही PDF फाइल उघडण्याकरिता पासवर्ड द्या.\npassword_invalid=अवैध पासवर्ड. कृपया पुन्हा प्रयत्न करा.\npassword_ok=ठीक आहे\npassword_cancel=रद्द करा\n\nprinting_not_supported=सावधानता: या ब्राउझरतर्फे छपाइ पूर्णपणे समर्थीत नाही.\nprinting_not_ready=सावधानता: छपाईकरिता PDF पूर्णतया लोड झाले नाही.\nweb_fonts_disabled=वेब टंक असमर्थीत आहेत: एम्बेडेड PDF टंक वापर अशक्य.\ndocument_colors_not_allowed=PDF दस्तऐवजांना त्यांचे रंग वापरण्यास अनुमती नाही: ब्राउझरमध्ये ' पृष्ठांना त्यांचे रंग निवडण्यास अनुमती द्या' बंद केले आहे.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ms/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Halaman Sebelum\nprevious_label=Terdahulu\nnext.title=Halaman Seterusnya\nnext_label=Berikut\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Halaman\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=daripada {{pageCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} daripada {{pagesCount}})\n\nzoom_out.title=Zum Keluar\nzoom_out_label=Zum Keluar\nzoom_in.title=Zum Masuk\nzoom_in_label=Zum Masuk\nzoom.title=Zum\npresentation_mode.title=Tukar ke Mod Persembahan\npresentation_mode_label=Mod Persembahan\nopen_file.title=Buka Fail\nopen_file_label=Buka\nprint.title=Cetak\nprint_label=Cetak\ndownload.title=Muat turun\ndownload_label=Muat turun\nbookmark.title=Paparan semasa (salin atau buka dalam tetingkap baru)\nbookmark_label=Paparan Semasa\n\n# Secondary toolbar and context menu\ntools.title=Alatan\ntools_label=Alatan\nfirst_page.title=Pergi ke Halaman Pertama\nfirst_page.label=Pergi ke Halaman Pertama\nfirst_page_label=Pergi ke Halaman Pertama\nlast_page.title=Pergi ke Halaman Terakhir\nlast_page.label=Pergi ke Halaman Terakhir\nlast_page_label=Pergi ke Halaman Terakhir\npage_rotate_cw.title=Berputar ikut arah Jam\npage_rotate_cw.label=Berputar ikut arah Jam\npage_rotate_cw_label=Berputar ikut arah Jam\npage_rotate_ccw.title=Pusing berlawan arah jam\npage_rotate_ccw.label=Pusing berlawan arah jam\npage_rotate_ccw_label=Pusing berlawan arah jam\n\ncursor_text_select_tool.title=Dayakan Alatan Pilihan Teks\ncursor_text_select_tool_label=Alatan Pilihan Teks\ncursor_hand_tool.title=Dayakan Alatan Tangan\ncursor_hand_tool_label=Alatan Tangan\n\n# Document properties dialog box\ndocument_properties.title=Sifat Dokumen…\ndocument_properties_label=Sifat Dokumen…\ndocument_properties_file_name=Nama fail:\ndocument_properties_file_size=Saiz fail:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bait)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bait)\ndocument_properties_title=Tajuk:\ndocument_properties_author=Pengarang:\ndocument_properties_subject=Subjek:\ndocument_properties_keywords=Kata kunci:\ndocument_properties_creation_date=Masa Dicipta:\ndocument_properties_modification_date=Tarikh Ubahsuai:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Pencipta:\ndocument_properties_producer=Pengeluar PDF:\ndocument_properties_version=Versi PDF:\ndocument_properties_page_count=Kiraan Laman:\ndocument_properties_close=Tutup\n\nprint_progress_message=Menyediakan dokumen untuk dicetak…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Batal\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Togol Bar Sisi\ntoggle_sidebar_notification.title=Togol Sidebar (dokumen mengandungi rangka/attachments)\ntoggle_sidebar_label=Togol Bar Sisi\ndocument_outline.title=Papar Rangka Dokumen (klik-dua-kali untuk kembangkan/kolaps semua item)\ndocument_outline_label=Rangka Dokumen\nattachments.title=Papar Lampiran\nattachments_label=Lampiran\nthumbs.title=Papar Thumbnails\nthumbs_label=Imej kecil\nfindbar.title=Cari didalam Dokumen\nfindbar_label=Cari\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Halaman {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Halaman Imej kecil {{page}}\n\n# Find panel button title and messages\nfind_input.title=Cari\nfind_input.placeholder=Cari dalam dokumen…\nfind_previous.title=Cari teks frasa berkenaan yang terdahulu\nfind_previous_label=Sebelumnya\nfind_next.title=Cari teks frasa berkenaan yang berikut\nfind_next_label=Berikut\nfind_highlight=Serlahkan semua\nfind_match_case_label=Kes Sepadan\nfind_reached_top=Mencapai teratas daripada dokumen, sambungan daripada bawah\nfind_reached_bottom=Mencapai terakhir daripada dokumen, sambungan daripada atas\nfind_not_found=Frasa tidak ditemui\n\n# Error panel labels\nerror_more_info=Maklumat lanjut\nerror_less_info=Kurang Informasi\nerror_close=Tutup\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesej: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Timbun: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fail: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Garis: {{line}}\nrendering_error=Ralat berlaku ketika memberikan halaman.\n\n# Predefined zoom values\npage_scale_width=Lebar Halaman\npage_scale_fit=Muat Halaman\npage_scale_auto=Zoom Automatik\npage_scale_actual=Saiz Sebenar\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Ralat\nloading_error=Masalah berlaku semasa menuatkan sebuah PDF.\ninvalid_file_error=Tidak sah atau fail PDF rosak.\nmissing_file_error=Fail PDF Hilang.\nunexpected_response_error=Respon pelayan yang tidak dijangka.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Anotasi]\npassword_label=Masukan kata kunci untuk membuka fail PDF ini.\npassword_invalid=Kata laluan salah. Cuba lagi.\npassword_ok=OK\npassword_cancel=Batal\n\nprinting_not_supported=Amaran: Cetakan ini tidak sepenuhnya disokong oleh pelayar ini.\nprinting_not_ready=Amaran: PDF tidak sepenuhnya dimuatkan untuk dicetak.\nweb_fonts_disabled=Fon web dinyahdayakan: tidak dapat menggunakan fon terbenam PDF.\ndocument_colors_not_allowed=Dokumen PDF tidak dibenarkan untuk menggunakan warna sendiri: “Izinkan halaman untuk memilih warna sendiri” telah dinyahaktifkan dalam pelayar.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/my/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=အရင် စာမျက်နှာ\nprevious_label=အရင်နေရာ\nnext.title=ရှေ့ စာမျက်နှာ\nnext_label=နောက်တခု\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=စာမျက်နှာ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} ၏\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pagesCount}} ၏ {{pageNumber}})\n\nzoom_out.title=ချုံ့ပါ\nzoom_out_label=ချုံ့ပါ\nzoom_in.title=ချဲ့ပါ\nzoom_in_label=ချဲ့ပါ\nzoom.title=ချုံ့/ချဲ့ပါ\npresentation_mode.title=ဆွေးနွေးတင်ပြစနစ်သို့ ကူးပြောင်းပါ\npresentation_mode_label=ဆွေးနွေးတင်ပြစနစ်\nopen_file.title=ဖိုင်အားဖွင့်ပါ။\nopen_file_label=ဖွင့်ပါ\nprint.title=ပုံနှိုပ်ပါ\nprint_label=ပုံနှိုပ်ပါ\ndownload.title=ကူးဆွဲ\ndownload_label=ကူးဆွဲ\nbookmark.title=လက်ရှိ မြင်ကွင်း (ဝင်းဒိုးအသစ်မှာ ကူးပါ သို့မဟုတ် ဖွင့်ပါ)\nbookmark_label=လက်ရှိ မြင်ကွင်း\n\n# Secondary toolbar and context menu\ntools.title=ကိရိယာများ\ntools_label=ကိရိယာများ\nfirst_page.title=ပထမ စာမျက်နှာသို့\nfirst_page.label=ပထမ စာမျက်နှာသို့\nfirst_page_label=ပထမ စာမျက်နှာသို့\nlast_page.title=နောက်ဆုံး စာမျက်နှာသို့\nlast_page.label=နောက်ဆုံး စာမျက်နှာသို့\nlast_page_label=နောက်ဆုံး စာမျက်နှာသို့\npage_rotate_cw.title=နာရီလက်တံ အတိုင်း\npage_rotate_cw.label=နာရီလက်တံ အတိုင်း\npage_rotate_cw_label=နာရီလက်တံ အတိုင်း\npage_rotate_ccw.title=နာရီလက်တံ ပြောင်းပြန်\npage_rotate_ccw.label=နာရီလက်တံ ပြောင်းပြန်\npage_rotate_ccw_label=နာရီလက်တံ ပြောင်းပြန်\n\n\n# Document properties dialog box\ndocument_properties.title=မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ\ndocument_properties_label=မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ\ndocument_properties_file_name=ဖိုင် :\ndocument_properties_file_size=ဖိုင်ဆိုဒ် :\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} ကီလိုဘိုတ် ({size_kb}}ဘိုတ်)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=ခေါင်းစဉ်‌ -\ndocument_properties_author=ရေးသားသူ:\ndocument_properties_subject=အကြောင်းအရာ:\\u0020\ndocument_properties_keywords=သော့ချက် စာလုံး:\ndocument_properties_creation_date=ထုတ်လုပ်ရက်စွဲ:\ndocument_properties_modification_date=ပြင်ဆင်ရက်စွဲ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=ဖန်တီးသူ:\ndocument_properties_producer=PDF ထုတ်လုပ်သူ:\ndocument_properties_version=PDF ဗားရှင်း:\ndocument_properties_page_count=စာမျက်နှာအရေအတွက်:\ndocument_properties_close=ပိတ်\n\nprint_progress_message=Preparing document for printing…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=ပယ်​ဖျက်ပါ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ဘေးတန်းဖွင့်ပိတ်\ntoggle_sidebar_notification.title=ဘေးဘားတန်းကို အဖွင့်/အပိတ် လုပ်ရန် (စာတမ်းတွင် outline/attachments ပါဝင်နိုင်သည်)\ntoggle_sidebar_label=ဖွင့်ပိတ် ဆလိုက်ဒါ\ndocument_outline.title=စာတမ်းအကျဉ်းချုပ်ကို ပြပါ (စာရင်းအားလုံးကို ချုံ့/ချဲ့ရန် ကလစ်နှစ်ချက်နှိပ်ပါ)\ndocument_outline_label=စာတမ်းအကျဉ်းချုပ်\nattachments.title=တွဲချက်များ ပြပါ\nattachments_label=တွဲထားချက်များ\nthumbs.title=ပုံရိပ်ငယ်များကို ပြပါ\nthumbs_label=ပုံရိပ်ငယ်များ\nfindbar.title=Find in Document\nfindbar_label=ရှာဖွေပါ\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=စာမျက်နှာ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=စာမျက်နှာရဲ့ ပုံရိပ်ငယ် {{page}}\n\n# Find panel button title and messages\nfind_input.title=ရှာဖွေပါ\nfind_input.placeholder=စာတမ်းထဲတွင် ရှာဖွေရန်…\nfind_previous.title=စကားစုရဲ့ အရင် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ\nfind_previous_label=နောက်သို့\nfind_next.title=စကားစုရဲ့ နောက်ထပ် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ\nfind_next_label=ရှေ့သို့\nfind_highlight=အားလုံးကို မျဉ်းသားပါ\nfind_match_case_label=စာလုံး တိုက်ဆိုင်ပါ\nfind_reached_top=စာမျက်နှာထိပ် ရောက်နေပြီ၊ အဆုံးကနေ ပြန်စပါ\nfind_reached_bottom=စာမျက်နှာအဆုံး ရောက်နေပြီ၊ ထိပ်ကနေ ပြန်စပါ\nfind_not_found=စကားစု မတွေ့ရဘူး\n\n# Error panel labels\nerror_more_info=နောက်ထပ်အချက်အလက်များ\nerror_less_info=အနည်းငယ်မျှသော သတင်းအချက်အလက်\nerror_close=ပိတ်\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=မက်ဆေ့ - {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=အထပ် - {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ဖိုင် {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=လိုင်း - {{line}}\nrendering_error=စာမျက်နှာကို ပုံဖော်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။\n\n# Predefined zoom values\npage_scale_width=စာမျက်နှာ အကျယ်\npage_scale_fit=စာမျက်နှာ ကွက်တိ\npage_scale_auto=အလိုအလျောက် ချုံ့ချဲ့\npage_scale_actual=အမှန်တကယ်ရှိတဲ့ အရွယ်\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=အမှား\nloading_error=PDF ဖိုင် ကိုဆွဲတင်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။\ninvalid_file_error=မရသော သို့ ပျက်နေသော PDF ဖိုင်\nmissing_file_error=PDF ပျောက်ဆုံး\nunexpected_response_error=မမျှော်လင့်ထားသော ဆာဗာမှ ပြန်ကြားချက်\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} အဓိပ္ပာယ်ဖွင့်ဆိုချက်]\npassword_label=PDF အားဖွင့်ရန် ပတ်စ်ဝတ်အားထည့်ပါ\npassword_invalid=စာဝှက် မှားသည်။ ထပ်ကြိုးစားကြည့်ပါ။\npassword_ok=OK\npassword_cancel=ပယ်​ဖျက်ပါ\n\nprinting_not_supported=သတိပေးချက်၊ပရင့်ထုတ်ခြင်းကိုဤဘယောက်ဆာသည် ပြည့်ဝစွာထောက်ပံ့မထားပါ ။\nprinting_not_ready=သတိပေးချက်: ယခု PDF ဖိုင်သည် ပုံနှိပ်ရန် မပြည့်စုံပါ\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\ndocument_colors_not_allowed=PDF ဖိုင်အား ၎င်းဤ ကိုယ်ပိုင်အရောင်များကို အသုံးပြုခွင့်မပေးထားပါ ။ 'စာမျက်နှာအားလုံးအားအရောင်ရွေးချယ်ခွင့်' အား ယခု ဘယောက်ဆာတွင် ပိတ်ထားခြင်းကြောင့်ဖြစ် သှ်\n"
  },
  {
    "path": "example/pages/include/pdf/locale/nb-NO/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Forrige side\nprevious_label=Forrige\nnext.title=Neste side\nnext_label=Neste\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Side\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=av {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} av {{pagesCount}})\n\nzoom_out.title=Zoom ut\nzoom_out_label=Zoom ut\nzoom_in.title=Zoom inn\nzoom_in_label=Zoom inn\nzoom.title=Zoom\npresentation_mode.title=Bytt til presentasjonsmodus\npresentation_mode_label=Presentasjonsmodus\nopen_file.title=Åpne fil\nopen_file_label=Åpne\nprint.title=Skriv ut\nprint_label=Skriv ut\ndownload.title=Last ned\ndownload_label=Last ned\nbookmark.title=Nåværende visning (kopier eller åpne i et nytt vindu)\nbookmark_label=Nåværende visning\n\n# Secondary toolbar and context menu\ntools.title=Verktøy\ntools_label=Verktøy\nfirst_page.title=Gå til første side\nfirst_page.label=Gå til første side\nfirst_page_label=Gå til første side\nlast_page.title=Gå til siste side\nlast_page.label=Gå til siste side\nlast_page_label=Gå til siste side\npage_rotate_cw.title=Roter med klokken\npage_rotate_cw.label=Roter med klokken\npage_rotate_cw_label=Roter med klokken\npage_rotate_ccw.title=Roter mot klokken\npage_rotate_ccw.label=Roter mot klokken\npage_rotate_ccw_label=Roter mot klokken\n\ncursor_text_select_tool.title=Aktiver tekstmarkeringsverktøy\ncursor_text_select_tool_label=Tekstmarkeringsverktøy\ncursor_hand_tool.title=Aktiver handverktøy\ncursor_hand_tool_label=Handverktøy\n\n# Document properties dialog box\ndocument_properties.title=Dokumentegenskaper …\ndocument_properties_label=Dokumentegenskaper …\ndocument_properties_file_name=Filnavn:\ndocument_properties_file_size=Filstørrelse:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Dokumentegenskaper …\ndocument_properties_author=Forfatter:\ndocument_properties_subject=Emne:\ndocument_properties_keywords=Nøkkelord:\ndocument_properties_creation_date=Opprettet dato:\ndocument_properties_modification_date=Endret dato:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Opprettet av:\ndocument_properties_producer=PDF-verktøy:\ndocument_properties_version=PDF-versjon:\ndocument_properties_page_count=Sideantall:\ndocument_properties_close=Lukk\n\nprint_progress_message=Forbereder dokument for utskrift …\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Avbryt\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Slå av/på sidestolpe\ntoggle_sidebar_notification.title=Vis/gjem sidestolpe (dokumentet inneholder oversikt/vedlegg)\ntoggle_sidebar_label=Slå av/på sidestolpe\ndocument_outline.title=Vis dokumentdisposisjonen (dobbeltklikk for å utvide/skjule alle elementer)\ndocument_outline_label=Dokumentdisposisjon\nattachments.title=Vis vedlegg\nattachments_label=Vedlegg\nthumbs.title=Vis miniatyrbilde\nthumbs_label=Miniatyrbilde\nfindbar.title=Finn i dokumentet\nfindbar_label=Finn\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Side {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatyrbilde av side {{page}}\n\n# Find panel button title and messages\nfind_input.title=Søk\nfind_input.placeholder=Søk i dokument…\nfind_previous.title=Finn forrige forekomst av frasen\nfind_previous_label=Forrige\nfind_next.title=Finn neste forekomst av frasen\nfind_next_label=Neste\nfind_highlight=Uthev alle\nfind_match_case_label=Skill store/små bokstaver\nfind_reached_top=Nådde toppen av dokumentet, fortsetter fra bunnen\nfind_reached_bottom=Nådde bunnen av dokumentet, fortsetter fra toppen\nfind_not_found=Fant ikke teksten\n\n# Error panel labels\nerror_more_info=Mer info\nerror_less_info=Mindre info\nerror_close=Lukk\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (bygg: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Melding: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stakk: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linje: {{line}}\nrendering_error=En feil oppstod ved opptegning av siden.\n\n# Predefined zoom values\npage_scale_width=Sidebredde\npage_scale_fit=Tilpass til siden\npage_scale_auto=Automatisk zoom\npage_scale_actual=Virkelig størrelse\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}} %\n\n# Loading indicator messages\nloading_error_indicator=Feil\nloading_error=En feil oppstod ved lasting av PDF.\ninvalid_file_error=Ugyldig eller skadet PDF-fil.\nmissing_file_error=Manglende PDF-fil.\nunexpected_response_error=Uventet serverrespons.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} annotasjon]\npassword_label=Skriv inn passordet for å åpne denne PDF-filen.\npassword_invalid=Ugyldig passord. Prøv igjen.\npassword_ok=OK\npassword_cancel=Avbryt\n\nprinting_not_supported=Advarsel: Utskrift er ikke fullstendig støttet av denne nettleseren.\nprinting_not_ready=Advarsel: PDF er ikke fullstendig innlastet for utskrift.\nweb_fonts_disabled=Web-fonter er avslått: Kan ikke bruke innbundne PDF-fonter.\ndocument_colors_not_allowed=PDF-dokumenter tillates ikke å bruke deres egne farger: \"Tillat sider å velge egne farger\" er deaktivert i nettleseren.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/nl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Vorige pagina\nprevious_label=Vorige\nnext.title=Volgende pagina\nnext_label=Volgende\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pagina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=van {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} van {{pagesCount}})\n\nzoom_out.title=Uitzoomen\nzoom_out_label=Uitzoomen\nzoom_in.title=Inzoomen\nzoom_in_label=Inzoomen\nzoom.title=Zoomen\npresentation_mode.title=Wisselen naar presentatiemodus\npresentation_mode_label=Presentatiemodus\nopen_file.title=Bestand openen\nopen_file_label=Openen\nprint.title=Afdrukken\nprint_label=Afdrukken\ndownload.title=Downloaden\ndownload_label=Downloaden\nbookmark.title=Huidige weergave (kopiëren of openen in nieuw venster)\nbookmark_label=Huidige weergave\n\n# Secondary toolbar and context menu\ntools.title=Hulpmiddelen\ntools_label=Hulpmiddelen\nfirst_page.title=Naar eerste pagina gaan\nfirst_page.label=Naar eerste pagina gaan\nfirst_page_label=Naar eerste pagina gaan\nlast_page.title=Naar laatste pagina gaan\nlast_page.label=Naar laatste pagina gaan\nlast_page_label=Naar laatste pagina gaan\npage_rotate_cw.title=Rechtsom draaien\npage_rotate_cw.label=Rechtsom draaien\npage_rotate_cw_label=Rechtsom draaien\npage_rotate_ccw.title=Linksom draaien\npage_rotate_ccw.label=Linksom draaien\npage_rotate_ccw_label=Linksom draaien\n\ncursor_text_select_tool.title=Tekstselectiehulpmiddel inschakelen\ncursor_text_select_tool_label=Tekstselectiehulpmiddel\ncursor_hand_tool.title=Handhulpmiddel inschakelen\ncursor_hand_tool_label=Handhulpmiddel\n\n# Document properties dialog box\ndocument_properties.title=Documenteigenschappen…\ndocument_properties_label=Documenteigenschappen…\ndocument_properties_file_name=Bestandsnaam:\ndocument_properties_file_size=Bestandsgrootte:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Auteur:\ndocument_properties_subject=Onderwerp:\ndocument_properties_keywords=Trefwoorden:\ndocument_properties_creation_date=Aanmaakdatum:\ndocument_properties_modification_date=Wijzigingsdatum:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Auteur:\ndocument_properties_producer=PDF-producent:\ndocument_properties_version=PDF-versie:\ndocument_properties_page_count=Aantal pagina’s:\ndocument_properties_close=Sluiten\n\nprint_progress_message=Document voorbereiden voor afdrukken…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Annuleren\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Zijbalk in-/uitschakelen\ntoggle_sidebar_notification.title=Zijbalk in-/uitschakelen (document bevat overzicht/bijlagen)\ntoggle_sidebar_label=Zijbalk in-/uitschakelen\ndocument_outline.title=Documentoverzicht tonen (dubbelklik om alle items uit/samen te vouwen)\ndocument_outline_label=Documentoverzicht\nattachments.title=Bijlagen tonen\nattachments_label=Bijlagen\nthumbs.title=Miniaturen tonen\nthumbs_label=Miniaturen\nfindbar.title=Zoeken in document\nfindbar_label=Zoeken\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatuur van pagina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Zoeken\nfind_input.placeholder=Zoeken in document…\nfind_previous.title=De vorige overeenkomst van de tekst zoeken\nfind_previous_label=Vorige\nfind_next.title=De volgende overeenkomst van de tekst zoeken\nfind_next_label=Volgende\nfind_highlight=Alles markeren\nfind_match_case_label=Hoofdlettergevoelig\nfind_reached_top=Bovenkant van document bereikt, doorgegaan vanaf onderkant\nfind_reached_bottom=Onderkant van document bereikt, doorgegaan vanaf bovenkant\nfind_not_found=Tekst niet gevonden\n\n# Error panel labels\nerror_more_info=Meer informatie\nerror_less_info=Minder informatie\nerror_close=Sluiten\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Bericht: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Bestand: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Regel: {{line}}\nrendering_error=Er is een fout opgetreden bij het weergeven van de pagina.\n\n# Predefined zoom values\npage_scale_width=Paginabreedte\npage_scale_fit=Hele pagina\npage_scale_auto=Automatisch zoomen\npage_scale_actual=Werkelijke grootte\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Fout\nloading_error=Er is een fout opgetreden bij het laden van de PDF.\ninvalid_file_error=Ongeldig of beschadigd PDF-bestand.\nmissing_file_error=PDF-bestand ontbreekt. \nunexpected_response_error=Onverwacht serverantwoord.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-aantekening]\npassword_label=Voer het wachtwoord in om dit PDF-bestand te openen.\npassword_invalid=Ongeldig wachtwoord. Probeer het opnieuw.\npassword_ok=OK\npassword_cancel=Annuleren\n\nprinting_not_supported=Waarschuwing: afdrukken wordt niet volledig ondersteund door deze browser.\nprinting_not_ready=Waarschuwing: de PDF is niet volledig geladen voor afdrukken.\nweb_fonts_disabled=Weblettertypen zijn uitgeschakeld: gebruik van ingebedde PDF-lettertypen is niet mogelijk.\ndocument_colors_not_allowed=PDF-documenten mogen hun eigen kleuren niet gebruiken: ‘Pagina’s toestaan om hun eigen kleuren te kiezen’ is uitgeschakeld in de browser.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/nn-NO/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Føregåande side\nprevious_label=Føregåande\nnext.title=Neste side\nnext_label=Neste\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Side\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=av {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} av {{pagesCount}})\n\nzoom_out.title=Zoom ut\nzoom_out_label=Zoom ut\nzoom_in.title=Zoom inn\nzoom_in_label=Zoom inn\nzoom.title=Zoom\npresentation_mode.title=Byt til presentasjonsmodus\npresentation_mode_label=Presentasjonsmodus\nopen_file.title=Opne fil\nopen_file_label=Opne\nprint.title=Skriv ut\nprint_label=Skriv ut\ndownload.title=Last ned\ndownload_label=Last ned\nbookmark.title=Gjeldande vising (kopier eller opne i nytt vindauge)\nbookmark_label=Gjeldande vising\n\n# Secondary toolbar and context menu\ntools.title=Verktøy\ntools_label=Verktøy\nfirst_page.title=Gå til første side\nfirst_page.label=Gå til første side\nfirst_page_label=Gå til første side\nlast_page.title=Gå til siste side\nlast_page.label=Gå til siste side\nlast_page_label=Gå til siste side\npage_rotate_cw.title=Roter med klokka\npage_rotate_cw.label=Roter med klokka\npage_rotate_cw_label=Roter med klokka\npage_rotate_ccw.title=Roter mot klokka\npage_rotate_ccw.label=Roter mot klokka\npage_rotate_ccw_label=Roter mot klokka\n\ncursor_text_select_tool.title=Aktiver tekstmarkeringsverktøy\ncursor_text_select_tool_label=Tekstmarkeringsverktøy\ncursor_hand_tool.title=Aktiver handverktøy\ncursor_hand_tool_label=Handverktøy\n\n# Document properties dialog box\ndocument_properties.title=Dokumenteigenskapar…\ndocument_properties_label=Dokumenteigenskapar…\ndocument_properties_file_name=Filnamn:\ndocument_properties_file_size=Filstorleik:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Tittel:\ndocument_properties_author=Forfattar:\ndocument_properties_subject=Emne:\ndocument_properties_keywords=Stikkord:\ndocument_properties_creation_date=Dato oppretta:\ndocument_properties_modification_date=Dato endra:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Oppretta av:\ndocument_properties_producer=PDF-verktøy:\ndocument_properties_version=PDF-versjon:\ndocument_properties_page_count=Sidetal:\ndocument_properties_close=Lukk\n\nprint_progress_message=Førebur dokumentet for utskrift…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Avbryt\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Slå av/på sidestolpe\ntoggle_sidebar_notification.title=Vis/gøym sidestolpen (dokumentet inneheld oversikt/vedlegg)\ntoggle_sidebar_label=Slå av/på sidestolpe\ndocument_outline.title=Vis dokumentdisposisjonen (dobbelklikk for å utvide/gøyme alle elementa)\ndocument_outline_label=Dokumentdisposisjon\nattachments.title=Vis vedlegg\nattachments_label=Vedlegg\nthumbs.title=Vis miniatyrbilde\nthumbs_label=Miniatyrbilde\nfindbar.title=Finn i dokumentet\nfindbar_label=Finn\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Side {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatyrbilde av side {{page}}\n\n# Find panel button title and messages\nfind_input.title=Søk\nfind_input.placeholder=Søk i dokument…\nfind_previous.title=Finn førre førekomst av frasen\nfind_previous_label=Førre\nfind_next.title=Finn neste førekomst av frasen\nfind_next_label=Neste\nfind_highlight=Uthev alle\nfind_match_case_label=Skil store/små bokstavar\nfind_reached_top=Nådde toppen av dokumentet, fortset frå botnen\nfind_reached_bottom=Nådde botnen av dokumentet, fortset frå toppen\nfind_not_found=Fann ikkje teksten\n\n# Error panel labels\nerror_more_info=Meir info\nerror_less_info=Mindre info\nerror_close=Lukk\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (bygg: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Melding: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stakk: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linje: {{line}}\nrendering_error=Ein feil oppstod under vising av sida.\n\n# Predefined zoom values\npage_scale_width=Sidebreidde\npage_scale_fit=Tilpass til sida\npage_scale_auto=Automatisk skalering\npage_scale_actual=Verkeleg storleik\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Feil\nloading_error=Ein feil oppstod ved lasting av PDF.\ninvalid_file_error=Ugyldig eller korrupt PDF-fil.\nmissing_file_error=Manglande PDF-fil.\nunexpected_response_error=Uventa tenarrespons.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} annotasjon]\npassword_label=Skriv inn passordet for å opne denne PDF-fila.\npassword_invalid=Ugyldig passord. Prøv igjen.\npassword_ok=OK\npassword_cancel=Avbryt\n\nprinting_not_supported=Åtvaring: Utskrift er ikkje fullstendig støtta av denne nettlesaren.\nprinting_not_ready=Åtvaring: PDF ikkje fullstendig innlasta for utskrift.\nweb_fonts_disabled=Web-skrifter er slått av: Kan ikkje bruke innbundne PDF-skrifter.\ndocument_colors_not_allowed=PDF-dokument kan ikkje bruke eigne fargar: «Tillat sider å velje eigne fargar» er deaktivert i nettlesaren.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/nso/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Letlakala le fetilego\nprevious_label=Fetilego\nnext.title=Letlakala le latelago\nnext_label=Latelago\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Bušetša ka gare\nzoom_out_label=Bušetša ka gare\nzoom_in.title=Godišetša ka ntle\nzoom_in_label=Godišetša ka ntle\nzoom.title=Godiša\npresentation_mode.title=Fetogela go mokgwa wa tlhagišo\npresentation_mode_label=Mokgwa wa tlhagišo\nopen_file.title=Bula faele\nopen_file_label=Bula\nprint.title=Gatiša\nprint_label=Gatiša\ndownload.title=Laolla\ndownload_label=Laolla\nbookmark.title=Pono ya bjale (kopiša le go bula lefasetereng le leswa)\nbookmark_label=Tebelelo ya gona bjale\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\ndocument_properties_file_name=Leina la faele:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Thaetlele:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Šielanya para ya ka thoko\ntoggle_sidebar_label=Šielanya para ya ka thoko\ndocument_outline_label=Kakaretšo ya tokumente\nthumbs.title=Laetša dikhutšofatšo\nthumbs_label=Dikhutšofatšo\nfindbar.title=Hwetša go tokumente\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Letlakala {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Khutšofatšo ya letlakala {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Hwetša tiragalo e fetilego ya sekafoko\nfind_previous_label=Fetilego\nfind_next.title=Hwetša tiragalo e latelago ya sekafoko\nfind_next_label=Latelago\nfind_highlight=Bonagatša tšohle\nfind_match_case_label=Swantšha kheisi\nfind_reached_top=Fihlile godimo ga tokumente, go tšwetšwe pele go tloga tlase\nfind_reached_bottom=Fihlile mafelelong a tokumente, go tšwetšwe pele go tloga godimo\nfind_not_found=Sekafoko ga sa hwetšwa\n\n# Error panel labels\nerror_more_info=Tshedimošo e oketšegilego\nerror_less_info=Tshedimošo ya tlasana\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Molaetša: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Mokgobo: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Faele: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Mothaladi: {{line}}\nrendering_error=Go diregile phošo ge go be go gafelwa letlakala.\n\n# Predefined zoom values\npage_scale_width=Bophara bja letlakala\npage_scale_fit=Go lekana ga letlakala\npage_scale_auto=Kgodišo ya maitirišo\npage_scale_actual=Bogolo bja kgonthe\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Phošo\nloading_error=Go diregile phošo ge go hlahlelwa PDF.\ninvalid_file_error=Faele ye e sa šomego goba e senyegilego ya PDF.\nmissing_file_error=Faele yeo e sego gona ya PDF.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Tlhaloso]\npassword_ok=LOKILE\n\nprinting_not_supported=Temošo: Go gatiša ga go thekgwe ke praosara ye ka botlalo.\nprinting_not_ready=Temošo: PDF ga ya hlahlelwa ka botlalo bakeng sa go gatišwa.\nweb_fonts_disabled=Difonte tša wepe di šitišitšwe: ga e kgone go diriša difonte tša PDF tše khutišitšwego.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/oc/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pagina precedenta\nprevious_label=Precedent\nnext.title=Pagina seguenta\nnext_label=Seguent\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pagina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=sus {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Zoom arrièr\nzoom_out_label=Zoom arrièr\nzoom_in.title=Zoom avant\nzoom_in_label=Zoom avant\nzoom.title=Zoom\npresentation_mode.title=Bascular en mòde presentacion\npresentation_mode_label=Mòde Presentacion\nopen_file.title=Dobrir lo fichièr\nopen_file_label=Dobrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Telecargar\ndownload_label=Telecargar\nbookmark.title=Afichatge corrent (copiar o dobrir dins una fenèstra novèla)\nbookmark_label=Afichatge actual\n\n# Secondary toolbar and context menu\ntools.title=Aisinas\ntools_label=Aisinas\nfirst_page.title=Anar a la primièra pagina\nfirst_page.label=Anar a la primièra pagina\nfirst_page_label=Anar a la primièra pagina\nlast_page.title=Anar a la darrièra pagina\nlast_page.label=Anar a la darrièra pagina\nlast_page_label=Anar a la darrièra pagina\npage_rotate_cw.title=Rotacion orària\npage_rotate_cw.label=Rotacion orària\npage_rotate_cw_label=Rotacion orària\npage_rotate_ccw.title=Rotacion antiorària\npage_rotate_ccw.label=Rotacion antiorària\npage_rotate_ccw_label=Rotacion antiorària\n\nhand_tool_enable.title=Activar l'aisina man\nhand_tool_enable_label=Activar l'aisina man\nhand_tool_disable.title=Desactivar l'aisina man\nhand_tool_disable_label=Desactivar l'aisina man\n\n# Document properties dialog box\ndocument_properties.title=Proprietats del document...\ndocument_properties_label=Proprietats del document...\ndocument_properties_file_name=Nom del fichièr :\ndocument_properties_file_size=Talha del fichièr :\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} Ko ({{size_b}} octets)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} Mo ({{size_b}} octets)\ndocument_properties_title=Títol :\ndocument_properties_author=Autor :\ndocument_properties_subject=Subjècte :\ndocument_properties_keywords=Mots claus :\ndocument_properties_creation_date=Data de creacion :\ndocument_properties_modification_date=Data de modificacion :\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creator :\ndocument_properties_producer=Aisina de conversion PDF :\ndocument_properties_version=Version PDF :\ndocument_properties_page_count=Nombre de paginas :\ndocument_properties_close=Tampar\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_close=Anullar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Afichar/amagar lo panèl lateral\ntoggle_sidebar_label=Afichar/amagar lo panèl lateral\ndocument_outline_label=Marcapaginas del document\nattachments.title=Visualizar las pèças juntas\nattachments_label=Pèças juntas\nthumbs.title=Afichar las vinhetas\nthumbs_label=Vinhetas\nfindbar.title=Trobar dins lo document\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Vinheta de la pagina {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Tròba l'ocurréncia precedenta de la frasa\nfind_previous_label=Precedent\nfind_next.title=Tròba l'ocurréncia venenta de la frasa\nfind_next_label=Seguent\nfind_highlight=Suslinhar tot\nfind_match_case_label=Respectar la cassa\nfind_reached_top=Naut de la pagina atench, perseguida dempuèi lo bas\nfind_reached_bottom=Bas de la pagina atench, perseguida al començament\nfind_not_found=Frasa pas trobada\n\n# Error panel labels\nerror_more_info=Mai de detalhs\nerror_less_info=Mens d'informacions\nerror_close=Tampar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (identificant de compilacion : {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Messatge : {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila : {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fichièr : {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linha : {{line}}\nrendering_error=Una error s'es produita pendent l'afichatge de la pagina.\n\n# Predefined zoom values\npage_scale_width=Largor plena\npage_scale_fit=Pagina entièra\npage_scale_auto=Zoom automatic\npage_scale_actual=Talha vertadièra\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=Una error s'es produita pendent lo cargament del fichièr PDF.\ninvalid_file_error=Fichièr PDF invalid o corromput.\nmissing_file_error=Fichièr PDF mancant.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotacion {{type}}]\npassword_label=Picatz lo senhal per dobrir aqueste fichièr PDF.\npassword_invalid=Senhal incorrècte. Tornatz ensajar.\npassword_ok=D'acòrdi\npassword_cancel=Anullar\n\nprinting_not_supported=Atencion : l'impression es pas completament gerit per aqueste navigador.\nprinting_not_ready=Atencion : lo PDF es pas entièrament cargat per lo poder imprimir.\nweb_fonts_disabled=Las poliças web son desactivadas : impossible d'utilizar las poliças integradas al PDF.\ndocument_colors_not_allowed=Los documents PDF pòdon pas utilizar lors pròprias colors : « Autorizar las paginas web d'utilizar lors pròprias colors » es desactivat dins lo navigador.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/or/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=ପୂର୍ବ ପୃଷ୍ଠା\nprevious_label=ପୂର୍ବ\nnext.title=ପର ପୃଷ୍ଠା\nnext_label=ପର\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=ଛୋଟ କରନ୍ତୁ\nzoom_out_label=ଛୋଟ କରନ୍ତୁ\nzoom_in.title=ବଡ଼ କରନ୍ତୁ\nzoom_in_label=ବଡ଼ କରନ୍ତୁ\nzoom.title=ଛୋଟ ବଡ଼ କରନ୍ତୁ\npresentation_mode.title=ଉପସ୍ଥାପନ ଧାରାକୁ ବଦଳାନ୍ତୁ\npresentation_mode_label=ଉପସ୍ଥାପନ ଧାରା\nopen_file.title=ଫାଇଲ ଖୋଲନ୍ତୁ\nopen_file_label=ଖୋଲନ୍ତୁ\nprint.title=ମୁଦ୍ରଣ\nprint_label=ମୁଦ୍ରଣ\ndownload.title=ଆହରଣ\ndownload_label=ଆହରଣ\nbookmark.title=ପ୍ରଚଳିତ ଦୃଶ୍ୟ (ନକଲ କରନ୍ତୁ କିମ୍ବା ଏକ ନୂତନ ୱିଣ୍ଡୋରେ ଖୋଲନ୍ତୁ)\nbookmark_label=ପ୍ରଚଳିତ ଦୃଶ୍ୟ\n\n# Secondary toolbar and context menu\ntools.title=ସାଧନଗୁଡ଼ିକ\ntools_label=ସାଧନଗୁଡ଼ିକ\nfirst_page.title=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\nfirst_page.label=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\nfirst_page_label=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\nlast_page.title=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\nlast_page.label=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\nlast_page_label=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\npage_rotate_cw.title=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\npage_rotate_cw.label=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\npage_rotate_cw_label=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\npage_rotate_ccw.title=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\npage_rotate_ccw.label=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\npage_rotate_ccw_label=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\n\n\n# Document properties dialog box\ndocument_properties.title=ଦଲିଲ ଗୁଣଧର୍ମ…\ndocument_properties_label=ଦଲିଲ ଗୁଣଧର୍ମ…\ndocument_properties_file_name=ଫାଇଲ ନାମ:\ndocument_properties_file_size=ଫାଇଲ ଆକାର:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=ଶୀର୍ଷକ:\ndocument_properties_author=ଲେଖକ:\ndocument_properties_subject=ବିଷୟ:\ndocument_properties_keywords=ସୂଚକ ଶବ୍ଦ:\ndocument_properties_creation_date=ନିର୍ମାଣ ତାରିଖ:\ndocument_properties_modification_date=ପରିବର୍ତ୍ତନ ତାରିଖ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=ନିର୍ମାତା:\ndocument_properties_producer=PDF ପ୍ରଯୋଜକ:\ndocument_properties_version=PDF ସଂସ୍କରଣ:\ndocument_properties_page_count=ପୃଷ୍ଠା ଗଣନା:\ndocument_properties_close=ବନ୍ଦ କରନ୍ତୁ\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ପାର୍ଶ୍ୱପଟିକୁ ଆଗପଛ କରନ୍ତୁ\ntoggle_sidebar_label=ପାର୍ଶ୍ୱପଟିକୁ ଆଗପଛ କରନ୍ତୁ\ndocument_outline_label=ଦଲିଲ ସାରାଂଶ\nattachments.title=ସଂଲଗ୍ନକଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ\nattachments_label=ସଲଗ୍ନକଗୁଡିକ\nthumbs.title=ସଂକ୍ଷିପ୍ତ ବିବରଣୀ ଦର୍ଶାନ୍ତୁ\nthumbs_label=ସଂକ୍ଷିପ୍ତ ବିବରଣୀ\nfindbar.title=ଦଲିଲରେ ଖୋଜନ୍ତୁ\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=ପୃଷ୍ଠା {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=ପୃଷ୍ଠାର ସଂକ୍ଷିପ୍ତ ବିବରଣୀ {{page}}\n\n# Find panel button title and messages\nfind_previous.title=ଏହି ବାକ୍ୟାଂଶର ପୂର୍ବ ଉପସ୍ଥିତିକୁ ଖୋଜନ୍ତୁ\nfind_previous_label=ପୂର୍ବବର୍ତ୍ତୀ\nfind_next.title=ଏହି ବାକ୍ୟାଂଶର ପରବର୍ତ୍ତୀ ଉପସ୍ଥିତିକୁ ଖୋଜନ୍ତୁ\nfind_next_label=ପରବର୍ତ୍ତୀ\\u0020\nfind_highlight=ସମସ୍ତଙ୍କୁ ଆଲୋକିତ କରନ୍ତୁ\nfind_match_case_label=ଅକ୍ଷର ମେଳାନ୍ତୁ\nfind_reached_top=ତଳୁ ଉପରକୁ ଗତି କରି ଦଲିଲର ଉପର ଭାଗରେ ପହଞ୍ଚି ଯାଇଛି\nfind_reached_bottom=ଉପରୁ ତଳକୁ ଗତି କରି ଦଲିଲର ଶେଷ ଭାଗରେ ପହଞ୍ଚି ଯାଇଛି\nfind_not_found=ବାକ୍ୟାଂଶ ମିଳିଲା ନାହିଁ\n\n# Error panel labels\nerror_more_info=ଅଧିକ ସୂଚନା\nerror_less_info=ସ୍ୱଳ୍ପ ସୂଚନା\nerror_close=ବନ୍ଦ କରନ୍ତୁ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=ସନ୍ଦେଶ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ଷ୍ଟାକ: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ଫାଇଲ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ଧାଡ଼ି: {{line}}\nrendering_error=ପୃଷ୍ଠା ଚିତ୍ରଣ କରିବା ସମୟରେ ତ୍ରୁଟି ଘଟିଲା।\n\n# Predefined zoom values\npage_scale_width=ପୃଷ୍ଠା ଓସାର\npage_scale_fit=ପୃଷ୍ଠା ମେଳନ\npage_scale_auto=ସ୍ୱୟଂଚାଳିତ ଭାବରେ ଛୋଟବଡ଼ କରିବା\npage_scale_actual=ପ୍ରକୃତ ଆକାର\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=ତ୍ରୁଟି\nloading_error=PDF ଧାରଣ କରିବା ସମୟରେ ଏକ ତ୍ରୁଟି ଘଟିଲା।\ninvalid_file_error=ଅବୈଧ କିମ୍ବା ତ୍ରୁଟିଯୁକ୍ତ PDF ଫାଇଲ।\nmissing_file_error=ହଜିଯାଇଥିବା PDF ଫାଇଲ।\nunexpected_response_error=ଅପ୍ରତ୍ୟାଶିତ ସର୍ଭର ଉତ୍ତର।\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=ଏହି PDF ଫାଇଲକୁ ଖୋଲିବା ପାଇଁ ପ୍ରବେଶ ସଂକେତ ଭରଣ କରନ୍ତୁ।\npassword_invalid=ଭୁଲ ପ୍ରବେଶ ସଂକେତ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।\npassword_ok=ଠିକ ଅଛି\n\nprinting_not_supported=ଚେତାବନୀ: ଏହି ବ୍ରାଉଜର ଦ୍ୱାରା ମୁଦ୍ରଣ କ୍ରିୟା ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ସହାୟତା ପ୍ରାପ୍ତ ନୁହଁ।\nprinting_not_ready=ଚେତାବନୀ: PDF ଟି ମୁଦ୍ରଣ ପାଇଁ ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ଧାରଣ ହୋଇ ନାହିଁ।\nweb_fonts_disabled=ୱେବ ଅକ୍ଷରରୂପଗୁଡ଼ିକୁ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି: ସନ୍ନିହିତ PDF ଅକ୍ଷରରୂପଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବାରେ ଅସମର୍ଥ।\ndocument_colors_not_allowed=PDF ଦଲିଲଗୁଡ଼ିକ ସେମାନଙ୍କର ନିଜର ରଙ୍ଗ ବ୍ୟବହାର କରିବା ପାଇଁ ଅନୁମତି ପ୍ରାପ୍ତ ନୁହଁ: 'ସେମାନଙ୍କର ନିଜ ରଙ୍ଗ ବାଛିବା ପାଇଁ ପୃଷ୍ଠାଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ' କୁ ବ୍ରାଉଜରରେ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି।\n"
  },
  {
    "path": "example/pages/include/pdf/locale/pa-IN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=ਸਫ਼ਾ ਪਿੱਛੇ\nprevious_label=ਪਿੱਛੇ\nnext.title=ਸਫ਼ਾ ਅੱਗੇ\nnext_label=ਅੱਗੇ\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Page\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=of {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=ਜ਼ੂਮ ਆਉਟ\nzoom_out_label=ਜ਼ੂਮ ਆਉਟ\nzoom_in.title=ਜ਼ੂਮ ਇਨ\nzoom_in_label=ਜ਼ੂਮ ਇਨ\nzoom.title=ਜ਼ੂਨ\npresentation_mode.title=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ ਵਿੱਚ ਜਾਓ\npresentation_mode_label=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ\nopen_file.title=ਫਾਈਲ ਨੂੰ ਖੋਲ੍ਹੋ\nopen_file_label=ਖੋਲ੍ਹੋ\nprint.title=ਪਰਿੰਟ\nprint_label=ਪਰਿੰਟ\ndownload.title=ਡਾਊਨਲੋਡ\ndownload_label=ਡਾਊਨਲੋਡ\nbookmark.title=ਮੌਜੂਦਾ ਝਲਕ (ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਕਾਪੀ ਕਰੋ ਜਾਂ ਖੋਲ੍ਹੋ)\nbookmark_label=ਮੌਜੂਦਾ ਝਲਕ\n\n# Secondary toolbar and context menu\ntools.title=ਟੂਲ\ntools_label=ਟੂਲ\nfirst_page.title=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nfirst_page.label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nfirst_page_label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nlast_page.title=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nlast_page.label=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nlast_page_label=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\npage_rotate_cw.title=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ\npage_rotate_cw.label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਉ\npage_rotate_cw_label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ\npage_rotate_ccw.title=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ\npage_rotate_ccw.label=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਉ\npage_rotate_ccw_label=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ\n\n\n# Document properties dialog box\ndocument_properties.title=…ਦਸਤਾਵੇਜ਼ ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ\ndocument_properties_label=…ਦਸਤਾਵੇਜ਼ ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ\ndocument_properties_file_name=ਫਾਈਲ ਦਾ ਨਾਂ:\ndocument_properties_file_size=ਫਾਈਲ ਦਾ ਆਕਾਰ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} ਬਾਈਟ)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} ਬਾਈਟ)\ndocument_properties_title=ਟਾਈਟਲ:\ndocument_properties_author=ਲੇਖਕ:\ndocument_properties_subject=ਵਿਸ਼ਾ:\ndocument_properties_keywords=ਸ਼ਬਦ:\ndocument_properties_creation_date=ਬਣਾਉਣ ਦੀ ਮਿਤੀ:\ndocument_properties_modification_date=ਸੋਧ ਦੀ ਮਿਤੀ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=ਨਿਰਮਾਤਾ:\ndocument_properties_producer=PDF ਪ੍ਰੋਡਿਊਸਰ:\ndocument_properties_version=PDF ਵਰਜਨ:\ndocument_properties_page_count=ਸਫ਼ੇ ਦੀ ਗਿਣਤੀ:\ndocument_properties_close=ਬੰਦ ਕਰੋ\n\nprint_progress_message=Preparing document for printing…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancel\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ਬਾਹੀ ਬਦਲੋ\ntoggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)\ntoggle_sidebar_label=ਬਾਹੀ ਬਦਲੋ\ndocument_outline.title=Show Document Outline (double-click to expand/collapse all items)\ndocument_outline_label=Document Outline\nattachments.title=ਅਟੈਚਮੈਂਟ ਨੂੰ ਵੇਖਾਓ\nattachments_label=ਅਟੈਚਮੈਂਟ\nthumbs.title=ਥੰਮਨੇਲ ਨੂੰ ਵੇਖਾਓ\nthumbs_label=ਥੰਮਨੇਲ\nfindbar.title=ਦਸਤਾਵੇਜ਼ ਵਿੱਚ ਲੱਭੋ\nfindbar_label=ਲੱਭੋ\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=ਸਫ਼ਾ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} ਸਫ਼ੇ ਦਾ ਥੰਮਨੇਲ\n\n# Find panel button title and messages\nfind_previous.title=ਵਾਕ ਦੀ ਪਿਛਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ\nfind_previous_label=ਪਿੱਛੇ\nfind_next.title=ਵਾਕ ਦੀ ਅਗਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ\nfind_next_label=ਅੱਗੇ\nfind_highlight=ਸਭ ਉਭਾਰੋ\nfind_match_case_label=ਅੱਖਰ ਆਕਾਰ ਨੂੰ ਮਿਲਾਉ\nfind_reached_top=ਦਸਤਾਵੇਜ਼ ਦੇ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਥੱਲੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ\nfind_reached_bottom=ਦਸਤਾਵੇਜ਼ ਦੇ ਅੰਤ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਉੱਤੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ\nfind_not_found=ਵਾਕ ਨਹੀਂ ਲੱਭਿਆ\n\n# Error panel labels\nerror_more_info=ਹੋਰ ਜਾਣਕਾਰੀ\nerror_less_info=ਘੱਟ ਜਾਣਕਾਰੀ\nerror_close=ਬੰਦ ਕਰੋ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (ਬਿਲਡ: {{build}}\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=ਸੁਨੇਹਾ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ਸਟੈਕ: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ਫਾਈਲ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ਲਾਈਨ: {{line}}\nrendering_error=ਸਫ਼ਾ ਰੈਡਰ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ।\n\n# Predefined zoom values\npage_scale_width=ਸਫ਼ੇ ਦੀ ਚੌੜਾਈ\npage_scale_fit=ਸਫ਼ਾ ਫਿੱਟ\npage_scale_auto=ਆਟੋਮੈਟਿਕ ਜ਼ੂਮ ਕਰੋ\npage_scale_actual=ਆਟੋਮੈਟਿਕ ਆਕਾਰ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=ਗਲਤੀ\nloading_error=PDF ਲੋਡ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ।\ninvalid_file_error=ਗਲਤ ਜਾਂ ਨਿਕਾਰਾ PDF ਫਾਈਲ ਹੈ।\nmissing_file_error=ਨਾ-ਮੌਜੂਦ PDF ਫਾਈਲ।\nunexpected_response_error=ਅਣਜਾਣ ਸਰਵਰ ਜਵਾਬ।\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}  ਵਿਆਖਿਆ]\npassword_label=ਇਹ PDF ਫਾਈਲ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ ਪਾਸਵਰਡ ਦਿਉ।\npassword_invalid=ਗਲਤ ਪਾਸਵਰਡ। ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ।\npassword_ok=ਠੀਕ ਹੈ\npassword_cancel=ਰੱਦ ਕਰੋ\n\nprinting_not_supported=ਸਾਵਧਾਨ: ਇਹ ਬਰਾਊਜ਼ਰ ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਸਹਾਇਕ ਨਹੀਂ ਹੈ।\nprinting_not_ready=ਸਾਵਧਾਨ: PDF ਨੂੰ ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਲੋਡ ਨਹੀਂ ਹੈ।\nweb_fonts_disabled=ਵੈਬ ਫੋਂਟ ਬੰਦ ਹਨ: ਇੰਬੈਡ PDF ਫੋਂਟ ਨੂੰ ਵਰਤਣ ਲਈ ਅਸਮਰੱਥ ਹੈ।\ndocument_colors_not_allowed=PDF ਦਸਤਾਵੇਜ਼ਾਂ ਨੂੰ ਆਪਣੇ ਰੰਗ ਵਰਤਣ ਦੀ ਇਜ਼ਾਜ਼ਤ ਨਹੀਂ ਹੈ।: ਬਰਾਊਜ਼ਰ ਵਿੱਚ “ਸਫ਼ਿਆਂ ਨੂੰ ਆਪਣੇ ਰੰਗ ਚੁਣਨ ਦੀ ਇਜ਼ਾਜ਼ਤ ਦਿਓ” ਨਾ-ਸਰਗਰਮ ਹੈ।\n"
  },
  {
    "path": "example/pages/include/pdf/locale/pl/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nprevious.title=Poprzednia strona\nprevious_label=Poprzednia\nnext.title=Następna strona\nnext_label=Następna\n\npage.title==Strona:\nof_pages=z {{pagesCount}}\npage_of_pages=({{pageNumber}} z {{pagesCount}})\n\nzoom_out.title=Pomniejszenie\nzoom_out_label=Pomniejsz\nzoom_in.title=Powiększenie\nzoom_in_label=Powiększ\nzoom.title=Skala\npresentation_mode.title=Przełącz na tryb prezentacji\npresentation_mode_label=Tryb prezentacji\nopen_file.title=Otwieranie pliku\nopen_file_label=Otwórz\nprint.title=Drukowanie\nprint_label=Drukuj\ndownload.title=Pobieranie\ndownload_label=Pobierz\nbookmark.title=Bieżąca pozycja (skopiuj lub otwórz jako odnośnik w nowym oknie)\nbookmark_label=Bieżąca pozycja\n\ntools.title=Narzędzia\ntools_label=Narzędzia\nfirst_page.title=Przechodzenie do pierwszej strony\nfirst_page.label=Przejdź do pierwszej strony\nfirst_page_label=Przejdź do pierwszej strony\nlast_page.title=Przechodzenie do ostatniej strony\nlast_page.label=Przejdź do ostatniej strony\nlast_page_label=Przejdź do ostatniej strony\npage_rotate_cw.title=Obracanie zgodnie z ruchem wskazówek zegara\npage_rotate_cw.label=Obróć zgodnie z ruchem wskazówek zegara\npage_rotate_cw_label=Obróć zgodnie z ruchem wskazówek zegara\npage_rotate_ccw.title=Obracanie przeciwnie do ruchu wskazówek zegara\npage_rotate_ccw.label=Obróć przeciwnie do ruchu wskazówek zegara\npage_rotate_ccw_label=Obróć przeciwnie do ruchu wskazówek zegara\n\ncursor_text_select_tool.title=Włącza narzędzie zaznaczania tekstu\ncursor_text_select_tool_label=Narzędzie zaznaczania tekstu\ncursor_hand_tool.title=Włącza narzędzie rączka\ncursor_hand_tool_label=Narzędzie rączka\n\ndocument_properties.title=Właściwości dokumentu…\ndocument_properties_label=Właściwości dokumentu…\ndocument_properties_file_name=Nazwa pliku:\ndocument_properties_file_size=Rozmiar pliku:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} b)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} b)\ndocument_properties_title=Tytuł:\ndocument_properties_author=Autor:\ndocument_properties_subject=Temat:\ndocument_properties_keywords=Słowa kluczowe:\ndocument_properties_creation_date=Data utworzenia:\ndocument_properties_modification_date=Data modyfikacji:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Utworzony przez:\ndocument_properties_producer=PDF wyprodukowany przez:\ndocument_properties_version=Wersja PDF:\ndocument_properties_page_count=Liczba stron:\ndocument_properties_close=Zamknij\n\nprint_progress_message=Przygotowywanie dokumentu do druku…\nprint_progress_percent={{progress}}%\nprint_progress_close=Anuluj\n\ntoggle_sidebar.title=Przełączanie panelu bocznego\ntoggle_sidebar_notification.title=Przełączanie panelu bocznego (dokument zawiera konspekt/załączniki)\ntoggle_sidebar_label=Przełącz panel boczny\ndocument_outline.title=Wyświetlanie zarysu dokumentu (podwójne kliknięcie rozwija lub zwija wszystkie pozycje)\ndocument_outline_label=Zarys dokumentu\nattachments.title=Wyświetlanie załączników\nattachments_label=Załączniki\nthumbs.title=Wyświetlanie miniaturek\nthumbs_label=Miniaturki\nfindbar.title=Znajdź w dokumencie\nfindbar_label=Znajdź\n\nthumb_page_title=Strona {{page}}\nthumb_page_canvas=Miniaturka strony {{page}}\n\nfind_input.title=Wyszukiwanie\nfind_input.placeholder=Szukaj w dokumencie…\nfind_previous.title=Znajdź poprzednie wystąpienie tekstu\nfind_previous_label=Poprzednie\nfind_next.title=Znajdź następne wystąpienie tekstu\nfind_next_label=Następne\nfind_highlight=Podświetl wszystkie\nfind_match_case_label=Rozróżniaj wielkość znaków\nfind_reached_top=Osiągnięto początek dokumentu, kontynuacja od końca\nfind_reached_bottom=Osiągnięto koniec dokumentu, kontynuacja od początku\nfind_not_found=Tekst nieznaleziony\n\nerror_more_info=Więcej informacji\nerror_less_info=Mniej informacji\nerror_close=Zamknij\nerror_version_info=PDF.js v{{version}} (kompilacja: {{build}})\nerror_message=Wiadomość: {{message}}\nerror_stack=Stos: {{stack}}\nerror_file=Plik: {{file}}\nerror_line=Wiersz: {{line}}\nrendering_error=Podczas renderowania strony wystąpił błąd.\n\npage_scale_width=Szerokość strony\npage_scale_fit=Dopasowanie strony\npage_scale_auto=Skala automatyczna\npage_scale_actual=Rozmiar rzeczywisty\npage_scale_percent={{scale}}%\n\nloading_error_indicator=Błąd\nloading_error=Podczas wczytywania dokumentu PDF wystąpił błąd.\ninvalid_file_error=Nieprawidłowy lub uszkodzony plik PDF.\nmissing_file_error=Brak pliku PDF.\nunexpected_response_error=Nieoczekiwana odpowiedź serwera.\n\ntext_annotation_type.alt=[Adnotacja: {{type}}]\npassword_label=Wprowadź hasło, aby otworzyć ten dokument PDF.\npassword_invalid=Nieprawidłowe hasło. Proszę spróbować ponownie.\npassword_ok=OK\npassword_cancel=Anuluj\n\nprinting_not_supported=Ostrzeżenie: Drukowanie nie jest w pełni obsługiwane przez przeglądarkę.\nprinting_not_ready=Ostrzeżenie: Dokument PDF nie jest całkowicie wczytany, więc nie można go wydrukować.\nweb_fonts_disabled=Czcionki sieciowe są wyłączone: nie można użyć osadzonych czcionek PDF.\ndocument_colors_not_allowed=Dokumenty PDF nie mogą używać własnych kolorów: Opcja „Pozwalaj stronom stosować inne kolory” w przeglądarce jest nieaktywna.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/pt-BR/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Próxima página\nnext_label=Próxima\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Página\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Reduzir\nzoom_out_label=Reduzir\nzoom_in.title=Ampliar\nzoom_in_label=Ampliar\nzoom.title=Zoom\npresentation_mode.title=Alternar para o modo de apresentação\npresentation_mode_label=Modo de apresentação\nopen_file.title=Abrir arquivo\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Download\ndownload_label=Download\nbookmark.title=Visualização atual (copiar ou abrir em uma nova janela)\nbookmark_label=Visualização atual\n\n# Secondary toolbar and context menu\ntools.title=Ferramentas\ntools_label=Ferramentas\nfirst_page.title=Ir para a primeira página\nfirst_page.label=Ir para a primeira página\nfirst_page_label=Ir para a primeira página\nlast_page.title=Ir para a última página\nlast_page.label=Ir para a última página\nlast_page_label=Ir para a última página\npage_rotate_cw.title=Girar no sentido horário\npage_rotate_cw.label=Girar no sentido horário\npage_rotate_cw_label=Girar no sentido horário\npage_rotate_ccw.title=Girar no sentido anti-horário\npage_rotate_ccw.label=Girar no sentido anti-horário\npage_rotate_ccw_label=Girar no sentido anti-horário\n\ncursor_text_select_tool.title=Habilitar a ferramenta de seleção de texto\ncursor_text_select_tool_label=Ferramenta de seleção de texto\ncursor_hand_tool.title=Habilitar ferramenta de mão\ncursor_hand_tool_label=Ferramenta de mão\n\n# Document properties dialog box\ndocument_properties.title=Propriedades do documento…\ndocument_properties_label=Propriedades do documento…\ndocument_properties_file_name=Nome do arquivo:\ndocument_properties_file_size=Tamanho do arquivo:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Assunto:\ndocument_properties_keywords=Palavras-chave:\ndocument_properties_creation_date=Data da criação:\ndocument_properties_modification_date=Data da modificação:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Criação:\ndocument_properties_producer=Criador do PDF:\ndocument_properties_version=Versão do PDF:\ndocument_properties_page_count=Número de páginas:\ndocument_properties_close=Fechar\n\nprint_progress_message=Preparando documento para impressão…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}} %\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Alternar painel\ntoggle_sidebar_notification.title=Alternar o painel (documento contém marcadores e anexos)\ntoggle_sidebar_label=Alternar painel\ndocument_outline.title=Mostrar a estrutura do documento (duplo-clique para expandir/recolher todos os ítens)\ndocument_outline_label=Estrutura do documento\nattachments.title=Mostrar anexos\nattachments_label=Anexos\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Localizar no documento\nfindbar_label=Localizar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura da página {{page}}\n\n# Find panel button title and messages\nfind_input.title=Localizar\nfind_input.placeholder=Localizar no documento…\nfind_previous.title=Localizar a ocorrência anterior da frase\nfind_previous_label=Anterior\nfind_next.title=Localizar a próxima ocorrência da frase\nfind_next_label=Próxima\nfind_highlight=Realçar tudo\nfind_match_case_label=Diferenciar maiúsculas/minúsculas\nfind_reached_top=Início do documento alcançado, continuando do fim\nfind_reached_bottom=Fim do documento alcançado, continuando do início\nfind_not_found=Frase não encontrada\n\n# Error panel labels\nerror_more_info=Mais informações\nerror_less_info=Menos informações\nerror_close=Fechar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (compilação: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensagem: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pilha: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Arquivo: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linha: {{line}}\nrendering_error=Ocorreu um erro ao renderizar a página.\n\n# Predefined zoom values\npage_scale_width=Largura da página\npage_scale_fit=Ajustar à janela\npage_scale_auto=Zoom automático\npage_scale_actual=Tamanho real\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Erro\nloading_error=Ocorreu um erro ao carregar o PDF.\ninvalid_file_error=Arquivo PDF corrompido ou inválido.\nmissing_file_error=Arquivo PDF ausente.\nunexpected_response_error=Resposta inesperada do servidor.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotação {{type}}]\npassword_label=Forneça a senha para abrir este arquivo PDF.\npassword_invalid=Senha inválida. Por favor, tentar de novo.\npassword_ok=OK\npassword_cancel=Cancelar\n\nprinting_not_supported=Aviso: a impressão não é totalmente suportada neste navegador.\nprinting_not_ready=Aviso: o PDF não está totalmente carregado para impressão.\nweb_fonts_disabled=As fontes web estão desabilitadas: não foi possível usar fontes incorporadas do PDF.\ndocument_colors_not_allowed=Os documentos em PDF não estão autorizados a usar suas próprias cores: “Permitir que as páginas escolham suas próprias cores” está desabilitado no navegador.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/pt-PT/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Página seguinte\nnext_label=Seguinte\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Página\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Reduzir\nzoom_out_label=Reduzir\nzoom_in.title=Ampliar\nzoom_in_label=Ampliar\nzoom.title=Zoom\npresentation_mode.title=Trocar para o modo de apresentação\npresentation_mode_label=Modo de apresentação\nopen_file.title=Abrir ficheiro\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Descarregar\ndownload_label=Descarregar\nbookmark.title=Visão atual (copiar ou abrir em nova janela)\nbookmark_label=Visão atual\n\n# Secondary toolbar and context menu\ntools.title=Ferramentas\ntools_label=Ferramentas\nfirst_page.title=Ir para a primeira página\nfirst_page.label=Ir para a primeira página\nfirst_page_label=Ir para a primeira página\nlast_page.title=Ir para a última página\nlast_page.label=Ir para a última página\nlast_page_label=Ir para a última página\npage_rotate_cw.title=Rodar à direita\npage_rotate_cw.label=Rodar à direita\npage_rotate_cw_label=Rodar à direita\npage_rotate_ccw.title=Rodar à esquerda\npage_rotate_ccw.label=Rodar à esquerda\npage_rotate_ccw_label=Rodar à esquerda\n\ncursor_text_select_tool.title=Ativar ferramenta de seleção de texto\ncursor_text_select_tool_label=Ferramenta de seleção de texto\ncursor_hand_tool.title=Ativar ferramenta de mão\ncursor_hand_tool_label=Ferramenta de mão\n\n# Document properties dialog box\ndocument_properties.title=Propriedades do documento…\ndocument_properties_label=Propriedades do documento…\ndocument_properties_file_name=Nome do ficheiro:\ndocument_properties_file_size=Tamanho do ficheiro:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Assunto:\ndocument_properties_keywords=Palavras-chave:\ndocument_properties_creation_date=Data de criação:\ndocument_properties_modification_date=Data de modificação:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Criador:\ndocument_properties_producer=Produtor de PDF:\ndocument_properties_version=Versão do PDF:\ndocument_properties_page_count=N.º de páginas:\ndocument_properties_close=Fechar\n\nprint_progress_message=A preparar o documento para impressão…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Alternar barra lateral\ntoggle_sidebar_notification.title=Alternar barra lateral (documento contém contorno/anexos)\ntoggle_sidebar_label=Alternar barra lateral\ndocument_outline.title=Mostrar esquema do documento (duplo clique para expandir/colapsar todos os itens)\ndocument_outline_label=Estrutura do documento\nattachments.title=Mostrar anexos\nattachments_label=Anexos\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Localizar no documento\nfindbar_label=Localizar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura da página {{page}}\n\n# Find panel button title and messages\nfind_input.title=Localizar\nfind_input.placeholder=Localizar no documento…\nfind_previous.title=Localizar ocorrência anterior da frase\nfind_previous_label=Anterior\nfind_next.title=Localizar ocorrência seguinte da frase\nfind_next_label=Seguinte\nfind_highlight=Destacar tudo\nfind_match_case_label=Correspondência\nfind_reached_top=Topo do documento atingido, a continuar a partir do fundo\nfind_reached_bottom=Fim do documento atingido, a continuar a partir do topo\nfind_not_found=Frase não encontrada\n\n# Error panel labels\nerror_more_info=Mais informação\nerror_less_info=Menos informação\nerror_close=Fechar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (compilação: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensagem: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ficheiro: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linha: {{line}}\nrendering_error=Ocorreu um erro ao processar a página.\n\n# Predefined zoom values\npage_scale_width=Ajustar à largura\npage_scale_fit=Ajustar à página\npage_scale_auto=Zoom automático\npage_scale_actual=Tamanho real\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Erro\nloading_error=Ocorreu um erro ao carregar o PDF.\ninvalid_file_error=Ficheiro PDF inválido ou danificado.\nmissing_file_error=Ficheiro PDF inexistente.\nunexpected_response_error=Resposta inesperada do servidor.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotação {{type}}]\npassword_label=Digite a palavra-passe para abrir este ficheiro PDF.\npassword_invalid=Palavra-passe inválida. Por favor, tente novamente.\npassword_ok=OK\npassword_cancel=Cancelar\n\nprinting_not_supported=Aviso: a impressão não é totalmente suportada por este navegador.\nprinting_not_ready=Aviso: o PDF ainda não está totalmente carregado.\nweb_fonts_disabled=Os tipos de letra web estão desativados: não é possível utilizar os tipos de letra PDF incorporados.\ndocument_colors_not_allowed=Os documentos PDF não permitem a utilização das suas próprias cores: “Permitir às páginas escolher as suas próprias cores” está desativado no navegador.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/rm/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pagina precedenta\nprevious_label=Enavos\nnext.title=Proxima pagina\nnext_label=Enavant\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pagina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=da {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} da {{pagesCount}})\n\nzoom_out.title=Empitschnir\nzoom_out_label=Empitschnir\nzoom_in.title=Engrondir\nzoom_in_label=Engrondir\nzoom.title=Zoom\npresentation_mode.title=Midar en il modus da preschentaziun\npresentation_mode_label=Modus da preschentaziun\nopen_file.title=Avrir datoteca\nopen_file_label=Avrir\nprint.title=Stampar\nprint_label=Stampar\ndownload.title=Telechargiar\ndownload_label=Telechargiar\nbookmark.title=Vista actuala (copiar u avrir en ina nova fanestra)\nbookmark_label=Vista actuala\n\n# Secondary toolbar and context menu\ntools.title=Utensils\ntools_label=Utensils\nfirst_page.title=Siglir a l'emprima pagina\nfirst_page.label=Siglir a l'emprima pagina\nfirst_page_label=Siglir a l'emprima pagina\nlast_page.title=Siglir a la davosa pagina\nlast_page.label=Siglir a la davosa pagina\nlast_page_label=Siglir a la davosa pagina\npage_rotate_cw.title=Rotar en direcziun da l'ura\npage_rotate_cw.label=Rotar en direcziun da l'ura\npage_rotate_cw_label=Rotar en direcziun da l'ura\npage_rotate_ccw.title=Rotar en direcziun cuntraria a l'ura\npage_rotate_ccw.label=Rotar en direcziun cuntraria a l'ura\npage_rotate_ccw_label=Rotar en direcziun cuntraria a l'ura\n\ncursor_text_select_tool.title=Activar l'utensil per selecziunar text\ncursor_text_select_tool_label=Utensil per selecziunar text\ncursor_hand_tool.title=Activar l'utensil da maun\ncursor_hand_tool_label=Utensil da maun\n\n# Document properties dialog box\ndocument_properties.title=Caracteristicas dal document…\ndocument_properties_label=Caracteristicas dal document…\ndocument_properties_file_name=Num da la datoteca:\ndocument_properties_file_size=Grondezza da la datoteca:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Autur:\ndocument_properties_subject=Tema:\ndocument_properties_keywords=Chavazzins:\ndocument_properties_creation_date=Data da creaziun:\ndocument_properties_modification_date=Data da modificaziun:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}} {{time}}\ndocument_properties_creator=Creà da:\ndocument_properties_producer=Creà il PDF cun:\ndocument_properties_version=Versiun da PDF:\ndocument_properties_page_count=Dumber da paginas:\ndocument_properties_close=Serrar\n\nprint_progress_message=Preparar il document per stampar…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Interrumper\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Activar/deactivar la trav laterala\ntoggle_sidebar_notification.title=Activar/deactivar la trav laterala (structura dal document/agiuntas)\ntoggle_sidebar_label=Activar/deactivar la trav laterala\ndocument_outline.title=Mussar la structura dal document (cliccar duas giadas per extender/cumprimer tut ils elements)\ndocument_outline_label=Structura dal document\nattachments.title=Mussar agiuntas\nattachments_label=Agiuntas\nthumbs.title=Mussar las miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Tschertgar en il document\nfindbar_label=Tschertgar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura da la pagina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Tschertgar\nfind_input.placeholder=Tschertgar en il document…\nfind_previous.title=Tschertgar la posiziun precedenta da l'expressiun\nfind_previous_label=Enavos\nfind_next.title=Tschertgar la proxima posiziun da l'expressiun\nfind_next_label=Enavant\nfind_highlight=Relevar tuts\nfind_match_case_label=Resguardar maiusclas/minusclas\nfind_reached_top=Il cumenzament dal document è cuntanschì, la tschertga cuntinuescha a la fin dal document\nfind_reached_bottom=La fin dal document è cuntanschì, la tschertga cuntinuescha al cumenzament dal document\nfind_not_found=Impussibel da chattar l'expressiun\n\n# Error panel labels\nerror_more_info=Dapli infurmaziuns\nerror_less_info=Damain infurmaziuns\nerror_close=Serrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Messadi: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Datoteca: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Lingia: {{line}}\nrendering_error=Ina errur è cumparida cun visualisar questa pagina.\n\n# Predefined zoom values\npage_scale_width=Ladezza da la pagina\npage_scale_fit=Entira pagina\npage_scale_auto=Zoom automatic\npage_scale_actual=Grondezza actuala\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Errur\nloading_error=Ina errur è cumparida cun chargiar il PDF.\ninvalid_file_error=Datoteca PDF nunvalida u donnegiada.\nmissing_file_error=Datoteca PDF manconta.\nunexpected_response_error=Resposta nunspetgada dal server.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Annotaziun da {{type}}]\npassword_label=Endatescha il pled-clav per avrir questa datoteca da PDF.\npassword_invalid=Pled-clav nunvalid. Emprova anc ina giada.\npassword_ok=OK\npassword_cancel=Interrumper\n\nprinting_not_supported=Attenziun: Il stampar na funcziunescha anc betg dal tut en quest navigatur.\nprinting_not_ready=Attenziun: Il PDF n'è betg chargià cumplettamain per stampar.\nweb_fonts_disabled=Scrittiras dal web èn deactivadas: impussibel dad utilisar las scrittiras integradas en il PDF.\ndocument_colors_not_allowed=Documents da PDF na dastgan betg duvrar las atgnas colurs: 'Permetter a paginas da tscherner lur atgna colur' è deactivà en il navigatur.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ro/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pagina precedentă\nprevious_label=Înapoi\nnext.title=Pagina următoare\nnext_label=Înainte\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pagina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=din {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} din {{pagesCount}})\n\nzoom_out.title=Micșorează\nzoom_out_label=Micșorează\nzoom_in.title=Mărește\nzoom_in_label=Mărește\nzoom.title=Zoom\npresentation_mode.title=Schimbă la modul de prezentare\npresentation_mode_label=Mod de prezentare\nopen_file.title=Deschide un fișier\nopen_file_label=Deschide\nprint.title=Tipărește\nprint_label=Tipărește\ndownload.title=Descarcă\ndownload_label=Descarcă\nbookmark.title=Vizualizare actuală (copiați sau deschideți într-o fereastră nouă)\nbookmark_label=Vizualizare actuală\n\n# Secondary toolbar and context menu\ntools.title=Unelte\ntools_label=Unelte\nfirst_page.title=Mergi la prima pagină\nfirst_page.label=Mergi la prima pagină\nfirst_page_label=Mergi la prima pagină\nlast_page.title=Mergi la ultima pagină\nlast_page.label=Mergi la ultima pagină\nlast_page_label=Mergi la ultima pagină\npage_rotate_cw.title=Rotește în sensul acelor de ceasornic\npage_rotate_cw.label=Rotește în sensul acelor de ceasornic\npage_rotate_cw_label=Rotește în sensul acelor de ceasornic\npage_rotate_ccw.title=Rotește în sens invers al acelor de ceasornic\npage_rotate_ccw.label=Rotește în sens invers al acelor de ceasornic\npage_rotate_ccw_label=Rotește în sens invers al acelor de ceasornic\n\n\n# Document properties dialog box\ndocument_properties.title=Proprietățile documentului…\ndocument_properties_label=Proprietățile documentului…\ndocument_properties_file_name=Numele fișierului:\ndocument_properties_file_size=Dimensiunea fișierului:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} byți)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byți)\ndocument_properties_title=Titlu:\ndocument_properties_author=Autor:\ndocument_properties_subject=Subiect:\ndocument_properties_keywords=Cuvinte cheie:\ndocument_properties_creation_date=Data creării:\ndocument_properties_modification_date=Data modificării:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Autor:\ndocument_properties_producer=Producător PDF:\ndocument_properties_version=Versiune PDF:\ndocument_properties_page_count=Număr de pagini:\ndocument_properties_close=Închide\n\nprint_progress_message=Se pregătește documentul pentru imprimare…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Renunță\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Comută bara laterală\ntoggle_sidebar_notification.title=Comută bara laterală (documentul conține schițe/atașamente)\ntoggle_sidebar_label=Comută bara laterală\ndocument_outline.title=Arată schița documentului (dublu-clic pentru a expanda/colapsa toate elementele\ndocument_outline_label=Schiță document\nattachments.title=Afișează atașamentele\nattachments_label=Atașamente\nthumbs.title=Arată miniaturi\nthumbs_label=Miniaturi\nfindbar.title=Găsește în document\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura paginii {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Găsește instanța anterioară în frază\nfind_previous_label=Anterior\nfind_next.title=Găsește instanța următoare în frază\nfind_next_label=Următor\nfind_highlight=Evidențiază aparițiile\nfind_match_case_label=Potrivește literele mari și mici\nfind_reached_top=Am ajuns la începutul documentului, continuă de la sfârșit\nfind_reached_bottom=Am ajuns la sfârșitul documentului, continuă de la început\nfind_not_found=Nu s-a găsit textul\n\n# Error panel labels\nerror_more_info=Mai multe informații\nerror_less_info=Mai puține informații\nerror_close=Închide\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (varianta: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesaj: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stivă: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fișier: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linie: {{line}}\nrendering_error=A intervenit o eroare la afișarea paginii.\n\n# Predefined zoom values\npage_scale_width=Lățime pagină\npage_scale_fit=Potrivire la pagină\npage_scale_auto=Zoom automat\npage_scale_actual=Dimensiune reală\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Eroare\nloading_error=A intervenit o eroare la încărcarea fișierului PDF.\ninvalid_file_error=Fișier PDF invalid sau deteriorat.\nmissing_file_error=Fișier PDF lipsă.\nunexpected_response_error=Răspuns neașteptat de la server.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Adnotare]\npassword_label=Introduceți parola pentru a deschide acest fișier PDF.\npassword_invalid=Parolă greșită. Vă rugăm să încercați din nou.\npassword_ok=Ok\npassword_cancel=Renunță\n\nprinting_not_supported=Avertisment: Tipărirea nu este suportată în totalitate de acest browser.\nprinting_not_ready=Avertisment: Fișierul PDF nu este încărcat complet pentru tipărire.\nweb_fonts_disabled=Fonturile web sunt dezactivate: nu pot utiliza fonturile PDF încorporate.\ndocument_colors_not_allowed=Documentele PDF nu sunt autorizate să folosească propriile culori: 'Permite paginilor să aleagă propriile culori' este dezactivată în browser.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ru/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Предыдущая страница\nprevious_label=Предыдущая\nnext.title=Следующая страница\nnext_label=Следующая\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Страница\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=из {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} из {{pagesCount}})\n\nzoom_out.title=Уменьшить\nzoom_out_label=Уменьшить\nzoom_in.title=Увеличить\nzoom_in_label=Увеличить\nzoom.title=Масштаб\npresentation_mode.title=Перейти в режим презентации\npresentation_mode_label=Режим презентации\nopen_file.title=Открыть файл\nopen_file_label=Открыть\nprint.title=Печать\nprint_label=Печать\ndownload.title=Загрузить\ndownload_label=Загрузить\nbookmark.title=Ссылка на текущий вид (скопировать или открыть в новом окне)\nbookmark_label=Текущий вид\n\n# Secondary toolbar and context menu\ntools.title=Инструменты\ntools_label=Инструменты\nfirst_page.title=Перейти на первую страницу\nfirst_page.label=Перейти на первую страницу\nfirst_page_label=Перейти на первую страницу\nlast_page.title=Перейти на последнюю страницу\nlast_page.label=Перейти на последнюю страницу\nlast_page_label=Перейти на последнюю страницу\npage_rotate_cw.title=Повернуть по часовой стрелке\npage_rotate_cw.label=Повернуть по часовой стрелке\npage_rotate_cw_label=Повернуть по часовой стрелке\npage_rotate_ccw.title=Повернуть против часовой стрелки\npage_rotate_ccw.label=Повернуть против часовой стрелки\npage_rotate_ccw_label=Повернуть против часовой стрелки\n\ncursor_text_select_tool.title=Включить Инструмент «Выделение текста»\ncursor_text_select_tool_label=Инструмент «Выделение текста»\ncursor_hand_tool.title=Включить Инструмент «Рука»\ncursor_hand_tool_label=Инструмент «Рука»\n\n# Document properties dialog box\ndocument_properties.title=Свойства документа…\ndocument_properties_label=Свойства документа…\ndocument_properties_file_name=Имя файла:\ndocument_properties_file_size=Размер файла:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} байт)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} байт)\ndocument_properties_title=Заголовок:\ndocument_properties_author=Автор:\ndocument_properties_subject=Тема:\ndocument_properties_keywords=Ключевые слова:\ndocument_properties_creation_date=Дата создания:\ndocument_properties_modification_date=Дата изменения:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Приложение:\ndocument_properties_producer=Производитель PDF:\ndocument_properties_version=Версия PDF:\ndocument_properties_page_count=Число страниц:\ndocument_properties_close=Закрыть\n\nprint_progress_message=Подготовка документа к печати…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Отмена\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Показать/скрыть боковую панель\ntoggle_sidebar_notification.title=Показать/скрыть боковую панель (документ имеет содержание/вложения)\ntoggle_sidebar_label=Показать/скрыть боковую панель\ndocument_outline.title=Показать содержание документа (двойной щелчок, чтобы развернуть/свернуть все элементы)\ndocument_outline_label=Содержание документа\nattachments.title=Показать вложения\nattachments_label=Вложения\nthumbs.title=Показать миниатюры\nthumbs_label=Миниатюры\nfindbar.title=Найти в документе\nfindbar_label=Найти\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Страница {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Миниатюра страницы {{page}}\n\n# Find panel button title and messages\nfind_input.title=Найти\nfind_input.placeholder=Найти в документе…\nfind_previous.title=Найти предыдущее вхождение фразы в текст\nfind_previous_label=Назад\nfind_next.title=Найти следующее вхождение фразы в текст\nfind_next_label=Далее\nfind_highlight=Подсветить все\nfind_match_case_label=С учётом регистра\nfind_reached_top=Достигнут верх документа, продолжено снизу\nfind_reached_bottom=Достигнут конец документа, продолжено сверху\nfind_not_found=Фраза не найдена\n\n# Error panel labels\nerror_more_info=Детали\nerror_less_info=Скрыть детали\nerror_close=Закрыть\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (сборка: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Сообщение: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стeк: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Строка: {{line}}\nrendering_error=При создании страницы произошла ошибка.\n\n# Predefined zoom values\npage_scale_width=По ширине страницы\npage_scale_fit=По размеру страницы\npage_scale_auto=Автоматически\npage_scale_actual=Реальный размер\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Ошибка\nloading_error=При загрузке PDF произошла ошибка.\ninvalid_file_error=Некорректный или повреждённый PDF-файл.\nmissing_file_error=PDF-файл отсутствует.\nunexpected_response_error=Неожиданный ответ сервера.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Аннотация {{type}}]\npassword_label=Введите пароль, чтобы открыть этот PDF-файл.\npassword_invalid=Неверный пароль. Пожалуйста, попробуйте снова.\npassword_ok=OK\npassword_cancel=Отмена\n\nprinting_not_supported=Предупреждение: В этом браузере не полностью поддерживается печать.\nprinting_not_ready=Предупреждение: PDF не полностью загружен для печати.\nweb_fonts_disabled=Веб-шрифты отключены: невозможно использовать встроенные PDF-шрифты.\ndocument_colors_not_allowed=PDF-документам не разрешено использовать свои цвета: в браузере отключён параметр «Разрешить веб-сайтам использовать свои цвета».\n"
  },
  {
    "path": "example/pages/include/pdf/locale/rw/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom.title=Ihindurangano\nopen_file.title=Gufungura Dosiye\nopen_file_label=Gufungura\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Umutwe:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\n\n# Find panel button title and messages\nfind_previous.title=Gushaka aho uyu murongo ugaruka mbere y'aha\nfind_next.title=Gushaka aho uyu murongo wongera kugaruka\nfind_not_found=Umurongo ntubonetse\n\n# Error panel labels\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\n\n# Predefined zoom values\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Ikosa\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_invalid=Ijambo ry'ibanga ridahari. Wakongera ukagerageza\npassword_ok=YEGO\n\n"
  },
  {
    "path": "example/pages/include/pdf/locale/sah/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Инники сирэй\nprevious_label=Иннинээҕи\nnext.title=Аныгыскы сирэй\nnext_label=Аныгыскы\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Куччат\nzoom_out_label=Куччат\nzoom_in.title=Улаатыннар\nzoom_in_label=Улаатыннар\nzoom.title=Улаатыннар\npresentation_mode.title=Көрдөрөр эрэсиимҥэ\npresentation_mode_label=Көрдөрөр эрэсиим\nopen_file.title=Билэни арый\nopen_file_label=Ас\nprint.title=Бэчээт\nprint_label=Бэчээт\ndownload.title=Хачайдааһын\ndownload_label=Хачайдааһын\nbookmark.title=Билиҥҥи көстүүтэ (хатылаа эбэтэр саҥа түннүккэ арый)\nbookmark_label=Билиҥҥи көстүүтэ\n\n# Secondary toolbar and context menu\ntools.title=Тэриллэр\ntools_label=Тэриллэр\nfirst_page.title=Бастакы сирэйгэ көс\nfirst_page.label=Бастакы сирэйгэ көс\nfirst_page_label=Бастакы сирэйгэ көс\nlast_page.title=Тиһэх сирэйгэ көс\nlast_page.label=Тиһэх сирэйгэ көс\nlast_page_label=Тиһэх сирэйгэ көс\npage_rotate_cw.title=Чаһы хоту эргит\npage_rotate_cw.label=Чаһы хоту эргит\npage_rotate_cw_label=Чаһы хоту эргит\npage_rotate_ccw.title=Чаһы утары эргит\npage_rotate_ccw.label=Чаһы утары эргит\npage_rotate_ccw_label=Чаһы утары эргит\n\n\n# Document properties dialog box\ndocument_properties.title=Докумуон туруоруулара...\ndocument_properties_label=Докумуон туруоруулара...\\u0020\ndocument_properties_file_name=Билэ аата:\ndocument_properties_file_size=Билэ кээмэйэ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} баайт)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} баайт)\ndocument_properties_title=Баһа:\ndocument_properties_author=Ааптар:\ndocument_properties_subject=Тиэмэ:\ndocument_properties_keywords=Күлүүс тыл:\ndocument_properties_creation_date=Оҥоһуллубут кэмэ:\ndocument_properties_modification_date=Уларытыллыбыт кэмэ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_producer=PDF оҥорооччу:\ndocument_properties_version=PDF барыла:\ndocument_properties_page_count=Сирэй ахсаана:\ndocument_properties_close=Сап\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Ойоҕос хапталы арый/сап\ntoggle_sidebar_label=Ойоҕос хапталы арый/сап\ndocument_outline_label=Дөкүмүөн иһинээҕитэ\nattachments.title=Кыбытыктары көрдөр\nattachments_label=Кыбытык\nthumbs.title=Ойуучааннары көрдөр\nthumbs_label=Ойуучааннар\nfindbar.title=Дөкүмүөнтэн бул\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Сирэй {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Сирэй ойуучаана {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Этии тиэкискэ бу иннинээҕи киириитин бул\nfind_previous_label=Иннинээҕи\nfind_next.title=Этии тиэкискэ бу кэннинээҕи киириитин бул\nfind_next_label=Аныгыскы\nfind_highlight=Барытын сырдатан көрдөр\nfind_match_case_label=Буукуба улаханын-кыратын араар\nfind_reached_top=Сирэй үрдүгэр тиийдиҥ, салгыыта аллара\nfind_reached_bottom=Сирэй бүттэ, үөһэ салҕанна\nfind_not_found=Этии көстүбэтэ\n\n# Error panel labels\nerror_more_info=Сиһилии\nerror_less_info=Сиһилиитин кистээ\nerror_close=Сап\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (хомуйуута: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Этии: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стeк: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Билэ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Устуруока: {{line}}\nrendering_error=Сирэйи айарга алҕас таҕыста.\n\n# Predefined zoom values\npage_scale_width=Сирэй кэтитинэн\npage_scale_fit=Сирэй кээмэйинэн\npage_scale_auto=Аптамаатынан\npage_scale_actual=Дьиҥнээх кээмэйэ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Алҕас\nloading_error=PDF-билэни хачайдыырга алҕас таҕыста.\ninvalid_file_error=Туох эрэ алҕастаах эбэтэр алдьаммыт PDF-билэ.\nmissing_file_error=PDF-билэ суох.\nunexpected_response_error=Сиэрбэр хоруйдаабат.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} туһунан]\npassword_label=Бу PDF-билэни арыйарга көмүскэл тылы киллэриэхтээхин.\npassword_invalid=Киирии тыл алҕастаах. Бука диэн, хатылаан көр.\npassword_ok=СӨП\n\nprinting_not_supported=Сэрэтии: Бу браузер бэчээттиири толору өйөөбөт.\nprinting_not_ready=Сэрэтии: PDF бэчээттииргэ толору хачайдана илик.\nweb_fonts_disabled=Ситим-бичиктэр араарыллыахтара: PDF бичиктэрэ кыайан көстүбэттэр.\ndocument_colors_not_allowed=PDF-дөкүмүөүннэргэ бэйэлэрин өҥнөрүн туттар көҥүллэммэтэ: \"Ситим-сирдэр бэйэлэрин өҥнөрүн тутталларын көҥүллүүргэ\" диэн браузерга арахса сылдьар эбит.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/si/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=මීට පෙර පිටුව\nprevious_label=පෙර\nnext.title=මීළඟ පිටුව\nnext_label=මීළඟ\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=පිටුව\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=කුඩා කරන්න\nzoom_out_label=කුඩා කරන්න\nzoom_in.title=විශාල කරන්න\nzoom_in_label=විශාල කරන්න\nzoom.title=විශාලණය\npresentation_mode.title=ඉදිරිපත්කිරීම් ප්‍රකාරය වෙත මාරුවන්න\npresentation_mode_label=ඉදිරිපත්කිරීම් ප්‍රකාරය\nopen_file.title=ගොනුව විවෘත කරන්න\nopen_file_label=විවෘත කරන්න\nprint.title=මුද්‍රණය\nprint_label=මුද්‍රණය\ndownload.title=බාගන්න\ndownload_label=බාගන්න\nbookmark.title=දැනට ඇති දසුන (පිටපත් කරන්න හෝ නව කවුළුවක විවෘත කරන්න)\nbookmark_label=දැනට ඇති දසුන\n\n# Secondary toolbar and context menu\ntools.title=මෙවලම්\ntools_label=මෙවලම්\nfirst_page.title=මුල් පිටුවට යන්න\nfirst_page.label=මුල් පිටුවට යන්න\nfirst_page_label=මුල් පිටුවට යන්න\nlast_page.title=අවසන් පිටුවට යන්න\nlast_page.label=අවසන් පිටුවට යන්න\nlast_page_label=අවසන් පිටුවට යන්න\npage_rotate_cw.title=දක්ශිණාවර්තව භ්‍රමණය\npage_rotate_cw.label=දක්ශිණාවර්තව භ්‍රමණය\npage_rotate_cw_label=දක්ශිණාවර්තව භ්‍රමණය\npage_rotate_ccw.title=වාමාවර්තව භ්‍රමණය\npage_rotate_ccw.label=වාමාවර්තව භ්‍රමණය\npage_rotate_ccw_label=වාමාවර්තව භ්‍රමණය\n\n\n# Document properties dialog box\ndocument_properties.title=ලේඛන වත්කම්...\ndocument_properties_label=ලේඛන වත්කම්...\ndocument_properties_file_name=ගොනු නම:\ndocument_properties_file_size=ගොනු ප්‍රමාණය:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} බයිට)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} බයිට)\ndocument_properties_title=සිරස්තලය:\ndocument_properties_author=කතෲ\ndocument_properties_subject=මාතෘකාව:\ndocument_properties_keywords=යතුරු වදන්:\ndocument_properties_creation_date=නිර්මිත දිනය:\ndocument_properties_modification_date=වෙනස්කල දිනය:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=නිර්මාපක:\ndocument_properties_producer=PDF නිශ්පාදක:\ndocument_properties_version=PDF නිකුතුව:\ndocument_properties_page_count=පිටු ගණන:\ndocument_properties_close=වසන්න\n\nprint_progress_message=ලේඛනය මුද්‍රණය සඳහා සූදානම් කරමින්…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_close=අවලංගු කරන්න\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=පැති තීරුවට මාරුවන්න\ntoggle_sidebar_label=පැති තීරුවට මාරුවන්න\nattachments.title=ඇමිණුම් පෙන්වන්න\nattachments_label=ඇමිණුම්\nthumbs.title=සිඟිති රූ පෙන්වන්න\nthumbs_label=සිඟිති රූ\nfindbar.title=ලේඛනය තුළ සොයන්න\nfindbar_label=සොයන්න\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=පිටුව {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=පිටුවෙ සිඟිත රූව {{page}}\n\n# Find panel button title and messages\nfind_previous.title=මේ වාක්‍ය ඛණ්ඩය මීට පෙර යෙදුණු ස්ථානය සොයන්න\nfind_previous_label=පෙර:\nfind_next.title=මේ වාක්‍ය ඛණ්ඩය මීළඟට යෙදෙන ස්ථානය සොයන්න\nfind_next_label=මීළඟ\nfind_highlight=සියල්ල උද්දීපනය\nfind_match_case_label=අකුරු ගළපන්න\nfind_reached_top=පිටුවේ ඉහළ කෙළවරට ලගාවිය, පහළ සිට ඉදිරියට යමින්\nfind_reached_bottom=පිටුවේ පහළ කෙළවරට ලගාවිය, ඉහළ සිට ඉදිරියට යමින්\nfind_not_found=ඔබ සෙව් වචන හමු නොවීය\n\n# Error panel labels\nerror_more_info=බොහෝ තොරතුරු\nerror_less_info=අවම තොරතුරු\nerror_close=වසන්න\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (නිකුතුව: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=පණිවිඩය: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ගොනුව: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=පේළිය: {{line}}\nrendering_error=පිටුව රෙන්ඩර් විමේදි ගැටලුවක් හට ගැනුණි.\n\n# Predefined zoom values\npage_scale_width=පිටුවේ පළල\npage_scale_fit=පිටුවට සුදුසු ලෙස\npage_scale_auto=ස්වයංක්‍රීය විශාලණය\npage_scale_actual=නියමිත ප්‍රමාණය\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=දෝෂය\nloading_error=PDF පූරණය විමේදි දෝෂයක් හට ගැනුණි.\ninvalid_file_error=දූශිත හෝ සාවද්‍ය PDF ගොනුව.\nmissing_file_error=නැතිවූ PDF ගොනුව.\nunexpected_response_error=බලාපොරොත්තු නොවූ සේවාදායක ප්‍රතිචාරය.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} විස්තරය]\npassword_label=මෙම PDF ගොනුව විවෘත කිරීමට මුරපදය ඇතුළත් කරන්න.\npassword_invalid=වැරදි මුරපදයක්. කරුණාකර නැවත උත්සහ කරන්න.\npassword_ok=හරි\npassword_cancel=එපා\n\nprinting_not_supported=අවවාදයයි: මෙම ගවේශකය මුද්‍රණය සඳහා සම්පූර්ණයෙන් සහය නොදක්වයි.\nprinting_not_ready=අවවාදයයි: මුද්‍රණය සඳහා PDF සම්පූර්ණයෙන් පූර්ණය වී නොමැත.\nweb_fonts_disabled=ජාල අකුරු අක්‍රීයයි: තිළැලි PDF අකුරු භාවිත කළ නොහැක.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/sk/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Predchádzajúca strana\nprevious_label=Predchádzajúca\nnext.title=Nasledujúca strana\nnext_label=Nasledujúca\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Strana\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=z {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} z {{pagesCount}})\n\nzoom_out.title=Vzdialiť\nzoom_out_label=Vzdialiť\nzoom_in.title=Priblížiť\nzoom_in_label=Priblížiť\nzoom.title=Lupa\npresentation_mode.title=Prepnúť na režim Prezentácia\npresentation_mode_label=Režim Prezentácia\nopen_file.title=Otvoriť súbor\nopen_file_label=Otvoriť\nprint.title=Tlačiť\nprint_label=Tlačiť\ndownload.title=Prevziať\ndownload_label=Prevziať\nbookmark.title=Aktuálne zobrazenie (kopírovať alebo otvoriť v novom okne)\nbookmark_label=Aktuálne zobrazenie\n\n# Secondary toolbar and context menu\ntools.title=Nástroje\ntools_label=Nástroje\nfirst_page.title=Prejsť na prvú stranu\nfirst_page.label=Prejsť na prvú stranu\nfirst_page_label=Prejsť na prvú stranu\nlast_page.title=Prejsť na poslednú stranu\nlast_page.label=Prejsť na poslednú stranu\nlast_page_label=Prejsť na poslednú stranu\npage_rotate_cw.title=Otočiť v smere hodinových ručičiek\npage_rotate_cw.label=Otočiť v smere hodinových ručičiek\npage_rotate_cw_label=Otočiť v smere hodinových ručičiek\npage_rotate_ccw.title=Otočiť proti smeru hodinových ručičiek\npage_rotate_ccw.label=Otočiť proti smeru hodinových ručičiek\npage_rotate_ccw_label=Otočiť proti smeru hodinových ručičiek\n\ncursor_text_select_tool.title=Povoliť výber textu\ncursor_text_select_tool_label=Výber textu\ncursor_hand_tool.title=Povoliť nástroj ruka\ncursor_hand_tool_label=Nástroj ruka\n\n# Document properties dialog box\ndocument_properties.title=Vlastnosti dokumentu…\ndocument_properties_label=Vlastnosti dokumentu…\ndocument_properties_file_name=Názov súboru:\ndocument_properties_file_size=Veľkosť súboru:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kB ({{size_b}} bajtov)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajtov)\ndocument_properties_title=Názov:\ndocument_properties_author=Autor:\ndocument_properties_subject=Predmet:\ndocument_properties_keywords=Kľúčové slová:\ndocument_properties_creation_date=Dátum vytvorenia:\ndocument_properties_modification_date=Dátum úpravy:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Vytvoril:\ndocument_properties_producer=Tvorca PDF:\ndocument_properties_version=Verzia PDF:\ndocument_properties_page_count=Počet strán:\ndocument_properties_close=Zavrieť\n\nprint_progress_message=Príprava dokumentu na tlač…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Zrušiť\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Prepnúť bočný panel\ntoggle_sidebar_notification.title=Prepnúť bočný panel (dokument obsahuje osnovu/prílohy)\ntoggle_sidebar_label=Prepnúť bočný panel\ndocument_outline.title=Zobraziť prehľad dokumentu (dvojitým kliknutím rozbalíte/zbalíte všetky položky)\ndocument_outline_label=Prehľad dokumentu\nattachments.title=Zobraziť prílohy\nattachments_label=Prílohy\nthumbs.title=Zobraziť miniatúry\nthumbs_label=Miniatúry\nfindbar.title=Hľadať v dokumente\nfindbar_label=Hľadať\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strana {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatúra strany {{page}}\n\n# Find panel button title and messages\nfind_input.title=Hľadať\nfind_input.placeholder=Hľadať v dokumente…\nfind_previous.title=Vyhľadať predchádzajúci výskyt reťazca\nfind_previous_label=Predchádzajúce\nfind_next.title=Vyhľadať ďalší výskyt reťazca\nfind_next_label=Ďalšie\nfind_highlight=Zvýrazniť všetky\nfind_match_case_label=Rozlišovať malé/veľké písmená\nfind_reached_top=Bol dosiahnutý začiatok stránky, pokračuje sa od konca\nfind_reached_bottom=Bol dosiahnutý koniec stránky, pokračuje sa od začiatku\nfind_not_found=Výraz nebol nájdený\n\n# Error panel labels\nerror_more_info=Viac informácií\nerror_less_info=Menej informácií\nerror_close=Zavrieť\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (zostavenie: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Správa: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Zásobník: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Súbor: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Riadok: {{line}}\nrendering_error=Pri vykresľovaní stránky sa vyskytla chyba.\n\n# Predefined zoom values\npage_scale_width=Na šírku strany\npage_scale_fit=Na veľkosť strany\npage_scale_auto=Automatická veľkosť\npage_scale_actual=Skutočná veľkosť\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Chyba\nloading_error=Počas načítavania dokumentu PDF sa vyskytla chyba.\ninvalid_file_error=Neplatný alebo poškodený súbor PDF.\nmissing_file_error=Chýbajúci súbor PDF.\nunexpected_response_error=Neočakávaná odpoveď zo servera.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotácia typu {{type}}]\npassword_label=Ak chcete otvoriť tento súbor PDF, zadajte jeho heslo.\npassword_invalid=Heslo nie je platné. Skúste to znova.\npassword_ok=OK\npassword_cancel=Zrušiť\n\nprinting_not_supported=Upozornenie: tlač nie je v tomto prehliadači plne podporovaná.\nprinting_not_ready=Upozornenie: súbor PDF nie je plne načítaný pre tlač.\nweb_fonts_disabled=Webové písma sú vypnuté: nie je možné použiť písma vložené do súboru PDF.\ndocument_colors_not_allowed=Dokumenty PDF nemajú povolené používať vlastné farby, pretože voľba \"Povoliť stránkam používať vlastné farby\" je v nastaveniach prehliadača vypnutá.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/sl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Prejšnja stran\nprevious_label=Nazaj\nnext.title=Naslednja stran\nnext_label=Naprej\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Stran\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=od {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} od {{pagesCount}})\n\nzoom_out.title=Pomanjšaj\nzoom_out_label=Pomanjšaj\nzoom_in.title=Povečaj\nzoom_in_label=Povečaj\nzoom.title=Povečava\npresentation_mode.title=Preklopi v način predstavitve\npresentation_mode_label=Način predstavitve\nopen_file.title=Odpri datoteko\nopen_file_label=Odpri\nprint.title=Natisni\nprint_label=Natisni\ndownload.title=Prenesi\ndownload_label=Prenesi\nbookmark.title=Trenutni pogled (kopiraj ali odpri v novem oknu)\nbookmark_label=Trenutni pogled\n\n# Secondary toolbar and context menu\ntools.title=Orodja\ntools_label=Orodja\nfirst_page.title=Pojdi na prvo stran\nfirst_page.label=Pojdi na prvo stran\nfirst_page_label=Pojdi na prvo stran\nlast_page.title=Pojdi na zadnjo stran\nlast_page.label=Pojdi na zadnjo stran\nlast_page_label=Pojdi na zadnjo stran\npage_rotate_cw.title=Zavrti v smeri urninega kazalca\npage_rotate_cw.label=Zavrti v smeri urninega kazalca\npage_rotate_cw_label=Zavrti v smeri urninega kazalca\npage_rotate_ccw.title=Zavrti v nasprotni smeri urninega kazalca\npage_rotate_ccw.label=Zavrti v nasprotni smeri urninega kazalca\npage_rotate_ccw_label=Zavrti v nasprotni smeri urninega kazalca\n\ncursor_text_select_tool.title=Omogoči orodje za izbor besedila\ncursor_text_select_tool_label=Orodje za izbor besedila\ncursor_hand_tool.title=Omogoči roko\ncursor_hand_tool_label=Roka\n\n# Document properties dialog box\ndocument_properties.title=Lastnosti dokumenta …\ndocument_properties_label=Lastnosti dokumenta …\ndocument_properties_file_name=Ime datoteke:\ndocument_properties_file_size=Velikost datoteke:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajtov)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajtov)\ndocument_properties_title=Ime:\ndocument_properties_author=Avtor:\ndocument_properties_subject=Tema:\ndocument_properties_keywords=Ključne besede:\ndocument_properties_creation_date=Datum nastanka:\ndocument_properties_modification_date=Datum spremembe:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Ustvaril:\ndocument_properties_producer=Izdelovalec PDF:\ndocument_properties_version=Različica PDF:\ndocument_properties_page_count=Število strani:\ndocument_properties_close=Zapri\n\nprint_progress_message=Priprava dokumenta na tiskanje …\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}} %\nprint_progress_close=Prekliči\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Preklopi stransko vrstico\ntoggle_sidebar_notification.title=Preklopi stransko vrstico (dokument vsebuje oris/priponke)\ntoggle_sidebar_label=Preklopi stransko vrstico\ndocument_outline.title=Prikaži oris dokumenta (dvokliknite za razširitev/strnitev vseh predmetov)\ndocument_outline_label=Oris dokumenta\nattachments.title=Prikaži priponke\nattachments_label=Priponke\nthumbs.title=Prikaži sličice\nthumbs_label=Sličice\nfindbar.title=Iskanje po dokumentu\nfindbar_label=Najdi\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Stran {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Sličica strani {{page}}\n\n# Find panel button title and messages\nfind_input.title=Najdi\nfind_input.placeholder=Najdi v dokumentu …\nfind_previous.title=Najdi prejšnjo ponovitev iskanega\nfind_previous_label=Najdi nazaj\nfind_next.title=Najdi naslednjo ponovitev iskanega\nfind_next_label=Najdi naprej\nfind_highlight=Označi vse\nfind_match_case_label=Razlikuj velike/male črke\nfind_reached_top=Dosežen začetek dokumenta iz smeri konca\nfind_reached_bottom=Doseženo konec dokumenta iz smeri začetka\nfind_not_found=Iskanega ni mogoče najti\n\n# Error panel labels\nerror_more_info=Več informacij\nerror_less_info=Manj informacij\nerror_close=Zapri\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js r{{version}} (graditev: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Sporočilo: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Sklad: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Datoteka: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Vrstica: {{line}}\nrendering_error=Med pripravljanjem strani je prišlo do napake!\n\n# Predefined zoom values\npage_scale_width=Širina strani\npage_scale_fit=Prilagodi stran\npage_scale_auto=Samodejno\npage_scale_actual=Dejanska velikost\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}} %\n\n# Loading indicator messages\nloading_error_indicator=Napaka\nloading_error=Med nalaganjem datoteke PDF je prišlo do napake.\ninvalid_file_error=Neveljavna ali pokvarjena datoteka PDF.\nmissing_file_error=Ni datoteke PDF.\nunexpected_response_error=Nepričakovan odgovor strežnika.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Opomba vrste {{type}}]\npassword_label=Vnesite geslo za odpiranje te datoteke PDF.\npassword_invalid=Neveljavno geslo. Poskusite znova.\npassword_ok=V redu\npassword_cancel=Prekliči\n\nprinting_not_supported=Opozorilo: ta brskalnik ne podpira vseh možnosti tiskanja.\nprinting_not_ready=Opozorilo: PDF ni v celoti naložen za tiskanje.\nweb_fonts_disabled=Spletne pisave so onemogočene: vgradnih pisav za PDF ni mogoče uporabiti.\ndocument_colors_not_allowed=Dokumenti PDF ne smejo uporabljati svojih lastnih barv: možnost 'Dovoli stranem uporabo lastnih barv' je v brskalniku onemogočena.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/son/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Moo bisante\nprevious_label=Bisante\nnext.title=Jinehere moo\nnext_label=Jine\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Moo\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} ra\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} ka hun {{pagesCount}}) ra\n\nzoom_out.title=Nakasandi\nzoom_out_label=Nakasandi\nzoom_in.title=Bebbeerandi\nzoom_in_label=Bebbeerandi\nzoom.title=Bebbeerandi\npresentation_mode.title=Bere cebeyan alhaali\npresentation_mode_label=Cebeyan alhaali\nopen_file.title=Tuku feeri\nopen_file_label=Feeri\nprint.title=Kar\nprint_label=Kar\ndownload.title=Zumandi\ndownload_label=Zumandi\nbookmark.title=Sohõ gunarro (bere wala feeri zanfun taaga ra)\nbookmark_label=Sohõ gunaroo\n\n# Secondary toolbar and context menu\ntools.title=Goyjinawey\ntools_label=Goyjinawey\nfirst_page.title=Koy moo jinaa ga\nfirst_page.label=Koy moo jinaa ga\nfirst_page_label=Koy moo jinaa ga\nlast_page.title=Koy moo koraa ga\nlast_page.label=Koy moo koraa ga\nlast_page_label=Koy moo koraa ga\npage_rotate_cw.title=Kuubi kanbe guma here\npage_rotate_cw.label=Kuubi kanbe guma here\npage_rotate_cw_label=Kuubi kanbe guma here\npage_rotate_ccw.title=Kuubi kanbe wowa here\npage_rotate_ccw.label=Kuubi kanbe wowa here\npage_rotate_ccw_label=Kuubi kanbe wowa here\n\n\n# Document properties dialog box\ndocument_properties.title=Takadda mayrawey…\ndocument_properties_label=Takadda mayrawey…\ndocument_properties_file_name=Tuku maa:\ndocument_properties_file_size=Tuku adadu:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb=KB {{size_kb}} (cebsu-ize {{size_b}})\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb=MB {{size_mb}} (cebsu-ize {{size_b}})\ndocument_properties_title=Tiiramaa:\ndocument_properties_author=Hantumkaw:\ndocument_properties_subject=Dalil:\ndocument_properties_keywords=Kufalkalimawey:\ndocument_properties_creation_date=Teeyan han:\ndocument_properties_modification_date=Barmayan han:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Teekaw:\ndocument_properties_producer=PDF berandikaw:\ndocument_properties_version=PDF dumi:\ndocument_properties_page_count=Moo hinna:\ndocument_properties_close=Daabu\n\nprint_progress_message=Goo ma takaddaa soolu k'a kar se…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Naŋ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Kanjari ceraw zuu\ntoggle_sidebar_notification.title=Kanjari ceraw-zuu (takaddaa goo nda filla-boŋ/hangandiyaŋ)\ntoggle_sidebar_label=Kanjari ceraw zuu\ndocument_outline.title=Takaddaa korfur alhaaloo cebe (naagu cee hinka ka haya-izey kul hayandi/kankamandi)\ndocument_outline_label=Takadda filla-boŋ\nattachments.title=Hangarey cebe\nattachments_label=Hangarey\nthumbs.title=Kabeboy biyey cebe\nthumbs_label=Kabeboy biyey\nfindbar.title=Ceeci takaddaa ra\nfindbar_label=Ceeci\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} moo\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Kabeboy bii {{page}} moo še\n\n# Find panel button title and messages\nfind_input.title=Ceeci\nfind_input.placeholder=Ceeci takaddaa ra…\nfind_previous.title=Kalimaɲaŋoo bangayri bisantaa ceeci\nfind_previous_label=Bisante\nfind_next.title=Kalimaɲaŋoo hiino bangayroo ceeci\nfind_next_label=Jine\nfind_highlight=Ikul šilbay\nfind_match_case_label=Harfu-beeriyan hawgay\nfind_reached_top=A too moŋoo boŋoo, koy jine ka šinitin nda cewoo\nfind_reached_bottom=A too moɲoo cewoo, koy jine šintioo ga\nfind_not_found=Kalimaɲaa mana duwandi\n\n# Error panel labels\nerror_more_info=Alhabar tontoni\nerror_less_info=Alhabar tontoni\nerror_close=Daabu\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Alhabar: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Dekeri: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Tuku: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Žeeri: {{line}}\nrendering_error=Firka bangay kaŋ moɲoo goo ma willandi.\n\n# Predefined zoom values\npage_scale_width=Mooo hayyan\npage_scale_fit=Moo sawayan\npage_scale_auto=Boŋše azzaati barmayyan\npage_scale_actual=Adadu cimi\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Firka\nloading_error=Firka bangay kaŋ PDF goo ma zumandi.\ninvalid_file_error=PDF tuku laala wala laybante.\nmissing_file_error=PDF tuku kumante.\nunexpected_response_error=Manti feršikaw tuuruyan maatante.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt={{type}} maasa-caw]\npassword_label=Šennikufal dam ka PDF tukoo woo feeri.\npassword_invalid=Šennikufal laalo. Ceeci koyne taare.\npassword_ok=Ayyo\npassword_cancel=Naŋ\n\nprinting_not_supported=Yaamar: Karyan ši tee ka timme nda ceecikaa woo.\nprinting_not_ready=Yaamar: PDF ši zunbu ka timme karyan še.\nweb_fonts_disabled=Interneti šigirawey kay: ši hin ka goy nda PDF šigira hurantey.\ndocument_colors_not_allowed=PDF takaddawey ši duu fondo ka ngey boŋ noonawey zaa: “Naŋ moɲey ma ngey boŋ noonawey suuba” ši dira ceecikaa ga.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/sq/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Faqja e Mëparshme\nprevious_label=E mëparshmja\nnext.title=Faqja Pasuese\nnext_label=Pasuesja\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Faqe\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=nga {{pagesCount}} gjithsej\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} nga {{pagesCount}})\n\nzoom_out.title=Zmadhim\nzoom_out_label=Zmadhoji\nzoom_in.title=Zvogëlim\nzoom_in_label=Zvogëloji\nzoom.title=Zoom\npresentation_mode.title=Kalo te Mënyra Paraqitje\npresentation_mode_label=Mënyra Paraqitje\nopen_file.title=Hapni Kartelë\nopen_file_label=Hape\nprint.title=Shtypje\nprint_label=Shtype\ndownload.title=Shkarkim\ndownload_label=Shkarkoje\nbookmark.title=Pamja e tanishme (kopjojeni ose hapeni në dritare të re)\nbookmark_label=Pamja e Tanishme\n\n# Secondary toolbar and context menu\ntools.title=Mjete\ntools_label=Mjete\nfirst_page.title=Kaloni te Faqja e Parë\nfirst_page.label=Kalo te Faqja e Parë\nfirst_page_label=Kalo te Faqja e Parë\nlast_page.title=Kaloni te Faqja e Fundit\nlast_page.label=Kalo te Faqja e Fundit\nlast_page_label=Kalo te Faqja e Fundit\npage_rotate_cw.title=Rrotullojeni Në Kahun Orar\npage_rotate_cw.label=Rrotulloje Në Kahun Orar\npage_rotate_cw_label=Rrotulloje Në Kahun Orar\npage_rotate_ccw.title=Rrotullojeni Në Kahun Kundërorar\npage_rotate_ccw.label=Rrotulloje Në Kahun Kundërorar\npage_rotate_ccw_label=Rrotulloje Në Kahun Kundërorar\n\n\n# Document properties dialog box\ndocument_properties.title=Veti Dokumenti…\ndocument_properties_label=Veti Dokumenti…\ndocument_properties_file_name=Emër kartele:\ndocument_properties_file_size=Madhësi kartele:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajte)\ndocument_properties_title=Titull:\ndocument_properties_author=Autor:\ndocument_properties_subject=Subjekt:\ndocument_properties_keywords=Fjalëkyçe:\ndocument_properties_creation_date=Datë Krijimi:\ndocument_properties_modification_date=Datë Ndryshimi:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Krijues:\ndocument_properties_producer=Prodhues PDF-je:\ndocument_properties_version=Version PDF-je:\ndocument_properties_page_count=Numër Faqesh:\ndocument_properties_close=Mbylle\n\nprint_progress_message=Po përgatitet dokumenti për shtypje…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Anuloje\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Shfaqni/Fshihni Anështyllën\ntoggle_sidebar_notification.title=Shfaqni Anështyllën (dokumenti përmban përvijim/bashkëngjitje)\ntoggle_sidebar_label=Shfaq/Fshih Anështyllën\ndocument_outline.title=Shfaqni Përvijim Dokumenti (dyklikoni që të shfaqen/fshihen krejt elementët)\ndocument_outline_label=Përvijim Dokumenti\nattachments.title=Shfaqni Bashkëngjitje\nattachments_label=Bashkëngjitje\nthumbs.title=Shfaqni Miniatura\nthumbs_label=Miniatura\nfindbar.title=Gjeni në Dokument\nfindbar_label=Gjej\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Faqja {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniaturë e Faqes {{page}}\n\n# Find panel button title and messages\nfind_input.title=Gjeje\nfind_input.placeholder=Gjeni në dokument…\nfind_previous.title=Gjeni hasjen e mëparshme të togfjalëshit\nfind_previous_label=E mëparshmja\nfind_next.title=Gjeni hasjen pasuese të togfjalëshit\nfind_next_label=Pasuesja\nfind_highlight=Theksoji të tëra\nfind_match_case_label=Siç është shkruar\nfind_reached_top=U mbërrit në krye të dokumentit, vazhduar prej fundit\nfind_reached_bottom=U mbërrit në fund të dokumentit, vazhduar prej kreut\nfind_not_found=Togfjalësh që s’gjendet\n\n# Error panel labels\nerror_more_info=Më Tepër të Dhëna\nerror_less_info=Më Pak të Dhëna\nerror_close=Mbylle\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesazh: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Kartelë: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rresht: {{line}}\nrendering_error=Ndodhi një gabim gjatë riprodhimit të faqes.\n\n# Predefined zoom values\npage_scale_width=Gjerësi Faqeje\npage_scale_fit=Sa Nxë Faqja\npage_scale_auto=Zoom i Vetvetishëm\npage_scale_actual=Madhësia Faktike\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Gabim\nloading_error=Ndodhi një gabim gjatë ngarkimit të PDF-së.\ninvalid_file_error=Kartelë PDF e pavlefshme ose e dëmtuar.\nmissing_file_error=Kartelë PDF që mungon.\nunexpected_response_error=Përgjigje shërbyesi e papritur.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Nënvizim {{type}}]\npassword_label=Jepni fjalëkalimin që të hapet kjo kartelë PDF.\npassword_invalid=Fjalëkalim i pavlefshëm. Ju lutemi, riprovoni.\npassword_ok=OK\npassword_cancel=Anuloje\n\nprinting_not_supported=Kujdes: Shtypja s’mbulohet plotësisht nga ky shfletues.\nprinting_not_ready=Kujdes: PDF-ja s’është ngarkuar plotësisht që ta shtypni.\nweb_fonts_disabled=Shkronjat Web janë të çaktivizuara: s’arrihet të përdoren shkronja të trupëzuara në PDF.\ndocument_colors_not_allowed=Dokumenteve PDF s’u lejohet të përdorin ngjyrat e tyre: 'Lejoji faqet t’i zgjedhin vetë ngjyrat' është e çaktivizuar te shfletuesi.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/sr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Претходна страница\nprevious_label=Претходна\nnext.title=Следећа страница\nnext_label=Следећа\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Страница\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=од {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} од {{pagesCount}})\n\nzoom_out.title=Умањи\nzoom_out_label=Умањи\nzoom_in.title=Увеличај\nzoom_in_label=Увеличај\nzoom.title=Увеличавање\npresentation_mode.title=Промени на приказ у режиму презентације\npresentation_mode_label=Режим презентације\nopen_file.title=Отвори датотеку\nopen_file_label=Отвори\nprint.title=Штампај\nprint_label=Штампај\ndownload.title=Преузми\ndownload_label=Преузми\nbookmark.title=Тренутни приказ (копирај или отвори нови прозор)\nbookmark_label=Тренутни приказ\n\n# Secondary toolbar and context menu\ntools.title=Алатке\ntools_label=Алатке\nfirst_page.title=Иди на прву страницу\nfirst_page.label=Иди на прву страницу\nfirst_page_label=Иди на прву страницу\nlast_page.title=Иди на последњу страницу\nlast_page.label=Иди на последњу страницу\nlast_page_label=Иди на последњу страницу\npage_rotate_cw.title=Ротирај у смеру казаљке на сату\npage_rotate_cw.label=Ротирај у смеру казаљке на сату\npage_rotate_cw_label=Ротирај у смеру казаљке на сату\npage_rotate_ccw.title=Ротирај у смеру супротном од казаљке на сату\npage_rotate_ccw.label=Ротирај у смеру супротном од казаљке на сату\npage_rotate_ccw_label=Ротирај у смеру супротном од казаљке на сату\n\ncursor_text_select_tool.title=Омогући алат за селектовање текста\ncursor_text_select_tool_label=Алат за селектовање текста\ncursor_hand_tool.title=Омогући алат за померање\ncursor_hand_tool_label=Алат за померање\n\n# Document properties dialog box\ndocument_properties.title=Параметри документа…\ndocument_properties_label=Параметри документа…\ndocument_properties_file_name=Име датотеке:\ndocument_properties_file_size=Величина датотеке:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} B)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} B)\ndocument_properties_title=Наслов:\ndocument_properties_author=Аутор:\ndocument_properties_subject=Тема:\ndocument_properties_keywords=Кључне речи:\ndocument_properties_creation_date=Датум креирања:\ndocument_properties_modification_date=Датум модификације:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Стваралац:\ndocument_properties_producer=PDF произвођач:\ndocument_properties_version=PDF верзија:\ndocument_properties_page_count=Број страница:\ndocument_properties_close=Затвори\n\nprint_progress_message=Припремам документ за штампање…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Откажи\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Прикажи додатну палету\ntoggle_sidebar_notification.title=Прикажи додатну траку (докуменат садржи оквире/прилоге)\ntoggle_sidebar_label=Прикажи додатну палету\ndocument_outline.title=Прикажи контуру документа (дупли клик за проширење/скупљање елемената)\ndocument_outline_label=Контура документа\nattachments.title=Прикажи прилоге\nattachments_label=Прилози\nthumbs.title=Прикажи сличице\nthumbs_label=Сличице\nfindbar.title=Пронађи у документу\nfindbar_label=Пронађи\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Страница {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Сличица од странице {{page}}\n\n# Find panel button title and messages\nfind_input.title=Пронађи\nfind_input.placeholder=Пронађи у документу…\nfind_previous.title=Пронађи претходну појаву фразе\nfind_previous_label=Претходна\nfind_next.title=Пронађи следећу појаву фразе\nfind_next_label=Следећа\nfind_highlight=Истакнути све\nfind_match_case_label=Подударања\nfind_reached_top=Достигнут врх документа, наставио са дна\nfind_reached_bottom=Достигнуто дно документа, наставио са врха\nfind_not_found=Фраза није пронађена\n\n# Error panel labels\nerror_more_info=Више информација\nerror_less_info=Мање информација\nerror_close=Затвори\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Порука: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стек: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Датотека: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Линија: {{line}}\nrendering_error=Дошло је до грешке приликом рендеровања ове странице.\n\n# Predefined zoom values\npage_scale_width=Ширина странице\npage_scale_fit=Прилагоди страницу\npage_scale_auto=Аутоматско увеличавање\npage_scale_actual=Стварна величина\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Грешка\nloading_error=Дошло је до грешке приликом учитавања PDF-а.\ninvalid_file_error=PDF датотека је оштећена или је неисправна.\nmissing_file_error=PDF датотека није пронађена.\nunexpected_response_error=Неочекиван одговор од сервера.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} коментар]\npassword_label=Унесите лозинку да бисте отворили овај PDF докуменат.\npassword_invalid=Неисправна лозинка. Покушајте поново.\npassword_ok=У реду\npassword_cancel=Откажи\n\nprinting_not_supported=Упозорење: Штампање није у потпуности подржано у овом прегледачу.\nprinting_not_ready=Упозорење: PDF није у потпуности учитан за штампу.\nweb_fonts_disabled=Веб фонтови су онемогућени: не могу користити уграђене PDF фонтове.\ndocument_colors_not_allowed=PDF документи не могу да користе сопствене боје: “Дозволи страницама да изаберу своје боје” је деактивирано у прегледачу.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/sv-SE/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Föregående sida\nprevious_label=Föregående\nnext.title=Nästa sida\nnext_label=Nästa\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Sida\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=av {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} av {{pagesCount}})\n\nzoom_out.title=Zooma ut\nzoom_out_label=Zooma ut\nzoom_in.title=Zooma in\nzoom_in_label=Zooma in\nzoom.title=Zoom\npresentation_mode.title=Byt till presentationsläge\npresentation_mode_label=Presentationsläge\nopen_file.title=Öppna fil\nopen_file_label=Öppna\nprint.title=Skriv ut\nprint_label=Skriv ut\ndownload.title=Hämta\ndownload_label=Hämta\nbookmark.title=Aktuell vy (kopiera eller öppna i nytt fönster)\nbookmark_label=Aktuell vy\n\n# Secondary toolbar and context menu\ntools.title=Verktyg\ntools_label=Verktyg\nfirst_page.title=Gå till första sidan\nfirst_page.label=Gå till första sidan\nfirst_page_label=Gå till första sidan\nlast_page.title=Gå till sista sidan\nlast_page.label=Gå till sista sidan\nlast_page_label=Gå till sista sidan\npage_rotate_cw.title=Rotera medurs\npage_rotate_cw.label=Rotera medurs\npage_rotate_cw_label=Rotera medurs\npage_rotate_ccw.title=Rotera moturs\npage_rotate_ccw.label=Rotera moturs\npage_rotate_ccw_label=Rotera moturs\n\ncursor_text_select_tool.title=Aktivera textmarkeringsverktyg\ncursor_text_select_tool_label=Textmarkeringsverktyg\ncursor_hand_tool.title=Aktivera handverktyg\ncursor_hand_tool_label=Handverktyg\n\n# Document properties dialog box\ndocument_properties.title=Dokumentegenskaper…\ndocument_properties_label=Dokumentegenskaper…\ndocument_properties_file_name=Filnamn:\ndocument_properties_file_size=Filstorlek:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kB ({{size_b}} byte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title=Titel:\ndocument_properties_author=Författare:\ndocument_properties_subject=Ämne:\ndocument_properties_keywords=Nyckelord:\ndocument_properties_creation_date=Skapades:\ndocument_properties_modification_date=Ändrades:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Skapare:\ndocument_properties_producer=PDF-producent:\ndocument_properties_version=PDF-version:\ndocument_properties_page_count=Sidantal:\ndocument_properties_close=Stäng\n\nprint_progress_message=Förbereder sidor för utskrift…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Avbryt\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Visa/dölj sidofält\ntoggle_sidebar_notification.title=Visa/dölj sidofält (dokument innehåller översikt/bilagor)\ntoggle_sidebar_label=Visa/dölj sidofält\ndocument_outline.title=Visa dokumentdisposition (dubbelklicka för att expandera/komprimera alla objekt)\ndocument_outline_label=Dokumentöversikt\nattachments.title=Visa Bilagor\nattachments_label=Bilagor\nthumbs.title=Visa miniatyrer\nthumbs_label=Miniatyrer\nfindbar.title=Sök i dokument\nfindbar_label=Sök\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Sida {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatyr av sida {{page}}\n\n# Find panel button title and messages\nfind_input.title=Sök\nfind_input.placeholder=Sök i dokument…\nfind_previous.title=Hitta föregående förekomst av frasen\nfind_previous_label=Föregående\nfind_next.title=Hitta nästa förekomst av frasen\nfind_next_label=Nästa\nfind_highlight=Markera alla\nfind_match_case_label=Matcha versal/gemen\nfind_reached_top=Nådde början av dokumentet, började från slutet\nfind_reached_bottom=Nådde slutet på dokumentet, började från början\nfind_not_found=Frasen hittades inte\n\n# Error panel labels\nerror_more_info=Mer information\nerror_less_info=Mindre information\nerror_close=Stäng\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Meddelande: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rad: {{line}}\nrendering_error=Ett fel uppstod vid visning av sidan.\n\n# Predefined zoom values\npage_scale_width=Sidbredd\npage_scale_fit=Anpassa sida\npage_scale_auto=Automatisk zoom\npage_scale_actual=Verklig storlek\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Fel\nloading_error=Ett fel uppstod vid laddning av PDF-filen.\ninvalid_file_error=Ogiltig eller korrupt PDF-fil.\nmissing_file_error=Saknad PDF-fil.\nunexpected_response_error=Oväntat svar från servern.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-annotering]\npassword_label=Skriv in lösenordet för att öppna PDF-filen.\npassword_invalid=Ogiltigt lösenord. Försök igen.\npassword_ok=OK\npassword_cancel=Avbryt\n\nprinting_not_supported=Varning: Utskrifter stöds inte helt av den här webbläsaren.\nprinting_not_ready=Varning: PDF:en är inte klar för utskrift.\nweb_fonts_disabled=Webbtypsnitt är inaktiverade: kan inte använda inbäddade PDF-typsnitt.\ndocument_colors_not_allowed=PDF-dokument tillåts inte använda egna färger: “Låt sidor använda egna färger” är inaktiverat i webbläsaren.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/sw/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Ukurasa Uliotangulia\nprevious_label=Iliyotangulia\nnext.title=Ukurasa Ufuatao\nnext_label=Ifuatayo\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Kuza Nje\nzoom_out_label=Kuza Nje\nzoom_in.title=Kuza Ndani\nzoom_in_label=Kuza Ndani\nzoom.title=Kuza\npresentation_mode.title=Badili kwa Hali ya Uwasilishaji\npresentation_mode_label=Hali ya Uwasilishaji\nopen_file.title=Fungua Faili\nopen_file_label=Fungua\nprint.title=Chapisha\nprint_label=Chapisha\ndownload.title=Pakua\ndownload_label=Pakua\nbookmark.title=Mwonekano wa sasa (nakili au ufungue katika dirisha mpya)\nbookmark_label=Mwonekano wa Sasa\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Kichwa:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Kibiano cha Upau wa Kando\ntoggle_sidebar_label=Kibiano cha Upau wa Kando\ndocument_outline_label=Ufupisho wa Waraka\nthumbs.title=Onyesha Kijipicha\nthumbs_label=Vijipicha\nfindbar.title=Pata katika Waraka\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Ukurasa {{ukurasa}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Kijipicha cha ukurasa {{ukurasa}}\n\n# Find panel button title and messages\nfind_previous.title=Tafuta tukio kabla ya msemo huu\nfind_previous_label=Iliyotangulia\nfind_next.title=Tafuta tukio linalofuata la msemo\nfind_next_label=Ifuatayo\nfind_highlight=Angazia yote\nfind_match_case_label=Linganisha herufi\nfind_reached_top=Imefika juu ya waraka, imeendelea kutoka chini\nfind_reached_bottom=Imefika mwisho wa waraka, imeendelea kutoka juu\nfind_not_found=Msemo hukupatikana\n\n# Error panel labels\nerror_more_info=Maelezo Zaidi\nerror_less_info=Maelezo Kidogo\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (jenga: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Ujumbe: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Panganya: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Faili: {{faili}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Laini: {{laini}}\nrendering_error=Hitilafu lilitokea wajati wa kutoa ukurasa\n\n# Predefined zoom values\npage_scale_width=Upana wa Ukurasa\npage_scale_fit=Usawa wa Ukurasa\npage_scale_auto=Ukuzaji wa Kiotomatiki\npage_scale_actual=Ukubwa Halisi\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Hitilafu\nloading_error=Hitilafu lilitokea wakati wa kupakia PDF.\ninvalid_file_error=Faili ya PDF isiyohalali au potofu.\nmissing_file_error=Faili ya PDF isiyopo.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Ufafanuzi]\npassword_ok=SAWA\n\nprinting_not_supported=Onyo: Uchapishaji hauauniwi kabisa kwa kivinjari hiki.\nweb_fonts_disabled=Fonti za tovuti zimelemazwa: haziwezi kutumia fonti za PDF zilizopachikwa.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ta/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=முந்தைய பக்கம்\nprevious_label=முந்தையது\nnext.title=அடுத்த பக்கம்\nnext_label=அடுத்து\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=பக்கம்\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} இல்\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages={{pagesCount}}) இல் ({{pageNumber}}\n\nzoom_out.title=சிறிதாக்கு\nzoom_out_label=சிறிதாக்கு\nzoom_in.title=பெரிதாக்கு\nzoom_in_label=பெரிதாக்கு\nzoom.title=பெரிதாக்கு\npresentation_mode.title=விளக்ககாட்சி பயன்முறைக்கு மாறு\npresentation_mode_label=விளக்ககாட்சி பயன்முறை\nopen_file.title=கோப்பினை திற\nopen_file_label=திற\nprint.title=அச்சிடு\nprint_label=அச்சிடு\ndownload.title=பதிவிறக்கு\ndownload_label=பதிவிறக்கு\nbookmark.title=தற்போதைய காட்சி (புதிய சாளரத்திற்கு நகலெடு அல்லது புதிய சாளரத்தில் திற)\nbookmark_label=தற்போதைய காட்சி\n\n# Secondary toolbar and context menu\ntools.title=கருவிகள்\ntools_label=கருவிகள்\nfirst_page.title=முதல் பக்கத்திற்கு செல்லவும்\nfirst_page.label=முதல் பக்கத்திற்கு செல்லவும்\nfirst_page_label=முதல் பக்கத்திற்கு செல்லவும்\nlast_page.title=கடைசி பக்கத்திற்கு செல்லவும்\nlast_page.label=கடைசி பக்கத்திற்கு செல்லவும்\nlast_page_label=கடைசி பக்கத்திற்கு செல்லவும்\npage_rotate_cw.title=வலஞ்சுழியாக சுழற்று\npage_rotate_cw.label=வலஞ்சுழியாக சுழற்று\npage_rotate_cw_label=வலஞ்சுழியாக சுழற்று\npage_rotate_ccw.title=இடஞ்சுழியாக சுழற்று\npage_rotate_ccw.label=இடஞ்சுழியாக சுழற்று\npage_rotate_ccw_label=இடஞ்சுழியாக சுழற்று\n\ncursor_text_select_tool.title=உரைத் தெரிவு கருவியைச் செயல்படுத்து\ncursor_text_select_tool_label=உரைத் தெரிவு கருவி\ncursor_hand_tool.title=கைக் கருவிக்ச் செயற்படுத்து\ncursor_hand_tool_label=கைக்குருவி\n\n# Document properties dialog box\ndocument_properties.title=ஆவண பண்புகள்...\ndocument_properties_label=ஆவண பண்புகள்...\ndocument_properties_file_name=கோப்பு பெயர்:\ndocument_properties_file_size=கோப்பின் அளவு:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} கிபை ({{size_b}} பைட்டுகள்)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} மெபை ({{size_b}} பைட்டுகள்)\ndocument_properties_title=தலைப்பு:\ndocument_properties_author=எழுதியவர்\ndocument_properties_subject=பொருள்:\ndocument_properties_keywords=முக்கிய வார்த்தைகள்:\ndocument_properties_creation_date=படைத்த தேதி :\ndocument_properties_modification_date=திருத்திய தேதி:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=உருவாக்குபவர்:\ndocument_properties_producer=பிடிஎஃப் தயாரிப்பாளர்:\ndocument_properties_version=PDF பதிப்பு:\ndocument_properties_page_count=பக்க எண்ணிக்கை:\ndocument_properties_close=மூடுக\n\nprint_progress_message=அச்சிடுவதற்கான ஆவணம் தயாராகிறது...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=ரத்து\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=பக்கப் பட்டியை நிலைமாற்று\ntoggle_sidebar_notification.title=பக்கப்பட்டையை நிலைமாற்று (வெளிக்கோடு/இணைப்புகளை ஆவணம் கொண்டுள்ளது)\ntoggle_sidebar_label=பக்கப் பட்டியை நிலைமாற்று\ndocument_outline.title=ஆவண அடக்கத்தைக் காட்டு (இருமுறைச் சொடுக்கி அனைத்து உறுப்பிடிகளையும் விரி/சேர்)\ndocument_outline_label=ஆவண வெளிவரை\nattachments.title=இணைப்புகளை காண்பி\nattachments_label=இணைப்புகள்\nthumbs.title=சிறுபடங்களைக் காண்பி\nthumbs_label=சிறுபடங்கள்\nfindbar.title=ஆவணத்தில் கண்டறி\nfindbar_label=தேடு\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=பக்கம் {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=பக்கத்தின் சிறுபடம் {{page}}\n\n# Find panel button title and messages\nfind_input.title=கண்டுபிடி\nfind_input.placeholder=ஆவணத்தில் கண்டறி…\nfind_previous.title=இந்த சொற்றொடரின் முந்தைய நிகழ்வை தேடு\nfind_previous_label=முந்தையது\nfind_next.title=இந்த சொற்றொடரின் அடுத்த நிகழ்வை தேடு\nfind_next_label=அடுத்து\nfind_highlight=அனைத்தையும் தனிப்படுத்து\nfind_match_case_label=பேரெழுத்தாக்கத்தை உணர்\nfind_reached_top=ஆவணத்தின் மேல் பகுதியை அடைந்தது, அடிப்பக்கத்திலிருந்து தொடர்ந்தது\nfind_reached_bottom=ஆவணத்தின் முடிவை அடைந்தது, மேலிருந்து தொடர்ந்தது\nfind_not_found=சொற்றொடர் காணவில்லை\n\n# Error panel labels\nerror_more_info=கூடுதல் தகவல்\nerror_less_info=குறைந்த தகவல்\nerror_close=மூடுக\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=செய்தி: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ஸ்டேக்: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=கோப்பு: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=வரி: {{line}}\nrendering_error=இந்தப் பக்கத்தை காட்சிப்படுத்தும் போது ஒரு பிழை ஏற்பட்டது.\n\n# Predefined zoom values\npage_scale_width=பக்க அகலம்\npage_scale_fit=பக்கப் பொருத்தம்\npage_scale_auto=தானியக்க பெரிதாக்கல்\npage_scale_actual=உண்மையான அளவு\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=பிழை\nloading_error=PDF ஐ ஏற்றும் போது ஒரு பிழை ஏற்பட்டது.\ninvalid_file_error=செல்லுபடியாகாத அல்லது சிதைந்த PDF கோப்பு.\nmissing_file_error=PDF கோப்பு காணவில்லை.\nunexpected_response_error=சேவகன் பதில் எதிர்பாரதது.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} விளக்கம்]\npassword_label=இந்த PDF கோப்பை திறக்க கடவுச்சொல்லை உள்ளிடவும்.\npassword_invalid=செல்லுபடியாகாத கடவுச்சொல், தயை செய்து மீண்டும் முயற்சி செய்க.\npassword_ok=சரி\npassword_cancel=ரத்து\n\nprinting_not_supported=எச்சரிக்கை: இந்த உலாவி அச்சிடுதலை முழுமையாக ஆதரிக்கவில்லை.\nprinting_not_ready=எச்சரிக்கை: PDF அச்சிட முழுவதுமாக ஏற்றப்படவில்லை.\nweb_fonts_disabled=வலை எழுத்துருக்கள் முடக்கப்பட்டுள்ளன: உட்பொதிக்கப்பட்ட PDF எழுத்துருக்களைப் பயன்படுத்த முடியவில்லை.\ndocument_colors_not_allowed=PDF ஆவணங்களுக்குச் சொந்த நிறங்களைப் பயன்படுத்த அனுமதியில்லை: உலாவியில் \"பக்கங்கள் தங்கள் சொந்த நிறங்களைத் தேர்வு செய்துகொள்ள அனுமதி\" என்னும் விருப்பம் முடக்கப்பட்டுள்ளது.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ta-LK/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom.title=அளவு\nopen_file.title=கோப்பினைத் திறக்க\nopen_file_label=திறக்க\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\n\n# Find panel button title and messages\nfind_previous.title=இந்த சொற்றொடரின் முன்னைய நிகழ்வை தேடு\nfind_next.title=இந்த சொற்றொடரின் அடுத்த நிகழ்வைத் தேடு\n\n# Error panel labels\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\n\n# Predefined zoom values\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_ok=ஆம்\n\n"
  },
  {
    "path": "example/pages/include/pdf/locale/te/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=మునుపటి పేజీ\nprevious_label=క్రితం\nnext.title=తరువాత పేజీ\nnext_label=తరువాత\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=పేజీ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=మొత్తం {{pageCount}} లో\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=(మొత్తం {{pagesCount}} లో {{pageNumber}}వది)\n\nzoom_out.title=జూమ్ తగ్గించు\nzoom_out_label=జూమ్ తగ్గించు\nzoom_in.title=జూమ్ చేయి\nzoom_in_label=జూమ్ చేయి\nzoom.title=జూమ్\npresentation_mode.title=ప్రదర్శనా రీతికి మారు\npresentation_mode_label=ప్రదర్శనా రీతి\nopen_file.title=ఫైల్ తెరువు\nopen_file_label=తెరువు\nprint.title=ముద్రించు\nprint_label=ముద్రించు\ndownload.title=దింపుకోళ్ళు\ndownload_label=దింపుకోళ్ళు\nbookmark.title=ప్రస్తుత దర్శనం (కాపీ చేయి లేదా కొత్త విండోలో తెరువు)\nbookmark_label=ప్రస్తుత దర్శనం\n\n# Secondary toolbar and context menu\ntools.title=పనిముట్లు\ntools_label=పనిముట్లు\nfirst_page.title=మొదటి పేజీకి వెళ్ళు\nfirst_page.label=మొదటి పేజీకి వెళ్ళు\nfirst_page_label=మొదటి పేజీకి వెళ్ళు\nlast_page.title=చివరి పేజీకి వెళ్ళు\nlast_page.label=చివరి పేజీకి వెళ్ళు\nlast_page_label=చివరి పేజీకి వెళ్ళు\npage_rotate_cw.title=సవ్యదిశలో తిప్పు\npage_rotate_cw.label=సవ్యదిశలో తిప్పు\npage_rotate_cw_label=సవ్యదిశలో తిప్పు\npage_rotate_ccw.title=అపసవ్యదిశలో తిప్పు\npage_rotate_ccw.label=అపసవ్యదిశలో తిప్పు\npage_rotate_ccw_label=అపసవ్యదిశలో తిప్పు\n\ncursor_text_select_tool.title=టెక్స్ట్ ఎంపిక సాధనాన్ని ప్రారంభించండి\ncursor_text_select_tool_label=టెక్స్ట్ ఎంపిక సాధనం\ncursor_hand_tool.title=చేతి సాధనం చేతనించు\ncursor_hand_tool_label=చేతి సాధనం\n\n# Document properties dialog box\ndocument_properties.title=పత్రము లక్షణాలు...\ndocument_properties_label=పత్రము లక్షణాలు...\ndocument_properties_file_name=దస్త్రం పేరు:\ndocument_properties_file_size=దస్త్రం పరిమాణం:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=శీర్షిక:\ndocument_properties_author=మూలకర్త:\ndocument_properties_subject=విషయం:\ndocument_properties_keywords=కీ పదాలు:\ndocument_properties_creation_date=సృష్టించిన తేదీ:\ndocument_properties_modification_date=సవరించిన తేదీ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=సృష్టికర్త:\ndocument_properties_producer=PDF ఉత్పాదకి:\ndocument_properties_version=PDF వర్షన్:\ndocument_properties_page_count=పేజీల సంఖ్య:\ndocument_properties_close=మూసివేయి\n\nprint_progress_message=ముద్రించడానికి పత్రము సిద్ధమవుతున్నది…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=రద్దుచేయి\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=పక్కపట్టీ మార్చు\ntoggle_sidebar_label=పక్కపట్టీ మార్చు\ndocument_outline.title=పత్రము రూపము చూపించు (డబుల్ క్లిక్ చేసి అన్ని అంశాలను విస్తరించు/కూల్చు)\ndocument_outline_label=పత్రము అవుట్‌లైన్\nattachments.title=అనుబంధాలు చూపు\nattachments_label=అనుబంధాలు\nthumbs.title=థంబ్‌నైల్స్ చూపు\nthumbs_label=థంబ్‌నైల్స్\nfindbar.title=పత్రములో కనుగొనుము\nfindbar_label=కనుగొను\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=పేజీ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=పేజీ {{page}} యొక్క థంబ్‌నైల్\n\n# Find panel button title and messages\nfind_input.title=కనుగొను\nfind_input.placeholder=పత్రములో కనుగొను…\nfind_previous.title=పదం యొక్క ముందు సంభవాన్ని కనుగొను\nfind_previous_label=మునుపటి\nfind_next.title=పదం యొక్క తర్వాతి సంభవాన్ని కనుగొను\nfind_next_label=తరువాత\nfind_highlight=అన్నిటిని ఉద్దీపనం చేయుము\nfind_match_case_label=అక్షరముల తేడాతో పోల్చు\nfind_reached_top=పేజీ పైకి చేరుకున్నది, క్రింది నుండి కొనసాగించండి\nfind_reached_bottom=పేజీ చివరకు చేరుకున్నది, పైనుండి కొనసాగించండి\nfind_not_found=పదం కనబడలేదు\n\n# Error panel labels\nerror_more_info=మరింత సమాచారం\nerror_less_info=తక్కువ సమాచారం\nerror_close=మూసివేయి\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=సందేశం: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=స్టాక్: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ఫైలు: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=వరుస: {{line}}\nrendering_error=పేజీను రెండర్ చేయుటలో ఒక దోషం ఎదురైంది.\n\n# Predefined zoom values\npage_scale_width=పేజీ వెడల్పు\npage_scale_fit=పేజీ అమర్పు\npage_scale_auto=స్వయంచాలక జూమ్\npage_scale_actual=యథార్ధ పరిమాణం\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=దోషం\nloading_error=PDF లోడవుచున్నప్పుడు ఒక దోషం ఎదురైంది.\ninvalid_file_error=చెల్లని లేదా పాడైన PDF ఫైలు.\nmissing_file_error=దొరకని PDF ఫైలు.\nunexpected_response_error=అనుకోని సర్వర్ స్పందన.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} టీకా]\npassword_label=ఈ PDF ఫైల్ తెరుచుటకు సంకేతపదం ప్రవేశపెట్టుము.\npassword_invalid=సంకేతపదం చెల్లదు. దయచేసి మళ్ళీ ప్రయత్నించండి.\npassword_ok=సరే\npassword_cancel=రద్దుచేయి\n\nprinting_not_supported=హెచ్చరిక: ఈ విహారిణి చేత ముద్రణ పూర్తిగా తోడ్పాటు లేదు.\nprinting_not_ready=హెచ్చరిక: ముద్రణ కొరకు ఈ PDF పూర్తిగా లోడవలేదు.\nweb_fonts_disabled=వెబ్ ఫాంట్లు అచేతనించబడెను: ఎంబెడెడ్ PDF ఫాంట్లు ఉపయోగించలేక పోయింది.\ndocument_colors_not_allowed=PDF పత్రాలు వాటి స్వంత రంగులను ఉపయోగించుకొనుటకు అనుమతించబడవు: విహరణి నందు “పేజీలను వాటి స్వంత రంగులను ఎంచుకొనుటకు అనుమతించు” అచేతనం చేయబడివుంది.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/th/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=หน้าก่อนหน้า\nprevious_label=ก่อนหน้า\nnext.title=หน้าถัดไป\nnext_label=ถัดไป\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=หน้า\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=จาก {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} จาก {{pagesCount}})\n\nzoom_out.title=ซูมออก\nzoom_out_label=ซูมออก\nzoom_in.title=ซูมเข้า\nzoom_in_label=ซูมเข้า\nzoom.title=ซูม\npresentation_mode.title=สลับเป็นโหมดการนำเสนอ\npresentation_mode_label=โหมดการนำเสนอ\nopen_file.title=เปิดไฟล์\nopen_file_label=เปิด\nprint.title=พิมพ์\nprint_label=พิมพ์\ndownload.title=ดาวน์โหลด\ndownload_label=ดาวน์โหลด\nbookmark.title=มุมมองปัจจุบัน (คัดลอกหรือเปิดในหน้าต่างใหม่)\nbookmark_label=มุมมองปัจจุบัน\n\n# Secondary toolbar and context menu\ntools.title=เครื่องมือ\ntools_label=เครื่องมือ\nfirst_page.title=ไปยังหน้าแรก\nfirst_page.label=ไปยังหน้าแรก\nfirst_page_label=ไปยังหน้าแรก\nlast_page.title=ไปยังหน้าสุดท้าย\nlast_page.label=ไปยังหน้าสุดท้าย\nlast_page_label=ไปยังหน้าสุดท้าย\npage_rotate_cw.title=หมุนตามเข็มนาฬิกา\npage_rotate_cw.label=หมุนตามเข็มนาฬิกา\npage_rotate_cw_label=หมุนตามเข็มนาฬิกา\npage_rotate_ccw.title=หมุนทวนเข็มนาฬิกา\npage_rotate_ccw.label=หมุนทวนเข็มนาฬิกา\npage_rotate_ccw_label=หมุนทวนเข็มนาฬิกา\n\n\n# Document properties dialog box\ndocument_properties.title=คุณสมบัติเอกสาร…\ndocument_properties_label=คุณสมบัติเอกสาร…\ndocument_properties_file_name=ชื่อไฟล์:\ndocument_properties_file_size=ขนาดไฟล์:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} กิโลไบต์ ({{size_b}} ไบต์)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} เมกะไบต์ ({{size_b}} ไบต์)\ndocument_properties_title=ชื่อ:\ndocument_properties_author=ผู้สร้าง:\ndocument_properties_subject=ชื่อเรื่อง:\ndocument_properties_keywords=คำสำคัญ:\ndocument_properties_creation_date=วันที่สร้าง:\ndocument_properties_modification_date=วันที่แก้ไข:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=ผู้สร้าง:\ndocument_properties_producer=ผู้ผลิต PDF:\ndocument_properties_version=รุ่น PDF:\ndocument_properties_page_count=จำนวนหน้า:\ndocument_properties_close=ปิด\n\nprint_progress_message=กำลังเตรียมเอกสารสำหรับการพิมพ์…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=ยกเลิก\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=เปิด/ปิดแถบข้าง\ntoggle_sidebar_notification.title=เปิด/ปิดแถบข้าง (เอกสารมีเค้าร่าง/ไฟล์แนบ)\ntoggle_sidebar_label=เปิด/ปิดแถบข้าง\ndocument_outline.title=แสดงเค้าร่างเอกสาร (คลิกสองครั้งเพื่อขยาย/ยุบรายการทั้งหมด)\ndocument_outline_label=เค้าร่างเอกสาร\nattachments.title=แสดงไฟล์แนบ\nattachments_label=ไฟล์แนบ\nthumbs.title=แสดงภาพขนาดย่อ\nthumbs_label=ภาพขนาดย่อ\nfindbar.title=ค้นหาในเอกสาร\nfindbar_label=ค้นหา\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=หน้า {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=ภาพขนาดย่อของหน้า {{page}}\n\n# Find panel button title and messages\nfind_input.title=ค้นหา\nfind_input.placeholder=ค้นหาในเอกสาร…\nfind_previous.title=หาตำแหน่งก่อนหน้าของวลี\nfind_previous_label=ก่อนหน้า\nfind_next.title=หาตำแหน่งถัดไปของวลี\nfind_next_label=ถัดไป\nfind_highlight=เน้นสีทั้งหมด\nfind_match_case_label=ตัวพิมพ์ใหญ่เล็กตรงกัน\nfind_reached_top=ค้นหาถึงจุดเริ่มต้นของหน้า เริ่มค้นต่อจากด้านล่าง\nfind_reached_bottom=ค้นหาถึงจุดสิ้นสุดหน้า เริ่มค้นต่อจากด้านบน\nfind_not_found=ไม่พบวลี\n\n# Error panel labels\nerror_more_info=ข้อมูลเพิ่มเติม\nerror_less_info=ข้อมูลน้อยลง\nerror_close=ปิด\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=ข้อความ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=สแต็ก: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ไฟล์: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=บรรทัด: {{line}}\nrendering_error=เกิดข้อผิดพลาดขณะกำลังเรนเดอร์หน้า\n\n# Predefined zoom values\npage_scale_width=ความกว้างหน้า\npage_scale_fit=พอดีหน้า\npage_scale_auto=ซูมอัตโนมัติ\npage_scale_actual=ขนาดจริง\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=ข้อผิดพลาด\nloading_error=เกิดข้อผิดพลาดขณะกำลังโหลด PDF\ninvalid_file_error=ไฟล์ PDF ไม่ถูกต้องหรือเสียหาย\nmissing_file_error=ไฟล์ PDF ขาดหาย\nunexpected_response_error=การตอบสนองของเซิร์ฟเวอร์ที่ไม่คาดคิด\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[คำอธิบายประกอบ {{type}}]\npassword_label=ป้อนรหัสผ่านเพื่อเปิดไฟล์ PDF นี้\npassword_invalid=รหัสผ่านไม่ถูกต้อง โปรดลองอีกครั้ง\npassword_ok=ตกลง\npassword_cancel=ยกเลิก\n\nprinting_not_supported=คำเตือน: เบราว์เซอร์นี้ไม่ได้สนับสนุนการพิมพ์อย่างเต็มที่\nprinting_not_ready=คำเตือน: PDF ไม่ได้รับการโหลดอย่างเต็มที่สำหรับการพิมพ์\nweb_fonts_disabled=แบบอักษรเว็บถูกปิดใช้งาน: ไม่สามารถใช้แบบอักษร PDF ฝังตัว\ndocument_colors_not_allowed=เอกสาร PDF ไม่ได้รับอนุญาตให้ใช้สีของตัวเอง: \"อนุญาตให้หน้าเอกสารสามารถเลือกสีของตัวเอง\" ถูกปิดใช้งานในเบราว์เซอร์\n"
  },
  {
    "path": "example/pages/include/pdf/locale/tl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Naunang Pahina\nnext.title=Sunod na Pahina\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nopen_file.title=Magbukas ng file\nopen_file_label=Buksan\nbookmark.title=Kasalukuyang tingin (kopyahin o buksan sa bagong window)\nbookmark_label=Kasalukuyang tingin\n\n# Secondary toolbar and context menu\ntools.title=Mga Tool\ntools_label=Mga Tool\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Pamagat:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_close=Kanselahin\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\nthumbs.title=Ipakita ang mga Thumbnails\nfindbar_label=Hanapin\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pahina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail ng Pahina {{page}}\n\n# Find panel button title and messages\nfind_highlight=I-highlight lahat\n\n# Error panel labels\nerror_more_info=Maraming Inpormasyon\nerror_less_info=Maikling Inpormasyon\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensahe: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linya: {{line}}\nrendering_error=May naganap na pagkakamali habang pagsasalin sa pahina.\n\n# Predefined zoom values\npage_scale_width=Haba ng Pahina\npage_scale_fit=ang pahina ay angkop\npage_scale_auto=awtomatikong pag-imbulog\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error=May maling nangyari habang kinakarga ang PDF.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_ok=OK\npassword_cancel=Kanselahin\n\n"
  },
  {
    "path": "example/pages/include/pdf/locale/tn/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom.title=Zuma/gogela\nopen_file.title=Bula Faele\nopen_file_label=Bula\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\ndocument_properties_file_name=Leina la faele:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Leina:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\n\n# Find panel button title and messages\nfind_previous.title=Batla tiragalo e e fetileng ya setlhopha sa mafoko\nfind_next.title=Batla tiragalo e e latelang ya setlhopha sa mafoko\nfind_not_found=Setlhopha sa mafoko ga se a bonwa\n\n# Error panel labels\nerror_more_info=Tshedimosetso e Nngwe\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\n\n# Predefined zoom values\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Phoso\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_ok=Siame\n\nweb_fonts_disabled=Mefutatlhaka ya Webo ga e dire: ga e kgone go dirisa mofutatlhaka wa PDF o tsentsweng.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/tr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Önceki sayfa\nprevious_label=Önceki\nnext.title=Sonraki sayfa\nnext_label=Sonraki\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Sayfa\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=Uzaklaştır\nzoom_out_label=Uzaklaştır\nzoom_in.title=Yaklaştır\nzoom_in_label=Yaklaştır\nzoom.title=Yakınlaştırma\npresentation_mode.title=Sunum moduna geç\npresentation_mode_label=Sunum Modu\nopen_file.title=Dosya aç\nopen_file_label=Aç\nprint.title=Yazdır\nprint_label=Yazdır\ndownload.title=İndir\ndownload_label=İndir\nbookmark.title=Geçerli görünüm (kopyala veya yeni pencerede aç)\nbookmark_label=Geçerli görünüm\n\n# Secondary toolbar and context menu\ntools.title=Araçlar\ntools_label=Araçlar\nfirst_page.title=İlk sayfaya git\nfirst_page.label=İlk sayfaya git\nfirst_page_label=İlk sayfaya git\nlast_page.title=Son sayfaya git\nlast_page.label=Son sayfaya git\nlast_page_label=Son sayfaya git\npage_rotate_cw.title=Saat yönünde döndür\npage_rotate_cw.label=Saat yönünde döndür\npage_rotate_cw_label=Saat yönünde döndür\npage_rotate_ccw.title=Saat yönünün tersine döndür\npage_rotate_ccw.label=Saat yönünün tersine döndür\npage_rotate_ccw_label=Saat yönünün tersine döndür\n\ncursor_text_select_tool.title=Metin seçme aracını etkinleştir\ncursor_text_select_tool_label=Metin seçme aracı\ncursor_hand_tool.title=El aracını etkinleştir\ncursor_hand_tool_label=El aracı\n\n# Document properties dialog box\ndocument_properties.title=Belge özellikleri…\ndocument_properties_label=Belge özellikleri…\ndocument_properties_file_name=Dosya adı:\ndocument_properties_file_size=Dosya boyutu:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bayt)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bayt)\ndocument_properties_title=Başlık:\ndocument_properties_author=Yazar:\ndocument_properties_subject=Konu:\ndocument_properties_keywords=Anahtar kelimeler:\ndocument_properties_creation_date=Oluturma tarihi:\ndocument_properties_modification_date=Değiştirme tarihi:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}} {{time}}\ndocument_properties_creator=Oluşturan:\ndocument_properties_producer=PDF üreticisi:\ndocument_properties_version=PDF sürümü:\ndocument_properties_page_count=Sayfa sayısı:\ndocument_properties_close=Kapat\n\nprint_progress_message=Belge yazdırılmaya hazırlanıyor…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent=%{{progress}}\nprint_progress_close=İptal\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Kenar çubuğunu aç/kapat\ntoggle_sidebar_notification.title=Kenar çubuğunu aç/kapay (Belge anahat/ekler içeriyor)\ntoggle_sidebar_label=Kenar çubuğunu aç/kapat\ndocument_outline.title=Belge şemasını göster (Tüm öğeleri genişletmek/daraltmak için çift tıklayın)\ndocument_outline_label=Belge şeması\nattachments.title=Ekleri göster\nattachments_label=Ekler\nthumbs.title=Küçük resimleri göster\nthumbs_label=Küçük resimler\nfindbar.title=Belgede bul\nfindbar_label=Bul\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Sayfa {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}. sayfanın küçük hâli\n\n# Find panel button title and messages\nfind_input.title=Bul\nfind_input.placeholder=Belgede bul…\nfind_previous.title=Önceki eşleşmeyi bul\nfind_previous_label=Önceki\nfind_next.title=Sonraki eşleşmeyi bul\nfind_next_label=Sonraki\nfind_highlight=Tümünü vurgula\nfind_match_case_label=Büyük-küçük harfe duyarlı\nfind_reached_top=Belgenin başına ulaşıldı, sonundan devam edildi\nfind_reached_bottom=Belgenin sonuna ulaşıldı, başından devam edildi\nfind_not_found=Eşleşme bulunamadı\n\n# Error panel labels\nerror_more_info=Daha fazla bilgi al\nerror_less_info=Daha az bilgi\nerror_close=Kapat\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js sürüm {{version}} (yapı: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=İleti: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Yığın: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Dosya: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Satır: {{line}}\nrendering_error=Sayfa yorumlanırken bir hata oluştu.\n\n# Predefined zoom values\npage_scale_width=Sayfa genişliği\npage_scale_fit=Sayfayı sığdır\npage_scale_auto=Otomatik yakınlaştır\npage_scale_actual=Gerçek boyut\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent=%{{scale}}\n\n# Loading indicator messages\nloading_error_indicator=Hata\nloading_error=PDF yüklenirken bir hata oluştu.\ninvalid_file_error=Geçersiz veya bozulmuş PDF dosyası.\nmissing_file_error=PDF dosyası eksik.\nunexpected_response_error=Beklenmeyen sunucu yanıtı.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} işareti]\npassword_label=Bu PDF dosyasını açmak için parolasını yazın.\npassword_invalid=Geçersiz parola. Lütfen tekrar deneyin.\npassword_ok=Tamam\npassword_cancel=İptal\n\nprinting_not_supported=Uyarı: Yazdırma bu tarayıcı tarafından tam olarak desteklenmemektedir.\nprinting_not_ready=Uyarı: PDF tamamen yüklenmedi ve yazdırmaya hazır değil.\nweb_fonts_disabled=Web fontları devre dışı: Gömülü PDF fontları kullanılamıyor.\ndocument_colors_not_allowed=PDF belgelerinin kendi renklerini kullanması için izin verilmiyor: “Sayfalara kendi renklerini seçmesi için izin ver” tarayıcıda etkinleştirilmemiş.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/uk/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Попередня сторінка\nprevious_label=Попередня\nnext.title=Наступна сторінка\nnext_label=Наступна\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Сторінка\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=із {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} із {{pagesCount}})\n\nzoom_out.title=Зменшити\nzoom_out_label=Зменшити\nzoom_in.title=Збільшити\nzoom_in_label=Збільшити\nzoom.title=Масштаб\npresentation_mode.title=Перейти в режим презентації\npresentation_mode_label=Режим презентації\nopen_file.title=Відкрити файл\nopen_file_label=Відкрити\nprint.title=Друк\nprint_label=Друк\ndownload.title=Завантажити\ndownload_label=Завантажити\nbookmark.title=Поточний вигляд (копіювати чи відкрити в новому вікні)\nbookmark_label=Поточний вигляд\n\n# Secondary toolbar and context menu\ntools.title=Інструменти\ntools_label=Інструменти\nfirst_page.title=На першу сторінку\nfirst_page.label=На першу сторінку\nfirst_page_label=На першу сторінку\nlast_page.title=На останню сторінку\nlast_page.label=На останню сторінку\nlast_page_label=На останню сторінку\npage_rotate_cw.title=Повернути за годинниковою стрілкою\npage_rotate_cw.label=Повернути за годинниковою стрілкою\npage_rotate_cw_label=Повернути за годинниковою стрілкою\npage_rotate_ccw.title=Повернути проти годинникової стрілки\npage_rotate_ccw.label=Повернути проти годинникової стрілки\npage_rotate_ccw_label=Повернути проти годинникової стрілки\n\ncursor_text_select_tool.title=Увімкнути інструмент вибору тексту\ncursor_text_select_tool_label=Інструмент вибору тексту\ncursor_hand_tool.title=Увімкнути інструмент «Рука»\ncursor_hand_tool_label=Інструмент «Рука»\n\n# Document properties dialog box\ndocument_properties.title=Властивості документа…\ndocument_properties_label=Властивості документа…\ndocument_properties_file_name=Назва файла:\ndocument_properties_file_size=Розмір файла:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} bytes)\ndocument_properties_title=Заголовок:\ndocument_properties_author=Автор:\ndocument_properties_subject=Тема:\ndocument_properties_keywords=Ключові слова:\ndocument_properties_creation_date=Дата створення:\ndocument_properties_modification_date=Дата зміни:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Створено:\ndocument_properties_producer=Виробник PDF:\ndocument_properties_version=Версія PDF:\ndocument_properties_page_count=Кількість сторінок:\ndocument_properties_close=Закрити\n\nprint_progress_message=Підготовка документу до друку…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Скасувати\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Бічна панель\ntoggle_sidebar_notification.title=Перемкнути бічну панель (документ має вміст/вкладення)\ntoggle_sidebar_label=Перемкнути бічну панель\ndocument_outline.title=Показати схему документу (подвійний клік для розгортання/згортання елементів)\ndocument_outline_label=Схема документа\nattachments.title=Показати прикріплення\nattachments_label=Прикріплення\nthumbs.title=Показувати ескізи\nthumbs_label=Ескізи\nfindbar.title=Знайти в документі\nfindbar_label=Пошук\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Сторінка {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Ескіз сторінки {{page}}\n\n# Find panel button title and messages\nfind_input.title=Знайти\nfind_input.placeholder=Знайти в документі…\nfind_previous.title=Знайти попереднє входження фрази\nfind_previous_label=Попереднє\nfind_next.title=Знайти наступне входження фрази\nfind_next_label=Наступне\nfind_highlight=Підсвітити все\nfind_match_case_label=З урахуванням регістру\nfind_reached_top=Досягнуто початку документу, продовжено з кінця\nfind_reached_bottom=Досягнуто кінця документу, продовжено з початку\nfind_not_found=Фразу не знайдено\n\n# Error panel labels\nerror_more_info=Більше інформації\nerror_less_info=Менше інформації\nerror_close=Закрити\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Повідомлення: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стек: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Рядок: {{line}}\nrendering_error=Під час виведення сторінки сталася помилка.\n\n# Predefined zoom values\npage_scale_width=За шириною\npage_scale_fit=Умістити\npage_scale_auto=Авто-масштаб\npage_scale_actual=Дійсний розмір\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Помилка\nloading_error=Під час завантаження PDF сталася помилка.\ninvalid_file_error=Недійсний або пошкоджений PDF-файл.\nmissing_file_error=Відсутній PDF-файл.\nunexpected_response_error=Неочікувана відповідь сервера.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-аннотація]\npassword_label=Введіть пароль для відкриття цього PDF-файла.\npassword_invalid=Невірний пароль. Спробуйте ще.\npassword_ok=Гаразд\npassword_cancel=Скасувати\n\nprinting_not_supported=Попередження: Цей браузер не повністю підтримує друк.\nprinting_not_ready=Попередження: PDF не повністю завантажений для друку.\nweb_fonts_disabled=Веб-шрифти вимкнено: неможливо використати вбудовані у PDF шрифти.\ndocument_colors_not_allowed=PDF-документам не дозволено використовувати власні кольори: в браузері вимкнено параметр «Дозволити сторінкам використовувати власні кольори».\n"
  },
  {
    "path": "example/pages/include/pdf/locale/ur/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=پچھلا صفحہ\nprevious_label=پچھلا\nnext.title=اگلا صفحہ\nnext_label=آگے\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=صفحہ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} کا\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} کا {{pagesCount}})\n\nzoom_out.title=باہر زوم کریں\nzoom_out_label=باہر زوم کریں\nzoom_in.title=اندر زوم کریں\nzoom_in_label=اندر زوم کریں\nzoom.title=زوم\npresentation_mode.title=پیشکش موڈ میں چلے جائیں\npresentation_mode_label=پیشکش موڈ\nopen_file.title=مسل کھولیں\nopen_file_label=کھولیں\nprint.title=چھاپیں\nprint_label=چھاپیں\ndownload.title=ڈاؤن لوڈ\ndownload_label=ڈاؤن لوڈ\nbookmark.title=حالیہ نظارہ (نۓ دریچہ میں نقل کریں یا کھولیں)\nbookmark_label=حالیہ نظارہ\n\n# Secondary toolbar and context menu\ntools.title=آلات\ntools_label=آلات\nfirst_page.title=پہلے صفحہ پر جائیں\nfirst_page.label=پہلے صفحہ پر جائیں\nfirst_page_label=پہلے صفحہ پر جائیں\nlast_page.title=آخری صفحہ پر جائیں\nlast_page.label=آخری صفحہ پر جائیں\nlast_page_label=آخری صفحہ پر جائیں\npage_rotate_cw.title=گھڑی وار گھمائیں\npage_rotate_cw.label=گھڑی وار گھمائیں\npage_rotate_cw_label=گھڑی وار گھمائیں\npage_rotate_ccw.title=ضد گھڑی وار گھمائیں\npage_rotate_ccw.label=ضد گھڑی وار گھمائیں\npage_rotate_ccw_label=ضد گھڑی وار گھمائیں\n\n\n# Document properties dialog box\ndocument_properties.title=دستاویز خواص…\ndocument_properties_label=دستاویز خواص…\\u0020\ndocument_properties_file_name=نام مسل:\ndocument_properties_file_size=مسل سائز:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=عنوان:\ndocument_properties_author=تخلیق کار:\ndocument_properties_subject=موضوع:\ndocument_properties_keywords=کلیدی الفاظ:\ndocument_properties_creation_date=تخلیق کی تاریخ:\ndocument_properties_modification_date=ترمیم کی تاریخ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}، {{time}}\ndocument_properties_creator=تخلیق کار:\ndocument_properties_producer=PDF پیدا کار:\ndocument_properties_version=PDF ورژن:\ndocument_properties_page_count=صفحہ شمار:\ndocument_properties_close=بند کریں\n\nprint_progress_message=چھاپنے کرنے کے لیے دستاویز تیار کیے جا رھے ھیں\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent=*{{progress}}%*\nprint_progress_close=منسوخ کریں\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=سلائیڈ ٹوگل کریں\ntoggle_sidebar_label=سلائیڈ ٹوگل کریں\ndocument_outline.title=دستاویز کی سرخیاں دکھایں (تمام اشیاء وسیع / غائب کرنے کے لیے ڈبل کلک کریں)\ndocument_outline_label=دستاویز آؤٹ لائن\nattachments.title=منسلکات دکھائیں\nattachments_label=منسلکات\nthumbs.title=تھمبنیل دکھائیں\nthumbs_label=مجمل\nfindbar.title=دستاویز میں ڈھونڈیں\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=صفحہ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=صفحے کا مجمل {{page}}\n\n# Find panel button title and messages\nfind_previous.title=فقرے کا پچھلا وقوع ڈھونڈیں\nfind_previous_label=پچھلا\nfind_next.title=فقرے کا اگلہ وقوع ڈھونڈیں\nfind_next_label=آگے\nfind_highlight=تمام نمایاں کریں\nfind_match_case_label=حروف مشابہ کریں\nfind_reached_top=صفحہ کے شروع پر پہنچ گیا، نیچے سے جاری کیا\nfind_reached_bottom=صفحہ کے اختتام پر پہنچ گیا، اوپر سے جاری کیا\nfind_not_found=فقرا نہیں ملا\n\n# Error panel labels\nerror_more_info=مزید معلومات\nerror_less_info=کم معلومات\nerror_close=بند کریں\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=پیغام: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=سٹیک: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=مسل: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=لائن: {{line}}\nrendering_error=صفحہ بناتے ہوئے نقص آ گیا۔\n\n# Predefined zoom values\npage_scale_width=صفحہ چوڑائی\npage_scale_fit=صفحہ فٹنگ\npage_scale_auto=خودکار زوم\npage_scale_actual=اصل سائز\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=نقص\nloading_error=PDF لوڈ کرتے وقت نقص آ گیا۔\ninvalid_file_error=ناجائز یا خراب PDF مسل\nmissing_file_error=PDF مسل غائب ہے۔\nunexpected_response_error=غیرمتوقع پیش کار جواب\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} نوٹ]\npassword_label=PDF مسل کھولنے کے لیے پاس ورڈ داخل کریں.\npassword_invalid=ناجائز پاس ورڈ. براےؑ کرم دوبارہ کوشش کریں.\npassword_ok=سہی\npassword_cancel=منسوخ کریں\n\nprinting_not_supported=تنبیہ:چھاپنا اس براؤزر پر پوری طرح معاونت شدہ نہیں ہے۔\nprinting_not_ready=تنبیہ: PDF چھپائی کے لیے پوری طرح لوڈ نہیں ہوئی۔\nweb_fonts_disabled=ویب فانٹ نا اہل ہیں: شامل PDF فانٹ استعمال کرنے میں ناکام۔\ndocument_colors_not_allowed=PDF دستاویزات کو اپنے رنگ استعمال کرنے کی اجازت نہیں: 'صفحات کو اپنے رنگ چنیں' کی اِجازت براؤزر میں بے عمل ہے۔\n"
  },
  {
    "path": "example/pages/include/pdf/locale/vi/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Trang Trước\nprevious_label=Trước\nnext.title=Trang Sau\nnext_label=Tiếp\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=trên {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} trên {{pagesCount}})\n\nzoom_out.title=Thu nhỏ\nzoom_out_label=Thu nhỏ\nzoom_in.title=Phóng to\nzoom_in_label=Phóng to\nzoom.title=Chỉnh kích thước\npresentation_mode.title=Chuyển sang chế độ trình chiếu\npresentation_mode_label=Chế độ trình chiếu\nopen_file.title=Mở tập tin\nopen_file_label=Mở tập tin\nprint.title=In\nprint_label=In\ndownload.title=Tải xuống\ndownload_label=Tải xuống\nbookmark.title=Góc nhìn hiện tại (copy hoặc mở trong cửa sổ mới)\nbookmark_label=Chế độ xem hiện tại\n\n# Secondary toolbar and context menu\ntools.title=Công cụ\ntools_label=Công cụ\nfirst_page.title=Về trang đầu\nfirst_page.label=Về trang đầu\nfirst_page_label=Về trang đầu\nlast_page.title=Đến trang cuối\nlast_page.label=Đến trang cuối\nlast_page_label=Đến trang cuối\npage_rotate_cw.title=Xoay theo chiều kim đồng hồ\npage_rotate_cw.label=Xoay theo chiều kim đồng hồ\npage_rotate_cw_label=Xoay theo chiều kim đồng hồ\npage_rotate_ccw.title=Xoay ngược chiều kim đồng hồ\npage_rotate_ccw.label=Xoay ngược chiều kim đồng hồ\npage_rotate_ccw_label=Xoay ngược chiều kim đồng hồ\n\n\n# Document properties dialog box\ndocument_properties.title=Thuộc tính của tài liệu…\ndocument_properties_label=Thuộc tính của tài liệu…\ndocument_properties_file_name=Tên tập tin:\ndocument_properties_file_size=Kích thước:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} byte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title=Tiêu đề:\ndocument_properties_author=Tác giả:\ndocument_properties_subject=Chủ đề:\ndocument_properties_keywords=Từ khóa:\ndocument_properties_creation_date=Ngày tạo:\ndocument_properties_modification_date=Ngày sửa đổi:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Người tạo:\ndocument_properties_producer=Phần mềm tạo PDF:\ndocument_properties_version=Phiên bản PDF:\ndocument_properties_page_count=Tổng số trang:\ndocument_properties_close=Ðóng\n\nprint_progress_message=Chuẩn bị trang để in…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Bật/Tắt thanh lề\ntoggle_sidebar_label=Bật/Tắt thanh lề\ndocument_outline_label=Bản phác tài liệu\nattachments.title=Hiện nội dung đính kèm\nattachments_label=Nội dung đính kèm\nthumbs.title=Hiển thị ảnh thu nhỏ\nthumbs_label=Ảnh thu nhỏ\nfindbar.title=Tìm trong tài liệu\nfindbar_label=Tìm\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Trang {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Ảnh thu nhỏ của trang {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Tìm cụm từ ở phần trước\nfind_previous_label=Trước\nfind_next.title=Tìm cụm từ ở phần sau\nfind_next_label=Tiếp\nfind_highlight=Tô sáng tất cả\nfind_match_case_label=Phân biệt hoa, thường\nfind_reached_top=Đã đến phần đầu tài liệu, quay trở lại từ cuối\nfind_reached_bottom=Đã đến phần cuối của tài liệu, quay trở lại từ đầu\nfind_not_found=Không tìm thấy cụm từ này\n\n# Error panel labels\nerror_more_info=Thông tin thêm\nerror_less_info=Hiển thị ít thông tin hơn\nerror_close=Đóng\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Thông điệp: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Tập tin: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Dòng: {{line}}\nrendering_error=Lỗi khi hiển thị trang.\n\n# Predefined zoom values\npage_scale_width=Vừa chiều rộng\npage_scale_fit=Vừa chiều cao\npage_scale_auto=Tự động chọn kích thước\npage_scale_actual=Kích thước thực\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Lỗi\nloading_error=Lỗi khi tải tài liệu PDF.\ninvalid_file_error=Tập tin PDF hỏng hoặc không hợp lệ.\nmissing_file_error=Thiếu tập tin PDF.\nunexpected_response_error=Máy chủ có phản hồi lạ.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Chú thích]\npassword_label=Nhập mật khẩu để mở tập tin PDF này.\npassword_invalid=Mật khẩu không đúng. Vui lòng thử lại.\npassword_ok=OK\n\nprinting_not_supported=Cảnh báo: In ấn không được hỗ trợ đầy đủ ở trình duyệt này.\nprinting_not_ready=Cảnh báo: PDF chưa được tải hết để in.\nweb_fonts_disabled=Phông chữ Web bị vô hiệu hóa: không thể sử dụng các phông chữ PDF được nhúng.\ndocument_colors_not_allowed=Tài liệu PDF không được cho phép dùng màu riêng: 'Cho phép trang chọn màu riêng' đã bị tắt trên trình duyệt.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/wo/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Xët wi jiitu\nprevious_label=Bi jiitu\nnext.title=Xët wi ci topp\nnext_label=Bi ci topp\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Wàññi\nzoom_out_label=Wàññi\nzoom_in.title=Yaatal\nzoom_in_label=Yaatal\nzoom.title=Yambalaŋ\npresentation_mode.title=Wañarñil ci anamu wone\npresentation_mode_label=Anamu Wone\nopen_file.title=Ubbi benn dencukaay\nopen_file_label=Ubbi\nprint.title=Móol\nprint_label=Móol\ndownload.title=Yeb yi\ndownload_label=Yeb yi\nbookmark.title=Wone bi taxaw (duppi walla ubbi palanteer bu bees)\nbookmark_label=Wone bi feeñ\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Bopp:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\nthumbs.title=Wone nataal yu ndaw yi\nthumbs_label=Nataal yu ndaw yi\nfindbar.title=Gis ci biir jukki bi\nfindbar_label=Wut\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Xët {{xët}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Wiñet bu xët{{xët}}\n\n# Find panel button title and messages\nfind_previous.title=Seet beneen kaddu bu ni mel te jiitu\nfind_previous_label=Bi jiitu\nfind_next.title=Seet beneen kaddu bu ni mel\nfind_next_label=Bi ci topp\nfind_highlight=Melaxal lépp\nfind_match_case_label=Sàmm jëmmalin wi\nfind_reached_top=Jot nañu ndorteel xët wi, kontine dale ko ci suuf\nfind_reached_bottom=Jot nañu jeexitalu xët wi, kontine ci ndorte\nfind_not_found=Gisiñu kaddu gi\n\n# Error panel labels\nerror_more_info=Xibaar yu gën bari\nerror_less_info=Xibaar yu gën bari\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Bataaxal: {{bataaxal}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Juug: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Dencukaay: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rëdd : {{line}}\nrendering_error=Am njumte bu am bi xët bi di wonewu.\n\n# Predefined zoom values\npage_scale_width=Yaatuwaay bu mët\npage_scale_fit=Xët lëmm\npage_scale_auto=Yambalaŋ ci saa si\npage_scale_actual=Dayo bi am\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Njumte\nloading_error=Am na njumte ci yebum dencukaay PDF bi.\ninvalid_file_error=Dencukaay PDF bi baaxul walla mu sankar.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Karmat {{type}}]\npassword_ok=OK\npassword_cancel=Neenal\n\nprinting_not_supported=Artu: Joowkat bii nanguwul lool mool.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/xh/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Iphepha langaphambili\nprevious_label=Okwangaphambili\nnext.title=Iphepha elilandelayo\nnext_label=Okulandelayo\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Iphepha\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=kwali- {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} kwali {{pagesCount}})\n\nzoom_out.title=Bhekelisela Kudana\nzoom_out_label=Bhekelisela Kudana\nzoom_in.title=Sondeza Kufuphi\nzoom_in_label=Sondeza Kufuphi\nzoom.title=Yandisa / Nciphisa\npresentation_mode.title=Tshintshela kwimo yonikezelo\npresentation_mode_label=Imo yonikezelo\nopen_file.title=Vula Ifayile\nopen_file_label=Vula\nprint.title=Printa\nprint_label=Printa\ndownload.title=Khuphela\ndownload_label=Khuphela\nbookmark.title=Imbonakalo ekhoyo (kopa okanye vula kwifestile entsha)\nbookmark_label=Imbonakalo ekhoyo\n\n# Secondary toolbar and context menu\ntools.title=Izixhobo zemiyalelo\ntools_label=Izixhobo zemiyalelo\nfirst_page.title=Yiya kwiphepha lokuqala\nfirst_page.label=Yiya kwiphepha lokuqala\nfirst_page_label=Yiya kwiphepha lokuqala\nlast_page.title=Yiya kwiphepha lokugqibela\nlast_page.label=Yiya kwiphepha lokugqibela\nlast_page_label=Yiya kwiphepha lokugqibela\npage_rotate_cw.title=Jikelisa ngasekunene\npage_rotate_cw.label=Jikelisa ngasekunene\npage_rotate_cw_label=Jikelisa ngasekunene\npage_rotate_ccw.title=Jikelisa ngasekhohlo\npage_rotate_ccw.label=Jikelisa ngasekhohlo\npage_rotate_ccw_label=Jikelisa ngasekhohlo\n\ncursor_text_select_tool.title=Vumela iSixhobo sokuKhetha iTeksti\ncursor_text_select_tool_label=ISixhobo sokuKhetha iTeksti\ncursor_hand_tool.title=Yenza iSixhobo seSandla siSebenze\ncursor_hand_tool_label=ISixhobo seSandla\n\n# Document properties dialog box\ndocument_properties.title=Iipropati zoxwebhu…\ndocument_properties_label=Iipropati zoxwebhu…\ndocument_properties_file_name=Igama lefayile:\ndocument_properties_file_size=Isayizi yefayile:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB (iibhayiti{{size_b}})\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB (iibhayithi{{size_b}})\ndocument_properties_title=Umxholo:\ndocument_properties_author=Umbhali:\ndocument_properties_subject=Umbandela:\ndocument_properties_keywords=Amagama aphambili:\ndocument_properties_creation_date=Umhla wokwenziwa kwayo:\ndocument_properties_modification_date=Umhla wokulungiswa kwayo:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Umntu oyenzileyo:\ndocument_properties_producer=Umvelisi we-PDF:\ndocument_properties_version=Uhlelo lwe-PDF:\ndocument_properties_page_count=Inani lamaphepha:\ndocument_properties_close=Vala\n\nprint_progress_message=Ilungisa uxwebhu ukuze iprinte…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Rhoxisa\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Togola ngebha eseCaleni\ntoggle_sidebar_notification.title=ISidebar yeQhosha (uxwebhu lunolwandlalo/iziqhotyoshelwa)\ntoggle_sidebar_label=Togola ngebha eseCaleni\ndocument_outline.title=Bonisa uLwandlalo loXwebhu (cofa kabini ukuze wandise/diliza zonke izinto)\ndocument_outline_label=Isishwankathelo soxwebhu\nattachments.title=Bonisa iziqhotyoshelwa\nattachments_label=Iziqhoboshelo\nthumbs.title=Bonisa ukrobiso kumfanekiso\nthumbs_label=Ukrobiso kumfanekiso\nfindbar.title=Fumana kuXwebhu\nfindbar_label=Fumana\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Iphepha {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Ukrobiso kumfanekiso wephepha {{page}}\n\n# Find panel button title and messages\nfind_input.title=Fumana\nfind_input.placeholder=Fumana kuXwebhu…\nfind_previous.title=Fumanisa isenzeko sangaphambili sebinzana lamagama\nfind_previous_label=Okwangaphambili\nfind_next.title=Fumanisa isenzeko esilandelayo sebinzana lamagama\nfind_next_label=Okulandelayo\nfind_highlight=Qaqambisa konke\nfind_match_case_label=Tshatisa ngobukhulu bukanobumba\nfind_reached_top=Ufike ngaphezulu ephepheni, kusukwa ngezantsi\nfind_reached_bottom=Ufike ekupheleni kwephepha, kusukwa ngaphezulu\nfind_not_found=Ibinzana alifunyenwanga\n\n# Error panel labels\nerror_more_info=Inkcazelo Engakumbi\nerror_less_info=Inkcazelo Encinane\nerror_close=Vala\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=I-PDF.js v{{version}} (yakha: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Umyalezo: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Imfumba: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ifayile: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Umgca: {{line}}\nrendering_error=Imposiso yenzekile xa bekunikezelwa iphepha.\n\n# Predefined zoom values\npage_scale_width=Ububanzi bephepha\npage_scale_fit=Ukulinganiswa kwephepha\npage_scale_auto=Ukwandisa/Ukunciphisa Ngokwayo\npage_scale_actual=Ubungakanani bokwenene\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Imposiso\nloading_error=Imposiso yenzekile xa kulayishwa i-PDF.\ninvalid_file_error=Ifayile ye-PDF engeyiyo okanye eyonakalisiweyo.\nmissing_file_error=Ifayile ye-PDF edukileyo.\nunexpected_response_error=Impendulo yeseva engalindelekanga.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Ubhalo-nqaku]\npassword_label=Faka ipasiwedi ukuze uvule le fayile yePDF.\npassword_invalid=Ipasiwedi ayisebenzi. Nceda uzame kwakhona.\npassword_ok=KULUNGILE\npassword_cancel=Rhoxisa\n\nprinting_not_supported=Isilumkiso: Ukuprinta akuxhaswa ngokupheleleyo yile bhrawuza.\nprinting_not_ready=Isilumkiso: IPDF ayihlohlwanga ngokupheleleyo ukwenzela ukuprinta.\nweb_fonts_disabled=Iifonti zewebhu ziqhwalelisiwe: ayikwazi ukusebenzisa iifonti ze-PDF ezincanyathelisiweyo.\ndocument_colors_not_allowed=Amaxwebhu ePDF akavumelekanga ukuba asebenzise imibala yawo: 'Ukuvumela amaphepha ukuba asebenzise eyawo imibala' kuvaliwe ukuba kungasebenzi kwibhrawuza.\n"
  },
  {
    "path": "example/pages/include/pdf/locale/zh-CN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=上一页\nprevious_label=上一页\nnext.title=下一页\nnext_label=下一页\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=页面\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=缩小\nzoom_out_label=缩小\nzoom_in.title=放大\nzoom_in_label=放大\nzoom.title=缩放\npresentation_mode.title=切换到演示模式\npresentation_mode_label=演示模式\nopen_file.title=打开文件\nopen_file_label=打开\nprint.title=打印\nprint_label=打印\ndownload.title=下载\ndownload_label=下载\nbookmark.title=当前在看的内容（复制或在新窗口中打开）\nbookmark_label=当前在看\n\n# Secondary toolbar and context menu\ntools.title=工具\ntools_label=工具\nfirst_page.title=转到第一页\nfirst_page.label=转到第一页\nfirst_page_label=转到第一页\nlast_page.title=转到最后一页\nlast_page.label=转到最后一页\nlast_page_label=转到最后一页\npage_rotate_cw.title=顺时针旋转\npage_rotate_cw.label=顺时针旋转\npage_rotate_cw_label=顺时针旋转\npage_rotate_ccw.title=逆时针旋转\npage_rotate_ccw.label=逆时针旋转\npage_rotate_ccw_label=逆时针旋转\n\ncursor_text_select_tool.title=启用文本选择工具\ncursor_text_select_tool_label=文本选择工具\ncursor_hand_tool.title=启用手形工具\ncursor_hand_tool_label=手形工具\n\n# Document properties dialog box\ndocument_properties.title=文档属性…\ndocument_properties_label=文档属性…\ndocument_properties_file_name=文件名:\ndocument_properties_file_size=文件大小:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} 字节)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} 字节)\ndocument_properties_title=标题:\ndocument_properties_author=作者:\ndocument_properties_subject=主题:\ndocument_properties_keywords=关键词:\ndocument_properties_creation_date=创建日期:\ndocument_properties_modification_date=修改日期:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=创建者:\ndocument_properties_producer=PDF 制作者:\ndocument_properties_version=PDF 版本:\ndocument_properties_page_count=页数:\ndocument_properties_close=关闭\n\nprint_progress_message=正在准备打印文档…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=取消\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=切换侧栏\ntoggle_sidebar_notification.title=切换侧栏（文档所含的大纲/附件）\ntoggle_sidebar_label=切换侧栏\ndocument_outline.title=显示文档大纲（双击展开/折叠所有项）\ndocument_outline_label=文档大纲\nattachments.title=显示附件\nattachments_label=附件\nthumbs.title=显示缩略图\nthumbs_label=缩略图\nfindbar.title=在文档中查找\nfindbar_label=查找\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=页码 {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=页面 {{page}} 的缩略图\n\n# Find panel button title and messages\nfind_input.title=查找\nfind_input.placeholder=在文档中查找…\nfind_previous.title=查找词语上一次出现的位置\nfind_previous_label=上一页\nfind_next.title=查找词语后一次出现的位置\nfind_next_label=下一页\nfind_highlight=全部高亮显示\nfind_match_case_label=区分大小写\nfind_reached_top=到达文档开头，从末尾继续\nfind_reached_bottom=到达文档末尾，从开头继续\nfind_not_found=找不到指定词语\n\n# Error panel labels\nerror_more_info=更多信息\nerror_less_info=更少信息\nerror_close=关闭\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=信息：{{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=堆栈：{{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=文件：{{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=行号：{{line}}\nrendering_error=渲染页面时发生错误。\n\n# Predefined zoom values\npage_scale_width=适合页宽\npage_scale_fit=适合页面\npage_scale_auto=自动缩放\npage_scale_actual=实际大小\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=错误\nloading_error=载入PDF时发生错误。\ninvalid_file_error=无效或损坏的PDF文件。\nmissing_file_error=缺少PDF文件。\nunexpected_response_error=意外的服务器响应。\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} 注解]\npassword_label=输入密码以打开此 PDF 文件。\npassword_invalid=密码无效。请重试。\npassword_ok=确定\npassword_cancel=取消\n\nprinting_not_supported=警告：此浏览器尚未完整支持打印功能。\nprinting_not_ready=警告：该 PDF 未完全载入以供打印。\nweb_fonts_disabled=Web 字体已被禁用：无法使用嵌入的PDF字体。\ndocument_colors_not_allowed=不允许 PDF 文档使用自己的颜色：浏览器中“允许页面选择自己的颜色”的选项已停用。\n"
  },
  {
    "path": "example/pages/include/pdf/locale/zh-TW/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=上一頁\nprevious_label=上一頁\nnext.title=下一頁\nnext_label=下一頁\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=第\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=頁，共 {{pagesCount}} 頁\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=（第 {{pageNumber}} 頁，共 {{pagesCount}} 頁）\n\nzoom_out.title=縮小\nzoom_out_label=縮小\nzoom_in.title=放大\nzoom_in_label=放大\nzoom.title=縮放\npresentation_mode.title=切換至簡報模式\npresentation_mode_label=簡報模式\nopen_file.title=開啟檔案\nopen_file_label=開啟\nprint.title=列印\nprint_label=列印\ndownload.title=下載\ndownload_label=下載\nbookmark.title=目前檢視的內容（複製或開啟於新視窗）\nbookmark_label=目前檢視\n\n# Secondary toolbar and context menu\ntools.title=工具\ntools_label=工具\nfirst_page.title=跳到第一頁\nfirst_page.label=跳到第一頁\nfirst_page_label=跳到第一頁\nlast_page.title=跳到最後一頁\nlast_page.label=跳到最後一頁\nlast_page_label=跳到最後一頁\npage_rotate_cw.title=順時針旋轉\npage_rotate_cw.label=順時針旋轉\npage_rotate_cw_label=順時針旋轉\npage_rotate_ccw.title=逆時針旋轉\npage_rotate_ccw.label=逆時針旋轉\npage_rotate_ccw_label=逆時針旋轉\n\ncursor_text_select_tool.title=開啟文字選擇工具\ncursor_text_select_tool_label=文字選擇工具\ncursor_hand_tool.title=開啟頁面移動工具\ncursor_hand_tool_label=頁面移動工具\n\n# Document properties dialog box\ndocument_properties.title=文件內容…\ndocument_properties_label=文件內容…\ndocument_properties_file_name=檔案名稱:\ndocument_properties_file_size=檔案大小:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB（{{size_b}} 位元組）\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB（{{size_b}} 位元組）\ndocument_properties_title=標題:\ndocument_properties_author=作者:\ndocument_properties_subject=主旨:\ndocument_properties_keywords=關鍵字:\ndocument_properties_creation_date=建立日期:\ndocument_properties_modification_date=修改日期:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=建立者:\ndocument_properties_producer=PDF 產生器:\ndocument_properties_version=PDF 版本:\ndocument_properties_page_count=頁數:\ndocument_properties_close=關閉\n\nprint_progress_message=正在準備列印文件…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=取消\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=切換側邊欄\ntoggle_sidebar_notification.title=切換側邊攔（文件包含大綱或附件）\ntoggle_sidebar_label=切換側邊欄\ndocument_outline.title=顯示文件大綱（雙擊展開/摺疊所有項目）\ndocument_outline_label=文件大綱\nattachments.title=顯示附件\nattachments_label=附件\nthumbs.title=顯示縮圖\nthumbs_label=縮圖\nfindbar.title=在文件中尋找\nfindbar_label=尋找\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=頁 {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=頁 {{page}} 的縮圖\n\n# Find panel button title and messages\nfind_input.title=搜尋\nfind_input.placeholder=在文件中搜尋…\nfind_previous.title=尋找文字前次出現的位置\nfind_previous_label=上一個\nfind_next.title=尋找文字下次出現的位置\nfind_next_label=下一個\nfind_highlight=全部強調標示\nfind_match_case_label=區分大小寫\nfind_reached_top=已搜尋至文件頂端，自底端繼續搜尋\nfind_reached_bottom=已搜尋至文件底端，自頂端繼續搜尋\nfind_not_found=找不到指定文字\n\n# Error panel labels\nerror_more_info=更多資訊\nerror_less_info=更少資訊\nerror_close=關閉\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=訊息: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=堆疊: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=檔案: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=行: {{line}}\nrendering_error=描繪頁面時發生錯誤。\n\n# Predefined zoom values\npage_scale_width=頁面寬度\npage_scale_fit=縮放至頁面大小\npage_scale_auto=自動縮放\npage_scale_actual=實際大小\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=錯誤\nloading_error=載入 PDF 時發生錯誤。\ninvalid_file_error=無效或毀損的 PDF 檔案。\nmissing_file_error=找不到 PDF 檔案。\nunexpected_response_error=伺服器回應未預期的內容。\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} 註解]\npassword_label=請輸入用來開啟此 PDF 檔案的密碼。\npassword_invalid=密碼不正確，請再試一次。\npassword_ok=確定\npassword_cancel=取消\n\nprinting_not_supported=警告: 此瀏覽器未完整支援列印功能。\nprinting_not_ready=警告: 此 PDF 未完成下載以供列印。\nweb_fonts_disabled=已停用網路字型 (Web fonts): 無法使用 PDF 內嵌字型。\ndocument_colors_not_allowed=瀏覽器的「優先使用網頁指定的色彩」未被勾選，PDF 文件無法使用自己的色彩。\n"
  },
  {
    "path": "example/pages/include/pdf/locale/zu/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Ikhasi eledlule\nprevious_label=Okudlule\nnext.title=Ikhasi elilandelayo\nnext_label=Okulandelayo\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Hlehlisela emuva\nzoom_out_label=Hlehlisela emuva\nzoom_in.title=Sondeza eduze\nzoom_in_label=Sondeza eduze\nzoom.title=Lwiza\npresentation_mode.title=Guqulela kwindlela yesethulo\npresentation_mode_label=Indlelo yesethulo\nopen_file.title=Vula ifayela\nopen_file_label=Vula\nprint.title=Phrinta\nprint_label=Phrinta\ndownload.title=Landa\ndownload_label=Landa\nbookmark.title=Ukubuka kwamanje (kopisha noma vula kwifasitela elisha)\nbookmark_label=Ukubuka kwamanje\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\ndocument_properties_file_name=Igama lefayela:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Isihloko:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=I-toggle yebha yaseceleni\ntoggle_sidebar_label=i-toggle yebha yaseceleni\ndocument_outline_label=Umugqa waseceleni wedokhumenti\nthumbs.title=Bonisa izithombe ezincane\nthumbs_label=Izithonjana\nfindbar.title=Thola kwidokhumenti\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Ikhasi {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Isithonjana sekhasi {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Thola indawo eyandulelayo okuvela kuyo lomshwana\nfind_previous_label=Okudlulile\nfind_next.title=Thola enye indawo okuvela kuyo lomshwana\nfind_next_label=Okulandelayo\nfind_highlight=Gqamisa konke\nfind_match_case_label=Fanisa ikheyisi\nfind_reached_top=Finyelele phezulu kwidokhumenti, qhubeka kusukaphansi\nfind_reached_bottom=Ifinyelele ekupheleni kwedokhumenti, qhubeka kusukaphezulu\nfind_not_found=Umshwana awutholakali\n\n# Error panel labels\nerror_more_info=Ukwaziswa Okwengeziwe\nerror_less_info=Ukwazi okuncane\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Umlayezo: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Isitaki: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ifayela: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Umugqa: {{line}}\nrendering_error=Iphutha lenzekile uma kunikwa ikhasi.\n\n# Predefined zoom values\npage_scale_width=Ububanzi bekhasi\npage_scale_fit=Ukulingana kwekhasi\npage_scale_auto=Ukulwiza okuzenzekalelayo\npage_scale_actual=Usayizi Wangempela\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Iphutha\nloading_error=Kwenzeke iphutha uma kulayishwa i-PDF.\ninvalid_file_error=Ifayela le-PDF elingavumelekile noma elonakele.\nmissing_file_error=Ifayela le-PDF elilahlekile.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Amazwibela e-{{type}}]\npassword_ok=Kulungile\n\nprinting_not_supported=Isixwayiso: Ukuphrinta akuxhasiwe yilesisiphequluli ngokugcwele.\nprinting_not_ready=Isixwayiso: I-PDF ayikalayishwa ngokuphelele yiPhrinta.\nweb_fonts_disabled=Amafonti e-webhu akutshaziwe: ayikwazi ukusebenzisa amafonti abekiwe e-PDF.\\u0020\ndocument_colors_not_allowed=Amadokhumenti we-PDF awavumelekile ukusebenzisa imibalo yayo: 'Vumela amakhasi ukukhetha imibala yayo' ayisebenzi kusiphequluli.\n"
  },
  {
    "path": "example/pages/include/pdf/pdf.js",
    "content": "/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"pdfjs-dist/build/pdf\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"pdfjs-dist/build/pdf\"] = factory();\n\telse\n\t\troot[\"pdfjs-dist/build/pdf\"] = root.pdfjsDistBuildPdf = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __w_pdfjs_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__w_pdfjs_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__w_pdfjs_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__w_pdfjs_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__w_pdfjs_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__w_pdfjs_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__w_pdfjs_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__w_pdfjs_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__w_pdfjs_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__w_pdfjs_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __w_pdfjs_require__(__w_pdfjs_require__.s = 15);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.unreachable = exports.warn = exports.utf8StringToString = exports.stringToUTF8String = exports.stringToPDFString = exports.stringToBytes = exports.string32 = exports.shadow = exports.setVerbosityLevel = exports.ReadableStream = exports.removeNullCharacters = exports.readUint32 = exports.readUint16 = exports.readInt8 = exports.log2 = exports.loadJpegStream = exports.isEvalSupported = exports.isLittleEndian = exports.createValidAbsoluteUrl = exports.isSameOrigin = exports.isNodeJS = exports.isSpace = exports.isString = exports.isNum = exports.isInt = exports.isEmptyObj = exports.isBool = exports.isArrayBuffer = exports.isArray = exports.info = exports.globalScope = exports.getVerbosityLevel = exports.getLookupTableFactory = exports.deprecated = exports.createObjectURL = exports.createPromiseCapability = exports.createBlob = exports.bytesToString = exports.assert = exports.arraysToBytes = exports.arrayByteLength = exports.FormatError = exports.XRefParseException = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.StatTimer = exports.PasswordResponses = exports.PasswordException = exports.PageViewport = exports.NotImplementedException = exports.NativeImageDecoding = exports.MissingPDFException = exports.MissingDataException = exports.MessageHandler = exports.InvalidPDFException = exports.AbortException = exports.CMapCompressionType = exports.ImageKind = exports.FontType = exports.AnnotationType = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.UNSUPPORTED_FEATURES = exports.VERBOSITY_LEVELS = exports.OPS = exports.IDENTITY_MATRIX = exports.FONT_IDENTITY_MATRIX = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n__w_pdfjs_require__(16);\n\nvar _streams_polyfill = __w_pdfjs_require__(17);\n\nvar globalScope = typeof window !== 'undefined' && window.Math === Math ? window : typeof global !== 'undefined' && global.Math === Math ? global : typeof self !== 'undefined' && self.Math === Math ? self : undefined;\nvar FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\nvar NativeImageDecoding = {\n  NONE: 'none',\n  DECODE: 'decode',\n  DISPLAY: 'display'\n};\nvar TextRenderingMode = {\n  FILL: 0,\n  STROKE: 1,\n  FILL_STROKE: 2,\n  INVISIBLE: 3,\n  FILL_ADD_TO_PATH: 4,\n  STROKE_ADD_TO_PATH: 5,\n  FILL_STROKE_ADD_TO_PATH: 6,\n  ADD_TO_PATH: 7,\n  FILL_STROKE_MASK: 3,\n  ADD_TO_PATH_FLAG: 4\n};\nvar ImageKind = {\n  GRAYSCALE_1BPP: 1,\n  RGB_24BPP: 2,\n  RGBA_32BPP: 3\n};\nvar AnnotationType = {\n  TEXT: 1,\n  LINK: 2,\n  FREETEXT: 3,\n  LINE: 4,\n  SQUARE: 5,\n  CIRCLE: 6,\n  POLYGON: 7,\n  POLYLINE: 8,\n  HIGHLIGHT: 9,\n  UNDERLINE: 10,\n  SQUIGGLY: 11,\n  STRIKEOUT: 12,\n  STAMP: 13,\n  CARET: 14,\n  INK: 15,\n  POPUP: 16,\n  FILEATTACHMENT: 17,\n  SOUND: 18,\n  MOVIE: 19,\n  WIDGET: 20,\n  SCREEN: 21,\n  PRINTERMARK: 22,\n  TRAPNET: 23,\n  WATERMARK: 24,\n  THREED: 25,\n  REDACT: 26\n};\nvar AnnotationFlag = {\n  INVISIBLE: 0x01,\n  HIDDEN: 0x02,\n  PRINT: 0x04,\n  NOZOOM: 0x08,\n  NOROTATE: 0x10,\n  NOVIEW: 0x20,\n  READONLY: 0x40,\n  LOCKED: 0x80,\n  TOGGLENOVIEW: 0x100,\n  LOCKEDCONTENTS: 0x200\n};\nvar AnnotationFieldFlag = {\n  READONLY: 0x0000001,\n  REQUIRED: 0x0000002,\n  NOEXPORT: 0x0000004,\n  MULTILINE: 0x0001000,\n  PASSWORD: 0x0002000,\n  NOTOGGLETOOFF: 0x0004000,\n  RADIO: 0x0008000,\n  PUSHBUTTON: 0x0010000,\n  COMBO: 0x0020000,\n  EDIT: 0x0040000,\n  SORT: 0x0080000,\n  FILESELECT: 0x0100000,\n  MULTISELECT: 0x0200000,\n  DONOTSPELLCHECK: 0x0400000,\n  DONOTSCROLL: 0x0800000,\n  COMB: 0x1000000,\n  RICHTEXT: 0x2000000,\n  RADIOSINUNISON: 0x2000000,\n  COMMITONSELCHANGE: 0x4000000\n};\nvar AnnotationBorderStyleType = {\n  SOLID: 1,\n  DASHED: 2,\n  BEVELED: 3,\n  INSET: 4,\n  UNDERLINE: 5\n};\nvar StreamType = {\n  UNKNOWN: 0,\n  FLATE: 1,\n  LZW: 2,\n  DCT: 3,\n  JPX: 4,\n  JBIG: 5,\n  A85: 6,\n  AHX: 7,\n  CCF: 8,\n  RL: 9\n};\nvar FontType = {\n  UNKNOWN: 0,\n  TYPE1: 1,\n  TYPE1C: 2,\n  CIDFONTTYPE0: 3,\n  CIDFONTTYPE0C: 4,\n  TRUETYPE: 5,\n  CIDFONTTYPE2: 6,\n  TYPE3: 7,\n  OPENTYPE: 8,\n  TYPE0: 9,\n  MMTYPE1: 10\n};\nvar VERBOSITY_LEVELS = {\n  errors: 0,\n  warnings: 1,\n  infos: 5\n};\nvar CMapCompressionType = {\n  NONE: 0,\n  BINARY: 1,\n  STREAM: 2\n};\nvar OPS = {\n  dependency: 1,\n  setLineWidth: 2,\n  setLineCap: 3,\n  setLineJoin: 4,\n  setMiterLimit: 5,\n  setDash: 6,\n  setRenderingIntent: 7,\n  setFlatness: 8,\n  setGState: 9,\n  save: 10,\n  restore: 11,\n  transform: 12,\n  moveTo: 13,\n  lineTo: 14,\n  curveTo: 15,\n  curveTo2: 16,\n  curveTo3: 17,\n  closePath: 18,\n  rectangle: 19,\n  stroke: 20,\n  closeStroke: 21,\n  fill: 22,\n  eoFill: 23,\n  fillStroke: 24,\n  eoFillStroke: 25,\n  closeFillStroke: 26,\n  closeEOFillStroke: 27,\n  endPath: 28,\n  clip: 29,\n  eoClip: 30,\n  beginText: 31,\n  endText: 32,\n  setCharSpacing: 33,\n  setWordSpacing: 34,\n  setHScale: 35,\n  setLeading: 36,\n  setFont: 37,\n  setTextRenderingMode: 38,\n  setTextRise: 39,\n  moveText: 40,\n  setLeadingMoveText: 41,\n  setTextMatrix: 42,\n  nextLine: 43,\n  showText: 44,\n  showSpacedText: 45,\n  nextLineShowText: 46,\n  nextLineSetSpacingShowText: 47,\n  setCharWidth: 48,\n  setCharWidthAndBounds: 49,\n  setStrokeColorSpace: 50,\n  setFillColorSpace: 51,\n  setStrokeColor: 52,\n  setStrokeColorN: 53,\n  setFillColor: 54,\n  setFillColorN: 55,\n  setStrokeGray: 56,\n  setFillGray: 57,\n  setStrokeRGBColor: 58,\n  setFillRGBColor: 59,\n  setStrokeCMYKColor: 60,\n  setFillCMYKColor: 61,\n  shadingFill: 62,\n  beginInlineImage: 63,\n  beginImageData: 64,\n  endInlineImage: 65,\n  paintXObject: 66,\n  markPoint: 67,\n  markPointProps: 68,\n  beginMarkedContent: 69,\n  beginMarkedContentProps: 70,\n  endMarkedContent: 71,\n  beginCompat: 72,\n  endCompat: 73,\n  paintFormXObjectBegin: 74,\n  paintFormXObjectEnd: 75,\n  beginGroup: 76,\n  endGroup: 77,\n  beginAnnotations: 78,\n  endAnnotations: 79,\n  beginAnnotation: 80,\n  endAnnotation: 81,\n  paintJpegXObject: 82,\n  paintImageMaskXObject: 83,\n  paintImageMaskXObjectGroup: 84,\n  paintImageXObject: 85,\n  paintInlineImageXObject: 86,\n  paintInlineImageXObjectGroup: 87,\n  paintImageXObjectRepeat: 88,\n  paintImageMaskXObjectRepeat: 89,\n  paintSolidColorImageMask: 90,\n  constructPath: 91\n};\nvar verbosity = VERBOSITY_LEVELS.warnings;\nfunction setVerbosityLevel(level) {\n  verbosity = level;\n}\nfunction getVerbosityLevel() {\n  return verbosity;\n}\nfunction info(msg) {\n  if (verbosity >= VERBOSITY_LEVELS.infos) {\n    console.log('Info: ' + msg);\n  }\n}\nfunction warn(msg) {\n  if (verbosity >= VERBOSITY_LEVELS.warnings) {\n    console.log('Warning: ' + msg);\n  }\n}\nfunction deprecated(details) {\n  console.log('Deprecated API usage: ' + details);\n}\nfunction unreachable(msg) {\n  throw new Error(msg);\n}\nfunction assert(cond, msg) {\n  if (!cond) {\n    unreachable(msg);\n  }\n}\nvar UNSUPPORTED_FEATURES = {\n  unknown: 'unknown',\n  forms: 'forms',\n  javaScript: 'javaScript',\n  smask: 'smask',\n  shadingPattern: 'shadingPattern',\n  font: 'font'\n};\nfunction isSameOrigin(baseUrl, otherUrl) {\n  try {\n    var base = new URL(baseUrl);\n    if (!base.origin || base.origin === 'null') {\n      return false;\n    }\n  } catch (e) {\n    return false;\n  }\n  var other = new URL(otherUrl, base);\n  return base.origin === other.origin;\n}\nfunction isValidProtocol(url) {\n  if (!url) {\n    return false;\n  }\n  switch (url.protocol) {\n    case 'http:':\n    case 'https:':\n    case 'ftp:':\n    case 'mailto:':\n    case 'tel:':\n      return true;\n    default:\n      return false;\n  }\n}\nfunction createValidAbsoluteUrl(url, baseUrl) {\n  if (!url) {\n    return null;\n  }\n  try {\n    var absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url);\n    if (isValidProtocol(absoluteUrl)) {\n      return absoluteUrl;\n    }\n  } catch (ex) {}\n  return null;\n}\nfunction shadow(obj, prop, value) {\n  Object.defineProperty(obj, prop, {\n    value: value,\n    enumerable: true,\n    configurable: true,\n    writable: false\n  });\n  return value;\n}\nfunction getLookupTableFactory(initializer) {\n  var lookup;\n  return function () {\n    if (initializer) {\n      lookup = Object.create(null);\n      initializer(lookup);\n      initializer = null;\n    }\n    return lookup;\n  };\n}\nvar PasswordResponses = {\n  NEED_PASSWORD: 1,\n  INCORRECT_PASSWORD: 2\n};\nvar PasswordException = function PasswordExceptionClosure() {\n  function PasswordException(msg, code) {\n    this.name = 'PasswordException';\n    this.message = msg;\n    this.code = code;\n  }\n  PasswordException.prototype = new Error();\n  PasswordException.constructor = PasswordException;\n  return PasswordException;\n}();\nvar UnknownErrorException = function UnknownErrorExceptionClosure() {\n  function UnknownErrorException(msg, details) {\n    this.name = 'UnknownErrorException';\n    this.message = msg;\n    this.details = details;\n  }\n  UnknownErrorException.prototype = new Error();\n  UnknownErrorException.constructor = UnknownErrorException;\n  return UnknownErrorException;\n}();\nvar InvalidPDFException = function InvalidPDFExceptionClosure() {\n  function InvalidPDFException(msg) {\n    this.name = 'InvalidPDFException';\n    this.message = msg;\n  }\n  InvalidPDFException.prototype = new Error();\n  InvalidPDFException.constructor = InvalidPDFException;\n  return InvalidPDFException;\n}();\nvar MissingPDFException = function MissingPDFExceptionClosure() {\n  function MissingPDFException(msg) {\n    this.name = 'MissingPDFException';\n    this.message = msg;\n  }\n  MissingPDFException.prototype = new Error();\n  MissingPDFException.constructor = MissingPDFException;\n  return MissingPDFException;\n}();\nvar UnexpectedResponseException = function UnexpectedResponseExceptionClosure() {\n  function UnexpectedResponseException(msg, status) {\n    this.name = 'UnexpectedResponseException';\n    this.message = msg;\n    this.status = status;\n  }\n  UnexpectedResponseException.prototype = new Error();\n  UnexpectedResponseException.constructor = UnexpectedResponseException;\n  return UnexpectedResponseException;\n}();\nvar NotImplementedException = function NotImplementedExceptionClosure() {\n  function NotImplementedException(msg) {\n    this.message = msg;\n  }\n  NotImplementedException.prototype = new Error();\n  NotImplementedException.prototype.name = 'NotImplementedException';\n  NotImplementedException.constructor = NotImplementedException;\n  return NotImplementedException;\n}();\nvar MissingDataException = function MissingDataExceptionClosure() {\n  function MissingDataException(begin, end) {\n    this.begin = begin;\n    this.end = end;\n    this.message = 'Missing data [' + begin + ', ' + end + ')';\n  }\n  MissingDataException.prototype = new Error();\n  MissingDataException.prototype.name = 'MissingDataException';\n  MissingDataException.constructor = MissingDataException;\n  return MissingDataException;\n}();\nvar XRefParseException = function XRefParseExceptionClosure() {\n  function XRefParseException(msg) {\n    this.message = msg;\n  }\n  XRefParseException.prototype = new Error();\n  XRefParseException.prototype.name = 'XRefParseException';\n  XRefParseException.constructor = XRefParseException;\n  return XRefParseException;\n}();\nvar FormatError = function FormatErrorClosure() {\n  function FormatError(msg) {\n    this.message = msg;\n  }\n  FormatError.prototype = new Error();\n  FormatError.prototype.name = 'FormatError';\n  FormatError.constructor = FormatError;\n  return FormatError;\n}();\nvar AbortException = function AbortExceptionClosure() {\n  function AbortException(msg) {\n    this.name = 'AbortException';\n    this.message = msg;\n  }\n  AbortException.prototype = new Error();\n  AbortException.constructor = AbortException;\n  return AbortException;\n}();\nvar NullCharactersRegExp = /\\x00/g;\nfunction removeNullCharacters(str) {\n  if (typeof str !== 'string') {\n    warn('The argument for removeNullCharacters must be a string.');\n    return str;\n  }\n  return str.replace(NullCharactersRegExp, '');\n}\nfunction bytesToString(bytes) {\n  assert(bytes !== null && (typeof bytes === 'undefined' ? 'undefined' : _typeof(bytes)) === 'object' && bytes.length !== undefined, 'Invalid argument for bytesToString');\n  var length = bytes.length;\n  var MAX_ARGUMENT_COUNT = 8192;\n  if (length < MAX_ARGUMENT_COUNT) {\n    return String.fromCharCode.apply(null, bytes);\n  }\n  var strBuf = [];\n  for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n    var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n    var chunk = bytes.subarray(i, chunkEnd);\n    strBuf.push(String.fromCharCode.apply(null, chunk));\n  }\n  return strBuf.join('');\n}\nfunction stringToBytes(str) {\n  assert(typeof str === 'string', 'Invalid argument for stringToBytes');\n  var length = str.length;\n  var bytes = new Uint8Array(length);\n  for (var i = 0; i < length; ++i) {\n    bytes[i] = str.charCodeAt(i) & 0xFF;\n  }\n  return bytes;\n}\nfunction arrayByteLength(arr) {\n  if (arr.length !== undefined) {\n    return arr.length;\n  }\n  assert(arr.byteLength !== undefined);\n  return arr.byteLength;\n}\nfunction arraysToBytes(arr) {\n  if (arr.length === 1 && arr[0] instanceof Uint8Array) {\n    return arr[0];\n  }\n  var resultLength = 0;\n  var i,\n      ii = arr.length;\n  var item, itemLength;\n  for (i = 0; i < ii; i++) {\n    item = arr[i];\n    itemLength = arrayByteLength(item);\n    resultLength += itemLength;\n  }\n  var pos = 0;\n  var data = new Uint8Array(resultLength);\n  for (i = 0; i < ii; i++) {\n    item = arr[i];\n    if (!(item instanceof Uint8Array)) {\n      if (typeof item === 'string') {\n        item = stringToBytes(item);\n      } else {\n        item = new Uint8Array(item);\n      }\n    }\n    itemLength = item.byteLength;\n    data.set(item, pos);\n    pos += itemLength;\n  }\n  return data;\n}\nfunction string32(value) {\n  return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);\n}\nfunction log2(x) {\n  var n = 1,\n      i = 0;\n  while (x > n) {\n    n <<= 1;\n    i++;\n  }\n  return i;\n}\nfunction readInt8(data, start) {\n  return data[start] << 24 >> 24;\n}\nfunction readUint16(data, offset) {\n  return data[offset] << 8 | data[offset + 1];\n}\nfunction readUint32(data, offset) {\n  return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0;\n}\nfunction isLittleEndian() {\n  var buffer8 = new Uint8Array(4);\n  buffer8[0] = 1;\n  var view32 = new Uint32Array(buffer8.buffer, 0, 1);\n  return view32[0] === 1;\n}\nfunction isEvalSupported() {\n  try {\n    new Function('');\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\nvar IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];\nvar Util = function UtilClosure() {\n  function Util() {}\n  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];\n  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {\n    rgbBuf[1] = r;\n    rgbBuf[3] = g;\n    rgbBuf[5] = b;\n    return rgbBuf.join('');\n  };\n  Util.transform = function Util_transform(m1, m2) {\n    return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]];\n  };\n  Util.applyTransform = function Util_applyTransform(p, m) {\n    var xt = p[0] * m[0] + p[1] * m[2] + m[4];\n    var yt = p[0] * m[1] + p[1] * m[3] + m[5];\n    return [xt, yt];\n  };\n  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n    return [xt, yt];\n  };\n  Util.getAxialAlignedBoundingBox = function Util_getAxialAlignedBoundingBox(r, m) {\n    var p1 = Util.applyTransform(r, m);\n    var p2 = Util.applyTransform(r.slice(2, 4), m);\n    var p3 = Util.applyTransform([r[0], r[3]], m);\n    var p4 = Util.applyTransform([r[2], r[1]], m);\n    return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])];\n  };\n  Util.inverseTransform = function Util_inverseTransform(m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];\n  };\n  Util.apply3dTransform = function Util_apply3dTransform(m, v) {\n    return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]];\n  };\n  Util.singularValueDecompose2dScale = function Util_singularValueDecompose2dScale(m) {\n    var transpose = [m[0], m[2], m[1], m[3]];\n    var a = m[0] * transpose[0] + m[1] * transpose[2];\n    var b = m[0] * transpose[1] + m[1] * transpose[3];\n    var c = m[2] * transpose[0] + m[3] * transpose[2];\n    var d = m[2] * transpose[1] + m[3] * transpose[3];\n    var first = (a + d) / 2;\n    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;\n    var sx = first + second || 1;\n    var sy = first - second || 1;\n    return [Math.sqrt(sx), Math.sqrt(sy)];\n  };\n  Util.normalizeRect = function Util_normalizeRect(rect) {\n    var r = rect.slice(0);\n    if (rect[0] > rect[2]) {\n      r[0] = rect[2];\n      r[2] = rect[0];\n    }\n    if (rect[1] > rect[3]) {\n      r[1] = rect[3];\n      r[3] = rect[1];\n    }\n    return r;\n  };\n  Util.intersect = function Util_intersect(rect1, rect2) {\n    function compare(a, b) {\n      return a - b;\n    }\n    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),\n        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),\n        result = [];\n    rect1 = Util.normalizeRect(rect1);\n    rect2 = Util.normalizeRect(rect2);\n    if (orderedX[0] === rect1[0] && orderedX[1] === rect2[0] || orderedX[0] === rect2[0] && orderedX[1] === rect1[0]) {\n      result[0] = orderedX[1];\n      result[2] = orderedX[2];\n    } else {\n      return false;\n    }\n    if (orderedY[0] === rect1[1] && orderedY[1] === rect2[1] || orderedY[0] === rect2[1] && orderedY[1] === rect1[1]) {\n      result[1] = orderedY[1];\n      result[3] = orderedY[2];\n    } else {\n      return false;\n    }\n    return result;\n  };\n  Util.sign = function Util_sign(num) {\n    return num < 0 ? -1 : 1;\n  };\n  var ROMAN_NUMBER_MAP = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'];\n  Util.toRoman = function Util_toRoman(number, lowerCase) {\n    assert(isInt(number) && number > 0, 'The number should be a positive integer.');\n    var pos,\n        romanBuf = [];\n    while (number >= 1000) {\n      number -= 1000;\n      romanBuf.push('M');\n    }\n    pos = number / 100 | 0;\n    number %= 100;\n    romanBuf.push(ROMAN_NUMBER_MAP[pos]);\n    pos = number / 10 | 0;\n    number %= 10;\n    romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]);\n    romanBuf.push(ROMAN_NUMBER_MAP[20 + number]);\n    var romanStr = romanBuf.join('');\n    return lowerCase ? romanStr.toLowerCase() : romanStr;\n  };\n  Util.appendToArray = function Util_appendToArray(arr1, arr2) {\n    Array.prototype.push.apply(arr1, arr2);\n  };\n  Util.prependToArray = function Util_prependToArray(arr1, arr2) {\n    Array.prototype.unshift.apply(arr1, arr2);\n  };\n  Util.extendObj = function extendObj(obj1, obj2) {\n    for (var key in obj2) {\n      obj1[key] = obj2[key];\n    }\n  };\n  Util.getInheritableProperty = function Util_getInheritableProperty(dict, name, getArray) {\n    while (dict && !dict.has(name)) {\n      dict = dict.get('Parent');\n    }\n    if (!dict) {\n      return null;\n    }\n    return getArray ? dict.getArray(name) : dict.get(name);\n  };\n  Util.inherit = function Util_inherit(sub, base, prototype) {\n    sub.prototype = Object.create(base.prototype);\n    sub.prototype.constructor = sub;\n    for (var prop in prototype) {\n      sub.prototype[prop] = prototype[prop];\n    }\n  };\n  Util.loadScript = function Util_loadScript(src, callback) {\n    var script = document.createElement('script');\n    var loaded = false;\n    script.setAttribute('src', src);\n    if (callback) {\n      script.onload = function () {\n        if (!loaded) {\n          callback();\n        }\n        loaded = true;\n      };\n    }\n    document.getElementsByTagName('head')[0].appendChild(script);\n  };\n  return Util;\n}();\nvar PageViewport = function PageViewportClosure() {\n  function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) {\n    this.viewBox = viewBox;\n    this.scale = scale;\n    this.rotation = rotation;\n    this.offsetX = offsetX;\n    this.offsetY = offsetY;\n    var centerX = (viewBox[2] + viewBox[0]) / 2;\n    var centerY = (viewBox[3] + viewBox[1]) / 2;\n    var rotateA, rotateB, rotateC, rotateD;\n    rotation = rotation % 360;\n    rotation = rotation < 0 ? rotation + 360 : rotation;\n    switch (rotation) {\n      case 180:\n        rotateA = -1;\n        rotateB = 0;\n        rotateC = 0;\n        rotateD = 1;\n        break;\n      case 90:\n        rotateA = 0;\n        rotateB = 1;\n        rotateC = 1;\n        rotateD = 0;\n        break;\n      case 270:\n        rotateA = 0;\n        rotateB = -1;\n        rotateC = -1;\n        rotateD = 0;\n        break;\n      default:\n        rotateA = 1;\n        rotateB = 0;\n        rotateC = 0;\n        rotateD = -1;\n        break;\n    }\n    if (dontFlip) {\n      rotateC = -rotateC;\n      rotateD = -rotateD;\n    }\n    var offsetCanvasX, offsetCanvasY;\n    var width, height;\n    if (rotateA === 0) {\n      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;\n      width = Math.abs(viewBox[3] - viewBox[1]) * scale;\n      height = Math.abs(viewBox[2] - viewBox[0]) * scale;\n    } else {\n      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;\n      width = Math.abs(viewBox[2] - viewBox[0]) * scale;\n      height = Math.abs(viewBox[3] - viewBox[1]) * scale;\n    }\n    this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY];\n    this.width = width;\n    this.height = height;\n    this.fontScale = scale;\n  }\n  PageViewport.prototype = {\n    clone: function PageViewPort_clone(args) {\n      args = args || {};\n      var scale = 'scale' in args ? args.scale : this.scale;\n      var rotation = 'rotation' in args ? args.rotation : this.rotation;\n      return new PageViewport(this.viewBox.slice(), scale, rotation, this.offsetX, this.offsetY, args.dontFlip);\n    },\n    convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {\n      return Util.applyTransform([x, y], this.transform);\n    },\n    convertToViewportRectangle: function PageViewport_convertToViewportRectangle(rect) {\n      var tl = Util.applyTransform([rect[0], rect[1]], this.transform);\n      var br = Util.applyTransform([rect[2], rect[3]], this.transform);\n      return [tl[0], tl[1], br[0], br[1]];\n    },\n    convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {\n      return Util.applyInverseTransform([x, y], this.transform);\n    }\n  };\n  return PageViewport;\n}();\nvar PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC];\nfunction stringToPDFString(str) {\n  var i,\n      n = str.length,\n      strBuf = [];\n  if (str[0] === '\\xFE' && str[1] === '\\xFF') {\n    for (i = 2; i < n; i += 2) {\n      strBuf.push(String.fromCharCode(str.charCodeAt(i) << 8 | str.charCodeAt(i + 1)));\n    }\n  } else {\n    for (i = 0; i < n; ++i) {\n      var code = PDFStringTranslateTable[str.charCodeAt(i)];\n      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));\n    }\n  }\n  return strBuf.join('');\n}\nfunction stringToUTF8String(str) {\n  return decodeURIComponent(escape(str));\n}\nfunction utf8StringToString(str) {\n  return unescape(encodeURIComponent(str));\n}\nfunction isEmptyObj(obj) {\n  for (var key in obj) {\n    return false;\n  }\n  return true;\n}\nfunction isBool(v) {\n  return typeof v === 'boolean';\n}\nfunction isInt(v) {\n  return typeof v === 'number' && (v | 0) === v;\n}\nfunction isNum(v) {\n  return typeof v === 'number';\n}\nfunction isString(v) {\n  return typeof v === 'string';\n}\nfunction isArray(v) {\n  return v instanceof Array;\n}\nfunction isArrayBuffer(v) {\n  return (typeof v === 'undefined' ? 'undefined' : _typeof(v)) === 'object' && v !== null && v.byteLength !== undefined;\n}\nfunction isSpace(ch) {\n  return ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A;\n}\nfunction isNodeJS() {\n  return (typeof process === 'undefined' ? 'undefined' : _typeof(process)) === 'object' && process + '' === '[object process]';\n}\nfunction createPromiseCapability() {\n  var capability = {};\n  capability.promise = new Promise(function (resolve, reject) {\n    capability.resolve = resolve;\n    capability.reject = reject;\n  });\n  return capability;\n}\nvar StatTimer = function StatTimerClosure() {\n  function rpad(str, pad, length) {\n    while (str.length < length) {\n      str += pad;\n    }\n    return str;\n  }\n  function StatTimer() {\n    this.started = Object.create(null);\n    this.times = [];\n    this.enabled = true;\n  }\n  StatTimer.prototype = {\n    time: function StatTimer_time(name) {\n      if (!this.enabled) {\n        return;\n      }\n      if (name in this.started) {\n        warn('Timer is already running for ' + name);\n      }\n      this.started[name] = Date.now();\n    },\n    timeEnd: function StatTimer_timeEnd(name) {\n      if (!this.enabled) {\n        return;\n      }\n      if (!(name in this.started)) {\n        warn('Timer has not been started for ' + name);\n      }\n      this.times.push({\n        'name': name,\n        'start': this.started[name],\n        'end': Date.now()\n      });\n      delete this.started[name];\n    },\n    toString: function StatTimer_toString() {\n      var i, ii;\n      var times = this.times;\n      var out = '';\n      var longest = 0;\n      for (i = 0, ii = times.length; i < ii; ++i) {\n        var name = times[i]['name'];\n        if (name.length > longest) {\n          longest = name.length;\n        }\n      }\n      for (i = 0, ii = times.length; i < ii; ++i) {\n        var span = times[i];\n        var duration = span.end - span.start;\n        out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\\n';\n      }\n      return out;\n    }\n  };\n  return StatTimer;\n}();\nvar createBlob = function createBlob(data, contentType) {\n  if (typeof Blob !== 'undefined') {\n    return new Blob([data], { type: contentType });\n  }\n  throw new Error('The \"Blob\" constructor is not supported.');\n};\nvar createObjectURL = function createObjectURLClosure() {\n  var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n  return function createObjectURL(data, contentType) {\n    var forceDataSchema = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    if (!forceDataSchema && URL.createObjectURL) {\n      var blob = createBlob(data, contentType);\n      return URL.createObjectURL(blob);\n    }\n    var buffer = 'data:' + contentType + ';base64,';\n    for (var i = 0, ii = data.length; i < ii; i += 3) {\n      var b1 = data[i] & 0xFF;\n      var b2 = data[i + 1] & 0xFF;\n      var b3 = data[i + 2] & 0xFF;\n      var d1 = b1 >> 2,\n          d2 = (b1 & 3) << 4 | b2 >> 4;\n      var d3 = i + 1 < ii ? (b2 & 0xF) << 2 | b3 >> 6 : 64;\n      var d4 = i + 2 < ii ? b3 & 0x3F : 64;\n      buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];\n    }\n    return buffer;\n  };\n}();\nfunction resolveCall(fn, args) {\n  var thisArg = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n  if (!fn) {\n    return Promise.resolve(undefined);\n  }\n  return new Promise(function (resolve, reject) {\n    resolve(fn.apply(thisArg, args));\n  });\n}\nfunction wrapReason(reason) {\n  if ((typeof reason === 'undefined' ? 'undefined' : _typeof(reason)) !== 'object') {\n    return reason;\n  }\n  switch (reason.name) {\n    case 'AbortException':\n      return new AbortException(reason.message);\n    case 'MissingPDFException':\n      return new MissingPDFException(reason.message);\n    case 'UnexpectedResponseException':\n      return new UnexpectedResponseException(reason.message, reason.status);\n    default:\n      return new UnknownErrorException(reason.message, reason.details);\n  }\n}\nfunction resolveOrReject(capability, success, reason) {\n  if (success) {\n    capability.resolve();\n  } else {\n    capability.reject(reason);\n  }\n}\nfunction finalize(promise) {\n  return Promise.resolve(promise).catch(function () {});\n}\nfunction MessageHandler(sourceName, targetName, comObj) {\n  var _this = this;\n\n  this.sourceName = sourceName;\n  this.targetName = targetName;\n  this.comObj = comObj;\n  this.callbackId = 1;\n  this.streamId = 1;\n  this.postMessageTransfers = true;\n  this.streamSinks = Object.create(null);\n  this.streamControllers = Object.create(null);\n  var callbacksCapabilities = this.callbacksCapabilities = Object.create(null);\n  var ah = this.actionHandler = Object.create(null);\n  this._onComObjOnMessage = function (event) {\n    var data = event.data;\n    if (data.targetName !== _this.sourceName) {\n      return;\n    }\n    if (data.stream) {\n      _this._processStreamMessage(data);\n    } else if (data.isReply) {\n      var callbackId = data.callbackId;\n      if (data.callbackId in callbacksCapabilities) {\n        var callback = callbacksCapabilities[callbackId];\n        delete callbacksCapabilities[callbackId];\n        if ('error' in data) {\n          callback.reject(wrapReason(data.error));\n        } else {\n          callback.resolve(data.data);\n        }\n      } else {\n        throw new Error('Cannot resolve callback ' + callbackId);\n      }\n    } else if (data.action in ah) {\n      var action = ah[data.action];\n      if (data.callbackId) {\n        var _sourceName = _this.sourceName;\n        var _targetName = data.sourceName;\n        Promise.resolve().then(function () {\n          return action[0].call(action[1], data.data);\n        }).then(function (result) {\n          comObj.postMessage({\n            sourceName: _sourceName,\n            targetName: _targetName,\n            isReply: true,\n            callbackId: data.callbackId,\n            data: result\n          });\n        }, function (reason) {\n          if (reason instanceof Error) {\n            reason = reason + '';\n          }\n          comObj.postMessage({\n            sourceName: _sourceName,\n            targetName: _targetName,\n            isReply: true,\n            callbackId: data.callbackId,\n            error: reason\n          });\n        });\n      } else if (data.streamId) {\n        _this._createStreamSink(data);\n      } else {\n        action[0].call(action[1], data.data);\n      }\n    } else {\n      throw new Error('Unknown action from worker: ' + data.action);\n    }\n  };\n  comObj.addEventListener('message', this._onComObjOnMessage);\n}\nMessageHandler.prototype = {\n  on: function on(actionName, handler, scope) {\n    var ah = this.actionHandler;\n    if (ah[actionName]) {\n      throw new Error('There is already an actionName called \"' + actionName + '\"');\n    }\n    ah[actionName] = [handler, scope];\n  },\n  send: function send(actionName, data, transfers) {\n    var message = {\n      sourceName: this.sourceName,\n      targetName: this.targetName,\n      action: actionName,\n      data: data\n    };\n    this.postMessage(message, transfers);\n  },\n  sendWithPromise: function sendWithPromise(actionName, data, transfers) {\n    var callbackId = this.callbackId++;\n    var message = {\n      sourceName: this.sourceName,\n      targetName: this.targetName,\n      action: actionName,\n      data: data,\n      callbackId: callbackId\n    };\n    var capability = createPromiseCapability();\n    this.callbacksCapabilities[callbackId] = capability;\n    try {\n      this.postMessage(message, transfers);\n    } catch (e) {\n      capability.reject(e);\n    }\n    return capability.promise;\n  },\n  sendWithStream: function sendWithStream(actionName, data, queueingStrategy, transfers) {\n    var _this2 = this;\n\n    var streamId = this.streamId++;\n    var sourceName = this.sourceName;\n    var targetName = this.targetName;\n    return new _streams_polyfill.ReadableStream({\n      start: function start(controller) {\n        var startCapability = createPromiseCapability();\n        _this2.streamControllers[streamId] = {\n          controller: controller,\n          startCall: startCapability,\n          isClosed: false\n        };\n        _this2.postMessage({\n          sourceName: sourceName,\n          targetName: targetName,\n          action: actionName,\n          streamId: streamId,\n          data: data,\n          desiredSize: controller.desiredSize\n        });\n        return startCapability.promise;\n      },\n      pull: function pull(controller) {\n        var pullCapability = createPromiseCapability();\n        _this2.streamControllers[streamId].pullCall = pullCapability;\n        _this2.postMessage({\n          sourceName: sourceName,\n          targetName: targetName,\n          stream: 'pull',\n          streamId: streamId,\n          desiredSize: controller.desiredSize\n        });\n        return pullCapability.promise;\n      },\n      cancel: function cancel(reason) {\n        var cancelCapability = createPromiseCapability();\n        _this2.streamControllers[streamId].cancelCall = cancelCapability;\n        _this2.streamControllers[streamId].isClosed = true;\n        _this2.postMessage({\n          sourceName: sourceName,\n          targetName: targetName,\n          stream: 'cancel',\n          reason: reason,\n          streamId: streamId\n        });\n        return cancelCapability.promise;\n      }\n    }, queueingStrategy);\n  },\n  _createStreamSink: function _createStreamSink(data) {\n    var _this3 = this;\n\n    var self = this;\n    var action = this.actionHandler[data.action];\n    var streamId = data.streamId;\n    var desiredSize = data.desiredSize;\n    var sourceName = this.sourceName;\n    var targetName = data.sourceName;\n    var capability = createPromiseCapability();\n    var sendStreamRequest = function sendStreamRequest(_ref) {\n      var stream = _ref.stream,\n          chunk = _ref.chunk,\n          transfers = _ref.transfers,\n          success = _ref.success,\n          reason = _ref.reason;\n\n      _this3.postMessage({\n        sourceName: sourceName,\n        targetName: targetName,\n        stream: stream,\n        streamId: streamId,\n        chunk: chunk,\n        success: success,\n        reason: reason\n      }, transfers);\n    };\n    var streamSink = {\n      enqueue: function enqueue(chunk) {\n        var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n        var transfers = arguments[2];\n\n        if (this.isCancelled) {\n          return;\n        }\n        var lastDesiredSize = this.desiredSize;\n        this.desiredSize -= size;\n        if (lastDesiredSize > 0 && this.desiredSize <= 0) {\n          this.sinkCapability = createPromiseCapability();\n          this.ready = this.sinkCapability.promise;\n        }\n        sendStreamRequest({\n          stream: 'enqueue',\n          chunk: chunk,\n          transfers: transfers\n        });\n      },\n      close: function close() {\n        if (this.isCancelled) {\n          return;\n        }\n        sendStreamRequest({ stream: 'close' });\n        delete self.streamSinks[streamId];\n      },\n      error: function error(reason) {\n        if (this.isCancelled) {\n          return;\n        }\n        this.isCancelled = true;\n        sendStreamRequest({\n          stream: 'error',\n          reason: reason\n        });\n      },\n\n      sinkCapability: capability,\n      onPull: null,\n      onCancel: null,\n      isCancelled: false,\n      desiredSize: desiredSize,\n      ready: null\n    };\n    streamSink.sinkCapability.resolve();\n    streamSink.ready = streamSink.sinkCapability.promise;\n    this.streamSinks[streamId] = streamSink;\n    resolveCall(action[0], [data.data, streamSink], action[1]).then(function () {\n      sendStreamRequest({\n        stream: 'start_complete',\n        success: true\n      });\n    }, function (reason) {\n      sendStreamRequest({\n        stream: 'start_complete',\n        success: false,\n        reason: reason\n      });\n    });\n  },\n  _processStreamMessage: function _processStreamMessage(data) {\n    var _this4 = this;\n\n    var sourceName = this.sourceName;\n    var targetName = data.sourceName;\n    var streamId = data.streamId;\n    var sendStreamResponse = function sendStreamResponse(_ref2) {\n      var stream = _ref2.stream,\n          success = _ref2.success,\n          reason = _ref2.reason;\n\n      _this4.comObj.postMessage({\n        sourceName: sourceName,\n        targetName: targetName,\n        stream: stream,\n        success: success,\n        streamId: streamId,\n        reason: reason\n      });\n    };\n    var deleteStreamController = function deleteStreamController() {\n      Promise.all([_this4.streamControllers[data.streamId].startCall, _this4.streamControllers[data.streamId].pullCall, _this4.streamControllers[data.streamId].cancelCall].map(function (capability) {\n        return capability && finalize(capability.promise);\n      })).then(function () {\n        delete _this4.streamControllers[data.streamId];\n      });\n    };\n    switch (data.stream) {\n      case 'start_complete':\n        resolveOrReject(this.streamControllers[data.streamId].startCall, data.success, wrapReason(data.reason));\n        break;\n      case 'pull_complete':\n        resolveOrReject(this.streamControllers[data.streamId].pullCall, data.success, wrapReason(data.reason));\n        break;\n      case 'pull':\n        if (!this.streamSinks[data.streamId]) {\n          sendStreamResponse({\n            stream: 'pull_complete',\n            success: true\n          });\n          break;\n        }\n        if (this.streamSinks[data.streamId].desiredSize <= 0 && data.desiredSize > 0) {\n          this.streamSinks[data.streamId].sinkCapability.resolve();\n        }\n        this.streamSinks[data.streamId].desiredSize = data.desiredSize;\n        resolveCall(this.streamSinks[data.streamId].onPull).then(function () {\n          sendStreamResponse({\n            stream: 'pull_complete',\n            success: true\n          });\n        }, function (reason) {\n          sendStreamResponse({\n            stream: 'pull_complete',\n            success: false,\n            reason: reason\n          });\n        });\n        break;\n      case 'enqueue':\n        assert(this.streamControllers[data.streamId], 'enqueue should have stream controller');\n        if (!this.streamControllers[data.streamId].isClosed) {\n          this.streamControllers[data.streamId].controller.enqueue(data.chunk);\n        }\n        break;\n      case 'close':\n        assert(this.streamControllers[data.streamId], 'close should have stream controller');\n        if (this.streamControllers[data.streamId].isClosed) {\n          break;\n        }\n        this.streamControllers[data.streamId].isClosed = true;\n        this.streamControllers[data.streamId].controller.close();\n        deleteStreamController();\n        break;\n      case 'error':\n        assert(this.streamControllers[data.streamId], 'error should have stream controller');\n        this.streamControllers[data.streamId].controller.error(wrapReason(data.reason));\n        deleteStreamController();\n        break;\n      case 'cancel_complete':\n        resolveOrReject(this.streamControllers[data.streamId].cancelCall, data.success, wrapReason(data.reason));\n        deleteStreamController();\n        break;\n      case 'cancel':\n        if (!this.streamSinks[data.streamId]) {\n          break;\n        }\n        resolveCall(this.streamSinks[data.streamId].onCancel, [wrapReason(data.reason)]).then(function () {\n          sendStreamResponse({\n            stream: 'cancel_complete',\n            success: true\n          });\n        }, function (reason) {\n          sendStreamResponse({\n            stream: 'cancel_complete',\n            success: false,\n            reason: reason\n          });\n        });\n        this.streamSinks[data.streamId].sinkCapability.reject(wrapReason(data.reason));\n        this.streamSinks[data.streamId].isCancelled = true;\n        delete this.streamSinks[data.streamId];\n        break;\n      default:\n        throw new Error('Unexpected stream case');\n    }\n  },\n  postMessage: function postMessage(message, transfers) {\n    if (transfers && this.postMessageTransfers) {\n      this.comObj.postMessage(message, transfers);\n    } else {\n      this.comObj.postMessage(message);\n    }\n  },\n  destroy: function destroy() {\n    this.comObj.removeEventListener('message', this._onComObjOnMessage);\n  }\n};\nfunction loadJpegStream(id, imageUrl, objs) {\n  var img = new Image();\n  img.onload = function loadJpegStream_onloadClosure() {\n    objs.resolve(id, img);\n  };\n  img.onerror = function loadJpegStream_onerrorClosure() {\n    objs.resolve(id, null);\n    warn('Error during JPEG image loading');\n  };\n  img.src = imageUrl;\n}\nexports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX;\nexports.IDENTITY_MATRIX = IDENTITY_MATRIX;\nexports.OPS = OPS;\nexports.VERBOSITY_LEVELS = VERBOSITY_LEVELS;\nexports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES;\nexports.AnnotationBorderStyleType = AnnotationBorderStyleType;\nexports.AnnotationFieldFlag = AnnotationFieldFlag;\nexports.AnnotationFlag = AnnotationFlag;\nexports.AnnotationType = AnnotationType;\nexports.FontType = FontType;\nexports.ImageKind = ImageKind;\nexports.CMapCompressionType = CMapCompressionType;\nexports.AbortException = AbortException;\nexports.InvalidPDFException = InvalidPDFException;\nexports.MessageHandler = MessageHandler;\nexports.MissingDataException = MissingDataException;\nexports.MissingPDFException = MissingPDFException;\nexports.NativeImageDecoding = NativeImageDecoding;\nexports.NotImplementedException = NotImplementedException;\nexports.PageViewport = PageViewport;\nexports.PasswordException = PasswordException;\nexports.PasswordResponses = PasswordResponses;\nexports.StatTimer = StatTimer;\nexports.StreamType = StreamType;\nexports.TextRenderingMode = TextRenderingMode;\nexports.UnexpectedResponseException = UnexpectedResponseException;\nexports.UnknownErrorException = UnknownErrorException;\nexports.Util = Util;\nexports.XRefParseException = XRefParseException;\nexports.FormatError = FormatError;\nexports.arrayByteLength = arrayByteLength;\nexports.arraysToBytes = arraysToBytes;\nexports.assert = assert;\nexports.bytesToString = bytesToString;\nexports.createBlob = createBlob;\nexports.createPromiseCapability = createPromiseCapability;\nexports.createObjectURL = createObjectURL;\nexports.deprecated = deprecated;\nexports.getLookupTableFactory = getLookupTableFactory;\nexports.getVerbosityLevel = getVerbosityLevel;\nexports.globalScope = globalScope;\nexports.info = info;\nexports.isArray = isArray;\nexports.isArrayBuffer = isArrayBuffer;\nexports.isBool = isBool;\nexports.isEmptyObj = isEmptyObj;\nexports.isInt = isInt;\nexports.isNum = isNum;\nexports.isString = isString;\nexports.isSpace = isSpace;\nexports.isNodeJS = isNodeJS;\nexports.isSameOrigin = isSameOrigin;\nexports.createValidAbsoluteUrl = createValidAbsoluteUrl;\nexports.isLittleEndian = isLittleEndian;\nexports.isEvalSupported = isEvalSupported;\nexports.loadJpegStream = loadJpegStream;\nexports.log2 = log2;\nexports.readInt8 = readInt8;\nexports.readUint16 = readUint16;\nexports.readUint32 = readUint32;\nexports.removeNullCharacters = removeNullCharacters;\nexports.ReadableStream = _streams_polyfill.ReadableStream;\nexports.setVerbosityLevel = setVerbosityLevel;\nexports.shadow = shadow;\nexports.string32 = string32;\nexports.stringToBytes = stringToBytes;\nexports.stringToPDFString = stringToPDFString;\nexports.stringToUTF8String = stringToUTF8String;\nexports.utf8StringToString = utf8StringToString;\nexports.warn = warn;\nexports.unreachable = unreachable;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.DOMCMapReaderFactory = exports.DOMCanvasFactory = exports.DEFAULT_LINK_REL = exports.getDefaultSetting = exports.LinkTarget = exports.getFilenameFromUrl = exports.isValidUrl = exports.isExternalLinkTargetSet = exports.addLinkAttributes = exports.RenderingCancelledException = exports.CustomStyle = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _util = __w_pdfjs_require__(0);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DEFAULT_LINK_REL = 'noopener noreferrer nofollow';\n\nvar DOMCanvasFactory = function () {\n  function DOMCanvasFactory() {\n    _classCallCheck(this, DOMCanvasFactory);\n  }\n\n  _createClass(DOMCanvasFactory, [{\n    key: 'create',\n    value: function create(width, height) {\n      if (width <= 0 || height <= 0) {\n        throw new Error('invalid canvas size');\n      }\n      var canvas = document.createElement('canvas');\n      var context = canvas.getContext('2d');\n      canvas.width = width;\n      canvas.height = height;\n      return {\n        canvas: canvas,\n        context: context\n      };\n    }\n  }, {\n    key: 'reset',\n    value: function reset(canvasAndContext, width, height) {\n      if (!canvasAndContext.canvas) {\n        throw new Error('canvas is not specified');\n      }\n      if (width <= 0 || height <= 0) {\n        throw new Error('invalid canvas size');\n      }\n      canvasAndContext.canvas.width = width;\n      canvasAndContext.canvas.height = height;\n    }\n  }, {\n    key: 'destroy',\n    value: function destroy(canvasAndContext) {\n      if (!canvasAndContext.canvas) {\n        throw new Error('canvas is not specified');\n      }\n      canvasAndContext.canvas.width = 0;\n      canvasAndContext.canvas.height = 0;\n      canvasAndContext.canvas = null;\n      canvasAndContext.context = null;\n    }\n  }]);\n\n  return DOMCanvasFactory;\n}();\n\nvar DOMCMapReaderFactory = function () {\n  function DOMCMapReaderFactory(_ref) {\n    var _ref$baseUrl = _ref.baseUrl,\n        baseUrl = _ref$baseUrl === undefined ? null : _ref$baseUrl,\n        _ref$isCompressed = _ref.isCompressed,\n        isCompressed = _ref$isCompressed === undefined ? false : _ref$isCompressed;\n\n    _classCallCheck(this, DOMCMapReaderFactory);\n\n    this.baseUrl = baseUrl;\n    this.isCompressed = isCompressed;\n  }\n\n  _createClass(DOMCMapReaderFactory, [{\n    key: 'fetch',\n    value: function fetch(_ref2) {\n      var _this = this;\n\n      var name = _ref2.name;\n\n      if (!name) {\n        return Promise.reject(new Error('CMap name must be specified.'));\n      }\n      return new Promise(function (resolve, reject) {\n        var url = _this.baseUrl + name + (_this.isCompressed ? '.bcmap' : '');\n        var request = new XMLHttpRequest();\n        request.open('GET', url, true);\n        if (_this.isCompressed) {\n          request.responseType = 'arraybuffer';\n        }\n        request.onreadystatechange = function () {\n          if (request.readyState !== XMLHttpRequest.DONE) {\n            return;\n          }\n          if (request.status === 200 || request.status === 0) {\n            var data = void 0;\n            if (_this.isCompressed && request.response) {\n              data = new Uint8Array(request.response);\n            } else if (!_this.isCompressed && request.responseText) {\n              data = (0, _util.stringToBytes)(request.responseText);\n            }\n            if (data) {\n              resolve({\n                cMapData: data,\n                compressionType: _this.isCompressed ? _util.CMapCompressionType.BINARY : _util.CMapCompressionType.NONE\n              });\n              return;\n            }\n          }\n          reject(new Error('Unable to load ' + (_this.isCompressed ? 'binary ' : '') + 'CMap at: ' + url));\n        };\n        request.send(null);\n      });\n    }\n  }]);\n\n  return DOMCMapReaderFactory;\n}();\n\nvar CustomStyle = function CustomStyleClosure() {\n  var prefixes = ['ms', 'Moz', 'Webkit', 'O'];\n  var _cache = Object.create(null);\n  function CustomStyle() {}\n  CustomStyle.getProp = function get(propName, element) {\n    if (arguments.length === 1 && typeof _cache[propName] === 'string') {\n      return _cache[propName];\n    }\n    element = element || document.documentElement;\n    var style = element.style,\n        prefixed,\n        uPropName;\n    if (typeof style[propName] === 'string') {\n      return _cache[propName] = propName;\n    }\n    uPropName = propName.charAt(0).toUpperCase() + propName.slice(1);\n    for (var i = 0, l = prefixes.length; i < l; i++) {\n      prefixed = prefixes[i] + uPropName;\n      if (typeof style[prefixed] === 'string') {\n        return _cache[propName] = prefixed;\n      }\n    }\n    return _cache[propName] = 'undefined';\n  };\n  CustomStyle.setProp = function set(propName, element, str) {\n    var prop = this.getProp(propName);\n    if (prop !== 'undefined') {\n      element.style[prop] = str;\n    }\n  };\n  return CustomStyle;\n}();\nvar RenderingCancelledException = function RenderingCancelledException() {\n  function RenderingCancelledException(msg, type) {\n    this.message = msg;\n    this.type = type;\n  }\n  RenderingCancelledException.prototype = new Error();\n  RenderingCancelledException.prototype.name = 'RenderingCancelledException';\n  RenderingCancelledException.constructor = RenderingCancelledException;\n  return RenderingCancelledException;\n}();\nvar LinkTarget = {\n  NONE: 0,\n  SELF: 1,\n  BLANK: 2,\n  PARENT: 3,\n  TOP: 4\n};\nvar LinkTargetStringMap = ['', '_self', '_blank', '_parent', '_top'];\nfunction addLinkAttributes(link, params) {\n  var url = params && params.url;\n  link.href = link.title = url ? (0, _util.removeNullCharacters)(url) : '';\n  if (url) {\n    var target = params.target;\n    if (typeof target === 'undefined') {\n      target = getDefaultSetting('externalLinkTarget');\n    }\n    link.target = LinkTargetStringMap[target];\n    var rel = params.rel;\n    if (typeof rel === 'undefined') {\n      rel = getDefaultSetting('externalLinkRel');\n    }\n    link.rel = rel;\n  }\n}\nfunction getFilenameFromUrl(url) {\n  var anchor = url.indexOf('#');\n  var query = url.indexOf('?');\n  var end = Math.min(anchor > 0 ? anchor : url.length, query > 0 ? query : url.length);\n  return url.substring(url.lastIndexOf('/', end) + 1, end);\n}\nfunction getDefaultSetting(id) {\n  var globalSettings = _util.globalScope.PDFJS;\n  switch (id) {\n    case 'pdfBug':\n      return globalSettings ? globalSettings.pdfBug : false;\n    case 'disableAutoFetch':\n      return globalSettings ? globalSettings.disableAutoFetch : false;\n    case 'disableStream':\n      return globalSettings ? globalSettings.disableStream : false;\n    case 'disableRange':\n      return globalSettings ? globalSettings.disableRange : false;\n    case 'disableFontFace':\n      return globalSettings ? globalSettings.disableFontFace : false;\n    case 'disableCreateObjectURL':\n      return globalSettings ? globalSettings.disableCreateObjectURL : false;\n    case 'disableWebGL':\n      return globalSettings ? globalSettings.disableWebGL : true;\n    case 'cMapUrl':\n      return globalSettings ? globalSettings.cMapUrl : null;\n    case 'cMapPacked':\n      return globalSettings ? globalSettings.cMapPacked : false;\n    case 'postMessageTransfers':\n      return globalSettings ? globalSettings.postMessageTransfers : true;\n    case 'workerPort':\n      return globalSettings ? globalSettings.workerPort : null;\n    case 'workerSrc':\n      return globalSettings ? globalSettings.workerSrc : null;\n    case 'disableWorker':\n      return globalSettings ? globalSettings.disableWorker : false;\n    case 'maxImageSize':\n      return globalSettings ? globalSettings.maxImageSize : -1;\n    case 'imageResourcesPath':\n      return globalSettings ? globalSettings.imageResourcesPath : '';\n    case 'isEvalSupported':\n      return globalSettings ? globalSettings.isEvalSupported : true;\n    case 'externalLinkTarget':\n      if (!globalSettings) {\n        return LinkTarget.NONE;\n      }\n      switch (globalSettings.externalLinkTarget) {\n        case LinkTarget.NONE:\n        case LinkTarget.SELF:\n        case LinkTarget.BLANK:\n        case LinkTarget.PARENT:\n        case LinkTarget.TOP:\n          return globalSettings.externalLinkTarget;\n      }\n      (0, _util.warn)('PDFJS.externalLinkTarget is invalid: ' + globalSettings.externalLinkTarget);\n      globalSettings.externalLinkTarget = LinkTarget.NONE;\n      return LinkTarget.NONE;\n    case 'externalLinkRel':\n      return globalSettings ? globalSettings.externalLinkRel : DEFAULT_LINK_REL;\n    case 'enableStats':\n      return !!(globalSettings && globalSettings.enableStats);\n    case 'pdfjsNext':\n      return !!(globalSettings && globalSettings.pdfjsNext);\n    default:\n      throw new Error('Unknown default setting: ' + id);\n  }\n}\nfunction isExternalLinkTargetSet() {\n  var externalLinkTarget = getDefaultSetting('externalLinkTarget');\n  switch (externalLinkTarget) {\n    case LinkTarget.NONE:\n      return false;\n    case LinkTarget.SELF:\n    case LinkTarget.BLANK:\n    case LinkTarget.PARENT:\n    case LinkTarget.TOP:\n      return true;\n  }\n}\nfunction isValidUrl(url, allowRelative) {\n  (0, _util.deprecated)('isValidUrl(), please use createValidAbsoluteUrl() instead.');\n  var baseUrl = allowRelative ? 'http://example.com' : null;\n  return (0, _util.createValidAbsoluteUrl)(url, baseUrl) !== null;\n}\nexports.CustomStyle = CustomStyle;\nexports.RenderingCancelledException = RenderingCancelledException;\nexports.addLinkAttributes = addLinkAttributes;\nexports.isExternalLinkTargetSet = isExternalLinkTargetSet;\nexports.isValidUrl = isValidUrl;\nexports.getFilenameFromUrl = getFilenameFromUrl;\nexports.LinkTarget = LinkTarget;\nexports.getDefaultSetting = getDefaultSetting;\nexports.DEFAULT_LINK_REL = DEFAULT_LINK_REL;\nexports.DOMCanvasFactory = DOMCanvasFactory;\nexports.DOMCMapReaderFactory = DOMCMapReaderFactory;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.build = exports.version = exports._UnsupportedManager = exports.setPDFNetworkStreamClass = exports.PDFPageProxy = exports.PDFDocumentProxy = exports.PDFWorker = exports.PDFDataRangeTransport = exports.LoopbackPort = exports.getDocument = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _dom_utils = __w_pdfjs_require__(1);\n\nvar _font_loader = __w_pdfjs_require__(12);\n\nvar _canvas = __w_pdfjs_require__(11);\n\nvar _metadata = __w_pdfjs_require__(6);\n\nvar _transport_stream = __w_pdfjs_require__(14);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DEFAULT_RANGE_CHUNK_SIZE = 65536;\nvar isWorkerDisabled = false;\nvar workerSrc;\nvar isPostMessageTransfersDisabled = false;\nvar pdfjsFilePath = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : null;\nvar fakeWorkerFilesLoader = null;\nvar useRequireEnsure = false;\n{\n  if (typeof window === 'undefined') {\n    isWorkerDisabled = true;\n    if (typeof require.ensure === 'undefined') {\n      require.ensure = require('node-ensure');\n    }\n    useRequireEnsure = true;\n  } else if (typeof require !== 'undefined' && typeof require.ensure === 'function') {\n    useRequireEnsure = true;\n  }\n  if (typeof requirejs !== 'undefined' && requirejs.toUrl) {\n    workerSrc = requirejs.toUrl('pdfjs-dist/build/pdf.worker.js');\n  }\n  var dynamicLoaderSupported = typeof requirejs !== 'undefined' && requirejs.load;\n  fakeWorkerFilesLoader = useRequireEnsure ? function (callback) {\n    require.ensure([], function () {\n      var worker;\n      worker = require('./pdf.worker.js');\n      callback(worker.WorkerMessageHandler);\n    });\n  } : dynamicLoaderSupported ? function (callback) {\n    requirejs(['pdfjs-dist/build/pdf.worker'], function (worker) {\n      callback(worker.WorkerMessageHandler);\n    });\n  } : null;\n}\nvar PDFNetworkStream;\nfunction setPDFNetworkStreamClass(cls) {\n  PDFNetworkStream = cls;\n}\nfunction getDocument(src, pdfDataRangeTransport, passwordCallback, progressCallback) {\n  var task = new PDFDocumentLoadingTask();\n  if (arguments.length > 1) {\n    (0, _util.deprecated)('getDocument is called with pdfDataRangeTransport, ' + 'passwordCallback or progressCallback argument');\n  }\n  if (pdfDataRangeTransport) {\n    if (!(pdfDataRangeTransport instanceof PDFDataRangeTransport)) {\n      pdfDataRangeTransport = Object.create(pdfDataRangeTransport);\n      pdfDataRangeTransport.length = src.length;\n      pdfDataRangeTransport.initialData = src.initialData;\n      if (!pdfDataRangeTransport.abort) {\n        pdfDataRangeTransport.abort = function () {};\n      }\n    }\n    src = Object.create(src);\n    src.range = pdfDataRangeTransport;\n  }\n  task.onPassword = passwordCallback || null;\n  task.onProgress = progressCallback || null;\n  var source;\n  if (typeof src === 'string') {\n    source = { url: src };\n  } else if ((0, _util.isArrayBuffer)(src)) {\n    source = { data: src };\n  } else if (src instanceof PDFDataRangeTransport) {\n    source = { range: src };\n  } else {\n    if ((typeof src === 'undefined' ? 'undefined' : _typeof(src)) !== 'object') {\n      throw new Error('Invalid parameter in getDocument, ' + 'need either Uint8Array, string or a parameter object');\n    }\n    if (!src.url && !src.data && !src.range) {\n      throw new Error('Invalid parameter object: need either .data, .range or .url');\n    }\n    source = src;\n  }\n  var params = {};\n  var rangeTransport = null;\n  var worker = null;\n  var CMapReaderFactory = _dom_utils.DOMCMapReaderFactory;\n  for (var key in source) {\n    if (key === 'url' && typeof window !== 'undefined') {\n      params[key] = new URL(source[key], window.location).href;\n      continue;\n    } else if (key === 'range') {\n      rangeTransport = source[key];\n      continue;\n    } else if (key === 'worker') {\n      worker = source[key];\n      continue;\n    } else if (key === 'data' && !(source[key] instanceof Uint8Array)) {\n      var pdfBytes = source[key];\n      if (typeof pdfBytes === 'string') {\n        params[key] = (0, _util.stringToBytes)(pdfBytes);\n      } else if ((typeof pdfBytes === 'undefined' ? 'undefined' : _typeof(pdfBytes)) === 'object' && pdfBytes !== null && !isNaN(pdfBytes.length)) {\n        params[key] = new Uint8Array(pdfBytes);\n      } else if ((0, _util.isArrayBuffer)(pdfBytes)) {\n        params[key] = new Uint8Array(pdfBytes);\n      } else {\n        throw new Error('Invalid PDF binary data: either typed array, ' + 'string or array-like object is expected in the ' + 'data property.');\n      }\n      continue;\n    } else if (key === 'CMapReaderFactory') {\n      CMapReaderFactory = source[key];\n      continue;\n    }\n    params[key] = source[key];\n  }\n  params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE;\n  params.ignoreErrors = params.stopAtErrors !== true;\n  if (params.disableNativeImageDecoder !== undefined) {\n    (0, _util.deprecated)('parameter disableNativeImageDecoder, ' + 'use nativeImageDecoderSupport instead');\n  }\n  params.nativeImageDecoderSupport = params.nativeImageDecoderSupport || (params.disableNativeImageDecoder === true ? _util.NativeImageDecoding.NONE : _util.NativeImageDecoding.DECODE);\n  if (params.nativeImageDecoderSupport !== _util.NativeImageDecoding.DECODE && params.nativeImageDecoderSupport !== _util.NativeImageDecoding.NONE && params.nativeImageDecoderSupport !== _util.NativeImageDecoding.DISPLAY) {\n    (0, _util.warn)('Invalid parameter nativeImageDecoderSupport: ' + 'need a state of enum {NativeImageDecoding}');\n    params.nativeImageDecoderSupport = _util.NativeImageDecoding.DECODE;\n  }\n  if (!worker) {\n    var workerPort = (0, _dom_utils.getDefaultSetting)('workerPort');\n    worker = workerPort ? PDFWorker.fromPort(workerPort) : new PDFWorker();\n    task._worker = worker;\n  }\n  var docId = task.docId;\n  worker.promise.then(function () {\n    if (task.destroyed) {\n      throw new Error('Loading aborted');\n    }\n    return _fetchDocument(worker, params, rangeTransport, docId).then(function (workerId) {\n      if (task.destroyed) {\n        throw new Error('Loading aborted');\n      }\n      var networkStream = void 0;\n      if (rangeTransport) {\n        networkStream = new _transport_stream.PDFDataTransportStream(params, rangeTransport);\n      } else if (!params.data) {\n        networkStream = new PDFNetworkStream({\n          source: params,\n          disableRange: (0, _dom_utils.getDefaultSetting)('disableRange')\n        });\n      }\n      var messageHandler = new _util.MessageHandler(docId, workerId, worker.port);\n      messageHandler.postMessageTransfers = worker.postMessageTransfers;\n      var transport = new WorkerTransport(messageHandler, task, networkStream, CMapReaderFactory);\n      task._transport = transport;\n      messageHandler.send('Ready', null);\n    });\n  }).catch(task._capability.reject);\n  return task;\n}\nfunction _fetchDocument(worker, source, pdfDataRangeTransport, docId) {\n  if (worker.destroyed) {\n    return Promise.reject(new Error('Worker was destroyed'));\n  }\n  source.disableAutoFetch = (0, _dom_utils.getDefaultSetting)('disableAutoFetch');\n  source.disableStream = (0, _dom_utils.getDefaultSetting)('disableStream');\n  source.chunkedViewerLoading = !!pdfDataRangeTransport;\n  if (pdfDataRangeTransport) {\n    source.length = pdfDataRangeTransport.length;\n    source.initialData = pdfDataRangeTransport.initialData;\n  }\n  return worker.messageHandler.sendWithPromise('GetDocRequest', {\n    docId: docId,\n    source: {\n      data: source.data,\n      url: source.url,\n      password: source.password,\n      disableAutoFetch: source.disableAutoFetch,\n      rangeChunkSize: source.rangeChunkSize,\n      length: source.length\n    },\n    maxImageSize: (0, _dom_utils.getDefaultSetting)('maxImageSize'),\n    disableFontFace: (0, _dom_utils.getDefaultSetting)('disableFontFace'),\n    disableCreateObjectURL: (0, _dom_utils.getDefaultSetting)('disableCreateObjectURL'),\n    postMessageTransfers: (0, _dom_utils.getDefaultSetting)('postMessageTransfers') && !isPostMessageTransfersDisabled,\n    docBaseUrl: source.docBaseUrl,\n    nativeImageDecoderSupport: source.nativeImageDecoderSupport,\n    ignoreErrors: source.ignoreErrors\n  }).then(function (workerId) {\n    if (worker.destroyed) {\n      throw new Error('Worker was destroyed');\n    }\n    return workerId;\n  });\n}\nvar PDFDocumentLoadingTask = function PDFDocumentLoadingTaskClosure() {\n  var nextDocumentId = 0;\n  function PDFDocumentLoadingTask() {\n    this._capability = (0, _util.createPromiseCapability)();\n    this._transport = null;\n    this._worker = null;\n    this.docId = 'd' + nextDocumentId++;\n    this.destroyed = false;\n    this.onPassword = null;\n    this.onProgress = null;\n    this.onUnsupportedFeature = null;\n  }\n  PDFDocumentLoadingTask.prototype = {\n    get promise() {\n      return this._capability.promise;\n    },\n    destroy: function destroy() {\n      var _this = this;\n\n      this.destroyed = true;\n      var transportDestroyed = !this._transport ? Promise.resolve() : this._transport.destroy();\n      return transportDestroyed.then(function () {\n        _this._transport = null;\n        if (_this._worker) {\n          _this._worker.destroy();\n          _this._worker = null;\n        }\n      });\n    },\n\n    then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) {\n      return this.promise.then.apply(this.promise, arguments);\n    }\n  };\n  return PDFDocumentLoadingTask;\n}();\nvar PDFDataRangeTransport = function pdfDataRangeTransportClosure() {\n  function PDFDataRangeTransport(length, initialData) {\n    this.length = length;\n    this.initialData = initialData;\n    this._rangeListeners = [];\n    this._progressListeners = [];\n    this._progressiveReadListeners = [];\n    this._readyCapability = (0, _util.createPromiseCapability)();\n  }\n  PDFDataRangeTransport.prototype = {\n    addRangeListener: function PDFDataRangeTransport_addRangeListener(listener) {\n      this._rangeListeners.push(listener);\n    },\n    addProgressListener: function PDFDataRangeTransport_addProgressListener(listener) {\n      this._progressListeners.push(listener);\n    },\n    addProgressiveReadListener: function PDFDataRangeTransport_addProgressiveReadListener(listener) {\n      this._progressiveReadListeners.push(listener);\n    },\n    onDataRange: function PDFDataRangeTransport_onDataRange(begin, chunk) {\n      var listeners = this._rangeListeners;\n      for (var i = 0, n = listeners.length; i < n; ++i) {\n        listeners[i](begin, chunk);\n      }\n    },\n    onDataProgress: function PDFDataRangeTransport_onDataProgress(loaded) {\n      var _this2 = this;\n\n      this._readyCapability.promise.then(function () {\n        var listeners = _this2._progressListeners;\n        for (var i = 0, n = listeners.length; i < n; ++i) {\n          listeners[i](loaded);\n        }\n      });\n    },\n    onDataProgressiveRead: function PDFDataRangeTransport_onDataProgress(chunk) {\n      var _this3 = this;\n\n      this._readyCapability.promise.then(function () {\n        var listeners = _this3._progressiveReadListeners;\n        for (var i = 0, n = listeners.length; i < n; ++i) {\n          listeners[i](chunk);\n        }\n      });\n    },\n    transportReady: function PDFDataRangeTransport_transportReady() {\n      this._readyCapability.resolve();\n    },\n    requestDataRange: function PDFDataRangeTransport_requestDataRange(begin, end) {\n      throw new Error('Abstract method PDFDataRangeTransport.requestDataRange');\n    },\n    abort: function PDFDataRangeTransport_abort() {}\n  };\n  return PDFDataRangeTransport;\n}();\nvar PDFDocumentProxy = function PDFDocumentProxyClosure() {\n  function PDFDocumentProxy(pdfInfo, transport, loadingTask) {\n    this.pdfInfo = pdfInfo;\n    this.transport = transport;\n    this.loadingTask = loadingTask;\n  }\n  PDFDocumentProxy.prototype = {\n    get numPages() {\n      return this.pdfInfo.numPages;\n    },\n    get fingerprint() {\n      return this.pdfInfo.fingerprint;\n    },\n    getPage: function PDFDocumentProxy_getPage(pageNumber) {\n      return this.transport.getPage(pageNumber);\n    },\n    getPageIndex: function PDFDocumentProxy_getPageIndex(ref) {\n      return this.transport.getPageIndex(ref);\n    },\n    getDestinations: function PDFDocumentProxy_getDestinations() {\n      return this.transport.getDestinations();\n    },\n    getDestination: function PDFDocumentProxy_getDestination(id) {\n      return this.transport.getDestination(id);\n    },\n    getPageLabels: function PDFDocumentProxy_getPageLabels() {\n      return this.transport.getPageLabels();\n    },\n    getPageMode: function getPageMode() {\n      return this.transport.getPageMode();\n    },\n\n    getAttachments: function PDFDocumentProxy_getAttachments() {\n      return this.transport.getAttachments();\n    },\n    getJavaScript: function PDFDocumentProxy_getJavaScript() {\n      return this.transport.getJavaScript();\n    },\n    getOutline: function PDFDocumentProxy_getOutline() {\n      return this.transport.getOutline();\n    },\n    getMetadata: function PDFDocumentProxy_getMetadata() {\n      return this.transport.getMetadata();\n    },\n    getData: function PDFDocumentProxy_getData() {\n      return this.transport.getData();\n    },\n    getDownloadInfo: function PDFDocumentProxy_getDownloadInfo() {\n      return this.transport.downloadInfoCapability.promise;\n    },\n    getStats: function PDFDocumentProxy_getStats() {\n      return this.transport.getStats();\n    },\n    cleanup: function PDFDocumentProxy_cleanup() {\n      this.transport.startCleanup();\n    },\n    destroy: function PDFDocumentProxy_destroy() {\n      return this.loadingTask.destroy();\n    }\n  };\n  return PDFDocumentProxy;\n}();\nvar PDFPageProxy = function PDFPageProxyClosure() {\n  function PDFPageProxy(pageIndex, pageInfo, transport) {\n    this.pageIndex = pageIndex;\n    this.pageInfo = pageInfo;\n    this.transport = transport;\n    this.stats = new _util.StatTimer();\n    this.stats.enabled = (0, _dom_utils.getDefaultSetting)('enableStats');\n    this.commonObjs = transport.commonObjs;\n    this.objs = new PDFObjects();\n    this.cleanupAfterRender = false;\n    this.pendingCleanup = false;\n    this.intentStates = Object.create(null);\n    this.destroyed = false;\n  }\n  PDFPageProxy.prototype = {\n    get pageNumber() {\n      return this.pageIndex + 1;\n    },\n    get rotate() {\n      return this.pageInfo.rotate;\n    },\n    get ref() {\n      return this.pageInfo.ref;\n    },\n    get userUnit() {\n      return this.pageInfo.userUnit;\n    },\n    get view() {\n      return this.pageInfo.view;\n    },\n    getViewport: function PDFPageProxy_getViewport(scale, rotate) {\n      if (arguments.length < 2) {\n        rotate = this.rotate;\n      }\n      return new _util.PageViewport(this.view, scale, rotate, 0, 0);\n    },\n    getAnnotations: function PDFPageProxy_getAnnotations(params) {\n      var intent = params && params.intent || null;\n      if (!this.annotationsPromise || this.annotationsIntent !== intent) {\n        this.annotationsPromise = this.transport.getAnnotations(this.pageIndex, intent);\n        this.annotationsIntent = intent;\n      }\n      return this.annotationsPromise;\n    },\n    render: function PDFPageProxy_render(params) {\n      var _this4 = this;\n\n      var stats = this.stats;\n      stats.time('Overall');\n      this.pendingCleanup = false;\n      var renderingIntent = params.intent === 'print' ? 'print' : 'display';\n      var canvasFactory = params.canvasFactory || new _dom_utils.DOMCanvasFactory();\n      if (!this.intentStates[renderingIntent]) {\n        this.intentStates[renderingIntent] = Object.create(null);\n      }\n      var intentState = this.intentStates[renderingIntent];\n      if (!intentState.displayReadyCapability) {\n        intentState.receivingOperatorList = true;\n        intentState.displayReadyCapability = (0, _util.createPromiseCapability)();\n        intentState.operatorList = {\n          fnArray: [],\n          argsArray: [],\n          lastChunk: false\n        };\n        this.stats.time('Page Request');\n        this.transport.messageHandler.send('RenderPageRequest', {\n          pageIndex: this.pageNumber - 1,\n          intent: renderingIntent,\n          renderInteractiveForms: params.renderInteractiveForms === true\n        });\n      }\n      var complete = function complete(error) {\n        var i = intentState.renderTasks.indexOf(internalRenderTask);\n        if (i >= 0) {\n          intentState.renderTasks.splice(i, 1);\n        }\n        if (_this4.cleanupAfterRender) {\n          _this4.pendingCleanup = true;\n        }\n        _this4._tryCleanup();\n        if (error) {\n          internalRenderTask.capability.reject(error);\n        } else {\n          internalRenderTask.capability.resolve();\n        }\n        stats.timeEnd('Rendering');\n        stats.timeEnd('Overall');\n      };\n      var internalRenderTask = new InternalRenderTask(complete, params, this.objs, this.commonObjs, intentState.operatorList, this.pageNumber, canvasFactory);\n      internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print';\n      if (!intentState.renderTasks) {\n        intentState.renderTasks = [];\n      }\n      intentState.renderTasks.push(internalRenderTask);\n      var renderTask = internalRenderTask.task;\n      if (params.continueCallback) {\n        (0, _util.deprecated)('render is used with continueCallback parameter');\n        renderTask.onContinue = params.continueCallback;\n      }\n      intentState.displayReadyCapability.promise.then(function (transparency) {\n        if (_this4.pendingCleanup) {\n          complete();\n          return;\n        }\n        stats.time('Rendering');\n        internalRenderTask.initializeGraphics(transparency);\n        internalRenderTask.operatorListChanged();\n      }).catch(complete);\n      return renderTask;\n    },\n    getOperatorList: function PDFPageProxy_getOperatorList() {\n      function operatorListChanged() {\n        if (intentState.operatorList.lastChunk) {\n          intentState.opListReadCapability.resolve(intentState.operatorList);\n          var i = intentState.renderTasks.indexOf(opListTask);\n          if (i >= 0) {\n            intentState.renderTasks.splice(i, 1);\n          }\n        }\n      }\n      var renderingIntent = 'oplist';\n      if (!this.intentStates[renderingIntent]) {\n        this.intentStates[renderingIntent] = Object.create(null);\n      }\n      var intentState = this.intentStates[renderingIntent];\n      var opListTask;\n      if (!intentState.opListReadCapability) {\n        opListTask = {};\n        opListTask.operatorListChanged = operatorListChanged;\n        intentState.receivingOperatorList = true;\n        intentState.opListReadCapability = (0, _util.createPromiseCapability)();\n        intentState.renderTasks = [];\n        intentState.renderTasks.push(opListTask);\n        intentState.operatorList = {\n          fnArray: [],\n          argsArray: [],\n          lastChunk: false\n        };\n        this.transport.messageHandler.send('RenderPageRequest', {\n          pageIndex: this.pageIndex,\n          intent: renderingIntent\n        });\n      }\n      return intentState.opListReadCapability.promise;\n    },\n    streamTextContent: function streamTextContent() {\n      var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      var TEXT_CONTENT_CHUNK_SIZE = 100;\n      return this.transport.messageHandler.sendWithStream('GetTextContent', {\n        pageIndex: this.pageNumber - 1,\n        normalizeWhitespace: params.normalizeWhitespace === true,\n        combineTextItems: params.disableCombineTextItems !== true\n      }, {\n        highWaterMark: TEXT_CONTENT_CHUNK_SIZE,\n        size: function size(textContent) {\n          return textContent.items.length;\n        }\n      });\n    },\n\n    getTextContent: function PDFPageProxy_getTextContent(params) {\n      params = params || {};\n      var readableStream = this.streamTextContent(params);\n      return new Promise(function (resolve, reject) {\n        function pump() {\n          reader.read().then(function (_ref) {\n            var value = _ref.value,\n                done = _ref.done;\n\n            if (done) {\n              resolve(textContent);\n              return;\n            }\n            _util.Util.extendObj(textContent.styles, value.styles);\n            _util.Util.appendToArray(textContent.items, value.items);\n            pump();\n          }, reject);\n        }\n        var reader = readableStream.getReader();\n        var textContent = {\n          items: [],\n          styles: Object.create(null)\n        };\n        pump();\n      });\n    },\n    _destroy: function PDFPageProxy_destroy() {\n      this.destroyed = true;\n      this.transport.pageCache[this.pageIndex] = null;\n      var waitOn = [];\n      Object.keys(this.intentStates).forEach(function (intent) {\n        if (intent === 'oplist') {\n          return;\n        }\n        var intentState = this.intentStates[intent];\n        intentState.renderTasks.forEach(function (renderTask) {\n          var renderCompleted = renderTask.capability.promise.catch(function () {});\n          waitOn.push(renderCompleted);\n          renderTask.cancel();\n        });\n      }, this);\n      this.objs.clear();\n      this.annotationsPromise = null;\n      this.pendingCleanup = false;\n      return Promise.all(waitOn);\n    },\n    destroy: function destroy() {\n      (0, _util.deprecated)('page destroy method, use cleanup() instead');\n      this.cleanup();\n    },\n\n    cleanup: function PDFPageProxy_cleanup() {\n      this.pendingCleanup = true;\n      this._tryCleanup();\n    },\n    _tryCleanup: function PDFPageProxy_tryCleanup() {\n      if (!this.pendingCleanup || Object.keys(this.intentStates).some(function (intent) {\n        var intentState = this.intentStates[intent];\n        return intentState.renderTasks.length !== 0 || intentState.receivingOperatorList;\n      }, this)) {\n        return;\n      }\n      Object.keys(this.intentStates).forEach(function (intent) {\n        delete this.intentStates[intent];\n      }, this);\n      this.objs.clear();\n      this.annotationsPromise = null;\n      this.pendingCleanup = false;\n    },\n    _startRenderPage: function PDFPageProxy_startRenderPage(transparency, intent) {\n      var intentState = this.intentStates[intent];\n      if (intentState.displayReadyCapability) {\n        intentState.displayReadyCapability.resolve(transparency);\n      }\n    },\n    _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk, intent) {\n      var intentState = this.intentStates[intent];\n      var i, ii;\n      for (i = 0, ii = operatorListChunk.length; i < ii; i++) {\n        intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);\n        intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]);\n      }\n      intentState.operatorList.lastChunk = operatorListChunk.lastChunk;\n      for (i = 0; i < intentState.renderTasks.length; i++) {\n        intentState.renderTasks[i].operatorListChanged();\n      }\n      if (operatorListChunk.lastChunk) {\n        intentState.receivingOperatorList = false;\n        this._tryCleanup();\n      }\n    }\n  };\n  return PDFPageProxy;\n}();\n\nvar LoopbackPort = function () {\n  function LoopbackPort(defer) {\n    _classCallCheck(this, LoopbackPort);\n\n    this._listeners = [];\n    this._defer = defer;\n    this._deferred = Promise.resolve(undefined);\n  }\n\n  _createClass(LoopbackPort, [{\n    key: 'postMessage',\n    value: function postMessage(obj, transfers) {\n      var _this5 = this;\n\n      function cloneValue(value) {\n        if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) !== 'object' || value === null) {\n          return value;\n        }\n        if (cloned.has(value)) {\n          return cloned.get(value);\n        }\n        var result;\n        var buffer;\n        if ((buffer = value.buffer) && (0, _util.isArrayBuffer)(buffer)) {\n          var transferable = transfers && transfers.indexOf(buffer) >= 0;\n          if (value === buffer) {\n            result = value;\n          } else if (transferable) {\n            result = new value.constructor(buffer, value.byteOffset, value.byteLength);\n          } else {\n            result = new value.constructor(value);\n          }\n          cloned.set(value, result);\n          return result;\n        }\n        result = (0, _util.isArray)(value) ? [] : {};\n        cloned.set(value, result);\n        for (var i in value) {\n          var desc,\n              p = value;\n          while (!(desc = Object.getOwnPropertyDescriptor(p, i))) {\n            p = Object.getPrototypeOf(p);\n          }\n          if (typeof desc.value === 'undefined' || typeof desc.value === 'function') {\n            continue;\n          }\n          result[i] = cloneValue(desc.value);\n        }\n        return result;\n      }\n      if (!this._defer) {\n        this._listeners.forEach(function (listener) {\n          listener.call(this, { data: obj });\n        }, this);\n        return;\n      }\n      var cloned = new WeakMap();\n      var e = { data: cloneValue(obj) };\n      this._deferred.then(function () {\n        _this5._listeners.forEach(function (listener) {\n          listener.call(this, e);\n        }, _this5);\n      });\n    }\n  }, {\n    key: 'addEventListener',\n    value: function addEventListener(name, listener) {\n      this._listeners.push(listener);\n    }\n  }, {\n    key: 'removeEventListener',\n    value: function removeEventListener(name, listener) {\n      var i = this._listeners.indexOf(listener);\n      this._listeners.splice(i, 1);\n    }\n  }, {\n    key: 'terminate',\n    value: function terminate() {\n      this._listeners = [];\n    }\n  }]);\n\n  return LoopbackPort;\n}();\n\nvar PDFWorker = function PDFWorkerClosure() {\n  var nextFakeWorkerId = 0;\n  function getWorkerSrc() {\n    if (typeof workerSrc !== 'undefined') {\n      return workerSrc;\n    }\n    if ((0, _dom_utils.getDefaultSetting)('workerSrc')) {\n      return (0, _dom_utils.getDefaultSetting)('workerSrc');\n    }\n    if (pdfjsFilePath) {\n      return pdfjsFilePath.replace(/(\\.(?:min\\.)?js)(\\?.*)?$/i, '.worker$1$2');\n    }\n    throw new Error('No PDFJS.workerSrc specified');\n  }\n  var fakeWorkerFilesLoadedCapability = void 0;\n  function setupFakeWorkerGlobal() {\n    var WorkerMessageHandler;\n    if (fakeWorkerFilesLoadedCapability) {\n      return fakeWorkerFilesLoadedCapability.promise;\n    }\n    fakeWorkerFilesLoadedCapability = (0, _util.createPromiseCapability)();\n    var loader = fakeWorkerFilesLoader || function (callback) {\n      _util.Util.loadScript(getWorkerSrc(), function () {\n        callback(window.pdfjsDistBuildPdfWorker.WorkerMessageHandler);\n      });\n    };\n    loader(fakeWorkerFilesLoadedCapability.resolve);\n    return fakeWorkerFilesLoadedCapability.promise;\n  }\n  function createCDNWrapper(url) {\n    var wrapper = 'importScripts(\\'' + url + '\\');';\n    return URL.createObjectURL(new Blob([wrapper]));\n  }\n  var pdfWorkerPorts = new WeakMap();\n  function PDFWorker(name, port) {\n    if (port && pdfWorkerPorts.has(port)) {\n      throw new Error('Cannot use more than one PDFWorker per port');\n    }\n    this.name = name;\n    this.destroyed = false;\n    this.postMessageTransfers = true;\n    this._readyCapability = (0, _util.createPromiseCapability)();\n    this._port = null;\n    this._webWorker = null;\n    this._messageHandler = null;\n    if (port) {\n      pdfWorkerPorts.set(port, this);\n      this._initializeFromPort(port);\n      return;\n    }\n    this._initialize();\n  }\n  PDFWorker.prototype = {\n    get promise() {\n      return this._readyCapability.promise;\n    },\n    get port() {\n      return this._port;\n    },\n    get messageHandler() {\n      return this._messageHandler;\n    },\n    _initializeFromPort: function PDFWorker_initializeFromPort(port) {\n      this._port = port;\n      this._messageHandler = new _util.MessageHandler('main', 'worker', port);\n      this._messageHandler.on('ready', function () {});\n      this._readyCapability.resolve();\n    },\n    _initialize: function PDFWorker_initialize() {\n      var _this6 = this;\n\n      if (!isWorkerDisabled && !(0, _dom_utils.getDefaultSetting)('disableWorker') && typeof Worker !== 'undefined') {\n        var workerSrc = getWorkerSrc();\n        try {\n          if (!(0, _util.isSameOrigin)(window.location.href, workerSrc)) {\n            workerSrc = createCDNWrapper(new URL(workerSrc, window.location).href);\n          }\n          var worker = new Worker(workerSrc);\n          var messageHandler = new _util.MessageHandler('main', 'worker', worker);\n          var terminateEarly = function terminateEarly() {\n            worker.removeEventListener('error', onWorkerError);\n            messageHandler.destroy();\n            worker.terminate();\n            if (_this6.destroyed) {\n              _this6._readyCapability.reject(new Error('Worker was destroyed'));\n            } else {\n              _this6._setupFakeWorker();\n            }\n          };\n          var onWorkerError = function onWorkerError() {\n            if (!_this6._webWorker) {\n              terminateEarly();\n            }\n          };\n          worker.addEventListener('error', onWorkerError);\n          messageHandler.on('test', function (data) {\n            worker.removeEventListener('error', onWorkerError);\n            if (_this6.destroyed) {\n              terminateEarly();\n              return;\n            }\n            var supportTypedArray = data && data.supportTypedArray;\n            if (supportTypedArray) {\n              _this6._messageHandler = messageHandler;\n              _this6._port = worker;\n              _this6._webWorker = worker;\n              if (!data.supportTransfers) {\n                _this6.postMessageTransfers = false;\n                isPostMessageTransfersDisabled = true;\n              }\n              _this6._readyCapability.resolve();\n              messageHandler.send('configure', { verbosity: (0, _util.getVerbosityLevel)() });\n            } else {\n              _this6._setupFakeWorker();\n              messageHandler.destroy();\n              worker.terminate();\n            }\n          });\n          messageHandler.on('console_log', function (data) {\n            console.log.apply(console, data);\n          });\n          messageHandler.on('console_error', function (data) {\n            console.error.apply(console, data);\n          });\n          messageHandler.on('ready', function (data) {\n            worker.removeEventListener('error', onWorkerError);\n            if (_this6.destroyed) {\n              terminateEarly();\n              return;\n            }\n            try {\n              sendTest();\n            } catch (e) {\n              _this6._setupFakeWorker();\n            }\n          });\n          var sendTest = function sendTest() {\n            var postMessageTransfers = (0, _dom_utils.getDefaultSetting)('postMessageTransfers') && !isPostMessageTransfersDisabled;\n            var testObj = new Uint8Array([postMessageTransfers ? 255 : 0]);\n            try {\n              messageHandler.send('test', testObj, [testObj.buffer]);\n            } catch (ex) {\n              (0, _util.info)('Cannot use postMessage transfers');\n              testObj[0] = 0;\n              messageHandler.send('test', testObj);\n            }\n          };\n          sendTest();\n          return;\n        } catch (e) {\n          (0, _util.info)('The worker has been disabled.');\n        }\n      }\n      this._setupFakeWorker();\n    },\n    _setupFakeWorker: function PDFWorker_setupFakeWorker() {\n      var _this7 = this;\n\n      if (!isWorkerDisabled && !(0, _dom_utils.getDefaultSetting)('disableWorker')) {\n        (0, _util.warn)('Setting up fake worker.');\n        isWorkerDisabled = true;\n      }\n      setupFakeWorkerGlobal().then(function (WorkerMessageHandler) {\n        if (_this7.destroyed) {\n          _this7._readyCapability.reject(new Error('Worker was destroyed'));\n          return;\n        }\n        var isTypedArraysPresent = Uint8Array !== Float32Array;\n        var port = new LoopbackPort(isTypedArraysPresent);\n        _this7._port = port;\n        var id = 'fake' + nextFakeWorkerId++;\n        var workerHandler = new _util.MessageHandler(id + '_worker', id, port);\n        WorkerMessageHandler.setup(workerHandler, port);\n        var messageHandler = new _util.MessageHandler(id, id + '_worker', port);\n        _this7._messageHandler = messageHandler;\n        _this7._readyCapability.resolve();\n      });\n    },\n    destroy: function PDFWorker_destroy() {\n      this.destroyed = true;\n      if (this._webWorker) {\n        this._webWorker.terminate();\n        this._webWorker = null;\n      }\n      pdfWorkerPorts.delete(this._port);\n      this._port = null;\n      if (this._messageHandler) {\n        this._messageHandler.destroy();\n        this._messageHandler = null;\n      }\n    }\n  };\n  PDFWorker.fromPort = function (port) {\n    if (pdfWorkerPorts.has(port)) {\n      return pdfWorkerPorts.get(port);\n    }\n    return new PDFWorker(null, port);\n  };\n  return PDFWorker;\n}();\nvar WorkerTransport = function WorkerTransportClosure() {\n  function WorkerTransport(messageHandler, loadingTask, networkStream, CMapReaderFactory) {\n    this.messageHandler = messageHandler;\n    this.loadingTask = loadingTask;\n    this.commonObjs = new PDFObjects();\n    this.fontLoader = new _font_loader.FontLoader(loadingTask.docId);\n    this.CMapReaderFactory = new CMapReaderFactory({\n      baseUrl: (0, _dom_utils.getDefaultSetting)('cMapUrl'),\n      isCompressed: (0, _dom_utils.getDefaultSetting)('cMapPacked')\n    });\n    this.destroyed = false;\n    this.destroyCapability = null;\n    this._passwordCapability = null;\n    this._networkStream = networkStream;\n    this._fullReader = null;\n    this._lastProgress = null;\n    this.pageCache = [];\n    this.pagePromises = [];\n    this.downloadInfoCapability = (0, _util.createPromiseCapability)();\n    this.setupMessageHandler();\n  }\n  WorkerTransport.prototype = {\n    destroy: function WorkerTransport_destroy() {\n      var _this8 = this;\n\n      if (this.destroyCapability) {\n        return this.destroyCapability.promise;\n      }\n      this.destroyed = true;\n      this.destroyCapability = (0, _util.createPromiseCapability)();\n      if (this._passwordCapability) {\n        this._passwordCapability.reject(new Error('Worker was destroyed during onPassword callback'));\n      }\n      var waitOn = [];\n      this.pageCache.forEach(function (page) {\n        if (page) {\n          waitOn.push(page._destroy());\n        }\n      });\n      this.pageCache = [];\n      this.pagePromises = [];\n      var terminated = this.messageHandler.sendWithPromise('Terminate', null);\n      waitOn.push(terminated);\n      Promise.all(waitOn).then(function () {\n        _this8.fontLoader.clear();\n        if (_this8._networkStream) {\n          _this8._networkStream.cancelAllRequests();\n        }\n        if (_this8.messageHandler) {\n          _this8.messageHandler.destroy();\n          _this8.messageHandler = null;\n        }\n        _this8.destroyCapability.resolve();\n      }, this.destroyCapability.reject);\n      return this.destroyCapability.promise;\n    },\n    setupMessageHandler: function WorkerTransport_setupMessageHandler() {\n      var messageHandler = this.messageHandler;\n      var loadingTask = this.loadingTask;\n      messageHandler.on('GetReader', function (data, sink) {\n        var _this9 = this;\n\n        (0, _util.assert)(this._networkStream);\n        this._fullReader = this._networkStream.getFullReader();\n        this._fullReader.onProgress = function (evt) {\n          _this9._lastProgress = {\n            loaded: evt.loaded,\n            total: evt.total\n          };\n        };\n        sink.onPull = function () {\n          _this9._fullReader.read().then(function (_ref2) {\n            var value = _ref2.value,\n                done = _ref2.done;\n\n            if (done) {\n              sink.close();\n              return;\n            }\n            (0, _util.assert)((0, _util.isArrayBuffer)(value));\n            sink.enqueue(new Uint8Array(value), 1, [value]);\n          }).catch(function (reason) {\n            sink.error(reason);\n          });\n        };\n        sink.onCancel = function (reason) {\n          _this9._fullReader.cancel(reason);\n        };\n      }, this);\n      messageHandler.on('ReaderHeadersReady', function (data) {\n        var _this10 = this;\n\n        var headersCapability = (0, _util.createPromiseCapability)();\n        var fullReader = this._fullReader;\n        fullReader.headersReady.then(function () {\n          if (!fullReader.isStreamingSupported || !fullReader.isRangeSupported) {\n            if (_this10._lastProgress) {\n              var _loadingTask = _this10.loadingTask;\n              if (_loadingTask.onProgress) {\n                _loadingTask.onProgress(_this10._lastProgress);\n              }\n            }\n            fullReader.onProgress = function (evt) {\n              var loadingTask = _this10.loadingTask;\n              if (loadingTask.onProgress) {\n                loadingTask.onProgress({\n                  loaded: evt.loaded,\n                  total: evt.total\n                });\n              }\n            };\n          }\n          headersCapability.resolve({\n            isStreamingSupported: fullReader.isStreamingSupported,\n            isRangeSupported: fullReader.isRangeSupported,\n            contentLength: fullReader.contentLength\n          });\n        }, headersCapability.reject);\n        return headersCapability.promise;\n      }, this);\n      messageHandler.on('GetRangeReader', function (data, sink) {\n        (0, _util.assert)(this._networkStream);\n        var _rangeReader = this._networkStream.getRangeReader(data.begin, data.end);\n        sink.onPull = function () {\n          _rangeReader.read().then(function (_ref3) {\n            var value = _ref3.value,\n                done = _ref3.done;\n\n            if (done) {\n              sink.close();\n              return;\n            }\n            (0, _util.assert)((0, _util.isArrayBuffer)(value));\n            sink.enqueue(new Uint8Array(value), 1, [value]);\n          }).catch(function (reason) {\n            sink.error(reason);\n          });\n        };\n        sink.onCancel = function (reason) {\n          _rangeReader.cancel(reason);\n        };\n      }, this);\n      messageHandler.on('GetDoc', function transportDoc(data) {\n        var pdfInfo = data.pdfInfo;\n        this.numPages = data.pdfInfo.numPages;\n        var loadingTask = this.loadingTask;\n        var pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask);\n        this.pdfDocument = pdfDocument;\n        loadingTask._capability.resolve(pdfDocument);\n      }, this);\n      messageHandler.on('PasswordRequest', function transportPasswordRequest(exception) {\n        var _this11 = this;\n\n        this._passwordCapability = (0, _util.createPromiseCapability)();\n        if (loadingTask.onPassword) {\n          var updatePassword = function updatePassword(password) {\n            _this11._passwordCapability.resolve({ password: password });\n          };\n          loadingTask.onPassword(updatePassword, exception.code);\n        } else {\n          this._passwordCapability.reject(new _util.PasswordException(exception.message, exception.code));\n        }\n        return this._passwordCapability.promise;\n      }, this);\n      messageHandler.on('PasswordException', function transportPasswordException(exception) {\n        loadingTask._capability.reject(new _util.PasswordException(exception.message, exception.code));\n      }, this);\n      messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) {\n        this.loadingTask._capability.reject(new _util.InvalidPDFException(exception.message));\n      }, this);\n      messageHandler.on('MissingPDF', function transportMissingPDF(exception) {\n        this.loadingTask._capability.reject(new _util.MissingPDFException(exception.message));\n      }, this);\n      messageHandler.on('UnexpectedResponse', function transportUnexpectedResponse(exception) {\n        this.loadingTask._capability.reject(new _util.UnexpectedResponseException(exception.message, exception.status));\n      }, this);\n      messageHandler.on('UnknownError', function transportUnknownError(exception) {\n        this.loadingTask._capability.reject(new _util.UnknownErrorException(exception.message, exception.details));\n      }, this);\n      messageHandler.on('DataLoaded', function transportPage(data) {\n        this.downloadInfoCapability.resolve(data);\n      }, this);\n      messageHandler.on('PDFManagerReady', function transportPage(data) {}, this);\n      messageHandler.on('StartRenderPage', function transportRender(data) {\n        if (this.destroyed) {\n          return;\n        }\n        var page = this.pageCache[data.pageIndex];\n        page.stats.timeEnd('Page Request');\n        page._startRenderPage(data.transparency, data.intent);\n      }, this);\n      messageHandler.on('RenderPageChunk', function transportRender(data) {\n        if (this.destroyed) {\n          return;\n        }\n        var page = this.pageCache[data.pageIndex];\n        page._renderPageChunk(data.operatorList, data.intent);\n      }, this);\n      messageHandler.on('commonobj', function transportObj(data) {\n        var _this12 = this;\n\n        if (this.destroyed) {\n          return;\n        }\n        var id = data[0];\n        var type = data[1];\n        if (this.commonObjs.hasData(id)) {\n          return;\n        }\n        switch (type) {\n          case 'Font':\n            var exportedData = data[2];\n            if ('error' in exportedData) {\n              var exportedError = exportedData.error;\n              (0, _util.warn)('Error during font loading: ' + exportedError);\n              this.commonObjs.resolve(id, exportedError);\n              break;\n            }\n            var fontRegistry = null;\n            if ((0, _dom_utils.getDefaultSetting)('pdfBug') && _util.globalScope.FontInspector && _util.globalScope['FontInspector'].enabled) {\n              fontRegistry = {\n                registerFont: function registerFont(font, url) {\n                  _util.globalScope['FontInspector'].fontAdded(font, url);\n                }\n              };\n            }\n            var font = new _font_loader.FontFaceObject(exportedData, {\n              isEvalSuported: (0, _dom_utils.getDefaultSetting)('isEvalSupported'),\n              disableFontFace: (0, _dom_utils.getDefaultSetting)('disableFontFace'),\n              fontRegistry: fontRegistry\n            });\n            var fontReady = function fontReady(fontObjs) {\n              _this12.commonObjs.resolve(id, font);\n            };\n            this.fontLoader.bind([font], fontReady);\n            break;\n          case 'FontPath':\n            this.commonObjs.resolve(id, data[2]);\n            break;\n          default:\n            throw new Error('Got unknown common object type ' + type);\n        }\n      }, this);\n      messageHandler.on('obj', function transportObj(data) {\n        if (this.destroyed) {\n          return;\n        }\n        var id = data[0];\n        var pageIndex = data[1];\n        var type = data[2];\n        var pageProxy = this.pageCache[pageIndex];\n        var imageData;\n        if (pageProxy.objs.hasData(id)) {\n          return;\n        }\n        switch (type) {\n          case 'JpegStream':\n            imageData = data[3];\n            (0, _util.loadJpegStream)(id, imageData, pageProxy.objs);\n            break;\n          case 'Image':\n            imageData = data[3];\n            pageProxy.objs.resolve(id, imageData);\n            var MAX_IMAGE_SIZE_TO_STORE = 8000000;\n            if (imageData && 'data' in imageData && imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {\n              pageProxy.cleanupAfterRender = true;\n            }\n            break;\n          default:\n            throw new Error('Got unknown object type ' + type);\n        }\n      }, this);\n      messageHandler.on('DocProgress', function transportDocProgress(data) {\n        if (this.destroyed) {\n          return;\n        }\n        var loadingTask = this.loadingTask;\n        if (loadingTask.onProgress) {\n          loadingTask.onProgress({\n            loaded: data.loaded,\n            total: data.total\n          });\n        }\n      }, this);\n      messageHandler.on('PageError', function transportError(data) {\n        if (this.destroyed) {\n          return;\n        }\n        var page = this.pageCache[data.pageNum - 1];\n        var intentState = page.intentStates[data.intent];\n        if (intentState.displayReadyCapability) {\n          intentState.displayReadyCapability.reject(data.error);\n        } else {\n          throw new Error(data.error);\n        }\n        if (intentState.operatorList) {\n          intentState.operatorList.lastChunk = true;\n          for (var i = 0; i < intentState.renderTasks.length; i++) {\n            intentState.renderTasks[i].operatorListChanged();\n          }\n        }\n      }, this);\n      messageHandler.on('UnsupportedFeature', function transportUnsupportedFeature(data) {\n        if (this.destroyed) {\n          return;\n        }\n        var featureId = data.featureId;\n        var loadingTask = this.loadingTask;\n        if (loadingTask.onUnsupportedFeature) {\n          loadingTask.onUnsupportedFeature(featureId);\n        }\n        _UnsupportedManager.notify(featureId);\n      }, this);\n      messageHandler.on('JpegDecode', function (data) {\n        if (this.destroyed) {\n          return Promise.reject(new Error('Worker was destroyed'));\n        }\n        if (typeof document === 'undefined') {\n          return Promise.reject(new Error('\"document\" is not defined.'));\n        }\n        var imageUrl = data[0];\n        var components = data[1];\n        if (components !== 3 && components !== 1) {\n          return Promise.reject(new Error('Only 3 components or 1 component can be returned'));\n        }\n        return new Promise(function (resolve, reject) {\n          var img = new Image();\n          img.onload = function () {\n            var width = img.width;\n            var height = img.height;\n            var size = width * height;\n            var rgbaLength = size * 4;\n            var buf = new Uint8Array(size * components);\n            var tmpCanvas = document.createElement('canvas');\n            tmpCanvas.width = width;\n            tmpCanvas.height = height;\n            var tmpCtx = tmpCanvas.getContext('2d');\n            tmpCtx.drawImage(img, 0, 0);\n            var data = tmpCtx.getImageData(0, 0, width, height).data;\n            var i, j;\n            if (components === 3) {\n              for (i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {\n                buf[j] = data[i];\n                buf[j + 1] = data[i + 1];\n                buf[j + 2] = data[i + 2];\n              }\n            } else if (components === 1) {\n              for (i = 0, j = 0; i < rgbaLength; i += 4, j++) {\n                buf[j] = data[i];\n              }\n            }\n            resolve({\n              data: buf,\n              width: width,\n              height: height\n            });\n          };\n          img.onerror = function () {\n            reject(new Error('JpegDecode failed to load image'));\n          };\n          img.src = imageUrl;\n        });\n      }, this);\n      messageHandler.on('FetchBuiltInCMap', function (data) {\n        if (this.destroyed) {\n          return Promise.reject(new Error('Worker was destroyed'));\n        }\n        return this.CMapReaderFactory.fetch({ name: data.name });\n      }, this);\n    },\n    getData: function WorkerTransport_getData() {\n      return this.messageHandler.sendWithPromise('GetData', null);\n    },\n    getPage: function WorkerTransport_getPage(pageNumber, capability) {\n      var _this13 = this;\n\n      if (!(0, _util.isInt)(pageNumber) || pageNumber <= 0 || pageNumber > this.numPages) {\n        return Promise.reject(new Error('Invalid page request'));\n      }\n      var pageIndex = pageNumber - 1;\n      if (pageIndex in this.pagePromises) {\n        return this.pagePromises[pageIndex];\n      }\n      var promise = this.messageHandler.sendWithPromise('GetPage', { pageIndex: pageIndex }).then(function (pageInfo) {\n        if (_this13.destroyed) {\n          throw new Error('Transport destroyed');\n        }\n        var page = new PDFPageProxy(pageIndex, pageInfo, _this13);\n        _this13.pageCache[pageIndex] = page;\n        return page;\n      });\n      this.pagePromises[pageIndex] = promise;\n      return promise;\n    },\n    getPageIndex: function WorkerTransport_getPageIndexByRef(ref) {\n      return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref }).catch(function (reason) {\n        return Promise.reject(new Error(reason));\n      });\n    },\n    getAnnotations: function WorkerTransport_getAnnotations(pageIndex, intent) {\n      return this.messageHandler.sendWithPromise('GetAnnotations', {\n        pageIndex: pageIndex,\n        intent: intent\n      });\n    },\n    getDestinations: function WorkerTransport_getDestinations() {\n      return this.messageHandler.sendWithPromise('GetDestinations', null);\n    },\n    getDestination: function WorkerTransport_getDestination(id) {\n      return this.messageHandler.sendWithPromise('GetDestination', { id: id });\n    },\n    getPageLabels: function WorkerTransport_getPageLabels() {\n      return this.messageHandler.sendWithPromise('GetPageLabels', null);\n    },\n    getPageMode: function getPageMode() {\n      return this.messageHandler.sendWithPromise('GetPageMode', null);\n    },\n\n    getAttachments: function WorkerTransport_getAttachments() {\n      return this.messageHandler.sendWithPromise('GetAttachments', null);\n    },\n    getJavaScript: function WorkerTransport_getJavaScript() {\n      return this.messageHandler.sendWithPromise('GetJavaScript', null);\n    },\n    getOutline: function WorkerTransport_getOutline() {\n      return this.messageHandler.sendWithPromise('GetOutline', null);\n    },\n    getMetadata: function WorkerTransport_getMetadata() {\n      return this.messageHandler.sendWithPromise('GetMetadata', null).then(function transportMetadata(results) {\n        return {\n          info: results[0],\n          metadata: results[1] ? new _metadata.Metadata(results[1]) : null\n        };\n      });\n    },\n    getStats: function WorkerTransport_getStats() {\n      return this.messageHandler.sendWithPromise('GetStats', null);\n    },\n    startCleanup: function WorkerTransport_startCleanup() {\n      var _this14 = this;\n\n      this.messageHandler.sendWithPromise('Cleanup', null).then(function () {\n        for (var i = 0, ii = _this14.pageCache.length; i < ii; i++) {\n          var page = _this14.pageCache[i];\n          if (page) {\n            page.cleanup();\n          }\n        }\n        _this14.commonObjs.clear();\n        _this14.fontLoader.clear();\n      });\n    }\n  };\n  return WorkerTransport;\n}();\nvar PDFObjects = function PDFObjectsClosure() {\n  function PDFObjects() {\n    this.objs = Object.create(null);\n  }\n  PDFObjects.prototype = {\n    ensureObj: function PDFObjects_ensureObj(objId) {\n      if (this.objs[objId]) {\n        return this.objs[objId];\n      }\n      var obj = {\n        capability: (0, _util.createPromiseCapability)(),\n        data: null,\n        resolved: false\n      };\n      this.objs[objId] = obj;\n      return obj;\n    },\n    get: function PDFObjects_get(objId, callback) {\n      if (callback) {\n        this.ensureObj(objId).capability.promise.then(callback);\n        return null;\n      }\n      var obj = this.objs[objId];\n      if (!obj || !obj.resolved) {\n        throw new Error('Requesting object that isn\\'t resolved yet ' + objId);\n      }\n      return obj.data;\n    },\n    resolve: function PDFObjects_resolve(objId, data) {\n      var obj = this.ensureObj(objId);\n      obj.resolved = true;\n      obj.data = data;\n      obj.capability.resolve(data);\n    },\n    isResolved: function PDFObjects_isResolved(objId) {\n      var objs = this.objs;\n      if (!objs[objId]) {\n        return false;\n      }\n      return objs[objId].resolved;\n    },\n    hasData: function PDFObjects_hasData(objId) {\n      return this.isResolved(objId);\n    },\n    getData: function PDFObjects_getData(objId) {\n      var objs = this.objs;\n      if (!objs[objId] || !objs[objId].resolved) {\n        return null;\n      }\n      return objs[objId].data;\n    },\n    clear: function PDFObjects_clear() {\n      this.objs = Object.create(null);\n    }\n  };\n  return PDFObjects;\n}();\nvar RenderTask = function RenderTaskClosure() {\n  function RenderTask(internalRenderTask) {\n    this._internalRenderTask = internalRenderTask;\n    this.onContinue = null;\n  }\n  RenderTask.prototype = {\n    get promise() {\n      return this._internalRenderTask.capability.promise;\n    },\n    cancel: function RenderTask_cancel() {\n      this._internalRenderTask.cancel();\n    },\n    then: function RenderTask_then(onFulfilled, onRejected) {\n      return this.promise.then.apply(this.promise, arguments);\n    }\n  };\n  return RenderTask;\n}();\nvar InternalRenderTask = function InternalRenderTaskClosure() {\n  var canvasInRendering = new WeakMap();\n  function InternalRenderTask(callback, params, objs, commonObjs, operatorList, pageNumber, canvasFactory) {\n    this.callback = callback;\n    this.params = params;\n    this.objs = objs;\n    this.commonObjs = commonObjs;\n    this.operatorListIdx = null;\n    this.operatorList = operatorList;\n    this.pageNumber = pageNumber;\n    this.canvasFactory = canvasFactory;\n    this.running = false;\n    this.graphicsReadyCallback = null;\n    this.graphicsReady = false;\n    this.useRequestAnimationFrame = false;\n    this.cancelled = false;\n    this.capability = (0, _util.createPromiseCapability)();\n    this.task = new RenderTask(this);\n    this._continueBound = this._continue.bind(this);\n    this._scheduleNextBound = this._scheduleNext.bind(this);\n    this._nextBound = this._next.bind(this);\n    this._canvas = params.canvasContext.canvas;\n  }\n  InternalRenderTask.prototype = {\n    initializeGraphics: function InternalRenderTask_initializeGraphics(transparency) {\n      if (this._canvas) {\n        if (canvasInRendering.has(this._canvas)) {\n          throw new Error('Cannot use the same canvas during multiple render() operations. ' + 'Use different canvas or ensure previous operations were ' + 'cancelled or completed.');\n        }\n        canvasInRendering.set(this._canvas, this);\n      }\n      if (this.cancelled) {\n        return;\n      }\n      if ((0, _dom_utils.getDefaultSetting)('pdfBug') && _util.globalScope.StepperManager && _util.globalScope.StepperManager.enabled) {\n        this.stepper = _util.globalScope.StepperManager.create(this.pageNumber - 1);\n        this.stepper.init(this.operatorList);\n        this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();\n      }\n      var params = this.params;\n      this.gfx = new _canvas.CanvasGraphics(params.canvasContext, this.commonObjs, this.objs, this.canvasFactory, params.imageLayer);\n      this.gfx.beginDrawing({\n        transform: params.transform,\n        viewport: params.viewport,\n        transparency: transparency,\n        background: params.background\n      });\n      this.operatorListIdx = 0;\n      this.graphicsReady = true;\n      if (this.graphicsReadyCallback) {\n        this.graphicsReadyCallback();\n      }\n    },\n    cancel: function InternalRenderTask_cancel() {\n      this.running = false;\n      this.cancelled = true;\n      if (this._canvas) {\n        canvasInRendering.delete(this._canvas);\n      }\n      if ((0, _dom_utils.getDefaultSetting)('pdfjsNext')) {\n        this.callback(new _dom_utils.RenderingCancelledException('Rendering cancelled, page ' + this.pageNumber, 'canvas'));\n      } else {\n        this.callback('cancelled');\n      }\n    },\n    operatorListChanged: function InternalRenderTask_operatorListChanged() {\n      if (!this.graphicsReady) {\n        if (!this.graphicsReadyCallback) {\n          this.graphicsReadyCallback = this._continueBound;\n        }\n        return;\n      }\n      if (this.stepper) {\n        this.stepper.updateOperatorList(this.operatorList);\n      }\n      if (this.running) {\n        return;\n      }\n      this._continue();\n    },\n    _continue: function InternalRenderTask__continue() {\n      this.running = true;\n      if (this.cancelled) {\n        return;\n      }\n      if (this.task.onContinue) {\n        this.task.onContinue(this._scheduleNextBound);\n      } else {\n        this._scheduleNext();\n      }\n    },\n    _scheduleNext: function InternalRenderTask__scheduleNext() {\n      if (this.useRequestAnimationFrame && typeof window !== 'undefined') {\n        window.requestAnimationFrame(this._nextBound);\n      } else {\n        Promise.resolve(undefined).then(this._nextBound);\n      }\n    },\n    _next: function InternalRenderTask__next() {\n      if (this.cancelled) {\n        return;\n      }\n      this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper);\n      if (this.operatorListIdx === this.operatorList.argsArray.length) {\n        this.running = false;\n        if (this.operatorList.lastChunk) {\n          this.gfx.endDrawing();\n          if (this._canvas) {\n            canvasInRendering.delete(this._canvas);\n          }\n          this.callback();\n        }\n      }\n    }\n  };\n  return InternalRenderTask;\n}();\nvar _UnsupportedManager = function UnsupportedManagerClosure() {\n  var listeners = [];\n  return {\n    listen: function listen(cb) {\n      (0, _util.deprecated)('Global UnsupportedManager.listen is used: ' + ' use PDFDocumentLoadingTask.onUnsupportedFeature instead');\n      listeners.push(cb);\n    },\n    notify: function notify(featureId) {\n      for (var i = 0, ii = listeners.length; i < ii; i++) {\n        listeners[i](featureId);\n      }\n    }\n  };\n}();\nvar version, build;\n{\n  exports.version = version = '1.9.426';\n  exports.build = build = '2558a58d';\n}\nexports.getDocument = getDocument;\nexports.LoopbackPort = LoopbackPort;\nexports.PDFDataRangeTransport = PDFDataRangeTransport;\nexports.PDFWorker = PDFWorker;\nexports.PDFDocumentProxy = PDFDocumentProxy;\nexports.PDFPageProxy = PDFPageProxy;\nexports.setPDFNetworkStreamClass = setPDFNetworkStreamClass;\nexports._UnsupportedManager = _UnsupportedManager;\nexports.version = version;\nexports.build = build;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.AnnotationLayer = undefined;\n\nvar _dom_utils = __w_pdfjs_require__(1);\n\nvar _util = __w_pdfjs_require__(0);\n\nfunction AnnotationElementFactory() {}\nAnnotationElementFactory.prototype = {\n  create: function AnnotationElementFactory_create(parameters) {\n    var subtype = parameters.data.annotationType;\n    switch (subtype) {\n      case _util.AnnotationType.LINK:\n        return new LinkAnnotationElement(parameters);\n      case _util.AnnotationType.TEXT:\n        return new TextAnnotationElement(parameters);\n      case _util.AnnotationType.WIDGET:\n        var fieldType = parameters.data.fieldType;\n        switch (fieldType) {\n          case 'Tx':\n            return new TextWidgetAnnotationElement(parameters);\n          case 'Btn':\n            if (parameters.data.radioButton) {\n              return new RadioButtonWidgetAnnotationElement(parameters);\n            } else if (parameters.data.checkBox) {\n              return new CheckboxWidgetAnnotationElement(parameters);\n            }\n            (0, _util.warn)('Unimplemented button widget annotation: pushbutton');\n            break;\n          case 'Ch':\n            return new ChoiceWidgetAnnotationElement(parameters);\n        }\n        return new WidgetAnnotationElement(parameters);\n      case _util.AnnotationType.POPUP:\n        return new PopupAnnotationElement(parameters);\n      case _util.AnnotationType.LINE:\n        return new LineAnnotationElement(parameters);\n      case _util.AnnotationType.HIGHLIGHT:\n        return new HighlightAnnotationElement(parameters);\n      case _util.AnnotationType.UNDERLINE:\n        return new UnderlineAnnotationElement(parameters);\n      case _util.AnnotationType.SQUIGGLY:\n        return new SquigglyAnnotationElement(parameters);\n      case _util.AnnotationType.STRIKEOUT:\n        return new StrikeOutAnnotationElement(parameters);\n      case _util.AnnotationType.FILEATTACHMENT:\n        return new FileAttachmentAnnotationElement(parameters);\n      default:\n        return new AnnotationElement(parameters);\n    }\n  }\n};\nvar AnnotationElement = function AnnotationElementClosure() {\n  function AnnotationElement(parameters, isRenderable, ignoreBorder) {\n    this.isRenderable = isRenderable || false;\n    this.data = parameters.data;\n    this.layer = parameters.layer;\n    this.page = parameters.page;\n    this.viewport = parameters.viewport;\n    this.linkService = parameters.linkService;\n    this.downloadManager = parameters.downloadManager;\n    this.imageResourcesPath = parameters.imageResourcesPath;\n    this.renderInteractiveForms = parameters.renderInteractiveForms;\n    if (isRenderable) {\n      this.container = this._createContainer(ignoreBorder);\n    }\n  }\n  AnnotationElement.prototype = {\n    _createContainer: function AnnotationElement_createContainer(ignoreBorder) {\n      var data = this.data,\n          page = this.page,\n          viewport = this.viewport;\n      var container = document.createElement('section');\n      var width = data.rect[2] - data.rect[0];\n      var height = data.rect[3] - data.rect[1];\n      container.setAttribute('data-annotation-id', data.id);\n      var rect = _util.Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]);\n      _dom_utils.CustomStyle.setProp('transform', container, 'matrix(' + viewport.transform.join(',') + ')');\n      _dom_utils.CustomStyle.setProp('transformOrigin', container, -rect[0] + 'px ' + -rect[1] + 'px');\n      if (!ignoreBorder && data.borderStyle.width > 0) {\n        container.style.borderWidth = data.borderStyle.width + 'px';\n        if (data.borderStyle.style !== _util.AnnotationBorderStyleType.UNDERLINE) {\n          width = width - 2 * data.borderStyle.width;\n          height = height - 2 * data.borderStyle.width;\n        }\n        var horizontalRadius = data.borderStyle.horizontalCornerRadius;\n        var verticalRadius = data.borderStyle.verticalCornerRadius;\n        if (horizontalRadius > 0 || verticalRadius > 0) {\n          var radius = horizontalRadius + 'px / ' + verticalRadius + 'px';\n          _dom_utils.CustomStyle.setProp('borderRadius', container, radius);\n        }\n        switch (data.borderStyle.style) {\n          case _util.AnnotationBorderStyleType.SOLID:\n            container.style.borderStyle = 'solid';\n            break;\n          case _util.AnnotationBorderStyleType.DASHED:\n            container.style.borderStyle = 'dashed';\n            break;\n          case _util.AnnotationBorderStyleType.BEVELED:\n            (0, _util.warn)('Unimplemented border style: beveled');\n            break;\n          case _util.AnnotationBorderStyleType.INSET:\n            (0, _util.warn)('Unimplemented border style: inset');\n            break;\n          case _util.AnnotationBorderStyleType.UNDERLINE:\n            container.style.borderBottomStyle = 'solid';\n            break;\n          default:\n            break;\n        }\n        if (data.color) {\n          container.style.borderColor = _util.Util.makeCssRgb(data.color[0] | 0, data.color[1] | 0, data.color[2] | 0);\n        } else {\n          container.style.borderWidth = 0;\n        }\n      }\n      container.style.left = rect[0] + 'px';\n      container.style.top = rect[1] + 'px';\n      container.style.width = width + 'px';\n      container.style.height = height + 'px';\n      return container;\n    },\n    _createPopup: function AnnotationElement_createPopup(container, trigger, data) {\n      if (!trigger) {\n        trigger = document.createElement('div');\n        trigger.style.height = container.style.height;\n        trigger.style.width = container.style.width;\n        container.appendChild(trigger);\n      }\n      var popupElement = new PopupElement({\n        container: container,\n        trigger: trigger,\n        color: data.color,\n        title: data.title,\n        contents: data.contents,\n        hideWrapper: true\n      });\n      var popup = popupElement.render();\n      popup.style.left = container.style.width;\n      container.appendChild(popup);\n    },\n    render: function AnnotationElement_render() {\n      throw new Error('Abstract method AnnotationElement.render called');\n    }\n  };\n  return AnnotationElement;\n}();\nvar LinkAnnotationElement = function LinkAnnotationElementClosure() {\n  function LinkAnnotationElement(parameters) {\n    AnnotationElement.call(this, parameters, true);\n  }\n  _util.Util.inherit(LinkAnnotationElement, AnnotationElement, {\n    render: function LinkAnnotationElement_render() {\n      this.container.className = 'linkAnnotation';\n      var link = document.createElement('a');\n      (0, _dom_utils.addLinkAttributes)(link, {\n        url: this.data.url,\n        target: this.data.newWindow ? _dom_utils.LinkTarget.BLANK : undefined\n      });\n      if (!this.data.url) {\n        if (this.data.action) {\n          this._bindNamedAction(link, this.data.action);\n        } else {\n          this._bindLink(link, this.data.dest);\n        }\n      }\n      this.container.appendChild(link);\n      return this.container;\n    },\n    _bindLink: function _bindLink(link, destination) {\n      var _this = this;\n\n      link.href = this.linkService.getDestinationHash(destination);\n      link.onclick = function () {\n        if (destination) {\n          _this.linkService.navigateTo(destination);\n        }\n        return false;\n      };\n      if (destination) {\n        link.className = 'internalLink';\n      }\n    },\n    _bindNamedAction: function _bindNamedAction(link, action) {\n      var _this2 = this;\n\n      link.href = this.linkService.getAnchorUrl('');\n      link.onclick = function () {\n        _this2.linkService.executeNamedAction(action);\n        return false;\n      };\n      link.className = 'internalLink';\n    }\n  });\n  return LinkAnnotationElement;\n}();\nvar TextAnnotationElement = function TextAnnotationElementClosure() {\n  function TextAnnotationElement(parameters) {\n    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    AnnotationElement.call(this, parameters, isRenderable);\n  }\n  _util.Util.inherit(TextAnnotationElement, AnnotationElement, {\n    render: function TextAnnotationElement_render() {\n      this.container.className = 'textAnnotation';\n      var image = document.createElement('img');\n      image.style.height = this.container.style.height;\n      image.style.width = this.container.style.width;\n      image.src = this.imageResourcesPath + 'annotation-' + this.data.name.toLowerCase() + '.svg';\n      image.alt = '[{{type}} Annotation]';\n      image.dataset.l10nId = 'text_annotation_type';\n      image.dataset.l10nArgs = JSON.stringify({ type: this.data.name });\n      if (!this.data.hasPopup) {\n        this._createPopup(this.container, image, this.data);\n      }\n      this.container.appendChild(image);\n      return this.container;\n    }\n  });\n  return TextAnnotationElement;\n}();\nvar WidgetAnnotationElement = function WidgetAnnotationElementClosure() {\n  function WidgetAnnotationElement(parameters, isRenderable) {\n    AnnotationElement.call(this, parameters, isRenderable);\n  }\n  _util.Util.inherit(WidgetAnnotationElement, AnnotationElement, {\n    render: function WidgetAnnotationElement_render() {\n      return this.container;\n    }\n  });\n  return WidgetAnnotationElement;\n}();\nvar TextWidgetAnnotationElement = function TextWidgetAnnotationElementClosure() {\n  var TEXT_ALIGNMENT = ['left', 'center', 'right'];\n  function TextWidgetAnnotationElement(parameters) {\n    var isRenderable = parameters.renderInteractiveForms || !parameters.data.hasAppearance && !!parameters.data.fieldValue;\n    WidgetAnnotationElement.call(this, parameters, isRenderable);\n  }\n  _util.Util.inherit(TextWidgetAnnotationElement, WidgetAnnotationElement, {\n    render: function TextWidgetAnnotationElement_render() {\n      this.container.className = 'textWidgetAnnotation';\n      var element = null;\n      if (this.renderInteractiveForms) {\n        if (this.data.multiLine) {\n          element = document.createElement('textarea');\n          element.textContent = this.data.fieldValue;\n        } else {\n          element = document.createElement('input');\n          element.type = 'text';\n          element.setAttribute('value', this.data.fieldValue);\n        }\n        element.disabled = this.data.readOnly;\n        if (this.data.maxLen !== null) {\n          element.maxLength = this.data.maxLen;\n        }\n        if (this.data.comb) {\n          var fieldWidth = this.data.rect[2] - this.data.rect[0];\n          var combWidth = fieldWidth / this.data.maxLen;\n          element.classList.add('comb');\n          element.style.letterSpacing = 'calc(' + combWidth + 'px - 1ch)';\n        }\n      } else {\n        element = document.createElement('div');\n        element.textContent = this.data.fieldValue;\n        element.style.verticalAlign = 'middle';\n        element.style.display = 'table-cell';\n        var font = null;\n        if (this.data.fontRefName) {\n          font = this.page.commonObjs.getData(this.data.fontRefName);\n        }\n        this._setTextStyle(element, font);\n      }\n      if (this.data.textAlignment !== null) {\n        element.style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment];\n      }\n      this.container.appendChild(element);\n      return this.container;\n    },\n    _setTextStyle: function TextWidgetAnnotationElement_setTextStyle(element, font) {\n      var style = element.style;\n      style.fontSize = this.data.fontSize + 'px';\n      style.direction = this.data.fontDirection < 0 ? 'rtl' : 'ltr';\n      if (!font) {\n        return;\n      }\n      style.fontWeight = font.black ? font.bold ? '900' : 'bold' : font.bold ? 'bold' : 'normal';\n      style.fontStyle = font.italic ? 'italic' : 'normal';\n      var fontFamily = font.loadedName ? '\"' + font.loadedName + '\", ' : '';\n      var fallbackName = font.fallbackName || 'Helvetica, sans-serif';\n      style.fontFamily = fontFamily + fallbackName;\n    }\n  });\n  return TextWidgetAnnotationElement;\n}();\nvar CheckboxWidgetAnnotationElement = function CheckboxWidgetAnnotationElementClosure() {\n  function CheckboxWidgetAnnotationElement(parameters) {\n    WidgetAnnotationElement.call(this, parameters, parameters.renderInteractiveForms);\n  }\n  _util.Util.inherit(CheckboxWidgetAnnotationElement, WidgetAnnotationElement, {\n    render: function CheckboxWidgetAnnotationElement_render() {\n      this.container.className = 'buttonWidgetAnnotation checkBox';\n      var element = document.createElement('input');\n      element.disabled = this.data.readOnly;\n      element.type = 'checkbox';\n      if (this.data.fieldValue && this.data.fieldValue !== 'Off') {\n        element.setAttribute('checked', true);\n      }\n      this.container.appendChild(element);\n      return this.container;\n    }\n  });\n  return CheckboxWidgetAnnotationElement;\n}();\nvar RadioButtonWidgetAnnotationElement = function RadioButtonWidgetAnnotationElementClosure() {\n  function RadioButtonWidgetAnnotationElement(parameters) {\n    WidgetAnnotationElement.call(this, parameters, parameters.renderInteractiveForms);\n  }\n  _util.Util.inherit(RadioButtonWidgetAnnotationElement, WidgetAnnotationElement, {\n    render: function RadioButtonWidgetAnnotationElement_render() {\n      this.container.className = 'buttonWidgetAnnotation radioButton';\n      var element = document.createElement('input');\n      element.disabled = this.data.readOnly;\n      element.type = 'radio';\n      element.name = this.data.fieldName;\n      if (this.data.fieldValue === this.data.buttonValue) {\n        element.setAttribute('checked', true);\n      }\n      this.container.appendChild(element);\n      return this.container;\n    }\n  });\n  return RadioButtonWidgetAnnotationElement;\n}();\nvar ChoiceWidgetAnnotationElement = function ChoiceWidgetAnnotationElementClosure() {\n  function ChoiceWidgetAnnotationElement(parameters) {\n    WidgetAnnotationElement.call(this, parameters, parameters.renderInteractiveForms);\n  }\n  _util.Util.inherit(ChoiceWidgetAnnotationElement, WidgetAnnotationElement, {\n    render: function ChoiceWidgetAnnotationElement_render() {\n      this.container.className = 'choiceWidgetAnnotation';\n      var selectElement = document.createElement('select');\n      selectElement.disabled = this.data.readOnly;\n      if (!this.data.combo) {\n        selectElement.size = this.data.options.length;\n        if (this.data.multiSelect) {\n          selectElement.multiple = true;\n        }\n      }\n      for (var i = 0, ii = this.data.options.length; i < ii; i++) {\n        var option = this.data.options[i];\n        var optionElement = document.createElement('option');\n        optionElement.textContent = option.displayValue;\n        optionElement.value = option.exportValue;\n        if (this.data.fieldValue.indexOf(option.displayValue) >= 0) {\n          optionElement.setAttribute('selected', true);\n        }\n        selectElement.appendChild(optionElement);\n      }\n      this.container.appendChild(selectElement);\n      return this.container;\n    }\n  });\n  return ChoiceWidgetAnnotationElement;\n}();\nvar PopupAnnotationElement = function PopupAnnotationElementClosure() {\n  var IGNORE_TYPES = ['Line'];\n  function PopupAnnotationElement(parameters) {\n    var isRenderable = !!(parameters.data.title || parameters.data.contents);\n    AnnotationElement.call(this, parameters, isRenderable);\n  }\n  _util.Util.inherit(PopupAnnotationElement, AnnotationElement, {\n    render: function PopupAnnotationElement_render() {\n      this.container.className = 'popupAnnotation';\n      if (IGNORE_TYPES.indexOf(this.data.parentType) >= 0) {\n        return this.container;\n      }\n      var selector = '[data-annotation-id=\"' + this.data.parentId + '\"]';\n      var parentElement = this.layer.querySelector(selector);\n      if (!parentElement) {\n        return this.container;\n      }\n      var popup = new PopupElement({\n        container: this.container,\n        trigger: parentElement,\n        color: this.data.color,\n        title: this.data.title,\n        contents: this.data.contents\n      });\n      var parentLeft = parseFloat(parentElement.style.left);\n      var parentWidth = parseFloat(parentElement.style.width);\n      _dom_utils.CustomStyle.setProp('transformOrigin', this.container, -(parentLeft + parentWidth) + 'px -' + parentElement.style.top);\n      this.container.style.left = parentLeft + parentWidth + 'px';\n      this.container.appendChild(popup.render());\n      return this.container;\n    }\n  });\n  return PopupAnnotationElement;\n}();\nvar PopupElement = function PopupElementClosure() {\n  var BACKGROUND_ENLIGHT = 0.7;\n  function PopupElement(parameters) {\n    this.container = parameters.container;\n    this.trigger = parameters.trigger;\n    this.color = parameters.color;\n    this.title = parameters.title;\n    this.contents = parameters.contents;\n    this.hideWrapper = parameters.hideWrapper || false;\n    this.pinned = false;\n  }\n  PopupElement.prototype = {\n    render: function PopupElement_render() {\n      var wrapper = document.createElement('div');\n      wrapper.className = 'popupWrapper';\n      this.hideElement = this.hideWrapper ? wrapper : this.container;\n      this.hideElement.setAttribute('hidden', true);\n      var popup = document.createElement('div');\n      popup.className = 'popup';\n      var color = this.color;\n      if (color) {\n        var r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0];\n        var g = BACKGROUND_ENLIGHT * (255 - color[1]) + color[1];\n        var b = BACKGROUND_ENLIGHT * (255 - color[2]) + color[2];\n        popup.style.backgroundColor = _util.Util.makeCssRgb(r | 0, g | 0, b | 0);\n      }\n      var contents = this._formatContents(this.contents);\n      var title = document.createElement('h1');\n      title.textContent = this.title;\n      this.trigger.addEventListener('click', this._toggle.bind(this));\n      this.trigger.addEventListener('mouseover', this._show.bind(this, false));\n      this.trigger.addEventListener('mouseout', this._hide.bind(this, false));\n      popup.addEventListener('click', this._hide.bind(this, true));\n      popup.appendChild(title);\n      popup.appendChild(contents);\n      wrapper.appendChild(popup);\n      return wrapper;\n    },\n    _formatContents: function PopupElement_formatContents(contents) {\n      var p = document.createElement('p');\n      var lines = contents.split(/(?:\\r\\n?|\\n)/);\n      for (var i = 0, ii = lines.length; i < ii; ++i) {\n        var line = lines[i];\n        p.appendChild(document.createTextNode(line));\n        if (i < ii - 1) {\n          p.appendChild(document.createElement('br'));\n        }\n      }\n      return p;\n    },\n    _toggle: function PopupElement_toggle() {\n      if (this.pinned) {\n        this._hide(true);\n      } else {\n        this._show(true);\n      }\n    },\n    _show: function PopupElement_show(pin) {\n      if (pin) {\n        this.pinned = true;\n      }\n      if (this.hideElement.hasAttribute('hidden')) {\n        this.hideElement.removeAttribute('hidden');\n        this.container.style.zIndex += 1;\n      }\n    },\n    _hide: function PopupElement_hide(unpin) {\n      if (unpin) {\n        this.pinned = false;\n      }\n      if (!this.hideElement.hasAttribute('hidden') && !this.pinned) {\n        this.hideElement.setAttribute('hidden', true);\n        this.container.style.zIndex -= 1;\n      }\n    }\n  };\n  return PopupElement;\n}();\nvar LineAnnotationElement = function LineAnnotationElementClosure() {\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  function LineAnnotationElement(parameters) {\n    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    AnnotationElement.call(this, parameters, isRenderable, true);\n  }\n  _util.Util.inherit(LineAnnotationElement, AnnotationElement, {\n    render: function LineAnnotationElement_render() {\n      this.container.className = 'lineAnnotation';\n      var data = this.data;\n      var width = data.rect[2] - data.rect[0];\n      var height = data.rect[3] - data.rect[1];\n      var svg = document.createElementNS(SVG_NS, 'svg:svg');\n      svg.setAttributeNS(null, 'version', '1.1');\n      svg.setAttributeNS(null, 'width', width + 'px');\n      svg.setAttributeNS(null, 'height', height + 'px');\n      svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\n      svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);\n      var line = document.createElementNS(SVG_NS, 'svg:line');\n      line.setAttributeNS(null, 'x1', data.rect[2] - data.lineCoordinates[0]);\n      line.setAttributeNS(null, 'y1', data.rect[3] - data.lineCoordinates[1]);\n      line.setAttributeNS(null, 'x2', data.rect[2] - data.lineCoordinates[2]);\n      line.setAttributeNS(null, 'y2', data.rect[3] - data.lineCoordinates[3]);\n      line.setAttributeNS(null, 'stroke-width', data.borderStyle.width);\n      line.setAttributeNS(null, 'stroke', 'transparent');\n      svg.appendChild(line);\n      this.container.append(svg);\n      this._createPopup(this.container, line, this.data);\n      return this.container;\n    }\n  });\n  return LineAnnotationElement;\n}();\nvar HighlightAnnotationElement = function HighlightAnnotationElementClosure() {\n  function HighlightAnnotationElement(parameters) {\n    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    AnnotationElement.call(this, parameters, isRenderable, true);\n  }\n  _util.Util.inherit(HighlightAnnotationElement, AnnotationElement, {\n    render: function HighlightAnnotationElement_render() {\n      this.container.className = 'highlightAnnotation';\n      if (!this.data.hasPopup) {\n        this._createPopup(this.container, null, this.data);\n      }\n      return this.container;\n    }\n  });\n  return HighlightAnnotationElement;\n}();\nvar UnderlineAnnotationElement = function UnderlineAnnotationElementClosure() {\n  function UnderlineAnnotationElement(parameters) {\n    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    AnnotationElement.call(this, parameters, isRenderable, true);\n  }\n  _util.Util.inherit(UnderlineAnnotationElement, AnnotationElement, {\n    render: function UnderlineAnnotationElement_render() {\n      this.container.className = 'underlineAnnotation';\n      if (!this.data.hasPopup) {\n        this._createPopup(this.container, null, this.data);\n      }\n      return this.container;\n    }\n  });\n  return UnderlineAnnotationElement;\n}();\nvar SquigglyAnnotationElement = function SquigglyAnnotationElementClosure() {\n  function SquigglyAnnotationElement(parameters) {\n    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    AnnotationElement.call(this, parameters, isRenderable, true);\n  }\n  _util.Util.inherit(SquigglyAnnotationElement, AnnotationElement, {\n    render: function SquigglyAnnotationElement_render() {\n      this.container.className = 'squigglyAnnotation';\n      if (!this.data.hasPopup) {\n        this._createPopup(this.container, null, this.data);\n      }\n      return this.container;\n    }\n  });\n  return SquigglyAnnotationElement;\n}();\nvar StrikeOutAnnotationElement = function StrikeOutAnnotationElementClosure() {\n  function StrikeOutAnnotationElement(parameters) {\n    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    AnnotationElement.call(this, parameters, isRenderable, true);\n  }\n  _util.Util.inherit(StrikeOutAnnotationElement, AnnotationElement, {\n    render: function StrikeOutAnnotationElement_render() {\n      this.container.className = 'strikeoutAnnotation';\n      if (!this.data.hasPopup) {\n        this._createPopup(this.container, null, this.data);\n      }\n      return this.container;\n    }\n  });\n  return StrikeOutAnnotationElement;\n}();\nvar FileAttachmentAnnotationElement = function FileAttachmentAnnotationElementClosure() {\n  function FileAttachmentAnnotationElement(parameters) {\n    AnnotationElement.call(this, parameters, true);\n    var file = this.data.file;\n    this.filename = (0, _dom_utils.getFilenameFromUrl)(file.filename);\n    this.content = file.content;\n    this.linkService.onFileAttachmentAnnotation({\n      id: (0, _util.stringToPDFString)(file.filename),\n      filename: file.filename,\n      content: file.content\n    });\n  }\n  _util.Util.inherit(FileAttachmentAnnotationElement, AnnotationElement, {\n    render: function FileAttachmentAnnotationElement_render() {\n      this.container.className = 'fileAttachmentAnnotation';\n      var trigger = document.createElement('div');\n      trigger.style.height = this.container.style.height;\n      trigger.style.width = this.container.style.width;\n      trigger.addEventListener('dblclick', this._download.bind(this));\n      if (!this.data.hasPopup && (this.data.title || this.data.contents)) {\n        this._createPopup(this.container, trigger, this.data);\n      }\n      this.container.appendChild(trigger);\n      return this.container;\n    },\n    _download: function FileAttachmentAnnotationElement_download() {\n      if (!this.downloadManager) {\n        (0, _util.warn)('Download cannot be started due to unavailable download manager');\n        return;\n      }\n      this.downloadManager.downloadData(this.content, this.filename, '');\n    }\n  });\n  return FileAttachmentAnnotationElement;\n}();\nvar AnnotationLayer = function AnnotationLayerClosure() {\n  return {\n    render: function AnnotationLayer_render(parameters) {\n      var annotationElementFactory = new AnnotationElementFactory();\n      for (var i = 0, ii = parameters.annotations.length; i < ii; i++) {\n        var data = parameters.annotations[i];\n        if (!data) {\n          continue;\n        }\n        var element = annotationElementFactory.create({\n          data: data,\n          layer: parameters.div,\n          page: parameters.page,\n          viewport: parameters.viewport,\n          linkService: parameters.linkService,\n          downloadManager: parameters.downloadManager,\n          imageResourcesPath: parameters.imageResourcesPath || (0, _dom_utils.getDefaultSetting)('imageResourcesPath'),\n          renderInteractiveForms: parameters.renderInteractiveForms || false\n        });\n        if (element.isRenderable) {\n          parameters.div.appendChild(element.render());\n        }\n      }\n    },\n    update: function AnnotationLayer_update(parameters) {\n      for (var i = 0, ii = parameters.annotations.length; i < ii; i++) {\n        var data = parameters.annotations[i];\n        var element = parameters.div.querySelector('[data-annotation-id=\"' + data.id + '\"]');\n        if (element) {\n          _dom_utils.CustomStyle.setProp('transform', element, 'matrix(' + parameters.viewport.transform.join(',') + ')');\n        }\n      }\n      parameters.div.removeAttribute('hidden');\n    }\n  };\n}();\nexports.AnnotationLayer = AnnotationLayer;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.SVGGraphics = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar SVGGraphics = function SVGGraphics() {\n  throw new Error('Not implemented: SVGGraphics');\n};\n{\n  var SVG_DEFAULTS = {\n    fontStyle: 'normal',\n    fontWeight: 'normal',\n    fillColor: '#000000'\n  };\n  var convertImgDataToPng = function convertImgDataToPngClosure() {\n    var PNG_HEADER = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);\n    var CHUNK_WRAPPER_SIZE = 12;\n    var crcTable = new Int32Array(256);\n    for (var i = 0; i < 256; i++) {\n      var c = i;\n      for (var h = 0; h < 8; h++) {\n        if (c & 1) {\n          c = 0xedB88320 ^ c >> 1 & 0x7fffffff;\n        } else {\n          c = c >> 1 & 0x7fffffff;\n        }\n      }\n      crcTable[i] = c;\n    }\n    function crc32(data, start, end) {\n      var crc = -1;\n      for (var i = start; i < end; i++) {\n        var a = (crc ^ data[i]) & 0xff;\n        var b = crcTable[a];\n        crc = crc >>> 8 ^ b;\n      }\n      return crc ^ -1;\n    }\n    function writePngChunk(type, body, data, offset) {\n      var p = offset;\n      var len = body.length;\n      data[p] = len >> 24 & 0xff;\n      data[p + 1] = len >> 16 & 0xff;\n      data[p + 2] = len >> 8 & 0xff;\n      data[p + 3] = len & 0xff;\n      p += 4;\n      data[p] = type.charCodeAt(0) & 0xff;\n      data[p + 1] = type.charCodeAt(1) & 0xff;\n      data[p + 2] = type.charCodeAt(2) & 0xff;\n      data[p + 3] = type.charCodeAt(3) & 0xff;\n      p += 4;\n      data.set(body, p);\n      p += body.length;\n      var crc = crc32(data, offset + 4, p);\n      data[p] = crc >> 24 & 0xff;\n      data[p + 1] = crc >> 16 & 0xff;\n      data[p + 2] = crc >> 8 & 0xff;\n      data[p + 3] = crc & 0xff;\n    }\n    function adler32(data, start, end) {\n      var a = 1;\n      var b = 0;\n      for (var i = start; i < end; ++i) {\n        a = (a + (data[i] & 0xff)) % 65521;\n        b = (b + a) % 65521;\n      }\n      return b << 16 | a;\n    }\n    function deflateSync(literals) {\n      if (!(0, _util.isNodeJS)()) {\n        return deflateSyncUncompressed(literals);\n      }\n      try {\n        var input;\n        if (parseInt(process.versions.node) >= 8) {\n          input = literals;\n        } else {\n          input = new Buffer(literals);\n        }\n        var output = require('zlib').deflateSync(input, { level: 9 });\n        return output instanceof Uint8Array ? output : new Uint8Array(output);\n      } catch (e) {\n        (0, _util.warn)('Not compressing PNG because zlib.deflateSync is unavailable: ' + e);\n      }\n      return deflateSyncUncompressed(literals);\n    }\n    function deflateSyncUncompressed(literals) {\n      var len = literals.length;\n      var maxBlockLength = 0xFFFF;\n      var deflateBlocks = Math.ceil(len / maxBlockLength);\n      var idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4);\n      var pi = 0;\n      idat[pi++] = 0x78;\n      idat[pi++] = 0x9c;\n      var pos = 0;\n      while (len > maxBlockLength) {\n        idat[pi++] = 0x00;\n        idat[pi++] = 0xff;\n        idat[pi++] = 0xff;\n        idat[pi++] = 0x00;\n        idat[pi++] = 0x00;\n        idat.set(literals.subarray(pos, pos + maxBlockLength), pi);\n        pi += maxBlockLength;\n        pos += maxBlockLength;\n        len -= maxBlockLength;\n      }\n      idat[pi++] = 0x01;\n      idat[pi++] = len & 0xff;\n      idat[pi++] = len >> 8 & 0xff;\n      idat[pi++] = ~len & 0xffff & 0xff;\n      idat[pi++] = (~len & 0xffff) >> 8 & 0xff;\n      idat.set(literals.subarray(pos), pi);\n      pi += literals.length - pos;\n      var adler = adler32(literals, 0, literals.length);\n      idat[pi++] = adler >> 24 & 0xff;\n      idat[pi++] = adler >> 16 & 0xff;\n      idat[pi++] = adler >> 8 & 0xff;\n      idat[pi++] = adler & 0xff;\n      return idat;\n    }\n    function encode(imgData, kind, forceDataSchema) {\n      var width = imgData.width;\n      var height = imgData.height;\n      var bitDepth, colorType, lineSize;\n      var bytes = imgData.data;\n      switch (kind) {\n        case _util.ImageKind.GRAYSCALE_1BPP:\n          colorType = 0;\n          bitDepth = 1;\n          lineSize = width + 7 >> 3;\n          break;\n        case _util.ImageKind.RGB_24BPP:\n          colorType = 2;\n          bitDepth = 8;\n          lineSize = width * 3;\n          break;\n        case _util.ImageKind.RGBA_32BPP:\n          colorType = 6;\n          bitDepth = 8;\n          lineSize = width * 4;\n          break;\n        default:\n          throw new Error('invalid format');\n      }\n      var literals = new Uint8Array((1 + lineSize) * height);\n      var offsetLiterals = 0,\n          offsetBytes = 0;\n      var y, i;\n      for (y = 0; y < height; ++y) {\n        literals[offsetLiterals++] = 0;\n        literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize), offsetLiterals);\n        offsetBytes += lineSize;\n        offsetLiterals += lineSize;\n      }\n      if (kind === _util.ImageKind.GRAYSCALE_1BPP) {\n        offsetLiterals = 0;\n        for (y = 0; y < height; y++) {\n          offsetLiterals++;\n          for (i = 0; i < lineSize; i++) {\n            literals[offsetLiterals++] ^= 0xFF;\n          }\n        }\n      }\n      var ihdr = new Uint8Array([width >> 24 & 0xff, width >> 16 & 0xff, width >> 8 & 0xff, width & 0xff, height >> 24 & 0xff, height >> 16 & 0xff, height >> 8 & 0xff, height & 0xff, bitDepth, colorType, 0x00, 0x00, 0x00]);\n      var idat = deflateSync(literals);\n      var pngLength = PNG_HEADER.length + CHUNK_WRAPPER_SIZE * 3 + ihdr.length + idat.length;\n      var data = new Uint8Array(pngLength);\n      var offset = 0;\n      data.set(PNG_HEADER, offset);\n      offset += PNG_HEADER.length;\n      writePngChunk('IHDR', ihdr, data, offset);\n      offset += CHUNK_WRAPPER_SIZE + ihdr.length;\n      writePngChunk('IDATA', idat, data, offset);\n      offset += CHUNK_WRAPPER_SIZE + idat.length;\n      writePngChunk('IEND', new Uint8Array(0), data, offset);\n      return (0, _util.createObjectURL)(data, 'image/png', forceDataSchema);\n    }\n    return function convertImgDataToPng(imgData, forceDataSchema) {\n      var kind = imgData.kind === undefined ? _util.ImageKind.GRAYSCALE_1BPP : imgData.kind;\n      return encode(imgData, kind, forceDataSchema);\n    };\n  }();\n  var SVGExtraState = function SVGExtraStateClosure() {\n    function SVGExtraState() {\n      this.fontSizeScale = 1;\n      this.fontWeight = SVG_DEFAULTS.fontWeight;\n      this.fontSize = 0;\n      this.textMatrix = _util.IDENTITY_MATRIX;\n      this.fontMatrix = _util.FONT_IDENTITY_MATRIX;\n      this.leading = 0;\n      this.x = 0;\n      this.y = 0;\n      this.lineX = 0;\n      this.lineY = 0;\n      this.charSpacing = 0;\n      this.wordSpacing = 0;\n      this.textHScale = 1;\n      this.textRise = 0;\n      this.fillColor = SVG_DEFAULTS.fillColor;\n      this.strokeColor = '#000000';\n      this.fillAlpha = 1;\n      this.strokeAlpha = 1;\n      this.lineWidth = 1;\n      this.lineJoin = '';\n      this.lineCap = '';\n      this.miterLimit = 0;\n      this.dashArray = [];\n      this.dashPhase = 0;\n      this.dependencies = [];\n      this.activeClipUrl = null;\n      this.clipGroup = null;\n      this.maskId = '';\n    }\n    SVGExtraState.prototype = {\n      clone: function SVGExtraState_clone() {\n        return Object.create(this);\n      },\n      setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) {\n        this.x = x;\n        this.y = y;\n      }\n    };\n    return SVGExtraState;\n  }();\n  exports.SVGGraphics = SVGGraphics = function SVGGraphicsClosure() {\n    function opListToTree(opList) {\n      var opTree = [];\n      var tmp = [];\n      var opListLen = opList.length;\n      for (var x = 0; x < opListLen; x++) {\n        if (opList[x].fn === 'save') {\n          opTree.push({\n            'fnId': 92,\n            'fn': 'group',\n            'items': []\n          });\n          tmp.push(opTree);\n          opTree = opTree[opTree.length - 1].items;\n          continue;\n        }\n        if (opList[x].fn === 'restore') {\n          opTree = tmp.pop();\n        } else {\n          opTree.push(opList[x]);\n        }\n      }\n      return opTree;\n    }\n    function pf(value) {\n      if (value === (value | 0)) {\n        return value.toString();\n      }\n      var s = value.toFixed(10);\n      var i = s.length - 1;\n      if (s[i] !== '0') {\n        return s;\n      }\n      do {\n        i--;\n      } while (s[i] === '0');\n      return s.substr(0, s[i] === '.' ? i : i + 1);\n    }\n    function pm(m) {\n      if (m[4] === 0 && m[5] === 0) {\n        if (m[1] === 0 && m[2] === 0) {\n          if (m[0] === 1 && m[3] === 1) {\n            return '';\n          }\n          return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')';\n        }\n        if (m[0] === m[3] && m[1] === -m[2]) {\n          var a = Math.acos(m[0]) * 180 / Math.PI;\n          return 'rotate(' + pf(a) + ')';\n        }\n      } else {\n        if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) {\n          return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')';\n        }\n      }\n      return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' + pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')';\n    }\n    function SVGGraphics(commonObjs, objs, forceDataSchema) {\n      this.current = new SVGExtraState();\n      this.transformMatrix = _util.IDENTITY_MATRIX;\n      this.transformStack = [];\n      this.extraStack = [];\n      this.commonObjs = commonObjs;\n      this.objs = objs;\n      this.pendingClip = null;\n      this.pendingEOFill = false;\n      this.embedFonts = false;\n      this.embeddedFonts = Object.create(null);\n      this.cssStyle = null;\n      this.forceDataSchema = !!forceDataSchema;\n    }\n    var NS = 'http://www.w3.org/2000/svg';\n    var XML_NS = 'http://www.w3.org/XML/1998/namespace';\n    var XLINK_NS = 'http://www.w3.org/1999/xlink';\n    var LINE_CAP_STYLES = ['butt', 'round', 'square'];\n    var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];\n    var clipCount = 0;\n    var maskCount = 0;\n    SVGGraphics.prototype = {\n      save: function SVGGraphics_save() {\n        this.transformStack.push(this.transformMatrix);\n        var old = this.current;\n        this.extraStack.push(old);\n        this.current = old.clone();\n      },\n      restore: function SVGGraphics_restore() {\n        this.transformMatrix = this.transformStack.pop();\n        this.current = this.extraStack.pop();\n        this.pendingClip = null;\n        this.tgrp = null;\n      },\n      group: function SVGGraphics_group(items) {\n        this.save();\n        this.executeOpTree(items);\n        this.restore();\n      },\n      loadDependencies: function SVGGraphics_loadDependencies(operatorList) {\n        var _this = this;\n\n        var fnArray = operatorList.fnArray;\n        var fnArrayLen = fnArray.length;\n        var argsArray = operatorList.argsArray;\n        for (var i = 0; i < fnArrayLen; i++) {\n          if (_util.OPS.dependency === fnArray[i]) {\n            var deps = argsArray[i];\n            for (var n = 0, nn = deps.length; n < nn; n++) {\n              var obj = deps[n];\n              var common = obj.substring(0, 2) === 'g_';\n              var promise;\n              if (common) {\n                promise = new Promise(function (resolve) {\n                  _this.commonObjs.get(obj, resolve);\n                });\n              } else {\n                promise = new Promise(function (resolve) {\n                  _this.objs.get(obj, resolve);\n                });\n              }\n              this.current.dependencies.push(promise);\n            }\n          }\n        }\n        return Promise.all(this.current.dependencies);\n      },\n      transform: function SVGGraphics_transform(a, b, c, d, e, f) {\n        var transformMatrix = [a, b, c, d, e, f];\n        this.transformMatrix = _util.Util.transform(this.transformMatrix, transformMatrix);\n        this.tgrp = null;\n      },\n      getSVG: function SVGGraphics_getSVG(operatorList, viewport) {\n        var _this2 = this;\n\n        this.viewport = viewport;\n        var svgElement = this._initialize(viewport);\n        return this.loadDependencies(operatorList).then(function () {\n          _this2.transformMatrix = _util.IDENTITY_MATRIX;\n          var opTree = _this2.convertOpList(operatorList);\n          _this2.executeOpTree(opTree);\n          return svgElement;\n        });\n      },\n      convertOpList: function SVGGraphics_convertOpList(operatorList) {\n        var argsArray = operatorList.argsArray;\n        var fnArray = operatorList.fnArray;\n        var fnArrayLen = fnArray.length;\n        var REVOPS = [];\n        var opList = [];\n        for (var op in _util.OPS) {\n          REVOPS[_util.OPS[op]] = op;\n        }\n        for (var x = 0; x < fnArrayLen; x++) {\n          var fnId = fnArray[x];\n          opList.push({\n            'fnId': fnId,\n            'fn': REVOPS[fnId],\n            'args': argsArray[x]\n          });\n        }\n        return opListToTree(opList);\n      },\n      executeOpTree: function SVGGraphics_executeOpTree(opTree) {\n        var opTreeLen = opTree.length;\n        for (var x = 0; x < opTreeLen; x++) {\n          var fn = opTree[x].fn;\n          var fnId = opTree[x].fnId;\n          var args = opTree[x].args;\n          switch (fnId | 0) {\n            case _util.OPS.beginText:\n              this.beginText();\n              break;\n            case _util.OPS.setLeading:\n              this.setLeading(args);\n              break;\n            case _util.OPS.setLeadingMoveText:\n              this.setLeadingMoveText(args[0], args[1]);\n              break;\n            case _util.OPS.setFont:\n              this.setFont(args);\n              break;\n            case _util.OPS.showText:\n              this.showText(args[0]);\n              break;\n            case _util.OPS.showSpacedText:\n              this.showText(args[0]);\n              break;\n            case _util.OPS.endText:\n              this.endText();\n              break;\n            case _util.OPS.moveText:\n              this.moveText(args[0], args[1]);\n              break;\n            case _util.OPS.setCharSpacing:\n              this.setCharSpacing(args[0]);\n              break;\n            case _util.OPS.setWordSpacing:\n              this.setWordSpacing(args[0]);\n              break;\n            case _util.OPS.setHScale:\n              this.setHScale(args[0]);\n              break;\n            case _util.OPS.setTextMatrix:\n              this.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);\n              break;\n            case _util.OPS.setLineWidth:\n              this.setLineWidth(args[0]);\n              break;\n            case _util.OPS.setLineJoin:\n              this.setLineJoin(args[0]);\n              break;\n            case _util.OPS.setLineCap:\n              this.setLineCap(args[0]);\n              break;\n            case _util.OPS.setMiterLimit:\n              this.setMiterLimit(args[0]);\n              break;\n            case _util.OPS.setFillRGBColor:\n              this.setFillRGBColor(args[0], args[1], args[2]);\n              break;\n            case _util.OPS.setStrokeRGBColor:\n              this.setStrokeRGBColor(args[0], args[1], args[2]);\n              break;\n            case _util.OPS.setDash:\n              this.setDash(args[0], args[1]);\n              break;\n            case _util.OPS.setGState:\n              this.setGState(args[0]);\n              break;\n            case _util.OPS.fill:\n              this.fill();\n              break;\n            case _util.OPS.eoFill:\n              this.eoFill();\n              break;\n            case _util.OPS.stroke:\n              this.stroke();\n              break;\n            case _util.OPS.fillStroke:\n              this.fillStroke();\n              break;\n            case _util.OPS.eoFillStroke:\n              this.eoFillStroke();\n              break;\n            case _util.OPS.clip:\n              this.clip('nonzero');\n              break;\n            case _util.OPS.eoClip:\n              this.clip('evenodd');\n              break;\n            case _util.OPS.paintSolidColorImageMask:\n              this.paintSolidColorImageMask();\n              break;\n            case _util.OPS.paintJpegXObject:\n              this.paintJpegXObject(args[0], args[1], args[2]);\n              break;\n            case _util.OPS.paintImageXObject:\n              this.paintImageXObject(args[0]);\n              break;\n            case _util.OPS.paintInlineImageXObject:\n              this.paintInlineImageXObject(args[0]);\n              break;\n            case _util.OPS.paintImageMaskXObject:\n              this.paintImageMaskXObject(args[0]);\n              break;\n            case _util.OPS.paintFormXObjectBegin:\n              this.paintFormXObjectBegin(args[0], args[1]);\n              break;\n            case _util.OPS.paintFormXObjectEnd:\n              this.paintFormXObjectEnd();\n              break;\n            case _util.OPS.closePath:\n              this.closePath();\n              break;\n            case _util.OPS.closeStroke:\n              this.closeStroke();\n              break;\n            case _util.OPS.closeFillStroke:\n              this.closeFillStroke();\n              break;\n            case _util.OPS.nextLine:\n              this.nextLine();\n              break;\n            case _util.OPS.transform:\n              this.transform(args[0], args[1], args[2], args[3], args[4], args[5]);\n              break;\n            case _util.OPS.constructPath:\n              this.constructPath(args[0], args[1]);\n              break;\n            case _util.OPS.endPath:\n              this.endPath();\n              break;\n            case 92:\n              this.group(opTree[x].items);\n              break;\n            default:\n              (0, _util.warn)('Unimplemented operator ' + fn);\n              break;\n          }\n        }\n      },\n      setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) {\n        this.current.wordSpacing = wordSpacing;\n      },\n      setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) {\n        this.current.charSpacing = charSpacing;\n      },\n      nextLine: function SVGGraphics_nextLine() {\n        this.moveText(0, this.current.leading);\n      },\n      setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) {\n        var current = this.current;\n        this.current.textMatrix = this.current.lineMatrix = [a, b, c, d, e, f];\n        this.current.x = this.current.lineX = 0;\n        this.current.y = this.current.lineY = 0;\n        current.xcoords = [];\n        current.tspan = document.createElementNS(NS, 'svg:tspan');\n        current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);\n        current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px');\n        current.tspan.setAttributeNS(null, 'y', pf(-current.y));\n        current.txtElement = document.createElementNS(NS, 'svg:text');\n        current.txtElement.appendChild(current.tspan);\n      },\n      beginText: function SVGGraphics_beginText() {\n        this.current.x = this.current.lineX = 0;\n        this.current.y = this.current.lineY = 0;\n        this.current.textMatrix = _util.IDENTITY_MATRIX;\n        this.current.lineMatrix = _util.IDENTITY_MATRIX;\n        this.current.tspan = document.createElementNS(NS, 'svg:tspan');\n        this.current.txtElement = document.createElementNS(NS, 'svg:text');\n        this.current.txtgrp = document.createElementNS(NS, 'svg:g');\n        this.current.xcoords = [];\n      },\n      moveText: function SVGGraphics_moveText(x, y) {\n        var current = this.current;\n        this.current.x = this.current.lineX += x;\n        this.current.y = this.current.lineY += y;\n        current.xcoords = [];\n        current.tspan = document.createElementNS(NS, 'svg:tspan');\n        current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);\n        current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px');\n        current.tspan.setAttributeNS(null, 'y', pf(-current.y));\n      },\n      showText: function SVGGraphics_showText(glyphs) {\n        var current = this.current;\n        var font = current.font;\n        var fontSize = current.fontSize;\n        if (fontSize === 0) {\n          return;\n        }\n        var charSpacing = current.charSpacing;\n        var wordSpacing = current.wordSpacing;\n        var fontDirection = current.fontDirection;\n        var textHScale = current.textHScale * fontDirection;\n        var glyphsLength = glyphs.length;\n        var vertical = font.vertical;\n        var widthAdvanceScale = fontSize * current.fontMatrix[0];\n        var x = 0,\n            i;\n        for (i = 0; i < glyphsLength; ++i) {\n          var glyph = glyphs[i];\n          if (glyph === null) {\n            x += fontDirection * wordSpacing;\n            continue;\n          } else if ((0, _util.isNum)(glyph)) {\n            x += -glyph * fontSize * 0.001;\n            continue;\n          }\n          current.xcoords.push(current.x + x * textHScale);\n          var width = glyph.width;\n          var character = glyph.fontChar;\n          var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n          var charWidth = width * widthAdvanceScale + spacing * fontDirection;\n          x += charWidth;\n          current.tspan.textContent += character;\n        }\n        if (vertical) {\n          current.y -= x * textHScale;\n        } else {\n          current.x += x * textHScale;\n        }\n        current.tspan.setAttributeNS(null, 'x', current.xcoords.map(pf).join(' '));\n        current.tspan.setAttributeNS(null, 'y', pf(-current.y));\n        current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);\n        current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px');\n        if (current.fontStyle !== SVG_DEFAULTS.fontStyle) {\n          current.tspan.setAttributeNS(null, 'font-style', current.fontStyle);\n        }\n        if (current.fontWeight !== SVG_DEFAULTS.fontWeight) {\n          current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight);\n        }\n        if (current.fillColor !== SVG_DEFAULTS.fillColor) {\n          current.tspan.setAttributeNS(null, 'fill', current.fillColor);\n        }\n        current.txtElement.setAttributeNS(null, 'transform', pm(current.textMatrix) + ' scale(1, -1)');\n        current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve');\n        current.txtElement.appendChild(current.tspan);\n        current.txtgrp.appendChild(current.txtElement);\n        this._ensureTransformGroup().appendChild(current.txtElement);\n      },\n      setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) {\n        this.setLeading(-y);\n        this.moveText(x, y);\n      },\n      addFontStyle: function SVGGraphics_addFontStyle(fontObj) {\n        if (!this.cssStyle) {\n          this.cssStyle = document.createElementNS(NS, 'svg:style');\n          this.cssStyle.setAttributeNS(null, 'type', 'text/css');\n          this.defs.appendChild(this.cssStyle);\n        }\n        var url = (0, _util.createObjectURL)(fontObj.data, fontObj.mimetype, this.forceDataSchema);\n        this.cssStyle.textContent += '@font-face { font-family: \"' + fontObj.loadedName + '\";' + ' src: url(' + url + '); }\\n';\n      },\n      setFont: function SVGGraphics_setFont(details) {\n        var current = this.current;\n        var fontObj = this.commonObjs.get(details[0]);\n        var size = details[1];\n        this.current.font = fontObj;\n        if (this.embedFonts && fontObj.data && !this.embeddedFonts[fontObj.loadedName]) {\n          this.addFontStyle(fontObj);\n          this.embeddedFonts[fontObj.loadedName] = fontObj;\n        }\n        current.fontMatrix = fontObj.fontMatrix ? fontObj.fontMatrix : _util.FONT_IDENTITY_MATRIX;\n        var bold = fontObj.black ? fontObj.bold ? 'bolder' : 'bold' : fontObj.bold ? 'bold' : 'normal';\n        var italic = fontObj.italic ? 'italic' : 'normal';\n        if (size < 0) {\n          size = -size;\n          current.fontDirection = -1;\n        } else {\n          current.fontDirection = 1;\n        }\n        current.fontSize = size;\n        current.fontFamily = fontObj.loadedName;\n        current.fontWeight = bold;\n        current.fontStyle = italic;\n        current.tspan = document.createElementNS(NS, 'svg:tspan');\n        current.tspan.setAttributeNS(null, 'y', pf(-current.y));\n        current.xcoords = [];\n      },\n      endText: function SVGGraphics_endText() {},\n      setLineWidth: function SVGGraphics_setLineWidth(width) {\n        this.current.lineWidth = width;\n      },\n      setLineCap: function SVGGraphics_setLineCap(style) {\n        this.current.lineCap = LINE_CAP_STYLES[style];\n      },\n      setLineJoin: function SVGGraphics_setLineJoin(style) {\n        this.current.lineJoin = LINE_JOIN_STYLES[style];\n      },\n      setMiterLimit: function SVGGraphics_setMiterLimit(limit) {\n        this.current.miterLimit = limit;\n      },\n      setStrokeAlpha: function SVGGraphics_setStrokeAlpha(strokeAlpha) {\n        this.current.strokeAlpha = strokeAlpha;\n      },\n      setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) {\n        var color = _util.Util.makeCssRgb(r, g, b);\n        this.current.strokeColor = color;\n      },\n      setFillAlpha: function SVGGraphics_setFillAlpha(fillAlpha) {\n        this.current.fillAlpha = fillAlpha;\n      },\n      setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) {\n        var color = _util.Util.makeCssRgb(r, g, b);\n        this.current.fillColor = color;\n        this.current.tspan = document.createElementNS(NS, 'svg:tspan');\n        this.current.xcoords = [];\n      },\n      setDash: function SVGGraphics_setDash(dashArray, dashPhase) {\n        this.current.dashArray = dashArray;\n        this.current.dashPhase = dashPhase;\n      },\n      constructPath: function SVGGraphics_constructPath(ops, args) {\n        var current = this.current;\n        var x = current.x,\n            y = current.y;\n        current.path = document.createElementNS(NS, 'svg:path');\n        var d = [];\n        var opLength = ops.length;\n        for (var i = 0, j = 0; i < opLength; i++) {\n          switch (ops[i] | 0) {\n            case _util.OPS.rectangle:\n              x = args[j++];\n              y = args[j++];\n              var width = args[j++];\n              var height = args[j++];\n              var xw = x + width;\n              var yh = y + height;\n              d.push('M', pf(x), pf(y), 'L', pf(xw), pf(y), 'L', pf(xw), pf(yh), 'L', pf(x), pf(yh), 'Z');\n              break;\n            case _util.OPS.moveTo:\n              x = args[j++];\n              y = args[j++];\n              d.push('M', pf(x), pf(y));\n              break;\n            case _util.OPS.lineTo:\n              x = args[j++];\n              y = args[j++];\n              d.push('L', pf(x), pf(y));\n              break;\n            case _util.OPS.curveTo:\n              x = args[j + 4];\n              y = args[j + 5];\n              d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3]), pf(x), pf(y));\n              j += 6;\n              break;\n            case _util.OPS.curveTo2:\n              x = args[j + 2];\n              y = args[j + 3];\n              d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3]));\n              j += 4;\n              break;\n            case _util.OPS.curveTo3:\n              x = args[j + 2];\n              y = args[j + 3];\n              d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y), pf(x), pf(y));\n              j += 4;\n              break;\n            case _util.OPS.closePath:\n              d.push('Z');\n              break;\n          }\n        }\n        current.path.setAttributeNS(null, 'd', d.join(' '));\n        current.path.setAttributeNS(null, 'fill', 'none');\n        this._ensureTransformGroup().appendChild(current.path);\n        current.element = current.path;\n        current.setCurrentPoint(x, y);\n      },\n      endPath: function SVGGraphics_endPath() {\n        if (!this.pendingClip) {\n          return;\n        }\n        var current = this.current;\n        var clipId = 'clippath' + clipCount;\n        clipCount++;\n        var clipPath = document.createElementNS(NS, 'svg:clipPath');\n        clipPath.setAttributeNS(null, 'id', clipId);\n        clipPath.setAttributeNS(null, 'transform', pm(this.transformMatrix));\n        var clipElement = current.element.cloneNode();\n        if (this.pendingClip === 'evenodd') {\n          clipElement.setAttributeNS(null, 'clip-rule', 'evenodd');\n        } else {\n          clipElement.setAttributeNS(null, 'clip-rule', 'nonzero');\n        }\n        this.pendingClip = null;\n        clipPath.appendChild(clipElement);\n        this.defs.appendChild(clipPath);\n        if (current.activeClipUrl) {\n          current.clipGroup = null;\n          this.extraStack.forEach(function (prev) {\n            prev.clipGroup = null;\n          });\n        }\n        current.activeClipUrl = 'url(#' + clipId + ')';\n        this.tgrp = null;\n      },\n      clip: function SVGGraphics_clip(type) {\n        this.pendingClip = type;\n      },\n      closePath: function SVGGraphics_closePath() {\n        var current = this.current;\n        var d = current.path.getAttributeNS(null, 'd');\n        d += 'Z';\n        current.path.setAttributeNS(null, 'd', d);\n      },\n      setLeading: function SVGGraphics_setLeading(leading) {\n        this.current.leading = -leading;\n      },\n      setTextRise: function SVGGraphics_setTextRise(textRise) {\n        this.current.textRise = textRise;\n      },\n      setHScale: function SVGGraphics_setHScale(scale) {\n        this.current.textHScale = scale / 100;\n      },\n      setGState: function SVGGraphics_setGState(states) {\n        for (var i = 0, ii = states.length; i < ii; i++) {\n          var state = states[i];\n          var key = state[0];\n          var value = state[1];\n          switch (key) {\n            case 'LW':\n              this.setLineWidth(value);\n              break;\n            case 'LC':\n              this.setLineCap(value);\n              break;\n            case 'LJ':\n              this.setLineJoin(value);\n              break;\n            case 'ML':\n              this.setMiterLimit(value);\n              break;\n            case 'D':\n              this.setDash(value[0], value[1]);\n              break;\n            case 'Font':\n              this.setFont(value);\n              break;\n            case 'CA':\n              this.setStrokeAlpha(value);\n              break;\n            case 'ca':\n              this.setFillAlpha(value);\n              break;\n            default:\n              (0, _util.warn)('Unimplemented graphic state ' + key);\n              break;\n          }\n        }\n      },\n      fill: function SVGGraphics_fill() {\n        var current = this.current;\n        current.element.setAttributeNS(null, 'fill', current.fillColor);\n        current.element.setAttributeNS(null, 'fill-opacity', current.fillAlpha);\n      },\n      stroke: function SVGGraphics_stroke() {\n        var current = this.current;\n        current.element.setAttributeNS(null, 'stroke', current.strokeColor);\n        current.element.setAttributeNS(null, 'stroke-opacity', current.strokeAlpha);\n        current.element.setAttributeNS(null, 'stroke-miterlimit', pf(current.miterLimit));\n        current.element.setAttributeNS(null, 'stroke-linecap', current.lineCap);\n        current.element.setAttributeNS(null, 'stroke-linejoin', current.lineJoin);\n        current.element.setAttributeNS(null, 'stroke-width', pf(current.lineWidth) + 'px');\n        current.element.setAttributeNS(null, 'stroke-dasharray', current.dashArray.map(pf).join(' '));\n        current.element.setAttributeNS(null, 'stroke-dashoffset', pf(current.dashPhase) + 'px');\n        current.element.setAttributeNS(null, 'fill', 'none');\n      },\n      eoFill: function SVGGraphics_eoFill() {\n        this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd');\n        this.fill();\n      },\n      fillStroke: function SVGGraphics_fillStroke() {\n        this.stroke();\n        this.fill();\n      },\n      eoFillStroke: function SVGGraphics_eoFillStroke() {\n        this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd');\n        this.fillStroke();\n      },\n      closeStroke: function SVGGraphics_closeStroke() {\n        this.closePath();\n        this.stroke();\n      },\n      closeFillStroke: function SVGGraphics_closeFillStroke() {\n        this.closePath();\n        this.fillStroke();\n      },\n      paintSolidColorImageMask: function SVGGraphics_paintSolidColorImageMask() {\n        var current = this.current;\n        var rect = document.createElementNS(NS, 'svg:rect');\n        rect.setAttributeNS(null, 'x', '0');\n        rect.setAttributeNS(null, 'y', '0');\n        rect.setAttributeNS(null, 'width', '1px');\n        rect.setAttributeNS(null, 'height', '1px');\n        rect.setAttributeNS(null, 'fill', current.fillColor);\n        this._ensureTransformGroup().appendChild(rect);\n      },\n      paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) {\n        var imgObj = this.objs.get(objId);\n        var imgEl = document.createElementNS(NS, 'svg:image');\n        imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src);\n        imgEl.setAttributeNS(null, 'width', pf(w));\n        imgEl.setAttributeNS(null, 'height', pf(h));\n        imgEl.setAttributeNS(null, 'x', '0');\n        imgEl.setAttributeNS(null, 'y', pf(-h));\n        imgEl.setAttributeNS(null, 'transform', 'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')');\n        this._ensureTransformGroup().appendChild(imgEl);\n      },\n      paintImageXObject: function SVGGraphics_paintImageXObject(objId) {\n        var imgData = this.objs.get(objId);\n        if (!imgData) {\n          (0, _util.warn)('Dependent image isn\\'t ready yet');\n          return;\n        }\n        this.paintInlineImageXObject(imgData);\n      },\n      paintInlineImageXObject: function SVGGraphics_paintInlineImageXObject(imgData, mask) {\n        var width = imgData.width;\n        var height = imgData.height;\n        var imgSrc = convertImgDataToPng(imgData, this.forceDataSchema);\n        var cliprect = document.createElementNS(NS, 'svg:rect');\n        cliprect.setAttributeNS(null, 'x', '0');\n        cliprect.setAttributeNS(null, 'y', '0');\n        cliprect.setAttributeNS(null, 'width', pf(width));\n        cliprect.setAttributeNS(null, 'height', pf(height));\n        this.current.element = cliprect;\n        this.clip('nonzero');\n        var imgEl = document.createElementNS(NS, 'svg:image');\n        imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc);\n        imgEl.setAttributeNS(null, 'x', '0');\n        imgEl.setAttributeNS(null, 'y', pf(-height));\n        imgEl.setAttributeNS(null, 'width', pf(width) + 'px');\n        imgEl.setAttributeNS(null, 'height', pf(height) + 'px');\n        imgEl.setAttributeNS(null, 'transform', 'scale(' + pf(1 / width) + ' ' + pf(-1 / height) + ')');\n        if (mask) {\n          mask.appendChild(imgEl);\n        } else {\n          this._ensureTransformGroup().appendChild(imgEl);\n        }\n      },\n      paintImageMaskXObject: function SVGGraphics_paintImageMaskXObject(imgData) {\n        var current = this.current;\n        var width = imgData.width;\n        var height = imgData.height;\n        var fillColor = current.fillColor;\n        current.maskId = 'mask' + maskCount++;\n        var mask = document.createElementNS(NS, 'svg:mask');\n        mask.setAttributeNS(null, 'id', current.maskId);\n        var rect = document.createElementNS(NS, 'svg:rect');\n        rect.setAttributeNS(null, 'x', '0');\n        rect.setAttributeNS(null, 'y', '0');\n        rect.setAttributeNS(null, 'width', pf(width));\n        rect.setAttributeNS(null, 'height', pf(height));\n        rect.setAttributeNS(null, 'fill', fillColor);\n        rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId + ')');\n        this.defs.appendChild(mask);\n        this._ensureTransformGroup().appendChild(rect);\n        this.paintInlineImageXObject(imgData, mask);\n      },\n      paintFormXObjectBegin: function SVGGraphics_paintFormXObjectBegin(matrix, bbox) {\n        if ((0, _util.isArray)(matrix) && matrix.length === 6) {\n          this.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);\n        }\n        if ((0, _util.isArray)(bbox) && bbox.length === 4) {\n          var width = bbox[2] - bbox[0];\n          var height = bbox[3] - bbox[1];\n          var cliprect = document.createElementNS(NS, 'svg:rect');\n          cliprect.setAttributeNS(null, 'x', bbox[0]);\n          cliprect.setAttributeNS(null, 'y', bbox[1]);\n          cliprect.setAttributeNS(null, 'width', pf(width));\n          cliprect.setAttributeNS(null, 'height', pf(height));\n          this.current.element = cliprect;\n          this.clip('nonzero');\n          this.endPath();\n        }\n      },\n      paintFormXObjectEnd: function SVGGraphics_paintFormXObjectEnd() {},\n      _initialize: function SVGGraphics_initialize(viewport) {\n        var svg = document.createElementNS(NS, 'svg:svg');\n        svg.setAttributeNS(null, 'version', '1.1');\n        svg.setAttributeNS(null, 'width', viewport.width + 'px');\n        svg.setAttributeNS(null, 'height', viewport.height + 'px');\n        svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\n        svg.setAttributeNS(null, 'viewBox', '0 0 ' + viewport.width + ' ' + viewport.height);\n        var definitions = document.createElementNS(NS, 'svg:defs');\n        svg.appendChild(definitions);\n        this.defs = definitions;\n        var rootGroup = document.createElementNS(NS, 'svg:g');\n        rootGroup.setAttributeNS(null, 'transform', pm(viewport.transform));\n        svg.appendChild(rootGroup);\n        this.svg = rootGroup;\n        return svg;\n      },\n      _ensureClipGroup: function SVGGraphics_ensureClipGroup() {\n        if (!this.current.clipGroup) {\n          var clipGroup = document.createElementNS(NS, 'svg:g');\n          clipGroup.setAttributeNS(null, 'clip-path', this.current.activeClipUrl);\n          this.svg.appendChild(clipGroup);\n          this.current.clipGroup = clipGroup;\n        }\n        return this.current.clipGroup;\n      },\n      _ensureTransformGroup: function SVGGraphics_ensureTransformGroup() {\n        if (!this.tgrp) {\n          this.tgrp = document.createElementNS(NS, 'svg:g');\n          this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));\n          if (this.current.activeClipUrl) {\n            this._ensureClipGroup().appendChild(this.tgrp);\n          } else {\n            this.svg.appendChild(this.tgrp);\n          }\n        }\n        return this.tgrp;\n      }\n    };\n    return SVGGraphics;\n  }();\n}\nexports.SVGGraphics = SVGGraphics;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.renderTextLayer = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _dom_utils = __w_pdfjs_require__(1);\n\nvar renderTextLayer = function renderTextLayerClosure() {\n  var MAX_TEXT_DIVS_TO_RENDER = 100000;\n  var NonWhitespaceRegexp = /\\S/;\n  function isAllWhitespace(str) {\n    return !NonWhitespaceRegexp.test(str);\n  }\n  var styleBuf = ['left: ', 0, 'px; top: ', 0, 'px; font-size: ', 0, 'px; font-family: ', '', ';'];\n  function appendText(task, geom, styles) {\n    var textDiv = document.createElement('div');\n    var textDivProperties = {\n      style: null,\n      angle: 0,\n      canvasWidth: 0,\n      isWhitespace: false,\n      originalTransform: null,\n      paddingBottom: 0,\n      paddingLeft: 0,\n      paddingRight: 0,\n      paddingTop: 0,\n      scale: 1\n    };\n    task._textDivs.push(textDiv);\n    if (isAllWhitespace(geom.str)) {\n      textDivProperties.isWhitespace = true;\n      task._textDivProperties.set(textDiv, textDivProperties);\n      return;\n    }\n    var tx = _util.Util.transform(task._viewport.transform, geom.transform);\n    var angle = Math.atan2(tx[1], tx[0]);\n    var style = styles[geom.fontName];\n    if (style.vertical) {\n      angle += Math.PI / 2;\n    }\n    var fontHeight = Math.sqrt(tx[2] * tx[2] + tx[3] * tx[3]);\n    var fontAscent = fontHeight;\n    if (style.ascent) {\n      fontAscent = style.ascent * fontAscent;\n    } else if (style.descent) {\n      fontAscent = (1 + style.descent) * fontAscent;\n    }\n    var left;\n    var top;\n    if (angle === 0) {\n      left = tx[4];\n      top = tx[5] - fontAscent;\n    } else {\n      left = tx[4] + fontAscent * Math.sin(angle);\n      top = tx[5] - fontAscent * Math.cos(angle);\n    }\n    styleBuf[1] = left;\n    styleBuf[3] = top;\n    styleBuf[5] = fontHeight;\n    styleBuf[7] = style.fontFamily;\n    textDivProperties.style = styleBuf.join('');\n    textDiv.setAttribute('style', textDivProperties.style);\n    textDiv.textContent = geom.str;\n    if ((0, _dom_utils.getDefaultSetting)('pdfBug')) {\n      textDiv.dataset.fontName = geom.fontName;\n    }\n    if (angle !== 0) {\n      textDivProperties.angle = angle * (180 / Math.PI);\n    }\n    if (geom.str.length > 1) {\n      if (style.vertical) {\n        textDivProperties.canvasWidth = geom.height * task._viewport.scale;\n      } else {\n        textDivProperties.canvasWidth = geom.width * task._viewport.scale;\n      }\n    }\n    task._textDivProperties.set(textDiv, textDivProperties);\n    if (task._textContentStream) {\n      task._layoutText(textDiv);\n    }\n    if (task._enhanceTextSelection) {\n      var angleCos = 1,\n          angleSin = 0;\n      if (angle !== 0) {\n        angleCos = Math.cos(angle);\n        angleSin = Math.sin(angle);\n      }\n      var divWidth = (style.vertical ? geom.height : geom.width) * task._viewport.scale;\n      var divHeight = fontHeight;\n      var m, b;\n      if (angle !== 0) {\n        m = [angleCos, angleSin, -angleSin, angleCos, left, top];\n        b = _util.Util.getAxialAlignedBoundingBox([0, 0, divWidth, divHeight], m);\n      } else {\n        b = [left, top, left + divWidth, top + divHeight];\n      }\n      task._bounds.push({\n        left: b[0],\n        top: b[1],\n        right: b[2],\n        bottom: b[3],\n        div: textDiv,\n        size: [divWidth, divHeight],\n        m: m\n      });\n    }\n  }\n  function render(task) {\n    if (task._canceled) {\n      return;\n    }\n    var textDivs = task._textDivs;\n    var capability = task._capability;\n    var textDivsLength = textDivs.length;\n    if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) {\n      task._renderingDone = true;\n      capability.resolve();\n      return;\n    }\n    if (!task._textContentStream) {\n      for (var i = 0; i < textDivsLength; i++) {\n        task._layoutText(textDivs[i]);\n      }\n    }\n    task._renderingDone = true;\n    capability.resolve();\n  }\n  function expand(task) {\n    var bounds = task._bounds;\n    var viewport = task._viewport;\n    var expanded = expandBounds(viewport.width, viewport.height, bounds);\n    for (var i = 0; i < expanded.length; i++) {\n      var div = bounds[i].div;\n      var divProperties = task._textDivProperties.get(div);\n      if (divProperties.angle === 0) {\n        divProperties.paddingLeft = bounds[i].left - expanded[i].left;\n        divProperties.paddingTop = bounds[i].top - expanded[i].top;\n        divProperties.paddingRight = expanded[i].right - bounds[i].right;\n        divProperties.paddingBottom = expanded[i].bottom - bounds[i].bottom;\n        task._textDivProperties.set(div, divProperties);\n        continue;\n      }\n      var e = expanded[i],\n          b = bounds[i];\n      var m = b.m,\n          c = m[0],\n          s = m[1];\n      var points = [[0, 0], [0, b.size[1]], [b.size[0], 0], b.size];\n      var ts = new Float64Array(64);\n      points.forEach(function (p, i) {\n        var t = _util.Util.applyTransform(p, m);\n        ts[i + 0] = c && (e.left - t[0]) / c;\n        ts[i + 4] = s && (e.top - t[1]) / s;\n        ts[i + 8] = c && (e.right - t[0]) / c;\n        ts[i + 12] = s && (e.bottom - t[1]) / s;\n        ts[i + 16] = s && (e.left - t[0]) / -s;\n        ts[i + 20] = c && (e.top - t[1]) / c;\n        ts[i + 24] = s && (e.right - t[0]) / -s;\n        ts[i + 28] = c && (e.bottom - t[1]) / c;\n        ts[i + 32] = c && (e.left - t[0]) / -c;\n        ts[i + 36] = s && (e.top - t[1]) / -s;\n        ts[i + 40] = c && (e.right - t[0]) / -c;\n        ts[i + 44] = s && (e.bottom - t[1]) / -s;\n        ts[i + 48] = s && (e.left - t[0]) / s;\n        ts[i + 52] = c && (e.top - t[1]) / -c;\n        ts[i + 56] = s && (e.right - t[0]) / s;\n        ts[i + 60] = c && (e.bottom - t[1]) / -c;\n      });\n      var findPositiveMin = function findPositiveMin(ts, offset, count) {\n        var result = 0;\n        for (var i = 0; i < count; i++) {\n          var t = ts[offset++];\n          if (t > 0) {\n            result = result ? Math.min(t, result) : t;\n          }\n        }\n        return result;\n      };\n      var boxScale = 1 + Math.min(Math.abs(c), Math.abs(s));\n      divProperties.paddingLeft = findPositiveMin(ts, 32, 16) / boxScale;\n      divProperties.paddingTop = findPositiveMin(ts, 48, 16) / boxScale;\n      divProperties.paddingRight = findPositiveMin(ts, 0, 16) / boxScale;\n      divProperties.paddingBottom = findPositiveMin(ts, 16, 16) / boxScale;\n      task._textDivProperties.set(div, divProperties);\n    }\n  }\n  function expandBounds(width, height, boxes) {\n    var bounds = boxes.map(function (box, i) {\n      return {\n        x1: box.left,\n        y1: box.top,\n        x2: box.right,\n        y2: box.bottom,\n        index: i,\n        x1New: undefined,\n        x2New: undefined\n      };\n    });\n    expandBoundsLTR(width, bounds);\n    var expanded = new Array(boxes.length);\n    bounds.forEach(function (b) {\n      var i = b.index;\n      expanded[i] = {\n        left: b.x1New,\n        top: 0,\n        right: b.x2New,\n        bottom: 0\n      };\n    });\n    boxes.map(function (box, i) {\n      var e = expanded[i],\n          b = bounds[i];\n      b.x1 = box.top;\n      b.y1 = width - e.right;\n      b.x2 = box.bottom;\n      b.y2 = width - e.left;\n      b.index = i;\n      b.x1New = undefined;\n      b.x2New = undefined;\n    });\n    expandBoundsLTR(height, bounds);\n    bounds.forEach(function (b) {\n      var i = b.index;\n      expanded[i].top = b.x1New;\n      expanded[i].bottom = b.x2New;\n    });\n    return expanded;\n  }\n  function expandBoundsLTR(width, bounds) {\n    bounds.sort(function (a, b) {\n      return a.x1 - b.x1 || a.index - b.index;\n    });\n    var fakeBoundary = {\n      x1: -Infinity,\n      y1: -Infinity,\n      x2: 0,\n      y2: Infinity,\n      index: -1,\n      x1New: 0,\n      x2New: 0\n    };\n    var horizon = [{\n      start: -Infinity,\n      end: Infinity,\n      boundary: fakeBoundary\n    }];\n    bounds.forEach(function (boundary) {\n      var i = 0;\n      while (i < horizon.length && horizon[i].end <= boundary.y1) {\n        i++;\n      }\n      var j = horizon.length - 1;\n      while (j >= 0 && horizon[j].start >= boundary.y2) {\n        j--;\n      }\n      var horizonPart, affectedBoundary;\n      var q,\n          k,\n          maxXNew = -Infinity;\n      for (q = i; q <= j; q++) {\n        horizonPart = horizon[q];\n        affectedBoundary = horizonPart.boundary;\n        var xNew;\n        if (affectedBoundary.x2 > boundary.x1) {\n          xNew = affectedBoundary.index > boundary.index ? affectedBoundary.x1New : boundary.x1;\n        } else if (affectedBoundary.x2New === undefined) {\n          xNew = (affectedBoundary.x2 + boundary.x1) / 2;\n        } else {\n          xNew = affectedBoundary.x2New;\n        }\n        if (xNew > maxXNew) {\n          maxXNew = xNew;\n        }\n      }\n      boundary.x1New = maxXNew;\n      for (q = i; q <= j; q++) {\n        horizonPart = horizon[q];\n        affectedBoundary = horizonPart.boundary;\n        if (affectedBoundary.x2New === undefined) {\n          if (affectedBoundary.x2 > boundary.x1) {\n            if (affectedBoundary.index > boundary.index) {\n              affectedBoundary.x2New = affectedBoundary.x2;\n            }\n          } else {\n            affectedBoundary.x2New = maxXNew;\n          }\n        } else if (affectedBoundary.x2New > maxXNew) {\n          affectedBoundary.x2New = Math.max(maxXNew, affectedBoundary.x2);\n        }\n      }\n      var changedHorizon = [],\n          lastBoundary = null;\n      for (q = i; q <= j; q++) {\n        horizonPart = horizon[q];\n        affectedBoundary = horizonPart.boundary;\n        var useBoundary = affectedBoundary.x2 > boundary.x2 ? affectedBoundary : boundary;\n        if (lastBoundary === useBoundary) {\n          changedHorizon[changedHorizon.length - 1].end = horizonPart.end;\n        } else {\n          changedHorizon.push({\n            start: horizonPart.start,\n            end: horizonPart.end,\n            boundary: useBoundary\n          });\n          lastBoundary = useBoundary;\n        }\n      }\n      if (horizon[i].start < boundary.y1) {\n        changedHorizon[0].start = boundary.y1;\n        changedHorizon.unshift({\n          start: horizon[i].start,\n          end: boundary.y1,\n          boundary: horizon[i].boundary\n        });\n      }\n      if (boundary.y2 < horizon[j].end) {\n        changedHorizon[changedHorizon.length - 1].end = boundary.y2;\n        changedHorizon.push({\n          start: boundary.y2,\n          end: horizon[j].end,\n          boundary: horizon[j].boundary\n        });\n      }\n      for (q = i; q <= j; q++) {\n        horizonPart = horizon[q];\n        affectedBoundary = horizonPart.boundary;\n        if (affectedBoundary.x2New !== undefined) {\n          continue;\n        }\n        var used = false;\n        for (k = i - 1; !used && k >= 0 && horizon[k].start >= affectedBoundary.y1; k--) {\n          used = horizon[k].boundary === affectedBoundary;\n        }\n        for (k = j + 1; !used && k < horizon.length && horizon[k].end <= affectedBoundary.y2; k++) {\n          used = horizon[k].boundary === affectedBoundary;\n        }\n        for (k = 0; !used && k < changedHorizon.length; k++) {\n          used = changedHorizon[k].boundary === affectedBoundary;\n        }\n        if (!used) {\n          affectedBoundary.x2New = maxXNew;\n        }\n      }\n      Array.prototype.splice.apply(horizon, [i, j - i + 1].concat(changedHorizon));\n    });\n    horizon.forEach(function (horizonPart) {\n      var affectedBoundary = horizonPart.boundary;\n      if (affectedBoundary.x2New === undefined) {\n        affectedBoundary.x2New = Math.max(width, affectedBoundary.x2);\n      }\n    });\n  }\n  function TextLayerRenderTask(_ref) {\n    var textContent = _ref.textContent,\n        textContentStream = _ref.textContentStream,\n        container = _ref.container,\n        viewport = _ref.viewport,\n        textDivs = _ref.textDivs,\n        textContentItemsStr = _ref.textContentItemsStr,\n        enhanceTextSelection = _ref.enhanceTextSelection;\n\n    this._textContent = textContent;\n    this._textContentStream = textContentStream;\n    this._container = container;\n    this._viewport = viewport;\n    this._textDivs = textDivs || [];\n    this._textContentItemsStr = textContentItemsStr || [];\n    this._enhanceTextSelection = !!enhanceTextSelection;\n    this._reader = null;\n    this._layoutTextLastFontSize = null;\n    this._layoutTextLastFontFamily = null;\n    this._layoutTextCtx = null;\n    this._textDivProperties = new WeakMap();\n    this._renderingDone = false;\n    this._canceled = false;\n    this._capability = (0, _util.createPromiseCapability)();\n    this._renderTimer = null;\n    this._bounds = [];\n  }\n  TextLayerRenderTask.prototype = {\n    get promise() {\n      return this._capability.promise;\n    },\n    cancel: function TextLayer_cancel() {\n      if (this._reader) {\n        this._reader.cancel(new _util.AbortException('text layer task cancelled'));\n        this._reader = null;\n      }\n      this._canceled = true;\n      if (this._renderTimer !== null) {\n        clearTimeout(this._renderTimer);\n        this._renderTimer = null;\n      }\n      this._capability.reject('canceled');\n    },\n    _processItems: function _processItems(items, styleCache) {\n      for (var i = 0, len = items.length; i < len; i++) {\n        this._textContentItemsStr.push(items[i].str);\n        appendText(this, items[i], styleCache);\n      }\n    },\n    _layoutText: function _layoutText(textDiv) {\n      var textLayerFrag = this._container;\n      var textDivProperties = this._textDivProperties.get(textDiv);\n      if (textDivProperties.isWhitespace) {\n        return;\n      }\n      var fontSize = textDiv.style.fontSize;\n      var fontFamily = textDiv.style.fontFamily;\n      if (fontSize !== this._layoutTextLastFontSize || fontFamily !== this._layoutTextLastFontFamily) {\n        this._layoutTextCtx.font = fontSize + ' ' + fontFamily;\n        this._lastFontSize = fontSize;\n        this._lastFontFamily = fontFamily;\n      }\n      var width = this._layoutTextCtx.measureText(textDiv.textContent).width;\n      var transform = '';\n      if (textDivProperties.canvasWidth !== 0 && width > 0) {\n        textDivProperties.scale = textDivProperties.canvasWidth / width;\n        transform = 'scaleX(' + textDivProperties.scale + ')';\n      }\n      if (textDivProperties.angle !== 0) {\n        transform = 'rotate(' + textDivProperties.angle + 'deg) ' + transform;\n      }\n      if (transform !== '') {\n        textDivProperties.originalTransform = transform;\n        _dom_utils.CustomStyle.setProp('transform', textDiv, transform);\n      }\n      this._textDivProperties.set(textDiv, textDivProperties);\n      textLayerFrag.appendChild(textDiv);\n    },\n\n    _render: function TextLayer_render(timeout) {\n      var _this = this;\n\n      var capability = (0, _util.createPromiseCapability)();\n      var styleCache = Object.create(null);\n      var canvas = document.createElement('canvas');\n      canvas.mozOpaque = true;\n      this._layoutTextCtx = canvas.getContext('2d', { alpha: false });\n      if (this._textContent) {\n        var textItems = this._textContent.items;\n        var textStyles = this._textContent.styles;\n        this._processItems(textItems, textStyles);\n        capability.resolve();\n      } else if (this._textContentStream) {\n        var pump = function pump() {\n          _this._reader.read().then(function (_ref2) {\n            var value = _ref2.value,\n                done = _ref2.done;\n\n            if (done) {\n              capability.resolve();\n              return;\n            }\n            _util.Util.extendObj(styleCache, value.styles);\n            _this._processItems(value.items, styleCache);\n            pump();\n          }, capability.reject);\n        };\n        this._reader = this._textContentStream.getReader();\n        pump();\n      } else {\n        throw new Error('Neither \"textContent\" nor \"textContentStream\"' + ' parameters specified.');\n      }\n      capability.promise.then(function () {\n        styleCache = null;\n        if (!timeout) {\n          render(_this);\n        } else {\n          _this._renderTimer = setTimeout(function () {\n            render(_this);\n            _this._renderTimer = null;\n          }, timeout);\n        }\n      }, this._capability.reject);\n    },\n    expandTextDivs: function TextLayer_expandTextDivs(expandDivs) {\n      if (!this._enhanceTextSelection || !this._renderingDone) {\n        return;\n      }\n      if (this._bounds !== null) {\n        expand(this);\n        this._bounds = null;\n      }\n      for (var i = 0, ii = this._textDivs.length; i < ii; i++) {\n        var div = this._textDivs[i];\n        var divProperties = this._textDivProperties.get(div);\n        if (divProperties.isWhitespace) {\n          continue;\n        }\n        if (expandDivs) {\n          var transform = '',\n              padding = '';\n          if (divProperties.scale !== 1) {\n            transform = 'scaleX(' + divProperties.scale + ')';\n          }\n          if (divProperties.angle !== 0) {\n            transform = 'rotate(' + divProperties.angle + 'deg) ' + transform;\n          }\n          if (divProperties.paddingLeft !== 0) {\n            padding += ' padding-left: ' + divProperties.paddingLeft / divProperties.scale + 'px;';\n            transform += ' translateX(' + -divProperties.paddingLeft / divProperties.scale + 'px)';\n          }\n          if (divProperties.paddingTop !== 0) {\n            padding += ' padding-top: ' + divProperties.paddingTop + 'px;';\n            transform += ' translateY(' + -divProperties.paddingTop + 'px)';\n          }\n          if (divProperties.paddingRight !== 0) {\n            padding += ' padding-right: ' + divProperties.paddingRight / divProperties.scale + 'px;';\n          }\n          if (divProperties.paddingBottom !== 0) {\n            padding += ' padding-bottom: ' + divProperties.paddingBottom + 'px;';\n          }\n          if (padding !== '') {\n            div.setAttribute('style', divProperties.style + padding);\n          }\n          if (transform !== '') {\n            _dom_utils.CustomStyle.setProp('transform', div, transform);\n          }\n        } else {\n          div.style.padding = 0;\n          _dom_utils.CustomStyle.setProp('transform', div, divProperties.originalTransform || '');\n        }\n      }\n    }\n  };\n  function renderTextLayer(renderParameters) {\n    var task = new TextLayerRenderTask({\n      textContent: renderParameters.textContent,\n      textContentStream: renderParameters.textContentStream,\n      container: renderParameters.container,\n      viewport: renderParameters.viewport,\n      textDivs: renderParameters.textDivs,\n      textContentItemsStr: renderParameters.textContentItemsStr,\n      enhanceTextSelection: renderParameters.enhanceTextSelection\n    });\n    task._render(renderParameters.timeout);\n    return task;\n  }\n  return renderTextLayer;\n}();\nexports.renderTextLayer = renderTextLayer;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nfunction fixMetadata(meta) {\n  return meta.replace(/>\\\\376\\\\377([^<]+)/g, function (all, codes) {\n    var bytes = codes.replace(/\\\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) {\n      return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);\n    });\n    var chars = '';\n    for (var i = 0; i < bytes.length; i += 2) {\n      var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);\n      chars += code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38 ? String.fromCharCode(code) : '&#x' + (0x10000 + code).toString(16).substring(1) + ';';\n    }\n    return '>' + chars;\n  });\n}\nfunction Metadata(meta) {\n  if (typeof meta === 'string') {\n    meta = fixMetadata(meta);\n    var parser = new DOMParser();\n    meta = parser.parseFromString(meta, 'application/xml');\n  } else if (!(meta instanceof Document)) {\n    throw new Error('Metadata: Invalid metadata object');\n  }\n  this.metaDocument = meta;\n  this.metadata = Object.create(null);\n  this.parse();\n}\nMetadata.prototype = {\n  parse: function Metadata_parse() {\n    var doc = this.metaDocument;\n    var rdf = doc.documentElement;\n    if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') {\n      rdf = rdf.firstChild;\n      while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf') {\n        rdf = rdf.nextSibling;\n      }\n    }\n    var nodeName = rdf ? rdf.nodeName.toLowerCase() : null;\n    if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes()) {\n      return;\n    }\n    var children = rdf.childNodes,\n        desc,\n        entry,\n        name,\n        i,\n        ii,\n        length,\n        iLength;\n    for (i = 0, length = children.length; i < length; i++) {\n      desc = children[i];\n      if (desc.nodeName.toLowerCase() !== 'rdf:description') {\n        continue;\n      }\n      for (ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) {\n        if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text') {\n          entry = desc.childNodes[ii];\n          name = entry.nodeName.toLowerCase();\n          this.metadata[name] = entry.textContent.trim();\n        }\n      }\n    }\n  },\n  get: function Metadata_get(name) {\n    return this.metadata[name] || null;\n  },\n  has: function Metadata_has(name) {\n    return typeof this.metadata[name] !== 'undefined';\n  }\n};\nexports.Metadata = Metadata;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.WebGLUtils = undefined;\n\nvar _dom_utils = __w_pdfjs_require__(1);\n\nvar _util = __w_pdfjs_require__(0);\n\nvar WebGLUtils = function WebGLUtilsClosure() {\n  function loadShader(gl, code, shaderType) {\n    var shader = gl.createShader(shaderType);\n    gl.shaderSource(shader, code);\n    gl.compileShader(shader);\n    var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n    if (!compiled) {\n      var errorMsg = gl.getShaderInfoLog(shader);\n      throw new Error('Error during shader compilation: ' + errorMsg);\n    }\n    return shader;\n  }\n  function createVertexShader(gl, code) {\n    return loadShader(gl, code, gl.VERTEX_SHADER);\n  }\n  function createFragmentShader(gl, code) {\n    return loadShader(gl, code, gl.FRAGMENT_SHADER);\n  }\n  function createProgram(gl, shaders) {\n    var program = gl.createProgram();\n    for (var i = 0, ii = shaders.length; i < ii; ++i) {\n      gl.attachShader(program, shaders[i]);\n    }\n    gl.linkProgram(program);\n    var linked = gl.getProgramParameter(program, gl.LINK_STATUS);\n    if (!linked) {\n      var errorMsg = gl.getProgramInfoLog(program);\n      throw new Error('Error during program linking: ' + errorMsg);\n    }\n    return program;\n  }\n  function createTexture(gl, image, textureId) {\n    gl.activeTexture(textureId);\n    var texture = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n    return texture;\n  }\n  var currentGL, currentCanvas;\n  function generateGL() {\n    if (currentGL) {\n      return;\n    }\n    currentCanvas = document.createElement('canvas');\n    currentGL = currentCanvas.getContext('webgl', { premultipliedalpha: false });\n  }\n  var smaskVertexShaderCode = '\\\n  attribute vec2 a_position;                                    \\\n  attribute vec2 a_texCoord;                                    \\\n                                                                \\\n  uniform vec2 u_resolution;                                    \\\n                                                                \\\n  varying vec2 v_texCoord;                                      \\\n                                                                \\\n  void main() {                                                 \\\n    vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0;   \\\n    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \\\n                                                                \\\n    v_texCoord = a_texCoord;                                    \\\n  }                                                             ';\n  var smaskFragmentShaderCode = '\\\n  precision mediump float;                                      \\\n                                                                \\\n  uniform vec4 u_backdrop;                                      \\\n  uniform int u_subtype;                                        \\\n  uniform sampler2D u_image;                                    \\\n  uniform sampler2D u_mask;                                     \\\n                                                                \\\n  varying vec2 v_texCoord;                                      \\\n                                                                \\\n  void main() {                                                 \\\n    vec4 imageColor = texture2D(u_image, v_texCoord);           \\\n    vec4 maskColor = texture2D(u_mask, v_texCoord);             \\\n    if (u_backdrop.a > 0.0) {                                   \\\n      maskColor.rgb = maskColor.rgb * maskColor.a +             \\\n                      u_backdrop.rgb * (1.0 - maskColor.a);     \\\n    }                                                           \\\n    float lum;                                                  \\\n    if (u_subtype == 0) {                                       \\\n      lum = maskColor.a;                                        \\\n    } else {                                                    \\\n      lum = maskColor.r * 0.3 + maskColor.g * 0.59 +            \\\n            maskColor.b * 0.11;                                 \\\n    }                                                           \\\n    imageColor.a *= lum;                                        \\\n    imageColor.rgb *= imageColor.a;                             \\\n    gl_FragColor = imageColor;                                  \\\n  }                                                             ';\n  var smaskCache = null;\n  function initSmaskGL() {\n    var canvas, gl;\n    generateGL();\n    canvas = currentCanvas;\n    currentCanvas = null;\n    gl = currentGL;\n    currentGL = null;\n    var vertexShader = createVertexShader(gl, smaskVertexShaderCode);\n    var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode);\n    var program = createProgram(gl, [vertexShader, fragmentShader]);\n    gl.useProgram(program);\n    var cache = {};\n    cache.gl = gl;\n    cache.canvas = canvas;\n    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');\n    cache.positionLocation = gl.getAttribLocation(program, 'a_position');\n    cache.backdropLocation = gl.getUniformLocation(program, 'u_backdrop');\n    cache.subtypeLocation = gl.getUniformLocation(program, 'u_subtype');\n    var texCoordLocation = gl.getAttribLocation(program, 'a_texCoord');\n    var texLayerLocation = gl.getUniformLocation(program, 'u_image');\n    var texMaskLocation = gl.getUniformLocation(program, 'u_mask');\n    var texCoordBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0]), gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(texCoordLocation);\n    gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);\n    gl.uniform1i(texLayerLocation, 0);\n    gl.uniform1i(texMaskLocation, 1);\n    smaskCache = cache;\n  }\n  function composeSMask(layer, mask, properties) {\n    var width = layer.width,\n        height = layer.height;\n    if (!smaskCache) {\n      initSmaskGL();\n    }\n    var cache = smaskCache,\n        canvas = cache.canvas,\n        gl = cache.gl;\n    canvas.width = width;\n    canvas.height = height;\n    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n    gl.uniform2f(cache.resolutionLocation, width, height);\n    if (properties.backdrop) {\n      gl.uniform4f(cache.resolutionLocation, properties.backdrop[0], properties.backdrop[1], properties.backdrop[2], 1);\n    } else {\n      gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0);\n    }\n    gl.uniform1i(cache.subtypeLocation, properties.subtype === 'Luminosity' ? 1 : 0);\n    var texture = createTexture(gl, layer, gl.TEXTURE0);\n    var maskTexture = createTexture(gl, mask, gl.TEXTURE1);\n    var buffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0, width, 0, 0, height, 0, height, width, 0, width, height]), gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(cache.positionLocation);\n    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);\n    gl.clearColor(0, 0, 0, 0);\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n    gl.clear(gl.COLOR_BUFFER_BIT);\n    gl.drawArrays(gl.TRIANGLES, 0, 6);\n    gl.flush();\n    gl.deleteTexture(texture);\n    gl.deleteTexture(maskTexture);\n    gl.deleteBuffer(buffer);\n    return canvas;\n  }\n  var figuresVertexShaderCode = '\\\n  attribute vec2 a_position;                                    \\\n  attribute vec3 a_color;                                       \\\n                                                                \\\n  uniform vec2 u_resolution;                                    \\\n  uniform vec2 u_scale;                                         \\\n  uniform vec2 u_offset;                                        \\\n                                                                \\\n  varying vec4 v_color;                                         \\\n                                                                \\\n  void main() {                                                 \\\n    vec2 position = (a_position + u_offset) * u_scale;          \\\n    vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0;     \\\n    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \\\n                                                                \\\n    v_color = vec4(a_color / 255.0, 1.0);                       \\\n  }                                                             ';\n  var figuresFragmentShaderCode = '\\\n  precision mediump float;                                      \\\n                                                                \\\n  varying vec4 v_color;                                         \\\n                                                                \\\n  void main() {                                                 \\\n    gl_FragColor = v_color;                                     \\\n  }                                                             ';\n  var figuresCache = null;\n  function initFiguresGL() {\n    var canvas, gl;\n    generateGL();\n    canvas = currentCanvas;\n    currentCanvas = null;\n    gl = currentGL;\n    currentGL = null;\n    var vertexShader = createVertexShader(gl, figuresVertexShaderCode);\n    var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode);\n    var program = createProgram(gl, [vertexShader, fragmentShader]);\n    gl.useProgram(program);\n    var cache = {};\n    cache.gl = gl;\n    cache.canvas = canvas;\n    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');\n    cache.scaleLocation = gl.getUniformLocation(program, 'u_scale');\n    cache.offsetLocation = gl.getUniformLocation(program, 'u_offset');\n    cache.positionLocation = gl.getAttribLocation(program, 'a_position');\n    cache.colorLocation = gl.getAttribLocation(program, 'a_color');\n    figuresCache = cache;\n  }\n  function drawFigures(width, height, backgroundColor, figures, context) {\n    if (!figuresCache) {\n      initFiguresGL();\n    }\n    var cache = figuresCache,\n        canvas = cache.canvas,\n        gl = cache.gl;\n    canvas.width = width;\n    canvas.height = height;\n    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n    gl.uniform2f(cache.resolutionLocation, width, height);\n    var count = 0;\n    var i, ii, rows;\n    for (i = 0, ii = figures.length; i < ii; i++) {\n      switch (figures[i].type) {\n        case 'lattice':\n          rows = figures[i].coords.length / figures[i].verticesPerRow | 0;\n          count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6;\n          break;\n        case 'triangles':\n          count += figures[i].coords.length;\n          break;\n      }\n    }\n    var coords = new Float32Array(count * 2);\n    var colors = new Uint8Array(count * 3);\n    var coordsMap = context.coords,\n        colorsMap = context.colors;\n    var pIndex = 0,\n        cIndex = 0;\n    for (i = 0, ii = figures.length; i < ii; i++) {\n      var figure = figures[i],\n          ps = figure.coords,\n          cs = figure.colors;\n      switch (figure.type) {\n        case 'lattice':\n          var cols = figure.verticesPerRow;\n          rows = ps.length / cols | 0;\n          for (var row = 1; row < rows; row++) {\n            var offset = row * cols + 1;\n            for (var col = 1; col < cols; col++, offset++) {\n              coords[pIndex] = coordsMap[ps[offset - cols - 1]];\n              coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1];\n              coords[pIndex + 2] = coordsMap[ps[offset - cols]];\n              coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1];\n              coords[pIndex + 4] = coordsMap[ps[offset - 1]];\n              coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1];\n              colors[cIndex] = colorsMap[cs[offset - cols - 1]];\n              colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1];\n              colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2];\n              colors[cIndex + 3] = colorsMap[cs[offset - cols]];\n              colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1];\n              colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2];\n              colors[cIndex + 6] = colorsMap[cs[offset - 1]];\n              colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1];\n              colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2];\n              coords[pIndex + 6] = coords[pIndex + 2];\n              coords[pIndex + 7] = coords[pIndex + 3];\n              coords[pIndex + 8] = coords[pIndex + 4];\n              coords[pIndex + 9] = coords[pIndex + 5];\n              coords[pIndex + 10] = coordsMap[ps[offset]];\n              coords[pIndex + 11] = coordsMap[ps[offset] + 1];\n              colors[cIndex + 9] = colors[cIndex + 3];\n              colors[cIndex + 10] = colors[cIndex + 4];\n              colors[cIndex + 11] = colors[cIndex + 5];\n              colors[cIndex + 12] = colors[cIndex + 6];\n              colors[cIndex + 13] = colors[cIndex + 7];\n              colors[cIndex + 14] = colors[cIndex + 8];\n              colors[cIndex + 15] = colorsMap[cs[offset]];\n              colors[cIndex + 16] = colorsMap[cs[offset] + 1];\n              colors[cIndex + 17] = colorsMap[cs[offset] + 2];\n              pIndex += 12;\n              cIndex += 18;\n            }\n          }\n          break;\n        case 'triangles':\n          for (var j = 0, jj = ps.length; j < jj; j++) {\n            coords[pIndex] = coordsMap[ps[j]];\n            coords[pIndex + 1] = coordsMap[ps[j] + 1];\n            colors[cIndex] = colorsMap[cs[j]];\n            colors[cIndex + 1] = colorsMap[cs[j] + 1];\n            colors[cIndex + 2] = colorsMap[cs[j] + 2];\n            pIndex += 2;\n            cIndex += 3;\n          }\n          break;\n      }\n    }\n    if (backgroundColor) {\n      gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255, backgroundColor[2] / 255, 1.0);\n    } else {\n      gl.clearColor(0, 0, 0, 0);\n    }\n    gl.clear(gl.COLOR_BUFFER_BIT);\n    var coordsBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(cache.positionLocation);\n    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);\n    var colorsBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(cache.colorLocation);\n    gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false, 0, 0);\n    gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY);\n    gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY);\n    gl.drawArrays(gl.TRIANGLES, 0, count);\n    gl.flush();\n    gl.deleteBuffer(coordsBuffer);\n    gl.deleteBuffer(colorsBuffer);\n    return canvas;\n  }\n  function cleanup() {\n    if (smaskCache && smaskCache.canvas) {\n      smaskCache.canvas.width = 0;\n      smaskCache.canvas.height = 0;\n    }\n    if (figuresCache && figuresCache.canvas) {\n      figuresCache.canvas.width = 0;\n      figuresCache.canvas.height = 0;\n    }\n    smaskCache = null;\n    figuresCache = null;\n  }\n  return {\n    get isEnabled() {\n      if ((0, _dom_utils.getDefaultSetting)('disableWebGL')) {\n        return false;\n      }\n      var enabled = false;\n      try {\n        generateGL();\n        enabled = !!currentGL;\n      } catch (e) {}\n      return (0, _util.shadow)(this, 'isEnabled', enabled);\n    },\n    composeSMask: composeSMask,\n    drawFigures: drawFigures,\n    clear: cleanup\n  };\n}();\nexports.WebGLUtils = WebGLUtils;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PDFJS = exports.isWorker = exports.globalScope = undefined;\n\nvar _api = __w_pdfjs_require__(2);\n\nvar _dom_utils = __w_pdfjs_require__(1);\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _annotation_layer = __w_pdfjs_require__(3);\n\nvar _metadata = __w_pdfjs_require__(6);\n\nvar _text_layer = __w_pdfjs_require__(5);\n\nvar _svg = __w_pdfjs_require__(4);\n\nvar isWorker = typeof window === 'undefined';\nif (!_util.globalScope.PDFJS) {\n  _util.globalScope.PDFJS = {};\n}\nvar PDFJS = _util.globalScope.PDFJS;\n{\n  PDFJS.version = '1.9.426';\n  PDFJS.build = '2558a58d';\n}\nPDFJS.pdfBug = false;\nif (PDFJS.verbosity !== undefined) {\n  (0, _util.setVerbosityLevel)(PDFJS.verbosity);\n}\ndelete PDFJS.verbosity;\nObject.defineProperty(PDFJS, 'verbosity', {\n  get: function get() {\n    return (0, _util.getVerbosityLevel)();\n  },\n  set: function set(level) {\n    (0, _util.setVerbosityLevel)(level);\n  },\n\n  enumerable: true,\n  configurable: true\n});\nPDFJS.VERBOSITY_LEVELS = _util.VERBOSITY_LEVELS;\nPDFJS.OPS = _util.OPS;\nPDFJS.UNSUPPORTED_FEATURES = _util.UNSUPPORTED_FEATURES;\nPDFJS.isValidUrl = _dom_utils.isValidUrl;\nPDFJS.shadow = _util.shadow;\nPDFJS.createBlob = _util.createBlob;\nPDFJS.createObjectURL = function PDFJS_createObjectURL(data, contentType) {\n  return (0, _util.createObjectURL)(data, contentType, PDFJS.disableCreateObjectURL);\n};\nObject.defineProperty(PDFJS, 'isLittleEndian', {\n  configurable: true,\n  get: function PDFJS_isLittleEndian() {\n    return (0, _util.shadow)(PDFJS, 'isLittleEndian', (0, _util.isLittleEndian)());\n  }\n});\nPDFJS.removeNullCharacters = _util.removeNullCharacters;\nPDFJS.PasswordResponses = _util.PasswordResponses;\nPDFJS.PasswordException = _util.PasswordException;\nPDFJS.UnknownErrorException = _util.UnknownErrorException;\nPDFJS.InvalidPDFException = _util.InvalidPDFException;\nPDFJS.MissingPDFException = _util.MissingPDFException;\nPDFJS.UnexpectedResponseException = _util.UnexpectedResponseException;\nPDFJS.Util = _util.Util;\nPDFJS.PageViewport = _util.PageViewport;\nPDFJS.createPromiseCapability = _util.createPromiseCapability;\nPDFJS.maxImageSize = PDFJS.maxImageSize === undefined ? -1 : PDFJS.maxImageSize;\nPDFJS.cMapUrl = PDFJS.cMapUrl === undefined ? null : PDFJS.cMapUrl;\nPDFJS.cMapPacked = PDFJS.cMapPacked === undefined ? false : PDFJS.cMapPacked;\nPDFJS.disableFontFace = PDFJS.disableFontFace === undefined ? false : PDFJS.disableFontFace;\nPDFJS.imageResourcesPath = PDFJS.imageResourcesPath === undefined ? '' : PDFJS.imageResourcesPath;\nPDFJS.disableWorker = PDFJS.disableWorker === undefined ? false : PDFJS.disableWorker;\nPDFJS.workerSrc = PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc;\nPDFJS.workerPort = PDFJS.workerPort === undefined ? null : PDFJS.workerPort;\nPDFJS.disableRange = PDFJS.disableRange === undefined ? false : PDFJS.disableRange;\nPDFJS.disableStream = PDFJS.disableStream === undefined ? false : PDFJS.disableStream;\nPDFJS.disableAutoFetch = PDFJS.disableAutoFetch === undefined ? false : PDFJS.disableAutoFetch;\nPDFJS.pdfBug = PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug;\nPDFJS.postMessageTransfers = PDFJS.postMessageTransfers === undefined ? true : PDFJS.postMessageTransfers;\nPDFJS.disableCreateObjectURL = PDFJS.disableCreateObjectURL === undefined ? false : PDFJS.disableCreateObjectURL;\nPDFJS.disableWebGL = PDFJS.disableWebGL === undefined ? true : PDFJS.disableWebGL;\nPDFJS.externalLinkTarget = PDFJS.externalLinkTarget === undefined ? _dom_utils.LinkTarget.NONE : PDFJS.externalLinkTarget;\nPDFJS.externalLinkRel = PDFJS.externalLinkRel === undefined ? _dom_utils.DEFAULT_LINK_REL : PDFJS.externalLinkRel;\nPDFJS.isEvalSupported = PDFJS.isEvalSupported === undefined ? true : PDFJS.isEvalSupported;\nPDFJS.pdfjsNext = PDFJS.pdfjsNext === undefined ? false : PDFJS.pdfjsNext;\n{\n  var savedOpenExternalLinksInNewWindow = PDFJS.openExternalLinksInNewWindow;\n  delete PDFJS.openExternalLinksInNewWindow;\n  Object.defineProperty(PDFJS, 'openExternalLinksInNewWindow', {\n    get: function get() {\n      return PDFJS.externalLinkTarget === _dom_utils.LinkTarget.BLANK;\n    },\n    set: function set(value) {\n      if (value) {\n        (0, _util.deprecated)('PDFJS.openExternalLinksInNewWindow, please use ' + '\"PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK\" instead.');\n      }\n      if (PDFJS.externalLinkTarget !== _dom_utils.LinkTarget.NONE) {\n        (0, _util.warn)('PDFJS.externalLinkTarget is already initialized');\n        return;\n      }\n      PDFJS.externalLinkTarget = value ? _dom_utils.LinkTarget.BLANK : _dom_utils.LinkTarget.NONE;\n    },\n\n    enumerable: true,\n    configurable: true\n  });\n  if (savedOpenExternalLinksInNewWindow) {\n    PDFJS.openExternalLinksInNewWindow = savedOpenExternalLinksInNewWindow;\n  }\n}\nPDFJS.getDocument = _api.getDocument;\nPDFJS.LoopbackPort = _api.LoopbackPort;\nPDFJS.PDFDataRangeTransport = _api.PDFDataRangeTransport;\nPDFJS.PDFWorker = _api.PDFWorker;\nPDFJS.hasCanvasTypedArrays = true;\nPDFJS.CustomStyle = _dom_utils.CustomStyle;\nPDFJS.LinkTarget = _dom_utils.LinkTarget;\nPDFJS.addLinkAttributes = _dom_utils.addLinkAttributes;\nPDFJS.getFilenameFromUrl = _dom_utils.getFilenameFromUrl;\nPDFJS.isExternalLinkTargetSet = _dom_utils.isExternalLinkTargetSet;\nPDFJS.AnnotationLayer = _annotation_layer.AnnotationLayer;\nPDFJS.renderTextLayer = _text_layer.renderTextLayer;\nPDFJS.Metadata = _metadata.Metadata;\nPDFJS.SVGGraphics = _svg.SVGGraphics;\nPDFJS.UnsupportedManager = _api._UnsupportedManager;\nexports.globalScope = _util.globalScope;\nexports.isWorker = isWorker;\nexports.PDFJS = PDFJS;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.NetworkManager = exports.PDFNetworkStream = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _api = __w_pdfjs_require__(2);\n\n;\nvar OK_RESPONSE = 200;\nvar PARTIAL_CONTENT_RESPONSE = 206;\nfunction NetworkManager(url, args) {\n  this.url = url;\n  args = args || {};\n  this.isHttp = /^https?:/i.test(url);\n  this.httpHeaders = this.isHttp && args.httpHeaders || {};\n  this.withCredentials = args.withCredentials || false;\n  this.getXhr = args.getXhr || function NetworkManager_getXhr() {\n    return new XMLHttpRequest();\n  };\n  this.currXhrId = 0;\n  this.pendingRequests = Object.create(null);\n  this.loadedRequests = Object.create(null);\n}\nfunction getArrayBuffer(xhr) {\n  var data = xhr.response;\n  if (typeof data !== 'string') {\n    return data;\n  }\n  var length = data.length;\n  var array = new Uint8Array(length);\n  for (var i = 0; i < length; i++) {\n    array[i] = data.charCodeAt(i) & 0xFF;\n  }\n  return array.buffer;\n}\nvar supportsMozChunked = function supportsMozChunkedClosure() {\n  try {\n    var x = new XMLHttpRequest();\n    x.open('GET', _util.globalScope.location.href);\n    x.responseType = 'moz-chunked-arraybuffer';\n    return x.responseType === 'moz-chunked-arraybuffer';\n  } catch (e) {\n    return false;\n  }\n}();\nNetworkManager.prototype = {\n  requestRange: function NetworkManager_requestRange(begin, end, listeners) {\n    var args = {\n      begin: begin,\n      end: end\n    };\n    for (var prop in listeners) {\n      args[prop] = listeners[prop];\n    }\n    return this.request(args);\n  },\n  requestFull: function NetworkManager_requestFull(listeners) {\n    return this.request(listeners);\n  },\n  request: function NetworkManager_request(args) {\n    var xhr = this.getXhr();\n    var xhrId = this.currXhrId++;\n    var pendingRequest = this.pendingRequests[xhrId] = { xhr: xhr };\n    xhr.open('GET', this.url);\n    xhr.withCredentials = this.withCredentials;\n    for (var property in this.httpHeaders) {\n      var value = this.httpHeaders[property];\n      if (typeof value === 'undefined') {\n        continue;\n      }\n      xhr.setRequestHeader(property, value);\n    }\n    if (this.isHttp && 'begin' in args && 'end' in args) {\n      var rangeStr = args.begin + '-' + (args.end - 1);\n      xhr.setRequestHeader('Range', 'bytes=' + rangeStr);\n      pendingRequest.expectedStatus = 206;\n    } else {\n      pendingRequest.expectedStatus = 200;\n    }\n    var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData;\n    if (useMozChunkedLoading) {\n      xhr.responseType = 'moz-chunked-arraybuffer';\n      pendingRequest.onProgressiveData = args.onProgressiveData;\n      pendingRequest.mozChunked = true;\n    } else {\n      xhr.responseType = 'arraybuffer';\n    }\n    if (args.onError) {\n      xhr.onerror = function (evt) {\n        args.onError(xhr.status);\n      };\n    }\n    xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);\n    xhr.onprogress = this.onProgress.bind(this, xhrId);\n    pendingRequest.onHeadersReceived = args.onHeadersReceived;\n    pendingRequest.onDone = args.onDone;\n    pendingRequest.onError = args.onError;\n    pendingRequest.onProgress = args.onProgress;\n    xhr.send(null);\n    return xhrId;\n  },\n  onProgress: function NetworkManager_onProgress(xhrId, evt) {\n    var pendingRequest = this.pendingRequests[xhrId];\n    if (!pendingRequest) {\n      return;\n    }\n    if (pendingRequest.mozChunked) {\n      var chunk = getArrayBuffer(pendingRequest.xhr);\n      pendingRequest.onProgressiveData(chunk);\n    }\n    var onProgress = pendingRequest.onProgress;\n    if (onProgress) {\n      onProgress(evt);\n    }\n  },\n  onStateChange: function NetworkManager_onStateChange(xhrId, evt) {\n    var pendingRequest = this.pendingRequests[xhrId];\n    if (!pendingRequest) {\n      return;\n    }\n    var xhr = pendingRequest.xhr;\n    if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {\n      pendingRequest.onHeadersReceived();\n      delete pendingRequest.onHeadersReceived;\n    }\n    if (xhr.readyState !== 4) {\n      return;\n    }\n    if (!(xhrId in this.pendingRequests)) {\n      return;\n    }\n    delete this.pendingRequests[xhrId];\n    if (xhr.status === 0 && this.isHttp) {\n      if (pendingRequest.onError) {\n        pendingRequest.onError(xhr.status);\n      }\n      return;\n    }\n    var xhrStatus = xhr.status || OK_RESPONSE;\n    var ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;\n    if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) {\n      if (pendingRequest.onError) {\n        pendingRequest.onError(xhr.status);\n      }\n      return;\n    }\n    this.loadedRequests[xhrId] = true;\n    var chunk = getArrayBuffer(xhr);\n    if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {\n      var rangeHeader = xhr.getResponseHeader('Content-Range');\n      var matches = /bytes (\\d+)-(\\d+)\\/(\\d+)/.exec(rangeHeader);\n      var begin = parseInt(matches[1], 10);\n      pendingRequest.onDone({\n        begin: begin,\n        chunk: chunk\n      });\n    } else if (pendingRequest.onProgressiveData) {\n      pendingRequest.onDone(null);\n    } else if (chunk) {\n      pendingRequest.onDone({\n        begin: 0,\n        chunk: chunk\n      });\n    } else if (pendingRequest.onError) {\n      pendingRequest.onError(xhr.status);\n    }\n  },\n  hasPendingRequests: function NetworkManager_hasPendingRequests() {\n    for (var xhrId in this.pendingRequests) {\n      return true;\n    }\n    return false;\n  },\n  getRequestXhr: function NetworkManager_getXhr(xhrId) {\n    return this.pendingRequests[xhrId].xhr;\n  },\n  isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) {\n    return !!this.pendingRequests[xhrId].onProgressiveData;\n  },\n  isPendingRequest: function NetworkManager_isPendingRequest(xhrId) {\n    return xhrId in this.pendingRequests;\n  },\n  isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) {\n    return xhrId in this.loadedRequests;\n  },\n  abortAllRequests: function NetworkManager_abortAllRequests() {\n    for (var xhrId in this.pendingRequests) {\n      this.abortRequest(xhrId | 0);\n    }\n  },\n  abortRequest: function NetworkManager_abortRequest(xhrId) {\n    var xhr = this.pendingRequests[xhrId].xhr;\n    delete this.pendingRequests[xhrId];\n    xhr.abort();\n  }\n};\nfunction PDFNetworkStream(options) {\n  this._options = options;\n  var source = options.source;\n  this._manager = new NetworkManager(source.url, {\n    httpHeaders: source.httpHeaders,\n    withCredentials: source.withCredentials\n  });\n  this._rangeChunkSize = source.rangeChunkSize;\n  this._fullRequestReader = null;\n  this._rangeRequestReaders = [];\n}\nPDFNetworkStream.prototype = {\n  _onRangeRequestReaderClosed: function PDFNetworkStream_onRangeRequestReaderClosed(reader) {\n    var i = this._rangeRequestReaders.indexOf(reader);\n    if (i >= 0) {\n      this._rangeRequestReaders.splice(i, 1);\n    }\n  },\n  getFullReader: function PDFNetworkStream_getFullReader() {\n    (0, _util.assert)(!this._fullRequestReader);\n    this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._options);\n    return this._fullRequestReader;\n  },\n  getRangeReader: function PDFNetworkStream_getRangeReader(begin, end) {\n    var reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end);\n    reader.onClosed = this._onRangeRequestReaderClosed.bind(this);\n    this._rangeRequestReaders.push(reader);\n    return reader;\n  },\n  cancelAllRequests: function PDFNetworkStream_cancelAllRequests(reason) {\n    if (this._fullRequestReader) {\n      this._fullRequestReader.cancel(reason);\n    }\n    var readers = this._rangeRequestReaders.slice(0);\n    readers.forEach(function (reader) {\n      reader.cancel(reason);\n    });\n  }\n};\nfunction PDFNetworkStreamFullRequestReader(manager, options) {\n  this._manager = manager;\n  var source = options.source;\n  var args = {\n    onHeadersReceived: this._onHeadersReceived.bind(this),\n    onProgressiveData: source.disableStream ? null : this._onProgressiveData.bind(this),\n    onDone: this._onDone.bind(this),\n    onError: this._onError.bind(this),\n    onProgress: this._onProgress.bind(this)\n  };\n  this._url = source.url;\n  this._fullRequestId = manager.requestFull(args);\n  this._headersReceivedCapability = (0, _util.createPromiseCapability)();\n  this._disableRange = options.disableRange || false;\n  this._contentLength = source.length;\n  this._rangeChunkSize = source.rangeChunkSize;\n  if (!this._rangeChunkSize && !this._disableRange) {\n    this._disableRange = true;\n  }\n  this._isStreamingSupported = false;\n  this._isRangeSupported = false;\n  this._cachedChunks = [];\n  this._requests = [];\n  this._done = false;\n  this._storedError = undefined;\n  this.onProgress = null;\n}\nPDFNetworkStreamFullRequestReader.prototype = {\n  _validateRangeRequestCapabilities: function PDFNetworkStreamFullRequestReader_validateRangeRequestCapabilities() {\n    if (this._disableRange) {\n      return false;\n    }\n    var networkManager = this._manager;\n    if (!networkManager.isHttp) {\n      return false;\n    }\n    var fullRequestXhrId = this._fullRequestId;\n    var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId);\n    if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') {\n      return false;\n    }\n    var contentEncoding = fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity';\n    if (contentEncoding !== 'identity') {\n      return false;\n    }\n    var length = fullRequestXhr.getResponseHeader('Content-Length');\n    length = parseInt(length, 10);\n    if (!(0, _util.isInt)(length)) {\n      return false;\n    }\n    this._contentLength = length;\n    if (length <= 2 * this._rangeChunkSize) {\n      return false;\n    }\n    return true;\n  },\n  _onHeadersReceived: function PDFNetworkStreamFullRequestReader_onHeadersReceived() {\n    if (this._validateRangeRequestCapabilities()) {\n      this._isRangeSupported = true;\n    }\n    var networkManager = this._manager;\n    var fullRequestXhrId = this._fullRequestId;\n    if (networkManager.isStreamingRequest(fullRequestXhrId)) {\n      this._isStreamingSupported = true;\n    } else if (this._isRangeSupported) {\n      networkManager.abortRequest(fullRequestXhrId);\n    }\n    this._headersReceivedCapability.resolve();\n  },\n  _onProgressiveData: function PDFNetworkStreamFullRequestReader_onProgressiveData(chunk) {\n    if (this._requests.length > 0) {\n      var requestCapability = this._requests.shift();\n      requestCapability.resolve({\n        value: chunk,\n        done: false\n      });\n    } else {\n      this._cachedChunks.push(chunk);\n    }\n  },\n  _onDone: function PDFNetworkStreamFullRequestReader_onDone(args) {\n    if (args) {\n      this._onProgressiveData(args.chunk);\n    }\n    this._done = true;\n    if (this._cachedChunks.length > 0) {\n      return;\n    }\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({\n        value: undefined,\n        done: true\n      });\n    });\n    this._requests = [];\n  },\n  _onError: function PDFNetworkStreamFullRequestReader_onError(status) {\n    var url = this._url;\n    var exception;\n    if (status === 404 || status === 0 && /^file:/.test(url)) {\n      exception = new _util.MissingPDFException('Missing PDF \"' + url + '\".');\n    } else {\n      exception = new _util.UnexpectedResponseException('Unexpected server response (' + status + ') while retrieving PDF \"' + url + '\".', status);\n    }\n    this._storedError = exception;\n    this._headersReceivedCapability.reject(exception);\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.reject(exception);\n    });\n    this._requests = [];\n    this._cachedChunks = [];\n  },\n  _onProgress: function PDFNetworkStreamFullRequestReader_onProgress(data) {\n    if (this.onProgress) {\n      this.onProgress({\n        loaded: data.loaded,\n        total: data.lengthComputable ? data.total : this._contentLength\n      });\n    }\n  },\n  get isRangeSupported() {\n    return this._isRangeSupported;\n  },\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  },\n  get contentLength() {\n    return this._contentLength;\n  },\n  get headersReady() {\n    return this._headersReceivedCapability.promise;\n  },\n  read: function PDFNetworkStreamFullRequestReader_read() {\n    if (this._storedError) {\n      return Promise.reject(this._storedError);\n    }\n    if (this._cachedChunks.length > 0) {\n      var chunk = this._cachedChunks.shift();\n      return Promise.resolve({\n        value: chunk,\n        done: false\n      });\n    }\n    if (this._done) {\n      return Promise.resolve({\n        value: undefined,\n        done: true\n      });\n    }\n    var requestCapability = (0, _util.createPromiseCapability)();\n    this._requests.push(requestCapability);\n    return requestCapability.promise;\n  },\n  cancel: function PDFNetworkStreamFullRequestReader_cancel(reason) {\n    this._done = true;\n    this._headersReceivedCapability.reject(reason);\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({\n        value: undefined,\n        done: true\n      });\n    });\n    this._requests = [];\n    if (this._manager.isPendingRequest(this._fullRequestId)) {\n      this._manager.abortRequest(this._fullRequestId);\n    }\n    this._fullRequestReader = null;\n  }\n};\nfunction PDFNetworkStreamRangeRequestReader(manager, begin, end) {\n  this._manager = manager;\n  var args = {\n    onDone: this._onDone.bind(this),\n    onProgress: this._onProgress.bind(this)\n  };\n  this._requestId = manager.requestRange(begin, end, args);\n  this._requests = [];\n  this._queuedChunk = null;\n  this._done = false;\n  this.onProgress = null;\n  this.onClosed = null;\n}\nPDFNetworkStreamRangeRequestReader.prototype = {\n  _close: function PDFNetworkStreamRangeRequestReader_close() {\n    if (this.onClosed) {\n      this.onClosed(this);\n    }\n  },\n  _onDone: function PDFNetworkStreamRangeRequestReader_onDone(data) {\n    var chunk = data.chunk;\n    if (this._requests.length > 0) {\n      var requestCapability = this._requests.shift();\n      requestCapability.resolve({\n        value: chunk,\n        done: false\n      });\n    } else {\n      this._queuedChunk = chunk;\n    }\n    this._done = true;\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({\n        value: undefined,\n        done: true\n      });\n    });\n    this._requests = [];\n    this._close();\n  },\n  _onProgress: function PDFNetworkStreamRangeRequestReader_onProgress(evt) {\n    if (!this.isStreamingSupported && this.onProgress) {\n      this.onProgress({ loaded: evt.loaded });\n    }\n  },\n  get isStreamingSupported() {\n    return false;\n  },\n  read: function PDFNetworkStreamRangeRequestReader_read() {\n    if (this._queuedChunk !== null) {\n      var chunk = this._queuedChunk;\n      this._queuedChunk = null;\n      return Promise.resolve({\n        value: chunk,\n        done: false\n      });\n    }\n    if (this._done) {\n      return Promise.resolve({\n        value: undefined,\n        done: true\n      });\n    }\n    var requestCapability = (0, _util.createPromiseCapability)();\n    this._requests.push(requestCapability);\n    return requestCapability.promise;\n  },\n  cancel: function PDFNetworkStreamRangeRequestReader_cancel(reason) {\n    this._done = true;\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({\n        value: undefined,\n        done: true\n      });\n    });\n    this._requests = [];\n    if (this._manager.isPendingRequest(this._requestId)) {\n      this._manager.abortRequest(this._requestId);\n    }\n    this._close();\n  }\n};\n(0, _api.setPDFNetworkStreamClass)(PDFNetworkStream);\nexports.PDFNetworkStream = PDFNetworkStream;\nexports.NetworkManager = NetworkManager;\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _typeof2 = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n(function (e, a) {\n  for (var i in a) {\n    e[i] = a[i];\n  }\n})(exports, function (modules) {\n  var installedModules = {};\n  function __w_pdfjs_require__(moduleId) {\n    if (installedModules[moduleId]) return installedModules[moduleId].exports;\n    var module = installedModules[moduleId] = {\n      i: moduleId,\n      l: false,\n      exports: {}\n    };\n    modules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);\n    module.l = true;\n    return module.exports;\n  }\n  __w_pdfjs_require__.m = modules;\n  __w_pdfjs_require__.c = installedModules;\n  __w_pdfjs_require__.i = function (value) {\n    return value;\n  };\n  __w_pdfjs_require__.d = function (exports, name, getter) {\n    if (!__w_pdfjs_require__.o(exports, name)) {\n      Object.defineProperty(exports, name, {\n        configurable: false,\n        enumerable: true,\n        get: getter\n      });\n    }\n  };\n  __w_pdfjs_require__.n = function (module) {\n    var getter = module && module.__esModule ? function getDefault() {\n      return module['default'];\n    } : function getModuleExports() {\n      return module;\n    };\n    __w_pdfjs_require__.d(getter, 'a', getter);\n    return getter;\n  };\n  __w_pdfjs_require__.o = function (object, property) {\n    return Object.prototype.hasOwnProperty.call(object, property);\n  };\n  __w_pdfjs_require__.p = \"\";\n  return __w_pdfjs_require__(__w_pdfjs_require__.s = 7);\n}([function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _typeof = typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\" ? function (obj) {\n    return typeof obj === 'undefined' ? 'undefined' : _typeof2(obj);\n  } : function (obj) {\n    return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj === 'undefined' ? 'undefined' : _typeof2(obj);\n  };\n  var _require = __w_pdfjs_require__(1),\n      assert = _require.assert;\n  function IsPropertyKey(argument) {\n    return typeof argument === 'string' || (typeof argument === 'undefined' ? 'undefined' : _typeof(argument)) === 'symbol';\n  }\n  exports.typeIsObject = function (x) {\n    return (typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'object' && x !== null || typeof x === 'function';\n  };\n  exports.createDataProperty = function (o, p, v) {\n    assert(exports.typeIsObject(o));\n    Object.defineProperty(o, p, {\n      value: v,\n      writable: true,\n      enumerable: true,\n      configurable: true\n    });\n  };\n  exports.createArrayFromList = function (elements) {\n    return elements.slice();\n  };\n  exports.ArrayBufferCopy = function (dest, destOffset, src, srcOffset, n) {\n    new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset);\n  };\n  exports.CreateIterResultObject = function (value, done) {\n    assert(typeof done === 'boolean');\n    var obj = {};\n    Object.defineProperty(obj, 'value', {\n      value: value,\n      enumerable: true,\n      writable: true,\n      configurable: true\n    });\n    Object.defineProperty(obj, 'done', {\n      value: done,\n      enumerable: true,\n      writable: true,\n      configurable: true\n    });\n    return obj;\n  };\n  exports.IsFiniteNonNegativeNumber = function (v) {\n    if (Number.isNaN(v)) {\n      return false;\n    }\n    if (v === Infinity) {\n      return false;\n    }\n    if (v < 0) {\n      return false;\n    }\n    return true;\n  };\n  function Call(F, V, args) {\n    if (typeof F !== 'function') {\n      throw new TypeError('Argument is not a function');\n    }\n    return Function.prototype.apply.call(F, V, args);\n  }\n  exports.InvokeOrNoop = function (O, P, args) {\n    assert(O !== undefined);\n    assert(IsPropertyKey(P));\n    assert(Array.isArray(args));\n    var method = O[P];\n    if (method === undefined) {\n      return undefined;\n    }\n    return Call(method, O, args);\n  };\n  exports.PromiseInvokeOrNoop = function (O, P, args) {\n    assert(O !== undefined);\n    assert(IsPropertyKey(P));\n    assert(Array.isArray(args));\n    try {\n      return Promise.resolve(exports.InvokeOrNoop(O, P, args));\n    } catch (returnValueE) {\n      return Promise.reject(returnValueE);\n    }\n  };\n  exports.PromiseInvokeOrPerformFallback = function (O, P, args, F, argsF) {\n    assert(O !== undefined);\n    assert(IsPropertyKey(P));\n    assert(Array.isArray(args));\n    assert(Array.isArray(argsF));\n    var method = void 0;\n    try {\n      method = O[P];\n    } catch (methodE) {\n      return Promise.reject(methodE);\n    }\n    if (method === undefined) {\n      return F.apply(null, argsF);\n    }\n    try {\n      return Promise.resolve(Call(method, O, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n  exports.TransferArrayBuffer = function (O) {\n    return O.slice();\n  };\n  exports.ValidateAndNormalizeHighWaterMark = function (highWaterMark) {\n    highWaterMark = Number(highWaterMark);\n    if (Number.isNaN(highWaterMark) || highWaterMark < 0) {\n      throw new RangeError('highWaterMark property of a queuing strategy must be non-negative and non-NaN');\n    }\n    return highWaterMark;\n  };\n  exports.ValidateAndNormalizeQueuingStrategy = function (size, highWaterMark) {\n    if (size !== undefined && typeof size !== 'function') {\n      throw new TypeError('size property of a queuing strategy must be a function');\n    }\n    highWaterMark = exports.ValidateAndNormalizeHighWaterMark(highWaterMark);\n    return {\n      size: size,\n      highWaterMark: highWaterMark\n    };\n  };\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  function rethrowAssertionErrorRejection(e) {\n    if (e && e.constructor === AssertionError) {\n      setTimeout(function () {\n        throw e;\n      }, 0);\n    }\n  }\n  function AssertionError(message) {\n    this.name = 'AssertionError';\n    this.message = message || '';\n    this.stack = new Error().stack;\n  }\n  AssertionError.prototype = Object.create(Error.prototype);\n  AssertionError.prototype.constructor = AssertionError;\n  function assert(value, message) {\n    if (!value) {\n      throw new AssertionError(message);\n    }\n  }\n  module.exports = {\n    rethrowAssertionErrorRejection: rethrowAssertionErrorRejection,\n    AssertionError: AssertionError,\n    assert: assert\n  };\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n  var _require = __w_pdfjs_require__(0),\n      InvokeOrNoop = _require.InvokeOrNoop,\n      PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,\n      ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,\n      typeIsObject = _require.typeIsObject;\n  var _require2 = __w_pdfjs_require__(1),\n      assert = _require2.assert,\n      rethrowAssertionErrorRejection = _require2.rethrowAssertionErrorRejection;\n  var _require3 = __w_pdfjs_require__(3),\n      DequeueValue = _require3.DequeueValue,\n      EnqueueValueWithSize = _require3.EnqueueValueWithSize,\n      PeekQueueValue = _require3.PeekQueueValue,\n      ResetQueue = _require3.ResetQueue;\n  var WritableStream = function () {\n    function WritableStream() {\n      var underlyingSink = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          size = _ref.size,\n          _ref$highWaterMark = _ref.highWaterMark,\n          highWaterMark = _ref$highWaterMark === undefined ? 1 : _ref$highWaterMark;\n      _classCallCheck(this, WritableStream);\n      this._state = 'writable';\n      this._storedError = undefined;\n      this._writer = undefined;\n      this._writableStreamController = undefined;\n      this._writeRequests = [];\n      this._inFlightWriteRequest = undefined;\n      this._closeRequest = undefined;\n      this._inFlightCloseRequest = undefined;\n      this._pendingAbortRequest = undefined;\n      this._backpressure = false;\n      var type = underlyingSink.type;\n      if (type !== undefined) {\n        throw new RangeError('Invalid type is specified');\n      }\n      this._writableStreamController = new WritableStreamDefaultController(this, underlyingSink, size, highWaterMark);\n      this._writableStreamController.__startSteps();\n    }\n    _createClass(WritableStream, [{\n      key: 'abort',\n      value: function abort(reason) {\n        if (IsWritableStream(this) === false) {\n          return Promise.reject(streamBrandCheckException('abort'));\n        }\n        if (IsWritableStreamLocked(this) === true) {\n          return Promise.reject(new TypeError('Cannot abort a stream that already has a writer'));\n        }\n        return WritableStreamAbort(this, reason);\n      }\n    }, {\n      key: 'getWriter',\n      value: function getWriter() {\n        if (IsWritableStream(this) === false) {\n          throw streamBrandCheckException('getWriter');\n        }\n        return AcquireWritableStreamDefaultWriter(this);\n      }\n    }, {\n      key: 'locked',\n      get: function get() {\n        if (IsWritableStream(this) === false) {\n          throw streamBrandCheckException('locked');\n        }\n        return IsWritableStreamLocked(this);\n      }\n    }]);\n    return WritableStream;\n  }();\n  module.exports = {\n    AcquireWritableStreamDefaultWriter: AcquireWritableStreamDefaultWriter,\n    IsWritableStream: IsWritableStream,\n    IsWritableStreamLocked: IsWritableStreamLocked,\n    WritableStream: WritableStream,\n    WritableStreamAbort: WritableStreamAbort,\n    WritableStreamDefaultControllerError: WritableStreamDefaultControllerError,\n    WritableStreamDefaultWriterCloseWithErrorPropagation: WritableStreamDefaultWriterCloseWithErrorPropagation,\n    WritableStreamDefaultWriterRelease: WritableStreamDefaultWriterRelease,\n    WritableStreamDefaultWriterWrite: WritableStreamDefaultWriterWrite,\n    WritableStreamCloseQueuedOrInFlight: WritableStreamCloseQueuedOrInFlight\n  };\n  function AcquireWritableStreamDefaultWriter(stream) {\n    return new WritableStreamDefaultWriter(stream);\n  }\n  function IsWritableStream(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) {\n      return false;\n    }\n    return true;\n  }\n  function IsWritableStreamLocked(stream) {\n    assert(IsWritableStream(stream) === true, 'IsWritableStreamLocked should only be used on known writable streams');\n    if (stream._writer === undefined) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamAbort(stream, reason) {\n    var state = stream._state;\n    if (state === 'closed') {\n      return Promise.resolve(undefined);\n    }\n    if (state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    var error = new TypeError('Requested to abort');\n    if (stream._pendingAbortRequest !== undefined) {\n      return Promise.reject(error);\n    }\n    assert(state === 'writable' || state === 'erroring', 'state must be writable or erroring');\n    var wasAlreadyErroring = false;\n    if (state === 'erroring') {\n      wasAlreadyErroring = true;\n      reason = undefined;\n    }\n    var promise = new Promise(function (resolve, reject) {\n      stream._pendingAbortRequest = {\n        _resolve: resolve,\n        _reject: reject,\n        _reason: reason,\n        _wasAlreadyErroring: wasAlreadyErroring\n      };\n    });\n    if (wasAlreadyErroring === false) {\n      WritableStreamStartErroring(stream, error);\n    }\n    return promise;\n  }\n  function WritableStreamAddWriteRequest(stream) {\n    assert(IsWritableStreamLocked(stream) === true);\n    assert(stream._state === 'writable');\n    var promise = new Promise(function (resolve, reject) {\n      var writeRequest = {\n        _resolve: resolve,\n        _reject: reject\n      };\n      stream._writeRequests.push(writeRequest);\n    });\n    return promise;\n  }\n  function WritableStreamDealWithRejection(stream, error) {\n    var state = stream._state;\n    if (state === 'writable') {\n      WritableStreamStartErroring(stream, error);\n      return;\n    }\n    assert(state === 'erroring');\n    WritableStreamFinishErroring(stream);\n  }\n  function WritableStreamStartErroring(stream, reason) {\n    assert(stream._storedError === undefined, 'stream._storedError === undefined');\n    assert(stream._state === 'writable', 'state must be writable');\n    var controller = stream._writableStreamController;\n    assert(controller !== undefined, 'controller must not be undefined');\n    stream._state = 'erroring';\n    stream._storedError = reason;\n    var writer = stream._writer;\n    if (writer !== undefined) {\n      WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason);\n    }\n    if (WritableStreamHasOperationMarkedInFlight(stream) === false && controller._started === true) {\n      WritableStreamFinishErroring(stream);\n    }\n  }\n  function WritableStreamFinishErroring(stream) {\n    assert(stream._state === 'erroring', 'stream._state === erroring');\n    assert(WritableStreamHasOperationMarkedInFlight(stream) === false, 'WritableStreamHasOperationMarkedInFlight(stream) === false');\n    stream._state = 'errored';\n    stream._writableStreamController.__errorSteps();\n    var storedError = stream._storedError;\n    for (var i = 0; i < stream._writeRequests.length; i++) {\n      var writeRequest = stream._writeRequests[i];\n      writeRequest._reject(storedError);\n    }\n    stream._writeRequests = [];\n    if (stream._pendingAbortRequest === undefined) {\n      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n      return;\n    }\n    var abortRequest = stream._pendingAbortRequest;\n    stream._pendingAbortRequest = undefined;\n    if (abortRequest._wasAlreadyErroring === true) {\n      abortRequest._reject(storedError);\n      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n      return;\n    }\n    var promise = stream._writableStreamController.__abortSteps(abortRequest._reason);\n    promise.then(function () {\n      abortRequest._resolve();\n      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n    }, function (reason) {\n      abortRequest._reject(reason);\n      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n    });\n  }\n  function WritableStreamFinishInFlightWrite(stream) {\n    assert(stream._inFlightWriteRequest !== undefined);\n    stream._inFlightWriteRequest._resolve(undefined);\n    stream._inFlightWriteRequest = undefined;\n  }\n  function WritableStreamFinishInFlightWriteWithError(stream, error) {\n    assert(stream._inFlightWriteRequest !== undefined);\n    stream._inFlightWriteRequest._reject(error);\n    stream._inFlightWriteRequest = undefined;\n    assert(stream._state === 'writable' || stream._state === 'erroring');\n    WritableStreamDealWithRejection(stream, error);\n  }\n  function WritableStreamFinishInFlightClose(stream) {\n    assert(stream._inFlightCloseRequest !== undefined);\n    stream._inFlightCloseRequest._resolve(undefined);\n    stream._inFlightCloseRequest = undefined;\n    var state = stream._state;\n    assert(state === 'writable' || state === 'erroring');\n    if (state === 'erroring') {\n      stream._storedError = undefined;\n      if (stream._pendingAbortRequest !== undefined) {\n        stream._pendingAbortRequest._resolve();\n        stream._pendingAbortRequest = undefined;\n      }\n    }\n    stream._state = 'closed';\n    var writer = stream._writer;\n    if (writer !== undefined) {\n      defaultWriterClosedPromiseResolve(writer);\n    }\n    assert(stream._pendingAbortRequest === undefined, 'stream._pendingAbortRequest === undefined');\n    assert(stream._storedError === undefined, 'stream._storedError === undefined');\n  }\n  function WritableStreamFinishInFlightCloseWithError(stream, error) {\n    assert(stream._inFlightCloseRequest !== undefined);\n    stream._inFlightCloseRequest._reject(error);\n    stream._inFlightCloseRequest = undefined;\n    assert(stream._state === 'writable' || stream._state === 'erroring');\n    if (stream._pendingAbortRequest !== undefined) {\n      stream._pendingAbortRequest._reject(error);\n      stream._pendingAbortRequest = undefined;\n    }\n    WritableStreamDealWithRejection(stream, error);\n  }\n  function WritableStreamCloseQueuedOrInFlight(stream) {\n    if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamHasOperationMarkedInFlight(stream) {\n    if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamMarkCloseRequestInFlight(stream) {\n    assert(stream._inFlightCloseRequest === undefined);\n    assert(stream._closeRequest !== undefined);\n    stream._inFlightCloseRequest = stream._closeRequest;\n    stream._closeRequest = undefined;\n  }\n  function WritableStreamMarkFirstWriteRequestInFlight(stream) {\n    assert(stream._inFlightWriteRequest === undefined, 'there must be no pending write request');\n    assert(stream._writeRequests.length !== 0, 'writeRequests must not be empty');\n    stream._inFlightWriteRequest = stream._writeRequests.shift();\n  }\n  function WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) {\n    assert(stream._state === 'errored', '_stream_.[[state]] is `\"errored\"`');\n    if (stream._closeRequest !== undefined) {\n      assert(stream._inFlightCloseRequest === undefined);\n      stream._closeRequest._reject(stream._storedError);\n      stream._closeRequest = undefined;\n    }\n    var writer = stream._writer;\n    if (writer !== undefined) {\n      defaultWriterClosedPromiseReject(writer, stream._storedError);\n      writer._closedPromise.catch(function () {});\n    }\n  }\n  function WritableStreamUpdateBackpressure(stream, backpressure) {\n    assert(stream._state === 'writable');\n    assert(WritableStreamCloseQueuedOrInFlight(stream) === false);\n    var writer = stream._writer;\n    if (writer !== undefined && backpressure !== stream._backpressure) {\n      if (backpressure === true) {\n        defaultWriterReadyPromiseReset(writer);\n      } else {\n        assert(backpressure === false);\n        defaultWriterReadyPromiseResolve(writer);\n      }\n    }\n    stream._backpressure = backpressure;\n  }\n  var WritableStreamDefaultWriter = function () {\n    function WritableStreamDefaultWriter(stream) {\n      _classCallCheck(this, WritableStreamDefaultWriter);\n      if (IsWritableStream(stream) === false) {\n        throw new TypeError('WritableStreamDefaultWriter can only be constructed with a WritableStream instance');\n      }\n      if (IsWritableStreamLocked(stream) === true) {\n        throw new TypeError('This stream has already been locked for exclusive writing by another writer');\n      }\n      this._ownerWritableStream = stream;\n      stream._writer = this;\n      var state = stream._state;\n      if (state === 'writable') {\n        if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._backpressure === true) {\n          defaultWriterReadyPromiseInitialize(this);\n        } else {\n          defaultWriterReadyPromiseInitializeAsResolved(this);\n        }\n        defaultWriterClosedPromiseInitialize(this);\n      } else if (state === 'erroring') {\n        defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError);\n        this._readyPromise.catch(function () {});\n        defaultWriterClosedPromiseInitialize(this);\n      } else if (state === 'closed') {\n        defaultWriterReadyPromiseInitializeAsResolved(this);\n        defaultWriterClosedPromiseInitializeAsResolved(this);\n      } else {\n        assert(state === 'errored', 'state must be errored');\n        var storedError = stream._storedError;\n        defaultWriterReadyPromiseInitializeAsRejected(this, storedError);\n        this._readyPromise.catch(function () {});\n        defaultWriterClosedPromiseInitializeAsRejected(this, storedError);\n        this._closedPromise.catch(function () {});\n      }\n    }\n    _createClass(WritableStreamDefaultWriter, [{\n      key: 'abort',\n      value: function abort(reason) {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('abort'));\n        }\n        if (this._ownerWritableStream === undefined) {\n          return Promise.reject(defaultWriterLockException('abort'));\n        }\n        return WritableStreamDefaultWriterAbort(this, reason);\n      }\n    }, {\n      key: 'close',\n      value: function close() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('close'));\n        }\n        var stream = this._ownerWritableStream;\n        if (stream === undefined) {\n          return Promise.reject(defaultWriterLockException('close'));\n        }\n        if (WritableStreamCloseQueuedOrInFlight(stream) === true) {\n          return Promise.reject(new TypeError('cannot close an already-closing stream'));\n        }\n        return WritableStreamDefaultWriterClose(this);\n      }\n    }, {\n      key: 'releaseLock',\n      value: function releaseLock() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          throw defaultWriterBrandCheckException('releaseLock');\n        }\n        var stream = this._ownerWritableStream;\n        if (stream === undefined) {\n          return;\n        }\n        assert(stream._writer !== undefined);\n        WritableStreamDefaultWriterRelease(this);\n      }\n    }, {\n      key: 'write',\n      value: function write(chunk) {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('write'));\n        }\n        if (this._ownerWritableStream === undefined) {\n          return Promise.reject(defaultWriterLockException('write to'));\n        }\n        return WritableStreamDefaultWriterWrite(this, chunk);\n      }\n    }, {\n      key: 'closed',\n      get: function get() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('closed'));\n        }\n        return this._closedPromise;\n      }\n    }, {\n      key: 'desiredSize',\n      get: function get() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          throw defaultWriterBrandCheckException('desiredSize');\n        }\n        if (this._ownerWritableStream === undefined) {\n          throw defaultWriterLockException('desiredSize');\n        }\n        return WritableStreamDefaultWriterGetDesiredSize(this);\n      }\n    }, {\n      key: 'ready',\n      get: function get() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('ready'));\n        }\n        return this._readyPromise;\n      }\n    }]);\n    return WritableStreamDefaultWriter;\n  }();\n  function IsWritableStreamDefaultWriter(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamDefaultWriterAbort(writer, reason) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    return WritableStreamAbort(stream, reason);\n  }\n  function WritableStreamDefaultWriterClose(writer) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    var state = stream._state;\n    if (state === 'closed' || state === 'errored') {\n      return Promise.reject(new TypeError('The stream (in ' + state + ' state) is not in the writable state and cannot be closed'));\n    }\n    assert(state === 'writable' || state === 'erroring');\n    assert(WritableStreamCloseQueuedOrInFlight(stream) === false);\n    var promise = new Promise(function (resolve, reject) {\n      var closeRequest = {\n        _resolve: resolve,\n        _reject: reject\n      };\n      stream._closeRequest = closeRequest;\n    });\n    if (stream._backpressure === true && state === 'writable') {\n      defaultWriterReadyPromiseResolve(writer);\n    }\n    WritableStreamDefaultControllerClose(stream._writableStreamController);\n    return promise;\n  }\n  function WritableStreamDefaultWriterCloseWithErrorPropagation(writer) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    var state = stream._state;\n    if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {\n      return Promise.resolve();\n    }\n    if (state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    assert(state === 'writable' || state === 'erroring');\n    return WritableStreamDefaultWriterClose(writer);\n  }\n  function WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) {\n    if (writer._closedPromiseState === 'pending') {\n      defaultWriterClosedPromiseReject(writer, error);\n    } else {\n      defaultWriterClosedPromiseResetToRejected(writer, error);\n    }\n    writer._closedPromise.catch(function () {});\n  }\n  function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) {\n    if (writer._readyPromiseState === 'pending') {\n      defaultWriterReadyPromiseReject(writer, error);\n    } else {\n      defaultWriterReadyPromiseResetToRejected(writer, error);\n    }\n    writer._readyPromise.catch(function () {});\n  }\n  function WritableStreamDefaultWriterGetDesiredSize(writer) {\n    var stream = writer._ownerWritableStream;\n    var state = stream._state;\n    if (state === 'errored' || state === 'erroring') {\n      return null;\n    }\n    if (state === 'closed') {\n      return 0;\n    }\n    return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController);\n  }\n  function WritableStreamDefaultWriterRelease(writer) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    assert(stream._writer === writer);\n    var releasedError = new TypeError('Writer was released and can no longer be used to monitor the stream\\'s closedness');\n    WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError);\n    WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError);\n    stream._writer = undefined;\n    writer._ownerWritableStream = undefined;\n  }\n  function WritableStreamDefaultWriterWrite(writer, chunk) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    var controller = stream._writableStreamController;\n    var chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk);\n    if (stream !== writer._ownerWritableStream) {\n      return Promise.reject(defaultWriterLockException('write to'));\n    }\n    var state = stream._state;\n    if (state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {\n      return Promise.reject(new TypeError('The stream is closing or closed and cannot be written to'));\n    }\n    if (state === 'erroring') {\n      return Promise.reject(stream._storedError);\n    }\n    assert(state === 'writable');\n    var promise = WritableStreamAddWriteRequest(stream);\n    WritableStreamDefaultControllerWrite(controller, chunk, chunkSize);\n    return promise;\n  }\n  var WritableStreamDefaultController = function () {\n    function WritableStreamDefaultController(stream, underlyingSink, size, highWaterMark) {\n      _classCallCheck(this, WritableStreamDefaultController);\n      if (IsWritableStream(stream) === false) {\n        throw new TypeError('WritableStreamDefaultController can only be constructed with a WritableStream instance');\n      }\n      if (stream._writableStreamController !== undefined) {\n        throw new TypeError('WritableStreamDefaultController instances can only be created by the WritableStream constructor');\n      }\n      this._controlledWritableStream = stream;\n      this._underlyingSink = underlyingSink;\n      this._queue = undefined;\n      this._queueTotalSize = undefined;\n      ResetQueue(this);\n      this._started = false;\n      var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);\n      this._strategySize = normalizedStrategy.size;\n      this._strategyHWM = normalizedStrategy.highWaterMark;\n      var backpressure = WritableStreamDefaultControllerGetBackpressure(this);\n      WritableStreamUpdateBackpressure(stream, backpressure);\n    }\n    _createClass(WritableStreamDefaultController, [{\n      key: 'error',\n      value: function error(e) {\n        if (IsWritableStreamDefaultController(this) === false) {\n          throw new TypeError('WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController');\n        }\n        var state = this._controlledWritableStream._state;\n        if (state !== 'writable') {\n          return;\n        }\n        WritableStreamDefaultControllerError(this, e);\n      }\n    }, {\n      key: '__abortSteps',\n      value: function __abortSteps(reason) {\n        return PromiseInvokeOrNoop(this._underlyingSink, 'abort', [reason]);\n      }\n    }, {\n      key: '__errorSteps',\n      value: function __errorSteps() {\n        ResetQueue(this);\n      }\n    }, {\n      key: '__startSteps',\n      value: function __startSteps() {\n        var _this = this;\n        var startResult = InvokeOrNoop(this._underlyingSink, 'start', [this]);\n        var stream = this._controlledWritableStream;\n        Promise.resolve(startResult).then(function () {\n          assert(stream._state === 'writable' || stream._state === 'erroring');\n          _this._started = true;\n          WritableStreamDefaultControllerAdvanceQueueIfNeeded(_this);\n        }, function (r) {\n          assert(stream._state === 'writable' || stream._state === 'erroring');\n          _this._started = true;\n          WritableStreamDealWithRejection(stream, r);\n        }).catch(rethrowAssertionErrorRejection);\n      }\n    }]);\n    return WritableStreamDefaultController;\n  }();\n  function WritableStreamDefaultControllerClose(controller) {\n    EnqueueValueWithSize(controller, 'close', 0);\n    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n  }\n  function WritableStreamDefaultControllerGetChunkSize(controller, chunk) {\n    var strategySize = controller._strategySize;\n    if (strategySize === undefined) {\n      return 1;\n    }\n    try {\n      return strategySize(chunk);\n    } catch (chunkSizeE) {\n      WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);\n      return 1;\n    }\n  }\n  function WritableStreamDefaultControllerGetDesiredSize(controller) {\n    return controller._strategyHWM - controller._queueTotalSize;\n  }\n  function WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) {\n    var writeRecord = { chunk: chunk };\n    try {\n      EnqueueValueWithSize(controller, writeRecord, chunkSize);\n    } catch (enqueueE) {\n      WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);\n      return;\n    }\n    var stream = controller._controlledWritableStream;\n    if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._state === 'writable') {\n      var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);\n      WritableStreamUpdateBackpressure(stream, backpressure);\n    }\n    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n  }\n  function IsWritableStreamDefaultController(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSink')) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) {\n    var stream = controller._controlledWritableStream;\n    if (controller._started === false) {\n      return;\n    }\n    if (stream._inFlightWriteRequest !== undefined) {\n      return;\n    }\n    var state = stream._state;\n    if (state === 'closed' || state === 'errored') {\n      return;\n    }\n    if (state === 'erroring') {\n      WritableStreamFinishErroring(stream);\n      return;\n    }\n    if (controller._queue.length === 0) {\n      return;\n    }\n    var writeRecord = PeekQueueValue(controller);\n    if (writeRecord === 'close') {\n      WritableStreamDefaultControllerProcessClose(controller);\n    } else {\n      WritableStreamDefaultControllerProcessWrite(controller, writeRecord.chunk);\n    }\n  }\n  function WritableStreamDefaultControllerErrorIfNeeded(controller, error) {\n    if (controller._controlledWritableStream._state === 'writable') {\n      WritableStreamDefaultControllerError(controller, error);\n    }\n  }\n  function WritableStreamDefaultControllerProcessClose(controller) {\n    var stream = controller._controlledWritableStream;\n    WritableStreamMarkCloseRequestInFlight(stream);\n    DequeueValue(controller);\n    assert(controller._queue.length === 0, 'queue must be empty once the final write record is dequeued');\n    var sinkClosePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'close', []);\n    sinkClosePromise.then(function () {\n      WritableStreamFinishInFlightClose(stream);\n    }, function (reason) {\n      WritableStreamFinishInFlightCloseWithError(stream, reason);\n    }).catch(rethrowAssertionErrorRejection);\n  }\n  function WritableStreamDefaultControllerProcessWrite(controller, chunk) {\n    var stream = controller._controlledWritableStream;\n    WritableStreamMarkFirstWriteRequestInFlight(stream);\n    var sinkWritePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'write', [chunk, controller]);\n    sinkWritePromise.then(function () {\n      WritableStreamFinishInFlightWrite(stream);\n      var state = stream._state;\n      assert(state === 'writable' || state === 'erroring');\n      DequeueValue(controller);\n      if (WritableStreamCloseQueuedOrInFlight(stream) === false && state === 'writable') {\n        var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);\n        WritableStreamUpdateBackpressure(stream, backpressure);\n      }\n      WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n    }, function (reason) {\n      WritableStreamFinishInFlightWriteWithError(stream, reason);\n    }).catch(rethrowAssertionErrorRejection);\n  }\n  function WritableStreamDefaultControllerGetBackpressure(controller) {\n    var desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller);\n    return desiredSize <= 0;\n  }\n  function WritableStreamDefaultControllerError(controller, error) {\n    var stream = controller._controlledWritableStream;\n    assert(stream._state === 'writable');\n    WritableStreamStartErroring(stream, error);\n  }\n  function streamBrandCheckException(name) {\n    return new TypeError('WritableStream.prototype.' + name + ' can only be used on a WritableStream');\n  }\n  function defaultWriterBrandCheckException(name) {\n    return new TypeError('WritableStreamDefaultWriter.prototype.' + name + ' can only be used on a WritableStreamDefaultWriter');\n  }\n  function defaultWriterLockException(name) {\n    return new TypeError('Cannot ' + name + ' a stream using a released writer');\n  }\n  function defaultWriterClosedPromiseInitialize(writer) {\n    writer._closedPromise = new Promise(function (resolve, reject) {\n      writer._closedPromise_resolve = resolve;\n      writer._closedPromise_reject = reject;\n      writer._closedPromiseState = 'pending';\n    });\n  }\n  function defaultWriterClosedPromiseInitializeAsRejected(writer, reason) {\n    writer._closedPromise = Promise.reject(reason);\n    writer._closedPromise_resolve = undefined;\n    writer._closedPromise_reject = undefined;\n    writer._closedPromiseState = 'rejected';\n  }\n  function defaultWriterClosedPromiseInitializeAsResolved(writer) {\n    writer._closedPromise = Promise.resolve(undefined);\n    writer._closedPromise_resolve = undefined;\n    writer._closedPromise_reject = undefined;\n    writer._closedPromiseState = 'resolved';\n  }\n  function defaultWriterClosedPromiseReject(writer, reason) {\n    assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');\n    assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');\n    assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');\n    writer._closedPromise_reject(reason);\n    writer._closedPromise_resolve = undefined;\n    writer._closedPromise_reject = undefined;\n    writer._closedPromiseState = 'rejected';\n  }\n  function defaultWriterClosedPromiseResetToRejected(writer, reason) {\n    assert(writer._closedPromise_resolve === undefined, 'writer._closedPromise_resolve === undefined');\n    assert(writer._closedPromise_reject === undefined, 'writer._closedPromise_reject === undefined');\n    assert(writer._closedPromiseState !== 'pending', 'writer._closedPromiseState is not pending');\n    writer._closedPromise = Promise.reject(reason);\n    writer._closedPromiseState = 'rejected';\n  }\n  function defaultWriterClosedPromiseResolve(writer) {\n    assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');\n    assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');\n    assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');\n    writer._closedPromise_resolve(undefined);\n    writer._closedPromise_resolve = undefined;\n    writer._closedPromise_reject = undefined;\n    writer._closedPromiseState = 'resolved';\n  }\n  function defaultWriterReadyPromiseInitialize(writer) {\n    writer._readyPromise = new Promise(function (resolve, reject) {\n      writer._readyPromise_resolve = resolve;\n      writer._readyPromise_reject = reject;\n    });\n    writer._readyPromiseState = 'pending';\n  }\n  function defaultWriterReadyPromiseInitializeAsRejected(writer, reason) {\n    writer._readyPromise = Promise.reject(reason);\n    writer._readyPromise_resolve = undefined;\n    writer._readyPromise_reject = undefined;\n    writer._readyPromiseState = 'rejected';\n  }\n  function defaultWriterReadyPromiseInitializeAsResolved(writer) {\n    writer._readyPromise = Promise.resolve(undefined);\n    writer._readyPromise_resolve = undefined;\n    writer._readyPromise_reject = undefined;\n    writer._readyPromiseState = 'fulfilled';\n  }\n  function defaultWriterReadyPromiseReject(writer, reason) {\n    assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');\n    assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');\n    writer._readyPromise_reject(reason);\n    writer._readyPromise_resolve = undefined;\n    writer._readyPromise_reject = undefined;\n    writer._readyPromiseState = 'rejected';\n  }\n  function defaultWriterReadyPromiseReset(writer) {\n    assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');\n    assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');\n    writer._readyPromise = new Promise(function (resolve, reject) {\n      writer._readyPromise_resolve = resolve;\n      writer._readyPromise_reject = reject;\n    });\n    writer._readyPromiseState = 'pending';\n  }\n  function defaultWriterReadyPromiseResetToRejected(writer, reason) {\n    assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');\n    assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');\n    writer._readyPromise = Promise.reject(reason);\n    writer._readyPromiseState = 'rejected';\n  }\n  function defaultWriterReadyPromiseResolve(writer) {\n    assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');\n    assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');\n    writer._readyPromise_resolve(undefined);\n    writer._readyPromise_resolve = undefined;\n    writer._readyPromise_reject = undefined;\n    writer._readyPromiseState = 'fulfilled';\n  }\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _require = __w_pdfjs_require__(0),\n      IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber;\n  var _require2 = __w_pdfjs_require__(1),\n      assert = _require2.assert;\n  exports.DequeueValue = function (container) {\n    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: DequeueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n    assert(container._queue.length > 0, 'Spec-level failure: should never dequeue from an empty queue.');\n    var pair = container._queue.shift();\n    container._queueTotalSize -= pair.size;\n    if (container._queueTotalSize < 0) {\n      container._queueTotalSize = 0;\n    }\n    return pair.value;\n  };\n  exports.EnqueueValueWithSize = function (container, value, size) {\n    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: EnqueueValueWithSize should only be used on containers with [[queue]] and ' + '[[queueTotalSize]].');\n    size = Number(size);\n    if (!IsFiniteNonNegativeNumber(size)) {\n      throw new RangeError('Size must be a finite, non-NaN, non-negative number.');\n    }\n    container._queue.push({\n      value: value,\n      size: size\n    });\n    container._queueTotalSize += size;\n  };\n  exports.PeekQueueValue = function (container) {\n    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: PeekQueueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n    assert(container._queue.length > 0, 'Spec-level failure: should never peek at an empty queue.');\n    var pair = container._queue[0];\n    return pair.value;\n  };\n  exports.ResetQueue = function (container) {\n    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: ResetQueue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n    container._queue = [];\n    container._queueTotalSize = 0;\n  };\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n  var _require = __w_pdfjs_require__(0),\n      ArrayBufferCopy = _require.ArrayBufferCopy,\n      CreateIterResultObject = _require.CreateIterResultObject,\n      IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber,\n      InvokeOrNoop = _require.InvokeOrNoop,\n      PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,\n      TransferArrayBuffer = _require.TransferArrayBuffer,\n      ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,\n      ValidateAndNormalizeHighWaterMark = _require.ValidateAndNormalizeHighWaterMark;\n  var _require2 = __w_pdfjs_require__(0),\n      createArrayFromList = _require2.createArrayFromList,\n      createDataProperty = _require2.createDataProperty,\n      typeIsObject = _require2.typeIsObject;\n  var _require3 = __w_pdfjs_require__(1),\n      assert = _require3.assert,\n      rethrowAssertionErrorRejection = _require3.rethrowAssertionErrorRejection;\n  var _require4 = __w_pdfjs_require__(3),\n      DequeueValue = _require4.DequeueValue,\n      EnqueueValueWithSize = _require4.EnqueueValueWithSize,\n      ResetQueue = _require4.ResetQueue;\n  var _require5 = __w_pdfjs_require__(2),\n      AcquireWritableStreamDefaultWriter = _require5.AcquireWritableStreamDefaultWriter,\n      IsWritableStream = _require5.IsWritableStream,\n      IsWritableStreamLocked = _require5.IsWritableStreamLocked,\n      WritableStreamAbort = _require5.WritableStreamAbort,\n      WritableStreamDefaultWriterCloseWithErrorPropagation = _require5.WritableStreamDefaultWriterCloseWithErrorPropagation,\n      WritableStreamDefaultWriterRelease = _require5.WritableStreamDefaultWriterRelease,\n      WritableStreamDefaultWriterWrite = _require5.WritableStreamDefaultWriterWrite,\n      WritableStreamCloseQueuedOrInFlight = _require5.WritableStreamCloseQueuedOrInFlight;\n  var ReadableStream = function () {\n    function ReadableStream() {\n      var underlyingSource = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          size = _ref.size,\n          highWaterMark = _ref.highWaterMark;\n      _classCallCheck(this, ReadableStream);\n      this._state = 'readable';\n      this._reader = undefined;\n      this._storedError = undefined;\n      this._disturbed = false;\n      this._readableStreamController = undefined;\n      var type = underlyingSource.type;\n      var typeString = String(type);\n      if (typeString === 'bytes') {\n        if (highWaterMark === undefined) {\n          highWaterMark = 0;\n        }\n        this._readableStreamController = new ReadableByteStreamController(this, underlyingSource, highWaterMark);\n      } else if (type === undefined) {\n        if (highWaterMark === undefined) {\n          highWaterMark = 1;\n        }\n        this._readableStreamController = new ReadableStreamDefaultController(this, underlyingSource, size, highWaterMark);\n      } else {\n        throw new RangeError('Invalid type is specified');\n      }\n    }\n    _createClass(ReadableStream, [{\n      key: 'cancel',\n      value: function cancel(reason) {\n        if (IsReadableStream(this) === false) {\n          return Promise.reject(streamBrandCheckException('cancel'));\n        }\n        if (IsReadableStreamLocked(this) === true) {\n          return Promise.reject(new TypeError('Cannot cancel a stream that already has a reader'));\n        }\n        return ReadableStreamCancel(this, reason);\n      }\n    }, {\n      key: 'getReader',\n      value: function getReader() {\n        var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n            mode = _ref2.mode;\n        if (IsReadableStream(this) === false) {\n          throw streamBrandCheckException('getReader');\n        }\n        if (mode === undefined) {\n          return AcquireReadableStreamDefaultReader(this);\n        }\n        mode = String(mode);\n        if (mode === 'byob') {\n          return AcquireReadableStreamBYOBReader(this);\n        }\n        throw new RangeError('Invalid mode is specified');\n      }\n    }, {\n      key: 'pipeThrough',\n      value: function pipeThrough(_ref3, options) {\n        var writable = _ref3.writable,\n            readable = _ref3.readable;\n        var promise = this.pipeTo(writable, options);\n        ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise);\n        return readable;\n      }\n    }, {\n      key: 'pipeTo',\n      value: function pipeTo(dest) {\n        var _this = this;\n        var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n            preventClose = _ref4.preventClose,\n            preventAbort = _ref4.preventAbort,\n            preventCancel = _ref4.preventCancel;\n        if (IsReadableStream(this) === false) {\n          return Promise.reject(streamBrandCheckException('pipeTo'));\n        }\n        if (IsWritableStream(dest) === false) {\n          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo\\'s first argument must be a WritableStream'));\n        }\n        preventClose = Boolean(preventClose);\n        preventAbort = Boolean(preventAbort);\n        preventCancel = Boolean(preventCancel);\n        if (IsReadableStreamLocked(this) === true) {\n          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream'));\n        }\n        if (IsWritableStreamLocked(dest) === true) {\n          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream'));\n        }\n        var reader = AcquireReadableStreamDefaultReader(this);\n        var writer = AcquireWritableStreamDefaultWriter(dest);\n        var shuttingDown = false;\n        var currentWrite = Promise.resolve();\n        return new Promise(function (resolve, reject) {\n          function pipeLoop() {\n            currentWrite = Promise.resolve();\n            if (shuttingDown === true) {\n              return Promise.resolve();\n            }\n            return writer._readyPromise.then(function () {\n              return ReadableStreamDefaultReaderRead(reader).then(function (_ref5) {\n                var value = _ref5.value,\n                    done = _ref5.done;\n                if (done === true) {\n                  return;\n                }\n                currentWrite = WritableStreamDefaultWriterWrite(writer, value).catch(function () {});\n              });\n            }).then(pipeLoop);\n          }\n          isOrBecomesErrored(_this, reader._closedPromise, function (storedError) {\n            if (preventAbort === false) {\n              shutdownWithAction(function () {\n                return WritableStreamAbort(dest, storedError);\n              }, true, storedError);\n            } else {\n              shutdown(true, storedError);\n            }\n          });\n          isOrBecomesErrored(dest, writer._closedPromise, function (storedError) {\n            if (preventCancel === false) {\n              shutdownWithAction(function () {\n                return ReadableStreamCancel(_this, storedError);\n              }, true, storedError);\n            } else {\n              shutdown(true, storedError);\n            }\n          });\n          isOrBecomesClosed(_this, reader._closedPromise, function () {\n            if (preventClose === false) {\n              shutdownWithAction(function () {\n                return WritableStreamDefaultWriterCloseWithErrorPropagation(writer);\n              });\n            } else {\n              shutdown();\n            }\n          });\n          if (WritableStreamCloseQueuedOrInFlight(dest) === true || dest._state === 'closed') {\n            var destClosed = new TypeError('the destination writable stream closed before all data could be piped to it');\n            if (preventCancel === false) {\n              shutdownWithAction(function () {\n                return ReadableStreamCancel(_this, destClosed);\n              }, true, destClosed);\n            } else {\n              shutdown(true, destClosed);\n            }\n          }\n          pipeLoop().catch(function (err) {\n            currentWrite = Promise.resolve();\n            rethrowAssertionErrorRejection(err);\n          });\n          function waitForWritesToFinish() {\n            var oldCurrentWrite = currentWrite;\n            return currentWrite.then(function () {\n              return oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined;\n            });\n          }\n          function isOrBecomesErrored(stream, promise, action) {\n            if (stream._state === 'errored') {\n              action(stream._storedError);\n            } else {\n              promise.catch(action).catch(rethrowAssertionErrorRejection);\n            }\n          }\n          function isOrBecomesClosed(stream, promise, action) {\n            if (stream._state === 'closed') {\n              action();\n            } else {\n              promise.then(action).catch(rethrowAssertionErrorRejection);\n            }\n          }\n          function shutdownWithAction(action, originalIsError, originalError) {\n            if (shuttingDown === true) {\n              return;\n            }\n            shuttingDown = true;\n            if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {\n              waitForWritesToFinish().then(doTheRest);\n            } else {\n              doTheRest();\n            }\n            function doTheRest() {\n              action().then(function () {\n                return finalize(originalIsError, originalError);\n              }, function (newError) {\n                return finalize(true, newError);\n              }).catch(rethrowAssertionErrorRejection);\n            }\n          }\n          function shutdown(isError, error) {\n            if (shuttingDown === true) {\n              return;\n            }\n            shuttingDown = true;\n            if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {\n              waitForWritesToFinish().then(function () {\n                return finalize(isError, error);\n              }).catch(rethrowAssertionErrorRejection);\n            } else {\n              finalize(isError, error);\n            }\n          }\n          function finalize(isError, error) {\n            WritableStreamDefaultWriterRelease(writer);\n            ReadableStreamReaderGenericRelease(reader);\n            if (isError) {\n              reject(error);\n            } else {\n              resolve(undefined);\n            }\n          }\n        });\n      }\n    }, {\n      key: 'tee',\n      value: function tee() {\n        if (IsReadableStream(this) === false) {\n          throw streamBrandCheckException('tee');\n        }\n        var branches = ReadableStreamTee(this, false);\n        return createArrayFromList(branches);\n      }\n    }, {\n      key: 'locked',\n      get: function get() {\n        if (IsReadableStream(this) === false) {\n          throw streamBrandCheckException('locked');\n        }\n        return IsReadableStreamLocked(this);\n      }\n    }]);\n    return ReadableStream;\n  }();\n  module.exports = {\n    ReadableStream: ReadableStream,\n    IsReadableStreamDisturbed: IsReadableStreamDisturbed,\n    ReadableStreamDefaultControllerClose: ReadableStreamDefaultControllerClose,\n    ReadableStreamDefaultControllerEnqueue: ReadableStreamDefaultControllerEnqueue,\n    ReadableStreamDefaultControllerError: ReadableStreamDefaultControllerError,\n    ReadableStreamDefaultControllerGetDesiredSize: ReadableStreamDefaultControllerGetDesiredSize\n  };\n  function AcquireReadableStreamBYOBReader(stream) {\n    return new ReadableStreamBYOBReader(stream);\n  }\n  function AcquireReadableStreamDefaultReader(stream) {\n    return new ReadableStreamDefaultReader(stream);\n  }\n  function IsReadableStream(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) {\n      return false;\n    }\n    return true;\n  }\n  function IsReadableStreamDisturbed(stream) {\n    assert(IsReadableStream(stream) === true, 'IsReadableStreamDisturbed should only be used on known readable streams');\n    return stream._disturbed;\n  }\n  function IsReadableStreamLocked(stream) {\n    assert(IsReadableStream(stream) === true, 'IsReadableStreamLocked should only be used on known readable streams');\n    if (stream._reader === undefined) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableStreamTee(stream, cloneForBranch2) {\n    assert(IsReadableStream(stream) === true);\n    assert(typeof cloneForBranch2 === 'boolean');\n    var reader = AcquireReadableStreamDefaultReader(stream);\n    var teeState = {\n      closedOrErrored: false,\n      canceled1: false,\n      canceled2: false,\n      reason1: undefined,\n      reason2: undefined\n    };\n    teeState.promise = new Promise(function (resolve) {\n      teeState._resolve = resolve;\n    });\n    var pull = create_ReadableStreamTeePullFunction();\n    pull._reader = reader;\n    pull._teeState = teeState;\n    pull._cloneForBranch2 = cloneForBranch2;\n    var cancel1 = create_ReadableStreamTeeBranch1CancelFunction();\n    cancel1._stream = stream;\n    cancel1._teeState = teeState;\n    var cancel2 = create_ReadableStreamTeeBranch2CancelFunction();\n    cancel2._stream = stream;\n    cancel2._teeState = teeState;\n    var underlyingSource1 = Object.create(Object.prototype);\n    createDataProperty(underlyingSource1, 'pull', pull);\n    createDataProperty(underlyingSource1, 'cancel', cancel1);\n    var branch1Stream = new ReadableStream(underlyingSource1);\n    var underlyingSource2 = Object.create(Object.prototype);\n    createDataProperty(underlyingSource2, 'pull', pull);\n    createDataProperty(underlyingSource2, 'cancel', cancel2);\n    var branch2Stream = new ReadableStream(underlyingSource2);\n    pull._branch1 = branch1Stream._readableStreamController;\n    pull._branch2 = branch2Stream._readableStreamController;\n    reader._closedPromise.catch(function (r) {\n      if (teeState.closedOrErrored === true) {\n        return;\n      }\n      ReadableStreamDefaultControllerError(pull._branch1, r);\n      ReadableStreamDefaultControllerError(pull._branch2, r);\n      teeState.closedOrErrored = true;\n    });\n    return [branch1Stream, branch2Stream];\n  }\n  function create_ReadableStreamTeePullFunction() {\n    function f() {\n      var reader = f._reader,\n          branch1 = f._branch1,\n          branch2 = f._branch2,\n          teeState = f._teeState;\n      return ReadableStreamDefaultReaderRead(reader).then(function (result) {\n        assert(typeIsObject(result));\n        var value = result.value;\n        var done = result.done;\n        assert(typeof done === 'boolean');\n        if (done === true && teeState.closedOrErrored === false) {\n          if (teeState.canceled1 === false) {\n            ReadableStreamDefaultControllerClose(branch1);\n          }\n          if (teeState.canceled2 === false) {\n            ReadableStreamDefaultControllerClose(branch2);\n          }\n          teeState.closedOrErrored = true;\n        }\n        if (teeState.closedOrErrored === true) {\n          return;\n        }\n        var value1 = value;\n        var value2 = value;\n        if (teeState.canceled1 === false) {\n          ReadableStreamDefaultControllerEnqueue(branch1, value1);\n        }\n        if (teeState.canceled2 === false) {\n          ReadableStreamDefaultControllerEnqueue(branch2, value2);\n        }\n      });\n    }\n    return f;\n  }\n  function create_ReadableStreamTeeBranch1CancelFunction() {\n    function f(reason) {\n      var stream = f._stream,\n          teeState = f._teeState;\n      teeState.canceled1 = true;\n      teeState.reason1 = reason;\n      if (teeState.canceled2 === true) {\n        var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);\n        var cancelResult = ReadableStreamCancel(stream, compositeReason);\n        teeState._resolve(cancelResult);\n      }\n      return teeState.promise;\n    }\n    return f;\n  }\n  function create_ReadableStreamTeeBranch2CancelFunction() {\n    function f(reason) {\n      var stream = f._stream,\n          teeState = f._teeState;\n      teeState.canceled2 = true;\n      teeState.reason2 = reason;\n      if (teeState.canceled1 === true) {\n        var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);\n        var cancelResult = ReadableStreamCancel(stream, compositeReason);\n        teeState._resolve(cancelResult);\n      }\n      return teeState.promise;\n    }\n    return f;\n  }\n  function ReadableStreamAddReadIntoRequest(stream) {\n    assert(IsReadableStreamBYOBReader(stream._reader) === true);\n    assert(stream._state === 'readable' || stream._state === 'closed');\n    var promise = new Promise(function (resolve, reject) {\n      var readIntoRequest = {\n        _resolve: resolve,\n        _reject: reject\n      };\n      stream._reader._readIntoRequests.push(readIntoRequest);\n    });\n    return promise;\n  }\n  function ReadableStreamAddReadRequest(stream) {\n    assert(IsReadableStreamDefaultReader(stream._reader) === true);\n    assert(stream._state === 'readable');\n    var promise = new Promise(function (resolve, reject) {\n      var readRequest = {\n        _resolve: resolve,\n        _reject: reject\n      };\n      stream._reader._readRequests.push(readRequest);\n    });\n    return promise;\n  }\n  function ReadableStreamCancel(stream, reason) {\n    stream._disturbed = true;\n    if (stream._state === 'closed') {\n      return Promise.resolve(undefined);\n    }\n    if (stream._state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    ReadableStreamClose(stream);\n    var sourceCancelPromise = stream._readableStreamController.__cancelSteps(reason);\n    return sourceCancelPromise.then(function () {\n      return undefined;\n    });\n  }\n  function ReadableStreamClose(stream) {\n    assert(stream._state === 'readable');\n    stream._state = 'closed';\n    var reader = stream._reader;\n    if (reader === undefined) {\n      return undefined;\n    }\n    if (IsReadableStreamDefaultReader(reader) === true) {\n      for (var i = 0; i < reader._readRequests.length; i++) {\n        var _resolve = reader._readRequests[i]._resolve;\n        _resolve(CreateIterResultObject(undefined, true));\n      }\n      reader._readRequests = [];\n    }\n    defaultReaderClosedPromiseResolve(reader);\n    return undefined;\n  }\n  function ReadableStreamError(stream, e) {\n    assert(IsReadableStream(stream) === true, 'stream must be ReadableStream');\n    assert(stream._state === 'readable', 'state must be readable');\n    stream._state = 'errored';\n    stream._storedError = e;\n    var reader = stream._reader;\n    if (reader === undefined) {\n      return undefined;\n    }\n    if (IsReadableStreamDefaultReader(reader) === true) {\n      for (var i = 0; i < reader._readRequests.length; i++) {\n        var readRequest = reader._readRequests[i];\n        readRequest._reject(e);\n      }\n      reader._readRequests = [];\n    } else {\n      assert(IsReadableStreamBYOBReader(reader), 'reader must be ReadableStreamBYOBReader');\n      for (var _i = 0; _i < reader._readIntoRequests.length; _i++) {\n        var readIntoRequest = reader._readIntoRequests[_i];\n        readIntoRequest._reject(e);\n      }\n      reader._readIntoRequests = [];\n    }\n    defaultReaderClosedPromiseReject(reader, e);\n    reader._closedPromise.catch(function () {});\n  }\n  function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) {\n    var reader = stream._reader;\n    assert(reader._readIntoRequests.length > 0);\n    var readIntoRequest = reader._readIntoRequests.shift();\n    readIntoRequest._resolve(CreateIterResultObject(chunk, done));\n  }\n  function ReadableStreamFulfillReadRequest(stream, chunk, done) {\n    var reader = stream._reader;\n    assert(reader._readRequests.length > 0);\n    var readRequest = reader._readRequests.shift();\n    readRequest._resolve(CreateIterResultObject(chunk, done));\n  }\n  function ReadableStreamGetNumReadIntoRequests(stream) {\n    return stream._reader._readIntoRequests.length;\n  }\n  function ReadableStreamGetNumReadRequests(stream) {\n    return stream._reader._readRequests.length;\n  }\n  function ReadableStreamHasBYOBReader(stream) {\n    var reader = stream._reader;\n    if (reader === undefined) {\n      return false;\n    }\n    if (IsReadableStreamBYOBReader(reader) === false) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableStreamHasDefaultReader(stream) {\n    var reader = stream._reader;\n    if (reader === undefined) {\n      return false;\n    }\n    if (IsReadableStreamDefaultReader(reader) === false) {\n      return false;\n    }\n    return true;\n  }\n  var ReadableStreamDefaultReader = function () {\n    function ReadableStreamDefaultReader(stream) {\n      _classCallCheck(this, ReadableStreamDefaultReader);\n      if (IsReadableStream(stream) === false) {\n        throw new TypeError('ReadableStreamDefaultReader can only be constructed with a ReadableStream instance');\n      }\n      if (IsReadableStreamLocked(stream) === true) {\n        throw new TypeError('This stream has already been locked for exclusive reading by another reader');\n      }\n      ReadableStreamReaderGenericInitialize(this, stream);\n      this._readRequests = [];\n    }\n    _createClass(ReadableStreamDefaultReader, [{\n      key: 'cancel',\n      value: function cancel(reason) {\n        if (IsReadableStreamDefaultReader(this) === false) {\n          return Promise.reject(defaultReaderBrandCheckException('cancel'));\n        }\n        if (this._ownerReadableStream === undefined) {\n          return Promise.reject(readerLockException('cancel'));\n        }\n        return ReadableStreamReaderGenericCancel(this, reason);\n      }\n    }, {\n      key: 'read',\n      value: function read() {\n        if (IsReadableStreamDefaultReader(this) === false) {\n          return Promise.reject(defaultReaderBrandCheckException('read'));\n        }\n        if (this._ownerReadableStream === undefined) {\n          return Promise.reject(readerLockException('read from'));\n        }\n        return ReadableStreamDefaultReaderRead(this);\n      }\n    }, {\n      key: 'releaseLock',\n      value: function releaseLock() {\n        if (IsReadableStreamDefaultReader(this) === false) {\n          throw defaultReaderBrandCheckException('releaseLock');\n        }\n        if (this._ownerReadableStream === undefined) {\n          return;\n        }\n        if (this._readRequests.length > 0) {\n          throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');\n        }\n        ReadableStreamReaderGenericRelease(this);\n      }\n    }, {\n      key: 'closed',\n      get: function get() {\n        if (IsReadableStreamDefaultReader(this) === false) {\n          return Promise.reject(defaultReaderBrandCheckException('closed'));\n        }\n        return this._closedPromise;\n      }\n    }]);\n    return ReadableStreamDefaultReader;\n  }();\n  var ReadableStreamBYOBReader = function () {\n    function ReadableStreamBYOBReader(stream) {\n      _classCallCheck(this, ReadableStreamBYOBReader);\n      if (!IsReadableStream(stream)) {\n        throw new TypeError('ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a ' + 'byte source');\n      }\n      if (IsReadableByteStreamController(stream._readableStreamController) === false) {\n        throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' + 'source');\n      }\n      if (IsReadableStreamLocked(stream)) {\n        throw new TypeError('This stream has already been locked for exclusive reading by another reader');\n      }\n      ReadableStreamReaderGenericInitialize(this, stream);\n      this._readIntoRequests = [];\n    }\n    _createClass(ReadableStreamBYOBReader, [{\n      key: 'cancel',\n      value: function cancel(reason) {\n        if (!IsReadableStreamBYOBReader(this)) {\n          return Promise.reject(byobReaderBrandCheckException('cancel'));\n        }\n        if (this._ownerReadableStream === undefined) {\n          return Promise.reject(readerLockException('cancel'));\n        }\n        return ReadableStreamReaderGenericCancel(this, reason);\n      }\n    }, {\n      key: 'read',\n      value: function read(view) {\n        if (!IsReadableStreamBYOBReader(this)) {\n          return Promise.reject(byobReaderBrandCheckException('read'));\n        }\n        if (this._ownerReadableStream === undefined) {\n          return Promise.reject(readerLockException('read from'));\n        }\n        if (!ArrayBuffer.isView(view)) {\n          return Promise.reject(new TypeError('view must be an array buffer view'));\n        }\n        if (view.byteLength === 0) {\n          return Promise.reject(new TypeError('view must have non-zero byteLength'));\n        }\n        return ReadableStreamBYOBReaderRead(this, view);\n      }\n    }, {\n      key: 'releaseLock',\n      value: function releaseLock() {\n        if (!IsReadableStreamBYOBReader(this)) {\n          throw byobReaderBrandCheckException('releaseLock');\n        }\n        if (this._ownerReadableStream === undefined) {\n          return;\n        }\n        if (this._readIntoRequests.length > 0) {\n          throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');\n        }\n        ReadableStreamReaderGenericRelease(this);\n      }\n    }, {\n      key: 'closed',\n      get: function get() {\n        if (!IsReadableStreamBYOBReader(this)) {\n          return Promise.reject(byobReaderBrandCheckException('closed'));\n        }\n        return this._closedPromise;\n      }\n    }]);\n    return ReadableStreamBYOBReader;\n  }();\n  function IsReadableStreamBYOBReader(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) {\n      return false;\n    }\n    return true;\n  }\n  function IsReadableStreamDefaultReader(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableStreamReaderGenericInitialize(reader, stream) {\n    reader._ownerReadableStream = stream;\n    stream._reader = reader;\n    if (stream._state === 'readable') {\n      defaultReaderClosedPromiseInitialize(reader);\n    } else if (stream._state === 'closed') {\n      defaultReaderClosedPromiseInitializeAsResolved(reader);\n    } else {\n      assert(stream._state === 'errored', 'state must be errored');\n      defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError);\n      reader._closedPromise.catch(function () {});\n    }\n  }\n  function ReadableStreamReaderGenericCancel(reader, reason) {\n    var stream = reader._ownerReadableStream;\n    assert(stream !== undefined);\n    return ReadableStreamCancel(stream, reason);\n  }\n  function ReadableStreamReaderGenericRelease(reader) {\n    assert(reader._ownerReadableStream !== undefined);\n    assert(reader._ownerReadableStream._reader === reader);\n    if (reader._ownerReadableStream._state === 'readable') {\n      defaultReaderClosedPromiseReject(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\\'s closedness'));\n    } else {\n      defaultReaderClosedPromiseResetToRejected(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\\'s closedness'));\n    }\n    reader._closedPromise.catch(function () {});\n    reader._ownerReadableStream._reader = undefined;\n    reader._ownerReadableStream = undefined;\n  }\n  function ReadableStreamBYOBReaderRead(reader, view) {\n    var stream = reader._ownerReadableStream;\n    assert(stream !== undefined);\n    stream._disturbed = true;\n    if (stream._state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    return ReadableByteStreamControllerPullInto(stream._readableStreamController, view);\n  }\n  function ReadableStreamDefaultReaderRead(reader) {\n    var stream = reader._ownerReadableStream;\n    assert(stream !== undefined);\n    stream._disturbed = true;\n    if (stream._state === 'closed') {\n      return Promise.resolve(CreateIterResultObject(undefined, true));\n    }\n    if (stream._state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    assert(stream._state === 'readable');\n    return stream._readableStreamController.__pullSteps();\n  }\n  var ReadableStreamDefaultController = function () {\n    function ReadableStreamDefaultController(stream, underlyingSource, size, highWaterMark) {\n      _classCallCheck(this, ReadableStreamDefaultController);\n      if (IsReadableStream(stream) === false) {\n        throw new TypeError('ReadableStreamDefaultController can only be constructed with a ReadableStream instance');\n      }\n      if (stream._readableStreamController !== undefined) {\n        throw new TypeError('ReadableStreamDefaultController instances can only be created by the ReadableStream constructor');\n      }\n      this._controlledReadableStream = stream;\n      this._underlyingSource = underlyingSource;\n      this._queue = undefined;\n      this._queueTotalSize = undefined;\n      ResetQueue(this);\n      this._started = false;\n      this._closeRequested = false;\n      this._pullAgain = false;\n      this._pulling = false;\n      var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);\n      this._strategySize = normalizedStrategy.size;\n      this._strategyHWM = normalizedStrategy.highWaterMark;\n      var controller = this;\n      var startResult = InvokeOrNoop(underlyingSource, 'start', [this]);\n      Promise.resolve(startResult).then(function () {\n        controller._started = true;\n        assert(controller._pulling === false);\n        assert(controller._pullAgain === false);\n        ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n      }, function (r) {\n        ReadableStreamDefaultControllerErrorIfNeeded(controller, r);\n      }).catch(rethrowAssertionErrorRejection);\n    }\n    _createClass(ReadableStreamDefaultController, [{\n      key: 'close',\n      value: function close() {\n        if (IsReadableStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('close');\n        }\n        if (this._closeRequested === true) {\n          throw new TypeError('The stream has already been closed; do not close it again!');\n        }\n        var state = this._controlledReadableStream._state;\n        if (state !== 'readable') {\n          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');\n        }\n        ReadableStreamDefaultControllerClose(this);\n      }\n    }, {\n      key: 'enqueue',\n      value: function enqueue(chunk) {\n        if (IsReadableStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('enqueue');\n        }\n        if (this._closeRequested === true) {\n          throw new TypeError('stream is closed or draining');\n        }\n        var state = this._controlledReadableStream._state;\n        if (state !== 'readable') {\n          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');\n        }\n        return ReadableStreamDefaultControllerEnqueue(this, chunk);\n      }\n    }, {\n      key: 'error',\n      value: function error(e) {\n        if (IsReadableStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('error');\n        }\n        var stream = this._controlledReadableStream;\n        if (stream._state !== 'readable') {\n          throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');\n        }\n        ReadableStreamDefaultControllerError(this, e);\n      }\n    }, {\n      key: '__cancelSteps',\n      value: function __cancelSteps(reason) {\n        ResetQueue(this);\n        return PromiseInvokeOrNoop(this._underlyingSource, 'cancel', [reason]);\n      }\n    }, {\n      key: '__pullSteps',\n      value: function __pullSteps() {\n        var stream = this._controlledReadableStream;\n        if (this._queue.length > 0) {\n          var chunk = DequeueValue(this);\n          if (this._closeRequested === true && this._queue.length === 0) {\n            ReadableStreamClose(stream);\n          } else {\n            ReadableStreamDefaultControllerCallPullIfNeeded(this);\n          }\n          return Promise.resolve(CreateIterResultObject(chunk, false));\n        }\n        var pendingPromise = ReadableStreamAddReadRequest(stream);\n        ReadableStreamDefaultControllerCallPullIfNeeded(this);\n        return pendingPromise;\n      }\n    }, {\n      key: 'desiredSize',\n      get: function get() {\n        if (IsReadableStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('desiredSize');\n        }\n        return ReadableStreamDefaultControllerGetDesiredSize(this);\n      }\n    }]);\n    return ReadableStreamDefaultController;\n  }();\n  function IsReadableStreamDefaultController(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSource')) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableStreamDefaultControllerCallPullIfNeeded(controller) {\n    var shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller);\n    if (shouldPull === false) {\n      return undefined;\n    }\n    if (controller._pulling === true) {\n      controller._pullAgain = true;\n      return undefined;\n    }\n    assert(controller._pullAgain === false);\n    controller._pulling = true;\n    var pullPromise = PromiseInvokeOrNoop(controller._underlyingSource, 'pull', [controller]);\n    pullPromise.then(function () {\n      controller._pulling = false;\n      if (controller._pullAgain === true) {\n        controller._pullAgain = false;\n        return ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n      }\n      return undefined;\n    }, function (e) {\n      ReadableStreamDefaultControllerErrorIfNeeded(controller, e);\n    }).catch(rethrowAssertionErrorRejection);\n    return undefined;\n  }\n  function ReadableStreamDefaultControllerShouldCallPull(controller) {\n    var stream = controller._controlledReadableStream;\n    if (stream._state === 'closed' || stream._state === 'errored') {\n      return false;\n    }\n    if (controller._closeRequested === true) {\n      return false;\n    }\n    if (controller._started === false) {\n      return false;\n    }\n    if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n      return true;\n    }\n    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);\n    if (desiredSize > 0) {\n      return true;\n    }\n    return false;\n  }\n  function ReadableStreamDefaultControllerClose(controller) {\n    var stream = controller._controlledReadableStream;\n    assert(controller._closeRequested === false);\n    assert(stream._state === 'readable');\n    controller._closeRequested = true;\n    if (controller._queue.length === 0) {\n      ReadableStreamClose(stream);\n    }\n  }\n  function ReadableStreamDefaultControllerEnqueue(controller, chunk) {\n    var stream = controller._controlledReadableStream;\n    assert(controller._closeRequested === false);\n    assert(stream._state === 'readable');\n    if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n      ReadableStreamFulfillReadRequest(stream, chunk, false);\n    } else {\n      var chunkSize = 1;\n      if (controller._strategySize !== undefined) {\n        var strategySize = controller._strategySize;\n        try {\n          chunkSize = strategySize(chunk);\n        } catch (chunkSizeE) {\n          ReadableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);\n          throw chunkSizeE;\n        }\n      }\n      try {\n        EnqueueValueWithSize(controller, chunk, chunkSize);\n      } catch (enqueueE) {\n        ReadableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);\n        throw enqueueE;\n      }\n    }\n    ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n    return undefined;\n  }\n  function ReadableStreamDefaultControllerError(controller, e) {\n    var stream = controller._controlledReadableStream;\n    assert(stream._state === 'readable');\n    ResetQueue(controller);\n    ReadableStreamError(stream, e);\n  }\n  function ReadableStreamDefaultControllerErrorIfNeeded(controller, e) {\n    if (controller._controlledReadableStream._state === 'readable') {\n      ReadableStreamDefaultControllerError(controller, e);\n    }\n  }\n  function ReadableStreamDefaultControllerGetDesiredSize(controller) {\n    var stream = controller._controlledReadableStream;\n    var state = stream._state;\n    if (state === 'errored') {\n      return null;\n    }\n    if (state === 'closed') {\n      return 0;\n    }\n    return controller._strategyHWM - controller._queueTotalSize;\n  }\n  var ReadableStreamBYOBRequest = function () {\n    function ReadableStreamBYOBRequest(controller, view) {\n      _classCallCheck(this, ReadableStreamBYOBRequest);\n      this._associatedReadableByteStreamController = controller;\n      this._view = view;\n    }\n    _createClass(ReadableStreamBYOBRequest, [{\n      key: 'respond',\n      value: function respond(bytesWritten) {\n        if (IsReadableStreamBYOBRequest(this) === false) {\n          throw byobRequestBrandCheckException('respond');\n        }\n        if (this._associatedReadableByteStreamController === undefined) {\n          throw new TypeError('This BYOB request has been invalidated');\n        }\n        ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten);\n      }\n    }, {\n      key: 'respondWithNewView',\n      value: function respondWithNewView(view) {\n        if (IsReadableStreamBYOBRequest(this) === false) {\n          throw byobRequestBrandCheckException('respond');\n        }\n        if (this._associatedReadableByteStreamController === undefined) {\n          throw new TypeError('This BYOB request has been invalidated');\n        }\n        if (!ArrayBuffer.isView(view)) {\n          throw new TypeError('You can only respond with array buffer views');\n        }\n        ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view);\n      }\n    }, {\n      key: 'view',\n      get: function get() {\n        return this._view;\n      }\n    }]);\n    return ReadableStreamBYOBRequest;\n  }();\n  var ReadableByteStreamController = function () {\n    function ReadableByteStreamController(stream, underlyingByteSource, highWaterMark) {\n      _classCallCheck(this, ReadableByteStreamController);\n      if (IsReadableStream(stream) === false) {\n        throw new TypeError('ReadableByteStreamController can only be constructed with a ReadableStream instance given ' + 'a byte source');\n      }\n      if (stream._readableStreamController !== undefined) {\n        throw new TypeError('ReadableByteStreamController instances can only be created by the ReadableStream constructor given a byte ' + 'source');\n      }\n      this._controlledReadableStream = stream;\n      this._underlyingByteSource = underlyingByteSource;\n      this._pullAgain = false;\n      this._pulling = false;\n      ReadableByteStreamControllerClearPendingPullIntos(this);\n      this._queue = this._queueTotalSize = undefined;\n      ResetQueue(this);\n      this._closeRequested = false;\n      this._started = false;\n      this._strategyHWM = ValidateAndNormalizeHighWaterMark(highWaterMark);\n      var autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize;\n      if (autoAllocateChunkSize !== undefined) {\n        if (Number.isInteger(autoAllocateChunkSize) === false || autoAllocateChunkSize <= 0) {\n          throw new RangeError('autoAllocateChunkSize must be a positive integer');\n        }\n      }\n      this._autoAllocateChunkSize = autoAllocateChunkSize;\n      this._pendingPullIntos = [];\n      var controller = this;\n      var startResult = InvokeOrNoop(underlyingByteSource, 'start', [this]);\n      Promise.resolve(startResult).then(function () {\n        controller._started = true;\n        assert(controller._pulling === false);\n        assert(controller._pullAgain === false);\n        ReadableByteStreamControllerCallPullIfNeeded(controller);\n      }, function (r) {\n        if (stream._state === 'readable') {\n          ReadableByteStreamControllerError(controller, r);\n        }\n      }).catch(rethrowAssertionErrorRejection);\n    }\n    _createClass(ReadableByteStreamController, [{\n      key: 'close',\n      value: function close() {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('close');\n        }\n        if (this._closeRequested === true) {\n          throw new TypeError('The stream has already been closed; do not close it again!');\n        }\n        var state = this._controlledReadableStream._state;\n        if (state !== 'readable') {\n          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');\n        }\n        ReadableByteStreamControllerClose(this);\n      }\n    }, {\n      key: 'enqueue',\n      value: function enqueue(chunk) {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('enqueue');\n        }\n        if (this._closeRequested === true) {\n          throw new TypeError('stream is closed or draining');\n        }\n        var state = this._controlledReadableStream._state;\n        if (state !== 'readable') {\n          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');\n        }\n        if (!ArrayBuffer.isView(chunk)) {\n          throw new TypeError('You can only enqueue array buffer views when using a ReadableByteStreamController');\n        }\n        ReadableByteStreamControllerEnqueue(this, chunk);\n      }\n    }, {\n      key: 'error',\n      value: function error(e) {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('error');\n        }\n        var stream = this._controlledReadableStream;\n        if (stream._state !== 'readable') {\n          throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');\n        }\n        ReadableByteStreamControllerError(this, e);\n      }\n    }, {\n      key: '__cancelSteps',\n      value: function __cancelSteps(reason) {\n        if (this._pendingPullIntos.length > 0) {\n          var firstDescriptor = this._pendingPullIntos[0];\n          firstDescriptor.bytesFilled = 0;\n        }\n        ResetQueue(this);\n        return PromiseInvokeOrNoop(this._underlyingByteSource, 'cancel', [reason]);\n      }\n    }, {\n      key: '__pullSteps',\n      value: function __pullSteps() {\n        var stream = this._controlledReadableStream;\n        assert(ReadableStreamHasDefaultReader(stream) === true);\n        if (this._queueTotalSize > 0) {\n          assert(ReadableStreamGetNumReadRequests(stream) === 0);\n          var entry = this._queue.shift();\n          this._queueTotalSize -= entry.byteLength;\n          ReadableByteStreamControllerHandleQueueDrain(this);\n          var view = void 0;\n          try {\n            view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength);\n          } catch (viewE) {\n            return Promise.reject(viewE);\n          }\n          return Promise.resolve(CreateIterResultObject(view, false));\n        }\n        var autoAllocateChunkSize = this._autoAllocateChunkSize;\n        if (autoAllocateChunkSize !== undefined) {\n          var buffer = void 0;\n          try {\n            buffer = new ArrayBuffer(autoAllocateChunkSize);\n          } catch (bufferE) {\n            return Promise.reject(bufferE);\n          }\n          var pullIntoDescriptor = {\n            buffer: buffer,\n            byteOffset: 0,\n            byteLength: autoAllocateChunkSize,\n            bytesFilled: 0,\n            elementSize: 1,\n            ctor: Uint8Array,\n            readerType: 'default'\n          };\n          this._pendingPullIntos.push(pullIntoDescriptor);\n        }\n        var promise = ReadableStreamAddReadRequest(stream);\n        ReadableByteStreamControllerCallPullIfNeeded(this);\n        return promise;\n      }\n    }, {\n      key: 'byobRequest',\n      get: function get() {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('byobRequest');\n        }\n        if (this._byobRequest === undefined && this._pendingPullIntos.length > 0) {\n          var firstDescriptor = this._pendingPullIntos[0];\n          var view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled);\n          this._byobRequest = new ReadableStreamBYOBRequest(this, view);\n        }\n        return this._byobRequest;\n      }\n    }, {\n      key: 'desiredSize',\n      get: function get() {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('desiredSize');\n        }\n        return ReadableByteStreamControllerGetDesiredSize(this);\n      }\n    }]);\n    return ReadableByteStreamController;\n  }();\n  function IsReadableByteStreamController(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingByteSource')) {\n      return false;\n    }\n    return true;\n  }\n  function IsReadableStreamBYOBRequest(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableByteStreamControllerCallPullIfNeeded(controller) {\n    var shouldPull = ReadableByteStreamControllerShouldCallPull(controller);\n    if (shouldPull === false) {\n      return undefined;\n    }\n    if (controller._pulling === true) {\n      controller._pullAgain = true;\n      return undefined;\n    }\n    assert(controller._pullAgain === false);\n    controller._pulling = true;\n    var pullPromise = PromiseInvokeOrNoop(controller._underlyingByteSource, 'pull', [controller]);\n    pullPromise.then(function () {\n      controller._pulling = false;\n      if (controller._pullAgain === true) {\n        controller._pullAgain = false;\n        ReadableByteStreamControllerCallPullIfNeeded(controller);\n      }\n    }, function (e) {\n      if (controller._controlledReadableStream._state === 'readable') {\n        ReadableByteStreamControllerError(controller, e);\n      }\n    }).catch(rethrowAssertionErrorRejection);\n    return undefined;\n  }\n  function ReadableByteStreamControllerClearPendingPullIntos(controller) {\n    ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n    controller._pendingPullIntos = [];\n  }\n  function ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) {\n    assert(stream._state !== 'errored', 'state must not be errored');\n    var done = false;\n    if (stream._state === 'closed') {\n      assert(pullIntoDescriptor.bytesFilled === 0);\n      done = true;\n    }\n    var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);\n    if (pullIntoDescriptor.readerType === 'default') {\n      ReadableStreamFulfillReadRequest(stream, filledView, done);\n    } else {\n      assert(pullIntoDescriptor.readerType === 'byob');\n      ReadableStreamFulfillReadIntoRequest(stream, filledView, done);\n    }\n  }\n  function ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) {\n    var bytesFilled = pullIntoDescriptor.bytesFilled;\n    var elementSize = pullIntoDescriptor.elementSize;\n    assert(bytesFilled <= pullIntoDescriptor.byteLength);\n    assert(bytesFilled % elementSize === 0);\n    return new pullIntoDescriptor.ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize);\n  }\n  function ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) {\n    controller._queue.push({\n      buffer: buffer,\n      byteOffset: byteOffset,\n      byteLength: byteLength\n    });\n    controller._queueTotalSize += byteLength;\n  }\n  function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) {\n    var elementSize = pullIntoDescriptor.elementSize;\n    var currentAlignedBytes = pullIntoDescriptor.bytesFilled - pullIntoDescriptor.bytesFilled % elementSize;\n    var maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled);\n    var maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy;\n    var maxAlignedBytes = maxBytesFilled - maxBytesFilled % elementSize;\n    var totalBytesToCopyRemaining = maxBytesToCopy;\n    var ready = false;\n    if (maxAlignedBytes > currentAlignedBytes) {\n      totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled;\n      ready = true;\n    }\n    var queue = controller._queue;\n    while (totalBytesToCopyRemaining > 0) {\n      var headOfQueue = queue[0];\n      var bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength);\n      var destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;\n      ArrayBufferCopy(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy);\n      if (headOfQueue.byteLength === bytesToCopy) {\n        queue.shift();\n      } else {\n        headOfQueue.byteOffset += bytesToCopy;\n        headOfQueue.byteLength -= bytesToCopy;\n      }\n      controller._queueTotalSize -= bytesToCopy;\n      ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor);\n      totalBytesToCopyRemaining -= bytesToCopy;\n    }\n    if (ready === false) {\n      assert(controller._queueTotalSize === 0, 'queue must be empty');\n      assert(pullIntoDescriptor.bytesFilled > 0);\n      assert(pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize);\n    }\n    return ready;\n  }\n  function ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) {\n    assert(controller._pendingPullIntos.length === 0 || controller._pendingPullIntos[0] === pullIntoDescriptor);\n    ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n    pullIntoDescriptor.bytesFilled += size;\n  }\n  function ReadableByteStreamControllerHandleQueueDrain(controller) {\n    assert(controller._controlledReadableStream._state === 'readable');\n    if (controller._queueTotalSize === 0 && controller._closeRequested === true) {\n      ReadableStreamClose(controller._controlledReadableStream);\n    } else {\n      ReadableByteStreamControllerCallPullIfNeeded(controller);\n    }\n  }\n  function ReadableByteStreamControllerInvalidateBYOBRequest(controller) {\n    if (controller._byobRequest === undefined) {\n      return;\n    }\n    controller._byobRequest._associatedReadableByteStreamController = undefined;\n    controller._byobRequest._view = undefined;\n    controller._byobRequest = undefined;\n  }\n  function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) {\n    assert(controller._closeRequested === false);\n    while (controller._pendingPullIntos.length > 0) {\n      if (controller._queueTotalSize === 0) {\n        return;\n      }\n      var pullIntoDescriptor = controller._pendingPullIntos[0];\n      if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {\n        ReadableByteStreamControllerShiftPendingPullInto(controller);\n        ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);\n      }\n    }\n  }\n  function ReadableByteStreamControllerPullInto(controller, view) {\n    var stream = controller._controlledReadableStream;\n    var elementSize = 1;\n    if (view.constructor !== DataView) {\n      elementSize = view.constructor.BYTES_PER_ELEMENT;\n    }\n    var ctor = view.constructor;\n    var pullIntoDescriptor = {\n      buffer: view.buffer,\n      byteOffset: view.byteOffset,\n      byteLength: view.byteLength,\n      bytesFilled: 0,\n      elementSize: elementSize,\n      ctor: ctor,\n      readerType: 'byob'\n    };\n    if (controller._pendingPullIntos.length > 0) {\n      pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n      controller._pendingPullIntos.push(pullIntoDescriptor);\n      return ReadableStreamAddReadIntoRequest(stream);\n    }\n    if (stream._state === 'closed') {\n      var emptyView = new view.constructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0);\n      return Promise.resolve(CreateIterResultObject(emptyView, true));\n    }\n    if (controller._queueTotalSize > 0) {\n      if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {\n        var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);\n        ReadableByteStreamControllerHandleQueueDrain(controller);\n        return Promise.resolve(CreateIterResultObject(filledView, false));\n      }\n      if (controller._closeRequested === true) {\n        var e = new TypeError('Insufficient bytes to fill elements in the given buffer');\n        ReadableByteStreamControllerError(controller, e);\n        return Promise.reject(e);\n      }\n    }\n    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n    controller._pendingPullIntos.push(pullIntoDescriptor);\n    var promise = ReadableStreamAddReadIntoRequest(stream);\n    ReadableByteStreamControllerCallPullIfNeeded(controller);\n    return promise;\n  }\n  function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) {\n    firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer);\n    assert(firstDescriptor.bytesFilled === 0, 'bytesFilled must be 0');\n    var stream = controller._controlledReadableStream;\n    if (ReadableStreamHasBYOBReader(stream) === true) {\n      while (ReadableStreamGetNumReadIntoRequests(stream) > 0) {\n        var pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller);\n        ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor);\n      }\n    }\n  }\n  function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) {\n    if (pullIntoDescriptor.bytesFilled + bytesWritten > pullIntoDescriptor.byteLength) {\n      throw new RangeError('bytesWritten out of range');\n    }\n    ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor);\n    if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize) {\n      return;\n    }\n    ReadableByteStreamControllerShiftPendingPullInto(controller);\n    var remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize;\n    if (remainderSize > 0) {\n      var end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;\n      var remainder = pullIntoDescriptor.buffer.slice(end - remainderSize, end);\n      ReadableByteStreamControllerEnqueueChunkToQueue(controller, remainder, 0, remainder.byteLength);\n    }\n    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n    pullIntoDescriptor.bytesFilled -= remainderSize;\n    ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);\n    ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);\n  }\n  function ReadableByteStreamControllerRespondInternal(controller, bytesWritten) {\n    var firstDescriptor = controller._pendingPullIntos[0];\n    var stream = controller._controlledReadableStream;\n    if (stream._state === 'closed') {\n      if (bytesWritten !== 0) {\n        throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream');\n      }\n      ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor);\n    } else {\n      assert(stream._state === 'readable');\n      ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor);\n    }\n  }\n  function ReadableByteStreamControllerShiftPendingPullInto(controller) {\n    var descriptor = controller._pendingPullIntos.shift();\n    ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n    return descriptor;\n  }\n  function ReadableByteStreamControllerShouldCallPull(controller) {\n    var stream = controller._controlledReadableStream;\n    if (stream._state !== 'readable') {\n      return false;\n    }\n    if (controller._closeRequested === true) {\n      return false;\n    }\n    if (controller._started === false) {\n      return false;\n    }\n    if (ReadableStreamHasDefaultReader(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n      return true;\n    }\n    if (ReadableStreamHasBYOBReader(stream) === true && ReadableStreamGetNumReadIntoRequests(stream) > 0) {\n      return true;\n    }\n    if (ReadableByteStreamControllerGetDesiredSize(controller) > 0) {\n      return true;\n    }\n    return false;\n  }\n  function ReadableByteStreamControllerClose(controller) {\n    var stream = controller._controlledReadableStream;\n    assert(controller._closeRequested === false);\n    assert(stream._state === 'readable');\n    if (controller._queueTotalSize > 0) {\n      controller._closeRequested = true;\n      return;\n    }\n    if (controller._pendingPullIntos.length > 0) {\n      var firstPendingPullInto = controller._pendingPullIntos[0];\n      if (firstPendingPullInto.bytesFilled > 0) {\n        var e = new TypeError('Insufficient bytes to fill elements in the given buffer');\n        ReadableByteStreamControllerError(controller, e);\n        throw e;\n      }\n    }\n    ReadableStreamClose(stream);\n  }\n  function ReadableByteStreamControllerEnqueue(controller, chunk) {\n    var stream = controller._controlledReadableStream;\n    assert(controller._closeRequested === false);\n    assert(stream._state === 'readable');\n    var buffer = chunk.buffer;\n    var byteOffset = chunk.byteOffset;\n    var byteLength = chunk.byteLength;\n    var transferredBuffer = TransferArrayBuffer(buffer);\n    if (ReadableStreamHasDefaultReader(stream) === true) {\n      if (ReadableStreamGetNumReadRequests(stream) === 0) {\n        ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n      } else {\n        assert(controller._queue.length === 0);\n        var transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength);\n        ReadableStreamFulfillReadRequest(stream, transferredView, false);\n      }\n    } else if (ReadableStreamHasBYOBReader(stream) === true) {\n      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n      ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);\n    } else {\n      assert(IsReadableStreamLocked(stream) === false, 'stream must not be locked');\n      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n    }\n  }\n  function ReadableByteStreamControllerError(controller, e) {\n    var stream = controller._controlledReadableStream;\n    assert(stream._state === 'readable');\n    ReadableByteStreamControllerClearPendingPullIntos(controller);\n    ResetQueue(controller);\n    ReadableStreamError(stream, e);\n  }\n  function ReadableByteStreamControllerGetDesiredSize(controller) {\n    var stream = controller._controlledReadableStream;\n    var state = stream._state;\n    if (state === 'errored') {\n      return null;\n    }\n    if (state === 'closed') {\n      return 0;\n    }\n    return controller._strategyHWM - controller._queueTotalSize;\n  }\n  function ReadableByteStreamControllerRespond(controller, bytesWritten) {\n    bytesWritten = Number(bytesWritten);\n    if (IsFiniteNonNegativeNumber(bytesWritten) === false) {\n      throw new RangeError('bytesWritten must be a finite');\n    }\n    assert(controller._pendingPullIntos.length > 0);\n    ReadableByteStreamControllerRespondInternal(controller, bytesWritten);\n  }\n  function ReadableByteStreamControllerRespondWithNewView(controller, view) {\n    assert(controller._pendingPullIntos.length > 0);\n    var firstDescriptor = controller._pendingPullIntos[0];\n    if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) {\n      throw new RangeError('The region specified by view does not match byobRequest');\n    }\n    if (firstDescriptor.byteLength !== view.byteLength) {\n      throw new RangeError('The buffer of view has different capacity than byobRequest');\n    }\n    firstDescriptor.buffer = view.buffer;\n    ReadableByteStreamControllerRespondInternal(controller, view.byteLength);\n  }\n  function streamBrandCheckException(name) {\n    return new TypeError('ReadableStream.prototype.' + name + ' can only be used on a ReadableStream');\n  }\n  function readerLockException(name) {\n    return new TypeError('Cannot ' + name + ' a stream using a released reader');\n  }\n  function defaultReaderBrandCheckException(name) {\n    return new TypeError('ReadableStreamDefaultReader.prototype.' + name + ' can only be used on a ReadableStreamDefaultReader');\n  }\n  function defaultReaderClosedPromiseInitialize(reader) {\n    reader._closedPromise = new Promise(function (resolve, reject) {\n      reader._closedPromise_resolve = resolve;\n      reader._closedPromise_reject = reject;\n    });\n  }\n  function defaultReaderClosedPromiseInitializeAsRejected(reader, reason) {\n    reader._closedPromise = Promise.reject(reason);\n    reader._closedPromise_resolve = undefined;\n    reader._closedPromise_reject = undefined;\n  }\n  function defaultReaderClosedPromiseInitializeAsResolved(reader) {\n    reader._closedPromise = Promise.resolve(undefined);\n    reader._closedPromise_resolve = undefined;\n    reader._closedPromise_reject = undefined;\n  }\n  function defaultReaderClosedPromiseReject(reader, reason) {\n    assert(reader._closedPromise_resolve !== undefined);\n    assert(reader._closedPromise_reject !== undefined);\n    reader._closedPromise_reject(reason);\n    reader._closedPromise_resolve = undefined;\n    reader._closedPromise_reject = undefined;\n  }\n  function defaultReaderClosedPromiseResetToRejected(reader, reason) {\n    assert(reader._closedPromise_resolve === undefined);\n    assert(reader._closedPromise_reject === undefined);\n    reader._closedPromise = Promise.reject(reason);\n  }\n  function defaultReaderClosedPromiseResolve(reader) {\n    assert(reader._closedPromise_resolve !== undefined);\n    assert(reader._closedPromise_reject !== undefined);\n    reader._closedPromise_resolve(undefined);\n    reader._closedPromise_resolve = undefined;\n    reader._closedPromise_reject = undefined;\n  }\n  function byobReaderBrandCheckException(name) {\n    return new TypeError('ReadableStreamBYOBReader.prototype.' + name + ' can only be used on a ReadableStreamBYOBReader');\n  }\n  function defaultControllerBrandCheckException(name) {\n    return new TypeError('ReadableStreamDefaultController.prototype.' + name + ' can only be used on a ReadableStreamDefaultController');\n  }\n  function byobRequestBrandCheckException(name) {\n    return new TypeError('ReadableStreamBYOBRequest.prototype.' + name + ' can only be used on a ReadableStreamBYOBRequest');\n  }\n  function byteStreamControllerBrandCheckException(name) {\n    return new TypeError('ReadableByteStreamController.prototype.' + name + ' can only be used on a ReadableByteStreamController');\n  }\n  function ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise) {\n    try {\n      Promise.prototype.then.call(promise, undefined, function () {});\n    } catch (e) {}\n  }\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var transformStream = __w_pdfjs_require__(6);\n  var readableStream = __w_pdfjs_require__(4);\n  var writableStream = __w_pdfjs_require__(2);\n  exports.TransformStream = transformStream.TransformStream;\n  exports.ReadableStream = readableStream.ReadableStream;\n  exports.IsReadableStreamDisturbed = readableStream.IsReadableStreamDisturbed;\n  exports.ReadableStreamDefaultControllerClose = readableStream.ReadableStreamDefaultControllerClose;\n  exports.ReadableStreamDefaultControllerEnqueue = readableStream.ReadableStreamDefaultControllerEnqueue;\n  exports.ReadableStreamDefaultControllerError = readableStream.ReadableStreamDefaultControllerError;\n  exports.ReadableStreamDefaultControllerGetDesiredSize = readableStream.ReadableStreamDefaultControllerGetDesiredSize;\n  exports.AcquireWritableStreamDefaultWriter = writableStream.AcquireWritableStreamDefaultWriter;\n  exports.IsWritableStream = writableStream.IsWritableStream;\n  exports.IsWritableStreamLocked = writableStream.IsWritableStreamLocked;\n  exports.WritableStream = writableStream.WritableStream;\n  exports.WritableStreamAbort = writableStream.WritableStreamAbort;\n  exports.WritableStreamDefaultControllerError = writableStream.WritableStreamDefaultControllerError;\n  exports.WritableStreamDefaultWriterCloseWithErrorPropagation = writableStream.WritableStreamDefaultWriterCloseWithErrorPropagation;\n  exports.WritableStreamDefaultWriterRelease = writableStream.WritableStreamDefaultWriterRelease;\n  exports.WritableStreamDefaultWriterWrite = writableStream.WritableStreamDefaultWriterWrite;\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n  var _require = __w_pdfjs_require__(1),\n      assert = _require.assert;\n  var _require2 = __w_pdfjs_require__(0),\n      InvokeOrNoop = _require2.InvokeOrNoop,\n      PromiseInvokeOrPerformFallback = _require2.PromiseInvokeOrPerformFallback,\n      PromiseInvokeOrNoop = _require2.PromiseInvokeOrNoop,\n      typeIsObject = _require2.typeIsObject;\n  var _require3 = __w_pdfjs_require__(4),\n      ReadableStream = _require3.ReadableStream,\n      ReadableStreamDefaultControllerClose = _require3.ReadableStreamDefaultControllerClose,\n      ReadableStreamDefaultControllerEnqueue = _require3.ReadableStreamDefaultControllerEnqueue,\n      ReadableStreamDefaultControllerError = _require3.ReadableStreamDefaultControllerError,\n      ReadableStreamDefaultControllerGetDesiredSize = _require3.ReadableStreamDefaultControllerGetDesiredSize;\n  var _require4 = __w_pdfjs_require__(2),\n      WritableStream = _require4.WritableStream,\n      WritableStreamDefaultControllerError = _require4.WritableStreamDefaultControllerError;\n  function TransformStreamCloseReadable(transformStream) {\n    if (transformStream._errored === true) {\n      throw new TypeError('TransformStream is already errored');\n    }\n    if (transformStream._readableClosed === true) {\n      throw new TypeError('Readable side is already closed');\n    }\n    TransformStreamCloseReadableInternal(transformStream);\n  }\n  function TransformStreamEnqueueToReadable(transformStream, chunk) {\n    if (transformStream._errored === true) {\n      throw new TypeError('TransformStream is already errored');\n    }\n    if (transformStream._readableClosed === true) {\n      throw new TypeError('Readable side is already closed');\n    }\n    var controller = transformStream._readableController;\n    try {\n      ReadableStreamDefaultControllerEnqueue(controller, chunk);\n    } catch (e) {\n      transformStream._readableClosed = true;\n      TransformStreamErrorIfNeeded(transformStream, e);\n      throw transformStream._storedError;\n    }\n    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);\n    var maybeBackpressure = desiredSize <= 0;\n    if (maybeBackpressure === true && transformStream._backpressure === false) {\n      TransformStreamSetBackpressure(transformStream, true);\n    }\n  }\n  function TransformStreamError(transformStream, e) {\n    if (transformStream._errored === true) {\n      throw new TypeError('TransformStream is already errored');\n    }\n    TransformStreamErrorInternal(transformStream, e);\n  }\n  function TransformStreamCloseReadableInternal(transformStream) {\n    assert(transformStream._errored === false);\n    assert(transformStream._readableClosed === false);\n    try {\n      ReadableStreamDefaultControllerClose(transformStream._readableController);\n    } catch (e) {\n      assert(false);\n    }\n    transformStream._readableClosed = true;\n  }\n  function TransformStreamErrorIfNeeded(transformStream, e) {\n    if (transformStream._errored === false) {\n      TransformStreamErrorInternal(transformStream, e);\n    }\n  }\n  function TransformStreamErrorInternal(transformStream, e) {\n    assert(transformStream._errored === false);\n    transformStream._errored = true;\n    transformStream._storedError = e;\n    if (transformStream._writableDone === false) {\n      WritableStreamDefaultControllerError(transformStream._writableController, e);\n    }\n    if (transformStream._readableClosed === false) {\n      ReadableStreamDefaultControllerError(transformStream._readableController, e);\n    }\n  }\n  function TransformStreamReadableReadyPromise(transformStream) {\n    assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n    if (transformStream._backpressure === false) {\n      return Promise.resolve();\n    }\n    assert(transformStream._backpressure === true, '_backpressure should have been initialized');\n    return transformStream._backpressureChangePromise;\n  }\n  function TransformStreamSetBackpressure(transformStream, backpressure) {\n    assert(transformStream._backpressure !== backpressure, 'TransformStreamSetBackpressure() should be called only when backpressure is changed');\n    if (transformStream._backpressureChangePromise !== undefined) {\n      transformStream._backpressureChangePromise_resolve(backpressure);\n    }\n    transformStream._backpressureChangePromise = new Promise(function (resolve) {\n      transformStream._backpressureChangePromise_resolve = resolve;\n    });\n    transformStream._backpressureChangePromise.then(function (resolution) {\n      assert(resolution !== backpressure, '_backpressureChangePromise should be fulfilled only when backpressure is changed');\n    });\n    transformStream._backpressure = backpressure;\n  }\n  function TransformStreamDefaultTransform(chunk, transformStreamController) {\n    var transformStream = transformStreamController._controlledTransformStream;\n    TransformStreamEnqueueToReadable(transformStream, chunk);\n    return Promise.resolve();\n  }\n  function TransformStreamTransform(transformStream, chunk) {\n    assert(transformStream._errored === false);\n    assert(transformStream._transforming === false);\n    assert(transformStream._backpressure === false);\n    transformStream._transforming = true;\n    var transformer = transformStream._transformer;\n    var controller = transformStream._transformStreamController;\n    var transformPromise = PromiseInvokeOrPerformFallback(transformer, 'transform', [chunk, controller], TransformStreamDefaultTransform, [chunk, controller]);\n    return transformPromise.then(function () {\n      transformStream._transforming = false;\n      return TransformStreamReadableReadyPromise(transformStream);\n    }, function (e) {\n      TransformStreamErrorIfNeeded(transformStream, e);\n      return Promise.reject(e);\n    });\n  }\n  function IsTransformStreamDefaultController(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) {\n      return false;\n    }\n    return true;\n  }\n  function IsTransformStream(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) {\n      return false;\n    }\n    return true;\n  }\n  var TransformStreamSink = function () {\n    function TransformStreamSink(transformStream, startPromise) {\n      _classCallCheck(this, TransformStreamSink);\n      this._transformStream = transformStream;\n      this._startPromise = startPromise;\n    }\n    _createClass(TransformStreamSink, [{\n      key: 'start',\n      value: function start(c) {\n        var transformStream = this._transformStream;\n        transformStream._writableController = c;\n        return this._startPromise.then(function () {\n          return TransformStreamReadableReadyPromise(transformStream);\n        });\n      }\n    }, {\n      key: 'write',\n      value: function write(chunk) {\n        var transformStream = this._transformStream;\n        return TransformStreamTransform(transformStream, chunk);\n      }\n    }, {\n      key: 'abort',\n      value: function abort() {\n        var transformStream = this._transformStream;\n        transformStream._writableDone = true;\n        TransformStreamErrorInternal(transformStream, new TypeError('Writable side aborted'));\n      }\n    }, {\n      key: 'close',\n      value: function close() {\n        var transformStream = this._transformStream;\n        assert(transformStream._transforming === false);\n        transformStream._writableDone = true;\n        var flushPromise = PromiseInvokeOrNoop(transformStream._transformer, 'flush', [transformStream._transformStreamController]);\n        return flushPromise.then(function () {\n          if (transformStream._errored === true) {\n            return Promise.reject(transformStream._storedError);\n          }\n          if (transformStream._readableClosed === false) {\n            TransformStreamCloseReadableInternal(transformStream);\n          }\n          return Promise.resolve();\n        }).catch(function (r) {\n          TransformStreamErrorIfNeeded(transformStream, r);\n          return Promise.reject(transformStream._storedError);\n        });\n      }\n    }]);\n    return TransformStreamSink;\n  }();\n  var TransformStreamSource = function () {\n    function TransformStreamSource(transformStream, startPromise) {\n      _classCallCheck(this, TransformStreamSource);\n      this._transformStream = transformStream;\n      this._startPromise = startPromise;\n    }\n    _createClass(TransformStreamSource, [{\n      key: 'start',\n      value: function start(c) {\n        var transformStream = this._transformStream;\n        transformStream._readableController = c;\n        return this._startPromise.then(function () {\n          assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n          if (transformStream._backpressure === true) {\n            return Promise.resolve();\n          }\n          assert(transformStream._backpressure === false, '_backpressure should have been initialized');\n          return transformStream._backpressureChangePromise;\n        });\n      }\n    }, {\n      key: 'pull',\n      value: function pull() {\n        var transformStream = this._transformStream;\n        assert(transformStream._backpressure === true, 'pull() should be never called while _backpressure is false');\n        assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n        TransformStreamSetBackpressure(transformStream, false);\n        return transformStream._backpressureChangePromise;\n      }\n    }, {\n      key: 'cancel',\n      value: function cancel() {\n        var transformStream = this._transformStream;\n        transformStream._readableClosed = true;\n        TransformStreamErrorInternal(transformStream, new TypeError('Readable side canceled'));\n      }\n    }]);\n    return TransformStreamSource;\n  }();\n  var TransformStreamDefaultController = function () {\n    function TransformStreamDefaultController(transformStream) {\n      _classCallCheck(this, TransformStreamDefaultController);\n      if (IsTransformStream(transformStream) === false) {\n        throw new TypeError('TransformStreamDefaultController can only be ' + 'constructed with a TransformStream instance');\n      }\n      if (transformStream._transformStreamController !== undefined) {\n        throw new TypeError('TransformStreamDefaultController instances can ' + 'only be created by the TransformStream constructor');\n      }\n      this._controlledTransformStream = transformStream;\n    }\n    _createClass(TransformStreamDefaultController, [{\n      key: 'enqueue',\n      value: function enqueue(chunk) {\n        if (IsTransformStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('enqueue');\n        }\n        TransformStreamEnqueueToReadable(this._controlledTransformStream, chunk);\n      }\n    }, {\n      key: 'close',\n      value: function close() {\n        if (IsTransformStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('close');\n        }\n        TransformStreamCloseReadable(this._controlledTransformStream);\n      }\n    }, {\n      key: 'error',\n      value: function error(reason) {\n        if (IsTransformStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('error');\n        }\n        TransformStreamError(this._controlledTransformStream, reason);\n      }\n    }, {\n      key: 'desiredSize',\n      get: function get() {\n        if (IsTransformStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('desiredSize');\n        }\n        var transformStream = this._controlledTransformStream;\n        var readableController = transformStream._readableController;\n        return ReadableStreamDefaultControllerGetDesiredSize(readableController);\n      }\n    }]);\n    return TransformStreamDefaultController;\n  }();\n  var TransformStream = function () {\n    function TransformStream() {\n      var transformer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      _classCallCheck(this, TransformStream);\n      this._transformer = transformer;\n      var readableStrategy = transformer.readableStrategy,\n          writableStrategy = transformer.writableStrategy;\n      this._transforming = false;\n      this._errored = false;\n      this._storedError = undefined;\n      this._writableController = undefined;\n      this._readableController = undefined;\n      this._transformStreamController = undefined;\n      this._writableDone = false;\n      this._readableClosed = false;\n      this._backpressure = undefined;\n      this._backpressureChangePromise = undefined;\n      this._backpressureChangePromise_resolve = undefined;\n      this._transformStreamController = new TransformStreamDefaultController(this);\n      var startPromise_resolve = void 0;\n      var startPromise = new Promise(function (resolve) {\n        startPromise_resolve = resolve;\n      });\n      var source = new TransformStreamSource(this, startPromise);\n      this._readable = new ReadableStream(source, readableStrategy);\n      var sink = new TransformStreamSink(this, startPromise);\n      this._writable = new WritableStream(sink, writableStrategy);\n      assert(this._writableController !== undefined);\n      assert(this._readableController !== undefined);\n      var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(this._readableController);\n      TransformStreamSetBackpressure(this, desiredSize <= 0);\n      var transformStream = this;\n      var startResult = InvokeOrNoop(transformer, 'start', [transformStream._transformStreamController]);\n      startPromise_resolve(startResult);\n      startPromise.catch(function (e) {\n        if (transformStream._errored === false) {\n          transformStream._errored = true;\n          transformStream._storedError = e;\n        }\n      });\n    }\n    _createClass(TransformStream, [{\n      key: 'readable',\n      get: function get() {\n        if (IsTransformStream(this) === false) {\n          throw streamBrandCheckException('readable');\n        }\n        return this._readable;\n      }\n    }, {\n      key: 'writable',\n      get: function get() {\n        if (IsTransformStream(this) === false) {\n          throw streamBrandCheckException('writable');\n        }\n        return this._writable;\n      }\n    }]);\n    return TransformStream;\n  }();\n  module.exports = { TransformStream: TransformStream };\n  function defaultControllerBrandCheckException(name) {\n    return new TypeError('TransformStreamDefaultController.prototype.' + name + ' can only be used on a TransformStreamDefaultController');\n  }\n  function streamBrandCheckException(name) {\n    return new TypeError('TransformStream.prototype.' + name + ' can only be used on a TransformStream');\n  }\n}, function (module, exports, __w_pdfjs_require__) {\n  module.exports = __w_pdfjs_require__(5);\n}]));\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.CanvasGraphics = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _pattern_helper = __w_pdfjs_require__(13);\n\nvar _webgl = __w_pdfjs_require__(7);\n\nvar MIN_FONT_SIZE = 16;\nvar MAX_FONT_SIZE = 100;\nvar MAX_GROUP_SIZE = 4096;\nvar MIN_WIDTH_FACTOR = 0.65;\nvar COMPILE_TYPE3_GLYPHS = true;\nvar MAX_SIZE_TO_COMPILE = 1000;\nvar FULL_CHUNK_HEIGHT = 16;\nvar IsLittleEndianCached = {\n  get value() {\n    return (0, _util.shadow)(IsLittleEndianCached, 'value', (0, _util.isLittleEndian)());\n  }\n};\nfunction addContextCurrentTransform(ctx) {\n  if (!ctx.mozCurrentTransform) {\n    ctx._originalSave = ctx.save;\n    ctx._originalRestore = ctx.restore;\n    ctx._originalRotate = ctx.rotate;\n    ctx._originalScale = ctx.scale;\n    ctx._originalTranslate = ctx.translate;\n    ctx._originalTransform = ctx.transform;\n    ctx._originalSetTransform = ctx.setTransform;\n    ctx._transformMatrix = ctx._transformMatrix || [1, 0, 0, 1, 0, 0];\n    ctx._transformStack = [];\n    Object.defineProperty(ctx, 'mozCurrentTransform', {\n      get: function getCurrentTransform() {\n        return this._transformMatrix;\n      }\n    });\n    Object.defineProperty(ctx, 'mozCurrentTransformInverse', {\n      get: function getCurrentTransformInverse() {\n        var m = this._transformMatrix;\n        var a = m[0],\n            b = m[1],\n            c = m[2],\n            d = m[3],\n            e = m[4],\n            f = m[5];\n        var ad_bc = a * d - b * c;\n        var bc_ad = b * c - a * d;\n        return [d / ad_bc, b / bc_ad, c / bc_ad, a / ad_bc, (d * e - c * f) / bc_ad, (b * e - a * f) / ad_bc];\n      }\n    });\n    ctx.save = function ctxSave() {\n      var old = this._transformMatrix;\n      this._transformStack.push(old);\n      this._transformMatrix = old.slice(0, 6);\n      this._originalSave();\n    };\n    ctx.restore = function ctxRestore() {\n      var prev = this._transformStack.pop();\n      if (prev) {\n        this._transformMatrix = prev;\n        this._originalRestore();\n      }\n    };\n    ctx.translate = function ctxTranslate(x, y) {\n      var m = this._transformMatrix;\n      m[4] = m[0] * x + m[2] * y + m[4];\n      m[5] = m[1] * x + m[3] * y + m[5];\n      this._originalTranslate(x, y);\n    };\n    ctx.scale = function ctxScale(x, y) {\n      var m = this._transformMatrix;\n      m[0] = m[0] * x;\n      m[1] = m[1] * x;\n      m[2] = m[2] * y;\n      m[3] = m[3] * y;\n      this._originalScale(x, y);\n    };\n    ctx.transform = function ctxTransform(a, b, c, d, e, f) {\n      var m = this._transformMatrix;\n      this._transformMatrix = [m[0] * a + m[2] * b, m[1] * a + m[3] * b, m[0] * c + m[2] * d, m[1] * c + m[3] * d, m[0] * e + m[2] * f + m[4], m[1] * e + m[3] * f + m[5]];\n      ctx._originalTransform(a, b, c, d, e, f);\n    };\n    ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {\n      this._transformMatrix = [a, b, c, d, e, f];\n      ctx._originalSetTransform(a, b, c, d, e, f);\n    };\n    ctx.rotate = function ctxRotate(angle) {\n      var cosValue = Math.cos(angle);\n      var sinValue = Math.sin(angle);\n      var m = this._transformMatrix;\n      this._transformMatrix = [m[0] * cosValue + m[2] * sinValue, m[1] * cosValue + m[3] * sinValue, m[0] * -sinValue + m[2] * cosValue, m[1] * -sinValue + m[3] * cosValue, m[4], m[5]];\n      this._originalRotate(angle);\n    };\n  }\n}\nvar CachedCanvases = function CachedCanvasesClosure() {\n  function CachedCanvases(canvasFactory) {\n    this.canvasFactory = canvasFactory;\n    this.cache = Object.create(null);\n  }\n  CachedCanvases.prototype = {\n    getCanvas: function CachedCanvases_getCanvas(id, width, height, trackTransform) {\n      var canvasEntry;\n      if (this.cache[id] !== undefined) {\n        canvasEntry = this.cache[id];\n        this.canvasFactory.reset(canvasEntry, width, height);\n        canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0);\n      } else {\n        canvasEntry = this.canvasFactory.create(width, height);\n        this.cache[id] = canvasEntry;\n      }\n      if (trackTransform) {\n        addContextCurrentTransform(canvasEntry.context);\n      }\n      return canvasEntry;\n    },\n    clear: function clear() {\n      for (var id in this.cache) {\n        var canvasEntry = this.cache[id];\n        this.canvasFactory.destroy(canvasEntry);\n        delete this.cache[id];\n      }\n    }\n  };\n  return CachedCanvases;\n}();\nfunction compileType3Glyph(imgData) {\n  var POINT_TO_PROCESS_LIMIT = 1000;\n  var width = imgData.width,\n      height = imgData.height;\n  var i,\n      j,\n      j0,\n      width1 = width + 1;\n  var points = new Uint8Array(width1 * (height + 1));\n  var POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);\n  var lineSize = width + 7 & ~7,\n      data0 = imgData.data;\n  var data = new Uint8Array(lineSize * height),\n      pos = 0,\n      ii;\n  for (i = 0, ii = data0.length; i < ii; i++) {\n    var mask = 128,\n        elem = data0[i];\n    while (mask > 0) {\n      data[pos++] = elem & mask ? 0 : 255;\n      mask >>= 1;\n    }\n  }\n  var count = 0;\n  pos = 0;\n  if (data[pos] !== 0) {\n    points[0] = 1;\n    ++count;\n  }\n  for (j = 1; j < width; j++) {\n    if (data[pos] !== data[pos + 1]) {\n      points[j] = data[pos] ? 2 : 1;\n      ++count;\n    }\n    pos++;\n  }\n  if (data[pos] !== 0) {\n    points[j] = 2;\n    ++count;\n  }\n  for (i = 1; i < height; i++) {\n    pos = i * lineSize;\n    j0 = i * width1;\n    if (data[pos - lineSize] !== data[pos]) {\n      points[j0] = data[pos] ? 1 : 8;\n      ++count;\n    }\n    var sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);\n    for (j = 1; j < width; j++) {\n      sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0);\n      if (POINT_TYPES[sum]) {\n        points[j0 + j] = POINT_TYPES[sum];\n        ++count;\n      }\n      pos++;\n    }\n    if (data[pos - lineSize] !== data[pos]) {\n      points[j0 + j] = data[pos] ? 2 : 4;\n      ++count;\n    }\n    if (count > POINT_TO_PROCESS_LIMIT) {\n      return null;\n    }\n  }\n  pos = lineSize * (height - 1);\n  j0 = i * width1;\n  if (data[pos] !== 0) {\n    points[j0] = 8;\n    ++count;\n  }\n  for (j = 1; j < width; j++) {\n    if (data[pos] !== data[pos + 1]) {\n      points[j0 + j] = data[pos] ? 4 : 8;\n      ++count;\n    }\n    pos++;\n  }\n  if (data[pos] !== 0) {\n    points[j0 + j] = 4;\n    ++count;\n  }\n  if (count > POINT_TO_PROCESS_LIMIT) {\n    return null;\n  }\n  var steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);\n  var outlines = [];\n  for (i = 0; count && i <= height; i++) {\n    var p = i * width1;\n    var end = p + width;\n    while (p < end && !points[p]) {\n      p++;\n    }\n    if (p === end) {\n      continue;\n    }\n    var coords = [p % width1, i];\n    var type = points[p],\n        p0 = p,\n        pp;\n    do {\n      var step = steps[type];\n      do {\n        p += step;\n      } while (!points[p]);\n      pp = points[p];\n      if (pp !== 5 && pp !== 10) {\n        type = pp;\n        points[p] = 0;\n      } else {\n        type = pp & 0x33 * type >> 4;\n        points[p] &= type >> 2 | type << 2;\n      }\n      coords.push(p % width1);\n      coords.push(p / width1 | 0);\n      --count;\n    } while (p0 !== p);\n    outlines.push(coords);\n    --i;\n  }\n  var drawOutline = function drawOutline(c) {\n    c.save();\n    c.scale(1 / width, -1 / height);\n    c.translate(0, -height);\n    c.beginPath();\n    for (var i = 0, ii = outlines.length; i < ii; i++) {\n      var o = outlines[i];\n      c.moveTo(o[0], o[1]);\n      for (var j = 2, jj = o.length; j < jj; j += 2) {\n        c.lineTo(o[j], o[j + 1]);\n      }\n    }\n    c.fill();\n    c.beginPath();\n    c.restore();\n  };\n  return drawOutline;\n}\nvar CanvasExtraState = function CanvasExtraStateClosure() {\n  function CanvasExtraState() {\n    this.alphaIsShape = false;\n    this.fontSize = 0;\n    this.fontSizeScale = 1;\n    this.textMatrix = _util.IDENTITY_MATRIX;\n    this.textMatrixScale = 1;\n    this.fontMatrix = _util.FONT_IDENTITY_MATRIX;\n    this.leading = 0;\n    this.x = 0;\n    this.y = 0;\n    this.lineX = 0;\n    this.lineY = 0;\n    this.charSpacing = 0;\n    this.wordSpacing = 0;\n    this.textHScale = 1;\n    this.textRenderingMode = _util.TextRenderingMode.FILL;\n    this.textRise = 0;\n    this.fillColor = '#000000';\n    this.strokeColor = '#000000';\n    this.patternFill = false;\n    this.fillAlpha = 1;\n    this.strokeAlpha = 1;\n    this.lineWidth = 1;\n    this.activeSMask = null;\n    this.resumeSMaskCtx = null;\n  }\n  CanvasExtraState.prototype = {\n    clone: function CanvasExtraState_clone() {\n      return Object.create(this);\n    },\n    setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {\n      this.x = x;\n      this.y = y;\n    }\n  };\n  return CanvasExtraState;\n}();\nvar CanvasGraphics = function CanvasGraphicsClosure() {\n  var EXECUTION_TIME = 15;\n  var EXECUTION_STEPS = 10;\n  function CanvasGraphics(canvasCtx, commonObjs, objs, canvasFactory, imageLayer) {\n    this.ctx = canvasCtx;\n    this.current = new CanvasExtraState();\n    this.stateStack = [];\n    this.pendingClip = null;\n    this.pendingEOFill = false;\n    this.res = null;\n    this.xobjs = null;\n    this.commonObjs = commonObjs;\n    this.objs = objs;\n    this.canvasFactory = canvasFactory;\n    this.imageLayer = imageLayer;\n    this.groupStack = [];\n    this.processingType3 = null;\n    this.baseTransform = null;\n    this.baseTransformStack = [];\n    this.groupLevel = 0;\n    this.smaskStack = [];\n    this.smaskCounter = 0;\n    this.tempSMask = null;\n    this.cachedCanvases = new CachedCanvases(this.canvasFactory);\n    if (canvasCtx) {\n      addContextCurrentTransform(canvasCtx);\n    }\n    this.cachedGetSinglePixelWidth = null;\n  }\n  function putBinaryImageData(ctx, imgData) {\n    if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) {\n      ctx.putImageData(imgData, 0, 0);\n      return;\n    }\n    var height = imgData.height,\n        width = imgData.width;\n    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n    var srcPos = 0,\n        destPos;\n    var src = imgData.data;\n    var dest = chunkImgData.data;\n    var i, j, thisChunkHeight, elemsInThisChunk;\n    if (imgData.kind === _util.ImageKind.GRAYSCALE_1BPP) {\n      var srcLength = src.byteLength;\n      var dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2);\n      var dest32DataLength = dest32.length;\n      var fullSrcDiff = width + 7 >> 3;\n      var white = 0xFFFFFFFF;\n      var black = IsLittleEndianCached.value ? 0xFF000000 : 0x000000FF;\n      for (i = 0; i < totalChunks; i++) {\n        thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n        destPos = 0;\n        for (j = 0; j < thisChunkHeight; j++) {\n          var srcDiff = srcLength - srcPos;\n          var k = 0;\n          var kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7;\n          var kEndUnrolled = kEnd & ~7;\n          var mask = 0;\n          var srcByte = 0;\n          for (; k < kEndUnrolled; k += 8) {\n            srcByte = src[srcPos++];\n            dest32[destPos++] = srcByte & 128 ? white : black;\n            dest32[destPos++] = srcByte & 64 ? white : black;\n            dest32[destPos++] = srcByte & 32 ? white : black;\n            dest32[destPos++] = srcByte & 16 ? white : black;\n            dest32[destPos++] = srcByte & 8 ? white : black;\n            dest32[destPos++] = srcByte & 4 ? white : black;\n            dest32[destPos++] = srcByte & 2 ? white : black;\n            dest32[destPos++] = srcByte & 1 ? white : black;\n          }\n          for (; k < kEnd; k++) {\n            if (mask === 0) {\n              srcByte = src[srcPos++];\n              mask = 128;\n            }\n            dest32[destPos++] = srcByte & mask ? white : black;\n            mask >>= 1;\n          }\n        }\n        while (destPos < dest32DataLength) {\n          dest32[destPos++] = 0;\n        }\n        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n      }\n    } else if (imgData.kind === _util.ImageKind.RGBA_32BPP) {\n      j = 0;\n      elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;\n      for (i = 0; i < fullChunks; i++) {\n        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n        srcPos += elemsInThisChunk;\n        ctx.putImageData(chunkImgData, 0, j);\n        j += FULL_CHUNK_HEIGHT;\n      }\n      if (i < totalChunks) {\n        elemsInThisChunk = width * partialChunkHeight * 4;\n        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n        ctx.putImageData(chunkImgData, 0, j);\n      }\n    } else if (imgData.kind === _util.ImageKind.RGB_24BPP) {\n      thisChunkHeight = FULL_CHUNK_HEIGHT;\n      elemsInThisChunk = width * thisChunkHeight;\n      for (i = 0; i < totalChunks; i++) {\n        if (i >= fullChunks) {\n          thisChunkHeight = partialChunkHeight;\n          elemsInThisChunk = width * thisChunkHeight;\n        }\n        destPos = 0;\n        for (j = elemsInThisChunk; j--;) {\n          dest[destPos++] = src[srcPos++];\n          dest[destPos++] = src[srcPos++];\n          dest[destPos++] = src[srcPos++];\n          dest[destPos++] = 255;\n        }\n        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n      }\n    } else {\n      throw new Error('bad image kind: ' + imgData.kind);\n    }\n  }\n  function putBinaryImageMask(ctx, imgData) {\n    var height = imgData.height,\n        width = imgData.width;\n    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n    var srcPos = 0;\n    var src = imgData.data;\n    var dest = chunkImgData.data;\n    for (var i = 0; i < totalChunks; i++) {\n      var thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n      var destPos = 3;\n      for (var j = 0; j < thisChunkHeight; j++) {\n        var mask = 0;\n        for (var k = 0; k < width; k++) {\n          if (!mask) {\n            var elem = src[srcPos++];\n            mask = 128;\n          }\n          dest[destPos] = elem & mask ? 0 : 255;\n          destPos += 4;\n          mask >>= 1;\n        }\n      }\n      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n    }\n  }\n  function copyCtxState(sourceCtx, destCtx) {\n    var properties = ['strokeStyle', 'fillStyle', 'fillRule', 'globalAlpha', 'lineWidth', 'lineCap', 'lineJoin', 'miterLimit', 'globalCompositeOperation', 'font'];\n    for (var i = 0, ii = properties.length; i < ii; i++) {\n      var property = properties[i];\n      if (sourceCtx[property] !== undefined) {\n        destCtx[property] = sourceCtx[property];\n      }\n    }\n    if (sourceCtx.setLineDash !== undefined) {\n      destCtx.setLineDash(sourceCtx.getLineDash());\n      destCtx.lineDashOffset = sourceCtx.lineDashOffset;\n    }\n  }\n  function resetCtxToDefault(ctx) {\n    ctx.strokeStyle = '#000000';\n    ctx.fillStyle = '#000000';\n    ctx.fillRule = 'nonzero';\n    ctx.globalAlpha = 1;\n    ctx.lineWidth = 1;\n    ctx.lineCap = 'butt';\n    ctx.lineJoin = 'miter';\n    ctx.miterLimit = 10;\n    ctx.globalCompositeOperation = 'source-over';\n    ctx.font = '10px sans-serif';\n    if (ctx.setLineDash !== undefined) {\n      ctx.setLineDash([]);\n      ctx.lineDashOffset = 0;\n    }\n  }\n  function composeSMaskBackdrop(bytes, r0, g0, b0) {\n    var length = bytes.length;\n    for (var i = 3; i < length; i += 4) {\n      var alpha = bytes[i];\n      if (alpha === 0) {\n        bytes[i - 3] = r0;\n        bytes[i - 2] = g0;\n        bytes[i - 1] = b0;\n      } else if (alpha < 255) {\n        var alpha_ = 255 - alpha;\n        bytes[i - 3] = bytes[i - 3] * alpha + r0 * alpha_ >> 8;\n        bytes[i - 2] = bytes[i - 2] * alpha + g0 * alpha_ >> 8;\n        bytes[i - 1] = bytes[i - 1] * alpha + b0 * alpha_ >> 8;\n      }\n    }\n  }\n  function composeSMaskAlpha(maskData, layerData, transferMap) {\n    var length = maskData.length;\n    var scale = 1 / 255;\n    for (var i = 3; i < length; i += 4) {\n      var alpha = transferMap ? transferMap[maskData[i]] : maskData[i];\n      layerData[i] = layerData[i] * alpha * scale | 0;\n    }\n  }\n  function composeSMaskLuminosity(maskData, layerData, transferMap) {\n    var length = maskData.length;\n    for (var i = 3; i < length; i += 4) {\n      var y = maskData[i - 3] * 77 + maskData[i - 2] * 152 + maskData[i - 1] * 28;\n      layerData[i] = transferMap ? layerData[i] * transferMap[y >> 8] >> 8 : layerData[i] * y >> 16;\n    }\n  }\n  function genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap) {\n    var hasBackdrop = !!backdrop;\n    var r0 = hasBackdrop ? backdrop[0] : 0;\n    var g0 = hasBackdrop ? backdrop[1] : 0;\n    var b0 = hasBackdrop ? backdrop[2] : 0;\n    var composeFn;\n    if (subtype === 'Luminosity') {\n      composeFn = composeSMaskLuminosity;\n    } else {\n      composeFn = composeSMaskAlpha;\n    }\n    var PIXELS_TO_PROCESS = 1048576;\n    var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width));\n    for (var row = 0; row < height; row += chunkSize) {\n      var chunkHeight = Math.min(chunkSize, height - row);\n      var maskData = maskCtx.getImageData(0, row, width, chunkHeight);\n      var layerData = layerCtx.getImageData(0, row, width, chunkHeight);\n      if (hasBackdrop) {\n        composeSMaskBackdrop(maskData.data, r0, g0, b0);\n      }\n      composeFn(maskData.data, layerData.data, transferMap);\n      maskCtx.putImageData(layerData, 0, row);\n    }\n  }\n  function composeSMask(ctx, smask, layerCtx) {\n    var mask = smask.canvas;\n    var maskCtx = smask.context;\n    ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY, smask.offsetX, smask.offsetY);\n    var backdrop = smask.backdrop || null;\n    if (!smask.transferMap && _webgl.WebGLUtils.isEnabled) {\n      var composed = _webgl.WebGLUtils.composeSMask(layerCtx.canvas, mask, {\n        subtype: smask.subtype,\n        backdrop: backdrop\n      });\n      ctx.setTransform(1, 0, 0, 1, 0, 0);\n      ctx.drawImage(composed, smask.offsetX, smask.offsetY);\n      return;\n    }\n    genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height, smask.subtype, backdrop, smask.transferMap);\n    ctx.drawImage(mask, 0, 0);\n  }\n  var LINE_CAP_STYLES = ['butt', 'round', 'square'];\n  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];\n  var NORMAL_CLIP = {};\n  var EO_CLIP = {};\n  CanvasGraphics.prototype = {\n    beginDrawing: function beginDrawing(_ref) {\n      var transform = _ref.transform,\n          viewport = _ref.viewport,\n          transparency = _ref.transparency,\n          _ref$background = _ref.background,\n          background = _ref$background === undefined ? null : _ref$background;\n\n      var width = this.ctx.canvas.width;\n      var height = this.ctx.canvas.height;\n      this.ctx.save();\n      this.ctx.fillStyle = background || 'rgb(255, 255, 255)';\n      this.ctx.fillRect(0, 0, width, height);\n      this.ctx.restore();\n      if (transparency) {\n        var transparentCanvas = this.cachedCanvases.getCanvas('transparent', width, height, true);\n        this.compositeCtx = this.ctx;\n        this.transparentCanvas = transparentCanvas.canvas;\n        this.ctx = transparentCanvas.context;\n        this.ctx.save();\n        this.ctx.transform.apply(this.ctx, this.compositeCtx.mozCurrentTransform);\n      }\n      this.ctx.save();\n      resetCtxToDefault(this.ctx);\n      if (transform) {\n        this.ctx.transform.apply(this.ctx, transform);\n      }\n      this.ctx.transform.apply(this.ctx, viewport.transform);\n      this.baseTransform = this.ctx.mozCurrentTransform.slice();\n      if (this.imageLayer) {\n        this.imageLayer.beginLayout();\n      }\n    },\n\n    executeOperatorList: function CanvasGraphics_executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper) {\n      var argsArray = operatorList.argsArray;\n      var fnArray = operatorList.fnArray;\n      var i = executionStartIdx || 0;\n      var argsArrayLen = argsArray.length;\n      if (argsArrayLen === i) {\n        return i;\n      }\n      var chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === 'function';\n      var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;\n      var steps = 0;\n      var commonObjs = this.commonObjs;\n      var objs = this.objs;\n      var fnId;\n      while (true) {\n        if (stepper !== undefined && i === stepper.nextBreakPoint) {\n          stepper.breakIt(i, continueCallback);\n          return i;\n        }\n        fnId = fnArray[i];\n        if (fnId !== _util.OPS.dependency) {\n          this[fnId].apply(this, argsArray[i]);\n        } else {\n          var deps = argsArray[i];\n          for (var n = 0, nn = deps.length; n < nn; n++) {\n            var depObjId = deps[n];\n            var common = depObjId[0] === 'g' && depObjId[1] === '_';\n            var objsPool = common ? commonObjs : objs;\n            if (!objsPool.isResolved(depObjId)) {\n              objsPool.get(depObjId, continueCallback);\n              return i;\n            }\n          }\n        }\n        i++;\n        if (i === argsArrayLen) {\n          return i;\n        }\n        if (chunkOperations && ++steps > EXECUTION_STEPS) {\n          if (Date.now() > endTime) {\n            continueCallback();\n            return i;\n          }\n          steps = 0;\n        }\n      }\n    },\n    endDrawing: function CanvasGraphics_endDrawing() {\n      if (this.current.activeSMask !== null) {\n        this.endSMaskGroup();\n      }\n      this.ctx.restore();\n      if (this.transparentCanvas) {\n        this.ctx = this.compositeCtx;\n        this.ctx.save();\n        this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n        this.ctx.drawImage(this.transparentCanvas, 0, 0);\n        this.ctx.restore();\n        this.transparentCanvas = null;\n      }\n      this.cachedCanvases.clear();\n      _webgl.WebGLUtils.clear();\n      if (this.imageLayer) {\n        this.imageLayer.endLayout();\n      }\n    },\n    setLineWidth: function CanvasGraphics_setLineWidth(width) {\n      this.current.lineWidth = width;\n      this.ctx.lineWidth = width;\n    },\n    setLineCap: function CanvasGraphics_setLineCap(style) {\n      this.ctx.lineCap = LINE_CAP_STYLES[style];\n    },\n    setLineJoin: function CanvasGraphics_setLineJoin(style) {\n      this.ctx.lineJoin = LINE_JOIN_STYLES[style];\n    },\n    setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {\n      this.ctx.miterLimit = limit;\n    },\n    setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {\n      var ctx = this.ctx;\n      if (ctx.setLineDash !== undefined) {\n        ctx.setLineDash(dashArray);\n        ctx.lineDashOffset = dashPhase;\n      }\n    },\n    setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {},\n    setFlatness: function CanvasGraphics_setFlatness(flatness) {},\n    setGState: function CanvasGraphics_setGState(states) {\n      for (var i = 0, ii = states.length; i < ii; i++) {\n        var state = states[i];\n        var key = state[0];\n        var value = state[1];\n        switch (key) {\n          case 'LW':\n            this.setLineWidth(value);\n            break;\n          case 'LC':\n            this.setLineCap(value);\n            break;\n          case 'LJ':\n            this.setLineJoin(value);\n            break;\n          case 'ML':\n            this.setMiterLimit(value);\n            break;\n          case 'D':\n            this.setDash(value[0], value[1]);\n            break;\n          case 'RI':\n            this.setRenderingIntent(value);\n            break;\n          case 'FL':\n            this.setFlatness(value);\n            break;\n          case 'Font':\n            this.setFont(value[0], value[1]);\n            break;\n          case 'CA':\n            this.current.strokeAlpha = state[1];\n            break;\n          case 'ca':\n            this.current.fillAlpha = state[1];\n            this.ctx.globalAlpha = state[1];\n            break;\n          case 'BM':\n            this.ctx.globalCompositeOperation = value;\n            break;\n          case 'SMask':\n            if (this.current.activeSMask) {\n              if (this.stateStack.length > 0 && this.stateStack[this.stateStack.length - 1].activeSMask === this.current.activeSMask) {\n                this.suspendSMaskGroup();\n              } else {\n                this.endSMaskGroup();\n              }\n            }\n            this.current.activeSMask = value ? this.tempSMask : null;\n            if (this.current.activeSMask) {\n              this.beginSMaskGroup();\n            }\n            this.tempSMask = null;\n            break;\n        }\n      }\n    },\n    beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() {\n      var activeSMask = this.current.activeSMask;\n      var drawnWidth = activeSMask.canvas.width;\n      var drawnHeight = activeSMask.canvas.height;\n      var cacheId = 'smaskGroupAt' + this.groupLevel;\n      var scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true);\n      var currentCtx = this.ctx;\n      var currentTransform = currentCtx.mozCurrentTransform;\n      this.ctx.save();\n      var groupCtx = scratchCanvas.context;\n      groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY);\n      groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY);\n      groupCtx.transform.apply(groupCtx, currentTransform);\n      activeSMask.startTransformInverse = groupCtx.mozCurrentTransformInverse;\n      copyCtxState(currentCtx, groupCtx);\n      this.ctx = groupCtx;\n      this.setGState([['BM', 'source-over'], ['ca', 1], ['CA', 1]]);\n      this.groupStack.push(currentCtx);\n      this.groupLevel++;\n    },\n    suspendSMaskGroup: function CanvasGraphics_endSMaskGroup() {\n      var groupCtx = this.ctx;\n      this.groupLevel--;\n      this.ctx = this.groupStack.pop();\n      composeSMask(this.ctx, this.current.activeSMask, groupCtx);\n      this.ctx.restore();\n      this.ctx.save();\n      copyCtxState(groupCtx, this.ctx);\n      this.current.resumeSMaskCtx = groupCtx;\n      var deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform);\n      this.ctx.transform.apply(this.ctx, deltaTransform);\n      groupCtx.save();\n      groupCtx.setTransform(1, 0, 0, 1, 0, 0);\n      groupCtx.clearRect(0, 0, groupCtx.canvas.width, groupCtx.canvas.height);\n      groupCtx.restore();\n    },\n    resumeSMaskGroup: function CanvasGraphics_endSMaskGroup() {\n      var groupCtx = this.current.resumeSMaskCtx;\n      var currentCtx = this.ctx;\n      this.ctx = groupCtx;\n      this.groupStack.push(currentCtx);\n      this.groupLevel++;\n    },\n    endSMaskGroup: function CanvasGraphics_endSMaskGroup() {\n      var groupCtx = this.ctx;\n      this.groupLevel--;\n      this.ctx = this.groupStack.pop();\n      composeSMask(this.ctx, this.current.activeSMask, groupCtx);\n      this.ctx.restore();\n      copyCtxState(groupCtx, this.ctx);\n      var deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform);\n      this.ctx.transform.apply(this.ctx, deltaTransform);\n    },\n    save: function CanvasGraphics_save() {\n      this.ctx.save();\n      var old = this.current;\n      this.stateStack.push(old);\n      this.current = old.clone();\n      this.current.resumeSMaskCtx = null;\n    },\n    restore: function CanvasGraphics_restore() {\n      if (this.current.resumeSMaskCtx) {\n        this.resumeSMaskGroup();\n      }\n      if (this.current.activeSMask !== null && (this.stateStack.length === 0 || this.stateStack[this.stateStack.length - 1].activeSMask !== this.current.activeSMask)) {\n        this.endSMaskGroup();\n      }\n      if (this.stateStack.length !== 0) {\n        this.current = this.stateStack.pop();\n        this.ctx.restore();\n        this.pendingClip = null;\n        this.cachedGetSinglePixelWidth = null;\n      }\n    },\n    transform: function CanvasGraphics_transform(a, b, c, d, e, f) {\n      this.ctx.transform(a, b, c, d, e, f);\n      this.cachedGetSinglePixelWidth = null;\n    },\n    constructPath: function CanvasGraphics_constructPath(ops, args) {\n      var ctx = this.ctx;\n      var current = this.current;\n      var x = current.x,\n          y = current.y;\n      for (var i = 0, j = 0, ii = ops.length; i < ii; i++) {\n        switch (ops[i] | 0) {\n          case _util.OPS.rectangle:\n            x = args[j++];\n            y = args[j++];\n            var width = args[j++];\n            var height = args[j++];\n            if (width === 0) {\n              width = this.getSinglePixelWidth();\n            }\n            if (height === 0) {\n              height = this.getSinglePixelWidth();\n            }\n            var xw = x + width;\n            var yh = y + height;\n            this.ctx.moveTo(x, y);\n            this.ctx.lineTo(xw, y);\n            this.ctx.lineTo(xw, yh);\n            this.ctx.lineTo(x, yh);\n            this.ctx.lineTo(x, y);\n            this.ctx.closePath();\n            break;\n          case _util.OPS.moveTo:\n            x = args[j++];\n            y = args[j++];\n            ctx.moveTo(x, y);\n            break;\n          case _util.OPS.lineTo:\n            x = args[j++];\n            y = args[j++];\n            ctx.lineTo(x, y);\n            break;\n          case _util.OPS.curveTo:\n            x = args[j + 4];\n            y = args[j + 5];\n            ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], x, y);\n            j += 6;\n            break;\n          case _util.OPS.curveTo2:\n            ctx.bezierCurveTo(x, y, args[j], args[j + 1], args[j + 2], args[j + 3]);\n            x = args[j + 2];\n            y = args[j + 3];\n            j += 4;\n            break;\n          case _util.OPS.curveTo3:\n            x = args[j + 2];\n            y = args[j + 3];\n            ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y);\n            j += 4;\n            break;\n          case _util.OPS.closePath:\n            ctx.closePath();\n            break;\n        }\n      }\n      current.setCurrentPoint(x, y);\n    },\n    closePath: function CanvasGraphics_closePath() {\n      this.ctx.closePath();\n    },\n    stroke: function CanvasGraphics_stroke(consumePath) {\n      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;\n      var ctx = this.ctx;\n      var strokeColor = this.current.strokeColor;\n      ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, this.current.lineWidth);\n      ctx.globalAlpha = this.current.strokeAlpha;\n      if (strokeColor && strokeColor.hasOwnProperty('type') && strokeColor.type === 'Pattern') {\n        ctx.save();\n        ctx.strokeStyle = strokeColor.getPattern(ctx, this);\n        ctx.stroke();\n        ctx.restore();\n      } else {\n        ctx.stroke();\n      }\n      if (consumePath) {\n        this.consumePath();\n      }\n      ctx.globalAlpha = this.current.fillAlpha;\n    },\n    closeStroke: function CanvasGraphics_closeStroke() {\n      this.closePath();\n      this.stroke();\n    },\n    fill: function CanvasGraphics_fill(consumePath) {\n      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;\n      var ctx = this.ctx;\n      var fillColor = this.current.fillColor;\n      var isPatternFill = this.current.patternFill;\n      var needRestore = false;\n      if (isPatternFill) {\n        ctx.save();\n        if (this.baseTransform) {\n          ctx.setTransform.apply(ctx, this.baseTransform);\n        }\n        ctx.fillStyle = fillColor.getPattern(ctx, this);\n        needRestore = true;\n      }\n      if (this.pendingEOFill) {\n        ctx.fill('evenodd');\n        this.pendingEOFill = false;\n      } else {\n        ctx.fill();\n      }\n      if (needRestore) {\n        ctx.restore();\n      }\n      if (consumePath) {\n        this.consumePath();\n      }\n    },\n    eoFill: function CanvasGraphics_eoFill() {\n      this.pendingEOFill = true;\n      this.fill();\n    },\n    fillStroke: function CanvasGraphics_fillStroke() {\n      this.fill(false);\n      this.stroke(false);\n      this.consumePath();\n    },\n    eoFillStroke: function CanvasGraphics_eoFillStroke() {\n      this.pendingEOFill = true;\n      this.fillStroke();\n    },\n    closeFillStroke: function CanvasGraphics_closeFillStroke() {\n      this.closePath();\n      this.fillStroke();\n    },\n    closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {\n      this.pendingEOFill = true;\n      this.closePath();\n      this.fillStroke();\n    },\n    endPath: function CanvasGraphics_endPath() {\n      this.consumePath();\n    },\n    clip: function CanvasGraphics_clip() {\n      this.pendingClip = NORMAL_CLIP;\n    },\n    eoClip: function CanvasGraphics_eoClip() {\n      this.pendingClip = EO_CLIP;\n    },\n    beginText: function CanvasGraphics_beginText() {\n      this.current.textMatrix = _util.IDENTITY_MATRIX;\n      this.current.textMatrixScale = 1;\n      this.current.x = this.current.lineX = 0;\n      this.current.y = this.current.lineY = 0;\n    },\n    endText: function CanvasGraphics_endText() {\n      var paths = this.pendingTextPaths;\n      var ctx = this.ctx;\n      if (paths === undefined) {\n        ctx.beginPath();\n        return;\n      }\n      ctx.save();\n      ctx.beginPath();\n      for (var i = 0; i < paths.length; i++) {\n        var path = paths[i];\n        ctx.setTransform.apply(ctx, path.transform);\n        ctx.translate(path.x, path.y);\n        path.addToPath(ctx, path.fontSize);\n      }\n      ctx.restore();\n      ctx.clip();\n      ctx.beginPath();\n      delete this.pendingTextPaths;\n    },\n    setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {\n      this.current.charSpacing = spacing;\n    },\n    setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {\n      this.current.wordSpacing = spacing;\n    },\n    setHScale: function CanvasGraphics_setHScale(scale) {\n      this.current.textHScale = scale / 100;\n    },\n    setLeading: function CanvasGraphics_setLeading(leading) {\n      this.current.leading = -leading;\n    },\n    setFont: function CanvasGraphics_setFont(fontRefName, size) {\n      var fontObj = this.commonObjs.get(fontRefName);\n      var current = this.current;\n      if (!fontObj) {\n        throw new Error('Can\\'t find font for ' + fontRefName);\n      }\n      current.fontMatrix = fontObj.fontMatrix ? fontObj.fontMatrix : _util.FONT_IDENTITY_MATRIX;\n      if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) {\n        (0, _util.warn)('Invalid font matrix for font ' + fontRefName);\n      }\n      if (size < 0) {\n        size = -size;\n        current.fontDirection = -1;\n      } else {\n        current.fontDirection = 1;\n      }\n      this.current.font = fontObj;\n      this.current.fontSize = size;\n      if (fontObj.isType3Font) {\n        return;\n      }\n      var name = fontObj.loadedName || 'sans-serif';\n      var bold = fontObj.black ? '900' : fontObj.bold ? 'bold' : 'normal';\n      var italic = fontObj.italic ? 'italic' : 'normal';\n      var typeface = '\"' + name + '\", ' + fontObj.fallbackName;\n      var browserFontSize = size < MIN_FONT_SIZE ? MIN_FONT_SIZE : size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size;\n      this.current.fontSizeScale = size / browserFontSize;\n      var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;\n      this.ctx.font = rule;\n    },\n    setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {\n      this.current.textRenderingMode = mode;\n    },\n    setTextRise: function CanvasGraphics_setTextRise(rise) {\n      this.current.textRise = rise;\n    },\n    moveText: function CanvasGraphics_moveText(x, y) {\n      this.current.x = this.current.lineX += x;\n      this.current.y = this.current.lineY += y;\n    },\n    setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {\n      this.setLeading(-y);\n      this.moveText(x, y);\n    },\n    setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {\n      this.current.textMatrix = [a, b, c, d, e, f];\n      this.current.textMatrixScale = Math.sqrt(a * a + b * b);\n      this.current.x = this.current.lineX = 0;\n      this.current.y = this.current.lineY = 0;\n    },\n    nextLine: function CanvasGraphics_nextLine() {\n      this.moveText(0, this.current.leading);\n    },\n    paintChar: function CanvasGraphics_paintChar(character, x, y) {\n      var ctx = this.ctx;\n      var current = this.current;\n      var font = current.font;\n      var textRenderingMode = current.textRenderingMode;\n      var fontSize = current.fontSize / current.fontSizeScale;\n      var fillStrokeMode = textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK;\n      var isAddToPathSet = !!(textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG);\n      var addToPath;\n      if (font.disableFontFace || isAddToPathSet) {\n        addToPath = font.getPathGenerator(this.commonObjs, character);\n      }\n      if (font.disableFontFace) {\n        ctx.save();\n        ctx.translate(x, y);\n        ctx.beginPath();\n        addToPath(ctx, fontSize);\n        if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {\n          ctx.fill();\n        }\n        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {\n          ctx.stroke();\n        }\n        ctx.restore();\n      } else {\n        if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {\n          ctx.fillText(character, x, y);\n        }\n        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {\n          ctx.strokeText(character, x, y);\n        }\n      }\n      if (isAddToPathSet) {\n        var paths = this.pendingTextPaths || (this.pendingTextPaths = []);\n        paths.push({\n          transform: ctx.mozCurrentTransform,\n          x: x,\n          y: y,\n          fontSize: fontSize,\n          addToPath: addToPath\n        });\n      }\n    },\n    get isFontSubpixelAAEnabled() {\n      var ctx = this.canvasFactory.create(10, 10).context;\n      ctx.scale(1.5, 1);\n      ctx.fillText('I', 0, 10);\n      var data = ctx.getImageData(0, 0, 10, 10).data;\n      var enabled = false;\n      for (var i = 3; i < data.length; i += 4) {\n        if (data[i] > 0 && data[i] < 255) {\n          enabled = true;\n          break;\n        }\n      }\n      return (0, _util.shadow)(this, 'isFontSubpixelAAEnabled', enabled);\n    },\n    showText: function CanvasGraphics_showText(glyphs) {\n      var current = this.current;\n      var font = current.font;\n      if (font.isType3Font) {\n        return this.showType3Text(glyphs);\n      }\n      var fontSize = current.fontSize;\n      if (fontSize === 0) {\n        return;\n      }\n      var ctx = this.ctx;\n      var fontSizeScale = current.fontSizeScale;\n      var charSpacing = current.charSpacing;\n      var wordSpacing = current.wordSpacing;\n      var fontDirection = current.fontDirection;\n      var textHScale = current.textHScale * fontDirection;\n      var glyphsLength = glyphs.length;\n      var vertical = font.vertical;\n      var spacingDir = vertical ? 1 : -1;\n      var defaultVMetrics = font.defaultVMetrics;\n      var widthAdvanceScale = fontSize * current.fontMatrix[0];\n      var simpleFillText = current.textRenderingMode === _util.TextRenderingMode.FILL && !font.disableFontFace;\n      ctx.save();\n      ctx.transform.apply(ctx, current.textMatrix);\n      ctx.translate(current.x, current.y + current.textRise);\n      if (current.patternFill) {\n        ctx.fillStyle = current.fillColor.getPattern(ctx, this);\n      }\n      if (fontDirection > 0) {\n        ctx.scale(textHScale, -1);\n      } else {\n        ctx.scale(textHScale, 1);\n      }\n      var lineWidth = current.lineWidth;\n      var scale = current.textMatrixScale;\n      if (scale === 0 || lineWidth === 0) {\n        var fillStrokeMode = current.textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK;\n        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {\n          this.cachedGetSinglePixelWidth = null;\n          lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR;\n        }\n      } else {\n        lineWidth /= scale;\n      }\n      if (fontSizeScale !== 1.0) {\n        ctx.scale(fontSizeScale, fontSizeScale);\n        lineWidth /= fontSizeScale;\n      }\n      ctx.lineWidth = lineWidth;\n      var x = 0,\n          i;\n      for (i = 0; i < glyphsLength; ++i) {\n        var glyph = glyphs[i];\n        if ((0, _util.isNum)(glyph)) {\n          x += spacingDir * glyph * fontSize / 1000;\n          continue;\n        }\n        var restoreNeeded = false;\n        var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n        var character = glyph.fontChar;\n        var accent = glyph.accent;\n        var scaledX, scaledY, scaledAccentX, scaledAccentY;\n        var width = glyph.width;\n        if (vertical) {\n          var vmetric, vx, vy;\n          vmetric = glyph.vmetric || defaultVMetrics;\n          vx = glyph.vmetric ? vmetric[1] : width * 0.5;\n          vx = -vx * widthAdvanceScale;\n          vy = vmetric[2] * widthAdvanceScale;\n          width = vmetric ? -vmetric[0] : width;\n          scaledX = vx / fontSizeScale;\n          scaledY = (x + vy) / fontSizeScale;\n        } else {\n          scaledX = x / fontSizeScale;\n          scaledY = 0;\n        }\n        if (font.remeasure && width > 0) {\n          var measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale;\n          if (width < measuredWidth && this.isFontSubpixelAAEnabled) {\n            var characterScaleX = width / measuredWidth;\n            restoreNeeded = true;\n            ctx.save();\n            ctx.scale(characterScaleX, 1);\n            scaledX /= characterScaleX;\n          } else if (width !== measuredWidth) {\n            scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale;\n          }\n        }\n        if (glyph.isInFont || font.missingFile) {\n          if (simpleFillText && !accent) {\n            ctx.fillText(character, scaledX, scaledY);\n          } else {\n            this.paintChar(character, scaledX, scaledY);\n            if (accent) {\n              scaledAccentX = scaledX + accent.offset.x / fontSizeScale;\n              scaledAccentY = scaledY - accent.offset.y / fontSizeScale;\n              this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);\n            }\n          }\n        }\n        var charWidth = width * widthAdvanceScale + spacing * fontDirection;\n        x += charWidth;\n        if (restoreNeeded) {\n          ctx.restore();\n        }\n      }\n      if (vertical) {\n        current.y -= x * textHScale;\n      } else {\n        current.x += x * textHScale;\n      }\n      ctx.restore();\n    },\n    showType3Text: function CanvasGraphics_showType3Text(glyphs) {\n      var ctx = this.ctx;\n      var current = this.current;\n      var font = current.font;\n      var fontSize = current.fontSize;\n      var fontDirection = current.fontDirection;\n      var spacingDir = font.vertical ? 1 : -1;\n      var charSpacing = current.charSpacing;\n      var wordSpacing = current.wordSpacing;\n      var textHScale = current.textHScale * fontDirection;\n      var fontMatrix = current.fontMatrix || _util.FONT_IDENTITY_MATRIX;\n      var glyphsLength = glyphs.length;\n      var isTextInvisible = current.textRenderingMode === _util.TextRenderingMode.INVISIBLE;\n      var i, glyph, width, spacingLength;\n      if (isTextInvisible || fontSize === 0) {\n        return;\n      }\n      this.cachedGetSinglePixelWidth = null;\n      ctx.save();\n      ctx.transform.apply(ctx, current.textMatrix);\n      ctx.translate(current.x, current.y);\n      ctx.scale(textHScale, fontDirection);\n      for (i = 0; i < glyphsLength; ++i) {\n        glyph = glyphs[i];\n        if ((0, _util.isNum)(glyph)) {\n          spacingLength = spacingDir * glyph * fontSize / 1000;\n          this.ctx.translate(spacingLength, 0);\n          current.x += spacingLength * textHScale;\n          continue;\n        }\n        var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n        var operatorList = font.charProcOperatorList[glyph.operatorListId];\n        if (!operatorList) {\n          (0, _util.warn)('Type3 character \"' + glyph.operatorListId + '\" is not available.');\n          continue;\n        }\n        this.processingType3 = glyph;\n        this.save();\n        ctx.scale(fontSize, fontSize);\n        ctx.transform.apply(ctx, fontMatrix);\n        this.executeOperatorList(operatorList);\n        this.restore();\n        var transformed = _util.Util.applyTransform([glyph.width, 0], fontMatrix);\n        width = transformed[0] * fontSize + spacing;\n        ctx.translate(width, 0);\n        current.x += width * textHScale;\n      }\n      ctx.restore();\n      this.processingType3 = null;\n    },\n    setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {},\n    setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) {\n      this.ctx.rect(llx, lly, urx - llx, ury - lly);\n      this.clip();\n      this.endPath();\n    },\n    getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) {\n      var _this = this;\n\n      var pattern;\n      if (IR[0] === 'TilingPattern') {\n        var color = IR[1];\n        var baseTransform = this.baseTransform || this.ctx.mozCurrentTransform.slice();\n        var canvasGraphicsFactory = {\n          createCanvasGraphics: function createCanvasGraphics(ctx) {\n            return new CanvasGraphics(ctx, _this.commonObjs, _this.objs, _this.canvasFactory);\n          }\n        };\n        pattern = new _pattern_helper.TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, baseTransform);\n      } else {\n        pattern = (0, _pattern_helper.getShadingPatternFromIR)(IR);\n      }\n      return pattern;\n    },\n    setStrokeColorN: function CanvasGraphics_setStrokeColorN() {\n      this.current.strokeColor = this.getColorN_Pattern(arguments);\n    },\n    setFillColorN: function CanvasGraphics_setFillColorN() {\n      this.current.fillColor = this.getColorN_Pattern(arguments);\n      this.current.patternFill = true;\n    },\n    setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {\n      var color = _util.Util.makeCssRgb(r, g, b);\n      this.ctx.strokeStyle = color;\n      this.current.strokeColor = color;\n    },\n    setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {\n      var color = _util.Util.makeCssRgb(r, g, b);\n      this.ctx.fillStyle = color;\n      this.current.fillColor = color;\n      this.current.patternFill = false;\n    },\n    shadingFill: function CanvasGraphics_shadingFill(patternIR) {\n      var ctx = this.ctx;\n      this.save();\n      var pattern = (0, _pattern_helper.getShadingPatternFromIR)(patternIR);\n      ctx.fillStyle = pattern.getPattern(ctx, this, true);\n      var inv = ctx.mozCurrentTransformInverse;\n      if (inv) {\n        var canvas = ctx.canvas;\n        var width = canvas.width;\n        var height = canvas.height;\n        var bl = _util.Util.applyTransform([0, 0], inv);\n        var br = _util.Util.applyTransform([0, height], inv);\n        var ul = _util.Util.applyTransform([width, 0], inv);\n        var ur = _util.Util.applyTransform([width, height], inv);\n        var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);\n        var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);\n        var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);\n        var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);\n        this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);\n      } else {\n        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);\n      }\n      this.restore();\n    },\n    beginInlineImage: function CanvasGraphics_beginInlineImage() {\n      throw new Error('Should not call beginInlineImage');\n    },\n    beginImageData: function CanvasGraphics_beginImageData() {\n      throw new Error('Should not call beginImageData');\n    },\n    paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix, bbox) {\n      this.save();\n      this.baseTransformStack.push(this.baseTransform);\n      if ((0, _util.isArray)(matrix) && matrix.length === 6) {\n        this.transform.apply(this, matrix);\n      }\n      this.baseTransform = this.ctx.mozCurrentTransform;\n      if ((0, _util.isArray)(bbox) && bbox.length === 4) {\n        var width = bbox[2] - bbox[0];\n        var height = bbox[3] - bbox[1];\n        this.ctx.rect(bbox[0], bbox[1], width, height);\n        this.clip();\n        this.endPath();\n      }\n    },\n    paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {\n      this.restore();\n      this.baseTransform = this.baseTransformStack.pop();\n    },\n    beginGroup: function CanvasGraphics_beginGroup(group) {\n      this.save();\n      var currentCtx = this.ctx;\n      if (!group.isolated) {\n        (0, _util.info)('TODO: Support non-isolated groups.');\n      }\n      if (group.knockout) {\n        (0, _util.warn)('Knockout groups not supported.');\n      }\n      var currentTransform = currentCtx.mozCurrentTransform;\n      if (group.matrix) {\n        currentCtx.transform.apply(currentCtx, group.matrix);\n      }\n      if (!group.bbox) {\n        throw new Error('Bounding box is required.');\n      }\n      var bounds = _util.Util.getAxialAlignedBoundingBox(group.bbox, currentCtx.mozCurrentTransform);\n      var canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height];\n      bounds = _util.Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];\n      var offsetX = Math.floor(bounds[0]);\n      var offsetY = Math.floor(bounds[1]);\n      var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);\n      var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);\n      var scaleX = 1,\n          scaleY = 1;\n      if (drawnWidth > MAX_GROUP_SIZE) {\n        scaleX = drawnWidth / MAX_GROUP_SIZE;\n        drawnWidth = MAX_GROUP_SIZE;\n      }\n      if (drawnHeight > MAX_GROUP_SIZE) {\n        scaleY = drawnHeight / MAX_GROUP_SIZE;\n        drawnHeight = MAX_GROUP_SIZE;\n      }\n      var cacheId = 'groupAt' + this.groupLevel;\n      if (group.smask) {\n        cacheId += '_smask_' + this.smaskCounter++ % 2;\n      }\n      var scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true);\n      var groupCtx = scratchCanvas.context;\n      groupCtx.scale(1 / scaleX, 1 / scaleY);\n      groupCtx.translate(-offsetX, -offsetY);\n      groupCtx.transform.apply(groupCtx, currentTransform);\n      if (group.smask) {\n        this.smaskStack.push({\n          canvas: scratchCanvas.canvas,\n          context: groupCtx,\n          offsetX: offsetX,\n          offsetY: offsetY,\n          scaleX: scaleX,\n          scaleY: scaleY,\n          subtype: group.smask.subtype,\n          backdrop: group.smask.backdrop,\n          transferMap: group.smask.transferMap || null,\n          startTransformInverse: null\n        });\n      } else {\n        currentCtx.setTransform(1, 0, 0, 1, 0, 0);\n        currentCtx.translate(offsetX, offsetY);\n        currentCtx.scale(scaleX, scaleY);\n      }\n      copyCtxState(currentCtx, groupCtx);\n      this.ctx = groupCtx;\n      this.setGState([['BM', 'source-over'], ['ca', 1], ['CA', 1]]);\n      this.groupStack.push(currentCtx);\n      this.groupLevel++;\n      this.current.activeSMask = null;\n    },\n    endGroup: function CanvasGraphics_endGroup(group) {\n      this.groupLevel--;\n      var groupCtx = this.ctx;\n      this.ctx = this.groupStack.pop();\n      if (this.ctx.imageSmoothingEnabled !== undefined) {\n        this.ctx.imageSmoothingEnabled = false;\n      } else {\n        this.ctx.mozImageSmoothingEnabled = false;\n      }\n      if (group.smask) {\n        this.tempSMask = this.smaskStack.pop();\n      } else {\n        this.ctx.drawImage(groupCtx.canvas, 0, 0);\n      }\n      this.restore();\n    },\n    beginAnnotations: function CanvasGraphics_beginAnnotations() {\n      this.save();\n      if (this.baseTransform) {\n        this.ctx.setTransform.apply(this.ctx, this.baseTransform);\n      }\n    },\n    endAnnotations: function CanvasGraphics_endAnnotations() {\n      this.restore();\n    },\n    beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform, matrix) {\n      this.save();\n      resetCtxToDefault(this.ctx);\n      this.current = new CanvasExtraState();\n      if ((0, _util.isArray)(rect) && rect.length === 4) {\n        var width = rect[2] - rect[0];\n        var height = rect[3] - rect[1];\n        this.ctx.rect(rect[0], rect[1], width, height);\n        this.clip();\n        this.endPath();\n      }\n      this.transform.apply(this, transform);\n      this.transform.apply(this, matrix);\n    },\n    endAnnotation: function CanvasGraphics_endAnnotation() {\n      this.restore();\n    },\n    paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {\n      var domImage = this.objs.get(objId);\n      if (!domImage) {\n        (0, _util.warn)('Dependent image isn\\'t ready yet');\n        return;\n      }\n      this.save();\n      var ctx = this.ctx;\n      ctx.scale(1 / w, -1 / h);\n      ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height, 0, -h, w, h);\n      if (this.imageLayer) {\n        var currentTransform = ctx.mozCurrentTransformInverse;\n        var position = this.getCanvasPosition(0, 0);\n        this.imageLayer.appendImage({\n          objId: objId,\n          left: position[0],\n          top: position[1],\n          width: w / currentTransform[0],\n          height: h / currentTransform[3]\n        });\n      }\n      this.restore();\n    },\n    paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(img) {\n      var ctx = this.ctx;\n      var width = img.width,\n          height = img.height;\n      var fillColor = this.current.fillColor;\n      var isPatternFill = this.current.patternFill;\n      var glyph = this.processingType3;\n      if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) {\n        if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) {\n          glyph.compiled = compileType3Glyph({\n            data: img.data,\n            width: width,\n            height: height\n          });\n        } else {\n          glyph.compiled = null;\n        }\n      }\n      if (glyph && glyph.compiled) {\n        glyph.compiled(ctx);\n        return;\n      }\n      var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', width, height);\n      var maskCtx = maskCanvas.context;\n      maskCtx.save();\n      putBinaryImageMask(maskCtx, img);\n      maskCtx.globalCompositeOperation = 'source-in';\n      maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor;\n      maskCtx.fillRect(0, 0, width, height);\n      maskCtx.restore();\n      this.paintInlineImageXObject(maskCanvas.canvas);\n    },\n    paintImageMaskXObjectRepeat: function CanvasGraphics_paintImageMaskXObjectRepeat(imgData, scaleX, scaleY, positions) {\n      var width = imgData.width;\n      var height = imgData.height;\n      var fillColor = this.current.fillColor;\n      var isPatternFill = this.current.patternFill;\n      var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', width, height);\n      var maskCtx = maskCanvas.context;\n      maskCtx.save();\n      putBinaryImageMask(maskCtx, imgData);\n      maskCtx.globalCompositeOperation = 'source-in';\n      maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor;\n      maskCtx.fillRect(0, 0, width, height);\n      maskCtx.restore();\n      var ctx = this.ctx;\n      for (var i = 0, ii = positions.length; i < ii; i += 2) {\n        ctx.save();\n        ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]);\n        ctx.scale(1, -1);\n        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1);\n        ctx.restore();\n      }\n    },\n    paintImageMaskXObjectGroup: function CanvasGraphics_paintImageMaskXObjectGroup(images) {\n      var ctx = this.ctx;\n      var fillColor = this.current.fillColor;\n      var isPatternFill = this.current.patternFill;\n      for (var i = 0, ii = images.length; i < ii; i++) {\n        var image = images[i];\n        var width = image.width,\n            height = image.height;\n        var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', width, height);\n        var maskCtx = maskCanvas.context;\n        maskCtx.save();\n        putBinaryImageMask(maskCtx, image);\n        maskCtx.globalCompositeOperation = 'source-in';\n        maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor;\n        maskCtx.fillRect(0, 0, width, height);\n        maskCtx.restore();\n        ctx.save();\n        ctx.transform.apply(ctx, image.transform);\n        ctx.scale(1, -1);\n        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1);\n        ctx.restore();\n      }\n    },\n    paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {\n      var imgData = this.objs.get(objId);\n      if (!imgData) {\n        (0, _util.warn)('Dependent image isn\\'t ready yet');\n        return;\n      }\n      this.paintInlineImageXObject(imgData);\n    },\n    paintImageXObjectRepeat: function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY, positions) {\n      var imgData = this.objs.get(objId);\n      if (!imgData) {\n        (0, _util.warn)('Dependent image isn\\'t ready yet');\n        return;\n      }\n      var width = imgData.width;\n      var height = imgData.height;\n      var map = [];\n      for (var i = 0, ii = positions.length; i < ii; i += 2) {\n        map.push({\n          transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]],\n          x: 0,\n          y: 0,\n          w: width,\n          h: height\n        });\n      }\n      this.paintInlineImageXObjectGroup(imgData, map);\n    },\n    paintInlineImageXObject: function CanvasGraphics_paintInlineImageXObject(imgData) {\n      var width = imgData.width;\n      var height = imgData.height;\n      var ctx = this.ctx;\n      this.save();\n      ctx.scale(1 / width, -1 / height);\n      var currentTransform = ctx.mozCurrentTransformInverse;\n      var a = currentTransform[0],\n          b = currentTransform[1];\n      var widthScale = Math.max(Math.sqrt(a * a + b * b), 1);\n      var c = currentTransform[2],\n          d = currentTransform[3];\n      var heightScale = Math.max(Math.sqrt(c * c + d * d), 1);\n      var imgToPaint, tmpCanvas;\n      if (imgData instanceof HTMLElement || !imgData.data) {\n        imgToPaint = imgData;\n      } else {\n        tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', width, height);\n        var tmpCtx = tmpCanvas.context;\n        putBinaryImageData(tmpCtx, imgData);\n        imgToPaint = tmpCanvas.canvas;\n      }\n      var paintWidth = width,\n          paintHeight = height;\n      var tmpCanvasId = 'prescale1';\n      while (widthScale > 2 && paintWidth > 1 || heightScale > 2 && paintHeight > 1) {\n        var newWidth = paintWidth,\n            newHeight = paintHeight;\n        if (widthScale > 2 && paintWidth > 1) {\n          newWidth = Math.ceil(paintWidth / 2);\n          widthScale /= paintWidth / newWidth;\n        }\n        if (heightScale > 2 && paintHeight > 1) {\n          newHeight = Math.ceil(paintHeight / 2);\n          heightScale /= paintHeight / newHeight;\n        }\n        tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight);\n        tmpCtx = tmpCanvas.context;\n        tmpCtx.clearRect(0, 0, newWidth, newHeight);\n        tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight);\n        imgToPaint = tmpCanvas.canvas;\n        paintWidth = newWidth;\n        paintHeight = newHeight;\n        tmpCanvasId = tmpCanvasId === 'prescale1' ? 'prescale2' : 'prescale1';\n      }\n      ctx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, 0, -height, width, height);\n      if (this.imageLayer) {\n        var position = this.getCanvasPosition(0, -height);\n        this.imageLayer.appendImage({\n          imgData: imgData,\n          left: position[0],\n          top: position[1],\n          width: width / currentTransform[0],\n          height: height / currentTransform[3]\n        });\n      }\n      this.restore();\n    },\n    paintInlineImageXObjectGroup: function CanvasGraphics_paintInlineImageXObjectGroup(imgData, map) {\n      var ctx = this.ctx;\n      var w = imgData.width;\n      var h = imgData.height;\n      var tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', w, h);\n      var tmpCtx = tmpCanvas.context;\n      putBinaryImageData(tmpCtx, imgData);\n      for (var i = 0, ii = map.length; i < ii; i++) {\n        var entry = map[i];\n        ctx.save();\n        ctx.transform.apply(ctx, entry.transform);\n        ctx.scale(1, -1);\n        ctx.drawImage(tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1);\n        if (this.imageLayer) {\n          var position = this.getCanvasPosition(entry.x, entry.y);\n          this.imageLayer.appendImage({\n            imgData: imgData,\n            left: position[0],\n            top: position[1],\n            width: w,\n            height: h\n          });\n        }\n        ctx.restore();\n      }\n    },\n    paintSolidColorImageMask: function CanvasGraphics_paintSolidColorImageMask() {\n      this.ctx.fillRect(0, 0, 1, 1);\n    },\n    paintXObject: function CanvasGraphics_paintXObject() {\n      (0, _util.warn)('Unsupported \\'paintXObject\\' command.');\n    },\n    markPoint: function CanvasGraphics_markPoint(tag) {},\n    markPointProps: function CanvasGraphics_markPointProps(tag, properties) {},\n    beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {},\n    beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(tag, properties) {},\n    endMarkedContent: function CanvasGraphics_endMarkedContent() {},\n    beginCompat: function CanvasGraphics_beginCompat() {},\n    endCompat: function CanvasGraphics_endCompat() {},\n    consumePath: function CanvasGraphics_consumePath() {\n      var ctx = this.ctx;\n      if (this.pendingClip) {\n        if (this.pendingClip === EO_CLIP) {\n          ctx.clip('evenodd');\n        } else {\n          ctx.clip();\n        }\n        this.pendingClip = null;\n      }\n      ctx.beginPath();\n    },\n    getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {\n      if (this.cachedGetSinglePixelWidth === null) {\n        this.ctx.save();\n        var inverse = this.ctx.mozCurrentTransformInverse;\n        this.ctx.restore();\n        this.cachedGetSinglePixelWidth = Math.sqrt(Math.max(inverse[0] * inverse[0] + inverse[1] * inverse[1], inverse[2] * inverse[2] + inverse[3] * inverse[3]));\n      }\n      return this.cachedGetSinglePixelWidth;\n    },\n    getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) {\n      var transform = this.ctx.mozCurrentTransform;\n      return [transform[0] * x + transform[2] * y + transform[4], transform[1] * x + transform[3] * y + transform[5]];\n    }\n  };\n  for (var op in _util.OPS) {\n    CanvasGraphics.prototype[_util.OPS[op]] = CanvasGraphics.prototype[op];\n  }\n  return CanvasGraphics;\n}();\nexports.CanvasGraphics = CanvasGraphics;\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.FontLoader = exports.FontFaceObject = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nfunction FontLoader(docId) {\n  this.docId = docId;\n  this.styleElement = null;\n  this.nativeFontFaces = [];\n  this.loadTestFontId = 0;\n  this.loadingContext = {\n    requests: [],\n    nextRequestId: 0\n  };\n}\nFontLoader.prototype = {\n  insertRule: function fontLoaderInsertRule(rule) {\n    var styleElement = this.styleElement;\n    if (!styleElement) {\n      styleElement = this.styleElement = document.createElement('style');\n      styleElement.id = 'PDFJS_FONT_STYLE_TAG_' + this.docId;\n      document.documentElement.getElementsByTagName('head')[0].appendChild(styleElement);\n    }\n    var styleSheet = styleElement.sheet;\n    styleSheet.insertRule(rule, styleSheet.cssRules.length);\n  },\n  clear: function fontLoaderClear() {\n    if (this.styleElement) {\n      this.styleElement.remove();\n      this.styleElement = null;\n    }\n    this.nativeFontFaces.forEach(function (nativeFontFace) {\n      document.fonts.delete(nativeFontFace);\n    });\n    this.nativeFontFaces.length = 0;\n  }\n};\n{\n  var getLoadTestFont = function getLoadTestFont() {\n    return atob('T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQ' + 'AABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwA' + 'AAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbm' + 'FtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAA' + 'AADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6A' + 'ABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAA' + 'MQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAA' + 'AAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAA' + 'AAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQ' + 'AAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMA' + 'AQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAA' + 'EAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAA' + 'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAA' + 'AAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgc' + 'A/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF' + 'hYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQA' + 'AAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAg' + 'ABAAAAAAAAAAAD6AAAAAAAAA==');\n  };\n  Object.defineProperty(FontLoader.prototype, 'loadTestFont', {\n    get: function get() {\n      return (0, _util.shadow)(this, 'loadTestFont', getLoadTestFont());\n    },\n\n    configurable: true\n  });\n  FontLoader.prototype.addNativeFontFace = function fontLoader_addNativeFontFace(nativeFontFace) {\n    this.nativeFontFaces.push(nativeFontFace);\n    document.fonts.add(nativeFontFace);\n  };\n  FontLoader.prototype.bind = function fontLoaderBind(fonts, callback) {\n    var rules = [];\n    var fontsToLoad = [];\n    var fontLoadPromises = [];\n    var getNativeFontPromise = function getNativeFontPromise(nativeFontFace) {\n      return nativeFontFace.loaded.catch(function (e) {\n        (0, _util.warn)('Failed to load font \"' + nativeFontFace.family + '\": ' + e);\n      });\n    };\n    var isFontLoadingAPISupported = FontLoader.isFontLoadingAPISupported && !FontLoader.isSyncFontLoadingSupported;\n    for (var i = 0, ii = fonts.length; i < ii; i++) {\n      var font = fonts[i];\n      if (font.attached || font.loading === false) {\n        continue;\n      }\n      font.attached = true;\n      if (isFontLoadingAPISupported) {\n        var nativeFontFace = font.createNativeFontFace();\n        if (nativeFontFace) {\n          this.addNativeFontFace(nativeFontFace);\n          fontLoadPromises.push(getNativeFontPromise(nativeFontFace));\n        }\n      } else {\n        var rule = font.createFontFaceRule();\n        if (rule) {\n          this.insertRule(rule);\n          rules.push(rule);\n          fontsToLoad.push(font);\n        }\n      }\n    }\n    var request = this.queueLoadingCallback(callback);\n    if (isFontLoadingAPISupported) {\n      Promise.all(fontLoadPromises).then(function () {\n        request.complete();\n      });\n    } else if (rules.length > 0 && !FontLoader.isSyncFontLoadingSupported) {\n      this.prepareFontLoadEvent(rules, fontsToLoad, request);\n    } else {\n      request.complete();\n    }\n  };\n  FontLoader.prototype.queueLoadingCallback = function FontLoader_queueLoadingCallback(callback) {\n    function LoadLoader_completeRequest() {\n      (0, _util.assert)(!request.end, 'completeRequest() cannot be called twice');\n      request.end = Date.now();\n      while (context.requests.length > 0 && context.requests[0].end) {\n        var otherRequest = context.requests.shift();\n        setTimeout(otherRequest.callback, 0);\n      }\n    }\n    var context = this.loadingContext;\n    var requestId = 'pdfjs-font-loading-' + context.nextRequestId++;\n    var request = {\n      id: requestId,\n      complete: LoadLoader_completeRequest,\n      callback: callback,\n      started: Date.now()\n    };\n    context.requests.push(request);\n    return request;\n  };\n  FontLoader.prototype.prepareFontLoadEvent = function fontLoaderPrepareFontLoadEvent(rules, fonts, request) {\n    function int32(data, offset) {\n      return data.charCodeAt(offset) << 24 | data.charCodeAt(offset + 1) << 16 | data.charCodeAt(offset + 2) << 8 | data.charCodeAt(offset + 3) & 0xff;\n    }\n    function spliceString(s, offset, remove, insert) {\n      var chunk1 = s.substr(0, offset);\n      var chunk2 = s.substr(offset + remove);\n      return chunk1 + insert + chunk2;\n    }\n    var i, ii;\n    var canvas = document.createElement('canvas');\n    canvas.width = 1;\n    canvas.height = 1;\n    var ctx = canvas.getContext('2d');\n    var called = 0;\n    function isFontReady(name, callback) {\n      called++;\n      if (called > 30) {\n        (0, _util.warn)('Load test font never loaded.');\n        callback();\n        return;\n      }\n      ctx.font = '30px ' + name;\n      ctx.fillText('.', 0, 20);\n      var imageData = ctx.getImageData(0, 0, 1, 1);\n      if (imageData.data[3] > 0) {\n        callback();\n        return;\n      }\n      setTimeout(isFontReady.bind(null, name, callback));\n    }\n    var loadTestFontId = 'lt' + Date.now() + this.loadTestFontId++;\n    var data = this.loadTestFont;\n    var COMMENT_OFFSET = 976;\n    data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId);\n    var CFF_CHECKSUM_OFFSET = 16;\n    var XXXX_VALUE = 0x58585858;\n    var checksum = int32(data, CFF_CHECKSUM_OFFSET);\n    for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {\n      checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0;\n    }\n    if (i < loadTestFontId.length) {\n      checksum = checksum - XXXX_VALUE + int32(loadTestFontId + 'XXX', i) | 0;\n    }\n    data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, (0, _util.string32)(checksum));\n    var url = 'url(data:font/opentype;base64,' + btoa(data) + ');';\n    var rule = '@font-face { font-family:\"' + loadTestFontId + '\";src:' + url + '}';\n    this.insertRule(rule);\n    var names = [];\n    for (i = 0, ii = fonts.length; i < ii; i++) {\n      names.push(fonts[i].loadedName);\n    }\n    names.push(loadTestFontId);\n    var div = document.createElement('div');\n    div.setAttribute('style', 'visibility: hidden;' + 'width: 10px; height: 10px;' + 'position: absolute; top: 0px; left: 0px;');\n    for (i = 0, ii = names.length; i < ii; ++i) {\n      var span = document.createElement('span');\n      span.textContent = 'Hi';\n      span.style.fontFamily = names[i];\n      div.appendChild(span);\n    }\n    document.body.appendChild(div);\n    isFontReady(loadTestFontId, function () {\n      document.body.removeChild(div);\n      request.complete();\n    });\n  };\n}\n{\n  FontLoader.isFontLoadingAPISupported = typeof document !== 'undefined' && !!document.fonts;\n}\n{\n  var isSyncFontLoadingSupported = function isSyncFontLoadingSupported() {\n    if (typeof navigator === 'undefined') {\n      return true;\n    }\n    var supported = false;\n    var m = /Mozilla\\/5.0.*?rv:(\\d+).*? Gecko/.exec(navigator.userAgent);\n    if (m && m[1] >= 14) {\n      supported = true;\n    }\n    return supported;\n  };\n  Object.defineProperty(FontLoader, 'isSyncFontLoadingSupported', {\n    get: function get() {\n      return (0, _util.shadow)(FontLoader, 'isSyncFontLoadingSupported', isSyncFontLoadingSupported());\n    },\n\n    enumerable: true,\n    configurable: true\n  });\n}\nvar IsEvalSupportedCached = {\n  get value() {\n    return (0, _util.shadow)(this, 'value', (0, _util.isEvalSupported)());\n  }\n};\nvar FontFaceObject = function FontFaceObjectClosure() {\n  function FontFaceObject(translatedData, options) {\n    this.compiledGlyphs = Object.create(null);\n    for (var i in translatedData) {\n      this[i] = translatedData[i];\n    }\n    this.options = options;\n  }\n  FontFaceObject.prototype = {\n    createNativeFontFace: function FontFaceObject_createNativeFontFace() {\n      if (!this.data) {\n        return null;\n      }\n      if (this.options.disableFontFace) {\n        this.disableFontFace = true;\n        return null;\n      }\n      var nativeFontFace = new FontFace(this.loadedName, this.data, {});\n      if (this.options.fontRegistry) {\n        this.options.fontRegistry.registerFont(this);\n      }\n      return nativeFontFace;\n    },\n    createFontFaceRule: function FontFaceObject_createFontFaceRule() {\n      if (!this.data) {\n        return null;\n      }\n      if (this.options.disableFontFace) {\n        this.disableFontFace = true;\n        return null;\n      }\n      var data = (0, _util.bytesToString)(new Uint8Array(this.data));\n      var fontName = this.loadedName;\n      var url = 'url(data:' + this.mimetype + ';base64,' + btoa(data) + ');';\n      var rule = '@font-face { font-family:\"' + fontName + '\";src:' + url + '}';\n      if (this.options.fontRegistry) {\n        this.options.fontRegistry.registerFont(this, url);\n      }\n      return rule;\n    },\n    getPathGenerator: function FontFaceObject_getPathGenerator(objs, character) {\n      if (!(character in this.compiledGlyphs)) {\n        var cmds = objs.get(this.loadedName + '_path_' + character);\n        var current, i, len;\n        if (this.options.isEvalSupported && IsEvalSupportedCached.value) {\n          var args,\n              js = '';\n          for (i = 0, len = cmds.length; i < len; i++) {\n            current = cmds[i];\n            if (current.args !== undefined) {\n              args = current.args.join(',');\n            } else {\n              args = '';\n            }\n            js += 'c.' + current.cmd + '(' + args + ');\\n';\n          }\n          this.compiledGlyphs[character] = new Function('c', 'size', js);\n        } else {\n          this.compiledGlyphs[character] = function (c, size) {\n            for (i = 0, len = cmds.length; i < len; i++) {\n              current = cmds[i];\n              if (current.cmd === 'scale') {\n                current.args = [size, -size];\n              }\n              c[current.cmd].apply(c, current.args);\n            }\n          };\n        }\n      }\n      return this.compiledGlyphs[character];\n    }\n  };\n  return FontFaceObject;\n}();\nexports.FontFaceObject = FontFaceObject;\nexports.FontLoader = FontLoader;\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.TilingPattern = exports.getShadingPatternFromIR = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _webgl = __w_pdfjs_require__(7);\n\nvar ShadingIRs = {};\nShadingIRs.RadialAxial = {\n  fromIR: function RadialAxial_fromIR(raw) {\n    var type = raw[1];\n    var colorStops = raw[2];\n    var p0 = raw[3];\n    var p1 = raw[4];\n    var r0 = raw[5];\n    var r1 = raw[6];\n    return {\n      type: 'Pattern',\n      getPattern: function RadialAxial_getPattern(ctx) {\n        var grad;\n        if (type === 'axial') {\n          grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);\n        } else if (type === 'radial') {\n          grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);\n        }\n        for (var i = 0, ii = colorStops.length; i < ii; ++i) {\n          var c = colorStops[i];\n          grad.addColorStop(c[0], c[1]);\n        }\n        return grad;\n      }\n    };\n  }\n};\nvar createMeshCanvas = function createMeshCanvasClosure() {\n  function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {\n    var coords = context.coords,\n        colors = context.colors;\n    var bytes = data.data,\n        rowSize = data.width * 4;\n    var tmp;\n    if (coords[p1 + 1] > coords[p2 + 1]) {\n      tmp = p1;\n      p1 = p2;\n      p2 = tmp;\n      tmp = c1;\n      c1 = c2;\n      c2 = tmp;\n    }\n    if (coords[p2 + 1] > coords[p3 + 1]) {\n      tmp = p2;\n      p2 = p3;\n      p3 = tmp;\n      tmp = c2;\n      c2 = c3;\n      c3 = tmp;\n    }\n    if (coords[p1 + 1] > coords[p2 + 1]) {\n      tmp = p1;\n      p1 = p2;\n      p2 = tmp;\n      tmp = c1;\n      c1 = c2;\n      c2 = tmp;\n    }\n    var x1 = (coords[p1] + context.offsetX) * context.scaleX;\n    var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;\n    var x2 = (coords[p2] + context.offsetX) * context.scaleX;\n    var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;\n    var x3 = (coords[p3] + context.offsetX) * context.scaleX;\n    var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;\n    if (y1 >= y3) {\n      return;\n    }\n    var c1r = colors[c1],\n        c1g = colors[c1 + 1],\n        c1b = colors[c1 + 2];\n    var c2r = colors[c2],\n        c2g = colors[c2 + 1],\n        c2b = colors[c2 + 2];\n    var c3r = colors[c3],\n        c3g = colors[c3 + 1],\n        c3b = colors[c3 + 2];\n    var minY = Math.round(y1),\n        maxY = Math.round(y3);\n    var xa, car, cag, cab;\n    var xb, cbr, cbg, cbb;\n    var k;\n    for (var y = minY; y <= maxY; y++) {\n      if (y < y2) {\n        k = y < y1 ? 0 : y1 === y2 ? 1 : (y1 - y) / (y1 - y2);\n        xa = x1 - (x1 - x2) * k;\n        car = c1r - (c1r - c2r) * k;\n        cag = c1g - (c1g - c2g) * k;\n        cab = c1b - (c1b - c2b) * k;\n      } else {\n        k = y > y3 ? 1 : y2 === y3 ? 0 : (y2 - y) / (y2 - y3);\n        xa = x2 - (x2 - x3) * k;\n        car = c2r - (c2r - c3r) * k;\n        cag = c2g - (c2g - c3g) * k;\n        cab = c2b - (c2b - c3b) * k;\n      }\n      k = y < y1 ? 0 : y > y3 ? 1 : (y1 - y) / (y1 - y3);\n      xb = x1 - (x1 - x3) * k;\n      cbr = c1r - (c1r - c3r) * k;\n      cbg = c1g - (c1g - c3g) * k;\n      cbb = c1b - (c1b - c3b) * k;\n      var x1_ = Math.round(Math.min(xa, xb));\n      var x2_ = Math.round(Math.max(xa, xb));\n      var j = rowSize * y + x1_ * 4;\n      for (var x = x1_; x <= x2_; x++) {\n        k = (xa - x) / (xa - xb);\n        k = k < 0 ? 0 : k > 1 ? 1 : k;\n        bytes[j++] = car - (car - cbr) * k | 0;\n        bytes[j++] = cag - (cag - cbg) * k | 0;\n        bytes[j++] = cab - (cab - cbb) * k | 0;\n        bytes[j++] = 255;\n      }\n    }\n  }\n  function drawFigure(data, figure, context) {\n    var ps = figure.coords;\n    var cs = figure.colors;\n    var i, ii;\n    switch (figure.type) {\n      case 'lattice':\n        var verticesPerRow = figure.verticesPerRow;\n        var rows = Math.floor(ps.length / verticesPerRow) - 1;\n        var cols = verticesPerRow - 1;\n        for (i = 0; i < rows; i++) {\n          var q = i * verticesPerRow;\n          for (var j = 0; j < cols; j++, q++) {\n            drawTriangle(data, context, ps[q], ps[q + 1], ps[q + verticesPerRow], cs[q], cs[q + 1], cs[q + verticesPerRow]);\n            drawTriangle(data, context, ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]);\n          }\n        }\n        break;\n      case 'triangles':\n        for (i = 0, ii = ps.length; i < ii; i += 3) {\n          drawTriangle(data, context, ps[i], ps[i + 1], ps[i + 2], cs[i], cs[i + 1], cs[i + 2]);\n        }\n        break;\n      default:\n        throw new Error('illegal figure');\n    }\n  }\n  function createMeshCanvas(bounds, combinesScale, coords, colors, figures, backgroundColor, cachedCanvases) {\n    var EXPECTED_SCALE = 1.1;\n    var MAX_PATTERN_SIZE = 3000;\n    var BORDER_SIZE = 2;\n    var offsetX = Math.floor(bounds[0]);\n    var offsetY = Math.floor(bounds[1]);\n    var boundsWidth = Math.ceil(bounds[2]) - offsetX;\n    var boundsHeight = Math.ceil(bounds[3]) - offsetY;\n    var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE);\n    var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE);\n    var scaleX = boundsWidth / width;\n    var scaleY = boundsHeight / height;\n    var context = {\n      coords: coords,\n      colors: colors,\n      offsetX: -offsetX,\n      offsetY: -offsetY,\n      scaleX: 1 / scaleX,\n      scaleY: 1 / scaleY\n    };\n    var paddedWidth = width + BORDER_SIZE * 2;\n    var paddedHeight = height + BORDER_SIZE * 2;\n    var canvas, tmpCanvas, i, ii;\n    if (_webgl.WebGLUtils.isEnabled) {\n      canvas = _webgl.WebGLUtils.drawFigures(width, height, backgroundColor, figures, context);\n      tmpCanvas = cachedCanvases.getCanvas('mesh', paddedWidth, paddedHeight, false);\n      tmpCanvas.context.drawImage(canvas, BORDER_SIZE, BORDER_SIZE);\n      canvas = tmpCanvas.canvas;\n    } else {\n      tmpCanvas = cachedCanvases.getCanvas('mesh', paddedWidth, paddedHeight, false);\n      var tmpCtx = tmpCanvas.context;\n      var data = tmpCtx.createImageData(width, height);\n      if (backgroundColor) {\n        var bytes = data.data;\n        for (i = 0, ii = bytes.length; i < ii; i += 4) {\n          bytes[i] = backgroundColor[0];\n          bytes[i + 1] = backgroundColor[1];\n          bytes[i + 2] = backgroundColor[2];\n          bytes[i + 3] = 255;\n        }\n      }\n      for (i = 0; i < figures.length; i++) {\n        drawFigure(data, figures[i], context);\n      }\n      tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE);\n      canvas = tmpCanvas.canvas;\n    }\n    return {\n      canvas: canvas,\n      offsetX: offsetX - BORDER_SIZE * scaleX,\n      offsetY: offsetY - BORDER_SIZE * scaleY,\n      scaleX: scaleX,\n      scaleY: scaleY\n    };\n  }\n  return createMeshCanvas;\n}();\nShadingIRs.Mesh = {\n  fromIR: function Mesh_fromIR(raw) {\n    var coords = raw[2];\n    var colors = raw[3];\n    var figures = raw[4];\n    var bounds = raw[5];\n    var matrix = raw[6];\n    var background = raw[8];\n    return {\n      type: 'Pattern',\n      getPattern: function Mesh_getPattern(ctx, owner, shadingFill) {\n        var scale;\n        if (shadingFill) {\n          scale = _util.Util.singularValueDecompose2dScale(ctx.mozCurrentTransform);\n        } else {\n          scale = _util.Util.singularValueDecompose2dScale(owner.baseTransform);\n          if (matrix) {\n            var matrixScale = _util.Util.singularValueDecompose2dScale(matrix);\n            scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]];\n          }\n        }\n        var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords, colors, figures, shadingFill ? null : background, owner.cachedCanvases);\n        if (!shadingFill) {\n          ctx.setTransform.apply(ctx, owner.baseTransform);\n          if (matrix) {\n            ctx.transform.apply(ctx, matrix);\n          }\n        }\n        ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY);\n        ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY);\n        return ctx.createPattern(temporaryPatternCanvas.canvas, 'no-repeat');\n      }\n    };\n  }\n};\nShadingIRs.Dummy = {\n  fromIR: function Dummy_fromIR() {\n    return {\n      type: 'Pattern',\n      getPattern: function Dummy_fromIR_getPattern() {\n        return 'hotpink';\n      }\n    };\n  }\n};\nfunction getShadingPatternFromIR(raw) {\n  var shadingIR = ShadingIRs[raw[0]];\n  if (!shadingIR) {\n    throw new Error('Unknown IR type: ' + raw[0]);\n  }\n  return shadingIR.fromIR(raw);\n}\nvar TilingPattern = function TilingPatternClosure() {\n  var PaintType = {\n    COLORED: 1,\n    UNCOLORED: 2\n  };\n  var MAX_PATTERN_SIZE = 3000;\n  function TilingPattern(IR, color, ctx, canvasGraphicsFactory, baseTransform) {\n    this.operatorList = IR[2];\n    this.matrix = IR[3] || [1, 0, 0, 1, 0, 0];\n    this.bbox = IR[4];\n    this.xstep = IR[5];\n    this.ystep = IR[6];\n    this.paintType = IR[7];\n    this.tilingType = IR[8];\n    this.color = color;\n    this.canvasGraphicsFactory = canvasGraphicsFactory;\n    this.baseTransform = baseTransform;\n    this.type = 'Pattern';\n    this.ctx = ctx;\n  }\n  TilingPattern.prototype = {\n    createPatternCanvas: function TilinPattern_createPatternCanvas(owner) {\n      var operatorList = this.operatorList;\n      var bbox = this.bbox;\n      var xstep = this.xstep;\n      var ystep = this.ystep;\n      var paintType = this.paintType;\n      var tilingType = this.tilingType;\n      var color = this.color;\n      var canvasGraphicsFactory = this.canvasGraphicsFactory;\n      (0, _util.info)('TilingType: ' + tilingType);\n      var x0 = bbox[0],\n          y0 = bbox[1],\n          x1 = bbox[2],\n          y1 = bbox[3];\n      var topLeft = [x0, y0];\n      var botRight = [x0 + xstep, y0 + ystep];\n      var width = botRight[0] - topLeft[0];\n      var height = botRight[1] - topLeft[1];\n      var matrixScale = _util.Util.singularValueDecompose2dScale(this.matrix);\n      var curMatrixScale = _util.Util.singularValueDecompose2dScale(this.baseTransform);\n      var combinedScale = [matrixScale[0] * curMatrixScale[0], matrixScale[1] * curMatrixScale[1]];\n      width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])), MAX_PATTERN_SIZE);\n      height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])), MAX_PATTERN_SIZE);\n      var tmpCanvas = owner.cachedCanvases.getCanvas('pattern', width, height, true);\n      var tmpCtx = tmpCanvas.context;\n      var graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx);\n      graphics.groupLevel = owner.groupLevel;\n      this.setFillAndStrokeStyleToContext(tmpCtx, paintType, color);\n      this.setScale(width, height, xstep, ystep);\n      this.transformToScale(graphics);\n      var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];\n      graphics.transform.apply(graphics, tmpTranslate);\n      this.clipBbox(graphics, bbox, x0, y0, x1, y1);\n      graphics.executeOperatorList(operatorList);\n      return tmpCanvas.canvas;\n    },\n    setScale: function TilingPattern_setScale(width, height, xstep, ystep) {\n      this.scale = [width / xstep, height / ystep];\n    },\n    transformToScale: function TilingPattern_transformToScale(graphics) {\n      var scale = this.scale;\n      var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];\n      graphics.transform.apply(graphics, tmpScale);\n    },\n    scaleToContext: function TilingPattern_scaleToContext() {\n      var scale = this.scale;\n      this.ctx.scale(1 / scale[0], 1 / scale[1]);\n    },\n    clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) {\n      if ((0, _util.isArray)(bbox) && bbox.length === 4) {\n        var bboxWidth = x1 - x0;\n        var bboxHeight = y1 - y0;\n        graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);\n        graphics.clip();\n        graphics.endPath();\n      }\n    },\n    setFillAndStrokeStyleToContext: function setFillAndStrokeStyleToContext(context, paintType, color) {\n      switch (paintType) {\n        case PaintType.COLORED:\n          var ctx = this.ctx;\n          context.fillStyle = ctx.fillStyle;\n          context.strokeStyle = ctx.strokeStyle;\n          break;\n        case PaintType.UNCOLORED:\n          var cssColor = _util.Util.makeCssRgb(color[0], color[1], color[2]);\n          context.fillStyle = cssColor;\n          context.strokeStyle = cssColor;\n          break;\n        default:\n          throw new _util.FormatError('Unsupported paint type: ' + paintType);\n      }\n    },\n    getPattern: function TilingPattern_getPattern(ctx, owner) {\n      var temporaryPatternCanvas = this.createPatternCanvas(owner);\n      ctx = this.ctx;\n      ctx.setTransform.apply(ctx, this.baseTransform);\n      ctx.transform.apply(ctx, this.matrix);\n      this.scaleToContext();\n      return ctx.createPattern(temporaryPatternCanvas, 'repeat');\n    }\n  };\n  return TilingPattern;\n}();\nexports.getShadingPatternFromIR = getShadingPatternFromIR;\nexports.TilingPattern = TilingPattern;\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PDFDataTransportStream = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar PDFDataTransportStream = function PDFDataTransportStreamClosure() {\n  function PDFDataTransportStream(params, pdfDataRangeTransport) {\n    var _this = this;\n\n    (0, _util.assert)(pdfDataRangeTransport);\n    this._queuedChunks = [];\n    var initialData = params.initialData;\n    if (initialData && initialData.length > 0) {\n      var buffer = new Uint8Array(initialData).buffer;\n      this._queuedChunks.push(buffer);\n    }\n    this._pdfDataRangeTransport = pdfDataRangeTransport;\n    this._isRangeSupported = !params.disableRange;\n    this._isStreamingSupported = !params.disableStream;\n    this._contentLength = params.length;\n    this._fullRequestReader = null;\n    this._rangeReaders = [];\n    this._pdfDataRangeTransport.addRangeListener(function (begin, chunk) {\n      _this._onReceiveData({\n        begin: begin,\n        chunk: chunk\n      });\n    });\n    this._pdfDataRangeTransport.addProgressListener(function (loaded) {\n      _this._onProgress({ loaded: loaded });\n    });\n    this._pdfDataRangeTransport.addProgressiveReadListener(function (chunk) {\n      _this._onReceiveData({ chunk: chunk });\n    });\n    this._pdfDataRangeTransport.transportReady();\n  }\n  PDFDataTransportStream.prototype = {\n    _onReceiveData: function PDFDataTransportStream_onReceiveData(args) {\n      var buffer = new Uint8Array(args.chunk).buffer;\n      if (args.begin === undefined) {\n        if (this._fullRequestReader) {\n          this._fullRequestReader._enqueue(buffer);\n        } else {\n          this._queuedChunks.push(buffer);\n        }\n      } else {\n        var found = this._rangeReaders.some(function (rangeReader) {\n          if (rangeReader._begin !== args.begin) {\n            return false;\n          }\n          rangeReader._enqueue(buffer);\n          return true;\n        });\n        (0, _util.assert)(found);\n      }\n    },\n    _onProgress: function PDFDataTransportStream_onDataProgress(evt) {\n      if (this._rangeReaders.length > 0) {\n        var firstReader = this._rangeReaders[0];\n        if (firstReader.onProgress) {\n          firstReader.onProgress({ loaded: evt.loaded });\n        }\n      }\n    },\n    _removeRangeReader: function PDFDataTransportStream_removeRangeReader(reader) {\n      var i = this._rangeReaders.indexOf(reader);\n      if (i >= 0) {\n        this._rangeReaders.splice(i, 1);\n      }\n    },\n    getFullReader: function PDFDataTransportStream_getFullReader() {\n      (0, _util.assert)(!this._fullRequestReader);\n      var queuedChunks = this._queuedChunks;\n      this._queuedChunks = null;\n      return new PDFDataTransportStreamReader(this, queuedChunks);\n    },\n    getRangeReader: function PDFDataTransportStream_getRangeReader(begin, end) {\n      var reader = new PDFDataTransportStreamRangeReader(this, begin, end);\n      this._pdfDataRangeTransport.requestDataRange(begin, end);\n      this._rangeReaders.push(reader);\n      return reader;\n    },\n    cancelAllRequests: function PDFDataTransportStream_cancelAllRequests(reason) {\n      if (this._fullRequestReader) {\n        this._fullRequestReader.cancel(reason);\n      }\n      var readers = this._rangeReaders.slice(0);\n      readers.forEach(function (rangeReader) {\n        rangeReader.cancel(reason);\n      });\n      this._pdfDataRangeTransport.abort();\n    }\n  };\n  function PDFDataTransportStreamReader(stream, queuedChunks) {\n    this._stream = stream;\n    this._done = false;\n    this._queuedChunks = queuedChunks || [];\n    this._requests = [];\n    this._headersReady = Promise.resolve();\n    stream._fullRequestReader = this;\n    this.onProgress = null;\n  }\n  PDFDataTransportStreamReader.prototype = {\n    _enqueue: function PDFDataTransportStreamReader_enqueue(chunk) {\n      if (this._done) {\n        return;\n      }\n      if (this._requests.length > 0) {\n        var requestCapability = this._requests.shift();\n        requestCapability.resolve({\n          value: chunk,\n          done: false\n        });\n        return;\n      }\n      this._queuedChunks.push(chunk);\n    },\n    get headersReady() {\n      return this._headersReady;\n    },\n    get isRangeSupported() {\n      return this._stream._isRangeSupported;\n    },\n    get isStreamingSupported() {\n      return this._stream._isStreamingSupported;\n    },\n    get contentLength() {\n      return this._stream._contentLength;\n    },\n    read: function PDFDataTransportStreamReader_read() {\n      if (this._queuedChunks.length > 0) {\n        var chunk = this._queuedChunks.shift();\n        return Promise.resolve({\n          value: chunk,\n          done: false\n        });\n      }\n      if (this._done) {\n        return Promise.resolve({\n          value: undefined,\n          done: true\n        });\n      }\n      var requestCapability = (0, _util.createPromiseCapability)();\n      this._requests.push(requestCapability);\n      return requestCapability.promise;\n    },\n    cancel: function PDFDataTransportStreamReader_cancel(reason) {\n      this._done = true;\n      this._requests.forEach(function (requestCapability) {\n        requestCapability.resolve({\n          value: undefined,\n          done: true\n        });\n      });\n      this._requests = [];\n    }\n  };\n  function PDFDataTransportStreamRangeReader(stream, begin, end) {\n    this._stream = stream;\n    this._begin = begin;\n    this._end = end;\n    this._queuedChunk = null;\n    this._requests = [];\n    this._done = false;\n    this.onProgress = null;\n  }\n  PDFDataTransportStreamRangeReader.prototype = {\n    _enqueue: function PDFDataTransportStreamRangeReader_enqueue(chunk) {\n      if (this._done) {\n        return;\n      }\n      if (this._requests.length === 0) {\n        this._queuedChunk = chunk;\n      } else {\n        var requestsCapability = this._requests.shift();\n        requestsCapability.resolve({\n          value: chunk,\n          done: false\n        });\n        this._requests.forEach(function (requestCapability) {\n          requestCapability.resolve({\n            value: undefined,\n            done: true\n          });\n        });\n        this._requests = [];\n      }\n      this._done = true;\n      this._stream._removeRangeReader(this);\n    },\n    get isStreamingSupported() {\n      return false;\n    },\n    read: function PDFDataTransportStreamRangeReader_read() {\n      if (this._queuedChunk) {\n        var chunk = this._queuedChunk;\n        this._queuedChunk = null;\n        return Promise.resolve({\n          value: chunk,\n          done: false\n        });\n      }\n      if (this._done) {\n        return Promise.resolve({\n          value: undefined,\n          done: true\n        });\n      }\n      var requestCapability = (0, _util.createPromiseCapability)();\n      this._requests.push(requestCapability);\n      return requestCapability.promise;\n    },\n    cancel: function PDFDataTransportStreamRangeReader_cancel(reason) {\n      this._done = true;\n      this._requests.forEach(function (requestCapability) {\n        requestCapability.resolve({\n          value: undefined,\n          done: true\n        });\n      });\n      this._requests = [];\n      this._stream._removeRangeReader(this);\n    }\n  };\n  return PDFDataTransportStream;\n}();\nexports.PDFDataTransportStream = PDFDataTransportStream;\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar pdfjsVersion = '1.9.426';\nvar pdfjsBuild = '2558a58d';\nvar pdfjsSharedUtil = __w_pdfjs_require__(0);\nvar pdfjsDisplayGlobal = __w_pdfjs_require__(8);\nvar pdfjsDisplayAPI = __w_pdfjs_require__(2);\nvar pdfjsDisplayTextLayer = __w_pdfjs_require__(5);\nvar pdfjsDisplayAnnotationLayer = __w_pdfjs_require__(3);\nvar pdfjsDisplayDOMUtils = __w_pdfjs_require__(1);\nvar pdfjsDisplaySVG = __w_pdfjs_require__(4);\n{\n  __w_pdfjs_require__(9);\n}\nexports.PDFJS = pdfjsDisplayGlobal.PDFJS;\nexports.build = pdfjsDisplayAPI.build;\nexports.version = pdfjsDisplayAPI.version;\nexports.getDocument = pdfjsDisplayAPI.getDocument;\nexports.LoopbackPort = pdfjsDisplayAPI.LoopbackPort;\nexports.PDFDataRangeTransport = pdfjsDisplayAPI.PDFDataRangeTransport;\nexports.PDFWorker = pdfjsDisplayAPI.PDFWorker;\nexports.renderTextLayer = pdfjsDisplayTextLayer.renderTextLayer;\nexports.AnnotationLayer = pdfjsDisplayAnnotationLayer.AnnotationLayer;\nexports.CustomStyle = pdfjsDisplayDOMUtils.CustomStyle;\nexports.createPromiseCapability = pdfjsSharedUtil.createPromiseCapability;\nexports.PasswordResponses = pdfjsSharedUtil.PasswordResponses;\nexports.InvalidPDFException = pdfjsSharedUtil.InvalidPDFException;\nexports.MissingPDFException = pdfjsSharedUtil.MissingPDFException;\nexports.SVGGraphics = pdfjsDisplaySVG.SVGGraphics;\nexports.NativeImageDecoding = pdfjsSharedUtil.NativeImageDecoding;\nexports.UnexpectedResponseException = pdfjsSharedUtil.UnexpectedResponseException;\nexports.OPS = pdfjsSharedUtil.OPS;\nexports.UNSUPPORTED_FEATURES = pdfjsSharedUtil.UNSUPPORTED_FEATURES;\nexports.isValidUrl = pdfjsDisplayDOMUtils.isValidUrl;\nexports.createValidAbsoluteUrl = pdfjsSharedUtil.createValidAbsoluteUrl;\nexports.createObjectURL = pdfjsSharedUtil.createObjectURL;\nexports.removeNullCharacters = pdfjsSharedUtil.removeNullCharacters;\nexports.shadow = pdfjsSharedUtil.shadow;\nexports.createBlob = pdfjsSharedUtil.createBlob;\nexports.RenderingCancelledException = pdfjsDisplayDOMUtils.RenderingCancelledException;\nexports.getFilenameFromUrl = pdfjsDisplayDOMUtils.getFilenameFromUrl;\nexports.addLinkAttributes = pdfjsDisplayDOMUtils.addLinkAttributes;\nexports.StatTimer = pdfjsSharedUtil.StatTimer;\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nif (typeof PDFJS === 'undefined' || !PDFJS.compatibilityChecked) {\n  var globalScope = typeof window !== 'undefined' && window.Math === Math ? window : typeof global !== 'undefined' && global.Math === Math ? global : typeof self !== 'undefined' && self.Math === Math ? self :  false ? undefined : {};\n  var userAgent = typeof navigator !== 'undefined' && navigator.userAgent || '';\n  var isAndroid = /Android/.test(userAgent);\n  var isAndroidPre3 = /Android\\s[0-2][^\\d]/.test(userAgent);\n  var isAndroidPre5 = /Android\\s[0-4][^\\d]/.test(userAgent);\n  var isChrome = userAgent.indexOf('Chrom') >= 0;\n  var isChromeWithRangeBug = /Chrome\\/(39|40)\\./.test(userAgent);\n  var isIOSChrome = userAgent.indexOf('CriOS') >= 0;\n  var isIE = userAgent.indexOf('Trident') >= 0;\n  var isIOS = /\\b(iPad|iPhone|iPod)(?=;)/.test(userAgent);\n  var isOpera = userAgent.indexOf('Opera') >= 0;\n  var isSafari = /Safari\\//.test(userAgent) && !/(Chrome\\/|Android\\s)/.test(userAgent);\n  var hasDOM = (typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && (typeof document === 'undefined' ? 'undefined' : _typeof(document)) === 'object';\n  if (typeof PDFJS === 'undefined') {\n    globalScope.PDFJS = {};\n  }\n  PDFJS.compatibilityChecked = true;\n  (function checkTypedArrayCompatibility() {\n    if (typeof Uint8Array !== 'undefined') {\n      if (typeof Uint8Array.prototype.subarray === 'undefined') {\n        Uint8Array.prototype.subarray = function subarray(start, end) {\n          return new Uint8Array(this.slice(start, end));\n        };\n        Float32Array.prototype.subarray = function subarray(start, end) {\n          return new Float32Array(this.slice(start, end));\n        };\n      }\n      if (typeof Float64Array === 'undefined') {\n        globalScope.Float64Array = Float32Array;\n      }\n      return;\n    }\n    function subarray(start, end) {\n      return new TypedArray(this.slice(start, end));\n    }\n    function setArrayOffset(array, offset) {\n      if (arguments.length < 2) {\n        offset = 0;\n      }\n      for (var i = 0, n = array.length; i < n; ++i, ++offset) {\n        this[offset] = array[i] & 0xFF;\n      }\n    }\n    function Uint32ArrayView(buffer, length) {\n      this.buffer = buffer;\n      this.byteLength = buffer.length;\n      this.length = length;\n      ensureUint32ArrayViewProps(this.length);\n    }\n    Uint32ArrayView.prototype = Object.create(null);\n    var uint32ArrayViewSetters = 0;\n    function createUint32ArrayProp(index) {\n      return {\n        get: function get() {\n          var buffer = this.buffer,\n              offset = index << 2;\n          return (buffer[offset] | buffer[offset + 1] << 8 | buffer[offset + 2] << 16 | buffer[offset + 3] << 24) >>> 0;\n        },\n        set: function set(value) {\n          var buffer = this.buffer,\n              offset = index << 2;\n          buffer[offset] = value & 255;\n          buffer[offset + 1] = value >> 8 & 255;\n          buffer[offset + 2] = value >> 16 & 255;\n          buffer[offset + 3] = value >>> 24 & 255;\n        }\n      };\n    }\n    function ensureUint32ArrayViewProps(length) {\n      while (uint32ArrayViewSetters < length) {\n        Object.defineProperty(Uint32ArrayView.prototype, uint32ArrayViewSetters, createUint32ArrayProp(uint32ArrayViewSetters));\n        uint32ArrayViewSetters++;\n      }\n    }\n    function TypedArray(arg1) {\n      var result, i, n;\n      if (typeof arg1 === 'number') {\n        result = [];\n        for (i = 0; i < arg1; ++i) {\n          result[i] = 0;\n        }\n      } else if ('slice' in arg1) {\n        result = arg1.slice(0);\n      } else {\n        result = [];\n        for (i = 0, n = arg1.length; i < n; ++i) {\n          result[i] = arg1[i];\n        }\n      }\n      result.subarray = subarray;\n      result.buffer = result;\n      result.byteLength = result.length;\n      result.set = setArrayOffset;\n      if ((typeof arg1 === 'undefined' ? 'undefined' : _typeof(arg1)) === 'object' && arg1.buffer) {\n        result.buffer = arg1.buffer;\n      }\n      return result;\n    }\n    globalScope.Uint8Array = TypedArray;\n    globalScope.Int8Array = TypedArray;\n    globalScope.Int32Array = TypedArray;\n    globalScope.Uint16Array = TypedArray;\n    globalScope.Float32Array = TypedArray;\n    globalScope.Float64Array = TypedArray;\n    globalScope.Uint32Array = function () {\n      if (arguments.length === 3) {\n        if (arguments[1] !== 0) {\n          throw new Error('offset !== 0 is not supported');\n        }\n        return new Uint32ArrayView(arguments[0], arguments[2]);\n      }\n      return TypedArray.apply(this, arguments);\n    };\n  })();\n  (function canvasPixelArrayBuffer() {\n    if (!hasDOM || !window.CanvasPixelArray) {\n      return;\n    }\n    var cpaProto = window.CanvasPixelArray.prototype;\n    if ('buffer' in cpaProto) {\n      return;\n    }\n    Object.defineProperty(cpaProto, 'buffer', {\n      get: function get() {\n        return this;\n      },\n\n      enumerable: false,\n      configurable: true\n    });\n    Object.defineProperty(cpaProto, 'byteLength', {\n      get: function get() {\n        return this.length;\n      },\n\n      enumerable: false,\n      configurable: true\n    });\n  })();\n  (function normalizeURLObject() {\n    if (!globalScope.URL) {\n      globalScope.URL = globalScope.webkitURL;\n    }\n  })();\n  (function checkObjectDefinePropertyCompatibility() {\n    if (typeof Object.defineProperty !== 'undefined') {\n      var definePropertyPossible = true;\n      try {\n        if (hasDOM) {\n          Object.defineProperty(new Image(), 'id', { value: 'test' });\n        }\n        var Test = function Test() {};\n        Test.prototype = {\n          get id() {}\n        };\n        Object.defineProperty(new Test(), 'id', {\n          value: '',\n          configurable: true,\n          enumerable: true,\n          writable: false\n        });\n      } catch (e) {\n        definePropertyPossible = false;\n      }\n      if (definePropertyPossible) {\n        return;\n      }\n    }\n    Object.defineProperty = function objectDefineProperty(obj, name, def) {\n      delete obj[name];\n      if ('get' in def) {\n        obj.__defineGetter__(name, def['get']);\n      }\n      if ('set' in def) {\n        obj.__defineSetter__(name, def['set']);\n      }\n      if ('value' in def) {\n        obj.__defineSetter__(name, function objectDefinePropertySetter(value) {\n          this.__defineGetter__(name, function objectDefinePropertyGetter() {\n            return value;\n          });\n          return value;\n        });\n        obj[name] = def.value;\n      }\n    };\n  })();\n  (function checkXMLHttpRequestResponseCompatibility() {\n    if (typeof XMLHttpRequest === 'undefined') {\n      return;\n    }\n    var xhrPrototype = XMLHttpRequest.prototype;\n    var xhr = new XMLHttpRequest();\n    if (!('overrideMimeType' in xhr)) {\n      Object.defineProperty(xhrPrototype, 'overrideMimeType', {\n        value: function xmlHttpRequestOverrideMimeType(mimeType) {}\n      });\n    }\n    if ('responseType' in xhr) {\n      return;\n    }\n    Object.defineProperty(xhrPrototype, 'responseType', {\n      get: function xmlHttpRequestGetResponseType() {\n        return this._responseType || 'text';\n      },\n      set: function xmlHttpRequestSetResponseType(value) {\n        if (value === 'text' || value === 'arraybuffer') {\n          this._responseType = value;\n          if (value === 'arraybuffer' && typeof this.overrideMimeType === 'function') {\n            this.overrideMimeType('text/plain; charset=x-user-defined');\n          }\n        }\n      }\n    });\n    if (typeof VBArray !== 'undefined') {\n      Object.defineProperty(xhrPrototype, 'response', {\n        get: function xmlHttpRequestResponseGet() {\n          if (this.responseType === 'arraybuffer') {\n            return new Uint8Array(new VBArray(this.responseBody).toArray());\n          }\n          return this.responseText;\n        }\n      });\n      return;\n    }\n    Object.defineProperty(xhrPrototype, 'response', {\n      get: function xmlHttpRequestResponseGet() {\n        if (this.responseType !== 'arraybuffer') {\n          return this.responseText;\n        }\n        var text = this.responseText;\n        var i,\n            n = text.length;\n        var result = new Uint8Array(n);\n        for (i = 0; i < n; ++i) {\n          result[i] = text.charCodeAt(i) & 0xFF;\n        }\n        return result.buffer;\n      }\n    });\n  })();\n  (function checkWindowBtoaCompatibility() {\n    if ('btoa' in globalScope) {\n      return;\n    }\n    var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n    globalScope.btoa = function (chars) {\n      var buffer = '';\n      var i, n;\n      for (i = 0, n = chars.length; i < n; i += 3) {\n        var b1 = chars.charCodeAt(i) & 0xFF;\n        var b2 = chars.charCodeAt(i + 1) & 0xFF;\n        var b3 = chars.charCodeAt(i + 2) & 0xFF;\n        var d1 = b1 >> 2,\n            d2 = (b1 & 3) << 4 | b2 >> 4;\n        var d3 = i + 1 < n ? (b2 & 0xF) << 2 | b3 >> 6 : 64;\n        var d4 = i + 2 < n ? b3 & 0x3F : 64;\n        buffer += digits.charAt(d1) + digits.charAt(d2) + digits.charAt(d3) + digits.charAt(d4);\n      }\n      return buffer;\n    };\n  })();\n  (function checkWindowAtobCompatibility() {\n    if ('atob' in globalScope) {\n      return;\n    }\n    var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n    globalScope.atob = function (input) {\n      input = input.replace(/=+$/, '');\n      if (input.length % 4 === 1) {\n        throw new Error('bad atob input');\n      }\n      for (var bc = 0, bs, buffer, idx = 0, output = ''; buffer = input.charAt(idx++); ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) {\n        buffer = digits.indexOf(buffer);\n      }\n      return output;\n    };\n  })();\n  (function checkFunctionPrototypeBindCompatibility() {\n    if (typeof Function.prototype.bind !== 'undefined') {\n      return;\n    }\n    Function.prototype.bind = function functionPrototypeBind(obj) {\n      var fn = this,\n          headArgs = Array.prototype.slice.call(arguments, 1);\n      var bound = function functionPrototypeBindBound() {\n        var args = headArgs.concat(Array.prototype.slice.call(arguments));\n        return fn.apply(obj, args);\n      };\n      return bound;\n    };\n  })();\n  (function checkDatasetProperty() {\n    if (!hasDOM) {\n      return;\n    }\n    var div = document.createElement('div');\n    if ('dataset' in div) {\n      return;\n    }\n    Object.defineProperty(HTMLElement.prototype, 'dataset', {\n      get: function get() {\n        if (this._dataset) {\n          return this._dataset;\n        }\n        var dataset = {};\n        for (var j = 0, jj = this.attributes.length; j < jj; j++) {\n          var attribute = this.attributes[j];\n          if (attribute.name.substring(0, 5) !== 'data-') {\n            continue;\n          }\n          var key = attribute.name.substring(5).replace(/\\-([a-z])/g, function (all, ch) {\n            return ch.toUpperCase();\n          });\n          dataset[key] = attribute.value;\n        }\n        Object.defineProperty(this, '_dataset', {\n          value: dataset,\n          writable: false,\n          enumerable: false\n        });\n        return dataset;\n      },\n\n      enumerable: true\n    });\n  })();\n  (function checkClassListProperty() {\n    function changeList(element, itemName, add, remove) {\n      var s = element.className || '';\n      var list = s.split(/\\s+/g);\n      if (list[0] === '') {\n        list.shift();\n      }\n      var index = list.indexOf(itemName);\n      if (index < 0 && add) {\n        list.push(itemName);\n      }\n      if (index >= 0 && remove) {\n        list.splice(index, 1);\n      }\n      element.className = list.join(' ');\n      return index >= 0;\n    }\n    if (!hasDOM) {\n      return;\n    }\n    var div = document.createElement('div');\n    if ('classList' in div) {\n      return;\n    }\n    var classListPrototype = {\n      add: function add(name) {\n        changeList(this.element, name, true, false);\n      },\n      contains: function contains(name) {\n        return changeList(this.element, name, false, false);\n      },\n      remove: function remove(name) {\n        changeList(this.element, name, false, true);\n      },\n      toggle: function toggle(name) {\n        changeList(this.element, name, true, true);\n      }\n    };\n    Object.defineProperty(HTMLElement.prototype, 'classList', {\n      get: function get() {\n        if (this._classList) {\n          return this._classList;\n        }\n        var classList = Object.create(classListPrototype, {\n          element: {\n            value: this,\n            writable: false,\n            enumerable: true\n          }\n        });\n        Object.defineProperty(this, '_classList', {\n          value: classList,\n          writable: false,\n          enumerable: false\n        });\n        return classList;\n      },\n\n      enumerable: true\n    });\n  })();\n  (function checkWorkerConsoleCompatibility() {\n    if (typeof importScripts === 'undefined' || 'console' in globalScope) {\n      return;\n    }\n    var consoleTimer = {};\n    var workerConsole = {\n      log: function log() {\n        var args = Array.prototype.slice.call(arguments);\n        globalScope.postMessage({\n          targetName: 'main',\n          action: 'console_log',\n          data: args\n        });\n      },\n      error: function error() {\n        var args = Array.prototype.slice.call(arguments);\n        globalScope.postMessage({\n          targetName: 'main',\n          action: 'console_error',\n          data: args\n        });\n      },\n      time: function time(name) {\n        consoleTimer[name] = Date.now();\n      },\n      timeEnd: function timeEnd(name) {\n        var time = consoleTimer[name];\n        if (!time) {\n          throw new Error('Unknown timer name ' + name);\n        }\n        this.log('Timer:', name, Date.now() - time);\n      }\n    };\n    globalScope.console = workerConsole;\n  })();\n  (function checkConsoleCompatibility() {\n    if (!hasDOM) {\n      return;\n    }\n    if (!('console' in window)) {\n      window.console = {\n        log: function log() {},\n        error: function error() {},\n        warn: function warn() {}\n      };\n      return;\n    }\n    if (!('bind' in console.log)) {\n      console.log = function (fn) {\n        return function (msg) {\n          return fn(msg);\n        };\n      }(console.log);\n      console.error = function (fn) {\n        return function (msg) {\n          return fn(msg);\n        };\n      }(console.error);\n      console.warn = function (fn) {\n        return function (msg) {\n          return fn(msg);\n        };\n      }(console.warn);\n      return;\n    }\n  })();\n  (function checkOnClickCompatibility() {\n    function ignoreIfTargetDisabled(event) {\n      if (isDisabled(event.target)) {\n        event.stopPropagation();\n      }\n    }\n    function isDisabled(node) {\n      return node.disabled || node.parentNode && isDisabled(node.parentNode);\n    }\n    if (isOpera) {\n      document.addEventListener('click', ignoreIfTargetDisabled, true);\n    }\n  })();\n  (function checkOnBlobSupport() {\n    if (isIE || isIOSChrome) {\n      PDFJS.disableCreateObjectURL = true;\n    }\n  })();\n  (function checkNavigatorLanguage() {\n    if (typeof navigator === 'undefined') {\n      return;\n    }\n    if ('language' in navigator) {\n      return;\n    }\n    PDFJS.locale = navigator.userLanguage || 'en-US';\n  })();\n  (function checkRangeRequests() {\n    if (isSafari || isAndroidPre3 || isChromeWithRangeBug || isIOS) {\n      PDFJS.disableRange = true;\n      PDFJS.disableStream = true;\n    }\n  })();\n  (function checkHistoryManipulation() {\n    if (!hasDOM) {\n      return;\n    }\n    if (!history.pushState || isAndroidPre3) {\n      PDFJS.disableHistory = true;\n    }\n  })();\n  (function checkSetPresenceInImageData() {\n    if (!hasDOM) {\n      return;\n    }\n    if (window.CanvasPixelArray) {\n      if (typeof window.CanvasPixelArray.prototype.set !== 'function') {\n        window.CanvasPixelArray.prototype.set = function (arr) {\n          for (var i = 0, ii = this.length; i < ii; i++) {\n            this[i] = arr[i];\n          }\n        };\n      }\n    } else {\n      var polyfill = false,\n          versionMatch;\n      if (isChrome) {\n        versionMatch = userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\n        polyfill = versionMatch && parseInt(versionMatch[2]) < 21;\n      } else if (isAndroid) {\n        polyfill = isAndroidPre5;\n      } else if (isSafari) {\n        versionMatch = userAgent.match(/Version\\/([0-9]+)\\.([0-9]+)\\.([0-9]+) Safari\\//);\n        polyfill = versionMatch && parseInt(versionMatch[1]) < 6;\n      }\n      if (polyfill) {\n        var contextPrototype = window.CanvasRenderingContext2D.prototype;\n        var createImageData = contextPrototype.createImageData;\n        contextPrototype.createImageData = function (w, h) {\n          var imageData = createImageData.call(this, w, h);\n          imageData.data.set = function (arr) {\n            for (var i = 0, ii = this.length; i < ii; i++) {\n              this[i] = arr[i];\n            }\n          };\n          return imageData;\n        };\n        contextPrototype = null;\n      }\n    }\n  })();\n  (function checkRequestAnimationFrame() {\n    function installFakeAnimationFrameFunctions() {\n      window.requestAnimationFrame = function (callback) {\n        return window.setTimeout(callback, 20);\n      };\n      window.cancelAnimationFrame = function (timeoutID) {\n        window.clearTimeout(timeoutID);\n      };\n    }\n    if (!hasDOM) {\n      return;\n    }\n    if (isIOS) {\n      installFakeAnimationFrameFunctions();\n      return;\n    }\n    if ('requestAnimationFrame' in window) {\n      return;\n    }\n    window.requestAnimationFrame = window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame;\n    if (window.requestAnimationFrame) {\n      return;\n    }\n    installFakeAnimationFrameFunctions();\n  })();\n  (function checkCanvasSizeLimitation() {\n    if (isIOS || isAndroid) {\n      PDFJS.maxCanvasPixels = 5242880;\n    }\n  })();\n  (function checkFullscreenSupport() {\n    if (!hasDOM) {\n      return;\n    }\n    if (isIE && window.parent !== window) {\n      PDFJS.disableFullscreen = true;\n    }\n  })();\n  (function checkCurrentScript() {\n    if (!hasDOM) {\n      return;\n    }\n    if ('currentScript' in document) {\n      return;\n    }\n    Object.defineProperty(document, 'currentScript', {\n      get: function get() {\n        var scripts = document.getElementsByTagName('script');\n        return scripts[scripts.length - 1];\n      },\n\n      enumerable: true,\n      configurable: true\n    });\n  })();\n  (function checkInputTypeNumberAssign() {\n    if (!hasDOM) {\n      return;\n    }\n    var el = document.createElement('input');\n    try {\n      el.type = 'number';\n    } catch (ex) {\n      var inputProto = el.constructor.prototype;\n      var typeProperty = Object.getOwnPropertyDescriptor(inputProto, 'type');\n      Object.defineProperty(inputProto, 'type', {\n        get: function get() {\n          return typeProperty.get.call(this);\n        },\n        set: function set(value) {\n          typeProperty.set.call(this, value === 'number' ? 'text' : value);\n        },\n\n        enumerable: true,\n        configurable: true\n      });\n    }\n  })();\n  (function checkDocumentReadyState() {\n    if (!hasDOM) {\n      return;\n    }\n    if (!document.attachEvent) {\n      return;\n    }\n    var documentProto = document.constructor.prototype;\n    var readyStateProto = Object.getOwnPropertyDescriptor(documentProto, 'readyState');\n    Object.defineProperty(documentProto, 'readyState', {\n      get: function get() {\n        var value = readyStateProto.get.call(this);\n        return value === 'interactive' ? 'loading' : value;\n      },\n      set: function set(value) {\n        readyStateProto.set.call(this, value);\n      },\n\n      enumerable: true,\n      configurable: true\n    });\n  })();\n  (function checkChildNodeRemove() {\n    if (!hasDOM) {\n      return;\n    }\n    if (typeof Element.prototype.remove !== 'undefined') {\n      return;\n    }\n    Element.prototype.remove = function () {\n      if (this.parentNode) {\n        this.parentNode.removeChild(this);\n      }\n    };\n  })();\n  (function checkNumberIsNaN() {\n    if (Number.isNaN) {\n      return;\n    }\n    Number.isNaN = function (value) {\n      return typeof value === 'number' && isNaN(value);\n    };\n  })();\n  (function checkNumberIsInteger() {\n    if (Number.isInteger) {\n      return;\n    }\n    Number.isInteger = function (value) {\n      return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;\n    };\n  })();\n  (function checkPromise() {\n    if (globalScope.Promise) {\n      if (typeof globalScope.Promise.all !== 'function') {\n        globalScope.Promise.all = function (iterable) {\n          var count = 0,\n              results = [],\n              resolve,\n              reject;\n          var promise = new globalScope.Promise(function (resolve_, reject_) {\n            resolve = resolve_;\n            reject = reject_;\n          });\n          iterable.forEach(function (p, i) {\n            count++;\n            p.then(function (result) {\n              results[i] = result;\n              count--;\n              if (count === 0) {\n                resolve(results);\n              }\n            }, reject);\n          });\n          if (count === 0) {\n            resolve(results);\n          }\n          return promise;\n        };\n      }\n      if (typeof globalScope.Promise.resolve !== 'function') {\n        globalScope.Promise.resolve = function (value) {\n          return new globalScope.Promise(function (resolve) {\n            resolve(value);\n          });\n        };\n      }\n      if (typeof globalScope.Promise.reject !== 'function') {\n        globalScope.Promise.reject = function (reason) {\n          return new globalScope.Promise(function (resolve, reject) {\n            reject(reason);\n          });\n        };\n      }\n      if (typeof globalScope.Promise.prototype.catch !== 'function') {\n        globalScope.Promise.prototype.catch = function (onReject) {\n          return globalScope.Promise.prototype.then(undefined, onReject);\n        };\n      }\n      return;\n    }\n    var STATUS_PENDING = 0;\n    var STATUS_RESOLVED = 1;\n    var STATUS_REJECTED = 2;\n    var REJECTION_TIMEOUT = 500;\n    var HandlerManager = {\n      handlers: [],\n      running: false,\n      unhandledRejections: [],\n      pendingRejectionCheck: false,\n      scheduleHandlers: function scheduleHandlers(promise) {\n        if (promise._status === STATUS_PENDING) {\n          return;\n        }\n        this.handlers = this.handlers.concat(promise._handlers);\n        promise._handlers = [];\n        if (this.running) {\n          return;\n        }\n        this.running = true;\n        setTimeout(this.runHandlers.bind(this), 0);\n      },\n      runHandlers: function runHandlers() {\n        var RUN_TIMEOUT = 1;\n        var timeoutAt = Date.now() + RUN_TIMEOUT;\n        while (this.handlers.length > 0) {\n          var handler = this.handlers.shift();\n          var nextStatus = handler.thisPromise._status;\n          var nextValue = handler.thisPromise._value;\n          try {\n            if (nextStatus === STATUS_RESOLVED) {\n              if (typeof handler.onResolve === 'function') {\n                nextValue = handler.onResolve(nextValue);\n              }\n            } else if (typeof handler.onReject === 'function') {\n              nextValue = handler.onReject(nextValue);\n              nextStatus = STATUS_RESOLVED;\n              if (handler.thisPromise._unhandledRejection) {\n                this.removeUnhandeledRejection(handler.thisPromise);\n              }\n            }\n          } catch (ex) {\n            nextStatus = STATUS_REJECTED;\n            nextValue = ex;\n          }\n          handler.nextPromise._updateStatus(nextStatus, nextValue);\n          if (Date.now() >= timeoutAt) {\n            break;\n          }\n        }\n        if (this.handlers.length > 0) {\n          setTimeout(this.runHandlers.bind(this), 0);\n          return;\n        }\n        this.running = false;\n      },\n      addUnhandledRejection: function addUnhandledRejection(promise) {\n        this.unhandledRejections.push({\n          promise: promise,\n          time: Date.now()\n        });\n        this.scheduleRejectionCheck();\n      },\n      removeUnhandeledRejection: function removeUnhandeledRejection(promise) {\n        promise._unhandledRejection = false;\n        for (var i = 0; i < this.unhandledRejections.length; i++) {\n          if (this.unhandledRejections[i].promise === promise) {\n            this.unhandledRejections.splice(i);\n            i--;\n          }\n        }\n      },\n      scheduleRejectionCheck: function scheduleRejectionCheck() {\n        var _this = this;\n\n        if (this.pendingRejectionCheck) {\n          return;\n        }\n        this.pendingRejectionCheck = true;\n        setTimeout(function () {\n          _this.pendingRejectionCheck = false;\n          var now = Date.now();\n          for (var i = 0; i < _this.unhandledRejections.length; i++) {\n            if (now - _this.unhandledRejections[i].time > REJECTION_TIMEOUT) {\n              var unhandled = _this.unhandledRejections[i].promise._value;\n              var msg = 'Unhandled rejection: ' + unhandled;\n              if (unhandled.stack) {\n                msg += '\\n' + unhandled.stack;\n              }\n              try {\n                throw new Error(msg);\n              } catch (_) {\n                console.warn(msg);\n              }\n              _this.unhandledRejections.splice(i);\n              i--;\n            }\n          }\n          if (_this.unhandledRejections.length) {\n            _this.scheduleRejectionCheck();\n          }\n        }, REJECTION_TIMEOUT);\n      }\n    };\n    var Promise = function Promise(resolver) {\n      this._status = STATUS_PENDING;\n      this._handlers = [];\n      try {\n        resolver.call(this, this._resolve.bind(this), this._reject.bind(this));\n      } catch (e) {\n        this._reject(e);\n      }\n    };\n    Promise.all = function Promise_all(promises) {\n      var resolveAll, rejectAll;\n      var deferred = new Promise(function (resolve, reject) {\n        resolveAll = resolve;\n        rejectAll = reject;\n      });\n      var unresolved = promises.length;\n      var results = [];\n      if (unresolved === 0) {\n        resolveAll(results);\n        return deferred;\n      }\n      function reject(reason) {\n        if (deferred._status === STATUS_REJECTED) {\n          return;\n        }\n        results = [];\n        rejectAll(reason);\n      }\n      for (var i = 0, ii = promises.length; i < ii; ++i) {\n        var promise = promises[i];\n        var resolve = function (i) {\n          return function (value) {\n            if (deferred._status === STATUS_REJECTED) {\n              return;\n            }\n            results[i] = value;\n            unresolved--;\n            if (unresolved === 0) {\n              resolveAll(results);\n            }\n          };\n        }(i);\n        if (Promise.isPromise(promise)) {\n          promise.then(resolve, reject);\n        } else {\n          resolve(promise);\n        }\n      }\n      return deferred;\n    };\n    Promise.isPromise = function Promise_isPromise(value) {\n      return value && typeof value.then === 'function';\n    };\n    Promise.resolve = function Promise_resolve(value) {\n      return new Promise(function (resolve) {\n        resolve(value);\n      });\n    };\n    Promise.reject = function Promise_reject(reason) {\n      return new Promise(function (resolve, reject) {\n        reject(reason);\n      });\n    };\n    Promise.prototype = {\n      _status: null,\n      _value: null,\n      _handlers: null,\n      _unhandledRejection: null,\n      _updateStatus: function Promise__updateStatus(status, value) {\n        if (this._status === STATUS_RESOLVED || this._status === STATUS_REJECTED) {\n          return;\n        }\n        if (status === STATUS_RESOLVED && Promise.isPromise(value)) {\n          value.then(this._updateStatus.bind(this, STATUS_RESOLVED), this._updateStatus.bind(this, STATUS_REJECTED));\n          return;\n        }\n        this._status = status;\n        this._value = value;\n        if (status === STATUS_REJECTED && this._handlers.length === 0) {\n          this._unhandledRejection = true;\n          HandlerManager.addUnhandledRejection(this);\n        }\n        HandlerManager.scheduleHandlers(this);\n      },\n      _resolve: function Promise_resolve(value) {\n        this._updateStatus(STATUS_RESOLVED, value);\n      },\n      _reject: function Promise_reject(reason) {\n        this._updateStatus(STATUS_REJECTED, reason);\n      },\n      then: function Promise_then(onResolve, onReject) {\n        var nextPromise = new Promise(function (resolve, reject) {\n          this.resolve = resolve;\n          this.reject = reject;\n        });\n        this._handlers.push({\n          thisPromise: this,\n          onResolve: onResolve,\n          onReject: onReject,\n          nextPromise: nextPromise\n        });\n        HandlerManager.scheduleHandlers(this);\n        return nextPromise;\n      },\n      catch: function Promise_catch(onReject) {\n        return this.then(undefined, onReject);\n      }\n    };\n    globalScope.Promise = Promise;\n  })();\n  (function checkWeakMap() {\n    if (globalScope.WeakMap) {\n      return;\n    }\n    var id = 0;\n    function WeakMap() {\n      this.id = '$weakmap' + id++;\n    }\n    WeakMap.prototype = {\n      has: function has(obj) {\n        if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object' && typeof obj !== 'function' || obj === null) {\n          return false;\n        }\n        return !!Object.getOwnPropertyDescriptor(obj, this.id);\n      },\n      get: function get(obj) {\n        return this.has(obj) ? obj[this.id] : undefined;\n      },\n      set: function set(obj, value) {\n        Object.defineProperty(obj, this.id, {\n          value: value,\n          enumerable: false,\n          configurable: true\n        });\n      },\n      delete: function _delete(obj) {\n        delete obj[this.id];\n      }\n    };\n    globalScope.WeakMap = WeakMap;\n  })();\n  (function checkURLConstructor() {\n    var hasWorkingUrl = false;\n    try {\n      if (typeof URL === 'function' && _typeof(URL.prototype) === 'object' && 'origin' in URL.prototype) {\n        var u = new URL('b', 'http://a');\n        u.pathname = 'c%20d';\n        hasWorkingUrl = u.href === 'http://a/c%20d';\n      }\n    } catch (e) {}\n    if (hasWorkingUrl) {\n      return;\n    }\n    var relative = Object.create(null);\n    relative['ftp'] = 21;\n    relative['file'] = 0;\n    relative['gopher'] = 70;\n    relative['http'] = 80;\n    relative['https'] = 443;\n    relative['ws'] = 80;\n    relative['wss'] = 443;\n    var relativePathDotMapping = Object.create(null);\n    relativePathDotMapping['%2e'] = '.';\n    relativePathDotMapping['.%2e'] = '..';\n    relativePathDotMapping['%2e.'] = '..';\n    relativePathDotMapping['%2e%2e'] = '..';\n    function isRelativeScheme(scheme) {\n      return relative[scheme] !== undefined;\n    }\n    function invalid() {\n      clear.call(this);\n      this._isInvalid = true;\n    }\n    function IDNAToASCII(h) {\n      if (h === '') {\n        invalid.call(this);\n      }\n      return h.toLowerCase();\n    }\n    function percentEscape(c) {\n      var unicode = c.charCodeAt(0);\n      if (unicode > 0x20 && unicode < 0x7F && [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) === -1) {\n        return c;\n      }\n      return encodeURIComponent(c);\n    }\n    function percentEscapeQuery(c) {\n      var unicode = c.charCodeAt(0);\n      if (unicode > 0x20 && unicode < 0x7F && [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) === -1) {\n        return c;\n      }\n      return encodeURIComponent(c);\n    }\n    var EOF,\n        ALPHA = /[a-zA-Z]/,\n        ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n    function parse(input, stateOverride, base) {\n      function err(message) {\n        errors.push(message);\n      }\n      var state = stateOverride || 'scheme start',\n          cursor = 0,\n          buffer = '',\n          seenAt = false,\n          seenBracket = false,\n          errors = [];\n      loop: while ((input[cursor - 1] !== EOF || cursor === 0) && !this._isInvalid) {\n        var c = input[cursor];\n        switch (state) {\n          case 'scheme start':\n            if (c && ALPHA.test(c)) {\n              buffer += c.toLowerCase();\n              state = 'scheme';\n            } else if (!stateOverride) {\n              buffer = '';\n              state = 'no scheme';\n              continue;\n            } else {\n              err('Invalid scheme.');\n              break loop;\n            }\n            break;\n          case 'scheme':\n            if (c && ALPHANUMERIC.test(c)) {\n              buffer += c.toLowerCase();\n            } else if (c === ':') {\n              this._scheme = buffer;\n              buffer = '';\n              if (stateOverride) {\n                break loop;\n              }\n              if (isRelativeScheme(this._scheme)) {\n                this._isRelative = true;\n              }\n              if (this._scheme === 'file') {\n                state = 'relative';\n              } else if (this._isRelative && base && base._scheme === this._scheme) {\n                state = 'relative or authority';\n              } else if (this._isRelative) {\n                state = 'authority first slash';\n              } else {\n                state = 'scheme data';\n              }\n            } else if (!stateOverride) {\n              buffer = '';\n              cursor = 0;\n              state = 'no scheme';\n              continue;\n            } else if (c === EOF) {\n              break loop;\n            } else {\n              err('Code point not allowed in scheme: ' + c);\n              break loop;\n            }\n            break;\n          case 'scheme data':\n            if (c === '?') {\n              this._query = '?';\n              state = 'query';\n            } else if (c === '#') {\n              this._fragment = '#';\n              state = 'fragment';\n            } else {\n              if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n                this._schemeData += percentEscape(c);\n              }\n            }\n            break;\n          case 'no scheme':\n            if (!base || !isRelativeScheme(base._scheme)) {\n              err('Missing scheme.');\n              invalid.call(this);\n            } else {\n              state = 'relative';\n              continue;\n            }\n            break;\n          case 'relative or authority':\n            if (c === '/' && input[cursor + 1] === '/') {\n              state = 'authority ignore slashes';\n            } else {\n              err('Expected /, got: ' + c);\n              state = 'relative';\n              continue;\n            }\n            break;\n          case 'relative':\n            this._isRelative = true;\n            if (this._scheme !== 'file') {\n              this._scheme = base._scheme;\n            }\n            if (c === EOF) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._query = base._query;\n              this._username = base._username;\n              this._password = base._password;\n              break loop;\n            } else if (c === '/' || c === '\\\\') {\n              if (c === '\\\\') {\n                err('\\\\ is an invalid code point.');\n              }\n              state = 'relative slash';\n            } else if (c === '?') {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._query = '?';\n              this._username = base._username;\n              this._password = base._password;\n              state = 'query';\n            } else if (c === '#') {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._query = base._query;\n              this._fragment = '#';\n              this._username = base._username;\n              this._password = base._password;\n              state = 'fragment';\n            } else {\n              var nextC = input[cursor + 1];\n              var nextNextC = input[cursor + 2];\n              if (this._scheme !== 'file' || !ALPHA.test(c) || nextC !== ':' && nextC !== '|' || nextNextC !== EOF && nextNextC !== '/' && nextNextC !== '\\\\' && nextNextC !== '?' && nextNextC !== '#') {\n                this._host = base._host;\n                this._port = base._port;\n                this._username = base._username;\n                this._password = base._password;\n                this._path = base._path.slice();\n                this._path.pop();\n              }\n              state = 'relative path';\n              continue;\n            }\n            break;\n          case 'relative slash':\n            if (c === '/' || c === '\\\\') {\n              if (c === '\\\\') {\n                err('\\\\ is an invalid code point.');\n              }\n              if (this._scheme === 'file') {\n                state = 'file host';\n              } else {\n                state = 'authority ignore slashes';\n              }\n            } else {\n              if (this._scheme !== 'file') {\n                this._host = base._host;\n                this._port = base._port;\n                this._username = base._username;\n                this._password = base._password;\n              }\n              state = 'relative path';\n              continue;\n            }\n            break;\n          case 'authority first slash':\n            if (c === '/') {\n              state = 'authority second slash';\n            } else {\n              err('Expected \\'/\\', got: ' + c);\n              state = 'authority ignore slashes';\n              continue;\n            }\n            break;\n          case 'authority second slash':\n            state = 'authority ignore slashes';\n            if (c !== '/') {\n              err('Expected \\'/\\', got: ' + c);\n              continue;\n            }\n            break;\n          case 'authority ignore slashes':\n            if (c !== '/' && c !== '\\\\') {\n              state = 'authority';\n              continue;\n            } else {\n              err('Expected authority, got: ' + c);\n            }\n            break;\n          case 'authority':\n            if (c === '@') {\n              if (seenAt) {\n                err('@ already seen.');\n                buffer += '%40';\n              }\n              seenAt = true;\n              for (var i = 0; i < buffer.length; i++) {\n                var cp = buffer[i];\n                if (cp === '\\t' || cp === '\\n' || cp === '\\r') {\n                  err('Invalid whitespace in authority.');\n                  continue;\n                }\n                if (cp === ':' && this._password === null) {\n                  this._password = '';\n                  continue;\n                }\n                var tempC = percentEscape(cp);\n                if (this._password !== null) {\n                  this._password += tempC;\n                } else {\n                  this._username += tempC;\n                }\n              }\n              buffer = '';\n            } else if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#') {\n              cursor -= buffer.length;\n              buffer = '';\n              state = 'host';\n              continue;\n            } else {\n              buffer += c;\n            }\n            break;\n          case 'file host':\n            if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#') {\n              if (buffer.length === 2 && ALPHA.test(buffer[0]) && (buffer[1] === ':' || buffer[1] === '|')) {\n                state = 'relative path';\n              } else if (buffer.length === 0) {\n                state = 'relative path start';\n              } else {\n                this._host = IDNAToASCII.call(this, buffer);\n                buffer = '';\n                state = 'relative path start';\n              }\n              continue;\n            } else if (c === '\\t' || c === '\\n' || c === '\\r') {\n              err('Invalid whitespace in file host.');\n            } else {\n              buffer += c;\n            }\n            break;\n          case 'host':\n          case 'hostname':\n            if (c === ':' && !seenBracket) {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'port';\n              if (stateOverride === 'hostname') {\n                break loop;\n              }\n            } else if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#') {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n              if (stateOverride) {\n                break loop;\n              }\n              continue;\n            } else if (c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              if (c === '[') {\n                seenBracket = true;\n              } else if (c === ']') {\n                seenBracket = false;\n              }\n              buffer += c;\n            } else {\n              err('Invalid code point in host/hostname: ' + c);\n            }\n            break;\n          case 'port':\n            if (/[0-9]/.test(c)) {\n              buffer += c;\n            } else if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#' || stateOverride) {\n              if (buffer !== '') {\n                var temp = parseInt(buffer, 10);\n                if (temp !== relative[this._scheme]) {\n                  this._port = temp + '';\n                }\n                buffer = '';\n              }\n              if (stateOverride) {\n                break loop;\n              }\n              state = 'relative path start';\n              continue;\n            } else if (c === '\\t' || c === '\\n' || c === '\\r') {\n              err('Invalid code point in port: ' + c);\n            } else {\n              invalid.call(this);\n            }\n            break;\n          case 'relative path start':\n            if (c === '\\\\') {\n              err('\\'\\\\\\' not allowed in path.');\n            }\n            state = 'relative path';\n            if (c !== '/' && c !== '\\\\') {\n              continue;\n            }\n            break;\n          case 'relative path':\n            if (c === EOF || c === '/' || c === '\\\\' || !stateOverride && (c === '?' || c === '#')) {\n              if (c === '\\\\') {\n                err('\\\\ not allowed in relative path.');\n              }\n              var tmp;\n              if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n                buffer = tmp;\n              }\n              if (buffer === '..') {\n                this._path.pop();\n                if (c !== '/' && c !== '\\\\') {\n                  this._path.push('');\n                }\n              } else if (buffer === '.' && c !== '/' && c !== '\\\\') {\n                this._path.push('');\n              } else if (buffer !== '.') {\n                if (this._scheme === 'file' && this._path.length === 0 && buffer.length === 2 && ALPHA.test(buffer[0]) && buffer[1] === '|') {\n                  buffer = buffer[0] + ':';\n                }\n                this._path.push(buffer);\n              }\n              buffer = '';\n              if (c === '?') {\n                this._query = '?';\n                state = 'query';\n              } else if (c === '#') {\n                this._fragment = '#';\n                state = 'fragment';\n              }\n            } else if (c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              buffer += percentEscape(c);\n            }\n            break;\n          case 'query':\n            if (!stateOverride && c === '#') {\n              this._fragment = '#';\n              state = 'fragment';\n            } else if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              this._query += percentEscapeQuery(c);\n            }\n            break;\n          case 'fragment':\n            if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              this._fragment += c;\n            }\n            break;\n        }\n        cursor++;\n      }\n    }\n    function clear() {\n      this._scheme = '';\n      this._schemeData = '';\n      this._username = '';\n      this._password = null;\n      this._host = '';\n      this._port = '';\n      this._path = [];\n      this._query = '';\n      this._fragment = '';\n      this._isInvalid = false;\n      this._isRelative = false;\n    }\n    function JURL(url, base) {\n      if (base !== undefined && !(base instanceof JURL)) {\n        base = new JURL(String(base));\n      }\n      this._url = url;\n      clear.call(this);\n      var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n      parse.call(this, input, null, base);\n    }\n    JURL.prototype = {\n      toString: function toString() {\n        return this.href;\n      },\n\n      get href() {\n        if (this._isInvalid) {\n          return this._url;\n        }\n        var authority = '';\n        if (this._username !== '' || this._password !== null) {\n          authority = this._username + (this._password !== null ? ':' + this._password : '') + '@';\n        }\n        return this.protocol + (this._isRelative ? '//' + authority + this.host : '') + this.pathname + this._query + this._fragment;\n      },\n      set href(value) {\n        clear.call(this);\n        parse.call(this, value);\n      },\n      get protocol() {\n        return this._scheme + ':';\n      },\n      set protocol(value) {\n        if (this._isInvalid) {\n          return;\n        }\n        parse.call(this, value + ':', 'scheme start');\n      },\n      get host() {\n        return this._isInvalid ? '' : this._port ? this._host + ':' + this._port : this._host;\n      },\n      set host(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        parse.call(this, value, 'host');\n      },\n      get hostname() {\n        return this._host;\n      },\n      set hostname(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        parse.call(this, value, 'hostname');\n      },\n      get port() {\n        return this._port;\n      },\n      set port(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        parse.call(this, value, 'port');\n      },\n      get pathname() {\n        return this._isInvalid ? '' : this._isRelative ? '/' + this._path.join('/') : this._schemeData;\n      },\n      set pathname(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        this._path = [];\n        parse.call(this, value, 'relative path start');\n      },\n      get search() {\n        return this._isInvalid || !this._query || this._query === '?' ? '' : this._query;\n      },\n      set search(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        this._query = '?';\n        if (value[0] === '?') {\n          value = value.slice(1);\n        }\n        parse.call(this, value, 'query');\n      },\n      get hash() {\n        return this._isInvalid || !this._fragment || this._fragment === '#' ? '' : this._fragment;\n      },\n      set hash(value) {\n        if (this._isInvalid) {\n          return;\n        }\n        this._fragment = '#';\n        if (value[0] === '#') {\n          value = value.slice(1);\n        }\n        parse.call(this, value, 'fragment');\n      },\n      get origin() {\n        var host;\n        if (this._isInvalid || !this._scheme) {\n          return '';\n        }\n        switch (this._scheme) {\n          case 'data':\n          case 'file':\n          case 'javascript':\n          case 'mailto':\n            return 'null';\n          case 'blob':\n            try {\n              return new JURL(this._schemeData).origin || 'null';\n            } catch (_) {}\n            return 'null';\n        }\n        host = this.host;\n        if (!host) {\n          return '';\n        }\n        return this._scheme + '://' + host;\n      }\n    };\n    var OriginalURL = globalScope.URL;\n    if (OriginalURL) {\n      JURL.createObjectURL = function (blob) {\n        return OriginalURL.createObjectURL.apply(OriginalURL, arguments);\n      };\n      JURL.revokeObjectURL = function (url) {\n        OriginalURL.revokeObjectURL(url);\n      };\n    }\n    globalScope.URL = JURL;\n  })();\n}\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar isReadableStreamSupported = false;\nif (typeof ReadableStream !== 'undefined') {\n  try {\n    new ReadableStream({\n      start: function start(controller) {\n        controller.close();\n      }\n    });\n    isReadableStreamSupported = true;\n  } catch (e) {}\n}\nif (isReadableStreamSupported) {\n  exports.ReadableStream = ReadableStream;\n} else {\n  exports.ReadableStream = __w_pdfjs_require__(10).ReadableStream;\n}\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=pdf.js.map"
  },
  {
    "path": "example/pages/include/pdf/pdf.viewer.css",
    "content": "/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n.textLayer {\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  overflow: hidden;\n  opacity: 0.2;\n  line-height: 1;\n}\n\n.textLayer > div {\n  color: transparent;\n  position: absolute;\n  white-space: pre;\n  cursor: text;\n  -webkit-transform-origin: 0% 0%;\n  -moz-transform-origin: 0% 0%;\n  -o-transform-origin: 0% 0%;\n  -ms-transform-origin: 0% 0%;\n  transform-origin: 0% 0%;\n}\n\n.textLayer .highlight {\n  margin: -1px;\n  padding: 1px;\n\n  background-color: rgb(180, 0, 170);\n  border-radius: 4px;\n}\n\n.textLayer .highlight.begin {\n  border-radius: 4px 0px 0px 4px;\n}\n\n.textLayer .highlight.end {\n  border-radius: 0px 4px 4px 0px;\n}\n\n.textLayer .highlight.middle {\n  border-radius: 0px;\n}\n\n.textLayer .highlight.selected {\n  background-color: rgb(0, 100, 0);\n}\n\n.textLayer ::selection {\n  background: rgb(0, 0, 255);\n}\n.textLayer ::-moz-selection {\n  background: rgb(0, 0, 255);\n}\n\n.textLayer .endOfContent {\n  display: block;\n  position: absolute;\n  left: 0px;\n  top: 100%;\n  right: 0px;\n  bottom: 0px;\n  z-index: -1;\n  cursor: default;\n  -webkit-user-select: none;\n  -ms-user-select: none;\n  -moz-user-select: none;\n}\n\n.textLayer .endOfContent.active {\n  top: 0px;\n}\n\n.annotationLayer section {\n  position: absolute;\n}\n\n.annotationLayer .linkAnnotation > a {\n  position: absolute;\n  font-size: 1em;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.annotationLayer .linkAnnotation > a /* -ms-a */ {\n  background: url(\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\")\n    0 0 repeat;\n}\n\n.annotationLayer .linkAnnotation > a:hover {\n  opacity: 0.2;\n  background: #ff0;\n  box-shadow: 0px 2px 10px #ff0;\n}\n\n.annotationLayer .textAnnotation img {\n  position: absolute;\n  cursor: pointer;\n}\n\n.annotationLayer .textWidgetAnnotation input,\n.annotationLayer .textWidgetAnnotation textarea,\n.annotationLayer .choiceWidgetAnnotation select,\n.annotationLayer .buttonWidgetAnnotation.checkBox input,\n.annotationLayer .buttonWidgetAnnotation.radioButton input {\n  background-color: rgba(0, 54, 255, 0.13);\n  border: 1px solid transparent;\n  box-sizing: border-box;\n  font-size: 9px;\n  height: 100%;\n  padding: 0 3px;\n  vertical-align: top;\n  width: 100%;\n}\n\n.annotationLayer .textWidgetAnnotation textarea {\n  font: message-box;\n  font-size: 9px;\n  resize: none;\n}\n\n.annotationLayer .textWidgetAnnotation input[disabled],\n.annotationLayer .textWidgetAnnotation textarea[disabled],\n.annotationLayer .choiceWidgetAnnotation select[disabled],\n.annotationLayer .buttonWidgetAnnotation.checkBox input[disabled],\n.annotationLayer .buttonWidgetAnnotation.radioButton input[disabled] {\n  background: none;\n  border: 1px solid transparent;\n  cursor: not-allowed;\n}\n\n.annotationLayer .textWidgetAnnotation input:hover,\n.annotationLayer .textWidgetAnnotation textarea:hover,\n.annotationLayer .choiceWidgetAnnotation select:hover,\n.annotationLayer .buttonWidgetAnnotation.checkBox input:hover,\n.annotationLayer .buttonWidgetAnnotation.radioButton input:hover {\n  border: 1px solid #000;\n}\n\n.annotationLayer .textWidgetAnnotation input:focus,\n.annotationLayer .textWidgetAnnotation textarea:focus,\n.annotationLayer .choiceWidgetAnnotation select:focus {\n  background: none;\n  border: 1px solid transparent;\n}\n\n.annotationLayer .textWidgetAnnotation input.comb {\n  font-family: monospace;\n  padding-left: 2px;\n  padding-right: 0;\n}\n\n.annotationLayer .textWidgetAnnotation input.comb:focus {\n  /*\n   * Letter spacing is placed on the right side of each character. Hence, the\n   * letter spacing of the last character may be placed outside the visible\n   * area, causing horizontal scrolling. We avoid this by extending the width\n   * when the element has focus and revert this when it loses focus.\n   */\n  width: 115%;\n}\n\n.annotationLayer .buttonWidgetAnnotation.checkBox input,\n.annotationLayer .buttonWidgetAnnotation.radioButton input {\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  -ms-appearance: none;\n  appearance: none;\n}\n\n.annotationLayer .popupWrapper {\n  position: absolute;\n  width: 20em;\n}\n\n.annotationLayer .popup {\n  position: absolute;\n  z-index: 200;\n  max-width: 20em;\n  background-color: #ffff99;\n  box-shadow: 0px 2px 5px #333;\n  border-radius: 2px;\n  padding: 0.6em;\n  margin-left: 5px;\n  cursor: pointer;\n  word-wrap: break-word;\n}\n\n.annotationLayer .popup h1 {\n  font-size: 1em;\n  border-bottom: 1px solid #000000;\n  padding-bottom: 0.2em;\n}\n\n.annotationLayer .popup p {\n  padding-top: 0.2em;\n}\n\n.annotationLayer .highlightAnnotation,\n.annotationLayer .underlineAnnotation,\n.annotationLayer .squigglyAnnotation,\n.annotationLayer .strikeoutAnnotation,\n.annotationLayer .lineAnnotation svg line,\n.annotationLayer .fileAttachmentAnnotation {\n  cursor: pointer;\n}\n\n.pdfViewer .canvasWrapper {\n  overflow: hidden;\n}\n\n.pdfViewer .page {\n  direction: ltr;\n  width: 816px;\n  height: 1056px;\n  margin: 1px auto -8px auto;\n  position: relative;\n  overflow: visible;\n  border: 9px solid transparent;\n  background-clip: content-box;\n  border-image: url(images/shadow.png) 9 9 repeat;\n  background-color: white;\n}\n\n.pdfViewer.removePageBorders .page {\n  margin: 0px auto 10px auto;\n  border: none;\n}\n\n.pdfViewer.singlePageView {\n  display: inline-block;\n}\n\n.pdfViewer.singlePageView .page {\n  margin: 0;\n  border: none;\n}\n\n.pdfViewer .page canvas {\n  margin: 0;\n  display: block;\n}\n\n.pdfViewer .page canvas[hidden] {\n  display: none;\n}\n\n.pdfViewer .page .loadingIcon {\n  position: absolute;\n  display: block;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  background: url(\"images/loading-icon.gif\") center no-repeat;\n}\n\n.pdfPresentationMode:-webkit-full-screen .pdfViewer .page {\n  margin-bottom: 100%;\n  border: 0;\n}\n\n.pdfPresentationMode:-moz-full-screen .pdfViewer .page {\n  margin-bottom: 100%;\n  border: 0;\n}\n\n.pdfPresentationMode:-ms-fullscreen .pdfViewer .page {\n  margin-bottom: 100% !important;\n  border: 0;\n}\n\n.pdfPresentationMode:fullscreen .pdfViewer .page {\n  margin-bottom: 100%;\n  border: 0;\n}\n\n#mainPdfWarrper >* {\n  padding: 0;\n  margin: 0;\n}\n\n#mainPdfWarrper {\n  height: 100%;\n  width: 100%;\n  /* Font size is needed to make the activity bar the correct size. */\n  font-size: 10px;\n}\n\n#mainPdfWarrper {\n  height: 100%;\n  width: 100%;\n  background-color: #404040;\n  background-image: url(images/texture.png);\n}\n\n#mainPdfWarrper,\ninput,\nbutton,\nselect {\n  font: message-box;\n  outline: none;\n}\n\n.hidden {\n  display: none !important;\n}\n[hidden] {\n  display: none !important;\n}\n\n#viewerContainer.pdfPresentationMode:-webkit-full-screen {\n  top: 0px;\n  border-top: 2px solid transparent;\n  background-color: #000;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  cursor: none;\n  -webkit-user-select: none;\n}\n\n#viewerContainer.pdfPresentationMode:-moz-full-screen {\n  top: 0px;\n  border-top: 2px solid transparent;\n  background-color: #000;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  cursor: none;\n  -moz-user-select: none;\n}\n\n#viewerContainer.pdfPresentationMode:-ms-fullscreen {\n  top: 0px !important;\n  border-top: 2px solid transparent;\n  width: 100%;\n  height: 100%;\n  overflow: hidden !important;\n  cursor: none;\n  -ms-user-select: none;\n}\n\n#viewerContainer.pdfPresentationMode:-ms-fullscreen::-ms-backdrop {\n  background-color: #000;\n}\n\n#viewerContainer.pdfPresentationMode:fullscreen {\n  top: 0px;\n  border-top: 2px solid transparent;\n  background-color: #000;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  cursor: none;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n}\n\n.pdfPresentationMode:-webkit-full-screen a:not(.internalLink) {\n  display: none;\n}\n\n.pdfPresentationMode:-moz-full-screen a:not(.internalLink) {\n  display: none;\n}\n\n.pdfPresentationMode:-ms-fullscreen a:not(.internalLink) {\n  display: none !important;\n}\n\n.pdfPresentationMode:fullscreen a:not(.internalLink) {\n  display: none;\n}\n\n.pdfPresentationMode:-webkit-full-screen .textLayer > div {\n  cursor: none;\n}\n\n.pdfPresentationMode:-moz-full-screen .textLayer > div {\n  cursor: none;\n}\n\n.pdfPresentationMode:-ms-fullscreen .textLayer > div {\n  cursor: none;\n}\n\n.pdfPresentationMode:fullscreen .textLayer > div {\n  cursor: none;\n}\n\n.pdfPresentationMode.pdfPresentationModeControls > *,\n.pdfPresentationMode.pdfPresentationModeControls .textLayer > div {\n  cursor: default;\n}\n\n#outerContainer {\n  width: 100%;\n  height: 100%;\n  position: relative;\n}\n\n#sidebarContainer {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  width: 200px;\n  visibility: hidden;\n  -webkit-transition-duration: 200ms;\n  -webkit-transition-timing-function: ease;\n  transition-duration: 200ms;\n  transition-timing-function: ease;\n}\n#mainPdfWarrper[dir=\"ltr\"] #sidebarContainer {\n  -webkit-transition-property: left;\n  transition-property: left;\n  left: -200px;\n}\n#mainPdfWarrper[dir=\"rtl\"] #sidebarContainer {\n  -webkit-transition-property: right;\n  transition-property: right;\n  right: -200px;\n}\n\n#outerContainer.sidebarMoving > #sidebarContainer,\n#outerContainer.sidebarOpen > #sidebarContainer {\n  visibility: visible;\n}\n#mainPdfWarrper[dir=\"ltr\"] #outerContainer.sidebarOpen > #sidebarContainer {\n  left: 0px;\n}\n#mainPdfWarrper[dir=\"rtl\"] #outerContainer.sidebarOpen > #sidebarContainer {\n  right: 0px;\n}\n\n#mainContainer {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  min-width: 320px;\n  -webkit-transition-duration: 200ms;\n  -webkit-transition-timing-function: ease;\n  transition-duration: 200ms;\n  transition-timing-function: ease;\n}\n#mainPdfWarrper[dir=\"ltr\"] #outerContainer.sidebarOpen > #mainContainer {\n  -webkit-transition-property: left;\n  transition-property: left;\n  left: 200px;\n}\n#mainPdfWarrper[dir=\"rtl\"] #outerContainer.sidebarOpen > #mainContainer {\n  -webkit-transition-property: right;\n  transition-property: right;\n  right: 200px;\n}\n\n#sidebarContent {\n  top: 32px;\n  bottom: 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  position: absolute;\n  width: 200px;\n  background-color: hsla(0, 0%, 0%, 0.1);\n}\n#mainPdfWarrper[dir=\"ltr\"] #sidebarContent {\n  left: 0;\n  box-shadow: inset -1px 0 0 hsla(0, 0%, 0%, 0.25);\n}\n#mainPdfWarrper[dir=\"rtl\"] #sidebarContent {\n  right: 0;\n  box-shadow: inset 1px 0 0 hsla(0, 0%, 0%, 0.25);\n}\n\n#viewerContainer {\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  position: absolute;\n  top: 32px;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  outline: none;\n}\n#mainPdfWarrper[dir=\"ltr\"] #viewerContainer {\n  box-shadow: inset 1px 0 0 hsla(0, 0%, 100%, 0.05);\n}\n#mainPdfWarrper[dir=\"rtl\"] #viewerContainer {\n  box-shadow: inset -1px 0 0 hsla(0, 0%, 100%, 0.05);\n}\n\n.toolbar {\n  position: relative;\n  left: 0;\n  right: 0;\n  z-index: 9999;\n  cursor: default;\n}\n\n#toolbarContainer {\n  width: 100%;\n}\n\n#toolbarSidebar {\n  width: 200px;\n  height: 32px;\n  background-color: #424242; /* fallback */\n  background-image: url(images/texture.png),\n    linear-gradient(hsla(0, 0%, 30%, 0.99), hsla(0, 0%, 25%, 0.95));\n}\n#mainPdfWarrper[dir=\"ltr\"] #toolbarSidebar {\n  box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25),\n    inset 0 -1px 0 hsla(0, 0%, 100%, 0.05), 0 1px 0 hsla(0, 0%, 0%, 0.15),\n    0 0 1px hsla(0, 0%, 0%, 0.1);\n}\n#mainPdfWarrper[dir=\"rtl\"] #toolbarSidebar {\n  box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25),\n    inset 0 1px 0 hsla(0, 0%, 100%, 0.05), 0 1px 0 hsla(0, 0%, 0%, 0.15),\n    0 0 1px hsla(0, 0%, 0%, 0.1);\n}\n\n#toolbarContainer,\n.findbar,\n.secondaryToolbar {\n  position: relative;\n  height: 32px;\n  background-color: #474747; /* fallback */\n  background-image: url(images/texture.png),\n    linear-gradient(hsla(0, 0%, 32%, 0.99), hsla(0, 0%, 27%, 0.95));\n}\n#mainPdfWarrper[dir=\"ltr\"] #toolbarContainer,\n.findbar,\n.secondaryToolbar {\n  box-shadow: inset 1px 0 0 hsla(0, 0%, 100%, 0.08),\n    inset 0 1px 1px hsla(0, 0%, 0%, 0.15),\n    inset 0 -1px 0 hsla(0, 0%, 100%, 0.05), 0 1px 0 hsla(0, 0%, 0%, 0.15),\n    0 1px 1px hsla(0, 0%, 0%, 0.1);\n}\n#mainPdfWarrper[dir=\"rtl\"] #toolbarContainer,\n.findbar,\n.secondaryToolbar {\n  box-shadow: inset -1px 0 0 hsla(0, 0%, 100%, 0.08),\n    inset 0 1px 1px hsla(0, 0%, 0%, 0.15),\n    inset 0 -1px 0 hsla(0, 0%, 100%, 0.05), 0 1px 0 hsla(0, 0%, 0%, 0.15),\n    0 1px 1px hsla(0, 0%, 0%, 0.1);\n}\n\n#toolbarViewer {\n  height: 32px;\n}\n\n#loadingBar {\n  position: relative;\n  width: 100%;\n  height: 4px;\n  background-color: #333;\n  border-bottom: 1px solid #333;\n}\n\n#loadingBar .progress {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 0%;\n  height: 100%;\n  background-color: #ddd;\n  overflow: hidden;\n  -webkit-transition: width 200ms;\n  transition: width 200ms;\n}\n\n@-webkit-keyframes progressIndeterminate {\n  0% {\n    left: -142px;\n  }\n  100% {\n    left: 0;\n  }\n}\n\n@keyframes progressIndeterminate {\n  0% {\n    left: -142px;\n  }\n  100% {\n    left: 0;\n  }\n}\n\n#loadingBar .progress.indeterminate {\n  background-color: #999;\n  -webkit-transition: none;\n  transition: none;\n}\n\n#loadingBar .progress.indeterminate .glimmer {\n  position: absolute;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: calc(100% + 150px);\n\n  background: repeating-linear-gradient(\n    135deg,\n    #bbb 0,\n    #999 5px,\n    #999 45px,\n    #ddd 55px,\n    #ddd 95px,\n    #bbb 100px\n  );\n\n  -webkit-animation: progressIndeterminate 950ms linear infinite;\n  animation: progressIndeterminate 950ms linear infinite;\n}\n\n.findbar,\n.secondaryToolbar {\n  top: 32px;\n  position: absolute;\n  z-index: 10000;\n  height: auto;\n  min-width: 16px;\n  padding: 0px 6px 0px 6px;\n  margin: 4px 2px 4px 2px;\n  color: hsl(0, 0%, 85%);\n  font-size: 12px;\n  line-height: 14px;\n  text-align: left;\n  cursor: default;\n}\n\n.findbar {\n  min-width: 300px;\n}\n.findbar > div {\n  height: 32px;\n}\n.findbar.wrapContainers > div {\n  clear: both;\n}\n.findbar.wrapContainers > div#findbarMessageContainer {\n  height: auto;\n}\n#mainPdfWarrper[dir=\"ltr\"] .findbar {\n  left: 68px;\n}\n#mainPdfWarrper[dir=\"rtl\"] .findbar {\n  right: 68px;\n}\n\n.findbar label {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n}\n\n#findInput {\n  width: 200px;\n}\n#findInput::-webkit-input-placeholder {\n  font-style: italic;\n}\n#findInput::-moz-placeholder {\n  font-style: italic;\n}\n#findInput:-ms-input-placeholder {\n  font-style: italic;\n}\n#findInput::placeholder {\n  font-style: italic;\n}\n#findInput[data-status=\"pending\"] {\n  background-image: url(images/loading-small.png);\n  background-repeat: no-repeat;\n  background-position: right;\n}\n#mainPdfWarrper[dir=\"rtl\"] #findInput[data-status=\"pending\"] {\n  background-position: left;\n}\n\n.secondaryToolbar {\n  padding: 6px;\n  height: auto;\n  z-index: 30000;\n}\n#mainPdfWarrper[dir=\"ltr\"] .secondaryToolbar {\n  right: 4px;\n}\n#mainPdfWarrper[dir=\"rtl\"] .secondaryToolbar {\n  left: 4px;\n}\n\n#secondaryToolbarButtonContainer {\n  max-width: 200px;\n  max-height: 400px;\n  overflow-y: auto;\n  -webkit-overflow-scrolling: touch;\n  margin-bottom: -4px;\n}\n\n.doorHanger,\n.doorHangerRight {\n  border: 1px solid hsla(0, 0%, 0%, 0.5);\n  border-radius: 2px;\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n.doorHanger:after,\n.doorHanger:before,\n.doorHangerRight:after,\n.doorHangerRight:before {\n  bottom: 100%;\n  border: solid transparent;\n  content: \" \";\n  height: 0;\n  width: 0;\n  position: absolute;\n  pointer-events: none;\n}\n.doorHanger:after,\n.doorHangerRight:after {\n  border-bottom-color: hsla(0, 0%, 32%, 0.99);\n  border-width: 8px;\n}\n.doorHanger:before,\n.doorHangerRight:before {\n  border-bottom-color: hsla(0, 0%, 0%, 0.5);\n  border-width: 9px;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .doorHanger:after,\n#mainPdfWarrper[dir=\"rtl\"] .doorHangerRight:after {\n  left: 13px;\n  margin-left: -8px;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .doorHanger:before,\n#mainPdfWarrper[dir=\"rtl\"] .doorHangerRight:before {\n  left: 13px;\n  margin-left: -9px;\n}\n\n#mainPdfWarrper[dir=\"rtl\"] .doorHanger:after,\n#mainPdfWarrper[dir=\"ltr\"] .doorHangerRight:after {\n  right: 13px;\n  margin-right: -8px;\n}\n\n#mainPdfWarrper[dir=\"rtl\"] .doorHanger:before,\n#mainPdfWarrper[dir=\"ltr\"] .doorHangerRight:before {\n  right: 13px;\n  margin-right: -9px;\n}\n\n#findResultsCount {\n  background-color: hsl(0, 0%, 85%);\n  color: hsl(0, 0%, 32%);\n  text-align: center;\n  padding: 3px 4px;\n}\n\n#findMsg {\n  font-style: italic;\n  color: #a6b7d0;\n}\n#findMsg:empty {\n  display: none;\n}\n\n#findInput.notFound {\n  background-color: rgb(255, 102, 102);\n}\n\n#toolbarViewerMiddle {\n  position: absolute;\n  left: 50%;\n  transform: translateX(-50%);\n}\n\n#mainPdfWarrper[dir=\"ltr\"] #toolbarViewerLeft,\n#mainPdfWarrper[dir=\"rtl\"] #toolbarViewerRight {\n  float: left;\n}\n#mainPdfWarrper[dir=\"ltr\"] #toolbarViewerRight,\n#mainPdfWarrper[dir=\"rtl\"] #toolbarViewerLeft {\n  float: right;\n}\n#mainPdfWarrper[dir=\"ltr\"] #toolbarViewerLeft > *,\n#mainPdfWarrper[dir=\"ltr\"] #toolbarViewerMiddle > *,\n#mainPdfWarrper[dir=\"ltr\"] #toolbarViewerRight > *,\n#mainPdfWarrper[dir=\"ltr\"] .findbar * {\n  position: relative;\n  float: left;\n}\n#mainPdfWarrper[dir=\"rtl\"] #toolbarViewerLeft > *,\n#mainPdfWarrper[dir=\"rtl\"] #toolbarViewerMiddle > *,\n#mainPdfWarrper[dir=\"rtl\"] #toolbarViewerRight > *,\n#mainPdfWarrper[dir=\"rtl\"] .findbar * {\n  position: relative;\n  float: right;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .splitToolbarButton {\n  margin: 3px 2px 4px 0;\n  display: inline-block;\n}\n#mainPdfWarrper[dir=\"rtl\"] .splitToolbarButton {\n  margin: 3px 0 4px 2px;\n  display: inline-block;\n}\n#mainPdfWarrper[dir=\"ltr\"] .splitToolbarButton > .toolbarButton {\n  border-radius: 0;\n  float: left;\n}\n#mainPdfWarrper[dir=\"rtl\"] .splitToolbarButton > .toolbarButton {\n  border-radius: 0;\n  float: right;\n}\n\n.toolbarButton,\n.secondaryToolbarButton,\n.overlayButton {\n  border: 0 none;\n  background: none;\n  width: 32px;\n  height: 25px;\n}\n\n.toolbarButton > span {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  overflow: hidden;\n}\n\n.toolbarButton[disabled],\n.secondaryToolbarButton[disabled],\n.overlayButton[disabled] {\n  opacity: 0.5;\n}\n\n.splitToolbarButton.toggled .toolbarButton {\n  margin: 0;\n}\n\n.splitToolbarButton:hover > .toolbarButton,\n.splitToolbarButton:focus > .toolbarButton,\n.splitToolbarButton.toggled > .toolbarButton,\n.toolbarButton.textButton {\n  background-color: hsla(0, 0%, 0%, 0.12);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  background-clip: padding-box;\n  border: 1px solid hsla(0, 0%, 0%, 0.35);\n  border-color: hsla(0, 0%, 0%, 0.32) hsla(0, 0%, 0%, 0.38)\n    hsla(0, 0%, 0%, 0.42);\n  box-shadow: 0 1px 0 hsla(0, 0%, 100%, 0.05) inset,\n    0 0 1px hsla(0, 0%, 100%, 0.15) inset, 0 1px 0 hsla(0, 0%, 100%, 0.05);\n  -webkit-transition-property: background-color, border-color, box-shadow;\n  -webkit-transition-duration: 150ms;\n  -webkit-transition-timing-function: ease;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 150ms;\n  transition-timing-function: ease;\n}\n.splitToolbarButton > .toolbarButton:hover,\n.splitToolbarButton > .toolbarButton:focus,\n.dropdownToolbarButton:hover,\n.overlayButton:hover,\n.overlayButton:focus,\n.toolbarButton.textButton:hover,\n.toolbarButton.textButton:focus {\n  background-color: hsla(0, 0%, 0%, 0.2);\n  box-shadow: 0 1px 0 hsla(0, 0%, 100%, 0.05) inset,\n    0 0 1px hsla(0, 0%, 100%, 0.15) inset, 0 0 1px hsla(0, 0%, 0%, 0.05);\n  z-index: 199;\n}\n.splitToolbarButton > .toolbarButton {\n  position: relative;\n}\n#mainPdfWarrper[dir=\"ltr\"] .splitToolbarButton > .toolbarButton:first-child,\n#mainPdfWarrper[dir=\"rtl\"] .splitToolbarButton > .toolbarButton:last-child {\n  position: relative;\n  margin: 0;\n  margin-right: -1px;\n  border-top-left-radius: 2px;\n  border-bottom-left-radius: 2px;\n  border-right-color: transparent;\n}\n#mainPdfWarrper[dir=\"ltr\"] .splitToolbarButton > .toolbarButton:last-child,\n#mainPdfWarrper[dir=\"rtl\"] .splitToolbarButton > .toolbarButton:first-child {\n  position: relative;\n  margin: 0;\n  margin-left: -1px;\n  border-top-right-radius: 2px;\n  border-bottom-right-radius: 2px;\n  border-left-color: transparent;\n}\n.splitToolbarButtonSeparator {\n  padding: 8px 0;\n  width: 1px;\n  background-color: hsla(0, 0%, 0%, 0.5);\n  z-index: 99;\n  box-shadow: 0 0 0 1px hsla(0, 0%, 100%, 0.08);\n  display: inline-block;\n  margin: 5px 0;\n}\n#mainPdfWarrper[dir=\"ltr\"] .splitToolbarButtonSeparator {\n  float: left;\n}\n#mainPdfWarrper[dir=\"rtl\"] .splitToolbarButtonSeparator {\n  float: right;\n}\n.splitToolbarButton:hover > .splitToolbarButtonSeparator,\n.splitToolbarButton.toggled > .splitToolbarButtonSeparator {\n  padding: 12px 0;\n  margin: 1px 0;\n  box-shadow: 0 0 0 1px hsla(0, 0%, 100%, 0.03);\n  -webkit-transition-property: padding;\n  -webkit-transition-duration: 10ms;\n  -webkit-transition-timing-function: ease;\n  transition-property: padding;\n  transition-duration: 10ms;\n  transition-timing-function: ease;\n}\n\n.toolbarButton,\n.dropdownToolbarButton,\n.secondaryToolbarButton,\n.overlayButton {\n  min-width: 16px;\n  padding: 2px 6px 0;\n  border: 1px solid transparent;\n  border-radius: 2px;\n  color: hsla(0, 0%, 100%, 0.8);\n  font-size: 12px;\n  line-height: 14px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  /* Opera does not support user-select, use <... unselectable=\"on\"> instead */\n  cursor: default;\n  -webkit-transition-property: background-color, border-color, box-shadow;\n  -webkit-transition-duration: 150ms;\n  -webkit-transition-timing-function: ease;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 150ms;\n  transition-timing-function: ease;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton,\n#mainPdfWarrper[dir=\"ltr\"] .overlayButton,\n#mainPdfWarrper[dir=\"ltr\"] .dropdownToolbarButton {\n  margin: 3px 2px 4px 0;\n}\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton,\n#mainPdfWarrper[dir=\"rtl\"] .overlayButton,\n#mainPdfWarrper[dir=\"rtl\"] .dropdownToolbarButton {\n  margin: 3px 0 4px 2px;\n}\n\n.toolbarButton:hover,\n.toolbarButton:focus,\n.dropdownToolbarButton,\n.overlayButton,\n.secondaryToolbarButton:hover,\n.secondaryToolbarButton:focus {\n  background-color: hsla(0, 0%, 0%, 0.12);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  background-clip: padding-box;\n  border: 1px solid hsla(0, 0%, 0%, 0.35);\n  border-color: hsla(0, 0%, 0%, 0.32) hsla(0, 0%, 0%, 0.38)\n    hsla(0, 0%, 0%, 0.42);\n  box-shadow: 0 1px 0 hsla(0, 0%, 100%, 0.05) inset,\n    0 0 1px hsla(0, 0%, 100%, 0.15) inset, 0 1px 0 hsla(0, 0%, 100%, 0.05);\n}\n\n.toolbarButton:hover:active,\n.overlayButton:hover:active,\n.dropdownToolbarButton:hover:active,\n.secondaryToolbarButton:hover:active {\n  background-color: hsla(0, 0%, 0%, 0.2);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  border-color: hsla(0, 0%, 0%, 0.35) hsla(0, 0%, 0%, 0.4) hsla(0, 0%, 0%, 0.45);\n  box-shadow: 0 1px 1px hsla(0, 0%, 0%, 0.1) inset,\n    0 0 1px hsla(0, 0%, 0%, 0.2) inset, 0 1px 0 hsla(0, 0%, 100%, 0.05);\n  -webkit-transition-property: background-color, border-color, box-shadow;\n  -webkit-transition-duration: 10ms;\n  -webkit-transition-timing-function: linear;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 10ms;\n  transition-timing-function: linear;\n}\n\n.toolbarButton.toggled,\n.splitToolbarButton.toggled > .toolbarButton.toggled,\n.secondaryToolbarButton.toggled {\n  background-color: hsla(0, 0%, 0%, 0.3);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  border-color: hsla(0, 0%, 0%, 0.4) hsla(0, 0%, 0%, 0.45) hsla(0, 0%, 0%, 0.5);\n  box-shadow: 0 1px 1px hsla(0, 0%, 0%, 0.1) inset,\n    0 0 1px hsla(0, 0%, 0%, 0.2) inset, 0 1px 0 hsla(0, 0%, 100%, 0.05);\n  -webkit-transition-property: background-color, border-color, box-shadow;\n  -webkit-transition-duration: 10ms;\n  -webkit-transition-timing-function: linear;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 10ms;\n  transition-timing-function: linear;\n}\n\n.toolbarButton.toggled:hover:active,\n.splitToolbarButton.toggled > .toolbarButton.toggled:hover:active,\n.secondaryToolbarButton.toggled:hover:active {\n  background-color: hsla(0, 0%, 0%, 0.4);\n  border-color: hsla(0, 0%, 0%, 0.4) hsla(0, 0%, 0%, 0.5) hsla(0, 0%, 0%, 0.55);\n  box-shadow: 0 1px 1px hsla(0, 0%, 0%, 0.2) inset,\n    0 0 1px hsla(0, 0%, 0%, 0.3) inset, 0 1px 0 hsla(0, 0%, 100%, 0.05);\n}\n\n.dropdownToolbarButton {\n  width: 120px;\n  max-width: 120px;\n  padding: 0;\n  overflow: hidden;\n  background: url(images/toolbarButton-menuArrows.png) no-repeat;\n}\n#mainPdfWarrper[dir=\"ltr\"] .dropdownToolbarButton {\n  background-position: 95%;\n}\n#mainPdfWarrper[dir=\"rtl\"] .dropdownToolbarButton {\n  background-position: 5%;\n}\n\n.dropdownToolbarButton > select {\n  min-width: 140px;\n  font-size: 12px;\n  color: hsl(0, 0%, 95%);\n  margin: 0;\n  padding: 3px 2px 2px;\n  border: none;\n  background: rgba(\n    0,\n    0,\n    0,\n    0\n  ); /* Opera does not support 'transparent' <select> background */\n}\n\n.dropdownToolbarButton > select > option {\n  background: hsl(0, 0%, 24%);\n}\n\n#customScaleOption {\n  display: none;\n}\n\n#pageWidthOption {\n  border-bottom: 1px rgba(255, 255, 255, 0.5) solid;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .splitToolbarButton:first-child,\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton:first-child,\n#mainPdfWarrper[dir=\"rtl\"] .splitToolbarButton:last-child,\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton:last-child {\n  margin-left: 4px;\n}\n#mainPdfWarrper[dir=\"ltr\"] .splitToolbarButton:last-child,\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton:last-child,\n#mainPdfWarrper[dir=\"rtl\"] .splitToolbarButton:first-child,\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton:first-child {\n  margin-right: 4px;\n}\n\n.toolbarButtonSpacer {\n  width: 30px;\n  display: inline-block;\n  height: 1px;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] #findPrevious {\n  margin-left: 3px;\n}\n#mainPdfWarrper[dir=\"ltr\"] #findNext {\n  margin-right: 3px;\n}\n\n#mainPdfWarrper[dir=\"rtl\"] #findPrevious {\n  margin-right: 3px;\n}\n#mainPdfWarrper[dir=\"rtl\"] #findNext {\n  margin-left: 3px;\n}\n\n.toolbarButton::before,\n.secondaryToolbarButton::before {\n  /* All matching images have a size of 16x16\n   * All relevant containers have a size of 32x25 */\n  position: absolute;\n  display: inline-block;\n  top: 4px;\n  left: 7px;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .secondaryToolbarButton::before {\n  left: 4px;\n}\n#mainPdfWarrper[dir=\"rtl\"] .secondaryToolbarButton::before {\n  right: 4px;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton#sidebarToggle::before {\n  content: url(images/toolbarButton-sidebarToggle.png);\n}\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton#sidebarToggle::before {\n  content: url(images/toolbarButton-sidebarToggle-rtl.png);\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton#secondaryToolbarToggle::before {\n  content: url(images/toolbarButton-secondaryToolbarToggle.png);\n}\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton#secondaryToolbarToggle::before {\n  content: url(images/toolbarButton-secondaryToolbarToggle-rtl.png);\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton.findPrevious::before {\n  content: url(images/findbarButton-previous.png);\n}\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton.findPrevious::before {\n  content: url(images/findbarButton-previous-rtl.png);\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton.findNext::before {\n  content: url(images/findbarButton-next.png);\n}\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton.findNext::before {\n  content: url(images/findbarButton-next-rtl.png);\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton.pageUp::before {\n  content: url(images/toolbarButton-pageUp.png);\n}\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton.pageUp::before {\n  content: url(images/toolbarButton-pageUp-rtl.png);\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton.pageDown::before {\n  content: url(images/toolbarButton-pageDown.png);\n}\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton.pageDown::before {\n  content: url(images/toolbarButton-pageDown-rtl.png);\n}\n\n.toolbarButton.zoomOut::before {\n  content: url(images/toolbarButton-zoomOut.png);\n}\n\n.toolbarButton.zoomIn::before {\n  content: url(images/toolbarButton-zoomIn.png);\n}\n\n.toolbarButton.presentationMode::before,\n.secondaryToolbarButton.presentationMode::before {\n  content: url(images/toolbarButton-presentationMode.png);\n}\n\n.toolbarButton.print::before,\n.secondaryToolbarButton.print::before {\n  content: url(images/toolbarButton-print.png);\n}\n\n.toolbarButton.openFile::before,\n.secondaryToolbarButton.openFile::before {\n  content: url(images/toolbarButton-openFile.png);\n}\n\n.toolbarButton.download::before,\n.secondaryToolbarButton.download::before {\n  content: url(images/toolbarButton-download.png);\n}\n\n.toolbarButton.bookmark,\n.secondaryToolbarButton.bookmark {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  outline: none;\n  padding-top: 4px;\n  text-decoration: none;\n}\n.secondaryToolbarButton.bookmark {\n  padding-top: 5px;\n}\n\n.bookmark[href=\"#\"] {\n  opacity: 0.5;\n  pointer-events: none;\n}\n\n.toolbarButton.bookmark::before,\n.secondaryToolbarButton.bookmark::before {\n  content: url(images/toolbarButton-bookmark.png);\n}\n\n#viewThumbnail.toolbarButton::before {\n  content: url(images/toolbarButton-viewThumbnail.png);\n}\n\n#mainPdfWarrper[dir=\"ltr\"] #viewOutline.toolbarButton::before {\n  content: url(images/toolbarButton-viewOutline.png);\n}\n#mainPdfWarrper[dir=\"rtl\"] #viewOutline.toolbarButton::before {\n  content: url(images/toolbarButton-viewOutline-rtl.png);\n}\n\n#viewAttachments.toolbarButton::before {\n  content: url(images/toolbarButton-viewAttachments.png);\n}\n\n#viewFind.toolbarButton::before {\n  content: url(images/toolbarButton-search.png);\n}\n\n.toolbarButton.pdfSidebarNotification::after {\n  position: absolute;\n  display: inline-block;\n  top: 1px;\n  /* Create a filled circle, with a diameter of 9 pixels, using only CSS: */\n  content: \"\";\n  background-color: #70db55;\n  height: 9px;\n  width: 9px;\n  border-radius: 50%;\n}\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton.pdfSidebarNotification::after {\n  left: 17px;\n}\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton.pdfSidebarNotification::after {\n  right: 17px;\n}\n\n.secondaryToolbarButton {\n  position: relative;\n  margin: 0 0 4px 0;\n  padding: 3px 0 1px 0;\n  height: auto;\n  min-height: 25px;\n  width: auto;\n  min-width: 100%;\n  white-space: normal;\n}\n#mainPdfWarrper[dir=\"ltr\"] .secondaryToolbarButton {\n  padding-left: 24px;\n  text-align: left;\n}\n#mainPdfWarrper[dir=\"rtl\"] .secondaryToolbarButton {\n  padding-right: 24px;\n  text-align: right;\n}\n#mainPdfWarrper[dir=\"ltr\"] .secondaryToolbarButton.bookmark {\n  padding-left: 27px;\n}\n#mainPdfWarrper[dir=\"rtl\"] .secondaryToolbarButton.bookmark {\n  padding-right: 27px;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .secondaryToolbarButton > span {\n  padding-right: 4px;\n}\n#mainPdfWarrper[dir=\"rtl\"] .secondaryToolbarButton > span {\n  padding-left: 4px;\n}\n\n.secondaryToolbarButton.firstPage::before {\n  content: url(images/secondaryToolbarButton-firstPage.png);\n}\n\n.secondaryToolbarButton.lastPage::before {\n  content: url(images/secondaryToolbarButton-lastPage.png);\n}\n\n.secondaryToolbarButton.rotateCcw::before {\n  content: url(images/secondaryToolbarButton-rotateCcw.png);\n}\n\n.secondaryToolbarButton.rotateCw::before {\n  content: url(images/secondaryToolbarButton-rotateCw.png);\n}\n\n.secondaryToolbarButton.selectTool::before {\n  content: url(images/secondaryToolbarButton-selectTool.png);\n}\n\n.secondaryToolbarButton.handTool::before {\n  content: url(images/secondaryToolbarButton-handTool.png);\n}\n\n.secondaryToolbarButton.documentProperties::before {\n  content: url(images/secondaryToolbarButton-documentProperties.png);\n}\n\n.verticalToolbarSeparator {\n  display: block;\n  padding: 8px 0;\n  margin: 8px 4px;\n  width: 1px;\n  background-color: hsla(0, 0%, 0%, 0.5);\n  box-shadow: 0 0 0 1px hsla(0, 0%, 100%, 0.08);\n}\n#mainPdfWarrper[dir=\"ltr\"] .verticalToolbarSeparator {\n  margin-left: 2px;\n}\n#mainPdfWarrper[dir=\"rtl\"] .verticalToolbarSeparator {\n  margin-right: 2px;\n}\n\n.horizontalToolbarSeparator {\n  display: block;\n  margin: 0 0 4px 0;\n  height: 1px;\n  width: 100%;\n  background-color: hsla(0, 0%, 0%, 0.5);\n  box-shadow: 0 0 0 1px hsla(0, 0%, 100%, 0.08);\n}\n\n.toolbarField {\n  padding: 3px 6px;\n  margin: 4px 0 4px 0;\n  border: 1px solid transparent;\n  border-radius: 2px;\n  background-color: hsla(0, 0%, 100%, 0.09);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  background-clip: padding-box;\n  border: 1px solid hsla(0, 0%, 0%, 0.35);\n  border-color: hsla(0, 0%, 0%, 0.32) hsla(0, 0%, 0%, 0.38)\n    hsla(0, 0%, 0%, 0.42);\n  box-shadow: 0 1px 0 hsla(0, 0%, 0%, 0.05) inset,\n    0 1px 0 hsla(0, 0%, 100%, 0.05);\n  color: hsl(0, 0%, 95%);\n  font-size: 12px;\n  line-height: 14px;\n  outline-style: none;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 150ms;\n  transition-timing-function: ease;\n}\n\n.toolbarField[type=\"checkbox\"] {\n  display: inline-block;\n  margin: 8px 0px;\n}\n\n.toolbarField.pageNumber {\n  -moz-appearance: textfield; /* hides the spinner in moz */\n  min-width: 16px;\n  text-align: right;\n  width: 40px;\n}\n\n.toolbarField.pageNumber.visiblePageIsLoading {\n  background-image: url(images/loading-small.png);\n  background-repeat: no-repeat;\n  background-position: 1px;\n}\n\n.toolbarField.pageNumber::-webkit-inner-spin-button,\n.toolbarField.pageNumber::-webkit-outer-spin-button {\n  -webkit-appearance: none;\n  margin: 0;\n}\n\n.toolbarField:hover {\n  background-color: hsla(0, 0%, 100%, 0.11);\n  border-color: hsla(0, 0%, 0%, 0.4) hsla(0, 0%, 0%, 0.43) hsla(0, 0%, 0%, 0.45);\n}\n\n.toolbarField:focus {\n  background-color: hsla(0, 0%, 100%, 0.15);\n  border-color: hsla(204, 100%, 65%, 0.8) hsla(204, 100%, 65%, 0.85)\n    hsla(204, 100%, 65%, 0.9);\n}\n\n.toolbarLabel {\n  min-width: 16px;\n  padding: 3px 6px 3px 2px;\n  margin: 4px 2px 4px 0;\n  border: 1px solid transparent;\n  border-radius: 2px;\n  color: hsl(0, 0%, 85%);\n  font-size: 12px;\n  line-height: 14px;\n  text-align: left;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  cursor: default;\n}\n\n#thumbnailView {\n  position: absolute;\n  width: 120px;\n  top: 0;\n  bottom: 0;\n  padding: 10px 40px 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n.thumbnail {\n  float: left;\n  margin-bottom: 5px;\n}\n\n#thumbnailView > a:last-of-type > .thumbnail {\n  margin-bottom: 10px;\n}\n\n#thumbnailView > a:last-of-type > .thumbnail:not([data-loaded]) {\n  margin-bottom: 9px;\n}\n\n.thumbnail:not([data-loaded]) {\n  border: 1px dashed rgba(255, 255, 255, 0.5);\n  margin: -1px -1px 4px -1px;\n}\n\n.thumbnailImage {\n  border: 1px solid transparent;\n  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);\n  opacity: 0.8;\n  z-index: 99;\n  background-color: white;\n  background-clip: content-box;\n}\n\n.thumbnailSelectionRing {\n  border-radius: 2px;\n  padding: 7px;\n}\n\na:focus > .thumbnail > .thumbnailSelectionRing > .thumbnailImage,\n.thumbnail:hover > .thumbnailSelectionRing > .thumbnailImage {\n  opacity: 0.9;\n}\n\na:focus > .thumbnail > .thumbnailSelectionRing,\n.thumbnail:hover > .thumbnailSelectionRing {\n  background-color: hsla(0, 0%, 100%, 0.15);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  background-clip: padding-box;\n  box-shadow: 0 1px 0 hsla(0, 0%, 100%, 0.05) inset,\n    0 0 1px hsla(0, 0%, 100%, 0.2) inset, 0 0 1px hsla(0, 0%, 0%, 0.2);\n  color: hsla(0, 0%, 100%, 0.9);\n}\n\n.thumbnail.selected > .thumbnailSelectionRing > .thumbnailImage {\n  box-shadow: 0 0 0 1px hsla(0, 0%, 0%, 0.5);\n  opacity: 1;\n}\n\n.thumbnail.selected > .thumbnailSelectionRing {\n  background-color: hsla(0, 0%, 100%, 0.3);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  background-clip: padding-box;\n  box-shadow: 0 1px 0 hsla(0, 0%, 100%, 0.05) inset,\n    0 0 1px hsla(0, 0%, 100%, 0.1) inset, 0 0 1px hsla(0, 0%, 0%, 0.2);\n  color: hsla(0, 0%, 100%, 1);\n}\n\n#outlineView,\n#attachmentsView {\n  position: absolute;\n  width: 192px;\n  top: 0;\n  bottom: 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n}\n\n#outlineView {\n  padding: 4px 4px 0;\n}\n#attachmentsView {\n  padding: 3px 4px 0;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .outlineWithDeepNesting > .outlineItem,\n#mainPdfWarrper[dir=\"ltr\"] .outlineItem > .outlineItems {\n  margin-left: 20px;\n}\n\n#mainPdfWarrper[dir=\"rtl\"] .outlineWithDeepNesting > .outlineItem,\n#mainPdfWarrper[dir=\"rtl\"] .outlineItem > .outlineItems {\n  margin-right: 20px;\n}\n\n.outlineItem > a,\n.attachmentsItem > button {\n  text-decoration: none;\n  display: inline-block;\n  min-width: 95%;\n  min-width: calc(\n    100% - 4px\n  ); /* Subtract the right padding (left, in RTL mode)\n                                  of the container. */\n  height: auto;\n  margin-bottom: 1px;\n  border-radius: 2px;\n  color: hsla(0, 0%, 100%, 0.8);\n  font-size: 13px;\n  line-height: 15px;\n  -moz-user-select: none;\n  white-space: normal;\n}\n\n.attachmentsItem > button {\n  border: 0 none;\n  background: none;\n  cursor: pointer;\n  width: 100%;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .outlineItem > a {\n  padding: 2px 0 5px 4px;\n}\n#mainPdfWarrper[dir=\"ltr\"] .attachmentsItem > button {\n  padding: 2px 0 3px 7px;\n  text-align: left;\n}\n\n#mainPdfWarrper[dir=\"rtl\"] .outlineItem > a {\n  padding: 2px 4px 5px 0;\n}\n#mainPdfWarrper[dir=\"rtl\"] .attachmentsItem > button {\n  padding: 2px 7px 3px 0;\n  text-align: right;\n}\n\n.outlineItemToggler {\n  position: relative;\n  height: 0;\n  width: 0;\n  color: hsla(0, 0%, 100%, 0.5);\n}\n.outlineItemToggler::before {\n  content: url(images/treeitem-expanded.png);\n  display: inline-block;\n  position: absolute;\n}\n#mainPdfWarrper[dir=\"ltr\"] .outlineItemToggler.outlineItemsHidden::before {\n  content: url(images/treeitem-collapsed.png);\n}\n#mainPdfWarrper[dir=\"rtl\"] .outlineItemToggler.outlineItemsHidden::before {\n  content: url(images/treeitem-collapsed-rtl.png);\n}\n.outlineItemToggler.outlineItemsHidden ~ .outlineItems {\n  display: none;\n}\n#mainPdfWarrper[dir=\"ltr\"] .outlineItemToggler {\n  float: left;\n}\n#mainPdfWarrper[dir=\"rtl\"] .outlineItemToggler {\n  float: right;\n}\n#mainPdfWarrper[dir=\"ltr\"] .outlineItemToggler::before {\n  right: 4px;\n}\n#mainPdfWarrper[dir=\"rtl\"] .outlineItemToggler::before {\n  left: 4px;\n}\n\n.outlineItemToggler:hover,\n.outlineItemToggler:hover + a,\n.outlineItemToggler:hover ~ .outlineItems,\n.outlineItem > a:hover,\n.attachmentsItem > button:hover {\n  background-color: hsla(0, 0%, 100%, 0.02);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  background-clip: padding-box;\n  box-shadow: 0 1px 0 hsla(0, 0%, 100%, 0.05) inset,\n    0 0 1px hsla(0, 0%, 100%, 0.2) inset, 0 0 1px hsla(0, 0%, 0%, 0.2);\n  border-radius: 2px;\n  color: hsla(0, 0%, 100%, 0.9);\n}\n\n.outlineItem.selected {\n  background-color: hsla(0, 0%, 100%, 0.08);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  background-clip: padding-box;\n  box-shadow: 0 1px 0 hsla(0, 0%, 100%, 0.05) inset,\n    0 0 1px hsla(0, 0%, 100%, 0.1) inset, 0 0 1px hsla(0, 0%, 0%, 0.2);\n  color: hsla(0, 0%, 100%, 1);\n}\n\n.noResults {\n  font-size: 12px;\n  color: hsla(0, 0%, 100%, 0.8);\n  font-style: italic;\n  cursor: default;\n}\n\n/* TODO: file FF bug to support ::-moz-selection:window-inactive\n   so we can override the opaque grey background when the window is inactive;\n   see https://bugzilla.mozilla.org/show_bug.cgi?id=706209 */\n::selection {\n  background: rgba(0, 0, 255, 0.3);\n}\n::-moz-selection {\n  background: rgba(0, 0, 255, 0.3);\n}\n\n#errorWrapper {\n  background: none repeat scroll 0 0 #ff5555;\n  color: white;\n  left: 0;\n  position: absolute;\n  right: 0;\n  z-index: 1000;\n  padding: 3px;\n  font-size: 0.8em;\n}\n.loadingInProgress #errorWrapper {\n  top: 37px;\n}\n\n#errorMessageLeft {\n  float: left;\n}\n\n#errorMessageRight {\n  float: right;\n}\n\n#errorMoreInfo {\n  background-color: #ffffff;\n  color: black;\n  padding: 3px;\n  margin: 3px;\n  width: 98%;\n}\n\n.overlayButton {\n  width: auto;\n  margin: 3px 4px 2px 4px !important;\n  padding: 2px 6px 3px 6px;\n}\n\n#overlayContainer {\n  display: table;\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  background-color: hsla(0, 0%, 0%, 0.2);\n  z-index: 40000;\n}\n#overlayContainer > * {\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n#overlayContainer > .container {\n  display: table-cell;\n  vertical-align: middle;\n  text-align: center;\n}\n\n#overlayContainer > .container > .dialog {\n  display: inline-block;\n  padding: 15px;\n  border-spacing: 4px;\n  color: hsl(0, 0%, 85%);\n  font-size: 12px;\n  line-height: 14px;\n  background-color: #474747; /* fallback */\n  background-image: url(images/texture.png),\n    linear-gradient(hsla(0, 0%, 32%, 0.99), hsla(0, 0%, 27%, 0.95));\n  box-shadow: inset 1px 0 0 hsla(0, 0%, 100%, 0.08),\n    inset 0 1px 1px hsla(0, 0%, 0%, 0.15),\n    inset 0 -1px 0 hsla(0, 0%, 100%, 0.05), 0 1px 0 hsla(0, 0%, 0%, 0.15),\n    0 1px 1px hsla(0, 0%, 0%, 0.1);\n  border: 1px solid hsla(0, 0%, 0%, 0.5);\n  border-radius: 4px;\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n\n.dialog > .row {\n  display: table-row;\n}\n\n.dialog > .row > * {\n  display: table-cell;\n}\n\n.dialog .toolbarField {\n  margin: 5px 0;\n}\n\n.dialog .separator {\n  display: block;\n  margin: 4px 0 4px 0;\n  height: 1px;\n  width: 100%;\n  background-color: hsla(0, 0%, 0%, 0.5);\n  box-shadow: 0 0 0 1px hsla(0, 0%, 100%, 0.08);\n}\n\n.dialog .buttonRow {\n  text-align: center;\n  vertical-align: middle;\n}\n\n.dialog :link {\n  color: white;\n}\n\n#passwordOverlay > .dialog {\n  text-align: center;\n}\n#passwordOverlay .toolbarField {\n  width: 200px;\n}\n\n#documentPropertiesOverlay > .dialog {\n  text-align: left;\n}\n#documentPropertiesOverlay .row > * {\n  min-width: 100px;\n}\n#mainPdfWarrper[dir=\"ltr\"] #documentPropertiesOverlay .row > * {\n  text-align: left;\n}\n#mainPdfWarrper[dir=\"rtl\"] #documentPropertiesOverlay .row > * {\n  text-align: right;\n}\n#documentPropertiesOverlay .row > span {\n  width: 125px;\n  word-wrap: break-word;\n}\n#documentPropertiesOverlay .row > p {\n  max-width: 225px;\n  word-wrap: break-word;\n}\n#documentPropertiesOverlay .buttonRow {\n  margin-top: 10px;\n}\n\n.clearBoth {\n  clear: both;\n}\n\n.fileInput {\n  background: white;\n  color: black;\n  margin-top: 5px;\n  visibility: hidden;\n  position: fixed;\n  right: 0;\n  top: 0;\n}\n\n#PDFBug {\n  background: none repeat scroll 0 0 white;\n  border: 1px solid #666666;\n  position: fixed;\n  top: 32px;\n  right: 0;\n  bottom: 0;\n  font-size: 10px;\n  padding: 0;\n  width: 300px;\n}\n#PDFBug .controls {\n  background: #eeeeee;\n  border-bottom: 1px solid #666666;\n  padding: 3px;\n}\n#PDFBug .panels {\n  bottom: 0;\n  left: 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  position: absolute;\n  right: 0;\n  top: 27px;\n}\n#PDFBug button.active {\n  font-weight: bold;\n}\n.debuggerShowText {\n  background: none repeat scroll 0 0 yellow;\n  color: blue;\n}\n.debuggerHideText:hover {\n  background: none repeat scroll 0 0 yellow;\n}\n#PDFBug .stats {\n  font-family: courier;\n  font-size: 10px;\n  white-space: pre;\n}\n#PDFBug .stats .title {\n  font-weight: bold;\n}\n#PDFBug table {\n  font-size: 10px;\n}\n\n#viewer.textLayer-visible .textLayer {\n  opacity: 1;\n}\n\n#viewer.textLayer-visible .canvasWrapper {\n  background-color: rgb(128, 255, 128);\n}\n\n#viewer.textLayer-visible .canvasWrapper canvas {\n  mix-blend-mode: screen;\n}\n\n#viewer.textLayer-visible .textLayer > div {\n  background-color: rgba(255, 255, 0, 0.1);\n  color: black;\n  border: solid 1px rgba(255, 0, 0, 0.5);\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n\n#viewer.textLayer-hover .textLayer > div:hover {\n  background-color: white;\n  color: black;\n}\n\n#viewer.textLayer-shadow .textLayer > div {\n  background-color: rgba(255, 255, 255, 0.6);\n  color: black;\n}\n\n.grab-to-pan-grab {\n  cursor: url(\"images/grab.cur\"), move !important;\n  cursor: -webkit-grab !important;\n  cursor: -moz-grab !important;\n  cursor: grab !important;\n}\n.grab-to-pan-grab\n  *:not(input):not(textarea):not(button):not(select):not(:link) {\n  cursor: inherit !important;\n}\n.grab-to-pan-grab:active,\n.grab-to-pan-grabbing {\n  cursor: url(\"images/grabbing.cur\"), move !important;\n  cursor: -webkit-grabbing !important;\n  cursor: -moz-grabbing !important;\n  cursor: grabbing !important;\n\n  position: fixed;\n  background: transparent;\n  display: block;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  overflow: hidden;\n  z-index: 50000; /* should be higher than anything else in PDF.js! */\n}\n\n@page {\n  margin: 0;\n}\n\n#printContainer {\n  display: none;\n}\n\n@media screen and (min-resolution: 2dppx) {\n  /* Rules for Retina screens */\n  .toolbarButton::before {\n    -webkit-transform: scale(0.5);\n    transform: scale(0.5);\n    top: -5px;\n  }\n\n  .secondaryToolbarButton::before {\n    -webkit-transform: scale(0.5);\n    transform: scale(0.5);\n    top: -4px;\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] .toolbarButton::before,\n  #mainPdfWarrper[dir=\"rtl\"] .toolbarButton::before {\n    left: -1px;\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] .secondaryToolbarButton::before {\n    left: -2px;\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .secondaryToolbarButton::before {\n    left: 186px;\n  }\n\n  .toolbarField.pageNumber.visiblePageIsLoading,\n  #findInput[data-status=\"pending\"] {\n    background-image: url(images/loading-small@2x.png);\n    background-size: 16px 17px;\n  }\n\n  .dropdownToolbarButton {\n    background: url(images/toolbarButton-menuArrows@2x.png) no-repeat;\n    background-size: 7px 16px;\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] .toolbarButton#sidebarToggle::before {\n    content: url(images/toolbarButton-sidebarToggle@2x.png);\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .toolbarButton#sidebarToggle::before {\n    content: url(images/toolbarButton-sidebarToggle-rtl@2x.png);\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] .toolbarButton#secondaryToolbarToggle::before {\n    content: url(images/toolbarButton-secondaryToolbarToggle@2x.png);\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .toolbarButton#secondaryToolbarToggle::before {\n    content: url(images/toolbarButton-secondaryToolbarToggle-rtl@2x.png);\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] .toolbarButton.findPrevious::before {\n    content: url(images/findbarButton-previous@2x.png);\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .toolbarButton.findPrevious::before {\n    content: url(images/findbarButton-previous-rtl@2x.png);\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] .toolbarButton.findNext::before {\n    content: url(images/findbarButton-next@2x.png);\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .toolbarButton.findNext::before {\n    content: url(images/findbarButton-next-rtl@2x.png);\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] .toolbarButton.pageUp::before {\n    content: url(images/toolbarButton-pageUp@2x.png);\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .toolbarButton.pageUp::before {\n    content: url(images/toolbarButton-pageUp-rtl@2x.png);\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] .toolbarButton.pageDown::before {\n    content: url(images/toolbarButton-pageDown@2x.png);\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .toolbarButton.pageDown::before {\n    content: url(images/toolbarButton-pageDown-rtl@2x.png);\n  }\n\n  .toolbarButton.zoomIn::before {\n    content: url(images/toolbarButton-zoomIn@2x.png);\n  }\n\n  .toolbarButton.zoomOut::before {\n    content: url(images/toolbarButton-zoomOut@2x.png);\n  }\n\n  .toolbarButton.presentationMode::before,\n  .secondaryToolbarButton.presentationMode::before {\n    content: url(images/toolbarButton-presentationMode@2x.png);\n  }\n\n  .toolbarButton.print::before,\n  .secondaryToolbarButton.print::before {\n    content: url(images/toolbarButton-print@2x.png);\n  }\n\n  .toolbarButton.openFile::before,\n  .secondaryToolbarButton.openFile::before {\n    content: url(images/toolbarButton-openFile@2x.png);\n  }\n\n  .toolbarButton.download::before,\n  .secondaryToolbarButton.download::before {\n    content: url(images/toolbarButton-download@2x.png);\n  }\n\n  .toolbarButton.bookmark::before,\n  .secondaryToolbarButton.bookmark::before {\n    content: url(images/toolbarButton-bookmark@2x.png);\n  }\n\n  #viewThumbnail.toolbarButton::before {\n    content: url(images/toolbarButton-viewThumbnail@2x.png);\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] #viewOutline.toolbarButton::before {\n    content: url(images/toolbarButton-viewOutline@2x.png);\n  }\n  #mainPdfWarrper[dir=\"rtl\"] #viewOutline.toolbarButton::before {\n    content: url(images/toolbarButton-viewOutline-rtl@2x.png);\n  }\n\n  #viewAttachments.toolbarButton::before {\n    content: url(images/toolbarButton-viewAttachments@2x.png);\n  }\n\n  #viewFind.toolbarButton::before {\n    content: url(images/toolbarButton-search@2x.png);\n  }\n\n  .secondaryToolbarButton.firstPage::before {\n    content: url(images/secondaryToolbarButton-firstPage@2x.png);\n  }\n\n  .secondaryToolbarButton.lastPage::before {\n    content: url(images/secondaryToolbarButton-lastPage@2x.png);\n  }\n\n  .secondaryToolbarButton.rotateCcw::before {\n    content: url(images/secondaryToolbarButton-rotateCcw@2x.png);\n  }\n\n  .secondaryToolbarButton.rotateCw::before {\n    content: url(images/secondaryToolbarButton-rotateCw@2x.png);\n  }\n\n  .secondaryToolbarButton.selectTool::before {\n    content: url(images/secondaryToolbarButton-selectTool@2x.png);\n  }\n\n  .secondaryToolbarButton.handTool::before {\n    content: url(images/secondaryToolbarButton-handTool@2x.png);\n  }\n\n  .secondaryToolbarButton.documentProperties::before {\n    content: url(images/secondaryToolbarButton-documentProperties@2x.png);\n  }\n\n  .outlineItemToggler::before {\n    -webkit-transform: scale(0.5);\n    transform: scale(0.5);\n    top: -1px;\n    content: url(images/treeitem-expanded@2x.png);\n  }\n  #mainPdfWarrper[dir=\"ltr\"] .outlineItemToggler.outlineItemsHidden::before {\n    content: url(images/treeitem-collapsed@2x.png);\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .outlineItemToggler.outlineItemsHidden::before {\n    content: url(images/treeitem-collapsed-rtl@2x.png);\n  }\n  #mainPdfWarrper[dir=\"ltr\"] .outlineItemToggler::before {\n    right: 0;\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .outlineItemToggler::before {\n    left: 0;\n  }\n}\n\n@media print {\n  /* General rules for printing. */\n  #mainPdfWarrper {\n    background: transparent none;\n  }\n\n  /* Rules for browsers that don't support mozPrintCallback. */\n  #sidebarContainer,\n  #secondaryToolbar,\n  .toolbar,\n  #loadingBox,\n  #errorWrapper,\n  .textLayer {\n    display: none;\n  }\n  #viewerContainer {\n    overflow: visible;\n  }\n\n  #mainContainer,\n  #viewerContainer,\n  .page,\n  .page canvas {\n    position: static;\n    padding: 0;\n    margin: 0;\n  }\n\n  .page {\n    float: left;\n    display: none;\n    border: none;\n    box-shadow: none;\n    background-clip: content-box;\n    background-color: white;\n  }\n\n  .page[data-loaded] {\n    display: block;\n  }\n\n  .fileInput {\n    display: none;\n  }\n\n  /* Rules for browsers that support PDF.js printing */\n  #mainPdfWarrper[data-pdfjsprinting] #outerContainer {\n    display: none;\n  }\n  #mainPdfWarrper[data-pdfjsprinting] #printContainer {\n    display: block;\n  }\n  #printContainer {\n    height: 100%;\n  }\n  /* wrapper around (scaled) print canvas elements */\n  #printContainer > div {\n    position: relative;\n    top: 0;\n    left: 0;\n    width: 1px;\n    height: 1px;\n    overflow: visible;\n    page-break-after: always;\n    page-break-inside: avoid;\n  }\n  #printContainer canvas,\n  #printContainer img {\n    display: block;\n  }\n}\n\n.visibleLargeView,\n.visibleMediumView,\n.visibleSmallView {\n  display: none;\n}\n\n@media all and (max-width: 1040px) {\n  #outerContainer.sidebarMoving #toolbarViewerMiddle,\n  #outerContainer.sidebarOpen #toolbarViewerMiddle {\n    display: table;\n    margin: auto;\n    left: auto;\n    position: inherit;\n    transform: none;\n  }\n}\n\n@media all and (max-width: 980px) {\n  .sidebarMoving .hiddenLargeView,\n  .sidebarOpen .hiddenLargeView {\n    display: none;\n  }\n  .sidebarMoving .visibleLargeView,\n  .sidebarOpen .visibleLargeView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 900px) {\n  #toolbarViewerMiddle {\n    display: table;\n    margin: auto;\n    left: auto;\n    position: inherit;\n    transform: none;\n  }\n  .sidebarMoving .hiddenMediumView,\n  .sidebarOpen .hiddenMediumView {\n    display: none;\n  }\n  .sidebarMoving .visibleMediumView,\n  .sidebarOpen .visibleMediumView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 840px) {\n  #sidebarContainer {\n    top: 32px;\n    z-index: 100;\n  }\n  .loadingInProgress #sidebarContainer {\n    top: 37px;\n  }\n  #sidebarContent {\n    top: 32px;\n    background-color: hsla(0, 0%, 0%, 0.7);\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] #outerContainer.sidebarOpen > #mainContainer {\n    left: 0px;\n  }\n  #mainPdfWarrper[dir=\"rtl\"] #outerContainer.sidebarOpen > #mainContainer {\n    right: 0px;\n  }\n\n  #outerContainer .hiddenLargeView,\n  #outerContainer .hiddenMediumView {\n    display: inherit;\n  }\n  #outerContainer .visibleLargeView,\n  #outerContainer .visibleMediumView {\n    display: none;\n  }\n}\n\n@media all and (max-width: 770px) {\n  #outerContainer .hiddenLargeView {\n    display: none;\n  }\n  #outerContainer .visibleLargeView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 700px) {\n  #outerContainer .hiddenMediumView {\n    display: none;\n  }\n  #outerContainer .visibleMediumView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 640px) {\n  .hiddenSmallView,\n  .hiddenSmallView * {\n    display: none;\n  }\n  .visibleSmallView {\n    display: inherit;\n  }\n  .toolbarButtonSpacer {\n    width: 0;\n  }\n  #mainPdfWarrper[dir=\"ltr\"] .findbar {\n    left: 38px;\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .findbar {\n    right: 38px;\n  }\n}\n\n@media all and (max-width: 535px) {\n  #scaleSelectContainer {\n    display: none;\n  }\n}\n"
  },
  {
    "path": "example/pages/include/pdf/pdf.worker.js",
    "content": "/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"pdfjs-dist/build/pdf.worker\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"pdfjs-dist/build/pdf.worker\"] = factory();\n\telse\n\t\troot[\"pdfjs-dist/build/pdf.worker\"] = root.pdfjsDistBuildPdfWorker = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __w_pdfjs_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__w_pdfjs_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__w_pdfjs_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__w_pdfjs_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__w_pdfjs_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__w_pdfjs_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__w_pdfjs_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__w_pdfjs_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__w_pdfjs_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__w_pdfjs_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __w_pdfjs_require__(__w_pdfjs_require__.s = 35);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.unreachable = exports.warn = exports.utf8StringToString = exports.stringToUTF8String = exports.stringToPDFString = exports.stringToBytes = exports.string32 = exports.shadow = exports.setVerbosityLevel = exports.ReadableStream = exports.removeNullCharacters = exports.readUint32 = exports.readUint16 = exports.readInt8 = exports.log2 = exports.loadJpegStream = exports.isEvalSupported = exports.isLittleEndian = exports.createValidAbsoluteUrl = exports.isSameOrigin = exports.isNodeJS = exports.isSpace = exports.isString = exports.isNum = exports.isInt = exports.isEmptyObj = exports.isBool = exports.isArrayBuffer = exports.isArray = exports.info = exports.globalScope = exports.getVerbosityLevel = exports.getLookupTableFactory = exports.deprecated = exports.createObjectURL = exports.createPromiseCapability = exports.createBlob = exports.bytesToString = exports.assert = exports.arraysToBytes = exports.arrayByteLength = exports.FormatError = exports.XRefParseException = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.StatTimer = exports.PasswordResponses = exports.PasswordException = exports.PageViewport = exports.NotImplementedException = exports.NativeImageDecoding = exports.MissingPDFException = exports.MissingDataException = exports.MessageHandler = exports.InvalidPDFException = exports.AbortException = exports.CMapCompressionType = exports.ImageKind = exports.FontType = exports.AnnotationType = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.UNSUPPORTED_FEATURES = exports.VERBOSITY_LEVELS = exports.OPS = exports.IDENTITY_MATRIX = exports.FONT_IDENTITY_MATRIX = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n__w_pdfjs_require__(36);\n\nvar _streams_polyfill = __w_pdfjs_require__(37);\n\nvar globalScope = typeof window !== 'undefined' && window.Math === Math ? window : typeof global !== 'undefined' && global.Math === Math ? global : typeof self !== 'undefined' && self.Math === Math ? self : undefined;\nvar FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\nvar NativeImageDecoding = {\n  NONE: 'none',\n  DECODE: 'decode',\n  DISPLAY: 'display'\n};\nvar TextRenderingMode = {\n  FILL: 0,\n  STROKE: 1,\n  FILL_STROKE: 2,\n  INVISIBLE: 3,\n  FILL_ADD_TO_PATH: 4,\n  STROKE_ADD_TO_PATH: 5,\n  FILL_STROKE_ADD_TO_PATH: 6,\n  ADD_TO_PATH: 7,\n  FILL_STROKE_MASK: 3,\n  ADD_TO_PATH_FLAG: 4\n};\nvar ImageKind = {\n  GRAYSCALE_1BPP: 1,\n  RGB_24BPP: 2,\n  RGBA_32BPP: 3\n};\nvar AnnotationType = {\n  TEXT: 1,\n  LINK: 2,\n  FREETEXT: 3,\n  LINE: 4,\n  SQUARE: 5,\n  CIRCLE: 6,\n  POLYGON: 7,\n  POLYLINE: 8,\n  HIGHLIGHT: 9,\n  UNDERLINE: 10,\n  SQUIGGLY: 11,\n  STRIKEOUT: 12,\n  STAMP: 13,\n  CARET: 14,\n  INK: 15,\n  POPUP: 16,\n  FILEATTACHMENT: 17,\n  SOUND: 18,\n  MOVIE: 19,\n  WIDGET: 20,\n  SCREEN: 21,\n  PRINTERMARK: 22,\n  TRAPNET: 23,\n  WATERMARK: 24,\n  THREED: 25,\n  REDACT: 26\n};\nvar AnnotationFlag = {\n  INVISIBLE: 0x01,\n  HIDDEN: 0x02,\n  PRINT: 0x04,\n  NOZOOM: 0x08,\n  NOROTATE: 0x10,\n  NOVIEW: 0x20,\n  READONLY: 0x40,\n  LOCKED: 0x80,\n  TOGGLENOVIEW: 0x100,\n  LOCKEDCONTENTS: 0x200\n};\nvar AnnotationFieldFlag = {\n  READONLY: 0x0000001,\n  REQUIRED: 0x0000002,\n  NOEXPORT: 0x0000004,\n  MULTILINE: 0x0001000,\n  PASSWORD: 0x0002000,\n  NOTOGGLETOOFF: 0x0004000,\n  RADIO: 0x0008000,\n  PUSHBUTTON: 0x0010000,\n  COMBO: 0x0020000,\n  EDIT: 0x0040000,\n  SORT: 0x0080000,\n  FILESELECT: 0x0100000,\n  MULTISELECT: 0x0200000,\n  DONOTSPELLCHECK: 0x0400000,\n  DONOTSCROLL: 0x0800000,\n  COMB: 0x1000000,\n  RICHTEXT: 0x2000000,\n  RADIOSINUNISON: 0x2000000,\n  COMMITONSELCHANGE: 0x4000000\n};\nvar AnnotationBorderStyleType = {\n  SOLID: 1,\n  DASHED: 2,\n  BEVELED: 3,\n  INSET: 4,\n  UNDERLINE: 5\n};\nvar StreamType = {\n  UNKNOWN: 0,\n  FLATE: 1,\n  LZW: 2,\n  DCT: 3,\n  JPX: 4,\n  JBIG: 5,\n  A85: 6,\n  AHX: 7,\n  CCF: 8,\n  RL: 9\n};\nvar FontType = {\n  UNKNOWN: 0,\n  TYPE1: 1,\n  TYPE1C: 2,\n  CIDFONTTYPE0: 3,\n  CIDFONTTYPE0C: 4,\n  TRUETYPE: 5,\n  CIDFONTTYPE2: 6,\n  TYPE3: 7,\n  OPENTYPE: 8,\n  TYPE0: 9,\n  MMTYPE1: 10\n};\nvar VERBOSITY_LEVELS = {\n  errors: 0,\n  warnings: 1,\n  infos: 5\n};\nvar CMapCompressionType = {\n  NONE: 0,\n  BINARY: 1,\n  STREAM: 2\n};\nvar OPS = {\n  dependency: 1,\n  setLineWidth: 2,\n  setLineCap: 3,\n  setLineJoin: 4,\n  setMiterLimit: 5,\n  setDash: 6,\n  setRenderingIntent: 7,\n  setFlatness: 8,\n  setGState: 9,\n  save: 10,\n  restore: 11,\n  transform: 12,\n  moveTo: 13,\n  lineTo: 14,\n  curveTo: 15,\n  curveTo2: 16,\n  curveTo3: 17,\n  closePath: 18,\n  rectangle: 19,\n  stroke: 20,\n  closeStroke: 21,\n  fill: 22,\n  eoFill: 23,\n  fillStroke: 24,\n  eoFillStroke: 25,\n  closeFillStroke: 26,\n  closeEOFillStroke: 27,\n  endPath: 28,\n  clip: 29,\n  eoClip: 30,\n  beginText: 31,\n  endText: 32,\n  setCharSpacing: 33,\n  setWordSpacing: 34,\n  setHScale: 35,\n  setLeading: 36,\n  setFont: 37,\n  setTextRenderingMode: 38,\n  setTextRise: 39,\n  moveText: 40,\n  setLeadingMoveText: 41,\n  setTextMatrix: 42,\n  nextLine: 43,\n  showText: 44,\n  showSpacedText: 45,\n  nextLineShowText: 46,\n  nextLineSetSpacingShowText: 47,\n  setCharWidth: 48,\n  setCharWidthAndBounds: 49,\n  setStrokeColorSpace: 50,\n  setFillColorSpace: 51,\n  setStrokeColor: 52,\n  setStrokeColorN: 53,\n  setFillColor: 54,\n  setFillColorN: 55,\n  setStrokeGray: 56,\n  setFillGray: 57,\n  setStrokeRGBColor: 58,\n  setFillRGBColor: 59,\n  setStrokeCMYKColor: 60,\n  setFillCMYKColor: 61,\n  shadingFill: 62,\n  beginInlineImage: 63,\n  beginImageData: 64,\n  endInlineImage: 65,\n  paintXObject: 66,\n  markPoint: 67,\n  markPointProps: 68,\n  beginMarkedContent: 69,\n  beginMarkedContentProps: 70,\n  endMarkedContent: 71,\n  beginCompat: 72,\n  endCompat: 73,\n  paintFormXObjectBegin: 74,\n  paintFormXObjectEnd: 75,\n  beginGroup: 76,\n  endGroup: 77,\n  beginAnnotations: 78,\n  endAnnotations: 79,\n  beginAnnotation: 80,\n  endAnnotation: 81,\n  paintJpegXObject: 82,\n  paintImageMaskXObject: 83,\n  paintImageMaskXObjectGroup: 84,\n  paintImageXObject: 85,\n  paintInlineImageXObject: 86,\n  paintInlineImageXObjectGroup: 87,\n  paintImageXObjectRepeat: 88,\n  paintImageMaskXObjectRepeat: 89,\n  paintSolidColorImageMask: 90,\n  constructPath: 91\n};\nvar verbosity = VERBOSITY_LEVELS.warnings;\nfunction setVerbosityLevel(level) {\n  verbosity = level;\n}\nfunction getVerbosityLevel() {\n  return verbosity;\n}\nfunction info(msg) {\n  if (verbosity >= VERBOSITY_LEVELS.infos) {\n    console.log('Info: ' + msg);\n  }\n}\nfunction warn(msg) {\n  if (verbosity >= VERBOSITY_LEVELS.warnings) {\n    console.log('Warning: ' + msg);\n  }\n}\nfunction deprecated(details) {\n  console.log('Deprecated API usage: ' + details);\n}\nfunction unreachable(msg) {\n  throw new Error(msg);\n}\nfunction assert(cond, msg) {\n  if (!cond) {\n    unreachable(msg);\n  }\n}\nvar UNSUPPORTED_FEATURES = {\n  unknown: 'unknown',\n  forms: 'forms',\n  javaScript: 'javaScript',\n  smask: 'smask',\n  shadingPattern: 'shadingPattern',\n  font: 'font'\n};\nfunction isSameOrigin(baseUrl, otherUrl) {\n  try {\n    var base = new URL(baseUrl);\n    if (!base.origin || base.origin === 'null') {\n      return false;\n    }\n  } catch (e) {\n    return false;\n  }\n  var other = new URL(otherUrl, base);\n  return base.origin === other.origin;\n}\nfunction isValidProtocol(url) {\n  if (!url) {\n    return false;\n  }\n  switch (url.protocol) {\n    case 'http:':\n    case 'https:':\n    case 'ftp:':\n    case 'mailto:':\n    case 'tel:':\n      return true;\n    default:\n      return false;\n  }\n}\nfunction createValidAbsoluteUrl(url, baseUrl) {\n  if (!url) {\n    return null;\n  }\n  try {\n    var absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url);\n    if (isValidProtocol(absoluteUrl)) {\n      return absoluteUrl;\n    }\n  } catch (ex) {}\n  return null;\n}\nfunction shadow(obj, prop, value) {\n  Object.defineProperty(obj, prop, {\n    value: value,\n    enumerable: true,\n    configurable: true,\n    writable: false\n  });\n  return value;\n}\nfunction getLookupTableFactory(initializer) {\n  var lookup;\n  return function () {\n    if (initializer) {\n      lookup = Object.create(null);\n      initializer(lookup);\n      initializer = null;\n    }\n    return lookup;\n  };\n}\nvar PasswordResponses = {\n  NEED_PASSWORD: 1,\n  INCORRECT_PASSWORD: 2\n};\nvar PasswordException = function PasswordExceptionClosure() {\n  function PasswordException(msg, code) {\n    this.name = 'PasswordException';\n    this.message = msg;\n    this.code = code;\n  }\n  PasswordException.prototype = new Error();\n  PasswordException.constructor = PasswordException;\n  return PasswordException;\n}();\nvar UnknownErrorException = function UnknownErrorExceptionClosure() {\n  function UnknownErrorException(msg, details) {\n    this.name = 'UnknownErrorException';\n    this.message = msg;\n    this.details = details;\n  }\n  UnknownErrorException.prototype = new Error();\n  UnknownErrorException.constructor = UnknownErrorException;\n  return UnknownErrorException;\n}();\nvar InvalidPDFException = function InvalidPDFExceptionClosure() {\n  function InvalidPDFException(msg) {\n    this.name = 'InvalidPDFException';\n    this.message = msg;\n  }\n  InvalidPDFException.prototype = new Error();\n  InvalidPDFException.constructor = InvalidPDFException;\n  return InvalidPDFException;\n}();\nvar MissingPDFException = function MissingPDFExceptionClosure() {\n  function MissingPDFException(msg) {\n    this.name = 'MissingPDFException';\n    this.message = msg;\n  }\n  MissingPDFException.prototype = new Error();\n  MissingPDFException.constructor = MissingPDFException;\n  return MissingPDFException;\n}();\nvar UnexpectedResponseException = function UnexpectedResponseExceptionClosure() {\n  function UnexpectedResponseException(msg, status) {\n    this.name = 'UnexpectedResponseException';\n    this.message = msg;\n    this.status = status;\n  }\n  UnexpectedResponseException.prototype = new Error();\n  UnexpectedResponseException.constructor = UnexpectedResponseException;\n  return UnexpectedResponseException;\n}();\nvar NotImplementedException = function NotImplementedExceptionClosure() {\n  function NotImplementedException(msg) {\n    this.message = msg;\n  }\n  NotImplementedException.prototype = new Error();\n  NotImplementedException.prototype.name = 'NotImplementedException';\n  NotImplementedException.constructor = NotImplementedException;\n  return NotImplementedException;\n}();\nvar MissingDataException = function MissingDataExceptionClosure() {\n  function MissingDataException(begin, end) {\n    this.begin = begin;\n    this.end = end;\n    this.message = 'Missing data [' + begin + ', ' + end + ')';\n  }\n  MissingDataException.prototype = new Error();\n  MissingDataException.prototype.name = 'MissingDataException';\n  MissingDataException.constructor = MissingDataException;\n  return MissingDataException;\n}();\nvar XRefParseException = function XRefParseExceptionClosure() {\n  function XRefParseException(msg) {\n    this.message = msg;\n  }\n  XRefParseException.prototype = new Error();\n  XRefParseException.prototype.name = 'XRefParseException';\n  XRefParseException.constructor = XRefParseException;\n  return XRefParseException;\n}();\nvar FormatError = function FormatErrorClosure() {\n  function FormatError(msg) {\n    this.message = msg;\n  }\n  FormatError.prototype = new Error();\n  FormatError.prototype.name = 'FormatError';\n  FormatError.constructor = FormatError;\n  return FormatError;\n}();\nvar AbortException = function AbortExceptionClosure() {\n  function AbortException(msg) {\n    this.name = 'AbortException';\n    this.message = msg;\n  }\n  AbortException.prototype = new Error();\n  AbortException.constructor = AbortException;\n  return AbortException;\n}();\nvar NullCharactersRegExp = /\\x00/g;\nfunction removeNullCharacters(str) {\n  if (typeof str !== 'string') {\n    warn('The argument for removeNullCharacters must be a string.');\n    return str;\n  }\n  return str.replace(NullCharactersRegExp, '');\n}\nfunction bytesToString(bytes) {\n  assert(bytes !== null && (typeof bytes === 'undefined' ? 'undefined' : _typeof(bytes)) === 'object' && bytes.length !== undefined, 'Invalid argument for bytesToString');\n  var length = bytes.length;\n  var MAX_ARGUMENT_COUNT = 8192;\n  if (length < MAX_ARGUMENT_COUNT) {\n    return String.fromCharCode.apply(null, bytes);\n  }\n  var strBuf = [];\n  for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n    var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n    var chunk = bytes.subarray(i, chunkEnd);\n    strBuf.push(String.fromCharCode.apply(null, chunk));\n  }\n  return strBuf.join('');\n}\nfunction stringToBytes(str) {\n  assert(typeof str === 'string', 'Invalid argument for stringToBytes');\n  var length = str.length;\n  var bytes = new Uint8Array(length);\n  for (var i = 0; i < length; ++i) {\n    bytes[i] = str.charCodeAt(i) & 0xFF;\n  }\n  return bytes;\n}\nfunction arrayByteLength(arr) {\n  if (arr.length !== undefined) {\n    return arr.length;\n  }\n  assert(arr.byteLength !== undefined);\n  return arr.byteLength;\n}\nfunction arraysToBytes(arr) {\n  if (arr.length === 1 && arr[0] instanceof Uint8Array) {\n    return arr[0];\n  }\n  var resultLength = 0;\n  var i,\n      ii = arr.length;\n  var item, itemLength;\n  for (i = 0; i < ii; i++) {\n    item = arr[i];\n    itemLength = arrayByteLength(item);\n    resultLength += itemLength;\n  }\n  var pos = 0;\n  var data = new Uint8Array(resultLength);\n  for (i = 0; i < ii; i++) {\n    item = arr[i];\n    if (!(item instanceof Uint8Array)) {\n      if (typeof item === 'string') {\n        item = stringToBytes(item);\n      } else {\n        item = new Uint8Array(item);\n      }\n    }\n    itemLength = item.byteLength;\n    data.set(item, pos);\n    pos += itemLength;\n  }\n  return data;\n}\nfunction string32(value) {\n  return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);\n}\nfunction log2(x) {\n  var n = 1,\n      i = 0;\n  while (x > n) {\n    n <<= 1;\n    i++;\n  }\n  return i;\n}\nfunction readInt8(data, start) {\n  return data[start] << 24 >> 24;\n}\nfunction readUint16(data, offset) {\n  return data[offset] << 8 | data[offset + 1];\n}\nfunction readUint32(data, offset) {\n  return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0;\n}\nfunction isLittleEndian() {\n  var buffer8 = new Uint8Array(4);\n  buffer8[0] = 1;\n  var view32 = new Uint32Array(buffer8.buffer, 0, 1);\n  return view32[0] === 1;\n}\nfunction isEvalSupported() {\n  try {\n    new Function('');\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\nvar IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];\nvar Util = function UtilClosure() {\n  function Util() {}\n  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];\n  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {\n    rgbBuf[1] = r;\n    rgbBuf[3] = g;\n    rgbBuf[5] = b;\n    return rgbBuf.join('');\n  };\n  Util.transform = function Util_transform(m1, m2) {\n    return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]];\n  };\n  Util.applyTransform = function Util_applyTransform(p, m) {\n    var xt = p[0] * m[0] + p[1] * m[2] + m[4];\n    var yt = p[0] * m[1] + p[1] * m[3] + m[5];\n    return [xt, yt];\n  };\n  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n    return [xt, yt];\n  };\n  Util.getAxialAlignedBoundingBox = function Util_getAxialAlignedBoundingBox(r, m) {\n    var p1 = Util.applyTransform(r, m);\n    var p2 = Util.applyTransform(r.slice(2, 4), m);\n    var p3 = Util.applyTransform([r[0], r[3]], m);\n    var p4 = Util.applyTransform([r[2], r[1]], m);\n    return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])];\n  };\n  Util.inverseTransform = function Util_inverseTransform(m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];\n  };\n  Util.apply3dTransform = function Util_apply3dTransform(m, v) {\n    return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]];\n  };\n  Util.singularValueDecompose2dScale = function Util_singularValueDecompose2dScale(m) {\n    var transpose = [m[0], m[2], m[1], m[3]];\n    var a = m[0] * transpose[0] + m[1] * transpose[2];\n    var b = m[0] * transpose[1] + m[1] * transpose[3];\n    var c = m[2] * transpose[0] + m[3] * transpose[2];\n    var d = m[2] * transpose[1] + m[3] * transpose[3];\n    var first = (a + d) / 2;\n    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;\n    var sx = first + second || 1;\n    var sy = first - second || 1;\n    return [Math.sqrt(sx), Math.sqrt(sy)];\n  };\n  Util.normalizeRect = function Util_normalizeRect(rect) {\n    var r = rect.slice(0);\n    if (rect[0] > rect[2]) {\n      r[0] = rect[2];\n      r[2] = rect[0];\n    }\n    if (rect[1] > rect[3]) {\n      r[1] = rect[3];\n      r[3] = rect[1];\n    }\n    return r;\n  };\n  Util.intersect = function Util_intersect(rect1, rect2) {\n    function compare(a, b) {\n      return a - b;\n    }\n    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),\n        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),\n        result = [];\n    rect1 = Util.normalizeRect(rect1);\n    rect2 = Util.normalizeRect(rect2);\n    if (orderedX[0] === rect1[0] && orderedX[1] === rect2[0] || orderedX[0] === rect2[0] && orderedX[1] === rect1[0]) {\n      result[0] = orderedX[1];\n      result[2] = orderedX[2];\n    } else {\n      return false;\n    }\n    if (orderedY[0] === rect1[1] && orderedY[1] === rect2[1] || orderedY[0] === rect2[1] && orderedY[1] === rect1[1]) {\n      result[1] = orderedY[1];\n      result[3] = orderedY[2];\n    } else {\n      return false;\n    }\n    return result;\n  };\n  Util.sign = function Util_sign(num) {\n    return num < 0 ? -1 : 1;\n  };\n  var ROMAN_NUMBER_MAP = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'];\n  Util.toRoman = function Util_toRoman(number, lowerCase) {\n    assert(isInt(number) && number > 0, 'The number should be a positive integer.');\n    var pos,\n        romanBuf = [];\n    while (number >= 1000) {\n      number -= 1000;\n      romanBuf.push('M');\n    }\n    pos = number / 100 | 0;\n    number %= 100;\n    romanBuf.push(ROMAN_NUMBER_MAP[pos]);\n    pos = number / 10 | 0;\n    number %= 10;\n    romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]);\n    romanBuf.push(ROMAN_NUMBER_MAP[20 + number]);\n    var romanStr = romanBuf.join('');\n    return lowerCase ? romanStr.toLowerCase() : romanStr;\n  };\n  Util.appendToArray = function Util_appendToArray(arr1, arr2) {\n    Array.prototype.push.apply(arr1, arr2);\n  };\n  Util.prependToArray = function Util_prependToArray(arr1, arr2) {\n    Array.prototype.unshift.apply(arr1, arr2);\n  };\n  Util.extendObj = function extendObj(obj1, obj2) {\n    for (var key in obj2) {\n      obj1[key] = obj2[key];\n    }\n  };\n  Util.getInheritableProperty = function Util_getInheritableProperty(dict, name, getArray) {\n    while (dict && !dict.has(name)) {\n      dict = dict.get('Parent');\n    }\n    if (!dict) {\n      return null;\n    }\n    return getArray ? dict.getArray(name) : dict.get(name);\n  };\n  Util.inherit = function Util_inherit(sub, base, prototype) {\n    sub.prototype = Object.create(base.prototype);\n    sub.prototype.constructor = sub;\n    for (var prop in prototype) {\n      sub.prototype[prop] = prototype[prop];\n    }\n  };\n  Util.loadScript = function Util_loadScript(src, callback) {\n    var script = document.createElement('script');\n    var loaded = false;\n    script.setAttribute('src', src);\n    if (callback) {\n      script.onload = function () {\n        if (!loaded) {\n          callback();\n        }\n        loaded = true;\n      };\n    }\n    document.getElementsByTagName('head')[0].appendChild(script);\n  };\n  return Util;\n}();\nvar PageViewport = function PageViewportClosure() {\n  function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) {\n    this.viewBox = viewBox;\n    this.scale = scale;\n    this.rotation = rotation;\n    this.offsetX = offsetX;\n    this.offsetY = offsetY;\n    var centerX = (viewBox[2] + viewBox[0]) / 2;\n    var centerY = (viewBox[3] + viewBox[1]) / 2;\n    var rotateA, rotateB, rotateC, rotateD;\n    rotation = rotation % 360;\n    rotation = rotation < 0 ? rotation + 360 : rotation;\n    switch (rotation) {\n      case 180:\n        rotateA = -1;\n        rotateB = 0;\n        rotateC = 0;\n        rotateD = 1;\n        break;\n      case 90:\n        rotateA = 0;\n        rotateB = 1;\n        rotateC = 1;\n        rotateD = 0;\n        break;\n      case 270:\n        rotateA = 0;\n        rotateB = -1;\n        rotateC = -1;\n        rotateD = 0;\n        break;\n      default:\n        rotateA = 1;\n        rotateB = 0;\n        rotateC = 0;\n        rotateD = -1;\n        break;\n    }\n    if (dontFlip) {\n      rotateC = -rotateC;\n      rotateD = -rotateD;\n    }\n    var offsetCanvasX, offsetCanvasY;\n    var width, height;\n    if (rotateA === 0) {\n      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;\n      width = Math.abs(viewBox[3] - viewBox[1]) * scale;\n      height = Math.abs(viewBox[2] - viewBox[0]) * scale;\n    } else {\n      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;\n      width = Math.abs(viewBox[2] - viewBox[0]) * scale;\n      height = Math.abs(viewBox[3] - viewBox[1]) * scale;\n    }\n    this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY];\n    this.width = width;\n    this.height = height;\n    this.fontScale = scale;\n  }\n  PageViewport.prototype = {\n    clone: function PageViewPort_clone(args) {\n      args = args || {};\n      var scale = 'scale' in args ? args.scale : this.scale;\n      var rotation = 'rotation' in args ? args.rotation : this.rotation;\n      return new PageViewport(this.viewBox.slice(), scale, rotation, this.offsetX, this.offsetY, args.dontFlip);\n    },\n    convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {\n      return Util.applyTransform([x, y], this.transform);\n    },\n    convertToViewportRectangle: function PageViewport_convertToViewportRectangle(rect) {\n      var tl = Util.applyTransform([rect[0], rect[1]], this.transform);\n      var br = Util.applyTransform([rect[2], rect[3]], this.transform);\n      return [tl[0], tl[1], br[0], br[1]];\n    },\n    convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {\n      return Util.applyInverseTransform([x, y], this.transform);\n    }\n  };\n  return PageViewport;\n}();\nvar PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC];\nfunction stringToPDFString(str) {\n  var i,\n      n = str.length,\n      strBuf = [];\n  if (str[0] === '\\xFE' && str[1] === '\\xFF') {\n    for (i = 2; i < n; i += 2) {\n      strBuf.push(String.fromCharCode(str.charCodeAt(i) << 8 | str.charCodeAt(i + 1)));\n    }\n  } else {\n    for (i = 0; i < n; ++i) {\n      var code = PDFStringTranslateTable[str.charCodeAt(i)];\n      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));\n    }\n  }\n  return strBuf.join('');\n}\nfunction stringToUTF8String(str) {\n  return decodeURIComponent(escape(str));\n}\nfunction utf8StringToString(str) {\n  return unescape(encodeURIComponent(str));\n}\nfunction isEmptyObj(obj) {\n  for (var key in obj) {\n    return false;\n  }\n  return true;\n}\nfunction isBool(v) {\n  return typeof v === 'boolean';\n}\nfunction isInt(v) {\n  return typeof v === 'number' && (v | 0) === v;\n}\nfunction isNum(v) {\n  return typeof v === 'number';\n}\nfunction isString(v) {\n  return typeof v === 'string';\n}\nfunction isArray(v) {\n  return v instanceof Array;\n}\nfunction isArrayBuffer(v) {\n  return (typeof v === 'undefined' ? 'undefined' : _typeof(v)) === 'object' && v !== null && v.byteLength !== undefined;\n}\nfunction isSpace(ch) {\n  return ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A;\n}\nfunction isNodeJS() {\n  return (typeof process === 'undefined' ? 'undefined' : _typeof(process)) === 'object' && process + '' === '[object process]';\n}\nfunction createPromiseCapability() {\n  var capability = {};\n  capability.promise = new Promise(function (resolve, reject) {\n    capability.resolve = resolve;\n    capability.reject = reject;\n  });\n  return capability;\n}\nvar StatTimer = function StatTimerClosure() {\n  function rpad(str, pad, length) {\n    while (str.length < length) {\n      str += pad;\n    }\n    return str;\n  }\n  function StatTimer() {\n    this.started = Object.create(null);\n    this.times = [];\n    this.enabled = true;\n  }\n  StatTimer.prototype = {\n    time: function StatTimer_time(name) {\n      if (!this.enabled) {\n        return;\n      }\n      if (name in this.started) {\n        warn('Timer is already running for ' + name);\n      }\n      this.started[name] = Date.now();\n    },\n    timeEnd: function StatTimer_timeEnd(name) {\n      if (!this.enabled) {\n        return;\n      }\n      if (!(name in this.started)) {\n        warn('Timer has not been started for ' + name);\n      }\n      this.times.push({\n        'name': name,\n        'start': this.started[name],\n        'end': Date.now()\n      });\n      delete this.started[name];\n    },\n    toString: function StatTimer_toString() {\n      var i, ii;\n      var times = this.times;\n      var out = '';\n      var longest = 0;\n      for (i = 0, ii = times.length; i < ii; ++i) {\n        var name = times[i]['name'];\n        if (name.length > longest) {\n          longest = name.length;\n        }\n      }\n      for (i = 0, ii = times.length; i < ii; ++i) {\n        var span = times[i];\n        var duration = span.end - span.start;\n        out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\\n';\n      }\n      return out;\n    }\n  };\n  return StatTimer;\n}();\nvar createBlob = function createBlob(data, contentType) {\n  if (typeof Blob !== 'undefined') {\n    return new Blob([data], { type: contentType });\n  }\n  throw new Error('The \"Blob\" constructor is not supported.');\n};\nvar createObjectURL = function createObjectURLClosure() {\n  var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n  return function createObjectURL(data, contentType) {\n    var forceDataSchema = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    if (!forceDataSchema && URL.createObjectURL) {\n      var blob = createBlob(data, contentType);\n      return URL.createObjectURL(blob);\n    }\n    var buffer = 'data:' + contentType + ';base64,';\n    for (var i = 0, ii = data.length; i < ii; i += 3) {\n      var b1 = data[i] & 0xFF;\n      var b2 = data[i + 1] & 0xFF;\n      var b3 = data[i + 2] & 0xFF;\n      var d1 = b1 >> 2,\n          d2 = (b1 & 3) << 4 | b2 >> 4;\n      var d3 = i + 1 < ii ? (b2 & 0xF) << 2 | b3 >> 6 : 64;\n      var d4 = i + 2 < ii ? b3 & 0x3F : 64;\n      buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];\n    }\n    return buffer;\n  };\n}();\nfunction resolveCall(fn, args) {\n  var thisArg = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n  if (!fn) {\n    return Promise.resolve(undefined);\n  }\n  return new Promise(function (resolve, reject) {\n    resolve(fn.apply(thisArg, args));\n  });\n}\nfunction wrapReason(reason) {\n  if ((typeof reason === 'undefined' ? 'undefined' : _typeof(reason)) !== 'object') {\n    return reason;\n  }\n  switch (reason.name) {\n    case 'AbortException':\n      return new AbortException(reason.message);\n    case 'MissingPDFException':\n      return new MissingPDFException(reason.message);\n    case 'UnexpectedResponseException':\n      return new UnexpectedResponseException(reason.message, reason.status);\n    default:\n      return new UnknownErrorException(reason.message, reason.details);\n  }\n}\nfunction resolveOrReject(capability, success, reason) {\n  if (success) {\n    capability.resolve();\n  } else {\n    capability.reject(reason);\n  }\n}\nfunction finalize(promise) {\n  return Promise.resolve(promise).catch(function () {});\n}\nfunction MessageHandler(sourceName, targetName, comObj) {\n  var _this = this;\n\n  this.sourceName = sourceName;\n  this.targetName = targetName;\n  this.comObj = comObj;\n  this.callbackId = 1;\n  this.streamId = 1;\n  this.postMessageTransfers = true;\n  this.streamSinks = Object.create(null);\n  this.streamControllers = Object.create(null);\n  var callbacksCapabilities = this.callbacksCapabilities = Object.create(null);\n  var ah = this.actionHandler = Object.create(null);\n  this._onComObjOnMessage = function (event) {\n    var data = event.data;\n    if (data.targetName !== _this.sourceName) {\n      return;\n    }\n    if (data.stream) {\n      _this._processStreamMessage(data);\n    } else if (data.isReply) {\n      var callbackId = data.callbackId;\n      if (data.callbackId in callbacksCapabilities) {\n        var callback = callbacksCapabilities[callbackId];\n        delete callbacksCapabilities[callbackId];\n        if ('error' in data) {\n          callback.reject(wrapReason(data.error));\n        } else {\n          callback.resolve(data.data);\n        }\n      } else {\n        throw new Error('Cannot resolve callback ' + callbackId);\n      }\n    } else if (data.action in ah) {\n      var action = ah[data.action];\n      if (data.callbackId) {\n        var _sourceName = _this.sourceName;\n        var _targetName = data.sourceName;\n        Promise.resolve().then(function () {\n          return action[0].call(action[1], data.data);\n        }).then(function (result) {\n          comObj.postMessage({\n            sourceName: _sourceName,\n            targetName: _targetName,\n            isReply: true,\n            callbackId: data.callbackId,\n            data: result\n          });\n        }, function (reason) {\n          if (reason instanceof Error) {\n            reason = reason + '';\n          }\n          comObj.postMessage({\n            sourceName: _sourceName,\n            targetName: _targetName,\n            isReply: true,\n            callbackId: data.callbackId,\n            error: reason\n          });\n        });\n      } else if (data.streamId) {\n        _this._createStreamSink(data);\n      } else {\n        action[0].call(action[1], data.data);\n      }\n    } else {\n      throw new Error('Unknown action from worker: ' + data.action);\n    }\n  };\n  comObj.addEventListener('message', this._onComObjOnMessage);\n}\nMessageHandler.prototype = {\n  on: function on(actionName, handler, scope) {\n    var ah = this.actionHandler;\n    if (ah[actionName]) {\n      throw new Error('There is already an actionName called \"' + actionName + '\"');\n    }\n    ah[actionName] = [handler, scope];\n  },\n  send: function send(actionName, data, transfers) {\n    var message = {\n      sourceName: this.sourceName,\n      targetName: this.targetName,\n      action: actionName,\n      data: data\n    };\n    this.postMessage(message, transfers);\n  },\n  sendWithPromise: function sendWithPromise(actionName, data, transfers) {\n    var callbackId = this.callbackId++;\n    var message = {\n      sourceName: this.sourceName,\n      targetName: this.targetName,\n      action: actionName,\n      data: data,\n      callbackId: callbackId\n    };\n    var capability = createPromiseCapability();\n    this.callbacksCapabilities[callbackId] = capability;\n    try {\n      this.postMessage(message, transfers);\n    } catch (e) {\n      capability.reject(e);\n    }\n    return capability.promise;\n  },\n  sendWithStream: function sendWithStream(actionName, data, queueingStrategy, transfers) {\n    var _this2 = this;\n\n    var streamId = this.streamId++;\n    var sourceName = this.sourceName;\n    var targetName = this.targetName;\n    return new _streams_polyfill.ReadableStream({\n      start: function start(controller) {\n        var startCapability = createPromiseCapability();\n        _this2.streamControllers[streamId] = {\n          controller: controller,\n          startCall: startCapability,\n          isClosed: false\n        };\n        _this2.postMessage({\n          sourceName: sourceName,\n          targetName: targetName,\n          action: actionName,\n          streamId: streamId,\n          data: data,\n          desiredSize: controller.desiredSize\n        });\n        return startCapability.promise;\n      },\n      pull: function pull(controller) {\n        var pullCapability = createPromiseCapability();\n        _this2.streamControllers[streamId].pullCall = pullCapability;\n        _this2.postMessage({\n          sourceName: sourceName,\n          targetName: targetName,\n          stream: 'pull',\n          streamId: streamId,\n          desiredSize: controller.desiredSize\n        });\n        return pullCapability.promise;\n      },\n      cancel: function cancel(reason) {\n        var cancelCapability = createPromiseCapability();\n        _this2.streamControllers[streamId].cancelCall = cancelCapability;\n        _this2.streamControllers[streamId].isClosed = true;\n        _this2.postMessage({\n          sourceName: sourceName,\n          targetName: targetName,\n          stream: 'cancel',\n          reason: reason,\n          streamId: streamId\n        });\n        return cancelCapability.promise;\n      }\n    }, queueingStrategy);\n  },\n  _createStreamSink: function _createStreamSink(data) {\n    var _this3 = this;\n\n    var self = this;\n    var action = this.actionHandler[data.action];\n    var streamId = data.streamId;\n    var desiredSize = data.desiredSize;\n    var sourceName = this.sourceName;\n    var targetName = data.sourceName;\n    var capability = createPromiseCapability();\n    var sendStreamRequest = function sendStreamRequest(_ref) {\n      var stream = _ref.stream,\n          chunk = _ref.chunk,\n          transfers = _ref.transfers,\n          success = _ref.success,\n          reason = _ref.reason;\n\n      _this3.postMessage({\n        sourceName: sourceName,\n        targetName: targetName,\n        stream: stream,\n        streamId: streamId,\n        chunk: chunk,\n        success: success,\n        reason: reason\n      }, transfers);\n    };\n    var streamSink = {\n      enqueue: function enqueue(chunk) {\n        var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n        var transfers = arguments[2];\n\n        if (this.isCancelled) {\n          return;\n        }\n        var lastDesiredSize = this.desiredSize;\n        this.desiredSize -= size;\n        if (lastDesiredSize > 0 && this.desiredSize <= 0) {\n          this.sinkCapability = createPromiseCapability();\n          this.ready = this.sinkCapability.promise;\n        }\n        sendStreamRequest({\n          stream: 'enqueue',\n          chunk: chunk,\n          transfers: transfers\n        });\n      },\n      close: function close() {\n        if (this.isCancelled) {\n          return;\n        }\n        sendStreamRequest({ stream: 'close' });\n        delete self.streamSinks[streamId];\n      },\n      error: function error(reason) {\n        if (this.isCancelled) {\n          return;\n        }\n        this.isCancelled = true;\n        sendStreamRequest({\n          stream: 'error',\n          reason: reason\n        });\n      },\n\n      sinkCapability: capability,\n      onPull: null,\n      onCancel: null,\n      isCancelled: false,\n      desiredSize: desiredSize,\n      ready: null\n    };\n    streamSink.sinkCapability.resolve();\n    streamSink.ready = streamSink.sinkCapability.promise;\n    this.streamSinks[streamId] = streamSink;\n    resolveCall(action[0], [data.data, streamSink], action[1]).then(function () {\n      sendStreamRequest({\n        stream: 'start_complete',\n        success: true\n      });\n    }, function (reason) {\n      sendStreamRequest({\n        stream: 'start_complete',\n        success: false,\n        reason: reason\n      });\n    });\n  },\n  _processStreamMessage: function _processStreamMessage(data) {\n    var _this4 = this;\n\n    var sourceName = this.sourceName;\n    var targetName = data.sourceName;\n    var streamId = data.streamId;\n    var sendStreamResponse = function sendStreamResponse(_ref2) {\n      var stream = _ref2.stream,\n          success = _ref2.success,\n          reason = _ref2.reason;\n\n      _this4.comObj.postMessage({\n        sourceName: sourceName,\n        targetName: targetName,\n        stream: stream,\n        success: success,\n        streamId: streamId,\n        reason: reason\n      });\n    };\n    var deleteStreamController = function deleteStreamController() {\n      Promise.all([_this4.streamControllers[data.streamId].startCall, _this4.streamControllers[data.streamId].pullCall, _this4.streamControllers[data.streamId].cancelCall].map(function (capability) {\n        return capability && finalize(capability.promise);\n      })).then(function () {\n        delete _this4.streamControllers[data.streamId];\n      });\n    };\n    switch (data.stream) {\n      case 'start_complete':\n        resolveOrReject(this.streamControllers[data.streamId].startCall, data.success, wrapReason(data.reason));\n        break;\n      case 'pull_complete':\n        resolveOrReject(this.streamControllers[data.streamId].pullCall, data.success, wrapReason(data.reason));\n        break;\n      case 'pull':\n        if (!this.streamSinks[data.streamId]) {\n          sendStreamResponse({\n            stream: 'pull_complete',\n            success: true\n          });\n          break;\n        }\n        if (this.streamSinks[data.streamId].desiredSize <= 0 && data.desiredSize > 0) {\n          this.streamSinks[data.streamId].sinkCapability.resolve();\n        }\n        this.streamSinks[data.streamId].desiredSize = data.desiredSize;\n        resolveCall(this.streamSinks[data.streamId].onPull).then(function () {\n          sendStreamResponse({\n            stream: 'pull_complete',\n            success: true\n          });\n        }, function (reason) {\n          sendStreamResponse({\n            stream: 'pull_complete',\n            success: false,\n            reason: reason\n          });\n        });\n        break;\n      case 'enqueue':\n        assert(this.streamControllers[data.streamId], 'enqueue should have stream controller');\n        if (!this.streamControllers[data.streamId].isClosed) {\n          this.streamControllers[data.streamId].controller.enqueue(data.chunk);\n        }\n        break;\n      case 'close':\n        assert(this.streamControllers[data.streamId], 'close should have stream controller');\n        if (this.streamControllers[data.streamId].isClosed) {\n          break;\n        }\n        this.streamControllers[data.streamId].isClosed = true;\n        this.streamControllers[data.streamId].controller.close();\n        deleteStreamController();\n        break;\n      case 'error':\n        assert(this.streamControllers[data.streamId], 'error should have stream controller');\n        this.streamControllers[data.streamId].controller.error(wrapReason(data.reason));\n        deleteStreamController();\n        break;\n      case 'cancel_complete':\n        resolveOrReject(this.streamControllers[data.streamId].cancelCall, data.success, wrapReason(data.reason));\n        deleteStreamController();\n        break;\n      case 'cancel':\n        if (!this.streamSinks[data.streamId]) {\n          break;\n        }\n        resolveCall(this.streamSinks[data.streamId].onCancel, [wrapReason(data.reason)]).then(function () {\n          sendStreamResponse({\n            stream: 'cancel_complete',\n            success: true\n          });\n        }, function (reason) {\n          sendStreamResponse({\n            stream: 'cancel_complete',\n            success: false,\n            reason: reason\n          });\n        });\n        this.streamSinks[data.streamId].sinkCapability.reject(wrapReason(data.reason));\n        this.streamSinks[data.streamId].isCancelled = true;\n        delete this.streamSinks[data.streamId];\n        break;\n      default:\n        throw new Error('Unexpected stream case');\n    }\n  },\n  postMessage: function postMessage(message, transfers) {\n    if (transfers && this.postMessageTransfers) {\n      this.comObj.postMessage(message, transfers);\n    } else {\n      this.comObj.postMessage(message);\n    }\n  },\n  destroy: function destroy() {\n    this.comObj.removeEventListener('message', this._onComObjOnMessage);\n  }\n};\nfunction loadJpegStream(id, imageUrl, objs) {\n  var img = new Image();\n  img.onload = function loadJpegStream_onloadClosure() {\n    objs.resolve(id, img);\n  };\n  img.onerror = function loadJpegStream_onerrorClosure() {\n    objs.resolve(id, null);\n    warn('Error during JPEG image loading');\n  };\n  img.src = imageUrl;\n}\nexports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX;\nexports.IDENTITY_MATRIX = IDENTITY_MATRIX;\nexports.OPS = OPS;\nexports.VERBOSITY_LEVELS = VERBOSITY_LEVELS;\nexports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES;\nexports.AnnotationBorderStyleType = AnnotationBorderStyleType;\nexports.AnnotationFieldFlag = AnnotationFieldFlag;\nexports.AnnotationFlag = AnnotationFlag;\nexports.AnnotationType = AnnotationType;\nexports.FontType = FontType;\nexports.ImageKind = ImageKind;\nexports.CMapCompressionType = CMapCompressionType;\nexports.AbortException = AbortException;\nexports.InvalidPDFException = InvalidPDFException;\nexports.MessageHandler = MessageHandler;\nexports.MissingDataException = MissingDataException;\nexports.MissingPDFException = MissingPDFException;\nexports.NativeImageDecoding = NativeImageDecoding;\nexports.NotImplementedException = NotImplementedException;\nexports.PageViewport = PageViewport;\nexports.PasswordException = PasswordException;\nexports.PasswordResponses = PasswordResponses;\nexports.StatTimer = StatTimer;\nexports.StreamType = StreamType;\nexports.TextRenderingMode = TextRenderingMode;\nexports.UnexpectedResponseException = UnexpectedResponseException;\nexports.UnknownErrorException = UnknownErrorException;\nexports.Util = Util;\nexports.XRefParseException = XRefParseException;\nexports.FormatError = FormatError;\nexports.arrayByteLength = arrayByteLength;\nexports.arraysToBytes = arraysToBytes;\nexports.assert = assert;\nexports.bytesToString = bytesToString;\nexports.createBlob = createBlob;\nexports.createPromiseCapability = createPromiseCapability;\nexports.createObjectURL = createObjectURL;\nexports.deprecated = deprecated;\nexports.getLookupTableFactory = getLookupTableFactory;\nexports.getVerbosityLevel = getVerbosityLevel;\nexports.globalScope = globalScope;\nexports.info = info;\nexports.isArray = isArray;\nexports.isArrayBuffer = isArrayBuffer;\nexports.isBool = isBool;\nexports.isEmptyObj = isEmptyObj;\nexports.isInt = isInt;\nexports.isNum = isNum;\nexports.isString = isString;\nexports.isSpace = isSpace;\nexports.isNodeJS = isNodeJS;\nexports.isSameOrigin = isSameOrigin;\nexports.createValidAbsoluteUrl = createValidAbsoluteUrl;\nexports.isLittleEndian = isLittleEndian;\nexports.isEvalSupported = isEvalSupported;\nexports.loadJpegStream = loadJpegStream;\nexports.log2 = log2;\nexports.readInt8 = readInt8;\nexports.readUint16 = readUint16;\nexports.readUint32 = readUint32;\nexports.removeNullCharacters = removeNullCharacters;\nexports.ReadableStream = _streams_polyfill.ReadableStream;\nexports.setVerbosityLevel = setVerbosityLevel;\nexports.shadow = shadow;\nexports.string32 = string32;\nexports.stringToBytes = stringToBytes;\nexports.stringToPDFString = stringToPDFString;\nexports.stringToUTF8String = stringToUTF8String;\nexports.utf8StringToString = utf8StringToString;\nexports.warn = warn;\nexports.unreachable = unreachable;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isStream = exports.isRefsEqual = exports.isRef = exports.isName = exports.isDict = exports.isCmd = exports.isEOF = exports.RefSetCache = exports.RefSet = exports.Ref = exports.Name = exports.Dict = exports.Cmd = exports.EOF = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _util = __w_pdfjs_require__(0);\n\nvar EOF = {};\nvar Name = function NameClosure() {\n  function Name(name) {\n    this.name = name;\n  }\n  Name.prototype = {};\n  var nameCache = Object.create(null);\n  Name.get = function Name_get(name) {\n    var nameValue = nameCache[name];\n    return nameValue ? nameValue : nameCache[name] = new Name(name);\n  };\n  return Name;\n}();\nvar Cmd = function CmdClosure() {\n  function Cmd(cmd) {\n    this.cmd = cmd;\n  }\n  Cmd.prototype = {};\n  var cmdCache = Object.create(null);\n  Cmd.get = function Cmd_get(cmd) {\n    var cmdValue = cmdCache[cmd];\n    return cmdValue ? cmdValue : cmdCache[cmd] = new Cmd(cmd);\n  };\n  return Cmd;\n}();\nvar Dict = function DictClosure() {\n  var nonSerializable = function nonSerializableClosure() {\n    return nonSerializable;\n  };\n  function Dict(xref) {\n    this._map = Object.create(null);\n    this.xref = xref;\n    this.objId = null;\n    this.suppressEncryption = false;\n    this.__nonSerializable__ = nonSerializable;\n  }\n  Dict.prototype = {\n    assignXref: function Dict_assignXref(newXref) {\n      this.xref = newXref;\n    },\n    get: function Dict_get(key1, key2, key3) {\n      var value;\n      var xref = this.xref,\n          suppressEncryption = this.suppressEncryption;\n      if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') {\n        return xref ? xref.fetchIfRef(value, suppressEncryption) : value;\n      }\n      if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') {\n        return xref ? xref.fetchIfRef(value, suppressEncryption) : value;\n      }\n      value = this._map[key3] || null;\n      return xref ? xref.fetchIfRef(value, suppressEncryption) : value;\n    },\n    getAsync: function Dict_getAsync(key1, key2, key3) {\n      var value;\n      var xref = this.xref,\n          suppressEncryption = this.suppressEncryption;\n      if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') {\n        if (xref) {\n          return xref.fetchIfRefAsync(value, suppressEncryption);\n        }\n        return Promise.resolve(value);\n      }\n      if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') {\n        if (xref) {\n          return xref.fetchIfRefAsync(value, suppressEncryption);\n        }\n        return Promise.resolve(value);\n      }\n      value = this._map[key3] || null;\n      if (xref) {\n        return xref.fetchIfRefAsync(value, suppressEncryption);\n      }\n      return Promise.resolve(value);\n    },\n    getArray: function Dict_getArray(key1, key2, key3) {\n      var value = this.get(key1, key2, key3);\n      var xref = this.xref,\n          suppressEncryption = this.suppressEncryption;\n      if (!(0, _util.isArray)(value) || !xref) {\n        return value;\n      }\n      value = value.slice();\n      for (var i = 0, ii = value.length; i < ii; i++) {\n        if (!isRef(value[i])) {\n          continue;\n        }\n        value[i] = xref.fetch(value[i], suppressEncryption);\n      }\n      return value;\n    },\n    getRaw: function Dict_getRaw(key) {\n      return this._map[key];\n    },\n    getKeys: function Dict_getKeys() {\n      return Object.keys(this._map);\n    },\n    set: function Dict_set(key, value) {\n      this._map[key] = value;\n    },\n    has: function Dict_has(key) {\n      return key in this._map;\n    },\n    forEach: function Dict_forEach(callback) {\n      for (var key in this._map) {\n        callback(key, this.get(key));\n      }\n    }\n  };\n  Dict.empty = new Dict(null);\n  Dict.merge = function (xref, dictArray) {\n    var mergedDict = new Dict(xref);\n    for (var i = 0, ii = dictArray.length; i < ii; i++) {\n      var dict = dictArray[i];\n      if (!isDict(dict)) {\n        continue;\n      }\n      for (var keyName in dict._map) {\n        if (mergedDict._map[keyName] !== undefined) {\n          continue;\n        }\n        mergedDict._map[keyName] = dict._map[keyName];\n      }\n    }\n    return mergedDict;\n  };\n  return Dict;\n}();\nvar Ref = function RefClosure() {\n  function Ref(num, gen) {\n    this.num = num;\n    this.gen = gen;\n  }\n  Ref.prototype = {\n    toString: function Ref_toString() {\n      var str = this.num + 'R';\n      if (this.gen !== 0) {\n        str += this.gen;\n      }\n      return str;\n    }\n  };\n  return Ref;\n}();\nvar RefSet = function RefSetClosure() {\n  function RefSet() {\n    this.dict = Object.create(null);\n  }\n  RefSet.prototype = {\n    has: function RefSet_has(ref) {\n      return ref.toString() in this.dict;\n    },\n    put: function RefSet_put(ref) {\n      this.dict[ref.toString()] = true;\n    },\n    remove: function RefSet_remove(ref) {\n      delete this.dict[ref.toString()];\n    }\n  };\n  return RefSet;\n}();\nvar RefSetCache = function RefSetCacheClosure() {\n  function RefSetCache() {\n    this.dict = Object.create(null);\n  }\n  RefSetCache.prototype = {\n    get: function RefSetCache_get(ref) {\n      return this.dict[ref.toString()];\n    },\n    has: function RefSetCache_has(ref) {\n      return ref.toString() in this.dict;\n    },\n    put: function RefSetCache_put(ref, obj) {\n      this.dict[ref.toString()] = obj;\n    },\n    putAlias: function RefSetCache_putAlias(ref, aliasRef) {\n      this.dict[ref.toString()] = this.get(aliasRef);\n    },\n    forEach: function RefSetCache_forEach(fn, thisArg) {\n      for (var i in this.dict) {\n        fn.call(thisArg, this.dict[i]);\n      }\n    },\n    clear: function RefSetCache_clear() {\n      this.dict = Object.create(null);\n    }\n  };\n  return RefSetCache;\n}();\nfunction isEOF(v) {\n  return v === EOF;\n}\nfunction isName(v, name) {\n  return v instanceof Name && (name === undefined || v.name === name);\n}\nfunction isCmd(v, cmd) {\n  return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);\n}\nfunction isDict(v, type) {\n  return v instanceof Dict && (type === undefined || isName(v.get('Type'), type));\n}\nfunction isRef(v) {\n  return v instanceof Ref;\n}\nfunction isRefsEqual(v1, v2) {\n  return v1.num === v2.num && v1.gen === v2.gen;\n}\nfunction isStream(v) {\n  return (typeof v === 'undefined' ? 'undefined' : _typeof(v)) === 'object' && v !== null && v.getBytes !== undefined;\n}\nexports.EOF = EOF;\nexports.Cmd = Cmd;\nexports.Dict = Dict;\nexports.Name = Name;\nexports.Ref = Ref;\nexports.RefSet = RefSet;\nexports.RefSetCache = RefSetCache;\nexports.isEOF = isEOF;\nexports.isCmd = isCmd;\nexports.isDict = isDict;\nexports.isName = isName;\nexports.isRef = isRef;\nexports.isRefsEqual = isRefsEqual;\nexports.isStream = isStream;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.LZWStream = exports.StringStream = exports.StreamsSequenceStream = exports.Stream = exports.RunLengthStream = exports.PredictorStream = exports.NullStream = exports.JpxStream = exports.JpegStream = exports.Jbig2Stream = exports.FlateStream = exports.DecodeStream = exports.DecryptStream = exports.CCITTFaxStream = exports.AsciiHexStream = exports.Ascii85Stream = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _jbig = __w_pdfjs_require__(27);\n\nvar _jpg = __w_pdfjs_require__(28);\n\nvar _jpx = __w_pdfjs_require__(14);\n\nvar Stream = function StreamClosure() {\n  function Stream(arrayBuffer, start, length, dict) {\n    this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer);\n    this.start = start || 0;\n    this.pos = this.start;\n    this.end = start + length || this.bytes.length;\n    this.dict = dict;\n  }\n  Stream.prototype = {\n    get length() {\n      return this.end - this.start;\n    },\n    get isEmpty() {\n      return this.length === 0;\n    },\n    getByte: function Stream_getByte() {\n      if (this.pos >= this.end) {\n        return -1;\n      }\n      return this.bytes[this.pos++];\n    },\n    getUint16: function Stream_getUint16() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      if (b0 === -1 || b1 === -1) {\n        return -1;\n      }\n      return (b0 << 8) + b1;\n    },\n    getInt32: function Stream_getInt32() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      var b2 = this.getByte();\n      var b3 = this.getByte();\n      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n    },\n    getBytes: function Stream_getBytes(length) {\n      var bytes = this.bytes;\n      var pos = this.pos;\n      var strEnd = this.end;\n      if (!length) {\n        return bytes.subarray(pos, strEnd);\n      }\n      var end = pos + length;\n      if (end > strEnd) {\n        end = strEnd;\n      }\n      this.pos = end;\n      return bytes.subarray(pos, end);\n    },\n    peekByte: function Stream_peekByte() {\n      var peekedByte = this.getByte();\n      this.pos--;\n      return peekedByte;\n    },\n    peekBytes: function Stream_peekBytes(length) {\n      var bytes = this.getBytes(length);\n      this.pos -= bytes.length;\n      return bytes;\n    },\n    skip: function Stream_skip(n) {\n      if (!n) {\n        n = 1;\n      }\n      this.pos += n;\n    },\n    reset: function Stream_reset() {\n      this.pos = this.start;\n    },\n    moveStart: function Stream_moveStart() {\n      this.start = this.pos;\n    },\n    makeSubStream: function Stream_makeSubStream(start, length, dict) {\n      return new Stream(this.bytes.buffer, start, length, dict);\n    }\n  };\n  return Stream;\n}();\nvar StringStream = function StringStreamClosure() {\n  function StringStream(str) {\n    var length = str.length;\n    var bytes = new Uint8Array(length);\n    for (var n = 0; n < length; ++n) {\n      bytes[n] = str.charCodeAt(n);\n    }\n    Stream.call(this, bytes);\n  }\n  StringStream.prototype = Stream.prototype;\n  return StringStream;\n}();\nvar DecodeStream = function DecodeStreamClosure() {\n  var emptyBuffer = new Uint8Array(0);\n  function DecodeStream(maybeMinBufferLength) {\n    this.pos = 0;\n    this.bufferLength = 0;\n    this.eof = false;\n    this.buffer = emptyBuffer;\n    this.minBufferLength = 512;\n    if (maybeMinBufferLength) {\n      while (this.minBufferLength < maybeMinBufferLength) {\n        this.minBufferLength *= 2;\n      }\n    }\n  }\n  DecodeStream.prototype = {\n    get isEmpty() {\n      while (!this.eof && this.bufferLength === 0) {\n        this.readBlock();\n      }\n      return this.bufferLength === 0;\n    },\n    ensureBuffer: function DecodeStream_ensureBuffer(requested) {\n      var buffer = this.buffer;\n      if (requested <= buffer.byteLength) {\n        return buffer;\n      }\n      var size = this.minBufferLength;\n      while (size < requested) {\n        size *= 2;\n      }\n      var buffer2 = new Uint8Array(size);\n      buffer2.set(buffer);\n      return this.buffer = buffer2;\n    },\n    getByte: function DecodeStream_getByte() {\n      var pos = this.pos;\n      while (this.bufferLength <= pos) {\n        if (this.eof) {\n          return -1;\n        }\n        this.readBlock();\n      }\n      return this.buffer[this.pos++];\n    },\n    getUint16: function DecodeStream_getUint16() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      if (b0 === -1 || b1 === -1) {\n        return -1;\n      }\n      return (b0 << 8) + b1;\n    },\n    getInt32: function DecodeStream_getInt32() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      var b2 = this.getByte();\n      var b3 = this.getByte();\n      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n    },\n    getBytes: function DecodeStream_getBytes(length) {\n      var end,\n          pos = this.pos;\n      if (length) {\n        this.ensureBuffer(pos + length);\n        end = pos + length;\n        while (!this.eof && this.bufferLength < end) {\n          this.readBlock();\n        }\n        var bufEnd = this.bufferLength;\n        if (end > bufEnd) {\n          end = bufEnd;\n        }\n      } else {\n        while (!this.eof) {\n          this.readBlock();\n        }\n        end = this.bufferLength;\n      }\n      this.pos = end;\n      return this.buffer.subarray(pos, end);\n    },\n    peekByte: function DecodeStream_peekByte() {\n      var peekedByte = this.getByte();\n      this.pos--;\n      return peekedByte;\n    },\n    peekBytes: function DecodeStream_peekBytes(length) {\n      var bytes = this.getBytes(length);\n      this.pos -= bytes.length;\n      return bytes;\n    },\n    makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {\n      var end = start + length;\n      while (this.bufferLength <= end && !this.eof) {\n        this.readBlock();\n      }\n      return new Stream(this.buffer, start, length, dict);\n    },\n    skip: function DecodeStream_skip(n) {\n      if (!n) {\n        n = 1;\n      }\n      this.pos += n;\n    },\n    reset: function DecodeStream_reset() {\n      this.pos = 0;\n    },\n    getBaseStreams: function DecodeStream_getBaseStreams() {\n      if (this.str && this.str.getBaseStreams) {\n        return this.str.getBaseStreams();\n      }\n      return [];\n    }\n  };\n  return DecodeStream;\n}();\nvar StreamsSequenceStream = function StreamsSequenceStreamClosure() {\n  function StreamsSequenceStream(streams) {\n    this.streams = streams;\n    DecodeStream.call(this, null);\n  }\n  StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);\n  StreamsSequenceStream.prototype.readBlock = function streamSequenceStreamReadBlock() {\n    var streams = this.streams;\n    if (streams.length === 0) {\n      this.eof = true;\n      return;\n    }\n    var stream = streams.shift();\n    var chunk = stream.getBytes();\n    var bufferLength = this.bufferLength;\n    var newLength = bufferLength + chunk.length;\n    var buffer = this.ensureBuffer(newLength);\n    buffer.set(chunk, bufferLength);\n    this.bufferLength = newLength;\n  };\n  StreamsSequenceStream.prototype.getBaseStreams = function StreamsSequenceStream_getBaseStreams() {\n    var baseStreams = [];\n    for (var i = 0, ii = this.streams.length; i < ii; i++) {\n      var stream = this.streams[i];\n      if (stream.getBaseStreams) {\n        _util.Util.appendToArray(baseStreams, stream.getBaseStreams());\n      }\n    }\n    return baseStreams;\n  };\n  return StreamsSequenceStream;\n}();\nvar FlateStream = function FlateStreamClosure() {\n  var codeLenCodeMap = new Int32Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n  var lengthDecode = new Int32Array([0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102]);\n  var distDecode = new Int32Array([0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001]);\n  var fixedLitCodeTab = [new Int32Array([0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff]), 9];\n  var fixedDistCodeTab = [new Int32Array([0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000]), 5];\n  function FlateStream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n    var cmf = str.getByte();\n    var flg = str.getByte();\n    if (cmf === -1 || flg === -1) {\n      throw new _util.FormatError('Invalid header in flate stream: ' + cmf + ', ' + flg);\n    }\n    if ((cmf & 0x0f) !== 0x08) {\n      throw new _util.FormatError('Unknown compression method in flate stream: ' + cmf + ', ' + flg);\n    }\n    if (((cmf << 8) + flg) % 31 !== 0) {\n      throw new _util.FormatError('Bad FCHECK in flate stream: ' + cmf + ', ' + flg);\n    }\n    if (flg & 0x20) {\n      throw new _util.FormatError('FDICT bit set in flate stream: ' + cmf + ', ' + flg);\n    }\n    this.codeSize = 0;\n    this.codeBuf = 0;\n    DecodeStream.call(this, maybeLength);\n  }\n  FlateStream.prototype = Object.create(DecodeStream.prototype);\n  FlateStream.prototype.getBits = function FlateStream_getBits(bits) {\n    var str = this.str;\n    var codeSize = this.codeSize;\n    var codeBuf = this.codeBuf;\n    var b;\n    while (codeSize < bits) {\n      if ((b = str.getByte()) === -1) {\n        throw new _util.FormatError('Bad encoding in flate stream');\n      }\n      codeBuf |= b << codeSize;\n      codeSize += 8;\n    }\n    b = codeBuf & (1 << bits) - 1;\n    this.codeBuf = codeBuf >> bits;\n    this.codeSize = codeSize -= bits;\n    return b;\n  };\n  FlateStream.prototype.getCode = function FlateStream_getCode(table) {\n    var str = this.str;\n    var codes = table[0];\n    var maxLen = table[1];\n    var codeSize = this.codeSize;\n    var codeBuf = this.codeBuf;\n    var b;\n    while (codeSize < maxLen) {\n      if ((b = str.getByte()) === -1) {\n        break;\n      }\n      codeBuf |= b << codeSize;\n      codeSize += 8;\n    }\n    var code = codes[codeBuf & (1 << maxLen) - 1];\n    var codeLen = code >> 16;\n    var codeVal = code & 0xffff;\n    if (codeLen < 1 || codeSize < codeLen) {\n      throw new _util.FormatError('Bad encoding in flate stream');\n    }\n    this.codeBuf = codeBuf >> codeLen;\n    this.codeSize = codeSize - codeLen;\n    return codeVal;\n  };\n  FlateStream.prototype.generateHuffmanTable = function flateStreamGenerateHuffmanTable(lengths) {\n    var n = lengths.length;\n    var maxLen = 0;\n    var i;\n    for (i = 0; i < n; ++i) {\n      if (lengths[i] > maxLen) {\n        maxLen = lengths[i];\n      }\n    }\n    var size = 1 << maxLen;\n    var codes = new Int32Array(size);\n    for (var len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) {\n      for (var val = 0; val < n; ++val) {\n        if (lengths[val] === len) {\n          var code2 = 0;\n          var t = code;\n          for (i = 0; i < len; ++i) {\n            code2 = code2 << 1 | t & 1;\n            t >>= 1;\n          }\n          for (i = code2; i < size; i += skip) {\n            codes[i] = len << 16 | val;\n          }\n          ++code;\n        }\n      }\n    }\n    return [codes, maxLen];\n  };\n  FlateStream.prototype.readBlock = function FlateStream_readBlock() {\n    var buffer, len;\n    var str = this.str;\n    var hdr = this.getBits(3);\n    if (hdr & 1) {\n      this.eof = true;\n    }\n    hdr >>= 1;\n    if (hdr === 0) {\n      var b;\n      if ((b = str.getByte()) === -1) {\n        throw new _util.FormatError('Bad block header in flate stream');\n      }\n      var blockLen = b;\n      if ((b = str.getByte()) === -1) {\n        throw new _util.FormatError('Bad block header in flate stream');\n      }\n      blockLen |= b << 8;\n      if ((b = str.getByte()) === -1) {\n        throw new _util.FormatError('Bad block header in flate stream');\n      }\n      var check = b;\n      if ((b = str.getByte()) === -1) {\n        throw new _util.FormatError('Bad block header in flate stream');\n      }\n      check |= b << 8;\n      if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) {\n        throw new _util.FormatError('Bad uncompressed block length in flate stream');\n      }\n      this.codeBuf = 0;\n      this.codeSize = 0;\n      var bufferLength = this.bufferLength;\n      buffer = this.ensureBuffer(bufferLength + blockLen);\n      var end = bufferLength + blockLen;\n      this.bufferLength = end;\n      if (blockLen === 0) {\n        if (str.peekByte() === -1) {\n          this.eof = true;\n        }\n      } else {\n        for (var n = bufferLength; n < end; ++n) {\n          if ((b = str.getByte()) === -1) {\n            this.eof = true;\n            break;\n          }\n          buffer[n] = b;\n        }\n      }\n      return;\n    }\n    var litCodeTable;\n    var distCodeTable;\n    if (hdr === 1) {\n      litCodeTable = fixedLitCodeTab;\n      distCodeTable = fixedDistCodeTab;\n    } else if (hdr === 2) {\n      var numLitCodes = this.getBits(5) + 257;\n      var numDistCodes = this.getBits(5) + 1;\n      var numCodeLenCodes = this.getBits(4) + 4;\n      var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);\n      var i;\n      for (i = 0; i < numCodeLenCodes; ++i) {\n        codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);\n      }\n      var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);\n      len = 0;\n      i = 0;\n      var codes = numLitCodes + numDistCodes;\n      var codeLengths = new Uint8Array(codes);\n      var bitsLength, bitsOffset, what;\n      while (i < codes) {\n        var code = this.getCode(codeLenCodeTab);\n        if (code === 16) {\n          bitsLength = 2;\n          bitsOffset = 3;\n          what = len;\n        } else if (code === 17) {\n          bitsLength = 3;\n          bitsOffset = 3;\n          what = len = 0;\n        } else if (code === 18) {\n          bitsLength = 7;\n          bitsOffset = 11;\n          what = len = 0;\n        } else {\n          codeLengths[i++] = len = code;\n          continue;\n        }\n        var repeatLength = this.getBits(bitsLength) + bitsOffset;\n        while (repeatLength-- > 0) {\n          codeLengths[i++] = what;\n        }\n      }\n      litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));\n      distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));\n    } else {\n      throw new _util.FormatError('Unknown block type in flate stream');\n    }\n    buffer = this.buffer;\n    var limit = buffer ? buffer.length : 0;\n    var pos = this.bufferLength;\n    while (true) {\n      var code1 = this.getCode(litCodeTable);\n      if (code1 < 256) {\n        if (pos + 1 >= limit) {\n          buffer = this.ensureBuffer(pos + 1);\n          limit = buffer.length;\n        }\n        buffer[pos++] = code1;\n        continue;\n      }\n      if (code1 === 256) {\n        this.bufferLength = pos;\n        return;\n      }\n      code1 -= 257;\n      code1 = lengthDecode[code1];\n      var code2 = code1 >> 16;\n      if (code2 > 0) {\n        code2 = this.getBits(code2);\n      }\n      len = (code1 & 0xffff) + code2;\n      code1 = this.getCode(distCodeTable);\n      code1 = distDecode[code1];\n      code2 = code1 >> 16;\n      if (code2 > 0) {\n        code2 = this.getBits(code2);\n      }\n      var dist = (code1 & 0xffff) + code2;\n      if (pos + len >= limit) {\n        buffer = this.ensureBuffer(pos + len);\n        limit = buffer.length;\n      }\n      for (var k = 0; k < len; ++k, ++pos) {\n        buffer[pos] = buffer[pos - dist];\n      }\n    }\n  };\n  return FlateStream;\n}();\nvar PredictorStream = function PredictorStreamClosure() {\n  function PredictorStream(str, maybeLength, params) {\n    if (!(0, _primitives.isDict)(params)) {\n      return str;\n    }\n    var predictor = this.predictor = params.get('Predictor') || 1;\n    if (predictor <= 1) {\n      return str;\n    }\n    if (predictor !== 2 && (predictor < 10 || predictor > 15)) {\n      throw new _util.FormatError('Unsupported predictor: ' + predictor);\n    }\n    if (predictor === 2) {\n      this.readBlock = this.readBlockTiff;\n    } else {\n      this.readBlock = this.readBlockPng;\n    }\n    this.str = str;\n    this.dict = str.dict;\n    var colors = this.colors = params.get('Colors') || 1;\n    var bits = this.bits = params.get('BitsPerComponent') || 8;\n    var columns = this.columns = params.get('Columns') || 1;\n    this.pixBytes = colors * bits + 7 >> 3;\n    this.rowBytes = columns * colors * bits + 7 >> 3;\n    DecodeStream.call(this, maybeLength);\n    return this;\n  }\n  PredictorStream.prototype = Object.create(DecodeStream.prototype);\n  PredictorStream.prototype.readBlockTiff = function predictorStreamReadBlockTiff() {\n    var rowBytes = this.rowBytes;\n    var bufferLength = this.bufferLength;\n    var buffer = this.ensureBuffer(bufferLength + rowBytes);\n    var bits = this.bits;\n    var colors = this.colors;\n    var rawBytes = this.str.getBytes(rowBytes);\n    this.eof = !rawBytes.length;\n    if (this.eof) {\n      return;\n    }\n    var inbuf = 0,\n        outbuf = 0;\n    var inbits = 0,\n        outbits = 0;\n    var pos = bufferLength;\n    var i;\n    if (bits === 1 && colors === 1) {\n      for (i = 0; i < rowBytes; ++i) {\n        var c = rawBytes[i] ^ inbuf;\n        c ^= c >> 1;\n        c ^= c >> 2;\n        c ^= c >> 4;\n        inbuf = (c & 1) << 7;\n        buffer[pos++] = c;\n      }\n    } else if (bits === 8) {\n      for (i = 0; i < colors; ++i) {\n        buffer[pos++] = rawBytes[i];\n      }\n      for (; i < rowBytes; ++i) {\n        buffer[pos] = buffer[pos - colors] + rawBytes[i];\n        pos++;\n      }\n    } else {\n      var compArray = new Uint8Array(colors + 1);\n      var bitMask = (1 << bits) - 1;\n      var j = 0,\n          k = bufferLength;\n      var columns = this.columns;\n      for (i = 0; i < columns; ++i) {\n        for (var kk = 0; kk < colors; ++kk) {\n          if (inbits < bits) {\n            inbuf = inbuf << 8 | rawBytes[j++] & 0xFF;\n            inbits += 8;\n          }\n          compArray[kk] = compArray[kk] + (inbuf >> inbits - bits) & bitMask;\n          inbits -= bits;\n          outbuf = outbuf << bits | compArray[kk];\n          outbits += bits;\n          if (outbits >= 8) {\n            buffer[k++] = outbuf >> outbits - 8 & 0xFF;\n            outbits -= 8;\n          }\n        }\n      }\n      if (outbits > 0) {\n        buffer[k++] = (outbuf << 8 - outbits) + (inbuf & (1 << 8 - outbits) - 1);\n      }\n    }\n    this.bufferLength += rowBytes;\n  };\n  PredictorStream.prototype.readBlockPng = function predictorStreamReadBlockPng() {\n    var rowBytes = this.rowBytes;\n    var pixBytes = this.pixBytes;\n    var predictor = this.str.getByte();\n    var rawBytes = this.str.getBytes(rowBytes);\n    this.eof = !rawBytes.length;\n    if (this.eof) {\n      return;\n    }\n    var bufferLength = this.bufferLength;\n    var buffer = this.ensureBuffer(bufferLength + rowBytes);\n    var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);\n    if (prevRow.length === 0) {\n      prevRow = new Uint8Array(rowBytes);\n    }\n    var i,\n        j = bufferLength,\n        up,\n        c;\n    switch (predictor) {\n      case 0:\n        for (i = 0; i < rowBytes; ++i) {\n          buffer[j++] = rawBytes[i];\n        }\n        break;\n      case 1:\n        for (i = 0; i < pixBytes; ++i) {\n          buffer[j++] = rawBytes[i];\n        }\n        for (; i < rowBytes; ++i) {\n          buffer[j] = buffer[j - pixBytes] + rawBytes[i] & 0xFF;\n          j++;\n        }\n        break;\n      case 2:\n        for (i = 0; i < rowBytes; ++i) {\n          buffer[j++] = prevRow[i] + rawBytes[i] & 0xFF;\n        }\n        break;\n      case 3:\n        for (i = 0; i < pixBytes; ++i) {\n          buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];\n        }\n        for (; i < rowBytes; ++i) {\n          buffer[j] = (prevRow[i] + buffer[j - pixBytes] >> 1) + rawBytes[i] & 0xFF;\n          j++;\n        }\n        break;\n      case 4:\n        for (i = 0; i < pixBytes; ++i) {\n          up = prevRow[i];\n          c = rawBytes[i];\n          buffer[j++] = up + c;\n        }\n        for (; i < rowBytes; ++i) {\n          up = prevRow[i];\n          var upLeft = prevRow[i - pixBytes];\n          var left = buffer[j - pixBytes];\n          var p = left + up - upLeft;\n          var pa = p - left;\n          if (pa < 0) {\n            pa = -pa;\n          }\n          var pb = p - up;\n          if (pb < 0) {\n            pb = -pb;\n          }\n          var pc = p - upLeft;\n          if (pc < 0) {\n            pc = -pc;\n          }\n          c = rawBytes[i];\n          if (pa <= pb && pa <= pc) {\n            buffer[j++] = left + c;\n          } else if (pb <= pc) {\n            buffer[j++] = up + c;\n          } else {\n            buffer[j++] = upLeft + c;\n          }\n        }\n        break;\n      default:\n        throw new _util.FormatError('Unsupported predictor: ' + predictor);\n    }\n    this.bufferLength += rowBytes;\n  };\n  return PredictorStream;\n}();\nvar JpegStream = function JpegStreamClosure() {\n  function JpegStream(stream, maybeLength, dict, params) {\n    var ch;\n    while ((ch = stream.getByte()) !== -1) {\n      if (ch === 0xFF) {\n        stream.skip(-1);\n        break;\n      }\n    }\n    this.stream = stream;\n    this.maybeLength = maybeLength;\n    this.dict = dict;\n    this.params = params;\n    DecodeStream.call(this, maybeLength);\n  }\n  JpegStream.prototype = Object.create(DecodeStream.prototype);\n  Object.defineProperty(JpegStream.prototype, 'bytes', {\n    get: function JpegStream_bytes() {\n      return (0, _util.shadow)(this, 'bytes', this.stream.getBytes(this.maybeLength));\n    },\n    configurable: true\n  });\n  JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) {\n    if (this.bufferLength) {\n      return;\n    }\n    var jpegImage = new _jpg.JpegImage();\n    var decodeArr = this.dict.getArray('Decode', 'D');\n    if (this.forceRGB && (0, _util.isArray)(decodeArr)) {\n      var bitsPerComponent = this.dict.get('BitsPerComponent') || 8;\n      var decodeArrLength = decodeArr.length;\n      var transform = new Int32Array(decodeArrLength);\n      var transformNeeded = false;\n      var maxValue = (1 << bitsPerComponent) - 1;\n      for (var i = 0; i < decodeArrLength; i += 2) {\n        transform[i] = (decodeArr[i + 1] - decodeArr[i]) * 256 | 0;\n        transform[i + 1] = decodeArr[i] * maxValue | 0;\n        if (transform[i] !== 256 || transform[i + 1] !== 0) {\n          transformNeeded = true;\n        }\n      }\n      if (transformNeeded) {\n        jpegImage.decodeTransform = transform;\n      }\n    }\n    if ((0, _primitives.isDict)(this.params)) {\n      var colorTransform = this.params.get('ColorTransform');\n      if ((0, _util.isInt)(colorTransform)) {\n        jpegImage.colorTransform = colorTransform;\n      }\n    }\n    jpegImage.parse(this.bytes);\n    var data = jpegImage.getData(this.drawWidth, this.drawHeight, this.forceRGB);\n    this.buffer = data;\n    this.bufferLength = data.length;\n    this.eof = true;\n  };\n  JpegStream.prototype.getBytes = function JpegStream_getBytes(length) {\n    this.ensureBuffer();\n    return this.buffer;\n  };\n  JpegStream.prototype.getIR = function JpegStream_getIR(forceDataSchema) {\n    return (0, _util.createObjectURL)(this.bytes, 'image/jpeg', forceDataSchema);\n  };\n  return JpegStream;\n}();\nvar JpxStream = function JpxStreamClosure() {\n  function JpxStream(stream, maybeLength, dict, params) {\n    this.stream = stream;\n    this.maybeLength = maybeLength;\n    this.dict = dict;\n    this.params = params;\n    DecodeStream.call(this, maybeLength);\n  }\n  JpxStream.prototype = Object.create(DecodeStream.prototype);\n  Object.defineProperty(JpxStream.prototype, 'bytes', {\n    get: function JpxStream_bytes() {\n      return (0, _util.shadow)(this, 'bytes', this.stream.getBytes(this.maybeLength));\n    },\n    configurable: true\n  });\n  JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) {\n    if (this.bufferLength) {\n      return;\n    }\n    var jpxImage = new _jpx.JpxImage();\n    jpxImage.parse(this.bytes);\n    var width = jpxImage.width;\n    var height = jpxImage.height;\n    var componentsCount = jpxImage.componentsCount;\n    var tileCount = jpxImage.tiles.length;\n    if (tileCount === 1) {\n      this.buffer = jpxImage.tiles[0].items;\n    } else {\n      var data = new Uint8Array(width * height * componentsCount);\n      for (var k = 0; k < tileCount; k++) {\n        var tileComponents = jpxImage.tiles[k];\n        var tileWidth = tileComponents.width;\n        var tileHeight = tileComponents.height;\n        var tileLeft = tileComponents.left;\n        var tileTop = tileComponents.top;\n        var src = tileComponents.items;\n        var srcPosition = 0;\n        var dataPosition = (width * tileTop + tileLeft) * componentsCount;\n        var imgRowSize = width * componentsCount;\n        var tileRowSize = tileWidth * componentsCount;\n        for (var j = 0; j < tileHeight; j++) {\n          var rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize);\n          data.set(rowBytes, dataPosition);\n          srcPosition += tileRowSize;\n          dataPosition += imgRowSize;\n        }\n      }\n      this.buffer = data;\n    }\n    this.bufferLength = this.buffer.length;\n    this.eof = true;\n  };\n  return JpxStream;\n}();\nvar Jbig2Stream = function Jbig2StreamClosure() {\n  function Jbig2Stream(stream, maybeLength, dict, params) {\n    this.stream = stream;\n    this.maybeLength = maybeLength;\n    this.dict = dict;\n    this.params = params;\n    DecodeStream.call(this, maybeLength);\n  }\n  Jbig2Stream.prototype = Object.create(DecodeStream.prototype);\n  Object.defineProperty(Jbig2Stream.prototype, 'bytes', {\n    get: function Jbig2Stream_bytes() {\n      return (0, _util.shadow)(this, 'bytes', this.stream.getBytes(this.maybeLength));\n    },\n    configurable: true\n  });\n  Jbig2Stream.prototype.ensureBuffer = function Jbig2Stream_ensureBuffer(req) {\n    if (this.bufferLength) {\n      return;\n    }\n    var jbig2Image = new _jbig.Jbig2Image();\n    var chunks = [];\n    if ((0, _primitives.isDict)(this.params)) {\n      var globalsStream = this.params.get('JBIG2Globals');\n      if ((0, _primitives.isStream)(globalsStream)) {\n        var globals = globalsStream.getBytes();\n        chunks.push({\n          data: globals,\n          start: 0,\n          end: globals.length\n        });\n      }\n    }\n    chunks.push({\n      data: this.bytes,\n      start: 0,\n      end: this.bytes.length\n    });\n    var data = jbig2Image.parseChunks(chunks);\n    var dataLength = data.length;\n    for (var i = 0; i < dataLength; i++) {\n      data[i] ^= 0xFF;\n    }\n    this.buffer = data;\n    this.bufferLength = dataLength;\n    this.eof = true;\n  };\n  return Jbig2Stream;\n}();\nvar DecryptStream = function DecryptStreamClosure() {\n  function DecryptStream(str, maybeLength, decrypt) {\n    this.str = str;\n    this.dict = str.dict;\n    this.decrypt = decrypt;\n    this.nextChunk = null;\n    this.initialized = false;\n    DecodeStream.call(this, maybeLength);\n  }\n  var chunkSize = 512;\n  DecryptStream.prototype = Object.create(DecodeStream.prototype);\n  DecryptStream.prototype.readBlock = function DecryptStream_readBlock() {\n    var chunk;\n    if (this.initialized) {\n      chunk = this.nextChunk;\n    } else {\n      chunk = this.str.getBytes(chunkSize);\n      this.initialized = true;\n    }\n    if (!chunk || chunk.length === 0) {\n      this.eof = true;\n      return;\n    }\n    this.nextChunk = this.str.getBytes(chunkSize);\n    var hasMoreData = this.nextChunk && this.nextChunk.length > 0;\n    var decrypt = this.decrypt;\n    chunk = decrypt(chunk, !hasMoreData);\n    var bufferLength = this.bufferLength;\n    var i,\n        n = chunk.length;\n    var buffer = this.ensureBuffer(bufferLength + n);\n    for (i = 0; i < n; i++) {\n      buffer[bufferLength++] = chunk[i];\n    }\n    this.bufferLength = bufferLength;\n  };\n  return DecryptStream;\n}();\nvar Ascii85Stream = function Ascii85StreamClosure() {\n  function Ascii85Stream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n    this.input = new Uint8Array(5);\n    if (maybeLength) {\n      maybeLength = 0.8 * maybeLength;\n    }\n    DecodeStream.call(this, maybeLength);\n  }\n  Ascii85Stream.prototype = Object.create(DecodeStream.prototype);\n  Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() {\n    var TILDA_CHAR = 0x7E;\n    var Z_LOWER_CHAR = 0x7A;\n    var EOF = -1;\n    var str = this.str;\n    var c = str.getByte();\n    while ((0, _util.isSpace)(c)) {\n      c = str.getByte();\n    }\n    if (c === EOF || c === TILDA_CHAR) {\n      this.eof = true;\n      return;\n    }\n    var bufferLength = this.bufferLength,\n        buffer;\n    var i;\n    if (c === Z_LOWER_CHAR) {\n      buffer = this.ensureBuffer(bufferLength + 4);\n      for (i = 0; i < 4; ++i) {\n        buffer[bufferLength + i] = 0;\n      }\n      this.bufferLength += 4;\n    } else {\n      var input = this.input;\n      input[0] = c;\n      for (i = 1; i < 5; ++i) {\n        c = str.getByte();\n        while ((0, _util.isSpace)(c)) {\n          c = str.getByte();\n        }\n        input[i] = c;\n        if (c === EOF || c === TILDA_CHAR) {\n          break;\n        }\n      }\n      buffer = this.ensureBuffer(bufferLength + i - 1);\n      this.bufferLength += i - 1;\n      if (i < 5) {\n        for (; i < 5; ++i) {\n          input[i] = 0x21 + 84;\n        }\n        this.eof = true;\n      }\n      var t = 0;\n      for (i = 0; i < 5; ++i) {\n        t = t * 85 + (input[i] - 0x21);\n      }\n      for (i = 3; i >= 0; --i) {\n        buffer[bufferLength + i] = t & 0xFF;\n        t >>= 8;\n      }\n    }\n  };\n  return Ascii85Stream;\n}();\nvar AsciiHexStream = function AsciiHexStreamClosure() {\n  function AsciiHexStream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n    this.firstDigit = -1;\n    if (maybeLength) {\n      maybeLength = 0.5 * maybeLength;\n    }\n    DecodeStream.call(this, maybeLength);\n  }\n  AsciiHexStream.prototype = Object.create(DecodeStream.prototype);\n  AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() {\n    var UPSTREAM_BLOCK_SIZE = 8000;\n    var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE);\n    if (!bytes.length) {\n      this.eof = true;\n      return;\n    }\n    var maxDecodeLength = bytes.length + 1 >> 1;\n    var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength);\n    var bufferLength = this.bufferLength;\n    var firstDigit = this.firstDigit;\n    for (var i = 0, ii = bytes.length; i < ii; i++) {\n      var ch = bytes[i],\n          digit;\n      if (ch >= 0x30 && ch <= 0x39) {\n        digit = ch & 0x0F;\n      } else if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {\n        digit = (ch & 0x0F) + 9;\n      } else if (ch === 0x3E) {\n        this.eof = true;\n        break;\n      } else {\n        continue;\n      }\n      if (firstDigit < 0) {\n        firstDigit = digit;\n      } else {\n        buffer[bufferLength++] = firstDigit << 4 | digit;\n        firstDigit = -1;\n      }\n    }\n    if (firstDigit >= 0 && this.eof) {\n      buffer[bufferLength++] = firstDigit << 4;\n      firstDigit = -1;\n    }\n    this.firstDigit = firstDigit;\n    this.bufferLength = bufferLength;\n  };\n  return AsciiHexStream;\n}();\nvar RunLengthStream = function RunLengthStreamClosure() {\n  function RunLengthStream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n    DecodeStream.call(this, maybeLength);\n  }\n  RunLengthStream.prototype = Object.create(DecodeStream.prototype);\n  RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() {\n    var repeatHeader = this.str.getBytes(2);\n    if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) {\n      this.eof = true;\n      return;\n    }\n    var buffer;\n    var bufferLength = this.bufferLength;\n    var n = repeatHeader[0];\n    if (n < 128) {\n      buffer = this.ensureBuffer(bufferLength + n + 1);\n      buffer[bufferLength++] = repeatHeader[1];\n      if (n > 0) {\n        var source = this.str.getBytes(n);\n        buffer.set(source, bufferLength);\n        bufferLength += n;\n      }\n    } else {\n      n = 257 - n;\n      var b = repeatHeader[1];\n      buffer = this.ensureBuffer(bufferLength + n + 1);\n      for (var i = 0; i < n; i++) {\n        buffer[bufferLength++] = b;\n      }\n    }\n    this.bufferLength = bufferLength;\n  };\n  return RunLengthStream;\n}();\nvar CCITTFaxStream = function CCITTFaxStreamClosure() {\n  var ccittEOL = -2;\n  var ccittEOF = -1;\n  var twoDimPass = 0;\n  var twoDimHoriz = 1;\n  var twoDimVert0 = 2;\n  var twoDimVertR1 = 3;\n  var twoDimVertL1 = 4;\n  var twoDimVertR2 = 5;\n  var twoDimVertL2 = 6;\n  var twoDimVertR3 = 7;\n  var twoDimVertL3 = 8;\n  var twoDimTable = [[-1, -1], [-1, -1], [7, twoDimVertL3], [7, twoDimVertR3], [6, twoDimVertL2], [6, twoDimVertL2], [6, twoDimVertR2], [6, twoDimVertR2], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0]];\n  var whiteTable1 = [[-1, -1], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [12, 1984], [12, 2048], [12, 2112], [12, 2176], [12, 2240], [12, 2304], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [12, 2368], [12, 2432], [12, 2496], [12, 2560]];\n  var whiteTable2 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [8, 29], [8, 29], [8, 30], [8, 30], [8, 45], [8, 45], [8, 46], [8, 46], [7, 22], [7, 22], [7, 22], [7, 22], [7, 23], [7, 23], [7, 23], [7, 23], [8, 47], [8, 47], [8, 48], [8, 48], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [7, 20], [7, 20], [7, 20], [7, 20], [8, 33], [8, 33], [8, 34], [8, 34], [8, 35], [8, 35], [8, 36], [8, 36], [8, 37], [8, 37], [8, 38], [8, 38], [7, 19], [7, 19], [7, 19], [7, 19], [8, 31], [8, 31], [8, 32], [8, 32], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [8, 53], [8, 53], [8, 54], [8, 54], [7, 26], [7, 26], [7, 26], [7, 26], [8, 39], [8, 39], [8, 40], [8, 40], [8, 41], [8, 41], [8, 42], [8, 42], [8, 43], [8, 43], [8, 44], [8, 44], [7, 21], [7, 21], [7, 21], [7, 21], [7, 28], [7, 28], [7, 28], [7, 28], [8, 61], [8, 61], [8, 62], [8, 62], [8, 63], [8, 63], [8, 0], [8, 0], [8, 320], [8, 320], [8, 384], [8, 384], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [7, 27], [7, 27], [7, 27], [7, 27], [8, 59], [8, 59], [8, 60], [8, 60], [9, 1472], [9, 1536], [9, 1600], [9, 1728], [7, 18], [7, 18], [7, 18], [7, 18], [7, 24], [7, 24], [7, 24], [7, 24], [8, 49], [8, 49], [8, 50], [8, 50], [8, 51], [8, 51], [8, 52], [8, 52], [7, 25], [7, 25], [7, 25], [7, 25], [8, 55], [8, 55], [8, 56], [8, 56], [8, 57], [8, 57], [8, 58], [8, 58], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [8, 448], [8, 448], [8, 512], [8, 512], [9, 704], [9, 768], [8, 640], [8, 640], [8, 576], [8, 576], [9, 832], [9, 896], [9, 960], [9, 1024], [9, 1088], [9, 1152], [9, 1216], [9, 1280], [9, 1344], [9, 1408], [7, 256], [7, 256], [7, 256], [7, 256], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7]];\n  var blackTable1 = [[-1, -1], [-1, -1], [12, ccittEOL], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [11, 1792], [11, 1792], [12, 1984], [12, 1984], [12, 2048], [12, 2048], [12, 2112], [12, 2112], [12, 2176], [12, 2176], [12, 2240], [12, 2240], [12, 2304], [12, 2304], [11, 1856], [11, 1856], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [11, 1920], [11, 1920], [12, 2368], [12, 2368], [12, 2432], [12, 2432], [12, 2496], [12, 2496], [12, 2560], [12, 2560], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [12, 52], [12, 52], [13, 640], [13, 704], [13, 768], [13, 832], [12, 55], [12, 55], [12, 56], [12, 56], [13, 1280], [13, 1344], [13, 1408], [13, 1472], [12, 59], [12, 59], [12, 60], [12, 60], [13, 1536], [13, 1600], [11, 24], [11, 24], [11, 24], [11, 24], [11, 25], [11, 25], [11, 25], [11, 25], [13, 1664], [13, 1728], [12, 320], [12, 320], [12, 384], [12, 384], [12, 448], [12, 448], [13, 512], [13, 576], [12, 53], [12, 53], [12, 54], [12, 54], [13, 896], [13, 960], [13, 1024], [13, 1088], [13, 1152], [13, 1216], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64]];\n  var blackTable2 = [[8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [11, 23], [11, 23], [12, 50], [12, 51], [12, 44], [12, 45], [12, 46], [12, 47], [12, 57], [12, 58], [12, 61], [12, 256], [10, 16], [10, 16], [10, 16], [10, 16], [10, 17], [10, 17], [10, 17], [10, 17], [12, 48], [12, 49], [12, 62], [12, 63], [12, 30], [12, 31], [12, 32], [12, 33], [12, 40], [12, 41], [11, 22], [11, 22], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [12, 128], [12, 192], [12, 26], [12, 27], [12, 28], [12, 29], [11, 19], [11, 19], [11, 20], [11, 20], [12, 34], [12, 35], [12, 36], [12, 37], [12, 38], [12, 39], [11, 21], [11, 21], [12, 42], [12, 43], [10, 0], [10, 0], [10, 0], [10, 0], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12]];\n  var blackTable3 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [6, 9], [6, 8], [5, 7], [5, 7], [4, 6], [4, 6], [4, 6], [4, 6], [4, 5], [4, 5], [4, 5], [4, 5], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2]];\n  function CCITTFaxStream(str, maybeLength, params) {\n    this.str = str;\n    this.dict = str.dict;\n    params = params || _primitives.Dict.empty;\n    this.encoding = params.get('K') || 0;\n    this.eoline = params.get('EndOfLine') || false;\n    this.byteAlign = params.get('EncodedByteAlign') || false;\n    this.columns = params.get('Columns') || 1728;\n    this.rows = params.get('Rows') || 0;\n    var eoblock = params.get('EndOfBlock');\n    if (eoblock === null || eoblock === undefined) {\n      eoblock = true;\n    }\n    this.eoblock = eoblock;\n    this.black = params.get('BlackIs1') || false;\n    this.codingLine = new Uint32Array(this.columns + 1);\n    this.refLine = new Uint32Array(this.columns + 2);\n    this.codingLine[0] = this.columns;\n    this.codingPos = 0;\n    this.row = 0;\n    this.nextLine2D = this.encoding < 0;\n    this.inputBits = 0;\n    this.inputBuf = 0;\n    this.outputBits = 0;\n    var code1;\n    while ((code1 = this.lookBits(12)) === 0) {\n      this.eatBits(1);\n    }\n    if (code1 === 1) {\n      this.eatBits(12);\n    }\n    if (this.encoding > 0) {\n      this.nextLine2D = !this.lookBits(1);\n      this.eatBits(1);\n    }\n    DecodeStream.call(this, maybeLength);\n  }\n  CCITTFaxStream.prototype = Object.create(DecodeStream.prototype);\n  CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() {\n    while (!this.eof) {\n      var c = this.lookChar();\n      this.ensureBuffer(this.bufferLength + 1);\n      this.buffer[this.bufferLength++] = c;\n    }\n  };\n  CCITTFaxStream.prototype.addPixels = function ccittFaxStreamAddPixels(a1, blackPixels) {\n    var codingLine = this.codingLine;\n    var codingPos = this.codingPos;\n    if (a1 > codingLine[codingPos]) {\n      if (a1 > this.columns) {\n        (0, _util.info)('row is wrong length');\n        this.err = true;\n        a1 = this.columns;\n      }\n      if (codingPos & 1 ^ blackPixels) {\n        ++codingPos;\n      }\n      codingLine[codingPos] = a1;\n    }\n    this.codingPos = codingPos;\n  };\n  CCITTFaxStream.prototype.addPixelsNeg = function ccittFaxStreamAddPixelsNeg(a1, blackPixels) {\n    var codingLine = this.codingLine;\n    var codingPos = this.codingPos;\n    if (a1 > codingLine[codingPos]) {\n      if (a1 > this.columns) {\n        (0, _util.info)('row is wrong length');\n        this.err = true;\n        a1 = this.columns;\n      }\n      if (codingPos & 1 ^ blackPixels) {\n        ++codingPos;\n      }\n      codingLine[codingPos] = a1;\n    } else if (a1 < codingLine[codingPos]) {\n      if (a1 < 0) {\n        (0, _util.info)('invalid code');\n        this.err = true;\n        a1 = 0;\n      }\n      while (codingPos > 0 && a1 < codingLine[codingPos - 1]) {\n        --codingPos;\n      }\n      codingLine[codingPos] = a1;\n    }\n    this.codingPos = codingPos;\n  };\n  CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() {\n    var refLine = this.refLine;\n    var codingLine = this.codingLine;\n    var columns = this.columns;\n    var refPos, blackPixels, bits, i;\n    if (this.outputBits === 0) {\n      if (this.eof) {\n        return null;\n      }\n      this.err = false;\n      var code1, code2, code3;\n      if (this.nextLine2D) {\n        for (i = 0; codingLine[i] < columns; ++i) {\n          refLine[i] = codingLine[i];\n        }\n        refLine[i++] = columns;\n        refLine[i] = columns;\n        codingLine[0] = 0;\n        this.codingPos = 0;\n        refPos = 0;\n        blackPixels = 0;\n        while (codingLine[this.codingPos] < columns) {\n          code1 = this.getTwoDimCode();\n          switch (code1) {\n            case twoDimPass:\n              this.addPixels(refLine[refPos + 1], blackPixels);\n              if (refLine[refPos + 1] < columns) {\n                refPos += 2;\n              }\n              break;\n            case twoDimHoriz:\n              code1 = code2 = 0;\n              if (blackPixels) {\n                do {\n                  code1 += code3 = this.getBlackCode();\n                } while (code3 >= 64);\n                do {\n                  code2 += code3 = this.getWhiteCode();\n                } while (code3 >= 64);\n              } else {\n                do {\n                  code1 += code3 = this.getWhiteCode();\n                } while (code3 >= 64);\n                do {\n                  code2 += code3 = this.getBlackCode();\n                } while (code3 >= 64);\n              }\n              this.addPixels(codingLine[this.codingPos] + code1, blackPixels);\n              if (codingLine[this.codingPos] < columns) {\n                this.addPixels(codingLine[this.codingPos] + code2, blackPixels ^ 1);\n              }\n              while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                refPos += 2;\n              }\n              break;\n            case twoDimVertR3:\n              this.addPixels(refLine[refPos] + 3, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                ++refPos;\n                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVertR2:\n              this.addPixels(refLine[refPos] + 2, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                ++refPos;\n                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVertR1:\n              this.addPixels(refLine[refPos] + 1, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                ++refPos;\n                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVert0:\n              this.addPixels(refLine[refPos], blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                ++refPos;\n                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVertL3:\n              this.addPixelsNeg(refLine[refPos] - 3, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                if (refPos > 0) {\n                  --refPos;\n                } else {\n                  ++refPos;\n                }\n                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVertL2:\n              this.addPixelsNeg(refLine[refPos] - 2, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                if (refPos > 0) {\n                  --refPos;\n                } else {\n                  ++refPos;\n                }\n                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVertL1:\n              this.addPixelsNeg(refLine[refPos] - 1, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                if (refPos > 0) {\n                  --refPos;\n                } else {\n                  ++refPos;\n                }\n                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case ccittEOF:\n              this.addPixels(columns, 0);\n              this.eof = true;\n              break;\n            default:\n              (0, _util.info)('bad 2d code');\n              this.addPixels(columns, 0);\n              this.err = true;\n          }\n        }\n      } else {\n        codingLine[0] = 0;\n        this.codingPos = 0;\n        blackPixels = 0;\n        while (codingLine[this.codingPos] < columns) {\n          code1 = 0;\n          if (blackPixels) {\n            do {\n              code1 += code3 = this.getBlackCode();\n            } while (code3 >= 64);\n          } else {\n            do {\n              code1 += code3 = this.getWhiteCode();\n            } while (code3 >= 64);\n          }\n          this.addPixels(codingLine[this.codingPos] + code1, blackPixels);\n          blackPixels ^= 1;\n        }\n      }\n      var gotEOL = false;\n      if (this.byteAlign) {\n        this.inputBits &= ~7;\n      }\n      if (!this.eoblock && this.row === this.rows - 1) {\n        this.eof = true;\n      } else {\n        code1 = this.lookBits(12);\n        if (this.eoline) {\n          while (code1 !== ccittEOF && code1 !== 1) {\n            this.eatBits(1);\n            code1 = this.lookBits(12);\n          }\n        } else {\n          while (code1 === 0) {\n            this.eatBits(1);\n            code1 = this.lookBits(12);\n          }\n        }\n        if (code1 === 1) {\n          this.eatBits(12);\n          gotEOL = true;\n        } else if (code1 === ccittEOF) {\n          this.eof = true;\n        }\n      }\n      if (!this.eof && this.encoding > 0) {\n        this.nextLine2D = !this.lookBits(1);\n        this.eatBits(1);\n      }\n      if (this.eoblock && gotEOL && this.byteAlign) {\n        code1 = this.lookBits(12);\n        if (code1 === 1) {\n          this.eatBits(12);\n          if (this.encoding > 0) {\n            this.lookBits(1);\n            this.eatBits(1);\n          }\n          if (this.encoding >= 0) {\n            for (i = 0; i < 4; ++i) {\n              code1 = this.lookBits(12);\n              if (code1 !== 1) {\n                (0, _util.info)('bad rtc code: ' + code1);\n              }\n              this.eatBits(12);\n              if (this.encoding > 0) {\n                this.lookBits(1);\n                this.eatBits(1);\n              }\n            }\n          }\n          this.eof = true;\n        }\n      } else if (this.err && this.eoline) {\n        while (true) {\n          code1 = this.lookBits(13);\n          if (code1 === ccittEOF) {\n            this.eof = true;\n            return null;\n          }\n          if (code1 >> 1 === 1) {\n            break;\n          }\n          this.eatBits(1);\n        }\n        this.eatBits(12);\n        if (this.encoding > 0) {\n          this.eatBits(1);\n          this.nextLine2D = !(code1 & 1);\n        }\n      }\n      if (codingLine[0] > 0) {\n        this.outputBits = codingLine[this.codingPos = 0];\n      } else {\n        this.outputBits = codingLine[this.codingPos = 1];\n      }\n      this.row++;\n    }\n    var c;\n    if (this.outputBits >= 8) {\n      c = this.codingPos & 1 ? 0 : 0xFF;\n      this.outputBits -= 8;\n      if (this.outputBits === 0 && codingLine[this.codingPos] < columns) {\n        this.codingPos++;\n        this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1];\n      }\n    } else {\n      bits = 8;\n      c = 0;\n      do {\n        if (this.outputBits > bits) {\n          c <<= bits;\n          if (!(this.codingPos & 1)) {\n            c |= 0xFF >> 8 - bits;\n          }\n          this.outputBits -= bits;\n          bits = 0;\n        } else {\n          c <<= this.outputBits;\n          if (!(this.codingPos & 1)) {\n            c |= 0xFF >> 8 - this.outputBits;\n          }\n          bits -= this.outputBits;\n          this.outputBits = 0;\n          if (codingLine[this.codingPos] < columns) {\n            this.codingPos++;\n            this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1];\n          } else if (bits > 0) {\n            c <<= bits;\n            bits = 0;\n          }\n        }\n      } while (bits);\n    }\n    if (this.black) {\n      c ^= 0xFF;\n    }\n    return c;\n  };\n  CCITTFaxStream.prototype.findTableCode = function ccittFaxStreamFindTableCode(start, end, table, limit) {\n    var limitValue = limit || 0;\n    for (var i = start; i <= end; ++i) {\n      var code = this.lookBits(i);\n      if (code === ccittEOF) {\n        return [true, 1, false];\n      }\n      if (i < end) {\n        code <<= end - i;\n      }\n      if (!limitValue || code >= limitValue) {\n        var p = table[code - limitValue];\n        if (p[0] === i) {\n          this.eatBits(i);\n          return [true, p[1], true];\n        }\n      }\n    }\n    return [false, 0, false];\n  };\n  CCITTFaxStream.prototype.getTwoDimCode = function ccittFaxStreamGetTwoDimCode() {\n    var code = 0;\n    var p;\n    if (this.eoblock) {\n      code = this.lookBits(7);\n      p = twoDimTable[code];\n      if (p && p[0] > 0) {\n        this.eatBits(p[0]);\n        return p[1];\n      }\n    } else {\n      var result = this.findTableCode(1, 7, twoDimTable);\n      if (result[0] && result[2]) {\n        return result[1];\n      }\n    }\n    (0, _util.info)('Bad two dim code');\n    return ccittEOF;\n  };\n  CCITTFaxStream.prototype.getWhiteCode = function ccittFaxStreamGetWhiteCode() {\n    var code = 0;\n    var p;\n    if (this.eoblock) {\n      code = this.lookBits(12);\n      if (code === ccittEOF) {\n        return 1;\n      }\n      if (code >> 5 === 0) {\n        p = whiteTable1[code];\n      } else {\n        p = whiteTable2[code >> 3];\n      }\n      if (p[0] > 0) {\n        this.eatBits(p[0]);\n        return p[1];\n      }\n    } else {\n      var result = this.findTableCode(1, 9, whiteTable2);\n      if (result[0]) {\n        return result[1];\n      }\n      result = this.findTableCode(11, 12, whiteTable1);\n      if (result[0]) {\n        return result[1];\n      }\n    }\n    (0, _util.info)('bad white code');\n    this.eatBits(1);\n    return 1;\n  };\n  CCITTFaxStream.prototype.getBlackCode = function ccittFaxStreamGetBlackCode() {\n    var code, p;\n    if (this.eoblock) {\n      code = this.lookBits(13);\n      if (code === ccittEOF) {\n        return 1;\n      }\n      if (code >> 7 === 0) {\n        p = blackTable1[code];\n      } else if (code >> 9 === 0 && code >> 7 !== 0) {\n        p = blackTable2[(code >> 1) - 64];\n      } else {\n        p = blackTable3[code >> 7];\n      }\n      if (p[0] > 0) {\n        this.eatBits(p[0]);\n        return p[1];\n      }\n    } else {\n      var result = this.findTableCode(2, 6, blackTable3);\n      if (result[0]) {\n        return result[1];\n      }\n      result = this.findTableCode(7, 12, blackTable2, 64);\n      if (result[0]) {\n        return result[1];\n      }\n      result = this.findTableCode(10, 13, blackTable1);\n      if (result[0]) {\n        return result[1];\n      }\n    }\n    (0, _util.info)('bad black code');\n    this.eatBits(1);\n    return 1;\n  };\n  CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) {\n    var c;\n    while (this.inputBits < n) {\n      if ((c = this.str.getByte()) === -1) {\n        if (this.inputBits === 0) {\n          return ccittEOF;\n        }\n        return this.inputBuf << n - this.inputBits & 0xFFFF >> 16 - n;\n      }\n      this.inputBuf = this.inputBuf << 8 | c;\n      this.inputBits += 8;\n    }\n    return this.inputBuf >> this.inputBits - n & 0xFFFF >> 16 - n;\n  };\n  CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) {\n    if ((this.inputBits -= n) < 0) {\n      this.inputBits = 0;\n    }\n  };\n  return CCITTFaxStream;\n}();\nvar LZWStream = function LZWStreamClosure() {\n  function LZWStream(str, maybeLength, earlyChange) {\n    this.str = str;\n    this.dict = str.dict;\n    this.cachedData = 0;\n    this.bitsCached = 0;\n    var maxLzwDictionarySize = 4096;\n    var lzwState = {\n      earlyChange: earlyChange,\n      codeLength: 9,\n      nextCode: 258,\n      dictionaryValues: new Uint8Array(maxLzwDictionarySize),\n      dictionaryLengths: new Uint16Array(maxLzwDictionarySize),\n      dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),\n      currentSequence: new Uint8Array(maxLzwDictionarySize),\n      currentSequenceLength: 0\n    };\n    for (var i = 0; i < 256; ++i) {\n      lzwState.dictionaryValues[i] = i;\n      lzwState.dictionaryLengths[i] = 1;\n    }\n    this.lzwState = lzwState;\n    DecodeStream.call(this, maybeLength);\n  }\n  LZWStream.prototype = Object.create(DecodeStream.prototype);\n  LZWStream.prototype.readBits = function LZWStream_readBits(n) {\n    var bitsCached = this.bitsCached;\n    var cachedData = this.cachedData;\n    while (bitsCached < n) {\n      var c = this.str.getByte();\n      if (c === -1) {\n        this.eof = true;\n        return null;\n      }\n      cachedData = cachedData << 8 | c;\n      bitsCached += 8;\n    }\n    this.bitsCached = bitsCached -= n;\n    this.cachedData = cachedData;\n    this.lastCode = null;\n    return cachedData >>> bitsCached & (1 << n) - 1;\n  };\n  LZWStream.prototype.readBlock = function LZWStream_readBlock() {\n    var blockSize = 512;\n    var estimatedDecodedSize = blockSize * 2,\n        decodedSizeDelta = blockSize;\n    var i, j, q;\n    var lzwState = this.lzwState;\n    if (!lzwState) {\n      return;\n    }\n    var earlyChange = lzwState.earlyChange;\n    var nextCode = lzwState.nextCode;\n    var dictionaryValues = lzwState.dictionaryValues;\n    var dictionaryLengths = lzwState.dictionaryLengths;\n    var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;\n    var codeLength = lzwState.codeLength;\n    var prevCode = lzwState.prevCode;\n    var currentSequence = lzwState.currentSequence;\n    var currentSequenceLength = lzwState.currentSequenceLength;\n    var decodedLength = 0;\n    var currentBufferLength = this.bufferLength;\n    var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);\n    for (i = 0; i < blockSize; i++) {\n      var code = this.readBits(codeLength);\n      var hasPrev = currentSequenceLength > 0;\n      if (code < 256) {\n        currentSequence[0] = code;\n        currentSequenceLength = 1;\n      } else if (code >= 258) {\n        if (code < nextCode) {\n          currentSequenceLength = dictionaryLengths[code];\n          for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {\n            currentSequence[j] = dictionaryValues[q];\n            q = dictionaryPrevCodes[q];\n          }\n        } else {\n          currentSequence[currentSequenceLength++] = currentSequence[0];\n        }\n      } else if (code === 256) {\n        codeLength = 9;\n        nextCode = 258;\n        currentSequenceLength = 0;\n        continue;\n      } else {\n        this.eof = true;\n        delete this.lzwState;\n        break;\n      }\n      if (hasPrev) {\n        dictionaryPrevCodes[nextCode] = prevCode;\n        dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;\n        dictionaryValues[nextCode] = currentSequence[0];\n        nextCode++;\n        codeLength = nextCode + earlyChange & nextCode + earlyChange - 1 ? codeLength : Math.min(Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1, 12) | 0;\n      }\n      prevCode = code;\n      decodedLength += currentSequenceLength;\n      if (estimatedDecodedSize < decodedLength) {\n        do {\n          estimatedDecodedSize += decodedSizeDelta;\n        } while (estimatedDecodedSize < decodedLength);\n        buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);\n      }\n      for (j = 0; j < currentSequenceLength; j++) {\n        buffer[currentBufferLength++] = currentSequence[j];\n      }\n    }\n    lzwState.nextCode = nextCode;\n    lzwState.codeLength = codeLength;\n    lzwState.prevCode = prevCode;\n    lzwState.currentSequenceLength = currentSequenceLength;\n    this.bufferLength = currentBufferLength;\n  };\n  return LZWStream;\n}();\nvar NullStream = function NullStreamClosure() {\n  function NullStream() {\n    Stream.call(this, new Uint8Array(0));\n  }\n  NullStream.prototype = Stream.prototype;\n  return NullStream;\n}();\nexports.Ascii85Stream = Ascii85Stream;\nexports.AsciiHexStream = AsciiHexStream;\nexports.CCITTFaxStream = CCITTFaxStream;\nexports.DecryptStream = DecryptStream;\nexports.DecodeStream = DecodeStream;\nexports.FlateStream = FlateStream;\nexports.Jbig2Stream = Jbig2Stream;\nexports.JpegStream = JpegStream;\nexports.JpxStream = JpxStream;\nexports.NullStream = NullStream;\nexports.PredictorStream = PredictorStream;\nexports.RunLengthStream = RunLengthStream;\nexports.Stream = Stream;\nexports.StreamsSequenceStream = StreamsSequenceStream;\nexports.StringStream = StringStream;\nexports.LZWStream = LZWStream;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ColorSpace = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _function = __w_pdfjs_require__(7);\n\nvar ColorSpace = function ColorSpaceClosure() {\n  function resizeRgbImage(src, bpc, w1, h1, w2, h2, alpha01, dest) {\n    var COMPONENTS = 3;\n    alpha01 = alpha01 !== 1 ? 0 : alpha01;\n    var xRatio = w1 / w2;\n    var yRatio = h1 / h2;\n    var i,\n        j,\n        py,\n        newIndex = 0,\n        oldIndex;\n    var xScaled = new Uint16Array(w2);\n    var w1Scanline = w1 * COMPONENTS;\n    for (i = 0; i < w2; i++) {\n      xScaled[i] = Math.floor(i * xRatio) * COMPONENTS;\n    }\n    for (i = 0; i < h2; i++) {\n      py = Math.floor(i * yRatio) * w1Scanline;\n      for (j = 0; j < w2; j++) {\n        oldIndex = py + xScaled[j];\n        dest[newIndex++] = src[oldIndex++];\n        dest[newIndex++] = src[oldIndex++];\n        dest[newIndex++] = src[oldIndex++];\n        newIndex += alpha01;\n      }\n    }\n  }\n  function ColorSpace() {\n    throw new Error('should not call ColorSpace constructor');\n  }\n  ColorSpace.prototype = {\n    getRgb: function ColorSpace_getRgb(src, srcOffset) {\n      var rgb = new Uint8Array(3);\n      this.getRgbItem(src, srcOffset, rgb, 0);\n      return rgb;\n    },\n    getRgbItem: function ColorSpace_getRgbItem(src, srcOffset, dest, destOffset) {\n      throw new Error('Should not call ColorSpace.getRgbItem');\n    },\n    getRgbBuffer: function ColorSpace_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      throw new Error('Should not call ColorSpace.getRgbBuffer');\n    },\n    getOutputLength: function ColorSpace_getOutputLength(inputLength, alpha01) {\n      throw new Error('Should not call ColorSpace.getOutputLength');\n    },\n    isPassthrough: function ColorSpace_isPassthrough(bits) {\n      return false;\n    },\n    fillRgb: function ColorSpace_fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) {\n      var count = originalWidth * originalHeight;\n      var rgbBuf = null;\n      var numComponentColors = 1 << bpc;\n      var needsResizing = originalHeight !== height || originalWidth !== width;\n      var i, ii;\n      if (this.isPassthrough(bpc)) {\n        rgbBuf = comps;\n      } else if (this.numComps === 1 && count > numComponentColors && this.name !== 'DeviceGray' && this.name !== 'DeviceRGB') {\n        var allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : new Uint16Array(numComponentColors);\n        var key;\n        for (i = 0; i < numComponentColors; i++) {\n          allColors[i] = i;\n        }\n        var colorMap = new Uint8Array(numComponentColors * 3);\n        this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, 0);\n        var destPos, rgbPos;\n        if (!needsResizing) {\n          destPos = 0;\n          for (i = 0; i < count; ++i) {\n            key = comps[i] * 3;\n            dest[destPos++] = colorMap[key];\n            dest[destPos++] = colorMap[key + 1];\n            dest[destPos++] = colorMap[key + 2];\n            destPos += alpha01;\n          }\n        } else {\n          rgbBuf = new Uint8Array(count * 3);\n          rgbPos = 0;\n          for (i = 0; i < count; ++i) {\n            key = comps[i] * 3;\n            rgbBuf[rgbPos++] = colorMap[key];\n            rgbBuf[rgbPos++] = colorMap[key + 1];\n            rgbBuf[rgbPos++] = colorMap[key + 2];\n          }\n        }\n      } else {\n        if (!needsResizing) {\n          this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, alpha01);\n        } else {\n          rgbBuf = new Uint8Array(count * 3);\n          this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, 0);\n        }\n      }\n      if (rgbBuf) {\n        if (needsResizing) {\n          resizeRgbImage(rgbBuf, bpc, originalWidth, originalHeight, width, height, alpha01, dest);\n        } else {\n          rgbPos = 0;\n          destPos = 0;\n          for (i = 0, ii = width * actualHeight; i < ii; i++) {\n            dest[destPos++] = rgbBuf[rgbPos++];\n            dest[destPos++] = rgbBuf[rgbPos++];\n            dest[destPos++] = rgbBuf[rgbPos++];\n            destPos += alpha01;\n          }\n        }\n      }\n    },\n    usesZeroToOneRange: true\n  };\n  ColorSpace.parse = function ColorSpace_parse(cs, xref, res) {\n    var IR = ColorSpace.parseToIR(cs, xref, res);\n    if (IR instanceof AlternateCS) {\n      return IR;\n    }\n    return ColorSpace.fromIR(IR);\n  };\n  ColorSpace.fromIR = function ColorSpace_fromIR(IR) {\n    var name = (0, _util.isArray)(IR) ? IR[0] : IR;\n    var whitePoint, blackPoint, gamma;\n    switch (name) {\n      case 'DeviceGrayCS':\n        return this.singletons.gray;\n      case 'DeviceRgbCS':\n        return this.singletons.rgb;\n      case 'DeviceCmykCS':\n        return this.singletons.cmyk;\n      case 'CalGrayCS':\n        whitePoint = IR[1];\n        blackPoint = IR[2];\n        gamma = IR[3];\n        return new CalGrayCS(whitePoint, blackPoint, gamma);\n      case 'CalRGBCS':\n        whitePoint = IR[1];\n        blackPoint = IR[2];\n        gamma = IR[3];\n        var matrix = IR[4];\n        return new CalRGBCS(whitePoint, blackPoint, gamma, matrix);\n      case 'PatternCS':\n        var basePatternCS = IR[1];\n        if (basePatternCS) {\n          basePatternCS = ColorSpace.fromIR(basePatternCS);\n        }\n        return new PatternCS(basePatternCS);\n      case 'IndexedCS':\n        var baseIndexedCS = IR[1];\n        var hiVal = IR[2];\n        var lookup = IR[3];\n        return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);\n      case 'AlternateCS':\n        var numComps = IR[1];\n        var alt = IR[2];\n        var tintFnIR = IR[3];\n        return new AlternateCS(numComps, ColorSpace.fromIR(alt), _function.PDFFunction.fromIR(tintFnIR));\n      case 'LabCS':\n        whitePoint = IR[1];\n        blackPoint = IR[2];\n        var range = IR[3];\n        return new LabCS(whitePoint, blackPoint, range);\n      default:\n        throw new _util.FormatError('Unknown colorspace name: ' + name);\n    }\n  };\n  ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) {\n    if ((0, _primitives.isName)(cs)) {\n      var colorSpaces = res.get('ColorSpace');\n      if ((0, _primitives.isDict)(colorSpaces)) {\n        var refcs = colorSpaces.get(cs.name);\n        if (refcs) {\n          cs = refcs;\n        }\n      }\n    }\n    cs = xref.fetchIfRef(cs);\n    if ((0, _primitives.isName)(cs)) {\n      switch (cs.name) {\n        case 'DeviceGray':\n        case 'G':\n          return 'DeviceGrayCS';\n        case 'DeviceRGB':\n        case 'RGB':\n          return 'DeviceRgbCS';\n        case 'DeviceCMYK':\n        case 'CMYK':\n          return 'DeviceCmykCS';\n        case 'Pattern':\n          return ['PatternCS', null];\n        default:\n          throw new _util.FormatError('unrecognized colorspace ' + cs.name);\n      }\n    }\n    if ((0, _util.isArray)(cs)) {\n      var mode = xref.fetchIfRef(cs[0]).name;\n      var numComps, params, alt, whitePoint, blackPoint, gamma;\n      switch (mode) {\n        case 'DeviceGray':\n        case 'G':\n          return 'DeviceGrayCS';\n        case 'DeviceRGB':\n        case 'RGB':\n          return 'DeviceRgbCS';\n        case 'DeviceCMYK':\n        case 'CMYK':\n          return 'DeviceCmykCS';\n        case 'CalGray':\n          params = xref.fetchIfRef(cs[1]);\n          whitePoint = params.getArray('WhitePoint');\n          blackPoint = params.getArray('BlackPoint');\n          gamma = params.get('Gamma');\n          return ['CalGrayCS', whitePoint, blackPoint, gamma];\n        case 'CalRGB':\n          params = xref.fetchIfRef(cs[1]);\n          whitePoint = params.getArray('WhitePoint');\n          blackPoint = params.getArray('BlackPoint');\n          gamma = params.getArray('Gamma');\n          var matrix = params.getArray('Matrix');\n          return ['CalRGBCS', whitePoint, blackPoint, gamma, matrix];\n        case 'ICCBased':\n          var stream = xref.fetchIfRef(cs[1]);\n          var dict = stream.dict;\n          numComps = dict.get('N');\n          alt = dict.get('Alternate');\n          if (alt) {\n            var altIR = ColorSpace.parseToIR(alt, xref, res);\n            var altCS = ColorSpace.fromIR(altIR);\n            if (altCS.numComps === numComps) {\n              return altIR;\n            }\n            (0, _util.warn)('ICCBased color space: Ignoring incorrect /Alternate entry.');\n          }\n          if (numComps === 1) {\n            return 'DeviceGrayCS';\n          } else if (numComps === 3) {\n            return 'DeviceRgbCS';\n          } else if (numComps === 4) {\n            return 'DeviceCmykCS';\n          }\n          break;\n        case 'Pattern':\n          var basePatternCS = cs[1] || null;\n          if (basePatternCS) {\n            basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);\n          }\n          return ['PatternCS', basePatternCS];\n        case 'Indexed':\n        case 'I':\n          var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res);\n          var hiVal = xref.fetchIfRef(cs[2]) + 1;\n          var lookup = xref.fetchIfRef(cs[3]);\n          if ((0, _primitives.isStream)(lookup)) {\n            lookup = lookup.getBytes();\n          }\n          return ['IndexedCS', baseIndexedCS, hiVal, lookup];\n        case 'Separation':\n        case 'DeviceN':\n          var name = xref.fetchIfRef(cs[1]);\n          numComps = (0, _util.isArray)(name) ? name.length : 1;\n          alt = ColorSpace.parseToIR(cs[2], xref, res);\n          var tintFnIR = _function.PDFFunction.getIR(xref, xref.fetchIfRef(cs[3]));\n          return ['AlternateCS', numComps, alt, tintFnIR];\n        case 'Lab':\n          params = xref.fetchIfRef(cs[1]);\n          whitePoint = params.getArray('WhitePoint');\n          blackPoint = params.getArray('BlackPoint');\n          var range = params.getArray('Range');\n          return ['LabCS', whitePoint, blackPoint, range];\n        default:\n          throw new _util.FormatError('unimplemented color space object \"' + mode + '\"');\n      }\n    }\n    throw new _util.FormatError('unrecognized color space object: \"' + cs + '\"');\n  };\n  ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) {\n    if (!(0, _util.isArray)(decode)) {\n      return true;\n    }\n    if (n * 2 !== decode.length) {\n      (0, _util.warn)('The decode map is not the correct length');\n      return true;\n    }\n    for (var i = 0, ii = decode.length; i < ii; i += 2) {\n      if (decode[i] !== 0 || decode[i + 1] !== 1) {\n        return false;\n      }\n    }\n    return true;\n  };\n  ColorSpace.singletons = {\n    get gray() {\n      return (0, _util.shadow)(this, 'gray', new DeviceGrayCS());\n    },\n    get rgb() {\n      return (0, _util.shadow)(this, 'rgb', new DeviceRgbCS());\n    },\n    get cmyk() {\n      return (0, _util.shadow)(this, 'cmyk', new DeviceCmykCS());\n    }\n  };\n  return ColorSpace;\n}();\nvar AlternateCS = function AlternateCSClosure() {\n  function AlternateCS(numComps, base, tintFn) {\n    this.name = 'Alternate';\n    this.numComps = numComps;\n    this.defaultColor = new Float32Array(numComps);\n    for (var i = 0; i < numComps; ++i) {\n      this.defaultColor[i] = 1;\n    }\n    this.base = base;\n    this.tintFn = tintFn;\n    this.tmpBuf = new Float32Array(base.numComps);\n  }\n  AlternateCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function AlternateCS_getRgbItem(src, srcOffset, dest, destOffset) {\n      var tmpBuf = this.tmpBuf;\n      this.tintFn(src, srcOffset, tmpBuf, 0);\n      this.base.getRgbItem(tmpBuf, 0, dest, destOffset);\n    },\n    getRgbBuffer: function AlternateCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      var tintFn = this.tintFn;\n      var base = this.base;\n      var scale = 1 / ((1 << bits) - 1);\n      var baseNumComps = base.numComps;\n      var usesZeroToOneRange = base.usesZeroToOneRange;\n      var isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && alpha01 === 0;\n      var pos = isPassthrough ? destOffset : 0;\n      var baseBuf = isPassthrough ? dest : new Uint8Array(baseNumComps * count);\n      var numComps = this.numComps;\n      var scaled = new Float32Array(numComps);\n      var tinted = new Float32Array(baseNumComps);\n      var i, j;\n      for (i = 0; i < count; i++) {\n        for (j = 0; j < numComps; j++) {\n          scaled[j] = src[srcOffset++] * scale;\n        }\n        tintFn(scaled, 0, tinted, 0);\n        if (usesZeroToOneRange) {\n          for (j = 0; j < baseNumComps; j++) {\n            baseBuf[pos++] = tinted[j] * 255;\n          }\n        } else {\n          base.getRgbItem(tinted, 0, baseBuf, pos);\n          pos += baseNumComps;\n        }\n      }\n      if (!isPassthrough) {\n        base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01);\n      }\n    },\n    getOutputLength: function AlternateCS_getOutputLength(inputLength, alpha01) {\n      return this.base.getOutputLength(inputLength * this.base.numComps / this.numComps, alpha01);\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n  return AlternateCS;\n}();\nvar PatternCS = function PatternCSClosure() {\n  function PatternCS(baseCS) {\n    this.name = 'Pattern';\n    this.base = baseCS;\n  }\n  PatternCS.prototype = {};\n  return PatternCS;\n}();\nvar IndexedCS = function IndexedCSClosure() {\n  function IndexedCS(base, highVal, lookup) {\n    this.name = 'Indexed';\n    this.numComps = 1;\n    this.defaultColor = new Uint8Array(this.numComps);\n    this.base = base;\n    this.highVal = highVal;\n    var baseNumComps = base.numComps;\n    var length = baseNumComps * highVal;\n    if ((0, _primitives.isStream)(lookup)) {\n      this.lookup = new Uint8Array(length);\n      var bytes = lookup.getBytes(length);\n      this.lookup.set(bytes);\n    } else if ((0, _util.isString)(lookup)) {\n      this.lookup = new Uint8Array(length);\n      for (var i = 0; i < length; ++i) {\n        this.lookup[i] = lookup.charCodeAt(i);\n      }\n    } else if (lookup instanceof Uint8Array || lookup instanceof Array) {\n      this.lookup = lookup;\n    } else {\n      throw new _util.FormatError('Unrecognized lookup table: ' + lookup);\n    }\n  }\n  IndexedCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function IndexedCS_getRgbItem(src, srcOffset, dest, destOffset) {\n      var numComps = this.base.numComps;\n      var start = src[srcOffset] * numComps;\n      this.base.getRgbBuffer(this.lookup, start, 1, dest, destOffset, 8, 0);\n    },\n    getRgbBuffer: function IndexedCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      var base = this.base;\n      var numComps = base.numComps;\n      var outputDelta = base.getOutputLength(numComps, alpha01);\n      var lookup = this.lookup;\n      for (var i = 0; i < count; ++i) {\n        var lookupPos = src[srcOffset++] * numComps;\n        base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);\n        destOffset += outputDelta;\n      }\n    },\n    getOutputLength: function IndexedCS_getOutputLength(inputLength, alpha01) {\n      return this.base.getOutputLength(inputLength * this.base.numComps, alpha01);\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) {\n      return true;\n    },\n    usesZeroToOneRange: true\n  };\n  return IndexedCS;\n}();\nvar DeviceGrayCS = function DeviceGrayCSClosure() {\n  function DeviceGrayCS() {\n    this.name = 'DeviceGray';\n    this.numComps = 1;\n    this.defaultColor = new Float32Array(this.numComps);\n  }\n  DeviceGrayCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function DeviceGrayCS_getRgbItem(src, srcOffset, dest, destOffset) {\n      var c = src[srcOffset] * 255 | 0;\n      c = c < 0 ? 0 : c > 255 ? 255 : c;\n      dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c;\n    },\n    getRgbBuffer: function DeviceGrayCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      var scale = 255 / ((1 << bits) - 1);\n      var j = srcOffset,\n          q = destOffset;\n      for (var i = 0; i < count; ++i) {\n        var c = scale * src[j++] | 0;\n        dest[q++] = c;\n        dest[q++] = c;\n        dest[q++] = c;\n        q += alpha01;\n      }\n    },\n    getOutputLength: function DeviceGrayCS_getOutputLength(inputLength, alpha01) {\n      return inputLength * (3 + alpha01);\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n  return DeviceGrayCS;\n}();\nvar DeviceRgbCS = function DeviceRgbCSClosure() {\n  function DeviceRgbCS() {\n    this.name = 'DeviceRGB';\n    this.numComps = 3;\n    this.defaultColor = new Float32Array(this.numComps);\n  }\n  DeviceRgbCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function DeviceRgbCS_getRgbItem(src, srcOffset, dest, destOffset) {\n      var r = src[srcOffset] * 255 | 0;\n      var g = src[srcOffset + 1] * 255 | 0;\n      var b = src[srcOffset + 2] * 255 | 0;\n      dest[destOffset] = r < 0 ? 0 : r > 255 ? 255 : r;\n      dest[destOffset + 1] = g < 0 ? 0 : g > 255 ? 255 : g;\n      dest[destOffset + 2] = b < 0 ? 0 : b > 255 ? 255 : b;\n    },\n    getRgbBuffer: function DeviceRgbCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      if (bits === 8 && alpha01 === 0) {\n        dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset);\n        return;\n      }\n      var scale = 255 / ((1 << bits) - 1);\n      var j = srcOffset,\n          q = destOffset;\n      for (var i = 0; i < count; ++i) {\n        dest[q++] = scale * src[j++] | 0;\n        dest[q++] = scale * src[j++] | 0;\n        dest[q++] = scale * src[j++] | 0;\n        q += alpha01;\n      }\n    },\n    getOutputLength: function DeviceRgbCS_getOutputLength(inputLength, alpha01) {\n      return inputLength * (3 + alpha01) / 3 | 0;\n    },\n    isPassthrough: function DeviceRgbCS_isPassthrough(bits) {\n      return bits === 8;\n    },\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n  return DeviceRgbCS;\n}();\nvar DeviceCmykCS = function DeviceCmykCSClosure() {\n  function convertToRgb(src, srcOffset, srcScale, dest, destOffset) {\n    var c = src[srcOffset + 0] * srcScale;\n    var m = src[srcOffset + 1] * srcScale;\n    var y = src[srcOffset + 2] * srcScale;\n    var k = src[srcOffset + 3] * srcScale;\n    var r = c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k + -285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y + -17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) + k * (-21.86122147463605 * k - 189.48180835922747) + 255 | 0;\n    var g = c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k + -79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + k * (-20.737325471181034 * k - 187.80453709719578) + 255 | 0;\n    var b = c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k + -14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k + -193.58209356861505) + k * (-22.33816807309886 * k - 180.12613974708367) + 255 | 0;\n    dest[destOffset] = r > 255 ? 255 : r < 0 ? 0 : r;\n    dest[destOffset + 1] = g > 255 ? 255 : g < 0 ? 0 : g;\n    dest[destOffset + 2] = b > 255 ? 255 : b < 0 ? 0 : b;\n  }\n  function DeviceCmykCS() {\n    this.name = 'DeviceCMYK';\n    this.numComps = 4;\n    this.defaultColor = new Float32Array(this.numComps);\n    this.defaultColor[3] = 1;\n  }\n  DeviceCmykCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function DeviceCmykCS_getRgbItem(src, srcOffset, dest, destOffset) {\n      convertToRgb(src, srcOffset, 1, dest, destOffset);\n    },\n    getRgbBuffer: function DeviceCmykCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      var scale = 1 / ((1 << bits) - 1);\n      for (var i = 0; i < count; i++) {\n        convertToRgb(src, srcOffset, scale, dest, destOffset);\n        srcOffset += 4;\n        destOffset += 3 + alpha01;\n      }\n    },\n    getOutputLength: function DeviceCmykCS_getOutputLength(inputLength, alpha01) {\n      return inputLength / 4 * (3 + alpha01) | 0;\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n  return DeviceCmykCS;\n}();\nvar CalGrayCS = function CalGrayCSClosure() {\n  function CalGrayCS(whitePoint, blackPoint, gamma) {\n    this.name = 'CalGray';\n    this.numComps = 1;\n    this.defaultColor = new Float32Array(this.numComps);\n    if (!whitePoint) {\n      throw new _util.FormatError('WhitePoint missing - required for color space CalGray');\n    }\n    blackPoint = blackPoint || [0, 0, 0];\n    gamma = gamma || 1;\n    this.XW = whitePoint[0];\n    this.YW = whitePoint[1];\n    this.ZW = whitePoint[2];\n    this.XB = blackPoint[0];\n    this.YB = blackPoint[1];\n    this.ZB = blackPoint[2];\n    this.G = gamma;\n    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {\n      throw new _util.FormatError('Invalid WhitePoint components for ' + this.name + ', no fallback available');\n    }\n    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {\n      (0, _util.info)('Invalid BlackPoint for ' + this.name + ', falling back to default');\n      this.XB = this.YB = this.ZB = 0;\n    }\n    if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) {\n      (0, _util.warn)(this.name + ', BlackPoint: XB: ' + this.XB + ', YB: ' + this.YB + ', ZB: ' + this.ZB + ', only default values are supported.');\n    }\n    if (this.G < 1) {\n      (0, _util.info)('Invalid Gamma: ' + this.G + ' for ' + this.name + ', falling back to default');\n      this.G = 1;\n    }\n  }\n  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {\n    var A = src[srcOffset] * scale;\n    var AG = Math.pow(A, cs.G);\n    var L = cs.YW * AG;\n    var val = Math.max(295.8 * Math.pow(L, 0.333333333333333333) - 40.8, 0) | 0;\n    dest[destOffset] = val;\n    dest[destOffset + 1] = val;\n    dest[destOffset + 2] = val;\n  }\n  CalGrayCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset, dest, destOffset) {\n      convertToRgb(this, src, srcOffset, dest, destOffset, 1);\n    },\n    getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      var scale = 1 / ((1 << bits) - 1);\n      for (var i = 0; i < count; ++i) {\n        convertToRgb(this, src, srcOffset, dest, destOffset, scale);\n        srcOffset += 1;\n        destOffset += 3 + alpha01;\n      }\n    },\n    getOutputLength: function CalGrayCS_getOutputLength(inputLength, alpha01) {\n      return inputLength * (3 + alpha01);\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function CalGrayCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n  return CalGrayCS;\n}();\nvar CalRGBCS = function CalRGBCSClosure() {\n  var BRADFORD_SCALE_MATRIX = new Float32Array([0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, -0.0685, 1.0296]);\n  var BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([0.9869929, -0.1470543, 0.1599627, 0.4323053, 0.5183603, 0.0492912, -0.0085287, 0.0400428, 0.9684867]);\n  var SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([3.2404542, -1.5371385, -0.4985314, -0.9692660, 1.8760108, 0.0415560, 0.0556434, -0.2040259, 1.0572252]);\n  var FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]);\n  var tempNormalizeMatrix = new Float32Array(3);\n  var tempConvertMatrix1 = new Float32Array(3);\n  var tempConvertMatrix2 = new Float32Array(3);\n  var DECODE_L_CONSTANT = Math.pow((8 + 16) / 116, 3) / 8.0;\n  function CalRGBCS(whitePoint, blackPoint, gamma, matrix) {\n    this.name = 'CalRGB';\n    this.numComps = 3;\n    this.defaultColor = new Float32Array(this.numComps);\n    if (!whitePoint) {\n      throw new _util.FormatError('WhitePoint missing - required for color space CalRGB');\n    }\n    blackPoint = blackPoint || new Float32Array(3);\n    gamma = gamma || new Float32Array([1, 1, 1]);\n    matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);\n    var XW = whitePoint[0];\n    var YW = whitePoint[1];\n    var ZW = whitePoint[2];\n    this.whitePoint = whitePoint;\n    var XB = blackPoint[0];\n    var YB = blackPoint[1];\n    var ZB = blackPoint[2];\n    this.blackPoint = blackPoint;\n    this.GR = gamma[0];\n    this.GG = gamma[1];\n    this.GB = gamma[2];\n    this.MXA = matrix[0];\n    this.MYA = matrix[1];\n    this.MZA = matrix[2];\n    this.MXB = matrix[3];\n    this.MYB = matrix[4];\n    this.MZB = matrix[5];\n    this.MXC = matrix[6];\n    this.MYC = matrix[7];\n    this.MZC = matrix[8];\n    if (XW < 0 || ZW < 0 || YW !== 1) {\n      throw new _util.FormatError('Invalid WhitePoint components for ' + this.name + ', no fallback available');\n    }\n    if (XB < 0 || YB < 0 || ZB < 0) {\n      (0, _util.info)('Invalid BlackPoint for ' + this.name + ' [' + XB + ', ' + YB + ', ' + ZB + '], falling back to default');\n      this.blackPoint = new Float32Array(3);\n    }\n    if (this.GR < 0 || this.GG < 0 || this.GB < 0) {\n      (0, _util.info)('Invalid Gamma [' + this.GR + ', ' + this.GG + ', ' + this.GB + '] for ' + this.name + ', falling back to default');\n      this.GR = this.GG = this.GB = 1;\n    }\n    if (this.MXA < 0 || this.MYA < 0 || this.MZA < 0 || this.MXB < 0 || this.MYB < 0 || this.MZB < 0 || this.MXC < 0 || this.MYC < 0 || this.MZC < 0) {\n      (0, _util.info)('Invalid Matrix for ' + this.name + ' [' + this.MXA + ', ' + this.MYA + ', ' + this.MZA + this.MXB + ', ' + this.MYB + ', ' + this.MZB + this.MXC + ', ' + this.MYC + ', ' + this.MZC + '], falling back to default');\n      this.MXA = this.MYB = this.MZC = 1;\n      this.MXB = this.MYA = this.MZA = this.MXC = this.MYC = this.MZB = 0;\n    }\n  }\n  function matrixProduct(a, b, result) {\n    result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n    result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2];\n    result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2];\n  }\n  function convertToFlat(sourceWhitePoint, LMS, result) {\n    result[0] = LMS[0] * 1 / sourceWhitePoint[0];\n    result[1] = LMS[1] * 1 / sourceWhitePoint[1];\n    result[2] = LMS[2] * 1 / sourceWhitePoint[2];\n  }\n  function convertToD65(sourceWhitePoint, LMS, result) {\n    var D65X = 0.95047;\n    var D65Y = 1;\n    var D65Z = 1.08883;\n    result[0] = LMS[0] * D65X / sourceWhitePoint[0];\n    result[1] = LMS[1] * D65Y / sourceWhitePoint[1];\n    result[2] = LMS[2] * D65Z / sourceWhitePoint[2];\n  }\n  function sRGBTransferFunction(color) {\n    if (color <= 0.0031308) {\n      return adjustToRange(0, 1, 12.92 * color);\n    }\n    return adjustToRange(0, 1, (1 + 0.055) * Math.pow(color, 1 / 2.4) - 0.055);\n  }\n  function adjustToRange(min, max, value) {\n    return Math.max(min, Math.min(max, value));\n  }\n  function decodeL(L) {\n    if (L < 0) {\n      return -decodeL(-L);\n    }\n    if (L > 8.0) {\n      return Math.pow((L + 16) / 116, 3);\n    }\n    return L * DECODE_L_CONSTANT;\n  }\n  function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) {\n    if (sourceBlackPoint[0] === 0 && sourceBlackPoint[1] === 0 && sourceBlackPoint[2] === 0) {\n      result[0] = XYZ_Flat[0];\n      result[1] = XYZ_Flat[1];\n      result[2] = XYZ_Flat[2];\n      return;\n    }\n    var zeroDecodeL = decodeL(0);\n    var X_DST = zeroDecodeL;\n    var X_SRC = decodeL(sourceBlackPoint[0]);\n    var Y_DST = zeroDecodeL;\n    var Y_SRC = decodeL(sourceBlackPoint[1]);\n    var Z_DST = zeroDecodeL;\n    var Z_SRC = decodeL(sourceBlackPoint[2]);\n    var X_Scale = (1 - X_DST) / (1 - X_SRC);\n    var X_Offset = 1 - X_Scale;\n    var Y_Scale = (1 - Y_DST) / (1 - Y_SRC);\n    var Y_Offset = 1 - Y_Scale;\n    var Z_Scale = (1 - Z_DST) / (1 - Z_SRC);\n    var Z_Offset = 1 - Z_Scale;\n    result[0] = XYZ_Flat[0] * X_Scale + X_Offset;\n    result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset;\n    result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset;\n  }\n  function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) {\n    if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) {\n      result[0] = XYZ_In[0];\n      result[1] = XYZ_In[1];\n      result[2] = XYZ_In[2];\n      return;\n    }\n    var LMS = result;\n    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);\n    var LMS_Flat = tempNormalizeMatrix;\n    convertToFlat(sourceWhitePoint, LMS, LMS_Flat);\n    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result);\n  }\n  function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) {\n    var LMS = result;\n    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);\n    var LMS_D65 = tempNormalizeMatrix;\n    convertToD65(sourceWhitePoint, LMS, LMS_D65);\n    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result);\n  }\n  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {\n    var A = adjustToRange(0, 1, src[srcOffset] * scale);\n    var B = adjustToRange(0, 1, src[srcOffset + 1] * scale);\n    var C = adjustToRange(0, 1, src[srcOffset + 2] * scale);\n    var AGR = Math.pow(A, cs.GR);\n    var BGG = Math.pow(B, cs.GG);\n    var CGB = Math.pow(C, cs.GB);\n    var X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB;\n    var Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB;\n    var Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB;\n    var XYZ = tempConvertMatrix1;\n    XYZ[0] = X;\n    XYZ[1] = Y;\n    XYZ[2] = Z;\n    var XYZ_Flat = tempConvertMatrix2;\n    normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat);\n    var XYZ_Black = tempConvertMatrix1;\n    compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black);\n    var XYZ_D65 = tempConvertMatrix2;\n    normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65);\n    var SRGB = tempConvertMatrix1;\n    matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB);\n    var sR = sRGBTransferFunction(SRGB[0]);\n    var sG = sRGBTransferFunction(SRGB[1]);\n    var sB = sRGBTransferFunction(SRGB[2]);\n    dest[destOffset] = Math.round(sR * 255);\n    dest[destOffset + 1] = Math.round(sG * 255);\n    dest[destOffset + 2] = Math.round(sB * 255);\n  }\n  CalRGBCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function CalRGBCS_getRgbItem(src, srcOffset, dest, destOffset) {\n      convertToRgb(this, src, srcOffset, dest, destOffset, 1);\n    },\n    getRgbBuffer: function CalRGBCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      var scale = 1 / ((1 << bits) - 1);\n      for (var i = 0; i < count; ++i) {\n        convertToRgb(this, src, srcOffset, dest, destOffset, scale);\n        srcOffset += 3;\n        destOffset += 3 + alpha01;\n      }\n    },\n    getOutputLength: function CalRGBCS_getOutputLength(inputLength, alpha01) {\n      return inputLength * (3 + alpha01) / 3 | 0;\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function CalRGBCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n  return CalRGBCS;\n}();\nvar LabCS = function LabCSClosure() {\n  function LabCS(whitePoint, blackPoint, range) {\n    this.name = 'Lab';\n    this.numComps = 3;\n    this.defaultColor = new Float32Array(this.numComps);\n    if (!whitePoint) {\n      throw new _util.FormatError('WhitePoint missing - required for color space Lab');\n    }\n    blackPoint = blackPoint || [0, 0, 0];\n    range = range || [-100, 100, -100, 100];\n    this.XW = whitePoint[0];\n    this.YW = whitePoint[1];\n    this.ZW = whitePoint[2];\n    this.amin = range[0];\n    this.amax = range[1];\n    this.bmin = range[2];\n    this.bmax = range[3];\n    this.XB = blackPoint[0];\n    this.YB = blackPoint[1];\n    this.ZB = blackPoint[2];\n    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {\n      throw new _util.FormatError('Invalid WhitePoint components, no fallback available');\n    }\n    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {\n      (0, _util.info)('Invalid BlackPoint, falling back to default');\n      this.XB = this.YB = this.ZB = 0;\n    }\n    if (this.amin > this.amax || this.bmin > this.bmax) {\n      (0, _util.info)('Invalid Range, falling back to defaults');\n      this.amin = -100;\n      this.amax = 100;\n      this.bmin = -100;\n      this.bmax = 100;\n    }\n  }\n  function fn_g(x) {\n    var result;\n    if (x >= 6 / 29) {\n      result = x * x * x;\n    } else {\n      result = 108 / 841 * (x - 4 / 29);\n    }\n    return result;\n  }\n  function decode(value, high1, low2, high2) {\n    return low2 + value * (high2 - low2) / high1;\n  }\n  function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) {\n    var Ls = src[srcOffset];\n    var as = src[srcOffset + 1];\n    var bs = src[srcOffset + 2];\n    if (maxVal !== false) {\n      Ls = decode(Ls, maxVal, 0, 100);\n      as = decode(as, maxVal, cs.amin, cs.amax);\n      bs = decode(bs, maxVal, cs.bmin, cs.bmax);\n    }\n    as = as > cs.amax ? cs.amax : as < cs.amin ? cs.amin : as;\n    bs = bs > cs.bmax ? cs.bmax : bs < cs.bmin ? cs.bmin : bs;\n    var M = (Ls + 16) / 116;\n    var L = M + as / 500;\n    var N = M - bs / 200;\n    var X = cs.XW * fn_g(L);\n    var Y = cs.YW * fn_g(M);\n    var Z = cs.ZW * fn_g(N);\n    var r, g, b;\n    if (cs.ZW < 1) {\n      r = X * 3.1339 + Y * -1.6170 + Z * -0.4906;\n      g = X * -0.9785 + Y * 1.9160 + Z * 0.0333;\n      b = X * 0.0720 + Y * -0.2290 + Z * 1.4057;\n    } else {\n      r = X * 3.2406 + Y * -1.5372 + Z * -0.4986;\n      g = X * -0.9689 + Y * 1.8758 + Z * 0.0415;\n      b = X * 0.0557 + Y * -0.2040 + Z * 1.0570;\n    }\n    dest[destOffset] = r <= 0 ? 0 : r >= 1 ? 255 : Math.sqrt(r) * 255 | 0;\n    dest[destOffset + 1] = g <= 0 ? 0 : g >= 1 ? 255 : Math.sqrt(g) * 255 | 0;\n    dest[destOffset + 2] = b <= 0 ? 0 : b >= 1 ? 255 : Math.sqrt(b) * 255 | 0;\n  }\n  LabCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function LabCS_getRgbItem(src, srcOffset, dest, destOffset) {\n      convertToRgb(this, src, srcOffset, false, dest, destOffset);\n    },\n    getRgbBuffer: function LabCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      var maxVal = (1 << bits) - 1;\n      for (var i = 0; i < count; i++) {\n        convertToRgb(this, src, srcOffset, maxVal, dest, destOffset);\n        srcOffset += 3;\n        destOffset += 3 + alpha01;\n      }\n    },\n    getOutputLength: function LabCS_getOutputLength(inputLength, alpha01) {\n      return inputLength * (3 + alpha01) / 3 | 0;\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) {\n      return true;\n    },\n    usesZeroToOneRange: false\n  };\n  return LabCS;\n}();\nexports.ColorSpace = ColorSpace;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar ExpertEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', '', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior', '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '', 'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall'];\nvar MacExpertEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '', 'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter', 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '', 'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall', 'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall', 'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall', 'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '', 'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior', 'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior', 'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior', 'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '', 'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior', 'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall', 'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '', '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '', 'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior', 'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior', '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall', 'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior', 'periodsuperior', 'Dotaccentsmall', 'Ringsmall'];\nvar MacRomanEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', 'space', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron'];\nvar StandardEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl', 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla', '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '', '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae', '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'];\nvar WinAnsiEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron', 'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft', 'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash', 'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet', 'zcaron', 'Ydieresis', 'space', 'exclamdown', 'cent', 'sterling', 'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered', 'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute', 'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters', 'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis', 'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve', 'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn', 'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis', 'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis', 'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve', 'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash', 'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn', 'ydieresis'];\nvar SymbolSetEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent', 'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus', 'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi', 'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa', 'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau', 'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft', 'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex', 'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota', 'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho', 'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta', 'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal', 'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade', 'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree', 'plusminus', 'second', 'greaterequal', 'multiply', 'proportional', 'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence', 'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn', 'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply', 'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset', 'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element', 'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif', 'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot', 'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup', 'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans', 'copyrightsans', 'trademarksans', 'summation', 'parenlefttp', 'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex', 'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex', '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt', 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp', 'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid', 'bracerightbt'];\nvar ZapfDingbatsEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117', 'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19', 'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7', 'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36', 'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46', 'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56', 'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66', 'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75', 'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97', 'a98', 'a99', 'a100', '', 'a89', 'a90', 'a93', 'a94', 'a91', 'a92', 'a205', 'a85', 'a206', 'a86', 'a87', 'a88', 'a95', 'a96', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'a101', 'a102', 'a103', 'a104', 'a106', 'a107', 'a108', 'a112', 'a111', 'a110', 'a109', 'a120', 'a121', 'a122', 'a123', 'a124', 'a125', 'a126', 'a127', 'a128', 'a129', 'a130', 'a131', 'a132', 'a133', 'a134', 'a135', 'a136', 'a137', 'a138', 'a139', 'a140', 'a141', 'a142', 'a143', 'a144', 'a145', 'a146', 'a147', 'a148', 'a149', 'a150', 'a151', 'a152', 'a153', 'a154', 'a155', 'a156', 'a157', 'a158', 'a159', 'a160', 'a161', 'a163', 'a164', 'a196', 'a165', 'a192', 'a166', 'a167', 'a168', 'a169', 'a170', 'a171', 'a172', 'a173', 'a162', 'a174', 'a175', 'a176', 'a177', 'a178', 'a179', 'a193', 'a180', 'a199', 'a181', 'a200', 'a182', '', 'a201', 'a183', 'a184', 'a197', 'a185', 'a194', 'a198', 'a186', 'a195', 'a187', 'a188', 'a189', 'a190', 'a191'];\nfunction getEncoding(encodingName) {\n  switch (encodingName) {\n    case 'WinAnsiEncoding':\n      return WinAnsiEncoding;\n    case 'StandardEncoding':\n      return StandardEncoding;\n    case 'MacRomanEncoding':\n      return MacRomanEncoding;\n    case 'SymbolSetEncoding':\n      return SymbolSetEncoding;\n    case 'ZapfDingbatsEncoding':\n      return ZapfDingbatsEncoding;\n    case 'ExpertEncoding':\n      return ExpertEncoding;\n    case 'MacExpertEncoding':\n      return MacExpertEncoding;\n    default:\n      return null;\n  }\n}\nexports.WinAnsiEncoding = WinAnsiEncoding;\nexports.StandardEncoding = StandardEncoding;\nexports.MacRomanEncoding = MacRomanEncoding;\nexports.SymbolSetEncoding = SymbolSetEncoding;\nexports.ZapfDingbatsEncoding = ZapfDingbatsEncoding;\nexports.ExpertEncoding = ExpertEncoding;\nexports.getEncoding = getEncoding;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Parser = exports.Linearization = exports.Lexer = undefined;\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar MAX_LENGTH_TO_CACHE = 1000;\nvar Parser = function ParserClosure() {\n  function Parser(lexer, allowStreams, xref, recoveryMode) {\n    this.lexer = lexer;\n    this.allowStreams = allowStreams;\n    this.xref = xref;\n    this.recoveryMode = recoveryMode || false;\n    this.imageCache = Object.create(null);\n    this.refill();\n  }\n  Parser.prototype = {\n    refill: function Parser_refill() {\n      this.buf1 = this.lexer.getObj();\n      this.buf2 = this.lexer.getObj();\n    },\n    shift: function Parser_shift() {\n      if ((0, _primitives.isCmd)(this.buf2, 'ID')) {\n        this.buf1 = this.buf2;\n        this.buf2 = null;\n      } else {\n        this.buf1 = this.buf2;\n        this.buf2 = this.lexer.getObj();\n      }\n    },\n    tryShift: function Parser_tryShift() {\n      try {\n        this.shift();\n        return true;\n      } catch (e) {\n        if (e instanceof _util.MissingDataException) {\n          throw e;\n        }\n        return false;\n      }\n    },\n    getObj: function Parser_getObj(cipherTransform) {\n      var buf1 = this.buf1;\n      this.shift();\n      if (buf1 instanceof _primitives.Cmd) {\n        switch (buf1.cmd) {\n          case 'BI':\n            return this.makeInlineImage(cipherTransform);\n          case '[':\n            var array = [];\n            while (!(0, _primitives.isCmd)(this.buf1, ']') && !(0, _primitives.isEOF)(this.buf1)) {\n              array.push(this.getObj(cipherTransform));\n            }\n            if ((0, _primitives.isEOF)(this.buf1)) {\n              if (!this.recoveryMode) {\n                throw new _util.FormatError('End of file inside array');\n              }\n              return array;\n            }\n            this.shift();\n            return array;\n          case '<<':\n            var dict = new _primitives.Dict(this.xref);\n            while (!(0, _primitives.isCmd)(this.buf1, '>>') && !(0, _primitives.isEOF)(this.buf1)) {\n              if (!(0, _primitives.isName)(this.buf1)) {\n                (0, _util.info)('Malformed dictionary: key must be a name object');\n                this.shift();\n                continue;\n              }\n              var key = this.buf1.name;\n              this.shift();\n              if ((0, _primitives.isEOF)(this.buf1)) {\n                break;\n              }\n              dict.set(key, this.getObj(cipherTransform));\n            }\n            if ((0, _primitives.isEOF)(this.buf1)) {\n              if (!this.recoveryMode) {\n                throw new _util.FormatError('End of file inside dictionary');\n              }\n              return dict;\n            }\n            if ((0, _primitives.isCmd)(this.buf2, 'stream')) {\n              return this.allowStreams ? this.makeStream(dict, cipherTransform) : dict;\n            }\n            this.shift();\n            return dict;\n          default:\n            return buf1;\n        }\n      }\n      if ((0, _util.isInt)(buf1)) {\n        var num = buf1;\n        if ((0, _util.isInt)(this.buf1) && (0, _primitives.isCmd)(this.buf2, 'R')) {\n          var ref = new _primitives.Ref(num, this.buf1);\n          this.shift();\n          this.shift();\n          return ref;\n        }\n        return num;\n      }\n      if ((0, _util.isString)(buf1)) {\n        var str = buf1;\n        if (cipherTransform) {\n          str = cipherTransform.decryptString(str);\n        }\n        return str;\n      }\n      return buf1;\n    },\n    findDefaultInlineStreamEnd: function Parser_findDefaultInlineStreamEnd(stream) {\n      var E = 0x45,\n          I = 0x49,\n          SPACE = 0x20,\n          LF = 0xA,\n          CR = 0xD;\n      var startPos = stream.pos,\n          state = 0,\n          ch,\n          i,\n          n,\n          followingBytes;\n      while ((ch = stream.getByte()) !== -1) {\n        if (state === 0) {\n          state = ch === E ? 1 : 0;\n        } else if (state === 1) {\n          state = ch === I ? 2 : 0;\n        } else {\n          (0, _util.assert)(state === 2);\n          if (ch === SPACE || ch === LF || ch === CR) {\n            n = 5;\n            followingBytes = stream.peekBytes(n);\n            for (i = 0; i < n; i++) {\n              ch = followingBytes[i];\n              if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7F)) {\n                state = 0;\n                break;\n              }\n            }\n            if (state === 2) {\n              break;\n            }\n          } else {\n            state = 0;\n          }\n        }\n      }\n      return stream.pos - 4 - startPos;\n    },\n    findDCTDecodeInlineStreamEnd: function Parser_findDCTDecodeInlineStreamEnd(stream) {\n      var startPos = stream.pos,\n          foundEOI = false,\n          b,\n          markerLength,\n          length;\n      while ((b = stream.getByte()) !== -1) {\n        if (b !== 0xFF) {\n          continue;\n        }\n        switch (stream.getByte()) {\n          case 0x00:\n            break;\n          case 0xFF:\n            stream.skip(-1);\n            break;\n          case 0xD9:\n            foundEOI = true;\n            break;\n          case 0xC0:\n          case 0xC1:\n          case 0xC2:\n          case 0xC3:\n          case 0xC5:\n          case 0xC6:\n          case 0xC7:\n          case 0xC9:\n          case 0xCA:\n          case 0xCB:\n          case 0xCD:\n          case 0xCE:\n          case 0xCF:\n          case 0xC4:\n          case 0xCC:\n          case 0xDA:\n          case 0xDB:\n          case 0xDC:\n          case 0xDD:\n          case 0xDE:\n          case 0xDF:\n          case 0xE0:\n          case 0xE1:\n          case 0xE2:\n          case 0xE3:\n          case 0xE4:\n          case 0xE5:\n          case 0xE6:\n          case 0xE7:\n          case 0xE8:\n          case 0xE9:\n          case 0xEA:\n          case 0xEB:\n          case 0xEC:\n          case 0xED:\n          case 0xEE:\n          case 0xEF:\n          case 0xFE:\n            markerLength = stream.getUint16();\n            if (markerLength > 2) {\n              stream.skip(markerLength - 2);\n            } else {\n              stream.skip(-2);\n            }\n            break;\n        }\n        if (foundEOI) {\n          break;\n        }\n      }\n      length = stream.pos - startPos;\n      if (b === -1) {\n        (0, _util.warn)('Inline DCTDecode image stream: ' + 'EOI marker not found, searching for /EI/ instead.');\n        stream.skip(-length);\n        return this.findDefaultInlineStreamEnd(stream);\n      }\n      this.inlineStreamSkipEI(stream);\n      return length;\n    },\n    findASCII85DecodeInlineStreamEnd: function Parser_findASCII85DecodeInlineStreamEnd(stream) {\n      var TILDE = 0x7E,\n          GT = 0x3E;\n      var startPos = stream.pos,\n          ch,\n          length;\n      while ((ch = stream.getByte()) !== -1) {\n        if (ch === TILDE && stream.peekByte() === GT) {\n          stream.skip();\n          break;\n        }\n      }\n      length = stream.pos - startPos;\n      if (ch === -1) {\n        (0, _util.warn)('Inline ASCII85Decode image stream: ' + 'EOD marker not found, searching for /EI/ instead.');\n        stream.skip(-length);\n        return this.findDefaultInlineStreamEnd(stream);\n      }\n      this.inlineStreamSkipEI(stream);\n      return length;\n    },\n    findASCIIHexDecodeInlineStreamEnd: function Parser_findASCIIHexDecodeInlineStreamEnd(stream) {\n      var GT = 0x3E;\n      var startPos = stream.pos,\n          ch,\n          length;\n      while ((ch = stream.getByte()) !== -1) {\n        if (ch === GT) {\n          break;\n        }\n      }\n      length = stream.pos - startPos;\n      if (ch === -1) {\n        (0, _util.warn)('Inline ASCIIHexDecode image stream: ' + 'EOD marker not found, searching for /EI/ instead.');\n        stream.skip(-length);\n        return this.findDefaultInlineStreamEnd(stream);\n      }\n      this.inlineStreamSkipEI(stream);\n      return length;\n    },\n    inlineStreamSkipEI: function Parser_inlineStreamSkipEI(stream) {\n      var E = 0x45,\n          I = 0x49;\n      var state = 0,\n          ch;\n      while ((ch = stream.getByte()) !== -1) {\n        if (state === 0) {\n          state = ch === E ? 1 : 0;\n        } else if (state === 1) {\n          state = ch === I ? 2 : 0;\n        } else if (state === 2) {\n          break;\n        }\n      }\n    },\n    makeInlineImage: function Parser_makeInlineImage(cipherTransform) {\n      var lexer = this.lexer;\n      var stream = lexer.stream;\n      var dict = new _primitives.Dict(this.xref);\n      while (!(0, _primitives.isCmd)(this.buf1, 'ID') && !(0, _primitives.isEOF)(this.buf1)) {\n        if (!(0, _primitives.isName)(this.buf1)) {\n          throw new _util.FormatError('Dictionary key must be a name object');\n        }\n        var key = this.buf1.name;\n        this.shift();\n        if ((0, _primitives.isEOF)(this.buf1)) {\n          break;\n        }\n        dict.set(key, this.getObj(cipherTransform));\n      }\n      var filter = dict.get('Filter', 'F'),\n          filterName;\n      if ((0, _primitives.isName)(filter)) {\n        filterName = filter.name;\n      } else if ((0, _util.isArray)(filter)) {\n        var filterZero = this.xref.fetchIfRef(filter[0]);\n        if ((0, _primitives.isName)(filterZero)) {\n          filterName = filterZero.name;\n        }\n      }\n      var startPos = stream.pos,\n          length,\n          i,\n          ii;\n      if (filterName === 'DCTDecode' || filterName === 'DCT') {\n        length = this.findDCTDecodeInlineStreamEnd(stream);\n      } else if (filterName === 'ASCII85Decode' || filterName === 'A85') {\n        length = this.findASCII85DecodeInlineStreamEnd(stream);\n      } else if (filterName === 'ASCIIHexDecode' || filterName === 'AHx') {\n        length = this.findASCIIHexDecodeInlineStreamEnd(stream);\n      } else {\n        length = this.findDefaultInlineStreamEnd(stream);\n      }\n      var imageStream = stream.makeSubStream(startPos, length, dict);\n      var adler32;\n      if (length < MAX_LENGTH_TO_CACHE) {\n        var imageBytes = imageStream.getBytes();\n        imageStream.reset();\n        var a = 1;\n        var b = 0;\n        for (i = 0, ii = imageBytes.length; i < ii; ++i) {\n          a += imageBytes[i] & 0xff;\n          b += a;\n        }\n        adler32 = b % 65521 << 16 | a % 65521;\n        if (this.imageCache.adler32 === adler32) {\n          this.buf2 = _primitives.Cmd.get('EI');\n          this.shift();\n          this.imageCache[adler32].reset();\n          return this.imageCache[adler32];\n        }\n      }\n      if (cipherTransform) {\n        imageStream = cipherTransform.createStream(imageStream, length);\n      }\n      imageStream = this.filter(imageStream, dict, length);\n      imageStream.dict = dict;\n      if (adler32 !== undefined) {\n        imageStream.cacheKey = 'inline_' + length + '_' + adler32;\n        this.imageCache[adler32] = imageStream;\n      }\n      this.buf2 = _primitives.Cmd.get('EI');\n      this.shift();\n      return imageStream;\n    },\n    makeStream: function Parser_makeStream(dict, cipherTransform) {\n      var lexer = this.lexer;\n      var stream = lexer.stream;\n      lexer.skipToNextLine();\n      var pos = stream.pos - 1;\n      var length = dict.get('Length');\n      if (!(0, _util.isInt)(length)) {\n        (0, _util.info)('Bad ' + length + ' attribute in stream');\n        length = 0;\n      }\n      stream.pos = pos + length;\n      lexer.nextChar();\n      if (this.tryShift() && (0, _primitives.isCmd)(this.buf2, 'endstream')) {\n        this.shift();\n      } else {\n        stream.pos = pos;\n        var SCAN_BLOCK_SIZE = 2048;\n        var ENDSTREAM_SIGNATURE_LENGTH = 9;\n        var ENDSTREAM_SIGNATURE = [0x65, 0x6E, 0x64, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6D];\n        var skipped = 0,\n            found = false,\n            i,\n            j;\n        while (stream.pos < stream.end) {\n          var scanBytes = stream.peekBytes(SCAN_BLOCK_SIZE);\n          var scanLength = scanBytes.length - ENDSTREAM_SIGNATURE_LENGTH;\n          if (scanLength <= 0) {\n            break;\n          }\n          found = false;\n          i = 0;\n          while (i < scanLength) {\n            j = 0;\n            while (j < ENDSTREAM_SIGNATURE_LENGTH && scanBytes[i + j] === ENDSTREAM_SIGNATURE[j]) {\n              j++;\n            }\n            if (j >= ENDSTREAM_SIGNATURE_LENGTH) {\n              found = true;\n              break;\n            }\n            i++;\n          }\n          if (found) {\n            skipped += i;\n            stream.pos += i;\n            break;\n          }\n          skipped += scanLength;\n          stream.pos += scanLength;\n        }\n        if (!found) {\n          throw new _util.FormatError('Missing endstream');\n        }\n        length = skipped;\n        lexer.nextChar();\n        this.shift();\n        this.shift();\n      }\n      this.shift();\n      stream = stream.makeSubStream(pos, length, dict);\n      if (cipherTransform) {\n        stream = cipherTransform.createStream(stream, length);\n      }\n      stream = this.filter(stream, dict, length);\n      stream.dict = dict;\n      return stream;\n    },\n    filter: function Parser_filter(stream, dict, length) {\n      var filter = dict.get('Filter', 'F');\n      var params = dict.get('DecodeParms', 'DP');\n      if ((0, _primitives.isName)(filter)) {\n        if ((0, _util.isArray)(params)) {\n          params = this.xref.fetchIfRef(params[0]);\n        }\n        return this.makeFilter(stream, filter.name, length, params);\n      }\n      var maybeLength = length;\n      if ((0, _util.isArray)(filter)) {\n        var filterArray = filter;\n        var paramsArray = params;\n        for (var i = 0, ii = filterArray.length; i < ii; ++i) {\n          filter = this.xref.fetchIfRef(filterArray[i]);\n          if (!(0, _primitives.isName)(filter)) {\n            throw new _util.FormatError('Bad filter name: ' + filter);\n          }\n          params = null;\n          if ((0, _util.isArray)(paramsArray) && i in paramsArray) {\n            params = this.xref.fetchIfRef(paramsArray[i]);\n          }\n          stream = this.makeFilter(stream, filter.name, maybeLength, params);\n          maybeLength = null;\n        }\n      }\n      return stream;\n    },\n    makeFilter: function Parser_makeFilter(stream, name, maybeLength, params) {\n      if (maybeLength === 0) {\n        (0, _util.warn)('Empty \"' + name + '\" stream.');\n        return new _stream.NullStream(stream);\n      }\n      try {\n        var xrefStreamStats = this.xref.stats.streamTypes;\n        if (name === 'FlateDecode' || name === 'Fl') {\n          xrefStreamStats[_util.StreamType.FLATE] = true;\n          if (params) {\n            return new _stream.PredictorStream(new _stream.FlateStream(stream, maybeLength), maybeLength, params);\n          }\n          return new _stream.FlateStream(stream, maybeLength);\n        }\n        if (name === 'LZWDecode' || name === 'LZW') {\n          xrefStreamStats[_util.StreamType.LZW] = true;\n          var earlyChange = 1;\n          if (params) {\n            if (params.has('EarlyChange')) {\n              earlyChange = params.get('EarlyChange');\n            }\n            return new _stream.PredictorStream(new _stream.LZWStream(stream, maybeLength, earlyChange), maybeLength, params);\n          }\n          return new _stream.LZWStream(stream, maybeLength, earlyChange);\n        }\n        if (name === 'DCTDecode' || name === 'DCT') {\n          xrefStreamStats[_util.StreamType.DCT] = true;\n          return new _stream.JpegStream(stream, maybeLength, stream.dict, params);\n        }\n        if (name === 'JPXDecode' || name === 'JPX') {\n          xrefStreamStats[_util.StreamType.JPX] = true;\n          return new _stream.JpxStream(stream, maybeLength, stream.dict, params);\n        }\n        if (name === 'ASCII85Decode' || name === 'A85') {\n          xrefStreamStats[_util.StreamType.A85] = true;\n          return new _stream.Ascii85Stream(stream, maybeLength);\n        }\n        if (name === 'ASCIIHexDecode' || name === 'AHx') {\n          xrefStreamStats[_util.StreamType.AHX] = true;\n          return new _stream.AsciiHexStream(stream, maybeLength);\n        }\n        if (name === 'CCITTFaxDecode' || name === 'CCF') {\n          xrefStreamStats[_util.StreamType.CCF] = true;\n          return new _stream.CCITTFaxStream(stream, maybeLength, params);\n        }\n        if (name === 'RunLengthDecode' || name === 'RL') {\n          xrefStreamStats[_util.StreamType.RL] = true;\n          return new _stream.RunLengthStream(stream, maybeLength);\n        }\n        if (name === 'JBIG2Decode') {\n          xrefStreamStats[_util.StreamType.JBIG] = true;\n          return new _stream.Jbig2Stream(stream, maybeLength, stream.dict, params);\n        }\n        (0, _util.warn)('filter \"' + name + '\" not supported yet');\n        return stream;\n      } catch (ex) {\n        if (ex instanceof _util.MissingDataException) {\n          throw ex;\n        }\n        (0, _util.warn)('Invalid stream: \\\"' + ex + '\\\"');\n        return new _stream.NullStream(stream);\n      }\n    }\n  };\n  return Parser;\n}();\nvar Lexer = function LexerClosure() {\n  function Lexer(stream, knownCommands) {\n    this.stream = stream;\n    this.nextChar();\n    this.strBuf = [];\n    this.knownCommands = knownCommands;\n  }\n  var specialChars = [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n  function toHexDigit(ch) {\n    if (ch >= 0x30 && ch <= 0x39) {\n      return ch & 0x0F;\n    }\n    if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {\n      return (ch & 0x0F) + 9;\n    }\n    return -1;\n  }\n  Lexer.prototype = {\n    nextChar: function Lexer_nextChar() {\n      return this.currentChar = this.stream.getByte();\n    },\n    peekChar: function Lexer_peekChar() {\n      return this.stream.peekByte();\n    },\n    getNumber: function Lexer_getNumber() {\n      var ch = this.currentChar;\n      var eNotation = false;\n      var divideBy = 0;\n      var sign = 1;\n      if (ch === 0x2D) {\n        sign = -1;\n        ch = this.nextChar();\n        if (ch === 0x2D) {\n          ch = this.nextChar();\n        }\n      } else if (ch === 0x2B) {\n        ch = this.nextChar();\n      }\n      if (ch === 0x2E) {\n        divideBy = 10;\n        ch = this.nextChar();\n      }\n      if (ch === 0x0A || ch === 0x0D) {\n        do {\n          ch = this.nextChar();\n        } while (ch === 0x0A || ch === 0x0D);\n      }\n      if (ch < 0x30 || ch > 0x39) {\n        throw new _util.FormatError('Invalid number: ' + String.fromCharCode(ch) + ' (charCode ' + ch + ')');\n      }\n      var baseValue = ch - 0x30;\n      var powerValue = 0;\n      var powerValueSign = 1;\n      while ((ch = this.nextChar()) >= 0) {\n        if (0x30 <= ch && ch <= 0x39) {\n          var currentDigit = ch - 0x30;\n          if (eNotation) {\n            powerValue = powerValue * 10 + currentDigit;\n          } else {\n            if (divideBy !== 0) {\n              divideBy *= 10;\n            }\n            baseValue = baseValue * 10 + currentDigit;\n          }\n        } else if (ch === 0x2E) {\n          if (divideBy === 0) {\n            divideBy = 1;\n          } else {\n            break;\n          }\n        } else if (ch === 0x2D) {\n          (0, _util.warn)('Badly formatted number');\n        } else if (ch === 0x45 || ch === 0x65) {\n          ch = this.peekChar();\n          if (ch === 0x2B || ch === 0x2D) {\n            powerValueSign = ch === 0x2D ? -1 : 1;\n            this.nextChar();\n          } else if (ch < 0x30 || ch > 0x39) {\n            break;\n          }\n          eNotation = true;\n        } else {\n          break;\n        }\n      }\n      if (divideBy !== 0) {\n        baseValue /= divideBy;\n      }\n      if (eNotation) {\n        baseValue *= Math.pow(10, powerValueSign * powerValue);\n      }\n      return sign * baseValue;\n    },\n    getString: function Lexer_getString() {\n      var numParen = 1;\n      var done = false;\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      var ch = this.nextChar();\n      while (true) {\n        var charBuffered = false;\n        switch (ch | 0) {\n          case -1:\n            (0, _util.warn)('Unterminated string');\n            done = true;\n            break;\n          case 0x28:\n            ++numParen;\n            strBuf.push('(');\n            break;\n          case 0x29:\n            if (--numParen === 0) {\n              this.nextChar();\n              done = true;\n            } else {\n              strBuf.push(')');\n            }\n            break;\n          case 0x5C:\n            ch = this.nextChar();\n            switch (ch) {\n              case -1:\n                (0, _util.warn)('Unterminated string');\n                done = true;\n                break;\n              case 0x6E:\n                strBuf.push('\\n');\n                break;\n              case 0x72:\n                strBuf.push('\\r');\n                break;\n              case 0x74:\n                strBuf.push('\\t');\n                break;\n              case 0x62:\n                strBuf.push('\\b');\n                break;\n              case 0x66:\n                strBuf.push('\\f');\n                break;\n              case 0x5C:\n              case 0x28:\n              case 0x29:\n                strBuf.push(String.fromCharCode(ch));\n                break;\n              case 0x30:\n              case 0x31:\n              case 0x32:\n              case 0x33:\n              case 0x34:\n              case 0x35:\n              case 0x36:\n              case 0x37:\n                var x = ch & 0x0F;\n                ch = this.nextChar();\n                charBuffered = true;\n                if (ch >= 0x30 && ch <= 0x37) {\n                  x = (x << 3) + (ch & 0x0F);\n                  ch = this.nextChar();\n                  if (ch >= 0x30 && ch <= 0x37) {\n                    charBuffered = false;\n                    x = (x << 3) + (ch & 0x0F);\n                  }\n                }\n                strBuf.push(String.fromCharCode(x));\n                break;\n              case 0x0D:\n                if (this.peekChar() === 0x0A) {\n                  this.nextChar();\n                }\n                break;\n              case 0x0A:\n                break;\n              default:\n                strBuf.push(String.fromCharCode(ch));\n                break;\n            }\n            break;\n          default:\n            strBuf.push(String.fromCharCode(ch));\n            break;\n        }\n        if (done) {\n          break;\n        }\n        if (!charBuffered) {\n          ch = this.nextChar();\n        }\n      }\n      return strBuf.join('');\n    },\n    getName: function Lexer_getName() {\n      var ch, previousCh;\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {\n        if (ch === 0x23) {\n          ch = this.nextChar();\n          if (specialChars[ch]) {\n            (0, _util.warn)('Lexer_getName: ' + 'NUMBER SIGN (#) should be followed by a hexadecimal number.');\n            strBuf.push('#');\n            break;\n          }\n          var x = toHexDigit(ch);\n          if (x !== -1) {\n            previousCh = ch;\n            ch = this.nextChar();\n            var x2 = toHexDigit(ch);\n            if (x2 === -1) {\n              (0, _util.warn)('Lexer_getName: Illegal digit (' + String.fromCharCode(ch) + ') in hexadecimal number.');\n              strBuf.push('#', String.fromCharCode(previousCh));\n              if (specialChars[ch]) {\n                break;\n              }\n              strBuf.push(String.fromCharCode(ch));\n              continue;\n            }\n            strBuf.push(String.fromCharCode(x << 4 | x2));\n          } else {\n            strBuf.push('#', String.fromCharCode(ch));\n          }\n        } else {\n          strBuf.push(String.fromCharCode(ch));\n        }\n      }\n      if (strBuf.length > 127) {\n        (0, _util.warn)('name token is longer than allowed by the spec: ' + strBuf.length);\n      }\n      return _primitives.Name.get(strBuf.join(''));\n    },\n    getHexString: function Lexer_getHexString() {\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      var ch = this.currentChar;\n      var isFirstHex = true;\n      var firstDigit;\n      var secondDigit;\n      while (true) {\n        if (ch < 0) {\n          (0, _util.warn)('Unterminated hex string');\n          break;\n        } else if (ch === 0x3E) {\n          this.nextChar();\n          break;\n        } else if (specialChars[ch] === 1) {\n          ch = this.nextChar();\n          continue;\n        } else {\n          if (isFirstHex) {\n            firstDigit = toHexDigit(ch);\n            if (firstDigit === -1) {\n              (0, _util.warn)('Ignoring invalid character \"' + ch + '\" in hex string');\n              ch = this.nextChar();\n              continue;\n            }\n          } else {\n            secondDigit = toHexDigit(ch);\n            if (secondDigit === -1) {\n              (0, _util.warn)('Ignoring invalid character \"' + ch + '\" in hex string');\n              ch = this.nextChar();\n              continue;\n            }\n            strBuf.push(String.fromCharCode(firstDigit << 4 | secondDigit));\n          }\n          isFirstHex = !isFirstHex;\n          ch = this.nextChar();\n        }\n      }\n      return strBuf.join('');\n    },\n    getObj: function Lexer_getObj() {\n      var comment = false;\n      var ch = this.currentChar;\n      while (true) {\n        if (ch < 0) {\n          return _primitives.EOF;\n        }\n        if (comment) {\n          if (ch === 0x0A || ch === 0x0D) {\n            comment = false;\n          }\n        } else if (ch === 0x25) {\n          comment = true;\n        } else if (specialChars[ch] !== 1) {\n          break;\n        }\n        ch = this.nextChar();\n      }\n      switch (ch | 0) {\n        case 0x30:\n        case 0x31:\n        case 0x32:\n        case 0x33:\n        case 0x34:\n        case 0x35:\n        case 0x36:\n        case 0x37:\n        case 0x38:\n        case 0x39:\n        case 0x2B:\n        case 0x2D:\n        case 0x2E:\n          return this.getNumber();\n        case 0x28:\n          return this.getString();\n        case 0x2F:\n          return this.getName();\n        case 0x5B:\n          this.nextChar();\n          return _primitives.Cmd.get('[');\n        case 0x5D:\n          this.nextChar();\n          return _primitives.Cmd.get(']');\n        case 0x3C:\n          ch = this.nextChar();\n          if (ch === 0x3C) {\n            this.nextChar();\n            return _primitives.Cmd.get('<<');\n          }\n          return this.getHexString();\n        case 0x3E:\n          ch = this.nextChar();\n          if (ch === 0x3E) {\n            this.nextChar();\n            return _primitives.Cmd.get('>>');\n          }\n          return _primitives.Cmd.get('>');\n        case 0x7B:\n          this.nextChar();\n          return _primitives.Cmd.get('{');\n        case 0x7D:\n          this.nextChar();\n          return _primitives.Cmd.get('}');\n        case 0x29:\n          this.nextChar();\n          throw new _util.FormatError('Illegal character: ' + ch);\n      }\n      var str = String.fromCharCode(ch);\n      var knownCommands = this.knownCommands;\n      var knownCommandFound = knownCommands && knownCommands[str] !== undefined;\n      while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {\n        var possibleCommand = str + String.fromCharCode(ch);\n        if (knownCommandFound && knownCommands[possibleCommand] === undefined) {\n          break;\n        }\n        if (str.length === 128) {\n          throw new _util.FormatError('Command token too long: ' + str.length);\n        }\n        str = possibleCommand;\n        knownCommandFound = knownCommands && knownCommands[str] !== undefined;\n      }\n      if (str === 'true') {\n        return true;\n      }\n      if (str === 'false') {\n        return false;\n      }\n      if (str === 'null') {\n        return null;\n      }\n      return _primitives.Cmd.get(str);\n    },\n    skipToNextLine: function Lexer_skipToNextLine() {\n      var ch = this.currentChar;\n      while (ch >= 0) {\n        if (ch === 0x0D) {\n          ch = this.nextChar();\n          if (ch === 0x0A) {\n            this.nextChar();\n          }\n          break;\n        } else if (ch === 0x0A) {\n          this.nextChar();\n          break;\n        }\n        ch = this.nextChar();\n      }\n    }\n  };\n  return Lexer;\n}();\nvar Linearization = {\n  create: function LinearizationCreate(stream) {\n    function getInt(name, allowZeroValue) {\n      var obj = linDict.get(name);\n      if ((0, _util.isInt)(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) {\n        return obj;\n      }\n      throw new Error('The \"' + name + '\" parameter in the linearization ' + 'dictionary is invalid.');\n    }\n    function getHints() {\n      var hints = linDict.get('H'),\n          hintsLength,\n          item;\n      if ((0, _util.isArray)(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) {\n        for (var index = 0; index < hintsLength; index++) {\n          if (!((0, _util.isInt)(item = hints[index]) && item > 0)) {\n            throw new Error('Hint (' + index + ') in the linearization dictionary is invalid.');\n          }\n        }\n        return hints;\n      }\n      throw new Error('Hint array in the linearization dictionary is invalid.');\n    }\n    var parser = new Parser(new Lexer(stream), false, null);\n    var obj1 = parser.getObj();\n    var obj2 = parser.getObj();\n    var obj3 = parser.getObj();\n    var linDict = parser.getObj();\n    var obj, length;\n    if (!((0, _util.isInt)(obj1) && (0, _util.isInt)(obj2) && (0, _primitives.isCmd)(obj3, 'obj') && (0, _primitives.isDict)(linDict) && (0, _util.isNum)(obj = linDict.get('Linearized')) && obj > 0)) {\n      return null;\n    } else if ((length = getInt('L')) !== stream.length) {\n      throw new Error('The \"L\" parameter in the linearization dictionary ' + 'does not equal the stream length.');\n    }\n    return {\n      length: length,\n      hints: getHints(),\n      objectNumberFirst: getInt('O'),\n      endFirst: getInt('E'),\n      numPages: getInt('N'),\n      mainXRefEntriesOffset: getInt('T'),\n      pageFirst: linDict.has('P') ? getInt('P', true) : 0\n    };\n  }\n};\nexports.Lexer = Lexer;\nexports.Linearization = Linearization;\nexports.Parser = Parser;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\nvar getLookupTableFactory = __w_pdfjs_require__(0).getLookupTableFactory;\nvar getGlyphsUnicode = getLookupTableFactory(function (t) {\n t['A'] = 0x0041;\n t['AE'] = 0x00C6;\n t['AEacute'] = 0x01FC;\n t['AEmacron'] = 0x01E2;\n t['AEsmall'] = 0xF7E6;\n t['Aacute'] = 0x00C1;\n t['Aacutesmall'] = 0xF7E1;\n t['Abreve'] = 0x0102;\n t['Abreveacute'] = 0x1EAE;\n t['Abrevecyrillic'] = 0x04D0;\n t['Abrevedotbelow'] = 0x1EB6;\n t['Abrevegrave'] = 0x1EB0;\n t['Abrevehookabove'] = 0x1EB2;\n t['Abrevetilde'] = 0x1EB4;\n t['Acaron'] = 0x01CD;\n t['Acircle'] = 0x24B6;\n t['Acircumflex'] = 0x00C2;\n t['Acircumflexacute'] = 0x1EA4;\n t['Acircumflexdotbelow'] = 0x1EAC;\n t['Acircumflexgrave'] = 0x1EA6;\n t['Acircumflexhookabove'] = 0x1EA8;\n t['Acircumflexsmall'] = 0xF7E2;\n t['Acircumflextilde'] = 0x1EAA;\n t['Acute'] = 0xF6C9;\n t['Acutesmall'] = 0xF7B4;\n t['Acyrillic'] = 0x0410;\n t['Adblgrave'] = 0x0200;\n t['Adieresis'] = 0x00C4;\n t['Adieresiscyrillic'] = 0x04D2;\n t['Adieresismacron'] = 0x01DE;\n t['Adieresissmall'] = 0xF7E4;\n t['Adotbelow'] = 0x1EA0;\n t['Adotmacron'] = 0x01E0;\n t['Agrave'] = 0x00C0;\n t['Agravesmall'] = 0xF7E0;\n t['Ahookabove'] = 0x1EA2;\n t['Aiecyrillic'] = 0x04D4;\n t['Ainvertedbreve'] = 0x0202;\n t['Alpha'] = 0x0391;\n t['Alphatonos'] = 0x0386;\n t['Amacron'] = 0x0100;\n t['Amonospace'] = 0xFF21;\n t['Aogonek'] = 0x0104;\n t['Aring'] = 0x00C5;\n t['Aringacute'] = 0x01FA;\n t['Aringbelow'] = 0x1E00;\n t['Aringsmall'] = 0xF7E5;\n t['Asmall'] = 0xF761;\n t['Atilde'] = 0x00C3;\n t['Atildesmall'] = 0xF7E3;\n t['Aybarmenian'] = 0x0531;\n t['B'] = 0x0042;\n t['Bcircle'] = 0x24B7;\n t['Bdotaccent'] = 0x1E02;\n t['Bdotbelow'] = 0x1E04;\n t['Becyrillic'] = 0x0411;\n t['Benarmenian'] = 0x0532;\n t['Beta'] = 0x0392;\n t['Bhook'] = 0x0181;\n t['Blinebelow'] = 0x1E06;\n t['Bmonospace'] = 0xFF22;\n t['Brevesmall'] = 0xF6F4;\n t['Bsmall'] = 0xF762;\n t['Btopbar'] = 0x0182;\n t['C'] = 0x0043;\n t['Caarmenian'] = 0x053E;\n t['Cacute'] = 0x0106;\n t['Caron'] = 0xF6CA;\n t['Caronsmall'] = 0xF6F5;\n t['Ccaron'] = 0x010C;\n t['Ccedilla'] = 0x00C7;\n t['Ccedillaacute'] = 0x1E08;\n t['Ccedillasmall'] = 0xF7E7;\n t['Ccircle'] = 0x24B8;\n t['Ccircumflex'] = 0x0108;\n t['Cdot'] = 0x010A;\n t['Cdotaccent'] = 0x010A;\n t['Cedillasmall'] = 0xF7B8;\n t['Chaarmenian'] = 0x0549;\n t['Cheabkhasiancyrillic'] = 0x04BC;\n t['Checyrillic'] = 0x0427;\n t['Chedescenderabkhasiancyrillic'] = 0x04BE;\n t['Chedescendercyrillic'] = 0x04B6;\n t['Chedieresiscyrillic'] = 0x04F4;\n t['Cheharmenian'] = 0x0543;\n t['Chekhakassiancyrillic'] = 0x04CB;\n t['Cheverticalstrokecyrillic'] = 0x04B8;\n t['Chi'] = 0x03A7;\n t['Chook'] = 0x0187;\n t['Circumflexsmall'] = 0xF6F6;\n t['Cmonospace'] = 0xFF23;\n t['Coarmenian'] = 0x0551;\n t['Csmall'] = 0xF763;\n t['D'] = 0x0044;\n t['DZ'] = 0x01F1;\n t['DZcaron'] = 0x01C4;\n t['Daarmenian'] = 0x0534;\n t['Dafrican'] = 0x0189;\n t['Dcaron'] = 0x010E;\n t['Dcedilla'] = 0x1E10;\n t['Dcircle'] = 0x24B9;\n t['Dcircumflexbelow'] = 0x1E12;\n t['Dcroat'] = 0x0110;\n t['Ddotaccent'] = 0x1E0A;\n t['Ddotbelow'] = 0x1E0C;\n t['Decyrillic'] = 0x0414;\n t['Deicoptic'] = 0x03EE;\n t['Delta'] = 0x2206;\n t['Deltagreek'] = 0x0394;\n t['Dhook'] = 0x018A;\n t['Dieresis'] = 0xF6CB;\n t['DieresisAcute'] = 0xF6CC;\n t['DieresisGrave'] = 0xF6CD;\n t['Dieresissmall'] = 0xF7A8;\n t['Digammagreek'] = 0x03DC;\n t['Djecyrillic'] = 0x0402;\n t['Dlinebelow'] = 0x1E0E;\n t['Dmonospace'] = 0xFF24;\n t['Dotaccentsmall'] = 0xF6F7;\n t['Dslash'] = 0x0110;\n t['Dsmall'] = 0xF764;\n t['Dtopbar'] = 0x018B;\n t['Dz'] = 0x01F2;\n t['Dzcaron'] = 0x01C5;\n t['Dzeabkhasiancyrillic'] = 0x04E0;\n t['Dzecyrillic'] = 0x0405;\n t['Dzhecyrillic'] = 0x040F;\n t['E'] = 0x0045;\n t['Eacute'] = 0x00C9;\n t['Eacutesmall'] = 0xF7E9;\n t['Ebreve'] = 0x0114;\n t['Ecaron'] = 0x011A;\n t['Ecedillabreve'] = 0x1E1C;\n t['Echarmenian'] = 0x0535;\n t['Ecircle'] = 0x24BA;\n t['Ecircumflex'] = 0x00CA;\n t['Ecircumflexacute'] = 0x1EBE;\n t['Ecircumflexbelow'] = 0x1E18;\n t['Ecircumflexdotbelow'] = 0x1EC6;\n t['Ecircumflexgrave'] = 0x1EC0;\n t['Ecircumflexhookabove'] = 0x1EC2;\n t['Ecircumflexsmall'] = 0xF7EA;\n t['Ecircumflextilde'] = 0x1EC4;\n t['Ecyrillic'] = 0x0404;\n t['Edblgrave'] = 0x0204;\n t['Edieresis'] = 0x00CB;\n t['Edieresissmall'] = 0xF7EB;\n t['Edot'] = 0x0116;\n t['Edotaccent'] = 0x0116;\n t['Edotbelow'] = 0x1EB8;\n t['Efcyrillic'] = 0x0424;\n t['Egrave'] = 0x00C8;\n t['Egravesmall'] = 0xF7E8;\n t['Eharmenian'] = 0x0537;\n t['Ehookabove'] = 0x1EBA;\n t['Eightroman'] = 0x2167;\n t['Einvertedbreve'] = 0x0206;\n t['Eiotifiedcyrillic'] = 0x0464;\n t['Elcyrillic'] = 0x041B;\n t['Elevenroman'] = 0x216A;\n t['Emacron'] = 0x0112;\n t['Emacronacute'] = 0x1E16;\n t['Emacrongrave'] = 0x1E14;\n t['Emcyrillic'] = 0x041C;\n t['Emonospace'] = 0xFF25;\n t['Encyrillic'] = 0x041D;\n t['Endescendercyrillic'] = 0x04A2;\n t['Eng'] = 0x014A;\n t['Enghecyrillic'] = 0x04A4;\n t['Enhookcyrillic'] = 0x04C7;\n t['Eogonek'] = 0x0118;\n t['Eopen'] = 0x0190;\n t['Epsilon'] = 0x0395;\n t['Epsilontonos'] = 0x0388;\n t['Ercyrillic'] = 0x0420;\n t['Ereversed'] = 0x018E;\n t['Ereversedcyrillic'] = 0x042D;\n t['Escyrillic'] = 0x0421;\n t['Esdescendercyrillic'] = 0x04AA;\n t['Esh'] = 0x01A9;\n t['Esmall'] = 0xF765;\n t['Eta'] = 0x0397;\n t['Etarmenian'] = 0x0538;\n t['Etatonos'] = 0x0389;\n t['Eth'] = 0x00D0;\n t['Ethsmall'] = 0xF7F0;\n t['Etilde'] = 0x1EBC;\n t['Etildebelow'] = 0x1E1A;\n t['Euro'] = 0x20AC;\n t['Ezh'] = 0x01B7;\n t['Ezhcaron'] = 0x01EE;\n t['Ezhreversed'] = 0x01B8;\n t['F'] = 0x0046;\n t['Fcircle'] = 0x24BB;\n t['Fdotaccent'] = 0x1E1E;\n t['Feharmenian'] = 0x0556;\n t['Feicoptic'] = 0x03E4;\n t['Fhook'] = 0x0191;\n t['Fitacyrillic'] = 0x0472;\n t['Fiveroman'] = 0x2164;\n t['Fmonospace'] = 0xFF26;\n t['Fourroman'] = 0x2163;\n t['Fsmall'] = 0xF766;\n t['G'] = 0x0047;\n t['GBsquare'] = 0x3387;\n t['Gacute'] = 0x01F4;\n t['Gamma'] = 0x0393;\n t['Gammaafrican'] = 0x0194;\n t['Gangiacoptic'] = 0x03EA;\n t['Gbreve'] = 0x011E;\n t['Gcaron'] = 0x01E6;\n t['Gcedilla'] = 0x0122;\n t['Gcircle'] = 0x24BC;\n t['Gcircumflex'] = 0x011C;\n t['Gcommaaccent'] = 0x0122;\n t['Gdot'] = 0x0120;\n t['Gdotaccent'] = 0x0120;\n t['Gecyrillic'] = 0x0413;\n t['Ghadarmenian'] = 0x0542;\n t['Ghemiddlehookcyrillic'] = 0x0494;\n t['Ghestrokecyrillic'] = 0x0492;\n t['Gheupturncyrillic'] = 0x0490;\n t['Ghook'] = 0x0193;\n t['Gimarmenian'] = 0x0533;\n t['Gjecyrillic'] = 0x0403;\n t['Gmacron'] = 0x1E20;\n t['Gmonospace'] = 0xFF27;\n t['Grave'] = 0xF6CE;\n t['Gravesmall'] = 0xF760;\n t['Gsmall'] = 0xF767;\n t['Gsmallhook'] = 0x029B;\n t['Gstroke'] = 0x01E4;\n t['H'] = 0x0048;\n t['H18533'] = 0x25CF;\n t['H18543'] = 0x25AA;\n t['H18551'] = 0x25AB;\n t['H22073'] = 0x25A1;\n t['HPsquare'] = 0x33CB;\n t['Haabkhasiancyrillic'] = 0x04A8;\n t['Hadescendercyrillic'] = 0x04B2;\n t['Hardsigncyrillic'] = 0x042A;\n t['Hbar'] = 0x0126;\n t['Hbrevebelow'] = 0x1E2A;\n t['Hcedilla'] = 0x1E28;\n t['Hcircle'] = 0x24BD;\n t['Hcircumflex'] = 0x0124;\n t['Hdieresis'] = 0x1E26;\n t['Hdotaccent'] = 0x1E22;\n t['Hdotbelow'] = 0x1E24;\n t['Hmonospace'] = 0xFF28;\n t['Hoarmenian'] = 0x0540;\n t['Horicoptic'] = 0x03E8;\n t['Hsmall'] = 0xF768;\n t['Hungarumlaut'] = 0xF6CF;\n t['Hungarumlautsmall'] = 0xF6F8;\n t['Hzsquare'] = 0x3390;\n t['I'] = 0x0049;\n t['IAcyrillic'] = 0x042F;\n t['IJ'] = 0x0132;\n t['IUcyrillic'] = 0x042E;\n t['Iacute'] = 0x00CD;\n t['Iacutesmall'] = 0xF7ED;\n t['Ibreve'] = 0x012C;\n t['Icaron'] = 0x01CF;\n t['Icircle'] = 0x24BE;\n t['Icircumflex'] = 0x00CE;\n t['Icircumflexsmall'] = 0xF7EE;\n t['Icyrillic'] = 0x0406;\n t['Idblgrave'] = 0x0208;\n t['Idieresis'] = 0x00CF;\n t['Idieresisacute'] = 0x1E2E;\n t['Idieresiscyrillic'] = 0x04E4;\n t['Idieresissmall'] = 0xF7EF;\n t['Idot'] = 0x0130;\n t['Idotaccent'] = 0x0130;\n t['Idotbelow'] = 0x1ECA;\n t['Iebrevecyrillic'] = 0x04D6;\n t['Iecyrillic'] = 0x0415;\n t['Ifraktur'] = 0x2111;\n t['Igrave'] = 0x00CC;\n t['Igravesmall'] = 0xF7EC;\n t['Ihookabove'] = 0x1EC8;\n t['Iicyrillic'] = 0x0418;\n t['Iinvertedbreve'] = 0x020A;\n t['Iishortcyrillic'] = 0x0419;\n t['Imacron'] = 0x012A;\n t['Imacroncyrillic'] = 0x04E2;\n t['Imonospace'] = 0xFF29;\n t['Iniarmenian'] = 0x053B;\n t['Iocyrillic'] = 0x0401;\n t['Iogonek'] = 0x012E;\n t['Iota'] = 0x0399;\n t['Iotaafrican'] = 0x0196;\n t['Iotadieresis'] = 0x03AA;\n t['Iotatonos'] = 0x038A;\n t['Ismall'] = 0xF769;\n t['Istroke'] = 0x0197;\n t['Itilde'] = 0x0128;\n t['Itildebelow'] = 0x1E2C;\n t['Izhitsacyrillic'] = 0x0474;\n t['Izhitsadblgravecyrillic'] = 0x0476;\n t['J'] = 0x004A;\n t['Jaarmenian'] = 0x0541;\n t['Jcircle'] = 0x24BF;\n t['Jcircumflex'] = 0x0134;\n t['Jecyrillic'] = 0x0408;\n t['Jheharmenian'] = 0x054B;\n t['Jmonospace'] = 0xFF2A;\n t['Jsmall'] = 0xF76A;\n t['K'] = 0x004B;\n t['KBsquare'] = 0x3385;\n t['KKsquare'] = 0x33CD;\n t['Kabashkircyrillic'] = 0x04A0;\n t['Kacute'] = 0x1E30;\n t['Kacyrillic'] = 0x041A;\n t['Kadescendercyrillic'] = 0x049A;\n t['Kahookcyrillic'] = 0x04C3;\n t['Kappa'] = 0x039A;\n t['Kastrokecyrillic'] = 0x049E;\n t['Kaverticalstrokecyrillic'] = 0x049C;\n t['Kcaron'] = 0x01E8;\n t['Kcedilla'] = 0x0136;\n t['Kcircle'] = 0x24C0;\n t['Kcommaaccent'] = 0x0136;\n t['Kdotbelow'] = 0x1E32;\n t['Keharmenian'] = 0x0554;\n t['Kenarmenian'] = 0x053F;\n t['Khacyrillic'] = 0x0425;\n t['Kheicoptic'] = 0x03E6;\n t['Khook'] = 0x0198;\n t['Kjecyrillic'] = 0x040C;\n t['Klinebelow'] = 0x1E34;\n t['Kmonospace'] = 0xFF2B;\n t['Koppacyrillic'] = 0x0480;\n t['Koppagreek'] = 0x03DE;\n t['Ksicyrillic'] = 0x046E;\n t['Ksmall'] = 0xF76B;\n t['L'] = 0x004C;\n t['LJ'] = 0x01C7;\n t['LL'] = 0xF6BF;\n t['Lacute'] = 0x0139;\n t['Lambda'] = 0x039B;\n t['Lcaron'] = 0x013D;\n t['Lcedilla'] = 0x013B;\n t['Lcircle'] = 0x24C1;\n t['Lcircumflexbelow'] = 0x1E3C;\n t['Lcommaaccent'] = 0x013B;\n t['Ldot'] = 0x013F;\n t['Ldotaccent'] = 0x013F;\n t['Ldotbelow'] = 0x1E36;\n t['Ldotbelowmacron'] = 0x1E38;\n t['Liwnarmenian'] = 0x053C;\n t['Lj'] = 0x01C8;\n t['Ljecyrillic'] = 0x0409;\n t['Llinebelow'] = 0x1E3A;\n t['Lmonospace'] = 0xFF2C;\n t['Lslash'] = 0x0141;\n t['Lslashsmall'] = 0xF6F9;\n t['Lsmall'] = 0xF76C;\n t['M'] = 0x004D;\n t['MBsquare'] = 0x3386;\n t['Macron'] = 0xF6D0;\n t['Macronsmall'] = 0xF7AF;\n t['Macute'] = 0x1E3E;\n t['Mcircle'] = 0x24C2;\n t['Mdotaccent'] = 0x1E40;\n t['Mdotbelow'] = 0x1E42;\n t['Menarmenian'] = 0x0544;\n t['Mmonospace'] = 0xFF2D;\n t['Msmall'] = 0xF76D;\n t['Mturned'] = 0x019C;\n t['Mu'] = 0x039C;\n t['N'] = 0x004E;\n t['NJ'] = 0x01CA;\n t['Nacute'] = 0x0143;\n t['Ncaron'] = 0x0147;\n t['Ncedilla'] = 0x0145;\n t['Ncircle'] = 0x24C3;\n t['Ncircumflexbelow'] = 0x1E4A;\n t['Ncommaaccent'] = 0x0145;\n t['Ndotaccent'] = 0x1E44;\n t['Ndotbelow'] = 0x1E46;\n t['Nhookleft'] = 0x019D;\n t['Nineroman'] = 0x2168;\n t['Nj'] = 0x01CB;\n t['Njecyrillic'] = 0x040A;\n t['Nlinebelow'] = 0x1E48;\n t['Nmonospace'] = 0xFF2E;\n t['Nowarmenian'] = 0x0546;\n t['Nsmall'] = 0xF76E;\n t['Ntilde'] = 0x00D1;\n t['Ntildesmall'] = 0xF7F1;\n t['Nu'] = 0x039D;\n t['O'] = 0x004F;\n t['OE'] = 0x0152;\n t['OEsmall'] = 0xF6FA;\n t['Oacute'] = 0x00D3;\n t['Oacutesmall'] = 0xF7F3;\n t['Obarredcyrillic'] = 0x04E8;\n t['Obarreddieresiscyrillic'] = 0x04EA;\n t['Obreve'] = 0x014E;\n t['Ocaron'] = 0x01D1;\n t['Ocenteredtilde'] = 0x019F;\n t['Ocircle'] = 0x24C4;\n t['Ocircumflex'] = 0x00D4;\n t['Ocircumflexacute'] = 0x1ED0;\n t['Ocircumflexdotbelow'] = 0x1ED8;\n t['Ocircumflexgrave'] = 0x1ED2;\n t['Ocircumflexhookabove'] = 0x1ED4;\n t['Ocircumflexsmall'] = 0xF7F4;\n t['Ocircumflextilde'] = 0x1ED6;\n t['Ocyrillic'] = 0x041E;\n t['Odblacute'] = 0x0150;\n t['Odblgrave'] = 0x020C;\n t['Odieresis'] = 0x00D6;\n t['Odieresiscyrillic'] = 0x04E6;\n t['Odieresissmall'] = 0xF7F6;\n t['Odotbelow'] = 0x1ECC;\n t['Ogoneksmall'] = 0xF6FB;\n t['Ograve'] = 0x00D2;\n t['Ogravesmall'] = 0xF7F2;\n t['Oharmenian'] = 0x0555;\n t['Ohm'] = 0x2126;\n t['Ohookabove'] = 0x1ECE;\n t['Ohorn'] = 0x01A0;\n t['Ohornacute'] = 0x1EDA;\n t['Ohorndotbelow'] = 0x1EE2;\n t['Ohorngrave'] = 0x1EDC;\n t['Ohornhookabove'] = 0x1EDE;\n t['Ohorntilde'] = 0x1EE0;\n t['Ohungarumlaut'] = 0x0150;\n t['Oi'] = 0x01A2;\n t['Oinvertedbreve'] = 0x020E;\n t['Omacron'] = 0x014C;\n t['Omacronacute'] = 0x1E52;\n t['Omacrongrave'] = 0x1E50;\n t['Omega'] = 0x2126;\n t['Omegacyrillic'] = 0x0460;\n t['Omegagreek'] = 0x03A9;\n t['Omegaroundcyrillic'] = 0x047A;\n t['Omegatitlocyrillic'] = 0x047C;\n t['Omegatonos'] = 0x038F;\n t['Omicron'] = 0x039F;\n t['Omicrontonos'] = 0x038C;\n t['Omonospace'] = 0xFF2F;\n t['Oneroman'] = 0x2160;\n t['Oogonek'] = 0x01EA;\n t['Oogonekmacron'] = 0x01EC;\n t['Oopen'] = 0x0186;\n t['Oslash'] = 0x00D8;\n t['Oslashacute'] = 0x01FE;\n t['Oslashsmall'] = 0xF7F8;\n t['Osmall'] = 0xF76F;\n t['Ostrokeacute'] = 0x01FE;\n t['Otcyrillic'] = 0x047E;\n t['Otilde'] = 0x00D5;\n t['Otildeacute'] = 0x1E4C;\n t['Otildedieresis'] = 0x1E4E;\n t['Otildesmall'] = 0xF7F5;\n t['P'] = 0x0050;\n t['Pacute'] = 0x1E54;\n t['Pcircle'] = 0x24C5;\n t['Pdotaccent'] = 0x1E56;\n t['Pecyrillic'] = 0x041F;\n t['Peharmenian'] = 0x054A;\n t['Pemiddlehookcyrillic'] = 0x04A6;\n t['Phi'] = 0x03A6;\n t['Phook'] = 0x01A4;\n t['Pi'] = 0x03A0;\n t['Piwrarmenian'] = 0x0553;\n t['Pmonospace'] = 0xFF30;\n t['Psi'] = 0x03A8;\n t['Psicyrillic'] = 0x0470;\n t['Psmall'] = 0xF770;\n t['Q'] = 0x0051;\n t['Qcircle'] = 0x24C6;\n t['Qmonospace'] = 0xFF31;\n t['Qsmall'] = 0xF771;\n t['R'] = 0x0052;\n t['Raarmenian'] = 0x054C;\n t['Racute'] = 0x0154;\n t['Rcaron'] = 0x0158;\n t['Rcedilla'] = 0x0156;\n t['Rcircle'] = 0x24C7;\n t['Rcommaaccent'] = 0x0156;\n t['Rdblgrave'] = 0x0210;\n t['Rdotaccent'] = 0x1E58;\n t['Rdotbelow'] = 0x1E5A;\n t['Rdotbelowmacron'] = 0x1E5C;\n t['Reharmenian'] = 0x0550;\n t['Rfraktur'] = 0x211C;\n t['Rho'] = 0x03A1;\n t['Ringsmall'] = 0xF6FC;\n t['Rinvertedbreve'] = 0x0212;\n t['Rlinebelow'] = 0x1E5E;\n t['Rmonospace'] = 0xFF32;\n t['Rsmall'] = 0xF772;\n t['Rsmallinverted'] = 0x0281;\n t['Rsmallinvertedsuperior'] = 0x02B6;\n t['S'] = 0x0053;\n t['SF010000'] = 0x250C;\n t['SF020000'] = 0x2514;\n t['SF030000'] = 0x2510;\n t['SF040000'] = 0x2518;\n t['SF050000'] = 0x253C;\n t['SF060000'] = 0x252C;\n t['SF070000'] = 0x2534;\n t['SF080000'] = 0x251C;\n t['SF090000'] = 0x2524;\n t['SF100000'] = 0x2500;\n t['SF110000'] = 0x2502;\n t['SF190000'] = 0x2561;\n t['SF200000'] = 0x2562;\n t['SF210000'] = 0x2556;\n t['SF220000'] = 0x2555;\n t['SF230000'] = 0x2563;\n t['SF240000'] = 0x2551;\n t['SF250000'] = 0x2557;\n t['SF260000'] = 0x255D;\n t['SF270000'] = 0x255C;\n t['SF280000'] = 0x255B;\n t['SF360000'] = 0x255E;\n t['SF370000'] = 0x255F;\n t['SF380000'] = 0x255A;\n t['SF390000'] = 0x2554;\n t['SF400000'] = 0x2569;\n t['SF410000'] = 0x2566;\n t['SF420000'] = 0x2560;\n t['SF430000'] = 0x2550;\n t['SF440000'] = 0x256C;\n t['SF450000'] = 0x2567;\n t['SF460000'] = 0x2568;\n t['SF470000'] = 0x2564;\n t['SF480000'] = 0x2565;\n t['SF490000'] = 0x2559;\n t['SF500000'] = 0x2558;\n t['SF510000'] = 0x2552;\n t['SF520000'] = 0x2553;\n t['SF530000'] = 0x256B;\n t['SF540000'] = 0x256A;\n t['Sacute'] = 0x015A;\n t['Sacutedotaccent'] = 0x1E64;\n t['Sampigreek'] = 0x03E0;\n t['Scaron'] = 0x0160;\n t['Scarondotaccent'] = 0x1E66;\n t['Scaronsmall'] = 0xF6FD;\n t['Scedilla'] = 0x015E;\n t['Schwa'] = 0x018F;\n t['Schwacyrillic'] = 0x04D8;\n t['Schwadieresiscyrillic'] = 0x04DA;\n t['Scircle'] = 0x24C8;\n t['Scircumflex'] = 0x015C;\n t['Scommaaccent'] = 0x0218;\n t['Sdotaccent'] = 0x1E60;\n t['Sdotbelow'] = 0x1E62;\n t['Sdotbelowdotaccent'] = 0x1E68;\n t['Seharmenian'] = 0x054D;\n t['Sevenroman'] = 0x2166;\n t['Shaarmenian'] = 0x0547;\n t['Shacyrillic'] = 0x0428;\n t['Shchacyrillic'] = 0x0429;\n t['Sheicoptic'] = 0x03E2;\n t['Shhacyrillic'] = 0x04BA;\n t['Shimacoptic'] = 0x03EC;\n t['Sigma'] = 0x03A3;\n t['Sixroman'] = 0x2165;\n t['Smonospace'] = 0xFF33;\n t['Softsigncyrillic'] = 0x042C;\n t['Ssmall'] = 0xF773;\n t['Stigmagreek'] = 0x03DA;\n t['T'] = 0x0054;\n t['Tau'] = 0x03A4;\n t['Tbar'] = 0x0166;\n t['Tcaron'] = 0x0164;\n t['Tcedilla'] = 0x0162;\n t['Tcircle'] = 0x24C9;\n t['Tcircumflexbelow'] = 0x1E70;\n t['Tcommaaccent'] = 0x0162;\n t['Tdotaccent'] = 0x1E6A;\n t['Tdotbelow'] = 0x1E6C;\n t['Tecyrillic'] = 0x0422;\n t['Tedescendercyrillic'] = 0x04AC;\n t['Tenroman'] = 0x2169;\n t['Tetsecyrillic'] = 0x04B4;\n t['Theta'] = 0x0398;\n t['Thook'] = 0x01AC;\n t['Thorn'] = 0x00DE;\n t['Thornsmall'] = 0xF7FE;\n t['Threeroman'] = 0x2162;\n t['Tildesmall'] = 0xF6FE;\n t['Tiwnarmenian'] = 0x054F;\n t['Tlinebelow'] = 0x1E6E;\n t['Tmonospace'] = 0xFF34;\n t['Toarmenian'] = 0x0539;\n t['Tonefive'] = 0x01BC;\n t['Tonesix'] = 0x0184;\n t['Tonetwo'] = 0x01A7;\n t['Tretroflexhook'] = 0x01AE;\n t['Tsecyrillic'] = 0x0426;\n t['Tshecyrillic'] = 0x040B;\n t['Tsmall'] = 0xF774;\n t['Twelveroman'] = 0x216B;\n t['Tworoman'] = 0x2161;\n t['U'] = 0x0055;\n t['Uacute'] = 0x00DA;\n t['Uacutesmall'] = 0xF7FA;\n t['Ubreve'] = 0x016C;\n t['Ucaron'] = 0x01D3;\n t['Ucircle'] = 0x24CA;\n t['Ucircumflex'] = 0x00DB;\n t['Ucircumflexbelow'] = 0x1E76;\n t['Ucircumflexsmall'] = 0xF7FB;\n t['Ucyrillic'] = 0x0423;\n t['Udblacute'] = 0x0170;\n t['Udblgrave'] = 0x0214;\n t['Udieresis'] = 0x00DC;\n t['Udieresisacute'] = 0x01D7;\n t['Udieresisbelow'] = 0x1E72;\n t['Udieresiscaron'] = 0x01D9;\n t['Udieresiscyrillic'] = 0x04F0;\n t['Udieresisgrave'] = 0x01DB;\n t['Udieresismacron'] = 0x01D5;\n t['Udieresissmall'] = 0xF7FC;\n t['Udotbelow'] = 0x1EE4;\n t['Ugrave'] = 0x00D9;\n t['Ugravesmall'] = 0xF7F9;\n t['Uhookabove'] = 0x1EE6;\n t['Uhorn'] = 0x01AF;\n t['Uhornacute'] = 0x1EE8;\n t['Uhorndotbelow'] = 0x1EF0;\n t['Uhorngrave'] = 0x1EEA;\n t['Uhornhookabove'] = 0x1EEC;\n t['Uhorntilde'] = 0x1EEE;\n t['Uhungarumlaut'] = 0x0170;\n t['Uhungarumlautcyrillic'] = 0x04F2;\n t['Uinvertedbreve'] = 0x0216;\n t['Ukcyrillic'] = 0x0478;\n t['Umacron'] = 0x016A;\n t['Umacroncyrillic'] = 0x04EE;\n t['Umacrondieresis'] = 0x1E7A;\n t['Umonospace'] = 0xFF35;\n t['Uogonek'] = 0x0172;\n t['Upsilon'] = 0x03A5;\n t['Upsilon1'] = 0x03D2;\n t['Upsilonacutehooksymbolgreek'] = 0x03D3;\n t['Upsilonafrican'] = 0x01B1;\n t['Upsilondieresis'] = 0x03AB;\n t['Upsilondieresishooksymbolgreek'] = 0x03D4;\n t['Upsilonhooksymbol'] = 0x03D2;\n t['Upsilontonos'] = 0x038E;\n t['Uring'] = 0x016E;\n t['Ushortcyrillic'] = 0x040E;\n t['Usmall'] = 0xF775;\n t['Ustraightcyrillic'] = 0x04AE;\n t['Ustraightstrokecyrillic'] = 0x04B0;\n t['Utilde'] = 0x0168;\n t['Utildeacute'] = 0x1E78;\n t['Utildebelow'] = 0x1E74;\n t['V'] = 0x0056;\n t['Vcircle'] = 0x24CB;\n t['Vdotbelow'] = 0x1E7E;\n t['Vecyrillic'] = 0x0412;\n t['Vewarmenian'] = 0x054E;\n t['Vhook'] = 0x01B2;\n t['Vmonospace'] = 0xFF36;\n t['Voarmenian'] = 0x0548;\n t['Vsmall'] = 0xF776;\n t['Vtilde'] = 0x1E7C;\n t['W'] = 0x0057;\n t['Wacute'] = 0x1E82;\n t['Wcircle'] = 0x24CC;\n t['Wcircumflex'] = 0x0174;\n t['Wdieresis'] = 0x1E84;\n t['Wdotaccent'] = 0x1E86;\n t['Wdotbelow'] = 0x1E88;\n t['Wgrave'] = 0x1E80;\n t['Wmonospace'] = 0xFF37;\n t['Wsmall'] = 0xF777;\n t['X'] = 0x0058;\n t['Xcircle'] = 0x24CD;\n t['Xdieresis'] = 0x1E8C;\n t['Xdotaccent'] = 0x1E8A;\n t['Xeharmenian'] = 0x053D;\n t['Xi'] = 0x039E;\n t['Xmonospace'] = 0xFF38;\n t['Xsmall'] = 0xF778;\n t['Y'] = 0x0059;\n t['Yacute'] = 0x00DD;\n t['Yacutesmall'] = 0xF7FD;\n t['Yatcyrillic'] = 0x0462;\n t['Ycircle'] = 0x24CE;\n t['Ycircumflex'] = 0x0176;\n t['Ydieresis'] = 0x0178;\n t['Ydieresissmall'] = 0xF7FF;\n t['Ydotaccent'] = 0x1E8E;\n t['Ydotbelow'] = 0x1EF4;\n t['Yericyrillic'] = 0x042B;\n t['Yerudieresiscyrillic'] = 0x04F8;\n t['Ygrave'] = 0x1EF2;\n t['Yhook'] = 0x01B3;\n t['Yhookabove'] = 0x1EF6;\n t['Yiarmenian'] = 0x0545;\n t['Yicyrillic'] = 0x0407;\n t['Yiwnarmenian'] = 0x0552;\n t['Ymonospace'] = 0xFF39;\n t['Ysmall'] = 0xF779;\n t['Ytilde'] = 0x1EF8;\n t['Yusbigcyrillic'] = 0x046A;\n t['Yusbigiotifiedcyrillic'] = 0x046C;\n t['Yuslittlecyrillic'] = 0x0466;\n t['Yuslittleiotifiedcyrillic'] = 0x0468;\n t['Z'] = 0x005A;\n t['Zaarmenian'] = 0x0536;\n t['Zacute'] = 0x0179;\n t['Zcaron'] = 0x017D;\n t['Zcaronsmall'] = 0xF6FF;\n t['Zcircle'] = 0x24CF;\n t['Zcircumflex'] = 0x1E90;\n t['Zdot'] = 0x017B;\n t['Zdotaccent'] = 0x017B;\n t['Zdotbelow'] = 0x1E92;\n t['Zecyrillic'] = 0x0417;\n t['Zedescendercyrillic'] = 0x0498;\n t['Zedieresiscyrillic'] = 0x04DE;\n t['Zeta'] = 0x0396;\n t['Zhearmenian'] = 0x053A;\n t['Zhebrevecyrillic'] = 0x04C1;\n t['Zhecyrillic'] = 0x0416;\n t['Zhedescendercyrillic'] = 0x0496;\n t['Zhedieresiscyrillic'] = 0x04DC;\n t['Zlinebelow'] = 0x1E94;\n t['Zmonospace'] = 0xFF3A;\n t['Zsmall'] = 0xF77A;\n t['Zstroke'] = 0x01B5;\n t['a'] = 0x0061;\n t['aabengali'] = 0x0986;\n t['aacute'] = 0x00E1;\n t['aadeva'] = 0x0906;\n t['aagujarati'] = 0x0A86;\n t['aagurmukhi'] = 0x0A06;\n t['aamatragurmukhi'] = 0x0A3E;\n t['aarusquare'] = 0x3303;\n t['aavowelsignbengali'] = 0x09BE;\n t['aavowelsigndeva'] = 0x093E;\n t['aavowelsigngujarati'] = 0x0ABE;\n t['abbreviationmarkarmenian'] = 0x055F;\n t['abbreviationsigndeva'] = 0x0970;\n t['abengali'] = 0x0985;\n t['abopomofo'] = 0x311A;\n t['abreve'] = 0x0103;\n t['abreveacute'] = 0x1EAF;\n t['abrevecyrillic'] = 0x04D1;\n t['abrevedotbelow'] = 0x1EB7;\n t['abrevegrave'] = 0x1EB1;\n t['abrevehookabove'] = 0x1EB3;\n t['abrevetilde'] = 0x1EB5;\n t['acaron'] = 0x01CE;\n t['acircle'] = 0x24D0;\n t['acircumflex'] = 0x00E2;\n t['acircumflexacute'] = 0x1EA5;\n t['acircumflexdotbelow'] = 0x1EAD;\n t['acircumflexgrave'] = 0x1EA7;\n t['acircumflexhookabove'] = 0x1EA9;\n t['acircumflextilde'] = 0x1EAB;\n t['acute'] = 0x00B4;\n t['acutebelowcmb'] = 0x0317;\n t['acutecmb'] = 0x0301;\n t['acutecomb'] = 0x0301;\n t['acutedeva'] = 0x0954;\n t['acutelowmod'] = 0x02CF;\n t['acutetonecmb'] = 0x0341;\n t['acyrillic'] = 0x0430;\n t['adblgrave'] = 0x0201;\n t['addakgurmukhi'] = 0x0A71;\n t['adeva'] = 0x0905;\n t['adieresis'] = 0x00E4;\n t['adieresiscyrillic'] = 0x04D3;\n t['adieresismacron'] = 0x01DF;\n t['adotbelow'] = 0x1EA1;\n t['adotmacron'] = 0x01E1;\n t['ae'] = 0x00E6;\n t['aeacute'] = 0x01FD;\n t['aekorean'] = 0x3150;\n t['aemacron'] = 0x01E3;\n t['afii00208'] = 0x2015;\n t['afii08941'] = 0x20A4;\n t['afii10017'] = 0x0410;\n t['afii10018'] = 0x0411;\n t['afii10019'] = 0x0412;\n t['afii10020'] = 0x0413;\n t['afii10021'] = 0x0414;\n t['afii10022'] = 0x0415;\n t['afii10023'] = 0x0401;\n t['afii10024'] = 0x0416;\n t['afii10025'] = 0x0417;\n t['afii10026'] = 0x0418;\n t['afii10027'] = 0x0419;\n t['afii10028'] = 0x041A;\n t['afii10029'] = 0x041B;\n t['afii10030'] = 0x041C;\n t['afii10031'] = 0x041D;\n t['afii10032'] = 0x041E;\n t['afii10033'] = 0x041F;\n t['afii10034'] = 0x0420;\n t['afii10035'] = 0x0421;\n t['afii10036'] = 0x0422;\n t['afii10037'] = 0x0423;\n t['afii10038'] = 0x0424;\n t['afii10039'] = 0x0425;\n t['afii10040'] = 0x0426;\n t['afii10041'] = 0x0427;\n t['afii10042'] = 0x0428;\n t['afii10043'] = 0x0429;\n t['afii10044'] = 0x042A;\n t['afii10045'] = 0x042B;\n t['afii10046'] = 0x042C;\n t['afii10047'] = 0x042D;\n t['afii10048'] = 0x042E;\n t['afii10049'] = 0x042F;\n t['afii10050'] = 0x0490;\n t['afii10051'] = 0x0402;\n t['afii10052'] = 0x0403;\n t['afii10053'] = 0x0404;\n t['afii10054'] = 0x0405;\n t['afii10055'] = 0x0406;\n t['afii10056'] = 0x0407;\n t['afii10057'] = 0x0408;\n t['afii10058'] = 0x0409;\n t['afii10059'] = 0x040A;\n t['afii10060'] = 0x040B;\n t['afii10061'] = 0x040C;\n t['afii10062'] = 0x040E;\n t['afii10063'] = 0xF6C4;\n t['afii10064'] = 0xF6C5;\n t['afii10065'] = 0x0430;\n t['afii10066'] = 0x0431;\n t['afii10067'] = 0x0432;\n t['afii10068'] = 0x0433;\n t['afii10069'] = 0x0434;\n t['afii10070'] = 0x0435;\n t['afii10071'] = 0x0451;\n t['afii10072'] = 0x0436;\n t['afii10073'] = 0x0437;\n t['afii10074'] = 0x0438;\n t['afii10075'] = 0x0439;\n t['afii10076'] = 0x043A;\n t['afii10077'] = 0x043B;\n t['afii10078'] = 0x043C;\n t['afii10079'] = 0x043D;\n t['afii10080'] = 0x043E;\n t['afii10081'] = 0x043F;\n t['afii10082'] = 0x0440;\n t['afii10083'] = 0x0441;\n t['afii10084'] = 0x0442;\n t['afii10085'] = 0x0443;\n t['afii10086'] = 0x0444;\n t['afii10087'] = 0x0445;\n t['afii10088'] = 0x0446;\n t['afii10089'] = 0x0447;\n t['afii10090'] = 0x0448;\n t['afii10091'] = 0x0449;\n t['afii10092'] = 0x044A;\n t['afii10093'] = 0x044B;\n t['afii10094'] = 0x044C;\n t['afii10095'] = 0x044D;\n t['afii10096'] = 0x044E;\n t['afii10097'] = 0x044F;\n t['afii10098'] = 0x0491;\n t['afii10099'] = 0x0452;\n t['afii10100'] = 0x0453;\n t['afii10101'] = 0x0454;\n t['afii10102'] = 0x0455;\n t['afii10103'] = 0x0456;\n t['afii10104'] = 0x0457;\n t['afii10105'] = 0x0458;\n t['afii10106'] = 0x0459;\n t['afii10107'] = 0x045A;\n t['afii10108'] = 0x045B;\n t['afii10109'] = 0x045C;\n t['afii10110'] = 0x045E;\n t['afii10145'] = 0x040F;\n t['afii10146'] = 0x0462;\n t['afii10147'] = 0x0472;\n t['afii10148'] = 0x0474;\n t['afii10192'] = 0xF6C6;\n t['afii10193'] = 0x045F;\n t['afii10194'] = 0x0463;\n t['afii10195'] = 0x0473;\n t['afii10196'] = 0x0475;\n t['afii10831'] = 0xF6C7;\n t['afii10832'] = 0xF6C8;\n t['afii10846'] = 0x04D9;\n t['afii299'] = 0x200E;\n t['afii300'] = 0x200F;\n t['afii301'] = 0x200D;\n t['afii57381'] = 0x066A;\n t['afii57388'] = 0x060C;\n t['afii57392'] = 0x0660;\n t['afii57393'] = 0x0661;\n t['afii57394'] = 0x0662;\n t['afii57395'] = 0x0663;\n t['afii57396'] = 0x0664;\n t['afii57397'] = 0x0665;\n t['afii57398'] = 0x0666;\n t['afii57399'] = 0x0667;\n t['afii57400'] = 0x0668;\n t['afii57401'] = 0x0669;\n t['afii57403'] = 0x061B;\n t['afii57407'] = 0x061F;\n t['afii57409'] = 0x0621;\n t['afii57410'] = 0x0622;\n t['afii57411'] = 0x0623;\n t['afii57412'] = 0x0624;\n t['afii57413'] = 0x0625;\n t['afii57414'] = 0x0626;\n t['afii57415'] = 0x0627;\n t['afii57416'] = 0x0628;\n t['afii57417'] = 0x0629;\n t['afii57418'] = 0x062A;\n t['afii57419'] = 0x062B;\n t['afii57420'] = 0x062C;\n t['afii57421'] = 0x062D;\n t['afii57422'] = 0x062E;\n t['afii57423'] = 0x062F;\n t['afii57424'] = 0x0630;\n t['afii57425'] = 0x0631;\n t['afii57426'] = 0x0632;\n t['afii57427'] = 0x0633;\n t['afii57428'] = 0x0634;\n t['afii57429'] = 0x0635;\n t['afii57430'] = 0x0636;\n t['afii57431'] = 0x0637;\n t['afii57432'] = 0x0638;\n t['afii57433'] = 0x0639;\n t['afii57434'] = 0x063A;\n t['afii57440'] = 0x0640;\n t['afii57441'] = 0x0641;\n t['afii57442'] = 0x0642;\n t['afii57443'] = 0x0643;\n t['afii57444'] = 0x0644;\n t['afii57445'] = 0x0645;\n t['afii57446'] = 0x0646;\n t['afii57448'] = 0x0648;\n t['afii57449'] = 0x0649;\n t['afii57450'] = 0x064A;\n t['afii57451'] = 0x064B;\n t['afii57452'] = 0x064C;\n t['afii57453'] = 0x064D;\n t['afii57454'] = 0x064E;\n t['afii57455'] = 0x064F;\n t['afii57456'] = 0x0650;\n t['afii57457'] = 0x0651;\n t['afii57458'] = 0x0652;\n t['afii57470'] = 0x0647;\n t['afii57505'] = 0x06A4;\n t['afii57506'] = 0x067E;\n t['afii57507'] = 0x0686;\n t['afii57508'] = 0x0698;\n t['afii57509'] = 0x06AF;\n t['afii57511'] = 0x0679;\n t['afii57512'] = 0x0688;\n t['afii57513'] = 0x0691;\n t['afii57514'] = 0x06BA;\n t['afii57519'] = 0x06D2;\n t['afii57534'] = 0x06D5;\n t['afii57636'] = 0x20AA;\n t['afii57645'] = 0x05BE;\n t['afii57658'] = 0x05C3;\n t['afii57664'] = 0x05D0;\n t['afii57665'] = 0x05D1;\n t['afii57666'] = 0x05D2;\n t['afii57667'] = 0x05D3;\n t['afii57668'] = 0x05D4;\n t['afii57669'] = 0x05D5;\n t['afii57670'] = 0x05D6;\n t['afii57671'] = 0x05D7;\n t['afii57672'] = 0x05D8;\n t['afii57673'] = 0x05D9;\n t['afii57674'] = 0x05DA;\n t['afii57675'] = 0x05DB;\n t['afii57676'] = 0x05DC;\n t['afii57677'] = 0x05DD;\n t['afii57678'] = 0x05DE;\n t['afii57679'] = 0x05DF;\n t['afii57680'] = 0x05E0;\n t['afii57681'] = 0x05E1;\n t['afii57682'] = 0x05E2;\n t['afii57683'] = 0x05E3;\n t['afii57684'] = 0x05E4;\n t['afii57685'] = 0x05E5;\n t['afii57686'] = 0x05E6;\n t['afii57687'] = 0x05E7;\n t['afii57688'] = 0x05E8;\n t['afii57689'] = 0x05E9;\n t['afii57690'] = 0x05EA;\n t['afii57694'] = 0xFB2A;\n t['afii57695'] = 0xFB2B;\n t['afii57700'] = 0xFB4B;\n t['afii57705'] = 0xFB1F;\n t['afii57716'] = 0x05F0;\n t['afii57717'] = 0x05F1;\n t['afii57718'] = 0x05F2;\n t['afii57723'] = 0xFB35;\n t['afii57793'] = 0x05B4;\n t['afii57794'] = 0x05B5;\n t['afii57795'] = 0x05B6;\n t['afii57796'] = 0x05BB;\n t['afii57797'] = 0x05B8;\n t['afii57798'] = 0x05B7;\n t['afii57799'] = 0x05B0;\n t['afii57800'] = 0x05B2;\n t['afii57801'] = 0x05B1;\n t['afii57802'] = 0x05B3;\n t['afii57803'] = 0x05C2;\n t['afii57804'] = 0x05C1;\n t['afii57806'] = 0x05B9;\n t['afii57807'] = 0x05BC;\n t['afii57839'] = 0x05BD;\n t['afii57841'] = 0x05BF;\n t['afii57842'] = 0x05C0;\n t['afii57929'] = 0x02BC;\n t['afii61248'] = 0x2105;\n t['afii61289'] = 0x2113;\n t['afii61352'] = 0x2116;\n t['afii61573'] = 0x202C;\n t['afii61574'] = 0x202D;\n t['afii61575'] = 0x202E;\n t['afii61664'] = 0x200C;\n t['afii63167'] = 0x066D;\n t['afii64937'] = 0x02BD;\n t['agrave'] = 0x00E0;\n t['agujarati'] = 0x0A85;\n t['agurmukhi'] = 0x0A05;\n t['ahiragana'] = 0x3042;\n t['ahookabove'] = 0x1EA3;\n t['aibengali'] = 0x0990;\n t['aibopomofo'] = 0x311E;\n t['aideva'] = 0x0910;\n t['aiecyrillic'] = 0x04D5;\n t['aigujarati'] = 0x0A90;\n t['aigurmukhi'] = 0x0A10;\n t['aimatragurmukhi'] = 0x0A48;\n t['ainarabic'] = 0x0639;\n t['ainfinalarabic'] = 0xFECA;\n t['aininitialarabic'] = 0xFECB;\n t['ainmedialarabic'] = 0xFECC;\n t['ainvertedbreve'] = 0x0203;\n t['aivowelsignbengali'] = 0x09C8;\n t['aivowelsigndeva'] = 0x0948;\n t['aivowelsigngujarati'] = 0x0AC8;\n t['akatakana'] = 0x30A2;\n t['akatakanahalfwidth'] = 0xFF71;\n t['akorean'] = 0x314F;\n t['alef'] = 0x05D0;\n t['alefarabic'] = 0x0627;\n t['alefdageshhebrew'] = 0xFB30;\n t['aleffinalarabic'] = 0xFE8E;\n t['alefhamzaabovearabic'] = 0x0623;\n t['alefhamzaabovefinalarabic'] = 0xFE84;\n t['alefhamzabelowarabic'] = 0x0625;\n t['alefhamzabelowfinalarabic'] = 0xFE88;\n t['alefhebrew'] = 0x05D0;\n t['aleflamedhebrew'] = 0xFB4F;\n t['alefmaddaabovearabic'] = 0x0622;\n t['alefmaddaabovefinalarabic'] = 0xFE82;\n t['alefmaksuraarabic'] = 0x0649;\n t['alefmaksurafinalarabic'] = 0xFEF0;\n t['alefmaksurainitialarabic'] = 0xFEF3;\n t['alefmaksuramedialarabic'] = 0xFEF4;\n t['alefpatahhebrew'] = 0xFB2E;\n t['alefqamatshebrew'] = 0xFB2F;\n t['aleph'] = 0x2135;\n t['allequal'] = 0x224C;\n t['alpha'] = 0x03B1;\n t['alphatonos'] = 0x03AC;\n t['amacron'] = 0x0101;\n t['amonospace'] = 0xFF41;\n t['ampersand'] = 0x0026;\n t['ampersandmonospace'] = 0xFF06;\n t['ampersandsmall'] = 0xF726;\n t['amsquare'] = 0x33C2;\n t['anbopomofo'] = 0x3122;\n t['angbopomofo'] = 0x3124;\n t['angbracketleft'] = 0x3008;\n t['angbracketright'] = 0x3009;\n t['angkhankhuthai'] = 0x0E5A;\n t['angle'] = 0x2220;\n t['anglebracketleft'] = 0x3008;\n t['anglebracketleftvertical'] = 0xFE3F;\n t['anglebracketright'] = 0x3009;\n t['anglebracketrightvertical'] = 0xFE40;\n t['angleleft'] = 0x2329;\n t['angleright'] = 0x232A;\n t['angstrom'] = 0x212B;\n t['anoteleia'] = 0x0387;\n t['anudattadeva'] = 0x0952;\n t['anusvarabengali'] = 0x0982;\n t['anusvaradeva'] = 0x0902;\n t['anusvaragujarati'] = 0x0A82;\n t['aogonek'] = 0x0105;\n t['apaatosquare'] = 0x3300;\n t['aparen'] = 0x249C;\n t['apostrophearmenian'] = 0x055A;\n t['apostrophemod'] = 0x02BC;\n t['apple'] = 0xF8FF;\n t['approaches'] = 0x2250;\n t['approxequal'] = 0x2248;\n t['approxequalorimage'] = 0x2252;\n t['approximatelyequal'] = 0x2245;\n t['araeaekorean'] = 0x318E;\n t['araeakorean'] = 0x318D;\n t['arc'] = 0x2312;\n t['arighthalfring'] = 0x1E9A;\n t['aring'] = 0x00E5;\n t['aringacute'] = 0x01FB;\n t['aringbelow'] = 0x1E01;\n t['arrowboth'] = 0x2194;\n t['arrowdashdown'] = 0x21E3;\n t['arrowdashleft'] = 0x21E0;\n t['arrowdashright'] = 0x21E2;\n t['arrowdashup'] = 0x21E1;\n t['arrowdblboth'] = 0x21D4;\n t['arrowdbldown'] = 0x21D3;\n t['arrowdblleft'] = 0x21D0;\n t['arrowdblright'] = 0x21D2;\n t['arrowdblup'] = 0x21D1;\n t['arrowdown'] = 0x2193;\n t['arrowdownleft'] = 0x2199;\n t['arrowdownright'] = 0x2198;\n t['arrowdownwhite'] = 0x21E9;\n t['arrowheaddownmod'] = 0x02C5;\n t['arrowheadleftmod'] = 0x02C2;\n t['arrowheadrightmod'] = 0x02C3;\n t['arrowheadupmod'] = 0x02C4;\n t['arrowhorizex'] = 0xF8E7;\n t['arrowleft'] = 0x2190;\n t['arrowleftdbl'] = 0x21D0;\n t['arrowleftdblstroke'] = 0x21CD;\n t['arrowleftoverright'] = 0x21C6;\n t['arrowleftwhite'] = 0x21E6;\n t['arrowright'] = 0x2192;\n t['arrowrightdblstroke'] = 0x21CF;\n t['arrowrightheavy'] = 0x279E;\n t['arrowrightoverleft'] = 0x21C4;\n t['arrowrightwhite'] = 0x21E8;\n t['arrowtableft'] = 0x21E4;\n t['arrowtabright'] = 0x21E5;\n t['arrowup'] = 0x2191;\n t['arrowupdn'] = 0x2195;\n t['arrowupdnbse'] = 0x21A8;\n t['arrowupdownbase'] = 0x21A8;\n t['arrowupleft'] = 0x2196;\n t['arrowupleftofdown'] = 0x21C5;\n t['arrowupright'] = 0x2197;\n t['arrowupwhite'] = 0x21E7;\n t['arrowvertex'] = 0xF8E6;\n t['asciicircum'] = 0x005E;\n t['asciicircummonospace'] = 0xFF3E;\n t['asciitilde'] = 0x007E;\n t['asciitildemonospace'] = 0xFF5E;\n t['ascript'] = 0x0251;\n t['ascriptturned'] = 0x0252;\n t['asmallhiragana'] = 0x3041;\n t['asmallkatakana'] = 0x30A1;\n t['asmallkatakanahalfwidth'] = 0xFF67;\n t['asterisk'] = 0x002A;\n t['asteriskaltonearabic'] = 0x066D;\n t['asteriskarabic'] = 0x066D;\n t['asteriskmath'] = 0x2217;\n t['asteriskmonospace'] = 0xFF0A;\n t['asterisksmall'] = 0xFE61;\n t['asterism'] = 0x2042;\n t['asuperior'] = 0xF6E9;\n t['asymptoticallyequal'] = 0x2243;\n t['at'] = 0x0040;\n t['atilde'] = 0x00E3;\n t['atmonospace'] = 0xFF20;\n t['atsmall'] = 0xFE6B;\n t['aturned'] = 0x0250;\n t['aubengali'] = 0x0994;\n t['aubopomofo'] = 0x3120;\n t['audeva'] = 0x0914;\n t['augujarati'] = 0x0A94;\n t['augurmukhi'] = 0x0A14;\n t['aulengthmarkbengali'] = 0x09D7;\n t['aumatragurmukhi'] = 0x0A4C;\n t['auvowelsignbengali'] = 0x09CC;\n t['auvowelsigndeva'] = 0x094C;\n t['auvowelsigngujarati'] = 0x0ACC;\n t['avagrahadeva'] = 0x093D;\n t['aybarmenian'] = 0x0561;\n t['ayin'] = 0x05E2;\n t['ayinaltonehebrew'] = 0xFB20;\n t['ayinhebrew'] = 0x05E2;\n t['b'] = 0x0062;\n t['babengali'] = 0x09AC;\n t['backslash'] = 0x005C;\n t['backslashmonospace'] = 0xFF3C;\n t['badeva'] = 0x092C;\n t['bagujarati'] = 0x0AAC;\n t['bagurmukhi'] = 0x0A2C;\n t['bahiragana'] = 0x3070;\n t['bahtthai'] = 0x0E3F;\n t['bakatakana'] = 0x30D0;\n t['bar'] = 0x007C;\n t['barmonospace'] = 0xFF5C;\n t['bbopomofo'] = 0x3105;\n t['bcircle'] = 0x24D1;\n t['bdotaccent'] = 0x1E03;\n t['bdotbelow'] = 0x1E05;\n t['beamedsixteenthnotes'] = 0x266C;\n t['because'] = 0x2235;\n t['becyrillic'] = 0x0431;\n t['beharabic'] = 0x0628;\n t['behfinalarabic'] = 0xFE90;\n t['behinitialarabic'] = 0xFE91;\n t['behiragana'] = 0x3079;\n t['behmedialarabic'] = 0xFE92;\n t['behmeeminitialarabic'] = 0xFC9F;\n t['behmeemisolatedarabic'] = 0xFC08;\n t['behnoonfinalarabic'] = 0xFC6D;\n t['bekatakana'] = 0x30D9;\n t['benarmenian'] = 0x0562;\n t['bet'] = 0x05D1;\n t['beta'] = 0x03B2;\n t['betasymbolgreek'] = 0x03D0;\n t['betdagesh'] = 0xFB31;\n t['betdageshhebrew'] = 0xFB31;\n t['bethebrew'] = 0x05D1;\n t['betrafehebrew'] = 0xFB4C;\n t['bhabengali'] = 0x09AD;\n t['bhadeva'] = 0x092D;\n t['bhagujarati'] = 0x0AAD;\n t['bhagurmukhi'] = 0x0A2D;\n t['bhook'] = 0x0253;\n t['bihiragana'] = 0x3073;\n t['bikatakana'] = 0x30D3;\n t['bilabialclick'] = 0x0298;\n t['bindigurmukhi'] = 0x0A02;\n t['birusquare'] = 0x3331;\n t['blackcircle'] = 0x25CF;\n t['blackdiamond'] = 0x25C6;\n t['blackdownpointingtriangle'] = 0x25BC;\n t['blackleftpointingpointer'] = 0x25C4;\n t['blackleftpointingtriangle'] = 0x25C0;\n t['blacklenticularbracketleft'] = 0x3010;\n t['blacklenticularbracketleftvertical'] = 0xFE3B;\n t['blacklenticularbracketright'] = 0x3011;\n t['blacklenticularbracketrightvertical'] = 0xFE3C;\n t['blacklowerlefttriangle'] = 0x25E3;\n t['blacklowerrighttriangle'] = 0x25E2;\n t['blackrectangle'] = 0x25AC;\n t['blackrightpointingpointer'] = 0x25BA;\n t['blackrightpointingtriangle'] = 0x25B6;\n t['blacksmallsquare'] = 0x25AA;\n t['blacksmilingface'] = 0x263B;\n t['blacksquare'] = 0x25A0;\n t['blackstar'] = 0x2605;\n t['blackupperlefttriangle'] = 0x25E4;\n t['blackupperrighttriangle'] = 0x25E5;\n t['blackuppointingsmalltriangle'] = 0x25B4;\n t['blackuppointingtriangle'] = 0x25B2;\n t['blank'] = 0x2423;\n t['blinebelow'] = 0x1E07;\n t['block'] = 0x2588;\n t['bmonospace'] = 0xFF42;\n t['bobaimaithai'] = 0x0E1A;\n t['bohiragana'] = 0x307C;\n t['bokatakana'] = 0x30DC;\n t['bparen'] = 0x249D;\n t['bqsquare'] = 0x33C3;\n t['braceex'] = 0xF8F4;\n t['braceleft'] = 0x007B;\n t['braceleftbt'] = 0xF8F3;\n t['braceleftmid'] = 0xF8F2;\n t['braceleftmonospace'] = 0xFF5B;\n t['braceleftsmall'] = 0xFE5B;\n t['bracelefttp'] = 0xF8F1;\n t['braceleftvertical'] = 0xFE37;\n t['braceright'] = 0x007D;\n t['bracerightbt'] = 0xF8FE;\n t['bracerightmid'] = 0xF8FD;\n t['bracerightmonospace'] = 0xFF5D;\n t['bracerightsmall'] = 0xFE5C;\n t['bracerighttp'] = 0xF8FC;\n t['bracerightvertical'] = 0xFE38;\n t['bracketleft'] = 0x005B;\n t['bracketleftbt'] = 0xF8F0;\n t['bracketleftex'] = 0xF8EF;\n t['bracketleftmonospace'] = 0xFF3B;\n t['bracketlefttp'] = 0xF8EE;\n t['bracketright'] = 0x005D;\n t['bracketrightbt'] = 0xF8FB;\n t['bracketrightex'] = 0xF8FA;\n t['bracketrightmonospace'] = 0xFF3D;\n t['bracketrighttp'] = 0xF8F9;\n t['breve'] = 0x02D8;\n t['brevebelowcmb'] = 0x032E;\n t['brevecmb'] = 0x0306;\n t['breveinvertedbelowcmb'] = 0x032F;\n t['breveinvertedcmb'] = 0x0311;\n t['breveinverteddoublecmb'] = 0x0361;\n t['bridgebelowcmb'] = 0x032A;\n t['bridgeinvertedbelowcmb'] = 0x033A;\n t['brokenbar'] = 0x00A6;\n t['bstroke'] = 0x0180;\n t['bsuperior'] = 0xF6EA;\n t['btopbar'] = 0x0183;\n t['buhiragana'] = 0x3076;\n t['bukatakana'] = 0x30D6;\n t['bullet'] = 0x2022;\n t['bulletinverse'] = 0x25D8;\n t['bulletoperator'] = 0x2219;\n t['bullseye'] = 0x25CE;\n t['c'] = 0x0063;\n t['caarmenian'] = 0x056E;\n t['cabengali'] = 0x099A;\n t['cacute'] = 0x0107;\n t['cadeva'] = 0x091A;\n t['cagujarati'] = 0x0A9A;\n t['cagurmukhi'] = 0x0A1A;\n t['calsquare'] = 0x3388;\n t['candrabindubengali'] = 0x0981;\n t['candrabinducmb'] = 0x0310;\n t['candrabindudeva'] = 0x0901;\n t['candrabindugujarati'] = 0x0A81;\n t['capslock'] = 0x21EA;\n t['careof'] = 0x2105;\n t['caron'] = 0x02C7;\n t['caronbelowcmb'] = 0x032C;\n t['caroncmb'] = 0x030C;\n t['carriagereturn'] = 0x21B5;\n t['cbopomofo'] = 0x3118;\n t['ccaron'] = 0x010D;\n t['ccedilla'] = 0x00E7;\n t['ccedillaacute'] = 0x1E09;\n t['ccircle'] = 0x24D2;\n t['ccircumflex'] = 0x0109;\n t['ccurl'] = 0x0255;\n t['cdot'] = 0x010B;\n t['cdotaccent'] = 0x010B;\n t['cdsquare'] = 0x33C5;\n t['cedilla'] = 0x00B8;\n t['cedillacmb'] = 0x0327;\n t['cent'] = 0x00A2;\n t['centigrade'] = 0x2103;\n t['centinferior'] = 0xF6DF;\n t['centmonospace'] = 0xFFE0;\n t['centoldstyle'] = 0xF7A2;\n t['centsuperior'] = 0xF6E0;\n t['chaarmenian'] = 0x0579;\n t['chabengali'] = 0x099B;\n t['chadeva'] = 0x091B;\n t['chagujarati'] = 0x0A9B;\n t['chagurmukhi'] = 0x0A1B;\n t['chbopomofo'] = 0x3114;\n t['cheabkhasiancyrillic'] = 0x04BD;\n t['checkmark'] = 0x2713;\n t['checyrillic'] = 0x0447;\n t['chedescenderabkhasiancyrillic'] = 0x04BF;\n t['chedescendercyrillic'] = 0x04B7;\n t['chedieresiscyrillic'] = 0x04F5;\n t['cheharmenian'] = 0x0573;\n t['chekhakassiancyrillic'] = 0x04CC;\n t['cheverticalstrokecyrillic'] = 0x04B9;\n t['chi'] = 0x03C7;\n t['chieuchacirclekorean'] = 0x3277;\n t['chieuchaparenkorean'] = 0x3217;\n t['chieuchcirclekorean'] = 0x3269;\n t['chieuchkorean'] = 0x314A;\n t['chieuchparenkorean'] = 0x3209;\n t['chochangthai'] = 0x0E0A;\n t['chochanthai'] = 0x0E08;\n t['chochingthai'] = 0x0E09;\n t['chochoethai'] = 0x0E0C;\n t['chook'] = 0x0188;\n t['cieucacirclekorean'] = 0x3276;\n t['cieucaparenkorean'] = 0x3216;\n t['cieuccirclekorean'] = 0x3268;\n t['cieuckorean'] = 0x3148;\n t['cieucparenkorean'] = 0x3208;\n t['cieucuparenkorean'] = 0x321C;\n t['circle'] = 0x25CB;\n t['circlecopyrt'] = 0x00A9;\n t['circlemultiply'] = 0x2297;\n t['circleot'] = 0x2299;\n t['circleplus'] = 0x2295;\n t['circlepostalmark'] = 0x3036;\n t['circlewithlefthalfblack'] = 0x25D0;\n t['circlewithrighthalfblack'] = 0x25D1;\n t['circumflex'] = 0x02C6;\n t['circumflexbelowcmb'] = 0x032D;\n t['circumflexcmb'] = 0x0302;\n t['clear'] = 0x2327;\n t['clickalveolar'] = 0x01C2;\n t['clickdental'] = 0x01C0;\n t['clicklateral'] = 0x01C1;\n t['clickretroflex'] = 0x01C3;\n t['club'] = 0x2663;\n t['clubsuitblack'] = 0x2663;\n t['clubsuitwhite'] = 0x2667;\n t['cmcubedsquare'] = 0x33A4;\n t['cmonospace'] = 0xFF43;\n t['cmsquaredsquare'] = 0x33A0;\n t['coarmenian'] = 0x0581;\n t['colon'] = 0x003A;\n t['colonmonetary'] = 0x20A1;\n t['colonmonospace'] = 0xFF1A;\n t['colonsign'] = 0x20A1;\n t['colonsmall'] = 0xFE55;\n t['colontriangularhalfmod'] = 0x02D1;\n t['colontriangularmod'] = 0x02D0;\n t['comma'] = 0x002C;\n t['commaabovecmb'] = 0x0313;\n t['commaaboverightcmb'] = 0x0315;\n t['commaaccent'] = 0xF6C3;\n t['commaarabic'] = 0x060C;\n t['commaarmenian'] = 0x055D;\n t['commainferior'] = 0xF6E1;\n t['commamonospace'] = 0xFF0C;\n t['commareversedabovecmb'] = 0x0314;\n t['commareversedmod'] = 0x02BD;\n t['commasmall'] = 0xFE50;\n t['commasuperior'] = 0xF6E2;\n t['commaturnedabovecmb'] = 0x0312;\n t['commaturnedmod'] = 0x02BB;\n t['compass'] = 0x263C;\n t['congruent'] = 0x2245;\n t['contourintegral'] = 0x222E;\n t['control'] = 0x2303;\n t['controlACK'] = 0x0006;\n t['controlBEL'] = 0x0007;\n t['controlBS'] = 0x0008;\n t['controlCAN'] = 0x0018;\n t['controlCR'] = 0x000D;\n t['controlDC1'] = 0x0011;\n t['controlDC2'] = 0x0012;\n t['controlDC3'] = 0x0013;\n t['controlDC4'] = 0x0014;\n t['controlDEL'] = 0x007F;\n t['controlDLE'] = 0x0010;\n t['controlEM'] = 0x0019;\n t['controlENQ'] = 0x0005;\n t['controlEOT'] = 0x0004;\n t['controlESC'] = 0x001B;\n t['controlETB'] = 0x0017;\n t['controlETX'] = 0x0003;\n t['controlFF'] = 0x000C;\n t['controlFS'] = 0x001C;\n t['controlGS'] = 0x001D;\n t['controlHT'] = 0x0009;\n t['controlLF'] = 0x000A;\n t['controlNAK'] = 0x0015;\n t['controlNULL'] = 0x0000;\n t['controlRS'] = 0x001E;\n t['controlSI'] = 0x000F;\n t['controlSO'] = 0x000E;\n t['controlSOT'] = 0x0002;\n t['controlSTX'] = 0x0001;\n t['controlSUB'] = 0x001A;\n t['controlSYN'] = 0x0016;\n t['controlUS'] = 0x001F;\n t['controlVT'] = 0x000B;\n t['copyright'] = 0x00A9;\n t['copyrightsans'] = 0xF8E9;\n t['copyrightserif'] = 0xF6D9;\n t['cornerbracketleft'] = 0x300C;\n t['cornerbracketlefthalfwidth'] = 0xFF62;\n t['cornerbracketleftvertical'] = 0xFE41;\n t['cornerbracketright'] = 0x300D;\n t['cornerbracketrighthalfwidth'] = 0xFF63;\n t['cornerbracketrightvertical'] = 0xFE42;\n t['corporationsquare'] = 0x337F;\n t['cosquare'] = 0x33C7;\n t['coverkgsquare'] = 0x33C6;\n t['cparen'] = 0x249E;\n t['cruzeiro'] = 0x20A2;\n t['cstretched'] = 0x0297;\n t['curlyand'] = 0x22CF;\n t['curlyor'] = 0x22CE;\n t['currency'] = 0x00A4;\n t['cyrBreve'] = 0xF6D1;\n t['cyrFlex'] = 0xF6D2;\n t['cyrbreve'] = 0xF6D4;\n t['cyrflex'] = 0xF6D5;\n t['d'] = 0x0064;\n t['daarmenian'] = 0x0564;\n t['dabengali'] = 0x09A6;\n t['dadarabic'] = 0x0636;\n t['dadeva'] = 0x0926;\n t['dadfinalarabic'] = 0xFEBE;\n t['dadinitialarabic'] = 0xFEBF;\n t['dadmedialarabic'] = 0xFEC0;\n t['dagesh'] = 0x05BC;\n t['dageshhebrew'] = 0x05BC;\n t['dagger'] = 0x2020;\n t['daggerdbl'] = 0x2021;\n t['dagujarati'] = 0x0AA6;\n t['dagurmukhi'] = 0x0A26;\n t['dahiragana'] = 0x3060;\n t['dakatakana'] = 0x30C0;\n t['dalarabic'] = 0x062F;\n t['dalet'] = 0x05D3;\n t['daletdagesh'] = 0xFB33;\n t['daletdageshhebrew'] = 0xFB33;\n t['dalethebrew'] = 0x05D3;\n t['dalfinalarabic'] = 0xFEAA;\n t['dammaarabic'] = 0x064F;\n t['dammalowarabic'] = 0x064F;\n t['dammatanaltonearabic'] = 0x064C;\n t['dammatanarabic'] = 0x064C;\n t['danda'] = 0x0964;\n t['dargahebrew'] = 0x05A7;\n t['dargalefthebrew'] = 0x05A7;\n t['dasiapneumatacyrilliccmb'] = 0x0485;\n t['dblGrave'] = 0xF6D3;\n t['dblanglebracketleft'] = 0x300A;\n t['dblanglebracketleftvertical'] = 0xFE3D;\n t['dblanglebracketright'] = 0x300B;\n t['dblanglebracketrightvertical'] = 0xFE3E;\n t['dblarchinvertedbelowcmb'] = 0x032B;\n t['dblarrowleft'] = 0x21D4;\n t['dblarrowright'] = 0x21D2;\n t['dbldanda'] = 0x0965;\n t['dblgrave'] = 0xF6D6;\n t['dblgravecmb'] = 0x030F;\n t['dblintegral'] = 0x222C;\n t['dbllowline'] = 0x2017;\n t['dbllowlinecmb'] = 0x0333;\n t['dbloverlinecmb'] = 0x033F;\n t['dblprimemod'] = 0x02BA;\n t['dblverticalbar'] = 0x2016;\n t['dblverticallineabovecmb'] = 0x030E;\n t['dbopomofo'] = 0x3109;\n t['dbsquare'] = 0x33C8;\n t['dcaron'] = 0x010F;\n t['dcedilla'] = 0x1E11;\n t['dcircle'] = 0x24D3;\n t['dcircumflexbelow'] = 0x1E13;\n t['dcroat'] = 0x0111;\n t['ddabengali'] = 0x09A1;\n t['ddadeva'] = 0x0921;\n t['ddagujarati'] = 0x0AA1;\n t['ddagurmukhi'] = 0x0A21;\n t['ddalarabic'] = 0x0688;\n t['ddalfinalarabic'] = 0xFB89;\n t['dddhadeva'] = 0x095C;\n t['ddhabengali'] = 0x09A2;\n t['ddhadeva'] = 0x0922;\n t['ddhagujarati'] = 0x0AA2;\n t['ddhagurmukhi'] = 0x0A22;\n t['ddotaccent'] = 0x1E0B;\n t['ddotbelow'] = 0x1E0D;\n t['decimalseparatorarabic'] = 0x066B;\n t['decimalseparatorpersian'] = 0x066B;\n t['decyrillic'] = 0x0434;\n t['degree'] = 0x00B0;\n t['dehihebrew'] = 0x05AD;\n t['dehiragana'] = 0x3067;\n t['deicoptic'] = 0x03EF;\n t['dekatakana'] = 0x30C7;\n t['deleteleft'] = 0x232B;\n t['deleteright'] = 0x2326;\n t['delta'] = 0x03B4;\n t['deltaturned'] = 0x018D;\n t['denominatorminusonenumeratorbengali'] = 0x09F8;\n t['dezh'] = 0x02A4;\n t['dhabengali'] = 0x09A7;\n t['dhadeva'] = 0x0927;\n t['dhagujarati'] = 0x0AA7;\n t['dhagurmukhi'] = 0x0A27;\n t['dhook'] = 0x0257;\n t['dialytikatonos'] = 0x0385;\n t['dialytikatonoscmb'] = 0x0344;\n t['diamond'] = 0x2666;\n t['diamondsuitwhite'] = 0x2662;\n t['dieresis'] = 0x00A8;\n t['dieresisacute'] = 0xF6D7;\n t['dieresisbelowcmb'] = 0x0324;\n t['dieresiscmb'] = 0x0308;\n t['dieresisgrave'] = 0xF6D8;\n t['dieresistonos'] = 0x0385;\n t['dihiragana'] = 0x3062;\n t['dikatakana'] = 0x30C2;\n t['dittomark'] = 0x3003;\n t['divide'] = 0x00F7;\n t['divides'] = 0x2223;\n t['divisionslash'] = 0x2215;\n t['djecyrillic'] = 0x0452;\n t['dkshade'] = 0x2593;\n t['dlinebelow'] = 0x1E0F;\n t['dlsquare'] = 0x3397;\n t['dmacron'] = 0x0111;\n t['dmonospace'] = 0xFF44;\n t['dnblock'] = 0x2584;\n t['dochadathai'] = 0x0E0E;\n t['dodekthai'] = 0x0E14;\n t['dohiragana'] = 0x3069;\n t['dokatakana'] = 0x30C9;\n t['dollar'] = 0x0024;\n t['dollarinferior'] = 0xF6E3;\n t['dollarmonospace'] = 0xFF04;\n t['dollaroldstyle'] = 0xF724;\n t['dollarsmall'] = 0xFE69;\n t['dollarsuperior'] = 0xF6E4;\n t['dong'] = 0x20AB;\n t['dorusquare'] = 0x3326;\n t['dotaccent'] = 0x02D9;\n t['dotaccentcmb'] = 0x0307;\n t['dotbelowcmb'] = 0x0323;\n t['dotbelowcomb'] = 0x0323;\n t['dotkatakana'] = 0x30FB;\n t['dotlessi'] = 0x0131;\n t['dotlessj'] = 0xF6BE;\n t['dotlessjstrokehook'] = 0x0284;\n t['dotmath'] = 0x22C5;\n t['dottedcircle'] = 0x25CC;\n t['doubleyodpatah'] = 0xFB1F;\n t['doubleyodpatahhebrew'] = 0xFB1F;\n t['downtackbelowcmb'] = 0x031E;\n t['downtackmod'] = 0x02D5;\n t['dparen'] = 0x249F;\n t['dsuperior'] = 0xF6EB;\n t['dtail'] = 0x0256;\n t['dtopbar'] = 0x018C;\n t['duhiragana'] = 0x3065;\n t['dukatakana'] = 0x30C5;\n t['dz'] = 0x01F3;\n t['dzaltone'] = 0x02A3;\n t['dzcaron'] = 0x01C6;\n t['dzcurl'] = 0x02A5;\n t['dzeabkhasiancyrillic'] = 0x04E1;\n t['dzecyrillic'] = 0x0455;\n t['dzhecyrillic'] = 0x045F;\n t['e'] = 0x0065;\n t['eacute'] = 0x00E9;\n t['earth'] = 0x2641;\n t['ebengali'] = 0x098F;\n t['ebopomofo'] = 0x311C;\n t['ebreve'] = 0x0115;\n t['ecandradeva'] = 0x090D;\n t['ecandragujarati'] = 0x0A8D;\n t['ecandravowelsigndeva'] = 0x0945;\n t['ecandravowelsigngujarati'] = 0x0AC5;\n t['ecaron'] = 0x011B;\n t['ecedillabreve'] = 0x1E1D;\n t['echarmenian'] = 0x0565;\n t['echyiwnarmenian'] = 0x0587;\n t['ecircle'] = 0x24D4;\n t['ecircumflex'] = 0x00EA;\n t['ecircumflexacute'] = 0x1EBF;\n t['ecircumflexbelow'] = 0x1E19;\n t['ecircumflexdotbelow'] = 0x1EC7;\n t['ecircumflexgrave'] = 0x1EC1;\n t['ecircumflexhookabove'] = 0x1EC3;\n t['ecircumflextilde'] = 0x1EC5;\n t['ecyrillic'] = 0x0454;\n t['edblgrave'] = 0x0205;\n t['edeva'] = 0x090F;\n t['edieresis'] = 0x00EB;\n t['edot'] = 0x0117;\n t['edotaccent'] = 0x0117;\n t['edotbelow'] = 0x1EB9;\n t['eegurmukhi'] = 0x0A0F;\n t['eematragurmukhi'] = 0x0A47;\n t['efcyrillic'] = 0x0444;\n t['egrave'] = 0x00E8;\n t['egujarati'] = 0x0A8F;\n t['eharmenian'] = 0x0567;\n t['ehbopomofo'] = 0x311D;\n t['ehiragana'] = 0x3048;\n t['ehookabove'] = 0x1EBB;\n t['eibopomofo'] = 0x311F;\n t['eight'] = 0x0038;\n t['eightarabic'] = 0x0668;\n t['eightbengali'] = 0x09EE;\n t['eightcircle'] = 0x2467;\n t['eightcircleinversesansserif'] = 0x2791;\n t['eightdeva'] = 0x096E;\n t['eighteencircle'] = 0x2471;\n t['eighteenparen'] = 0x2485;\n t['eighteenperiod'] = 0x2499;\n t['eightgujarati'] = 0x0AEE;\n t['eightgurmukhi'] = 0x0A6E;\n t['eighthackarabic'] = 0x0668;\n t['eighthangzhou'] = 0x3028;\n t['eighthnotebeamed'] = 0x266B;\n t['eightideographicparen'] = 0x3227;\n t['eightinferior'] = 0x2088;\n t['eightmonospace'] = 0xFF18;\n t['eightoldstyle'] = 0xF738;\n t['eightparen'] = 0x247B;\n t['eightperiod'] = 0x248F;\n t['eightpersian'] = 0x06F8;\n t['eightroman'] = 0x2177;\n t['eightsuperior'] = 0x2078;\n t['eightthai'] = 0x0E58;\n t['einvertedbreve'] = 0x0207;\n t['eiotifiedcyrillic'] = 0x0465;\n t['ekatakana'] = 0x30A8;\n t['ekatakanahalfwidth'] = 0xFF74;\n t['ekonkargurmukhi'] = 0x0A74;\n t['ekorean'] = 0x3154;\n t['elcyrillic'] = 0x043B;\n t['element'] = 0x2208;\n t['elevencircle'] = 0x246A;\n t['elevenparen'] = 0x247E;\n t['elevenperiod'] = 0x2492;\n t['elevenroman'] = 0x217A;\n t['ellipsis'] = 0x2026;\n t['ellipsisvertical'] = 0x22EE;\n t['emacron'] = 0x0113;\n t['emacronacute'] = 0x1E17;\n t['emacrongrave'] = 0x1E15;\n t['emcyrillic'] = 0x043C;\n t['emdash'] = 0x2014;\n t['emdashvertical'] = 0xFE31;\n t['emonospace'] = 0xFF45;\n t['emphasismarkarmenian'] = 0x055B;\n t['emptyset'] = 0x2205;\n t['enbopomofo'] = 0x3123;\n t['encyrillic'] = 0x043D;\n t['endash'] = 0x2013;\n t['endashvertical'] = 0xFE32;\n t['endescendercyrillic'] = 0x04A3;\n t['eng'] = 0x014B;\n t['engbopomofo'] = 0x3125;\n t['enghecyrillic'] = 0x04A5;\n t['enhookcyrillic'] = 0x04C8;\n t['enspace'] = 0x2002;\n t['eogonek'] = 0x0119;\n t['eokorean'] = 0x3153;\n t['eopen'] = 0x025B;\n t['eopenclosed'] = 0x029A;\n t['eopenreversed'] = 0x025C;\n t['eopenreversedclosed'] = 0x025E;\n t['eopenreversedhook'] = 0x025D;\n t['eparen'] = 0x24A0;\n t['epsilon'] = 0x03B5;\n t['epsilontonos'] = 0x03AD;\n t['equal'] = 0x003D;\n t['equalmonospace'] = 0xFF1D;\n t['equalsmall'] = 0xFE66;\n t['equalsuperior'] = 0x207C;\n t['equivalence'] = 0x2261;\n t['erbopomofo'] = 0x3126;\n t['ercyrillic'] = 0x0440;\n t['ereversed'] = 0x0258;\n t['ereversedcyrillic'] = 0x044D;\n t['escyrillic'] = 0x0441;\n t['esdescendercyrillic'] = 0x04AB;\n t['esh'] = 0x0283;\n t['eshcurl'] = 0x0286;\n t['eshortdeva'] = 0x090E;\n t['eshortvowelsigndeva'] = 0x0946;\n t['eshreversedloop'] = 0x01AA;\n t['eshsquatreversed'] = 0x0285;\n t['esmallhiragana'] = 0x3047;\n t['esmallkatakana'] = 0x30A7;\n t['esmallkatakanahalfwidth'] = 0xFF6A;\n t['estimated'] = 0x212E;\n t['esuperior'] = 0xF6EC;\n t['eta'] = 0x03B7;\n t['etarmenian'] = 0x0568;\n t['etatonos'] = 0x03AE;\n t['eth'] = 0x00F0;\n t['etilde'] = 0x1EBD;\n t['etildebelow'] = 0x1E1B;\n t['etnahtafoukhhebrew'] = 0x0591;\n t['etnahtafoukhlefthebrew'] = 0x0591;\n t['etnahtahebrew'] = 0x0591;\n t['etnahtalefthebrew'] = 0x0591;\n t['eturned'] = 0x01DD;\n t['eukorean'] = 0x3161;\n t['euro'] = 0x20AC;\n t['evowelsignbengali'] = 0x09C7;\n t['evowelsigndeva'] = 0x0947;\n t['evowelsigngujarati'] = 0x0AC7;\n t['exclam'] = 0x0021;\n t['exclamarmenian'] = 0x055C;\n t['exclamdbl'] = 0x203C;\n t['exclamdown'] = 0x00A1;\n t['exclamdownsmall'] = 0xF7A1;\n t['exclammonospace'] = 0xFF01;\n t['exclamsmall'] = 0xF721;\n t['existential'] = 0x2203;\n t['ezh'] = 0x0292;\n t['ezhcaron'] = 0x01EF;\n t['ezhcurl'] = 0x0293;\n t['ezhreversed'] = 0x01B9;\n t['ezhtail'] = 0x01BA;\n t['f'] = 0x0066;\n t['fadeva'] = 0x095E;\n t['fagurmukhi'] = 0x0A5E;\n t['fahrenheit'] = 0x2109;\n t['fathaarabic'] = 0x064E;\n t['fathalowarabic'] = 0x064E;\n t['fathatanarabic'] = 0x064B;\n t['fbopomofo'] = 0x3108;\n t['fcircle'] = 0x24D5;\n t['fdotaccent'] = 0x1E1F;\n t['feharabic'] = 0x0641;\n t['feharmenian'] = 0x0586;\n t['fehfinalarabic'] = 0xFED2;\n t['fehinitialarabic'] = 0xFED3;\n t['fehmedialarabic'] = 0xFED4;\n t['feicoptic'] = 0x03E5;\n t['female'] = 0x2640;\n t['ff'] = 0xFB00;\n t['ffi'] = 0xFB03;\n t['ffl'] = 0xFB04;\n t['fi'] = 0xFB01;\n t['fifteencircle'] = 0x246E;\n t['fifteenparen'] = 0x2482;\n t['fifteenperiod'] = 0x2496;\n t['figuredash'] = 0x2012;\n t['filledbox'] = 0x25A0;\n t['filledrect'] = 0x25AC;\n t['finalkaf'] = 0x05DA;\n t['finalkafdagesh'] = 0xFB3A;\n t['finalkafdageshhebrew'] = 0xFB3A;\n t['finalkafhebrew'] = 0x05DA;\n t['finalmem'] = 0x05DD;\n t['finalmemhebrew'] = 0x05DD;\n t['finalnun'] = 0x05DF;\n t['finalnunhebrew'] = 0x05DF;\n t['finalpe'] = 0x05E3;\n t['finalpehebrew'] = 0x05E3;\n t['finaltsadi'] = 0x05E5;\n t['finaltsadihebrew'] = 0x05E5;\n t['firsttonechinese'] = 0x02C9;\n t['fisheye'] = 0x25C9;\n t['fitacyrillic'] = 0x0473;\n t['five'] = 0x0035;\n t['fivearabic'] = 0x0665;\n t['fivebengali'] = 0x09EB;\n t['fivecircle'] = 0x2464;\n t['fivecircleinversesansserif'] = 0x278E;\n t['fivedeva'] = 0x096B;\n t['fiveeighths'] = 0x215D;\n t['fivegujarati'] = 0x0AEB;\n t['fivegurmukhi'] = 0x0A6B;\n t['fivehackarabic'] = 0x0665;\n t['fivehangzhou'] = 0x3025;\n t['fiveideographicparen'] = 0x3224;\n t['fiveinferior'] = 0x2085;\n t['fivemonospace'] = 0xFF15;\n t['fiveoldstyle'] = 0xF735;\n t['fiveparen'] = 0x2478;\n t['fiveperiod'] = 0x248C;\n t['fivepersian'] = 0x06F5;\n t['fiveroman'] = 0x2174;\n t['fivesuperior'] = 0x2075;\n t['fivethai'] = 0x0E55;\n t['fl'] = 0xFB02;\n t['florin'] = 0x0192;\n t['fmonospace'] = 0xFF46;\n t['fmsquare'] = 0x3399;\n t['fofanthai'] = 0x0E1F;\n t['fofathai'] = 0x0E1D;\n t['fongmanthai'] = 0x0E4F;\n t['forall'] = 0x2200;\n t['four'] = 0x0034;\n t['fourarabic'] = 0x0664;\n t['fourbengali'] = 0x09EA;\n t['fourcircle'] = 0x2463;\n t['fourcircleinversesansserif'] = 0x278D;\n t['fourdeva'] = 0x096A;\n t['fourgujarati'] = 0x0AEA;\n t['fourgurmukhi'] = 0x0A6A;\n t['fourhackarabic'] = 0x0664;\n t['fourhangzhou'] = 0x3024;\n t['fourideographicparen'] = 0x3223;\n t['fourinferior'] = 0x2084;\n t['fourmonospace'] = 0xFF14;\n t['fournumeratorbengali'] = 0x09F7;\n t['fouroldstyle'] = 0xF734;\n t['fourparen'] = 0x2477;\n t['fourperiod'] = 0x248B;\n t['fourpersian'] = 0x06F4;\n t['fourroman'] = 0x2173;\n t['foursuperior'] = 0x2074;\n t['fourteencircle'] = 0x246D;\n t['fourteenparen'] = 0x2481;\n t['fourteenperiod'] = 0x2495;\n t['fourthai'] = 0x0E54;\n t['fourthtonechinese'] = 0x02CB;\n t['fparen'] = 0x24A1;\n t['fraction'] = 0x2044;\n t['franc'] = 0x20A3;\n t['g'] = 0x0067;\n t['gabengali'] = 0x0997;\n t['gacute'] = 0x01F5;\n t['gadeva'] = 0x0917;\n t['gafarabic'] = 0x06AF;\n t['gaffinalarabic'] = 0xFB93;\n t['gafinitialarabic'] = 0xFB94;\n t['gafmedialarabic'] = 0xFB95;\n t['gagujarati'] = 0x0A97;\n t['gagurmukhi'] = 0x0A17;\n t['gahiragana'] = 0x304C;\n t['gakatakana'] = 0x30AC;\n t['gamma'] = 0x03B3;\n t['gammalatinsmall'] = 0x0263;\n t['gammasuperior'] = 0x02E0;\n t['gangiacoptic'] = 0x03EB;\n t['gbopomofo'] = 0x310D;\n t['gbreve'] = 0x011F;\n t['gcaron'] = 0x01E7;\n t['gcedilla'] = 0x0123;\n t['gcircle'] = 0x24D6;\n t['gcircumflex'] = 0x011D;\n t['gcommaaccent'] = 0x0123;\n t['gdot'] = 0x0121;\n t['gdotaccent'] = 0x0121;\n t['gecyrillic'] = 0x0433;\n t['gehiragana'] = 0x3052;\n t['gekatakana'] = 0x30B2;\n t['geometricallyequal'] = 0x2251;\n t['gereshaccenthebrew'] = 0x059C;\n t['gereshhebrew'] = 0x05F3;\n t['gereshmuqdamhebrew'] = 0x059D;\n t['germandbls'] = 0x00DF;\n t['gershayimaccenthebrew'] = 0x059E;\n t['gershayimhebrew'] = 0x05F4;\n t['getamark'] = 0x3013;\n t['ghabengali'] = 0x0998;\n t['ghadarmenian'] = 0x0572;\n t['ghadeva'] = 0x0918;\n t['ghagujarati'] = 0x0A98;\n t['ghagurmukhi'] = 0x0A18;\n t['ghainarabic'] = 0x063A;\n t['ghainfinalarabic'] = 0xFECE;\n t['ghaininitialarabic'] = 0xFECF;\n t['ghainmedialarabic'] = 0xFED0;\n t['ghemiddlehookcyrillic'] = 0x0495;\n t['ghestrokecyrillic'] = 0x0493;\n t['gheupturncyrillic'] = 0x0491;\n t['ghhadeva'] = 0x095A;\n t['ghhagurmukhi'] = 0x0A5A;\n t['ghook'] = 0x0260;\n t['ghzsquare'] = 0x3393;\n t['gihiragana'] = 0x304E;\n t['gikatakana'] = 0x30AE;\n t['gimarmenian'] = 0x0563;\n t['gimel'] = 0x05D2;\n t['gimeldagesh'] = 0xFB32;\n t['gimeldageshhebrew'] = 0xFB32;\n t['gimelhebrew'] = 0x05D2;\n t['gjecyrillic'] = 0x0453;\n t['glottalinvertedstroke'] = 0x01BE;\n t['glottalstop'] = 0x0294;\n t['glottalstopinverted'] = 0x0296;\n t['glottalstopmod'] = 0x02C0;\n t['glottalstopreversed'] = 0x0295;\n t['glottalstopreversedmod'] = 0x02C1;\n t['glottalstopreversedsuperior'] = 0x02E4;\n t['glottalstopstroke'] = 0x02A1;\n t['glottalstopstrokereversed'] = 0x02A2;\n t['gmacron'] = 0x1E21;\n t['gmonospace'] = 0xFF47;\n t['gohiragana'] = 0x3054;\n t['gokatakana'] = 0x30B4;\n t['gparen'] = 0x24A2;\n t['gpasquare'] = 0x33AC;\n t['gradient'] = 0x2207;\n t['grave'] = 0x0060;\n t['gravebelowcmb'] = 0x0316;\n t['gravecmb'] = 0x0300;\n t['gravecomb'] = 0x0300;\n t['gravedeva'] = 0x0953;\n t['gravelowmod'] = 0x02CE;\n t['gravemonospace'] = 0xFF40;\n t['gravetonecmb'] = 0x0340;\n t['greater'] = 0x003E;\n t['greaterequal'] = 0x2265;\n t['greaterequalorless'] = 0x22DB;\n t['greatermonospace'] = 0xFF1E;\n t['greaterorequivalent'] = 0x2273;\n t['greaterorless'] = 0x2277;\n t['greateroverequal'] = 0x2267;\n t['greatersmall'] = 0xFE65;\n t['gscript'] = 0x0261;\n t['gstroke'] = 0x01E5;\n t['guhiragana'] = 0x3050;\n t['guillemotleft'] = 0x00AB;\n t['guillemotright'] = 0x00BB;\n t['guilsinglleft'] = 0x2039;\n t['guilsinglright'] = 0x203A;\n t['gukatakana'] = 0x30B0;\n t['guramusquare'] = 0x3318;\n t['gysquare'] = 0x33C9;\n t['h'] = 0x0068;\n t['haabkhasiancyrillic'] = 0x04A9;\n t['haaltonearabic'] = 0x06C1;\n t['habengali'] = 0x09B9;\n t['hadescendercyrillic'] = 0x04B3;\n t['hadeva'] = 0x0939;\n t['hagujarati'] = 0x0AB9;\n t['hagurmukhi'] = 0x0A39;\n t['haharabic'] = 0x062D;\n t['hahfinalarabic'] = 0xFEA2;\n t['hahinitialarabic'] = 0xFEA3;\n t['hahiragana'] = 0x306F;\n t['hahmedialarabic'] = 0xFEA4;\n t['haitusquare'] = 0x332A;\n t['hakatakana'] = 0x30CF;\n t['hakatakanahalfwidth'] = 0xFF8A;\n t['halantgurmukhi'] = 0x0A4D;\n t['hamzaarabic'] = 0x0621;\n t['hamzalowarabic'] = 0x0621;\n t['hangulfiller'] = 0x3164;\n t['hardsigncyrillic'] = 0x044A;\n t['harpoonleftbarbup'] = 0x21BC;\n t['harpoonrightbarbup'] = 0x21C0;\n t['hasquare'] = 0x33CA;\n t['hatafpatah'] = 0x05B2;\n t['hatafpatah16'] = 0x05B2;\n t['hatafpatah23'] = 0x05B2;\n t['hatafpatah2f'] = 0x05B2;\n t['hatafpatahhebrew'] = 0x05B2;\n t['hatafpatahnarrowhebrew'] = 0x05B2;\n t['hatafpatahquarterhebrew'] = 0x05B2;\n t['hatafpatahwidehebrew'] = 0x05B2;\n t['hatafqamats'] = 0x05B3;\n t['hatafqamats1b'] = 0x05B3;\n t['hatafqamats28'] = 0x05B3;\n t['hatafqamats34'] = 0x05B3;\n t['hatafqamatshebrew'] = 0x05B3;\n t['hatafqamatsnarrowhebrew'] = 0x05B3;\n t['hatafqamatsquarterhebrew'] = 0x05B3;\n t['hatafqamatswidehebrew'] = 0x05B3;\n t['hatafsegol'] = 0x05B1;\n t['hatafsegol17'] = 0x05B1;\n t['hatafsegol24'] = 0x05B1;\n t['hatafsegol30'] = 0x05B1;\n t['hatafsegolhebrew'] = 0x05B1;\n t['hatafsegolnarrowhebrew'] = 0x05B1;\n t['hatafsegolquarterhebrew'] = 0x05B1;\n t['hatafsegolwidehebrew'] = 0x05B1;\n t['hbar'] = 0x0127;\n t['hbopomofo'] = 0x310F;\n t['hbrevebelow'] = 0x1E2B;\n t['hcedilla'] = 0x1E29;\n t['hcircle'] = 0x24D7;\n t['hcircumflex'] = 0x0125;\n t['hdieresis'] = 0x1E27;\n t['hdotaccent'] = 0x1E23;\n t['hdotbelow'] = 0x1E25;\n t['he'] = 0x05D4;\n t['heart'] = 0x2665;\n t['heartsuitblack'] = 0x2665;\n t['heartsuitwhite'] = 0x2661;\n t['hedagesh'] = 0xFB34;\n t['hedageshhebrew'] = 0xFB34;\n t['hehaltonearabic'] = 0x06C1;\n t['heharabic'] = 0x0647;\n t['hehebrew'] = 0x05D4;\n t['hehfinalaltonearabic'] = 0xFBA7;\n t['hehfinalalttwoarabic'] = 0xFEEA;\n t['hehfinalarabic'] = 0xFEEA;\n t['hehhamzaabovefinalarabic'] = 0xFBA5;\n t['hehhamzaaboveisolatedarabic'] = 0xFBA4;\n t['hehinitialaltonearabic'] = 0xFBA8;\n t['hehinitialarabic'] = 0xFEEB;\n t['hehiragana'] = 0x3078;\n t['hehmedialaltonearabic'] = 0xFBA9;\n t['hehmedialarabic'] = 0xFEEC;\n t['heiseierasquare'] = 0x337B;\n t['hekatakana'] = 0x30D8;\n t['hekatakanahalfwidth'] = 0xFF8D;\n t['hekutaarusquare'] = 0x3336;\n t['henghook'] = 0x0267;\n t['herutusquare'] = 0x3339;\n t['het'] = 0x05D7;\n t['hethebrew'] = 0x05D7;\n t['hhook'] = 0x0266;\n t['hhooksuperior'] = 0x02B1;\n t['hieuhacirclekorean'] = 0x327B;\n t['hieuhaparenkorean'] = 0x321B;\n t['hieuhcirclekorean'] = 0x326D;\n t['hieuhkorean'] = 0x314E;\n t['hieuhparenkorean'] = 0x320D;\n t['hihiragana'] = 0x3072;\n t['hikatakana'] = 0x30D2;\n t['hikatakanahalfwidth'] = 0xFF8B;\n t['hiriq'] = 0x05B4;\n t['hiriq14'] = 0x05B4;\n t['hiriq21'] = 0x05B4;\n t['hiriq2d'] = 0x05B4;\n t['hiriqhebrew'] = 0x05B4;\n t['hiriqnarrowhebrew'] = 0x05B4;\n t['hiriqquarterhebrew'] = 0x05B4;\n t['hiriqwidehebrew'] = 0x05B4;\n t['hlinebelow'] = 0x1E96;\n t['hmonospace'] = 0xFF48;\n t['hoarmenian'] = 0x0570;\n t['hohipthai'] = 0x0E2B;\n t['hohiragana'] = 0x307B;\n t['hokatakana'] = 0x30DB;\n t['hokatakanahalfwidth'] = 0xFF8E;\n t['holam'] = 0x05B9;\n t['holam19'] = 0x05B9;\n t['holam26'] = 0x05B9;\n t['holam32'] = 0x05B9;\n t['holamhebrew'] = 0x05B9;\n t['holamnarrowhebrew'] = 0x05B9;\n t['holamquarterhebrew'] = 0x05B9;\n t['holamwidehebrew'] = 0x05B9;\n t['honokhukthai'] = 0x0E2E;\n t['hookabovecomb'] = 0x0309;\n t['hookcmb'] = 0x0309;\n t['hookpalatalizedbelowcmb'] = 0x0321;\n t['hookretroflexbelowcmb'] = 0x0322;\n t['hoonsquare'] = 0x3342;\n t['horicoptic'] = 0x03E9;\n t['horizontalbar'] = 0x2015;\n t['horncmb'] = 0x031B;\n t['hotsprings'] = 0x2668;\n t['house'] = 0x2302;\n t['hparen'] = 0x24A3;\n t['hsuperior'] = 0x02B0;\n t['hturned'] = 0x0265;\n t['huhiragana'] = 0x3075;\n t['huiitosquare'] = 0x3333;\n t['hukatakana'] = 0x30D5;\n t['hukatakanahalfwidth'] = 0xFF8C;\n t['hungarumlaut'] = 0x02DD;\n t['hungarumlautcmb'] = 0x030B;\n t['hv'] = 0x0195;\n t['hyphen'] = 0x002D;\n t['hypheninferior'] = 0xF6E5;\n t['hyphenmonospace'] = 0xFF0D;\n t['hyphensmall'] = 0xFE63;\n t['hyphensuperior'] = 0xF6E6;\n t['hyphentwo'] = 0x2010;\n t['i'] = 0x0069;\n t['iacute'] = 0x00ED;\n t['iacyrillic'] = 0x044F;\n t['ibengali'] = 0x0987;\n t['ibopomofo'] = 0x3127;\n t['ibreve'] = 0x012D;\n t['icaron'] = 0x01D0;\n t['icircle'] = 0x24D8;\n t['icircumflex'] = 0x00EE;\n t['icyrillic'] = 0x0456;\n t['idblgrave'] = 0x0209;\n t['ideographearthcircle'] = 0x328F;\n t['ideographfirecircle'] = 0x328B;\n t['ideographicallianceparen'] = 0x323F;\n t['ideographiccallparen'] = 0x323A;\n t['ideographiccentrecircle'] = 0x32A5;\n t['ideographicclose'] = 0x3006;\n t['ideographiccomma'] = 0x3001;\n t['ideographiccommaleft'] = 0xFF64;\n t['ideographiccongratulationparen'] = 0x3237;\n t['ideographiccorrectcircle'] = 0x32A3;\n t['ideographicearthparen'] = 0x322F;\n t['ideographicenterpriseparen'] = 0x323D;\n t['ideographicexcellentcircle'] = 0x329D;\n t['ideographicfestivalparen'] = 0x3240;\n t['ideographicfinancialcircle'] = 0x3296;\n t['ideographicfinancialparen'] = 0x3236;\n t['ideographicfireparen'] = 0x322B;\n t['ideographichaveparen'] = 0x3232;\n t['ideographichighcircle'] = 0x32A4;\n t['ideographiciterationmark'] = 0x3005;\n t['ideographiclaborcircle'] = 0x3298;\n t['ideographiclaborparen'] = 0x3238;\n t['ideographicleftcircle'] = 0x32A7;\n t['ideographiclowcircle'] = 0x32A6;\n t['ideographicmedicinecircle'] = 0x32A9;\n t['ideographicmetalparen'] = 0x322E;\n t['ideographicmoonparen'] = 0x322A;\n t['ideographicnameparen'] = 0x3234;\n t['ideographicperiod'] = 0x3002;\n t['ideographicprintcircle'] = 0x329E;\n t['ideographicreachparen'] = 0x3243;\n t['ideographicrepresentparen'] = 0x3239;\n t['ideographicresourceparen'] = 0x323E;\n t['ideographicrightcircle'] = 0x32A8;\n t['ideographicsecretcircle'] = 0x3299;\n t['ideographicselfparen'] = 0x3242;\n t['ideographicsocietyparen'] = 0x3233;\n t['ideographicspace'] = 0x3000;\n t['ideographicspecialparen'] = 0x3235;\n t['ideographicstockparen'] = 0x3231;\n t['ideographicstudyparen'] = 0x323B;\n t['ideographicsunparen'] = 0x3230;\n t['ideographicsuperviseparen'] = 0x323C;\n t['ideographicwaterparen'] = 0x322C;\n t['ideographicwoodparen'] = 0x322D;\n t['ideographiczero'] = 0x3007;\n t['ideographmetalcircle'] = 0x328E;\n t['ideographmooncircle'] = 0x328A;\n t['ideographnamecircle'] = 0x3294;\n t['ideographsuncircle'] = 0x3290;\n t['ideographwatercircle'] = 0x328C;\n t['ideographwoodcircle'] = 0x328D;\n t['ideva'] = 0x0907;\n t['idieresis'] = 0x00EF;\n t['idieresisacute'] = 0x1E2F;\n t['idieresiscyrillic'] = 0x04E5;\n t['idotbelow'] = 0x1ECB;\n t['iebrevecyrillic'] = 0x04D7;\n t['iecyrillic'] = 0x0435;\n t['ieungacirclekorean'] = 0x3275;\n t['ieungaparenkorean'] = 0x3215;\n t['ieungcirclekorean'] = 0x3267;\n t['ieungkorean'] = 0x3147;\n t['ieungparenkorean'] = 0x3207;\n t['igrave'] = 0x00EC;\n t['igujarati'] = 0x0A87;\n t['igurmukhi'] = 0x0A07;\n t['ihiragana'] = 0x3044;\n t['ihookabove'] = 0x1EC9;\n t['iibengali'] = 0x0988;\n t['iicyrillic'] = 0x0438;\n t['iideva'] = 0x0908;\n t['iigujarati'] = 0x0A88;\n t['iigurmukhi'] = 0x0A08;\n t['iimatragurmukhi'] = 0x0A40;\n t['iinvertedbreve'] = 0x020B;\n t['iishortcyrillic'] = 0x0439;\n t['iivowelsignbengali'] = 0x09C0;\n t['iivowelsigndeva'] = 0x0940;\n t['iivowelsigngujarati'] = 0x0AC0;\n t['ij'] = 0x0133;\n t['ikatakana'] = 0x30A4;\n t['ikatakanahalfwidth'] = 0xFF72;\n t['ikorean'] = 0x3163;\n t['ilde'] = 0x02DC;\n t['iluyhebrew'] = 0x05AC;\n t['imacron'] = 0x012B;\n t['imacroncyrillic'] = 0x04E3;\n t['imageorapproximatelyequal'] = 0x2253;\n t['imatragurmukhi'] = 0x0A3F;\n t['imonospace'] = 0xFF49;\n t['increment'] = 0x2206;\n t['infinity'] = 0x221E;\n t['iniarmenian'] = 0x056B;\n t['integral'] = 0x222B;\n t['integralbottom'] = 0x2321;\n t['integralbt'] = 0x2321;\n t['integralex'] = 0xF8F5;\n t['integraltop'] = 0x2320;\n t['integraltp'] = 0x2320;\n t['intersection'] = 0x2229;\n t['intisquare'] = 0x3305;\n t['invbullet'] = 0x25D8;\n t['invcircle'] = 0x25D9;\n t['invsmileface'] = 0x263B;\n t['iocyrillic'] = 0x0451;\n t['iogonek'] = 0x012F;\n t['iota'] = 0x03B9;\n t['iotadieresis'] = 0x03CA;\n t['iotadieresistonos'] = 0x0390;\n t['iotalatin'] = 0x0269;\n t['iotatonos'] = 0x03AF;\n t['iparen'] = 0x24A4;\n t['irigurmukhi'] = 0x0A72;\n t['ismallhiragana'] = 0x3043;\n t['ismallkatakana'] = 0x30A3;\n t['ismallkatakanahalfwidth'] = 0xFF68;\n t['issharbengali'] = 0x09FA;\n t['istroke'] = 0x0268;\n t['isuperior'] = 0xF6ED;\n t['iterationhiragana'] = 0x309D;\n t['iterationkatakana'] = 0x30FD;\n t['itilde'] = 0x0129;\n t['itildebelow'] = 0x1E2D;\n t['iubopomofo'] = 0x3129;\n t['iucyrillic'] = 0x044E;\n t['ivowelsignbengali'] = 0x09BF;\n t['ivowelsigndeva'] = 0x093F;\n t['ivowelsigngujarati'] = 0x0ABF;\n t['izhitsacyrillic'] = 0x0475;\n t['izhitsadblgravecyrillic'] = 0x0477;\n t['j'] = 0x006A;\n t['jaarmenian'] = 0x0571;\n t['jabengali'] = 0x099C;\n t['jadeva'] = 0x091C;\n t['jagujarati'] = 0x0A9C;\n t['jagurmukhi'] = 0x0A1C;\n t['jbopomofo'] = 0x3110;\n t['jcaron'] = 0x01F0;\n t['jcircle'] = 0x24D9;\n t['jcircumflex'] = 0x0135;\n t['jcrossedtail'] = 0x029D;\n t['jdotlessstroke'] = 0x025F;\n t['jecyrillic'] = 0x0458;\n t['jeemarabic'] = 0x062C;\n t['jeemfinalarabic'] = 0xFE9E;\n t['jeeminitialarabic'] = 0xFE9F;\n t['jeemmedialarabic'] = 0xFEA0;\n t['jeharabic'] = 0x0698;\n t['jehfinalarabic'] = 0xFB8B;\n t['jhabengali'] = 0x099D;\n t['jhadeva'] = 0x091D;\n t['jhagujarati'] = 0x0A9D;\n t['jhagurmukhi'] = 0x0A1D;\n t['jheharmenian'] = 0x057B;\n t['jis'] = 0x3004;\n t['jmonospace'] = 0xFF4A;\n t['jparen'] = 0x24A5;\n t['jsuperior'] = 0x02B2;\n t['k'] = 0x006B;\n t['kabashkircyrillic'] = 0x04A1;\n t['kabengali'] = 0x0995;\n t['kacute'] = 0x1E31;\n t['kacyrillic'] = 0x043A;\n t['kadescendercyrillic'] = 0x049B;\n t['kadeva'] = 0x0915;\n t['kaf'] = 0x05DB;\n t['kafarabic'] = 0x0643;\n t['kafdagesh'] = 0xFB3B;\n t['kafdageshhebrew'] = 0xFB3B;\n t['kaffinalarabic'] = 0xFEDA;\n t['kafhebrew'] = 0x05DB;\n t['kafinitialarabic'] = 0xFEDB;\n t['kafmedialarabic'] = 0xFEDC;\n t['kafrafehebrew'] = 0xFB4D;\n t['kagujarati'] = 0x0A95;\n t['kagurmukhi'] = 0x0A15;\n t['kahiragana'] = 0x304B;\n t['kahookcyrillic'] = 0x04C4;\n t['kakatakana'] = 0x30AB;\n t['kakatakanahalfwidth'] = 0xFF76;\n t['kappa'] = 0x03BA;\n t['kappasymbolgreek'] = 0x03F0;\n t['kapyeounmieumkorean'] = 0x3171;\n t['kapyeounphieuphkorean'] = 0x3184;\n t['kapyeounpieupkorean'] = 0x3178;\n t['kapyeounssangpieupkorean'] = 0x3179;\n t['karoriisquare'] = 0x330D;\n t['kashidaautoarabic'] = 0x0640;\n t['kashidaautonosidebearingarabic'] = 0x0640;\n t['kasmallkatakana'] = 0x30F5;\n t['kasquare'] = 0x3384;\n t['kasraarabic'] = 0x0650;\n t['kasratanarabic'] = 0x064D;\n t['kastrokecyrillic'] = 0x049F;\n t['katahiraprolongmarkhalfwidth'] = 0xFF70;\n t['kaverticalstrokecyrillic'] = 0x049D;\n t['kbopomofo'] = 0x310E;\n t['kcalsquare'] = 0x3389;\n t['kcaron'] = 0x01E9;\n t['kcedilla'] = 0x0137;\n t['kcircle'] = 0x24DA;\n t['kcommaaccent'] = 0x0137;\n t['kdotbelow'] = 0x1E33;\n t['keharmenian'] = 0x0584;\n t['kehiragana'] = 0x3051;\n t['kekatakana'] = 0x30B1;\n t['kekatakanahalfwidth'] = 0xFF79;\n t['kenarmenian'] = 0x056F;\n t['kesmallkatakana'] = 0x30F6;\n t['kgreenlandic'] = 0x0138;\n t['khabengali'] = 0x0996;\n t['khacyrillic'] = 0x0445;\n t['khadeva'] = 0x0916;\n t['khagujarati'] = 0x0A96;\n t['khagurmukhi'] = 0x0A16;\n t['khaharabic'] = 0x062E;\n t['khahfinalarabic'] = 0xFEA6;\n t['khahinitialarabic'] = 0xFEA7;\n t['khahmedialarabic'] = 0xFEA8;\n t['kheicoptic'] = 0x03E7;\n t['khhadeva'] = 0x0959;\n t['khhagurmukhi'] = 0x0A59;\n t['khieukhacirclekorean'] = 0x3278;\n t['khieukhaparenkorean'] = 0x3218;\n t['khieukhcirclekorean'] = 0x326A;\n t['khieukhkorean'] = 0x314B;\n t['khieukhparenkorean'] = 0x320A;\n t['khokhaithai'] = 0x0E02;\n t['khokhonthai'] = 0x0E05;\n t['khokhuatthai'] = 0x0E03;\n t['khokhwaithai'] = 0x0E04;\n t['khomutthai'] = 0x0E5B;\n t['khook'] = 0x0199;\n t['khorakhangthai'] = 0x0E06;\n t['khzsquare'] = 0x3391;\n t['kihiragana'] = 0x304D;\n t['kikatakana'] = 0x30AD;\n t['kikatakanahalfwidth'] = 0xFF77;\n t['kiroguramusquare'] = 0x3315;\n t['kiromeetorusquare'] = 0x3316;\n t['kirosquare'] = 0x3314;\n t['kiyeokacirclekorean'] = 0x326E;\n t['kiyeokaparenkorean'] = 0x320E;\n t['kiyeokcirclekorean'] = 0x3260;\n t['kiyeokkorean'] = 0x3131;\n t['kiyeokparenkorean'] = 0x3200;\n t['kiyeoksioskorean'] = 0x3133;\n t['kjecyrillic'] = 0x045C;\n t['klinebelow'] = 0x1E35;\n t['klsquare'] = 0x3398;\n t['kmcubedsquare'] = 0x33A6;\n t['kmonospace'] = 0xFF4B;\n t['kmsquaredsquare'] = 0x33A2;\n t['kohiragana'] = 0x3053;\n t['kohmsquare'] = 0x33C0;\n t['kokaithai'] = 0x0E01;\n t['kokatakana'] = 0x30B3;\n t['kokatakanahalfwidth'] = 0xFF7A;\n t['kooposquare'] = 0x331E;\n t['koppacyrillic'] = 0x0481;\n t['koreanstandardsymbol'] = 0x327F;\n t['koroniscmb'] = 0x0343;\n t['kparen'] = 0x24A6;\n t['kpasquare'] = 0x33AA;\n t['ksicyrillic'] = 0x046F;\n t['ktsquare'] = 0x33CF;\n t['kturned'] = 0x029E;\n t['kuhiragana'] = 0x304F;\n t['kukatakana'] = 0x30AF;\n t['kukatakanahalfwidth'] = 0xFF78;\n t['kvsquare'] = 0x33B8;\n t['kwsquare'] = 0x33BE;\n t['l'] = 0x006C;\n t['labengali'] = 0x09B2;\n t['lacute'] = 0x013A;\n t['ladeva'] = 0x0932;\n t['lagujarati'] = 0x0AB2;\n t['lagurmukhi'] = 0x0A32;\n t['lakkhangyaothai'] = 0x0E45;\n t['lamaleffinalarabic'] = 0xFEFC;\n t['lamalefhamzaabovefinalarabic'] = 0xFEF8;\n t['lamalefhamzaaboveisolatedarabic'] = 0xFEF7;\n t['lamalefhamzabelowfinalarabic'] = 0xFEFA;\n t['lamalefhamzabelowisolatedarabic'] = 0xFEF9;\n t['lamalefisolatedarabic'] = 0xFEFB;\n t['lamalefmaddaabovefinalarabic'] = 0xFEF6;\n t['lamalefmaddaaboveisolatedarabic'] = 0xFEF5;\n t['lamarabic'] = 0x0644;\n t['lambda'] = 0x03BB;\n t['lambdastroke'] = 0x019B;\n t['lamed'] = 0x05DC;\n t['lameddagesh'] = 0xFB3C;\n t['lameddageshhebrew'] = 0xFB3C;\n t['lamedhebrew'] = 0x05DC;\n t['lamfinalarabic'] = 0xFEDE;\n t['lamhahinitialarabic'] = 0xFCCA;\n t['laminitialarabic'] = 0xFEDF;\n t['lamjeeminitialarabic'] = 0xFCC9;\n t['lamkhahinitialarabic'] = 0xFCCB;\n t['lamlamhehisolatedarabic'] = 0xFDF2;\n t['lammedialarabic'] = 0xFEE0;\n t['lammeemhahinitialarabic'] = 0xFD88;\n t['lammeeminitialarabic'] = 0xFCCC;\n t['largecircle'] = 0x25EF;\n t['lbar'] = 0x019A;\n t['lbelt'] = 0x026C;\n t['lbopomofo'] = 0x310C;\n t['lcaron'] = 0x013E;\n t['lcedilla'] = 0x013C;\n t['lcircle'] = 0x24DB;\n t['lcircumflexbelow'] = 0x1E3D;\n t['lcommaaccent'] = 0x013C;\n t['ldot'] = 0x0140;\n t['ldotaccent'] = 0x0140;\n t['ldotbelow'] = 0x1E37;\n t['ldotbelowmacron'] = 0x1E39;\n t['leftangleabovecmb'] = 0x031A;\n t['lefttackbelowcmb'] = 0x0318;\n t['less'] = 0x003C;\n t['lessequal'] = 0x2264;\n t['lessequalorgreater'] = 0x22DA;\n t['lessmonospace'] = 0xFF1C;\n t['lessorequivalent'] = 0x2272;\n t['lessorgreater'] = 0x2276;\n t['lessoverequal'] = 0x2266;\n t['lesssmall'] = 0xFE64;\n t['lezh'] = 0x026E;\n t['lfblock'] = 0x258C;\n t['lhookretroflex'] = 0x026D;\n t['lira'] = 0x20A4;\n t['liwnarmenian'] = 0x056C;\n t['lj'] = 0x01C9;\n t['ljecyrillic'] = 0x0459;\n t['ll'] = 0xF6C0;\n t['lladeva'] = 0x0933;\n t['llagujarati'] = 0x0AB3;\n t['llinebelow'] = 0x1E3B;\n t['llladeva'] = 0x0934;\n t['llvocalicbengali'] = 0x09E1;\n t['llvocalicdeva'] = 0x0961;\n t['llvocalicvowelsignbengali'] = 0x09E3;\n t['llvocalicvowelsigndeva'] = 0x0963;\n t['lmiddletilde'] = 0x026B;\n t['lmonospace'] = 0xFF4C;\n t['lmsquare'] = 0x33D0;\n t['lochulathai'] = 0x0E2C;\n t['logicaland'] = 0x2227;\n t['logicalnot'] = 0x00AC;\n t['logicalnotreversed'] = 0x2310;\n t['logicalor'] = 0x2228;\n t['lolingthai'] = 0x0E25;\n t['longs'] = 0x017F;\n t['lowlinecenterline'] = 0xFE4E;\n t['lowlinecmb'] = 0x0332;\n t['lowlinedashed'] = 0xFE4D;\n t['lozenge'] = 0x25CA;\n t['lparen'] = 0x24A7;\n t['lslash'] = 0x0142;\n t['lsquare'] = 0x2113;\n t['lsuperior'] = 0xF6EE;\n t['ltshade'] = 0x2591;\n t['luthai'] = 0x0E26;\n t['lvocalicbengali'] = 0x098C;\n t['lvocalicdeva'] = 0x090C;\n t['lvocalicvowelsignbengali'] = 0x09E2;\n t['lvocalicvowelsigndeva'] = 0x0962;\n t['lxsquare'] = 0x33D3;\n t['m'] = 0x006D;\n t['mabengali'] = 0x09AE;\n t['macron'] = 0x00AF;\n t['macronbelowcmb'] = 0x0331;\n t['macroncmb'] = 0x0304;\n t['macronlowmod'] = 0x02CD;\n t['macronmonospace'] = 0xFFE3;\n t['macute'] = 0x1E3F;\n t['madeva'] = 0x092E;\n t['magujarati'] = 0x0AAE;\n t['magurmukhi'] = 0x0A2E;\n t['mahapakhhebrew'] = 0x05A4;\n t['mahapakhlefthebrew'] = 0x05A4;\n t['mahiragana'] = 0x307E;\n t['maichattawalowleftthai'] = 0xF895;\n t['maichattawalowrightthai'] = 0xF894;\n t['maichattawathai'] = 0x0E4B;\n t['maichattawaupperleftthai'] = 0xF893;\n t['maieklowleftthai'] = 0xF88C;\n t['maieklowrightthai'] = 0xF88B;\n t['maiekthai'] = 0x0E48;\n t['maiekupperleftthai'] = 0xF88A;\n t['maihanakatleftthai'] = 0xF884;\n t['maihanakatthai'] = 0x0E31;\n t['maitaikhuleftthai'] = 0xF889;\n t['maitaikhuthai'] = 0x0E47;\n t['maitholowleftthai'] = 0xF88F;\n t['maitholowrightthai'] = 0xF88E;\n t['maithothai'] = 0x0E49;\n t['maithoupperleftthai'] = 0xF88D;\n t['maitrilowleftthai'] = 0xF892;\n t['maitrilowrightthai'] = 0xF891;\n t['maitrithai'] = 0x0E4A;\n t['maitriupperleftthai'] = 0xF890;\n t['maiyamokthai'] = 0x0E46;\n t['makatakana'] = 0x30DE;\n t['makatakanahalfwidth'] = 0xFF8F;\n t['male'] = 0x2642;\n t['mansyonsquare'] = 0x3347;\n t['maqafhebrew'] = 0x05BE;\n t['mars'] = 0x2642;\n t['masoracirclehebrew'] = 0x05AF;\n t['masquare'] = 0x3383;\n t['mbopomofo'] = 0x3107;\n t['mbsquare'] = 0x33D4;\n t['mcircle'] = 0x24DC;\n t['mcubedsquare'] = 0x33A5;\n t['mdotaccent'] = 0x1E41;\n t['mdotbelow'] = 0x1E43;\n t['meemarabic'] = 0x0645;\n t['meemfinalarabic'] = 0xFEE2;\n t['meeminitialarabic'] = 0xFEE3;\n t['meemmedialarabic'] = 0xFEE4;\n t['meemmeeminitialarabic'] = 0xFCD1;\n t['meemmeemisolatedarabic'] = 0xFC48;\n t['meetorusquare'] = 0x334D;\n t['mehiragana'] = 0x3081;\n t['meizierasquare'] = 0x337E;\n t['mekatakana'] = 0x30E1;\n t['mekatakanahalfwidth'] = 0xFF92;\n t['mem'] = 0x05DE;\n t['memdagesh'] = 0xFB3E;\n t['memdageshhebrew'] = 0xFB3E;\n t['memhebrew'] = 0x05DE;\n t['menarmenian'] = 0x0574;\n t['merkhahebrew'] = 0x05A5;\n t['merkhakefulahebrew'] = 0x05A6;\n t['merkhakefulalefthebrew'] = 0x05A6;\n t['merkhalefthebrew'] = 0x05A5;\n t['mhook'] = 0x0271;\n t['mhzsquare'] = 0x3392;\n t['middledotkatakanahalfwidth'] = 0xFF65;\n t['middot'] = 0x00B7;\n t['mieumacirclekorean'] = 0x3272;\n t['mieumaparenkorean'] = 0x3212;\n t['mieumcirclekorean'] = 0x3264;\n t['mieumkorean'] = 0x3141;\n t['mieumpansioskorean'] = 0x3170;\n t['mieumparenkorean'] = 0x3204;\n t['mieumpieupkorean'] = 0x316E;\n t['mieumsioskorean'] = 0x316F;\n t['mihiragana'] = 0x307F;\n t['mikatakana'] = 0x30DF;\n t['mikatakanahalfwidth'] = 0xFF90;\n t['minus'] = 0x2212;\n t['minusbelowcmb'] = 0x0320;\n t['minuscircle'] = 0x2296;\n t['minusmod'] = 0x02D7;\n t['minusplus'] = 0x2213;\n t['minute'] = 0x2032;\n t['miribaarusquare'] = 0x334A;\n t['mirisquare'] = 0x3349;\n t['mlonglegturned'] = 0x0270;\n t['mlsquare'] = 0x3396;\n t['mmcubedsquare'] = 0x33A3;\n t['mmonospace'] = 0xFF4D;\n t['mmsquaredsquare'] = 0x339F;\n t['mohiragana'] = 0x3082;\n t['mohmsquare'] = 0x33C1;\n t['mokatakana'] = 0x30E2;\n t['mokatakanahalfwidth'] = 0xFF93;\n t['molsquare'] = 0x33D6;\n t['momathai'] = 0x0E21;\n t['moverssquare'] = 0x33A7;\n t['moverssquaredsquare'] = 0x33A8;\n t['mparen'] = 0x24A8;\n t['mpasquare'] = 0x33AB;\n t['mssquare'] = 0x33B3;\n t['msuperior'] = 0xF6EF;\n t['mturned'] = 0x026F;\n t['mu'] = 0x00B5;\n t['mu1'] = 0x00B5;\n t['muasquare'] = 0x3382;\n t['muchgreater'] = 0x226B;\n t['muchless'] = 0x226A;\n t['mufsquare'] = 0x338C;\n t['mugreek'] = 0x03BC;\n t['mugsquare'] = 0x338D;\n t['muhiragana'] = 0x3080;\n t['mukatakana'] = 0x30E0;\n t['mukatakanahalfwidth'] = 0xFF91;\n t['mulsquare'] = 0x3395;\n t['multiply'] = 0x00D7;\n t['mumsquare'] = 0x339B;\n t['munahhebrew'] = 0x05A3;\n t['munahlefthebrew'] = 0x05A3;\n t['musicalnote'] = 0x266A;\n t['musicalnotedbl'] = 0x266B;\n t['musicflatsign'] = 0x266D;\n t['musicsharpsign'] = 0x266F;\n t['mussquare'] = 0x33B2;\n t['muvsquare'] = 0x33B6;\n t['muwsquare'] = 0x33BC;\n t['mvmegasquare'] = 0x33B9;\n t['mvsquare'] = 0x33B7;\n t['mwmegasquare'] = 0x33BF;\n t['mwsquare'] = 0x33BD;\n t['n'] = 0x006E;\n t['nabengali'] = 0x09A8;\n t['nabla'] = 0x2207;\n t['nacute'] = 0x0144;\n t['nadeva'] = 0x0928;\n t['nagujarati'] = 0x0AA8;\n t['nagurmukhi'] = 0x0A28;\n t['nahiragana'] = 0x306A;\n t['nakatakana'] = 0x30CA;\n t['nakatakanahalfwidth'] = 0xFF85;\n t['napostrophe'] = 0x0149;\n t['nasquare'] = 0x3381;\n t['nbopomofo'] = 0x310B;\n t['nbspace'] = 0x00A0;\n t['ncaron'] = 0x0148;\n t['ncedilla'] = 0x0146;\n t['ncircle'] = 0x24DD;\n t['ncircumflexbelow'] = 0x1E4B;\n t['ncommaaccent'] = 0x0146;\n t['ndotaccent'] = 0x1E45;\n t['ndotbelow'] = 0x1E47;\n t['nehiragana'] = 0x306D;\n t['nekatakana'] = 0x30CD;\n t['nekatakanahalfwidth'] = 0xFF88;\n t['newsheqelsign'] = 0x20AA;\n t['nfsquare'] = 0x338B;\n t['ngabengali'] = 0x0999;\n t['ngadeva'] = 0x0919;\n t['ngagujarati'] = 0x0A99;\n t['ngagurmukhi'] = 0x0A19;\n t['ngonguthai'] = 0x0E07;\n t['nhiragana'] = 0x3093;\n t['nhookleft'] = 0x0272;\n t['nhookretroflex'] = 0x0273;\n t['nieunacirclekorean'] = 0x326F;\n t['nieunaparenkorean'] = 0x320F;\n t['nieuncieuckorean'] = 0x3135;\n t['nieuncirclekorean'] = 0x3261;\n t['nieunhieuhkorean'] = 0x3136;\n t['nieunkorean'] = 0x3134;\n t['nieunpansioskorean'] = 0x3168;\n t['nieunparenkorean'] = 0x3201;\n t['nieunsioskorean'] = 0x3167;\n t['nieuntikeutkorean'] = 0x3166;\n t['nihiragana'] = 0x306B;\n t['nikatakana'] = 0x30CB;\n t['nikatakanahalfwidth'] = 0xFF86;\n t['nikhahitleftthai'] = 0xF899;\n t['nikhahitthai'] = 0x0E4D;\n t['nine'] = 0x0039;\n t['ninearabic'] = 0x0669;\n t['ninebengali'] = 0x09EF;\n t['ninecircle'] = 0x2468;\n t['ninecircleinversesansserif'] = 0x2792;\n t['ninedeva'] = 0x096F;\n t['ninegujarati'] = 0x0AEF;\n t['ninegurmukhi'] = 0x0A6F;\n t['ninehackarabic'] = 0x0669;\n t['ninehangzhou'] = 0x3029;\n t['nineideographicparen'] = 0x3228;\n t['nineinferior'] = 0x2089;\n t['ninemonospace'] = 0xFF19;\n t['nineoldstyle'] = 0xF739;\n t['nineparen'] = 0x247C;\n t['nineperiod'] = 0x2490;\n t['ninepersian'] = 0x06F9;\n t['nineroman'] = 0x2178;\n t['ninesuperior'] = 0x2079;\n t['nineteencircle'] = 0x2472;\n t['nineteenparen'] = 0x2486;\n t['nineteenperiod'] = 0x249A;\n t['ninethai'] = 0x0E59;\n t['nj'] = 0x01CC;\n t['njecyrillic'] = 0x045A;\n t['nkatakana'] = 0x30F3;\n t['nkatakanahalfwidth'] = 0xFF9D;\n t['nlegrightlong'] = 0x019E;\n t['nlinebelow'] = 0x1E49;\n t['nmonospace'] = 0xFF4E;\n t['nmsquare'] = 0x339A;\n t['nnabengali'] = 0x09A3;\n t['nnadeva'] = 0x0923;\n t['nnagujarati'] = 0x0AA3;\n t['nnagurmukhi'] = 0x0A23;\n t['nnnadeva'] = 0x0929;\n t['nohiragana'] = 0x306E;\n t['nokatakana'] = 0x30CE;\n t['nokatakanahalfwidth'] = 0xFF89;\n t['nonbreakingspace'] = 0x00A0;\n t['nonenthai'] = 0x0E13;\n t['nonuthai'] = 0x0E19;\n t['noonarabic'] = 0x0646;\n t['noonfinalarabic'] = 0xFEE6;\n t['noonghunnaarabic'] = 0x06BA;\n t['noonghunnafinalarabic'] = 0xFB9F;\n t['nooninitialarabic'] = 0xFEE7;\n t['noonjeeminitialarabic'] = 0xFCD2;\n t['noonjeemisolatedarabic'] = 0xFC4B;\n t['noonmedialarabic'] = 0xFEE8;\n t['noonmeeminitialarabic'] = 0xFCD5;\n t['noonmeemisolatedarabic'] = 0xFC4E;\n t['noonnoonfinalarabic'] = 0xFC8D;\n t['notcontains'] = 0x220C;\n t['notelement'] = 0x2209;\n t['notelementof'] = 0x2209;\n t['notequal'] = 0x2260;\n t['notgreater'] = 0x226F;\n t['notgreaternorequal'] = 0x2271;\n t['notgreaternorless'] = 0x2279;\n t['notidentical'] = 0x2262;\n t['notless'] = 0x226E;\n t['notlessnorequal'] = 0x2270;\n t['notparallel'] = 0x2226;\n t['notprecedes'] = 0x2280;\n t['notsubset'] = 0x2284;\n t['notsucceeds'] = 0x2281;\n t['notsuperset'] = 0x2285;\n t['nowarmenian'] = 0x0576;\n t['nparen'] = 0x24A9;\n t['nssquare'] = 0x33B1;\n t['nsuperior'] = 0x207F;\n t['ntilde'] = 0x00F1;\n t['nu'] = 0x03BD;\n t['nuhiragana'] = 0x306C;\n t['nukatakana'] = 0x30CC;\n t['nukatakanahalfwidth'] = 0xFF87;\n t['nuktabengali'] = 0x09BC;\n t['nuktadeva'] = 0x093C;\n t['nuktagujarati'] = 0x0ABC;\n t['nuktagurmukhi'] = 0x0A3C;\n t['numbersign'] = 0x0023;\n t['numbersignmonospace'] = 0xFF03;\n t['numbersignsmall'] = 0xFE5F;\n t['numeralsigngreek'] = 0x0374;\n t['numeralsignlowergreek'] = 0x0375;\n t['numero'] = 0x2116;\n t['nun'] = 0x05E0;\n t['nundagesh'] = 0xFB40;\n t['nundageshhebrew'] = 0xFB40;\n t['nunhebrew'] = 0x05E0;\n t['nvsquare'] = 0x33B5;\n t['nwsquare'] = 0x33BB;\n t['nyabengali'] = 0x099E;\n t['nyadeva'] = 0x091E;\n t['nyagujarati'] = 0x0A9E;\n t['nyagurmukhi'] = 0x0A1E;\n t['o'] = 0x006F;\n t['oacute'] = 0x00F3;\n t['oangthai'] = 0x0E2D;\n t['obarred'] = 0x0275;\n t['obarredcyrillic'] = 0x04E9;\n t['obarreddieresiscyrillic'] = 0x04EB;\n t['obengali'] = 0x0993;\n t['obopomofo'] = 0x311B;\n t['obreve'] = 0x014F;\n t['ocandradeva'] = 0x0911;\n t['ocandragujarati'] = 0x0A91;\n t['ocandravowelsigndeva'] = 0x0949;\n t['ocandravowelsigngujarati'] = 0x0AC9;\n t['ocaron'] = 0x01D2;\n t['ocircle'] = 0x24DE;\n t['ocircumflex'] = 0x00F4;\n t['ocircumflexacute'] = 0x1ED1;\n t['ocircumflexdotbelow'] = 0x1ED9;\n t['ocircumflexgrave'] = 0x1ED3;\n t['ocircumflexhookabove'] = 0x1ED5;\n t['ocircumflextilde'] = 0x1ED7;\n t['ocyrillic'] = 0x043E;\n t['odblacute'] = 0x0151;\n t['odblgrave'] = 0x020D;\n t['odeva'] = 0x0913;\n t['odieresis'] = 0x00F6;\n t['odieresiscyrillic'] = 0x04E7;\n t['odotbelow'] = 0x1ECD;\n t['oe'] = 0x0153;\n t['oekorean'] = 0x315A;\n t['ogonek'] = 0x02DB;\n t['ogonekcmb'] = 0x0328;\n t['ograve'] = 0x00F2;\n t['ogujarati'] = 0x0A93;\n t['oharmenian'] = 0x0585;\n t['ohiragana'] = 0x304A;\n t['ohookabove'] = 0x1ECF;\n t['ohorn'] = 0x01A1;\n t['ohornacute'] = 0x1EDB;\n t['ohorndotbelow'] = 0x1EE3;\n t['ohorngrave'] = 0x1EDD;\n t['ohornhookabove'] = 0x1EDF;\n t['ohorntilde'] = 0x1EE1;\n t['ohungarumlaut'] = 0x0151;\n t['oi'] = 0x01A3;\n t['oinvertedbreve'] = 0x020F;\n t['okatakana'] = 0x30AA;\n t['okatakanahalfwidth'] = 0xFF75;\n t['okorean'] = 0x3157;\n t['olehebrew'] = 0x05AB;\n t['omacron'] = 0x014D;\n t['omacronacute'] = 0x1E53;\n t['omacrongrave'] = 0x1E51;\n t['omdeva'] = 0x0950;\n t['omega'] = 0x03C9;\n t['omega1'] = 0x03D6;\n t['omegacyrillic'] = 0x0461;\n t['omegalatinclosed'] = 0x0277;\n t['omegaroundcyrillic'] = 0x047B;\n t['omegatitlocyrillic'] = 0x047D;\n t['omegatonos'] = 0x03CE;\n t['omgujarati'] = 0x0AD0;\n t['omicron'] = 0x03BF;\n t['omicrontonos'] = 0x03CC;\n t['omonospace'] = 0xFF4F;\n t['one'] = 0x0031;\n t['onearabic'] = 0x0661;\n t['onebengali'] = 0x09E7;\n t['onecircle'] = 0x2460;\n t['onecircleinversesansserif'] = 0x278A;\n t['onedeva'] = 0x0967;\n t['onedotenleader'] = 0x2024;\n t['oneeighth'] = 0x215B;\n t['onefitted'] = 0xF6DC;\n t['onegujarati'] = 0x0AE7;\n t['onegurmukhi'] = 0x0A67;\n t['onehackarabic'] = 0x0661;\n t['onehalf'] = 0x00BD;\n t['onehangzhou'] = 0x3021;\n t['oneideographicparen'] = 0x3220;\n t['oneinferior'] = 0x2081;\n t['onemonospace'] = 0xFF11;\n t['onenumeratorbengali'] = 0x09F4;\n t['oneoldstyle'] = 0xF731;\n t['oneparen'] = 0x2474;\n t['oneperiod'] = 0x2488;\n t['onepersian'] = 0x06F1;\n t['onequarter'] = 0x00BC;\n t['oneroman'] = 0x2170;\n t['onesuperior'] = 0x00B9;\n t['onethai'] = 0x0E51;\n t['onethird'] = 0x2153;\n t['oogonek'] = 0x01EB;\n t['oogonekmacron'] = 0x01ED;\n t['oogurmukhi'] = 0x0A13;\n t['oomatragurmukhi'] = 0x0A4B;\n t['oopen'] = 0x0254;\n t['oparen'] = 0x24AA;\n t['openbullet'] = 0x25E6;\n t['option'] = 0x2325;\n t['ordfeminine'] = 0x00AA;\n t['ordmasculine'] = 0x00BA;\n t['orthogonal'] = 0x221F;\n t['oshortdeva'] = 0x0912;\n t['oshortvowelsigndeva'] = 0x094A;\n t['oslash'] = 0x00F8;\n t['oslashacute'] = 0x01FF;\n t['osmallhiragana'] = 0x3049;\n t['osmallkatakana'] = 0x30A9;\n t['osmallkatakanahalfwidth'] = 0xFF6B;\n t['ostrokeacute'] = 0x01FF;\n t['osuperior'] = 0xF6F0;\n t['otcyrillic'] = 0x047F;\n t['otilde'] = 0x00F5;\n t['otildeacute'] = 0x1E4D;\n t['otildedieresis'] = 0x1E4F;\n t['oubopomofo'] = 0x3121;\n t['overline'] = 0x203E;\n t['overlinecenterline'] = 0xFE4A;\n t['overlinecmb'] = 0x0305;\n t['overlinedashed'] = 0xFE49;\n t['overlinedblwavy'] = 0xFE4C;\n t['overlinewavy'] = 0xFE4B;\n t['overscore'] = 0x00AF;\n t['ovowelsignbengali'] = 0x09CB;\n t['ovowelsigndeva'] = 0x094B;\n t['ovowelsigngujarati'] = 0x0ACB;\n t['p'] = 0x0070;\n t['paampssquare'] = 0x3380;\n t['paasentosquare'] = 0x332B;\n t['pabengali'] = 0x09AA;\n t['pacute'] = 0x1E55;\n t['padeva'] = 0x092A;\n t['pagedown'] = 0x21DF;\n t['pageup'] = 0x21DE;\n t['pagujarati'] = 0x0AAA;\n t['pagurmukhi'] = 0x0A2A;\n t['pahiragana'] = 0x3071;\n t['paiyannoithai'] = 0x0E2F;\n t['pakatakana'] = 0x30D1;\n t['palatalizationcyrilliccmb'] = 0x0484;\n t['palochkacyrillic'] = 0x04C0;\n t['pansioskorean'] = 0x317F;\n t['paragraph'] = 0x00B6;\n t['parallel'] = 0x2225;\n t['parenleft'] = 0x0028;\n t['parenleftaltonearabic'] = 0xFD3E;\n t['parenleftbt'] = 0xF8ED;\n t['parenleftex'] = 0xF8EC;\n t['parenleftinferior'] = 0x208D;\n t['parenleftmonospace'] = 0xFF08;\n t['parenleftsmall'] = 0xFE59;\n t['parenleftsuperior'] = 0x207D;\n t['parenlefttp'] = 0xF8EB;\n t['parenleftvertical'] = 0xFE35;\n t['parenright'] = 0x0029;\n t['parenrightaltonearabic'] = 0xFD3F;\n t['parenrightbt'] = 0xF8F8;\n t['parenrightex'] = 0xF8F7;\n t['parenrightinferior'] = 0x208E;\n t['parenrightmonospace'] = 0xFF09;\n t['parenrightsmall'] = 0xFE5A;\n t['parenrightsuperior'] = 0x207E;\n t['parenrighttp'] = 0xF8F6;\n t['parenrightvertical'] = 0xFE36;\n t['partialdiff'] = 0x2202;\n t['paseqhebrew'] = 0x05C0;\n t['pashtahebrew'] = 0x0599;\n t['pasquare'] = 0x33A9;\n t['patah'] = 0x05B7;\n t['patah11'] = 0x05B7;\n t['patah1d'] = 0x05B7;\n t['patah2a'] = 0x05B7;\n t['patahhebrew'] = 0x05B7;\n t['patahnarrowhebrew'] = 0x05B7;\n t['patahquarterhebrew'] = 0x05B7;\n t['patahwidehebrew'] = 0x05B7;\n t['pazerhebrew'] = 0x05A1;\n t['pbopomofo'] = 0x3106;\n t['pcircle'] = 0x24DF;\n t['pdotaccent'] = 0x1E57;\n t['pe'] = 0x05E4;\n t['pecyrillic'] = 0x043F;\n t['pedagesh'] = 0xFB44;\n t['pedageshhebrew'] = 0xFB44;\n t['peezisquare'] = 0x333B;\n t['pefinaldageshhebrew'] = 0xFB43;\n t['peharabic'] = 0x067E;\n t['peharmenian'] = 0x057A;\n t['pehebrew'] = 0x05E4;\n t['pehfinalarabic'] = 0xFB57;\n t['pehinitialarabic'] = 0xFB58;\n t['pehiragana'] = 0x307A;\n t['pehmedialarabic'] = 0xFB59;\n t['pekatakana'] = 0x30DA;\n t['pemiddlehookcyrillic'] = 0x04A7;\n t['perafehebrew'] = 0xFB4E;\n t['percent'] = 0x0025;\n t['percentarabic'] = 0x066A;\n t['percentmonospace'] = 0xFF05;\n t['percentsmall'] = 0xFE6A;\n t['period'] = 0x002E;\n t['periodarmenian'] = 0x0589;\n t['periodcentered'] = 0x00B7;\n t['periodhalfwidth'] = 0xFF61;\n t['periodinferior'] = 0xF6E7;\n t['periodmonospace'] = 0xFF0E;\n t['periodsmall'] = 0xFE52;\n t['periodsuperior'] = 0xF6E8;\n t['perispomenigreekcmb'] = 0x0342;\n t['perpendicular'] = 0x22A5;\n t['perthousand'] = 0x2030;\n t['peseta'] = 0x20A7;\n t['pfsquare'] = 0x338A;\n t['phabengali'] = 0x09AB;\n t['phadeva'] = 0x092B;\n t['phagujarati'] = 0x0AAB;\n t['phagurmukhi'] = 0x0A2B;\n t['phi'] = 0x03C6;\n t['phi1'] = 0x03D5;\n t['phieuphacirclekorean'] = 0x327A;\n t['phieuphaparenkorean'] = 0x321A;\n t['phieuphcirclekorean'] = 0x326C;\n t['phieuphkorean'] = 0x314D;\n t['phieuphparenkorean'] = 0x320C;\n t['philatin'] = 0x0278;\n t['phinthuthai'] = 0x0E3A;\n t['phisymbolgreek'] = 0x03D5;\n t['phook'] = 0x01A5;\n t['phophanthai'] = 0x0E1E;\n t['phophungthai'] = 0x0E1C;\n t['phosamphaothai'] = 0x0E20;\n t['pi'] = 0x03C0;\n t['pieupacirclekorean'] = 0x3273;\n t['pieupaparenkorean'] = 0x3213;\n t['pieupcieuckorean'] = 0x3176;\n t['pieupcirclekorean'] = 0x3265;\n t['pieupkiyeokkorean'] = 0x3172;\n t['pieupkorean'] = 0x3142;\n t['pieupparenkorean'] = 0x3205;\n t['pieupsioskiyeokkorean'] = 0x3174;\n t['pieupsioskorean'] = 0x3144;\n t['pieupsiostikeutkorean'] = 0x3175;\n t['pieupthieuthkorean'] = 0x3177;\n t['pieuptikeutkorean'] = 0x3173;\n t['pihiragana'] = 0x3074;\n t['pikatakana'] = 0x30D4;\n t['pisymbolgreek'] = 0x03D6;\n t['piwrarmenian'] = 0x0583;\n t['plus'] = 0x002B;\n t['plusbelowcmb'] = 0x031F;\n t['pluscircle'] = 0x2295;\n t['plusminus'] = 0x00B1;\n t['plusmod'] = 0x02D6;\n t['plusmonospace'] = 0xFF0B;\n t['plussmall'] = 0xFE62;\n t['plussuperior'] = 0x207A;\n t['pmonospace'] = 0xFF50;\n t['pmsquare'] = 0x33D8;\n t['pohiragana'] = 0x307D;\n t['pointingindexdownwhite'] = 0x261F;\n t['pointingindexleftwhite'] = 0x261C;\n t['pointingindexrightwhite'] = 0x261E;\n t['pointingindexupwhite'] = 0x261D;\n t['pokatakana'] = 0x30DD;\n t['poplathai'] = 0x0E1B;\n t['postalmark'] = 0x3012;\n t['postalmarkface'] = 0x3020;\n t['pparen'] = 0x24AB;\n t['precedes'] = 0x227A;\n t['prescription'] = 0x211E;\n t['primemod'] = 0x02B9;\n t['primereversed'] = 0x2035;\n t['product'] = 0x220F;\n t['projective'] = 0x2305;\n t['prolongedkana'] = 0x30FC;\n t['propellor'] = 0x2318;\n t['propersubset'] = 0x2282;\n t['propersuperset'] = 0x2283;\n t['proportion'] = 0x2237;\n t['proportional'] = 0x221D;\n t['psi'] = 0x03C8;\n t['psicyrillic'] = 0x0471;\n t['psilipneumatacyrilliccmb'] = 0x0486;\n t['pssquare'] = 0x33B0;\n t['puhiragana'] = 0x3077;\n t['pukatakana'] = 0x30D7;\n t['pvsquare'] = 0x33B4;\n t['pwsquare'] = 0x33BA;\n t['q'] = 0x0071;\n t['qadeva'] = 0x0958;\n t['qadmahebrew'] = 0x05A8;\n t['qafarabic'] = 0x0642;\n t['qaffinalarabic'] = 0xFED6;\n t['qafinitialarabic'] = 0xFED7;\n t['qafmedialarabic'] = 0xFED8;\n t['qamats'] = 0x05B8;\n t['qamats10'] = 0x05B8;\n t['qamats1a'] = 0x05B8;\n t['qamats1c'] = 0x05B8;\n t['qamats27'] = 0x05B8;\n t['qamats29'] = 0x05B8;\n t['qamats33'] = 0x05B8;\n t['qamatsde'] = 0x05B8;\n t['qamatshebrew'] = 0x05B8;\n t['qamatsnarrowhebrew'] = 0x05B8;\n t['qamatsqatanhebrew'] = 0x05B8;\n t['qamatsqatannarrowhebrew'] = 0x05B8;\n t['qamatsqatanquarterhebrew'] = 0x05B8;\n t['qamatsqatanwidehebrew'] = 0x05B8;\n t['qamatsquarterhebrew'] = 0x05B8;\n t['qamatswidehebrew'] = 0x05B8;\n t['qarneyparahebrew'] = 0x059F;\n t['qbopomofo'] = 0x3111;\n t['qcircle'] = 0x24E0;\n t['qhook'] = 0x02A0;\n t['qmonospace'] = 0xFF51;\n t['qof'] = 0x05E7;\n t['qofdagesh'] = 0xFB47;\n t['qofdageshhebrew'] = 0xFB47;\n t['qofhebrew'] = 0x05E7;\n t['qparen'] = 0x24AC;\n t['quarternote'] = 0x2669;\n t['qubuts'] = 0x05BB;\n t['qubuts18'] = 0x05BB;\n t['qubuts25'] = 0x05BB;\n t['qubuts31'] = 0x05BB;\n t['qubutshebrew'] = 0x05BB;\n t['qubutsnarrowhebrew'] = 0x05BB;\n t['qubutsquarterhebrew'] = 0x05BB;\n t['qubutswidehebrew'] = 0x05BB;\n t['question'] = 0x003F;\n t['questionarabic'] = 0x061F;\n t['questionarmenian'] = 0x055E;\n t['questiondown'] = 0x00BF;\n t['questiondownsmall'] = 0xF7BF;\n t['questiongreek'] = 0x037E;\n t['questionmonospace'] = 0xFF1F;\n t['questionsmall'] = 0xF73F;\n t['quotedbl'] = 0x0022;\n t['quotedblbase'] = 0x201E;\n t['quotedblleft'] = 0x201C;\n t['quotedblmonospace'] = 0xFF02;\n t['quotedblprime'] = 0x301E;\n t['quotedblprimereversed'] = 0x301D;\n t['quotedblright'] = 0x201D;\n t['quoteleft'] = 0x2018;\n t['quoteleftreversed'] = 0x201B;\n t['quotereversed'] = 0x201B;\n t['quoteright'] = 0x2019;\n t['quoterightn'] = 0x0149;\n t['quotesinglbase'] = 0x201A;\n t['quotesingle'] = 0x0027;\n t['quotesinglemonospace'] = 0xFF07;\n t['r'] = 0x0072;\n t['raarmenian'] = 0x057C;\n t['rabengali'] = 0x09B0;\n t['racute'] = 0x0155;\n t['radeva'] = 0x0930;\n t['radical'] = 0x221A;\n t['radicalex'] = 0xF8E5;\n t['radoverssquare'] = 0x33AE;\n t['radoverssquaredsquare'] = 0x33AF;\n t['radsquare'] = 0x33AD;\n t['rafe'] = 0x05BF;\n t['rafehebrew'] = 0x05BF;\n t['ragujarati'] = 0x0AB0;\n t['ragurmukhi'] = 0x0A30;\n t['rahiragana'] = 0x3089;\n t['rakatakana'] = 0x30E9;\n t['rakatakanahalfwidth'] = 0xFF97;\n t['ralowerdiagonalbengali'] = 0x09F1;\n t['ramiddlediagonalbengali'] = 0x09F0;\n t['ramshorn'] = 0x0264;\n t['ratio'] = 0x2236;\n t['rbopomofo'] = 0x3116;\n t['rcaron'] = 0x0159;\n t['rcedilla'] = 0x0157;\n t['rcircle'] = 0x24E1;\n t['rcommaaccent'] = 0x0157;\n t['rdblgrave'] = 0x0211;\n t['rdotaccent'] = 0x1E59;\n t['rdotbelow'] = 0x1E5B;\n t['rdotbelowmacron'] = 0x1E5D;\n t['referencemark'] = 0x203B;\n t['reflexsubset'] = 0x2286;\n t['reflexsuperset'] = 0x2287;\n t['registered'] = 0x00AE;\n t['registersans'] = 0xF8E8;\n t['registerserif'] = 0xF6DA;\n t['reharabic'] = 0x0631;\n t['reharmenian'] = 0x0580;\n t['rehfinalarabic'] = 0xFEAE;\n t['rehiragana'] = 0x308C;\n t['rekatakana'] = 0x30EC;\n t['rekatakanahalfwidth'] = 0xFF9A;\n t['resh'] = 0x05E8;\n t['reshdageshhebrew'] = 0xFB48;\n t['reshhebrew'] = 0x05E8;\n t['reversedtilde'] = 0x223D;\n t['reviahebrew'] = 0x0597;\n t['reviamugrashhebrew'] = 0x0597;\n t['revlogicalnot'] = 0x2310;\n t['rfishhook'] = 0x027E;\n t['rfishhookreversed'] = 0x027F;\n t['rhabengali'] = 0x09DD;\n t['rhadeva'] = 0x095D;\n t['rho'] = 0x03C1;\n t['rhook'] = 0x027D;\n t['rhookturned'] = 0x027B;\n t['rhookturnedsuperior'] = 0x02B5;\n t['rhosymbolgreek'] = 0x03F1;\n t['rhotichookmod'] = 0x02DE;\n t['rieulacirclekorean'] = 0x3271;\n t['rieulaparenkorean'] = 0x3211;\n t['rieulcirclekorean'] = 0x3263;\n t['rieulhieuhkorean'] = 0x3140;\n t['rieulkiyeokkorean'] = 0x313A;\n t['rieulkiyeoksioskorean'] = 0x3169;\n t['rieulkorean'] = 0x3139;\n t['rieulmieumkorean'] = 0x313B;\n t['rieulpansioskorean'] = 0x316C;\n t['rieulparenkorean'] = 0x3203;\n t['rieulphieuphkorean'] = 0x313F;\n t['rieulpieupkorean'] = 0x313C;\n t['rieulpieupsioskorean'] = 0x316B;\n t['rieulsioskorean'] = 0x313D;\n t['rieulthieuthkorean'] = 0x313E;\n t['rieultikeutkorean'] = 0x316A;\n t['rieulyeorinhieuhkorean'] = 0x316D;\n t['rightangle'] = 0x221F;\n t['righttackbelowcmb'] = 0x0319;\n t['righttriangle'] = 0x22BF;\n t['rihiragana'] = 0x308A;\n t['rikatakana'] = 0x30EA;\n t['rikatakanahalfwidth'] = 0xFF98;\n t['ring'] = 0x02DA;\n t['ringbelowcmb'] = 0x0325;\n t['ringcmb'] = 0x030A;\n t['ringhalfleft'] = 0x02BF;\n t['ringhalfleftarmenian'] = 0x0559;\n t['ringhalfleftbelowcmb'] = 0x031C;\n t['ringhalfleftcentered'] = 0x02D3;\n t['ringhalfright'] = 0x02BE;\n t['ringhalfrightbelowcmb'] = 0x0339;\n t['ringhalfrightcentered'] = 0x02D2;\n t['rinvertedbreve'] = 0x0213;\n t['rittorusquare'] = 0x3351;\n t['rlinebelow'] = 0x1E5F;\n t['rlongleg'] = 0x027C;\n t['rlonglegturned'] = 0x027A;\n t['rmonospace'] = 0xFF52;\n t['rohiragana'] = 0x308D;\n t['rokatakana'] = 0x30ED;\n t['rokatakanahalfwidth'] = 0xFF9B;\n t['roruathai'] = 0x0E23;\n t['rparen'] = 0x24AD;\n t['rrabengali'] = 0x09DC;\n t['rradeva'] = 0x0931;\n t['rragurmukhi'] = 0x0A5C;\n t['rreharabic'] = 0x0691;\n t['rrehfinalarabic'] = 0xFB8D;\n t['rrvocalicbengali'] = 0x09E0;\n t['rrvocalicdeva'] = 0x0960;\n t['rrvocalicgujarati'] = 0x0AE0;\n t['rrvocalicvowelsignbengali'] = 0x09C4;\n t['rrvocalicvowelsigndeva'] = 0x0944;\n t['rrvocalicvowelsigngujarati'] = 0x0AC4;\n t['rsuperior'] = 0xF6F1;\n t['rtblock'] = 0x2590;\n t['rturned'] = 0x0279;\n t['rturnedsuperior'] = 0x02B4;\n t['ruhiragana'] = 0x308B;\n t['rukatakana'] = 0x30EB;\n t['rukatakanahalfwidth'] = 0xFF99;\n t['rupeemarkbengali'] = 0x09F2;\n t['rupeesignbengali'] = 0x09F3;\n t['rupiah'] = 0xF6DD;\n t['ruthai'] = 0x0E24;\n t['rvocalicbengali'] = 0x098B;\n t['rvocalicdeva'] = 0x090B;\n t['rvocalicgujarati'] = 0x0A8B;\n t['rvocalicvowelsignbengali'] = 0x09C3;\n t['rvocalicvowelsigndeva'] = 0x0943;\n t['rvocalicvowelsigngujarati'] = 0x0AC3;\n t['s'] = 0x0073;\n t['sabengali'] = 0x09B8;\n t['sacute'] = 0x015B;\n t['sacutedotaccent'] = 0x1E65;\n t['sadarabic'] = 0x0635;\n t['sadeva'] = 0x0938;\n t['sadfinalarabic'] = 0xFEBA;\n t['sadinitialarabic'] = 0xFEBB;\n t['sadmedialarabic'] = 0xFEBC;\n t['sagujarati'] = 0x0AB8;\n t['sagurmukhi'] = 0x0A38;\n t['sahiragana'] = 0x3055;\n t['sakatakana'] = 0x30B5;\n t['sakatakanahalfwidth'] = 0xFF7B;\n t['sallallahoualayhewasallamarabic'] = 0xFDFA;\n t['samekh'] = 0x05E1;\n t['samekhdagesh'] = 0xFB41;\n t['samekhdageshhebrew'] = 0xFB41;\n t['samekhhebrew'] = 0x05E1;\n t['saraaathai'] = 0x0E32;\n t['saraaethai'] = 0x0E41;\n t['saraaimaimalaithai'] = 0x0E44;\n t['saraaimaimuanthai'] = 0x0E43;\n t['saraamthai'] = 0x0E33;\n t['saraathai'] = 0x0E30;\n t['saraethai'] = 0x0E40;\n t['saraiileftthai'] = 0xF886;\n t['saraiithai'] = 0x0E35;\n t['saraileftthai'] = 0xF885;\n t['saraithai'] = 0x0E34;\n t['saraothai'] = 0x0E42;\n t['saraueeleftthai'] = 0xF888;\n t['saraueethai'] = 0x0E37;\n t['saraueleftthai'] = 0xF887;\n t['sarauethai'] = 0x0E36;\n t['sarauthai'] = 0x0E38;\n t['sarauuthai'] = 0x0E39;\n t['sbopomofo'] = 0x3119;\n t['scaron'] = 0x0161;\n t['scarondotaccent'] = 0x1E67;\n t['scedilla'] = 0x015F;\n t['schwa'] = 0x0259;\n t['schwacyrillic'] = 0x04D9;\n t['schwadieresiscyrillic'] = 0x04DB;\n t['schwahook'] = 0x025A;\n t['scircle'] = 0x24E2;\n t['scircumflex'] = 0x015D;\n t['scommaaccent'] = 0x0219;\n t['sdotaccent'] = 0x1E61;\n t['sdotbelow'] = 0x1E63;\n t['sdotbelowdotaccent'] = 0x1E69;\n t['seagullbelowcmb'] = 0x033C;\n t['second'] = 0x2033;\n t['secondtonechinese'] = 0x02CA;\n t['section'] = 0x00A7;\n t['seenarabic'] = 0x0633;\n t['seenfinalarabic'] = 0xFEB2;\n t['seeninitialarabic'] = 0xFEB3;\n t['seenmedialarabic'] = 0xFEB4;\n t['segol'] = 0x05B6;\n t['segol13'] = 0x05B6;\n t['segol1f'] = 0x05B6;\n t['segol2c'] = 0x05B6;\n t['segolhebrew'] = 0x05B6;\n t['segolnarrowhebrew'] = 0x05B6;\n t['segolquarterhebrew'] = 0x05B6;\n t['segoltahebrew'] = 0x0592;\n t['segolwidehebrew'] = 0x05B6;\n t['seharmenian'] = 0x057D;\n t['sehiragana'] = 0x305B;\n t['sekatakana'] = 0x30BB;\n t['sekatakanahalfwidth'] = 0xFF7E;\n t['semicolon'] = 0x003B;\n t['semicolonarabic'] = 0x061B;\n t['semicolonmonospace'] = 0xFF1B;\n t['semicolonsmall'] = 0xFE54;\n t['semivoicedmarkkana'] = 0x309C;\n t['semivoicedmarkkanahalfwidth'] = 0xFF9F;\n t['sentisquare'] = 0x3322;\n t['sentosquare'] = 0x3323;\n t['seven'] = 0x0037;\n t['sevenarabic'] = 0x0667;\n t['sevenbengali'] = 0x09ED;\n t['sevencircle'] = 0x2466;\n t['sevencircleinversesansserif'] = 0x2790;\n t['sevendeva'] = 0x096D;\n t['seveneighths'] = 0x215E;\n t['sevengujarati'] = 0x0AED;\n t['sevengurmukhi'] = 0x0A6D;\n t['sevenhackarabic'] = 0x0667;\n t['sevenhangzhou'] = 0x3027;\n t['sevenideographicparen'] = 0x3226;\n t['seveninferior'] = 0x2087;\n t['sevenmonospace'] = 0xFF17;\n t['sevenoldstyle'] = 0xF737;\n t['sevenparen'] = 0x247A;\n t['sevenperiod'] = 0x248E;\n t['sevenpersian'] = 0x06F7;\n t['sevenroman'] = 0x2176;\n t['sevensuperior'] = 0x2077;\n t['seventeencircle'] = 0x2470;\n t['seventeenparen'] = 0x2484;\n t['seventeenperiod'] = 0x2498;\n t['seventhai'] = 0x0E57;\n t['sfthyphen'] = 0x00AD;\n t['shaarmenian'] = 0x0577;\n t['shabengali'] = 0x09B6;\n t['shacyrillic'] = 0x0448;\n t['shaddaarabic'] = 0x0651;\n t['shaddadammaarabic'] = 0xFC61;\n t['shaddadammatanarabic'] = 0xFC5E;\n t['shaddafathaarabic'] = 0xFC60;\n t['shaddakasraarabic'] = 0xFC62;\n t['shaddakasratanarabic'] = 0xFC5F;\n t['shade'] = 0x2592;\n t['shadedark'] = 0x2593;\n t['shadelight'] = 0x2591;\n t['shademedium'] = 0x2592;\n t['shadeva'] = 0x0936;\n t['shagujarati'] = 0x0AB6;\n t['shagurmukhi'] = 0x0A36;\n t['shalshelethebrew'] = 0x0593;\n t['shbopomofo'] = 0x3115;\n t['shchacyrillic'] = 0x0449;\n t['sheenarabic'] = 0x0634;\n t['sheenfinalarabic'] = 0xFEB6;\n t['sheeninitialarabic'] = 0xFEB7;\n t['sheenmedialarabic'] = 0xFEB8;\n t['sheicoptic'] = 0x03E3;\n t['sheqel'] = 0x20AA;\n t['sheqelhebrew'] = 0x20AA;\n t['sheva'] = 0x05B0;\n t['sheva115'] = 0x05B0;\n t['sheva15'] = 0x05B0;\n t['sheva22'] = 0x05B0;\n t['sheva2e'] = 0x05B0;\n t['shevahebrew'] = 0x05B0;\n t['shevanarrowhebrew'] = 0x05B0;\n t['shevaquarterhebrew'] = 0x05B0;\n t['shevawidehebrew'] = 0x05B0;\n t['shhacyrillic'] = 0x04BB;\n t['shimacoptic'] = 0x03ED;\n t['shin'] = 0x05E9;\n t['shindagesh'] = 0xFB49;\n t['shindageshhebrew'] = 0xFB49;\n t['shindageshshindot'] = 0xFB2C;\n t['shindageshshindothebrew'] = 0xFB2C;\n t['shindageshsindot'] = 0xFB2D;\n t['shindageshsindothebrew'] = 0xFB2D;\n t['shindothebrew'] = 0x05C1;\n t['shinhebrew'] = 0x05E9;\n t['shinshindot'] = 0xFB2A;\n t['shinshindothebrew'] = 0xFB2A;\n t['shinsindot'] = 0xFB2B;\n t['shinsindothebrew'] = 0xFB2B;\n t['shook'] = 0x0282;\n t['sigma'] = 0x03C3;\n t['sigma1'] = 0x03C2;\n t['sigmafinal'] = 0x03C2;\n t['sigmalunatesymbolgreek'] = 0x03F2;\n t['sihiragana'] = 0x3057;\n t['sikatakana'] = 0x30B7;\n t['sikatakanahalfwidth'] = 0xFF7C;\n t['siluqhebrew'] = 0x05BD;\n t['siluqlefthebrew'] = 0x05BD;\n t['similar'] = 0x223C;\n t['sindothebrew'] = 0x05C2;\n t['siosacirclekorean'] = 0x3274;\n t['siosaparenkorean'] = 0x3214;\n t['sioscieuckorean'] = 0x317E;\n t['sioscirclekorean'] = 0x3266;\n t['sioskiyeokkorean'] = 0x317A;\n t['sioskorean'] = 0x3145;\n t['siosnieunkorean'] = 0x317B;\n t['siosparenkorean'] = 0x3206;\n t['siospieupkorean'] = 0x317D;\n t['siostikeutkorean'] = 0x317C;\n t['six'] = 0x0036;\n t['sixarabic'] = 0x0666;\n t['sixbengali'] = 0x09EC;\n t['sixcircle'] = 0x2465;\n t['sixcircleinversesansserif'] = 0x278F;\n t['sixdeva'] = 0x096C;\n t['sixgujarati'] = 0x0AEC;\n t['sixgurmukhi'] = 0x0A6C;\n t['sixhackarabic'] = 0x0666;\n t['sixhangzhou'] = 0x3026;\n t['sixideographicparen'] = 0x3225;\n t['sixinferior'] = 0x2086;\n t['sixmonospace'] = 0xFF16;\n t['sixoldstyle'] = 0xF736;\n t['sixparen'] = 0x2479;\n t['sixperiod'] = 0x248D;\n t['sixpersian'] = 0x06F6;\n t['sixroman'] = 0x2175;\n t['sixsuperior'] = 0x2076;\n t['sixteencircle'] = 0x246F;\n t['sixteencurrencydenominatorbengali'] = 0x09F9;\n t['sixteenparen'] = 0x2483;\n t['sixteenperiod'] = 0x2497;\n t['sixthai'] = 0x0E56;\n t['slash'] = 0x002F;\n t['slashmonospace'] = 0xFF0F;\n t['slong'] = 0x017F;\n t['slongdotaccent'] = 0x1E9B;\n t['smileface'] = 0x263A;\n t['smonospace'] = 0xFF53;\n t['sofpasuqhebrew'] = 0x05C3;\n t['softhyphen'] = 0x00AD;\n t['softsigncyrillic'] = 0x044C;\n t['sohiragana'] = 0x305D;\n t['sokatakana'] = 0x30BD;\n t['sokatakanahalfwidth'] = 0xFF7F;\n t['soliduslongoverlaycmb'] = 0x0338;\n t['solidusshortoverlaycmb'] = 0x0337;\n t['sorusithai'] = 0x0E29;\n t['sosalathai'] = 0x0E28;\n t['sosothai'] = 0x0E0B;\n t['sosuathai'] = 0x0E2A;\n t['space'] = 0x0020;\n t['spacehackarabic'] = 0x0020;\n t['spade'] = 0x2660;\n t['spadesuitblack'] = 0x2660;\n t['spadesuitwhite'] = 0x2664;\n t['sparen'] = 0x24AE;\n t['squarebelowcmb'] = 0x033B;\n t['squarecc'] = 0x33C4;\n t['squarecm'] = 0x339D;\n t['squarediagonalcrosshatchfill'] = 0x25A9;\n t['squarehorizontalfill'] = 0x25A4;\n t['squarekg'] = 0x338F;\n t['squarekm'] = 0x339E;\n t['squarekmcapital'] = 0x33CE;\n t['squareln'] = 0x33D1;\n t['squarelog'] = 0x33D2;\n t['squaremg'] = 0x338E;\n t['squaremil'] = 0x33D5;\n t['squaremm'] = 0x339C;\n t['squaremsquared'] = 0x33A1;\n t['squareorthogonalcrosshatchfill'] = 0x25A6;\n t['squareupperlefttolowerrightfill'] = 0x25A7;\n t['squareupperrighttolowerleftfill'] = 0x25A8;\n t['squareverticalfill'] = 0x25A5;\n t['squarewhitewithsmallblack'] = 0x25A3;\n t['srsquare'] = 0x33DB;\n t['ssabengali'] = 0x09B7;\n t['ssadeva'] = 0x0937;\n t['ssagujarati'] = 0x0AB7;\n t['ssangcieuckorean'] = 0x3149;\n t['ssanghieuhkorean'] = 0x3185;\n t['ssangieungkorean'] = 0x3180;\n t['ssangkiyeokkorean'] = 0x3132;\n t['ssangnieunkorean'] = 0x3165;\n t['ssangpieupkorean'] = 0x3143;\n t['ssangsioskorean'] = 0x3146;\n t['ssangtikeutkorean'] = 0x3138;\n t['ssuperior'] = 0xF6F2;\n t['sterling'] = 0x00A3;\n t['sterlingmonospace'] = 0xFFE1;\n t['strokelongoverlaycmb'] = 0x0336;\n t['strokeshortoverlaycmb'] = 0x0335;\n t['subset'] = 0x2282;\n t['subsetnotequal'] = 0x228A;\n t['subsetorequal'] = 0x2286;\n t['succeeds'] = 0x227B;\n t['suchthat'] = 0x220B;\n t['suhiragana'] = 0x3059;\n t['sukatakana'] = 0x30B9;\n t['sukatakanahalfwidth'] = 0xFF7D;\n t['sukunarabic'] = 0x0652;\n t['summation'] = 0x2211;\n t['sun'] = 0x263C;\n t['superset'] = 0x2283;\n t['supersetnotequal'] = 0x228B;\n t['supersetorequal'] = 0x2287;\n t['svsquare'] = 0x33DC;\n t['syouwaerasquare'] = 0x337C;\n t['t'] = 0x0074;\n t['tabengali'] = 0x09A4;\n t['tackdown'] = 0x22A4;\n t['tackleft'] = 0x22A3;\n t['tadeva'] = 0x0924;\n t['tagujarati'] = 0x0AA4;\n t['tagurmukhi'] = 0x0A24;\n t['taharabic'] = 0x0637;\n t['tahfinalarabic'] = 0xFEC2;\n t['tahinitialarabic'] = 0xFEC3;\n t['tahiragana'] = 0x305F;\n t['tahmedialarabic'] = 0xFEC4;\n t['taisyouerasquare'] = 0x337D;\n t['takatakana'] = 0x30BF;\n t['takatakanahalfwidth'] = 0xFF80;\n t['tatweelarabic'] = 0x0640;\n t['tau'] = 0x03C4;\n t['tav'] = 0x05EA;\n t['tavdages'] = 0xFB4A;\n t['tavdagesh'] = 0xFB4A;\n t['tavdageshhebrew'] = 0xFB4A;\n t['tavhebrew'] = 0x05EA;\n t['tbar'] = 0x0167;\n t['tbopomofo'] = 0x310A;\n t['tcaron'] = 0x0165;\n t['tccurl'] = 0x02A8;\n t['tcedilla'] = 0x0163;\n t['tcheharabic'] = 0x0686;\n t['tchehfinalarabic'] = 0xFB7B;\n t['tchehinitialarabic'] = 0xFB7C;\n t['tchehmedialarabic'] = 0xFB7D;\n t['tcircle'] = 0x24E3;\n t['tcircumflexbelow'] = 0x1E71;\n t['tcommaaccent'] = 0x0163;\n t['tdieresis'] = 0x1E97;\n t['tdotaccent'] = 0x1E6B;\n t['tdotbelow'] = 0x1E6D;\n t['tecyrillic'] = 0x0442;\n t['tedescendercyrillic'] = 0x04AD;\n t['teharabic'] = 0x062A;\n t['tehfinalarabic'] = 0xFE96;\n t['tehhahinitialarabic'] = 0xFCA2;\n t['tehhahisolatedarabic'] = 0xFC0C;\n t['tehinitialarabic'] = 0xFE97;\n t['tehiragana'] = 0x3066;\n t['tehjeeminitialarabic'] = 0xFCA1;\n t['tehjeemisolatedarabic'] = 0xFC0B;\n t['tehmarbutaarabic'] = 0x0629;\n t['tehmarbutafinalarabic'] = 0xFE94;\n t['tehmedialarabic'] = 0xFE98;\n t['tehmeeminitialarabic'] = 0xFCA4;\n t['tehmeemisolatedarabic'] = 0xFC0E;\n t['tehnoonfinalarabic'] = 0xFC73;\n t['tekatakana'] = 0x30C6;\n t['tekatakanahalfwidth'] = 0xFF83;\n t['telephone'] = 0x2121;\n t['telephoneblack'] = 0x260E;\n t['telishagedolahebrew'] = 0x05A0;\n t['telishaqetanahebrew'] = 0x05A9;\n t['tencircle'] = 0x2469;\n t['tenideographicparen'] = 0x3229;\n t['tenparen'] = 0x247D;\n t['tenperiod'] = 0x2491;\n t['tenroman'] = 0x2179;\n t['tesh'] = 0x02A7;\n t['tet'] = 0x05D8;\n t['tetdagesh'] = 0xFB38;\n t['tetdageshhebrew'] = 0xFB38;\n t['tethebrew'] = 0x05D8;\n t['tetsecyrillic'] = 0x04B5;\n t['tevirhebrew'] = 0x059B;\n t['tevirlefthebrew'] = 0x059B;\n t['thabengali'] = 0x09A5;\n t['thadeva'] = 0x0925;\n t['thagujarati'] = 0x0AA5;\n t['thagurmukhi'] = 0x0A25;\n t['thalarabic'] = 0x0630;\n t['thalfinalarabic'] = 0xFEAC;\n t['thanthakhatlowleftthai'] = 0xF898;\n t['thanthakhatlowrightthai'] = 0xF897;\n t['thanthakhatthai'] = 0x0E4C;\n t['thanthakhatupperleftthai'] = 0xF896;\n t['theharabic'] = 0x062B;\n t['thehfinalarabic'] = 0xFE9A;\n t['thehinitialarabic'] = 0xFE9B;\n t['thehmedialarabic'] = 0xFE9C;\n t['thereexists'] = 0x2203;\n t['therefore'] = 0x2234;\n t['theta'] = 0x03B8;\n t['theta1'] = 0x03D1;\n t['thetasymbolgreek'] = 0x03D1;\n t['thieuthacirclekorean'] = 0x3279;\n t['thieuthaparenkorean'] = 0x3219;\n t['thieuthcirclekorean'] = 0x326B;\n t['thieuthkorean'] = 0x314C;\n t['thieuthparenkorean'] = 0x320B;\n t['thirteencircle'] = 0x246C;\n t['thirteenparen'] = 0x2480;\n t['thirteenperiod'] = 0x2494;\n t['thonangmonthothai'] = 0x0E11;\n t['thook'] = 0x01AD;\n t['thophuthaothai'] = 0x0E12;\n t['thorn'] = 0x00FE;\n t['thothahanthai'] = 0x0E17;\n t['thothanthai'] = 0x0E10;\n t['thothongthai'] = 0x0E18;\n t['thothungthai'] = 0x0E16;\n t['thousandcyrillic'] = 0x0482;\n t['thousandsseparatorarabic'] = 0x066C;\n t['thousandsseparatorpersian'] = 0x066C;\n t['three'] = 0x0033;\n t['threearabic'] = 0x0663;\n t['threebengali'] = 0x09E9;\n t['threecircle'] = 0x2462;\n t['threecircleinversesansserif'] = 0x278C;\n t['threedeva'] = 0x0969;\n t['threeeighths'] = 0x215C;\n t['threegujarati'] = 0x0AE9;\n t['threegurmukhi'] = 0x0A69;\n t['threehackarabic'] = 0x0663;\n t['threehangzhou'] = 0x3023;\n t['threeideographicparen'] = 0x3222;\n t['threeinferior'] = 0x2083;\n t['threemonospace'] = 0xFF13;\n t['threenumeratorbengali'] = 0x09F6;\n t['threeoldstyle'] = 0xF733;\n t['threeparen'] = 0x2476;\n t['threeperiod'] = 0x248A;\n t['threepersian'] = 0x06F3;\n t['threequarters'] = 0x00BE;\n t['threequartersemdash'] = 0xF6DE;\n t['threeroman'] = 0x2172;\n t['threesuperior'] = 0x00B3;\n t['threethai'] = 0x0E53;\n t['thzsquare'] = 0x3394;\n t['tihiragana'] = 0x3061;\n t['tikatakana'] = 0x30C1;\n t['tikatakanahalfwidth'] = 0xFF81;\n t['tikeutacirclekorean'] = 0x3270;\n t['tikeutaparenkorean'] = 0x3210;\n t['tikeutcirclekorean'] = 0x3262;\n t['tikeutkorean'] = 0x3137;\n t['tikeutparenkorean'] = 0x3202;\n t['tilde'] = 0x02DC;\n t['tildebelowcmb'] = 0x0330;\n t['tildecmb'] = 0x0303;\n t['tildecomb'] = 0x0303;\n t['tildedoublecmb'] = 0x0360;\n t['tildeoperator'] = 0x223C;\n t['tildeoverlaycmb'] = 0x0334;\n t['tildeverticalcmb'] = 0x033E;\n t['timescircle'] = 0x2297;\n t['tipehahebrew'] = 0x0596;\n t['tipehalefthebrew'] = 0x0596;\n t['tippigurmukhi'] = 0x0A70;\n t['titlocyrilliccmb'] = 0x0483;\n t['tiwnarmenian'] = 0x057F;\n t['tlinebelow'] = 0x1E6F;\n t['tmonospace'] = 0xFF54;\n t['toarmenian'] = 0x0569;\n t['tohiragana'] = 0x3068;\n t['tokatakana'] = 0x30C8;\n t['tokatakanahalfwidth'] = 0xFF84;\n t['tonebarextrahighmod'] = 0x02E5;\n t['tonebarextralowmod'] = 0x02E9;\n t['tonebarhighmod'] = 0x02E6;\n t['tonebarlowmod'] = 0x02E8;\n t['tonebarmidmod'] = 0x02E7;\n t['tonefive'] = 0x01BD;\n t['tonesix'] = 0x0185;\n t['tonetwo'] = 0x01A8;\n t['tonos'] = 0x0384;\n t['tonsquare'] = 0x3327;\n t['topatakthai'] = 0x0E0F;\n t['tortoiseshellbracketleft'] = 0x3014;\n t['tortoiseshellbracketleftsmall'] = 0xFE5D;\n t['tortoiseshellbracketleftvertical'] = 0xFE39;\n t['tortoiseshellbracketright'] = 0x3015;\n t['tortoiseshellbracketrightsmall'] = 0xFE5E;\n t['tortoiseshellbracketrightvertical'] = 0xFE3A;\n t['totaothai'] = 0x0E15;\n t['tpalatalhook'] = 0x01AB;\n t['tparen'] = 0x24AF;\n t['trademark'] = 0x2122;\n t['trademarksans'] = 0xF8EA;\n t['trademarkserif'] = 0xF6DB;\n t['tretroflexhook'] = 0x0288;\n t['triagdn'] = 0x25BC;\n t['triaglf'] = 0x25C4;\n t['triagrt'] = 0x25BA;\n t['triagup'] = 0x25B2;\n t['ts'] = 0x02A6;\n t['tsadi'] = 0x05E6;\n t['tsadidagesh'] = 0xFB46;\n t['tsadidageshhebrew'] = 0xFB46;\n t['tsadihebrew'] = 0x05E6;\n t['tsecyrillic'] = 0x0446;\n t['tsere'] = 0x05B5;\n t['tsere12'] = 0x05B5;\n t['tsere1e'] = 0x05B5;\n t['tsere2b'] = 0x05B5;\n t['tserehebrew'] = 0x05B5;\n t['tserenarrowhebrew'] = 0x05B5;\n t['tserequarterhebrew'] = 0x05B5;\n t['tserewidehebrew'] = 0x05B5;\n t['tshecyrillic'] = 0x045B;\n t['tsuperior'] = 0xF6F3;\n t['ttabengali'] = 0x099F;\n t['ttadeva'] = 0x091F;\n t['ttagujarati'] = 0x0A9F;\n t['ttagurmukhi'] = 0x0A1F;\n t['tteharabic'] = 0x0679;\n t['ttehfinalarabic'] = 0xFB67;\n t['ttehinitialarabic'] = 0xFB68;\n t['ttehmedialarabic'] = 0xFB69;\n t['tthabengali'] = 0x09A0;\n t['tthadeva'] = 0x0920;\n t['tthagujarati'] = 0x0AA0;\n t['tthagurmukhi'] = 0x0A20;\n t['tturned'] = 0x0287;\n t['tuhiragana'] = 0x3064;\n t['tukatakana'] = 0x30C4;\n t['tukatakanahalfwidth'] = 0xFF82;\n t['tusmallhiragana'] = 0x3063;\n t['tusmallkatakana'] = 0x30C3;\n t['tusmallkatakanahalfwidth'] = 0xFF6F;\n t['twelvecircle'] = 0x246B;\n t['twelveparen'] = 0x247F;\n t['twelveperiod'] = 0x2493;\n t['twelveroman'] = 0x217B;\n t['twentycircle'] = 0x2473;\n t['twentyhangzhou'] = 0x5344;\n t['twentyparen'] = 0x2487;\n t['twentyperiod'] = 0x249B;\n t['two'] = 0x0032;\n t['twoarabic'] = 0x0662;\n t['twobengali'] = 0x09E8;\n t['twocircle'] = 0x2461;\n t['twocircleinversesansserif'] = 0x278B;\n t['twodeva'] = 0x0968;\n t['twodotenleader'] = 0x2025;\n t['twodotleader'] = 0x2025;\n t['twodotleadervertical'] = 0xFE30;\n t['twogujarati'] = 0x0AE8;\n t['twogurmukhi'] = 0x0A68;\n t['twohackarabic'] = 0x0662;\n t['twohangzhou'] = 0x3022;\n t['twoideographicparen'] = 0x3221;\n t['twoinferior'] = 0x2082;\n t['twomonospace'] = 0xFF12;\n t['twonumeratorbengali'] = 0x09F5;\n t['twooldstyle'] = 0xF732;\n t['twoparen'] = 0x2475;\n t['twoperiod'] = 0x2489;\n t['twopersian'] = 0x06F2;\n t['tworoman'] = 0x2171;\n t['twostroke'] = 0x01BB;\n t['twosuperior'] = 0x00B2;\n t['twothai'] = 0x0E52;\n t['twothirds'] = 0x2154;\n t['u'] = 0x0075;\n t['uacute'] = 0x00FA;\n t['ubar'] = 0x0289;\n t['ubengali'] = 0x0989;\n t['ubopomofo'] = 0x3128;\n t['ubreve'] = 0x016D;\n t['ucaron'] = 0x01D4;\n t['ucircle'] = 0x24E4;\n t['ucircumflex'] = 0x00FB;\n t['ucircumflexbelow'] = 0x1E77;\n t['ucyrillic'] = 0x0443;\n t['udattadeva'] = 0x0951;\n t['udblacute'] = 0x0171;\n t['udblgrave'] = 0x0215;\n t['udeva'] = 0x0909;\n t['udieresis'] = 0x00FC;\n t['udieresisacute'] = 0x01D8;\n t['udieresisbelow'] = 0x1E73;\n t['udieresiscaron'] = 0x01DA;\n t['udieresiscyrillic'] = 0x04F1;\n t['udieresisgrave'] = 0x01DC;\n t['udieresismacron'] = 0x01D6;\n t['udotbelow'] = 0x1EE5;\n t['ugrave'] = 0x00F9;\n t['ugujarati'] = 0x0A89;\n t['ugurmukhi'] = 0x0A09;\n t['uhiragana'] = 0x3046;\n t['uhookabove'] = 0x1EE7;\n t['uhorn'] = 0x01B0;\n t['uhornacute'] = 0x1EE9;\n t['uhorndotbelow'] = 0x1EF1;\n t['uhorngrave'] = 0x1EEB;\n t['uhornhookabove'] = 0x1EED;\n t['uhorntilde'] = 0x1EEF;\n t['uhungarumlaut'] = 0x0171;\n t['uhungarumlautcyrillic'] = 0x04F3;\n t['uinvertedbreve'] = 0x0217;\n t['ukatakana'] = 0x30A6;\n t['ukatakanahalfwidth'] = 0xFF73;\n t['ukcyrillic'] = 0x0479;\n t['ukorean'] = 0x315C;\n t['umacron'] = 0x016B;\n t['umacroncyrillic'] = 0x04EF;\n t['umacrondieresis'] = 0x1E7B;\n t['umatragurmukhi'] = 0x0A41;\n t['umonospace'] = 0xFF55;\n t['underscore'] = 0x005F;\n t['underscoredbl'] = 0x2017;\n t['underscoremonospace'] = 0xFF3F;\n t['underscorevertical'] = 0xFE33;\n t['underscorewavy'] = 0xFE4F;\n t['union'] = 0x222A;\n t['universal'] = 0x2200;\n t['uogonek'] = 0x0173;\n t['uparen'] = 0x24B0;\n t['upblock'] = 0x2580;\n t['upperdothebrew'] = 0x05C4;\n t['upsilon'] = 0x03C5;\n t['upsilondieresis'] = 0x03CB;\n t['upsilondieresistonos'] = 0x03B0;\n t['upsilonlatin'] = 0x028A;\n t['upsilontonos'] = 0x03CD;\n t['uptackbelowcmb'] = 0x031D;\n t['uptackmod'] = 0x02D4;\n t['uragurmukhi'] = 0x0A73;\n t['uring'] = 0x016F;\n t['ushortcyrillic'] = 0x045E;\n t['usmallhiragana'] = 0x3045;\n t['usmallkatakana'] = 0x30A5;\n t['usmallkatakanahalfwidth'] = 0xFF69;\n t['ustraightcyrillic'] = 0x04AF;\n t['ustraightstrokecyrillic'] = 0x04B1;\n t['utilde'] = 0x0169;\n t['utildeacute'] = 0x1E79;\n t['utildebelow'] = 0x1E75;\n t['uubengali'] = 0x098A;\n t['uudeva'] = 0x090A;\n t['uugujarati'] = 0x0A8A;\n t['uugurmukhi'] = 0x0A0A;\n t['uumatragurmukhi'] = 0x0A42;\n t['uuvowelsignbengali'] = 0x09C2;\n t['uuvowelsigndeva'] = 0x0942;\n t['uuvowelsigngujarati'] = 0x0AC2;\n t['uvowelsignbengali'] = 0x09C1;\n t['uvowelsigndeva'] = 0x0941;\n t['uvowelsigngujarati'] = 0x0AC1;\n t['v'] = 0x0076;\n t['vadeva'] = 0x0935;\n t['vagujarati'] = 0x0AB5;\n t['vagurmukhi'] = 0x0A35;\n t['vakatakana'] = 0x30F7;\n t['vav'] = 0x05D5;\n t['vavdagesh'] = 0xFB35;\n t['vavdagesh65'] = 0xFB35;\n t['vavdageshhebrew'] = 0xFB35;\n t['vavhebrew'] = 0x05D5;\n t['vavholam'] = 0xFB4B;\n t['vavholamhebrew'] = 0xFB4B;\n t['vavvavhebrew'] = 0x05F0;\n t['vavyodhebrew'] = 0x05F1;\n t['vcircle'] = 0x24E5;\n t['vdotbelow'] = 0x1E7F;\n t['vecyrillic'] = 0x0432;\n t['veharabic'] = 0x06A4;\n t['vehfinalarabic'] = 0xFB6B;\n t['vehinitialarabic'] = 0xFB6C;\n t['vehmedialarabic'] = 0xFB6D;\n t['vekatakana'] = 0x30F9;\n t['venus'] = 0x2640;\n t['verticalbar'] = 0x007C;\n t['verticallineabovecmb'] = 0x030D;\n t['verticallinebelowcmb'] = 0x0329;\n t['verticallinelowmod'] = 0x02CC;\n t['verticallinemod'] = 0x02C8;\n t['vewarmenian'] = 0x057E;\n t['vhook'] = 0x028B;\n t['vikatakana'] = 0x30F8;\n t['viramabengali'] = 0x09CD;\n t['viramadeva'] = 0x094D;\n t['viramagujarati'] = 0x0ACD;\n t['visargabengali'] = 0x0983;\n t['visargadeva'] = 0x0903;\n t['visargagujarati'] = 0x0A83;\n t['vmonospace'] = 0xFF56;\n t['voarmenian'] = 0x0578;\n t['voicediterationhiragana'] = 0x309E;\n t['voicediterationkatakana'] = 0x30FE;\n t['voicedmarkkana'] = 0x309B;\n t['voicedmarkkanahalfwidth'] = 0xFF9E;\n t['vokatakana'] = 0x30FA;\n t['vparen'] = 0x24B1;\n t['vtilde'] = 0x1E7D;\n t['vturned'] = 0x028C;\n t['vuhiragana'] = 0x3094;\n t['vukatakana'] = 0x30F4;\n t['w'] = 0x0077;\n t['wacute'] = 0x1E83;\n t['waekorean'] = 0x3159;\n t['wahiragana'] = 0x308F;\n t['wakatakana'] = 0x30EF;\n t['wakatakanahalfwidth'] = 0xFF9C;\n t['wakorean'] = 0x3158;\n t['wasmallhiragana'] = 0x308E;\n t['wasmallkatakana'] = 0x30EE;\n t['wattosquare'] = 0x3357;\n t['wavedash'] = 0x301C;\n t['wavyunderscorevertical'] = 0xFE34;\n t['wawarabic'] = 0x0648;\n t['wawfinalarabic'] = 0xFEEE;\n t['wawhamzaabovearabic'] = 0x0624;\n t['wawhamzaabovefinalarabic'] = 0xFE86;\n t['wbsquare'] = 0x33DD;\n t['wcircle'] = 0x24E6;\n t['wcircumflex'] = 0x0175;\n t['wdieresis'] = 0x1E85;\n t['wdotaccent'] = 0x1E87;\n t['wdotbelow'] = 0x1E89;\n t['wehiragana'] = 0x3091;\n t['weierstrass'] = 0x2118;\n t['wekatakana'] = 0x30F1;\n t['wekorean'] = 0x315E;\n t['weokorean'] = 0x315D;\n t['wgrave'] = 0x1E81;\n t['whitebullet'] = 0x25E6;\n t['whitecircle'] = 0x25CB;\n t['whitecircleinverse'] = 0x25D9;\n t['whitecornerbracketleft'] = 0x300E;\n t['whitecornerbracketleftvertical'] = 0xFE43;\n t['whitecornerbracketright'] = 0x300F;\n t['whitecornerbracketrightvertical'] = 0xFE44;\n t['whitediamond'] = 0x25C7;\n t['whitediamondcontainingblacksmalldiamond'] = 0x25C8;\n t['whitedownpointingsmalltriangle'] = 0x25BF;\n t['whitedownpointingtriangle'] = 0x25BD;\n t['whiteleftpointingsmalltriangle'] = 0x25C3;\n t['whiteleftpointingtriangle'] = 0x25C1;\n t['whitelenticularbracketleft'] = 0x3016;\n t['whitelenticularbracketright'] = 0x3017;\n t['whiterightpointingsmalltriangle'] = 0x25B9;\n t['whiterightpointingtriangle'] = 0x25B7;\n t['whitesmallsquare'] = 0x25AB;\n t['whitesmilingface'] = 0x263A;\n t['whitesquare'] = 0x25A1;\n t['whitestar'] = 0x2606;\n t['whitetelephone'] = 0x260F;\n t['whitetortoiseshellbracketleft'] = 0x3018;\n t['whitetortoiseshellbracketright'] = 0x3019;\n t['whiteuppointingsmalltriangle'] = 0x25B5;\n t['whiteuppointingtriangle'] = 0x25B3;\n t['wihiragana'] = 0x3090;\n t['wikatakana'] = 0x30F0;\n t['wikorean'] = 0x315F;\n t['wmonospace'] = 0xFF57;\n t['wohiragana'] = 0x3092;\n t['wokatakana'] = 0x30F2;\n t['wokatakanahalfwidth'] = 0xFF66;\n t['won'] = 0x20A9;\n t['wonmonospace'] = 0xFFE6;\n t['wowaenthai'] = 0x0E27;\n t['wparen'] = 0x24B2;\n t['wring'] = 0x1E98;\n t['wsuperior'] = 0x02B7;\n t['wturned'] = 0x028D;\n t['wynn'] = 0x01BF;\n t['x'] = 0x0078;\n t['xabovecmb'] = 0x033D;\n t['xbopomofo'] = 0x3112;\n t['xcircle'] = 0x24E7;\n t['xdieresis'] = 0x1E8D;\n t['xdotaccent'] = 0x1E8B;\n t['xeharmenian'] = 0x056D;\n t['xi'] = 0x03BE;\n t['xmonospace'] = 0xFF58;\n t['xparen'] = 0x24B3;\n t['xsuperior'] = 0x02E3;\n t['y'] = 0x0079;\n t['yaadosquare'] = 0x334E;\n t['yabengali'] = 0x09AF;\n t['yacute'] = 0x00FD;\n t['yadeva'] = 0x092F;\n t['yaekorean'] = 0x3152;\n t['yagujarati'] = 0x0AAF;\n t['yagurmukhi'] = 0x0A2F;\n t['yahiragana'] = 0x3084;\n t['yakatakana'] = 0x30E4;\n t['yakatakanahalfwidth'] = 0xFF94;\n t['yakorean'] = 0x3151;\n t['yamakkanthai'] = 0x0E4E;\n t['yasmallhiragana'] = 0x3083;\n t['yasmallkatakana'] = 0x30E3;\n t['yasmallkatakanahalfwidth'] = 0xFF6C;\n t['yatcyrillic'] = 0x0463;\n t['ycircle'] = 0x24E8;\n t['ycircumflex'] = 0x0177;\n t['ydieresis'] = 0x00FF;\n t['ydotaccent'] = 0x1E8F;\n t['ydotbelow'] = 0x1EF5;\n t['yeharabic'] = 0x064A;\n t['yehbarreearabic'] = 0x06D2;\n t['yehbarreefinalarabic'] = 0xFBAF;\n t['yehfinalarabic'] = 0xFEF2;\n t['yehhamzaabovearabic'] = 0x0626;\n t['yehhamzaabovefinalarabic'] = 0xFE8A;\n t['yehhamzaaboveinitialarabic'] = 0xFE8B;\n t['yehhamzaabovemedialarabic'] = 0xFE8C;\n t['yehinitialarabic'] = 0xFEF3;\n t['yehmedialarabic'] = 0xFEF4;\n t['yehmeeminitialarabic'] = 0xFCDD;\n t['yehmeemisolatedarabic'] = 0xFC58;\n t['yehnoonfinalarabic'] = 0xFC94;\n t['yehthreedotsbelowarabic'] = 0x06D1;\n t['yekorean'] = 0x3156;\n t['yen'] = 0x00A5;\n t['yenmonospace'] = 0xFFE5;\n t['yeokorean'] = 0x3155;\n t['yeorinhieuhkorean'] = 0x3186;\n t['yerahbenyomohebrew'] = 0x05AA;\n t['yerahbenyomolefthebrew'] = 0x05AA;\n t['yericyrillic'] = 0x044B;\n t['yerudieresiscyrillic'] = 0x04F9;\n t['yesieungkorean'] = 0x3181;\n t['yesieungpansioskorean'] = 0x3183;\n t['yesieungsioskorean'] = 0x3182;\n t['yetivhebrew'] = 0x059A;\n t['ygrave'] = 0x1EF3;\n t['yhook'] = 0x01B4;\n t['yhookabove'] = 0x1EF7;\n t['yiarmenian'] = 0x0575;\n t['yicyrillic'] = 0x0457;\n t['yikorean'] = 0x3162;\n t['yinyang'] = 0x262F;\n t['yiwnarmenian'] = 0x0582;\n t['ymonospace'] = 0xFF59;\n t['yod'] = 0x05D9;\n t['yoddagesh'] = 0xFB39;\n t['yoddageshhebrew'] = 0xFB39;\n t['yodhebrew'] = 0x05D9;\n t['yodyodhebrew'] = 0x05F2;\n t['yodyodpatahhebrew'] = 0xFB1F;\n t['yohiragana'] = 0x3088;\n t['yoikorean'] = 0x3189;\n t['yokatakana'] = 0x30E8;\n t['yokatakanahalfwidth'] = 0xFF96;\n t['yokorean'] = 0x315B;\n t['yosmallhiragana'] = 0x3087;\n t['yosmallkatakana'] = 0x30E7;\n t['yosmallkatakanahalfwidth'] = 0xFF6E;\n t['yotgreek'] = 0x03F3;\n t['yoyaekorean'] = 0x3188;\n t['yoyakorean'] = 0x3187;\n t['yoyakthai'] = 0x0E22;\n t['yoyingthai'] = 0x0E0D;\n t['yparen'] = 0x24B4;\n t['ypogegrammeni'] = 0x037A;\n t['ypogegrammenigreekcmb'] = 0x0345;\n t['yr'] = 0x01A6;\n t['yring'] = 0x1E99;\n t['ysuperior'] = 0x02B8;\n t['ytilde'] = 0x1EF9;\n t['yturned'] = 0x028E;\n t['yuhiragana'] = 0x3086;\n t['yuikorean'] = 0x318C;\n t['yukatakana'] = 0x30E6;\n t['yukatakanahalfwidth'] = 0xFF95;\n t['yukorean'] = 0x3160;\n t['yusbigcyrillic'] = 0x046B;\n t['yusbigiotifiedcyrillic'] = 0x046D;\n t['yuslittlecyrillic'] = 0x0467;\n t['yuslittleiotifiedcyrillic'] = 0x0469;\n t['yusmallhiragana'] = 0x3085;\n t['yusmallkatakana'] = 0x30E5;\n t['yusmallkatakanahalfwidth'] = 0xFF6D;\n t['yuyekorean'] = 0x318B;\n t['yuyeokorean'] = 0x318A;\n t['yyabengali'] = 0x09DF;\n t['yyadeva'] = 0x095F;\n t['z'] = 0x007A;\n t['zaarmenian'] = 0x0566;\n t['zacute'] = 0x017A;\n t['zadeva'] = 0x095B;\n t['zagurmukhi'] = 0x0A5B;\n t['zaharabic'] = 0x0638;\n t['zahfinalarabic'] = 0xFEC6;\n t['zahinitialarabic'] = 0xFEC7;\n t['zahiragana'] = 0x3056;\n t['zahmedialarabic'] = 0xFEC8;\n t['zainarabic'] = 0x0632;\n t['zainfinalarabic'] = 0xFEB0;\n t['zakatakana'] = 0x30B6;\n t['zaqefgadolhebrew'] = 0x0595;\n t['zaqefqatanhebrew'] = 0x0594;\n t['zarqahebrew'] = 0x0598;\n t['zayin'] = 0x05D6;\n t['zayindagesh'] = 0xFB36;\n t['zayindageshhebrew'] = 0xFB36;\n t['zayinhebrew'] = 0x05D6;\n t['zbopomofo'] = 0x3117;\n t['zcaron'] = 0x017E;\n t['zcircle'] = 0x24E9;\n t['zcircumflex'] = 0x1E91;\n t['zcurl'] = 0x0291;\n t['zdot'] = 0x017C;\n t['zdotaccent'] = 0x017C;\n t['zdotbelow'] = 0x1E93;\n t['zecyrillic'] = 0x0437;\n t['zedescendercyrillic'] = 0x0499;\n t['zedieresiscyrillic'] = 0x04DF;\n t['zehiragana'] = 0x305C;\n t['zekatakana'] = 0x30BC;\n t['zero'] = 0x0030;\n t['zeroarabic'] = 0x0660;\n t['zerobengali'] = 0x09E6;\n t['zerodeva'] = 0x0966;\n t['zerogujarati'] = 0x0AE6;\n t['zerogurmukhi'] = 0x0A66;\n t['zerohackarabic'] = 0x0660;\n t['zeroinferior'] = 0x2080;\n t['zeromonospace'] = 0xFF10;\n t['zerooldstyle'] = 0xF730;\n t['zeropersian'] = 0x06F0;\n t['zerosuperior'] = 0x2070;\n t['zerothai'] = 0x0E50;\n t['zerowidthjoiner'] = 0xFEFF;\n t['zerowidthnonjoiner'] = 0x200C;\n t['zerowidthspace'] = 0x200B;\n t['zeta'] = 0x03B6;\n t['zhbopomofo'] = 0x3113;\n t['zhearmenian'] = 0x056A;\n t['zhebrevecyrillic'] = 0x04C2;\n t['zhecyrillic'] = 0x0436;\n t['zhedescendercyrillic'] = 0x0497;\n t['zhedieresiscyrillic'] = 0x04DD;\n t['zihiragana'] = 0x3058;\n t['zikatakana'] = 0x30B8;\n t['zinorhebrew'] = 0x05AE;\n t['zlinebelow'] = 0x1E95;\n t['zmonospace'] = 0xFF5A;\n t['zohiragana'] = 0x305E;\n t['zokatakana'] = 0x30BE;\n t['zparen'] = 0x24B5;\n t['zretroflexhook'] = 0x0290;\n t['zstroke'] = 0x01B6;\n t['zuhiragana'] = 0x305A;\n t['zukatakana'] = 0x30BA;\n t['.notdef'] = 0x0000;\n t['angbracketleftbig'] = 0x2329;\n t['angbracketleftBig'] = 0x2329;\n t['angbracketleftbigg'] = 0x2329;\n t['angbracketleftBigg'] = 0x2329;\n t['angbracketrightBig'] = 0x232A;\n t['angbracketrightbig'] = 0x232A;\n t['angbracketrightBigg'] = 0x232A;\n t['angbracketrightbigg'] = 0x232A;\n t['arrowhookleft'] = 0x21AA;\n t['arrowhookright'] = 0x21A9;\n t['arrowlefttophalf'] = 0x21BC;\n t['arrowleftbothalf'] = 0x21BD;\n t['arrownortheast'] = 0x2197;\n t['arrownorthwest'] = 0x2196;\n t['arrowrighttophalf'] = 0x21C0;\n t['arrowrightbothalf'] = 0x21C1;\n t['arrowsoutheast'] = 0x2198;\n t['arrowsouthwest'] = 0x2199;\n t['backslashbig'] = 0x2216;\n t['backslashBig'] = 0x2216;\n t['backslashBigg'] = 0x2216;\n t['backslashbigg'] = 0x2216;\n t['bardbl'] = 0x2016;\n t['bracehtipdownleft'] = 0xFE37;\n t['bracehtipdownright'] = 0xFE37;\n t['bracehtipupleft'] = 0xFE38;\n t['bracehtipupright'] = 0xFE38;\n t['braceleftBig'] = 0x007B;\n t['braceleftbig'] = 0x007B;\n t['braceleftbigg'] = 0x007B;\n t['braceleftBigg'] = 0x007B;\n t['bracerightBig'] = 0x007D;\n t['bracerightbig'] = 0x007D;\n t['bracerightbigg'] = 0x007D;\n t['bracerightBigg'] = 0x007D;\n t['bracketleftbig'] = 0x005B;\n t['bracketleftBig'] = 0x005B;\n t['bracketleftbigg'] = 0x005B;\n t['bracketleftBigg'] = 0x005B;\n t['bracketrightBig'] = 0x005D;\n t['bracketrightbig'] = 0x005D;\n t['bracketrightbigg'] = 0x005D;\n t['bracketrightBigg'] = 0x005D;\n t['ceilingleftbig'] = 0x2308;\n t['ceilingleftBig'] = 0x2308;\n t['ceilingleftBigg'] = 0x2308;\n t['ceilingleftbigg'] = 0x2308;\n t['ceilingrightbig'] = 0x2309;\n t['ceilingrightBig'] = 0x2309;\n t['ceilingrightbigg'] = 0x2309;\n t['ceilingrightBigg'] = 0x2309;\n t['circledotdisplay'] = 0x2299;\n t['circledottext'] = 0x2299;\n t['circlemultiplydisplay'] = 0x2297;\n t['circlemultiplytext'] = 0x2297;\n t['circleplusdisplay'] = 0x2295;\n t['circleplustext'] = 0x2295;\n t['contintegraldisplay'] = 0x222E;\n t['contintegraltext'] = 0x222E;\n t['coproductdisplay'] = 0x2210;\n t['coproducttext'] = 0x2210;\n t['floorleftBig'] = 0x230A;\n t['floorleftbig'] = 0x230A;\n t['floorleftbigg'] = 0x230A;\n t['floorleftBigg'] = 0x230A;\n t['floorrightbig'] = 0x230B;\n t['floorrightBig'] = 0x230B;\n t['floorrightBigg'] = 0x230B;\n t['floorrightbigg'] = 0x230B;\n t['hatwide'] = 0x0302;\n t['hatwider'] = 0x0302;\n t['hatwidest'] = 0x0302;\n t['intercal'] = 0x1D40;\n t['integraldisplay'] = 0x222B;\n t['integraltext'] = 0x222B;\n t['intersectiondisplay'] = 0x22C2;\n t['intersectiontext'] = 0x22C2;\n t['logicalanddisplay'] = 0x2227;\n t['logicalandtext'] = 0x2227;\n t['logicalordisplay'] = 0x2228;\n t['logicalortext'] = 0x2228;\n t['parenleftBig'] = 0x0028;\n t['parenleftbig'] = 0x0028;\n t['parenleftBigg'] = 0x0028;\n t['parenleftbigg'] = 0x0028;\n t['parenrightBig'] = 0x0029;\n t['parenrightbig'] = 0x0029;\n t['parenrightBigg'] = 0x0029;\n t['parenrightbigg'] = 0x0029;\n t['prime'] = 0x2032;\n t['productdisplay'] = 0x220F;\n t['producttext'] = 0x220F;\n t['radicalbig'] = 0x221A;\n t['radicalBig'] = 0x221A;\n t['radicalBigg'] = 0x221A;\n t['radicalbigg'] = 0x221A;\n t['radicalbt'] = 0x221A;\n t['radicaltp'] = 0x221A;\n t['radicalvertex'] = 0x221A;\n t['slashbig'] = 0x002F;\n t['slashBig'] = 0x002F;\n t['slashBigg'] = 0x002F;\n t['slashbigg'] = 0x002F;\n t['summationdisplay'] = 0x2211;\n t['summationtext'] = 0x2211;\n t['tildewide'] = 0x02DC;\n t['tildewider'] = 0x02DC;\n t['tildewidest'] = 0x02DC;\n t['uniondisplay'] = 0x22C3;\n t['unionmultidisplay'] = 0x228E;\n t['unionmultitext'] = 0x228E;\n t['unionsqdisplay'] = 0x2294;\n t['unionsqtext'] = 0x2294;\n t['uniontext'] = 0x22C3;\n t['vextenddouble'] = 0x2225;\n t['vextendsingle'] = 0x2223;\n});\nvar getDingbatsGlyphsUnicode = getLookupTableFactory(function (t) {\n t['space'] = 0x0020;\n t['a1'] = 0x2701;\n t['a2'] = 0x2702;\n t['a202'] = 0x2703;\n t['a3'] = 0x2704;\n t['a4'] = 0x260E;\n t['a5'] = 0x2706;\n t['a119'] = 0x2707;\n t['a118'] = 0x2708;\n t['a117'] = 0x2709;\n t['a11'] = 0x261B;\n t['a12'] = 0x261E;\n t['a13'] = 0x270C;\n t['a14'] = 0x270D;\n t['a15'] = 0x270E;\n t['a16'] = 0x270F;\n t['a105'] = 0x2710;\n t['a17'] = 0x2711;\n t['a18'] = 0x2712;\n t['a19'] = 0x2713;\n t['a20'] = 0x2714;\n t['a21'] = 0x2715;\n t['a22'] = 0x2716;\n t['a23'] = 0x2717;\n t['a24'] = 0x2718;\n t['a25'] = 0x2719;\n t['a26'] = 0x271A;\n t['a27'] = 0x271B;\n t['a28'] = 0x271C;\n t['a6'] = 0x271D;\n t['a7'] = 0x271E;\n t['a8'] = 0x271F;\n t['a9'] = 0x2720;\n t['a10'] = 0x2721;\n t['a29'] = 0x2722;\n t['a30'] = 0x2723;\n t['a31'] = 0x2724;\n t['a32'] = 0x2725;\n t['a33'] = 0x2726;\n t['a34'] = 0x2727;\n t['a35'] = 0x2605;\n t['a36'] = 0x2729;\n t['a37'] = 0x272A;\n t['a38'] = 0x272B;\n t['a39'] = 0x272C;\n t['a40'] = 0x272D;\n t['a41'] = 0x272E;\n t['a42'] = 0x272F;\n t['a43'] = 0x2730;\n t['a44'] = 0x2731;\n t['a45'] = 0x2732;\n t['a46'] = 0x2733;\n t['a47'] = 0x2734;\n t['a48'] = 0x2735;\n t['a49'] = 0x2736;\n t['a50'] = 0x2737;\n t['a51'] = 0x2738;\n t['a52'] = 0x2739;\n t['a53'] = 0x273A;\n t['a54'] = 0x273B;\n t['a55'] = 0x273C;\n t['a56'] = 0x273D;\n t['a57'] = 0x273E;\n t['a58'] = 0x273F;\n t['a59'] = 0x2740;\n t['a60'] = 0x2741;\n t['a61'] = 0x2742;\n t['a62'] = 0x2743;\n t['a63'] = 0x2744;\n t['a64'] = 0x2745;\n t['a65'] = 0x2746;\n t['a66'] = 0x2747;\n t['a67'] = 0x2748;\n t['a68'] = 0x2749;\n t['a69'] = 0x274A;\n t['a70'] = 0x274B;\n t['a71'] = 0x25CF;\n t['a72'] = 0x274D;\n t['a73'] = 0x25A0;\n t['a74'] = 0x274F;\n t['a203'] = 0x2750;\n t['a75'] = 0x2751;\n t['a204'] = 0x2752;\n t['a76'] = 0x25B2;\n t['a77'] = 0x25BC;\n t['a78'] = 0x25C6;\n t['a79'] = 0x2756;\n t['a81'] = 0x25D7;\n t['a82'] = 0x2758;\n t['a83'] = 0x2759;\n t['a84'] = 0x275A;\n t['a97'] = 0x275B;\n t['a98'] = 0x275C;\n t['a99'] = 0x275D;\n t['a100'] = 0x275E;\n t['a101'] = 0x2761;\n t['a102'] = 0x2762;\n t['a103'] = 0x2763;\n t['a104'] = 0x2764;\n t['a106'] = 0x2765;\n t['a107'] = 0x2766;\n t['a108'] = 0x2767;\n t['a112'] = 0x2663;\n t['a111'] = 0x2666;\n t['a110'] = 0x2665;\n t['a109'] = 0x2660;\n t['a120'] = 0x2460;\n t['a121'] = 0x2461;\n t['a122'] = 0x2462;\n t['a123'] = 0x2463;\n t['a124'] = 0x2464;\n t['a125'] = 0x2465;\n t['a126'] = 0x2466;\n t['a127'] = 0x2467;\n t['a128'] = 0x2468;\n t['a129'] = 0x2469;\n t['a130'] = 0x2776;\n t['a131'] = 0x2777;\n t['a132'] = 0x2778;\n t['a133'] = 0x2779;\n t['a134'] = 0x277A;\n t['a135'] = 0x277B;\n t['a136'] = 0x277C;\n t['a137'] = 0x277D;\n t['a138'] = 0x277E;\n t['a139'] = 0x277F;\n t['a140'] = 0x2780;\n t['a141'] = 0x2781;\n t['a142'] = 0x2782;\n t['a143'] = 0x2783;\n t['a144'] = 0x2784;\n t['a145'] = 0x2785;\n t['a146'] = 0x2786;\n t['a147'] = 0x2787;\n t['a148'] = 0x2788;\n t['a149'] = 0x2789;\n t['a150'] = 0x278A;\n t['a151'] = 0x278B;\n t['a152'] = 0x278C;\n t['a153'] = 0x278D;\n t['a154'] = 0x278E;\n t['a155'] = 0x278F;\n t['a156'] = 0x2790;\n t['a157'] = 0x2791;\n t['a158'] = 0x2792;\n t['a159'] = 0x2793;\n t['a160'] = 0x2794;\n t['a161'] = 0x2192;\n t['a163'] = 0x2194;\n t['a164'] = 0x2195;\n t['a196'] = 0x2798;\n t['a165'] = 0x2799;\n t['a192'] = 0x279A;\n t['a166'] = 0x279B;\n t['a167'] = 0x279C;\n t['a168'] = 0x279D;\n t['a169'] = 0x279E;\n t['a170'] = 0x279F;\n t['a171'] = 0x27A0;\n t['a172'] = 0x27A1;\n t['a173'] = 0x27A2;\n t['a162'] = 0x27A3;\n t['a174'] = 0x27A4;\n t['a175'] = 0x27A5;\n t['a176'] = 0x27A6;\n t['a177'] = 0x27A7;\n t['a178'] = 0x27A8;\n t['a179'] = 0x27A9;\n t['a193'] = 0x27AA;\n t['a180'] = 0x27AB;\n t['a199'] = 0x27AC;\n t['a181'] = 0x27AD;\n t['a200'] = 0x27AE;\n t['a182'] = 0x27AF;\n t['a201'] = 0x27B1;\n t['a183'] = 0x27B2;\n t['a184'] = 0x27B3;\n t['a197'] = 0x27B4;\n t['a185'] = 0x27B5;\n t['a194'] = 0x27B6;\n t['a198'] = 0x27B7;\n t['a186'] = 0x27B8;\n t['a195'] = 0x27B9;\n t['a187'] = 0x27BA;\n t['a188'] = 0x27BB;\n t['a189'] = 0x27BC;\n t['a190'] = 0x27BD;\n t['a191'] = 0x27BE;\n t['a89'] = 0x2768;\n t['a90'] = 0x2769;\n t['a93'] = 0x276A;\n t['a94'] = 0x276B;\n t['a91'] = 0x276C;\n t['a92'] = 0x276D;\n t['a205'] = 0x276E;\n t['a85'] = 0x276F;\n t['a206'] = 0x2770;\n t['a86'] = 0x2771;\n t['a87'] = 0x2772;\n t['a88'] = 0x2773;\n t['a95'] = 0x2774;\n t['a96'] = 0x2775;\n t['.notdef'] = 0x0000;\n});\nexports.getGlyphsUnicode = getGlyphsUnicode;\nexports.getDingbatsGlyphsUnicode = getDingbatsGlyphsUnicode;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PostScriptCompiler = exports.PostScriptEvaluator = exports.PDFFunction = exports.isPDFFunction = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _ps_parser = __w_pdfjs_require__(33);\n\nvar PDFFunction = function PDFFunctionClosure() {\n  var CONSTRUCT_SAMPLED = 0;\n  var CONSTRUCT_INTERPOLATED = 2;\n  var CONSTRUCT_STICHED = 3;\n  var CONSTRUCT_POSTSCRIPT = 4;\n  return {\n    getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps, str) {\n      var i, ii;\n      var length = 1;\n      for (i = 0, ii = size.length; i < ii; i++) {\n        length *= size[i];\n      }\n      length *= outputSize;\n      var array = new Array(length);\n      var codeSize = 0;\n      var codeBuf = 0;\n      var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);\n      var strBytes = str.getBytes((length * bps + 7) / 8);\n      var strIdx = 0;\n      for (i = 0; i < length; i++) {\n        while (codeSize < bps) {\n          codeBuf <<= 8;\n          codeBuf |= strBytes[strIdx++];\n          codeSize += 8;\n        }\n        codeSize -= bps;\n        array[i] = (codeBuf >> codeSize) * sampleMul;\n        codeBuf &= (1 << codeSize) - 1;\n      }\n      return array;\n    },\n    getIR: function PDFFunction_getIR(xref, fn) {\n      var dict = fn.dict;\n      if (!dict) {\n        dict = fn;\n      }\n      var types = [this.constructSampled, null, this.constructInterpolated, this.constructStiched, this.constructPostScript];\n      var typeNum = dict.get('FunctionType');\n      var typeFn = types[typeNum];\n      if (!typeFn) {\n        throw new _util.FormatError('Unknown type of function');\n      }\n      return typeFn.call(this, fn, dict, xref);\n    },\n    fromIR: function PDFFunction_fromIR(IR) {\n      var type = IR[0];\n      switch (type) {\n        case CONSTRUCT_SAMPLED:\n          return this.constructSampledFromIR(IR);\n        case CONSTRUCT_INTERPOLATED:\n          return this.constructInterpolatedFromIR(IR);\n        case CONSTRUCT_STICHED:\n          return this.constructStichedFromIR(IR);\n        default:\n          return this.constructPostScriptFromIR(IR);\n      }\n    },\n    parse: function PDFFunction_parse(xref, fn) {\n      var IR = this.getIR(xref, fn);\n      return this.fromIR(IR);\n    },\n    parseArray: function PDFFunction_parseArray(xref, fnObj) {\n      if (!(0, _util.isArray)(fnObj)) {\n        return this.parse(xref, fnObj);\n      }\n      var fnArray = [];\n      for (var j = 0, jj = fnObj.length; j < jj; j++) {\n        var obj = xref.fetchIfRef(fnObj[j]);\n        fnArray.push(PDFFunction.parse(xref, obj));\n      }\n      return function (src, srcOffset, dest, destOffset) {\n        for (var i = 0, ii = fnArray.length; i < ii; i++) {\n          fnArray[i](src, srcOffset, dest, destOffset + i);\n        }\n      };\n    },\n    constructSampled: function PDFFunction_constructSampled(str, dict) {\n      function toMultiArray(arr) {\n        var inputLength = arr.length;\n        var out = [];\n        var index = 0;\n        for (var i = 0; i < inputLength; i += 2) {\n          out[index] = [arr[i], arr[i + 1]];\n          ++index;\n        }\n        return out;\n      }\n      var domain = dict.getArray('Domain');\n      var range = dict.getArray('Range');\n      if (!domain || !range) {\n        throw new _util.FormatError('No domain or range');\n      }\n      var inputSize = domain.length / 2;\n      var outputSize = range.length / 2;\n      domain = toMultiArray(domain);\n      range = toMultiArray(range);\n      var size = dict.get('Size');\n      var bps = dict.get('BitsPerSample');\n      var order = dict.get('Order') || 1;\n      if (order !== 1) {\n        (0, _util.info)('No support for cubic spline interpolation: ' + order);\n      }\n      var encode = dict.getArray('Encode');\n      if (!encode) {\n        encode = [];\n        for (var i = 0; i < inputSize; ++i) {\n          encode.push(0);\n          encode.push(size[i] - 1);\n        }\n      }\n      encode = toMultiArray(encode);\n      var decode = dict.getArray('Decode');\n      if (!decode) {\n        decode = range;\n      } else {\n        decode = toMultiArray(decode);\n      }\n      var samples = this.getSampleArray(size, outputSize, bps, str);\n      return [CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size, outputSize, Math.pow(2, bps) - 1, range];\n    },\n    constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) {\n      function interpolate(x, xmin, xmax, ymin, ymax) {\n        return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin));\n      }\n      return function constructSampledFromIRResult(src, srcOffset, dest, destOffset) {\n        var m = IR[1];\n        var domain = IR[2];\n        var encode = IR[3];\n        var decode = IR[4];\n        var samples = IR[5];\n        var size = IR[6];\n        var n = IR[7];\n        var range = IR[9];\n        var cubeVertices = 1 << m;\n        var cubeN = new Float64Array(cubeVertices);\n        var cubeVertex = new Uint32Array(cubeVertices);\n        var i, j;\n        for (j = 0; j < cubeVertices; j++) {\n          cubeN[j] = 1;\n        }\n        var k = n,\n            pos = 1;\n        for (i = 0; i < m; ++i) {\n          var domain_2i = domain[i][0];\n          var domain_2i_1 = domain[i][1];\n          var xi = Math.min(Math.max(src[srcOffset + i], domain_2i), domain_2i_1);\n          var e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]);\n          var size_i = size[i];\n          e = Math.min(Math.max(e, 0), size_i - 1);\n          var e0 = e < size_i - 1 ? Math.floor(e) : e - 1;\n          var n0 = e0 + 1 - e;\n          var n1 = e - e0;\n          var offset0 = e0 * k;\n          var offset1 = offset0 + k;\n          for (j = 0; j < cubeVertices; j++) {\n            if (j & pos) {\n              cubeN[j] *= n1;\n              cubeVertex[j] += offset1;\n            } else {\n              cubeN[j] *= n0;\n              cubeVertex[j] += offset0;\n            }\n          }\n          k *= size_i;\n          pos <<= 1;\n        }\n        for (j = 0; j < n; ++j) {\n          var rj = 0;\n          for (i = 0; i < cubeVertices; i++) {\n            rj += samples[cubeVertex[i] + j] * cubeN[i];\n          }\n          rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);\n          dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);\n        }\n      };\n    },\n    constructInterpolated: function PDFFunction_constructInterpolated(str, dict) {\n      var c0 = dict.getArray('C0') || [0];\n      var c1 = dict.getArray('C1') || [1];\n      var n = dict.get('N');\n      if (!(0, _util.isArray)(c0) || !(0, _util.isArray)(c1)) {\n        throw new _util.FormatError('Illegal dictionary for interpolated function');\n      }\n      var length = c0.length;\n      var diff = [];\n      for (var i = 0; i < length; ++i) {\n        diff.push(c1[i] - c0[i]);\n      }\n      return [CONSTRUCT_INTERPOLATED, c0, diff, n];\n    },\n    constructInterpolatedFromIR: function PDFFunction_constructInterpolatedFromIR(IR) {\n      var c0 = IR[1];\n      var diff = IR[2];\n      var n = IR[3];\n      var length = diff.length;\n      return function constructInterpolatedFromIRResult(src, srcOffset, dest, destOffset) {\n        var x = n === 1 ? src[srcOffset] : Math.pow(src[srcOffset], n);\n        for (var j = 0; j < length; ++j) {\n          dest[destOffset + j] = c0[j] + x * diff[j];\n        }\n      };\n    },\n    constructStiched: function PDFFunction_constructStiched(fn, dict, xref) {\n      var domain = dict.getArray('Domain');\n      if (!domain) {\n        throw new _util.FormatError('No domain');\n      }\n      var inputSize = domain.length / 2;\n      if (inputSize !== 1) {\n        throw new _util.FormatError('Bad domain for stiched function');\n      }\n      var fnRefs = dict.get('Functions');\n      var fns = [];\n      for (var i = 0, ii = fnRefs.length; i < ii; ++i) {\n        fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i])));\n      }\n      var bounds = dict.getArray('Bounds');\n      var encode = dict.getArray('Encode');\n      return [CONSTRUCT_STICHED, domain, bounds, encode, fns];\n    },\n    constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) {\n      var domain = IR[1];\n      var bounds = IR[2];\n      var encode = IR[3];\n      var fnsIR = IR[4];\n      var fns = [];\n      var tmpBuf = new Float32Array(1);\n      for (var i = 0, ii = fnsIR.length; i < ii; i++) {\n        fns.push(PDFFunction.fromIR(fnsIR[i]));\n      }\n      return function constructStichedFromIRResult(src, srcOffset, dest, destOffset) {\n        var clip = function constructStichedFromIRClip(v, min, max) {\n          if (v > max) {\n            v = max;\n          } else if (v < min) {\n            v = min;\n          }\n          return v;\n        };\n        var v = clip(src[srcOffset], domain[0], domain[1]);\n        for (var i = 0, ii = bounds.length; i < ii; ++i) {\n          if (v < bounds[i]) {\n            break;\n          }\n        }\n        var dmin = domain[0];\n        if (i > 0) {\n          dmin = bounds[i - 1];\n        }\n        var dmax = domain[1];\n        if (i < bounds.length) {\n          dmax = bounds[i];\n        }\n        var rmin = encode[2 * i];\n        var rmax = encode[2 * i + 1];\n        tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);\n        fns[i](tmpBuf, 0, dest, destOffset);\n      };\n    },\n    constructPostScript: function PDFFunction_constructPostScript(fn, dict, xref) {\n      var domain = dict.getArray('Domain');\n      var range = dict.getArray('Range');\n      if (!domain) {\n        throw new _util.FormatError('No domain.');\n      }\n      if (!range) {\n        throw new _util.FormatError('No range.');\n      }\n      var lexer = new _ps_parser.PostScriptLexer(fn);\n      var parser = new _ps_parser.PostScriptParser(lexer);\n      var code = parser.parse();\n      return [CONSTRUCT_POSTSCRIPT, domain, range, code];\n    },\n    constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR(IR) {\n      var domain = IR[1];\n      var range = IR[2];\n      var code = IR[3];\n      var compiled = new PostScriptCompiler().compile(code, domain, range);\n      if (compiled) {\n        return new Function('src', 'srcOffset', 'dest', 'destOffset', compiled);\n      }\n      (0, _util.info)('Unable to compile PS function');\n      var numOutputs = range.length >> 1;\n      var numInputs = domain.length >> 1;\n      var evaluator = new PostScriptEvaluator(code);\n      var cache = Object.create(null);\n      var MAX_CACHE_SIZE = 2048 * 4;\n      var cache_available = MAX_CACHE_SIZE;\n      var tmpBuf = new Float32Array(numInputs);\n      return function constructPostScriptFromIRResult(src, srcOffset, dest, destOffset) {\n        var i, value;\n        var key = '';\n        var input = tmpBuf;\n        for (i = 0; i < numInputs; i++) {\n          value = src[srcOffset + i];\n          input[i] = value;\n          key += value + '_';\n        }\n        var cachedValue = cache[key];\n        if (cachedValue !== undefined) {\n          dest.set(cachedValue, destOffset);\n          return;\n        }\n        var output = new Float32Array(numOutputs);\n        var stack = evaluator.execute(input);\n        var stackIndex = stack.length - numOutputs;\n        for (i = 0; i < numOutputs; i++) {\n          value = stack[stackIndex + i];\n          var bound = range[i * 2];\n          if (value < bound) {\n            value = bound;\n          } else {\n            bound = range[i * 2 + 1];\n            if (value > bound) {\n              value = bound;\n            }\n          }\n          output[i] = value;\n        }\n        if (cache_available > 0) {\n          cache_available--;\n          cache[key] = output;\n        }\n        dest.set(output, destOffset);\n      };\n    }\n  };\n}();\nfunction isPDFFunction(v) {\n  var fnDict;\n  if ((typeof v === 'undefined' ? 'undefined' : _typeof(v)) !== 'object') {\n    return false;\n  } else if ((0, _primitives.isDict)(v)) {\n    fnDict = v;\n  } else if ((0, _primitives.isStream)(v)) {\n    fnDict = v.dict;\n  } else {\n    return false;\n  }\n  return fnDict.has('FunctionType');\n}\nvar PostScriptStack = function PostScriptStackClosure() {\n  var MAX_STACK_SIZE = 100;\n  function PostScriptStack(initialStack) {\n    this.stack = !initialStack ? [] : Array.prototype.slice.call(initialStack, 0);\n  }\n  PostScriptStack.prototype = {\n    push: function PostScriptStack_push(value) {\n      if (this.stack.length >= MAX_STACK_SIZE) {\n        throw new Error('PostScript function stack overflow.');\n      }\n      this.stack.push(value);\n    },\n    pop: function PostScriptStack_pop() {\n      if (this.stack.length <= 0) {\n        throw new Error('PostScript function stack underflow.');\n      }\n      return this.stack.pop();\n    },\n    copy: function PostScriptStack_copy(n) {\n      if (this.stack.length + n >= MAX_STACK_SIZE) {\n        throw new Error('PostScript function stack overflow.');\n      }\n      var stack = this.stack;\n      for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) {\n        stack.push(stack[i]);\n      }\n    },\n    index: function PostScriptStack_index(n) {\n      this.push(this.stack[this.stack.length - n - 1]);\n    },\n    roll: function PostScriptStack_roll(n, p) {\n      var stack = this.stack;\n      var l = stack.length - n;\n      var r = stack.length - 1,\n          c = l + (p - Math.floor(p / n) * n),\n          i,\n          j,\n          t;\n      for (i = l, j = r; i < j; i++, j--) {\n        t = stack[i];\n        stack[i] = stack[j];\n        stack[j] = t;\n      }\n      for (i = l, j = c - 1; i < j; i++, j--) {\n        t = stack[i];\n        stack[i] = stack[j];\n        stack[j] = t;\n      }\n      for (i = c, j = r; i < j; i++, j--) {\n        t = stack[i];\n        stack[i] = stack[j];\n        stack[j] = t;\n      }\n    }\n  };\n  return PostScriptStack;\n}();\nvar PostScriptEvaluator = function PostScriptEvaluatorClosure() {\n  function PostScriptEvaluator(operators) {\n    this.operators = operators;\n  }\n  PostScriptEvaluator.prototype = {\n    execute: function PostScriptEvaluator_execute(initialStack) {\n      var stack = new PostScriptStack(initialStack);\n      var counter = 0;\n      var operators = this.operators;\n      var length = operators.length;\n      var operator, a, b;\n      while (counter < length) {\n        operator = operators[counter++];\n        if (typeof operator === 'number') {\n          stack.push(operator);\n          continue;\n        }\n        switch (operator) {\n          case 'jz':\n            b = stack.pop();\n            a = stack.pop();\n            if (!a) {\n              counter = b;\n            }\n            break;\n          case 'j':\n            a = stack.pop();\n            counter = a;\n            break;\n          case 'abs':\n            a = stack.pop();\n            stack.push(Math.abs(a));\n            break;\n          case 'add':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a + b);\n            break;\n          case 'and':\n            b = stack.pop();\n            a = stack.pop();\n            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {\n              stack.push(a && b);\n            } else {\n              stack.push(a & b);\n            }\n            break;\n          case 'atan':\n            a = stack.pop();\n            stack.push(Math.atan(a));\n            break;\n          case 'bitshift':\n            b = stack.pop();\n            a = stack.pop();\n            if (a > 0) {\n              stack.push(a << b);\n            } else {\n              stack.push(a >> b);\n            }\n            break;\n          case 'ceiling':\n            a = stack.pop();\n            stack.push(Math.ceil(a));\n            break;\n          case 'copy':\n            a = stack.pop();\n            stack.copy(a);\n            break;\n          case 'cos':\n            a = stack.pop();\n            stack.push(Math.cos(a));\n            break;\n          case 'cvi':\n            a = stack.pop() | 0;\n            stack.push(a);\n            break;\n          case 'cvr':\n            break;\n          case 'div':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a / b);\n            break;\n          case 'dup':\n            stack.copy(1);\n            break;\n          case 'eq':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a === b);\n            break;\n          case 'exch':\n            stack.roll(2, 1);\n            break;\n          case 'exp':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(Math.pow(a, b));\n            break;\n          case 'false':\n            stack.push(false);\n            break;\n          case 'floor':\n            a = stack.pop();\n            stack.push(Math.floor(a));\n            break;\n          case 'ge':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a >= b);\n            break;\n          case 'gt':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a > b);\n            break;\n          case 'idiv':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a / b | 0);\n            break;\n          case 'index':\n            a = stack.pop();\n            stack.index(a);\n            break;\n          case 'le':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a <= b);\n            break;\n          case 'ln':\n            a = stack.pop();\n            stack.push(Math.log(a));\n            break;\n          case 'log':\n            a = stack.pop();\n            stack.push(Math.log(a) / Math.LN10);\n            break;\n          case 'lt':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a < b);\n            break;\n          case 'mod':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a % b);\n            break;\n          case 'mul':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a * b);\n            break;\n          case 'ne':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a !== b);\n            break;\n          case 'neg':\n            a = stack.pop();\n            stack.push(-a);\n            break;\n          case 'not':\n            a = stack.pop();\n            if ((0, _util.isBool)(a)) {\n              stack.push(!a);\n            } else {\n              stack.push(~a);\n            }\n            break;\n          case 'or':\n            b = stack.pop();\n            a = stack.pop();\n            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {\n              stack.push(a || b);\n            } else {\n              stack.push(a | b);\n            }\n            break;\n          case 'pop':\n            stack.pop();\n            break;\n          case 'roll':\n            b = stack.pop();\n            a = stack.pop();\n            stack.roll(a, b);\n            break;\n          case 'round':\n            a = stack.pop();\n            stack.push(Math.round(a));\n            break;\n          case 'sin':\n            a = stack.pop();\n            stack.push(Math.sin(a));\n            break;\n          case 'sqrt':\n            a = stack.pop();\n            stack.push(Math.sqrt(a));\n            break;\n          case 'sub':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a - b);\n            break;\n          case 'true':\n            stack.push(true);\n            break;\n          case 'truncate':\n            a = stack.pop();\n            a = a < 0 ? Math.ceil(a) : Math.floor(a);\n            stack.push(a);\n            break;\n          case 'xor':\n            b = stack.pop();\n            a = stack.pop();\n            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {\n              stack.push(a !== b);\n            } else {\n              stack.push(a ^ b);\n            }\n            break;\n          default:\n            throw new _util.FormatError('Unknown operator ' + operator);\n        }\n      }\n      return stack.stack;\n    }\n  };\n  return PostScriptEvaluator;\n}();\nvar PostScriptCompiler = function PostScriptCompilerClosure() {\n  function AstNode(type) {\n    this.type = type;\n  }\n  AstNode.prototype.visit = function (visitor) {\n    throw new Error('abstract method');\n  };\n  function AstArgument(index, min, max) {\n    AstNode.call(this, 'args');\n    this.index = index;\n    this.min = min;\n    this.max = max;\n  }\n  AstArgument.prototype = Object.create(AstNode.prototype);\n  AstArgument.prototype.visit = function (visitor) {\n    visitor.visitArgument(this);\n  };\n  function AstLiteral(number) {\n    AstNode.call(this, 'literal');\n    this.number = number;\n    this.min = number;\n    this.max = number;\n  }\n  AstLiteral.prototype = Object.create(AstNode.prototype);\n  AstLiteral.prototype.visit = function (visitor) {\n    visitor.visitLiteral(this);\n  };\n  function AstBinaryOperation(op, arg1, arg2, min, max) {\n    AstNode.call(this, 'binary');\n    this.op = op;\n    this.arg1 = arg1;\n    this.arg2 = arg2;\n    this.min = min;\n    this.max = max;\n  }\n  AstBinaryOperation.prototype = Object.create(AstNode.prototype);\n  AstBinaryOperation.prototype.visit = function (visitor) {\n    visitor.visitBinaryOperation(this);\n  };\n  function AstMin(arg, max) {\n    AstNode.call(this, 'max');\n    this.arg = arg;\n    this.min = arg.min;\n    this.max = max;\n  }\n  AstMin.prototype = Object.create(AstNode.prototype);\n  AstMin.prototype.visit = function (visitor) {\n    visitor.visitMin(this);\n  };\n  function AstVariable(index, min, max) {\n    AstNode.call(this, 'var');\n    this.index = index;\n    this.min = min;\n    this.max = max;\n  }\n  AstVariable.prototype = Object.create(AstNode.prototype);\n  AstVariable.prototype.visit = function (visitor) {\n    visitor.visitVariable(this);\n  };\n  function AstVariableDefinition(variable, arg) {\n    AstNode.call(this, 'definition');\n    this.variable = variable;\n    this.arg = arg;\n  }\n  AstVariableDefinition.prototype = Object.create(AstNode.prototype);\n  AstVariableDefinition.prototype.visit = function (visitor) {\n    visitor.visitVariableDefinition(this);\n  };\n  function ExpressionBuilderVisitor() {\n    this.parts = [];\n  }\n  ExpressionBuilderVisitor.prototype = {\n    visitArgument: function visitArgument(arg) {\n      this.parts.push('Math.max(', arg.min, ', Math.min(', arg.max, ', src[srcOffset + ', arg.index, ']))');\n    },\n    visitVariable: function visitVariable(variable) {\n      this.parts.push('v', variable.index);\n    },\n    visitLiteral: function visitLiteral(literal) {\n      this.parts.push(literal.number);\n    },\n    visitBinaryOperation: function visitBinaryOperation(operation) {\n      this.parts.push('(');\n      operation.arg1.visit(this);\n      this.parts.push(' ', operation.op, ' ');\n      operation.arg2.visit(this);\n      this.parts.push(')');\n    },\n    visitVariableDefinition: function visitVariableDefinition(definition) {\n      this.parts.push('var ');\n      definition.variable.visit(this);\n      this.parts.push(' = ');\n      definition.arg.visit(this);\n      this.parts.push(';');\n    },\n    visitMin: function visitMin(max) {\n      this.parts.push('Math.min(');\n      max.arg.visit(this);\n      this.parts.push(', ', max.max, ')');\n    },\n    toString: function toString() {\n      return this.parts.join('');\n    }\n  };\n  function buildAddOperation(num1, num2) {\n    if (num2.type === 'literal' && num2.number === 0) {\n      return num1;\n    }\n    if (num1.type === 'literal' && num1.number === 0) {\n      return num2;\n    }\n    if (num2.type === 'literal' && num1.type === 'literal') {\n      return new AstLiteral(num1.number + num2.number);\n    }\n    return new AstBinaryOperation('+', num1, num2, num1.min + num2.min, num1.max + num2.max);\n  }\n  function buildMulOperation(num1, num2) {\n    if (num2.type === 'literal') {\n      if (num2.number === 0) {\n        return new AstLiteral(0);\n      } else if (num2.number === 1) {\n        return num1;\n      } else if (num1.type === 'literal') {\n        return new AstLiteral(num1.number * num2.number);\n      }\n    }\n    if (num1.type === 'literal') {\n      if (num1.number === 0) {\n        return new AstLiteral(0);\n      } else if (num1.number === 1) {\n        return num2;\n      }\n    }\n    var min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);\n    var max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);\n    return new AstBinaryOperation('*', num1, num2, min, max);\n  }\n  function buildSubOperation(num1, num2) {\n    if (num2.type === 'literal') {\n      if (num2.number === 0) {\n        return num1;\n      } else if (num1.type === 'literal') {\n        return new AstLiteral(num1.number - num2.number);\n      }\n    }\n    if (num2.type === 'binary' && num2.op === '-' && num1.type === 'literal' && num1.number === 1 && num2.arg1.type === 'literal' && num2.arg1.number === 1) {\n      return num2.arg2;\n    }\n    return new AstBinaryOperation('-', num1, num2, num1.min - num2.max, num1.max - num2.min);\n  }\n  function buildMinOperation(num1, max) {\n    if (num1.min >= max) {\n      return new AstLiteral(max);\n    } else if (num1.max <= max) {\n      return num1;\n    }\n    return new AstMin(num1, max);\n  }\n  function PostScriptCompiler() {}\n  PostScriptCompiler.prototype = {\n    compile: function PostScriptCompiler_compile(code, domain, range) {\n      var stack = [];\n      var i, ii;\n      var instructions = [];\n      var inputSize = domain.length >> 1,\n          outputSize = range.length >> 1;\n      var lastRegister = 0;\n      var n, j;\n      var num1, num2, ast1, ast2, tmpVar, item;\n      for (i = 0; i < inputSize; i++) {\n        stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1]));\n      }\n      for (i = 0, ii = code.length; i < ii; i++) {\n        item = code[i];\n        if (typeof item === 'number') {\n          stack.push(new AstLiteral(item));\n          continue;\n        }\n        switch (item) {\n          case 'add':\n            if (stack.length < 2) {\n              return null;\n            }\n            num2 = stack.pop();\n            num1 = stack.pop();\n            stack.push(buildAddOperation(num1, num2));\n            break;\n          case 'cvr':\n            if (stack.length < 1) {\n              return null;\n            }\n            break;\n          case 'mul':\n            if (stack.length < 2) {\n              return null;\n            }\n            num2 = stack.pop();\n            num1 = stack.pop();\n            stack.push(buildMulOperation(num1, num2));\n            break;\n          case 'sub':\n            if (stack.length < 2) {\n              return null;\n            }\n            num2 = stack.pop();\n            num1 = stack.pop();\n            stack.push(buildSubOperation(num1, num2));\n            break;\n          case 'exch':\n            if (stack.length < 2) {\n              return null;\n            }\n            ast1 = stack.pop();\n            ast2 = stack.pop();\n            stack.push(ast1, ast2);\n            break;\n          case 'pop':\n            if (stack.length < 1) {\n              return null;\n            }\n            stack.pop();\n            break;\n          case 'index':\n            if (stack.length < 1) {\n              return null;\n            }\n            num1 = stack.pop();\n            if (num1.type !== 'literal') {\n              return null;\n            }\n            n = num1.number;\n            if (n < 0 || (n | 0) !== n || stack.length < n) {\n              return null;\n            }\n            ast1 = stack[stack.length - n - 1];\n            if (ast1.type === 'literal' || ast1.type === 'var') {\n              stack.push(ast1);\n              break;\n            }\n            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);\n            stack[stack.length - n - 1] = tmpVar;\n            stack.push(tmpVar);\n            instructions.push(new AstVariableDefinition(tmpVar, ast1));\n            break;\n          case 'dup':\n            if (stack.length < 1) {\n              return null;\n            }\n            if (typeof code[i + 1] === 'number' && code[i + 2] === 'gt' && code[i + 3] === i + 7 && code[i + 4] === 'jz' && code[i + 5] === 'pop' && code[i + 6] === code[i + 1]) {\n              num1 = stack.pop();\n              stack.push(buildMinOperation(num1, code[i + 1]));\n              i += 6;\n              break;\n            }\n            ast1 = stack[stack.length - 1];\n            if (ast1.type === 'literal' || ast1.type === 'var') {\n              stack.push(ast1);\n              break;\n            }\n            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);\n            stack[stack.length - 1] = tmpVar;\n            stack.push(tmpVar);\n            instructions.push(new AstVariableDefinition(tmpVar, ast1));\n            break;\n          case 'roll':\n            if (stack.length < 2) {\n              return null;\n            }\n            num2 = stack.pop();\n            num1 = stack.pop();\n            if (num2.type !== 'literal' || num1.type !== 'literal') {\n              return null;\n            }\n            j = num2.number;\n            n = num1.number;\n            if (n <= 0 || (n | 0) !== n || (j | 0) !== j || stack.length < n) {\n              return null;\n            }\n            j = (j % n + n) % n;\n            if (j === 0) {\n              break;\n            }\n            Array.prototype.push.apply(stack, stack.splice(stack.length - n, n - j));\n            break;\n          default:\n            return null;\n        }\n      }\n      if (stack.length !== outputSize) {\n        return null;\n      }\n      var result = [];\n      instructions.forEach(function (instruction) {\n        var statementBuilder = new ExpressionBuilderVisitor();\n        instruction.visit(statementBuilder);\n        result.push(statementBuilder.toString());\n      });\n      stack.forEach(function (expr, i) {\n        var statementBuilder = new ExpressionBuilderVisitor();\n        expr.visit(statementBuilder);\n        var min = range[i * 2],\n            max = range[i * 2 + 1];\n        var out = [statementBuilder.toString()];\n        if (min > expr.min) {\n          out.unshift('Math.max(', min, ', ');\n          out.push(')');\n        }\n        if (max < expr.max) {\n          out.unshift('Math.min(', max, ', ');\n          out.push(')');\n        }\n        out.unshift('dest[destOffset + ', i, '] = ');\n        out.push(';');\n        result.push(out.join(''));\n      });\n      return result.join('\\n');\n    }\n  };\n  return PostScriptCompiler;\n}();\nexports.isPDFFunction = isPDFFunction;\nexports.PDFFunction = PDFFunction;\nexports.PostScriptEvaluator = PostScriptEvaluator;\nexports.PostScriptCompiler = PostScriptCompiler;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\nvar getLookupTableFactory = __w_pdfjs_require__(0).getLookupTableFactory;\nvar getSpecialPUASymbols = getLookupTableFactory(function (t) {\n t[63721] = 0x00A9;\n t[63193] = 0x00A9;\n t[63720] = 0x00AE;\n t[63194] = 0x00AE;\n t[63722] = 0x2122;\n t[63195] = 0x2122;\n t[63729] = 0x23A7;\n t[63730] = 0x23A8;\n t[63731] = 0x23A9;\n t[63740] = 0x23AB;\n t[63741] = 0x23AC;\n t[63742] = 0x23AD;\n t[63726] = 0x23A1;\n t[63727] = 0x23A2;\n t[63728] = 0x23A3;\n t[63737] = 0x23A4;\n t[63738] = 0x23A5;\n t[63739] = 0x23A6;\n t[63723] = 0x239B;\n t[63724] = 0x239C;\n t[63725] = 0x239D;\n t[63734] = 0x239E;\n t[63735] = 0x239F;\n t[63736] = 0x23A0;\n});\nfunction mapSpecialUnicodeValues(code) {\n if (code >= 0xFFF0 && code <= 0xFFFF) {\n  return 0;\n } else if (code >= 0xF600 && code <= 0xF8FF) {\n  return getSpecialPUASymbols()[code] || code;\n }\n return code;\n}\nfunction getUnicodeForGlyph(name, glyphsUnicodeMap) {\n var unicode = glyphsUnicodeMap[name];\n if (unicode !== undefined) {\n  return unicode;\n }\n if (!name) {\n  return -1;\n }\n if (name[0] === 'u') {\n  var nameLen = name.length, hexStr;\n  if (nameLen === 7 && name[1] === 'n' && name[2] === 'i') {\n   hexStr = name.substr(3);\n  } else if (nameLen >= 5 && nameLen <= 7) {\n   hexStr = name.substr(1);\n  } else {\n   return -1;\n  }\n  if (hexStr === hexStr.toUpperCase()) {\n   unicode = parseInt(hexStr, 16);\n   if (unicode >= 0) {\n    return unicode;\n   }\n  }\n }\n return -1;\n}\nvar UnicodeRanges = [\n {\n  'begin': 0x0000,\n  'end': 0x007F\n },\n {\n  'begin': 0x0080,\n  'end': 0x00FF\n },\n {\n  'begin': 0x0100,\n  'end': 0x017F\n },\n {\n  'begin': 0x0180,\n  'end': 0x024F\n },\n {\n  'begin': 0x0250,\n  'end': 0x02AF\n },\n {\n  'begin': 0x02B0,\n  'end': 0x02FF\n },\n {\n  'begin': 0x0300,\n  'end': 0x036F\n },\n {\n  'begin': 0x0370,\n  'end': 0x03FF\n },\n {\n  'begin': 0x2C80,\n  'end': 0x2CFF\n },\n {\n  'begin': 0x0400,\n  'end': 0x04FF\n },\n {\n  'begin': 0x0530,\n  'end': 0x058F\n },\n {\n  'begin': 0x0590,\n  'end': 0x05FF\n },\n {\n  'begin': 0xA500,\n  'end': 0xA63F\n },\n {\n  'begin': 0x0600,\n  'end': 0x06FF\n },\n {\n  'begin': 0x07C0,\n  'end': 0x07FF\n },\n {\n  'begin': 0x0900,\n  'end': 0x097F\n },\n {\n  'begin': 0x0980,\n  'end': 0x09FF\n },\n {\n  'begin': 0x0A00,\n  'end': 0x0A7F\n },\n {\n  'begin': 0x0A80,\n  'end': 0x0AFF\n },\n {\n  'begin': 0x0B00,\n  'end': 0x0B7F\n },\n {\n  'begin': 0x0B80,\n  'end': 0x0BFF\n },\n {\n  'begin': 0x0C00,\n  'end': 0x0C7F\n },\n {\n  'begin': 0x0C80,\n  'end': 0x0CFF\n },\n {\n  'begin': 0x0D00,\n  'end': 0x0D7F\n },\n {\n  'begin': 0x0E00,\n  'end': 0x0E7F\n },\n {\n  'begin': 0x0E80,\n  'end': 0x0EFF\n },\n {\n  'begin': 0x10A0,\n  'end': 0x10FF\n },\n {\n  'begin': 0x1B00,\n  'end': 0x1B7F\n },\n {\n  'begin': 0x1100,\n  'end': 0x11FF\n },\n {\n  'begin': 0x1E00,\n  'end': 0x1EFF\n },\n {\n  'begin': 0x1F00,\n  'end': 0x1FFF\n },\n {\n  'begin': 0x2000,\n  'end': 0x206F\n },\n {\n  'begin': 0x2070,\n  'end': 0x209F\n },\n {\n  'begin': 0x20A0,\n  'end': 0x20CF\n },\n {\n  'begin': 0x20D0,\n  'end': 0x20FF\n },\n {\n  'begin': 0x2100,\n  'end': 0x214F\n },\n {\n  'begin': 0x2150,\n  'end': 0x218F\n },\n {\n  'begin': 0x2190,\n  'end': 0x21FF\n },\n {\n  'begin': 0x2200,\n  'end': 0x22FF\n },\n {\n  'begin': 0x2300,\n  'end': 0x23FF\n },\n {\n  'begin': 0x2400,\n  'end': 0x243F\n },\n {\n  'begin': 0x2440,\n  'end': 0x245F\n },\n {\n  'begin': 0x2460,\n  'end': 0x24FF\n },\n {\n  'begin': 0x2500,\n  'end': 0x257F\n },\n {\n  'begin': 0x2580,\n  'end': 0x259F\n },\n {\n  'begin': 0x25A0,\n  'end': 0x25FF\n },\n {\n  'begin': 0x2600,\n  'end': 0x26FF\n },\n {\n  'begin': 0x2700,\n  'end': 0x27BF\n },\n {\n  'begin': 0x3000,\n  'end': 0x303F\n },\n {\n  'begin': 0x3040,\n  'end': 0x309F\n },\n {\n  'begin': 0x30A0,\n  'end': 0x30FF\n },\n {\n  'begin': 0x3100,\n  'end': 0x312F\n },\n {\n  'begin': 0x3130,\n  'end': 0x318F\n },\n {\n  'begin': 0xA840,\n  'end': 0xA87F\n },\n {\n  'begin': 0x3200,\n  'end': 0x32FF\n },\n {\n  'begin': 0x3300,\n  'end': 0x33FF\n },\n {\n  'begin': 0xAC00,\n  'end': 0xD7AF\n },\n {\n  'begin': 0xD800,\n  'end': 0xDFFF\n },\n {\n  'begin': 0x10900,\n  'end': 0x1091F\n },\n {\n  'begin': 0x4E00,\n  'end': 0x9FFF\n },\n {\n  'begin': 0xE000,\n  'end': 0xF8FF\n },\n {\n  'begin': 0x31C0,\n  'end': 0x31EF\n },\n {\n  'begin': 0xFB00,\n  'end': 0xFB4F\n },\n {\n  'begin': 0xFB50,\n  'end': 0xFDFF\n },\n {\n  'begin': 0xFE20,\n  'end': 0xFE2F\n },\n {\n  'begin': 0xFE10,\n  'end': 0xFE1F\n },\n {\n  'begin': 0xFE50,\n  'end': 0xFE6F\n },\n {\n  'begin': 0xFE70,\n  'end': 0xFEFF\n },\n {\n  'begin': 0xFF00,\n  'end': 0xFFEF\n },\n {\n  'begin': 0xFFF0,\n  'end': 0xFFFF\n },\n {\n  'begin': 0x0F00,\n  'end': 0x0FFF\n },\n {\n  'begin': 0x0700,\n  'end': 0x074F\n },\n {\n  'begin': 0x0780,\n  'end': 0x07BF\n },\n {\n  'begin': 0x0D80,\n  'end': 0x0DFF\n },\n {\n  'begin': 0x1000,\n  'end': 0x109F\n },\n {\n  'begin': 0x1200,\n  'end': 0x137F\n },\n {\n  'begin': 0x13A0,\n  'end': 0x13FF\n },\n {\n  'begin': 0x1400,\n  'end': 0x167F\n },\n {\n  'begin': 0x1680,\n  'end': 0x169F\n },\n {\n  'begin': 0x16A0,\n  'end': 0x16FF\n },\n {\n  'begin': 0x1780,\n  'end': 0x17FF\n },\n {\n  'begin': 0x1800,\n  'end': 0x18AF\n },\n {\n  'begin': 0x2800,\n  'end': 0x28FF\n },\n {\n  'begin': 0xA000,\n  'end': 0xA48F\n },\n {\n  'begin': 0x1700,\n  'end': 0x171F\n },\n {\n  'begin': 0x10300,\n  'end': 0x1032F\n },\n {\n  'begin': 0x10330,\n  'end': 0x1034F\n },\n {\n  'begin': 0x10400,\n  'end': 0x1044F\n },\n {\n  'begin': 0x1D000,\n  'end': 0x1D0FF\n },\n {\n  'begin': 0x1D400,\n  'end': 0x1D7FF\n },\n {\n  'begin': 0xFF000,\n  'end': 0xFFFFD\n },\n {\n  'begin': 0xFE00,\n  'end': 0xFE0F\n },\n {\n  'begin': 0xE0000,\n  'end': 0xE007F\n },\n {\n  'begin': 0x1900,\n  'end': 0x194F\n },\n {\n  'begin': 0x1950,\n  'end': 0x197F\n },\n {\n  'begin': 0x1980,\n  'end': 0x19DF\n },\n {\n  'begin': 0x1A00,\n  'end': 0x1A1F\n },\n {\n  'begin': 0x2C00,\n  'end': 0x2C5F\n },\n {\n  'begin': 0x2D30,\n  'end': 0x2D7F\n },\n {\n  'begin': 0x4DC0,\n  'end': 0x4DFF\n },\n {\n  'begin': 0xA800,\n  'end': 0xA82F\n },\n {\n  'begin': 0x10000,\n  'end': 0x1007F\n },\n {\n  'begin': 0x10140,\n  'end': 0x1018F\n },\n {\n  'begin': 0x10380,\n  'end': 0x1039F\n },\n {\n  'begin': 0x103A0,\n  'end': 0x103DF\n },\n {\n  'begin': 0x10450,\n  'end': 0x1047F\n },\n {\n  'begin': 0x10480,\n  'end': 0x104AF\n },\n {\n  'begin': 0x10800,\n  'end': 0x1083F\n },\n {\n  'begin': 0x10A00,\n  'end': 0x10A5F\n },\n {\n  'begin': 0x1D300,\n  'end': 0x1D35F\n },\n {\n  'begin': 0x12000,\n  'end': 0x123FF\n },\n {\n  'begin': 0x1D360,\n  'end': 0x1D37F\n },\n {\n  'begin': 0x1B80,\n  'end': 0x1BBF\n },\n {\n  'begin': 0x1C00,\n  'end': 0x1C4F\n },\n {\n  'begin': 0x1C50,\n  'end': 0x1C7F\n },\n {\n  'begin': 0xA880,\n  'end': 0xA8DF\n },\n {\n  'begin': 0xA900,\n  'end': 0xA92F\n },\n {\n  'begin': 0xA930,\n  'end': 0xA95F\n },\n {\n  'begin': 0xAA00,\n  'end': 0xAA5F\n },\n {\n  'begin': 0x10190,\n  'end': 0x101CF\n },\n {\n  'begin': 0x101D0,\n  'end': 0x101FF\n },\n {\n  'begin': 0x102A0,\n  'end': 0x102DF\n },\n {\n  'begin': 0x1F030,\n  'end': 0x1F09F\n }\n];\nfunction getUnicodeRangeFor(value) {\n for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {\n  var range = UnicodeRanges[i];\n  if (value >= range.begin && value < range.end) {\n   return i;\n  }\n }\n return -1;\n}\nfunction isRTLRangeFor(value) {\n var range = UnicodeRanges[13];\n if (value >= range.begin && value < range.end) {\n  return true;\n }\n range = UnicodeRanges[11];\n if (value >= range.begin && value < range.end) {\n  return true;\n }\n return false;\n}\nvar getNormalizedUnicodes = getLookupTableFactory(function (t) {\n t['\\u00A8'] = '\\u0020\\u0308';\n t['\\u00AF'] = '\\u0020\\u0304';\n t['\\u00B4'] = '\\u0020\\u0301';\n t['\\u00B5'] = '\\u03BC';\n t['\\u00B8'] = '\\u0020\\u0327';\n t['\\u0132'] = '\\u0049\\u004A';\n t['\\u0133'] = '\\u0069\\u006A';\n t['\\u013F'] = '\\u004C\\u00B7';\n t['\\u0140'] = '\\u006C\\u00B7';\n t['\\u0149'] = '\\u02BC\\u006E';\n t['\\u017F'] = '\\u0073';\n t['\\u01C4'] = '\\u0044\\u017D';\n t['\\u01C5'] = '\\u0044\\u017E';\n t['\\u01C6'] = '\\u0064\\u017E';\n t['\\u01C7'] = '\\u004C\\u004A';\n t['\\u01C8'] = '\\u004C\\u006A';\n t['\\u01C9'] = '\\u006C\\u006A';\n t['\\u01CA'] = '\\u004E\\u004A';\n t['\\u01CB'] = '\\u004E\\u006A';\n t['\\u01CC'] = '\\u006E\\u006A';\n t['\\u01F1'] = '\\u0044\\u005A';\n t['\\u01F2'] = '\\u0044\\u007A';\n t['\\u01F3'] = '\\u0064\\u007A';\n t['\\u02D8'] = '\\u0020\\u0306';\n t['\\u02D9'] = '\\u0020\\u0307';\n t['\\u02DA'] = '\\u0020\\u030A';\n t['\\u02DB'] = '\\u0020\\u0328';\n t['\\u02DC'] = '\\u0020\\u0303';\n t['\\u02DD'] = '\\u0020\\u030B';\n t['\\u037A'] = '\\u0020\\u0345';\n t['\\u0384'] = '\\u0020\\u0301';\n t['\\u03D0'] = '\\u03B2';\n t['\\u03D1'] = '\\u03B8';\n t['\\u03D2'] = '\\u03A5';\n t['\\u03D5'] = '\\u03C6';\n t['\\u03D6'] = '\\u03C0';\n t['\\u03F0'] = '\\u03BA';\n t['\\u03F1'] = '\\u03C1';\n t['\\u03F2'] = '\\u03C2';\n t['\\u03F4'] = '\\u0398';\n t['\\u03F5'] = '\\u03B5';\n t['\\u03F9'] = '\\u03A3';\n t['\\u0587'] = '\\u0565\\u0582';\n t['\\u0675'] = '\\u0627\\u0674';\n t['\\u0676'] = '\\u0648\\u0674';\n t['\\u0677'] = '\\u06C7\\u0674';\n t['\\u0678'] = '\\u064A\\u0674';\n t['\\u0E33'] = '\\u0E4D\\u0E32';\n t['\\u0EB3'] = '\\u0ECD\\u0EB2';\n t['\\u0EDC'] = '\\u0EAB\\u0E99';\n t['\\u0EDD'] = '\\u0EAB\\u0EA1';\n t['\\u0F77'] = '\\u0FB2\\u0F81';\n t['\\u0F79'] = '\\u0FB3\\u0F81';\n t['\\u1E9A'] = '\\u0061\\u02BE';\n t['\\u1FBD'] = '\\u0020\\u0313';\n t['\\u1FBF'] = '\\u0020\\u0313';\n t['\\u1FC0'] = '\\u0020\\u0342';\n t['\\u1FFE'] = '\\u0020\\u0314';\n t['\\u2002'] = '\\u0020';\n t['\\u2003'] = '\\u0020';\n t['\\u2004'] = '\\u0020';\n t['\\u2005'] = '\\u0020';\n t['\\u2006'] = '\\u0020';\n t['\\u2008'] = '\\u0020';\n t['\\u2009'] = '\\u0020';\n t['\\u200A'] = '\\u0020';\n t['\\u2017'] = '\\u0020\\u0333';\n t['\\u2024'] = '\\u002E';\n t['\\u2025'] = '\\u002E\\u002E';\n t['\\u2026'] = '\\u002E\\u002E\\u002E';\n t['\\u2033'] = '\\u2032\\u2032';\n t['\\u2034'] = '\\u2032\\u2032\\u2032';\n t['\\u2036'] = '\\u2035\\u2035';\n t['\\u2037'] = '\\u2035\\u2035\\u2035';\n t['\\u203C'] = '\\u0021\\u0021';\n t['\\u203E'] = '\\u0020\\u0305';\n t['\\u2047'] = '\\u003F\\u003F';\n t['\\u2048'] = '\\u003F\\u0021';\n t['\\u2049'] = '\\u0021\\u003F';\n t['\\u2057'] = '\\u2032\\u2032\\u2032\\u2032';\n t['\\u205F'] = '\\u0020';\n t['\\u20A8'] = '\\u0052\\u0073';\n t['\\u2100'] = '\\u0061\\u002F\\u0063';\n t['\\u2101'] = '\\u0061\\u002F\\u0073';\n t['\\u2103'] = '\\u00B0\\u0043';\n t['\\u2105'] = '\\u0063\\u002F\\u006F';\n t['\\u2106'] = '\\u0063\\u002F\\u0075';\n t['\\u2107'] = '\\u0190';\n t['\\u2109'] = '\\u00B0\\u0046';\n t['\\u2116'] = '\\u004E\\u006F';\n t['\\u2121'] = '\\u0054\\u0045\\u004C';\n t['\\u2135'] = '\\u05D0';\n t['\\u2136'] = '\\u05D1';\n t['\\u2137'] = '\\u05D2';\n t['\\u2138'] = '\\u05D3';\n t['\\u213B'] = '\\u0046\\u0041\\u0058';\n t['\\u2160'] = '\\u0049';\n t['\\u2161'] = '\\u0049\\u0049';\n t['\\u2162'] = '\\u0049\\u0049\\u0049';\n t['\\u2163'] = '\\u0049\\u0056';\n t['\\u2164'] = '\\u0056';\n t['\\u2165'] = '\\u0056\\u0049';\n t['\\u2166'] = '\\u0056\\u0049\\u0049';\n t['\\u2167'] = '\\u0056\\u0049\\u0049\\u0049';\n t['\\u2168'] = '\\u0049\\u0058';\n t['\\u2169'] = '\\u0058';\n t['\\u216A'] = '\\u0058\\u0049';\n t['\\u216B'] = '\\u0058\\u0049\\u0049';\n t['\\u216C'] = '\\u004C';\n t['\\u216D'] = '\\u0043';\n t['\\u216E'] = '\\u0044';\n t['\\u216F'] = '\\u004D';\n t['\\u2170'] = '\\u0069';\n t['\\u2171'] = '\\u0069\\u0069';\n t['\\u2172'] = '\\u0069\\u0069\\u0069';\n t['\\u2173'] = '\\u0069\\u0076';\n t['\\u2174'] = '\\u0076';\n t['\\u2175'] = '\\u0076\\u0069';\n t['\\u2176'] = '\\u0076\\u0069\\u0069';\n t['\\u2177'] = '\\u0076\\u0069\\u0069\\u0069';\n t['\\u2178'] = '\\u0069\\u0078';\n t['\\u2179'] = '\\u0078';\n t['\\u217A'] = '\\u0078\\u0069';\n t['\\u217B'] = '\\u0078\\u0069\\u0069';\n t['\\u217C'] = '\\u006C';\n t['\\u217D'] = '\\u0063';\n t['\\u217E'] = '\\u0064';\n t['\\u217F'] = '\\u006D';\n t['\\u222C'] = '\\u222B\\u222B';\n t['\\u222D'] = '\\u222B\\u222B\\u222B';\n t['\\u222F'] = '\\u222E\\u222E';\n t['\\u2230'] = '\\u222E\\u222E\\u222E';\n t['\\u2474'] = '\\u0028\\u0031\\u0029';\n t['\\u2475'] = '\\u0028\\u0032\\u0029';\n t['\\u2476'] = '\\u0028\\u0033\\u0029';\n t['\\u2477'] = '\\u0028\\u0034\\u0029';\n t['\\u2478'] = '\\u0028\\u0035\\u0029';\n t['\\u2479'] = '\\u0028\\u0036\\u0029';\n t['\\u247A'] = '\\u0028\\u0037\\u0029';\n t['\\u247B'] = '\\u0028\\u0038\\u0029';\n t['\\u247C'] = '\\u0028\\u0039\\u0029';\n t['\\u247D'] = '\\u0028\\u0031\\u0030\\u0029';\n t['\\u247E'] = '\\u0028\\u0031\\u0031\\u0029';\n t['\\u247F'] = '\\u0028\\u0031\\u0032\\u0029';\n t['\\u2480'] = '\\u0028\\u0031\\u0033\\u0029';\n t['\\u2481'] = '\\u0028\\u0031\\u0034\\u0029';\n t['\\u2482'] = '\\u0028\\u0031\\u0035\\u0029';\n t['\\u2483'] = '\\u0028\\u0031\\u0036\\u0029';\n t['\\u2484'] = '\\u0028\\u0031\\u0037\\u0029';\n t['\\u2485'] = '\\u0028\\u0031\\u0038\\u0029';\n t['\\u2486'] = '\\u0028\\u0031\\u0039\\u0029';\n t['\\u2487'] = '\\u0028\\u0032\\u0030\\u0029';\n t['\\u2488'] = '\\u0031\\u002E';\n t['\\u2489'] = '\\u0032\\u002E';\n t['\\u248A'] = '\\u0033\\u002E';\n t['\\u248B'] = '\\u0034\\u002E';\n t['\\u248C'] = '\\u0035\\u002E';\n t['\\u248D'] = '\\u0036\\u002E';\n t['\\u248E'] = '\\u0037\\u002E';\n t['\\u248F'] = '\\u0038\\u002E';\n t['\\u2490'] = '\\u0039\\u002E';\n t['\\u2491'] = '\\u0031\\u0030\\u002E';\n t['\\u2492'] = '\\u0031\\u0031\\u002E';\n t['\\u2493'] = '\\u0031\\u0032\\u002E';\n t['\\u2494'] = '\\u0031\\u0033\\u002E';\n t['\\u2495'] = '\\u0031\\u0034\\u002E';\n t['\\u2496'] = '\\u0031\\u0035\\u002E';\n t['\\u2497'] = '\\u0031\\u0036\\u002E';\n t['\\u2498'] = '\\u0031\\u0037\\u002E';\n t['\\u2499'] = '\\u0031\\u0038\\u002E';\n t['\\u249A'] = '\\u0031\\u0039\\u002E';\n t['\\u249B'] = '\\u0032\\u0030\\u002E';\n t['\\u249C'] = '\\u0028\\u0061\\u0029';\n t['\\u249D'] = '\\u0028\\u0062\\u0029';\n t['\\u249E'] = '\\u0028\\u0063\\u0029';\n t['\\u249F'] = '\\u0028\\u0064\\u0029';\n t['\\u24A0'] = '\\u0028\\u0065\\u0029';\n t['\\u24A1'] = '\\u0028\\u0066\\u0029';\n t['\\u24A2'] = '\\u0028\\u0067\\u0029';\n t['\\u24A3'] = '\\u0028\\u0068\\u0029';\n t['\\u24A4'] = '\\u0028\\u0069\\u0029';\n t['\\u24A5'] = '\\u0028\\u006A\\u0029';\n t['\\u24A6'] = '\\u0028\\u006B\\u0029';\n t['\\u24A7'] = '\\u0028\\u006C\\u0029';\n t['\\u24A8'] = '\\u0028\\u006D\\u0029';\n t['\\u24A9'] = '\\u0028\\u006E\\u0029';\n t['\\u24AA'] = '\\u0028\\u006F\\u0029';\n t['\\u24AB'] = '\\u0028\\u0070\\u0029';\n t['\\u24AC'] = '\\u0028\\u0071\\u0029';\n t['\\u24AD'] = '\\u0028\\u0072\\u0029';\n t['\\u24AE'] = '\\u0028\\u0073\\u0029';\n t['\\u24AF'] = '\\u0028\\u0074\\u0029';\n t['\\u24B0'] = '\\u0028\\u0075\\u0029';\n t['\\u24B1'] = '\\u0028\\u0076\\u0029';\n t['\\u24B2'] = '\\u0028\\u0077\\u0029';\n t['\\u24B3'] = '\\u0028\\u0078\\u0029';\n t['\\u24B4'] = '\\u0028\\u0079\\u0029';\n t['\\u24B5'] = '\\u0028\\u007A\\u0029';\n t['\\u2A0C'] = '\\u222B\\u222B\\u222B\\u222B';\n t['\\u2A74'] = '\\u003A\\u003A\\u003D';\n t['\\u2A75'] = '\\u003D\\u003D';\n t['\\u2A76'] = '\\u003D\\u003D\\u003D';\n t['\\u2E9F'] = '\\u6BCD';\n t['\\u2EF3'] = '\\u9F9F';\n t['\\u2F00'] = '\\u4E00';\n t['\\u2F01'] = '\\u4E28';\n t['\\u2F02'] = '\\u4E36';\n t['\\u2F03'] = '\\u4E3F';\n t['\\u2F04'] = '\\u4E59';\n t['\\u2F05'] = '\\u4E85';\n t['\\u2F06'] = '\\u4E8C';\n t['\\u2F07'] = '\\u4EA0';\n t['\\u2F08'] = '\\u4EBA';\n t['\\u2F09'] = '\\u513F';\n t['\\u2F0A'] = '\\u5165';\n t['\\u2F0B'] = '\\u516B';\n t['\\u2F0C'] = '\\u5182';\n t['\\u2F0D'] = '\\u5196';\n t['\\u2F0E'] = '\\u51AB';\n t['\\u2F0F'] = '\\u51E0';\n t['\\u2F10'] = '\\u51F5';\n t['\\u2F11'] = '\\u5200';\n t['\\u2F12'] = '\\u529B';\n t['\\u2F13'] = '\\u52F9';\n t['\\u2F14'] = '\\u5315';\n t['\\u2F15'] = '\\u531A';\n t['\\u2F16'] = '\\u5338';\n t['\\u2F17'] = '\\u5341';\n t['\\u2F18'] = '\\u535C';\n t['\\u2F19'] = '\\u5369';\n t['\\u2F1A'] = '\\u5382';\n t['\\u2F1B'] = '\\u53B6';\n t['\\u2F1C'] = '\\u53C8';\n t['\\u2F1D'] = '\\u53E3';\n t['\\u2F1E'] = '\\u56D7';\n t['\\u2F1F'] = '\\u571F';\n t['\\u2F20'] = '\\u58EB';\n t['\\u2F21'] = '\\u5902';\n t['\\u2F22'] = '\\u590A';\n t['\\u2F23'] = '\\u5915';\n t['\\u2F24'] = '\\u5927';\n t['\\u2F25'] = '\\u5973';\n t['\\u2F26'] = '\\u5B50';\n t['\\u2F27'] = '\\u5B80';\n t['\\u2F28'] = '\\u5BF8';\n t['\\u2F29'] = '\\u5C0F';\n t['\\u2F2A'] = '\\u5C22';\n t['\\u2F2B'] = '\\u5C38';\n t['\\u2F2C'] = '\\u5C6E';\n t['\\u2F2D'] = '\\u5C71';\n t['\\u2F2E'] = '\\u5DDB';\n t['\\u2F2F'] = '\\u5DE5';\n t['\\u2F30'] = '\\u5DF1';\n t['\\u2F31'] = '\\u5DFE';\n t['\\u2F32'] = '\\u5E72';\n t['\\u2F33'] = '\\u5E7A';\n t['\\u2F34'] = '\\u5E7F';\n t['\\u2F35'] = '\\u5EF4';\n t['\\u2F36'] = '\\u5EFE';\n t['\\u2F37'] = '\\u5F0B';\n t['\\u2F38'] = '\\u5F13';\n t['\\u2F39'] = '\\u5F50';\n t['\\u2F3A'] = '\\u5F61';\n t['\\u2F3B'] = '\\u5F73';\n t['\\u2F3C'] = '\\u5FC3';\n t['\\u2F3D'] = '\\u6208';\n t['\\u2F3E'] = '\\u6236';\n t['\\u2F3F'] = '\\u624B';\n t['\\u2F40'] = '\\u652F';\n t['\\u2F41'] = '\\u6534';\n t['\\u2F42'] = '\\u6587';\n t['\\u2F43'] = '\\u6597';\n t['\\u2F44'] = '\\u65A4';\n t['\\u2F45'] = '\\u65B9';\n t['\\u2F46'] = '\\u65E0';\n t['\\u2F47'] = '\\u65E5';\n t['\\u2F48'] = '\\u66F0';\n t['\\u2F49'] = '\\u6708';\n t['\\u2F4A'] = '\\u6728';\n t['\\u2F4B'] = '\\u6B20';\n t['\\u2F4C'] = '\\u6B62';\n t['\\u2F4D'] = '\\u6B79';\n t['\\u2F4E'] = '\\u6BB3';\n t['\\u2F4F'] = '\\u6BCB';\n t['\\u2F50'] = '\\u6BD4';\n t['\\u2F51'] = '\\u6BDB';\n t['\\u2F52'] = '\\u6C0F';\n t['\\u2F53'] = '\\u6C14';\n t['\\u2F54'] = '\\u6C34';\n t['\\u2F55'] = '\\u706B';\n t['\\u2F56'] = '\\u722A';\n t['\\u2F57'] = '\\u7236';\n t['\\u2F58'] = '\\u723B';\n t['\\u2F59'] = '\\u723F';\n t['\\u2F5A'] = '\\u7247';\n t['\\u2F5B'] = '\\u7259';\n t['\\u2F5C'] = '\\u725B';\n t['\\u2F5D'] = '\\u72AC';\n t['\\u2F5E'] = '\\u7384';\n t['\\u2F5F'] = '\\u7389';\n t['\\u2F60'] = '\\u74DC';\n t['\\u2F61'] = '\\u74E6';\n t['\\u2F62'] = '\\u7518';\n t['\\u2F63'] = '\\u751F';\n t['\\u2F64'] = '\\u7528';\n t['\\u2F65'] = '\\u7530';\n t['\\u2F66'] = '\\u758B';\n t['\\u2F67'] = '\\u7592';\n t['\\u2F68'] = '\\u7676';\n t['\\u2F69'] = '\\u767D';\n t['\\u2F6A'] = '\\u76AE';\n t['\\u2F6B'] = '\\u76BF';\n t['\\u2F6C'] = '\\u76EE';\n t['\\u2F6D'] = '\\u77DB';\n t['\\u2F6E'] = '\\u77E2';\n t['\\u2F6F'] = '\\u77F3';\n t['\\u2F70'] = '\\u793A';\n t['\\u2F71'] = '\\u79B8';\n t['\\u2F72'] = '\\u79BE';\n t['\\u2F73'] = '\\u7A74';\n t['\\u2F74'] = '\\u7ACB';\n t['\\u2F75'] = '\\u7AF9';\n t['\\u2F76'] = '\\u7C73';\n t['\\u2F77'] = '\\u7CF8';\n t['\\u2F78'] = '\\u7F36';\n t['\\u2F79'] = '\\u7F51';\n t['\\u2F7A'] = '\\u7F8A';\n t['\\u2F7B'] = '\\u7FBD';\n t['\\u2F7C'] = '\\u8001';\n t['\\u2F7D'] = '\\u800C';\n t['\\u2F7E'] = '\\u8012';\n t['\\u2F7F'] = '\\u8033';\n t['\\u2F80'] = '\\u807F';\n t['\\u2F81'] = '\\u8089';\n t['\\u2F82'] = '\\u81E3';\n t['\\u2F83'] = '\\u81EA';\n t['\\u2F84'] = '\\u81F3';\n t['\\u2F85'] = '\\u81FC';\n t['\\u2F86'] = '\\u820C';\n t['\\u2F87'] = '\\u821B';\n t['\\u2F88'] = '\\u821F';\n t['\\u2F89'] = '\\u826E';\n t['\\u2F8A'] = '\\u8272';\n t['\\u2F8B'] = '\\u8278';\n t['\\u2F8C'] = '\\u864D';\n t['\\u2F8D'] = '\\u866B';\n t['\\u2F8E'] = '\\u8840';\n t['\\u2F8F'] = '\\u884C';\n t['\\u2F90'] = '\\u8863';\n t['\\u2F91'] = '\\u897E';\n t['\\u2F92'] = '\\u898B';\n t['\\u2F93'] = '\\u89D2';\n t['\\u2F94'] = '\\u8A00';\n t['\\u2F95'] = '\\u8C37';\n t['\\u2F96'] = '\\u8C46';\n t['\\u2F97'] = '\\u8C55';\n t['\\u2F98'] = '\\u8C78';\n t['\\u2F99'] = '\\u8C9D';\n t['\\u2F9A'] = '\\u8D64';\n t['\\u2F9B'] = '\\u8D70';\n t['\\u2F9C'] = '\\u8DB3';\n t['\\u2F9D'] = '\\u8EAB';\n t['\\u2F9E'] = '\\u8ECA';\n t['\\u2F9F'] = '\\u8F9B';\n t['\\u2FA0'] = '\\u8FB0';\n t['\\u2FA1'] = '\\u8FB5';\n t['\\u2FA2'] = '\\u9091';\n t['\\u2FA3'] = '\\u9149';\n t['\\u2FA4'] = '\\u91C6';\n t['\\u2FA5'] = '\\u91CC';\n t['\\u2FA6'] = '\\u91D1';\n t['\\u2FA7'] = '\\u9577';\n t['\\u2FA8'] = '\\u9580';\n t['\\u2FA9'] = '\\u961C';\n t['\\u2FAA'] = '\\u96B6';\n t['\\u2FAB'] = '\\u96B9';\n t['\\u2FAC'] = '\\u96E8';\n t['\\u2FAD'] = '\\u9751';\n t['\\u2FAE'] = '\\u975E';\n t['\\u2FAF'] = '\\u9762';\n t['\\u2FB0'] = '\\u9769';\n t['\\u2FB1'] = '\\u97CB';\n t['\\u2FB2'] = '\\u97ED';\n t['\\u2FB3'] = '\\u97F3';\n t['\\u2FB4'] = '\\u9801';\n t['\\u2FB5'] = '\\u98A8';\n t['\\u2FB6'] = '\\u98DB';\n t['\\u2FB7'] = '\\u98DF';\n t['\\u2FB8'] = '\\u9996';\n t['\\u2FB9'] = '\\u9999';\n t['\\u2FBA'] = '\\u99AC';\n t['\\u2FBB'] = '\\u9AA8';\n t['\\u2FBC'] = '\\u9AD8';\n t['\\u2FBD'] = '\\u9ADF';\n t['\\u2FBE'] = '\\u9B25';\n t['\\u2FBF'] = '\\u9B2F';\n t['\\u2FC0'] = '\\u9B32';\n t['\\u2FC1'] = '\\u9B3C';\n t['\\u2FC2'] = '\\u9B5A';\n t['\\u2FC3'] = '\\u9CE5';\n t['\\u2FC4'] = '\\u9E75';\n t['\\u2FC5'] = '\\u9E7F';\n t['\\u2FC6'] = '\\u9EA5';\n t['\\u2FC7'] = '\\u9EBB';\n t['\\u2FC8'] = '\\u9EC3';\n t['\\u2FC9'] = '\\u9ECD';\n t['\\u2FCA'] = '\\u9ED1';\n t['\\u2FCB'] = '\\u9EF9';\n t['\\u2FCC'] = '\\u9EFD';\n t['\\u2FCD'] = '\\u9F0E';\n t['\\u2FCE'] = '\\u9F13';\n t['\\u2FCF'] = '\\u9F20';\n t['\\u2FD0'] = '\\u9F3B';\n t['\\u2FD1'] = '\\u9F4A';\n t['\\u2FD2'] = '\\u9F52';\n t['\\u2FD3'] = '\\u9F8D';\n t['\\u2FD4'] = '\\u9F9C';\n t['\\u2FD5'] = '\\u9FA0';\n t['\\u3036'] = '\\u3012';\n t['\\u3038'] = '\\u5341';\n t['\\u3039'] = '\\u5344';\n t['\\u303A'] = '\\u5345';\n t['\\u309B'] = '\\u0020\\u3099';\n t['\\u309C'] = '\\u0020\\u309A';\n t['\\u3131'] = '\\u1100';\n t['\\u3132'] = '\\u1101';\n t['\\u3133'] = '\\u11AA';\n t['\\u3134'] = '\\u1102';\n t['\\u3135'] = '\\u11AC';\n t['\\u3136'] = '\\u11AD';\n t['\\u3137'] = '\\u1103';\n t['\\u3138'] = '\\u1104';\n t['\\u3139'] = '\\u1105';\n t['\\u313A'] = '\\u11B0';\n t['\\u313B'] = '\\u11B1';\n t['\\u313C'] = '\\u11B2';\n t['\\u313D'] = '\\u11B3';\n t['\\u313E'] = '\\u11B4';\n t['\\u313F'] = '\\u11B5';\n t['\\u3140'] = '\\u111A';\n t['\\u3141'] = '\\u1106';\n t['\\u3142'] = '\\u1107';\n t['\\u3143'] = '\\u1108';\n t['\\u3144'] = '\\u1121';\n t['\\u3145'] = '\\u1109';\n t['\\u3146'] = '\\u110A';\n t['\\u3147'] = '\\u110B';\n t['\\u3148'] = '\\u110C';\n t['\\u3149'] = '\\u110D';\n t['\\u314A'] = '\\u110E';\n t['\\u314B'] = '\\u110F';\n t['\\u314C'] = '\\u1110';\n t['\\u314D'] = '\\u1111';\n t['\\u314E'] = '\\u1112';\n t['\\u314F'] = '\\u1161';\n t['\\u3150'] = '\\u1162';\n t['\\u3151'] = '\\u1163';\n t['\\u3152'] = '\\u1164';\n t['\\u3153'] = '\\u1165';\n t['\\u3154'] = '\\u1166';\n t['\\u3155'] = '\\u1167';\n t['\\u3156'] = '\\u1168';\n t['\\u3157'] = '\\u1169';\n t['\\u3158'] = '\\u116A';\n t['\\u3159'] = '\\u116B';\n t['\\u315A'] = '\\u116C';\n t['\\u315B'] = '\\u116D';\n t['\\u315C'] = '\\u116E';\n t['\\u315D'] = '\\u116F';\n t['\\u315E'] = '\\u1170';\n t['\\u315F'] = '\\u1171';\n t['\\u3160'] = '\\u1172';\n t['\\u3161'] = '\\u1173';\n t['\\u3162'] = '\\u1174';\n t['\\u3163'] = '\\u1175';\n t['\\u3164'] = '\\u1160';\n t['\\u3165'] = '\\u1114';\n t['\\u3166'] = '\\u1115';\n t['\\u3167'] = '\\u11C7';\n t['\\u3168'] = '\\u11C8';\n t['\\u3169'] = '\\u11CC';\n t['\\u316A'] = '\\u11CE';\n t['\\u316B'] = '\\u11D3';\n t['\\u316C'] = '\\u11D7';\n t['\\u316D'] = '\\u11D9';\n t['\\u316E'] = '\\u111C';\n t['\\u316F'] = '\\u11DD';\n t['\\u3170'] = '\\u11DF';\n t['\\u3171'] = '\\u111D';\n t['\\u3172'] = '\\u111E';\n t['\\u3173'] = '\\u1120';\n t['\\u3174'] = '\\u1122';\n t['\\u3175'] = '\\u1123';\n t['\\u3176'] = '\\u1127';\n t['\\u3177'] = '\\u1129';\n t['\\u3178'] = '\\u112B';\n t['\\u3179'] = '\\u112C';\n t['\\u317A'] = '\\u112D';\n t['\\u317B'] = '\\u112E';\n t['\\u317C'] = '\\u112F';\n t['\\u317D'] = '\\u1132';\n t['\\u317E'] = '\\u1136';\n t['\\u317F'] = '\\u1140';\n t['\\u3180'] = '\\u1147';\n t['\\u3181'] = '\\u114C';\n t['\\u3182'] = '\\u11F1';\n t['\\u3183'] = '\\u11F2';\n t['\\u3184'] = '\\u1157';\n t['\\u3185'] = '\\u1158';\n t['\\u3186'] = '\\u1159';\n t['\\u3187'] = '\\u1184';\n t['\\u3188'] = '\\u1185';\n t['\\u3189'] = '\\u1188';\n t['\\u318A'] = '\\u1191';\n t['\\u318B'] = '\\u1192';\n t['\\u318C'] = '\\u1194';\n t['\\u318D'] = '\\u119E';\n t['\\u318E'] = '\\u11A1';\n t['\\u3200'] = '\\u0028\\u1100\\u0029';\n t['\\u3201'] = '\\u0028\\u1102\\u0029';\n t['\\u3202'] = '\\u0028\\u1103\\u0029';\n t['\\u3203'] = '\\u0028\\u1105\\u0029';\n t['\\u3204'] = '\\u0028\\u1106\\u0029';\n t['\\u3205'] = '\\u0028\\u1107\\u0029';\n t['\\u3206'] = '\\u0028\\u1109\\u0029';\n t['\\u3207'] = '\\u0028\\u110B\\u0029';\n t['\\u3208'] = '\\u0028\\u110C\\u0029';\n t['\\u3209'] = '\\u0028\\u110E\\u0029';\n t['\\u320A'] = '\\u0028\\u110F\\u0029';\n t['\\u320B'] = '\\u0028\\u1110\\u0029';\n t['\\u320C'] = '\\u0028\\u1111\\u0029';\n t['\\u320D'] = '\\u0028\\u1112\\u0029';\n t['\\u320E'] = '\\u0028\\u1100\\u1161\\u0029';\n t['\\u320F'] = '\\u0028\\u1102\\u1161\\u0029';\n t['\\u3210'] = '\\u0028\\u1103\\u1161\\u0029';\n t['\\u3211'] = '\\u0028\\u1105\\u1161\\u0029';\n t['\\u3212'] = '\\u0028\\u1106\\u1161\\u0029';\n t['\\u3213'] = '\\u0028\\u1107\\u1161\\u0029';\n t['\\u3214'] = '\\u0028\\u1109\\u1161\\u0029';\n t['\\u3215'] = '\\u0028\\u110B\\u1161\\u0029';\n t['\\u3216'] = '\\u0028\\u110C\\u1161\\u0029';\n t['\\u3217'] = '\\u0028\\u110E\\u1161\\u0029';\n t['\\u3218'] = '\\u0028\\u110F\\u1161\\u0029';\n t['\\u3219'] = '\\u0028\\u1110\\u1161\\u0029';\n t['\\u321A'] = '\\u0028\\u1111\\u1161\\u0029';\n t['\\u321B'] = '\\u0028\\u1112\\u1161\\u0029';\n t['\\u321C'] = '\\u0028\\u110C\\u116E\\u0029';\n t['\\u321D'] = '\\u0028\\u110B\\u1169\\u110C\\u1165\\u11AB\\u0029';\n t['\\u321E'] = '\\u0028\\u110B\\u1169\\u1112\\u116E\\u0029';\n t['\\u3220'] = '\\u0028\\u4E00\\u0029';\n t['\\u3221'] = '\\u0028\\u4E8C\\u0029';\n t['\\u3222'] = '\\u0028\\u4E09\\u0029';\n t['\\u3223'] = '\\u0028\\u56DB\\u0029';\n t['\\u3224'] = '\\u0028\\u4E94\\u0029';\n t['\\u3225'] = '\\u0028\\u516D\\u0029';\n t['\\u3226'] = '\\u0028\\u4E03\\u0029';\n t['\\u3227'] = '\\u0028\\u516B\\u0029';\n t['\\u3228'] = '\\u0028\\u4E5D\\u0029';\n t['\\u3229'] = '\\u0028\\u5341\\u0029';\n t['\\u322A'] = '\\u0028\\u6708\\u0029';\n t['\\u322B'] = '\\u0028\\u706B\\u0029';\n t['\\u322C'] = '\\u0028\\u6C34\\u0029';\n t['\\u322D'] = '\\u0028\\u6728\\u0029';\n t['\\u322E'] = '\\u0028\\u91D1\\u0029';\n t['\\u322F'] = '\\u0028\\u571F\\u0029';\n t['\\u3230'] = '\\u0028\\u65E5\\u0029';\n t['\\u3231'] = '\\u0028\\u682A\\u0029';\n t['\\u3232'] = '\\u0028\\u6709\\u0029';\n t['\\u3233'] = '\\u0028\\u793E\\u0029';\n t['\\u3234'] = '\\u0028\\u540D\\u0029';\n t['\\u3235'] = '\\u0028\\u7279\\u0029';\n t['\\u3236'] = '\\u0028\\u8CA1\\u0029';\n t['\\u3237'] = '\\u0028\\u795D\\u0029';\n t['\\u3238'] = '\\u0028\\u52B4\\u0029';\n t['\\u3239'] = '\\u0028\\u4EE3\\u0029';\n t['\\u323A'] = '\\u0028\\u547C\\u0029';\n t['\\u323B'] = '\\u0028\\u5B66\\u0029';\n t['\\u323C'] = '\\u0028\\u76E3\\u0029';\n t['\\u323D'] = '\\u0028\\u4F01\\u0029';\n t['\\u323E'] = '\\u0028\\u8CC7\\u0029';\n t['\\u323F'] = '\\u0028\\u5354\\u0029';\n t['\\u3240'] = '\\u0028\\u796D\\u0029';\n t['\\u3241'] = '\\u0028\\u4F11\\u0029';\n t['\\u3242'] = '\\u0028\\u81EA\\u0029';\n t['\\u3243'] = '\\u0028\\u81F3\\u0029';\n t['\\u32C0'] = '\\u0031\\u6708';\n t['\\u32C1'] = '\\u0032\\u6708';\n t['\\u32C2'] = '\\u0033\\u6708';\n t['\\u32C3'] = '\\u0034\\u6708';\n t['\\u32C4'] = '\\u0035\\u6708';\n t['\\u32C5'] = '\\u0036\\u6708';\n t['\\u32C6'] = '\\u0037\\u6708';\n t['\\u32C7'] = '\\u0038\\u6708';\n t['\\u32C8'] = '\\u0039\\u6708';\n t['\\u32C9'] = '\\u0031\\u0030\\u6708';\n t['\\u32CA'] = '\\u0031\\u0031\\u6708';\n t['\\u32CB'] = '\\u0031\\u0032\\u6708';\n t['\\u3358'] = '\\u0030\\u70B9';\n t['\\u3359'] = '\\u0031\\u70B9';\n t['\\u335A'] = '\\u0032\\u70B9';\n t['\\u335B'] = '\\u0033\\u70B9';\n t['\\u335C'] = '\\u0034\\u70B9';\n t['\\u335D'] = '\\u0035\\u70B9';\n t['\\u335E'] = '\\u0036\\u70B9';\n t['\\u335F'] = '\\u0037\\u70B9';\n t['\\u3360'] = '\\u0038\\u70B9';\n t['\\u3361'] = '\\u0039\\u70B9';\n t['\\u3362'] = '\\u0031\\u0030\\u70B9';\n t['\\u3363'] = '\\u0031\\u0031\\u70B9';\n t['\\u3364'] = '\\u0031\\u0032\\u70B9';\n t['\\u3365'] = '\\u0031\\u0033\\u70B9';\n t['\\u3366'] = '\\u0031\\u0034\\u70B9';\n t['\\u3367'] = '\\u0031\\u0035\\u70B9';\n t['\\u3368'] = '\\u0031\\u0036\\u70B9';\n t['\\u3369'] = '\\u0031\\u0037\\u70B9';\n t['\\u336A'] = '\\u0031\\u0038\\u70B9';\n t['\\u336B'] = '\\u0031\\u0039\\u70B9';\n t['\\u336C'] = '\\u0032\\u0030\\u70B9';\n t['\\u336D'] = '\\u0032\\u0031\\u70B9';\n t['\\u336E'] = '\\u0032\\u0032\\u70B9';\n t['\\u336F'] = '\\u0032\\u0033\\u70B9';\n t['\\u3370'] = '\\u0032\\u0034\\u70B9';\n t['\\u33E0'] = '\\u0031\\u65E5';\n t['\\u33E1'] = '\\u0032\\u65E5';\n t['\\u33E2'] = '\\u0033\\u65E5';\n t['\\u33E3'] = '\\u0034\\u65E5';\n t['\\u33E4'] = '\\u0035\\u65E5';\n t['\\u33E5'] = '\\u0036\\u65E5';\n t['\\u33E6'] = '\\u0037\\u65E5';\n t['\\u33E7'] = '\\u0038\\u65E5';\n t['\\u33E8'] = '\\u0039\\u65E5';\n t['\\u33E9'] = '\\u0031\\u0030\\u65E5';\n t['\\u33EA'] = '\\u0031\\u0031\\u65E5';\n t['\\u33EB'] = '\\u0031\\u0032\\u65E5';\n t['\\u33EC'] = '\\u0031\\u0033\\u65E5';\n t['\\u33ED'] = '\\u0031\\u0034\\u65E5';\n t['\\u33EE'] = '\\u0031\\u0035\\u65E5';\n t['\\u33EF'] = '\\u0031\\u0036\\u65E5';\n t['\\u33F0'] = '\\u0031\\u0037\\u65E5';\n t['\\u33F1'] = '\\u0031\\u0038\\u65E5';\n t['\\u33F2'] = '\\u0031\\u0039\\u65E5';\n t['\\u33F3'] = '\\u0032\\u0030\\u65E5';\n t['\\u33F4'] = '\\u0032\\u0031\\u65E5';\n t['\\u33F5'] = '\\u0032\\u0032\\u65E5';\n t['\\u33F6'] = '\\u0032\\u0033\\u65E5';\n t['\\u33F7'] = '\\u0032\\u0034\\u65E5';\n t['\\u33F8'] = '\\u0032\\u0035\\u65E5';\n t['\\u33F9'] = '\\u0032\\u0036\\u65E5';\n t['\\u33FA'] = '\\u0032\\u0037\\u65E5';\n t['\\u33FB'] = '\\u0032\\u0038\\u65E5';\n t['\\u33FC'] = '\\u0032\\u0039\\u65E5';\n t['\\u33FD'] = '\\u0033\\u0030\\u65E5';\n t['\\u33FE'] = '\\u0033\\u0031\\u65E5';\n t['\\uFB00'] = '\\u0066\\u0066';\n t['\\uFB01'] = '\\u0066\\u0069';\n t['\\uFB02'] = '\\u0066\\u006C';\n t['\\uFB03'] = '\\u0066\\u0066\\u0069';\n t['\\uFB04'] = '\\u0066\\u0066\\u006C';\n t['\\uFB05'] = '\\u017F\\u0074';\n t['\\uFB06'] = '\\u0073\\u0074';\n t['\\uFB13'] = '\\u0574\\u0576';\n t['\\uFB14'] = '\\u0574\\u0565';\n t['\\uFB15'] = '\\u0574\\u056B';\n t['\\uFB16'] = '\\u057E\\u0576';\n t['\\uFB17'] = '\\u0574\\u056D';\n t['\\uFB4F'] = '\\u05D0\\u05DC';\n t['\\uFB50'] = '\\u0671';\n t['\\uFB51'] = '\\u0671';\n t['\\uFB52'] = '\\u067B';\n t['\\uFB53'] = '\\u067B';\n t['\\uFB54'] = '\\u067B';\n t['\\uFB55'] = '\\u067B';\n t['\\uFB56'] = '\\u067E';\n t['\\uFB57'] = '\\u067E';\n t['\\uFB58'] = '\\u067E';\n t['\\uFB59'] = '\\u067E';\n t['\\uFB5A'] = '\\u0680';\n t['\\uFB5B'] = '\\u0680';\n t['\\uFB5C'] = '\\u0680';\n t['\\uFB5D'] = '\\u0680';\n t['\\uFB5E'] = '\\u067A';\n t['\\uFB5F'] = '\\u067A';\n t['\\uFB60'] = '\\u067A';\n t['\\uFB61'] = '\\u067A';\n t['\\uFB62'] = '\\u067F';\n t['\\uFB63'] = '\\u067F';\n t['\\uFB64'] = '\\u067F';\n t['\\uFB65'] = '\\u067F';\n t['\\uFB66'] = '\\u0679';\n t['\\uFB67'] = '\\u0679';\n t['\\uFB68'] = '\\u0679';\n t['\\uFB69'] = '\\u0679';\n t['\\uFB6A'] = '\\u06A4';\n t['\\uFB6B'] = '\\u06A4';\n t['\\uFB6C'] = '\\u06A4';\n t['\\uFB6D'] = '\\u06A4';\n t['\\uFB6E'] = '\\u06A6';\n t['\\uFB6F'] = '\\u06A6';\n t['\\uFB70'] = '\\u06A6';\n t['\\uFB71'] = '\\u06A6';\n t['\\uFB72'] = '\\u0684';\n t['\\uFB73'] = '\\u0684';\n t['\\uFB74'] = '\\u0684';\n t['\\uFB75'] = '\\u0684';\n t['\\uFB76'] = '\\u0683';\n t['\\uFB77'] = '\\u0683';\n t['\\uFB78'] = '\\u0683';\n t['\\uFB79'] = '\\u0683';\n t['\\uFB7A'] = '\\u0686';\n t['\\uFB7B'] = '\\u0686';\n t['\\uFB7C'] = '\\u0686';\n t['\\uFB7D'] = '\\u0686';\n t['\\uFB7E'] = '\\u0687';\n t['\\uFB7F'] = '\\u0687';\n t['\\uFB80'] = '\\u0687';\n t['\\uFB81'] = '\\u0687';\n t['\\uFB82'] = '\\u068D';\n t['\\uFB83'] = '\\u068D';\n t['\\uFB84'] = '\\u068C';\n t['\\uFB85'] = '\\u068C';\n t['\\uFB86'] = '\\u068E';\n t['\\uFB87'] = '\\u068E';\n t['\\uFB88'] = '\\u0688';\n t['\\uFB89'] = '\\u0688';\n t['\\uFB8A'] = '\\u0698';\n t['\\uFB8B'] = '\\u0698';\n t['\\uFB8C'] = '\\u0691';\n t['\\uFB8D'] = '\\u0691';\n t['\\uFB8E'] = '\\u06A9';\n t['\\uFB8F'] = '\\u06A9';\n t['\\uFB90'] = '\\u06A9';\n t['\\uFB91'] = '\\u06A9';\n t['\\uFB92'] = '\\u06AF';\n t['\\uFB93'] = '\\u06AF';\n t['\\uFB94'] = '\\u06AF';\n t['\\uFB95'] = '\\u06AF';\n t['\\uFB96'] = '\\u06B3';\n t['\\uFB97'] = '\\u06B3';\n t['\\uFB98'] = '\\u06B3';\n t['\\uFB99'] = '\\u06B3';\n t['\\uFB9A'] = '\\u06B1';\n t['\\uFB9B'] = '\\u06B1';\n t['\\uFB9C'] = '\\u06B1';\n t['\\uFB9D'] = '\\u06B1';\n t['\\uFB9E'] = '\\u06BA';\n t['\\uFB9F'] = '\\u06BA';\n t['\\uFBA0'] = '\\u06BB';\n t['\\uFBA1'] = '\\u06BB';\n t['\\uFBA2'] = '\\u06BB';\n t['\\uFBA3'] = '\\u06BB';\n t['\\uFBA4'] = '\\u06C0';\n t['\\uFBA5'] = '\\u06C0';\n t['\\uFBA6'] = '\\u06C1';\n t['\\uFBA7'] = '\\u06C1';\n t['\\uFBA8'] = '\\u06C1';\n t['\\uFBA9'] = '\\u06C1';\n t['\\uFBAA'] = '\\u06BE';\n t['\\uFBAB'] = '\\u06BE';\n t['\\uFBAC'] = '\\u06BE';\n t['\\uFBAD'] = '\\u06BE';\n t['\\uFBAE'] = '\\u06D2';\n t['\\uFBAF'] = '\\u06D2';\n t['\\uFBB0'] = '\\u06D3';\n t['\\uFBB1'] = '\\u06D3';\n t['\\uFBD3'] = '\\u06AD';\n t['\\uFBD4'] = '\\u06AD';\n t['\\uFBD5'] = '\\u06AD';\n t['\\uFBD6'] = '\\u06AD';\n t['\\uFBD7'] = '\\u06C7';\n t['\\uFBD8'] = '\\u06C7';\n t['\\uFBD9'] = '\\u06C6';\n t['\\uFBDA'] = '\\u06C6';\n t['\\uFBDB'] = '\\u06C8';\n t['\\uFBDC'] = '\\u06C8';\n t['\\uFBDD'] = '\\u0677';\n t['\\uFBDE'] = '\\u06CB';\n t['\\uFBDF'] = '\\u06CB';\n t['\\uFBE0'] = '\\u06C5';\n t['\\uFBE1'] = '\\u06C5';\n t['\\uFBE2'] = '\\u06C9';\n t['\\uFBE3'] = '\\u06C9';\n t['\\uFBE4'] = '\\u06D0';\n t['\\uFBE5'] = '\\u06D0';\n t['\\uFBE6'] = '\\u06D0';\n t['\\uFBE7'] = '\\u06D0';\n t['\\uFBE8'] = '\\u0649';\n t['\\uFBE9'] = '\\u0649';\n t['\\uFBEA'] = '\\u0626\\u0627';\n t['\\uFBEB'] = '\\u0626\\u0627';\n t['\\uFBEC'] = '\\u0626\\u06D5';\n t['\\uFBED'] = '\\u0626\\u06D5';\n t['\\uFBEE'] = '\\u0626\\u0648';\n t['\\uFBEF'] = '\\u0626\\u0648';\n t['\\uFBF0'] = '\\u0626\\u06C7';\n t['\\uFBF1'] = '\\u0626\\u06C7';\n t['\\uFBF2'] = '\\u0626\\u06C6';\n t['\\uFBF3'] = '\\u0626\\u06C6';\n t['\\uFBF4'] = '\\u0626\\u06C8';\n t['\\uFBF5'] = '\\u0626\\u06C8';\n t['\\uFBF6'] = '\\u0626\\u06D0';\n t['\\uFBF7'] = '\\u0626\\u06D0';\n t['\\uFBF8'] = '\\u0626\\u06D0';\n t['\\uFBF9'] = '\\u0626\\u0649';\n t['\\uFBFA'] = '\\u0626\\u0649';\n t['\\uFBFB'] = '\\u0626\\u0649';\n t['\\uFBFC'] = '\\u06CC';\n t['\\uFBFD'] = '\\u06CC';\n t['\\uFBFE'] = '\\u06CC';\n t['\\uFBFF'] = '\\u06CC';\n t['\\uFC00'] = '\\u0626\\u062C';\n t['\\uFC01'] = '\\u0626\\u062D';\n t['\\uFC02'] = '\\u0626\\u0645';\n t['\\uFC03'] = '\\u0626\\u0649';\n t['\\uFC04'] = '\\u0626\\u064A';\n t['\\uFC05'] = '\\u0628\\u062C';\n t['\\uFC06'] = '\\u0628\\u062D';\n t['\\uFC07'] = '\\u0628\\u062E';\n t['\\uFC08'] = '\\u0628\\u0645';\n t['\\uFC09'] = '\\u0628\\u0649';\n t['\\uFC0A'] = '\\u0628\\u064A';\n t['\\uFC0B'] = '\\u062A\\u062C';\n t['\\uFC0C'] = '\\u062A\\u062D';\n t['\\uFC0D'] = '\\u062A\\u062E';\n t['\\uFC0E'] = '\\u062A\\u0645';\n t['\\uFC0F'] = '\\u062A\\u0649';\n t['\\uFC10'] = '\\u062A\\u064A';\n t['\\uFC11'] = '\\u062B\\u062C';\n t['\\uFC12'] = '\\u062B\\u0645';\n t['\\uFC13'] = '\\u062B\\u0649';\n t['\\uFC14'] = '\\u062B\\u064A';\n t['\\uFC15'] = '\\u062C\\u062D';\n t['\\uFC16'] = '\\u062C\\u0645';\n t['\\uFC17'] = '\\u062D\\u062C';\n t['\\uFC18'] = '\\u062D\\u0645';\n t['\\uFC19'] = '\\u062E\\u062C';\n t['\\uFC1A'] = '\\u062E\\u062D';\n t['\\uFC1B'] = '\\u062E\\u0645';\n t['\\uFC1C'] = '\\u0633\\u062C';\n t['\\uFC1D'] = '\\u0633\\u062D';\n t['\\uFC1E'] = '\\u0633\\u062E';\n t['\\uFC1F'] = '\\u0633\\u0645';\n t['\\uFC20'] = '\\u0635\\u062D';\n t['\\uFC21'] = '\\u0635\\u0645';\n t['\\uFC22'] = '\\u0636\\u062C';\n t['\\uFC23'] = '\\u0636\\u062D';\n t['\\uFC24'] = '\\u0636\\u062E';\n t['\\uFC25'] = '\\u0636\\u0645';\n t['\\uFC26'] = '\\u0637\\u062D';\n t['\\uFC27'] = '\\u0637\\u0645';\n t['\\uFC28'] = '\\u0638\\u0645';\n t['\\uFC29'] = '\\u0639\\u062C';\n t['\\uFC2A'] = '\\u0639\\u0645';\n t['\\uFC2B'] = '\\u063A\\u062C';\n t['\\uFC2C'] = '\\u063A\\u0645';\n t['\\uFC2D'] = '\\u0641\\u062C';\n t['\\uFC2E'] = '\\u0641\\u062D';\n t['\\uFC2F'] = '\\u0641\\u062E';\n t['\\uFC30'] = '\\u0641\\u0645';\n t['\\uFC31'] = '\\u0641\\u0649';\n t['\\uFC32'] = '\\u0641\\u064A';\n t['\\uFC33'] = '\\u0642\\u062D';\n t['\\uFC34'] = '\\u0642\\u0645';\n t['\\uFC35'] = '\\u0642\\u0649';\n t['\\uFC36'] = '\\u0642\\u064A';\n t['\\uFC37'] = '\\u0643\\u0627';\n t['\\uFC38'] = '\\u0643\\u062C';\n t['\\uFC39'] = '\\u0643\\u062D';\n t['\\uFC3A'] = '\\u0643\\u062E';\n t['\\uFC3B'] = '\\u0643\\u0644';\n t['\\uFC3C'] = '\\u0643\\u0645';\n t['\\uFC3D'] = '\\u0643\\u0649';\n t['\\uFC3E'] = '\\u0643\\u064A';\n t['\\uFC3F'] = '\\u0644\\u062C';\n t['\\uFC40'] = '\\u0644\\u062D';\n t['\\uFC41'] = '\\u0644\\u062E';\n t['\\uFC42'] = '\\u0644\\u0645';\n t['\\uFC43'] = '\\u0644\\u0649';\n t['\\uFC44'] = '\\u0644\\u064A';\n t['\\uFC45'] = '\\u0645\\u062C';\n t['\\uFC46'] = '\\u0645\\u062D';\n t['\\uFC47'] = '\\u0645\\u062E';\n t['\\uFC48'] = '\\u0645\\u0645';\n t['\\uFC49'] = '\\u0645\\u0649';\n t['\\uFC4A'] = '\\u0645\\u064A';\n t['\\uFC4B'] = '\\u0646\\u062C';\n t['\\uFC4C'] = '\\u0646\\u062D';\n t['\\uFC4D'] = '\\u0646\\u062E';\n t['\\uFC4E'] = '\\u0646\\u0645';\n t['\\uFC4F'] = '\\u0646\\u0649';\n t['\\uFC50'] = '\\u0646\\u064A';\n t['\\uFC51'] = '\\u0647\\u062C';\n t['\\uFC52'] = '\\u0647\\u0645';\n t['\\uFC53'] = '\\u0647\\u0649';\n t['\\uFC54'] = '\\u0647\\u064A';\n t['\\uFC55'] = '\\u064A\\u062C';\n t['\\uFC56'] = '\\u064A\\u062D';\n t['\\uFC57'] = '\\u064A\\u062E';\n t['\\uFC58'] = '\\u064A\\u0645';\n t['\\uFC59'] = '\\u064A\\u0649';\n t['\\uFC5A'] = '\\u064A\\u064A';\n t['\\uFC5B'] = '\\u0630\\u0670';\n t['\\uFC5C'] = '\\u0631\\u0670';\n t['\\uFC5D'] = '\\u0649\\u0670';\n t['\\uFC5E'] = '\\u0020\\u064C\\u0651';\n t['\\uFC5F'] = '\\u0020\\u064D\\u0651';\n t['\\uFC60'] = '\\u0020\\u064E\\u0651';\n t['\\uFC61'] = '\\u0020\\u064F\\u0651';\n t['\\uFC62'] = '\\u0020\\u0650\\u0651';\n t['\\uFC63'] = '\\u0020\\u0651\\u0670';\n t['\\uFC64'] = '\\u0626\\u0631';\n t['\\uFC65'] = '\\u0626\\u0632';\n t['\\uFC66'] = '\\u0626\\u0645';\n t['\\uFC67'] = '\\u0626\\u0646';\n t['\\uFC68'] = '\\u0626\\u0649';\n t['\\uFC69'] = '\\u0626\\u064A';\n t['\\uFC6A'] = '\\u0628\\u0631';\n t['\\uFC6B'] = '\\u0628\\u0632';\n t['\\uFC6C'] = '\\u0628\\u0645';\n t['\\uFC6D'] = '\\u0628\\u0646';\n t['\\uFC6E'] = '\\u0628\\u0649';\n t['\\uFC6F'] = '\\u0628\\u064A';\n t['\\uFC70'] = '\\u062A\\u0631';\n t['\\uFC71'] = '\\u062A\\u0632';\n t['\\uFC72'] = '\\u062A\\u0645';\n t['\\uFC73'] = '\\u062A\\u0646';\n t['\\uFC74'] = '\\u062A\\u0649';\n t['\\uFC75'] = '\\u062A\\u064A';\n t['\\uFC76'] = '\\u062B\\u0631';\n t['\\uFC77'] = '\\u062B\\u0632';\n t['\\uFC78'] = '\\u062B\\u0645';\n t['\\uFC79'] = '\\u062B\\u0646';\n t['\\uFC7A'] = '\\u062B\\u0649';\n t['\\uFC7B'] = '\\u062B\\u064A';\n t['\\uFC7C'] = '\\u0641\\u0649';\n t['\\uFC7D'] = '\\u0641\\u064A';\n t['\\uFC7E'] = '\\u0642\\u0649';\n t['\\uFC7F'] = '\\u0642\\u064A';\n t['\\uFC80'] = '\\u0643\\u0627';\n t['\\uFC81'] = '\\u0643\\u0644';\n t['\\uFC82'] = '\\u0643\\u0645';\n t['\\uFC83'] = '\\u0643\\u0649';\n t['\\uFC84'] = '\\u0643\\u064A';\n t['\\uFC85'] = '\\u0644\\u0645';\n t['\\uFC86'] = '\\u0644\\u0649';\n t['\\uFC87'] = '\\u0644\\u064A';\n t['\\uFC88'] = '\\u0645\\u0627';\n t['\\uFC89'] = '\\u0645\\u0645';\n t['\\uFC8A'] = '\\u0646\\u0631';\n t['\\uFC8B'] = '\\u0646\\u0632';\n t['\\uFC8C'] = '\\u0646\\u0645';\n t['\\uFC8D'] = '\\u0646\\u0646';\n t['\\uFC8E'] = '\\u0646\\u0649';\n t['\\uFC8F'] = '\\u0646\\u064A';\n t['\\uFC90'] = '\\u0649\\u0670';\n t['\\uFC91'] = '\\u064A\\u0631';\n t['\\uFC92'] = '\\u064A\\u0632';\n t['\\uFC93'] = '\\u064A\\u0645';\n t['\\uFC94'] = '\\u064A\\u0646';\n t['\\uFC95'] = '\\u064A\\u0649';\n t['\\uFC96'] = '\\u064A\\u064A';\n t['\\uFC97'] = '\\u0626\\u062C';\n t['\\uFC98'] = '\\u0626\\u062D';\n t['\\uFC99'] = '\\u0626\\u062E';\n t['\\uFC9A'] = '\\u0626\\u0645';\n t['\\uFC9B'] = '\\u0626\\u0647';\n t['\\uFC9C'] = '\\u0628\\u062C';\n t['\\uFC9D'] = '\\u0628\\u062D';\n t['\\uFC9E'] = '\\u0628\\u062E';\n t['\\uFC9F'] = '\\u0628\\u0645';\n t['\\uFCA0'] = '\\u0628\\u0647';\n t['\\uFCA1'] = '\\u062A\\u062C';\n t['\\uFCA2'] = '\\u062A\\u062D';\n t['\\uFCA3'] = '\\u062A\\u062E';\n t['\\uFCA4'] = '\\u062A\\u0645';\n t['\\uFCA5'] = '\\u062A\\u0647';\n t['\\uFCA6'] = '\\u062B\\u0645';\n t['\\uFCA7'] = '\\u062C\\u062D';\n t['\\uFCA8'] = '\\u062C\\u0645';\n t['\\uFCA9'] = '\\u062D\\u062C';\n t['\\uFCAA'] = '\\u062D\\u0645';\n t['\\uFCAB'] = '\\u062E\\u062C';\n t['\\uFCAC'] = '\\u062E\\u0645';\n t['\\uFCAD'] = '\\u0633\\u062C';\n t['\\uFCAE'] = '\\u0633\\u062D';\n t['\\uFCAF'] = '\\u0633\\u062E';\n t['\\uFCB0'] = '\\u0633\\u0645';\n t['\\uFCB1'] = '\\u0635\\u062D';\n t['\\uFCB2'] = '\\u0635\\u062E';\n t['\\uFCB3'] = '\\u0635\\u0645';\n t['\\uFCB4'] = '\\u0636\\u062C';\n t['\\uFCB5'] = '\\u0636\\u062D';\n t['\\uFCB6'] = '\\u0636\\u062E';\n t['\\uFCB7'] = '\\u0636\\u0645';\n t['\\uFCB8'] = '\\u0637\\u062D';\n t['\\uFCB9'] = '\\u0638\\u0645';\n t['\\uFCBA'] = '\\u0639\\u062C';\n t['\\uFCBB'] = '\\u0639\\u0645';\n t['\\uFCBC'] = '\\u063A\\u062C';\n t['\\uFCBD'] = '\\u063A\\u0645';\n t['\\uFCBE'] = '\\u0641\\u062C';\n t['\\uFCBF'] = '\\u0641\\u062D';\n t['\\uFCC0'] = '\\u0641\\u062E';\n t['\\uFCC1'] = '\\u0641\\u0645';\n t['\\uFCC2'] = '\\u0642\\u062D';\n t['\\uFCC3'] = '\\u0642\\u0645';\n t['\\uFCC4'] = '\\u0643\\u062C';\n t['\\uFCC5'] = '\\u0643\\u062D';\n t['\\uFCC6'] = '\\u0643\\u062E';\n t['\\uFCC7'] = '\\u0643\\u0644';\n t['\\uFCC8'] = '\\u0643\\u0645';\n t['\\uFCC9'] = '\\u0644\\u062C';\n t['\\uFCCA'] = '\\u0644\\u062D';\n t['\\uFCCB'] = '\\u0644\\u062E';\n t['\\uFCCC'] = '\\u0644\\u0645';\n t['\\uFCCD'] = '\\u0644\\u0647';\n t['\\uFCCE'] = '\\u0645\\u062C';\n t['\\uFCCF'] = '\\u0645\\u062D';\n t['\\uFCD0'] = '\\u0645\\u062E';\n t['\\uFCD1'] = '\\u0645\\u0645';\n t['\\uFCD2'] = '\\u0646\\u062C';\n t['\\uFCD3'] = '\\u0646\\u062D';\n t['\\uFCD4'] = '\\u0646\\u062E';\n t['\\uFCD5'] = '\\u0646\\u0645';\n t['\\uFCD6'] = '\\u0646\\u0647';\n t['\\uFCD7'] = '\\u0647\\u062C';\n t['\\uFCD8'] = '\\u0647\\u0645';\n t['\\uFCD9'] = '\\u0647\\u0670';\n t['\\uFCDA'] = '\\u064A\\u062C';\n t['\\uFCDB'] = '\\u064A\\u062D';\n t['\\uFCDC'] = '\\u064A\\u062E';\n t['\\uFCDD'] = '\\u064A\\u0645';\n t['\\uFCDE'] = '\\u064A\\u0647';\n t['\\uFCDF'] = '\\u0626\\u0645';\n t['\\uFCE0'] = '\\u0626\\u0647';\n t['\\uFCE1'] = '\\u0628\\u0645';\n t['\\uFCE2'] = '\\u0628\\u0647';\n t['\\uFCE3'] = '\\u062A\\u0645';\n t['\\uFCE4'] = '\\u062A\\u0647';\n t['\\uFCE5'] = '\\u062B\\u0645';\n t['\\uFCE6'] = '\\u062B\\u0647';\n t['\\uFCE7'] = '\\u0633\\u0645';\n t['\\uFCE8'] = '\\u0633\\u0647';\n t['\\uFCE9'] = '\\u0634\\u0645';\n t['\\uFCEA'] = '\\u0634\\u0647';\n t['\\uFCEB'] = '\\u0643\\u0644';\n t['\\uFCEC'] = '\\u0643\\u0645';\n t['\\uFCED'] = '\\u0644\\u0645';\n t['\\uFCEE'] = '\\u0646\\u0645';\n t['\\uFCEF'] = '\\u0646\\u0647';\n t['\\uFCF0'] = '\\u064A\\u0645';\n t['\\uFCF1'] = '\\u064A\\u0647';\n t['\\uFCF2'] = '\\u0640\\u064E\\u0651';\n t['\\uFCF3'] = '\\u0640\\u064F\\u0651';\n t['\\uFCF4'] = '\\u0640\\u0650\\u0651';\n t['\\uFCF5'] = '\\u0637\\u0649';\n t['\\uFCF6'] = '\\u0637\\u064A';\n t['\\uFCF7'] = '\\u0639\\u0649';\n t['\\uFCF8'] = '\\u0639\\u064A';\n t['\\uFCF9'] = '\\u063A\\u0649';\n t['\\uFCFA'] = '\\u063A\\u064A';\n t['\\uFCFB'] = '\\u0633\\u0649';\n t['\\uFCFC'] = '\\u0633\\u064A';\n t['\\uFCFD'] = '\\u0634\\u0649';\n t['\\uFCFE'] = '\\u0634\\u064A';\n t['\\uFCFF'] = '\\u062D\\u0649';\n t['\\uFD00'] = '\\u062D\\u064A';\n t['\\uFD01'] = '\\u062C\\u0649';\n t['\\uFD02'] = '\\u062C\\u064A';\n t['\\uFD03'] = '\\u062E\\u0649';\n t['\\uFD04'] = '\\u062E\\u064A';\n t['\\uFD05'] = '\\u0635\\u0649';\n t['\\uFD06'] = '\\u0635\\u064A';\n t['\\uFD07'] = '\\u0636\\u0649';\n t['\\uFD08'] = '\\u0636\\u064A';\n t['\\uFD09'] = '\\u0634\\u062C';\n t['\\uFD0A'] = '\\u0634\\u062D';\n t['\\uFD0B'] = '\\u0634\\u062E';\n t['\\uFD0C'] = '\\u0634\\u0645';\n t['\\uFD0D'] = '\\u0634\\u0631';\n t['\\uFD0E'] = '\\u0633\\u0631';\n t['\\uFD0F'] = '\\u0635\\u0631';\n t['\\uFD10'] = '\\u0636\\u0631';\n t['\\uFD11'] = '\\u0637\\u0649';\n t['\\uFD12'] = '\\u0637\\u064A';\n t['\\uFD13'] = '\\u0639\\u0649';\n t['\\uFD14'] = '\\u0639\\u064A';\n t['\\uFD15'] = '\\u063A\\u0649';\n t['\\uFD16'] = '\\u063A\\u064A';\n t['\\uFD17'] = '\\u0633\\u0649';\n t['\\uFD18'] = '\\u0633\\u064A';\n t['\\uFD19'] = '\\u0634\\u0649';\n t['\\uFD1A'] = '\\u0634\\u064A';\n t['\\uFD1B'] = '\\u062D\\u0649';\n t['\\uFD1C'] = '\\u062D\\u064A';\n t['\\uFD1D'] = '\\u062C\\u0649';\n t['\\uFD1E'] = '\\u062C\\u064A';\n t['\\uFD1F'] = '\\u062E\\u0649';\n t['\\uFD20'] = '\\u062E\\u064A';\n t['\\uFD21'] = '\\u0635\\u0649';\n t['\\uFD22'] = '\\u0635\\u064A';\n t['\\uFD23'] = '\\u0636\\u0649';\n t['\\uFD24'] = '\\u0636\\u064A';\n t['\\uFD25'] = '\\u0634\\u062C';\n t['\\uFD26'] = '\\u0634\\u062D';\n t['\\uFD27'] = '\\u0634\\u062E';\n t['\\uFD28'] = '\\u0634\\u0645';\n t['\\uFD29'] = '\\u0634\\u0631';\n t['\\uFD2A'] = '\\u0633\\u0631';\n t['\\uFD2B'] = '\\u0635\\u0631';\n t['\\uFD2C'] = '\\u0636\\u0631';\n t['\\uFD2D'] = '\\u0634\\u062C';\n t['\\uFD2E'] = '\\u0634\\u062D';\n t['\\uFD2F'] = '\\u0634\\u062E';\n t['\\uFD30'] = '\\u0634\\u0645';\n t['\\uFD31'] = '\\u0633\\u0647';\n t['\\uFD32'] = '\\u0634\\u0647';\n t['\\uFD33'] = '\\u0637\\u0645';\n t['\\uFD34'] = '\\u0633\\u062C';\n t['\\uFD35'] = '\\u0633\\u062D';\n t['\\uFD36'] = '\\u0633\\u062E';\n t['\\uFD37'] = '\\u0634\\u062C';\n t['\\uFD38'] = '\\u0634\\u062D';\n t['\\uFD39'] = '\\u0634\\u062E';\n t['\\uFD3A'] = '\\u0637\\u0645';\n t['\\uFD3B'] = '\\u0638\\u0645';\n t['\\uFD3C'] = '\\u0627\\u064B';\n t['\\uFD3D'] = '\\u0627\\u064B';\n t['\\uFD50'] = '\\u062A\\u062C\\u0645';\n t['\\uFD51'] = '\\u062A\\u062D\\u062C';\n t['\\uFD52'] = '\\u062A\\u062D\\u062C';\n t['\\uFD53'] = '\\u062A\\u062D\\u0645';\n t['\\uFD54'] = '\\u062A\\u062E\\u0645';\n t['\\uFD55'] = '\\u062A\\u0645\\u062C';\n t['\\uFD56'] = '\\u062A\\u0645\\u062D';\n t['\\uFD57'] = '\\u062A\\u0645\\u062E';\n t['\\uFD58'] = '\\u062C\\u0645\\u062D';\n t['\\uFD59'] = '\\u062C\\u0645\\u062D';\n t['\\uFD5A'] = '\\u062D\\u0645\\u064A';\n t['\\uFD5B'] = '\\u062D\\u0645\\u0649';\n t['\\uFD5C'] = '\\u0633\\u062D\\u062C';\n t['\\uFD5D'] = '\\u0633\\u062C\\u062D';\n t['\\uFD5E'] = '\\u0633\\u062C\\u0649';\n t['\\uFD5F'] = '\\u0633\\u0645\\u062D';\n t['\\uFD60'] = '\\u0633\\u0645\\u062D';\n t['\\uFD61'] = '\\u0633\\u0645\\u062C';\n t['\\uFD62'] = '\\u0633\\u0645\\u0645';\n t['\\uFD63'] = '\\u0633\\u0645\\u0645';\n t['\\uFD64'] = '\\u0635\\u062D\\u062D';\n t['\\uFD65'] = '\\u0635\\u062D\\u062D';\n t['\\uFD66'] = '\\u0635\\u0645\\u0645';\n t['\\uFD67'] = '\\u0634\\u062D\\u0645';\n t['\\uFD68'] = '\\u0634\\u062D\\u0645';\n t['\\uFD69'] = '\\u0634\\u062C\\u064A';\n t['\\uFD6A'] = '\\u0634\\u0645\\u062E';\n t['\\uFD6B'] = '\\u0634\\u0645\\u062E';\n t['\\uFD6C'] = '\\u0634\\u0645\\u0645';\n t['\\uFD6D'] = '\\u0634\\u0645\\u0645';\n t['\\uFD6E'] = '\\u0636\\u062D\\u0649';\n t['\\uFD6F'] = '\\u0636\\u062E\\u0645';\n t['\\uFD70'] = '\\u0636\\u062E\\u0645';\n t['\\uFD71'] = '\\u0637\\u0645\\u062D';\n t['\\uFD72'] = '\\u0637\\u0645\\u062D';\n t['\\uFD73'] = '\\u0637\\u0645\\u0645';\n t['\\uFD74'] = '\\u0637\\u0645\\u064A';\n t['\\uFD75'] = '\\u0639\\u062C\\u0645';\n t['\\uFD76'] = '\\u0639\\u0645\\u0645';\n t['\\uFD77'] = '\\u0639\\u0645\\u0645';\n t['\\uFD78'] = '\\u0639\\u0645\\u0649';\n t['\\uFD79'] = '\\u063A\\u0645\\u0645';\n t['\\uFD7A'] = '\\u063A\\u0645\\u064A';\n t['\\uFD7B'] = '\\u063A\\u0645\\u0649';\n t['\\uFD7C'] = '\\u0641\\u062E\\u0645';\n t['\\uFD7D'] = '\\u0641\\u062E\\u0645';\n t['\\uFD7E'] = '\\u0642\\u0645\\u062D';\n t['\\uFD7F'] = '\\u0642\\u0645\\u0645';\n t['\\uFD80'] = '\\u0644\\u062D\\u0645';\n t['\\uFD81'] = '\\u0644\\u062D\\u064A';\n t['\\uFD82'] = '\\u0644\\u062D\\u0649';\n t['\\uFD83'] = '\\u0644\\u062C\\u062C';\n t['\\uFD84'] = '\\u0644\\u062C\\u062C';\n t['\\uFD85'] = '\\u0644\\u062E\\u0645';\n t['\\uFD86'] = '\\u0644\\u062E\\u0645';\n t['\\uFD87'] = '\\u0644\\u0645\\u062D';\n t['\\uFD88'] = '\\u0644\\u0645\\u062D';\n t['\\uFD89'] = '\\u0645\\u062D\\u062C';\n t['\\uFD8A'] = '\\u0645\\u062D\\u0645';\n t['\\uFD8B'] = '\\u0645\\u062D\\u064A';\n t['\\uFD8C'] = '\\u0645\\u062C\\u062D';\n t['\\uFD8D'] = '\\u0645\\u062C\\u0645';\n t['\\uFD8E'] = '\\u0645\\u062E\\u062C';\n t['\\uFD8F'] = '\\u0645\\u062E\\u0645';\n t['\\uFD92'] = '\\u0645\\u062C\\u062E';\n t['\\uFD93'] = '\\u0647\\u0645\\u062C';\n t['\\uFD94'] = '\\u0647\\u0645\\u0645';\n t['\\uFD95'] = '\\u0646\\u062D\\u0645';\n t['\\uFD96'] = '\\u0646\\u062D\\u0649';\n t['\\uFD97'] = '\\u0646\\u062C\\u0645';\n t['\\uFD98'] = '\\u0646\\u062C\\u0645';\n t['\\uFD99'] = '\\u0646\\u062C\\u0649';\n t['\\uFD9A'] = '\\u0646\\u0645\\u064A';\n t['\\uFD9B'] = '\\u0646\\u0645\\u0649';\n t['\\uFD9C'] = '\\u064A\\u0645\\u0645';\n t['\\uFD9D'] = '\\u064A\\u0645\\u0645';\n t['\\uFD9E'] = '\\u0628\\u062E\\u064A';\n t['\\uFD9F'] = '\\u062A\\u062C\\u064A';\n t['\\uFDA0'] = '\\u062A\\u062C\\u0649';\n t['\\uFDA1'] = '\\u062A\\u062E\\u064A';\n t['\\uFDA2'] = '\\u062A\\u062E\\u0649';\n t['\\uFDA3'] = '\\u062A\\u0645\\u064A';\n t['\\uFDA4'] = '\\u062A\\u0645\\u0649';\n t['\\uFDA5'] = '\\u062C\\u0645\\u064A';\n t['\\uFDA6'] = '\\u062C\\u062D\\u0649';\n t['\\uFDA7'] = '\\u062C\\u0645\\u0649';\n t['\\uFDA8'] = '\\u0633\\u062E\\u0649';\n t['\\uFDA9'] = '\\u0635\\u062D\\u064A';\n t['\\uFDAA'] = '\\u0634\\u062D\\u064A';\n t['\\uFDAB'] = '\\u0636\\u062D\\u064A';\n t['\\uFDAC'] = '\\u0644\\u062C\\u064A';\n t['\\uFDAD'] = '\\u0644\\u0645\\u064A';\n t['\\uFDAE'] = '\\u064A\\u062D\\u064A';\n t['\\uFDAF'] = '\\u064A\\u062C\\u064A';\n t['\\uFDB0'] = '\\u064A\\u0645\\u064A';\n t['\\uFDB1'] = '\\u0645\\u0645\\u064A';\n t['\\uFDB2'] = '\\u0642\\u0645\\u064A';\n t['\\uFDB3'] = '\\u0646\\u062D\\u064A';\n t['\\uFDB4'] = '\\u0642\\u0645\\u062D';\n t['\\uFDB5'] = '\\u0644\\u062D\\u0645';\n t['\\uFDB6'] = '\\u0639\\u0645\\u064A';\n t['\\uFDB7'] = '\\u0643\\u0645\\u064A';\n t['\\uFDB8'] = '\\u0646\\u062C\\u062D';\n t['\\uFDB9'] = '\\u0645\\u062E\\u064A';\n t['\\uFDBA'] = '\\u0644\\u062C\\u0645';\n t['\\uFDBB'] = '\\u0643\\u0645\\u0645';\n t['\\uFDBC'] = '\\u0644\\u062C\\u0645';\n t['\\uFDBD'] = '\\u0646\\u062C\\u062D';\n t['\\uFDBE'] = '\\u062C\\u062D\\u064A';\n t['\\uFDBF'] = '\\u062D\\u062C\\u064A';\n t['\\uFDC0'] = '\\u0645\\u062C\\u064A';\n t['\\uFDC1'] = '\\u0641\\u0645\\u064A';\n t['\\uFDC2'] = '\\u0628\\u062D\\u064A';\n t['\\uFDC3'] = '\\u0643\\u0645\\u0645';\n t['\\uFDC4'] = '\\u0639\\u062C\\u0645';\n t['\\uFDC5'] = '\\u0635\\u0645\\u0645';\n t['\\uFDC6'] = '\\u0633\\u062E\\u064A';\n t['\\uFDC7'] = '\\u0646\\u062C\\u064A';\n t['\\uFE49'] = '\\u203E';\n t['\\uFE4A'] = '\\u203E';\n t['\\uFE4B'] = '\\u203E';\n t['\\uFE4C'] = '\\u203E';\n t['\\uFE4D'] = '\\u005F';\n t['\\uFE4E'] = '\\u005F';\n t['\\uFE4F'] = '\\u005F';\n t['\\uFE80'] = '\\u0621';\n t['\\uFE81'] = '\\u0622';\n t['\\uFE82'] = '\\u0622';\n t['\\uFE83'] = '\\u0623';\n t['\\uFE84'] = '\\u0623';\n t['\\uFE85'] = '\\u0624';\n t['\\uFE86'] = '\\u0624';\n t['\\uFE87'] = '\\u0625';\n t['\\uFE88'] = '\\u0625';\n t['\\uFE89'] = '\\u0626';\n t['\\uFE8A'] = '\\u0626';\n t['\\uFE8B'] = '\\u0626';\n t['\\uFE8C'] = '\\u0626';\n t['\\uFE8D'] = '\\u0627';\n t['\\uFE8E'] = '\\u0627';\n t['\\uFE8F'] = '\\u0628';\n t['\\uFE90'] = '\\u0628';\n t['\\uFE91'] = '\\u0628';\n t['\\uFE92'] = '\\u0628';\n t['\\uFE93'] = '\\u0629';\n t['\\uFE94'] = '\\u0629';\n t['\\uFE95'] = '\\u062A';\n t['\\uFE96'] = '\\u062A';\n t['\\uFE97'] = '\\u062A';\n t['\\uFE98'] = '\\u062A';\n t['\\uFE99'] = '\\u062B';\n t['\\uFE9A'] = '\\u062B';\n t['\\uFE9B'] = '\\u062B';\n t['\\uFE9C'] = '\\u062B';\n t['\\uFE9D'] = '\\u062C';\n t['\\uFE9E'] = '\\u062C';\n t['\\uFE9F'] = '\\u062C';\n t['\\uFEA0'] = '\\u062C';\n t['\\uFEA1'] = '\\u062D';\n t['\\uFEA2'] = '\\u062D';\n t['\\uFEA3'] = '\\u062D';\n t['\\uFEA4'] = '\\u062D';\n t['\\uFEA5'] = '\\u062E';\n t['\\uFEA6'] = '\\u062E';\n t['\\uFEA7'] = '\\u062E';\n t['\\uFEA8'] = '\\u062E';\n t['\\uFEA9'] = '\\u062F';\n t['\\uFEAA'] = '\\u062F';\n t['\\uFEAB'] = '\\u0630';\n t['\\uFEAC'] = '\\u0630';\n t['\\uFEAD'] = '\\u0631';\n t['\\uFEAE'] = '\\u0631';\n t['\\uFEAF'] = '\\u0632';\n t['\\uFEB0'] = '\\u0632';\n t['\\uFEB1'] = '\\u0633';\n t['\\uFEB2'] = '\\u0633';\n t['\\uFEB3'] = '\\u0633';\n t['\\uFEB4'] = '\\u0633';\n t['\\uFEB5'] = '\\u0634';\n t['\\uFEB6'] = '\\u0634';\n t['\\uFEB7'] = '\\u0634';\n t['\\uFEB8'] = '\\u0634';\n t['\\uFEB9'] = '\\u0635';\n t['\\uFEBA'] = '\\u0635';\n t['\\uFEBB'] = '\\u0635';\n t['\\uFEBC'] = '\\u0635';\n t['\\uFEBD'] = '\\u0636';\n t['\\uFEBE'] = '\\u0636';\n t['\\uFEBF'] = '\\u0636';\n t['\\uFEC0'] = '\\u0636';\n t['\\uFEC1'] = '\\u0637';\n t['\\uFEC2'] = '\\u0637';\n t['\\uFEC3'] = '\\u0637';\n t['\\uFEC4'] = '\\u0637';\n t['\\uFEC5'] = '\\u0638';\n t['\\uFEC6'] = '\\u0638';\n t['\\uFEC7'] = '\\u0638';\n t['\\uFEC8'] = '\\u0638';\n t['\\uFEC9'] = '\\u0639';\n t['\\uFECA'] = '\\u0639';\n t['\\uFECB'] = '\\u0639';\n t['\\uFECC'] = '\\u0639';\n t['\\uFECD'] = '\\u063A';\n t['\\uFECE'] = '\\u063A';\n t['\\uFECF'] = '\\u063A';\n t['\\uFED0'] = '\\u063A';\n t['\\uFED1'] = '\\u0641';\n t['\\uFED2'] = '\\u0641';\n t['\\uFED3'] = '\\u0641';\n t['\\uFED4'] = '\\u0641';\n t['\\uFED5'] = '\\u0642';\n t['\\uFED6'] = '\\u0642';\n t['\\uFED7'] = '\\u0642';\n t['\\uFED8'] = '\\u0642';\n t['\\uFED9'] = '\\u0643';\n t['\\uFEDA'] = '\\u0643';\n t['\\uFEDB'] = '\\u0643';\n t['\\uFEDC'] = '\\u0643';\n t['\\uFEDD'] = '\\u0644';\n t['\\uFEDE'] = '\\u0644';\n t['\\uFEDF'] = '\\u0644';\n t['\\uFEE0'] = '\\u0644';\n t['\\uFEE1'] = '\\u0645';\n t['\\uFEE2'] = '\\u0645';\n t['\\uFEE3'] = '\\u0645';\n t['\\uFEE4'] = '\\u0645';\n t['\\uFEE5'] = '\\u0646';\n t['\\uFEE6'] = '\\u0646';\n t['\\uFEE7'] = '\\u0646';\n t['\\uFEE8'] = '\\u0646';\n t['\\uFEE9'] = '\\u0647';\n t['\\uFEEA'] = '\\u0647';\n t['\\uFEEB'] = '\\u0647';\n t['\\uFEEC'] = '\\u0647';\n t['\\uFEED'] = '\\u0648';\n t['\\uFEEE'] = '\\u0648';\n t['\\uFEEF'] = '\\u0649';\n t['\\uFEF0'] = '\\u0649';\n t['\\uFEF1'] = '\\u064A';\n t['\\uFEF2'] = '\\u064A';\n t['\\uFEF3'] = '\\u064A';\n t['\\uFEF4'] = '\\u064A';\n t['\\uFEF5'] = '\\u0644\\u0622';\n t['\\uFEF6'] = '\\u0644\\u0622';\n t['\\uFEF7'] = '\\u0644\\u0623';\n t['\\uFEF8'] = '\\u0644\\u0623';\n t['\\uFEF9'] = '\\u0644\\u0625';\n t['\\uFEFA'] = '\\u0644\\u0625';\n t['\\uFEFB'] = '\\u0644\\u0627';\n t['\\uFEFC'] = '\\u0644\\u0627';\n});\nfunction reverseIfRtl(chars) {\n var charsLength = chars.length;\n if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) {\n  return chars;\n }\n var s = '';\n for (var ii = charsLength - 1; ii >= 0; ii--) {\n  s += chars[ii];\n }\n return s;\n}\nexports.mapSpecialUnicodeValues = mapSpecialUnicodeValues;\nexports.reverseIfRtl = reverseIfRtl;\nexports.getUnicodeRangeFor = getUnicodeRangeFor;\nexports.getNormalizedUnicodes = getNormalizedUnicodes;\nexports.getUnicodeForGlyph = getUnicodeForGlyph;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar ArithmeticDecoder = function ArithmeticDecoderClosure() {\n  var QeTable = [{\n    qe: 0x5601,\n    nmps: 1,\n    nlps: 1,\n    switchFlag: 1\n  }, {\n    qe: 0x3401,\n    nmps: 2,\n    nlps: 6,\n    switchFlag: 0\n  }, {\n    qe: 0x1801,\n    nmps: 3,\n    nlps: 9,\n    switchFlag: 0\n  }, {\n    qe: 0x0AC1,\n    nmps: 4,\n    nlps: 12,\n    switchFlag: 0\n  }, {\n    qe: 0x0521,\n    nmps: 5,\n    nlps: 29,\n    switchFlag: 0\n  }, {\n    qe: 0x0221,\n    nmps: 38,\n    nlps: 33,\n    switchFlag: 0\n  }, {\n    qe: 0x5601,\n    nmps: 7,\n    nlps: 6,\n    switchFlag: 1\n  }, {\n    qe: 0x5401,\n    nmps: 8,\n    nlps: 14,\n    switchFlag: 0\n  }, {\n    qe: 0x4801,\n    nmps: 9,\n    nlps: 14,\n    switchFlag: 0\n  }, {\n    qe: 0x3801,\n    nmps: 10,\n    nlps: 14,\n    switchFlag: 0\n  }, {\n    qe: 0x3001,\n    nmps: 11,\n    nlps: 17,\n    switchFlag: 0\n  }, {\n    qe: 0x2401,\n    nmps: 12,\n    nlps: 18,\n    switchFlag: 0\n  }, {\n    qe: 0x1C01,\n    nmps: 13,\n    nlps: 20,\n    switchFlag: 0\n  }, {\n    qe: 0x1601,\n    nmps: 29,\n    nlps: 21,\n    switchFlag: 0\n  }, {\n    qe: 0x5601,\n    nmps: 15,\n    nlps: 14,\n    switchFlag: 1\n  }, {\n    qe: 0x5401,\n    nmps: 16,\n    nlps: 14,\n    switchFlag: 0\n  }, {\n    qe: 0x5101,\n    nmps: 17,\n    nlps: 15,\n    switchFlag: 0\n  }, {\n    qe: 0x4801,\n    nmps: 18,\n    nlps: 16,\n    switchFlag: 0\n  }, {\n    qe: 0x3801,\n    nmps: 19,\n    nlps: 17,\n    switchFlag: 0\n  }, {\n    qe: 0x3401,\n    nmps: 20,\n    nlps: 18,\n    switchFlag: 0\n  }, {\n    qe: 0x3001,\n    nmps: 21,\n    nlps: 19,\n    switchFlag: 0\n  }, {\n    qe: 0x2801,\n    nmps: 22,\n    nlps: 19,\n    switchFlag: 0\n  }, {\n    qe: 0x2401,\n    nmps: 23,\n    nlps: 20,\n    switchFlag: 0\n  }, {\n    qe: 0x2201,\n    nmps: 24,\n    nlps: 21,\n    switchFlag: 0\n  }, {\n    qe: 0x1C01,\n    nmps: 25,\n    nlps: 22,\n    switchFlag: 0\n  }, {\n    qe: 0x1801,\n    nmps: 26,\n    nlps: 23,\n    switchFlag: 0\n  }, {\n    qe: 0x1601,\n    nmps: 27,\n    nlps: 24,\n    switchFlag: 0\n  }, {\n    qe: 0x1401,\n    nmps: 28,\n    nlps: 25,\n    switchFlag: 0\n  }, {\n    qe: 0x1201,\n    nmps: 29,\n    nlps: 26,\n    switchFlag: 0\n  }, {\n    qe: 0x1101,\n    nmps: 30,\n    nlps: 27,\n    switchFlag: 0\n  }, {\n    qe: 0x0AC1,\n    nmps: 31,\n    nlps: 28,\n    switchFlag: 0\n  }, {\n    qe: 0x09C1,\n    nmps: 32,\n    nlps: 29,\n    switchFlag: 0\n  }, {\n    qe: 0x08A1,\n    nmps: 33,\n    nlps: 30,\n    switchFlag: 0\n  }, {\n    qe: 0x0521,\n    nmps: 34,\n    nlps: 31,\n    switchFlag: 0\n  }, {\n    qe: 0x0441,\n    nmps: 35,\n    nlps: 32,\n    switchFlag: 0\n  }, {\n    qe: 0x02A1,\n    nmps: 36,\n    nlps: 33,\n    switchFlag: 0\n  }, {\n    qe: 0x0221,\n    nmps: 37,\n    nlps: 34,\n    switchFlag: 0\n  }, {\n    qe: 0x0141,\n    nmps: 38,\n    nlps: 35,\n    switchFlag: 0\n  }, {\n    qe: 0x0111,\n    nmps: 39,\n    nlps: 36,\n    switchFlag: 0\n  }, {\n    qe: 0x0085,\n    nmps: 40,\n    nlps: 37,\n    switchFlag: 0\n  }, {\n    qe: 0x0049,\n    nmps: 41,\n    nlps: 38,\n    switchFlag: 0\n  }, {\n    qe: 0x0025,\n    nmps: 42,\n    nlps: 39,\n    switchFlag: 0\n  }, {\n    qe: 0x0015,\n    nmps: 43,\n    nlps: 40,\n    switchFlag: 0\n  }, {\n    qe: 0x0009,\n    nmps: 44,\n    nlps: 41,\n    switchFlag: 0\n  }, {\n    qe: 0x0005,\n    nmps: 45,\n    nlps: 42,\n    switchFlag: 0\n  }, {\n    qe: 0x0001,\n    nmps: 45,\n    nlps: 43,\n    switchFlag: 0\n  }, {\n    qe: 0x5601,\n    nmps: 46,\n    nlps: 46,\n    switchFlag: 0\n  }];\n  function ArithmeticDecoder(data, start, end) {\n    this.data = data;\n    this.bp = start;\n    this.dataEnd = end;\n    this.chigh = data[start];\n    this.clow = 0;\n    this.byteIn();\n    this.chigh = this.chigh << 7 & 0xFFFF | this.clow >> 9 & 0x7F;\n    this.clow = this.clow << 7 & 0xFFFF;\n    this.ct -= 7;\n    this.a = 0x8000;\n  }\n  ArithmeticDecoder.prototype = {\n    byteIn: function ArithmeticDecoder_byteIn() {\n      var data = this.data;\n      var bp = this.bp;\n      if (data[bp] === 0xFF) {\n        var b1 = data[bp + 1];\n        if (b1 > 0x8F) {\n          this.clow += 0xFF00;\n          this.ct = 8;\n        } else {\n          bp++;\n          this.clow += data[bp] << 9;\n          this.ct = 7;\n          this.bp = bp;\n        }\n      } else {\n        bp++;\n        this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xFF00;\n        this.ct = 8;\n        this.bp = bp;\n      }\n      if (this.clow > 0xFFFF) {\n        this.chigh += this.clow >> 16;\n        this.clow &= 0xFFFF;\n      }\n    },\n    readBit: function ArithmeticDecoder_readBit(contexts, pos) {\n      var cx_index = contexts[pos] >> 1,\n          cx_mps = contexts[pos] & 1;\n      var qeTableIcx = QeTable[cx_index];\n      var qeIcx = qeTableIcx.qe;\n      var d;\n      var a = this.a - qeIcx;\n      if (this.chigh < qeIcx) {\n        if (a < qeIcx) {\n          a = qeIcx;\n          d = cx_mps;\n          cx_index = qeTableIcx.nmps;\n        } else {\n          a = qeIcx;\n          d = 1 ^ cx_mps;\n          if (qeTableIcx.switchFlag === 1) {\n            cx_mps = d;\n          }\n          cx_index = qeTableIcx.nlps;\n        }\n      } else {\n        this.chigh -= qeIcx;\n        if ((a & 0x8000) !== 0) {\n          this.a = a;\n          return cx_mps;\n        }\n        if (a < qeIcx) {\n          d = 1 ^ cx_mps;\n          if (qeTableIcx.switchFlag === 1) {\n            cx_mps = d;\n          }\n          cx_index = qeTableIcx.nlps;\n        } else {\n          d = cx_mps;\n          cx_index = qeTableIcx.nmps;\n        }\n      }\n      do {\n        if (this.ct === 0) {\n          this.byteIn();\n        }\n        a <<= 1;\n        this.chigh = this.chigh << 1 & 0xFFFF | this.clow >> 15 & 1;\n        this.clow = this.clow << 1 & 0xFFFF;\n        this.ct--;\n      } while ((a & 0x8000) === 0);\n      this.a = a;\n      contexts[pos] = cx_index << 1 | cx_mps;\n      return d;\n    }\n  };\n  return ArithmeticDecoder;\n}();\nexports.ArithmeticDecoder = ArithmeticDecoder;\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.CFFCompiler = exports.CFFPrivateDict = exports.CFFTopDict = exports.CFFCharset = exports.CFFIndex = exports.CFFStrings = exports.CFFHeader = exports.CFF = exports.CFFParser = exports.CFFStandardStrings = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _charsets = __w_pdfjs_require__(21);\n\nvar _encodings = __w_pdfjs_require__(4);\n\nvar MAX_SUBR_NESTING = 10;\nvar CFFStandardStrings = ['.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003', 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'];\nvar CFFParser = function CFFParserClosure() {\n  var CharstringValidationData = [null, {\n    id: 'hstem',\n    min: 2,\n    stackClearing: true,\n    stem: true\n  }, null, {\n    id: 'vstem',\n    min: 2,\n    stackClearing: true,\n    stem: true\n  }, {\n    id: 'vmoveto',\n    min: 1,\n    stackClearing: true\n  }, {\n    id: 'rlineto',\n    min: 2,\n    resetStack: true\n  }, {\n    id: 'hlineto',\n    min: 1,\n    resetStack: true\n  }, {\n    id: 'vlineto',\n    min: 1,\n    resetStack: true\n  }, {\n    id: 'rrcurveto',\n    min: 6,\n    resetStack: true\n  }, null, {\n    id: 'callsubr',\n    min: 1,\n    undefStack: true\n  }, {\n    id: 'return',\n    min: 0,\n    undefStack: true\n  }, null, null, {\n    id: 'endchar',\n    min: 0,\n    stackClearing: true\n  }, null, null, null, {\n    id: 'hstemhm',\n    min: 2,\n    stackClearing: true,\n    stem: true\n  }, {\n    id: 'hintmask',\n    min: 0,\n    stackClearing: true\n  }, {\n    id: 'cntrmask',\n    min: 0,\n    stackClearing: true\n  }, {\n    id: 'rmoveto',\n    min: 2,\n    stackClearing: true\n  }, {\n    id: 'hmoveto',\n    min: 1,\n    stackClearing: true\n  }, {\n    id: 'vstemhm',\n    min: 2,\n    stackClearing: true,\n    stem: true\n  }, {\n    id: 'rcurveline',\n    min: 8,\n    resetStack: true\n  }, {\n    id: 'rlinecurve',\n    min: 8,\n    resetStack: true\n  }, {\n    id: 'vvcurveto',\n    min: 4,\n    resetStack: true\n  }, {\n    id: 'hhcurveto',\n    min: 4,\n    resetStack: true\n  }, null, {\n    id: 'callgsubr',\n    min: 1,\n    undefStack: true\n  }, {\n    id: 'vhcurveto',\n    min: 4,\n    resetStack: true\n  }, {\n    id: 'hvcurveto',\n    min: 4,\n    resetStack: true\n  }];\n  var CharstringValidationData12 = [null, null, null, {\n    id: 'and',\n    min: 2,\n    stackDelta: -1\n  }, {\n    id: 'or',\n    min: 2,\n    stackDelta: -1\n  }, {\n    id: 'not',\n    min: 1,\n    stackDelta: 0\n  }, null, null, null, {\n    id: 'abs',\n    min: 1,\n    stackDelta: 0\n  }, {\n    id: 'add',\n    min: 2,\n    stackDelta: -1,\n    stackFn: function stack_div(stack, index) {\n      stack[index - 2] = stack[index - 2] + stack[index - 1];\n    }\n  }, {\n    id: 'sub',\n    min: 2,\n    stackDelta: -1,\n    stackFn: function stack_div(stack, index) {\n      stack[index - 2] = stack[index - 2] - stack[index - 1];\n    }\n  }, {\n    id: 'div',\n    min: 2,\n    stackDelta: -1,\n    stackFn: function stack_div(stack, index) {\n      stack[index - 2] = stack[index - 2] / stack[index - 1];\n    }\n  }, null, {\n    id: 'neg',\n    min: 1,\n    stackDelta: 0,\n    stackFn: function stack_div(stack, index) {\n      stack[index - 1] = -stack[index - 1];\n    }\n  }, {\n    id: 'eq',\n    min: 2,\n    stackDelta: -1\n  }, null, null, {\n    id: 'drop',\n    min: 1,\n    stackDelta: -1\n  }, null, {\n    id: 'put',\n    min: 2,\n    stackDelta: -2\n  }, {\n    id: 'get',\n    min: 1,\n    stackDelta: 0\n  }, {\n    id: 'ifelse',\n    min: 4,\n    stackDelta: -3\n  }, {\n    id: 'random',\n    min: 0,\n    stackDelta: 1\n  }, {\n    id: 'mul',\n    min: 2,\n    stackDelta: -1,\n    stackFn: function stack_div(stack, index) {\n      stack[index - 2] = stack[index - 2] * stack[index - 1];\n    }\n  }, null, {\n    id: 'sqrt',\n    min: 1,\n    stackDelta: 0\n  }, {\n    id: 'dup',\n    min: 1,\n    stackDelta: 1\n  }, {\n    id: 'exch',\n    min: 2,\n    stackDelta: 0\n  }, {\n    id: 'index',\n    min: 2,\n    stackDelta: 0\n  }, {\n    id: 'roll',\n    min: 3,\n    stackDelta: -2\n  }, null, null, null, {\n    id: 'hflex',\n    min: 7,\n    resetStack: true\n  }, {\n    id: 'flex',\n    min: 13,\n    resetStack: true\n  }, {\n    id: 'hflex1',\n    min: 9,\n    resetStack: true\n  }, {\n    id: 'flex1',\n    min: 11,\n    resetStack: true\n  }];\n  function CFFParser(file, properties, seacAnalysisEnabled) {\n    this.bytes = file.getBytes();\n    this.properties = properties;\n    this.seacAnalysisEnabled = !!seacAnalysisEnabled;\n  }\n  CFFParser.prototype = {\n    parse: function CFFParser_parse() {\n      var properties = this.properties;\n      var cff = new CFF();\n      this.cff = cff;\n      var header = this.parseHeader();\n      var nameIndex = this.parseIndex(header.endPos);\n      var topDictIndex = this.parseIndex(nameIndex.endPos);\n      var stringIndex = this.parseIndex(topDictIndex.endPos);\n      var globalSubrIndex = this.parseIndex(stringIndex.endPos);\n      var topDictParsed = this.parseDict(topDictIndex.obj.get(0));\n      var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);\n      cff.header = header.obj;\n      cff.names = this.parseNameIndex(nameIndex.obj);\n      cff.strings = this.parseStringIndex(stringIndex.obj);\n      cff.topDict = topDict;\n      cff.globalSubrIndex = globalSubrIndex.obj;\n      this.parsePrivateDict(cff.topDict);\n      cff.isCIDFont = topDict.hasName('ROS');\n      var charStringOffset = topDict.getByName('CharStrings');\n      var charStringIndex = this.parseIndex(charStringOffset).obj;\n      var fontMatrix = topDict.getByName('FontMatrix');\n      if (fontMatrix) {\n        properties.fontMatrix = fontMatrix;\n      }\n      var fontBBox = topDict.getByName('FontBBox');\n      if (fontBBox) {\n        properties.ascent = Math.max(fontBBox[3], fontBBox[1]);\n        properties.descent = Math.min(fontBBox[1], fontBBox[3]);\n        properties.ascentScaled = true;\n      }\n      var charset, encoding;\n      if (cff.isCIDFont) {\n        var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj;\n        for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) {\n          var dictRaw = fdArrayIndex.get(i);\n          var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings);\n          this.parsePrivateDict(fontDict);\n          cff.fdArray.push(fontDict);\n        }\n        encoding = null;\n        charset = this.parseCharsets(topDict.getByName('charset'), charStringIndex.count, cff.strings, true);\n        cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'), charStringIndex.count);\n      } else {\n        charset = this.parseCharsets(topDict.getByName('charset'), charStringIndex.count, cff.strings, false);\n        encoding = this.parseEncoding(topDict.getByName('Encoding'), properties, cff.strings, charset.charset);\n      }\n      cff.charset = charset;\n      cff.encoding = encoding;\n      var charStringsAndSeacs = this.parseCharStrings({\n        charStrings: charStringIndex,\n        localSubrIndex: topDict.privateDict.subrsIndex,\n        globalSubrIndex: globalSubrIndex.obj,\n        fdSelect: cff.fdSelect,\n        fdArray: cff.fdArray,\n        privateDict: topDict.privateDict\n      });\n      cff.charStrings = charStringsAndSeacs.charStrings;\n      cff.seacs = charStringsAndSeacs.seacs;\n      cff.widths = charStringsAndSeacs.widths;\n      return cff;\n    },\n    parseHeader: function CFFParser_parseHeader() {\n      var bytes = this.bytes;\n      var bytesLength = bytes.length;\n      var offset = 0;\n      while (offset < bytesLength && bytes[offset] !== 1) {\n        ++offset;\n      }\n      if (offset >= bytesLength) {\n        throw new _util.FormatError('Invalid CFF header');\n      }\n      if (offset !== 0) {\n        (0, _util.info)('cff data is shifted');\n        bytes = bytes.subarray(offset);\n        this.bytes = bytes;\n      }\n      var major = bytes[0];\n      var minor = bytes[1];\n      var hdrSize = bytes[2];\n      var offSize = bytes[3];\n      var header = new CFFHeader(major, minor, hdrSize, offSize);\n      return {\n        obj: header,\n        endPos: hdrSize\n      };\n    },\n    parseDict: function CFFParser_parseDict(dict) {\n      var pos = 0;\n      function parseOperand() {\n        var value = dict[pos++];\n        if (value === 30) {\n          return parseFloatOperand();\n        } else if (value === 28) {\n          value = dict[pos++];\n          value = (value << 24 | dict[pos++] << 16) >> 16;\n          return value;\n        } else if (value === 29) {\n          value = dict[pos++];\n          value = value << 8 | dict[pos++];\n          value = value << 8 | dict[pos++];\n          value = value << 8 | dict[pos++];\n          return value;\n        } else if (value >= 32 && value <= 246) {\n          return value - 139;\n        } else if (value >= 247 && value <= 250) {\n          return (value - 247) * 256 + dict[pos++] + 108;\n        } else if (value >= 251 && value <= 254) {\n          return -((value - 251) * 256) - dict[pos++] - 108;\n        }\n        (0, _util.warn)('CFFParser_parseDict: \"' + value + '\" is a reserved command.');\n        return NaN;\n      }\n      function parseFloatOperand() {\n        var str = '';\n        var eof = 15;\n        var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'E', 'E-', null, '-'];\n        var length = dict.length;\n        while (pos < length) {\n          var b = dict[pos++];\n          var b1 = b >> 4;\n          var b2 = b & 15;\n          if (b1 === eof) {\n            break;\n          }\n          str += lookup[b1];\n          if (b2 === eof) {\n            break;\n          }\n          str += lookup[b2];\n        }\n        return parseFloat(str);\n      }\n      var operands = [];\n      var entries = [];\n      pos = 0;\n      var end = dict.length;\n      while (pos < end) {\n        var b = dict[pos];\n        if (b <= 21) {\n          if (b === 12) {\n            b = b << 8 | dict[++pos];\n          }\n          entries.push([b, operands]);\n          operands = [];\n          ++pos;\n        } else {\n          operands.push(parseOperand());\n        }\n      }\n      return entries;\n    },\n    parseIndex: function CFFParser_parseIndex(pos) {\n      var cffIndex = new CFFIndex();\n      var bytes = this.bytes;\n      var count = bytes[pos++] << 8 | bytes[pos++];\n      var offsets = [];\n      var end = pos;\n      var i, ii;\n      if (count !== 0) {\n        var offsetSize = bytes[pos++];\n        var startPos = pos + (count + 1) * offsetSize - 1;\n        for (i = 0, ii = count + 1; i < ii; ++i) {\n          var offset = 0;\n          for (var j = 0; j < offsetSize; ++j) {\n            offset <<= 8;\n            offset += bytes[pos++];\n          }\n          offsets.push(startPos + offset);\n        }\n        end = offsets[count];\n      }\n      for (i = 0, ii = offsets.length - 1; i < ii; ++i) {\n        var offsetStart = offsets[i];\n        var offsetEnd = offsets[i + 1];\n        cffIndex.add(bytes.subarray(offsetStart, offsetEnd));\n      }\n      return {\n        obj: cffIndex,\n        endPos: end\n      };\n    },\n    parseNameIndex: function CFFParser_parseNameIndex(index) {\n      var names = [];\n      for (var i = 0, ii = index.count; i < ii; ++i) {\n        var name = index.get(i);\n        var length = Math.min(name.length, 127);\n        var data = [];\n        for (var j = 0; j < length; ++j) {\n          var c = name[j];\n          if (j === 0 && c === 0) {\n            data[j] = c;\n            continue;\n          }\n          if (c < 33 || c > 126 || c === 91 || c === 93 || c === 40 || c === 41 || c === 123 || c === 125 || c === 60 || c === 62 || c === 47 || c === 37 || c === 35) {\n            data[j] = 95;\n            continue;\n          }\n          data[j] = c;\n        }\n        names.push((0, _util.bytesToString)(data));\n      }\n      return names;\n    },\n    parseStringIndex: function CFFParser_parseStringIndex(index) {\n      var strings = new CFFStrings();\n      for (var i = 0, ii = index.count; i < ii; ++i) {\n        var data = index.get(i);\n        strings.add((0, _util.bytesToString)(data));\n      }\n      return strings;\n    },\n    createDict: function CFFParser_createDict(Type, dict, strings) {\n      var cffDict = new Type(strings);\n      for (var i = 0, ii = dict.length; i < ii; ++i) {\n        var pair = dict[i];\n        var key = pair[0];\n        var value = pair[1];\n        cffDict.setByKey(key, value);\n      }\n      return cffDict;\n    },\n    parseCharString: function CFFParser_parseCharString(state, data, localSubrIndex, globalSubrIndex) {\n      if (!data || state.callDepth > MAX_SUBR_NESTING) {\n        return false;\n      }\n      var stackSize = state.stackSize;\n      var stack = state.stack;\n      var length = data.length;\n      for (var j = 0; j < length;) {\n        var value = data[j++];\n        var validationCommand = null;\n        if (value === 12) {\n          var q = data[j++];\n          if (q === 0) {\n            data[j - 2] = 139;\n            data[j - 1] = 22;\n            stackSize = 0;\n          } else {\n            validationCommand = CharstringValidationData12[q];\n          }\n        } else if (value === 28) {\n          stack[stackSize] = (data[j] << 24 | data[j + 1] << 16) >> 16;\n          j += 2;\n          stackSize++;\n        } else if (value === 14) {\n          if (stackSize >= 4) {\n            stackSize -= 4;\n            if (this.seacAnalysisEnabled) {\n              state.seac = stack.slice(stackSize, stackSize + 4);\n              return false;\n            }\n          }\n          validationCommand = CharstringValidationData[value];\n        } else if (value >= 32 && value <= 246) {\n          stack[stackSize] = value - 139;\n          stackSize++;\n        } else if (value >= 247 && value <= 254) {\n          stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - data[j] - 108;\n          j++;\n          stackSize++;\n        } else if (value === 255) {\n          stack[stackSize] = (data[j] << 24 | data[j + 1] << 16 | data[j + 2] << 8 | data[j + 3]) / 65536;\n          j += 4;\n          stackSize++;\n        } else if (value === 19 || value === 20) {\n          state.hints += stackSize >> 1;\n          j += state.hints + 7 >> 3;\n          stackSize %= 2;\n          validationCommand = CharstringValidationData[value];\n        } else if (value === 10 || value === 29) {\n          var subrsIndex;\n          if (value === 10) {\n            subrsIndex = localSubrIndex;\n          } else {\n            subrsIndex = globalSubrIndex;\n          }\n          if (!subrsIndex) {\n            validationCommand = CharstringValidationData[value];\n            (0, _util.warn)('Missing subrsIndex for ' + validationCommand.id);\n            return false;\n          }\n          var bias = 32768;\n          if (subrsIndex.count < 1240) {\n            bias = 107;\n          } else if (subrsIndex.count < 33900) {\n            bias = 1131;\n          }\n          var subrNumber = stack[--stackSize] + bias;\n          if (subrNumber < 0 || subrNumber >= subrsIndex.count || isNaN(subrNumber)) {\n            validationCommand = CharstringValidationData[value];\n            (0, _util.warn)('Out of bounds subrIndex for ' + validationCommand.id);\n            return false;\n          }\n          state.stackSize = stackSize;\n          state.callDepth++;\n          var valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, globalSubrIndex);\n          if (!valid) {\n            return false;\n          }\n          state.callDepth--;\n          stackSize = state.stackSize;\n          continue;\n        } else if (value === 11) {\n          state.stackSize = stackSize;\n          return true;\n        } else {\n          validationCommand = CharstringValidationData[value];\n        }\n        if (validationCommand) {\n          if (validationCommand.stem) {\n            state.hints += stackSize >> 1;\n          }\n          if ('min' in validationCommand) {\n            if (!state.undefStack && stackSize < validationCommand.min) {\n              (0, _util.warn)('Not enough parameters for ' + validationCommand.id + '; actual: ' + stackSize + ', expected: ' + validationCommand.min);\n              return false;\n            }\n          }\n          if (state.firstStackClearing && validationCommand.stackClearing) {\n            state.firstStackClearing = false;\n            stackSize -= validationCommand.min;\n            if (stackSize >= 2 && validationCommand.stem) {\n              stackSize %= 2;\n            } else if (stackSize > 1) {\n              (0, _util.warn)('Found too many parameters for stack-clearing command');\n            }\n            if (stackSize > 0 && stack[stackSize - 1] >= 0) {\n              state.width = stack[stackSize - 1];\n            }\n          }\n          if ('stackDelta' in validationCommand) {\n            if ('stackFn' in validationCommand) {\n              validationCommand.stackFn(stack, stackSize);\n            }\n            stackSize += validationCommand.stackDelta;\n          } else if (validationCommand.stackClearing) {\n            stackSize = 0;\n          } else if (validationCommand.resetStack) {\n            stackSize = 0;\n            state.undefStack = false;\n          } else if (validationCommand.undefStack) {\n            stackSize = 0;\n            state.undefStack = true;\n            state.firstStackClearing = false;\n          }\n        }\n      }\n      state.stackSize = stackSize;\n      return true;\n    },\n    parseCharStrings: function parseCharStrings(_ref) {\n      var charStrings = _ref.charStrings,\n          localSubrIndex = _ref.localSubrIndex,\n          globalSubrIndex = _ref.globalSubrIndex,\n          fdSelect = _ref.fdSelect,\n          fdArray = _ref.fdArray,\n          privateDict = _ref.privateDict;\n\n      var seacs = [];\n      var widths = [];\n      var count = charStrings.count;\n      for (var i = 0; i < count; i++) {\n        var charstring = charStrings.get(i);\n        var state = {\n          callDepth: 0,\n          stackSize: 0,\n          stack: [],\n          undefStack: true,\n          hints: 0,\n          firstStackClearing: true,\n          seac: null,\n          width: null\n        };\n        var valid = true;\n        var localSubrToUse = null;\n        var privateDictToUse = privateDict;\n        if (fdSelect && fdArray.length) {\n          var fdIndex = fdSelect.getFDIndex(i);\n          if (fdIndex === -1) {\n            (0, _util.warn)('Glyph index is not in fd select.');\n            valid = false;\n          }\n          if (fdIndex >= fdArray.length) {\n            (0, _util.warn)('Invalid fd index for glyph index.');\n            valid = false;\n          }\n          if (valid) {\n            privateDictToUse = fdArray[fdIndex].privateDict;\n            localSubrToUse = privateDictToUse.subrsIndex;\n          }\n        } else if (localSubrIndex) {\n          localSubrToUse = localSubrIndex;\n        }\n        if (valid) {\n          valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex);\n        }\n        if (state.width !== null) {\n          var nominalWidth = privateDictToUse.getByName('nominalWidthX');\n          widths[i] = nominalWidth + state.width;\n        } else {\n          var defaultWidth = privateDictToUse.getByName('defaultWidthX');\n          widths[i] = defaultWidth;\n        }\n        if (state.seac !== null) {\n          seacs[i] = state.seac;\n        }\n        if (!valid) {\n          charStrings.set(i, new Uint8Array([14]));\n        }\n      }\n      return {\n        charStrings: charStrings,\n        seacs: seacs,\n        widths: widths\n      };\n    },\n\n    emptyPrivateDictionary: function CFFParser_emptyPrivateDictionary(parentDict) {\n      var privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings);\n      parentDict.setByKey(18, [0, 0]);\n      parentDict.privateDict = privateDict;\n    },\n    parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {\n      if (!parentDict.hasName('Private')) {\n        this.emptyPrivateDictionary(parentDict);\n        return;\n      }\n      var privateOffset = parentDict.getByName('Private');\n      if (!(0, _util.isArray)(privateOffset) || privateOffset.length !== 2) {\n        parentDict.removeByName('Private');\n        return;\n      }\n      var size = privateOffset[0];\n      var offset = privateOffset[1];\n      if (size === 0 || offset >= this.bytes.length) {\n        this.emptyPrivateDictionary(parentDict);\n        return;\n      }\n      var privateDictEnd = offset + size;\n      var dictData = this.bytes.subarray(offset, privateDictEnd);\n      var dict = this.parseDict(dictData);\n      var privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings);\n      parentDict.privateDict = privateDict;\n      if (!privateDict.getByName('Subrs')) {\n        return;\n      }\n      var subrsOffset = privateDict.getByName('Subrs');\n      var relativeOffset = offset + subrsOffset;\n      if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {\n        this.emptyPrivateDictionary(parentDict);\n        return;\n      }\n      var subrsIndex = this.parseIndex(relativeOffset);\n      privateDict.subrsIndex = subrsIndex.obj;\n    },\n    parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) {\n      if (pos === 0) {\n        return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, _charsets.ISOAdobeCharset);\n      } else if (pos === 1) {\n        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, _charsets.ExpertCharset);\n      } else if (pos === 2) {\n        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, _charsets.ExpertSubsetCharset);\n      }\n      var bytes = this.bytes;\n      var start = pos;\n      var format = bytes[pos++];\n      var charset = ['.notdef'];\n      var id, count, i;\n      length -= 1;\n      switch (format) {\n        case 0:\n          for (i = 0; i < length; i++) {\n            id = bytes[pos++] << 8 | bytes[pos++];\n            charset.push(cid ? id : strings.get(id));\n          }\n          break;\n        case 1:\n          while (charset.length <= length) {\n            id = bytes[pos++] << 8 | bytes[pos++];\n            count = bytes[pos++];\n            for (i = 0; i <= count; i++) {\n              charset.push(cid ? id++ : strings.get(id++));\n            }\n          }\n          break;\n        case 2:\n          while (charset.length <= length) {\n            id = bytes[pos++] << 8 | bytes[pos++];\n            count = bytes[pos++] << 8 | bytes[pos++];\n            for (i = 0; i <= count; i++) {\n              charset.push(cid ? id++ : strings.get(id++));\n            }\n          }\n          break;\n        default:\n          throw new _util.FormatError('Unknown charset format');\n      }\n      var end = pos;\n      var raw = bytes.subarray(start, end);\n      return new CFFCharset(false, format, charset, raw);\n    },\n    parseEncoding: function CFFParser_parseEncoding(pos, properties, strings, charset) {\n      var encoding = Object.create(null);\n      var bytes = this.bytes;\n      var predefined = false;\n      var format, i, ii;\n      var raw = null;\n      function readSupplement() {\n        var supplementsCount = bytes[pos++];\n        for (i = 0; i < supplementsCount; i++) {\n          var code = bytes[pos++];\n          var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);\n          encoding[code] = charset.indexOf(strings.get(sid));\n        }\n      }\n      if (pos === 0 || pos === 1) {\n        predefined = true;\n        format = pos;\n        var baseEncoding = pos ? _encodings.ExpertEncoding : _encodings.StandardEncoding;\n        for (i = 0, ii = charset.length; i < ii; i++) {\n          var index = baseEncoding.indexOf(charset[i]);\n          if (index !== -1) {\n            encoding[index] = i;\n          }\n        }\n      } else {\n        var dataStart = pos;\n        format = bytes[pos++];\n        switch (format & 0x7f) {\n          case 0:\n            var glyphsCount = bytes[pos++];\n            for (i = 1; i <= glyphsCount; i++) {\n              encoding[bytes[pos++]] = i;\n            }\n            break;\n          case 1:\n            var rangesCount = bytes[pos++];\n            var gid = 1;\n            for (i = 0; i < rangesCount; i++) {\n              var start = bytes[pos++];\n              var left = bytes[pos++];\n              for (var j = start; j <= start + left; j++) {\n                encoding[j] = gid++;\n              }\n            }\n            break;\n          default:\n            throw new _util.FormatError('Unknown encoding format: ' + format + ' in CFF');\n        }\n        var dataEnd = pos;\n        if (format & 0x80) {\n          bytes[dataStart] &= 0x7f;\n          readSupplement();\n        }\n        raw = bytes.subarray(dataStart, dataEnd);\n      }\n      format = format & 0x7f;\n      return new CFFEncoding(predefined, format, encoding, raw);\n    },\n    parseFDSelect: function CFFParser_parseFDSelect(pos, length) {\n      var start = pos;\n      var bytes = this.bytes;\n      var format = bytes[pos++];\n      var fdSelect = [],\n          rawBytes;\n      var i,\n          invalidFirstGID = false;\n      switch (format) {\n        case 0:\n          for (i = 0; i < length; ++i) {\n            var id = bytes[pos++];\n            fdSelect.push(id);\n          }\n          rawBytes = bytes.subarray(start, pos);\n          break;\n        case 3:\n          var rangesCount = bytes[pos++] << 8 | bytes[pos++];\n          for (i = 0; i < rangesCount; ++i) {\n            var first = bytes[pos++] << 8 | bytes[pos++];\n            if (i === 0 && first !== 0) {\n              (0, _util.warn)('parseFDSelect: The first range must have a first GID of 0' + ' -- trying to recover.');\n              invalidFirstGID = true;\n              first = 0;\n            }\n            var fdIndex = bytes[pos++];\n            var next = bytes[pos] << 8 | bytes[pos + 1];\n            for (var j = first; j < next; ++j) {\n              fdSelect.push(fdIndex);\n            }\n          }\n          pos += 2;\n          rawBytes = bytes.subarray(start, pos);\n          if (invalidFirstGID) {\n            rawBytes[3] = rawBytes[4] = 0;\n          }\n          break;\n        default:\n          throw new _util.FormatError('parseFDSelect: Unknown format \"' + format + '\".');\n      }\n      if (fdSelect.length !== length) {\n        throw new _util.FormatError('parseFDSelect: Invalid font data.');\n      }\n      return new CFFFDSelect(fdSelect, rawBytes);\n    }\n  };\n  return CFFParser;\n}();\nvar CFF = function CFFClosure() {\n  function CFF() {\n    this.header = null;\n    this.names = [];\n    this.topDict = null;\n    this.strings = new CFFStrings();\n    this.globalSubrIndex = null;\n    this.encoding = null;\n    this.charset = null;\n    this.charStrings = null;\n    this.fdArray = [];\n    this.fdSelect = null;\n    this.isCIDFont = false;\n  }\n  return CFF;\n}();\nvar CFFHeader = function CFFHeaderClosure() {\n  function CFFHeader(major, minor, hdrSize, offSize) {\n    this.major = major;\n    this.minor = minor;\n    this.hdrSize = hdrSize;\n    this.offSize = offSize;\n  }\n  return CFFHeader;\n}();\nvar CFFStrings = function CFFStringsClosure() {\n  function CFFStrings() {\n    this.strings = [];\n  }\n  CFFStrings.prototype = {\n    get: function CFFStrings_get(index) {\n      if (index >= 0 && index <= 390) {\n        return CFFStandardStrings[index];\n      }\n      if (index - 391 <= this.strings.length) {\n        return this.strings[index - 391];\n      }\n      return CFFStandardStrings[0];\n    },\n    add: function CFFStrings_add(value) {\n      this.strings.push(value);\n    },\n    get count() {\n      return this.strings.length;\n    }\n  };\n  return CFFStrings;\n}();\nvar CFFIndex = function CFFIndexClosure() {\n  function CFFIndex() {\n    this.objects = [];\n    this.length = 0;\n  }\n  CFFIndex.prototype = {\n    add: function CFFIndex_add(data) {\n      this.length += data.length;\n      this.objects.push(data);\n    },\n    set: function CFFIndex_set(index, data) {\n      this.length += data.length - this.objects[index].length;\n      this.objects[index] = data;\n    },\n    get: function CFFIndex_get(index) {\n      return this.objects[index];\n    },\n    get count() {\n      return this.objects.length;\n    }\n  };\n  return CFFIndex;\n}();\nvar CFFDict = function CFFDictClosure() {\n  function CFFDict(tables, strings) {\n    this.keyToNameMap = tables.keyToNameMap;\n    this.nameToKeyMap = tables.nameToKeyMap;\n    this.defaults = tables.defaults;\n    this.types = tables.types;\n    this.opcodes = tables.opcodes;\n    this.order = tables.order;\n    this.strings = strings;\n    this.values = Object.create(null);\n  }\n  CFFDict.prototype = {\n    setByKey: function CFFDict_setByKey(key, value) {\n      if (!(key in this.keyToNameMap)) {\n        return false;\n      }\n      var valueLength = value.length;\n      if (valueLength === 0) {\n        return true;\n      }\n      for (var i = 0; i < valueLength; i++) {\n        if (isNaN(value[i])) {\n          (0, _util.warn)('Invalid CFFDict value: \"' + value + '\" for key \"' + key + '\".');\n          return true;\n        }\n      }\n      var type = this.types[key];\n      if (type === 'num' || type === 'sid' || type === 'offset') {\n        value = value[0];\n      }\n      this.values[key] = value;\n      return true;\n    },\n    setByName: function CFFDict_setByName(name, value) {\n      if (!(name in this.nameToKeyMap)) {\n        throw new _util.FormatError('Invalid dictionary name \"' + name + '\"');\n      }\n      this.values[this.nameToKeyMap[name]] = value;\n    },\n    hasName: function CFFDict_hasName(name) {\n      return this.nameToKeyMap[name] in this.values;\n    },\n    getByName: function CFFDict_getByName(name) {\n      if (!(name in this.nameToKeyMap)) {\n        throw new _util.FormatError('Invalid dictionary name ' + name + '\"');\n      }\n      var key = this.nameToKeyMap[name];\n      if (!(key in this.values)) {\n        return this.defaults[key];\n      }\n      return this.values[key];\n    },\n    removeByName: function CFFDict_removeByName(name) {\n      delete this.values[this.nameToKeyMap[name]];\n    }\n  };\n  CFFDict.createTables = function CFFDict_createTables(layout) {\n    var tables = {\n      keyToNameMap: {},\n      nameToKeyMap: {},\n      defaults: {},\n      types: {},\n      opcodes: {},\n      order: []\n    };\n    for (var i = 0, ii = layout.length; i < ii; ++i) {\n      var entry = layout[i];\n      var key = (0, _util.isArray)(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];\n      tables.keyToNameMap[key] = entry[1];\n      tables.nameToKeyMap[entry[1]] = key;\n      tables.types[key] = entry[2];\n      tables.defaults[key] = entry[3];\n      tables.opcodes[key] = (0, _util.isArray)(entry[0]) ? entry[0] : [entry[0]];\n      tables.order.push(key);\n    }\n    return tables;\n  };\n  return CFFDict;\n}();\nvar CFFTopDict = function CFFTopDictClosure() {\n  var layout = [[[12, 30], 'ROS', ['sid', 'sid', 'num'], null], [[12, 20], 'SyntheticBase', 'num', null], [0, 'version', 'sid', null], [1, 'Notice', 'sid', null], [[12, 0], 'Copyright', 'sid', null], [2, 'FullName', 'sid', null], [3, 'FamilyName', 'sid', null], [4, 'Weight', 'sid', null], [[12, 1], 'isFixedPitch', 'num', 0], [[12, 2], 'ItalicAngle', 'num', 0], [[12, 3], 'UnderlinePosition', 'num', -100], [[12, 4], 'UnderlineThickness', 'num', 50], [[12, 5], 'PaintType', 'num', 0], [[12, 6], 'CharstringType', 'num', 2], [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'], [0.001, 0, 0, 0.001, 0, 0]], [13, 'UniqueID', 'num', null], [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]], [[12, 8], 'StrokeWidth', 'num', 0], [14, 'XUID', 'array', null], [15, 'charset', 'offset', 0], [16, 'Encoding', 'offset', 0], [17, 'CharStrings', 'offset', 0], [18, 'Private', ['offset', 'offset'], null], [[12, 21], 'PostScript', 'sid', null], [[12, 22], 'BaseFontName', 'sid', null], [[12, 23], 'BaseFontBlend', 'delta', null], [[12, 31], 'CIDFontVersion', 'num', 0], [[12, 32], 'CIDFontRevision', 'num', 0], [[12, 33], 'CIDFontType', 'num', 0], [[12, 34], 'CIDCount', 'num', 8720], [[12, 35], 'UIDBase', 'num', null], [[12, 37], 'FDSelect', 'offset', null], [[12, 36], 'FDArray', 'offset', null], [[12, 38], 'FontName', 'sid', null]];\n  var tables = null;\n  function CFFTopDict(strings) {\n    if (tables === null) {\n      tables = CFFDict.createTables(layout);\n    }\n    CFFDict.call(this, tables, strings);\n    this.privateDict = null;\n  }\n  CFFTopDict.prototype = Object.create(CFFDict.prototype);\n  return CFFTopDict;\n}();\nvar CFFPrivateDict = function CFFPrivateDictClosure() {\n  var layout = [[6, 'BlueValues', 'delta', null], [7, 'OtherBlues', 'delta', null], [8, 'FamilyBlues', 'delta', null], [9, 'FamilyOtherBlues', 'delta', null], [[12, 9], 'BlueScale', 'num', 0.039625], [[12, 10], 'BlueShift', 'num', 7], [[12, 11], 'BlueFuzz', 'num', 1], [10, 'StdHW', 'num', null], [11, 'StdVW', 'num', null], [[12, 12], 'StemSnapH', 'delta', null], [[12, 13], 'StemSnapV', 'delta', null], [[12, 14], 'ForceBold', 'num', 0], [[12, 17], 'LanguageGroup', 'num', 0], [[12, 18], 'ExpansionFactor', 'num', 0.06], [[12, 19], 'initialRandomSeed', 'num', 0], [20, 'defaultWidthX', 'num', 0], [21, 'nominalWidthX', 'num', 0], [19, 'Subrs', 'offset', null]];\n  var tables = null;\n  function CFFPrivateDict(strings) {\n    if (tables === null) {\n      tables = CFFDict.createTables(layout);\n    }\n    CFFDict.call(this, tables, strings);\n    this.subrsIndex = null;\n  }\n  CFFPrivateDict.prototype = Object.create(CFFDict.prototype);\n  return CFFPrivateDict;\n}();\nvar CFFCharsetPredefinedTypes = {\n  ISO_ADOBE: 0,\n  EXPERT: 1,\n  EXPERT_SUBSET: 2\n};\nvar CFFCharset = function CFFCharsetClosure() {\n  function CFFCharset(predefined, format, charset, raw) {\n    this.predefined = predefined;\n    this.format = format;\n    this.charset = charset;\n    this.raw = raw;\n  }\n  return CFFCharset;\n}();\nvar CFFEncoding = function CFFEncodingClosure() {\n  function CFFEncoding(predefined, format, encoding, raw) {\n    this.predefined = predefined;\n    this.format = format;\n    this.encoding = encoding;\n    this.raw = raw;\n  }\n  return CFFEncoding;\n}();\nvar CFFFDSelect = function CFFFDSelectClosure() {\n  function CFFFDSelect(fdSelect, raw) {\n    this.fdSelect = fdSelect;\n    this.raw = raw;\n  }\n  CFFFDSelect.prototype = {\n    getFDIndex: function CFFFDSelect_get(glyphIndex) {\n      if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) {\n        return -1;\n      }\n      return this.fdSelect[glyphIndex];\n    }\n  };\n  return CFFFDSelect;\n}();\nvar CFFOffsetTracker = function CFFOffsetTrackerClosure() {\n  function CFFOffsetTracker() {\n    this.offsets = Object.create(null);\n  }\n  CFFOffsetTracker.prototype = {\n    isTracking: function CFFOffsetTracker_isTracking(key) {\n      return key in this.offsets;\n    },\n    track: function CFFOffsetTracker_track(key, location) {\n      if (key in this.offsets) {\n        throw new _util.FormatError('Already tracking location of ' + key);\n      }\n      this.offsets[key] = location;\n    },\n    offset: function CFFOffsetTracker_offset(value) {\n      for (var key in this.offsets) {\n        this.offsets[key] += value;\n      }\n    },\n    setEntryLocation: function CFFOffsetTracker_setEntryLocation(key, values, output) {\n      if (!(key in this.offsets)) {\n        throw new _util.FormatError('Not tracking location of ' + key);\n      }\n      var data = output.data;\n      var dataOffset = this.offsets[key];\n      var size = 5;\n      for (var i = 0, ii = values.length; i < ii; ++i) {\n        var offset0 = i * size + dataOffset;\n        var offset1 = offset0 + 1;\n        var offset2 = offset0 + 2;\n        var offset3 = offset0 + 3;\n        var offset4 = offset0 + 4;\n        if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) {\n          throw new _util.FormatError('writing to an offset that is not empty');\n        }\n        var value = values[i];\n        data[offset0] = 0x1d;\n        data[offset1] = value >> 24 & 0xFF;\n        data[offset2] = value >> 16 & 0xFF;\n        data[offset3] = value >> 8 & 0xFF;\n        data[offset4] = value & 0xFF;\n      }\n    }\n  };\n  return CFFOffsetTracker;\n}();\nvar CFFCompiler = function CFFCompilerClosure() {\n  function CFFCompiler(cff) {\n    this.cff = cff;\n  }\n  CFFCompiler.prototype = {\n    compile: function CFFCompiler_compile() {\n      var cff = this.cff;\n      var output = {\n        data: [],\n        length: 0,\n        add: function CFFCompiler_add(data) {\n          this.data = this.data.concat(data);\n          this.length = this.data.length;\n        }\n      };\n      var header = this.compileHeader(cff.header);\n      output.add(header);\n      var nameIndex = this.compileNameIndex(cff.names);\n      output.add(nameIndex);\n      if (cff.isCIDFont) {\n        if (cff.topDict.hasName('FontMatrix')) {\n          var base = cff.topDict.getByName('FontMatrix');\n          cff.topDict.removeByName('FontMatrix');\n          for (var i = 0, ii = cff.fdArray.length; i < ii; i++) {\n            var subDict = cff.fdArray[i];\n            var matrix = base.slice(0);\n            if (subDict.hasName('FontMatrix')) {\n              matrix = _util.Util.transform(matrix, subDict.getByName('FontMatrix'));\n            }\n            subDict.setByName('FontMatrix', matrix);\n          }\n        }\n      }\n      var compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont);\n      output.add(compiled.output);\n      var topDictTracker = compiled.trackers[0];\n      var stringIndex = this.compileStringIndex(cff.strings.strings);\n      output.add(stringIndex);\n      var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);\n      output.add(globalSubrIndex);\n      if (cff.encoding && cff.topDict.hasName('Encoding')) {\n        if (cff.encoding.predefined) {\n          topDictTracker.setEntryLocation('Encoding', [cff.encoding.format], output);\n        } else {\n          var encoding = this.compileEncoding(cff.encoding);\n          topDictTracker.setEntryLocation('Encoding', [output.length], output);\n          output.add(encoding);\n        }\n      }\n      if (cff.charset && cff.topDict.hasName('charset')) {\n        if (cff.charset.predefined) {\n          topDictTracker.setEntryLocation('charset', [cff.charset.format], output);\n        } else {\n          var charset = this.compileCharset(cff.charset);\n          topDictTracker.setEntryLocation('charset', [output.length], output);\n          output.add(charset);\n        }\n      }\n      var charStrings = this.compileCharStrings(cff.charStrings);\n      topDictTracker.setEntryLocation('CharStrings', [output.length], output);\n      output.add(charStrings);\n      if (cff.isCIDFont) {\n        topDictTracker.setEntryLocation('FDSelect', [output.length], output);\n        var fdSelect = this.compileFDSelect(cff.fdSelect.raw);\n        output.add(fdSelect);\n        compiled = this.compileTopDicts(cff.fdArray, output.length, true);\n        topDictTracker.setEntryLocation('FDArray', [output.length], output);\n        output.add(compiled.output);\n        var fontDictTrackers = compiled.trackers;\n        this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);\n      }\n      this.compilePrivateDicts([cff.topDict], [topDictTracker], output);\n      output.add([0]);\n      return output.data;\n    },\n    encodeNumber: function CFFCompiler_encodeNumber(value) {\n      if (parseFloat(value) === parseInt(value, 10) && !isNaN(value)) {\n        return this.encodeInteger(value);\n      }\n      return this.encodeFloat(value);\n    },\n    encodeFloat: function CFFCompiler_encodeFloat(num) {\n      var value = num.toString();\n      var m = /\\.(\\d*?)(?:9{5,20}|0{5,20})\\d{0,2}(?:e(.+)|$)/.exec(value);\n      if (m) {\n        var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length));\n        value = (Math.round(num * epsilon) / epsilon).toString();\n      }\n      var nibbles = '';\n      var i, ii;\n      for (i = 0, ii = value.length; i < ii; ++i) {\n        var a = value[i];\n        if (a === 'e') {\n          nibbles += value[++i] === '-' ? 'c' : 'b';\n        } else if (a === '.') {\n          nibbles += 'a';\n        } else if (a === '-') {\n          nibbles += 'e';\n        } else {\n          nibbles += a;\n        }\n      }\n      nibbles += nibbles.length & 1 ? 'f' : 'ff';\n      var out = [30];\n      for (i = 0, ii = nibbles.length; i < ii; i += 2) {\n        out.push(parseInt(nibbles.substr(i, 2), 16));\n      }\n      return out;\n    },\n    encodeInteger: function CFFCompiler_encodeInteger(value) {\n      var code;\n      if (value >= -107 && value <= 107) {\n        code = [value + 139];\n      } else if (value >= 108 && value <= 1131) {\n        value = value - 108;\n        code = [(value >> 8) + 247, value & 0xFF];\n      } else if (value >= -1131 && value <= -108) {\n        value = -value - 108;\n        code = [(value >> 8) + 251, value & 0xFF];\n      } else if (value >= -32768 && value <= 32767) {\n        code = [0x1c, value >> 8 & 0xFF, value & 0xFF];\n      } else {\n        code = [0x1d, value >> 24 & 0xFF, value >> 16 & 0xFF, value >> 8 & 0xFF, value & 0xFF];\n      }\n      return code;\n    },\n    compileHeader: function CFFCompiler_compileHeader(header) {\n      return [header.major, header.minor, header.hdrSize, header.offSize];\n    },\n    compileNameIndex: function CFFCompiler_compileNameIndex(names) {\n      var nameIndex = new CFFIndex();\n      for (var i = 0, ii = names.length; i < ii; ++i) {\n        nameIndex.add((0, _util.stringToBytes)(names[i]));\n      }\n      return this.compileIndex(nameIndex);\n    },\n    compileTopDicts: function CFFCompiler_compileTopDicts(dicts, length, removeCidKeys) {\n      var fontDictTrackers = [];\n      var fdArrayIndex = new CFFIndex();\n      for (var i = 0, ii = dicts.length; i < ii; ++i) {\n        var fontDict = dicts[i];\n        if (removeCidKeys) {\n          fontDict.removeByName('CIDFontVersion');\n          fontDict.removeByName('CIDFontRevision');\n          fontDict.removeByName('CIDFontType');\n          fontDict.removeByName('CIDCount');\n          fontDict.removeByName('UIDBase');\n        }\n        var fontDictTracker = new CFFOffsetTracker();\n        var fontDictData = this.compileDict(fontDict, fontDictTracker);\n        fontDictTrackers.push(fontDictTracker);\n        fdArrayIndex.add(fontDictData);\n        fontDictTracker.offset(length);\n      }\n      fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);\n      return {\n        trackers: fontDictTrackers,\n        output: fdArrayIndex\n      };\n    },\n    compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts, trackers, output) {\n      for (var i = 0, ii = dicts.length; i < ii; ++i) {\n        var fontDict = dicts[i];\n        var privateDict = fontDict.privateDict;\n        if (!privateDict || !fontDict.hasName('Private')) {\n          throw new _util.FormatError('There must be a private dictionary.');\n        }\n        var privateDictTracker = new CFFOffsetTracker();\n        var privateDictData = this.compileDict(privateDict, privateDictTracker);\n        var outputLength = output.length;\n        privateDictTracker.offset(outputLength);\n        if (!privateDictData.length) {\n          outputLength = 0;\n        }\n        trackers[i].setEntryLocation('Private', [privateDictData.length, outputLength], output);\n        output.add(privateDictData);\n        if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {\n          var subrs = this.compileIndex(privateDict.subrsIndex);\n          privateDictTracker.setEntryLocation('Subrs', [privateDictData.length], output);\n          output.add(subrs);\n        }\n      }\n    },\n    compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {\n      var out = [];\n      var order = dict.order;\n      for (var i = 0; i < order.length; ++i) {\n        var key = order[i];\n        if (!(key in dict.values)) {\n          continue;\n        }\n        var values = dict.values[key];\n        var types = dict.types[key];\n        if (!(0, _util.isArray)(types)) {\n          types = [types];\n        }\n        if (!(0, _util.isArray)(values)) {\n          values = [values];\n        }\n        if (values.length === 0) {\n          continue;\n        }\n        for (var j = 0, jj = types.length; j < jj; ++j) {\n          var type = types[j];\n          var value = values[j];\n          switch (type) {\n            case 'num':\n            case 'sid':\n              out = out.concat(this.encodeNumber(value));\n              break;\n            case 'offset':\n              var name = dict.keyToNameMap[key];\n              if (!offsetTracker.isTracking(name)) {\n                offsetTracker.track(name, out.length);\n              }\n              out = out.concat([0x1d, 0, 0, 0, 0]);\n              break;\n            case 'array':\n            case 'delta':\n              out = out.concat(this.encodeNumber(value));\n              for (var k = 1, kk = values.length; k < kk; ++k) {\n                out = out.concat(this.encodeNumber(values[k]));\n              }\n              break;\n            default:\n              throw new _util.FormatError('Unknown data type of ' + type);\n          }\n        }\n        out = out.concat(dict.opcodes[key]);\n      }\n      return out;\n    },\n    compileStringIndex: function CFFCompiler_compileStringIndex(strings) {\n      var stringIndex = new CFFIndex();\n      for (var i = 0, ii = strings.length; i < ii; ++i) {\n        stringIndex.add((0, _util.stringToBytes)(strings[i]));\n      }\n      return this.compileIndex(stringIndex);\n    },\n    compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {\n      var globalSubrIndex = this.cff.globalSubrIndex;\n      this.out.writeByteArray(this.compileIndex(globalSubrIndex));\n    },\n    compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {\n      return this.compileIndex(charStrings);\n    },\n    compileCharset: function CFFCompiler_compileCharset(charset) {\n      return this.compileTypedArray(charset.raw);\n    },\n    compileEncoding: function CFFCompiler_compileEncoding(encoding) {\n      return this.compileTypedArray(encoding.raw);\n    },\n    compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {\n      return this.compileTypedArray(fdSelect);\n    },\n    compileTypedArray: function CFFCompiler_compileTypedArray(data) {\n      var out = [];\n      for (var i = 0, ii = data.length; i < ii; ++i) {\n        out[i] = data[i];\n      }\n      return out;\n    },\n    compileIndex: function CFFCompiler_compileIndex(index, trackers) {\n      trackers = trackers || [];\n      var objects = index.objects;\n      var count = objects.length;\n      if (count === 0) {\n        return [0, 0, 0];\n      }\n      var data = [count >> 8 & 0xFF, count & 0xff];\n      var lastOffset = 1,\n          i;\n      for (i = 0; i < count; ++i) {\n        lastOffset += objects[i].length;\n      }\n      var offsetSize;\n      if (lastOffset < 0x100) {\n        offsetSize = 1;\n      } else if (lastOffset < 0x10000) {\n        offsetSize = 2;\n      } else if (lastOffset < 0x1000000) {\n        offsetSize = 3;\n      } else {\n        offsetSize = 4;\n      }\n      data.push(offsetSize);\n      var relativeOffset = 1;\n      for (i = 0; i < count + 1; i++) {\n        if (offsetSize === 1) {\n          data.push(relativeOffset & 0xFF);\n        } else if (offsetSize === 2) {\n          data.push(relativeOffset >> 8 & 0xFF, relativeOffset & 0xFF);\n        } else if (offsetSize === 3) {\n          data.push(relativeOffset >> 16 & 0xFF, relativeOffset >> 8 & 0xFF, relativeOffset & 0xFF);\n        } else {\n          data.push(relativeOffset >>> 24 & 0xFF, relativeOffset >> 16 & 0xFF, relativeOffset >> 8 & 0xFF, relativeOffset & 0xFF);\n        }\n        if (objects[i]) {\n          relativeOffset += objects[i].length;\n        }\n      }\n      for (i = 0; i < count; i++) {\n        if (trackers[i]) {\n          trackers[i].offset(data.length);\n        }\n        for (var j = 0, jj = objects[i].length; j < jj; j++) {\n          data.push(objects[i][j]);\n        }\n      }\n      return data;\n    }\n  };\n  return CFFCompiler;\n}();\nexports.CFFStandardStrings = CFFStandardStrings;\nexports.CFFParser = CFFParser;\nexports.CFF = CFF;\nexports.CFFHeader = CFFHeader;\nexports.CFFStrings = CFFStrings;\nexports.CFFIndex = CFFIndex;\nexports.CFFCharset = CFFCharset;\nexports.CFFTopDict = CFFTopDict;\nexports.CFFPrivateDict = CFFPrivateDict;\nexports.CFFCompiler = CFFCompiler;\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ChunkedStreamManager = exports.ChunkedStream = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar ChunkedStream = function ChunkedStreamClosure() {\n  function ChunkedStream(length, chunkSize, manager) {\n    this.bytes = new Uint8Array(length);\n    this.start = 0;\n    this.pos = 0;\n    this.end = length;\n    this.chunkSize = chunkSize;\n    this.loadedChunks = [];\n    this.numChunksLoaded = 0;\n    this.numChunks = Math.ceil(length / chunkSize);\n    this.manager = manager;\n    this.progressiveDataLength = 0;\n    this.lastSuccessfulEnsureByteChunk = -1;\n  }\n  ChunkedStream.prototype = {\n    getMissingChunks: function ChunkedStream_getMissingChunks() {\n      var chunks = [];\n      for (var chunk = 0, n = this.numChunks; chunk < n; ++chunk) {\n        if (!this.loadedChunks[chunk]) {\n          chunks.push(chunk);\n        }\n      }\n      return chunks;\n    },\n    getBaseStreams: function ChunkedStream_getBaseStreams() {\n      return [this];\n    },\n    allChunksLoaded: function ChunkedStream_allChunksLoaded() {\n      return this.numChunksLoaded === this.numChunks;\n    },\n    onReceiveData: function ChunkedStream_onReceiveData(begin, chunk) {\n      var end = begin + chunk.byteLength;\n      if (begin % this.chunkSize !== 0) {\n        throw new Error('Bad begin offset: ' + begin);\n      }\n      var length = this.bytes.length;\n      if (end % this.chunkSize !== 0 && end !== length) {\n        throw new Error('Bad end offset: ' + end);\n      }\n      this.bytes.set(new Uint8Array(chunk), begin);\n      var chunkSize = this.chunkSize;\n      var beginChunk = Math.floor(begin / chunkSize);\n      var endChunk = Math.floor((end - 1) / chunkSize) + 1;\n      var curChunk;\n      for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) {\n        if (!this.loadedChunks[curChunk]) {\n          this.loadedChunks[curChunk] = true;\n          ++this.numChunksLoaded;\n        }\n      }\n    },\n    onReceiveProgressiveData: function ChunkedStream_onReceiveProgressiveData(data) {\n      var position = this.progressiveDataLength;\n      var beginChunk = Math.floor(position / this.chunkSize);\n      this.bytes.set(new Uint8Array(data), position);\n      position += data.byteLength;\n      this.progressiveDataLength = position;\n      var endChunk = position >= this.end ? this.numChunks : Math.floor(position / this.chunkSize);\n      var curChunk;\n      for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) {\n        if (!this.loadedChunks[curChunk]) {\n          this.loadedChunks[curChunk] = true;\n          ++this.numChunksLoaded;\n        }\n      }\n    },\n    ensureByte: function ChunkedStream_ensureByte(pos) {\n      var chunk = Math.floor(pos / this.chunkSize);\n      if (chunk === this.lastSuccessfulEnsureByteChunk) {\n        return;\n      }\n      if (!this.loadedChunks[chunk]) {\n        throw new _util.MissingDataException(pos, pos + 1);\n      }\n      this.lastSuccessfulEnsureByteChunk = chunk;\n    },\n    ensureRange: function ChunkedStream_ensureRange(begin, end) {\n      if (begin >= end) {\n        return;\n      }\n      if (end <= this.progressiveDataLength) {\n        return;\n      }\n      var chunkSize = this.chunkSize;\n      var beginChunk = Math.floor(begin / chunkSize);\n      var endChunk = Math.floor((end - 1) / chunkSize) + 1;\n      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {\n        if (!this.loadedChunks[chunk]) {\n          throw new _util.MissingDataException(begin, end);\n        }\n      }\n    },\n    nextEmptyChunk: function ChunkedStream_nextEmptyChunk(beginChunk) {\n      var chunk,\n          numChunks = this.numChunks;\n      for (var i = 0; i < numChunks; ++i) {\n        chunk = (beginChunk + i) % numChunks;\n        if (!this.loadedChunks[chunk]) {\n          return chunk;\n        }\n      }\n      return null;\n    },\n    hasChunk: function ChunkedStream_hasChunk(chunk) {\n      return !!this.loadedChunks[chunk];\n    },\n    get length() {\n      return this.end - this.start;\n    },\n    get isEmpty() {\n      return this.length === 0;\n    },\n    getByte: function ChunkedStream_getByte() {\n      var pos = this.pos;\n      if (pos >= this.end) {\n        return -1;\n      }\n      this.ensureByte(pos);\n      return this.bytes[this.pos++];\n    },\n    getUint16: function ChunkedStream_getUint16() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      if (b0 === -1 || b1 === -1) {\n        return -1;\n      }\n      return (b0 << 8) + b1;\n    },\n    getInt32: function ChunkedStream_getInt32() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      var b2 = this.getByte();\n      var b3 = this.getByte();\n      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n    },\n    getBytes: function ChunkedStream_getBytes(length) {\n      var bytes = this.bytes;\n      var pos = this.pos;\n      var strEnd = this.end;\n      if (!length) {\n        this.ensureRange(pos, strEnd);\n        return bytes.subarray(pos, strEnd);\n      }\n      var end = pos + length;\n      if (end > strEnd) {\n        end = strEnd;\n      }\n      this.ensureRange(pos, end);\n      this.pos = end;\n      return bytes.subarray(pos, end);\n    },\n    peekByte: function ChunkedStream_peekByte() {\n      var peekedByte = this.getByte();\n      this.pos--;\n      return peekedByte;\n    },\n    peekBytes: function ChunkedStream_peekBytes(length) {\n      var bytes = this.getBytes(length);\n      this.pos -= bytes.length;\n      return bytes;\n    },\n    getByteRange: function ChunkedStream_getBytes(begin, end) {\n      this.ensureRange(begin, end);\n      return this.bytes.subarray(begin, end);\n    },\n    skip: function ChunkedStream_skip(n) {\n      if (!n) {\n        n = 1;\n      }\n      this.pos += n;\n    },\n    reset: function ChunkedStream_reset() {\n      this.pos = this.start;\n    },\n    moveStart: function ChunkedStream_moveStart() {\n      this.start = this.pos;\n    },\n    makeSubStream: function ChunkedStream_makeSubStream(start, length, dict) {\n      this.ensureRange(start, start + length);\n      function ChunkedStreamSubstream() {}\n      ChunkedStreamSubstream.prototype = Object.create(this);\n      ChunkedStreamSubstream.prototype.getMissingChunks = function () {\n        var chunkSize = this.chunkSize;\n        var beginChunk = Math.floor(this.start / chunkSize);\n        var endChunk = Math.floor((this.end - 1) / chunkSize) + 1;\n        var missingChunks = [];\n        for (var chunk = beginChunk; chunk < endChunk; ++chunk) {\n          if (!this.loadedChunks[chunk]) {\n            missingChunks.push(chunk);\n          }\n        }\n        return missingChunks;\n      };\n      var subStream = new ChunkedStreamSubstream();\n      subStream.pos = subStream.start = start;\n      subStream.end = start + length || this.end;\n      subStream.dict = dict;\n      return subStream;\n    }\n  };\n  return ChunkedStream;\n}();\nvar ChunkedStreamManager = function ChunkedStreamManagerClosure() {\n  function ChunkedStreamManager(pdfNetworkStream, args) {\n    var chunkSize = args.rangeChunkSize;\n    var length = args.length;\n    this.stream = new ChunkedStream(length, chunkSize, this);\n    this.length = length;\n    this.chunkSize = chunkSize;\n    this.pdfNetworkStream = pdfNetworkStream;\n    this.url = args.url;\n    this.disableAutoFetch = args.disableAutoFetch;\n    this.msgHandler = args.msgHandler;\n    this.currRequestId = 0;\n    this.chunksNeededByRequest = Object.create(null);\n    this.requestsByChunk = Object.create(null);\n    this.promisesByRequest = Object.create(null);\n    this.progressiveDataLength = 0;\n    this.aborted = false;\n    this._loadedStreamCapability = (0, _util.createPromiseCapability)();\n  }\n  ChunkedStreamManager.prototype = {\n    onLoadedStream: function ChunkedStreamManager_getLoadedStream() {\n      return this._loadedStreamCapability.promise;\n    },\n    sendRequest: function ChunkedStreamManager_sendRequest(begin, end) {\n      var _this = this;\n\n      var rangeReader = this.pdfNetworkStream.getRangeReader(begin, end);\n      if (!rangeReader.isStreamingSupported) {\n        rangeReader.onProgress = this.onProgress.bind(this);\n      }\n      var chunks = [],\n          loaded = 0;\n      var manager = this;\n      var promise = new Promise(function (resolve, reject) {\n        var readChunk = function readChunk(chunk) {\n          try {\n            if (!chunk.done) {\n              var data = chunk.value;\n              chunks.push(data);\n              loaded += (0, _util.arrayByteLength)(data);\n              if (rangeReader.isStreamingSupported) {\n                manager.onProgress({ loaded: loaded });\n              }\n              rangeReader.read().then(readChunk, reject);\n              return;\n            }\n            var chunkData = (0, _util.arraysToBytes)(chunks);\n            chunks = null;\n            resolve(chunkData);\n          } catch (e) {\n            reject(e);\n          }\n        };\n        rangeReader.read().then(readChunk, reject);\n      });\n      promise.then(function (data) {\n        if (_this.aborted) {\n          return;\n        }\n        _this.onReceiveData({\n          chunk: data,\n          begin: begin\n        });\n      });\n    },\n    requestAllChunks: function ChunkedStreamManager_requestAllChunks() {\n      var missingChunks = this.stream.getMissingChunks();\n      this._requestChunks(missingChunks);\n      return this._loadedStreamCapability.promise;\n    },\n    _requestChunks: function ChunkedStreamManager_requestChunks(chunks) {\n      var requestId = this.currRequestId++;\n      var i, ii;\n      var chunksNeeded = Object.create(null);\n      this.chunksNeededByRequest[requestId] = chunksNeeded;\n      for (i = 0, ii = chunks.length; i < ii; i++) {\n        if (!this.stream.hasChunk(chunks[i])) {\n          chunksNeeded[chunks[i]] = true;\n        }\n      }\n      if ((0, _util.isEmptyObj)(chunksNeeded)) {\n        return Promise.resolve();\n      }\n      var capability = (0, _util.createPromiseCapability)();\n      this.promisesByRequest[requestId] = capability;\n      var chunksToRequest = [];\n      for (var chunk in chunksNeeded) {\n        chunk = chunk | 0;\n        if (!(chunk in this.requestsByChunk)) {\n          this.requestsByChunk[chunk] = [];\n          chunksToRequest.push(chunk);\n        }\n        this.requestsByChunk[chunk].push(requestId);\n      }\n      if (!chunksToRequest.length) {\n        return capability.promise;\n      }\n      var groupedChunksToRequest = this.groupChunks(chunksToRequest);\n      for (i = 0; i < groupedChunksToRequest.length; ++i) {\n        var groupedChunk = groupedChunksToRequest[i];\n        var begin = groupedChunk.beginChunk * this.chunkSize;\n        var end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length);\n        this.sendRequest(begin, end);\n      }\n      return capability.promise;\n    },\n    getStream: function ChunkedStreamManager_getStream() {\n      return this.stream;\n    },\n    requestRange: function ChunkedStreamManager_requestRange(begin, end) {\n      end = Math.min(end, this.length);\n      var beginChunk = this.getBeginChunk(begin);\n      var endChunk = this.getEndChunk(end);\n      var chunks = [];\n      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {\n        chunks.push(chunk);\n      }\n      return this._requestChunks(chunks);\n    },\n    requestRanges: function ChunkedStreamManager_requestRanges(ranges) {\n      ranges = ranges || [];\n      var chunksToRequest = [];\n      for (var i = 0; i < ranges.length; i++) {\n        var beginChunk = this.getBeginChunk(ranges[i].begin);\n        var endChunk = this.getEndChunk(ranges[i].end);\n        for (var chunk = beginChunk; chunk < endChunk; ++chunk) {\n          if (chunksToRequest.indexOf(chunk) < 0) {\n            chunksToRequest.push(chunk);\n          }\n        }\n      }\n      chunksToRequest.sort(function (a, b) {\n        return a - b;\n      });\n      return this._requestChunks(chunksToRequest);\n    },\n    groupChunks: function ChunkedStreamManager_groupChunks(chunks) {\n      var groupedChunks = [];\n      var beginChunk = -1;\n      var prevChunk = -1;\n      for (var i = 0; i < chunks.length; ++i) {\n        var chunk = chunks[i];\n        if (beginChunk < 0) {\n          beginChunk = chunk;\n        }\n        if (prevChunk >= 0 && prevChunk + 1 !== chunk) {\n          groupedChunks.push({\n            beginChunk: beginChunk,\n            endChunk: prevChunk + 1\n          });\n          beginChunk = chunk;\n        }\n        if (i + 1 === chunks.length) {\n          groupedChunks.push({\n            beginChunk: beginChunk,\n            endChunk: chunk + 1\n          });\n        }\n        prevChunk = chunk;\n      }\n      return groupedChunks;\n    },\n    onProgress: function ChunkedStreamManager_onProgress(args) {\n      var bytesLoaded = this.stream.numChunksLoaded * this.chunkSize + args.loaded;\n      this.msgHandler.send('DocProgress', {\n        loaded: bytesLoaded,\n        total: this.length\n      });\n    },\n    onReceiveData: function ChunkedStreamManager_onReceiveData(args) {\n      var chunk = args.chunk;\n      var isProgressive = args.begin === undefined;\n      var begin = isProgressive ? this.progressiveDataLength : args.begin;\n      var end = begin + chunk.byteLength;\n      var beginChunk = Math.floor(begin / this.chunkSize);\n      var endChunk = end < this.length ? Math.floor(end / this.chunkSize) : Math.ceil(end / this.chunkSize);\n      if (isProgressive) {\n        this.stream.onReceiveProgressiveData(chunk);\n        this.progressiveDataLength = end;\n      } else {\n        this.stream.onReceiveData(begin, chunk);\n      }\n      if (this.stream.allChunksLoaded()) {\n        this._loadedStreamCapability.resolve(this.stream);\n      }\n      var loadedRequests = [];\n      var i, requestId;\n      for (chunk = beginChunk; chunk < endChunk; ++chunk) {\n        var requestIds = this.requestsByChunk[chunk] || [];\n        delete this.requestsByChunk[chunk];\n        for (i = 0; i < requestIds.length; ++i) {\n          requestId = requestIds[i];\n          var chunksNeeded = this.chunksNeededByRequest[requestId];\n          if (chunk in chunksNeeded) {\n            delete chunksNeeded[chunk];\n          }\n          if (!(0, _util.isEmptyObj)(chunksNeeded)) {\n            continue;\n          }\n          loadedRequests.push(requestId);\n        }\n      }\n      if (!this.disableAutoFetch && (0, _util.isEmptyObj)(this.requestsByChunk)) {\n        var nextEmptyChunk;\n        if (this.stream.numChunksLoaded === 1) {\n          var lastChunk = this.stream.numChunks - 1;\n          if (!this.stream.hasChunk(lastChunk)) {\n            nextEmptyChunk = lastChunk;\n          }\n        } else {\n          nextEmptyChunk = this.stream.nextEmptyChunk(endChunk);\n        }\n        if ((0, _util.isInt)(nextEmptyChunk)) {\n          this._requestChunks([nextEmptyChunk]);\n        }\n      }\n      for (i = 0; i < loadedRequests.length; ++i) {\n        requestId = loadedRequests[i];\n        var capability = this.promisesByRequest[requestId];\n        delete this.promisesByRequest[requestId];\n        capability.resolve();\n      }\n      this.msgHandler.send('DocProgress', {\n        loaded: this.stream.numChunksLoaded * this.chunkSize,\n        total: this.length\n      });\n    },\n    onError: function ChunkedStreamManager_onError(err) {\n      this._loadedStreamCapability.reject(err);\n    },\n    getBeginChunk: function ChunkedStreamManager_getBeginChunk(begin) {\n      var chunk = Math.floor(begin / this.chunkSize);\n      return chunk;\n    },\n    getEndChunk: function ChunkedStreamManager_getEndChunk(end) {\n      var chunk = Math.floor((end - 1) / this.chunkSize) + 1;\n      return chunk;\n    },\n    abort: function ChunkedStreamManager_abort() {\n      this.aborted = true;\n      if (this.pdfNetworkStream) {\n        this.pdfNetworkStream.cancelAllRequests('abort');\n      }\n      for (var requestId in this.promisesByRequest) {\n        var capability = this.promisesByRequest[requestId];\n        capability.reject(new Error('Request was aborted'));\n      }\n    }\n  };\n  return ChunkedStreamManager;\n}();\nexports.ChunkedStream = ChunkedStream;\nexports.ChunkedStreamManager = ChunkedStreamManager;\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.calculateSHA512 = exports.calculateSHA384 = exports.calculateSHA256 = exports.calculateMD5 = exports.PDF20 = exports.PDF17 = exports.CipherTransformFactory = exports.ARCFourCipher = exports.AES256Cipher = exports.AES128Cipher = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar ARCFourCipher = function ARCFourCipherClosure() {\n  function ARCFourCipher(key) {\n    this.a = 0;\n    this.b = 0;\n    var s = new Uint8Array(256);\n    var i,\n        j = 0,\n        tmp,\n        keyLength = key.length;\n    for (i = 0; i < 256; ++i) {\n      s[i] = i;\n    }\n    for (i = 0; i < 256; ++i) {\n      tmp = s[i];\n      j = j + tmp + key[i % keyLength] & 0xFF;\n      s[i] = s[j];\n      s[j] = tmp;\n    }\n    this.s = s;\n  }\n  ARCFourCipher.prototype = {\n    encryptBlock: function ARCFourCipher_encryptBlock(data) {\n      var i,\n          n = data.length,\n          tmp,\n          tmp2;\n      var a = this.a,\n          b = this.b,\n          s = this.s;\n      var output = new Uint8Array(n);\n      for (i = 0; i < n; ++i) {\n        a = a + 1 & 0xFF;\n        tmp = s[a];\n        b = b + tmp & 0xFF;\n        tmp2 = s[b];\n        s[a] = tmp2;\n        s[b] = tmp;\n        output[i] = data[i] ^ s[tmp + tmp2 & 0xFF];\n      }\n      this.a = a;\n      this.b = b;\n      return output;\n    }\n  };\n  ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;\n  return ARCFourCipher;\n}();\nvar calculateMD5 = function calculateMD5Closure() {\n  var r = new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);\n  var k = new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, -145523070, -1120210379, 718787259, -343485551]);\n  function hash(data, offset, length) {\n    var h0 = 1732584193,\n        h1 = -271733879,\n        h2 = -1732584194,\n        h3 = 271733878;\n    var paddedLength = length + 72 & ~63;\n    var padded = new Uint8Array(paddedLength);\n    var i, j, n;\n    for (i = 0; i < length; ++i) {\n      padded[i] = data[offset++];\n    }\n    padded[i++] = 0x80;\n    n = paddedLength - 8;\n    while (i < n) {\n      padded[i++] = 0;\n    }\n    padded[i++] = length << 3 & 0xFF;\n    padded[i++] = length >> 5 & 0xFF;\n    padded[i++] = length >> 13 & 0xFF;\n    padded[i++] = length >> 21 & 0xFF;\n    padded[i++] = length >>> 29 & 0xFF;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    var w = new Int32Array(16);\n    for (i = 0; i < paddedLength;) {\n      for (j = 0; j < 16; ++j, i += 4) {\n        w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24;\n      }\n      var a = h0,\n          b = h1,\n          c = h2,\n          d = h3,\n          f,\n          g;\n      for (j = 0; j < 64; ++j) {\n        if (j < 16) {\n          f = b & c | ~b & d;\n          g = j;\n        } else if (j < 32) {\n          f = d & b | ~d & c;\n          g = 5 * j + 1 & 15;\n        } else if (j < 48) {\n          f = b ^ c ^ d;\n          g = 3 * j + 5 & 15;\n        } else {\n          f = c ^ (b | ~d);\n          g = 7 * j & 15;\n        }\n        var tmp = d,\n            rotateArg = a + f + k[j] + w[g] | 0,\n            rotate = r[j];\n        d = c;\n        c = b;\n        b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0;\n        a = tmp;\n      }\n      h0 = h0 + a | 0;\n      h1 = h1 + b | 0;\n      h2 = h2 + c | 0;\n      h3 = h3 + d | 0;\n    }\n    return new Uint8Array([h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >>> 24 & 0xFF, h1 & 0xFF, h1 >> 8 & 0xFF, h1 >> 16 & 0xFF, h1 >>> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >>> 24 & 0xFF, h3 & 0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >>> 24 & 0xFF]);\n  }\n  return hash;\n}();\nvar Word64 = function Word64Closure() {\n  function Word64(highInteger, lowInteger) {\n    this.high = highInteger | 0;\n    this.low = lowInteger | 0;\n  }\n  Word64.prototype = {\n    and: function Word64_and(word) {\n      this.high &= word.high;\n      this.low &= word.low;\n    },\n    xor: function Word64_xor(word) {\n      this.high ^= word.high;\n      this.low ^= word.low;\n    },\n    or: function Word64_or(word) {\n      this.high |= word.high;\n      this.low |= word.low;\n    },\n    shiftRight: function Word64_shiftRight(places) {\n      if (places >= 32) {\n        this.low = this.high >>> places - 32 | 0;\n        this.high = 0;\n      } else {\n        this.low = this.low >>> places | this.high << 32 - places;\n        this.high = this.high >>> places | 0;\n      }\n    },\n    shiftLeft: function Word64_shiftLeft(places) {\n      if (places >= 32) {\n        this.high = this.low << places - 32;\n        this.low = 0;\n      } else {\n        this.high = this.high << places | this.low >>> 32 - places;\n        this.low = this.low << places;\n      }\n    },\n    rotateRight: function Word64_rotateRight(places) {\n      var low, high;\n      if (places & 32) {\n        high = this.low;\n        low = this.high;\n      } else {\n        low = this.low;\n        high = this.high;\n      }\n      places &= 31;\n      this.low = low >>> places | high << 32 - places;\n      this.high = high >>> places | low << 32 - places;\n    },\n    not: function Word64_not() {\n      this.high = ~this.high;\n      this.low = ~this.low;\n    },\n    add: function Word64_add(word) {\n      var lowAdd = (this.low >>> 0) + (word.low >>> 0);\n      var highAdd = (this.high >>> 0) + (word.high >>> 0);\n      if (lowAdd > 0xFFFFFFFF) {\n        highAdd += 1;\n      }\n      this.low = lowAdd | 0;\n      this.high = highAdd | 0;\n    },\n    copyTo: function Word64_copyTo(bytes, offset) {\n      bytes[offset] = this.high >>> 24 & 0xFF;\n      bytes[offset + 1] = this.high >> 16 & 0xFF;\n      bytes[offset + 2] = this.high >> 8 & 0xFF;\n      bytes[offset + 3] = this.high & 0xFF;\n      bytes[offset + 4] = this.low >>> 24 & 0xFF;\n      bytes[offset + 5] = this.low >> 16 & 0xFF;\n      bytes[offset + 6] = this.low >> 8 & 0xFF;\n      bytes[offset + 7] = this.low & 0xFF;\n    },\n    assign: function Word64_assign(word) {\n      this.high = word.high;\n      this.low = word.low;\n    }\n  };\n  return Word64;\n}();\nvar calculateSHA256 = function calculateSHA256Closure() {\n  function rotr(x, n) {\n    return x >>> n | x << 32 - n;\n  }\n  function ch(x, y, z) {\n    return x & y ^ ~x & z;\n  }\n  function maj(x, y, z) {\n    return x & y ^ x & z ^ y & z;\n  }\n  function sigma(x) {\n    return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);\n  }\n  function sigmaPrime(x) {\n    return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);\n  }\n  function littleSigma(x) {\n    return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3;\n  }\n  function littleSigmaPrime(x) {\n    return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10;\n  }\n  var k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];\n  function hash(data, offset, length) {\n    var h0 = 0x6a09e667,\n        h1 = 0xbb67ae85,\n        h2 = 0x3c6ef372,\n        h3 = 0xa54ff53a,\n        h4 = 0x510e527f,\n        h5 = 0x9b05688c,\n        h6 = 0x1f83d9ab,\n        h7 = 0x5be0cd19;\n    var paddedLength = Math.ceil((length + 9) / 64) * 64;\n    var padded = new Uint8Array(paddedLength);\n    var i, j, n;\n    for (i = 0; i < length; ++i) {\n      padded[i] = data[offset++];\n    }\n    padded[i++] = 0x80;\n    n = paddedLength - 8;\n    while (i < n) {\n      padded[i++] = 0;\n    }\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = length >>> 29 & 0xFF;\n    padded[i++] = length >> 21 & 0xFF;\n    padded[i++] = length >> 13 & 0xFF;\n    padded[i++] = length >> 5 & 0xFF;\n    padded[i++] = length << 3 & 0xFF;\n    var w = new Uint32Array(64);\n    for (i = 0; i < paddedLength;) {\n      for (j = 0; j < 16; ++j) {\n        w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];\n        i += 4;\n      }\n      for (j = 16; j < 64; ++j) {\n        w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + littleSigma(w[j - 15]) + w[j - 16] | 0;\n      }\n      var a = h0,\n          b = h1,\n          c = h2,\n          d = h3,\n          e = h4,\n          f = h5,\n          g = h6,\n          h = h7,\n          t1,\n          t2;\n      for (j = 0; j < 64; ++j) {\n        t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j];\n        t2 = sigma(a) + maj(a, b, c);\n        h = g;\n        g = f;\n        f = e;\n        e = d + t1 | 0;\n        d = c;\n        c = b;\n        b = a;\n        a = t1 + t2 | 0;\n      }\n      h0 = h0 + a | 0;\n      h1 = h1 + b | 0;\n      h2 = h2 + c | 0;\n      h3 = h3 + d | 0;\n      h4 = h4 + e | 0;\n      h5 = h5 + f | 0;\n      h6 = h6 + g | 0;\n      h7 = h7 + h | 0;\n    }\n    return new Uint8Array([h0 >> 24 & 0xFF, h0 >> 16 & 0xFF, h0 >> 8 & 0xFF, h0 & 0xFF, h1 >> 24 & 0xFF, h1 >> 16 & 0xFF, h1 >> 8 & 0xFF, h1 & 0xFF, h2 >> 24 & 0xFF, h2 >> 16 & 0xFF, h2 >> 8 & 0xFF, h2 & 0xFF, h3 >> 24 & 0xFF, h3 >> 16 & 0xFF, h3 >> 8 & 0xFF, h3 & 0xFF, h4 >> 24 & 0xFF, h4 >> 16 & 0xFF, h4 >> 8 & 0xFF, h4 & 0xFF, h5 >> 24 & 0xFF, h5 >> 16 & 0xFF, h5 >> 8 & 0xFF, h5 & 0xFF, h6 >> 24 & 0xFF, h6 >> 16 & 0xFF, h6 >> 8 & 0xFF, h6 & 0xFF, h7 >> 24 & 0xFF, h7 >> 16 & 0xFF, h7 >> 8 & 0xFF, h7 & 0xFF]);\n  }\n  return hash;\n}();\nvar calculateSHA512 = function calculateSHA512Closure() {\n  function ch(result, x, y, z, tmp) {\n    result.assign(x);\n    result.and(y);\n    tmp.assign(x);\n    tmp.not();\n    tmp.and(z);\n    result.xor(tmp);\n  }\n  function maj(result, x, y, z, tmp) {\n    result.assign(x);\n    result.and(y);\n    tmp.assign(x);\n    tmp.and(z);\n    result.xor(tmp);\n    tmp.assign(y);\n    tmp.and(z);\n    result.xor(tmp);\n  }\n  function sigma(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(28);\n    tmp.assign(x);\n    tmp.rotateRight(34);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.rotateRight(39);\n    result.xor(tmp);\n  }\n  function sigmaPrime(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(14);\n    tmp.assign(x);\n    tmp.rotateRight(18);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.rotateRight(41);\n    result.xor(tmp);\n  }\n  function littleSigma(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(1);\n    tmp.assign(x);\n    tmp.rotateRight(8);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.shiftRight(7);\n    result.xor(tmp);\n  }\n  function littleSigmaPrime(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(19);\n    tmp.assign(x);\n    tmp.rotateRight(61);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.shiftRight(6);\n    result.xor(tmp);\n  }\n  var k = [new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)];\n  function hash(data, offset, length, mode384) {\n    mode384 = !!mode384;\n    var h0, h1, h2, h3, h4, h5, h6, h7;\n    if (!mode384) {\n      h0 = new Word64(0x6a09e667, 0xf3bcc908);\n      h1 = new Word64(0xbb67ae85, 0x84caa73b);\n      h2 = new Word64(0x3c6ef372, 0xfe94f82b);\n      h3 = new Word64(0xa54ff53a, 0x5f1d36f1);\n      h4 = new Word64(0x510e527f, 0xade682d1);\n      h5 = new Word64(0x9b05688c, 0x2b3e6c1f);\n      h6 = new Word64(0x1f83d9ab, 0xfb41bd6b);\n      h7 = new Word64(0x5be0cd19, 0x137e2179);\n    } else {\n      h0 = new Word64(0xcbbb9d5d, 0xc1059ed8);\n      h1 = new Word64(0x629a292a, 0x367cd507);\n      h2 = new Word64(0x9159015a, 0x3070dd17);\n      h3 = new Word64(0x152fecd8, 0xf70e5939);\n      h4 = new Word64(0x67332667, 0xffc00b31);\n      h5 = new Word64(0x8eb44a87, 0x68581511);\n      h6 = new Word64(0xdb0c2e0d, 0x64f98fa7);\n      h7 = new Word64(0x47b5481d, 0xbefa4fa4);\n    }\n    var paddedLength = Math.ceil((length + 17) / 128) * 128;\n    var padded = new Uint8Array(paddedLength);\n    var i, j, n;\n    for (i = 0; i < length; ++i) {\n      padded[i] = data[offset++];\n    }\n    padded[i++] = 0x80;\n    n = paddedLength - 16;\n    while (i < n) {\n      padded[i++] = 0;\n    }\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = length >>> 29 & 0xFF;\n    padded[i++] = length >> 21 & 0xFF;\n    padded[i++] = length >> 13 & 0xFF;\n    padded[i++] = length >> 5 & 0xFF;\n    padded[i++] = length << 3 & 0xFF;\n    var w = new Array(80);\n    for (i = 0; i < 80; i++) {\n      w[i] = new Word64(0, 0);\n    }\n    var a = new Word64(0, 0),\n        b = new Word64(0, 0),\n        c = new Word64(0, 0);\n    var d = new Word64(0, 0),\n        e = new Word64(0, 0),\n        f = new Word64(0, 0);\n    var g = new Word64(0, 0),\n        h = new Word64(0, 0);\n    var t1 = new Word64(0, 0),\n        t2 = new Word64(0, 0);\n    var tmp1 = new Word64(0, 0),\n        tmp2 = new Word64(0, 0),\n        tmp3;\n    for (i = 0; i < paddedLength;) {\n      for (j = 0; j < 16; ++j) {\n        w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];\n        w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7];\n        i += 8;\n      }\n      for (j = 16; j < 80; ++j) {\n        tmp3 = w[j];\n        littleSigmaPrime(tmp3, w[j - 2], tmp2);\n        tmp3.add(w[j - 7]);\n        littleSigma(tmp1, w[j - 15], tmp2);\n        tmp3.add(tmp1);\n        tmp3.add(w[j - 16]);\n      }\n      a.assign(h0);\n      b.assign(h1);\n      c.assign(h2);\n      d.assign(h3);\n      e.assign(h4);\n      f.assign(h5);\n      g.assign(h6);\n      h.assign(h7);\n      for (j = 0; j < 80; ++j) {\n        t1.assign(h);\n        sigmaPrime(tmp1, e, tmp2);\n        t1.add(tmp1);\n        ch(tmp1, e, f, g, tmp2);\n        t1.add(tmp1);\n        t1.add(k[j]);\n        t1.add(w[j]);\n        sigma(t2, a, tmp2);\n        maj(tmp1, a, b, c, tmp2);\n        t2.add(tmp1);\n        tmp3 = h;\n        h = g;\n        g = f;\n        f = e;\n        d.add(t1);\n        e = d;\n        d = c;\n        c = b;\n        b = a;\n        tmp3.assign(t1);\n        tmp3.add(t2);\n        a = tmp3;\n      }\n      h0.add(a);\n      h1.add(b);\n      h2.add(c);\n      h3.add(d);\n      h4.add(e);\n      h5.add(f);\n      h6.add(g);\n      h7.add(h);\n    }\n    var result;\n    if (!mode384) {\n      result = new Uint8Array(64);\n      h0.copyTo(result, 0);\n      h1.copyTo(result, 8);\n      h2.copyTo(result, 16);\n      h3.copyTo(result, 24);\n      h4.copyTo(result, 32);\n      h5.copyTo(result, 40);\n      h6.copyTo(result, 48);\n      h7.copyTo(result, 56);\n    } else {\n      result = new Uint8Array(48);\n      h0.copyTo(result, 0);\n      h1.copyTo(result, 8);\n      h2.copyTo(result, 16);\n      h3.copyTo(result, 24);\n      h4.copyTo(result, 32);\n      h5.copyTo(result, 40);\n    }\n    return result;\n  }\n  return hash;\n}();\nvar calculateSHA384 = function calculateSHA384Closure() {\n  function hash(data, offset, length) {\n    return calculateSHA512(data, offset, length, true);\n  }\n  return hash;\n}();\nvar NullCipher = function NullCipherClosure() {\n  function NullCipher() {}\n  NullCipher.prototype = {\n    decryptBlock: function NullCipher_decryptBlock(data) {\n      return data;\n    }\n  };\n  return NullCipher;\n}();\nvar AES128Cipher = function AES128CipherClosure() {\n  var rcon = new Uint8Array([0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]);\n  var s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]);\n  var inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]);\n  var mixCol = new Uint8Array(256);\n  for (var i = 0; i < 256; i++) {\n    if (i < 128) {\n      mixCol[i] = i << 1;\n    } else {\n      mixCol[i] = i << 1 ^ 0x1b;\n    }\n  }\n  var mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);\n  function expandKey128(cipherKey) {\n    var b = 176,\n        result = new Uint8Array(b);\n    result.set(cipherKey);\n    for (var j = 16, i = 1; j < b; ++i) {\n      var t1 = result[j - 3],\n          t2 = result[j - 2],\n          t3 = result[j - 1],\n          t4 = result[j - 4];\n      t1 = s[t1];\n      t2 = s[t2];\n      t3 = s[t3];\n      t4 = s[t4];\n      t1 = t1 ^ rcon[i];\n      for (var n = 0; n < 4; ++n) {\n        result[j] = t1 ^= result[j - 16];\n        j++;\n        result[j] = t2 ^= result[j - 16];\n        j++;\n        result[j] = t3 ^= result[j - 16];\n        j++;\n        result[j] = t4 ^= result[j - 16];\n        j++;\n      }\n    }\n    return result;\n  }\n  function decrypt128(input, key) {\n    var state = new Uint8Array(16);\n    state.set(input);\n    var i, j, k;\n    var t, u, v;\n    for (j = 0, k = 160; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n    for (i = 9; i >= 1; --i) {\n      t = state[13];\n      state[13] = state[9];\n      state[9] = state[5];\n      state[5] = state[1];\n      state[1] = t;\n      t = state[14];\n      u = state[10];\n      state[14] = state[6];\n      state[10] = state[2];\n      state[6] = t;\n      state[2] = u;\n      t = state[15];\n      u = state[11];\n      v = state[7];\n      state[15] = state[3];\n      state[11] = t;\n      state[7] = u;\n      state[3] = v;\n      for (j = 0; j < 16; ++j) {\n        state[j] = inv_s[state[j]];\n      }\n      for (j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n      for (j = 0; j < 16; j += 4) {\n        var s0 = mix[state[j]],\n            s1 = mix[state[j + 1]],\n            s2 = mix[state[j + 2]],\n            s3 = mix[state[j + 3]];\n        t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8;\n        state[j] = t >>> 24 & 0xFF;\n        state[j + 1] = t >> 16 & 0xFF;\n        state[j + 2] = t >> 8 & 0xFF;\n        state[j + 3] = t & 0xFF;\n      }\n    }\n    t = state[13];\n    state[13] = state[9];\n    state[9] = state[5];\n    state[5] = state[1];\n    state[1] = t;\n    t = state[14];\n    u = state[10];\n    state[14] = state[6];\n    state[10] = state[2];\n    state[6] = t;\n    state[2] = u;\n    t = state[15];\n    u = state[11];\n    v = state[7];\n    state[15] = state[3];\n    state[11] = t;\n    state[7] = u;\n    state[3] = v;\n    for (j = 0; j < 16; ++j) {\n      state[j] = inv_s[state[j]];\n      state[j] ^= key[j];\n    }\n    return state;\n  }\n  function encrypt128(input, key) {\n    var t, u, v, k;\n    var state = new Uint8Array(16);\n    state.set(input);\n    for (j = 0; j < 16; ++j) {\n      state[j] ^= key[j];\n    }\n    for (i = 1; i < 10; i++) {\n      for (j = 0; j < 16; ++j) {\n        state[j] = s[state[j]];\n      }\n      v = state[1];\n      state[1] = state[5];\n      state[5] = state[9];\n      state[9] = state[13];\n      state[13] = v;\n      v = state[2];\n      u = state[6];\n      state[2] = state[10];\n      state[6] = state[14];\n      state[10] = v;\n      state[14] = u;\n      v = state[3];\n      u = state[7];\n      t = state[11];\n      state[3] = state[15];\n      state[7] = v;\n      state[11] = u;\n      state[15] = t;\n      for (var j = 0; j < 16; j += 4) {\n        var s0 = state[j + 0],\n            s1 = state[j + 1];\n        var s2 = state[j + 2],\n            s3 = state[j + 3];\n        t = s0 ^ s1 ^ s2 ^ s3;\n        state[j + 0] ^= t ^ mixCol[s0 ^ s1];\n        state[j + 1] ^= t ^ mixCol[s1 ^ s2];\n        state[j + 2] ^= t ^ mixCol[s2 ^ s3];\n        state[j + 3] ^= t ^ mixCol[s3 ^ s0];\n      }\n      for (j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n    }\n    for (j = 0; j < 16; ++j) {\n      state[j] = s[state[j]];\n    }\n    v = state[1];\n    state[1] = state[5];\n    state[5] = state[9];\n    state[9] = state[13];\n    state[13] = v;\n    v = state[2];\n    u = state[6];\n    state[2] = state[10];\n    state[6] = state[14];\n    state[10] = v;\n    state[14] = u;\n    v = state[3];\n    u = state[7];\n    t = state[11];\n    state[3] = state[15];\n    state[7] = v;\n    state[11] = u;\n    state[15] = t;\n    for (j = 0, k = 160; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n    return state;\n  }\n  function AES128Cipher(key) {\n    this.key = expandKey128(key);\n    this.buffer = new Uint8Array(16);\n    this.bufferPosition = 0;\n  }\n  function decryptBlock2(data, finalize) {\n    var i,\n        j,\n        ii,\n        sourceLength = data.length,\n        buffer = this.buffer,\n        bufferLength = this.bufferPosition,\n        result = [],\n        iv = this.iv;\n    for (i = 0; i < sourceLength; ++i) {\n      buffer[bufferLength] = data[i];\n      ++bufferLength;\n      if (bufferLength < 16) {\n        continue;\n      }\n      var plain = decrypt128(buffer, this.key);\n      for (j = 0; j < 16; ++j) {\n        plain[j] ^= iv[j];\n      }\n      iv = buffer;\n      result.push(plain);\n      buffer = new Uint8Array(16);\n      bufferLength = 0;\n    }\n    this.buffer = buffer;\n    this.bufferLength = bufferLength;\n    this.iv = iv;\n    if (result.length === 0) {\n      return new Uint8Array([]);\n    }\n    var outputLength = 16 * result.length;\n    if (finalize) {\n      var lastBlock = result[result.length - 1];\n      var psLen = lastBlock[15];\n      if (psLen <= 16) {\n        for (i = 15, ii = 16 - psLen; i >= ii; --i) {\n          if (lastBlock[i] !== psLen) {\n            psLen = 0;\n            break;\n          }\n        }\n        outputLength -= psLen;\n        result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);\n      }\n    }\n    var output = new Uint8Array(outputLength);\n    for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n      output.set(result[i], j);\n    }\n    return output;\n  }\n  AES128Cipher.prototype = {\n    decryptBlock: function AES128Cipher_decryptBlock(data, finalize) {\n      var i,\n          sourceLength = data.length;\n      var buffer = this.buffer,\n          bufferLength = this.bufferPosition;\n      for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) {\n        buffer[bufferLength] = data[i];\n      }\n      if (bufferLength < 16) {\n        this.bufferLength = bufferLength;\n        return new Uint8Array([]);\n      }\n      this.iv = buffer;\n      this.buffer = new Uint8Array(16);\n      this.bufferLength = 0;\n      this.decryptBlock = decryptBlock2;\n      return this.decryptBlock(data.subarray(16), finalize);\n    },\n    encrypt: function AES128Cipher_encrypt(data, iv) {\n      var i,\n          j,\n          ii,\n          sourceLength = data.length,\n          buffer = this.buffer,\n          bufferLength = this.bufferPosition,\n          result = [];\n      if (!iv) {\n        iv = new Uint8Array(16);\n      }\n      for (i = 0; i < sourceLength; ++i) {\n        buffer[bufferLength] = data[i];\n        ++bufferLength;\n        if (bufferLength < 16) {\n          continue;\n        }\n        for (j = 0; j < 16; ++j) {\n          buffer[j] ^= iv[j];\n        }\n        var cipher = encrypt128(buffer, this.key);\n        iv = cipher;\n        result.push(cipher);\n        buffer = new Uint8Array(16);\n        bufferLength = 0;\n      }\n      this.buffer = buffer;\n      this.bufferLength = bufferLength;\n      this.iv = iv;\n      if (result.length === 0) {\n        return new Uint8Array([]);\n      }\n      var outputLength = 16 * result.length;\n      var output = new Uint8Array(outputLength);\n      for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n        output.set(result[i], j);\n      }\n      return output;\n    }\n  };\n  return AES128Cipher;\n}();\nvar AES256Cipher = function AES256CipherClosure() {\n  var s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]);\n  var inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]);\n  var mixCol = new Uint8Array(256);\n  for (var i = 0; i < 256; i++) {\n    if (i < 128) {\n      mixCol[i] = i << 1;\n    } else {\n      mixCol[i] = i << 1 ^ 0x1b;\n    }\n  }\n  var mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);\n  function expandKey256(cipherKey) {\n    var b = 240,\n        result = new Uint8Array(b);\n    var r = 1;\n    result.set(cipherKey);\n    for (var j = 32, i = 1; j < b; ++i) {\n      if (j % 32 === 16) {\n        t1 = s[t1];\n        t2 = s[t2];\n        t3 = s[t3];\n        t4 = s[t4];\n      } else if (j % 32 === 0) {\n        var t1 = result[j - 3],\n            t2 = result[j - 2],\n            t3 = result[j - 1],\n            t4 = result[j - 4];\n        t1 = s[t1];\n        t2 = s[t2];\n        t3 = s[t3];\n        t4 = s[t4];\n        t1 = t1 ^ r;\n        if ((r <<= 1) >= 256) {\n          r = (r ^ 0x1b) & 0xFF;\n        }\n      }\n      for (var n = 0; n < 4; ++n) {\n        result[j] = t1 ^= result[j - 32];\n        j++;\n        result[j] = t2 ^= result[j - 32];\n        j++;\n        result[j] = t3 ^= result[j - 32];\n        j++;\n        result[j] = t4 ^= result[j - 32];\n        j++;\n      }\n    }\n    return result;\n  }\n  function decrypt256(input, key) {\n    var state = new Uint8Array(16);\n    state.set(input);\n    var i, j, k;\n    var t, u, v;\n    for (j = 0, k = 224; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n    for (i = 13; i >= 1; --i) {\n      t = state[13];\n      state[13] = state[9];\n      state[9] = state[5];\n      state[5] = state[1];\n      state[1] = t;\n      t = state[14];\n      u = state[10];\n      state[14] = state[6];\n      state[10] = state[2];\n      state[6] = t;\n      state[2] = u;\n      t = state[15];\n      u = state[11];\n      v = state[7];\n      state[15] = state[3];\n      state[11] = t;\n      state[7] = u;\n      state[3] = v;\n      for (j = 0; j < 16; ++j) {\n        state[j] = inv_s[state[j]];\n      }\n      for (j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n      for (j = 0; j < 16; j += 4) {\n        var s0 = mix[state[j]],\n            s1 = mix[state[j + 1]],\n            s2 = mix[state[j + 2]],\n            s3 = mix[state[j + 3]];\n        t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8;\n        state[j] = t >>> 24 & 0xFF;\n        state[j + 1] = t >> 16 & 0xFF;\n        state[j + 2] = t >> 8 & 0xFF;\n        state[j + 3] = t & 0xFF;\n      }\n    }\n    t = state[13];\n    state[13] = state[9];\n    state[9] = state[5];\n    state[5] = state[1];\n    state[1] = t;\n    t = state[14];\n    u = state[10];\n    state[14] = state[6];\n    state[10] = state[2];\n    state[6] = t;\n    state[2] = u;\n    t = state[15];\n    u = state[11];\n    v = state[7];\n    state[15] = state[3];\n    state[11] = t;\n    state[7] = u;\n    state[3] = v;\n    for (j = 0; j < 16; ++j) {\n      state[j] = inv_s[state[j]];\n      state[j] ^= key[j];\n    }\n    return state;\n  }\n  function encrypt256(input, key) {\n    var t, u, v, k;\n    var state = new Uint8Array(16);\n    state.set(input);\n    for (j = 0; j < 16; ++j) {\n      state[j] ^= key[j];\n    }\n    for (i = 1; i < 14; i++) {\n      for (j = 0; j < 16; ++j) {\n        state[j] = s[state[j]];\n      }\n      v = state[1];\n      state[1] = state[5];\n      state[5] = state[9];\n      state[9] = state[13];\n      state[13] = v;\n      v = state[2];\n      u = state[6];\n      state[2] = state[10];\n      state[6] = state[14];\n      state[10] = v;\n      state[14] = u;\n      v = state[3];\n      u = state[7];\n      t = state[11];\n      state[3] = state[15];\n      state[7] = v;\n      state[11] = u;\n      state[15] = t;\n      for (var j = 0; j < 16; j += 4) {\n        var s0 = state[j + 0],\n            s1 = state[j + 1];\n        var s2 = state[j + 2],\n            s3 = state[j + 3];\n        t = s0 ^ s1 ^ s2 ^ s3;\n        state[j + 0] ^= t ^ mixCol[s0 ^ s1];\n        state[j + 1] ^= t ^ mixCol[s1 ^ s2];\n        state[j + 2] ^= t ^ mixCol[s2 ^ s3];\n        state[j + 3] ^= t ^ mixCol[s3 ^ s0];\n      }\n      for (j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n    }\n    for (j = 0; j < 16; ++j) {\n      state[j] = s[state[j]];\n    }\n    v = state[1];\n    state[1] = state[5];\n    state[5] = state[9];\n    state[9] = state[13];\n    state[13] = v;\n    v = state[2];\n    u = state[6];\n    state[2] = state[10];\n    state[6] = state[14];\n    state[10] = v;\n    state[14] = u;\n    v = state[3];\n    u = state[7];\n    t = state[11];\n    state[3] = state[15];\n    state[7] = v;\n    state[11] = u;\n    state[15] = t;\n    for (j = 0, k = 224; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n    return state;\n  }\n  function AES256Cipher(key) {\n    this.key = expandKey256(key);\n    this.buffer = new Uint8Array(16);\n    this.bufferPosition = 0;\n  }\n  function decryptBlock2(data, finalize) {\n    var i,\n        j,\n        ii,\n        sourceLength = data.length,\n        buffer = this.buffer,\n        bufferLength = this.bufferPosition,\n        result = [],\n        iv = this.iv;\n    for (i = 0; i < sourceLength; ++i) {\n      buffer[bufferLength] = data[i];\n      ++bufferLength;\n      if (bufferLength < 16) {\n        continue;\n      }\n      var plain = decrypt256(buffer, this.key);\n      for (j = 0; j < 16; ++j) {\n        plain[j] ^= iv[j];\n      }\n      iv = buffer;\n      result.push(plain);\n      buffer = new Uint8Array(16);\n      bufferLength = 0;\n    }\n    this.buffer = buffer;\n    this.bufferLength = bufferLength;\n    this.iv = iv;\n    if (result.length === 0) {\n      return new Uint8Array([]);\n    }\n    var outputLength = 16 * result.length;\n    if (finalize) {\n      var lastBlock = result[result.length - 1];\n      var psLen = lastBlock[15];\n      if (psLen <= 16) {\n        for (i = 15, ii = 16 - psLen; i >= ii; --i) {\n          if (lastBlock[i] !== psLen) {\n            psLen = 0;\n            break;\n          }\n        }\n        outputLength -= psLen;\n        result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);\n      }\n    }\n    var output = new Uint8Array(outputLength);\n    for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n      output.set(result[i], j);\n    }\n    return output;\n  }\n  AES256Cipher.prototype = {\n    decryptBlock: function AES256Cipher_decryptBlock(data, finalize, iv) {\n      var i,\n          sourceLength = data.length;\n      var buffer = this.buffer,\n          bufferLength = this.bufferPosition;\n      if (iv) {\n        this.iv = iv;\n      } else {\n        for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) {\n          buffer[bufferLength] = data[i];\n        }\n        if (bufferLength < 16) {\n          this.bufferLength = bufferLength;\n          return new Uint8Array([]);\n        }\n        this.iv = buffer;\n        data = data.subarray(16);\n      }\n      this.buffer = new Uint8Array(16);\n      this.bufferLength = 0;\n      this.decryptBlock = decryptBlock2;\n      return this.decryptBlock(data, finalize);\n    },\n    encrypt: function AES256Cipher_encrypt(data, iv) {\n      var i,\n          j,\n          ii,\n          sourceLength = data.length,\n          buffer = this.buffer,\n          bufferLength = this.bufferPosition,\n          result = [];\n      if (!iv) {\n        iv = new Uint8Array(16);\n      }\n      for (i = 0; i < sourceLength; ++i) {\n        buffer[bufferLength] = data[i];\n        ++bufferLength;\n        if (bufferLength < 16) {\n          continue;\n        }\n        for (j = 0; j < 16; ++j) {\n          buffer[j] ^= iv[j];\n        }\n        var cipher = encrypt256(buffer, this.key);\n        this.iv = cipher;\n        result.push(cipher);\n        buffer = new Uint8Array(16);\n        bufferLength = 0;\n      }\n      this.buffer = buffer;\n      this.bufferLength = bufferLength;\n      this.iv = iv;\n      if (result.length === 0) {\n        return new Uint8Array([]);\n      }\n      var outputLength = 16 * result.length;\n      var output = new Uint8Array(outputLength);\n      for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n        output.set(result[i], j);\n      }\n      return output;\n    }\n  };\n  return AES256Cipher;\n}();\nvar PDF17 = function PDF17Closure() {\n  function compareByteArrays(array1, array2) {\n    if (array1.length !== array2.length) {\n      return false;\n    }\n    for (var i = 0; i < array1.length; i++) {\n      if (array1[i] !== array2[i]) {\n        return false;\n      }\n    }\n    return true;\n  }\n  function PDF17() {}\n  PDF17.prototype = {\n    checkOwnerPassword: function PDF17_checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerValidationSalt, password.length);\n      hashData.set(userBytes, password.length + ownerValidationSalt.length);\n      var result = calculateSHA256(hashData, 0, hashData.length);\n      return compareByteArrays(result, ownerPassword);\n    },\n    checkUserPassword: function PDF17_checkUserPassword(password, userValidationSalt, userPassword) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userValidationSalt, password.length);\n      var result = calculateSHA256(hashData, 0, hashData.length);\n      return compareByteArrays(result, userPassword);\n    },\n    getOwnerKey: function PDF17_getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerKeySalt, password.length);\n      hashData.set(userBytes, password.length + ownerKeySalt.length);\n      var key = calculateSHA256(hashData, 0, hashData.length);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));\n    },\n    getUserKey: function PDF17_getUserKey(password, userKeySalt, userEncryption) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userKeySalt, password.length);\n      var key = calculateSHA256(hashData, 0, hashData.length);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));\n    }\n  };\n  return PDF17;\n}();\nvar PDF20 = function PDF20Closure() {\n  function concatArrays(array1, array2) {\n    var t = new Uint8Array(array1.length + array2.length);\n    t.set(array1, 0);\n    t.set(array2, array1.length);\n    return t;\n  }\n  function calculatePDF20Hash(password, input, userBytes) {\n    var k = calculateSHA256(input, 0, input.length).subarray(0, 32);\n    var e = [0];\n    var i = 0;\n    while (i < 64 || e[e.length - 1] > i - 32) {\n      var arrayLength = password.length + k.length + userBytes.length;\n      var k1 = new Uint8Array(arrayLength * 64);\n      var array = concatArrays(password, k);\n      array = concatArrays(array, userBytes);\n      for (var j = 0, pos = 0; j < 64; j++, pos += arrayLength) {\n        k1.set(array, pos);\n      }\n      var cipher = new AES128Cipher(k.subarray(0, 16));\n      e = cipher.encrypt(k1, k.subarray(16, 32));\n      var remainder = 0;\n      for (var z = 0; z < 16; z++) {\n        remainder *= 256 % 3;\n        remainder %= 3;\n        remainder += (e[z] >>> 0) % 3;\n        remainder %= 3;\n      }\n      if (remainder === 0) {\n        k = calculateSHA256(e, 0, e.length);\n      } else if (remainder === 1) {\n        k = calculateSHA384(e, 0, e.length);\n      } else if (remainder === 2) {\n        k = calculateSHA512(e, 0, e.length);\n      }\n      i++;\n    }\n    return k.subarray(0, 32);\n  }\n  function PDF20() {}\n  function compareByteArrays(array1, array2) {\n    if (array1.length !== array2.length) {\n      return false;\n    }\n    for (var i = 0; i < array1.length; i++) {\n      if (array1[i] !== array2[i]) {\n        return false;\n      }\n    }\n    return true;\n  }\n  PDF20.prototype = {\n    hash: function PDF20_hash(password, concatBytes, userBytes) {\n      return calculatePDF20Hash(password, concatBytes, userBytes);\n    },\n    checkOwnerPassword: function PDF20_checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerValidationSalt, password.length);\n      hashData.set(userBytes, password.length + ownerValidationSalt.length);\n      var result = calculatePDF20Hash(password, hashData, userBytes);\n      return compareByteArrays(result, ownerPassword);\n    },\n    checkUserPassword: function PDF20_checkUserPassword(password, userValidationSalt, userPassword) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userValidationSalt, password.length);\n      var result = calculatePDF20Hash(password, hashData, []);\n      return compareByteArrays(result, userPassword);\n    },\n    getOwnerKey: function PDF20_getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerKeySalt, password.length);\n      hashData.set(userBytes, password.length + ownerKeySalt.length);\n      var key = calculatePDF20Hash(password, hashData, userBytes);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));\n    },\n    getUserKey: function PDF20_getUserKey(password, userKeySalt, userEncryption) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userKeySalt, password.length);\n      var key = calculatePDF20Hash(password, hashData, []);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));\n    }\n  };\n  return PDF20;\n}();\nvar CipherTransform = function CipherTransformClosure() {\n  function CipherTransform(stringCipherConstructor, streamCipherConstructor) {\n    this.StringCipherConstructor = stringCipherConstructor;\n    this.StreamCipherConstructor = streamCipherConstructor;\n  }\n  CipherTransform.prototype = {\n    createStream: function CipherTransform_createStream(stream, length) {\n      var cipher = new this.StreamCipherConstructor();\n      return new _stream.DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) {\n        return cipher.decryptBlock(data, finalize);\n      });\n    },\n    decryptString: function CipherTransform_decryptString(s) {\n      var cipher = new this.StringCipherConstructor();\n      var data = (0, _util.stringToBytes)(s);\n      data = cipher.decryptBlock(data, true);\n      return (0, _util.bytesToString)(data);\n    }\n  };\n  return CipherTransform;\n}();\nvar CipherTransformFactory = function CipherTransformFactoryClosure() {\n  var defaultPasswordBytes = new Uint8Array([0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41, 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08, 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80, 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);\n  function createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) {\n    if (password) {\n      var passwordLength = Math.min(127, password.length);\n      password = password.subarray(0, passwordLength);\n    } else {\n      password = [];\n    }\n    var pdfAlgorithm;\n    if (revision === 6) {\n      pdfAlgorithm = new PDF20();\n    } else {\n      pdfAlgorithm = new PDF17();\n    }\n    if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) {\n      return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption);\n    } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, ownerPassword)) {\n      return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption);\n    }\n    return null;\n  }\n  function prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata) {\n    var hashDataSize = 40 + ownerPassword.length + fileId.length;\n    var hashData = new Uint8Array(hashDataSize),\n        i = 0,\n        j,\n        n;\n    if (password) {\n      n = Math.min(32, password.length);\n      for (; i < n; ++i) {\n        hashData[i] = password[i];\n      }\n    }\n    j = 0;\n    while (i < 32) {\n      hashData[i++] = defaultPasswordBytes[j++];\n    }\n    for (j = 0, n = ownerPassword.length; j < n; ++j) {\n      hashData[i++] = ownerPassword[j];\n    }\n    hashData[i++] = flags & 0xFF;\n    hashData[i++] = flags >> 8 & 0xFF;\n    hashData[i++] = flags >> 16 & 0xFF;\n    hashData[i++] = flags >>> 24 & 0xFF;\n    for (j = 0, n = fileId.length; j < n; ++j) {\n      hashData[i++] = fileId[j];\n    }\n    if (revision >= 4 && !encryptMetadata) {\n      hashData[i++] = 0xFF;\n      hashData[i++] = 0xFF;\n      hashData[i++] = 0xFF;\n      hashData[i++] = 0xFF;\n    }\n    var hash = calculateMD5(hashData, 0, i);\n    var keyLengthInBytes = keyLength >> 3;\n    if (revision >= 3) {\n      for (j = 0; j < 50; ++j) {\n        hash = calculateMD5(hash, 0, keyLengthInBytes);\n      }\n    }\n    var encryptionKey = hash.subarray(0, keyLengthInBytes);\n    var cipher, checkData;\n    if (revision >= 3) {\n      for (i = 0; i < 32; ++i) {\n        hashData[i] = defaultPasswordBytes[i];\n      }\n      for (j = 0, n = fileId.length; j < n; ++j) {\n        hashData[i++] = fileId[j];\n      }\n      cipher = new ARCFourCipher(encryptionKey);\n      checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));\n      n = encryptionKey.length;\n      var derivedKey = new Uint8Array(n),\n          k;\n      for (j = 1; j <= 19; ++j) {\n        for (k = 0; k < n; ++k) {\n          derivedKey[k] = encryptionKey[k] ^ j;\n        }\n        cipher = new ARCFourCipher(derivedKey);\n        checkData = cipher.encryptBlock(checkData);\n      }\n      for (j = 0, n = checkData.length; j < n; ++j) {\n        if (userPassword[j] !== checkData[j]) {\n          return null;\n        }\n      }\n    } else {\n      cipher = new ARCFourCipher(encryptionKey);\n      checkData = cipher.encryptBlock(defaultPasswordBytes);\n      for (j = 0, n = checkData.length; j < n; ++j) {\n        if (userPassword[j] !== checkData[j]) {\n          return null;\n        }\n      }\n    }\n    return encryptionKey;\n  }\n  function decodeUserPassword(password, ownerPassword, revision, keyLength) {\n    var hashData = new Uint8Array(32),\n        i = 0,\n        j,\n        n;\n    n = Math.min(32, password.length);\n    for (; i < n; ++i) {\n      hashData[i] = password[i];\n    }\n    j = 0;\n    while (i < 32) {\n      hashData[i++] = defaultPasswordBytes[j++];\n    }\n    var hash = calculateMD5(hashData, 0, i);\n    var keyLengthInBytes = keyLength >> 3;\n    if (revision >= 3) {\n      for (j = 0; j < 50; ++j) {\n        hash = calculateMD5(hash, 0, hash.length);\n      }\n    }\n    var cipher, userPassword;\n    if (revision >= 3) {\n      userPassword = ownerPassword;\n      var derivedKey = new Uint8Array(keyLengthInBytes),\n          k;\n      for (j = 19; j >= 0; j--) {\n        for (k = 0; k < keyLengthInBytes; ++k) {\n          derivedKey[k] = hash[k] ^ j;\n        }\n        cipher = new ARCFourCipher(derivedKey);\n        userPassword = cipher.encryptBlock(userPassword);\n      }\n    } else {\n      cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes));\n      userPassword = cipher.encryptBlock(ownerPassword);\n    }\n    return userPassword;\n  }\n  var identityName = _primitives.Name.get('Identity');\n  function CipherTransformFactory(dict, fileId, password) {\n    var filter = dict.get('Filter');\n    if (!(0, _primitives.isName)(filter, 'Standard')) {\n      throw new _util.FormatError('unknown encryption method');\n    }\n    this.dict = dict;\n    var algorithm = dict.get('V');\n    if (!(0, _util.isInt)(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5) {\n      throw new _util.FormatError('unsupported encryption algorithm');\n    }\n    this.algorithm = algorithm;\n    var keyLength = dict.get('Length');\n    if (!keyLength) {\n      if (algorithm <= 3) {\n        keyLength = 40;\n      } else {\n        var cfDict = dict.get('CF');\n        var streamCryptoName = dict.get('StmF');\n        if ((0, _primitives.isDict)(cfDict) && (0, _primitives.isName)(streamCryptoName)) {\n          cfDict.suppressEncryption = true;\n          var handlerDict = cfDict.get(streamCryptoName.name);\n          keyLength = handlerDict && handlerDict.get('Length') || 128;\n          if (keyLength < 40) {\n            keyLength <<= 3;\n          }\n        }\n      }\n    }\n    if (!(0, _util.isInt)(keyLength) || keyLength < 40 || keyLength % 8 !== 0) {\n      throw new _util.FormatError('invalid key length');\n    }\n    var ownerPassword = (0, _util.stringToBytes)(dict.get('O')).subarray(0, 32);\n    var userPassword = (0, _util.stringToBytes)(dict.get('U')).subarray(0, 32);\n    var flags = dict.get('P');\n    var revision = dict.get('R');\n    var encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get('EncryptMetadata') !== false;\n    this.encryptMetadata = encryptMetadata;\n    var fileIdBytes = (0, _util.stringToBytes)(fileId);\n    var passwordBytes;\n    if (password) {\n      if (revision === 6) {\n        try {\n          password = (0, _util.utf8StringToString)(password);\n        } catch (ex) {\n          (0, _util.warn)('CipherTransformFactory: ' + 'Unable to convert UTF8 encoded password.');\n        }\n      }\n      passwordBytes = (0, _util.stringToBytes)(password);\n    }\n    var encryptionKey;\n    if (algorithm !== 5) {\n      encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata);\n    } else {\n      var ownerValidationSalt = (0, _util.stringToBytes)(dict.get('O')).subarray(32, 40);\n      var ownerKeySalt = (0, _util.stringToBytes)(dict.get('O')).subarray(40, 48);\n      var uBytes = (0, _util.stringToBytes)(dict.get('U')).subarray(0, 48);\n      var userValidationSalt = (0, _util.stringToBytes)(dict.get('U')).subarray(32, 40);\n      var userKeySalt = (0, _util.stringToBytes)(dict.get('U')).subarray(40, 48);\n      var ownerEncryption = (0, _util.stringToBytes)(dict.get('OE'));\n      var userEncryption = (0, _util.stringToBytes)(dict.get('UE'));\n      var perms = (0, _util.stringToBytes)(dict.get('Perms'));\n      encryptionKey = createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms);\n    }\n    if (!encryptionKey && !password) {\n      throw new _util.PasswordException('No password given', _util.PasswordResponses.NEED_PASSWORD);\n    } else if (!encryptionKey && password) {\n      var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength);\n      encryptionKey = prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata);\n    }\n    if (!encryptionKey) {\n      throw new _util.PasswordException('Incorrect Password', _util.PasswordResponses.INCORRECT_PASSWORD);\n    }\n    this.encryptionKey = encryptionKey;\n    if (algorithm >= 4) {\n      var cf = dict.get('CF');\n      if ((0, _primitives.isDict)(cf)) {\n        cf.suppressEncryption = true;\n      }\n      this.cf = cf;\n      this.stmf = dict.get('StmF') || identityName;\n      this.strf = dict.get('StrF') || identityName;\n      this.eff = dict.get('EFF') || this.stmf;\n    }\n  }\n  function buildObjectKey(num, gen, encryptionKey, isAes) {\n    var key = new Uint8Array(encryptionKey.length + 9),\n        i,\n        n;\n    for (i = 0, n = encryptionKey.length; i < n; ++i) {\n      key[i] = encryptionKey[i];\n    }\n    key[i++] = num & 0xFF;\n    key[i++] = num >> 8 & 0xFF;\n    key[i++] = num >> 16 & 0xFF;\n    key[i++] = gen & 0xFF;\n    key[i++] = gen >> 8 & 0xFF;\n    if (isAes) {\n      key[i++] = 0x73;\n      key[i++] = 0x41;\n      key[i++] = 0x6C;\n      key[i++] = 0x54;\n    }\n    var hash = calculateMD5(key, 0, i);\n    return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));\n  }\n  function buildCipherConstructor(cf, name, num, gen, key) {\n    if (!(0, _primitives.isName)(name)) {\n      throw new _util.FormatError('Invalid crypt filter name.');\n    }\n    var cryptFilter = cf.get(name.name);\n    var cfm;\n    if (cryptFilter !== null && cryptFilter !== undefined) {\n      cfm = cryptFilter.get('CFM');\n    }\n    if (!cfm || cfm.name === 'None') {\n      return function cipherTransformFactoryBuildCipherConstructorNone() {\n        return new NullCipher();\n      };\n    }\n    if (cfm.name === 'V2') {\n      return function cipherTransformFactoryBuildCipherConstructorV2() {\n        return new ARCFourCipher(buildObjectKey(num, gen, key, false));\n      };\n    }\n    if (cfm.name === 'AESV2') {\n      return function cipherTransformFactoryBuildCipherConstructorAESV2() {\n        return new AES128Cipher(buildObjectKey(num, gen, key, true));\n      };\n    }\n    if (cfm.name === 'AESV3') {\n      return function cipherTransformFactoryBuildCipherConstructorAESV3() {\n        return new AES256Cipher(key);\n      };\n    }\n    throw new _util.FormatError('Unknown crypto method');\n  }\n  CipherTransformFactory.prototype = {\n    createCipherTransform: function CipherTransformFactory_createCipherTransform(num, gen) {\n      if (this.algorithm === 4 || this.algorithm === 5) {\n        return new CipherTransform(buildCipherConstructor(this.cf, this.stmf, num, gen, this.encryptionKey), buildCipherConstructor(this.cf, this.strf, num, gen, this.encryptionKey));\n      }\n      var key = buildObjectKey(num, gen, this.encryptionKey, false);\n      var cipherConstructor = function buildCipherCipherConstructor() {\n        return new ARCFourCipher(key);\n      };\n      return new CipherTransform(cipherConstructor, cipherConstructor);\n    }\n  };\n  return CipherTransformFactory;\n}();\nexports.AES128Cipher = AES128Cipher;\nexports.AES256Cipher = AES256Cipher;\nexports.ARCFourCipher = ARCFourCipher;\nexports.CipherTransformFactory = CipherTransformFactory;\nexports.PDF17 = PDF17;\nexports.PDF20 = PDF20;\nexports.calculateMD5 = calculateMD5;\nexports.calculateSHA256 = calculateSHA256;\nexports.calculateSHA384 = calculateSHA384;\nexports.calculateSHA512 = calculateSHA512;\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PartialEvaluator = exports.OperatorList = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _cmap = __w_pdfjs_require__(22);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _fonts = __w_pdfjs_require__(25);\n\nvar _encodings = __w_pdfjs_require__(4);\n\nvar _unicode = __w_pdfjs_require__(8);\n\nvar _standard_fonts = __w_pdfjs_require__(16);\n\nvar _pattern = __w_pdfjs_require__(31);\n\nvar _function = __w_pdfjs_require__(7);\n\nvar _parser = __w_pdfjs_require__(5);\n\nvar _bidi = __w_pdfjs_require__(20);\n\nvar _colorspace = __w_pdfjs_require__(3);\n\nvar _glyphlist = __w_pdfjs_require__(6);\n\nvar _metrics = __w_pdfjs_require__(29);\n\nvar _murmurhash = __w_pdfjs_require__(30);\n\nvar _image = __w_pdfjs_require__(26);\n\nvar PartialEvaluator = function PartialEvaluatorClosure() {\n  var DefaultPartialEvaluatorOptions = {\n    forceDataSchema: false,\n    maxImageSize: -1,\n    disableFontFace: false,\n    nativeImageDecoderSupport: _util.NativeImageDecoding.DECODE,\n    ignoreErrors: false\n  };\n  function NativeImageDecoder(xref, resources, handler, forceDataSchema) {\n    this.xref = xref;\n    this.resources = resources;\n    this.handler = handler;\n    this.forceDataSchema = forceDataSchema;\n  }\n  NativeImageDecoder.prototype = {\n    canDecode: function canDecode(image) {\n      return image instanceof _stream.JpegStream && NativeImageDecoder.isDecodable(image, this.xref, this.resources);\n    },\n    decode: function decode(image) {\n      var dict = image.dict;\n      var colorSpace = dict.get('ColorSpace', 'CS');\n      colorSpace = _colorspace.ColorSpace.parse(colorSpace, this.xref, this.resources);\n      var numComps = colorSpace.numComps;\n      var decodePromise = this.handler.sendWithPromise('JpegDecode', [image.getIR(this.forceDataSchema), numComps]);\n      return decodePromise.then(function (message) {\n        var data = message.data;\n        return new _stream.Stream(data, 0, data.length, image.dict);\n      });\n    }\n  };\n  NativeImageDecoder.isSupported = function NativeImageDecoder_isSupported(image, xref, res) {\n    var dict = image.dict;\n    if (dict.has('DecodeParms') || dict.has('DP')) {\n      return false;\n    }\n    var cs = _colorspace.ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res);\n    return (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') && cs.isDefaultDecode(dict.getArray('Decode', 'D'));\n  };\n  NativeImageDecoder.isDecodable = function NativeImageDecoder_isDecodable(image, xref, res) {\n    var dict = image.dict;\n    if (dict.has('DecodeParms') || dict.has('DP')) {\n      return false;\n    }\n    var cs = _colorspace.ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res);\n    return (cs.numComps === 1 || cs.numComps === 3) && cs.isDefaultDecode(dict.getArray('Decode', 'D'));\n  };\n  function PartialEvaluator(_ref) {\n    var _this = this;\n\n    var pdfManager = _ref.pdfManager,\n        xref = _ref.xref,\n        handler = _ref.handler,\n        pageIndex = _ref.pageIndex,\n        idFactory = _ref.idFactory,\n        fontCache = _ref.fontCache,\n        builtInCMapCache = _ref.builtInCMapCache,\n        _ref$options = _ref.options,\n        options = _ref$options === undefined ? null : _ref$options;\n\n    this.pdfManager = pdfManager;\n    this.xref = xref;\n    this.handler = handler;\n    this.pageIndex = pageIndex;\n    this.idFactory = idFactory;\n    this.fontCache = fontCache;\n    this.builtInCMapCache = builtInCMapCache;\n    this.options = options || DefaultPartialEvaluatorOptions;\n    this.fetchBuiltInCMap = function (name) {\n      var cachedCMap = _this.builtInCMapCache[name];\n      if (cachedCMap) {\n        return Promise.resolve(cachedCMap);\n      }\n      return _this.handler.sendWithPromise('FetchBuiltInCMap', { name: name }).then(function (data) {\n        if (data.compressionType !== _util.CMapCompressionType.NONE) {\n          _this.builtInCMapCache[name] = data;\n        }\n        return data;\n      });\n    };\n  }\n  var TIME_SLOT_DURATION_MS = 20;\n  var CHECK_TIME_EVERY = 100;\n  function TimeSlotManager() {\n    this.reset();\n  }\n  TimeSlotManager.prototype = {\n    check: function TimeSlotManager_check() {\n      if (++this.checked < CHECK_TIME_EVERY) {\n        return false;\n      }\n      this.checked = 0;\n      return this.endTime <= Date.now();\n    },\n    reset: function TimeSlotManager_reset() {\n      this.endTime = Date.now() + TIME_SLOT_DURATION_MS;\n      this.checked = 0;\n    }\n  };\n  function normalizeBlendMode(value) {\n    if (!(0, _primitives.isName)(value)) {\n      return 'source-over';\n    }\n    switch (value.name) {\n      case 'Normal':\n      case 'Compatible':\n        return 'source-over';\n      case 'Multiply':\n        return 'multiply';\n      case 'Screen':\n        return 'screen';\n      case 'Overlay':\n        return 'overlay';\n      case 'Darken':\n        return 'darken';\n      case 'Lighten':\n        return 'lighten';\n      case 'ColorDodge':\n        return 'color-dodge';\n      case 'ColorBurn':\n        return 'color-burn';\n      case 'HardLight':\n        return 'hard-light';\n      case 'SoftLight':\n        return 'soft-light';\n      case 'Difference':\n        return 'difference';\n      case 'Exclusion':\n        return 'exclusion';\n      case 'Hue':\n        return 'hue';\n      case 'Saturation':\n        return 'saturation';\n      case 'Color':\n        return 'color';\n      case 'Luminosity':\n        return 'luminosity';\n    }\n    (0, _util.warn)('Unsupported blend mode: ' + value.name);\n    return 'source-over';\n  }\n  var deferred = Promise.resolve();\n  var TILING_PATTERN = 1,\n      SHADING_PATTERN = 2;\n  PartialEvaluator.prototype = {\n    clone: function clone() {\n      var newOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DefaultPartialEvaluatorOptions;\n\n      var newEvaluator = Object.create(this);\n      newEvaluator.options = newOptions;\n      return newEvaluator;\n    },\n\n    hasBlendModes: function PartialEvaluator_hasBlendModes(resources) {\n      if (!(0, _primitives.isDict)(resources)) {\n        return false;\n      }\n      var processed = Object.create(null);\n      if (resources.objId) {\n        processed[resources.objId] = true;\n      }\n      var nodes = [resources],\n          xref = this.xref;\n      while (nodes.length) {\n        var key, i, ii;\n        var node = nodes.shift();\n        var graphicStates = node.get('ExtGState');\n        if ((0, _primitives.isDict)(graphicStates)) {\n          var graphicStatesKeys = graphicStates.getKeys();\n          for (i = 0, ii = graphicStatesKeys.length; i < ii; i++) {\n            key = graphicStatesKeys[i];\n            var graphicState = graphicStates.get(key);\n            var bm = graphicState.get('BM');\n            if ((0, _primitives.isName)(bm) && bm.name !== 'Normal') {\n              return true;\n            }\n          }\n        }\n        var xObjects = node.get('XObject');\n        if (!(0, _primitives.isDict)(xObjects)) {\n          continue;\n        }\n        var xObjectsKeys = xObjects.getKeys();\n        for (i = 0, ii = xObjectsKeys.length; i < ii; i++) {\n          key = xObjectsKeys[i];\n          var xObject = xObjects.getRaw(key);\n          if ((0, _primitives.isRef)(xObject)) {\n            if (processed[xObject.toString()]) {\n              continue;\n            }\n            xObject = xref.fetch(xObject);\n          }\n          if (!(0, _primitives.isStream)(xObject)) {\n            continue;\n          }\n          if (xObject.dict.objId) {\n            if (processed[xObject.dict.objId]) {\n              continue;\n            }\n            processed[xObject.dict.objId] = true;\n          }\n          var xResources = xObject.dict.get('Resources');\n          if ((0, _primitives.isDict)(xResources) && (!xResources.objId || !processed[xResources.objId])) {\n            nodes.push(xResources);\n            if (xResources.objId) {\n              processed[xResources.objId] = true;\n            }\n          }\n        }\n      }\n      return false;\n    },\n    buildFormXObject: function PartialEvaluator_buildFormXObject(resources, xobj, smask, operatorList, task, initialState) {\n      var dict = xobj.dict;\n      var matrix = dict.getArray('Matrix');\n      var bbox = dict.getArray('BBox');\n      var group = dict.get('Group');\n      if (group) {\n        var groupOptions = {\n          matrix: matrix,\n          bbox: bbox,\n          smask: smask,\n          isolated: false,\n          knockout: false\n        };\n        var groupSubtype = group.get('S');\n        var colorSpace;\n        if ((0, _primitives.isName)(groupSubtype, 'Transparency')) {\n          groupOptions.isolated = group.get('I') || false;\n          groupOptions.knockout = group.get('K') || false;\n          colorSpace = group.has('CS') ? _colorspace.ColorSpace.parse(group.get('CS'), this.xref, resources) : null;\n        }\n        if (smask && smask.backdrop) {\n          colorSpace = colorSpace || _colorspace.ColorSpace.singletons.rgb;\n          smask.backdrop = colorSpace.getRgb(smask.backdrop, 0);\n        }\n        operatorList.addOp(_util.OPS.beginGroup, [groupOptions]);\n      }\n      operatorList.addOp(_util.OPS.paintFormXObjectBegin, [matrix, bbox]);\n      return this.getOperatorList({\n        stream: xobj,\n        task: task,\n        resources: dict.get('Resources') || resources,\n        operatorList: operatorList,\n        initialState: initialState\n      }).then(function () {\n        operatorList.addOp(_util.OPS.paintFormXObjectEnd, []);\n        if (group) {\n          operatorList.addOp(_util.OPS.endGroup, [groupOptions]);\n        }\n      });\n    },\n    buildPaintImageXObject: function PartialEvaluator_buildPaintImageXObject(resources, image, inline, operatorList, cacheKey, imageCache) {\n      var _this2 = this;\n\n      var dict = image.dict;\n      var w = dict.get('Width', 'W');\n      var h = dict.get('Height', 'H');\n      if (!(w && (0, _util.isNum)(w)) || !(h && (0, _util.isNum)(h))) {\n        (0, _util.warn)('Image dimensions are missing, or not numbers.');\n        return;\n      }\n      var maxImageSize = this.options.maxImageSize;\n      if (maxImageSize !== -1 && w * h > maxImageSize) {\n        (0, _util.warn)('Image exceeded maximum allowed size and was removed.');\n        return;\n      }\n      var imageMask = dict.get('ImageMask', 'IM') || false;\n      var imgData, args;\n      if (imageMask) {\n        var width = dict.get('Width', 'W');\n        var height = dict.get('Height', 'H');\n        var bitStrideLength = width + 7 >> 3;\n        var imgArray = image.getBytes(bitStrideLength * height);\n        var decode = dict.getArray('Decode', 'D');\n        var inverseDecode = !!decode && decode[0] > 0;\n        imgData = _image.PDFImage.createMask(imgArray, width, height, image instanceof _stream.DecodeStream, inverseDecode);\n        imgData.cached = true;\n        args = [imgData];\n        operatorList.addOp(_util.OPS.paintImageMaskXObject, args);\n        if (cacheKey) {\n          imageCache[cacheKey] = {\n            fn: _util.OPS.paintImageMaskXObject,\n            args: args\n          };\n        }\n        return;\n      }\n      var softMask = dict.get('SMask', 'SM') || false;\n      var mask = dict.get('Mask') || false;\n      var SMALL_IMAGE_DIMENSIONS = 200;\n      if (inline && !softMask && !mask && !(image instanceof _stream.JpegStream) && w + h < SMALL_IMAGE_DIMENSIONS) {\n        var imageObj = new _image.PDFImage(this.xref, resources, image, inline, null, null);\n        imgData = imageObj.createImageData(true);\n        operatorList.addOp(_util.OPS.paintInlineImageXObject, [imgData]);\n        return;\n      }\n      var nativeImageDecoderSupport = this.options.nativeImageDecoderSupport;\n      var objId = 'img_' + this.idFactory.createObjId();\n      operatorList.addDependency(objId);\n      args = [objId, w, h];\n      if (nativeImageDecoderSupport !== _util.NativeImageDecoding.NONE && !softMask && !mask && image instanceof _stream.JpegStream && NativeImageDecoder.isSupported(image, this.xref, resources)) {\n        operatorList.addOp(_util.OPS.paintJpegXObject, args);\n        this.handler.send('obj', [objId, this.pageIndex, 'JpegStream', image.getIR(this.options.forceDataSchema)]);\n        if (cacheKey) {\n          imageCache[cacheKey] = {\n            fn: _util.OPS.paintJpegXObject,\n            args: args\n          };\n        }\n        return;\n      }\n      var nativeImageDecoder = null;\n      if (nativeImageDecoderSupport === _util.NativeImageDecoding.DECODE && (image instanceof _stream.JpegStream || mask instanceof _stream.JpegStream || softMask instanceof _stream.JpegStream)) {\n        nativeImageDecoder = new NativeImageDecoder(this.xref, resources, this.handler, this.options.forceDataSchema);\n      }\n      _image.PDFImage.buildImage(this.handler, this.xref, resources, image, inline, nativeImageDecoder).then(function (imageObj) {\n        var imgData = imageObj.createImageData(false);\n        _this2.handler.send('obj', [objId, _this2.pageIndex, 'Image', imgData], [imgData.data.buffer]);\n      }).catch(function (reason) {\n        (0, _util.warn)('Unable to decode image: ' + reason);\n        _this2.handler.send('obj', [objId, _this2.pageIndex, 'Image', null]);\n      });\n      operatorList.addOp(_util.OPS.paintImageXObject, args);\n      if (cacheKey) {\n        imageCache[cacheKey] = {\n          fn: _util.OPS.paintImageXObject,\n          args: args\n        };\n      }\n    },\n    handleSMask: function PartialEvaluator_handleSmask(smask, resources, operatorList, task, stateManager) {\n      var smaskContent = smask.get('G');\n      var smaskOptions = {\n        subtype: smask.get('S').name,\n        backdrop: smask.get('BC')\n      };\n      var transferObj = smask.get('TR');\n      if ((0, _function.isPDFFunction)(transferObj)) {\n        var transferFn = _function.PDFFunction.parse(this.xref, transferObj);\n        var transferMap = new Uint8Array(256);\n        var tmp = new Float32Array(1);\n        for (var i = 0; i < 256; i++) {\n          tmp[0] = i / 255;\n          transferFn(tmp, 0, tmp, 0);\n          transferMap[i] = tmp[0] * 255 | 0;\n        }\n        smaskOptions.transferMap = transferMap;\n      }\n      return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, stateManager.state.clone());\n    },\n    handleTilingType: function handleTilingType(fn, args, resources, pattern, patternDict, operatorList, task) {\n      var _this3 = this;\n\n      var tilingOpList = new OperatorList();\n      var resourcesArray = [patternDict.get('Resources'), resources];\n      var patternResources = _primitives.Dict.merge(this.xref, resourcesArray);\n      return this.getOperatorList({\n        stream: pattern,\n        task: task,\n        resources: patternResources,\n        operatorList: tilingOpList\n      }).then(function () {\n        return (0, _pattern.getTilingPatternIR)({\n          fnArray: tilingOpList.fnArray,\n          argsArray: tilingOpList.argsArray\n        }, patternDict, args);\n      }).then(function (tilingPatternIR) {\n        operatorList.addDependencies(tilingOpList.dependencies);\n        operatorList.addOp(fn, tilingPatternIR);\n      }, function (reason) {\n        if (_this3.options.ignoreErrors) {\n          _this3.handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.unknown });\n          (0, _util.warn)('handleTilingType - ignoring pattern: \"' + reason + '\".');\n          return;\n        }\n        throw reason;\n      });\n    },\n\n    handleSetFont: function PartialEvaluator_handleSetFont(resources, fontArgs, fontRef, operatorList, task, state) {\n      var _this4 = this;\n\n      var fontName;\n      if (fontArgs) {\n        fontArgs = fontArgs.slice();\n        fontName = fontArgs[0].name;\n      }\n      return this.loadFont(fontName, fontRef, resources).then(function (translated) {\n        if (!translated.font.isType3Font) {\n          return translated;\n        }\n        return translated.loadType3Data(_this4, resources, operatorList, task).then(function () {\n          return translated;\n        }).catch(function (reason) {\n          _this4.handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.font });\n          return new TranslatedFont('g_font_error', new _fonts.ErrorFont('Type3 font load error: ' + reason), translated.font);\n        });\n      }).then(function (translated) {\n        state.font = translated.font;\n        translated.send(_this4.handler);\n        return translated.loadedName;\n      });\n    },\n    handleText: function PartialEvaluator_handleText(chars, state) {\n      var _this5 = this;\n\n      var font = state.font;\n      var glyphs = font.charsToGlyphs(chars);\n      var isAddToPathSet = !!(state.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG);\n      if (font.data && (isAddToPathSet || this.options.disableFontFace)) {\n        var buildPath = function buildPath(fontChar) {\n          if (!font.renderer.hasBuiltPath(fontChar)) {\n            var path = font.renderer.getPathJs(fontChar);\n            _this5.handler.send('commonobj', [font.loadedName + '_path_' + fontChar, 'FontPath', path]);\n          }\n        };\n        for (var i = 0, ii = glyphs.length; i < ii; i++) {\n          var glyph = glyphs[i];\n          buildPath(glyph.fontChar);\n          var accent = glyph.accent;\n          if (accent && accent.fontChar) {\n            buildPath(accent.fontChar);\n          }\n        }\n      }\n      return glyphs;\n    },\n    setGState: function PartialEvaluator_setGState(resources, gState, operatorList, task, stateManager) {\n      var _this6 = this;\n\n      var gStateObj = [];\n      var gStateKeys = gState.getKeys();\n      var promise = Promise.resolve();\n\n      var _loop = function _loop() {\n        var key = gStateKeys[i];\n        var value = gState.get(key);\n        switch (key) {\n          case 'Type':\n            break;\n          case 'LW':\n          case 'LC':\n          case 'LJ':\n          case 'ML':\n          case 'D':\n          case 'RI':\n          case 'FL':\n          case 'CA':\n          case 'ca':\n            gStateObj.push([key, value]);\n            break;\n          case 'Font':\n            promise = promise.then(function () {\n              return _this6.handleSetFont(resources, null, value[0], operatorList, task, stateManager.state).then(function (loadedName) {\n                operatorList.addDependency(loadedName);\n                gStateObj.push([key, [loadedName, value[1]]]);\n              });\n            });\n            break;\n          case 'BM':\n            gStateObj.push([key, normalizeBlendMode(value)]);\n            break;\n          case 'SMask':\n            if ((0, _primitives.isName)(value, 'None')) {\n              gStateObj.push([key, false]);\n              break;\n            }\n            if ((0, _primitives.isDict)(value)) {\n              promise = promise.then(function () {\n                return _this6.handleSMask(value, resources, operatorList, task, stateManager);\n              });\n              gStateObj.push([key, true]);\n            } else {\n              (0, _util.warn)('Unsupported SMask type');\n            }\n            break;\n          case 'OP':\n          case 'op':\n          case 'OPM':\n          case 'BG':\n          case 'BG2':\n          case 'UCR':\n          case 'UCR2':\n          case 'TR':\n          case 'TR2':\n          case 'HT':\n          case 'SM':\n          case 'SA':\n          case 'AIS':\n          case 'TK':\n            (0, _util.info)('graphic state operator ' + key);\n            break;\n          default:\n            (0, _util.info)('Unknown graphic state operator ' + key);\n            break;\n        }\n      };\n\n      for (var i = 0, ii = gStateKeys.length; i < ii; i++) {\n        _loop();\n      }\n      return promise.then(function () {\n        if (gStateObj.length > 0) {\n          operatorList.addOp(_util.OPS.setGState, [gStateObj]);\n        }\n      });\n    },\n    loadFont: function PartialEvaluator_loadFont(fontName, font, resources) {\n      var _this7 = this;\n\n      function errorFont() {\n        return Promise.resolve(new TranslatedFont('g_font_error', new _fonts.ErrorFont('Font ' + fontName + ' is not available'), font));\n      }\n      var fontRef,\n          xref = this.xref;\n      if (font) {\n        if (!(0, _primitives.isRef)(font)) {\n          throw new Error('The \"font\" object should be a reference.');\n        }\n        fontRef = font;\n      } else {\n        var fontRes = resources.get('Font');\n        if (fontRes) {\n          fontRef = fontRes.getRaw(fontName);\n        } else {\n          (0, _util.warn)('fontRes not available');\n          return errorFont();\n        }\n      }\n      if (!fontRef) {\n        (0, _util.warn)('fontRef not available');\n        return errorFont();\n      }\n      if (this.fontCache.has(fontRef)) {\n        return this.fontCache.get(fontRef);\n      }\n      font = xref.fetchIfRef(fontRef);\n      if (!(0, _primitives.isDict)(font)) {\n        return errorFont();\n      }\n      if (font.translated) {\n        return font.translated;\n      }\n      var fontCapability = (0, _util.createPromiseCapability)();\n      var preEvaluatedFont = this.preEvaluateFont(font);\n      var descriptor = preEvaluatedFont.descriptor;\n      var fontRefIsRef = (0, _primitives.isRef)(fontRef),\n          fontID;\n      if (fontRefIsRef) {\n        fontID = fontRef.toString();\n      }\n      if ((0, _primitives.isDict)(descriptor)) {\n        if (!descriptor.fontAliases) {\n          descriptor.fontAliases = Object.create(null);\n        }\n        var fontAliases = descriptor.fontAliases;\n        var hash = preEvaluatedFont.hash;\n        if (fontAliases[hash]) {\n          var aliasFontRef = fontAliases[hash].aliasRef;\n          if (fontRefIsRef && aliasFontRef && this.fontCache.has(aliasFontRef)) {\n            this.fontCache.putAlias(fontRef, aliasFontRef);\n            return this.fontCache.get(fontRef);\n          }\n        } else {\n          fontAliases[hash] = { fontID: _fonts.Font.getFontID() };\n        }\n        if (fontRefIsRef) {\n          fontAliases[hash].aliasRef = fontRef;\n        }\n        fontID = fontAliases[hash].fontID;\n      }\n      if (fontRefIsRef) {\n        this.fontCache.put(fontRef, fontCapability.promise);\n      } else {\n        if (!fontID) {\n          fontID = this.idFactory.createObjId();\n        }\n        this.fontCache.put('id_' + fontID, fontCapability.promise);\n      }\n      (0, _util.assert)(fontID, 'The \"fontID\" must be defined.');\n      font.loadedName = 'g_' + this.pdfManager.docId + '_f' + fontID;\n      font.translated = fontCapability.promise;\n      var translatedPromise;\n      try {\n        translatedPromise = this.translateFont(preEvaluatedFont);\n      } catch (e) {\n        translatedPromise = Promise.reject(e);\n      }\n      translatedPromise.then(function (translatedFont) {\n        if (translatedFont.fontType !== undefined) {\n          var xrefFontStats = xref.stats.fontTypes;\n          xrefFontStats[translatedFont.fontType] = true;\n        }\n        fontCapability.resolve(new TranslatedFont(font.loadedName, translatedFont, font));\n      }).catch(function (reason) {\n        _this7.handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.font });\n        try {\n          var descriptor = preEvaluatedFont.descriptor;\n          var fontFile3 = descriptor && descriptor.get('FontFile3');\n          var subtype = fontFile3 && fontFile3.get('Subtype');\n          var fontType = (0, _fonts.getFontType)(preEvaluatedFont.type, subtype && subtype.name);\n          var xrefFontStats = xref.stats.fontTypes;\n          xrefFontStats[fontType] = true;\n        } catch (ex) {}\n        fontCapability.resolve(new TranslatedFont(font.loadedName, new _fonts.ErrorFont(reason instanceof Error ? reason.message : reason), font));\n      });\n      return fontCapability.promise;\n    },\n    buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) {\n      var lastIndex = operatorList.length - 1;\n      if (!args) {\n        args = [];\n      }\n      if (lastIndex < 0 || operatorList.fnArray[lastIndex] !== _util.OPS.constructPath) {\n        operatorList.addOp(_util.OPS.constructPath, [[fn], args]);\n      } else {\n        var opArgs = operatorList.argsArray[lastIndex];\n        opArgs[0].push(fn);\n        Array.prototype.push.apply(opArgs[1], args);\n      }\n    },\n    handleColorN: function PartialEvaluator_handleColorN(operatorList, fn, args, cs, patterns, resources, task) {\n      var patternName = args[args.length - 1];\n      var pattern;\n      if ((0, _primitives.isName)(patternName) && (pattern = patterns.get(patternName.name))) {\n        var dict = (0, _primitives.isStream)(pattern) ? pattern.dict : pattern;\n        var typeNum = dict.get('PatternType');\n        if (typeNum === TILING_PATTERN) {\n          var color = cs.base ? cs.base.getRgb(args, 0) : null;\n          return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task);\n        } else if (typeNum === SHADING_PATTERN) {\n          var shading = dict.get('Shading');\n          var matrix = dict.getArray('Matrix');\n          pattern = _pattern.Pattern.parseShading(shading, matrix, this.xref, resources, this.handler);\n          operatorList.addOp(fn, pattern.getIR());\n          return Promise.resolve();\n        }\n        return Promise.reject(new Error('Unknown PatternType: ' + typeNum));\n      }\n      operatorList.addOp(fn, args);\n      return Promise.resolve();\n    },\n    getOperatorList: function getOperatorList(_ref2) {\n      var _this8 = this;\n\n      var stream = _ref2.stream,\n          task = _ref2.task,\n          resources = _ref2.resources,\n          operatorList = _ref2.operatorList,\n          _ref2$initialState = _ref2.initialState,\n          initialState = _ref2$initialState === undefined ? null : _ref2$initialState;\n\n      resources = resources || _primitives.Dict.empty;\n      initialState = initialState || new EvalState();\n      if (!operatorList) {\n        throw new Error('getOperatorList: missing \"operatorList\" parameter');\n      }\n      var self = this;\n      var xref = this.xref;\n      var imageCache = Object.create(null);\n      var xobjs = resources.get('XObject') || _primitives.Dict.empty;\n      var patterns = resources.get('Pattern') || _primitives.Dict.empty;\n      var stateManager = new StateManager(initialState);\n      var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);\n      var timeSlotManager = new TimeSlotManager();\n      function closePendingRestoreOPS(argument) {\n        for (var i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) {\n          operatorList.addOp(_util.OPS.restore, []);\n        }\n      }\n      return new Promise(function promiseBody(resolve, reject) {\n        var next = function next(promise) {\n          promise.then(function () {\n            try {\n              promiseBody(resolve, reject);\n            } catch (ex) {\n              reject(ex);\n            }\n          }, reject);\n        };\n        task.ensureNotTerminated();\n        timeSlotManager.reset();\n        var stop,\n            operation = {},\n            i,\n            ii,\n            cs;\n        while (!(stop = timeSlotManager.check())) {\n          operation.args = null;\n          if (!preprocessor.read(operation)) {\n            break;\n          }\n          var args = operation.args;\n          var fn = operation.fn;\n          switch (fn | 0) {\n            case _util.OPS.paintXObject:\n              var name = args[0].name;\n              if (!name) {\n                (0, _util.warn)('XObject must be referred to by name.');\n                continue;\n              }\n              if (imageCache[name] !== undefined) {\n                operatorList.addOp(imageCache[name].fn, imageCache[name].args);\n                args = null;\n                continue;\n              }\n              var xobj = xobjs.get(name);\n              if (xobj) {\n                if (!(0, _primitives.isStream)(xobj)) {\n                  throw new _util.FormatError('XObject should be a stream');\n                }\n                var type = xobj.dict.get('Subtype');\n                if (!(0, _primitives.isName)(type)) {\n                  throw new _util.FormatError('XObject should have a Name subtype');\n                }\n                if (type.name === 'Form') {\n                  stateManager.save();\n                  next(self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone()).then(function () {\n                    stateManager.restore();\n                  }));\n                  return;\n                } else if (type.name === 'Image') {\n                  self.buildPaintImageXObject(resources, xobj, false, operatorList, name, imageCache);\n                  args = null;\n                  continue;\n                } else if (type.name === 'PS') {\n                  (0, _util.info)('Ignored XObject subtype PS');\n                  continue;\n                } else {\n                  throw new _util.FormatError('Unhandled XObject subtype ' + type.name);\n                }\n              }\n              break;\n            case _util.OPS.setFont:\n              var fontSize = args[1];\n              next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state).then(function (loadedName) {\n                operatorList.addDependency(loadedName);\n                operatorList.addOp(_util.OPS.setFont, [loadedName, fontSize]);\n              }));\n              return;\n            case _util.OPS.endInlineImage:\n              var cacheKey = args[0].cacheKey;\n              if (cacheKey) {\n                var cacheEntry = imageCache[cacheKey];\n                if (cacheEntry !== undefined) {\n                  operatorList.addOp(cacheEntry.fn, cacheEntry.args);\n                  args = null;\n                  continue;\n                }\n              }\n              self.buildPaintImageXObject(resources, args[0], true, operatorList, cacheKey, imageCache);\n              args = null;\n              continue;\n            case _util.OPS.showText:\n              args[0] = self.handleText(args[0], stateManager.state);\n              break;\n            case _util.OPS.showSpacedText:\n              var arr = args[0];\n              var combinedGlyphs = [];\n              var arrLength = arr.length;\n              var state = stateManager.state;\n              for (i = 0; i < arrLength; ++i) {\n                var arrItem = arr[i];\n                if ((0, _util.isString)(arrItem)) {\n                  Array.prototype.push.apply(combinedGlyphs, self.handleText(arrItem, state));\n                } else if ((0, _util.isNum)(arrItem)) {\n                  combinedGlyphs.push(arrItem);\n                }\n              }\n              args[0] = combinedGlyphs;\n              fn = _util.OPS.showText;\n              break;\n            case _util.OPS.nextLineShowText:\n              operatorList.addOp(_util.OPS.nextLine);\n              args[0] = self.handleText(args[0], stateManager.state);\n              fn = _util.OPS.showText;\n              break;\n            case _util.OPS.nextLineSetSpacingShowText:\n              operatorList.addOp(_util.OPS.nextLine);\n              operatorList.addOp(_util.OPS.setWordSpacing, [args.shift()]);\n              operatorList.addOp(_util.OPS.setCharSpacing, [args.shift()]);\n              args[0] = self.handleText(args[0], stateManager.state);\n              fn = _util.OPS.showText;\n              break;\n            case _util.OPS.setTextRenderingMode:\n              stateManager.state.textRenderingMode = args[0];\n              break;\n            case _util.OPS.setFillColorSpace:\n              stateManager.state.fillColorSpace = _colorspace.ColorSpace.parse(args[0], xref, resources);\n              continue;\n            case _util.OPS.setStrokeColorSpace:\n              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.parse(args[0], xref, resources);\n              continue;\n            case _util.OPS.setFillColor:\n              cs = stateManager.state.fillColorSpace;\n              args = cs.getRgb(args, 0);\n              fn = _util.OPS.setFillRGBColor;\n              break;\n            case _util.OPS.setStrokeColor:\n              cs = stateManager.state.strokeColorSpace;\n              args = cs.getRgb(args, 0);\n              fn = _util.OPS.setStrokeRGBColor;\n              break;\n            case _util.OPS.setFillGray:\n              stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.gray;\n              args = _colorspace.ColorSpace.singletons.gray.getRgb(args, 0);\n              fn = _util.OPS.setFillRGBColor;\n              break;\n            case _util.OPS.setStrokeGray:\n              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.gray;\n              args = _colorspace.ColorSpace.singletons.gray.getRgb(args, 0);\n              fn = _util.OPS.setStrokeRGBColor;\n              break;\n            case _util.OPS.setFillCMYKColor:\n              stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.cmyk;\n              args = _colorspace.ColorSpace.singletons.cmyk.getRgb(args, 0);\n              fn = _util.OPS.setFillRGBColor;\n              break;\n            case _util.OPS.setStrokeCMYKColor:\n              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.cmyk;\n              args = _colorspace.ColorSpace.singletons.cmyk.getRgb(args, 0);\n              fn = _util.OPS.setStrokeRGBColor;\n              break;\n            case _util.OPS.setFillRGBColor:\n              stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.rgb;\n              args = _colorspace.ColorSpace.singletons.rgb.getRgb(args, 0);\n              break;\n            case _util.OPS.setStrokeRGBColor:\n              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.rgb;\n              args = _colorspace.ColorSpace.singletons.rgb.getRgb(args, 0);\n              break;\n            case _util.OPS.setFillColorN:\n              cs = stateManager.state.fillColorSpace;\n              if (cs.name === 'Pattern') {\n                next(self.handleColorN(operatorList, _util.OPS.setFillColorN, args, cs, patterns, resources, task));\n                return;\n              }\n              args = cs.getRgb(args, 0);\n              fn = _util.OPS.setFillRGBColor;\n              break;\n            case _util.OPS.setStrokeColorN:\n              cs = stateManager.state.strokeColorSpace;\n              if (cs.name === 'Pattern') {\n                next(self.handleColorN(operatorList, _util.OPS.setStrokeColorN, args, cs, patterns, resources, task));\n                return;\n              }\n              args = cs.getRgb(args, 0);\n              fn = _util.OPS.setStrokeRGBColor;\n              break;\n            case _util.OPS.shadingFill:\n              var shadingRes = resources.get('Shading');\n              if (!shadingRes) {\n                throw new _util.FormatError('No shading resource found');\n              }\n              var shading = shadingRes.get(args[0].name);\n              if (!shading) {\n                throw new _util.FormatError('No shading object found');\n              }\n              var shadingFill = _pattern.Pattern.parseShading(shading, null, xref, resources, self.handler);\n              var patternIR = shadingFill.getIR();\n              args = [patternIR];\n              fn = _util.OPS.shadingFill;\n              break;\n            case _util.OPS.setGState:\n              var dictName = args[0];\n              var extGState = resources.get('ExtGState');\n              if (!(0, _primitives.isDict)(extGState) || !extGState.has(dictName.name)) {\n                break;\n              }\n              var gState = extGState.get(dictName.name);\n              next(self.setGState(resources, gState, operatorList, task, stateManager));\n              return;\n            case _util.OPS.moveTo:\n            case _util.OPS.lineTo:\n            case _util.OPS.curveTo:\n            case _util.OPS.curveTo2:\n            case _util.OPS.curveTo3:\n            case _util.OPS.closePath:\n              self.buildPath(operatorList, fn, args);\n              continue;\n            case _util.OPS.rectangle:\n              self.buildPath(operatorList, fn, args);\n              continue;\n            case _util.OPS.markPoint:\n            case _util.OPS.markPointProps:\n            case _util.OPS.beginMarkedContent:\n            case _util.OPS.beginMarkedContentProps:\n            case _util.OPS.endMarkedContent:\n            case _util.OPS.beginCompat:\n            case _util.OPS.endCompat:\n              continue;\n            default:\n              if (args !== null) {\n                for (i = 0, ii = args.length; i < ii; i++) {\n                  if (args[i] instanceof _primitives.Dict) {\n                    break;\n                  }\n                }\n                if (i < ii) {\n                  (0, _util.warn)('getOperatorList - ignoring operator: ' + fn);\n                  continue;\n                }\n              }\n          }\n          operatorList.addOp(fn, args);\n        }\n        if (stop) {\n          next(deferred);\n          return;\n        }\n        closePendingRestoreOPS();\n        resolve();\n      }).catch(function (reason) {\n        if (_this8.options.ignoreErrors) {\n          _this8.handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.unknown });\n          (0, _util.warn)('getOperatorList - ignoring errors during task: ' + task.name);\n          closePendingRestoreOPS();\n          return;\n        }\n        throw reason;\n      });\n    },\n    getTextContent: function getTextContent(_ref3) {\n      var _this9 = this;\n\n      var stream = _ref3.stream,\n          task = _ref3.task,\n          resources = _ref3.resources,\n          _ref3$stateManager = _ref3.stateManager,\n          stateManager = _ref3$stateManager === undefined ? null : _ref3$stateManager,\n          _ref3$normalizeWhites = _ref3.normalizeWhitespace,\n          normalizeWhitespace = _ref3$normalizeWhites === undefined ? false : _ref3$normalizeWhites,\n          _ref3$combineTextItem = _ref3.combineTextItems,\n          combineTextItems = _ref3$combineTextItem === undefined ? false : _ref3$combineTextItem,\n          sink = _ref3.sink,\n          _ref3$seenStyles = _ref3.seenStyles,\n          seenStyles = _ref3$seenStyles === undefined ? Object.create(null) : _ref3$seenStyles;\n\n      resources = resources || _primitives.Dict.empty;\n      stateManager = stateManager || new StateManager(new TextState());\n      var WhitespaceRegexp = /\\s/g;\n      var textContent = {\n        items: [],\n        styles: Object.create(null)\n      };\n      var textContentItem = {\n        initialized: false,\n        str: [],\n        width: 0,\n        height: 0,\n        vertical: false,\n        lastAdvanceWidth: 0,\n        lastAdvanceHeight: 0,\n        textAdvanceScale: 0,\n        spaceWidth: 0,\n        fakeSpaceMin: Infinity,\n        fakeMultiSpaceMin: Infinity,\n        fakeMultiSpaceMax: -0,\n        textRunBreakAllowed: false,\n        transform: null,\n        fontName: null\n      };\n      var SPACE_FACTOR = 0.3;\n      var MULTI_SPACE_FACTOR = 1.5;\n      var MULTI_SPACE_FACTOR_MAX = 4;\n      var self = this;\n      var xref = this.xref;\n      var xobjs = null;\n      var skipEmptyXObjs = Object.create(null);\n      var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);\n      var textState;\n      function ensureTextContentItem() {\n        if (textContentItem.initialized) {\n          return textContentItem;\n        }\n        var font = textState.font;\n        if (!(font.loadedName in seenStyles)) {\n          seenStyles[font.loadedName] = true;\n          textContent.styles[font.loadedName] = {\n            fontFamily: font.fallbackName,\n            ascent: font.ascent,\n            descent: font.descent,\n            vertical: font.vertical\n          };\n        }\n        textContentItem.fontName = font.loadedName;\n        var tsm = [textState.fontSize * textState.textHScale, 0, 0, textState.fontSize, 0, textState.textRise];\n        if (font.isType3Font && textState.fontMatrix !== _util.FONT_IDENTITY_MATRIX && textState.fontSize === 1) {\n          var glyphHeight = font.bbox[3] - font.bbox[1];\n          if (glyphHeight > 0) {\n            glyphHeight = glyphHeight * textState.fontMatrix[3];\n            tsm[3] *= glyphHeight;\n          }\n        }\n        var trm = _util.Util.transform(textState.ctm, _util.Util.transform(textState.textMatrix, tsm));\n        textContentItem.transform = trm;\n        if (!font.vertical) {\n          textContentItem.width = 0;\n          textContentItem.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]);\n          textContentItem.vertical = false;\n        } else {\n          textContentItem.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]);\n          textContentItem.height = 0;\n          textContentItem.vertical = true;\n        }\n        var a = textState.textLineMatrix[0];\n        var b = textState.textLineMatrix[1];\n        var scaleLineX = Math.sqrt(a * a + b * b);\n        a = textState.ctm[0];\n        b = textState.ctm[1];\n        var scaleCtmX = Math.sqrt(a * a + b * b);\n        textContentItem.textAdvanceScale = scaleCtmX * scaleLineX;\n        textContentItem.lastAdvanceWidth = 0;\n        textContentItem.lastAdvanceHeight = 0;\n        var spaceWidth = font.spaceWidth / 1000 * textState.fontSize;\n        if (spaceWidth) {\n          textContentItem.spaceWidth = spaceWidth;\n          textContentItem.fakeSpaceMin = spaceWidth * SPACE_FACTOR;\n          textContentItem.fakeMultiSpaceMin = spaceWidth * MULTI_SPACE_FACTOR;\n          textContentItem.fakeMultiSpaceMax = spaceWidth * MULTI_SPACE_FACTOR_MAX;\n          textContentItem.textRunBreakAllowed = !font.isMonospace;\n        } else {\n          textContentItem.spaceWidth = 0;\n          textContentItem.fakeSpaceMin = Infinity;\n          textContentItem.fakeMultiSpaceMin = Infinity;\n          textContentItem.fakeMultiSpaceMax = 0;\n          textContentItem.textRunBreakAllowed = false;\n        }\n        textContentItem.initialized = true;\n        return textContentItem;\n      }\n      function replaceWhitespace(str) {\n        var i = 0,\n            ii = str.length,\n            code;\n        while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7F) {\n          i++;\n        }\n        return i < ii ? str.replace(WhitespaceRegexp, ' ') : str;\n      }\n      function runBidiTransform(textChunk) {\n        var str = textChunk.str.join('');\n        var bidiResult = (0, _bidi.bidi)(str, -1, textChunk.vertical);\n        return {\n          str: normalizeWhitespace ? replaceWhitespace(bidiResult.str) : bidiResult.str,\n          dir: bidiResult.dir,\n          width: textChunk.width,\n          height: textChunk.height,\n          transform: textChunk.transform,\n          fontName: textChunk.fontName\n        };\n      }\n      function handleSetFont(fontName, fontRef) {\n        return self.loadFont(fontName, fontRef, resources).then(function (translated) {\n          textState.font = translated.font;\n          textState.fontMatrix = translated.font.fontMatrix || _util.FONT_IDENTITY_MATRIX;\n        });\n      }\n      function buildTextContentItem(chars) {\n        var font = textState.font;\n        var textChunk = ensureTextContentItem();\n        var width = 0;\n        var height = 0;\n        var glyphs = font.charsToGlyphs(chars);\n        for (var i = 0; i < glyphs.length; i++) {\n          var glyph = glyphs[i];\n          var glyphWidth = null;\n          if (font.vertical && glyph.vmetric) {\n            glyphWidth = glyph.vmetric[0];\n          } else {\n            glyphWidth = glyph.width;\n          }\n          var glyphUnicode = glyph.unicode;\n          var NormalizedUnicodes = (0, _unicode.getNormalizedUnicodes)();\n          if (NormalizedUnicodes[glyphUnicode] !== undefined) {\n            glyphUnicode = NormalizedUnicodes[glyphUnicode];\n          }\n          glyphUnicode = (0, _unicode.reverseIfRtl)(glyphUnicode);\n          var charSpacing = textState.charSpacing;\n          if (glyph.isSpace) {\n            var wordSpacing = textState.wordSpacing;\n            charSpacing += wordSpacing;\n            if (wordSpacing > 0) {\n              addFakeSpaces(wordSpacing, textChunk.str);\n            }\n          }\n          var tx = 0;\n          var ty = 0;\n          if (!font.vertical) {\n            var w0 = glyphWidth * textState.fontMatrix[0];\n            tx = (w0 * textState.fontSize + charSpacing) * textState.textHScale;\n            width += tx;\n          } else {\n            var w1 = glyphWidth * textState.fontMatrix[0];\n            ty = w1 * textState.fontSize + charSpacing;\n            height += ty;\n          }\n          textState.translateTextMatrix(tx, ty);\n          textChunk.str.push(glyphUnicode);\n        }\n        if (!font.vertical) {\n          textChunk.lastAdvanceWidth = width;\n          textChunk.width += width;\n        } else {\n          textChunk.lastAdvanceHeight = height;\n          textChunk.height += Math.abs(height);\n        }\n        return textChunk;\n      }\n      function addFakeSpaces(width, strBuf) {\n        if (width < textContentItem.fakeSpaceMin) {\n          return;\n        }\n        if (width < textContentItem.fakeMultiSpaceMin) {\n          strBuf.push(' ');\n          return;\n        }\n        var fakeSpaces = Math.round(width / textContentItem.spaceWidth);\n        while (fakeSpaces-- > 0) {\n          strBuf.push(' ');\n        }\n      }\n      function flushTextContentItem() {\n        if (!textContentItem.initialized) {\n          return;\n        }\n        textContentItem.width *= textContentItem.textAdvanceScale;\n        textContentItem.height *= textContentItem.textAdvanceScale;\n        textContent.items.push(runBidiTransform(textContentItem));\n        textContentItem.initialized = false;\n        textContentItem.str.length = 0;\n      }\n      function enqueueChunk() {\n        var length = textContent.items.length;\n        if (length > 0) {\n          sink.enqueue(textContent, length);\n          textContent.items = [];\n          textContent.styles = Object.create(null);\n        }\n      }\n      var timeSlotManager = new TimeSlotManager();\n      return new Promise(function promiseBody(resolve, reject) {\n        var next = function next(promise) {\n          enqueueChunk();\n          Promise.all([promise, sink.ready]).then(function () {\n            try {\n              promiseBody(resolve, reject);\n            } catch (ex) {\n              reject(ex);\n            }\n          }, reject);\n        };\n        task.ensureNotTerminated();\n        timeSlotManager.reset();\n        var stop,\n            operation = {},\n            args = [];\n        while (!(stop = timeSlotManager.check())) {\n          args.length = 0;\n          operation.args = args;\n          if (!preprocessor.read(operation)) {\n            break;\n          }\n          textState = stateManager.state;\n          var fn = operation.fn;\n          args = operation.args;\n          var advance, diff;\n          var fontNameArg, fontSizeArg;\n          var isSameTextLine;\n          var items;\n          var offset;\n          var j, jj;\n          var breakTextRun;\n          var name;\n          var xobj;\n          var type;\n          var currentState;\n          var xObjStateManager;\n          var matrix;\n          var dictName;\n          var extGState;\n          var gState;\n          var gStateFont;\n\n          var _ret2 = function () {\n            switch (fn | 0) {\n              case _util.OPS.setFont:\n                fontNameArg = args[0].name;\n                fontSizeArg = args[1];\n\n                if (textState.font && fontNameArg === textState.fontName && fontSizeArg === textState.fontSize) {\n                  break;\n                }\n                flushTextContentItem();\n                textState.fontName = fontNameArg;\n                textState.fontSize = fontSizeArg;\n                next(handleSetFont(fontNameArg, null));\n                return {\n                  v: void 0\n                };\n              case _util.OPS.setTextRise:\n                flushTextContentItem();\n                textState.textRise = args[0];\n                break;\n              case _util.OPS.setHScale:\n                flushTextContentItem();\n                textState.textHScale = args[0] / 100;\n                break;\n              case _util.OPS.setLeading:\n                flushTextContentItem();\n                textState.leading = args[0];\n                break;\n              case _util.OPS.moveText:\n                isSameTextLine = !textState.font ? false : (textState.font.vertical ? args[0] : args[1]) === 0;\n\n                advance = args[0] - args[1];\n                if (combineTextItems && isSameTextLine && textContentItem.initialized && advance > 0 && advance <= textContentItem.fakeMultiSpaceMax) {\n                  textState.translateTextLineMatrix(args[0], args[1]);\n                  textContentItem.width += args[0] - textContentItem.lastAdvanceWidth;\n                  textContentItem.height += args[1] - textContentItem.lastAdvanceHeight;\n                  diff = args[0] - textContentItem.lastAdvanceWidth - (args[1] - textContentItem.lastAdvanceHeight);\n                  addFakeSpaces(diff, textContentItem.str);\n                  break;\n                }\n                flushTextContentItem();\n                textState.translateTextLineMatrix(args[0], args[1]);\n                textState.textMatrix = textState.textLineMatrix.slice();\n                break;\n              case _util.OPS.setLeadingMoveText:\n                flushTextContentItem();\n                textState.leading = -args[1];\n                textState.translateTextLineMatrix(args[0], args[1]);\n                textState.textMatrix = textState.textLineMatrix.slice();\n                break;\n              case _util.OPS.nextLine:\n                flushTextContentItem();\n                textState.carriageReturn();\n                break;\n              case _util.OPS.setTextMatrix:\n                advance = textState.calcTextLineMatrixAdvance(args[0], args[1], args[2], args[3], args[4], args[5]);\n                if (combineTextItems && advance !== null && textContentItem.initialized && advance.value > 0 && advance.value <= textContentItem.fakeMultiSpaceMax) {\n                  textState.translateTextLineMatrix(advance.width, advance.height);\n                  textContentItem.width += advance.width - textContentItem.lastAdvanceWidth;\n                  textContentItem.height += advance.height - textContentItem.lastAdvanceHeight;\n                  diff = advance.width - textContentItem.lastAdvanceWidth - (advance.height - textContentItem.lastAdvanceHeight);\n                  addFakeSpaces(diff, textContentItem.str);\n                  break;\n                }\n                flushTextContentItem();\n                textState.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);\n                textState.setTextLineMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);\n                break;\n              case _util.OPS.setCharSpacing:\n                textState.charSpacing = args[0];\n                break;\n              case _util.OPS.setWordSpacing:\n                textState.wordSpacing = args[0];\n                break;\n              case _util.OPS.beginText:\n                flushTextContentItem();\n                textState.textMatrix = _util.IDENTITY_MATRIX.slice();\n                textState.textLineMatrix = _util.IDENTITY_MATRIX.slice();\n                break;\n              case _util.OPS.showSpacedText:\n                items = args[0];\n\n                for (j = 0, jj = items.length; j < jj; j++) {\n                  if (typeof items[j] === 'string') {\n                    buildTextContentItem(items[j]);\n                  } else if ((0, _util.isNum)(items[j])) {\n                    ensureTextContentItem();\n                    advance = items[j] * textState.fontSize / 1000;\n                    breakTextRun = false;\n\n                    if (textState.font.vertical) {\n                      offset = advance;\n                      textState.translateTextMatrix(0, offset);\n                      breakTextRun = textContentItem.textRunBreakAllowed && advance > textContentItem.fakeMultiSpaceMax;\n                      if (!breakTextRun) {\n                        textContentItem.height += offset;\n                      }\n                    } else {\n                      advance = -advance;\n                      offset = advance * textState.textHScale;\n                      textState.translateTextMatrix(offset, 0);\n                      breakTextRun = textContentItem.textRunBreakAllowed && advance > textContentItem.fakeMultiSpaceMax;\n                      if (!breakTextRun) {\n                        textContentItem.width += offset;\n                      }\n                    }\n                    if (breakTextRun) {\n                      flushTextContentItem();\n                    } else if (advance > 0) {\n                      addFakeSpaces(advance, textContentItem.str);\n                    }\n                  }\n                }\n                break;\n              case _util.OPS.showText:\n                buildTextContentItem(args[0]);\n                break;\n              case _util.OPS.nextLineShowText:\n                flushTextContentItem();\n                textState.carriageReturn();\n                buildTextContentItem(args[0]);\n                break;\n              case _util.OPS.nextLineSetSpacingShowText:\n                flushTextContentItem();\n                textState.wordSpacing = args[0];\n                textState.charSpacing = args[1];\n                textState.carriageReturn();\n                buildTextContentItem(args[2]);\n                break;\n              case _util.OPS.paintXObject:\n                flushTextContentItem();\n                if (!xobjs) {\n                  xobjs = resources.get('XObject') || _primitives.Dict.empty;\n                }\n                name = args[0].name;\n\n                if (name in skipEmptyXObjs) {\n                  break;\n                }\n                xobj = xobjs.get(name);\n\n                if (!xobj) {\n                  break;\n                }\n                if (!(0, _primitives.isStream)(xobj)) {\n                  throw new _util.FormatError('XObject should be a stream');\n                }\n                type = xobj.dict.get('Subtype');\n\n                if (!(0, _primitives.isName)(type)) {\n                  throw new _util.FormatError('XObject should have a Name subtype');\n                }\n                if (type.name !== 'Form') {\n                  skipEmptyXObjs[name] = true;\n                  break;\n                }\n                currentState = stateManager.state.clone();\n                xObjStateManager = new StateManager(currentState);\n                matrix = xobj.dict.getArray('Matrix');\n\n                if ((0, _util.isArray)(matrix) && matrix.length === 6) {\n                  xObjStateManager.transform(matrix);\n                }\n                enqueueChunk();\n                var sinkWrapper = {\n                  enqueueInvoked: false,\n                  enqueue: function enqueue(chunk, size) {\n                    this.enqueueInvoked = true;\n                    sink.enqueue(chunk, size);\n                  },\n\n                  get desiredSize() {\n                    return sink.desiredSize;\n                  },\n                  get ready() {\n                    return sink.ready;\n                  }\n                };\n                next(self.getTextContent({\n                  stream: xobj,\n                  task: task,\n                  resources: xobj.dict.get('Resources') || resources,\n                  stateManager: xObjStateManager,\n                  normalizeWhitespace: normalizeWhitespace,\n                  combineTextItems: combineTextItems,\n                  sink: sinkWrapper,\n                  seenStyles: seenStyles\n                }).then(function () {\n                  if (!sinkWrapper.enqueueInvoked) {\n                    skipEmptyXObjs[name] = true;\n                  }\n                }));\n                return {\n                  v: void 0\n                };\n              case _util.OPS.setGState:\n                flushTextContentItem();\n                dictName = args[0];\n                extGState = resources.get('ExtGState');\n\n                if (!(0, _primitives.isDict)(extGState) || !(0, _primitives.isName)(dictName)) {\n                  break;\n                }\n                gState = extGState.get(dictName.name);\n\n                if (!(0, _primitives.isDict)(gState)) {\n                  break;\n                }\n                gStateFont = gState.get('Font');\n\n                if (gStateFont) {\n                  textState.fontName = null;\n                  textState.fontSize = gStateFont[1];\n                  next(handleSetFont(null, gStateFont[0]));\n                  return {\n                    v: void 0\n                  };\n                }\n                break;\n            }\n          }();\n\n          if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === \"object\") return _ret2.v;\n          if (textContent.items.length >= sink.desiredSize) {\n            stop = true;\n            break;\n          }\n        }\n        if (stop) {\n          next(deferred);\n          return;\n        }\n        flushTextContentItem();\n        enqueueChunk();\n        resolve();\n      }).catch(function (reason) {\n        if (reason instanceof _util.AbortException) {\n          return;\n        }\n        if (_this9.options.ignoreErrors) {\n          (0, _util.warn)('getTextContent - ignoring errors during task: ' + task.name);\n          flushTextContentItem();\n          enqueueChunk();\n          return;\n        }\n        throw reason;\n      });\n    },\n\n    extractDataStructures: function PartialEvaluator_extractDataStructures(dict, baseDict, properties) {\n      var _this10 = this;\n\n      var xref = this.xref;\n      var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode');\n      var toUnicodePromise = toUnicode ? this.readToUnicode(toUnicode) : Promise.resolve(undefined);\n      if (properties.composite) {\n        var cidSystemInfo = dict.get('CIDSystemInfo');\n        if ((0, _primitives.isDict)(cidSystemInfo)) {\n          properties.cidSystemInfo = {\n            registry: cidSystemInfo.get('Registry'),\n            ordering: cidSystemInfo.get('Ordering'),\n            supplement: cidSystemInfo.get('Supplement')\n          };\n        }\n        var cidToGidMap = dict.get('CIDToGIDMap');\n        if ((0, _primitives.isStream)(cidToGidMap)) {\n          properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);\n        }\n      }\n      var differences = [];\n      var baseEncodingName = null;\n      var encoding;\n      if (dict.has('Encoding')) {\n        encoding = dict.get('Encoding');\n        if ((0, _primitives.isDict)(encoding)) {\n          baseEncodingName = encoding.get('BaseEncoding');\n          baseEncodingName = (0, _primitives.isName)(baseEncodingName) ? baseEncodingName.name : null;\n          if (encoding.has('Differences')) {\n            var diffEncoding = encoding.get('Differences');\n            var index = 0;\n            for (var j = 0, jj = diffEncoding.length; j < jj; j++) {\n              var data = xref.fetchIfRef(diffEncoding[j]);\n              if ((0, _util.isNum)(data)) {\n                index = data;\n              } else if ((0, _primitives.isName)(data)) {\n                differences[index++] = data.name;\n              } else {\n                throw new _util.FormatError('Invalid entry in \\'Differences\\' array: ' + data);\n              }\n            }\n          }\n        } else if ((0, _primitives.isName)(encoding)) {\n          baseEncodingName = encoding.name;\n        } else {\n          throw new _util.FormatError('Encoding is not a Name nor a Dict');\n        }\n        if (baseEncodingName !== 'MacRomanEncoding' && baseEncodingName !== 'MacExpertEncoding' && baseEncodingName !== 'WinAnsiEncoding') {\n          baseEncodingName = null;\n        }\n      }\n      if (baseEncodingName) {\n        properties.defaultEncoding = (0, _encodings.getEncoding)(baseEncodingName).slice();\n      } else {\n        var isSymbolicFont = !!(properties.flags & _fonts.FontFlags.Symbolic);\n        var isNonsymbolicFont = !!(properties.flags & _fonts.FontFlags.Nonsymbolic);\n        encoding = _encodings.StandardEncoding;\n        if (properties.type === 'TrueType' && !isNonsymbolicFont) {\n          encoding = _encodings.WinAnsiEncoding;\n        }\n        if (isSymbolicFont) {\n          encoding = _encodings.MacRomanEncoding;\n          if (!properties.file) {\n            if (/Symbol/i.test(properties.name)) {\n              encoding = _encodings.SymbolSetEncoding;\n            } else if (/Dingbats/i.test(properties.name)) {\n              encoding = _encodings.ZapfDingbatsEncoding;\n            }\n          }\n        }\n        properties.defaultEncoding = encoding;\n      }\n      properties.differences = differences;\n      properties.baseEncodingName = baseEncodingName;\n      properties.hasEncoding = !!baseEncodingName || differences.length > 0;\n      properties.dict = dict;\n      return toUnicodePromise.then(function (toUnicode) {\n        properties.toUnicode = toUnicode;\n        return _this10.buildToUnicode(properties);\n      }).then(function (toUnicode) {\n        properties.toUnicode = toUnicode;\n        return properties;\n      });\n    },\n    buildToUnicode: function PartialEvaluator_buildToUnicode(properties) {\n      properties.hasIncludedToUnicodeMap = !!properties.toUnicode && properties.toUnicode.length > 0;\n      if (properties.hasIncludedToUnicodeMap) {\n        return Promise.resolve(properties.toUnicode);\n      }\n      var toUnicode, charcode, glyphName;\n      if (!properties.composite) {\n        toUnicode = [];\n        var encoding = properties.defaultEncoding.slice();\n        var baseEncodingName = properties.baseEncodingName;\n        var differences = properties.differences;\n        for (charcode in differences) {\n          glyphName = differences[charcode];\n          if (glyphName === '.notdef') {\n            continue;\n          }\n          encoding[charcode] = glyphName;\n        }\n        var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n        for (charcode in encoding) {\n          glyphName = encoding[charcode];\n          if (glyphName === '') {\n            continue;\n          } else if (glyphsUnicodeMap[glyphName] === undefined) {\n            var code = 0;\n            switch (glyphName[0]) {\n              case 'G':\n                if (glyphName.length === 3) {\n                  code = parseInt(glyphName.substr(1), 16);\n                }\n                break;\n              case 'g':\n                if (glyphName.length === 5) {\n                  code = parseInt(glyphName.substr(1), 16);\n                }\n                break;\n              case 'C':\n              case 'c':\n                if (glyphName.length >= 3) {\n                  code = +glyphName.substr(1);\n                }\n                break;\n              default:\n                var unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);\n                if (unicode !== -1) {\n                  code = unicode;\n                }\n            }\n            if (code) {\n              if (baseEncodingName && code === +charcode) {\n                var baseEncoding = (0, _encodings.getEncoding)(baseEncodingName);\n                if (baseEncoding && (glyphName = baseEncoding[charcode])) {\n                  toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]);\n                  continue;\n                }\n              }\n              toUnicode[charcode] = String.fromCharCode(code);\n            }\n            continue;\n          }\n          toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]);\n        }\n        return Promise.resolve(new _fonts.ToUnicodeMap(toUnicode));\n      }\n      if (properties.composite && (properties.cMap.builtInCMap && !(properties.cMap instanceof _cmap.IdentityCMap) || properties.cidSystemInfo.registry === 'Adobe' && (properties.cidSystemInfo.ordering === 'GB1' || properties.cidSystemInfo.ordering === 'CNS1' || properties.cidSystemInfo.ordering === 'Japan1' || properties.cidSystemInfo.ordering === 'Korea1'))) {\n        var registry = properties.cidSystemInfo.registry;\n        var ordering = properties.cidSystemInfo.ordering;\n        var ucs2CMapName = _primitives.Name.get(registry + '-' + ordering + '-UCS2');\n        return _cmap.CMapFactory.create({\n          encoding: ucs2CMapName,\n          fetchBuiltInCMap: this.fetchBuiltInCMap,\n          useCMap: null\n        }).then(function (ucs2CMap) {\n          var cMap = properties.cMap;\n          toUnicode = [];\n          cMap.forEach(function (charcode, cid) {\n            if (cid > 0xffff) {\n              throw new _util.FormatError('Max size of CID is 65,535');\n            }\n            var ucs2 = ucs2CMap.lookup(cid);\n            if (ucs2) {\n              toUnicode[charcode] = String.fromCharCode((ucs2.charCodeAt(0) << 8) + ucs2.charCodeAt(1));\n            }\n          });\n          return new _fonts.ToUnicodeMap(toUnicode);\n        });\n      }\n      return Promise.resolve(new _fonts.IdentityToUnicodeMap(properties.firstChar, properties.lastChar));\n    },\n    readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) {\n      var cmapObj = toUnicode;\n      if ((0, _primitives.isName)(cmapObj)) {\n        return _cmap.CMapFactory.create({\n          encoding: cmapObj,\n          fetchBuiltInCMap: this.fetchBuiltInCMap,\n          useCMap: null\n        }).then(function (cmap) {\n          if (cmap instanceof _cmap.IdentityCMap) {\n            return new _fonts.IdentityToUnicodeMap(0, 0xFFFF);\n          }\n          return new _fonts.ToUnicodeMap(cmap.getMap());\n        });\n      } else if ((0, _primitives.isStream)(cmapObj)) {\n        return _cmap.CMapFactory.create({\n          encoding: cmapObj,\n          fetchBuiltInCMap: this.fetchBuiltInCMap,\n          useCMap: null\n        }).then(function (cmap) {\n          if (cmap instanceof _cmap.IdentityCMap) {\n            return new _fonts.IdentityToUnicodeMap(0, 0xFFFF);\n          }\n          var map = new Array(cmap.length);\n          cmap.forEach(function (charCode, token) {\n            var str = [];\n            for (var k = 0; k < token.length; k += 2) {\n              var w1 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);\n              if ((w1 & 0xF800) !== 0xD800) {\n                str.push(w1);\n                continue;\n              }\n              k += 2;\n              var w2 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);\n              str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000);\n            }\n            map[charCode] = String.fromCharCode.apply(String, str);\n          });\n          return new _fonts.ToUnicodeMap(map);\n        });\n      }\n      return Promise.resolve(null);\n    },\n    readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) {\n      var glyphsData = cidToGidStream.getBytes();\n      var result = [];\n      for (var j = 0, jj = glyphsData.length; j < jj; j++) {\n        var glyphID = glyphsData[j++] << 8 | glyphsData[j];\n        if (glyphID === 0) {\n          continue;\n        }\n        var code = j >> 1;\n        result[code] = glyphID;\n      }\n      return result;\n    },\n    extractWidths: function PartialEvaluator_extractWidths(dict, descriptor, properties) {\n      var xref = this.xref;\n      var glyphsWidths = [];\n      var defaultWidth = 0;\n      var glyphsVMetrics = [];\n      var defaultVMetrics;\n      var i, ii, j, jj, start, code, widths;\n      if (properties.composite) {\n        defaultWidth = dict.get('DW') || 1000;\n        widths = dict.get('W');\n        if (widths) {\n          for (i = 0, ii = widths.length; i < ii; i++) {\n            start = xref.fetchIfRef(widths[i++]);\n            code = xref.fetchIfRef(widths[i]);\n            if ((0, _util.isArray)(code)) {\n              for (j = 0, jj = code.length; j < jj; j++) {\n                glyphsWidths[start++] = xref.fetchIfRef(code[j]);\n              }\n            } else {\n              var width = xref.fetchIfRef(widths[++i]);\n              for (j = start; j <= code; j++) {\n                glyphsWidths[j] = width;\n              }\n            }\n          }\n        }\n        if (properties.vertical) {\n          var vmetrics = dict.getArray('DW2') || [880, -1000];\n          defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]];\n          vmetrics = dict.get('W2');\n          if (vmetrics) {\n            for (i = 0, ii = vmetrics.length; i < ii; i++) {\n              start = xref.fetchIfRef(vmetrics[i++]);\n              code = xref.fetchIfRef(vmetrics[i]);\n              if ((0, _util.isArray)(code)) {\n                for (j = 0, jj = code.length; j < jj; j++) {\n                  glyphsVMetrics[start++] = [xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j])];\n                }\n              } else {\n                var vmetric = [xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i])];\n                for (j = start; j <= code; j++) {\n                  glyphsVMetrics[j] = vmetric;\n                }\n              }\n            }\n          }\n        }\n      } else {\n        var firstChar = properties.firstChar;\n        widths = dict.get('Widths');\n        if (widths) {\n          j = firstChar;\n          for (i = 0, ii = widths.length; i < ii; i++) {\n            glyphsWidths[j++] = xref.fetchIfRef(widths[i]);\n          }\n          defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0;\n        } else {\n          var baseFontName = dict.get('BaseFont');\n          if ((0, _primitives.isName)(baseFontName)) {\n            var metrics = this.getBaseFontMetrics(baseFontName.name);\n            glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties);\n            defaultWidth = metrics.defaultWidth;\n          }\n        }\n      }\n      var isMonospace = true;\n      var firstWidth = defaultWidth;\n      for (var glyph in glyphsWidths) {\n        var glyphWidth = glyphsWidths[glyph];\n        if (!glyphWidth) {\n          continue;\n        }\n        if (!firstWidth) {\n          firstWidth = glyphWidth;\n          continue;\n        }\n        if (firstWidth !== glyphWidth) {\n          isMonospace = false;\n          break;\n        }\n      }\n      if (isMonospace) {\n        properties.flags |= _fonts.FontFlags.FixedPitch;\n      }\n      properties.defaultWidth = defaultWidth;\n      properties.widths = glyphsWidths;\n      properties.defaultVMetrics = defaultVMetrics;\n      properties.vmetrics = glyphsVMetrics;\n    },\n    isSerifFont: function PartialEvaluator_isSerifFont(baseFontName) {\n      var fontNameWoStyle = baseFontName.split('-')[0];\n      return fontNameWoStyle in (0, _standard_fonts.getSerifFonts)() || fontNameWoStyle.search(/serif/gi) !== -1;\n    },\n    getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) {\n      var defaultWidth = 0;\n      var widths = [];\n      var monospace = false;\n      var stdFontMap = (0, _standard_fonts.getStdFontMap)();\n      var lookupName = stdFontMap[name] || name;\n      var Metrics = (0, _metrics.getMetrics)();\n      if (!(lookupName in Metrics)) {\n        if (this.isSerifFont(name)) {\n          lookupName = 'Times-Roman';\n        } else {\n          lookupName = 'Helvetica';\n        }\n      }\n      var glyphWidths = Metrics[lookupName];\n      if ((0, _util.isNum)(glyphWidths)) {\n        defaultWidth = glyphWidths;\n        monospace = true;\n      } else {\n        widths = glyphWidths();\n      }\n      return {\n        defaultWidth: defaultWidth,\n        monospace: monospace,\n        widths: widths\n      };\n    },\n    buildCharCodeToWidth: function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName, properties) {\n      var widths = Object.create(null);\n      var differences = properties.differences;\n      var encoding = properties.defaultEncoding;\n      for (var charCode = 0; charCode < 256; charCode++) {\n        if (charCode in differences && widthsByGlyphName[differences[charCode]]) {\n          widths[charCode] = widthsByGlyphName[differences[charCode]];\n          continue;\n        }\n        if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) {\n          widths[charCode] = widthsByGlyphName[encoding[charCode]];\n          continue;\n        }\n      }\n      return widths;\n    },\n    preEvaluateFont: function PartialEvaluator_preEvaluateFont(dict) {\n      var baseDict = dict;\n      var type = dict.get('Subtype');\n      if (!(0, _primitives.isName)(type)) {\n        throw new _util.FormatError('invalid font Subtype');\n      }\n      var composite = false;\n      var uint8array;\n      if (type.name === 'Type0') {\n        var df = dict.get('DescendantFonts');\n        if (!df) {\n          throw new _util.FormatError('Descendant fonts are not specified');\n        }\n        dict = (0, _util.isArray)(df) ? this.xref.fetchIfRef(df[0]) : df;\n        type = dict.get('Subtype');\n        if (!(0, _primitives.isName)(type)) {\n          throw new _util.FormatError('invalid font Subtype');\n        }\n        composite = true;\n      }\n      var descriptor = dict.get('FontDescriptor');\n      if (descriptor) {\n        var hash = new _murmurhash.MurmurHash3_64();\n        var encoding = baseDict.getRaw('Encoding');\n        if ((0, _primitives.isName)(encoding)) {\n          hash.update(encoding.name);\n        } else if ((0, _primitives.isRef)(encoding)) {\n          hash.update(encoding.toString());\n        } else if ((0, _primitives.isDict)(encoding)) {\n          var keys = encoding.getKeys();\n          for (var i = 0, ii = keys.length; i < ii; i++) {\n            var entry = encoding.getRaw(keys[i]);\n            if ((0, _primitives.isName)(entry)) {\n              hash.update(entry.name);\n            } else if ((0, _primitives.isRef)(entry)) {\n              hash.update(entry.toString());\n            } else if ((0, _util.isArray)(entry)) {\n              var diffLength = entry.length,\n                  diffBuf = new Array(diffLength);\n              for (var j = 0; j < diffLength; j++) {\n                var diffEntry = entry[j];\n                if ((0, _primitives.isName)(diffEntry)) {\n                  diffBuf[j] = diffEntry.name;\n                } else if ((0, _util.isNum)(diffEntry) || (0, _primitives.isRef)(diffEntry)) {\n                  diffBuf[j] = diffEntry.toString();\n                }\n              }\n              hash.update(diffBuf.join());\n            }\n          }\n        }\n        var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode');\n        if ((0, _primitives.isStream)(toUnicode)) {\n          var stream = toUnicode.str || toUnicode;\n          uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new Uint8Array(stream.bytes.buffer, stream.start, stream.end - stream.start);\n          hash.update(uint8array);\n        } else if ((0, _primitives.isName)(toUnicode)) {\n          hash.update(toUnicode.name);\n        }\n        var widths = dict.get('Widths') || baseDict.get('Widths');\n        if (widths) {\n          uint8array = new Uint8Array(new Uint32Array(widths).buffer);\n          hash.update(uint8array);\n        }\n      }\n      return {\n        descriptor: descriptor,\n        dict: dict,\n        baseDict: baseDict,\n        composite: composite,\n        type: type.name,\n        hash: hash ? hash.hexdigest() : ''\n      };\n    },\n    translateFont: function PartialEvaluator_translateFont(preEvaluatedFont) {\n      var _this11 = this;\n\n      var baseDict = preEvaluatedFont.baseDict;\n      var dict = preEvaluatedFont.dict;\n      var composite = preEvaluatedFont.composite;\n      var descriptor = preEvaluatedFont.descriptor;\n      var type = preEvaluatedFont.type;\n      var maxCharIndex = composite ? 0xFFFF : 0xFF;\n      var properties;\n      if (!descriptor) {\n        if (type === 'Type3') {\n          descriptor = new _primitives.Dict(null);\n          descriptor.set('FontName', _primitives.Name.get(type));\n          descriptor.set('FontBBox', dict.getArray('FontBBox'));\n        } else {\n          var baseFontName = dict.get('BaseFont');\n          if (!(0, _primitives.isName)(baseFontName)) {\n            throw new _util.FormatError('Base font is not specified');\n          }\n          baseFontName = baseFontName.name.replace(/[,_]/g, '-');\n          var metrics = this.getBaseFontMetrics(baseFontName);\n          var fontNameWoStyle = baseFontName.split('-')[0];\n          var flags = (this.isSerifFont(fontNameWoStyle) ? _fonts.FontFlags.Serif : 0) | (metrics.monospace ? _fonts.FontFlags.FixedPitch : 0) | ((0, _standard_fonts.getSymbolsFonts)()[fontNameWoStyle] ? _fonts.FontFlags.Symbolic : _fonts.FontFlags.Nonsymbolic);\n          properties = {\n            type: type,\n            name: baseFontName,\n            widths: metrics.widths,\n            defaultWidth: metrics.defaultWidth,\n            flags: flags,\n            firstChar: 0,\n            lastChar: maxCharIndex\n          };\n          return this.extractDataStructures(dict, dict, properties).then(function (properties) {\n            properties.widths = _this11.buildCharCodeToWidth(metrics.widths, properties);\n            return new _fonts.Font(baseFontName, null, properties);\n          });\n        }\n      }\n      var firstChar = dict.get('FirstChar') || 0;\n      var lastChar = dict.get('LastChar') || maxCharIndex;\n      var fontName = descriptor.get('FontName');\n      var baseFont = dict.get('BaseFont');\n      if ((0, _util.isString)(fontName)) {\n        fontName = _primitives.Name.get(fontName);\n      }\n      if ((0, _util.isString)(baseFont)) {\n        baseFont = _primitives.Name.get(baseFont);\n      }\n      if (type !== 'Type3') {\n        var fontNameStr = fontName && fontName.name;\n        var baseFontStr = baseFont && baseFont.name;\n        if (fontNameStr !== baseFontStr) {\n          (0, _util.info)('The FontDescriptor\\'s FontName is \"' + fontNameStr + '\" but should be the same as the Font\\'s BaseFont \"' + baseFontStr + '\"');\n          if (fontNameStr && baseFontStr && baseFontStr.indexOf(fontNameStr) === 0) {\n            fontName = baseFont;\n          }\n        }\n      }\n      fontName = fontName || baseFont;\n      if (!(0, _primitives.isName)(fontName)) {\n        throw new _util.FormatError('invalid font name');\n      }\n      var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');\n      if (fontFile) {\n        if (fontFile.dict) {\n          var subtype = fontFile.dict.get('Subtype');\n          if (subtype) {\n            subtype = subtype.name;\n          }\n          var length1 = fontFile.dict.get('Length1');\n          var length2 = fontFile.dict.get('Length2');\n          var length3 = fontFile.dict.get('Length3');\n        }\n      }\n      properties = {\n        type: type,\n        name: fontName.name,\n        subtype: subtype,\n        file: fontFile,\n        length1: length1,\n        length2: length2,\n        length3: length3,\n        loadedName: baseDict.loadedName,\n        composite: composite,\n        wideChars: composite,\n        fixedPitch: false,\n        fontMatrix: dict.getArray('FontMatrix') || _util.FONT_IDENTITY_MATRIX,\n        firstChar: firstChar || 0,\n        lastChar: lastChar || maxCharIndex,\n        bbox: descriptor.getArray('FontBBox'),\n        ascent: descriptor.get('Ascent'),\n        descent: descriptor.get('Descent'),\n        xHeight: descriptor.get('XHeight'),\n        capHeight: descriptor.get('CapHeight'),\n        flags: descriptor.get('Flags'),\n        italicAngle: descriptor.get('ItalicAngle'),\n        isType3Font: false\n      };\n      var cMapPromise;\n      if (composite) {\n        var cidEncoding = baseDict.get('Encoding');\n        if ((0, _primitives.isName)(cidEncoding)) {\n          properties.cidEncoding = cidEncoding.name;\n        }\n        cMapPromise = _cmap.CMapFactory.create({\n          encoding: cidEncoding,\n          fetchBuiltInCMap: this.fetchBuiltInCMap,\n          useCMap: null\n        }).then(function (cMap) {\n          properties.cMap = cMap;\n          properties.vertical = properties.cMap.vertical;\n        });\n      } else {\n        cMapPromise = Promise.resolve(undefined);\n      }\n      return cMapPromise.then(function () {\n        return _this11.extractDataStructures(dict, baseDict, properties);\n      }).then(function (properties) {\n        _this11.extractWidths(dict, descriptor, properties);\n        if (type === 'Type3') {\n          properties.isType3Font = true;\n        }\n        return new _fonts.Font(fontName.name, fontFile, properties);\n      });\n    }\n  };\n  return PartialEvaluator;\n}();\nvar TranslatedFont = function TranslatedFontClosure() {\n  function TranslatedFont(loadedName, font, dict) {\n    this.loadedName = loadedName;\n    this.font = font;\n    this.dict = dict;\n    this.type3Loaded = null;\n    this.sent = false;\n  }\n  TranslatedFont.prototype = {\n    send: function send(handler) {\n      if (this.sent) {\n        return;\n      }\n      var fontData = this.font.exportData();\n      handler.send('commonobj', [this.loadedName, 'Font', fontData]);\n      this.sent = true;\n    },\n    loadType3Data: function loadType3Data(evaluator, resources, parentOperatorList, task) {\n      if (!this.font.isType3Font) {\n        throw new Error('Must be a Type3 font.');\n      }\n      if (this.type3Loaded) {\n        return this.type3Loaded;\n      }\n      var type3Options = Object.create(evaluator.options);\n      type3Options.ignoreErrors = false;\n      var type3Evaluator = evaluator.clone(type3Options);\n      var translatedFont = this.font;\n      var loadCharProcsPromise = Promise.resolve();\n      var charProcs = this.dict.get('CharProcs');\n      var fontResources = this.dict.get('Resources') || resources;\n      var charProcKeys = charProcs.getKeys();\n      var charProcOperatorList = Object.create(null);\n\n      var _loop2 = function _loop2() {\n        var key = charProcKeys[i];\n        loadCharProcsPromise = loadCharProcsPromise.then(function () {\n          var glyphStream = charProcs.get(key);\n          var operatorList = new OperatorList();\n          return type3Evaluator.getOperatorList({\n            stream: glyphStream,\n            task: task,\n            resources: fontResources,\n            operatorList: operatorList\n          }).then(function () {\n            charProcOperatorList[key] = operatorList.getIR();\n            parentOperatorList.addDependencies(operatorList.dependencies);\n          }).catch(function (reason) {\n            (0, _util.warn)('Type3 font resource \"' + key + '\" is not available.');\n            var operatorList = new OperatorList();\n            charProcOperatorList[key] = operatorList.getIR();\n          });\n        });\n      };\n\n      for (var i = 0, n = charProcKeys.length; i < n; ++i) {\n        _loop2();\n      }\n      this.type3Loaded = loadCharProcsPromise.then(function () {\n        translatedFont.charProcOperatorList = charProcOperatorList;\n      });\n      return this.type3Loaded;\n    }\n  };\n  return TranslatedFont;\n}();\nvar OperatorList = function OperatorListClosure() {\n  var CHUNK_SIZE = 1000;\n  var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5;\n  function getTransfers(queue) {\n    var transfers = [];\n    var fnArray = queue.fnArray,\n        argsArray = queue.argsArray;\n    for (var i = 0, ii = queue.length; i < ii; i++) {\n      switch (fnArray[i]) {\n        case _util.OPS.paintInlineImageXObject:\n        case _util.OPS.paintInlineImageXObjectGroup:\n        case _util.OPS.paintImageMaskXObject:\n          var arg = argsArray[i][0];\n          if (!arg.cached) {\n            transfers.push(arg.data.buffer);\n          }\n          break;\n      }\n    }\n    return transfers;\n  }\n  function OperatorList(intent, messageHandler, pageIndex) {\n    this.messageHandler = messageHandler;\n    this.fnArray = [];\n    this.argsArray = [];\n    this.dependencies = Object.create(null);\n    this._totalLength = 0;\n    this.pageIndex = pageIndex;\n    this.intent = intent;\n  }\n  OperatorList.prototype = {\n    get length() {\n      return this.argsArray.length;\n    },\n    get totalLength() {\n      return this._totalLength + this.length;\n    },\n    addOp: function addOp(fn, args) {\n      this.fnArray.push(fn);\n      this.argsArray.push(args);\n      if (this.messageHandler) {\n        if (this.fnArray.length >= CHUNK_SIZE) {\n          this.flush();\n        } else if (this.fnArray.length >= CHUNK_SIZE_ABOUT && (fn === _util.OPS.restore || fn === _util.OPS.endText)) {\n          this.flush();\n        }\n      }\n    },\n    addDependency: function addDependency(dependency) {\n      if (dependency in this.dependencies) {\n        return;\n      }\n      this.dependencies[dependency] = true;\n      this.addOp(_util.OPS.dependency, [dependency]);\n    },\n    addDependencies: function addDependencies(dependencies) {\n      for (var key in dependencies) {\n        this.addDependency(key);\n      }\n    },\n    addOpList: function addOpList(opList) {\n      _util.Util.extendObj(this.dependencies, opList.dependencies);\n      for (var i = 0, ii = opList.length; i < ii; i++) {\n        this.addOp(opList.fnArray[i], opList.argsArray[i]);\n      }\n    },\n    getIR: function getIR() {\n      return {\n        fnArray: this.fnArray,\n        argsArray: this.argsArray,\n        length: this.length\n      };\n    },\n    flush: function flush(lastChunk) {\n      if (this.intent !== 'oplist') {\n        new QueueOptimizer().optimize(this);\n      }\n      var transfers = getTransfers(this);\n      var length = this.length;\n      this._totalLength += length;\n      this.messageHandler.send('RenderPageChunk', {\n        operatorList: {\n          fnArray: this.fnArray,\n          argsArray: this.argsArray,\n          lastChunk: lastChunk,\n          length: length\n        },\n        pageIndex: this.pageIndex,\n        intent: this.intent\n      }, transfers);\n      this.dependencies = Object.create(null);\n      this.fnArray.length = 0;\n      this.argsArray.length = 0;\n    }\n  };\n  return OperatorList;\n}();\nvar StateManager = function StateManagerClosure() {\n  function StateManager(initialState) {\n    this.state = initialState;\n    this.stateStack = [];\n  }\n  StateManager.prototype = {\n    save: function save() {\n      var old = this.state;\n      this.stateStack.push(this.state);\n      this.state = old.clone();\n    },\n    restore: function restore() {\n      var prev = this.stateStack.pop();\n      if (prev) {\n        this.state = prev;\n      }\n    },\n    transform: function transform(args) {\n      this.state.ctm = _util.Util.transform(this.state.ctm, args);\n    }\n  };\n  return StateManager;\n}();\nvar TextState = function TextStateClosure() {\n  function TextState() {\n    this.ctm = new Float32Array(_util.IDENTITY_MATRIX);\n    this.fontName = null;\n    this.fontSize = 0;\n    this.font = null;\n    this.fontMatrix = _util.FONT_IDENTITY_MATRIX;\n    this.textMatrix = _util.IDENTITY_MATRIX.slice();\n    this.textLineMatrix = _util.IDENTITY_MATRIX.slice();\n    this.charSpacing = 0;\n    this.wordSpacing = 0;\n    this.leading = 0;\n    this.textHScale = 1;\n    this.textRise = 0;\n  }\n  TextState.prototype = {\n    setTextMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {\n      var m = this.textMatrix;\n      m[0] = a;\n      m[1] = b;\n      m[2] = c;\n      m[3] = d;\n      m[4] = e;\n      m[5] = f;\n    },\n    setTextLineMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {\n      var m = this.textLineMatrix;\n      m[0] = a;\n      m[1] = b;\n      m[2] = c;\n      m[3] = d;\n      m[4] = e;\n      m[5] = f;\n    },\n    translateTextMatrix: function TextState_translateTextMatrix(x, y) {\n      var m = this.textMatrix;\n      m[4] = m[0] * x + m[2] * y + m[4];\n      m[5] = m[1] * x + m[3] * y + m[5];\n    },\n    translateTextLineMatrix: function TextState_translateTextMatrix(x, y) {\n      var m = this.textLineMatrix;\n      m[4] = m[0] * x + m[2] * y + m[4];\n      m[5] = m[1] * x + m[3] * y + m[5];\n    },\n    calcTextLineMatrixAdvance: function TextState_calcTextLineMatrixAdvance(a, b, c, d, e, f) {\n      var font = this.font;\n      if (!font) {\n        return null;\n      }\n      var m = this.textLineMatrix;\n      if (!(a === m[0] && b === m[1] && c === m[2] && d === m[3])) {\n        return null;\n      }\n      var txDiff = e - m[4],\n          tyDiff = f - m[5];\n      if (font.vertical && txDiff !== 0 || !font.vertical && tyDiff !== 0) {\n        return null;\n      }\n      var tx,\n          ty,\n          denominator = a * d - b * c;\n      if (font.vertical) {\n        tx = -tyDiff * c / denominator;\n        ty = tyDiff * a / denominator;\n      } else {\n        tx = txDiff * d / denominator;\n        ty = -txDiff * b / denominator;\n      }\n      return {\n        width: tx,\n        height: ty,\n        value: font.vertical ? ty : tx\n      };\n    },\n    calcRenderMatrix: function TextState_calcRendeMatrix(ctm) {\n      var tsm = [this.fontSize * this.textHScale, 0, 0, this.fontSize, 0, this.textRise];\n      return _util.Util.transform(ctm, _util.Util.transform(this.textMatrix, tsm));\n    },\n    carriageReturn: function TextState_carriageReturn() {\n      this.translateTextLineMatrix(0, -this.leading);\n      this.textMatrix = this.textLineMatrix.slice();\n    },\n    clone: function TextState_clone() {\n      var clone = Object.create(this);\n      clone.textMatrix = this.textMatrix.slice();\n      clone.textLineMatrix = this.textLineMatrix.slice();\n      clone.fontMatrix = this.fontMatrix.slice();\n      return clone;\n    }\n  };\n  return TextState;\n}();\nvar EvalState = function EvalStateClosure() {\n  function EvalState() {\n    this.ctm = new Float32Array(_util.IDENTITY_MATRIX);\n    this.font = null;\n    this.textRenderingMode = _util.TextRenderingMode.FILL;\n    this.fillColorSpace = _colorspace.ColorSpace.singletons.gray;\n    this.strokeColorSpace = _colorspace.ColorSpace.singletons.gray;\n  }\n  EvalState.prototype = {\n    clone: function CanvasExtraState_clone() {\n      return Object.create(this);\n    }\n  };\n  return EvalState;\n}();\nvar EvaluatorPreprocessor = function EvaluatorPreprocessorClosure() {\n  var getOPMap = (0, _util.getLookupTableFactory)(function (t) {\n    t['w'] = {\n      id: _util.OPS.setLineWidth,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['J'] = {\n      id: _util.OPS.setLineCap,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['j'] = {\n      id: _util.OPS.setLineJoin,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['M'] = {\n      id: _util.OPS.setMiterLimit,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['d'] = {\n      id: _util.OPS.setDash,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['ri'] = {\n      id: _util.OPS.setRenderingIntent,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['i'] = {\n      id: _util.OPS.setFlatness,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['gs'] = {\n      id: _util.OPS.setGState,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['q'] = {\n      id: _util.OPS.save,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['Q'] = {\n      id: _util.OPS.restore,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['cm'] = {\n      id: _util.OPS.transform,\n      numArgs: 6,\n      variableArgs: false\n    };\n    t['m'] = {\n      id: _util.OPS.moveTo,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['l'] = {\n      id: _util.OPS.lineTo,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['c'] = {\n      id: _util.OPS.curveTo,\n      numArgs: 6,\n      variableArgs: false\n    };\n    t['v'] = {\n      id: _util.OPS.curveTo2,\n      numArgs: 4,\n      variableArgs: false\n    };\n    t['y'] = {\n      id: _util.OPS.curveTo3,\n      numArgs: 4,\n      variableArgs: false\n    };\n    t['h'] = {\n      id: _util.OPS.closePath,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['re'] = {\n      id: _util.OPS.rectangle,\n      numArgs: 4,\n      variableArgs: false\n    };\n    t['S'] = {\n      id: _util.OPS.stroke,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['s'] = {\n      id: _util.OPS.closeStroke,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['f'] = {\n      id: _util.OPS.fill,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['F'] = {\n      id: _util.OPS.fill,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['f*'] = {\n      id: _util.OPS.eoFill,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['B'] = {\n      id: _util.OPS.fillStroke,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['B*'] = {\n      id: _util.OPS.eoFillStroke,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['b'] = {\n      id: _util.OPS.closeFillStroke,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['b*'] = {\n      id: _util.OPS.closeEOFillStroke,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['n'] = {\n      id: _util.OPS.endPath,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['W'] = {\n      id: _util.OPS.clip,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['W*'] = {\n      id: _util.OPS.eoClip,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['BT'] = {\n      id: _util.OPS.beginText,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['ET'] = {\n      id: _util.OPS.endText,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['Tc'] = {\n      id: _util.OPS.setCharSpacing,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['Tw'] = {\n      id: _util.OPS.setWordSpacing,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['Tz'] = {\n      id: _util.OPS.setHScale,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['TL'] = {\n      id: _util.OPS.setLeading,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['Tf'] = {\n      id: _util.OPS.setFont,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['Tr'] = {\n      id: _util.OPS.setTextRenderingMode,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['Ts'] = {\n      id: _util.OPS.setTextRise,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['Td'] = {\n      id: _util.OPS.moveText,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['TD'] = {\n      id: _util.OPS.setLeadingMoveText,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['Tm'] = {\n      id: _util.OPS.setTextMatrix,\n      numArgs: 6,\n      variableArgs: false\n    };\n    t['T*'] = {\n      id: _util.OPS.nextLine,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['Tj'] = {\n      id: _util.OPS.showText,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['TJ'] = {\n      id: _util.OPS.showSpacedText,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['\\''] = {\n      id: _util.OPS.nextLineShowText,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['\"'] = {\n      id: _util.OPS.nextLineSetSpacingShowText,\n      numArgs: 3,\n      variableArgs: false\n    };\n    t['d0'] = {\n      id: _util.OPS.setCharWidth,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['d1'] = {\n      id: _util.OPS.setCharWidthAndBounds,\n      numArgs: 6,\n      variableArgs: false\n    };\n    t['CS'] = {\n      id: _util.OPS.setStrokeColorSpace,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['cs'] = {\n      id: _util.OPS.setFillColorSpace,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['SC'] = {\n      id: _util.OPS.setStrokeColor,\n      numArgs: 4,\n      variableArgs: true\n    };\n    t['SCN'] = {\n      id: _util.OPS.setStrokeColorN,\n      numArgs: 33,\n      variableArgs: true\n    };\n    t['sc'] = {\n      id: _util.OPS.setFillColor,\n      numArgs: 4,\n      variableArgs: true\n    };\n    t['scn'] = {\n      id: _util.OPS.setFillColorN,\n      numArgs: 33,\n      variableArgs: true\n    };\n    t['G'] = {\n      id: _util.OPS.setStrokeGray,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['g'] = {\n      id: _util.OPS.setFillGray,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['RG'] = {\n      id: _util.OPS.setStrokeRGBColor,\n      numArgs: 3,\n      variableArgs: false\n    };\n    t['rg'] = {\n      id: _util.OPS.setFillRGBColor,\n      numArgs: 3,\n      variableArgs: false\n    };\n    t['K'] = {\n      id: _util.OPS.setStrokeCMYKColor,\n      numArgs: 4,\n      variableArgs: false\n    };\n    t['k'] = {\n      id: _util.OPS.setFillCMYKColor,\n      numArgs: 4,\n      variableArgs: false\n    };\n    t['sh'] = {\n      id: _util.OPS.shadingFill,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['BI'] = {\n      id: _util.OPS.beginInlineImage,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['ID'] = {\n      id: _util.OPS.beginImageData,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['EI'] = {\n      id: _util.OPS.endInlineImage,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['Do'] = {\n      id: _util.OPS.paintXObject,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['MP'] = {\n      id: _util.OPS.markPoint,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['DP'] = {\n      id: _util.OPS.markPointProps,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['BMC'] = {\n      id: _util.OPS.beginMarkedContent,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['BDC'] = {\n      id: _util.OPS.beginMarkedContentProps,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['EMC'] = {\n      id: _util.OPS.endMarkedContent,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['BX'] = {\n      id: _util.OPS.beginCompat,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['EX'] = {\n      id: _util.OPS.endCompat,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['BM'] = null;\n    t['BD'] = null;\n    t['true'] = null;\n    t['fa'] = null;\n    t['fal'] = null;\n    t['fals'] = null;\n    t['false'] = null;\n    t['nu'] = null;\n    t['nul'] = null;\n    t['null'] = null;\n  });\n  function EvaluatorPreprocessor(stream, xref, stateManager) {\n    this.opMap = getOPMap();\n    this.parser = new _parser.Parser(new _parser.Lexer(stream, this.opMap), false, xref);\n    this.stateManager = stateManager;\n    this.nonProcessedArgs = [];\n  }\n  EvaluatorPreprocessor.prototype = {\n    get savedStatesDepth() {\n      return this.stateManager.stateStack.length;\n    },\n    read: function EvaluatorPreprocessor_read(operation) {\n      var args = operation.args;\n      while (true) {\n        var obj = this.parser.getObj();\n        if ((0, _primitives.isCmd)(obj)) {\n          var cmd = obj.cmd;\n          var opSpec = this.opMap[cmd];\n          if (!opSpec) {\n            (0, _util.warn)('Unknown command \"' + cmd + '\"');\n            continue;\n          }\n          var fn = opSpec.id;\n          var numArgs = opSpec.numArgs;\n          var argsLength = args !== null ? args.length : 0;\n          if (!opSpec.variableArgs) {\n            if (argsLength !== numArgs) {\n              var nonProcessedArgs = this.nonProcessedArgs;\n              while (argsLength > numArgs) {\n                nonProcessedArgs.push(args.shift());\n                argsLength--;\n              }\n              while (argsLength < numArgs && nonProcessedArgs.length !== 0) {\n                if (args === null) {\n                  args = [];\n                }\n                args.unshift(nonProcessedArgs.pop());\n                argsLength++;\n              }\n            }\n            if (argsLength < numArgs) {\n              (0, _util.warn)('Skipping command ' + fn + ': expected ' + numArgs + ' args, but received ' + argsLength + ' args.');\n              if (args !== null) {\n                args.length = 0;\n              }\n              continue;\n            }\n          } else if (argsLength > numArgs) {\n            (0, _util.info)('Command ' + fn + ': expected [0,' + numArgs + '] args, but received ' + argsLength + ' args.');\n          }\n          this.preprocessCommand(fn, args);\n          operation.fn = fn;\n          operation.args = args;\n          return true;\n        }\n        if ((0, _primitives.isEOF)(obj)) {\n          return false;\n        }\n        if (obj !== null) {\n          if (args === null) {\n            args = [];\n          }\n          args.push(obj);\n          if (args.length > 33) {\n            throw new _util.FormatError('Too many arguments');\n          }\n        }\n      }\n    },\n    preprocessCommand: function EvaluatorPreprocessor_preprocessCommand(fn, args) {\n      switch (fn | 0) {\n        case _util.OPS.save:\n          this.stateManager.save();\n          break;\n        case _util.OPS.restore:\n          this.stateManager.restore();\n          break;\n        case _util.OPS.transform:\n          this.stateManager.transform(args);\n          break;\n      }\n    }\n  };\n  return EvaluatorPreprocessor;\n}();\nvar QueueOptimizer = function QueueOptimizerClosure() {\n  function addState(parentState, pattern, fn) {\n    var state = parentState;\n    for (var i = 0, ii = pattern.length - 1; i < ii; i++) {\n      var item = pattern[i];\n      state = state[item] || (state[item] = []);\n    }\n    state[pattern[pattern.length - 1]] = fn;\n  }\n  function handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray) {\n    var iFirstPIMXO = iFirstSave + 2;\n    for (var i = 0; i < count; i++) {\n      var arg = argsArray[iFirstPIMXO + 4 * i];\n      var imageMask = arg.length === 1 && arg[0];\n      if (imageMask && imageMask.width === 1 && imageMask.height === 1 && (!imageMask.data.length || imageMask.data.length === 1 && imageMask.data[0] === 0)) {\n        fnArray[iFirstPIMXO + 4 * i] = _util.OPS.paintSolidColorImageMask;\n        continue;\n      }\n      break;\n    }\n    return count - i;\n  }\n  var InitialState = [];\n  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintInlineImageXObject, _util.OPS.restore], function foundInlineImageGroup(context) {\n    var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10;\n    var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200;\n    var MAX_WIDTH = 1000;\n    var IMAGE_PADDING = 1;\n    var fnArray = context.fnArray,\n        argsArray = context.argsArray;\n    var curr = context.iCurr;\n    var iFirstSave = curr - 3;\n    var iFirstTransform = curr - 2;\n    var iFirstPIIXO = curr - 1;\n    var i = iFirstSave + 4;\n    var ii = fnArray.length;\n    while (i + 3 < ii) {\n      if (fnArray[i] !== _util.OPS.save || fnArray[i + 1] !== _util.OPS.transform || fnArray[i + 2] !== _util.OPS.paintInlineImageXObject || fnArray[i + 3] !== _util.OPS.restore) {\n        break;\n      }\n      i += 4;\n    }\n    var count = Math.min((i - iFirstSave) / 4, MAX_IMAGES_IN_INLINE_IMAGES_BLOCK);\n    if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) {\n      return i;\n    }\n    var maxX = 0;\n    var map = [],\n        maxLineHeight = 0;\n    var currentX = IMAGE_PADDING,\n        currentY = IMAGE_PADDING;\n    var q;\n    for (q = 0; q < count; q++) {\n      var transform = argsArray[iFirstTransform + (q << 2)];\n      var img = argsArray[iFirstPIIXO + (q << 2)][0];\n      if (currentX + img.width > MAX_WIDTH) {\n        maxX = Math.max(maxX, currentX);\n        currentY += maxLineHeight + 2 * IMAGE_PADDING;\n        currentX = 0;\n        maxLineHeight = 0;\n      }\n      map.push({\n        transform: transform,\n        x: currentX,\n        y: currentY,\n        w: img.width,\n        h: img.height\n      });\n      currentX += img.width + 2 * IMAGE_PADDING;\n      maxLineHeight = Math.max(maxLineHeight, img.height);\n    }\n    var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING;\n    var imgHeight = currentY + maxLineHeight + IMAGE_PADDING;\n    var imgData = new Uint8Array(imgWidth * imgHeight * 4);\n    var imgRowSize = imgWidth << 2;\n    for (q = 0; q < count; q++) {\n      var data = argsArray[iFirstPIIXO + (q << 2)][0].data;\n      var rowSize = map[q].w << 2;\n      var dataOffset = 0;\n      var offset = map[q].x + map[q].y * imgWidth << 2;\n      imgData.set(data.subarray(0, rowSize), offset - imgRowSize);\n      for (var k = 0, kk = map[q].h; k < kk; k++) {\n        imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset);\n        dataOffset += rowSize;\n        offset += imgRowSize;\n      }\n      imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset);\n      while (offset >= 0) {\n        data[offset - 4] = data[offset];\n        data[offset - 3] = data[offset + 1];\n        data[offset - 2] = data[offset + 2];\n        data[offset - 1] = data[offset + 3];\n        data[offset + rowSize] = data[offset + rowSize - 4];\n        data[offset + rowSize + 1] = data[offset + rowSize - 3];\n        data[offset + rowSize + 2] = data[offset + rowSize - 2];\n        data[offset + rowSize + 3] = data[offset + rowSize - 1];\n        offset -= imgRowSize;\n      }\n    }\n    fnArray.splice(iFirstSave, count * 4, _util.OPS.paintInlineImageXObjectGroup);\n    argsArray.splice(iFirstSave, count * 4, [{\n      width: imgWidth,\n      height: imgHeight,\n      kind: _util.ImageKind.RGBA_32BPP,\n      data: imgData\n    }, map]);\n    return iFirstSave + 1;\n  });\n  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintImageMaskXObject, _util.OPS.restore], function foundImageMaskGroup(context) {\n    var MIN_IMAGES_IN_MASKS_BLOCK = 10;\n    var MAX_IMAGES_IN_MASKS_BLOCK = 100;\n    var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000;\n    var fnArray = context.fnArray,\n        argsArray = context.argsArray;\n    var curr = context.iCurr;\n    var iFirstSave = curr - 3;\n    var iFirstTransform = curr - 2;\n    var iFirstPIMXO = curr - 1;\n    var i = iFirstSave + 4;\n    var ii = fnArray.length;\n    while (i + 3 < ii) {\n      if (fnArray[i] !== _util.OPS.save || fnArray[i + 1] !== _util.OPS.transform || fnArray[i + 2] !== _util.OPS.paintImageMaskXObject || fnArray[i + 3] !== _util.OPS.restore) {\n        break;\n      }\n      i += 4;\n    }\n    var count = (i - iFirstSave) / 4;\n    count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray);\n    if (count < MIN_IMAGES_IN_MASKS_BLOCK) {\n      return i;\n    }\n    var q;\n    var isSameImage = false;\n    var iTransform, transformArgs;\n    var firstPIMXOArg0 = argsArray[iFirstPIMXO][0];\n    if (argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0) {\n      isSameImage = true;\n      var firstTransformArg0 = argsArray[iFirstTransform][0];\n      var firstTransformArg3 = argsArray[iFirstTransform][3];\n      iTransform = iFirstTransform + 4;\n      var iPIMXO = iFirstPIMXO + 4;\n      for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) {\n        transformArgs = argsArray[iTransform];\n        if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || transformArgs[1] !== 0 || transformArgs[2] !== 0 || transformArgs[3] !== firstTransformArg3) {\n          if (q < MIN_IMAGES_IN_MASKS_BLOCK) {\n            isSameImage = false;\n          } else {\n            count = q;\n          }\n          break;\n        }\n      }\n    }\n    if (isSameImage) {\n      count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK);\n      var positions = new Float32Array(count * 2);\n      iTransform = iFirstTransform;\n      for (q = 0; q < count; q++, iTransform += 4) {\n        transformArgs = argsArray[iTransform];\n        positions[q << 1] = transformArgs[4];\n        positions[(q << 1) + 1] = transformArgs[5];\n      }\n      fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageMaskXObjectRepeat);\n      argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg3, positions]);\n    } else {\n      count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);\n      var images = [];\n      for (q = 0; q < count; q++) {\n        transformArgs = argsArray[iFirstTransform + (q << 2)];\n        var maskParams = argsArray[iFirstPIMXO + (q << 2)][0];\n        images.push({\n          data: maskParams.data,\n          width: maskParams.width,\n          height: maskParams.height,\n          transform: transformArgs\n        });\n      }\n      fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageMaskXObjectGroup);\n      argsArray.splice(iFirstSave, count * 4, [images]);\n    }\n    return iFirstSave + 1;\n  });\n  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintImageXObject, _util.OPS.restore], function (context) {\n    var MIN_IMAGES_IN_BLOCK = 3;\n    var MAX_IMAGES_IN_BLOCK = 1000;\n    var fnArray = context.fnArray,\n        argsArray = context.argsArray;\n    var curr = context.iCurr;\n    var iFirstSave = curr - 3;\n    var iFirstTransform = curr - 2;\n    var iFirstPIXO = curr - 1;\n    var iFirstRestore = curr;\n    if (argsArray[iFirstTransform][1] !== 0 || argsArray[iFirstTransform][2] !== 0) {\n      return iFirstRestore + 1;\n    }\n    var firstPIXOArg0 = argsArray[iFirstPIXO][0];\n    var firstTransformArg0 = argsArray[iFirstTransform][0];\n    var firstTransformArg3 = argsArray[iFirstTransform][3];\n    var i = iFirstSave + 4;\n    var ii = fnArray.length;\n    while (i + 3 < ii) {\n      if (fnArray[i] !== _util.OPS.save || fnArray[i + 1] !== _util.OPS.transform || fnArray[i + 2] !== _util.OPS.paintImageXObject || fnArray[i + 3] !== _util.OPS.restore) {\n        break;\n      }\n      if (argsArray[i + 1][0] !== firstTransformArg0 || argsArray[i + 1][1] !== 0 || argsArray[i + 1][2] !== 0 || argsArray[i + 1][3] !== firstTransformArg3) {\n        break;\n      }\n      if (argsArray[i + 2][0] !== firstPIXOArg0) {\n        break;\n      }\n      i += 4;\n    }\n    var count = Math.min((i - iFirstSave) / 4, MAX_IMAGES_IN_BLOCK);\n    if (count < MIN_IMAGES_IN_BLOCK) {\n      return i;\n    }\n    var positions = new Float32Array(count * 2);\n    var iTransform = iFirstTransform;\n    for (var q = 0; q < count; q++, iTransform += 4) {\n      var transformArgs = argsArray[iTransform];\n      positions[q << 1] = transformArgs[4];\n      positions[(q << 1) + 1] = transformArgs[5];\n    }\n    var args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions];\n    fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageXObjectRepeat);\n    argsArray.splice(iFirstSave, count * 4, args);\n    return iFirstSave + 1;\n  });\n  addState(InitialState, [_util.OPS.beginText, _util.OPS.setFont, _util.OPS.setTextMatrix, _util.OPS.showText, _util.OPS.endText], function (context) {\n    var MIN_CHARS_IN_BLOCK = 3;\n    var MAX_CHARS_IN_BLOCK = 1000;\n    var fnArray = context.fnArray,\n        argsArray = context.argsArray;\n    var curr = context.iCurr;\n    var iFirstBeginText = curr - 4;\n    var iFirstSetFont = curr - 3;\n    var iFirstSetTextMatrix = curr - 2;\n    var iFirstShowText = curr - 1;\n    var iFirstEndText = curr;\n    var firstSetFontArg0 = argsArray[iFirstSetFont][0];\n    var firstSetFontArg1 = argsArray[iFirstSetFont][1];\n    var i = iFirstBeginText + 5;\n    var ii = fnArray.length;\n    while (i + 4 < ii) {\n      if (fnArray[i] !== _util.OPS.beginText || fnArray[i + 1] !== _util.OPS.setFont || fnArray[i + 2] !== _util.OPS.setTextMatrix || fnArray[i + 3] !== _util.OPS.showText || fnArray[i + 4] !== _util.OPS.endText) {\n        break;\n      }\n      if (argsArray[i + 1][0] !== firstSetFontArg0 || argsArray[i + 1][1] !== firstSetFontArg1) {\n        break;\n      }\n      i += 5;\n    }\n    var count = Math.min((i - iFirstBeginText) / 5, MAX_CHARS_IN_BLOCK);\n    if (count < MIN_CHARS_IN_BLOCK) {\n      return i;\n    }\n    var iFirst = iFirstBeginText;\n    if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) {\n      count++;\n      iFirst -= 5;\n    }\n    var iEndText = iFirst + 4;\n    for (var q = 1; q < count; q++) {\n      fnArray.splice(iEndText, 3);\n      argsArray.splice(iEndText, 3);\n      iEndText += 2;\n    }\n    return iEndText + 1;\n  });\n  function QueueOptimizer() {}\n  QueueOptimizer.prototype = {\n    optimize: function QueueOptimizer_optimize(queue) {\n      var fnArray = queue.fnArray,\n          argsArray = queue.argsArray;\n      var context = {\n        iCurr: 0,\n        fnArray: fnArray,\n        argsArray: argsArray\n      };\n      var state;\n      var i = 0,\n          ii = fnArray.length;\n      while (i < ii) {\n        state = (state || InitialState)[fnArray[i]];\n        if (typeof state === 'function') {\n          context.iCurr = i;\n          i = state(context);\n          state = undefined;\n          ii = context.fnArray.length;\n        } else {\n          i++;\n        }\n      }\n    }\n  };\n  return QueueOptimizer;\n}();\nexports.OperatorList = OperatorList;\nexports.PartialEvaluator = PartialEvaluator;\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.JpxImage = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _arithmetic_decoder = __w_pdfjs_require__(9);\n\nvar JpxError = function JpxErrorClosure() {\n  function JpxError(msg) {\n    this.message = 'JPX error: ' + msg;\n  }\n  JpxError.prototype = new Error();\n  JpxError.prototype.name = 'JpxError';\n  JpxError.constructor = JpxError;\n  return JpxError;\n}();\nvar JpxImage = function JpxImageClosure() {\n  var SubbandsGainLog2 = {\n    'LL': 0,\n    'LH': 1,\n    'HL': 1,\n    'HH': 2\n  };\n  function JpxImage() {\n    this.failOnCorruptedImage = false;\n  }\n  JpxImage.prototype = {\n    parse: function JpxImage_parse(data) {\n      var head = (0, _util.readUint16)(data, 0);\n      if (head === 0xFF4F) {\n        this.parseCodestream(data, 0, data.length);\n        return;\n      }\n      var position = 0,\n          length = data.length;\n      while (position < length) {\n        var headerSize = 8;\n        var lbox = (0, _util.readUint32)(data, position);\n        var tbox = (0, _util.readUint32)(data, position + 4);\n        position += headerSize;\n        if (lbox === 1) {\n          lbox = (0, _util.readUint32)(data, position) * 4294967296 + (0, _util.readUint32)(data, position + 4);\n          position += 8;\n          headerSize += 8;\n        }\n        if (lbox === 0) {\n          lbox = length - position + headerSize;\n        }\n        if (lbox < headerSize) {\n          throw new JpxError('Invalid box field size');\n        }\n        var dataLength = lbox - headerSize;\n        var jumpDataLength = true;\n        switch (tbox) {\n          case 0x6A703268:\n            jumpDataLength = false;\n            break;\n          case 0x636F6C72:\n            var method = data[position];\n            if (method === 1) {\n              var colorspace = (0, _util.readUint32)(data, position + 3);\n              switch (colorspace) {\n                case 16:\n                case 17:\n                case 18:\n                  break;\n                default:\n                  (0, _util.warn)('Unknown colorspace ' + colorspace);\n                  break;\n              }\n            } else if (method === 2) {\n              (0, _util.info)('ICC profile not supported');\n            }\n            break;\n          case 0x6A703263:\n            this.parseCodestream(data, position, position + dataLength);\n            break;\n          case 0x6A502020:\n            if ((0, _util.readUint32)(data, position) !== 0x0d0a870a) {\n              (0, _util.warn)('Invalid JP2 signature');\n            }\n            break;\n          case 0x6A501A1A:\n          case 0x66747970:\n          case 0x72726571:\n          case 0x72657320:\n          case 0x69686472:\n            break;\n          default:\n            var headerType = String.fromCharCode(tbox >> 24 & 0xFF, tbox >> 16 & 0xFF, tbox >> 8 & 0xFF, tbox & 0xFF);\n            (0, _util.warn)('Unsupported header type ' + tbox + ' (' + headerType + ')');\n            break;\n        }\n        if (jumpDataLength) {\n          position += dataLength;\n        }\n      }\n    },\n    parseImageProperties: function JpxImage_parseImageProperties(stream) {\n      var newByte = stream.getByte();\n      while (newByte >= 0) {\n        var oldByte = newByte;\n        newByte = stream.getByte();\n        var code = oldByte << 8 | newByte;\n        if (code === 0xFF51) {\n          stream.skip(4);\n          var Xsiz = stream.getInt32() >>> 0;\n          var Ysiz = stream.getInt32() >>> 0;\n          var XOsiz = stream.getInt32() >>> 0;\n          var YOsiz = stream.getInt32() >>> 0;\n          stream.skip(16);\n          var Csiz = stream.getUint16();\n          this.width = Xsiz - XOsiz;\n          this.height = Ysiz - YOsiz;\n          this.componentsCount = Csiz;\n          this.bitsPerComponent = 8;\n          return;\n        }\n      }\n      throw new JpxError('No size marker found in JPX stream');\n    },\n    parseCodestream: function JpxImage_parseCodestream(data, start, end) {\n      var context = {};\n      var doNotRecover = false;\n      try {\n        var position = start;\n        while (position + 1 < end) {\n          var code = (0, _util.readUint16)(data, position);\n          position += 2;\n          var length = 0,\n              j,\n              sqcd,\n              spqcds,\n              spqcdSize,\n              scalarExpounded,\n              tile;\n          switch (code) {\n            case 0xFF4F:\n              context.mainHeader = true;\n              break;\n            case 0xFFD9:\n              break;\n            case 0xFF51:\n              length = (0, _util.readUint16)(data, position);\n              var siz = {};\n              siz.Xsiz = (0, _util.readUint32)(data, position + 4);\n              siz.Ysiz = (0, _util.readUint32)(data, position + 8);\n              siz.XOsiz = (0, _util.readUint32)(data, position + 12);\n              siz.YOsiz = (0, _util.readUint32)(data, position + 16);\n              siz.XTsiz = (0, _util.readUint32)(data, position + 20);\n              siz.YTsiz = (0, _util.readUint32)(data, position + 24);\n              siz.XTOsiz = (0, _util.readUint32)(data, position + 28);\n              siz.YTOsiz = (0, _util.readUint32)(data, position + 32);\n              var componentsCount = (0, _util.readUint16)(data, position + 36);\n              siz.Csiz = componentsCount;\n              var components = [];\n              j = position + 38;\n              for (var i = 0; i < componentsCount; i++) {\n                var component = {\n                  precision: (data[j] & 0x7F) + 1,\n                  isSigned: !!(data[j] & 0x80),\n                  XRsiz: data[j + 1],\n                  YRsiz: data[j + 1]\n                };\n                calculateComponentDimensions(component, siz);\n                components.push(component);\n              }\n              context.SIZ = siz;\n              context.components = components;\n              calculateTileGrids(context, components);\n              context.QCC = [];\n              context.COC = [];\n              break;\n            case 0xFF5C:\n              length = (0, _util.readUint16)(data, position);\n              var qcd = {};\n              j = position + 2;\n              sqcd = data[j++];\n              switch (sqcd & 0x1F) {\n                case 0:\n                  spqcdSize = 8;\n                  scalarExpounded = true;\n                  break;\n                case 1:\n                  spqcdSize = 16;\n                  scalarExpounded = false;\n                  break;\n                case 2:\n                  spqcdSize = 16;\n                  scalarExpounded = true;\n                  break;\n                default:\n                  throw new Error('Invalid SQcd value ' + sqcd);\n              }\n              qcd.noQuantization = spqcdSize === 8;\n              qcd.scalarExpounded = scalarExpounded;\n              qcd.guardBits = sqcd >> 5;\n              spqcds = [];\n              while (j < length + position) {\n                var spqcd = {};\n                if (spqcdSize === 8) {\n                  spqcd.epsilon = data[j++] >> 3;\n                  spqcd.mu = 0;\n                } else {\n                  spqcd.epsilon = data[j] >> 3;\n                  spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1];\n                  j += 2;\n                }\n                spqcds.push(spqcd);\n              }\n              qcd.SPqcds = spqcds;\n              if (context.mainHeader) {\n                context.QCD = qcd;\n              } else {\n                context.currentTile.QCD = qcd;\n                context.currentTile.QCC = [];\n              }\n              break;\n            case 0xFF5D:\n              length = (0, _util.readUint16)(data, position);\n              var qcc = {};\n              j = position + 2;\n              var cqcc;\n              if (context.SIZ.Csiz < 257) {\n                cqcc = data[j++];\n              } else {\n                cqcc = (0, _util.readUint16)(data, j);\n                j += 2;\n              }\n              sqcd = data[j++];\n              switch (sqcd & 0x1F) {\n                case 0:\n                  spqcdSize = 8;\n                  scalarExpounded = true;\n                  break;\n                case 1:\n                  spqcdSize = 16;\n                  scalarExpounded = false;\n                  break;\n                case 2:\n                  spqcdSize = 16;\n                  scalarExpounded = true;\n                  break;\n                default:\n                  throw new Error('Invalid SQcd value ' + sqcd);\n              }\n              qcc.noQuantization = spqcdSize === 8;\n              qcc.scalarExpounded = scalarExpounded;\n              qcc.guardBits = sqcd >> 5;\n              spqcds = [];\n              while (j < length + position) {\n                spqcd = {};\n                if (spqcdSize === 8) {\n                  spqcd.epsilon = data[j++] >> 3;\n                  spqcd.mu = 0;\n                } else {\n                  spqcd.epsilon = data[j] >> 3;\n                  spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1];\n                  j += 2;\n                }\n                spqcds.push(spqcd);\n              }\n              qcc.SPqcds = spqcds;\n              if (context.mainHeader) {\n                context.QCC[cqcc] = qcc;\n              } else {\n                context.currentTile.QCC[cqcc] = qcc;\n              }\n              break;\n            case 0xFF52:\n              length = (0, _util.readUint16)(data, position);\n              var cod = {};\n              j = position + 2;\n              var scod = data[j++];\n              cod.entropyCoderWithCustomPrecincts = !!(scod & 1);\n              cod.sopMarkerUsed = !!(scod & 2);\n              cod.ephMarkerUsed = !!(scod & 4);\n              cod.progressionOrder = data[j++];\n              cod.layersCount = (0, _util.readUint16)(data, j);\n              j += 2;\n              cod.multipleComponentTransform = data[j++];\n              cod.decompositionLevelsCount = data[j++];\n              cod.xcb = (data[j++] & 0xF) + 2;\n              cod.ycb = (data[j++] & 0xF) + 2;\n              var blockStyle = data[j++];\n              cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);\n              cod.resetContextProbabilities = !!(blockStyle & 2);\n              cod.terminationOnEachCodingPass = !!(blockStyle & 4);\n              cod.verticalyStripe = !!(blockStyle & 8);\n              cod.predictableTermination = !!(blockStyle & 16);\n              cod.segmentationSymbolUsed = !!(blockStyle & 32);\n              cod.reversibleTransformation = data[j++];\n              if (cod.entropyCoderWithCustomPrecincts) {\n                var precinctsSizes = [];\n                while (j < length + position) {\n                  var precinctsSize = data[j++];\n                  precinctsSizes.push({\n                    PPx: precinctsSize & 0xF,\n                    PPy: precinctsSize >> 4\n                  });\n                }\n                cod.precinctsSizes = precinctsSizes;\n              }\n              var unsupported = [];\n              if (cod.selectiveArithmeticCodingBypass) {\n                unsupported.push('selectiveArithmeticCodingBypass');\n              }\n              if (cod.resetContextProbabilities) {\n                unsupported.push('resetContextProbabilities');\n              }\n              if (cod.terminationOnEachCodingPass) {\n                unsupported.push('terminationOnEachCodingPass');\n              }\n              if (cod.verticalyStripe) {\n                unsupported.push('verticalyStripe');\n              }\n              if (cod.predictableTermination) {\n                unsupported.push('predictableTermination');\n              }\n              if (unsupported.length > 0) {\n                doNotRecover = true;\n                throw new Error('Unsupported COD options (' + unsupported.join(', ') + ')');\n              }\n              if (context.mainHeader) {\n                context.COD = cod;\n              } else {\n                context.currentTile.COD = cod;\n                context.currentTile.COC = [];\n              }\n              break;\n            case 0xFF90:\n              length = (0, _util.readUint16)(data, position);\n              tile = {};\n              tile.index = (0, _util.readUint16)(data, position + 2);\n              tile.length = (0, _util.readUint32)(data, position + 4);\n              tile.dataEnd = tile.length + position - 2;\n              tile.partIndex = data[position + 8];\n              tile.partsCount = data[position + 9];\n              context.mainHeader = false;\n              if (tile.partIndex === 0) {\n                tile.COD = context.COD;\n                tile.COC = context.COC.slice(0);\n                tile.QCD = context.QCD;\n                tile.QCC = context.QCC.slice(0);\n              }\n              context.currentTile = tile;\n              break;\n            case 0xFF93:\n              tile = context.currentTile;\n              if (tile.partIndex === 0) {\n                initializeTile(context, tile.index);\n                buildPackets(context);\n              }\n              length = tile.dataEnd - position;\n              parseTilePackets(context, data, position, length);\n              break;\n            case 0xFF55:\n            case 0xFF57:\n            case 0xFF58:\n            case 0xFF64:\n              length = (0, _util.readUint16)(data, position);\n              break;\n            case 0xFF53:\n              throw new Error('Codestream code 0xFF53 (COC) is ' + 'not implemented');\n            default:\n              throw new Error('Unknown codestream code: ' + code.toString(16));\n          }\n          position += length;\n        }\n      } catch (e) {\n        if (doNotRecover || this.failOnCorruptedImage) {\n          throw new JpxError(e.message);\n        } else {\n          (0, _util.warn)('JPX: Trying to recover from: ' + e.message);\n        }\n      }\n      this.tiles = transformComponents(context);\n      this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;\n      this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;\n      this.componentsCount = context.SIZ.Csiz;\n    }\n  };\n  function calculateComponentDimensions(component, siz) {\n    component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);\n    component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);\n    component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);\n    component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);\n    component.width = component.x1 - component.x0;\n    component.height = component.y1 - component.y0;\n  }\n  function calculateTileGrids(context, components) {\n    var siz = context.SIZ;\n    var tile,\n        tiles = [];\n    var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);\n    var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);\n    for (var q = 0; q < numYtiles; q++) {\n      for (var p = 0; p < numXtiles; p++) {\n        tile = {};\n        tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);\n        tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);\n        tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);\n        tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);\n        tile.width = tile.tx1 - tile.tx0;\n        tile.height = tile.ty1 - tile.ty0;\n        tile.components = [];\n        tiles.push(tile);\n      }\n    }\n    context.tiles = tiles;\n    var componentsCount = siz.Csiz;\n    for (var i = 0, ii = componentsCount; i < ii; i++) {\n      var component = components[i];\n      for (var j = 0, jj = tiles.length; j < jj; j++) {\n        var tileComponent = {};\n        tile = tiles[j];\n        tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);\n        tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);\n        tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);\n        tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);\n        tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;\n        tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;\n        tile.components[i] = tileComponent;\n      }\n    }\n  }\n  function getBlocksDimensions(context, component, r) {\n    var codOrCoc = component.codingStyleParameters;\n    var result = {};\n    if (!codOrCoc.entropyCoderWithCustomPrecincts) {\n      result.PPx = 15;\n      result.PPy = 15;\n    } else {\n      result.PPx = codOrCoc.precinctsSizes[r].PPx;\n      result.PPy = codOrCoc.precinctsSizes[r].PPy;\n    }\n    result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : Math.min(codOrCoc.xcb, result.PPx);\n    result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : Math.min(codOrCoc.ycb, result.PPy);\n    return result;\n  }\n  function buildPrecincts(context, resolution, dimensions) {\n    var precinctWidth = 1 << dimensions.PPx;\n    var precinctHeight = 1 << dimensions.PPy;\n    var isZeroRes = resolution.resLevel === 0;\n    var precinctWidthInSubband = 1 << dimensions.PPx + (isZeroRes ? 0 : -1);\n    var precinctHeightInSubband = 1 << dimensions.PPy + (isZeroRes ? 0 : -1);\n    var numprecinctswide = resolution.trx1 > resolution.trx0 ? Math.ceil(resolution.trx1 / precinctWidth) - Math.floor(resolution.trx0 / precinctWidth) : 0;\n    var numprecinctshigh = resolution.try1 > resolution.try0 ? Math.ceil(resolution.try1 / precinctHeight) - Math.floor(resolution.try0 / precinctHeight) : 0;\n    var numprecincts = numprecinctswide * numprecinctshigh;\n    resolution.precinctParameters = {\n      precinctWidth: precinctWidth,\n      precinctHeight: precinctHeight,\n      numprecinctswide: numprecinctswide,\n      numprecinctshigh: numprecinctshigh,\n      numprecincts: numprecincts,\n      precinctWidthInSubband: precinctWidthInSubband,\n      precinctHeightInSubband: precinctHeightInSubband\n    };\n  }\n  function buildCodeblocks(context, subband, dimensions) {\n    var xcb_ = dimensions.xcb_;\n    var ycb_ = dimensions.ycb_;\n    var codeblockWidth = 1 << xcb_;\n    var codeblockHeight = 1 << ycb_;\n    var cbx0 = subband.tbx0 >> xcb_;\n    var cby0 = subband.tby0 >> ycb_;\n    var cbx1 = subband.tbx1 + codeblockWidth - 1 >> xcb_;\n    var cby1 = subband.tby1 + codeblockHeight - 1 >> ycb_;\n    var precinctParameters = subband.resolution.precinctParameters;\n    var codeblocks = [];\n    var precincts = [];\n    var i, j, codeblock, precinctNumber;\n    for (j = cby0; j < cby1; j++) {\n      for (i = cbx0; i < cbx1; i++) {\n        codeblock = {\n          cbx: i,\n          cby: j,\n          tbx0: codeblockWidth * i,\n          tby0: codeblockHeight * j,\n          tbx1: codeblockWidth * (i + 1),\n          tby1: codeblockHeight * (j + 1)\n        };\n        codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);\n        codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);\n        codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);\n        codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);\n        var pi = Math.floor((codeblock.tbx0_ - subband.tbx0) / precinctParameters.precinctWidthInSubband);\n        var pj = Math.floor((codeblock.tby0_ - subband.tby0) / precinctParameters.precinctHeightInSubband);\n        precinctNumber = pi + pj * precinctParameters.numprecinctswide;\n        codeblock.precinctNumber = precinctNumber;\n        codeblock.subbandType = subband.type;\n        codeblock.Lblock = 3;\n        if (codeblock.tbx1_ <= codeblock.tbx0_ || codeblock.tby1_ <= codeblock.tby0_) {\n          continue;\n        }\n        codeblocks.push(codeblock);\n        var precinct = precincts[precinctNumber];\n        if (precinct !== undefined) {\n          if (i < precinct.cbxMin) {\n            precinct.cbxMin = i;\n          } else if (i > precinct.cbxMax) {\n            precinct.cbxMax = i;\n          }\n          if (j < precinct.cbyMin) {\n            precinct.cbxMin = j;\n          } else if (j > precinct.cbyMax) {\n            precinct.cbyMax = j;\n          }\n        } else {\n          precincts[precinctNumber] = precinct = {\n            cbxMin: i,\n            cbyMin: j,\n            cbxMax: i,\n            cbyMax: j\n          };\n        }\n        codeblock.precinct = precinct;\n      }\n    }\n    subband.codeblockParameters = {\n      codeblockWidth: xcb_,\n      codeblockHeight: ycb_,\n      numcodeblockwide: cbx1 - cbx0 + 1,\n      numcodeblockhigh: cby1 - cby0 + 1\n    };\n    subband.codeblocks = codeblocks;\n    subband.precincts = precincts;\n  }\n  function createPacket(resolution, precinctNumber, layerNumber) {\n    var precinctCodeblocks = [];\n    var subbands = resolution.subbands;\n    for (var i = 0, ii = subbands.length; i < ii; i++) {\n      var subband = subbands[i];\n      var codeblocks = subband.codeblocks;\n      for (var j = 0, jj = codeblocks.length; j < jj; j++) {\n        var codeblock = codeblocks[j];\n        if (codeblock.precinctNumber !== precinctNumber) {\n          continue;\n        }\n        precinctCodeblocks.push(codeblock);\n      }\n    }\n    return {\n      layerNumber: layerNumber,\n      codeblocks: precinctCodeblocks\n    };\n  }\n  function LayerResolutionComponentPositionIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var maxDecompositionLevelsCount = 0;\n    for (var q = 0; q < componentsCount; q++) {\n      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount);\n    }\n    var l = 0,\n        r = 0,\n        i = 0,\n        k = 0;\n    this.nextPacket = function JpxImage_nextPacket() {\n      for (; l < layersCount; l++) {\n        for (; r <= maxDecompositionLevelsCount; r++) {\n          for (; i < componentsCount; i++) {\n            var component = tile.components[i];\n            if (r > component.codingStyleParameters.decompositionLevelsCount) {\n              continue;\n            }\n            var resolution = component.resolutions[r];\n            var numprecincts = resolution.precinctParameters.numprecincts;\n            for (; k < numprecincts;) {\n              var packet = createPacket(resolution, k, l);\n              k++;\n              return packet;\n            }\n            k = 0;\n          }\n          i = 0;\n        }\n        r = 0;\n      }\n      throw new JpxError('Out of packets');\n    };\n  }\n  function ResolutionLayerComponentPositionIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var maxDecompositionLevelsCount = 0;\n    for (var q = 0; q < componentsCount; q++) {\n      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount);\n    }\n    var r = 0,\n        l = 0,\n        i = 0,\n        k = 0;\n    this.nextPacket = function JpxImage_nextPacket() {\n      for (; r <= maxDecompositionLevelsCount; r++) {\n        for (; l < layersCount; l++) {\n          for (; i < componentsCount; i++) {\n            var component = tile.components[i];\n            if (r > component.codingStyleParameters.decompositionLevelsCount) {\n              continue;\n            }\n            var resolution = component.resolutions[r];\n            var numprecincts = resolution.precinctParameters.numprecincts;\n            for (; k < numprecincts;) {\n              var packet = createPacket(resolution, k, l);\n              k++;\n              return packet;\n            }\n            k = 0;\n          }\n          i = 0;\n        }\n        l = 0;\n      }\n      throw new JpxError('Out of packets');\n    };\n  }\n  function ResolutionPositionComponentLayerIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var l, r, c, p;\n    var maxDecompositionLevelsCount = 0;\n    for (c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, component.codingStyleParameters.decompositionLevelsCount);\n    }\n    var maxNumPrecinctsInLevel = new Int32Array(maxDecompositionLevelsCount + 1);\n    for (r = 0; r <= maxDecompositionLevelsCount; ++r) {\n      var maxNumPrecincts = 0;\n      for (c = 0; c < componentsCount; ++c) {\n        var resolutions = tile.components[c].resolutions;\n        if (r < resolutions.length) {\n          maxNumPrecincts = Math.max(maxNumPrecincts, resolutions[r].precinctParameters.numprecincts);\n        }\n      }\n      maxNumPrecinctsInLevel[r] = maxNumPrecincts;\n    }\n    l = 0;\n    r = 0;\n    c = 0;\n    p = 0;\n    this.nextPacket = function JpxImage_nextPacket() {\n      for (; r <= maxDecompositionLevelsCount; r++) {\n        for (; p < maxNumPrecinctsInLevel[r]; p++) {\n          for (; c < componentsCount; c++) {\n            var component = tile.components[c];\n            if (r > component.codingStyleParameters.decompositionLevelsCount) {\n              continue;\n            }\n            var resolution = component.resolutions[r];\n            var numprecincts = resolution.precinctParameters.numprecincts;\n            if (p >= numprecincts) {\n              continue;\n            }\n            for (; l < layersCount;) {\n              var packet = createPacket(resolution, p, l);\n              l++;\n              return packet;\n            }\n            l = 0;\n          }\n          c = 0;\n        }\n        p = 0;\n      }\n      throw new JpxError('Out of packets');\n    };\n  }\n  function PositionComponentResolutionLayerIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var precinctsSizes = getPrecinctSizesInImageScale(tile);\n    var precinctsIterationSizes = precinctsSizes;\n    var l = 0,\n        r = 0,\n        c = 0,\n        px = 0,\n        py = 0;\n    this.nextPacket = function JpxImage_nextPacket() {\n      for (; py < precinctsIterationSizes.maxNumHigh; py++) {\n        for (; px < precinctsIterationSizes.maxNumWide; px++) {\n          for (; c < componentsCount; c++) {\n            var component = tile.components[c];\n            var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;\n            for (; r <= decompositionLevelsCount; r++) {\n              var resolution = component.resolutions[r];\n              var sizeInImageScale = precinctsSizes.components[c].resolutions[r];\n              var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution);\n              if (k === null) {\n                continue;\n              }\n              for (; l < layersCount;) {\n                var packet = createPacket(resolution, k, l);\n                l++;\n                return packet;\n              }\n              l = 0;\n            }\n            r = 0;\n          }\n          c = 0;\n        }\n        px = 0;\n      }\n      throw new JpxError('Out of packets');\n    };\n  }\n  function ComponentPositionResolutionLayerIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var precinctsSizes = getPrecinctSizesInImageScale(tile);\n    var l = 0,\n        r = 0,\n        c = 0,\n        px = 0,\n        py = 0;\n    this.nextPacket = function JpxImage_nextPacket() {\n      for (; c < componentsCount; ++c) {\n        var component = tile.components[c];\n        var precinctsIterationSizes = precinctsSizes.components[c];\n        var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;\n        for (; py < precinctsIterationSizes.maxNumHigh; py++) {\n          for (; px < precinctsIterationSizes.maxNumWide; px++) {\n            for (; r <= decompositionLevelsCount; r++) {\n              var resolution = component.resolutions[r];\n              var sizeInImageScale = precinctsIterationSizes.resolutions[r];\n              var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution);\n              if (k === null) {\n                continue;\n              }\n              for (; l < layersCount;) {\n                var packet = createPacket(resolution, k, l);\n                l++;\n                return packet;\n              }\n              l = 0;\n            }\n            r = 0;\n          }\n          px = 0;\n        }\n        py = 0;\n      }\n      throw new JpxError('Out of packets');\n    };\n  }\n  function getPrecinctIndexIfExist(pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) {\n    var posX = pxIndex * precinctIterationSizes.minWidth;\n    var posY = pyIndex * precinctIterationSizes.minHeight;\n    if (posX % sizeInImageScale.width !== 0 || posY % sizeInImageScale.height !== 0) {\n      return null;\n    }\n    var startPrecinctRowIndex = posY / sizeInImageScale.width * resolution.precinctParameters.numprecinctswide;\n    return posX / sizeInImageScale.height + startPrecinctRowIndex;\n  }\n  function getPrecinctSizesInImageScale(tile) {\n    var componentsCount = tile.components.length;\n    var minWidth = Number.MAX_VALUE;\n    var minHeight = Number.MAX_VALUE;\n    var maxNumWide = 0;\n    var maxNumHigh = 0;\n    var sizePerComponent = new Array(componentsCount);\n    for (var c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;\n      var sizePerResolution = new Array(decompositionLevelsCount + 1);\n      var minWidthCurrentComponent = Number.MAX_VALUE;\n      var minHeightCurrentComponent = Number.MAX_VALUE;\n      var maxNumWideCurrentComponent = 0;\n      var maxNumHighCurrentComponent = 0;\n      var scale = 1;\n      for (var r = decompositionLevelsCount; r >= 0; --r) {\n        var resolution = component.resolutions[r];\n        var widthCurrentResolution = scale * resolution.precinctParameters.precinctWidth;\n        var heightCurrentResolution = scale * resolution.precinctParameters.precinctHeight;\n        minWidthCurrentComponent = Math.min(minWidthCurrentComponent, widthCurrentResolution);\n        minHeightCurrentComponent = Math.min(minHeightCurrentComponent, heightCurrentResolution);\n        maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent, resolution.precinctParameters.numprecinctswide);\n        maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent, resolution.precinctParameters.numprecinctshigh);\n        sizePerResolution[r] = {\n          width: widthCurrentResolution,\n          height: heightCurrentResolution\n        };\n        scale <<= 1;\n      }\n      minWidth = Math.min(minWidth, minWidthCurrentComponent);\n      minHeight = Math.min(minHeight, minHeightCurrentComponent);\n      maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent);\n      maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent);\n      sizePerComponent[c] = {\n        resolutions: sizePerResolution,\n        minWidth: minWidthCurrentComponent,\n        minHeight: minHeightCurrentComponent,\n        maxNumWide: maxNumWideCurrentComponent,\n        maxNumHigh: maxNumHighCurrentComponent\n      };\n    }\n    return {\n      components: sizePerComponent,\n      minWidth: minWidth,\n      minHeight: minHeight,\n      maxNumWide: maxNumWide,\n      maxNumHigh: maxNumHigh\n    };\n  }\n  function buildPackets(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var componentsCount = siz.Csiz;\n    for (var c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;\n      var resolutions = [];\n      var subbands = [];\n      for (var r = 0; r <= decompositionLevelsCount; r++) {\n        var blocksDimensions = getBlocksDimensions(context, component, r);\n        var resolution = {};\n        var scale = 1 << decompositionLevelsCount - r;\n        resolution.trx0 = Math.ceil(component.tcx0 / scale);\n        resolution.try0 = Math.ceil(component.tcy0 / scale);\n        resolution.trx1 = Math.ceil(component.tcx1 / scale);\n        resolution.try1 = Math.ceil(component.tcy1 / scale);\n        resolution.resLevel = r;\n        buildPrecincts(context, resolution, blocksDimensions);\n        resolutions.push(resolution);\n        var subband;\n        if (r === 0) {\n          subband = {};\n          subband.type = 'LL';\n          subband.tbx0 = Math.ceil(component.tcx0 / scale);\n          subband.tby0 = Math.ceil(component.tcy0 / scale);\n          subband.tbx1 = Math.ceil(component.tcx1 / scale);\n          subband.tby1 = Math.ceil(component.tcy1 / scale);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolution.subbands = [subband];\n        } else {\n          var bscale = 1 << decompositionLevelsCount - r + 1;\n          var resolutionSubbands = [];\n          subband = {};\n          subband.type = 'HL';\n          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);\n          subband.tby0 = Math.ceil(component.tcy0 / bscale);\n          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);\n          subband.tby1 = Math.ceil(component.tcy1 / bscale);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolutionSubbands.push(subband);\n          subband = {};\n          subband.type = 'LH';\n          subband.tbx0 = Math.ceil(component.tcx0 / bscale);\n          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);\n          subband.tbx1 = Math.ceil(component.tcx1 / bscale);\n          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolutionSubbands.push(subband);\n          subband = {};\n          subband.type = 'HH';\n          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);\n          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);\n          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);\n          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolutionSubbands.push(subband);\n          resolution.subbands = resolutionSubbands;\n        }\n      }\n      component.resolutions = resolutions;\n      component.subbands = subbands;\n    }\n    var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;\n    switch (progressionOrder) {\n      case 0:\n        tile.packetsIterator = new LayerResolutionComponentPositionIterator(context);\n        break;\n      case 1:\n        tile.packetsIterator = new ResolutionLayerComponentPositionIterator(context);\n        break;\n      case 2:\n        tile.packetsIterator = new ResolutionPositionComponentLayerIterator(context);\n        break;\n      case 3:\n        tile.packetsIterator = new PositionComponentResolutionLayerIterator(context);\n        break;\n      case 4:\n        tile.packetsIterator = new ComponentPositionResolutionLayerIterator(context);\n        break;\n      default:\n        throw new JpxError('Unsupported progression order ' + progressionOrder);\n    }\n  }\n  function parseTilePackets(context, data, offset, dataLength) {\n    var position = 0;\n    var buffer,\n        bufferSize = 0,\n        skipNextBit = false;\n    function readBits(count) {\n      while (bufferSize < count) {\n        var b = data[offset + position];\n        position++;\n        if (skipNextBit) {\n          buffer = buffer << 7 | b;\n          bufferSize += 7;\n          skipNextBit = false;\n        } else {\n          buffer = buffer << 8 | b;\n          bufferSize += 8;\n        }\n        if (b === 0xFF) {\n          skipNextBit = true;\n        }\n      }\n      bufferSize -= count;\n      return buffer >>> bufferSize & (1 << count) - 1;\n    }\n    function skipMarkerIfEqual(value) {\n      if (data[offset + position - 1] === 0xFF && data[offset + position] === value) {\n        skipBytes(1);\n        return true;\n      } else if (data[offset + position] === 0xFF && data[offset + position + 1] === value) {\n        skipBytes(2);\n        return true;\n      }\n      return false;\n    }\n    function skipBytes(count) {\n      position += count;\n    }\n    function alignToByte() {\n      bufferSize = 0;\n      if (skipNextBit) {\n        position++;\n        skipNextBit = false;\n      }\n    }\n    function readCodingpasses() {\n      if (readBits(1) === 0) {\n        return 1;\n      }\n      if (readBits(1) === 0) {\n        return 2;\n      }\n      var value = readBits(2);\n      if (value < 3) {\n        return value + 3;\n      }\n      value = readBits(5);\n      if (value < 31) {\n        return value + 6;\n      }\n      value = readBits(7);\n      return value + 37;\n    }\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var sopMarkerUsed = context.COD.sopMarkerUsed;\n    var ephMarkerUsed = context.COD.ephMarkerUsed;\n    var packetsIterator = tile.packetsIterator;\n    while (position < dataLength) {\n      alignToByte();\n      if (sopMarkerUsed && skipMarkerIfEqual(0x91)) {\n        skipBytes(4);\n      }\n      var packet = packetsIterator.nextPacket();\n      if (!readBits(1)) {\n        continue;\n      }\n      var layerNumber = packet.layerNumber;\n      var queue = [],\n          codeblock;\n      for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {\n        codeblock = packet.codeblocks[i];\n        var precinct = codeblock.precinct;\n        var codeblockColumn = codeblock.cbx - precinct.cbxMin;\n        var codeblockRow = codeblock.cby - precinct.cbyMin;\n        var codeblockIncluded = false;\n        var firstTimeInclusion = false;\n        var valueReady;\n        if (codeblock['included'] !== undefined) {\n          codeblockIncluded = !!readBits(1);\n        } else {\n          precinct = codeblock.precinct;\n          var inclusionTree, zeroBitPlanesTree;\n          if (precinct['inclusionTree'] !== undefined) {\n            inclusionTree = precinct.inclusionTree;\n          } else {\n            var width = precinct.cbxMax - precinct.cbxMin + 1;\n            var height = precinct.cbyMax - precinct.cbyMin + 1;\n            inclusionTree = new InclusionTree(width, height, layerNumber);\n            zeroBitPlanesTree = new TagTree(width, height);\n            precinct.inclusionTree = inclusionTree;\n            precinct.zeroBitPlanesTree = zeroBitPlanesTree;\n          }\n          if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {\n            while (true) {\n              if (readBits(1)) {\n                valueReady = !inclusionTree.nextLevel();\n                if (valueReady) {\n                  codeblock.included = true;\n                  codeblockIncluded = firstTimeInclusion = true;\n                  break;\n                }\n              } else {\n                inclusionTree.incrementValue(layerNumber);\n                break;\n              }\n            }\n          }\n        }\n        if (!codeblockIncluded) {\n          continue;\n        }\n        if (firstTimeInclusion) {\n          zeroBitPlanesTree = precinct.zeroBitPlanesTree;\n          zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);\n          while (true) {\n            if (readBits(1)) {\n              valueReady = !zeroBitPlanesTree.nextLevel();\n              if (valueReady) {\n                break;\n              }\n            } else {\n              zeroBitPlanesTree.incrementValue();\n            }\n          }\n          codeblock.zeroBitPlanes = zeroBitPlanesTree.value;\n        }\n        var codingpasses = readCodingpasses();\n        while (readBits(1)) {\n          codeblock.Lblock++;\n        }\n        var codingpassesLog2 = (0, _util.log2)(codingpasses);\n        var bits = (codingpasses < 1 << codingpassesLog2 ? codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock;\n        var codedDataLength = readBits(bits);\n        queue.push({\n          codeblock: codeblock,\n          codingpasses: codingpasses,\n          dataLength: codedDataLength\n        });\n      }\n      alignToByte();\n      if (ephMarkerUsed) {\n        skipMarkerIfEqual(0x92);\n      }\n      while (queue.length > 0) {\n        var packetItem = queue.shift();\n        codeblock = packetItem.codeblock;\n        if (codeblock['data'] === undefined) {\n          codeblock.data = [];\n        }\n        codeblock.data.push({\n          data: data,\n          start: offset + position,\n          end: offset + position + packetItem.dataLength,\n          codingpasses: packetItem.codingpasses\n        });\n        position += packetItem.dataLength;\n      }\n    }\n    return position;\n  }\n  function copyCoefficients(coefficients, levelWidth, levelHeight, subband, delta, mb, reversible, segmentationSymbolUsed) {\n    var x0 = subband.tbx0;\n    var y0 = subband.tby0;\n    var width = subband.tbx1 - subband.tbx0;\n    var codeblocks = subband.codeblocks;\n    var right = subband.type.charAt(0) === 'H' ? 1 : 0;\n    var bottom = subband.type.charAt(1) === 'H' ? levelWidth : 0;\n    for (var i = 0, ii = codeblocks.length; i < ii; ++i) {\n      var codeblock = codeblocks[i];\n      var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;\n      var blockHeight = codeblock.tby1_ - codeblock.tby0_;\n      if (blockWidth === 0 || blockHeight === 0) {\n        continue;\n      }\n      if (codeblock['data'] === undefined) {\n        continue;\n      }\n      var bitModel, currentCodingpassType;\n      bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, codeblock.zeroBitPlanes, mb);\n      currentCodingpassType = 2;\n      var data = codeblock.data,\n          totalLength = 0,\n          codingpasses = 0;\n      var j, jj, dataItem;\n      for (j = 0, jj = data.length; j < jj; j++) {\n        dataItem = data[j];\n        totalLength += dataItem.end - dataItem.start;\n        codingpasses += dataItem.codingpasses;\n      }\n      var encodedData = new Uint8Array(totalLength);\n      var position = 0;\n      for (j = 0, jj = data.length; j < jj; j++) {\n        dataItem = data[j];\n        var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);\n        encodedData.set(chunk, position);\n        position += chunk.length;\n      }\n      var decoder = new _arithmetic_decoder.ArithmeticDecoder(encodedData, 0, totalLength);\n      bitModel.setDecoder(decoder);\n      for (j = 0; j < codingpasses; j++) {\n        switch (currentCodingpassType) {\n          case 0:\n            bitModel.runSignificancePropagationPass();\n            break;\n          case 1:\n            bitModel.runMagnitudeRefinementPass();\n            break;\n          case 2:\n            bitModel.runCleanupPass();\n            if (segmentationSymbolUsed) {\n              bitModel.checkSegmentationSymbol();\n            }\n            break;\n        }\n        currentCodingpassType = (currentCodingpassType + 1) % 3;\n      }\n      var offset = codeblock.tbx0_ - x0 + (codeblock.tby0_ - y0) * width;\n      var sign = bitModel.coefficentsSign;\n      var magnitude = bitModel.coefficentsMagnitude;\n      var bitsDecoded = bitModel.bitsDecoded;\n      var magnitudeCorrection = reversible ? 0 : 0.5;\n      var k, n, nb;\n      position = 0;\n      var interleave = subband.type !== 'LL';\n      for (j = 0; j < blockHeight; j++) {\n        var row = offset / width | 0;\n        var levelOffset = 2 * row * (levelWidth - width) + right + bottom;\n        for (k = 0; k < blockWidth; k++) {\n          n = magnitude[position];\n          if (n !== 0) {\n            n = (n + magnitudeCorrection) * delta;\n            if (sign[position] !== 0) {\n              n = -n;\n            }\n            nb = bitsDecoded[position];\n            var pos = interleave ? levelOffset + (offset << 1) : offset;\n            if (reversible && nb >= mb) {\n              coefficients[pos] = n;\n            } else {\n              coefficients[pos] = n * (1 << mb - nb);\n            }\n          }\n          offset++;\n          position++;\n        }\n        offset += width - blockWidth;\n      }\n    }\n  }\n  function transformTile(context, tile, c) {\n    var component = tile.components[c];\n    var codingStyleParameters = component.codingStyleParameters;\n    var quantizationParameters = component.quantizationParameters;\n    var decompositionLevelsCount = codingStyleParameters.decompositionLevelsCount;\n    var spqcds = quantizationParameters.SPqcds;\n    var scalarExpounded = quantizationParameters.scalarExpounded;\n    var guardBits = quantizationParameters.guardBits;\n    var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed;\n    var precision = context.components[c].precision;\n    var reversible = codingStyleParameters.reversibleTransformation;\n    var transform = reversible ? new ReversibleTransform() : new IrreversibleTransform();\n    var subbandCoefficients = [];\n    var b = 0;\n    for (var i = 0; i <= decompositionLevelsCount; i++) {\n      var resolution = component.resolutions[i];\n      var width = resolution.trx1 - resolution.trx0;\n      var height = resolution.try1 - resolution.try0;\n      var coefficients = new Float32Array(width * height);\n      for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {\n        var mu, epsilon;\n        if (!scalarExpounded) {\n          mu = spqcds[0].mu;\n          epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);\n        } else {\n          mu = spqcds[b].mu;\n          epsilon = spqcds[b].epsilon;\n          b++;\n        }\n        var subband = resolution.subbands[j];\n        var gainLog2 = SubbandsGainLog2[subband.type];\n        var delta = reversible ? 1 : Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048);\n        var mb = guardBits + epsilon - 1;\n        copyCoefficients(coefficients, width, height, subband, delta, mb, reversible, segmentationSymbolUsed);\n      }\n      subbandCoefficients.push({\n        width: width,\n        height: height,\n        items: coefficients\n      });\n    }\n    var result = transform.calculate(subbandCoefficients, component.tcx0, component.tcy0);\n    return {\n      left: component.tcx0,\n      top: component.tcy0,\n      width: result.width,\n      height: result.height,\n      items: result.items\n    };\n  }\n  function transformComponents(context) {\n    var siz = context.SIZ;\n    var components = context.components;\n    var componentsCount = siz.Csiz;\n    var resultImages = [];\n    for (var i = 0, ii = context.tiles.length; i < ii; i++) {\n      var tile = context.tiles[i];\n      var transformedTiles = [];\n      var c;\n      for (c = 0; c < componentsCount; c++) {\n        transformedTiles[c] = transformTile(context, tile, c);\n      }\n      var tile0 = transformedTiles[0];\n      var out = new Uint8Array(tile0.items.length * componentsCount);\n      var result = {\n        left: tile0.left,\n        top: tile0.top,\n        width: tile0.width,\n        height: tile0.height,\n        items: out\n      };\n      var shift, offset, max, min, maxK;\n      var pos = 0,\n          j,\n          jj,\n          y0,\n          y1,\n          y2,\n          r,\n          g,\n          b,\n          k,\n          val;\n      if (tile.codingStyleDefaultParameters.multipleComponentTransform) {\n        var fourComponents = componentsCount === 4;\n        var y0items = transformedTiles[0].items;\n        var y1items = transformedTiles[1].items;\n        var y2items = transformedTiles[2].items;\n        var y3items = fourComponents ? transformedTiles[3].items : null;\n        shift = components[0].precision - 8;\n        offset = (128 << shift) + 0.5;\n        max = 255 * (1 << shift);\n        maxK = max * 0.5;\n        min = -maxK;\n        var component0 = tile.components[0];\n        var alpha01 = componentsCount - 3;\n        jj = y0items.length;\n        if (!component0.codingStyleParameters.reversibleTransformation) {\n          for (j = 0; j < jj; j++, pos += alpha01) {\n            y0 = y0items[j] + offset;\n            y1 = y1items[j];\n            y2 = y2items[j];\n            r = y0 + 1.402 * y2;\n            g = y0 - 0.34413 * y1 - 0.71414 * y2;\n            b = y0 + 1.772 * y1;\n            out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift;\n            out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift;\n            out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift;\n          }\n        } else {\n          for (j = 0; j < jj; j++, pos += alpha01) {\n            y0 = y0items[j] + offset;\n            y1 = y1items[j];\n            y2 = y2items[j];\n            g = y0 - (y2 + y1 >> 2);\n            r = g + y2;\n            b = g + y1;\n            out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift;\n            out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift;\n            out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift;\n          }\n        }\n        if (fourComponents) {\n          for (j = 0, pos = 3; j < jj; j++, pos += 4) {\n            k = y3items[j];\n            out[pos] = k <= min ? 0 : k >= maxK ? 255 : k + offset >> shift;\n          }\n        }\n      } else {\n        for (c = 0; c < componentsCount; c++) {\n          var items = transformedTiles[c].items;\n          shift = components[c].precision - 8;\n          offset = (128 << shift) + 0.5;\n          max = 127.5 * (1 << shift);\n          min = -max;\n          for (pos = c, j = 0, jj = items.length; j < jj; j++) {\n            val = items[j];\n            out[pos] = val <= min ? 0 : val >= max ? 255 : val + offset >> shift;\n            pos += componentsCount;\n          }\n        }\n      }\n      resultImages.push(result);\n    }\n    return resultImages;\n  }\n  function initializeTile(context, tileIndex) {\n    var siz = context.SIZ;\n    var componentsCount = siz.Csiz;\n    var tile = context.tiles[tileIndex];\n    for (var c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      var qcdOrQcc = context.currentTile.QCC[c] !== undefined ? context.currentTile.QCC[c] : context.currentTile.QCD;\n      component.quantizationParameters = qcdOrQcc;\n      var codOrCoc = context.currentTile.COC[c] !== undefined ? context.currentTile.COC[c] : context.currentTile.COD;\n      component.codingStyleParameters = codOrCoc;\n    }\n    tile.codingStyleDefaultParameters = context.currentTile.COD;\n  }\n  var TagTree = function TagTreeClosure() {\n    function TagTree(width, height) {\n      var levelsLength = (0, _util.log2)(Math.max(width, height)) + 1;\n      this.levels = [];\n      for (var i = 0; i < levelsLength; i++) {\n        var level = {\n          width: width,\n          height: height,\n          items: []\n        };\n        this.levels.push(level);\n        width = Math.ceil(width / 2);\n        height = Math.ceil(height / 2);\n      }\n    }\n    TagTree.prototype = {\n      reset: function TagTree_reset(i, j) {\n        var currentLevel = 0,\n            value = 0,\n            level;\n        while (currentLevel < this.levels.length) {\n          level = this.levels[currentLevel];\n          var index = i + j * level.width;\n          if (level.items[index] !== undefined) {\n            value = level.items[index];\n            break;\n          }\n          level.index = index;\n          i >>= 1;\n          j >>= 1;\n          currentLevel++;\n        }\n        currentLevel--;\n        level = this.levels[currentLevel];\n        level.items[level.index] = value;\n        this.currentLevel = currentLevel;\n        delete this.value;\n      },\n      incrementValue: function TagTree_incrementValue() {\n        var level = this.levels[this.currentLevel];\n        level.items[level.index]++;\n      },\n      nextLevel: function TagTree_nextLevel() {\n        var currentLevel = this.currentLevel;\n        var level = this.levels[currentLevel];\n        var value = level.items[level.index];\n        currentLevel--;\n        if (currentLevel < 0) {\n          this.value = value;\n          return false;\n        }\n        this.currentLevel = currentLevel;\n        level = this.levels[currentLevel];\n        level.items[level.index] = value;\n        return true;\n      }\n    };\n    return TagTree;\n  }();\n  var InclusionTree = function InclusionTreeClosure() {\n    function InclusionTree(width, height, defaultValue) {\n      var levelsLength = (0, _util.log2)(Math.max(width, height)) + 1;\n      this.levels = [];\n      for (var i = 0; i < levelsLength; i++) {\n        var items = new Uint8Array(width * height);\n        for (var j = 0, jj = items.length; j < jj; j++) {\n          items[j] = defaultValue;\n        }\n        var level = {\n          width: width,\n          height: height,\n          items: items\n        };\n        this.levels.push(level);\n        width = Math.ceil(width / 2);\n        height = Math.ceil(height / 2);\n      }\n    }\n    InclusionTree.prototype = {\n      reset: function InclusionTree_reset(i, j, stopValue) {\n        var currentLevel = 0;\n        while (currentLevel < this.levels.length) {\n          var level = this.levels[currentLevel];\n          var index = i + j * level.width;\n          level.index = index;\n          var value = level.items[index];\n          if (value === 0xFF) {\n            break;\n          }\n          if (value > stopValue) {\n            this.currentLevel = currentLevel;\n            this.propagateValues();\n            return false;\n          }\n          i >>= 1;\n          j >>= 1;\n          currentLevel++;\n        }\n        this.currentLevel = currentLevel - 1;\n        return true;\n      },\n      incrementValue: function InclusionTree_incrementValue(stopValue) {\n        var level = this.levels[this.currentLevel];\n        level.items[level.index] = stopValue + 1;\n        this.propagateValues();\n      },\n      propagateValues: function InclusionTree_propagateValues() {\n        var levelIndex = this.currentLevel;\n        var level = this.levels[levelIndex];\n        var currentValue = level.items[level.index];\n        while (--levelIndex >= 0) {\n          level = this.levels[levelIndex];\n          level.items[level.index] = currentValue;\n        }\n      },\n      nextLevel: function InclusionTree_nextLevel() {\n        var currentLevel = this.currentLevel;\n        var level = this.levels[currentLevel];\n        var value = level.items[level.index];\n        level.items[level.index] = 0xFF;\n        currentLevel--;\n        if (currentLevel < 0) {\n          return false;\n        }\n        this.currentLevel = currentLevel;\n        level = this.levels[currentLevel];\n        level.items[level.index] = value;\n        return true;\n      }\n    };\n    return InclusionTree;\n  }();\n  var BitModel = function BitModelClosure() {\n    var UNIFORM_CONTEXT = 17;\n    var RUNLENGTH_CONTEXT = 18;\n    var LLAndLHContextsLabel = new Uint8Array([0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8]);\n    var HLContextLabel = new Uint8Array([0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8]);\n    var HHContextLabel = new Uint8Array([0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5, 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8]);\n    function BitModel(width, height, subband, zeroBitPlanes, mb) {\n      this.width = width;\n      this.height = height;\n      this.contextLabelTable = subband === 'HH' ? HHContextLabel : subband === 'HL' ? HLContextLabel : LLAndLHContextsLabel;\n      var coefficientCount = width * height;\n      this.neighborsSignificance = new Uint8Array(coefficientCount);\n      this.coefficentsSign = new Uint8Array(coefficientCount);\n      this.coefficentsMagnitude = mb > 14 ? new Uint32Array(coefficientCount) : mb > 6 ? new Uint16Array(coefficientCount) : new Uint8Array(coefficientCount);\n      this.processingFlags = new Uint8Array(coefficientCount);\n      var bitsDecoded = new Uint8Array(coefficientCount);\n      if (zeroBitPlanes !== 0) {\n        for (var i = 0; i < coefficientCount; i++) {\n          bitsDecoded[i] = zeroBitPlanes;\n        }\n      }\n      this.bitsDecoded = bitsDecoded;\n      this.reset();\n    }\n    BitModel.prototype = {\n      setDecoder: function BitModel_setDecoder(decoder) {\n        this.decoder = decoder;\n      },\n      reset: function BitModel_reset() {\n        this.contexts = new Int8Array(19);\n        this.contexts[0] = 4 << 1 | 0;\n        this.contexts[UNIFORM_CONTEXT] = 46 << 1 | 0;\n        this.contexts[RUNLENGTH_CONTEXT] = 3 << 1 | 0;\n      },\n      setNeighborsSignificance: function BitModel_setNeighborsSignificance(row, column, index) {\n        var neighborsSignificance = this.neighborsSignificance;\n        var width = this.width,\n            height = this.height;\n        var left = column > 0;\n        var right = column + 1 < width;\n        var i;\n        if (row > 0) {\n          i = index - width;\n          if (left) {\n            neighborsSignificance[i - 1] += 0x10;\n          }\n          if (right) {\n            neighborsSignificance[i + 1] += 0x10;\n          }\n          neighborsSignificance[i] += 0x04;\n        }\n        if (row + 1 < height) {\n          i = index + width;\n          if (left) {\n            neighborsSignificance[i - 1] += 0x10;\n          }\n          if (right) {\n            neighborsSignificance[i + 1] += 0x10;\n          }\n          neighborsSignificance[i] += 0x04;\n        }\n        if (left) {\n          neighborsSignificance[index - 1] += 0x01;\n        }\n        if (right) {\n          neighborsSignificance[index + 1] += 0x01;\n        }\n        neighborsSignificance[index] |= 0x80;\n      },\n      runSignificancePropagationPass: function BitModel_runSignificancePropagationPass() {\n        var decoder = this.decoder;\n        var width = this.width,\n            height = this.height;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var coefficentsSign = this.coefficentsSign;\n        var neighborsSignificance = this.neighborsSignificance;\n        var processingFlags = this.processingFlags;\n        var contexts = this.contexts;\n        var labels = this.contextLabelTable;\n        var bitsDecoded = this.bitsDecoded;\n        var processedInverseMask = ~1;\n        var processedMask = 1;\n        var firstMagnitudeBitMask = 2;\n        for (var i0 = 0; i0 < height; i0 += 4) {\n          for (var j = 0; j < width; j++) {\n            var index = i0 * width + j;\n            for (var i1 = 0; i1 < 4; i1++, index += width) {\n              var i = i0 + i1;\n              if (i >= height) {\n                break;\n              }\n              processingFlags[index] &= processedInverseMask;\n              if (coefficentsMagnitude[index] || !neighborsSignificance[index]) {\n                continue;\n              }\n              var contextLabel = labels[neighborsSignificance[index]];\n              var decision = decoder.readBit(contexts, contextLabel);\n              if (decision) {\n                var sign = this.decodeSignBit(i, j, index);\n                coefficentsSign[index] = sign;\n                coefficentsMagnitude[index] = 1;\n                this.setNeighborsSignificance(i, j, index);\n                processingFlags[index] |= firstMagnitudeBitMask;\n              }\n              bitsDecoded[index]++;\n              processingFlags[index] |= processedMask;\n            }\n          }\n        }\n      },\n      decodeSignBit: function BitModel_decodeSignBit(row, column, index) {\n        var width = this.width,\n            height = this.height;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var coefficentsSign = this.coefficentsSign;\n        var contribution, sign0, sign1, significance1;\n        var contextLabel, decoded;\n        significance1 = column > 0 && coefficentsMagnitude[index - 1] !== 0;\n        if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) {\n          sign1 = coefficentsSign[index + 1];\n          if (significance1) {\n            sign0 = coefficentsSign[index - 1];\n            contribution = 1 - sign1 - sign0;\n          } else {\n            contribution = 1 - sign1 - sign1;\n          }\n        } else if (significance1) {\n          sign0 = coefficentsSign[index - 1];\n          contribution = 1 - sign0 - sign0;\n        } else {\n          contribution = 0;\n        }\n        var horizontalContribution = 3 * contribution;\n        significance1 = row > 0 && coefficentsMagnitude[index - width] !== 0;\n        if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) {\n          sign1 = coefficentsSign[index + width];\n          if (significance1) {\n            sign0 = coefficentsSign[index - width];\n            contribution = 1 - sign1 - sign0 + horizontalContribution;\n          } else {\n            contribution = 1 - sign1 - sign1 + horizontalContribution;\n          }\n        } else if (significance1) {\n          sign0 = coefficentsSign[index - width];\n          contribution = 1 - sign0 - sign0 + horizontalContribution;\n        } else {\n          contribution = horizontalContribution;\n        }\n        if (contribution >= 0) {\n          contextLabel = 9 + contribution;\n          decoded = this.decoder.readBit(this.contexts, contextLabel);\n        } else {\n          contextLabel = 9 - contribution;\n          decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1;\n        }\n        return decoded;\n      },\n      runMagnitudeRefinementPass: function BitModel_runMagnitudeRefinementPass() {\n        var decoder = this.decoder;\n        var width = this.width,\n            height = this.height;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var neighborsSignificance = this.neighborsSignificance;\n        var contexts = this.contexts;\n        var bitsDecoded = this.bitsDecoded;\n        var processingFlags = this.processingFlags;\n        var processedMask = 1;\n        var firstMagnitudeBitMask = 2;\n        var length = width * height;\n        var width4 = width * 4;\n        for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) {\n          indexNext = Math.min(length, index0 + width4);\n          for (var j = 0; j < width; j++) {\n            for (var index = index0 + j; index < indexNext; index += width) {\n              if (!coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) {\n                continue;\n              }\n              var contextLabel = 16;\n              if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) {\n                processingFlags[index] ^= firstMagnitudeBitMask;\n                var significance = neighborsSignificance[index] & 127;\n                contextLabel = significance === 0 ? 15 : 14;\n              }\n              var bit = decoder.readBit(contexts, contextLabel);\n              coefficentsMagnitude[index] = coefficentsMagnitude[index] << 1 | bit;\n              bitsDecoded[index]++;\n              processingFlags[index] |= processedMask;\n            }\n          }\n        }\n      },\n      runCleanupPass: function BitModel_runCleanupPass() {\n        var decoder = this.decoder;\n        var width = this.width,\n            height = this.height;\n        var neighborsSignificance = this.neighborsSignificance;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var coefficentsSign = this.coefficentsSign;\n        var contexts = this.contexts;\n        var labels = this.contextLabelTable;\n        var bitsDecoded = this.bitsDecoded;\n        var processingFlags = this.processingFlags;\n        var processedMask = 1;\n        var firstMagnitudeBitMask = 2;\n        var oneRowDown = width;\n        var twoRowsDown = width * 2;\n        var threeRowsDown = width * 3;\n        var iNext;\n        for (var i0 = 0; i0 < height; i0 = iNext) {\n          iNext = Math.min(i0 + 4, height);\n          var indexBase = i0 * width;\n          var checkAllEmpty = i0 + 3 < height;\n          for (var j = 0; j < width; j++) {\n            var index0 = indexBase + j;\n            var allEmpty = checkAllEmpty && processingFlags[index0] === 0 && processingFlags[index0 + oneRowDown] === 0 && processingFlags[index0 + twoRowsDown] === 0 && processingFlags[index0 + threeRowsDown] === 0 && neighborsSignificance[index0] === 0 && neighborsSignificance[index0 + oneRowDown] === 0 && neighborsSignificance[index0 + twoRowsDown] === 0 && neighborsSignificance[index0 + threeRowsDown] === 0;\n            var i1 = 0,\n                index = index0;\n            var i = i0,\n                sign;\n            if (allEmpty) {\n              var hasSignificantCoefficent = decoder.readBit(contexts, RUNLENGTH_CONTEXT);\n              if (!hasSignificantCoefficent) {\n                bitsDecoded[index0]++;\n                bitsDecoded[index0 + oneRowDown]++;\n                bitsDecoded[index0 + twoRowsDown]++;\n                bitsDecoded[index0 + threeRowsDown]++;\n                continue;\n              }\n              i1 = decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT);\n              if (i1 !== 0) {\n                i = i0 + i1;\n                index += i1 * width;\n              }\n              sign = this.decodeSignBit(i, j, index);\n              coefficentsSign[index] = sign;\n              coefficentsMagnitude[index] = 1;\n              this.setNeighborsSignificance(i, j, index);\n              processingFlags[index] |= firstMagnitudeBitMask;\n              index = index0;\n              for (var i2 = i0; i2 <= i; i2++, index += width) {\n                bitsDecoded[index]++;\n              }\n              i1++;\n            }\n            for (i = i0 + i1; i < iNext; i++, index += width) {\n              if (coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) {\n                continue;\n              }\n              var contextLabel = labels[neighborsSignificance[index]];\n              var decision = decoder.readBit(contexts, contextLabel);\n              if (decision === 1) {\n                sign = this.decodeSignBit(i, j, index);\n                coefficentsSign[index] = sign;\n                coefficentsMagnitude[index] = 1;\n                this.setNeighborsSignificance(i, j, index);\n                processingFlags[index] |= firstMagnitudeBitMask;\n              }\n              bitsDecoded[index]++;\n            }\n          }\n        }\n      },\n      checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() {\n        var decoder = this.decoder;\n        var contexts = this.contexts;\n        var symbol = decoder.readBit(contexts, UNIFORM_CONTEXT) << 3 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 2 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT);\n        if (symbol !== 0xA) {\n          throw new JpxError('Invalid segmentation symbol');\n        }\n      }\n    };\n    return BitModel;\n  }();\n  var Transform = function TransformClosure() {\n    function Transform() {}\n    Transform.prototype.calculate = function transformCalculate(subbands, u0, v0) {\n      var ll = subbands[0];\n      for (var i = 1, ii = subbands.length; i < ii; i++) {\n        ll = this.iterate(ll, subbands[i], u0, v0);\n      }\n      return ll;\n    };\n    Transform.prototype.extend = function extend(buffer, offset, size) {\n      var i1 = offset - 1,\n          j1 = offset + 1;\n      var i2 = offset + size - 2,\n          j2 = offset + size;\n      buffer[i1--] = buffer[j1++];\n      buffer[j2++] = buffer[i2--];\n      buffer[i1--] = buffer[j1++];\n      buffer[j2++] = buffer[i2--];\n      buffer[i1--] = buffer[j1++];\n      buffer[j2++] = buffer[i2--];\n      buffer[i1] = buffer[j1];\n      buffer[j2] = buffer[i2];\n    };\n    Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh, u0, v0) {\n      var llWidth = ll.width,\n          llHeight = ll.height,\n          llItems = ll.items;\n      var width = hl_lh_hh.width;\n      var height = hl_lh_hh.height;\n      var items = hl_lh_hh.items;\n      var i, j, k, l, u, v;\n      for (k = 0, i = 0; i < llHeight; i++) {\n        l = i * 2 * width;\n        for (j = 0; j < llWidth; j++, k++, l += 2) {\n          items[l] = llItems[k];\n        }\n      }\n      llItems = ll.items = null;\n      var bufferPadding = 4;\n      var rowBuffer = new Float32Array(width + 2 * bufferPadding);\n      if (width === 1) {\n        if ((u0 & 1) !== 0) {\n          for (v = 0, k = 0; v < height; v++, k += width) {\n            items[k] *= 0.5;\n          }\n        }\n      } else {\n        for (v = 0, k = 0; v < height; v++, k += width) {\n          rowBuffer.set(items.subarray(k, k + width), bufferPadding);\n          this.extend(rowBuffer, bufferPadding, width);\n          this.filter(rowBuffer, bufferPadding, width);\n          items.set(rowBuffer.subarray(bufferPadding, bufferPadding + width), k);\n        }\n      }\n      var numBuffers = 16;\n      var colBuffers = [];\n      for (i = 0; i < numBuffers; i++) {\n        colBuffers.push(new Float32Array(height + 2 * bufferPadding));\n      }\n      var b,\n          currentBuffer = 0;\n      ll = bufferPadding + height;\n      if (height === 1) {\n        if ((v0 & 1) !== 0) {\n          for (u = 0; u < width; u++) {\n            items[u] *= 0.5;\n          }\n        }\n      } else {\n        for (u = 0; u < width; u++) {\n          if (currentBuffer === 0) {\n            numBuffers = Math.min(width - u, numBuffers);\n            for (k = u, l = bufferPadding; l < ll; k += width, l++) {\n              for (b = 0; b < numBuffers; b++) {\n                colBuffers[b][l] = items[k + b];\n              }\n            }\n            currentBuffer = numBuffers;\n          }\n          currentBuffer--;\n          var buffer = colBuffers[currentBuffer];\n          this.extend(buffer, bufferPadding, height);\n          this.filter(buffer, bufferPadding, height);\n          if (currentBuffer === 0) {\n            k = u - numBuffers + 1;\n            for (l = bufferPadding; l < ll; k += width, l++) {\n              for (b = 0; b < numBuffers; b++) {\n                items[k + b] = colBuffers[b][l];\n              }\n            }\n          }\n        }\n      }\n      return {\n        width: width,\n        height: height,\n        items: items\n      };\n    };\n    return Transform;\n  }();\n  var IrreversibleTransform = function IrreversibleTransformClosure() {\n    function IrreversibleTransform() {\n      Transform.call(this);\n    }\n    IrreversibleTransform.prototype = Object.create(Transform.prototype);\n    IrreversibleTransform.prototype.filter = function irreversibleTransformFilter(x, offset, length) {\n      var len = length >> 1;\n      offset = offset | 0;\n      var j, n, current, next;\n      var alpha = -1.586134342059924;\n      var beta = -0.052980118572961;\n      var gamma = 0.882911075530934;\n      var delta = 0.443506852043971;\n      var K = 1.230174104914001;\n      var K_ = 1 / K;\n      j = offset - 3;\n      for (n = len + 4; n--; j += 2) {\n        x[j] *= K_;\n      }\n      j = offset - 2;\n      current = delta * x[j - 1];\n      for (n = len + 3; n--; j += 2) {\n        next = delta * x[j + 1];\n        x[j] = K * x[j] - current - next;\n        if (n--) {\n          j += 2;\n          current = delta * x[j + 1];\n          x[j] = K * x[j] - current - next;\n        } else {\n          break;\n        }\n      }\n      j = offset - 1;\n      current = gamma * x[j - 1];\n      for (n = len + 2; n--; j += 2) {\n        next = gamma * x[j + 1];\n        x[j] -= current + next;\n        if (n--) {\n          j += 2;\n          current = gamma * x[j + 1];\n          x[j] -= current + next;\n        } else {\n          break;\n        }\n      }\n      j = offset;\n      current = beta * x[j - 1];\n      for (n = len + 1; n--; j += 2) {\n        next = beta * x[j + 1];\n        x[j] -= current + next;\n        if (n--) {\n          j += 2;\n          current = beta * x[j + 1];\n          x[j] -= current + next;\n        } else {\n          break;\n        }\n      }\n      if (len !== 0) {\n        j = offset + 1;\n        current = alpha * x[j - 1];\n        for (n = len; n--; j += 2) {\n          next = alpha * x[j + 1];\n          x[j] -= current + next;\n          if (n--) {\n            j += 2;\n            current = alpha * x[j + 1];\n            x[j] -= current + next;\n          } else {\n            break;\n          }\n        }\n      }\n    };\n    return IrreversibleTransform;\n  }();\n  var ReversibleTransform = function ReversibleTransformClosure() {\n    function ReversibleTransform() {\n      Transform.call(this);\n    }\n    ReversibleTransform.prototype = Object.create(Transform.prototype);\n    ReversibleTransform.prototype.filter = function reversibleTransformFilter(x, offset, length) {\n      var len = length >> 1;\n      offset = offset | 0;\n      var j, n;\n      for (j = offset, n = len + 1; n--; j += 2) {\n        x[j] -= x[j - 1] + x[j + 1] + 2 >> 2;\n      }\n      for (j = offset + 1, n = len; n--; j += 2) {\n        x[j] += x[j - 1] + x[j + 1] >> 1;\n      }\n    };\n    return ReversibleTransform;\n  }();\n  return JpxImage;\n}();\nexports.JpxImage = JpxImage;\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.FileSpec = exports.XRef = exports.ObjectLoader = exports.Catalog = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _parser = __w_pdfjs_require__(5);\n\nvar _chunked_stream = __w_pdfjs_require__(11);\n\nvar _crypto = __w_pdfjs_require__(12);\n\nvar _colorspace = __w_pdfjs_require__(3);\n\nvar Catalog = function CatalogClosure() {\n  function Catalog(pdfManager, xref, pageFactory) {\n    this.pdfManager = pdfManager;\n    this.xref = xref;\n    this.catDict = xref.getCatalogObj();\n    if (!(0, _primitives.isDict)(this.catDict)) {\n      throw new _util.FormatError('catalog object is not a dictionary');\n    }\n    this.fontCache = new _primitives.RefSetCache();\n    this.builtInCMapCache = Object.create(null);\n    this.pageKidsCountCache = new _primitives.RefSetCache();\n    this.pageFactory = pageFactory;\n    this.pagePromises = [];\n  }\n  Catalog.prototype = {\n    get metadata() {\n      var streamRef = this.catDict.getRaw('Metadata');\n      if (!(0, _primitives.isRef)(streamRef)) {\n        return (0, _util.shadow)(this, 'metadata', null);\n      }\n      var encryptMetadata = !this.xref.encrypt ? false : this.xref.encrypt.encryptMetadata;\n      var stream = this.xref.fetch(streamRef, !encryptMetadata);\n      var metadata;\n      if (stream && (0, _primitives.isDict)(stream.dict)) {\n        var type = stream.dict.get('Type');\n        var subtype = stream.dict.get('Subtype');\n        if ((0, _primitives.isName)(type, 'Metadata') && (0, _primitives.isName)(subtype, 'XML')) {\n          try {\n            metadata = (0, _util.stringToUTF8String)((0, _util.bytesToString)(stream.getBytes()));\n          } catch (e) {\n            if (e instanceof _util.MissingDataException) {\n              throw e;\n            }\n            (0, _util.info)('Skipping invalid metadata.');\n          }\n        }\n      }\n      return (0, _util.shadow)(this, 'metadata', metadata);\n    },\n    get toplevelPagesDict() {\n      var pagesObj = this.catDict.get('Pages');\n      if (!(0, _primitives.isDict)(pagesObj)) {\n        throw new _util.FormatError('invalid top-level pages dictionary');\n      }\n      return (0, _util.shadow)(this, 'toplevelPagesDict', pagesObj);\n    },\n    get documentOutline() {\n      var obj = null;\n      try {\n        obj = this.readDocumentOutline();\n      } catch (ex) {\n        if (ex instanceof _util.MissingDataException) {\n          throw ex;\n        }\n        (0, _util.warn)('Unable to read document outline');\n      }\n      return (0, _util.shadow)(this, 'documentOutline', obj);\n    },\n    readDocumentOutline: function Catalog_readDocumentOutline() {\n      var obj = this.catDict.get('Outlines');\n      if (!(0, _primitives.isDict)(obj)) {\n        return null;\n      }\n      obj = obj.getRaw('First');\n      if (!(0, _primitives.isRef)(obj)) {\n        return null;\n      }\n      var root = { items: [] };\n      var queue = [{\n        obj: obj,\n        parent: root\n      }];\n      var processed = new _primitives.RefSet();\n      processed.put(obj);\n      var xref = this.xref,\n          blackColor = new Uint8Array(3);\n      while (queue.length > 0) {\n        var i = queue.shift();\n        var outlineDict = xref.fetchIfRef(i.obj);\n        if (outlineDict === null) {\n          continue;\n        }\n        if (!outlineDict.has('Title')) {\n          throw new _util.FormatError('Invalid outline item');\n        }\n        var data = {\n          url: null,\n          dest: null\n        };\n        Catalog.parseDestDictionary({\n          destDict: outlineDict,\n          resultObj: data,\n          docBaseUrl: this.pdfManager.docBaseUrl\n        });\n        var title = outlineDict.get('Title');\n        var flags = outlineDict.get('F') || 0;\n        var color = outlineDict.getArray('C'),\n            rgbColor = blackColor;\n        if ((0, _util.isArray)(color) && color.length === 3 && (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) {\n          rgbColor = _colorspace.ColorSpace.singletons.rgb.getRgb(color, 0);\n        }\n        var outlineItem = {\n          dest: data.dest,\n          url: data.url,\n          unsafeUrl: data.unsafeUrl,\n          newWindow: data.newWindow,\n          title: (0, _util.stringToPDFString)(title),\n          color: rgbColor,\n          count: outlineDict.get('Count'),\n          bold: !!(flags & 2),\n          italic: !!(flags & 1),\n          items: []\n        };\n        i.parent.items.push(outlineItem);\n        obj = outlineDict.getRaw('First');\n        if ((0, _primitives.isRef)(obj) && !processed.has(obj)) {\n          queue.push({\n            obj: obj,\n            parent: outlineItem\n          });\n          processed.put(obj);\n        }\n        obj = outlineDict.getRaw('Next');\n        if ((0, _primitives.isRef)(obj) && !processed.has(obj)) {\n          queue.push({\n            obj: obj,\n            parent: i.parent\n          });\n          processed.put(obj);\n        }\n      }\n      return root.items.length > 0 ? root.items : null;\n    },\n    get numPages() {\n      var obj = this.toplevelPagesDict.get('Count');\n      if (!(0, _util.isInt)(obj)) {\n        throw new _util.FormatError('page count in top level pages object is not an integer');\n      }\n      return (0, _util.shadow)(this, 'numPages', obj);\n    },\n    get destinations() {\n      function fetchDestination(dest) {\n        return (0, _primitives.isDict)(dest) ? dest.get('D') : dest;\n      }\n      var xref = this.xref;\n      var dests = {},\n          nameTreeRef,\n          nameDictionaryRef;\n      var obj = this.catDict.get('Names');\n      if (obj && obj.has('Dests')) {\n        nameTreeRef = obj.getRaw('Dests');\n      } else if (this.catDict.has('Dests')) {\n        nameDictionaryRef = this.catDict.get('Dests');\n      }\n      if (nameDictionaryRef) {\n        obj = nameDictionaryRef;\n        obj.forEach(function catalogForEach(key, value) {\n          if (!value) {\n            return;\n          }\n          dests[key] = fetchDestination(value);\n        });\n      }\n      if (nameTreeRef) {\n        var nameTree = new NameTree(nameTreeRef, xref);\n        var names = nameTree.getAll();\n        for (var name in names) {\n          dests[name] = fetchDestination(names[name]);\n        }\n      }\n      return (0, _util.shadow)(this, 'destinations', dests);\n    },\n    getDestination: function Catalog_getDestination(destinationId) {\n      function fetchDestination(dest) {\n        return (0, _primitives.isDict)(dest) ? dest.get('D') : dest;\n      }\n      var xref = this.xref;\n      var dest = null,\n          nameTreeRef,\n          nameDictionaryRef;\n      var obj = this.catDict.get('Names');\n      if (obj && obj.has('Dests')) {\n        nameTreeRef = obj.getRaw('Dests');\n      } else if (this.catDict.has('Dests')) {\n        nameDictionaryRef = this.catDict.get('Dests');\n      }\n      if (nameDictionaryRef) {\n        var value = nameDictionaryRef.get(destinationId);\n        if (value) {\n          dest = fetchDestination(value);\n        }\n      }\n      if (nameTreeRef) {\n        var nameTree = new NameTree(nameTreeRef, xref);\n        dest = fetchDestination(nameTree.get(destinationId));\n      }\n      return dest;\n    },\n    get pageLabels() {\n      var obj = null;\n      try {\n        obj = this.readPageLabels();\n      } catch (ex) {\n        if (ex instanceof _util.MissingDataException) {\n          throw ex;\n        }\n        (0, _util.warn)('Unable to read page labels.');\n      }\n      return (0, _util.shadow)(this, 'pageLabels', obj);\n    },\n    readPageLabels: function Catalog_readPageLabels() {\n      var obj = this.catDict.getRaw('PageLabels');\n      if (!obj) {\n        return null;\n      }\n      var pageLabels = new Array(this.numPages);\n      var style = null;\n      var prefix = '';\n      var numberTree = new NumberTree(obj, this.xref);\n      var nums = numberTree.getAll();\n      var currentLabel = '',\n          currentIndex = 1;\n      for (var i = 0, ii = this.numPages; i < ii; i++) {\n        if (i in nums) {\n          var labelDict = nums[i];\n          if (!(0, _primitives.isDict)(labelDict)) {\n            throw new _util.FormatError('The PageLabel is not a dictionary.');\n          }\n          var type = labelDict.get('Type');\n          if (type && !(0, _primitives.isName)(type, 'PageLabel')) {\n            throw new _util.FormatError('Invalid type in PageLabel dictionary.');\n          }\n          var s = labelDict.get('S');\n          if (s && !(0, _primitives.isName)(s)) {\n            throw new _util.FormatError('Invalid style in PageLabel dictionary.');\n          }\n          style = s ? s.name : null;\n          var p = labelDict.get('P');\n          if (p && !(0, _util.isString)(p)) {\n            throw new _util.FormatError('Invalid prefix in PageLabel dictionary.');\n          }\n          prefix = p ? (0, _util.stringToPDFString)(p) : '';\n          var st = labelDict.get('St');\n          if (st && !((0, _util.isInt)(st) && st >= 1)) {\n            throw new _util.FormatError('Invalid start in PageLabel dictionary.');\n          }\n          currentIndex = st || 1;\n        }\n        switch (style) {\n          case 'D':\n            currentLabel = currentIndex;\n            break;\n          case 'R':\n          case 'r':\n            currentLabel = _util.Util.toRoman(currentIndex, style === 'r');\n            break;\n          case 'A':\n          case 'a':\n            var LIMIT = 26;\n            var A_UPPER_CASE = 0x41,\n                A_LOWER_CASE = 0x61;\n            var baseCharCode = style === 'a' ? A_LOWER_CASE : A_UPPER_CASE;\n            var letterIndex = currentIndex - 1;\n            var character = String.fromCharCode(baseCharCode + letterIndex % LIMIT);\n            var charBuf = [];\n            for (var j = 0, jj = letterIndex / LIMIT | 0; j <= jj; j++) {\n              charBuf.push(character);\n            }\n            currentLabel = charBuf.join('');\n            break;\n          default:\n            if (style) {\n              throw new _util.FormatError('Invalid style \"' + style + '\" in PageLabel dictionary.');\n            }\n        }\n        pageLabels[i] = prefix + currentLabel;\n        currentLabel = '';\n        currentIndex++;\n      }\n      return pageLabels;\n    },\n    get pageMode() {\n      var obj = this.catDict.get('PageMode');\n      var pageMode = 'UseNone';\n      if ((0, _primitives.isName)(obj)) {\n        switch (obj.name) {\n          case 'UseNone':\n          case 'UseOutlines':\n          case 'UseThumbs':\n          case 'FullScreen':\n          case 'UseOC':\n          case 'UseAttachments':\n            pageMode = obj.name;\n        }\n      }\n      return (0, _util.shadow)(this, 'pageMode', pageMode);\n    },\n    get attachments() {\n      var xref = this.xref;\n      var attachments = null,\n          nameTreeRef;\n      var obj = this.catDict.get('Names');\n      if (obj) {\n        nameTreeRef = obj.getRaw('EmbeddedFiles');\n      }\n      if (nameTreeRef) {\n        var nameTree = new NameTree(nameTreeRef, xref);\n        var names = nameTree.getAll();\n        for (var name in names) {\n          var fs = new FileSpec(names[name], xref);\n          if (!attachments) {\n            attachments = Object.create(null);\n          }\n          attachments[(0, _util.stringToPDFString)(name)] = fs.serializable;\n        }\n      }\n      return (0, _util.shadow)(this, 'attachments', attachments);\n    },\n    get javaScript() {\n      var xref = this.xref;\n      var obj = this.catDict.get('Names');\n      var javaScript = [];\n      function appendIfJavaScriptDict(jsDict) {\n        var type = jsDict.get('S');\n        if (!(0, _primitives.isName)(type, 'JavaScript')) {\n          return;\n        }\n        var js = jsDict.get('JS');\n        if ((0, _primitives.isStream)(js)) {\n          js = (0, _util.bytesToString)(js.getBytes());\n        } else if (!(0, _util.isString)(js)) {\n          return;\n        }\n        javaScript.push((0, _util.stringToPDFString)(js));\n      }\n      if (obj && obj.has('JavaScript')) {\n        var nameTree = new NameTree(obj.getRaw('JavaScript'), xref);\n        var names = nameTree.getAll();\n        for (var name in names) {\n          var jsDict = names[name];\n          if ((0, _primitives.isDict)(jsDict)) {\n            appendIfJavaScriptDict(jsDict);\n          }\n        }\n      }\n      var openactionDict = this.catDict.get('OpenAction');\n      if ((0, _primitives.isDict)(openactionDict, 'Action')) {\n        var actionType = openactionDict.get('S');\n        if ((0, _primitives.isName)(actionType, 'Named')) {\n          var action = openactionDict.get('N');\n          if ((0, _primitives.isName)(action, 'Print')) {\n            javaScript.push('print({});');\n          }\n        } else {\n          appendIfJavaScriptDict(openactionDict);\n        }\n      }\n      return (0, _util.shadow)(this, 'javaScript', javaScript);\n    },\n    cleanup: function Catalog_cleanup() {\n      var _this = this;\n\n      this.pageKidsCountCache.clear();\n      var promises = [];\n      this.fontCache.forEach(function (promise) {\n        promises.push(promise);\n      });\n      return Promise.all(promises).then(function (translatedFonts) {\n        for (var i = 0, ii = translatedFonts.length; i < ii; i++) {\n          var font = translatedFonts[i].dict;\n          delete font.translated;\n        }\n        _this.fontCache.clear();\n        _this.builtInCMapCache = Object.create(null);\n      });\n    },\n    getPage: function Catalog_getPage(pageIndex) {\n      var _this2 = this;\n\n      if (!(pageIndex in this.pagePromises)) {\n        this.pagePromises[pageIndex] = this.getPageDict(pageIndex).then(function (_ref) {\n          var _ref2 = _slicedToArray(_ref, 2),\n              dict = _ref2[0],\n              ref = _ref2[1];\n\n          return _this2.pageFactory.createPage(pageIndex, dict, ref, _this2.fontCache, _this2.builtInCMapCache);\n        });\n      }\n      return this.pagePromises[pageIndex];\n    },\n    getPageDict: function Catalog_getPageDict(pageIndex) {\n      var capability = (0, _util.createPromiseCapability)();\n      var nodesToVisit = [this.catDict.getRaw('Pages')];\n      var count,\n          currentPageIndex = 0;\n      var xref = this.xref,\n          pageKidsCountCache = this.pageKidsCountCache;\n      function next() {\n        while (nodesToVisit.length) {\n          var currentNode = nodesToVisit.pop();\n          if ((0, _primitives.isRef)(currentNode)) {\n            count = pageKidsCountCache.get(currentNode);\n            if (count > 0 && currentPageIndex + count < pageIndex) {\n              currentPageIndex += count;\n              continue;\n            }\n            xref.fetchAsync(currentNode).then(function (obj) {\n              if ((0, _primitives.isDict)(obj, 'Page') || (0, _primitives.isDict)(obj) && !obj.has('Kids')) {\n                if (pageIndex === currentPageIndex) {\n                  if (currentNode && !pageKidsCountCache.has(currentNode)) {\n                    pageKidsCountCache.put(currentNode, 1);\n                  }\n                  capability.resolve([obj, currentNode]);\n                } else {\n                  currentPageIndex++;\n                  next();\n                }\n                return;\n              }\n              nodesToVisit.push(obj);\n              next();\n            }, capability.reject);\n            return;\n          }\n          if (!(0, _primitives.isDict)(currentNode)) {\n            capability.reject(new _util.FormatError('page dictionary kid reference points to wrong type of object'));\n            return;\n          }\n          count = currentNode.get('Count');\n          var objId = currentNode.objId;\n          if (objId && !pageKidsCountCache.has(objId)) {\n            pageKidsCountCache.put(objId, count);\n          }\n          if (currentPageIndex + count <= pageIndex) {\n            currentPageIndex += count;\n            continue;\n          }\n          var kids = currentNode.get('Kids');\n          if (!(0, _util.isArray)(kids)) {\n            capability.reject(new _util.FormatError('page dictionary kids object is not an array'));\n            return;\n          }\n          for (var last = kids.length - 1; last >= 0; last--) {\n            nodesToVisit.push(kids[last]);\n          }\n        }\n        capability.reject(new Error('Page index ' + pageIndex + ' not found.'));\n      }\n      next();\n      return capability.promise;\n    },\n    getPageIndex: function Catalog_getPageIndex(pageRef) {\n      var xref = this.xref;\n      function pagesBeforeRef(kidRef) {\n        var total = 0;\n        var parentRef;\n        return xref.fetchAsync(kidRef).then(function (node) {\n          if ((0, _primitives.isRefsEqual)(kidRef, pageRef) && !(0, _primitives.isDict)(node, 'Page') && !((0, _primitives.isDict)(node) && !node.has('Type') && node.has('Contents'))) {\n            throw new _util.FormatError('The reference does not point to a /Page Dict.');\n          }\n          if (!node) {\n            return null;\n          }\n          if (!(0, _primitives.isDict)(node)) {\n            throw new _util.FormatError('node must be a Dict.');\n          }\n          parentRef = node.getRaw('Parent');\n          return node.getAsync('Parent');\n        }).then(function (parent) {\n          if (!parent) {\n            return null;\n          }\n          if (!(0, _primitives.isDict)(parent)) {\n            throw new _util.FormatError('parent must be a Dict.');\n          }\n          return parent.getAsync('Kids');\n        }).then(function (kids) {\n          if (!kids) {\n            return null;\n          }\n          var kidPromises = [];\n          var found = false;\n          for (var i = 0; i < kids.length; i++) {\n            var kid = kids[i];\n            if (!(0, _primitives.isRef)(kid)) {\n              throw new _util.FormatError('kid must be a Ref.');\n            }\n            if (kid.num === kidRef.num) {\n              found = true;\n              break;\n            }\n            kidPromises.push(xref.fetchAsync(kid).then(function (kid) {\n              if (kid.has('Count')) {\n                var count = kid.get('Count');\n                total += count;\n              } else {\n                total++;\n              }\n            }));\n          }\n          if (!found) {\n            throw new _util.FormatError('kid ref not found in parents kids');\n          }\n          return Promise.all(kidPromises).then(function () {\n            return [total, parentRef];\n          });\n        });\n      }\n      var total = 0;\n      function next(ref) {\n        return pagesBeforeRef(ref).then(function (args) {\n          if (!args) {\n            return total;\n          }\n          var count = args[0];\n          var parentRef = args[1];\n          total += count;\n          return next(parentRef);\n        });\n      }\n      return next(pageRef);\n    }\n  };\n  Catalog.parseDestDictionary = function Catalog_parseDestDictionary(params) {\n    function addDefaultProtocolToUrl(url) {\n      if (url.indexOf('www.') === 0) {\n        return 'http://' + url;\n      }\n      return url;\n    }\n    function tryConvertUrlEncoding(url) {\n      try {\n        return (0, _util.stringToUTF8String)(url);\n      } catch (e) {\n        return url;\n      }\n    }\n    var destDict = params.destDict;\n    if (!(0, _primitives.isDict)(destDict)) {\n      (0, _util.warn)('Catalog_parseDestDictionary: \"destDict\" must be a dictionary.');\n      return;\n    }\n    var resultObj = params.resultObj;\n    if ((typeof resultObj === 'undefined' ? 'undefined' : _typeof(resultObj)) !== 'object') {\n      (0, _util.warn)('Catalog_parseDestDictionary: \"resultObj\" must be an object.');\n      return;\n    }\n    var docBaseUrl = params.docBaseUrl || null;\n    var action = destDict.get('A'),\n        url,\n        dest;\n    if ((0, _primitives.isDict)(action)) {\n      var linkType = action.get('S').name;\n      switch (linkType) {\n        case 'URI':\n          url = action.get('URI');\n          if ((0, _primitives.isName)(url)) {\n            url = '/' + url.name;\n          } else if ((0, _util.isString)(url)) {\n            url = addDefaultProtocolToUrl(url);\n          }\n          break;\n        case 'GoTo':\n          dest = action.get('D');\n          break;\n        case 'Launch':\n        case 'GoToR':\n          var urlDict = action.get('F');\n          if ((0, _primitives.isDict)(urlDict)) {\n            url = urlDict.get('F') || null;\n          } else if ((0, _util.isString)(urlDict)) {\n            url = urlDict;\n          }\n          var remoteDest = action.get('D');\n          if (remoteDest) {\n            if ((0, _primitives.isName)(remoteDest)) {\n              remoteDest = remoteDest.name;\n            }\n            if ((0, _util.isString)(url)) {\n              var baseUrl = url.split('#')[0];\n              if ((0, _util.isString)(remoteDest)) {\n                url = baseUrl + '#' + remoteDest;\n              } else if ((0, _util.isArray)(remoteDest)) {\n                url = baseUrl + '#' + JSON.stringify(remoteDest);\n              }\n            }\n          }\n          var newWindow = action.get('NewWindow');\n          if ((0, _util.isBool)(newWindow)) {\n            resultObj.newWindow = newWindow;\n          }\n          break;\n        case 'Named':\n          var namedAction = action.get('N');\n          if ((0, _primitives.isName)(namedAction)) {\n            resultObj.action = namedAction.name;\n          }\n          break;\n        case 'JavaScript':\n          var jsAction = action.get('JS'),\n              js;\n          if ((0, _primitives.isStream)(jsAction)) {\n            js = (0, _util.bytesToString)(jsAction.getBytes());\n          } else if ((0, _util.isString)(jsAction)) {\n            js = jsAction;\n          }\n          if (js) {\n            var URL_OPEN_METHODS = ['app.launchURL', 'window.open'];\n            var regex = new RegExp('^\\\\s*(' + URL_OPEN_METHODS.join('|').split('.').join('\\\\.') + ')\\\\((?:\\'|\\\")([^\\'\\\"]*)(?:\\'|\\\")(?:,\\\\s*(\\\\w+)\\\\)|\\\\))', 'i');\n            var jsUrl = regex.exec((0, _util.stringToPDFString)(js));\n            if (jsUrl && jsUrl[2]) {\n              url = jsUrl[2];\n              if (jsUrl[3] === 'true' && jsUrl[1] === 'app.launchURL') {\n                resultObj.newWindow = true;\n              }\n              break;\n            }\n          }\n        default:\n          (0, _util.warn)('Catalog_parseDestDictionary: Unrecognized link type \"' + linkType + '\".');\n          break;\n      }\n    } else if (destDict.has('Dest')) {\n      dest = destDict.get('Dest');\n    }\n    if ((0, _util.isString)(url)) {\n      url = tryConvertUrlEncoding(url);\n      var absoluteUrl = (0, _util.createValidAbsoluteUrl)(url, docBaseUrl);\n      if (absoluteUrl) {\n        resultObj.url = absoluteUrl.href;\n      }\n      resultObj.unsafeUrl = url;\n    }\n    if (dest) {\n      if ((0, _primitives.isName)(dest)) {\n        dest = dest.name;\n      }\n      if ((0, _util.isString)(dest) || (0, _util.isArray)(dest)) {\n        resultObj.dest = dest;\n      }\n    }\n  };\n  return Catalog;\n}();\nvar XRef = function XRefClosure() {\n  function XRef(stream, pdfManager) {\n    this.stream = stream;\n    this.pdfManager = pdfManager;\n    this.entries = [];\n    this.xrefstms = Object.create(null);\n    this.cache = [];\n    this.stats = {\n      streamTypes: [],\n      fontTypes: []\n    };\n  }\n  XRef.prototype = {\n    setStartXRef: function XRef_setStartXRef(startXRef) {\n      this.startXRefQueue = [startXRef];\n    },\n    parse: function XRef_parse(recoveryMode) {\n      var trailerDict;\n      if (!recoveryMode) {\n        trailerDict = this.readXRef();\n      } else {\n        (0, _util.warn)('Indexing all PDF objects');\n        trailerDict = this.indexObjects();\n      }\n      trailerDict.assignXref(this);\n      this.trailer = trailerDict;\n      var encrypt = trailerDict.get('Encrypt');\n      if ((0, _primitives.isDict)(encrypt)) {\n        var ids = trailerDict.get('ID');\n        var fileId = ids && ids.length ? ids[0] : '';\n        encrypt.suppressEncryption = true;\n        this.encrypt = new _crypto.CipherTransformFactory(encrypt, fileId, this.pdfManager.password);\n      }\n      if (!(this.root = trailerDict.get('Root'))) {\n        throw new _util.FormatError('Invalid root reference');\n      }\n    },\n    processXRefTable: function XRef_processXRefTable(parser) {\n      if (!('tableState' in this)) {\n        this.tableState = {\n          entryNum: 0,\n          streamPos: parser.lexer.stream.pos,\n          parserBuf1: parser.buf1,\n          parserBuf2: parser.buf2\n        };\n      }\n      var obj = this.readXRefTable(parser);\n      if (!(0, _primitives.isCmd)(obj, 'trailer')) {\n        throw new _util.FormatError('Invalid XRef table: could not find trailer dictionary');\n      }\n      var dict = parser.getObj();\n      if (!(0, _primitives.isDict)(dict) && dict.dict) {\n        dict = dict.dict;\n      }\n      if (!(0, _primitives.isDict)(dict)) {\n        throw new _util.FormatError('Invalid XRef table: could not parse trailer dictionary');\n      }\n      delete this.tableState;\n      return dict;\n    },\n    readXRefTable: function XRef_readXRefTable(parser) {\n      var stream = parser.lexer.stream;\n      var tableState = this.tableState;\n      stream.pos = tableState.streamPos;\n      parser.buf1 = tableState.parserBuf1;\n      parser.buf2 = tableState.parserBuf2;\n      var obj;\n      while (true) {\n        if (!('firstEntryNum' in tableState) || !('entryCount' in tableState)) {\n          if ((0, _primitives.isCmd)(obj = parser.getObj(), 'trailer')) {\n            break;\n          }\n          tableState.firstEntryNum = obj;\n          tableState.entryCount = parser.getObj();\n        }\n        var first = tableState.firstEntryNum;\n        var count = tableState.entryCount;\n        if (!(0, _util.isInt)(first) || !(0, _util.isInt)(count)) {\n          throw new _util.FormatError('Invalid XRef table: wrong types in subsection header');\n        }\n        for (var i = tableState.entryNum; i < count; i++) {\n          tableState.streamPos = stream.pos;\n          tableState.entryNum = i;\n          tableState.parserBuf1 = parser.buf1;\n          tableState.parserBuf2 = parser.buf2;\n          var entry = {};\n          entry.offset = parser.getObj();\n          entry.gen = parser.getObj();\n          var type = parser.getObj();\n          if ((0, _primitives.isCmd)(type, 'f')) {\n            entry.free = true;\n          } else if ((0, _primitives.isCmd)(type, 'n')) {\n            entry.uncompressed = true;\n          }\n          if (!(0, _util.isInt)(entry.offset) || !(0, _util.isInt)(entry.gen) || !(entry.free || entry.uncompressed)) {\n            throw new _util.FormatError('Invalid entry in XRef subsection: ' + first + ', ' + count);\n          }\n          if (i === 0 && entry.free && first === 1) {\n            first = 0;\n          }\n          if (!this.entries[i + first]) {\n            this.entries[i + first] = entry;\n          }\n        }\n        tableState.entryNum = 0;\n        tableState.streamPos = stream.pos;\n        tableState.parserBuf1 = parser.buf1;\n        tableState.parserBuf2 = parser.buf2;\n        delete tableState.firstEntryNum;\n        delete tableState.entryCount;\n      }\n      if (this.entries[0] && !this.entries[0].free) {\n        throw new _util.FormatError('Invalid XRef table: unexpected first object');\n      }\n      return obj;\n    },\n    processXRefStream: function XRef_processXRefStream(stream) {\n      if (!('streamState' in this)) {\n        var streamParameters = stream.dict;\n        var byteWidths = streamParameters.get('W');\n        var range = streamParameters.get('Index');\n        if (!range) {\n          range = [0, streamParameters.get('Size')];\n        }\n        this.streamState = {\n          entryRanges: range,\n          byteWidths: byteWidths,\n          entryNum: 0,\n          streamPos: stream.pos\n        };\n      }\n      this.readXRefStream(stream);\n      delete this.streamState;\n      return stream.dict;\n    },\n    readXRefStream: function XRef_readXRefStream(stream) {\n      var i, j;\n      var streamState = this.streamState;\n      stream.pos = streamState.streamPos;\n      var byteWidths = streamState.byteWidths;\n      var typeFieldWidth = byteWidths[0];\n      var offsetFieldWidth = byteWidths[1];\n      var generationFieldWidth = byteWidths[2];\n      var entryRanges = streamState.entryRanges;\n      while (entryRanges.length > 0) {\n        var first = entryRanges[0];\n        var n = entryRanges[1];\n        if (!(0, _util.isInt)(first) || !(0, _util.isInt)(n)) {\n          throw new _util.FormatError('Invalid XRef range fields: ' + first + ', ' + n);\n        }\n        if (!(0, _util.isInt)(typeFieldWidth) || !(0, _util.isInt)(offsetFieldWidth) || !(0, _util.isInt)(generationFieldWidth)) {\n          throw new _util.FormatError('Invalid XRef entry fields length: ' + first + ', ' + n);\n        }\n        for (i = streamState.entryNum; i < n; ++i) {\n          streamState.entryNum = i;\n          streamState.streamPos = stream.pos;\n          var type = 0,\n              offset = 0,\n              generation = 0;\n          for (j = 0; j < typeFieldWidth; ++j) {\n            type = type << 8 | stream.getByte();\n          }\n          if (typeFieldWidth === 0) {\n            type = 1;\n          }\n          for (j = 0; j < offsetFieldWidth; ++j) {\n            offset = offset << 8 | stream.getByte();\n          }\n          for (j = 0; j < generationFieldWidth; ++j) {\n            generation = generation << 8 | stream.getByte();\n          }\n          var entry = {};\n          entry.offset = offset;\n          entry.gen = generation;\n          switch (type) {\n            case 0:\n              entry.free = true;\n              break;\n            case 1:\n              entry.uncompressed = true;\n              break;\n            case 2:\n              break;\n            default:\n              throw new _util.FormatError('Invalid XRef entry type: ' + type);\n          }\n          if (!this.entries[first + i]) {\n            this.entries[first + i] = entry;\n          }\n        }\n        streamState.entryNum = 0;\n        streamState.streamPos = stream.pos;\n        entryRanges.splice(0, 2);\n      }\n    },\n    indexObjects: function XRef_indexObjects() {\n      var TAB = 0x9,\n          LF = 0xA,\n          CR = 0xD,\n          SPACE = 0x20;\n      var PERCENT = 0x25,\n          LT = 0x3C;\n      function readToken(data, offset) {\n        var token = '',\n            ch = data[offset];\n        while (ch !== LF && ch !== CR && ch !== LT) {\n          if (++offset >= data.length) {\n            break;\n          }\n          token += String.fromCharCode(ch);\n          ch = data[offset];\n        }\n        return token;\n      }\n      function skipUntil(data, offset, what) {\n        var length = what.length,\n            dataLength = data.length;\n        var skipped = 0;\n        while (offset < dataLength) {\n          var i = 0;\n          while (i < length && data[offset + i] === what[i]) {\n            ++i;\n          }\n          if (i >= length) {\n            break;\n          }\n          offset++;\n          skipped++;\n        }\n        return skipped;\n      }\n      var objRegExp = /^(\\d+)\\s+(\\d+)\\s+obj\\b/;\n      var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);\n      var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 101, 102]);\n      var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]);\n      var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);\n      this.entries.length = 0;\n      var stream = this.stream;\n      stream.pos = 0;\n      var buffer = stream.getBytes();\n      var position = stream.start,\n          length = buffer.length;\n      var trailers = [],\n          xrefStms = [];\n      while (position < length) {\n        var ch = buffer[position];\n        if (ch === TAB || ch === LF || ch === CR || ch === SPACE) {\n          ++position;\n          continue;\n        }\n        if (ch === PERCENT) {\n          do {\n            ++position;\n            if (position >= length) {\n              break;\n            }\n            ch = buffer[position];\n          } while (ch !== LF && ch !== CR);\n          continue;\n        }\n        var token = readToken(buffer, position);\n        var m;\n        if (token.indexOf('xref') === 0 && (token.length === 4 || /\\s/.test(token[4]))) {\n          position += skipUntil(buffer, position, trailerBytes);\n          trailers.push(position);\n          position += skipUntil(buffer, position, startxrefBytes);\n        } else if (m = objRegExp.exec(token)) {\n          if (typeof this.entries[m[1]] === 'undefined') {\n            this.entries[m[1]] = {\n              offset: position - stream.start,\n              gen: m[2] | 0,\n              uncompressed: true\n            };\n          }\n          var contentLength = skipUntil(buffer, position, endobjBytes) + 7;\n          var content = buffer.subarray(position, position + contentLength);\n          var xrefTagOffset = skipUntil(content, 0, xrefBytes);\n          if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) {\n            xrefStms.push(position - stream.start);\n            this.xrefstms[position - stream.start] = 1;\n          }\n          position += contentLength;\n        } else if (token.indexOf('trailer') === 0 && (token.length === 7 || /\\s/.test(token[7]))) {\n          trailers.push(position);\n          position += skipUntil(buffer, position, startxrefBytes);\n        } else {\n          position += token.length + 1;\n        }\n      }\n      var i, ii;\n      for (i = 0, ii = xrefStms.length; i < ii; ++i) {\n        this.startXRefQueue.push(xrefStms[i]);\n        this.readXRef(true);\n      }\n      var dict;\n      for (i = 0, ii = trailers.length; i < ii; ++i) {\n        stream.pos = trailers[i];\n        var parser = new _parser.Parser(new _parser.Lexer(stream), true, this, true);\n        var obj = parser.getObj();\n        if (!(0, _primitives.isCmd)(obj, 'trailer')) {\n          continue;\n        }\n        dict = parser.getObj();\n        if (!(0, _primitives.isDict)(dict)) {\n          continue;\n        }\n        if (dict.has('ID')) {\n          return dict;\n        }\n      }\n      if (dict) {\n        return dict;\n      }\n      throw new _util.InvalidPDFException('Invalid PDF structure');\n    },\n    readXRef: function XRef_readXRef(recoveryMode) {\n      var stream = this.stream;\n      try {\n        while (this.startXRefQueue.length) {\n          var startXRef = this.startXRefQueue[0];\n          stream.pos = startXRef + stream.start;\n          var parser = new _parser.Parser(new _parser.Lexer(stream), true, this);\n          var obj = parser.getObj();\n          var dict;\n          if ((0, _primitives.isCmd)(obj, 'xref')) {\n            dict = this.processXRefTable(parser);\n            if (!this.topDict) {\n              this.topDict = dict;\n            }\n            obj = dict.get('XRefStm');\n            if ((0, _util.isInt)(obj)) {\n              var pos = obj;\n              if (!(pos in this.xrefstms)) {\n                this.xrefstms[pos] = 1;\n                this.startXRefQueue.push(pos);\n              }\n            }\n          } else if ((0, _util.isInt)(obj)) {\n            if (!(0, _util.isInt)(parser.getObj()) || !(0, _primitives.isCmd)(parser.getObj(), 'obj') || !(0, _primitives.isStream)(obj = parser.getObj())) {\n              throw new _util.FormatError('Invalid XRef stream');\n            }\n            dict = this.processXRefStream(obj);\n            if (!this.topDict) {\n              this.topDict = dict;\n            }\n            if (!dict) {\n              throw new _util.FormatError('Failed to read XRef stream');\n            }\n          } else {\n            throw new _util.FormatError('Invalid XRef stream header');\n          }\n          obj = dict.get('Prev');\n          if ((0, _util.isInt)(obj)) {\n            this.startXRefQueue.push(obj);\n          } else if ((0, _primitives.isRef)(obj)) {\n            this.startXRefQueue.push(obj.num);\n          }\n          this.startXRefQueue.shift();\n        }\n        return this.topDict;\n      } catch (e) {\n        if (e instanceof _util.MissingDataException) {\n          throw e;\n        }\n        (0, _util.info)('(while reading XRef): ' + e);\n      }\n      if (recoveryMode) {\n        return;\n      }\n      throw new _util.XRefParseException();\n    },\n    getEntry: function XRef_getEntry(i) {\n      var xrefEntry = this.entries[i];\n      if (xrefEntry && !xrefEntry.free && xrefEntry.offset) {\n        return xrefEntry;\n      }\n      return null;\n    },\n    fetchIfRef: function XRef_fetchIfRef(obj, suppressEncryption) {\n      if (!(0, _primitives.isRef)(obj)) {\n        return obj;\n      }\n      return this.fetch(obj, suppressEncryption);\n    },\n    fetch: function XRef_fetch(ref, suppressEncryption) {\n      if (!(0, _primitives.isRef)(ref)) {\n        throw new Error('ref object is not a reference');\n      }\n      var num = ref.num;\n      if (num in this.cache) {\n        var cacheEntry = this.cache[num];\n        if (cacheEntry instanceof _primitives.Dict && !cacheEntry.objId) {\n          cacheEntry.objId = ref.toString();\n        }\n        return cacheEntry;\n      }\n      var xrefEntry = this.getEntry(num);\n      if (xrefEntry === null) {\n        return this.cache[num] = null;\n      }\n      if (xrefEntry.uncompressed) {\n        xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption);\n      } else {\n        xrefEntry = this.fetchCompressed(xrefEntry, suppressEncryption);\n      }\n      if ((0, _primitives.isDict)(xrefEntry)) {\n        xrefEntry.objId = ref.toString();\n      } else if ((0, _primitives.isStream)(xrefEntry)) {\n        xrefEntry.dict.objId = ref.toString();\n      }\n      return xrefEntry;\n    },\n    fetchUncompressed: function XRef_fetchUncompressed(ref, xrefEntry, suppressEncryption) {\n      var gen = ref.gen;\n      var num = ref.num;\n      if (xrefEntry.gen !== gen) {\n        throw new _util.FormatError('inconsistent generation in XRef');\n      }\n      var stream = this.stream.makeSubStream(xrefEntry.offset + this.stream.start);\n      var parser = new _parser.Parser(new _parser.Lexer(stream), true, this);\n      var obj1 = parser.getObj();\n      var obj2 = parser.getObj();\n      var obj3 = parser.getObj();\n      if (!(0, _util.isInt)(obj1) || parseInt(obj1, 10) !== num || !(0, _util.isInt)(obj2) || parseInt(obj2, 10) !== gen || !(0, _primitives.isCmd)(obj3)) {\n        throw new _util.FormatError('bad XRef entry');\n      }\n      if (!(0, _primitives.isCmd)(obj3, 'obj')) {\n        if (obj3.cmd.indexOf('obj') === 0) {\n          num = parseInt(obj3.cmd.substring(3), 10);\n          if (!isNaN(num)) {\n            return num;\n          }\n        }\n        throw new _util.FormatError('bad XRef entry');\n      }\n      if (this.encrypt && !suppressEncryption) {\n        xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen));\n      } else {\n        xrefEntry = parser.getObj();\n      }\n      if (!(0, _primitives.isStream)(xrefEntry)) {\n        this.cache[num] = xrefEntry;\n      }\n      return xrefEntry;\n    },\n    fetchCompressed: function XRef_fetchCompressed(xrefEntry, suppressEncryption) {\n      var tableOffset = xrefEntry.offset;\n      var stream = this.fetch(new _primitives.Ref(tableOffset, 0));\n      if (!(0, _primitives.isStream)(stream)) {\n        throw new _util.FormatError('bad ObjStm stream');\n      }\n      var first = stream.dict.get('First');\n      var n = stream.dict.get('N');\n      if (!(0, _util.isInt)(first) || !(0, _util.isInt)(n)) {\n        throw new _util.FormatError('invalid first and n parameters for ObjStm stream');\n      }\n      var parser = new _parser.Parser(new _parser.Lexer(stream), false, this);\n      parser.allowStreams = true;\n      var i,\n          entries = [],\n          num,\n          nums = [];\n      for (i = 0; i < n; ++i) {\n        num = parser.getObj();\n        if (!(0, _util.isInt)(num)) {\n          throw new _util.FormatError('invalid object number in the ObjStm stream: ' + num);\n        }\n        nums.push(num);\n        var offset = parser.getObj();\n        if (!(0, _util.isInt)(offset)) {\n          throw new _util.FormatError('invalid object offset in the ObjStm stream: ' + offset);\n        }\n      }\n      for (i = 0; i < n; ++i) {\n        entries.push(parser.getObj());\n        if ((0, _primitives.isCmd)(parser.buf1, 'endobj')) {\n          parser.shift();\n        }\n        num = nums[i];\n        var entry = this.entries[num];\n        if (entry && entry.offset === tableOffset && entry.gen === i) {\n          this.cache[num] = entries[i];\n        }\n      }\n      xrefEntry = entries[xrefEntry.gen];\n      if (xrefEntry === undefined) {\n        throw new _util.FormatError('bad XRef entry for compressed object');\n      }\n      return xrefEntry;\n    },\n    fetchIfRefAsync: function XRef_fetchIfRefAsync(obj, suppressEncryption) {\n      if (!(0, _primitives.isRef)(obj)) {\n        return Promise.resolve(obj);\n      }\n      return this.fetchAsync(obj, suppressEncryption);\n    },\n    fetchAsync: function XRef_fetchAsync(ref, suppressEncryption) {\n      var streamManager = this.stream.manager;\n      var xref = this;\n      return new Promise(function tryFetch(resolve, reject) {\n        try {\n          resolve(xref.fetch(ref, suppressEncryption));\n        } catch (e) {\n          if (e instanceof _util.MissingDataException) {\n            streamManager.requestRange(e.begin, e.end).then(function () {\n              tryFetch(resolve, reject);\n            }, reject);\n            return;\n          }\n          reject(e);\n        }\n      });\n    },\n    getCatalogObj: function XRef_getCatalogObj() {\n      return this.root;\n    }\n  };\n  return XRef;\n}();\nvar NameOrNumberTree = function NameOrNumberTreeClosure() {\n  function NameOrNumberTree(root, xref) {\n    throw new Error('Cannot initialize NameOrNumberTree.');\n  }\n  NameOrNumberTree.prototype = {\n    getAll: function NameOrNumberTree_getAll() {\n      var dict = Object.create(null);\n      if (!this.root) {\n        return dict;\n      }\n      var xref = this.xref;\n      var processed = new _primitives.RefSet();\n      processed.put(this.root);\n      var queue = [this.root];\n      while (queue.length > 0) {\n        var i, n;\n        var obj = xref.fetchIfRef(queue.shift());\n        if (!(0, _primitives.isDict)(obj)) {\n          continue;\n        }\n        if (obj.has('Kids')) {\n          var kids = obj.get('Kids');\n          for (i = 0, n = kids.length; i < n; i++) {\n            var kid = kids[i];\n            if (processed.has(kid)) {\n              throw new _util.FormatError('Duplicate entry in \"' + this._type + '\" tree.');\n            }\n            queue.push(kid);\n            processed.put(kid);\n          }\n          continue;\n        }\n        var entries = obj.get(this._type);\n        if ((0, _util.isArray)(entries)) {\n          for (i = 0, n = entries.length; i < n; i += 2) {\n            dict[xref.fetchIfRef(entries[i])] = xref.fetchIfRef(entries[i + 1]);\n          }\n        }\n      }\n      return dict;\n    },\n    get: function NameOrNumberTree_get(key) {\n      if (!this.root) {\n        return null;\n      }\n      var xref = this.xref;\n      var kidsOrEntries = xref.fetchIfRef(this.root);\n      var loopCount = 0;\n      var MAX_LEVELS = 10;\n      var l, r, m;\n      while (kidsOrEntries.has('Kids')) {\n        if (++loopCount > MAX_LEVELS) {\n          (0, _util.warn)('Search depth limit reached for \"' + this._type + '\" tree.');\n          return null;\n        }\n        var kids = kidsOrEntries.get('Kids');\n        if (!(0, _util.isArray)(kids)) {\n          return null;\n        }\n        l = 0;\n        r = kids.length - 1;\n        while (l <= r) {\n          m = l + r >> 1;\n          var kid = xref.fetchIfRef(kids[m]);\n          var limits = kid.get('Limits');\n          if (key < xref.fetchIfRef(limits[0])) {\n            r = m - 1;\n          } else if (key > xref.fetchIfRef(limits[1])) {\n            l = m + 1;\n          } else {\n            kidsOrEntries = xref.fetchIfRef(kids[m]);\n            break;\n          }\n        }\n        if (l > r) {\n          return null;\n        }\n      }\n      var entries = kidsOrEntries.get(this._type);\n      if ((0, _util.isArray)(entries)) {\n        l = 0;\n        r = entries.length - 2;\n        while (l <= r) {\n          m = l + r & ~1;\n          var currentKey = xref.fetchIfRef(entries[m]);\n          if (key < currentKey) {\n            r = m - 2;\n          } else if (key > currentKey) {\n            l = m + 2;\n          } else {\n            return xref.fetchIfRef(entries[m + 1]);\n          }\n        }\n      }\n      return null;\n    }\n  };\n  return NameOrNumberTree;\n}();\nvar NameTree = function NameTreeClosure() {\n  function NameTree(root, xref) {\n    this.root = root;\n    this.xref = xref;\n    this._type = 'Names';\n  }\n  _util.Util.inherit(NameTree, NameOrNumberTree, {});\n  return NameTree;\n}();\nvar NumberTree = function NumberTreeClosure() {\n  function NumberTree(root, xref) {\n    this.root = root;\n    this.xref = xref;\n    this._type = 'Nums';\n  }\n  _util.Util.inherit(NumberTree, NameOrNumberTree, {});\n  return NumberTree;\n}();\nvar FileSpec = function FileSpecClosure() {\n  function FileSpec(root, xref) {\n    if (!root || !(0, _primitives.isDict)(root)) {\n      return;\n    }\n    this.xref = xref;\n    this.root = root;\n    if (root.has('FS')) {\n      this.fs = root.get('FS');\n    }\n    this.description = root.has('Desc') ? (0, _util.stringToPDFString)(root.get('Desc')) : '';\n    if (root.has('RF')) {\n      (0, _util.warn)('Related file specifications are not supported');\n    }\n    this.contentAvailable = true;\n    if (!root.has('EF')) {\n      this.contentAvailable = false;\n      (0, _util.warn)('Non-embedded file specifications are not supported');\n    }\n  }\n  function pickPlatformItem(dict) {\n    if (dict.has('UF')) {\n      return dict.get('UF');\n    } else if (dict.has('F')) {\n      return dict.get('F');\n    } else if (dict.has('Unix')) {\n      return dict.get('Unix');\n    } else if (dict.has('Mac')) {\n      return dict.get('Mac');\n    } else if (dict.has('DOS')) {\n      return dict.get('DOS');\n    }\n    return null;\n  }\n  FileSpec.prototype = {\n    get filename() {\n      if (!this._filename && this.root) {\n        var filename = pickPlatformItem(this.root) || 'unnamed';\n        this._filename = (0, _util.stringToPDFString)(filename).replace(/\\\\\\\\/g, '\\\\').replace(/\\\\\\//g, '/').replace(/\\\\/g, '/');\n      }\n      return this._filename;\n    },\n    get content() {\n      if (!this.contentAvailable) {\n        return null;\n      }\n      if (!this.contentRef && this.root) {\n        this.contentRef = pickPlatformItem(this.root.get('EF'));\n      }\n      var content = null;\n      if (this.contentRef) {\n        var xref = this.xref;\n        var fileObj = xref.fetchIfRef(this.contentRef);\n        if (fileObj && (0, _primitives.isStream)(fileObj)) {\n          content = fileObj.getBytes();\n        } else {\n          (0, _util.warn)('Embedded file specification points to non-existing/invalid ' + 'content');\n        }\n      } else {\n        (0, _util.warn)('Embedded file specification does not have a content');\n      }\n      return content;\n    },\n    get serializable() {\n      return {\n        filename: this.filename,\n        content: this.content\n      };\n    }\n  };\n  return FileSpec;\n}();\nvar ObjectLoader = function () {\n  function mayHaveChildren(value) {\n    return (0, _primitives.isRef)(value) || (0, _primitives.isDict)(value) || (0, _util.isArray)(value) || (0, _primitives.isStream)(value);\n  }\n  function addChildren(node, nodesToVisit) {\n    if ((0, _primitives.isDict)(node) || (0, _primitives.isStream)(node)) {\n      var dict = (0, _primitives.isDict)(node) ? node : node.dict;\n      var dictKeys = dict.getKeys();\n      for (var i = 0, ii = dictKeys.length; i < ii; i++) {\n        var rawValue = dict.getRaw(dictKeys[i]);\n        if (mayHaveChildren(rawValue)) {\n          nodesToVisit.push(rawValue);\n        }\n      }\n    } else if ((0, _util.isArray)(node)) {\n      for (var _i = 0, _ii = node.length; _i < _ii; _i++) {\n        var value = node[_i];\n        if (mayHaveChildren(value)) {\n          nodesToVisit.push(value);\n        }\n      }\n    }\n  }\n  function ObjectLoader(dict, keys, xref) {\n    this.dict = dict;\n    this.keys = keys;\n    this.xref = xref;\n    this.refSet = null;\n    this.capability = null;\n  }\n  ObjectLoader.prototype = {\n    load: function load() {\n      this.capability = (0, _util.createPromiseCapability)();\n      if (!(this.xref.stream instanceof _chunked_stream.ChunkedStream) || this.xref.stream.getMissingChunks().length === 0) {\n        this.capability.resolve();\n        return this.capability.promise;\n      }\n      var keys = this.keys,\n          dict = this.dict;\n\n      this.refSet = new _primitives.RefSet();\n      var nodesToVisit = [];\n      for (var i = 0, ii = keys.length; i < ii; i++) {\n        var rawValue = dict.getRaw(keys[i]);\n        if (rawValue !== undefined) {\n          nodesToVisit.push(rawValue);\n        }\n      }\n      this._walk(nodesToVisit);\n      return this.capability.promise;\n    },\n    _walk: function _walk(nodesToVisit) {\n      var _this3 = this;\n\n      var nodesToRevisit = [];\n      var pendingRequests = [];\n      while (nodesToVisit.length) {\n        var currentNode = nodesToVisit.pop();\n        if ((0, _primitives.isRef)(currentNode)) {\n          if (this.refSet.has(currentNode)) {\n            continue;\n          }\n          try {\n            this.refSet.put(currentNode);\n            currentNode = this.xref.fetch(currentNode);\n          } catch (ex) {\n            if (!(ex instanceof _util.MissingDataException)) {\n              throw ex;\n            }\n            nodesToRevisit.push(currentNode);\n            pendingRequests.push({\n              begin: ex.begin,\n              end: ex.end\n            });\n          }\n        }\n        if (currentNode && currentNode.getBaseStreams) {\n          var baseStreams = currentNode.getBaseStreams();\n          var foundMissingData = false;\n          for (var i = 0, ii = baseStreams.length; i < ii; i++) {\n            var stream = baseStreams[i];\n            if (stream.getMissingChunks && stream.getMissingChunks().length) {\n              foundMissingData = true;\n              pendingRequests.push({\n                begin: stream.start,\n                end: stream.end\n              });\n            }\n          }\n          if (foundMissingData) {\n            nodesToRevisit.push(currentNode);\n          }\n        }\n        addChildren(currentNode, nodesToVisit);\n      }\n      if (pendingRequests.length) {\n        this.xref.stream.manager.requestRanges(pendingRequests).then(function () {\n          for (var _i2 = 0, _ii2 = nodesToRevisit.length; _i2 < _ii2; _i2++) {\n            var node = nodesToRevisit[_i2];\n            if ((0, _primitives.isRef)(node)) {\n              _this3.refSet.remove(node);\n            }\n          }\n          _this3._walk(nodesToRevisit);\n        }, this.capability.reject);\n        return;\n      }\n      this.refSet = null;\n      this.capability.resolve();\n    }\n  };\n  return ObjectLoader;\n}();\nexports.Catalog = Catalog;\nexports.ObjectLoader = ObjectLoader;\nexports.XRef = XRef;\nexports.FileSpec = FileSpec;\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getSupplementalGlyphMapForArialBlack = exports.getGlyphMapForStandardFonts = exports.getSymbolsFonts = exports.getSerifFonts = exports.getNonStdFontMap = exports.getStdFontMap = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar getStdFontMap = (0, _util.getLookupTableFactory)(function (t) {\n  t['ArialNarrow'] = 'Helvetica';\n  t['ArialNarrow-Bold'] = 'Helvetica-Bold';\n  t['ArialNarrow-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['ArialNarrow-Italic'] = 'Helvetica-Oblique';\n  t['ArialBlack'] = 'Helvetica';\n  t['ArialBlack-Bold'] = 'Helvetica-Bold';\n  t['ArialBlack-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['ArialBlack-Italic'] = 'Helvetica-Oblique';\n  t['Arial-Black'] = 'Helvetica';\n  t['Arial-Black-Bold'] = 'Helvetica-Bold';\n  t['Arial-Black-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['Arial-Black-Italic'] = 'Helvetica-Oblique';\n  t['Arial'] = 'Helvetica';\n  t['Arial-Bold'] = 'Helvetica-Bold';\n  t['Arial-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['Arial-Italic'] = 'Helvetica-Oblique';\n  t['Arial-BoldItalicMT'] = 'Helvetica-BoldOblique';\n  t['Arial-BoldMT'] = 'Helvetica-Bold';\n  t['Arial-ItalicMT'] = 'Helvetica-Oblique';\n  t['ArialMT'] = 'Helvetica';\n  t['Courier-Bold'] = 'Courier-Bold';\n  t['Courier-BoldItalic'] = 'Courier-BoldOblique';\n  t['Courier-Italic'] = 'Courier-Oblique';\n  t['CourierNew'] = 'Courier';\n  t['CourierNew-Bold'] = 'Courier-Bold';\n  t['CourierNew-BoldItalic'] = 'Courier-BoldOblique';\n  t['CourierNew-Italic'] = 'Courier-Oblique';\n  t['CourierNewPS-BoldItalicMT'] = 'Courier-BoldOblique';\n  t['CourierNewPS-BoldMT'] = 'Courier-Bold';\n  t['CourierNewPS-ItalicMT'] = 'Courier-Oblique';\n  t['CourierNewPSMT'] = 'Courier';\n  t['Helvetica'] = 'Helvetica';\n  t['Helvetica-Bold'] = 'Helvetica-Bold';\n  t['Helvetica-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['Helvetica-BoldOblique'] = 'Helvetica-BoldOblique';\n  t['Helvetica-Italic'] = 'Helvetica-Oblique';\n  t['Helvetica-Oblique'] = 'Helvetica-Oblique';\n  t['SegoeUISymbol'] = 'Helvetica';\n  t['Symbol-Bold'] = 'Symbol';\n  t['Symbol-BoldItalic'] = 'Symbol';\n  t['Symbol-Italic'] = 'Symbol';\n  t['TimesNewRoman'] = 'Times-Roman';\n  t['TimesNewRoman-Bold'] = 'Times-Bold';\n  t['TimesNewRoman-BoldItalic'] = 'Times-BoldItalic';\n  t['TimesNewRoman-Italic'] = 'Times-Italic';\n  t['TimesNewRomanPS'] = 'Times-Roman';\n  t['TimesNewRomanPS-Bold'] = 'Times-Bold';\n  t['TimesNewRomanPS-BoldItalic'] = 'Times-BoldItalic';\n  t['TimesNewRomanPS-BoldItalicMT'] = 'Times-BoldItalic';\n  t['TimesNewRomanPS-BoldMT'] = 'Times-Bold';\n  t['TimesNewRomanPS-Italic'] = 'Times-Italic';\n  t['TimesNewRomanPS-ItalicMT'] = 'Times-Italic';\n  t['TimesNewRomanPSMT'] = 'Times-Roman';\n  t['TimesNewRomanPSMT-Bold'] = 'Times-Bold';\n  t['TimesNewRomanPSMT-BoldItalic'] = 'Times-BoldItalic';\n  t['TimesNewRomanPSMT-Italic'] = 'Times-Italic';\n});\nvar getNonStdFontMap = (0, _util.getLookupTableFactory)(function (t) {\n  t['CenturyGothic'] = 'Helvetica';\n  t['CenturyGothic-Bold'] = 'Helvetica-Bold';\n  t['CenturyGothic-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['CenturyGothic-Italic'] = 'Helvetica-Oblique';\n  t['ComicSansMS'] = 'Comic Sans MS';\n  t['ComicSansMS-Bold'] = 'Comic Sans MS-Bold';\n  t['ComicSansMS-BoldItalic'] = 'Comic Sans MS-BoldItalic';\n  t['ComicSansMS-Italic'] = 'Comic Sans MS-Italic';\n  t['LucidaConsole'] = 'Courier';\n  t['LucidaConsole-Bold'] = 'Courier-Bold';\n  t['LucidaConsole-BoldItalic'] = 'Courier-BoldOblique';\n  t['LucidaConsole-Italic'] = 'Courier-Oblique';\n  t['MS-Gothic'] = 'MS Gothic';\n  t['MS-Gothic-Bold'] = 'MS Gothic-Bold';\n  t['MS-Gothic-BoldItalic'] = 'MS Gothic-BoldItalic';\n  t['MS-Gothic-Italic'] = 'MS Gothic-Italic';\n  t['MS-Mincho'] = 'MS Mincho';\n  t['MS-Mincho-Bold'] = 'MS Mincho-Bold';\n  t['MS-Mincho-BoldItalic'] = 'MS Mincho-BoldItalic';\n  t['MS-Mincho-Italic'] = 'MS Mincho-Italic';\n  t['MS-PGothic'] = 'MS PGothic';\n  t['MS-PGothic-Bold'] = 'MS PGothic-Bold';\n  t['MS-PGothic-BoldItalic'] = 'MS PGothic-BoldItalic';\n  t['MS-PGothic-Italic'] = 'MS PGothic-Italic';\n  t['MS-PMincho'] = 'MS PMincho';\n  t['MS-PMincho-Bold'] = 'MS PMincho-Bold';\n  t['MS-PMincho-BoldItalic'] = 'MS PMincho-BoldItalic';\n  t['MS-PMincho-Italic'] = 'MS PMincho-Italic';\n  t['NuptialScript'] = 'Times-Italic';\n  t['Wingdings'] = 'ZapfDingbats';\n});\nvar getSerifFonts = (0, _util.getLookupTableFactory)(function (t) {\n  t['Adobe Jenson'] = true;\n  t['Adobe Text'] = true;\n  t['Albertus'] = true;\n  t['Aldus'] = true;\n  t['Alexandria'] = true;\n  t['Algerian'] = true;\n  t['American Typewriter'] = true;\n  t['Antiqua'] = true;\n  t['Apex'] = true;\n  t['Arno'] = true;\n  t['Aster'] = true;\n  t['Aurora'] = true;\n  t['Baskerville'] = true;\n  t['Bell'] = true;\n  t['Bembo'] = true;\n  t['Bembo Schoolbook'] = true;\n  t['Benguiat'] = true;\n  t['Berkeley Old Style'] = true;\n  t['Bernhard Modern'] = true;\n  t['Berthold City'] = true;\n  t['Bodoni'] = true;\n  t['Bauer Bodoni'] = true;\n  t['Book Antiqua'] = true;\n  t['Bookman'] = true;\n  t['Bordeaux Roman'] = true;\n  t['Californian FB'] = true;\n  t['Calisto'] = true;\n  t['Calvert'] = true;\n  t['Capitals'] = true;\n  t['Cambria'] = true;\n  t['Cartier'] = true;\n  t['Caslon'] = true;\n  t['Catull'] = true;\n  t['Centaur'] = true;\n  t['Century Old Style'] = true;\n  t['Century Schoolbook'] = true;\n  t['Chaparral'] = true;\n  t['Charis SIL'] = true;\n  t['Cheltenham'] = true;\n  t['Cholla Slab'] = true;\n  t['Clarendon'] = true;\n  t['Clearface'] = true;\n  t['Cochin'] = true;\n  t['Colonna'] = true;\n  t['Computer Modern'] = true;\n  t['Concrete Roman'] = true;\n  t['Constantia'] = true;\n  t['Cooper Black'] = true;\n  t['Corona'] = true;\n  t['Ecotype'] = true;\n  t['Egyptienne'] = true;\n  t['Elephant'] = true;\n  t['Excelsior'] = true;\n  t['Fairfield'] = true;\n  t['FF Scala'] = true;\n  t['Folkard'] = true;\n  t['Footlight'] = true;\n  t['FreeSerif'] = true;\n  t['Friz Quadrata'] = true;\n  t['Garamond'] = true;\n  t['Gentium'] = true;\n  t['Georgia'] = true;\n  t['Gloucester'] = true;\n  t['Goudy Old Style'] = true;\n  t['Goudy Schoolbook'] = true;\n  t['Goudy Pro Font'] = true;\n  t['Granjon'] = true;\n  t['Guardian Egyptian'] = true;\n  t['Heather'] = true;\n  t['Hercules'] = true;\n  t['High Tower Text'] = true;\n  t['Hiroshige'] = true;\n  t['Hoefler Text'] = true;\n  t['Humana Serif'] = true;\n  t['Imprint'] = true;\n  t['Ionic No. 5'] = true;\n  t['Janson'] = true;\n  t['Joanna'] = true;\n  t['Korinna'] = true;\n  t['Lexicon'] = true;\n  t['Liberation Serif'] = true;\n  t['Linux Libertine'] = true;\n  t['Literaturnaya'] = true;\n  t['Lucida'] = true;\n  t['Lucida Bright'] = true;\n  t['Melior'] = true;\n  t['Memphis'] = true;\n  t['Miller'] = true;\n  t['Minion'] = true;\n  t['Modern'] = true;\n  t['Mona Lisa'] = true;\n  t['Mrs Eaves'] = true;\n  t['MS Serif'] = true;\n  t['Museo Slab'] = true;\n  t['New York'] = true;\n  t['Nimbus Roman'] = true;\n  t['NPS Rawlinson Roadway'] = true;\n  t['NuptialScript'] = true;\n  t['Palatino'] = true;\n  t['Perpetua'] = true;\n  t['Plantin'] = true;\n  t['Plantin Schoolbook'] = true;\n  t['Playbill'] = true;\n  t['Poor Richard'] = true;\n  t['Rawlinson Roadway'] = true;\n  t['Renault'] = true;\n  t['Requiem'] = true;\n  t['Rockwell'] = true;\n  t['Roman'] = true;\n  t['Rotis Serif'] = true;\n  t['Sabon'] = true;\n  t['Scala'] = true;\n  t['Seagull'] = true;\n  t['Sistina'] = true;\n  t['Souvenir'] = true;\n  t['STIX'] = true;\n  t['Stone Informal'] = true;\n  t['Stone Serif'] = true;\n  t['Sylfaen'] = true;\n  t['Times'] = true;\n  t['Trajan'] = true;\n  t['Trinité'] = true;\n  t['Trump Mediaeval'] = true;\n  t['Utopia'] = true;\n  t['Vale Type'] = true;\n  t['Bitstream Vera'] = true;\n  t['Vera Serif'] = true;\n  t['Versailles'] = true;\n  t['Wanted'] = true;\n  t['Weiss'] = true;\n  t['Wide Latin'] = true;\n  t['Windsor'] = true;\n  t['XITS'] = true;\n});\nvar getSymbolsFonts = (0, _util.getLookupTableFactory)(function (t) {\n  t['Dingbats'] = true;\n  t['Symbol'] = true;\n  t['ZapfDingbats'] = true;\n});\nvar getGlyphMapForStandardFonts = (0, _util.getLookupTableFactory)(function (t) {\n  t[2] = 10;\n  t[3] = 32;\n  t[4] = 33;\n  t[5] = 34;\n  t[6] = 35;\n  t[7] = 36;\n  t[8] = 37;\n  t[9] = 38;\n  t[10] = 39;\n  t[11] = 40;\n  t[12] = 41;\n  t[13] = 42;\n  t[14] = 43;\n  t[15] = 44;\n  t[16] = 45;\n  t[17] = 46;\n  t[18] = 47;\n  t[19] = 48;\n  t[20] = 49;\n  t[21] = 50;\n  t[22] = 51;\n  t[23] = 52;\n  t[24] = 53;\n  t[25] = 54;\n  t[26] = 55;\n  t[27] = 56;\n  t[28] = 57;\n  t[29] = 58;\n  t[30] = 894;\n  t[31] = 60;\n  t[32] = 61;\n  t[33] = 62;\n  t[34] = 63;\n  t[35] = 64;\n  t[36] = 65;\n  t[37] = 66;\n  t[38] = 67;\n  t[39] = 68;\n  t[40] = 69;\n  t[41] = 70;\n  t[42] = 71;\n  t[43] = 72;\n  t[44] = 73;\n  t[45] = 74;\n  t[46] = 75;\n  t[47] = 76;\n  t[48] = 77;\n  t[49] = 78;\n  t[50] = 79;\n  t[51] = 80;\n  t[52] = 81;\n  t[53] = 82;\n  t[54] = 83;\n  t[55] = 84;\n  t[56] = 85;\n  t[57] = 86;\n  t[58] = 87;\n  t[59] = 88;\n  t[60] = 89;\n  t[61] = 90;\n  t[62] = 91;\n  t[63] = 92;\n  t[64] = 93;\n  t[65] = 94;\n  t[66] = 95;\n  t[67] = 96;\n  t[68] = 97;\n  t[69] = 98;\n  t[70] = 99;\n  t[71] = 100;\n  t[72] = 101;\n  t[73] = 102;\n  t[74] = 103;\n  t[75] = 104;\n  t[76] = 105;\n  t[77] = 106;\n  t[78] = 107;\n  t[79] = 108;\n  t[80] = 109;\n  t[81] = 110;\n  t[82] = 111;\n  t[83] = 112;\n  t[84] = 113;\n  t[85] = 114;\n  t[86] = 115;\n  t[87] = 116;\n  t[88] = 117;\n  t[89] = 118;\n  t[90] = 119;\n  t[91] = 120;\n  t[92] = 121;\n  t[93] = 122;\n  t[94] = 123;\n  t[95] = 124;\n  t[96] = 125;\n  t[97] = 126;\n  t[98] = 196;\n  t[99] = 197;\n  t[100] = 199;\n  t[101] = 201;\n  t[102] = 209;\n  t[103] = 214;\n  t[104] = 220;\n  t[105] = 225;\n  t[106] = 224;\n  t[107] = 226;\n  t[108] = 228;\n  t[109] = 227;\n  t[110] = 229;\n  t[111] = 231;\n  t[112] = 233;\n  t[113] = 232;\n  t[114] = 234;\n  t[115] = 235;\n  t[116] = 237;\n  t[117] = 236;\n  t[118] = 238;\n  t[119] = 239;\n  t[120] = 241;\n  t[121] = 243;\n  t[122] = 242;\n  t[123] = 244;\n  t[124] = 246;\n  t[125] = 245;\n  t[126] = 250;\n  t[127] = 249;\n  t[128] = 251;\n  t[129] = 252;\n  t[130] = 8224;\n  t[131] = 176;\n  t[132] = 162;\n  t[133] = 163;\n  t[134] = 167;\n  t[135] = 8226;\n  t[136] = 182;\n  t[137] = 223;\n  t[138] = 174;\n  t[139] = 169;\n  t[140] = 8482;\n  t[141] = 180;\n  t[142] = 168;\n  t[143] = 8800;\n  t[144] = 198;\n  t[145] = 216;\n  t[146] = 8734;\n  t[147] = 177;\n  t[148] = 8804;\n  t[149] = 8805;\n  t[150] = 165;\n  t[151] = 181;\n  t[152] = 8706;\n  t[153] = 8721;\n  t[154] = 8719;\n  t[156] = 8747;\n  t[157] = 170;\n  t[158] = 186;\n  t[159] = 8486;\n  t[160] = 230;\n  t[161] = 248;\n  t[162] = 191;\n  t[163] = 161;\n  t[164] = 172;\n  t[165] = 8730;\n  t[166] = 402;\n  t[167] = 8776;\n  t[168] = 8710;\n  t[169] = 171;\n  t[170] = 187;\n  t[171] = 8230;\n  t[210] = 218;\n  t[223] = 711;\n  t[224] = 321;\n  t[225] = 322;\n  t[227] = 353;\n  t[229] = 382;\n  t[234] = 253;\n  t[252] = 263;\n  t[253] = 268;\n  t[254] = 269;\n  t[258] = 258;\n  t[260] = 260;\n  t[261] = 261;\n  t[265] = 280;\n  t[266] = 281;\n  t[268] = 283;\n  t[269] = 313;\n  t[275] = 323;\n  t[276] = 324;\n  t[278] = 328;\n  t[284] = 345;\n  t[285] = 346;\n  t[286] = 347;\n  t[292] = 367;\n  t[295] = 377;\n  t[296] = 378;\n  t[298] = 380;\n  t[305] = 963;\n  t[306] = 964;\n  t[307] = 966;\n  t[308] = 8215;\n  t[309] = 8252;\n  t[310] = 8319;\n  t[311] = 8359;\n  t[312] = 8592;\n  t[313] = 8593;\n  t[337] = 9552;\n  t[493] = 1039;\n  t[494] = 1040;\n  t[705] = 1524;\n  t[706] = 8362;\n  t[710] = 64288;\n  t[711] = 64298;\n  t[759] = 1617;\n  t[761] = 1776;\n  t[763] = 1778;\n  t[775] = 1652;\n  t[777] = 1764;\n  t[778] = 1780;\n  t[779] = 1781;\n  t[780] = 1782;\n  t[782] = 771;\n  t[783] = 64726;\n  t[786] = 8363;\n  t[788] = 8532;\n  t[790] = 768;\n  t[791] = 769;\n  t[792] = 768;\n  t[795] = 803;\n  t[797] = 64336;\n  t[798] = 64337;\n  t[799] = 64342;\n  t[800] = 64343;\n  t[801] = 64344;\n  t[802] = 64345;\n  t[803] = 64362;\n  t[804] = 64363;\n  t[805] = 64364;\n  t[2424] = 7821;\n  t[2425] = 7822;\n  t[2426] = 7823;\n  t[2427] = 7824;\n  t[2428] = 7825;\n  t[2429] = 7826;\n  t[2430] = 7827;\n  t[2433] = 7682;\n  t[2678] = 8045;\n  t[2679] = 8046;\n  t[2830] = 1552;\n  t[2838] = 686;\n  t[2840] = 751;\n  t[2842] = 753;\n  t[2843] = 754;\n  t[2844] = 755;\n  t[2846] = 757;\n  t[2856] = 767;\n  t[2857] = 848;\n  t[2858] = 849;\n  t[2862] = 853;\n  t[2863] = 854;\n  t[2864] = 855;\n  t[2865] = 861;\n  t[2866] = 862;\n  t[2906] = 7460;\n  t[2908] = 7462;\n  t[2909] = 7463;\n  t[2910] = 7464;\n  t[2912] = 7466;\n  t[2913] = 7467;\n  t[2914] = 7468;\n  t[2916] = 7470;\n  t[2917] = 7471;\n  t[2918] = 7472;\n  t[2920] = 7474;\n  t[2921] = 7475;\n  t[2922] = 7476;\n  t[2924] = 7478;\n  t[2925] = 7479;\n  t[2926] = 7480;\n  t[2928] = 7482;\n  t[2929] = 7483;\n  t[2930] = 7484;\n  t[2932] = 7486;\n  t[2933] = 7487;\n  t[2934] = 7488;\n  t[2936] = 7490;\n  t[2937] = 7491;\n  t[2938] = 7492;\n  t[2940] = 7494;\n  t[2941] = 7495;\n  t[2942] = 7496;\n  t[2944] = 7498;\n  t[2946] = 7500;\n  t[2948] = 7502;\n  t[2950] = 7504;\n  t[2951] = 7505;\n  t[2952] = 7506;\n  t[2954] = 7508;\n  t[2955] = 7509;\n  t[2956] = 7510;\n  t[2958] = 7512;\n  t[2959] = 7513;\n  t[2960] = 7514;\n  t[2962] = 7516;\n  t[2963] = 7517;\n  t[2964] = 7518;\n  t[2966] = 7520;\n  t[2967] = 7521;\n  t[2968] = 7522;\n  t[2970] = 7524;\n  t[2971] = 7525;\n  t[2972] = 7526;\n  t[2974] = 7528;\n  t[2975] = 7529;\n  t[2976] = 7530;\n  t[2978] = 1537;\n  t[2979] = 1538;\n  t[2980] = 1539;\n  t[2982] = 1549;\n  t[2983] = 1551;\n  t[2984] = 1552;\n  t[2986] = 1554;\n  t[2987] = 1555;\n  t[2988] = 1556;\n  t[2990] = 1623;\n  t[2991] = 1624;\n  t[2995] = 1775;\n  t[2999] = 1791;\n  t[3002] = 64290;\n  t[3003] = 64291;\n  t[3004] = 64292;\n  t[3006] = 64294;\n  t[3007] = 64295;\n  t[3008] = 64296;\n  t[3011] = 1900;\n  t[3014] = 8223;\n  t[3015] = 8244;\n  t[3017] = 7532;\n  t[3018] = 7533;\n  t[3019] = 7534;\n  t[3075] = 7590;\n  t[3076] = 7591;\n  t[3079] = 7594;\n  t[3080] = 7595;\n  t[3083] = 7598;\n  t[3084] = 7599;\n  t[3087] = 7602;\n  t[3088] = 7603;\n  t[3091] = 7606;\n  t[3092] = 7607;\n  t[3095] = 7610;\n  t[3096] = 7611;\n  t[3099] = 7614;\n  t[3100] = 7615;\n  t[3103] = 7618;\n  t[3104] = 7619;\n  t[3107] = 8337;\n  t[3108] = 8338;\n  t[3116] = 1884;\n  t[3119] = 1885;\n  t[3120] = 1885;\n  t[3123] = 1886;\n  t[3124] = 1886;\n  t[3127] = 1887;\n  t[3128] = 1887;\n  t[3131] = 1888;\n  t[3132] = 1888;\n  t[3135] = 1889;\n  t[3136] = 1889;\n  t[3139] = 1890;\n  t[3140] = 1890;\n  t[3143] = 1891;\n  t[3144] = 1891;\n  t[3147] = 1892;\n  t[3148] = 1892;\n  t[3153] = 580;\n  t[3154] = 581;\n  t[3157] = 584;\n  t[3158] = 585;\n  t[3161] = 588;\n  t[3162] = 589;\n  t[3165] = 891;\n  t[3166] = 892;\n  t[3169] = 1274;\n  t[3170] = 1275;\n  t[3173] = 1278;\n  t[3174] = 1279;\n  t[3181] = 7622;\n  t[3182] = 7623;\n  t[3282] = 11799;\n  t[3316] = 578;\n  t[3379] = 42785;\n  t[3393] = 1159;\n  t[3416] = 8377;\n});\nvar getSupplementalGlyphMapForArialBlack = (0, _util.getLookupTableFactory)(function (t) {\n  t[227] = 322;\n  t[264] = 261;\n  t[291] = 346;\n});\nexports.getStdFontMap = getStdFontMap;\nexports.getNonStdFontMap = getNonStdFontMap;\nexports.getSerifFonts = getSerifFonts;\nexports.getSymbolsFonts = getSymbolsFonts;\nexports.getGlyphMapForStandardFonts = getGlyphMapForStandardFonts;\nexports.getSupplementalGlyphMapForArialBlack = getSupplementalGlyphMapForArialBlack;\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.WorkerMessageHandler = exports.WorkerTask = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _pdf_manager = __w_pdfjs_require__(32);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar WorkerTask = function WorkerTaskClosure() {\n  function WorkerTask(name) {\n    this.name = name;\n    this.terminated = false;\n    this._capability = (0, _util.createPromiseCapability)();\n  }\n  WorkerTask.prototype = {\n    get finished() {\n      return this._capability.promise;\n    },\n    finish: function finish() {\n      this._capability.resolve();\n    },\n    terminate: function terminate() {\n      this.terminated = true;\n    },\n    ensureNotTerminated: function ensureNotTerminated() {\n      if (this.terminated) {\n        throw new Error('Worker task was terminated');\n      }\n    }\n  };\n  return WorkerTask;\n}();\n;\nvar PDFWorkerStream = function PDFWorkerStreamClosure() {\n  function PDFWorkerStream(msgHandler) {\n    this._msgHandler = msgHandler;\n    this._contentLength = null;\n    this._fullRequestReader = null;\n    this._rangeRequestReaders = [];\n  }\n  PDFWorkerStream.prototype = {\n    getFullReader: function getFullReader() {\n      (0, _util.assert)(!this._fullRequestReader);\n      this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler);\n      return this._fullRequestReader;\n    },\n    getRangeReader: function getRangeReader(begin, end) {\n      var reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler);\n      this._rangeRequestReaders.push(reader);\n      return reader;\n    },\n    cancelAllRequests: function cancelAllRequests(reason) {\n      if (this._fullRequestReader) {\n        this._fullRequestReader.cancel(reason);\n      }\n      var readers = this._rangeRequestReaders.slice(0);\n      readers.forEach(function (reader) {\n        reader.cancel(reason);\n      });\n    }\n  };\n  function PDFWorkerStreamReader(msgHandler) {\n    var _this = this;\n\n    this._msgHandler = msgHandler;\n    this._contentLength = null;\n    this._isRangeSupported = false;\n    this._isStreamingSupported = false;\n    var readableStream = this._msgHandler.sendWithStream('GetReader');\n    this._reader = readableStream.getReader();\n    this._headersReady = this._msgHandler.sendWithPromise('ReaderHeadersReady').then(function (data) {\n      _this._isStreamingSupported = data.isStreamingSupported;\n      _this._isRangeSupported = data.isRangeSupported;\n      _this._contentLength = data.contentLength;\n    });\n  }\n  PDFWorkerStreamReader.prototype = {\n    get headersReady() {\n      return this._headersReady;\n    },\n    get contentLength() {\n      return this._contentLength;\n    },\n    get isStreamingSupported() {\n      return this._isStreamingSupported;\n    },\n    get isRangeSupported() {\n      return this._isRangeSupported;\n    },\n    read: function read() {\n      return this._reader.read().then(function (_ref) {\n        var value = _ref.value,\n            done = _ref.done;\n\n        if (done) {\n          return {\n            value: undefined,\n            done: true\n          };\n        }\n        return {\n          value: value.buffer,\n          done: false\n        };\n      });\n    },\n    cancel: function cancel(reason) {\n      this._reader.cancel(reason);\n    }\n  };\n  function PDFWorkerStreamRangeReader(begin, end, msgHandler) {\n    this._msgHandler = msgHandler;\n    this.onProgress = null;\n    var readableStream = this._msgHandler.sendWithStream('GetRangeReader', {\n      begin: begin,\n      end: end\n    });\n    this._reader = readableStream.getReader();\n  }\n  PDFWorkerStreamRangeReader.prototype = {\n    get isStreamingSupported() {\n      return false;\n    },\n    read: function read() {\n      return this._reader.read().then(function (_ref2) {\n        var value = _ref2.value,\n            done = _ref2.done;\n\n        if (done) {\n          return {\n            value: undefined,\n            done: true\n          };\n        }\n        return {\n          value: value.buffer,\n          done: false\n        };\n      });\n    },\n    cancel: function cancel(reason) {\n      this._reader.cancel(reason);\n    }\n  };\n  return PDFWorkerStream;\n}();\nvar WorkerMessageHandler = {\n  setup: function setup(handler, port) {\n    var testMessageProcessed = false;\n    handler.on('test', function wphSetupTest(data) {\n      if (testMessageProcessed) {\n        return;\n      }\n      testMessageProcessed = true;\n      if (!(data instanceof Uint8Array)) {\n        handler.send('test', 'main', false);\n        return;\n      }\n      var supportTransfers = data[0] === 255;\n      handler.postMessageTransfers = supportTransfers;\n      var xhr = new XMLHttpRequest();\n      var responseExists = 'response' in xhr;\n      try {\n        xhr.responseType;\n      } catch (e) {\n        responseExists = false;\n      }\n      if (!responseExists) {\n        handler.send('test', false);\n        return;\n      }\n      handler.send('test', {\n        supportTypedArray: true,\n        supportTransfers: supportTransfers\n      });\n    });\n    handler.on('configure', function wphConfigure(data) {\n      (0, _util.setVerbosityLevel)(data.verbosity);\n    });\n    handler.on('GetDocRequest', function wphSetupDoc(data) {\n      return WorkerMessageHandler.createDocumentHandler(data, port);\n    });\n  },\n  createDocumentHandler: function createDocumentHandler(docParams, port) {\n    var pdfManager;\n    var terminated = false;\n    var cancelXHRs = null;\n    var WorkerTasks = [];\n    var docId = docParams.docId;\n    var docBaseUrl = docParams.docBaseUrl;\n    var workerHandlerName = docParams.docId + '_worker';\n    var handler = new _util.MessageHandler(workerHandlerName, docId, port);\n    handler.postMessageTransfers = docParams.postMessageTransfers;\n    function ensureNotTerminated() {\n      if (terminated) {\n        throw new Error('Worker was terminated');\n      }\n    }\n    function startWorkerTask(task) {\n      WorkerTasks.push(task);\n    }\n    function finishWorkerTask(task) {\n      task.finish();\n      var i = WorkerTasks.indexOf(task);\n      WorkerTasks.splice(i, 1);\n    }\n    function loadDocument(recoveryMode) {\n      var loadDocumentCapability = (0, _util.createPromiseCapability)();\n      var parseSuccess = function parseSuccess() {\n        var numPagesPromise = pdfManager.ensureDoc('numPages');\n        var fingerprintPromise = pdfManager.ensureDoc('fingerprint');\n        var encryptedPromise = pdfManager.ensureXRef('encrypt');\n        Promise.all([numPagesPromise, fingerprintPromise, encryptedPromise]).then(function onDocReady(results) {\n          var doc = {\n            numPages: results[0],\n            fingerprint: results[1],\n            encrypted: !!results[2]\n          };\n          loadDocumentCapability.resolve(doc);\n        }, parseFailure);\n      };\n      var parseFailure = function parseFailure(e) {\n        loadDocumentCapability.reject(e);\n      };\n      pdfManager.ensureDoc('checkHeader', []).then(function () {\n        pdfManager.ensureDoc('parseStartXRef', []).then(function () {\n          pdfManager.ensureDoc('parse', [recoveryMode]).then(parseSuccess, parseFailure);\n        }, parseFailure);\n      }, parseFailure);\n      return loadDocumentCapability.promise;\n    }\n    function getPdfManager(data, evaluatorOptions) {\n      var pdfManagerCapability = (0, _util.createPromiseCapability)();\n      var pdfManager;\n      var source = data.source;\n      if (source.data) {\n        try {\n          pdfManager = new _pdf_manager.LocalPdfManager(docId, source.data, source.password, evaluatorOptions, docBaseUrl);\n          pdfManagerCapability.resolve(pdfManager);\n        } catch (ex) {\n          pdfManagerCapability.reject(ex);\n        }\n        return pdfManagerCapability.promise;\n      }\n      var pdfStream,\n          cachedChunks = [];\n      try {\n        pdfStream = new PDFWorkerStream(handler);\n      } catch (ex) {\n        pdfManagerCapability.reject(ex);\n        return pdfManagerCapability.promise;\n      }\n      var fullRequest = pdfStream.getFullReader();\n      fullRequest.headersReady.then(function () {\n        if (!fullRequest.isRangeSupported) {\n          return;\n        }\n        var disableAutoFetch = source.disableAutoFetch || fullRequest.isStreamingSupported;\n        pdfManager = new _pdf_manager.NetworkPdfManager(docId, pdfStream, {\n          msgHandler: handler,\n          url: source.url,\n          password: source.password,\n          length: fullRequest.contentLength,\n          disableAutoFetch: disableAutoFetch,\n          rangeChunkSize: source.rangeChunkSize\n        }, evaluatorOptions, docBaseUrl);\n        for (var i = 0; i < cachedChunks.length; i++) {\n          pdfManager.sendProgressiveData(cachedChunks[i]);\n        }\n        cachedChunks = [];\n        pdfManagerCapability.resolve(pdfManager);\n        cancelXHRs = null;\n      }).catch(function (reason) {\n        pdfManagerCapability.reject(reason);\n        cancelXHRs = null;\n      });\n      var loaded = 0;\n      var flushChunks = function flushChunks() {\n        var pdfFile = (0, _util.arraysToBytes)(cachedChunks);\n        if (source.length && pdfFile.length !== source.length) {\n          (0, _util.warn)('reported HTTP length is different from actual');\n        }\n        try {\n          pdfManager = new _pdf_manager.LocalPdfManager(docId, pdfFile, source.password, evaluatorOptions, docBaseUrl);\n          pdfManagerCapability.resolve(pdfManager);\n        } catch (ex) {\n          pdfManagerCapability.reject(ex);\n        }\n        cachedChunks = [];\n      };\n      var readPromise = new Promise(function (resolve, reject) {\n        var readChunk = function readChunk(chunk) {\n          try {\n            ensureNotTerminated();\n            if (chunk.done) {\n              if (!pdfManager) {\n                flushChunks();\n              }\n              cancelXHRs = null;\n              return;\n            }\n            var data = chunk.value;\n            loaded += (0, _util.arrayByteLength)(data);\n            if (!fullRequest.isStreamingSupported) {\n              handler.send('DocProgress', {\n                loaded: loaded,\n                total: Math.max(loaded, fullRequest.contentLength || 0)\n              });\n            }\n            if (pdfManager) {\n              pdfManager.sendProgressiveData(data);\n            } else {\n              cachedChunks.push(data);\n            }\n            fullRequest.read().then(readChunk, reject);\n          } catch (e) {\n            reject(e);\n          }\n        };\n        fullRequest.read().then(readChunk, reject);\n      });\n      readPromise.catch(function (e) {\n        pdfManagerCapability.reject(e);\n        cancelXHRs = null;\n      });\n      cancelXHRs = function cancelXHRs() {\n        pdfStream.cancelAllRequests('abort');\n      };\n      return pdfManagerCapability.promise;\n    }\n    function setupDoc(data) {\n      function onSuccess(doc) {\n        ensureNotTerminated();\n        handler.send('GetDoc', { pdfInfo: doc });\n      }\n      function onFailure(e) {\n        ensureNotTerminated();\n        if (e instanceof _util.PasswordException) {\n          var task = new WorkerTask('PasswordException: response ' + e.code);\n          startWorkerTask(task);\n          handler.sendWithPromise('PasswordRequest', e).then(function (data) {\n            finishWorkerTask(task);\n            pdfManager.updatePassword(data.password);\n            pdfManagerReady();\n          }).catch(function (ex) {\n            finishWorkerTask(task);\n            handler.send('PasswordException', ex);\n          }.bind(null, e));\n        } else if (e instanceof _util.InvalidPDFException) {\n          handler.send('InvalidPDF', e);\n        } else if (e instanceof _util.MissingPDFException) {\n          handler.send('MissingPDF', e);\n        } else if (e instanceof _util.UnexpectedResponseException) {\n          handler.send('UnexpectedResponse', e);\n        } else {\n          handler.send('UnknownError', new _util.UnknownErrorException(e.message, e.toString()));\n        }\n      }\n      function pdfManagerReady() {\n        ensureNotTerminated();\n        loadDocument(false).then(onSuccess, function loadFailure(ex) {\n          ensureNotTerminated();\n          if (!(ex instanceof _util.XRefParseException)) {\n            onFailure(ex);\n            return;\n          }\n          pdfManager.requestLoadedStream();\n          pdfManager.onLoadedStream().then(function () {\n            ensureNotTerminated();\n            loadDocument(true).then(onSuccess, onFailure);\n          });\n        }, onFailure);\n      }\n      ensureNotTerminated();\n      var evaluatorOptions = {\n        forceDataSchema: data.disableCreateObjectURL,\n        maxImageSize: data.maxImageSize === undefined ? -1 : data.maxImageSize,\n        disableFontFace: data.disableFontFace,\n        nativeImageDecoderSupport: data.nativeImageDecoderSupport,\n        ignoreErrors: data.ignoreErrors\n      };\n      getPdfManager(data, evaluatorOptions).then(function (newPdfManager) {\n        if (terminated) {\n          newPdfManager.terminate();\n          throw new Error('Worker was terminated');\n        }\n        pdfManager = newPdfManager;\n        handler.send('PDFManagerReady', null);\n        pdfManager.onLoadedStream().then(function (stream) {\n          handler.send('DataLoaded', { length: stream.bytes.byteLength });\n        });\n      }).then(pdfManagerReady, onFailure);\n    }\n    handler.on('GetPage', function wphSetupGetPage(data) {\n      return pdfManager.getPage(data.pageIndex).then(function (page) {\n        var rotatePromise = pdfManager.ensure(page, 'rotate');\n        var refPromise = pdfManager.ensure(page, 'ref');\n        var userUnitPromise = pdfManager.ensure(page, 'userUnit');\n        var viewPromise = pdfManager.ensure(page, 'view');\n        return Promise.all([rotatePromise, refPromise, userUnitPromise, viewPromise]).then(function (results) {\n          return {\n            rotate: results[0],\n            ref: results[1],\n            userUnit: results[2],\n            view: results[3]\n          };\n        });\n      });\n    });\n    handler.on('GetPageIndex', function wphSetupGetPageIndex(data) {\n      var ref = new _primitives.Ref(data.ref.num, data.ref.gen);\n      var catalog = pdfManager.pdfDocument.catalog;\n      return catalog.getPageIndex(ref);\n    });\n    handler.on('GetDestinations', function wphSetupGetDestinations(data) {\n      return pdfManager.ensureCatalog('destinations');\n    });\n    handler.on('GetDestination', function wphSetupGetDestination(data) {\n      return pdfManager.ensureCatalog('getDestination', [data.id]);\n    });\n    handler.on('GetPageLabels', function wphSetupGetPageLabels(data) {\n      return pdfManager.ensureCatalog('pageLabels');\n    });\n    handler.on('GetPageMode', function wphSetupGetPageMode(data) {\n      return pdfManager.ensureCatalog('pageMode');\n    });\n    handler.on('GetAttachments', function wphSetupGetAttachments(data) {\n      return pdfManager.ensureCatalog('attachments');\n    });\n    handler.on('GetJavaScript', function wphSetupGetJavaScript(data) {\n      return pdfManager.ensureCatalog('javaScript');\n    });\n    handler.on('GetOutline', function wphSetupGetOutline(data) {\n      return pdfManager.ensureCatalog('documentOutline');\n    });\n    handler.on('GetMetadata', function wphSetupGetMetadata(data) {\n      return Promise.all([pdfManager.ensureDoc('documentInfo'), pdfManager.ensureCatalog('metadata')]);\n    });\n    handler.on('GetData', function wphSetupGetData(data) {\n      pdfManager.requestLoadedStream();\n      return pdfManager.onLoadedStream().then(function (stream) {\n        return stream.bytes;\n      });\n    });\n    handler.on('GetStats', function wphSetupGetStats(data) {\n      return pdfManager.pdfDocument.xref.stats;\n    });\n    handler.on('GetAnnotations', function wphSetupGetAnnotations(data) {\n      return pdfManager.getPage(data.pageIndex).then(function (page) {\n        return pdfManager.ensure(page, 'getAnnotationsData', [data.intent]);\n      });\n    });\n    handler.on('RenderPageRequest', function wphSetupRenderPage(data) {\n      var pageIndex = data.pageIndex;\n      pdfManager.getPage(pageIndex).then(function (page) {\n        var task = new WorkerTask('RenderPageRequest: page ' + pageIndex);\n        startWorkerTask(task);\n        var pageNum = pageIndex + 1;\n        var start = Date.now();\n        page.getOperatorList({\n          handler: handler,\n          task: task,\n          intent: data.intent,\n          renderInteractiveForms: data.renderInteractiveForms\n        }).then(function (operatorList) {\n          finishWorkerTask(task);\n          (0, _util.info)('page=' + pageNum + ' - getOperatorList: time=' + (Date.now() - start) + 'ms, len=' + operatorList.totalLength);\n        }, function (e) {\n          finishWorkerTask(task);\n          if (task.terminated) {\n            return;\n          }\n          handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.unknown });\n          var minimumStackMessage = 'worker.js: while trying to getPage() and getOperatorList()';\n          var wrappedException;\n          if (typeof e === 'string') {\n            wrappedException = {\n              message: e,\n              stack: minimumStackMessage\n            };\n          } else if ((typeof e === 'undefined' ? 'undefined' : _typeof(e)) === 'object') {\n            wrappedException = {\n              message: e.message || e.toString(),\n              stack: e.stack || minimumStackMessage\n            };\n          } else {\n            wrappedException = {\n              message: 'Unknown exception type: ' + (typeof e === 'undefined' ? 'undefined' : _typeof(e)),\n              stack: minimumStackMessage\n            };\n          }\n          handler.send('PageError', {\n            pageNum: pageNum,\n            error: wrappedException,\n            intent: data.intent\n          });\n        });\n      });\n    }, this);\n    handler.on('GetTextContent', function wphExtractText(data, sink) {\n      var pageIndex = data.pageIndex;\n      sink.onPull = function (desiredSize) {};\n      sink.onCancel = function (reason) {};\n      pdfManager.getPage(pageIndex).then(function (page) {\n        var task = new WorkerTask('GetTextContent: page ' + pageIndex);\n        startWorkerTask(task);\n        var pageNum = pageIndex + 1;\n        var start = Date.now();\n        page.extractTextContent({\n          handler: handler,\n          task: task,\n          sink: sink,\n          normalizeWhitespace: data.normalizeWhitespace,\n          combineTextItems: data.combineTextItems\n        }).then(function () {\n          finishWorkerTask(task);\n          (0, _util.info)('text indexing: page=' + pageNum + ' - time=' + (Date.now() - start) + 'ms');\n          sink.close();\n        }, function (reason) {\n          finishWorkerTask(task);\n          if (task.terminated) {\n            return;\n          }\n          sink.error(reason);\n          throw reason;\n        });\n      });\n    });\n    handler.on('Cleanup', function wphCleanup(data) {\n      return pdfManager.cleanup();\n    });\n    handler.on('Terminate', function wphTerminate(data) {\n      terminated = true;\n      if (pdfManager) {\n        pdfManager.terminate();\n        pdfManager = null;\n      }\n      if (cancelXHRs) {\n        cancelXHRs();\n      }\n      var waitOn = [];\n      WorkerTasks.forEach(function (task) {\n        waitOn.push(task.finished);\n        task.terminate();\n      });\n      return Promise.all(waitOn).then(function () {\n        handler.destroy();\n        handler = null;\n      });\n    });\n    handler.on('Ready', function wphReady(data) {\n      setupDoc(docParams);\n      docParams = null;\n    });\n    return workerHandlerName;\n  },\n  initializeFromPort: function initializeFromPort(port) {\n    var handler = new _util.MessageHandler('worker', 'main', port);\n    WorkerMessageHandler.setup(handler, port);\n    handler.send('ready', null);\n  }\n};\nfunction isMessagePort(maybePort) {\n  return typeof maybePort.postMessage === 'function' && 'onmessage' in maybePort;\n}\nif (typeof window === 'undefined' && !(0, _util.isNodeJS)() && typeof self !== 'undefined' && isMessagePort(self)) {\n  WorkerMessageHandler.initializeFromPort(self);\n}\nexports.WorkerTask = WorkerTask;\nexports.WorkerMessageHandler = WorkerMessageHandler;\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _typeof2 = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n(function (e, a) {\n  for (var i in a) {\n    e[i] = a[i];\n  }\n})(exports, function (modules) {\n  var installedModules = {};\n  function __w_pdfjs_require__(moduleId) {\n    if (installedModules[moduleId]) return installedModules[moduleId].exports;\n    var module = installedModules[moduleId] = {\n      i: moduleId,\n      l: false,\n      exports: {}\n    };\n    modules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);\n    module.l = true;\n    return module.exports;\n  }\n  __w_pdfjs_require__.m = modules;\n  __w_pdfjs_require__.c = installedModules;\n  __w_pdfjs_require__.i = function (value) {\n    return value;\n  };\n  __w_pdfjs_require__.d = function (exports, name, getter) {\n    if (!__w_pdfjs_require__.o(exports, name)) {\n      Object.defineProperty(exports, name, {\n        configurable: false,\n        enumerable: true,\n        get: getter\n      });\n    }\n  };\n  __w_pdfjs_require__.n = function (module) {\n    var getter = module && module.__esModule ? function getDefault() {\n      return module['default'];\n    } : function getModuleExports() {\n      return module;\n    };\n    __w_pdfjs_require__.d(getter, 'a', getter);\n    return getter;\n  };\n  __w_pdfjs_require__.o = function (object, property) {\n    return Object.prototype.hasOwnProperty.call(object, property);\n  };\n  __w_pdfjs_require__.p = \"\";\n  return __w_pdfjs_require__(__w_pdfjs_require__.s = 7);\n}([function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _typeof = typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\" ? function (obj) {\n    return typeof obj === 'undefined' ? 'undefined' : _typeof2(obj);\n  } : function (obj) {\n    return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj === 'undefined' ? 'undefined' : _typeof2(obj);\n  };\n  var _require = __w_pdfjs_require__(1),\n      assert = _require.assert;\n  function IsPropertyKey(argument) {\n    return typeof argument === 'string' || (typeof argument === 'undefined' ? 'undefined' : _typeof(argument)) === 'symbol';\n  }\n  exports.typeIsObject = function (x) {\n    return (typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'object' && x !== null || typeof x === 'function';\n  };\n  exports.createDataProperty = function (o, p, v) {\n    assert(exports.typeIsObject(o));\n    Object.defineProperty(o, p, {\n      value: v,\n      writable: true,\n      enumerable: true,\n      configurable: true\n    });\n  };\n  exports.createArrayFromList = function (elements) {\n    return elements.slice();\n  };\n  exports.ArrayBufferCopy = function (dest, destOffset, src, srcOffset, n) {\n    new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset);\n  };\n  exports.CreateIterResultObject = function (value, done) {\n    assert(typeof done === 'boolean');\n    var obj = {};\n    Object.defineProperty(obj, 'value', {\n      value: value,\n      enumerable: true,\n      writable: true,\n      configurable: true\n    });\n    Object.defineProperty(obj, 'done', {\n      value: done,\n      enumerable: true,\n      writable: true,\n      configurable: true\n    });\n    return obj;\n  };\n  exports.IsFiniteNonNegativeNumber = function (v) {\n    if (Number.isNaN(v)) {\n      return false;\n    }\n    if (v === Infinity) {\n      return false;\n    }\n    if (v < 0) {\n      return false;\n    }\n    return true;\n  };\n  function Call(F, V, args) {\n    if (typeof F !== 'function') {\n      throw new TypeError('Argument is not a function');\n    }\n    return Function.prototype.apply.call(F, V, args);\n  }\n  exports.InvokeOrNoop = function (O, P, args) {\n    assert(O !== undefined);\n    assert(IsPropertyKey(P));\n    assert(Array.isArray(args));\n    var method = O[P];\n    if (method === undefined) {\n      return undefined;\n    }\n    return Call(method, O, args);\n  };\n  exports.PromiseInvokeOrNoop = function (O, P, args) {\n    assert(O !== undefined);\n    assert(IsPropertyKey(P));\n    assert(Array.isArray(args));\n    try {\n      return Promise.resolve(exports.InvokeOrNoop(O, P, args));\n    } catch (returnValueE) {\n      return Promise.reject(returnValueE);\n    }\n  };\n  exports.PromiseInvokeOrPerformFallback = function (O, P, args, F, argsF) {\n    assert(O !== undefined);\n    assert(IsPropertyKey(P));\n    assert(Array.isArray(args));\n    assert(Array.isArray(argsF));\n    var method = void 0;\n    try {\n      method = O[P];\n    } catch (methodE) {\n      return Promise.reject(methodE);\n    }\n    if (method === undefined) {\n      return F.apply(null, argsF);\n    }\n    try {\n      return Promise.resolve(Call(method, O, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n  exports.TransferArrayBuffer = function (O) {\n    return O.slice();\n  };\n  exports.ValidateAndNormalizeHighWaterMark = function (highWaterMark) {\n    highWaterMark = Number(highWaterMark);\n    if (Number.isNaN(highWaterMark) || highWaterMark < 0) {\n      throw new RangeError('highWaterMark property of a queuing strategy must be non-negative and non-NaN');\n    }\n    return highWaterMark;\n  };\n  exports.ValidateAndNormalizeQueuingStrategy = function (size, highWaterMark) {\n    if (size !== undefined && typeof size !== 'function') {\n      throw new TypeError('size property of a queuing strategy must be a function');\n    }\n    highWaterMark = exports.ValidateAndNormalizeHighWaterMark(highWaterMark);\n    return {\n      size: size,\n      highWaterMark: highWaterMark\n    };\n  };\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  function rethrowAssertionErrorRejection(e) {\n    if (e && e.constructor === AssertionError) {\n      setTimeout(function () {\n        throw e;\n      }, 0);\n    }\n  }\n  function AssertionError(message) {\n    this.name = 'AssertionError';\n    this.message = message || '';\n    this.stack = new Error().stack;\n  }\n  AssertionError.prototype = Object.create(Error.prototype);\n  AssertionError.prototype.constructor = AssertionError;\n  function assert(value, message) {\n    if (!value) {\n      throw new AssertionError(message);\n    }\n  }\n  module.exports = {\n    rethrowAssertionErrorRejection: rethrowAssertionErrorRejection,\n    AssertionError: AssertionError,\n    assert: assert\n  };\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n  var _require = __w_pdfjs_require__(0),\n      InvokeOrNoop = _require.InvokeOrNoop,\n      PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,\n      ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,\n      typeIsObject = _require.typeIsObject;\n  var _require2 = __w_pdfjs_require__(1),\n      assert = _require2.assert,\n      rethrowAssertionErrorRejection = _require2.rethrowAssertionErrorRejection;\n  var _require3 = __w_pdfjs_require__(3),\n      DequeueValue = _require3.DequeueValue,\n      EnqueueValueWithSize = _require3.EnqueueValueWithSize,\n      PeekQueueValue = _require3.PeekQueueValue,\n      ResetQueue = _require3.ResetQueue;\n  var WritableStream = function () {\n    function WritableStream() {\n      var underlyingSink = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          size = _ref.size,\n          _ref$highWaterMark = _ref.highWaterMark,\n          highWaterMark = _ref$highWaterMark === undefined ? 1 : _ref$highWaterMark;\n      _classCallCheck(this, WritableStream);\n      this._state = 'writable';\n      this._storedError = undefined;\n      this._writer = undefined;\n      this._writableStreamController = undefined;\n      this._writeRequests = [];\n      this._inFlightWriteRequest = undefined;\n      this._closeRequest = undefined;\n      this._inFlightCloseRequest = undefined;\n      this._pendingAbortRequest = undefined;\n      this._backpressure = false;\n      var type = underlyingSink.type;\n      if (type !== undefined) {\n        throw new RangeError('Invalid type is specified');\n      }\n      this._writableStreamController = new WritableStreamDefaultController(this, underlyingSink, size, highWaterMark);\n      this._writableStreamController.__startSteps();\n    }\n    _createClass(WritableStream, [{\n      key: 'abort',\n      value: function abort(reason) {\n        if (IsWritableStream(this) === false) {\n          return Promise.reject(streamBrandCheckException('abort'));\n        }\n        if (IsWritableStreamLocked(this) === true) {\n          return Promise.reject(new TypeError('Cannot abort a stream that already has a writer'));\n        }\n        return WritableStreamAbort(this, reason);\n      }\n    }, {\n      key: 'getWriter',\n      value: function getWriter() {\n        if (IsWritableStream(this) === false) {\n          throw streamBrandCheckException('getWriter');\n        }\n        return AcquireWritableStreamDefaultWriter(this);\n      }\n    }, {\n      key: 'locked',\n      get: function get() {\n        if (IsWritableStream(this) === false) {\n          throw streamBrandCheckException('locked');\n        }\n        return IsWritableStreamLocked(this);\n      }\n    }]);\n    return WritableStream;\n  }();\n  module.exports = {\n    AcquireWritableStreamDefaultWriter: AcquireWritableStreamDefaultWriter,\n    IsWritableStream: IsWritableStream,\n    IsWritableStreamLocked: IsWritableStreamLocked,\n    WritableStream: WritableStream,\n    WritableStreamAbort: WritableStreamAbort,\n    WritableStreamDefaultControllerError: WritableStreamDefaultControllerError,\n    WritableStreamDefaultWriterCloseWithErrorPropagation: WritableStreamDefaultWriterCloseWithErrorPropagation,\n    WritableStreamDefaultWriterRelease: WritableStreamDefaultWriterRelease,\n    WritableStreamDefaultWriterWrite: WritableStreamDefaultWriterWrite,\n    WritableStreamCloseQueuedOrInFlight: WritableStreamCloseQueuedOrInFlight\n  };\n  function AcquireWritableStreamDefaultWriter(stream) {\n    return new WritableStreamDefaultWriter(stream);\n  }\n  function IsWritableStream(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) {\n      return false;\n    }\n    return true;\n  }\n  function IsWritableStreamLocked(stream) {\n    assert(IsWritableStream(stream) === true, 'IsWritableStreamLocked should only be used on known writable streams');\n    if (stream._writer === undefined) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamAbort(stream, reason) {\n    var state = stream._state;\n    if (state === 'closed') {\n      return Promise.resolve(undefined);\n    }\n    if (state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    var error = new TypeError('Requested to abort');\n    if (stream._pendingAbortRequest !== undefined) {\n      return Promise.reject(error);\n    }\n    assert(state === 'writable' || state === 'erroring', 'state must be writable or erroring');\n    var wasAlreadyErroring = false;\n    if (state === 'erroring') {\n      wasAlreadyErroring = true;\n      reason = undefined;\n    }\n    var promise = new Promise(function (resolve, reject) {\n      stream._pendingAbortRequest = {\n        _resolve: resolve,\n        _reject: reject,\n        _reason: reason,\n        _wasAlreadyErroring: wasAlreadyErroring\n      };\n    });\n    if (wasAlreadyErroring === false) {\n      WritableStreamStartErroring(stream, error);\n    }\n    return promise;\n  }\n  function WritableStreamAddWriteRequest(stream) {\n    assert(IsWritableStreamLocked(stream) === true);\n    assert(stream._state === 'writable');\n    var promise = new Promise(function (resolve, reject) {\n      var writeRequest = {\n        _resolve: resolve,\n        _reject: reject\n      };\n      stream._writeRequests.push(writeRequest);\n    });\n    return promise;\n  }\n  function WritableStreamDealWithRejection(stream, error) {\n    var state = stream._state;\n    if (state === 'writable') {\n      WritableStreamStartErroring(stream, error);\n      return;\n    }\n    assert(state === 'erroring');\n    WritableStreamFinishErroring(stream);\n  }\n  function WritableStreamStartErroring(stream, reason) {\n    assert(stream._storedError === undefined, 'stream._storedError === undefined');\n    assert(stream._state === 'writable', 'state must be writable');\n    var controller = stream._writableStreamController;\n    assert(controller !== undefined, 'controller must not be undefined');\n    stream._state = 'erroring';\n    stream._storedError = reason;\n    var writer = stream._writer;\n    if (writer !== undefined) {\n      WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason);\n    }\n    if (WritableStreamHasOperationMarkedInFlight(stream) === false && controller._started === true) {\n      WritableStreamFinishErroring(stream);\n    }\n  }\n  function WritableStreamFinishErroring(stream) {\n    assert(stream._state === 'erroring', 'stream._state === erroring');\n    assert(WritableStreamHasOperationMarkedInFlight(stream) === false, 'WritableStreamHasOperationMarkedInFlight(stream) === false');\n    stream._state = 'errored';\n    stream._writableStreamController.__errorSteps();\n    var storedError = stream._storedError;\n    for (var i = 0; i < stream._writeRequests.length; i++) {\n      var writeRequest = stream._writeRequests[i];\n      writeRequest._reject(storedError);\n    }\n    stream._writeRequests = [];\n    if (stream._pendingAbortRequest === undefined) {\n      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n      return;\n    }\n    var abortRequest = stream._pendingAbortRequest;\n    stream._pendingAbortRequest = undefined;\n    if (abortRequest._wasAlreadyErroring === true) {\n      abortRequest._reject(storedError);\n      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n      return;\n    }\n    var promise = stream._writableStreamController.__abortSteps(abortRequest._reason);\n    promise.then(function () {\n      abortRequest._resolve();\n      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n    }, function (reason) {\n      abortRequest._reject(reason);\n      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n    });\n  }\n  function WritableStreamFinishInFlightWrite(stream) {\n    assert(stream._inFlightWriteRequest !== undefined);\n    stream._inFlightWriteRequest._resolve(undefined);\n    stream._inFlightWriteRequest = undefined;\n  }\n  function WritableStreamFinishInFlightWriteWithError(stream, error) {\n    assert(stream._inFlightWriteRequest !== undefined);\n    stream._inFlightWriteRequest._reject(error);\n    stream._inFlightWriteRequest = undefined;\n    assert(stream._state === 'writable' || stream._state === 'erroring');\n    WritableStreamDealWithRejection(stream, error);\n  }\n  function WritableStreamFinishInFlightClose(stream) {\n    assert(stream._inFlightCloseRequest !== undefined);\n    stream._inFlightCloseRequest._resolve(undefined);\n    stream._inFlightCloseRequest = undefined;\n    var state = stream._state;\n    assert(state === 'writable' || state === 'erroring');\n    if (state === 'erroring') {\n      stream._storedError = undefined;\n      if (stream._pendingAbortRequest !== undefined) {\n        stream._pendingAbortRequest._resolve();\n        stream._pendingAbortRequest = undefined;\n      }\n    }\n    stream._state = 'closed';\n    var writer = stream._writer;\n    if (writer !== undefined) {\n      defaultWriterClosedPromiseResolve(writer);\n    }\n    assert(stream._pendingAbortRequest === undefined, 'stream._pendingAbortRequest === undefined');\n    assert(stream._storedError === undefined, 'stream._storedError === undefined');\n  }\n  function WritableStreamFinishInFlightCloseWithError(stream, error) {\n    assert(stream._inFlightCloseRequest !== undefined);\n    stream._inFlightCloseRequest._reject(error);\n    stream._inFlightCloseRequest = undefined;\n    assert(stream._state === 'writable' || stream._state === 'erroring');\n    if (stream._pendingAbortRequest !== undefined) {\n      stream._pendingAbortRequest._reject(error);\n      stream._pendingAbortRequest = undefined;\n    }\n    WritableStreamDealWithRejection(stream, error);\n  }\n  function WritableStreamCloseQueuedOrInFlight(stream) {\n    if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamHasOperationMarkedInFlight(stream) {\n    if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamMarkCloseRequestInFlight(stream) {\n    assert(stream._inFlightCloseRequest === undefined);\n    assert(stream._closeRequest !== undefined);\n    stream._inFlightCloseRequest = stream._closeRequest;\n    stream._closeRequest = undefined;\n  }\n  function WritableStreamMarkFirstWriteRequestInFlight(stream) {\n    assert(stream._inFlightWriteRequest === undefined, 'there must be no pending write request');\n    assert(stream._writeRequests.length !== 0, 'writeRequests must not be empty');\n    stream._inFlightWriteRequest = stream._writeRequests.shift();\n  }\n  function WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) {\n    assert(stream._state === 'errored', '_stream_.[[state]] is `\"errored\"`');\n    if (stream._closeRequest !== undefined) {\n      assert(stream._inFlightCloseRequest === undefined);\n      stream._closeRequest._reject(stream._storedError);\n      stream._closeRequest = undefined;\n    }\n    var writer = stream._writer;\n    if (writer !== undefined) {\n      defaultWriterClosedPromiseReject(writer, stream._storedError);\n      writer._closedPromise.catch(function () {});\n    }\n  }\n  function WritableStreamUpdateBackpressure(stream, backpressure) {\n    assert(stream._state === 'writable');\n    assert(WritableStreamCloseQueuedOrInFlight(stream) === false);\n    var writer = stream._writer;\n    if (writer !== undefined && backpressure !== stream._backpressure) {\n      if (backpressure === true) {\n        defaultWriterReadyPromiseReset(writer);\n      } else {\n        assert(backpressure === false);\n        defaultWriterReadyPromiseResolve(writer);\n      }\n    }\n    stream._backpressure = backpressure;\n  }\n  var WritableStreamDefaultWriter = function () {\n    function WritableStreamDefaultWriter(stream) {\n      _classCallCheck(this, WritableStreamDefaultWriter);\n      if (IsWritableStream(stream) === false) {\n        throw new TypeError('WritableStreamDefaultWriter can only be constructed with a WritableStream instance');\n      }\n      if (IsWritableStreamLocked(stream) === true) {\n        throw new TypeError('This stream has already been locked for exclusive writing by another writer');\n      }\n      this._ownerWritableStream = stream;\n      stream._writer = this;\n      var state = stream._state;\n      if (state === 'writable') {\n        if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._backpressure === true) {\n          defaultWriterReadyPromiseInitialize(this);\n        } else {\n          defaultWriterReadyPromiseInitializeAsResolved(this);\n        }\n        defaultWriterClosedPromiseInitialize(this);\n      } else if (state === 'erroring') {\n        defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError);\n        this._readyPromise.catch(function () {});\n        defaultWriterClosedPromiseInitialize(this);\n      } else if (state === 'closed') {\n        defaultWriterReadyPromiseInitializeAsResolved(this);\n        defaultWriterClosedPromiseInitializeAsResolved(this);\n      } else {\n        assert(state === 'errored', 'state must be errored');\n        var storedError = stream._storedError;\n        defaultWriterReadyPromiseInitializeAsRejected(this, storedError);\n        this._readyPromise.catch(function () {});\n        defaultWriterClosedPromiseInitializeAsRejected(this, storedError);\n        this._closedPromise.catch(function () {});\n      }\n    }\n    _createClass(WritableStreamDefaultWriter, [{\n      key: 'abort',\n      value: function abort(reason) {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('abort'));\n        }\n        if (this._ownerWritableStream === undefined) {\n          return Promise.reject(defaultWriterLockException('abort'));\n        }\n        return WritableStreamDefaultWriterAbort(this, reason);\n      }\n    }, {\n      key: 'close',\n      value: function close() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('close'));\n        }\n        var stream = this._ownerWritableStream;\n        if (stream === undefined) {\n          return Promise.reject(defaultWriterLockException('close'));\n        }\n        if (WritableStreamCloseQueuedOrInFlight(stream) === true) {\n          return Promise.reject(new TypeError('cannot close an already-closing stream'));\n        }\n        return WritableStreamDefaultWriterClose(this);\n      }\n    }, {\n      key: 'releaseLock',\n      value: function releaseLock() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          throw defaultWriterBrandCheckException('releaseLock');\n        }\n        var stream = this._ownerWritableStream;\n        if (stream === undefined) {\n          return;\n        }\n        assert(stream._writer !== undefined);\n        WritableStreamDefaultWriterRelease(this);\n      }\n    }, {\n      key: 'write',\n      value: function write(chunk) {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('write'));\n        }\n        if (this._ownerWritableStream === undefined) {\n          return Promise.reject(defaultWriterLockException('write to'));\n        }\n        return WritableStreamDefaultWriterWrite(this, chunk);\n      }\n    }, {\n      key: 'closed',\n      get: function get() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('closed'));\n        }\n        return this._closedPromise;\n      }\n    }, {\n      key: 'desiredSize',\n      get: function get() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          throw defaultWriterBrandCheckException('desiredSize');\n        }\n        if (this._ownerWritableStream === undefined) {\n          throw defaultWriterLockException('desiredSize');\n        }\n        return WritableStreamDefaultWriterGetDesiredSize(this);\n      }\n    }, {\n      key: 'ready',\n      get: function get() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('ready'));\n        }\n        return this._readyPromise;\n      }\n    }]);\n    return WritableStreamDefaultWriter;\n  }();\n  function IsWritableStreamDefaultWriter(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamDefaultWriterAbort(writer, reason) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    return WritableStreamAbort(stream, reason);\n  }\n  function WritableStreamDefaultWriterClose(writer) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    var state = stream._state;\n    if (state === 'closed' || state === 'errored') {\n      return Promise.reject(new TypeError('The stream (in ' + state + ' state) is not in the writable state and cannot be closed'));\n    }\n    assert(state === 'writable' || state === 'erroring');\n    assert(WritableStreamCloseQueuedOrInFlight(stream) === false);\n    var promise = new Promise(function (resolve, reject) {\n      var closeRequest = {\n        _resolve: resolve,\n        _reject: reject\n      };\n      stream._closeRequest = closeRequest;\n    });\n    if (stream._backpressure === true && state === 'writable') {\n      defaultWriterReadyPromiseResolve(writer);\n    }\n    WritableStreamDefaultControllerClose(stream._writableStreamController);\n    return promise;\n  }\n  function WritableStreamDefaultWriterCloseWithErrorPropagation(writer) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    var state = stream._state;\n    if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {\n      return Promise.resolve();\n    }\n    if (state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    assert(state === 'writable' || state === 'erroring');\n    return WritableStreamDefaultWriterClose(writer);\n  }\n  function WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) {\n    if (writer._closedPromiseState === 'pending') {\n      defaultWriterClosedPromiseReject(writer, error);\n    } else {\n      defaultWriterClosedPromiseResetToRejected(writer, error);\n    }\n    writer._closedPromise.catch(function () {});\n  }\n  function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) {\n    if (writer._readyPromiseState === 'pending') {\n      defaultWriterReadyPromiseReject(writer, error);\n    } else {\n      defaultWriterReadyPromiseResetToRejected(writer, error);\n    }\n    writer._readyPromise.catch(function () {});\n  }\n  function WritableStreamDefaultWriterGetDesiredSize(writer) {\n    var stream = writer._ownerWritableStream;\n    var state = stream._state;\n    if (state === 'errored' || state === 'erroring') {\n      return null;\n    }\n    if (state === 'closed') {\n      return 0;\n    }\n    return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController);\n  }\n  function WritableStreamDefaultWriterRelease(writer) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    assert(stream._writer === writer);\n    var releasedError = new TypeError('Writer was released and can no longer be used to monitor the stream\\'s closedness');\n    WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError);\n    WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError);\n    stream._writer = undefined;\n    writer._ownerWritableStream = undefined;\n  }\n  function WritableStreamDefaultWriterWrite(writer, chunk) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    var controller = stream._writableStreamController;\n    var chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk);\n    if (stream !== writer._ownerWritableStream) {\n      return Promise.reject(defaultWriterLockException('write to'));\n    }\n    var state = stream._state;\n    if (state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {\n      return Promise.reject(new TypeError('The stream is closing or closed and cannot be written to'));\n    }\n    if (state === 'erroring') {\n      return Promise.reject(stream._storedError);\n    }\n    assert(state === 'writable');\n    var promise = WritableStreamAddWriteRequest(stream);\n    WritableStreamDefaultControllerWrite(controller, chunk, chunkSize);\n    return promise;\n  }\n  var WritableStreamDefaultController = function () {\n    function WritableStreamDefaultController(stream, underlyingSink, size, highWaterMark) {\n      _classCallCheck(this, WritableStreamDefaultController);\n      if (IsWritableStream(stream) === false) {\n        throw new TypeError('WritableStreamDefaultController can only be constructed with a WritableStream instance');\n      }\n      if (stream._writableStreamController !== undefined) {\n        throw new TypeError('WritableStreamDefaultController instances can only be created by the WritableStream constructor');\n      }\n      this._controlledWritableStream = stream;\n      this._underlyingSink = underlyingSink;\n      this._queue = undefined;\n      this._queueTotalSize = undefined;\n      ResetQueue(this);\n      this._started = false;\n      var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);\n      this._strategySize = normalizedStrategy.size;\n      this._strategyHWM = normalizedStrategy.highWaterMark;\n      var backpressure = WritableStreamDefaultControllerGetBackpressure(this);\n      WritableStreamUpdateBackpressure(stream, backpressure);\n    }\n    _createClass(WritableStreamDefaultController, [{\n      key: 'error',\n      value: function error(e) {\n        if (IsWritableStreamDefaultController(this) === false) {\n          throw new TypeError('WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController');\n        }\n        var state = this._controlledWritableStream._state;\n        if (state !== 'writable') {\n          return;\n        }\n        WritableStreamDefaultControllerError(this, e);\n      }\n    }, {\n      key: '__abortSteps',\n      value: function __abortSteps(reason) {\n        return PromiseInvokeOrNoop(this._underlyingSink, 'abort', [reason]);\n      }\n    }, {\n      key: '__errorSteps',\n      value: function __errorSteps() {\n        ResetQueue(this);\n      }\n    }, {\n      key: '__startSteps',\n      value: function __startSteps() {\n        var _this = this;\n        var startResult = InvokeOrNoop(this._underlyingSink, 'start', [this]);\n        var stream = this._controlledWritableStream;\n        Promise.resolve(startResult).then(function () {\n          assert(stream._state === 'writable' || stream._state === 'erroring');\n          _this._started = true;\n          WritableStreamDefaultControllerAdvanceQueueIfNeeded(_this);\n        }, function (r) {\n          assert(stream._state === 'writable' || stream._state === 'erroring');\n          _this._started = true;\n          WritableStreamDealWithRejection(stream, r);\n        }).catch(rethrowAssertionErrorRejection);\n      }\n    }]);\n    return WritableStreamDefaultController;\n  }();\n  function WritableStreamDefaultControllerClose(controller) {\n    EnqueueValueWithSize(controller, 'close', 0);\n    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n  }\n  function WritableStreamDefaultControllerGetChunkSize(controller, chunk) {\n    var strategySize = controller._strategySize;\n    if (strategySize === undefined) {\n      return 1;\n    }\n    try {\n      return strategySize(chunk);\n    } catch (chunkSizeE) {\n      WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);\n      return 1;\n    }\n  }\n  function WritableStreamDefaultControllerGetDesiredSize(controller) {\n    return controller._strategyHWM - controller._queueTotalSize;\n  }\n  function WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) {\n    var writeRecord = { chunk: chunk };\n    try {\n      EnqueueValueWithSize(controller, writeRecord, chunkSize);\n    } catch (enqueueE) {\n      WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);\n      return;\n    }\n    var stream = controller._controlledWritableStream;\n    if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._state === 'writable') {\n      var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);\n      WritableStreamUpdateBackpressure(stream, backpressure);\n    }\n    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n  }\n  function IsWritableStreamDefaultController(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSink')) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) {\n    var stream = controller._controlledWritableStream;\n    if (controller._started === false) {\n      return;\n    }\n    if (stream._inFlightWriteRequest !== undefined) {\n      return;\n    }\n    var state = stream._state;\n    if (state === 'closed' || state === 'errored') {\n      return;\n    }\n    if (state === 'erroring') {\n      WritableStreamFinishErroring(stream);\n      return;\n    }\n    if (controller._queue.length === 0) {\n      return;\n    }\n    var writeRecord = PeekQueueValue(controller);\n    if (writeRecord === 'close') {\n      WritableStreamDefaultControllerProcessClose(controller);\n    } else {\n      WritableStreamDefaultControllerProcessWrite(controller, writeRecord.chunk);\n    }\n  }\n  function WritableStreamDefaultControllerErrorIfNeeded(controller, error) {\n    if (controller._controlledWritableStream._state === 'writable') {\n      WritableStreamDefaultControllerError(controller, error);\n    }\n  }\n  function WritableStreamDefaultControllerProcessClose(controller) {\n    var stream = controller._controlledWritableStream;\n    WritableStreamMarkCloseRequestInFlight(stream);\n    DequeueValue(controller);\n    assert(controller._queue.length === 0, 'queue must be empty once the final write record is dequeued');\n    var sinkClosePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'close', []);\n    sinkClosePromise.then(function () {\n      WritableStreamFinishInFlightClose(stream);\n    }, function (reason) {\n      WritableStreamFinishInFlightCloseWithError(stream, reason);\n    }).catch(rethrowAssertionErrorRejection);\n  }\n  function WritableStreamDefaultControllerProcessWrite(controller, chunk) {\n    var stream = controller._controlledWritableStream;\n    WritableStreamMarkFirstWriteRequestInFlight(stream);\n    var sinkWritePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'write', [chunk, controller]);\n    sinkWritePromise.then(function () {\n      WritableStreamFinishInFlightWrite(stream);\n      var state = stream._state;\n      assert(state === 'writable' || state === 'erroring');\n      DequeueValue(controller);\n      if (WritableStreamCloseQueuedOrInFlight(stream) === false && state === 'writable') {\n        var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);\n        WritableStreamUpdateBackpressure(stream, backpressure);\n      }\n      WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n    }, function (reason) {\n      WritableStreamFinishInFlightWriteWithError(stream, reason);\n    }).catch(rethrowAssertionErrorRejection);\n  }\n  function WritableStreamDefaultControllerGetBackpressure(controller) {\n    var desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller);\n    return desiredSize <= 0;\n  }\n  function WritableStreamDefaultControllerError(controller, error) {\n    var stream = controller._controlledWritableStream;\n    assert(stream._state === 'writable');\n    WritableStreamStartErroring(stream, error);\n  }\n  function streamBrandCheckException(name) {\n    return new TypeError('WritableStream.prototype.' + name + ' can only be used on a WritableStream');\n  }\n  function defaultWriterBrandCheckException(name) {\n    return new TypeError('WritableStreamDefaultWriter.prototype.' + name + ' can only be used on a WritableStreamDefaultWriter');\n  }\n  function defaultWriterLockException(name) {\n    return new TypeError('Cannot ' + name + ' a stream using a released writer');\n  }\n  function defaultWriterClosedPromiseInitialize(writer) {\n    writer._closedPromise = new Promise(function (resolve, reject) {\n      writer._closedPromise_resolve = resolve;\n      writer._closedPromise_reject = reject;\n      writer._closedPromiseState = 'pending';\n    });\n  }\n  function defaultWriterClosedPromiseInitializeAsRejected(writer, reason) {\n    writer._closedPromise = Promise.reject(reason);\n    writer._closedPromise_resolve = undefined;\n    writer._closedPromise_reject = undefined;\n    writer._closedPromiseState = 'rejected';\n  }\n  function defaultWriterClosedPromiseInitializeAsResolved(writer) {\n    writer._closedPromise = Promise.resolve(undefined);\n    writer._closedPromise_resolve = undefined;\n    writer._closedPromise_reject = undefined;\n    writer._closedPromiseState = 'resolved';\n  }\n  function defaultWriterClosedPromiseReject(writer, reason) {\n    assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');\n    assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');\n    assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');\n    writer._closedPromise_reject(reason);\n    writer._closedPromise_resolve = undefined;\n    writer._closedPromise_reject = undefined;\n    writer._closedPromiseState = 'rejected';\n  }\n  function defaultWriterClosedPromiseResetToRejected(writer, reason) {\n    assert(writer._closedPromise_resolve === undefined, 'writer._closedPromise_resolve === undefined');\n    assert(writer._closedPromise_reject === undefined, 'writer._closedPromise_reject === undefined');\n    assert(writer._closedPromiseState !== 'pending', 'writer._closedPromiseState is not pending');\n    writer._closedPromise = Promise.reject(reason);\n    writer._closedPromiseState = 'rejected';\n  }\n  function defaultWriterClosedPromiseResolve(writer) {\n    assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');\n    assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');\n    assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');\n    writer._closedPromise_resolve(undefined);\n    writer._closedPromise_resolve = undefined;\n    writer._closedPromise_reject = undefined;\n    writer._closedPromiseState = 'resolved';\n  }\n  function defaultWriterReadyPromiseInitialize(writer) {\n    writer._readyPromise = new Promise(function (resolve, reject) {\n      writer._readyPromise_resolve = resolve;\n      writer._readyPromise_reject = reject;\n    });\n    writer._readyPromiseState = 'pending';\n  }\n  function defaultWriterReadyPromiseInitializeAsRejected(writer, reason) {\n    writer._readyPromise = Promise.reject(reason);\n    writer._readyPromise_resolve = undefined;\n    writer._readyPromise_reject = undefined;\n    writer._readyPromiseState = 'rejected';\n  }\n  function defaultWriterReadyPromiseInitializeAsResolved(writer) {\n    writer._readyPromise = Promise.resolve(undefined);\n    writer._readyPromise_resolve = undefined;\n    writer._readyPromise_reject = undefined;\n    writer._readyPromiseState = 'fulfilled';\n  }\n  function defaultWriterReadyPromiseReject(writer, reason) {\n    assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');\n    assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');\n    writer._readyPromise_reject(reason);\n    writer._readyPromise_resolve = undefined;\n    writer._readyPromise_reject = undefined;\n    writer._readyPromiseState = 'rejected';\n  }\n  function defaultWriterReadyPromiseReset(writer) {\n    assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');\n    assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');\n    writer._readyPromise = new Promise(function (resolve, reject) {\n      writer._readyPromise_resolve = resolve;\n      writer._readyPromise_reject = reject;\n    });\n    writer._readyPromiseState = 'pending';\n  }\n  function defaultWriterReadyPromiseResetToRejected(writer, reason) {\n    assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');\n    assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');\n    writer._readyPromise = Promise.reject(reason);\n    writer._readyPromiseState = 'rejected';\n  }\n  function defaultWriterReadyPromiseResolve(writer) {\n    assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');\n    assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');\n    writer._readyPromise_resolve(undefined);\n    writer._readyPromise_resolve = undefined;\n    writer._readyPromise_reject = undefined;\n    writer._readyPromiseState = 'fulfilled';\n  }\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _require = __w_pdfjs_require__(0),\n      IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber;\n  var _require2 = __w_pdfjs_require__(1),\n      assert = _require2.assert;\n  exports.DequeueValue = function (container) {\n    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: DequeueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n    assert(container._queue.length > 0, 'Spec-level failure: should never dequeue from an empty queue.');\n    var pair = container._queue.shift();\n    container._queueTotalSize -= pair.size;\n    if (container._queueTotalSize < 0) {\n      container._queueTotalSize = 0;\n    }\n    return pair.value;\n  };\n  exports.EnqueueValueWithSize = function (container, value, size) {\n    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: EnqueueValueWithSize should only be used on containers with [[queue]] and ' + '[[queueTotalSize]].');\n    size = Number(size);\n    if (!IsFiniteNonNegativeNumber(size)) {\n      throw new RangeError('Size must be a finite, non-NaN, non-negative number.');\n    }\n    container._queue.push({\n      value: value,\n      size: size\n    });\n    container._queueTotalSize += size;\n  };\n  exports.PeekQueueValue = function (container) {\n    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: PeekQueueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n    assert(container._queue.length > 0, 'Spec-level failure: should never peek at an empty queue.');\n    var pair = container._queue[0];\n    return pair.value;\n  };\n  exports.ResetQueue = function (container) {\n    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: ResetQueue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n    container._queue = [];\n    container._queueTotalSize = 0;\n  };\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n  var _require = __w_pdfjs_require__(0),\n      ArrayBufferCopy = _require.ArrayBufferCopy,\n      CreateIterResultObject = _require.CreateIterResultObject,\n      IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber,\n      InvokeOrNoop = _require.InvokeOrNoop,\n      PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,\n      TransferArrayBuffer = _require.TransferArrayBuffer,\n      ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,\n      ValidateAndNormalizeHighWaterMark = _require.ValidateAndNormalizeHighWaterMark;\n  var _require2 = __w_pdfjs_require__(0),\n      createArrayFromList = _require2.createArrayFromList,\n      createDataProperty = _require2.createDataProperty,\n      typeIsObject = _require2.typeIsObject;\n  var _require3 = __w_pdfjs_require__(1),\n      assert = _require3.assert,\n      rethrowAssertionErrorRejection = _require3.rethrowAssertionErrorRejection;\n  var _require4 = __w_pdfjs_require__(3),\n      DequeueValue = _require4.DequeueValue,\n      EnqueueValueWithSize = _require4.EnqueueValueWithSize,\n      ResetQueue = _require4.ResetQueue;\n  var _require5 = __w_pdfjs_require__(2),\n      AcquireWritableStreamDefaultWriter = _require5.AcquireWritableStreamDefaultWriter,\n      IsWritableStream = _require5.IsWritableStream,\n      IsWritableStreamLocked = _require5.IsWritableStreamLocked,\n      WritableStreamAbort = _require5.WritableStreamAbort,\n      WritableStreamDefaultWriterCloseWithErrorPropagation = _require5.WritableStreamDefaultWriterCloseWithErrorPropagation,\n      WritableStreamDefaultWriterRelease = _require5.WritableStreamDefaultWriterRelease,\n      WritableStreamDefaultWriterWrite = _require5.WritableStreamDefaultWriterWrite,\n      WritableStreamCloseQueuedOrInFlight = _require5.WritableStreamCloseQueuedOrInFlight;\n  var ReadableStream = function () {\n    function ReadableStream() {\n      var underlyingSource = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          size = _ref.size,\n          highWaterMark = _ref.highWaterMark;\n      _classCallCheck(this, ReadableStream);\n      this._state = 'readable';\n      this._reader = undefined;\n      this._storedError = undefined;\n      this._disturbed = false;\n      this._readableStreamController = undefined;\n      var type = underlyingSource.type;\n      var typeString = String(type);\n      if (typeString === 'bytes') {\n        if (highWaterMark === undefined) {\n          highWaterMark = 0;\n        }\n        this._readableStreamController = new ReadableByteStreamController(this, underlyingSource, highWaterMark);\n      } else if (type === undefined) {\n        if (highWaterMark === undefined) {\n          highWaterMark = 1;\n        }\n        this._readableStreamController = new ReadableStreamDefaultController(this, underlyingSource, size, highWaterMark);\n      } else {\n        throw new RangeError('Invalid type is specified');\n      }\n    }\n    _createClass(ReadableStream, [{\n      key: 'cancel',\n      value: function cancel(reason) {\n        if (IsReadableStream(this) === false) {\n          return Promise.reject(streamBrandCheckException('cancel'));\n        }\n        if (IsReadableStreamLocked(this) === true) {\n          return Promise.reject(new TypeError('Cannot cancel a stream that already has a reader'));\n        }\n        return ReadableStreamCancel(this, reason);\n      }\n    }, {\n      key: 'getReader',\n      value: function getReader() {\n        var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n            mode = _ref2.mode;\n        if (IsReadableStream(this) === false) {\n          throw streamBrandCheckException('getReader');\n        }\n        if (mode === undefined) {\n          return AcquireReadableStreamDefaultReader(this);\n        }\n        mode = String(mode);\n        if (mode === 'byob') {\n          return AcquireReadableStreamBYOBReader(this);\n        }\n        throw new RangeError('Invalid mode is specified');\n      }\n    }, {\n      key: 'pipeThrough',\n      value: function pipeThrough(_ref3, options) {\n        var writable = _ref3.writable,\n            readable = _ref3.readable;\n        var promise = this.pipeTo(writable, options);\n        ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise);\n        return readable;\n      }\n    }, {\n      key: 'pipeTo',\n      value: function pipeTo(dest) {\n        var _this = this;\n        var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n            preventClose = _ref4.preventClose,\n            preventAbort = _ref4.preventAbort,\n            preventCancel = _ref4.preventCancel;\n        if (IsReadableStream(this) === false) {\n          return Promise.reject(streamBrandCheckException('pipeTo'));\n        }\n        if (IsWritableStream(dest) === false) {\n          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo\\'s first argument must be a WritableStream'));\n        }\n        preventClose = Boolean(preventClose);\n        preventAbort = Boolean(preventAbort);\n        preventCancel = Boolean(preventCancel);\n        if (IsReadableStreamLocked(this) === true) {\n          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream'));\n        }\n        if (IsWritableStreamLocked(dest) === true) {\n          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream'));\n        }\n        var reader = AcquireReadableStreamDefaultReader(this);\n        var writer = AcquireWritableStreamDefaultWriter(dest);\n        var shuttingDown = false;\n        var currentWrite = Promise.resolve();\n        return new Promise(function (resolve, reject) {\n          function pipeLoop() {\n            currentWrite = Promise.resolve();\n            if (shuttingDown === true) {\n              return Promise.resolve();\n            }\n            return writer._readyPromise.then(function () {\n              return ReadableStreamDefaultReaderRead(reader).then(function (_ref5) {\n                var value = _ref5.value,\n                    done = _ref5.done;\n                if (done === true) {\n                  return;\n                }\n                currentWrite = WritableStreamDefaultWriterWrite(writer, value).catch(function () {});\n              });\n            }).then(pipeLoop);\n          }\n          isOrBecomesErrored(_this, reader._closedPromise, function (storedError) {\n            if (preventAbort === false) {\n              shutdownWithAction(function () {\n                return WritableStreamAbort(dest, storedError);\n              }, true, storedError);\n            } else {\n              shutdown(true, storedError);\n            }\n          });\n          isOrBecomesErrored(dest, writer._closedPromise, function (storedError) {\n            if (preventCancel === false) {\n              shutdownWithAction(function () {\n                return ReadableStreamCancel(_this, storedError);\n              }, true, storedError);\n            } else {\n              shutdown(true, storedError);\n            }\n          });\n          isOrBecomesClosed(_this, reader._closedPromise, function () {\n            if (preventClose === false) {\n              shutdownWithAction(function () {\n                return WritableStreamDefaultWriterCloseWithErrorPropagation(writer);\n              });\n            } else {\n              shutdown();\n            }\n          });\n          if (WritableStreamCloseQueuedOrInFlight(dest) === true || dest._state === 'closed') {\n            var destClosed = new TypeError('the destination writable stream closed before all data could be piped to it');\n            if (preventCancel === false) {\n              shutdownWithAction(function () {\n                return ReadableStreamCancel(_this, destClosed);\n              }, true, destClosed);\n            } else {\n              shutdown(true, destClosed);\n            }\n          }\n          pipeLoop().catch(function (err) {\n            currentWrite = Promise.resolve();\n            rethrowAssertionErrorRejection(err);\n          });\n          function waitForWritesToFinish() {\n            var oldCurrentWrite = currentWrite;\n            return currentWrite.then(function () {\n              return oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined;\n            });\n          }\n          function isOrBecomesErrored(stream, promise, action) {\n            if (stream._state === 'errored') {\n              action(stream._storedError);\n            } else {\n              promise.catch(action).catch(rethrowAssertionErrorRejection);\n            }\n          }\n          function isOrBecomesClosed(stream, promise, action) {\n            if (stream._state === 'closed') {\n              action();\n            } else {\n              promise.then(action).catch(rethrowAssertionErrorRejection);\n            }\n          }\n          function shutdownWithAction(action, originalIsError, originalError) {\n            if (shuttingDown === true) {\n              return;\n            }\n            shuttingDown = true;\n            if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {\n              waitForWritesToFinish().then(doTheRest);\n            } else {\n              doTheRest();\n            }\n            function doTheRest() {\n              action().then(function () {\n                return finalize(originalIsError, originalError);\n              }, function (newError) {\n                return finalize(true, newError);\n              }).catch(rethrowAssertionErrorRejection);\n            }\n          }\n          function shutdown(isError, error) {\n            if (shuttingDown === true) {\n              return;\n            }\n            shuttingDown = true;\n            if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {\n              waitForWritesToFinish().then(function () {\n                return finalize(isError, error);\n              }).catch(rethrowAssertionErrorRejection);\n            } else {\n              finalize(isError, error);\n            }\n          }\n          function finalize(isError, error) {\n            WritableStreamDefaultWriterRelease(writer);\n            ReadableStreamReaderGenericRelease(reader);\n            if (isError) {\n              reject(error);\n            } else {\n              resolve(undefined);\n            }\n          }\n        });\n      }\n    }, {\n      key: 'tee',\n      value: function tee() {\n        if (IsReadableStream(this) === false) {\n          throw streamBrandCheckException('tee');\n        }\n        var branches = ReadableStreamTee(this, false);\n        return createArrayFromList(branches);\n      }\n    }, {\n      key: 'locked',\n      get: function get() {\n        if (IsReadableStream(this) === false) {\n          throw streamBrandCheckException('locked');\n        }\n        return IsReadableStreamLocked(this);\n      }\n    }]);\n    return ReadableStream;\n  }();\n  module.exports = {\n    ReadableStream: ReadableStream,\n    IsReadableStreamDisturbed: IsReadableStreamDisturbed,\n    ReadableStreamDefaultControllerClose: ReadableStreamDefaultControllerClose,\n    ReadableStreamDefaultControllerEnqueue: ReadableStreamDefaultControllerEnqueue,\n    ReadableStreamDefaultControllerError: ReadableStreamDefaultControllerError,\n    ReadableStreamDefaultControllerGetDesiredSize: ReadableStreamDefaultControllerGetDesiredSize\n  };\n  function AcquireReadableStreamBYOBReader(stream) {\n    return new ReadableStreamBYOBReader(stream);\n  }\n  function AcquireReadableStreamDefaultReader(stream) {\n    return new ReadableStreamDefaultReader(stream);\n  }\n  function IsReadableStream(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) {\n      return false;\n    }\n    return true;\n  }\n  function IsReadableStreamDisturbed(stream) {\n    assert(IsReadableStream(stream) === true, 'IsReadableStreamDisturbed should only be used on known readable streams');\n    return stream._disturbed;\n  }\n  function IsReadableStreamLocked(stream) {\n    assert(IsReadableStream(stream) === true, 'IsReadableStreamLocked should only be used on known readable streams');\n    if (stream._reader === undefined) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableStreamTee(stream, cloneForBranch2) {\n    assert(IsReadableStream(stream) === true);\n    assert(typeof cloneForBranch2 === 'boolean');\n    var reader = AcquireReadableStreamDefaultReader(stream);\n    var teeState = {\n      closedOrErrored: false,\n      canceled1: false,\n      canceled2: false,\n      reason1: undefined,\n      reason2: undefined\n    };\n    teeState.promise = new Promise(function (resolve) {\n      teeState._resolve = resolve;\n    });\n    var pull = create_ReadableStreamTeePullFunction();\n    pull._reader = reader;\n    pull._teeState = teeState;\n    pull._cloneForBranch2 = cloneForBranch2;\n    var cancel1 = create_ReadableStreamTeeBranch1CancelFunction();\n    cancel1._stream = stream;\n    cancel1._teeState = teeState;\n    var cancel2 = create_ReadableStreamTeeBranch2CancelFunction();\n    cancel2._stream = stream;\n    cancel2._teeState = teeState;\n    var underlyingSource1 = Object.create(Object.prototype);\n    createDataProperty(underlyingSource1, 'pull', pull);\n    createDataProperty(underlyingSource1, 'cancel', cancel1);\n    var branch1Stream = new ReadableStream(underlyingSource1);\n    var underlyingSource2 = Object.create(Object.prototype);\n    createDataProperty(underlyingSource2, 'pull', pull);\n    createDataProperty(underlyingSource2, 'cancel', cancel2);\n    var branch2Stream = new ReadableStream(underlyingSource2);\n    pull._branch1 = branch1Stream._readableStreamController;\n    pull._branch2 = branch2Stream._readableStreamController;\n    reader._closedPromise.catch(function (r) {\n      if (teeState.closedOrErrored === true) {\n        return;\n      }\n      ReadableStreamDefaultControllerError(pull._branch1, r);\n      ReadableStreamDefaultControllerError(pull._branch2, r);\n      teeState.closedOrErrored = true;\n    });\n    return [branch1Stream, branch2Stream];\n  }\n  function create_ReadableStreamTeePullFunction() {\n    function f() {\n      var reader = f._reader,\n          branch1 = f._branch1,\n          branch2 = f._branch2,\n          teeState = f._teeState;\n      return ReadableStreamDefaultReaderRead(reader).then(function (result) {\n        assert(typeIsObject(result));\n        var value = result.value;\n        var done = result.done;\n        assert(typeof done === 'boolean');\n        if (done === true && teeState.closedOrErrored === false) {\n          if (teeState.canceled1 === false) {\n            ReadableStreamDefaultControllerClose(branch1);\n          }\n          if (teeState.canceled2 === false) {\n            ReadableStreamDefaultControllerClose(branch2);\n          }\n          teeState.closedOrErrored = true;\n        }\n        if (teeState.closedOrErrored === true) {\n          return;\n        }\n        var value1 = value;\n        var value2 = value;\n        if (teeState.canceled1 === false) {\n          ReadableStreamDefaultControllerEnqueue(branch1, value1);\n        }\n        if (teeState.canceled2 === false) {\n          ReadableStreamDefaultControllerEnqueue(branch2, value2);\n        }\n      });\n    }\n    return f;\n  }\n  function create_ReadableStreamTeeBranch1CancelFunction() {\n    function f(reason) {\n      var stream = f._stream,\n          teeState = f._teeState;\n      teeState.canceled1 = true;\n      teeState.reason1 = reason;\n      if (teeState.canceled2 === true) {\n        var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);\n        var cancelResult = ReadableStreamCancel(stream, compositeReason);\n        teeState._resolve(cancelResult);\n      }\n      return teeState.promise;\n    }\n    return f;\n  }\n  function create_ReadableStreamTeeBranch2CancelFunction() {\n    function f(reason) {\n      var stream = f._stream,\n          teeState = f._teeState;\n      teeState.canceled2 = true;\n      teeState.reason2 = reason;\n      if (teeState.canceled1 === true) {\n        var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);\n        var cancelResult = ReadableStreamCancel(stream, compositeReason);\n        teeState._resolve(cancelResult);\n      }\n      return teeState.promise;\n    }\n    return f;\n  }\n  function ReadableStreamAddReadIntoRequest(stream) {\n    assert(IsReadableStreamBYOBReader(stream._reader) === true);\n    assert(stream._state === 'readable' || stream._state === 'closed');\n    var promise = new Promise(function (resolve, reject) {\n      var readIntoRequest = {\n        _resolve: resolve,\n        _reject: reject\n      };\n      stream._reader._readIntoRequests.push(readIntoRequest);\n    });\n    return promise;\n  }\n  function ReadableStreamAddReadRequest(stream) {\n    assert(IsReadableStreamDefaultReader(stream._reader) === true);\n    assert(stream._state === 'readable');\n    var promise = new Promise(function (resolve, reject) {\n      var readRequest = {\n        _resolve: resolve,\n        _reject: reject\n      };\n      stream._reader._readRequests.push(readRequest);\n    });\n    return promise;\n  }\n  function ReadableStreamCancel(stream, reason) {\n    stream._disturbed = true;\n    if (stream._state === 'closed') {\n      return Promise.resolve(undefined);\n    }\n    if (stream._state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    ReadableStreamClose(stream);\n    var sourceCancelPromise = stream._readableStreamController.__cancelSteps(reason);\n    return sourceCancelPromise.then(function () {\n      return undefined;\n    });\n  }\n  function ReadableStreamClose(stream) {\n    assert(stream._state === 'readable');\n    stream._state = 'closed';\n    var reader = stream._reader;\n    if (reader === undefined) {\n      return undefined;\n    }\n    if (IsReadableStreamDefaultReader(reader) === true) {\n      for (var i = 0; i < reader._readRequests.length; i++) {\n        var _resolve = reader._readRequests[i]._resolve;\n        _resolve(CreateIterResultObject(undefined, true));\n      }\n      reader._readRequests = [];\n    }\n    defaultReaderClosedPromiseResolve(reader);\n    return undefined;\n  }\n  function ReadableStreamError(stream, e) {\n    assert(IsReadableStream(stream) === true, 'stream must be ReadableStream');\n    assert(stream._state === 'readable', 'state must be readable');\n    stream._state = 'errored';\n    stream._storedError = e;\n    var reader = stream._reader;\n    if (reader === undefined) {\n      return undefined;\n    }\n    if (IsReadableStreamDefaultReader(reader) === true) {\n      for (var i = 0; i < reader._readRequests.length; i++) {\n        var readRequest = reader._readRequests[i];\n        readRequest._reject(e);\n      }\n      reader._readRequests = [];\n    } else {\n      assert(IsReadableStreamBYOBReader(reader), 'reader must be ReadableStreamBYOBReader');\n      for (var _i = 0; _i < reader._readIntoRequests.length; _i++) {\n        var readIntoRequest = reader._readIntoRequests[_i];\n        readIntoRequest._reject(e);\n      }\n      reader._readIntoRequests = [];\n    }\n    defaultReaderClosedPromiseReject(reader, e);\n    reader._closedPromise.catch(function () {});\n  }\n  function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) {\n    var reader = stream._reader;\n    assert(reader._readIntoRequests.length > 0);\n    var readIntoRequest = reader._readIntoRequests.shift();\n    readIntoRequest._resolve(CreateIterResultObject(chunk, done));\n  }\n  function ReadableStreamFulfillReadRequest(stream, chunk, done) {\n    var reader = stream._reader;\n    assert(reader._readRequests.length > 0);\n    var readRequest = reader._readRequests.shift();\n    readRequest._resolve(CreateIterResultObject(chunk, done));\n  }\n  function ReadableStreamGetNumReadIntoRequests(stream) {\n    return stream._reader._readIntoRequests.length;\n  }\n  function ReadableStreamGetNumReadRequests(stream) {\n    return stream._reader._readRequests.length;\n  }\n  function ReadableStreamHasBYOBReader(stream) {\n    var reader = stream._reader;\n    if (reader === undefined) {\n      return false;\n    }\n    if (IsReadableStreamBYOBReader(reader) === false) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableStreamHasDefaultReader(stream) {\n    var reader = stream._reader;\n    if (reader === undefined) {\n      return false;\n    }\n    if (IsReadableStreamDefaultReader(reader) === false) {\n      return false;\n    }\n    return true;\n  }\n  var ReadableStreamDefaultReader = function () {\n    function ReadableStreamDefaultReader(stream) {\n      _classCallCheck(this, ReadableStreamDefaultReader);\n      if (IsReadableStream(stream) === false) {\n        throw new TypeError('ReadableStreamDefaultReader can only be constructed with a ReadableStream instance');\n      }\n      if (IsReadableStreamLocked(stream) === true) {\n        throw new TypeError('This stream has already been locked for exclusive reading by another reader');\n      }\n      ReadableStreamReaderGenericInitialize(this, stream);\n      this._readRequests = [];\n    }\n    _createClass(ReadableStreamDefaultReader, [{\n      key: 'cancel',\n      value: function cancel(reason) {\n        if (IsReadableStreamDefaultReader(this) === false) {\n          return Promise.reject(defaultReaderBrandCheckException('cancel'));\n        }\n        if (this._ownerReadableStream === undefined) {\n          return Promise.reject(readerLockException('cancel'));\n        }\n        return ReadableStreamReaderGenericCancel(this, reason);\n      }\n    }, {\n      key: 'read',\n      value: function read() {\n        if (IsReadableStreamDefaultReader(this) === false) {\n          return Promise.reject(defaultReaderBrandCheckException('read'));\n        }\n        if (this._ownerReadableStream === undefined) {\n          return Promise.reject(readerLockException('read from'));\n        }\n        return ReadableStreamDefaultReaderRead(this);\n      }\n    }, {\n      key: 'releaseLock',\n      value: function releaseLock() {\n        if (IsReadableStreamDefaultReader(this) === false) {\n          throw defaultReaderBrandCheckException('releaseLock');\n        }\n        if (this._ownerReadableStream === undefined) {\n          return;\n        }\n        if (this._readRequests.length > 0) {\n          throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');\n        }\n        ReadableStreamReaderGenericRelease(this);\n      }\n    }, {\n      key: 'closed',\n      get: function get() {\n        if (IsReadableStreamDefaultReader(this) === false) {\n          return Promise.reject(defaultReaderBrandCheckException('closed'));\n        }\n        return this._closedPromise;\n      }\n    }]);\n    return ReadableStreamDefaultReader;\n  }();\n  var ReadableStreamBYOBReader = function () {\n    function ReadableStreamBYOBReader(stream) {\n      _classCallCheck(this, ReadableStreamBYOBReader);\n      if (!IsReadableStream(stream)) {\n        throw new TypeError('ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a ' + 'byte source');\n      }\n      if (IsReadableByteStreamController(stream._readableStreamController) === false) {\n        throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' + 'source');\n      }\n      if (IsReadableStreamLocked(stream)) {\n        throw new TypeError('This stream has already been locked for exclusive reading by another reader');\n      }\n      ReadableStreamReaderGenericInitialize(this, stream);\n      this._readIntoRequests = [];\n    }\n    _createClass(ReadableStreamBYOBReader, [{\n      key: 'cancel',\n      value: function cancel(reason) {\n        if (!IsReadableStreamBYOBReader(this)) {\n          return Promise.reject(byobReaderBrandCheckException('cancel'));\n        }\n        if (this._ownerReadableStream === undefined) {\n          return Promise.reject(readerLockException('cancel'));\n        }\n        return ReadableStreamReaderGenericCancel(this, reason);\n      }\n    }, {\n      key: 'read',\n      value: function read(view) {\n        if (!IsReadableStreamBYOBReader(this)) {\n          return Promise.reject(byobReaderBrandCheckException('read'));\n        }\n        if (this._ownerReadableStream === undefined) {\n          return Promise.reject(readerLockException('read from'));\n        }\n        if (!ArrayBuffer.isView(view)) {\n          return Promise.reject(new TypeError('view must be an array buffer view'));\n        }\n        if (view.byteLength === 0) {\n          return Promise.reject(new TypeError('view must have non-zero byteLength'));\n        }\n        return ReadableStreamBYOBReaderRead(this, view);\n      }\n    }, {\n      key: 'releaseLock',\n      value: function releaseLock() {\n        if (!IsReadableStreamBYOBReader(this)) {\n          throw byobReaderBrandCheckException('releaseLock');\n        }\n        if (this._ownerReadableStream === undefined) {\n          return;\n        }\n        if (this._readIntoRequests.length > 0) {\n          throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');\n        }\n        ReadableStreamReaderGenericRelease(this);\n      }\n    }, {\n      key: 'closed',\n      get: function get() {\n        if (!IsReadableStreamBYOBReader(this)) {\n          return Promise.reject(byobReaderBrandCheckException('closed'));\n        }\n        return this._closedPromise;\n      }\n    }]);\n    return ReadableStreamBYOBReader;\n  }();\n  function IsReadableStreamBYOBReader(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) {\n      return false;\n    }\n    return true;\n  }\n  function IsReadableStreamDefaultReader(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableStreamReaderGenericInitialize(reader, stream) {\n    reader._ownerReadableStream = stream;\n    stream._reader = reader;\n    if (stream._state === 'readable') {\n      defaultReaderClosedPromiseInitialize(reader);\n    } else if (stream._state === 'closed') {\n      defaultReaderClosedPromiseInitializeAsResolved(reader);\n    } else {\n      assert(stream._state === 'errored', 'state must be errored');\n      defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError);\n      reader._closedPromise.catch(function () {});\n    }\n  }\n  function ReadableStreamReaderGenericCancel(reader, reason) {\n    var stream = reader._ownerReadableStream;\n    assert(stream !== undefined);\n    return ReadableStreamCancel(stream, reason);\n  }\n  function ReadableStreamReaderGenericRelease(reader) {\n    assert(reader._ownerReadableStream !== undefined);\n    assert(reader._ownerReadableStream._reader === reader);\n    if (reader._ownerReadableStream._state === 'readable') {\n      defaultReaderClosedPromiseReject(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\\'s closedness'));\n    } else {\n      defaultReaderClosedPromiseResetToRejected(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\\'s closedness'));\n    }\n    reader._closedPromise.catch(function () {});\n    reader._ownerReadableStream._reader = undefined;\n    reader._ownerReadableStream = undefined;\n  }\n  function ReadableStreamBYOBReaderRead(reader, view) {\n    var stream = reader._ownerReadableStream;\n    assert(stream !== undefined);\n    stream._disturbed = true;\n    if (stream._state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    return ReadableByteStreamControllerPullInto(stream._readableStreamController, view);\n  }\n  function ReadableStreamDefaultReaderRead(reader) {\n    var stream = reader._ownerReadableStream;\n    assert(stream !== undefined);\n    stream._disturbed = true;\n    if (stream._state === 'closed') {\n      return Promise.resolve(CreateIterResultObject(undefined, true));\n    }\n    if (stream._state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    assert(stream._state === 'readable');\n    return stream._readableStreamController.__pullSteps();\n  }\n  var ReadableStreamDefaultController = function () {\n    function ReadableStreamDefaultController(stream, underlyingSource, size, highWaterMark) {\n      _classCallCheck(this, ReadableStreamDefaultController);\n      if (IsReadableStream(stream) === false) {\n        throw new TypeError('ReadableStreamDefaultController can only be constructed with a ReadableStream instance');\n      }\n      if (stream._readableStreamController !== undefined) {\n        throw new TypeError('ReadableStreamDefaultController instances can only be created by the ReadableStream constructor');\n      }\n      this._controlledReadableStream = stream;\n      this._underlyingSource = underlyingSource;\n      this._queue = undefined;\n      this._queueTotalSize = undefined;\n      ResetQueue(this);\n      this._started = false;\n      this._closeRequested = false;\n      this._pullAgain = false;\n      this._pulling = false;\n      var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);\n      this._strategySize = normalizedStrategy.size;\n      this._strategyHWM = normalizedStrategy.highWaterMark;\n      var controller = this;\n      var startResult = InvokeOrNoop(underlyingSource, 'start', [this]);\n      Promise.resolve(startResult).then(function () {\n        controller._started = true;\n        assert(controller._pulling === false);\n        assert(controller._pullAgain === false);\n        ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n      }, function (r) {\n        ReadableStreamDefaultControllerErrorIfNeeded(controller, r);\n      }).catch(rethrowAssertionErrorRejection);\n    }\n    _createClass(ReadableStreamDefaultController, [{\n      key: 'close',\n      value: function close() {\n        if (IsReadableStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('close');\n        }\n        if (this._closeRequested === true) {\n          throw new TypeError('The stream has already been closed; do not close it again!');\n        }\n        var state = this._controlledReadableStream._state;\n        if (state !== 'readable') {\n          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');\n        }\n        ReadableStreamDefaultControllerClose(this);\n      }\n    }, {\n      key: 'enqueue',\n      value: function enqueue(chunk) {\n        if (IsReadableStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('enqueue');\n        }\n        if (this._closeRequested === true) {\n          throw new TypeError('stream is closed or draining');\n        }\n        var state = this._controlledReadableStream._state;\n        if (state !== 'readable') {\n          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');\n        }\n        return ReadableStreamDefaultControllerEnqueue(this, chunk);\n      }\n    }, {\n      key: 'error',\n      value: function error(e) {\n        if (IsReadableStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('error');\n        }\n        var stream = this._controlledReadableStream;\n        if (stream._state !== 'readable') {\n          throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');\n        }\n        ReadableStreamDefaultControllerError(this, e);\n      }\n    }, {\n      key: '__cancelSteps',\n      value: function __cancelSteps(reason) {\n        ResetQueue(this);\n        return PromiseInvokeOrNoop(this._underlyingSource, 'cancel', [reason]);\n      }\n    }, {\n      key: '__pullSteps',\n      value: function __pullSteps() {\n        var stream = this._controlledReadableStream;\n        if (this._queue.length > 0) {\n          var chunk = DequeueValue(this);\n          if (this._closeRequested === true && this._queue.length === 0) {\n            ReadableStreamClose(stream);\n          } else {\n            ReadableStreamDefaultControllerCallPullIfNeeded(this);\n          }\n          return Promise.resolve(CreateIterResultObject(chunk, false));\n        }\n        var pendingPromise = ReadableStreamAddReadRequest(stream);\n        ReadableStreamDefaultControllerCallPullIfNeeded(this);\n        return pendingPromise;\n      }\n    }, {\n      key: 'desiredSize',\n      get: function get() {\n        if (IsReadableStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('desiredSize');\n        }\n        return ReadableStreamDefaultControllerGetDesiredSize(this);\n      }\n    }]);\n    return ReadableStreamDefaultController;\n  }();\n  function IsReadableStreamDefaultController(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSource')) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableStreamDefaultControllerCallPullIfNeeded(controller) {\n    var shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller);\n    if (shouldPull === false) {\n      return undefined;\n    }\n    if (controller._pulling === true) {\n      controller._pullAgain = true;\n      return undefined;\n    }\n    assert(controller._pullAgain === false);\n    controller._pulling = true;\n    var pullPromise = PromiseInvokeOrNoop(controller._underlyingSource, 'pull', [controller]);\n    pullPromise.then(function () {\n      controller._pulling = false;\n      if (controller._pullAgain === true) {\n        controller._pullAgain = false;\n        return ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n      }\n      return undefined;\n    }, function (e) {\n      ReadableStreamDefaultControllerErrorIfNeeded(controller, e);\n    }).catch(rethrowAssertionErrorRejection);\n    return undefined;\n  }\n  function ReadableStreamDefaultControllerShouldCallPull(controller) {\n    var stream = controller._controlledReadableStream;\n    if (stream._state === 'closed' || stream._state === 'errored') {\n      return false;\n    }\n    if (controller._closeRequested === true) {\n      return false;\n    }\n    if (controller._started === false) {\n      return false;\n    }\n    if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n      return true;\n    }\n    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);\n    if (desiredSize > 0) {\n      return true;\n    }\n    return false;\n  }\n  function ReadableStreamDefaultControllerClose(controller) {\n    var stream = controller._controlledReadableStream;\n    assert(controller._closeRequested === false);\n    assert(stream._state === 'readable');\n    controller._closeRequested = true;\n    if (controller._queue.length === 0) {\n      ReadableStreamClose(stream);\n    }\n  }\n  function ReadableStreamDefaultControllerEnqueue(controller, chunk) {\n    var stream = controller._controlledReadableStream;\n    assert(controller._closeRequested === false);\n    assert(stream._state === 'readable');\n    if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n      ReadableStreamFulfillReadRequest(stream, chunk, false);\n    } else {\n      var chunkSize = 1;\n      if (controller._strategySize !== undefined) {\n        var strategySize = controller._strategySize;\n        try {\n          chunkSize = strategySize(chunk);\n        } catch (chunkSizeE) {\n          ReadableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);\n          throw chunkSizeE;\n        }\n      }\n      try {\n        EnqueueValueWithSize(controller, chunk, chunkSize);\n      } catch (enqueueE) {\n        ReadableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);\n        throw enqueueE;\n      }\n    }\n    ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n    return undefined;\n  }\n  function ReadableStreamDefaultControllerError(controller, e) {\n    var stream = controller._controlledReadableStream;\n    assert(stream._state === 'readable');\n    ResetQueue(controller);\n    ReadableStreamError(stream, e);\n  }\n  function ReadableStreamDefaultControllerErrorIfNeeded(controller, e) {\n    if (controller._controlledReadableStream._state === 'readable') {\n      ReadableStreamDefaultControllerError(controller, e);\n    }\n  }\n  function ReadableStreamDefaultControllerGetDesiredSize(controller) {\n    var stream = controller._controlledReadableStream;\n    var state = stream._state;\n    if (state === 'errored') {\n      return null;\n    }\n    if (state === 'closed') {\n      return 0;\n    }\n    return controller._strategyHWM - controller._queueTotalSize;\n  }\n  var ReadableStreamBYOBRequest = function () {\n    function ReadableStreamBYOBRequest(controller, view) {\n      _classCallCheck(this, ReadableStreamBYOBRequest);\n      this._associatedReadableByteStreamController = controller;\n      this._view = view;\n    }\n    _createClass(ReadableStreamBYOBRequest, [{\n      key: 'respond',\n      value: function respond(bytesWritten) {\n        if (IsReadableStreamBYOBRequest(this) === false) {\n          throw byobRequestBrandCheckException('respond');\n        }\n        if (this._associatedReadableByteStreamController === undefined) {\n          throw new TypeError('This BYOB request has been invalidated');\n        }\n        ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten);\n      }\n    }, {\n      key: 'respondWithNewView',\n      value: function respondWithNewView(view) {\n        if (IsReadableStreamBYOBRequest(this) === false) {\n          throw byobRequestBrandCheckException('respond');\n        }\n        if (this._associatedReadableByteStreamController === undefined) {\n          throw new TypeError('This BYOB request has been invalidated');\n        }\n        if (!ArrayBuffer.isView(view)) {\n          throw new TypeError('You can only respond with array buffer views');\n        }\n        ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view);\n      }\n    }, {\n      key: 'view',\n      get: function get() {\n        return this._view;\n      }\n    }]);\n    return ReadableStreamBYOBRequest;\n  }();\n  var ReadableByteStreamController = function () {\n    function ReadableByteStreamController(stream, underlyingByteSource, highWaterMark) {\n      _classCallCheck(this, ReadableByteStreamController);\n      if (IsReadableStream(stream) === false) {\n        throw new TypeError('ReadableByteStreamController can only be constructed with a ReadableStream instance given ' + 'a byte source');\n      }\n      if (stream._readableStreamController !== undefined) {\n        throw new TypeError('ReadableByteStreamController instances can only be created by the ReadableStream constructor given a byte ' + 'source');\n      }\n      this._controlledReadableStream = stream;\n      this._underlyingByteSource = underlyingByteSource;\n      this._pullAgain = false;\n      this._pulling = false;\n      ReadableByteStreamControllerClearPendingPullIntos(this);\n      this._queue = this._queueTotalSize = undefined;\n      ResetQueue(this);\n      this._closeRequested = false;\n      this._started = false;\n      this._strategyHWM = ValidateAndNormalizeHighWaterMark(highWaterMark);\n      var autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize;\n      if (autoAllocateChunkSize !== undefined) {\n        if (Number.isInteger(autoAllocateChunkSize) === false || autoAllocateChunkSize <= 0) {\n          throw new RangeError('autoAllocateChunkSize must be a positive integer');\n        }\n      }\n      this._autoAllocateChunkSize = autoAllocateChunkSize;\n      this._pendingPullIntos = [];\n      var controller = this;\n      var startResult = InvokeOrNoop(underlyingByteSource, 'start', [this]);\n      Promise.resolve(startResult).then(function () {\n        controller._started = true;\n        assert(controller._pulling === false);\n        assert(controller._pullAgain === false);\n        ReadableByteStreamControllerCallPullIfNeeded(controller);\n      }, function (r) {\n        if (stream._state === 'readable') {\n          ReadableByteStreamControllerError(controller, r);\n        }\n      }).catch(rethrowAssertionErrorRejection);\n    }\n    _createClass(ReadableByteStreamController, [{\n      key: 'close',\n      value: function close() {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('close');\n        }\n        if (this._closeRequested === true) {\n          throw new TypeError('The stream has already been closed; do not close it again!');\n        }\n        var state = this._controlledReadableStream._state;\n        if (state !== 'readable') {\n          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');\n        }\n        ReadableByteStreamControllerClose(this);\n      }\n    }, {\n      key: 'enqueue',\n      value: function enqueue(chunk) {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('enqueue');\n        }\n        if (this._closeRequested === true) {\n          throw new TypeError('stream is closed or draining');\n        }\n        var state = this._controlledReadableStream._state;\n        if (state !== 'readable') {\n          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');\n        }\n        if (!ArrayBuffer.isView(chunk)) {\n          throw new TypeError('You can only enqueue array buffer views when using a ReadableByteStreamController');\n        }\n        ReadableByteStreamControllerEnqueue(this, chunk);\n      }\n    }, {\n      key: 'error',\n      value: function error(e) {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('error');\n        }\n        var stream = this._controlledReadableStream;\n        if (stream._state !== 'readable') {\n          throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');\n        }\n        ReadableByteStreamControllerError(this, e);\n      }\n    }, {\n      key: '__cancelSteps',\n      value: function __cancelSteps(reason) {\n        if (this._pendingPullIntos.length > 0) {\n          var firstDescriptor = this._pendingPullIntos[0];\n          firstDescriptor.bytesFilled = 0;\n        }\n        ResetQueue(this);\n        return PromiseInvokeOrNoop(this._underlyingByteSource, 'cancel', [reason]);\n      }\n    }, {\n      key: '__pullSteps',\n      value: function __pullSteps() {\n        var stream = this._controlledReadableStream;\n        assert(ReadableStreamHasDefaultReader(stream) === true);\n        if (this._queueTotalSize > 0) {\n          assert(ReadableStreamGetNumReadRequests(stream) === 0);\n          var entry = this._queue.shift();\n          this._queueTotalSize -= entry.byteLength;\n          ReadableByteStreamControllerHandleQueueDrain(this);\n          var view = void 0;\n          try {\n            view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength);\n          } catch (viewE) {\n            return Promise.reject(viewE);\n          }\n          return Promise.resolve(CreateIterResultObject(view, false));\n        }\n        var autoAllocateChunkSize = this._autoAllocateChunkSize;\n        if (autoAllocateChunkSize !== undefined) {\n          var buffer = void 0;\n          try {\n            buffer = new ArrayBuffer(autoAllocateChunkSize);\n          } catch (bufferE) {\n            return Promise.reject(bufferE);\n          }\n          var pullIntoDescriptor = {\n            buffer: buffer,\n            byteOffset: 0,\n            byteLength: autoAllocateChunkSize,\n            bytesFilled: 0,\n            elementSize: 1,\n            ctor: Uint8Array,\n            readerType: 'default'\n          };\n          this._pendingPullIntos.push(pullIntoDescriptor);\n        }\n        var promise = ReadableStreamAddReadRequest(stream);\n        ReadableByteStreamControllerCallPullIfNeeded(this);\n        return promise;\n      }\n    }, {\n      key: 'byobRequest',\n      get: function get() {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('byobRequest');\n        }\n        if (this._byobRequest === undefined && this._pendingPullIntos.length > 0) {\n          var firstDescriptor = this._pendingPullIntos[0];\n          var view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled);\n          this._byobRequest = new ReadableStreamBYOBRequest(this, view);\n        }\n        return this._byobRequest;\n      }\n    }, {\n      key: 'desiredSize',\n      get: function get() {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('desiredSize');\n        }\n        return ReadableByteStreamControllerGetDesiredSize(this);\n      }\n    }]);\n    return ReadableByteStreamController;\n  }();\n  function IsReadableByteStreamController(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingByteSource')) {\n      return false;\n    }\n    return true;\n  }\n  function IsReadableStreamBYOBRequest(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableByteStreamControllerCallPullIfNeeded(controller) {\n    var shouldPull = ReadableByteStreamControllerShouldCallPull(controller);\n    if (shouldPull === false) {\n      return undefined;\n    }\n    if (controller._pulling === true) {\n      controller._pullAgain = true;\n      return undefined;\n    }\n    assert(controller._pullAgain === false);\n    controller._pulling = true;\n    var pullPromise = PromiseInvokeOrNoop(controller._underlyingByteSource, 'pull', [controller]);\n    pullPromise.then(function () {\n      controller._pulling = false;\n      if (controller._pullAgain === true) {\n        controller._pullAgain = false;\n        ReadableByteStreamControllerCallPullIfNeeded(controller);\n      }\n    }, function (e) {\n      if (controller._controlledReadableStream._state === 'readable') {\n        ReadableByteStreamControllerError(controller, e);\n      }\n    }).catch(rethrowAssertionErrorRejection);\n    return undefined;\n  }\n  function ReadableByteStreamControllerClearPendingPullIntos(controller) {\n    ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n    controller._pendingPullIntos = [];\n  }\n  function ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) {\n    assert(stream._state !== 'errored', 'state must not be errored');\n    var done = false;\n    if (stream._state === 'closed') {\n      assert(pullIntoDescriptor.bytesFilled === 0);\n      done = true;\n    }\n    var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);\n    if (pullIntoDescriptor.readerType === 'default') {\n      ReadableStreamFulfillReadRequest(stream, filledView, done);\n    } else {\n      assert(pullIntoDescriptor.readerType === 'byob');\n      ReadableStreamFulfillReadIntoRequest(stream, filledView, done);\n    }\n  }\n  function ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) {\n    var bytesFilled = pullIntoDescriptor.bytesFilled;\n    var elementSize = pullIntoDescriptor.elementSize;\n    assert(bytesFilled <= pullIntoDescriptor.byteLength);\n    assert(bytesFilled % elementSize === 0);\n    return new pullIntoDescriptor.ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize);\n  }\n  function ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) {\n    controller._queue.push({\n      buffer: buffer,\n      byteOffset: byteOffset,\n      byteLength: byteLength\n    });\n    controller._queueTotalSize += byteLength;\n  }\n  function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) {\n    var elementSize = pullIntoDescriptor.elementSize;\n    var currentAlignedBytes = pullIntoDescriptor.bytesFilled - pullIntoDescriptor.bytesFilled % elementSize;\n    var maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled);\n    var maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy;\n    var maxAlignedBytes = maxBytesFilled - maxBytesFilled % elementSize;\n    var totalBytesToCopyRemaining = maxBytesToCopy;\n    var ready = false;\n    if (maxAlignedBytes > currentAlignedBytes) {\n      totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled;\n      ready = true;\n    }\n    var queue = controller._queue;\n    while (totalBytesToCopyRemaining > 0) {\n      var headOfQueue = queue[0];\n      var bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength);\n      var destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;\n      ArrayBufferCopy(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy);\n      if (headOfQueue.byteLength === bytesToCopy) {\n        queue.shift();\n      } else {\n        headOfQueue.byteOffset += bytesToCopy;\n        headOfQueue.byteLength -= bytesToCopy;\n      }\n      controller._queueTotalSize -= bytesToCopy;\n      ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor);\n      totalBytesToCopyRemaining -= bytesToCopy;\n    }\n    if (ready === false) {\n      assert(controller._queueTotalSize === 0, 'queue must be empty');\n      assert(pullIntoDescriptor.bytesFilled > 0);\n      assert(pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize);\n    }\n    return ready;\n  }\n  function ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) {\n    assert(controller._pendingPullIntos.length === 0 || controller._pendingPullIntos[0] === pullIntoDescriptor);\n    ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n    pullIntoDescriptor.bytesFilled += size;\n  }\n  function ReadableByteStreamControllerHandleQueueDrain(controller) {\n    assert(controller._controlledReadableStream._state === 'readable');\n    if (controller._queueTotalSize === 0 && controller._closeRequested === true) {\n      ReadableStreamClose(controller._controlledReadableStream);\n    } else {\n      ReadableByteStreamControllerCallPullIfNeeded(controller);\n    }\n  }\n  function ReadableByteStreamControllerInvalidateBYOBRequest(controller) {\n    if (controller._byobRequest === undefined) {\n      return;\n    }\n    controller._byobRequest._associatedReadableByteStreamController = undefined;\n    controller._byobRequest._view = undefined;\n    controller._byobRequest = undefined;\n  }\n  function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) {\n    assert(controller._closeRequested === false);\n    while (controller._pendingPullIntos.length > 0) {\n      if (controller._queueTotalSize === 0) {\n        return;\n      }\n      var pullIntoDescriptor = controller._pendingPullIntos[0];\n      if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {\n        ReadableByteStreamControllerShiftPendingPullInto(controller);\n        ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);\n      }\n    }\n  }\n  function ReadableByteStreamControllerPullInto(controller, view) {\n    var stream = controller._controlledReadableStream;\n    var elementSize = 1;\n    if (view.constructor !== DataView) {\n      elementSize = view.constructor.BYTES_PER_ELEMENT;\n    }\n    var ctor = view.constructor;\n    var pullIntoDescriptor = {\n      buffer: view.buffer,\n      byteOffset: view.byteOffset,\n      byteLength: view.byteLength,\n      bytesFilled: 0,\n      elementSize: elementSize,\n      ctor: ctor,\n      readerType: 'byob'\n    };\n    if (controller._pendingPullIntos.length > 0) {\n      pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n      controller._pendingPullIntos.push(pullIntoDescriptor);\n      return ReadableStreamAddReadIntoRequest(stream);\n    }\n    if (stream._state === 'closed') {\n      var emptyView = new view.constructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0);\n      return Promise.resolve(CreateIterResultObject(emptyView, true));\n    }\n    if (controller._queueTotalSize > 0) {\n      if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {\n        var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);\n        ReadableByteStreamControllerHandleQueueDrain(controller);\n        return Promise.resolve(CreateIterResultObject(filledView, false));\n      }\n      if (controller._closeRequested === true) {\n        var e = new TypeError('Insufficient bytes to fill elements in the given buffer');\n        ReadableByteStreamControllerError(controller, e);\n        return Promise.reject(e);\n      }\n    }\n    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n    controller._pendingPullIntos.push(pullIntoDescriptor);\n    var promise = ReadableStreamAddReadIntoRequest(stream);\n    ReadableByteStreamControllerCallPullIfNeeded(controller);\n    return promise;\n  }\n  function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) {\n    firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer);\n    assert(firstDescriptor.bytesFilled === 0, 'bytesFilled must be 0');\n    var stream = controller._controlledReadableStream;\n    if (ReadableStreamHasBYOBReader(stream) === true) {\n      while (ReadableStreamGetNumReadIntoRequests(stream) > 0) {\n        var pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller);\n        ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor);\n      }\n    }\n  }\n  function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) {\n    if (pullIntoDescriptor.bytesFilled + bytesWritten > pullIntoDescriptor.byteLength) {\n      throw new RangeError('bytesWritten out of range');\n    }\n    ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor);\n    if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize) {\n      return;\n    }\n    ReadableByteStreamControllerShiftPendingPullInto(controller);\n    var remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize;\n    if (remainderSize > 0) {\n      var end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;\n      var remainder = pullIntoDescriptor.buffer.slice(end - remainderSize, end);\n      ReadableByteStreamControllerEnqueueChunkToQueue(controller, remainder, 0, remainder.byteLength);\n    }\n    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n    pullIntoDescriptor.bytesFilled -= remainderSize;\n    ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);\n    ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);\n  }\n  function ReadableByteStreamControllerRespondInternal(controller, bytesWritten) {\n    var firstDescriptor = controller._pendingPullIntos[0];\n    var stream = controller._controlledReadableStream;\n    if (stream._state === 'closed') {\n      if (bytesWritten !== 0) {\n        throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream');\n      }\n      ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor);\n    } else {\n      assert(stream._state === 'readable');\n      ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor);\n    }\n  }\n  function ReadableByteStreamControllerShiftPendingPullInto(controller) {\n    var descriptor = controller._pendingPullIntos.shift();\n    ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n    return descriptor;\n  }\n  function ReadableByteStreamControllerShouldCallPull(controller) {\n    var stream = controller._controlledReadableStream;\n    if (stream._state !== 'readable') {\n      return false;\n    }\n    if (controller._closeRequested === true) {\n      return false;\n    }\n    if (controller._started === false) {\n      return false;\n    }\n    if (ReadableStreamHasDefaultReader(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n      return true;\n    }\n    if (ReadableStreamHasBYOBReader(stream) === true && ReadableStreamGetNumReadIntoRequests(stream) > 0) {\n      return true;\n    }\n    if (ReadableByteStreamControllerGetDesiredSize(controller) > 0) {\n      return true;\n    }\n    return false;\n  }\n  function ReadableByteStreamControllerClose(controller) {\n    var stream = controller._controlledReadableStream;\n    assert(controller._closeRequested === false);\n    assert(stream._state === 'readable');\n    if (controller._queueTotalSize > 0) {\n      controller._closeRequested = true;\n      return;\n    }\n    if (controller._pendingPullIntos.length > 0) {\n      var firstPendingPullInto = controller._pendingPullIntos[0];\n      if (firstPendingPullInto.bytesFilled > 0) {\n        var e = new TypeError('Insufficient bytes to fill elements in the given buffer');\n        ReadableByteStreamControllerError(controller, e);\n        throw e;\n      }\n    }\n    ReadableStreamClose(stream);\n  }\n  function ReadableByteStreamControllerEnqueue(controller, chunk) {\n    var stream = controller._controlledReadableStream;\n    assert(controller._closeRequested === false);\n    assert(stream._state === 'readable');\n    var buffer = chunk.buffer;\n    var byteOffset = chunk.byteOffset;\n    var byteLength = chunk.byteLength;\n    var transferredBuffer = TransferArrayBuffer(buffer);\n    if (ReadableStreamHasDefaultReader(stream) === true) {\n      if (ReadableStreamGetNumReadRequests(stream) === 0) {\n        ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n      } else {\n        assert(controller._queue.length === 0);\n        var transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength);\n        ReadableStreamFulfillReadRequest(stream, transferredView, false);\n      }\n    } else if (ReadableStreamHasBYOBReader(stream) === true) {\n      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n      ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);\n    } else {\n      assert(IsReadableStreamLocked(stream) === false, 'stream must not be locked');\n      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n    }\n  }\n  function ReadableByteStreamControllerError(controller, e) {\n    var stream = controller._controlledReadableStream;\n    assert(stream._state === 'readable');\n    ReadableByteStreamControllerClearPendingPullIntos(controller);\n    ResetQueue(controller);\n    ReadableStreamError(stream, e);\n  }\n  function ReadableByteStreamControllerGetDesiredSize(controller) {\n    var stream = controller._controlledReadableStream;\n    var state = stream._state;\n    if (state === 'errored') {\n      return null;\n    }\n    if (state === 'closed') {\n      return 0;\n    }\n    return controller._strategyHWM - controller._queueTotalSize;\n  }\n  function ReadableByteStreamControllerRespond(controller, bytesWritten) {\n    bytesWritten = Number(bytesWritten);\n    if (IsFiniteNonNegativeNumber(bytesWritten) === false) {\n      throw new RangeError('bytesWritten must be a finite');\n    }\n    assert(controller._pendingPullIntos.length > 0);\n    ReadableByteStreamControllerRespondInternal(controller, bytesWritten);\n  }\n  function ReadableByteStreamControllerRespondWithNewView(controller, view) {\n    assert(controller._pendingPullIntos.length > 0);\n    var firstDescriptor = controller._pendingPullIntos[0];\n    if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) {\n      throw new RangeError('The region specified by view does not match byobRequest');\n    }\n    if (firstDescriptor.byteLength !== view.byteLength) {\n      throw new RangeError('The buffer of view has different capacity than byobRequest');\n    }\n    firstDescriptor.buffer = view.buffer;\n    ReadableByteStreamControllerRespondInternal(controller, view.byteLength);\n  }\n  function streamBrandCheckException(name) {\n    return new TypeError('ReadableStream.prototype.' + name + ' can only be used on a ReadableStream');\n  }\n  function readerLockException(name) {\n    return new TypeError('Cannot ' + name + ' a stream using a released reader');\n  }\n  function defaultReaderBrandCheckException(name) {\n    return new TypeError('ReadableStreamDefaultReader.prototype.' + name + ' can only be used on a ReadableStreamDefaultReader');\n  }\n  function defaultReaderClosedPromiseInitialize(reader) {\n    reader._closedPromise = new Promise(function (resolve, reject) {\n      reader._closedPromise_resolve = resolve;\n      reader._closedPromise_reject = reject;\n    });\n  }\n  function defaultReaderClosedPromiseInitializeAsRejected(reader, reason) {\n    reader._closedPromise = Promise.reject(reason);\n    reader._closedPromise_resolve = undefined;\n    reader._closedPromise_reject = undefined;\n  }\n  function defaultReaderClosedPromiseInitializeAsResolved(reader) {\n    reader._closedPromise = Promise.resolve(undefined);\n    reader._closedPromise_resolve = undefined;\n    reader._closedPromise_reject = undefined;\n  }\n  function defaultReaderClosedPromiseReject(reader, reason) {\n    assert(reader._closedPromise_resolve !== undefined);\n    assert(reader._closedPromise_reject !== undefined);\n    reader._closedPromise_reject(reason);\n    reader._closedPromise_resolve = undefined;\n    reader._closedPromise_reject = undefined;\n  }\n  function defaultReaderClosedPromiseResetToRejected(reader, reason) {\n    assert(reader._closedPromise_resolve === undefined);\n    assert(reader._closedPromise_reject === undefined);\n    reader._closedPromise = Promise.reject(reason);\n  }\n  function defaultReaderClosedPromiseResolve(reader) {\n    assert(reader._closedPromise_resolve !== undefined);\n    assert(reader._closedPromise_reject !== undefined);\n    reader._closedPromise_resolve(undefined);\n    reader._closedPromise_resolve = undefined;\n    reader._closedPromise_reject = undefined;\n  }\n  function byobReaderBrandCheckException(name) {\n    return new TypeError('ReadableStreamBYOBReader.prototype.' + name + ' can only be used on a ReadableStreamBYOBReader');\n  }\n  function defaultControllerBrandCheckException(name) {\n    return new TypeError('ReadableStreamDefaultController.prototype.' + name + ' can only be used on a ReadableStreamDefaultController');\n  }\n  function byobRequestBrandCheckException(name) {\n    return new TypeError('ReadableStreamBYOBRequest.prototype.' + name + ' can only be used on a ReadableStreamBYOBRequest');\n  }\n  function byteStreamControllerBrandCheckException(name) {\n    return new TypeError('ReadableByteStreamController.prototype.' + name + ' can only be used on a ReadableByteStreamController');\n  }\n  function ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise) {\n    try {\n      Promise.prototype.then.call(promise, undefined, function () {});\n    } catch (e) {}\n  }\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var transformStream = __w_pdfjs_require__(6);\n  var readableStream = __w_pdfjs_require__(4);\n  var writableStream = __w_pdfjs_require__(2);\n  exports.TransformStream = transformStream.TransformStream;\n  exports.ReadableStream = readableStream.ReadableStream;\n  exports.IsReadableStreamDisturbed = readableStream.IsReadableStreamDisturbed;\n  exports.ReadableStreamDefaultControllerClose = readableStream.ReadableStreamDefaultControllerClose;\n  exports.ReadableStreamDefaultControllerEnqueue = readableStream.ReadableStreamDefaultControllerEnqueue;\n  exports.ReadableStreamDefaultControllerError = readableStream.ReadableStreamDefaultControllerError;\n  exports.ReadableStreamDefaultControllerGetDesiredSize = readableStream.ReadableStreamDefaultControllerGetDesiredSize;\n  exports.AcquireWritableStreamDefaultWriter = writableStream.AcquireWritableStreamDefaultWriter;\n  exports.IsWritableStream = writableStream.IsWritableStream;\n  exports.IsWritableStreamLocked = writableStream.IsWritableStreamLocked;\n  exports.WritableStream = writableStream.WritableStream;\n  exports.WritableStreamAbort = writableStream.WritableStreamAbort;\n  exports.WritableStreamDefaultControllerError = writableStream.WritableStreamDefaultControllerError;\n  exports.WritableStreamDefaultWriterCloseWithErrorPropagation = writableStream.WritableStreamDefaultWriterCloseWithErrorPropagation;\n  exports.WritableStreamDefaultWriterRelease = writableStream.WritableStreamDefaultWriterRelease;\n  exports.WritableStreamDefaultWriterWrite = writableStream.WritableStreamDefaultWriterWrite;\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n  var _require = __w_pdfjs_require__(1),\n      assert = _require.assert;\n  var _require2 = __w_pdfjs_require__(0),\n      InvokeOrNoop = _require2.InvokeOrNoop,\n      PromiseInvokeOrPerformFallback = _require2.PromiseInvokeOrPerformFallback,\n      PromiseInvokeOrNoop = _require2.PromiseInvokeOrNoop,\n      typeIsObject = _require2.typeIsObject;\n  var _require3 = __w_pdfjs_require__(4),\n      ReadableStream = _require3.ReadableStream,\n      ReadableStreamDefaultControllerClose = _require3.ReadableStreamDefaultControllerClose,\n      ReadableStreamDefaultControllerEnqueue = _require3.ReadableStreamDefaultControllerEnqueue,\n      ReadableStreamDefaultControllerError = _require3.ReadableStreamDefaultControllerError,\n      ReadableStreamDefaultControllerGetDesiredSize = _require3.ReadableStreamDefaultControllerGetDesiredSize;\n  var _require4 = __w_pdfjs_require__(2),\n      WritableStream = _require4.WritableStream,\n      WritableStreamDefaultControllerError = _require4.WritableStreamDefaultControllerError;\n  function TransformStreamCloseReadable(transformStream) {\n    if (transformStream._errored === true) {\n      throw new TypeError('TransformStream is already errored');\n    }\n    if (transformStream._readableClosed === true) {\n      throw new TypeError('Readable side is already closed');\n    }\n    TransformStreamCloseReadableInternal(transformStream);\n  }\n  function TransformStreamEnqueueToReadable(transformStream, chunk) {\n    if (transformStream._errored === true) {\n      throw new TypeError('TransformStream is already errored');\n    }\n    if (transformStream._readableClosed === true) {\n      throw new TypeError('Readable side is already closed');\n    }\n    var controller = transformStream._readableController;\n    try {\n      ReadableStreamDefaultControllerEnqueue(controller, chunk);\n    } catch (e) {\n      transformStream._readableClosed = true;\n      TransformStreamErrorIfNeeded(transformStream, e);\n      throw transformStream._storedError;\n    }\n    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);\n    var maybeBackpressure = desiredSize <= 0;\n    if (maybeBackpressure === true && transformStream._backpressure === false) {\n      TransformStreamSetBackpressure(transformStream, true);\n    }\n  }\n  function TransformStreamError(transformStream, e) {\n    if (transformStream._errored === true) {\n      throw new TypeError('TransformStream is already errored');\n    }\n    TransformStreamErrorInternal(transformStream, e);\n  }\n  function TransformStreamCloseReadableInternal(transformStream) {\n    assert(transformStream._errored === false);\n    assert(transformStream._readableClosed === false);\n    try {\n      ReadableStreamDefaultControllerClose(transformStream._readableController);\n    } catch (e) {\n      assert(false);\n    }\n    transformStream._readableClosed = true;\n  }\n  function TransformStreamErrorIfNeeded(transformStream, e) {\n    if (transformStream._errored === false) {\n      TransformStreamErrorInternal(transformStream, e);\n    }\n  }\n  function TransformStreamErrorInternal(transformStream, e) {\n    assert(transformStream._errored === false);\n    transformStream._errored = true;\n    transformStream._storedError = e;\n    if (transformStream._writableDone === false) {\n      WritableStreamDefaultControllerError(transformStream._writableController, e);\n    }\n    if (transformStream._readableClosed === false) {\n      ReadableStreamDefaultControllerError(transformStream._readableController, e);\n    }\n  }\n  function TransformStreamReadableReadyPromise(transformStream) {\n    assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n    if (transformStream._backpressure === false) {\n      return Promise.resolve();\n    }\n    assert(transformStream._backpressure === true, '_backpressure should have been initialized');\n    return transformStream._backpressureChangePromise;\n  }\n  function TransformStreamSetBackpressure(transformStream, backpressure) {\n    assert(transformStream._backpressure !== backpressure, 'TransformStreamSetBackpressure() should be called only when backpressure is changed');\n    if (transformStream._backpressureChangePromise !== undefined) {\n      transformStream._backpressureChangePromise_resolve(backpressure);\n    }\n    transformStream._backpressureChangePromise = new Promise(function (resolve) {\n      transformStream._backpressureChangePromise_resolve = resolve;\n    });\n    transformStream._backpressureChangePromise.then(function (resolution) {\n      assert(resolution !== backpressure, '_backpressureChangePromise should be fulfilled only when backpressure is changed');\n    });\n    transformStream._backpressure = backpressure;\n  }\n  function TransformStreamDefaultTransform(chunk, transformStreamController) {\n    var transformStream = transformStreamController._controlledTransformStream;\n    TransformStreamEnqueueToReadable(transformStream, chunk);\n    return Promise.resolve();\n  }\n  function TransformStreamTransform(transformStream, chunk) {\n    assert(transformStream._errored === false);\n    assert(transformStream._transforming === false);\n    assert(transformStream._backpressure === false);\n    transformStream._transforming = true;\n    var transformer = transformStream._transformer;\n    var controller = transformStream._transformStreamController;\n    var transformPromise = PromiseInvokeOrPerformFallback(transformer, 'transform', [chunk, controller], TransformStreamDefaultTransform, [chunk, controller]);\n    return transformPromise.then(function () {\n      transformStream._transforming = false;\n      return TransformStreamReadableReadyPromise(transformStream);\n    }, function (e) {\n      TransformStreamErrorIfNeeded(transformStream, e);\n      return Promise.reject(e);\n    });\n  }\n  function IsTransformStreamDefaultController(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) {\n      return false;\n    }\n    return true;\n  }\n  function IsTransformStream(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) {\n      return false;\n    }\n    return true;\n  }\n  var TransformStreamSink = function () {\n    function TransformStreamSink(transformStream, startPromise) {\n      _classCallCheck(this, TransformStreamSink);\n      this._transformStream = transformStream;\n      this._startPromise = startPromise;\n    }\n    _createClass(TransformStreamSink, [{\n      key: 'start',\n      value: function start(c) {\n        var transformStream = this._transformStream;\n        transformStream._writableController = c;\n        return this._startPromise.then(function () {\n          return TransformStreamReadableReadyPromise(transformStream);\n        });\n      }\n    }, {\n      key: 'write',\n      value: function write(chunk) {\n        var transformStream = this._transformStream;\n        return TransformStreamTransform(transformStream, chunk);\n      }\n    }, {\n      key: 'abort',\n      value: function abort() {\n        var transformStream = this._transformStream;\n        transformStream._writableDone = true;\n        TransformStreamErrorInternal(transformStream, new TypeError('Writable side aborted'));\n      }\n    }, {\n      key: 'close',\n      value: function close() {\n        var transformStream = this._transformStream;\n        assert(transformStream._transforming === false);\n        transformStream._writableDone = true;\n        var flushPromise = PromiseInvokeOrNoop(transformStream._transformer, 'flush', [transformStream._transformStreamController]);\n        return flushPromise.then(function () {\n          if (transformStream._errored === true) {\n            return Promise.reject(transformStream._storedError);\n          }\n          if (transformStream._readableClosed === false) {\n            TransformStreamCloseReadableInternal(transformStream);\n          }\n          return Promise.resolve();\n        }).catch(function (r) {\n          TransformStreamErrorIfNeeded(transformStream, r);\n          return Promise.reject(transformStream._storedError);\n        });\n      }\n    }]);\n    return TransformStreamSink;\n  }();\n  var TransformStreamSource = function () {\n    function TransformStreamSource(transformStream, startPromise) {\n      _classCallCheck(this, TransformStreamSource);\n      this._transformStream = transformStream;\n      this._startPromise = startPromise;\n    }\n    _createClass(TransformStreamSource, [{\n      key: 'start',\n      value: function start(c) {\n        var transformStream = this._transformStream;\n        transformStream._readableController = c;\n        return this._startPromise.then(function () {\n          assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n          if (transformStream._backpressure === true) {\n            return Promise.resolve();\n          }\n          assert(transformStream._backpressure === false, '_backpressure should have been initialized');\n          return transformStream._backpressureChangePromise;\n        });\n      }\n    }, {\n      key: 'pull',\n      value: function pull() {\n        var transformStream = this._transformStream;\n        assert(transformStream._backpressure === true, 'pull() should be never called while _backpressure is false');\n        assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n        TransformStreamSetBackpressure(transformStream, false);\n        return transformStream._backpressureChangePromise;\n      }\n    }, {\n      key: 'cancel',\n      value: function cancel() {\n        var transformStream = this._transformStream;\n        transformStream._readableClosed = true;\n        TransformStreamErrorInternal(transformStream, new TypeError('Readable side canceled'));\n      }\n    }]);\n    return TransformStreamSource;\n  }();\n  var TransformStreamDefaultController = function () {\n    function TransformStreamDefaultController(transformStream) {\n      _classCallCheck(this, TransformStreamDefaultController);\n      if (IsTransformStream(transformStream) === false) {\n        throw new TypeError('TransformStreamDefaultController can only be ' + 'constructed with a TransformStream instance');\n      }\n      if (transformStream._transformStreamController !== undefined) {\n        throw new TypeError('TransformStreamDefaultController instances can ' + 'only be created by the TransformStream constructor');\n      }\n      this._controlledTransformStream = transformStream;\n    }\n    _createClass(TransformStreamDefaultController, [{\n      key: 'enqueue',\n      value: function enqueue(chunk) {\n        if (IsTransformStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('enqueue');\n        }\n        TransformStreamEnqueueToReadable(this._controlledTransformStream, chunk);\n      }\n    }, {\n      key: 'close',\n      value: function close() {\n        if (IsTransformStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('close');\n        }\n        TransformStreamCloseReadable(this._controlledTransformStream);\n      }\n    }, {\n      key: 'error',\n      value: function error(reason) {\n        if (IsTransformStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('error');\n        }\n        TransformStreamError(this._controlledTransformStream, reason);\n      }\n    }, {\n      key: 'desiredSize',\n      get: function get() {\n        if (IsTransformStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('desiredSize');\n        }\n        var transformStream = this._controlledTransformStream;\n        var readableController = transformStream._readableController;\n        return ReadableStreamDefaultControllerGetDesiredSize(readableController);\n      }\n    }]);\n    return TransformStreamDefaultController;\n  }();\n  var TransformStream = function () {\n    function TransformStream() {\n      var transformer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      _classCallCheck(this, TransformStream);\n      this._transformer = transformer;\n      var readableStrategy = transformer.readableStrategy,\n          writableStrategy = transformer.writableStrategy;\n      this._transforming = false;\n      this._errored = false;\n      this._storedError = undefined;\n      this._writableController = undefined;\n      this._readableController = undefined;\n      this._transformStreamController = undefined;\n      this._writableDone = false;\n      this._readableClosed = false;\n      this._backpressure = undefined;\n      this._backpressureChangePromise = undefined;\n      this._backpressureChangePromise_resolve = undefined;\n      this._transformStreamController = new TransformStreamDefaultController(this);\n      var startPromise_resolve = void 0;\n      var startPromise = new Promise(function (resolve) {\n        startPromise_resolve = resolve;\n      });\n      var source = new TransformStreamSource(this, startPromise);\n      this._readable = new ReadableStream(source, readableStrategy);\n      var sink = new TransformStreamSink(this, startPromise);\n      this._writable = new WritableStream(sink, writableStrategy);\n      assert(this._writableController !== undefined);\n      assert(this._readableController !== undefined);\n      var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(this._readableController);\n      TransformStreamSetBackpressure(this, desiredSize <= 0);\n      var transformStream = this;\n      var startResult = InvokeOrNoop(transformer, 'start', [transformStream._transformStreamController]);\n      startPromise_resolve(startResult);\n      startPromise.catch(function (e) {\n        if (transformStream._errored === false) {\n          transformStream._errored = true;\n          transformStream._storedError = e;\n        }\n      });\n    }\n    _createClass(TransformStream, [{\n      key: 'readable',\n      get: function get() {\n        if (IsTransformStream(this) === false) {\n          throw streamBrandCheckException('readable');\n        }\n        return this._readable;\n      }\n    }, {\n      key: 'writable',\n      get: function get() {\n        if (IsTransformStream(this) === false) {\n          throw streamBrandCheckException('writable');\n        }\n        return this._writable;\n      }\n    }]);\n    return TransformStream;\n  }();\n  module.exports = { TransformStream: TransformStream };\n  function defaultControllerBrandCheckException(name) {\n    return new TypeError('TransformStreamDefaultController.prototype.' + name + ' can only be used on a TransformStreamDefaultController');\n  }\n  function streamBrandCheckException(name) {\n    return new TypeError('TransformStream.prototype.' + name + ' can only be used on a TransformStream');\n  }\n}, function (module, exports, __w_pdfjs_require__) {\n  module.exports = __w_pdfjs_require__(5);\n}]));\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.AnnotationFactory = exports.AnnotationBorderStyle = exports.Annotation = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _obj = __w_pdfjs_require__(15);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _colorspace = __w_pdfjs_require__(3);\n\nvar _evaluator = __w_pdfjs_require__(13);\n\nvar _stream = __w_pdfjs_require__(2);\n\nfunction AnnotationFactory() {}\nAnnotationFactory.prototype = {\n  create: function AnnotationFactory_create(xref, ref, pdfManager, idFactory) {\n    var dict = xref.fetchIfRef(ref);\n    if (!(0, _primitives.isDict)(dict)) {\n      return;\n    }\n    var id = (0, _primitives.isRef)(ref) ? ref.toString() : 'annot_' + idFactory.createObjId();\n    var subtype = dict.get('Subtype');\n    subtype = (0, _primitives.isName)(subtype) ? subtype.name : null;\n    var parameters = {\n      xref: xref,\n      dict: dict,\n      ref: (0, _primitives.isRef)(ref) ? ref : null,\n      subtype: subtype,\n      id: id,\n      pdfManager: pdfManager\n    };\n    switch (subtype) {\n      case 'Link':\n        return new LinkAnnotation(parameters);\n      case 'Text':\n        return new TextAnnotation(parameters);\n      case 'Widget':\n        var fieldType = _util.Util.getInheritableProperty(dict, 'FT');\n        fieldType = (0, _primitives.isName)(fieldType) ? fieldType.name : null;\n        switch (fieldType) {\n          case 'Tx':\n            return new TextWidgetAnnotation(parameters);\n          case 'Btn':\n            return new ButtonWidgetAnnotation(parameters);\n          case 'Ch':\n            return new ChoiceWidgetAnnotation(parameters);\n        }\n        (0, _util.warn)('Unimplemented widget field type \"' + fieldType + '\", ' + 'falling back to base field type.');\n        return new WidgetAnnotation(parameters);\n      case 'Popup':\n        return new PopupAnnotation(parameters);\n      case 'Line':\n        return new LineAnnotation(parameters);\n      case 'Highlight':\n        return new HighlightAnnotation(parameters);\n      case 'Underline':\n        return new UnderlineAnnotation(parameters);\n      case 'Squiggly':\n        return new SquigglyAnnotation(parameters);\n      case 'StrikeOut':\n        return new StrikeOutAnnotation(parameters);\n      case 'FileAttachment':\n        return new FileAttachmentAnnotation(parameters);\n      default:\n        if (!subtype) {\n          (0, _util.warn)('Annotation is missing the required /Subtype.');\n        } else {\n          (0, _util.warn)('Unimplemented annotation type \"' + subtype + '\", ' + 'falling back to base annotation.');\n        }\n        return new Annotation(parameters);\n    }\n  }\n};\nvar Annotation = function AnnotationClosure() {\n  function getTransformMatrix(rect, bbox, matrix) {\n    var bounds = _util.Util.getAxialAlignedBoundingBox(bbox, matrix);\n    var minX = bounds[0];\n    var minY = bounds[1];\n    var maxX = bounds[2];\n    var maxY = bounds[3];\n    if (minX === maxX || minY === maxY) {\n      return [1, 0, 0, 1, rect[0], rect[1]];\n    }\n    var xRatio = (rect[2] - rect[0]) / (maxX - minX);\n    var yRatio = (rect[3] - rect[1]) / (maxY - minY);\n    return [xRatio, 0, 0, yRatio, rect[0] - minX * xRatio, rect[1] - minY * yRatio];\n  }\n  function Annotation(params) {\n    var dict = params.dict;\n    this.setFlags(dict.get('F'));\n    this.setRectangle(dict.getArray('Rect'));\n    this.setColor(dict.getArray('C'));\n    this.setBorderStyle(dict);\n    this.setAppearance(dict);\n    this.data = {};\n    this.data.id = params.id;\n    this.data.subtype = params.subtype;\n    this.data.annotationFlags = this.flags;\n    this.data.rect = this.rectangle;\n    this.data.color = this.color;\n    this.data.borderStyle = this.borderStyle;\n    this.data.hasAppearance = !!this.appearance;\n  }\n  Annotation.prototype = {\n    _hasFlag: function Annotation_hasFlag(flags, flag) {\n      return !!(flags & flag);\n    },\n    _isViewable: function Annotation_isViewable(flags) {\n      return !this._hasFlag(flags, _util.AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, _util.AnnotationFlag.HIDDEN) && !this._hasFlag(flags, _util.AnnotationFlag.NOVIEW);\n    },\n    _isPrintable: function AnnotationFlag_isPrintable(flags) {\n      return this._hasFlag(flags, _util.AnnotationFlag.PRINT) && !this._hasFlag(flags, _util.AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, _util.AnnotationFlag.HIDDEN);\n    },\n    get viewable() {\n      if (this.flags === 0) {\n        return true;\n      }\n      return this._isViewable(this.flags);\n    },\n    get printable() {\n      if (this.flags === 0) {\n        return false;\n      }\n      return this._isPrintable(this.flags);\n    },\n    setFlags: function Annotation_setFlags(flags) {\n      this.flags = (0, _util.isInt)(flags) && flags > 0 ? flags : 0;\n    },\n    hasFlag: function Annotation_hasFlag(flag) {\n      return this._hasFlag(this.flags, flag);\n    },\n    setRectangle: function Annotation_setRectangle(rectangle) {\n      if ((0, _util.isArray)(rectangle) && rectangle.length === 4) {\n        this.rectangle = _util.Util.normalizeRect(rectangle);\n      } else {\n        this.rectangle = [0, 0, 0, 0];\n      }\n    },\n    setColor: function Annotation_setColor(color) {\n      var rgbColor = new Uint8Array(3);\n      if (!(0, _util.isArray)(color)) {\n        this.color = rgbColor;\n        return;\n      }\n      switch (color.length) {\n        case 0:\n          this.color = null;\n          break;\n        case 1:\n          _colorspace.ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0);\n          this.color = rgbColor;\n          break;\n        case 3:\n          _colorspace.ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0);\n          this.color = rgbColor;\n          break;\n        case 4:\n          _colorspace.ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0);\n          this.color = rgbColor;\n          break;\n        default:\n          this.color = rgbColor;\n          break;\n      }\n    },\n    setBorderStyle: function Annotation_setBorderStyle(borderStyle) {\n      this.borderStyle = new AnnotationBorderStyle();\n      if (!(0, _primitives.isDict)(borderStyle)) {\n        return;\n      }\n      if (borderStyle.has('BS')) {\n        var dict = borderStyle.get('BS');\n        var dictType = dict.get('Type');\n        if (!dictType || (0, _primitives.isName)(dictType, 'Border')) {\n          this.borderStyle.setWidth(dict.get('W'));\n          this.borderStyle.setStyle(dict.get('S'));\n          this.borderStyle.setDashArray(dict.getArray('D'));\n        }\n      } else if (borderStyle.has('Border')) {\n        var array = borderStyle.getArray('Border');\n        if ((0, _util.isArray)(array) && array.length >= 3) {\n          this.borderStyle.setHorizontalCornerRadius(array[0]);\n          this.borderStyle.setVerticalCornerRadius(array[1]);\n          this.borderStyle.setWidth(array[2]);\n          if (array.length === 4) {\n            this.borderStyle.setDashArray(array[3]);\n          }\n        }\n      } else {\n        this.borderStyle.setWidth(0);\n      }\n    },\n    setAppearance: function Annotation_setAppearance(dict) {\n      this.appearance = null;\n      var appearanceStates = dict.get('AP');\n      if (!(0, _primitives.isDict)(appearanceStates)) {\n        return;\n      }\n      var normalAppearanceState = appearanceStates.get('N');\n      if ((0, _primitives.isStream)(normalAppearanceState)) {\n        this.appearance = normalAppearanceState;\n        return;\n      }\n      if (!(0, _primitives.isDict)(normalAppearanceState)) {\n        return;\n      }\n      var as = dict.get('AS');\n      if (!(0, _primitives.isName)(as) || !normalAppearanceState.has(as.name)) {\n        return;\n      }\n      this.appearance = normalAppearanceState.get(as.name);\n    },\n    _preparePopup: function Annotation_preparePopup(dict) {\n      if (!dict.has('C')) {\n        this.data.color = null;\n      }\n      this.data.hasPopup = dict.has('Popup');\n      this.data.title = (0, _util.stringToPDFString)(dict.get('T') || '');\n      this.data.contents = (0, _util.stringToPDFString)(dict.get('Contents') || '');\n    },\n    loadResources: function Annotation_loadResources(keys) {\n      return this.appearance.dict.getAsync('Resources').then(function (resources) {\n        if (!resources) {\n          return;\n        }\n        var objectLoader = new _obj.ObjectLoader(resources, keys, resources.xref);\n        return objectLoader.load().then(function () {\n          return resources;\n        });\n      });\n    },\n    getOperatorList: function Annotation_getOperatorList(evaluator, task, renderForms) {\n      var _this = this;\n\n      if (!this.appearance) {\n        return Promise.resolve(new _evaluator.OperatorList());\n      }\n      var data = this.data;\n      var appearanceDict = this.appearance.dict;\n      var resourcesPromise = this.loadResources(['ExtGState', 'ColorSpace', 'Pattern', 'Shading', 'XObject', 'Font']);\n      var bbox = appearanceDict.getArray('BBox') || [0, 0, 1, 1];\n      var matrix = appearanceDict.getArray('Matrix') || [1, 0, 0, 1, 0, 0];\n      var transform = getTransformMatrix(data.rect, bbox, matrix);\n      return resourcesPromise.then(function (resources) {\n        var opList = new _evaluator.OperatorList();\n        opList.addOp(_util.OPS.beginAnnotation, [data.rect, transform, matrix]);\n        return evaluator.getOperatorList({\n          stream: _this.appearance,\n          task: task,\n          resources: resources,\n          operatorList: opList\n        }).then(function () {\n          opList.addOp(_util.OPS.endAnnotation, []);\n          _this.appearance.reset();\n          return opList;\n        });\n      });\n    }\n  };\n  return Annotation;\n}();\nvar AnnotationBorderStyle = function AnnotationBorderStyleClosure() {\n  function AnnotationBorderStyle() {\n    this.width = 1;\n    this.style = _util.AnnotationBorderStyleType.SOLID;\n    this.dashArray = [3];\n    this.horizontalCornerRadius = 0;\n    this.verticalCornerRadius = 0;\n  }\n  AnnotationBorderStyle.prototype = {\n    setWidth: function AnnotationBorderStyle_setWidth(width) {\n      if (width === (width | 0)) {\n        this.width = width;\n      }\n    },\n    setStyle: function AnnotationBorderStyle_setStyle(style) {\n      if (!style) {\n        return;\n      }\n      switch (style.name) {\n        case 'S':\n          this.style = _util.AnnotationBorderStyleType.SOLID;\n          break;\n        case 'D':\n          this.style = _util.AnnotationBorderStyleType.DASHED;\n          break;\n        case 'B':\n          this.style = _util.AnnotationBorderStyleType.BEVELED;\n          break;\n        case 'I':\n          this.style = _util.AnnotationBorderStyleType.INSET;\n          break;\n        case 'U':\n          this.style = _util.AnnotationBorderStyleType.UNDERLINE;\n          break;\n        default:\n          break;\n      }\n    },\n    setDashArray: function AnnotationBorderStyle_setDashArray(dashArray) {\n      if ((0, _util.isArray)(dashArray) && dashArray.length > 0) {\n        var isValid = true;\n        var allZeros = true;\n        for (var i = 0, len = dashArray.length; i < len; i++) {\n          var element = dashArray[i];\n          var validNumber = +element >= 0;\n          if (!validNumber) {\n            isValid = false;\n            break;\n          } else if (element > 0) {\n            allZeros = false;\n          }\n        }\n        if (isValid && !allZeros) {\n          this.dashArray = dashArray;\n        } else {\n          this.width = 0;\n        }\n      } else if (dashArray) {\n        this.width = 0;\n      }\n    },\n    setHorizontalCornerRadius: function AnnotationBorderStyle_setHorizontalCornerRadius(radius) {\n      if (radius === (radius | 0)) {\n        this.horizontalCornerRadius = radius;\n      }\n    },\n    setVerticalCornerRadius: function AnnotationBorderStyle_setVerticalCornerRadius(radius) {\n      if (radius === (radius | 0)) {\n        this.verticalCornerRadius = radius;\n      }\n    }\n  };\n  return AnnotationBorderStyle;\n}();\nvar WidgetAnnotation = function WidgetAnnotationClosure() {\n  function WidgetAnnotation(params) {\n    Annotation.call(this, params);\n    var dict = params.dict;\n    var data = this.data;\n    data.annotationType = _util.AnnotationType.WIDGET;\n    data.fieldName = this._constructFieldName(dict);\n    data.fieldValue = _util.Util.getInheritableProperty(dict, 'V', true);\n    data.alternativeText = (0, _util.stringToPDFString)(dict.get('TU') || '');\n    data.defaultAppearance = _util.Util.getInheritableProperty(dict, 'DA') || '';\n    var fieldType = _util.Util.getInheritableProperty(dict, 'FT');\n    data.fieldType = (0, _primitives.isName)(fieldType) ? fieldType.name : null;\n    this.fieldResources = _util.Util.getInheritableProperty(dict, 'DR') || _primitives.Dict.empty;\n    data.fieldFlags = _util.Util.getInheritableProperty(dict, 'Ff');\n    if (!(0, _util.isInt)(data.fieldFlags) || data.fieldFlags < 0) {\n      data.fieldFlags = 0;\n    }\n    data.readOnly = this.hasFieldFlag(_util.AnnotationFieldFlag.READONLY);\n    if (data.fieldType === 'Sig') {\n      this.setFlags(_util.AnnotationFlag.HIDDEN);\n    }\n  }\n  _util.Util.inherit(WidgetAnnotation, Annotation, {\n    _constructFieldName: function WidgetAnnotation_constructFieldName(dict) {\n      if (!dict.has('T') && !dict.has('Parent')) {\n        (0, _util.warn)('Unknown field name, falling back to empty field name.');\n        return '';\n      }\n      if (!dict.has('Parent')) {\n        return (0, _util.stringToPDFString)(dict.get('T'));\n      }\n      var fieldName = [];\n      if (dict.has('T')) {\n        fieldName.unshift((0, _util.stringToPDFString)(dict.get('T')));\n      }\n      var loopDict = dict;\n      while (loopDict.has('Parent')) {\n        loopDict = loopDict.get('Parent');\n        if (!(0, _primitives.isDict)(loopDict)) {\n          break;\n        }\n        if (loopDict.has('T')) {\n          fieldName.unshift((0, _util.stringToPDFString)(loopDict.get('T')));\n        }\n      }\n      return fieldName.join('.');\n    },\n    hasFieldFlag: function WidgetAnnotation_hasFieldFlag(flag) {\n      return !!(this.data.fieldFlags & flag);\n    }\n  });\n  return WidgetAnnotation;\n}();\nvar TextWidgetAnnotation = function TextWidgetAnnotationClosure() {\n  function TextWidgetAnnotation(params) {\n    WidgetAnnotation.call(this, params);\n    this.data.fieldValue = (0, _util.stringToPDFString)(this.data.fieldValue || '');\n    var alignment = _util.Util.getInheritableProperty(params.dict, 'Q');\n    if (!(0, _util.isInt)(alignment) || alignment < 0 || alignment > 2) {\n      alignment = null;\n    }\n    this.data.textAlignment = alignment;\n    var maximumLength = _util.Util.getInheritableProperty(params.dict, 'MaxLen');\n    if (!(0, _util.isInt)(maximumLength) || maximumLength < 0) {\n      maximumLength = null;\n    }\n    this.data.maxLen = maximumLength;\n    this.data.multiLine = this.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE);\n    this.data.comb = this.hasFieldFlag(_util.AnnotationFieldFlag.COMB) && !this.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE) && !this.hasFieldFlag(_util.AnnotationFieldFlag.PASSWORD) && !this.hasFieldFlag(_util.AnnotationFieldFlag.FILESELECT) && this.data.maxLen !== null;\n  }\n  _util.Util.inherit(TextWidgetAnnotation, WidgetAnnotation, {\n    getOperatorList: function TextWidgetAnnotation_getOperatorList(evaluator, task, renderForms) {\n      var operatorList = new _evaluator.OperatorList();\n      if (renderForms) {\n        return Promise.resolve(operatorList);\n      }\n      if (this.appearance) {\n        return Annotation.prototype.getOperatorList.call(this, evaluator, task, renderForms);\n      }\n      if (!this.data.defaultAppearance) {\n        return Promise.resolve(operatorList);\n      }\n      var stream = new _stream.Stream((0, _util.stringToBytes)(this.data.defaultAppearance));\n      return evaluator.getOperatorList({\n        stream: stream,\n        task: task,\n        resources: this.fieldResources,\n        operatorList: operatorList\n      }).then(function () {\n        return operatorList;\n      });\n    }\n  });\n  return TextWidgetAnnotation;\n}();\nvar ButtonWidgetAnnotation = function ButtonWidgetAnnotationClosure() {\n  function ButtonWidgetAnnotation(params) {\n    WidgetAnnotation.call(this, params);\n    this.data.checkBox = !this.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);\n    if (this.data.checkBox) {\n      if (!(0, _primitives.isName)(this.data.fieldValue)) {\n        return;\n      }\n      this.data.fieldValue = this.data.fieldValue.name;\n    }\n    this.data.radioButton = this.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);\n    if (this.data.radioButton) {\n      this.data.fieldValue = this.data.buttonValue = null;\n      var fieldParent = params.dict.get('Parent');\n      if ((0, _primitives.isDict)(fieldParent) && fieldParent.has('V')) {\n        var fieldParentValue = fieldParent.get('V');\n        if ((0, _primitives.isName)(fieldParentValue)) {\n          this.data.fieldValue = fieldParentValue.name;\n        }\n      }\n      var appearanceStates = params.dict.get('AP');\n      if (!(0, _primitives.isDict)(appearanceStates)) {\n        return;\n      }\n      var normalAppearanceState = appearanceStates.get('N');\n      if (!(0, _primitives.isDict)(normalAppearanceState)) {\n        return;\n      }\n      var keys = normalAppearanceState.getKeys();\n      for (var i = 0, ii = keys.length; i < ii; i++) {\n        if (keys[i] !== 'Off') {\n          this.data.buttonValue = keys[i];\n          break;\n        }\n      }\n    }\n  }\n  _util.Util.inherit(ButtonWidgetAnnotation, WidgetAnnotation, {\n    getOperatorList: function ButtonWidgetAnnotation_getOperatorList(evaluator, task, renderForms) {\n      var operatorList = new _evaluator.OperatorList();\n      if (renderForms) {\n        return Promise.resolve(operatorList);\n      }\n      if (this.appearance) {\n        return Annotation.prototype.getOperatorList.call(this, evaluator, task, renderForms);\n      }\n      return Promise.resolve(operatorList);\n    }\n  });\n  return ButtonWidgetAnnotation;\n}();\nvar ChoiceWidgetAnnotation = function ChoiceWidgetAnnotationClosure() {\n  function ChoiceWidgetAnnotation(params) {\n    WidgetAnnotation.call(this, params);\n    this.data.options = [];\n    var options = _util.Util.getInheritableProperty(params.dict, 'Opt');\n    if ((0, _util.isArray)(options)) {\n      var xref = params.xref;\n      for (var i = 0, ii = options.length; i < ii; i++) {\n        var option = xref.fetchIfRef(options[i]);\n        var isOptionArray = (0, _util.isArray)(option);\n        this.data.options[i] = {\n          exportValue: isOptionArray ? xref.fetchIfRef(option[0]) : option,\n          displayValue: isOptionArray ? xref.fetchIfRef(option[1]) : option\n        };\n      }\n    }\n    if (!(0, _util.isArray)(this.data.fieldValue)) {\n      this.data.fieldValue = [this.data.fieldValue];\n    }\n    this.data.combo = this.hasFieldFlag(_util.AnnotationFieldFlag.COMBO);\n    this.data.multiSelect = this.hasFieldFlag(_util.AnnotationFieldFlag.MULTISELECT);\n  }\n  _util.Util.inherit(ChoiceWidgetAnnotation, WidgetAnnotation, {\n    getOperatorList: function ChoiceWidgetAnnotation_getOperatorList(evaluator, task, renderForms) {\n      var operatorList = new _evaluator.OperatorList();\n      if (renderForms) {\n        return Promise.resolve(operatorList);\n      }\n      return Annotation.prototype.getOperatorList.call(this, evaluator, task, renderForms);\n    }\n  });\n  return ChoiceWidgetAnnotation;\n}();\nvar TextAnnotation = function TextAnnotationClosure() {\n  var DEFAULT_ICON_SIZE = 22;\n  function TextAnnotation(parameters) {\n    Annotation.call(this, parameters);\n    this.data.annotationType = _util.AnnotationType.TEXT;\n    if (this.data.hasAppearance) {\n      this.data.name = 'NoIcon';\n    } else {\n      this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE;\n      this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE;\n      this.data.name = parameters.dict.has('Name') ? parameters.dict.get('Name').name : 'Note';\n    }\n    this._preparePopup(parameters.dict);\n  }\n  _util.Util.inherit(TextAnnotation, Annotation, {});\n  return TextAnnotation;\n}();\nvar LinkAnnotation = function LinkAnnotationClosure() {\n  function LinkAnnotation(params) {\n    Annotation.call(this, params);\n    var data = this.data;\n    data.annotationType = _util.AnnotationType.LINK;\n    _obj.Catalog.parseDestDictionary({\n      destDict: params.dict,\n      resultObj: data,\n      docBaseUrl: params.pdfManager.docBaseUrl\n    });\n  }\n  _util.Util.inherit(LinkAnnotation, Annotation, {});\n  return LinkAnnotation;\n}();\nvar PopupAnnotation = function PopupAnnotationClosure() {\n  function PopupAnnotation(parameters) {\n    Annotation.call(this, parameters);\n    this.data.annotationType = _util.AnnotationType.POPUP;\n    var dict = parameters.dict;\n    var parentItem = dict.get('Parent');\n    if (!parentItem) {\n      (0, _util.warn)('Popup annotation has a missing or invalid parent annotation.');\n      return;\n    }\n    var parentSubtype = parentItem.get('Subtype');\n    this.data.parentType = (0, _primitives.isName)(parentSubtype) ? parentSubtype.name : null;\n    this.data.parentId = dict.getRaw('Parent').toString();\n    this.data.title = (0, _util.stringToPDFString)(parentItem.get('T') || '');\n    this.data.contents = (0, _util.stringToPDFString)(parentItem.get('Contents') || '');\n    if (!parentItem.has('C')) {\n      this.data.color = null;\n    } else {\n      this.setColor(parentItem.getArray('C'));\n      this.data.color = this.color;\n    }\n    if (!this.viewable) {\n      var parentFlags = parentItem.get('F');\n      if (this._isViewable(parentFlags)) {\n        this.setFlags(parentFlags);\n      }\n    }\n  }\n  _util.Util.inherit(PopupAnnotation, Annotation, {});\n  return PopupAnnotation;\n}();\nvar LineAnnotation = function LineAnnotationClosure() {\n  function LineAnnotation(parameters) {\n    Annotation.call(this, parameters);\n    this.data.annotationType = _util.AnnotationType.LINE;\n    var dict = parameters.dict;\n    this.data.lineCoordinates = _util.Util.normalizeRect(dict.getArray('L'));\n    this._preparePopup(dict);\n  }\n  _util.Util.inherit(LineAnnotation, Annotation, {});\n  return LineAnnotation;\n}();\nvar HighlightAnnotation = function HighlightAnnotationClosure() {\n  function HighlightAnnotation(parameters) {\n    Annotation.call(this, parameters);\n    this.data.annotationType = _util.AnnotationType.HIGHLIGHT;\n    this._preparePopup(parameters.dict);\n  }\n  _util.Util.inherit(HighlightAnnotation, Annotation, {});\n  return HighlightAnnotation;\n}();\nvar UnderlineAnnotation = function UnderlineAnnotationClosure() {\n  function UnderlineAnnotation(parameters) {\n    Annotation.call(this, parameters);\n    this.data.annotationType = _util.AnnotationType.UNDERLINE;\n    this._preparePopup(parameters.dict);\n  }\n  _util.Util.inherit(UnderlineAnnotation, Annotation, {});\n  return UnderlineAnnotation;\n}();\nvar SquigglyAnnotation = function SquigglyAnnotationClosure() {\n  function SquigglyAnnotation(parameters) {\n    Annotation.call(this, parameters);\n    this.data.annotationType = _util.AnnotationType.SQUIGGLY;\n    this._preparePopup(parameters.dict);\n  }\n  _util.Util.inherit(SquigglyAnnotation, Annotation, {});\n  return SquigglyAnnotation;\n}();\nvar StrikeOutAnnotation = function StrikeOutAnnotationClosure() {\n  function StrikeOutAnnotation(parameters) {\n    Annotation.call(this, parameters);\n    this.data.annotationType = _util.AnnotationType.STRIKEOUT;\n    this._preparePopup(parameters.dict);\n  }\n  _util.Util.inherit(StrikeOutAnnotation, Annotation, {});\n  return StrikeOutAnnotation;\n}();\nvar FileAttachmentAnnotation = function FileAttachmentAnnotationClosure() {\n  function FileAttachmentAnnotation(parameters) {\n    Annotation.call(this, parameters);\n    var file = new _obj.FileSpec(parameters.dict.get('FS'), parameters.xref);\n    this.data.annotationType = _util.AnnotationType.FILEATTACHMENT;\n    this.data.file = file.serializable;\n    this._preparePopup(parameters.dict);\n  }\n  _util.Util.inherit(FileAttachmentAnnotation, Annotation, {});\n  return FileAttachmentAnnotation;\n}();\nexports.Annotation = Annotation;\nexports.AnnotationBorderStyle = AnnotationBorderStyle;\nexports.AnnotationFactory = AnnotationFactory;\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.bidi = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar baseTypes = ['BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS', 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'ON', 'ES', 'CS', 'ES', 'CS', 'CS', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'CS', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'ON', 'BN', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON', 'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'];\nvar arabicTypes = ['AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'ON', 'ON', 'AL', 'ET', 'ET', 'AL', 'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', '', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AN', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'NSM', 'NSM', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL'];\nfunction isOdd(i) {\n  return (i & 1) !== 0;\n}\nfunction isEven(i) {\n  return (i & 1) === 0;\n}\nfunction findUnequal(arr, start, value) {\n  for (var j = start, jj = arr.length; j < jj; ++j) {\n    if (arr[j] !== value) {\n      return j;\n    }\n  }\n  return j;\n}\nfunction setValues(arr, start, end, value) {\n  for (var j = start; j < end; ++j) {\n    arr[j] = value;\n  }\n}\nfunction reverseValues(arr, start, end) {\n  for (var i = start, j = end - 1; i < j; ++i, --j) {\n    var temp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = temp;\n  }\n}\nfunction createBidiText(str, isLTR, vertical) {\n  return {\n    str: str,\n    dir: vertical ? 'ttb' : isLTR ? 'ltr' : 'rtl'\n  };\n}\nvar chars = [];\nvar types = [];\nfunction bidi(str, startLevel, vertical) {\n  var isLTR = true;\n  var strLength = str.length;\n  if (strLength === 0 || vertical) {\n    return createBidiText(str, isLTR, vertical);\n  }\n  chars.length = strLength;\n  types.length = strLength;\n  var numBidi = 0;\n  var i, ii;\n  for (i = 0; i < strLength; ++i) {\n    chars[i] = str.charAt(i);\n    var charCode = str.charCodeAt(i);\n    var charType = 'L';\n    if (charCode <= 0x00ff) {\n      charType = baseTypes[charCode];\n    } else if (0x0590 <= charCode && charCode <= 0x05f4) {\n      charType = 'R';\n    } else if (0x0600 <= charCode && charCode <= 0x06ff) {\n      charType = arabicTypes[charCode & 0xff];\n      if (!charType) {\n        (0, _util.warn)('Bidi: invalid Unicode character ' + charCode.toString(16));\n      }\n    } else if (0x0700 <= charCode && charCode <= 0x08AC) {\n      charType = 'AL';\n    }\n    if (charType === 'R' || charType === 'AL' || charType === 'AN') {\n      numBidi++;\n    }\n    types[i] = charType;\n  }\n  if (numBidi === 0) {\n    isLTR = true;\n    return createBidiText(str, isLTR);\n  }\n  if (startLevel === -1) {\n    if (numBidi / strLength < 0.3) {\n      isLTR = true;\n      startLevel = 0;\n    } else {\n      isLTR = false;\n      startLevel = 1;\n    }\n  }\n  var levels = [];\n  for (i = 0; i < strLength; ++i) {\n    levels[i] = startLevel;\n  }\n  var e = isOdd(startLevel) ? 'R' : 'L';\n  var sor = e;\n  var eor = sor;\n  var lastType = sor;\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === 'NSM') {\n      types[i] = lastType;\n    } else {\n      lastType = types[i];\n    }\n  }\n  lastType = sor;\n  var t;\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (t === 'EN') {\n      types[i] = lastType === 'AL' ? 'AN' : 'EN';\n    } else if (t === 'R' || t === 'L' || t === 'AL') {\n      lastType = t;\n    }\n  }\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (t === 'AL') {\n      types[i] = 'R';\n    }\n  }\n  for (i = 1; i < strLength - 1; ++i) {\n    if (types[i] === 'ES' && types[i - 1] === 'EN' && types[i + 1] === 'EN') {\n      types[i] = 'EN';\n    }\n    if (types[i] === 'CS' && (types[i - 1] === 'EN' || types[i - 1] === 'AN') && types[i + 1] === types[i - 1]) {\n      types[i] = types[i - 1];\n    }\n  }\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === 'EN') {\n      var j;\n      for (j = i - 1; j >= 0; --j) {\n        if (types[j] !== 'ET') {\n          break;\n        }\n        types[j] = 'EN';\n      }\n      for (j = i + 1; j < strLength; ++j) {\n        if (types[j] !== 'ET') {\n          break;\n        }\n        types[j] = 'EN';\n      }\n    }\n  }\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (t === 'WS' || t === 'ES' || t === 'ET' || t === 'CS') {\n      types[i] = 'ON';\n    }\n  }\n  lastType = sor;\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (t === 'EN') {\n      types[i] = lastType === 'L' ? 'L' : 'EN';\n    } else if (t === 'R' || t === 'L') {\n      lastType = t;\n    }\n  }\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === 'ON') {\n      var end = findUnequal(types, i + 1, 'ON');\n      var before = sor;\n      if (i > 0) {\n        before = types[i - 1];\n      }\n      var after = eor;\n      if (end + 1 < strLength) {\n        after = types[end + 1];\n      }\n      if (before !== 'L') {\n        before = 'R';\n      }\n      if (after !== 'L') {\n        after = 'R';\n      }\n      if (before === after) {\n        setValues(types, i, end, before);\n      }\n      i = end - 1;\n    }\n  }\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === 'ON') {\n      types[i] = e;\n    }\n  }\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (isEven(levels[i])) {\n      if (t === 'R') {\n        levels[i] += 1;\n      } else if (t === 'AN' || t === 'EN') {\n        levels[i] += 2;\n      }\n    } else {\n      if (t === 'L' || t === 'AN' || t === 'EN') {\n        levels[i] += 1;\n      }\n    }\n  }\n  var highestLevel = -1;\n  var lowestOddLevel = 99;\n  var level;\n  for (i = 0, ii = levels.length; i < ii; ++i) {\n    level = levels[i];\n    if (highestLevel < level) {\n      highestLevel = level;\n    }\n    if (lowestOddLevel > level && isOdd(level)) {\n      lowestOddLevel = level;\n    }\n  }\n  for (level = highestLevel; level >= lowestOddLevel; --level) {\n    var start = -1;\n    for (i = 0, ii = levels.length; i < ii; ++i) {\n      if (levels[i] < level) {\n        if (start >= 0) {\n          reverseValues(chars, start, i);\n          start = -1;\n        }\n      } else if (start < 0) {\n        start = i;\n      }\n    }\n    if (start >= 0) {\n      reverseValues(chars, start, levels.length);\n    }\n  }\n  for (i = 0, ii = chars.length; i < ii; ++i) {\n    var ch = chars[i];\n    if (ch === '<' || ch === '>') {\n      chars[i] = '';\n    }\n  }\n  return createBidiText(chars.join(''), isLTR);\n}\nexports.bidi = bidi;\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar ISOAdobeCharset = ['.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron'];\nvar ExpertCharset = ['.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall'];\nvar ExpertSubsetCharset = ['.notdef', 'space', 'dollaroldstyle', 'dollarsuperior', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted', 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter', 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior'];\nexports.ISOAdobeCharset = ISOAdobeCharset;\nexports.ExpertCharset = ExpertCharset;\nexports.ExpertSubsetCharset = ExpertSubsetCharset;\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.CMapFactory = exports.IdentityCMap = exports.CMap = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _parser = __w_pdfjs_require__(5);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar BUILT_IN_CMAPS = ['Adobe-GB1-UCS2', 'Adobe-CNS1-UCS2', 'Adobe-Japan1-UCS2', 'Adobe-Korea1-UCS2', '78-EUC-H', '78-EUC-V', '78-H', '78-RKSJ-H', '78-RKSJ-V', '78-V', '78ms-RKSJ-H', '78ms-RKSJ-V', '83pv-RKSJ-H', '90ms-RKSJ-H', '90ms-RKSJ-V', '90msp-RKSJ-H', '90msp-RKSJ-V', '90pv-RKSJ-H', '90pv-RKSJ-V', 'Add-H', 'Add-RKSJ-H', 'Add-RKSJ-V', 'Add-V', 'Adobe-CNS1-0', 'Adobe-CNS1-1', 'Adobe-CNS1-2', 'Adobe-CNS1-3', 'Adobe-CNS1-4', 'Adobe-CNS1-5', 'Adobe-CNS1-6', 'Adobe-GB1-0', 'Adobe-GB1-1', 'Adobe-GB1-2', 'Adobe-GB1-3', 'Adobe-GB1-4', 'Adobe-GB1-5', 'Adobe-Japan1-0', 'Adobe-Japan1-1', 'Adobe-Japan1-2', 'Adobe-Japan1-3', 'Adobe-Japan1-4', 'Adobe-Japan1-5', 'Adobe-Japan1-6', 'Adobe-Korea1-0', 'Adobe-Korea1-1', 'Adobe-Korea1-2', 'B5-H', 'B5-V', 'B5pc-H', 'B5pc-V', 'CNS-EUC-H', 'CNS-EUC-V', 'CNS1-H', 'CNS1-V', 'CNS2-H', 'CNS2-V', 'ETHK-B5-H', 'ETHK-B5-V', 'ETen-B5-H', 'ETen-B5-V', 'ETenms-B5-H', 'ETenms-B5-V', 'EUC-H', 'EUC-V', 'Ext-H', 'Ext-RKSJ-H', 'Ext-RKSJ-V', 'Ext-V', 'GB-EUC-H', 'GB-EUC-V', 'GB-H', 'GB-V', 'GBK-EUC-H', 'GBK-EUC-V', 'GBK2K-H', 'GBK2K-V', 'GBKp-EUC-H', 'GBKp-EUC-V', 'GBT-EUC-H', 'GBT-EUC-V', 'GBT-H', 'GBT-V', 'GBTpc-EUC-H', 'GBTpc-EUC-V', 'GBpc-EUC-H', 'GBpc-EUC-V', 'H', 'HKdla-B5-H', 'HKdla-B5-V', 'HKdlb-B5-H', 'HKdlb-B5-V', 'HKgccs-B5-H', 'HKgccs-B5-V', 'HKm314-B5-H', 'HKm314-B5-V', 'HKm471-B5-H', 'HKm471-B5-V', 'HKscs-B5-H', 'HKscs-B5-V', 'Hankaku', 'Hiragana', 'KSC-EUC-H', 'KSC-EUC-V', 'KSC-H', 'KSC-Johab-H', 'KSC-Johab-V', 'KSC-V', 'KSCms-UHC-H', 'KSCms-UHC-HW-H', 'KSCms-UHC-HW-V', 'KSCms-UHC-V', 'KSCpc-EUC-H', 'KSCpc-EUC-V', 'Katakana', 'NWP-H', 'NWP-V', 'RKSJ-H', 'RKSJ-V', 'Roman', 'UniCNS-UCS2-H', 'UniCNS-UCS2-V', 'UniCNS-UTF16-H', 'UniCNS-UTF16-V', 'UniCNS-UTF32-H', 'UniCNS-UTF32-V', 'UniCNS-UTF8-H', 'UniCNS-UTF8-V', 'UniGB-UCS2-H', 'UniGB-UCS2-V', 'UniGB-UTF16-H', 'UniGB-UTF16-V', 'UniGB-UTF32-H', 'UniGB-UTF32-V', 'UniGB-UTF8-H', 'UniGB-UTF8-V', 'UniJIS-UCS2-H', 'UniJIS-UCS2-HW-H', 'UniJIS-UCS2-HW-V', 'UniJIS-UCS2-V', 'UniJIS-UTF16-H', 'UniJIS-UTF16-V', 'UniJIS-UTF32-H', 'UniJIS-UTF32-V', 'UniJIS-UTF8-H', 'UniJIS-UTF8-V', 'UniJIS2004-UTF16-H', 'UniJIS2004-UTF16-V', 'UniJIS2004-UTF32-H', 'UniJIS2004-UTF32-V', 'UniJIS2004-UTF8-H', 'UniJIS2004-UTF8-V', 'UniJISPro-UCS2-HW-V', 'UniJISPro-UCS2-V', 'UniJISPro-UTF8-V', 'UniJISX0213-UTF32-H', 'UniJISX0213-UTF32-V', 'UniJISX02132004-UTF32-H', 'UniJISX02132004-UTF32-V', 'UniKS-UCS2-H', 'UniKS-UCS2-V', 'UniKS-UTF16-H', 'UniKS-UTF16-V', 'UniKS-UTF32-H', 'UniKS-UTF32-V', 'UniKS-UTF8-H', 'UniKS-UTF8-V', 'V', 'WP-Symbol'];\nvar CMap = function CMapClosure() {\n  function CMap(builtInCMap) {\n    this.codespaceRanges = [[], [], [], []];\n    this.numCodespaceRanges = 0;\n    this._map = [];\n    this.name = '';\n    this.vertical = false;\n    this.useCMap = null;\n    this.builtInCMap = builtInCMap;\n  }\n  CMap.prototype = {\n    addCodespaceRange: function addCodespaceRange(n, low, high) {\n      this.codespaceRanges[n - 1].push(low, high);\n      this.numCodespaceRanges++;\n    },\n    mapCidRange: function mapCidRange(low, high, dstLow) {\n      while (low <= high) {\n        this._map[low++] = dstLow++;\n      }\n    },\n    mapBfRange: function mapBfRange(low, high, dstLow) {\n      var lastByte = dstLow.length - 1;\n      while (low <= high) {\n        this._map[low++] = dstLow;\n        dstLow = dstLow.substr(0, lastByte) + String.fromCharCode(dstLow.charCodeAt(lastByte) + 1);\n      }\n    },\n    mapBfRangeToArray: function mapBfRangeToArray(low, high, array) {\n      var i = 0,\n          ii = array.length;\n      while (low <= high && i < ii) {\n        this._map[low] = array[i++];\n        ++low;\n      }\n    },\n    mapOne: function mapOne(src, dst) {\n      this._map[src] = dst;\n    },\n    lookup: function lookup(code) {\n      return this._map[code];\n    },\n    contains: function contains(code) {\n      return this._map[code] !== undefined;\n    },\n    forEach: function forEach(callback) {\n      var map = this._map;\n      var length = map.length;\n      if (length <= 0x10000) {\n        for (var i = 0; i < length; i++) {\n          if (map[i] !== undefined) {\n            callback(i, map[i]);\n          }\n        }\n      } else {\n        for (var _i in map) {\n          callback(_i, map[_i]);\n        }\n      }\n    },\n    charCodeOf: function charCodeOf(value) {\n      var map = this._map;\n      if (map.length <= 0x10000) {\n        return map.indexOf(value);\n      }\n      for (var charCode in map) {\n        if (map[charCode] === value) {\n          return charCode | 0;\n        }\n      }\n      return -1;\n    },\n    getMap: function getMap() {\n      return this._map;\n    },\n    readCharCode: function readCharCode(str, offset, out) {\n      var c = 0;\n      var codespaceRanges = this.codespaceRanges;\n      var codespaceRangesLen = this.codespaceRanges.length;\n      for (var n = 0; n < codespaceRangesLen; n++) {\n        c = (c << 8 | str.charCodeAt(offset + n)) >>> 0;\n        var codespaceRange = codespaceRanges[n];\n        for (var k = 0, kk = codespaceRange.length; k < kk;) {\n          var low = codespaceRange[k++];\n          var high = codespaceRange[k++];\n          if (c >= low && c <= high) {\n            out.charcode = c;\n            out.length = n + 1;\n            return;\n          }\n        }\n      }\n      out.charcode = 0;\n      out.length = 1;\n    },\n\n    get length() {\n      return this._map.length;\n    },\n    get isIdentityCMap() {\n      if (!(this.name === 'Identity-H' || this.name === 'Identity-V')) {\n        return false;\n      }\n      if (this._map.length !== 0x10000) {\n        return false;\n      }\n      for (var i = 0; i < 0x10000; i++) {\n        if (this._map[i] !== i) {\n          return false;\n        }\n      }\n      return true;\n    }\n  };\n  return CMap;\n}();\nvar IdentityCMap = function IdentityCMapClosure() {\n  function IdentityCMap(vertical, n) {\n    CMap.call(this);\n    this.vertical = vertical;\n    this.addCodespaceRange(n, 0, 0xffff);\n  }\n  _util.Util.inherit(IdentityCMap, CMap, {});\n  IdentityCMap.prototype = {\n    addCodespaceRange: CMap.prototype.addCodespaceRange,\n    mapCidRange: function mapCidRange(low, high, dstLow) {\n      throw new Error('should not call mapCidRange');\n    },\n    mapBfRange: function mapBfRange(low, high, dstLow) {\n      throw new Error('should not call mapBfRange');\n    },\n    mapBfRangeToArray: function mapBfRangeToArray(low, high, array) {\n      throw new Error('should not call mapBfRangeToArray');\n    },\n    mapOne: function mapOne(src, dst) {\n      throw new Error('should not call mapCidOne');\n    },\n    lookup: function lookup(code) {\n      return (0, _util.isInt)(code) && code <= 0xffff ? code : undefined;\n    },\n    contains: function contains(code) {\n      return (0, _util.isInt)(code) && code <= 0xffff;\n    },\n    forEach: function forEach(callback) {\n      for (var i = 0; i <= 0xffff; i++) {\n        callback(i, i);\n      }\n    },\n    charCodeOf: function charCodeOf(value) {\n      return (0, _util.isInt)(value) && value <= 0xffff ? value : -1;\n    },\n    getMap: function getMap() {\n      var map = new Array(0x10000);\n      for (var i = 0; i <= 0xffff; i++) {\n        map[i] = i;\n      }\n      return map;\n    },\n\n    readCharCode: CMap.prototype.readCharCode,\n    get length() {\n      return 0x10000;\n    },\n    get isIdentityCMap() {\n      throw new Error('should not access .isIdentityCMap');\n    }\n  };\n  return IdentityCMap;\n}();\nvar BinaryCMapReader = function BinaryCMapReaderClosure() {\n  function hexToInt(a, size) {\n    var n = 0;\n    for (var i = 0; i <= size; i++) {\n      n = n << 8 | a[i];\n    }\n    return n >>> 0;\n  }\n  function hexToStr(a, size) {\n    if (size === 1) {\n      return String.fromCharCode(a[0], a[1]);\n    }\n    if (size === 3) {\n      return String.fromCharCode(a[0], a[1], a[2], a[3]);\n    }\n    return String.fromCharCode.apply(null, a.subarray(0, size + 1));\n  }\n  function addHex(a, b, size) {\n    var c = 0;\n    for (var i = size; i >= 0; i--) {\n      c += a[i] + b[i];\n      a[i] = c & 255;\n      c >>= 8;\n    }\n  }\n  function incHex(a, size) {\n    var c = 1;\n    for (var i = size; i >= 0 && c > 0; i--) {\n      c += a[i];\n      a[i] = c & 255;\n      c >>= 8;\n    }\n  }\n  var MAX_NUM_SIZE = 16;\n  var MAX_ENCODED_NUM_SIZE = 19;\n  function BinaryCMapStream(data) {\n    this.buffer = data;\n    this.pos = 0;\n    this.end = data.length;\n    this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE);\n  }\n  BinaryCMapStream.prototype = {\n    readByte: function readByte() {\n      if (this.pos >= this.end) {\n        return -1;\n      }\n      return this.buffer[this.pos++];\n    },\n    readNumber: function readNumber() {\n      var n = 0;\n      var last;\n      do {\n        var b = this.readByte();\n        if (b < 0) {\n          throw new _util.FormatError('unexpected EOF in bcmap');\n        }\n        last = !(b & 0x80);\n        n = n << 7 | b & 0x7F;\n      } while (!last);\n      return n;\n    },\n    readSigned: function readSigned() {\n      var n = this.readNumber();\n      return n & 1 ? ~(n >>> 1) : n >>> 1;\n    },\n    readHex: function readHex(num, size) {\n      num.set(this.buffer.subarray(this.pos, this.pos + size + 1));\n      this.pos += size + 1;\n    },\n    readHexNumber: function readHexNumber(num, size) {\n      var last;\n      var stack = this.tmpBuf,\n          sp = 0;\n      do {\n        var b = this.readByte();\n        if (b < 0) {\n          throw new _util.FormatError('unexpected EOF in bcmap');\n        }\n        last = !(b & 0x80);\n        stack[sp++] = b & 0x7F;\n      } while (!last);\n      var i = size,\n          buffer = 0,\n          bufferSize = 0;\n      while (i >= 0) {\n        while (bufferSize < 8 && stack.length > 0) {\n          buffer = stack[--sp] << bufferSize | buffer;\n          bufferSize += 7;\n        }\n        num[i] = buffer & 255;\n        i--;\n        buffer >>= 8;\n        bufferSize -= 8;\n      }\n    },\n    readHexSigned: function readHexSigned(num, size) {\n      this.readHexNumber(num, size);\n      var sign = num[size] & 1 ? 255 : 0;\n      var c = 0;\n      for (var i = 0; i <= size; i++) {\n        c = (c & 1) << 8 | num[i];\n        num[i] = c >> 1 ^ sign;\n      }\n    },\n    readString: function readString() {\n      var len = this.readNumber();\n      var s = '';\n      for (var i = 0; i < len; i++) {\n        s += String.fromCharCode(this.readNumber());\n      }\n      return s;\n    }\n  };\n  function processBinaryCMap(data, cMap, extend) {\n    return new Promise(function (resolve, reject) {\n      var stream = new BinaryCMapStream(data);\n      var header = stream.readByte();\n      cMap.vertical = !!(header & 1);\n      var useCMap = null;\n      var start = new Uint8Array(MAX_NUM_SIZE);\n      var end = new Uint8Array(MAX_NUM_SIZE);\n      var char = new Uint8Array(MAX_NUM_SIZE);\n      var charCode = new Uint8Array(MAX_NUM_SIZE);\n      var tmp = new Uint8Array(MAX_NUM_SIZE);\n      var code;\n      var b;\n      while ((b = stream.readByte()) >= 0) {\n        var type = b >> 5;\n        if (type === 7) {\n          switch (b & 0x1F) {\n            case 0:\n              stream.readString();\n              break;\n            case 1:\n              useCMap = stream.readString();\n              break;\n          }\n          continue;\n        }\n        var sequence = !!(b & 0x10);\n        var dataSize = b & 15;\n        if (dataSize + 1 > MAX_NUM_SIZE) {\n          throw new Error('processBinaryCMap: Invalid dataSize.');\n        }\n        var ucs2DataSize = 1;\n        var subitemsCount = stream.readNumber();\n        var i;\n        switch (type) {\n          case 0:\n            stream.readHex(start, dataSize);\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(end, dataSize);\n              stream.readHexNumber(start, dataSize);\n              addHex(start, end, dataSize);\n              stream.readHexNumber(end, dataSize);\n              addHex(end, start, dataSize);\n              cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));\n            }\n            break;\n          case 1:\n            stream.readHex(start, dataSize);\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            code = stream.readNumber();\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(end, dataSize);\n              stream.readHexNumber(start, dataSize);\n              addHex(start, end, dataSize);\n              stream.readHexNumber(end, dataSize);\n              addHex(end, start, dataSize);\n              code = stream.readNumber();\n            }\n            break;\n          case 2:\n            stream.readHex(char, dataSize);\n            code = stream.readNumber();\n            cMap.mapOne(hexToInt(char, dataSize), code);\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(char, dataSize);\n              if (!sequence) {\n                stream.readHexNumber(tmp, dataSize);\n                addHex(char, tmp, dataSize);\n              }\n              code = stream.readSigned() + (code + 1);\n              cMap.mapOne(hexToInt(char, dataSize), code);\n            }\n            break;\n          case 3:\n            stream.readHex(start, dataSize);\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            code = stream.readNumber();\n            cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(end, dataSize);\n              if (!sequence) {\n                stream.readHexNumber(start, dataSize);\n                addHex(start, end, dataSize);\n              } else {\n                start.set(end);\n              }\n              stream.readHexNumber(end, dataSize);\n              addHex(end, start, dataSize);\n              code = stream.readNumber();\n              cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);\n            }\n            break;\n          case 4:\n            stream.readHex(char, ucs2DataSize);\n            stream.readHex(charCode, dataSize);\n            cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(char, ucs2DataSize);\n              if (!sequence) {\n                stream.readHexNumber(tmp, ucs2DataSize);\n                addHex(char, tmp, ucs2DataSize);\n              }\n              incHex(charCode, dataSize);\n              stream.readHexSigned(tmp, dataSize);\n              addHex(charCode, tmp, dataSize);\n              cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));\n            }\n            break;\n          case 5:\n            stream.readHex(start, ucs2DataSize);\n            stream.readHexNumber(end, ucs2DataSize);\n            addHex(end, start, ucs2DataSize);\n            stream.readHex(charCode, dataSize);\n            cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize));\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(end, ucs2DataSize);\n              if (!sequence) {\n                stream.readHexNumber(start, ucs2DataSize);\n                addHex(start, end, ucs2DataSize);\n              } else {\n                start.set(end);\n              }\n              stream.readHexNumber(end, ucs2DataSize);\n              addHex(end, start, ucs2DataSize);\n              stream.readHex(charCode, dataSize);\n              cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize));\n            }\n            break;\n          default:\n            reject(new Error('processBinaryCMap: Unknown type: ' + type));\n            return;\n        }\n      }\n      if (useCMap) {\n        resolve(extend(useCMap));\n        return;\n      }\n      resolve(cMap);\n    });\n  }\n  function BinaryCMapReader() {}\n  BinaryCMapReader.prototype = { process: processBinaryCMap };\n  return BinaryCMapReader;\n}();\nvar CMapFactory = function CMapFactoryClosure() {\n  function strToInt(str) {\n    var a = 0;\n    for (var i = 0; i < str.length; i++) {\n      a = a << 8 | str.charCodeAt(i);\n    }\n    return a >>> 0;\n  }\n  function expectString(obj) {\n    if (!(0, _util.isString)(obj)) {\n      throw new _util.FormatError('Malformed CMap: expected string.');\n    }\n  }\n  function expectInt(obj) {\n    if (!(0, _util.isInt)(obj)) {\n      throw new _util.FormatError('Malformed CMap: expected int.');\n    }\n  }\n  function parseBfChar(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if ((0, _primitives.isEOF)(obj)) {\n        break;\n      }\n      if ((0, _primitives.isCmd)(obj, 'endbfchar')) {\n        return;\n      }\n      expectString(obj);\n      var src = strToInt(obj);\n      obj = lexer.getObj();\n      expectString(obj);\n      var dst = obj;\n      cMap.mapOne(src, dst);\n    }\n  }\n  function parseBfRange(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if ((0, _primitives.isEOF)(obj)) {\n        break;\n      }\n      if ((0, _primitives.isCmd)(obj, 'endbfrange')) {\n        return;\n      }\n      expectString(obj);\n      var low = strToInt(obj);\n      obj = lexer.getObj();\n      expectString(obj);\n      var high = strToInt(obj);\n      obj = lexer.getObj();\n      if ((0, _util.isInt)(obj) || (0, _util.isString)(obj)) {\n        var dstLow = (0, _util.isInt)(obj) ? String.fromCharCode(obj) : obj;\n        cMap.mapBfRange(low, high, dstLow);\n      } else if ((0, _primitives.isCmd)(obj, '[')) {\n        obj = lexer.getObj();\n        var array = [];\n        while (!(0, _primitives.isCmd)(obj, ']') && !(0, _primitives.isEOF)(obj)) {\n          array.push(obj);\n          obj = lexer.getObj();\n        }\n        cMap.mapBfRangeToArray(low, high, array);\n      } else {\n        break;\n      }\n    }\n    throw new _util.FormatError('Invalid bf range.');\n  }\n  function parseCidChar(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if ((0, _primitives.isEOF)(obj)) {\n        break;\n      }\n      if ((0, _primitives.isCmd)(obj, 'endcidchar')) {\n        return;\n      }\n      expectString(obj);\n      var src = strToInt(obj);\n      obj = lexer.getObj();\n      expectInt(obj);\n      var dst = obj;\n      cMap.mapOne(src, dst);\n    }\n  }\n  function parseCidRange(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if ((0, _primitives.isEOF)(obj)) {\n        break;\n      }\n      if ((0, _primitives.isCmd)(obj, 'endcidrange')) {\n        return;\n      }\n      expectString(obj);\n      var low = strToInt(obj);\n      obj = lexer.getObj();\n      expectString(obj);\n      var high = strToInt(obj);\n      obj = lexer.getObj();\n      expectInt(obj);\n      var dstLow = obj;\n      cMap.mapCidRange(low, high, dstLow);\n    }\n  }\n  function parseCodespaceRange(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if ((0, _primitives.isEOF)(obj)) {\n        break;\n      }\n      if ((0, _primitives.isCmd)(obj, 'endcodespacerange')) {\n        return;\n      }\n      if (!(0, _util.isString)(obj)) {\n        break;\n      }\n      var low = strToInt(obj);\n      obj = lexer.getObj();\n      if (!(0, _util.isString)(obj)) {\n        break;\n      }\n      var high = strToInt(obj);\n      cMap.addCodespaceRange(obj.length, low, high);\n    }\n    throw new _util.FormatError('Invalid codespace range.');\n  }\n  function parseWMode(cMap, lexer) {\n    var obj = lexer.getObj();\n    if ((0, _util.isInt)(obj)) {\n      cMap.vertical = !!obj;\n    }\n  }\n  function parseCMapName(cMap, lexer) {\n    var obj = lexer.getObj();\n    if ((0, _primitives.isName)(obj) && (0, _util.isString)(obj.name)) {\n      cMap.name = obj.name;\n    }\n  }\n  function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) {\n    var previous;\n    var embededUseCMap;\n    objLoop: while (true) {\n      try {\n        var obj = lexer.getObj();\n        if ((0, _primitives.isEOF)(obj)) {\n          break;\n        } else if ((0, _primitives.isName)(obj)) {\n          if (obj.name === 'WMode') {\n            parseWMode(cMap, lexer);\n          } else if (obj.name === 'CMapName') {\n            parseCMapName(cMap, lexer);\n          }\n          previous = obj;\n        } else if ((0, _primitives.isCmd)(obj)) {\n          switch (obj.cmd) {\n            case 'endcmap':\n              break objLoop;\n            case 'usecmap':\n              if ((0, _primitives.isName)(previous)) {\n                embededUseCMap = previous.name;\n              }\n              break;\n            case 'begincodespacerange':\n              parseCodespaceRange(cMap, lexer);\n              break;\n            case 'beginbfchar':\n              parseBfChar(cMap, lexer);\n              break;\n            case 'begincidchar':\n              parseCidChar(cMap, lexer);\n              break;\n            case 'beginbfrange':\n              parseBfRange(cMap, lexer);\n              break;\n            case 'begincidrange':\n              parseCidRange(cMap, lexer);\n              break;\n          }\n        }\n      } catch (ex) {\n        if (ex instanceof _util.MissingDataException) {\n          throw ex;\n        }\n        (0, _util.warn)('Invalid cMap data: ' + ex);\n        continue;\n      }\n    }\n    if (!useCMap && embededUseCMap) {\n      useCMap = embededUseCMap;\n    }\n    if (useCMap) {\n      return extendCMap(cMap, fetchBuiltInCMap, useCMap);\n    }\n    return Promise.resolve(cMap);\n  }\n  function extendCMap(cMap, fetchBuiltInCMap, useCMap) {\n    return createBuiltInCMap(useCMap, fetchBuiltInCMap).then(function (newCMap) {\n      cMap.useCMap = newCMap;\n      if (cMap.numCodespaceRanges === 0) {\n        var useCodespaceRanges = cMap.useCMap.codespaceRanges;\n        for (var i = 0; i < useCodespaceRanges.length; i++) {\n          cMap.codespaceRanges[i] = useCodespaceRanges[i].slice();\n        }\n        cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges;\n      }\n      cMap.useCMap.forEach(function (key, value) {\n        if (!cMap.contains(key)) {\n          cMap.mapOne(key, cMap.useCMap.lookup(key));\n        }\n      });\n      return cMap;\n    });\n  }\n  function createBuiltInCMap(name, fetchBuiltInCMap) {\n    if (name === 'Identity-H') {\n      return Promise.resolve(new IdentityCMap(false, 2));\n    } else if (name === 'Identity-V') {\n      return Promise.resolve(new IdentityCMap(true, 2));\n    }\n    if (BUILT_IN_CMAPS.indexOf(name) === -1) {\n      return Promise.reject(new Error('Unknown CMap name: ' + name));\n    }\n    if (!fetchBuiltInCMap) {\n      return Promise.reject(new Error('Built-in CMap parameters are not provided.'));\n    }\n    return fetchBuiltInCMap(name).then(function (data) {\n      var cMapData = data.cMapData,\n          compressionType = data.compressionType;\n      var cMap = new CMap(true);\n      if (compressionType === _util.CMapCompressionType.BINARY) {\n        return new BinaryCMapReader().process(cMapData, cMap, function (useCMap) {\n          return extendCMap(cMap, fetchBuiltInCMap, useCMap);\n        });\n      }\n      if (compressionType === _util.CMapCompressionType.NONE) {\n        var lexer = new _parser.Lexer(new _stream.Stream(cMapData));\n        return parseCMap(cMap, lexer, fetchBuiltInCMap, null);\n      }\n      return Promise.reject(new Error('TODO: Only BINARY/NONE CMap compression is currently supported.'));\n    });\n  }\n  return {\n    create: function create(params) {\n      var encoding = params.encoding;\n      var fetchBuiltInCMap = params.fetchBuiltInCMap;\n      var useCMap = params.useCMap;\n      if ((0, _primitives.isName)(encoding)) {\n        return createBuiltInCMap(encoding.name, fetchBuiltInCMap);\n      } else if ((0, _primitives.isStream)(encoding)) {\n        var cMap = new CMap();\n        var lexer = new _parser.Lexer(encoding);\n        return parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap).then(function (parsedCMap) {\n          if (parsedCMap.isIdentityCMap) {\n            return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap);\n          }\n          return parsedCMap;\n        });\n      }\n      return Promise.reject(new Error('Encoding required.'));\n    }\n  };\n}();\nexports.CMap = CMap;\nexports.IdentityCMap = IdentityCMap;\nexports.CMapFactory = CMapFactory;\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PDFDocument = exports.Page = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _obj = __w_pdfjs_require__(15);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar _evaluator = __w_pdfjs_require__(13);\n\nvar _annotation = __w_pdfjs_require__(19);\n\nvar _crypto = __w_pdfjs_require__(12);\n\nvar _parser = __w_pdfjs_require__(5);\n\nvar Page = function PageClosure() {\n  var DEFAULT_USER_UNIT = 1.0;\n  var LETTER_SIZE_MEDIABOX = [0, 0, 612, 792];\n  function isAnnotationRenderable(annotation, intent) {\n    return intent === 'display' && annotation.viewable || intent === 'print' && annotation.printable;\n  }\n  function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache, builtInCMapCache) {\n    this.pdfManager = pdfManager;\n    this.pageIndex = pageIndex;\n    this.pageDict = pageDict;\n    this.xref = xref;\n    this.ref = ref;\n    this.fontCache = fontCache;\n    this.builtInCMapCache = builtInCMapCache;\n    this.evaluatorOptions = pdfManager.evaluatorOptions;\n    this.resourcesPromise = null;\n    var uniquePrefix = 'p' + this.pageIndex + '_';\n    var idCounters = { obj: 0 };\n    this.idFactory = {\n      createObjId: function createObjId() {\n        return uniquePrefix + ++idCounters.obj;\n      }\n    };\n  }\n  Page.prototype = {\n    getPageProp: function Page_getPageProp(key) {\n      return this.pageDict.get(key);\n    },\n    getInheritedPageProp: function Page_getInheritedPageProp(key, getArray) {\n      var dict = this.pageDict,\n          valueArray = null,\n          loopCount = 0;\n      var MAX_LOOP_COUNT = 100;\n      getArray = getArray || false;\n      while (dict) {\n        var value = getArray ? dict.getArray(key) : dict.get(key);\n        if (value !== undefined) {\n          if (!valueArray) {\n            valueArray = [];\n          }\n          valueArray.push(value);\n        }\n        if (++loopCount > MAX_LOOP_COUNT) {\n          (0, _util.warn)('getInheritedPageProp: maximum loop count exceeded for ' + key);\n          return valueArray ? valueArray[0] : undefined;\n        }\n        dict = dict.get('Parent');\n      }\n      if (!valueArray) {\n        return undefined;\n      }\n      if (valueArray.length === 1 || !(0, _primitives.isDict)(valueArray[0])) {\n        return valueArray[0];\n      }\n      return _primitives.Dict.merge(this.xref, valueArray);\n    },\n    get content() {\n      return this.getPageProp('Contents');\n    },\n    get resources() {\n      return (0, _util.shadow)(this, 'resources', this.getInheritedPageProp('Resources') || _primitives.Dict.empty);\n    },\n    get mediaBox() {\n      var mediaBox = this.getInheritedPageProp('MediaBox', true);\n      if (!(0, _util.isArray)(mediaBox) || mediaBox.length !== 4) {\n        return (0, _util.shadow)(this, 'mediaBox', LETTER_SIZE_MEDIABOX);\n      }\n      return (0, _util.shadow)(this, 'mediaBox', mediaBox);\n    },\n    get cropBox() {\n      var cropBox = this.getInheritedPageProp('CropBox', true);\n      if (!(0, _util.isArray)(cropBox) || cropBox.length !== 4) {\n        return (0, _util.shadow)(this, 'cropBox', this.mediaBox);\n      }\n      return (0, _util.shadow)(this, 'cropBox', cropBox);\n    },\n    get userUnit() {\n      var obj = this.getPageProp('UserUnit');\n      if (!(0, _util.isNum)(obj) || obj <= 0) {\n        obj = DEFAULT_USER_UNIT;\n      }\n      return (0, _util.shadow)(this, 'userUnit', obj);\n    },\n    get view() {\n      var mediaBox = this.mediaBox,\n          cropBox = this.cropBox;\n      if (mediaBox === cropBox) {\n        return (0, _util.shadow)(this, 'view', mediaBox);\n      }\n      var intersection = _util.Util.intersect(cropBox, mediaBox);\n      return (0, _util.shadow)(this, 'view', intersection || mediaBox);\n    },\n    get rotate() {\n      var rotate = this.getInheritedPageProp('Rotate') || 0;\n      if (rotate % 90 !== 0) {\n        rotate = 0;\n      } else if (rotate >= 360) {\n        rotate = rotate % 360;\n      } else if (rotate < 0) {\n        rotate = (rotate % 360 + 360) % 360;\n      }\n      return (0, _util.shadow)(this, 'rotate', rotate);\n    },\n    getContentStream: function Page_getContentStream() {\n      var content = this.content;\n      var stream;\n      if ((0, _util.isArray)(content)) {\n        var xref = this.xref;\n        var i,\n            n = content.length;\n        var streams = [];\n        for (i = 0; i < n; ++i) {\n          streams.push(xref.fetchIfRef(content[i]));\n        }\n        stream = new _stream.StreamsSequenceStream(streams);\n      } else if ((0, _primitives.isStream)(content)) {\n        stream = content;\n      } else {\n        stream = new _stream.NullStream();\n      }\n      return stream;\n    },\n    loadResources: function Page_loadResources(keys) {\n      var _this = this;\n\n      if (!this.resourcesPromise) {\n        this.resourcesPromise = this.pdfManager.ensure(this, 'resources');\n      }\n      return this.resourcesPromise.then(function () {\n        var objectLoader = new _obj.ObjectLoader(_this.resources, keys, _this.xref);\n        return objectLoader.load();\n      });\n    },\n    getOperatorList: function getOperatorList(_ref) {\n      var _this2 = this;\n\n      var handler = _ref.handler,\n          task = _ref.task,\n          intent = _ref.intent,\n          renderInteractiveForms = _ref.renderInteractiveForms;\n\n      var contentStreamPromise = this.pdfManager.ensure(this, 'getContentStream');\n      var resourcesPromise = this.loadResources(['ExtGState', 'ColorSpace', 'Pattern', 'Shading', 'XObject', 'Font']);\n      var partialEvaluator = new _evaluator.PartialEvaluator({\n        pdfManager: this.pdfManager,\n        xref: this.xref,\n        handler: handler,\n        pageIndex: this.pageIndex,\n        idFactory: this.idFactory,\n        fontCache: this.fontCache,\n        builtInCMapCache: this.builtInCMapCache,\n        options: this.evaluatorOptions\n      });\n      var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);\n      var pageListPromise = dataPromises.then(function (_ref2) {\n        var _ref3 = _slicedToArray(_ref2, 1),\n            contentStream = _ref3[0];\n\n        var opList = new _evaluator.OperatorList(intent, handler, _this2.pageIndex);\n        handler.send('StartRenderPage', {\n          transparency: partialEvaluator.hasBlendModes(_this2.resources),\n          pageIndex: _this2.pageIndex,\n          intent: intent\n        });\n        return partialEvaluator.getOperatorList({\n          stream: contentStream,\n          task: task,\n          resources: _this2.resources,\n          operatorList: opList\n        }).then(function () {\n          return opList;\n        });\n      });\n      var annotationsPromise = this.pdfManager.ensure(this, 'annotations');\n      return Promise.all([pageListPromise, annotationsPromise]).then(function (_ref4) {\n        var _ref5 = _slicedToArray(_ref4, 2),\n            pageOpList = _ref5[0],\n            annotations = _ref5[1];\n\n        if (annotations.length === 0) {\n          pageOpList.flush(true);\n          return pageOpList;\n        }\n        var i,\n            ii,\n            opListPromises = [];\n        for (i = 0, ii = annotations.length; i < ii; i++) {\n          if (isAnnotationRenderable(annotations[i], intent)) {\n            opListPromises.push(annotations[i].getOperatorList(partialEvaluator, task, renderInteractiveForms));\n          }\n        }\n        return Promise.all(opListPromises).then(function (opLists) {\n          pageOpList.addOp(_util.OPS.beginAnnotations, []);\n          for (i = 0, ii = opLists.length; i < ii; i++) {\n            pageOpList.addOpList(opLists[i]);\n          }\n          pageOpList.addOp(_util.OPS.endAnnotations, []);\n          pageOpList.flush(true);\n          return pageOpList;\n        });\n      });\n    },\n    extractTextContent: function extractTextContent(_ref6) {\n      var _this3 = this;\n\n      var handler = _ref6.handler,\n          task = _ref6.task,\n          normalizeWhitespace = _ref6.normalizeWhitespace,\n          sink = _ref6.sink,\n          combineTextItems = _ref6.combineTextItems;\n\n      var contentStreamPromise = this.pdfManager.ensure(this, 'getContentStream');\n      var resourcesPromise = this.loadResources(['ExtGState', 'XObject', 'Font']);\n      var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);\n      return dataPromises.then(function (_ref7) {\n        var _ref8 = _slicedToArray(_ref7, 1),\n            contentStream = _ref8[0];\n\n        var partialEvaluator = new _evaluator.PartialEvaluator({\n          pdfManager: _this3.pdfManager,\n          xref: _this3.xref,\n          handler: handler,\n          pageIndex: _this3.pageIndex,\n          idFactory: _this3.idFactory,\n          fontCache: _this3.fontCache,\n          builtInCMapCache: _this3.builtInCMapCache,\n          options: _this3.evaluatorOptions\n        });\n        return partialEvaluator.getTextContent({\n          stream: contentStream,\n          task: task,\n          resources: _this3.resources,\n          normalizeWhitespace: normalizeWhitespace,\n          combineTextItems: combineTextItems,\n          sink: sink\n        });\n      });\n    },\n\n    getAnnotationsData: function Page_getAnnotationsData(intent) {\n      var annotations = this.annotations;\n      var annotationsData = [];\n      for (var i = 0, n = annotations.length; i < n; ++i) {\n        if (!intent || isAnnotationRenderable(annotations[i], intent)) {\n          annotationsData.push(annotations[i].data);\n        }\n      }\n      return annotationsData;\n    },\n    get annotations() {\n      var annotations = [];\n      var annotationRefs = this.getInheritedPageProp('Annots') || [];\n      var annotationFactory = new _annotation.AnnotationFactory();\n      for (var i = 0, n = annotationRefs.length; i < n; ++i) {\n        var annotationRef = annotationRefs[i];\n        var annotation = annotationFactory.create(this.xref, annotationRef, this.pdfManager, this.idFactory);\n        if (annotation) {\n          annotations.push(annotation);\n        }\n      }\n      return (0, _util.shadow)(this, 'annotations', annotations);\n    }\n  };\n  return Page;\n}();\nvar PDFDocument = function PDFDocumentClosure() {\n  var FINGERPRINT_FIRST_BYTES = 1024;\n  var EMPTY_FINGERPRINT = '\\x00\\x00\\x00\\x00\\x00\\x00\\x00' + '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00';\n  function PDFDocument(pdfManager, arg) {\n    var stream;\n    if ((0, _primitives.isStream)(arg)) {\n      stream = arg;\n    } else if ((0, _util.isArrayBuffer)(arg)) {\n      stream = new _stream.Stream(arg);\n    } else {\n      throw new Error('PDFDocument: Unknown argument type');\n    }\n    if (stream.length <= 0) {\n      throw new Error('PDFDocument: stream must have data');\n    }\n    this.pdfManager = pdfManager;\n    this.stream = stream;\n    this.xref = new _obj.XRef(stream, pdfManager);\n  }\n  function find(stream, needle, limit, backwards) {\n    var pos = stream.pos;\n    var end = stream.end;\n    var strBuf = [];\n    if (pos + limit > end) {\n      limit = end - pos;\n    }\n    for (var n = 0; n < limit; ++n) {\n      strBuf.push(String.fromCharCode(stream.getByte()));\n    }\n    var str = strBuf.join('');\n    stream.pos = pos;\n    var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);\n    if (index === -1) {\n      return false;\n    }\n    stream.pos += index;\n    return true;\n  }\n  var DocumentInfoValidators = {\n    get entries() {\n      return (0, _util.shadow)(this, 'entries', {\n        Title: _util.isString,\n        Author: _util.isString,\n        Subject: _util.isString,\n        Keywords: _util.isString,\n        Creator: _util.isString,\n        Producer: _util.isString,\n        CreationDate: _util.isString,\n        ModDate: _util.isString,\n        Trapped: _primitives.isName\n      });\n    }\n  };\n  PDFDocument.prototype = {\n    parse: function PDFDocument_parse(recoveryMode) {\n      this.setup(recoveryMode);\n      var version = this.catalog.catDict.get('Version');\n      if ((0, _primitives.isName)(version)) {\n        this.pdfFormatVersion = version.name;\n      }\n      try {\n        this.acroForm = this.catalog.catDict.get('AcroForm');\n        if (this.acroForm) {\n          this.xfa = this.acroForm.get('XFA');\n          var fields = this.acroForm.get('Fields');\n          if ((!fields || !(0, _util.isArray)(fields) || fields.length === 0) && !this.xfa) {\n            this.acroForm = null;\n          }\n        }\n      } catch (ex) {\n        if (ex instanceof _util.MissingDataException) {\n          throw ex;\n        }\n        (0, _util.info)('Something wrong with AcroForm entry');\n        this.acroForm = null;\n      }\n    },\n    get linearization() {\n      var linearization = null;\n      if (this.stream.length) {\n        try {\n          linearization = _parser.Linearization.create(this.stream);\n        } catch (err) {\n          if (err instanceof _util.MissingDataException) {\n            throw err;\n          }\n          (0, _util.info)(err);\n        }\n      }\n      return (0, _util.shadow)(this, 'linearization', linearization);\n    },\n    get startXRef() {\n      var stream = this.stream;\n      var startXRef = 0;\n      var linearization = this.linearization;\n      if (linearization) {\n        stream.reset();\n        if (find(stream, 'endobj', 1024)) {\n          startXRef = stream.pos + 6;\n        }\n      } else {\n        var step = 1024;\n        var found = false,\n            pos = stream.end;\n        while (!found && pos > 0) {\n          pos -= step - 'startxref'.length;\n          if (pos < 0) {\n            pos = 0;\n          }\n          stream.pos = pos;\n          found = find(stream, 'startxref', step, true);\n        }\n        if (found) {\n          stream.skip(9);\n          var ch;\n          do {\n            ch = stream.getByte();\n          } while ((0, _util.isSpace)(ch));\n          var str = '';\n          while (ch >= 0x20 && ch <= 0x39) {\n            str += String.fromCharCode(ch);\n            ch = stream.getByte();\n          }\n          startXRef = parseInt(str, 10);\n          if (isNaN(startXRef)) {\n            startXRef = 0;\n          }\n        }\n      }\n      return (0, _util.shadow)(this, 'startXRef', startXRef);\n    },\n    get mainXRefEntriesOffset() {\n      var mainXRefEntriesOffset = 0;\n      var linearization = this.linearization;\n      if (linearization) {\n        mainXRefEntriesOffset = linearization.mainXRefEntriesOffset;\n      }\n      return (0, _util.shadow)(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset);\n    },\n    checkHeader: function PDFDocument_checkHeader() {\n      var stream = this.stream;\n      stream.reset();\n      if (find(stream, '%PDF-', 1024)) {\n        stream.moveStart();\n        var MAX_VERSION_LENGTH = 12;\n        var version = '',\n            ch;\n        while ((ch = stream.getByte()) > 0x20) {\n          if (version.length >= MAX_VERSION_LENGTH) {\n            break;\n          }\n          version += String.fromCharCode(ch);\n        }\n        if (!this.pdfFormatVersion) {\n          this.pdfFormatVersion = version.substring(5);\n        }\n        return;\n      }\n    },\n    parseStartXRef: function PDFDocument_parseStartXRef() {\n      var startXRef = this.startXRef;\n      this.xref.setStartXRef(startXRef);\n    },\n    setup: function PDFDocument_setup(recoveryMode) {\n      var _this4 = this;\n\n      this.xref.parse(recoveryMode);\n      var pageFactory = {\n        createPage: function createPage(pageIndex, dict, ref, fontCache, builtInCMapCache) {\n          return new Page(_this4.pdfManager, _this4.xref, pageIndex, dict, ref, fontCache, builtInCMapCache);\n        }\n      };\n      this.catalog = new _obj.Catalog(this.pdfManager, this.xref, pageFactory);\n    },\n    get numPages() {\n      var linearization = this.linearization;\n      var num = linearization ? linearization.numPages : this.catalog.numPages;\n      return (0, _util.shadow)(this, 'numPages', num);\n    },\n    get documentInfo() {\n      var docInfo = {\n        PDFFormatVersion: this.pdfFormatVersion,\n        IsAcroFormPresent: !!this.acroForm,\n        IsXFAPresent: !!this.xfa\n      };\n      var infoDict;\n      try {\n        infoDict = this.xref.trailer.get('Info');\n      } catch (err) {\n        if (err instanceof _util.MissingDataException) {\n          throw err;\n        }\n        (0, _util.info)('The document information dictionary is invalid.');\n      }\n      if (infoDict) {\n        var validEntries = DocumentInfoValidators.entries;\n        for (var key in validEntries) {\n          if (infoDict.has(key)) {\n            var value = infoDict.get(key);\n            if (validEntries[key](value)) {\n              docInfo[key] = typeof value !== 'string' ? value : (0, _util.stringToPDFString)(value);\n            } else {\n              (0, _util.info)('Bad value in document info for \"' + key + '\"');\n            }\n          }\n        }\n      }\n      return (0, _util.shadow)(this, 'documentInfo', docInfo);\n    },\n    get fingerprint() {\n      var xref = this.xref,\n          hash,\n          fileID = '';\n      var idArray = xref.trailer.get('ID');\n      if (idArray && (0, _util.isArray)(idArray) && idArray[0] && (0, _util.isString)(idArray[0]) && idArray[0] !== EMPTY_FINGERPRINT) {\n        hash = (0, _util.stringToBytes)(idArray[0]);\n      } else {\n        if (this.stream.ensureRange) {\n          this.stream.ensureRange(0, Math.min(FINGERPRINT_FIRST_BYTES, this.stream.end));\n        }\n        hash = (0, _crypto.calculateMD5)(this.stream.bytes.subarray(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES);\n      }\n      for (var i = 0, n = hash.length; i < n; i++) {\n        var hex = hash[i].toString(16);\n        fileID += hex.length === 1 ? '0' + hex : hex;\n      }\n      return (0, _util.shadow)(this, 'fingerprint', fileID);\n    },\n    getPage: function PDFDocument_getPage(pageIndex) {\n      return this.catalog.getPage(pageIndex);\n    },\n    cleanup: function PDFDocument_cleanup() {\n      return this.catalog.cleanup();\n    }\n  };\n  return PDFDocument;\n}();\nexports.Page = Page;\nexports.PDFDocument = PDFDocument;\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.FontRendererFactory = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _cff_parser = __w_pdfjs_require__(10);\n\nvar _glyphlist = __w_pdfjs_require__(6);\n\nvar _encodings = __w_pdfjs_require__(4);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar FontRendererFactory = function FontRendererFactoryClosure() {\n  function getLong(data, offset) {\n    return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];\n  }\n  function getUshort(data, offset) {\n    return data[offset] << 8 | data[offset + 1];\n  }\n  function parseCmap(data, start, end) {\n    var offset = getUshort(data, start + 2) === 1 ? getLong(data, start + 8) : getLong(data, start + 16);\n    var format = getUshort(data, start + offset);\n    var ranges, p, i;\n    if (format === 4) {\n      getUshort(data, start + offset + 2);\n      var segCount = getUshort(data, start + offset + 6) >> 1;\n      p = start + offset + 14;\n      ranges = [];\n      for (i = 0; i < segCount; i++, p += 2) {\n        ranges[i] = { end: getUshort(data, p) };\n      }\n      p += 2;\n      for (i = 0; i < segCount; i++, p += 2) {\n        ranges[i].start = getUshort(data, p);\n      }\n      for (i = 0; i < segCount; i++, p += 2) {\n        ranges[i].idDelta = getUshort(data, p);\n      }\n      for (i = 0; i < segCount; i++, p += 2) {\n        var idOffset = getUshort(data, p);\n        if (idOffset === 0) {\n          continue;\n        }\n        ranges[i].ids = [];\n        for (var j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) {\n          ranges[i].ids[j] = getUshort(data, p + idOffset);\n          idOffset += 2;\n        }\n      }\n      return ranges;\n    } else if (format === 12) {\n      getLong(data, start + offset + 4);\n      var groups = getLong(data, start + offset + 12);\n      p = start + offset + 16;\n      ranges = [];\n      for (i = 0; i < groups; i++) {\n        ranges.push({\n          start: getLong(data, p),\n          end: getLong(data, p + 4),\n          idDelta: getLong(data, p + 8) - getLong(data, p)\n        });\n        p += 12;\n      }\n      return ranges;\n    }\n    throw new _util.FormatError('unsupported cmap: ' + format);\n  }\n  function parseCff(data, start, end, seacAnalysisEnabled) {\n    var properties = {};\n    var parser = new _cff_parser.CFFParser(new _stream.Stream(data, start, end - start), properties, seacAnalysisEnabled);\n    var cff = parser.parse();\n    return {\n      glyphs: cff.charStrings.objects,\n      subrs: cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex && cff.topDict.privateDict.subrsIndex.objects,\n      gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects\n    };\n  }\n  function parseGlyfTable(glyf, loca, isGlyphLocationsLong) {\n    var itemSize, itemDecode;\n    if (isGlyphLocationsLong) {\n      itemSize = 4;\n      itemDecode = function fontItemDecodeLong(data, offset) {\n        return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];\n      };\n    } else {\n      itemSize = 2;\n      itemDecode = function fontItemDecode(data, offset) {\n        return data[offset] << 9 | data[offset + 1] << 1;\n      };\n    }\n    var glyphs = [];\n    var startOffset = itemDecode(loca, 0);\n    for (var j = itemSize; j < loca.length; j += itemSize) {\n      var endOffset = itemDecode(loca, j);\n      glyphs.push(glyf.subarray(startOffset, endOffset));\n      startOffset = endOffset;\n    }\n    return glyphs;\n  }\n  function lookupCmap(ranges, unicode) {\n    var code = unicode.charCodeAt(0),\n        gid = 0;\n    var l = 0,\n        r = ranges.length - 1;\n    while (l < r) {\n      var c = l + r + 1 >> 1;\n      if (code < ranges[c].start) {\n        r = c - 1;\n      } else {\n        l = c;\n      }\n    }\n    if (ranges[l].start <= code && code <= ranges[l].end) {\n      gid = ranges[l].idDelta + (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code) & 0xFFFF;\n    }\n    return {\n      charCode: code,\n      glyphId: gid\n    };\n  }\n  function compileGlyf(code, cmds, font) {\n    function moveTo(x, y) {\n      cmds.push({\n        cmd: 'moveTo',\n        args: [x, y]\n      });\n    }\n    function lineTo(x, y) {\n      cmds.push({\n        cmd: 'lineTo',\n        args: [x, y]\n      });\n    }\n    function quadraticCurveTo(xa, ya, x, y) {\n      cmds.push({\n        cmd: 'quadraticCurveTo',\n        args: [xa, ya, x, y]\n      });\n    }\n    var i = 0;\n    var numberOfContours = (code[i] << 24 | code[i + 1] << 16) >> 16;\n    var flags;\n    var x = 0,\n        y = 0;\n    i += 10;\n    if (numberOfContours < 0) {\n      do {\n        flags = code[i] << 8 | code[i + 1];\n        var glyphIndex = code[i + 2] << 8 | code[i + 3];\n        i += 4;\n        var arg1, arg2;\n        if (flags & 0x01) {\n          arg1 = (code[i] << 24 | code[i + 1] << 16) >> 16;\n          arg2 = (code[i + 2] << 24 | code[i + 3] << 16) >> 16;\n          i += 4;\n        } else {\n          arg1 = code[i++];\n          arg2 = code[i++];\n        }\n        if (flags & 0x02) {\n          x = arg1;\n          y = arg2;\n        } else {\n          x = 0;\n          y = 0;\n        }\n        var scaleX = 1,\n            scaleY = 1,\n            scale01 = 0,\n            scale10 = 0;\n        if (flags & 0x08) {\n          scaleX = scaleY = (code[i] << 24 | code[i + 1] << 16) / 1073741824;\n          i += 2;\n        } else if (flags & 0x40) {\n          scaleX = (code[i] << 24 | code[i + 1] << 16) / 1073741824;\n          scaleY = (code[i + 2] << 24 | code[i + 3] << 16) / 1073741824;\n          i += 4;\n        } else if (flags & 0x80) {\n          scaleX = (code[i] << 24 | code[i + 1] << 16) / 1073741824;\n          scale01 = (code[i + 2] << 24 | code[i + 3] << 16) / 1073741824;\n          scale10 = (code[i + 4] << 24 | code[i + 5] << 16) / 1073741824;\n          scaleY = (code[i + 6] << 24 | code[i + 7] << 16) / 1073741824;\n          i += 8;\n        }\n        var subglyph = font.glyphs[glyphIndex];\n        if (subglyph) {\n          cmds.push({ cmd: 'save' });\n          cmds.push({\n            cmd: 'transform',\n            args: [scaleX, scale01, scale10, scaleY, x, y]\n          });\n          compileGlyf(subglyph, cmds, font);\n          cmds.push({ cmd: 'restore' });\n        }\n      } while (flags & 0x20);\n    } else {\n      var endPtsOfContours = [];\n      var j, jj;\n      for (j = 0; j < numberOfContours; j++) {\n        endPtsOfContours.push(code[i] << 8 | code[i + 1]);\n        i += 2;\n      }\n      var instructionLength = code[i] << 8 | code[i + 1];\n      i += 2 + instructionLength;\n      var numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1;\n      var points = [];\n      while (points.length < numberOfPoints) {\n        flags = code[i++];\n        var repeat = 1;\n        if (flags & 0x08) {\n          repeat += code[i++];\n        }\n        while (repeat-- > 0) {\n          points.push({ flags: flags });\n        }\n      }\n      for (j = 0; j < numberOfPoints; j++) {\n        switch (points[j].flags & 0x12) {\n          case 0x00:\n            x += (code[i] << 24 | code[i + 1] << 16) >> 16;\n            i += 2;\n            break;\n          case 0x02:\n            x -= code[i++];\n            break;\n          case 0x12:\n            x += code[i++];\n            break;\n        }\n        points[j].x = x;\n      }\n      for (j = 0; j < numberOfPoints; j++) {\n        switch (points[j].flags & 0x24) {\n          case 0x00:\n            y += (code[i] << 24 | code[i + 1] << 16) >> 16;\n            i += 2;\n            break;\n          case 0x04:\n            y -= code[i++];\n            break;\n          case 0x24:\n            y += code[i++];\n            break;\n        }\n        points[j].y = y;\n      }\n      var startPoint = 0;\n      for (i = 0; i < numberOfContours; i++) {\n        var endPoint = endPtsOfContours[i];\n        var contour = points.slice(startPoint, endPoint + 1);\n        if (contour[0].flags & 1) {\n          contour.push(contour[0]);\n        } else if (contour[contour.length - 1].flags & 1) {\n          contour.unshift(contour[contour.length - 1]);\n        } else {\n          var p = {\n            flags: 1,\n            x: (contour[0].x + contour[contour.length - 1].x) / 2,\n            y: (contour[0].y + contour[contour.length - 1].y) / 2\n          };\n          contour.unshift(p);\n          contour.push(p);\n        }\n        moveTo(contour[0].x, contour[0].y);\n        for (j = 1, jj = contour.length; j < jj; j++) {\n          if (contour[j].flags & 1) {\n            lineTo(contour[j].x, contour[j].y);\n          } else if (contour[j + 1].flags & 1) {\n            quadraticCurveTo(contour[j].x, contour[j].y, contour[j + 1].x, contour[j + 1].y);\n            j++;\n          } else {\n            quadraticCurveTo(contour[j].x, contour[j].y, (contour[j].x + contour[j + 1].x) / 2, (contour[j].y + contour[j + 1].y) / 2);\n          }\n        }\n        startPoint = endPoint + 1;\n      }\n    }\n  }\n  function compileCharString(code, cmds, font) {\n    var stack = [];\n    var x = 0,\n        y = 0;\n    var stems = 0;\n    function moveTo(x, y) {\n      cmds.push({\n        cmd: 'moveTo',\n        args: [x, y]\n      });\n    }\n    function lineTo(x, y) {\n      cmds.push({\n        cmd: 'lineTo',\n        args: [x, y]\n      });\n    }\n    function bezierCurveTo(x1, y1, x2, y2, x, y) {\n      cmds.push({\n        cmd: 'bezierCurveTo',\n        args: [x1, y1, x2, y2, x, y]\n      });\n    }\n    function parse(code) {\n      var i = 0;\n      while (i < code.length) {\n        var stackClean = false;\n        var v = code[i++];\n        var xa, xb, ya, yb, y1, y2, y3, n, subrCode;\n        switch (v) {\n          case 1:\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n          case 3:\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n          case 4:\n            y += stack.pop();\n            moveTo(x, y);\n            stackClean = true;\n            break;\n          case 5:\n            while (stack.length > 0) {\n              x += stack.shift();\n              y += stack.shift();\n              lineTo(x, y);\n            }\n            break;\n          case 6:\n            while (stack.length > 0) {\n              x += stack.shift();\n              lineTo(x, y);\n              if (stack.length === 0) {\n                break;\n              }\n              y += stack.shift();\n              lineTo(x, y);\n            }\n            break;\n          case 7:\n            while (stack.length > 0) {\n              y += stack.shift();\n              lineTo(x, y);\n              if (stack.length === 0) {\n                break;\n              }\n              x += stack.shift();\n              lineTo(x, y);\n            }\n            break;\n          case 8:\n            while (stack.length > 0) {\n              xa = x + stack.shift();\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          case 10:\n            n = stack.pop() + font.subrsBias;\n            subrCode = font.subrs[n];\n            if (subrCode) {\n              parse(subrCode);\n            }\n            break;\n          case 11:\n            return;\n          case 12:\n            v = code[i++];\n            switch (v) {\n              case 34:\n                xa = x + stack.shift();\n                xb = xa + stack.shift();\n                y1 = y + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y, xb, y1, x, y1);\n                xa = x + stack.shift();\n                xb = xa + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y1, xb, y, x, y);\n                break;\n              case 35:\n                xa = x + stack.shift();\n                ya = y + stack.shift();\n                xb = xa + stack.shift();\n                yb = ya + stack.shift();\n                x = xb + stack.shift();\n                y = yb + stack.shift();\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                xa = x + stack.shift();\n                ya = y + stack.shift();\n                xb = xa + stack.shift();\n                yb = ya + stack.shift();\n                x = xb + stack.shift();\n                y = yb + stack.shift();\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                stack.pop();\n                break;\n              case 36:\n                xa = x + stack.shift();\n                y1 = y + stack.shift();\n                xb = xa + stack.shift();\n                y2 = y1 + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y1, xb, y2, x, y2);\n                xa = x + stack.shift();\n                xb = xa + stack.shift();\n                y3 = y2 + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y2, xb, y3, x, y);\n                break;\n              case 37:\n                var x0 = x,\n                    y0 = y;\n                xa = x + stack.shift();\n                ya = y + stack.shift();\n                xb = xa + stack.shift();\n                yb = ya + stack.shift();\n                x = xb + stack.shift();\n                y = yb + stack.shift();\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                xa = x + stack.shift();\n                ya = y + stack.shift();\n                xb = xa + stack.shift();\n                yb = ya + stack.shift();\n                x = xb;\n                y = yb;\n                if (Math.abs(x - x0) > Math.abs(y - y0)) {\n                  x += stack.shift();\n                } else {\n                  y += stack.shift();\n                }\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                break;\n              default:\n                throw new _util.FormatError('unknown operator: 12 ' + v);\n            }\n            break;\n          case 14:\n            if (stack.length >= 4) {\n              var achar = stack.pop();\n              var bchar = stack.pop();\n              y = stack.pop();\n              x = stack.pop();\n              cmds.push({ cmd: 'save' });\n              cmds.push({\n                cmd: 'translate',\n                args: [x, y]\n              });\n              var cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[_encodings.StandardEncoding[achar]]));\n              compileCharString(font.glyphs[cmap.glyphId], cmds, font);\n              cmds.push({ cmd: 'restore' });\n              cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[_encodings.StandardEncoding[bchar]]));\n              compileCharString(font.glyphs[cmap.glyphId], cmds, font);\n            }\n            return;\n          case 18:\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n          case 19:\n            stems += stack.length >> 1;\n            i += stems + 7 >> 3;\n            stackClean = true;\n            break;\n          case 20:\n            stems += stack.length >> 1;\n            i += stems + 7 >> 3;\n            stackClean = true;\n            break;\n          case 21:\n            y += stack.pop();\n            x += stack.pop();\n            moveTo(x, y);\n            stackClean = true;\n            break;\n          case 22:\n            x += stack.pop();\n            moveTo(x, y);\n            stackClean = true;\n            break;\n          case 23:\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n          case 24:\n            while (stack.length > 2) {\n              xa = x + stack.shift();\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            x += stack.shift();\n            y += stack.shift();\n            lineTo(x, y);\n            break;\n          case 25:\n            while (stack.length > 6) {\n              x += stack.shift();\n              y += stack.shift();\n              lineTo(x, y);\n            }\n            xa = x + stack.shift();\n            ya = y + stack.shift();\n            xb = xa + stack.shift();\n            yb = ya + stack.shift();\n            x = xb + stack.shift();\n            y = yb + stack.shift();\n            bezierCurveTo(xa, ya, xb, yb, x, y);\n            break;\n          case 26:\n            if (stack.length % 2) {\n              x += stack.shift();\n            }\n            while (stack.length > 0) {\n              xa = x;\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb;\n              y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          case 27:\n            if (stack.length % 2) {\n              y += stack.shift();\n            }\n            while (stack.length > 0) {\n              xa = x + stack.shift();\n              ya = y;\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb;\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          case 28:\n            stack.push((code[i] << 24 | code[i + 1] << 16) >> 16);\n            i += 2;\n            break;\n          case 29:\n            n = stack.pop() + font.gsubrsBias;\n            subrCode = font.gsubrs[n];\n            if (subrCode) {\n              parse(subrCode);\n            }\n            break;\n          case 30:\n            while (stack.length > 0) {\n              xa = x;\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n              if (stack.length === 0) {\n                break;\n              }\n              xa = x + stack.shift();\n              ya = y;\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              y = yb + stack.shift();\n              x = xb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          case 31:\n            while (stack.length > 0) {\n              xa = x + stack.shift();\n              ya = y;\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              y = yb + stack.shift();\n              x = xb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n              if (stack.length === 0) {\n                break;\n              }\n              xa = x;\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          default:\n            if (v < 32) {\n              throw new _util.FormatError('unknown operator: ' + v);\n            }\n            if (v < 247) {\n              stack.push(v - 139);\n            } else if (v < 251) {\n              stack.push((v - 247) * 256 + code[i++] + 108);\n            } else if (v < 255) {\n              stack.push(-(v - 251) * 256 - code[i++] - 108);\n            } else {\n              stack.push((code[i] << 24 | code[i + 1] << 16 | code[i + 2] << 8 | code[i + 3]) / 65536);\n              i += 4;\n            }\n            break;\n        }\n        if (stackClean) {\n          stack.length = 0;\n        }\n      }\n    }\n    parse(code);\n  }\n  var noop = '';\n  function CompiledFont(fontMatrix) {\n    this.compiledGlyphs = Object.create(null);\n    this.compiledCharCodeToGlyphId = Object.create(null);\n    this.fontMatrix = fontMatrix;\n  }\n  CompiledFont.prototype = {\n    getPathJs: function getPathJs(unicode) {\n      var cmap = lookupCmap(this.cmap, unicode);\n      var fn = this.compiledGlyphs[cmap.glyphId];\n      if (!fn) {\n        fn = this.compileGlyph(this.glyphs[cmap.glyphId]);\n        this.compiledGlyphs[cmap.glyphId] = fn;\n      }\n      if (this.compiledCharCodeToGlyphId[cmap.charCode] === undefined) {\n        this.compiledCharCodeToGlyphId[cmap.charCode] = cmap.glyphId;\n      }\n      return fn;\n    },\n    compileGlyph: function compileGlyph(code) {\n      if (!code || code.length === 0 || code[0] === 14) {\n        return noop;\n      }\n      var cmds = [];\n      cmds.push({ cmd: 'save' });\n      cmds.push({\n        cmd: 'transform',\n        args: this.fontMatrix.slice()\n      });\n      cmds.push({\n        cmd: 'scale',\n        args: ['size', '-size']\n      });\n      this.compileGlyphImpl(code, cmds);\n      cmds.push({ cmd: 'restore' });\n      return cmds;\n    },\n    compileGlyphImpl: function compileGlyphImpl() {\n      throw new Error('Children classes should implement this.');\n    },\n    hasBuiltPath: function hasBuiltPath(unicode) {\n      var cmap = lookupCmap(this.cmap, unicode);\n      return this.compiledGlyphs[cmap.glyphId] !== undefined && this.compiledCharCodeToGlyphId[cmap.charCode] !== undefined;\n    }\n  };\n  function TrueTypeCompiled(glyphs, cmap, fontMatrix) {\n    fontMatrix = fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0];\n    CompiledFont.call(this, fontMatrix);\n    this.glyphs = glyphs;\n    this.cmap = cmap;\n  }\n  _util.Util.inherit(TrueTypeCompiled, CompiledFont, {\n    compileGlyphImpl: function compileGlyphImpl(code, cmds) {\n      compileGlyf(code, cmds, this);\n    }\n  });\n  function Type2Compiled(cffInfo, cmap, fontMatrix, glyphNameMap) {\n    fontMatrix = fontMatrix || [0.001, 0, 0, 0.001, 0, 0];\n    CompiledFont.call(this, fontMatrix);\n    this.glyphs = cffInfo.glyphs;\n    this.gsubrs = cffInfo.gsubrs || [];\n    this.subrs = cffInfo.subrs || [];\n    this.cmap = cmap;\n    this.glyphNameMap = glyphNameMap || (0, _glyphlist.getGlyphsUnicode)();\n    this.gsubrsBias = this.gsubrs.length < 1240 ? 107 : this.gsubrs.length < 33900 ? 1131 : 32768;\n    this.subrsBias = this.subrs.length < 1240 ? 107 : this.subrs.length < 33900 ? 1131 : 32768;\n  }\n  _util.Util.inherit(Type2Compiled, CompiledFont, {\n    compileGlyphImpl: function compileGlyphImpl(code, cmds) {\n      compileCharString(code, cmds, this);\n    }\n  });\n  return {\n    create: function FontRendererFactory_create(font, seacAnalysisEnabled) {\n      var data = new Uint8Array(font.data);\n      var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm;\n      var numTables = getUshort(data, 4);\n      for (var i = 0, p = 12; i < numTables; i++, p += 16) {\n        var tag = (0, _util.bytesToString)(data.subarray(p, p + 4));\n        var offset = getLong(data, p + 8);\n        var length = getLong(data, p + 12);\n        switch (tag) {\n          case 'cmap':\n            cmap = parseCmap(data, offset, offset + length);\n            break;\n          case 'glyf':\n            glyf = data.subarray(offset, offset + length);\n            break;\n          case 'loca':\n            loca = data.subarray(offset, offset + length);\n            break;\n          case 'head':\n            unitsPerEm = getUshort(data, offset + 18);\n            indexToLocFormat = getUshort(data, offset + 50);\n            break;\n          case 'CFF ':\n            cff = parseCff(data, offset, offset + length, seacAnalysisEnabled);\n            break;\n        }\n      }\n      if (glyf) {\n        var fontMatrix = !unitsPerEm ? font.fontMatrix : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0];\n        return new TrueTypeCompiled(parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix);\n      }\n      return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap);\n    }\n  };\n}();\nexports.FontRendererFactory = FontRendererFactory;\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getFontType = exports.ProblematicCharRanges = exports.IdentityToUnicodeMap = exports.ToUnicodeMap = exports.FontFlags = exports.Font = exports.ErrorFont = exports.PRIVATE_USE_OFFSET_END = exports.PRIVATE_USE_OFFSET_START = exports.SEAC_ANALYSIS_ENABLED = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _cff_parser = __w_pdfjs_require__(10);\n\nvar _glyphlist = __w_pdfjs_require__(6);\n\nvar _encodings = __w_pdfjs_require__(4);\n\nvar _standard_fonts = __w_pdfjs_require__(16);\n\nvar _unicode = __w_pdfjs_require__(8);\n\nvar _font_renderer = __w_pdfjs_require__(24);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar _type1_parser = __w_pdfjs_require__(34);\n\nvar PRIVATE_USE_OFFSET_START = 0xE000;\nvar PRIVATE_USE_OFFSET_END = 0xF8FF;\nvar SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = false;\nvar PDF_GLYPH_SPACE_UNITS = 1000;\nvar SEAC_ANALYSIS_ENABLED = false;\nvar FontFlags = {\n  FixedPitch: 1,\n  Serif: 2,\n  Symbolic: 4,\n  Script: 8,\n  Nonsymbolic: 32,\n  Italic: 64,\n  AllCap: 65536,\n  SmallCap: 131072,\n  ForceBold: 262144\n};\nvar MacStandardGlyphOrdering = ['.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar', 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply', 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter', 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla', 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];\nfunction adjustWidths(properties) {\n  if (!properties.fontMatrix) {\n    return;\n  }\n  if (properties.fontMatrix[0] === _util.FONT_IDENTITY_MATRIX[0]) {\n    return;\n  }\n  var scale = 0.001 / properties.fontMatrix[0];\n  var glyphsWidths = properties.widths;\n  for (var glyph in glyphsWidths) {\n    glyphsWidths[glyph] *= scale;\n  }\n  properties.defaultWidth *= scale;\n}\nfunction adjustToUnicode(properties, builtInEncoding) {\n  if (properties.hasIncludedToUnicodeMap) {\n    return;\n  }\n  if (properties.hasEncoding) {\n    return;\n  }\n  if (builtInEncoding === properties.defaultEncoding) {\n    return;\n  }\n  if (properties.toUnicode instanceof IdentityToUnicodeMap) {\n    return;\n  }\n  var toUnicode = [],\n      glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n  for (var charCode in builtInEncoding) {\n    var glyphName = builtInEncoding[charCode];\n    var unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);\n    if (unicode !== -1) {\n      toUnicode[charCode] = String.fromCharCode(unicode);\n    }\n  }\n  properties.toUnicode.amend(toUnicode);\n}\nfunction getFontType(type, subtype) {\n  switch (type) {\n    case 'Type1':\n      return subtype === 'Type1C' ? _util.FontType.TYPE1C : _util.FontType.TYPE1;\n    case 'CIDFontType0':\n      return subtype === 'CIDFontType0C' ? _util.FontType.CIDFONTTYPE0C : _util.FontType.CIDFONTTYPE0;\n    case 'OpenType':\n      return _util.FontType.OPENTYPE;\n    case 'TrueType':\n      return _util.FontType.TRUETYPE;\n    case 'CIDFontType2':\n      return _util.FontType.CIDFONTTYPE2;\n    case 'MMType1':\n      return _util.FontType.MMTYPE1;\n    case 'Type0':\n      return _util.FontType.TYPE0;\n    default:\n      return _util.FontType.UNKNOWN;\n  }\n}\nfunction recoverGlyphName(name, glyphsUnicodeMap) {\n  if (glyphsUnicodeMap[name] !== undefined) {\n    return name;\n  }\n  var unicode = (0, _unicode.getUnicodeForGlyph)(name, glyphsUnicodeMap);\n  if (unicode !== -1) {\n    for (var key in glyphsUnicodeMap) {\n      if (glyphsUnicodeMap[key] === unicode) {\n        return key;\n      }\n    }\n  }\n  (0, _util.info)('Unable to recover a standard glyph name for: ' + name);\n  return name;\n}\nvar Glyph = function GlyphClosure() {\n  function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) {\n    this.fontChar = fontChar;\n    this.unicode = unicode;\n    this.accent = accent;\n    this.width = width;\n    this.vmetric = vmetric;\n    this.operatorListId = operatorListId;\n    this.isSpace = isSpace;\n    this.isInFont = isInFont;\n  }\n  Glyph.prototype.matchesForCache = function (fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) {\n    return this.fontChar === fontChar && this.unicode === unicode && this.accent === accent && this.width === width && this.vmetric === vmetric && this.operatorListId === operatorListId && this.isSpace === isSpace && this.isInFont === isInFont;\n  };\n  return Glyph;\n}();\nvar ToUnicodeMap = function ToUnicodeMapClosure() {\n  function ToUnicodeMap(cmap) {\n    this._map = cmap;\n  }\n  ToUnicodeMap.prototype = {\n    get length() {\n      return this._map.length;\n    },\n    forEach: function forEach(callback) {\n      for (var charCode in this._map) {\n        callback(charCode, this._map[charCode].charCodeAt(0));\n      }\n    },\n    has: function has(i) {\n      return this._map[i] !== undefined;\n    },\n    get: function get(i) {\n      return this._map[i];\n    },\n    charCodeOf: function charCodeOf(value) {\n      var map = this._map;\n      if (map.length <= 0x10000) {\n        return map.indexOf(value);\n      }\n      for (var charCode in map) {\n        if (map[charCode] === value) {\n          return charCode | 0;\n        }\n      }\n      return -1;\n    },\n    amend: function amend(map) {\n      for (var charCode in map) {\n        this._map[charCode] = map[charCode];\n      }\n    }\n  };\n  return ToUnicodeMap;\n}();\nvar IdentityToUnicodeMap = function IdentityToUnicodeMapClosure() {\n  function IdentityToUnicodeMap(firstChar, lastChar) {\n    this.firstChar = firstChar;\n    this.lastChar = lastChar;\n  }\n  IdentityToUnicodeMap.prototype = {\n    get length() {\n      return this.lastChar + 1 - this.firstChar;\n    },\n    forEach: function forEach(callback) {\n      for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) {\n        callback(i, i);\n      }\n    },\n    has: function has(i) {\n      return this.firstChar <= i && i <= this.lastChar;\n    },\n    get: function get(i) {\n      if (this.firstChar <= i && i <= this.lastChar) {\n        return String.fromCharCode(i);\n      }\n      return undefined;\n    },\n    charCodeOf: function charCodeOf(v) {\n      return (0, _util.isInt)(v) && v >= this.firstChar && v <= this.lastChar ? v : -1;\n    },\n    amend: function amend(map) {\n      throw new Error('Should not call amend()');\n    }\n  };\n  return IdentityToUnicodeMap;\n}();\nvar OpenTypeFileBuilder = function OpenTypeFileBuilderClosure() {\n  function writeInt16(dest, offset, num) {\n    dest[offset] = num >> 8 & 0xFF;\n    dest[offset + 1] = num & 0xFF;\n  }\n  function writeInt32(dest, offset, num) {\n    dest[offset] = num >> 24 & 0xFF;\n    dest[offset + 1] = num >> 16 & 0xFF;\n    dest[offset + 2] = num >> 8 & 0xFF;\n    dest[offset + 3] = num & 0xFF;\n  }\n  function writeData(dest, offset, data) {\n    var i, ii;\n    if (data instanceof Uint8Array) {\n      dest.set(data, offset);\n    } else if (typeof data === 'string') {\n      for (i = 0, ii = data.length; i < ii; i++) {\n        dest[offset++] = data.charCodeAt(i) & 0xFF;\n      }\n    } else {\n      for (i = 0, ii = data.length; i < ii; i++) {\n        dest[offset++] = data[i] & 0xFF;\n      }\n    }\n  }\n  function OpenTypeFileBuilder(sfnt) {\n    this.sfnt = sfnt;\n    this.tables = Object.create(null);\n  }\n  OpenTypeFileBuilder.getSearchParams = function OpenTypeFileBuilder_getSearchParams(entriesCount, entrySize) {\n    var maxPower2 = 1,\n        log2 = 0;\n    while ((maxPower2 ^ entriesCount) > maxPower2) {\n      maxPower2 <<= 1;\n      log2++;\n    }\n    var searchRange = maxPower2 * entrySize;\n    return {\n      range: searchRange,\n      entry: log2,\n      rangeShift: entrySize * entriesCount - searchRange\n    };\n  };\n  var OTF_HEADER_SIZE = 12;\n  var OTF_TABLE_ENTRY_SIZE = 16;\n  OpenTypeFileBuilder.prototype = {\n    toArray: function OpenTypeFileBuilder_toArray() {\n      var sfnt = this.sfnt;\n      var tables = this.tables;\n      var tablesNames = Object.keys(tables);\n      tablesNames.sort();\n      var numTables = tablesNames.length;\n      var i, j, jj, table, tableName;\n      var offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE;\n      var tableOffsets = [offset];\n      for (i = 0; i < numTables; i++) {\n        table = tables[tablesNames[i]];\n        var paddedLength = (table.length + 3 & ~3) >>> 0;\n        offset += paddedLength;\n        tableOffsets.push(offset);\n      }\n      var file = new Uint8Array(offset);\n      for (i = 0; i < numTables; i++) {\n        table = tables[tablesNames[i]];\n        writeData(file, tableOffsets[i], table);\n      }\n      if (sfnt === 'true') {\n        sfnt = (0, _util.string32)(0x00010000);\n      }\n      file[0] = sfnt.charCodeAt(0) & 0xFF;\n      file[1] = sfnt.charCodeAt(1) & 0xFF;\n      file[2] = sfnt.charCodeAt(2) & 0xFF;\n      file[3] = sfnt.charCodeAt(3) & 0xFF;\n      writeInt16(file, 4, numTables);\n      var searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16);\n      writeInt16(file, 6, searchParams.range);\n      writeInt16(file, 8, searchParams.entry);\n      writeInt16(file, 10, searchParams.rangeShift);\n      offset = OTF_HEADER_SIZE;\n      for (i = 0; i < numTables; i++) {\n        tableName = tablesNames[i];\n        file[offset] = tableName.charCodeAt(0) & 0xFF;\n        file[offset + 1] = tableName.charCodeAt(1) & 0xFF;\n        file[offset + 2] = tableName.charCodeAt(2) & 0xFF;\n        file[offset + 3] = tableName.charCodeAt(3) & 0xFF;\n        var checksum = 0;\n        for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) {\n          var quad = (0, _util.readUint32)(file, j);\n          checksum = checksum + quad >>> 0;\n        }\n        writeInt32(file, offset + 4, checksum);\n        writeInt32(file, offset + 8, tableOffsets[i]);\n        writeInt32(file, offset + 12, tables[tableName].length);\n        offset += OTF_TABLE_ENTRY_SIZE;\n      }\n      return file;\n    },\n    addTable: function OpenTypeFileBuilder_addTable(tag, data) {\n      if (tag in this.tables) {\n        throw new Error('Table ' + tag + ' already exists');\n      }\n      this.tables[tag] = data;\n    }\n  };\n  return OpenTypeFileBuilder;\n}();\nvar ProblematicCharRanges = new Int32Array([0x0000, 0x0020, 0x007F, 0x00A1, 0x00AD, 0x00AE, 0x0600, 0x0780, 0x08A0, 0x10A0, 0x1780, 0x1800, 0x1C00, 0x1C50, 0x2000, 0x2010, 0x2011, 0x2012, 0x2028, 0x2030, 0x205F, 0x2070, 0x25CC, 0x25CD, 0x3000, 0x3001, 0x3164, 0x3165, 0xAA60, 0xAA80, 0xFFF0, 0x10000]);\nvar Font = function FontClosure() {\n  function Font(name, file, properties) {\n    var charCode;\n    this.name = name;\n    this.loadedName = properties.loadedName;\n    this.isType3Font = properties.isType3Font;\n    this.sizes = [];\n    this.missingFile = false;\n    this.glyphCache = Object.create(null);\n    this.isSerifFont = !!(properties.flags & FontFlags.Serif);\n    this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);\n    this.isMonospace = !!(properties.flags & FontFlags.FixedPitch);\n    var type = properties.type;\n    var subtype = properties.subtype;\n    this.type = type;\n    this.subtype = subtype;\n    this.fallbackName = this.isMonospace ? 'monospace' : this.isSerifFont ? 'serif' : 'sans-serif';\n    this.differences = properties.differences;\n    this.widths = properties.widths;\n    this.defaultWidth = properties.defaultWidth;\n    this.composite = properties.composite;\n    this.wideChars = properties.wideChars;\n    this.cMap = properties.cMap;\n    this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS;\n    this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS;\n    this.fontMatrix = properties.fontMatrix;\n    this.bbox = properties.bbox;\n    this.defaultEncoding = properties.defaultEncoding;\n    this.toUnicode = properties.toUnicode;\n    this.toFontChar = [];\n    if (properties.type === 'Type3') {\n      for (charCode = 0; charCode < 256; charCode++) {\n        this.toFontChar[charCode] = this.differences[charCode] || properties.defaultEncoding[charCode];\n      }\n      this.fontType = _util.FontType.TYPE3;\n      return;\n    }\n    this.cidEncoding = properties.cidEncoding;\n    this.vertical = properties.vertical;\n    if (this.vertical) {\n      this.vmetrics = properties.vmetrics;\n      this.defaultVMetrics = properties.defaultVMetrics;\n    }\n    if (!file || file.isEmpty) {\n      if (file) {\n        (0, _util.warn)('Font file is empty in \"' + name + '\" (' + this.loadedName + ')');\n      }\n      this.fallbackToSystemFont();\n      return;\n    }\n    if (subtype === 'Type1C') {\n      if (type !== 'Type1' && type !== 'MMType1') {\n        if (isTrueTypeFile(file)) {\n          subtype = 'TrueType';\n        } else {\n          type = 'Type1';\n        }\n      } else if (isOpenTypeFile(file)) {\n        subtype = 'OpenType';\n      }\n    }\n    if (subtype === 'CIDFontType0C' && type !== 'CIDFontType0') {\n      type = 'CIDFontType0';\n    }\n    if (type === 'CIDFontType0') {\n      if (isType1File(file)) {\n        subtype = 'CIDFontType0';\n      } else if (isOpenTypeFile(file)) {\n        subtype = 'OpenType';\n      } else {\n        subtype = 'CIDFontType0C';\n      }\n    }\n    if (subtype === 'OpenType' && type !== 'OpenType') {\n      type = 'OpenType';\n    }\n    try {\n      var data;\n      switch (type) {\n        case 'MMType1':\n          (0, _util.info)('MMType1 font (' + name + '), falling back to Type1.');\n        case 'Type1':\n        case 'CIDFontType0':\n          this.mimetype = 'font/opentype';\n          var cff = subtype === 'Type1C' || subtype === 'CIDFontType0C' ? new CFFFont(file, properties) : new Type1Font(name, file, properties);\n          adjustWidths(properties);\n          data = this.convert(name, cff, properties);\n          break;\n        case 'OpenType':\n        case 'TrueType':\n        case 'CIDFontType2':\n          this.mimetype = 'font/opentype';\n          data = this.checkAndRepair(name, file, properties);\n          if (this.isOpenType) {\n            adjustWidths(properties);\n            type = 'OpenType';\n          }\n          break;\n        default:\n          throw new _util.FormatError('Font ' + type + ' is not supported');\n      }\n    } catch (e) {\n      if (!(e instanceof _util.FormatError)) {\n        throw e;\n      }\n      (0, _util.warn)(e);\n      this.fallbackToSystemFont();\n      return;\n    }\n    this.data = data;\n    this.fontType = getFontType(type, subtype);\n    this.fontMatrix = properties.fontMatrix;\n    this.widths = properties.widths;\n    this.defaultWidth = properties.defaultWidth;\n    this.toUnicode = properties.toUnicode;\n    this.encoding = properties.baseEncoding;\n    this.seacMap = properties.seacMap;\n    this.loading = true;\n  }\n  Font.getFontID = function () {\n    var ID = 1;\n    return function Font_getFontID() {\n      return String(ID++);\n    };\n  }();\n  function int16(b0, b1) {\n    return (b0 << 8) + b1;\n  }\n  function signedInt16(b0, b1) {\n    var value = (b0 << 8) + b1;\n    return value & 1 << 15 ? value - 0x10000 : value;\n  }\n  function int32(b0, b1, b2, b3) {\n    return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n  }\n  function string16(value) {\n    return String.fromCharCode(value >> 8 & 0xff, value & 0xff);\n  }\n  function safeString16(value) {\n    value = value > 0x7FFF ? 0x7FFF : value < -0x8000 ? -0x8000 : value;\n    return String.fromCharCode(value >> 8 & 0xff, value & 0xff);\n  }\n  function isTrueTypeFile(file) {\n    var header = file.peekBytes(4);\n    return (0, _util.readUint32)(header, 0) === 0x00010000;\n  }\n  function isOpenTypeFile(file) {\n    var header = file.peekBytes(4);\n    return (0, _util.bytesToString)(header) === 'OTTO';\n  }\n  function isType1File(file) {\n    var header = file.peekBytes(2);\n    if (header[0] === 0x25 && header[1] === 0x21) {\n      return true;\n    }\n    if (header[0] === 0x80 && header[1] === 0x01) {\n      return true;\n    }\n    return false;\n  }\n  function buildToFontChar(encoding, glyphsUnicodeMap, differences) {\n    var toFontChar = [],\n        unicode;\n    for (var i = 0, ii = encoding.length; i < ii; i++) {\n      unicode = (0, _unicode.getUnicodeForGlyph)(encoding[i], glyphsUnicodeMap);\n      if (unicode !== -1) {\n        toFontChar[i] = unicode;\n      }\n    }\n    for (var charCode in differences) {\n      unicode = (0, _unicode.getUnicodeForGlyph)(differences[charCode], glyphsUnicodeMap);\n      if (unicode !== -1) {\n        toFontChar[+charCode] = unicode;\n      }\n    }\n    return toFontChar;\n  }\n  function isProblematicUnicodeLocation(code) {\n    var i = 0,\n        j = ProblematicCharRanges.length - 1;\n    while (i < j) {\n      var c = i + j + 1 >> 1;\n      if (code < ProblematicCharRanges[c]) {\n        j = c - 1;\n      } else {\n        i = c;\n      }\n    }\n    return !(i & 1);\n  }\n  function adjustMapping(charCodeToGlyphId, properties, missingGlyphs) {\n    var toUnicode = properties.toUnicode;\n    var isSymbolic = !!(properties.flags & FontFlags.Symbolic);\n    var isIdentityUnicode = properties.toUnicode instanceof IdentityToUnicodeMap;\n    var newMap = Object.create(null);\n    var toFontChar = [];\n    var usedFontCharCodes = [];\n    var nextAvailableFontCharCode = PRIVATE_USE_OFFSET_START;\n    for (var originalCharCode in charCodeToGlyphId) {\n      originalCharCode |= 0;\n      var glyphId = charCodeToGlyphId[originalCharCode];\n      if (missingGlyphs[glyphId]) {\n        continue;\n      }\n      var fontCharCode = originalCharCode;\n      var hasUnicodeValue = false;\n      if (!isIdentityUnicode && toUnicode.has(originalCharCode)) {\n        hasUnicodeValue = true;\n        var unicode = toUnicode.get(fontCharCode);\n        if (unicode.length === 1) {\n          fontCharCode = unicode.charCodeAt(0);\n        }\n      }\n      if (usedFontCharCodes[fontCharCode] !== undefined || isProblematicUnicodeLocation(fontCharCode) || isSymbolic && !hasUnicodeValue) {\n        do {\n          if (nextAvailableFontCharCode > PRIVATE_USE_OFFSET_END) {\n            (0, _util.warn)('Ran out of space in font private use area.');\n            break;\n          }\n          fontCharCode = nextAvailableFontCharCode++;\n          if (SKIP_PRIVATE_USE_RANGE_F000_TO_F01F && fontCharCode === 0xF000) {\n            fontCharCode = 0xF020;\n            nextAvailableFontCharCode = fontCharCode + 1;\n          }\n        } while (usedFontCharCodes[fontCharCode] !== undefined);\n      }\n      newMap[fontCharCode] = glyphId;\n      toFontChar[originalCharCode] = fontCharCode;\n      usedFontCharCodes[fontCharCode] = true;\n    }\n    return {\n      toFontChar: toFontChar,\n      charCodeToGlyphId: newMap,\n      nextAvailableFontCharCode: nextAvailableFontCharCode\n    };\n  }\n  function getRanges(glyphs, numGlyphs) {\n    var codes = [];\n    for (var charCode in glyphs) {\n      if (glyphs[charCode] >= numGlyphs) {\n        continue;\n      }\n      codes.push({\n        fontCharCode: charCode | 0,\n        glyphId: glyphs[charCode]\n      });\n    }\n    if (codes.length === 0) {\n      codes.push({\n        fontCharCode: 0,\n        glyphId: 0\n      });\n    }\n    codes.sort(function fontGetRangesSort(a, b) {\n      return a.fontCharCode - b.fontCharCode;\n    });\n    var ranges = [];\n    var length = codes.length;\n    for (var n = 0; n < length;) {\n      var start = codes[n].fontCharCode;\n      var codeIndices = [codes[n].glyphId];\n      ++n;\n      var end = start;\n      while (n < length && end + 1 === codes[n].fontCharCode) {\n        codeIndices.push(codes[n].glyphId);\n        ++end;\n        ++n;\n        if (end === 0xFFFF) {\n          break;\n        }\n      }\n      ranges.push([start, end, codeIndices]);\n    }\n    return ranges;\n  }\n  function createCmapTable(glyphs, numGlyphs) {\n    var ranges = getRanges(glyphs, numGlyphs);\n    var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1;\n    var cmap = '\\x00\\x00' + string16(numTables) + '\\x00\\x03' + '\\x00\\x01' + (0, _util.string32)(4 + numTables * 8);\n    var i, ii, j, jj;\n    for (i = ranges.length - 1; i >= 0; --i) {\n      if (ranges[i][0] <= 0xFFFF) {\n        break;\n      }\n    }\n    var bmpLength = i + 1;\n    if (ranges[i][0] < 0xFFFF && ranges[i][1] === 0xFFFF) {\n      ranges[i][1] = 0xFFFE;\n    }\n    var trailingRangesCount = ranges[i][1] < 0xFFFF ? 1 : 0;\n    var segCount = bmpLength + trailingRangesCount;\n    var searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2);\n    var startCount = '';\n    var endCount = '';\n    var idDeltas = '';\n    var idRangeOffsets = '';\n    var glyphsIds = '';\n    var bias = 0;\n    var range, start, end, codes;\n    for (i = 0, ii = bmpLength; i < ii; i++) {\n      range = ranges[i];\n      start = range[0];\n      end = range[1];\n      startCount += string16(start);\n      endCount += string16(end);\n      codes = range[2];\n      var contiguous = true;\n      for (j = 1, jj = codes.length; j < jj; ++j) {\n        if (codes[j] !== codes[j - 1] + 1) {\n          contiguous = false;\n          break;\n        }\n      }\n      if (!contiguous) {\n        var offset = (segCount - i) * 2 + bias * 2;\n        bias += end - start + 1;\n        idDeltas += string16(0);\n        idRangeOffsets += string16(offset);\n        for (j = 0, jj = codes.length; j < jj; ++j) {\n          glyphsIds += string16(codes[j]);\n        }\n      } else {\n        var startCode = codes[0];\n        idDeltas += string16(startCode - start & 0xFFFF);\n        idRangeOffsets += string16(0);\n      }\n    }\n    if (trailingRangesCount > 0) {\n      endCount += '\\xFF\\xFF';\n      startCount += '\\xFF\\xFF';\n      idDeltas += '\\x00\\x01';\n      idRangeOffsets += '\\x00\\x00';\n    }\n    var format314 = '\\x00\\x00' + string16(2 * segCount) + string16(searchParams.range) + string16(searchParams.entry) + string16(searchParams.rangeShift) + endCount + '\\x00\\x00' + startCount + idDeltas + idRangeOffsets + glyphsIds;\n    var format31012 = '';\n    var header31012 = '';\n    if (numTables > 1) {\n      cmap += '\\x00\\x03' + '\\x00\\x0A' + (0, _util.string32)(4 + numTables * 8 + 4 + format314.length);\n      format31012 = '';\n      for (i = 0, ii = ranges.length; i < ii; i++) {\n        range = ranges[i];\n        start = range[0];\n        codes = range[2];\n        var code = codes[0];\n        for (j = 1, jj = codes.length; j < jj; ++j) {\n          if (codes[j] !== codes[j - 1] + 1) {\n            end = range[0] + j - 1;\n            format31012 += (0, _util.string32)(start) + (0, _util.string32)(end) + (0, _util.string32)(code);\n            start = end + 1;\n            code = codes[j];\n          }\n        }\n        format31012 += (0, _util.string32)(start) + (0, _util.string32)(range[1]) + (0, _util.string32)(code);\n      }\n      header31012 = '\\x00\\x0C' + '\\x00\\x00' + (0, _util.string32)(format31012.length + 16) + '\\x00\\x00\\x00\\x00' + (0, _util.string32)(format31012.length / 12);\n    }\n    return cmap + '\\x00\\x04' + string16(format314.length + 4) + format314 + header31012 + format31012;\n  }\n  function validateOS2Table(os2) {\n    var stream = new _stream.Stream(os2.data);\n    var version = stream.getUint16();\n    stream.getBytes(60);\n    var selection = stream.getUint16();\n    if (version < 4 && selection & 0x0300) {\n      return false;\n    }\n    var firstChar = stream.getUint16();\n    var lastChar = stream.getUint16();\n    if (firstChar > lastChar) {\n      return false;\n    }\n    stream.getBytes(6);\n    var usWinAscent = stream.getUint16();\n    if (usWinAscent === 0) {\n      return false;\n    }\n    os2.data[8] = os2.data[9] = 0;\n    return true;\n  }\n  function createOS2Table(properties, charstrings, override) {\n    override = override || {\n      unitsPerEm: 0,\n      yMax: 0,\n      yMin: 0,\n      ascent: 0,\n      descent: 0\n    };\n    var ulUnicodeRange1 = 0;\n    var ulUnicodeRange2 = 0;\n    var ulUnicodeRange3 = 0;\n    var ulUnicodeRange4 = 0;\n    var firstCharIndex = null;\n    var lastCharIndex = 0;\n    if (charstrings) {\n      for (var code in charstrings) {\n        code |= 0;\n        if (firstCharIndex > code || !firstCharIndex) {\n          firstCharIndex = code;\n        }\n        if (lastCharIndex < code) {\n          lastCharIndex = code;\n        }\n        var position = (0, _unicode.getUnicodeRangeFor)(code);\n        if (position < 32) {\n          ulUnicodeRange1 |= 1 << position;\n        } else if (position < 64) {\n          ulUnicodeRange2 |= 1 << position - 32;\n        } else if (position < 96) {\n          ulUnicodeRange3 |= 1 << position - 64;\n        } else if (position < 123) {\n          ulUnicodeRange4 |= 1 << position - 96;\n        } else {\n          throw new _util.FormatError('Unicode ranges Bits > 123 are reserved for internal usage');\n        }\n      }\n    } else {\n      firstCharIndex = 0;\n      lastCharIndex = 255;\n    }\n    var bbox = properties.bbox || [0, 0, 0, 0];\n    var unitsPerEm = override.unitsPerEm || 1 / (properties.fontMatrix || _util.FONT_IDENTITY_MATRIX)[0];\n    var scale = properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS;\n    var typoAscent = override.ascent || Math.round(scale * (properties.ascent || bbox[3]));\n    var typoDescent = override.descent || Math.round(scale * (properties.descent || bbox[1]));\n    if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) {\n      typoDescent = -typoDescent;\n    }\n    var winAscent = override.yMax || typoAscent;\n    var winDescent = -override.yMin || -typoDescent;\n    return '\\x00\\x03' + '\\x02\\x24' + '\\x01\\xF4' + '\\x00\\x05' + '\\x00\\x00' + '\\x02\\x8A' + '\\x02\\xBB' + '\\x00\\x00' + '\\x00\\x8C' + '\\x02\\x8A' + '\\x02\\xBB' + '\\x00\\x00' + '\\x01\\xDF' + '\\x00\\x31' + '\\x01\\x02' + '\\x00\\x00' + '\\x00\\x00\\x06' + String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + '\\x00\\x00\\x00\\x00\\x00\\x00' + (0, _util.string32)(ulUnicodeRange1) + (0, _util.string32)(ulUnicodeRange2) + (0, _util.string32)(ulUnicodeRange3) + (0, _util.string32)(ulUnicodeRange4) + '\\x2A\\x32\\x31\\x2A' + string16(properties.italicAngle ? 1 : 0) + string16(firstCharIndex || properties.firstChar) + string16(lastCharIndex || properties.lastChar) + string16(typoAscent) + string16(typoDescent) + '\\x00\\x64' + string16(winAscent) + string16(winDescent) + '\\x00\\x00\\x00\\x00' + '\\x00\\x00\\x00\\x00' + string16(properties.xHeight) + string16(properties.capHeight) + string16(0) + string16(firstCharIndex || properties.firstChar) + '\\x00\\x03';\n  }\n  function createPostTable(properties) {\n    var angle = Math.floor(properties.italicAngle * Math.pow(2, 16));\n    return '\\x00\\x03\\x00\\x00' + (0, _util.string32)(angle) + '\\x00\\x00' + '\\x00\\x00' + (0, _util.string32)(properties.fixedPitch) + '\\x00\\x00\\x00\\x00' + '\\x00\\x00\\x00\\x00' + '\\x00\\x00\\x00\\x00' + '\\x00\\x00\\x00\\x00';\n  }\n  function createNameTable(name, proto) {\n    if (!proto) {\n      proto = [[], []];\n    }\n    var strings = [proto[0][0] || 'Original licence', proto[0][1] || name, proto[0][2] || 'Unknown', proto[0][3] || 'uniqueID', proto[0][4] || name, proto[0][5] || 'Version 0.11', proto[0][6] || '', proto[0][7] || 'Unknown', proto[0][8] || 'Unknown', proto[0][9] || 'Unknown'];\n    var stringsUnicode = [];\n    var i, ii, j, jj, str;\n    for (i = 0, ii = strings.length; i < ii; i++) {\n      str = proto[1][i] || strings[i];\n      var strBufUnicode = [];\n      for (j = 0, jj = str.length; j < jj; j++) {\n        strBufUnicode.push(string16(str.charCodeAt(j)));\n      }\n      stringsUnicode.push(strBufUnicode.join(''));\n    }\n    var names = [strings, stringsUnicode];\n    var platforms = ['\\x00\\x01', '\\x00\\x03'];\n    var encodings = ['\\x00\\x00', '\\x00\\x01'];\n    var languages = ['\\x00\\x00', '\\x04\\x09'];\n    var namesRecordCount = strings.length * platforms.length;\n    var nameTable = '\\x00\\x00' + string16(namesRecordCount) + string16(namesRecordCount * 12 + 6);\n    var strOffset = 0;\n    for (i = 0, ii = platforms.length; i < ii; i++) {\n      var strs = names[i];\n      for (j = 0, jj = strs.length; j < jj; j++) {\n        str = strs[j];\n        var nameRecord = platforms[i] + encodings[i] + languages[i] + string16(j) + string16(str.length) + string16(strOffset);\n        nameTable += nameRecord;\n        strOffset += str.length;\n      }\n    }\n    nameTable += strings.join('') + stringsUnicode.join('');\n    return nameTable;\n  }\n  Font.prototype = {\n    name: null,\n    font: null,\n    mimetype: null,\n    encoding: null,\n    get renderer() {\n      var renderer = _font_renderer.FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED);\n      return (0, _util.shadow)(this, 'renderer', renderer);\n    },\n    exportData: function Font_exportData() {\n      var data = {};\n      for (var i in this) {\n        if (this.hasOwnProperty(i)) {\n          data[i] = this[i];\n        }\n      }\n      return data;\n    },\n    fallbackToSystemFont: function Font_fallbackToSystemFont() {\n      var _this = this;\n\n      this.missingFile = true;\n      var charCode, unicode;\n      var name = this.name;\n      var type = this.type;\n      var subtype = this.subtype;\n      var fontName = name.replace(/[,_]/g, '-');\n      var stdFontMap = (0, _standard_fonts.getStdFontMap)(),\n          nonStdFontMap = (0, _standard_fonts.getNonStdFontMap)();\n      var isStandardFont = !!stdFontMap[fontName] || !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]);\n      fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;\n      this.bold = fontName.search(/bold/gi) !== -1;\n      this.italic = fontName.search(/oblique/gi) !== -1 || fontName.search(/italic/gi) !== -1;\n      this.black = name.search(/Black/g) !== -1;\n      this.remeasure = Object.keys(this.widths).length > 0;\n      if (isStandardFont && type === 'CIDFontType2' && this.cidEncoding.indexOf('Identity-') === 0) {\n        var GlyphMapForStandardFonts = (0, _standard_fonts.getGlyphMapForStandardFonts)();\n        var map = [];\n        for (charCode in GlyphMapForStandardFonts) {\n          map[+charCode] = GlyphMapForStandardFonts[charCode];\n        }\n        if (/Arial-?Black/i.test(name)) {\n          var SupplementalGlyphMapForArialBlack = (0, _standard_fonts.getSupplementalGlyphMapForArialBlack)();\n          for (charCode in SupplementalGlyphMapForArialBlack) {\n            map[+charCode] = SupplementalGlyphMapForArialBlack[charCode];\n          }\n        }\n        var isIdentityUnicode = this.toUnicode instanceof IdentityToUnicodeMap;\n        if (!isIdentityUnicode) {\n          this.toUnicode.forEach(function (charCode, unicodeCharCode) {\n            map[+charCode] = unicodeCharCode;\n          });\n        }\n        this.toFontChar = map;\n        this.toUnicode = new ToUnicodeMap(map);\n      } else if (/Symbol/i.test(fontName)) {\n        this.toFontChar = buildToFontChar(_encodings.SymbolSetEncoding, (0, _glyphlist.getGlyphsUnicode)(), this.differences);\n      } else if (/Dingbats/i.test(fontName)) {\n        if (/Wingdings/i.test(name)) {\n          (0, _util.warn)('Non-embedded Wingdings font, falling back to ZapfDingbats.');\n        }\n        this.toFontChar = buildToFontChar(_encodings.ZapfDingbatsEncoding, (0, _glyphlist.getDingbatsGlyphsUnicode)(), this.differences);\n      } else if (isStandardFont) {\n        this.toFontChar = buildToFontChar(this.defaultEncoding, (0, _glyphlist.getGlyphsUnicode)(), this.differences);\n      } else {\n        var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n        this.toUnicode.forEach(function (charCode, unicodeCharCode) {\n          if (!_this.composite) {\n            var glyphName = _this.differences[charCode] || _this.defaultEncoding[charCode];\n            unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);\n            if (unicode !== -1) {\n              unicodeCharCode = unicode;\n            }\n          }\n          _this.toFontChar[charCode] = unicodeCharCode;\n        });\n      }\n      this.loadedName = fontName.split('-')[0];\n      this.loading = false;\n      this.fontType = getFontType(type, subtype);\n    },\n    checkAndRepair: function Font_checkAndRepair(name, font, properties) {\n      function readTableEntry(file) {\n        var tag = (0, _util.bytesToString)(file.getBytes(4));\n        var checksum = file.getInt32() >>> 0;\n        var offset = file.getInt32() >>> 0;\n        var length = file.getInt32() >>> 0;\n        var previousPosition = file.pos;\n        file.pos = file.start ? file.start : 0;\n        file.skip(offset);\n        var data = file.getBytes(length);\n        file.pos = previousPosition;\n        if (tag === 'head') {\n          data[8] = data[9] = data[10] = data[11] = 0;\n          data[17] |= 0x20;\n        }\n        return {\n          tag: tag,\n          checksum: checksum,\n          length: length,\n          offset: offset,\n          data: data\n        };\n      }\n      function readOpenTypeHeader(ttf) {\n        return {\n          version: (0, _util.bytesToString)(ttf.getBytes(4)),\n          numTables: ttf.getUint16(),\n          searchRange: ttf.getUint16(),\n          entrySelector: ttf.getUint16(),\n          rangeShift: ttf.getUint16()\n        };\n      }\n      function readCmapTable(cmap, font, isSymbolicFont, hasEncoding) {\n        if (!cmap) {\n          (0, _util.warn)('No cmap table available.');\n          return {\n            platformId: -1,\n            encodingId: -1,\n            mappings: [],\n            hasShortCmap: false\n          };\n        }\n        var segment;\n        var start = (font.start ? font.start : 0) + cmap.offset;\n        font.pos = start;\n        font.getUint16();\n        var numTables = font.getUint16();\n        var potentialTable;\n        var canBreak = false;\n        for (var i = 0; i < numTables; i++) {\n          var platformId = font.getUint16();\n          var encodingId = font.getUint16();\n          var offset = font.getInt32() >>> 0;\n          var useTable = false;\n          if (potentialTable && potentialTable.platformId === platformId && potentialTable.encodingId === encodingId) {\n            continue;\n          }\n          if (platformId === 0 && encodingId === 0) {\n            useTable = true;\n          } else if (platformId === 1 && encodingId === 0) {\n            useTable = true;\n          } else if (platformId === 3 && encodingId === 1 && (hasEncoding || !potentialTable)) {\n            useTable = true;\n            if (!isSymbolicFont) {\n              canBreak = true;\n            }\n          } else if (isSymbolicFont && platformId === 3 && encodingId === 0) {\n            useTable = true;\n            canBreak = true;\n          }\n          if (useTable) {\n            potentialTable = {\n              platformId: platformId,\n              encodingId: encodingId,\n              offset: offset\n            };\n          }\n          if (canBreak) {\n            break;\n          }\n        }\n        if (potentialTable) {\n          font.pos = start + potentialTable.offset;\n        }\n        if (!potentialTable || font.peekByte() === -1) {\n          (0, _util.warn)('Could not find a preferred cmap table.');\n          return {\n            platformId: -1,\n            encodingId: -1,\n            mappings: [],\n            hasShortCmap: false\n          };\n        }\n        var format = font.getUint16();\n        font.getUint16();\n        font.getUint16();\n        var hasShortCmap = false;\n        var mappings = [];\n        var j, glyphId;\n        if (format === 0) {\n          for (j = 0; j < 256; j++) {\n            var index = font.getByte();\n            if (!index) {\n              continue;\n            }\n            mappings.push({\n              charCode: j,\n              glyphId: index\n            });\n          }\n          hasShortCmap = true;\n        } else if (format === 4) {\n          var segCount = font.getUint16() >> 1;\n          font.getBytes(6);\n          var segIndex,\n              segments = [];\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segments.push({ end: font.getUint16() });\n          }\n          font.getUint16();\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segments[segIndex].start = font.getUint16();\n          }\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segments[segIndex].delta = font.getUint16();\n          }\n          var offsetsCount = 0;\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segment = segments[segIndex];\n            var rangeOffset = font.getUint16();\n            if (!rangeOffset) {\n              segment.offsetIndex = -1;\n              continue;\n            }\n            var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);\n            segment.offsetIndex = offsetIndex;\n            offsetsCount = Math.max(offsetsCount, offsetIndex + segment.end - segment.start + 1);\n          }\n          var offsets = [];\n          for (j = 0; j < offsetsCount; j++) {\n            offsets.push(font.getUint16());\n          }\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segment = segments[segIndex];\n            start = segment.start;\n            var end = segment.end;\n            var delta = segment.delta;\n            offsetIndex = segment.offsetIndex;\n            for (j = start; j <= end; j++) {\n              if (j === 0xFFFF) {\n                continue;\n              }\n              glyphId = offsetIndex < 0 ? j : offsets[offsetIndex + j - start];\n              glyphId = glyphId + delta & 0xFFFF;\n              mappings.push({\n                charCode: j,\n                glyphId: glyphId\n              });\n            }\n          }\n        } else if (format === 6) {\n          var firstCode = font.getUint16();\n          var entryCount = font.getUint16();\n          for (j = 0; j < entryCount; j++) {\n            glyphId = font.getUint16();\n            var charCode = firstCode + j;\n            mappings.push({\n              charCode: charCode,\n              glyphId: glyphId\n            });\n          }\n        } else {\n          (0, _util.warn)('cmap table has unsupported format: ' + format);\n          return {\n            platformId: -1,\n            encodingId: -1,\n            mappings: [],\n            hasShortCmap: false\n          };\n        }\n        mappings.sort(function (a, b) {\n          return a.charCode - b.charCode;\n        });\n        for (i = 1; i < mappings.length; i++) {\n          if (mappings[i - 1].charCode === mappings[i].charCode) {\n            mappings.splice(i, 1);\n            i--;\n          }\n        }\n        return {\n          platformId: potentialTable.platformId,\n          encodingId: potentialTable.encodingId,\n          mappings: mappings,\n          hasShortCmap: hasShortCmap\n        };\n      }\n      function sanitizeMetrics(font, header, metrics, numGlyphs) {\n        if (!header) {\n          if (metrics) {\n            metrics.data = null;\n          }\n          return;\n        }\n        font.pos = (font.start ? font.start : 0) + header.offset;\n        font.pos += header.length - 2;\n        var numOfMetrics = font.getUint16();\n        if (numOfMetrics > numGlyphs) {\n          (0, _util.info)('The numOfMetrics (' + numOfMetrics + ') should not be ' + 'greater than the numGlyphs (' + numGlyphs + ')');\n          numOfMetrics = numGlyphs;\n          header.data[34] = (numOfMetrics & 0xff00) >> 8;\n          header.data[35] = numOfMetrics & 0x00ff;\n        }\n        var numOfSidebearings = numGlyphs - numOfMetrics;\n        var numMissing = numOfSidebearings - (metrics.length - numOfMetrics * 4 >> 1);\n        if (numMissing > 0) {\n          var entries = new Uint8Array(metrics.length + numMissing * 2);\n          entries.set(metrics.data);\n          metrics.data = entries;\n        }\n      }\n      function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, hintsValid) {\n        if (sourceEnd - sourceStart <= 12) {\n          return 0;\n        }\n        var glyf = source.subarray(sourceStart, sourceEnd);\n        var contoursCount = glyf[0] << 8 | glyf[1];\n        if (contoursCount & 0x8000) {\n          dest.set(glyf, destStart);\n          return glyf.length;\n        }\n        var i,\n            j = 10,\n            flagsCount = 0;\n        for (i = 0; i < contoursCount; i++) {\n          var endPoint = glyf[j] << 8 | glyf[j + 1];\n          flagsCount = endPoint + 1;\n          j += 2;\n        }\n        var instructionsStart = j;\n        var instructionsLength = glyf[j] << 8 | glyf[j + 1];\n        j += 2 + instructionsLength;\n        var instructionsEnd = j;\n        var coordinatesLength = 0;\n        for (i = 0; i < flagsCount; i++) {\n          var flag = glyf[j++];\n          if (flag & 0xC0) {\n            glyf[j - 1] = flag & 0x3F;\n          }\n          var xyLength = (flag & 2 ? 1 : flag & 16 ? 0 : 2) + (flag & 4 ? 1 : flag & 32 ? 0 : 2);\n          coordinatesLength += xyLength;\n          if (flag & 8) {\n            var repeat = glyf[j++];\n            i += repeat;\n            coordinatesLength += repeat * xyLength;\n          }\n        }\n        if (coordinatesLength === 0) {\n          return 0;\n        }\n        var glyphDataLength = j + coordinatesLength;\n        if (glyphDataLength > glyf.length) {\n          return 0;\n        }\n        if (!hintsValid && instructionsLength > 0) {\n          dest.set(glyf.subarray(0, instructionsStart), destStart);\n          dest.set([0, 0], destStart + instructionsStart);\n          dest.set(glyf.subarray(instructionsEnd, glyphDataLength), destStart + instructionsStart + 2);\n          glyphDataLength -= instructionsLength;\n          if (glyf.length - glyphDataLength > 3) {\n            glyphDataLength = glyphDataLength + 3 & ~3;\n          }\n          return glyphDataLength;\n        }\n        if (glyf.length - glyphDataLength > 3) {\n          glyphDataLength = glyphDataLength + 3 & ~3;\n          dest.set(glyf.subarray(0, glyphDataLength), destStart);\n          return glyphDataLength;\n        }\n        dest.set(glyf, destStart);\n        return glyf.length;\n      }\n      function sanitizeHead(head, numGlyphs, locaLength) {\n        var data = head.data;\n        var version = int32(data[0], data[1], data[2], data[3]);\n        if (version >> 16 !== 1) {\n          (0, _util.info)('Attempting to fix invalid version in head table: ' + version);\n          data[0] = 0;\n          data[1] = 1;\n          data[2] = 0;\n          data[3] = 0;\n        }\n        var indexToLocFormat = int16(data[50], data[51]);\n        if (indexToLocFormat < 0 || indexToLocFormat > 1) {\n          (0, _util.info)('Attempting to fix invalid indexToLocFormat in head table: ' + indexToLocFormat);\n          var numGlyphsPlusOne = numGlyphs + 1;\n          if (locaLength === numGlyphsPlusOne << 1) {\n            data[50] = 0;\n            data[51] = 0;\n          } else if (locaLength === numGlyphsPlusOne << 2) {\n            data[50] = 0;\n            data[51] = 1;\n          } else {\n            throw new _util.FormatError('Could not fix indexToLocFormat: ' + indexToLocFormat);\n          }\n        }\n      }\n      function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry) {\n        var itemSize, itemDecode, itemEncode;\n        if (isGlyphLocationsLong) {\n          itemSize = 4;\n          itemDecode = function fontItemDecodeLong(data, offset) {\n            return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];\n          };\n          itemEncode = function fontItemEncodeLong(data, offset, value) {\n            data[offset] = value >>> 24 & 0xFF;\n            data[offset + 1] = value >> 16 & 0xFF;\n            data[offset + 2] = value >> 8 & 0xFF;\n            data[offset + 3] = value & 0xFF;\n          };\n        } else {\n          itemSize = 2;\n          itemDecode = function fontItemDecode(data, offset) {\n            return data[offset] << 9 | data[offset + 1] << 1;\n          };\n          itemEncode = function fontItemEncode(data, offset, value) {\n            data[offset] = value >> 9 & 0xFF;\n            data[offset + 1] = value >> 1 & 0xFF;\n          };\n        }\n        var locaData = loca.data;\n        var locaDataSize = itemSize * (1 + numGlyphs);\n        if (locaData.length !== locaDataSize) {\n          locaData = new Uint8Array(locaDataSize);\n          locaData.set(loca.data.subarray(0, locaDataSize));\n          loca.data = locaData;\n        }\n        var oldGlyfData = glyf.data;\n        var oldGlyfDataLength = oldGlyfData.length;\n        var newGlyfData = new Uint8Array(oldGlyfDataLength);\n        var startOffset = itemDecode(locaData, 0);\n        var writeOffset = 0;\n        var missingGlyphData = Object.create(null);\n        itemEncode(locaData, 0, writeOffset);\n        var i, j;\n        var locaCount = dupFirstEntry ? numGlyphs - 1 : numGlyphs;\n        for (i = 0, j = itemSize; i < locaCount; i++, j += itemSize) {\n          var endOffset = itemDecode(locaData, j);\n          if (endOffset > oldGlyfDataLength && (oldGlyfDataLength + 3 & ~3) === endOffset) {\n            endOffset = oldGlyfDataLength;\n          }\n          if (endOffset > oldGlyfDataLength) {\n            startOffset = endOffset;\n          }\n          var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset, newGlyfData, writeOffset, hintsValid);\n          if (newLength === 0) {\n            missingGlyphData[i] = true;\n          }\n          writeOffset += newLength;\n          itemEncode(locaData, j, writeOffset);\n          startOffset = endOffset;\n        }\n        if (writeOffset === 0) {\n          var simpleGlyph = new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);\n          for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {\n            itemEncode(locaData, j, simpleGlyph.length);\n          }\n          glyf.data = simpleGlyph;\n          return missingGlyphData;\n        }\n        if (dupFirstEntry) {\n          var firstEntryLength = itemDecode(locaData, itemSize);\n          if (newGlyfData.length > firstEntryLength + writeOffset) {\n            glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset);\n          } else {\n            glyf.data = new Uint8Array(firstEntryLength + writeOffset);\n            glyf.data.set(newGlyfData.subarray(0, writeOffset));\n          }\n          glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset);\n          itemEncode(loca.data, locaData.length - itemSize, writeOffset + firstEntryLength);\n        } else {\n          glyf.data = newGlyfData.subarray(0, writeOffset);\n        }\n        return missingGlyphData;\n      }\n      function readPostScriptTable(post, properties, maxpNumGlyphs) {\n        var start = (font.start ? font.start : 0) + post.offset;\n        font.pos = start;\n        var length = post.length,\n            end = start + length;\n        var version = font.getInt32();\n        font.getBytes(28);\n        var glyphNames;\n        var valid = true;\n        var i;\n        switch (version) {\n          case 0x00010000:\n            glyphNames = MacStandardGlyphOrdering;\n            break;\n          case 0x00020000:\n            var numGlyphs = font.getUint16();\n            if (numGlyphs !== maxpNumGlyphs) {\n              valid = false;\n              break;\n            }\n            var glyphNameIndexes = [];\n            for (i = 0; i < numGlyphs; ++i) {\n              var index = font.getUint16();\n              if (index >= 32768) {\n                valid = false;\n                break;\n              }\n              glyphNameIndexes.push(index);\n            }\n            if (!valid) {\n              break;\n            }\n            var customNames = [];\n            var strBuf = [];\n            while (font.pos < end) {\n              var stringLength = font.getByte();\n              strBuf.length = stringLength;\n              for (i = 0; i < stringLength; ++i) {\n                strBuf[i] = String.fromCharCode(font.getByte());\n              }\n              customNames.push(strBuf.join(''));\n            }\n            glyphNames = [];\n            for (i = 0; i < numGlyphs; ++i) {\n              var j = glyphNameIndexes[i];\n              if (j < 258) {\n                glyphNames.push(MacStandardGlyphOrdering[j]);\n                continue;\n              }\n              glyphNames.push(customNames[j - 258]);\n            }\n            break;\n          case 0x00030000:\n            break;\n          default:\n            (0, _util.warn)('Unknown/unsupported post table version ' + version);\n            valid = false;\n            if (properties.defaultEncoding) {\n              glyphNames = properties.defaultEncoding;\n            }\n            break;\n        }\n        properties.glyphNames = glyphNames;\n        return valid;\n      }\n      function readNameTable(nameTable) {\n        var start = (font.start ? font.start : 0) + nameTable.offset;\n        font.pos = start;\n        var names = [[], []];\n        var length = nameTable.length,\n            end = start + length;\n        var format = font.getUint16();\n        var FORMAT_0_HEADER_LENGTH = 6;\n        if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) {\n          return names;\n        }\n        var numRecords = font.getUint16();\n        var stringsStart = font.getUint16();\n        var records = [];\n        var NAME_RECORD_LENGTH = 12;\n        var i, ii;\n        for (i = 0; i < numRecords && font.pos + NAME_RECORD_LENGTH <= end; i++) {\n          var r = {\n            platform: font.getUint16(),\n            encoding: font.getUint16(),\n            language: font.getUint16(),\n            name: font.getUint16(),\n            length: font.getUint16(),\n            offset: font.getUint16()\n          };\n          if (r.platform === 1 && r.encoding === 0 && r.language === 0 || r.platform === 3 && r.encoding === 1 && r.language === 0x409) {\n            records.push(r);\n          }\n        }\n        for (i = 0, ii = records.length; i < ii; i++) {\n          var record = records[i];\n          if (record.length <= 0) {\n            continue;\n          }\n          var pos = start + stringsStart + record.offset;\n          if (pos + record.length > end) {\n            continue;\n          }\n          font.pos = pos;\n          var nameIndex = record.name;\n          if (record.encoding) {\n            var str = '';\n            for (var j = 0, jj = record.length; j < jj; j += 2) {\n              str += String.fromCharCode(font.getUint16());\n            }\n            names[1][nameIndex] = str;\n          } else {\n            names[0][nameIndex] = (0, _util.bytesToString)(font.getBytes(record.length));\n          }\n        }\n        return names;\n      }\n      var TTOpsStackDeltas = [0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, 0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2];\n      function sanitizeTTProgram(table, ttContext) {\n        var data = table.data;\n        var i = 0,\n            j,\n            n,\n            b,\n            funcId,\n            pc,\n            lastEndf = 0,\n            lastDeff = 0;\n        var stack = [];\n        var callstack = [];\n        var functionsCalled = [];\n        var tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions;\n        var inFDEF = false,\n            ifLevel = 0,\n            inELSE = 0;\n        for (var ii = data.length; i < ii;) {\n          var op = data[i++];\n          if (op === 0x40) {\n            n = data[i++];\n            if (inFDEF || inELSE) {\n              i += n;\n            } else {\n              for (j = 0; j < n; j++) {\n                stack.push(data[i++]);\n              }\n            }\n          } else if (op === 0x41) {\n            n = data[i++];\n            if (inFDEF || inELSE) {\n              i += n * 2;\n            } else {\n              for (j = 0; j < n; j++) {\n                b = data[i++];\n                stack.push(b << 8 | data[i++]);\n              }\n            }\n          } else if ((op & 0xF8) === 0xB0) {\n            n = op - 0xB0 + 1;\n            if (inFDEF || inELSE) {\n              i += n;\n            } else {\n              for (j = 0; j < n; j++) {\n                stack.push(data[i++]);\n              }\n            }\n          } else if ((op & 0xF8) === 0xB8) {\n            n = op - 0xB8 + 1;\n            if (inFDEF || inELSE) {\n              i += n * 2;\n            } else {\n              for (j = 0; j < n; j++) {\n                b = data[i++];\n                stack.push(b << 8 | data[i++]);\n              }\n            }\n          } else if (op === 0x2B && !tooComplexToFollowFunctions) {\n            if (!inFDEF && !inELSE) {\n              funcId = stack[stack.length - 1];\n              ttContext.functionsUsed[funcId] = true;\n              if (funcId in ttContext.functionsStackDeltas) {\n                stack.length += ttContext.functionsStackDeltas[funcId];\n              } else if (funcId in ttContext.functionsDefined && functionsCalled.indexOf(funcId) < 0) {\n                callstack.push({\n                  data: data,\n                  i: i,\n                  stackTop: stack.length - 1\n                });\n                functionsCalled.push(funcId);\n                pc = ttContext.functionsDefined[funcId];\n                if (!pc) {\n                  (0, _util.warn)('TT: CALL non-existent function');\n                  ttContext.hintsValid = false;\n                  return;\n                }\n                data = pc.data;\n                i = pc.i;\n              }\n            }\n          } else if (op === 0x2C && !tooComplexToFollowFunctions) {\n            if (inFDEF || inELSE) {\n              (0, _util.warn)('TT: nested FDEFs not allowed');\n              tooComplexToFollowFunctions = true;\n            }\n            inFDEF = true;\n            lastDeff = i;\n            funcId = stack.pop();\n            ttContext.functionsDefined[funcId] = {\n              data: data,\n              i: i\n            };\n          } else if (op === 0x2D) {\n            if (inFDEF) {\n              inFDEF = false;\n              lastEndf = i;\n            } else {\n              pc = callstack.pop();\n              if (!pc) {\n                (0, _util.warn)('TT: ENDF bad stack');\n                ttContext.hintsValid = false;\n                return;\n              }\n              funcId = functionsCalled.pop();\n              data = pc.data;\n              i = pc.i;\n              ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop;\n            }\n          } else if (op === 0x89) {\n            if (inFDEF || inELSE) {\n              (0, _util.warn)('TT: nested IDEFs not allowed');\n              tooComplexToFollowFunctions = true;\n            }\n            inFDEF = true;\n            lastDeff = i;\n          } else if (op === 0x58) {\n            ++ifLevel;\n          } else if (op === 0x1B) {\n            inELSE = ifLevel;\n          } else if (op === 0x59) {\n            if (inELSE === ifLevel) {\n              inELSE = 0;\n            }\n            --ifLevel;\n          } else if (op === 0x1C) {\n            if (!inFDEF && !inELSE) {\n              var offset = stack[stack.length - 1];\n              if (offset > 0) {\n                i += offset - 1;\n              }\n            }\n          }\n          if (!inFDEF && !inELSE) {\n            var stackDelta = op <= 0x8E ? TTOpsStackDeltas[op] : op >= 0xC0 && op <= 0xDF ? -1 : op >= 0xE0 ? -2 : 0;\n            if (op >= 0x71 && op <= 0x75) {\n              n = stack.pop();\n              if (!isNaN(n)) {\n                stackDelta = -n * 2;\n              }\n            }\n            while (stackDelta < 0 && stack.length > 0) {\n              stack.pop();\n              stackDelta++;\n            }\n            while (stackDelta > 0) {\n              stack.push(NaN);\n              stackDelta--;\n            }\n          }\n        }\n        ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions;\n        var content = [data];\n        if (i > data.length) {\n          content.push(new Uint8Array(i - data.length));\n        }\n        if (lastDeff > lastEndf) {\n          (0, _util.warn)('TT: complementing a missing function tail');\n          content.push(new Uint8Array([0x22, 0x2D]));\n        }\n        foldTTTable(table, content);\n      }\n      function checkInvalidFunctions(ttContext, maxFunctionDefs) {\n        if (ttContext.tooComplexToFollowFunctions) {\n          return;\n        }\n        if (ttContext.functionsDefined.length > maxFunctionDefs) {\n          (0, _util.warn)('TT: more functions defined than expected');\n          ttContext.hintsValid = false;\n          return;\n        }\n        for (var j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) {\n          if (j > maxFunctionDefs) {\n            (0, _util.warn)('TT: invalid function id: ' + j);\n            ttContext.hintsValid = false;\n            return;\n          }\n          if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) {\n            (0, _util.warn)('TT: undefined function: ' + j);\n            ttContext.hintsValid = false;\n            return;\n          }\n        }\n      }\n      function foldTTTable(table, content) {\n        if (content.length > 1) {\n          var newLength = 0;\n          var j, jj;\n          for (j = 0, jj = content.length; j < jj; j++) {\n            newLength += content[j].length;\n          }\n          newLength = newLength + 3 & ~3;\n          var result = new Uint8Array(newLength);\n          var pos = 0;\n          for (j = 0, jj = content.length; j < jj; j++) {\n            result.set(content[j], pos);\n            pos += content[j].length;\n          }\n          table.data = result;\n          table.length = newLength;\n        }\n      }\n      function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) {\n        var ttContext = {\n          functionsDefined: [],\n          functionsUsed: [],\n          functionsStackDeltas: [],\n          tooComplexToFollowFunctions: false,\n          hintsValid: true\n        };\n        if (fpgm) {\n          sanitizeTTProgram(fpgm, ttContext);\n        }\n        if (prep) {\n          sanitizeTTProgram(prep, ttContext);\n        }\n        if (fpgm) {\n          checkInvalidFunctions(ttContext, maxFunctionDefs);\n        }\n        if (cvt && cvt.length & 1) {\n          var cvtData = new Uint8Array(cvt.length + 1);\n          cvtData.set(cvt.data);\n          cvt.data = cvtData;\n        }\n        return ttContext.hintsValid;\n      }\n      font = new _stream.Stream(new Uint8Array(font.getBytes()));\n      var VALID_TABLES = ['OS/2', 'cmap', 'head', 'hhea', 'hmtx', 'maxp', 'name', 'post', 'loca', 'glyf', 'fpgm', 'prep', 'cvt ', 'CFF '];\n      var header = readOpenTypeHeader(font);\n      var numTables = header.numTables;\n      var cff, cffFile;\n      var tables = Object.create(null);\n      tables['OS/2'] = null;\n      tables['cmap'] = null;\n      tables['head'] = null;\n      tables['hhea'] = null;\n      tables['hmtx'] = null;\n      tables['maxp'] = null;\n      tables['name'] = null;\n      tables['post'] = null;\n      var table;\n      for (var i = 0; i < numTables; i++) {\n        table = readTableEntry(font);\n        if (VALID_TABLES.indexOf(table.tag) < 0) {\n          continue;\n        }\n        if (table.length === 0) {\n          continue;\n        }\n        tables[table.tag] = table;\n      }\n      var isTrueType = !tables['CFF '];\n      if (!isTrueType) {\n        if (header.version === 'OTTO' && !(properties.composite && properties.cidToGidMap) || !tables['head'] || !tables['hhea'] || !tables['maxp'] || !tables['post']) {\n          cffFile = new _stream.Stream(tables['CFF '].data);\n          cff = new CFFFont(cffFile, properties);\n          adjustWidths(properties);\n          return this.convert(name, cff, properties);\n        }\n        delete tables['glyf'];\n        delete tables['loca'];\n        delete tables['fpgm'];\n        delete tables['prep'];\n        delete tables['cvt '];\n        this.isOpenType = true;\n      } else {\n        if (!tables['loca']) {\n          throw new _util.FormatError('Required \"loca\" table is not found');\n        }\n        if (!tables['glyf']) {\n          (0, _util.warn)('Required \"glyf\" table is not found -- trying to recover.');\n          tables['glyf'] = {\n            tag: 'glyf',\n            data: new Uint8Array(0)\n          };\n        }\n        this.isOpenType = false;\n      }\n      if (!tables['maxp']) {\n        throw new _util.FormatError('Required \"maxp\" table is not found');\n      }\n      font.pos = (font.start || 0) + tables['maxp'].offset;\n      var version = font.getInt32();\n      var numGlyphs = font.getUint16();\n      var maxFunctionDefs = 0;\n      if (version >= 0x00010000 && tables['maxp'].length >= 22) {\n        font.pos += 8;\n        var maxZones = font.getUint16();\n        if (maxZones > 2) {\n          tables['maxp'].data[14] = 0;\n          tables['maxp'].data[15] = 2;\n        }\n        font.pos += 4;\n        maxFunctionDefs = font.getUint16();\n      }\n      var dupFirstEntry = false;\n      if (properties.type === 'CIDFontType2' && properties.toUnicode && properties.toUnicode.get(0) > '\\0') {\n        dupFirstEntry = true;\n        numGlyphs++;\n        tables['maxp'].data[4] = numGlyphs >> 8;\n        tables['maxp'].data[5] = numGlyphs & 255;\n      }\n      var hintsValid = sanitizeTTPrograms(tables['fpgm'], tables['prep'], tables['cvt '], maxFunctionDefs);\n      if (!hintsValid) {\n        delete tables['fpgm'];\n        delete tables['prep'];\n        delete tables['cvt '];\n      }\n      sanitizeMetrics(font, tables['hhea'], tables['hmtx'], numGlyphs);\n      if (!tables['head']) {\n        throw new _util.FormatError('Required \"head\" table is not found');\n      }\n      sanitizeHead(tables['head'], numGlyphs, isTrueType ? tables['loca'].length : 0);\n      var missingGlyphs = Object.create(null);\n      if (isTrueType) {\n        var isGlyphLocationsLong = int16(tables['head'].data[50], tables['head'].data[51]);\n        missingGlyphs = sanitizeGlyphLocations(tables['loca'], tables['glyf'], numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry);\n      }\n      if (!tables['hhea']) {\n        throw new _util.FormatError('Required \"hhea\" table is not found');\n      }\n      if (tables['hhea'].data[10] === 0 && tables['hhea'].data[11] === 0) {\n        tables['hhea'].data[10] = 0xFF;\n        tables['hhea'].data[11] = 0xFF;\n      }\n      var metricsOverride = {\n        unitsPerEm: int16(tables['head'].data[18], tables['head'].data[19]),\n        yMax: int16(tables['head'].data[42], tables['head'].data[43]),\n        yMin: signedInt16(tables['head'].data[38], tables['head'].data[39]),\n        ascent: int16(tables['hhea'].data[4], tables['hhea'].data[5]),\n        descent: signedInt16(tables['hhea'].data[6], tables['hhea'].data[7])\n      };\n      this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm;\n      this.descent = metricsOverride.descent / metricsOverride.unitsPerEm;\n      if (tables['post']) {\n        var valid = readPostScriptTable(tables['post'], properties, numGlyphs);\n        if (!valid) {\n          tables['post'] = null;\n        }\n      }\n      var charCodeToGlyphId = [],\n          charCode;\n      function hasGlyph(glyphId) {\n        return !missingGlyphs[glyphId];\n      }\n      if (properties.composite) {\n        var cidToGidMap = properties.cidToGidMap || [];\n        var isCidToGidMapEmpty = cidToGidMap.length === 0;\n        properties.cMap.forEach(function (charCode, cid) {\n          if (cid > 0xffff) {\n            throw new _util.FormatError('Max size of CID is 65,535');\n          }\n          var glyphId = -1;\n          if (isCidToGidMapEmpty) {\n            glyphId = cid;\n          } else if (cidToGidMap[cid] !== undefined) {\n            glyphId = cidToGidMap[cid];\n          }\n          if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId)) {\n            charCodeToGlyphId[charCode] = glyphId;\n          }\n        });\n        if (dupFirstEntry && (isCidToGidMapEmpty || !charCodeToGlyphId[0])) {\n          charCodeToGlyphId[0] = numGlyphs - 1;\n        }\n      } else {\n        var cmapTable = readCmapTable(tables['cmap'], font, this.isSymbolicFont, properties.hasEncoding);\n        var cmapPlatformId = cmapTable.platformId;\n        var cmapEncodingId = cmapTable.encodingId;\n        var cmapMappings = cmapTable.mappings;\n        var cmapMappingsLength = cmapMappings.length;\n        if (properties.hasEncoding && (cmapPlatformId === 3 && cmapEncodingId === 1 || cmapPlatformId === 1 && cmapEncodingId === 0) || cmapPlatformId === -1 && cmapEncodingId === -1 && !!(0, _encodings.getEncoding)(properties.baseEncodingName)) {\n          var baseEncoding = [];\n          if (properties.baseEncodingName === 'MacRomanEncoding' || properties.baseEncodingName === 'WinAnsiEncoding') {\n            baseEncoding = (0, _encodings.getEncoding)(properties.baseEncodingName);\n          }\n          var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n          for (charCode = 0; charCode < 256; charCode++) {\n            var glyphName, standardGlyphName;\n            if (this.differences && charCode in this.differences) {\n              glyphName = this.differences[charCode];\n            } else if (charCode in baseEncoding && baseEncoding[charCode] !== '') {\n              glyphName = baseEncoding[charCode];\n            } else {\n              glyphName = _encodings.StandardEncoding[charCode];\n            }\n            if (!glyphName) {\n              continue;\n            }\n            standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);\n            var unicodeOrCharCode;\n            if (cmapPlatformId === 3 && cmapEncodingId === 1) {\n              unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName];\n            } else if (cmapPlatformId === 1 && cmapEncodingId === 0) {\n              unicodeOrCharCode = _encodings.MacRomanEncoding.indexOf(standardGlyphName);\n            }\n            var found = false;\n            for (i = 0; i < cmapMappingsLength; ++i) {\n              if (cmapMappings[i].charCode !== unicodeOrCharCode) {\n                continue;\n              }\n              charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;\n              found = true;\n              break;\n            }\n            if (!found && properties.glyphNames) {\n              var glyphId = properties.glyphNames.indexOf(glyphName);\n              if (glyphId === -1 && standardGlyphName !== glyphName) {\n                glyphId = properties.glyphNames.indexOf(standardGlyphName);\n              }\n              if (glyphId > 0 && hasGlyph(glyphId)) {\n                charCodeToGlyphId[charCode] = glyphId;\n                found = true;\n              }\n            }\n          }\n        } else if (cmapPlatformId === 0 && cmapEncodingId === 0) {\n          for (i = 0; i < cmapMappingsLength; ++i) {\n            charCodeToGlyphId[cmapMappings[i].charCode] = cmapMappings[i].glyphId;\n          }\n        } else {\n          for (i = 0; i < cmapMappingsLength; ++i) {\n            charCode = cmapMappings[i].charCode;\n            if (cmapPlatformId === 3 && charCode >= 0xF000 && charCode <= 0xF0FF) {\n              charCode &= 0xFF;\n            }\n            charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;\n          }\n        }\n      }\n      if (charCodeToGlyphId.length === 0) {\n        charCodeToGlyphId[0] = 0;\n      }\n      var newMapping = adjustMapping(charCodeToGlyphId, properties, missingGlyphs);\n      this.toFontChar = newMapping.toFontChar;\n      tables['cmap'] = {\n        tag: 'cmap',\n        data: createCmapTable(newMapping.charCodeToGlyphId, numGlyphs)\n      };\n      if (!tables['OS/2'] || !validateOS2Table(tables['OS/2'])) {\n        tables['OS/2'] = {\n          tag: 'OS/2',\n          data: createOS2Table(properties, newMapping.charCodeToGlyphId, metricsOverride)\n        };\n      }\n      if (!tables['post']) {\n        tables['post'] = {\n          tag: 'post',\n          data: createPostTable(properties)\n        };\n      }\n      if (!isTrueType) {\n        try {\n          cffFile = new _stream.Stream(tables['CFF '].data);\n          var parser = new _cff_parser.CFFParser(cffFile, properties, SEAC_ANALYSIS_ENABLED);\n          cff = parser.parse();\n          var compiler = new _cff_parser.CFFCompiler(cff);\n          tables['CFF '].data = compiler.compile();\n        } catch (e) {\n          (0, _util.warn)('Failed to compile font ' + properties.loadedName);\n        }\n      }\n      if (!tables['name']) {\n        tables['name'] = {\n          tag: 'name',\n          data: createNameTable(this.name)\n        };\n      } else {\n        var namePrototype = readNameTable(tables['name']);\n        tables['name'].data = createNameTable(name, namePrototype);\n      }\n      var builder = new OpenTypeFileBuilder(header.version);\n      for (var tableTag in tables) {\n        builder.addTable(tableTag, tables[tableTag].data);\n      }\n      return builder.toArray();\n    },\n    convert: function Font_convert(fontName, font, properties) {\n      properties.fixedPitch = false;\n      if (properties.builtInEncoding) {\n        adjustToUnicode(properties, properties.builtInEncoding);\n      }\n      var mapping = font.getGlyphMapping(properties);\n      var newMapping = adjustMapping(mapping, properties, Object.create(null));\n      this.toFontChar = newMapping.toFontChar;\n      var numGlyphs = font.numGlyphs;\n      function getCharCodes(charCodeToGlyphId, glyphId) {\n        var charCodes = null;\n        for (var charCode in charCodeToGlyphId) {\n          if (glyphId === charCodeToGlyphId[charCode]) {\n            if (!charCodes) {\n              charCodes = [];\n            }\n            charCodes.push(charCode | 0);\n          }\n        }\n        return charCodes;\n      }\n      function createCharCode(charCodeToGlyphId, glyphId) {\n        for (var charCode in charCodeToGlyphId) {\n          if (glyphId === charCodeToGlyphId[charCode]) {\n            return charCode | 0;\n          }\n        }\n        newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = glyphId;\n        return newMapping.nextAvailableFontCharCode++;\n      }\n      var seacs = font.seacs;\n      if (SEAC_ANALYSIS_ENABLED && seacs && seacs.length) {\n        var matrix = properties.fontMatrix || _util.FONT_IDENTITY_MATRIX;\n        var charset = font.getCharset();\n        var seacMap = Object.create(null);\n        for (var glyphId in seacs) {\n          glyphId |= 0;\n          var seac = seacs[glyphId];\n          var baseGlyphName = _encodings.StandardEncoding[seac[2]];\n          var accentGlyphName = _encodings.StandardEncoding[seac[3]];\n          var baseGlyphId = charset.indexOf(baseGlyphName);\n          var accentGlyphId = charset.indexOf(accentGlyphName);\n          if (baseGlyphId < 0 || accentGlyphId < 0) {\n            continue;\n          }\n          var accentOffset = {\n            x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4],\n            y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5]\n          };\n          var charCodes = getCharCodes(mapping, glyphId);\n          if (!charCodes) {\n            continue;\n          }\n          for (var i = 0, ii = charCodes.length; i < ii; i++) {\n            var charCode = charCodes[i];\n            var charCodeToGlyphId = newMapping.charCodeToGlyphId;\n            var baseFontCharCode = createCharCode(charCodeToGlyphId, baseGlyphId);\n            var accentFontCharCode = createCharCode(charCodeToGlyphId, accentGlyphId);\n            seacMap[charCode] = {\n              baseFontCharCode: baseFontCharCode,\n              accentFontCharCode: accentFontCharCode,\n              accentOffset: accentOffset\n            };\n          }\n        }\n        properties.seacMap = seacMap;\n      }\n      var unitsPerEm = 1 / (properties.fontMatrix || _util.FONT_IDENTITY_MATRIX)[0];\n      var builder = new OpenTypeFileBuilder('\\x4F\\x54\\x54\\x4F');\n      builder.addTable('CFF ', font.data);\n      builder.addTable('OS/2', createOS2Table(properties, newMapping.charCodeToGlyphId));\n      builder.addTable('cmap', createCmapTable(newMapping.charCodeToGlyphId, numGlyphs));\n      builder.addTable('head', '\\x00\\x01\\x00\\x00' + '\\x00\\x00\\x10\\x00' + '\\x00\\x00\\x00\\x00' + '\\x5F\\x0F\\x3C\\xF5' + '\\x00\\x00' + safeString16(unitsPerEm) + '\\x00\\x00\\x00\\x00\\x9e\\x0b\\x7e\\x27' + '\\x00\\x00\\x00\\x00\\x9e\\x0b\\x7e\\x27' + '\\x00\\x00' + safeString16(properties.descent) + '\\x0F\\xFF' + safeString16(properties.ascent) + string16(properties.italicAngle ? 2 : 0) + '\\x00\\x11' + '\\x00\\x00' + '\\x00\\x00' + '\\x00\\x00');\n      builder.addTable('hhea', '\\x00\\x01\\x00\\x00' + safeString16(properties.ascent) + safeString16(properties.descent) + '\\x00\\x00' + '\\xFF\\xFF' + '\\x00\\x00' + '\\x00\\x00' + '\\x00\\x00' + safeString16(properties.capHeight) + safeString16(Math.tan(properties.italicAngle) * properties.xHeight) + '\\x00\\x00' + '\\x00\\x00' + '\\x00\\x00' + '\\x00\\x00' + '\\x00\\x00' + '\\x00\\x00' + string16(numGlyphs));\n      builder.addTable('hmtx', function fontFieldsHmtx() {\n        var charstrings = font.charstrings;\n        var cffWidths = font.cff ? font.cff.widths : null;\n        var hmtx = '\\x00\\x00\\x00\\x00';\n        for (var i = 1, ii = numGlyphs; i < ii; i++) {\n          var width = 0;\n          if (charstrings) {\n            var charstring = charstrings[i - 1];\n            width = 'width' in charstring ? charstring.width : 0;\n          } else if (cffWidths) {\n            width = Math.ceil(cffWidths[i] || 0);\n          }\n          hmtx += string16(width) + string16(0);\n        }\n        return hmtx;\n      }());\n      builder.addTable('maxp', '\\x00\\x00\\x50\\x00' + string16(numGlyphs));\n      builder.addTable('name', createNameTable(fontName));\n      builder.addTable('post', createPostTable(properties));\n      return builder.toArray();\n    },\n    get spaceWidth() {\n      if ('_shadowWidth' in this) {\n        return this._shadowWidth;\n      }\n      var possibleSpaceReplacements = ['space', 'minus', 'one', 'i', 'I'];\n      var width;\n      for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {\n        var glyphName = possibleSpaceReplacements[i];\n        if (glyphName in this.widths) {\n          width = this.widths[glyphName];\n          break;\n        }\n        var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n        var glyphUnicode = glyphsUnicodeMap[glyphName];\n        var charcode = 0;\n        if (this.composite) {\n          if (this.cMap.contains(glyphUnicode)) {\n            charcode = this.cMap.lookup(glyphUnicode);\n          }\n        }\n        if (!charcode && this.toUnicode) {\n          charcode = this.toUnicode.charCodeOf(glyphUnicode);\n        }\n        if (charcode <= 0) {\n          charcode = glyphUnicode;\n        }\n        width = this.widths[charcode];\n        if (width) {\n          break;\n        }\n      }\n      width = width || this.defaultWidth;\n      this._shadowWidth = width;\n      return width;\n    },\n    charToGlyph: function Font_charToGlyph(charcode, isSpace) {\n      var fontCharCode, width, operatorListId;\n      var widthCode = charcode;\n      if (this.cMap && this.cMap.contains(charcode)) {\n        widthCode = this.cMap.lookup(charcode);\n      }\n      width = this.widths[widthCode];\n      width = (0, _util.isNum)(width) ? width : this.defaultWidth;\n      var vmetric = this.vmetrics && this.vmetrics[widthCode];\n      var unicode = this.toUnicode.get(charcode) || charcode;\n      if (typeof unicode === 'number') {\n        unicode = String.fromCharCode(unicode);\n      }\n      var isInFont = charcode in this.toFontChar;\n      fontCharCode = this.toFontChar[charcode] || charcode;\n      if (this.missingFile) {\n        fontCharCode = (0, _unicode.mapSpecialUnicodeValues)(fontCharCode);\n      }\n      if (this.isType3Font) {\n        operatorListId = fontCharCode;\n      }\n      var accent = null;\n      if (this.seacMap && this.seacMap[charcode]) {\n        isInFont = true;\n        var seac = this.seacMap[charcode];\n        fontCharCode = seac.baseFontCharCode;\n        accent = {\n          fontChar: String.fromCharCode(seac.accentFontCharCode),\n          offset: seac.accentOffset\n        };\n      }\n      var fontChar = String.fromCharCode(fontCharCode);\n      var glyph = this.glyphCache[charcode];\n      if (!glyph || !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont)) {\n        glyph = new Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont);\n        this.glyphCache[charcode] = glyph;\n      }\n      return glyph;\n    },\n    charsToGlyphs: function Font_charsToGlyphs(chars) {\n      var charsCache = this.charsCache;\n      var glyphs, glyph, charcode;\n      if (charsCache) {\n        glyphs = charsCache[chars];\n        if (glyphs) {\n          return glyphs;\n        }\n      }\n      if (!charsCache) {\n        charsCache = this.charsCache = Object.create(null);\n      }\n      glyphs = [];\n      var charsCacheKey = chars;\n      var i = 0,\n          ii;\n      if (this.cMap) {\n        var c = Object.create(null);\n        while (i < chars.length) {\n          this.cMap.readCharCode(chars, i, c);\n          charcode = c.charcode;\n          var length = c.length;\n          i += length;\n          var isSpace = length === 1 && chars.charCodeAt(i - 1) === 0x20;\n          glyph = this.charToGlyph(charcode, isSpace);\n          glyphs.push(glyph);\n        }\n      } else {\n        for (i = 0, ii = chars.length; i < ii; ++i) {\n          charcode = chars.charCodeAt(i);\n          glyph = this.charToGlyph(charcode, charcode === 0x20);\n          glyphs.push(glyph);\n        }\n      }\n      return charsCache[charsCacheKey] = glyphs;\n    }\n  };\n  return Font;\n}();\nvar ErrorFont = function ErrorFontClosure() {\n  function ErrorFont(error) {\n    this.error = error;\n    this.loadedName = 'g_font_error';\n    this.loading = false;\n  }\n  ErrorFont.prototype = {\n    charsToGlyphs: function ErrorFont_charsToGlyphs() {\n      return [];\n    },\n    exportData: function ErrorFont_exportData() {\n      return { error: this.error };\n    }\n  };\n  return ErrorFont;\n}();\nfunction type1FontGlyphMapping(properties, builtInEncoding, glyphNames) {\n  var charCodeToGlyphId = Object.create(null);\n  var glyphId, charCode, baseEncoding;\n  var isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);\n  if (properties.baseEncodingName) {\n    baseEncoding = (0, _encodings.getEncoding)(properties.baseEncodingName);\n    for (charCode = 0; charCode < baseEncoding.length; charCode++) {\n      glyphId = glyphNames.indexOf(baseEncoding[charCode]);\n      if (glyphId >= 0) {\n        charCodeToGlyphId[charCode] = glyphId;\n      } else {\n        charCodeToGlyphId[charCode] = 0;\n      }\n    }\n  } else if (isSymbolicFont) {\n    for (charCode in builtInEncoding) {\n      charCodeToGlyphId[charCode] = builtInEncoding[charCode];\n    }\n  } else {\n    baseEncoding = _encodings.StandardEncoding;\n    for (charCode = 0; charCode < baseEncoding.length; charCode++) {\n      glyphId = glyphNames.indexOf(baseEncoding[charCode]);\n      if (glyphId >= 0) {\n        charCodeToGlyphId[charCode] = glyphId;\n      } else {\n        charCodeToGlyphId[charCode] = 0;\n      }\n    }\n  }\n  var differences = properties.differences,\n      glyphsUnicodeMap;\n  if (differences) {\n    for (charCode in differences) {\n      var glyphName = differences[charCode];\n      glyphId = glyphNames.indexOf(glyphName);\n      if (glyphId === -1) {\n        if (!glyphsUnicodeMap) {\n          glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n        }\n        var standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);\n        if (standardGlyphName !== glyphName) {\n          glyphId = glyphNames.indexOf(standardGlyphName);\n        }\n      }\n      if (glyphId >= 0) {\n        charCodeToGlyphId[charCode] = glyphId;\n      } else {\n        charCodeToGlyphId[charCode] = 0;\n      }\n    }\n  }\n  return charCodeToGlyphId;\n}\nvar Type1Font = function Type1FontClosure() {\n  function findBlock(streamBytes, signature, startIndex) {\n    var streamBytesLength = streamBytes.length;\n    var signatureLength = signature.length;\n    var scanLength = streamBytesLength - signatureLength;\n    var i = startIndex,\n        j,\n        found = false;\n    while (i < scanLength) {\n      j = 0;\n      while (j < signatureLength && streamBytes[i + j] === signature[j]) {\n        j++;\n      }\n      if (j >= signatureLength) {\n        i += j;\n        while (i < streamBytesLength && (0, _util.isSpace)(streamBytes[i])) {\n          i++;\n        }\n        found = true;\n        break;\n      }\n      i++;\n    }\n    return {\n      found: found,\n      length: i\n    };\n  }\n  function getHeaderBlock(stream, suggestedLength) {\n    var EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63];\n    var streamStartPos = stream.pos;\n    var headerBytes, headerBytesLength, block;\n    try {\n      headerBytes = stream.getBytes(suggestedLength);\n      headerBytesLength = headerBytes.length;\n    } catch (ex) {\n      if (ex instanceof _util.MissingDataException) {\n        throw ex;\n      }\n    }\n    if (headerBytesLength === suggestedLength) {\n      block = findBlock(headerBytes, EEXEC_SIGNATURE, suggestedLength - 2 * EEXEC_SIGNATURE.length);\n      if (block.found && block.length === suggestedLength) {\n        return {\n          stream: new _stream.Stream(headerBytes),\n          length: suggestedLength\n        };\n      }\n    }\n    (0, _util.warn)('Invalid \"Length1\" property in Type1 font -- trying to recover.');\n    stream.pos = streamStartPos;\n    var SCAN_BLOCK_LENGTH = 2048;\n    var actualLength;\n    while (true) {\n      var scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);\n      block = findBlock(scanBytes, EEXEC_SIGNATURE, 0);\n      if (block.length === 0) {\n        break;\n      }\n      stream.pos += block.length;\n      if (block.found) {\n        actualLength = stream.pos - streamStartPos;\n        break;\n      }\n    }\n    stream.pos = streamStartPos;\n    if (actualLength) {\n      return {\n        stream: new _stream.Stream(stream.getBytes(actualLength)),\n        length: actualLength\n      };\n    }\n    (0, _util.warn)('Unable to recover \"Length1\" property in Type1 font -- using as is.');\n    return {\n      stream: new _stream.Stream(stream.getBytes(suggestedLength)),\n      length: suggestedLength\n    };\n  }\n  function getEexecBlock(stream, suggestedLength) {\n    var eexecBytes = stream.getBytes();\n    return {\n      stream: new _stream.Stream(eexecBytes),\n      length: eexecBytes.length\n    };\n  }\n  function Type1Font(name, file, properties) {\n    var PFB_HEADER_SIZE = 6;\n    var headerBlockLength = properties.length1;\n    var eexecBlockLength = properties.length2;\n    var pfbHeader = file.peekBytes(PFB_HEADER_SIZE);\n    var pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01;\n    if (pfbHeaderPresent) {\n      file.skip(PFB_HEADER_SIZE);\n      headerBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];\n    }\n    var headerBlock = getHeaderBlock(file, headerBlockLength);\n    headerBlockLength = headerBlock.length;\n    var headerBlockParser = new _type1_parser.Type1Parser(headerBlock.stream, false, SEAC_ANALYSIS_ENABLED);\n    headerBlockParser.extractFontHeader(properties);\n    if (pfbHeaderPresent) {\n      pfbHeader = file.getBytes(PFB_HEADER_SIZE);\n      eexecBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];\n    }\n    var eexecBlock = getEexecBlock(file, eexecBlockLength);\n    eexecBlockLength = eexecBlock.length;\n    var eexecBlockParser = new _type1_parser.Type1Parser(eexecBlock.stream, true, SEAC_ANALYSIS_ENABLED);\n    var data = eexecBlockParser.extractFontProgram();\n    for (var info in data.properties) {\n      properties[info] = data.properties[info];\n    }\n    var charstrings = data.charstrings;\n    var type2Charstrings = this.getType2Charstrings(charstrings);\n    var subrs = this.getType2Subrs(data.subrs);\n    this.charstrings = charstrings;\n    this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties);\n    this.seacs = this.getSeacs(data.charstrings);\n  }\n  Type1Font.prototype = {\n    get numGlyphs() {\n      return this.charstrings.length + 1;\n    },\n    getCharset: function Type1Font_getCharset() {\n      var charset = ['.notdef'];\n      var charstrings = this.charstrings;\n      for (var glyphId = 0; glyphId < charstrings.length; glyphId++) {\n        charset.push(charstrings[glyphId].glyphName);\n      }\n      return charset;\n    },\n    getGlyphMapping: function Type1Font_getGlyphMapping(properties) {\n      var charstrings = this.charstrings;\n      var glyphNames = ['.notdef'],\n          glyphId;\n      for (glyphId = 0; glyphId < charstrings.length; glyphId++) {\n        glyphNames.push(charstrings[glyphId].glyphName);\n      }\n      var encoding = properties.builtInEncoding;\n      if (encoding) {\n        var builtInEncoding = Object.create(null);\n        for (var charCode in encoding) {\n          glyphId = glyphNames.indexOf(encoding[charCode]);\n          if (glyphId >= 0) {\n            builtInEncoding[charCode] = glyphId;\n          }\n        }\n      }\n      return type1FontGlyphMapping(properties, builtInEncoding, glyphNames);\n    },\n    getSeacs: function Type1Font_getSeacs(charstrings) {\n      var i, ii;\n      var seacMap = [];\n      for (i = 0, ii = charstrings.length; i < ii; i++) {\n        var charstring = charstrings[i];\n        if (charstring.seac) {\n          seacMap[i + 1] = charstring.seac;\n        }\n      }\n      return seacMap;\n    },\n    getType2Charstrings: function Type1Font_getType2Charstrings(type1Charstrings) {\n      var type2Charstrings = [];\n      for (var i = 0, ii = type1Charstrings.length; i < ii; i++) {\n        type2Charstrings.push(type1Charstrings[i].charstring);\n      }\n      return type2Charstrings;\n    },\n    getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {\n      var bias = 0;\n      var count = type1Subrs.length;\n      if (count < 1133) {\n        bias = 107;\n      } else if (count < 33769) {\n        bias = 1131;\n      } else {\n        bias = 32768;\n      }\n      var type2Subrs = [];\n      var i;\n      for (i = 0; i < bias; i++) {\n        type2Subrs.push([0x0B]);\n      }\n      for (i = 0; i < count; i++) {\n        type2Subrs.push(type1Subrs[i]);\n      }\n      return type2Subrs;\n    },\n    wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) {\n      var cff = new _cff_parser.CFF();\n      cff.header = new _cff_parser.CFFHeader(1, 0, 4, 4);\n      cff.names = [name];\n      var topDict = new _cff_parser.CFFTopDict();\n      topDict.setByName('version', 391);\n      topDict.setByName('Notice', 392);\n      topDict.setByName('FullName', 393);\n      topDict.setByName('FamilyName', 394);\n      topDict.setByName('Weight', 395);\n      topDict.setByName('Encoding', null);\n      topDict.setByName('FontMatrix', properties.fontMatrix);\n      topDict.setByName('FontBBox', properties.bbox);\n      topDict.setByName('charset', null);\n      topDict.setByName('CharStrings', null);\n      topDict.setByName('Private', null);\n      cff.topDict = topDict;\n      var strings = new _cff_parser.CFFStrings();\n      strings.add('Version 0.11');\n      strings.add('See original notice');\n      strings.add(name);\n      strings.add(name);\n      strings.add('Medium');\n      cff.strings = strings;\n      cff.globalSubrIndex = new _cff_parser.CFFIndex();\n      var count = glyphs.length;\n      var charsetArray = [0];\n      var i, ii;\n      for (i = 0; i < count; i++) {\n        var index = _cff_parser.CFFStandardStrings.indexOf(charstrings[i].glyphName);\n        if (index === -1) {\n          index = 0;\n        }\n        charsetArray.push(index >> 8 & 0xff, index & 0xff);\n      }\n      cff.charset = new _cff_parser.CFFCharset(false, 0, [], charsetArray);\n      var charStringsIndex = new _cff_parser.CFFIndex();\n      charStringsIndex.add([0x8B, 0x0E]);\n      for (i = 0; i < count; i++) {\n        var glyph = glyphs[i];\n        if (glyph.length === 0) {\n          charStringsIndex.add([0x8B, 0x0E]);\n          continue;\n        }\n        charStringsIndex.add(glyph);\n      }\n      cff.charStrings = charStringsIndex;\n      var privateDict = new _cff_parser.CFFPrivateDict();\n      privateDict.setByName('Subrs', null);\n      var fields = ['BlueValues', 'OtherBlues', 'FamilyBlues', 'FamilyOtherBlues', 'StemSnapH', 'StemSnapV', 'BlueShift', 'BlueFuzz', 'BlueScale', 'LanguageGroup', 'ExpansionFactor', 'ForceBold', 'StdHW', 'StdVW'];\n      for (i = 0, ii = fields.length; i < ii; i++) {\n        var field = fields[i];\n        if (!(field in properties.privateData)) {\n          continue;\n        }\n        var value = properties.privateData[field];\n        if ((0, _util.isArray)(value)) {\n          for (var j = value.length - 1; j > 0; j--) {\n            value[j] -= value[j - 1];\n          }\n        }\n        privateDict.setByName(field, value);\n      }\n      cff.topDict.privateDict = privateDict;\n      var subrIndex = new _cff_parser.CFFIndex();\n      for (i = 0, ii = subrs.length; i < ii; i++) {\n        subrIndex.add(subrs[i]);\n      }\n      privateDict.subrsIndex = subrIndex;\n      var compiler = new _cff_parser.CFFCompiler(cff);\n      return compiler.compile();\n    }\n  };\n  return Type1Font;\n}();\nvar CFFFont = function CFFFontClosure() {\n  function CFFFont(file, properties) {\n    this.properties = properties;\n    var parser = new _cff_parser.CFFParser(file, properties, SEAC_ANALYSIS_ENABLED);\n    this.cff = parser.parse();\n    var compiler = new _cff_parser.CFFCompiler(this.cff);\n    this.seacs = this.cff.seacs;\n    try {\n      this.data = compiler.compile();\n    } catch (e) {\n      (0, _util.warn)('Failed to compile font ' + properties.loadedName);\n      this.data = file;\n    }\n  }\n  CFFFont.prototype = {\n    get numGlyphs() {\n      return this.cff.charStrings.count;\n    },\n    getCharset: function CFFFont_getCharset() {\n      return this.cff.charset.charset;\n    },\n    getGlyphMapping: function CFFFont_getGlyphMapping() {\n      var cff = this.cff;\n      var properties = this.properties;\n      var charsets = cff.charset.charset;\n      var charCodeToGlyphId;\n      var glyphId;\n      if (properties.composite) {\n        charCodeToGlyphId = Object.create(null);\n        if (cff.isCIDFont) {\n          for (glyphId = 0; glyphId < charsets.length; glyphId++) {\n            var cid = charsets[glyphId];\n            var charCode = properties.cMap.charCodeOf(cid);\n            charCodeToGlyphId[charCode] = glyphId;\n          }\n        } else {\n          for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) {\n            charCodeToGlyphId[glyphId] = glyphId;\n          }\n        }\n        return charCodeToGlyphId;\n      }\n      var encoding = cff.encoding ? cff.encoding.encoding : null;\n      charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets);\n      return charCodeToGlyphId;\n    }\n  };\n  return CFFFont;\n}();\n(function checkSeacSupport() {\n  if (typeof navigator !== 'undefined' && /Windows/.test(navigator.userAgent)) {\n    exports.SEAC_ANALYSIS_ENABLED = SEAC_ANALYSIS_ENABLED = true;\n  }\n})();\n(function checkChromeWindows() {\n  if (typeof navigator !== 'undefined' && /Windows.*Chrome/.test(navigator.userAgent)) {\n    SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = true;\n  }\n})();\nexports.SEAC_ANALYSIS_ENABLED = SEAC_ANALYSIS_ENABLED;\nexports.PRIVATE_USE_OFFSET_START = PRIVATE_USE_OFFSET_START;\nexports.PRIVATE_USE_OFFSET_END = PRIVATE_USE_OFFSET_END;\nexports.ErrorFont = ErrorFont;\nexports.Font = Font;\nexports.FontFlags = FontFlags;\nexports.ToUnicodeMap = ToUnicodeMap;\nexports.IdentityToUnicodeMap = IdentityToUnicodeMap;\nexports.ProblematicCharRanges = ProblematicCharRanges;\nexports.getFontType = getFontType;\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PDFImage = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _colorspace = __w_pdfjs_require__(3);\n\nvar _jpx = __w_pdfjs_require__(14);\n\nvar PDFImage = function PDFImageClosure() {\n  function handleImageData(image, nativeDecoder) {\n    if (nativeDecoder && nativeDecoder.canDecode(image)) {\n      return nativeDecoder.decode(image);\n    }\n    return Promise.resolve(image);\n  }\n  function decodeAndClamp(value, addend, coefficient, max) {\n    value = addend + value * coefficient;\n    return value < 0 ? 0 : value > max ? max : value;\n  }\n  function resizeImageMask(src, bpc, w1, h1, w2, h2) {\n    var length = w2 * h2;\n    var dest = bpc <= 8 ? new Uint8Array(length) : bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);\n    var xRatio = w1 / w2;\n    var yRatio = h1 / h2;\n    var i,\n        j,\n        py,\n        newIndex = 0,\n        oldIndex;\n    var xScaled = new Uint16Array(w2);\n    var w1Scanline = w1;\n    for (i = 0; i < w2; i++) {\n      xScaled[i] = Math.floor(i * xRatio);\n    }\n    for (i = 0; i < h2; i++) {\n      py = Math.floor(i * yRatio) * w1Scanline;\n      for (j = 0; j < w2; j++) {\n        oldIndex = py + xScaled[j];\n        dest[newIndex++] = src[oldIndex];\n      }\n    }\n    return dest;\n  }\n  function PDFImage(xref, res, image, inline, smask, mask, isMask) {\n    this.image = image;\n    var dict = image.dict;\n    if (dict.has('Filter')) {\n      var filter = dict.get('Filter').name;\n      if (filter === 'JPXDecode') {\n        var jpxImage = new _jpx.JpxImage();\n        jpxImage.parseImageProperties(image.stream);\n        image.stream.reset();\n        image.bitsPerComponent = jpxImage.bitsPerComponent;\n        image.numComps = jpxImage.componentsCount;\n      } else if (filter === 'JBIG2Decode') {\n        image.bitsPerComponent = 1;\n        image.numComps = 1;\n      }\n    }\n    this.width = dict.get('Width', 'W');\n    this.height = dict.get('Height', 'H');\n    if (this.width < 1 || this.height < 1) {\n      throw new _util.FormatError('Invalid image width: ' + this.width + ' or ' + ('height: ' + this.height));\n    }\n    this.interpolate = dict.get('Interpolate', 'I') || false;\n    this.imageMask = dict.get('ImageMask', 'IM') || false;\n    this.matte = dict.get('Matte') || false;\n    var bitsPerComponent = image.bitsPerComponent;\n    if (!bitsPerComponent) {\n      bitsPerComponent = dict.get('BitsPerComponent', 'BPC');\n      if (!bitsPerComponent) {\n        if (this.imageMask) {\n          bitsPerComponent = 1;\n        } else {\n          throw new _util.FormatError('Bits per component missing in image: ' + this.imageMask);\n        }\n      }\n    }\n    this.bpc = bitsPerComponent;\n    if (!this.imageMask) {\n      var colorSpace = dict.get('ColorSpace', 'CS');\n      if (!colorSpace) {\n        (0, _util.info)('JPX images (which do not require color spaces)');\n        switch (image.numComps) {\n          case 1:\n            colorSpace = _primitives.Name.get('DeviceGray');\n            break;\n          case 3:\n            colorSpace = _primitives.Name.get('DeviceRGB');\n            break;\n          case 4:\n            colorSpace = _primitives.Name.get('DeviceCMYK');\n            break;\n          default:\n            throw new Error('JPX images with ' + this.numComps + ' ' + 'color components not supported.');\n        }\n      }\n      this.colorSpace = _colorspace.ColorSpace.parse(colorSpace, xref, res);\n      this.numComps = this.colorSpace.numComps;\n    }\n    this.decode = dict.getArray('Decode', 'D');\n    this.needsDecode = false;\n    if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode) || isMask && !_colorspace.ColorSpace.isDefaultDecode(this.decode, 1))) {\n      this.needsDecode = true;\n      var max = (1 << bitsPerComponent) - 1;\n      this.decodeCoefficients = [];\n      this.decodeAddends = [];\n      for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {\n        var dmin = this.decode[i];\n        var dmax = this.decode[i + 1];\n        this.decodeCoefficients[j] = dmax - dmin;\n        this.decodeAddends[j] = max * dmin;\n      }\n    }\n    if (smask) {\n      this.smask = new PDFImage(xref, res, smask, false);\n    } else if (mask) {\n      if ((0, _primitives.isStream)(mask)) {\n        var maskDict = mask.dict,\n            imageMask = maskDict.get('ImageMask', 'IM');\n        if (!imageMask) {\n          (0, _util.warn)('Ignoring /Mask in image without /ImageMask.');\n        } else {\n          this.mask = new PDFImage(xref, res, mask, false, null, null, true);\n        }\n      } else {\n        this.mask = mask;\n      }\n    }\n  }\n  PDFImage.buildImage = function PDFImage_buildImage(handler, xref, res, image, inline, nativeDecoder) {\n    var imagePromise = handleImageData(image, nativeDecoder);\n    var smaskPromise;\n    var maskPromise;\n    var smask = image.dict.get('SMask');\n    var mask = image.dict.get('Mask');\n    if (smask) {\n      smaskPromise = handleImageData(smask, nativeDecoder);\n      maskPromise = Promise.resolve(null);\n    } else {\n      smaskPromise = Promise.resolve(null);\n      if (mask) {\n        if ((0, _primitives.isStream)(mask)) {\n          maskPromise = handleImageData(mask, nativeDecoder);\n        } else if ((0, _util.isArray)(mask)) {\n          maskPromise = Promise.resolve(mask);\n        } else {\n          (0, _util.warn)('Unsupported mask format.');\n          maskPromise = Promise.resolve(null);\n        }\n      } else {\n        maskPromise = Promise.resolve(null);\n      }\n    }\n    return Promise.all([imagePromise, smaskPromise, maskPromise]).then(function (results) {\n      var imageData = results[0];\n      var smaskData = results[1];\n      var maskData = results[2];\n      return new PDFImage(xref, res, imageData, inline, smaskData, maskData);\n    });\n  };\n  PDFImage.createMask = function PDFImage_createMask(imgArray, width, height, imageIsFromDecodeStream, inverseDecode) {\n    var computedLength = (width + 7 >> 3) * height;\n    var actualLength = imgArray.byteLength;\n    var haveFullData = computedLength === actualLength;\n    var data, i;\n    if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) {\n      data = imgArray;\n    } else if (!inverseDecode) {\n      data = new Uint8Array(actualLength);\n      data.set(imgArray);\n    } else {\n      data = new Uint8Array(computedLength);\n      data.set(imgArray);\n      for (i = actualLength; i < computedLength; i++) {\n        data[i] = 0xff;\n      }\n    }\n    if (inverseDecode) {\n      for (i = 0; i < actualLength; i++) {\n        data[i] = ~data[i];\n      }\n    }\n    return {\n      data: data,\n      width: width,\n      height: height\n    };\n  };\n  PDFImage.prototype = {\n    get drawWidth() {\n      return Math.max(this.width, this.smask && this.smask.width || 0, this.mask && this.mask.width || 0);\n    },\n    get drawHeight() {\n      return Math.max(this.height, this.smask && this.smask.height || 0, this.mask && this.mask.height || 0);\n    },\n    decodeBuffer: function PDFImage_decodeBuffer(buffer) {\n      var bpc = this.bpc;\n      var numComps = this.numComps;\n      var decodeAddends = this.decodeAddends;\n      var decodeCoefficients = this.decodeCoefficients;\n      var max = (1 << bpc) - 1;\n      var i, ii;\n      if (bpc === 1) {\n        for (i = 0, ii = buffer.length; i < ii; i++) {\n          buffer[i] = +!buffer[i];\n        }\n        return;\n      }\n      var index = 0;\n      for (i = 0, ii = this.width * this.height; i < ii; i++) {\n        for (var j = 0; j < numComps; j++) {\n          buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max);\n          index++;\n        }\n      }\n    },\n    getComponents: function PDFImage_getComponents(buffer) {\n      var bpc = this.bpc;\n      if (bpc === 8) {\n        return buffer;\n      }\n      var width = this.width;\n      var height = this.height;\n      var numComps = this.numComps;\n      var length = width * height * numComps;\n      var bufferPos = 0;\n      var output = bpc <= 8 ? new Uint8Array(length) : bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);\n      var rowComps = width * numComps;\n      var max = (1 << bpc) - 1;\n      var i = 0,\n          ii,\n          buf;\n      if (bpc === 1) {\n        var mask, loop1End, loop2End;\n        for (var j = 0; j < height; j++) {\n          loop1End = i + (rowComps & ~7);\n          loop2End = i + rowComps;\n          while (i < loop1End) {\n            buf = buffer[bufferPos++];\n            output[i] = buf >> 7 & 1;\n            output[i + 1] = buf >> 6 & 1;\n            output[i + 2] = buf >> 5 & 1;\n            output[i + 3] = buf >> 4 & 1;\n            output[i + 4] = buf >> 3 & 1;\n            output[i + 5] = buf >> 2 & 1;\n            output[i + 6] = buf >> 1 & 1;\n            output[i + 7] = buf & 1;\n            i += 8;\n          }\n          if (i < loop2End) {\n            buf = buffer[bufferPos++];\n            mask = 128;\n            while (i < loop2End) {\n              output[i++] = +!!(buf & mask);\n              mask >>= 1;\n            }\n          }\n        }\n      } else {\n        var bits = 0;\n        buf = 0;\n        for (i = 0, ii = length; i < ii; ++i) {\n          if (i % rowComps === 0) {\n            buf = 0;\n            bits = 0;\n          }\n          while (bits < bpc) {\n            buf = buf << 8 | buffer[bufferPos++];\n            bits += 8;\n          }\n          var remainingBits = bits - bpc;\n          var value = buf >> remainingBits;\n          output[i] = value < 0 ? 0 : value > max ? max : value;\n          buf = buf & (1 << remainingBits) - 1;\n          bits = remainingBits;\n        }\n      }\n      return output;\n    },\n    fillOpacity: function PDFImage_fillOpacity(rgbaBuf, width, height, actualHeight, image) {\n      var smask = this.smask;\n      var mask = this.mask;\n      var alphaBuf, sw, sh, i, ii, j;\n      if (smask) {\n        sw = smask.width;\n        sh = smask.height;\n        alphaBuf = new Uint8Array(sw * sh);\n        smask.fillGrayBuffer(alphaBuf);\n        if (sw !== width || sh !== height) {\n          alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height);\n        }\n      } else if (mask) {\n        if (mask instanceof PDFImage) {\n          sw = mask.width;\n          sh = mask.height;\n          alphaBuf = new Uint8Array(sw * sh);\n          mask.numComps = 1;\n          mask.fillGrayBuffer(alphaBuf);\n          for (i = 0, ii = sw * sh; i < ii; ++i) {\n            alphaBuf[i] = 255 - alphaBuf[i];\n          }\n          if (sw !== width || sh !== height) {\n            alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height);\n          }\n        } else if ((0, _util.isArray)(mask)) {\n          alphaBuf = new Uint8Array(width * height);\n          var numComps = this.numComps;\n          for (i = 0, ii = width * height; i < ii; ++i) {\n            var opacity = 0;\n            var imageOffset = i * numComps;\n            for (j = 0; j < numComps; ++j) {\n              var color = image[imageOffset + j];\n              var maskOffset = j * 2;\n              if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {\n                opacity = 255;\n                break;\n              }\n            }\n            alphaBuf[i] = opacity;\n          }\n        } else {\n          throw new _util.FormatError('Unknown mask format.');\n        }\n      }\n      if (alphaBuf) {\n        for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {\n          rgbaBuf[j] = alphaBuf[i];\n        }\n      } else {\n        for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {\n          rgbaBuf[j] = 255;\n        }\n      }\n    },\n    undoPreblend: function PDFImage_undoPreblend(buffer, width, height) {\n      var matte = this.smask && this.smask.matte;\n      if (!matte) {\n        return;\n      }\n      var matteRgb = this.colorSpace.getRgb(matte, 0);\n      var matteR = matteRgb[0];\n      var matteG = matteRgb[1];\n      var matteB = matteRgb[2];\n      var length = width * height * 4;\n      var r, g, b;\n      for (var i = 0; i < length; i += 4) {\n        var alpha = buffer[i + 3];\n        if (alpha === 0) {\n          buffer[i] = 255;\n          buffer[i + 1] = 255;\n          buffer[i + 2] = 255;\n          continue;\n        }\n        var k = 255 / alpha;\n        r = (buffer[i] - matteR) * k + matteR;\n        g = (buffer[i + 1] - matteG) * k + matteG;\n        b = (buffer[i + 2] - matteB) * k + matteB;\n        buffer[i] = r <= 0 ? 0 : r >= 255 ? 255 : r | 0;\n        buffer[i + 1] = g <= 0 ? 0 : g >= 255 ? 255 : g | 0;\n        buffer[i + 2] = b <= 0 ? 0 : b >= 255 ? 255 : b | 0;\n      }\n    },\n    createImageData: function PDFImage_createImageData(forceRGBA) {\n      var drawWidth = this.drawWidth;\n      var drawHeight = this.drawHeight;\n      var imgData = {\n        width: drawWidth,\n        height: drawHeight\n      };\n      var numComps = this.numComps;\n      var originalWidth = this.width;\n      var originalHeight = this.height;\n      var bpc = this.bpc;\n      var rowBytes = originalWidth * numComps * bpc + 7 >> 3;\n      var imgArray;\n      if (!forceRGBA) {\n        var kind;\n        if (this.colorSpace.name === 'DeviceGray' && bpc === 1) {\n          kind = _util.ImageKind.GRAYSCALE_1BPP;\n        } else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8 && !this.needsDecode) {\n          kind = _util.ImageKind.RGB_24BPP;\n        }\n        if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) {\n          imgData.kind = kind;\n          imgArray = this.getImageBytes(originalHeight * rowBytes);\n          if (this.image instanceof _stream.DecodeStream) {\n            imgData.data = imgArray;\n          } else {\n            var newArray = new Uint8Array(imgArray.length);\n            newArray.set(imgArray);\n            imgData.data = newArray;\n          }\n          if (this.needsDecode) {\n            (0, _util.assert)(kind === _util.ImageKind.GRAYSCALE_1BPP);\n            var buffer = imgData.data;\n            for (var i = 0, ii = buffer.length; i < ii; i++) {\n              buffer[i] ^= 0xff;\n            }\n          }\n          return imgData;\n        }\n        if (this.image instanceof _stream.JpegStream && !this.smask && !this.mask && (this.colorSpace.name === 'DeviceGray' || this.colorSpace.name === 'DeviceRGB' || this.colorSpace.name === 'DeviceCMYK')) {\n          imgData.kind = _util.ImageKind.RGB_24BPP;\n          imgData.data = this.getImageBytes(originalHeight * rowBytes, drawWidth, drawHeight, true);\n          return imgData;\n        }\n      }\n      imgArray = this.getImageBytes(originalHeight * rowBytes);\n      var actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight;\n      var comps = this.getComponents(imgArray);\n      var alpha01, maybeUndoPreblend;\n      if (!forceRGBA && !this.smask && !this.mask) {\n        imgData.kind = _util.ImageKind.RGB_24BPP;\n        imgData.data = new Uint8Array(drawWidth * drawHeight * 3);\n        alpha01 = 0;\n        maybeUndoPreblend = false;\n      } else {\n        imgData.kind = _util.ImageKind.RGBA_32BPP;\n        imgData.data = new Uint8Array(drawWidth * drawHeight * 4);\n        alpha01 = 1;\n        maybeUndoPreblend = true;\n        this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, comps);\n      }\n      if (this.needsDecode) {\n        this.decodeBuffer(comps);\n      }\n      this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01);\n      if (maybeUndoPreblend) {\n        this.undoPreblend(imgData.data, drawWidth, actualHeight);\n      }\n      return imgData;\n    },\n    fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) {\n      var numComps = this.numComps;\n      if (numComps !== 1) {\n        throw new _util.FormatError('Reading gray scale from a color image: ' + numComps);\n      }\n      var width = this.width;\n      var height = this.height;\n      var bpc = this.bpc;\n      var rowBytes = width * numComps * bpc + 7 >> 3;\n      var imgArray = this.getImageBytes(height * rowBytes);\n      var comps = this.getComponents(imgArray);\n      var i, length;\n      if (bpc === 1) {\n        length = width * height;\n        if (this.needsDecode) {\n          for (i = 0; i < length; ++i) {\n            buffer[i] = comps[i] - 1 & 255;\n          }\n        } else {\n          for (i = 0; i < length; ++i) {\n            buffer[i] = -comps[i] & 255;\n          }\n        }\n        return;\n      }\n      if (this.needsDecode) {\n        this.decodeBuffer(comps);\n      }\n      length = width * height;\n      var scale = 255 / ((1 << bpc) - 1);\n      for (i = 0; i < length; ++i) {\n        buffer[i] = scale * comps[i] | 0;\n      }\n    },\n    getImageBytes: function PDFImage_getImageBytes(length, drawWidth, drawHeight, forceRGB) {\n      this.image.reset();\n      this.image.drawWidth = drawWidth || this.width;\n      this.image.drawHeight = drawHeight || this.height;\n      this.image.forceRGB = !!forceRGB;\n      return this.image.getBytes(length);\n    }\n  };\n  return PDFImage;\n}();\nexports.PDFImage = PDFImage;\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Jbig2Image = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _arithmetic_decoder = __w_pdfjs_require__(9);\n\nvar Jbig2Error = function Jbig2ErrorClosure() {\n  function Jbig2Error(msg) {\n    this.message = 'JBIG2 error: ' + msg;\n  }\n  Jbig2Error.prototype = new Error();\n  Jbig2Error.prototype.name = 'Jbig2Error';\n  Jbig2Error.constructor = Jbig2Error;\n  return Jbig2Error;\n}();\nvar Jbig2Image = function Jbig2ImageClosure() {\n  function ContextCache() {}\n  ContextCache.prototype = {\n    getContexts: function getContexts(id) {\n      if (id in this) {\n        return this[id];\n      }\n      return this[id] = new Int8Array(1 << 16);\n    }\n  };\n  function DecodingContext(data, start, end) {\n    this.data = data;\n    this.start = start;\n    this.end = end;\n  }\n  DecodingContext.prototype = {\n    get decoder() {\n      var decoder = new _arithmetic_decoder.ArithmeticDecoder(this.data, this.start, this.end);\n      return (0, _util.shadow)(this, 'decoder', decoder);\n    },\n    get contextCache() {\n      var cache = new ContextCache();\n      return (0, _util.shadow)(this, 'contextCache', cache);\n    }\n  };\n  function decodeInteger(contextCache, procedure, decoder) {\n    var contexts = contextCache.getContexts(procedure);\n    var prev = 1;\n    function readBits(length) {\n      var v = 0;\n      for (var i = 0; i < length; i++) {\n        var bit = decoder.readBit(contexts, prev);\n        prev = prev < 256 ? prev << 1 | bit : (prev << 1 | bit) & 511 | 256;\n        v = v << 1 | bit;\n      }\n      return v >>> 0;\n    }\n    var sign = readBits(1);\n    var value = readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(32) + 4436 : readBits(12) + 340 : readBits(8) + 84 : readBits(6) + 20 : readBits(4) + 4 : readBits(2);\n    return sign === 0 ? value : value > 0 ? -value : null;\n  }\n  function decodeIAID(contextCache, decoder, codeLength) {\n    var contexts = contextCache.getContexts('IAID');\n    var prev = 1;\n    for (var i = 0; i < codeLength; i++) {\n      var bit = decoder.readBit(contexts, prev);\n      prev = prev << 1 | bit;\n    }\n    if (codeLength < 31) {\n      return prev & (1 << codeLength) - 1;\n    }\n    return prev & 0x7FFFFFFF;\n  }\n  var SegmentTypes = ['SymbolDictionary', null, null, null, 'IntermediateTextRegion', null, 'ImmediateTextRegion', 'ImmediateLosslessTextRegion', null, null, null, null, null, null, null, null, 'patternDictionary', null, null, null, 'IntermediateHalftoneRegion', null, 'ImmediateHalftoneRegion', 'ImmediateLosslessHalftoneRegion', null, null, null, null, null, null, null, null, null, null, null, null, 'IntermediateGenericRegion', null, 'ImmediateGenericRegion', 'ImmediateLosslessGenericRegion', 'IntermediateGenericRefinementRegion', null, 'ImmediateGenericRefinementRegion', 'ImmediateLosslessGenericRefinementRegion', null, null, null, null, 'PageInformation', 'EndOfPage', 'EndOfStripe', 'EndOfFile', 'Profiles', 'Tables', null, null, null, null, null, null, null, null, 'Extension'];\n  var CodingTemplates = [[{\n    x: -1,\n    y: -2\n  }, {\n    x: 0,\n    y: -2\n  }, {\n    x: 1,\n    y: -2\n  }, {\n    x: -2,\n    y: -1\n  }, {\n    x: -1,\n    y: -1\n  }, {\n    x: 0,\n    y: -1\n  }, {\n    x: 1,\n    y: -1\n  }, {\n    x: 2,\n    y: -1\n  }, {\n    x: -4,\n    y: 0\n  }, {\n    x: -3,\n    y: 0\n  }, {\n    x: -2,\n    y: 0\n  }, {\n    x: -1,\n    y: 0\n  }], [{\n    x: -1,\n    y: -2\n  }, {\n    x: 0,\n    y: -2\n  }, {\n    x: 1,\n    y: -2\n  }, {\n    x: 2,\n    y: -2\n  }, {\n    x: -2,\n    y: -1\n  }, {\n    x: -1,\n    y: -1\n  }, {\n    x: 0,\n    y: -1\n  }, {\n    x: 1,\n    y: -1\n  }, {\n    x: 2,\n    y: -1\n  }, {\n    x: -3,\n    y: 0\n  }, {\n    x: -2,\n    y: 0\n  }, {\n    x: -1,\n    y: 0\n  }], [{\n    x: -1,\n    y: -2\n  }, {\n    x: 0,\n    y: -2\n  }, {\n    x: 1,\n    y: -2\n  }, {\n    x: -2,\n    y: -1\n  }, {\n    x: -1,\n    y: -1\n  }, {\n    x: 0,\n    y: -1\n  }, {\n    x: 1,\n    y: -1\n  }, {\n    x: -2,\n    y: 0\n  }, {\n    x: -1,\n    y: 0\n  }], [{\n    x: -3,\n    y: -1\n  }, {\n    x: -2,\n    y: -1\n  }, {\n    x: -1,\n    y: -1\n  }, {\n    x: 0,\n    y: -1\n  }, {\n    x: 1,\n    y: -1\n  }, {\n    x: -4,\n    y: 0\n  }, {\n    x: -3,\n    y: 0\n  }, {\n    x: -2,\n    y: 0\n  }, {\n    x: -1,\n    y: 0\n  }]];\n  var RefinementTemplates = [{\n    coding: [{\n      x: 0,\n      y: -1\n    }, {\n      x: 1,\n      y: -1\n    }, {\n      x: -1,\n      y: 0\n    }],\n    reference: [{\n      x: 0,\n      y: -1\n    }, {\n      x: 1,\n      y: -1\n    }, {\n      x: -1,\n      y: 0\n    }, {\n      x: 0,\n      y: 0\n    }, {\n      x: 1,\n      y: 0\n    }, {\n      x: -1,\n      y: 1\n    }, {\n      x: 0,\n      y: 1\n    }, {\n      x: 1,\n      y: 1\n    }]\n  }, {\n    coding: [{\n      x: -1,\n      y: -1\n    }, {\n      x: 0,\n      y: -1\n    }, {\n      x: 1,\n      y: -1\n    }, {\n      x: -1,\n      y: 0\n    }],\n    reference: [{\n      x: 0,\n      y: -1\n    }, {\n      x: -1,\n      y: 0\n    }, {\n      x: 0,\n      y: 0\n    }, {\n      x: 1,\n      y: 0\n    }, {\n      x: 0,\n      y: 1\n    }, {\n      x: 1,\n      y: 1\n    }]\n  }];\n  var ReusedContexts = [0x9B25, 0x0795, 0x00E5, 0x0195];\n  var RefinementReusedContexts = [0x0020, 0x0008];\n  function decodeBitmapTemplate0(width, height, decodingContext) {\n    var decoder = decodingContext.decoder;\n    var contexts = decodingContext.contextCache.getContexts('GB');\n    var contextLabel,\n        i,\n        j,\n        pixel,\n        row,\n        row1,\n        row2,\n        bitmap = [];\n    var OLD_PIXEL_MASK = 0x7BF7;\n    for (i = 0; i < height; i++) {\n      row = bitmap[i] = new Uint8Array(width);\n      row1 = i < 1 ? row : bitmap[i - 1];\n      row2 = i < 2 ? row : bitmap[i - 2];\n      contextLabel = row2[0] << 13 | row2[1] << 12 | row2[2] << 11 | row1[0] << 7 | row1[1] << 6 | row1[2] << 5 | row1[3] << 4;\n      for (j = 0; j < width; j++) {\n        row[j] = pixel = decoder.readBit(contexts, contextLabel);\n        contextLabel = (contextLabel & OLD_PIXEL_MASK) << 1 | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel;\n      }\n    }\n    return bitmap;\n  }\n  function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) {\n    if (mmr) {\n      throw new Jbig2Error('MMR encoding is not supported');\n    }\n    if (templateIndex === 0 && !skip && !prediction && at.length === 4 && at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) {\n      return decodeBitmapTemplate0(width, height, decodingContext);\n    }\n    var useskip = !!skip;\n    var template = CodingTemplates[templateIndex].concat(at);\n    template.sort(function (a, b) {\n      return a.y - b.y || a.x - b.x;\n    });\n    var templateLength = template.length;\n    var templateX = new Int8Array(templateLength);\n    var templateY = new Int8Array(templateLength);\n    var changingTemplateEntries = [];\n    var reuseMask = 0,\n        minX = 0,\n        maxX = 0,\n        minY = 0;\n    var c, k;\n    for (k = 0; k < templateLength; k++) {\n      templateX[k] = template[k].x;\n      templateY[k] = template[k].y;\n      minX = Math.min(minX, template[k].x);\n      maxX = Math.max(maxX, template[k].x);\n      minY = Math.min(minY, template[k].y);\n      if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 1].x - 1) {\n        reuseMask |= 1 << templateLength - 1 - k;\n      } else {\n        changingTemplateEntries.push(k);\n      }\n    }\n    var changingEntriesLength = changingTemplateEntries.length;\n    var changingTemplateX = new Int8Array(changingEntriesLength);\n    var changingTemplateY = new Int8Array(changingEntriesLength);\n    var changingTemplateBit = new Uint16Array(changingEntriesLength);\n    for (c = 0; c < changingEntriesLength; c++) {\n      k = changingTemplateEntries[c];\n      changingTemplateX[c] = template[k].x;\n      changingTemplateY[c] = template[k].y;\n      changingTemplateBit[c] = 1 << templateLength - 1 - k;\n    }\n    var sbb_left = -minX;\n    var sbb_top = -minY;\n    var sbb_right = width - maxX;\n    var pseudoPixelContext = ReusedContexts[templateIndex];\n    var row = new Uint8Array(width);\n    var bitmap = [];\n    var decoder = decodingContext.decoder;\n    var contexts = decodingContext.contextCache.getContexts('GB');\n    var ltp = 0,\n        j,\n        i0,\n        j0,\n        contextLabel = 0,\n        bit,\n        shift;\n    for (var i = 0; i < height; i++) {\n      if (prediction) {\n        var sltp = decoder.readBit(contexts, pseudoPixelContext);\n        ltp ^= sltp;\n        if (ltp) {\n          bitmap.push(row);\n          continue;\n        }\n      }\n      row = new Uint8Array(row);\n      bitmap.push(row);\n      for (j = 0; j < width; j++) {\n        if (useskip && skip[i][j]) {\n          row[j] = 0;\n          continue;\n        }\n        if (j >= sbb_left && j < sbb_right && i >= sbb_top) {\n          contextLabel = contextLabel << 1 & reuseMask;\n          for (k = 0; k < changingEntriesLength; k++) {\n            i0 = i + changingTemplateY[k];\n            j0 = j + changingTemplateX[k];\n            bit = bitmap[i0][j0];\n            if (bit) {\n              bit = changingTemplateBit[k];\n              contextLabel |= bit;\n            }\n          }\n        } else {\n          contextLabel = 0;\n          shift = templateLength - 1;\n          for (k = 0; k < templateLength; k++, shift--) {\n            j0 = j + templateX[k];\n            if (j0 >= 0 && j0 < width) {\n              i0 = i + templateY[k];\n              if (i0 >= 0) {\n                bit = bitmap[i0][j0];\n                if (bit) {\n                  contextLabel |= bit << shift;\n                }\n              }\n            }\n          }\n        }\n        var pixel = decoder.readBit(contexts, contextLabel);\n        row[j] = pixel;\n      }\n    }\n    return bitmap;\n  }\n  function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, decodingContext) {\n    var codingTemplate = RefinementTemplates[templateIndex].coding;\n    if (templateIndex === 0) {\n      codingTemplate = codingTemplate.concat([at[0]]);\n    }\n    var codingTemplateLength = codingTemplate.length;\n    var codingTemplateX = new Int32Array(codingTemplateLength);\n    var codingTemplateY = new Int32Array(codingTemplateLength);\n    var k;\n    for (k = 0; k < codingTemplateLength; k++) {\n      codingTemplateX[k] = codingTemplate[k].x;\n      codingTemplateY[k] = codingTemplate[k].y;\n    }\n    var referenceTemplate = RefinementTemplates[templateIndex].reference;\n    if (templateIndex === 0) {\n      referenceTemplate = referenceTemplate.concat([at[1]]);\n    }\n    var referenceTemplateLength = referenceTemplate.length;\n    var referenceTemplateX = new Int32Array(referenceTemplateLength);\n    var referenceTemplateY = new Int32Array(referenceTemplateLength);\n    for (k = 0; k < referenceTemplateLength; k++) {\n      referenceTemplateX[k] = referenceTemplate[k].x;\n      referenceTemplateY[k] = referenceTemplate[k].y;\n    }\n    var referenceWidth = referenceBitmap[0].length;\n    var referenceHeight = referenceBitmap.length;\n    var pseudoPixelContext = RefinementReusedContexts[templateIndex];\n    var bitmap = [];\n    var decoder = decodingContext.decoder;\n    var contexts = decodingContext.contextCache.getContexts('GR');\n    var ltp = 0;\n    for (var i = 0; i < height; i++) {\n      if (prediction) {\n        var sltp = decoder.readBit(contexts, pseudoPixelContext);\n        ltp ^= sltp;\n        if (ltp) {\n          throw new Jbig2Error('prediction is not supported');\n        }\n      }\n      var row = new Uint8Array(width);\n      bitmap.push(row);\n      for (var j = 0; j < width; j++) {\n        var i0, j0;\n        var contextLabel = 0;\n        for (k = 0; k < codingTemplateLength; k++) {\n          i0 = i + codingTemplateY[k];\n          j0 = j + codingTemplateX[k];\n          if (i0 < 0 || j0 < 0 || j0 >= width) {\n            contextLabel <<= 1;\n          } else {\n            contextLabel = contextLabel << 1 | bitmap[i0][j0];\n          }\n        }\n        for (k = 0; k < referenceTemplateLength; k++) {\n          i0 = i + referenceTemplateY[k] - offsetY;\n          j0 = j + referenceTemplateX[k] - offsetX;\n          if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) {\n            contextLabel <<= 1;\n          } else {\n            contextLabel = contextLabel << 1 | referenceBitmap[i0][j0];\n          }\n        }\n        var pixel = decoder.readBit(contexts, contextLabel);\n        row[j] = pixel;\n      }\n    }\n    return bitmap;\n  }\n  function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext) {\n    if (huffman) {\n      throw new Jbig2Error('huffman is not supported');\n    }\n    var newSymbols = [];\n    var currentHeight = 0;\n    var symbolCodeLength = (0, _util.log2)(symbols.length + numberOfNewSymbols);\n    var decoder = decodingContext.decoder;\n    var contextCache = decodingContext.contextCache;\n    while (newSymbols.length < numberOfNewSymbols) {\n      var deltaHeight = decodeInteger(contextCache, 'IADH', decoder);\n      currentHeight += deltaHeight;\n      var currentWidth = 0;\n      while (true) {\n        var deltaWidth = decodeInteger(contextCache, 'IADW', decoder);\n        if (deltaWidth === null) {\n          break;\n        }\n        currentWidth += deltaWidth;\n        var bitmap;\n        if (refinement) {\n          var numberOfInstances = decodeInteger(contextCache, 'IAAI', decoder);\n          if (numberOfInstances > 1) {\n            bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, numberOfInstances, 1, symbols.concat(newSymbols), symbolCodeLength, 0, 0, 1, 0, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext);\n          } else {\n            var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);\n            var rdx = decodeInteger(contextCache, 'IARDX', decoder);\n            var rdy = decodeInteger(contextCache, 'IARDY', decoder);\n            var symbol = symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - symbols.length];\n            bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, decodingContext);\n          }\n        } else {\n          bitmap = decodeBitmap(false, currentWidth, currentHeight, templateIndex, false, null, at, decodingContext);\n        }\n        newSymbols.push(bitmap);\n      }\n    }\n    var exportedSymbols = [];\n    var flags = [],\n        currentFlag = false;\n    var totalSymbolsLength = symbols.length + numberOfNewSymbols;\n    while (flags.length < totalSymbolsLength) {\n      var runLength = decodeInteger(contextCache, 'IAEX', decoder);\n      while (runLength--) {\n        flags.push(currentFlag);\n      }\n      currentFlag = !currentFlag;\n    }\n    for (var i = 0, ii = symbols.length; i < ii; i++) {\n      if (flags[i]) {\n        exportedSymbols.push(symbols[i]);\n      }\n    }\n    for (var j = 0; j < numberOfNewSymbols; i++, j++) {\n      if (flags[i]) {\n        exportedSymbols.push(newSymbols[j]);\n      }\n    }\n    return exportedSymbols;\n  }\n  function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext) {\n    if (huffman) {\n      throw new Jbig2Error('huffman is not supported');\n    }\n    var bitmap = [];\n    var i, row;\n    for (i = 0; i < height; i++) {\n      row = new Uint8Array(width);\n      if (defaultPixelValue) {\n        for (var j = 0; j < width; j++) {\n          row[j] = defaultPixelValue;\n        }\n      }\n      bitmap.push(row);\n    }\n    var decoder = decodingContext.decoder;\n    var contextCache = decodingContext.contextCache;\n    var stripT = -decodeInteger(contextCache, 'IADT', decoder);\n    var firstS = 0;\n    i = 0;\n    while (i < numberOfSymbolInstances) {\n      var deltaT = decodeInteger(contextCache, 'IADT', decoder);\n      stripT += deltaT;\n      var deltaFirstS = decodeInteger(contextCache, 'IAFS', decoder);\n      firstS += deltaFirstS;\n      var currentS = firstS;\n      do {\n        var currentT = stripSize === 1 ? 0 : decodeInteger(contextCache, 'IAIT', decoder);\n        var t = stripSize * stripT + currentT;\n        var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);\n        var applyRefinement = refinement && decodeInteger(contextCache, 'IARI', decoder);\n        var symbolBitmap = inputSymbols[symbolId];\n        var symbolWidth = symbolBitmap[0].length;\n        var symbolHeight = symbolBitmap.length;\n        if (applyRefinement) {\n          var rdw = decodeInteger(contextCache, 'IARDW', decoder);\n          var rdh = decodeInteger(contextCache, 'IARDH', decoder);\n          var rdx = decodeInteger(contextCache, 'IARDX', decoder);\n          var rdy = decodeInteger(contextCache, 'IARDY', decoder);\n          symbolWidth += rdw;\n          symbolHeight += rdh;\n          symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext);\n        }\n        var offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight);\n        var offsetS = currentS - (referenceCorner & 2 ? symbolWidth : 0);\n        var s2, t2, symbolRow;\n        if (transposed) {\n          for (s2 = 0; s2 < symbolHeight; s2++) {\n            row = bitmap[offsetS + s2];\n            if (!row) {\n              continue;\n            }\n            symbolRow = symbolBitmap[s2];\n            var maxWidth = Math.min(width - offsetT, symbolWidth);\n            switch (combinationOperator) {\n              case 0:\n                for (t2 = 0; t2 < maxWidth; t2++) {\n                  row[offsetT + t2] |= symbolRow[t2];\n                }\n                break;\n              case 2:\n                for (t2 = 0; t2 < maxWidth; t2++) {\n                  row[offsetT + t2] ^= symbolRow[t2];\n                }\n                break;\n              default:\n                throw new Jbig2Error('operator ' + combinationOperator + ' is not supported');\n            }\n          }\n          currentS += symbolHeight - 1;\n        } else {\n          for (t2 = 0; t2 < symbolHeight; t2++) {\n            row = bitmap[offsetT + t2];\n            if (!row) {\n              continue;\n            }\n            symbolRow = symbolBitmap[t2];\n            switch (combinationOperator) {\n              case 0:\n                for (s2 = 0; s2 < symbolWidth; s2++) {\n                  row[offsetS + s2] |= symbolRow[s2];\n                }\n                break;\n              case 2:\n                for (s2 = 0; s2 < symbolWidth; s2++) {\n                  row[offsetS + s2] ^= symbolRow[s2];\n                }\n                break;\n              default:\n                throw new Jbig2Error('operator ' + combinationOperator + ' is not supported');\n            }\n          }\n          currentS += symbolWidth - 1;\n        }\n        i++;\n        var deltaS = decodeInteger(contextCache, 'IADS', decoder);\n        if (deltaS === null) {\n          break;\n        }\n        currentS += deltaS + dsOffset;\n      } while (true);\n    }\n    return bitmap;\n  }\n  function readSegmentHeader(data, start) {\n    var segmentHeader = {};\n    segmentHeader.number = (0, _util.readUint32)(data, start);\n    var flags = data[start + 4];\n    var segmentType = flags & 0x3F;\n    if (!SegmentTypes[segmentType]) {\n      throw new Jbig2Error('invalid segment type: ' + segmentType);\n    }\n    segmentHeader.type = segmentType;\n    segmentHeader.typeName = SegmentTypes[segmentType];\n    segmentHeader.deferredNonRetain = !!(flags & 0x80);\n    var pageAssociationFieldSize = !!(flags & 0x40);\n    var referredFlags = data[start + 5];\n    var referredToCount = referredFlags >> 5 & 7;\n    var retainBits = [referredFlags & 31];\n    var position = start + 6;\n    if (referredFlags === 7) {\n      referredToCount = (0, _util.readUint32)(data, position - 1) & 0x1FFFFFFF;\n      position += 3;\n      var bytes = referredToCount + 7 >> 3;\n      retainBits[0] = data[position++];\n      while (--bytes > 0) {\n        retainBits.push(data[position++]);\n      }\n    } else if (referredFlags === 5 || referredFlags === 6) {\n      throw new Jbig2Error('invalid referred-to flags');\n    }\n    segmentHeader.retainBits = retainBits;\n    var referredToSegmentNumberSize = segmentHeader.number <= 256 ? 1 : segmentHeader.number <= 65536 ? 2 : 4;\n    var referredTo = [];\n    var i, ii;\n    for (i = 0; i < referredToCount; i++) {\n      var number = referredToSegmentNumberSize === 1 ? data[position] : referredToSegmentNumberSize === 2 ? (0, _util.readUint16)(data, position) : (0, _util.readUint32)(data, position);\n      referredTo.push(number);\n      position += referredToSegmentNumberSize;\n    }\n    segmentHeader.referredTo = referredTo;\n    if (!pageAssociationFieldSize) {\n      segmentHeader.pageAssociation = data[position++];\n    } else {\n      segmentHeader.pageAssociation = (0, _util.readUint32)(data, position);\n      position += 4;\n    }\n    segmentHeader.length = (0, _util.readUint32)(data, position);\n    position += 4;\n    if (segmentHeader.length === 0xFFFFFFFF) {\n      if (segmentType === 38) {\n        var genericRegionInfo = readRegionSegmentInformation(data, position);\n        var genericRegionSegmentFlags = data[position + RegionSegmentInformationFieldLength];\n        var genericRegionMmr = !!(genericRegionSegmentFlags & 1);\n        var searchPatternLength = 6;\n        var searchPattern = new Uint8Array(searchPatternLength);\n        if (!genericRegionMmr) {\n          searchPattern[0] = 0xFF;\n          searchPattern[1] = 0xAC;\n        }\n        searchPattern[2] = genericRegionInfo.height >>> 24 & 0xFF;\n        searchPattern[3] = genericRegionInfo.height >> 16 & 0xFF;\n        searchPattern[4] = genericRegionInfo.height >> 8 & 0xFF;\n        searchPattern[5] = genericRegionInfo.height & 0xFF;\n        for (i = position, ii = data.length; i < ii; i++) {\n          var j = 0;\n          while (j < searchPatternLength && searchPattern[j] === data[i + j]) {\n            j++;\n          }\n          if (j === searchPatternLength) {\n            segmentHeader.length = i + searchPatternLength;\n            break;\n          }\n        }\n        if (segmentHeader.length === 0xFFFFFFFF) {\n          throw new Jbig2Error('segment end was not found');\n        }\n      } else {\n        throw new Jbig2Error('invalid unknown segment length');\n      }\n    }\n    segmentHeader.headerEnd = position;\n    return segmentHeader;\n  }\n  function readSegments(header, data, start, end) {\n    var segments = [];\n    var position = start;\n    while (position < end) {\n      var segmentHeader = readSegmentHeader(data, position);\n      position = segmentHeader.headerEnd;\n      var segment = {\n        header: segmentHeader,\n        data: data\n      };\n      if (!header.randomAccess) {\n        segment.start = position;\n        position += segmentHeader.length;\n        segment.end = position;\n      }\n      segments.push(segment);\n      if (segmentHeader.type === 51) {\n        break;\n      }\n    }\n    if (header.randomAccess) {\n      for (var i = 0, ii = segments.length; i < ii; i++) {\n        segments[i].start = position;\n        position += segments[i].header.length;\n        segments[i].end = position;\n      }\n    }\n    return segments;\n  }\n  function readRegionSegmentInformation(data, start) {\n    return {\n      width: (0, _util.readUint32)(data, start),\n      height: (0, _util.readUint32)(data, start + 4),\n      x: (0, _util.readUint32)(data, start + 8),\n      y: (0, _util.readUint32)(data, start + 12),\n      combinationOperator: data[start + 16] & 7\n    };\n  }\n  var RegionSegmentInformationFieldLength = 17;\n  function processSegment(segment, visitor) {\n    var header = segment.header;\n    var data = segment.data,\n        position = segment.start,\n        end = segment.end;\n    var args, at, i, atLength;\n    switch (header.type) {\n      case 0:\n        var dictionary = {};\n        var dictionaryFlags = (0, _util.readUint16)(data, position);\n        dictionary.huffman = !!(dictionaryFlags & 1);\n        dictionary.refinement = !!(dictionaryFlags & 2);\n        dictionary.huffmanDHSelector = dictionaryFlags >> 2 & 3;\n        dictionary.huffmanDWSelector = dictionaryFlags >> 4 & 3;\n        dictionary.bitmapSizeSelector = dictionaryFlags >> 6 & 1;\n        dictionary.aggregationInstancesSelector = dictionaryFlags >> 7 & 1;\n        dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256);\n        dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512);\n        dictionary.template = dictionaryFlags >> 10 & 3;\n        dictionary.refinementTemplate = dictionaryFlags >> 12 & 1;\n        position += 2;\n        if (!dictionary.huffman) {\n          atLength = dictionary.template === 0 ? 4 : 1;\n          at = [];\n          for (i = 0; i < atLength; i++) {\n            at.push({\n              x: (0, _util.readInt8)(data, position),\n              y: (0, _util.readInt8)(data, position + 1)\n            });\n            position += 2;\n          }\n          dictionary.at = at;\n        }\n        if (dictionary.refinement && !dictionary.refinementTemplate) {\n          at = [];\n          for (i = 0; i < 2; i++) {\n            at.push({\n              x: (0, _util.readInt8)(data, position),\n              y: (0, _util.readInt8)(data, position + 1)\n            });\n            position += 2;\n          }\n          dictionary.refinementAt = at;\n        }\n        dictionary.numberOfExportedSymbols = (0, _util.readUint32)(data, position);\n        position += 4;\n        dictionary.numberOfNewSymbols = (0, _util.readUint32)(data, position);\n        position += 4;\n        args = [dictionary, header.number, header.referredTo, data, position, end];\n        break;\n      case 6:\n      case 7:\n        var textRegion = {};\n        textRegion.info = readRegionSegmentInformation(data, position);\n        position += RegionSegmentInformationFieldLength;\n        var textRegionSegmentFlags = (0, _util.readUint16)(data, position);\n        position += 2;\n        textRegion.huffman = !!(textRegionSegmentFlags & 1);\n        textRegion.refinement = !!(textRegionSegmentFlags & 2);\n        textRegion.stripSize = 1 << (textRegionSegmentFlags >> 2 & 3);\n        textRegion.referenceCorner = textRegionSegmentFlags >> 4 & 3;\n        textRegion.transposed = !!(textRegionSegmentFlags & 64);\n        textRegion.combinationOperator = textRegionSegmentFlags >> 7 & 3;\n        textRegion.defaultPixelValue = textRegionSegmentFlags >> 9 & 1;\n        textRegion.dsOffset = textRegionSegmentFlags << 17 >> 27;\n        textRegion.refinementTemplate = textRegionSegmentFlags >> 15 & 1;\n        if (textRegion.huffman) {\n          var textRegionHuffmanFlags = (0, _util.readUint16)(data, position);\n          position += 2;\n          textRegion.huffmanFS = textRegionHuffmanFlags & 3;\n          textRegion.huffmanDS = textRegionHuffmanFlags >> 2 & 3;\n          textRegion.huffmanDT = textRegionHuffmanFlags >> 4 & 3;\n          textRegion.huffmanRefinementDW = textRegionHuffmanFlags >> 6 & 3;\n          textRegion.huffmanRefinementDH = textRegionHuffmanFlags >> 8 & 3;\n          textRegion.huffmanRefinementDX = textRegionHuffmanFlags >> 10 & 3;\n          textRegion.huffmanRefinementDY = textRegionHuffmanFlags >> 12 & 3;\n          textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 14);\n        }\n        if (textRegion.refinement && !textRegion.refinementTemplate) {\n          at = [];\n          for (i = 0; i < 2; i++) {\n            at.push({\n              x: (0, _util.readInt8)(data, position),\n              y: (0, _util.readInt8)(data, position + 1)\n            });\n            position += 2;\n          }\n          textRegion.refinementAt = at;\n        }\n        textRegion.numberOfSymbolInstances = (0, _util.readUint32)(data, position);\n        position += 4;\n        if (textRegion.huffman) {\n          throw new Jbig2Error('huffman is not supported');\n        }\n        args = [textRegion, header.referredTo, data, position, end];\n        break;\n      case 38:\n      case 39:\n        var genericRegion = {};\n        genericRegion.info = readRegionSegmentInformation(data, position);\n        position += RegionSegmentInformationFieldLength;\n        var genericRegionSegmentFlags = data[position++];\n        genericRegion.mmr = !!(genericRegionSegmentFlags & 1);\n        genericRegion.template = genericRegionSegmentFlags >> 1 & 3;\n        genericRegion.prediction = !!(genericRegionSegmentFlags & 8);\n        if (!genericRegion.mmr) {\n          atLength = genericRegion.template === 0 ? 4 : 1;\n          at = [];\n          for (i = 0; i < atLength; i++) {\n            at.push({\n              x: (0, _util.readInt8)(data, position),\n              y: (0, _util.readInt8)(data, position + 1)\n            });\n            position += 2;\n          }\n          genericRegion.at = at;\n        }\n        args = [genericRegion, data, position, end];\n        break;\n      case 48:\n        var pageInfo = {\n          width: (0, _util.readUint32)(data, position),\n          height: (0, _util.readUint32)(data, position + 4),\n          resolutionX: (0, _util.readUint32)(data, position + 8),\n          resolutionY: (0, _util.readUint32)(data, position + 12)\n        };\n        if (pageInfo.height === 0xFFFFFFFF) {\n          delete pageInfo.height;\n        }\n        var pageSegmentFlags = data[position + 16];\n        (0, _util.readUint16)(data, position + 17);\n        pageInfo.lossless = !!(pageSegmentFlags & 1);\n        pageInfo.refinement = !!(pageSegmentFlags & 2);\n        pageInfo.defaultPixelValue = pageSegmentFlags >> 2 & 1;\n        pageInfo.combinationOperator = pageSegmentFlags >> 3 & 3;\n        pageInfo.requiresBuffer = !!(pageSegmentFlags & 32);\n        pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64);\n        args = [pageInfo];\n        break;\n      case 49:\n        break;\n      case 50:\n        break;\n      case 51:\n        break;\n      case 62:\n        break;\n      default:\n        throw new Jbig2Error('segment type ' + header.typeName + '(' + header.type + ')' + ' is not implemented');\n    }\n    var callbackName = 'on' + header.typeName;\n    if (callbackName in visitor) {\n      visitor[callbackName].apply(visitor, args);\n    }\n  }\n  function processSegments(segments, visitor) {\n    for (var i = 0, ii = segments.length; i < ii; i++) {\n      processSegment(segments[i], visitor);\n    }\n  }\n  function parseJbig2(data, start, end) {\n    var position = start;\n    if (data[position] !== 0x97 || data[position + 1] !== 0x4A || data[position + 2] !== 0x42 || data[position + 3] !== 0x32 || data[position + 4] !== 0x0D || data[position + 5] !== 0x0A || data[position + 6] !== 0x1A || data[position + 7] !== 0x0A) {\n      throw new Jbig2Error('invalid header');\n    }\n    var header = {};\n    position += 8;\n    var flags = data[position++];\n    header.randomAccess = !(flags & 1);\n    if (!(flags & 2)) {\n      header.numberOfPages = (0, _util.readUint32)(data, position);\n      position += 4;\n    }\n    readSegments(header, data, position, end);\n    throw new Error('Not implemented');\n  }\n  function parseJbig2Chunks(chunks) {\n    var visitor = new SimpleSegmentVisitor();\n    for (var i = 0, ii = chunks.length; i < ii; i++) {\n      var chunk = chunks[i];\n      var segments = readSegments({}, chunk.data, chunk.start, chunk.end);\n      processSegments(segments, visitor);\n    }\n    return visitor.buffer;\n  }\n  function SimpleSegmentVisitor() {}\n  SimpleSegmentVisitor.prototype = {\n    onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) {\n      this.currentPageInfo = info;\n      var rowSize = info.width + 7 >> 3;\n      var buffer = new Uint8Array(rowSize * info.height);\n      if (info.defaultPixelValue) {\n        for (var i = 0, ii = buffer.length; i < ii; i++) {\n          buffer[i] = 0xFF;\n        }\n      }\n      this.buffer = buffer;\n    },\n    drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) {\n      var pageInfo = this.currentPageInfo;\n      var width = regionInfo.width,\n          height = regionInfo.height;\n      var rowSize = pageInfo.width + 7 >> 3;\n      var combinationOperator = pageInfo.combinationOperatorOverride ? regionInfo.combinationOperator : pageInfo.combinationOperator;\n      var buffer = this.buffer;\n      var mask0 = 128 >> (regionInfo.x & 7);\n      var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3);\n      var i, j, mask, offset;\n      switch (combinationOperator) {\n        case 0:\n          for (i = 0; i < height; i++) {\n            mask = mask0;\n            offset = offset0;\n            for (j = 0; j < width; j++) {\n              if (bitmap[i][j]) {\n                buffer[offset] |= mask;\n              }\n              mask >>= 1;\n              if (!mask) {\n                mask = 128;\n                offset++;\n              }\n            }\n            offset0 += rowSize;\n          }\n          break;\n        case 2:\n          for (i = 0; i < height; i++) {\n            mask = mask0;\n            offset = offset0;\n            for (j = 0; j < width; j++) {\n              if (bitmap[i][j]) {\n                buffer[offset] ^= mask;\n              }\n              mask >>= 1;\n              if (!mask) {\n                mask = 128;\n                offset++;\n              }\n            }\n            offset0 += rowSize;\n          }\n          break;\n        default:\n          throw new Jbig2Error('operator ' + combinationOperator + ' is not supported');\n      }\n    },\n    onImmediateGenericRegion: function SimpleSegmentVisitor_onImmediateGenericRegion(region, data, start, end) {\n      var regionInfo = region.info;\n      var decodingContext = new DecodingContext(data, start, end);\n      var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, region.template, region.prediction, null, region.at, decodingContext);\n      this.drawBitmap(regionInfo, bitmap);\n    },\n    onImmediateLosslessGenericRegion: function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() {\n      this.onImmediateGenericRegion.apply(this, arguments);\n    },\n    onSymbolDictionary: function SimpleSegmentVisitor_onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) {\n      var huffmanTables;\n      if (dictionary.huffman) {\n        throw new Jbig2Error('huffman is not supported');\n      }\n      var symbols = this.symbols;\n      if (!symbols) {\n        this.symbols = symbols = {};\n      }\n      var inputSymbols = [];\n      for (var i = 0, ii = referredSegments.length; i < ii; i++) {\n        inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]);\n      }\n      var decodingContext = new DecodingContext(data, start, end);\n      symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext);\n    },\n    onImmediateTextRegion: function SimpleSegmentVisitor_onImmediateTextRegion(region, referredSegments, data, start, end) {\n      var regionInfo = region.info;\n      var huffmanTables;\n      var symbols = this.symbols;\n      var inputSymbols = [];\n      for (var i = 0, ii = referredSegments.length; i < ii; i++) {\n        inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]);\n      }\n      var symbolCodeLength = (0, _util.log2)(inputSymbols.length);\n      var decodingContext = new DecodingContext(data, start, end);\n      var bitmap = decodeTextRegion(region.huffman, region.refinement, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.numberOfSymbolInstances, region.stripSize, inputSymbols, symbolCodeLength, region.transposed, region.dsOffset, region.referenceCorner, region.combinationOperator, huffmanTables, region.refinementTemplate, region.refinementAt, decodingContext);\n      this.drawBitmap(regionInfo, bitmap);\n    },\n    onImmediateLosslessTextRegion: function SimpleSegmentVisitor_onImmediateLosslessTextRegion() {\n      this.onImmediateTextRegion.apply(this, arguments);\n    }\n  };\n  function Jbig2Image() {}\n  Jbig2Image.prototype = {\n    parseChunks: function Jbig2Image_parseChunks(chunks) {\n      return parseJbig2Chunks(chunks);\n    }\n  };\n  return Jbig2Image;\n}();\nexports.Jbig2Image = Jbig2Image;\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.JpegImage = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _util = __w_pdfjs_require__(0);\n\nvar JpegError = function JpegErrorClosure() {\n  function JpegError(msg) {\n    this.message = 'JPEG error: ' + msg;\n  }\n  JpegError.prototype = new Error();\n  JpegError.prototype.name = 'JpegError';\n  JpegError.constructor = JpegError;\n  return JpegError;\n}();\nvar JpegImage = function JpegImageClosure() {\n  var dctZigZag = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]);\n  var dctCos1 = 4017;\n  var dctSin1 = 799;\n  var dctCos3 = 3406;\n  var dctSin3 = 2276;\n  var dctCos6 = 1567;\n  var dctSin6 = 3784;\n  var dctSqrt2 = 5793;\n  var dctSqrt1d2 = 2896;\n  function JpegImage() {\n    this.decodeTransform = null;\n    this.colorTransform = -1;\n  }\n  function buildHuffmanTable(codeLengths, values) {\n    var k = 0,\n        code = [],\n        i,\n        j,\n        length = 16;\n    while (length > 0 && !codeLengths[length - 1]) {\n      length--;\n    }\n    code.push({\n      children: [],\n      index: 0\n    });\n    var p = code[0],\n        q;\n    for (i = 0; i < length; i++) {\n      for (j = 0; j < codeLengths[i]; j++) {\n        p = code.pop();\n        p.children[p.index] = values[k];\n        while (p.index > 0) {\n          p = code.pop();\n        }\n        p.index++;\n        code.push(p);\n        while (code.length <= i) {\n          code.push(q = {\n            children: [],\n            index: 0\n          });\n          p.children[p.index] = q.children;\n          p = q;\n        }\n        k++;\n      }\n      if (i + 1 < length) {\n        code.push(q = {\n          children: [],\n          index: 0\n        });\n        p.children[p.index] = q.children;\n        p = q;\n      }\n    }\n    return code[0].children;\n  }\n  function getBlockBufferOffset(component, row, col) {\n    return 64 * ((component.blocksPerLine + 1) * row + col);\n  }\n  function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) {\n    var mcusPerLine = frame.mcusPerLine;\n    var progressive = frame.progressive;\n    var startOffset = offset,\n        bitsData = 0,\n        bitsCount = 0;\n    function readBit() {\n      if (bitsCount > 0) {\n        bitsCount--;\n        return bitsData >> bitsCount & 1;\n      }\n      bitsData = data[offset++];\n      if (bitsData === 0xFF) {\n        var nextByte = data[offset++];\n        if (nextByte) {\n          throw new JpegError('unexpected marker ' + (bitsData << 8 | nextByte).toString(16));\n        }\n      }\n      bitsCount = 7;\n      return bitsData >>> 7;\n    }\n    function decodeHuffman(tree) {\n      var node = tree;\n      while (true) {\n        node = node[readBit()];\n        if (typeof node === 'number') {\n          return node;\n        }\n        if ((typeof node === 'undefined' ? 'undefined' : _typeof(node)) !== 'object') {\n          throw new JpegError('invalid huffman sequence');\n        }\n      }\n    }\n    function receive(length) {\n      var n = 0;\n      while (length > 0) {\n        n = n << 1 | readBit();\n        length--;\n      }\n      return n;\n    }\n    function receiveAndExtend(length) {\n      if (length === 1) {\n        return readBit() === 1 ? 1 : -1;\n      }\n      var n = receive(length);\n      if (n >= 1 << length - 1) {\n        return n;\n      }\n      return n + (-1 << length) + 1;\n    }\n    function decodeBaseline(component, offset) {\n      var t = decodeHuffman(component.huffmanTableDC);\n      var diff = t === 0 ? 0 : receiveAndExtend(t);\n      component.blockData[offset] = component.pred += diff;\n      var k = 1;\n      while (k < 64) {\n        var rs = decodeHuffman(component.huffmanTableAC);\n        var s = rs & 15,\n            r = rs >> 4;\n        if (s === 0) {\n          if (r < 15) {\n            break;\n          }\n          k += 16;\n          continue;\n        }\n        k += r;\n        var z = dctZigZag[k];\n        component.blockData[offset + z] = receiveAndExtend(s);\n        k++;\n      }\n    }\n    function decodeDCFirst(component, offset) {\n      var t = decodeHuffman(component.huffmanTableDC);\n      var diff = t === 0 ? 0 : receiveAndExtend(t) << successive;\n      component.blockData[offset] = component.pred += diff;\n    }\n    function decodeDCSuccessive(component, offset) {\n      component.blockData[offset] |= readBit() << successive;\n    }\n    var eobrun = 0;\n    function decodeACFirst(component, offset) {\n      if (eobrun > 0) {\n        eobrun--;\n        return;\n      }\n      var k = spectralStart,\n          e = spectralEnd;\n      while (k <= e) {\n        var rs = decodeHuffman(component.huffmanTableAC);\n        var s = rs & 15,\n            r = rs >> 4;\n        if (s === 0) {\n          if (r < 15) {\n            eobrun = receive(r) + (1 << r) - 1;\n            break;\n          }\n          k += 16;\n          continue;\n        }\n        k += r;\n        var z = dctZigZag[k];\n        component.blockData[offset + z] = receiveAndExtend(s) * (1 << successive);\n        k++;\n      }\n    }\n    var successiveACState = 0,\n        successiveACNextValue;\n    function decodeACSuccessive(component, offset) {\n      var k = spectralStart;\n      var e = spectralEnd;\n      var r = 0;\n      var s;\n      var rs;\n      while (k <= e) {\n        var z = dctZigZag[k];\n        switch (successiveACState) {\n          case 0:\n            rs = decodeHuffman(component.huffmanTableAC);\n            s = rs & 15;\n            r = rs >> 4;\n            if (s === 0) {\n              if (r < 15) {\n                eobrun = receive(r) + (1 << r);\n                successiveACState = 4;\n              } else {\n                r = 16;\n                successiveACState = 1;\n              }\n            } else {\n              if (s !== 1) {\n                throw new JpegError('invalid ACn encoding');\n              }\n              successiveACNextValue = receiveAndExtend(s);\n              successiveACState = r ? 2 : 3;\n            }\n            continue;\n          case 1:\n          case 2:\n            if (component.blockData[offset + z]) {\n              component.blockData[offset + z] += readBit() << successive;\n            } else {\n              r--;\n              if (r === 0) {\n                successiveACState = successiveACState === 2 ? 3 : 0;\n              }\n            }\n            break;\n          case 3:\n            if (component.blockData[offset + z]) {\n              component.blockData[offset + z] += readBit() << successive;\n            } else {\n              component.blockData[offset + z] = successiveACNextValue << successive;\n              successiveACState = 0;\n            }\n            break;\n          case 4:\n            if (component.blockData[offset + z]) {\n              component.blockData[offset + z] += readBit() << successive;\n            }\n            break;\n        }\n        k++;\n      }\n      if (successiveACState === 4) {\n        eobrun--;\n        if (eobrun === 0) {\n          successiveACState = 0;\n        }\n      }\n    }\n    function decodeMcu(component, decode, mcu, row, col) {\n      var mcuRow = mcu / mcusPerLine | 0;\n      var mcuCol = mcu % mcusPerLine;\n      var blockRow = mcuRow * component.v + row;\n      var blockCol = mcuCol * component.h + col;\n      var offset = getBlockBufferOffset(component, blockRow, blockCol);\n      decode(component, offset);\n    }\n    function decodeBlock(component, decode, mcu) {\n      var blockRow = mcu / component.blocksPerLine | 0;\n      var blockCol = mcu % component.blocksPerLine;\n      var offset = getBlockBufferOffset(component, blockRow, blockCol);\n      decode(component, offset);\n    }\n    var componentsLength = components.length;\n    var component, i, j, k, n;\n    var decodeFn;\n    if (progressive) {\n      if (spectralStart === 0) {\n        decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;\n      } else {\n        decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;\n      }\n    } else {\n      decodeFn = decodeBaseline;\n    }\n    var mcu = 0,\n        fileMarker;\n    var mcuExpected;\n    if (componentsLength === 1) {\n      mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;\n    } else {\n      mcuExpected = mcusPerLine * frame.mcusPerColumn;\n    }\n    var h, v;\n    while (mcu < mcuExpected) {\n      var mcuToRead = resetInterval ? Math.min(mcuExpected - mcu, resetInterval) : mcuExpected;\n      for (i = 0; i < componentsLength; i++) {\n        components[i].pred = 0;\n      }\n      eobrun = 0;\n      if (componentsLength === 1) {\n        component = components[0];\n        for (n = 0; n < mcuToRead; n++) {\n          decodeBlock(component, decodeFn, mcu);\n          mcu++;\n        }\n      } else {\n        for (n = 0; n < mcuToRead; n++) {\n          for (i = 0; i < componentsLength; i++) {\n            component = components[i];\n            h = component.h;\n            v = component.v;\n            for (j = 0; j < v; j++) {\n              for (k = 0; k < h; k++) {\n                decodeMcu(component, decodeFn, mcu, j, k);\n              }\n            }\n          }\n          mcu++;\n        }\n      }\n      bitsCount = 0;\n      fileMarker = findNextFileMarker(data, offset);\n      if (fileMarker && fileMarker.invalid) {\n        (0, _util.warn)('decodeScan - unexpected MCU data, next marker is: ' + fileMarker.invalid);\n        offset = fileMarker.offset;\n      }\n      var marker = fileMarker && fileMarker.marker;\n      if (!marker || marker <= 0xFF00) {\n        throw new JpegError('marker was not found');\n      }\n      if (marker >= 0xFFD0 && marker <= 0xFFD7) {\n        offset += 2;\n      } else {\n        break;\n      }\n    }\n    fileMarker = findNextFileMarker(data, offset);\n    if (fileMarker && fileMarker.invalid) {\n      (0, _util.warn)('decodeScan - unexpected Scan data, next marker is: ' + fileMarker.invalid);\n      offset = fileMarker.offset;\n    }\n    return offset - startOffset;\n  }\n  function quantizeAndInverse(component, blockBufferOffset, p) {\n    var qt = component.quantizationTable,\n        blockData = component.blockData;\n    var v0, v1, v2, v3, v4, v5, v6, v7;\n    var p0, p1, p2, p3, p4, p5, p6, p7;\n    var t;\n    if (!qt) {\n      throw new JpegError('missing required Quantization Table.');\n    }\n    for (var row = 0; row < 64; row += 8) {\n      p0 = blockData[blockBufferOffset + row];\n      p1 = blockData[blockBufferOffset + row + 1];\n      p2 = blockData[blockBufferOffset + row + 2];\n      p3 = blockData[blockBufferOffset + row + 3];\n      p4 = blockData[blockBufferOffset + row + 4];\n      p5 = blockData[blockBufferOffset + row + 5];\n      p6 = blockData[blockBufferOffset + row + 6];\n      p7 = blockData[blockBufferOffset + row + 7];\n      p0 *= qt[row];\n      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {\n        t = dctSqrt2 * p0 + 512 >> 10;\n        p[row] = t;\n        p[row + 1] = t;\n        p[row + 2] = t;\n        p[row + 3] = t;\n        p[row + 4] = t;\n        p[row + 5] = t;\n        p[row + 6] = t;\n        p[row + 7] = t;\n        continue;\n      }\n      p1 *= qt[row + 1];\n      p2 *= qt[row + 2];\n      p3 *= qt[row + 3];\n      p4 *= qt[row + 4];\n      p5 *= qt[row + 5];\n      p6 *= qt[row + 6];\n      p7 *= qt[row + 7];\n      v0 = dctSqrt2 * p0 + 128 >> 8;\n      v1 = dctSqrt2 * p4 + 128 >> 8;\n      v2 = p2;\n      v3 = p6;\n      v4 = dctSqrt1d2 * (p1 - p7) + 128 >> 8;\n      v7 = dctSqrt1d2 * (p1 + p7) + 128 >> 8;\n      v5 = p3 << 4;\n      v6 = p5 << 4;\n      v0 = v0 + v1 + 1 >> 1;\n      v1 = v0 - v1;\n      t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8;\n      v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8;\n      v3 = t;\n      v4 = v4 + v6 + 1 >> 1;\n      v6 = v4 - v6;\n      v7 = v7 + v5 + 1 >> 1;\n      v5 = v7 - v5;\n      v0 = v0 + v3 + 1 >> 1;\n      v3 = v0 - v3;\n      v1 = v1 + v2 + 1 >> 1;\n      v2 = v1 - v2;\n      t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;\n      v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;\n      v7 = t;\n      t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;\n      v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;\n      v6 = t;\n      p[row] = v0 + v7;\n      p[row + 7] = v0 - v7;\n      p[row + 1] = v1 + v6;\n      p[row + 6] = v1 - v6;\n      p[row + 2] = v2 + v5;\n      p[row + 5] = v2 - v5;\n      p[row + 3] = v3 + v4;\n      p[row + 4] = v3 - v4;\n    }\n    for (var col = 0; col < 8; ++col) {\n      p0 = p[col];\n      p1 = p[col + 8];\n      p2 = p[col + 16];\n      p3 = p[col + 24];\n      p4 = p[col + 32];\n      p5 = p[col + 40];\n      p6 = p[col + 48];\n      p7 = p[col + 56];\n      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {\n        t = dctSqrt2 * p0 + 8192 >> 14;\n        t = t < -2040 ? 0 : t >= 2024 ? 255 : t + 2056 >> 4;\n        blockData[blockBufferOffset + col] = t;\n        blockData[blockBufferOffset + col + 8] = t;\n        blockData[blockBufferOffset + col + 16] = t;\n        blockData[blockBufferOffset + col + 24] = t;\n        blockData[blockBufferOffset + col + 32] = t;\n        blockData[blockBufferOffset + col + 40] = t;\n        blockData[blockBufferOffset + col + 48] = t;\n        blockData[blockBufferOffset + col + 56] = t;\n        continue;\n      }\n      v0 = dctSqrt2 * p0 + 2048 >> 12;\n      v1 = dctSqrt2 * p4 + 2048 >> 12;\n      v2 = p2;\n      v3 = p6;\n      v4 = dctSqrt1d2 * (p1 - p7) + 2048 >> 12;\n      v7 = dctSqrt1d2 * (p1 + p7) + 2048 >> 12;\n      v5 = p3;\n      v6 = p5;\n      v0 = (v0 + v1 + 1 >> 1) + 4112;\n      v1 = v0 - v1;\n      t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12;\n      v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12;\n      v3 = t;\n      v4 = v4 + v6 + 1 >> 1;\n      v6 = v4 - v6;\n      v7 = v7 + v5 + 1 >> 1;\n      v5 = v7 - v5;\n      v0 = v0 + v3 + 1 >> 1;\n      v3 = v0 - v3;\n      v1 = v1 + v2 + 1 >> 1;\n      v2 = v1 - v2;\n      t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;\n      v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;\n      v7 = t;\n      t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;\n      v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;\n      v6 = t;\n      p0 = v0 + v7;\n      p7 = v0 - v7;\n      p1 = v1 + v6;\n      p6 = v1 - v6;\n      p2 = v2 + v5;\n      p5 = v2 - v5;\n      p3 = v3 + v4;\n      p4 = v3 - v4;\n      p0 = p0 < 16 ? 0 : p0 >= 4080 ? 255 : p0 >> 4;\n      p1 = p1 < 16 ? 0 : p1 >= 4080 ? 255 : p1 >> 4;\n      p2 = p2 < 16 ? 0 : p2 >= 4080 ? 255 : p2 >> 4;\n      p3 = p3 < 16 ? 0 : p3 >= 4080 ? 255 : p3 >> 4;\n      p4 = p4 < 16 ? 0 : p4 >= 4080 ? 255 : p4 >> 4;\n      p5 = p5 < 16 ? 0 : p5 >= 4080 ? 255 : p5 >> 4;\n      p6 = p6 < 16 ? 0 : p6 >= 4080 ? 255 : p6 >> 4;\n      p7 = p7 < 16 ? 0 : p7 >= 4080 ? 255 : p7 >> 4;\n      blockData[blockBufferOffset + col] = p0;\n      blockData[blockBufferOffset + col + 8] = p1;\n      blockData[blockBufferOffset + col + 16] = p2;\n      blockData[blockBufferOffset + col + 24] = p3;\n      blockData[blockBufferOffset + col + 32] = p4;\n      blockData[blockBufferOffset + col + 40] = p5;\n      blockData[blockBufferOffset + col + 48] = p6;\n      blockData[blockBufferOffset + col + 56] = p7;\n    }\n  }\n  function buildComponentData(frame, component) {\n    var blocksPerLine = component.blocksPerLine;\n    var blocksPerColumn = component.blocksPerColumn;\n    var computationBuffer = new Int16Array(64);\n    for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {\n      for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {\n        var offset = getBlockBufferOffset(component, blockRow, blockCol);\n        quantizeAndInverse(component, offset, computationBuffer);\n      }\n    }\n    return component.blockData;\n  }\n  function clamp0to255(a) {\n    return a <= 0 ? 0 : a >= 255 ? 255 : a;\n  }\n  function findNextFileMarker(data, currentPos, startPos) {\n    function peekUint16(pos) {\n      return data[pos] << 8 | data[pos + 1];\n    }\n    var maxPos = data.length - 1;\n    var newPos = startPos < currentPos ? startPos : currentPos;\n    if (currentPos >= maxPos) {\n      return null;\n    }\n    var currentMarker = peekUint16(currentPos);\n    if (currentMarker >= 0xFFC0 && currentMarker <= 0xFFFE) {\n      return {\n        invalid: null,\n        marker: currentMarker,\n        offset: currentPos\n      };\n    }\n    var newMarker = peekUint16(newPos);\n    while (!(newMarker >= 0xFFC0 && newMarker <= 0xFFFE)) {\n      if (++newPos >= maxPos) {\n        return null;\n      }\n      newMarker = peekUint16(newPos);\n    }\n    return {\n      invalid: currentMarker.toString(16),\n      marker: newMarker,\n      offset: newPos\n    };\n  }\n  JpegImage.prototype = {\n    parse: function parse(data) {\n      function readUint16() {\n        var value = data[offset] << 8 | data[offset + 1];\n        offset += 2;\n        return value;\n      }\n      function readDataBlock() {\n        var length = readUint16();\n        var endOffset = offset + length - 2;\n        var fileMarker = findNextFileMarker(data, endOffset, offset);\n        if (fileMarker && fileMarker.invalid) {\n          (0, _util.warn)('readDataBlock - incorrect length, next marker is: ' + fileMarker.invalid);\n          endOffset = fileMarker.offset;\n        }\n        var array = data.subarray(offset, endOffset);\n        offset += array.length;\n        return array;\n      }\n      function prepareComponents(frame) {\n        var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);\n        var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);\n        for (var i = 0; i < frame.components.length; i++) {\n          component = frame.components[i];\n          var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH);\n          var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV);\n          var blocksPerLineForMcu = mcusPerLine * component.h;\n          var blocksPerColumnForMcu = mcusPerColumn * component.v;\n          var blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1);\n          component.blockData = new Int16Array(blocksBufferSize);\n          component.blocksPerLine = blocksPerLine;\n          component.blocksPerColumn = blocksPerColumn;\n        }\n        frame.mcusPerLine = mcusPerLine;\n        frame.mcusPerColumn = mcusPerColumn;\n      }\n      var offset = 0;\n      var jfif = null;\n      var adobe = null;\n      var frame, resetInterval;\n      var quantizationTables = [];\n      var huffmanTablesAC = [],\n          huffmanTablesDC = [];\n      var fileMarker = readUint16();\n      if (fileMarker !== 0xFFD8) {\n        throw new JpegError('SOI not found');\n      }\n      fileMarker = readUint16();\n      while (fileMarker !== 0xFFD9) {\n        var i, j, l;\n        switch (fileMarker) {\n          case 0xFFE0:\n          case 0xFFE1:\n          case 0xFFE2:\n          case 0xFFE3:\n          case 0xFFE4:\n          case 0xFFE5:\n          case 0xFFE6:\n          case 0xFFE7:\n          case 0xFFE8:\n          case 0xFFE9:\n          case 0xFFEA:\n          case 0xFFEB:\n          case 0xFFEC:\n          case 0xFFED:\n          case 0xFFEE:\n          case 0xFFEF:\n          case 0xFFFE:\n            var appData = readDataBlock();\n            if (fileMarker === 0xFFE0) {\n              if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) {\n                jfif = {\n                  version: {\n                    major: appData[5],\n                    minor: appData[6]\n                  },\n                  densityUnits: appData[7],\n                  xDensity: appData[8] << 8 | appData[9],\n                  yDensity: appData[10] << 8 | appData[11],\n                  thumbWidth: appData[12],\n                  thumbHeight: appData[13],\n                  thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])\n                };\n              }\n            }\n            if (fileMarker === 0xFFEE) {\n              if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F && appData[3] === 0x62 && appData[4] === 0x65) {\n                adobe = {\n                  version: appData[5] << 8 | appData[6],\n                  flags0: appData[7] << 8 | appData[8],\n                  flags1: appData[9] << 8 | appData[10],\n                  transformCode: appData[11]\n                };\n              }\n            }\n            break;\n          case 0xFFDB:\n            var quantizationTablesLength = readUint16();\n            var quantizationTablesEnd = quantizationTablesLength + offset - 2;\n            var z;\n            while (offset < quantizationTablesEnd) {\n              var quantizationTableSpec = data[offset++];\n              var tableData = new Uint16Array(64);\n              if (quantizationTableSpec >> 4 === 0) {\n                for (j = 0; j < 64; j++) {\n                  z = dctZigZag[j];\n                  tableData[z] = data[offset++];\n                }\n              } else if (quantizationTableSpec >> 4 === 1) {\n                for (j = 0; j < 64; j++) {\n                  z = dctZigZag[j];\n                  tableData[z] = readUint16();\n                }\n              } else {\n                throw new JpegError('DQT - invalid table spec');\n              }\n              quantizationTables[quantizationTableSpec & 15] = tableData;\n            }\n            break;\n          case 0xFFC0:\n          case 0xFFC1:\n          case 0xFFC2:\n            if (frame) {\n              throw new JpegError('Only single frame JPEGs supported');\n            }\n            readUint16();\n            frame = {};\n            frame.extended = fileMarker === 0xFFC1;\n            frame.progressive = fileMarker === 0xFFC2;\n            frame.precision = data[offset++];\n            frame.scanLines = readUint16();\n            frame.samplesPerLine = readUint16();\n            frame.components = [];\n            frame.componentIds = {};\n            var componentsCount = data[offset++],\n                componentId;\n            var maxH = 0,\n                maxV = 0;\n            for (i = 0; i < componentsCount; i++) {\n              componentId = data[offset];\n              var h = data[offset + 1] >> 4;\n              var v = data[offset + 1] & 15;\n              if (maxH < h) {\n                maxH = h;\n              }\n              if (maxV < v) {\n                maxV = v;\n              }\n              var qId = data[offset + 2];\n              l = frame.components.push({\n                h: h,\n                v: v,\n                quantizationId: qId,\n                quantizationTable: null\n              });\n              frame.componentIds[componentId] = l - 1;\n              offset += 3;\n            }\n            frame.maxH = maxH;\n            frame.maxV = maxV;\n            prepareComponents(frame);\n            break;\n          case 0xFFC4:\n            var huffmanLength = readUint16();\n            for (i = 2; i < huffmanLength;) {\n              var huffmanTableSpec = data[offset++];\n              var codeLengths = new Uint8Array(16);\n              var codeLengthSum = 0;\n              for (j = 0; j < 16; j++, offset++) {\n                codeLengthSum += codeLengths[j] = data[offset];\n              }\n              var huffmanValues = new Uint8Array(codeLengthSum);\n              for (j = 0; j < codeLengthSum; j++, offset++) {\n                huffmanValues[j] = data[offset];\n              }\n              i += 17 + codeLengthSum;\n              (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues);\n            }\n            break;\n          case 0xFFDD:\n            readUint16();\n            resetInterval = readUint16();\n            break;\n          case 0xFFDA:\n            readUint16();\n            var selectorsCount = data[offset++];\n            var components = [],\n                component;\n            for (i = 0; i < selectorsCount; i++) {\n              var componentIndex = frame.componentIds[data[offset++]];\n              component = frame.components[componentIndex];\n              var tableSpec = data[offset++];\n              component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];\n              component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];\n              components.push(component);\n            }\n            var spectralStart = data[offset++];\n            var spectralEnd = data[offset++];\n            var successiveApproximation = data[offset++];\n            var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15);\n            offset += processed;\n            break;\n          case 0xFFFF:\n            if (data[offset] !== 0xFF) {\n              offset--;\n            }\n            break;\n          default:\n            if (data[offset - 3] === 0xFF && data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {\n              offset -= 3;\n              break;\n            }\n            throw new JpegError('unknown marker ' + fileMarker.toString(16));\n        }\n        fileMarker = readUint16();\n      }\n      this.width = frame.samplesPerLine;\n      this.height = frame.scanLines;\n      this.jfif = jfif;\n      this.adobe = adobe;\n      this.components = [];\n      for (i = 0; i < frame.components.length; i++) {\n        component = frame.components[i];\n        var quantizationTable = quantizationTables[component.quantizationId];\n        if (quantizationTable) {\n          component.quantizationTable = quantizationTable;\n        }\n        this.components.push({\n          output: buildComponentData(frame, component),\n          scaleX: component.h / frame.maxH,\n          scaleY: component.v / frame.maxV,\n          blocksPerLine: component.blocksPerLine,\n          blocksPerColumn: component.blocksPerColumn\n        });\n      }\n      this.numComponents = this.components.length;\n    },\n    _getLinearizedBlockData: function getLinearizedBlockData(width, height) {\n      var scaleX = this.width / width,\n          scaleY = this.height / height;\n      var component, componentScaleX, componentScaleY, blocksPerScanline;\n      var x, y, i, j, k;\n      var index;\n      var offset = 0;\n      var output;\n      var numComponents = this.components.length;\n      var dataLength = width * height * numComponents;\n      var data = new Uint8Array(dataLength);\n      var xScaleBlockOffset = new Uint32Array(width);\n      var mask3LSB = 0xfffffff8;\n      for (i = 0; i < numComponents; i++) {\n        component = this.components[i];\n        componentScaleX = component.scaleX * scaleX;\n        componentScaleY = component.scaleY * scaleY;\n        offset = i;\n        output = component.output;\n        blocksPerScanline = component.blocksPerLine + 1 << 3;\n        for (x = 0; x < width; x++) {\n          j = 0 | x * componentScaleX;\n          xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7;\n        }\n        for (y = 0; y < height; y++) {\n          j = 0 | y * componentScaleY;\n          index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3;\n          for (x = 0; x < width; x++) {\n            data[offset] = output[index + xScaleBlockOffset[x]];\n            offset += numComponents;\n          }\n        }\n      }\n      var transform = this.decodeTransform;\n      if (transform) {\n        for (i = 0; i < dataLength;) {\n          for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) {\n            data[i] = (data[i] * transform[k] >> 8) + transform[k + 1];\n          }\n        }\n      }\n      return data;\n    },\n    _isColorConversionNeeded: function _isColorConversionNeeded() {\n      if (this.adobe) {\n        return !!this.adobe.transformCode;\n      }\n      if (this.numComponents === 3) {\n        if (this.colorTransform === 0) {\n          return false;\n        }\n        return true;\n      }\n      if (this.colorTransform === 1) {\n        return true;\n      }\n      return false;\n    },\n\n    _convertYccToRgb: function convertYccToRgb(data) {\n      var Y, Cb, Cr;\n      for (var i = 0, length = data.length; i < length; i += 3) {\n        Y = data[i];\n        Cb = data[i + 1];\n        Cr = data[i + 2];\n        data[i] = clamp0to255(Y - 179.456 + 1.402 * Cr);\n        data[i + 1] = clamp0to255(Y + 135.459 - 0.344 * Cb - 0.714 * Cr);\n        data[i + 2] = clamp0to255(Y - 226.816 + 1.772 * Cb);\n      }\n      return data;\n    },\n    _convertYcckToRgb: function convertYcckToRgb(data) {\n      var Y, Cb, Cr, k;\n      var offset = 0;\n      for (var i = 0, length = data.length; i < length; i += 4) {\n        Y = data[i];\n        Cb = data[i + 1];\n        Cr = data[i + 2];\n        k = data[i + 3];\n        var r = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776);\n        var g = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665);\n        var b = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407);\n        data[offset++] = clamp0to255(r);\n        data[offset++] = clamp0to255(g);\n        data[offset++] = clamp0to255(b);\n      }\n      return data;\n    },\n    _convertYcckToCmyk: function convertYcckToCmyk(data) {\n      var Y, Cb, Cr;\n      for (var i = 0, length = data.length; i < length; i += 4) {\n        Y = data[i];\n        Cb = data[i + 1];\n        Cr = data[i + 2];\n        data[i] = clamp0to255(434.456 - Y - 1.402 * Cr);\n        data[i + 1] = clamp0to255(119.541 - Y + 0.344 * Cb + 0.714 * Cr);\n        data[i + 2] = clamp0to255(481.816 - Y - 1.772 * Cb);\n      }\n      return data;\n    },\n    _convertCmykToRgb: function convertCmykToRgb(data) {\n      var c, m, y, k;\n      var offset = 0;\n      var min = -255 * 255 * 255;\n      var scale = 1 / 255 / 255;\n      for (var i = 0, length = data.length; i < length; i += 4) {\n        c = data[i];\n        m = data[i + 1];\n        y = data[i + 2];\n        k = data[i + 3];\n        var r = c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k - 72734.4411664936) + m * (1.7149763477362134 * m - 5.6096736904047315 * y - 17.873870861415444 * k - 1401.7366389350734) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 4465.541406466231) - k * (21.86122147463605 * k + 48317.86113160301);\n        var g = c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k - 20220.756542821975) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 48691.05921601825) + y * (4.444339102852739 * y + 9.8632861493405 * k - 6341.191035517494) - k * (20.737325471181034 * k + 47890.15695978492);\n        var b = c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k - 3616.812083916688) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 28620.90484698408) + y * (0.03296041114873217 * y + 115.60384449646641 * k - 49363.43385999684) - k * (22.33816807309886 * k + 45932.16563550634);\n        data[offset++] = r >= 0 ? 255 : r <= min ? 0 : 255 + r * scale | 0;\n        data[offset++] = g >= 0 ? 255 : g <= min ? 0 : 255 + g * scale | 0;\n        data[offset++] = b >= 0 ? 255 : b <= min ? 0 : 255 + b * scale | 0;\n      }\n      return data;\n    },\n    getData: function getData(width, height, forceRGBoutput) {\n      if (this.numComponents > 4) {\n        throw new JpegError('Unsupported color mode');\n      }\n      var data = this._getLinearizedBlockData(width, height);\n      if (this.numComponents === 1 && forceRGBoutput) {\n        var dataLength = data.length;\n        var rgbData = new Uint8Array(dataLength * 3);\n        var offset = 0;\n        for (var i = 0; i < dataLength; i++) {\n          var grayColor = data[i];\n          rgbData[offset++] = grayColor;\n          rgbData[offset++] = grayColor;\n          rgbData[offset++] = grayColor;\n        }\n        return rgbData;\n      } else if (this.numComponents === 3 && this._isColorConversionNeeded()) {\n        return this._convertYccToRgb(data);\n      } else if (this.numComponents === 4) {\n        if (this._isColorConversionNeeded()) {\n          if (forceRGBoutput) {\n            return this._convertYcckToRgb(data);\n          }\n          return this._convertYcckToCmyk(data);\n        } else if (forceRGBoutput) {\n          return this._convertCmykToRgb(data);\n        }\n      }\n      return data;\n    }\n  };\n  return JpegImage;\n}();\nexports.JpegImage = JpegImage;\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getMetrics = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar getMetrics = (0, _util.getLookupTableFactory)(function (t) {\n  t['Courier'] = 600;\n  t['Courier-Bold'] = 600;\n  t['Courier-BoldOblique'] = 600;\n  t['Courier-Oblique'] = 600;\n  t['Helvetica'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 278;\n    t['exclam'] = 278;\n    t['quotedbl'] = 355;\n    t['numbersign'] = 556;\n    t['dollar'] = 556;\n    t['percent'] = 889;\n    t['ampersand'] = 667;\n    t['quoteright'] = 222;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 389;\n    t['plus'] = 584;\n    t['comma'] = 278;\n    t['hyphen'] = 333;\n    t['period'] = 278;\n    t['slash'] = 278;\n    t['zero'] = 556;\n    t['one'] = 556;\n    t['two'] = 556;\n    t['three'] = 556;\n    t['four'] = 556;\n    t['five'] = 556;\n    t['six'] = 556;\n    t['seven'] = 556;\n    t['eight'] = 556;\n    t['nine'] = 556;\n    t['colon'] = 278;\n    t['semicolon'] = 278;\n    t['less'] = 584;\n    t['equal'] = 584;\n    t['greater'] = 584;\n    t['question'] = 556;\n    t['at'] = 1015;\n    t['A'] = 667;\n    t['B'] = 667;\n    t['C'] = 722;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 611;\n    t['G'] = 778;\n    t['H'] = 722;\n    t['I'] = 278;\n    t['J'] = 500;\n    t['K'] = 667;\n    t['L'] = 556;\n    t['M'] = 833;\n    t['N'] = 722;\n    t['O'] = 778;\n    t['P'] = 667;\n    t['Q'] = 778;\n    t['R'] = 722;\n    t['S'] = 667;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 667;\n    t['W'] = 944;\n    t['X'] = 667;\n    t['Y'] = 667;\n    t['Z'] = 611;\n    t['bracketleft'] = 278;\n    t['backslash'] = 278;\n    t['bracketright'] = 278;\n    t['asciicircum'] = 469;\n    t['underscore'] = 556;\n    t['quoteleft'] = 222;\n    t['a'] = 556;\n    t['b'] = 556;\n    t['c'] = 500;\n    t['d'] = 556;\n    t['e'] = 556;\n    t['f'] = 278;\n    t['g'] = 556;\n    t['h'] = 556;\n    t['i'] = 222;\n    t['j'] = 222;\n    t['k'] = 500;\n    t['l'] = 222;\n    t['m'] = 833;\n    t['n'] = 556;\n    t['o'] = 556;\n    t['p'] = 556;\n    t['q'] = 556;\n    t['r'] = 333;\n    t['s'] = 500;\n    t['t'] = 278;\n    t['u'] = 556;\n    t['v'] = 500;\n    t['w'] = 722;\n    t['x'] = 500;\n    t['y'] = 500;\n    t['z'] = 500;\n    t['braceleft'] = 334;\n    t['bar'] = 260;\n    t['braceright'] = 334;\n    t['asciitilde'] = 584;\n    t['exclamdown'] = 333;\n    t['cent'] = 556;\n    t['sterling'] = 556;\n    t['fraction'] = 167;\n    t['yen'] = 556;\n    t['florin'] = 556;\n    t['section'] = 556;\n    t['currency'] = 556;\n    t['quotesingle'] = 191;\n    t['quotedblleft'] = 333;\n    t['guillemotleft'] = 556;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 500;\n    t['fl'] = 500;\n    t['endash'] = 556;\n    t['dagger'] = 556;\n    t['daggerdbl'] = 556;\n    t['periodcentered'] = 278;\n    t['paragraph'] = 537;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 222;\n    t['quotedblbase'] = 333;\n    t['quotedblright'] = 333;\n    t['guillemotright'] = 556;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 611;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 1000;\n    t['ordfeminine'] = 370;\n    t['Lslash'] = 556;\n    t['Oslash'] = 778;\n    t['OE'] = 1000;\n    t['ordmasculine'] = 365;\n    t['ae'] = 889;\n    t['dotlessi'] = 278;\n    t['lslash'] = 222;\n    t['oslash'] = 611;\n    t['oe'] = 944;\n    t['germandbls'] = 611;\n    t['Idieresis'] = 278;\n    t['eacute'] = 556;\n    t['abreve'] = 556;\n    t['uhungarumlaut'] = 556;\n    t['ecaron'] = 556;\n    t['Ydieresis'] = 667;\n    t['divide'] = 584;\n    t['Yacute'] = 667;\n    t['Acircumflex'] = 667;\n    t['aacute'] = 556;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 500;\n    t['scommaaccent'] = 500;\n    t['ecircumflex'] = 556;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 556;\n    t['Uacute'] = 722;\n    t['uogonek'] = 556;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 737;\n    t['Emacron'] = 667;\n    t['ccaron'] = 500;\n    t['aring'] = 556;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 222;\n    t['agrave'] = 556;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 722;\n    t['atilde'] = 556;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 500;\n    t['scedilla'] = 500;\n    t['iacute'] = 278;\n    t['lozenge'] = 471;\n    t['Rcaron'] = 722;\n    t['Gcommaaccent'] = 778;\n    t['ucircumflex'] = 556;\n    t['acircumflex'] = 556;\n    t['Amacron'] = 667;\n    t['rcaron'] = 333;\n    t['ccedilla'] = 500;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 667;\n    t['Omacron'] = 778;\n    t['Racute'] = 722;\n    t['Sacute'] = 667;\n    t['dcaron'] = 643;\n    t['Umacron'] = 722;\n    t['uring'] = 556;\n    t['threesuperior'] = 333;\n    t['Ograve'] = 778;\n    t['Agrave'] = 667;\n    t['Abreve'] = 667;\n    t['multiply'] = 584;\n    t['uacute'] = 556;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 476;\n    t['ydieresis'] = 500;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 556;\n    t['edieresis'] = 556;\n    t['cacute'] = 500;\n    t['nacute'] = 556;\n    t['umacron'] = 556;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 278;\n    t['plusminus'] = 584;\n    t['brokenbar'] = 260;\n    t['registered'] = 737;\n    t['Gbreve'] = 778;\n    t['Idotaccent'] = 278;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 333;\n    t['omacron'] = 556;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 722;\n    t['lcommaaccent'] = 222;\n    t['tcaron'] = 317;\n    t['eogonek'] = 556;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 667;\n    t['Adieresis'] = 667;\n    t['egrave'] = 556;\n    t['zacute'] = 500;\n    t['iogonek'] = 222;\n    t['Oacute'] = 778;\n    t['oacute'] = 556;\n    t['amacron'] = 556;\n    t['sacute'] = 500;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 778;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 556;\n    t['twosuperior'] = 333;\n    t['Odieresis'] = 778;\n    t['mu'] = 556;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 556;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 556;\n    t['threequarters'] = 834;\n    t['Scedilla'] = 667;\n    t['lcaron'] = 299;\n    t['Kcommaaccent'] = 667;\n    t['Lacute'] = 556;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 556;\n    t['Igrave'] = 278;\n    t['Imacron'] = 278;\n    t['Lcaron'] = 556;\n    t['onehalf'] = 834;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 556;\n    t['ntilde'] = 556;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 556;\n    t['gbreve'] = 556;\n    t['onequarter'] = 834;\n    t['Scaron'] = 667;\n    t['Scommaaccent'] = 667;\n    t['Ohungarumlaut'] = 778;\n    t['degree'] = 400;\n    t['ograve'] = 556;\n    t['Ccaron'] = 722;\n    t['ugrave'] = 556;\n    t['radical'] = 453;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 333;\n    t['Ntilde'] = 722;\n    t['otilde'] = 556;\n    t['Rcommaaccent'] = 722;\n    t['Lcommaaccent'] = 556;\n    t['Atilde'] = 667;\n    t['Aogonek'] = 667;\n    t['Aring'] = 667;\n    t['Otilde'] = 778;\n    t['zdotaccent'] = 500;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 278;\n    t['kcommaaccent'] = 500;\n    t['minus'] = 584;\n    t['Icircumflex'] = 278;\n    t['ncaron'] = 556;\n    t['tcommaaccent'] = 278;\n    t['logicalnot'] = 584;\n    t['odieresis'] = 556;\n    t['udieresis'] = 556;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 556;\n    t['eth'] = 556;\n    t['zcaron'] = 500;\n    t['ncommaaccent'] = 556;\n    t['onesuperior'] = 333;\n    t['imacron'] = 278;\n    t['Euro'] = 556;\n  });\n  t['Helvetica-Bold'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 278;\n    t['exclam'] = 333;\n    t['quotedbl'] = 474;\n    t['numbersign'] = 556;\n    t['dollar'] = 556;\n    t['percent'] = 889;\n    t['ampersand'] = 722;\n    t['quoteright'] = 278;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 389;\n    t['plus'] = 584;\n    t['comma'] = 278;\n    t['hyphen'] = 333;\n    t['period'] = 278;\n    t['slash'] = 278;\n    t['zero'] = 556;\n    t['one'] = 556;\n    t['two'] = 556;\n    t['three'] = 556;\n    t['four'] = 556;\n    t['five'] = 556;\n    t['six'] = 556;\n    t['seven'] = 556;\n    t['eight'] = 556;\n    t['nine'] = 556;\n    t['colon'] = 333;\n    t['semicolon'] = 333;\n    t['less'] = 584;\n    t['equal'] = 584;\n    t['greater'] = 584;\n    t['question'] = 611;\n    t['at'] = 975;\n    t['A'] = 722;\n    t['B'] = 722;\n    t['C'] = 722;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 611;\n    t['G'] = 778;\n    t['H'] = 722;\n    t['I'] = 278;\n    t['J'] = 556;\n    t['K'] = 722;\n    t['L'] = 611;\n    t['M'] = 833;\n    t['N'] = 722;\n    t['O'] = 778;\n    t['P'] = 667;\n    t['Q'] = 778;\n    t['R'] = 722;\n    t['S'] = 667;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 667;\n    t['W'] = 944;\n    t['X'] = 667;\n    t['Y'] = 667;\n    t['Z'] = 611;\n    t['bracketleft'] = 333;\n    t['backslash'] = 278;\n    t['bracketright'] = 333;\n    t['asciicircum'] = 584;\n    t['underscore'] = 556;\n    t['quoteleft'] = 278;\n    t['a'] = 556;\n    t['b'] = 611;\n    t['c'] = 556;\n    t['d'] = 611;\n    t['e'] = 556;\n    t['f'] = 333;\n    t['g'] = 611;\n    t['h'] = 611;\n    t['i'] = 278;\n    t['j'] = 278;\n    t['k'] = 556;\n    t['l'] = 278;\n    t['m'] = 889;\n    t['n'] = 611;\n    t['o'] = 611;\n    t['p'] = 611;\n    t['q'] = 611;\n    t['r'] = 389;\n    t['s'] = 556;\n    t['t'] = 333;\n    t['u'] = 611;\n    t['v'] = 556;\n    t['w'] = 778;\n    t['x'] = 556;\n    t['y'] = 556;\n    t['z'] = 500;\n    t['braceleft'] = 389;\n    t['bar'] = 280;\n    t['braceright'] = 389;\n    t['asciitilde'] = 584;\n    t['exclamdown'] = 333;\n    t['cent'] = 556;\n    t['sterling'] = 556;\n    t['fraction'] = 167;\n    t['yen'] = 556;\n    t['florin'] = 556;\n    t['section'] = 556;\n    t['currency'] = 556;\n    t['quotesingle'] = 238;\n    t['quotedblleft'] = 500;\n    t['guillemotleft'] = 556;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 611;\n    t['fl'] = 611;\n    t['endash'] = 556;\n    t['dagger'] = 556;\n    t['daggerdbl'] = 556;\n    t['periodcentered'] = 278;\n    t['paragraph'] = 556;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 278;\n    t['quotedblbase'] = 500;\n    t['quotedblright'] = 500;\n    t['guillemotright'] = 556;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 611;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 1000;\n    t['ordfeminine'] = 370;\n    t['Lslash'] = 611;\n    t['Oslash'] = 778;\n    t['OE'] = 1000;\n    t['ordmasculine'] = 365;\n    t['ae'] = 889;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 611;\n    t['oe'] = 944;\n    t['germandbls'] = 611;\n    t['Idieresis'] = 278;\n    t['eacute'] = 556;\n    t['abreve'] = 556;\n    t['uhungarumlaut'] = 611;\n    t['ecaron'] = 556;\n    t['Ydieresis'] = 667;\n    t['divide'] = 584;\n    t['Yacute'] = 667;\n    t['Acircumflex'] = 722;\n    t['aacute'] = 556;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 556;\n    t['scommaaccent'] = 556;\n    t['ecircumflex'] = 556;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 556;\n    t['Uacute'] = 722;\n    t['uogonek'] = 611;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 737;\n    t['Emacron'] = 667;\n    t['ccaron'] = 556;\n    t['aring'] = 556;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 278;\n    t['agrave'] = 556;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 722;\n    t['atilde'] = 556;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 556;\n    t['scedilla'] = 556;\n    t['iacute'] = 278;\n    t['lozenge'] = 494;\n    t['Rcaron'] = 722;\n    t['Gcommaaccent'] = 778;\n    t['ucircumflex'] = 611;\n    t['acircumflex'] = 556;\n    t['Amacron'] = 722;\n    t['rcaron'] = 389;\n    t['ccedilla'] = 556;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 667;\n    t['Omacron'] = 778;\n    t['Racute'] = 722;\n    t['Sacute'] = 667;\n    t['dcaron'] = 743;\n    t['Umacron'] = 722;\n    t['uring'] = 611;\n    t['threesuperior'] = 333;\n    t['Ograve'] = 778;\n    t['Agrave'] = 722;\n    t['Abreve'] = 722;\n    t['multiply'] = 584;\n    t['uacute'] = 611;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 494;\n    t['ydieresis'] = 556;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 556;\n    t['edieresis'] = 556;\n    t['cacute'] = 556;\n    t['nacute'] = 611;\n    t['umacron'] = 611;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 278;\n    t['plusminus'] = 584;\n    t['brokenbar'] = 280;\n    t['registered'] = 737;\n    t['Gbreve'] = 778;\n    t['Idotaccent'] = 278;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 389;\n    t['omacron'] = 611;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 722;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 389;\n    t['eogonek'] = 556;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 722;\n    t['Adieresis'] = 722;\n    t['egrave'] = 556;\n    t['zacute'] = 500;\n    t['iogonek'] = 278;\n    t['Oacute'] = 778;\n    t['oacute'] = 611;\n    t['amacron'] = 556;\n    t['sacute'] = 556;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 778;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 611;\n    t['twosuperior'] = 333;\n    t['Odieresis'] = 778;\n    t['mu'] = 611;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 611;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 611;\n    t['threequarters'] = 834;\n    t['Scedilla'] = 667;\n    t['lcaron'] = 400;\n    t['Kcommaaccent'] = 722;\n    t['Lacute'] = 611;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 556;\n    t['Igrave'] = 278;\n    t['Imacron'] = 278;\n    t['Lcaron'] = 611;\n    t['onehalf'] = 834;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 611;\n    t['ntilde'] = 611;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 556;\n    t['gbreve'] = 611;\n    t['onequarter'] = 834;\n    t['Scaron'] = 667;\n    t['Scommaaccent'] = 667;\n    t['Ohungarumlaut'] = 778;\n    t['degree'] = 400;\n    t['ograve'] = 611;\n    t['Ccaron'] = 722;\n    t['ugrave'] = 611;\n    t['radical'] = 549;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 389;\n    t['Ntilde'] = 722;\n    t['otilde'] = 611;\n    t['Rcommaaccent'] = 722;\n    t['Lcommaaccent'] = 611;\n    t['Atilde'] = 722;\n    t['Aogonek'] = 722;\n    t['Aring'] = 722;\n    t['Otilde'] = 778;\n    t['zdotaccent'] = 500;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 278;\n    t['kcommaaccent'] = 556;\n    t['minus'] = 584;\n    t['Icircumflex'] = 278;\n    t['ncaron'] = 611;\n    t['tcommaaccent'] = 333;\n    t['logicalnot'] = 584;\n    t['odieresis'] = 611;\n    t['udieresis'] = 611;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 611;\n    t['eth'] = 611;\n    t['zcaron'] = 500;\n    t['ncommaaccent'] = 611;\n    t['onesuperior'] = 333;\n    t['imacron'] = 278;\n    t['Euro'] = 556;\n  });\n  t['Helvetica-BoldOblique'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 278;\n    t['exclam'] = 333;\n    t['quotedbl'] = 474;\n    t['numbersign'] = 556;\n    t['dollar'] = 556;\n    t['percent'] = 889;\n    t['ampersand'] = 722;\n    t['quoteright'] = 278;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 389;\n    t['plus'] = 584;\n    t['comma'] = 278;\n    t['hyphen'] = 333;\n    t['period'] = 278;\n    t['slash'] = 278;\n    t['zero'] = 556;\n    t['one'] = 556;\n    t['two'] = 556;\n    t['three'] = 556;\n    t['four'] = 556;\n    t['five'] = 556;\n    t['six'] = 556;\n    t['seven'] = 556;\n    t['eight'] = 556;\n    t['nine'] = 556;\n    t['colon'] = 333;\n    t['semicolon'] = 333;\n    t['less'] = 584;\n    t['equal'] = 584;\n    t['greater'] = 584;\n    t['question'] = 611;\n    t['at'] = 975;\n    t['A'] = 722;\n    t['B'] = 722;\n    t['C'] = 722;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 611;\n    t['G'] = 778;\n    t['H'] = 722;\n    t['I'] = 278;\n    t['J'] = 556;\n    t['K'] = 722;\n    t['L'] = 611;\n    t['M'] = 833;\n    t['N'] = 722;\n    t['O'] = 778;\n    t['P'] = 667;\n    t['Q'] = 778;\n    t['R'] = 722;\n    t['S'] = 667;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 667;\n    t['W'] = 944;\n    t['X'] = 667;\n    t['Y'] = 667;\n    t['Z'] = 611;\n    t['bracketleft'] = 333;\n    t['backslash'] = 278;\n    t['bracketright'] = 333;\n    t['asciicircum'] = 584;\n    t['underscore'] = 556;\n    t['quoteleft'] = 278;\n    t['a'] = 556;\n    t['b'] = 611;\n    t['c'] = 556;\n    t['d'] = 611;\n    t['e'] = 556;\n    t['f'] = 333;\n    t['g'] = 611;\n    t['h'] = 611;\n    t['i'] = 278;\n    t['j'] = 278;\n    t['k'] = 556;\n    t['l'] = 278;\n    t['m'] = 889;\n    t['n'] = 611;\n    t['o'] = 611;\n    t['p'] = 611;\n    t['q'] = 611;\n    t['r'] = 389;\n    t['s'] = 556;\n    t['t'] = 333;\n    t['u'] = 611;\n    t['v'] = 556;\n    t['w'] = 778;\n    t['x'] = 556;\n    t['y'] = 556;\n    t['z'] = 500;\n    t['braceleft'] = 389;\n    t['bar'] = 280;\n    t['braceright'] = 389;\n    t['asciitilde'] = 584;\n    t['exclamdown'] = 333;\n    t['cent'] = 556;\n    t['sterling'] = 556;\n    t['fraction'] = 167;\n    t['yen'] = 556;\n    t['florin'] = 556;\n    t['section'] = 556;\n    t['currency'] = 556;\n    t['quotesingle'] = 238;\n    t['quotedblleft'] = 500;\n    t['guillemotleft'] = 556;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 611;\n    t['fl'] = 611;\n    t['endash'] = 556;\n    t['dagger'] = 556;\n    t['daggerdbl'] = 556;\n    t['periodcentered'] = 278;\n    t['paragraph'] = 556;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 278;\n    t['quotedblbase'] = 500;\n    t['quotedblright'] = 500;\n    t['guillemotright'] = 556;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 611;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 1000;\n    t['ordfeminine'] = 370;\n    t['Lslash'] = 611;\n    t['Oslash'] = 778;\n    t['OE'] = 1000;\n    t['ordmasculine'] = 365;\n    t['ae'] = 889;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 611;\n    t['oe'] = 944;\n    t['germandbls'] = 611;\n    t['Idieresis'] = 278;\n    t['eacute'] = 556;\n    t['abreve'] = 556;\n    t['uhungarumlaut'] = 611;\n    t['ecaron'] = 556;\n    t['Ydieresis'] = 667;\n    t['divide'] = 584;\n    t['Yacute'] = 667;\n    t['Acircumflex'] = 722;\n    t['aacute'] = 556;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 556;\n    t['scommaaccent'] = 556;\n    t['ecircumflex'] = 556;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 556;\n    t['Uacute'] = 722;\n    t['uogonek'] = 611;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 737;\n    t['Emacron'] = 667;\n    t['ccaron'] = 556;\n    t['aring'] = 556;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 278;\n    t['agrave'] = 556;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 722;\n    t['atilde'] = 556;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 556;\n    t['scedilla'] = 556;\n    t['iacute'] = 278;\n    t['lozenge'] = 494;\n    t['Rcaron'] = 722;\n    t['Gcommaaccent'] = 778;\n    t['ucircumflex'] = 611;\n    t['acircumflex'] = 556;\n    t['Amacron'] = 722;\n    t['rcaron'] = 389;\n    t['ccedilla'] = 556;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 667;\n    t['Omacron'] = 778;\n    t['Racute'] = 722;\n    t['Sacute'] = 667;\n    t['dcaron'] = 743;\n    t['Umacron'] = 722;\n    t['uring'] = 611;\n    t['threesuperior'] = 333;\n    t['Ograve'] = 778;\n    t['Agrave'] = 722;\n    t['Abreve'] = 722;\n    t['multiply'] = 584;\n    t['uacute'] = 611;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 494;\n    t['ydieresis'] = 556;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 556;\n    t['edieresis'] = 556;\n    t['cacute'] = 556;\n    t['nacute'] = 611;\n    t['umacron'] = 611;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 278;\n    t['plusminus'] = 584;\n    t['brokenbar'] = 280;\n    t['registered'] = 737;\n    t['Gbreve'] = 778;\n    t['Idotaccent'] = 278;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 389;\n    t['omacron'] = 611;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 722;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 389;\n    t['eogonek'] = 556;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 722;\n    t['Adieresis'] = 722;\n    t['egrave'] = 556;\n    t['zacute'] = 500;\n    t['iogonek'] = 278;\n    t['Oacute'] = 778;\n    t['oacute'] = 611;\n    t['amacron'] = 556;\n    t['sacute'] = 556;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 778;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 611;\n    t['twosuperior'] = 333;\n    t['Odieresis'] = 778;\n    t['mu'] = 611;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 611;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 611;\n    t['threequarters'] = 834;\n    t['Scedilla'] = 667;\n    t['lcaron'] = 400;\n    t['Kcommaaccent'] = 722;\n    t['Lacute'] = 611;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 556;\n    t['Igrave'] = 278;\n    t['Imacron'] = 278;\n    t['Lcaron'] = 611;\n    t['onehalf'] = 834;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 611;\n    t['ntilde'] = 611;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 556;\n    t['gbreve'] = 611;\n    t['onequarter'] = 834;\n    t['Scaron'] = 667;\n    t['Scommaaccent'] = 667;\n    t['Ohungarumlaut'] = 778;\n    t['degree'] = 400;\n    t['ograve'] = 611;\n    t['Ccaron'] = 722;\n    t['ugrave'] = 611;\n    t['radical'] = 549;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 389;\n    t['Ntilde'] = 722;\n    t['otilde'] = 611;\n    t['Rcommaaccent'] = 722;\n    t['Lcommaaccent'] = 611;\n    t['Atilde'] = 722;\n    t['Aogonek'] = 722;\n    t['Aring'] = 722;\n    t['Otilde'] = 778;\n    t['zdotaccent'] = 500;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 278;\n    t['kcommaaccent'] = 556;\n    t['minus'] = 584;\n    t['Icircumflex'] = 278;\n    t['ncaron'] = 611;\n    t['tcommaaccent'] = 333;\n    t['logicalnot'] = 584;\n    t['odieresis'] = 611;\n    t['udieresis'] = 611;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 611;\n    t['eth'] = 611;\n    t['zcaron'] = 500;\n    t['ncommaaccent'] = 611;\n    t['onesuperior'] = 333;\n    t['imacron'] = 278;\n    t['Euro'] = 556;\n  });\n  t['Helvetica-Oblique'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 278;\n    t['exclam'] = 278;\n    t['quotedbl'] = 355;\n    t['numbersign'] = 556;\n    t['dollar'] = 556;\n    t['percent'] = 889;\n    t['ampersand'] = 667;\n    t['quoteright'] = 222;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 389;\n    t['plus'] = 584;\n    t['comma'] = 278;\n    t['hyphen'] = 333;\n    t['period'] = 278;\n    t['slash'] = 278;\n    t['zero'] = 556;\n    t['one'] = 556;\n    t['two'] = 556;\n    t['three'] = 556;\n    t['four'] = 556;\n    t['five'] = 556;\n    t['six'] = 556;\n    t['seven'] = 556;\n    t['eight'] = 556;\n    t['nine'] = 556;\n    t['colon'] = 278;\n    t['semicolon'] = 278;\n    t['less'] = 584;\n    t['equal'] = 584;\n    t['greater'] = 584;\n    t['question'] = 556;\n    t['at'] = 1015;\n    t['A'] = 667;\n    t['B'] = 667;\n    t['C'] = 722;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 611;\n    t['G'] = 778;\n    t['H'] = 722;\n    t['I'] = 278;\n    t['J'] = 500;\n    t['K'] = 667;\n    t['L'] = 556;\n    t['M'] = 833;\n    t['N'] = 722;\n    t['O'] = 778;\n    t['P'] = 667;\n    t['Q'] = 778;\n    t['R'] = 722;\n    t['S'] = 667;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 667;\n    t['W'] = 944;\n    t['X'] = 667;\n    t['Y'] = 667;\n    t['Z'] = 611;\n    t['bracketleft'] = 278;\n    t['backslash'] = 278;\n    t['bracketright'] = 278;\n    t['asciicircum'] = 469;\n    t['underscore'] = 556;\n    t['quoteleft'] = 222;\n    t['a'] = 556;\n    t['b'] = 556;\n    t['c'] = 500;\n    t['d'] = 556;\n    t['e'] = 556;\n    t['f'] = 278;\n    t['g'] = 556;\n    t['h'] = 556;\n    t['i'] = 222;\n    t['j'] = 222;\n    t['k'] = 500;\n    t['l'] = 222;\n    t['m'] = 833;\n    t['n'] = 556;\n    t['o'] = 556;\n    t['p'] = 556;\n    t['q'] = 556;\n    t['r'] = 333;\n    t['s'] = 500;\n    t['t'] = 278;\n    t['u'] = 556;\n    t['v'] = 500;\n    t['w'] = 722;\n    t['x'] = 500;\n    t['y'] = 500;\n    t['z'] = 500;\n    t['braceleft'] = 334;\n    t['bar'] = 260;\n    t['braceright'] = 334;\n    t['asciitilde'] = 584;\n    t['exclamdown'] = 333;\n    t['cent'] = 556;\n    t['sterling'] = 556;\n    t['fraction'] = 167;\n    t['yen'] = 556;\n    t['florin'] = 556;\n    t['section'] = 556;\n    t['currency'] = 556;\n    t['quotesingle'] = 191;\n    t['quotedblleft'] = 333;\n    t['guillemotleft'] = 556;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 500;\n    t['fl'] = 500;\n    t['endash'] = 556;\n    t['dagger'] = 556;\n    t['daggerdbl'] = 556;\n    t['periodcentered'] = 278;\n    t['paragraph'] = 537;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 222;\n    t['quotedblbase'] = 333;\n    t['quotedblright'] = 333;\n    t['guillemotright'] = 556;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 611;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 1000;\n    t['ordfeminine'] = 370;\n    t['Lslash'] = 556;\n    t['Oslash'] = 778;\n    t['OE'] = 1000;\n    t['ordmasculine'] = 365;\n    t['ae'] = 889;\n    t['dotlessi'] = 278;\n    t['lslash'] = 222;\n    t['oslash'] = 611;\n    t['oe'] = 944;\n    t['germandbls'] = 611;\n    t['Idieresis'] = 278;\n    t['eacute'] = 556;\n    t['abreve'] = 556;\n    t['uhungarumlaut'] = 556;\n    t['ecaron'] = 556;\n    t['Ydieresis'] = 667;\n    t['divide'] = 584;\n    t['Yacute'] = 667;\n    t['Acircumflex'] = 667;\n    t['aacute'] = 556;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 500;\n    t['scommaaccent'] = 500;\n    t['ecircumflex'] = 556;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 556;\n    t['Uacute'] = 722;\n    t['uogonek'] = 556;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 737;\n    t['Emacron'] = 667;\n    t['ccaron'] = 500;\n    t['aring'] = 556;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 222;\n    t['agrave'] = 556;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 722;\n    t['atilde'] = 556;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 500;\n    t['scedilla'] = 500;\n    t['iacute'] = 278;\n    t['lozenge'] = 471;\n    t['Rcaron'] = 722;\n    t['Gcommaaccent'] = 778;\n    t['ucircumflex'] = 556;\n    t['acircumflex'] = 556;\n    t['Amacron'] = 667;\n    t['rcaron'] = 333;\n    t['ccedilla'] = 500;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 667;\n    t['Omacron'] = 778;\n    t['Racute'] = 722;\n    t['Sacute'] = 667;\n    t['dcaron'] = 643;\n    t['Umacron'] = 722;\n    t['uring'] = 556;\n    t['threesuperior'] = 333;\n    t['Ograve'] = 778;\n    t['Agrave'] = 667;\n    t['Abreve'] = 667;\n    t['multiply'] = 584;\n    t['uacute'] = 556;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 476;\n    t['ydieresis'] = 500;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 556;\n    t['edieresis'] = 556;\n    t['cacute'] = 500;\n    t['nacute'] = 556;\n    t['umacron'] = 556;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 278;\n    t['plusminus'] = 584;\n    t['brokenbar'] = 260;\n    t['registered'] = 737;\n    t['Gbreve'] = 778;\n    t['Idotaccent'] = 278;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 333;\n    t['omacron'] = 556;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 722;\n    t['lcommaaccent'] = 222;\n    t['tcaron'] = 317;\n    t['eogonek'] = 556;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 667;\n    t['Adieresis'] = 667;\n    t['egrave'] = 556;\n    t['zacute'] = 500;\n    t['iogonek'] = 222;\n    t['Oacute'] = 778;\n    t['oacute'] = 556;\n    t['amacron'] = 556;\n    t['sacute'] = 500;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 778;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 556;\n    t['twosuperior'] = 333;\n    t['Odieresis'] = 778;\n    t['mu'] = 556;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 556;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 556;\n    t['threequarters'] = 834;\n    t['Scedilla'] = 667;\n    t['lcaron'] = 299;\n    t['Kcommaaccent'] = 667;\n    t['Lacute'] = 556;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 556;\n    t['Igrave'] = 278;\n    t['Imacron'] = 278;\n    t['Lcaron'] = 556;\n    t['onehalf'] = 834;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 556;\n    t['ntilde'] = 556;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 556;\n    t['gbreve'] = 556;\n    t['onequarter'] = 834;\n    t['Scaron'] = 667;\n    t['Scommaaccent'] = 667;\n    t['Ohungarumlaut'] = 778;\n    t['degree'] = 400;\n    t['ograve'] = 556;\n    t['Ccaron'] = 722;\n    t['ugrave'] = 556;\n    t['radical'] = 453;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 333;\n    t['Ntilde'] = 722;\n    t['otilde'] = 556;\n    t['Rcommaaccent'] = 722;\n    t['Lcommaaccent'] = 556;\n    t['Atilde'] = 667;\n    t['Aogonek'] = 667;\n    t['Aring'] = 667;\n    t['Otilde'] = 778;\n    t['zdotaccent'] = 500;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 278;\n    t['kcommaaccent'] = 500;\n    t['minus'] = 584;\n    t['Icircumflex'] = 278;\n    t['ncaron'] = 556;\n    t['tcommaaccent'] = 278;\n    t['logicalnot'] = 584;\n    t['odieresis'] = 556;\n    t['udieresis'] = 556;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 556;\n    t['eth'] = 556;\n    t['zcaron'] = 500;\n    t['ncommaaccent'] = 556;\n    t['onesuperior'] = 333;\n    t['imacron'] = 278;\n    t['Euro'] = 556;\n  });\n  t['Symbol'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 250;\n    t['exclam'] = 333;\n    t['universal'] = 713;\n    t['numbersign'] = 500;\n    t['existential'] = 549;\n    t['percent'] = 833;\n    t['ampersand'] = 778;\n    t['suchthat'] = 439;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asteriskmath'] = 500;\n    t['plus'] = 549;\n    t['comma'] = 250;\n    t['minus'] = 549;\n    t['period'] = 250;\n    t['slash'] = 278;\n    t['zero'] = 500;\n    t['one'] = 500;\n    t['two'] = 500;\n    t['three'] = 500;\n    t['four'] = 500;\n    t['five'] = 500;\n    t['six'] = 500;\n    t['seven'] = 500;\n    t['eight'] = 500;\n    t['nine'] = 500;\n    t['colon'] = 278;\n    t['semicolon'] = 278;\n    t['less'] = 549;\n    t['equal'] = 549;\n    t['greater'] = 549;\n    t['question'] = 444;\n    t['congruent'] = 549;\n    t['Alpha'] = 722;\n    t['Beta'] = 667;\n    t['Chi'] = 722;\n    t['Delta'] = 612;\n    t['Epsilon'] = 611;\n    t['Phi'] = 763;\n    t['Gamma'] = 603;\n    t['Eta'] = 722;\n    t['Iota'] = 333;\n    t['theta1'] = 631;\n    t['Kappa'] = 722;\n    t['Lambda'] = 686;\n    t['Mu'] = 889;\n    t['Nu'] = 722;\n    t['Omicron'] = 722;\n    t['Pi'] = 768;\n    t['Theta'] = 741;\n    t['Rho'] = 556;\n    t['Sigma'] = 592;\n    t['Tau'] = 611;\n    t['Upsilon'] = 690;\n    t['sigma1'] = 439;\n    t['Omega'] = 768;\n    t['Xi'] = 645;\n    t['Psi'] = 795;\n    t['Zeta'] = 611;\n    t['bracketleft'] = 333;\n    t['therefore'] = 863;\n    t['bracketright'] = 333;\n    t['perpendicular'] = 658;\n    t['underscore'] = 500;\n    t['radicalex'] = 500;\n    t['alpha'] = 631;\n    t['beta'] = 549;\n    t['chi'] = 549;\n    t['delta'] = 494;\n    t['epsilon'] = 439;\n    t['phi'] = 521;\n    t['gamma'] = 411;\n    t['eta'] = 603;\n    t['iota'] = 329;\n    t['phi1'] = 603;\n    t['kappa'] = 549;\n    t['lambda'] = 549;\n    t['mu'] = 576;\n    t['nu'] = 521;\n    t['omicron'] = 549;\n    t['pi'] = 549;\n    t['theta'] = 521;\n    t['rho'] = 549;\n    t['sigma'] = 603;\n    t['tau'] = 439;\n    t['upsilon'] = 576;\n    t['omega1'] = 713;\n    t['omega'] = 686;\n    t['xi'] = 493;\n    t['psi'] = 686;\n    t['zeta'] = 494;\n    t['braceleft'] = 480;\n    t['bar'] = 200;\n    t['braceright'] = 480;\n    t['similar'] = 549;\n    t['Euro'] = 750;\n    t['Upsilon1'] = 620;\n    t['minute'] = 247;\n    t['lessequal'] = 549;\n    t['fraction'] = 167;\n    t['infinity'] = 713;\n    t['florin'] = 500;\n    t['club'] = 753;\n    t['diamond'] = 753;\n    t['heart'] = 753;\n    t['spade'] = 753;\n    t['arrowboth'] = 1042;\n    t['arrowleft'] = 987;\n    t['arrowup'] = 603;\n    t['arrowright'] = 987;\n    t['arrowdown'] = 603;\n    t['degree'] = 400;\n    t['plusminus'] = 549;\n    t['second'] = 411;\n    t['greaterequal'] = 549;\n    t['multiply'] = 549;\n    t['proportional'] = 713;\n    t['partialdiff'] = 494;\n    t['bullet'] = 460;\n    t['divide'] = 549;\n    t['notequal'] = 549;\n    t['equivalence'] = 549;\n    t['approxequal'] = 549;\n    t['ellipsis'] = 1000;\n    t['arrowvertex'] = 603;\n    t['arrowhorizex'] = 1000;\n    t['carriagereturn'] = 658;\n    t['aleph'] = 823;\n    t['Ifraktur'] = 686;\n    t['Rfraktur'] = 795;\n    t['weierstrass'] = 987;\n    t['circlemultiply'] = 768;\n    t['circleplus'] = 768;\n    t['emptyset'] = 823;\n    t['intersection'] = 768;\n    t['union'] = 768;\n    t['propersuperset'] = 713;\n    t['reflexsuperset'] = 713;\n    t['notsubset'] = 713;\n    t['propersubset'] = 713;\n    t['reflexsubset'] = 713;\n    t['element'] = 713;\n    t['notelement'] = 713;\n    t['angle'] = 768;\n    t['gradient'] = 713;\n    t['registerserif'] = 790;\n    t['copyrightserif'] = 790;\n    t['trademarkserif'] = 890;\n    t['product'] = 823;\n    t['radical'] = 549;\n    t['dotmath'] = 250;\n    t['logicalnot'] = 713;\n    t['logicaland'] = 603;\n    t['logicalor'] = 603;\n    t['arrowdblboth'] = 1042;\n    t['arrowdblleft'] = 987;\n    t['arrowdblup'] = 603;\n    t['arrowdblright'] = 987;\n    t['arrowdbldown'] = 603;\n    t['lozenge'] = 494;\n    t['angleleft'] = 329;\n    t['registersans'] = 790;\n    t['copyrightsans'] = 790;\n    t['trademarksans'] = 786;\n    t['summation'] = 713;\n    t['parenlefttp'] = 384;\n    t['parenleftex'] = 384;\n    t['parenleftbt'] = 384;\n    t['bracketlefttp'] = 384;\n    t['bracketleftex'] = 384;\n    t['bracketleftbt'] = 384;\n    t['bracelefttp'] = 494;\n    t['braceleftmid'] = 494;\n    t['braceleftbt'] = 494;\n    t['braceex'] = 494;\n    t['angleright'] = 329;\n    t['integral'] = 274;\n    t['integraltp'] = 686;\n    t['integralex'] = 686;\n    t['integralbt'] = 686;\n    t['parenrighttp'] = 384;\n    t['parenrightex'] = 384;\n    t['parenrightbt'] = 384;\n    t['bracketrighttp'] = 384;\n    t['bracketrightex'] = 384;\n    t['bracketrightbt'] = 384;\n    t['bracerighttp'] = 494;\n    t['bracerightmid'] = 494;\n    t['bracerightbt'] = 494;\n    t['apple'] = 790;\n  });\n  t['Times-Roman'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 250;\n    t['exclam'] = 333;\n    t['quotedbl'] = 408;\n    t['numbersign'] = 500;\n    t['dollar'] = 500;\n    t['percent'] = 833;\n    t['ampersand'] = 778;\n    t['quoteright'] = 333;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 500;\n    t['plus'] = 564;\n    t['comma'] = 250;\n    t['hyphen'] = 333;\n    t['period'] = 250;\n    t['slash'] = 278;\n    t['zero'] = 500;\n    t['one'] = 500;\n    t['two'] = 500;\n    t['three'] = 500;\n    t['four'] = 500;\n    t['five'] = 500;\n    t['six'] = 500;\n    t['seven'] = 500;\n    t['eight'] = 500;\n    t['nine'] = 500;\n    t['colon'] = 278;\n    t['semicolon'] = 278;\n    t['less'] = 564;\n    t['equal'] = 564;\n    t['greater'] = 564;\n    t['question'] = 444;\n    t['at'] = 921;\n    t['A'] = 722;\n    t['B'] = 667;\n    t['C'] = 667;\n    t['D'] = 722;\n    t['E'] = 611;\n    t['F'] = 556;\n    t['G'] = 722;\n    t['H'] = 722;\n    t['I'] = 333;\n    t['J'] = 389;\n    t['K'] = 722;\n    t['L'] = 611;\n    t['M'] = 889;\n    t['N'] = 722;\n    t['O'] = 722;\n    t['P'] = 556;\n    t['Q'] = 722;\n    t['R'] = 667;\n    t['S'] = 556;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 722;\n    t['W'] = 944;\n    t['X'] = 722;\n    t['Y'] = 722;\n    t['Z'] = 611;\n    t['bracketleft'] = 333;\n    t['backslash'] = 278;\n    t['bracketright'] = 333;\n    t['asciicircum'] = 469;\n    t['underscore'] = 500;\n    t['quoteleft'] = 333;\n    t['a'] = 444;\n    t['b'] = 500;\n    t['c'] = 444;\n    t['d'] = 500;\n    t['e'] = 444;\n    t['f'] = 333;\n    t['g'] = 500;\n    t['h'] = 500;\n    t['i'] = 278;\n    t['j'] = 278;\n    t['k'] = 500;\n    t['l'] = 278;\n    t['m'] = 778;\n    t['n'] = 500;\n    t['o'] = 500;\n    t['p'] = 500;\n    t['q'] = 500;\n    t['r'] = 333;\n    t['s'] = 389;\n    t['t'] = 278;\n    t['u'] = 500;\n    t['v'] = 500;\n    t['w'] = 722;\n    t['x'] = 500;\n    t['y'] = 500;\n    t['z'] = 444;\n    t['braceleft'] = 480;\n    t['bar'] = 200;\n    t['braceright'] = 480;\n    t['asciitilde'] = 541;\n    t['exclamdown'] = 333;\n    t['cent'] = 500;\n    t['sterling'] = 500;\n    t['fraction'] = 167;\n    t['yen'] = 500;\n    t['florin'] = 500;\n    t['section'] = 500;\n    t['currency'] = 500;\n    t['quotesingle'] = 180;\n    t['quotedblleft'] = 444;\n    t['guillemotleft'] = 500;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 556;\n    t['fl'] = 556;\n    t['endash'] = 500;\n    t['dagger'] = 500;\n    t['daggerdbl'] = 500;\n    t['periodcentered'] = 250;\n    t['paragraph'] = 453;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 333;\n    t['quotedblbase'] = 444;\n    t['quotedblright'] = 444;\n    t['guillemotright'] = 500;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 444;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 889;\n    t['ordfeminine'] = 276;\n    t['Lslash'] = 611;\n    t['Oslash'] = 722;\n    t['OE'] = 889;\n    t['ordmasculine'] = 310;\n    t['ae'] = 667;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 500;\n    t['oe'] = 722;\n    t['germandbls'] = 500;\n    t['Idieresis'] = 333;\n    t['eacute'] = 444;\n    t['abreve'] = 444;\n    t['uhungarumlaut'] = 500;\n    t['ecaron'] = 444;\n    t['Ydieresis'] = 722;\n    t['divide'] = 564;\n    t['Yacute'] = 722;\n    t['Acircumflex'] = 722;\n    t['aacute'] = 444;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 500;\n    t['scommaaccent'] = 389;\n    t['ecircumflex'] = 444;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 444;\n    t['Uacute'] = 722;\n    t['uogonek'] = 500;\n    t['Edieresis'] = 611;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 760;\n    t['Emacron'] = 611;\n    t['ccaron'] = 444;\n    t['aring'] = 444;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 278;\n    t['agrave'] = 444;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 667;\n    t['atilde'] = 444;\n    t['Edotaccent'] = 611;\n    t['scaron'] = 389;\n    t['scedilla'] = 389;\n    t['iacute'] = 278;\n    t['lozenge'] = 471;\n    t['Rcaron'] = 667;\n    t['Gcommaaccent'] = 722;\n    t['ucircumflex'] = 500;\n    t['acircumflex'] = 444;\n    t['Amacron'] = 722;\n    t['rcaron'] = 333;\n    t['ccedilla'] = 444;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 556;\n    t['Omacron'] = 722;\n    t['Racute'] = 667;\n    t['Sacute'] = 556;\n    t['dcaron'] = 588;\n    t['Umacron'] = 722;\n    t['uring'] = 500;\n    t['threesuperior'] = 300;\n    t['Ograve'] = 722;\n    t['Agrave'] = 722;\n    t['Abreve'] = 722;\n    t['multiply'] = 564;\n    t['uacute'] = 500;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 476;\n    t['ydieresis'] = 500;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 611;\n    t['adieresis'] = 444;\n    t['edieresis'] = 444;\n    t['cacute'] = 444;\n    t['nacute'] = 500;\n    t['umacron'] = 500;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 333;\n    t['plusminus'] = 564;\n    t['brokenbar'] = 200;\n    t['registered'] = 760;\n    t['Gbreve'] = 722;\n    t['Idotaccent'] = 333;\n    t['summation'] = 600;\n    t['Egrave'] = 611;\n    t['racute'] = 333;\n    t['omacron'] = 500;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 667;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 326;\n    t['eogonek'] = 444;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 722;\n    t['Adieresis'] = 722;\n    t['egrave'] = 444;\n    t['zacute'] = 444;\n    t['iogonek'] = 278;\n    t['Oacute'] = 722;\n    t['oacute'] = 500;\n    t['amacron'] = 444;\n    t['sacute'] = 389;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 722;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 500;\n    t['twosuperior'] = 300;\n    t['Odieresis'] = 722;\n    t['mu'] = 500;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 500;\n    t['Eogonek'] = 611;\n    t['dcroat'] = 500;\n    t['threequarters'] = 750;\n    t['Scedilla'] = 556;\n    t['lcaron'] = 344;\n    t['Kcommaaccent'] = 722;\n    t['Lacute'] = 611;\n    t['trademark'] = 980;\n    t['edotaccent'] = 444;\n    t['Igrave'] = 333;\n    t['Imacron'] = 333;\n    t['Lcaron'] = 611;\n    t['onehalf'] = 750;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 500;\n    t['ntilde'] = 500;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 611;\n    t['emacron'] = 444;\n    t['gbreve'] = 500;\n    t['onequarter'] = 750;\n    t['Scaron'] = 556;\n    t['Scommaaccent'] = 556;\n    t['Ohungarumlaut'] = 722;\n    t['degree'] = 400;\n    t['ograve'] = 500;\n    t['Ccaron'] = 667;\n    t['ugrave'] = 500;\n    t['radical'] = 453;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 333;\n    t['Ntilde'] = 722;\n    t['otilde'] = 500;\n    t['Rcommaaccent'] = 667;\n    t['Lcommaaccent'] = 611;\n    t['Atilde'] = 722;\n    t['Aogonek'] = 722;\n    t['Aring'] = 722;\n    t['Otilde'] = 722;\n    t['zdotaccent'] = 444;\n    t['Ecaron'] = 611;\n    t['Iogonek'] = 333;\n    t['kcommaaccent'] = 500;\n    t['minus'] = 564;\n    t['Icircumflex'] = 333;\n    t['ncaron'] = 500;\n    t['tcommaaccent'] = 278;\n    t['logicalnot'] = 564;\n    t['odieresis'] = 500;\n    t['udieresis'] = 500;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 500;\n    t['eth'] = 500;\n    t['zcaron'] = 444;\n    t['ncommaaccent'] = 500;\n    t['onesuperior'] = 300;\n    t['imacron'] = 278;\n    t['Euro'] = 500;\n  });\n  t['Times-Bold'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 250;\n    t['exclam'] = 333;\n    t['quotedbl'] = 555;\n    t['numbersign'] = 500;\n    t['dollar'] = 500;\n    t['percent'] = 1000;\n    t['ampersand'] = 833;\n    t['quoteright'] = 333;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 500;\n    t['plus'] = 570;\n    t['comma'] = 250;\n    t['hyphen'] = 333;\n    t['period'] = 250;\n    t['slash'] = 278;\n    t['zero'] = 500;\n    t['one'] = 500;\n    t['two'] = 500;\n    t['three'] = 500;\n    t['four'] = 500;\n    t['five'] = 500;\n    t['six'] = 500;\n    t['seven'] = 500;\n    t['eight'] = 500;\n    t['nine'] = 500;\n    t['colon'] = 333;\n    t['semicolon'] = 333;\n    t['less'] = 570;\n    t['equal'] = 570;\n    t['greater'] = 570;\n    t['question'] = 500;\n    t['at'] = 930;\n    t['A'] = 722;\n    t['B'] = 667;\n    t['C'] = 722;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 611;\n    t['G'] = 778;\n    t['H'] = 778;\n    t['I'] = 389;\n    t['J'] = 500;\n    t['K'] = 778;\n    t['L'] = 667;\n    t['M'] = 944;\n    t['N'] = 722;\n    t['O'] = 778;\n    t['P'] = 611;\n    t['Q'] = 778;\n    t['R'] = 722;\n    t['S'] = 556;\n    t['T'] = 667;\n    t['U'] = 722;\n    t['V'] = 722;\n    t['W'] = 1000;\n    t['X'] = 722;\n    t['Y'] = 722;\n    t['Z'] = 667;\n    t['bracketleft'] = 333;\n    t['backslash'] = 278;\n    t['bracketright'] = 333;\n    t['asciicircum'] = 581;\n    t['underscore'] = 500;\n    t['quoteleft'] = 333;\n    t['a'] = 500;\n    t['b'] = 556;\n    t['c'] = 444;\n    t['d'] = 556;\n    t['e'] = 444;\n    t['f'] = 333;\n    t['g'] = 500;\n    t['h'] = 556;\n    t['i'] = 278;\n    t['j'] = 333;\n    t['k'] = 556;\n    t['l'] = 278;\n    t['m'] = 833;\n    t['n'] = 556;\n    t['o'] = 500;\n    t['p'] = 556;\n    t['q'] = 556;\n    t['r'] = 444;\n    t['s'] = 389;\n    t['t'] = 333;\n    t['u'] = 556;\n    t['v'] = 500;\n    t['w'] = 722;\n    t['x'] = 500;\n    t['y'] = 500;\n    t['z'] = 444;\n    t['braceleft'] = 394;\n    t['bar'] = 220;\n    t['braceright'] = 394;\n    t['asciitilde'] = 520;\n    t['exclamdown'] = 333;\n    t['cent'] = 500;\n    t['sterling'] = 500;\n    t['fraction'] = 167;\n    t['yen'] = 500;\n    t['florin'] = 500;\n    t['section'] = 500;\n    t['currency'] = 500;\n    t['quotesingle'] = 278;\n    t['quotedblleft'] = 500;\n    t['guillemotleft'] = 500;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 556;\n    t['fl'] = 556;\n    t['endash'] = 500;\n    t['dagger'] = 500;\n    t['daggerdbl'] = 500;\n    t['periodcentered'] = 250;\n    t['paragraph'] = 540;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 333;\n    t['quotedblbase'] = 500;\n    t['quotedblright'] = 500;\n    t['guillemotright'] = 500;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 500;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 1000;\n    t['ordfeminine'] = 300;\n    t['Lslash'] = 667;\n    t['Oslash'] = 778;\n    t['OE'] = 1000;\n    t['ordmasculine'] = 330;\n    t['ae'] = 722;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 500;\n    t['oe'] = 722;\n    t['germandbls'] = 556;\n    t['Idieresis'] = 389;\n    t['eacute'] = 444;\n    t['abreve'] = 500;\n    t['uhungarumlaut'] = 556;\n    t['ecaron'] = 444;\n    t['Ydieresis'] = 722;\n    t['divide'] = 570;\n    t['Yacute'] = 722;\n    t['Acircumflex'] = 722;\n    t['aacute'] = 500;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 500;\n    t['scommaaccent'] = 389;\n    t['ecircumflex'] = 444;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 500;\n    t['Uacute'] = 722;\n    t['uogonek'] = 556;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 747;\n    t['Emacron'] = 667;\n    t['ccaron'] = 444;\n    t['aring'] = 500;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 278;\n    t['agrave'] = 500;\n    t['Tcommaaccent'] = 667;\n    t['Cacute'] = 722;\n    t['atilde'] = 500;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 389;\n    t['scedilla'] = 389;\n    t['iacute'] = 278;\n    t['lozenge'] = 494;\n    t['Rcaron'] = 722;\n    t['Gcommaaccent'] = 778;\n    t['ucircumflex'] = 556;\n    t['acircumflex'] = 500;\n    t['Amacron'] = 722;\n    t['rcaron'] = 444;\n    t['ccedilla'] = 444;\n    t['Zdotaccent'] = 667;\n    t['Thorn'] = 611;\n    t['Omacron'] = 778;\n    t['Racute'] = 722;\n    t['Sacute'] = 556;\n    t['dcaron'] = 672;\n    t['Umacron'] = 722;\n    t['uring'] = 556;\n    t['threesuperior'] = 300;\n    t['Ograve'] = 778;\n    t['Agrave'] = 722;\n    t['Abreve'] = 722;\n    t['multiply'] = 570;\n    t['uacute'] = 556;\n    t['Tcaron'] = 667;\n    t['partialdiff'] = 494;\n    t['ydieresis'] = 500;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 500;\n    t['edieresis'] = 444;\n    t['cacute'] = 444;\n    t['nacute'] = 556;\n    t['umacron'] = 556;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 389;\n    t['plusminus'] = 570;\n    t['brokenbar'] = 220;\n    t['registered'] = 747;\n    t['Gbreve'] = 778;\n    t['Idotaccent'] = 389;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 444;\n    t['omacron'] = 500;\n    t['Zacute'] = 667;\n    t['Zcaron'] = 667;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 722;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 416;\n    t['eogonek'] = 444;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 722;\n    t['Adieresis'] = 722;\n    t['egrave'] = 444;\n    t['zacute'] = 444;\n    t['iogonek'] = 278;\n    t['Oacute'] = 778;\n    t['oacute'] = 500;\n    t['amacron'] = 500;\n    t['sacute'] = 389;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 778;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 556;\n    t['twosuperior'] = 300;\n    t['Odieresis'] = 778;\n    t['mu'] = 556;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 500;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 556;\n    t['threequarters'] = 750;\n    t['Scedilla'] = 556;\n    t['lcaron'] = 394;\n    t['Kcommaaccent'] = 778;\n    t['Lacute'] = 667;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 444;\n    t['Igrave'] = 389;\n    t['Imacron'] = 389;\n    t['Lcaron'] = 667;\n    t['onehalf'] = 750;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 500;\n    t['ntilde'] = 556;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 444;\n    t['gbreve'] = 500;\n    t['onequarter'] = 750;\n    t['Scaron'] = 556;\n    t['Scommaaccent'] = 556;\n    t['Ohungarumlaut'] = 778;\n    t['degree'] = 400;\n    t['ograve'] = 500;\n    t['Ccaron'] = 722;\n    t['ugrave'] = 556;\n    t['radical'] = 549;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 444;\n    t['Ntilde'] = 722;\n    t['otilde'] = 500;\n    t['Rcommaaccent'] = 722;\n    t['Lcommaaccent'] = 667;\n    t['Atilde'] = 722;\n    t['Aogonek'] = 722;\n    t['Aring'] = 722;\n    t['Otilde'] = 778;\n    t['zdotaccent'] = 444;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 389;\n    t['kcommaaccent'] = 556;\n    t['minus'] = 570;\n    t['Icircumflex'] = 389;\n    t['ncaron'] = 556;\n    t['tcommaaccent'] = 333;\n    t['logicalnot'] = 570;\n    t['odieresis'] = 500;\n    t['udieresis'] = 556;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 500;\n    t['eth'] = 500;\n    t['zcaron'] = 444;\n    t['ncommaaccent'] = 556;\n    t['onesuperior'] = 300;\n    t['imacron'] = 278;\n    t['Euro'] = 500;\n  });\n  t['Times-BoldItalic'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 250;\n    t['exclam'] = 389;\n    t['quotedbl'] = 555;\n    t['numbersign'] = 500;\n    t['dollar'] = 500;\n    t['percent'] = 833;\n    t['ampersand'] = 778;\n    t['quoteright'] = 333;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 500;\n    t['plus'] = 570;\n    t['comma'] = 250;\n    t['hyphen'] = 333;\n    t['period'] = 250;\n    t['slash'] = 278;\n    t['zero'] = 500;\n    t['one'] = 500;\n    t['two'] = 500;\n    t['three'] = 500;\n    t['four'] = 500;\n    t['five'] = 500;\n    t['six'] = 500;\n    t['seven'] = 500;\n    t['eight'] = 500;\n    t['nine'] = 500;\n    t['colon'] = 333;\n    t['semicolon'] = 333;\n    t['less'] = 570;\n    t['equal'] = 570;\n    t['greater'] = 570;\n    t['question'] = 500;\n    t['at'] = 832;\n    t['A'] = 667;\n    t['B'] = 667;\n    t['C'] = 667;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 667;\n    t['G'] = 722;\n    t['H'] = 778;\n    t['I'] = 389;\n    t['J'] = 500;\n    t['K'] = 667;\n    t['L'] = 611;\n    t['M'] = 889;\n    t['N'] = 722;\n    t['O'] = 722;\n    t['P'] = 611;\n    t['Q'] = 722;\n    t['R'] = 667;\n    t['S'] = 556;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 667;\n    t['W'] = 889;\n    t['X'] = 667;\n    t['Y'] = 611;\n    t['Z'] = 611;\n    t['bracketleft'] = 333;\n    t['backslash'] = 278;\n    t['bracketright'] = 333;\n    t['asciicircum'] = 570;\n    t['underscore'] = 500;\n    t['quoteleft'] = 333;\n    t['a'] = 500;\n    t['b'] = 500;\n    t['c'] = 444;\n    t['d'] = 500;\n    t['e'] = 444;\n    t['f'] = 333;\n    t['g'] = 500;\n    t['h'] = 556;\n    t['i'] = 278;\n    t['j'] = 278;\n    t['k'] = 500;\n    t['l'] = 278;\n    t['m'] = 778;\n    t['n'] = 556;\n    t['o'] = 500;\n    t['p'] = 500;\n    t['q'] = 500;\n    t['r'] = 389;\n    t['s'] = 389;\n    t['t'] = 278;\n    t['u'] = 556;\n    t['v'] = 444;\n    t['w'] = 667;\n    t['x'] = 500;\n    t['y'] = 444;\n    t['z'] = 389;\n    t['braceleft'] = 348;\n    t['bar'] = 220;\n    t['braceright'] = 348;\n    t['asciitilde'] = 570;\n    t['exclamdown'] = 389;\n    t['cent'] = 500;\n    t['sterling'] = 500;\n    t['fraction'] = 167;\n    t['yen'] = 500;\n    t['florin'] = 500;\n    t['section'] = 500;\n    t['currency'] = 500;\n    t['quotesingle'] = 278;\n    t['quotedblleft'] = 500;\n    t['guillemotleft'] = 500;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 556;\n    t['fl'] = 556;\n    t['endash'] = 500;\n    t['dagger'] = 500;\n    t['daggerdbl'] = 500;\n    t['periodcentered'] = 250;\n    t['paragraph'] = 500;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 333;\n    t['quotedblbase'] = 500;\n    t['quotedblright'] = 500;\n    t['guillemotright'] = 500;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 500;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 944;\n    t['ordfeminine'] = 266;\n    t['Lslash'] = 611;\n    t['Oslash'] = 722;\n    t['OE'] = 944;\n    t['ordmasculine'] = 300;\n    t['ae'] = 722;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 500;\n    t['oe'] = 722;\n    t['germandbls'] = 500;\n    t['Idieresis'] = 389;\n    t['eacute'] = 444;\n    t['abreve'] = 500;\n    t['uhungarumlaut'] = 556;\n    t['ecaron'] = 444;\n    t['Ydieresis'] = 611;\n    t['divide'] = 570;\n    t['Yacute'] = 611;\n    t['Acircumflex'] = 667;\n    t['aacute'] = 500;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 444;\n    t['scommaaccent'] = 389;\n    t['ecircumflex'] = 444;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 500;\n    t['Uacute'] = 722;\n    t['uogonek'] = 556;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 747;\n    t['Emacron'] = 667;\n    t['ccaron'] = 444;\n    t['aring'] = 500;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 278;\n    t['agrave'] = 500;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 667;\n    t['atilde'] = 500;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 389;\n    t['scedilla'] = 389;\n    t['iacute'] = 278;\n    t['lozenge'] = 494;\n    t['Rcaron'] = 667;\n    t['Gcommaaccent'] = 722;\n    t['ucircumflex'] = 556;\n    t['acircumflex'] = 500;\n    t['Amacron'] = 667;\n    t['rcaron'] = 389;\n    t['ccedilla'] = 444;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 611;\n    t['Omacron'] = 722;\n    t['Racute'] = 667;\n    t['Sacute'] = 556;\n    t['dcaron'] = 608;\n    t['Umacron'] = 722;\n    t['uring'] = 556;\n    t['threesuperior'] = 300;\n    t['Ograve'] = 722;\n    t['Agrave'] = 667;\n    t['Abreve'] = 667;\n    t['multiply'] = 570;\n    t['uacute'] = 556;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 494;\n    t['ydieresis'] = 444;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 500;\n    t['edieresis'] = 444;\n    t['cacute'] = 444;\n    t['nacute'] = 556;\n    t['umacron'] = 556;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 389;\n    t['plusminus'] = 570;\n    t['brokenbar'] = 220;\n    t['registered'] = 747;\n    t['Gbreve'] = 722;\n    t['Idotaccent'] = 389;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 389;\n    t['omacron'] = 500;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 667;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 366;\n    t['eogonek'] = 444;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 667;\n    t['Adieresis'] = 667;\n    t['egrave'] = 444;\n    t['zacute'] = 389;\n    t['iogonek'] = 278;\n    t['Oacute'] = 722;\n    t['oacute'] = 500;\n    t['amacron'] = 500;\n    t['sacute'] = 389;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 722;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 500;\n    t['twosuperior'] = 300;\n    t['Odieresis'] = 722;\n    t['mu'] = 576;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 500;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 500;\n    t['threequarters'] = 750;\n    t['Scedilla'] = 556;\n    t['lcaron'] = 382;\n    t['Kcommaaccent'] = 667;\n    t['Lacute'] = 611;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 444;\n    t['Igrave'] = 389;\n    t['Imacron'] = 389;\n    t['Lcaron'] = 611;\n    t['onehalf'] = 750;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 500;\n    t['ntilde'] = 556;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 444;\n    t['gbreve'] = 500;\n    t['onequarter'] = 750;\n    t['Scaron'] = 556;\n    t['Scommaaccent'] = 556;\n    t['Ohungarumlaut'] = 722;\n    t['degree'] = 400;\n    t['ograve'] = 500;\n    t['Ccaron'] = 667;\n    t['ugrave'] = 556;\n    t['radical'] = 549;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 389;\n    t['Ntilde'] = 722;\n    t['otilde'] = 500;\n    t['Rcommaaccent'] = 667;\n    t['Lcommaaccent'] = 611;\n    t['Atilde'] = 667;\n    t['Aogonek'] = 667;\n    t['Aring'] = 667;\n    t['Otilde'] = 722;\n    t['zdotaccent'] = 389;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 389;\n    t['kcommaaccent'] = 500;\n    t['minus'] = 606;\n    t['Icircumflex'] = 389;\n    t['ncaron'] = 556;\n    t['tcommaaccent'] = 278;\n    t['logicalnot'] = 606;\n    t['odieresis'] = 500;\n    t['udieresis'] = 556;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 500;\n    t['eth'] = 500;\n    t['zcaron'] = 389;\n    t['ncommaaccent'] = 556;\n    t['onesuperior'] = 300;\n    t['imacron'] = 278;\n    t['Euro'] = 500;\n  });\n  t['Times-Italic'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 250;\n    t['exclam'] = 333;\n    t['quotedbl'] = 420;\n    t['numbersign'] = 500;\n    t['dollar'] = 500;\n    t['percent'] = 833;\n    t['ampersand'] = 778;\n    t['quoteright'] = 333;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 500;\n    t['plus'] = 675;\n    t['comma'] = 250;\n    t['hyphen'] = 333;\n    t['period'] = 250;\n    t['slash'] = 278;\n    t['zero'] = 500;\n    t['one'] = 500;\n    t['two'] = 500;\n    t['three'] = 500;\n    t['four'] = 500;\n    t['five'] = 500;\n    t['six'] = 500;\n    t['seven'] = 500;\n    t['eight'] = 500;\n    t['nine'] = 500;\n    t['colon'] = 333;\n    t['semicolon'] = 333;\n    t['less'] = 675;\n    t['equal'] = 675;\n    t['greater'] = 675;\n    t['question'] = 500;\n    t['at'] = 920;\n    t['A'] = 611;\n    t['B'] = 611;\n    t['C'] = 667;\n    t['D'] = 722;\n    t['E'] = 611;\n    t['F'] = 611;\n    t['G'] = 722;\n    t['H'] = 722;\n    t['I'] = 333;\n    t['J'] = 444;\n    t['K'] = 667;\n    t['L'] = 556;\n    t['M'] = 833;\n    t['N'] = 667;\n    t['O'] = 722;\n    t['P'] = 611;\n    t['Q'] = 722;\n    t['R'] = 611;\n    t['S'] = 500;\n    t['T'] = 556;\n    t['U'] = 722;\n    t['V'] = 611;\n    t['W'] = 833;\n    t['X'] = 611;\n    t['Y'] = 556;\n    t['Z'] = 556;\n    t['bracketleft'] = 389;\n    t['backslash'] = 278;\n    t['bracketright'] = 389;\n    t['asciicircum'] = 422;\n    t['underscore'] = 500;\n    t['quoteleft'] = 333;\n    t['a'] = 500;\n    t['b'] = 500;\n    t['c'] = 444;\n    t['d'] = 500;\n    t['e'] = 444;\n    t['f'] = 278;\n    t['g'] = 500;\n    t['h'] = 500;\n    t['i'] = 278;\n    t['j'] = 278;\n    t['k'] = 444;\n    t['l'] = 278;\n    t['m'] = 722;\n    t['n'] = 500;\n    t['o'] = 500;\n    t['p'] = 500;\n    t['q'] = 500;\n    t['r'] = 389;\n    t['s'] = 389;\n    t['t'] = 278;\n    t['u'] = 500;\n    t['v'] = 444;\n    t['w'] = 667;\n    t['x'] = 444;\n    t['y'] = 444;\n    t['z'] = 389;\n    t['braceleft'] = 400;\n    t['bar'] = 275;\n    t['braceright'] = 400;\n    t['asciitilde'] = 541;\n    t['exclamdown'] = 389;\n    t['cent'] = 500;\n    t['sterling'] = 500;\n    t['fraction'] = 167;\n    t['yen'] = 500;\n    t['florin'] = 500;\n    t['section'] = 500;\n    t['currency'] = 500;\n    t['quotesingle'] = 214;\n    t['quotedblleft'] = 556;\n    t['guillemotleft'] = 500;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 500;\n    t['fl'] = 500;\n    t['endash'] = 500;\n    t['dagger'] = 500;\n    t['daggerdbl'] = 500;\n    t['periodcentered'] = 250;\n    t['paragraph'] = 523;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 333;\n    t['quotedblbase'] = 556;\n    t['quotedblright'] = 556;\n    t['guillemotright'] = 500;\n    t['ellipsis'] = 889;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 500;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 889;\n    t['AE'] = 889;\n    t['ordfeminine'] = 276;\n    t['Lslash'] = 556;\n    t['Oslash'] = 722;\n    t['OE'] = 944;\n    t['ordmasculine'] = 310;\n    t['ae'] = 667;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 500;\n    t['oe'] = 667;\n    t['germandbls'] = 500;\n    t['Idieresis'] = 333;\n    t['eacute'] = 444;\n    t['abreve'] = 500;\n    t['uhungarumlaut'] = 500;\n    t['ecaron'] = 444;\n    t['Ydieresis'] = 556;\n    t['divide'] = 675;\n    t['Yacute'] = 556;\n    t['Acircumflex'] = 611;\n    t['aacute'] = 500;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 444;\n    t['scommaaccent'] = 389;\n    t['ecircumflex'] = 444;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 500;\n    t['Uacute'] = 722;\n    t['uogonek'] = 500;\n    t['Edieresis'] = 611;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 760;\n    t['Emacron'] = 611;\n    t['ccaron'] = 444;\n    t['aring'] = 500;\n    t['Ncommaaccent'] = 667;\n    t['lacute'] = 278;\n    t['agrave'] = 500;\n    t['Tcommaaccent'] = 556;\n    t['Cacute'] = 667;\n    t['atilde'] = 500;\n    t['Edotaccent'] = 611;\n    t['scaron'] = 389;\n    t['scedilla'] = 389;\n    t['iacute'] = 278;\n    t['lozenge'] = 471;\n    t['Rcaron'] = 611;\n    t['Gcommaaccent'] = 722;\n    t['ucircumflex'] = 500;\n    t['acircumflex'] = 500;\n    t['Amacron'] = 611;\n    t['rcaron'] = 389;\n    t['ccedilla'] = 444;\n    t['Zdotaccent'] = 556;\n    t['Thorn'] = 611;\n    t['Omacron'] = 722;\n    t['Racute'] = 611;\n    t['Sacute'] = 500;\n    t['dcaron'] = 544;\n    t['Umacron'] = 722;\n    t['uring'] = 500;\n    t['threesuperior'] = 300;\n    t['Ograve'] = 722;\n    t['Agrave'] = 611;\n    t['Abreve'] = 611;\n    t['multiply'] = 675;\n    t['uacute'] = 500;\n    t['Tcaron'] = 556;\n    t['partialdiff'] = 476;\n    t['ydieresis'] = 444;\n    t['Nacute'] = 667;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 611;\n    t['adieresis'] = 500;\n    t['edieresis'] = 444;\n    t['cacute'] = 444;\n    t['nacute'] = 500;\n    t['umacron'] = 500;\n    t['Ncaron'] = 667;\n    t['Iacute'] = 333;\n    t['plusminus'] = 675;\n    t['brokenbar'] = 275;\n    t['registered'] = 760;\n    t['Gbreve'] = 722;\n    t['Idotaccent'] = 333;\n    t['summation'] = 600;\n    t['Egrave'] = 611;\n    t['racute'] = 389;\n    t['omacron'] = 500;\n    t['Zacute'] = 556;\n    t['Zcaron'] = 556;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 667;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 300;\n    t['eogonek'] = 444;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 611;\n    t['Adieresis'] = 611;\n    t['egrave'] = 444;\n    t['zacute'] = 389;\n    t['iogonek'] = 278;\n    t['Oacute'] = 722;\n    t['oacute'] = 500;\n    t['amacron'] = 500;\n    t['sacute'] = 389;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 722;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 500;\n    t['twosuperior'] = 300;\n    t['Odieresis'] = 722;\n    t['mu'] = 500;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 500;\n    t['Eogonek'] = 611;\n    t['dcroat'] = 500;\n    t['threequarters'] = 750;\n    t['Scedilla'] = 500;\n    t['lcaron'] = 300;\n    t['Kcommaaccent'] = 667;\n    t['Lacute'] = 556;\n    t['trademark'] = 980;\n    t['edotaccent'] = 444;\n    t['Igrave'] = 333;\n    t['Imacron'] = 333;\n    t['Lcaron'] = 611;\n    t['onehalf'] = 750;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 500;\n    t['ntilde'] = 500;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 611;\n    t['emacron'] = 444;\n    t['gbreve'] = 500;\n    t['onequarter'] = 750;\n    t['Scaron'] = 500;\n    t['Scommaaccent'] = 500;\n    t['Ohungarumlaut'] = 722;\n    t['degree'] = 400;\n    t['ograve'] = 500;\n    t['Ccaron'] = 667;\n    t['ugrave'] = 500;\n    t['radical'] = 453;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 389;\n    t['Ntilde'] = 667;\n    t['otilde'] = 500;\n    t['Rcommaaccent'] = 611;\n    t['Lcommaaccent'] = 556;\n    t['Atilde'] = 611;\n    t['Aogonek'] = 611;\n    t['Aring'] = 611;\n    t['Otilde'] = 722;\n    t['zdotaccent'] = 389;\n    t['Ecaron'] = 611;\n    t['Iogonek'] = 333;\n    t['kcommaaccent'] = 444;\n    t['minus'] = 675;\n    t['Icircumflex'] = 333;\n    t['ncaron'] = 500;\n    t['tcommaaccent'] = 278;\n    t['logicalnot'] = 675;\n    t['odieresis'] = 500;\n    t['udieresis'] = 500;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 500;\n    t['eth'] = 500;\n    t['zcaron'] = 389;\n    t['ncommaaccent'] = 500;\n    t['onesuperior'] = 300;\n    t['imacron'] = 278;\n    t['Euro'] = 500;\n  });\n  t['ZapfDingbats'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 278;\n    t['a1'] = 974;\n    t['a2'] = 961;\n    t['a202'] = 974;\n    t['a3'] = 980;\n    t['a4'] = 719;\n    t['a5'] = 789;\n    t['a119'] = 790;\n    t['a118'] = 791;\n    t['a117'] = 690;\n    t['a11'] = 960;\n    t['a12'] = 939;\n    t['a13'] = 549;\n    t['a14'] = 855;\n    t['a15'] = 911;\n    t['a16'] = 933;\n    t['a105'] = 911;\n    t['a17'] = 945;\n    t['a18'] = 974;\n    t['a19'] = 755;\n    t['a20'] = 846;\n    t['a21'] = 762;\n    t['a22'] = 761;\n    t['a23'] = 571;\n    t['a24'] = 677;\n    t['a25'] = 763;\n    t['a26'] = 760;\n    t['a27'] = 759;\n    t['a28'] = 754;\n    t['a6'] = 494;\n    t['a7'] = 552;\n    t['a8'] = 537;\n    t['a9'] = 577;\n    t['a10'] = 692;\n    t['a29'] = 786;\n    t['a30'] = 788;\n    t['a31'] = 788;\n    t['a32'] = 790;\n    t['a33'] = 793;\n    t['a34'] = 794;\n    t['a35'] = 816;\n    t['a36'] = 823;\n    t['a37'] = 789;\n    t['a38'] = 841;\n    t['a39'] = 823;\n    t['a40'] = 833;\n    t['a41'] = 816;\n    t['a42'] = 831;\n    t['a43'] = 923;\n    t['a44'] = 744;\n    t['a45'] = 723;\n    t['a46'] = 749;\n    t['a47'] = 790;\n    t['a48'] = 792;\n    t['a49'] = 695;\n    t['a50'] = 776;\n    t['a51'] = 768;\n    t['a52'] = 792;\n    t['a53'] = 759;\n    t['a54'] = 707;\n    t['a55'] = 708;\n    t['a56'] = 682;\n    t['a57'] = 701;\n    t['a58'] = 826;\n    t['a59'] = 815;\n    t['a60'] = 789;\n    t['a61'] = 789;\n    t['a62'] = 707;\n    t['a63'] = 687;\n    t['a64'] = 696;\n    t['a65'] = 689;\n    t['a66'] = 786;\n    t['a67'] = 787;\n    t['a68'] = 713;\n    t['a69'] = 791;\n    t['a70'] = 785;\n    t['a71'] = 791;\n    t['a72'] = 873;\n    t['a73'] = 761;\n    t['a74'] = 762;\n    t['a203'] = 762;\n    t['a75'] = 759;\n    t['a204'] = 759;\n    t['a76'] = 892;\n    t['a77'] = 892;\n    t['a78'] = 788;\n    t['a79'] = 784;\n    t['a81'] = 438;\n    t['a82'] = 138;\n    t['a83'] = 277;\n    t['a84'] = 415;\n    t['a97'] = 392;\n    t['a98'] = 392;\n    t['a99'] = 668;\n    t['a100'] = 668;\n    t['a89'] = 390;\n    t['a90'] = 390;\n    t['a93'] = 317;\n    t['a94'] = 317;\n    t['a91'] = 276;\n    t['a92'] = 276;\n    t['a205'] = 509;\n    t['a85'] = 509;\n    t['a206'] = 410;\n    t['a86'] = 410;\n    t['a87'] = 234;\n    t['a88'] = 234;\n    t['a95'] = 334;\n    t['a96'] = 334;\n    t['a101'] = 732;\n    t['a102'] = 544;\n    t['a103'] = 544;\n    t['a104'] = 910;\n    t['a106'] = 667;\n    t['a107'] = 760;\n    t['a108'] = 760;\n    t['a112'] = 776;\n    t['a111'] = 595;\n    t['a110'] = 694;\n    t['a109'] = 626;\n    t['a120'] = 788;\n    t['a121'] = 788;\n    t['a122'] = 788;\n    t['a123'] = 788;\n    t['a124'] = 788;\n    t['a125'] = 788;\n    t['a126'] = 788;\n    t['a127'] = 788;\n    t['a128'] = 788;\n    t['a129'] = 788;\n    t['a130'] = 788;\n    t['a131'] = 788;\n    t['a132'] = 788;\n    t['a133'] = 788;\n    t['a134'] = 788;\n    t['a135'] = 788;\n    t['a136'] = 788;\n    t['a137'] = 788;\n    t['a138'] = 788;\n    t['a139'] = 788;\n    t['a140'] = 788;\n    t['a141'] = 788;\n    t['a142'] = 788;\n    t['a143'] = 788;\n    t['a144'] = 788;\n    t['a145'] = 788;\n    t['a146'] = 788;\n    t['a147'] = 788;\n    t['a148'] = 788;\n    t['a149'] = 788;\n    t['a150'] = 788;\n    t['a151'] = 788;\n    t['a152'] = 788;\n    t['a153'] = 788;\n    t['a154'] = 788;\n    t['a155'] = 788;\n    t['a156'] = 788;\n    t['a157'] = 788;\n    t['a158'] = 788;\n    t['a159'] = 788;\n    t['a160'] = 894;\n    t['a161'] = 838;\n    t['a163'] = 1016;\n    t['a164'] = 458;\n    t['a196'] = 748;\n    t['a165'] = 924;\n    t['a192'] = 748;\n    t['a166'] = 918;\n    t['a167'] = 927;\n    t['a168'] = 928;\n    t['a169'] = 928;\n    t['a170'] = 834;\n    t['a171'] = 873;\n    t['a172'] = 828;\n    t['a173'] = 924;\n    t['a162'] = 924;\n    t['a174'] = 917;\n    t['a175'] = 930;\n    t['a176'] = 931;\n    t['a177'] = 463;\n    t['a178'] = 883;\n    t['a179'] = 836;\n    t['a193'] = 836;\n    t['a180'] = 867;\n    t['a199'] = 867;\n    t['a181'] = 696;\n    t['a200'] = 696;\n    t['a182'] = 874;\n    t['a201'] = 874;\n    t['a183'] = 760;\n    t['a184'] = 946;\n    t['a197'] = 771;\n    t['a185'] = 865;\n    t['a194'] = 771;\n    t['a198'] = 888;\n    t['a186'] = 967;\n    t['a195'] = 888;\n    t['a187'] = 831;\n    t['a188'] = 873;\n    t['a189'] = 927;\n    t['a190'] = 970;\n    t['a191'] = 918;\n  });\n});\nexports.getMetrics = getMetrics;\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar MurmurHash3_64 = function MurmurHash3_64Closure(seed) {\n  var MASK_HIGH = 0xffff0000;\n  var MASK_LOW = 0xffff;\n  function MurmurHash3_64(seed) {\n    var SEED = 0xc3d2e1f0;\n    this.h1 = seed ? seed & 0xffffffff : SEED;\n    this.h2 = seed ? seed & 0xffffffff : SEED;\n  }\n  MurmurHash3_64.prototype = {\n    update: function MurmurHash3_64_update(input) {\n      var i;\n      if (typeof input === 'string') {\n        var data = new Uint8Array(input.length * 2);\n        var length = 0;\n        for (i = 0; i < input.length; i++) {\n          var code = input.charCodeAt(i);\n          if (code <= 0xff) {\n            data[length++] = code;\n          } else {\n            data[length++] = code >>> 8;\n            data[length++] = code & 0xff;\n          }\n        }\n      } else if ((typeof input === 'undefined' ? 'undefined' : _typeof(input)) === 'object' && 'byteLength' in input) {\n        data = input;\n        length = data.byteLength;\n      } else {\n        throw new Error('Wrong data format in MurmurHash3_64_update. ' + 'Input must be a string or array.');\n      }\n      var blockCounts = length >> 2;\n      var tailLength = length - blockCounts * 4;\n      var dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);\n      var k1 = 0;\n      var k2 = 0;\n      var h1 = this.h1;\n      var h2 = this.h2;\n      var C1 = 0xcc9e2d51;\n      var C2 = 0x1b873593;\n      var C1_LOW = C1 & MASK_LOW;\n      var C2_LOW = C2 & MASK_LOW;\n      for (i = 0; i < blockCounts; i++) {\n        if (i & 1) {\n          k1 = dataUint32[i];\n          k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;\n          k1 = k1 << 15 | k1 >>> 17;\n          k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;\n          h1 ^= k1;\n          h1 = h1 << 13 | h1 >>> 19;\n          h1 = h1 * 5 + 0xe6546b64;\n        } else {\n          k2 = dataUint32[i];\n          k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW;\n          k2 = k2 << 15 | k2 >>> 17;\n          k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW;\n          h2 ^= k2;\n          h2 = h2 << 13 | h2 >>> 19;\n          h2 = h2 * 5 + 0xe6546b64;\n        }\n      }\n      k1 = 0;\n      switch (tailLength) {\n        case 3:\n          k1 ^= data[blockCounts * 4 + 2] << 16;\n        case 2:\n          k1 ^= data[blockCounts * 4 + 1] << 8;\n        case 1:\n          k1 ^= data[blockCounts * 4];\n          k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;\n          k1 = k1 << 15 | k1 >>> 17;\n          k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;\n          if (blockCounts & 1) {\n            h1 ^= k1;\n          } else {\n            h2 ^= k1;\n          }\n      }\n      this.h1 = h1;\n      this.h2 = h2;\n      return this;\n    },\n    hexdigest: function MurmurHash3_64_hexdigest() {\n      var h1 = this.h1;\n      var h2 = this.h2;\n      h1 ^= h2 >>> 1;\n      h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW;\n      h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16;\n      h1 ^= h2 >>> 1;\n      h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW;\n      h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16;\n      h1 ^= h2 >>> 1;\n      for (var i = 0, arr = [h1, h2], str = ''; i < arr.length; i++) {\n        var hex = (arr[i] >>> 0).toString(16);\n        while (hex.length < 8) {\n          hex = '0' + hex;\n        }\n        str += hex;\n      }\n      return str;\n    }\n  };\n  return MurmurHash3_64;\n}();\nexports.MurmurHash3_64 = MurmurHash3_64;\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getTilingPatternIR = exports.Pattern = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _colorspace = __w_pdfjs_require__(3);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _function = __w_pdfjs_require__(7);\n\nvar ShadingType = {\n  FUNCTION_BASED: 1,\n  AXIAL: 2,\n  RADIAL: 3,\n  FREE_FORM_MESH: 4,\n  LATTICE_FORM_MESH: 5,\n  COONS_PATCH_MESH: 6,\n  TENSOR_PATCH_MESH: 7\n};\nvar Pattern = function PatternClosure() {\n  function Pattern() {\n    throw new Error('should not call Pattern constructor');\n  }\n  Pattern.prototype = {\n    getPattern: function Pattern_getPattern(ctx) {\n      throw new Error('Should not call Pattern.getStyle: ' + ctx);\n    }\n  };\n  Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref, res, handler) {\n    var dict = (0, _primitives.isStream)(shading) ? shading.dict : shading;\n    var type = dict.get('ShadingType');\n    try {\n      switch (type) {\n        case ShadingType.AXIAL:\n        case ShadingType.RADIAL:\n          return new Shadings.RadialAxial(dict, matrix, xref, res);\n        case ShadingType.FREE_FORM_MESH:\n        case ShadingType.LATTICE_FORM_MESH:\n        case ShadingType.COONS_PATCH_MESH:\n        case ShadingType.TENSOR_PATCH_MESH:\n          return new Shadings.Mesh(shading, matrix, xref, res);\n        default:\n          throw new _util.FormatError('Unsupported ShadingType: ' + type);\n      }\n    } catch (ex) {\n      if (ex instanceof _util.MissingDataException) {\n        throw ex;\n      }\n      handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.shadingPattern });\n      (0, _util.warn)(ex);\n      return new Shadings.Dummy();\n    }\n  };\n  return Pattern;\n}();\nvar Shadings = {};\nShadings.SMALL_NUMBER = 1e-6;\nShadings.RadialAxial = function RadialAxialClosure() {\n  function RadialAxial(dict, matrix, xref, res) {\n    this.matrix = matrix;\n    this.coordsArr = dict.getArray('Coords');\n    this.shadingType = dict.get('ShadingType');\n    this.type = 'Pattern';\n    var cs = dict.get('ColorSpace', 'CS');\n    cs = _colorspace.ColorSpace.parse(cs, xref, res);\n    this.cs = cs;\n    var t0 = 0.0,\n        t1 = 1.0;\n    if (dict.has('Domain')) {\n      var domainArr = dict.getArray('Domain');\n      t0 = domainArr[0];\n      t1 = domainArr[1];\n    }\n    var extendStart = false,\n        extendEnd = false;\n    if (dict.has('Extend')) {\n      var extendArr = dict.getArray('Extend');\n      extendStart = extendArr[0];\n      extendEnd = extendArr[1];\n    }\n    if (this.shadingType === ShadingType.RADIAL && (!extendStart || !extendEnd)) {\n      var x1 = this.coordsArr[0];\n      var y1 = this.coordsArr[1];\n      var r1 = this.coordsArr[2];\n      var x2 = this.coordsArr[3];\n      var y2 = this.coordsArr[4];\n      var r2 = this.coordsArr[5];\n      var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));\n      if (r1 <= r2 + distance && r2 <= r1 + distance) {\n        (0, _util.warn)('Unsupported radial gradient.');\n      }\n    }\n    this.extendStart = extendStart;\n    this.extendEnd = extendEnd;\n    var fnObj = dict.get('Function');\n    var fn = _function.PDFFunction.parseArray(xref, fnObj);\n    var diff = t1 - t0;\n    var step = diff / 10;\n    var colorStops = this.colorStops = [];\n    if (t0 >= t1 || step <= 0) {\n      (0, _util.info)('Bad shading domain.');\n      return;\n    }\n    var color = new Float32Array(cs.numComps),\n        ratio = new Float32Array(1);\n    var rgbColor;\n    for (var i = t0; i <= t1; i += step) {\n      ratio[0] = i;\n      fn(ratio, 0, color, 0);\n      rgbColor = cs.getRgb(color, 0);\n      var cssColor = _util.Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);\n      colorStops.push([(i - t0) / diff, cssColor]);\n    }\n    var background = 'transparent';\n    if (dict.has('Background')) {\n      rgbColor = cs.getRgb(dict.get('Background'), 0);\n      background = _util.Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);\n    }\n    if (!extendStart) {\n      colorStops.unshift([0, background]);\n      colorStops[1][0] += Shadings.SMALL_NUMBER;\n    }\n    if (!extendEnd) {\n      colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER;\n      colorStops.push([1, background]);\n    }\n    this.colorStops = colorStops;\n  }\n  RadialAxial.prototype = {\n    getIR: function RadialAxial_getIR() {\n      var coordsArr = this.coordsArr;\n      var shadingType = this.shadingType;\n      var type, p0, p1, r0, r1;\n      if (shadingType === ShadingType.AXIAL) {\n        p0 = [coordsArr[0], coordsArr[1]];\n        p1 = [coordsArr[2], coordsArr[3]];\n        r0 = null;\n        r1 = null;\n        type = 'axial';\n      } else if (shadingType === ShadingType.RADIAL) {\n        p0 = [coordsArr[0], coordsArr[1]];\n        p1 = [coordsArr[3], coordsArr[4]];\n        r0 = coordsArr[2];\n        r1 = coordsArr[5];\n        type = 'radial';\n      } else {\n        (0, _util.unreachable)('getPattern type unknown: ' + shadingType);\n      }\n      var matrix = this.matrix;\n      if (matrix) {\n        p0 = _util.Util.applyTransform(p0, matrix);\n        p1 = _util.Util.applyTransform(p1, matrix);\n        if (shadingType === ShadingType.RADIAL) {\n          var scale = _util.Util.singularValueDecompose2dScale(matrix);\n          r0 *= scale[0];\n          r1 *= scale[1];\n        }\n      }\n      return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];\n    }\n  };\n  return RadialAxial;\n}();\nShadings.Mesh = function MeshClosure() {\n  function MeshStreamReader(stream, context) {\n    this.stream = stream;\n    this.context = context;\n    this.buffer = 0;\n    this.bufferLength = 0;\n    var numComps = context.numComps;\n    this.tmpCompsBuf = new Float32Array(numComps);\n    var csNumComps = context.colorSpace.numComps;\n    this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf;\n  }\n  MeshStreamReader.prototype = {\n    get hasData() {\n      if (this.stream.end) {\n        return this.stream.pos < this.stream.end;\n      }\n      if (this.bufferLength > 0) {\n        return true;\n      }\n      var nextByte = this.stream.getByte();\n      if (nextByte < 0) {\n        return false;\n      }\n      this.buffer = nextByte;\n      this.bufferLength = 8;\n      return true;\n    },\n    readBits: function MeshStreamReader_readBits(n) {\n      var buffer = this.buffer;\n      var bufferLength = this.bufferLength;\n      if (n === 32) {\n        if (bufferLength === 0) {\n          return (this.stream.getByte() << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte()) >>> 0;\n        }\n        buffer = buffer << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte();\n        var nextByte = this.stream.getByte();\n        this.buffer = nextByte & (1 << bufferLength) - 1;\n        return (buffer << 8 - bufferLength | (nextByte & 0xFF) >> bufferLength) >>> 0;\n      }\n      if (n === 8 && bufferLength === 0) {\n        return this.stream.getByte();\n      }\n      while (bufferLength < n) {\n        buffer = buffer << 8 | this.stream.getByte();\n        bufferLength += 8;\n      }\n      bufferLength -= n;\n      this.bufferLength = bufferLength;\n      this.buffer = buffer & (1 << bufferLength) - 1;\n      return buffer >> bufferLength;\n    },\n    align: function MeshStreamReader_align() {\n      this.buffer = 0;\n      this.bufferLength = 0;\n    },\n    readFlag: function MeshStreamReader_readFlag() {\n      return this.readBits(this.context.bitsPerFlag);\n    },\n    readCoordinate: function MeshStreamReader_readCoordinate() {\n      var bitsPerCoordinate = this.context.bitsPerCoordinate;\n      var xi = this.readBits(bitsPerCoordinate);\n      var yi = this.readBits(bitsPerCoordinate);\n      var decode = this.context.decode;\n      var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10;\n      return [xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + decode[2]];\n    },\n    readComponents: function MeshStreamReader_readComponents() {\n      var numComps = this.context.numComps;\n      var bitsPerComponent = this.context.bitsPerComponent;\n      var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10;\n      var decode = this.context.decode;\n      var components = this.tmpCompsBuf;\n      for (var i = 0, j = 4; i < numComps; i++, j += 2) {\n        var ci = this.readBits(bitsPerComponent);\n        components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j];\n      }\n      var color = this.tmpCsCompsBuf;\n      if (this.context.colorFn) {\n        this.context.colorFn(components, 0, color, 0);\n      }\n      return this.context.colorSpace.getRgb(color, 0);\n    }\n  };\n  function decodeType4Shading(mesh, reader) {\n    var coords = mesh.coords;\n    var colors = mesh.colors;\n    var operators = [];\n    var ps = [];\n    var verticesLeft = 0;\n    while (reader.hasData) {\n      var f = reader.readFlag();\n      var coord = reader.readCoordinate();\n      var color = reader.readComponents();\n      if (verticesLeft === 0) {\n        if (!(0 <= f && f <= 2)) {\n          throw new _util.FormatError('Unknown type4 flag');\n        }\n        switch (f) {\n          case 0:\n            verticesLeft = 3;\n            break;\n          case 1:\n            ps.push(ps[ps.length - 2], ps[ps.length - 1]);\n            verticesLeft = 1;\n            break;\n          case 2:\n            ps.push(ps[ps.length - 3], ps[ps.length - 1]);\n            verticesLeft = 1;\n            break;\n        }\n        operators.push(f);\n      }\n      ps.push(coords.length);\n      coords.push(coord);\n      colors.push(color);\n      verticesLeft--;\n      reader.align();\n    }\n    mesh.figures.push({\n      type: 'triangles',\n      coords: new Int32Array(ps),\n      colors: new Int32Array(ps)\n    });\n  }\n  function decodeType5Shading(mesh, reader, verticesPerRow) {\n    var coords = mesh.coords;\n    var colors = mesh.colors;\n    var ps = [];\n    while (reader.hasData) {\n      var coord = reader.readCoordinate();\n      var color = reader.readComponents();\n      ps.push(coords.length);\n      coords.push(coord);\n      colors.push(color);\n    }\n    mesh.figures.push({\n      type: 'lattice',\n      coords: new Int32Array(ps),\n      colors: new Int32Array(ps),\n      verticesPerRow: verticesPerRow\n    });\n  }\n  var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3;\n  var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20;\n  var TRIANGLE_DENSITY = 20;\n  var getB = function getBClosure() {\n    function buildB(count) {\n      var lut = [];\n      for (var i = 0; i <= count; i++) {\n        var t = i / count,\n            t_ = 1 - t;\n        lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_, 3 * t * t * t_, t * t * t]));\n      }\n      return lut;\n    }\n    var cache = [];\n    return function getB(count) {\n      if (!cache[count]) {\n        cache[count] = buildB(count);\n      }\n      return cache[count];\n    };\n  }();\n  function buildFigureFromPatch(mesh, index) {\n    var figure = mesh.figures[index];\n    (0, _util.assert)(figure.type === 'patch', 'Unexpected patch mesh figure');\n    var coords = mesh.coords,\n        colors = mesh.colors;\n    var pi = figure.coords;\n    var ci = figure.colors;\n    var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);\n    var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);\n    var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);\n    var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);\n    var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY / (mesh.bounds[2] - mesh.bounds[0]));\n    splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy));\n    var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY / (mesh.bounds[3] - mesh.bounds[1]));\n    splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy));\n    var verticesPerRow = splitXBy + 1;\n    var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow);\n    var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow);\n    var k = 0;\n    var cl = new Uint8Array(3),\n        cr = new Uint8Array(3);\n    var c0 = colors[ci[0]],\n        c1 = colors[ci[1]],\n        c2 = colors[ci[2]],\n        c3 = colors[ci[3]];\n    var bRow = getB(splitYBy),\n        bCol = getB(splitXBy);\n    for (var row = 0; row <= splitYBy; row++) {\n      cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0;\n      cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0;\n      cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0;\n      cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0;\n      cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0;\n      cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0;\n      for (var col = 0; col <= splitXBy; col++, k++) {\n        if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) {\n          continue;\n        }\n        var x = 0,\n            y = 0;\n        var q = 0;\n        for (var i = 0; i <= 3; i++) {\n          for (var j = 0; j <= 3; j++, q++) {\n            var m = bRow[row][i] * bCol[col][j];\n            x += coords[pi[q]][0] * m;\n            y += coords[pi[q]][1] * m;\n          }\n        }\n        figureCoords[k] = coords.length;\n        coords.push([x, y]);\n        figureColors[k] = colors.length;\n        var newColor = new Uint8Array(3);\n        newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0;\n        newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0;\n        newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0;\n        colors.push(newColor);\n      }\n    }\n    figureCoords[0] = pi[0];\n    figureColors[0] = ci[0];\n    figureCoords[splitXBy] = pi[3];\n    figureColors[splitXBy] = ci[1];\n    figureCoords[verticesPerRow * splitYBy] = pi[12];\n    figureColors[verticesPerRow * splitYBy] = ci[2];\n    figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15];\n    figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3];\n    mesh.figures[index] = {\n      type: 'lattice',\n      coords: figureCoords,\n      colors: figureColors,\n      verticesPerRow: verticesPerRow\n    };\n  }\n  function decodeType6Shading(mesh, reader) {\n    var coords = mesh.coords;\n    var colors = mesh.colors;\n    var ps = new Int32Array(16);\n    var cs = new Int32Array(4);\n    while (reader.hasData) {\n      var f = reader.readFlag();\n      if (!(0 <= f && f <= 3)) {\n        throw new _util.FormatError('Unknown type6 flag');\n      }\n      var i, ii;\n      var pi = coords.length;\n      for (i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) {\n        coords.push(reader.readCoordinate());\n      }\n      var ci = colors.length;\n      for (i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {\n        colors.push(reader.readComponents());\n      }\n      var tmp1, tmp2, tmp3, tmp4;\n      switch (f) {\n        case 0:\n          ps[12] = pi + 3;\n          ps[13] = pi + 4;\n          ps[14] = pi + 5;\n          ps[15] = pi + 6;\n          ps[8] = pi + 2;\n          ps[11] = pi + 7;\n          ps[4] = pi + 1;\n          ps[7] = pi + 8;\n          ps[0] = pi;\n          ps[1] = pi + 11;\n          ps[2] = pi + 10;\n          ps[3] = pi + 9;\n          cs[2] = ci + 1;\n          cs[3] = ci + 2;\n          cs[0] = ci;\n          cs[1] = ci + 3;\n          break;\n        case 1:\n          tmp1 = ps[12];\n          tmp2 = ps[13];\n          tmp3 = ps[14];\n          tmp4 = ps[15];\n          ps[12] = tmp4;\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = tmp3;\n          ps[11] = pi + 3;\n          ps[4] = tmp2;\n          ps[7] = pi + 4;\n          ps[0] = tmp1;\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          tmp1 = cs[2];\n          tmp2 = cs[3];\n          cs[2] = tmp2;\n          cs[3] = ci;\n          cs[0] = tmp1;\n          cs[1] = ci + 1;\n          break;\n        case 2:\n          tmp1 = ps[15];\n          tmp2 = ps[11];\n          ps[12] = ps[3];\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = ps[7];\n          ps[11] = pi + 3;\n          ps[4] = tmp2;\n          ps[7] = pi + 4;\n          ps[0] = tmp1;\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          tmp1 = cs[3];\n          cs[2] = cs[1];\n          cs[3] = ci;\n          cs[0] = tmp1;\n          cs[1] = ci + 1;\n          break;\n        case 3:\n          ps[12] = ps[0];\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = ps[1];\n          ps[11] = pi + 3;\n          ps[4] = ps[2];\n          ps[7] = pi + 4;\n          ps[0] = ps[3];\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          cs[2] = cs[0];\n          cs[3] = ci;\n          cs[0] = cs[1];\n          cs[1] = ci + 1;\n          break;\n      }\n      ps[5] = coords.length;\n      coords.push([(-4 * coords[ps[0]][0] - coords[ps[15]][0] + 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, (-4 * coords[ps[0]][1] - coords[ps[15]][1] + 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9]);\n      ps[6] = coords.length;\n      coords.push([(-4 * coords[ps[3]][0] - coords[ps[12]][0] + 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, (-4 * coords[ps[3]][1] - coords[ps[12]][1] + 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9]);\n      ps[9] = coords.length;\n      coords.push([(-4 * coords[ps[12]][0] - coords[ps[3]][0] + 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, (-4 * coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9]);\n      ps[10] = coords.length;\n      coords.push([(-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, (-4 * coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9]);\n      mesh.figures.push({\n        type: 'patch',\n        coords: new Int32Array(ps),\n        colors: new Int32Array(cs)\n      });\n    }\n  }\n  function decodeType7Shading(mesh, reader) {\n    var coords = mesh.coords;\n    var colors = mesh.colors;\n    var ps = new Int32Array(16);\n    var cs = new Int32Array(4);\n    while (reader.hasData) {\n      var f = reader.readFlag();\n      if (!(0 <= f && f <= 3)) {\n        throw new _util.FormatError('Unknown type7 flag');\n      }\n      var i, ii;\n      var pi = coords.length;\n      for (i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) {\n        coords.push(reader.readCoordinate());\n      }\n      var ci = colors.length;\n      for (i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {\n        colors.push(reader.readComponents());\n      }\n      var tmp1, tmp2, tmp3, tmp4;\n      switch (f) {\n        case 0:\n          ps[12] = pi + 3;\n          ps[13] = pi + 4;\n          ps[14] = pi + 5;\n          ps[15] = pi + 6;\n          ps[8] = pi + 2;\n          ps[9] = pi + 13;\n          ps[10] = pi + 14;\n          ps[11] = pi + 7;\n          ps[4] = pi + 1;\n          ps[5] = pi + 12;\n          ps[6] = pi + 15;\n          ps[7] = pi + 8;\n          ps[0] = pi;\n          ps[1] = pi + 11;\n          ps[2] = pi + 10;\n          ps[3] = pi + 9;\n          cs[2] = ci + 1;\n          cs[3] = ci + 2;\n          cs[0] = ci;\n          cs[1] = ci + 3;\n          break;\n        case 1:\n          tmp1 = ps[12];\n          tmp2 = ps[13];\n          tmp3 = ps[14];\n          tmp4 = ps[15];\n          ps[12] = tmp4;\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = tmp3;\n          ps[9] = pi + 9;\n          ps[10] = pi + 10;\n          ps[11] = pi + 3;\n          ps[4] = tmp2;\n          ps[5] = pi + 8;\n          ps[6] = pi + 11;\n          ps[7] = pi + 4;\n          ps[0] = tmp1;\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          tmp1 = cs[2];\n          tmp2 = cs[3];\n          cs[2] = tmp2;\n          cs[3] = ci;\n          cs[0] = tmp1;\n          cs[1] = ci + 1;\n          break;\n        case 2:\n          tmp1 = ps[15];\n          tmp2 = ps[11];\n          ps[12] = ps[3];\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = ps[7];\n          ps[9] = pi + 9;\n          ps[10] = pi + 10;\n          ps[11] = pi + 3;\n          ps[4] = tmp2;\n          ps[5] = pi + 8;\n          ps[6] = pi + 11;\n          ps[7] = pi + 4;\n          ps[0] = tmp1;\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          tmp1 = cs[3];\n          cs[2] = cs[1];\n          cs[3] = ci;\n          cs[0] = tmp1;\n          cs[1] = ci + 1;\n          break;\n        case 3:\n          ps[12] = ps[0];\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = ps[1];\n          ps[9] = pi + 9;\n          ps[10] = pi + 10;\n          ps[11] = pi + 3;\n          ps[4] = ps[2];\n          ps[5] = pi + 8;\n          ps[6] = pi + 11;\n          ps[7] = pi + 4;\n          ps[0] = ps[3];\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          cs[2] = cs[0];\n          cs[3] = ci;\n          cs[0] = cs[1];\n          cs[1] = ci + 1;\n          break;\n      }\n      mesh.figures.push({\n        type: 'patch',\n        coords: new Int32Array(ps),\n        colors: new Int32Array(cs)\n      });\n    }\n  }\n  function updateBounds(mesh) {\n    var minX = mesh.coords[0][0],\n        minY = mesh.coords[0][1],\n        maxX = minX,\n        maxY = minY;\n    for (var i = 1, ii = mesh.coords.length; i < ii; i++) {\n      var x = mesh.coords[i][0],\n          y = mesh.coords[i][1];\n      minX = minX > x ? x : minX;\n      minY = minY > y ? y : minY;\n      maxX = maxX < x ? x : maxX;\n      maxY = maxY < y ? y : maxY;\n    }\n    mesh.bounds = [minX, minY, maxX, maxY];\n  }\n  function packData(mesh) {\n    var i, ii, j, jj;\n    var coords = mesh.coords;\n    var coordsPacked = new Float32Array(coords.length * 2);\n    for (i = 0, j = 0, ii = coords.length; i < ii; i++) {\n      var xy = coords[i];\n      coordsPacked[j++] = xy[0];\n      coordsPacked[j++] = xy[1];\n    }\n    mesh.coords = coordsPacked;\n    var colors = mesh.colors;\n    var colorsPacked = new Uint8Array(colors.length * 3);\n    for (i = 0, j = 0, ii = colors.length; i < ii; i++) {\n      var c = colors[i];\n      colorsPacked[j++] = c[0];\n      colorsPacked[j++] = c[1];\n      colorsPacked[j++] = c[2];\n    }\n    mesh.colors = colorsPacked;\n    var figures = mesh.figures;\n    for (i = 0, ii = figures.length; i < ii; i++) {\n      var figure = figures[i],\n          ps = figure.coords,\n          cs = figure.colors;\n      for (j = 0, jj = ps.length; j < jj; j++) {\n        ps[j] *= 2;\n        cs[j] *= 3;\n      }\n    }\n  }\n  function Mesh(stream, matrix, xref, res) {\n    if (!(0, _primitives.isStream)(stream)) {\n      throw new _util.FormatError('Mesh data is not a stream');\n    }\n    var dict = stream.dict;\n    this.matrix = matrix;\n    this.shadingType = dict.get('ShadingType');\n    this.type = 'Pattern';\n    this.bbox = dict.getArray('BBox');\n    var cs = dict.get('ColorSpace', 'CS');\n    cs = _colorspace.ColorSpace.parse(cs, xref, res);\n    this.cs = cs;\n    this.background = dict.has('Background') ? cs.getRgb(dict.get('Background'), 0) : null;\n    var fnObj = dict.get('Function');\n    var fn = fnObj ? _function.PDFFunction.parseArray(xref, fnObj) : null;\n    this.coords = [];\n    this.colors = [];\n    this.figures = [];\n    var decodeContext = {\n      bitsPerCoordinate: dict.get('BitsPerCoordinate'),\n      bitsPerComponent: dict.get('BitsPerComponent'),\n      bitsPerFlag: dict.get('BitsPerFlag'),\n      decode: dict.getArray('Decode'),\n      colorFn: fn,\n      colorSpace: cs,\n      numComps: fn ? 1 : cs.numComps\n    };\n    var reader = new MeshStreamReader(stream, decodeContext);\n    var patchMesh = false;\n    switch (this.shadingType) {\n      case ShadingType.FREE_FORM_MESH:\n        decodeType4Shading(this, reader);\n        break;\n      case ShadingType.LATTICE_FORM_MESH:\n        var verticesPerRow = dict.get('VerticesPerRow') | 0;\n        if (verticesPerRow < 2) {\n          throw new _util.FormatError('Invalid VerticesPerRow');\n        }\n        decodeType5Shading(this, reader, verticesPerRow);\n        break;\n      case ShadingType.COONS_PATCH_MESH:\n        decodeType6Shading(this, reader);\n        patchMesh = true;\n        break;\n      case ShadingType.TENSOR_PATCH_MESH:\n        decodeType7Shading(this, reader);\n        patchMesh = true;\n        break;\n      default:\n        (0, _util.unreachable)('Unsupported mesh type.');\n        break;\n    }\n    if (patchMesh) {\n      updateBounds(this);\n      for (var i = 0, ii = this.figures.length; i < ii; i++) {\n        buildFigureFromPatch(this, i);\n      }\n    }\n    updateBounds(this);\n    packData(this);\n  }\n  Mesh.prototype = {\n    getIR: function Mesh_getIR() {\n      return ['Mesh', this.shadingType, this.coords, this.colors, this.figures, this.bounds, this.matrix, this.bbox, this.background];\n    }\n  };\n  return Mesh;\n}();\nShadings.Dummy = function DummyClosure() {\n  function Dummy() {\n    this.type = 'Pattern';\n  }\n  Dummy.prototype = {\n    getIR: function Dummy_getIR() {\n      return ['Dummy'];\n    }\n  };\n  return Dummy;\n}();\nfunction getTilingPatternIR(operatorList, dict, args) {\n  var matrix = dict.getArray('Matrix');\n  var bbox = _util.Util.normalizeRect(dict.getArray('BBox'));\n  var xstep = dict.get('XStep');\n  var ystep = dict.get('YStep');\n  var paintType = dict.get('PaintType');\n  var tilingType = dict.get('TilingType');\n  if (bbox[2] - bbox[0] === 0 || bbox[3] - bbox[1] === 0) {\n    throw new _util.FormatError('Invalid getTilingPatternIR /BBox array: [' + bbox + '].');\n  }\n  return ['TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType];\n}\nexports.Pattern = Pattern;\nexports.getTilingPatternIR = getTilingPatternIR;\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.NetworkPdfManager = exports.LocalPdfManager = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _chunked_stream = __w_pdfjs_require__(11);\n\nvar _document = __w_pdfjs_require__(23);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar BasePdfManager = function BasePdfManagerClosure() {\n  function BasePdfManager() {\n    throw new Error('Cannot initialize BaseManagerManager');\n  }\n  BasePdfManager.prototype = {\n    get docId() {\n      return this._docId;\n    },\n    get password() {\n      return this._password;\n    },\n    get docBaseUrl() {\n      var docBaseUrl = null;\n      if (this._docBaseUrl) {\n        var absoluteUrl = (0, _util.createValidAbsoluteUrl)(this._docBaseUrl);\n        if (absoluteUrl) {\n          docBaseUrl = absoluteUrl.href;\n        } else {\n          (0, _util.warn)('Invalid absolute docBaseUrl: \"' + this._docBaseUrl + '\".');\n        }\n      }\n      return (0, _util.shadow)(this, 'docBaseUrl', docBaseUrl);\n    },\n    onLoadedStream: function BasePdfManager_onLoadedStream() {\n      throw new _util.NotImplementedException();\n    },\n    ensureDoc: function BasePdfManager_ensureDoc(prop, args) {\n      return this.ensure(this.pdfDocument, prop, args);\n    },\n    ensureXRef: function BasePdfManager_ensureXRef(prop, args) {\n      return this.ensure(this.pdfDocument.xref, prop, args);\n    },\n    ensureCatalog: function BasePdfManager_ensureCatalog(prop, args) {\n      return this.ensure(this.pdfDocument.catalog, prop, args);\n    },\n    getPage: function BasePdfManager_getPage(pageIndex) {\n      return this.pdfDocument.getPage(pageIndex);\n    },\n    cleanup: function BasePdfManager_cleanup() {\n      return this.pdfDocument.cleanup();\n    },\n    ensure: function BasePdfManager_ensure(obj, prop, args) {\n      return new _util.NotImplementedException();\n    },\n    requestRange: function BasePdfManager_requestRange(begin, end) {\n      return new _util.NotImplementedException();\n    },\n    requestLoadedStream: function BasePdfManager_requestLoadedStream() {\n      return new _util.NotImplementedException();\n    },\n    sendProgressiveData: function BasePdfManager_sendProgressiveData(chunk) {\n      return new _util.NotImplementedException();\n    },\n    updatePassword: function BasePdfManager_updatePassword(password) {\n      this._password = password;\n    },\n    terminate: function BasePdfManager_terminate() {\n      return new _util.NotImplementedException();\n    }\n  };\n  return BasePdfManager;\n}();\nvar LocalPdfManager = function LocalPdfManagerClosure() {\n  function LocalPdfManager(docId, data, password, evaluatorOptions, docBaseUrl) {\n    this._docId = docId;\n    this._password = password;\n    this._docBaseUrl = docBaseUrl;\n    this.evaluatorOptions = evaluatorOptions;\n    var stream = new _stream.Stream(data);\n    this.pdfDocument = new _document.PDFDocument(this, stream);\n    this._loadedStreamCapability = (0, _util.createPromiseCapability)();\n    this._loadedStreamCapability.resolve(stream);\n  }\n  _util.Util.inherit(LocalPdfManager, BasePdfManager, {\n    ensure: function LocalPdfManager_ensure(obj, prop, args) {\n      return new Promise(function (resolve, reject) {\n        try {\n          var value = obj[prop];\n          var result;\n          if (typeof value === 'function') {\n            result = value.apply(obj, args);\n          } else {\n            result = value;\n          }\n          resolve(result);\n        } catch (e) {\n          reject(e);\n        }\n      });\n    },\n    requestRange: function LocalPdfManager_requestRange(begin, end) {\n      return Promise.resolve();\n    },\n    requestLoadedStream: function LocalPdfManager_requestLoadedStream() {},\n    onLoadedStream: function LocalPdfManager_onLoadedStream() {\n      return this._loadedStreamCapability.promise;\n    },\n    terminate: function LocalPdfManager_terminate() {}\n  });\n  return LocalPdfManager;\n}();\nvar NetworkPdfManager = function NetworkPdfManagerClosure() {\n  function NetworkPdfManager(docId, pdfNetworkStream, args, evaluatorOptions, docBaseUrl) {\n    this._docId = docId;\n    this._password = args.password;\n    this._docBaseUrl = docBaseUrl;\n    this.msgHandler = args.msgHandler;\n    this.evaluatorOptions = evaluatorOptions;\n    var params = {\n      msgHandler: args.msgHandler,\n      url: args.url,\n      length: args.length,\n      disableAutoFetch: args.disableAutoFetch,\n      rangeChunkSize: args.rangeChunkSize\n    };\n    this.streamManager = new _chunked_stream.ChunkedStreamManager(pdfNetworkStream, params);\n    this.pdfDocument = new _document.PDFDocument(this, this.streamManager.getStream());\n  }\n  _util.Util.inherit(NetworkPdfManager, BasePdfManager, {\n    ensure: function NetworkPdfManager_ensure(obj, prop, args) {\n      var pdfManager = this;\n      return new Promise(function (resolve, reject) {\n        function ensureHelper() {\n          try {\n            var result;\n            var value = obj[prop];\n            if (typeof value === 'function') {\n              result = value.apply(obj, args);\n            } else {\n              result = value;\n            }\n            resolve(result);\n          } catch (e) {\n            if (!(e instanceof _util.MissingDataException)) {\n              reject(e);\n              return;\n            }\n            pdfManager.streamManager.requestRange(e.begin, e.end).then(ensureHelper, reject);\n          }\n        }\n        ensureHelper();\n      });\n    },\n    requestRange: function NetworkPdfManager_requestRange(begin, end) {\n      return this.streamManager.requestRange(begin, end);\n    },\n    requestLoadedStream: function NetworkPdfManager_requestLoadedStream() {\n      this.streamManager.requestAllChunks();\n    },\n    sendProgressiveData: function NetworkPdfManager_sendProgressiveData(chunk) {\n      this.streamManager.onReceiveData({ chunk: chunk });\n    },\n    onLoadedStream: function NetworkPdfManager_onLoadedStream() {\n      return this.streamManager.onLoadedStream();\n    },\n    terminate: function NetworkPdfManager_terminate() {\n      this.streamManager.abort();\n    }\n  });\n  return NetworkPdfManager;\n}();\nexports.LocalPdfManager = LocalPdfManager;\nexports.NetworkPdfManager = NetworkPdfManager;\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PostScriptParser = exports.PostScriptLexer = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar PostScriptParser = function PostScriptParserClosure() {\n  function PostScriptParser(lexer) {\n    this.lexer = lexer;\n    this.operators = [];\n    this.token = null;\n    this.prev = null;\n  }\n  PostScriptParser.prototype = {\n    nextToken: function PostScriptParser_nextToken() {\n      this.prev = this.token;\n      this.token = this.lexer.getToken();\n    },\n    accept: function PostScriptParser_accept(type) {\n      if (this.token.type === type) {\n        this.nextToken();\n        return true;\n      }\n      return false;\n    },\n    expect: function PostScriptParser_expect(type) {\n      if (this.accept(type)) {\n        return true;\n      }\n      throw new _util.FormatError('Unexpected symbol: found ' + this.token.type + ' expected ' + type + '.');\n    },\n    parse: function PostScriptParser_parse() {\n      this.nextToken();\n      this.expect(PostScriptTokenTypes.LBRACE);\n      this.parseBlock();\n      this.expect(PostScriptTokenTypes.RBRACE);\n      return this.operators;\n    },\n    parseBlock: function PostScriptParser_parseBlock() {\n      while (true) {\n        if (this.accept(PostScriptTokenTypes.NUMBER)) {\n          this.operators.push(this.prev.value);\n        } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {\n          this.operators.push(this.prev.value);\n        } else if (this.accept(PostScriptTokenTypes.LBRACE)) {\n          this.parseCondition();\n        } else {\n          return;\n        }\n      }\n    },\n    parseCondition: function PostScriptParser_parseCondition() {\n      var conditionLocation = this.operators.length;\n      this.operators.push(null, null);\n      this.parseBlock();\n      this.expect(PostScriptTokenTypes.RBRACE);\n      if (this.accept(PostScriptTokenTypes.IF)) {\n        this.operators[conditionLocation] = this.operators.length;\n        this.operators[conditionLocation + 1] = 'jz';\n      } else if (this.accept(PostScriptTokenTypes.LBRACE)) {\n        var jumpLocation = this.operators.length;\n        this.operators.push(null, null);\n        var endOfTrue = this.operators.length;\n        this.parseBlock();\n        this.expect(PostScriptTokenTypes.RBRACE);\n        this.expect(PostScriptTokenTypes.IFELSE);\n        this.operators[jumpLocation] = this.operators.length;\n        this.operators[jumpLocation + 1] = 'j';\n        this.operators[conditionLocation] = endOfTrue;\n        this.operators[conditionLocation + 1] = 'jz';\n      } else {\n        throw new _util.FormatError('PS Function: error parsing conditional.');\n      }\n    }\n  };\n  return PostScriptParser;\n}();\nvar PostScriptTokenTypes = {\n  LBRACE: 0,\n  RBRACE: 1,\n  NUMBER: 2,\n  OPERATOR: 3,\n  IF: 4,\n  IFELSE: 5\n};\nvar PostScriptToken = function PostScriptTokenClosure() {\n  function PostScriptToken(type, value) {\n    this.type = type;\n    this.value = value;\n  }\n  var opCache = Object.create(null);\n  PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {\n    var opValue = opCache[op];\n    if (opValue) {\n      return opValue;\n    }\n    return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);\n  };\n  PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE, '{');\n  PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE, '}');\n  PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');\n  PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE, 'IFELSE');\n  return PostScriptToken;\n}();\nvar PostScriptLexer = function PostScriptLexerClosure() {\n  function PostScriptLexer(stream) {\n    this.stream = stream;\n    this.nextChar();\n    this.strBuf = [];\n  }\n  PostScriptLexer.prototype = {\n    nextChar: function PostScriptLexer_nextChar() {\n      return this.currentChar = this.stream.getByte();\n    },\n    getToken: function PostScriptLexer_getToken() {\n      var comment = false;\n      var ch = this.currentChar;\n      while (true) {\n        if (ch < 0) {\n          return _primitives.EOF;\n        }\n        if (comment) {\n          if (ch === 0x0A || ch === 0x0D) {\n            comment = false;\n          }\n        } else if (ch === 0x25) {\n          comment = true;\n        } else if (!(0, _util.isSpace)(ch)) {\n          break;\n        }\n        ch = this.nextChar();\n      }\n      switch (ch | 0) {\n        case 0x30:\n        case 0x31:\n        case 0x32:\n        case 0x33:\n        case 0x34:\n        case 0x35:\n        case 0x36:\n        case 0x37:\n        case 0x38:\n        case 0x39:\n        case 0x2B:\n        case 0x2D:\n        case 0x2E:\n          return new PostScriptToken(PostScriptTokenTypes.NUMBER, this.getNumber());\n        case 0x7B:\n          this.nextChar();\n          return PostScriptToken.LBRACE;\n        case 0x7D:\n          this.nextChar();\n          return PostScriptToken.RBRACE;\n      }\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      strBuf[0] = String.fromCharCode(ch);\n      while ((ch = this.nextChar()) >= 0 && (ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A)) {\n        strBuf.push(String.fromCharCode(ch));\n      }\n      var str = strBuf.join('');\n      switch (str.toLowerCase()) {\n        case 'if':\n          return PostScriptToken.IF;\n        case 'ifelse':\n          return PostScriptToken.IFELSE;\n        default:\n          return PostScriptToken.getOperator(str);\n      }\n    },\n    getNumber: function PostScriptLexer_getNumber() {\n      var ch = this.currentChar;\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      strBuf[0] = String.fromCharCode(ch);\n      while ((ch = this.nextChar()) >= 0) {\n        if (ch >= 0x30 && ch <= 0x39 || ch === 0x2D || ch === 0x2E) {\n          strBuf.push(String.fromCharCode(ch));\n        } else {\n          break;\n        }\n      }\n      var value = parseFloat(strBuf.join(''));\n      if (isNaN(value)) {\n        throw new _util.FormatError('Invalid floating point number: ' + value);\n      }\n      return value;\n    }\n  };\n  return PostScriptLexer;\n}();\nexports.PostScriptLexer = PostScriptLexer;\nexports.PostScriptParser = PostScriptParser;\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Type1Parser = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _encodings = __w_pdfjs_require__(4);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar HINTING_ENABLED = false;\nvar Type1CharString = function Type1CharStringClosure() {\n  var COMMAND_MAP = {\n    'hstem': [1],\n    'vstem': [3],\n    'vmoveto': [4],\n    'rlineto': [5],\n    'hlineto': [6],\n    'vlineto': [7],\n    'rrcurveto': [8],\n    'callsubr': [10],\n    'flex': [12, 35],\n    'drop': [12, 18],\n    'endchar': [14],\n    'rmoveto': [21],\n    'hmoveto': [22],\n    'vhcurveto': [30],\n    'hvcurveto': [31]\n  };\n  function Type1CharString() {\n    this.width = 0;\n    this.lsb = 0;\n    this.flexing = false;\n    this.output = [];\n    this.stack = [];\n  }\n  Type1CharString.prototype = {\n    convert: function Type1CharString_convert(encoded, subrs, seacAnalysisEnabled) {\n      var count = encoded.length;\n      var error = false;\n      var wx, sbx, subrNumber;\n      for (var i = 0; i < count; i++) {\n        var value = encoded[i];\n        if (value < 32) {\n          if (value === 12) {\n            value = (value << 8) + encoded[++i];\n          }\n          switch (value) {\n            case 1:\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n              error = this.executeCommand(2, COMMAND_MAP.hstem);\n              break;\n            case 3:\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n              error = this.executeCommand(2, COMMAND_MAP.vstem);\n              break;\n            case 4:\n              if (this.flexing) {\n                if (this.stack.length < 1) {\n                  error = true;\n                  break;\n                }\n                var dy = this.stack.pop();\n                this.stack.push(0, dy);\n                break;\n              }\n              error = this.executeCommand(1, COMMAND_MAP.vmoveto);\n              break;\n            case 5:\n              error = this.executeCommand(2, COMMAND_MAP.rlineto);\n              break;\n            case 6:\n              error = this.executeCommand(1, COMMAND_MAP.hlineto);\n              break;\n            case 7:\n              error = this.executeCommand(1, COMMAND_MAP.vlineto);\n              break;\n            case 8:\n              error = this.executeCommand(6, COMMAND_MAP.rrcurveto);\n              break;\n            case 9:\n              this.stack = [];\n              break;\n            case 10:\n              if (this.stack.length < 1) {\n                error = true;\n                break;\n              }\n              subrNumber = this.stack.pop();\n              error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled);\n              break;\n            case 11:\n              return error;\n            case 13:\n              if (this.stack.length < 2) {\n                error = true;\n                break;\n              }\n              wx = this.stack.pop();\n              sbx = this.stack.pop();\n              this.lsb = sbx;\n              this.width = wx;\n              this.stack.push(wx, sbx);\n              error = this.executeCommand(2, COMMAND_MAP.hmoveto);\n              break;\n            case 14:\n              this.output.push(COMMAND_MAP.endchar[0]);\n              break;\n            case 21:\n              if (this.flexing) {\n                break;\n              }\n              error = this.executeCommand(2, COMMAND_MAP.rmoveto);\n              break;\n            case 22:\n              if (this.flexing) {\n                this.stack.push(0);\n                break;\n              }\n              error = this.executeCommand(1, COMMAND_MAP.hmoveto);\n              break;\n            case 30:\n              error = this.executeCommand(4, COMMAND_MAP.vhcurveto);\n              break;\n            case 31:\n              error = this.executeCommand(4, COMMAND_MAP.hvcurveto);\n              break;\n            case (12 << 8) + 0:\n              this.stack = [];\n              break;\n            case (12 << 8) + 1:\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n              error = this.executeCommand(2, COMMAND_MAP.vstem);\n              break;\n            case (12 << 8) + 2:\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n              error = this.executeCommand(2, COMMAND_MAP.hstem);\n              break;\n            case (12 << 8) + 6:\n              if (seacAnalysisEnabled) {\n                this.seac = this.stack.splice(-4, 4);\n                error = this.executeCommand(0, COMMAND_MAP.endchar);\n              } else {\n                error = this.executeCommand(4, COMMAND_MAP.endchar);\n              }\n              break;\n            case (12 << 8) + 7:\n              if (this.stack.length < 4) {\n                error = true;\n                break;\n              }\n              this.stack.pop();\n              wx = this.stack.pop();\n              var sby = this.stack.pop();\n              sbx = this.stack.pop();\n              this.lsb = sbx;\n              this.width = wx;\n              this.stack.push(wx, sbx, sby);\n              error = this.executeCommand(3, COMMAND_MAP.rmoveto);\n              break;\n            case (12 << 8) + 12:\n              if (this.stack.length < 2) {\n                error = true;\n                break;\n              }\n              var num2 = this.stack.pop();\n              var num1 = this.stack.pop();\n              this.stack.push(num1 / num2);\n              break;\n            case (12 << 8) + 16:\n              if (this.stack.length < 2) {\n                error = true;\n                break;\n              }\n              subrNumber = this.stack.pop();\n              var numArgs = this.stack.pop();\n              if (subrNumber === 0 && numArgs === 3) {\n                var flexArgs = this.stack.splice(this.stack.length - 17, 17);\n                this.stack.push(flexArgs[2] + flexArgs[0], flexArgs[3] + flexArgs[1], flexArgs[4], flexArgs[5], flexArgs[6], flexArgs[7], flexArgs[8], flexArgs[9], flexArgs[10], flexArgs[11], flexArgs[12], flexArgs[13], flexArgs[14]);\n                error = this.executeCommand(13, COMMAND_MAP.flex, true);\n                this.flexing = false;\n                this.stack.push(flexArgs[15], flexArgs[16]);\n              } else if (subrNumber === 1 && numArgs === 0) {\n                this.flexing = true;\n              }\n              break;\n            case (12 << 8) + 17:\n              break;\n            case (12 << 8) + 33:\n              this.stack = [];\n              break;\n            default:\n              (0, _util.warn)('Unknown type 1 charstring command of \"' + value + '\"');\n              break;\n          }\n          if (error) {\n            break;\n          }\n          continue;\n        } else if (value <= 246) {\n          value = value - 139;\n        } else if (value <= 250) {\n          value = (value - 247) * 256 + encoded[++i] + 108;\n        } else if (value <= 254) {\n          value = -((value - 251) * 256) - encoded[++i] - 108;\n        } else {\n          value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0;\n        }\n        this.stack.push(value);\n      }\n      return error;\n    },\n    executeCommand: function executeCommand(howManyArgs, command, keepStack) {\n      var stackLength = this.stack.length;\n      if (howManyArgs > stackLength) {\n        return true;\n      }\n      var start = stackLength - howManyArgs;\n      for (var i = start; i < stackLength; i++) {\n        var value = this.stack[i];\n        if (value === (value | 0)) {\n          this.output.push(28, value >> 8 & 0xff, value & 0xff);\n        } else {\n          value = 65536 * value | 0;\n          this.output.push(255, value >> 24 & 0xFF, value >> 16 & 0xFF, value >> 8 & 0xFF, value & 0xFF);\n        }\n      }\n      this.output.push.apply(this.output, command);\n      if (keepStack) {\n        this.stack.splice(start, howManyArgs);\n      } else {\n        this.stack.length = 0;\n      }\n      return false;\n    }\n  };\n  return Type1CharString;\n}();\nvar Type1Parser = function Type1ParserClosure() {\n  var EEXEC_ENCRYPT_KEY = 55665;\n  var CHAR_STRS_ENCRYPT_KEY = 4330;\n  function isHexDigit(code) {\n    return code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102;\n  }\n  function decrypt(data, key, discardNumber) {\n    if (discardNumber >= data.length) {\n      return new Uint8Array(0);\n    }\n    var r = key | 0,\n        c1 = 52845,\n        c2 = 22719,\n        i,\n        j;\n    for (i = 0; i < discardNumber; i++) {\n      r = (data[i] + r) * c1 + c2 & (1 << 16) - 1;\n    }\n    var count = data.length - discardNumber;\n    var decrypted = new Uint8Array(count);\n    for (i = discardNumber, j = 0; j < count; i++, j++) {\n      var value = data[i];\n      decrypted[j] = value ^ r >> 8;\n      r = (value + r) * c1 + c2 & (1 << 16) - 1;\n    }\n    return decrypted;\n  }\n  function decryptAscii(data, key, discardNumber) {\n    var r = key | 0,\n        c1 = 52845,\n        c2 = 22719;\n    var count = data.length,\n        maybeLength = count >>> 1;\n    var decrypted = new Uint8Array(maybeLength);\n    var i, j;\n    for (i = 0, j = 0; i < count; i++) {\n      var digit1 = data[i];\n      if (!isHexDigit(digit1)) {\n        continue;\n      }\n      i++;\n      var digit2;\n      while (i < count && !isHexDigit(digit2 = data[i])) {\n        i++;\n      }\n      if (i < count) {\n        var value = parseInt(String.fromCharCode(digit1, digit2), 16);\n        decrypted[j++] = value ^ r >> 8;\n        r = (value + r) * c1 + c2 & (1 << 16) - 1;\n      }\n    }\n    return Array.prototype.slice.call(decrypted, discardNumber, j);\n  }\n  function isSpecial(c) {\n    return c === 0x2F || c === 0x5B || c === 0x5D || c === 0x7B || c === 0x7D || c === 0x28 || c === 0x29;\n  }\n  function Type1Parser(stream, encrypted, seacAnalysisEnabled) {\n    if (encrypted) {\n      var data = stream.getBytes();\n      var isBinary = !(isHexDigit(data[0]) && isHexDigit(data[1]) && isHexDigit(data[2]) && isHexDigit(data[3]));\n      stream = new _stream.Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : decryptAscii(data, EEXEC_ENCRYPT_KEY, 4));\n    }\n    this.seacAnalysisEnabled = !!seacAnalysisEnabled;\n    this.stream = stream;\n    this.nextChar();\n  }\n  Type1Parser.prototype = {\n    readNumberArray: function Type1Parser_readNumberArray() {\n      this.getToken();\n      var array = [];\n      while (true) {\n        var token = this.getToken();\n        if (token === null || token === ']' || token === '}') {\n          break;\n        }\n        array.push(parseFloat(token || 0));\n      }\n      return array;\n    },\n    readNumber: function Type1Parser_readNumber() {\n      var token = this.getToken();\n      return parseFloat(token || 0);\n    },\n    readInt: function Type1Parser_readInt() {\n      var token = this.getToken();\n      return parseInt(token || 0, 10) | 0;\n    },\n    readBoolean: function Type1Parser_readBoolean() {\n      var token = this.getToken();\n      return token === 'true' ? 1 : 0;\n    },\n    nextChar: function Type1_nextChar() {\n      return this.currentChar = this.stream.getByte();\n    },\n    getToken: function Type1Parser_getToken() {\n      var comment = false;\n      var ch = this.currentChar;\n      while (true) {\n        if (ch === -1) {\n          return null;\n        }\n        if (comment) {\n          if (ch === 0x0A || ch === 0x0D) {\n            comment = false;\n          }\n        } else if (ch === 0x25) {\n          comment = true;\n        } else if (!(0, _util.isSpace)(ch)) {\n          break;\n        }\n        ch = this.nextChar();\n      }\n      if (isSpecial(ch)) {\n        this.nextChar();\n        return String.fromCharCode(ch);\n      }\n      var token = '';\n      do {\n        token += String.fromCharCode(ch);\n        ch = this.nextChar();\n      } while (ch >= 0 && !(0, _util.isSpace)(ch) && !isSpecial(ch));\n      return token;\n    },\n    extractFontProgram: function Type1Parser_extractFontProgram() {\n      var stream = this.stream;\n      var subrs = [],\n          charstrings = [];\n      var privateData = Object.create(null);\n      privateData['lenIV'] = 4;\n      var program = {\n        subrs: [],\n        charstrings: [],\n        properties: { 'privateData': privateData }\n      };\n      var token, length, data, lenIV, encoded;\n      while ((token = this.getToken()) !== null) {\n        if (token !== '/') {\n          continue;\n        }\n        token = this.getToken();\n        switch (token) {\n          case 'CharStrings':\n            this.getToken();\n            this.getToken();\n            this.getToken();\n            this.getToken();\n            while (true) {\n              token = this.getToken();\n              if (token === null || token === 'end') {\n                break;\n              }\n              if (token !== '/') {\n                continue;\n              }\n              var glyph = this.getToken();\n              length = this.readInt();\n              this.getToken();\n              data = stream.makeSubStream(stream.pos, length);\n              lenIV = program.properties.privateData['lenIV'];\n              encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV);\n              stream.skip(length);\n              this.nextChar();\n              token = this.getToken();\n              if (token === 'noaccess') {\n                this.getToken();\n              }\n              charstrings.push({\n                glyph: glyph,\n                encoded: encoded\n              });\n            }\n            break;\n          case 'Subrs':\n            this.readInt();\n            this.getToken();\n            while ((token = this.getToken()) === 'dup') {\n              var index = this.readInt();\n              length = this.readInt();\n              this.getToken();\n              data = stream.makeSubStream(stream.pos, length);\n              lenIV = program.properties.privateData['lenIV'];\n              encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV);\n              stream.skip(length);\n              this.nextChar();\n              token = this.getToken();\n              if (token === 'noaccess') {\n                this.getToken();\n              }\n              subrs[index] = encoded;\n            }\n            break;\n          case 'BlueValues':\n          case 'OtherBlues':\n          case 'FamilyBlues':\n          case 'FamilyOtherBlues':\n            var blueArray = this.readNumberArray();\n            if (blueArray.length > 0 && blueArray.length % 2 === 0 && HINTING_ENABLED) {\n              program.properties.privateData[token] = blueArray;\n            }\n            break;\n          case 'StemSnapH':\n          case 'StemSnapV':\n            program.properties.privateData[token] = this.readNumberArray();\n            break;\n          case 'StdHW':\n          case 'StdVW':\n            program.properties.privateData[token] = this.readNumberArray()[0];\n            break;\n          case 'BlueShift':\n          case 'lenIV':\n          case 'BlueFuzz':\n          case 'BlueScale':\n          case 'LanguageGroup':\n          case 'ExpansionFactor':\n            program.properties.privateData[token] = this.readNumber();\n            break;\n          case 'ForceBold':\n            program.properties.privateData[token] = this.readBoolean();\n            break;\n        }\n      }\n      for (var i = 0; i < charstrings.length; i++) {\n        glyph = charstrings[i].glyph;\n        encoded = charstrings[i].encoded;\n        var charString = new Type1CharString();\n        var error = charString.convert(encoded, subrs, this.seacAnalysisEnabled);\n        var output = charString.output;\n        if (error) {\n          output = [14];\n        }\n        program.charstrings.push({\n          glyphName: glyph,\n          charstring: output,\n          width: charString.width,\n          lsb: charString.lsb,\n          seac: charString.seac\n        });\n      }\n      return program;\n    },\n    extractFontHeader: function Type1Parser_extractFontHeader(properties) {\n      var token;\n      while ((token = this.getToken()) !== null) {\n        if (token !== '/') {\n          continue;\n        }\n        token = this.getToken();\n        switch (token) {\n          case 'FontMatrix':\n            var matrix = this.readNumberArray();\n            properties.fontMatrix = matrix;\n            break;\n          case 'Encoding':\n            var encodingArg = this.getToken();\n            var encoding;\n            if (!/^\\d+$/.test(encodingArg)) {\n              encoding = (0, _encodings.getEncoding)(encodingArg);\n            } else {\n              encoding = [];\n              var size = parseInt(encodingArg, 10) | 0;\n              this.getToken();\n              for (var j = 0; j < size; j++) {\n                token = this.getToken();\n                while (token !== 'dup' && token !== 'def') {\n                  token = this.getToken();\n                  if (token === null) {\n                    return;\n                  }\n                }\n                if (token === 'def') {\n                  break;\n                }\n                var index = this.readInt();\n                this.getToken();\n                var glyph = this.getToken();\n                encoding[index] = glyph;\n                this.getToken();\n              }\n            }\n            properties.builtInEncoding = encoding;\n            break;\n          case 'FontBBox':\n            var fontBBox = this.readNumberArray();\n            properties.ascent = Math.max(fontBBox[3], fontBBox[1]);\n            properties.descent = Math.min(fontBBox[1], fontBBox[3]);\n            properties.ascentScaled = true;\n            break;\n        }\n      }\n    }\n  };\n  return Type1Parser;\n}();\nexports.Type1Parser = Type1Parser;\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar pdfjsVersion = '1.9.426';\nvar pdfjsBuild = '2558a58d';\nvar pdfjsCoreWorker = __w_pdfjs_require__(17);\nexports.WorkerMessageHandler = pdfjsCoreWorker.WorkerMessageHandler;\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nif (typeof PDFJS === 'undefined' || !PDFJS.compatibilityChecked) {\n  var globalScope = typeof window !== 'undefined' && window.Math === Math ? window : typeof global !== 'undefined' && global.Math === Math ? global : typeof self !== 'undefined' && self.Math === Math ? self :  false ? undefined : {};\n  var userAgent = typeof navigator !== 'undefined' && navigator.userAgent || '';\n  var isAndroid = /Android/.test(userAgent);\n  var isAndroidPre3 = /Android\\s[0-2][^\\d]/.test(userAgent);\n  var isAndroidPre5 = /Android\\s[0-4][^\\d]/.test(userAgent);\n  var isChrome = userAgent.indexOf('Chrom') >= 0;\n  var isChromeWithRangeBug = /Chrome\\/(39|40)\\./.test(userAgent);\n  var isIOSChrome = userAgent.indexOf('CriOS') >= 0;\n  var isIE = userAgent.indexOf('Trident') >= 0;\n  var isIOS = /\\b(iPad|iPhone|iPod)(?=;)/.test(userAgent);\n  var isOpera = userAgent.indexOf('Opera') >= 0;\n  var isSafari = /Safari\\//.test(userAgent) && !/(Chrome\\/|Android\\s)/.test(userAgent);\n  var hasDOM = (typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && (typeof document === 'undefined' ? 'undefined' : _typeof(document)) === 'object';\n  if (typeof PDFJS === 'undefined') {\n    globalScope.PDFJS = {};\n  }\n  PDFJS.compatibilityChecked = true;\n  (function checkTypedArrayCompatibility() {\n    if (typeof Uint8Array !== 'undefined') {\n      if (typeof Uint8Array.prototype.subarray === 'undefined') {\n        Uint8Array.prototype.subarray = function subarray(start, end) {\n          return new Uint8Array(this.slice(start, end));\n        };\n        Float32Array.prototype.subarray = function subarray(start, end) {\n          return new Float32Array(this.slice(start, end));\n        };\n      }\n      if (typeof Float64Array === 'undefined') {\n        globalScope.Float64Array = Float32Array;\n      }\n      return;\n    }\n    function subarray(start, end) {\n      return new TypedArray(this.slice(start, end));\n    }\n    function setArrayOffset(array, offset) {\n      if (arguments.length < 2) {\n        offset = 0;\n      }\n      for (var i = 0, n = array.length; i < n; ++i, ++offset) {\n        this[offset] = array[i] & 0xFF;\n      }\n    }\n    function Uint32ArrayView(buffer, length) {\n      this.buffer = buffer;\n      this.byteLength = buffer.length;\n      this.length = length;\n      ensureUint32ArrayViewProps(this.length);\n    }\n    Uint32ArrayView.prototype = Object.create(null);\n    var uint32ArrayViewSetters = 0;\n    function createUint32ArrayProp(index) {\n      return {\n        get: function get() {\n          var buffer = this.buffer,\n              offset = index << 2;\n          return (buffer[offset] | buffer[offset + 1] << 8 | buffer[offset + 2] << 16 | buffer[offset + 3] << 24) >>> 0;\n        },\n        set: function set(value) {\n          var buffer = this.buffer,\n              offset = index << 2;\n          buffer[offset] = value & 255;\n          buffer[offset + 1] = value >> 8 & 255;\n          buffer[offset + 2] = value >> 16 & 255;\n          buffer[offset + 3] = value >>> 24 & 255;\n        }\n      };\n    }\n    function ensureUint32ArrayViewProps(length) {\n      while (uint32ArrayViewSetters < length) {\n        Object.defineProperty(Uint32ArrayView.prototype, uint32ArrayViewSetters, createUint32ArrayProp(uint32ArrayViewSetters));\n        uint32ArrayViewSetters++;\n      }\n    }\n    function TypedArray(arg1) {\n      var result, i, n;\n      if (typeof arg1 === 'number') {\n        result = [];\n        for (i = 0; i < arg1; ++i) {\n          result[i] = 0;\n        }\n      } else if ('slice' in arg1) {\n        result = arg1.slice(0);\n      } else {\n        result = [];\n        for (i = 0, n = arg1.length; i < n; ++i) {\n          result[i] = arg1[i];\n        }\n      }\n      result.subarray = subarray;\n      result.buffer = result;\n      result.byteLength = result.length;\n      result.set = setArrayOffset;\n      if ((typeof arg1 === 'undefined' ? 'undefined' : _typeof(arg1)) === 'object' && arg1.buffer) {\n        result.buffer = arg1.buffer;\n      }\n      return result;\n    }\n    globalScope.Uint8Array = TypedArray;\n    globalScope.Int8Array = TypedArray;\n    globalScope.Int32Array = TypedArray;\n    globalScope.Uint16Array = TypedArray;\n    globalScope.Float32Array = TypedArray;\n    globalScope.Float64Array = TypedArray;\n    globalScope.Uint32Array = function () {\n      if (arguments.length === 3) {\n        if (arguments[1] !== 0) {\n          throw new Error('offset !== 0 is not supported');\n        }\n        return new Uint32ArrayView(arguments[0], arguments[2]);\n      }\n      return TypedArray.apply(this, arguments);\n    };\n  })();\n  (function canvasPixelArrayBuffer() {\n    if (!hasDOM || !window.CanvasPixelArray) {\n      return;\n    }\n    var cpaProto = window.CanvasPixelArray.prototype;\n    if ('buffer' in cpaProto) {\n      return;\n    }\n    Object.defineProperty(cpaProto, 'buffer', {\n      get: function get() {\n        return this;\n      },\n\n      enumerable: false,\n      configurable: true\n    });\n    Object.defineProperty(cpaProto, 'byteLength', {\n      get: function get() {\n        return this.length;\n      },\n\n      enumerable: false,\n      configurable: true\n    });\n  })();\n  (function normalizeURLObject() {\n    if (!globalScope.URL) {\n      globalScope.URL = globalScope.webkitURL;\n    }\n  })();\n  (function checkObjectDefinePropertyCompatibility() {\n    if (typeof Object.defineProperty !== 'undefined') {\n      var definePropertyPossible = true;\n      try {\n        if (hasDOM) {\n          Object.defineProperty(new Image(), 'id', { value: 'test' });\n        }\n        var Test = function Test() {};\n        Test.prototype = {\n          get id() {}\n        };\n        Object.defineProperty(new Test(), 'id', {\n          value: '',\n          configurable: true,\n          enumerable: true,\n          writable: false\n        });\n      } catch (e) {\n        definePropertyPossible = false;\n      }\n      if (definePropertyPossible) {\n        return;\n      }\n    }\n    Object.defineProperty = function objectDefineProperty(obj, name, def) {\n      delete obj[name];\n      if ('get' in def) {\n        obj.__defineGetter__(name, def['get']);\n      }\n      if ('set' in def) {\n        obj.__defineSetter__(name, def['set']);\n      }\n      if ('value' in def) {\n        obj.__defineSetter__(name, function objectDefinePropertySetter(value) {\n          this.__defineGetter__(name, function objectDefinePropertyGetter() {\n            return value;\n          });\n          return value;\n        });\n        obj[name] = def.value;\n      }\n    };\n  })();\n  (function checkXMLHttpRequestResponseCompatibility() {\n    if (typeof XMLHttpRequest === 'undefined') {\n      return;\n    }\n    var xhrPrototype = XMLHttpRequest.prototype;\n    var xhr = new XMLHttpRequest();\n    if (!('overrideMimeType' in xhr)) {\n      Object.defineProperty(xhrPrototype, 'overrideMimeType', {\n        value: function xmlHttpRequestOverrideMimeType(mimeType) {}\n      });\n    }\n    if ('responseType' in xhr) {\n      return;\n    }\n    Object.defineProperty(xhrPrototype, 'responseType', {\n      get: function xmlHttpRequestGetResponseType() {\n        return this._responseType || 'text';\n      },\n      set: function xmlHttpRequestSetResponseType(value) {\n        if (value === 'text' || value === 'arraybuffer') {\n          this._responseType = value;\n          if (value === 'arraybuffer' && typeof this.overrideMimeType === 'function') {\n            this.overrideMimeType('text/plain; charset=x-user-defined');\n          }\n        }\n      }\n    });\n    if (typeof VBArray !== 'undefined') {\n      Object.defineProperty(xhrPrototype, 'response', {\n        get: function xmlHttpRequestResponseGet() {\n          if (this.responseType === 'arraybuffer') {\n            return new Uint8Array(new VBArray(this.responseBody).toArray());\n          }\n          return this.responseText;\n        }\n      });\n      return;\n    }\n    Object.defineProperty(xhrPrototype, 'response', {\n      get: function xmlHttpRequestResponseGet() {\n        if (this.responseType !== 'arraybuffer') {\n          return this.responseText;\n        }\n        var text = this.responseText;\n        var i,\n            n = text.length;\n        var result = new Uint8Array(n);\n        for (i = 0; i < n; ++i) {\n          result[i] = text.charCodeAt(i) & 0xFF;\n        }\n        return result.buffer;\n      }\n    });\n  })();\n  (function checkWindowBtoaCompatibility() {\n    if ('btoa' in globalScope) {\n      return;\n    }\n    var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n    globalScope.btoa = function (chars) {\n      var buffer = '';\n      var i, n;\n      for (i = 0, n = chars.length; i < n; i += 3) {\n        var b1 = chars.charCodeAt(i) & 0xFF;\n        var b2 = chars.charCodeAt(i + 1) & 0xFF;\n        var b3 = chars.charCodeAt(i + 2) & 0xFF;\n        var d1 = b1 >> 2,\n            d2 = (b1 & 3) << 4 | b2 >> 4;\n        var d3 = i + 1 < n ? (b2 & 0xF) << 2 | b3 >> 6 : 64;\n        var d4 = i + 2 < n ? b3 & 0x3F : 64;\n        buffer += digits.charAt(d1) + digits.charAt(d2) + digits.charAt(d3) + digits.charAt(d4);\n      }\n      return buffer;\n    };\n  })();\n  (function checkWindowAtobCompatibility() {\n    if ('atob' in globalScope) {\n      return;\n    }\n    var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n    globalScope.atob = function (input) {\n      input = input.replace(/=+$/, '');\n      if (input.length % 4 === 1) {\n        throw new Error('bad atob input');\n      }\n      for (var bc = 0, bs, buffer, idx = 0, output = ''; buffer = input.charAt(idx++); ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) {\n        buffer = digits.indexOf(buffer);\n      }\n      return output;\n    };\n  })();\n  (function checkFunctionPrototypeBindCompatibility() {\n    if (typeof Function.prototype.bind !== 'undefined') {\n      return;\n    }\n    Function.prototype.bind = function functionPrototypeBind(obj) {\n      var fn = this,\n          headArgs = Array.prototype.slice.call(arguments, 1);\n      var bound = function functionPrototypeBindBound() {\n        var args = headArgs.concat(Array.prototype.slice.call(arguments));\n        return fn.apply(obj, args);\n      };\n      return bound;\n    };\n  })();\n  (function checkDatasetProperty() {\n    if (!hasDOM) {\n      return;\n    }\n    var div = document.createElement('div');\n    if ('dataset' in div) {\n      return;\n    }\n    Object.defineProperty(HTMLElement.prototype, 'dataset', {\n      get: function get() {\n        if (this._dataset) {\n          return this._dataset;\n        }\n        var dataset = {};\n        for (var j = 0, jj = this.attributes.length; j < jj; j++) {\n          var attribute = this.attributes[j];\n          if (attribute.name.substring(0, 5) !== 'data-') {\n            continue;\n          }\n          var key = attribute.name.substring(5).replace(/\\-([a-z])/g, function (all, ch) {\n            return ch.toUpperCase();\n          });\n          dataset[key] = attribute.value;\n        }\n        Object.defineProperty(this, '_dataset', {\n          value: dataset,\n          writable: false,\n          enumerable: false\n        });\n        return dataset;\n      },\n\n      enumerable: true\n    });\n  })();\n  (function checkClassListProperty() {\n    function changeList(element, itemName, add, remove) {\n      var s = element.className || '';\n      var list = s.split(/\\s+/g);\n      if (list[0] === '') {\n        list.shift();\n      }\n      var index = list.indexOf(itemName);\n      if (index < 0 && add) {\n        list.push(itemName);\n      }\n      if (index >= 0 && remove) {\n        list.splice(index, 1);\n      }\n      element.className = list.join(' ');\n      return index >= 0;\n    }\n    if (!hasDOM) {\n      return;\n    }\n    var div = document.createElement('div');\n    if ('classList' in div) {\n      return;\n    }\n    var classListPrototype = {\n      add: function add(name) {\n        changeList(this.element, name, true, false);\n      },\n      contains: function contains(name) {\n        return changeList(this.element, name, false, false);\n      },\n      remove: function remove(name) {\n        changeList(this.element, name, false, true);\n      },\n      toggle: function toggle(name) {\n        changeList(this.element, name, true, true);\n      }\n    };\n    Object.defineProperty(HTMLElement.prototype, 'classList', {\n      get: function get() {\n        if (this._classList) {\n          return this._classList;\n        }\n        var classList = Object.create(classListPrototype, {\n          element: {\n            value: this,\n            writable: false,\n            enumerable: true\n          }\n        });\n        Object.defineProperty(this, '_classList', {\n          value: classList,\n          writable: false,\n          enumerable: false\n        });\n        return classList;\n      },\n\n      enumerable: true\n    });\n  })();\n  (function checkWorkerConsoleCompatibility() {\n    if (typeof importScripts === 'undefined' || 'console' in globalScope) {\n      return;\n    }\n    var consoleTimer = {};\n    var workerConsole = {\n      log: function log() {\n        var args = Array.prototype.slice.call(arguments);\n        globalScope.postMessage({\n          targetName: 'main',\n          action: 'console_log',\n          data: args\n        });\n      },\n      error: function error() {\n        var args = Array.prototype.slice.call(arguments);\n        globalScope.postMessage({\n          targetName: 'main',\n          action: 'console_error',\n          data: args\n        });\n      },\n      time: function time(name) {\n        consoleTimer[name] = Date.now();\n      },\n      timeEnd: function timeEnd(name) {\n        var time = consoleTimer[name];\n        if (!time) {\n          throw new Error('Unknown timer name ' + name);\n        }\n        this.log('Timer:', name, Date.now() - time);\n      }\n    };\n    globalScope.console = workerConsole;\n  })();\n  (function checkConsoleCompatibility() {\n    if (!hasDOM) {\n      return;\n    }\n    if (!('console' in window)) {\n      window.console = {\n        log: function log() {},\n        error: function error() {},\n        warn: function warn() {}\n      };\n      return;\n    }\n    if (!('bind' in console.log)) {\n      console.log = function (fn) {\n        return function (msg) {\n          return fn(msg);\n        };\n      }(console.log);\n      console.error = function (fn) {\n        return function (msg) {\n          return fn(msg);\n        };\n      }(console.error);\n      console.warn = function (fn) {\n        return function (msg) {\n          return fn(msg);\n        };\n      }(console.warn);\n      return;\n    }\n  })();\n  (function checkOnClickCompatibility() {\n    function ignoreIfTargetDisabled(event) {\n      if (isDisabled(event.target)) {\n        event.stopPropagation();\n      }\n    }\n    function isDisabled(node) {\n      return node.disabled || node.parentNode && isDisabled(node.parentNode);\n    }\n    if (isOpera) {\n      document.addEventListener('click', ignoreIfTargetDisabled, true);\n    }\n  })();\n  (function checkOnBlobSupport() {\n    if (isIE || isIOSChrome) {\n      PDFJS.disableCreateObjectURL = true;\n    }\n  })();\n  (function checkNavigatorLanguage() {\n    if (typeof navigator === 'undefined') {\n      return;\n    }\n    if ('language' in navigator) {\n      return;\n    }\n    PDFJS.locale = navigator.userLanguage || 'en-US';\n  })();\n  (function checkRangeRequests() {\n    if (isSafari || isAndroidPre3 || isChromeWithRangeBug || isIOS) {\n      PDFJS.disableRange = true;\n      PDFJS.disableStream = true;\n    }\n  })();\n  (function checkHistoryManipulation() {\n    if (!hasDOM) {\n      return;\n    }\n    if (!history.pushState || isAndroidPre3) {\n      PDFJS.disableHistory = true;\n    }\n  })();\n  (function checkSetPresenceInImageData() {\n    if (!hasDOM) {\n      return;\n    }\n    if (window.CanvasPixelArray) {\n      if (typeof window.CanvasPixelArray.prototype.set !== 'function') {\n        window.CanvasPixelArray.prototype.set = function (arr) {\n          for (var i = 0, ii = this.length; i < ii; i++) {\n            this[i] = arr[i];\n          }\n        };\n      }\n    } else {\n      var polyfill = false,\n          versionMatch;\n      if (isChrome) {\n        versionMatch = userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\n        polyfill = versionMatch && parseInt(versionMatch[2]) < 21;\n      } else if (isAndroid) {\n        polyfill = isAndroidPre5;\n      } else if (isSafari) {\n        versionMatch = userAgent.match(/Version\\/([0-9]+)\\.([0-9]+)\\.([0-9]+) Safari\\//);\n        polyfill = versionMatch && parseInt(versionMatch[1]) < 6;\n      }\n      if (polyfill) {\n        var contextPrototype = window.CanvasRenderingContext2D.prototype;\n        var createImageData = contextPrototype.createImageData;\n        contextPrototype.createImageData = function (w, h) {\n          var imageData = createImageData.call(this, w, h);\n          imageData.data.set = function (arr) {\n            for (var i = 0, ii = this.length; i < ii; i++) {\n              this[i] = arr[i];\n            }\n          };\n          return imageData;\n        };\n        contextPrototype = null;\n      }\n    }\n  })();\n  (function checkRequestAnimationFrame() {\n    function installFakeAnimationFrameFunctions() {\n      window.requestAnimationFrame = function (callback) {\n        return window.setTimeout(callback, 20);\n      };\n      window.cancelAnimationFrame = function (timeoutID) {\n        window.clearTimeout(timeoutID);\n      };\n    }\n    if (!hasDOM) {\n      return;\n    }\n    if (isIOS) {\n      installFakeAnimationFrameFunctions();\n      return;\n    }\n    if ('requestAnimationFrame' in window) {\n      return;\n    }\n    window.requestAnimationFrame = window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame;\n    if (window.requestAnimationFrame) {\n      return;\n    }\n    installFakeAnimationFrameFunctions();\n  })();\n  (function checkCanvasSizeLimitation() {\n    if (isIOS || isAndroid) {\n      PDFJS.maxCanvasPixels = 5242880;\n    }\n  })();\n  (function checkFullscreenSupport() {\n    if (!hasDOM) {\n      return;\n    }\n    if (isIE && window.parent !== window) {\n      PDFJS.disableFullscreen = true;\n    }\n  })();\n  (function checkCurrentScript() {\n    if (!hasDOM) {\n      return;\n    }\n    if ('currentScript' in document) {\n      return;\n    }\n    Object.defineProperty(document, 'currentScript', {\n      get: function get() {\n        var scripts = document.getElementsByTagName('script');\n        return scripts[scripts.length - 1];\n      },\n\n      enumerable: true,\n      configurable: true\n    });\n  })();\n  (function checkInputTypeNumberAssign() {\n    if (!hasDOM) {\n      return;\n    }\n    var el = document.createElement('input');\n    try {\n      el.type = 'number';\n    } catch (ex) {\n      var inputProto = el.constructor.prototype;\n      var typeProperty = Object.getOwnPropertyDescriptor(inputProto, 'type');\n      Object.defineProperty(inputProto, 'type', {\n        get: function get() {\n          return typeProperty.get.call(this);\n        },\n        set: function set(value) {\n          typeProperty.set.call(this, value === 'number' ? 'text' : value);\n        },\n\n        enumerable: true,\n        configurable: true\n      });\n    }\n  })();\n  (function checkDocumentReadyState() {\n    if (!hasDOM) {\n      return;\n    }\n    if (!document.attachEvent) {\n      return;\n    }\n    var documentProto = document.constructor.prototype;\n    var readyStateProto = Object.getOwnPropertyDescriptor(documentProto, 'readyState');\n    Object.defineProperty(documentProto, 'readyState', {\n      get: function get() {\n        var value = readyStateProto.get.call(this);\n        return value === 'interactive' ? 'loading' : value;\n      },\n      set: function set(value) {\n        readyStateProto.set.call(this, value);\n      },\n\n      enumerable: true,\n      configurable: true\n    });\n  })();\n  (function checkChildNodeRemove() {\n    if (!hasDOM) {\n      return;\n    }\n    if (typeof Element.prototype.remove !== 'undefined') {\n      return;\n    }\n    Element.prototype.remove = function () {\n      if (this.parentNode) {\n        this.parentNode.removeChild(this);\n      }\n    };\n  })();\n  (function checkNumberIsNaN() {\n    if (Number.isNaN) {\n      return;\n    }\n    Number.isNaN = function (value) {\n      return typeof value === 'number' && isNaN(value);\n    };\n  })();\n  (function checkNumberIsInteger() {\n    if (Number.isInteger) {\n      return;\n    }\n    Number.isInteger = function (value) {\n      return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;\n    };\n  })();\n  (function checkPromise() {\n    if (globalScope.Promise) {\n      if (typeof globalScope.Promise.all !== 'function') {\n        globalScope.Promise.all = function (iterable) {\n          var count = 0,\n              results = [],\n              resolve,\n              reject;\n          var promise = new globalScope.Promise(function (resolve_, reject_) {\n            resolve = resolve_;\n            reject = reject_;\n          });\n          iterable.forEach(function (p, i) {\n            count++;\n            p.then(function (result) {\n              results[i] = result;\n              count--;\n              if (count === 0) {\n                resolve(results);\n              }\n            }, reject);\n          });\n          if (count === 0) {\n            resolve(results);\n          }\n          return promise;\n        };\n      }\n      if (typeof globalScope.Promise.resolve !== 'function') {\n        globalScope.Promise.resolve = function (value) {\n          return new globalScope.Promise(function (resolve) {\n            resolve(value);\n          });\n        };\n      }\n      if (typeof globalScope.Promise.reject !== 'function') {\n        globalScope.Promise.reject = function (reason) {\n          return new globalScope.Promise(function (resolve, reject) {\n            reject(reason);\n          });\n        };\n      }\n      if (typeof globalScope.Promise.prototype.catch !== 'function') {\n        globalScope.Promise.prototype.catch = function (onReject) {\n          return globalScope.Promise.prototype.then(undefined, onReject);\n        };\n      }\n      return;\n    }\n    var STATUS_PENDING = 0;\n    var STATUS_RESOLVED = 1;\n    var STATUS_REJECTED = 2;\n    var REJECTION_TIMEOUT = 500;\n    var HandlerManager = {\n      handlers: [],\n      running: false,\n      unhandledRejections: [],\n      pendingRejectionCheck: false,\n      scheduleHandlers: function scheduleHandlers(promise) {\n        if (promise._status === STATUS_PENDING) {\n          return;\n        }\n        this.handlers = this.handlers.concat(promise._handlers);\n        promise._handlers = [];\n        if (this.running) {\n          return;\n        }\n        this.running = true;\n        setTimeout(this.runHandlers.bind(this), 0);\n      },\n      runHandlers: function runHandlers() {\n        var RUN_TIMEOUT = 1;\n        var timeoutAt = Date.now() + RUN_TIMEOUT;\n        while (this.handlers.length > 0) {\n          var handler = this.handlers.shift();\n          var nextStatus = handler.thisPromise._status;\n          var nextValue = handler.thisPromise._value;\n          try {\n            if (nextStatus === STATUS_RESOLVED) {\n              if (typeof handler.onResolve === 'function') {\n                nextValue = handler.onResolve(nextValue);\n              }\n            } else if (typeof handler.onReject === 'function') {\n              nextValue = handler.onReject(nextValue);\n              nextStatus = STATUS_RESOLVED;\n              if (handler.thisPromise._unhandledRejection) {\n                this.removeUnhandeledRejection(handler.thisPromise);\n              }\n            }\n          } catch (ex) {\n            nextStatus = STATUS_REJECTED;\n            nextValue = ex;\n          }\n          handler.nextPromise._updateStatus(nextStatus, nextValue);\n          if (Date.now() >= timeoutAt) {\n            break;\n          }\n        }\n        if (this.handlers.length > 0) {\n          setTimeout(this.runHandlers.bind(this), 0);\n          return;\n        }\n        this.running = false;\n      },\n      addUnhandledRejection: function addUnhandledRejection(promise) {\n        this.unhandledRejections.push({\n          promise: promise,\n          time: Date.now()\n        });\n        this.scheduleRejectionCheck();\n      },\n      removeUnhandeledRejection: function removeUnhandeledRejection(promise) {\n        promise._unhandledRejection = false;\n        for (var i = 0; i < this.unhandledRejections.length; i++) {\n          if (this.unhandledRejections[i].promise === promise) {\n            this.unhandledRejections.splice(i);\n            i--;\n          }\n        }\n      },\n      scheduleRejectionCheck: function scheduleRejectionCheck() {\n        var _this = this;\n\n        if (this.pendingRejectionCheck) {\n          return;\n        }\n        this.pendingRejectionCheck = true;\n        setTimeout(function () {\n          _this.pendingRejectionCheck = false;\n          var now = Date.now();\n          for (var i = 0; i < _this.unhandledRejections.length; i++) {\n            if (now - _this.unhandledRejections[i].time > REJECTION_TIMEOUT) {\n              var unhandled = _this.unhandledRejections[i].promise._value;\n              var msg = 'Unhandled rejection: ' + unhandled;\n              if (unhandled.stack) {\n                msg += '\\n' + unhandled.stack;\n              }\n              try {\n                throw new Error(msg);\n              } catch (_) {\n                console.warn(msg);\n              }\n              _this.unhandledRejections.splice(i);\n              i--;\n            }\n          }\n          if (_this.unhandledRejections.length) {\n            _this.scheduleRejectionCheck();\n          }\n        }, REJECTION_TIMEOUT);\n      }\n    };\n    var Promise = function Promise(resolver) {\n      this._status = STATUS_PENDING;\n      this._handlers = [];\n      try {\n        resolver.call(this, this._resolve.bind(this), this._reject.bind(this));\n      } catch (e) {\n        this._reject(e);\n      }\n    };\n    Promise.all = function Promise_all(promises) {\n      var resolveAll, rejectAll;\n      var deferred = new Promise(function (resolve, reject) {\n        resolveAll = resolve;\n        rejectAll = reject;\n      });\n      var unresolved = promises.length;\n      var results = [];\n      if (unresolved === 0) {\n        resolveAll(results);\n        return deferred;\n      }\n      function reject(reason) {\n        if (deferred._status === STATUS_REJECTED) {\n          return;\n        }\n        results = [];\n        rejectAll(reason);\n      }\n      for (var i = 0, ii = promises.length; i < ii; ++i) {\n        var promise = promises[i];\n        var resolve = function (i) {\n          return function (value) {\n            if (deferred._status === STATUS_REJECTED) {\n              return;\n            }\n            results[i] = value;\n            unresolved--;\n            if (unresolved === 0) {\n              resolveAll(results);\n            }\n          };\n        }(i);\n        if (Promise.isPromise(promise)) {\n          promise.then(resolve, reject);\n        } else {\n          resolve(promise);\n        }\n      }\n      return deferred;\n    };\n    Promise.isPromise = function Promise_isPromise(value) {\n      return value && typeof value.then === 'function';\n    };\n    Promise.resolve = function Promise_resolve(value) {\n      return new Promise(function (resolve) {\n        resolve(value);\n      });\n    };\n    Promise.reject = function Promise_reject(reason) {\n      return new Promise(function (resolve, reject) {\n        reject(reason);\n      });\n    };\n    Promise.prototype = {\n      _status: null,\n      _value: null,\n      _handlers: null,\n      _unhandledRejection: null,\n      _updateStatus: function Promise__updateStatus(status, value) {\n        if (this._status === STATUS_RESOLVED || this._status === STATUS_REJECTED) {\n          return;\n        }\n        if (status === STATUS_RESOLVED && Promise.isPromise(value)) {\n          value.then(this._updateStatus.bind(this, STATUS_RESOLVED), this._updateStatus.bind(this, STATUS_REJECTED));\n          return;\n        }\n        this._status = status;\n        this._value = value;\n        if (status === STATUS_REJECTED && this._handlers.length === 0) {\n          this._unhandledRejection = true;\n          HandlerManager.addUnhandledRejection(this);\n        }\n        HandlerManager.scheduleHandlers(this);\n      },\n      _resolve: function Promise_resolve(value) {\n        this._updateStatus(STATUS_RESOLVED, value);\n      },\n      _reject: function Promise_reject(reason) {\n        this._updateStatus(STATUS_REJECTED, reason);\n      },\n      then: function Promise_then(onResolve, onReject) {\n        var nextPromise = new Promise(function (resolve, reject) {\n          this.resolve = resolve;\n          this.reject = reject;\n        });\n        this._handlers.push({\n          thisPromise: this,\n          onResolve: onResolve,\n          onReject: onReject,\n          nextPromise: nextPromise\n        });\n        HandlerManager.scheduleHandlers(this);\n        return nextPromise;\n      },\n      catch: function Promise_catch(onReject) {\n        return this.then(undefined, onReject);\n      }\n    };\n    globalScope.Promise = Promise;\n  })();\n  (function checkWeakMap() {\n    if (globalScope.WeakMap) {\n      return;\n    }\n    var id = 0;\n    function WeakMap() {\n      this.id = '$weakmap' + id++;\n    }\n    WeakMap.prototype = {\n      has: function has(obj) {\n        if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object' && typeof obj !== 'function' || obj === null) {\n          return false;\n        }\n        return !!Object.getOwnPropertyDescriptor(obj, this.id);\n      },\n      get: function get(obj) {\n        return this.has(obj) ? obj[this.id] : undefined;\n      },\n      set: function set(obj, value) {\n        Object.defineProperty(obj, this.id, {\n          value: value,\n          enumerable: false,\n          configurable: true\n        });\n      },\n      delete: function _delete(obj) {\n        delete obj[this.id];\n      }\n    };\n    globalScope.WeakMap = WeakMap;\n  })();\n  (function checkURLConstructor() {\n    var hasWorkingUrl = false;\n    try {\n      if (typeof URL === 'function' && _typeof(URL.prototype) === 'object' && 'origin' in URL.prototype) {\n        var u = new URL('b', 'http://a');\n        u.pathname = 'c%20d';\n        hasWorkingUrl = u.href === 'http://a/c%20d';\n      }\n    } catch (e) {}\n    if (hasWorkingUrl) {\n      return;\n    }\n    var relative = Object.create(null);\n    relative['ftp'] = 21;\n    relative['file'] = 0;\n    relative['gopher'] = 70;\n    relative['http'] = 80;\n    relative['https'] = 443;\n    relative['ws'] = 80;\n    relative['wss'] = 443;\n    var relativePathDotMapping = Object.create(null);\n    relativePathDotMapping['%2e'] = '.';\n    relativePathDotMapping['.%2e'] = '..';\n    relativePathDotMapping['%2e.'] = '..';\n    relativePathDotMapping['%2e%2e'] = '..';\n    function isRelativeScheme(scheme) {\n      return relative[scheme] !== undefined;\n    }\n    function invalid() {\n      clear.call(this);\n      this._isInvalid = true;\n    }\n    function IDNAToASCII(h) {\n      if (h === '') {\n        invalid.call(this);\n      }\n      return h.toLowerCase();\n    }\n    function percentEscape(c) {\n      var unicode = c.charCodeAt(0);\n      if (unicode > 0x20 && unicode < 0x7F && [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) === -1) {\n        return c;\n      }\n      return encodeURIComponent(c);\n    }\n    function percentEscapeQuery(c) {\n      var unicode = c.charCodeAt(0);\n      if (unicode > 0x20 && unicode < 0x7F && [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) === -1) {\n        return c;\n      }\n      return encodeURIComponent(c);\n    }\n    var EOF,\n        ALPHA = /[a-zA-Z]/,\n        ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n    function parse(input, stateOverride, base) {\n      function err(message) {\n        errors.push(message);\n      }\n      var state = stateOverride || 'scheme start',\n          cursor = 0,\n          buffer = '',\n          seenAt = false,\n          seenBracket = false,\n          errors = [];\n      loop: while ((input[cursor - 1] !== EOF || cursor === 0) && !this._isInvalid) {\n        var c = input[cursor];\n        switch (state) {\n          case 'scheme start':\n            if (c && ALPHA.test(c)) {\n              buffer += c.toLowerCase();\n              state = 'scheme';\n            } else if (!stateOverride) {\n              buffer = '';\n              state = 'no scheme';\n              continue;\n            } else {\n              err('Invalid scheme.');\n              break loop;\n            }\n            break;\n          case 'scheme':\n            if (c && ALPHANUMERIC.test(c)) {\n              buffer += c.toLowerCase();\n            } else if (c === ':') {\n              this._scheme = buffer;\n              buffer = '';\n              if (stateOverride) {\n                break loop;\n              }\n              if (isRelativeScheme(this._scheme)) {\n                this._isRelative = true;\n              }\n              if (this._scheme === 'file') {\n                state = 'relative';\n              } else if (this._isRelative && base && base._scheme === this._scheme) {\n                state = 'relative or authority';\n              } else if (this._isRelative) {\n                state = 'authority first slash';\n              } else {\n                state = 'scheme data';\n              }\n            } else if (!stateOverride) {\n              buffer = '';\n              cursor = 0;\n              state = 'no scheme';\n              continue;\n            } else if (c === EOF) {\n              break loop;\n            } else {\n              err('Code point not allowed in scheme: ' + c);\n              break loop;\n            }\n            break;\n          case 'scheme data':\n            if (c === '?') {\n              this._query = '?';\n              state = 'query';\n            } else if (c === '#') {\n              this._fragment = '#';\n              state = 'fragment';\n            } else {\n              if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n                this._schemeData += percentEscape(c);\n              }\n            }\n            break;\n          case 'no scheme':\n            if (!base || !isRelativeScheme(base._scheme)) {\n              err('Missing scheme.');\n              invalid.call(this);\n            } else {\n              state = 'relative';\n              continue;\n            }\n            break;\n          case 'relative or authority':\n            if (c === '/' && input[cursor + 1] === '/') {\n              state = 'authority ignore slashes';\n            } else {\n              err('Expected /, got: ' + c);\n              state = 'relative';\n              continue;\n            }\n            break;\n          case 'relative':\n            this._isRelative = true;\n            if (this._scheme !== 'file') {\n              this._scheme = base._scheme;\n            }\n            if (c === EOF) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._query = base._query;\n              this._username = base._username;\n              this._password = base._password;\n              break loop;\n            } else if (c === '/' || c === '\\\\') {\n              if (c === '\\\\') {\n                err('\\\\ is an invalid code point.');\n              }\n              state = 'relative slash';\n            } else if (c === '?') {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._query = '?';\n              this._username = base._username;\n              this._password = base._password;\n              state = 'query';\n            } else if (c === '#') {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._query = base._query;\n              this._fragment = '#';\n              this._username = base._username;\n              this._password = base._password;\n              state = 'fragment';\n            } else {\n              var nextC = input[cursor + 1];\n              var nextNextC = input[cursor + 2];\n              if (this._scheme !== 'file' || !ALPHA.test(c) || nextC !== ':' && nextC !== '|' || nextNextC !== EOF && nextNextC !== '/' && nextNextC !== '\\\\' && nextNextC !== '?' && nextNextC !== '#') {\n                this._host = base._host;\n                this._port = base._port;\n                this._username = base._username;\n                this._password = base._password;\n                this._path = base._path.slice();\n                this._path.pop();\n              }\n              state = 'relative path';\n              continue;\n            }\n            break;\n          case 'relative slash':\n            if (c === '/' || c === '\\\\') {\n              if (c === '\\\\') {\n                err('\\\\ is an invalid code point.');\n              }\n              if (this._scheme === 'file') {\n                state = 'file host';\n              } else {\n                state = 'authority ignore slashes';\n              }\n            } else {\n              if (this._scheme !== 'file') {\n                this._host = base._host;\n                this._port = base._port;\n                this._username = base._username;\n                this._password = base._password;\n              }\n              state = 'relative path';\n              continue;\n            }\n            break;\n          case 'authority first slash':\n            if (c === '/') {\n              state = 'authority second slash';\n            } else {\n              err('Expected \\'/\\', got: ' + c);\n              state = 'authority ignore slashes';\n              continue;\n            }\n            break;\n          case 'authority second slash':\n            state = 'authority ignore slashes';\n            if (c !== '/') {\n              err('Expected \\'/\\', got: ' + c);\n              continue;\n            }\n            break;\n          case 'authority ignore slashes':\n            if (c !== '/' && c !== '\\\\') {\n              state = 'authority';\n              continue;\n            } else {\n              err('Expected authority, got: ' + c);\n            }\n            break;\n          case 'authority':\n            if (c === '@') {\n              if (seenAt) {\n                err('@ already seen.');\n                buffer += '%40';\n              }\n              seenAt = true;\n              for (var i = 0; i < buffer.length; i++) {\n                var cp = buffer[i];\n                if (cp === '\\t' || cp === '\\n' || cp === '\\r') {\n                  err('Invalid whitespace in authority.');\n                  continue;\n                }\n                if (cp === ':' && this._password === null) {\n                  this._password = '';\n                  continue;\n                }\n                var tempC = percentEscape(cp);\n                if (this._password !== null) {\n                  this._password += tempC;\n                } else {\n                  this._username += tempC;\n                }\n              }\n              buffer = '';\n            } else if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#') {\n              cursor -= buffer.length;\n              buffer = '';\n              state = 'host';\n              continue;\n            } else {\n              buffer += c;\n            }\n            break;\n          case 'file host':\n            if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#') {\n              if (buffer.length === 2 && ALPHA.test(buffer[0]) && (buffer[1] === ':' || buffer[1] === '|')) {\n                state = 'relative path';\n              } else if (buffer.length === 0) {\n                state = 'relative path start';\n              } else {\n                this._host = IDNAToASCII.call(this, buffer);\n                buffer = '';\n                state = 'relative path start';\n              }\n              continue;\n            } else if (c === '\\t' || c === '\\n' || c === '\\r') {\n              err('Invalid whitespace in file host.');\n            } else {\n              buffer += c;\n            }\n            break;\n          case 'host':\n          case 'hostname':\n            if (c === ':' && !seenBracket) {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'port';\n              if (stateOverride === 'hostname') {\n                break loop;\n              }\n            } else if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#') {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n              if (stateOverride) {\n                break loop;\n              }\n              continue;\n            } else if (c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              if (c === '[') {\n                seenBracket = true;\n              } else if (c === ']') {\n                seenBracket = false;\n              }\n              buffer += c;\n            } else {\n              err('Invalid code point in host/hostname: ' + c);\n            }\n            break;\n          case 'port':\n            if (/[0-9]/.test(c)) {\n              buffer += c;\n            } else if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#' || stateOverride) {\n              if (buffer !== '') {\n                var temp = parseInt(buffer, 10);\n                if (temp !== relative[this._scheme]) {\n                  this._port = temp + '';\n                }\n                buffer = '';\n              }\n              if (stateOverride) {\n                break loop;\n              }\n              state = 'relative path start';\n              continue;\n            } else if (c === '\\t' || c === '\\n' || c === '\\r') {\n              err('Invalid code point in port: ' + c);\n            } else {\n              invalid.call(this);\n            }\n            break;\n          case 'relative path start':\n            if (c === '\\\\') {\n              err('\\'\\\\\\' not allowed in path.');\n            }\n            state = 'relative path';\n            if (c !== '/' && c !== '\\\\') {\n              continue;\n            }\n            break;\n          case 'relative path':\n            if (c === EOF || c === '/' || c === '\\\\' || !stateOverride && (c === '?' || c === '#')) {\n              if (c === '\\\\') {\n                err('\\\\ not allowed in relative path.');\n              }\n              var tmp;\n              if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n                buffer = tmp;\n              }\n              if (buffer === '..') {\n                this._path.pop();\n                if (c !== '/' && c !== '\\\\') {\n                  this._path.push('');\n                }\n              } else if (buffer === '.' && c !== '/' && c !== '\\\\') {\n                this._path.push('');\n              } else if (buffer !== '.') {\n                if (this._scheme === 'file' && this._path.length === 0 && buffer.length === 2 && ALPHA.test(buffer[0]) && buffer[1] === '|') {\n                  buffer = buffer[0] + ':';\n                }\n                this._path.push(buffer);\n              }\n              buffer = '';\n              if (c === '?') {\n                this._query = '?';\n                state = 'query';\n              } else if (c === '#') {\n                this._fragment = '#';\n                state = 'fragment';\n              }\n            } else if (c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              buffer += percentEscape(c);\n            }\n            break;\n          case 'query':\n            if (!stateOverride && c === '#') {\n              this._fragment = '#';\n              state = 'fragment';\n            } else if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              this._query += percentEscapeQuery(c);\n            }\n            break;\n          case 'fragment':\n            if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              this._fragment += c;\n            }\n            break;\n        }\n        cursor++;\n      }\n    }\n    function clear() {\n      this._scheme = '';\n      this._schemeData = '';\n      this._username = '';\n      this._password = null;\n      this._host = '';\n      this._port = '';\n      this._path = [];\n      this._query = '';\n      this._fragment = '';\n      this._isInvalid = false;\n      this._isRelative = false;\n    }\n    function JURL(url, base) {\n      if (base !== undefined && !(base instanceof JURL)) {\n        base = new JURL(String(base));\n      }\n      this._url = url;\n      clear.call(this);\n      var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n      parse.call(this, input, null, base);\n    }\n    JURL.prototype = {\n      toString: function toString() {\n        return this.href;\n      },\n\n      get href() {\n        if (this._isInvalid) {\n          return this._url;\n        }\n        var authority = '';\n        if (this._username !== '' || this._password !== null) {\n          authority = this._username + (this._password !== null ? ':' + this._password : '') + '@';\n        }\n        return this.protocol + (this._isRelative ? '//' + authority + this.host : '') + this.pathname + this._query + this._fragment;\n      },\n      set href(value) {\n        clear.call(this);\n        parse.call(this, value);\n      },\n      get protocol() {\n        return this._scheme + ':';\n      },\n      set protocol(value) {\n        if (this._isInvalid) {\n          return;\n        }\n        parse.call(this, value + ':', 'scheme start');\n      },\n      get host() {\n        return this._isInvalid ? '' : this._port ? this._host + ':' + this._port : this._host;\n      },\n      set host(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        parse.call(this, value, 'host');\n      },\n      get hostname() {\n        return this._host;\n      },\n      set hostname(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        parse.call(this, value, 'hostname');\n      },\n      get port() {\n        return this._port;\n      },\n      set port(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        parse.call(this, value, 'port');\n      },\n      get pathname() {\n        return this._isInvalid ? '' : this._isRelative ? '/' + this._path.join('/') : this._schemeData;\n      },\n      set pathname(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        this._path = [];\n        parse.call(this, value, 'relative path start');\n      },\n      get search() {\n        return this._isInvalid || !this._query || this._query === '?' ? '' : this._query;\n      },\n      set search(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        this._query = '?';\n        if (value[0] === '?') {\n          value = value.slice(1);\n        }\n        parse.call(this, value, 'query');\n      },\n      get hash() {\n        return this._isInvalid || !this._fragment || this._fragment === '#' ? '' : this._fragment;\n      },\n      set hash(value) {\n        if (this._isInvalid) {\n          return;\n        }\n        this._fragment = '#';\n        if (value[0] === '#') {\n          value = value.slice(1);\n        }\n        parse.call(this, value, 'fragment');\n      },\n      get origin() {\n        var host;\n        if (this._isInvalid || !this._scheme) {\n          return '';\n        }\n        switch (this._scheme) {\n          case 'data':\n          case 'file':\n          case 'javascript':\n          case 'mailto':\n            return 'null';\n          case 'blob':\n            try {\n              return new JURL(this._schemeData).origin || 'null';\n            } catch (_) {}\n            return 'null';\n        }\n        host = this.host;\n        if (!host) {\n          return '';\n        }\n        return this._scheme + '://' + host;\n      }\n    };\n    var OriginalURL = globalScope.URL;\n    if (OriginalURL) {\n      JURL.createObjectURL = function (blob) {\n        return OriginalURL.createObjectURL.apply(OriginalURL, arguments);\n      };\n      JURL.revokeObjectURL = function (url) {\n        OriginalURL.revokeObjectURL(url);\n      };\n    }\n    globalScope.URL = JURL;\n  })();\n}\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar isReadableStreamSupported = false;\nif (typeof ReadableStream !== 'undefined') {\n  try {\n    new ReadableStream({\n      start: function start(controller) {\n        controller.close();\n      }\n    });\n    isReadableStreamSupported = true;\n  } catch (e) {}\n}\nif (isReadableStreamSupported) {\n  exports.ReadableStream = ReadableStream;\n} else {\n  exports.ReadableStream = __w_pdfjs_require__(18).ReadableStream;\n}\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=pdf.worker.js.map"
  },
  {
    "path": "example/pages/include/verySimpleImageViewer/css/jquery.verySimpleImageViewer.css",
    "content": ".jqvsiv_toolbar {\n\tdisplay: inline-block;\n\tposition: absolute;\n\tright: 3px;\n\ttop: 3px;\n\tz-index: 5;\n}\n.jqvsiv_toolbarButton {\n\tmargin: 0 2px;\n\tcursor: pointer;\n}\n"
  },
  {
    "path": "example/pages/include/verySimpleImageViewer/js/jquery.verySimpleImageViewer.js",
    "content": "\n/**\n * jquery.verySimpleImageViewer.js\n * Ver. : 1.0.0 \n * last update: 28/04/2018\n * Author: meshesha , https://github.com/meshesha\n * LICENSE: MIT\n * url:https://meshesha.github.io/verySimpleImageViewer\n */\n\n(function ($) {\n    $.fn.verySimpleImageViewer = function( options ) {\n        var settings = $.extend(true,{},{\n            // These are the defaults.\n            imageSource: \"\",\n            frame: ['720px','480px',false],\n            maxZoom: '300%',\n            zoomFactor: '10%',\n            mouse: true,\n            keyboard: true,\n            toolbar: true,\n            rotateToolbar: true\n        }, options );\n\n        var imageSource = settings.imageSource;\n        var frame = settings.frame;\n        var maxZoom = settings.maxZoom;\n        var zoomFactor = settings.zoomFactor;\n        var isMouse = settings.mouse;\n        var isKeyboard = settings.keyboard;\n        var isToolbar = settings.toolbar;\n        var rotateToolbar = settings.rotateToolbar;\n\n        var self = this;\n        //var $result = $(this);\n        var parent = $(this)[0];\n        var image = null;\n        var rotateAngle = 0;\n        self.frameElement = null;\n        var orignalW,orignalH, zoomLevel = 0;\n        var lastMousePosition = null, speed = 5;\n        var mouseWheelObject = null;\n\n        console.log(settings)\n\n        /*Methods*/\n        self.getFrameDimension =  function() {\n            return [self.frameElement.clientWidth,self.frameElement.clientHeight];\n        }\t\t\t\t\n        self.setDimension = function(width,height) { //width and height of image\n            image.width=Math.round(width);\n            image.height=Math.round(height);\n        }\n        self.getDimension =  function() {\n            return [image.width,image.height];\n        }\n        self.setPosition = function(x,y) { //x and y coordinate of image\n            image.style.left=(Math.round(x)+'px');\n            image.style.top=(Math.round(y)+'px');\n        }\n        self.getPosition = function() {\n            return [retInt(image.style.left,'px'),retInt(image.style.top,'px')];\n        }\n        self.setMouseCursor = function() {\n            var dimension = self.getDimension();\n            var frameDimension =  self.getFrameDimension();\n            \n            var cursor='crosshair';\n            if(dimension[0]>frameDimension[0] && dimension[1]>frameDimension[1])\n                cursor='move';\n            else if(dimension[0]>frameDimension[0])\n                cursor='e-resize';\n            else if(dimension[1]>frameDimension[1])\n                cursor='n-resize';\n            \n            image.style.cursor=cursor;\n        }\n        self.maxZoomCheck = function(width,height) {\n            if(typeof width=='undefined' || typeof height=='undefined') {\n                var temp = self.getDimension();\n                width=temp[0], height=temp[1];\n            }\n            if(typeof maxZoom=='number') {\n                return ((width/orignalW)>maxZoom || (height/orignalH)>maxZoom);\n            }\n            else if(typeof maxZoom=='object') {\n                return (width>maxZoom[0] || height>maxZoom[1]);\n            }\n        }\n        self.fitToFrame = function(width, height) { //width and height of image\n            if(typeof width=='undefined' || typeof height=='undefined') {\n                width = orignalW, height = orignalH;\n            }\n            var frameDimension = self.getFrameDimension(), newWidth,newHeight;\n            \n            newWidth = frameDimension[0];\n            newHeight = Math.round((newWidth*height)/width);\n            if(newHeight>(frameDimension[1])) {\n                newHeight = frameDimension[1];\n                newWidth = Math.round((newHeight*width)/height); \n            }\n            return [newWidth,newHeight];\n        }\n        self.getZoomLevel = function() {\n            return zoomLevel;\n        }\n        self.zoomTo = function(newZoomLevel, x, y) {\n            var frameDimension = self.getFrameDimension();\n            //check if x and y coordinate is within the self.frameElement\n            if(newZoomLevel<0 || x<0 || y<0 || x>=frameDimension[0] || y>=frameDimension[1])\n                return false;\n            \n            var dimension = self.fitToFrame(orignalW,orignalH);\n            for(var i=newZoomLevel; i>0;i--)\n                dimension[0] *= zoomFactor, dimension[1] *= zoomFactor;\n            \n            //Calculate percentage increase/decrease and fix the image over given x,y coordinate\n            var curWidth=image.width, curHeight=image.height;\n            var position = self.getPosition();\n            \n            position[0]-=((x-position[0])*((dimension[0]/curWidth)-1)), position[1]-=((y-position[1])*((dimension[1]/curHeight)-1)); //Applying the above formula\n            \n            \n            //Center image\n            position = self.centerImage(dimension[0],dimension[1], position[0],position[1]);\n            \n            //Set dimension and position\n            if(!self.maxZoomCheck(dimension[0],dimension[1])) {\n                zoomLevel = newZoomLevel;\n                self.setDimension(dimension[0],dimension[1]);\n                self.setPosition(position[0],position[1]);\n                self.setMouseCursor();\n            }\n            else\n                return false;\n            return true;\n        }\n        self.centerImage = function(width,height, x,y) { //width and height of image and (x,y) is the (left,top) of the image\n            if(typeof width=='undefined' || typeof height=='undefined') {\n                var temp = self.getDimension();\n                width=temp[0], height=temp[1];\n            }\n            if(typeof x=='undefined' || typeof y=='undefined') {\n                var temp = self.getPosition();\n                x=temp[0], y=temp[1];\n            }\n                \n            var frameDimension = self.getFrameDimension();\n            \n            if(width<=frameDimension[0])\n                x = Math.round((frameDimension[0] - width)/2);\n            if(height<=frameDimension[1])\n                y = Math.round((frameDimension[1] - height)/2);\n\n            if(width>frameDimension[0]) {\n                if(x>0)\n                    x=0;\n                else\n                if((x+width)<frameDimension[0])\n                    x=frameDimension[0]-width;\n            }\n\n            if(height>frameDimension[1]) {\n                if(y>0)\n                    y=0;\n                else\n                if((y+height)<frameDimension[1])\n                    y=frameDimension[1]-height;\n            }\n\n            return [x,y];\n        }\n        self.rotate = function(direction,reset){\n            if(direction == \"1\"){\n                rotateAngle += 90;\n            }else{\n                rotateAngle -= 90;\n            }\n            //console.log(self.frameElement)\n            if(reset){\n                $(\".\" + self.frameElement.className +\" .jqvsiv_main_image_content\").css('transform','rotate(0deg)');\n            }else{\n                $(\".\" + self.frameElement.className +\" .jqvsiv_main_image_content\").css('transform','rotate(' + rotateAngle + 'deg)');\n\n                //need to reset mous position and direction - TODO\n                \n            }\n        }\n        self.reset = function() {\n            var dimension = self.fitToFrame(orignalW,orignalH);\n            var position = self.centerImage(dimension[0],dimension[1], 0,0);\n            self.setDimension(dimension[0],dimension[1]);\n            self.setPosition(position[0],position[1]);\n            zoomLevel = 0;\n            self.rotate(\"1\",true);\n        }\n        \n        /*Event handlers*/\n        self.onmousewheel = function(event,object,direction) {\n            self.frameElement.focus();\n            if (!event){ //For IE\n                event = window.event, event.returnValue = false;\n            }else if (event.preventDefault){\n                event.preventDefault();\n            }\n\n            if((zoomLevel+direction)>=0) {\n                var mousePos = getMouseXY(event);\n                var framePos = getObjectXY(self.frameElement);\n                self.zoomTo(zoomLevel+direction, mousePos[0]-framePos[0], mousePos[1]-framePos[1]);\n            }\n        }\n        self.onmousemove = function(event) {\n            if (!event){ //For IE\n                event = window.event, event.returnValue = false;\n            }else if (event.preventDefault){\n                event.preventDefault();\n            }\n            \n            var mousePosition = getMouseXY(event);\n            var position = self.getPosition();\n            position[0] += (mousePosition[0]-lastMousePosition[0]), position[1]+=(mousePosition[1]-lastMousePosition[1]);\n            lastMousePosition = mousePosition;\n            \n            position = self.centerImage(image.width,image.height, position[0],position[1]);\n            self.setPosition(position[0],position[1]);\n        }\n        self.onmouseup_or_out = function(event) {\n            if (!event){ //For IE\n                event = window.event, event.returnValue = false;\n            }else if (event.preventDefault){\n                event.preventDefault();\n            }\n            \n            image.onmousemove = image.onmouseup=image.onmouseout=null;\n            image.onmousedown = self.onmousedown;\n        }\n        self.onmousedown =  function(event) {\n            self.frameElement.focus();\n            if (!event){ //For IE\n                event = window.event, event.returnValue = false;\n            }else if (event.preventDefault){\n                event.preventDefault();\n            }\n\n            lastMousePosition = getMouseXY(event);\n            image.onmousemove = self.onmousemove;\n            image.onmouseup = image.onmouseout=self.onmouseup_or_out;\n        }\n        self.onkeypress = function(event) {\n            var keyCode;\n            if(window.event){ // IE\n                event = window.event, keyCode = event.keyCode, event.returnValue = false;\n            }else if(event.which){\n                keyCode = event.which, event.preventDefault();\n            }\n            keyCode = String.fromCharCode(keyCode);\n            \n            var position = self.getPosition();\n            var LEFT='a',UP='w',RIGHT='d',DOWN='s', CENTER_IMAGE='c', ZOOMIN='=', ZOOMOUT='-'; ///Keys a,w,d,s\n            if(keyCode == LEFT){\n                position[0]+=speed;\n            }else if(keyCode == UP){\n                position[1] += speed;\n            }else if(keyCode == RIGHT){\n                position[0] -= speed;\n            }else if(keyCode==DOWN){\n                position[1] -= speed;\n            }else if(keyCode == CENTER_IMAGE || keyCode == 'C'){\n                self.reset();\n            }else if(keyCode == ZOOMIN || keyCode == '+' || keyCode == 'x' || keyCode == 'X'){\n                self.zoomTo(zoomLevel+1, self.frameElement.clientWidth/2, self.frameElement.clientHeight/2);\n            }else if( (keyCode == ZOOMOUT || keyCode == 'z' || keyCode == 'Z') && zoomLevel > 0){\n                self.zoomTo(zoomLevel-1, self.frameElement.clientWidth/2, self.frameElement.clientHeight/2);\n            }\n            if(keyCode == LEFT || keyCode == UP || keyCode == RIGHT || keyCode == DOWN) {\n                position = self.centerImage(image.width,image.height, position[0],position[1]);\n                self.setPosition(position[0],position[1]);\n                speed += 2;\n            }\n        }\n        self.onkeyup = function(event) {\n            speed = 5;\n        }\n        /*Initializaion*/\n        self.setZoomProp = function(newZoomFactor,newMaxZoom) {\n            if(newZoomFactor == null){\n                zoomFactor = 10;\n            }\n            zoomFactor = 1 + retInt(newZoomFactor,'%')/100;\n            \n            if(typeof newMaxZoom == 'string'){\n                maxZoom = retInt(newMaxZoom,'%')/100;\n            }else if(typeof newMaxZoom == 'object' && newMaxZoom != null) {\n                maxZoom[0] = retInt(newMaxZoom[0],'px');\n                maxZoom[1] = retInt(newMaxZoom[1],'px');\n            }else{\n                maxZoom = '300%';\n            } \n        }\n\n        self.initImage = function() {\n            image.style.maxWidth=image.style.width=image.style.maxHeight=image.style.height=null;\n            orignalW=image.width;\n            orignalH=image.height;\n            \n            var dimension = self.fitToFrame(orignalW, orignalH);\n            self.setDimension(dimension[0],dimension[1]);\n            \n            if(frame[2] == true)\n                self.frameElement.style.width = (Math.round(dimension[0])+ 'px');\n            if(frame[3] == true)\n                self.frameElement.style.height = (Math.round(dimension[1]) + 'px');\n            \n            var pos = self.centerImage(dimension[0],dimension[1], 0,0);\n            self.setPosition(pos[0],pos[1]);\n            self.setMouseCursor();\n            \n            //Set mouse handlers\n            if(isMouse){\n                mouseWheelObject = new mouseWheel();\n                mouseWheelObject.init(image, self.onmousewheel);\n                image.onmousedown = self.onmousedown;\n            }\n            //Set keyboard handlers\n            if(isKeyboard){\n                self.frameElement.onkeypress = self.onkeypress;\n                self.frameElement.onkeyup = self.onkeyup;\n            }\n            //Set toolbar handlers\n            if(isToolbar){\n                self.loadToolbar(self);\n            }\n        }\n\n        /*Set a base*/\n        self.setZoomProp(zoomFactor,maxZoom);\n        //Create self.frameElement - One time initialization\n        self.frameElement = document.createElement('div');\n        self.frameElement.className = 'image_viewer_inner_container';\n        self.frameElement.style.width = frame[0];\n        self.frameElement.style.height = frame[1];\n        self.frameElement.style.border=\"0px solid #000\";\n        self.frameElement.style.margin=\"0px\";\n        self.frameElement.style.padding=\"0px\";\n        self.frameElement.style.overflow=\"hidden\";\n        self.frameElement.style.position=\"relative\";\n        self.frameElement.style.zIndex=2;\n        self.frameElement.tabIndex=1;\n                \n        if(image!=null) {\n            if (parent != null) {\n                image.parentNode.removeChild(image);\n                parent.appendChild(self.frameElement);\n            }else{\n                image.parentNode.replaceChild(self.frameElement,image);\n            }\n            \n            image.style.margin=image.style.padding=\"0\";\n            image.style.borderWidth=\"0px\";\n            image.style.position='absolute';\n            image.style.zIndex=3;\n            self.frameElement.appendChild(image);\n            \n            //if(imageSource!=null)\n            //\tself.preInitImage();\n            //else\n            //\tself.initImage();\n        }else {\t\t\n            if(parent!=null)\n                parent.appendChild(self.frameElement);\n            \n            var div_imge_container = document.createElement('div');\n            div_imge_container.className = 'jqvsiv_main_image_content';\n\n            image = document.createElement('img');\n            image.className = 'image_container';\n            image.style.position='absolute';\n            image.style.zIndex=3;\n\n            div_imge_container.appendChild(image);\n\n            self.frameElement.appendChild(div_imge_container);\n            \n            image.onload = self.initImage;\n            image.src = imageSource;\n        }\n        //Toolbar\n        self.loadToolbar = function(self) {\n            //var toolbarImages=\"./images/toolbar\";\n            var toolbar = document.createElement('div');\n            toolbar.className='jqvsiv_toolbar';\n            \n            var isEnterKey = function(event) {\n                var keyCode;\n                if(event.keyCode){ // IE\n                    keyCode = event.keyCode, event.returnValue = false;\n                }else if(event.which){\n                    keyCode = event.which, event.preventDefault();\n                }\n\n                return keyCode == 13;\n            }\n            \n            var zoomIn = document.createElement('img');\n            zoomIn.className='jqvsiv_toolbarButton';\n            zoomIn.title='Zoom in';\n            zoomIn.tabIndex=\"1\";\n            zoomIn.src = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABN0lEQVRIic3WMW6DMBQGYN+EqhGJJYZMvUMHpByAKceIKpYuGUqmLjFESIm6pQORgpSJwNYoYsiQsSfB9utSUBKZYgcs1dI/4s+8Z2NQf54MMUnzAUk5Jil0kd+58v48GSJM0ryriQXJUZcrF70J0rh6wCSF/wVYfgaWn+kBRusjUMaBMg72at89MN6eoBxOGIPpRXqBhxdfCmkFyCC1wGh9hPH2VOXt67sCprsDOGFcxV4maoDlZ0AZB9lRUAZ4ttEL9NxAWK7aEtmr/VUZprtDbYme3z9re/Jnk00vqh50wljYZFEukcZdVCIqwCUitU1NL1IGSkT6HNjLBArKoKDsquZNUfuazjbQcwPpydWBm8ZrAVSRu69MGcSYBLzVpd+EGO7ijNr+togQYxJww12cH18/nn4Aw1rF5Pti/U4AAAAASUVORK5CYII=\";//toolbarImages+'/in.png';\n            zoomIn.onclick = zoomIn.onkeypress = function(event) {\n                event=event?event:window.event;\n                if (event.type == 'keypress') \n                    if(!isEnterKey(event))\n                        return;\n                var frameDimension = self.getFrameDimension();\n                self.zoomTo(self.getZoomLevel()+1, frameDimension[0]/2,frameDimension[1]/2);\n            }\n            \n            var zoomOut = document.createElement('img');\n            zoomOut.className='jqvsiv_toolbarButton';\n            zoomOut.title='Zoom out';\n            zoomOut.tabIndex=\"1\";\n            zoomOut.src = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAA3klEQVRIiWNQm7FPX2PmgbPqMw/805h54D81MNSss2oz9ukzaMw8cJZaBmPBZxmo6XJsPmGgoev/a8w88H/UglELaGiB/+rT/xO3XCQK+68+TZoF2rMO/v/z999/YsHvP3//a/Rtoq0FyrWz/6v2biQ+iHwWHfgfPW8rUdhj8pr/CtWz/itUz8KwBG8kq/ZsgGskBSNbQjAVUWoJUcmUEkuIzgfkWkJSRiPHEpJzMqmWkFVUkGIJ2VUmMZbIV87+R1GlT8gS+do5VxkobbZgs0S+cvY/+do5V5WalpgCAJUZolx/yaTFAAAAAElFTkSuQmCC\";//toolbarImages+'/out.png';\n            zoomOut.onclick = zoomOut.onkeypress = function(event) {\n                event=event?event:window.event;\n                if (event.type == 'keypress') \n                    if(!isEnterKey(event))\n                        return;\n                \n                var frameDimension = self.getFrameDimension();\n                self.zoomTo(self.getZoomLevel()-1, frameDimension[0]/2,frameDimension[1]/2);\n            }\n            \n            var center = document.createElement('img');\n            center.className='jqvsiv_toolbarButton';\n            center.title='Center image';\n            center.tabIndex=\"1\";\n            center.src = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABmklEQVRIic3WvWrCUBQH8LyJomiCQwO+Q7u0bl0FX0MsqCA6CEIXa+LXJqhQQUEc2pBqEWkJlXQrzSA6VKEfLkUo5t+hNURNNNEUeuGMOb+bc8/hXsKd4WiK4QWS4WWK4WFF/OYS3BmOJiiGF6xKrBECYeXOtf6E+MPdg2J4/H+AzrURaPStBU4q9/AWOqBzbXSGr5jLMvzVrnVAU5rg4eUD3dEbAODmaQgynIcrVd8f8LA8prMvLNbt8whkOA97iIU9xK4hpoHTSwHqJQzG8ESLCrCKmAaSPUlJ/v45Q0OUcHheXQLUiGkgci0i3urBl67BcZZdS7yKbAU87E9Zkj0JEe4R1AUHZ6y0MbE6dIHjyh2a0mTpQOOtHpyxkilEF/AWOuiPp0sH6kvXYA+xphBdgM61lT5fHKi65kYRTWAxoYs+FwZjNERp7WMjiCYQaPQxl2VlQj3RIo40WtEIolsif7W7NKGbYhOysU1dqbrhdtRDts7BvoihK3NXxBbMyoYv/V0QR6IsEmaeLUYRWzArOxJlkUxfHXwDNFegvBR/iaAAAAAASUVORK5CYII=\";//toolbarImages+'/center.png';\n            center.onclick = center.onkeypress = function(event) {\n                event=event?event:window.event;\n                if (event.type == 'keypress') \n                    if(!isEnterKey(event))\n                        return;\n                self.reset();\n            }\n            //self.rotate = function(direction)\n            if(rotateToolbar){\n                var rotateRight = document.createElement('img');\n                rotateRight.className='jqvsiv_toolbarButton';\n                rotateRight.title='Center image';\n                rotateRight.tabIndex=\"1\";\n                rotateRight.src = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAB1ElEQVRIieXWwUvbYBjH8fwndRW7CoID3Wn3nYSdxIviQQa7bHdp62GIXvTiEBpTqUyZssKglk4UtJlawUmKshUtgtV6kMEs2m2lmpjvLrbM2TdrY3Yy8FwS+H3e503e943kCa60emVVeyirpldWcaKuszRPcKVV8sqq5lRwldIkJ0derRPpP44er6xyj4BXS2mKuoGcOuLR5KqzwJO3G6znTjEB48rk16XOSDLjDPBi4Quiq2k0ejegL75TCTvOFzCBC8Pg8PScrlCM2a1deiMb9oGD/E8A3iRSdIfjZL+f44+u4fYr9E4tVHCPRSdC4FlkC4CzYonGgEKDb+JGuf0KZ8USAB3jH4TTJQReLn0FYDN7ciu8XJvZEwCezyzS4JuoigiBnvltAHL5ghDI5QsAPB2LVO79jQiBFuUTPy50ALrD8VvhPeGPAJR0gwf+m8/+RCxf8nByH66//YFYkvbhadqGphmIJbkyTQB80bWq3ZURS6BZVpn6nBGug/daRjh9ZeTfKzmYoG9OZXnviOKlTkk3SOW+0anMW4aXq7a9KJigcfBdTYH2gDsg9W3XNpD6j8w6EFe/Yto79GtEXIFQWrL922KBuPoV0xUIpd2vZx7/Bh7Ty4bjzETnAAAAAElFTkSuQmCC\";\n                rotateRight.onclick = rotateRight.onkeypress = function(event) {\n                    event=event?event:window.event;\n                    if (event.type == 'keypress') \n                        if(!isEnterKey(event))\n                            return;\n                    \n                    //var frameDimension = self.getFrameDimension();\n                    self.rotate(\"1\");\n                }\n                var rotateLeft = document.createElement('img');\n                rotateLeft.className='jqvsiv_toolbarButton';\n                rotateLeft.title='Center image';\n                rotateLeft.tabIndex=\"1\";\n                rotateLeft.src = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACQklEQVRIie3W3U9SYRwH8POfcEDj0Mtcq7XVP9BVra2tyy5aba1/wQOI2dxq3rQSeQ4qIdiLthZtNcSXc0wj8zgQCSEqmHOYLwnMCBU559uFwxREXoK7nu13+/38nme/59lDMcaRJjXhvYxJkDREQC2KMQmSmvBexjjSRKkJ761VcH6pCe+latn5YTuh6hWeq/9AbYBbb+cwubi+ubG9s5PYykhDkVVcfzP7b8BxIuDSgAjiXQAABJZ+Sh3DIh7xHoRX4llJlmFyzy9UDVwZFAEAsY10+pkYRKO+G+fv9+NMex9UWjN63X7IMnB74H2gKuCO04/cevc5Aprl8NLzBR3DImiWg0prxtfVBJyBKBru2T9WDOgmwsup7Qx6Pvhx4UF/AUCzHCxuP+K/N0GzXFGkKHCKjKcbW3vDuTCa5fB0Oojp6A+cbbeBZjn0TQX2AJrl0NBmK0COnCLGOBpX6syLuYATrRY8nwnhKnFA3dKDWOIXnIEo9jeRj5QcU+axK3bTNpRSac17Icf03XgxE0JWknHx4eABYBf5e1wlgRuvxVhWkhBaXgc34YN1KoDIWhKZrAStY7IgPB8p66Jds7jmHL5v+L6WxFIyhaH5KC53vioavh8pC2CIICvb7J9KBR5WZb9FjGlcUhmsYt2AXWQsSxusnroBGiJAY+IzSoN1tmyAIYJcKcJ0jW0pW574S4UrWCJRDBF8Fe+CCGC6+LRCbwkeCTRzQepkp+t01d8W02hKqTv4nOQ6VzRzQdVd+7k/U9So5+j1RlYAAAAASUVORK5CYII=\";\n                rotateLeft.onclick = rotateLeft.onkeypress = function(event) {\n                    event=event?event:window.event;\n                    if (event.type == 'keypress') \n                        if(!isEnterKey(event))\n                            return;\n                    \n                    //var frameDimension = self.getFrameDimension();\n                    self.rotate(\"-1\");\n                }\n            }\n            toolbar.appendChild(zoomIn);\n            toolbar.appendChild(zoomOut);\n            if(rotateToolbar){\n                toolbar.appendChild(rotateRight);\n                toolbar.appendChild(rotateLeft);\n            }\n            toolbar.appendChild(center);\n            \n            self.frameElement.appendChild(toolbar);\n        }\n    }\n    function getObjectXY(object) {\n        var left,top;\n        objectCopy=object;\n        if (object.offsetParent) {\n            left=top=0;\n            do {\n                left += object.offsetLeft;\n                if(object.style.borderLeftWidth!='')\n                    left+=parseInt(object.style.borderLeftWidth);\n                else\n                    object.style.borderLeftWidth='0px';\n                top += object.offsetTop;\n                if(object.style.borderTopWidth!='')\n                    top+=parseInt(object.style.borderTopWidth);\n                else\n                    object.style.borderTopWidth='0px';\n            }\n            while (object = object.offsetParent);\n        }\n        return [left-parseInt(objectCopy.style.borderLeftWidth),top-parseInt(objectCopy.style.borderLeftWidth)];\n    }\n    \n    function retInt(str, suffix) {\n        if(typeof str=='number')\n            return str;\n        var result=str.indexOf(suffix);\n        return parseInt(str.substring(0,(result!=-1)?result:str.length))\n    }\n    \n    /*Mouse related functions*/\n    //Used to retrieve the mouse cursor position on screen (but event is needed as argument)\n    function getMouseXY(event) {\n        var posx = 0, posy = 0;\n        if (!event) event = window.event;\t//firefox\n        if (event.pageX || event.pageY) {\n            posx = event.pageX;\n            posy = event.pageY;\n        }\n        else if (event.clientX || event.clientY) {\t//IE\n            posx = event.clientX + document.body.scrollLeft\n                + document.documentElement.scrollLeft;\n            posy = event.clientY + document.body.scrollTop\n                + document.documentElement.scrollTop;\n        }\n        return [posx,posy];\n    }\n    \n    function mouseWheel() {\n        var self=this;\n        /*Event handlers*/\n        /*Mouse wheel functions*/\n    \n        //Default mouse wheel callback function\n        //Variable local to 'this'\n        var wheelCallback = function(event,object,delta){\n            /*Override this function and write your code there*/\n            /*\n                delta=-1 when mouse wheel is rolled backwards (towards yourself)\n                delta=1 when mouse wheel is rolled forward (away from one's self)\n                Note: Here is where you can call the getMouseXY function using the 'event' argument\n            */\n        }\n        //Mouse wheel event handler\n        self.wheelHandler = function (event){\n            var delta = 0;\n            if (!event) //For IE\n                event = window.event;\n            if (event.wheelDelta) \t//IE\n            {\n                delta = event.wheelDelta/120;\n                //if (window.opera) delta = -delta; //for Opera...hmm I read somewhere opera 9 need the delta sign inverted...tried in opera 10 and it doesnt require this!?\n            }\n            else if (event.detail) //firefox\n                delta = -event.detail/3;\n    \n            if (event.preventDefault)\n                event.preventDefault();\n            event.returnValue = false;\n            if (delta)\n                wheelCallback(event,this,delta);\t//callback function\n        }\n        //Mouse wheel initialization\n        self.init = function(object,callback) {\n            if (object.addEventListener) //For firefox\n                object.addEventListener('DOMMouseScroll', this.wheelHandler, false); //Mouse wheel initialization\n            //For IE\n            object.onmousewheel = this.wheelHandler; //Mouse wheel initialization\n            wheelCallback=callback;\n        }\n        this.setCallback = function(callback){\n            wheelCallback=callback;\n        }\n    }\n}(jQuery));\n"
  },
  {
    "path": "example/pages/index.html",
    "content": ""
  },
  {
    "path": "example/pages/lang.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>OfficeJs | Docs</title>\n    <meta charset=\"utf-8\" />\n    <link\n      href=\"../layout/styles/layout.css\"\n      rel=\"stylesheet\"\n      type=\"text/css\"\n      media=\"all\"\n    />\n    <link\n      rel=\"stylesheet\"\n      href=\"//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css\"\n    />\n    <script src=\"//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js\"></script>\n    <script>\n      hljs.initHighlightingOnLoad();\n    </script>\n    <style>\n      .p_heads_1 {\n        font-size: 18px;\n        color: rgb(4, 0, 255);\n      }\n      .p_heads_2 {\n        font-size: 16px;\n        color: rgb(63, 60, 253);\n      }\n      .p_heads_3 {\n        font-size: 14px;\n        color: rgb(98, 95, 255);\n      }\n    </style>\n  </head>\n  <body id=\"top\">\n    <div class=\"wrapper row1\">\n      <header id=\"header\" class=\"hoc clear\">\n        <div id=\"logo\" class=\"fl_left\">\n          <h1><a href=\"../index.html\">Office To Html - Docs</a></h1>\n        </div>\n        <nav id=\"mainav\" class=\"fl_right\">\n          <ul class=\"clear\">\n            <li><a href=\"../index.html\">Home</a></li>\n            <li class=\"active\"><a href=\"docs.html\">Docs</a></li>\n            <li><a href=\"demos.html\">Demos</a></li>\n            <li>\n              <a href=\"https://github.com/meshesha/officeToHtml\">GitHub</a>\n            </li>\n            <li><a href=\"https://github.com/meshesha\">About</a></li>\n          </ul>\n        </nav>\n      </header>\n    </div>\n    <div class=\"wrapper row3\">\n      <main class=\"hoc container clear\">\n        <!-- main body -->\n        <!-- ################################################################################################ -->\n        <!-- using html encode (https://codebeautify.org/html-encode-string) -->\n        <div class=\"content three_quarter\">\n          <div class=\"box bg-light clear\">\n            <h3 class=\"font-x2\" id=\"head-name\">PDF Viewer supported languages</h3>\n            <div id=\"description\">\n              <style type=\"text/css\">\n                /*the tables genereted by web-site: https://www.tablesgenerator.com/html_tables */\n                .tg {\n                  border-collapse: collapse;\n                  border-spacing: 0;\n                }\n                .tg td {\n                  font-family: Arial, sans-serif;\n                  font-size: 14px;\n                  padding: 10px 5px;\n                  border-style: solid;\n                  border-width: 1px;\n                  overflow: hidden;\n                  word-break: normal;\n                  border-color: black;\n                }\n                .tg th {\n                  font-family: Arial, sans-serif;\n                  font-size: 14px;\n                  font-weight: normal;\n                  padding: 10px 5px;\n                  border-style: solid;\n                  border-width: 1px;\n                  overflow: hidden;\n                  word-break: normal;\n                  border-color: black;\n                }\n                .tg .tg-jc4p {\n                  font-size: 16px;\n                  background-color: #00009b;\n                  color: #ffffff;\n                  vertical-align: top;\n                }\n                .tg .tg-yw4l {\n                  vertical-align: top;\n                }\n              </style>\n              <table class=\"tg\">\n                <tr>\n                  <th class=\"tg-jc4p\">#</th>\n                  <th class=\"tg-jc4p\">lang code</th>\n                  <th class=\"tg-jc4p\">lang name</th>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">1</td>\n                  <td class=\"tg-yw4l\">ach</td>\n                  <td class=\"tg-yw4l\">Acoli</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">2</td>\n                   <td class=\"tg-yw4l\">af</td>\n                   <td class=\"tg-yw4l\">Afrikaans</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">3</td>\n                   <td class=\"tg-yw4l\">ak</td>\n                   <td class=\"tg-yw4l\">Afrikaans (South Africa)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">4</td>\n                   <td class=\"tg-yw4l\">an</td>\n                   <td class=\"tg-yw4l\">Afrikaans (South Africa)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">5</td>\n                   <td class=\"tg-yw4l\">ar</td>\n                   <td class=\"tg-yw4l\">Arabic</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">6</td>\n                   <td class=\"tg-yw4l\">as</td>\n                   <td class=\"tg-yw4l\">Arabic (Yemen)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">7</td>\n                   <td class=\"tg-yw4l\">ast</td>\n                   <td class=\"tg-yw4l\">Arabic (Yemen)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">8</td>\n                   <td class=\"tg-yw4l\">az</td>\n                   <td class=\"tg-yw4l\">Azeri (Latin)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">9</td>\n                   <td class=\"tg-yw4l\">be</td>\n                   <td class=\"tg-yw4l\">Belarusian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">10</td>\n                   <td class=\"tg-yw4l\">bg</td>\n                   <td class=\"tg-yw4l\">Bulgarian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">11</td>\n                   <td class=\"tg-yw4l\">bn-BD</td>\n                   <td class=\"tg-yw4l\">Bulgarian (Bulgaria)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">12</td>\n                   <td class=\"tg-yw4l\">bn-IN</td>\n                   <td class=\"tg-yw4l\">Bulgarian (Bulgaria)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">13</td>\n                   <td class=\"tg-yw4l\">br</td>\n                   <td class=\"tg-yw4l\">Bulgarian (Bulgaria)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">14</td>\n                   <td class=\"tg-yw4l\">bs</td>\n                   <td class=\"tg-yw4l\">Bulgarian (Bulgaria)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">15</td>\n                   <td class=\"tg-yw4l\">ca</td>\n                   <td class=\"tg-yw4l\">Catalan</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">16</td>\n                   <td class=\"tg-yw4l\">cs</td>\n                   <td class=\"tg-yw4l\">Czech</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">17</td>\n                   <td class=\"tg-yw4l\">csb</td>\n                   <td class=\"tg-yw4l\">Czech</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">18</td>\n                   <td class=\"tg-yw4l\">cy</td>\n                   <td class=\"tg-yw4l\">Welsh</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">19</td>\n                   <td class=\"tg-yw4l\">da</td>\n                   <td class=\"tg-yw4l\">Danish</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">20</td>\n                   <td class=\"tg-yw4l\">de</td>\n                   <td class=\"tg-yw4l\">German</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">21</td>\n                   <td class=\"tg-yw4l\">el</td>\n                   <td class=\"tg-yw4l\">Greek</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">22</td>\n                   <td class=\"tg-yw4l\">en-GB</td>\n                   <td class=\"tg-yw4l\">English (United Kingdom)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">23</td>\n                   <td class=\"tg-yw4l\">en-US</td>\n                   <td class=\"tg-yw4l\">English (United States)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">24</td>\n                   <td class=\"tg-yw4l\">en-ZA</td>\n                   <td class=\"tg-yw4l\">English (South Africa)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">25</td>\n                   <td class=\"tg-yw4l\">eo</td>\n                   <td class=\"tg-yw4l\">Esperanto</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">26</td>\n                   <td class=\"tg-yw4l\">es-AR</td>\n                   <td class=\"tg-yw4l\">Spanish (Argentina)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">27</td>\n                   <td class=\"tg-yw4l\">es-CL</td>\n                   <td class=\"tg-yw4l\">Spanish (Chile)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">28</td>\n                   <td class=\"tg-yw4l\">es-ES</td>\n                   <td class=\"tg-yw4l\">Spanish (Spain)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">29</td>\n                   <td class=\"tg-yw4l\">es-MX</td>\n                   <td class=\"tg-yw4l\">Spanish (Mexico)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">30</td>\n                   <td class=\"tg-yw4l\">et</td>\n                   <td class=\"tg-yw4l\">Estonian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">31</td>\n                   <td class=\"tg-yw4l\">eu</td>\n                   <td class=\"tg-yw4l\">Basque</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">32</td>\n                   <td class=\"tg-yw4l\">fa</td>\n                   <td class=\"tg-yw4l\">Farsi</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">33</td>\n                   <td class=\"tg-yw4l\">ff</td>\n                   <td class=\"tg-yw4l\">Farsi (Iran)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">34</td>\n                   <td class=\"tg-yw4l\">fi</td>\n                   <td class=\"tg-yw4l\">Finnish</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">35</td>\n                   <td class=\"tg-yw4l\">fr</td>\n                   <td class=\"tg-yw4l\">French</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">36</td>\n                   <td class=\"tg-yw4l\">fy-NL</td>\n                   <td class=\"tg-yw4l\">French (Principality of Monaco)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">37</td>\n                   <td class=\"tg-yw4l\">ga-IE</td>\n                   <td class=\"tg-yw4l\">French (Principality of Monaco)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">38</td>\n                   <td class=\"tg-yw4l\">gd</td>\n                   <td class=\"tg-yw4l\">French (Principality of Monaco)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">39</td>\n                   <td class=\"tg-yw4l\">gl</td>\n                   <td class=\"tg-yw4l\">Galician</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">40</td>\n                   <td class=\"tg-yw4l\">gu-IN</td>\n                   <td class=\"tg-yw4l\">Gujarati (India)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">41</td>\n                   <td class=\"tg-yw4l\">he</td>\n                   <td class=\"tg-yw4l\">Hebrew</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">42</td>\n                   <td class=\"tg-yw4l\">hi-IN</td>\n                   <td class=\"tg-yw4l\">Hindi (India)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">43</td>\n                   <td class=\"tg-yw4l\">hr</td>\n                   <td class=\"tg-yw4l\">Croatian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">44</td>\n                   <td class=\"tg-yw4l\">hu</td>\n                   <td class=\"tg-yw4l\">Hungarian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">45</td>\n                   <td class=\"tg-yw4l\">hy-AM</td>\n                   <td class=\"tg-yw4l\">Armenian (Armenia)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">46</td>\n                   <td class=\"tg-yw4l\">id</td>\n                   <td class=\"tg-yw4l\">Indonesian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">47</td>\n                   <td class=\"tg-yw4l\">is</td>\n                   <td class=\"tg-yw4l\">Icelandic</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">48</td>\n                   <td class=\"tg-yw4l\">it</td>\n                   <td class=\"tg-yw4l\">Italian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">49</td>\n                   <td class=\"tg-yw4l\">ja</td>\n                   <td class=\"tg-yw4l\">Japanese</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">50</td>\n                   <td class=\"tg-yw4l\">ka</td>\n                   <td class=\"tg-yw4l\">Georgian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">51</td>\n                   <td class=\"tg-yw4l\">kk</td>\n                   <td class=\"tg-yw4l\">Kazakh</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">52</td>\n                   <td class=\"tg-yw4l\">km</td>\n                   <td class=\"tg-yw4l\">Kazakh (Kazakhstan)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">53</td>\n                   <td class=\"tg-yw4l\">kn</td>\n                   <td class=\"tg-yw4l\">Kannada</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">54</td>\n                   <td class=\"tg-yw4l\">ko</td>\n                   <td class=\"tg-yw4l\">Korean</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">55</td>\n                   <td class=\"tg-yw4l\">ku</td>\n                   <td class=\"tg-yw4l\">Konkani (India)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">56</td>\n                   <td class=\"tg-yw4l\">lg</td>\n                   <td class=\"tg-yw4l\">Kyrgyz (Kyrgyzstan)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">57</td>\n                   <td class=\"tg-yw4l\">lij</td>\n                   <td class=\"tg-yw4l\">Kyrgyz (Kyrgyzstan)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">58</td>\n                   <td class=\"tg-yw4l\">lt</td>\n                   <td class=\"tg-yw4l\">Lithuanian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">59</td>\n                   <td class=\"tg-yw4l\">lv</td>\n                   <td class=\"tg-yw4l\">Latvian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">60</td>\n                   <td class=\"tg-yw4l\">mai</td>\n                   <td class=\"tg-yw4l\">Latvian (Latvia)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">61</td>\n                   <td class=\"tg-yw4l\">mk</td>\n                   <td class=\"tg-yw4l\">FYRO Macedonian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">62</td>\n                   <td class=\"tg-yw4l\">ml</td>\n                   <td class=\"tg-yw4l\">FYRO Macedonian (Former Yugoslav Republic of Macedonia)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">63</td>\n                   <td class=\"tg-yw4l\">mn</td>\n                   <td class=\"tg-yw4l\">Mongolian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">64</td>\n                   <td class=\"tg-yw4l\">mr</td>\n                   <td class=\"tg-yw4l\">Marathi</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">65</td>\n                   <td class=\"tg-yw4l\">ms</td>\n                   <td class=\"tg-yw4l\">Malay</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">66</td>\n                   <td class=\"tg-yw4l\">my</td>\n                   <td class=\"tg-yw4l\">Maltese (Malta)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">67</td>\n                   <td class=\"tg-yw4l\">nb-NO</td>\n                   <td class=\"tg-yw4l\">Norwegian (Bokm?l) (Norway)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">68</td>\n                   <td class=\"tg-yw4l\">nl</td>\n                   <td class=\"tg-yw4l\">Dutch</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">69</td>\n                   <td class=\"tg-yw4l\">nn-NO</td>\n                   <td class=\"tg-yw4l\">Norwegian (Nynorsk) (Norway)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">70</td>\n                   <td class=\"tg-yw4l\">nso</td>\n                   <td class=\"tg-yw4l\">Northern Sotho</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">71</td>\n                   <td class=\"tg-yw4l\">oc</td>\n                   <td class=\"tg-yw4l\">Northern Sotho (South Africa)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">72</td>\n                   <td class=\"tg-yw4l\">or</td>\n                   <td class=\"tg-yw4l\">Northern Sotho (South Africa)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">73</td>\n                   <td class=\"tg-yw4l\">pa-IN</td>\n                   <td class=\"tg-yw4l\">Punjabi (India)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">74</td>\n                   <td class=\"tg-yw4l\">pl</td>\n                   <td class=\"tg-yw4l\">Polish</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">75</td>\n                   <td class=\"tg-yw4l\">pt-BR</td>\n                   <td class=\"tg-yw4l\">Portuguese (Brazil)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">76</td>\n                   <td class=\"tg-yw4l\">pt-PT</td>\n                   <td class=\"tg-yw4l\">Portuguese (Portugal)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">77</td>\n                   <td class=\"tg-yw4l\">rm</td>\n                   <td class=\"tg-yw4l\">Quechua (Peru)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">78</td>\n                   <td class=\"tg-yw4l\">ro</td>\n                   <td class=\"tg-yw4l\">Romanian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">79</td>\n                   <td class=\"tg-yw4l\">ru</td>\n                   <td class=\"tg-yw4l\">Russian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">80</td>\n                   <td class=\"tg-yw4l\">rw</td>\n                   <td class=\"tg-yw4l\">Russian (Russia)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">81</td>\n                   <td class=\"tg-yw4l\">sah</td>\n                   <td class=\"tg-yw4l\">Sanskrit</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">82</td>\n                   <td class=\"tg-yw4l\">si</td>\n                   <td class=\"tg-yw4l\">Sami (Southern) (Sweden)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">83</td>\n                   <td class=\"tg-yw4l\">sk</td>\n                   <td class=\"tg-yw4l\">Slovak</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">84</td>\n                   <td class=\"tg-yw4l\">sl</td>\n                   <td class=\"tg-yw4l\">Slovenian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">85</td>\n                   <td class=\"tg-yw4l\">son</td>\n                   <td class=\"tg-yw4l\">Slovenian (Slovenia)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">86</td>\n                   <td class=\"tg-yw4l\">sq</td>\n                   <td class=\"tg-yw4l\">Albanian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">87</td>\n                   <td class=\"tg-yw4l\">sr</td>\n                   <td class=\"tg-yw4l\">Albanian (Albania)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">88</td>\n                   <td class=\"tg-yw4l\">sv-SE</td>\n                   <td class=\"tg-yw4l\">Swedish (Sweden)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">89</td>\n                   <td class=\"tg-yw4l\">sw</td>\n                   <td class=\"tg-yw4l\">Swahili</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">90</td>\n                   <td class=\"tg-yw4l\">ta</td>\n                   <td class=\"tg-yw4l\">Tamil</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">91</td>\n                   <td class=\"tg-yw4l\">ta-LK</td>\n                   <td class=\"tg-yw4l\">Tamil (India)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">92</td>\n                   <td class=\"tg-yw4l\">te</td>\n                   <td class=\"tg-yw4l\">Telugu</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">93</td>\n                   <td class=\"tg-yw4l\">th</td>\n                   <td class=\"tg-yw4l\">Thai</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">94</td>\n                   <td class=\"tg-yw4l\">tl</td>\n                   <td class=\"tg-yw4l\">Tagalog</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">95</td>\n                   <td class=\"tg-yw4l\">tn</td>\n                   <td class=\"tg-yw4l\">Tswana</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">96</td>\n                   <td class=\"tg-yw4l\">tr</td>\n                   <td class=\"tg-yw4l\">Turkish</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">97</td>\n                   <td class=\"tg-yw4l\">uk</td>\n                   <td class=\"tg-yw4l\">Ukrainian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">98</td>\n                   <td class=\"tg-yw4l\">ur</td>\n                   <td class=\"tg-yw4l\">Urdu</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">99</td>\n                   <td class=\"tg-yw4l\">vi</td>\n                   <td class=\"tg-yw4l\">Vietnamese</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">100</td>\n                   <td class=\"tg-yw4l\">wo</td>\n                   <td class=\"tg-yw4l\">Vietnamese (Viet Nam)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">101</td>\n                   <td class=\"tg-yw4l\">xh</td>\n                   <td class=\"tg-yw4l\">Xhosa</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">102</td>\n                   <td class=\"tg-yw4l\">zh-CN</td>\n                   <td class=\"tg-yw4l\">Chinese (S)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">103</td>\n                   <td class=\"tg-yw4l\">zh-TW</td>\n                   <td class=\"tg-yw4l\">Chinese (T)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">104</td>\n                   <td class=\"tg-yw4l\">zu</td>\n                   <td class=\"tg-yw4l\">Zulu</td>\n                </tr>\n              </table>\n            </div>\n          </div>\n        </div>\n        <!-- / main body -->\n        <div class=\"clear\"></div>\n      </main>\n    </div>\n\n    <div class=\"wrapper row5\">\n      <div id=\"copyright\" class=\"hoc clear\">\n        <p class=\"fl_left\">\n          Copyright &copy; 2017 - All Rights Reserved -\n          <a href=\"https://github.com/meshesha/\">Tady Meshesha</a>\n        </p>\n        <p class=\"fl_right\">\n          Template by\n          <a\n            target=\"_blank\"\n            href=\"http://www.os-templates.com/\"\n            title=\"Free Website Templates\"\n            >OS Templates</a\n          >\n        </p>\n      </div>\n    </div>\n    <a id=\"backtotop\" href=\"#top\"><i class=\"fa fa-chevron-up\"></i></a>\n  </body>\n</html>\n"
  },
  {
    "path": "example/pages/layout/index.html",
    "content": ""
  },
  {
    "path": "example/pages/layout/scripts/index.html",
    "content": ""
  },
  {
    "path": "example/pages/layout/scripts/jquery.backtotop.js",
    "content": "/*\nTemplate Name: Epigosha\nAuthor: <a href=\"http://www.os-templates.com/\">OS Templates</a>\nAuthor URI: http://www.os-templates.com/\nLicence: Free to use under our free template licence terms\nLicence URI: http://www.os-templates.com/template-terms\nFile: Back to Top JS\n*/\n\njQuery(\"#backtotop\").click(function () {\n    jQuery(\"body,html\").animate({\n        scrollTop: 0\n    }, 600);\n});\njQuery(window).scroll(function () {\n    if (jQuery(window).scrollTop() > 150) {\n        jQuery(\"#backtotop\").addClass(\"visible\");\n    } else {\n        jQuery(\"#backtotop\").removeClass(\"visible\");\n    }\n});"
  },
  {
    "path": "example/pages/layout/scripts/jquery.mobilemenu.js",
    "content": "/*\nTemplate Name: Epigosha\nAuthor: <a href=\"http://www.os-templates.com/\">OS Templates</a>\nAuthor URI: http://www.os-templates.com/\nLicence: Free to use under our free template licence terms\nLicence URI: http://www.os-templates.com/template-terms\nFile: Mobile Menu JS\n\nThanks to:\n\"Convert a Menu to a Dropdown for Small Screens\" from Chris Collier - http://css-tricks.com/convert-menu-to-dropdown/\n\"Submenu's with a dash\" Daryn St. Pierre - http://jsfiddle.net/bloqhead/Kq43X/\n*/\n\n$('<form action=\"#\"><select /></form>').appendTo(\"#mainav\");$(\"<option />\",{selected:\"selected\",value:\"\",text:\"MENU\"}).appendTo(\"#mainav select\");$(\"#mainav a\").each(function(){var e=$(this);if($(e).parents(\"ul ul ul\").length>=1){$(\"<option />\",{value:e.attr(\"href\"),text:\"- - - \"+e.text()}).appendTo(\"#mainav select\")}else if($(e).parents(\"ul ul\").length>=1){$(\"<option />\",{value:e.attr(\"href\"),text:\"- - \"+e.text()}).appendTo(\"#mainav select\")}else if($(e).parents(\"ul\").length>=1){$(\"<option />\",{value:e.attr(\"href\"),text:\"\"+e.text()}).appendTo(\"#mainav select\")}else{$(\"<option />\",{value:e.attr(\"href\"),text:e.text()}).appendTo(\"#mainav select\")}});$(\"#mainav select\").change(function(){if($(this).find(\"option:selected\").val()!==\"#\"){window.location=$(this).find(\"option:selected\").val()}})"
  },
  {
    "path": "example/pages/layout/styles/fonts/index.html",
    "content": ""
  },
  {
    "path": "example/pages/layout/styles/framework.css",
    "content": "@charset \"utf-8\";\n/*\nTemplate Name: Epigosha\nAuthor: <a href=\"http://www.os-templates.com/\">OS Templates</a>\nAuthor URI: http://www.os-templates.com/\nLicence: Free to use under our free template licence terms\nLicence URI: http://www.os-templates.com/template-terms\nFile: Framework CSS\n*/\n\nhtml{overflow-y:scroll; overflow-x:hidden;} /* overflow-x:hidden; is required to prevent a horizontal scrollbar when using the split box elements */\nhtml, body{margin:0; padding:0; font-size:14px; line-height:1.6em;}\n\n*, *::before, *::after{box-sizing:border-box;}\n\n.bold{font-weight:bold;}\n.center{text-align:center;}\n.right{text-align:right;}\n.uppercase{text-transform:uppercase;}\n.capitalise{text-transform:capitalize;}\n.hidden{display:none;}\n.nospace{margin:0; padding:0; list-style:none;}\n.block{display:block;}\n.inline *{display:inline-block;}\n.inline *:last-child{margin-right:0;}\n.pushright li{margin-right:20px;}\n.pushright li:last-child{margin-right:0;}\n.borderedbox{border:1px solid;}\n.overlay{position:relative; z-index:1;}\n.overlay::after{display:block; position:absolute; top:0; left:0; width:100%; height:100%; content:\"\"; z-index:-1;}\n.bgded{background-position:top center; background-repeat:no-repeat; background-size:cover;}\n.circle{border-radius:50%; background-clip:padding-box;}\n\n.btn{display:inline-block; padding:15px 25px 17px; text-transform:uppercase; border:1px solid;}\n.btn.medium{padding:10px 20px 12px;}\n.btn.small{padding:8px 18px 10px; text-transform:none;}\n\n.split{background-position:top right; background-repeat:no-repeat; background-size:cover;}\n.split .box{display:block; position:relative; float:right; width:65%; padding:80px 0 80px 50px;}\n.split .box::after{display:block; position:absolute; top:0; right:-1000%; bottom:0; left:100%; content:\"\";}\n.split .box.left{float:left; padding-right:50px; padding-left:0;}\n.split .box.left::after{left:-1000%; right:100%;}\n\n.clear, .group{display:block;}\n.clear::before, .clear::after, .group::before, .group::after{display:table; content:\"\";}\n.clear, .clear::after, .group, .group::after{clear:both;}\n\na{outline:none; text-decoration:none;}\n\n.fl_left, .imgl{float:left;}\n.fl_right, .imgr{float:right;}\n\n.imgl{margin:0 15px 10px 0; clear:left;}\n.imgr{margin:0 0 10px 15px; clear:right;}\n\n\n/* Fonts\n--------------------------------------------------------------------------------------------------------------- */\nbody, input, textarea, select{font-family:Verdana, Geneva, sans-serif;}\nh1, h2, h3, h4, h5, h6, .heading{font-family:Georgia, \"Times New Roman\", Times, serif;}\n\n\n/* Forms\n--------------------------------------------------------------------------------------------------------------- */\nform, fieldset, legend{margin:0; padding:0; border:none;}\nlegend{display:none;}\nlabel, input, textarea, select, button{display:block; resize:none; outline:none; color:inherit; font-size:inherit; font-family:inherit; vertical-align:middle;}\nlabel{margin-bottom:5px;}\n:required, :invalid{outline:none; box-shadow:none;}\n\n\n/* Generalise\n--------------------------------------------------------------------------------------------------------------- */\nh1, h2, h3, h4, h5, h6, .heading{margin:0 0 20px 0; font-size:22px; line-height:normal; font-weight:normal; text-transform:capitalize; font-variant:small-caps;}\n\naddress{font-style:normal; font-weight:normal;}\nhr{display:block; width:100%; height:1px; border:solid; border-width:1px 0 0 0;}\n\n.font-xs{font-size:.8rem;}\n.font-x1{font-size:1.2rem;}\n.font-x2{font-size:1.8rem; line-height:normal;}\n.font-x3{font-size:2.8rem; line-height:normal;}\n\n.wrapper{display:block; width:100%; margin:0; padding:0; text-align:left; word-wrap:break-word;}\n/*\nThe \"hoc\" class is a generic class used to centre a containing element horizontally\nIt should be used in conjunction with a second class or ID\n*/\n.hoc{display:block; margin:0 auto;}\n\n\n/* HTML 5 Overrides\n--------------------------------------------------------------------------------------------------------------- */\naddress, article, aside, figcaption, figure, footer, header, main, nav, section{display:block; margin:0; padding:0;}\n\n\n/* Grid\n--------------------------------------------------------------------------------------------------------------- */\n.one_half, .one_third, .two_third, .one_quarter, .two_quarter, .three_quarter{display:inline-block; float:left; margin:0 0 0 3.06748466257669%; list-style:none;}\n\n.first{margin-left:0; clear:left;}\n\n.one_quarter{width:22.69938650306748%;}\n.one_third{width:31.28834355828221%;}\n.one_half, .two_quarter{width:48.46625766871166%;}\n.two_third{width:65.6441717791411%;}\n.three_quarter{width:74.23312883435584%;}\n\n\n/* Spacing\n--------------------------------------------------------------------------------------------------------------- */\n.btmspace-10{margin-bottom:10px;}\n.btmspace-15{margin-bottom:15px;}\n.btmspace-30{margin-bottom:30px;}\n.btmspace-50{margin-bottom:50px;}\n.btmspace-80{margin-bottom:80px;}\n\n.inspace-5{padding:5px;}\n.inspace-10{padding:10px;}\n.inspace-15{padding:15px;}\n.inspace-30{padding:30px;}\n.inspace-50{padding:50px;}\n.inspace-80{padding:80px;}"
  },
  {
    "path": "example/pages/layout/styles/index.html",
    "content": ""
  },
  {
    "path": "example/pages/layout/styles/layout.css",
    "content": "@charset \"utf-8\";\n/*\nTemplate Name: Epigosha\nAuthor: <a href=\"http://www.os-templates.com/\">OS Templates</a>\nAuthor URI: http://www.os-templates.com/\nLicence: Free to use under our free template licence terms\nLicence URI: http://www.os-templates.com/template-terms\nFile: Layout CSS\n*/\n\n@import url(\"fontawesome-4.5.0.min.css\");\n@import url(\"framework.css\");\n\n/* Rows\n--------------------------------------------------------------------------------------------------------------- */\n.row1{border-bottom:1px solid;}\n.row2, .row2 a{}\n.row3, .row3 a{}\n.row4, .row4 a{}\n.row5{border-top:1px solid;}\n\n\n/* Page Intro\n--------------------------------------------------------------------------------------------------------------- */\n#pageintro .box{padding-top:150px; padding-bottom:150px;}\n\n#pageintro article{}\n#pageintro article .heading{margin-bottom:30px; font-size:36px;}\n#pageintro article p{font-size:16px;}\n#pageintro article footer{margin-top:50px;}\n\n\n/* Header\n--------------------------------------------------------------------------------------------------------------- */\n#header{}\n\n#header #logo{margin:29px 0 0 0;}\n#header #logo h1{margin:0; padding:0; font-size:22px; line-height:1; text-transform:uppercase;}\n\n\n/* Content Area\n--------------------------------------------------------------------------------------------------------------- */\n.container{padding:80px 0;}\n\n/* Content */\n.container .content{}\n\n#stats{text-align:center;}\n#stats li *{margin:0; padding:0;}\n#stats li:last-child{margin-bottom:0;}/* Used in mobile devices when elements stack */\n#stats li i{margin-bottom:30px;}\n#stats li p:first-of-type{margin-bottom:30px; font-size:32px; font-weight:700;}\n#stats li p:last-of-type{text-transform:uppercase;}\n\n.latest{}\n.latest figure{display:inline-block; position:relative; max-width:100%; margin-bottom:30px;}\n.latest figure figcaption{display:block; position:absolute; top:10px; left:10px; width:60px; height:auto; padding:8px 0; border:1px solid; text-align:center;}\n.latest figure figcaption *{display:block; margin:0; padding:0;}\n.latest figure figcaption strong{margin-bottom:-5px;}\n.latest .heading, .latest p{margin:0; padding:0;}\n.latest .heading{margin-bottom:10px;}\n.latest p:last-of-type{margin:20px 0 0 0;}\n\n/* Comments */\n#comments ul{margin:0 0 40px 0; padding:0; list-style:none;}\n#comments li{margin:0 0 10px 0; padding:15px;}\n#comments .avatar{float:right; margin:0 0 10px 10px; padding:3px; border:1px solid;}\n#comments address{font-weight:bold;}\n#comments time{font-size:smaller;}\n#comments .comcont{display:block; margin:0; padding:0;}\n#comments .comcont p{margin:10px 5px 10px 0; padding:0;}\n\n#comments form{display:block; width:100%;}\n#comments input, #comments textarea{width:100%; padding:10px; border:1px solid;}\n#comments textarea{overflow:auto;}\n#comments div{margin-bottom:15px;}\n#comments input[type=\"submit\"], #comments input[type=\"reset\"]{display:inline-block; width:auto; min-width:150px; margin:0; padding:8px 5px; cursor:pointer;}\n\n/* Sidebar */\n.container .sidebar{}\n\n.sidebar .sdb_holder{margin-bottom:50px;}\n.sidebar .sdb_holder:last-child{margin-bottom:0;}\n\n\n/* Elements\n--------------------------------------------------------------------------------------------------------------- */\n#elements{}\n\n#elements article{display:block; position:relative; min-height:80px; margin:0 0 30px 0; padding:0 0 0 40px;}\n#elements article:last-child{margin:0;}\n#elements article *{margin:0;}\n#elements article i{display:block; position:absolute; top:0; left:0; font-size:24px;}\n#elements article .heading{margin-bottom:10px; font-size:1.2rem;}\n#elements article p{margin-bottom:10px;}\n\n\n/* CTA - Click To Action\n--------------------------------------------------------------------------------------------------------------- */\n#cta{text-align:center;}\n\n#cta *{margin:0;}\n#cta .heading{margin-bottom:50px;}\n\n\n/* Footer\n--------------------------------------------------------------------------------------------------------------- */\n#footer{padding:80px 0 50px;}\n\n#footer .title{margin:0 0 50px 0; padding:0; font-size:1.2rem;}\n\n#footer .linklist li{display:block; margin-bottom:15px; padding:0 0 15px 0; border-bottom:1px solid;}\n#footer .linklist li:last-child{margin:0; padding:0; border:none;}\n#footer .linklist li::before, #footer .linklist li::after{display:table; content:\"\";}\n#footer .linklist li, #footer .linklist li::after{clear:both;}\n\n#footer .contact{}\n#footer .contact.linklist li, #footer .contact.linklist li:last-child{position:relative; padding-left:40px;}\n#footer .contact li *{margin:0; padding:0; line-height:1.6;}\n#footer .contact li i{display:block; position:absolute; top:0; left:0; width:30px; font-size:16px; text-align:center;}\n\n\n/* Copyright\n--------------------------------------------------------------------------------------------------------------- */\n#copyright{padding:30px 0;}\n#copyright *{margin:0; padding:0;}\n\n\n/* Transition Fade\n--------------------------------------------------------------------------------------------------------------- \n*, *::before, *::after{transition:all .3s ease-in-out;}\n#mainav form *{transition:none !important;}\n*/\n\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n\n\n/* Navigation\n--------------------------------------------------------------------------------------------------------------- */\nnav ul, nav ol{margin:0; padding:0; list-style:none;}\n\n#mainav, #breadcrumb, .sidebar nav{line-height:normal;}\n#mainav .drop::after, #mainav li li .drop::after, #breadcrumb li a::after, .sidebar nav a::after{position:absolute; font-family:\"FontAwesome\"; font-size:10px; line-height:10px;}\n\n/* Top Navigation */\n#mainav{}\n#mainav ul.clear{}\n#mainav ul{text-transform:uppercase;}\n#mainav ul ul{z-index:9999; position:absolute; width:180px; text-transform:none;}\n#mainav ul ul ul{left:180px; top:0;}\n#mainav li{display:inline-block; position:relative; margin:0 15px 0 0; padding:0;}\n#mainav li:last-child{margin-right:0;}\n#mainav li li{width:100%; margin:0;}\n#mainav li a{display:block; padding:30px 0;}\n#mainav li li a{border:solid; border-width:0 0 1px 0;}\n#mainav .drop{padding-left:15px;}\n#mainav li li a, #mainav li li .drop{display:block; margin:0; padding:10px 15px;}\n#mainav .drop::after, #mainav li li .drop::after{content:\"\\f0d7\";}\n#mainav .drop::after{top:35px; left:5px;}\n#mainav li li .drop::after{top:15px; left:5px;}\n#mainav ul ul{visibility:hidden; opacity:0;}\n#mainav ul li:hover > ul{visibility:visible; opacity:1;}\n\n#mainav form{display:none; margin:0; padding:0;}\n#mainav form select, #mainav form select option{display:block; cursor:pointer; outline:none;}\n#mainav form select{width:100%; padding:5px; border:none;}\n#mainav form select option{margin:5px; padding:0; border:none;}\n\n/* Breadcrumb */\n#breadcrumb{padding:50px 0 20px;}\n#breadcrumb ul{margin:0; padding:0; list-style:none; font-variant:small-caps;}\n#breadcrumb li{display:inline-block; margin:0 6px 0 0; padding:0;}\n#breadcrumb li a{display:block; position:relative; margin:0; padding:0 12px 0 0; font-size:12px;}\n#breadcrumb li a::after{top:3px; right:0; content:\"\\f101\";}\n#breadcrumb li:last-child a{margin:0; padding:0;}\n#breadcrumb li:last-child a::after{display:none;}\n\n/* Sidebar Navigation */\n.sidebar nav{display:block; width:100%;}\n.sidebar nav li{margin:0 0 3px 0; padding:0;}\n.sidebar nav a{display:block; position:relative; margin:0; padding:5px 10px 5px 15px; text-decoration:none; border:solid; border-width:0 0 1px 0;}\n.sidebar nav a::after{top:9px; left:5px; content:\"\\f101\";}\n.sidebar nav ul ul a{padding-left:35px;}\n.sidebar nav ul ul a::after{left:25px;}\n.sidebar nav ul ul ul a{padding-left:55px;}\n.sidebar nav ul ul ul a::after{left:45px;}\n\n/* Pagination */\n.pagination{display:block; width:100%; text-align:center; clear:both;}\n.pagination li{display:inline-block; margin:0 2px 0 0;}\n.pagination li:last-child{margin-right:0;}\n.pagination a, .pagination strong{display:block; padding:8px 11px; border:1px solid; background-clip:padding-box; font-weight:normal;}\n\n/* Back to Top */\n#backtotop{z-index:999; display:inline-block; position:fixed; visibility:hidden; bottom:20px; right:20px; width:36px; height:36px; line-height:36px; font-size:16px; text-align:center; opacity:.2;}\n#backtotop i{display:block; width:100%; height:100%; line-height:inherit;}\n#backtotop.visible{visibility:visible; opacity:.5;}\n#backtotop:hover{opacity:1;}\n\n\n/* Tables\n--------------------------------------------------------------------------------------------------------------- */\ntable, th, td{border:1px solid; border-collapse:collapse; vertical-align:top;}\ntable, th{table-layout:auto;}\ntable{width:100%; margin-bottom:15px;}\nth, td{padding:5px 8px;}\ntd{border-width:0 1px;}\n\n\n/* Gallery\n--------------------------------------------------------------------------------------------------------------- */\n#gallery{display:block; width:100%; margin-bottom:50px;}\n#gallery figure figcaption{display:block; width:100%; clear:both;}\n#gallery li{margin-bottom:30px;}\n\n\n/* Font Awesome Social Icons\n--------------------------------------------------------------------------------------------------------------- */\n.faico{margin:0; padding:0; list-style:none;}\n.faico li{display:inline-block; margin:8px 5px 0 0; padding:0; line-height:normal;}\n.faico li:last-child{margin-right:0;}\n.faico a{display:inline-block; width:36px; height:36px; line-height:36px; font-size:18px; text-align:center;}\n\n.faico a{color:#050505; background-color:#0F84AA;}\n.faico a:hover{color:#FFFFFF;}\n\n.faicon-dribble:hover{background-color:#EA4C89;}\n.faicon-facebook:hover{background-color:#3B5998;}\n.faicon-google-plus:hover{background-color:#DB4A39;}\n.faicon-linkedin:hover{background-color:#0E76A8;}\n.faicon-twitter:hover{background-color:#00ACEE;}\n.faicon-vk:hover{background-color:#4E658E;}\n\n\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n\n\n/* Colours\n--------------------------------------------------------------------------------------------------------------- */\nbody{color:#FFFFFF; background-color:#232323;}\na{color:#0F84AA;}\na:active, a:focus{background:transparent;}/* IE10 + 11 Bugfix - prevents grey background */\nhr, .borderedbox{border-color:#D7D7D7;}\nlabel span{color:#FF0000; background-color:inherit;}\ninput:focus, textarea:focus, *:required:focus{border-color:#0F84AA;}\n.overlay{color:#FFFFFF; background-color:inherit;}\n.overlay::after{color:inherit; background-color:rgba(0,0,0,.55);}\n\n.btn, .btn.inverse:hover{color:#FFFFFF; background-color:#0F84AA; border-color:#0F84AA;}\n.btn:hover, .btn.inverse{color:inherit; background-color:transparent; border-color:inherit;}\n\n.split .box, .split .box::after{color:#9B9B9B; background-color:rgba(35,35,35,.8);/* #232323 */}\n.split .box.bg-light, .split .box.bg-light::after{color:#232323; background-color:rgba(250,250,250,.85);/* #FAFAFA */}\n.split .box.bg-coloured, .split .box.bg-coloured::after{color:#FFFFFF; background-color:rgba(15,132,170,.65);/* #0F84AA */}\n\n\n/* Rows */\n.row1{color:#232323; background-color:#FAFAFA; border-color:#EBEBEB;}\n.row2{color:#232323; background-color:#EBEBEB;}\n.row3{color:#232323; background-color:#FFFFFF;}\n.row4{color:#9B9B9B; background-color:#232323;}\n.row5, .row5 a{color:#9B9B9B; background-color:#232323;}\n.row5{border-color:#404040;}\n\n\n/* Header */\n#header #logo a{color:inherit;}\n\n\n/* Content Area */\n.latest figure figcaption{color:#FFFFFF; background-color:rgba(0,0,0,.2); border-color:#FFFFFF;}\n\n\n/* Footer */\n#footer .title{color:#FFFFFF;}\n#footer .linklist li{border-color:#404040;}\n\n\n/* Navigation */\n#mainav li a{color:inherit;}\n#mainav .active a, #mainav a:hover, #mainav li:hover > a{color:#0F84AA; background-color:inherit;}\n#mainav li li a, #mainav .active li a{color:#FFFFFF; background-color:rgba(0,0,0,.6); border-color:rgba(0,0,0,.6);}\n#mainav li li:hover > a, #mainav .active .active > a{color:#FFFFFF; background-color:#0F84AA;}\n#mainav form select{color:#232323; background-color:#EBEBEB;}\n\n#breadcrumb a{color:inherit; background-color:inherit;}\n#breadcrumb li:last-child a{color:#0F84AA;}\n\n.container .sidebar nav a{color:inherit; border-color:#D7D7D7;}\n.container .sidebar nav a:hover{color:#0F84AA;}\n.container .sidebar .active a, .container .sidebar a:hover, .container .sidebar li:hover > a{color:#0F84AA; background-color:inherit;}\n\n.pagination a, .pagination strong{border-color:#D7D7D7;}\n.pagination .current *{color:#FFFFFF; background-color:#0F84AA;}\n\n#backtotop{color:#FFFFFF; background-color:#0F84AA;}\n\n\n/* Tables + Comments */\ntable, th, td, #comments .avatar, #comments input, #comments textarea{border-color:#D7D7D7;}\n#comments input:focus, #comments textarea:focus, #comments *:required:focus{border-color:#0F84AA;}\nth{color:#FFFFFF; background-color:#373737;}\ntr, #comments li, #comments input[type=\"submit\"], #comments input[type=\"reset\"]{color:inherit; background-color:#FBFBFB;}\ntr:nth-child(even), #comments li:nth-child(even){color:inherit; background-color:#F7F7F7;}\ntable a, #comments a{background-color:inherit;}\n\n\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n\n\n/* Media Queries\n--------------------------------------------------------------------------------------------------------------- */\n@-ms-viewport{width:device-width;}\n\n\n/* Max Wrapper Width - Laptop, Desktop etc.\n--------------------------------------------------------------------------------------------------------------- */\n@media screen and (min-width:978px){\n\t.hoc{max-width:978px;}\n}\n\n\n/* Mobile Devices\n--------------------------------------------------------------------------------------------------------------- */\n@media screen and (max-width:900px){\n\t.hoc{max-width:90%;}\n\n\t#header{padding:30px 0;}\n\t#header #logo{margin:7px 0 0 0;}\n\n\t#mainav{}\n\t#mainav ul{display:none;}\n\t#mainav form{display:block;}\n\n\t#breadcrumb{}\n\n\t.container{}\n\t#comments input[type=\"reset\"]{margin-top:10px;}\n\t.pagination li{display:inline-block; margin:0 5px 5px 0;}\n\n\t#footer{}\n\n\t#copyright{}\n\t#copyright p:first-of-type{margin-bottom:10px;}\n}\n\n\n@media screen and (max-width:750px){\n\t.imgl, .imgr{display:inline-block; float:none; margin:0 0 10px 0;}\n\t.fl_left, .fl_right{display:block; float:none;}\n\t.one_half, .one_third, .two_third, .one_quarter, .two_quarter, .three_quarter{display:block; float:none; width:auto; margin:0 0 30px 0; padding:0;}\n\n\t#header{text-align:center;}\n\t#header #logo{margin:0 0 15px 0;}\n}\n\n\n/* Other\n--------------------------------------------------------------------------------------------------------------- */\n@media screen and (max-width:650px){\n\t.scrollable{display:block; width:100%; margin:0 0 30px 0; padding:0 0 15px 0; overflow:auto; overflow-x:scroll;}\n\t.scrollable table{margin:0; padding:0; white-space:nowrap;}\n\n\t.inline li{display:block; margin-bottom:10px;}\n\t.pushright li{margin-right:0;}\n\n\t.hoc.split{max-width:none; width:100%;}\n\t.split .box, .split .box.left{float:none; width:100%; padding:5%;}\n\n\t.font-x2{font-size:1.4rem;}\n\t.font-x3{font-size:1.6rem;}\n\n\t#pageintro .box{padding:100px 5%;}\n}"
  },
  {
    "path": "example/sitemaps/ror.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rss version=\"2.0\" xmlns:ror=\"http://rorweb.com/0.1/\" >\n<channel>\n  <title>ROR Sitemap for https://officetohtml.js.org/index.html</title>\n  <link>https://officetohtml.js.org/index.html</link>\n\n<item>\n     <link>https://officetohtml.js.org/index.html</link>\n     <title>OfficeToHtml</title>\n     <description>OfficeToHtml</description>\n     <ror:updatePeriod></ror:updatePeriod>\n     <ror:sortOrder>0</ror:sortOrder>\n     <ror:resourceOf>sitemap</ror:resourceOf>\n</item>\n<item>\n     <link>https://officetohtml.js.org/pages/docs.html</link>\n     <title>OfficeJs | Docs </title>\n     <description>OfficeJs | Docs </description>\n     <ror:updatePeriod></ror:updatePeriod>\n     <ror:sortOrder>1</ror:sortOrder>\n     <ror:resourceOf>sitemap</ror:resourceOf>\n</item>\n<item>\n     <link>https://officetohtml.js.org/pages/demos.html</link>\n     <title>OfficeJs | Demos </title>\n     <description>OfficeJs | Demos </description>\n     <ror:updatePeriod></ror:updatePeriod>\n     <ror:sortOrder>1</ror:sortOrder>\n     <ror:resourceOf>sitemap</ror:resourceOf>\n</item>\n<item>\n     <link>https://officetohtml.js.org/pages/lang.html</link>\n     <title>OfficeJs | Docs</title>\n     <description>OfficeJs | Docs</description>\n     <ror:updatePeriod></ror:updatePeriod>\n     <ror:sortOrder>2</ror:sortOrder>\n     <ror:resourceOf>sitemap</ror:resourceOf>\n</item>\n</channel>\n</rss>\n  "
  },
  {
    "path": "example/sitemaps/sitemap.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\n<head>\n\t<meta charset=\"utf-8\" />\n\t<title>officetohtml.js.org Site Map - Generated by www.xml-sitemaps.com</title>\n\t<meta content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0\" name=\"viewport\" />\n\t<style type=\"text/css\">\n\tbody {\n\t\tbackground-color: #fff;\n\t\tfont-family: \"Roboto\", \"Helvetica\", \"Arial\", sans-serif;\n\t\tmargin: 0;\n\t}\n\n\t#top {\n\n\t\tbackground-color: #b1d1e8;\n\t\tfont-size: 16px;\n\t\tpadding-bottom: 40px;\n\t}\n\n\tnav {\n\t\tfont-size: 24px;\n\n\t\tmargin: 0px 30px 0px;\n\t\tborder-bottom-left-radius: 6px;\n\t\tborder-bottom-right-radius: 6px;\n\t\tbackground-color: #f3f3f3;\n\t\tcolor: #666;\n\t\tbox-shadow: 0 10px 20px -12px rgba(0, 0, 0, 0.42), 0 3px 20px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2);\n\t\tpadding: 10px 0;\n\t\ttext-align: center;\n\t\tz-index: 1;\n\t}\n\n\th3 {\n\t\tmargin: auto;\n\t\tpadding: 10px;\n\t\tmax-width: 600px;\n\t\tcolor: #666;\n\t}\n\n\th3 span {\n\t\tfloat: right;\n\t}\n\n\th3 a {\n\t\tfont-weight: normal;\n\t\tdisplay: block;\n\t}\n\n\n\t#cont {\n\t\tposition: relative;\n\t\tborder-radius: 6px;\n\t\tbox-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2);\n\n\t\tbackground: #f3f3f3;\n\n\t\tmargin: -20px 30px 0px 30px;\n\t\tpadding: 20px;\n\t}\n\n\ta:link,\n\ta:visited {\n\t\tcolor: #0180AF;\n\t\ttext-decoration: underline;\n\t}\n\n\ta:hover {\n\t\tcolor: #666;\n\t}\n\n\n\t#footer {\n\t\tpadding: 10px;\n\t\ttext-align: center;\n\t}\n\n\tul {\n    \tmargin: 0px;\n\n    \tpadding: 0px;\n    \tlist-style: none;\n\t}\n\tli {\n\t\tmargin: 0px;\n\t}\n\tli ul {\n\t\tmargin-left: 20px;\n\t}\n\n\t.lhead {\n\t\tbackground: #ddd;\n\t\tpadding: 10px;\n    \tmargin: 10px 0px;\n\t}\n\n\t.lcount {\n\t\tpadding: 0px 10px;\n\t}\n\n\t.lpage {\n\t\tborder-bottom: #ddd 1px solid;\n\t\tpadding: 5px;\n\t}\n\t.last-page {\n\t\tborder: none;\n\t}\n\t</style>\n</head>\n\n<body>\n\t<div id=\"top\">\n\t\t<nav>officetohtml.js.org HTML Site Map</nav>\n\t\t<h3>\n<span>Last updated: 2019, February 3<br />\nTotal pages: 4</span>\n<a href=\"https://officetohtml.js.org\">officetohtml.js.org Homepage</a>\n</h3></div>\n\t<div id=\"cont\">\n\t\t<ul class=\"level-0\">\n\n            <li class=\"lhead\">/  <span class=\"lcount\">1 pages</span></li>\n            \n<li class=\"lpage last-page\"><a href=\"https://officetohtml.js.org/index.html\" title=\"OfficeToHtml\">OfficeToHtml</a></li><li><ul class=\"level-1\">\n\n            <li class=\"lhead\">pages/  <span class=\"lcount\">3 pages</span></li>\n            \n<li class=\"lpage\"><a href=\"https://officetohtml.js.org/pages/docs.html\" title=\"OfficeJs | Docs \">OfficeJs | Docs </a></li>\n<li class=\"lpage\"><a href=\"https://officetohtml.js.org/pages/demos.html\" title=\"OfficeJs | Demos \">OfficeJs | Demos </a></li>\n<li class=\"lpage last-page\"><a href=\"https://officetohtml.js.org/pages/lang.html\" title=\"OfficeJs | Docs\">OfficeJs | Docs</a></li>\n</ul></li>\n</ul>\n\t\t<!--\nPlease note:\nYou are not allowed to remove the copyright notice below.\nThank you!\nwww.xml-sitemaps.com\n-->\n\t</div>\n\t<div id=\"footer\">\n\t\tPage created with <a target=\"_blank\" href=\"https://www.xml-sitemaps.com\">Google XML sitemap and html sitemaps generator</a> | Copyright &copy; 2005-2018 XML-Sitemaps.com\n\t</div>\n</body>\n\n</html>"
  },
  {
    "path": "example/sitemaps/sitemap.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset\n      xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n      xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n      xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9\n            http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd\">\n<!-- created with Free Online Sitemap Generator www.xml-sitemaps.com -->\n\n\n<url>\n  <loc>https://officetohtml.js.org/index.html</loc>\n  <lastmod>2019-02-03T17:54:31+00:00</lastmod>\n  <priority>1.00</priority>\n</url>\n<url>\n  <loc>https://officetohtml.js.org/pages/docs.html</loc>\n  <lastmod>2019-02-03T17:54:31+00:00</lastmod>\n  <priority>0.80</priority>\n</url>\n<url>\n  <loc>https://officetohtml.js.org/pages/demos.html</loc>\n  <lastmod>2019-02-03T17:54:31+00:00</lastmod>\n  <priority>0.80</priority>\n</url>\n<url>\n  <loc>https://officetohtml.js.org/pages/lang.html</loc>\n  <lastmod>2019-02-03T17:54:31+00:00</lastmod>\n  <priority>0.64</priority>\n</url>\n\n\n</urlset>"
  },
  {
    "path": "example/sitemaps/urllist.txt",
    "content": "https://officetohtml.js.org/index.html\nhttps://officetohtml.js.org/pages/docs.html\nhttps://officetohtml.js.org/pages/demos.html\nhttps://officetohtml.js.org/pages/lang.html\n"
  },
  {
    "path": "images/index.html",
    "content": ""
  },
  {
    "path": "index.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n<title>OfficeToHtml</title>\r\n<meta charset=\"utf-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\">\r\n<link href=\"layout/styles/layout.css\" rel=\"stylesheet\" type=\"text/css\" media=\"all\">\r\n<script src=\"layout/scripts/jquery.min.js\"></script>\r\n  <!-- Global site tag (gtag.js) - Google Analytics -->\r\n<script async src=\"https://www.googletagmanager.com/gtag/js?id=G-L6178F1KH3\"></script>\r\n<script>\r\n  window.dataLayer = window.dataLayer || [];\r\n  function gtag(){dataLayer.push(arguments);}\r\n  gtag('js', new Date());\r\n\r\n  gtag('config', 'G-L6178F1KH3');\r\n</script>\r\n</head>\r\n<body id=\"top\">\r\n<div class=\"wrapper bgded\" style=\"background-image:url('images/office2html2.png');background-size: 75%;\">\r\n  <div id=\"pageintro\" class=\"hoc split clear\">\r\n    <article class=\"box bg-coloured clear\"> \r\n      <h2 class=\"heading\">OfficeToHtml</h2>\r\n      <p>jQuery plugin for convertation pptx,docx,xlsx and pdf to html using pure javascript.</p>\r\n      <footer>\r\n        <ul class=\"nospace inline pushright\">\r\n          <li><a class=\"btn inverse\" href=\"https://github.com/meshesha/officeToHtml\">GitHub</a></li>\r\n        </ul>\r\n      </footer>\r\n    </article>\r\n  </div>\r\n</div>\r\n<div class=\"wrapper row1\">\r\n  <header id=\"header\" class=\"hoc clear\">\r\n    <div id=\"logo\" class=\"fl_left\">\r\n      <h1><a href=\"index.html\">Office To Html</a></h1>\r\n    </div>\r\n    <nav id=\"mainav\" class=\"fl_right\">\r\n      <ul class=\"clear\">\r\n        <li class=\"active\"><a href=\"index.html\">Home</a></li>\r\n        <li><a href=\"pages/docs.html\">Docs</a></li>\r\n        <li><a href=\"pages/demos.html\">Demos</a></li>\r\n        <li><a href=\"https://github.com/meshesha/officeToHtml\">GitHub</a></li>\r\n        <li><a href=\"https://github.com/meshesha\">About</a></li>\r\n      </ul>\r\n    </nav>\r\n  </header>\r\n</div>\r\n<div class=\"wrapper row3\">\r\n  <main class=\"hoc container clear\"> \r\n    <!-- main body -->\r\n    <!-- ################################################################################################ -->\r\n    <div class=\"one_half first clear btmspace-80\">\r\n      <h3 class=\"font-x2\">Description</h3>\r\n      <p class=\"font-x1\">jQuery plugin written in pure javascript for converting modern microsoft office files,\r\n          pptx,docx,xlsx and pdf to html.</p>\r\n      <p class=\"font-x1\">In fact it is an application that integrates other libraries like <a href=\"https://meshesha.github.io/pptxjs/\" target=\"_blank\">PPTXjs</a>,\r\n        <a href=\"https://github.com/mwilliamson/mammoth.js\" target=\"_blank\">mammoth.js</a>,<a href=\"https://github.com/sheetjs/js-xlsx\" target=\"_blank\">SheetJs</a> Combined with \r\n        <a href=\"https://handsontable.com/\" target=\"_blank\">handsontable</a>\r\n        and <a href=\"https://mozilla.github.io/pdf.js/\" target=\"_blank\">PDF.js</a>, \r\n        designed to convert Office files and pdf file to HTML.</p>\r\n    </div>\r\n    <div class=\"group\">\r\n      <article class=\"one_quarter first\">\r\n        <h4>Supported browsers</h4>\r\n        <p>Supports modern browsers such as FireFox, Chrome, Edge etc.\r\n            But I have not checked in all browsers.For more information, read the support for each of the above libraries.</p>\r\n      </article>\r\n      <article class=\"one_quarter\">\r\n        <h4>LICENSE </h4>\r\n        <span>OfficeToHtml and PPTXjs : <a href=\"https://github.com/meshesha/PPTXjs/blob/master/LICENSE\" target=\"_blank\">MIT.</a></span>\r\n        <span>mammoth.js : <a href=\"https://github.com/mwilliamson/mammoth.js/blob/master/LICENSE\" target=\"_blank\">BSD 2.</a></span><br>\r\n        <span>SheetJs : <a href=\"https://github.com/SheetJS/js-xlsx/blob/master/LICENSE\" target=\"_blank\">Apache 2.0.</a></span><br>\r\n        <span>pdf.js: <a href=\"https://github.com/mozilla/pdf.js/blob/master/LICENSE\" target=\"_blank\">Apache 2.0.</a></span><br>\r\n        <span>handsontable : <a href=\"https://github.com/handsontable/handsontable/blob/master/LICENSE\" target=\"_blank\">MIT.</a></span>\r\n      </article>\r\n      <article class=\"one_quarter\">\r\n          <h4>DOCS</h4>\r\n          <p>See Demos.</p>\r\n      </article>\r\n      <article class=\"one_quarter\">\r\n        <h4>issues</h4>\r\n        <p>.doc and .ppt files not supported.</p>\r\n      </article>\r\n    </div>\r\n    <!-- ################################################################################################ -->\r\n    <!-- / main body -->\r\n    <div class=\"clear\"></div>\r\n  </main>\r\n</div>\r\n\r\n<div class=\"wrapper row5\">\r\n  <div id=\"copyright\" class=\"hoc clear\"> \r\n    <p class=\"fl_left\">Copyright &copy; 2017 - All Rights Reserved - <a href=\"https://github.com/meshesha/\">Tady Meshesha</a></p>\r\n    <p class=\"fl_right\">Template by <a target=\"_blank\" href=\"http://www.os-templates.com/\" title=\"Free Website Templates\">OS Templates</a></p>\r\n  </div>\r\n</div>\r\n<a id=\"backtotop\" href=\"#top\"><i class=\"fa fa-chevron-up\"></i></a>\r\n<!-- Global site tag (gtag.js) - Google Analytics -->\r\n<script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-119239222-1\"></script>\r\n<script>\r\n  window.dataLayer = window.dataLayer || [];\r\n  function gtag(){dataLayer.push(arguments);}\r\n  gtag('js', new Date());\r\n\r\n  gtag('config', 'UA-119239222-1');\r\n</script>\r\n\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "layout/index.html",
    "content": ""
  },
  {
    "path": "layout/scripts/index.html",
    "content": ""
  },
  {
    "path": "layout/scripts/jquery.backtotop.js",
    "content": "/*\r\nTemplate Name: Epigosha\r\nAuthor: <a href=\"http://www.os-templates.com/\">OS Templates</a>\r\nAuthor URI: http://www.os-templates.com/\r\nLicence: Free to use under our free template licence terms\r\nLicence URI: http://www.os-templates.com/template-terms\r\nFile: Back to Top JS\r\n*/\r\n\r\njQuery(\"#backtotop\").click(function () {\r\n    jQuery(\"body,html\").animate({\r\n        scrollTop: 0\r\n    }, 600);\r\n});\r\njQuery(window).scroll(function () {\r\n    if (jQuery(window).scrollTop() > 150) {\r\n        jQuery(\"#backtotop\").addClass(\"visible\");\r\n    } else {\r\n        jQuery(\"#backtotop\").removeClass(\"visible\");\r\n    }\r\n});"
  },
  {
    "path": "layout/scripts/jquery.mobilemenu.js",
    "content": "/*\r\nTemplate Name: Epigosha\r\nAuthor: <a href=\"http://www.os-templates.com/\">OS Templates</a>\r\nAuthor URI: http://www.os-templates.com/\r\nLicence: Free to use under our free template licence terms\r\nLicence URI: http://www.os-templates.com/template-terms\r\nFile: Mobile Menu JS\r\n\r\nThanks to:\r\n\"Convert a Menu to a Dropdown for Small Screens\" from Chris Collier - http://css-tricks.com/convert-menu-to-dropdown/\r\n\"Submenu's with a dash\" Daryn St. Pierre - http://jsfiddle.net/bloqhead/Kq43X/\r\n*/\r\n\r\n$('<form action=\"#\"><select /></form>').appendTo(\"#mainav\");$(\"<option />\",{selected:\"selected\",value:\"\",text:\"MENU\"}).appendTo(\"#mainav select\");$(\"#mainav a\").each(function(){var e=$(this);if($(e).parents(\"ul ul ul\").length>=1){$(\"<option />\",{value:e.attr(\"href\"),text:\"- - - \"+e.text()}).appendTo(\"#mainav select\")}else if($(e).parents(\"ul ul\").length>=1){$(\"<option />\",{value:e.attr(\"href\"),text:\"- - \"+e.text()}).appendTo(\"#mainav select\")}else if($(e).parents(\"ul\").length>=1){$(\"<option />\",{value:e.attr(\"href\"),text:\"\"+e.text()}).appendTo(\"#mainav select\")}else{$(\"<option />\",{value:e.attr(\"href\"),text:e.text()}).appendTo(\"#mainav select\")}});$(\"#mainav select\").change(function(){if($(this).find(\"option:selected\").val()!==\"#\"){window.location=$(this).find(\"option:selected\").val()}})"
  },
  {
    "path": "layout/styles/fonts/index.html",
    "content": ""
  },
  {
    "path": "layout/styles/framework.css",
    "content": "@charset \"utf-8\";\r\n/*\r\nTemplate Name: Epigosha\r\nAuthor: <a href=\"http://www.os-templates.com/\">OS Templates</a>\r\nAuthor URI: http://www.os-templates.com/\r\nLicence: Free to use under our free template licence terms\r\nLicence URI: http://www.os-templates.com/template-terms\r\nFile: Framework CSS\r\n*/\r\n\r\nhtml{overflow-y:scroll; overflow-x:hidden;} /* overflow-x:hidden; is required to prevent a horizontal scrollbar when using the split box elements */\r\nhtml, body{margin:0; padding:0; font-size:14px; line-height:1.6em;}\r\n\r\n*, *::before, *::after{box-sizing:border-box;}\r\n\r\n.bold{font-weight:bold;}\r\n.center{text-align:center;}\r\n.right{text-align:right;}\r\n.uppercase{text-transform:uppercase;}\r\n.capitalise{text-transform:capitalize;}\r\n.hidden{display:none;}\r\n.nospace{margin:0; padding:0; list-style:none;}\r\n.block{display:block;}\r\n.inline *{display:inline-block;}\r\n.inline *:last-child{margin-right:0;}\r\n.pushright li{margin-right:20px;}\r\n.pushright li:last-child{margin-right:0;}\r\n.borderedbox{border:1px solid;}\r\n.overlay{position:relative; z-index:1;}\r\n.overlay::after{display:block; position:absolute; top:0; left:0; width:100%; height:100%; content:\"\"; z-index:-1;}\r\n.bgded{background-position:top center; background-repeat:no-repeat; background-size:cover;}\r\n.circle{border-radius:50%; background-clip:padding-box;}\r\n\r\n.btn{display:inline-block; padding:15px 25px 17px; text-transform:uppercase; border:1px solid;}\r\n.btn.medium{padding:10px 20px 12px;}\r\n.btn.small{padding:8px 18px 10px; text-transform:none;}\r\n\r\n.split{background-position:top right; background-repeat:no-repeat; background-size:cover;}\r\n.split .box{display:block; position:relative; float:right; width:65%; padding:80px 0 80px 50px;}\r\n.split .box::after{display:block; position:absolute; top:0; right:-1000%; bottom:0; left:100%; content:\"\";}\r\n.split .box.left{float:left; padding-right:50px; padding-left:0;}\r\n.split .box.left::after{left:-1000%; right:100%;}\r\n\r\n.clear, .group{display:block;}\r\n.clear::before, .clear::after, .group::before, .group::after{display:table; content:\"\";}\r\n.clear, .clear::after, .group, .group::after{clear:both;}\r\n\r\na{outline:none; text-decoration:none;}\r\n\r\n.fl_left, .imgl{float:left;}\r\n.fl_right, .imgr{float:right;}\r\n\r\n.imgl{margin:0 15px 10px 0; clear:left;}\r\n.imgr{margin:0 0 10px 15px; clear:right;}\r\n\r\n\r\n/* Fonts\r\n--------------------------------------------------------------------------------------------------------------- */\r\nbody, input, textarea, select{font-family:Verdana, Geneva, sans-serif;}\r\nh1, h2, h3, h4, h5, h6, .heading{font-family:Georgia, \"Times New Roman\", Times, serif;}\r\n\r\n\r\n/* Forms\r\n--------------------------------------------------------------------------------------------------------------- */\r\nform, fieldset, legend{margin:0; padding:0; border:none;}\r\nlegend{display:none;}\r\nlabel, input, textarea, select, button{display:block; resize:none; outline:none; color:inherit; font-size:inherit; font-family:inherit; vertical-align:middle;}\r\nlabel{margin-bottom:5px;}\r\n:required, :invalid{outline:none; box-shadow:none;}\r\n\r\n\r\n/* Generalise\r\n--------------------------------------------------------------------------------------------------------------- */\r\nh1, h2, h3, h4, h5, h6, .heading{margin:0 0 20px 0; font-size:22px; line-height:normal; font-weight:normal; text-transform:capitalize; font-variant:small-caps;}\r\n\r\naddress{font-style:normal; font-weight:normal;}\r\nhr{display:block; width:100%; height:1px; border:solid; border-width:1px 0 0 0;}\r\n\r\n.font-xs{font-size:.8rem;}\r\n.font-x1{font-size:1.2rem;}\r\n.font-x2{font-size:1.8rem; line-height:normal;}\r\n.font-x3{font-size:2.8rem; line-height:normal;}\r\n\r\n.wrapper{display:block; width:100%; margin:0; padding:0; text-align:left; word-wrap:break-word;}\r\n/*\r\nThe \"hoc\" class is a generic class used to centre a containing element horizontally\r\nIt should be used in conjunction with a second class or ID\r\n*/\r\n.hoc{display:block; margin:0 auto;}\r\n\r\n\r\n/* HTML 5 Overrides\r\n--------------------------------------------------------------------------------------------------------------- */\r\naddress, article, aside, figcaption, figure, footer, header, main, nav, section{display:block; margin:0; padding:0;}\r\n\r\n\r\n/* Grid\r\n--------------------------------------------------------------------------------------------------------------- */\r\n.one_half, .one_third, .two_third, .one_quarter, .two_quarter, .three_quarter{display:inline-block; float:left; margin:0 0 0 3.06748466257669%; list-style:none;}\r\n\r\n.first{margin-left:0; clear:left;}\r\n\r\n.one_quarter{width:22.69938650306748%;}\r\n.one_third{width:31.28834355828221%;}\r\n.one_half, .two_quarter{width:48.46625766871166%;}\r\n.two_third{width:65.6441717791411%;}\r\n.three_quarter{width:74.23312883435584%;}\r\n\r\n\r\n/* Spacing\r\n--------------------------------------------------------------------------------------------------------------- */\r\n.btmspace-10{margin-bottom:10px;}\r\n.btmspace-15{margin-bottom:15px;}\r\n.btmspace-30{margin-bottom:30px;}\r\n.btmspace-50{margin-bottom:50px;}\r\n.btmspace-80{margin-bottom:80px;}\r\n\r\n.inspace-5{padding:5px;}\r\n.inspace-10{padding:10px;}\r\n.inspace-15{padding:15px;}\r\n.inspace-30{padding:30px;}\r\n.inspace-50{padding:50px;}\r\n.inspace-80{padding:80px;}"
  },
  {
    "path": "layout/styles/index.html",
    "content": ""
  },
  {
    "path": "layout/styles/layout.css",
    "content": "@charset \"utf-8\";\r\n/*\r\nTemplate Name: Epigosha\r\nAuthor: <a href=\"http://www.os-templates.com/\">OS Templates</a>\r\nAuthor URI: http://www.os-templates.com/\r\nLicence: Free to use under our free template licence terms\r\nLicence URI: http://www.os-templates.com/template-terms\r\nFile: Layout CSS\r\n*/\r\n\r\n@import url(\"fontawesome-4.5.0.min.css\");\r\n@import url(\"framework.css\");\r\n\r\n/* Rows\r\n--------------------------------------------------------------------------------------------------------------- */\r\n.row1{border-bottom:1px solid;}\r\n.row2, .row2 a{}\r\n.row3, .row3 a{}\r\n.row4, .row4 a{}\r\n.row5{border-top:1px solid;}\r\n\r\n\r\n/* Page Intro\r\n--------------------------------------------------------------------------------------------------------------- */\r\n#pageintro .box{padding-top:150px; padding-bottom:150px;}\r\n\r\n#pageintro article{}\r\n#pageintro article .heading{margin-bottom:30px; font-size:36px;}\r\n#pageintro article p{font-size:16px;}\r\n#pageintro article footer{margin-top:50px;}\r\n\r\n\r\n/* Header\r\n--------------------------------------------------------------------------------------------------------------- */\r\n#header{}\r\n\r\n#header #logo{margin:29px 0 0 0;}\r\n#header #logo h1{margin:0; padding:0; font-size:22px; line-height:1; text-transform:uppercase;}\r\n\r\n\r\n/* Content Area\r\n--------------------------------------------------------------------------------------------------------------- */\r\n.container{padding:80px 0;}\r\n\r\n/* Content */\r\n.container .content{}\r\n\r\n#stats{text-align:center;}\r\n#stats li *{margin:0; padding:0;}\r\n#stats li:last-child{margin-bottom:0;}/* Used in mobile devices when elements stack */\r\n#stats li i{margin-bottom:30px;}\r\n#stats li p:first-of-type{margin-bottom:30px; font-size:32px; font-weight:700;}\r\n#stats li p:last-of-type{text-transform:uppercase;}\r\n\r\n.latest{}\r\n.latest figure{display:inline-block; position:relative; max-width:100%; margin-bottom:30px;}\r\n.latest figure figcaption{display:block; position:absolute; top:10px; left:10px; width:60px; height:auto; padding:8px 0; border:1px solid; text-align:center;}\r\n.latest figure figcaption *{display:block; margin:0; padding:0;}\r\n.latest figure figcaption strong{margin-bottom:-5px;}\r\n.latest .heading, .latest p{margin:0; padding:0;}\r\n.latest .heading{margin-bottom:10px;}\r\n.latest p:last-of-type{margin:20px 0 0 0;}\r\n\r\n/* Comments */\r\n#comments ul{margin:0 0 40px 0; padding:0; list-style:none;}\r\n#comments li{margin:0 0 10px 0; padding:15px;}\r\n#comments .avatar{float:right; margin:0 0 10px 10px; padding:3px; border:1px solid;}\r\n#comments address{font-weight:bold;}\r\n#comments time{font-size:smaller;}\r\n#comments .comcont{display:block; margin:0; padding:0;}\r\n#comments .comcont p{margin:10px 5px 10px 0; padding:0;}\r\n\r\n#comments form{display:block; width:100%;}\r\n#comments input, #comments textarea{width:100%; padding:10px; border:1px solid;}\r\n#comments textarea{overflow:auto;}\r\n#comments div{margin-bottom:15px;}\r\n#comments input[type=\"submit\"], #comments input[type=\"reset\"]{display:inline-block; width:auto; min-width:150px; margin:0; padding:8px 5px; cursor:pointer;}\r\n\r\n/* Sidebar */\r\n.container .sidebar{}\r\n\r\n.sidebar .sdb_holder{margin-bottom:50px;}\r\n.sidebar .sdb_holder:last-child{margin-bottom:0;}\r\n\r\n\r\n/* Elements\r\n--------------------------------------------------------------------------------------------------------------- */\r\n#elements{}\r\n\r\n#elements article{display:block; position:relative; min-height:80px; margin:0 0 30px 0; padding:0 0 0 40px;}\r\n#elements article:last-child{margin:0;}\r\n#elements article *{margin:0;}\r\n#elements article i{display:block; position:absolute; top:0; left:0; font-size:24px;}\r\n#elements article .heading{margin-bottom:10px; font-size:1.2rem;}\r\n#elements article p{margin-bottom:10px;}\r\n\r\n\r\n/* CTA - Click To Action\r\n--------------------------------------------------------------------------------------------------------------- */\r\n#cta{text-align:center;}\r\n\r\n#cta *{margin:0;}\r\n#cta .heading{margin-bottom:50px;}\r\n\r\n\r\n/* Footer\r\n--------------------------------------------------------------------------------------------------------------- */\r\n#footer{padding:80px 0 50px;}\r\n\r\n#footer .title{margin:0 0 50px 0; padding:0; font-size:1.2rem;}\r\n\r\n#footer .linklist li{display:block; margin-bottom:15px; padding:0 0 15px 0; border-bottom:1px solid;}\r\n#footer .linklist li:last-child{margin:0; padding:0; border:none;}\r\n#footer .linklist li::before, #footer .linklist li::after{display:table; content:\"\";}\r\n#footer .linklist li, #footer .linklist li::after{clear:both;}\r\n\r\n#footer .contact{}\r\n#footer .contact.linklist li, #footer .contact.linklist li:last-child{position:relative; padding-left:40px;}\r\n#footer .contact li *{margin:0; padding:0; line-height:1.6;}\r\n#footer .contact li i{display:block; position:absolute; top:0; left:0; width:30px; font-size:16px; text-align:center;}\r\n\r\n\r\n/* Copyright\r\n--------------------------------------------------------------------------------------------------------------- */\r\n#copyright{padding:30px 0;}\r\n#copyright *{margin:0; padding:0;}\r\n\r\n\r\n/* Transition Fade\r\n--------------------------------------------------------------------------------------------------------------- \r\n*, *::before, *::after{transition:all .3s ease-in-out;}\r\n#mainav form *{transition:none !important;}\r\n*/\r\n\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n\r\n\r\n/* Navigation\r\n--------------------------------------------------------------------------------------------------------------- */\r\nnav ul, nav ol{margin:0; padding:0; list-style:none;}\r\n\r\n#mainav, #breadcrumb, .sidebar nav{line-height:normal;}\r\n#mainav .drop::after, #mainav li li .drop::after, #breadcrumb li a::after, .sidebar nav a::after{position:absolute; font-family:\"FontAwesome\"; font-size:10px; line-height:10px;}\r\n\r\n/* Top Navigation */\r\n#mainav{}\r\n#mainav ul.clear{}\r\n#mainav ul{text-transform:uppercase;}\r\n#mainav ul ul{z-index:9999; position:absolute; width:180px; text-transform:none;}\r\n#mainav ul ul ul{left:180px; top:0;}\r\n#mainav li{display:inline-block; position:relative; margin:0 15px 0 0; padding:0;}\r\n#mainav li:last-child{margin-right:0;}\r\n#mainav li li{width:100%; margin:0;}\r\n#mainav li a{display:block; padding:30px 0;}\r\n#mainav li li a{border:solid; border-width:0 0 1px 0;}\r\n#mainav .drop{padding-left:15px;}\r\n#mainav li li a, #mainav li li .drop{display:block; margin:0; padding:10px 15px;}\r\n#mainav .drop::after, #mainav li li .drop::after{content:\"\\f0d7\";}\r\n#mainav .drop::after{top:35px; left:5px;}\r\n#mainav li li .drop::after{top:15px; left:5px;}\r\n#mainav ul ul{visibility:hidden; opacity:0;}\r\n#mainav ul li:hover > ul{visibility:visible; opacity:1;}\r\n\r\n#mainav form{display:none; margin:0; padding:0;}\r\n#mainav form select, #mainav form select option{display:block; cursor:pointer; outline:none;}\r\n#mainav form select{width:100%; padding:5px; border:none;}\r\n#mainav form select option{margin:5px; padding:0; border:none;}\r\n\r\n/* Breadcrumb */\r\n#breadcrumb{padding:50px 0 20px;}\r\n#breadcrumb ul{margin:0; padding:0; list-style:none; font-variant:small-caps;}\r\n#breadcrumb li{display:inline-block; margin:0 6px 0 0; padding:0;}\r\n#breadcrumb li a{display:block; position:relative; margin:0; padding:0 12px 0 0; font-size:12px;}\r\n#breadcrumb li a::after{top:3px; right:0; content:\"\\f101\";}\r\n#breadcrumb li:last-child a{margin:0; padding:0;}\r\n#breadcrumb li:last-child a::after{display:none;}\r\n\r\n/* Sidebar Navigation */\r\n.sidebar nav{display:block; width:100%;}\r\n.sidebar nav li{margin:0 0 3px 0; padding:0;}\r\n.sidebar nav a{display:block; position:relative; margin:0; padding:5px 10px 5px 15px; text-decoration:none; border:solid; border-width:0 0 1px 0;}\r\n.sidebar nav a::after{top:9px; left:5px; content:\"\\f101\";}\r\n.sidebar nav ul ul a{padding-left:35px;}\r\n.sidebar nav ul ul a::after{left:25px;}\r\n.sidebar nav ul ul ul a{padding-left:55px;}\r\n.sidebar nav ul ul ul a::after{left:45px;}\r\n\r\n/* Pagination */\r\n.pagination{display:block; width:100%; text-align:center; clear:both;}\r\n.pagination li{display:inline-block; margin:0 2px 0 0;}\r\n.pagination li:last-child{margin-right:0;}\r\n.pagination a, .pagination strong{display:block; padding:8px 11px; border:1px solid; background-clip:padding-box; font-weight:normal;}\r\n\r\n/* Back to Top */\r\n#backtotop{z-index:999; display:inline-block; position:fixed; visibility:hidden; bottom:20px; right:20px; width:36px; height:36px; line-height:36px; font-size:16px; text-align:center; opacity:.2;}\r\n#backtotop i{display:block; width:100%; height:100%; line-height:inherit;}\r\n#backtotop.visible{visibility:visible; opacity:.5;}\r\n#backtotop:hover{opacity:1;}\r\n\r\n\r\n/* Tables\r\n--------------------------------------------------------------------------------------------------------------- */\r\ntable, th, td{border:1px solid; border-collapse:collapse; vertical-align:top;}\r\ntable, th{table-layout:auto;}\r\ntable{width:100%; margin-bottom:15px;}\r\nth, td{padding:5px 8px;}\r\ntd{border-width:0 1px;}\r\n\r\n\r\n/* Gallery\r\n--------------------------------------------------------------------------------------------------------------- */\r\n#gallery{display:block; width:100%; margin-bottom:50px;}\r\n#gallery figure figcaption{display:block; width:100%; clear:both;}\r\n#gallery li{margin-bottom:30px;}\r\n\r\n\r\n/* Font Awesome Social Icons\r\n--------------------------------------------------------------------------------------------------------------- */\r\n.faico{margin:0; padding:0; list-style:none;}\r\n.faico li{display:inline-block; margin:8px 5px 0 0; padding:0; line-height:normal;}\r\n.faico li:last-child{margin-right:0;}\r\n.faico a{display:inline-block; width:36px; height:36px; line-height:36px; font-size:18px; text-align:center;}\r\n\r\n.faico a{color:#050505; background-color:#0F84AA;}\r\n.faico a:hover{color:#FFFFFF;}\r\n\r\n.faicon-dribble:hover{background-color:#EA4C89;}\r\n.faicon-facebook:hover{background-color:#3B5998;}\r\n.faicon-google-plus:hover{background-color:#DB4A39;}\r\n.faicon-linkedin:hover{background-color:#0E76A8;}\r\n.faicon-twitter:hover{background-color:#00ACEE;}\r\n.faicon-vk:hover{background-color:#4E658E;}\r\n\r\n\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n\r\n\r\n/* Colours\r\n--------------------------------------------------------------------------------------------------------------- */\r\nbody{color:#FFFFFF; background-color:#232323;}\r\na{color:#0F84AA;}\r\na:active, a:focus{background:transparent;}/* IE10 + 11 Bugfix - prevents grey background */\r\nhr, .borderedbox{border-color:#D7D7D7;}\r\nlabel span{color:#FF0000; background-color:inherit;}\r\ninput:focus, textarea:focus, *:required:focus{border-color:#0F84AA;}\r\n.overlay{color:#FFFFFF; background-color:inherit;}\r\n.overlay::after{color:inherit; background-color:rgba(0,0,0,.55);}\r\n\r\n.btn, .btn.inverse:hover{color:#FFFFFF; background-color:#0F84AA; border-color:#0F84AA;}\r\n.btn:hover, .btn.inverse{color:inherit; background-color:transparent; border-color:inherit;}\r\n\r\n.split .box, .split .box::after{color:#9B9B9B; background-color:rgba(35,35,35,.8);/* #232323 */}\r\n.split .box.bg-light, .split .box.bg-light::after{color:#232323; background-color:rgba(250,250,250,.85);/* #FAFAFA */}\r\n.split .box.bg-coloured, .split .box.bg-coloured::after{color:#FFFFFF; background-color:rgba(15,132,170,.65);/* #0F84AA */}\r\n\r\n\r\n/* Rows */\r\n.row1{color:#232323; background-color:#FAFAFA; border-color:#EBEBEB;}\r\n.row2{color:#232323; background-color:#EBEBEB;}\r\n.row3{color:#232323; background-color:#FFFFFF;}\r\n.row4{color:#9B9B9B; background-color:#232323;}\r\n.row5, .row5 a{color:#9B9B9B; background-color:#232323;}\r\n.row5{border-color:#404040;}\r\n\r\n\r\n/* Header */\r\n#header #logo a{color:inherit;}\r\n\r\n\r\n/* Content Area */\r\n.latest figure figcaption{color:#FFFFFF; background-color:rgba(0,0,0,.2); border-color:#FFFFFF;}\r\n\r\n\r\n/* Footer */\r\n#footer .title{color:#FFFFFF;}\r\n#footer .linklist li{border-color:#404040;}\r\n\r\n\r\n/* Navigation */\r\n#mainav li a{color:inherit;}\r\n#mainav .active a, #mainav a:hover, #mainav li:hover > a{color:#0F84AA; background-color:inherit;}\r\n#mainav li li a, #mainav .active li a{color:#FFFFFF; background-color:rgba(0,0,0,.6); border-color:rgba(0,0,0,.6);}\r\n#mainav li li:hover > a, #mainav .active .active > a{color:#FFFFFF; background-color:#0F84AA;}\r\n#mainav form select{color:#232323; background-color:#EBEBEB;}\r\n\r\n#breadcrumb a{color:inherit; background-color:inherit;}\r\n#breadcrumb li:last-child a{color:#0F84AA;}\r\n\r\n.container .sidebar nav a{color:inherit; border-color:#D7D7D7;}\r\n.container .sidebar nav a:hover{color:#0F84AA;}\r\n.container .sidebar .active a, .container .sidebar a:hover, .container .sidebar li:hover > a{color:#0F84AA; background-color:inherit;}\r\n\r\n.pagination a, .pagination strong{border-color:#D7D7D7;}\r\n.pagination .current *{color:#FFFFFF; background-color:#0F84AA;}\r\n\r\n#backtotop{color:#FFFFFF; background-color:#0F84AA;}\r\n\r\n\r\n/* Tables + Comments */\r\ntable, th, td, #comments .avatar, #comments input, #comments textarea{border-color:#D7D7D7;}\r\n#comments input:focus, #comments textarea:focus, #comments *:required:focus{border-color:#0F84AA;}\r\nth{color:#FFFFFF; background-color:#373737;}\r\ntr, #comments li, #comments input[type=\"submit\"], #comments input[type=\"reset\"]{color:inherit; background-color:#FBFBFB;}\r\ntr:nth-child(even), #comments li:nth-child(even){color:inherit; background-color:#F7F7F7;}\r\ntable a, #comments a{background-color:inherit;}\r\n\r\n\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n/* ------------------------------------------------------------------------------------------------------------ */\r\n\r\n\r\n/* Media Queries\r\n--------------------------------------------------------------------------------------------------------------- */\r\n@-ms-viewport{width:device-width;}\r\n\r\n\r\n/* Max Wrapper Width - Laptop, Desktop etc.\r\n--------------------------------------------------------------------------------------------------------------- */\r\n@media screen and (min-width:978px){\r\n\t.hoc{max-width:978px;}\r\n}\r\n\r\n\r\n/* Mobile Devices\r\n--------------------------------------------------------------------------------------------------------------- */\r\n@media screen and (max-width:900px){\r\n\t.hoc{max-width:90%;}\r\n\r\n\t#header{padding:30px 0;}\r\n\t#header #logo{margin:7px 0 0 0;}\r\n\r\n\t#mainav{}\r\n\t#mainav ul{display:none;}\r\n\t#mainav form{display:block;}\r\n\r\n\t#breadcrumb{}\r\n\r\n\t.container{}\r\n\t#comments input[type=\"reset\"]{margin-top:10px;}\r\n\t.pagination li{display:inline-block; margin:0 5px 5px 0;}\r\n\r\n\t#footer{}\r\n\r\n\t#copyright{}\r\n\t#copyright p:first-of-type{margin-bottom:10px;}\r\n}\r\n\r\n\r\n@media screen and (max-width:750px){\r\n\t.imgl, .imgr{display:inline-block; float:none; margin:0 0 10px 0;}\r\n\t.fl_left, .fl_right{display:block; float:none;}\r\n\t.one_half, .one_third, .two_third, .one_quarter, .two_quarter, .three_quarter{display:block; float:none; width:auto; margin:0 0 30px 0; padding:0;}\r\n\r\n\t#header{text-align:center;}\r\n\t#header #logo{margin:0 0 15px 0;}\r\n}\r\n\r\n\r\n/* Other\r\n--------------------------------------------------------------------------------------------------------------- */\r\n@media screen and (max-width:650px){\r\n\t.scrollable{display:block; width:100%; margin:0 0 30px 0; padding:0 0 15px 0; overflow:auto; overflow-x:scroll;}\r\n\t.scrollable table{margin:0; padding:0; white-space:nowrap;}\r\n\r\n\t.inline li{display:block; margin-bottom:10px;}\r\n\t.pushright li{margin-right:0;}\r\n\r\n\t.hoc.split{max-width:none; width:100%;}\r\n\t.split .box, .split .box.left{float:none; width:100%; padding:5%;}\r\n\r\n\t.font-x2{font-size:1.4rem;}\r\n\t.font-x3{font-size:1.6rem;}\r\n\r\n\t#pageintro .box{padding:100px 5%;}\r\n}"
  },
  {
    "path": "officeToHtml.css",
    "content": "﻿.wbSheets_clas {\r\n  position: relative;\r\n  padding: 1em;\r\n  border: 1px solid #ccc;\r\n  border-radius: 5px;\r\n}\r\n.wbSheets_clas .ui-tabs-nav {\r\n  position: absolute;\r\n  left: 0.25em;\r\n  right: 0.25em;\r\n  bottom: 0.25em;\r\n  padding: 0em 0.2em 0.2em;\r\n}\r\n.wbSheets_clas .ui-tabs-nav li {\r\n  border-top: none;\r\n  border-bottom: 1px solid #ccc;\r\n  -moz-border-radius: 0px 0px 4px 4px;\r\n  -webkit-border-radius: 0px 0px 4px 4px;\r\n  border-radius: 0px 0px 4px 4px;\r\n}\r\n.wbSheets_clas .ui-tabs-nav li.ui-tabs-selected,\r\n.wbSheets_clas .ui-tabs-nav li.ui-state-active {\r\n  top: -1px;\r\n}\r\n.wbSheets_clas_ul {\r\n  text-align: center;\r\n  list-style: none;\r\n  margin: 200px 0 20px;\r\n  line-height: 35px;\r\n  height: 37px;\r\n  overflow: hidden;\r\n  font-size: 12px;\r\n  position: absolute;\r\n  left: 0.25em;\r\n  right: 0.25em;\r\n  bottom: 0.25em;\r\n  padding: 0em 0.2em 0.2em;\r\n  z-index: 1000;\r\n}\r\n\r\n.wbSheets_clas_ul li {\r\n  border: 1px solid #aaa;\r\n  background: #d1d1d1;\r\n  background: linear-gradient(top, #ececec 50%, #d1d1d1 100%);\r\n  display: inline-block;\r\n  position: relative;\r\n  z-index: 0;\r\n  border-bottom-left-radius: 6px;\r\n  border-bottom-right-radius: 6px;\r\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4), inset 0 1px 0 #fff;\r\n  text-shadow: 0 1px #fff;\r\n  margin: 0 -5px;\r\n  padding: 0 30px;\r\n}\r\n\r\n.wbSheets_clas_ul a {\r\n  color: #555;\r\n  text-decoration: none;\r\n}\r\n\r\n.wbSheets_clas_ul li.selected {\r\n  background: #fff;\r\n  color: #333;\r\n  z-index: 2;\r\n  border-top-color: #fff;\r\n}\r\n\r\n.wbSheets_clas_ul:before {\r\n  position: absolute;\r\n  content: \"\";\r\n  width: 100%;\r\n  top: 0;\r\n  left: 0;\r\n  border-top: 1px solid #aaa;\r\n  z-index: 1;\r\n}\r\n\r\n.wbSheets_clas_ul li:before,\r\n.wbSheets_clas_ul li:after {\r\n  border: 1px solid #aaa;\r\n  position: absolute;\r\n  top: -1px;\r\n  width: 6px;\r\n  height: 6px;\r\n  content: \"\";\r\n}\r\n\r\n.wbSheets_clas_ul li:before {\r\n  left: -7px;\r\n  border-top-right-radius: 6px;\r\n  border-width: 1px 1px 0px 0px;\r\n  box-shadow: 2px 0px 0 #ececec;\r\n}\r\n\r\n.wbSheets_clas_ul li:after {\r\n  right: -7px;\r\n  border-top-left-radius: 6px;\r\n  border-width: 1px 0px 0px 1px;\r\n  box-shadow: -2px 0px 0 #ececec;\r\n}\r\n\r\n.wbSheets_clas_ul li.selected:before {\r\n  box-shadow: 2px 0px 0 #fff;\r\n}\r\n\r\n.wbSheets_clas_ul li.selected:after {\r\n  box-shadow: -2px 0px 0 #fff;\r\n}\r\n#wbSheets_search_warpper{\r\n  padding: 10px;\r\n}"
  },
  {
    "path": "officeToHtml.js",
    "content": "﻿/**\r\n * officeToHtml.js\r\n * Ver. : 1.2.1\r\n * last update: 15/02/2019\r\n * Author: meshesha , https://github.com/meshesha\r\n * LICENSE: MIT\r\n * url:https://officetohtml.js.org/\r\n */\r\n(function ($) {\r\n    $.event.special.destroyed = {\r\n        remove: function (o) {\r\n            if (o.handler) {\r\n                o.handler()\r\n            }\r\n        }\r\n    }\r\n    $.fn.officeToHtml = function (options) {\r\n        var $result = $(this);\r\n        var divId = $result.attr(\"id\");\r\n        var defaults = {\r\n            // These are the defaults.\r\n            url: \"\",\r\n            inputObjId: \"\",\r\n            pdfSetting: {\r\n                thumbnailViewBtn: true,\r\n                searchBtn: true,\r\n                nextPreviousBtn: true,\r\n                pageNumberTxt: true,\r\n                totalPagesLabel: true,\r\n                zoomBtns: true,\r\n                scaleSelector: true,\r\n                presantationModeBtn: true,\r\n                openFileBtn: true,\r\n                printBtn: true,\r\n                downloadBtn: true,\r\n                bookmarkBtn: true,\r\n                secondaryToolbarBtn: true,\r\n                firstPageBtn: true,\r\n                lastPageBtn: true,\r\n                pageRotateCwBtn: true,\r\n                pageRotateCcwBtn: true,\r\n                cursorSelectTextToolbarBtn: true,\r\n                cursorHandToolbarBtn: true,\r\n                setLang: \"\",\r\n                setLangFilesPath: \"\"\r\n            },\r\n            docxSetting: {\r\n                styleMap: null,\r\n                includeEmbeddedStyleMap: true,\r\n                includeDefaultStyleMap: true,\r\n                convertImage: null,\r\n                ignoreEmptyParagraphs: false,\r\n                idPrefix: \"\",\r\n                isRtl: \"auto\"\r\n            },\r\n            pptxSetting: {\r\n                slidesScale: \"\", //Change Slides scale by percent\r\n                slideMode: true /** true,false*/,\r\n                keyBoardShortCut: false /** true,false ,condition: slideMode: true*/,\r\n                mediaProcess: true /** true,false: if true then process video and audio files */,\r\n                jsZipV2: false,\r\n                slideModeConfig: {\r\n                    first: 1,\r\n                    nav: true /** true,false : show or not nav buttons*/,\r\n                    navTxtColor: \"black\" /** color */,\r\n                    keyBoardShortCut: true /** true,false ,condition: */,\r\n                    showSlideNum: true /** true,false */,\r\n                    showTotalSlideNum: true /** true,false */,\r\n                    autoSlide: 1 /** false or seconds , F8 to active ,keyBoardShortCut: true */,\r\n                    randomAutoSlide: false /** true,false ,autoSlide: > 1 */,\r\n                    loop: false /** true,false */,\r\n                    background: false /** false or color*/,\r\n                    transition:\r\n                        \"default\" /** transition type: \"slid\",\"fade\",\"default\",\"random\" , to show transition efects :transitionTime > 0.5 */,\r\n                    transitionTime: 1 /** transition time between slides in seconds */\r\n                }\r\n            },\r\n            sheetSetting: {\r\n                jqueryui: false,\r\n                activeHeaderClassName: \"\",\r\n                allowEmpty: true,\r\n                autoColumnSize: true,\r\n                autoRowSize: false,\r\n                columns: false,\r\n                columnSorting: true,\r\n                contextMenu: false,\r\n                copyable: true,\r\n                customBorders: false,\r\n                fixedColumnsLeft: 0,\r\n                fixedRowsTop: 0,\r\n                language: \"en-US\",\r\n                search: false,\r\n                selectionMode: \"single\",\r\n                sortIndicator: false,\r\n                readOnly: false,\r\n                startRows: 1,\r\n                startCols: 1,\r\n                rowHeaders: true,\r\n                colHeaders: true,\r\n                width: false,\r\n                height: false\r\n            },\r\n            imageSetting: {\r\n                frame: [\"100%\", \"100%\", false],\r\n                maxZoom: \"900%\",\r\n                zoomFactor: \"10%\",\r\n                mouse: true,\r\n                keyboard: true,\r\n                toolbar: true,\r\n                rotateToolbar: false\r\n            }\r\n        };\r\n        var settings = $.extend(true, {}, defaults, options);\r\n        //1.get file memeType\r\n        //2.load all js file needed to read the file\r\n        var file = settings.url;\r\n        var inputId = settings.inputObjId;\r\n        var fileObj = null;\r\n        //var pdfScale = settings.pdfScale;\r\n\r\n        $(\"#\" + divId).addClass(\"main_officejs_container\");\r\n\r\n        if (file != \"\") {\r\n            fileObj = {\r\n                Obj: file,\r\n                ext: file.split('.').pop().toLowerCase()\r\n            }\r\n            getContent(fileObj, divId, settings.pdfSetting, settings.docxSetting, settings.pptxSetting, settings.sheetSetting, settings.imageSetting);\r\n        }\r\n        if (inputId != \"\") {\r\n            //TODO\r\n            $(\"#\" + inputId).on(\"change\", function (e) {\r\n                //var inputFileObj = $(this)[0].files[0];\r\n                var inputFileObj = e.target.files[0];\r\n                if (inputFileObj !== undefined) {\r\n                    var fName = inputFileObj.name;\r\n                    fileBlob = URL.createObjectURL(inputFileObj);\r\n                    fileObj = {\r\n                        Obj: fileBlob,\r\n                        ext: fName.split('.').pop().toLowerCase()\r\n                    }\r\n                }\r\n                getContent(fileObj, divId, settings.pdfSetting, settings.docxSetting, settings.pptxSetting, settings.sheetSetting, settings.imageSetting);\r\n            });\r\n        }\r\n    }\r\n    function getContent(fObj, divId, pdfSet, docxSet, pptxSet, sheetSet, imgSet) {\r\n        var ext = fObj.ext;\r\n        var file = fObj.file;\r\n        switch (ext) {\r\n            case \"pdf\":\r\n                //handel pdf file (https://mozilla.github.io/pdf.js/) -- V\r\n                getPdfContent(fObj, divId, pdfSet);\r\n                break;\r\n            case \"docx\":\r\n                //handel docx (https://github.com/mwilliamson/mammoth.js) -- V\r\n                getDocxContent(fObj, divId, docxSet);\r\n                break;\r\n            case \"doc\":\r\n                //handel doc file () -- X\r\n                getDocContent(fObj, divId, docxSet);\r\n                break;\r\n            case \"pptx\":\r\n                //handel pptx file (https://meshesha.github.io/pptxjs/) -- V\r\n                getPptxContent(fObj, divId, pptxSet);\r\n                break;\r\n            case \"ppt\":\r\n                //handel ppt file () -- X\r\n                getPptContent(fObj, divId, pptxSet);\r\n                break;\r\n            case \"xlsx\":\r\n            case \"xls\":\r\n            case \"xlw\":\r\n            case \"xlsb\":\r\n            case \"xlsm\":\r\n            case \"csv\":\r\n            case \"dbf\":\r\n            case \"dif\":\r\n            case \"slk\":\r\n            case \"sylk\":\r\n            case \"prn\":\r\n            case \"ods\":\r\n            case \"fods\":\r\n                //handel sheet file (https://github.com/sheetjs/js-xlsx) -- V\r\n                getSheetContent(fObj, divId, sheetSet);\r\n                break;\r\n            case \"gif\":\r\n            case \"jpg\":\r\n            case \"jpeg\":\r\n            case \"bmp\":\r\n            case \"tiff\":\r\n            case \"tif\":\r\n            case \"png\":\r\n            case \"svg\":\r\n                //handel imge  -- V\r\n                getImgContent(fObj, divId, imgSet);\r\n                break;\r\n            default:\r\n                unknownMsg(divId);\r\n        }\r\n        return\r\n    }\r\n    /////////////////////////////////////////////////PDF//////////////////////////////////////////\r\n    function getPdfContent(fObj, divId, pdfSet) {\r\n        $(\"#\" + divId).html(\"\");\r\n        //console.log(pdfSet)\r\n        //bug to fix : add to <html> dir if not exists- TODO\r\n        //var htmldir = $(\"html\").attr(\"dir\");\r\n        //console.log(htmldir)\r\n        var thumbnailViewOpt = (pdfSet.thumbnailViewBtn) ? \"\" : \"hidden\",\r\n            searchOpt = (pdfSet.searchBtn) ? \"\" : \"hidden\",\r\n            nextPreviousOpt = (pdfSet.nextPreviousBtn) ? \"\" : \"hidden\",\r\n            pageNumberOpt = (pdfSet.pageNumberTxt) ? \"\" : \"hidden\",\r\n            totalPagesOpt = (pdfSet.totalPagesLabel) ? \"\" : \"hidden\",\r\n            zoomOpt = (pdfSet.zoomBtns) ? \"\" : \"hidden\",\r\n            scaleSelectOpt = (pdfSet.scaleSelector) ? \"\" : \"hidden\",\r\n            presentationModeOpt = (pdfSet.presantationModeBtn) ? \"\" : \"hidden\",\r\n            openFileOpt = (pdfSet.openFileBtn) ? \"\" : \"hidden\",\r\n            printOpt = (pdfSet.printBtn) ? \"\" : \"hidden\",\r\n            downloadOpt = (pdfSet.downloadBtn) ? \"\" : \"hidden\",\r\n            bookmarkOpt = (pdfSet.bookmarkBtn) ? \"\" : \"hidden\",\r\n            secondaryToolbarOpt = (pdfSet.secondaryToolbarBtn) ? \"\" : \"hidden\",\r\n            firstPageOpt = (pdfSet.firstPageBtn) ? \"\" : \"hidden\",\r\n            lastPageOpt = (pdfSet.lastPageBtn) ? \"\" : \"hidden\",\r\n            pageRotateCwOpt = (pdfSet.pageRotateCwBtn) ? \"\" : \"hidden\",\r\n            pageRotateCcwOpt = (pdfSet.pageRotateCcwBtn) ? \"\" : \"hidden\",\r\n            cursorSelectTextOpt = (pdfSet.cursorSelectTextToolbarBtn) ? \"\" : \"hidden\",\r\n            cursorHandOpt = (pdfSet.cursorHandToolbarBtn) ? \"\" : \"hidden\";\r\n        setLang = pdfSet.setLang;\r\n        setLangFilesPath = pdfSet.setLangFilesPath;\r\n        ////////////////////////////////////////////\r\n        $(\"<div></div>\", {\r\n            class: \"loadingInProgress\",\r\n            id: \"mainPdfWarrper\"\r\n        }).appendTo('div#' + divId);\r\n        ////////////////////////////////////////////\r\n        $(\"<div></div>\", {\r\n            id: \"outerContainer\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress\");\r\n\r\n        $(\"<div></div>\", {\r\n            id: \"printContainer\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress\");\r\n        ///////////////////////////////////////////////////////\r\n        $(\"<div></div>\", {\r\n            id: \"sidebarContainer\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer\");\r\n\r\n        $(\"<div></div>\", {\r\n            id: \"mainContainer\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer\");\r\n\r\n        $(\"<div></div>\", {\r\n            id: \"overlayContainer\",\r\n            class: \"hidden\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer\");\r\n        ///////////////////////////////////////////////////////\r\n        $(\"<div></div>\", {\r\n            id: \"toolbarSidebar\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer\");\r\n\r\n        $(\"<div></div>\", {\r\n            id: \"sidebarContent\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer\");\r\n        ///////////////////////////////////////////////////////\r\n        $(\"<div></div>\", {\r\n            class: \"splitToolbarButton toggled\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar\");\r\n        ///////////////////////////////////////////////////////\r\n        $(\"<button></button>\", {\r\n            id: \"viewThumbnail\",\r\n            class: \"toolbarButton toggled\",\r\n            title: \"Show Thumbnails\",\r\n            tabindex: \"2\",\r\n            \"data-l10n-id\": \"thumbs\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"thumbs_label\",\r\n            text: \"Thumbnails\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton #viewThumbnail\");\r\n\r\n\r\n        $(\"<button></button>\", {\r\n            id: \"viewOutline\",\r\n            class: \"toolbarButton\",\r\n            title: \"Show Document Outline (double-click to expand/collapse all items)\",\r\n            tabindex: \"3\",\r\n            \"data-l10n-id\": \"document_outline\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"document_outline_label\",\r\n            text: \"Document Outline\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton #viewOutline\");\r\n\r\n\r\n        $(\"<button></button>\", {\r\n            id: \"viewAttachments\",\r\n            class: \"toolbarButton\",\r\n            title: \"Show Attachments\",\r\n            tabindex: \"4\",\r\n            \"data-l10n-id\": \"attachments\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"attachments_label\",\r\n            text: \"Attachments\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton #viewAttachments\");\r\n        ///////////////////////////////////////////////////////////////////////////////////////////\r\n        $(\"<div></div>\", {\r\n            id: \"thumbnailView\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #sidebarContent\");\r\n        $(\"<div></div>\", {\r\n            id: \"outlineView\",\r\n            class: \"hidden\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #sidebarContent\");\r\n        $(\"<div></div>\", {\r\n            id: \"attachmentsView\",\r\n            class: \"hidden\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #sidebarContent\");\r\n        ////////////////////////////////////////////////////////////////////////////////////////////////\r\n        $(\"<div></div>\", {\r\n            id: \"findbar\",\r\n            class: \"findbar hidden doorHanger\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\r\n        $(\"<div></div>\", {\r\n            id: \"findbarInputContainer\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar\");\r\n\r\n        $(\"<input></input>\", {\r\n            id: \"findInput\",\r\n            class: \"toolbarField\",\r\n            title: \"Find\",\r\n            placeholder: \"Find in document…\",\r\n            tabindex: \"91\",\r\n            \"data-l10n-id\": \"find_input\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer\");\r\n        $(\"<div></div>\", {\r\n            class: \"splitToolbarButton\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer\");\r\n        $(\"<button></button>\", {\r\n            id: \"findPrevious\",\r\n            class: \"toolbarButton findPrevious\",\r\n            title: \"Find the previous occurrence of the phrase\",\r\n            tabindex: \"92\",\r\n            \"data-l10n-id\": \"find_previous\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer .splitToolbarButton\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"find_previous_label\",\r\n            text: \"Previous\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer .splitToolbarButton #findPrevious\");\r\n        $(\"<div></div>\", {\r\n            class: \"splitToolbarButtonSeparator\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer .splitToolbarButton\");\r\n        $(\"<button></button>\", {\r\n            id: \"findNext\",\r\n            class: \"toolbarButton findNext\",\r\n            title: \"Find the next occurrence of the phrase\",\r\n            tabindex: \"93\",\r\n            \"data-l10n-id\": \"find_next\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer .splitToolbarButton\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"find_next_label\",\r\n            text: \"Next\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer .splitToolbarButton #findNext\");\r\n\r\n        $(\"<div></div>\", {\r\n            id: \"findbarOptionsContainer\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar\");\r\n        $(\"<input></input>\", {\r\n            id: \"findHighlightAll\",\r\n            type: \"checkbox\",\r\n            class: \"toolbarField\",\r\n            tabindex: \"94\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarOptionsContainer\");\r\n        $(\"<label></label>\", {\r\n            for: \"findHighlightAll\",\r\n            class: \"toolbarLabel\",\r\n            \"data-l10n-id\": \"find_highlight\",\r\n            text: \"Highlight all\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarOptionsContainer\");\r\n        $(\"<input></input>\", {\r\n            id: \"findMatchCase\",\r\n            type: \"checkbox\",\r\n            class: \"toolbarField\",\r\n            tabindex: \"95\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarOptionsContainer\");\r\n        $(\"<label></label>\", {\r\n            for: \"findMatchCase\",\r\n            class: \"toolbarLabel\",\r\n            \"data-l10n-id\": \"find_match_case_label\",\r\n            text: \"Match case\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarOptionsContainer\");\r\n        $(\"<span></span>\", {\r\n            id: \"findResultsCount\",\r\n            class: \"toolbarLabel hidden\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarOptionsContainer\");\r\n\r\n\r\n        $(\"<div></div>\", {\r\n            id: \"findbarMessageContainer\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar\");\r\n        $(\"<span></span>\", {\r\n            id: \"findMsg\",\r\n            class: \"toolbarLabel\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarMessageContainer\");\r\n\r\n        $(\"<div></div>\", {\r\n            id: \"secondaryToolbar\",\r\n            class: \"secondaryToolbar hidden doorHangerRight\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\r\n        $(\"<div></div>\", {\r\n            id: \"secondaryToolbarButtonContainer\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar\");\r\n        $(\"<button></button>\", {\r\n            id: \"secondaryPresentationMode\",\r\n            class: \"secondaryToolbarButton presentationMode visibleLargeView\",\r\n            title: \"Switch to Presentation Mode\",\r\n            tabindex: \"51\",\r\n            \"data-l10n-id\": \"presentation_mode\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"presentation_mode_label\",\r\n            text: \"Presentation Mode\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #secondaryPresentationMode\");\r\n\r\n        $(\"<button></button>\", {\r\n            id: \"secondaryOpenFile\",\r\n            class: \"secondaryToolbarButton openFile visibleLargeView\",\r\n            title: \"Open File\",\r\n            tabindex: \"52\",\r\n            \"data-l10n-id\": \"open_file\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"open_file_label\",\r\n            text: \"Open\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #secondaryOpenFile\");\r\n\r\n        $(\"<button></button>\", {\r\n            id: \"secondaryPrint\",\r\n            class: \"secondaryToolbarButton print visibleMediumView\",\r\n            title: \"Print\",\r\n            tabindex: \"53\",\r\n            \"data-l10n-id\": \"print\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"print_label\",\r\n            text: \"Print\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #secondaryPrint\");\r\n\r\n        $(\"<button></button>\", {\r\n            id: \"secondaryDownload\",\r\n            class: \"secondaryToolbarButton download visibleMediumView\",\r\n            title: \"Download\",\r\n            tabindex: \"54\",\r\n            \"data-l10n-id\": \"download\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"download_label\",\r\n            text: \"Download\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #secondaryDownload\");\r\n        $(\"<a></a>\", {\r\n            href: \"#\",\r\n            id: \"secondaryViewBookmark\",\r\n            class: \"secondaryToolbarButton bookmark visibleSmallView\",\r\n            title: \"Current view (copy or open in new window)\",\r\n            tabindex: \"55\",\r\n            \"data-l10n-id\": \"bookmark\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"bookmark_label\",\r\n            text: \"Current View\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #secondaryViewBookmark\");\r\n\r\n        $(\"<div></div>\", {\r\n            class: \"horizontalToolbarSeparator visibleLargeView\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\r\n        $(\"<button></button>\", {\r\n            id: \"firstPage\",\r\n            class: \"secondaryToolbarButton firstPage \" + firstPageOpt,\r\n            title: \"Go to First Page\",\r\n            tabindex: \"56\",\r\n            \"data-l10n-id\": \"first_page\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"first_page_label\",\r\n            text: \"Go to First Page\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #firstPage\");\r\n\r\n        $(\"<button></button>\", {\r\n            id: \"lastPage\",\r\n            class: \"secondaryToolbarButton lastPage \" + lastPageOpt,\r\n            title: \"Go to Last Page\",\r\n            tabindex: \"57\",\r\n            \"data-l10n-id\": \"last_page\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"last_page_label\",\r\n            text: \"Go to Last Page\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #lastPage\");\r\n        $(\"<div></div>\", {\r\n            class: \"horizontalToolbarSeparator\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\r\n        $(\"<button></button>\", {\r\n            id: \"pageRotateCw\",\r\n            class: \"secondaryToolbarButton rotateCw \" + pageRotateCwOpt,\r\n            title: \"Rotate Clockwise\",\r\n            tabindex: \"58\",\r\n            \"data-l10n-id\": \"page_rotate_cw\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"page_rotate_cw_label\",\r\n            text: \"Rotate Clockwise\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #pageRotateCw\");\r\n\r\n        $(\"<button></button>\", {\r\n            id: \"pageRotateCcw\",\r\n            class: \"secondaryToolbarButton rotateCcw \" + pageRotateCcwOpt,\r\n            title: \"Rotate Counterclockwise\",\r\n            tabindex: \"59\",\r\n            \"data-l10n-id\": \"page_rotate_ccw\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"page_rotate_ccw_label\",\r\n            text: \"Rotate Counterclockwise\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #pageRotateCcw\");\r\n\r\n        $(\"<div></div>\", {\r\n            class: \"horizontalToolbarSeparator\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\r\n\r\n        $(\"<button></button>\", {\r\n            id: \"cursorSelectTool\",\r\n            class: \"secondaryToolbarButton selectTool toggled \" + cursorSelectTextOpt,\r\n            title: \"Enable Text Selection Tool\",\r\n            tabindex: \"60\",\r\n            \"data-l10n-id\": \"cursor_text_select_tool\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"cursor_text_select_tool_label\",\r\n            text: \"Text Selection Tool\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #cursorSelectTool\");\r\n\r\n        $(\"<button></button>\", {\r\n            id: \"cursorHandTool\",\r\n            class: \"secondaryToolbarButton handTool \" + cursorHandOpt,\r\n            title: \"Enable Hand Tool\",\r\n            tabindex: \"61\",\r\n            \"data-l10n-id\": \"cursor_hand_tool\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"cursor_hand_tool_label\",\r\n            text: \"Hand Tool\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #cursorHandTool\");\r\n\r\n        $(\"<div></div>\", {\r\n            class: \"horizontalToolbarSeparator hidden\"\r\n        }).appendTo(\"div#\" + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\r\n\r\n        $(\"<button></button>\", {\r\n            id: \"pdfDocumentProperties\",\r\n            class: \"secondaryToolbarButton pdfDocumentProperties hidden\",\r\n            title: \"Document Properties…\",\r\n            tabindex: \"62\",\r\n            \"data-l10n-id\": \"document_properties\"\r\n        }).appendTo(\"div#\" + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"document_properties_label\",\r\n            text: \"Document Properties…\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #pdfDocumentProperties\");\r\n\r\n        $(\"<div></div>\", {\r\n            class: \"toolbar\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\r\n        $(\"<div></div>\", {\r\n            id: \"toolbarContainer\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar\");\r\n        $(\"<div></div>\", {\r\n            id: \"toolbarViewer\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer\");\r\n        $(\"<div></div>\", {\r\n            id: \"toolbarViewerLeft\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer\");\r\n        $(\"<button></button>\", {\r\n            id: \"sidebarToggle\",\r\n            class: \"toolbarButton \" + thumbnailViewOpt,\r\n            title: \"Toggle Sidebar\",\r\n            tabindex: \"11\",\r\n            \"data-l10n-id\": \"toggle_sidebar\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"toggle_sidebar_label\",\r\n            title: \"Toggle Sidebar\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft #sidebarToggle\");\r\n        $(\"<div></div>\", {\r\n            class: \"toolbarButtonSpacer\",\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\r\n        $(\"<button></button>\", {\r\n            id: \"viewFind\",\r\n            class: \"toolbarButton \" + searchOpt,\r\n            title: \"Find in Document\",\r\n            tabindex: \"12\",\r\n            \"data-l10n-id\": \"findbar\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"findbar_label\",\r\n            title: \"Find\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft #viewFind\");\r\n        $(\"<div></div>\", {\r\n            class: \"splitToolbarButton hiddenSmallView \" + nextPreviousOpt,\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\r\n        $(\"<button></button>\", {\r\n            class: \"toolbarButton pageUp\",\r\n            title: \"Previous Page\",\r\n            id: \"previous\",\r\n            tabindex: \"13\",\r\n            \"data-l10n-id\": \"previous\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft .hiddenSmallView\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"previous_label\",\r\n            text: \"Previous\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft .hiddenSmallView #previous\");\r\n        $(\"<div></div>\", {\r\n            class: \"splitToolbarButtonSeparator\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft .hiddenSmallView\");\r\n        $(\"<button></button>\", {\r\n            class: \"toolbarButton pageDown\",\r\n            title: \"Next Pagee\",\r\n            id: \"next\",\r\n            tabindex: \"14\",\r\n            \"data-l10n-id\": \"next\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft .hiddenSmallView\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"next_label\",\r\n            text: \"Next\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft .hiddenSmallView #next\");\r\n        $(\"<input></input>\", {\r\n            type: \"number\",\r\n            id: \"pageNumber\",\r\n            class: \"toolbarField pageNumber \" + pageNumberOpt,\r\n            title: \"Page\",\r\n            value: \"1\",\r\n            size: \"4\",\r\n            min: \"1\",\r\n            tabindex: \"15\",\r\n            \"data-l10n-id\": \"page\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\r\n        $(\"<span></span>\", {\r\n            id: \"numPages\",\r\n            class: \"toolbarLabel \" + totalPagesOpt\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\r\n\r\n        $(\"<div></div>\", {\r\n            id: \"toolbarViewerRight\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer\");\r\n        $(\"<button></button>\", {\r\n            id: \"presentationMode\",\r\n            class: \"toolbarButton presentationMode hiddenLargeView \" + presentationModeOpt,\r\n            title: \"Switch to Presentation Mode\",\r\n            tabindex: \"31\",\r\n            \"data-l10n-id\": \"presentation_mode\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"presentation_mode_label\",\r\n            text: \"Presentation Mode\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #presentationMode\");\r\n        $(\"<button></button>\", {\r\n            id: \"openFile\",\r\n            class: \"toolbarButton openFile hiddenLargeView \" + openFileOpt,\r\n            title: \"Open File\",\r\n            tabindex: \"32\",\r\n            \"data-l10n-id\": \"open_file\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"open_file_label\",\r\n            text: \"Open\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #openFile\");\r\n        $(\"<button></button>\", {\r\n            id: \"print\",\r\n            class: \"toolbarButton print hiddenMediumView \" + printOpt,\r\n            title: \"Print\",\r\n            tabindex: \"33\",\r\n            \"data-l10n-id\": \"print\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"print_label\",\r\n            text: \"Print\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #print\");\r\n        $(\"<button></button>\", {\r\n            id: \"download\",\r\n            class: \"toolbarButton download hiddenMediumView \" + downloadOpt,\r\n            title: \"Download\",\r\n            tabindex: \"34\",\r\n            \"data-l10n-id\": \"download\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"download_label\",\r\n            text: \"Download\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #download\");\r\n        $(\"<a></a>\", {\r\n            href: \"#\",\r\n            id: \"viewBookmark\",\r\n            class: \"toolbarButton bookmark hiddenSmallView \" + bookmarkOpt,\r\n            title: \"Current view (copy or open in new window)\",\r\n            tabindex: \"35\",\r\n            \"data-l10n-id\": \"bookmark\",\r\n            target: \"_blank\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"bookmark_label\",\r\n            text: \"Current View\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #viewBookmark\");\r\n        $(\"<div></div>\", {\r\n            class: \"verticalToolbarSeparator hiddenSmallView\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\r\n        $(\"<button></button>\", {\r\n            id: \"secondaryToolbarToggle\",\r\n            class: \"toolbarButton \" + secondaryToolbarOpt,\r\n            title: \"Tools\",\r\n            tabindex: \"35\",\r\n            \"data-l10n-id\": \"tools\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"tools_label\",\r\n            text: \"Tools\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #secondaryToolbarToggle\");\r\n\r\n        $(\"<div></div>\", {\r\n            id: \"toolbarViewerMiddle\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer\");\r\n        $(\"<div></div>\", {\r\n            class: \"splitToolbarButton \" + zoomOpt\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle\");\r\n        $(\"<button></button>\", {\r\n            id: \"zoomOut\",\r\n            class: \"toolbarButton zoomOut\",\r\n            title: \"Zoom Out\",\r\n            tabindex: \"21\",\r\n            \"data-l10n-id\": \"zoom_out\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle .splitToolbarButton\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"zoom_out_label\",\r\n            text: \"Zoom Out\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle .splitToolbarButton #zoomOut\");\r\n        $(\"<div></div>\", {\r\n            class: \"splitToolbarButtonSeparator\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle .splitToolbarButton\");\r\n        $(\"<button></button>\", {\r\n            id: \"zoomIn\",\r\n            class: \"toolbarButton zoomIn\",\r\n            title: \"Zoom In\",\r\n            tabindex: \"22\",\r\n            \"data-l10n-id\": \"zoom_in\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle .splitToolbarButton\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"zoom_in_label\",\r\n            text: \"Zoom In\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle .splitToolbarButton #zoomIn\");\r\n\r\n        $(\"<span></span>\", {\r\n            id: \"scaleSelectContainer\",\r\n            class: \"dropdownToolbarButton\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle\");\r\n        $(\"<select></select>\", {\r\n            id: \"scaleSelect\",\r\n            title: \"Zoom\",\r\n            tabindex: \"23\",\r\n            \"data-l10n-id\": \"zoom\",\r\n            class: scaleSelectOpt\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer\");\r\n        $(\"<option></option>\", {\r\n            id: \"pageAutoOption\",\r\n            title: \"\",\r\n            value: \"auto\",\r\n            selected: \"selected\",\r\n            \"data-l10n-id\": \"page_scale_auto\",\r\n            text: \"Automatic Zoom\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\r\n        $(\"<option></option>\", {\r\n            id: \"pageActualOption\",\r\n            title: \"\",\r\n            value: \"page-actual\",\r\n            \"data-l10n-id\": \"page_scale_actual\",\r\n            text: \"Actual Size\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\r\n        $(\"<option></option>\", {\r\n            id: \"pageFitOption\",\r\n            title: \"\",\r\n            value: \"page-fit\",\r\n            \"data-l10n-id\": \"page_scale_fit\",\r\n            text: \"Page Fit\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\r\n        $(\"<option></option>\", {\r\n            id: \"pageWidthOption\",\r\n            title: \"\",\r\n            value: \"page-width\",\r\n            \"data-l10n-id\": \"page_scale_width\",\r\n            text: \"Page Width\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\r\n        $(\"<option></option>\", {\r\n            id: \"customScaleOption\",\r\n            title: \"\",\r\n            value: \"custom\",\r\n            disabled: \"disabled\",\r\n            hidden: \"true\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\r\n        $(\"<option></option>\", {\r\n            title: \"\",\r\n            value: \"0.5\",\r\n            \"data-l10n-id\": \"page_scale_percent\",\r\n            \"data-l10n-args\": '{ \"scale\": 50 }',\r\n            text: \"50%\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\r\n        $(\"<option></option>\", {\r\n            title: \"\",\r\n            value: \"0.75\",\r\n            \"data-l10n-id\": \"page_scale_percent\",\r\n            \"data-l10n-args\": '{ \"scale\": 75 }',\r\n            text: \"75%\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\r\n        $(\"<option></option>\", {\r\n            title: \"\",\r\n            value: \"1\",\r\n            \"data-l10n-id\": \"page_scale_percent\",\r\n            \"data-l10n-args\": '{ \"scale\": 100 }',\r\n            text: \"100%\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\r\n        $(\"<option></option>\", {\r\n            title: \"\",\r\n            value: \"1.25\",\r\n            \"data-l10n-id\": \"page_scale_percent\",\r\n            \"data-l10n-args\": '{ \"scale\": 125 }',\r\n            text: \"125%\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\r\n        $(\"<option></option>\", {\r\n            title: \"\",\r\n            value: \"1.5\",\r\n            \"data-l10n-id\": \"page_scale_percent\",\r\n            \"data-l10n-args\": '{ \"scale\": 150 }',\r\n            text: \"150%\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\r\n        $(\"<option></option>\", {\r\n            title: \"\",\r\n            value: \"2\",\r\n            \"data-l10n-id\": \"page_scale_percent\",\r\n            \"data-l10n-args\": '{ \"scale\": 200 }',\r\n            text: \"200%\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\r\n        $(\"<option></option>\", {\r\n            title: \"\",\r\n            value: \"3\",\r\n            \"data-l10n-id\": \"page_scale_percent\",\r\n            \"data-l10n-args\": '{ \"scale\": 300 }',\r\n            text: \"300%\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\r\n        $(\"<option></option>\", {\r\n            title: \"\",\r\n            value: \"4\",\r\n            \"data-l10n-id\": \"page_scale_percent\",\r\n            \"data-l10n-args\": '{ \"scale\": 400 }',\r\n            text: \"400%\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\r\n\r\n        $(\"<div></div>\", {\r\n            id: \"loadingBar\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer\");\r\n        $(\"<div></div>\", {\r\n            class: \"progress\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #loadingBar\");\r\n        $(\"<div></div>\", {\r\n            class: \"glimmer\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #loadingBar .progress\");\r\n\r\n        $(\"<menu></menu>\", {\r\n            id: \"viewerContextMenu\",\r\n            type: \"context\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\r\n        $(\"<menuitem></menuitem>\", {\r\n            id: \"contextFirstPage\",\r\n            label: \"First Page\",\r\n            \"data-l10n-id\": \"first_page\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #viewerContextMenu\");\r\n\r\n        $(\"<menuitem></menuitem>\", {\r\n            id: \"contextLastPage\",\r\n            label: \"Last Page\",\r\n            \"data-l10n-id\": \"last_page\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #viewerContextMenu\");\r\n        $(\"<menuitem></menuitem>\", {\r\n            id: \"contextPageRotateCw\",\r\n            label: \"Rotate Clockwise\",\r\n            \"data-l10n-id\": \"page_rotate_cw\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #viewerContextMenu\");\r\n        $(\"<menuitem></menuitem>\", {\r\n            id: \"contextPageRotateCcw\",\r\n            label: \"Rotate Counter-Clockwise\",\r\n            \"data-l10n-id\": \"page_rotate_ccw\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #viewerContextMenu\");\r\n\r\n        $(\"<div></div>\", {\r\n            id: \"viewerContainer\",\r\n            tabindex: \"0\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\r\n        $(\"<div></div>\", {\r\n            id: \"viewer\",\r\n            class: \"pdfViewer\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #viewerContainer\");\r\n\r\n        $(\"<div></div>\", {\r\n            id: \"errorWrapper\",\r\n            hidden: \"true\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\r\n        $(\"<div></div>\", {\r\n            id: \"errorMessageLeft\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper\");\r\n        $(\"<span></span>\", {\r\n            id: \"errorMessage\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper #errorMessageLeft\");\r\n        $(\"<button></button>\", {\r\n            id: \"errorShowMore\",\r\n            \"data-l10n-id\": \"error_more_info\",\r\n            text: \"More Information\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper #errorMessageLeft\");\r\n        $(\"<button></button>\", {\r\n            id: \"errorShowLess\",\r\n            \"data-l10n-id\": \"error_less_info\",\r\n            text: \"Less Information\",\r\n            hidden: \"true\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper #errorMessageLeft\");\r\n\r\n        $(\"<div></div>\", {\r\n            id: \"errorMessageRight\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper\");\r\n        $(\"<button></button>\", {\r\n            id: \"errorClose\",\r\n            \"data-l10n-id\": \"error_close\",\r\n            text: \"Close\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper #errorMessageRight\");\r\n\r\n        $(\"<div></div>\", {\r\n            class: \"clearBoth\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper\");\r\n        $(\"<textarea></textarea>\", {\r\n            id: \"errorMoreInfo\",\r\n            hidden: 'true',\r\n            readonly: \"readonly\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper\");\r\n        $(\"<div></div>\", {\r\n            id: \"passwordOverlay\",\r\n            class: \"container hidden\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer\");\r\n        $(\"<div></div>\", {\r\n            class: \"dialog\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay\");\r\n        $(\"<div></div>\", {\r\n            class: \"row\",\r\n            id: \"firstRow\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog\");\r\n        $(\"<p></p>\", {\r\n            id: \"passwordText\",\r\n            \"data-l10n-id\": \"password_label\",\r\n            text: \"Enter the password to open this PDF file:\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog #firstRow\");\r\n        $(\"<div></div>\", {\r\n            class: \"row\",\r\n            id: \"midleRow\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog\");\r\n        $(\"<input/>\", {\r\n            type: \"password\",\r\n            id: \"password\",\r\n            class: \"toolbarField\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog #midleRow\");\r\n        $(\"<div></div>\", {\r\n            class: \"buttonRow\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog\");\r\n        $(\"<button></button>\", {\r\n            id: \"passwordCancel\",\r\n            class: \"overlayButton\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog .buttonRow\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"password_cancel\",\r\n            text: \"Cancel\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog .buttonRow #passwordCancel\");\r\n        $(\"<button></button>\", {\r\n            id: \"passwordSubmit\",\r\n            class: \"overlayButton\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog .buttonRow\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"password_ok\",\r\n            text: \"OK\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog .buttonRow #passwordSubmit\");\r\n\r\n        $(\"<div></div>\", {\r\n            id: \"documentPropertiesOverlay\",\r\n            class: \"container hidden\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer\");\r\n\r\n        $(\"<div></div>\", {\r\n            id: \"printServiceOverlay\",\r\n            class: \"container hidden\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer\");\r\n        $(\"<div></div>\", {\r\n            class: \"dialog\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay\");\r\n        $(\"<div></div>\", {\r\n            class: \"row\",\r\n            id: \"printFirsRwo\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"print_progress_message\",\r\n            text: \"Preparing document for printing…\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog #printFirsRwo\");\r\n        $(\"<div></div>\", {\r\n            class: \"row\",\r\n            id: \"printSecondRwo\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog\");\r\n        $(\"<progress></progress>\", {\r\n            value: \"0\",\r\n            max: \"100\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog #printSecondRwo\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"print_progress_percent\",\r\n            \"data-l10n-args\": '{ \"progress\": 0 }',\r\n            class: \"relative-progress\",\r\n            text: \"0%\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog #printSecondRwo\");\r\n        $(\"<div></div>\", {\r\n            class: \"buttonRow\",\r\n            id: \"printThirdRwo\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog\");\r\n        $(\"<button></button>\", {\r\n            class: \"overlayButton\",\r\n            id: \"printCancel\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog #printThirdRwo\");\r\n        $(\"<span></span>\", {\r\n            \"data-l10n-id\": \"print_progress_close\",\r\n            text: \"Cancel\"\r\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog #printThirdRwo\");\r\n\r\n        var my_pdf_file = fObj.Obj;\r\n\r\n        var currentScriptPath = function () {\r\n            var dir = document.querySelector('script[src$=\"pdf.js\"]').getAttribute('src');\r\n            var name = dir.split('/').pop();\r\n            return dir.replace('/' + name, \"\");\r\n        };\r\n        function diff2(a, b) {\r\n            var i, la = a.length, lb = b.length, res = [];\r\n            if (!la) return b;\r\n            else if (!lb) return a;\r\n            for (i = 0; i < la; i++) {\r\n                if (b.indexOf(a[i]) === -1) res.push(a[i]);\r\n            }\r\n            for (i = 0; i < lb; i++) {\r\n                if (a.indexOf(b[i]) === -1) res.push(b[i]);\r\n            }\r\n            return res;\r\n        }\r\n        var full_path = location.href;\r\n        var pdfScriptPath = currentScriptPath();\r\n        if (pdfScriptPath.indexOf(full_path) > -1) {\r\n            var link_a_array = pdfScriptPath.split(\"/\");\r\n            var link_b_array = full_path.split(\"/\");\r\n            var link_diff = diff2(link_a_array, link_b_array).join(\"/\");\r\n            pdfScriptPath = link_diff;\r\n            /*\r\n            console.log(\r\n                \"\\nscript path: \", currentScriptPath(),\r\n                \"\\nfull path:\", full_path,\r\n                \"\\nlink_diff: \", link_diff,\r\n                \"\\nsetLangFilesPath: \", setLangFilesPath\r\n            );\r\n            */\r\n        }\r\n        setLangFilesPath = (setLangFilesPath != \"\") ? full_path + setLangFilesPath + \"/locale.properties\" : \"\";\r\n        $(\"<link>\", {\r\n            rel: \"resource\",\r\n            type: \"application/l10n\",\r\n            href: (setLangFilesPath != \"\") ? setLangFilesPath : pdfScriptPath + \"/locale/locale.properties\"\r\n        }).appendTo(\"#\" + divId);\r\n\r\n        $(\"#mainPdfWarrper\").bind('destroyed', function () {\r\n            //if exit from pdf viewer mode\r\n            //return orginal Warrper dir\r\n            var orgnlHtmldir = sessionStorage.getItem(\"o2h_orginal_html_dir\");\r\n            if (orgnlHtmldir !== undefined) {\r\n                $(\"#mainPdfWarrper\").attr(\"dir\", orgnlHtmldir);\r\n            }\r\n        });\r\n    /* Copyright 2017 Mozilla Foundation\r\n    *\r\n    * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n    * you may not use this file except in compliance with the License.\r\n    * You may obtain a copy of the License at\r\n    *\r\n    *     http://www.apache.org/licenses/LICENSE-2.0\r\n    *\r\n    * Unless required by applicable law or agreed to in writing, software\r\n    * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n    * See the License for the specific language governing permissions and\r\n    * limitations under the License.\r\n    */\r\n\r\n    /******/ (function (modules) { // webpackBootstrap\r\n    /******/ \t// The module cache\r\n    /******/ \tvar installedModules = {};\r\n    /******/\r\n    /******/ \t// The require function\r\n    /******/ \tfunction __webpack_require__(moduleId) {\r\n    /******/\r\n    /******/ \t\t// Check if module is in cache\r\n    /******/ \t\tif (installedModules[moduleId]) {\r\n    /******/ \t\t\treturn installedModules[moduleId].exports;\r\n                    /******/\r\n                }\r\n    /******/ \t\t// Create a new module (and put it into the cache)\r\n    /******/ \t\tvar module = installedModules[moduleId] = {\r\n    /******/ \t\t\ti: moduleId,\r\n    /******/ \t\t\tl: false,\r\n    /******/ \t\t\texports: {}\r\n                    /******/\r\n                };\r\n    /******/\r\n    /******/ \t\t// Execute the module function\r\n    /******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\r\n    /******/\r\n    /******/ \t\t// Flag the module as loaded\r\n    /******/ \t\tmodule.l = true;\r\n    /******/\r\n    /******/ \t\t// Return the exports of the module\r\n    /******/ \t\treturn module.exports;\r\n                /******/\r\n            }\r\n    /******/\r\n    /******/\r\n    /******/ \t// expose the modules object (__webpack_modules__)\r\n    /******/ \t__webpack_require__.m = modules;\r\n    /******/\r\n    /******/ \t// expose the module cache\r\n    /******/ \t__webpack_require__.c = installedModules;\r\n    /******/\r\n    /******/ \t// identity function for calling harmony imports with the correct context\r\n    /******/ \t__webpack_require__.i = function (value) { return value; };\r\n    /******/\r\n    /******/ \t// define getter function for harmony exports\r\n    /******/ \t__webpack_require__.d = function (exports, name, getter) {\r\n    /******/ \t\tif (!__webpack_require__.o(exports, name)) {\r\n    /******/ \t\t\tObject.defineProperty(exports, name, {\r\n    /******/ \t\t\t\tconfigurable: false,\r\n    /******/ \t\t\t\tenumerable: true,\r\n    /******/ \t\t\t\tget: getter\r\n                /******/\r\n            });\r\n                    /******/\r\n                }\r\n                /******/\r\n            };\r\n    /******/\r\n    /******/ \t// getDefaultExport function for compatibility with non-harmony modules\r\n    /******/ \t__webpack_require__.n = function (module) {\r\n    /******/ \t\tvar getter = module && module.__esModule ?\r\n    /******/ \t\t\tfunction getDefault() { return module['default']; } :\r\n    /******/ \t\t\tfunction getModuleExports() { return module; };\r\n    /******/ \t\t__webpack_require__.d(getter, 'a', getter);\r\n    /******/ \t\treturn getter;\r\n                /******/\r\n            };\r\n    /******/\r\n    /******/ \t// Object.prototype.hasOwnProperty.call\r\n    /******/ \t__webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\r\n    /******/\r\n    /******/ \t// __webpack_public_path__\r\n    /******/ \t__webpack_require__.p = \"\";\r\n    /******/\r\n    /******/ \t// Load entry module and return exports\r\n    /******/ \treturn __webpack_require__(__webpack_require__.s = 33);\r\n            /******/\r\n        })\r\n    /************************************************************************/\r\n    /******/([\r\n    /* 0 */\r\n    /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.localized = exports.animationStarted = exports.normalizeWheelEventDelta = exports.binarySearchFirstItem = exports.watchScroll = exports.scrollIntoView = exports.getOutputScale = exports.approximateFraction = exports.roundToDivide = exports.getVisibleElements = exports.parseQueryString = exports.noContextMenuHandler = exports.getPDFFileNameFromURL = exports.ProgressBar = exports.EventBus = exports.NullL10n = exports.mozL10n = exports.RendererType = exports.cloneObj = exports.VERTICAL_PADDING = exports.SCROLLBAR_PADDING = exports.MAX_AUTO_SCALE = exports.UNKNOWN_SCALE = exports.MAX_SCALE = exports.MIN_SCALE = exports.DEFAULT_SCALE = exports.DEFAULT_SCALE_VALUE = exports.CSS_UNITS = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _pdfjsLib = __webpack_require__(1);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var CSS_UNITS = 96.0 / 72.0;\r\n                var DEFAULT_SCALE_VALUE = 'auto';\r\n                var DEFAULT_SCALE = 1.0;\r\n                var MIN_SCALE = 0.25;\r\n                var MAX_SCALE = 10.0;\r\n                var UNKNOWN_SCALE = 0;\r\n                var MAX_AUTO_SCALE = 1.25;\r\n                var SCROLLBAR_PADDING = 40;\r\n                var VERTICAL_PADDING = 5;\r\n                var RendererType = {\r\n                    CANVAS: 'canvas',\r\n                    SVG: 'svg'\r\n                };\r\n                function formatL10nValue(text, args) {\r\n                    if (!args) {\r\n                        return text;\r\n                    }\r\n                    return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, function (all, name) {\r\n                        return name in args ? args[name] : '{{' + name + '}}';\r\n                    });\r\n                }\r\n                var NullL10n = {\r\n                    get: function get(property, args, fallback) {\r\n                        return Promise.resolve(formatL10nValue(fallback, args));\r\n                    },\r\n                    translate: function translate(element) {\r\n                        return Promise.resolve();\r\n                    }\r\n                };\r\n                _pdfjsLib.PDFJS.disableFullscreen = _pdfjsLib.PDFJS.disableFullscreen === undefined ? false : _pdfjsLib.PDFJS.disableFullscreen;\r\n                _pdfjsLib.PDFJS.useOnlyCssZoom = _pdfjsLib.PDFJS.useOnlyCssZoom === undefined ? false : _pdfjsLib.PDFJS.useOnlyCssZoom;\r\n                _pdfjsLib.PDFJS.maxCanvasPixels = _pdfjsLib.PDFJS.maxCanvasPixels === undefined ? 16777216 : _pdfjsLib.PDFJS.maxCanvasPixels;\r\n                _pdfjsLib.PDFJS.disableHistory = _pdfjsLib.PDFJS.disableHistory === undefined ? false : _pdfjsLib.PDFJS.disableHistory;\r\n                _pdfjsLib.PDFJS.disableTextLayer = _pdfjsLib.PDFJS.disableTextLayer === undefined ? false : _pdfjsLib.PDFJS.disableTextLayer;\r\n                _pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom = _pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom === undefined ? false : _pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom;\r\n                {\r\n                    //_pdfjsLib.PDFJS.locale = _pdfjsLib.PDFJS.locale === undefined && typeof navigator !== 'undefined' ? navigator.language : _pdfjsLib.PDFJS.locale;\r\n                    if (_pdfjsLib.PDFJS.locale === undefined && typeof navigator !== 'undefined') {\r\n                        if (setLang != \"\") {\r\n                            _pdfjsLib.PDFJS.locale = setLang;\r\n                        } else {\r\n                            _pdfjsLib.PDFJS.locale = navigator.language; //set lang here - TODO\r\n                        }\r\n                        //console.log(\"_pdfjsLib.PDFJS.locale (lang)= \" + _pdfjsLib.PDFJS.locale); \r\n                    }\r\n                }\r\n                function getOutputScale(ctx) {\r\n                    var devicePixelRatio = window.devicePixelRatio || 1;\r\n                    var backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;\r\n                    var pixelRatio = devicePixelRatio / backingStoreRatio;\r\n                    return {\r\n                        sx: pixelRatio,\r\n                        sy: pixelRatio,\r\n                        scaled: pixelRatio !== 1\r\n                    };\r\n                }\r\n                function scrollIntoView(element, spot) {\r\n                    var skipOverflowHiddenElements = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\r\n\r\n                    var parent = element.offsetParent;\r\n                    if (!parent) {\r\n                        console.error('offsetParent is not set -- cannot scroll');\r\n                        return;\r\n                    }\r\n                    var offsetY = element.offsetTop + element.clientTop;\r\n                    var offsetX = element.offsetLeft + element.clientLeft;\r\n                    while (parent.clientHeight === parent.scrollHeight || skipOverflowHiddenElements && getComputedStyle(parent).overflow === 'hidden') {\r\n                        if (parent.dataset._scaleY) {\r\n                            offsetY /= parent.dataset._scaleY;\r\n                            offsetX /= parent.dataset._scaleX;\r\n                        }\r\n                        offsetY += parent.offsetTop;\r\n                        offsetX += parent.offsetLeft;\r\n                        parent = parent.offsetParent;\r\n                        if (!parent) {\r\n                            return;\r\n                        }\r\n                    }\r\n                    if (spot) {\r\n                        if (spot.top !== undefined) {\r\n                            offsetY += spot.top;\r\n                        }\r\n                        if (spot.left !== undefined) {\r\n                            offsetX += spot.left;\r\n                            parent.scrollLeft = offsetX;\r\n                        }\r\n                    }\r\n                    parent.scrollTop = offsetY;\r\n                }\r\n                function watchScroll(viewAreaElement, callback) {\r\n                    var debounceScroll = function debounceScroll(evt) {\r\n                        if (rAF) {\r\n                            return;\r\n                        }\r\n                        rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {\r\n                            rAF = null;\r\n                            var currentY = viewAreaElement.scrollTop;\r\n                            var lastY = state.lastY;\r\n                            if (currentY !== lastY) {\r\n                                state.down = currentY > lastY;\r\n                            }\r\n                            state.lastY = currentY;\r\n                            callback(state);\r\n                        });\r\n                    };\r\n                    var state = {\r\n                        down: true,\r\n                        lastY: viewAreaElement.scrollTop,\r\n                        _eventHandler: debounceScroll\r\n                    };\r\n                    var rAF = null;\r\n                    viewAreaElement.addEventListener('scroll', debounceScroll, true);\r\n                    return state;\r\n                }\r\n                function parseQueryString(query) {\r\n                    var parts = query.split('&');\r\n                    var params = Object.create(null);\r\n                    for (var i = 0, ii = parts.length; i < ii; ++i) {\r\n                        var param = parts[i].split('=');\r\n                        var key = param[0].toLowerCase();\r\n                        var value = param.length > 1 ? param[1] : null;\r\n                        params[decodeURIComponent(key)] = decodeURIComponent(value);\r\n                    }\r\n                    return params;\r\n                }\r\n                function binarySearchFirstItem(items, condition) {\r\n                    var minIndex = 0;\r\n                    var maxIndex = items.length - 1;\r\n                    if (items.length === 0 || !condition(items[maxIndex])) {\r\n                        return items.length;\r\n                    }\r\n                    if (condition(items[minIndex])) {\r\n                        return minIndex;\r\n                    }\r\n                    while (minIndex < maxIndex) {\r\n                        var currentIndex = minIndex + maxIndex >> 1;\r\n                        var currentItem = items[currentIndex];\r\n                        if (condition(currentItem)) {\r\n                            maxIndex = currentIndex;\r\n                        } else {\r\n                            minIndex = currentIndex + 1;\r\n                        }\r\n                    }\r\n                    return minIndex;\r\n                }\r\n                function approximateFraction(x) {\r\n                    if (Math.floor(x) === x) {\r\n                        return [x, 1];\r\n                    }\r\n                    var xinv = 1 / x;\r\n                    var limit = 8;\r\n                    if (xinv > limit) {\r\n                        return [1, limit];\r\n                    } else if (Math.floor(xinv) === xinv) {\r\n                        return [1, xinv];\r\n                    }\r\n                    var x_ = x > 1 ? xinv : x;\r\n                    var a = 0,\r\n                        b = 1,\r\n                        c = 1,\r\n                        d = 1;\r\n                    while (true) {\r\n                        var p = a + c,\r\n                            q = b + d;\r\n                        if (q > limit) {\r\n                            break;\r\n                        }\r\n                        if (x_ <= p / q) {\r\n                            c = p;\r\n                            d = q;\r\n                        } else {\r\n                            a = p;\r\n                            b = q;\r\n                        }\r\n                    }\r\n                    var result = void 0;\r\n                    if (x_ - a / b < c / d - x_) {\r\n                        result = x_ === x ? [a, b] : [b, a];\r\n                    } else {\r\n                        result = x_ === x ? [c, d] : [d, c];\r\n                    }\r\n                    return result;\r\n                }\r\n                function roundToDivide(x, div) {\r\n                    var r = x % div;\r\n                    return r === 0 ? x : Math.round(x - r + div);\r\n                }\r\n                function getVisibleElements(scrollEl, views) {\r\n                    var sortByVisibility = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\r\n\r\n                    var top = scrollEl.scrollTop,\r\n                        bottom = top + scrollEl.clientHeight;\r\n                    var left = scrollEl.scrollLeft,\r\n                        right = left + scrollEl.clientWidth;\r\n                    function isElementBottomBelowViewTop(view) {\r\n                        var element = view.div;\r\n                        var elementBottom = element.offsetTop + element.clientTop + element.clientHeight;\r\n                        return elementBottom > top;\r\n                    }\r\n                    var visible = [],\r\n                        view = void 0,\r\n                        element = void 0;\r\n                    var currentHeight = void 0,\r\n                        viewHeight = void 0,\r\n                        hiddenHeight = void 0,\r\n                        percentHeight = void 0;\r\n                    var currentWidth = void 0,\r\n                        viewWidth = void 0;\r\n                    var firstVisibleElementInd = views.length === 0 ? 0 : binarySearchFirstItem(views, isElementBottomBelowViewTop);\r\n                    for (var i = firstVisibleElementInd, ii = views.length; i < ii; i++) {\r\n                        view = views[i];\r\n                        element = view.div;\r\n                        currentHeight = element.offsetTop + element.clientTop;\r\n                        viewHeight = element.clientHeight;\r\n                        if (currentHeight > bottom) {\r\n                            break;\r\n                        }\r\n                        currentWidth = element.offsetLeft + element.clientLeft;\r\n                        viewWidth = element.clientWidth;\r\n                        if (currentWidth + viewWidth < left || currentWidth > right) {\r\n                            continue;\r\n                        }\r\n                        hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, currentHeight + viewHeight - bottom);\r\n                        percentHeight = (viewHeight - hiddenHeight) * 100 / viewHeight | 0;\r\n                        visible.push({\r\n                            id: view.id,\r\n                            x: currentWidth,\r\n                            y: currentHeight,\r\n                            view: view,\r\n                            percent: percentHeight\r\n                        });\r\n                    }\r\n                    var first = visible[0];\r\n                    var last = visible[visible.length - 1];\r\n                    if (sortByVisibility) {\r\n                        visible.sort(function (a, b) {\r\n                            var pc = a.percent - b.percent;\r\n                            if (Math.abs(pc) > 0.001) {\r\n                                return -pc;\r\n                            }\r\n                            return a.id - b.id;\r\n                        });\r\n                    }\r\n                    return {\r\n                        first: first,\r\n                        last: last,\r\n                        views: visible\r\n                    };\r\n                }\r\n                function noContextMenuHandler(evt) {\r\n                    evt.preventDefault();\r\n                }\r\n                function isDataSchema(url) {\r\n                    var i = 0,\r\n                        ii = url.length;\r\n                    while (i < ii && url[i].trim() === '') {\r\n                        i++;\r\n                    }\r\n                    return url.substr(i, 5).toLowerCase() === 'data:';\r\n                }\r\n                function getPDFFileNameFromURL(url) {\r\n                    var defaultFilename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'document.pdf';\r\n\r\n                    if (isDataSchema(url)) {\r\n                        console.warn('getPDFFileNameFromURL: ' + 'ignoring \"data:\" URL for performance reasons.');\r\n                        return defaultFilename;\r\n                    }\r\n                    var reURI = /^(?:(?:[^:]+:)?\\/\\/[^\\/]+)?([^?#]*)(\\?[^#]*)?(#.*)?$/;\r\n                    var reFilename = /[^\\/?#=]+\\.pdf\\b(?!.*\\.pdf\\b)/i;\r\n                    var splitURI = reURI.exec(url);\r\n                    var suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]);\r\n                    if (suggestedFilename) {\r\n                        suggestedFilename = suggestedFilename[0];\r\n                        if (suggestedFilename.indexOf('%') !== -1) {\r\n                            try {\r\n                                suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0];\r\n                            } catch (ex) { }\r\n                        }\r\n                    }\r\n                    return suggestedFilename || defaultFilename;\r\n                }\r\n                function normalizeWheelEventDelta(evt) {\r\n                    var delta = Math.sqrt(evt.deltaX * evt.deltaX + evt.deltaY * evt.deltaY);\r\n                    var angle = Math.atan2(evt.deltaY, evt.deltaX);\r\n                    if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {\r\n                        delta = -delta;\r\n                    }\r\n                    var MOUSE_DOM_DELTA_PIXEL_MODE = 0;\r\n                    var MOUSE_DOM_DELTA_LINE_MODE = 1;\r\n                    var MOUSE_PIXELS_PER_LINE = 30;\r\n                    var MOUSE_LINES_PER_PAGE = 30;\r\n                    if (evt.deltaMode === MOUSE_DOM_DELTA_PIXEL_MODE) {\r\n                        delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;\r\n                    } else if (evt.deltaMode === MOUSE_DOM_DELTA_LINE_MODE) {\r\n                        delta /= MOUSE_LINES_PER_PAGE;\r\n                    }\r\n                    return delta;\r\n                }\r\n                function cloneObj(obj) {\r\n                    var result = Object.create(null);\r\n                    for (var i in obj) {\r\n                        if (Object.prototype.hasOwnProperty.call(obj, i)) {\r\n                            result[i] = obj[i];\r\n                        }\r\n                    }\r\n                    return result;\r\n                }\r\n                var animationStarted = new Promise(function (resolve) {\r\n                    window.requestAnimationFrame(resolve);\r\n                });\r\n                var mozL10n = void 0;\r\n                var localized = Promise.resolve();\r\n\r\n                var EventBus = function () {\r\n                    function EventBus() {\r\n                        _classCallCheck(this, EventBus);\r\n\r\n                        this._listeners = Object.create(null);\r\n                    }\r\n\r\n                    _createClass(EventBus, [{\r\n                        key: 'on',\r\n                        value: function on(eventName, listener) {\r\n                            var eventListeners = this._listeners[eventName];\r\n                            if (!eventListeners) {\r\n                                eventListeners = [];\r\n                                this._listeners[eventName] = eventListeners;\r\n                            }\r\n                            eventListeners.push(listener);\r\n                        }\r\n                    }, {\r\n                        key: 'off',\r\n                        value: function off(eventName, listener) {\r\n                            var eventListeners = this._listeners[eventName];\r\n                            var i = void 0;\r\n                            if (!eventListeners || (i = eventListeners.indexOf(listener)) < 0) {\r\n                                return;\r\n                            }\r\n                            eventListeners.splice(i, 1);\r\n                        }\r\n                    }, {\r\n                        key: 'dispatch',\r\n                        value: function dispatch(eventName) {\r\n                            var eventListeners = this._listeners[eventName];\r\n                            if (!eventListeners || eventListeners.length === 0) {\r\n                                return;\r\n                            }\r\n                            var args = Array.prototype.slice.call(arguments, 1);\r\n                            eventListeners.slice(0).forEach(function (listener) {\r\n                                listener.apply(null, args);\r\n                            });\r\n                        }\r\n                    }]);\r\n\r\n                    return EventBus;\r\n                }();\r\n\r\n                function clamp(v, min, max) {\r\n                    return Math.min(Math.max(v, min), max);\r\n                }\r\n\r\n                var ProgressBar = function () {\r\n                    function ProgressBar(id) {\r\n                        var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\r\n                            height = _ref.height,\r\n                            width = _ref.width,\r\n                            units = _ref.units;\r\n\r\n                        _classCallCheck(this, ProgressBar);\r\n\r\n                        this.visible = true;\r\n                        this.div = document.querySelector(id + ' .progress');\r\n                        this.bar = this.div.parentNode;\r\n                        this.height = height || 100;\r\n                        this.width = width || 100;\r\n                        this.units = units || '%';\r\n                        this.div.style.height = this.height + this.units;\r\n                        this.percent = 0;\r\n                    }\r\n\r\n                    _createClass(ProgressBar, [{\r\n                        key: '_updateBar',\r\n                        value: function _updateBar() {\r\n                            if (this._indeterminate) {\r\n                                this.div.classList.add('indeterminate');\r\n                                this.div.style.width = this.width + this.units;\r\n                                return;\r\n                            }\r\n                            this.div.classList.remove('indeterminate');\r\n                            var progressSize = this.width * this._percent / 100;\r\n                            this.div.style.width = progressSize + this.units;\r\n                        }\r\n                    }, {\r\n                        key: 'setWidth',\r\n                        value: function setWidth(viewer) {\r\n                            if (!viewer) {\r\n                                return;\r\n                            }\r\n                            var container = viewer.parentNode;\r\n                            var scrollbarWidth = container.offsetWidth - viewer.offsetWidth;\r\n                            if (scrollbarWidth > 0) {\r\n                                this.bar.setAttribute('style', 'width: calc(100% - ' + scrollbarWidth + 'px);');\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'hide',\r\n                        value: function hide() {\r\n                            if (!this.visible) {\r\n                                return;\r\n                            }\r\n                            this.visible = false;\r\n                            this.bar.classList.add('hidden');\r\n                            document.body.classList.remove('loadingInProgress');\r\n                        }\r\n                    }, {\r\n                        key: 'show',\r\n                        value: function show() {\r\n                            if (this.visible) {\r\n                                return;\r\n                            }\r\n                            this.visible = true;\r\n                            document.body.classList.add('loadingInProgress');\r\n                            this.bar.classList.remove('hidden');\r\n                        }\r\n                    }, {\r\n                        key: 'percent',\r\n                        get: function get() {\r\n                            return this._percent;\r\n                        },\r\n                        set: function set(val) {\r\n                            this._indeterminate = isNaN(val);\r\n                            this._percent = clamp(val, 0, 100);\r\n                            this._updateBar();\r\n                        }\r\n                    }]);\r\n\r\n                    return ProgressBar;\r\n                }();\r\n\r\n                exports.CSS_UNITS = CSS_UNITS;\r\n                exports.DEFAULT_SCALE_VALUE = DEFAULT_SCALE_VALUE;\r\n                exports.DEFAULT_SCALE = DEFAULT_SCALE;\r\n                exports.MIN_SCALE = MIN_SCALE;\r\n                exports.MAX_SCALE = MAX_SCALE;\r\n                exports.UNKNOWN_SCALE = UNKNOWN_SCALE;\r\n                exports.MAX_AUTO_SCALE = MAX_AUTO_SCALE;\r\n                exports.SCROLLBAR_PADDING = SCROLLBAR_PADDING;\r\n                exports.VERTICAL_PADDING = VERTICAL_PADDING;\r\n                exports.cloneObj = cloneObj;\r\n                exports.RendererType = RendererType;\r\n                exports.mozL10n = mozL10n;\r\n                exports.NullL10n = NullL10n;\r\n                exports.EventBus = EventBus;\r\n                exports.ProgressBar = ProgressBar;\r\n                exports.getPDFFileNameFromURL = getPDFFileNameFromURL;\r\n                exports.noContextMenuHandler = noContextMenuHandler;\r\n                exports.parseQueryString = parseQueryString;\r\n                exports.getVisibleElements = getVisibleElements;\r\n                exports.roundToDivide = roundToDivide;\r\n                exports.approximateFraction = approximateFraction;\r\n                exports.getOutputScale = getOutputScale;\r\n                exports.scrollIntoView = scrollIntoView;\r\n                exports.watchScroll = watchScroll;\r\n                exports.binarySearchFirstItem = binarySearchFirstItem;\r\n                exports.normalizeWheelEventDelta = normalizeWheelEventDelta;\r\n                exports.animationStarted = animationStarted;\r\n                exports.localized = localized;\r\n\r\n                /***/\r\n            }),\r\n        /* 1 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                var pdfjsLib;\r\n                if (typeof window !== 'undefined' && window['pdfjs-dist/build/pdf']) {\r\n                    pdfjsLib = window['pdfjs-dist/build/pdf'];\r\n                } else {\r\n                    pdfjsLib = require('./' + link_diff + '/pdf/pdf.js');\r\n                }\r\n                module.exports = pdfjsLib;\r\n\r\n                /***/\r\n            }),\r\n        /* 2 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.getGlobalEventBus = exports.attachDOMEventsToEventBus = undefined;\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                function attachDOMEventsToEventBus(eventBus) {\r\n                    eventBus.on('documentload', function () {\r\n                        var event = document.createEvent('CustomEvent');\r\n                        event.initCustomEvent('documentload', true, true, {});\r\n                        window.dispatchEvent(event);\r\n                    });\r\n                    eventBus.on('pagerendered', function (evt) {\r\n                        var event = document.createEvent('CustomEvent');\r\n                        event.initCustomEvent('pagerendered', true, true, {\r\n                            pageNumber: evt.pageNumber,\r\n                            cssTransform: evt.cssTransform\r\n                        });\r\n                        evt.source.div.dispatchEvent(event);\r\n                    });\r\n                    eventBus.on('textlayerrendered', function (evt) {\r\n                        var event = document.createEvent('CustomEvent');\r\n                        event.initCustomEvent('textlayerrendered', true, true, { pageNumber: evt.pageNumber });\r\n                        evt.source.textLayerDiv.dispatchEvent(event);\r\n                    });\r\n                    eventBus.on('pagechange', function (evt) {\r\n                        var event = document.createEvent('UIEvents');\r\n                        event.initUIEvent('pagechange', true, true, window, 0);\r\n                        event.pageNumber = evt.pageNumber;\r\n                        evt.source.container.dispatchEvent(event);\r\n                    });\r\n                    eventBus.on('pagesinit', function (evt) {\r\n                        var event = document.createEvent('CustomEvent');\r\n                        event.initCustomEvent('pagesinit', true, true, null);\r\n                        evt.source.container.dispatchEvent(event);\r\n                    });\r\n                    eventBus.on('pagesloaded', function (evt) {\r\n                        var event = document.createEvent('CustomEvent');\r\n                        event.initCustomEvent('pagesloaded', true, true, { pagesCount: evt.pagesCount });\r\n                        evt.source.container.dispatchEvent(event);\r\n                    });\r\n                    eventBus.on('scalechange', function (evt) {\r\n                        var event = document.createEvent('UIEvents');\r\n                        event.initUIEvent('scalechange', true, true, window, 0);\r\n                        event.scale = evt.scale;\r\n                        event.presetValue = evt.presetValue;\r\n                        evt.source.container.dispatchEvent(event);\r\n                    });\r\n                    eventBus.on('updateviewarea', function (evt) {\r\n                        var event = document.createEvent('UIEvents');\r\n                        event.initUIEvent('updateviewarea', true, true, window, 0);\r\n                        event.location = evt.location;\r\n                        evt.source.container.dispatchEvent(event);\r\n                    });\r\n                    eventBus.on('find', function (evt) {\r\n                        if (evt.source === window) {\r\n                            return;\r\n                        }\r\n                        var event = document.createEvent('CustomEvent');\r\n                        event.initCustomEvent('find' + evt.type, true, true, {\r\n                            query: evt.query,\r\n                            phraseSearch: evt.phraseSearch,\r\n                            caseSensitive: evt.caseSensitive,\r\n                            highlightAll: evt.highlightAll,\r\n                            findPrevious: evt.findPrevious\r\n                        });\r\n                        window.dispatchEvent(event);\r\n                    });\r\n                    eventBus.on('attachmentsloaded', function (evt) {\r\n                        var event = document.createEvent('CustomEvent');\r\n                        event.initCustomEvent('attachmentsloaded', true, true, { attachmentsCount: evt.attachmentsCount });\r\n                        evt.source.container.dispatchEvent(event);\r\n                    });\r\n                    eventBus.on('sidebarviewchanged', function (evt) {\r\n                        var event = document.createEvent('CustomEvent');\r\n                        event.initCustomEvent('sidebarviewchanged', true, true, { view: evt.view });\r\n                        evt.source.outerContainer.dispatchEvent(event);\r\n                    });\r\n                    eventBus.on('pagemode', function (evt) {\r\n                        var event = document.createEvent('CustomEvent');\r\n                        event.initCustomEvent('pagemode', true, true, { mode: evt.mode });\r\n                        evt.source.pdfViewer.container.dispatchEvent(event);\r\n                    });\r\n                    eventBus.on('namedaction', function (evt) {\r\n                        var event = document.createEvent('CustomEvent');\r\n                        event.initCustomEvent('namedaction', true, true, { action: evt.action });\r\n                        evt.source.pdfViewer.container.dispatchEvent(event);\r\n                    });\r\n                    eventBus.on('presentationmodechanged', function (evt) {\r\n                        var event = document.createEvent('CustomEvent');\r\n                        event.initCustomEvent('presentationmodechanged', true, true, {\r\n                            active: evt.active,\r\n                            switchInProgress: evt.switchInProgress\r\n                        });\r\n                        window.dispatchEvent(event);\r\n                    });\r\n                    eventBus.on('outlineloaded', function (evt) {\r\n                        var event = document.createEvent('CustomEvent');\r\n                        event.initCustomEvent('outlineloaded', true, true, { outlineCount: evt.outlineCount });\r\n                        evt.source.container.dispatchEvent(event);\r\n                    });\r\n                }\r\n                var globalEventBus = null;\r\n                function getGlobalEventBus() {\r\n                    if (globalEventBus) {\r\n                        return globalEventBus;\r\n                    }\r\n                    globalEventBus = new _ui_utils.EventBus();\r\n                    attachDOMEventsToEventBus(globalEventBus);\r\n                    return globalEventBus;\r\n                }\r\n                exports.attachDOMEventsToEventBus = attachDOMEventsToEventBus;\r\n                exports.getGlobalEventBus = getGlobalEventBus;\r\n\r\n                /***/\r\n            }),\r\n        /* 3 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var CLEANUP_TIMEOUT = 30000;\r\n                var RenderingStates = {\r\n                    INITIAL: 0,\r\n                    RUNNING: 1,\r\n                    PAUSED: 2,\r\n                    FINISHED: 3\r\n                };\r\n\r\n                var PDFRenderingQueue = function () {\r\n                    function PDFRenderingQueue() {\r\n                        _classCallCheck(this, PDFRenderingQueue);\r\n\r\n                        this.pdfViewer = null;\r\n                        this.pdfThumbnailViewer = null;\r\n                        this.onIdle = null;\r\n                        this.highestPriorityPage = null;\r\n                        this.idleTimeout = null;\r\n                        this.printing = false;\r\n                        this.isThumbnailViewEnabled = false;\r\n                    }\r\n\r\n                    _createClass(PDFRenderingQueue, [{\r\n                        key: \"setViewer\",\r\n                        value: function setViewer(pdfViewer) {\r\n                            this.pdfViewer = pdfViewer;\r\n                        }\r\n                    }, {\r\n                        key: \"setThumbnailViewer\",\r\n                        value: function setThumbnailViewer(pdfThumbnailViewer) {\r\n                            this.pdfThumbnailViewer = pdfThumbnailViewer;\r\n                        }\r\n                    }, {\r\n                        key: \"isHighestPriority\",\r\n                        value: function isHighestPriority(view) {\r\n                            return this.highestPriorityPage === view.renderingId;\r\n                        }\r\n                    }, {\r\n                        key: \"renderHighestPriority\",\r\n                        value: function renderHighestPriority(currentlyVisiblePages) {\r\n                            if (this.idleTimeout) {\r\n                                clearTimeout(this.idleTimeout);\r\n                                this.idleTimeout = null;\r\n                            }\r\n                            if (this.pdfViewer.forceRendering(currentlyVisiblePages)) {\r\n                                return;\r\n                            }\r\n                            if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) {\r\n                                if (this.pdfThumbnailViewer.forceRendering()) {\r\n                                    return;\r\n                                }\r\n                            }\r\n                            if (this.printing) {\r\n                                return;\r\n                            }\r\n                            if (this.onIdle) {\r\n                                this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: \"getHighestPriority\",\r\n                        value: function getHighestPriority(visible, views, scrolledDown) {\r\n                            var visibleViews = visible.views;\r\n                            var numVisible = visibleViews.length;\r\n                            if (numVisible === 0) {\r\n                                return false;\r\n                            }\r\n                            for (var i = 0; i < numVisible; ++i) {\r\n                                var view = visibleViews[i].view;\r\n                                if (!this.isViewFinished(view)) {\r\n                                    return view;\r\n                                }\r\n                            }\r\n                            if (scrolledDown) {\r\n                                var nextPageIndex = visible.last.id;\r\n                                if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) {\r\n                                    return views[nextPageIndex];\r\n                                }\r\n                            } else {\r\n                                var previousPageIndex = visible.first.id - 2;\r\n                                if (views[previousPageIndex] && !this.isViewFinished(views[previousPageIndex])) {\r\n                                    return views[previousPageIndex];\r\n                                }\r\n                            }\r\n                            return null;\r\n                        }\r\n                    }, {\r\n                        key: \"isViewFinished\",\r\n                        value: function isViewFinished(view) {\r\n                            return view.renderingState === RenderingStates.FINISHED;\r\n                        }\r\n                    }, {\r\n                        key: \"renderView\",\r\n                        value: function renderView(view) {\r\n                            var _this = this;\r\n\r\n                            switch (view.renderingState) {\r\n                                case RenderingStates.FINISHED:\r\n                                    return false;\r\n                                case RenderingStates.PAUSED:\r\n                                    this.highestPriorityPage = view.renderingId;\r\n                                    view.resume();\r\n                                    break;\r\n                                case RenderingStates.RUNNING:\r\n                                    this.highestPriorityPage = view.renderingId;\r\n                                    break;\r\n                                case RenderingStates.INITIAL:\r\n                                    this.highestPriorityPage = view.renderingId;\r\n                                    var continueRendering = function continueRendering() {\r\n                                        _this.renderHighestPriority();\r\n                                    };\r\n                                    view.draw().then(continueRendering, continueRendering);\r\n                                    break;\r\n                            }\r\n                            return true;\r\n                        }\r\n                    }]);\r\n\r\n                    return PDFRenderingQueue;\r\n                }();\r\n\r\n                exports.RenderingStates = RenderingStates;\r\n                exports.PDFRenderingQueue = PDFRenderingQueue;\r\n\r\n                /***/\r\n            }),\r\n        /* 4 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.PDFPrintServiceFactory = exports.DefaultExternalServices = exports.PDFViewerApplication = undefined;\r\n\r\n                var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                var _pdfjsLib = __webpack_require__(1);\r\n\r\n                var _pdf_cursor_tools = __webpack_require__(6);\r\n\r\n                var _pdf_rendering_queue = __webpack_require__(3);\r\n\r\n                var _pdf_sidebar = __webpack_require__(24);\r\n\r\n                var _pdf_viewer = __webpack_require__(27);\r\n\r\n                var _dom_events = __webpack_require__(2);\r\n\r\n                var _overlay_manager = __webpack_require__(15);\r\n\r\n                var _password_prompt = __webpack_require__(16);\r\n\r\n                var _pdf_attachment_viewer = __webpack_require__(17);\r\n\r\n                var _pdf_document_properties = __webpack_require__(18);\r\n\r\n                var _pdf_find_bar = __webpack_require__(19);\r\n\r\n                var _pdf_find_controller = __webpack_require__(7);\r\n\r\n                var _pdf_history = __webpack_require__(20);\r\n\r\n                var _pdf_link_service = __webpack_require__(5);\r\n\r\n                var _pdf_outline_viewer = __webpack_require__(21);\r\n\r\n                var _pdf_presentation_mode = __webpack_require__(23);\r\n\r\n                var _pdf_thumbnail_viewer = __webpack_require__(26);\r\n\r\n                var _secondary_toolbar = __webpack_require__(29);\r\n\r\n                var _toolbar = __webpack_require__(31);\r\n\r\n                var _view_history = __webpack_require__(32);\r\n\r\n                var DEFAULT_SCALE_DELTA = 1.1;\r\n                var DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000;\r\n                function configure(PDFJS) {\r\n                    PDFJS.imageResourcesPath = \"./images/\";\r\n                    PDFJS.workerSrc = pdfScriptPath + \"/pdf.worker.js\";\r\n                    PDFJS.cMapUrl = pdfScriptPath + \"/cmaps/\";\r\n                    PDFJS.cMapPacked = true;\r\n                }\r\n                var DefaultExternalServices = {\r\n                    updateFindControlState: function updateFindControlState(data) { },\r\n                    initPassiveLoading: function initPassiveLoading(callbacks) { },\r\n                    fallback: function fallback(data, callback) { },\r\n                    reportTelemetry: function reportTelemetry(data) { },\r\n                    createDownloadManager: function createDownloadManager() {\r\n                        throw new Error('Not implemented: createDownloadManager');\r\n                    },\r\n                    createPreferences: function createPreferences() {\r\n                        throw new Error('Not implemented: createPreferences');\r\n                    },\r\n                    createL10n: function createL10n() {\r\n                        throw new Error('Not implemented: createL10n');\r\n                    },\r\n\r\n                    supportsIntegratedFind: false,\r\n                    supportsDocumentFonts: true,\r\n                    supportsDocumentColors: true,\r\n                    supportedMouseWheelZoomModifierKeys: {\r\n                        ctrlKey: true,\r\n                        metaKey: true\r\n                    }\r\n                };\r\n                var PDFViewerApplication = {\r\n                    initialBookmark: document.location.hash.substring(1),\r\n                    initialDestination: null,\r\n                    initialized: false,\r\n                    fellback: false,\r\n                    appConfig: null,\r\n                    pdfDocument: null,\r\n                    pdfLoadingTask: null,\r\n                    printService: null,\r\n                    pdfViewer: null,\r\n                    pdfThumbnailViewer: null,\r\n                    pdfRenderingQueue: null,\r\n                    pdfPresentationMode: null,\r\n                    pdfDocumentProperties: null,\r\n                    pdfLinkService: null,\r\n                    pdfHistory: null,\r\n                    pdfSidebar: null,\r\n                    pdfOutlineViewer: null,\r\n                    pdfAttachmentViewer: null,\r\n                    pdfCursorTools: null,\r\n                    store: null,\r\n                    downloadManager: null,\r\n                    overlayManager: null,\r\n                    preferences: null,\r\n                    toolbar: null,\r\n                    secondaryToolbar: null,\r\n                    eventBus: null,\r\n                    l10n: null,\r\n                    isInitialViewSet: false,\r\n                    downloadComplete: false,\r\n                    viewerPrefs: {\r\n                        sidebarViewOnLoad: _pdf_sidebar.SidebarView.NONE,\r\n                        pdfBugEnabled: false,\r\n                        showPreviousViewOnLoad: true,\r\n                        defaultZoomValue: '',\r\n                        disablePageMode: false,\r\n                        disablePageLabels: false,\r\n                        renderer: 'canvas',\r\n                        enhanceTextSelection: false,\r\n                        renderInteractiveForms: false,\r\n                        enablePrintAutoRotate: false\r\n                    },\r\n                    isViewerEmbedded: window.parent !== window,\r\n                    url: '',\r\n                    baseUrl: '',\r\n                    externalServices: DefaultExternalServices,\r\n                    _boundEvents: {},\r\n                    initialize: function initialize(appConfig) {\r\n                        var _this = this;\r\n\r\n                        this.preferences = this.externalServices.createPreferences();\r\n                        configure(_pdfjsLib.PDFJS);\r\n                        this.appConfig = appConfig;\r\n                        return this._readPreferences().then(function () {\r\n                            return _this._initializeL10n();\r\n                        }).then(function () {\r\n                            return _this._initializeViewerComponents();\r\n                        }).then(function () {\r\n                            _this.bindEvents();\r\n                            _this.bindWindowEvents();\r\n                            var appContainer = appConfig.appContainer || document.documentElement;\r\n                            _this.l10n.translate(appContainer).then(function () {\r\n                                _this.eventBus.dispatch('localized');\r\n                            });\r\n                            if (_this.isViewerEmbedded && !_pdfjsLib.PDFJS.isExternalLinkTargetSet()) {\r\n                                _pdfjsLib.PDFJS.externalLinkTarget = _pdfjsLib.PDFJS.LinkTarget.TOP;\r\n                            }\r\n                            _this.initialized = true;\r\n                        });\r\n                    },\r\n                    _readPreferences: function _readPreferences() {\r\n                        var preferences = this.preferences,\r\n                            viewerPrefs = this.viewerPrefs;\r\n\r\n                        return Promise.all([preferences.get('enableWebGL').then(function resolved(value) {\r\n                            _pdfjsLib.PDFJS.disableWebGL = !value;\r\n                        }), preferences.get('sidebarViewOnLoad').then(function resolved(value) {\r\n                            viewerPrefs['sidebarViewOnLoad'] = value;\r\n                        }), preferences.get('pdfBugEnabled').then(function resolved(value) {\r\n                            viewerPrefs['pdfBugEnabled'] = value;\r\n                        }), preferences.get('showPreviousViewOnLoad').then(function resolved(value) {\r\n                            viewerPrefs['showPreviousViewOnLoad'] = value;\r\n                        }), preferences.get('defaultZoomValue').then(function resolved(value) {\r\n                            viewerPrefs['defaultZoomValue'] = value;\r\n                        }), preferences.get('enhanceTextSelection').then(function resolved(value) {\r\n                            viewerPrefs['enhanceTextSelection'] = value;\r\n                        }), preferences.get('disableTextLayer').then(function resolved(value) {\r\n                            if (_pdfjsLib.PDFJS.disableTextLayer === true) {\r\n                                return;\r\n                            }\r\n                            _pdfjsLib.PDFJS.disableTextLayer = value;\r\n                        }), preferences.get('disableRange').then(function resolved(value) {\r\n                            if (_pdfjsLib.PDFJS.disableRange === true) {\r\n                                return;\r\n                            }\r\n                            _pdfjsLib.PDFJS.disableRange = value;\r\n                        }), preferences.get('disableStream').then(function resolved(value) {\r\n                            if (_pdfjsLib.PDFJS.disableStream === true) {\r\n                                return;\r\n                            }\r\n                            _pdfjsLib.PDFJS.disableStream = value;\r\n                        }), preferences.get('disableAutoFetch').then(function resolved(value) {\r\n                            _pdfjsLib.PDFJS.disableAutoFetch = value;\r\n                        }), preferences.get('disableFontFace').then(function resolved(value) {\r\n                            if (_pdfjsLib.PDFJS.disableFontFace === true) {\r\n                                return;\r\n                            }\r\n                            _pdfjsLib.PDFJS.disableFontFace = value;\r\n                        }), preferences.get('useOnlyCssZoom').then(function resolved(value) {\r\n                            _pdfjsLib.PDFJS.useOnlyCssZoom = value;\r\n                        }), preferences.get('externalLinkTarget').then(function resolved(value) {\r\n                            if (_pdfjsLib.PDFJS.isExternalLinkTargetSet()) {\r\n                                return;\r\n                            }\r\n                            _pdfjsLib.PDFJS.externalLinkTarget = value;\r\n                        }), preferences.get('renderer').then(function resolved(value) {\r\n                            viewerPrefs['renderer'] = value;\r\n                        }), preferences.get('renderInteractiveForms').then(function resolved(value) {\r\n                            viewerPrefs['renderInteractiveForms'] = value;\r\n                        }), preferences.get('disablePageMode').then(function resolved(value) {\r\n                            viewerPrefs['disablePageMode'] = value;\r\n                        }), preferences.get('disablePageLabels').then(function resolved(value) {\r\n                            viewerPrefs['disablePageLabels'] = value;\r\n                        }), preferences.get('enablePrintAutoRotate').then(function resolved(value) {\r\n                            viewerPrefs['enablePrintAutoRotate'] = value;\r\n                        })]).catch(function (reason) { });\r\n                    },\r\n                    _initializeL10n: function _initializeL10n() {\r\n                        if (this.viewerPrefs['pdfBugEnabled']) {\r\n                            var hash = document.location.hash.substring(1);\r\n                            var hashParams = (0, _ui_utils.parseQueryString)(hash);\r\n                            if ('locale' in hashParams) {\r\n                                _pdfjsLib.PDFJS.locale = hashParams['locale'];\r\n                            }\r\n                        }\r\n                        this.l10n = this.externalServices.createL10n();\r\n                        return this.l10n.getDirection().then(function (dir) {\r\n                            var orginalHtmlDir = $(\"#mainPdfWarrper\").attr(\"dir\");\r\n                            //console.log(\"orginal html dir: \" + orginalHtmlDir + \", new html dir: \" + dir)\r\n                            if (orginalHtmlDir !== undefined) {\r\n                                sessionStorage.setItem(\"o2h_orginal_html_dir\", orginalHtmlDir);\r\n                            } else {\r\n                                sessionStorage.setItem(\"o2h_orginal_html_dir\", \"\");\r\n                            }\r\n                            document.getElementById('mainPdfWarrper').dir = dir;\r\n                        });\r\n                    },\r\n                    _initializeViewerComponents: function _initializeViewerComponents() {\r\n                        var _this2 = this;\r\n\r\n                        var appConfig = this.appConfig;\r\n                        return new Promise(function (resolve, reject) {\r\n                            _this2.overlayManager = new _overlay_manager.OverlayManager();\r\n                            var eventBus = appConfig.eventBus || (0, _dom_events.getGlobalEventBus)();\r\n                            _this2.eventBus = eventBus;\r\n                            var pdfRenderingQueue = new _pdf_rendering_queue.PDFRenderingQueue();\r\n                            pdfRenderingQueue.onIdle = _this2.cleanup.bind(_this2);\r\n                            _this2.pdfRenderingQueue = pdfRenderingQueue;\r\n                            var pdfLinkService = new _pdf_link_service.PDFLinkService({ eventBus: eventBus });\r\n                            _this2.pdfLinkService = pdfLinkService;\r\n                            var downloadManager = _this2.externalServices.createDownloadManager();\r\n                            _this2.downloadManager = downloadManager;\r\n                            var container = appConfig.mainContainer;\r\n                            var viewer = appConfig.viewerContainer;\r\n                            _this2.pdfViewer = new _pdf_viewer.PDFViewer({\r\n                                container: container,\r\n                                viewer: viewer,\r\n                                eventBus: eventBus,\r\n                                renderingQueue: pdfRenderingQueue,\r\n                                linkService: pdfLinkService,\r\n                                downloadManager: downloadManager,\r\n                                renderer: _this2.viewerPrefs['renderer'],\r\n                                l10n: _this2.l10n,\r\n                                enhanceTextSelection: _this2.viewerPrefs['enhanceTextSelection'],\r\n                                renderInteractiveForms: _this2.viewerPrefs['renderInteractiveForms'],\r\n                                enablePrintAutoRotate: _this2.viewerPrefs['enablePrintAutoRotate']\r\n                            });\r\n                            pdfRenderingQueue.setViewer(_this2.pdfViewer);\r\n                            pdfLinkService.setViewer(_this2.pdfViewer);\r\n                            var thumbnailContainer = appConfig.sidebar.thumbnailView;\r\n                            _this2.pdfThumbnailViewer = new _pdf_thumbnail_viewer.PDFThumbnailViewer({\r\n                                container: thumbnailContainer,\r\n                                renderingQueue: pdfRenderingQueue,\r\n                                linkService: pdfLinkService,\r\n                                l10n: _this2.l10n\r\n                            });\r\n                            pdfRenderingQueue.setThumbnailViewer(_this2.pdfThumbnailViewer);\r\n                            _this2.pdfHistory = new _pdf_history.PDFHistory({\r\n                                linkService: pdfLinkService,\r\n                                eventBus: eventBus\r\n                            });\r\n                            pdfLinkService.setHistory(_this2.pdfHistory);\r\n                            _this2.findController = new _pdf_find_controller.PDFFindController({ pdfViewer: _this2.pdfViewer });\r\n                            _this2.findController.onUpdateResultsCount = function (matchCount) {\r\n                                if (_this2.supportsIntegratedFind) {\r\n                                    return;\r\n                                }\r\n                                _this2.findBar.updateResultsCount(matchCount);\r\n                            };\r\n                            _this2.findController.onUpdateState = function (state, previous, matchCount) {\r\n                                if (_this2.supportsIntegratedFind) {\r\n                                    _this2.externalServices.updateFindControlState({\r\n                                        result: state,\r\n                                        findPrevious: previous\r\n                                    });\r\n                                } else {\r\n                                    _this2.findBar.updateUIState(state, previous, matchCount);\r\n                                }\r\n                            };\r\n                            _this2.pdfViewer.setFindController(_this2.findController);\r\n                            var findBarConfig = Object.create(appConfig.findBar);\r\n                            findBarConfig.findController = _this2.findController;\r\n                            findBarConfig.eventBus = eventBus;\r\n                            _this2.findBar = new _pdf_find_bar.PDFFindBar(findBarConfig, _this2.l10n);\r\n                            _this2.pdfDocumentProperties = new _pdf_document_properties.PDFDocumentProperties(appConfig.pdfDocumentProperties, _this2.overlayManager, _this2.l10n);\r\n                            _this2.pdfCursorTools = new _pdf_cursor_tools.PDFCursorTools({\r\n                                container: container,\r\n                                eventBus: eventBus,\r\n                                preferences: _this2.preferences\r\n                            });\r\n                            _this2.toolbar = new _toolbar.Toolbar(appConfig.toolbar, container, eventBus, _this2.l10n);\r\n                            _this2.secondaryToolbar = new _secondary_toolbar.SecondaryToolbar(appConfig.secondaryToolbar, container, eventBus);\r\n                            if (_this2.supportsFullscreen) {\r\n                                _this2.pdfPresentationMode = new _pdf_presentation_mode.PDFPresentationMode({\r\n                                    container: container,\r\n                                    viewer: viewer,\r\n                                    pdfViewer: _this2.pdfViewer,\r\n                                    eventBus: eventBus,\r\n                                    contextMenuItems: appConfig.fullscreen\r\n                                });\r\n                            }\r\n                            _this2.passwordPrompt = new _password_prompt.PasswordPrompt(appConfig.passwordOverlay, _this2.overlayManager, _this2.l10n);\r\n                            _this2.pdfOutlineViewer = new _pdf_outline_viewer.PDFOutlineViewer({\r\n                                container: appConfig.sidebar.outlineView,\r\n                                eventBus: eventBus,\r\n                                linkService: pdfLinkService\r\n                            });\r\n                            _this2.pdfAttachmentViewer = new _pdf_attachment_viewer.PDFAttachmentViewer({\r\n                                container: appConfig.sidebar.attachmentsView,\r\n                                eventBus: eventBus,\r\n                                downloadManager: downloadManager\r\n                            });\r\n                            var sidebarConfig = Object.create(appConfig.sidebar);\r\n                            sidebarConfig.pdfViewer = _this2.pdfViewer;\r\n                            sidebarConfig.pdfThumbnailViewer = _this2.pdfThumbnailViewer;\r\n                            sidebarConfig.pdfOutlineViewer = _this2.pdfOutlineViewer;\r\n                            sidebarConfig.eventBus = eventBus;\r\n                            _this2.pdfSidebar = new _pdf_sidebar.PDFSidebar(sidebarConfig, _this2.l10n);\r\n                            _this2.pdfSidebar.onToggled = _this2.forceRendering.bind(_this2);\r\n                            resolve(undefined);\r\n                        });\r\n                    },\r\n                    run: function run(config) {\r\n                        this.initialize(config).then(webViewerInitialized);\r\n                    },\r\n                    zoomIn: function zoomIn(ticks) {\r\n                        var newScale = this.pdfViewer.currentScale;\r\n                        do {\r\n                            newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);\r\n                            newScale = Math.ceil(newScale * 10) / 10;\r\n                            newScale = Math.min(_ui_utils.MAX_SCALE, newScale);\r\n                        } while (--ticks > 0 && newScale < _ui_utils.MAX_SCALE);\r\n                        this.pdfViewer.currentScaleValue = newScale;\r\n                    },\r\n                    zoomOut: function zoomOut(ticks) {\r\n                        var newScale = this.pdfViewer.currentScale;\r\n                        do {\r\n                            newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);\r\n                            newScale = Math.floor(newScale * 10) / 10;\r\n                            newScale = Math.max(_ui_utils.MIN_SCALE, newScale);\r\n                        } while (--ticks > 0 && newScale > _ui_utils.MIN_SCALE);\r\n                        this.pdfViewer.currentScaleValue = newScale;\r\n                    },\r\n\r\n                    get pagesCount() {\r\n                        return this.pdfDocument ? this.pdfDocument.numPages : 0;\r\n                    },\r\n                    get pageRotation() {\r\n                        return this.pdfViewer.pagesRotation;\r\n                    },\r\n                    set page(val) {\r\n                        this.pdfViewer.currentPageNumber = val;\r\n                    },\r\n                    get page() {\r\n                        return this.pdfViewer.currentPageNumber;\r\n                    },\r\n                    get printing() {\r\n                        return !!this.printService;\r\n                    },\r\n                    get supportsPrinting() {\r\n                        return PDFPrintServiceFactory.instance.supportsPrinting;\r\n                    },\r\n                    get supportsFullscreen() {\r\n                        var support = void 0;\r\n                        var doc = document.documentElement;\r\n                        support = !!(doc.requestFullscreen || doc.mozRequestFullScreen || doc.webkitRequestFullScreen || doc.msRequestFullscreen);\r\n                        if (document.fullscreenEnabled === false || document.mozFullScreenEnabled === false || document.webkitFullscreenEnabled === false || document.msFullscreenEnabled === false) {\r\n                            support = false;\r\n                        }\r\n                        if (support && _pdfjsLib.PDFJS.disableFullscreen === true) {\r\n                            support = false;\r\n                        }\r\n                        return (0, _pdfjsLib.shadow)(this, 'supportsFullscreen', support);\r\n                    },\r\n                    get supportsIntegratedFind() {\r\n                        return this.externalServices.supportsIntegratedFind;\r\n                    },\r\n                    get supportsDocumentFonts() {\r\n                        return this.externalServices.supportsDocumentFonts;\r\n                    },\r\n                    get supportsDocumentColors() {\r\n                        return this.externalServices.supportsDocumentColors;\r\n                    },\r\n                    get loadingBar() {\r\n                        var bar = new _ui_utils.ProgressBar('#loadingBar');\r\n                        return (0, _pdfjsLib.shadow)(this, 'loadingBar', bar);\r\n                    },\r\n                    get supportedMouseWheelZoomModifierKeys() {\r\n                        return this.externalServices.supportedMouseWheelZoomModifierKeys;\r\n                    },\r\n                    initPassiveLoading: function initPassiveLoading() {\r\n                        throw new Error('Not implemented: initPassiveLoading');\r\n                    },\r\n                    setTitleUsingUrl: function setTitleUsingUrl(url) {\r\n                        this.url = url;\r\n                        this.baseUrl = url.split('#')[0];\r\n                        var title = (0, _ui_utils.getPDFFileNameFromURL)(url, '');\r\n                        if (!title) {\r\n                            try {\r\n                                title = decodeURIComponent((0, _pdfjsLib.getFilenameFromUrl)(url)) || url;\r\n                            } catch (ex) {\r\n                                title = url;\r\n                            }\r\n                        }\r\n                        this.setTitle(title);\r\n                    },\r\n                    setTitle: function setTitle(title) {\r\n                        if (this.isViewerEmbedded) {\r\n                            return;\r\n                        }\r\n                        document.title = title;\r\n                    },\r\n                    close: function close() {\r\n                        var errorWrapper = this.appConfig.errorWrapper.container;\r\n                        errorWrapper.setAttribute('hidden', 'true');\r\n                        if (!this.pdfLoadingTask) {\r\n                            return Promise.resolve();\r\n                        }\r\n                        var promise = this.pdfLoadingTask.destroy();\r\n                        this.pdfLoadingTask = null;\r\n                        if (this.pdfDocument) {\r\n                            this.pdfDocument = null;\r\n                            this.pdfThumbnailViewer.setDocument(null);\r\n                            this.pdfViewer.setDocument(null);\r\n                            this.pdfLinkService.setDocument(null, null);\r\n                            this.pdfDocumentProperties.setDocument(null, null);\r\n                        }\r\n                        this.store = null;\r\n                        this.isInitialViewSet = false;\r\n                        this.downloadComplete = false;\r\n                        this.pdfSidebar.reset();\r\n                        this.pdfOutlineViewer.reset();\r\n                        this.pdfAttachmentViewer.reset();\r\n                        this.findController.reset();\r\n                        this.findBar.reset();\r\n                        this.toolbar.reset();\r\n                        this.secondaryToolbar.reset();\r\n                        if (typeof PDFBug !== 'undefined') {\r\n                            PDFBug.cleanup();\r\n                        }\r\n                        return promise;\r\n                    },\r\n                    open: function open(file, args) {\r\n                        var _this3 = this;\r\n\r\n                        if (arguments.length > 2 || typeof args === 'number') {\r\n                            return Promise.reject(new Error('Call of open() with obsolete signature.'));\r\n                        }\r\n                        if (this.pdfLoadingTask) {\r\n                            return this.close().then(function () {\r\n                                _this3.preferences.reload();\r\n                                return _this3.open(file, args);\r\n                            });\r\n                        }\r\n                        var parameters = Object.create(null),\r\n                            scale = void 0;\r\n                        if (typeof file === 'string') {\r\n                            this.setTitleUsingUrl(file);\r\n                            parameters.url = file;\r\n                        } else if (file && 'byteLength' in file) {\r\n                            parameters.data = file;\r\n                        } else if (file.url && file.originalUrl) {\r\n                            this.setTitleUsingUrl(file.originalUrl);\r\n                            parameters.url = file.url;\r\n                        }\r\n                        if (args) {\r\n                            for (var prop in args) {\r\n                                parameters[prop] = args[prop];\r\n                            }\r\n                            if (args.scale) {\r\n                                scale = args.scale;\r\n                            }\r\n                            if (args.length) {\r\n                                this.pdfDocumentProperties.setFileSize(args.length);\r\n                            }\r\n                        }\r\n                        var loadingTask = (0, _pdfjsLib.getDocument)(parameters);\r\n                        this.pdfLoadingTask = loadingTask;\r\n                        loadingTask.onPassword = function (updateCallback, reason) {\r\n                            _this3.passwordPrompt.setUpdateCallback(updateCallback, reason);\r\n                            _this3.passwordPrompt.open();\r\n                        };\r\n                        loadingTask.onProgress = function (_ref) {\r\n                            var loaded = _ref.loaded,\r\n                                total = _ref.total;\r\n\r\n                            _this3.progress(loaded / total);\r\n                        };\r\n                        loadingTask.onUnsupportedFeature = this.fallback.bind(this);\r\n                        return loadingTask.promise.then(function (pdfDocument) {\r\n                            _this3.load(pdfDocument, scale);\r\n                        }, function (exception) {\r\n                            var message = exception && exception.message;\r\n                            var loadingErrorMessage = void 0;\r\n                            if (exception instanceof _pdfjsLib.InvalidPDFException) {\r\n                                loadingErrorMessage = _this3.l10n.get('invalid_file_error', null, 'Invalid or corrupted PDF file.');\r\n                            } else if (exception instanceof _pdfjsLib.MissingPDFException) {\r\n                                loadingErrorMessage = _this3.l10n.get('missing_file_error', null, 'Missing PDF file.');\r\n                            } else if (exception instanceof _pdfjsLib.UnexpectedResponseException) {\r\n                                loadingErrorMessage = _this3.l10n.get('unexpected_response_error', null, 'Unexpected server response.');\r\n                            } else {\r\n                                loadingErrorMessage = _this3.l10n.get('loading_error', null, 'An error occurred while loading the PDF.');\r\n                            }\r\n                            return loadingErrorMessage.then(function (msg) {\r\n                                _this3.error(msg, { message: message });\r\n                                throw new Error(msg);\r\n                            });\r\n                        });\r\n                    },\r\n                    download: function download() {\r\n                        var _this4 = this;\r\n\r\n                        function downloadByUrl() {\r\n                            downloadManager.downloadUrl(url, filename);\r\n                        }\r\n                        var url = this.baseUrl;\r\n                        var filename = (0, _ui_utils.getPDFFileNameFromURL)(this.url);\r\n                        var downloadManager = this.downloadManager;\r\n                        downloadManager.onerror = function (err) {\r\n                            _this4.error('PDF failed to download: ' + err);\r\n                        };\r\n                        if (!this.pdfDocument || !this.downloadComplete) {\r\n                            downloadByUrl();\r\n                            return;\r\n                        }\r\n                        this.pdfDocument.getData().then(function (data) {\r\n                            var blob = (0, _pdfjsLib.createBlob)(data, 'application/pdf');\r\n                            downloadManager.download(blob, url, filename);\r\n                        }).catch(downloadByUrl);\r\n                    },\r\n                    fallback: function fallback(featureId) { },\r\n                    error: function error(message, moreInfo) {\r\n                        var moreInfoText = [this.l10n.get('error_version_info', {\r\n                            version: _pdfjsLib.version || '?',\r\n                            build: _pdfjsLib.build || '?'\r\n                        }, 'PDF.js v{{version}} (build: {{build}})')];\r\n                        if (moreInfo) {\r\n                            moreInfoText.push(this.l10n.get('error_message', { message: moreInfo.message }, 'Message: {{message}}'));\r\n                            if (moreInfo.stack) {\r\n                                moreInfoText.push(this.l10n.get('error_stack', { stack: moreInfo.stack }, 'Stack: {{stack}}'));\r\n                            } else {\r\n                                if (moreInfo.filename) {\r\n                                    moreInfoText.push(this.l10n.get('error_file', { file: moreInfo.filename }, 'File: {{file}}'));\r\n                                }\r\n                                if (moreInfo.lineNumber) {\r\n                                    moreInfoText.push(this.l10n.get('error_line', { line: moreInfo.lineNumber }, 'Line: {{line}}'));\r\n                                }\r\n                            }\r\n                        }\r\n                        var errorWrapperConfig = this.appConfig.errorWrapper;\r\n                        var errorWrapper = errorWrapperConfig.container;\r\n                        errorWrapper.removeAttribute('hidden');\r\n                        var errorMessage = errorWrapperConfig.errorMessage;\r\n                        errorMessage.textContent = message;\r\n                        var closeButton = errorWrapperConfig.closeButton;\r\n                        closeButton.onclick = function () {\r\n                            errorWrapper.setAttribute('hidden', 'true');\r\n                        };\r\n                        var errorMoreInfo = errorWrapperConfig.errorMoreInfo;\r\n                        var moreInfoButton = errorWrapperConfig.moreInfoButton;\r\n                        var lessInfoButton = errorWrapperConfig.lessInfoButton;\r\n                        moreInfoButton.onclick = function () {\r\n                            errorMoreInfo.removeAttribute('hidden');\r\n                            moreInfoButton.setAttribute('hidden', 'true');\r\n                            lessInfoButton.removeAttribute('hidden');\r\n                            errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px';\r\n                        };\r\n                        lessInfoButton.onclick = function () {\r\n                            errorMoreInfo.setAttribute('hidden', 'true');\r\n                            moreInfoButton.removeAttribute('hidden');\r\n                            lessInfoButton.setAttribute('hidden', 'true');\r\n                        };\r\n                        moreInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler;\r\n                        lessInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler;\r\n                        closeButton.oncontextmenu = _ui_utils.noContextMenuHandler;\r\n                        moreInfoButton.removeAttribute('hidden');\r\n                        lessInfoButton.setAttribute('hidden', 'true');\r\n                        Promise.all(moreInfoText).then(function (parts) {\r\n                            errorMoreInfo.value = parts.join('\\n');\r\n                        });\r\n                    },\r\n                    progress: function progress(level) {\r\n                        var _this5 = this;\r\n\r\n                        if (this.downloadComplete) {\r\n                            return;\r\n                        }\r\n                        var percent = Math.round(level * 100);\r\n                        if (percent > this.loadingBar.percent || isNaN(percent)) {\r\n                            this.loadingBar.percent = percent;\r\n                            if (_pdfjsLib.PDFJS.disableAutoFetch && percent) {\r\n                                if (this.disableAutoFetchLoadingBarTimeout) {\r\n                                    clearTimeout(this.disableAutoFetchLoadingBarTimeout);\r\n                                    this.disableAutoFetchLoadingBarTimeout = null;\r\n                                }\r\n                                this.loadingBar.show();\r\n                                this.disableAutoFetchLoadingBarTimeout = setTimeout(function () {\r\n                                    _this5.loadingBar.hide();\r\n                                    _this5.disableAutoFetchLoadingBarTimeout = null;\r\n                                }, DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT);\r\n                            }\r\n                        }\r\n                    },\r\n                    load: function load(pdfDocument, scale) {\r\n                        var _this6 = this;\r\n\r\n                        scale = scale || _ui_utils.UNKNOWN_SCALE;\r\n                        this.pdfDocument = pdfDocument;\r\n                        pdfDocument.getDownloadInfo().then(function () {\r\n                            _this6.downloadComplete = true;\r\n                            _this6.loadingBar.hide();\r\n                            firstPagePromise.then(function () {\r\n                                _this6.eventBus.dispatch('documentload', { source: _this6 });\r\n                            });\r\n                        });\r\n                        var pageModePromise = pdfDocument.getPageMode().catch(function () { });\r\n                        this.toolbar.setPagesCount(pdfDocument.numPages, false);\r\n                        this.secondaryToolbar.setPagesCount(pdfDocument.numPages);\r\n                        var id = this.documentFingerprint = pdfDocument.fingerprint;\r\n                        var store = this.store = new _view_history.ViewHistory(id);\r\n                        var baseDocumentUrl = void 0;\r\n                        baseDocumentUrl = null;\r\n                        this.pdfLinkService.setDocument(pdfDocument, baseDocumentUrl);\r\n                        this.pdfDocumentProperties.setDocument(pdfDocument, this.url);\r\n                        var pdfViewer = this.pdfViewer;\r\n                        pdfViewer.setDocument(pdfDocument);\r\n                        var firstPagePromise = pdfViewer.firstPagePromise;\r\n                        var pagesPromise = pdfViewer.pagesPromise;\r\n                        var onePageRendered = pdfViewer.onePageRendered;\r\n                        var pdfThumbnailViewer = this.pdfThumbnailViewer;\r\n                        pdfThumbnailViewer.setDocument(pdfDocument);\r\n                        firstPagePromise.then(function (pdfPage) {\r\n                            _this6.loadingBar.setWidth(_this6.appConfig.viewerContainer);\r\n                            if (!_pdfjsLib.PDFJS.disableHistory && !_this6.isViewerEmbedded) {\r\n                                if (!_this6.viewerPrefs['showPreviousViewOnLoad']) {\r\n                                    _this6.pdfHistory.clearHistoryState();\r\n                                }\r\n                                _this6.pdfHistory.initialize(_this6.documentFingerprint);\r\n                                if (_this6.pdfHistory.initialDestination) {\r\n                                    _this6.initialDestination = _this6.pdfHistory.initialDestination;\r\n                                } else if (_this6.pdfHistory.initialBookmark) {\r\n                                    _this6.initialBookmark = _this6.pdfHistory.initialBookmark;\r\n                                }\r\n                            }\r\n                            var initialParams = {\r\n                                destination: _this6.initialDestination,\r\n                                bookmark: _this6.initialBookmark,\r\n                                hash: null\r\n                            };\r\n                            var storePromise = store.getMultiple({\r\n                                exists: false,\r\n                                page: '1',\r\n                                zoom: _ui_utils.DEFAULT_SCALE_VALUE,\r\n                                scrollLeft: '0',\r\n                                scrollTop: '0',\r\n                                sidebarView: _pdf_sidebar.SidebarView.NONE\r\n                            }).catch(function () { });\r\n                            Promise.all([storePromise, pageModePromise]).then(function (_ref2) {\r\n                                var _ref3 = _slicedToArray(_ref2, 2),\r\n                                    _ref3$ = _ref3[0],\r\n                                    values = _ref3$ === undefined ? {} : _ref3$,\r\n                                    pageMode = _ref3[1];\r\n\r\n                                var hash = _this6.viewerPrefs['defaultZoomValue'] ? 'zoom=' + _this6.viewerPrefs['defaultZoomValue'] : null;\r\n                                var sidebarView = _this6.viewerPrefs['sidebarViewOnLoad'];\r\n                                if (values.exists && _this6.viewerPrefs['showPreviousViewOnLoad']) {\r\n                                    hash = 'page=' + values.page + '&zoom=' + (_this6.viewerPrefs['defaultZoomValue'] || values.zoom) + ',' + values.scrollLeft + ',' + values.scrollTop;\r\n                                    sidebarView = sidebarView || values.sidebarView | 0;\r\n                                }\r\n                                if (pageMode && !_this6.viewerPrefs['disablePageMode']) {\r\n                                    sidebarView = sidebarView || apiPageModeToSidebarView(pageMode);\r\n                                }\r\n                                return {\r\n                                    hash: hash,\r\n                                    sidebarView: sidebarView\r\n                                };\r\n                            }).then(function (_ref4) {\r\n                                var hash = _ref4.hash,\r\n                                    sidebarView = _ref4.sidebarView;\r\n\r\n                                _this6.setInitialView(hash, {\r\n                                    sidebarView: sidebarView,\r\n                                    scale: scale\r\n                                });\r\n                                initialParams.hash = hash;\r\n                                if (!_this6.isViewerEmbedded) {\r\n                                    pdfViewer.focus();\r\n                                }\r\n                                return pagesPromise;\r\n                            }).then(function () {\r\n                                if (!initialParams.destination && !initialParams.bookmark && !initialParams.hash) {\r\n                                    return;\r\n                                }\r\n                                if (pdfViewer.hasEqualPageSizes) {\r\n                                    return;\r\n                                }\r\n                                _this6.initialDestination = initialParams.destination;\r\n                                _this6.initialBookmark = initialParams.bookmark;\r\n                                pdfViewer.currentScaleValue = pdfViewer.currentScaleValue;\r\n                                _this6.setInitialView(initialParams.hash);\r\n                            }).then(function () {\r\n                                pdfViewer.update();\r\n                            });\r\n                        });\r\n                        pdfDocument.getPageLabels().then(function (labels) {\r\n                            if (!labels || _this6.viewerPrefs['disablePageLabels']) {\r\n                                return;\r\n                            }\r\n                            var i = 0,\r\n                                numLabels = labels.length;\r\n                            if (numLabels !== _this6.pagesCount) {\r\n                                console.error('The number of Page Labels does not match ' + 'the number of pages in the document.');\r\n                                return;\r\n                            }\r\n                            while (i < numLabels && labels[i] === (i + 1).toString()) {\r\n                                i++;\r\n                            }\r\n                            if (i === numLabels) {\r\n                                return;\r\n                            }\r\n                            pdfViewer.setPageLabels(labels);\r\n                            pdfThumbnailViewer.setPageLabels(labels);\r\n                            _this6.toolbar.setPagesCount(pdfDocument.numPages, true);\r\n                            _this6.toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);\r\n                        });\r\n                        pagesPromise.then(function () {\r\n                            if (!_this6.supportsPrinting) {\r\n                                return;\r\n                            }\r\n                            pdfDocument.getJavaScript().then(function (javaScript) {\r\n                                if (javaScript.length) {\r\n                                    console.warn('Warning: JavaScript is not supported');\r\n                                    _this6.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.javaScript);\r\n                                }\r\n                                var regex = /\\bprint\\s*\\(/;\r\n                                for (var i = 0, ii = javaScript.length; i < ii; i++) {\r\n                                    var js = javaScript[i];\r\n                                    if (js && regex.test(js)) {\r\n                                        setTimeout(function () {\r\n                                            window.print();\r\n                                        });\r\n                                        return;\r\n                                    }\r\n                                }\r\n                            });\r\n                        });\r\n                        Promise.all([onePageRendered, _ui_utils.animationStarted]).then(function () {\r\n                            pdfDocument.getOutline().then(function (outline) {\r\n                                _this6.pdfOutlineViewer.render({ outline: outline });\r\n                            });\r\n                            pdfDocument.getAttachments().then(function (attachments) {\r\n                                _this6.pdfAttachmentViewer.render({ attachments: attachments });\r\n                            });\r\n                        });\r\n                        pdfDocument.getMetadata().then(function (_ref5) {\r\n                            var info = _ref5.info,\r\n                                metadata = _ref5.metadata;\r\n\r\n                            _this6.documentInfo = info;\r\n                            _this6.metadata = metadata;\r\n                            console.log('PDF ' + pdfDocument.fingerprint + ' [' + info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() + ' / ' + (info.Creator || '-').trim() + ']' + ' (PDF.js: ' + (_pdfjsLib.version || '-') + (!_pdfjsLib.PDFJS.disableWebGL ? ' [WebGL]' : '') + ')');\r\n                            var pdfTitle = void 0;\r\n                            if (metadata && metadata.has('dc:title')) {\r\n                                var title = metadata.get('dc:title');\r\n                                if (title !== 'Untitled') {\r\n                                    pdfTitle = title;\r\n                                }\r\n                            }\r\n                            if (!pdfTitle && info && info['Title']) {\r\n                                pdfTitle = info['Title'];\r\n                            }\r\n                            if (pdfTitle) {\r\n                                _this6.setTitle(pdfTitle + ' - ' + document.title);\r\n                            }\r\n                            if (info.IsAcroFormPresent) {\r\n                                console.warn('Warning: AcroForm/XFA is not supported');\r\n                                _this6.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.forms);\r\n                            }\r\n\r\n                        });\r\n                    },\r\n                    setInitialView: function setInitialView(storedHash) {\r\n                        var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\r\n                        var _options$scale = options.scale,\r\n                            scale = _options$scale === undefined ? 0 : _options$scale,\r\n                            _options$sidebarView = options.sidebarView,\r\n                            sidebarView = _options$sidebarView === undefined ? _pdf_sidebar.SidebarView.NONE : _options$sidebarView;\r\n\r\n                        this.isInitialViewSet = true;\r\n                        this.pdfSidebar.setInitialView(sidebarView);\r\n                        if (this.initialDestination) {\r\n                            this.pdfLinkService.navigateTo(this.initialDestination);\r\n                            this.initialDestination = null;\r\n                        } else if (this.initialBookmark) {\r\n                            this.pdfLinkService.setHash(this.initialBookmark);\r\n                            this.pdfHistory.push({ hash: this.initialBookmark }, true);\r\n                            this.initialBookmark = null;\r\n                        } else if (storedHash) {\r\n                            this.pdfLinkService.setHash(storedHash);\r\n                        } else if (scale) {\r\n                            this.pdfViewer.currentScaleValue = scale;\r\n                            this.page = 1;\r\n                        }\r\n                        this.toolbar.setPageNumber(this.pdfViewer.currentPageNumber, this.pdfViewer.currentPageLabel);\r\n                        this.secondaryToolbar.setPageNumber(this.pdfViewer.currentPageNumber);\r\n                        if (!this.pdfViewer.currentScaleValue) {\r\n                            this.pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;\r\n                        }\r\n                    },\r\n                    cleanup: function cleanup() {\r\n                        if (!this.pdfDocument) {\r\n                            return;\r\n                        }\r\n                        this.pdfViewer.cleanup();\r\n                        this.pdfThumbnailViewer.cleanup();\r\n                        if (this.pdfViewer.renderer !== _ui_utils.RendererType.SVG) {\r\n                            this.pdfDocument.cleanup();\r\n                        }\r\n                    },\r\n                    forceRendering: function forceRendering() {\r\n                        this.pdfRenderingQueue.printing = this.printing;\r\n                        this.pdfRenderingQueue.isThumbnailViewEnabled = this.pdfSidebar.isThumbnailViewVisible;\r\n                        this.pdfRenderingQueue.renderHighestPriority();\r\n                    },\r\n                    beforePrint: function beforePrint() {\r\n                        var _this7 = this;\r\n\r\n                        if (this.printService) {\r\n                            return;\r\n                        }\r\n                        if (!this.supportsPrinting) {\r\n                            this.l10n.get('printing_not_supported', null, 'Warning: Printing is not fully supported by ' + 'this browser.').then(function (printMessage) {\r\n                                _this7.error(printMessage);\r\n                            });\r\n                            return;\r\n                        }\r\n                        if (!this.pdfViewer.pageViewsReady) {\r\n                            this.l10n.get('printing_not_ready', null, 'Warning: The PDF is not fully loaded for printing.').then(function (notReadyMessage) {\r\n                                window.alert(notReadyMessage);\r\n                            });\r\n                            return;\r\n                        }\r\n                        var pagesOverview = this.pdfViewer.getPagesOverview();\r\n                        var printContainer = this.appConfig.printContainer;\r\n                        var printService = PDFPrintServiceFactory.instance.createPrintService(this.pdfDocument, pagesOverview, printContainer, this.l10n);\r\n                        this.printService = printService;\r\n                        this.forceRendering();\r\n                        printService.layout();\r\n                    },\r\n\r\n                    afterPrint: function pdfViewSetupAfterPrint() {\r\n                        if (this.printService) {\r\n                            this.printService.destroy();\r\n                            this.printService = null;\r\n                        }\r\n                        this.forceRendering();\r\n                    },\r\n                    rotatePages: function rotatePages(delta) {\r\n                        if (!this.pdfDocument) {\r\n                            return;\r\n                        }\r\n                        var pdfViewer = this.pdfViewer,\r\n                            pdfThumbnailViewer = this.pdfThumbnailViewer;\r\n\r\n                        var pageNumber = pdfViewer.currentPageNumber;\r\n                        var newRotation = (pdfViewer.pagesRotation + 360 + delta) % 360;\r\n                        pdfViewer.pagesRotation = newRotation;\r\n                        pdfThumbnailViewer.pagesRotation = newRotation;\r\n                        this.forceRendering();\r\n                        pdfViewer.currentPageNumber = pageNumber;\r\n                    },\r\n                    requestPresentationMode: function requestPresentationMode() {\r\n                        if (!this.pdfPresentationMode) {\r\n                            return;\r\n                        }\r\n                        this.pdfPresentationMode.request();\r\n                    },\r\n                    bindEvents: function bindEvents() {\r\n                        var eventBus = this.eventBus,\r\n                            _boundEvents = this._boundEvents;\r\n\r\n                        _boundEvents.beforePrint = this.beforePrint.bind(this);\r\n                        _boundEvents.afterPrint = this.afterPrint.bind(this);\r\n                        eventBus.on('resize', webViewerResize);\r\n                        eventBus.on('hashchange', webViewerHashchange);\r\n                        eventBus.on('beforeprint', _boundEvents.beforePrint);\r\n                        eventBus.on('afterprint', _boundEvents.afterPrint);\r\n                        eventBus.on('pagerendered', webViewerPageRendered);\r\n                        eventBus.on('textlayerrendered', webViewerTextLayerRendered);\r\n                        eventBus.on('updateviewarea', webViewerUpdateViewarea);\r\n                        eventBus.on('pagechanging', webViewerPageChanging);\r\n                        eventBus.on('scalechanging', webViewerScaleChanging);\r\n                        eventBus.on('sidebarviewchanged', webViewerSidebarViewChanged);\r\n                        eventBus.on('pagemode', webViewerPageMode);\r\n                        eventBus.on('namedaction', webViewerNamedAction);\r\n                        eventBus.on('presentationmodechanged', webViewerPresentationModeChanged);\r\n                        eventBus.on('presentationmode', webViewerPresentationMode);\r\n                        eventBus.on('openfile', webViewerOpenFile);\r\n                        eventBus.on('print', webViewerPrint);\r\n                        eventBus.on('download', webViewerDownload);\r\n                        eventBus.on('firstpage', webViewerFirstPage);\r\n                        eventBus.on('lastpage', webViewerLastPage);\r\n                        eventBus.on('nextpage', webViewerNextPage);\r\n                        eventBus.on('previouspage', webViewerPreviousPage);\r\n                        eventBus.on('zoomin', webViewerZoomIn);\r\n                        eventBus.on('zoomout', webViewerZoomOut);\r\n                        eventBus.on('pagenumberchanged', webViewerPageNumberChanged);\r\n                        eventBus.on('scalechanged', webViewerScaleChanged);\r\n                        eventBus.on('rotatecw', webViewerRotateCw);\r\n                        eventBus.on('rotateccw', webViewerRotateCcw);\r\n                        eventBus.on('documentproperties', webViewerDocumentProperties);\r\n                        eventBus.on('find', webViewerFind);\r\n                        eventBus.on('findfromurlhash', webViewerFindFromUrlHash);\r\n                        eventBus.on('fileinputchange', webViewerFileInputChange);\r\n                    },\r\n                    bindWindowEvents: function bindWindowEvents() {\r\n                        var eventBus = this.eventBus,\r\n                            _boundEvents = this._boundEvents;\r\n\r\n                        _boundEvents.windowResize = function () {\r\n                            eventBus.dispatch('resize');\r\n                        };\r\n                        _boundEvents.windowHashChange = function () {\r\n                            eventBus.dispatch('hashchange', { hash: document.location.hash.substring(1) });\r\n                        };\r\n                        _boundEvents.windowBeforePrint = function () {\r\n                            eventBus.dispatch('beforeprint');\r\n                        };\r\n                        _boundEvents.windowAfterPrint = function () {\r\n                            eventBus.dispatch('afterprint');\r\n                        };\r\n                        window.addEventListener('wheel', webViewerWheel);\r\n                        window.addEventListener('click', webViewerClick);\r\n                        window.addEventListener('keydown', webViewerKeyDown);\r\n                        window.addEventListener('resize', _boundEvents.windowResize);\r\n                        window.addEventListener('hashchange', _boundEvents.windowHashChange);\r\n                        window.addEventListener('beforeprint', _boundEvents.windowBeforePrint);\r\n                        window.addEventListener('afterprint', _boundEvents.windowAfterPrint);\r\n                        _boundEvents.windowChange = function (evt) {\r\n                            var files = evt.target.files;\r\n                            if (!files || files.length === 0) {\r\n                                return;\r\n                            }\r\n                            eventBus.dispatch('fileinputchange', { fileInput: evt.target });\r\n                        };\r\n                        window.addEventListener('change', _boundEvents.windowChange);\r\n                    },\r\n                    unbindEvents: function unbindEvents() {\r\n                        var eventBus = this.eventBus,\r\n                            _boundEvents = this._boundEvents;\r\n\r\n                        eventBus.off('resize', webViewerResize);\r\n                        eventBus.off('hashchange', webViewerHashchange);\r\n                        eventBus.off('beforeprint', _boundEvents.beforePrint);\r\n                        eventBus.off('afterprint', _boundEvents.afterPrint);\r\n                        eventBus.off('pagerendered', webViewerPageRendered);\r\n                        eventBus.off('textlayerrendered', webViewerTextLayerRendered);\r\n                        eventBus.off('updateviewarea', webViewerUpdateViewarea);\r\n                        eventBus.off('pagechanging', webViewerPageChanging);\r\n                        eventBus.off('scalechanging', webViewerScaleChanging);\r\n                        eventBus.off('sidebarviewchanged', webViewerSidebarViewChanged);\r\n                        eventBus.off('pagemode', webViewerPageMode);\r\n                        eventBus.off('namedaction', webViewerNamedAction);\r\n                        eventBus.off('presentationmodechanged', webViewerPresentationModeChanged);\r\n                        eventBus.off('presentationmode', webViewerPresentationMode);\r\n                        eventBus.off('openfile', webViewerOpenFile);\r\n                        eventBus.off('print', webViewerPrint);\r\n                        eventBus.off('download', webViewerDownload);\r\n                        eventBus.off('firstpage', webViewerFirstPage);\r\n                        eventBus.off('lastpage', webViewerLastPage);\r\n                        eventBus.off('nextpage', webViewerNextPage);\r\n                        eventBus.off('previouspage', webViewerPreviousPage);\r\n                        eventBus.off('zoomin', webViewerZoomIn);\r\n                        eventBus.off('zoomout', webViewerZoomOut);\r\n                        eventBus.off('pagenumberchanged', webViewerPageNumberChanged);\r\n                        eventBus.off('scalechanged', webViewerScaleChanged);\r\n                        eventBus.off('rotatecw', webViewerRotateCw);\r\n                        eventBus.off('rotateccw', webViewerRotateCcw);\r\n                        eventBus.off('documentproperties', webViewerDocumentProperties);\r\n                        eventBus.off('find', webViewerFind);\r\n                        eventBus.off('findfromurlhash', webViewerFindFromUrlHash);\r\n                        eventBus.off('fileinputchange', webViewerFileInputChange);\r\n                        _boundEvents.beforePrint = null;\r\n                        _boundEvents.afterPrint = null;\r\n                    },\r\n                    unbindWindowEvents: function unbindWindowEvents() {\r\n                        var _boundEvents = this._boundEvents;\r\n\r\n                        window.removeEventListener('wheel', webViewerWheel);\r\n                        window.removeEventListener('click', webViewerClick);\r\n                        window.removeEventListener('keydown', webViewerKeyDown);\r\n                        window.removeEventListener('resize', _boundEvents.windowResize);\r\n                        window.removeEventListener('hashchange', _boundEvents.windowHashChange);\r\n                        window.removeEventListener('beforeprint', _boundEvents.windowBeforePrint);\r\n                        window.removeEventListener('afterprint', _boundEvents.windowAfterPrint);\r\n                        window.removeEventListener('change', _boundEvents.windowChange);\r\n                        _boundEvents.windowChange = null;\r\n                        _boundEvents.windowResize = null;\r\n                        _boundEvents.windowHashChange = null;\r\n                        _boundEvents.windowBeforePrint = null;\r\n                        _boundEvents.windowAfterPrint = null;\r\n                    }\r\n                };\r\n                var validateFileURL = void 0;\r\n                {\r\n                    var HOSTED_VIEWER_ORIGINS = ['null', 'http://mozilla.github.io', 'https://mozilla.github.io'];\r\n                    validateFileURL = function validateFileURL(file) {\r\n                        if (file === undefined) {\r\n                            return;\r\n                        }\r\n                        try {\r\n                            var viewerOrigin = new URL(window.location.href).origin || 'null';\r\n                            if (HOSTED_VIEWER_ORIGINS.indexOf(viewerOrigin) >= 0) {\r\n                                return;\r\n                            }\r\n                            var fileOrigin = new URL(file, window.location.href).origin;\r\n                            if (fileOrigin !== viewerOrigin) {\r\n                                throw new Error('file origin does not match viewer\\'s');\r\n                            }\r\n                        } catch (ex) {\r\n                            var message = ex && ex.message;\r\n                            PDFViewerApplication.l10n.get('loading_error', null, 'An error occurred while loading the PDF.').then(function (loadingErrorMessage) {\r\n                                PDFViewerApplication.error(loadingErrorMessage, { message: message });\r\n                            });\r\n                            throw ex;\r\n                        }\r\n                    };\r\n                }\r\n                function loadAndEnablePDFBug(enabledTabs) {\r\n                    return new Promise(function (resolve, reject) {\r\n                        var appConfig = PDFViewerApplication.appConfig;\r\n                        var script = document.createElement('script');\r\n                        script.src = appConfig.debuggerScriptPath;\r\n                        script.onload = function () {\r\n                            PDFBug.enable(enabledTabs);\r\n                            PDFBug.init({\r\n                                PDFJS: _pdfjsLib.PDFJS,\r\n                                OPS: _pdfjsLib.OPS\r\n                            }, appConfig.mainContainer);\r\n                            resolve();\r\n                        };\r\n                        script.onerror = function () {\r\n                            reject(new Error('Cannot load debugger at ' + script.src));\r\n                        };\r\n                        (document.getElementsByTagName('head')[0] || document.body).appendChild(script);\r\n                    });\r\n                }\r\n                function webViewerInitialized() {\r\n                    var appConfig = PDFViewerApplication.appConfig;\r\n                    var file = void 0;\r\n                    var queryString = document.location.search.substring(1);\r\n                    //var params = (0, _ui_utils.parseQueryString)(queryString);\r\n                    //file = 'file' in params ? params.file : appConfig.defaultUrl;\r\n                    file = appConfig.defaultUrl;\r\n                    validateFileURL(file);\r\n                    var waitForBeforeOpening = [];\r\n                    var fileInput = document.createElement('input');\r\n                    fileInput.id = appConfig.openFileInputName;\r\n                    fileInput.className = 'fileInput';\r\n                    fileInput.setAttribute('type', 'file');\r\n                    fileInput.oncontextmenu = _ui_utils.noContextMenuHandler;\r\n                    document.body.appendChild(fileInput);\r\n                    if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {\r\n                        appConfig.toolbar.openFile.setAttribute('hidden', 'true');\r\n                        appConfig.secondaryToolbar.openFileButton.setAttribute('hidden', 'true');\r\n                    } else {\r\n                        fileInput.value = null;\r\n                    }\r\n                    if (PDFViewerApplication.viewerPrefs['pdfBugEnabled']) {\r\n                        var hash = document.location.hash.substring(1);\r\n                        var hashParams = (0, _ui_utils.parseQueryString)(hash);\r\n                        if ('disableworker' in hashParams) {\r\n                            pdfjsLib.PDFJS.disableWorker = hashParams['disableworker'] === 'true';\r\n                        }\r\n                        if ('disablerange' in hashParams) {\r\n                            _pdfjsLib.PDFJS.disableRange = hashParams['disablerange'] === 'true';\r\n                        }\r\n                        if ('disablestream' in hashParams) {\r\n                            _pdfjsLib.PDFJS.disableStream = hashParams['disablestream'] === 'true';\r\n                        }\r\n                        if ('disableautofetch' in hashParams) {\r\n                            _pdfjsLib.PDFJS.disableAutoFetch = hashParams['disableautofetch'] === 'true';\r\n                        }\r\n                        if ('disablefontface' in hashParams) {\r\n                            _pdfjsLib.PDFJS.disableFontFace = hashParams['disablefontface'] === 'true';\r\n                        }\r\n                        if ('disablehistory' in hashParams) {\r\n                            _pdfjsLib.PDFJS.disableHistory = hashParams['disablehistory'] === 'true';\r\n                        }\r\n                        if ('webgl' in hashParams) {\r\n                            _pdfjsLib.PDFJS.disableWebGL = hashParams['webgl'] !== 'true';\r\n                        }\r\n                        if ('useonlycsszoom' in hashParams) {\r\n                            _pdfjsLib.PDFJS.useOnlyCssZoom = hashParams['useonlycsszoom'] === 'true';\r\n                        }\r\n                        if ('verbosity' in hashParams) {\r\n                            _pdfjsLib.PDFJS.verbosity = hashParams['verbosity'] | 0;\r\n                        }\r\n                        if ('ignorecurrentpositiononzoom' in hashParams) {\r\n                            _pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom = hashParams['ignorecurrentpositiononzoom'] === 'true';\r\n                        }\r\n                        if ('textlayer' in hashParams) {\r\n                            switch (hashParams['textlayer']) {\r\n                                case 'off':\r\n                                    _pdfjsLib.PDFJS.disableTextLayer = true;\r\n                                    break;\r\n                                case 'visible':\r\n                                case 'shadow':\r\n                                case 'hover':\r\n                                    var viewer = appConfig.viewerContainer;\r\n                                    viewer.classList.add('textLayer-' + hashParams['textlayer']);\r\n                                    break;\r\n                            }\r\n                        }\r\n                        if ('pdfbug' in hashParams) {\r\n                            _pdfjsLib.PDFJS.pdfBug = true;\r\n                            var pdfBug = hashParams['pdfbug'];\r\n                            var enabled = pdfBug.split(',');\r\n                            waitForBeforeOpening.push(loadAndEnablePDFBug(enabled));\r\n                        }\r\n                    }\r\n                    if (!PDFViewerApplication.supportsPrinting) {\r\n                        appConfig.toolbar.print.classList.add('hidden');\r\n                        appConfig.secondaryToolbar.printButton.classList.add('hidden');\r\n                    }\r\n                    if (!PDFViewerApplication.supportsFullscreen) {\r\n                        appConfig.toolbar.presentationModeButton.classList.add('hidden');\r\n                        appConfig.secondaryToolbar.presentationModeButton.classList.add('hidden');\r\n                    }\r\n                    if (PDFViewerApplication.supportsIntegratedFind) {\r\n                        appConfig.toolbar.viewFind.classList.add('hidden');\r\n                    }\r\n                    appConfig.sidebar.mainContainer.addEventListener('transitionend', function (evt) {\r\n                        if (evt.target === this) {\r\n                            PDFViewerApplication.eventBus.dispatch('resize');\r\n                        }\r\n                    }, true);\r\n                    appConfig.sidebar.toggleButton.addEventListener('click', function () {\r\n                        PDFViewerApplication.pdfSidebar.toggle();\r\n                    });\r\n                    Promise.all(waitForBeforeOpening).then(function () {\r\n                        webViewerOpenFileViaURL(file);\r\n                    }).catch(function (reason) {\r\n                        PDFViewerApplication.l10n.get('loading_error', null, 'An error occurred while opening.').then(function (msg) {\r\n                            PDFViewerApplication.error(msg, reason);\r\n                        });\r\n                    });\r\n                }\r\n                var webViewerOpenFileViaURL = void 0;\r\n                {\r\n                    webViewerOpenFileViaURL = function webViewerOpenFileViaURL(file) {\r\n                        if (file && file.lastIndexOf('file:', 0) === 0) {\r\n                            PDFViewerApplication.setTitleUsingUrl(file);\r\n                            var xhr = new XMLHttpRequest();\r\n                            xhr.onload = function () {\r\n                                PDFViewerApplication.open(new Uint8Array(xhr.response));\r\n                            };\r\n                            try {\r\n                                xhr.open('GET', file);\r\n                                xhr.responseType = 'arraybuffer';\r\n                                xhr.send();\r\n                            } catch (ex) {\r\n                                PDFViewerApplication.l10n.get('loading_error', null, 'An error occurred while loading the PDF.').then(function (msg) {\r\n                                    PDFViewerApplication.error(msg, ex);\r\n                                });\r\n                            }\r\n                            return;\r\n                        }\r\n                        if (file) {\r\n                            PDFViewerApplication.open(file);\r\n                        }\r\n                    };\r\n                }\r\n                function webViewerPageRendered(evt) {\r\n                    var pageNumber = evt.pageNumber;\r\n                    var pageIndex = pageNumber - 1;\r\n                    var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex);\r\n                    if (pageNumber === PDFViewerApplication.page) {\r\n                        PDFViewerApplication.toolbar.updateLoadingIndicatorState(false);\r\n                    }\r\n                    if (!pageView) {\r\n                        return;\r\n                    }\r\n                    if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {\r\n                        var thumbnailView = PDFViewerApplication.pdfThumbnailViewer.getThumbnail(pageIndex);\r\n                        thumbnailView.setImage(pageView);\r\n                    }\r\n                    if (_pdfjsLib.PDFJS.pdfBug && Stats.enabled && pageView.stats) {\r\n                        Stats.add(pageNumber, pageView.stats);\r\n                    }\r\n                    if (pageView.error) {\r\n                        PDFViewerApplication.l10n.get('rendering_error', null, 'An error occurred while rendering the page.').then(function (msg) {\r\n                            PDFViewerApplication.error(msg, pageView.error);\r\n                        });\r\n                    }\r\n                }\r\n                function webViewerTextLayerRendered(evt) { }\r\n                function webViewerPageMode(evt) {\r\n                    var mode = evt.mode,\r\n                        view = void 0;\r\n                    switch (mode) {\r\n                        case 'thumbs':\r\n                            view = _pdf_sidebar.SidebarView.THUMBS;\r\n                            break;\r\n                        case 'bookmarks':\r\n                        case 'outline':\r\n                            view = _pdf_sidebar.SidebarView.OUTLINE;\r\n                            break;\r\n                        case 'attachments':\r\n                            view = _pdf_sidebar.SidebarView.ATTACHMENTS;\r\n                            break;\r\n                        case 'none':\r\n                            view = _pdf_sidebar.SidebarView.NONE;\r\n                            break;\r\n                        default:\r\n                            console.error('Invalid \"pagemode\" hash parameter: ' + mode);\r\n                            return;\r\n                    }\r\n                    PDFViewerApplication.pdfSidebar.switchView(view, true);\r\n                }\r\n                function webViewerNamedAction(evt) {\r\n                    var action = evt.action;\r\n                    switch (action) {\r\n                        case 'GoToPage':\r\n                            PDFViewerApplication.appConfig.toolbar.pageNumber.select();\r\n                            break;\r\n                        case 'Find':\r\n                            if (!PDFViewerApplication.supportsIntegratedFind) {\r\n                                PDFViewerApplication.findBar.toggle();\r\n                            }\r\n                            break;\r\n                    }\r\n                }\r\n                function webViewerPresentationModeChanged(evt) {\r\n                    var active = evt.active,\r\n                        switchInProgress = evt.switchInProgress;\r\n\r\n                    PDFViewerApplication.pdfViewer.presentationModeState = switchInProgress ? _pdf_viewer.PresentationModeState.CHANGING : active ? _pdf_viewer.PresentationModeState.FULLSCREEN : _pdf_viewer.PresentationModeState.NORMAL;\r\n                }\r\n                function webViewerSidebarViewChanged(evt) {\r\n                    PDFViewerApplication.pdfRenderingQueue.isThumbnailViewEnabled = PDFViewerApplication.pdfSidebar.isThumbnailViewVisible;\r\n                    var store = PDFViewerApplication.store;\r\n                    if (store && PDFViewerApplication.isInitialViewSet) {\r\n                        store.set('sidebarView', evt.view).catch(function () { });\r\n                    }\r\n                }\r\n                function webViewerUpdateViewarea(evt) {\r\n                    var location = evt.location,\r\n                        store = PDFViewerApplication.store;\r\n                    if (store && PDFViewerApplication.isInitialViewSet) {\r\n                        store.setMultiple({\r\n                            'exists': true,\r\n                            'page': location.pageNumber,\r\n                            'zoom': location.scale,\r\n                            'scrollLeft': location.left,\r\n                            'scrollTop': location.top\r\n                        }).catch(function () { });\r\n                    }\r\n                    var href = PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams);\r\n                    PDFViewerApplication.appConfig.toolbar.viewBookmark.href = href;\r\n                    PDFViewerApplication.appConfig.secondaryToolbar.viewBookmarkButton.href = href;\r\n                    PDFViewerApplication.pdfHistory.updateCurrentBookmark(location.pdfOpenParams, location.pageNumber);\r\n                    var currentPage = PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1);\r\n                    var loading = currentPage.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED;\r\n                    PDFViewerApplication.toolbar.updateLoadingIndicatorState(loading);\r\n                }\r\n                function webViewerResize() {\r\n                    var pdfDocument = PDFViewerApplication.pdfDocument,\r\n                        pdfViewer = PDFViewerApplication.pdfViewer;\r\n\r\n                    if (!pdfDocument) {\r\n                        return;\r\n                    }\r\n                    var currentScaleValue = pdfViewer.currentScaleValue;\r\n                    if (currentScaleValue === 'auto' || currentScaleValue === 'page-fit' || currentScaleValue === 'page-width') {\r\n                        pdfViewer.currentScaleValue = currentScaleValue;\r\n                    }\r\n                    pdfViewer.update();\r\n                }\r\n                function webViewerHashchange(evt) {\r\n                    if (PDFViewerApplication.pdfHistory.isHashChangeUnlocked) {\r\n                        var hash = evt.hash;\r\n                        if (!hash) {\r\n                            return;\r\n                        }\r\n                        if (!PDFViewerApplication.isInitialViewSet) {\r\n                            PDFViewerApplication.initialBookmark = hash;\r\n                        } else {\r\n                            PDFViewerApplication.pdfLinkService.setHash(hash);\r\n                        }\r\n                    }\r\n                }\r\n                var webViewerFileInputChange = void 0;\r\n                {\r\n                    webViewerFileInputChange = function webViewerFileInputChange(evt) {\r\n                        var file = evt.fileInput.files[0];\r\n                        if (!_pdfjsLib.PDFJS.disableCreateObjectURL && URL.createObjectURL) {\r\n                            PDFViewerApplication.open(URL.createObjectURL(file));\r\n                        } else {\r\n                            var fileReader = new FileReader();\r\n                            fileReader.onload = function webViewerChangeFileReaderOnload(evt) {\r\n                                var buffer = evt.target.result;\r\n                                PDFViewerApplication.open(new Uint8Array(buffer));\r\n                            };\r\n                            fileReader.readAsArrayBuffer(file);\r\n                        }\r\n                        PDFViewerApplication.setTitleUsingUrl(file.name);\r\n                        var appConfig = PDFViewerApplication.appConfig;\r\n                        appConfig.toolbar.viewBookmark.setAttribute('hidden', 'true');\r\n                        appConfig.secondaryToolbar.viewBookmarkButton.setAttribute('hidden', 'true');\r\n                        appConfig.toolbar.download.setAttribute('hidden', 'true');\r\n                        appConfig.secondaryToolbar.downloadButton.setAttribute('hidden', 'true');\r\n                    };\r\n                }\r\n                function webViewerPresentationMode() {\r\n                    PDFViewerApplication.requestPresentationMode();\r\n                }\r\n                function webViewerOpenFile() {\r\n                    var openFileInputName = PDFViewerApplication.appConfig.openFileInputName;\r\n                    document.getElementById(openFileInputName).click();\r\n                }\r\n                function webViewerPrint() {\r\n                    window.print();\r\n                }\r\n                function webViewerDownload() {\r\n                    PDFViewerApplication.download();\r\n                }\r\n                function webViewerFirstPage() {\r\n                    if (PDFViewerApplication.pdfDocument) {\r\n                        PDFViewerApplication.page = 1;\r\n                    }\r\n                }\r\n                function webViewerLastPage() {\r\n                    if (PDFViewerApplication.pdfDocument) {\r\n                        PDFViewerApplication.page = PDFViewerApplication.pagesCount;\r\n                    }\r\n                }\r\n                function webViewerNextPage() {\r\n                    PDFViewerApplication.page++;\r\n                }\r\n                function webViewerPreviousPage() {\r\n                    PDFViewerApplication.page--;\r\n                }\r\n                function webViewerZoomIn() {\r\n                    PDFViewerApplication.zoomIn();\r\n                }\r\n                function webViewerZoomOut() {\r\n                    PDFViewerApplication.zoomOut();\r\n                }\r\n                function webViewerPageNumberChanged(evt) {\r\n                    var pdfViewer = PDFViewerApplication.pdfViewer;\r\n                    pdfViewer.currentPageLabel = evt.value;\r\n                    if (evt.value !== pdfViewer.currentPageNumber.toString() && evt.value !== pdfViewer.currentPageLabel) {\r\n                        PDFViewerApplication.toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);\r\n                    }\r\n                }\r\n                function webViewerScaleChanged(evt) {\r\n                    PDFViewerApplication.pdfViewer.currentScaleValue = evt.value;\r\n                }\r\n                function webViewerRotateCw() {\r\n                    PDFViewerApplication.rotatePages(90);\r\n                }\r\n                function webViewerRotateCcw() {\r\n                    PDFViewerApplication.rotatePages(-90);\r\n                }\r\n                function webViewerDocumentProperties() {\r\n                    PDFViewerApplication.pdfDocumentProperties.open();\r\n                }\r\n                function webViewerFind(evt) {\r\n                    PDFViewerApplication.findController.executeCommand('find' + evt.type, {\r\n                        query: evt.query,\r\n                        phraseSearch: evt.phraseSearch,\r\n                        caseSensitive: evt.caseSensitive,\r\n                        highlightAll: evt.highlightAll,\r\n                        findPrevious: evt.findPrevious\r\n                    });\r\n                }\r\n                function webViewerFindFromUrlHash(evt) {\r\n                    PDFViewerApplication.findController.executeCommand('find', {\r\n                        query: evt.query,\r\n                        phraseSearch: evt.phraseSearch,\r\n                        caseSensitive: false,\r\n                        highlightAll: true,\r\n                        findPrevious: false\r\n                    });\r\n                }\r\n                function webViewerScaleChanging(evt) {\r\n                    PDFViewerApplication.toolbar.setPageScale(evt.presetValue, evt.scale);\r\n                    PDFViewerApplication.pdfViewer.update();\r\n                }\r\n                function webViewerPageChanging(evt) {\r\n                    var page = evt.pageNumber;\r\n                    PDFViewerApplication.toolbar.setPageNumber(page, evt.pageLabel || null);\r\n                    PDFViewerApplication.secondaryToolbar.setPageNumber(page);\r\n                    if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {\r\n                        PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(page);\r\n                    }\r\n                    if (_pdfjsLib.PDFJS.pdfBug && Stats.enabled) {\r\n                        var pageView = PDFViewerApplication.pdfViewer.getPageView(page - 1);\r\n                        if (pageView.stats) {\r\n                            Stats.add(page, pageView.stats);\r\n                        }\r\n                    }\r\n                }\r\n                var zoomDisabled = false,\r\n                    zoomDisabledTimeout = void 0;\r\n                function webViewerWheel(evt) {\r\n                    var pdfViewer = PDFViewerApplication.pdfViewer;\r\n                    if (pdfViewer.isInPresentationMode) {\r\n                        return;\r\n                    }\r\n                    if (evt.ctrlKey || evt.metaKey) {\r\n                        var support = PDFViewerApplication.supportedMouseWheelZoomModifierKeys;\r\n                        if (evt.ctrlKey && !support.ctrlKey || evt.metaKey && !support.metaKey) {\r\n                            return;\r\n                        }\r\n                        evt.preventDefault();\r\n                        if (zoomDisabled) {\r\n                            return;\r\n                        }\r\n                        var previousScale = pdfViewer.currentScale;\r\n                        var delta = (0, _ui_utils.normalizeWheelEventDelta)(evt);\r\n                        var MOUSE_WHEEL_DELTA_PER_PAGE_SCALE = 3.0;\r\n                        var ticks = delta * MOUSE_WHEEL_DELTA_PER_PAGE_SCALE;\r\n                        if (ticks < 0) {\r\n                            PDFViewerApplication.zoomOut(-ticks);\r\n                        } else {\r\n                            PDFViewerApplication.zoomIn(ticks);\r\n                        }\r\n                        var currentScale = pdfViewer.currentScale;\r\n                        if (previousScale !== currentScale) {\r\n                            var scaleCorrectionFactor = currentScale / previousScale - 1;\r\n                            var rect = pdfViewer.container.getBoundingClientRect();\r\n                            var dx = evt.clientX - rect.left;\r\n                            var dy = evt.clientY - rect.top;\r\n                            pdfViewer.container.scrollLeft += dx * scaleCorrectionFactor;\r\n                            pdfViewer.container.scrollTop += dy * scaleCorrectionFactor;\r\n                        }\r\n                    } else {\r\n                        zoomDisabled = true;\r\n                        clearTimeout(zoomDisabledTimeout);\r\n                        zoomDisabledTimeout = setTimeout(function () {\r\n                            zoomDisabled = false;\r\n                        }, 1000);\r\n                    }\r\n                }\r\n                function webViewerClick(evt) {\r\n                    if (!PDFViewerApplication.secondaryToolbar.isOpen) {\r\n                        return;\r\n                    }\r\n                    var appConfig = PDFViewerApplication.appConfig;\r\n                    if (PDFViewerApplication.pdfViewer.containsElement(evt.target) || appConfig.toolbar.container.contains(evt.target) && evt.target !== appConfig.secondaryToolbar.toggleButton) {\r\n                        PDFViewerApplication.secondaryToolbar.close();\r\n                    }\r\n                }\r\n                function webViewerKeyDown(evt) {\r\n                    if (PDFViewerApplication.overlayManager.active) {\r\n                        return;\r\n                    }\r\n                    var handled = false,\r\n                        ensureViewerFocused = false;\r\n                    var cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0);\r\n                    var pdfViewer = PDFViewerApplication.pdfViewer;\r\n                    var isViewerInPresentationMode = pdfViewer && pdfViewer.isInPresentationMode;\r\n                    if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {\r\n                        switch (evt.keyCode) {\r\n                            case 70:\r\n                                if (!PDFViewerApplication.supportsIntegratedFind) {\r\n                                    PDFViewerApplication.findBar.open();\r\n                                    handled = true;\r\n                                }\r\n                                break;\r\n                            case 71:\r\n                                if (!PDFViewerApplication.supportsIntegratedFind) {\r\n                                    var findState = PDFViewerApplication.findController.state;\r\n                                    if (findState) {\r\n                                        PDFViewerApplication.findController.executeCommand('findagain', {\r\n                                            query: findState.query,\r\n                                            phraseSearch: findState.phraseSearch,\r\n                                            caseSensitive: findState.caseSensitive,\r\n                                            highlightAll: findState.highlightAll,\r\n                                            findPrevious: cmd === 5 || cmd === 12\r\n                                        });\r\n                                    }\r\n                                    handled = true;\r\n                                }\r\n                                break;\r\n                            case 61:\r\n                            case 107:\r\n                            case 187:\r\n                            case 171:\r\n                                if (!isViewerInPresentationMode) {\r\n                                    PDFViewerApplication.zoomIn();\r\n                                }\r\n                                handled = true;\r\n                                break;\r\n                            case 173:\r\n                            case 109:\r\n                            case 189:\r\n                                if (!isViewerInPresentationMode) {\r\n                                    PDFViewerApplication.zoomOut();\r\n                                }\r\n                                handled = true;\r\n                                break;\r\n                            case 48:\r\n                            case 96:\r\n                                if (!isViewerInPresentationMode) {\r\n                                    setTimeout(function () {\r\n                                        pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;\r\n                                    });\r\n                                    handled = false;\r\n                                }\r\n                                break;\r\n                            case 38:\r\n                                if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {\r\n                                    PDFViewerApplication.page = 1;\r\n                                    handled = true;\r\n                                    ensureViewerFocused = true;\r\n                                }\r\n                                break;\r\n                            case 40:\r\n                                if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) {\r\n                                    PDFViewerApplication.page = PDFViewerApplication.pagesCount;\r\n                                    handled = true;\r\n                                    ensureViewerFocused = true;\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    if (cmd === 1 || cmd === 8) {\r\n                        switch (evt.keyCode) {\r\n                            case 83:\r\n                                PDFViewerApplication.download();\r\n                                handled = true;\r\n                                break;\r\n                        }\r\n                    }\r\n                    if (cmd === 3 || cmd === 10) {\r\n                        switch (evt.keyCode) {\r\n                            case 80:\r\n                                PDFViewerApplication.requestPresentationMode();\r\n                                handled = true;\r\n                                break;\r\n                            case 71:\r\n                                PDFViewerApplication.appConfig.toolbar.pageNumber.select();\r\n                                handled = true;\r\n                                break;\r\n                        }\r\n                    }\r\n                    if (handled) {\r\n                        if (ensureViewerFocused && !isViewerInPresentationMode) {\r\n                            pdfViewer.focus();\r\n                        }\r\n                        evt.preventDefault();\r\n                        return;\r\n                    }\r\n                    var curElement = document.activeElement || document.querySelector(':focus');\r\n                    var curElementTagName = curElement && curElement.tagName.toUpperCase();\r\n                    if (curElementTagName === 'INPUT' || curElementTagName === 'TEXTAREA' || curElementTagName === 'SELECT') {\r\n                        if (evt.keyCode !== 27) {\r\n                            return;\r\n                        }\r\n                    }\r\n                    if (cmd === 0) {\r\n                        switch (evt.keyCode) {\r\n                            case 38:\r\n                            case 33:\r\n                            case 8:\r\n                                if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') {\r\n                                    break;\r\n                                }\r\n                            case 37:\r\n                                if (pdfViewer.isHorizontalScrollbarEnabled) {\r\n                                    break;\r\n                                }\r\n                            case 75:\r\n                            case 80:\r\n                                if (PDFViewerApplication.page > 1) {\r\n                                    PDFViewerApplication.page--;\r\n                                }\r\n                                handled = true;\r\n                                break;\r\n                            case 27:\r\n                                if (PDFViewerApplication.secondaryToolbar.isOpen) {\r\n                                    PDFViewerApplication.secondaryToolbar.close();\r\n                                    handled = true;\r\n                                }\r\n                                if (!PDFViewerApplication.supportsIntegratedFind && PDFViewerApplication.findBar.opened) {\r\n                                    PDFViewerApplication.findBar.close();\r\n                                    handled = true;\r\n                                }\r\n                                break;\r\n                            case 40:\r\n                            case 34:\r\n                            case 32:\r\n                                if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') {\r\n                                    break;\r\n                                }\r\n                            case 39:\r\n                                if (pdfViewer.isHorizontalScrollbarEnabled) {\r\n                                    break;\r\n                                }\r\n                            case 74:\r\n                            case 78:\r\n                                if (PDFViewerApplication.page < PDFViewerApplication.pagesCount) {\r\n                                    PDFViewerApplication.page++;\r\n                                }\r\n                                handled = true;\r\n                                break;\r\n                            case 36:\r\n                                if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {\r\n                                    PDFViewerApplication.page = 1;\r\n                                    handled = true;\r\n                                    ensureViewerFocused = true;\r\n                                }\r\n                                break;\r\n                            case 35:\r\n                                if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) {\r\n                                    PDFViewerApplication.page = PDFViewerApplication.pagesCount;\r\n                                    handled = true;\r\n                                    ensureViewerFocused = true;\r\n                                }\r\n                                break;\r\n                            case 83:\r\n                                PDFViewerApplication.pdfCursorTools.switchTool(_pdf_cursor_tools.CursorTool.SELECT);\r\n                                break;\r\n                            case 72:\r\n                                PDFViewerApplication.pdfCursorTools.switchTool(_pdf_cursor_tools.CursorTool.HAND);\r\n                                break;\r\n                            case 82:\r\n                                PDFViewerApplication.rotatePages(90);\r\n                                break;\r\n                        }\r\n                    }\r\n                    if (cmd === 4) {\r\n                        switch (evt.keyCode) {\r\n                            case 32:\r\n                                if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') {\r\n                                    break;\r\n                                }\r\n                                if (PDFViewerApplication.page > 1) {\r\n                                    PDFViewerApplication.page--;\r\n                                }\r\n                                handled = true;\r\n                                break;\r\n                            case 82:\r\n                                PDFViewerApplication.rotatePages(-90);\r\n                                break;\r\n                        }\r\n                    }\r\n                    if (!handled && !isViewerInPresentationMode) {\r\n                        if (evt.keyCode >= 33 && evt.keyCode <= 40 || evt.keyCode === 32 && curElementTagName !== 'BUTTON') {\r\n                            ensureViewerFocused = true;\r\n                        }\r\n                    }\r\n                    if (cmd === 2) {\r\n                        switch (evt.keyCode) {\r\n                            case 37:\r\n                                if (isViewerInPresentationMode) {\r\n                                    PDFViewerApplication.pdfHistory.back();\r\n                                    handled = true;\r\n                                }\r\n                                break;\r\n                            case 39:\r\n                                if (isViewerInPresentationMode) {\r\n                                    PDFViewerApplication.pdfHistory.forward();\r\n                                    handled = true;\r\n                                }\r\n                                break;\r\n                        }\r\n                    }\r\n                    if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) {\r\n                        pdfViewer.focus();\r\n                    }\r\n                    if (handled) {\r\n                        evt.preventDefault();\r\n                    }\r\n                }\r\n                function apiPageModeToSidebarView(mode) {\r\n                    switch (mode) {\r\n                        case 'UseNone':\r\n                            return _pdf_sidebar.SidebarView.NONE;\r\n                        case 'UseThumbs':\r\n                            return _pdf_sidebar.SidebarView.THUMBS;\r\n                        case 'UseOutlines':\r\n                            return _pdf_sidebar.SidebarView.OUTLINE;\r\n                        case 'UseAttachments':\r\n                            return _pdf_sidebar.SidebarView.ATTACHMENTS;\r\n                        case 'UseOC':\r\n                    }\r\n                    return _pdf_sidebar.SidebarView.NONE;\r\n                }\r\n                var PDFPrintServiceFactory = {\r\n                    instance: {\r\n                        supportsPrinting: false,\r\n                        createPrintService: function createPrintService() {\r\n                            throw new Error('Not implemented: createPrintService');\r\n                        }\r\n                    }\r\n                };\r\n                exports.PDFViewerApplication = PDFViewerApplication;\r\n                exports.DefaultExternalServices = DefaultExternalServices;\r\n                exports.PDFPrintServiceFactory = PDFPrintServiceFactory;\r\n\r\n                /***/\r\n            }),\r\n        /* 5 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.SimpleLinkService = exports.PDFLinkService = undefined;\r\n\r\n                var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _dom_events = __webpack_require__(2);\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var PDFLinkService = function () {\r\n                    function PDFLinkService() {\r\n                        var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\r\n                            eventBus = _ref.eventBus;\r\n\r\n                        _classCallCheck(this, PDFLinkService);\r\n\r\n                        this.eventBus = eventBus || (0, _dom_events.getGlobalEventBus)();\r\n                        this.baseUrl = null;\r\n                        this.pdfDocument = null;\r\n                        this.pdfViewer = null;\r\n                        this.pdfHistory = null;\r\n                        this._pagesRefCache = null;\r\n                    }\r\n\r\n                    _createClass(PDFLinkService, [{\r\n                        key: 'setDocument',\r\n                        value: function setDocument(pdfDocument, baseUrl) {\r\n                            this.baseUrl = baseUrl;\r\n                            this.pdfDocument = pdfDocument;\r\n                            this._pagesRefCache = Object.create(null);\r\n                        }\r\n                    }, {\r\n                        key: 'setViewer',\r\n                        value: function setViewer(pdfViewer) {\r\n                            this.pdfViewer = pdfViewer;\r\n                        }\r\n                    }, {\r\n                        key: 'setHistory',\r\n                        value: function setHistory(pdfHistory) {\r\n                            this.pdfHistory = pdfHistory;\r\n                        }\r\n                    }, {\r\n                        key: 'navigateTo',\r\n                        value: function navigateTo(dest) {\r\n                            var _this = this;\r\n\r\n                            var goToDestination = function goToDestination(_ref2) {\r\n                                var namedDest = _ref2.namedDest,\r\n                                    explicitDest = _ref2.explicitDest;\r\n\r\n                                var destRef = explicitDest[0],\r\n                                    pageNumber = void 0;\r\n                                if (destRef instanceof Object) {\r\n                                    pageNumber = _this._cachedPageNumber(destRef);\r\n                                    if (pageNumber === null) {\r\n                                        _this.pdfDocument.getPageIndex(destRef).then(function (pageIndex) {\r\n                                            _this.cachePageRef(pageIndex + 1, destRef);\r\n                                            goToDestination({\r\n                                                namedDest: namedDest,\r\n                                                explicitDest: explicitDest\r\n                                            });\r\n                                        }).catch(function () {\r\n                                            console.error('PDFLinkService.navigateTo: \"' + destRef + '\" is not ' + ('a valid page reference, for dest=\"' + dest + '\".'));\r\n                                        });\r\n                                        return;\r\n                                    }\r\n                                } else if ((destRef | 0) === destRef) {\r\n                                    pageNumber = destRef + 1;\r\n                                } else {\r\n                                    console.error('PDFLinkService.navigateTo: \"' + destRef + '\" is not ' + ('a valid destination reference, for dest=\"' + dest + '\".'));\r\n                                    return;\r\n                                }\r\n                                if (!pageNumber || pageNumber < 1 || pageNumber > _this.pagesCount) {\r\n                                    console.error('PDFLinkService.navigateTo: \"' + pageNumber + '\" is not ' + ('a valid page number, for dest=\"' + dest + '\".'));\r\n                                    return;\r\n                                }\r\n                                _this.pdfViewer.scrollPageIntoView({\r\n                                    pageNumber: pageNumber,\r\n                                    destArray: explicitDest\r\n                                });\r\n                                if (_this.pdfHistory) {\r\n                                    _this.pdfHistory.push({\r\n                                        dest: explicitDest,\r\n                                        hash: namedDest,\r\n                                        page: pageNumber\r\n                                    });\r\n                                }\r\n                            };\r\n                            new Promise(function (resolve, reject) {\r\n                                if (typeof dest === 'string') {\r\n                                    _this.pdfDocument.getDestination(dest).then(function (destArray) {\r\n                                        resolve({\r\n                                            namedDest: dest,\r\n                                            explicitDest: destArray\r\n                                        });\r\n                                    });\r\n                                    return;\r\n                                }\r\n                                resolve({\r\n                                    namedDest: '',\r\n                                    explicitDest: dest\r\n                                });\r\n                            }).then(function (data) {\r\n                                if (!(data.explicitDest instanceof Array)) {\r\n                                    console.error('PDFLinkService.navigateTo: \"' + data.explicitDest + '\" is' + (' not a valid destination array, for dest=\"' + dest + '\".'));\r\n                                    return;\r\n                                }\r\n                                goToDestination(data);\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'getDestinationHash',\r\n                        value: function getDestinationHash(dest) {\r\n                            if (typeof dest === 'string') {\r\n                                return this.getAnchorUrl('#' + escape(dest));\r\n                            }\r\n                            if (dest instanceof Array) {\r\n                                var str = JSON.stringify(dest);\r\n                                return this.getAnchorUrl('#' + escape(str));\r\n                            }\r\n                            return this.getAnchorUrl('');\r\n                        }\r\n                    }, {\r\n                        key: 'getAnchorUrl',\r\n                        value: function getAnchorUrl(anchor) {\r\n                            return (this.baseUrl || '') + anchor;\r\n                        }\r\n                    }, {\r\n                        key: 'setHash',\r\n                        value: function setHash(hash) {\r\n                            var pageNumber = void 0,\r\n                                dest = void 0;\r\n                            if (hash.indexOf('=') >= 0) {\r\n                                var params = (0, _ui_utils.parseQueryString)(hash);\r\n                                if ('search' in params) {\r\n                                    this.eventBus.dispatch('findfromurlhash', {\r\n                                        source: this,\r\n                                        query: params['search'].replace(/\"/g, ''),\r\n                                        phraseSearch: params['phrase'] === 'true'\r\n                                    });\r\n                                }\r\n                                if ('nameddest' in params) {\r\n                                    if (this.pdfHistory) {\r\n                                        this.pdfHistory.updateNextHashParam(params.nameddest);\r\n                                    }\r\n                                    this.navigateTo(params.nameddest);\r\n                                    return;\r\n                                }\r\n                                if ('page' in params) {\r\n                                    pageNumber = params.page | 0 || 1;\r\n                                }\r\n                                if ('zoom' in params) {\r\n                                    var zoomArgs = params.zoom.split(',');\r\n                                    var zoomArg = zoomArgs[0];\r\n                                    var zoomArgNumber = parseFloat(zoomArg);\r\n                                    if (zoomArg.indexOf('Fit') === -1) {\r\n                                        dest = [null, { name: 'XYZ' }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg];\r\n                                    } else {\r\n                                        if (zoomArg === 'Fit' || zoomArg === 'FitB') {\r\n                                            dest = [null, { name: zoomArg }];\r\n                                        } else if (zoomArg === 'FitH' || zoomArg === 'FitBH' || zoomArg === 'FitV' || zoomArg === 'FitBV') {\r\n                                            dest = [null, { name: zoomArg }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null];\r\n                                        } else if (zoomArg === 'FitR') {\r\n                                            if (zoomArgs.length !== 5) {\r\n                                                console.error('PDFLinkService.setHash: Not enough parameters for \"FitR\".');\r\n                                            } else {\r\n                                                dest = [null, { name: zoomArg }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0];\r\n                                            }\r\n                                        } else {\r\n                                            console.error('PDFLinkService.setHash: \"' + zoomArg + '\" is not ' + 'a valid zoom value.');\r\n                                        }\r\n                                    }\r\n                                }\r\n                                if (dest) {\r\n                                    this.pdfViewer.scrollPageIntoView({\r\n                                        pageNumber: pageNumber || this.page,\r\n                                        destArray: dest,\r\n                                        allowNegativeOffset: true\r\n                                    });\r\n                                } else if (pageNumber) {\r\n                                    this.page = pageNumber;\r\n                                }\r\n                                if ('pagemode' in params) {\r\n                                    this.eventBus.dispatch('pagemode', {\r\n                                        source: this,\r\n                                        mode: params.pagemode\r\n                                    });\r\n                                }\r\n                            } else {\r\n                                if (/^\\d+$/.test(hash) && hash <= this.pagesCount) {\r\n                                    console.warn('PDFLinkService_setHash: specifying a page number ' + 'directly after the hash symbol (#) is deprecated, ' + ('please use the \"#page=' + hash + '\" form instead.'));\r\n                                    this.page = hash | 0;\r\n                                }\r\n                                dest = unescape(hash);\r\n                                try {\r\n                                    dest = JSON.parse(dest);\r\n                                    if (!(dest instanceof Array)) {\r\n                                        dest = dest.toString();\r\n                                    }\r\n                                } catch (ex) { }\r\n                                if (typeof dest === 'string' || isValidExplicitDestination(dest)) {\r\n                                    if (this.pdfHistory) {\r\n                                        this.pdfHistory.updateNextHashParam(dest);\r\n                                    }\r\n                                    this.navigateTo(dest);\r\n                                    return;\r\n                                }\r\n                                console.error('PDFLinkService.setHash: \"' + unescape(hash) + '\" is not ' + 'a valid destination.');\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'executeNamedAction',\r\n                        value: function executeNamedAction(action) {\r\n                            switch (action) {\r\n                                case 'GoBack':\r\n                                    if (this.pdfHistory) {\r\n                                        this.pdfHistory.back();\r\n                                    }\r\n                                    break;\r\n                                case 'GoForward':\r\n                                    if (this.pdfHistory) {\r\n                                        this.pdfHistory.forward();\r\n                                    }\r\n                                    break;\r\n                                case 'NextPage':\r\n                                    if (this.page < this.pagesCount) {\r\n                                        this.page++;\r\n                                    }\r\n                                    break;\r\n                                case 'PrevPage':\r\n                                    if (this.page > 1) {\r\n                                        this.page--;\r\n                                    }\r\n                                    break;\r\n                                case 'LastPage':\r\n                                    this.page = this.pagesCount;\r\n                                    break;\r\n                                case 'FirstPage':\r\n                                    this.page = 1;\r\n                                    break;\r\n                                default:\r\n                                    break;\r\n                            }\r\n                            this.eventBus.dispatch('namedaction', {\r\n                                source: this,\r\n                                action: action\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'onFileAttachmentAnnotation',\r\n                        value: function onFileAttachmentAnnotation(_ref3) {\r\n                            var id = _ref3.id,\r\n                                filename = _ref3.filename,\r\n                                content = _ref3.content;\r\n\r\n                            this.eventBus.dispatch('fileattachmentannotation', {\r\n                                source: this,\r\n                                id: id,\r\n                                filename: filename,\r\n                                content: content\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'cachePageRef',\r\n                        value: function cachePageRef(pageNum, pageRef) {\r\n                            var refStr = pageRef.num + ' ' + pageRef.gen + ' R';\r\n                            this._pagesRefCache[refStr] = pageNum;\r\n                        }\r\n                    }, {\r\n                        key: '_cachedPageNumber',\r\n                        value: function _cachedPageNumber(pageRef) {\r\n                            var refStr = pageRef.num + ' ' + pageRef.gen + ' R';\r\n                            return this._pagesRefCache && this._pagesRefCache[refStr] || null;\r\n                        }\r\n                    }, {\r\n                        key: 'pagesCount',\r\n                        get: function get() {\r\n                            return this.pdfDocument ? this.pdfDocument.numPages : 0;\r\n                        }\r\n                    }, {\r\n                        key: 'page',\r\n                        get: function get() {\r\n                            return this.pdfViewer.currentPageNumber;\r\n                        },\r\n                        set: function set(value) {\r\n                            this.pdfViewer.currentPageNumber = value;\r\n                        }\r\n                    }]);\r\n\r\n                    return PDFLinkService;\r\n                }();\r\n\r\n                function isValidExplicitDestination(dest) {\r\n                    if (!(dest instanceof Array)) {\r\n                        return false;\r\n                    }\r\n                    var destLength = dest.length,\r\n                        allowNull = true;\r\n                    if (destLength < 2) {\r\n                        return false;\r\n                    }\r\n                    var page = dest[0];\r\n                    if (!((typeof page === 'undefined' ? 'undefined' : _typeof(page)) === 'object' && typeof page.num === 'number' && (page.num | 0) === page.num && typeof page.gen === 'number' && (page.gen | 0) === page.gen) && !(typeof page === 'number' && (page | 0) === page && page >= 0)) {\r\n                        return false;\r\n                    }\r\n                    var zoom = dest[1];\r\n                    if (!((typeof zoom === 'undefined' ? 'undefined' : _typeof(zoom)) === 'object' && typeof zoom.name === 'string')) {\r\n                        return false;\r\n                    }\r\n                    switch (zoom.name) {\r\n                        case 'XYZ':\r\n                            if (destLength !== 5) {\r\n                                return false;\r\n                            }\r\n                            break;\r\n                        case 'Fit':\r\n                        case 'FitB':\r\n                            return destLength === 2;\r\n                        case 'FitH':\r\n                        case 'FitBH':\r\n                        case 'FitV':\r\n                        case 'FitBV':\r\n                            if (destLength !== 3) {\r\n                                return false;\r\n                            }\r\n                            break;\r\n                        case 'FitR':\r\n                            if (destLength !== 6) {\r\n                                return false;\r\n                            }\r\n                            allowNull = false;\r\n                            break;\r\n                        default:\r\n                            return false;\r\n                    }\r\n                    for (var i = 2; i < destLength; i++) {\r\n                        var param = dest[i];\r\n                        if (!(typeof param === 'number' || allowNull && param === null)) {\r\n                            return false;\r\n                        }\r\n                    }\r\n                    return true;\r\n                }\r\n\r\n                var SimpleLinkService = function () {\r\n                    function SimpleLinkService() {\r\n                        _classCallCheck(this, SimpleLinkService);\r\n                    }\r\n\r\n                    _createClass(SimpleLinkService, [{\r\n                        key: 'navigateTo',\r\n                        value: function navigateTo(dest) { }\r\n                    }, {\r\n                        key: 'getDestinationHash',\r\n                        value: function getDestinationHash(dest) {\r\n                            return '#';\r\n                        }\r\n                    }, {\r\n                        key: 'getAnchorUrl',\r\n                        value: function getAnchorUrl(hash) {\r\n                            return '#';\r\n                        }\r\n                    }, {\r\n                        key: 'setHash',\r\n                        value: function setHash(hash) { }\r\n                    }, {\r\n                        key: 'executeNamedAction',\r\n                        value: function executeNamedAction(action) { }\r\n                    }, {\r\n                        key: 'onFileAttachmentAnnotation',\r\n                        value: function onFileAttachmentAnnotation(_ref4) {\r\n                            var id = _ref4.id,\r\n                                filename = _ref4.filename,\r\n                                content = _ref4.content;\r\n                        }\r\n                    }, {\r\n                        key: 'cachePageRef',\r\n                        value: function cachePageRef(pageNum, pageRef) { }\r\n                    }, {\r\n                        key: 'page',\r\n                        get: function get() {\r\n                            return 0;\r\n                        },\r\n                        set: function set(value) { }\r\n                    }]);\r\n\r\n                    return SimpleLinkService;\r\n                }();\r\n\r\n                exports.PDFLinkService = PDFLinkService;\r\n                exports.SimpleLinkService = SimpleLinkService;\r\n\r\n                /***/\r\n            }),\r\n        /* 6 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.PDFCursorTools = exports.CursorTool = undefined;\r\n\r\n                var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _grab_to_pan = __webpack_require__(14);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var CursorTool = {\r\n                    SELECT: 0,\r\n                    HAND: 1,\r\n                    ZOOM: 2\r\n                };\r\n\r\n                var PDFCursorTools = function () {\r\n                    function PDFCursorTools(_ref) {\r\n                        var _this = this;\r\n\r\n                        var container = _ref.container,\r\n                            eventBus = _ref.eventBus,\r\n                            preferences = _ref.preferences;\r\n\r\n                        _classCallCheck(this, PDFCursorTools);\r\n\r\n                        this.container = container;\r\n                        this.eventBus = eventBus;\r\n                        this.active = CursorTool.SELECT;\r\n                        this.activeBeforePresentationMode = null;\r\n                        this.handTool = new _grab_to_pan.GrabToPan({ element: this.container });\r\n                        this._addEventListeners();\r\n                        Promise.all([preferences.get('cursorToolOnLoad'), preferences.get('enableHandToolOnLoad')]).then(function (_ref2) {\r\n                            var _ref3 = _slicedToArray(_ref2, 2),\r\n                                cursorToolPref = _ref3[0],\r\n                                handToolPref = _ref3[1];\r\n\r\n                            if (handToolPref === true) {\r\n                                preferences.set('enableHandToolOnLoad', false);\r\n                                if (cursorToolPref === CursorTool.SELECT) {\r\n                                    cursorToolPref = CursorTool.HAND;\r\n                                    preferences.set('cursorToolOnLoad', cursorToolPref).catch(function () { });\r\n                                }\r\n                            }\r\n                            _this.switchTool(cursorToolPref);\r\n                        }).catch(function () { });\r\n                    }\r\n\r\n                    _createClass(PDFCursorTools, [{\r\n                        key: 'switchTool',\r\n                        value: function switchTool(tool) {\r\n                            var _this2 = this;\r\n\r\n                            if (this.activeBeforePresentationMode !== null) {\r\n                                return;\r\n                            }\r\n                            if (tool === this.active) {\r\n                                return;\r\n                            }\r\n                            var disableActiveTool = function disableActiveTool() {\r\n                                switch (_this2.active) {\r\n                                    case CursorTool.SELECT:\r\n                                        break;\r\n                                    case CursorTool.HAND:\r\n                                        _this2.handTool.deactivate();\r\n                                        break;\r\n                                    case CursorTool.ZOOM:\r\n                                }\r\n                            };\r\n                            switch (tool) {\r\n                                case CursorTool.SELECT:\r\n                                    disableActiveTool();\r\n                                    break;\r\n                                case CursorTool.HAND:\r\n                                    disableActiveTool();\r\n                                    this.handTool.activate();\r\n                                    break;\r\n                                case CursorTool.ZOOM:\r\n                                default:\r\n                                    console.error('switchTool: \"' + tool + '\" is an unsupported value.');\r\n                                    return;\r\n                            }\r\n                            this.active = tool;\r\n                            this._dispatchEvent();\r\n                        }\r\n                    }, {\r\n                        key: '_dispatchEvent',\r\n                        value: function _dispatchEvent() {\r\n                            this.eventBus.dispatch('cursortoolchanged', {\r\n                                source: this,\r\n                                tool: this.active\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: '_addEventListeners',\r\n                        value: function _addEventListeners() {\r\n                            var _this3 = this;\r\n\r\n                            this.eventBus.on('switchcursortool', function (evt) {\r\n                                _this3.switchTool(evt.tool);\r\n                            });\r\n                            this.eventBus.on('presentationmodechanged', function (evt) {\r\n                                if (evt.switchInProgress) {\r\n                                    return;\r\n                                }\r\n                                var previouslyActive = void 0;\r\n                                if (evt.active) {\r\n                                    previouslyActive = _this3.active;\r\n                                    _this3.switchTool(CursorTool.SELECT);\r\n                                    _this3.activeBeforePresentationMode = previouslyActive;\r\n                                } else {\r\n                                    previouslyActive = _this3.activeBeforePresentationMode;\r\n                                    _this3.activeBeforePresentationMode = null;\r\n                                    _this3.switchTool(previouslyActive);\r\n                                }\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'activeTool',\r\n                        get: function get() {\r\n                            return this.active;\r\n                        }\r\n                    }]);\r\n\r\n                    return PDFCursorTools;\r\n                }();\r\n\r\n                exports.CursorTool = CursorTool;\r\n                exports.PDFCursorTools = PDFCursorTools;\r\n\r\n                /***/\r\n            }),\r\n        /* 7 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.PDFFindController = exports.FindState = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _pdfjsLib = __webpack_require__(1);\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var FindState = {\r\n                    FOUND: 0,\r\n                    NOT_FOUND: 1,\r\n                    WRAPPED: 2,\r\n                    PENDING: 3\r\n                };\r\n                var FIND_SCROLL_OFFSET_TOP = -50;\r\n                var FIND_SCROLL_OFFSET_LEFT = -400;\r\n                var FIND_TIMEOUT = 250;\r\n                var CHARACTERS_TO_NORMALIZE = {\r\n                    '\\u2018': '\\'',\r\n                    '\\u2019': '\\'',\r\n                    '\\u201A': '\\'',\r\n                    '\\u201B': '\\'',\r\n                    '\\u201C': '\"',\r\n                    '\\u201D': '\"',\r\n                    '\\u201E': '\"',\r\n                    '\\u201F': '\"',\r\n                    '\\xBC': '1/4',\r\n                    '\\xBD': '1/2',\r\n                    '\\xBE': '3/4'\r\n                };\r\n\r\n                var PDFFindController = function () {\r\n                    function PDFFindController(_ref) {\r\n                        var pdfViewer = _ref.pdfViewer;\r\n\r\n                        _classCallCheck(this, PDFFindController);\r\n\r\n                        this.pdfViewer = pdfViewer;\r\n                        this.onUpdateResultsCount = null;\r\n                        this.onUpdateState = null;\r\n                        this.reset();\r\n                        var replace = Object.keys(CHARACTERS_TO_NORMALIZE).join('');\r\n                        this.normalizationRegex = new RegExp('[' + replace + ']', 'g');\r\n                    }\r\n\r\n                    _createClass(PDFFindController, [{\r\n                        key: 'reset',\r\n                        value: function reset() {\r\n                            var _this = this;\r\n\r\n                            this.startedTextExtraction = false;\r\n                            this.extractTextPromises = [];\r\n                            this.pendingFindMatches = Object.create(null);\r\n                            this.active = false;\r\n                            this.pageContents = [];\r\n                            this.pageMatches = [];\r\n                            this.pageMatchesLength = null;\r\n                            this.matchCount = 0;\r\n                            this.selected = {\r\n                                pageIdx: -1,\r\n                                matchIdx: -1\r\n                            };\r\n                            this.offset = {\r\n                                pageIdx: null,\r\n                                matchIdx: null\r\n                            };\r\n                            this.pagesToSearch = null;\r\n                            this.resumePageIdx = null;\r\n                            this.state = null;\r\n                            this.dirtyMatch = false;\r\n                            this.findTimeout = null;\r\n                            this._firstPagePromise = new Promise(function (resolve) {\r\n                                _this.resolveFirstPage = resolve;\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'normalize',\r\n                        value: function normalize(text) {\r\n                            return text.replace(this.normalizationRegex, function (ch) {\r\n                                return CHARACTERS_TO_NORMALIZE[ch];\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: '_prepareMatches',\r\n                        value: function _prepareMatches(matchesWithLength, matches, matchesLength) {\r\n                            function isSubTerm(matchesWithLength, currentIndex) {\r\n                                var currentElem = matchesWithLength[currentIndex];\r\n                                var nextElem = matchesWithLength[currentIndex + 1];\r\n                                if (currentIndex < matchesWithLength.length - 1 && currentElem.match === nextElem.match) {\r\n                                    currentElem.skipped = true;\r\n                                    return true;\r\n                                }\r\n                                for (var i = currentIndex - 1; i >= 0; i--) {\r\n                                    var prevElem = matchesWithLength[i];\r\n                                    if (prevElem.skipped) {\r\n                                        continue;\r\n                                    }\r\n                                    if (prevElem.match + prevElem.matchLength < currentElem.match) {\r\n                                        break;\r\n                                    }\r\n                                    if (prevElem.match + prevElem.matchLength >= currentElem.match + currentElem.matchLength) {\r\n                                        currentElem.skipped = true;\r\n                                        return true;\r\n                                    }\r\n                                }\r\n                                return false;\r\n                            }\r\n                            matchesWithLength.sort(function (a, b) {\r\n                                return a.match === b.match ? a.matchLength - b.matchLength : a.match - b.match;\r\n                            });\r\n                            for (var i = 0, len = matchesWithLength.length; i < len; i++) {\r\n                                if (isSubTerm(matchesWithLength, i)) {\r\n                                    continue;\r\n                                }\r\n                                matches.push(matchesWithLength[i].match);\r\n                                matchesLength.push(matchesWithLength[i].matchLength);\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'calcFindPhraseMatch',\r\n                        value: function calcFindPhraseMatch(query, pageIndex, pageContent) {\r\n                            var matches = [];\r\n                            var queryLen = query.length;\r\n                            var matchIdx = -queryLen;\r\n                            while (true) {\r\n                                matchIdx = pageContent.indexOf(query, matchIdx + queryLen);\r\n                                if (matchIdx === -1) {\r\n                                    break;\r\n                                }\r\n                                matches.push(matchIdx);\r\n                            }\r\n                            this.pageMatches[pageIndex] = matches;\r\n                        }\r\n                    }, {\r\n                        key: 'calcFindWordMatch',\r\n                        value: function calcFindWordMatch(query, pageIndex, pageContent) {\r\n                            var matchesWithLength = [];\r\n                            var queryArray = query.match(/\\S+/g);\r\n                            for (var i = 0, len = queryArray.length; i < len; i++) {\r\n                                var subquery = queryArray[i];\r\n                                var subqueryLen = subquery.length;\r\n                                var matchIdx = -subqueryLen;\r\n                                while (true) {\r\n                                    matchIdx = pageContent.indexOf(subquery, matchIdx + subqueryLen);\r\n                                    if (matchIdx === -1) {\r\n                                        break;\r\n                                    }\r\n                                    matchesWithLength.push({\r\n                                        match: matchIdx,\r\n                                        matchLength: subqueryLen,\r\n                                        skipped: false\r\n                                    });\r\n                                }\r\n                            }\r\n                            if (!this.pageMatchesLength) {\r\n                                this.pageMatchesLength = [];\r\n                            }\r\n                            this.pageMatchesLength[pageIndex] = [];\r\n                            this.pageMatches[pageIndex] = [];\r\n                            this._prepareMatches(matchesWithLength, this.pageMatches[pageIndex], this.pageMatchesLength[pageIndex]);\r\n                        }\r\n                    }, {\r\n                        key: 'calcFindMatch',\r\n                        value: function calcFindMatch(pageIndex) {\r\n                            var pageContent = this.normalize(this.pageContents[pageIndex]);\r\n                            var query = this.normalize(this.state.query);\r\n                            var caseSensitive = this.state.caseSensitive;\r\n                            var phraseSearch = this.state.phraseSearch;\r\n                            var queryLen = query.length;\r\n                            if (queryLen === 0) {\r\n                                return;\r\n                            }\r\n                            if (!caseSensitive) {\r\n                                pageContent = pageContent.toLowerCase();\r\n                                query = query.toLowerCase();\r\n                            }\r\n                            if (phraseSearch) {\r\n                                this.calcFindPhraseMatch(query, pageIndex, pageContent);\r\n                            } else {\r\n                                this.calcFindWordMatch(query, pageIndex, pageContent);\r\n                            }\r\n                            this.updatePage(pageIndex);\r\n                            if (this.resumePageIdx === pageIndex) {\r\n                                this.resumePageIdx = null;\r\n                                this.nextPageMatch();\r\n                            }\r\n                            if (this.pageMatches[pageIndex].length > 0) {\r\n                                this.matchCount += this.pageMatches[pageIndex].length;\r\n                                this.updateUIResultsCount();\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'extractText',\r\n                        value: function extractText() {\r\n                            var _this2 = this;\r\n\r\n                            if (this.startedTextExtraction) {\r\n                                return;\r\n                            }\r\n                            this.startedTextExtraction = true;\r\n                            this.pageContents.length = 0;\r\n                            var promise = Promise.resolve();\r\n\r\n                            var _loop = function _loop(i, ii) {\r\n                                var extractTextCapability = (0, _pdfjsLib.createPromiseCapability)();\r\n                                _this2.extractTextPromises[i] = extractTextCapability.promise;\r\n                                promise = promise.then(function () {\r\n                                    return _this2.pdfViewer.getPageTextContent(i).then(function (textContent) {\r\n                                        var textItems = textContent.items;\r\n                                        var strBuf = [];\r\n                                        for (var j = 0, jj = textItems.length; j < jj; j++) {\r\n                                            strBuf.push(textItems[j].str);\r\n                                        }\r\n                                        _this2.pageContents[i] = strBuf.join('');\r\n                                        extractTextCapability.resolve(i);\r\n                                    }, function (reason) {\r\n                                        console.error('Unable to get page ' + (i + 1) + ' text content', reason);\r\n                                        _this2.pageContents[i] = '';\r\n                                        extractTextCapability.resolve(i);\r\n                                    });\r\n                                });\r\n                            };\r\n\r\n                            for (var i = 0, ii = this.pdfViewer.pagesCount; i < ii; i++) {\r\n                                _loop(i, ii);\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'executeCommand',\r\n                        value: function executeCommand(cmd, state) {\r\n                            var _this3 = this;\r\n\r\n                            if (this.state === null || cmd !== 'findagain') {\r\n                                this.dirtyMatch = true;\r\n                            }\r\n                            this.state = state;\r\n                            this.updateUIState(FindState.PENDING);\r\n                            this._firstPagePromise.then(function () {\r\n                                _this3.extractText();\r\n                                clearTimeout(_this3.findTimeout);\r\n                                if (cmd === 'find') {\r\n                                    _this3.findTimeout = setTimeout(_this3.nextMatch.bind(_this3), FIND_TIMEOUT);\r\n                                } else {\r\n                                    _this3.nextMatch();\r\n                                }\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'updatePage',\r\n                        value: function updatePage(index) {\r\n                            if (this.selected.pageIdx === index) {\r\n                                this.pdfViewer.currentPageNumber = index + 1;\r\n                            }\r\n                            var page = this.pdfViewer.getPageView(index);\r\n                            if (page.textLayer) {\r\n                                page.textLayer.updateMatches();\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'nextMatch',\r\n                        value: function nextMatch() {\r\n                            var _this4 = this;\r\n\r\n                            var previous = this.state.findPrevious;\r\n                            var currentPageIndex = this.pdfViewer.currentPageNumber - 1;\r\n                            var numPages = this.pdfViewer.pagesCount;\r\n                            this.active = true;\r\n                            if (this.dirtyMatch) {\r\n                                this.dirtyMatch = false;\r\n                                this.selected.pageIdx = this.selected.matchIdx = -1;\r\n                                this.offset.pageIdx = currentPageIndex;\r\n                                this.offset.matchIdx = null;\r\n                                this.hadMatch = false;\r\n                                this.resumePageIdx = null;\r\n                                this.pageMatches = [];\r\n                                this.matchCount = 0;\r\n                                this.pageMatchesLength = null;\r\n                                for (var i = 0; i < numPages; i++) {\r\n                                    this.updatePage(i);\r\n                                    if (!(i in this.pendingFindMatches)) {\r\n                                        this.pendingFindMatches[i] = true;\r\n                                        this.extractTextPromises[i].then(function (pageIdx) {\r\n                                            delete _this4.pendingFindMatches[pageIdx];\r\n                                            _this4.calcFindMatch(pageIdx);\r\n                                        });\r\n                                    }\r\n                                }\r\n                            }\r\n                            if (this.state.query === '') {\r\n                                this.updateUIState(FindState.FOUND);\r\n                                return;\r\n                            }\r\n                            if (this.resumePageIdx) {\r\n                                return;\r\n                            }\r\n                            var offset = this.offset;\r\n                            this.pagesToSearch = numPages;\r\n                            if (offset.matchIdx !== null) {\r\n                                var numPageMatches = this.pageMatches[offset.pageIdx].length;\r\n                                if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) {\r\n                                    this.hadMatch = true;\r\n                                    offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1;\r\n                                    this.updateMatch(true);\r\n                                    return;\r\n                                }\r\n                                this.advanceOffsetPage(previous);\r\n                            }\r\n                            this.nextPageMatch();\r\n                        }\r\n                    }, {\r\n                        key: 'matchesReady',\r\n                        value: function matchesReady(matches) {\r\n                            var offset = this.offset;\r\n                            var numMatches = matches.length;\r\n                            var previous = this.state.findPrevious;\r\n                            if (numMatches) {\r\n                                this.hadMatch = true;\r\n                                offset.matchIdx = previous ? numMatches - 1 : 0;\r\n                                this.updateMatch(true);\r\n                                return true;\r\n                            }\r\n                            this.advanceOffsetPage(previous);\r\n                            if (offset.wrapped) {\r\n                                offset.matchIdx = null;\r\n                                if (this.pagesToSearch < 0) {\r\n                                    this.updateMatch(false);\r\n                                    return true;\r\n                                }\r\n                            }\r\n                            return false;\r\n                        }\r\n                    }, {\r\n                        key: 'updateMatchPosition',\r\n                        value: function updateMatchPosition(pageIndex, matchIndex, elements, beginIdx) {\r\n                            if (this.selected.matchIdx === matchIndex && this.selected.pageIdx === pageIndex) {\r\n                                var spot = {\r\n                                    top: FIND_SCROLL_OFFSET_TOP,\r\n                                    left: FIND_SCROLL_OFFSET_LEFT\r\n                                };\r\n                                (0, _ui_utils.scrollIntoView)(elements[beginIdx], spot, true);\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'nextPageMatch',\r\n                        value: function nextPageMatch() {\r\n                            if (this.resumePageIdx !== null) {\r\n                                console.error('There can only be one pending page.');\r\n                            }\r\n                            var matches = null;\r\n                            do {\r\n                                var pageIdx = this.offset.pageIdx;\r\n                                matches = this.pageMatches[pageIdx];\r\n                                if (!matches) {\r\n                                    this.resumePageIdx = pageIdx;\r\n                                    break;\r\n                                }\r\n                            } while (!this.matchesReady(matches));\r\n                        }\r\n                    }, {\r\n                        key: 'advanceOffsetPage',\r\n                        value: function advanceOffsetPage(previous) {\r\n                            var offset = this.offset;\r\n                            var numPages = this.extractTextPromises.length;\r\n                            offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1;\r\n                            offset.matchIdx = null;\r\n                            this.pagesToSearch--;\r\n                            if (offset.pageIdx >= numPages || offset.pageIdx < 0) {\r\n                                offset.pageIdx = previous ? numPages - 1 : 0;\r\n                                offset.wrapped = true;\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'updateMatch',\r\n                        value: function updateMatch() {\r\n                            var found = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\r\n\r\n                            var state = FindState.NOT_FOUND;\r\n                            var wrapped = this.offset.wrapped;\r\n                            this.offset.wrapped = false;\r\n                            if (found) {\r\n                                var previousPage = this.selected.pageIdx;\r\n                                this.selected.pageIdx = this.offset.pageIdx;\r\n                                this.selected.matchIdx = this.offset.matchIdx;\r\n                                state = wrapped ? FindState.WRAPPED : FindState.FOUND;\r\n                                if (previousPage !== -1 && previousPage !== this.selected.pageIdx) {\r\n                                    this.updatePage(previousPage);\r\n                                }\r\n                            }\r\n                            this.updateUIState(state, this.state.findPrevious);\r\n                            if (this.selected.pageIdx !== -1) {\r\n                                this.updatePage(this.selected.pageIdx);\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'updateUIResultsCount',\r\n                        value: function updateUIResultsCount() {\r\n                            if (this.onUpdateResultsCount) {\r\n                                this.onUpdateResultsCount(this.matchCount);\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'updateUIState',\r\n                        value: function updateUIState(state, previous) {\r\n                            if (this.onUpdateState) {\r\n                                this.onUpdateState(state, previous, this.matchCount);\r\n                            }\r\n                        }\r\n                    }]);\r\n\r\n                    return PDFFindController;\r\n                }();\r\n\r\n                exports.FindState = FindState;\r\n                exports.PDFFindController = PDFFindController;\r\n\r\n                /***/\r\n            }),\r\n        /* 8 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.GenericCom = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _app = __webpack_require__(4);\r\n\r\n                var _preferences = __webpack_require__(28);\r\n\r\n                var _download_manager = __webpack_require__(12);\r\n\r\n                var _genericl10n = __webpack_require__(13);\r\n\r\n                var _pdfjsLib = __webpack_require__(1);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\r\n\r\n                function _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\r\n\r\n                ;\r\n                var GenericCom = {};\r\n\r\n                var GenericPreferences = function (_BasePreferences) {\r\n                    _inherits(GenericPreferences, _BasePreferences);\r\n\r\n                    function GenericPreferences() {\r\n                        _classCallCheck(this, GenericPreferences);\r\n\r\n                        return _possibleConstructorReturn(this, (GenericPreferences.__proto__ || Object.getPrototypeOf(GenericPreferences)).apply(this, arguments));\r\n                    }\r\n\r\n                    _createClass(GenericPreferences, [{\r\n                        key: '_writeToStorage',\r\n                        value: function _writeToStorage(prefObj) {\r\n                            return new Promise(function (resolve) {\r\n                                localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));\r\n                                resolve();\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: '_readFromStorage',\r\n                        value: function _readFromStorage(prefObj) {\r\n                            return new Promise(function (resolve) {\r\n                                var readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences'));\r\n                                resolve(readPrefs);\r\n                            });\r\n                        }\r\n                    }]);\r\n\r\n                    return GenericPreferences;\r\n                }(_preferences.BasePreferences);\r\n\r\n                var GenericExternalServices = Object.create(_app.DefaultExternalServices);\r\n                GenericExternalServices.createDownloadManager = function () {\r\n                    return new _download_manager.DownloadManager();\r\n                };\r\n                GenericExternalServices.createPreferences = function () {\r\n                    return new GenericPreferences();\r\n                };\r\n                GenericExternalServices.createL10n = function () {\r\n                    return new _genericl10n.GenericL10n(_pdfjsLib.PDFJS.locale);\r\n                };\r\n                _app.PDFViewerApplication.externalServices = GenericExternalServices;\r\n                exports.GenericCom = GenericCom;\r\n\r\n                /***/\r\n            }),\r\n        /* 9 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.PDFPrintService = undefined;\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                var _app = __webpack_require__(4);\r\n\r\n                var _pdfjsLib = __webpack_require__(1);\r\n\r\n                var activeService = null;\r\n                var overlayManager = null;\r\n                function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size) {\r\n                    var scratchCanvas = activeService.scratchCanvas;\r\n                    var PRINT_RESOLUTION = 150;\r\n                    var PRINT_UNITS = PRINT_RESOLUTION / 72.0;\r\n                    scratchCanvas.width = Math.floor(size.width * PRINT_UNITS);\r\n                    scratchCanvas.height = Math.floor(size.height * PRINT_UNITS);\r\n                    var width = Math.floor(size.width * _ui_utils.CSS_UNITS) + 'px';\r\n                    var height = Math.floor(size.height * _ui_utils.CSS_UNITS) + 'px';\r\n                    var ctx = scratchCanvas.getContext('2d');\r\n                    ctx.save();\r\n                    ctx.fillStyle = 'rgb(255, 255, 255)';\r\n                    ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height);\r\n                    ctx.restore();\r\n                    return pdfDocument.getPage(pageNumber).then(function (pdfPage) {\r\n                        var renderContext = {\r\n                            canvasContext: ctx,\r\n                            transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0],\r\n                            viewport: pdfPage.getViewport(1, size.rotation),\r\n                            intent: 'print'\r\n                        };\r\n                        return pdfPage.render(renderContext).promise;\r\n                    }).then(function () {\r\n                        return {\r\n                            width: width,\r\n                            height: height\r\n                        };\r\n                    });\r\n                }\r\n                function PDFPrintService(pdfDocument, pagesOverview, printContainer, l10n) {\r\n                    this.pdfDocument = pdfDocument;\r\n                    this.pagesOverview = pagesOverview;\r\n                    this.printContainer = printContainer;\r\n                    this.l10n = l10n || _ui_utils.NullL10n;\r\n                    this.currentPage = -1;\r\n                    this.scratchCanvas = document.createElement('canvas');\r\n                }\r\n                PDFPrintService.prototype = {\r\n                    layout: function layout() {\r\n                        this.throwIfInactive();\r\n                        var body = document.querySelector('body');\r\n                        body.setAttribute('data-pdfjsprinting', true);\r\n                        var hasEqualPageSizes = this.pagesOverview.every(function (size) {\r\n                            return size.width === this.pagesOverview[0].width && size.height === this.pagesOverview[0].height;\r\n                        }, this);\r\n                        if (!hasEqualPageSizes) {\r\n                            console.warn('Not all pages have the same size. The printed ' + 'result may be incorrect!');\r\n                        }\r\n                        this.pageStyleSheet = document.createElement('style');\r\n                        var pageSize = this.pagesOverview[0];\r\n                        this.pageStyleSheet.textContent = '@supports ((size:A4) and (size:1pt 1pt)) {' + '@page { size: ' + pageSize.width + 'pt ' + pageSize.height + 'pt;}' + '}';\r\n                        body.appendChild(this.pageStyleSheet);\r\n                    },\r\n                    destroy: function destroy() {\r\n                        if (activeService !== this) {\r\n                            return;\r\n                        }\r\n                        this.printContainer.textContent = '';\r\n                        if (this.pageStyleSheet && this.pageStyleSheet.parentNode) {\r\n                            this.pageStyleSheet.parentNode.removeChild(this.pageStyleSheet);\r\n                            this.pageStyleSheet = null;\r\n                        }\r\n                        this.scratchCanvas.width = this.scratchCanvas.height = 0;\r\n                        this.scratchCanvas = null;\r\n                        activeService = null;\r\n                        ensureOverlay().then(function () {\r\n                            if (overlayManager.active !== 'printServiceOverlay') {\r\n                                return;\r\n                            }\r\n                            overlayManager.close('printServiceOverlay');\r\n                        });\r\n                    },\r\n                    renderPages: function renderPages() {\r\n                        var _this = this;\r\n\r\n                        var pageCount = this.pagesOverview.length;\r\n                        var renderNextPage = function renderNextPage(resolve, reject) {\r\n                            _this.throwIfInactive();\r\n                            if (++_this.currentPage >= pageCount) {\r\n                                renderProgress(pageCount, pageCount, _this.l10n);\r\n                                resolve();\r\n                                return;\r\n                            }\r\n                            var index = _this.currentPage;\r\n                            renderProgress(index, pageCount, _this.l10n);\r\n                            renderPage(_this, _this.pdfDocument, index + 1, _this.pagesOverview[index]).then(_this.useRenderedPage.bind(_this)).then(function () {\r\n                                renderNextPage(resolve, reject);\r\n                            }, reject);\r\n                        };\r\n                        return new Promise(renderNextPage);\r\n                    },\r\n                    useRenderedPage: function useRenderedPage(printItem) {\r\n                        this.throwIfInactive();\r\n                        var img = document.createElement('img');\r\n                        img.style.width = printItem.width;\r\n                        img.style.height = printItem.height;\r\n                        var scratchCanvas = this.scratchCanvas;\r\n                        if ('toBlob' in scratchCanvas && !_pdfjsLib.PDFJS.disableCreateObjectURL) {\r\n                            scratchCanvas.toBlob(function (blob) {\r\n                                img.src = URL.createObjectURL(blob);\r\n                            });\r\n                        } else {\r\n                            img.src = scratchCanvas.toDataURL();\r\n                        }\r\n                        var wrapper = document.createElement('div');\r\n                        wrapper.appendChild(img);\r\n                        this.printContainer.appendChild(wrapper);\r\n                        return new Promise(function (resolve, reject) {\r\n                            img.onload = resolve;\r\n                            img.onerror = reject;\r\n                        });\r\n                    },\r\n                    performPrint: function performPrint() {\r\n                        var _this2 = this;\r\n\r\n                        this.throwIfInactive();\r\n                        return new Promise(function (resolve) {\r\n                            setTimeout(function () {\r\n                                if (!_this2.active) {\r\n                                    resolve();\r\n                                    return;\r\n                                }\r\n                                print.call(window);\r\n                                setTimeout(resolve, 20);\r\n                            }, 0);\r\n                        });\r\n                    },\r\n\r\n                    get active() {\r\n                        return this === activeService;\r\n                    },\r\n                    throwIfInactive: function throwIfInactive() {\r\n                        if (!this.active) {\r\n                            throw new Error('This print request was cancelled or completed.');\r\n                        }\r\n                    }\r\n                };\r\n                var print = window.print;\r\n                window.print = function print() {\r\n                    if (activeService) {\r\n                        console.warn('Ignored window.print() because of a pending print job.');\r\n                        return;\r\n                    }\r\n                    ensureOverlay().then(function () {\r\n                        if (activeService) {\r\n                            overlayManager.open('printServiceOverlay');\r\n                        }\r\n                    });\r\n                    try {\r\n                        dispatchEvent('beforeprint');\r\n                    } finally {\r\n                        if (!activeService) {\r\n                            console.error('Expected print service to be initialized.');\r\n                            ensureOverlay().then(function () {\r\n                                if (overlayManager.active === 'printServiceOverlay') {\r\n                                    overlayManager.close('printServiceOverlay');\r\n                                }\r\n                            });\r\n                            return;\r\n                        }\r\n                        var activeServiceOnEntry = activeService;\r\n                        activeService.renderPages().then(function () {\r\n                            return activeServiceOnEntry.performPrint();\r\n                        }).catch(function () { }).then(function () {\r\n                            if (activeServiceOnEntry.active) {\r\n                                abort();\r\n                            }\r\n                        });\r\n                    }\r\n                };\r\n                function dispatchEvent(eventType) {\r\n                    var event = document.createEvent('CustomEvent');\r\n                    event.initCustomEvent(eventType, false, false, 'custom');\r\n                    window.dispatchEvent(event);\r\n                }\r\n                function abort() {\r\n                    if (activeService) {\r\n                        activeService.destroy();\r\n                        dispatchEvent('afterprint');\r\n                    }\r\n                }\r\n                function renderProgress(index, total, l10n) {\r\n                    var progressContainer = document.getElementById('printServiceOverlay');\r\n                    var progress = Math.round(100 * index / total);\r\n                    var progressBar = progressContainer.querySelector('progress');\r\n                    var progressPerc = progressContainer.querySelector('.relative-progress');\r\n                    progressBar.value = progress;\r\n                    l10n.get('print_progress_percent', { progress: progress }, progress + '%').then(function (msg) {\r\n                        progressPerc.textContent = msg;\r\n                    });\r\n                }\r\n                var hasAttachEvent = !!document.attachEvent;\r\n                window.addEventListener('keydown', function (event) {\r\n                    if (event.keyCode === 80 && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {\r\n                        window.print();\r\n                        if (hasAttachEvent) {\r\n                            return;\r\n                        }\r\n                        event.preventDefault();\r\n                        if (event.stopImmediatePropagation) {\r\n                            event.stopImmediatePropagation();\r\n                        } else {\r\n                            event.stopPropagation();\r\n                        }\r\n                        return;\r\n                    }\r\n                }, true);\r\n                if (hasAttachEvent) {\r\n                    document.attachEvent('onkeydown', function (event) {\r\n                        event = event || window.event;\r\n                        if (event.keyCode === 80 && event.ctrlKey) {\r\n                            event.keyCode = 0;\r\n                            return false;\r\n                        }\r\n                    });\r\n                }\r\n                if ('onbeforeprint' in window) {\r\n                    var stopPropagationIfNeeded = function stopPropagationIfNeeded(event) {\r\n                        if (event.detail !== 'custom' && event.stopImmediatePropagation) {\r\n                            event.stopImmediatePropagation();\r\n                        }\r\n                    };\r\n                    window.addEventListener('beforeprint', stopPropagationIfNeeded);\r\n                    window.addEventListener('afterprint', stopPropagationIfNeeded);\r\n                }\r\n                var overlayPromise;\r\n                function ensureOverlay() {\r\n                    if (!overlayPromise) {\r\n                        overlayManager = _app.PDFViewerApplication.overlayManager;\r\n                        if (!overlayManager) {\r\n                            throw new Error('The overlay manager has not yet been initialized.');\r\n                        }\r\n                        overlayPromise = overlayManager.register('printServiceOverlay', document.getElementById('printServiceOverlay'), abort, true);\r\n                        document.getElementById('printCancel').onclick = abort;\r\n                    }\r\n                    return overlayPromise;\r\n                }\r\n                _app.PDFPrintServiceFactory.instance = {\r\n                    supportsPrinting: true,\r\n                    createPrintService: function createPrintService(pdfDocument, pagesOverview, printContainer, l10n) {\r\n                        if (activeService) {\r\n                            throw new Error('The print service is created and active.');\r\n                        }\r\n                        activeService = new PDFPrintService(pdfDocument, pagesOverview, printContainer, l10n);\r\n                        return activeService;\r\n                    }\r\n                };\r\n                exports.PDFPrintService = PDFPrintService;\r\n\r\n                /***/\r\n            }),\r\n        /* 10 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                document.webL10n = function (window, document, undefined) {\r\n                    var gL10nData = {};\r\n                    var gTextData = '';\r\n                    var gTextProp = 'textContent';\r\n                    var gLanguage = '';\r\n                    var gMacros = {};\r\n                    var gReadyState = 'loading';\r\n                    var gAsyncResourceLoading = true;\r\n                    function getL10nResourceLinks() {\r\n                        return document.querySelectorAll('link[type=\"application/l10n\"]');\r\n                    }\r\n                    function getL10nDictionary() {\r\n                        var script = document.querySelector('script[type=\"application/l10n\"]');\r\n                        return script ? JSON.parse(script.innerHTML) : null;\r\n                    }\r\n                    function getTranslatableChildren(element) {\r\n                        return element ? element.querySelectorAll('*[data-l10n-id]') : [];\r\n                    }\r\n                    function getL10nAttributes(element) {\r\n                        if (!element) return {};\r\n                        var l10nId = element.getAttribute('data-l10n-id');\r\n                        var l10nArgs = element.getAttribute('data-l10n-args');\r\n                        var args = {};\r\n                        if (l10nArgs) {\r\n                            try {\r\n                                args = JSON.parse(l10nArgs);\r\n                            } catch (e) {\r\n                                console.warn('could not parse arguments for #' + l10nId);\r\n                            }\r\n                        }\r\n                        return {\r\n                            id: l10nId,\r\n                            args: args\r\n                        };\r\n                    }\r\n                    function fireL10nReadyEvent(lang) {\r\n                        var evtObject = document.createEvent('Event');\r\n                        evtObject.initEvent('localized', true, false);\r\n                        evtObject.language = lang;\r\n                        document.dispatchEvent(evtObject);\r\n                    }\r\n                    function xhrLoadText(url, onSuccess, onFailure) {\r\n                        onSuccess = onSuccess || function _onSuccess(data) { };\r\n                        onFailure = onFailure || function _onFailure() { };\r\n                        var xhr = new XMLHttpRequest();\r\n                        xhr.open('GET', url, gAsyncResourceLoading);\r\n                        if (xhr.overrideMimeType) {\r\n                            xhr.overrideMimeType('text/plain; charset=utf-8');\r\n                        }\r\n                        xhr.onreadystatechange = function () {\r\n                            if (xhr.readyState == 4) {\r\n                                if (xhr.status == 200 || xhr.status === 0) {\r\n                                    onSuccess(xhr.responseText);\r\n                                } else {\r\n                                    onFailure();\r\n                                }\r\n                            }\r\n                        };\r\n                        xhr.onerror = onFailure;\r\n                        xhr.ontimeout = onFailure;\r\n                        try {\r\n                            xhr.send(null);\r\n                        } catch (e) {\r\n                            onFailure();\r\n                        }\r\n                    }\r\n                    function parseResource(href, lang, successCallback, failureCallback) {\r\n                        var baseURL = href.replace(/[^\\/]*$/, '') || './';\r\n                        function evalString(text) {\r\n                            if (text.lastIndexOf('\\\\') < 0) return text;\r\n                            return text.replace(/\\\\\\\\/g, '\\\\').replace(/\\\\n/g, '\\n').replace(/\\\\r/g, '\\r').replace(/\\\\t/g, '\\t').replace(/\\\\b/g, '\\b').replace(/\\\\f/g, '\\f').replace(/\\\\{/g, '{').replace(/\\\\}/g, '}').replace(/\\\\\"/g, '\"').replace(/\\\\'/g, \"'\");\r\n                        }\r\n                        function parseProperties(text, parsedPropertiesCallback) {\r\n                            var dictionary = {};\r\n                            var reBlank = /^\\s*|\\s*$/;\r\n                            var reComment = /^\\s*#|^\\s*$/;\r\n                            var reSection = /^\\s*\\[(.*)\\]\\s*$/;\r\n                            var reImport = /^\\s*@import\\s+url\\((.*)\\)\\s*$/i;\r\n                            var reSplit = /^([^=\\s]*)\\s*=\\s*(.+)$/;\r\n                            function parseRawLines(rawText, extendedSyntax, parsedRawLinesCallback) {\r\n                                var entries = rawText.replace(reBlank, '').split(/[\\r\\n]+/);\r\n                                var currentLang = '*';\r\n                                var genericLang = lang.split('-', 1)[0];\r\n                                var skipLang = false;\r\n                                var match = '';\r\n                                function nextEntry() {\r\n                                    while (true) {\r\n                                        if (!entries.length) {\r\n                                            parsedRawLinesCallback();\r\n                                            return;\r\n                                        }\r\n                                        var line = entries.shift();\r\n                                        if (reComment.test(line)) continue;\r\n                                        if (extendedSyntax) {\r\n                                            match = reSection.exec(line);\r\n                                            if (match) {\r\n                                                currentLang = match[1].toLowerCase();\r\n                                                skipLang = currentLang !== '*' && currentLang !== lang && currentLang !== genericLang;\r\n                                                continue;\r\n                                            } else if (skipLang) {\r\n                                                continue;\r\n                                            }\r\n                                            match = reImport.exec(line);\r\n                                            if (match) {\r\n                                                loadImport(baseURL + match[1], nextEntry);\r\n                                                return;\r\n                                            }\r\n                                        }\r\n                                        var tmp = line.match(reSplit);\r\n                                        if (tmp && tmp.length == 3) {\r\n                                            dictionary[tmp[1]] = evalString(tmp[2]);\r\n                                        }\r\n                                    }\r\n                                }\r\n                                nextEntry();\r\n                            }\r\n                            function loadImport(url, callback) {\r\n                                xhrLoadText(url, function (content) {\r\n                                    parseRawLines(content, false, callback);\r\n                                }, function () {\r\n                                    console.warn(url + ' not found.');\r\n                                    callback();\r\n                                });\r\n                            }\r\n                            parseRawLines(text, true, function () {\r\n                                parsedPropertiesCallback(dictionary);\r\n                            });\r\n                        }\r\n                        xhrLoadText(href, function (response) {\r\n                            gTextData += response;\r\n                            parseProperties(response, function (data) {\r\n                                for (var key in data) {\r\n                                    var id,\r\n                                        prop,\r\n                                        index = key.lastIndexOf('.');\r\n                                    if (index > 0) {\r\n                                        id = key.substring(0, index);\r\n                                        prop = key.substr(index + 1);\r\n                                    } else {\r\n                                        id = key;\r\n                                        prop = gTextProp;\r\n                                    }\r\n                                    if (!gL10nData[id]) {\r\n                                        gL10nData[id] = {};\r\n                                    }\r\n                                    gL10nData[id][prop] = data[key];\r\n                                }\r\n                                if (successCallback) {\r\n                                    successCallback();\r\n                                }\r\n                            });\r\n                        }, failureCallback);\r\n                    }\r\n                    function loadLocale(lang, callback) {\r\n                        if (lang) {\r\n                            lang = lang.toLowerCase();\r\n                        }\r\n                        callback = callback || function _callback() { };\r\n                        clear();\r\n                        gLanguage = lang;\r\n                        var langLinks = getL10nResourceLinks();\r\n                        var langCount = langLinks.length;\r\n                        if (langCount === 0) {\r\n                            var dict = getL10nDictionary();\r\n                            if (dict && dict.locales && dict.default_locale) {\r\n                                console.log('using the embedded JSON directory, early way out');\r\n                                gL10nData = dict.locales[lang];\r\n                                if (!gL10nData) {\r\n                                    var defaultLocale = dict.default_locale.toLowerCase();\r\n                                    for (var anyCaseLang in dict.locales) {\r\n                                        anyCaseLang = anyCaseLang.toLowerCase();\r\n                                        if (anyCaseLang === lang) {\r\n                                            gL10nData = dict.locales[lang];\r\n                                            break;\r\n                                        } else if (anyCaseLang === defaultLocale) {\r\n                                            gL10nData = dict.locales[defaultLocale];\r\n                                        }\r\n                                    }\r\n                                }\r\n                                callback();\r\n                            } else {\r\n                                console.log('no resource to load, early way out');\r\n                            }\r\n                            fireL10nReadyEvent(lang);\r\n                            gReadyState = 'complete';\r\n                            return;\r\n                        }\r\n                        var onResourceLoaded = null;\r\n                        var gResourceCount = 0;\r\n                        onResourceLoaded = function onResourceLoaded() {\r\n                            gResourceCount++;\r\n                            if (gResourceCount >= langCount) {\r\n                                callback();\r\n                                fireL10nReadyEvent(lang);\r\n                                gReadyState = 'complete';\r\n                            }\r\n                        };\r\n                        function L10nResourceLink(link) {\r\n                            var href = link.href;\r\n                            this.load = function (lang, callback) {\r\n                                parseResource(href, lang, callback, function () {\r\n                                    console.warn(href + ' not found.');\r\n                                    console.warn('\"' + lang + '\" resource not found');\r\n                                    gLanguage = '';\r\n                                    callback();\r\n                                });\r\n                            };\r\n                        }\r\n                        for (var i = 0; i < langCount; i++) {\r\n                            var resource = new L10nResourceLink(langLinks[i]);\r\n                            resource.load(lang, onResourceLoaded);\r\n                        }\r\n                    }\r\n                    function clear() {\r\n                        gL10nData = {};\r\n                        gTextData = '';\r\n                        gLanguage = '';\r\n                    }\r\n                    function getPluralRules(lang) {\r\n                        var locales2rules = {\r\n                            'af': 3,\r\n                            'ak': 4,\r\n                            'am': 4,\r\n                            'ar': 1,\r\n                            'asa': 3,\r\n                            'az': 0,\r\n                            'be': 11,\r\n                            'bem': 3,\r\n                            'bez': 3,\r\n                            'bg': 3,\r\n                            'bh': 4,\r\n                            'bm': 0,\r\n                            'bn': 3,\r\n                            'bo': 0,\r\n                            'br': 20,\r\n                            'brx': 3,\r\n                            'bs': 11,\r\n                            'ca': 3,\r\n                            'cgg': 3,\r\n                            'chr': 3,\r\n                            'cs': 12,\r\n                            'cy': 17,\r\n                            'da': 3,\r\n                            'de': 3,\r\n                            'dv': 3,\r\n                            'dz': 0,\r\n                            'ee': 3,\r\n                            'el': 3,\r\n                            'en': 3,\r\n                            'eo': 3,\r\n                            'es': 3,\r\n                            'et': 3,\r\n                            'eu': 3,\r\n                            'fa': 0,\r\n                            'ff': 5,\r\n                            'fi': 3,\r\n                            'fil': 4,\r\n                            'fo': 3,\r\n                            'fr': 5,\r\n                            'fur': 3,\r\n                            'fy': 3,\r\n                            'ga': 8,\r\n                            'gd': 24,\r\n                            'gl': 3,\r\n                            'gsw': 3,\r\n                            'gu': 3,\r\n                            'guw': 4,\r\n                            'gv': 23,\r\n                            'ha': 3,\r\n                            'haw': 3,\r\n                            'he': 2,\r\n                            'hi': 4,\r\n                            'hr': 11,\r\n                            'hu': 0,\r\n                            'id': 0,\r\n                            'ig': 0,\r\n                            'ii': 0,\r\n                            'is': 3,\r\n                            'it': 3,\r\n                            'iu': 7,\r\n                            'ja': 0,\r\n                            'jmc': 3,\r\n                            'jv': 0,\r\n                            'ka': 0,\r\n                            'kab': 5,\r\n                            'kaj': 3,\r\n                            'kcg': 3,\r\n                            'kde': 0,\r\n                            'kea': 0,\r\n                            'kk': 3,\r\n                            'kl': 3,\r\n                            'km': 0,\r\n                            'kn': 0,\r\n                            'ko': 0,\r\n                            'ksb': 3,\r\n                            'ksh': 21,\r\n                            'ku': 3,\r\n                            'kw': 7,\r\n                            'lag': 18,\r\n                            'lb': 3,\r\n                            'lg': 3,\r\n                            'ln': 4,\r\n                            'lo': 0,\r\n                            'lt': 10,\r\n                            'lv': 6,\r\n                            'mas': 3,\r\n                            'mg': 4,\r\n                            'mk': 16,\r\n                            'ml': 3,\r\n                            'mn': 3,\r\n                            'mo': 9,\r\n                            'mr': 3,\r\n                            'ms': 0,\r\n                            'mt': 15,\r\n                            'my': 0,\r\n                            'nah': 3,\r\n                            'naq': 7,\r\n                            'nb': 3,\r\n                            'nd': 3,\r\n                            'ne': 3,\r\n                            'nl': 3,\r\n                            'nn': 3,\r\n                            'no': 3,\r\n                            'nr': 3,\r\n                            'nso': 4,\r\n                            'ny': 3,\r\n                            'nyn': 3,\r\n                            'om': 3,\r\n                            'or': 3,\r\n                            'pa': 3,\r\n                            'pap': 3,\r\n                            'pl': 13,\r\n                            'ps': 3,\r\n                            'pt': 3,\r\n                            'rm': 3,\r\n                            'ro': 9,\r\n                            'rof': 3,\r\n                            'ru': 11,\r\n                            'rwk': 3,\r\n                            'sah': 0,\r\n                            'saq': 3,\r\n                            'se': 7,\r\n                            'seh': 3,\r\n                            'ses': 0,\r\n                            'sg': 0,\r\n                            'sh': 11,\r\n                            'shi': 19,\r\n                            'sk': 12,\r\n                            'sl': 14,\r\n                            'sma': 7,\r\n                            'smi': 7,\r\n                            'smj': 7,\r\n                            'smn': 7,\r\n                            'sms': 7,\r\n                            'sn': 3,\r\n                            'so': 3,\r\n                            'sq': 3,\r\n                            'sr': 11,\r\n                            'ss': 3,\r\n                            'ssy': 3,\r\n                            'st': 3,\r\n                            'sv': 3,\r\n                            'sw': 3,\r\n                            'syr': 3,\r\n                            'ta': 3,\r\n                            'te': 3,\r\n                            'teo': 3,\r\n                            'th': 0,\r\n                            'ti': 4,\r\n                            'tig': 3,\r\n                            'tk': 3,\r\n                            'tl': 4,\r\n                            'tn': 3,\r\n                            'to': 0,\r\n                            'tr': 0,\r\n                            'ts': 3,\r\n                            'tzm': 22,\r\n                            'uk': 11,\r\n                            'ur': 3,\r\n                            've': 3,\r\n                            'vi': 0,\r\n                            'vun': 3,\r\n                            'wa': 4,\r\n                            'wae': 3,\r\n                            'wo': 0,\r\n                            'xh': 3,\r\n                            'xog': 3,\r\n                            'yo': 0,\r\n                            'zh': 0,\r\n                            'zu': 3\r\n                        };\r\n                        function isIn(n, list) {\r\n                            return list.indexOf(n) !== -1;\r\n                        }\r\n                        function isBetween(n, start, end) {\r\n                            return start <= n && n <= end;\r\n                        }\r\n                        var pluralRules = {\r\n                            '0': function _(n) {\r\n                                return 'other';\r\n                            },\r\n                            '1': function _(n) {\r\n                                if (isBetween(n % 100, 3, 10)) return 'few';\r\n                                if (n === 0) return 'zero';\r\n                                if (isBetween(n % 100, 11, 99)) return 'many';\r\n                                if (n == 2) return 'two';\r\n                                if (n == 1) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '2': function _(n) {\r\n                                if (n !== 0 && n % 10 === 0) return 'many';\r\n                                if (n == 2) return 'two';\r\n                                if (n == 1) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '3': function _(n) {\r\n                                if (n == 1) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '4': function _(n) {\r\n                                if (isBetween(n, 0, 1)) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '5': function _(n) {\r\n                                if (isBetween(n, 0, 2) && n != 2) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '6': function _(n) {\r\n                                if (n === 0) return 'zero';\r\n                                if (n % 10 == 1 && n % 100 != 11) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '7': function _(n) {\r\n                                if (n == 2) return 'two';\r\n                                if (n == 1) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '8': function _(n) {\r\n                                if (isBetween(n, 3, 6)) return 'few';\r\n                                if (isBetween(n, 7, 10)) return 'many';\r\n                                if (n == 2) return 'two';\r\n                                if (n == 1) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '9': function _(n) {\r\n                                if (n === 0 || n != 1 && isBetween(n % 100, 1, 19)) return 'few';\r\n                                if (n == 1) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '10': function _(n) {\r\n                                if (isBetween(n % 10, 2, 9) && !isBetween(n % 100, 11, 19)) return 'few';\r\n                                if (n % 10 == 1 && !isBetween(n % 100, 11, 19)) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '11': function _(n) {\r\n                                if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few';\r\n                                if (n % 10 === 0 || isBetween(n % 10, 5, 9) || isBetween(n % 100, 11, 14)) return 'many';\r\n                                if (n % 10 == 1 && n % 100 != 11) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '12': function _(n) {\r\n                                if (isBetween(n, 2, 4)) return 'few';\r\n                                if (n == 1) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '13': function _(n) {\r\n                                if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few';\r\n                                if (n != 1 && isBetween(n % 10, 0, 1) || isBetween(n % 10, 5, 9) || isBetween(n % 100, 12, 14)) return 'many';\r\n                                if (n == 1) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '14': function _(n) {\r\n                                if (isBetween(n % 100, 3, 4)) return 'few';\r\n                                if (n % 100 == 2) return 'two';\r\n                                if (n % 100 == 1) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '15': function _(n) {\r\n                                if (n === 0 || isBetween(n % 100, 2, 10)) return 'few';\r\n                                if (isBetween(n % 100, 11, 19)) return 'many';\r\n                                if (n == 1) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '16': function _(n) {\r\n                                if (n % 10 == 1 && n != 11) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '17': function _(n) {\r\n                                if (n == 3) return 'few';\r\n                                if (n === 0) return 'zero';\r\n                                if (n == 6) return 'many';\r\n                                if (n == 2) return 'two';\r\n                                if (n == 1) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '18': function _(n) {\r\n                                if (n === 0) return 'zero';\r\n                                if (isBetween(n, 0, 2) && n !== 0 && n != 2) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '19': function _(n) {\r\n                                if (isBetween(n, 2, 10)) return 'few';\r\n                                if (isBetween(n, 0, 1)) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '20': function _(n) {\r\n                                if ((isBetween(n % 10, 3, 4) || n % 10 == 9) && !(isBetween(n % 100, 10, 19) || isBetween(n % 100, 70, 79) || isBetween(n % 100, 90, 99))) return 'few';\r\n                                if (n % 1000000 === 0 && n !== 0) return 'many';\r\n                                if (n % 10 == 2 && !isIn(n % 100, [12, 72, 92])) return 'two';\r\n                                if (n % 10 == 1 && !isIn(n % 100, [11, 71, 91])) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '21': function _(n) {\r\n                                if (n === 0) return 'zero';\r\n                                if (n == 1) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '22': function _(n) {\r\n                                if (isBetween(n, 0, 1) || isBetween(n, 11, 99)) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '23': function _(n) {\r\n                                if (isBetween(n % 10, 1, 2) || n % 20 === 0) return 'one';\r\n                                return 'other';\r\n                            },\r\n                            '24': function _(n) {\r\n                                if (isBetween(n, 3, 10) || isBetween(n, 13, 19)) return 'few';\r\n                                if (isIn(n, [2, 12])) return 'two';\r\n                                if (isIn(n, [1, 11])) return 'one';\r\n                                return 'other';\r\n                            }\r\n                        };\r\n                        var index = locales2rules[lang.replace(/-.*$/, '')];\r\n                        if (!(index in pluralRules)) {\r\n                            console.warn('plural form unknown for [' + lang + ']');\r\n                            return function () {\r\n                                return 'other';\r\n                            };\r\n                        }\r\n                        return pluralRules[index];\r\n                    }\r\n                    gMacros.plural = function (str, param, key, prop) {\r\n                        var n = parseFloat(param);\r\n                        if (isNaN(n)) return str;\r\n                        if (prop != gTextProp) return str;\r\n                        if (!gMacros._pluralRules) {\r\n                            gMacros._pluralRules = getPluralRules(gLanguage);\r\n                        }\r\n                        var index = '[' + gMacros._pluralRules(n) + ']';\r\n                        if (n === 0 && key + '[zero]' in gL10nData) {\r\n                            str = gL10nData[key + '[zero]'][prop];\r\n                        } else if (n == 1 && key + '[one]' in gL10nData) {\r\n                            str = gL10nData[key + '[one]'][prop];\r\n                        } else if (n == 2 && key + '[two]' in gL10nData) {\r\n                            str = gL10nData[key + '[two]'][prop];\r\n                        } else if (key + index in gL10nData) {\r\n                            str = gL10nData[key + index][prop];\r\n                        } else if (key + '[other]' in gL10nData) {\r\n                            str = gL10nData[key + '[other]'][prop];\r\n                        }\r\n                        return str;\r\n                    };\r\n                    function getL10nData(key, args, fallback) {\r\n                        var data = gL10nData[key];\r\n                        if (!data) {\r\n                            console.warn('#' + key + ' is undefined.');\r\n                            if (!fallback) {\r\n                                return null;\r\n                            }\r\n                            data = fallback;\r\n                        }\r\n                        var rv = {};\r\n                        for (var prop in data) {\r\n                            var str = data[prop];\r\n                            str = substIndexes(str, args, key, prop);\r\n                            str = substArguments(str, args, key);\r\n                            rv[prop] = str;\r\n                        }\r\n                        return rv;\r\n                    }\r\n                    function substIndexes(str, args, key, prop) {\r\n                        var reIndex = /\\{\\[\\s*([a-zA-Z]+)\\(([a-zA-Z]+)\\)\\s*\\]\\}/;\r\n                        var reMatch = reIndex.exec(str);\r\n                        if (!reMatch || !reMatch.length) return str;\r\n                        var macroName = reMatch[1];\r\n                        var paramName = reMatch[2];\r\n                        var param;\r\n                        if (args && paramName in args) {\r\n                            param = args[paramName];\r\n                        } else if (paramName in gL10nData) {\r\n                            param = gL10nData[paramName];\r\n                        }\r\n                        if (macroName in gMacros) {\r\n                            var macro = gMacros[macroName];\r\n                            str = macro(str, param, key, prop);\r\n                        }\r\n                        return str;\r\n                    }\r\n                    function substArguments(str, args, key) {\r\n                        var reArgs = /\\{\\{\\s*(.+?)\\s*\\}\\}/g;\r\n                        return str.replace(reArgs, function (matched_text, arg) {\r\n                            if (args && arg in args) {\r\n                                return args[arg];\r\n                            }\r\n                            if (arg in gL10nData) {\r\n                                return gL10nData[arg];\r\n                            }\r\n                            console.log('argument {{' + arg + '}} for #' + key + ' is undefined.');\r\n                            return matched_text;\r\n                        });\r\n                    }\r\n                    function translateElement(element) {\r\n                        var l10n = getL10nAttributes(element);\r\n                        if (!l10n.id) return;\r\n                        var data = getL10nData(l10n.id, l10n.args);\r\n                        if (!data) {\r\n                            console.warn('#' + l10n.id + ' is undefined.');\r\n                            return;\r\n                        }\r\n                        if (data[gTextProp]) {\r\n                            if (getChildElementCount(element) === 0) {\r\n                                element[gTextProp] = data[gTextProp];\r\n                            } else {\r\n                                var children = element.childNodes;\r\n                                var found = false;\r\n                                for (var i = 0, l = children.length; i < l; i++) {\r\n                                    if (children[i].nodeType === 3 && /\\S/.test(children[i].nodeValue)) {\r\n                                        if (found) {\r\n                                            children[i].nodeValue = '';\r\n                                        } else {\r\n                                            children[i].nodeValue = data[gTextProp];\r\n                                            found = true;\r\n                                        }\r\n                                    }\r\n                                }\r\n                                if (!found) {\r\n                                    var textNode = document.createTextNode(data[gTextProp]);\r\n                                    element.insertBefore(textNode, element.firstChild);\r\n                                }\r\n                            }\r\n                            delete data[gTextProp];\r\n                        }\r\n                        for (var k in data) {\r\n                            element[k] = data[k];\r\n                        }\r\n                    }\r\n                    function getChildElementCount(element) {\r\n                        if (element.children) {\r\n                            return element.children.length;\r\n                        }\r\n                        if (typeof element.childElementCount !== 'undefined') {\r\n                            return element.childElementCount;\r\n                        }\r\n                        var count = 0;\r\n                        for (var i = 0; i < element.childNodes.length; i++) {\r\n                            count += element.nodeType === 1 ? 1 : 0;\r\n                        }\r\n                        return count;\r\n                    }\r\n                    function translateFragment(element) {\r\n                        element = element || document.documentElement;\r\n                        var children = getTranslatableChildren(element);\r\n                        var elementCount = children.length;\r\n                        for (var i = 0; i < elementCount; i++) {\r\n                            translateElement(children[i]);\r\n                        }\r\n                        translateElement(element);\r\n                    }\r\n                    return {\r\n                        get: function get(key, args, fallbackString) {\r\n                            var index = key.lastIndexOf('.');\r\n                            var prop = gTextProp;\r\n                            if (index > 0) {\r\n                                prop = key.substr(index + 1);\r\n                                key = key.substring(0, index);\r\n                            }\r\n                            var fallback;\r\n                            if (fallbackString) {\r\n                                fallback = {};\r\n                                fallback[prop] = fallbackString;\r\n                            }\r\n                            var data = getL10nData(key, args, fallback);\r\n                            if (data && prop in data) {\r\n                                return data[prop];\r\n                            }\r\n                            return '{{' + key + '}}';\r\n                        },\r\n                        getData: function getData() {\r\n                            return gL10nData;\r\n                        },\r\n                        getText: function getText() {\r\n                            return gTextData;\r\n                        },\r\n                        getLanguage: function getLanguage() {\r\n                            return gLanguage;\r\n                        },\r\n                        setLanguage: function setLanguage(lang, callback) {\r\n                            loadLocale(lang, function () {\r\n                                if (callback) callback();\r\n                            });\r\n                        },\r\n                        getDirection: function getDirection() {\r\n                            var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];\r\n                            var shortCode = gLanguage.split('-', 1)[0];\r\n                            return rtlList.indexOf(shortCode) >= 0 ? 'rtl' : 'ltr';\r\n                        },\r\n                        translate: translateFragment,\r\n                        getReadyState: function getReadyState() {\r\n                            return gReadyState;\r\n                        },\r\n                        ready: function ready(callback) {\r\n                            if (!callback) {\r\n                                return;\r\n                            } else if (gReadyState == 'complete' || gReadyState == 'interactive') {\r\n                                window.setTimeout(function () {\r\n                                    callback();\r\n                                });\r\n                            } else if (document.addEventListener) {\r\n                                document.addEventListener('localized', function once() {\r\n                                    document.removeEventListener('localized', once);\r\n                                    callback();\r\n                                });\r\n                            }\r\n                        }\r\n                    };\r\n                }(window, document);\r\n\r\n                /***/\r\n            }),\r\n        /* 11 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.DefaultAnnotationLayerFactory = exports.AnnotationLayerBuilder = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _pdfjsLib = __webpack_require__(1);\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                var _pdf_link_service = __webpack_require__(5);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var AnnotationLayerBuilder = function () {\r\n                    function AnnotationLayerBuilder(_ref) {\r\n                        var pageDiv = _ref.pageDiv,\r\n                            pdfPage = _ref.pdfPage,\r\n                            linkService = _ref.linkService,\r\n                            downloadManager = _ref.downloadManager,\r\n                            _ref$renderInteractiv = _ref.renderInteractiveForms,\r\n                            renderInteractiveForms = _ref$renderInteractiv === undefined ? false : _ref$renderInteractiv,\r\n                            _ref$l10n = _ref.l10n,\r\n                            l10n = _ref$l10n === undefined ? _ui_utils.NullL10n : _ref$l10n;\r\n\r\n                        _classCallCheck(this, AnnotationLayerBuilder);\r\n\r\n                        this.pageDiv = pageDiv;\r\n                        this.pdfPage = pdfPage;\r\n                        this.linkService = linkService;\r\n                        this.downloadManager = downloadManager;\r\n                        this.renderInteractiveForms = renderInteractiveForms;\r\n                        this.l10n = l10n;\r\n                        this.div = null;\r\n                    }\r\n\r\n                    _createClass(AnnotationLayerBuilder, [{\r\n                        key: 'render',\r\n                        value: function render(viewport) {\r\n                            var _this = this;\r\n\r\n                            var intent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'display';\r\n\r\n                            this.pdfPage.getAnnotations({ intent: intent }).then(function (annotations) {\r\n                                var parameters = {\r\n                                    viewport: viewport.clone({ dontFlip: true }),\r\n                                    div: _this.div,\r\n                                    annotations: annotations,\r\n                                    page: _this.pdfPage,\r\n                                    renderInteractiveForms: _this.renderInteractiveForms,\r\n                                    linkService: _this.linkService,\r\n                                    downloadManager: _this.downloadManager\r\n                                };\r\n                                if (_this.div) {\r\n                                    _pdfjsLib.AnnotationLayer.update(parameters);\r\n                                } else {\r\n                                    if (annotations.length === 0) {\r\n                                        return;\r\n                                    }\r\n                                    _this.div = document.createElement('div');\r\n                                    _this.div.className = 'annotationLayer';\r\n                                    _this.pageDiv.appendChild(_this.div);\r\n                                    parameters.div = _this.div;\r\n                                    _pdfjsLib.AnnotationLayer.render(parameters);\r\n                                    _this.l10n.translate(_this.div);\r\n                                }\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'hide',\r\n                        value: function hide() {\r\n                            if (!this.div) {\r\n                                return;\r\n                            }\r\n                            this.div.setAttribute('hidden', 'true');\r\n                        }\r\n                    }]);\r\n\r\n                    return AnnotationLayerBuilder;\r\n                }();\r\n\r\n                var DefaultAnnotationLayerFactory = function () {\r\n                    function DefaultAnnotationLayerFactory() {\r\n                        _classCallCheck(this, DefaultAnnotationLayerFactory);\r\n                    }\r\n\r\n                    _createClass(DefaultAnnotationLayerFactory, [{\r\n                        key: 'createAnnotationLayerBuilder',\r\n                        value: function createAnnotationLayerBuilder(pageDiv, pdfPage) {\r\n                            var renderInteractiveForms = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\r\n                            var l10n = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _ui_utils.NullL10n;\r\n\r\n                            return new AnnotationLayerBuilder({\r\n                                pageDiv: pageDiv,\r\n                                pdfPage: pdfPage,\r\n                                renderInteractiveForms: renderInteractiveForms,\r\n                                linkService: new _pdf_link_service.SimpleLinkService(),\r\n                                l10n: l10n\r\n                            });\r\n                        }\r\n                    }]);\r\n\r\n                    return DefaultAnnotationLayerFactory;\r\n                }();\r\n\r\n                exports.AnnotationLayerBuilder = AnnotationLayerBuilder;\r\n                exports.DefaultAnnotationLayerFactory = DefaultAnnotationLayerFactory;\r\n\r\n                /***/\r\n            }),\r\n        /* 12 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.DownloadManager = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _pdfjsLib = __webpack_require__(1);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                ;\r\n                function _download(blobUrl, filename) {\r\n                    var a = document.createElement('a');\r\n                    if (a.click) {\r\n                        a.href = blobUrl;\r\n                        a.target = '_parent';\r\n                        if ('download' in a) {\r\n                            a.download = filename;\r\n                        }\r\n                        (document.body || document.documentElement).appendChild(a);\r\n                        a.click();\r\n                        a.parentNode.removeChild(a);\r\n                    } else {\r\n                        if (window.top === window && blobUrl.split('#')[0] === window.location.href.split('#')[0]) {\r\n                            var padCharacter = blobUrl.indexOf('?') === -1 ? '?' : '&';\r\n                            blobUrl = blobUrl.replace(/#|$/, padCharacter + '$&');\r\n                        }\r\n                        window.open(blobUrl, '_parent');\r\n                    }\r\n                }\r\n\r\n                var DownloadManager = function () {\r\n                    function DownloadManager() {\r\n                        _classCallCheck(this, DownloadManager);\r\n                    }\r\n\r\n                    _createClass(DownloadManager, [{\r\n                        key: 'downloadUrl',\r\n                        value: function downloadUrl(url, filename) {\r\n                            if (!(0, _pdfjsLib.createValidAbsoluteUrl)(url, 'http://example.com')) {\r\n                                return;\r\n                            }\r\n                            _download(url + '#pdfjs.action=download', filename);\r\n                        }\r\n                    }, {\r\n                        key: 'downloadData',\r\n                        value: function downloadData(data, filename, contentType) {\r\n                            if (navigator.msSaveBlob) {\r\n                                return navigator.msSaveBlob(new Blob([data], { type: contentType }), filename);\r\n                            }\r\n                            var blobUrl = (0, _pdfjsLib.createObjectURL)(data, contentType, _pdfjsLib.PDFJS.disableCreateObjectURL);\r\n                            _download(blobUrl, filename);\r\n                        }\r\n                    }, {\r\n                        key: 'download',\r\n                        value: function download(blob, url, filename) {\r\n                            if (navigator.msSaveBlob) {\r\n                                if (!navigator.msSaveBlob(blob, filename)) {\r\n                                    this.downloadUrl(url, filename);\r\n                                }\r\n                                return;\r\n                            }\r\n                            if (_pdfjsLib.PDFJS.disableCreateObjectURL) {\r\n                                this.downloadUrl(url, filename);\r\n                                return;\r\n                            }\r\n                            var blobUrl = URL.createObjectURL(blob);\r\n                            _download(blobUrl, filename);\r\n                        }\r\n                    }]);\r\n\r\n                    return DownloadManager;\r\n                }();\r\n\r\n                exports.DownloadManager = DownloadManager;\r\n\r\n                /***/\r\n            }),\r\n        /* 13 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.GenericL10n = undefined;\r\n\r\n                var _createClass = function () {\r\n                    function defineProperties(target, props) {\r\n                        for (var i = 0; i < props.length; i++) {\r\n                            var descriptor = props[i];\r\n                            descriptor.enumerable = descriptor.enumerable || false;\r\n                            descriptor.configurable = true;\r\n                            if (\"value\" in descriptor) descriptor.writable = true;\r\n                            Object.defineProperty(target, descriptor.key, descriptor);\r\n                        }\r\n                    }\r\n                    return function (Constructor, protoProps, staticProps) {\r\n                        if (protoProps) defineProperties(Constructor.prototype, protoProps);\r\n                        if (staticProps) defineProperties(Constructor, staticProps);\r\n                        return Constructor;\r\n                    };\r\n                }();\r\n\r\n                __webpack_require__(10);\r\n\r\n                function _classCallCheck(instance, Constructor) {\r\n                    if (!(instance instanceof Constructor)) {\r\n                        throw new TypeError(\"Cannot call a class as a function\");\r\n                    }\r\n                }\r\n\r\n                var webL10n = document.webL10n;\r\n\r\n                var GenericL10n = function () {\r\n                    function GenericL10n(lang) {\r\n                        _classCallCheck(this, GenericL10n);\r\n\r\n                        this._lang = lang;\r\n                        this._ready = new Promise(function (resolve, reject) {\r\n                            webL10n.setLanguage(lang, function () {\r\n                                resolve(webL10n);\r\n                            });\r\n                        });\r\n                    }\r\n\r\n                    _createClass(GenericL10n, [{\r\n                        key: 'getDirection',\r\n                        value: function getDirection() {\r\n                            return this._ready.then(function (l10n) {\r\n                                return l10n.getDirection();\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'get',\r\n                        value: function get(property, args, fallback) {\r\n                            return this._ready.then(function (l10n) {\r\n                                return l10n.get(property, args, fallback);\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'translate',\r\n                        value: function translate(element) {\r\n                            return this._ready.then(function (l10n) {\r\n                                return l10n.translate(element);\r\n                            });\r\n                        }\r\n                    }]);\r\n\r\n                    return GenericL10n;\r\n                }();\r\n\r\n                exports.GenericL10n = GenericL10n;\r\n\r\n                /***/\r\n            }),\r\n        /* 14 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                function GrabToPan(options) {\r\n                    this.element = options.element;\r\n                    this.document = options.element.ownerDocument;\r\n                    if (typeof options.ignoreTarget === 'function') {\r\n                        this.ignoreTarget = options.ignoreTarget;\r\n                    }\r\n                    this.onActiveChanged = options.onActiveChanged;\r\n                    this.activate = this.activate.bind(this);\r\n                    this.deactivate = this.deactivate.bind(this);\r\n                    this.toggle = this.toggle.bind(this);\r\n                    this._onmousedown = this._onmousedown.bind(this);\r\n                    this._onmousemove = this._onmousemove.bind(this);\r\n                    this._endPan = this._endPan.bind(this);\r\n                    var overlay = this.overlay = document.createElement('div');\r\n                    overlay.className = 'grab-to-pan-grabbing';\r\n                }\r\n                GrabToPan.prototype = {\r\n                    CSS_CLASS_GRAB: 'grab-to-pan-grab',\r\n                    activate: function GrabToPan_activate() {\r\n                        if (!this.active) {\r\n                            this.active = true;\r\n                            this.element.addEventListener('mousedown', this._onmousedown, true);\r\n                            this.element.classList.add(this.CSS_CLASS_GRAB);\r\n                            if (this.onActiveChanged) {\r\n                                this.onActiveChanged(true);\r\n                            }\r\n                        }\r\n                    },\r\n                    deactivate: function GrabToPan_deactivate() {\r\n                        if (this.active) {\r\n                            this.active = false;\r\n                            this.element.removeEventListener('mousedown', this._onmousedown, true);\r\n                            this._endPan();\r\n                            this.element.classList.remove(this.CSS_CLASS_GRAB);\r\n                            if (this.onActiveChanged) {\r\n                                this.onActiveChanged(false);\r\n                            }\r\n                        }\r\n                    },\r\n                    toggle: function GrabToPan_toggle() {\r\n                        if (this.active) {\r\n                            this.deactivate();\r\n                        } else {\r\n                            this.activate();\r\n                        }\r\n                    },\r\n                    ignoreTarget: function GrabToPan_ignoreTarget(node) {\r\n                        return node[matchesSelector]('a[href], a[href] *, input, textarea, button, button *, select, option');\r\n                    },\r\n                    _onmousedown: function GrabToPan__onmousedown(event) {\r\n                        if (event.button !== 0 || this.ignoreTarget(event.target)) {\r\n                            return;\r\n                        }\r\n                        if (event.originalTarget) {\r\n                            try {\r\n                                event.originalTarget.tagName;\r\n                            } catch (e) {\r\n                                return;\r\n                            }\r\n                        }\r\n                        this.scrollLeftStart = this.element.scrollLeft;\r\n                        this.scrollTopStart = this.element.scrollTop;\r\n                        this.clientXStart = event.clientX;\r\n                        this.clientYStart = event.clientY;\r\n                        this.document.addEventListener('mousemove', this._onmousemove, true);\r\n                        this.document.addEventListener('mouseup', this._endPan, true);\r\n                        this.element.addEventListener('scroll', this._endPan, true);\r\n                        event.preventDefault();\r\n                        event.stopPropagation();\r\n                        var focusedElement = document.activeElement;\r\n                        if (focusedElement && !focusedElement.contains(event.target)) {\r\n                            focusedElement.blur();\r\n                        }\r\n                    },\r\n                    _onmousemove: function GrabToPan__onmousemove(event) {\r\n                        this.element.removeEventListener('scroll', this._endPan, true);\r\n                        if (isLeftMouseReleased(event)) {\r\n                            this._endPan();\r\n                            return;\r\n                        }\r\n                        var xDiff = event.clientX - this.clientXStart;\r\n                        var yDiff = event.clientY - this.clientYStart;\r\n                        var scrollTop = this.scrollTopStart - yDiff;\r\n                        var scrollLeft = this.scrollLeftStart - xDiff;\r\n                        if (this.element.scrollTo) {\r\n                            this.element.scrollTo({\r\n                                top: scrollTop,\r\n                                left: scrollLeft,\r\n                                behavior: 'instant'\r\n                            });\r\n                        } else {\r\n                            this.element.scrollTop = scrollTop;\r\n                            this.element.scrollLeft = scrollLeft;\r\n                        }\r\n                        if (!this.overlay.parentNode) {\r\n                            document.body.appendChild(this.overlay);\r\n                        }\r\n                    },\r\n                    _endPan: function GrabToPan__endPan() {\r\n                        this.element.removeEventListener('scroll', this._endPan, true);\r\n                        this.document.removeEventListener('mousemove', this._onmousemove, true);\r\n                        this.document.removeEventListener('mouseup', this._endPan, true);\r\n                        this.overlay.remove();\r\n                    }\r\n                };\r\n                var matchesSelector;\r\n                ['webkitM', 'mozM', 'msM', 'oM', 'm'].some(function (prefix) {\r\n                    var name = prefix + 'atches';\r\n                    if (name in document.documentElement) {\r\n                        matchesSelector = name;\r\n                    }\r\n                    name += 'Selector';\r\n                    if (name in document.documentElement) {\r\n                        matchesSelector = name;\r\n                    }\r\n                    return matchesSelector;\r\n                });\r\n                var isNotIEorIsIE10plus = !document.documentMode || document.documentMode > 9;\r\n                var chrome = window.chrome;\r\n                var isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app);\r\n                var isSafari6plus = /Apple/.test(navigator.vendor) && /Version\\/([6-9]\\d*|[1-5]\\d+)/.test(navigator.userAgent);\r\n                function isLeftMouseReleased(event) {\r\n                    if ('buttons' in event && isNotIEorIsIE10plus) {\r\n                        return !(event.buttons & 1);\r\n                    }\r\n                    if (isChrome15OrOpera15plus || isSafari6plus) {\r\n                        return event.which === 0;\r\n                    }\r\n                }\r\n                exports.GrabToPan = GrabToPan;\r\n\r\n                /***/\r\n            }),\r\n        /* 15 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var OverlayManager = function () {\r\n                    function OverlayManager() {\r\n                        _classCallCheck(this, OverlayManager);\r\n\r\n                        this._overlays = {};\r\n                        this._active = null;\r\n                        this._keyDownBound = this._keyDown.bind(this);\r\n                    }\r\n\r\n                    _createClass(OverlayManager, [{\r\n                        key: 'register',\r\n                        value: function register(name, element) {\r\n                            var _this = this;\r\n\r\n                            var callerCloseMethod = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\r\n                            var canForceClose = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\r\n\r\n                            return new Promise(function (resolve) {\r\n                                var container = void 0;\r\n                                //console.log(\"name: \",name,\",element: \",element ,\",container: \",container);\r\n                                if (!name || !element || !(container = element.parentNode)) {\r\n                                    throw new Error('Not enough parameters.');\r\n                                } else if (_this._overlays[name]) {\r\n                                    throw new Error('The overlay is already registered.');\r\n                                }\r\n                                _this._overlays[name] = {\r\n                                    element: element,\r\n                                    container: container,\r\n                                    callerCloseMethod: callerCloseMethod,\r\n                                    canForceClose: canForceClose\r\n                                };\r\n                                resolve();\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'unregister',\r\n                        value: function unregister(name) {\r\n                            var _this2 = this;\r\n\r\n                            return new Promise(function (resolve) {\r\n                                if (!_this2._overlays[name]) {\r\n                                    throw new Error('The overlay does not exist.');\r\n                                } else if (_this2._active === name) {\r\n                                    throw new Error('The overlay cannot be removed while it is active.');\r\n                                }\r\n                                delete _this2._overlays[name];\r\n                                resolve();\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'open',\r\n                        value: function open(name) {\r\n                            var _this3 = this;\r\n\r\n                            return new Promise(function (resolve) {\r\n                                if (!_this3._overlays[name]) {\r\n                                    throw new Error('The overlay does not exist.');\r\n                                } else if (_this3._active) {\r\n                                    if (_this3._overlays[name].canForceClose) {\r\n                                        _this3._closeThroughCaller();\r\n                                    } else if (_this3._active === name) {\r\n                                        throw new Error('The overlay is already active.');\r\n                                    } else {\r\n                                        throw new Error('Another overlay is currently active.');\r\n                                    }\r\n                                }\r\n                                _this3._active = name;\r\n                                _this3._overlays[_this3._active].element.classList.remove('hidden');\r\n                                _this3._overlays[_this3._active].container.classList.remove('hidden');\r\n                                window.addEventListener('keydown', _this3._keyDownBound);\r\n                                resolve();\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'close',\r\n                        value: function close(name) {\r\n                            var _this4 = this;\r\n\r\n                            return new Promise(function (resolve) {\r\n                                if (!_this4._overlays[name]) {\r\n                                    throw new Error('The overlay does not exist.');\r\n                                } else if (!_this4._active) {\r\n                                    throw new Error('The overlay is currently not active.');\r\n                                } else if (_this4._active !== name) {\r\n                                    throw new Error('Another overlay is currently active.');\r\n                                }\r\n                                _this4._overlays[_this4._active].container.classList.add('hidden');\r\n                                _this4._overlays[_this4._active].element.classList.add('hidden');\r\n                                _this4._active = null;\r\n                                window.removeEventListener('keydown', _this4._keyDownBound);\r\n                                resolve();\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: '_keyDown',\r\n                        value: function _keyDown(evt) {\r\n                            if (this._active && evt.keyCode === 27) {\r\n                                this._closeThroughCaller();\r\n                                evt.preventDefault();\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_closeThroughCaller',\r\n                        value: function _closeThroughCaller() {\r\n                            if (this._overlays[this._active].callerCloseMethod) {\r\n                                this._overlays[this._active].callerCloseMethod();\r\n                            }\r\n                            if (this._active) {\r\n                                this.close(this._active);\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'active',\r\n                        get: function get() {\r\n                            return this._active;\r\n                        }\r\n                    }]);\r\n\r\n                    return OverlayManager;\r\n                }();\r\n\r\n                exports.OverlayManager = OverlayManager;\r\n\r\n                /***/\r\n            }),\r\n        /* 16 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.PasswordPrompt = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                var _pdfjsLib = __webpack_require__(1);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var PasswordPrompt = function () {\r\n                    function PasswordPrompt(options, overlayManager) {\r\n                        var _this = this;\r\n\r\n                        var l10n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ui_utils.NullL10n;\r\n\r\n                        _classCallCheck(this, PasswordPrompt);\r\n\r\n                        this.overlayName = options.overlayName;\r\n                        this.container = options.container;\r\n                        this.label = options.label;\r\n                        this.input = options.input;\r\n                        this.submitButton = options.submitButton;\r\n                        this.cancelButton = options.cancelButton;\r\n                        this.overlayManager = overlayManager;\r\n                        this.l10n = l10n;\r\n                        this.updateCallback = null;\r\n                        this.reason = null;\r\n                        this.submitButton.addEventListener('click', this.verify.bind(this));\r\n                        this.cancelButton.addEventListener('click', this.close.bind(this));\r\n                        this.input.addEventListener('keydown', function (e) {\r\n                            if (e.keyCode === 13) {\r\n                                _this.verify();\r\n                            }\r\n                        });\r\n                        this.overlayManager.register(this.overlayName, this.container, this.close.bind(this), true);\r\n                    }\r\n\r\n                    _createClass(PasswordPrompt, [{\r\n                        key: 'open',\r\n                        value: function open() {\r\n                            var _this2 = this;\r\n\r\n                            this.overlayManager.open(this.overlayName).then(function () {\r\n                                _this2.input.focus();\r\n                                var promptString = void 0;\r\n                                if (_this2.reason === _pdfjsLib.PasswordResponses.INCORRECT_PASSWORD) {\r\n                                    promptString = _this2.l10n.get('password_invalid', null, 'Invalid password. Please try again.');\r\n                                } else {\r\n                                    promptString = _this2.l10n.get('password_label', null, 'Enter the password to open this PDF file.');\r\n                                }\r\n                                promptString.then(function (msg) {\r\n                                    _this2.label.textContent = msg;\r\n                                });\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'close',\r\n                        value: function close() {\r\n                            var _this3 = this;\r\n\r\n                            this.overlayManager.close(this.overlayName).then(function () {\r\n                                _this3.input.value = '';\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'verify',\r\n                        value: function verify() {\r\n                            var password = this.input.value;\r\n                            if (password && password.length > 0) {\r\n                                this.close();\r\n                                return this.updateCallback(password);\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'setUpdateCallback',\r\n                        value: function setUpdateCallback(updateCallback, reason) {\r\n                            this.updateCallback = updateCallback;\r\n                            this.reason = reason;\r\n                        }\r\n                    }]);\r\n\r\n                    return PasswordPrompt;\r\n                }();\r\n\r\n                exports.PasswordPrompt = PasswordPrompt;\r\n\r\n                /***/\r\n            }),\r\n        /* 17 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.PDFAttachmentViewer = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _pdfjsLib = __webpack_require__(1);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var PDFAttachmentViewer = function () {\r\n                    function PDFAttachmentViewer(_ref) {\r\n                        var container = _ref.container,\r\n                            eventBus = _ref.eventBus,\r\n                            downloadManager = _ref.downloadManager;\r\n\r\n                        _classCallCheck(this, PDFAttachmentViewer);\r\n\r\n                        this.attachments = null;\r\n                        this.container = container;\r\n                        this.eventBus = eventBus;\r\n                        this.downloadManager = downloadManager;\r\n                        this._renderedCapability = (0, _pdfjsLib.createPromiseCapability)();\r\n                        this.eventBus.on('fileattachmentannotation', this._appendAttachment.bind(this));\r\n                    }\r\n\r\n                    _createClass(PDFAttachmentViewer, [{\r\n                        key: 'reset',\r\n                        value: function reset() {\r\n                            var keepRenderedCapability = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\r\n\r\n                            this.attachments = null;\r\n                            this.container.textContent = '';\r\n                            if (!keepRenderedCapability) {\r\n                                this._renderedCapability = (0, _pdfjsLib.createPromiseCapability)();\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_dispatchEvent',\r\n                        value: function _dispatchEvent(attachmentsCount) {\r\n                            this.eventBus.dispatch('attachmentsloaded', {\r\n                                source: this,\r\n                                attachmentsCount: attachmentsCount\r\n                            });\r\n                            this._renderedCapability.resolve();\r\n                        }\r\n                    }, {\r\n                        key: '_bindPdfLink',\r\n                        value: function _bindPdfLink(button, content, filename) {\r\n                            if (_pdfjsLib.PDFJS.disableCreateObjectURL) {\r\n                                throw new Error('bindPdfLink: ' + 'Unsupported \"PDFJS.disableCreateObjectURL\" value.');\r\n                            }\r\n                            var blobUrl = void 0;\r\n                            button.onclick = function () {\r\n                                if (!blobUrl) {\r\n                                    blobUrl = (0, _pdfjsLib.createObjectURL)(content, 'application/pdf');\r\n                                }\r\n                                var viewerUrl = void 0;\r\n                                viewerUrl = '?file=' + encodeURIComponent(blobUrl + '#' + filename);\r\n                                window.open(viewerUrl);\r\n                                return false;\r\n                            };\r\n                        }\r\n                    }, {\r\n                        key: '_bindLink',\r\n                        value: function _bindLink(button, content, filename) {\r\n                            var _this = this;\r\n\r\n                            button.onclick = function () {\r\n                                _this.downloadManager.downloadData(content, filename, '');\r\n                                return false;\r\n                            };\r\n                        }\r\n                    }, {\r\n                        key: 'render',\r\n                        value: function render(_ref2) {\r\n                            var attachments = _ref2.attachments,\r\n                                _ref2$keepRenderedCap = _ref2.keepRenderedCapability,\r\n                                keepRenderedCapability = _ref2$keepRenderedCap === undefined ? false : _ref2$keepRenderedCap;\r\n\r\n                            var attachmentsCount = 0;\r\n                            if (this.attachments) {\r\n                                this.reset(keepRenderedCapability === true);\r\n                            }\r\n                            this.attachments = attachments || null;\r\n                            if (!attachments) {\r\n                                this._dispatchEvent(attachmentsCount);\r\n                                return;\r\n                            }\r\n                            var names = Object.keys(attachments).sort(function (a, b) {\r\n                                return a.toLowerCase().localeCompare(b.toLowerCase());\r\n                            });\r\n                            attachmentsCount = names.length;\r\n                            for (var i = 0; i < attachmentsCount; i++) {\r\n                                var item = attachments[names[i]];\r\n                                var filename = (0, _pdfjsLib.removeNullCharacters)((0, _pdfjsLib.getFilenameFromUrl)(item.filename));\r\n                                var div = document.createElement('div');\r\n                                div.className = 'attachmentsItem';\r\n                                var button = document.createElement('button');\r\n                                button.textContent = filename;\r\n                                if (/\\.pdf$/i.test(filename) && !_pdfjsLib.PDFJS.disableCreateObjectURL) {\r\n                                    this._bindPdfLink(button, item.content, filename);\r\n                                } else {\r\n                                    this._bindLink(button, item.content, filename);\r\n                                }\r\n                                div.appendChild(button);\r\n                                this.container.appendChild(div);\r\n                            }\r\n                            this._dispatchEvent(attachmentsCount);\r\n                        }\r\n                    }, {\r\n                        key: '_appendAttachment',\r\n                        value: function _appendAttachment(_ref3) {\r\n                            var _this2 = this;\r\n\r\n                            var id = _ref3.id,\r\n                                filename = _ref3.filename,\r\n                                content = _ref3.content;\r\n\r\n                            this._renderedCapability.promise.then(function () {\r\n                                var attachments = _this2.attachments;\r\n                                if (!attachments) {\r\n                                    attachments = Object.create(null);\r\n                                } else {\r\n                                    for (var name in attachments) {\r\n                                        if (id === name) {\r\n                                            return;\r\n                                        }\r\n                                    }\r\n                                }\r\n                                attachments[id] = {\r\n                                    filename: filename,\r\n                                    content: content\r\n                                };\r\n                                _this2.render({\r\n                                    attachments: attachments,\r\n                                    keepRenderedCapability: true\r\n                                });\r\n                            });\r\n                        }\r\n                    }]);\r\n\r\n                    return PDFAttachmentViewer;\r\n                }();\r\n\r\n                exports.PDFAttachmentViewer = PDFAttachmentViewer;\r\n\r\n                /***/\r\n            }),\r\n        /* 18 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.PDFDocumentProperties = undefined;\r\n\r\n                var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                var _pdfjsLib = __webpack_require__(1);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var DEFAULT_FIELD_CONTENT = '-';\r\n\r\n                var PDFDocumentProperties = function () {\r\n                    function PDFDocumentProperties(_ref, overlayManager) {\r\n                        var overlayName = _ref.overlayName,\r\n                            fields = _ref.fields,\r\n                            container = _ref.container,\r\n                            closeButton = _ref.closeButton;\r\n                        var l10n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ui_utils.NullL10n;\r\n\r\n                        _classCallCheck(this, PDFDocumentProperties);\r\n\r\n                        this.overlayName = overlayName;\r\n                        this.fields = fields;\r\n                        this.container = container;\r\n                        this.overlayManager = overlayManager;\r\n                        this.l10n = l10n;\r\n                        this._reset();\r\n                        if (closeButton) {\r\n                            closeButton.addEventListener('click', this.close.bind(this));\r\n                        }\r\n                        this.overlayManager.register(this.overlayName, this.container, this.close.bind(this));\r\n                    }\r\n\r\n                    _createClass(PDFDocumentProperties, [{\r\n                        key: 'open',\r\n                        value: function open() {\r\n                            var _this = this;\r\n\r\n                            var freezeFieldData = function freezeFieldData(data) {\r\n                                Object.defineProperty(_this, 'fieldData', {\r\n                                    value: Object.freeze(data),\r\n                                    writable: false,\r\n                                    enumerable: true,\r\n                                    configurable: true\r\n                                });\r\n                            };\r\n                            Promise.all([this.overlayManager.open(this.overlayName), this._dataAvailableCapability.promise]).then(function () {\r\n                                if (_this.fieldData) {\r\n                                    _this._updateUI();\r\n                                    return;\r\n                                }\r\n                                _this.pdfDocument.getMetadata().then(function (_ref2) {\r\n                                    var info = _ref2.info,\r\n                                        metadata = _ref2.metadata;\r\n\r\n                                    return Promise.all([info, metadata, _this._parseFileSize(_this.maybeFileSize), _this._parseDate(info.CreationDate), _this._parseDate(info.ModDate)]);\r\n                                }).then(function (_ref3) {\r\n                                    var _ref4 = _slicedToArray(_ref3, 5),\r\n                                        info = _ref4[0],\r\n                                        metadata = _ref4[1],\r\n                                        fileSize = _ref4[2],\r\n                                        creationDate = _ref4[3],\r\n                                        modificationDate = _ref4[4];\r\n\r\n                                    freezeFieldData({\r\n                                        'fileName': (0, _ui_utils.getPDFFileNameFromURL)(_this.url),\r\n                                        'fileSize': fileSize,\r\n                                        'title': info.Title,\r\n                                        'author': info.Author,\r\n                                        'subject': info.Subject,\r\n                                        'keywords': info.Keywords,\r\n                                        'creationDate': creationDate,\r\n                                        'modificationDate': modificationDate,\r\n                                        'creator': info.Creator,\r\n                                        'producer': info.Producer,\r\n                                        'version': info.PDFFormatVersion,\r\n                                        'pageCount': _this.pdfDocument.numPages\r\n                                    });\r\n                                    _this._updateUI();\r\n                                    return _this.pdfDocument.getDownloadInfo();\r\n                                }).then(function (_ref5) {\r\n                                    var length = _ref5.length;\r\n\r\n                                    return _this._parseFileSize(length);\r\n                                }).then(function (fileSize) {\r\n                                    var data = (0, _ui_utils.cloneObj)(_this.fieldData);\r\n                                    data['fileSize'] = fileSize;\r\n                                    freezeFieldData(data);\r\n                                    _this._updateUI();\r\n                                });\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'close',\r\n                        value: function close() {\r\n                            this.overlayManager.close(this.overlayName);\r\n                        }\r\n                    }, {\r\n                        key: 'setDocument',\r\n                        value: function setDocument(pdfDocument, url) {\r\n                            if (this.pdfDocument) {\r\n                                this._reset();\r\n                                this._updateUI(true);\r\n                            }\r\n                            if (!pdfDocument) {\r\n                                return;\r\n                            }\r\n                            this.pdfDocument = pdfDocument;\r\n                            this.url = url;\r\n                            this._dataAvailableCapability.resolve();\r\n                        }\r\n                    }, {\r\n                        key: 'setFileSize',\r\n                        value: function setFileSize(fileSize) {\r\n                            if (typeof fileSize === 'number' && fileSize > 0) {\r\n                                this.maybeFileSize = fileSize;\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_reset',\r\n                        value: function _reset() {\r\n                            this.pdfDocument = null;\r\n                            this.url = null;\r\n                            this.maybeFileSize = 0;\r\n                            delete this.fieldData;\r\n                            this._dataAvailableCapability = (0, _pdfjsLib.createPromiseCapability)();\r\n                        }\r\n                    }, {\r\n                        key: '_updateUI',\r\n                        value: function _updateUI() {\r\n                            var reset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\r\n                            //console.log(DEFAULT_FIELD_CONTENT);\r\n                            if (reset || !this.fieldData) {\r\n                                for (var id in this.fields) {\r\n                                    if (this.fields[id] !== null) {\r\n                                        this.fields[id].textContent = DEFAULT_FIELD_CONTENT;\r\n                                    }\r\n                                }\r\n                                return;\r\n                            }\r\n                            if (this.overlayManager.active !== this.overlayName) {\r\n                                return;\r\n                            }\r\n                            for (var _id in this.fields) {\r\n                                var content = this.fieldData[_id];\r\n                                if (this.fields[_id] !== null) {\r\n                                    this.fields[_id].textContent = content || content === 0 ? content : DEFAULT_FIELD_CONTENT;\r\n                                }\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_parseFileSize',\r\n                        value: function _parseFileSize() {\r\n                            var fileSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\r\n\r\n                            var kb = fileSize / 1024;\r\n                            if (!kb) {\r\n                                return Promise.resolve(undefined);\r\n                            } else if (kb < 1024) {\r\n                                return this.l10n.get('document_properties_kb', {\r\n                                    size_kb: (+kb.toPrecision(3)).toLocaleString(),\r\n                                    size_b: fileSize.toLocaleString()\r\n                                }, '{{size_kb}} KB ({{size_b}} bytes)');\r\n                            }\r\n                            return this.l10n.get('document_properties_mb', {\r\n                                size_mb: (+(kb / 1024).toPrecision(3)).toLocaleString(),\r\n                                size_b: fileSize.toLocaleString()\r\n                            }, '{{size_mb}} MB ({{size_b}} bytes)');\r\n                        }\r\n                    }, {\r\n                        key: '_parseDate',\r\n                        value: function _parseDate(inputDate) {\r\n                            if (!inputDate) {\r\n                                return;\r\n                            }\r\n                            var dateToParse = inputDate;\r\n                            if (dateToParse.substring(0, 2) === 'D:') {\r\n                                dateToParse = dateToParse.substring(2);\r\n                            }\r\n                            var year = parseInt(dateToParse.substring(0, 4), 10);\r\n                            var month = parseInt(dateToParse.substring(4, 6), 10) - 1;\r\n                            var day = parseInt(dateToParse.substring(6, 8), 10);\r\n                            var hours = parseInt(dateToParse.substring(8, 10), 10);\r\n                            var minutes = parseInt(dateToParse.substring(10, 12), 10);\r\n                            var seconds = parseInt(dateToParse.substring(12, 14), 10);\r\n                            var utRel = dateToParse.substring(14, 15);\r\n                            var offsetHours = parseInt(dateToParse.substring(15, 17), 10);\r\n                            var offsetMinutes = parseInt(dateToParse.substring(18, 20), 10);\r\n                            if (utRel === '-') {\r\n                                hours += offsetHours;\r\n                                minutes += offsetMinutes;\r\n                            } else if (utRel === '+') {\r\n                                hours -= offsetHours;\r\n                                minutes -= offsetMinutes;\r\n                            }\r\n                            var date = new Date(Date.UTC(year, month, day, hours, minutes, seconds));\r\n                            var dateString = date.toLocaleDateString();\r\n                            var timeString = date.toLocaleTimeString();\r\n                            return this.l10n.get('document_properties_date_string', {\r\n                                date: dateString,\r\n                                time: timeString\r\n                            }, '{{date}}, {{time}}');\r\n                        }\r\n                    }]);\r\n\r\n                    return PDFDocumentProperties;\r\n                }();\r\n\r\n                exports.PDFDocumentProperties = PDFDocumentProperties;\r\n\r\n                /***/\r\n            }),\r\n        /* 19 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.PDFFindBar = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _pdf_find_controller = __webpack_require__(7);\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var PDFFindBar = function () {\r\n                    function PDFFindBar(options) {\r\n                        var _this = this;\r\n\r\n                        var l10n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _ui_utils.NullL10n;\r\n\r\n                        _classCallCheck(this, PDFFindBar);\r\n\r\n                        this.opened = false;\r\n                        this.bar = options.bar || null;\r\n                        this.toggleButton = options.toggleButton || null;\r\n                        this.findField = options.findField || null;\r\n                        this.highlightAll = options.highlightAllCheckbox || null;\r\n                        this.caseSensitive = options.caseSensitiveCheckbox || null;\r\n                        this.findMsg = options.findMsg || null;\r\n                        this.findResultsCount = options.findResultsCount || null;\r\n                        this.findStatusIcon = options.findStatusIcon || null;\r\n                        this.findPreviousButton = options.findPreviousButton || null;\r\n                        this.findNextButton = options.findNextButton || null;\r\n                        this.findController = options.findController || null;\r\n                        this.eventBus = options.eventBus;\r\n                        this.l10n = l10n;\r\n                        if (this.findController === null) {\r\n                            throw new Error('PDFFindBar cannot be used without a ' + 'PDFFindController instance.');\r\n                        }\r\n                        this.toggleButton.addEventListener('click', function () {\r\n                            _this.toggle();\r\n                        });\r\n                        this.findField.addEventListener('input', function () {\r\n                            _this.dispatchEvent('');\r\n                        });\r\n                        this.bar.addEventListener('keydown', function (e) {\r\n                            switch (e.keyCode) {\r\n                                case 13:\r\n                                    if (e.target === _this.findField) {\r\n                                        _this.dispatchEvent('again', e.shiftKey);\r\n                                    }\r\n                                    break;\r\n                                case 27:\r\n                                    _this.close();\r\n                                    break;\r\n                            }\r\n                        });\r\n                        this.findPreviousButton.addEventListener('click', function () {\r\n                            _this.dispatchEvent('again', true);\r\n                        });\r\n                        this.findNextButton.addEventListener('click', function () {\r\n                            _this.dispatchEvent('again', false);\r\n                        });\r\n                        this.highlightAll.addEventListener('click', function () {\r\n                            _this.dispatchEvent('highlightallchange');\r\n                        });\r\n                        this.caseSensitive.addEventListener('click', function () {\r\n                            _this.dispatchEvent('casesensitivitychange');\r\n                        });\r\n                        this.eventBus.on('resize', this._adjustWidth.bind(this));\r\n                    }\r\n\r\n                    _createClass(PDFFindBar, [{\r\n                        key: 'reset',\r\n                        value: function reset() {\r\n                            this.updateUIState();\r\n                        }\r\n                    }, {\r\n                        key: 'dispatchEvent',\r\n                        value: function dispatchEvent(type, findPrev) {\r\n                            this.eventBus.dispatch('find', {\r\n                                source: this,\r\n                                type: type,\r\n                                query: this.findField.value,\r\n                                caseSensitive: this.caseSensitive.checked,\r\n                                phraseSearch: true,\r\n                                highlightAll: this.highlightAll.checked,\r\n                                findPrevious: findPrev\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'updateUIState',\r\n                        value: function updateUIState(state, previous, matchCount) {\r\n                            var _this2 = this;\r\n\r\n                            var notFound = false;\r\n                            var findMsg = '';\r\n                            var status = '';\r\n                            switch (state) {\r\n                                case _pdf_find_controller.FindState.FOUND:\r\n                                    break;\r\n                                case _pdf_find_controller.FindState.PENDING:\r\n                                    status = 'pending';\r\n                                    break;\r\n                                case _pdf_find_controller.FindState.NOT_FOUND:\r\n                                    findMsg = this.l10n.get('find_not_found', null, 'Phrase not found');\r\n                                    notFound = true;\r\n                                    break;\r\n                                case _pdf_find_controller.FindState.WRAPPED:\r\n                                    if (previous) {\r\n                                        findMsg = this.l10n.get('find_reached_top', null, 'Reached top of document, continued from bottom');\r\n                                    } else {\r\n                                        findMsg = this.l10n.get('find_reached_bottom', null, 'Reached end of document, continued from top');\r\n                                    }\r\n                                    break;\r\n                            }\r\n                            if (notFound) {\r\n                                this.findField.classList.add('notFound');\r\n                            } else {\r\n                                this.findField.classList.remove('notFound');\r\n                            }\r\n                            this.findField.setAttribute('data-status', status);\r\n                            Promise.resolve(findMsg).then(function (msg) {\r\n                                _this2.findMsg.textContent = msg;\r\n                                _this2._adjustWidth();\r\n                            });\r\n                            this.updateResultsCount(matchCount);\r\n                        }\r\n                    }, {\r\n                        key: 'updateResultsCount',\r\n                        value: function updateResultsCount(matchCount) {\r\n                            if (!this.findResultsCount) {\r\n                                return;\r\n                            }\r\n                            if (!matchCount) {\r\n                                this.findResultsCount.classList.add('hidden');\r\n                                this.findResultsCount.textContent = '';\r\n                            } else {\r\n                                this.findResultsCount.textContent = matchCount.toLocaleString();\r\n                                this.findResultsCount.classList.remove('hidden');\r\n                            }\r\n                            this._adjustWidth();\r\n                        }\r\n                    }, {\r\n                        key: 'open',\r\n                        value: function open() {\r\n                            if (!this.opened) {\r\n                                this.opened = true;\r\n                                this.toggleButton.classList.add('toggled');\r\n                                this.bar.classList.remove('hidden');\r\n                            }\r\n                            this.findField.select();\r\n                            this.findField.focus();\r\n                            this._adjustWidth();\r\n                        }\r\n                    }, {\r\n                        key: 'close',\r\n                        value: function close() {\r\n                            if (!this.opened) {\r\n                                return;\r\n                            }\r\n                            this.opened = false;\r\n                            this.toggleButton.classList.remove('toggled');\r\n                            this.bar.classList.add('hidden');\r\n                            this.findController.active = false;\r\n                        }\r\n                    }, {\r\n                        key: 'toggle',\r\n                        value: function toggle() {\r\n                            if (this.opened) {\r\n                                this.close();\r\n                            } else {\r\n                                this.open();\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_adjustWidth',\r\n                        value: function _adjustWidth() {\r\n                            if (!this.opened) {\r\n                                return;\r\n                            }\r\n                            this.bar.classList.remove('wrapContainers');\r\n                            var findbarHeight = this.bar.clientHeight;\r\n                            var inputContainerHeight = this.bar.firstElementChild.clientHeight;\r\n                            if (findbarHeight > inputContainerHeight) {\r\n                                this.bar.classList.add('wrapContainers');\r\n                            }\r\n                        }\r\n                    }]);\r\n\r\n                    return PDFFindBar;\r\n                }();\r\n\r\n                exports.PDFFindBar = PDFFindBar;\r\n\r\n                /***/\r\n            }),\r\n        /* 20 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.PDFHistory = undefined;\r\n\r\n                var _dom_events = __webpack_require__(2);\r\n\r\n                function PDFHistory(options) {\r\n                    this.linkService = options.linkService;\r\n                    this.eventBus = options.eventBus || (0, _dom_events.getGlobalEventBus)();\r\n                    this.initialized = false;\r\n                    this.initialDestination = null;\r\n                    this.initialBookmark = null;\r\n                }\r\n                PDFHistory.prototype = {\r\n                    initialize: function pdfHistoryInitialize(fingerprint) {\r\n                        this.initialized = true;\r\n                        this.reInitialized = false;\r\n                        this.allowHashChange = true;\r\n                        this.historyUnlocked = true;\r\n                        this.isViewerInPresentationMode = false;\r\n                        this.previousHash = window.location.hash.substring(1);\r\n                        this.currentBookmark = '';\r\n                        this.currentPage = 0;\r\n                        this.updatePreviousBookmark = false;\r\n                        this.previousBookmark = '';\r\n                        this.previousPage = 0;\r\n                        this.nextHashParam = '';\r\n                        this.fingerprint = fingerprint;\r\n                        this.currentUid = this.uid = 0;\r\n                        this.current = {};\r\n                        var state = window.history.state;\r\n                        if (this._isStateObjectDefined(state)) {\r\n                            if (state.target.dest) {\r\n                                this.initialDestination = state.target.dest;\r\n                            } else {\r\n                                this.initialBookmark = state.target.hash;\r\n                            }\r\n                            this.currentUid = state.uid;\r\n                            this.uid = state.uid + 1;\r\n                            this.current = state.target;\r\n                        } else {\r\n                            if (state && state.fingerprint && this.fingerprint !== state.fingerprint) {\r\n                                this.reInitialized = true;\r\n                            }\r\n                            this._pushOrReplaceState({ fingerprint: this.fingerprint }, true);\r\n                        }\r\n                        var self = this;\r\n                        window.addEventListener('popstate', function pdfHistoryPopstate(evt) {\r\n                            if (!self.historyUnlocked) {\r\n                                return;\r\n                            }\r\n                            if (evt.state) {\r\n                                self._goTo(evt.state);\r\n                                return;\r\n                            }\r\n                            if (self.uid === 0) {\r\n                                var previousParams = self.previousHash && self.currentBookmark && self.previousHash !== self.currentBookmark ? {\r\n                                    hash: self.currentBookmark,\r\n                                    page: self.currentPage\r\n                                } : { page: 1 };\r\n                                replacePreviousHistoryState(previousParams, function () {\r\n                                    updateHistoryWithCurrentHash();\r\n                                });\r\n                            } else {\r\n                                updateHistoryWithCurrentHash();\r\n                            }\r\n                        });\r\n                        function updateHistoryWithCurrentHash() {\r\n                            self.previousHash = window.location.hash.slice(1);\r\n                            self._pushToHistory({ hash: self.previousHash }, false, true);\r\n                            self._updatePreviousBookmark();\r\n                        }\r\n                        function replacePreviousHistoryState(params, callback) {\r\n                            self.historyUnlocked = false;\r\n                            self.allowHashChange = false;\r\n                            window.addEventListener('popstate', rewriteHistoryAfterBack);\r\n                            history.back();\r\n                            function rewriteHistoryAfterBack() {\r\n                                window.removeEventListener('popstate', rewriteHistoryAfterBack);\r\n                                window.addEventListener('popstate', rewriteHistoryAfterForward);\r\n                                self._pushToHistory(params, false, true);\r\n                                history.forward();\r\n                            }\r\n                            function rewriteHistoryAfterForward() {\r\n                                window.removeEventListener('popstate', rewriteHistoryAfterForward);\r\n                                self.allowHashChange = true;\r\n                                self.historyUnlocked = true;\r\n                                callback();\r\n                            }\r\n                        }\r\n                        function pdfHistoryBeforeUnload() {\r\n                            var previousParams = self._getPreviousParams(null, true);\r\n                            if (previousParams) {\r\n                                var replacePrevious = !self.current.dest && self.current.hash !== self.previousHash;\r\n                                self._pushToHistory(previousParams, false, replacePrevious);\r\n                                self._updatePreviousBookmark();\r\n                            }\r\n                            window.removeEventListener('beforeunload', pdfHistoryBeforeUnload);\r\n                        }\r\n                        window.addEventListener('beforeunload', pdfHistoryBeforeUnload);\r\n                        window.addEventListener('pageshow', function pdfHistoryPageShow(evt) {\r\n                            window.addEventListener('beforeunload', pdfHistoryBeforeUnload);\r\n                        });\r\n                        self.eventBus.on('presentationmodechanged', function (e) {\r\n                            self.isViewerInPresentationMode = e.active;\r\n                        });\r\n                    },\r\n                    clearHistoryState: function pdfHistory_clearHistoryState() {\r\n                        this._pushOrReplaceState(null, true);\r\n                    },\r\n                    _isStateObjectDefined: function pdfHistory_isStateObjectDefined(state) {\r\n                        return state && state.uid >= 0 && state.fingerprint && this.fingerprint === state.fingerprint && state.target && state.target.hash ? true : false;\r\n                    },\r\n                    _pushOrReplaceState: function pdfHistory_pushOrReplaceState(stateObj, replace) {\r\n                        if (replace) {\r\n                            window.history.replaceState(stateObj, '', document.URL);\r\n                        } else {\r\n                            window.history.pushState(stateObj, '', document.URL);\r\n                        }\r\n                    },\r\n                    get isHashChangeUnlocked() {\r\n                        if (!this.initialized) {\r\n                            return true;\r\n                        }\r\n                        return this.allowHashChange;\r\n                    },\r\n                    _updatePreviousBookmark: function pdfHistory_updatePreviousBookmark() {\r\n                        if (this.updatePreviousBookmark && this.currentBookmark && this.currentPage) {\r\n                            this.previousBookmark = this.currentBookmark;\r\n                            this.previousPage = this.currentPage;\r\n                            this.updatePreviousBookmark = false;\r\n                        }\r\n                    },\r\n                    updateCurrentBookmark: function pdfHistoryUpdateCurrentBookmark(bookmark, pageNum) {\r\n                        if (this.initialized) {\r\n                            this.currentBookmark = bookmark.substring(1);\r\n                            this.currentPage = pageNum | 0;\r\n                            this._updatePreviousBookmark();\r\n                        }\r\n                    },\r\n                    updateNextHashParam: function pdfHistoryUpdateNextHashParam(param) {\r\n                        if (this.initialized) {\r\n                            this.nextHashParam = param;\r\n                        }\r\n                    },\r\n                    push: function pdfHistoryPush(params, isInitialBookmark) {\r\n                        if (!(this.initialized && this.historyUnlocked)) {\r\n                            return;\r\n                        }\r\n                        if (params.dest && !params.hash) {\r\n                            params.hash = this.current.hash && this.current.dest && this.current.dest === params.dest ? this.current.hash : this.linkService.getDestinationHash(params.dest).split('#')[1];\r\n                        }\r\n                        if (params.page) {\r\n                            params.page |= 0;\r\n                        }\r\n                        if (isInitialBookmark) {\r\n                            var target = window.history.state.target;\r\n                            if (!target) {\r\n                                this._pushToHistory(params, false);\r\n                                this.previousHash = window.location.hash.substring(1);\r\n                            }\r\n                            this.updatePreviousBookmark = this.nextHashParam ? false : true;\r\n                            if (target) {\r\n                                this._updatePreviousBookmark();\r\n                            }\r\n                            return;\r\n                        }\r\n                        if (this.nextHashParam) {\r\n                            if (this.nextHashParam === params.hash) {\r\n                                this.nextHashParam = null;\r\n                                this.updatePreviousBookmark = true;\r\n                                return;\r\n                            }\r\n                            this.nextHashParam = null;\r\n                        }\r\n                        if (params.hash) {\r\n                            if (this.current.hash) {\r\n                                if (this.current.hash !== params.hash) {\r\n                                    this._pushToHistory(params, true);\r\n                                } else {\r\n                                    if (!this.current.page && params.page) {\r\n                                        this._pushToHistory(params, false, true);\r\n                                    }\r\n                                    this.updatePreviousBookmark = true;\r\n                                }\r\n                            } else {\r\n                                this._pushToHistory(params, true);\r\n                            }\r\n                        } else if (this.current.page && params.page && this.current.page !== params.page) {\r\n                            this._pushToHistory(params, true);\r\n                        }\r\n                    },\r\n                    _getPreviousParams: function pdfHistory_getPreviousParams(onlyCheckPage, beforeUnload) {\r\n                        if (!(this.currentBookmark && this.currentPage)) {\r\n                            return null;\r\n                        } else if (this.updatePreviousBookmark) {\r\n                            this.updatePreviousBookmark = false;\r\n                        }\r\n                        if (this.uid > 0 && !(this.previousBookmark && this.previousPage)) {\r\n                            return null;\r\n                        }\r\n                        if (!this.current.dest && !onlyCheckPage || beforeUnload) {\r\n                            if (this.previousBookmark === this.currentBookmark) {\r\n                                return null;\r\n                            }\r\n                        } else if (this.current.page || onlyCheckPage) {\r\n                            if (this.previousPage === this.currentPage) {\r\n                                return null;\r\n                            }\r\n                        } else {\r\n                            return null;\r\n                        }\r\n                        var params = {\r\n                            hash: this.currentBookmark,\r\n                            page: this.currentPage\r\n                        };\r\n                        if (this.isViewerInPresentationMode) {\r\n                            params.hash = null;\r\n                        }\r\n                        return params;\r\n                    },\r\n                    _stateObj: function pdfHistory_stateObj(params) {\r\n                        return {\r\n                            fingerprint: this.fingerprint,\r\n                            uid: this.uid,\r\n                            target: params\r\n                        };\r\n                    },\r\n                    _pushToHistory: function pdfHistory_pushToHistory(params, addPrevious, overwrite) {\r\n                        if (!this.initialized) {\r\n                            return;\r\n                        }\r\n                        if (!params.hash && params.page) {\r\n                            params.hash = 'page=' + params.page;\r\n                        }\r\n                        if (addPrevious && !overwrite) {\r\n                            var previousParams = this._getPreviousParams();\r\n                            if (previousParams) {\r\n                                var replacePrevious = !this.current.dest && this.current.hash !== this.previousHash;\r\n                                this._pushToHistory(previousParams, false, replacePrevious);\r\n                            }\r\n                        }\r\n                        this._pushOrReplaceState(this._stateObj(params), overwrite || this.uid === 0);\r\n                        this.currentUid = this.uid++;\r\n                        this.current = params;\r\n                        this.updatePreviousBookmark = true;\r\n                    },\r\n                    _goTo: function pdfHistory_goTo(state) {\r\n                        if (!(this.initialized && this.historyUnlocked && this._isStateObjectDefined(state))) {\r\n                            return;\r\n                        }\r\n                        if (!this.reInitialized && state.uid < this.currentUid) {\r\n                            var previousParams = this._getPreviousParams(true);\r\n                            if (previousParams) {\r\n                                this._pushToHistory(this.current, false);\r\n                                this._pushToHistory(previousParams, false);\r\n                                this.currentUid = state.uid;\r\n                                window.history.back();\r\n                                return;\r\n                            }\r\n                        }\r\n                        this.historyUnlocked = false;\r\n                        if (state.target.dest) {\r\n                            this.linkService.navigateTo(state.target.dest);\r\n                        } else {\r\n                            this.linkService.setHash(state.target.hash);\r\n                        }\r\n                        this.currentUid = state.uid;\r\n                        if (state.uid > this.uid) {\r\n                            this.uid = state.uid;\r\n                        }\r\n                        this.current = state.target;\r\n                        this.updatePreviousBookmark = true;\r\n                        var currentHash = window.location.hash.substring(1);\r\n                        if (this.previousHash !== currentHash) {\r\n                            this.allowHashChange = false;\r\n                        }\r\n                        this.previousHash = currentHash;\r\n                        this.historyUnlocked = true;\r\n                    },\r\n                    back: function pdfHistoryBack() {\r\n                        this.go(-1);\r\n                    },\r\n                    forward: function pdfHistoryForward() {\r\n                        this.go(1);\r\n                    },\r\n                    go: function pdfHistoryGo(direction) {\r\n                        if (this.initialized && this.historyUnlocked) {\r\n                            var state = window.history.state;\r\n                            if (direction === -1 && state && state.uid > 0) {\r\n                                window.history.back();\r\n                            } else if (direction === 1 && state && state.uid < this.uid - 1) {\r\n                                window.history.forward();\r\n                            }\r\n                        }\r\n                    }\r\n                };\r\n                exports.PDFHistory = PDFHistory;\r\n\r\n                /***/\r\n            }),\r\n        /* 21 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.PDFOutlineViewer = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _pdfjsLib = __webpack_require__(1);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var DEFAULT_TITLE = '\\u2013';\r\n\r\n                var PDFOutlineViewer = function () {\r\n                    function PDFOutlineViewer(_ref) {\r\n                        var container = _ref.container,\r\n                            linkService = _ref.linkService,\r\n                            eventBus = _ref.eventBus;\r\n\r\n                        _classCallCheck(this, PDFOutlineViewer);\r\n\r\n                        this.outline = null;\r\n                        this.lastToggleIsShow = true;\r\n                        this.container = container;\r\n                        this.linkService = linkService;\r\n                        this.eventBus = eventBus;\r\n                    }\r\n\r\n                    _createClass(PDFOutlineViewer, [{\r\n                        key: 'reset',\r\n                        value: function reset() {\r\n                            this.outline = null;\r\n                            this.lastToggleIsShow = true;\r\n                            this.container.textContent = '';\r\n                            this.container.classList.remove('outlineWithDeepNesting');\r\n                        }\r\n                    }, {\r\n                        key: '_dispatchEvent',\r\n                        value: function _dispatchEvent(outlineCount) {\r\n                            this.eventBus.dispatch('outlineloaded', {\r\n                                source: this,\r\n                                outlineCount: outlineCount\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: '_bindLink',\r\n                        value: function _bindLink(element, item) {\r\n                            var _this = this;\r\n\r\n                            if (item.url) {\r\n                                (0, _pdfjsLib.addLinkAttributes)(element, {\r\n                                    url: item.url,\r\n                                    target: item.newWindow ? _pdfjsLib.PDFJS.LinkTarget.BLANK : undefined\r\n                                });\r\n                                return;\r\n                            }\r\n                            var destination = item.dest;\r\n                            element.href = this.linkService.getDestinationHash(destination);\r\n                            element.onclick = function () {\r\n                                if (destination) {\r\n                                    _this.linkService.navigateTo(destination);\r\n                                }\r\n                                return false;\r\n                            };\r\n                        }\r\n                    }, {\r\n                        key: '_setStyles',\r\n                        value: function _setStyles(element, item) {\r\n                            var styleStr = '';\r\n                            if (item.bold) {\r\n                                styleStr += 'font-weight: bold;';\r\n                            }\r\n                            if (item.italic) {\r\n                                styleStr += 'font-style: italic;';\r\n                            }\r\n                            if (styleStr) {\r\n                                element.setAttribute('style', styleStr);\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_addToggleButton',\r\n                        value: function _addToggleButton(div) {\r\n                            var _this2 = this;\r\n\r\n                            var toggler = document.createElement('div');\r\n                            toggler.className = 'outlineItemToggler';\r\n                            toggler.onclick = function (evt) {\r\n                                evt.stopPropagation();\r\n                                toggler.classList.toggle('outlineItemsHidden');\r\n                                if (evt.shiftKey) {\r\n                                    var shouldShowAll = !toggler.classList.contains('outlineItemsHidden');\r\n                                    _this2._toggleOutlineItem(div, shouldShowAll);\r\n                                }\r\n                            };\r\n                            div.insertBefore(toggler, div.firstChild);\r\n                        }\r\n                    }, {\r\n                        key: '_toggleOutlineItem',\r\n                        value: function _toggleOutlineItem(root, show) {\r\n                            this.lastToggleIsShow = show;\r\n                            var togglers = root.querySelectorAll('.outlineItemToggler');\r\n                            for (var i = 0, ii = togglers.length; i < ii; ++i) {\r\n                                togglers[i].classList[show ? 'remove' : 'add']('outlineItemsHidden');\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'toggleOutlineTree',\r\n                        value: function toggleOutlineTree() {\r\n                            if (!this.outline) {\r\n                                return;\r\n                            }\r\n                            this._toggleOutlineItem(this.container, !this.lastToggleIsShow);\r\n                        }\r\n                    }, {\r\n                        key: 'render',\r\n                        value: function render(_ref2) {\r\n                            var outline = _ref2.outline;\r\n\r\n                            var outlineCount = 0;\r\n                            if (this.outline) {\r\n                                this.reset();\r\n                            }\r\n                            this.outline = outline || null;\r\n                            if (!outline) {\r\n                                this._dispatchEvent(outlineCount);\r\n                                return;\r\n                            }\r\n                            var fragment = document.createDocumentFragment();\r\n                            var queue = [{\r\n                                parent: fragment,\r\n                                items: this.outline\r\n                            }];\r\n                            var hasAnyNesting = false;\r\n                            while (queue.length > 0) {\r\n                                var levelData = queue.shift();\r\n                                for (var i = 0, len = levelData.items.length; i < len; i++) {\r\n                                    var item = levelData.items[i];\r\n                                    var div = document.createElement('div');\r\n                                    div.className = 'outlineItem';\r\n                                    var element = document.createElement('a');\r\n                                    this._bindLink(element, item);\r\n                                    this._setStyles(element, item);\r\n                                    element.textContent = (0, _pdfjsLib.removeNullCharacters)(item.title) || DEFAULT_TITLE;\r\n                                    div.appendChild(element);\r\n                                    if (item.items.length > 0) {\r\n                                        hasAnyNesting = true;\r\n                                        this._addToggleButton(div);\r\n                                        var itemsDiv = document.createElement('div');\r\n                                        itemsDiv.className = 'outlineItems';\r\n                                        div.appendChild(itemsDiv);\r\n                                        queue.push({\r\n                                            parent: itemsDiv,\r\n                                            items: item.items\r\n                                        });\r\n                                    }\r\n                                    levelData.parent.appendChild(div);\r\n                                    outlineCount++;\r\n                                }\r\n                            }\r\n                            if (hasAnyNesting) {\r\n                                this.container.classList.add('outlineWithDeepNesting');\r\n                            }\r\n                            this.container.appendChild(fragment);\r\n                            this._dispatchEvent(outlineCount);\r\n                        }\r\n                    }]);\r\n\r\n                    return PDFOutlineViewer;\r\n                }();\r\n\r\n                exports.PDFOutlineViewer = PDFOutlineViewer;\r\n\r\n                /***/\r\n            }),\r\n        /* 22 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.PDFPageView = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                var _pdfjsLib = __webpack_require__(1);\r\n\r\n                var _dom_events = __webpack_require__(2);\r\n\r\n                var _pdf_rendering_queue = __webpack_require__(3);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var PDFPageView = function () {\r\n                    function PDFPageView(options) {\r\n                        _classCallCheck(this, PDFPageView);\r\n\r\n                        var container = options.container;\r\n                        var defaultViewport = options.defaultViewport;\r\n                        this.id = options.id;\r\n                        this.renderingId = 'page' + this.id;\r\n                        this.pdfPage = null;\r\n                        this.pageLabel = null;\r\n                        this.rotation = 0;\r\n                        this.scale = options.scale || _ui_utils.DEFAULT_SCALE;\r\n                        this.viewport = defaultViewport;\r\n                        this.pdfPageRotate = defaultViewport.rotation;\r\n                        this.hasRestrictedScaling = false;\r\n                        this.enhanceTextSelection = options.enhanceTextSelection || false;\r\n                        this.renderInteractiveForms = options.renderInteractiveForms || false;\r\n                        this.eventBus = options.eventBus || (0, _dom_events.getGlobalEventBus)();\r\n                        this.renderingQueue = options.renderingQueue;\r\n                        this.textLayerFactory = options.textLayerFactory;\r\n                        this.annotationLayerFactory = options.annotationLayerFactory;\r\n                        this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;\r\n                        this.l10n = options.l10n || _ui_utils.NullL10n;\r\n                        this.paintTask = null;\r\n                        this.paintedViewportMap = new WeakMap();\r\n                        this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\r\n                        this.resume = null;\r\n                        this.error = null;\r\n                        this.onBeforeDraw = null;\r\n                        this.onAfterDraw = null;\r\n                        this.annotationLayer = null;\r\n                        this.textLayer = null;\r\n                        this.zoomLayer = null;\r\n                        var div = document.createElement('div');\r\n                        div.className = 'page';\r\n                        div.style.width = Math.floor(this.viewport.width) + 'px';\r\n                        div.style.height = Math.floor(this.viewport.height) + 'px';\r\n                        div.setAttribute('data-page-number', this.id);\r\n                        this.div = div;\r\n                        container.appendChild(div);\r\n                    }\r\n\r\n                    _createClass(PDFPageView, [{\r\n                        key: 'setPdfPage',\r\n                        value: function setPdfPage(pdfPage) {\r\n                            this.pdfPage = pdfPage;\r\n                            this.pdfPageRotate = pdfPage.rotate;\r\n                            var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\r\n                            this.viewport = pdfPage.getViewport(this.scale * _ui_utils.CSS_UNITS, totalRotation);\r\n                            this.stats = pdfPage.stats;\r\n                            this.reset();\r\n                        }\r\n                    }, {\r\n                        key: 'destroy',\r\n                        value: function destroy() {\r\n                            this.reset();\r\n                            if (this.pdfPage) {\r\n                                this.pdfPage.cleanup();\r\n                                this.pdfPage = null;\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_resetZoomLayer',\r\n                        value: function _resetZoomLayer() {\r\n                            var removeFromDOM = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\r\n\r\n                            if (!this.zoomLayer) {\r\n                                return;\r\n                            }\r\n                            var zoomLayerCanvas = this.zoomLayer.firstChild;\r\n                            this.paintedViewportMap.delete(zoomLayerCanvas);\r\n                            zoomLayerCanvas.width = 0;\r\n                            zoomLayerCanvas.height = 0;\r\n                            if (removeFromDOM) {\r\n                                this.zoomLayer.remove();\r\n                            }\r\n                            this.zoomLayer = null;\r\n                        }\r\n                    }, {\r\n                        key: 'reset',\r\n                        value: function reset() {\r\n                            var keepZoomLayer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\r\n                            var keepAnnotations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\r\n\r\n                            this.cancelRendering();\r\n                            var div = this.div;\r\n                            div.style.width = Math.floor(this.viewport.width) + 'px';\r\n                            div.style.height = Math.floor(this.viewport.height) + 'px';\r\n                            var childNodes = div.childNodes;\r\n                            var currentZoomLayerNode = keepZoomLayer && this.zoomLayer || null;\r\n                            var currentAnnotationNode = keepAnnotations && this.annotationLayer && this.annotationLayer.div || null;\r\n                            for (var i = childNodes.length - 1; i >= 0; i--) {\r\n                                var node = childNodes[i];\r\n                                if (currentZoomLayerNode === node || currentAnnotationNode === node) {\r\n                                    continue;\r\n                                }\r\n                                div.removeChild(node);\r\n                            }\r\n                            div.removeAttribute('data-loaded');\r\n                            if (currentAnnotationNode) {\r\n                                this.annotationLayer.hide();\r\n                            } else {\r\n                                this.annotationLayer = null;\r\n                            }\r\n                            if (!currentZoomLayerNode) {\r\n                                if (this.canvas) {\r\n                                    this.paintedViewportMap.delete(this.canvas);\r\n                                    this.canvas.width = 0;\r\n                                    this.canvas.height = 0;\r\n                                    delete this.canvas;\r\n                                }\r\n                                this._resetZoomLayer();\r\n                            }\r\n                            if (this.svg) {\r\n                                this.paintedViewportMap.delete(this.svg);\r\n                                delete this.svg;\r\n                            }\r\n                            this.loadingIconDiv = document.createElement('div');\r\n                            this.loadingIconDiv.className = 'loadingIcon';\r\n                            div.appendChild(this.loadingIconDiv);\r\n                        }\r\n                    }, {\r\n                        key: 'update',\r\n                        value: function update(scale, rotation) {\r\n                            this.scale = scale || this.scale;\r\n                            if (typeof rotation !== 'undefined') {\r\n                                this.rotation = rotation;\r\n                            }\r\n                            var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\r\n                            this.viewport = this.viewport.clone({\r\n                                scale: this.scale * _ui_utils.CSS_UNITS,\r\n                                rotation: totalRotation\r\n                            });\r\n                            if (this.svg) {\r\n                                this.cssTransform(this.svg, true);\r\n                                this.eventBus.dispatch('pagerendered', {\r\n                                    source: this,\r\n                                    pageNumber: this.id,\r\n                                    cssTransform: true\r\n                                });\r\n                                return;\r\n                            }\r\n                            var isScalingRestricted = false;\r\n                            if (this.canvas && _pdfjsLib.PDFJS.maxCanvasPixels > 0) {\r\n                                var outputScale = this.outputScale;\r\n                                if ((Math.floor(this.viewport.width) * outputScale.sx | 0) * (Math.floor(this.viewport.height) * outputScale.sy | 0) > _pdfjsLib.PDFJS.maxCanvasPixels) {\r\n                                    isScalingRestricted = true;\r\n                                }\r\n                            }\r\n                            if (this.canvas) {\r\n                                if (_pdfjsLib.PDFJS.useOnlyCssZoom || this.hasRestrictedScaling && isScalingRestricted) {\r\n                                    this.cssTransform(this.canvas, true);\r\n                                    this.eventBus.dispatch('pagerendered', {\r\n                                        source: this,\r\n                                        pageNumber: this.id,\r\n                                        cssTransform: true\r\n                                    });\r\n                                    return;\r\n                                }\r\n                                if (!this.zoomLayer && !this.canvas.hasAttribute('hidden')) {\r\n                                    this.zoomLayer = this.canvas.parentNode;\r\n                                    this.zoomLayer.style.position = 'absolute';\r\n                                }\r\n                            }\r\n                            if (this.zoomLayer) {\r\n                                this.cssTransform(this.zoomLayer.firstChild);\r\n                            }\r\n                            this.reset(true, true);\r\n                        }\r\n                    }, {\r\n                        key: 'cancelRendering',\r\n                        value: function cancelRendering() {\r\n                            if (this.paintTask) {\r\n                                this.paintTask.cancel();\r\n                                this.paintTask = null;\r\n                            }\r\n                            this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\r\n                            this.resume = null;\r\n                            if (this.textLayer) {\r\n                                this.textLayer.cancel();\r\n                                this.textLayer = null;\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'cssTransform',\r\n                        value: function cssTransform(target) {\r\n                            var redrawAnnotations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\r\n\r\n                            var width = this.viewport.width;\r\n                            var height = this.viewport.height;\r\n                            var div = this.div;\r\n                            target.style.width = target.parentNode.style.width = div.style.width = Math.floor(width) + 'px';\r\n                            target.style.height = target.parentNode.style.height = div.style.height = Math.floor(height) + 'px';\r\n                            var relativeRotation = this.viewport.rotation - this.paintedViewportMap.get(target).rotation;\r\n                            var absRotation = Math.abs(relativeRotation);\r\n                            var scaleX = 1,\r\n                                scaleY = 1;\r\n                            if (absRotation === 90 || absRotation === 270) {\r\n                                scaleX = height / width;\r\n                                scaleY = width / height;\r\n                            }\r\n                            var cssTransform = 'rotate(' + relativeRotation + 'deg) ' + 'scale(' + scaleX + ',' + scaleY + ')';\r\n                            _pdfjsLib.CustomStyle.setProp('transform', target, cssTransform);\r\n                            if (this.textLayer) {\r\n                                var textLayerViewport = this.textLayer.viewport;\r\n                                var textRelativeRotation = this.viewport.rotation - textLayerViewport.rotation;\r\n                                var textAbsRotation = Math.abs(textRelativeRotation);\r\n                                var scale = width / textLayerViewport.width;\r\n                                if (textAbsRotation === 90 || textAbsRotation === 270) {\r\n                                    scale = width / textLayerViewport.height;\r\n                                }\r\n                                var textLayerDiv = this.textLayer.textLayerDiv;\r\n                                var transX = void 0,\r\n                                    transY = void 0;\r\n                                switch (textAbsRotation) {\r\n                                    case 0:\r\n                                        transX = transY = 0;\r\n                                        break;\r\n                                    case 90:\r\n                                        transX = 0;\r\n                                        transY = '-' + textLayerDiv.style.height;\r\n                                        break;\r\n                                    case 180:\r\n                                        transX = '-' + textLayerDiv.style.width;\r\n                                        transY = '-' + textLayerDiv.style.height;\r\n                                        break;\r\n                                    case 270:\r\n                                        transX = '-' + textLayerDiv.style.width;\r\n                                        transY = 0;\r\n                                        break;\r\n                                    default:\r\n                                        console.error('Bad rotation value.');\r\n                                        break;\r\n                                }\r\n                                _pdfjsLib.CustomStyle.setProp('transform', textLayerDiv, 'rotate(' + textAbsRotation + 'deg) ' + 'scale(' + scale + ', ' + scale + ') ' + 'translate(' + transX + ', ' + transY + ')');\r\n                                _pdfjsLib.CustomStyle.setProp('transformOrigin', textLayerDiv, '0% 0%');\r\n                            }\r\n                            if (redrawAnnotations && this.annotationLayer) {\r\n                                this.annotationLayer.render(this.viewport, 'display');\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'getPagePoint',\r\n                        value: function getPagePoint(x, y) {\r\n                            return this.viewport.convertToPdfPoint(x, y);\r\n                        }\r\n                    }, {\r\n                        key: 'draw',\r\n                        value: function draw() {\r\n                            var _this = this;\r\n\r\n                            if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {\r\n                                console.error('Must be in new state before drawing');\r\n                                this.reset();\r\n                            }\r\n                            if (!this.pdfPage) {\r\n                                this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\r\n                                return Promise.reject(new Error('Page is not loaded'));\r\n                            }\r\n                            this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\r\n                            var pdfPage = this.pdfPage;\r\n                            var div = this.div;\r\n                            var canvasWrapper = document.createElement('div');\r\n                            canvasWrapper.style.width = div.style.width;\r\n                            canvasWrapper.style.height = div.style.height;\r\n                            canvasWrapper.classList.add('canvasWrapper');\r\n                            if (this.annotationLayer && this.annotationLayer.div) {\r\n                                div.insertBefore(canvasWrapper, this.annotationLayer.div);\r\n                            } else {\r\n                                div.appendChild(canvasWrapper);\r\n                            }\r\n                            var textLayer = null;\r\n                            if (this.textLayerFactory) {\r\n                                var textLayerDiv = document.createElement('div');\r\n                                textLayerDiv.className = 'textLayer';\r\n                                textLayerDiv.style.width = canvasWrapper.style.width;\r\n                                textLayerDiv.style.height = canvasWrapper.style.height;\r\n                                if (this.annotationLayer && this.annotationLayer.div) {\r\n                                    div.insertBefore(textLayerDiv, this.annotationLayer.div);\r\n                                } else {\r\n                                    div.appendChild(textLayerDiv);\r\n                                }\r\n                                textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv, this.id - 1, this.viewport, this.enhanceTextSelection);\r\n                            }\r\n                            this.textLayer = textLayer;\r\n                            var renderContinueCallback = null;\r\n                            if (this.renderingQueue) {\r\n                                renderContinueCallback = function renderContinueCallback(cont) {\r\n                                    if (!_this.renderingQueue.isHighestPriority(_this)) {\r\n                                        _this.renderingState = _pdf_rendering_queue.RenderingStates.PAUSED;\r\n                                        _this.resume = function () {\r\n                                            _this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\r\n                                            cont();\r\n                                        };\r\n                                        return;\r\n                                    }\r\n                                    cont();\r\n                                };\r\n                            }\r\n                            var finishPaintTask = function finishPaintTask(error) {\r\n                                if (paintTask === _this.paintTask) {\r\n                                    _this.paintTask = null;\r\n                                }\r\n                                if (error === 'cancelled' || error instanceof _pdfjsLib.RenderingCancelledException) {\r\n                                    _this.error = null;\r\n                                    return Promise.resolve(undefined);\r\n                                }\r\n                                _this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\r\n                                if (_this.loadingIconDiv) {\r\n                                    div.removeChild(_this.loadingIconDiv);\r\n                                    delete _this.loadingIconDiv;\r\n                                }\r\n                                _this._resetZoomLayer(true);\r\n                                _this.error = error;\r\n                                _this.stats = pdfPage.stats;\r\n                                if (_this.onAfterDraw) {\r\n                                    _this.onAfterDraw();\r\n                                }\r\n                                _this.eventBus.dispatch('pagerendered', {\r\n                                    source: _this,\r\n                                    pageNumber: _this.id,\r\n                                    cssTransform: false\r\n                                });\r\n                                if (error) {\r\n                                    return Promise.reject(error);\r\n                                }\r\n                                return Promise.resolve(undefined);\r\n                            };\r\n                            var paintTask = this.renderer === _ui_utils.RendererType.SVG ? this.paintOnSvg(canvasWrapper) : this.paintOnCanvas(canvasWrapper);\r\n                            paintTask.onRenderContinue = renderContinueCallback;\r\n                            this.paintTask = paintTask;\r\n                            var resultPromise = paintTask.promise.then(function () {\r\n                                return finishPaintTask(null).then(function () {\r\n                                    if (textLayer) {\r\n                                        var readableStream = pdfPage.streamTextContent({ normalizeWhitespace: true });\r\n                                        textLayer.setTextContentStream(readableStream);\r\n                                        textLayer.render();\r\n                                    }\r\n                                });\r\n                            }, function (reason) {\r\n                                return finishPaintTask(reason);\r\n                            });\r\n                            if (this.annotationLayerFactory) {\r\n                                if (!this.annotationLayer) {\r\n                                    this.annotationLayer = this.annotationLayerFactory.createAnnotationLayerBuilder(div, pdfPage, this.renderInteractiveForms, this.l10n);\r\n                                }\r\n                                this.annotationLayer.render(this.viewport, 'display');\r\n                            }\r\n                            div.setAttribute('data-loaded', true);\r\n                            if (this.onBeforeDraw) {\r\n                                this.onBeforeDraw();\r\n                            }\r\n                            return resultPromise;\r\n                        }\r\n                    }, {\r\n                        key: 'paintOnCanvas',\r\n                        value: function paintOnCanvas(canvasWrapper) {\r\n                            var renderCapability = (0, _pdfjsLib.createPromiseCapability)();\r\n                            var result = {\r\n                                promise: renderCapability.promise,\r\n                                onRenderContinue: function onRenderContinue(cont) {\r\n                                    cont();\r\n                                },\r\n                                cancel: function cancel() {\r\n                                    renderTask.cancel();\r\n                                }\r\n                            };\r\n                            var viewport = this.viewport;\r\n                            var canvas = document.createElement('canvas');\r\n                            canvas.id = this.renderingId;\r\n                            canvas.setAttribute('hidden', 'hidden');\r\n                            var isCanvasHidden = true;\r\n                            var showCanvas = function showCanvas() {\r\n                                if (isCanvasHidden) {\r\n                                    canvas.removeAttribute('hidden');\r\n                                    isCanvasHidden = false;\r\n                                }\r\n                            };\r\n                            canvasWrapper.appendChild(canvas);\r\n                            this.canvas = canvas;\r\n                            canvas.mozOpaque = true;\r\n                            var ctx = canvas.getContext('2d', { alpha: false });\r\n                            var outputScale = (0, _ui_utils.getOutputScale)(ctx);\r\n                            this.outputScale = outputScale;\r\n                            if (_pdfjsLib.PDFJS.useOnlyCssZoom) {\r\n                                var actualSizeViewport = viewport.clone({ scale: _ui_utils.CSS_UNITS });\r\n                                outputScale.sx *= actualSizeViewport.width / viewport.width;\r\n                                outputScale.sy *= actualSizeViewport.height / viewport.height;\r\n                                outputScale.scaled = true;\r\n                            }\r\n                            if (_pdfjsLib.PDFJS.maxCanvasPixels > 0) {\r\n                                var pixelsInViewport = viewport.width * viewport.height;\r\n                                var maxScale = Math.sqrt(_pdfjsLib.PDFJS.maxCanvasPixels / pixelsInViewport);\r\n                                if (outputScale.sx > maxScale || outputScale.sy > maxScale) {\r\n                                    outputScale.sx = maxScale;\r\n                                    outputScale.sy = maxScale;\r\n                                    outputScale.scaled = true;\r\n                                    this.hasRestrictedScaling = true;\r\n                                } else {\r\n                                    this.hasRestrictedScaling = false;\r\n                                }\r\n                            }\r\n                            var sfx = (0, _ui_utils.approximateFraction)(outputScale.sx);\r\n                            var sfy = (0, _ui_utils.approximateFraction)(outputScale.sy);\r\n                            canvas.width = (0, _ui_utils.roundToDivide)(viewport.width * outputScale.sx, sfx[0]);\r\n                            canvas.height = (0, _ui_utils.roundToDivide)(viewport.height * outputScale.sy, sfy[0]);\r\n                            canvas.style.width = (0, _ui_utils.roundToDivide)(viewport.width, sfx[1]) + 'px';\r\n                            canvas.style.height = (0, _ui_utils.roundToDivide)(viewport.height, sfy[1]) + 'px';\r\n                            this.paintedViewportMap.set(canvas, viewport);\r\n                            var transform = !outputScale.scaled ? null : [outputScale.sx, 0, 0, outputScale.sy, 0, 0];\r\n                            var renderContext = {\r\n                                canvasContext: ctx,\r\n                                transform: transform,\r\n                                viewport: this.viewport,\r\n                                renderInteractiveForms: this.renderInteractiveForms\r\n                            };\r\n                            var renderTask = this.pdfPage.render(renderContext);\r\n                            renderTask.onContinue = function (cont) {\r\n                                showCanvas();\r\n                                if (result.onRenderContinue) {\r\n                                    result.onRenderContinue(cont);\r\n                                } else {\r\n                                    cont();\r\n                                }\r\n                            };\r\n                            renderTask.promise.then(function () {\r\n                                showCanvas();\r\n                                renderCapability.resolve(undefined);\r\n                            }, function (error) {\r\n                                showCanvas();\r\n                                renderCapability.reject(error);\r\n                            });\r\n                            return result;\r\n                        }\r\n                    }, {\r\n                        key: 'paintOnSvg',\r\n                        value: function paintOnSvg(wrapper) {\r\n                            var _this2 = this;\r\n\r\n                            var cancelled = false;\r\n                            var ensureNotCancelled = function ensureNotCancelled() {\r\n                                if (cancelled) {\r\n                                    if (_pdfjsLib.PDFJS.pdfjsNext) {\r\n                                        throw new _pdfjsLib.RenderingCancelledException('Rendering cancelled, page ' + _this2.id, 'svg');\r\n                                    } else {\r\n                                        throw 'cancelled';\r\n                                    }\r\n                                }\r\n                            };\r\n                            var pdfPage = this.pdfPage;\r\n                            var actualSizeViewport = this.viewport.clone({ scale: _ui_utils.CSS_UNITS });\r\n                            var promise = pdfPage.getOperatorList().then(function (opList) {\r\n                                ensureNotCancelled();\r\n                                var svgGfx = new _pdfjsLib.SVGGraphics(pdfPage.commonObjs, pdfPage.objs);\r\n                                return svgGfx.getSVG(opList, actualSizeViewport).then(function (svg) {\r\n                                    ensureNotCancelled();\r\n                                    _this2.svg = svg;\r\n                                    _this2.paintedViewportMap.set(svg, actualSizeViewport);\r\n                                    svg.style.width = wrapper.style.width;\r\n                                    svg.style.height = wrapper.style.height;\r\n                                    _this2.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\r\n                                    wrapper.appendChild(svg);\r\n                                });\r\n                            });\r\n                            return {\r\n                                promise: promise,\r\n                                onRenderContinue: function onRenderContinue(cont) {\r\n                                    cont();\r\n                                },\r\n                                cancel: function cancel() {\r\n                                    cancelled = true;\r\n                                }\r\n                            };\r\n                        }\r\n                    }, {\r\n                        key: 'setPageLabel',\r\n                        value: function setPageLabel(label) {\r\n                            this.pageLabel = typeof label === 'string' ? label : null;\r\n                            if (this.pageLabel !== null) {\r\n                                this.div.setAttribute('data-page-label', this.pageLabel);\r\n                            } else {\r\n                                this.div.removeAttribute('data-page-label');\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'width',\r\n                        get: function get() {\r\n                            return this.viewport.width;\r\n                        }\r\n                    }, {\r\n                        key: 'height',\r\n                        get: function get() {\r\n                            return this.viewport.height;\r\n                        }\r\n                    }]);\r\n\r\n                    return PDFPageView;\r\n                }();\r\n\r\n                exports.PDFPageView = PDFPageView;\r\n\r\n                /***/\r\n            }),\r\n        /* 23 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.PDFPresentationMode = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1500;\r\n                var DELAY_BEFORE_HIDING_CONTROLS = 3000;\r\n                var ACTIVE_SELECTOR = 'pdfPresentationMode';\r\n                var CONTROLS_SELECTOR = 'pdfPresentationModeControls';\r\n                var MOUSE_SCROLL_COOLDOWN_TIME = 50;\r\n                var PAGE_SWITCH_THRESHOLD = 0.1;\r\n                var SWIPE_MIN_DISTANCE_THRESHOLD = 50;\r\n                var SWIPE_ANGLE_THRESHOLD = Math.PI / 6;\r\n\r\n                var PDFPresentationMode = function () {\r\n                    function PDFPresentationMode(_ref) {\r\n                        var _this = this;\r\n\r\n                        var container = _ref.container,\r\n                            _ref$viewer = _ref.viewer,\r\n                            viewer = _ref$viewer === undefined ? null : _ref$viewer,\r\n                            pdfViewer = _ref.pdfViewer,\r\n                            eventBus = _ref.eventBus,\r\n                            _ref$contextMenuItems = _ref.contextMenuItems,\r\n                            contextMenuItems = _ref$contextMenuItems === undefined ? null : _ref$contextMenuItems;\r\n\r\n                        _classCallCheck(this, PDFPresentationMode);\r\n\r\n                        this.container = container;\r\n                        this.viewer = viewer || container.firstElementChild;\r\n                        this.pdfViewer = pdfViewer;\r\n                        this.eventBus = eventBus;\r\n                        this.active = false;\r\n                        this.args = null;\r\n                        this.contextMenuOpen = false;\r\n                        this.mouseScrollTimeStamp = 0;\r\n                        this.mouseScrollDelta = 0;\r\n                        this.touchSwipeState = null;\r\n                        if (contextMenuItems) {\r\n                            contextMenuItems.contextFirstPage.addEventListener('click', function () {\r\n                                _this.contextMenuOpen = false;\r\n                                _this.eventBus.dispatch('firstpage');\r\n                            });\r\n                            contextMenuItems.contextLastPage.addEventListener('click', function () {\r\n                                _this.contextMenuOpen = false;\r\n                                _this.eventBus.dispatch('lastpage');\r\n                            });\r\n                            contextMenuItems.contextPageRotateCw.addEventListener('click', function () {\r\n                                _this.contextMenuOpen = false;\r\n                                _this.eventBus.dispatch('rotatecw');\r\n                            });\r\n                            contextMenuItems.contextPageRotateCcw.addEventListener('click', function () {\r\n                                _this.contextMenuOpen = false;\r\n                                _this.eventBus.dispatch('rotateccw');\r\n                            });\r\n                        }\r\n                    }\r\n\r\n                    _createClass(PDFPresentationMode, [{\r\n                        key: 'request',\r\n                        value: function request() {\r\n                            if (this.switchInProgress || this.active || !this.viewer.hasChildNodes()) {\r\n                                return false;\r\n                            }\r\n                            this._addFullscreenChangeListeners();\r\n                            this._setSwitchInProgress();\r\n                            this._notifyStateChange();\r\n                            if (this.container.requestFullscreen) {\r\n                                this.container.requestFullscreen();\r\n                            } else if (this.container.mozRequestFullScreen) {\r\n                                this.container.mozRequestFullScreen();\r\n                            } else if (this.container.webkitRequestFullscreen) {\r\n                                this.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);\r\n                            } else if (this.container.msRequestFullscreen) {\r\n                                this.container.msRequestFullscreen();\r\n                            } else {\r\n                                return false;\r\n                            }\r\n                            this.args = {\r\n                                page: this.pdfViewer.currentPageNumber,\r\n                                previousScale: this.pdfViewer.currentScaleValue\r\n                            };\r\n                            return true;\r\n                        }\r\n                    }, {\r\n                        key: '_mouseWheel',\r\n                        value: function _mouseWheel(evt) {\r\n                            if (!this.active) {\r\n                                return;\r\n                            }\r\n                            evt.preventDefault();\r\n                            var delta = (0, _ui_utils.normalizeWheelEventDelta)(evt);\r\n                            var currentTime = new Date().getTime();\r\n                            var storedTime = this.mouseScrollTimeStamp;\r\n                            if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) {\r\n                                return;\r\n                            }\r\n                            if (this.mouseScrollDelta > 0 && delta < 0 || this.mouseScrollDelta < 0 && delta > 0) {\r\n                                this._resetMouseScrollState();\r\n                            }\r\n                            this.mouseScrollDelta += delta;\r\n                            if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) {\r\n                                var totalDelta = this.mouseScrollDelta;\r\n                                this._resetMouseScrollState();\r\n                                var success = totalDelta > 0 ? this._goToPreviousPage() : this._goToNextPage();\r\n                                if (success) {\r\n                                    this.mouseScrollTimeStamp = currentTime;\r\n                                }\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_goToPreviousPage',\r\n                        value: function _goToPreviousPage() {\r\n                            var page = this.pdfViewer.currentPageNumber;\r\n                            if (page <= 1) {\r\n                                return false;\r\n                            }\r\n                            this.pdfViewer.currentPageNumber = page - 1;\r\n                            return true;\r\n                        }\r\n                    }, {\r\n                        key: '_goToNextPage',\r\n                        value: function _goToNextPage() {\r\n                            var page = this.pdfViewer.currentPageNumber;\r\n                            if (page >= this.pdfViewer.pagesCount) {\r\n                                return false;\r\n                            }\r\n                            this.pdfViewer.currentPageNumber = page + 1;\r\n                            return true;\r\n                        }\r\n                    }, {\r\n                        key: '_notifyStateChange',\r\n                        value: function _notifyStateChange() {\r\n                            this.eventBus.dispatch('presentationmodechanged', {\r\n                                source: this,\r\n                                active: this.active,\r\n                                switchInProgress: !!this.switchInProgress\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: '_setSwitchInProgress',\r\n                        value: function _setSwitchInProgress() {\r\n                            var _this2 = this;\r\n\r\n                            if (this.switchInProgress) {\r\n                                clearTimeout(this.switchInProgress);\r\n                            }\r\n                            this.switchInProgress = setTimeout(function () {\r\n                                _this2._removeFullscreenChangeListeners();\r\n                                delete _this2.switchInProgress;\r\n                                _this2._notifyStateChange();\r\n                            }, DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);\r\n                        }\r\n                    }, {\r\n                        key: '_resetSwitchInProgress',\r\n                        value: function _resetSwitchInProgress() {\r\n                            if (this.switchInProgress) {\r\n                                clearTimeout(this.switchInProgress);\r\n                                delete this.switchInProgress;\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_enter',\r\n                        value: function _enter() {\r\n                            var _this3 = this;\r\n\r\n                            this.active = true;\r\n                            this._resetSwitchInProgress();\r\n                            this._notifyStateChange();\r\n                            this.container.classList.add(ACTIVE_SELECTOR);\r\n                            setTimeout(function () {\r\n                                _this3.pdfViewer.currentPageNumber = _this3.args.page;\r\n                                _this3.pdfViewer.currentScaleValue = 'page-fit';\r\n                            }, 0);\r\n                            this._addWindowListeners();\r\n                            this._showControls();\r\n                            this.contextMenuOpen = false;\r\n                            this.container.setAttribute('contextmenu', 'viewerContextMenu');\r\n                            window.getSelection().removeAllRanges();\r\n                        }\r\n                    }, {\r\n                        key: '_exit',\r\n                        value: function _exit() {\r\n                            var _this4 = this;\r\n\r\n                            var page = this.pdfViewer.currentPageNumber;\r\n                            this.container.classList.remove(ACTIVE_SELECTOR);\r\n                            setTimeout(function () {\r\n                                _this4.active = false;\r\n                                _this4._removeFullscreenChangeListeners();\r\n                                _this4._notifyStateChange();\r\n                                _this4.pdfViewer.currentScaleValue = _this4.args.previousScale;\r\n                                _this4.pdfViewer.currentPageNumber = page;\r\n                                _this4.args = null;\r\n                            }, 0);\r\n                            this._removeWindowListeners();\r\n                            this._hideControls();\r\n                            this._resetMouseScrollState();\r\n                            this.container.removeAttribute('contextmenu');\r\n                            this.contextMenuOpen = false;\r\n                        }\r\n                    }, {\r\n                        key: '_mouseDown',\r\n                        value: function _mouseDown(evt) {\r\n                            if (this.contextMenuOpen) {\r\n                                this.contextMenuOpen = false;\r\n                                evt.preventDefault();\r\n                                return;\r\n                            }\r\n                            if (evt.button === 0) {\r\n                                var isInternalLink = evt.target.href && evt.target.classList.contains('internalLink');\r\n                                if (!isInternalLink) {\r\n                                    evt.preventDefault();\r\n                                    if (evt.shiftKey) {\r\n                                        this._goToPreviousPage();\r\n                                    } else {\r\n                                        this._goToNextPage();\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_contextMenu',\r\n                        value: function _contextMenu() {\r\n                            this.contextMenuOpen = true;\r\n                        }\r\n                    }, {\r\n                        key: '_showControls',\r\n                        value: function _showControls() {\r\n                            var _this5 = this;\r\n\r\n                            if (this.controlsTimeout) {\r\n                                clearTimeout(this.controlsTimeout);\r\n                            } else {\r\n                                this.container.classList.add(CONTROLS_SELECTOR);\r\n                            }\r\n                            this.controlsTimeout = setTimeout(function () {\r\n                                _this5.container.classList.remove(CONTROLS_SELECTOR);\r\n                                delete _this5.controlsTimeout;\r\n                            }, DELAY_BEFORE_HIDING_CONTROLS);\r\n                        }\r\n                    }, {\r\n                        key: '_hideControls',\r\n                        value: function _hideControls() {\r\n                            if (!this.controlsTimeout) {\r\n                                return;\r\n                            }\r\n                            clearTimeout(this.controlsTimeout);\r\n                            this.container.classList.remove(CONTROLS_SELECTOR);\r\n                            delete this.controlsTimeout;\r\n                        }\r\n                    }, {\r\n                        key: '_resetMouseScrollState',\r\n                        value: function _resetMouseScrollState() {\r\n                            this.mouseScrollTimeStamp = 0;\r\n                            this.mouseScrollDelta = 0;\r\n                        }\r\n                    }, {\r\n                        key: '_touchSwipe',\r\n                        value: function _touchSwipe(evt) {\r\n                            if (!this.active) {\r\n                                return;\r\n                            }\r\n                            if (evt.touches.length > 1) {\r\n                                this.touchSwipeState = null;\r\n                                return;\r\n                            }\r\n                            switch (evt.type) {\r\n                                case 'touchstart':\r\n                                    this.touchSwipeState = {\r\n                                        startX: evt.touches[0].pageX,\r\n                                        startY: evt.touches[0].pageY,\r\n                                        endX: evt.touches[0].pageX,\r\n                                        endY: evt.touches[0].pageY\r\n                                    };\r\n                                    break;\r\n                                case 'touchmove':\r\n                                    if (this.touchSwipeState === null) {\r\n                                        return;\r\n                                    }\r\n                                    this.touchSwipeState.endX = evt.touches[0].pageX;\r\n                                    this.touchSwipeState.endY = evt.touches[0].pageY;\r\n                                    evt.preventDefault();\r\n                                    break;\r\n                                case 'touchend':\r\n                                    if (this.touchSwipeState === null) {\r\n                                        return;\r\n                                    }\r\n                                    var delta = 0;\r\n                                    var dx = this.touchSwipeState.endX - this.touchSwipeState.startX;\r\n                                    var dy = this.touchSwipeState.endY - this.touchSwipeState.startY;\r\n                                    var absAngle = Math.abs(Math.atan2(dy, dx));\r\n                                    if (Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD && (absAngle <= SWIPE_ANGLE_THRESHOLD || absAngle >= Math.PI - SWIPE_ANGLE_THRESHOLD)) {\r\n                                        delta = dx;\r\n                                    } else if (Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD && Math.abs(absAngle - Math.PI / 2) <= SWIPE_ANGLE_THRESHOLD) {\r\n                                        delta = dy;\r\n                                    }\r\n                                    if (delta > 0) {\r\n                                        this._goToPreviousPage();\r\n                                    } else if (delta < 0) {\r\n                                        this._goToNextPage();\r\n                                    }\r\n                                    break;\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_addWindowListeners',\r\n                        value: function _addWindowListeners() {\r\n                            this.showControlsBind = this._showControls.bind(this);\r\n                            this.mouseDownBind = this._mouseDown.bind(this);\r\n                            this.mouseWheelBind = this._mouseWheel.bind(this);\r\n                            this.resetMouseScrollStateBind = this._resetMouseScrollState.bind(this);\r\n                            this.contextMenuBind = this._contextMenu.bind(this);\r\n                            this.touchSwipeBind = this._touchSwipe.bind(this);\r\n                            window.addEventListener('mousemove', this.showControlsBind);\r\n                            window.addEventListener('mousedown', this.mouseDownBind);\r\n                            window.addEventListener('wheel', this.mouseWheelBind);\r\n                            window.addEventListener('keydown', this.resetMouseScrollStateBind);\r\n                            window.addEventListener('contextmenu', this.contextMenuBind);\r\n                            window.addEventListener('touchstart', this.touchSwipeBind);\r\n                            window.addEventListener('touchmove', this.touchSwipeBind);\r\n                            window.addEventListener('touchend', this.touchSwipeBind);\r\n                        }\r\n                    }, {\r\n                        key: '_removeWindowListeners',\r\n                        value: function _removeWindowListeners() {\r\n                            window.removeEventListener('mousemove', this.showControlsBind);\r\n                            window.removeEventListener('mousedown', this.mouseDownBind);\r\n                            window.removeEventListener('wheel', this.mouseWheelBind);\r\n                            window.removeEventListener('keydown', this.resetMouseScrollStateBind);\r\n                            window.removeEventListener('contextmenu', this.contextMenuBind);\r\n                            window.removeEventListener('touchstart', this.touchSwipeBind);\r\n                            window.removeEventListener('touchmove', this.touchSwipeBind);\r\n                            window.removeEventListener('touchend', this.touchSwipeBind);\r\n                            delete this.showControlsBind;\r\n                            delete this.mouseDownBind;\r\n                            delete this.mouseWheelBind;\r\n                            delete this.resetMouseScrollStateBind;\r\n                            delete this.contextMenuBind;\r\n                            delete this.touchSwipeBind;\r\n                        }\r\n                    }, {\r\n                        key: '_fullscreenChange',\r\n                        value: function _fullscreenChange() {\r\n                            if (this.isFullscreen) {\r\n                                this._enter();\r\n                            } else {\r\n                                this._exit();\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_addFullscreenChangeListeners',\r\n                        value: function _addFullscreenChangeListeners() {\r\n                            this.fullscreenChangeBind = this._fullscreenChange.bind(this);\r\n                            window.addEventListener('fullscreenchange', this.fullscreenChangeBind);\r\n                            window.addEventListener('mozfullscreenchange', this.fullscreenChangeBind);\r\n                            window.addEventListener('webkitfullscreenchange', this.fullscreenChangeBind);\r\n                            window.addEventListener('MSFullscreenChange', this.fullscreenChangeBind);\r\n                        }\r\n                    }, {\r\n                        key: '_removeFullscreenChangeListeners',\r\n                        value: function _removeFullscreenChangeListeners() {\r\n                            window.removeEventListener('fullscreenchange', this.fullscreenChangeBind);\r\n                            window.removeEventListener('mozfullscreenchange', this.fullscreenChangeBind);\r\n                            window.removeEventListener('webkitfullscreenchange', this.fullscreenChangeBind);\r\n                            window.removeEventListener('MSFullscreenChange', this.fullscreenChangeBind);\r\n                            delete this.fullscreenChangeBind;\r\n                        }\r\n                    }, {\r\n                        key: 'isFullscreen',\r\n                        get: function get() {\r\n                            return !!(document.fullscreenElement || document.mozFullScreen || document.webkitIsFullScreen || document.msFullscreenElement);\r\n                        }\r\n                    }]);\r\n\r\n                    return PDFPresentationMode;\r\n                }();\r\n\r\n                exports.PDFPresentationMode = PDFPresentationMode;\r\n\r\n                /***/\r\n            }),\r\n        /* 24 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.PDFSidebar = exports.SidebarView = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                var _pdf_rendering_queue = __webpack_require__(3);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var UI_NOTIFICATION_CLASS = 'pdfSidebarNotification';\r\n                var SidebarView = {\r\n                    NONE: 0,\r\n                    THUMBS: 1,\r\n                    OUTLINE: 2,\r\n                    ATTACHMENTS: 3\r\n                };\r\n\r\n                var PDFSidebar = function () {\r\n                    function PDFSidebar(options) {\r\n                        var l10n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _ui_utils.NullL10n;\r\n\r\n                        _classCallCheck(this, PDFSidebar);\r\n\r\n                        this.isOpen = false;\r\n                        this.active = SidebarView.THUMBS;\r\n                        this.isInitialViewSet = false;\r\n                        this.onToggled = null;\r\n                        this.pdfViewer = options.pdfViewer;\r\n                        this.pdfThumbnailViewer = options.pdfThumbnailViewer;\r\n                        this.pdfOutlineViewer = options.pdfOutlineViewer;\r\n                        this.mainContainer = options.mainContainer;\r\n                        this.outerContainer = options.outerContainer;\r\n                        this.eventBus = options.eventBus;\r\n                        this.toggleButton = options.toggleButton;\r\n                        this.thumbnailButton = options.thumbnailButton;\r\n                        this.outlineButton = options.outlineButton;\r\n                        this.attachmentsButton = options.attachmentsButton;\r\n                        this.thumbnailView = options.thumbnailView;\r\n                        this.outlineView = options.outlineView;\r\n                        this.attachmentsView = options.attachmentsView;\r\n                        this.disableNotification = options.disableNotification || false;\r\n                        this.l10n = l10n;\r\n                        this._addEventListeners();\r\n                    }\r\n\r\n                    _createClass(PDFSidebar, [{\r\n                        key: 'reset',\r\n                        value: function reset() {\r\n                            this.isInitialViewSet = false;\r\n                            this._hideUINotification(null);\r\n                            this.switchView(SidebarView.THUMBS);\r\n                            this.outlineButton.disabled = false;\r\n                            this.attachmentsButton.disabled = false;\r\n                        }\r\n                    }, {\r\n                        key: 'setInitialView',\r\n                        value: function setInitialView(view) {\r\n                            if (this.isInitialViewSet) {\r\n                                return;\r\n                            }\r\n                            this.isInitialViewSet = true;\r\n                            if (this.isOpen && view === SidebarView.NONE) {\r\n                                this._dispatchEvent();\r\n                                return;\r\n                            }\r\n                            var isViewPreserved = view === this.visibleView;\r\n                            this.switchView(view, true);\r\n                            if (isViewPreserved) {\r\n                                this._dispatchEvent();\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'switchView',\r\n                        value: function switchView(view) {\r\n                            var forceOpen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\r\n\r\n                            if (view === SidebarView.NONE) {\r\n                                this.close();\r\n                                return;\r\n                            }\r\n                            var isViewChanged = view !== this.active;\r\n                            var shouldForceRendering = false;\r\n                            switch (view) {\r\n                                case SidebarView.THUMBS:\r\n                                    this.thumbnailButton.classList.add('toggled');\r\n                                    this.outlineButton.classList.remove('toggled');\r\n                                    this.attachmentsButton.classList.remove('toggled');\r\n                                    this.thumbnailView.classList.remove('hidden');\r\n                                    this.outlineView.classList.add('hidden');\r\n                                    this.attachmentsView.classList.add('hidden');\r\n                                    if (this.isOpen && isViewChanged) {\r\n                                        this._updateThumbnailViewer();\r\n                                        shouldForceRendering = true;\r\n                                    }\r\n                                    break;\r\n                                case SidebarView.OUTLINE:\r\n                                    if (this.outlineButton.disabled) {\r\n                                        return;\r\n                                    }\r\n                                    this.thumbnailButton.classList.remove('toggled');\r\n                                    this.outlineButton.classList.add('toggled');\r\n                                    this.attachmentsButton.classList.remove('toggled');\r\n                                    this.thumbnailView.classList.add('hidden');\r\n                                    this.outlineView.classList.remove('hidden');\r\n                                    this.attachmentsView.classList.add('hidden');\r\n                                    break;\r\n                                case SidebarView.ATTACHMENTS:\r\n                                    if (this.attachmentsButton.disabled) {\r\n                                        return;\r\n                                    }\r\n                                    this.thumbnailButton.classList.remove('toggled');\r\n                                    this.outlineButton.classList.remove('toggled');\r\n                                    this.attachmentsButton.classList.add('toggled');\r\n                                    this.thumbnailView.classList.add('hidden');\r\n                                    this.outlineView.classList.add('hidden');\r\n                                    this.attachmentsView.classList.remove('hidden');\r\n                                    break;\r\n                                default:\r\n                                    console.error('PDFSidebar_switchView: \"' + view + '\" is an unsupported value.');\r\n                                    return;\r\n                            }\r\n                            this.active = view | 0;\r\n                            if (forceOpen && !this.isOpen) {\r\n                                this.open();\r\n                                return;\r\n                            }\r\n                            if (shouldForceRendering) {\r\n                                this._forceRendering();\r\n                            }\r\n                            if (isViewChanged) {\r\n                                this._dispatchEvent();\r\n                            }\r\n                            this._hideUINotification(this.active);\r\n                        }\r\n                    }, {\r\n                        key: 'open',\r\n                        value: function open() {\r\n                            if (this.isOpen) {\r\n                                return;\r\n                            }\r\n                            this.isOpen = true;\r\n                            this.toggleButton.classList.add('toggled');\r\n                            this.outerContainer.classList.add('sidebarMoving');\r\n                            this.outerContainer.classList.add('sidebarOpen');\r\n                            if (this.active === SidebarView.THUMBS) {\r\n                                this._updateThumbnailViewer();\r\n                            }\r\n                            this._forceRendering();\r\n                            this._dispatchEvent();\r\n                            this._hideUINotification(this.active);\r\n                        }\r\n                    }, {\r\n                        key: 'close',\r\n                        value: function close() {\r\n                            if (!this.isOpen) {\r\n                                return;\r\n                            }\r\n                            this.isOpen = false;\r\n                            this.toggleButton.classList.remove('toggled');\r\n                            this.outerContainer.classList.add('sidebarMoving');\r\n                            this.outerContainer.classList.remove('sidebarOpen');\r\n                            this._forceRendering();\r\n                            this._dispatchEvent();\r\n                        }\r\n                    }, {\r\n                        key: 'toggle',\r\n                        value: function toggle() {\r\n                            if (this.isOpen) {\r\n                                this.close();\r\n                            } else {\r\n                                this.open();\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_dispatchEvent',\r\n                        value: function _dispatchEvent() {\r\n                            this.eventBus.dispatch('sidebarviewchanged', {\r\n                                source: this,\r\n                                view: this.visibleView\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: '_forceRendering',\r\n                        value: function _forceRendering() {\r\n                            if (this.onToggled) {\r\n                                this.onToggled();\r\n                            } else {\r\n                                this.pdfViewer.forceRendering();\r\n                                this.pdfThumbnailViewer.forceRendering();\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_updateThumbnailViewer',\r\n                        value: function _updateThumbnailViewer() {\r\n                            var pdfViewer = this.pdfViewer,\r\n                                pdfThumbnailViewer = this.pdfThumbnailViewer;\r\n\r\n                            var pagesCount = pdfViewer.pagesCount;\r\n                            for (var pageIndex = 0; pageIndex < pagesCount; pageIndex++) {\r\n                                var pageView = pdfViewer.getPageView(pageIndex);\r\n                                if (pageView && pageView.renderingState === _pdf_rendering_queue.RenderingStates.FINISHED) {\r\n                                    var thumbnailView = pdfThumbnailViewer.getThumbnail(pageIndex);\r\n                                    thumbnailView.setImage(pageView);\r\n                                }\r\n                            }\r\n                            pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber);\r\n                        }\r\n                    }, {\r\n                        key: '_showUINotification',\r\n                        value: function _showUINotification(view) {\r\n                            var _this = this;\r\n\r\n                            if (this.disableNotification) {\r\n                                return;\r\n                            }\r\n                            this.l10n.get('toggle_sidebar_notification.title', null, 'Toggle Sidebar (document contains outline/attachments)').then(function (msg) {\r\n                                _this.toggleButton.title = msg;\r\n                            });\r\n                            if (!this.isOpen) {\r\n                                this.toggleButton.classList.add(UI_NOTIFICATION_CLASS);\r\n                            } else if (view === this.active) {\r\n                                return;\r\n                            }\r\n                            switch (view) {\r\n                                case SidebarView.OUTLINE:\r\n                                    this.outlineButton.classList.add(UI_NOTIFICATION_CLASS);\r\n                                    break;\r\n                                case SidebarView.ATTACHMENTS:\r\n                                    this.attachmentsButton.classList.add(UI_NOTIFICATION_CLASS);\r\n                                    break;\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_hideUINotification',\r\n                        value: function _hideUINotification(view) {\r\n                            var _this2 = this;\r\n\r\n                            if (this.disableNotification) {\r\n                                return;\r\n                            }\r\n                            var removeNotification = function removeNotification(view) {\r\n                                switch (view) {\r\n                                    case SidebarView.OUTLINE:\r\n                                        _this2.outlineButton.classList.remove(UI_NOTIFICATION_CLASS);\r\n                                        break;\r\n                                    case SidebarView.ATTACHMENTS:\r\n                                        _this2.attachmentsButton.classList.remove(UI_NOTIFICATION_CLASS);\r\n                                        break;\r\n                                }\r\n                            };\r\n                            if (!this.isOpen && view !== null) {\r\n                                return;\r\n                            }\r\n                            this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS);\r\n                            if (view !== null) {\r\n                                removeNotification(view);\r\n                                return;\r\n                            }\r\n                            for (view in SidebarView) {\r\n                                removeNotification(SidebarView[view]);\r\n                            }\r\n                            this.l10n.get('toggle_sidebar.title', null, 'Toggle Sidebar').then(function (msg) {\r\n                                _this2.toggleButton.title = msg;\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: '_addEventListeners',\r\n                        value: function _addEventListeners() {\r\n                            var _this3 = this;\r\n\r\n                            this.mainContainer.addEventListener('transitionend', function (evt) {\r\n                                if (evt.target === _this3.mainContainer) {\r\n                                    _this3.outerContainer.classList.remove('sidebarMoving');\r\n                                }\r\n                            });\r\n                            this.thumbnailButton.addEventListener('click', function () {\r\n                                _this3.switchView(SidebarView.THUMBS);\r\n                            });\r\n                            this.outlineButton.addEventListener('click', function () {\r\n                                _this3.switchView(SidebarView.OUTLINE);\r\n                            });\r\n                            this.outlineButton.addEventListener('dblclick', function () {\r\n                                _this3.pdfOutlineViewer.toggleOutlineTree();\r\n                            });\r\n                            this.attachmentsButton.addEventListener('click', function () {\r\n                                _this3.switchView(SidebarView.ATTACHMENTS);\r\n                            });\r\n                            this.eventBus.on('outlineloaded', function (evt) {\r\n                                var outlineCount = evt.outlineCount;\r\n                                _this3.outlineButton.disabled = !outlineCount;\r\n                                if (outlineCount) {\r\n                                    _this3._showUINotification(SidebarView.OUTLINE);\r\n                                } else if (_this3.active === SidebarView.OUTLINE) {\r\n                                    _this3.switchView(SidebarView.THUMBS);\r\n                                }\r\n                            });\r\n                            this.eventBus.on('attachmentsloaded', function (evt) {\r\n                                var attachmentsCount = evt.attachmentsCount;\r\n                                _this3.attachmentsButton.disabled = !attachmentsCount;\r\n                                if (attachmentsCount) {\r\n                                    _this3._showUINotification(SidebarView.ATTACHMENTS);\r\n                                } else if (_this3.active === SidebarView.ATTACHMENTS) {\r\n                                    _this3.switchView(SidebarView.THUMBS);\r\n                                }\r\n                            });\r\n                            this.eventBus.on('presentationmodechanged', function (evt) {\r\n                                if (!evt.active && !evt.switchInProgress && _this3.isThumbnailViewVisible) {\r\n                                    _this3._updateThumbnailViewer();\r\n                                }\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'visibleView',\r\n                        get: function get() {\r\n                            return this.isOpen ? this.active : SidebarView.NONE;\r\n                        }\r\n                    }, {\r\n                        key: 'isThumbnailViewVisible',\r\n                        get: function get() {\r\n                            return this.isOpen && this.active === SidebarView.THUMBS;\r\n                        }\r\n                    }, {\r\n                        key: 'isOutlineViewVisible',\r\n                        get: function get() {\r\n                            return this.isOpen && this.active === SidebarView.OUTLINE;\r\n                        }\r\n                    }, {\r\n                        key: 'isAttachmentsViewVisible',\r\n                        get: function get() {\r\n                            return this.isOpen && this.active === SidebarView.ATTACHMENTS;\r\n                        }\r\n                    }]);\r\n\r\n                    return PDFSidebar;\r\n                }();\r\n\r\n                exports.SidebarView = SidebarView;\r\n                exports.PDFSidebar = PDFSidebar;\r\n\r\n                /***/\r\n            }),\r\n        /* 25 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.PDFThumbnailView = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _pdfjsLib = __webpack_require__(1);\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                var _pdf_rendering_queue = __webpack_require__(3);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var MAX_NUM_SCALING_STEPS = 3;\r\n                var THUMBNAIL_CANVAS_BORDER_WIDTH = 1;\r\n                var THUMBNAIL_WIDTH = 98;\r\n                var TempImageFactory = function TempImageFactoryClosure() {\r\n                    var tempCanvasCache = null;\r\n                    return {\r\n                        getCanvas: function getCanvas(width, height) {\r\n                            var tempCanvas = tempCanvasCache;\r\n                            if (!tempCanvas) {\r\n                                tempCanvas = document.createElement('canvas');\r\n                                tempCanvasCache = tempCanvas;\r\n                            }\r\n                            tempCanvas.width = width;\r\n                            tempCanvas.height = height;\r\n                            tempCanvas.mozOpaque = true;\r\n                            var ctx = tempCanvas.getContext('2d', { alpha: false });\r\n                            ctx.save();\r\n                            ctx.fillStyle = 'rgb(255, 255, 255)';\r\n                            ctx.fillRect(0, 0, width, height);\r\n                            ctx.restore();\r\n                            return tempCanvas;\r\n                        },\r\n                        destroyCanvas: function destroyCanvas() {\r\n                            var tempCanvas = tempCanvasCache;\r\n                            if (tempCanvas) {\r\n                                tempCanvas.width = 0;\r\n                                tempCanvas.height = 0;\r\n                            }\r\n                            tempCanvasCache = null;\r\n                        }\r\n                    };\r\n                }();\r\n\r\n                var PDFThumbnailView = function () {\r\n                    function PDFThumbnailView(_ref) {\r\n                        var container = _ref.container,\r\n                            id = _ref.id,\r\n                            defaultViewport = _ref.defaultViewport,\r\n                            linkService = _ref.linkService,\r\n                            renderingQueue = _ref.renderingQueue,\r\n                            _ref$disableCanvasToI = _ref.disableCanvasToImageConversion,\r\n                            disableCanvasToImageConversion = _ref$disableCanvasToI === undefined ? false : _ref$disableCanvasToI,\r\n                            _ref$l10n = _ref.l10n,\r\n                            l10n = _ref$l10n === undefined ? _ui_utils.NullL10n : _ref$l10n;\r\n\r\n                        _classCallCheck(this, PDFThumbnailView);\r\n\r\n                        this.id = id;\r\n                        this.renderingId = 'thumbnail' + id;\r\n                        this.pageLabel = null;\r\n                        this.pdfPage = null;\r\n                        this.rotation = 0;\r\n                        this.viewport = defaultViewport;\r\n                        this.pdfPageRotate = defaultViewport.rotation;\r\n                        this.linkService = linkService;\r\n                        this.renderingQueue = renderingQueue;\r\n                        this.renderTask = null;\r\n                        this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\r\n                        this.resume = null;\r\n                        this.disableCanvasToImageConversion = disableCanvasToImageConversion;\r\n                        this.pageWidth = this.viewport.width;\r\n                        this.pageHeight = this.viewport.height;\r\n                        this.pageRatio = this.pageWidth / this.pageHeight;\r\n                        this.canvasWidth = THUMBNAIL_WIDTH;\r\n                        this.canvasHeight = this.canvasWidth / this.pageRatio | 0;\r\n                        this.scale = this.canvasWidth / this.pageWidth;\r\n                        this.l10n = l10n;\r\n                        var anchor = document.createElement('a');\r\n                        anchor.href = linkService.getAnchorUrl('#page=' + id);\r\n                        this.l10n.get('thumb_page_title', { page: id }, 'Page {{page}}').then(function (msg) {\r\n                            anchor.title = msg;\r\n                        });\r\n                        anchor.onclick = function () {\r\n                            linkService.page = id;\r\n                            return false;\r\n                        };\r\n                        this.anchor = anchor;\r\n                        var div = document.createElement('div');\r\n                        div.className = 'thumbnail';\r\n                        div.setAttribute('data-page-number', this.id);\r\n                        this.div = div;\r\n                        if (id === 1) {\r\n                            div.classList.add('selected');\r\n                        }\r\n                        var ring = document.createElement('div');\r\n                        ring.className = 'thumbnailSelectionRing';\r\n                        var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;\r\n                        ring.style.width = this.canvasWidth + borderAdjustment + 'px';\r\n                        ring.style.height = this.canvasHeight + borderAdjustment + 'px';\r\n                        this.ring = ring;\r\n                        div.appendChild(ring);\r\n                        anchor.appendChild(div);\r\n                        container.appendChild(anchor);\r\n                    }\r\n\r\n                    _createClass(PDFThumbnailView, [{\r\n                        key: 'setPdfPage',\r\n                        value: function setPdfPage(pdfPage) {\r\n                            this.pdfPage = pdfPage;\r\n                            this.pdfPageRotate = pdfPage.rotate;\r\n                            var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\r\n                            this.viewport = pdfPage.getViewport(1, totalRotation);\r\n                            this.reset();\r\n                        }\r\n                    }, {\r\n                        key: 'reset',\r\n                        value: function reset() {\r\n                            this.cancelRendering();\r\n                            this.pageWidth = this.viewport.width;\r\n                            this.pageHeight = this.viewport.height;\r\n                            this.pageRatio = this.pageWidth / this.pageHeight;\r\n                            this.canvasHeight = this.canvasWidth / this.pageRatio | 0;\r\n                            this.scale = this.canvasWidth / this.pageWidth;\r\n                            this.div.removeAttribute('data-loaded');\r\n                            var ring = this.ring;\r\n                            var childNodes = ring.childNodes;\r\n                            for (var i = childNodes.length - 1; i >= 0; i--) {\r\n                                ring.removeChild(childNodes[i]);\r\n                            }\r\n                            var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;\r\n                            ring.style.width = this.canvasWidth + borderAdjustment + 'px';\r\n                            ring.style.height = this.canvasHeight + borderAdjustment + 'px';\r\n                            if (this.canvas) {\r\n                                this.canvas.width = 0;\r\n                                this.canvas.height = 0;\r\n                                delete this.canvas;\r\n                            }\r\n                            if (this.image) {\r\n                                this.image.removeAttribute('src');\r\n                                delete this.image;\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'update',\r\n                        value: function update(rotation) {\r\n                            if (typeof rotation !== 'undefined') {\r\n                                this.rotation = rotation;\r\n                            }\r\n                            var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\r\n                            this.viewport = this.viewport.clone({\r\n                                scale: 1,\r\n                                rotation: totalRotation\r\n                            });\r\n                            this.reset();\r\n                        }\r\n                    }, {\r\n                        key: 'cancelRendering',\r\n                        value: function cancelRendering() {\r\n                            if (this.renderTask) {\r\n                                this.renderTask.cancel();\r\n                                this.renderTask = null;\r\n                            }\r\n                            this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\r\n                            this.resume = null;\r\n                        }\r\n                    }, {\r\n                        key: '_getPageDrawContext',\r\n                        value: function _getPageDrawContext() {\r\n                            var noCtxScale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\r\n\r\n                            var canvas = document.createElement('canvas');\r\n                            this.canvas = canvas;\r\n                            canvas.mozOpaque = true;\r\n                            var ctx = canvas.getContext('2d', { alpha: false });\r\n                            var outputScale = (0, _ui_utils.getOutputScale)(ctx);\r\n                            canvas.width = this.canvasWidth * outputScale.sx | 0;\r\n                            canvas.height = this.canvasHeight * outputScale.sy | 0;\r\n                            canvas.style.width = this.canvasWidth + 'px';\r\n                            canvas.style.height = this.canvasHeight + 'px';\r\n                            if (!noCtxScale && outputScale.scaled) {\r\n                                ctx.scale(outputScale.sx, outputScale.sy);\r\n                            }\r\n                            return ctx;\r\n                        }\r\n                    }, {\r\n                        key: '_convertCanvasToImage',\r\n                        value: function _convertCanvasToImage() {\r\n                            var _this = this;\r\n\r\n                            if (!this.canvas) {\r\n                                return;\r\n                            }\r\n                            if (this.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {\r\n                                return;\r\n                            }\r\n                            var id = this.renderingId;\r\n                            var className = 'thumbnailImage';\r\n                            if (this.disableCanvasToImageConversion) {\r\n                                this.canvas.id = id;\r\n                                this.canvas.className = className;\r\n                                this.l10n.get('thumb_page_canvas', { page: this.pageId }, 'Thumbnail of Page {{page}}').then(function (msg) {\r\n                                    _this.canvas.setAttribute('aria-label', msg);\r\n                                });\r\n                                this.div.setAttribute('data-loaded', true);\r\n                                this.ring.appendChild(this.canvas);\r\n                                return;\r\n                            }\r\n                            var image = document.createElement('img');\r\n                            image.id = id;\r\n                            image.className = className;\r\n                            this.l10n.get('thumb_page_canvas', { page: this.pageId }, 'Thumbnail of Page {{page}}').then(function (msg) {\r\n                                image.setAttribute('aria-label', msg);\r\n                            });\r\n                            image.style.width = this.canvasWidth + 'px';\r\n                            image.style.height = this.canvasHeight + 'px';\r\n                            image.src = this.canvas.toDataURL();\r\n                            this.image = image;\r\n                            this.div.setAttribute('data-loaded', true);\r\n                            this.ring.appendChild(image);\r\n                            this.canvas.width = 0;\r\n                            this.canvas.height = 0;\r\n                            delete this.canvas;\r\n                        }\r\n                    }, {\r\n                        key: 'draw',\r\n                        value: function draw() {\r\n                            var _this2 = this;\r\n\r\n                            if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {\r\n                                console.error('Must be in new state before drawing');\r\n                                return Promise.resolve(undefined);\r\n                            }\r\n                            this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\r\n                            var renderCapability = (0, _pdfjsLib.createPromiseCapability)();\r\n                            var finishRenderTask = function finishRenderTask(error) {\r\n                                if (renderTask === _this2.renderTask) {\r\n                                    _this2.renderTask = null;\r\n                                }\r\n                                if (error === 'cancelled' || error instanceof _pdfjsLib.RenderingCancelledException) {\r\n                                    renderCapability.resolve(undefined);\r\n                                    return;\r\n                                }\r\n                                _this2.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\r\n                                _this2._convertCanvasToImage();\r\n                                if (!error) {\r\n                                    renderCapability.resolve(undefined);\r\n                                } else {\r\n                                    renderCapability.reject(error);\r\n                                }\r\n                            };\r\n                            var ctx = this._getPageDrawContext();\r\n                            var drawViewport = this.viewport.clone({ scale: this.scale });\r\n                            var renderContinueCallback = function renderContinueCallback(cont) {\r\n                                if (!_this2.renderingQueue.isHighestPriority(_this2)) {\r\n                                    _this2.renderingState = _pdf_rendering_queue.RenderingStates.PAUSED;\r\n                                    _this2.resume = function () {\r\n                                        _this2.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\r\n                                        cont();\r\n                                    };\r\n                                    return;\r\n                                }\r\n                                cont();\r\n                            };\r\n                            var renderContext = {\r\n                                canvasContext: ctx,\r\n                                viewport: drawViewport\r\n                            };\r\n                            var renderTask = this.renderTask = this.pdfPage.render(renderContext);\r\n                            renderTask.onContinue = renderContinueCallback;\r\n                            renderTask.promise.then(function () {\r\n                                finishRenderTask(null);\r\n                            }, function (error) {\r\n                                finishRenderTask(error);\r\n                            });\r\n                            return renderCapability.promise;\r\n                        }\r\n                    }, {\r\n                        key: 'setImage',\r\n                        value: function setImage(pageView) {\r\n                            if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {\r\n                                return;\r\n                            }\r\n                            var img = pageView.canvas;\r\n                            if (!img) {\r\n                                return;\r\n                            }\r\n                            if (!this.pdfPage) {\r\n                                this.setPdfPage(pageView.pdfPage);\r\n                            }\r\n                            this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\r\n                            var ctx = this._getPageDrawContext(true);\r\n                            var canvas = ctx.canvas;\r\n                            if (img.width <= 2 * canvas.width) {\r\n                                ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height);\r\n                                this._convertCanvasToImage();\r\n                                return;\r\n                            }\r\n                            var reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS;\r\n                            var reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS;\r\n                            var reducedImage = TempImageFactory.getCanvas(reducedWidth, reducedHeight);\r\n                            var reducedImageCtx = reducedImage.getContext('2d');\r\n                            while (reducedWidth > img.width || reducedHeight > img.height) {\r\n                                reducedWidth >>= 1;\r\n                                reducedHeight >>= 1;\r\n                            }\r\n                            reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, 0, 0, reducedWidth, reducedHeight);\r\n                            while (reducedWidth > 2 * canvas.width) {\r\n                                reducedImageCtx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, reducedWidth >> 1, reducedHeight >> 1);\r\n                                reducedWidth >>= 1;\r\n                                reducedHeight >>= 1;\r\n                            }\r\n                            ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, canvas.width, canvas.height);\r\n                            this._convertCanvasToImage();\r\n                        }\r\n                    }, {\r\n                        key: 'setPageLabel',\r\n                        value: function setPageLabel(label) {\r\n                            var _this3 = this;\r\n\r\n                            this.pageLabel = typeof label === 'string' ? label : null;\r\n                            this.l10n.get('thumb_page_title', { page: this.pageId }, 'Page {{page}}').then(function (msg) {\r\n                                _this3.anchor.title = msg;\r\n                            });\r\n                            if (this.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {\r\n                                return;\r\n                            }\r\n                            this.l10n.get('thumb_page_canvas', { page: this.pageId }, 'Thumbnail of Page {{page}}').then(function (ariaLabel) {\r\n                                if (_this3.image) {\r\n                                    _this3.image.setAttribute('aria-label', ariaLabel);\r\n                                } else if (_this3.disableCanvasToImageConversion && _this3.canvas) {\r\n                                    _this3.canvas.setAttribute('aria-label', ariaLabel);\r\n                                }\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'pageId',\r\n                        get: function get() {\r\n                            return this.pageLabel !== null ? this.pageLabel : this.id;\r\n                        }\r\n                    }], [{\r\n                        key: 'cleanup',\r\n                        value: function cleanup() {\r\n                            TempImageFactory.destroyCanvas();\r\n                        }\r\n                    }]);\r\n\r\n                    return PDFThumbnailView;\r\n                }();\r\n\r\n                exports.PDFThumbnailView = PDFThumbnailView;\r\n\r\n                /***/\r\n            }),\r\n        /* 26 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.PDFThumbnailViewer = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                var _pdf_thumbnail_view = __webpack_require__(25);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var THUMBNAIL_SCROLL_MARGIN = -19;\r\n\r\n                var PDFThumbnailViewer = function () {\r\n                    function PDFThumbnailViewer(_ref) {\r\n                        var container = _ref.container,\r\n                            linkService = _ref.linkService,\r\n                            renderingQueue = _ref.renderingQueue,\r\n                            _ref$l10n = _ref.l10n,\r\n                            l10n = _ref$l10n === undefined ? _ui_utils.NullL10n : _ref$l10n;\r\n\r\n                        _classCallCheck(this, PDFThumbnailViewer);\r\n\r\n                        this.container = container;\r\n                        this.linkService = linkService;\r\n                        this.renderingQueue = renderingQueue;\r\n                        this.l10n = l10n;\r\n                        this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdated.bind(this));\r\n                        this._resetView();\r\n                    }\r\n\r\n                    _createClass(PDFThumbnailViewer, [{\r\n                        key: '_scrollUpdated',\r\n                        value: function _scrollUpdated() {\r\n                            this.renderingQueue.renderHighestPriority();\r\n                        }\r\n                    }, {\r\n                        key: 'getThumbnail',\r\n                        value: function getThumbnail(index) {\r\n                            return this._thumbnails[index];\r\n                        }\r\n                    }, {\r\n                        key: '_getVisibleThumbs',\r\n                        value: function _getVisibleThumbs() {\r\n                            return (0, _ui_utils.getVisibleElements)(this.container, this._thumbnails);\r\n                        }\r\n                    }, {\r\n                        key: 'scrollThumbnailIntoView',\r\n                        value: function scrollThumbnailIntoView(page) {\r\n                            var selected = document.querySelector('.thumbnail.selected');\r\n                            if (selected) {\r\n                                selected.classList.remove('selected');\r\n                            }\r\n                            var thumbnail = document.querySelector('div.thumbnail[data-page-number=\"' + page + '\"]');\r\n                            if (thumbnail) {\r\n                                thumbnail.classList.add('selected');\r\n                            }\r\n                            var visibleThumbs = this._getVisibleThumbs();\r\n                            var numVisibleThumbs = visibleThumbs.views.length;\r\n                            if (numVisibleThumbs > 0) {\r\n                                var first = visibleThumbs.first.id;\r\n                                var last = numVisibleThumbs > 1 ? visibleThumbs.last.id : first;\r\n                                if (page <= first || page >= last) {\r\n                                    (0, _ui_utils.scrollIntoView)(thumbnail, { top: THUMBNAIL_SCROLL_MARGIN });\r\n                                }\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'cleanup',\r\n                        value: function cleanup() {\r\n                            _pdf_thumbnail_view.PDFThumbnailView.cleanup();\r\n                        }\r\n                    }, {\r\n                        key: '_resetView',\r\n                        value: function _resetView() {\r\n                            this._thumbnails = [];\r\n                            this._pageLabels = null;\r\n                            this._pagesRotation = 0;\r\n                            this._pagesRequests = [];\r\n                            this.container.textContent = '';\r\n                        }\r\n                    }, {\r\n                        key: 'setDocument',\r\n                        value: function setDocument(pdfDocument) {\r\n                            var _this = this;\r\n\r\n                            if (this.pdfDocument) {\r\n                                this._cancelRendering();\r\n                                this._resetView();\r\n                            }\r\n                            this.pdfDocument = pdfDocument;\r\n                            if (!pdfDocument) {\r\n                                return;\r\n                            }\r\n                            pdfDocument.getPage(1).then(function (firstPage) {\r\n                                var pagesCount = pdfDocument.numPages;\r\n                                var viewport = firstPage.getViewport(1.0);\r\n                                for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {\r\n                                    var thumbnail = new _pdf_thumbnail_view.PDFThumbnailView({\r\n                                        container: _this.container,\r\n                                        id: pageNum,\r\n                                        defaultViewport: viewport.clone(),\r\n                                        linkService: _this.linkService,\r\n                                        renderingQueue: _this.renderingQueue,\r\n                                        disableCanvasToImageConversion: false,\r\n                                        l10n: _this.l10n\r\n                                    });\r\n                                    _this._thumbnails.push(thumbnail);\r\n                                }\r\n                            }).catch(function (reason) {\r\n                                console.error('Unable to initialize thumbnail viewer', reason);\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: '_cancelRendering',\r\n                        value: function _cancelRendering() {\r\n                            for (var i = 0, ii = this._thumbnails.length; i < ii; i++) {\r\n                                if (this._thumbnails[i]) {\r\n                                    this._thumbnails[i].cancelRendering();\r\n                                }\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'setPageLabels',\r\n                        value: function setPageLabels(labels) {\r\n                            if (!this.pdfDocument) {\r\n                                return;\r\n                            }\r\n                            if (!labels) {\r\n                                this._pageLabels = null;\r\n                            } else if (!(labels instanceof Array && this.pdfDocument.numPages === labels.length)) {\r\n                                this._pageLabels = null;\r\n                                console.error('PDFThumbnailViewer_setPageLabels: Invalid page labels.');\r\n                            } else {\r\n                                this._pageLabels = labels;\r\n                            }\r\n                            for (var i = 0, ii = this._thumbnails.length; i < ii; i++) {\r\n                                var label = this._pageLabels && this._pageLabels[i];\r\n                                this._thumbnails[i].setPageLabel(label);\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_ensurePdfPageLoaded',\r\n                        value: function _ensurePdfPageLoaded(thumbView) {\r\n                            var _this2 = this;\r\n\r\n                            if (thumbView.pdfPage) {\r\n                                return Promise.resolve(thumbView.pdfPage);\r\n                            }\r\n                            var pageNumber = thumbView.id;\r\n                            if (this._pagesRequests[pageNumber]) {\r\n                                return this._pagesRequests[pageNumber];\r\n                            }\r\n                            var promise = this.pdfDocument.getPage(pageNumber).then(function (pdfPage) {\r\n                                thumbView.setPdfPage(pdfPage);\r\n                                _this2._pagesRequests[pageNumber] = null;\r\n                                return pdfPage;\r\n                            }).catch(function (reason) {\r\n                                console.error('Unable to get page for thumb view', reason);\r\n                                _this2._pagesRequests[pageNumber] = null;\r\n                            });\r\n                            this._pagesRequests[pageNumber] = promise;\r\n                            return promise;\r\n                        }\r\n                    }, {\r\n                        key: 'forceRendering',\r\n                        value: function forceRendering() {\r\n                            var _this3 = this;\r\n\r\n                            var visibleThumbs = this._getVisibleThumbs();\r\n                            var thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this._thumbnails, this.scroll.down);\r\n                            if (thumbView) {\r\n                                this._ensurePdfPageLoaded(thumbView).then(function () {\r\n                                    _this3.renderingQueue.renderView(thumbView);\r\n                                });\r\n                                return true;\r\n                            }\r\n                            return false;\r\n                        }\r\n                    }, {\r\n                        key: 'pagesRotation',\r\n                        get: function get() {\r\n                            return this._pagesRotation;\r\n                        },\r\n                        set: function set(rotation) {\r\n                            if (!(typeof rotation === 'number' && rotation % 90 === 0)) {\r\n                                throw new Error('Invalid thumbnails rotation angle.');\r\n                            }\r\n                            if (!this.pdfDocument) {\r\n                                return;\r\n                            }\r\n                            this._pagesRotation = rotation;\r\n                            for (var i = 0, ii = this._thumbnails.length; i < ii; i++) {\r\n                                this._thumbnails[i].update(rotation);\r\n                            }\r\n                        }\r\n                    }]);\r\n\r\n                    return PDFThumbnailViewer;\r\n                }();\r\n\r\n                exports.PDFThumbnailViewer = PDFThumbnailViewer;\r\n\r\n                /***/\r\n            }),\r\n        /* 27 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.PDFViewer = exports.PresentationModeState = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _pdfjsLib = __webpack_require__(1);\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                var _pdf_rendering_queue = __webpack_require__(3);\r\n\r\n                var _annotation_layer_builder = __webpack_require__(11);\r\n\r\n                var _dom_events = __webpack_require__(2);\r\n\r\n                var _pdf_page_view = __webpack_require__(22);\r\n\r\n                var _pdf_link_service = __webpack_require__(5);\r\n\r\n                var _text_layer_builder = __webpack_require__(30);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var PresentationModeState = {\r\n                    UNKNOWN: 0,\r\n                    NORMAL: 1,\r\n                    CHANGING: 2,\r\n                    FULLSCREEN: 3\r\n                };\r\n                var DEFAULT_CACHE_SIZE = 10;\r\n                function PDFPageViewBuffer(size) {\r\n                    var data = [];\r\n                    this.push = function cachePush(view) {\r\n                        var i = data.indexOf(view);\r\n                        if (i >= 0) {\r\n                            data.splice(i, 1);\r\n                        }\r\n                        data.push(view);\r\n                        if (data.length > size) {\r\n                            data.shift().destroy();\r\n                        }\r\n                    };\r\n                    this.resize = function (newSize) {\r\n                        size = newSize;\r\n                        while (data.length > size) {\r\n                            data.shift().destroy();\r\n                        }\r\n                    };\r\n                }\r\n                function isSameScale(oldScale, newScale) {\r\n                    if (newScale === oldScale) {\r\n                        return true;\r\n                    }\r\n                    if (Math.abs(newScale - oldScale) < 1e-15) {\r\n                        return true;\r\n                    }\r\n                    return false;\r\n                }\r\n                function isPortraitOrientation(size) {\r\n                    return size.width <= size.height;\r\n                }\r\n\r\n                var PDFViewer = function () {\r\n                    function PDFViewer(options) {\r\n                        _classCallCheck(this, PDFViewer);\r\n\r\n                        this.container = options.container;\r\n                        this.viewer = options.viewer || options.container.firstElementChild;\r\n                        this.eventBus = options.eventBus || (0, _dom_events.getGlobalEventBus)();\r\n                        this.linkService = options.linkService || new _pdf_link_service.SimpleLinkService();\r\n                        this.downloadManager = options.downloadManager || null;\r\n                        this.removePageBorders = options.removePageBorders || false;\r\n                        this.enhanceTextSelection = options.enhanceTextSelection || false;\r\n                        this.renderInteractiveForms = options.renderInteractiveForms || false;\r\n                        this.enablePrintAutoRotate = options.enablePrintAutoRotate || false;\r\n                        this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;\r\n                        this.l10n = options.l10n || _ui_utils.NullL10n;\r\n                        this.defaultRenderingQueue = !options.renderingQueue;\r\n                        if (this.defaultRenderingQueue) {\r\n                            this.renderingQueue = new _pdf_rendering_queue.PDFRenderingQueue();\r\n                            this.renderingQueue.setViewer(this);\r\n                        } else {\r\n                            this.renderingQueue = options.renderingQueue;\r\n                        }\r\n                        this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdate.bind(this));\r\n                        this.presentationModeState = PresentationModeState.UNKNOWN;\r\n                        this._resetView();\r\n                        if (this.removePageBorders) {\r\n                            this.viewer.classList.add('removePageBorders');\r\n                        }\r\n                    }\r\n\r\n                    _createClass(PDFViewer, [{\r\n                        key: 'getPageView',\r\n                        value: function getPageView(index) {\r\n                            return this._pages[index];\r\n                        }\r\n                    }, {\r\n                        key: '_setCurrentPageNumber',\r\n                        value: function _setCurrentPageNumber(val) {\r\n                            var resetCurrentPageView = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\r\n\r\n                            if (this._currentPageNumber === val) {\r\n                                if (resetCurrentPageView) {\r\n                                    this._resetCurrentPageView();\r\n                                }\r\n                                return;\r\n                            }\r\n                            if (!(0 < val && val <= this.pagesCount)) {\r\n                                console.error('PDFViewer._setCurrentPageNumber: \"' + val + '\" is out of bounds.');\r\n                                return;\r\n                            }\r\n                            var arg = {\r\n                                source: this,\r\n                                pageNumber: val,\r\n                                pageLabel: this._pageLabels && this._pageLabels[val - 1]\r\n                            };\r\n                            this._currentPageNumber = val;\r\n                            this.eventBus.dispatch('pagechanging', arg);\r\n                            this.eventBus.dispatch('pagechange', arg);\r\n                            if (resetCurrentPageView) {\r\n                                this._resetCurrentPageView();\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'setDocument',\r\n                        value: function setDocument(pdfDocument) {\r\n                            var _this = this;\r\n\r\n                            if (this.pdfDocument) {\r\n                                this._cancelRendering();\r\n                                this._resetView();\r\n                            }\r\n                            this.pdfDocument = pdfDocument;\r\n                            if (!pdfDocument) {\r\n                                return;\r\n                            }\r\n                            var pagesCount = pdfDocument.numPages;\r\n                            var pagesCapability = (0, _pdfjsLib.createPromiseCapability)();\r\n                            this.pagesPromise = pagesCapability.promise;\r\n                            pagesCapability.promise.then(function () {\r\n                                _this._pageViewsReady = true;\r\n                                _this.eventBus.dispatch('pagesloaded', {\r\n                                    source: _this,\r\n                                    pagesCount: pagesCount\r\n                                });\r\n                            });\r\n                            var isOnePageRenderedResolved = false;\r\n                            var onePageRenderedCapability = (0, _pdfjsLib.createPromiseCapability)();\r\n                            this.onePageRendered = onePageRenderedCapability.promise;\r\n                            var bindOnAfterAndBeforeDraw = function bindOnAfterAndBeforeDraw(pageView) {\r\n                                pageView.onBeforeDraw = function () {\r\n                                    _this._buffer.push(pageView);\r\n                                };\r\n                                pageView.onAfterDraw = function () {\r\n                                    if (!isOnePageRenderedResolved) {\r\n                                        isOnePageRenderedResolved = true;\r\n                                        onePageRenderedCapability.resolve();\r\n                                    }\r\n                                };\r\n                            };\r\n                            var firstPagePromise = pdfDocument.getPage(1);\r\n                            this.firstPagePromise = firstPagePromise;\r\n                            firstPagePromise.then(function (pdfPage) {\r\n                                var scale = _this.currentScale;\r\n                                var viewport = pdfPage.getViewport(scale * _ui_utils.CSS_UNITS);\r\n                                for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {\r\n                                    var textLayerFactory = null;\r\n                                    if (!_pdfjsLib.PDFJS.disableTextLayer) {\r\n                                        textLayerFactory = _this;\r\n                                    }\r\n                                    var pageView = new _pdf_page_view.PDFPageView({\r\n                                        container: _this.viewer,\r\n                                        eventBus: _this.eventBus,\r\n                                        id: pageNum,\r\n                                        scale: scale,\r\n                                        defaultViewport: viewport.clone(),\r\n                                        renderingQueue: _this.renderingQueue,\r\n                                        textLayerFactory: textLayerFactory,\r\n                                        annotationLayerFactory: _this,\r\n                                        enhanceTextSelection: _this.enhanceTextSelection,\r\n                                        renderInteractiveForms: _this.renderInteractiveForms,\r\n                                        renderer: _this.renderer,\r\n                                        l10n: _this.l10n\r\n                                    });\r\n                                    bindOnAfterAndBeforeDraw(pageView);\r\n                                    _this._pages.push(pageView);\r\n                                }\r\n                                onePageRenderedCapability.promise.then(function () {\r\n                                    if (_pdfjsLib.PDFJS.disableAutoFetch) {\r\n                                        pagesCapability.resolve();\r\n                                        return;\r\n                                    }\r\n                                    var getPagesLeft = pagesCount;\r\n\r\n                                    var _loop = function _loop(_pageNum) {\r\n                                        pdfDocument.getPage(_pageNum).then(function (pdfPage) {\r\n                                            var pageView = _this._pages[_pageNum - 1];\r\n                                            if (!pageView.pdfPage) {\r\n                                                pageView.setPdfPage(pdfPage);\r\n                                            }\r\n                                            _this.linkService.cachePageRef(_pageNum, pdfPage.ref);\r\n                                            if (--getPagesLeft === 0) {\r\n                                                pagesCapability.resolve();\r\n                                            }\r\n                                        }, function (reason) {\r\n                                            console.error('Unable to get page ' + _pageNum + ' to initialize viewer', reason);\r\n                                            if (--getPagesLeft === 0) {\r\n                                                pagesCapability.resolve();\r\n                                            }\r\n                                        });\r\n                                    };\r\n\r\n                                    for (var _pageNum = 1; _pageNum <= pagesCount; ++_pageNum) {\r\n                                        _loop(_pageNum);\r\n                                    }\r\n                                });\r\n                                _this.eventBus.dispatch('pagesinit', { source: _this });\r\n                                if (_this.defaultRenderingQueue) {\r\n                                    _this.update();\r\n                                }\r\n                                if (_this.findController) {\r\n                                    _this.findController.resolveFirstPage();\r\n                                }\r\n                            }).catch(function (reason) {\r\n                                console.error('Unable to initialize viewer', reason);\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'setPageLabels',\r\n                        value: function setPageLabels(labels) {\r\n                            if (!this.pdfDocument) {\r\n                                return;\r\n                            }\r\n                            if (!labels) {\r\n                                this._pageLabels = null;\r\n                            } else if (!(labels instanceof Array && this.pdfDocument.numPages === labels.length)) {\r\n                                this._pageLabels = null;\r\n                                console.error('PDFViewer.setPageLabels: Invalid page labels.');\r\n                            } else {\r\n                                this._pageLabels = labels;\r\n                            }\r\n                            for (var i = 0, ii = this._pages.length; i < ii; i++) {\r\n                                var pageView = this._pages[i];\r\n                                var label = this._pageLabels && this._pageLabels[i];\r\n                                pageView.setPageLabel(label);\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_resetView',\r\n                        value: function _resetView() {\r\n                            this._pages = [];\r\n                            this._currentPageNumber = 1;\r\n                            this._currentScale = _ui_utils.UNKNOWN_SCALE;\r\n                            this._currentScaleValue = null;\r\n                            this._pageLabels = null;\r\n                            this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE);\r\n                            this._location = null;\r\n                            this._pagesRotation = 0;\r\n                            this._pagesRequests = [];\r\n                            this._pageViewsReady = false;\r\n                            this.viewer.textContent = '';\r\n                        }\r\n                    }, {\r\n                        key: '_scrollUpdate',\r\n                        value: function _scrollUpdate() {\r\n                            if (this.pagesCount === 0) {\r\n                                return;\r\n                            }\r\n                            this.update();\r\n                        }\r\n                    }, {\r\n                        key: '_setScaleDispatchEvent',\r\n                        value: function _setScaleDispatchEvent(newScale, newValue) {\r\n                            var preset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\r\n\r\n                            var arg = {\r\n                                source: this,\r\n                                scale: newScale,\r\n                                presetValue: preset ? newValue : undefined\r\n                            };\r\n                            this.eventBus.dispatch('scalechanging', arg);\r\n                            this.eventBus.dispatch('scalechange', arg);\r\n                        }\r\n                    }, {\r\n                        key: '_setScaleUpdatePages',\r\n                        value: function _setScaleUpdatePages(newScale, newValue) {\r\n                            var noScroll = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\r\n                            var preset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\r\n\r\n                            this._currentScaleValue = newValue.toString();\r\n                            if (isSameScale(this._currentScale, newScale)) {\r\n                                if (preset) {\r\n                                    this._setScaleDispatchEvent(newScale, newValue, true);\r\n                                }\r\n                                return;\r\n                            }\r\n                            for (var i = 0, ii = this._pages.length; i < ii; i++) {\r\n                                this._pages[i].update(newScale);\r\n                            }\r\n                            this._currentScale = newScale;\r\n                            if (!noScroll) {\r\n                                var page = this._currentPageNumber,\r\n                                    dest = void 0;\r\n                                if (this._location && !_pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom && !(this.isInPresentationMode || this.isChangingPresentationMode)) {\r\n                                    page = this._location.pageNumber;\r\n                                    dest = [null, { name: 'XYZ' }, this._location.left, this._location.top, null];\r\n                                }\r\n                                this.scrollPageIntoView({\r\n                                    pageNumber: page,\r\n                                    destArray: dest,\r\n                                    allowNegativeOffset: true\r\n                                });\r\n                            }\r\n                            this._setScaleDispatchEvent(newScale, newValue, preset);\r\n                            if (this.defaultRenderingQueue) {\r\n                                this.update();\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_setScale',\r\n                        value: function _setScale(value) {\r\n                            var noScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\r\n\r\n                            var scale = parseFloat(value);\r\n                            if (scale > 0) {\r\n                                this._setScaleUpdatePages(scale, value, noScroll, false);\r\n                            } else {\r\n                                var currentPage = this._pages[this._currentPageNumber - 1];\r\n                                if (!currentPage) {\r\n                                    return;\r\n                                }\r\n                                var hPadding = this.isInPresentationMode || this.removePageBorders ? 0 : _ui_utils.SCROLLBAR_PADDING;\r\n                                var vPadding = this.isInPresentationMode || this.removePageBorders ? 0 : _ui_utils.VERTICAL_PADDING;\r\n                                var pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale;\r\n                                var pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale;\r\n                                switch (value) {\r\n                                    case 'page-actual':\r\n                                        scale = 1;\r\n                                        break;\r\n                                    case 'page-width':\r\n                                        scale = pageWidthScale;\r\n                                        break;\r\n                                    case 'page-height':\r\n                                        scale = pageHeightScale;\r\n                                        break;\r\n                                    case 'page-fit':\r\n                                        scale = Math.min(pageWidthScale, pageHeightScale);\r\n                                        break;\r\n                                    case 'auto':\r\n                                        var isLandscape = currentPage.width > currentPage.height;\r\n                                        var horizontalScale = isLandscape ? Math.min(pageHeightScale, pageWidthScale) : pageWidthScale;\r\n                                        scale = Math.min(_ui_utils.MAX_AUTO_SCALE, horizontalScale);\r\n                                        break;\r\n                                    default:\r\n                                        console.error('PDFViewer._setScale: \"' + value + '\" is an unknown zoom value.');\r\n                                        return;\r\n                                }\r\n                                this._setScaleUpdatePages(scale, value, noScroll, true);\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_resetCurrentPageView',\r\n                        value: function _resetCurrentPageView() {\r\n                            if (this.isInPresentationMode) {\r\n                                this._setScale(this._currentScaleValue, true);\r\n                            }\r\n                            var pageView = this._pages[this._currentPageNumber - 1];\r\n                            (0, _ui_utils.scrollIntoView)(pageView.div);\r\n                        }\r\n                    }, {\r\n                        key: 'scrollPageIntoView',\r\n                        value: function scrollPageIntoView(params) {\r\n                            if (!this.pdfDocument) {\r\n                                return;\r\n                            }\r\n                            if (arguments.length > 1 || typeof params === 'number') {\r\n                                console.warn('Call of scrollPageIntoView() with obsolete signature.');\r\n                                var paramObj = {};\r\n                                if (typeof params === 'number') {\r\n                                    paramObj.pageNumber = params;\r\n                                }\r\n                                if (arguments[1] instanceof Array) {\r\n                                    paramObj.destArray = arguments[1];\r\n                                }\r\n                                params = paramObj;\r\n                            }\r\n                            var pageNumber = params.pageNumber || 0;\r\n                            var dest = params.destArray || null;\r\n                            var allowNegativeOffset = params.allowNegativeOffset || false;\r\n                            if (this.isInPresentationMode || !dest) {\r\n                                this._setCurrentPageNumber(pageNumber, true);\r\n                                return;\r\n                            }\r\n                            var pageView = this._pages[pageNumber - 1];\r\n                            if (!pageView) {\r\n                                console.error('PDFViewer.scrollPageIntoView: Invalid \"pageNumber\" parameter.');\r\n                                return;\r\n                            }\r\n                            var x = 0,\r\n                                y = 0;\r\n                            var width = 0,\r\n                                height = 0,\r\n                                widthScale = void 0,\r\n                                heightScale = void 0;\r\n                            var changeOrientation = pageView.rotation % 180 === 0 ? false : true;\r\n                            var pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / _ui_utils.CSS_UNITS;\r\n                            var pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / _ui_utils.CSS_UNITS;\r\n                            var scale = 0;\r\n                            switch (dest[1].name) {\r\n                                case 'XYZ':\r\n                                    x = dest[2];\r\n                                    y = dest[3];\r\n                                    scale = dest[4];\r\n                                    x = x !== null ? x : 0;\r\n                                    y = y !== null ? y : pageHeight;\r\n                                    break;\r\n                                case 'Fit':\r\n                                case 'FitB':\r\n                                    scale = 'page-fit';\r\n                                    break;\r\n                                case 'FitH':\r\n                                case 'FitBH':\r\n                                    y = dest[2];\r\n                                    scale = 'page-width';\r\n                                    if (y === null && this._location) {\r\n                                        x = this._location.left;\r\n                                        y = this._location.top;\r\n                                    }\r\n                                    break;\r\n                                case 'FitV':\r\n                                case 'FitBV':\r\n                                    x = dest[2];\r\n                                    width = pageWidth;\r\n                                    height = pageHeight;\r\n                                    scale = 'page-height';\r\n                                    break;\r\n                                case 'FitR':\r\n                                    x = dest[2];\r\n                                    y = dest[3];\r\n                                    width = dest[4] - x;\r\n                                    height = dest[5] - y;\r\n                                    var hPadding = this.removePageBorders ? 0 : _ui_utils.SCROLLBAR_PADDING;\r\n                                    var vPadding = this.removePageBorders ? 0 : _ui_utils.VERTICAL_PADDING;\r\n                                    widthScale = (this.container.clientWidth - hPadding) / width / _ui_utils.CSS_UNITS;\r\n                                    heightScale = (this.container.clientHeight - vPadding) / height / _ui_utils.CSS_UNITS;\r\n                                    scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));\r\n                                    break;\r\n                                default:\r\n                                    console.error('PDFViewer.scrollPageIntoView: \"' + dest[1].name + '\" ' + 'is not a valid destination type.');\r\n                                    return;\r\n                            }\r\n                            if (scale && scale !== this._currentScale) {\r\n                                this.currentScaleValue = scale;\r\n                            } else if (this._currentScale === _ui_utils.UNKNOWN_SCALE) {\r\n                                this.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;\r\n                            }\r\n                            if (scale === 'page-fit' && !dest[4]) {\r\n                                (0, _ui_utils.scrollIntoView)(pageView.div);\r\n                                return;\r\n                            }\r\n                            var boundingRect = [pageView.viewport.convertToViewportPoint(x, y), pageView.viewport.convertToViewportPoint(x + width, y + height)];\r\n                            var left = Math.min(boundingRect[0][0], boundingRect[1][0]);\r\n                            var top = Math.min(boundingRect[0][1], boundingRect[1][1]);\r\n                            if (!allowNegativeOffset) {\r\n                                left = Math.max(left, 0);\r\n                                top = Math.max(top, 0);\r\n                            }\r\n                            (0, _ui_utils.scrollIntoView)(pageView.div, {\r\n                                left: left,\r\n                                top: top\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: '_updateLocation',\r\n                        value: function _updateLocation(firstPage) {\r\n                            var currentScale = this._currentScale;\r\n                            var currentScaleValue = this._currentScaleValue;\r\n                            var normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ? Math.round(currentScale * 10000) / 100 : currentScaleValue;\r\n                            var pageNumber = firstPage.id;\r\n                            var pdfOpenParams = '#page=' + pageNumber;\r\n                            pdfOpenParams += '&zoom=' + normalizedScaleValue;\r\n                            var currentPageView = this._pages[pageNumber - 1];\r\n                            var container = this.container;\r\n                            var topLeft = currentPageView.getPagePoint(container.scrollLeft - firstPage.x, container.scrollTop - firstPage.y);\r\n                            var intLeft = Math.round(topLeft[0]);\r\n                            var intTop = Math.round(topLeft[1]);\r\n                            pdfOpenParams += ',' + intLeft + ',' + intTop;\r\n                            this._location = {\r\n                                pageNumber: pageNumber,\r\n                                scale: normalizedScaleValue,\r\n                                top: intTop,\r\n                                left: intLeft,\r\n                                pdfOpenParams: pdfOpenParams\r\n                            };\r\n                        }\r\n                    }, {\r\n                        key: 'update',\r\n                        value: function update() {\r\n                            var visible = this._getVisiblePages();\r\n                            var visiblePages = visible.views;\r\n                            if (visiblePages.length === 0) {\r\n                                return;\r\n                            }\r\n                            var suggestedCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * visiblePages.length + 1);\r\n                            this._buffer.resize(suggestedCacheSize);\r\n                            this.renderingQueue.renderHighestPriority(visible);\r\n                            var currentId = this._currentPageNumber;\r\n                            var firstPage = visible.first;\r\n                            var stillFullyVisible = false;\r\n                            for (var i = 0, ii = visiblePages.length; i < ii; ++i) {\r\n                                var page = visiblePages[i];\r\n                                if (page.percent < 100) {\r\n                                    break;\r\n                                }\r\n                                if (page.id === currentId) {\r\n                                    stillFullyVisible = true;\r\n                                    break;\r\n                                }\r\n                            }\r\n                            if (!stillFullyVisible) {\r\n                                currentId = visiblePages[0].id;\r\n                            }\r\n                            if (!this.isInPresentationMode) {\r\n                                this._setCurrentPageNumber(currentId);\r\n                            }\r\n                            this._updateLocation(firstPage);\r\n                            this.eventBus.dispatch('updateviewarea', {\r\n                                source: this,\r\n                                location: this._location\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'containsElement',\r\n                        value: function containsElement(element) {\r\n                            return this.container.contains(element);\r\n                        }\r\n                    }, {\r\n                        key: 'focus',\r\n                        value: function focus() {\r\n                            this.container.focus();\r\n                        }\r\n                    }, {\r\n                        key: '_getVisiblePages',\r\n                        value: function _getVisiblePages() {\r\n                            if (!this.isInPresentationMode) {\r\n                                return (0, _ui_utils.getVisibleElements)(this.container, this._pages, true);\r\n                            }\r\n                            var visible = [];\r\n                            var currentPage = this._pages[this._currentPageNumber - 1];\r\n                            visible.push({\r\n                                id: currentPage.id,\r\n                                view: currentPage\r\n                            });\r\n                            return {\r\n                                first: currentPage,\r\n                                last: currentPage,\r\n                                views: visible\r\n                            };\r\n                        }\r\n                    }, {\r\n                        key: 'cleanup',\r\n                        value: function cleanup() {\r\n                            for (var i = 0, ii = this._pages.length; i < ii; i++) {\r\n                                if (this._pages[i] && this._pages[i].renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {\r\n                                    this._pages[i].reset();\r\n                                }\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_cancelRendering',\r\n                        value: function _cancelRendering() {\r\n                            for (var i = 0, ii = this._pages.length; i < ii; i++) {\r\n                                if (this._pages[i]) {\r\n                                    this._pages[i].cancelRendering();\r\n                                }\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_ensurePdfPageLoaded',\r\n                        value: function _ensurePdfPageLoaded(pageView) {\r\n                            var _this2 = this;\r\n\r\n                            if (pageView.pdfPage) {\r\n                                return Promise.resolve(pageView.pdfPage);\r\n                            }\r\n                            var pageNumber = pageView.id;\r\n                            if (this._pagesRequests[pageNumber]) {\r\n                                return this._pagesRequests[pageNumber];\r\n                            }\r\n                            var promise = this.pdfDocument.getPage(pageNumber).then(function (pdfPage) {\r\n                                if (!pageView.pdfPage) {\r\n                                    pageView.setPdfPage(pdfPage);\r\n                                }\r\n                                _this2._pagesRequests[pageNumber] = null;\r\n                                return pdfPage;\r\n                            }).catch(function (reason) {\r\n                                console.error('Unable to get page for page view', reason);\r\n                                _this2._pagesRequests[pageNumber] = null;\r\n                            });\r\n                            this._pagesRequests[pageNumber] = promise;\r\n                            return promise;\r\n                        }\r\n                    }, {\r\n                        key: 'forceRendering',\r\n                        value: function forceRendering(currentlyVisiblePages) {\r\n                            var _this3 = this;\r\n\r\n                            var visiblePages = currentlyVisiblePages || this._getVisiblePages();\r\n                            var pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, this.scroll.down);\r\n                            if (pageView) {\r\n                                this._ensurePdfPageLoaded(pageView).then(function () {\r\n                                    _this3.renderingQueue.renderView(pageView);\r\n                                });\r\n                                return true;\r\n                            }\r\n                            return false;\r\n                        }\r\n                    }, {\r\n                        key: 'getPageTextContent',\r\n                        value: function getPageTextContent(pageIndex) {\r\n                            return this.pdfDocument.getPage(pageIndex + 1).then(function (page) {\r\n                                return page.getTextContent({ normalizeWhitespace: true });\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'createTextLayerBuilder',\r\n                        value: function createTextLayerBuilder(textLayerDiv, pageIndex, viewport) {\r\n                            var enhanceTextSelection = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\r\n\r\n                            return new _text_layer_builder.TextLayerBuilder({\r\n                                textLayerDiv: textLayerDiv,\r\n                                eventBus: this.eventBus,\r\n                                pageIndex: pageIndex,\r\n                                viewport: viewport,\r\n                                findController: this.isInPresentationMode ? null : this.findController,\r\n                                enhanceTextSelection: this.isInPresentationMode ? false : enhanceTextSelection\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'createAnnotationLayerBuilder',\r\n                        value: function createAnnotationLayerBuilder(pageDiv, pdfPage) {\r\n                            var renderInteractiveForms = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\r\n                            var l10n = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _ui_utils.NullL10n;\r\n\r\n                            return new _annotation_layer_builder.AnnotationLayerBuilder({\r\n                                pageDiv: pageDiv,\r\n                                pdfPage: pdfPage,\r\n                                renderInteractiveForms: renderInteractiveForms,\r\n                                linkService: this.linkService,\r\n                                downloadManager: this.downloadManager,\r\n                                l10n: l10n\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'setFindController',\r\n                        value: function setFindController(findController) {\r\n                            this.findController = findController;\r\n                        }\r\n                    }, {\r\n                        key: 'getPagesOverview',\r\n                        value: function getPagesOverview() {\r\n                            var pagesOverview = this._pages.map(function (pageView) {\r\n                                var viewport = pageView.pdfPage.getViewport(1);\r\n                                return {\r\n                                    width: viewport.width,\r\n                                    height: viewport.height,\r\n                                    rotation: viewport.rotation\r\n                                };\r\n                            });\r\n                            if (!this.enablePrintAutoRotate) {\r\n                                return pagesOverview;\r\n                            }\r\n                            var isFirstPagePortrait = isPortraitOrientation(pagesOverview[0]);\r\n                            return pagesOverview.map(function (size) {\r\n                                if (isFirstPagePortrait === isPortraitOrientation(size)) {\r\n                                    return size;\r\n                                }\r\n                                return {\r\n                                    width: size.height,\r\n                                    height: size.width,\r\n                                    rotation: (size.rotation + 90) % 360\r\n                                };\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'pagesCount',\r\n                        get: function get() {\r\n                            return this._pages.length;\r\n                        }\r\n                    }, {\r\n                        key: 'pageViewsReady',\r\n                        get: function get() {\r\n                            return this._pageViewsReady;\r\n                        }\r\n                    }, {\r\n                        key: 'currentPageNumber',\r\n                        get: function get() {\r\n                            return this._currentPageNumber;\r\n                        },\r\n                        set: function set(val) {\r\n                            if ((val | 0) !== val) {\r\n                                throw new Error('Invalid page number.');\r\n                            }\r\n                            if (!this.pdfDocument) {\r\n                                return;\r\n                            }\r\n                            this._setCurrentPageNumber(val, true);\r\n                        }\r\n                    }, {\r\n                        key: 'currentPageLabel',\r\n                        get: function get() {\r\n                            return this._pageLabels && this._pageLabels[this._currentPageNumber - 1];\r\n                        },\r\n                        set: function set(val) {\r\n                            var pageNumber = val | 0;\r\n                            if (this._pageLabels) {\r\n                                var i = this._pageLabels.indexOf(val);\r\n                                if (i >= 0) {\r\n                                    pageNumber = i + 1;\r\n                                }\r\n                            }\r\n                            this.currentPageNumber = pageNumber;\r\n                        }\r\n                    }, {\r\n                        key: 'currentScale',\r\n                        get: function get() {\r\n                            return this._currentScale !== _ui_utils.UNKNOWN_SCALE ? this._currentScale : _ui_utils.DEFAULT_SCALE;\r\n                        },\r\n                        set: function set(val) {\r\n                            if (isNaN(val)) {\r\n                                throw new Error('Invalid numeric scale');\r\n                            }\r\n                            if (!this.pdfDocument) {\r\n                                return;\r\n                            }\r\n                            this._setScale(val, false);\r\n                        }\r\n                    }, {\r\n                        key: 'currentScaleValue',\r\n                        get: function get() {\r\n                            return this._currentScaleValue;\r\n                        },\r\n                        set: function set(val) {\r\n                            if (!this.pdfDocument) {\r\n                                return;\r\n                            }\r\n                            this._setScale(val, false);\r\n                        }\r\n                    }, {\r\n                        key: 'pagesRotation',\r\n                        get: function get() {\r\n                            return this._pagesRotation;\r\n                        },\r\n                        set: function set(rotation) {\r\n                            if (!(typeof rotation === 'number' && rotation % 90 === 0)) {\r\n                                throw new Error('Invalid pages rotation angle.');\r\n                            }\r\n                            if (!this.pdfDocument) {\r\n                                return;\r\n                            }\r\n                            this._pagesRotation = rotation;\r\n                            for (var i = 0, ii = this._pages.length; i < ii; i++) {\r\n                                var pageView = this._pages[i];\r\n                                pageView.update(pageView.scale, rotation);\r\n                            }\r\n                            this._setScale(this._currentScaleValue, true);\r\n                            if (this.defaultRenderingQueue) {\r\n                                this.update();\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'isInPresentationMode',\r\n                        get: function get() {\r\n                            return this.presentationModeState === PresentationModeState.FULLSCREEN;\r\n                        }\r\n                    }, {\r\n                        key: 'isChangingPresentationMode',\r\n                        get: function get() {\r\n                            return this.presentationModeState === PresentationModeState.CHANGING;\r\n                        }\r\n                    }, {\r\n                        key: 'isHorizontalScrollbarEnabled',\r\n                        get: function get() {\r\n                            return this.isInPresentationMode ? false : this.container.scrollWidth > this.container.clientWidth;\r\n                        }\r\n                    }, {\r\n                        key: 'hasEqualPageSizes',\r\n                        get: function get() {\r\n                            var firstPageView = this._pages[0];\r\n                            for (var i = 1, ii = this._pages.length; i < ii; ++i) {\r\n                                var pageView = this._pages[i];\r\n                                if (pageView.width !== firstPageView.width || pageView.height !== firstPageView.height) {\r\n                                    return false;\r\n                                }\r\n                            }\r\n                            return true;\r\n                        }\r\n                    }]);\r\n\r\n                    return PDFViewer;\r\n                }();\r\n\r\n                exports.PresentationModeState = PresentationModeState;\r\n                exports.PDFViewer = PDFViewer;\r\n\r\n                /***/\r\n            }),\r\n        /* 28 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.BasePreferences = undefined;\r\n\r\n                var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var defaultPreferences = null;\r\n                function getDefaultPreferences() {\r\n                    if (!defaultPreferences) {\r\n                        defaultPreferences = Promise.resolve({\r\n                            \"showPreviousViewOnLoad\": true,\r\n                            \"defaultZoomValue\": \"\",\r\n                            \"sidebarViewOnLoad\": 0,\r\n                            \"enableHandToolOnLoad\": false,\r\n                            \"cursorToolOnLoad\": 0,\r\n                            \"enableWebGL\": false,\r\n                            \"pdfBugEnabled\": false,\r\n                            \"disableRange\": false,\r\n                            \"disableStream\": false,\r\n                            \"disableAutoFetch\": false,\r\n                            \"disableFontFace\": false,\r\n                            \"disableTextLayer\": false,\r\n                            \"useOnlyCssZoom\": false,\r\n                            \"externalLinkTarget\": 0,\r\n                            \"enhanceTextSelection\": false,\r\n                            \"renderer\": \"canvas\",\r\n                            \"renderInteractiveForms\": false,\r\n                            \"enablePrintAutoRotate\": false,\r\n                            \"disablePageMode\": false,\r\n                            \"disablePageLabels\": false\r\n                        });\r\n                    }\r\n                    return defaultPreferences;\r\n                }\r\n\r\n                var BasePreferences = function () {\r\n                    function BasePreferences() {\r\n                        var _this = this;\r\n\r\n                        _classCallCheck(this, BasePreferences);\r\n\r\n                        if (this.constructor === BasePreferences) {\r\n                            throw new Error('Cannot initialize BasePreferences.');\r\n                        }\r\n                        this.prefs = null;\r\n                        this._initializedPromise = getDefaultPreferences().then(function (defaults) {\r\n                            Object.defineProperty(_this, 'defaults', {\r\n                                value: Object.freeze(defaults),\r\n                                writable: false,\r\n                                enumerable: true,\r\n                                configurable: false\r\n                            });\r\n                            _this.prefs = (0, _ui_utils.cloneObj)(defaults);\r\n                            return _this._readFromStorage(defaults);\r\n                        }).then(function (prefObj) {\r\n                            if (prefObj) {\r\n                                _this.prefs = prefObj;\r\n                            }\r\n                        });\r\n                    }\r\n\r\n                    _createClass(BasePreferences, [{\r\n                        key: \"_writeToStorage\",\r\n                        value: function _writeToStorage(prefObj) {\r\n                            return Promise.reject(new Error('Not implemented: _writeToStorage'));\r\n                        }\r\n                    }, {\r\n                        key: \"_readFromStorage\",\r\n                        value: function _readFromStorage(prefObj) {\r\n                            return Promise.reject(new Error('Not implemented: _readFromStorage'));\r\n                        }\r\n                    }, {\r\n                        key: \"reset\",\r\n                        value: function reset() {\r\n                            var _this2 = this;\r\n\r\n                            return this._initializedPromise.then(function () {\r\n                                _this2.prefs = (0, _ui_utils.cloneObj)(_this2.defaults);\r\n                                return _this2._writeToStorage(_this2.defaults);\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: \"reload\",\r\n                        value: function reload() {\r\n                            var _this3 = this;\r\n\r\n                            return this._initializedPromise.then(function () {\r\n                                return _this3._readFromStorage(_this3.defaults);\r\n                            }).then(function (prefObj) {\r\n                                if (prefObj) {\r\n                                    _this3.prefs = prefObj;\r\n                                }\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: \"set\",\r\n                        value: function set(name, value) {\r\n                            var _this4 = this;\r\n\r\n                            return this._initializedPromise.then(function () {\r\n                                if (_this4.defaults[name] === undefined) {\r\n                                    throw new Error(\"Set preference: \\\"\" + name + \"\\\" is undefined.\");\r\n                                } else if (value === undefined) {\r\n                                    throw new Error('Set preference: no value is specified.');\r\n                                }\r\n                                var valueType = typeof value === \"undefined\" ? \"undefined\" : _typeof(value);\r\n                                var defaultType = _typeof(_this4.defaults[name]);\r\n                                if (valueType !== defaultType) {\r\n                                    if (valueType === 'number' && defaultType === 'string') {\r\n                                        value = value.toString();\r\n                                    } else {\r\n                                        throw new Error(\"Set preference: \\\"\" + value + \"\\\" is a \" + valueType + \", \" + (\"expected a \" + defaultType + \".\"));\r\n                                    }\r\n                                } else {\r\n                                    if (valueType === 'number' && (value | 0) !== value) {\r\n                                        throw new Error(\"Set preference: \\\"\" + value + \"\\\" must be an integer.\");\r\n                                    }\r\n                                }\r\n                                _this4.prefs[name] = value;\r\n                                return _this4._writeToStorage(_this4.prefs);\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: \"get\",\r\n                        value: function get(name) {\r\n                            var _this5 = this;\r\n\r\n                            return this._initializedPromise.then(function () {\r\n                                var defaultValue = _this5.defaults[name];\r\n                                if (defaultValue === undefined) {\r\n                                    throw new Error(\"Get preference: \\\"\" + name + \"\\\" is undefined.\");\r\n                                } else {\r\n                                    var prefValue = _this5.prefs[name];\r\n                                    if (prefValue !== undefined) {\r\n                                        return prefValue;\r\n                                    }\r\n                                }\r\n                                return defaultValue;\r\n                            });\r\n                        }\r\n                    }]);\r\n\r\n                    return BasePreferences;\r\n                }();\r\n\r\n                exports.BasePreferences = BasePreferences;\r\n\r\n                /***/\r\n            }),\r\n        /* 29 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.SecondaryToolbar = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _pdf_cursor_tools = __webpack_require__(6);\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var SecondaryToolbar = function () {\r\n                    function SecondaryToolbar(options, mainContainer, eventBus) {\r\n                        _classCallCheck(this, SecondaryToolbar);\r\n\r\n                        this.toolbar = options.toolbar;\r\n                        this.toggleButton = options.toggleButton;\r\n                        this.toolbarButtonContainer = options.toolbarButtonContainer;\r\n                        this.buttons = [{\r\n                            element: options.presentationModeButton,\r\n                            eventName: 'presentationmode',\r\n                            close: true\r\n                        }, {\r\n                            element: options.openFileButton,\r\n                            eventName: 'openfile',\r\n                            close: true\r\n                        }, {\r\n                            element: options.printButton,\r\n                            eventName: 'print',\r\n                            close: true\r\n                        }, {\r\n                            element: options.downloadButton,\r\n                            eventName: 'download',\r\n                            close: true\r\n                        }, {\r\n                            element: options.viewBookmarkButton,\r\n                            eventName: null,\r\n                            close: true\r\n                        }, {\r\n                            element: options.firstPageButton,\r\n                            eventName: 'firstpage',\r\n                            close: true\r\n                        }, {\r\n                            element: options.lastPageButton,\r\n                            eventName: 'lastpage',\r\n                            close: true\r\n                        }, {\r\n                            element: options.pageRotateCwButton,\r\n                            eventName: 'rotatecw',\r\n                            close: false\r\n                        }, {\r\n                            element: options.pageRotateCcwButton,\r\n                            eventName: 'rotateccw',\r\n                            close: false\r\n                        }, {\r\n                            element: options.cursorSelectToolButton,\r\n                            eventName: 'switchcursortool',\r\n                            eventDetails: { tool: _pdf_cursor_tools.CursorTool.SELECT },\r\n                            close: true\r\n                        }, {\r\n                            element: options.cursorHandToolButton,\r\n                            eventName: 'switchcursortool',\r\n                            eventDetails: { tool: _pdf_cursor_tools.CursorTool.HAND },\r\n                            close: true\r\n                        }, {\r\n                            element: options.documentPropertiesButton,\r\n                            eventName: 'documentproperties',\r\n                            close: true\r\n                        }];\r\n                        this.items = {\r\n                            firstPage: options.firstPageButton,\r\n                            lastPage: options.lastPageButton,\r\n                            pageRotateCw: options.pageRotateCwButton,\r\n                            pageRotateCcw: options.pageRotateCcwButton\r\n                        };\r\n                        this.mainContainer = mainContainer;\r\n                        this.eventBus = eventBus;\r\n                        this.opened = false;\r\n                        this.containerHeight = null;\r\n                        this.previousContainerHeight = null;\r\n                        this.reset();\r\n                        this._bindClickListeners();\r\n                        this._bindCursorToolsListener(options);\r\n                        this.eventBus.on('resize', this._setMaxHeight.bind(this));\r\n                    }\r\n\r\n                    _createClass(SecondaryToolbar, [{\r\n                        key: 'setPageNumber',\r\n                        value: function setPageNumber(pageNumber) {\r\n                            this.pageNumber = pageNumber;\r\n                            this._updateUIState();\r\n                        }\r\n                    }, {\r\n                        key: 'setPagesCount',\r\n                        value: function setPagesCount(pagesCount) {\r\n                            this.pagesCount = pagesCount;\r\n                            this._updateUIState();\r\n                        }\r\n                    }, {\r\n                        key: 'reset',\r\n                        value: function reset() {\r\n                            this.pageNumber = 0;\r\n                            this.pagesCount = 0;\r\n                            this._updateUIState();\r\n                        }\r\n                    }, {\r\n                        key: '_updateUIState',\r\n                        value: function _updateUIState() {\r\n                            this.items.firstPage.disabled = this.pageNumber <= 1;\r\n                            this.items.lastPage.disabled = this.pageNumber >= this.pagesCount;\r\n                            this.items.pageRotateCw.disabled = this.pagesCount === 0;\r\n                            this.items.pageRotateCcw.disabled = this.pagesCount === 0;\r\n                        }\r\n                    }, {\r\n                        key: '_bindClickListeners',\r\n                        value: function _bindClickListeners() {\r\n                            var _this = this;\r\n\r\n                            this.toggleButton.addEventListener('click', this.toggle.bind(this));\r\n\r\n                            var _loop = function _loop(button) {\r\n                                var _buttons$button = _this.buttons[button],\r\n                                    element = _buttons$button.element,\r\n                                    eventName = _buttons$button.eventName,\r\n                                    close = _buttons$button.close,\r\n                                    eventDetails = _buttons$button.eventDetails;\r\n\r\n                                element.addEventListener('click', function (evt) {\r\n                                    if (eventName !== null) {\r\n                                        var details = { source: _this };\r\n                                        for (var property in eventDetails) {\r\n                                            details[property] = eventDetails[property];\r\n                                        }\r\n                                        _this.eventBus.dispatch(eventName, details);\r\n                                    }\r\n                                    if (close) {\r\n                                        _this.close();\r\n                                    }\r\n                                });\r\n                            };\r\n\r\n                            for (var button in this.buttons) {\r\n                                _loop(button);\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_bindCursorToolsListener',\r\n                        value: function _bindCursorToolsListener(buttons) {\r\n                            this.eventBus.on('cursortoolchanged', function (evt) {\r\n                                buttons.cursorSelectToolButton.classList.remove('toggled');\r\n                                buttons.cursorHandToolButton.classList.remove('toggled');\r\n                                switch (evt.tool) {\r\n                                    case _pdf_cursor_tools.CursorTool.SELECT:\r\n                                        buttons.cursorSelectToolButton.classList.add('toggled');\r\n                                        break;\r\n                                    case _pdf_cursor_tools.CursorTool.HAND:\r\n                                        buttons.cursorHandToolButton.classList.add('toggled');\r\n                                        break;\r\n                                }\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'open',\r\n                        value: function open() {\r\n                            if (this.opened) {\r\n                                return;\r\n                            }\r\n                            this.opened = true;\r\n                            this._setMaxHeight();\r\n                            this.toggleButton.classList.add('toggled');\r\n                            this.toolbar.classList.remove('hidden');\r\n                        }\r\n                    }, {\r\n                        key: 'close',\r\n                        value: function close() {\r\n                            if (!this.opened) {\r\n                                return;\r\n                            }\r\n                            this.opened = false;\r\n                            this.toolbar.classList.add('hidden');\r\n                            this.toggleButton.classList.remove('toggled');\r\n                        }\r\n                    }, {\r\n                        key: 'toggle',\r\n                        value: function toggle() {\r\n                            if (this.opened) {\r\n                                this.close();\r\n                            } else {\r\n                                this.open();\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_setMaxHeight',\r\n                        value: function _setMaxHeight() {\r\n                            if (!this.opened) {\r\n                                return;\r\n                            }\r\n                            this.containerHeight = this.mainContainer.clientHeight;\r\n                            if (this.containerHeight === this.previousContainerHeight) {\r\n                                return;\r\n                            }\r\n                            this.toolbarButtonContainer.setAttribute('style', 'max-height: ' + (this.containerHeight - _ui_utils.SCROLLBAR_PADDING) + 'px;');\r\n                            this.previousContainerHeight = this.containerHeight;\r\n                        }\r\n                    }, {\r\n                        key: 'isOpen',\r\n                        get: function get() {\r\n                            return this.opened;\r\n                        }\r\n                    }]);\r\n\r\n                    return SecondaryToolbar;\r\n                }();\r\n\r\n                exports.SecondaryToolbar = SecondaryToolbar;\r\n\r\n                /***/\r\n            }),\r\n        /* 30 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.DefaultTextLayerFactory = exports.TextLayerBuilder = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _dom_events = __webpack_require__(2);\r\n\r\n                var _pdfjsLib = __webpack_require__(1);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var EXPAND_DIVS_TIMEOUT = 300;\r\n\r\n                var TextLayerBuilder = function () {\r\n                    function TextLayerBuilder(_ref) {\r\n                        var textLayerDiv = _ref.textLayerDiv,\r\n                            eventBus = _ref.eventBus,\r\n                            pageIndex = _ref.pageIndex,\r\n                            viewport = _ref.viewport,\r\n                            _ref$findController = _ref.findController,\r\n                            findController = _ref$findController === undefined ? null : _ref$findController,\r\n                            _ref$enhanceTextSelec = _ref.enhanceTextSelection,\r\n                            enhanceTextSelection = _ref$enhanceTextSelec === undefined ? false : _ref$enhanceTextSelec;\r\n\r\n                        _classCallCheck(this, TextLayerBuilder);\r\n\r\n                        this.textLayerDiv = textLayerDiv;\r\n                        this.eventBus = eventBus || (0, _dom_events.getGlobalEventBus)();\r\n                        this.textContent = null;\r\n                        this.textContentItemsStr = [];\r\n                        this.textContentStream = null;\r\n                        this.renderingDone = false;\r\n                        this.pageIdx = pageIndex;\r\n                        this.pageNumber = this.pageIdx + 1;\r\n                        this.matches = [];\r\n                        this.viewport = viewport;\r\n                        this.textDivs = [];\r\n                        this.findController = findController;\r\n                        this.textLayerRenderTask = null;\r\n                        this.enhanceTextSelection = enhanceTextSelection;\r\n                        this._bindMouse();\r\n                    }\r\n\r\n                    _createClass(TextLayerBuilder, [{\r\n                        key: '_finishRendering',\r\n                        value: function _finishRendering() {\r\n                            this.renderingDone = true;\r\n                            if (!this.enhanceTextSelection) {\r\n                                var endOfContent = document.createElement('div');\r\n                                endOfContent.className = 'endOfContent';\r\n                                this.textLayerDiv.appendChild(endOfContent);\r\n                            }\r\n                            this.eventBus.dispatch('textlayerrendered', {\r\n                                source: this,\r\n                                pageNumber: this.pageNumber,\r\n                                numTextDivs: this.textDivs.length\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'render',\r\n                        value: function render() {\r\n                            var _this = this;\r\n\r\n                            var timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\r\n\r\n                            if (!(this.textContent || this.textContentStream) || this.renderingDone) {\r\n                                return;\r\n                            }\r\n                            this.cancel();\r\n                            this.textDivs = [];\r\n                            var textLayerFrag = document.createDocumentFragment();\r\n                            this.textLayerRenderTask = (0, _pdfjsLib.renderTextLayer)({\r\n                                textContent: this.textContent,\r\n                                textContentStream: this.textContentStream,\r\n                                container: textLayerFrag,\r\n                                viewport: this.viewport,\r\n                                textDivs: this.textDivs,\r\n                                textContentItemsStr: this.textContentItemsStr,\r\n                                timeout: timeout,\r\n                                enhanceTextSelection: this.enhanceTextSelection\r\n                            });\r\n                            this.textLayerRenderTask.promise.then(function () {\r\n                                _this.textLayerDiv.appendChild(textLayerFrag);\r\n                                _this._finishRendering();\r\n                                _this.updateMatches();\r\n                            }, function (reason) { });\r\n                        }\r\n                    }, {\r\n                        key: 'cancel',\r\n                        value: function cancel() {\r\n                            if (this.textLayerRenderTask) {\r\n                                this.textLayerRenderTask.cancel();\r\n                                this.textLayerRenderTask = null;\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'setTextContentStream',\r\n                        value: function setTextContentStream(readableStream) {\r\n                            this.cancel();\r\n                            this.textContentStream = readableStream;\r\n                        }\r\n                    }, {\r\n                        key: 'setTextContent',\r\n                        value: function setTextContent(textContent) {\r\n                            this.cancel();\r\n                            this.textContent = textContent;\r\n                        }\r\n                    }, {\r\n                        key: 'convertMatches',\r\n                        value: function convertMatches(matches, matchesLength) {\r\n                            var i = 0;\r\n                            var iIndex = 0;\r\n                            var textContentItemsStr = this.textContentItemsStr;\r\n                            var end = textContentItemsStr.length - 1;\r\n                            var queryLen = this.findController === null ? 0 : this.findController.state.query.length;\r\n                            var ret = [];\r\n                            if (!matches) {\r\n                                return ret;\r\n                            }\r\n                            for (var m = 0, len = matches.length; m < len; m++) {\r\n                                var matchIdx = matches[m];\r\n                                while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) {\r\n                                    iIndex += textContentItemsStr[i].length;\r\n                                    i++;\r\n                                }\r\n                                if (i === textContentItemsStr.length) {\r\n                                    console.error('Could not find a matching mapping');\r\n                                }\r\n                                var match = {\r\n                                    begin: {\r\n                                        divIdx: i,\r\n                                        offset: matchIdx - iIndex\r\n                                    }\r\n                                };\r\n                                if (matchesLength) {\r\n                                    matchIdx += matchesLength[m];\r\n                                } else {\r\n                                    matchIdx += queryLen;\r\n                                }\r\n                                while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) {\r\n                                    iIndex += textContentItemsStr[i].length;\r\n                                    i++;\r\n                                }\r\n                                match.end = {\r\n                                    divIdx: i,\r\n                                    offset: matchIdx - iIndex\r\n                                };\r\n                                ret.push(match);\r\n                            }\r\n                            return ret;\r\n                        }\r\n                    }, {\r\n                        key: 'renderMatches',\r\n                        value: function renderMatches(matches) {\r\n                            if (matches.length === 0) {\r\n                                return;\r\n                            }\r\n                            var textContentItemsStr = this.textContentItemsStr;\r\n                            var textDivs = this.textDivs;\r\n                            var prevEnd = null;\r\n                            var pageIdx = this.pageIdx;\r\n                            var isSelectedPage = this.findController === null ? false : pageIdx === this.findController.selected.pageIdx;\r\n                            var selectedMatchIdx = this.findController === null ? -1 : this.findController.selected.matchIdx;\r\n                            var highlightAll = this.findController === null ? false : this.findController.state.highlightAll;\r\n                            var infinity = {\r\n                                divIdx: -1,\r\n                                offset: undefined\r\n                            };\r\n                            function beginText(begin, className) {\r\n                                var divIdx = begin.divIdx;\r\n                                textDivs[divIdx].textContent = '';\r\n                                appendTextToDiv(divIdx, 0, begin.offset, className);\r\n                            }\r\n                            function appendTextToDiv(divIdx, fromOffset, toOffset, className) {\r\n                                var div = textDivs[divIdx];\r\n                                var content = textContentItemsStr[divIdx].substring(fromOffset, toOffset);\r\n                                var node = document.createTextNode(content);\r\n                                if (className) {\r\n                                    var span = document.createElement('span');\r\n                                    span.className = className;\r\n                                    span.appendChild(node);\r\n                                    div.appendChild(span);\r\n                                    return;\r\n                                }\r\n                                div.appendChild(node);\r\n                            }\r\n                            var i0 = selectedMatchIdx,\r\n                                i1 = i0 + 1;\r\n                            if (highlightAll) {\r\n                                i0 = 0;\r\n                                i1 = matches.length;\r\n                            } else if (!isSelectedPage) {\r\n                                return;\r\n                            }\r\n                            for (var i = i0; i < i1; i++) {\r\n                                var match = matches[i];\r\n                                var begin = match.begin;\r\n                                var end = match.end;\r\n                                var isSelected = isSelectedPage && i === selectedMatchIdx;\r\n                                var highlightSuffix = isSelected ? ' selected' : '';\r\n                                if (this.findController) {\r\n                                    this.findController.updateMatchPosition(pageIdx, i, textDivs, begin.divIdx);\r\n                                }\r\n                                if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {\r\n                                    if (prevEnd !== null) {\r\n                                        appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\r\n                                    }\r\n                                    beginText(begin);\r\n                                } else {\r\n                                    appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);\r\n                                }\r\n                                if (begin.divIdx === end.divIdx) {\r\n                                    appendTextToDiv(begin.divIdx, begin.offset, end.offset, 'highlight' + highlightSuffix);\r\n                                } else {\r\n                                    appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, 'highlight begin' + highlightSuffix);\r\n                                    for (var n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {\r\n                                        textDivs[n0].className = 'highlight middle' + highlightSuffix;\r\n                                    }\r\n                                    beginText(end, 'highlight end' + highlightSuffix);\r\n                                }\r\n                                prevEnd = end;\r\n                            }\r\n                            if (prevEnd) {\r\n                                appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: 'updateMatches',\r\n                        value: function updateMatches() {\r\n                            if (!this.renderingDone) {\r\n                                return;\r\n                            }\r\n                            var matches = this.matches;\r\n                            var textDivs = this.textDivs;\r\n                            var textContentItemsStr = this.textContentItemsStr;\r\n                            var clearedUntilDivIdx = -1;\r\n                            for (var i = 0, len = matches.length; i < len; i++) {\r\n                                var match = matches[i];\r\n                                var begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);\r\n                                for (var n = begin, end = match.end.divIdx; n <= end; n++) {\r\n                                    var div = textDivs[n];\r\n                                    div.textContent = textContentItemsStr[n];\r\n                                    div.className = '';\r\n                                }\r\n                                clearedUntilDivIdx = match.end.divIdx + 1;\r\n                            }\r\n                            if (this.findController === null || !this.findController.active) {\r\n                                return;\r\n                            }\r\n                            var pageMatches = void 0,\r\n                                pageMatchesLength = void 0;\r\n                            if (this.findController !== null) {\r\n                                pageMatches = this.findController.pageMatches[this.pageIdx] || null;\r\n                                pageMatchesLength = this.findController.pageMatchesLength ? this.findController.pageMatchesLength[this.pageIdx] || null : null;\r\n                            }\r\n                            this.matches = this.convertMatches(pageMatches, pageMatchesLength);\r\n                            this.renderMatches(this.matches);\r\n                        }\r\n                    }, {\r\n                        key: '_bindMouse',\r\n                        value: function _bindMouse() {\r\n                            var _this2 = this;\r\n\r\n                            var div = this.textLayerDiv;\r\n                            var expandDivsTimer = null;\r\n                            div.addEventListener('mousedown', function (evt) {\r\n                                if (_this2.enhanceTextSelection && _this2.textLayerRenderTask) {\r\n                                    _this2.textLayerRenderTask.expandTextDivs(true);\r\n                                    if (expandDivsTimer) {\r\n                                        clearTimeout(expandDivsTimer);\r\n                                        expandDivsTimer = null;\r\n                                    }\r\n                                    return;\r\n                                }\r\n                                var end = div.querySelector('.endOfContent');\r\n                                if (!end) {\r\n                                    return;\r\n                                }\r\n                                var adjustTop = evt.target !== div;\r\n                                adjustTop = adjustTop && window.getComputedStyle(end).getPropertyValue('-moz-user-select') !== 'none';\r\n                                if (adjustTop) {\r\n                                    var divBounds = div.getBoundingClientRect();\r\n                                    var r = Math.max(0, (evt.pageY - divBounds.top) / divBounds.height);\r\n                                    end.style.top = (r * 100).toFixed(2) + '%';\r\n                                }\r\n                                end.classList.add('active');\r\n                            });\r\n                            div.addEventListener('mouseup', function () {\r\n                                if (_this2.enhanceTextSelection && _this2.textLayerRenderTask) {\r\n                                    expandDivsTimer = setTimeout(function () {\r\n                                        if (_this2.textLayerRenderTask) {\r\n                                            _this2.textLayerRenderTask.expandTextDivs(false);\r\n                                        }\r\n                                        expandDivsTimer = null;\r\n                                    }, EXPAND_DIVS_TIMEOUT);\r\n                                    return;\r\n                                }\r\n                                var end = div.querySelector('.endOfContent');\r\n                                if (!end) {\r\n                                    return;\r\n                                }\r\n                                end.style.top = '';\r\n                                end.classList.remove('active');\r\n                            });\r\n                        }\r\n                    }]);\r\n\r\n                    return TextLayerBuilder;\r\n                }();\r\n\r\n                var DefaultTextLayerFactory = function () {\r\n                    function DefaultTextLayerFactory() {\r\n                        _classCallCheck(this, DefaultTextLayerFactory);\r\n                    }\r\n\r\n                    _createClass(DefaultTextLayerFactory, [{\r\n                        key: 'createTextLayerBuilder',\r\n                        value: function createTextLayerBuilder(textLayerDiv, pageIndex, viewport) {\r\n                            var enhanceTextSelection = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\r\n\r\n                            return new TextLayerBuilder({\r\n                                textLayerDiv: textLayerDiv,\r\n                                pageIndex: pageIndex,\r\n                                viewport: viewport,\r\n                                enhanceTextSelection: enhanceTextSelection\r\n                            });\r\n                        }\r\n                    }]);\r\n\r\n                    return DefaultTextLayerFactory;\r\n                }();\r\n\r\n                exports.TextLayerBuilder = TextLayerBuilder;\r\n                exports.DefaultTextLayerFactory = DefaultTextLayerFactory;\r\n\r\n                /***/\r\n            }),\r\n        /* 31 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n                exports.Toolbar = undefined;\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                var _ui_utils = __webpack_require__(0);\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var PAGE_NUMBER_LOADING_INDICATOR = 'visiblePageIsLoading';\r\n                var SCALE_SELECT_CONTAINER_PADDING = 8;\r\n                var SCALE_SELECT_PADDING = 22;\r\n\r\n                var Toolbar = function () {\r\n                    function Toolbar(options, mainContainer, eventBus) {\r\n                        var l10n = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _ui_utils.NullL10n;\r\n\r\n                        _classCallCheck(this, Toolbar);\r\n\r\n                        this.toolbar = options.container;\r\n                        this.mainContainer = mainContainer;\r\n                        this.eventBus = eventBus;\r\n                        this.l10n = l10n;\r\n                        this.items = options;\r\n                        this._wasLocalized = false;\r\n                        this.reset();\r\n                        this._bindListeners();\r\n                    }\r\n\r\n                    _createClass(Toolbar, [{\r\n                        key: 'setPageNumber',\r\n                        value: function setPageNumber(pageNumber, pageLabel) {\r\n                            this.pageNumber = pageNumber;\r\n                            this.pageLabel = pageLabel;\r\n                            this._updateUIState(false);\r\n                        }\r\n                    }, {\r\n                        key: 'setPagesCount',\r\n                        value: function setPagesCount(pagesCount, hasPageLabels) {\r\n                            this.pagesCount = pagesCount;\r\n                            this.hasPageLabels = hasPageLabels;\r\n                            this._updateUIState(true);\r\n                        }\r\n                    }, {\r\n                        key: 'setPageScale',\r\n                        value: function setPageScale(pageScaleValue, pageScale) {\r\n                            this.pageScaleValue = pageScaleValue;\r\n                            this.pageScale = pageScale;\r\n                            this._updateUIState(false);\r\n                        }\r\n                    }, {\r\n                        key: 'reset',\r\n                        value: function reset() {\r\n                            this.pageNumber = 0;\r\n                            this.pageLabel = null;\r\n                            this.hasPageLabels = false;\r\n                            this.pagesCount = 0;\r\n                            this.pageScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;\r\n                            this.pageScale = _ui_utils.DEFAULT_SCALE;\r\n                            this._updateUIState(true);\r\n                        }\r\n                    }, {\r\n                        key: '_bindListeners',\r\n                        value: function _bindListeners() {\r\n                            var _this = this;\r\n\r\n                            var eventBus = this.eventBus,\r\n                                items = this.items;\r\n\r\n                            var self = this;\r\n                            items.previous.addEventListener('click', function () {\r\n                                eventBus.dispatch('previouspage');\r\n                            });\r\n                            items.next.addEventListener('click', function () {\r\n                                eventBus.dispatch('nextpage');\r\n                            });\r\n                            items.zoomIn.addEventListener('click', function () {\r\n                                eventBus.dispatch('zoomin');\r\n                            });\r\n                            items.zoomOut.addEventListener('click', function () {\r\n                                eventBus.dispatch('zoomout');\r\n                            });\r\n                            items.pageNumber.addEventListener('click', function () {\r\n                                this.select();\r\n                            });\r\n                            items.pageNumber.addEventListener('change', function () {\r\n                                eventBus.dispatch('pagenumberchanged', {\r\n                                    source: self,\r\n                                    value: this.value\r\n                                });\r\n                            });\r\n                            items.scaleSelect.addEventListener('change', function () {\r\n                                if (this.value === 'custom') {\r\n                                    return;\r\n                                }\r\n                                eventBus.dispatch('scalechanged', {\r\n                                    source: self,\r\n                                    value: this.value\r\n                                });\r\n                            });\r\n                            items.presentationModeButton.addEventListener('click', function () {\r\n                                eventBus.dispatch('presentationmode');\r\n                            });\r\n                            items.openFile.addEventListener('click', function () {\r\n                                eventBus.dispatch('openfile');\r\n                            });\r\n                            items.print.addEventListener('click', function () {\r\n                                eventBus.dispatch('print');\r\n                            });\r\n                            items.download.addEventListener('click', function () {\r\n                                eventBus.dispatch('download');\r\n                            });\r\n                            items.scaleSelect.oncontextmenu = _ui_utils.noContextMenuHandler;\r\n                            eventBus.on('localized', function () {\r\n                                _this._localized();\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: '_localized',\r\n                        value: function _localized() {\r\n                            this._wasLocalized = true;\r\n                            this._adjustScaleWidth();\r\n                            this._updateUIState(true);\r\n                        }\r\n                    }, {\r\n                        key: '_updateUIState',\r\n                        value: function _updateUIState() {\r\n                            var resetNumPages = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\r\n\r\n                            if (!this._wasLocalized) {\r\n                                return;\r\n                            }\r\n                            var pageNumber = this.pageNumber,\r\n                                pagesCount = this.pagesCount,\r\n                                items = this.items;\r\n\r\n                            var scaleValue = (this.pageScaleValue || this.pageScale).toString();\r\n                            var scale = this.pageScale;\r\n                            if (resetNumPages) {\r\n                                if (this.hasPageLabels) {\r\n                                    items.pageNumber.type = 'text';\r\n                                } else {\r\n                                    items.pageNumber.type = 'number';\r\n                                    this.l10n.get('of_pages', { pagesCount: pagesCount }, 'of {{pagesCount}}').then(function (msg) {\r\n                                        items.numPages.textContent = msg;\r\n                                    });\r\n                                }\r\n                                items.pageNumber.max = pagesCount;\r\n                            }\r\n                            if (this.hasPageLabels) {\r\n                                items.pageNumber.value = this.pageLabel;\r\n                                this.l10n.get('page_of_pages', {\r\n                                    pageNumber: pageNumber,\r\n                                    pagesCount: pagesCount\r\n                                }, '({{pageNumber}} of {{pagesCount}})').then(function (msg) {\r\n                                    items.numPages.textContent = msg;\r\n                                });\r\n                            } else {\r\n                                items.pageNumber.value = pageNumber;\r\n                            }\r\n                            items.previous.disabled = pageNumber <= 1;\r\n                            items.next.disabled = pageNumber >= pagesCount;\r\n                            items.zoomOut.disabled = scale <= _ui_utils.MIN_SCALE;\r\n                            items.zoomIn.disabled = scale >= _ui_utils.MAX_SCALE;\r\n                            var customScale = Math.round(scale * 10000) / 100;\r\n                            this.l10n.get('page_scale_percent', { scale: customScale }, '{{scale}}%').then(function (msg) {\r\n                                var options = items.scaleSelect.options;\r\n                                var predefinedValueFound = false;\r\n                                for (var i = 0, ii = options.length; i < ii; i++) {\r\n                                    var option = options[i];\r\n                                    if (option.value !== scaleValue) {\r\n                                        option.selected = false;\r\n                                        continue;\r\n                                    }\r\n                                    option.selected = true;\r\n                                    predefinedValueFound = true;\r\n                                }\r\n                                if (!predefinedValueFound) {\r\n                                    items.customScaleOption.textContent = msg;\r\n                                    items.customScaleOption.selected = true;\r\n                                }\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'updateLoadingIndicatorState',\r\n                        value: function updateLoadingIndicatorState() {\r\n                            var loading = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\r\n\r\n                            var pageNumberInput = this.items.pageNumber;\r\n                            if (loading) {\r\n                                pageNumberInput.classList.add(PAGE_NUMBER_LOADING_INDICATOR);\r\n                            } else {\r\n                                pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR);\r\n                            }\r\n                        }\r\n                    }, {\r\n                        key: '_adjustScaleWidth',\r\n                        value: function _adjustScaleWidth() {\r\n                            var container = this.items.scaleSelectContainer;\r\n                            var select = this.items.scaleSelect;\r\n                            _ui_utils.animationStarted.then(function () {\r\n                                if (container.clientWidth === 0) {\r\n                                    container.setAttribute('style', 'display: inherit;');\r\n                                }\r\n                                if (container.clientWidth > 0) {\r\n                                    select.setAttribute('style', 'min-width: inherit;');\r\n                                    var width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING;\r\n                                    select.setAttribute('style', 'min-width: ' + (width + SCALE_SELECT_PADDING) + 'px;');\r\n                                    container.setAttribute('style', 'min-width: ' + width + 'px; ' + 'max-width: ' + width + 'px;');\r\n                                }\r\n                            });\r\n                        }\r\n                    }]);\r\n\r\n                    return Toolbar;\r\n                }();\r\n\r\n                exports.Toolbar = Toolbar;\r\n\r\n                /***/\r\n            }),\r\n        /* 32 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                Object.defineProperty(exports, \"__esModule\", {\r\n                    value: true\r\n                });\r\n\r\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n                var DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20;\r\n\r\n                var ViewHistory = function () {\r\n                    function ViewHistory(fingerprint) {\r\n                        var _this = this;\r\n\r\n                        var cacheSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_VIEW_HISTORY_CACHE_SIZE;\r\n\r\n                        _classCallCheck(this, ViewHistory);\r\n\r\n                        this.fingerprint = fingerprint;\r\n                        this.cacheSize = cacheSize;\r\n                        this._initializedPromise = this._readFromStorage().then(function (databaseStr) {\r\n                            var database = JSON.parse(databaseStr || '{}');\r\n                            if (!('files' in database)) {\r\n                                database.files = [];\r\n                            }\r\n                            if (database.files.length >= _this.cacheSize) {\r\n                                database.files.shift();\r\n                            }\r\n                            var index = void 0;\r\n                            for (var i = 0, length = database.files.length; i < length; i++) {\r\n                                var branch = database.files[i];\r\n                                if (branch.fingerprint === _this.fingerprint) {\r\n                                    index = i;\r\n                                    break;\r\n                                }\r\n                            }\r\n                            if (typeof index !== 'number') {\r\n                                index = database.files.push({ fingerprint: _this.fingerprint }) - 1;\r\n                            }\r\n                            _this.file = database.files[index];\r\n                            _this.database = database;\r\n                        });\r\n                    }\r\n\r\n                    _createClass(ViewHistory, [{\r\n                        key: '_writeToStorage',\r\n                        value: function _writeToStorage() {\r\n                            var _this2 = this;\r\n\r\n                            return new Promise(function (resolve) {\r\n                                var databaseStr = JSON.stringify(_this2.database);\r\n                                localStorage.setItem('pdfjs.history', databaseStr);\r\n                                resolve();\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: '_readFromStorage',\r\n                        value: function _readFromStorage() {\r\n                            return new Promise(function (resolve) {\r\n                                var value = localStorage.getItem('pdfjs.history');\r\n                                if (!value) {\r\n                                    var databaseStr = localStorage.getItem('database');\r\n                                    if (databaseStr) {\r\n                                        try {\r\n                                            var database = JSON.parse(databaseStr);\r\n                                            if (typeof database.files[0].fingerprint === 'string') {\r\n                                                localStorage.setItem('pdfjs.history', databaseStr);\r\n                                                localStorage.removeItem('database');\r\n                                                value = databaseStr;\r\n                                            }\r\n                                        } catch (ex) { }\r\n                                    }\r\n                                }\r\n                                resolve(value);\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'set',\r\n                        value: function set(name, val) {\r\n                            var _this3 = this;\r\n\r\n                            return this._initializedPromise.then(function () {\r\n                                _this3.file[name] = val;\r\n                                return _this3._writeToStorage();\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'setMultiple',\r\n                        value: function setMultiple(properties) {\r\n                            var _this4 = this;\r\n\r\n                            return this._initializedPromise.then(function () {\r\n                                for (var name in properties) {\r\n                                    _this4.file[name] = properties[name];\r\n                                }\r\n                                return _this4._writeToStorage();\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'get',\r\n                        value: function get(name, defaultValue) {\r\n                            var _this5 = this;\r\n\r\n                            return this._initializedPromise.then(function () {\r\n                                var val = _this5.file[name];\r\n                                return val !== undefined ? val : defaultValue;\r\n                            });\r\n                        }\r\n                    }, {\r\n                        key: 'getMultiple',\r\n                        value: function getMultiple(properties) {\r\n                            var _this6 = this;\r\n\r\n                            return this._initializedPromise.then(function () {\r\n                                var values = Object.create(null);\r\n                                for (var name in properties) {\r\n                                    var val = _this6.file[name];\r\n                                    values[name] = val !== undefined ? val : properties[name];\r\n                                }\r\n                                return values;\r\n                            });\r\n                        }\r\n                    }]);\r\n\r\n                    return ViewHistory;\r\n                }();\r\n\r\n                exports.ViewHistory = ViewHistory;\r\n\r\n                /***/\r\n            }),\r\n        /* 33 */\r\n        /***/ (function (module, exports, __webpack_require__) {\r\n\r\n                \"use strict\";\r\n\r\n\r\n                var DEFAULT_URL = my_pdf_file;\r\n                ;\r\n                var pdfjsWebApp = void 0;\r\n                {\r\n                    pdfjsWebApp = __webpack_require__(4);\r\n                }\r\n                ;\r\n                {\r\n                    __webpack_require__(8);\r\n                }\r\n                ;\r\n                {\r\n                    __webpack_require__(9);\r\n                }\r\n                function getViewerConfiguration() {\r\n                    return {\r\n                        appContainer: document.body,\r\n                        mainContainer: document.getElementById('viewerContainer'),\r\n                        viewerContainer: document.getElementById('viewer'),\r\n                        eventBus: null,\r\n                        toolbar: {\r\n                            container: document.getElementById('toolbarViewer'),\r\n                            numPages: document.getElementById('numPages'),\r\n                            pageNumber: document.getElementById('pageNumber'),\r\n                            scaleSelectContainer: document.getElementById('scaleSelectContainer'),\r\n                            scaleSelect: document.getElementById('scaleSelect'),\r\n                            customScaleOption: document.getElementById('customScaleOption'),\r\n                            previous: document.getElementById('previous'),\r\n                            next: document.getElementById('next'),\r\n                            zoomIn: document.getElementById('zoomIn'),\r\n                            zoomOut: document.getElementById('zoomOut'),\r\n                            viewFind: document.getElementById('viewFind'),\r\n                            openFile: document.getElementById('openFile'),\r\n                            print: document.getElementById('print'),\r\n                            presentationModeButton: document.getElementById('presentationMode'),\r\n                            download: document.getElementById('download'),\r\n                            viewBookmark: document.getElementById('viewBookmark')\r\n                        },\r\n                        secondaryToolbar: {\r\n                            toolbar: document.getElementById('secondaryToolbar'),\r\n                            toggleButton: document.getElementById('secondaryToolbarToggle'),\r\n                            toolbarButtonContainer: document.getElementById('secondaryToolbarButtonContainer'),\r\n                            presentationModeButton: document.getElementById('secondaryPresentationMode'),\r\n                            openFileButton: document.getElementById('secondaryOpenFile'),\r\n                            printButton: document.getElementById('secondaryPrint'),\r\n                            downloadButton: document.getElementById('secondaryDownload'),\r\n                            viewBookmarkButton: document.getElementById('secondaryViewBookmark'),\r\n                            firstPageButton: document.getElementById('firstPage'),\r\n                            lastPageButton: document.getElementById('lastPage'),\r\n                            pageRotateCwButton: document.getElementById('pageRotateCw'),\r\n                            pageRotateCcwButton: document.getElementById('pageRotateCcw'),\r\n                            cursorSelectToolButton: document.getElementById('cursorSelectTool'),\r\n                            cursorHandToolButton: document.getElementById('cursorHandTool'),\r\n                            documentPropertiesButton: document.getElementById('pdfDocumentProperties')\r\n                        },\r\n                        fullscreen: {\r\n                            contextFirstPage: document.getElementById('contextFirstPage'),\r\n                            contextLastPage: document.getElementById('contextLastPage'),\r\n                            contextPageRotateCw: document.getElementById('contextPageRotateCw'),\r\n                            contextPageRotateCcw: document.getElementById('contextPageRotateCcw')\r\n                        },\r\n                        sidebar: {\r\n                            mainContainer: document.getElementById('mainContainer'),\r\n                            outerContainer: document.getElementById('outerContainer'),\r\n                            toggleButton: document.getElementById('sidebarToggle'),\r\n                            thumbnailButton: document.getElementById('viewThumbnail'),\r\n                            outlineButton: document.getElementById('viewOutline'),\r\n                            attachmentsButton: document.getElementById('viewAttachments'),\r\n                            thumbnailView: document.getElementById('thumbnailView'),\r\n                            outlineView: document.getElementById('outlineView'),\r\n                            attachmentsView: document.getElementById('attachmentsView')\r\n                        },\r\n                        findBar: {\r\n                            bar: document.getElementById('findbar'),\r\n                            toggleButton: document.getElementById('viewFind'),\r\n                            findField: document.getElementById('findInput'),\r\n                            highlightAllCheckbox: document.getElementById('findHighlightAll'),\r\n                            caseSensitiveCheckbox: document.getElementById('findMatchCase'),\r\n                            findMsg: document.getElementById('findMsg'),\r\n                            findResultsCount: document.getElementById('findResultsCount'),\r\n                            findStatusIcon: document.getElementById('findStatusIcon'),\r\n                            findPreviousButton: document.getElementById('findPrevious'),\r\n                            findNextButton: document.getElementById('findNext')\r\n                        },\r\n                        passwordOverlay: {\r\n                            overlayName: 'passwordOverlay',\r\n                            container: document.getElementById('passwordOverlay'),\r\n                            label: document.getElementById('passwordText'),\r\n                            input: document.getElementById('password'),\r\n                            submitButton: document.getElementById('passwordSubmit'),\r\n                            cancelButton: document.getElementById('passwordCancel')\r\n                        },\r\n                        pdfDocumentProperties: {\r\n                            overlayName: 'documentPropertiesOverlay',\r\n                            container: document.getElementById('documentPropertiesOverlay'),\r\n                            closeButton: document.getElementById('documentPropertiesClose'),\r\n                            fields: {\r\n                                'fileName': document.getElementById('fileNameField'),\r\n                                'fileSize': document.getElementById('fileSizeField'),\r\n                                'title': document.getElementById('titleField'),\r\n                                'author': document.getElementById('authorField'),\r\n                                'subject': document.getElementById('subjectField'),\r\n                                'keywords': document.getElementById('keywordsField'),\r\n                                'creationDate': document.getElementById('creationDateField'),\r\n                                'modificationDate': document.getElementById('modificationDateField'),\r\n                                'creator': document.getElementById('creatorField'),\r\n                                'producer': document.getElementById('producerField'),\r\n                                'version': document.getElementById('versionField'),\r\n                                'pageCount': document.getElementById('pageCountField')\r\n                            }\r\n                        },\r\n                        errorWrapper: {\r\n                            container: document.getElementById('errorWrapper'),\r\n                            errorMessage: document.getElementById('errorMessage'),\r\n                            closeButton: document.getElementById('errorClose'),\r\n                            errorMoreInfo: document.getElementById('errorMoreInfo'),\r\n                            moreInfoButton: document.getElementById('errorShowMore'),\r\n                            lessInfoButton: document.getElementById('errorShowLess')\r\n                        },\r\n                        printContainer: document.getElementById('printContainer'),\r\n                        openFileInputName: 'fileInput',\r\n                        debuggerScriptPath: './debugger.js',\r\n                        defaultUrl: DEFAULT_URL\r\n                    };\r\n                }\r\n                function webViewerLoad() {\r\n                    var config = getViewerConfiguration();\r\n                    window.PDFViewerApplication = pdfjsWebApp.PDFViewerApplication;\r\n                    pdfjsWebApp.PDFViewerApplication.run(config);\r\n                }\r\n                if (document.readyState === 'interactive' || document.readyState === 'complete') {\r\n                    webViewerLoad();\r\n                } else {\r\n                    document.addEventListener('DOMContentLoaded', webViewerLoad, true);\r\n                }\r\n\r\n                /***/\r\n            })\r\n        /******/]);\r\n        //# sourceMappingURL=viewer.js.map\r\n\r\n        // open a file in the viewer\r\n        // The workerSrc property shall be specified.\r\n        //PDFJS.workerSrc = './Content/pdfViewer/pdf.worker.js';\r\n        /*\r\n        var file = fObj.Obj;\r\n\r\n        scale = 0.5||pdfSet.pdfScale;\r\n\r\n        PDFJS.disableWorker = true;\r\n        PDFJS.getDocument(file).then(function(pdfDoc){\r\n            for(var num = 1; num <= pdfDoc.numPages; num++){\r\n                pdfDoc.getPage(num).then(function(page){\r\n                    var viewport = page.getViewport(scale); //options.scale\r\n                    var canvas = document.createElement('canvas');\r\n                    var ctx = canvas.getContext('2d');\r\n                    var renderContext = {\r\n                    canvasContext: ctx,\r\n                    viewport: viewport\r\n                    };\r\n                    \r\n                    canvas.height = viewport.height;\r\n                    canvas.width = viewport.width;\r\n                    $(\"#\"+divId + \" #viewer\").append(canvas);\r\n                    \r\n                    page.render(renderContext);\r\n                });\r\n            }\r\n        });\r\n        */\r\n        return true;\r\n    }\r\n    /////////////////////////////////////////////////Docx//////////////////////////////////////////\r\n    function getDocxContent(fObj, divId, docxSet) {\r\n\r\n        $(\"#\" + divId).html(\"\");\r\n        var file = fObj.Obj;\r\n        var mammothOptions = {\r\n            styleMap: docxSet.styleMap,\r\n            includeEmbeddedStyleMap: docxSet.includeEmbeddedStyleMap,\r\n            includeDefaultStyleMap: docxSet.includeDefaultStyleMap,\r\n            convertImage: docxSet.convertImage,\r\n            ignoreEmptyParagraphs: docxSet.ignoreEmptyParagraphs,\r\n            idPrefix: docxSet.idPrefix,\r\n            isRtl: docxSet.isRtl\r\n        };\r\n        JSZipUtils.getBinaryContent(file, function (err, content) {\r\n            mammoth.convertToHtml({ arrayBuffer: content }, mammothOptions)\r\n                .then(displayResult)\r\n                .done();\r\n        });\r\n\r\n        function displayResult(result) {\r\n            var isRtl = mammothOptions.isRtl;\r\n            var rslt = result.value;\r\n            if (isRtl == \"auto\") {\r\n                var position = rslt.search(/[\\u0590-\\u05FF]/);\r\n                if (position >= 0) {\r\n                    $('#' + divId).attr(\"dir\", \"rtl\");\r\n                } else {\r\n                    $('#' + divId).attr(\"dir\", \"ltr\");\r\n                }\r\n            } else if (isRtl === true) {\r\n                $('#' + divId).attr(\"dir\", \"rtl\");\r\n            } else if (isRtl === false) {\r\n                $('#' + divId).attr(\"dir\", \"ltr\");\r\n            }\r\n            $('#' + divId).html(rslt);\r\n            if (result.messages != \"\") {\r\n                var messageHtml = result.messages.map(function (message) {\r\n                    return message.type + ': ' + message.message + \"\\n\";\r\n                }).join(\"\");\r\n\r\n                console.log(\"Docx viewer Messages: \\n\" + messageHtml + \"\\n\");\r\n            }\r\n\r\n        }\r\n        return true;\r\n    }\r\n    /////////////////////////////////////////////////doc//////////////////////////////////////////\r\n    function getDocContent(fObj, divId, docxSet) {\r\n\r\n        $(\"#\" + divId).html(\"\");\r\n        var file = fObj.Obj;\r\n\r\n        var ran5 = 10000 + Math.round(Math.floor() * 90000);\r\n        var subDiv = $('<div/>').attr({ class: 'doc_files', id: \"doc_file_\" + ran5, style: \"color:#9d9999;font-size:30pt\" });\r\n        $(\"#\" + divId).append(subDiv);\r\n        $(\"#doc_file_\" + ran5).html(\".doc file is not supported, convert it to .docx file\");\r\n        return\r\n    }\r\n    /////////////////////////////////////////////////pptx//////////////////////////////////////////\r\n    function getPptxContent(fObj, divId, pptxSet) {\r\n\r\n        $(\"#\" + divId).html(\"\");\r\n\r\n        //console.log(fObj,divId);\r\n        var file = fObj.Obj;\r\n        $(\"#\" + divId).pptxToHtml({\r\n            pptxFileUrl: file,\r\n            slidesScale: pptxSet.slidesScale, //Change Slides scale by percent\r\n            slideMode: pptxSet.slideMode, /** true,false*/\r\n            keyBoardShortCut: pptxSet.keyBoardShortCut,  /** true,false ,condition: slideMode: true XXXXX - need to remove - this is doublcated*/\r\n            mediaProcess: pptxSet.mediaProcess, /** true,false: if true then process video and audio files */\r\n            jsZipV2: pptxSet.jsZipV2,\r\n            slideModeConfig: {\r\n                first: pptxSet.slideModeConfig.first,\r\n                nav: pptxSet.slideModeConfig.nav, /** true,false : show or not nav buttons*/\r\n                navTxtColor: pptxSet.slideModeConfig.navTxtColor, /** color */\r\n                keyBoardShortCut: pptxSet.slideModeConfig.keyBoardShortCut, /** true,false ,condition: */\r\n                showSlideNum: pptxSet.slideModeConfig.showSlideNum, /** true,false */\r\n                showTotalSlideNum: pptxSet.slideModeConfig.showTotalSlideNum, /** true,false */\r\n                autoSlide: pptxSet.slideModeConfig.autoSlide, /** false or seconds , F8 to active ,keyBoardShortCut: true */\r\n                randomAutoSlide: pptxSet.slideModeConfig.randomAutoSlide, /** true,false ,autoSlide:true */\r\n                loop: pptxSet.slideModeConfig.loop,  /** true,false */\r\n                background: pptxSet.slideModeConfig.background, /** false or color*/\r\n                transition: pptxSet.slideModeConfig.transition, /** transition type: \"slid\",\"fade\",\"default\",\"random\" , to show transition efects :transitionTime > 0.5 */\r\n                transitionTime: pptxSet.slideModeConfig.transitionTime /** transition time between slides in seconds */\r\n            }\r\n        });\r\n        return true;\r\n    }\r\n    /////////////////////////////////////////////////ppt//////////////////////////////////////////\r\n    function getPptContent(fObj, divId, pptxSet) {\r\n\r\n        $(\"#\" + divId).html(\"\");\r\n        var file = fObj.Obj;\r\n\r\n        var ran5 = 10000 + Math.round(Math.floor() * 90000);\r\n        var subDiv = $('<div/>').attr({ class: 'ppt_files', id: \"ppt_file_\" + ran5, style: \"color:#9d9999;font-size:30pt\" });\r\n        $(\"#\" + divId).append(subDiv);\r\n        $(\"#ppt_file_\" + ran5).html(\".ppt file is not supported, convert it to .pptx file\");\r\n\r\n        return true;\r\n    }\r\n    /////////////////////////////////////////////////Sheet//////////////////////////////////////////\r\n    function getSheetContent(fObj, divId, sheetSet) {\r\n\r\n\r\n        if (jQuery.ui === undefined && sheetSet.jqueryui) {\r\n            console.log(\"You set jqueryui as true , but you not included jquery-ui.js and jquery-ui.css\");\r\n            sheetSet.jqueryui = false;\r\n        }\r\n        if (jQuery.ui && sheetSet.jqueryui) {\r\n            $(\".\" + divId + \"_clas\").tabs(\"destroy\");\r\n        }\r\n\r\n        var file = fObj.Obj;\r\n\r\n        var $container, availableWidth, availableHeight;\r\n\r\n        var hot, hot_ary = [];\r\n\r\n        $container = $(\"#\" + divId);\r\n        $container.addClass(divId + \"_clas\");\r\n        $container.addClass(\"wbSheets_clas\");\r\n\r\n        if (sheetSet.search) {\r\n            $(\"<div></div>\", {\r\n                id: \"wbSheets_search_warpper\"\r\n            }).appendTo('#' + divId);\r\n            $(\"<input/>\", {\r\n                id: \"wbSheets_search_field\",\r\n                type: \"text\",\r\n                placeholder: \"Search...\",\r\n                style: \"border-radius: 5px; width:20%;\"\r\n            }).appendTo('#' + divId + \" #wbSheets_search_warpper\");\r\n\r\n            $(\"<hr>\", {\r\n            }).appendTo('#' + divId);\r\n        }\r\n        //function process_wb(wb) {\r\n        //}\r\n        var url = file;\r\n\r\n        var req = new XMLHttpRequest();\r\n        req.open(\"GET\", url, true);\r\n        req.responseType = \"arraybuffer\";\r\n        req.onload = function (e) {\r\n            var data = new Uint8Array(req.response);\r\n            var wb = XLSX.read(data, { type: \"array\" });\r\n            var sheetNames = wb.SheetNames;\r\n            $container.append('<ul class=\"wbSheets_clas_ul\">');\r\n            var li_container = \"\";\r\n            sheetNames.forEach(function (sheetName, idx) {\r\n                var subDivId = 'wbSheets_' + idx;\r\n                var slcted = \"\";\r\n                if (!sheetSet.jqueryui && idx == 0) {\r\n                    slcted = \"selected\"\r\n                }\r\n                $(\"#\" + divId + \" ul\").append('<li class = \"' + slcted + '\"><a href=\"#' + subDivId + '\">' + sheetName + '</a></li>');\r\n            });\r\n            sheetNames.forEach(function (sheetName, idx) {\r\n                var subDivId = 'wbSheets_' + idx;\r\n                var json = XLSX.utils.sheet_to_json(wb.Sheets[sheetName], { header: 1 });\r\n                var dsply = \"\";\r\n                if (!sheetSet.jqueryui) {\r\n                    if (idx == 0) {\r\n                        dsply = \"display:block;\";\r\n                    } else {\r\n                        dsply = \"display:none;\";\r\n                    }\r\n                }\r\n                var subDiv = $('<div/>').attr({\r\n                    class: 'wbSheets',\r\n                    id: subDivId,\r\n                    style: dsply\r\n                });\r\n                $container.append(subDiv);\r\n                //availableWidth = Math.max(subDiv.width(),600);\r\n                //availableHeight = Math.max(subDiv.height(), 500);\r\n                availableWidth = $container.width() - 20;\r\n                availableHeight = $container.height() - ((sheetSet.search) ? 90 : 50);\r\n                /* add header row for table */\r\n                if (!json) json = [];\r\n                json.forEach(function (r) {\r\n                    //must \"...,{header:1}\"\r\n                    if (json[0].length < r.length) json[0].length = r.length;\r\n                });\r\n                //console.log(json)\r\n                var container = document.getElementById(subDivId);\r\n                hot = new Handsontable(container, {\r\n                    data: json,\r\n                    activeHeaderClassName: sheetSet.activeHeaderClassName,\r\n                    allowEmpty: sheetSet.allowEmpty,\r\n                    autoColumnSize: sheetSet.autoColumnSize,\r\n                    autoRowSize: sheetSet.autoRowSize,\r\n                    columns: sheetSet.columns,\r\n                    columnSorting: sheetSet.columnSorting,\r\n                    contextMenu: sheetSet.contextMenu,\r\n                    copyable: sheetSet.copyable,\r\n                    fixedColumnsLeft: sheetSet.fixedColumnsLeft,\r\n                    fixedRowsTop: sheetSet.fixedRowsTop,\r\n                    language: sheetSet.language,\r\n                    search: sheetSet.search,\r\n                    selectionMode: sheetSet.selectionMode,\r\n                    sortIndicator: sheetSet.sortIndicator,\r\n                    readOnly: sheetSet.readOnly,\r\n                    startRows: sheetSet.startRows,\r\n                    startCols: sheetSet.startCols,\r\n                    rowHeaders: sheetSet.rowHeaders,\r\n                    colHeaders: sheetSet.colHeaders,\r\n                    width: (!sheetSet.width) ? availableWidth : sheetSet.width,\r\n                    height: (!sheetSet.height) ? availableHeight : sheetSet.height\r\n                });\r\n                hot_ary.push(hot);\r\n            });\r\n\r\n            if (jQuery.ui && sheetSet.jqueryui) {\r\n                $(\".\" + divId + \"_clas\").tabs();\r\n            } else {\r\n                $(\".\" + divId + \"_clas li\").click(function (e) {\r\n                    e.preventDefault();\r\n                    $(\".\" + divId + \"_clas li\").removeClass(\"selected\");\r\n                    $(this).addClass(\"selected\");\r\n                    var hrf = $($(this)[0].firstChild).attr(\"href\").substr(1);\r\n                    $(\".\" + divId + \"_clas .wbSheets\").hide();\r\n                    $(\".\" + divId + \"_clas #\" + hrf).show();\r\n                });\r\n            }\r\n            if (sheetSet.search) {\r\n                var searchFiled = document.getElementById('wbSheets_search_field');\r\n                Handsontable.dom.addEvent(searchFiled, 'keyup', function (event) {\r\n                    var srch_txt = this.value;\r\n                    hot_ary.forEach(function (hot_val) {\r\n                        var search = hot_val.getPlugin('search');\r\n                        var queryResult = search.query(srch_txt);\r\n                        hot_val.render();\r\n                    })\r\n                });\r\n\r\n            }\r\n            //$(\".\"+divId+\"_clas\").tabs(\"refresh\");\r\n            /*\r\n            availableWidth = $container.width()-105;\r\n            availableHeight = $container.height()-70;\r\n           $(\".\"+divId+\"_clas .wbSheets .ht_master .wtHolder\").css({\r\n                width: availableWidth,\r\n                height:availableHeight\r\n           });\r\n           $(\".\"+divId+\"_clas .wbSheets .ht_master .wtHolder\").on(\"scroll\",function(){\r\n               \r\n                $(\".\"+divId+\"_clas .wbSheets .ht_master .wtHolder\").css({\r\n                    width: availableWidth,\r\n                    height:availableHeight\r\n                });\r\n           })\r\n           */\r\n        };\r\n        req.send();\r\n        return true;\r\n    }\r\n    /////////////////////////////////////////////////Images//////////////////////////////////////////\r\n    function getImgContent(fObj, divId, imgSet) {\r\n\r\n        $(\"#\" + divId).html(\"\");\r\n        var file = fObj.Obj;\r\n\r\n        var img_div = $(\"#\" + divId);\r\n        $(\"#\" + divId).verySimpleImageViewer({\r\n            imageSource: file,\r\n            frame: imgSet.frame,\r\n            maxZoom: imgSet.maxZoom,\r\n            zoomFactor: imgSet.zoomFactor,\r\n            mouse: imgSet.mouse,\r\n            keyboard: imgSet.keyboard,\r\n            toolbar: imgSet.toolbar,\r\n            rotateToolbar: imgSet.rotateToolbar\r\n        });\r\n        return true;\r\n    }\r\n    /////////////////////////////////////////////////Unknown file//////////////////////////////////////////\r\n    function unknownMsg(divId) {\r\n\r\n        $(\"#\" + divId).html(\"\");\r\n\r\n        var ran5 = 10000 + Math.round(Math.floor() * 90000);\r\n        var subDiv = $('<div/>').attr({ class: 'unknown_files', id: \"unknown_file_\" + ran5, style: \"color:#9d9999;font-size:30pt\" });\r\n        $(\"#\" + divId).append(subDiv);\r\n        $(\"#unknown_file_\" + ran5).html(\"The file is not supported!\");\r\n        return true;\r\n    }\r\n}(jQuery));"
  },
  {
    "path": "pages/demos.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n\r\n<head>\r\n  <title>OfficeJs | Demos </title>\r\n  <meta charset=\"utf-8\">\r\n  <link href=\"./layout/styles/layout.css\" rel=\"stylesheet\" type=\"text/css\">\r\n  <link rel=\"stylesheet\" href=\"./include/jquery_ui/themes/start/jquery-ui.min.css\">\r\n  <script src=\"./include/jquery/jquery-1.12.4.min.js\"></script>\r\n  <script src=\"./include/jquery_ui/jquery-ui.min.js\"></script>\r\n  <!-- ################################ For files reder ###############################-->\r\n  <!--PDF-->\r\n  <link rel=\"stylesheet\" href=\"./include/pdf/pdf.viewer.css\">\r\n  <script src=\"./include/pdf/pdf.js\"></script>\r\n  <!--Docs-->\r\n  <script src=\"./include/docx/jszip-utils.js\"></script>\r\n  <script src=\"./include/docx/mammoth.browser.min.js\"></script>\r\n  <!--PPTX-->\r\n  <link rel=\"stylesheet\" href=\"./include/PPTXjs/css/pptxjs.css\">\r\n  <link rel=\"stylesheet\" href=\"./include/PPTXjs/css/nv.d3.min.css\">\r\n  <link rel=\"stylesheet\" href=\"./include/revealjs/reveal.css\">\r\n\r\n  <script type=\"text/javascript\" src=\"./include/PPTXjs/js/filereader.js\"></script>\r\n  <script type=\"text/javascript\" src=\"./include/PPTXjs/js/d3.min.js\"></script>\r\n  <script type=\"text/javascript\" src=\"./include/PPTXjs/js/nv.d3.min.js\"></script>\r\n  <script type=\"text/javascript\" src=\"./include/PPTXjs/js/pptxjs.js\"></script>\r\n  <script type=\"text/javascript\" src=\"./include/PPTXjs/js/divs2slides.js\"></script>\r\n  <!--All Spreadsheet -->\r\n  <link rel=\"stylesheet\" href=\"./include/SheetJS/handsontable.full.min.css\">\r\n  <script type=\"text/javascript\" src=\"./include/SheetJS/handsontable.full.min.js\"></script>\r\n  <script type=\"text/javascript\" src=\"./include/SheetJS/xlsx.full.min.js\"></script>\r\n  <!--Image viewer-->\r\n  <link rel=\"stylesheet\" href=\"./include/verySimpleImageViewer/css/jquery.verySimpleImageViewer.css\">\r\n  <script type=\"text/javascript\" src=\"./include/verySimpleImageViewer/js/jquery.verySimpleImageViewer.js\"></script>\r\n  <!--officeToHtml-->\r\n  <script src=\"../officeToHtml.js\"></script>\r\n  <link rel=\"stylesheet\" href=\"../officeToHtml.css\">\r\n</head>\r\n\r\n<body id=\"top\">\r\n  <div class=\"wrapper row1\">\r\n    <header id=\"header\" class=\"hoc clear\">\r\n      <div id=\"logo\" class=\"fl_left\">\r\n        <h1><a href=\"../index.html\">Office To Html - Demos</a></h1>\r\n      </div>\r\n      <nav id=\"mainav\" class=\"fl_right\">\r\n        <ul class=\"clear\">\r\n          <li><a href=\"../index.html\">Home</a></li>\r\n          <li><a href=\"docs.html\">Docs</a></li>\r\n          <li class=\"active\"><a href=\"demos.html\">Demos</a></li>\r\n          <li><a href=\"https://github.com/meshesha/officeToHtml\">GitHub</a></li>\r\n          <li><a href=\"https://github.com/meshesha\">About</a></li>\r\n        </ul>\r\n      </nav>\r\n    </header>\r\n  </div>\r\n  <div class=\"wrapper row3\">\r\n    <main class=\"hoc container clear\">\r\n      <!-- main body -->\r\n      <div class=\"sidebar one_quarter first\">\r\n        <nav class=\"sdb_holder\">\r\n          <ul>\r\n            <li class=\"active\"><a href=\"demos.html\">Demos - Main</a></li>\r\n            <ul>\r\n              <li><a href=\"#\" id=\"demo_1\" class=\"demos\" data-file=\"demo.docx\">Demo1 - docx</a></li>\r\n              <li><a href=\"#\" id=\"demo_2\" class=\"demos\" data-file=\"demo.pptx\">Demo2 - pptx</a></li>\r\n              <li><a href=\"#\" id=\"demo_3\" class=\"demos\" data-file=\"demo.xlsx\">Demo3 - xlsx</a></li>\r\n              <li><a href=\"#\" id=\"demo_4\" class=\"demos\" data-file=\"demo.pdf\">Demo4 - pdf</a></li>\r\n              <li><a href=\"#\" id=\"demo_5\" class=\"demos\" data-file=\"demo.jpg\">Demo4 - image</a></li>\r\n              <li><a href=\"#\" id=\"demo_input\" class=\"demos\" data-file=\"\">Demo5 - Input</a></li>\r\n            </ul>\r\n          </ul>\r\n        </nav>\r\n      </div>\r\n      <!-- ################################################################################################ -->\r\n      <div class=\"content three_quarter\">\r\n        <div class=\"box bg-light clear\">\r\n          <h3 class=\"font-x2\" id=\"head-name\">Demos - Main</h3>\r\n          <p id=\"file_p\" style=\"display:none;\">File: <a href=\"#\" id=\"a_file\"></a><input type=\"file\" id=\"select_file\" />\r\n          </p>\r\n          <div id=\"description\">\r\n            <p>&lt;-- Select one of demos on left side</p>\r\n          </div>\r\n        </div>\r\n        <p id=\"resolte-text\" style=\"display:none\">Resolte:</p>\r\n        <!--<div id=\"resolte-contaniner\" style=\"display:none;\"></div>-->\r\n        <div style=\"overflow: hidden;width: 800px; \">\r\n          <div id=\"resolte-contaniner\" style=\"width: 100%; height:550px; overflow: auto;\"></div>\r\n        </div>\r\n        <script>\r\n          (function ($) {\r\n            $(\".demos\").on(\"click\", function (e) {\r\n              e.preventDefault();\r\n\r\n              $(\".sdb_holder li\").removeClass(\"active\");\r\n              $(this).parent().addClass(\"active\");\r\n              var id = $(this).attr(\"id\");\r\n              $(\"#head-name\").html($(this).html());\r\n              $(\"#description\").hide();\r\n              $(\"#resolte-contaniner\").html(\"\");\r\n              $(\"#resolte-contaniner\").show();\r\n              $(\"#resolte-text\").show();\r\n              if (id != \"demo_input\") {\r\n\r\n                $(\"#select_file\").hide();\r\n                var file_path = \"files\\\\\" + $(this).data(\"file\");\r\n                $(\"#a_file\").html($(this).data(\"file\")).attr(\"href\", file_path);\r\n                $(\"#a_file\").show();\r\n                $(\"#file_p\").show();\r\n\r\n                $(\"#resolte-contaniner\").officeToHtml({\r\n                  url: file_path,\r\n                  pdfSetting: {\r\n                    setLang: \"\",\r\n                    setLangFilesPath: \"\" /*\"include/pdf/lang/locale\" - relative to app path*/\r\n                  }\r\n                });\r\n              } else {\r\n\r\n                $(\"#select_file\").show();\r\n                $(\"#file_p\").show();\r\n                $(\"#a_file\").hide();\r\n\r\n                $(\"#resolte-contaniner\").officeToHtml({\r\n                  inputObjId: \"select_file\",\r\n                  pdfSetting: {\r\n                    setLang: \"\",\r\n                    setLangFilesPath: \"\" /*\"include/pdf/lang/locale\" - relative to app path*/\r\n                  }\r\n                });\r\n              }\r\n            });\r\n          }(jQuery));\r\n        </script>\r\n      </div>\r\n  </div>\r\n  <!-- / main body -->\r\n  <div class=\"clear\"></div>\r\n  </main>\r\n  </div>\r\n\r\n  <div class=\"wrapper row5\">\r\n    <div id=\"copyright\" class=\"hoc clear\">\r\n      <p class=\"fl_left\">Copyright &copy; 2017 - All Rights Reserved - <a href=\"https://github.com/meshesha/\">Tady\r\n          Meshesha</a></p>\r\n      <p class=\"fl_right\">Template by <a target=\"_blank\" href=\"http://www.os-templates.com/\"\r\n          title=\"Free Website Templates\">OS Templates</a></p>\r\n    </div>\r\n  </div>\r\n  <a id=\"backtotop\" href=\"#top\"><i class=\"fa fa-chevron-up\"></i></a>\r\n</body>\r\n\r\n</html>\r\n"
  },
  {
    "path": "pages/docs.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n\r\n<head>\r\n  <title>OfficeJs | Docs </title>\r\n  <meta charset=\"utf-8\">\r\n  <link href=\"../layout/styles/layout.css\" rel=\"stylesheet\" type=\"text/css\" media=\"all\">\r\n  <link rel=\"stylesheet\" href=\"//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css\">\r\n  <script src=\"//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js\"></script>\r\n  <script>hljs.initHighlightingOnLoad();</script>\r\n  <style>\r\n    .p_heads_1 {\r\n      font-size: 18px;\r\n      color: rgb(4, 0, 255)\r\n    }\r\n\r\n    .p_heads_2 {\r\n      font-size: 16px;\r\n      color: rgb(63, 60, 253)\r\n    }\r\n\r\n    .p_heads_3 {\r\n      font-size: 14px;\r\n      color: rgb(98, 95, 255)\r\n    }\r\n  </style>\r\n</head>\r\n\r\n<body id=\"top\">\r\n  <div class=\"wrapper row1\">\r\n    <header id=\"header\" class=\"hoc clear\">\r\n      <div id=\"logo\" class=\"fl_left\">\r\n        <h1><a href=\"../index.html\">Office To Html - Docs</a></h1>\r\n      </div>\r\n      <nav id=\"mainav\" class=\"fl_right\">\r\n        <ul class=\"clear\">\r\n          <li><a href=\"../index.html\">Home</a></li>\r\n          <li class=\"active\"><a href=\"docs.html\">Docs</a></li>\r\n          <li><a href=\"demos.html\">Demos</a></li>\r\n          <li><a href=\"https://github.com/meshesha/officeToHtml\">GitHub</a></li>\r\n          <li><a href=\"https://github.com/meshesha\">About</a></li>\r\n        </ul>\r\n      </nav>\r\n    </header>\r\n  </div>\r\n  <div class=\"wrapper row3\">\r\n    <main class=\"hoc container clear\">\r\n      <!-- main body -->\r\n      <!-- ################################################################################################ -->\r\n      <!-- using html encode (https://codebeautify.org/html-encode-string) -->\r\n      <div class=\"content three_quarter\">\r\n        <div class=\"box bg-light clear\">\r\n          <h3 class=\"font-x2\" id=\"head-name\">usage</h3>\r\n          <div id=\"description\">\r\n            <p class=\"p_heads_1\">1. Include all necessary .css and .js files in &lt;HEAD&gt; area:</p>\r\n            <pre>\r\n                <code>\r\n&lt;!--PDF--&gt; \r\n&lt;link rel=&quot;stylesheet&quot; href=&quot;./include/pdf/pdf.viewer.css&quot;&gt; \r\n&lt;script src=&quot;./include/pdf/pdf.js&quot;&gt;&lt;/script&gt; \r\n&lt;!--Docs--&gt;\r\n&lt;script src=&quot;./include/docx/jszip-utils.js&quot;&gt;&lt;/script&gt;\r\n&lt;script src=&quot;./include/docx/mammoth.browser.min.js&quot;&gt;&lt;/script&gt;\r\n&lt;!--PPTX--&gt;\r\n&lt;link rel=&quot;stylesheet&quot; href=&quot;./include/PPTXjs/css/pptxjs.css&quot;&gt;\r\n&lt;link rel=&quot;stylesheet&quot; href=&quot;./include/PPTXjs/css/nv.d3.min.css&quot;&gt;\r\n&lt;!-- optional if you want to use revealjs (v1.11.0) --&gt;\r\n&lt;link rel=&quot;stylesheet&quot; href=&quot;./revealjs/reveal.css&quot;&gt;\r\n&lt;script type=&quot;text/javascript&quot; src=&quot;./include/PPTXjs/js/filereader.js&quot;&gt;&lt;/script&gt;\r\n&lt;script type=&quot;text/javascript&quot; src=&quot;./include/PPTXjs/js/d3.min.js&quot;&gt;&lt;/script&gt;\r\n&lt;script type=&quot;text/javascript&quot; src=&quot;./include/PPTXjs/js/nv.d3.min.js&quot;&gt;&lt;/script&gt;\r\n&lt;script type=&quot;text/javascript&quot; src=&quot;./include/PPTXjs/js/pptxjs.js&quot;&gt;&lt;/script&gt;\r\n&lt;script type=&quot;text/javascript&quot; src=&quot;./include/PPTXjs/js/divs2slides.js&quot;&gt;&lt;/script&gt;\r\n\r\n&lt;!--All Spreadsheet --&gt;\r\n&lt;link rel=&quot;stylesheet&quot; href=&quot;./include/SheetJS/handsontable.full.min.css&quot;&gt;\r\n&lt;script type=&quot;text/javascript&quot; src=&quot;./include/SheetJS/handsontable.full.min.js&quot;&gt;&lt;/script&gt;\r\n&lt;script type=&quot;text/javascript&quot; src=&quot;./include/SheetJS/xlsx.full.min.js&quot;&gt;&lt;/script&gt;\r\n&lt;!--Image viewer--&gt; \r\n&lt;link rel=&quot;stylesheet&quot; href=&quot;./include/verySimpleImageViewer/css/jquery.verySimpleImageViewer.css&quot;&gt;\r\n&lt;script type=&quot;text/javascript&quot; src=&quot;./include/verySimpleImageViewer/js/jquery.verySimpleImageViewer.js&quot;&gt;&lt;/script&gt;\r\n&lt;!--officeToHtml--&gt;\r\n&lt;script src=&quot;./include/officeToHtml.js&quot;&gt;&lt;/script&gt;\r\n&lt;link rel=&quot;stylesheet&quot; href=&quot;./include/officeToHtml.css&quot;&gt;\r\n                </code>\r\n            </pre>\r\n            <p class=\"p_heads_1\">2. Add &lt;Div&gt; with id in &lt;BODY&gt; area:</p>\r\n            <pre>\r\n                <code>\r\n&lt;div id=&quot;resolte-contaniner&quot;&gt;&lt;/div&gt;\r\n                </code>\r\n            </pre>\r\n            <p class=\"p_heads_1\">3.Use one or both javascript method to read file:</p>\r\n            <p class=\"p_heads_2\">a. For reading remote file :</p>\r\n            <pre>\r\n                <code>\r\nvar file_path = &quot;path/to/file.pptx&quot;; \r\n$(&quot;#resolte-contaniner&quot;).officeToHtml({\r\n   url: file_path\r\n});\r\n                </code>\r\n            </pre>\r\n            <p class=\"p_heads_2\">b. For reading local file using INPUT object :</p>\r\n            <p class=\"p_heads_3\">b1. First add &lt;Input&gt; with id in &lt;BODY&gt; area:</p>\r\n            <pre>\r\n                <code>\r\n&lt;input type=&quot;file&quot; id=&quot;select_file&quot; /&gt;                    \r\n                </code>\r\n            </pre>\r\n            <p class=\"p_heads_3\">b2. And then use next script:</p>\r\n            <pre>\r\n                <code>\r\n$(&quot;#resolte-contaniner&quot;).officeToHtml({\r\n  inputObjId: \"select_file\"\r\n});\r\n                </code>\r\n            </pre>\r\n\r\n            <p class=\"p_heads_1\">4.options and settings:</p>\r\n            <pre>\r\n                <code>\r\n$(&quot;#resolte-contaniner&quot;).officeToHtml({\r\n    url: file_path,\r\n    inputObjId: &quot;select_file&quot;,\r\n    pdfSetting: {\r\n        // setting for pdf\r\n    },\r\n    docxSetting: {\r\n        // setting for docx\r\n    },\r\n    pptxSetting: {\r\n        // setting for pptx\r\n    },\r\n    sheetSetting: {\r\n        // setting for excel\r\n    },\r\n    imageSetting: {\r\n        // setting for  images\r\n    }\r\n});                    \r\n                </code>\r\n            </pre>\r\n            <p class=\"p_heads_2\">a.pdfSetting:</p>\r\n            <pre>\r\n                <code>\r\n$(&quot;#resolte-contaniner&quot;).officeToHtml({\r\n    url: file_path,\r\n    inputObjId: &quot;select_file&quot;,\r\n    pdfSetting: {\r\n        setLang: \"he\",\r\n        thumbnailViewBtn: true,\r\n        searchBtn: true,\r\n        nextPreviousBtn: true,\r\n        pageNumberTxt: true,\r\n        totalPagesLabel: true,\r\n        zoomBtns: true,\r\n        scaleSelector: true,\r\n        presantationModeBtn: true,\r\n        openFileBtn: true,\r\n        printBtn: true,\r\n        downloadBtn: true,\r\n        bookmarkBtn: true,\r\n        secondaryToolbarBtn: true,\r\n        firstPageBtn: true,\r\n        lastPageBtn: true,\r\n        pageRotateCwBtn: true,\r\n        pageRotateCcwBtn: true,\r\n        cursorSelectTextToolbarBtn: true,\r\n        cursorHandToolbarBtn: true\r\n    }\r\n});                    \r\n                </code>\r\n            </pre>\r\n            <a href=\"pdfViewer.png\" target=\"_blank\"><img src=\"pdfViewer.png\" style=\"width:99%; height: 60%; \" /></a>\r\n            <style type=\"text/css\">\r\n              /*the tables genereted by web-site: https://www.tablesgenerator.com/html_tables */\r\n              .tg {\r\n                border-collapse: collapse;\r\n                border-spacing: 0;\r\n              }\r\n\r\n              .tg td {\r\n                font-family: Arial, sans-serif;\r\n                font-size: 14px;\r\n                padding: 10px 5px;\r\n                border-style: solid;\r\n                border-width: 1px;\r\n                overflow: hidden;\r\n                word-break: normal;\r\n                border-color: black;\r\n              }\r\n\r\n              .tg th {\r\n                font-family: Arial, sans-serif;\r\n                font-size: 14px;\r\n                font-weight: normal;\r\n                padding: 10px 5px;\r\n                border-style: solid;\r\n                border-width: 1px;\r\n                overflow: hidden;\r\n                word-break: normal;\r\n                border-color: black;\r\n              }\r\n\r\n              .tg .tg-jc4p {\r\n                font-size: 16px;\r\n                background-color: #00009b;\r\n                color: #ffffff;\r\n                vertical-align: top\r\n              }\r\n\r\n              .tg .tg-yw4l {\r\n                vertical-align: top\r\n              }\r\n            </style>\r\n            <table class=\"tg\">\r\n              <tr>\r\n                <th class=\"tg-jc4p\">#</th>\r\n                <th class=\"tg-jc4p\">name</th>\r\n                <th class=\"tg-jc4p\">description</th>\r\n                <th class=\"tg-jc4p\">default value</th>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">1</td>\r\n                <td class=\"tg-yw4l\">setLang<br></td>\r\n                <td class=\"tg-yw4l\">set manually the interface language(short name code) -click here to see all\r\n                  supported languages: <a href=\"lang.html\">link.</a>\r\n                  <br>if set to \"\" or not set at all then the language will be as the browser interface language or\r\n                  English if it is not\r\n                  supported.\r\n                </td>\r\n                <td class=\"tg-yw4l\">\"\"</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">1</td>\r\n                <td class=\"tg-yw4l\">thumbnailViewBtn<br></td>\r\n                <td class=\"tg-yw4l\">Thumbnail viewer button (true - view button, false - hide button).<br></td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">2</td>\r\n                <td class=\"tg-yw4l\">searchBtn<br></td>\r\n                <td class=\"tg-yw4l\">Seraching button (true - view button, false - hide button).</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">3</td>\r\n                <td class=\"tg-yw4l\">nextPreviousBtn<br></td>\r\n                <td class=\"tg-yw4l\">next and previous button (true - view button, false - hide button).</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">4</td>\r\n                <td class=\"tg-yw4l\">pageNumberTxt<br></td>\r\n                <td class=\"tg-yw4l\">page number textbox&nbsp;&nbsp;(true - view text, false - hide text).</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">5</td>\r\n                <td class=\"tg-yw4l\">totalPagesLabel<br></td>\r\n                <td class=\"tg-yw4l\">total pages label (true - view label, false - hide label).</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">6</td>\r\n                <td class=\"tg-yw4l\">zoomBtns<br></td>\r\n                <td class=\"tg-yw4l\">zoom&nbsp;&nbsp;buttons (true - view buttons, false - hide buttons).</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">7</td>\r\n                <td class=\"tg-yw4l\">scaleSelector<br></td>\r\n                <td class=\"tg-yw4l\">scale selector (true - view selector, false - hide selector).</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">8</td>\r\n                <td class=\"tg-yw4l\">presantationModeBtn<br></td>\r\n                <td class=\"tg-yw4l\">presentation mode&nbsp;&nbsp;button (true - view button, false - hide button).</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">9</td>\r\n                <td class=\"tg-yw4l\">openFileBtn<br></td>\r\n                <td class=\"tg-yw4l\">open file&nbsp;&nbsp;button (true - view button, false - hide button).</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">10</td>\r\n                <td class=\"tg-yw4l\">printBtn<br></td>\r\n                <td class=\"tg-yw4l\">print&nbsp;&nbsp;button (true - view button, false - hide button).</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">11</td>\r\n                <td class=\"tg-yw4l\">downloadBtn<br></td>\r\n                <td class=\"tg-yw4l\">download&nbsp;&nbsp;button (true - view button, false - hide button).</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">12</td>\r\n                <td class=\"tg-yw4l\">bookmarkBtn<br></td>\r\n                <td class=\"tg-yw4l\">bookmark&nbsp;&nbsp;button - open current view in new window (true - view button,\r\n                  false - hide button).</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">13</td>\r\n                <td class=\"tg-yw4l\">secondaryToolbarBtn<br></td>\r\n                <td class=\"tg-yw4l\">secondary toolbar&nbsp;&nbsp;button (true - view button, false - hide button).</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">14</td>\r\n                <td class=\"tg-yw4l\">firstPageBtn<br></td>\r\n                <td class=\"tg-yw4l\">go to first page&nbsp;&nbsp;button (true - view button, false - hide button).</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">15</td>\r\n                <td class=\"tg-yw4l\">lastPageBtn<br></td>\r\n                <td class=\"tg-yw4l\">go to last page button (true - view button, false - hide button).</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">16</td>\r\n                <td class=\"tg-yw4l\">pageRotateCwBtn<br></td>\r\n                <td class=\"tg-yw4l\">rotate page clockwise button (true - view button, false - hide button).</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">17</td>\r\n                <td class=\"tg-yw4l\">pageRotateCcwBtn<br></td>\r\n                <td class=\"tg-yw4l\">rotate page counter clockwise button (true - view button, false - hide button).</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">18</td>\r\n                <td class=\"tg-yw4l\">cursorSelectTextToolbarBtn<br></td>\r\n                <td class=\"tg-yw4l\">select text button (true - view button, false - hide button).</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">19</td>\r\n                <td class=\"tg-yw4l\">cursorHandToolbarBtn<br></td>\r\n                <td class=\"tg-yw4l\">cursor hand button (true - view button, false - hide button).<br></td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n            </table>\r\n            <p class=\"p_heads_2\">b.docxSetting:</p>\r\n            <pre>\r\n                <code>\r\n$(&quot;#resolte-contaniner&quot;).officeToHtml({\r\n    url: file_path,\r\n    inputObjId: &quot;select_file&quot;,\r\n    docxSetting: {\r\n        styleMap : null,\r\n        includeEmbeddedStyleMap: true,\r\n        includeDefaultStyleMap: true,\r\n        convertImage: null,\r\n        ignoreEmptyParagraphs: false,\r\n        idPrefix: \"\",\r\n        isRtl : \"auto\" \r\n    }\r\n});                    \r\n                </code>\r\n            </pre>\r\n            <table class=\"tg\">\r\n              <tr>\r\n                <th class=\"tg-jc4p\">#</th>\r\n                <th class=\"tg-jc4p\">name</th>\r\n                <th class=\"tg-jc4p\">description</th>\r\n                <th class=\"tg-jc4p\">default value</th>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">1</td>\r\n                <td class=\"tg-yw4l\">isRtl<br><br></td>\r\n                <td class=\"tg-yw4l\">set if the docx document is \"rtl\" (right to left) or \"ltr\" (left to right).<br>set\r\n                  \"auto\" for automatic detaction (work for hebrew only)<br></td>\r\n                <td class=\"tg-yw4l\">\"auto\"<br></td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">2</td>\r\n                <td class=\"tg-yw4l\"></td>\r\n                <td class=\"tg-yw4l\">For the others options see <a href=\"https://github.com/mwilliamson/mammoth.js/\"\r\n                    target=\"_blank\">mammoth.js</a> github page</td>\r\n                <td class=\"tg-yw4l\"></td>\r\n              </tr>\r\n            </table>\r\n\r\n\r\n            <p class=\"p_heads_2\">c.pptxSetting:</p>\r\n            <pre>\r\n                <code>\r\n$(&quot;#resolte-contaniner&quot;).officeToHtml({\r\n    url: file_path,\r\n    inputObjId: &quot;select_file&quot;,\r\n    pptxSetting: {\r\n        slidesScale: \"50%\", //Change Slides scale by percent\r\n        slideMode: true, /** true,false*/\r\n        slideType: \"divs2slidesjs\", /*'divs2slidesjs' (default) , 'revealjs'(https://revealjs.com) */\r\n        revealjsPath: \"\", /*path to js file of revealjs. default:  './revealjs/reveal.js'*/\r\n        keyBoardShortCut: true,  /** true,false ,condition: slideMode: true*/\r\n        mediaProcess: true, /** true,false: if true then process video and audio files */\r\n        jsZipV2: false,\r\n        slideModeConfig: {\r\n            first: 1,\r\n            nav: true, /** true,false : show or not nav buttons*/\r\n            navTxtColor: \"black\", /** color */\r\n            keyBoardShortCut: false, /** true,false ,condition: */\r\n            showSlideNum: true, /** true,false */\r\n            showTotalSlideNum: true, /** true,false */\r\n            autoSlide:1, /** false or seconds , F8 to active ,keyBoardShortCut: true */\r\n            randomAutoSlide: false, /** true,false ,autoSlide:true */ \r\n            loop: true,  /** true,false */\r\n            background: false, /** false or color*/\r\n            transition: \"default\", /** transition type: \"slid\",\"fade\",\"default\",\"random\" , to show transition efects :transitionTime > 0.5 */\r\n            transitionTime: 1 /** transition time between slides in seconds */               \r\n        },\r\n        revealjsConfig: {} /*revealjs options. see https://revealjs.com */\r\n    }\r\n});                    \r\n                </code>\r\n            </pre>\r\n            <table class=\"tg\">\r\n              <tr>\r\n                <th class=\"tg-jc4p\">#</th>\r\n                <th class=\"tg-jc4p\">name</th>\r\n                <th class=\"tg-jc4p\">description</th>\r\n                <th class=\"tg-jc4p\">default value</th>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">1</td>\r\n                <td class=\"tg-yw4l\">slidesScale</td>\r\n                <td class=\"tg-yw4l\">Change Slides scale by percent(%). for orginal size set this option to \"\" or \"100%\"\r\n                </td>\r\n                <td class=\"tg-yw4l\">\"\"</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">2</td>\r\n                <td class=\"tg-yw4l\">slideMode</td>\r\n                <td class=\"tg-yw4l\">If true, turn on presentation mode. The settings of the presentation mode are\r\n                  controlled by the variables \"slideModeConfig\" </td>\r\n                <td class=\"tg-yw4l\">false</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">3</td>\r\n                <td class=\"tg-yw4l\">keyBoardShortCut</td>\r\n                <td class=\"tg-yw4l\">If true, enable to enter or exit from presentation mode by keyboard shortcut F5\r\n                </td>\r\n                <td class=\"tg-yw4l\">false</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">4</td>\r\n                <td class=\"tg-yw4l\">mediaProcess</td>\r\n                <td class=\"tg-yw4l\">if true, then process video and audio files.If 'false', you can not play and see or\r\n                  hear the videos and audios embedded in the presentation.</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">5</td>\r\n                <td class=\"tg-yw4l\">jsZipV2</td>\r\n                <td class=\"tg-yw4l\">url link to jsZip version 2. <br>This allows the ability to load jsZip v.2 in case\r\n                  jsZip v.3 is loaded for another use.</td>\r\n                <td class=\"tg-yw4l\">false</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">6</td>\r\n                <td class=\"tg-yw4l\">slideModeConfig</td>\r\n                <td class=\"tg-yw4l\">settings of the presentation mode.<br> for more details click <a\r\n                    href=\"https://github.com/meshesha/divs2slides\" target=\"_blank\">here</a></td>\r\n                <td class=\"tg-yw4l\">{}</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">7</td>\r\n                <td class=\"tg-yw4l\">slideModeConfig.first</td>\r\n                <td class=\"tg-yw4l\">The first slide that will be loaded.</td>\r\n                <td class=\"tg-yw4l\">1</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">8</td>\r\n                <td class=\"tg-yw4l\">slideModeConfig.nav</td>\r\n                <td class=\"tg-yw4l\">show ('true') or hide ('false') navigator buttons.</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">9</td>\r\n                <td class=\"tg-yw4l\">slideModeConfig.navTxtColor</td>\r\n                <td class=\"tg-yw4l\">color of slide number text and total slides number shown in navigator area.</td>\r\n                <td class=\"tg-yw4l\">\"black\"</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">10</td>\r\n                <td class=\"tg-yw4l\">slideModeConfig.keyBoardShortCut</td>\r\n                <td class=\"tg-yw4l\">if true , enable to control presentation by keyboard shortcuts.<br> for keyboard\r\n                  shortcuts list click <a href=\"https://github.com/meshesha/divs2slides\" target=\"_blank\">here</a> </td>\r\n                <td class=\"tg-yw4l\">false</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">11</td>\r\n                <td class=\"tg-yw4l\">slideModeConfig.showSlideNum</td>\r\n                <td class=\"tg-yw4l\">if true , show slide number in navigator area.</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">12</td>\r\n                <td class=\"tg-yw4l\">slideModeConfig.showTotalSlideNum</td>\r\n                <td class=\"tg-yw4l\">if true , show total slides number in navigator area.</td>\r\n                <td class=\"tg-yw4l\">true</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">13</td>\r\n                <td class=\"tg-yw4l\">slideModeConfig.autoSlide</td>\r\n                <td class=\"tg-yw4l\">options:'false' or number (seconds). if set 'false' it disable auto slide mode. if\r\n                  set number then auto slide mode will be enabled and the number will be the time between slides.</td>\r\n                <td class=\"tg-yw4l\">1</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">14</td>\r\n                <td class=\"tg-yw4l\">slideModeConfig.randomAutoSlide</td>\r\n                <td class=\"tg-yw4l\">if true and autoSlide mode are enabled then The slides appear in random order.</td>\r\n                <td class=\"tg-yw4l\">false</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">15</td>\r\n                <td class=\"tg-yw4l\">slideModeConfig.loop</td>\r\n                <td class=\"tg-yw4l\">if true, in presentation mode , after last slide will go to first slide. in auto\r\n                  slideMode, the presentation will play in loop.</td>\r\n                <td class=\"tg-yw4l\">false</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">16</td>\r\n                <td class=\"tg-yw4l\">slideModeConfig.background</td>\r\n                <td class=\"tg-yw4l\">color of presentation background.</td>\r\n                <td class=\"tg-yw4l\">false</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">17</td>\r\n                <td class=\"tg-yw4l\">slideModeConfig.transition</td>\r\n                <td class=\"tg-yw4l\">transition types options: \"slid\",\"fade\",\"default\",\"random\". </td>\r\n                <td class=\"tg-yw4l\">\"default\"</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">18</td>\r\n                <td class=\"tg-yw4l\">slideModeConfig.transitionTime</td>\r\n                <td class=\"tg-yw4l\">Time delay in seconds between slides.</td>\r\n                <td class=\"tg-yw4l\">1</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">19</td>\r\n                <td class=\"tg-yw4l\">slideType (v1.11.0)</td>\r\n                <td class=\"tg-yw4l\">slide viewr option: 'divs2slidesjs', 'revealjs'(https://revealjs.com) </td>\r\n                <td class=\"tg-yw4l\">\"divs2slidesjs\"</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">20</td>\r\n                <td class=\"tg-yw4l\">revealjsPath (v1.11.0)</td>\r\n                <td class=\"tg-yw4l\">path to js file of revealjs.</td>\r\n                <td class=\"tg-yw4l\">'./revealjs/reveal.js'</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">21</td>\r\n                <td class=\"tg-yw4l\">revealjsConfig (v1.11.0)</td>\r\n                <td class=\"tg-yw4l\">revealjs options. see https://revealjs.com */</td>\r\n                <td class=\"tg-yw4l\"></td>\r\n              </tr>\r\n            </table>\r\n            <p class=\"p_heads_2\">d.sheetSetting:</p>\r\n            <pre>\r\n                <code>\r\n$(&quot;#resolte-contaniner&quot;).officeToHtml({\r\n    url: file_path,\r\n    inputObjId: &quot;select_file&quot;,\r\n    sheetSetting: {\r\n        jqueryui : false,\r\n        activeHeaderClassName: \"\",\r\n        allowEmpty: true,\r\n        autoColumnSize: true,\r\n        autoRowSize: false,\r\n        columns: false,\r\n        columnSorting: true,\r\n        contextMenu: false,\r\n        copyable: true,\r\n        customBorders: false,\r\n        fixedColumnsLeft: 0,\r\n        fixedRowsTop: 0,\r\n        language:'en-US',\r\n        search: false,\r\n        selectionMode: 'single',\r\n        sortIndicator: false,\r\n        readOnly: false,\r\n        startRows: 1,\r\n        startCols: 1,\r\n        rowHeaders: true,\r\n        colHeaders: true,\r\n        width: false,\r\n        height:false\r\n    }\r\n});                    \r\n                </code>\r\n            </pre>\r\n            <table class=\"tg\">\r\n              <tr>\r\n                <th class=\"tg-jc4p\">#</th>\r\n                <th class=\"tg-jc4p\">name</th>\r\n                <th class=\"tg-jc4p\">description</th>\r\n                <th class=\"tg-jc4p\">default value</th>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">1</td>\r\n                <td class=\"tg-yw4l\">jqueryui</td>\r\n                <td class=\"tg-yw4l\">if true , will use jQuery-ui interface.<br> To use this option, must include\r\n                  \"jquery-ui.js\" and \"jquery-ui.css\" in the HEAD area.</td>\r\n                <td class=\"tg-yw4l\">false</td>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">2</td>\r\n                <td class=\"tg-yw4l\"></td>\r\n                <td class=\"tg-yw4l\">For the others options see <a href=\"https://docs.handsontable.com/\"\r\n                    target=\"_blank\">handsontable tutorial</a></td>\r\n                <td class=\"tg-yw4l\"></td>\r\n              </tr>\r\n            </table>\r\n            <p class=\"p_heads_2\">e.imageSetting:</p>\r\n            <pre>\r\n                <code>\r\n$(&quot;#resolte-contaniner&quot;).officeToHtml({\r\n    url: file_path,\r\n    inputObjId: &quot;select_file&quot;,\r\n    imageSetting: {\r\n        frame: ['100%', '100%',false],\r\n        maxZoom: '900%',\r\n        zoomFactor: '10%',\r\n        mouse: true,\r\n        keyboard: true,\r\n        toolbar: true,\r\n        rotateToolbar: false\r\n    }\r\n});                    \r\n                </code>\r\n            </pre>\r\n            <table class=\"tg\">\r\n              <tr>\r\n                <th class=\"tg-jc4p\">#</th>\r\n                <th class=\"tg-jc4p\">name</th>\r\n                <th class=\"tg-jc4p\">description</th>\r\n                <th class=\"tg-jc4p\">default value</th>\r\n              </tr>\r\n              <tr>\r\n                <td class=\"tg-yw4l\">1</td>\r\n                <td class=\"tg-yw4l\"></td>\r\n                <td class=\"tg-yw4l\">For options see <a href=\"https://github.com/meshesha/verySimpleImageViewer\"\r\n                    target=\"_blank\">verySimpleImageViewer</a> github page</td>\r\n                <td class=\"tg-yw4l\"></td>\r\n              </tr>\r\n            </table>\r\n\r\n\r\n          </div>\r\n        </div>\r\n      </div>\r\n      <!-- / main body -->\r\n      <div class=\"clear\"></div>\r\n    </main>\r\n  </div>\r\n\r\n  <div class=\"wrapper row5\">\r\n    <div id=\"copyright\" class=\"hoc clear\">\r\n      <p class=\"fl_left\">Copyright &copy; 2017 - All Rights Reserved - <a href=\"https://github.com/meshesha/\">Tady\r\n          Meshesha</a></p>\r\n      <p class=\"fl_right\">Template by <a target=\"_blank\" href=\"http://www.os-templates.com/\"\r\n          title=\"Free Website Templates\">OS Templates</a></p>\r\n    </div>\r\n  </div>\r\n  <a id=\"backtotop\" href=\"#top\"><i class=\"fa fa-chevron-up\"></i></a>\r\n</body>\r\n\r\n</html>"
  },
  {
    "path": "pages/include/PPTXjs/css/pptxjs.css",
    "content": "\n\n.slide {\n\twidth: 100%;\n\t/*max-width: 920px;*/\n\theight: 690px;\n\tposition: relative;\n\tborder: 1px solid #333;\n\t/* background-color: #EFEFEF; */\n\ttext-align: center;\n\tborder-radius: 10px;\n\t/* box-shadow: 1px 1px 3px #AAA; */\n\toverflow: hidden;\n\t/*transform: scale(0.85);*/\n}\n\n.slide div.block {\n\tposition: absolute;\n\ttop: 0px;\n\tleft: 0px;\n\twidth: 100%;\n}\n\n.slide div.content {\n\tdisplay: flex;\n\tflex-direction: column;\n\t/*\n\tjustify-content: center;\n\talign-items: flex-end;\n\t*/\n}\n\n.slide div.v-up {\n\tjustify-content: flex-start;\n}\n.slide div.v-mid {\n\tjustify-content: center;\n}\n.slide div.v-down {\n\tjustify-content: flex-end;\n}\n\n.slide div.h-left {\n\talign-items: flex-start;\n\ttext-align: left;\n}\n.slide div.h-mid {\n\talign-items: center;\n\ttext-align: center;\n}\n.slide div.h-right {\n\talign-items: flex-end;\n\ttext-align: right;\n}\n\n.slide div.up-left {\n\tjustify-content: flex-start;\n\talign-items: flex-start;\n\ttext-align: left;\n}\n.slide div.up-center {\n\tjustify-content: flex-start;\n\talign-items: center;\n}\n.slide div.up-right {\n\tjustify-content: flex-start;\n\talign-items: flex-end;\n}\n.slide div.center-left {\n\tjustify-content: center;\n\talign-items: flex-start;\n\ttext-align: left;\n}\n.slide div.center-center {\n\tjustify-content: center;\n\talign-items: center;\n}\n.slide div.center-right {\n\tjustify-content: center;\n\talign-items: flex-end;\n}\n.slide div.down-left {\n\tjustify-content: flex-end;\n\talign-items: flex-start;\n\ttext-align: left;\n}\n.slide div.down-center {\n\tjustify-content: flex-end;\n\talign-items: center;\n}\n.slide div.down-right {\n\tjustify-content: flex-end;\n\talign-items: flex-end;\n}\n\n\n.slide li.slide {\n\tmargin: 10px 0px;\n\tfont-size: 18px;\n}\n\n/* div.footer {\n\ttext-align: center;\n} */\n\n.slide table {\n\tposition: absolute;\n}\n\n.slide table, .slide th, .slide td {\n\tborder: 1px solid black;\n}\n\n.slide svg.drawing {\n\tposition: absolute;\n\toverflow: visible;\n}\n/*\n#pptx-thumb {\n\tmin-width: 240px;\n\theight: 180px;\n}\n*/"
  },
  {
    "path": "pages/include/PPTXjs/js/divs2slides.css",
    "content": ".jqvsiv_toolbar {\r\n\tdisplay: inline-block;\r\n\tposition: absolute;\r\n\tright: 3px;\r\n\ttop: 3px;\r\n\tz-index: 5;\r\n}\r\n.jqvsiv_toolbarButton {\r\n\tmargin: 0 2px;\r\n\tcursor: pointer;\r\n}\r\n"
  },
  {
    "path": "pages/include/PPTXjs/js/divs2slides.js",
    "content": "/**\n * divs2slides.js\n * Ver : 1.3.3\n * update: 03/01/2021\n * Author: meshesha , https://github.com/meshesha\n * LICENSE: MIT\n * url:https://github.com/meshesha/divs2slides\n * \n * New: \n *  - fixed margin issue\n */\n(function ($) {\n\n    var orginalMainDivWidth,\n        orginalMainDivHeight,\n        orginalSlidesWarpperScale,\n        orginalSlideTop,\n        orginalSlideLeft,\n        orginalSlidesToolbarWidth,\n        orginalSlidesToolbarTop;\n    var pptxjslideObj = {\n        init: function () {\n            var data = pptxjslideObj.data;\n            var divId = data.divId;\n            var isInit = data.isInit;\n            $(\"#\" + divId + \" .slide\").hide();\n            if (data.slctdBgClr != false) {\n                var preBgClr = $(document.body).css(\"background-color\");\n                data.prevBgColor = preBgClr;\n                $(document.body).css(\"background-color\", data.slctdBgClr)\n            }\n            if (data.nav && !isInit) {\n                data.isInit = true;\n                // Create navigators \n                $(\"#\" + divId).prepend(\n                    $(\"<div></div>\").attr({\n                        \"class\": \"slides-toolbar\",\n                        \"style\": \"width: 90%; padding: 10px; text-align: center;font-size:18px; color: \" + data.navTxtColor + \";\" ////New for Ver: 1.2.1\n                    })\n                );\n                $(\"#\" + divId + \" .slides-toolbar\").prepend(\n                    $(\"<img></img>\").attr({\n                        \"id\": \"slides-next\",\n                        \"class\": \"slides-nav\",\n                        \"alt\": \"Next Slide\",\n                        \"src\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAADZ0lEQVRIiZ2Va2xTdRjGH5xEg0aXeInRqE00pKwfHAkydYMdlXFpiG5LYFFi0iBZFFeLrm50ZrbrYLeyneEFcHMMhxoksGUSTEw01UQz1ukO29quO11vXNZNwBI1gRDN4wfa0q3n1MKT/D697/s8//OenP8BspD2jSGNtmpISEVjcOZmM6sqjcGZm/f2sC2/+tfQpnYvdxwK0NwXpLkvyB2HAixr83C5eUTSGV2GmzZfVjVc+qxlNFb/dYRHh2Psdl7knpNzbDkxy5YTs9xzco7dzov88pdLtHwV5tM1v4W0VUNCVuZ5plO9r3b62O28wF2DURr7zmRk12CUvT9dYLnDw/99Gp3JJW7bL7Pj2zlW9kS4tTucFZU9EX743RwrOibVQ7RVQ0K5w8uG/hm+8knolmjon+Fa+zh12135aQEFtaMh6/HzLN8bSIMkmwajirWFWI6cpc7kcs5fjdFlWNPoYdneAF/qmE6DJP+++i+bBqOK9VQ2fRSkYBvnvJeeZxoeWNcqc2P7tCKp+t79Jys+Dqr2bmyfZkmzjzqTS0wGLH9vNKZ3+KnGQs1evsbaI+dU+/UOP596Z0RKBqy0nOb6VlkVNX3x8yXVmZWW0wQArDCPCIX14yxp8nFt85QimTQ9e5VvHgzP6y+2e24E5O+UNAV1YyyoG2PhBxMsbvDw+UYv1+yeTJJJf135h63fzLC4wcMi6wSfef+6V0HdGJMrKqyfoBKrrG6usrpVzeXoFRr2+RVnn6sfiyUDiqxuabXNTTWU1Pvj76r9q21uFlknBpIBgt0rvtDopRqpisausbIrqNqbQLB7blwZgm1SU9LsoxoJHXf9wTJRVu1L8OJuX0ywSfP/F+taZHFDm0wlSNI+MKNYU2J985Qt7S4SbFKu3uGXMn2h2aB3+KU084T0bXJ+qRiIlXUGeCu8LAaktNUsVKk4qdmyLyS9diDMm2HL/pCzVMxsvijObQByKj+dqjb2RS6bDp9lJoyfhyPbDvheB5ATn034JJUDYDGAOwHcDSAXwIMAHgWwdHPtZ+btnT/01/SMequ7XHJ118hUzUHJ/Van81iFpfddAE8AeATAAwDuBbAEwB0Abo8HXj9xSshd8ZD7ATwM4HEATwJYBkAXRxs3fgzAQwDuA3BPivniuOei/wDo+pj+wU2R5QAAAABJRU5ErkJggg==\",\n                        \"style\": \"float: right;cursor: pointer;opacity: 0.7;\"\n                    }).on(\"click\", pptxjslideObj.nextSlide)\n                );\n                if (data.showTotalSlideNum) {\n                    $(\"#\" + divId + \" .slides-toolbar\").prepend(\n                        $(\"<span></span>\").attr({\n                            \"id\": \"slides-total-slides-num\"\n                        }).html(data.totalSlides)\n                    );\n                }\n                if (data.showSlideNum && data.showTotalSlideNum) {\n                    $(\"#\" + divId + \" .slides-toolbar\").prepend(\n                        $(\"<span></span>\").attr({\n                            \"id\": \"slides-slides-num-separator\"\n                        }).html(\" / \")\n                    );\n\n                }\n                if (data.showSlideNum) {\n                    $(\"#\" + divId + \" .slides-toolbar\").prepend(\n                        $(\"<span></span>\").attr({\n                            \"id\": \"slides-slide-num\"\n                        }).html(data.slideCount)\n                    );\n                }\n                if (data.showFullscreenBtn) {\n                    $(\"#\" + divId + \" .slides-toolbar\").prepend(\n                        $(\"<img></img>\").attr({\n                            \"id\": \"slides-full-screen\",\n                            \"class\": \"slides-nav-play\",\n                            \"alt\": \"fullscreen Slide\",\n                            \"src\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAGwUlEQVRIibWWW0zU+RWAR1eHgaJtN92kbXYTkjUtlW26u6m7cQsMFwsyzAAOMyBQVGCAhUFgUFirYlABgSAXB6MgcinoDCBR3IGxwhABg1wEZQYRMIg3arn9B7ft+vj1AcK2Tdq+tCf5Hn7nnPy+nKdzRKL/d5SVld9uaLxiN//xttDT2yf03xsQhu+PCGNWqzD+aEJ48mRGePbsufDq1ZywsLgoLAuCML+wILx4+VJ4+nRWeDw5LVhtNmF09IFwb2BQ6LJ0C0Zjs1BZWWUvKSm1iDIOH35TWFRMWfk5jh07xonjxzmVk0Nebi6FBQWcLS6mrLSUCr2eyosXuVRVxcULF9CfO0dpSQnFRUWcyc8n99QpcrKzOXLkCGcKCjl9OpfDWVl/EYWHhwupqWlER0Wx7Re/ZOfuENwDQvCUheAVqMRHrmSXQolfUCj+QcpVgkPxCwrFV7Fa9wpU4ilT4iFT8qHrR0RGRpKamkZERKRdFB6+V0hP1xGuViGP1WGwzXPt0SKm6WW6Zu30vfqGofm/Mbr0LVbhLTb7W6zCW0YWv2Xg9V+58+IN5hmB1olFasbm2B2dQpgqlNTUNCIjo+yisLBwIS0tHZUyhF0RSdQP/YnG4TmaxxZoe7SEeUrA8nSFO8/e0Pv8DX0vvqHn+Ru6Z1fofGLH9HiZZusClf0vKet9jpcqFpUy5LsJ1OowITU1jZAgBZ6hsVy6+5Lq3lnqh+YwPpin1bbIzYkl2ieXMU8JmKcFOqYETJPL3Hi0ROPIa873veBs1wzFlll2KqIIVsg5eDCV8PAIu2jPnlAhJeUgclkAn8kiOWeZQd85SWXPU2oGXtJ4/zWG0XmarQu0rNFsXcDwYJ7qgVec63nO2c4n5JsmyGuf5lM/NXJZAFptCmp12KpAm5JCgL8fv/JVUdT+mKKbY5SaJ6iwTFPZM0t1/wtqBl5RNzRH3dDc6sd3nnG2a4bCW1Pk3hwn+9oo2a3juEmD2O23i+RkLSqVelWQnKzFz9cHV3cFJ1secLJpkLzroxSZbJSYJyjvnELf/QR99wylndMUdEyS3z5B7s1xcq6PcdQ4TGZDP5lX7rPt8934+fp8J1AogoSkpGR8vb1w2eFPVv09smp6ONpwlxPGQU5du0/ejQfkt1nJuTZKdssqx5ru83vDEJkN90iv6SWlshvtpT4++NgbHy8piYlJKEND7SK5XCEkJCTiLfXk/Y990F7oRqu/RdrFLjIu3+Gruj6y6u+iq+kjo+7uOuk1vaReukNKZTeJFZ3ElrYTW97FT9w88PHyJCExkT17lKuC+PgEvKUe/NhNyv4iE/sLrhN39msSyjvQlHUQV9ZBvP4WiRWdJJ3vJLGikwT9bTTlZmJKTEQXtrE37xp7z9zkPdedeEs9iI9PWBUEBsqFuDgN3lIPfuTqTuiJZlTZVwk7aUR9somw0y1E5LcSVXCD6MK2daIKbhCR30r46RZCc4wEHW0kKLuZH277DC9PD+LiNAQHB9tFMlmgEBsbh5fUg+9/+Dl+GXX4plaxK72a3Zm1yI80EHT0CiHHr6I8YVgl20DI8asEHb1C4Ff1BGTWsiu9Gl9dHVtdfo3Uw52YmFgUiiC7KCBAJhw4EIPUw52tLjtwTzyPe3w5XskV+B68iH96FQEZ1cgyLxOYVbOOLPMyARnV+KdX4ZNyAWmSHqm2EucPPsHT/TccOBCDXK6wi/z8/IV9+/YjlUoRiURscnDmHbHTOpscnNdw+qf8au1f386IRCI8PaVER+9DJgu0i4KD99g1mngCA+WIxWLEmzfjIBYjcXDAQSxmg0jEOxs34iiR4OzktIqzE06OjjhKJEgkDuu94s2bEYvFyOUKNJp4VCr1iqjuD43LDQ1XMBibMDY1c/1GG+3tHXR2WbB0d2MwGDGZTIyMjDI1Nc3MzFMeT04yZrUyNDTM3f5+LJZuzOZbtLV9TVNzC1cNRq4ajNTW1QsiNze3d7ds2fKz7du3F8dpNAsxsXErcZr4lfiEJHuyNkXQ6TKWdRmHl9N1h5Z0hzKXDmVmLekOZS7pdBnLaem65YOpafZkbYo94cukFU18gv3LZO2fXV2350kkEhe1Wv3u+up0cXGR6PX6n9bW1roajcZPTSbTFxaLxWdwcDBweHhY9fDhw9/ZbLbY8fFxjc1mi7NarQdGRkai+vv71RaLRWE2m31bW1t3GAwGl5KSEsd/u6OBjcD3gPcAF+AjYAfgAfgCv13DG/gC+AT4OfA+8APAAdjwnwQb1iSbADHguCbcAmz9B7YAzoATIFnr3QRs/B/eJP89/g4EWvXUVw2aogAAAABJRU5ErkJggg==\",\n                            \"style\": \"float: left;cursor: pointer;opacity: 0.7; padding: 0 10px 0 10px\"\n                        }).bind(\"click\", function () {\n                            pptxjslideObj.fullscreen();\n                        })\n                    )\n                }\n                if (data.showPlayPauseBtn) {\n                    $(\"#\" + divId + \" .slides-toolbar\").prepend(\n                        $(\"<img></img>\").attr({\n                            \"id\": \"slides-play-pause\",\n                            \"class\": \"slides-nav-play\",\n                            \"alt\": \"Play/Pause Slide\",\n                            \"src\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAF4UlEQVRIibWW+3NU9RnGz4ZR+5t0qjOVXmZ6M9b+0LEyuFRDjCEElMhEZlCSaWcohWgQoZE9e3Zdwg4Xd1FjJBQxlmgxbcm0NWNMJ6vBJuQCLCYxl92w2Vz3vtmTy2ZzOUnO7vrpDyklMEjbmfb9A97n+7zP+z7PVxBuU2KRqNXr9JIkSTUmo8lrNBgTRoMxYTKavJIk1eh1ekksErW363HL0ul0aZIolVst1pCtzobT4USWZVRVRVVVZFnG6XBiq7NhtVhDkiiV63S6tP+ouSiKheZic5fdbkdRFPrlODW9KmUXVV6pVzlYr/LbFpVah8pQJI6iKNjtdszF5i5RFAtv3/yAaKg6VxWWZZmrYZXfd8R58W8qOZXzPPHOHGknpkkvmSLz9SibS6fY/d40lS3z9IeWWFWdqwqLB0TDV7686lxVOB6PY3MtcvDvCTa8P8/qk7OsKZlm7fEpHnt1kvTD4zx+aIx0k0y6IUKWKYL43hSNXQvE4/ElkJuZ6HS6NHOxuUuWZWyuBXbVqDxyWuGh0lnWHI+hPRYl/fAE6SaZdVKETClClhhigxhiw4EQWS8HyTsSoaFjHlmWMRebu27QRBKlcrvdjiu8iL4+gfb0HNq3ZsksjfLUG2NsPBLhccMomfowG3R+Hi30kb0/yKb9AZ7c52fzvgCbX/JTVDLGgHcRu92OJErlS6MpErVWizWkKAoVbXEyKhRWl87w1IkJukeiBEfH6XGH2fSyi+KKMP3ecQxlg2TsHCB7t5cte3xsKfSSu8fHMy/6qPhwCkVRsFqsIbFI1Ap6nV6y1dkYlFV+8aHK2pMzPGKdYlvpKH6/n0hwhJGhfnJ/8zllf/SiTAcIhzz8pXaA7UX9bCzw8qwuSL4UJE8KssscZsi3iK3Ohl6nlwRJkmqcDifVjgWyziikl8Z49EiUba8F6HZcpdfRxRedX7D1pSsce9uNs6ed5uYmLrWcx1bfxK8PdfKtzX386DkfaXuDPGMM8dGFWZwOJ5Ik1Qgmo8kryzKvN6mkl82w/rUo6w6Nk2/xcdnezuVLTTQ0NvDDtTby97RS/0k11dXV1NZ+TGODjfb2Vk5UdnLflm6E9EHu2uLjl5YJZFnGZDR5BaPBmFBVlb0fLfLEmzGyLRNkFY+zzeyhobGZ5ubzXGhu5Js//Zj8fXau2M/TcvECbR2X6XZ04HJ3I0dcePw+cg66EHI8pBaMo6oqRoMx8S+A5/+8QPYbUZ62jvOTXSFSt/bSctlOX187Pb2drNLWscPUhWekE1e/gyFvH77gMKNyAHV+guhkkK2HLyLkeUkVY9cBro3oVds8OSWTpBaEELRD/GBTD73uPiLyMCPeIe5b9wkFFhexmIfQaICxyQgLC9Mk43NUX3Bx/wufIfzKjUYXI/dt5fqIron818/n+F5hBGH9CMKaAe7f2IPHH2R+YZLImMyq9fXsKR0imYwxvzAHfIk3PMHOt1rR7LAjGKbQHFPRHFawfLp4XeRra9o9PM/K5yJosoYRfubmgaxuxqOzAEzPzPHtJ+vZfzrAUiU495mL7+9tQCjyIpQmEcq+RDiRYOWpBFc8ietruvzQCt6cJCVzCOEhN999rIsrXTLB0Sk6egPcm9PI9pIAVz1jbLc2IexsQzg6i/AOrPgd3HEG7qiAgkZuPLTlVnGpZ4bU/BAr1rhJ+XEP9z7cxHcy6rknuxFNrpu7dvj4+q5OhBeGEY4nEE7DnRVw99kE36hMsroWWgPJG63iZrM7VTXJ134+yIoHexEe7EXQDiBke0nJG0XYPYFQNI3myCJCaYKUd+Hus0lW/SnOA9UJyq8mb212N9v1qcoxUrOHWPFwHykZg6Tk+EjJC6N5fhyNfgbNUQWhLMGdZ+CePyTJ+DTJ++7EV9v1rQLnYts0Ba+EWbnJi+ZpPyn5/wQQY0sAJ5OsrITCVrCHE/8+cJYzWR6Zbc45LB9EyT0WJVUfI/WoQu5ZFUtzgrZg8r+LzOWa/N9C/wY2/4Nvyz8A92FZT9kSnHgAAAAASUVORK5CYII=\",\n                            \"style\": \"float: left;cursor: pointer;opacity: 0.7;  padding: 0 10px 0 10px\"\n                        }).html(\"<span style='font-size:80%;'>&#x23ef;</span>\").bind(\"click\", function () {\n                            if (data.isSlideMode) {\n                                pptxjslideObj.startAutoSlide();\n                            }\n                        })\n                    );\n                }\n                $(\"#\" + divId + \" .slides-toolbar\").prepend(\n                    $(\"<img></img>\").attr({\n                        \"id\": \"slides-prev\",\n                        \"class\": \"slides-nav\",\n                        \"alt\": \"Prev. Slide\",\n                        \"src\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAADXklEQVRIiZ2Ve2hTZxjGH+tE0bEFdGNM1IBj1PYPKzjr1roeN6tdEW0LWpwMgpMytVncGttF6ZKm2lu0qXdtrdV6wY3ZUsXBYCMbOGrTrce2SZqeNrc5m9bLIjpQxPHsD5PYpMkx+sAPDnzv+zwf3+0ACUipsiiSizuFCL7oVCbSK6tUtVW1SNst5tfZuf2Ui9pWN7Wtbm4/5eK6fQ6mlfzhSfmyy6BUWRQvZJxc3Cm8V/qnR3fey3O/32WT5Q73XhljzeVR1lwe5d4rY2yy3OH3XQGWf+fj+7qewILirryEZ11gsrPlt9vc3eGnuvUvWXZ3+Nlkuc1PG5xM0Vxrea55Yf0AD/w0xqJmHzc1eROiqNnH+h/HuPmoxFSN1RzbfKs1baWxjxVtI9xw2PNSVLSNsMDkYHJxpzAxQGO16C7cYMF+13Op6vCTZMwx/cWbTC/r8UzYVMHQx3UH3VxTPyxLVYef/z76jyRjjufvd3FFpZ2paqtq/OzN2dVOrt43HJfCQ27+bLvP8YpXu6pWYoqmqz0csPCrbjHXNMR4lF34m6P3HjNacj2LdvQEwgFLdNeZUyvF5OzVuxOMQ4rXk1MrcYnuOiMCsox2rqweDLPlpJfDo4/impOMqB9PdpWTGeV9XKztfnqa0nf2Mn1nL5fu6mWmvp9ZFXbWXhrhg4dPZANW7BkIs7zSwawKOzO+7WfIL+0bUQkA+KC8N5BR3s9oVEeGKPkfxg1Yprdxmd42oS9EeIky9f3tHxpsjEfLr7diBsj1ZOptYjhAMNpVH1U6KEdRo5v+QORJkqsXjI5nT4ZgEBUf73EGsqudlCPfLPGi9Z9wgFytYBhQRtzmnOpBwyd1EhPB2D5CknHHV9VIsR+8XNOQKHebEyHXNCQKBjH2D0gwiIq1ZpeY3+Diy5BndgVy66S0mOYh5ZlFxcajHstnx7x8ETYe8Yh55qh1j9KkIEkAJm8+5vxcfdrr05y5QTnUrb57RccHSwBMDvaGfMJKAvAKgKkApgN4HcAbAGYDmF+oa/l6W4Plh9KToq2ksXuwpNEqlTb3OLY2/NK2vuyEFsC7AOYAeBOAAsCrAKYBmBIMxaTgx5RxIa8BmAngLQBzAcwHkAwgNcgCAO8AmAfgbQCzguYzosyT/gcSaJj+/BZ/OQAAAABJRU5ErkJggg==\",\n                        \"style\": \"float: left;cursor: pointer; opacity: 0.7;\",\n                    }).bind(\"click\", pptxjslideObj.prevSlide)\n                );\n\n                $(\".slides-nav, .slides-nav-play\").on(\"mouseover\", function () {\n                    $(this).css({\n                        \"opacity\": 1\n                    });\n                });\n                $(\".slides-nav, .slides-nav-play\").on(\"mouseout\", function () {\n                    $(this).css({\n                        \"opacity\": 0.7\n                    });\n                });\n                if (data.slideCount == 1) {\n                    $(\"#\" + divId + \" #slides-prev\").hide();\n                } else if (data.slideCount == data.totalSlides) {\n                    $(\"#\" + divId + \" #slides-next\").hide();\n                } else {\n                    $(\"#\" + divId + \" #slides-next\").show();\n                }\n            } else {\n                $(\"#\" + divId + \" .slides-toolbar\").show();\n                data.isEnbleNextBtn = true;\n                data.isEnblePrevBtn = true;\n            }\n            if (document.getElementById(\"all_slides_warpper\") === null) {\n                $(\"#\" + divId + \" .slide\").wrapAll(\"<div id='all_slides_warpper'></div>\");\n            }\n            // Go to first slide\n            pptxjslideObj.gotoSlide(1);\n        },\n        nextSlide: function () {\n            var data = pptxjslideObj.data;\n            var isLoop = data.isLoop;\n            var isAutoMode = data.isAutoSlideMode;\n            if (data.slideCount < data.totalSlides) {\n                pptxjslideObj.gotoSlide(data.slideCount + 1);\n                if (!isAutoMode) $(\"#slides-next\").show();\n            } else {\n                if (isLoop) {\n                    pptxjslideObj.gotoSlide(1);\n                } else {\n                    if (!isAutoMode) $(\"#slides-next\").hide();\n                }\n            }\n            if (!isAutoMode) {\n                if (data.slideCount > 1) {\n                    $(\"#slides-prev\").show();\n                } else {\n                    $(\"#slides-prev\").hide();\n                }\n                if (data.slideCount == data.totalSlides && !isLoop) {\n                    $(\"#slides-next\").hide();\n                }\n            }\n            //return this;\n        },\n        prevSlide: function () {\n            var data = pptxjslideObj.data;\n            var isAutoMode = data.isAutoSlideMode;\n            if (data.slideCount > 1) {\n                pptxjslideObj.gotoSlide(data.slideCount - 1);\n            }\n            if (!isAutoMode) {\n                if (data.slideCount == 1) {\n                    $(\"#slides-prev\").hide();\n                } else {\n                    $(\"#slides-prev\").show();\n                }\n                $(\"#slides-next\").show();\n            }\n            return this;\n        },\n        gotoSlide: function (idx) {\n            var index = idx - 1;\n            var data = pptxjslideObj.data;\n            var slides = data.slides;\n            var prevSlidNum = data.prevSlide;\n            var transType = data.transition; /*\"slid\",\"fade\",\"default\" */\n            if (transType == \"random\") {\n                var tType = [\"\", \"default\", \"fade\", \"slid\"];\n                var randomNum = Math.floor(Math.random() * 3) + 1; //random number between 1 to 3\n                transType = tType[randomNum];\n            }\n            var transTime = 1000 * (data.transitionTime);\n            if (slides[index]) {\n                var nextSlide = $(slides[index]);\n                if ($(slides[prevSlidNum]).is(\":visible\")) { //remove \"index >= 1 &&\" bugFix to ver. 1.2.1\n                    if (transType == \"default\") {\n                        $(slides[prevSlidNum]).hide(transTime);\n                    } else if (transType == \"fade\") {\n                        $(slides[prevSlidNum]).fadeOut(transTime);\n                    } else if (transType == \"slid\") {\n                        $(slides[prevSlidNum]).slideUp(transTime);\n                    }\n                }\n                if (transType == \"default\") {\n                    nextSlide.show(transTime);\n                } else if (transType == \"fade\") {\n                    nextSlide.fadeIn(transTime);\n                } else if (transType == \"slid\") {\n                    nextSlide.slideDown(transTime);\n                }\n                data.prevSlide = index;\n                pptxjslideObj.data.slideCount = idx;\n                $(\"#slides-slide-num\").html(idx);\n            }\n            return this;\n        },\n        keyDown: function (event) {\n            event.preventDefault();\n            var key = event.keyCode;\n            //console.log(key);\n            var data = pptxjslideObj.data;\n            switch (key) {\n                case (37): // Left arrow\n                case (8): // Backspace\n                    if (data.isSlideMode && data.isEnblePrevBtn) {\n                        pptxjslideObj.prevSlide();\n                    }\n                    break;\n                case (39): // Right arrow\n                case (32): // Space \n                case (13): // Enter \n                    if (data.isSlideMode && data.isEnbleNextBtn) {\n                        pptxjslideObj.nextSlide();\n                    }\n                    break;\n                case (46): //Delete\n                    //if in auto mode , stop auto mode TODO\n                    if (data.isSlideMode) {\n                        var div_id = data.divId;\n                        $(\"#\" + div_id + \" .slide\").hide();\n                        pptxjslideObj.gotoSlide(1);               //bugFix to ver. 1.2.1\n                    }\n                    break;\n                case (27): //Esc\n                    if (data.isSlideMode) {\n                        pptxjslideObj.closeSileMode();\n                        data.isSlideMode = false;\n                    }\n                    break;\n                case (116): //F5\n                    if (!data.isSlideMode) {\n                        pptxjslideObj.startSlideMode();\n                        data.isSlideMode = true;\n                        if (data.isAutoSlideMode || data.isLoopMode) {\n                            clearInterval(data.loopIntrval);\n                            data.isAutoSlideMode = false;\n                            data.isLoopMode = false;\n                        }\n\n                    }\n                    break;\n                case (113): // F2\n                    if (data.isSlideMode) {\n                        pptxjslideObj.fullscreen();\n                    }\n                    break;\n                case (119): // F8\n                    if (data.isSlideMode) {\n                        pptxjslideObj.startAutoSlide();\n                        //TODO : ADD indication that it is in auto slide mode\n                    }\n                    break;\n            }\n            return true;\n        },\n        startSlideMode: function () {\n            pptxjslideObj.init();\n        },\n        closeSileMode: function () {\n            var data = pptxjslideObj.data;\n            data.isSlideMode = false;\n            var div_id = data.divId;\n            $(\"#\" + div_id + \" .slides-toolbar\").hide();\n            $(\"#\" + div_id + \" .slide\").show();\n            $(document.body).css(\"background-color\", pptxjslideObj.data.prevBgColor);\n            if (data.isLoopMode) {\n                clearInterval(data.loopIntrval);\n                data.isLoopMode = false;\n            }\n            pptxjslideObj.exitFullscreenMod();\n        },\n        startAutoSlide: function () {\n            var data = pptxjslideObj.data;\n            var isAutoSlideOption = data.timeBetweenSlides\n            var isAutoSlideMode = data.isAutoSlideMode;\n            console.log(\"start play: \", isAutoSlideMode, isAutoSlideOption)\n            if (!isAutoSlideMode && isAutoSlideOption !== false) {\n\n                data.isAutoSlideMode = true;\n                //var isLoopOption = data.isLoop;\n                var isStrtLoop = data.isLoopMode;\n                //hide and disable next and prev btn\n                if (data.nav) {\n                    var div_Id = data.divId;\n                    $(\"#\" + div_Id + \" .slides-toolbar .slides-nav\").hide();\n                    $(\"#\" + div_Id + \" #slides-play-pause\").attr(\"src\", \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAF00lEQVRIibWW7U+b5xXGb02TWu3DwodqW7R2XdVpbFW1hiBEAJu0iCSQqgloQ2oaLYhNSdos2xoSP37wGHHTD7Cp/YboIqVSAylBnZRCSu125IVAgh8wL8Zv2NjgF+LH8PAWE3BiQ/rbhywLydJsk7bzB1znPuc613XdQjympGppi9FglGVZ7qg11UZMNaY1U41prdZUG5FlucNoMMpStbTlcRiPLIPBoJcl+WRDfYNqtVhxu9xomkY6nSadTqNpGm6XG6vFSkN9gypL8kmDwaD/j8AlSTpkrjM7FEUhmUyS9nhYOXWKxNu/Z37XLubKylg8epTl06dJ+Xwkk0kURcFcZ3ZIknTo8eDHpJq2s21xTdNIOUZYOn6c2cJCpnNyUHNzmcrLI1pQQFinI6TXEykpYeHPf+K2x4OmabSdbYtLx6Sar31529m2+OrqKiutrczv3s1MTg7xfwBH8vMJ63RM6vVMbN1K8OWXCRYVESwuJrpvH0vnz7O6unq3ycOTGAwGvbnO7NA0jZXWVmbz84lv3kz0xRcJbdrERFYWgexs/Dk5+HJz8eXl4SsowKfT4SssZHzbNoKvvUai8zM0TcNcZ3Y8wIksyScVRSE1OspCeTnx7GzUqipmPvmEWGsrUx9/TOTMGcJnzjDZ0sJESwvB5mYCLS2MNzfjrqzEX1pK5MBBkj4fiqIgS/LJu6uplrY01DeoyWSSmydOMJOfT/Sll1A//JB5YHppidjCAtHZWULxOMFYDH80indyElcwiCsaZeDddxh7dQcTFeXMf9BIMpmkob5BlaqlLcJoMMpWi5WU18tscTGqXk8oO5twUxNhTSMYDOL3+xkbG8Pj8eB0OhkZGcFut6MoCgOOUZT6EwT2lBH99R6uv1XF7ckJrBYrRoNRFrIsd7hdblY++ojpwkKmtm5lMjeXYGMj3lAIt9vN6Ogodrudnp4eurq6sFgsfP55J1arhcu2Pr781V5cP3uOUEku4Tde5aa1HbfLjSzLHaLWVBvRNI2EUSL2yitEioqYKCjA39jIkNdLb28vVquV9vZ2zp07R0dHOxZrJ10XvuRy9wVso8N0VpQyvEHg/77A94NvMH34l2iaRq2pNiJMNaa1dDrN/OuvEy0uJrR9OxNFRTjff4/Oixf59NNznP+sA+sXFi5c6uJK72X6bL0MDNoYdgzgDQf4W+UuXM8IJn4qCGYKorpM0uk0phrT2j8bzO3dS6SkhNDOnbiefpq+Q2/xxbUeLl7uoudqN31KL/YhGyNOO27vCL5xF4FJL5E5lUv7y/D+WBDdLAhvEqjb1zW4t6LF43WES0pxb9xIvxAM/PYw/V4ng8MKDtcg7jEHvoCLYGiMcDRANDaJGo+iLSe4criCQNY3UfUbuJ7/LebfLr+/onskJ86exfPUUwwJgSIEw0ePMKZO4g+6CYZ8hKMBpmIh1OkoM7MqcwszLN6YZ3ltlWvVlYR030ErfZ7pbc+w1Pz+fZLvnenyiANPRgZDQmATAqfxGFNLs0ypYdTpKWZm48wtaNy4Mc/N5QTJWyuk0inuAIr8JtHSF1ioyOHGnjxu+Z33z3S90GIHDzIoBH1CMGauIwEkUiusrKa4/dUaq8Ad/rX63zGg/kLHUlUpt/5S/6DQ1ltFwmbDm5mJIgRDu3cR6u0h1NNN5Go3U31XuK70EBvoQR28RnxIIT5iJzbUj/3IARb3V5A2HyEVGHvQKh42u5mmJoafeII+IbjwpOBihqD7e4KrPxTYMgUDWU8yrNuIc8cLeMrz8b9RivabSu788RipnkuPNruH7Xq6qQlvZibObwvGvisIPCsI/UQwlSWI6zOYLf0RixW53Kzaye3f7eOr994lbev7ert+VOAk+vu5/uZBxp/LwP/sXRFFNgti+g3MlD7Pws9zWDlQRvr0B6TDk/8+cNZPsj4yl50jzDXWE99fjrojk5nyTBb/sI/lv54iHRr/7yJzPSf/t9B/YJr/wbfl7/GTWKgJirhoAAAAAElFTkSuQmCC\");\n\n                }\n                data.isEnbleNextBtn = false;\n                data.isEnblePrevBtn = false;\n                ///////////////////////////////\n\n                var t = isAutoSlideOption + data.transitionTime;\n\n                var slideNums = data.totalSlides;\n                var isRandomSlide = data.randomAutoSlide;\n                console.log(\"isRandomSlide: \", isRandomSlide)\n                if (!isStrtLoop) {\n                    var timeBtweenSlides = t * 1000; //milisecons\n                    data.isLoopMode = true;\n                    data.loopIntrval = setInterval(function () {\n                        if (isRandomSlide) {\n                            var randomSlideNum = Math.floor(Math.random() * slideNums) + 1;\n                            pptxjslideObj.gotoSlide(randomSlideNum);\n                        } else {\n                            pptxjslideObj.nextSlide();\n                        }\n                    }, timeBtweenSlides);\n                } else {\n                    clearInterval(data.loopIntrval);\n                    data.isLoopMode = false;\n                }\n            } else {\n                clearInterval(data.loopIntrval);\n                data.isAutoSlideMode = false;\n                data.isLoopMode = false;\n                //show and enable next and prev btn\n                if (data.nav) {\n                    var div_Id = data.divId;\n                    $(\"#\" + div_Id + \" .slides-toolbar .slides-nav\").show();\n                    $(\"#\" + div_Id + \" #slides-play-pause\").attr(\"src\", \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAF4UlEQVRIibWW+3NU9RnGz4ZR+5t0qjOVXmZ6M9b+0LEyuFRDjCEElMhEZlCSaWcohWgQoZE9e3Zdwg4Xd1FjJBQxlmgxbcm0NWNMJ6vBJuQCLCYxl92w2Vz3vtmTy2ZzOUnO7vrpDyklMEjbmfb9A97n+7zP+z7PVxBuU2KRqNXr9JIkSTUmo8lrNBgTRoMxYTKavJIk1eh1ekksErW363HL0ul0aZIolVst1pCtzobT4USWZVRVRVVVZFnG6XBiq7NhtVhDkiiV63S6tP+ouSiKheZic5fdbkdRFPrlODW9KmUXVV6pVzlYr/LbFpVah8pQJI6iKNjtdszF5i5RFAtv3/yAaKg6VxWWZZmrYZXfd8R58W8qOZXzPPHOHGknpkkvmSLz9SibS6fY/d40lS3z9IeWWFWdqwqLB0TDV7686lxVOB6PY3MtcvDvCTa8P8/qk7OsKZlm7fEpHnt1kvTD4zx+aIx0k0y6IUKWKYL43hSNXQvE4/ElkJuZ6HS6NHOxuUuWZWyuBXbVqDxyWuGh0lnWHI+hPRYl/fAE6SaZdVKETClClhhigxhiw4EQWS8HyTsSoaFjHlmWMRebu27QRBKlcrvdjiu8iL4+gfb0HNq3ZsksjfLUG2NsPBLhccMomfowG3R+Hi30kb0/yKb9AZ7c52fzvgCbX/JTVDLGgHcRu92OJErlS6MpErVWizWkKAoVbXEyKhRWl87w1IkJukeiBEfH6XGH2fSyi+KKMP3ecQxlg2TsHCB7t5cte3xsKfSSu8fHMy/6qPhwCkVRsFqsIbFI1Ap6nV6y1dkYlFV+8aHK2pMzPGKdYlvpKH6/n0hwhJGhfnJ/8zllf/SiTAcIhzz8pXaA7UX9bCzw8qwuSL4UJE8KssscZsi3iK3Ohl6nlwRJkmqcDifVjgWyziikl8Z49EiUba8F6HZcpdfRxRedX7D1pSsce9uNs6ed5uYmLrWcx1bfxK8PdfKtzX386DkfaXuDPGMM8dGFWZwOJ5Ik1Qgmo8kryzKvN6mkl82w/rUo6w6Nk2/xcdnezuVLTTQ0NvDDtTby97RS/0k11dXV1NZ+TGODjfb2Vk5UdnLflm6E9EHu2uLjl5YJZFnGZDR5BaPBmFBVlb0fLfLEmzGyLRNkFY+zzeyhobGZ5ubzXGhu5Js//Zj8fXau2M/TcvECbR2X6XZ04HJ3I0dcePw+cg66EHI8pBaMo6oqRoMx8S+A5/+8QPYbUZ62jvOTXSFSt/bSctlOX187Pb2drNLWscPUhWekE1e/gyFvH77gMKNyAHV+guhkkK2HLyLkeUkVY9cBro3oVds8OSWTpBaEELRD/GBTD73uPiLyMCPeIe5b9wkFFhexmIfQaICxyQgLC9Mk43NUX3Bx/wufIfzKjUYXI/dt5fqIron818/n+F5hBGH9CMKaAe7f2IPHH2R+YZLImMyq9fXsKR0imYwxvzAHfIk3PMHOt1rR7LAjGKbQHFPRHFawfLp4XeRra9o9PM/K5yJosoYRfubmgaxuxqOzAEzPzPHtJ+vZfzrAUiU495mL7+9tQCjyIpQmEcq+RDiRYOWpBFc8ietruvzQCt6cJCVzCOEhN999rIsrXTLB0Sk6egPcm9PI9pIAVz1jbLc2IexsQzg6i/AOrPgd3HEG7qiAgkZuPLTlVnGpZ4bU/BAr1rhJ+XEP9z7cxHcy6rknuxFNrpu7dvj4+q5OhBeGEY4nEE7DnRVw99kE36hMsroWWgPJG63iZrM7VTXJ134+yIoHexEe7EXQDiBke0nJG0XYPYFQNI3myCJCaYKUd+Hus0lW/SnOA9UJyq8mb212N9v1qcoxUrOHWPFwHykZg6Tk+EjJC6N5fhyNfgbNUQWhLMGdZ+CePyTJ+DTJ++7EV9v1rQLnYts0Ba+EWbnJi+ZpPyn5/wQQY0sAJ5OsrITCVrCHE/8+cJYzWR6Zbc45LB9EyT0WJVUfI/WoQu5ZFUtzgrZg8r+LzOWa/N9C/wY2/4Nvyz8A92FZT9kSnHgAAAAASUVORK5CYII=\");\n                }\n                data.isEnbleNextBtn = true;\n                data.isEnblePrevBtn = true;\n            }\n        },\n        fullscreen: function () {\n            if (!document.fullscreenElement &&\n                !document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement) {  // current working methods\n                var data = pptxjslideObj.data;\n                var div_Id = data.divId;\n                if (document.documentElement.requestFullscreen) {\n                    //document.documentElement.requestFullscreen();\n                    document.getElementById(div_Id).requestFullscreen();\n                } else if (document.documentElement.msRequestFullscreen) {\n                    //document.documentElement.msRequestFullscreen();\n                    document.getElementById(div_Id).msRequestFullscreen();\n                } else if (document.documentElement.mozRequestFullScreen) {\n                    //document.documentElement.mozRequestFullScreen();\n                    document.getElementById(div_Id).mozRequestFullScreen();\n                } else if (document.documentElement.webkitRequestFullscreen) {\n                    //document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);\n                    document.getElementById(div_Id).webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);\n                }\n\n                var winWidth = $(window).width();\n                var winHeight = $(window).height();\n                //Need to save:\n                orginalMainDivWidth = $(\"#\" + div_Id).width();\n                orginalMainDivHeight = $(\"#\" + div_Id).height();\n                var m = $(\"#\" + div_Id + \" #all_slides_warpper\").css('transform');\n                orginalSlidesWarpperScale = m.substring(m.indexOf('(') + 1, m.indexOf(')')).split(\",\")\n                orginalSlideTop = $(\"#\" + div_Id + \" #all_slides_warpper .slide\").offset().top;\n                orginalSlideLeft = $(\"#\" + div_Id + \" #all_slides_warpper .slide\").offset().left;\n                orginalSlidesToolbarWidth = $(\"#\" + div_Id + \" .slides-toolbar\").width();\n                orginalSlidesToolbarTop = $(\"#\" + div_Id + \" .slides-toolbar\").offset().top;\n\n                $(\"#\" + div_Id).attr({\n                    style: \"width: \" + (winWidth - 10) + \"px; height: \" + (winHeight - 10) + \"px;\"\n                });\n                $(\"#\" + div_Id + \" #all_slides_warpper\").css({\n                    \"transform\": \"scale(1)\"\n                });\n\n                /*\n                var slideWidth = $(\"#\" + div_Id + \" #all_slides_warpper .slide\").width();\n                var sildeHeight = $(\"#\" + div_Id + \" #all_slides_warpper .slide\").height();\n                $(\"#\" + div_Id + \" #all_slides_warpper .slide\").css({\n                    \"top\": ((winHeight - sildeHeight) / 2) + \"px\",\n                    \"left\": ((winWidth - slideWidth) / 2) + \"px\"\n                });\n                */\n                if (data.nav) {\n                    $(\"#\" + div_Id + \" .slides-toolbar\").css({\n                        \"width\": \"99%\",\n                        \"top\": \"20px\"\n                    });\n                }\n                //change fullscreen icon to other icon (red color)\n                $(\"#\" + div_Id + \" #slides-full-screen\").attr(\"src\", \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAAGXcA1uAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAXASURBVDhPtVVpTFRXFH42plVbraVtmjT9YZOm+sPUtKlpY9I2au1mxaogorY1okWttGpVIi6ICyDiiojiQuvCJm64gsswKjCgzM5sMAwMMDMwM/cNiyx/PD3nzIzapH/6oy/5cu+7975z7z3n+74n/eMx7Jor/Nrb4K0pBUmT/J2oiB4FiqiREJoPPZ2qyxAwVULdhskghZfcnTUMJGPmAtHdWAf9HgcMBjqhz9UI9Xt/Akm3c7ZwFKdBy4U94Cw9CM3nd0P1ivHBwO2KvHFdVtX03mbDkoClJtpdfXEMT/zrY9w9H3pbjDAo3DDgd0FPkxZsx/8ASZsyg08u198Hv6YcPMoCsB79HST1pmnQXJIBLZf2gfPyfmgq2AaWwyuCE3T28B0Ipv2LQVIkfzHMX3t1Uo9ds7DLoVvkrbs+lTdvzEvsar2SBU35W6H5XDqHa712GNrLT2CbDS0X94KjOBXspzdhmwaSIWOe0KdGgdArOGfdjWrAe0Kvsx56mvUQsKjA9+g66LbPBNuxNZSpOUKz+WuO6LqVB557hdBReR48FfngVpzBsZO8U82qj8GSsxKvvW2moItYc1fhdX+DhpProPGvDdB4aiO3DSfW8njl0vfAnPULSG7FaX/H/WLwqkpB6O4A9bvtGujzNAWPZK4Gv7oMOh6U4O5Fz4oPAEMQQ588eTIcMRIxilocG4F4EfFCaOl/fIgW9rPJ4CjcgRTJBCemuL3sGLTdzA3SBavXlJ/CtMES9Eh0KdOBOD734zYrDPjaYFDuYPR7nfC41Qxd1howZMRC/Z4fZYkYok+LxgvfxYlaZI2OWUQgBlEifHU3QJ86B4y7F8gSpZPS2ll1ASdugmxQcgFl4z0uGNcEa6NN+R6MGbH4Aea4ds0nfG4qVDB9hcHC3TkFbTeOMlXUm78Cw64YWSIKqlZOYL4Qb1gblw8wwjyihNApDOn4gflQPFTFjwXrkQRmfENeYrDKp5K4T2NEePXGqYCCkyXKEOkyzO3neR7uU6ve+CUSMFKW6KwdD85xJoixdNHH7TZMsQW6Gh7xmLf2CtPCdftPESxe+fG3O5XnP5KNyinddl1Ur0O/GCkeF7BrFgjt7Rne2tKJzqqi4bw4/BBXiDPIn5dDPBqF768ghiGGhpZJUuuVQ+VuZYHsU98SwqgUWFXRZXsosGii12kSfS6bQLsR/T6XGJA7xGC3TwwIj+j3tok+j10gO0RvsxFtSY3f1pK/Cc+DEtF+M1d2lh64w55Fmavft4jLod06nYtKdkKq1G3/AXQ7ZlFGn4JYwn0ap3lcp90Wyd+oVn6AnvczV8OYuVBGw4oVNuQrFh2pNZ9ZFDBXcULDNCQO97ka2DD73HZuKfF4Q9YkmaowVKCv3QJ9ejTHeroB2bbt2Go+CZ2c6EqVIysnMyRBkxgoyPMgHRCdKajv4TWk+kXorL4Emi3fcCySAB44uAERS5P8LTxK/Jyd1V1xlqlCH5Dr0oa0MTkHB8OfBM2RTshh3HdPs3chbeDh2kkci2KydjCXwpLzK1OdjI0slmTQevUQ66a97DgbIvkB6SsMmmu7nsOGyLJB7yDpUB1JZxSTpaPdMVuYs5fxBvTfIX8m6djPbGGQnzcVbgdH0c6g7sLAdxqnefuZzSHJJUHVsnGsGoqJ9i5LmpRIYcpaytoLO63p4BJcsJxtmq5KNaKiERmegt5xnObptBSQvqmMexfqkqYAxUSWyRKal0wTRLnntVsx91VuWeezR+D7aFDOiwgi9nWoiHmNx3hdaG34W6IwxcSfVECqWv1pxL2YN95XJUzINGUv66w/uCRgyooPmHNWyMgEgf8Vf0Peej9arw/7iPWhdp0fb+G35q6WLUcSZEtOQsB8eDn1PdUJE3YqYt4aY9wTFxHS87OHLCAk/zexPwbb8YiJiM8QUxHTQpiMmIT4EDEW8Q6uH43tS9gOCYX7vx9J+hsvJPGPOaYclwAAAABJRU5ErkJggg==\")\n            } else {\n                if (document.exitFullscreen) {\n                    document.exitFullscreen();\n                } else if (document.msExitFullscreen) {\n                    document.msExitFullscreen();\n                } else if (document.mozCancelFullScreen) {\n                    document.mozCancelFullScreen();\n                } else if (document.webkitExitFullscreen) {\n                    document.webkitExitFullscreen();\n                }\n\n                pptxjslideObj.exitFullscreenMod();\n            }\n\n        },\n        exitFullscreenMod: function () {\n            var data = pptxjslideObj.data;\n            var div_Id = data.divId;\n            //saved:\n            /*\n            orginalMainDivWidth\n            orginalMainDivHeight\n            orginalSlidesWarpperScale\n            orginalSlideTop\n            orginalSlideLeft\n            orginalSlidesToolbarWidth\n            orginalSlidesToolbarTop\n            */\n            $(\"#\" + div_Id).attr({\n                style: \"width: \" + orginalMainDivWidth + \"px; height: \" + orginalMainDivHeight + \"px;\"\n            });\n            console.log(orginalSlidesWarpperScale[0])\n            $(\"#\" + div_Id + \" #all_slides_warpper\").css({\n                \"transform\": \"scale(\" + orginalSlidesWarpperScale[0] + \")\"\n            });\n\n            $(\"#\" + div_Id + \" #all_slides_warpper .slide\").css({\n                \"top\": \"0px\", /**orginalSlideTop +  */\n                \"left\": \"0px\" /**orginalSlideLeft +  */\n            });\n\n            if (data.nav) {\n                $(\"#\" + div_Id + \" .slides-toolbar\").css({\n                    \"width\": orginalSlidesToolbarWidth + \"px\",\n                    \"top\": orginalSlidesToolbarTop + \"px\"\n                });\n            }\n\n            //change fullscreen icon to orginal icon - TODO\n            $(\"#\" + div_Id + \" #slides-full-screen\").attr(\"src\", \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAGwUlEQVRIibWWW0zU+RWAR1eHgaJtN92kbXYTkjUtlW26u6m7cQsMFwsyzAAOMyBQVGCAhUFgUFirYlABgSAXB6MgcinoDCBR3IGxwhABg1wEZQYRMIg3arn9B7ft+vj1AcK2Tdq+tCf5Hn7nnPy+nKdzRKL/d5SVld9uaLxiN//xttDT2yf03xsQhu+PCGNWqzD+aEJ48mRGePbsufDq1ZywsLgoLAuCML+wILx4+VJ4+nRWeDw5LVhtNmF09IFwb2BQ6LJ0C0Zjs1BZWWUvKSm1iDIOH35TWFRMWfk5jh07xonjxzmVk0Nebi6FBQWcLS6mrLSUCr2eyosXuVRVxcULF9CfO0dpSQnFRUWcyc8n99QpcrKzOXLkCGcKCjl9OpfDWVl/EYWHhwupqWlER0Wx7Re/ZOfuENwDQvCUheAVqMRHrmSXQolfUCj+QcpVgkPxCwrFV7Fa9wpU4ilT4iFT8qHrR0RGRpKamkZERKRdFB6+V0hP1xGuViGP1WGwzXPt0SKm6WW6Zu30vfqGofm/Mbr0LVbhLTb7W6zCW0YWv2Xg9V+58+IN5hmB1olFasbm2B2dQpgqlNTUNCIjo+yisLBwIS0tHZUyhF0RSdQP/YnG4TmaxxZoe7SEeUrA8nSFO8/e0Pv8DX0vvqHn+Ru6Z1fofGLH9HiZZusClf0vKet9jpcqFpUy5LsJ1OowITU1jZAgBZ6hsVy6+5Lq3lnqh+YwPpin1bbIzYkl2ieXMU8JmKcFOqYETJPL3Hi0ROPIa873veBs1wzFlll2KqIIVsg5eDCV8PAIu2jPnlAhJeUgclkAn8kiOWeZQd85SWXPU2oGXtJ4/zWG0XmarQu0rNFsXcDwYJ7qgVec63nO2c4n5JsmyGuf5lM/NXJZAFptCmp12KpAm5JCgL8fv/JVUdT+mKKbY5SaJ6iwTFPZM0t1/wtqBl5RNzRH3dDc6sd3nnG2a4bCW1Pk3hwn+9oo2a3juEmD2O23i+RkLSqVelWQnKzFz9cHV3cFJ1secLJpkLzroxSZbJSYJyjvnELf/QR99wylndMUdEyS3z5B7s1xcq6PcdQ4TGZDP5lX7rPt8934+fp8J1AogoSkpGR8vb1w2eFPVv09smp6ONpwlxPGQU5du0/ejQfkt1nJuTZKdssqx5ru83vDEJkN90iv6SWlshvtpT4++NgbHy8piYlJKEND7SK5XCEkJCTiLfXk/Y990F7oRqu/RdrFLjIu3+Gruj6y6u+iq+kjo+7uOuk1vaReukNKZTeJFZ3ElrYTW97FT9w88PHyJCExkT17lKuC+PgEvKUe/NhNyv4iE/sLrhN39msSyjvQlHUQV9ZBvP4WiRWdJJ3vJLGikwT9bTTlZmJKTEQXtrE37xp7z9zkPdedeEs9iI9PWBUEBsqFuDgN3lIPfuTqTuiJZlTZVwk7aUR9somw0y1E5LcSVXCD6MK2daIKbhCR30r46RZCc4wEHW0kKLuZH277DC9PD+LiNAQHB9tFMlmgEBsbh5fUg+9/+Dl+GXX4plaxK72a3Zm1yI80EHT0CiHHr6I8YVgl20DI8asEHb1C4Ff1BGTWsiu9Gl9dHVtdfo3Uw52YmFgUiiC7KCBAJhw4EIPUw52tLjtwTzyPe3w5XskV+B68iH96FQEZ1cgyLxOYVbOOLPMyARnV+KdX4ZNyAWmSHqm2EucPPsHT/TccOBCDXK6wi/z8/IV9+/YjlUoRiURscnDmHbHTOpscnNdw+qf8au1f386IRCI8PaVER+9DJgu0i4KD99g1mngCA+WIxWLEmzfjIBYjcXDAQSxmg0jEOxs34iiR4OzktIqzE06OjjhKJEgkDuu94s2bEYvFyOUKNJp4VCr1iqjuD43LDQ1XMBibMDY1c/1GG+3tHXR2WbB0d2MwGDGZTIyMjDI1Nc3MzFMeT04yZrUyNDTM3f5+LJZuzOZbtLV9TVNzC1cNRq4ajNTW1QsiNze3d7ds2fKz7du3F8dpNAsxsXErcZr4lfiEJHuyNkXQ6TKWdRmHl9N1h5Z0hzKXDmVmLekOZS7pdBnLaem65YOpafZkbYo94cukFU18gv3LZO2fXV2350kkEhe1Wv3u+up0cXGR6PX6n9bW1roajcZPTSbTFxaLxWdwcDBweHhY9fDhw9/ZbLbY8fFxjc1mi7NarQdGRkai+vv71RaLRWE2m31bW1t3GAwGl5KSEsd/u6OBjcD3gPcAF+AjYAfgAfgCv13DG/gC+AT4OfA+8APAAdjwnwQb1iSbADHguCbcAmz9B7YAzoATIFnr3QRs/B/eJP89/g4EWvXUVw2aogAAAABJRU5ErkJggg==\");\n        }\n\n    };\n    $.fn.divs2slides = function (options) {\n        var target = $(this);\n        var divId = target.attr(\"id\");\n        var slides = $(\"#\" + divId + \" .slide\");//target.children();\n        //console.log(slides)\n        var totalSlides = slides.length;\n        var prevBgColor;\n        var settings = $.extend(true, {\n            // These are the defaults.\n            first: 1,\n            nav: true, /** true,false : show or not nav buttons*/\n            showPlayPauseBtn: true, /** true,false */\n            showFullscreenBtn: true, /** true,false */\n            navTxtColor: \"black\", /** color */\n            keyBoardShortCut: true, /** true,false */\n            showSlideNum: true, /** true,false */\n            showTotalSlideNum: true, /** true,false */\n            autoSlide: 1, /** false or seconds (the pause time between slides) , F8 to active(condition: keyBoardShortCut: true) */\n            randomAutoSlide: false, /** true,false ,(condition: autoSlide:true */\n            loop: false,  /** true,false */\n            background: false, /** false or color*/\n            transition: \"default\", /** transition type: \"slid\",\"fade\",\"default\",\"random\" , to show transition efects :transitionTime > 0.5 */\n            transitionTime: 1 /** transition time in seconds */\n        }, options);\n        var slideCount = settings.first\n        pptxjslideObj.data = {\n            nav: settings.nav,\n            navTxtColor: settings.navTxtColor,\n            showPlayPauseBtn: settings.showPlayPauseBtn,\n            showFullscreenBtn: settings.showFullscreenBtn,\n            showSlideNum: settings.showSlideNum,\n            showTotalSlideNum: settings.showTotalSlideNum,\n            target: target,\n            divId: divId,\n            slides: slides,\n            isSlideMode: true,\n            totalSlides: totalSlides,\n            slideCount: slideCount,\n            prevSlide: 0,\n            transition: settings.transition,\n            transitionTime: settings.transitionTime,\n            slctdBgClr: settings.background,\n            prevBgColor: prevBgColor,\n            timeBetweenSlides: settings.autoSlide,\n            isLoop: settings.loop,\n            isLoopMode: false,\n            isAutoSlideMode: false,\n            randomAutoSlide: settings.randomAutoSlide,\n            isEnbleNextBtn: true,\n            isEnblePrevBtn: true,\n            isInit: false\n        }\n\n        // Keyboard shortcuts\n        if (settings.keyBoardShortCut) {\n            $(document).bind(\"keydown\", pptxjslideObj.keyDown);\n        }\n        if (document.addEventListener) {\n            document.addEventListener('webkitfullscreenchange', exitHandler, false);\n            document.addEventListener('mozfullscreenchange', exitHandler, false);\n            document.addEventListener('fullscreenchange', exitHandler, false);\n            document.addEventListener('MSFullscreenChange', exitHandler, false);\n        }\n\n        function exitHandler() {\n            if (document.webkitIsFullScreen === false || document.mozFullScreen === false || document.msFullscreenElement === null) {\n                pptxjslideObj.exitFullscreenMod();\n            }\n        }\n        pptxjslideObj.init();\n    }\n})(jQuery);\n"
  },
  {
    "path": "pages/include/PPTXjs/js/filereader.js",
    "content": "/*!\nFileReader.js - v0.99\nA lightweight wrapper for common FileReader usage.\nCopyright 2014 Brian Grinstead - MIT License.\nSee http://github.com/bgrins/filereader.js for documentation.\n*/\n\n(function(window, document) {\n\n    var FileReader = window.FileReader;\n    var FileReaderSyncSupport = false;\n    var workerScript = \"self.addEventListener('message', function(e) { var data=e.data; try { var reader = new FileReaderSync; postMessage({ result: reader[data.readAs](data.file), extra: data.extra, file: data.file})} catch(e){ postMessage({ result:'error', extra:data.extra, file:data.file}); } }, false);\";\n    var syncDetectionScript = \"onmessage = function(e) { postMessage(!!FileReaderSync); };\";\n    var fileReaderEvents = ['loadstart', 'progress', 'load', 'abort', 'error', 'loadend'];\n    var sync = false;\n    var FileReaderJS = window.FileReaderJS = {\n        enabled: false,\n        setupInput: setupInput,\n        setupBlob: setupBlob,\n        setupDrop: setupDrop,\n        setupClipboard: setupClipboard,\n        setSync: function (value) {\n            sync = value;\n\n            if (sync && !FileReaderSyncSupport) {\n                checkFileReaderSyncSupport();\n            }\n        },\n        getSync: function() {\n            return sync && FileReaderSyncSupport;\n        },\n        output: [],\n        opts: {\n            dragClass: \"drag\",\n            accept: false,\n            readAsDefault: 'DataURL',\n            readAsMap: {\n            },\n            on: {\n                loadstart: noop,\n                progress: noop,\n                load: noop,\n                abort: noop,\n                error: noop,\n                loadend: noop,\n                skip: noop,\n                groupstart: noop,\n                groupend: noop,\n                beforestart: noop\n            }\n        }\n    };\n\n    // Setup jQuery plugin (if available)\n    if (typeof(jQuery) !== \"undefined\") {\n        jQuery.fn.fileReaderJS = function(opts) {\n            return this.each(function() {\n                if (jQuery(this).is(\"input\")) {\n                    setupInput(this, opts);\n                }\n                else {\n                    setupDrop(this, opts);\n                }\n            });\n        };\n\n        jQuery.fn.fileClipboard = function(opts) {\n            return this.each(function() {\n                setupClipboard(this, opts);\n            });\n        };\n    }\n\n    // Not all browsers support the FileReader interface. Return with the enabled bit = false.\n    if (!FileReader) {\n        return;\n    }\n\n\n    // makeWorker is a little wrapper for generating web workers from strings\n    function makeWorker(script) {\n        var URL = window.URL || window.webkitURL;\n        var Blob = window.Blob;\n        var Worker = window.Worker;\n\n        if (!URL || !Blob || !Worker || !script) {\n            return null;\n        }\n\n        var blob = new Blob([script]);\n        var worker = new Worker(URL.createObjectURL(blob));\n        return worker;\n    }\n\n    // setupClipboard: bind to clipboard events (intended for document.body)\n    function setupClipboard(element, opts) {\n\n        if (!FileReaderJS.enabled) {\n            return;\n        }\n        var instanceOptions = extend(extend({}, FileReaderJS.opts), opts);\n\n        element.addEventListener(\"paste\", onpaste, false);\n\n        function onpaste(e) {\n            var files = [];\n            var clipboardData = e.clipboardData || {};\n            var items = clipboardData.items || [];\n\n            for (var i = 0; i < items.length; i++) {\n                var file = items[i].getAsFile();\n\n                if (file) {\n\n                    // Create a fake file name for images from clipboard, since this data doesn't get sent\n                    var matches = new RegExp(\"/\\(.*\\)\").exec(file.type);\n                    if (!file.name && matches) {\n                        var extension = matches[1];\n                        file.name = \"clipboard\" + i + \".\" + extension;\n                    }\n\n                    files.push(file);\n                }\n            }\n\n            if (files.length) {\n                processFileList(e, files, instanceOptions);\n                e.preventDefault();\n                e.stopPropagation();\n            }\n        }\n    }\n\n    // setupInput: bind the 'change' event to an input[type=file]\n    function setupInput(input, opts) {\n\n        if (!FileReaderJS.enabled) {\n            return;\n        }\n        var instanceOptions = extend(extend({}, FileReaderJS.opts), opts);\n\n        input.addEventListener(\"change\", inputChange, false);\n        input.addEventListener(\"drop\", inputDrop, false);\n\n        function inputChange(e) {\n            processFileList(e, input.files, instanceOptions);\n        }\n\n        function inputDrop(e) {\n            e.stopPropagation();\n            e.preventDefault();\n            processFileList(e, e.dataTransfer.files, instanceOptions);\n        }\n    }\n    // setupFile: bind the 'change' event to an input[type=file]\n    function setupBlob(blob, opts) {\n       \n        if (!FileReaderJS.enabled) {\n            return;\n        }\n\n        if(blob.constructor !== Array && blob.constructor !== Function){\n            if(blob.name === undefined){\n                blob.name = \"blob\";\n            }          \n            blob = [blob];\n        }else{\n\n            if(blob[0].name === undefined){\n                blob[0].name = \"blob\";\n            }    \n        }\n        \n        var instanceOptions = extend(extend({}, FileReaderJS.opts), opts);\n\n        processFileList(null, blob, instanceOptions);\n\n    }\n    // setupDrop: bind the 'drop' event for a DOM element\n    function setupDrop(dropbox, opts) {\n\n        if (!FileReaderJS.enabled) {\n            return;\n        }\n        var instanceOptions = extend(extend({}, FileReaderJS.opts), opts);\n        var dragClass = instanceOptions.dragClass;\n        var initializedOnBody = false;\n\n        // Bind drag events to the dropbox to add the class while dragging, and accept the drop data transfer.\n        dropbox.addEventListener(\"dragenter\", onlyWithFiles(dragenter), false);\n        dropbox.addEventListener(\"dragleave\", onlyWithFiles(dragleave), false);\n        dropbox.addEventListener(\"dragover\", onlyWithFiles(dragover), false);\n        dropbox.addEventListener(\"drop\", onlyWithFiles(drop), false);\n\n        // Bind to body to prevent the dropbox events from firing when it was initialized on the page.\n        document.body.addEventListener(\"dragstart\", bodydragstart, true);\n        document.body.addEventListener(\"dragend\", bodydragend, true);\n        document.body.addEventListener(\"drop\", bodydrop, false);\n\n        function bodydragend(e) {\n            initializedOnBody = false;\n        }\n\n        function bodydragstart(e) {\n            initializedOnBody = true;\n        }\n\n        function bodydrop(e) {\n            if (e.dataTransfer.files && e.dataTransfer.files.length ){\n                e.stopPropagation();\n                e.preventDefault();\n            }\n        }\n\n        function onlyWithFiles(fn) {\n            return function() {\n                if (!initializedOnBody) {\n                    fn.apply(this, arguments);\n                }\n            };\n        }\n\n        function drop(e) {\n            e.stopPropagation();\n            e.preventDefault();\n            if (dragClass) {\n                removeClass(dropbox, dragClass);\n            }\n            processFileList(e, e.dataTransfer.files, instanceOptions);\n        }\n\n        function dragenter(e) {\n            e.stopPropagation();\n            e.preventDefault();\n            if (dragClass) {\n                addClass(dropbox, dragClass);\n            }\n        }\n\n        function dragleave(e) {\n            if (dragClass) {\n                removeClass(dropbox, dragClass);\n            }\n        }\n\n        function dragover(e) {\n            e.stopPropagation();\n            e.preventDefault();\n            if (dragClass) {\n                addClass(dropbox, dragClass);\n            }\n        }\n    }\n\n    // setupCustomFileProperties: modify the file object with extra properties\n    function setupCustomFileProperties(files, groupID) {\n        for (var i = 0; i < files.length; i++) {\n            var file = files[i];\n            file.extra = {\n                nameNoExtension: file.name.substring(0, file.name.lastIndexOf('.')),\n                extension: file.name.substring(file.name.lastIndexOf('.') + 1),\n                fileID: i,\n                uniqueID: getUniqueID(),\n                groupID: groupID,\n                prettySize: prettySize(file.size)\n            };\n        }\n    }\n\n    // getReadAsMethod: return method name for 'readAs*' - http://www.w3.org/TR/FileAPI/#reading-a-file\n    function getReadAsMethod(type, readAsMap, readAsDefault) {\n        for (var r in readAsMap) {\n            if (type.match(new RegExp(r))) {\n                return 'readAs' + readAsMap[r];\n            }\n        }\n        return 'readAs' + readAsDefault;\n    }\n\n    // processFileList: read the files with FileReader, send off custom events.\n    function processFileList(e, files, opts) {\n        var filesLeft = files.length;\n        var group = {\n            groupID: getGroupID(),\n            files: files,\n            started: new Date()\n        };\n\n        function groupEnd() {\n            group.ended = new Date();\n            opts.on.groupend(group);\n        }\n\n        function groupFileDone() {\n            if (--filesLeft === 0) {\n                groupEnd();\n            }\n        }\n\n        FileReaderJS.output.push(group);\n        setupCustomFileProperties(files, group.groupID);\n\n        opts.on.groupstart(group);\n\n        // No files in group - end immediately\n        if (!files.length) {\n            groupEnd();\n            return;\n        }\n\n        var supportsSync = sync && FileReaderSyncSupport;\n        var syncWorker;\n\n        // Only initialize the synchronous worker if the option is enabled - to prevent the overhead\n        if (supportsSync) {\n            syncWorker = makeWorker(workerScript);\n            syncWorker.onmessage = function(e) {\n                var file = e.data.file;\n                var result = e.data.result;\n\n                // Workers seem to lose the custom property on the file object.\n                if (!file.extra) {\n                    file.extra = e.data.extra;\n                }\n\n                file.extra.ended = new Date();\n\n                // Call error or load event depending on success of the read from the worker.\n                opts.on[result === \"error\" ? \"error\" : \"load\"]({ target: { result: result } }, file);\n                groupFileDone();\n            };\n        }\n\n        Array.prototype.forEach.call(files, function(file) {\n\n            file.extra.started = new Date();\n\n            if (opts.accept && !file.type.match(new RegExp(opts.accept))) {\n                opts.on.skip(file);\n                groupFileDone();\n                return;\n            }\n\n            if (opts.on.beforestart(file) === false) {\n                opts.on.skip(file);\n                groupFileDone();\n                return;\n            }\n\n            var readAs = getReadAsMethod(file.type, opts.readAsMap, opts.readAsDefault);\n\n            if (syncWorker) {\n                syncWorker.postMessage({\n                    file: file,\n                    extra: file.extra,\n                    readAs: readAs\n                });\n            }\n            else {\n\n                var reader = new FileReader();\n                reader.originalEvent = e;\n\n                fileReaderEvents.forEach(function(eventName) {\n                    reader['on' + eventName] = function(e) {\n                        if (eventName == 'load' || eventName == 'error') {\n                            file.extra.ended = new Date();\n                        }\n                        opts.on[eventName](e, file);\n                        if (eventName == 'loadend') {\n                            groupFileDone();\n                        }\n                    };\n                });\n                reader[readAs](file);\n            }\n        });\n    }\n\n    // checkFileReaderSyncSupport: Create a temporary worker and see if FileReaderSync exists\n    function checkFileReaderSyncSupport() {\n        var worker = makeWorker(syncDetectionScript);\n        if (worker) {\n            worker.onmessage =function(e) {\n                FileReaderSyncSupport = e.data;\n            };\n            worker.postMessage({});\n        }\n    }\n\n    // noop: do nothing\n    function noop() {\n\n    }\n\n    // extend: used to make deep copies of options object\n    function extend(destination, source) {\n        for (var property in source) {\n            if (source[property] && source[property].constructor &&\n                source[property].constructor === Object) {\n                destination[property] = destination[property] || {};\n                arguments.callee(destination[property], source[property]);\n            }\n            else {\n                destination[property] = source[property];\n            }\n        }\n        return destination;\n    }\n\n    // hasClass: does an element have the css class?\n    function hasClass(el, name) {\n        return new RegExp(\"(?:^|\\\\s+)\" + name + \"(?:\\\\s+|$)\").test(el.className);\n    }\n\n    // addClass: add the css class for the element.\n    function addClass(el, name) {\n        if (!hasClass(el, name)) {\n          el.className = el.className ? [el.className, name].join(' ') : name;\n        }\n    }\n\n    // removeClass: remove the css class from the element.\n    function removeClass(el, name) {\n        if (hasClass(el, name)) {\n          var c = el.className;\n          el.className = c.replace(new RegExp(\"(?:^|\\\\s+)\" + name + \"(?:\\\\s+|$)\", \"g\"), \" \").replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n        }\n    }\n\n    // prettySize: convert bytes to a more readable string.\n    function prettySize(bytes) {\n        var s = ['bytes', 'kb', 'MB', 'GB', 'TB', 'PB'];\n        var e = Math.floor(Math.log(bytes)/Math.log(1024));\n        return (bytes/Math.pow(1024, Math.floor(e))).toFixed(2)+\" \"+s[e];\n    }\n\n    // getGroupID: generate a unique int ID for groups.\n    var getGroupID = (function(id) {\n        return function() {\n            return id++;\n        };\n    })(0);\n\n    // getUniqueID: generate a unique int ID for files\n    var getUniqueID = (function(id) {\n        return function() {\n            return id++;\n        };\n    })(0);\n\n    // The interface is supported, bind the FileReaderJS callbacks\n    FileReaderJS.enabled = true;\n\n})(this, document);"
  },
  {
    "path": "pages/include/PPTXjs/js/pptxjs.js",
    "content": "/**\r\n * pptxjs.js\r\n * Ver. : 1.11.0\r\n * last update: 09/01/2021\r\n * Author: meshesha , https://github.com/meshesha\r\n * LICENSE: MIT\r\n * url:https://meshesha.github.io/pptxjs\r\n * New: \r\n *  - Support for embedding video from a link (tested youtube and vimeo links)\r\n *  - support 'revealjs'(https://revealjs.com) (It is not recommended to add a theme because it distorts some of the elements like tables )\r\n *  - i think i fix issue [officetohtml/issues/7] (https://github.com/meshesha/officetohtml/issues/7)(not tested) \r\n *  - change loading view \r\n *  - fix center slides in fullscreen mode - (https://github.com/meshesha/divs2slides v1.3.3)\r\n *  - support emf and wmf files - microsoft files, supported only in Internet Explorer (test in IE11)\r\n */\r\n\r\n(function ($) {\r\n    $.fn.pptxToHtml = function (options) {\r\n        //var worker;\r\n        var $result = $(this);\r\n        var divId = $result.attr(\"id\");\r\n\r\n        var isDone = false;\r\n\r\n        var MsgQueue = new Array();\r\n\r\n        var themeContent = null;\r\n\r\n        var slideLayoutClrOvride = \"\";\r\n\r\n        var chartID = 0;\r\n        var _order = 1;\r\n\r\n\r\n        ////////////////////// \r\n        var slideWidth = 0;\r\n        var slideHeight = 0;\r\n        var isSlideMode = false;\r\n        var styleTable = {};\r\n        var settings = $.extend(true, {\r\n            // These are the defaults.\r\n            pptxFileUrl: \"\",\r\n            fileInputId: \"\",\r\n            slidesScale: \"\", //Change Slides scale by percent\r\n            slideMode: false, /** true,false*/\r\n            slideType: \"divs2slidesjs\",  /*'divs2slidesjs' (default) , 'revealjs'(https://revealjs.com)  -TODO*/\r\n            revealjsPath: \"\", /*path to js file of revealjs - TODO*/\r\n            keyBoardShortCut: false,  /** true,false ,condition: slideMode: true XXXXX - need to remove - this is doublcated*/\r\n            mediaProcess: true, /** true,false: if true then process video and audio files */\r\n            jsZipV2: false,\r\n            slideModeConfig: {\r\n                first: 1,\r\n                nav: true, /** true,false : show or not nav buttons*/\r\n                navTxtColor: \"black\", /** color */\r\n                keyBoardShortCut: true, /** true,false ,condition: */\r\n                showSlideNum: true, /** true,false */\r\n                showTotalSlideNum: true, /** true,false */\r\n                autoSlide: true, /** false or seconds , F8 to active ,keyBoardShortCut: true */\r\n                randomAutoSlide: false, /** true,false ,autoSlide:true */\r\n                loop: false,  /** true,false */\r\n                background: false, /** false or color*/\r\n                transition: \"default\", /** transition type: \"slid\",\"fade\",\"default\",\"random\" , to show transition efects :transitionTime > 0.5 */\r\n                transitionTime: 1 /** transition time between slides in seconds */\r\n            },\r\n            revealjsConfig: {}\r\n        }, options);\r\n        //\r\n        $(\"#\" + divId).prepend(\r\n            $(\"<div></div>\").attr({\r\n                \"class\": \"slides-loadnig-msg\",\r\n                \"style\": \"display:block; width:100%; color:white; background-color: #ddd;\"\r\n            })/*.html(\"Loading...\")*/\r\n                .html($(\"<div></div>\").attr({\r\n                    \"class\": \"slides-loading-progress-bar\",\r\n                    \"style\": \"width: 1%; background-color: #4775d1;\"\r\n                }).html(\"<span style='text-align: center;'>Loading... (1%)</span>\"))\r\n        );\r\n        if (settings.slideMode) {\r\n            if (!jQuery().divs2slides) {\r\n                jQuery.getScript('./js/divs2slides.js');\r\n            }\r\n        }\r\n        if (settings.jsZipV2 !== false) {\r\n            jQuery.getScript(settings.jsZipV2);\r\n            if (localStorage.getItem('isPPTXjsReLoaded') !== 'yes') {\r\n                localStorage.setItem('isPPTXjsReLoaded', 'yes');\r\n                location.reload();\r\n            }\r\n        }\r\n\r\n        if (settings.keyBoardShortCut) {\r\n            $(document).bind(\"keydown\", function (event) {\r\n                event.preventDefault();\r\n                var key = event.keyCode;\r\n                console.log(key, isDone)\r\n                if (key == 116 && !isSlideMode) { //F5\r\n                    isSlideMode = true;\r\n                    initSlideMode(divId, settings);\r\n                    // $(\"#\" + divId + \" .slide\").hide();\r\n                    // setTimeout(function () {\r\n                    //     var slideConf = settings.slideModeConfig;\r\n                    //     $(\".slides-loadnig-msg\").remove()\r\n                    //     $(\"#\" + divId).divs2slides({\r\n                    //         first: slideConf.first,\r\n                    //         nav: slideConf.nav,\r\n                    //         showPlayPauseBtn: settings.showPlayPauseBtn,\r\n                    //         navTxtColor: slideConf.navTxtColor,\r\n                    //         keyBoardShortCut: slideConf.keyBoardShortCut,\r\n                    //         showSlideNum: slideConf.showSlideNum,\r\n                    //         showTotalSlideNum: slideConf.showTotalSlideNum,\r\n                    //         autoSlide: slideConf.autoSlide,\r\n                    //         randomAutoSlide: slideConf.randomAutoSlide,\r\n                    //         loop: slideConf.loop,\r\n                    //         background: slideConf.background,\r\n                    //         transition: slideConf.transition,\r\n                    //         transitionTime: slideConf.transitionTime\r\n                    //     });\r\n\r\n                    //     var sScale = settings.slidesScale;\r\n                    //     var trnsfrmScl = \"\";\r\n                    //     if (sScale != \"\") {\r\n                    //         var numsScale = parseInt(sScale);\r\n                    //         var scaleVal = numsScale / 100;\r\n                    //         trnsfrmScl = 'transform:scale(' + scaleVal + '); transform-origin:top';\r\n                    //     }\r\n\r\n                    //     var numOfSlides = 1;\r\n                    //     var sScaleVal = (sScale != \"\") ? scaleVal : 1;\r\n                    //     var slidesHeight = $(\"#\" + divId + \" .slide\").height();\r\n                    //     //console.log(slidesHeight);\r\n                    //     $(\"#all_slides_warpper\").attr({\r\n                    //         style: trnsfrmScl  /*+ \";height: \" + (numOfSlides * slidesHeight * sScaleVal) + \"px\"*/\r\n                    //     })\r\n                    // }, 1500);\r\n                } else if (key == 116 && isSlideMode) {\r\n                    //exit slide mode - TODO\r\n\r\n                }\r\n            });\r\n        }\r\n        FileReaderJS.setSync(false);\r\n        if (settings.pptxFileUrl != \"\") {\r\n            JSZipUtils.getBinaryContent(settings.pptxFileUrl, function (err, content) {\r\n                var blob = new Blob([content]);\r\n                var file_name = settings.pptxFileUrl;\r\n                var fArry = file_name.split(\".\");\r\n                fArry.pop();\r\n                blob.name = fArry[0];\r\n                FileReaderJS.setupBlob(blob, {\r\n                    readAsDefault: \"ArrayBuffer\",\r\n                    on: {\r\n                        load: function (e, file) {\r\n                            //console.log(e.target.result);\r\n                            convertToHtml(e.target.result);\r\n                        }\r\n                    }\r\n                });\r\n            });\r\n        } else {\r\n            $(\".slides-loadnig-msg\").remove()\r\n        }\r\n        if (settings.fileInputId != \"\") {\r\n            $(\"#\" + settings.fileInputId).on(\"change\", function (evt) {\r\n                $result.html(\"\");\r\n                var file = evt.target.files[0];\r\n                // var fileName = file[0].name;\r\n                //var fileSize = file[0].size;\r\n                var fileType = file.type;\r\n                if (fileType == \"application/vnd.openxmlformats-officedocument.presentationml.presentation\") {\r\n                    FileReaderJS.setupBlob(file, {\r\n                        readAsDefault: \"ArrayBuffer\",\r\n                        on: {\r\n                            load: function (e, file) {\r\n                                //console.log(e.target.result);\r\n                                convertToHtml(e.target.result);\r\n                            }\r\n                        }\r\n                    });\r\n                } else {\r\n                    alert(\"This is not pptx file\");\r\n                }\r\n            });\r\n        }\r\n\r\n        function updateProgressBar(percent) {\r\n            //console.log(\"percent: \", percent)\r\n            var progressBarElemtnt = $(\".slides-loading-progress-bar\")\r\n            progressBarElemtnt.width(percent + \"%\")\r\n            progressBarElemtnt.html(\"<span style='text-align: center;'>Loading...(\" + percent + \"%)</span>\");\r\n        }\r\n\r\n        function convertToHtml(file) {\r\n            //'use strict';\r\n            var zip = new JSZip(), s;\r\n            //if (typeof file === 'string') { // Load\r\n            zip = zip.load(file);  //zip.load(file, { base64: true });\r\n            var rslt_ary = processPPTX(zip);\r\n            //s = readXmlFile(zip, 'ppt/tableStyles.xml');\r\n            //var slidesHeight = $(\"#\" + divId + \" .slide\").height();\r\n            for (var i = 0; i < rslt_ary.length; i++) {\r\n                switch (rslt_ary[i][\"type\"]) {\r\n                    case \"slide\":\r\n                        $result.append(rslt_ary[i][\"data\"]);\r\n                        break;\r\n                    case \"pptx-thumb\":\r\n                        //$(\"#pptx-thumb\").attr(\"src\", \"data:image/jpeg;base64,\" +rslt_ary[i][\"data\"]);\r\n                        break;\r\n                    case \"slideSize\":\r\n                        slideWidth = rslt_ary[i][\"data\"].width;\r\n                        slideHeight = rslt_ary[i][\"data\"].height;\r\n                        /*\r\n                        $(\"#\"+divId).css({\r\n                            'width': slideWidth + 80,\r\n                            'height': slideHeight + 60\r\n                        });\r\n                        */\r\n                        break;\r\n                    case \"globalCSS\":\r\n                        $result.append(\"<style>\" + rslt_ary[i][\"data\"] + \"</style>\");\r\n                        break;\r\n                    case \"ExecutionTime\":\r\n                        processMsgQueue(MsgQueue);\r\n                        setNumericBullets($(\".block\"));\r\n                        setNumericBullets($(\"table td\"));\r\n\r\n                        isDone = true;\r\n\r\n                        if (settings.slideMode && !isSlideMode) {\r\n                            isSlideMode = true;\r\n                            initSlideMode(divId, settings);\r\n                            // $(\"#\" + divId + \" .slide\").hide();\r\n                            // setTimeout(function () {\r\n                            //     var slideConf = settings.slideModeConfig;\r\n                            //     $(\".slides-loadnig-msg\").remove();\r\n                            //     $(\"#\" + divId).divs2slides({\r\n                            //         first: slideConf.first,\r\n                            //         nav: slideConf.nav,\r\n                            //         showPlayPauseBtn: settings.showPlayPauseBtn,\r\n                            //         navTxtColor: slideConf.navTxtColor,\r\n                            //         keyBoardShortCut: slideConf.keyBoardShortCut,\r\n                            //         showSlideNum: slideConf.showSlideNum,\r\n                            //         showTotalSlideNum: slideConf.showTotalSlideNum,\r\n                            //         autoSlide: slideConf.autoSlide,\r\n                            //         randomAutoSlide: slideConf.randomAutoSlide,\r\n                            //         loop: slideConf.loop,\r\n                            //         background: slideConf.background,\r\n                            //         transition: slideConf.transition,\r\n                            //         transitionTime: slideConf.transitionTime\r\n                            //     });\r\n\r\n                            //     var sScale = settings.slidesScale;\r\n                            //     var trnsfrmScl = \"\";\r\n                            //     if (sScale != \"\") {\r\n                            //         var numsScale = parseInt(sScale);\r\n                            //         var scaleVal = numsScale / 100;\r\n                            //         trnsfrmScl = 'transform:scale(' + scaleVal + '); transform-origin:top';\r\n                            //     }\r\n\r\n                            //     var numOfSlides = 1;\r\n                            //     var sScaleVal = (sScale != \"\") ? scaleVal : 1;\r\n                            //     //console.log(slidesHeight);\r\n                            //     $(\"#all_slides_warpper\").attr({\r\n                            //         style: trnsfrmScl + \";height: \" + (numOfSlides * slidesHeight * sScaleVal) + \"px\"\r\n                            //     })\r\n\r\n                            // }, 1500);\r\n                        } else if (!settings.slideMode) {\r\n                            $(\".slides-loadnig-msg\").remove();\r\n                        }\r\n                        break;\r\n                    case \"progress-update\":\r\n                        //console.log(rslt_ary[i][\"data\"]); //update progress bar - TODO\r\n                        updateProgressBar(rslt_ary[i][\"data\"])\r\n                        break;\r\n                    default:\r\n                }\r\n            }\r\n            if (!settings.slideMode || (settings.slideMode && settings.slideType == \"revealjs\")) {\r\n\r\n                if (document.getElementById(\"all_slides_warpper\") === null) {\r\n                    $(\"#\" + divId + \" .slide\").wrapAll(\"<div id='all_slides_warpper' class='slides'></div>\");\r\n                    //$(\"#\" + divId + \" .slides\").wrap(\"<div class='reveal'></div>\");\r\n                }\r\n\r\n                if (settings.slideMode && settings.slideType == \"revealjs\") {\r\n                    $(\"#\" + divId).addClass(\"reveal\")\r\n                }\r\n            }\r\n\r\n            var sScale = settings.slidesScale;\r\n            var trnsfrmScl = \"\";\r\n            if (sScale != \"\") {\r\n                var numsScale = parseInt(sScale);\r\n                var scaleVal = numsScale / 100;\r\n                if (settings.slideMode && settings.slideType != \"revealjs\") {\r\n                    trnsfrmScl = 'transform:scale(' + scaleVal + '); transform-origin:top';\r\n                }\r\n            }\r\n\r\n            var slidesHeight = $(\"#\" + divId + \" .slide\").height();\r\n            var numOfSlides = $(\"#\" + divId + \" .slide\").length;\r\n            var sScaleVal = (sScale != \"\") ? scaleVal : 1;\r\n            //console.log(\"slidesHeight: \" + slidesHeight + \"\\nnumOfSlides: \" + numOfSlides + \"\\nScale: \" + sScaleVal)\r\n\r\n            $(\"#all_slides_warpper\").attr({\r\n                style: trnsfrmScl + \";height: \" + (numOfSlides * slidesHeight * sScaleVal) + \"px\"\r\n            })\r\n\r\n            //}\r\n        }\r\n\r\n        function initSlideMode(divId, settings) {\r\n            //console.log(settings.slideType)\r\n            if (settings.slideType == \"\" || settings.slideType == \"divs2slidesjs\") {\r\n                var slidesHeight = $(\"#\" + divId + \" .slide\").height();\r\n                $(\"#\" + divId + \" .slide\").hide();\r\n                setTimeout(function () {\r\n                    var slideConf = settings.slideModeConfig;\r\n                    $(\".slides-loadnig-msg\").remove();\r\n                    $(\"#\" + divId).divs2slides({\r\n                        first: slideConf.first,\r\n                        nav: slideConf.nav,\r\n                        showPlayPauseBtn: settings.showPlayPauseBtn,\r\n                        navTxtColor: slideConf.navTxtColor,\r\n                        keyBoardShortCut: slideConf.keyBoardShortCut,\r\n                        showSlideNum: slideConf.showSlideNum,\r\n                        showTotalSlideNum: slideConf.showTotalSlideNum,\r\n                        autoSlide: slideConf.autoSlide,\r\n                        randomAutoSlide: slideConf.randomAutoSlide,\r\n                        loop: slideConf.loop,\r\n                        background: slideConf.background,\r\n                        transition: slideConf.transition,\r\n                        transitionTime: slideConf.transitionTime\r\n                    });\r\n\r\n                    var sScale = settings.slidesScale;\r\n                    var trnsfrmScl = \"\";\r\n                    if (sScale != \"\") {\r\n                        var numsScale = parseInt(sScale);\r\n                        var scaleVal = numsScale / 100;\r\n                        trnsfrmScl = 'transform:scale(' + scaleVal + '); transform-origin:top';\r\n                    }\r\n\r\n                    var numOfSlides = 1;\r\n                    var sScaleVal = (sScale != \"\") ? scaleVal : 1;\r\n                    //console.log(slidesHeight);\r\n                    $(\"#all_slides_warpper\").attr({\r\n                        style: trnsfrmScl + \";height: \" + (numOfSlides * slidesHeight * sScaleVal) + \"px\"\r\n                    })\r\n\r\n                }, 1500);\r\n            } else if (settings.slideType == \"revealjs\") {\r\n                $(\".slides-loadnig-msg\").remove();\r\n                var revealjsPath = \"\";\r\n                if (settings.revealjsPath != \"\") {\r\n                    revealjsPath = settings.revealjsPath;\r\n                } else {\r\n                    revealjsPath = \"./revealjs/reveal.js\";\r\n                }\r\n                $.getScript(revealjsPath, function (response, status) {\r\n                    if (status == \"success\") {\r\n                        // $(\"section\").removeClass(\"slide\");\r\n                        Reveal.initialize(settings.revealjsConfig); //revealjsConfig - TODO\r\n                    }\r\n                });\r\n            }\r\n\r\n\r\n\r\n        }\r\n\r\n        function processPPTX(zip) {\r\n            var post_ary = [];\r\n            var dateBefore = new Date();\r\n\r\n            if (zip.file(\"docProps/thumbnail.jpeg\") !== null) {\r\n                var pptxThumbImg = base64ArrayBuffer(zip.file(\"docProps/thumbnail.jpeg\").asArrayBuffer());\r\n                post_ary.push({\r\n                    \"type\": \"pptx-thumb\",\r\n                    \"data\": pptxThumbImg\r\n                });\r\n            }\r\n\r\n            var filesInfo = getContentTypes(zip);\r\n            var slideSize = getSlideSize(zip);\r\n            themeContent = loadTheme(zip);\r\n\r\n            tableStyles = readXmlFile(zip, \"ppt/tableStyles.xml\");\r\n            //console.log(\"slideSize: \", slideSize)\r\n            post_ary.push({\r\n                \"type\": \"slideSize\",\r\n                \"data\": slideSize\r\n            });\r\n\r\n            var numOfSlides = filesInfo[\"slides\"].length;\r\n            for (var i = 0; i < numOfSlides; i++) {\r\n                var filename = filesInfo[\"slides\"][i];\r\n                var slideHtml = processSingleSlide(zip, filename, i, slideSize);\r\n                post_ary.push({\r\n                    \"type\": \"slide\",\r\n                    \"data\": slideHtml\r\n                });\r\n                post_ary.push({\r\n                    \"type\": \"progress-update\",\r\n                    \"data\": (i + 1) * 100 / numOfSlides\r\n                });\r\n            }\r\n\r\n            post_ary.push({\r\n                \"type\": \"globalCSS\",\r\n                \"data\": genGlobalCSS()\r\n            });\r\n\r\n            var dateAfter = new Date();\r\n            post_ary.push({\r\n                \"type\": \"ExecutionTime\",\r\n                \"data\": dateAfter - dateBefore\r\n            });\r\n            return post_ary;\r\n        }\r\n\r\n        function readXmlFile(zip, filename) {\r\n            var xmlData = tXml(zip.file(filename).asText(), { simplify: 1 });\r\n            if (xmlData[\"?xml\"] !== undefined) {\r\n                return xmlData[\"?xml\"];\r\n            } else {\r\n                return xmlData;\r\n            }\r\n\r\n        }\r\n        function getContentTypes(zip) {\r\n            var ContentTypesJson = readXmlFile(zip, \"[Content_Types].xml\");\r\n\r\n            var subObj = ContentTypesJson[\"Types\"][\"Override\"];\r\n            var slidesLocArray = [];\r\n            var slideLayoutsLocArray = [];\r\n            for (var i = 0; i < subObj.length; i++) {\r\n                switch (subObj[i][\"attrs\"][\"ContentType\"]) {\r\n                    case \"application/vnd.openxmlformats-officedocument.presentationml.slide+xml\":\r\n                        slidesLocArray.push(subObj[i][\"attrs\"][\"PartName\"].substr(1));\r\n                        break;\r\n                    case \"application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml\":\r\n                        slideLayoutsLocArray.push(subObj[i][\"attrs\"][\"PartName\"].substr(1));\r\n                        break;\r\n                    default:\r\n                }\r\n            }\r\n            return {\r\n                \"slides\": slidesLocArray,\r\n                \"slideLayouts\": slideLayoutsLocArray\r\n            };\r\n        }\r\n\r\n        function getSlideSize(zip) {\r\n            // Pixel = EMUs * Resolution / 914400;  (Resolution = 96)\r\n            var rtenObj = {};\r\n            var content = readXmlFile(zip, \"ppt/presentation.xml\");\r\n            var sldSzAttrs = content[\"p:presentation\"][\"p:sldSz\"][\"attrs\"];\r\n            slideWidth = parseInt(sldSzAttrs[\"cx\"]) * 96 / 914400;\r\n            slideHeight = parseInt(sldSzAttrs[\"cy\"]) * 96 / 914400;\r\n            rtenObj = {\r\n                \"width\": slideWidth,\r\n                \"height\": slideHeight\r\n            };\r\n            return rtenObj;\r\n        }\r\n\r\n        function loadTheme(zip) {\r\n            var preResContent = readXmlFile(zip, \"ppt/_rels/presentation.xml.rels\");\r\n            var relationshipArray = preResContent[\"Relationships\"][\"Relationship\"];\r\n            var themeURI = undefined;\r\n            if (relationshipArray.constructor === Array) {\r\n                for (var i = 0; i < relationshipArray.length; i++) {\r\n                    if (relationshipArray[i][\"attrs\"][\"Type\"] === \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\") {\r\n                        themeURI = relationshipArray[i][\"attrs\"][\"Target\"];\r\n                        break;\r\n                    }\r\n                }\r\n            } else if (relationshipArray[\"attrs\"][\"Type\"] === \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\") {\r\n                themeURI = relationshipArray[\"attrs\"][\"Target\"];\r\n            }\r\n\r\n            if (themeURI === undefined) {\r\n                throw Error(\"Can't open theme file.\");\r\n            }\r\n\r\n            return readXmlFile(zip, \"ppt/\" + themeURI);\r\n        }\r\n\r\n        function processSingleSlide(zip, sldFileName, index, slideSize) {\r\n            /*\r\n            self.postMessage({\r\n                \"type\": \"INFO\",\r\n                \"data\": \"Processing slide\" + (index + 1)\r\n            });\r\n            */\r\n            // =====< Step 1 >=====\r\n            // Read relationship filename of the slide (Get slideLayoutXX.xml)\r\n            // @sldFileName: ppt/slides/slide1.xml\r\n            // @resName: ppt/slides/_rels/slide1.xml.rels\r\n            var resName = sldFileName.replace(\"slides/slide\", \"slides/_rels/slide\") + \".rels\";\r\n            var resContent = readXmlFile(zip, resName);\r\n            var RelationshipArray = resContent[\"Relationships\"][\"Relationship\"];\r\n            var layoutFilename = \"\";\r\n            var slideResObj = {};\r\n            if (RelationshipArray.constructor === Array) {\r\n                for (var i = 0; i < RelationshipArray.length; i++) {\r\n                    switch (RelationshipArray[i][\"attrs\"][\"Type\"]) {\r\n                        case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout\":\r\n                            layoutFilename = RelationshipArray[i][\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\");\r\n                            break;\r\n                        case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide\":\r\n                        case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\":\r\n                        case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\":\r\n                        case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\":\r\n                        default:\r\n                            slideResObj[RelationshipArray[i][\"attrs\"][\"Id\"]] = {\r\n                                \"type\": RelationshipArray[i][\"attrs\"][\"Type\"].replace(\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/\", \"\"),\r\n                                \"target\": RelationshipArray[i][\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\")\r\n                            };\r\n                    }\r\n                }\r\n            } else {\r\n                layoutFilename = RelationshipArray[\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\");\r\n            }\r\n            //console.log(slideResObj);\r\n            // Open slideLayoutXX.xml\r\n            var slideLayoutContent = readXmlFile(zip, layoutFilename);\r\n            var slideLayoutTables = indexNodes(slideLayoutContent);\r\n            var sldLayoutClrOvr = slideLayoutContent[\"p:sldLayout\"][\"p:clrMapOvr\"][\"a:overrideClrMapping\"];\r\n\r\n            //console.log(slideLayoutClrOvride);\r\n            if (sldLayoutClrOvr !== undefined) {\r\n                slideLayoutClrOvride = sldLayoutClrOvr[\"attrs\"];\r\n            }\r\n            // =====< Step 2 >=====\r\n            // Read slide master filename of the slidelayout (Get slideMasterXX.xml)\r\n            // @resName: ppt/slideLayouts/slideLayout1.xml\r\n            // @masterName: ppt/slideLayouts/_rels/slideLayout1.xml.rels\r\n            var slideLayoutResFilename = layoutFilename.replace(\"slideLayouts/slideLayout\", \"slideLayouts/_rels/slideLayout\") + \".rels\";\r\n            var slideLayoutResContent = readXmlFile(zip, slideLayoutResFilename);\r\n            RelationshipArray = slideLayoutResContent[\"Relationships\"][\"Relationship\"];\r\n            var masterFilename = \"\";\r\n            var layoutResObj = {};\r\n            if (RelationshipArray.constructor === Array) {\r\n                for (var i = 0; i < RelationshipArray.length; i++) {\r\n                    switch (RelationshipArray[i][\"attrs\"][\"Type\"]) {\r\n                        case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster\":\r\n                            masterFilename = RelationshipArray[i][\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\");\r\n                            break;\r\n                        default:\r\n                            layoutResObj[RelationshipArray[i][\"attrs\"][\"Id\"]] = {\r\n                                \"type\": RelationshipArray[i][\"attrs\"][\"Type\"].replace(\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/\", \"\"),\r\n                                \"target\": RelationshipArray[i][\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\")\r\n                            };\r\n                    }\r\n                }\r\n            } else {\r\n                masterFilename = RelationshipArray[\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\");\r\n            }\r\n            // Open slideMasterXX.xml\r\n            var slideMasterContent = readXmlFile(zip, masterFilename);\r\n            var slideMasterTextStyles = getTextByPathList(slideMasterContent, [\"p:sldMaster\", \"p:txStyles\"]);\r\n            var slideMasterTables = indexNodes(slideMasterContent);\r\n\r\n            /////////////////Amir/////////////\r\n            //Open slideMasterXX.xml.rels\r\n            var slideMasterResFilename = masterFilename.replace(\"slideMasters/slideMaster\", \"slideMasters/_rels/slideMaster\") + \".rels\";\r\n            var slideMasterResContent = readXmlFile(zip, slideMasterResFilename);\r\n            RelationshipArray = slideMasterResContent[\"Relationships\"][\"Relationship\"];\r\n            var themeFilename = \"\";\r\n            var masterResObj = {};\r\n            if (RelationshipArray.constructor === Array) {\r\n                for (var i = 0; i < RelationshipArray.length; i++) {\r\n                    switch (RelationshipArray[i][\"attrs\"][\"Type\"]) {\r\n                        case \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\":\r\n                            themeFilename = RelationshipArray[i][\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\");\r\n                            break;\r\n                        default:\r\n                            masterResObj[RelationshipArray[i][\"attrs\"][\"Id\"]] = {\r\n                                \"type\": RelationshipArray[i][\"attrs\"][\"Type\"].replace(\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/\", \"\"),\r\n                                \"target\": RelationshipArray[i][\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\")\r\n                            };\r\n                    }\r\n                }\r\n            } else {\r\n                themeFilename = RelationshipArray[\"attrs\"][\"Target\"].replace(\"../\", \"ppt/\");\r\n            }\r\n            //console.log(themeFilename)\r\n            //Load Theme file\r\n            if (themeFilename !== undefined) {\r\n                themeContent = readXmlFile(zip, themeFilename);\r\n            }\r\n            // =====< Step 3 >=====\r\n            var slideContent = readXmlFile(zip, sldFileName);\r\n            var nodes = slideContent[\"p:sld\"][\"p:cSld\"][\"p:spTree\"];\r\n            var warpObj = {\r\n                \"zip\": zip,\r\n                \"slideLayoutTables\": slideLayoutTables,\r\n                \"slideMasterTables\": slideMasterTables,\r\n                \"slideResObj\": slideResObj,\r\n                \"slideMasterTextStyles\": slideMasterTextStyles,\r\n                \"layoutResObj\": layoutResObj,\r\n                \"masterResObj\": masterResObj\r\n            };\r\n\r\n            var bgColor = getSlideBackgroundFill(slideContent, slideLayoutContent, slideMasterContent, warpObj);\r\n            if (settings.slideMode && settings.slideType == \"revealjs\") {\r\n                var result = \"<section class='slide' style='width:\" + slideSize.width + \"px; height:\" + slideSize.height + \"px;\" + bgColor + \"'>\"\r\n            } else {\r\n                var result = \"<div class='slide' style='width:\" + slideSize.width + \"px; height:\" + slideSize.height + \"px;\" + bgColor + \"'>\"\r\n            }\r\n\r\n            //result += \"<div>\"+getBackgroundShapes(slideContent, slideLayoutContent, slideMasterContent,warpObj) + \"</div>\" - TODO\r\n            for (var nodeKey in nodes) {\r\n                if (nodes[nodeKey].constructor === Array) {\r\n                    for (var i = 0; i < nodes[nodeKey].length; i++) {\r\n                        result += processNodesInSlide(nodeKey, nodes[nodeKey][i], warpObj);\r\n                    }\r\n                } else {\r\n                    result += processNodesInSlide(nodeKey, nodes[nodeKey], warpObj);\r\n                }\r\n            }\r\n            if (settings.slideMode && settings.slideType == \"revealjs\") {\r\n                return result + \"</section>\";\r\n            } else {\r\n                return result + \"</div>\";\r\n            }\r\n\r\n        }\r\n\r\n        function indexNodes(content) {\r\n\r\n            var keys = Object.keys(content);\r\n            var spTreeNode = content[keys[0]][\"p:cSld\"][\"p:spTree\"];\r\n\r\n            var idTable = {};\r\n            var idxTable = {};\r\n            var typeTable = {};\r\n\r\n            for (var key in spTreeNode) {\r\n\r\n                if (key == \"p:nvGrpSpPr\" || key == \"p:grpSpPr\") {\r\n                    continue;\r\n                }\r\n\r\n                var targetNode = spTreeNode[key];\r\n\r\n                if (targetNode.constructor === Array) {\r\n                    for (var i = 0; i < targetNode.length; i++) {\r\n                        var nvSpPrNode = targetNode[i][\"p:nvSpPr\"];\r\n                        var id = getTextByPathList(nvSpPrNode, [\"p:cNvPr\", \"attrs\", \"id\"]);\r\n                        var idx = getTextByPathList(nvSpPrNode, [\"p:nvPr\", \"p:ph\", \"attrs\", \"idx\"]);\r\n                        var type = getTextByPathList(nvSpPrNode, [\"p:nvPr\", \"p:ph\", \"attrs\", \"type\"]);\r\n\r\n                        if (id !== undefined) {\r\n                            idTable[id] = targetNode[i];\r\n                        }\r\n                        if (idx !== undefined) {\r\n                            idxTable[idx] = targetNode[i];\r\n                        }\r\n                        if (type !== undefined) {\r\n                            typeTable[type] = targetNode[i];\r\n                        }\r\n                    }\r\n                } else {\r\n                    var nvSpPrNode = targetNode[\"p:nvSpPr\"];\r\n                    var id = getTextByPathList(nvSpPrNode, [\"p:cNvPr\", \"attrs\", \"id\"]);\r\n                    var idx = getTextByPathList(nvSpPrNode, [\"p:nvPr\", \"p:ph\", \"attrs\", \"idx\"]);\r\n                    var type = getTextByPathList(nvSpPrNode, [\"p:nvPr\", \"p:ph\", \"attrs\", \"type\"]);\r\n\r\n                    if (id !== undefined) {\r\n                        idTable[id] = targetNode;\r\n                    }\r\n                    if (idx !== undefined) {\r\n                        idxTable[idx] = targetNode;\r\n                    }\r\n                    if (type !== undefined) {\r\n                        typeTable[type] = targetNode;\r\n                    }\r\n                }\r\n\r\n            }\r\n\r\n            return { \"idTable\": idTable, \"idxTable\": idxTable, \"typeTable\": typeTable };\r\n        }\r\n\r\n        function processNodesInSlide(nodeKey, nodeValue, warpObj) {\r\n\r\n            var result = \"\";\r\n\r\n            switch (nodeKey) {\r\n                case \"p:sp\":    // Shape, Text\r\n                    result = processSpNode(nodeValue, warpObj);\r\n                    break;\r\n                case \"p:cxnSp\":    // Shape, Text (with connection)\r\n                    result = processCxnSpNode(nodeValue, warpObj);\r\n                    break;\r\n                case \"p:pic\":    // Picture\r\n                    result = processPicNode(nodeValue, warpObj);\r\n                    break;\r\n                case \"p:graphicFrame\":    // Chart, Diagram, Table\r\n                    result = processGraphicFrameNode(nodeValue, warpObj);\r\n                    break;\r\n                case \"p:grpSp\":\r\n                    result = processGroupSpNode(nodeValue, warpObj);\r\n                    break;\r\n                case \"mc:AlternateContent\": //Equations and formulas as Image\r\n                    var mcFallbackNode = getTextByPathList(nodeValue, [\"mc:Fallback\", \"p:sp\"]);\r\n                    result = processSpNode(mcFallbackNode, warpObj);\r\n                    break;\r\n                default:\r\n            }\r\n\r\n            return result;\r\n\r\n        }\r\n\r\n        function processGroupSpNode(node, warpObj) {\r\n\r\n            var factor = 96 / 914400;\r\n\r\n            var xfrmNode = node[\"p:grpSpPr\"][\"a:xfrm\"];\r\n            var x = parseInt(xfrmNode[\"a:off\"][\"attrs\"][\"x\"]) * factor;\r\n            var y = parseInt(xfrmNode[\"a:off\"][\"attrs\"][\"y\"]) * factor;\r\n            var chx = parseInt(xfrmNode[\"a:chOff\"][\"attrs\"][\"x\"]) * factor;\r\n            var chy = parseInt(xfrmNode[\"a:chOff\"][\"attrs\"][\"y\"]) * factor;\r\n            var cx = parseInt(xfrmNode[\"a:ext\"][\"attrs\"][\"cx\"]) * factor;\r\n            var cy = parseInt(xfrmNode[\"a:ext\"][\"attrs\"][\"cy\"]) * factor;\r\n            var chcx = parseInt(xfrmNode[\"a:chExt\"][\"attrs\"][\"cx\"]) * factor;\r\n            var chcy = parseInt(xfrmNode[\"a:chExt\"][\"attrs\"][\"cy\"]) * factor;\r\n\r\n            var order = node[\"attrs\"][\"order\"];\r\n\r\n            var result = \"<div class='block group' style='z-index: \" + order + \"; top: \" + (y - chy) + \"px; left: \" + (x - chx) + \"px; width: \" + (cx - chcx) + \"px; height: \" + (cy - chcy) + \"px;'>\";\r\n\r\n            // Procsee all child nodes\r\n            for (var nodeKey in node) {\r\n                if (node[nodeKey].constructor === Array) {\r\n                    for (var i = 0; i < node[nodeKey].length; i++) {\r\n                        result += processNodesInSlide(nodeKey, node[nodeKey][i], warpObj);\r\n                    }\r\n                } else {\r\n                    result += processNodesInSlide(nodeKey, node[nodeKey], warpObj);\r\n                }\r\n            }\r\n\r\n            result += \"</div>\";\r\n\r\n            return result;\r\n        }\r\n\r\n        function processSpNode(node, warpObj) {\r\n\r\n            /*\r\n            *  958    <xsd:complexType name=\"CT_GvmlShape\">\r\n            *  959   <xsd:sequence>\r\n            *  960     <xsd:element name=\"nvSpPr\" type=\"CT_GvmlShapeNonVisual\"     minOccurs=\"1\" maxOccurs=\"1\"/>\r\n            *  961     <xsd:element name=\"spPr\"   type=\"CT_ShapeProperties\"        minOccurs=\"1\" maxOccurs=\"1\"/>\r\n            *  962     <xsd:element name=\"txSp\"   type=\"CT_GvmlTextShape\"          minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            *  963     <xsd:element name=\"style\"  type=\"CT_ShapeStyle\"             minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            *  964     <xsd:element name=\"extLst\" type=\"CT_OfficeArtExtensionList\" minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            *  965   </xsd:sequence>\r\n            *  966 </xsd:complexType>\r\n            */\r\n\r\n            var id = getTextByPathList(node, [\"p:nvSpPr\", \"p:cNvPr\", \"attrs\", \"id\"]);\r\n            var name = getTextByPathList(node, [\"p:nvSpPr\", \"p:cNvPr\", \"attrs\", \"name\"]);\r\n            var idx = (getTextByPathList(node, [\"p:nvSpPr\", \"p:nvPr\", \"p:ph\"]) === undefined) ? undefined : getTextByPathList(node, [\"p:nvSpPr\", \"p:nvPr\", \"p:ph\", \"attrs\", \"idx\"]);\r\n            var type = (getTextByPathList(node, [\"p:nvSpPr\", \"p:nvPr\", \"p:ph\"]) === undefined) ? undefined : getTextByPathList(node, [\"p:nvSpPr\", \"p:nvPr\", \"p:ph\", \"attrs\", \"type\"]);\r\n            var order = getTextByPathList(node, [\"attrs\", \"order\"]);\r\n\r\n            var slideLayoutSpNode = undefined;\r\n            var slideMasterSpNode = undefined;\r\n\r\n            if (type !== undefined) {\r\n                if (idx !== undefined) {\r\n                    slideLayoutSpNode = warpObj[\"slideLayoutTables\"][\"typeTable\"][type];\r\n                    slideMasterSpNode = warpObj[\"slideMasterTables\"][\"typeTable\"][type];\r\n                } else {\r\n                    slideLayoutSpNode = warpObj[\"slideLayoutTables\"][\"typeTable\"][type];\r\n                    slideMasterSpNode = warpObj[\"slideMasterTables\"][\"typeTable\"][type];\r\n                }\r\n            } else {\r\n                if (idx !== undefined) {\r\n                    slideLayoutSpNode = warpObj[\"slideLayoutTables\"][\"idxTable\"][idx];\r\n                    slideMasterSpNode = warpObj[\"slideMasterTables\"][\"idxTable\"][idx];\r\n                } else {\r\n                    // Nothing\r\n                }\r\n            }\r\n\r\n            if (type === undefined) {\r\n                type = getTextByPathList(slideLayoutSpNode, [\"p:nvSpPr\", \"p:nvPr\", \"p:ph\", \"attrs\", \"type\"]);\r\n                if (type === undefined) {\r\n                    type = getTextByPathList(slideMasterSpNode, [\"p:nvSpPr\", \"p:nvPr\", \"p:ph\", \"attrs\", \"type\"]);\r\n                }\r\n            }\r\n\r\n            return genShape(node, slideLayoutSpNode, slideMasterSpNode, id, name, idx, type, order, warpObj);\r\n        }\r\n\r\n        function processCxnSpNode(node, warpObj) {\r\n\r\n            var id = node[\"p:nvCxnSpPr\"][\"p:cNvPr\"][\"attrs\"][\"id\"];\r\n            var name = node[\"p:nvCxnSpPr\"][\"p:cNvPr\"][\"attrs\"][\"name\"];\r\n            //var idx = (node[\"p:nvCxnSpPr\"][\"p:nvPr\"][\"p:ph\"] === undefined) ? undefined : node[\"p:nvSpPr\"][\"p:nvPr\"][\"p:ph\"][\"attrs\"][\"idx\"];\r\n            //var type = (node[\"p:nvCxnSpPr\"][\"p:nvPr\"][\"p:ph\"] === undefined) ? undefined : node[\"p:nvSpPr\"][\"p:nvPr\"][\"p:ph\"][\"attrs\"][\"type\"];\r\n            //<p:cNvCxnSpPr>(<p:cNvCxnSpPr>, <a:endCxn>)\r\n            var order = node[\"attrs\"][\"order\"];\r\n\r\n            return genShape(node, undefined, undefined, id, name, undefined, undefined, order, warpObj);\r\n        }\r\n\r\n        function genShape(node, slideLayoutSpNode, slideMasterSpNode, id, name, idx, type, order, warpObj) {\r\n\r\n            var xfrmList = [\"p:spPr\", \"a:xfrm\"];\r\n            var slideXfrmNode = getTextByPathList(node, xfrmList);\r\n            var slideLayoutXfrmNode = getTextByPathList(slideLayoutSpNode, xfrmList);\r\n            var slideMasterXfrmNode = getTextByPathList(slideMasterSpNode, xfrmList);\r\n\r\n            var result = \"\";\r\n            var shpId = getTextByPathList(node, [\"attrs\", \"order\"]);\r\n            //console.log(\"shpId: \",shpId)\r\n            var shapType = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"attrs\", \"prst\"]);\r\n\r\n            //custGeom - Amir\r\n            var custShapType = getTextByPathList(node, [\"p:spPr\", \"a:custGeom\"]);\r\n\r\n            var isFlipV = false;\r\n            if (getTextByPathList(slideXfrmNode, [\"attrs\", \"flipV\"]) === \"1\" || getTextByPathList(slideXfrmNode, [\"attrs\", \"flipH\"]) === \"1\") {\r\n                isFlipV = true;\r\n            }\r\n            /////////////////////////Amir////////////////////////\r\n            //rotate\r\n            var rotate = angleToDegrees(getTextByPathList(slideXfrmNode, [\"attrs\", \"rot\"]));\r\n            //console.log(\"rotate: \"+rotate);\r\n            var txtRotate;\r\n            var txtXframeNode = getTextByPathList(node, [\"p:txXfrm\"]);\r\n            if (txtXframeNode !== undefined) {\r\n                var txtXframeRot = getTextByPathList(txtXframeNode, [\"attrs\", \"rot\"]);\r\n                if (txtXframeRot !== undefined) {\r\n                    txtRotate = angleToDegrees(txtXframeRot) + 90;\r\n                }\r\n            } else {\r\n                txtRotate = rotate;\r\n            }\r\n            //////////////////////////////////////////////////\r\n            if (shapType !== undefined || custShapType !== undefined) {\r\n                var off = getTextByPathList(slideXfrmNode, [\"a:off\", \"attrs\"]);\r\n                var x = parseInt(off[\"x\"]) * 96 / 914400;\r\n                var y = parseInt(off[\"y\"]) * 96 / 914400;\r\n\r\n                var ext = getTextByPathList(slideXfrmNode, [\"a:ext\", \"attrs\"]);\r\n                var w = parseInt(ext[\"cx\"]) * 96 / 914400;\r\n                var h = parseInt(ext[\"cy\"]) * 96 / 914400;\r\n\r\n                result += \"<svg class='drawing' _id='\" + id + \"' _idx='\" + idx + \"' _type='\" + type + \"' _name='\" + name +\r\n                    \"' style='\" +\r\n                    getPosition(slideXfrmNode, undefined, undefined) +\r\n                    getSize(slideXfrmNode, undefined, undefined) +\r\n                    \" z-index: \" + order + \";\" +\r\n                    \"transform: rotate(\" + rotate + \"deg);\" +\r\n                    \"'>\";\r\n                result += '<defs>'\r\n                // Fill Color\r\n                var fillColor = getShapeFill(node, true, warpObj);\r\n                var grndFillFlg = false;\r\n                var imgFillFlg = false;\r\n                var clrFillType = getFillType(getTextByPathList(node, [\"p:spPr\"]));\r\n                /////////////////////////////////////////                    \r\n                if (clrFillType == \"GRADIENT_FILL\") {\r\n                    grndFillFlg = true;\r\n                    var color_arry = fillColor.color;\r\n                    var angl = fillColor.rot;\r\n                    var svgGrdnt = getSvgGradient(w, h, angl, color_arry, shpId);\r\n                    //fill=\"url(#linGrd)\"\r\n                    result += svgGrdnt;\r\n                } else if (clrFillType == \"PIC_FILL\") {\r\n                    imgFillFlg = true;\r\n                    var svgBgImg = getSvgImagePattern(fillColor, shpId);\r\n                    //fill=\"url(#imgPtrn)\"\r\n                    //console.log(svgBgImg)\r\n                    result += svgBgImg;\r\n                } else {\r\n                    if (clrFillType != \"SOLID_FILL\" && clrFillType != \"PATTERN_FILL\" &&\r\n                        (shapType == \"arc\" ||\r\n                            shapType == \"bracketPair\" ||\r\n                            shapType == \"bracePair\" ||\r\n                            shapType == \"leftBracket\" ||\r\n                            shapType == \"leftBrace\" ||\r\n                            shapType == \"rightBrace\" ||\r\n                            shapType == \"rightBracket\")) { //Temp. solution  - TODO\r\n                        fillColor = \"none\";\r\n                    }\r\n                }\r\n                // Border Color\r\n                var border = getBorder(node, true, \"shape\");\r\n\r\n                var headEndNodeAttrs = getTextByPathList(node, [\"p:spPr\", \"a:ln\", \"a:headEnd\", \"attrs\"]);\r\n                var tailEndNodeAttrs = getTextByPathList(node, [\"p:spPr\", \"a:ln\", \"a:tailEnd\", \"attrs\"]);\r\n                // type: none, triangle, stealth, diamond, oval, arrow\r\n\r\n                if ((headEndNodeAttrs !== undefined && (headEndNodeAttrs[\"type\"] === \"triangle\" || headEndNodeAttrs[\"type\"] === \"arrow\")) ||\r\n                    (tailEndNodeAttrs !== undefined && (tailEndNodeAttrs[\"type\"] === \"triangle\" || tailEndNodeAttrs[\"type\"] === \"arrow\"))) {\r\n                    var triangleMarker = \"<marker id='markerTriangle_\" + shpId + \"' viewBox='0 0 10 10' refX='1' refY='5' markerWidth='5' markerHeight='5' stroke='\" + border.color + \"' fill='\" + border.color +\r\n                        \"' orient='auto-start-reverse' markerUnits='strokeWidth'><path d='M 0 0 L 10 5 L 0 10 z' /></marker>\";\r\n                    result += triangleMarker;\r\n                }\r\n                result += '</defs>'\r\n            }\r\n            if (shapType !== undefined && custShapType === undefined) {\r\n\r\n                switch (shapType) {\r\n                    case \"rect\":\r\n                    case \"flowChartProcess\":\r\n                    case \"flowChartPredefinedProcess\":\r\n                    case \"flowChartInternalStorage\":\r\n                    case \"actionButtonBlank\":\r\n                        result += \"<rect x='0' y='0' width='\" + w + \"' height='\" + h + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        if (shapType == \"flowChartPredefinedProcess\") {\r\n                            result += \"<rect x='\" + w * (1 / 8) + \"' y='0' width='\" + w * (6 / 8) + \"' height='\" + h + \"' fill='none' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        } else if (shapType == \"flowChartInternalStorage\") {\r\n                            result += \" <polyline points='\" + w * (1 / 8) + \" 0,\" + w * (1 / 8) + \" \" + h + \"' fill='none' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                            result += \" <polyline points='0 \" + h * (1 / 8) + \",\" + w + \" \" + h * (1 / 8) + \"' fill='none' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        }\r\n                        break;\r\n                    case \"flowChartCollate\":\r\n                        var d = \"M 0,0\" +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"flowChartDocument\":\r\n                        var y1, y2, y3, x1;\r\n                        x1 = w * 10800 / 21600;\r\n                        y1 = h * 17322 / 21600;\r\n                        y2 = h * 20172 / 21600;\r\n                        y3 = h * 23922 / 21600;\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + y1 +\r\n                            \" C\" + x1 + \",\" + y1 + \" \" + x1 + \",\" + y3 + \" \" + 0 + \",\" + y2 +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"flowChartMultidocument\":\r\n                        var y1, y2, y3, y4, y5, y6, y7, y8, y9, x1, x2, x3, x4, x5, x6, x7;\r\n                        y1 = h * 18022 / 21600;\r\n                        y2 = h * 3675 / 21600;\r\n                        y3 = h * 23542 / 21600;\r\n                        y4 = h * 1815 / 21600;\r\n                        y5 = h * 16252 / 21600;\r\n                        y6 = h * 16352 / 21600;\r\n                        y7 = h * 14392 / 21600;\r\n                        y8 = h * 20782 / 21600;\r\n                        y9 = h * 14467 / 21600;\r\n                        x1 = w * 1532 / 21600;\r\n                        x2 = w * 20000 / 21600;\r\n                        x3 = w * 9298 / 21600;\r\n                        x4 = w * 19298 / 21600;\r\n                        x5 = w * 18595 / 21600;\r\n                        x6 = w * 2972 / 21600;\r\n                        x7 = w * 20800 / 21600;\r\n                        var d = \"M\" + 0 + \",\" + y2 +\r\n                            \" L\" + x5 + \",\" + y2 +\r\n                            \" L\" + x5 + \",\" + y1 +\r\n                            \" C\" + x3 + \",\" + y1 + \" \" + x3 + \",\" + y3 + \" \" + 0 + \",\" + y8 +\r\n                            \" z\" +\r\n                            \"M\" + x1 + \",\" + y2 +\r\n                            \" L\" + x1 + \",\" + y4 +\r\n                            \" L\" + x2 + \",\" + y4 +\r\n                            \" L\" + x2 + \",\" + y5 +\r\n                            \" C\" + x4 + \",\" + y5 + \" \" + x5 + \",\" + y6 + \" \" + x5 + \",\" + y6 +\r\n                            \"M\" + x6 + \",\" + y4 +\r\n                            \" L\" + x6 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + y7 +\r\n                            \" C\" + x7 + \",\" + y7 + \" \" + x2 + \",\" + y9 + \" \" + x2 + \",\" + y9;\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"actionButtonBackPrevious\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, g11, g12;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        g11 = hc - dx2;\r\n                        g12 = hc + dx2;\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \"M\" + g11 + \",\" + vc +\r\n                            \" L\" + g12 + \",\" + g9 +\r\n                            \" L\" + g12 + \",\" + g10 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonBeginning\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, g11, g12, g13, g14, g15, g16, g17;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        g11 = hc - dx2;\r\n                        g12 = hc + dx2;\r\n                        g13 = ss * 3 / 4;\r\n                        g14 = g13 / 8;\r\n                        g15 = g13 / 4;\r\n                        g16 = g11 + g14;\r\n                        g17 = g11 + g15;\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \"M\" + g17 + \",\" + vc +\r\n                            \" L\" + g12 + \",\" + g9 +\r\n                            \" L\" + g12 + \",\" + g10 +\r\n                            \" z\" +\r\n                            \"M\" + g16 + \",\" + g9 +\r\n                            \" L\" + g11 + \",\" + g9 +\r\n                            \" L\" + g11 + \",\" + g10 +\r\n                            \" L\" + g16 + \",\" + g10 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonDocument\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, dx1, g11, g12, g13, g14, g15;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        dx1 = ss * 9 / 32;\r\n                        g11 = hc - dx1;\r\n                        g12 = hc + dx1;\r\n                        g13 = ss * 3 / 16;\r\n                        g14 = g12 - g13;\r\n                        g15 = g9 + g13;\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \"M\" + g11 + \",\" + g9 +\r\n                            \" L\" + g14 + \",\" + g9 +\r\n                            \" L\" + g12 + \",\" + g15 +\r\n                            \" L\" + g12 + \",\" + g10 +\r\n                            \" L\" + g11 + \",\" + g10 +\r\n                            \" z\" +\r\n                            \"M\" + g14 + \",\" + g9 +\r\n                            \" L\" + g14 + \",\" + g15 +\r\n                            \" L\" + g12 + \",\" + g15 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonEnd\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, g11, g12, g13, g14, g15, g16, g17;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        g11 = hc - dx2;\r\n                        g12 = hc + dx2;\r\n                        g13 = ss * 3 / 4;\r\n                        g14 = g13 * 3 / 4;\r\n                        g15 = g13 * 7 / 8;\r\n                        g16 = g11 + g14;\r\n                        g17 = g11 + g15;\r\n                        var d = \"M\" + 0 + \",\" + h +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + 0 + \",\" + 0 +\r\n                            \" z\" +\r\n                            \" M\" + g17 + \",\" + g9 +\r\n                            \" L\" + g12 + \",\" + g9 +\r\n                            \" L\" + g12 + \",\" + g10 +\r\n                            \" L\" + g17 + \",\" + g10 +\r\n                            \" z\" +\r\n                            \" M\" + g16 + \",\" + vc +\r\n                            \" L\" + g11 + \",\" + g9 +\r\n                            \" L\" + g11 + \",\" + g10 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonForwardNext\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, g11, g12;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        g11 = hc - dx2;\r\n                        g12 = hc + dx2;\r\n\r\n                        var d = \"M\" + 0 + \",\" + h +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + 0 + \",\" + 0 +\r\n                            \" z\" +\r\n                            \" M\" + g12 + \",\" + vc +\r\n                            \" L\" + g11 + \",\" + g9 +\r\n                            \" L\" + g11 + \",\" + g10 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonHelp\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g11, g13, g14, g15, g16, g19, g20, g21, g23, g24, g27, g29, g30, g31, g33, g36, g37, g41, g42;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g11 = hc - dx2;\r\n                        g13 = ss * 3 / 4;\r\n                        g14 = g13 / 7;\r\n                        g15 = g13 * 3 / 14;\r\n                        g16 = g13 * 2 / 7;\r\n                        g19 = g13 * 3 / 7;\r\n                        g20 = g13 * 4 / 7;\r\n                        g21 = g13 * 17 / 28;\r\n                        g23 = g13 * 21 / 28;\r\n                        g24 = g13 * 11 / 14;\r\n                        g27 = g9 + g16;\r\n                        g29 = g9 + g21;\r\n                        g30 = g9 + g23;\r\n                        g31 = g9 + g24;\r\n                        g33 = g11 + g15;\r\n                        g36 = g11 + g19;\r\n                        g37 = g11 + g20;\r\n                        g41 = g13 / 14;\r\n                        g42 = g13 * 3 / 28;\r\n                        var cX1 = g33 + g16;\r\n                        var cX2 = g36 + g14;\r\n                        var cY3 = g31 + g42;\r\n                        var cX4 = (g37 + g36 + g16) / 2;\r\n\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \"M\" + g33 + \",\" + g27 +\r\n                            shapeArc(cX1, g27, g16, g16, 180, 360, false).replace(\"M\", \"L\") +\r\n                            shapeArc(cX4, g27, g14, g15, 0, 90, false).replace(\"M\", \"L\") +\r\n                            shapeArc(cX4, g29, g41, g42, 270, 180, false).replace(\"M\", \"L\") +\r\n                            \" L\" + g37 + \",\" + g30 +\r\n                            \" L\" + g36 + \",\" + g30 +\r\n                            \" L\" + g36 + \",\" + g29 +\r\n                            shapeArc(cX2, g29, g14, g15, 180, 270, false).replace(\"M\", \"L\") +\r\n                            shapeArc(g37, g27, g41, g42, 90, 0, false).replace(\"M\", \"L\") +\r\n                            shapeArc(cX1, g27, g14, g14, 0, -180, false).replace(\"M\", \"L\") +\r\n                            \" z\" +\r\n                            \"M\" + hc + \",\" + g31 +\r\n                            shapeArc(hc, cY3, g42, g42, 270, 630, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonHome\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, g11, g12, g13, g14, g15, g16, g17, g18, g19, g20, g21, g22, g23, g24, g25, g26, g27, g28, g29, g30, g31, g32, g33;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        g11 = hc - dx2;\r\n                        g12 = hc + dx2;\r\n                        g13 = ss * 3 / 4;\r\n                        g14 = g13 / 16;\r\n                        g15 = g13 / 8;\r\n                        g16 = g13 * 3 / 16;\r\n                        g17 = g13 * 5 / 16;\r\n                        g18 = g13 * 7 / 16;\r\n                        g19 = g13 * 9 / 16;\r\n                        g20 = g13 * 11 / 16;\r\n                        g21 = g13 * 3 / 4;\r\n                        g22 = g13 * 13 / 16;\r\n                        g23 = g13 * 7 / 8;\r\n                        g24 = g9 + g14;\r\n                        g25 = g9 + g16;\r\n                        g26 = g9 + g17;\r\n                        g27 = g9 + g21;\r\n                        g28 = g11 + g15;\r\n                        g29 = g11 + g18;\r\n                        g30 = g11 + g19;\r\n                        g31 = g11 + g20;\r\n                        g32 = g11 + g22;\r\n                        g33 = g11 + g23;\r\n\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \" M\" + hc + \",\" + g9 +\r\n                            \" L\" + g11 + \",\" + vc +\r\n                            \" L\" + g28 + \",\" + vc +\r\n                            \" L\" + g28 + \",\" + g10 +\r\n                            \" L\" + g33 + \",\" + g10 +\r\n                            \" L\" + g33 + \",\" + vc +\r\n                            \" L\" + g12 + \",\" + vc +\r\n                            \" L\" + g32 + \",\" + g26 +\r\n                            \" L\" + g32 + \",\" + g24 +\r\n                            \" L\" + g31 + \",\" + g24 +\r\n                            \" L\" + g31 + \",\" + g25 +\r\n                            \" z\" +\r\n                            \" M\" + g29 + \",\" + g27 +\r\n                            \" L\" + g30 + \",\" + g27 +\r\n                            \" L\" + g30 + \",\" + g10 +\r\n                            \" L\" + g29 + \",\" + g10 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonInformation\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g11, g13, g14, g17, g18, g19, g20, g22, g23, g24, g25, g28, g29, g30, g31, g32, g34, g35, g37, g38;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g11 = hc - dx2;\r\n                        g13 = ss * 3 / 4;\r\n                        g14 = g13 / 32;\r\n                        g17 = g13 * 5 / 16;\r\n                        g18 = g13 * 3 / 8;\r\n                        g19 = g13 * 13 / 32;\r\n                        g20 = g13 * 19 / 32;\r\n                        g22 = g13 * 11 / 16;\r\n                        g23 = g13 * 13 / 16;\r\n                        g24 = g13 * 7 / 8;\r\n                        g25 = g9 + g14;\r\n                        g28 = g9 + g17;\r\n                        g29 = g9 + g18;\r\n                        g30 = g9 + g23;\r\n                        g31 = g9 + g24;\r\n                        g32 = g11 + g17;\r\n                        g34 = g11 + g19;\r\n                        g35 = g11 + g20;\r\n                        g37 = g11 + g22;\r\n                        g38 = g13 * 3 / 32;\r\n                        var cY1 = g9 + dx2;\r\n                        var cY2 = g25 + g38;\r\n\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \"M\" + hc + \",\" + g9 +\r\n                            shapeArc(hc, cY1, dx2, dx2, 270, 630, false).replace(\"M\", \"L\") +\r\n                            \" z\" +\r\n                            \"M\" + hc + \",\" + g25 +\r\n                            shapeArc(hc, cY2, g38, g38, 270, 630, false).replace(\"M\", \"L\") +\r\n                            \"M\" + g32 + \",\" + g28 +\r\n                            \" L\" + g35 + \",\" + g28 +\r\n                            \" L\" + g35 + \",\" + g30 +\r\n                            \" L\" + g37 + \",\" + g30 +\r\n                            \" L\" + g37 + \",\" + g31 +\r\n                            \" L\" + g32 + \",\" + g31 +\r\n                            \" L\" + g32 + \",\" + g30 +\r\n                            \" L\" + g34 + \",\" + g30 +\r\n                            \" L\" + g34 + \",\" + g29 +\r\n                            \" L\" + g32 + \",\" + g29 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonMovie\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, g11, g12, g13, g14, g15, g16, g17, g18, g19, g20, g21, g22, g23, g24, g25, g26, g27,\r\n                            g28, g29, g30, g31, g32, g33, g34, g35, g36, g37, g38, g39, g40, g41, g42, g43, g44, g45, g46, g47, g48;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        g11 = hc - dx2;\r\n                        g12 = hc + dx2;\r\n                        g13 = ss * 3 / 4;\r\n                        g14 = g13 * 1455 / 21600;\r\n                        g15 = g13 * 1905 / 21600;\r\n                        g16 = g13 * 2325 / 21600;\r\n                        g17 = g13 * 16155 / 21600;\r\n                        g18 = g13 * 17010 / 21600;\r\n                        g19 = g13 * 19335 / 21600;\r\n                        g20 = g13 * 19725 / 21600;\r\n                        g21 = g13 * 20595 / 21600;\r\n                        g22 = g13 * 5280 / 21600;\r\n                        g23 = g13 * 5730 / 21600;\r\n                        g24 = g13 * 6630 / 21600;\r\n                        g25 = g13 * 7492 / 21600;\r\n                        g26 = g13 * 9067 / 21600;\r\n                        g27 = g13 * 9555 / 21600;\r\n                        g28 = g13 * 13342 / 21600;\r\n                        g29 = g13 * 14580 / 21600;\r\n                        g30 = g13 * 15592 / 21600;\r\n                        g31 = g11 + g14;\r\n                        g32 = g11 + g15;\r\n                        g33 = g11 + g16;\r\n                        g34 = g11 + g17;\r\n                        g35 = g11 + g18;\r\n                        g36 = g11 + g19;\r\n                        g37 = g11 + g20;\r\n                        g38 = g11 + g21;\r\n                        g39 = g9 + g22;\r\n                        g40 = g9 + g23;\r\n                        g41 = g9 + g24;\r\n                        g42 = g9 + g25;\r\n                        g43 = g9 + g26;\r\n                        g44 = g9 + g27;\r\n                        g45 = g9 + g28;\r\n                        g46 = g9 + g29;\r\n                        g47 = g9 + g30;\r\n                        g48 = g9 + g31;\r\n\r\n                        var d = \"M\" + 0 + \",\" + h +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + 0 + \",\" + 0 +\r\n                            \" z\" +\r\n                            \"M\" + g11 + \",\" + g39 +\r\n                            \" L\" + g11 + \",\" + g44 +\r\n                            \" L\" + g31 + \",\" + g44 +\r\n                            \" L\" + g32 + \",\" + g43 +\r\n                            \" L\" + g33 + \",\" + g43 +\r\n                            \" L\" + g33 + \",\" + g47 +\r\n                            \" L\" + g35 + \",\" + g47 +\r\n                            \" L\" + g35 + \",\" + g45 +\r\n                            \" L\" + g36 + \",\" + g45 +\r\n                            \" L\" + g38 + \",\" + g46 +\r\n                            \" L\" + g12 + \",\" + g46 +\r\n                            \" L\" + g12 + \",\" + g41 +\r\n                            \" L\" + g38 + \",\" + g41 +\r\n                            \" L\" + g37 + \",\" + g42 +\r\n                            \" L\" + g35 + \",\" + g42 +\r\n                            \" L\" + g35 + \",\" + g41 +\r\n                            \" L\" + g34 + \",\" + g40 +\r\n                            \" L\" + g32 + \",\" + g40 +\r\n                            \" L\" + g31 + \",\" + g39 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonReturn\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, g11, g12, g13, g14, g15, g16, g17, g18, g19, g20, g21, g22, g23, g24, g25, g26, g27;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        g11 = hc - dx2;\r\n                        g12 = hc + dx2;\r\n                        g13 = ss * 3 / 4;\r\n                        g14 = g13 * 7 / 8;\r\n                        g15 = g13 * 3 / 4;\r\n                        g16 = g13 * 5 / 8;\r\n                        g17 = g13 * 3 / 8;\r\n                        g18 = g13 / 4;\r\n                        g19 = g9 + g15;\r\n                        g20 = g9 + g16;\r\n                        g21 = g9 + g18;\r\n                        g22 = g11 + g14;\r\n                        g23 = g11 + g15;\r\n                        g24 = g11 + g16;\r\n                        g25 = g11 + g17;\r\n                        g26 = g11 + g18;\r\n                        g27 = g13 / 8;\r\n                        var cX1 = g24 - g27;\r\n                        var cY2 = g19 - g27;\r\n                        var cX3 = g11 + g17;\r\n                        var cY4 = g10 - g17;\r\n\r\n                        var d = \"M\" + 0 + \",\" + h +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + 0 + \",\" + 0 +\r\n                            \" z\" +\r\n                            \" M\" + g12 + \",\" + g21 +\r\n                            \" L\" + g23 + \",\" + g9 +\r\n                            \" L\" + hc + \",\" + g21 +\r\n                            \" L\" + g24 + \",\" + g21 +\r\n                            \" L\" + g24 + \",\" + g20 +\r\n                            shapeArc(cX1, g20, g27, g27, 0, 90, false).replace(\"M\", \"L\") +\r\n                            \" L\" + g25 + \",\" + g19 +\r\n                            shapeArc(g25, cY2, g27, g27, 90, 180, false).replace(\"M\", \"L\") +\r\n                            \" L\" + g26 + \",\" + g21 +\r\n                            \" L\" + g11 + \",\" + g21 +\r\n                            \" L\" + g11 + \",\" + g20 +\r\n                            shapeArc(cX3, g20, g17, g17, 180, 90, false).replace(\"M\", \"L\") +\r\n                            \" L\" + hc + \",\" + g10 +\r\n                            shapeArc(hc, cY4, g17, g17, 90, 0, false).replace(\"M\", \"L\") +\r\n                            \" L\" + g22 + \",\" + g21 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"actionButtonSound\":\r\n                        var hc = w / 2, vc = h / 2, ss = Math.min(w, h);\r\n                        var dx2, g9, g10, g11, g12, g13, g14, g15, g16, g17, g18, g19, g20, g21, g22, g23, g24, g25, g26;\r\n\r\n                        dx2 = ss * 3 / 8;\r\n                        g9 = vc - dx2;\r\n                        g10 = vc + dx2;\r\n                        g11 = hc - dx2;\r\n                        g12 = hc + dx2;\r\n                        g13 = ss * 3 / 4;\r\n                        g14 = g13 / 8;\r\n                        g15 = g13 * 5 / 16;\r\n                        g16 = g13 * 5 / 8;\r\n                        g17 = g13 * 11 / 16;\r\n                        g18 = g13 * 3 / 4;\r\n                        g19 = g13 * 7 / 8;\r\n                        g20 = g9 + g14;\r\n                        g21 = g9 + g15;\r\n                        g22 = g9 + g17;\r\n                        g23 = g9 + g19;\r\n                        g24 = g11 + g15;\r\n                        g25 = g11 + g16;\r\n                        g26 = g11 + g18;\r\n\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \" M\" + g11 + \",\" + g21 +\r\n                            \" L\" + g24 + \",\" + g21 +\r\n                            \" L\" + g25 + \",\" + g9 +\r\n                            \" L\" + g25 + \",\" + g10 +\r\n                            \" L\" + g24 + \",\" + g22 +\r\n                            \" L\" + g11 + \",\" + g22 +\r\n                            \" z\" +\r\n                            \" M\" + g26 + \",\" + g21 +\r\n                            \" L\" + g12 + \",\" + g20 +\r\n                            \" M\" + g26 + \",\" + vc +\r\n                            \" L\" + g12 + \",\" + vc +\r\n                            \" M\" + g26 + \",\" + g22 +\r\n                            \" L\" + g12 + \",\" + g23;\r\n\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"irregularSeal1\":\r\n                    case \"irregularSeal2\":\r\n                        if (shapType == \"irregularSeal1\") {\r\n                            var d = \"M\" + w * 10800 / 21600 + \",\" + h * 5800 / 21600 +\r\n                                \" L\" + w * 14522 / 21600 + \",\" + 0 +\r\n                                \" L\" + w * 14155 / 21600 + \",\" + h * 5325 / 21600 +\r\n                                \" L\" + w * 18380 / 21600 + \",\" + h * 4457 / 21600 +\r\n                                \" L\" + w * 16702 / 21600 + \",\" + h * 7315 / 21600 +\r\n                                \" L\" + w * 21097 / 21600 + \",\" + h * 8137 / 21600 +\r\n                                \" L\" + w * 17607 / 21600 + \",\" + h * 10475 / 21600 +\r\n                                \" L\" + w + \",\" + h * 13290 / 21600 +\r\n                                \" L\" + w * 16837 / 21600 + \",\" + h * 12942 / 21600 +\r\n                                \" L\" + w * 18145 / 21600 + \",\" + h * 18095 / 21600 +\r\n                                \" L\" + w * 14020 / 21600 + \",\" + h * 14457 / 21600 +\r\n                                \" L\" + w * 13247 / 21600 + \",\" + h * 19737 / 21600 +\r\n                                \" L\" + w * 10532 / 21600 + \",\" + h * 14935 / 21600 +\r\n                                \" L\" + w * 8485 / 21600 + \",\" + h +\r\n                                \" L\" + w * 7715 / 21600 + \",\" + h * 15627 / 21600 +\r\n                                \" L\" + w * 4762 / 21600 + \",\" + h * 17617 / 21600 +\r\n                                \" L\" + w * 5667 / 21600 + \",\" + h * 13937 / 21600 +\r\n                                \" L\" + w * 135 / 21600 + \",\" + h * 14587 / 21600 +\r\n                                \" L\" + w * 3722 / 21600 + \",\" + h * 11775 / 21600 +\r\n                                \" L\" + 0 + \",\" + h * 8615 / 21600 +\r\n                                \" L\" + w * 4627 / 21600 + \",\" + h * 7617 / 21600 +\r\n                                \" L\" + w * 370 / 21600 + \",\" + h * 2295 / 21600 +\r\n                                \" L\" + w * 7312 / 21600 + \",\" + h * 6320 / 21600 +\r\n                                \" L\" + w * 8352 / 21600 + \",\" + h * 2295 / 21600 +\r\n                                \" z\";\r\n                        } else if (shapType == \"irregularSeal2\") {\r\n                            var d = \"M\" + w * 11462 / 21600 + \",\" + h * 4342 / 21600 +\r\n                                \" L\" + w * 14790 / 21600 + \",\" + 0 +\r\n                                \" L\" + w * 14525 / 21600 + \",\" + h * 5777 / 21600 +\r\n                                \" L\" + w * 18007 / 21600 + \",\" + h * 3172 / 21600 +\r\n                                \" L\" + w * 16380 / 21600 + \",\" + h * 6532 / 21600 +\r\n                                \" L\" + w + \",\" + h * 6645 / 21600 +\r\n                                \" L\" + w * 16985 / 21600 + \",\" + h * 9402 / 21600 +\r\n                                \" L\" + w * 18270 / 21600 + \",\" + h * 11290 / 21600 +\r\n                                \" L\" + w * 16380 / 21600 + \",\" + h * 12310 / 21600 +\r\n                                \" L\" + w * 18877 / 21600 + \",\" + h * 15632 / 21600 +\r\n                                \" L\" + w * 14640 / 21600 + \",\" + h * 14350 / 21600 +\r\n                                \" L\" + w * 14942 / 21600 + \",\" + h * 17370 / 21600 +\r\n                                \" L\" + w * 12180 / 21600 + \",\" + h * 15935 / 21600 +\r\n                                \" L\" + w * 11612 / 21600 + \",\" + h * 18842 / 21600 +\r\n                                \" L\" + w * 9872 / 21600 + \",\" + h * 17370 / 21600 +\r\n                                \" L\" + w * 8700 / 21600 + \",\" + h * 19712 / 21600 +\r\n                                \" L\" + w * 7527 / 21600 + \",\" + h * 18125 / 21600 +\r\n                                \" L\" + w * 4917 / 21600 + \",\" + h +\r\n                                \" L\" + w * 4805 / 21600 + \",\" + h * 18240 / 21600 +\r\n                                \" L\" + w * 1285 / 21600 + \",\" + h * 17825 / 21600 +\r\n                                \" L\" + w * 3330 / 21600 + \",\" + h * 15370 / 21600 +\r\n                                \" L\" + 0 + \",\" + h * 12877 / 21600 +\r\n                                \" L\" + w * 3935 / 21600 + \",\" + h * 11592 / 21600 +\r\n                                \" L\" + w * 1172 / 21600 + \",\" + h * 8270 / 21600 +\r\n                                \" L\" + w * 5372 / 21600 + \",\" + h * 7817 / 21600 +\r\n                                \" L\" + w * 4502 / 21600 + \",\" + h * 3625 / 21600 +\r\n                                \" L\" + w * 8550 / 21600 + \",\" + h * 6382 / 21600 +\r\n                                \" L\" + w * 9722 / 21600 + \",\" + h * 1887 / 21600 +\r\n                                \" z\";\r\n                        }\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"flowChartTerminator\":\r\n                        var x1, x2, y1, cd2 = 180, cd4 = 90, c3d4 = 270;\r\n                        x1 = w * 3475 / 21600;\r\n                        x2 = w * 18125 / 21600;\r\n                        y1 = h * 10800 / 21600;\r\n                        //path attrs: w = 21600; h = 21600; \r\n                        var d = \"M\" + x1 + \",\" + 0 +\r\n                            \" L\" + x2 + \",\" + 0 +\r\n                            shapeArc(x2, h / 2, x1, y1, c3d4, c3d4 + cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + h +\r\n                            shapeArc(x1, h / 2, x1, y1, cd4, cd4 + cd2, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"flowChartPunchedTape\":\r\n                        var x1, x1, y1, y2, cd2 = 180;\r\n                        x1 = w * 5 / 20;\r\n                        y1 = h * 2 / 20;\r\n                        y2 = h * 18 / 20;\r\n                        var d = \"M\" + 0 + \",\" + y1 +\r\n                            shapeArc(x1, y1, x1, y1, cd2, 0, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w * (3 / 4), y1, x1, y1, cd2, 360, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w + \",\" + y2 +\r\n                            shapeArc(w * (3 / 4), y2, x1, y1, 0, -cd2, false).replace(\"M\", \"L\") +\r\n                            shapeArc(x1, y2, x1, y1, 0, cd2, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"flowChartOnlineStorage\":\r\n                        var x1, y1, c3d4 = 270, cd4 = 90;\r\n                        x1 = w * 1 / 6;\r\n                        y1 = h * 3 / 6;\r\n                        var d = \"M\" + x1 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            shapeArc(w, h / 2, x1, y1, c3d4, 90, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + h +\r\n                            shapeArc(x1, h / 2, x1, y1, cd4, 270, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"flowChartDisplay\":\r\n                        var x1, x2, y1, c3d4 = 270, cd2 = 180;\r\n                        x1 = w * 1 / 6;\r\n                        x2 = w * 5 / 6;\r\n                        y1 = h * 3 / 6;\r\n                        //path attrs: w = 6; h = 6; \r\n                        var d = \"M\" + 0 + \",\" + y1 +\r\n                            \" L\" + x1 + \",\" + 0 +\r\n                            \" L\" + x2 + \",\" + 0 +\r\n                            shapeArc(w, h / 2, x1, y1, c3d4, c3d4 + cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + h +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"flowChartDelay\":\r\n                        var wd2 = w / 2, hd2 = h / 2, cd2 = 180, c3d4 = 270, cd4 = 90;\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + wd2 + \",\" + 0 +\r\n                            shapeArc(wd2, hd2, wd2, hd2, c3d4, c3d4 + cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"flowChartMagneticTape\":\r\n                        var wd2 = w / 2, hd2 = h / 2, cd2 = 180, c3d4 = 270, cd4 = 90;\r\n                        var idy, ib, ang1;\r\n                        idy = hd2 * Math.sin(Math.PI / 4);\r\n                        ib = hd2 + idy;\r\n                        ang1 = Math.atan(h / w);\r\n                        var ang1Dg = ang1 * 180 / Math.PI;\r\n                        var d = \"M\" + wd2 + \",\" + h +\r\n                            shapeArc(wd2, hd2, wd2, hd2, cd4, cd2, false).replace(\"M\", \"L\") +\r\n                            shapeArc(wd2, hd2, wd2, hd2, cd2, c3d4, false).replace(\"M\", \"L\") +\r\n                            shapeArc(wd2, hd2, wd2, hd2, c3d4, 360, false).replace(\"M\", \"L\") +\r\n                            shapeArc(wd2, hd2, wd2, hd2, 0, ang1Dg, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w + \",\" + ib +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"ellipse\":\r\n                    case \"flowChartConnector\":\r\n                    case \"flowChartSummingJunction\":\r\n                    case \"flowChartOr\":\r\n                        result += \"<ellipse cx='\" + (w / 2) + \"' cy='\" + (h / 2) + \"' rx='\" + (w / 2) + \"' ry='\" + (h / 2) + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        if (shapType == \"flowChartOr\") {\r\n                            result += \" <polyline points='\" + w / 2 + \" \" + 0 + \",\" + w / 2 + \" \" + h + \"' fill='none' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                            result += \" <polyline points='\" + 0 + \" \" + h / 2 + \",\" + w + \" \" + h / 2 + \"' fill='none' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        } else if (shapType == \"flowChartSummingJunction\") {\r\n                            var idx, idy, il, ir, it, ib, hc = w / 2, vc = h / 2, wd2 = w / 2, hd2 = h / 2;\r\n                            var angVal = Math.PI / 4;\r\n                            idx = wd2 * Math.cos(angVal);\r\n                            idy = hd2 * Math.sin(angVal);\r\n                            il = hc - idx;\r\n                            ir = hc + idx;\r\n                            it = vc - idy;\r\n                            ib = vc + idy;\r\n                            result += \" <polyline points='\" + il + \" \" + it + \",\" + ir + \" \" + ib + \"' fill='none' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                            result += \" <polyline points='\" + ir + \" \" + it + \",\" + il + \" \" + ib + \"' fill='none' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        }\r\n                        break;\r\n                    case \"roundRect\":\r\n                    case \"round1Rect\":\r\n                    case \"round2DiagRect\":\r\n                    case \"round2SameRect\":\r\n                    case \"snip1Rect\":\r\n                    case \"snip2DiagRect\":\r\n                    case \"snip2SameRect\":\r\n                    case \"flowChartAlternateProcess\":\r\n                    case \"flowChartPunchedCard\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val;// = 0.33334;\r\n                        var sAdj2, sAdj2_val;// = 0.33334;\r\n                        var shpTyp, adjTyp;\r\n                        if (shapAdjst_ary !== undefined && shapAdjst_ary.constructor === Array) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = parseInt(sAdj1.substr(4)) / 50000;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj2_val = parseInt(sAdj2.substr(4)) / 50000;\r\n                                }\r\n                            }\r\n                        } else if (shapAdjst_ary !== undefined && shapAdjst_ary.constructor !== Array) {\r\n                            var sAdj = getTextByPathList(shapAdjst_ary, [\"attrs\", \"fmla\"]);\r\n                            sAdj1_val = parseInt(sAdj.substr(4)) / 50000;\r\n                            sAdj2_val = 0;\r\n                        }\r\n                        //console.log(\"shapType: \",shapType,\",node: \",node )\r\n                        var tranglRott = \"\";\r\n                        switch (shapType) {\r\n                            case \"roundRect\":\r\n                            case \"flowChartAlternateProcess\":\r\n                                shpTyp = \"round\";\r\n                                adjTyp = \"cornrAll\";\r\n                                if (sAdj1_val === undefined) sAdj1_val = 0.33334;\r\n                                sAdj2_val = 0;\r\n                                break;\r\n                            case \"round1Rect\":\r\n                                shpTyp = \"round\";\r\n                                adjTyp = \"cornr1\";\r\n                                if (sAdj1_val === undefined) sAdj1_val = 0.33334;\r\n                                sAdj2_val = 0;\r\n                                break;\r\n                            case \"round2DiagRect\":\r\n                                shpTyp = \"round\";\r\n                                adjTyp = \"diag\";\r\n                                if (sAdj1_val === undefined) sAdj1_val = 0.33334;\r\n                                if (sAdj2_val === undefined) sAdj2_val = 0;\r\n                                break;\r\n                            case \"round2SameRect\":\r\n                                shpTyp = \"round\";\r\n                                adjTyp = \"cornr2\";\r\n                                if (sAdj1_val === undefined) sAdj1_val = 0.33334;\r\n                                if (sAdj2_val === undefined) sAdj2_val = 0;\r\n                                break;\r\n                            case \"snip1Rect\":\r\n                            case \"flowChartPunchedCard\":\r\n                                shpTyp = \"snip\";\r\n                                adjTyp = \"cornr1\";\r\n                                if (sAdj1_val === undefined) sAdj1_val = 0.33334;\r\n                                sAdj2_val = 0;\r\n                                if (shapType == \"flowChartPunchedCard\") {\r\n                                    tranglRott = \"transform='translate(\" + w + \",0) scale(-1,1)'\";\r\n                                }\r\n                                break;\r\n                            case \"snip2DiagRect\":\r\n                                shpTyp = \"snip\";\r\n                                adjTyp = \"diag\";\r\n                                if (sAdj1_val === undefined) sAdj1_val = 0;\r\n                                if (sAdj2_val === undefined) sAdj2_val = 0.33334;\r\n                                break;\r\n                            case \"snip2SameRect\":\r\n                                shpTyp = \"snip\";\r\n                                adjTyp = \"cornr2\";\r\n                                if (sAdj1_val === undefined) sAdj1_val = 0.33334;\r\n                                if (sAdj2_val === undefined) sAdj2_val = 0;\r\n                                break;\r\n                        }\r\n                        var d_val = shapeSnipRoundRect(w, h, sAdj1_val, sAdj2_val, shpTyp, adjTyp);\r\n                        result += \"<path \" + tranglRott + \"  d='\" + d_val + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"snipRoundRect\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 0.33334;\r\n                        var sAdj2, sAdj2_val = 0.33334;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = parseInt(sAdj1.substr(4)) / 50000;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj2_val = parseInt(sAdj2.substr(4)) / 50000;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val = \"M0,\" + h + \" L\" + w + \",\" + h + \" L\" + w + \",\" + (h / 2) * sAdj2_val +\r\n                            \" L\" + (w / 2 + (w / 2) * (1 - sAdj2_val)) + \",0 L\" + (w / 2) * sAdj1_val + \",0 Q0,0 0,\" + (h / 2) * sAdj1_val + \" z\";\r\n\r\n                        result += \"<path   d='\" + d_val + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"bentConnector2\":\r\n                        var d = \"\";\r\n                        if (isFlipV) {\r\n                            d = \"M 0 \" + w + \" L \" + h + \" \" + w + \" L \" + h + \" 0\";\r\n                        } else {\r\n                            d = \"M \" + w + \" 0 L \" + w + \" \" + h + \" L 0 \" + h;\r\n                        }\r\n                        result += \"<path d='\" + d + \"' stroke='\" + border.color +\r\n                            \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' fill='none' \";\r\n                        if (headEndNodeAttrs !== undefined && (headEndNodeAttrs[\"type\"] === \"triangle\" || headEndNodeAttrs[\"type\"] === \"arrow\")) {\r\n                            result += \"marker-start='url(#markerTriangle_\" + shpId + \")' \";\r\n                        }\r\n                        if (tailEndNodeAttrs !== undefined && (tailEndNodeAttrs[\"type\"] === \"triangle\" || tailEndNodeAttrs[\"type\"] === \"arrow\")) {\r\n                            result += \"marker-end='url(#markerTriangle_\" + shpId + \")' \";\r\n                        }\r\n                        result += \"/>\";\r\n                        break;\r\n                    case \"rtTriangle\":\r\n                        result += \" <polygon points='0 0,0 \" + h + \",\" + w + \" \" + h + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"triangle\":\r\n                    case \"flowChartExtract\":\r\n                    case \"flowChartMerge\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var shapAdjst_val = 0.5;\r\n                        if (shapAdjst !== undefined) {\r\n                            shapAdjst_val = parseInt(shapAdjst.substr(4)) * 96 / 9144000;\r\n                            //console.log(\"w: \"+w+\"\\nh: \"+h+\"\\nshapAdjst: \"+shapAdjst+\"\\nshapAdjst_val: \"+shapAdjst_val);\r\n                        }\r\n                        var tranglRott = \"\";\r\n                        if (shapType == \"flowChartMerge\") {\r\n                            tranglRott = \"transform='rotate(180 \" + w / 2 + \",\" + h / 2 + \")'\";\r\n                        }\r\n                        result += \" <polygon \" + tranglRott + \" points='\" + (w * shapAdjst_val) + \" 0,0 \" + h + \",\" + w + \" \" + h + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"diamond\":\r\n                    case \"flowChartDecision\":\r\n                    case \"flowChartSort\":\r\n                        result += \" <polygon points='\" + (w / 2) + \" 0,0 \" + (h / 2) + \",\" + (w / 2) + \" \" + h + \",\" + w + \" \" + (h / 2) + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        if (shapType == \"flowChartSort\") {\r\n                            result += \" <polyline points='0 \" + h / 2 + \",\" + w + \" \" + h / 2 + \"' fill='none' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        }\r\n                        break;\r\n                    case \"trapezoid\":\r\n                    case \"flowChartManualOperation\":\r\n                    case \"flowChartManualInput\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adjst_val = 0.2;\r\n                        var max_adj_const = 0.7407;\r\n                        if (shapAdjst !== undefined) {\r\n                            var adjst = parseInt(shapAdjst.substr(4)) * 96 / 9144000;\r\n                            adjst_val = (adjst * 0.5) / max_adj_const;\r\n                            // console.log(\"w: \"+w+\"\\nh: \"+h+\"\\nshapAdjst: \"+shapAdjst+\"\\nadjst_val: \"+adjst_val);\r\n                        }\r\n                        var cnstVal = 0;\r\n                        var tranglRott = \"\";\r\n                        if (shapType == \"flowChartManualOperation\") {\r\n                            tranglRott = \"transform='rotate(180 \" + w / 2 + \",\" + h / 2 + \")'\";\r\n                        }\r\n                        if (shapType == \"flowChartManualInput\") {\r\n                            adjst_val = 0;\r\n                            cnstVal = h / 5;\r\n                        }\r\n                        result += \" <polygon \" + tranglRott + \" points='\" + (w * adjst_val) + \" \" + cnstVal + \",0 \" + h + \",\" + w + \" \" + h + \",\" + (1 - adjst_val) * w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"parallelogram\":\r\n                    case \"flowChartInputOutput\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adjst_val = 0.25;\r\n                        var max_adj_const;\r\n                        if (w > h) {\r\n                            max_adj_const = w / h;\r\n                        } else {\r\n                            max_adj_const = h / w;\r\n                        }\r\n                        if (shapAdjst !== undefined) {\r\n                            var adjst = parseInt(shapAdjst.substr(4)) / 100000;\r\n                            adjst_val = adjst / max_adj_const;\r\n                            //console.log(\"w: \"+w+\"\\nh: \"+h+\"\\nadjst: \"+adjst_val+\"\\nmax_adj_const: \"+max_adj_const);\r\n                        }\r\n                        result += \" <polygon points='\" + adjst_val * w + \" 0,0 \" + h + \",\" + (1 - adjst_val) * w + \" \" + h + \",\" + w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n\r\n                        break;\r\n                    case \"pentagon\":\r\n                        result += \" <polygon points='\" + (0.5 * w) + \" 0,0 \" + (0.375 * h) + \",\" + (0.15 * w) + \" \" + h + \",\" + 0.85 * w + \" \" + h + \",\" + w + \" \" + 0.375 * h + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"hexagon\":\r\n                    case \"flowChartPreparation\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 25000 * 96 / 914400;\r\n                        var vf = 115470 * 96 / 914400;;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var angVal1 = 60 * Math.PI / 180;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var maxAdj, a, shd2, x1, x2, dy1, y1, y2, vc = h / 2, hd2 = h / 2;\r\n                        var ss = Math.min(w, h);\r\n                        maxAdj = cnstVal1 * w / ss;\r\n                        a = (adj < 0) ? 0 : (adj > maxAdj) ? maxAdj : adj;\r\n                        shd2 = hd2 * vf / cnstVal2;\r\n                        x1 = ss * a / cnstVal2;\r\n                        x2 = w - x1;\r\n                        dy1 = shd2 * Math.sin(angVal1);\r\n                        y1 = vc - dy1;\r\n                        y2 = vc + dy1;\r\n\r\n                        var d = \"M\" + 0 + \",\" + vc +\r\n                            \" L\" + x1 + \",\" + y1 +\r\n                            \" L\" + x2 + \",\" + y1 +\r\n                            \" L\" + w + \",\" + vc +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" z\";\r\n\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"heptagon\":\r\n                        result += \" <polygon points='\" + (0.5 * w) + \" 0,\" + w / 8 + \" \" + h / 4 + \",0 \" + (5 / 8) * h + \",\" + w / 4 + \" \" + h + \",\" + (3 / 4) * w + \" \" + h + \",\" +\r\n                            w + \" \" + (5 / 8) * h + \",\" + (7 / 8) * w + \" \" + h / 4 + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"octagon\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj1 = 0.25;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj1 = parseInt(shapAdjst.substr(4)) / 100000;\r\n\r\n                        }\r\n                        var adj2 = (1 - adj1);\r\n                        //console.log(\"adj1: \"+adj1+\"\\nadj2: \"+adj2);\r\n                        result += \" <polygon points='\" + adj1 * w + \" 0,0 \" + adj1 * h + \",0 \" + adj2 * h + \",\" + adj1 * w + \" \" + h + \",\" + adj2 * w + \" \" + h + \",\" +\r\n                            w + \" \" + adj2 * h + \",\" + w + \" \" + adj1 * h + \",\" + adj2 * w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"decagon\":\r\n                        result += \" <polygon points='\" + (3 / 8) * w + \" 0,\" + w / 8 + \" \" + h / 8 + \",0 \" + h / 2 + \",\" + w / 8 + \" \" + (7 / 8) * h + \",\" + (3 / 8) * w + \" \" + h + \",\" +\r\n                            (5 / 8) * w + \" \" + h + \",\" + (7 / 8) * w + \" \" + (7 / 8) * h + \",\" + w + \" \" + h / 2 + \",\" + (7 / 8) * w + \" \" + h / 8 + \",\" + (5 / 8) * w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"dodecagon\":\r\n                        result += \" <polygon points='\" + (3 / 8) * w + \" 0,\" + w / 8 + \" \" + h / 8 + \",0 \" + (3 / 8) * h + \",0 \" + (5 / 8) * h + \",\" + w / 8 + \" \" + (7 / 8) * h + \",\" + (3 / 8) * w + \" \" + h + \",\" +\r\n                            (5 / 8) * w + \" \" + h + \",\" + (7 / 8) * w + \" \" + (7 / 8) * h + \",\" + w + \" \" + (5 / 8) * h + \",\" + w + \" \" + (3 / 8) * h + \",\" + (7 / 8) * w + \" \" + h / 8 + \",\" + (5 / 8) * w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"star4\":\r\n                    case \"star5\":\r\n                    case \"star6\":\r\n                    case \"star7\":\r\n                    case \"star8\":\r\n                    case \"star10\":\r\n                    case \"star12\":\r\n                    case \"star16\":\r\n                    case \"star24\":\r\n                    case \"star32\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);//[0][\"attrs\"][\"fmla\"];\r\n                        var starNum = shapType.substr(4);\r\n                        var shapAdjst1, adj;\r\n                        switch (starNum) {\r\n                            case \"4\":\r\n                                adj = 30;\r\n                                break;\r\n                            case \"5\":\r\n                                adj = 40;\r\n                                break;\r\n                            case \"6\":\r\n                                adj = 60;\r\n                                break;\r\n                            case \"7\":\r\n                                adj = 70;\r\n                                break;\r\n                            case \"8\":\r\n                                adj = 77;\r\n                                break;\r\n                            case \"10\":\r\n                                adj = 86;\r\n                                break;\r\n                            case \"12\":\r\n                            case \"16\":\r\n                            case \"24\":\r\n                            case \"32\":\r\n                                adj = 75;\r\n                                break;\r\n                        }\r\n                        if (shapAdjst !== undefined) {\r\n                            shapAdjst1 = getTextByPathList(shapAdjst, [\"attrs\", \"fmla\"]);\r\n                            if (shapAdjst1 === undefined) {\r\n                                shapAdjst1 = shapAdjst[0][\"attrs\"][\"fmla\"];\r\n                            }\r\n                            if (shapAdjst1 !== undefined) {\r\n                                adj = 2 * parseInt(shapAdjst1.substr(4)) / 1000;\r\n                            }\r\n                        }\r\n\r\n                        var points = shapeStar(adj, starNum);\r\n                        result += \" <polygon points='\" + points + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"pie\":\r\n                    case \"pieWedge\":\r\n                    case \"arc\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var adj1, adj2, H, shapAdjst1, shapAdjst2, isClose;\r\n                        if (shapType == \"pie\") {\r\n                            adj1 = 0;\r\n                            adj2 = 270;\r\n                            H = h;\r\n                            isClose = true;\r\n                        } else if (shapType == \"pieWedge\") {\r\n                            adj1 = 180;\r\n                            adj2 = 270;\r\n                            H = 2 * h;\r\n                            isClose = true;\r\n                        } else if (shapType == \"arc\") {\r\n                            adj1 = 270;\r\n                            adj2 = 0;\r\n                            H = h;\r\n                            isClose = false;\r\n                        }\r\n                        if (shapAdjst !== undefined) {\r\n                            shapAdjst1 = getTextByPathList(shapAdjst, [\"attrs\", \"fmla\"]);\r\n                            shapAdjst2 = shapAdjst1;\r\n                            if (shapAdjst1 === undefined) {\r\n                                shapAdjst1 = shapAdjst[0][\"attrs\"][\"fmla\"];\r\n                                shapAdjst2 = shapAdjst[1][\"attrs\"][\"fmla\"];\r\n                            }\r\n                            if (shapAdjst1 !== undefined) {\r\n                                adj1 = parseInt(shapAdjst1.substr(4)) / 60000;\r\n                            }\r\n                            if (shapAdjst2 !== undefined) {\r\n                                adj2 = parseInt(shapAdjst2.substr(4)) / 60000;\r\n                            }\r\n                        }\r\n                        var pieVals = shapePie(H, w, adj1, adj2, isClose);\r\n                        //console.log(\"shapType: \",shapType,\"\\nimgFillFlg: \",imgFillFlg,\"\\ngrndFillFlg: \",grndFillFlg,\"\\nshpId: \",shpId,\"\\nfillColor: \",fillColor);\r\n                        result += \"<path   d='\" + pieVals[0] + \"' transform='\" + pieVals[1] + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"chord\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 45;\r\n                        var sAdj2, sAdj2_val = 270;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = parseInt(sAdj1.substr(4)) / 60000;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj2_val = parseInt(sAdj2.substr(4)) / 60000;\r\n                                }\r\n                            }\r\n                        }\r\n                        var hR = h / 2;\r\n                        var wR = w / 2;\r\n                        var d_val = shapeArc(wR, hR, wR, hR, sAdj1_val, sAdj2_val, true);\r\n                        //console.log(\"shapType: \",shapType,\", sAdj1_val: \",sAdj1_val,\", sAdj2_val: \",sAdj2_val)\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"frame\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj1 = 12500 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj1 = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var a1, x1, x4, y4;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > cnstVal1) a1 = cnstVal1\r\n                        else a1 = adj1\r\n                        x1 = Math.min(w, h) * a1 / cnstVal2;\r\n                        x4 = w - x1;\r\n                        y4 = h - x1;\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \"M\" + x1 + \",\" + x1 +\r\n                            \" L\" + x1 + \",\" + y4 +\r\n                            \" L\" + x4 + \",\" + y4 +\r\n                            \" L\" + x4 + \",\" + x1 +\r\n                            \" z\";\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"donut\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var a, dr, iwd2, ihd2;\r\n                        if (adj < 0) a = 0\r\n                        else if (adj > cnstVal1) a = cnstVal1\r\n                        else a = adj\r\n                        dr = Math.min(w, h) * a / cnstVal2;\r\n                        iwd2 = w / 2 - dr;\r\n                        ihd2 = h / 2 - dr;\r\n                        var d = \"M\" + 0 + \",\" + h / 2 +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 180, 270, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 270, 360, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 0, 90, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 90, 180, false).replace(\"M\", \"L\") +\r\n                            \" z\" +\r\n                            \"M\" + dr + \",\" + h / 2 +\r\n                            shapeArc(w / 2, h / 2, iwd2, ihd2, 180, 90, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, iwd2, ihd2, 90, 0, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, iwd2, ihd2, 0, -90, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, iwd2, ihd2, 270, 180, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"noSmoking\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 18750 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var a, dr, iwd2, ihd2, ang, ang2rad, ct, st, m, n, drd2, dang, dang2, swAng, t3, stAng1, stAng2;\r\n                        if (adj < 0) a = 0\r\n                        else if (adj > cnstVal1) a = cnstVal1\r\n                        else a = adj\r\n                        dr = Math.min(w, h) * a / cnstVal2;\r\n                        iwd2 = w / 2 - dr;\r\n                        ihd2 = h / 2 - dr;\r\n                        ang = Math.atan(h / w);\r\n                        //ang2rad = ang*Math.PI/180;\r\n                        ct = ihd2 * Math.cos(ang);\r\n                        st = iwd2 * Math.sin(ang);\r\n                        m = Math.sqrt(ct * ct + st * st); //\"mod ct st 0\"\r\n                        n = iwd2 * ihd2 / m;\r\n                        drd2 = dr / 2;\r\n                        dang = Math.atan(drd2 / n);\r\n                        dang2 = dang * 2;\r\n                        swAng = -Math.PI + dang2;\r\n                        //t3 = Math.atan(h/w);\r\n                        stAng1 = ang - dang;\r\n                        stAng2 = stAng1 - Math.PI;\r\n                        var ct1, st1, m1, n1, dx1, dy1, x1, y1, y1, y2;\r\n                        ct1 = ihd2 * Math.cos(stAng1);\r\n                        st1 = iwd2 * Math.sin(stAng1);\r\n                        m1 = Math.sqrt(ct1 * ct1 + st1 * st1); //\"mod ct1 st1 0\"\r\n                        n1 = iwd2 * ihd2 / m1;\r\n                        dx1 = n1 * Math.cos(stAng1);\r\n                        dy1 = n1 * Math.sin(stAng1);\r\n                        x1 = w / 2 + dx1;\r\n                        y1 = h / 2 + dy1;\r\n                        x2 = w / 2 - dx1;\r\n                        y2 = h / 2 - dy1;\r\n                        var stAng1deg = stAng1 * 180 / Math.PI;\r\n                        var stAng2deg = stAng2 * 180 / Math.PI;\r\n                        var swAng2deg = swAng * 180 / Math.PI;\r\n                        var d = \"M\" + 0 + \",\" + h / 2 +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 180, 270, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 270, 360, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 0, 90, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 90, 180, false).replace(\"M\", \"L\") +\r\n                            \" z\" +\r\n                            \"M\" + x1 + \",\" + y1 +\r\n                            shapeArc(w / 2, h / 2, iwd2, ihd2, stAng1deg, (stAng1deg + swAng2deg), false).replace(\"M\", \"L\") +\r\n                            \" z\" +\r\n                            \"M\" + x2 + \",\" + y2 +\r\n                            shapeArc(w / 2, h / 2, iwd2, ihd2, stAng2deg, (stAng2deg + swAng2deg), false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        //console.log(\"adj: \",adj,\"x1:\",x1,\",y1:\",y1,\" x2:\",x2,\",y2:\",y2,\",stAng1:\",stAng1,\",stAng1deg:\",stAng1deg,\",stAng2:\",stAng2,\",stAng2deg:\",stAng2deg,\",swAng:\",swAng,\",swAng2deg:\",swAng2deg)\r\n\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"halfFrame\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 3.5;\r\n                        var sAdj2, sAdj2_val = 3.5;\r\n                        var cnsVal = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj2_val = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var minWH = Math.min(w, h);\r\n                        var maxAdj2 = (cnsVal * w) / minWH;\r\n                        var a1, a2;\r\n                        if (sAdj2_val < 0) a2 = 0\r\n                        else if (sAdj2_val > maxAdj2) a2 = maxAdj2\r\n                        else a2 = sAdj2_val\r\n                        var x1 = (minWH * a2) / cnsVal;\r\n                        var g1 = h * x1 / w;\r\n                        var g2 = h - g1;\r\n                        var maxAdj1 = (cnsVal * g2) / minWH;\r\n                        if (sAdj1_val < 0) a1 = 0\r\n                        else if (sAdj1_val > maxAdj1) a1 = maxAdj1\r\n                        else a1 = sAdj1_val\r\n                        var y1 = minWH * a1 / cnsVal;\r\n                        var dx2 = y1 * w / h;\r\n                        var x2 = w - dx2;\r\n                        var dy2 = x1 * h / w;\r\n                        var y2 = h - dy2;\r\n                        var d = \"M0,0\" +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + x2 + \",\" + y1 +\r\n                            \" L\" + x1 + \",\" + y1 +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" L0,\" + h + \" z\";\r\n\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        //console.log(\"w: \",w,\", h: \",h,\", sAdj1_val: \",sAdj1_val,\", sAdj2_val: \",sAdj2_val,\",maxAdj1: \",maxAdj1,\",maxAdj2: \",maxAdj2)\r\n                        break;\r\n                    case \"blockArc\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 180;\r\n                        var sAdj2, adj2 = 0;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) / 60000;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) / 60000;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        var stAng, istAng, a3, sw11, sw12, swAng, iswAng;\r\n                        var cd1 = 360;\r\n                        if (adj1 < 0) stAng = 0\r\n                        else if (adj1 > cd1) stAng = cd1\r\n                        else stAng = adj1 //180\r\n\r\n                        if (adj2 < 0) istAng = 0\r\n                        else if (adj2 > cd1) istAng = cd1\r\n                        else istAng = adj2 //0\r\n\r\n                        if (adj3 < 0) a3 = 0\r\n                        else if (adj3 > cnstVal1) a3 = cnstVal1\r\n                        else a3 = adj3\r\n\r\n                        sw11 = istAng - stAng; // -180\r\n                        sw12 = sw11 + cd1; //180\r\n                        swAng = (sw11 > 0) ? sw11 : sw12; //180\r\n                        iswAng = -swAng; //-180\r\n\r\n                        var endAng = stAng + swAng;\r\n                        var iendAng = istAng + iswAng;\r\n\r\n                        var wt1, ht1, dx1, dy1, x1, y1, stRd, istRd, wd2, hd2, hc, vc;\r\n                        stRd = stAng * (Math.PI) / 180;\r\n                        istRd = istAng * (Math.PI) / 180;\r\n                        wd2 = w / 2;\r\n                        hd2 = h / 2;\r\n                        hc = w / 2;\r\n                        vc = h / 2;\r\n                        if (stAng > 90 && stAng < 270) {\r\n                            wt1 = wd2 * (Math.sin((Math.PI) / 2 - stRd));\r\n                            ht1 = hd2 * (Math.cos((Math.PI) / 2 - stRd));\r\n\r\n                            dx1 = wd2 * (Math.cos(Math.atan(ht1 / wt1)));\r\n                            dy1 = hd2 * (Math.sin(Math.atan(ht1 / wt1)));\r\n\r\n                            x1 = hc - dx1;\r\n                            y1 = vc - dy1;\r\n                        } else {\r\n                            wt1 = wd2 * (Math.sin(stRd));\r\n                            ht1 = hd2 * (Math.cos(stRd));\r\n\r\n                            dx1 = wd2 * (Math.cos(Math.atan(wt1 / ht1)));\r\n                            dy1 = hd2 * (Math.sin(Math.atan(wt1 / ht1)));\r\n\r\n                            x1 = hc + dx1;\r\n                            y1 = vc + dy1;\r\n                        }\r\n                        var dr, iwd2, ihd2, wt2, ht2, dx2, dy2, x2, y2;\r\n                        dr = Math.min(w, h) * a3 / cnstVal2;\r\n                        iwd2 = wd2 - dr;\r\n                        ihd2 = hd2 - dr;\r\n                        //console.log(\"stAng: \",stAng,\" swAng: \",swAng ,\" endAng:\",endAng)\r\n                        if ((endAng <= 450 && endAng > 270) || ((endAng >= 630 && endAng < 720))) {\r\n                            wt2 = iwd2 * (Math.sin(istRd));\r\n                            ht2 = ihd2 * (Math.cos(istRd));\r\n                            dx2 = iwd2 * (Math.cos(Math.atan(wt2 / ht2)));\r\n                            dy2 = ihd2 * (Math.sin(Math.atan(wt2 / ht2)));\r\n                            x2 = hc + dx2;\r\n                            y2 = vc + dy2;\r\n                        } else {\r\n                            wt2 = iwd2 * (Math.sin((Math.PI) / 2 - istRd));\r\n                            ht2 = ihd2 * (Math.cos((Math.PI) / 2 - istRd));\r\n\r\n                            dx2 = iwd2 * (Math.cos(Math.atan(ht2 / wt2)));\r\n                            dy2 = ihd2 * (Math.sin(Math.atan(ht2 / wt2)));\r\n                            x2 = hc - dx2;\r\n                            y2 = vc - dy2;\r\n                        }\r\n                        var d = \"M\" + x1 + \",\" + y1 +\r\n                            shapeArc(wd2, hd2, wd2, hd2, stAng, endAng, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            shapeArc(wd2, hd2, iwd2, ihd2, istAng, iendAng, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"bracePair\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 8333 * 96 / 914400;\r\n                        var cnstVal1 = 25000 * 96 / 914400;\r\n                        var cnstVal2 = 50000 * 96 / 914400;\r\n                        var cnstVal3 = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var vc = h / 2, cd = 360, cd2 = 180, cd4 = 90, c3d4 = 270, a, x1, x2, x3, x4, y2, y3, y4;\r\n                        if (adj < 0) a = 0\r\n                        else if (adj > cnstVal1) a = cnstVal1\r\n                        else a = adj\r\n                        var minWH = Math.min(w, h);\r\n                        x1 = minWH * a / cnstVal3;\r\n                        x2 = minWH * a / cnstVal2;\r\n                        x3 = w - x2;\r\n                        x4 = w - x1;\r\n                        y2 = vc - x1;\r\n                        y3 = vc + x1;\r\n                        y4 = h - x1;\r\n                        //console.log(\"w:\",w,\" h:\",h,\" x1:\",x1,\" x2:\",x2,\" x3:\",x3,\" x4:\",x4,\" y2:\",y2,\" y3:\",y3,\" y4:\",y4)\r\n                        var d = \"M\" + x2 + \",\" + h +\r\n                            shapeArc(x2, y4, x1, x1, cd4, cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + y3 +\r\n                            shapeArc(0, y3, x1, x1, 0, (-cd4), false).replace(\"M\", \"L\") +\r\n                            shapeArc(0, y2, x1, x1, cd4, 0, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + x1 +\r\n                            shapeArc(x2, x1, x1, x1, cd2, c3d4, false).replace(\"M\", \"L\") +\r\n                            \" M\" + x3 + \",\" + 0 +\r\n                            shapeArc(x3, x1, x1, x1, c3d4, cd, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x4 + \",\" + y2 +\r\n                            shapeArc(w, y2, x1, x1, cd2, cd4, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w, y3, x1, x1, c3d4, cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x4 + \",\" + y4 +\r\n                            shapeArc(x3, y4, x1, x1, 0, cd4, false).replace(\"M\", \"L\");\r\n\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"leftBrace\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 8333 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, cd2 = 180, cd4 = 90, c3d4 = 270, a1, a2, q1, q2, q3, y1, y2, y3, y4;\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > cnstVal2) a2 = cnstVal2\r\n                        else a2 = adj2\r\n                        var minWH = Math.min(w, h);\r\n                        q1 = cnstVal2 - a2;\r\n                        if (q1 < a2) q2 = q1\r\n                        else q2 = a2\r\n                        q3 = q2 / 2;\r\n                        var maxAdj1 = q3 * h / minWH;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > maxAdj1) a1 = maxAdj1\r\n                        else a1 = adj1\r\n                        y1 = minWH * a1 / cnstVal2;\r\n                        y3 = h * a2 / cnstVal2;\r\n                        y2 = y3 - y1;\r\n                        y4 = y3 + y1;\r\n                        //console.log(\"w:\",w,\" h:\",h,\" q1:\",q1,\" q2:\",q2,\" q3:\",q3,\" y1:\",y1,\" y3:\",y3,\" y4:\",y4,\" maxAdj1:\",maxAdj1)\r\n                        var d = \"M\" + w + \",\" + h +\r\n                            shapeArc(w, h - y1, w / 2, y1, cd4, cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w / 2 + \",\" + y4 +\r\n                            shapeArc(0, y4, w / 2, y1, 0, (-cd4), false).replace(\"M\", \"L\") +\r\n                            shapeArc(0, y2, w / 2, y1, cd4, 0, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w / 2 + \",\" + y1 +\r\n                            shapeArc(w, y1, w / 2, y1, cd2, c3d4, false).replace(\"M\", \"L\");\r\n\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"rightBrace\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 8333 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, cd = 360, cd2 = 180, cd4 = 90, c3d4 = 270, a1, a2, q1, q2, q3, y1, y2, y3, y4;\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > cnstVal2) a2 = cnstVal2\r\n                        else a2 = adj2\r\n                        var minWH = Math.min(w, h);\r\n                        q1 = cnstVal2 - a2;\r\n                        if (q1 < a2) q2 = q1\r\n                        else q2 = a2\r\n                        q3 = q2 / 2;\r\n                        var maxAdj1 = q3 * h / minWH;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > maxAdj1) a1 = maxAdj1\r\n                        else a1 = adj1\r\n                        y1 = minWH * a1 / cnstVal2;\r\n                        y3 = h * a2 / cnstVal2;\r\n                        y2 = y3 - y1;\r\n                        y4 = h - y1;\r\n                        //console.log(\"w:\",w,\" h:\",h,\" q1:\",q1,\" q2:\",q2,\" q3:\",q3,\" y1:\",y1,\" y2:\",y2,\" y3:\",y3,\" y4:\",y4,\" maxAdj1:\",maxAdj1)\r\n                        var d = \"M\" + 0 + \",\" + 0 +\r\n                            shapeArc(0, y1, w / 2, y1, c3d4, cd, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w / 2 + \",\" + y2 +\r\n                            shapeArc(w, y2, w / 2, y1, cd2, cd4, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w, y3 + y1, w / 2, y1, c3d4, cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w / 2 + \",\" + y4 +\r\n                            shapeArc(0, y4, w / 2, y1, 0, cd4, false).replace(\"M\", \"L\");\r\n\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"bracketPair\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 16667 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var r = w, b = h, cd2 = 180, cd4 = 90, c3d4 = 270, a, x1, x2, y2;\r\n                        if (adj < 0) a = 0\r\n                        else if (adj > cnstVal1) a = cnstVal1\r\n                        else a = adj\r\n                        x1 = Math.min(w, h) * a / cnstVal2;\r\n                        x2 = r - x1;\r\n                        y2 = b - x1;\r\n                        //console.log(\"w:\",w,\" h:\",h,\" x1:\",x1,\" x2:\",x2,\" y2:\",y2)\r\n                        var d = shapeArc(x1, x1, x1, x1, c3d4, cd2, false) +\r\n                            shapeArc(x1, y2, x1, x1, cd2, cd4, false).replace(\"M\", \"L\") +\r\n                            shapeArc(x2, x1, x1, x1, c3d4, (c3d4 + cd4), false) +\r\n                            shapeArc(x2, y2, x1, x1, 0, cd4, false).replace(\"M\", \"L\");\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"leftBracket\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 8333 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var maxAdj = cnstVal1 * h / Math.min(w, h);\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var r = w, b = h, cd2 = 180, cd4 = 90, c3d4 = 270, a, y1, y2;\r\n                        if (adj < 0) a = 0\r\n                        else if (adj > maxAdj) a = maxAdj\r\n                        else a = adj\r\n                        y1 = Math.min(w, h) * a / cnstVal2;\r\n                        if (y1 > w) y1 = w;\r\n                        y2 = b - y1;\r\n                        var d = \"M\" + r + \",\" + b +\r\n                            shapeArc(y1, y2, y1, y1, cd4, cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + 0 + \",\" + y1 +\r\n                            shapeArc(y1, y1, y1, y1, cd2, c3d4, false).replace(\"M\", \"L\") +\r\n                            \" L\" + r + \",\" + 0\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"rightBracket\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 8333 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var maxAdj = cnstVal1 * h / Math.min(w, h);\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var cd = 360, cd2 = 180, cd4 = 90, c3d4 = 270, a, y1, y2, y3;\r\n                        if (adj < 0) a = 0\r\n                        else if (adj > maxAdj) a = maxAdj\r\n                        else a = adj\r\n                        y1 = Math.min(w, h) * a / cnstVal2;\r\n                        y2 = h - y1;\r\n                        y3 = w - y1;\r\n                        //console.log(\"w:\",w,\" h:\",h,\" y1:\",y1,\" y2:\",y2,\" y3:\",y3)\r\n                        var d = \"M\" + 0 + \",\" + h +\r\n                            shapeArc(y3, y2, y1, y1, cd4, 0, false).replace(\"M\", \"L\") +\r\n                            //\" L\"+ r + \",\" + y2 +\r\n                            \" L\" + w + \",\" + h / 2 +\r\n                            shapeArc(y3, y1, y1, y1, cd, c3d4, false).replace(\"M\", \"L\") +\r\n                            \" L\" + 0 + \",\" + 0\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"moon\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 0.5;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) / 100000;//*96/914400;;\r\n                        }\r\n                        var hd2, cd2, cd4;\r\n\r\n                        hd2 = h / 2;\r\n                        cd2 = 180;\r\n                        cd4 = 90;\r\n\r\n                        var adj2 = (1 - adj) * w;\r\n                        var d = \"M\" + w + \",\" + h +\r\n                            shapeArc(w, hd2, w, hd2, cd4, (cd4 + cd2), false).replace(\"M\", \"L\") +\r\n                            shapeArc(w, hd2, adj2, hd2, (cd4 + cd2), cd4, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"corner\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 50000 * 96 / 914400;\r\n                        var sAdj2, sAdj2_val = 50000 * 96 / 914400;\r\n                        var cnsVal = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj2_val = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var minWH = Math.min(w, h);\r\n                        var maxAdj1 = cnsVal * h / minWH;\r\n                        var maxAdj2 = cnsVal * w / minWH;\r\n                        var a1, a2, x1, dy1, y1;\r\n                        if (sAdj1_val < 0) a1 = 0\r\n                        else if (sAdj1_val > maxAdj1) a1 = maxAdj1\r\n                        else a1 = sAdj1_val\r\n\r\n                        if (sAdj2_val < 0) a2 = 0\r\n                        else if (sAdj2_val > maxAdj2) a2 = maxAdj2\r\n                        else a2 = sAdj2_val\r\n                        x1 = minWH * a2 / cnsVal;\r\n                        dy1 = minWH * a1 / cnsVal;\r\n                        y1 = h - dy1;\r\n\r\n                        var d = \"M0,0\" +\r\n                            \" L\" + x1 + \",\" + 0 +\r\n                            \" L\" + x1 + \",\" + y1 +\r\n                            \" L\" + w + \",\" + y1 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L0,\" + h + \" z\";\r\n\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"diagStripe\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var sAdj1_val = 50000 * 96 / 914400;\r\n                        var cnsVal = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            sAdj1_val = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var a1, x2, y2;\r\n                        if (sAdj1_val < 0) a1 = 0\r\n                        else if (sAdj1_val > cnsVal) a1 = cnsVal\r\n                        else a1 = sAdj1_val\r\n                        x2 = w * a1 / cnsVal;\r\n                        y2 = h * a1 / cnsVal;\r\n                        var d = \"M\" + 0 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + 0 + \",\" + h + \" z\";\r\n\r\n                        result += \"<path   d='\" + d + \"'  fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"gear6\":\r\n                    case \"gear9\":\r\n                        txtRotate = 0;\r\n                        var gearNum = shapType.substr(4), d;\r\n                        if (gearNum == \"6\") {\r\n                            d = shapeGear(w, h / 3.5, parseInt(gearNum));\r\n                        } else { //gearNum==\"9\"\r\n                            d = shapeGear(w, h / 3.5, parseInt(gearNum));\r\n                        }\r\n                        result += \"<path   d='\" + d + \"' transform='rotate(20,\" + (3 / 7) * h + \",\" + (3 / 7) * h + \")' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"bentConnector3\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var shapAdjst_val = 0.5;\r\n                        if (shapAdjst !== undefined) {\r\n                            shapAdjst_val = parseInt(shapAdjst.substr(4)) / 100000;\r\n                            if (isFlipV) {\r\n                                result += \" <polyline points='\" + w + \" 0,\" + ((1 - shapAdjst_val) * w) + \" 0,\" + ((1 - shapAdjst_val) * w) + \" \" + h + \",0 \" + h + \"' fill='transparent'\" +\r\n                                    \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' \";\r\n                            } else {\r\n                                result += \" <polyline points='0 0,\" + (shapAdjst_val) * w + \" 0,\" + (shapAdjst_val) * w + \" \" + h + \",\" + w + \" \" + h + \"' fill='transparent'\" +\r\n                                    \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' \";\r\n                            }\r\n                            if (headEndNodeAttrs !== undefined && (headEndNodeAttrs[\"type\"] === \"triangle\" || headEndNodeAttrs[\"type\"] === \"arrow\")) {\r\n                                result += \"marker-start='url(#markerTriangle_\" + shpId + \")' \";\r\n                            }\r\n                            if (tailEndNodeAttrs !== undefined && (tailEndNodeAttrs[\"type\"] === \"triangle\" || tailEndNodeAttrs[\"type\"] === \"arrow\")) {\r\n                                result += \"marker-end='url(#markerTriangle_\" + shpId + \")' \";\r\n                            }\r\n                            result += \"/>\";\r\n                        }\r\n                        break;\r\n                    case \"plus\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj1 = 0.25;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj1 = parseInt(shapAdjst.substr(4)) / 100000;\r\n\r\n                        }\r\n                        var adj2 = (1 - adj1);\r\n                        result += \" <polygon points='\" + adj1 * w + \" 0,\" + adj1 * w + \" \" + adj1 * h + \",0 \" + adj1 * h + \",0 \" + adj2 * h + \",\" +\r\n                            adj1 * w + \" \" + adj2 * h + \",\" + adj1 * w + \" \" + h + \",\" + adj2 * w + \" \" + h + \",\" + adj2 * w + \" \" + adj2 * h + \",\" + w + \" \" + adj2 * h + \",\" +\r\n                            +w + \" \" + adj1 * h + \",\" + adj2 * w + \" \" + adj1 * h + \",\" + adj2 * w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"teardrop\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj1 = 100000 * 96 / 914400;\r\n                        var cnsVal1 = adj1;\r\n                        var cnsVal2 = 200000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj1 = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var a1, r2, tw, th, sw, sh, dx1, dy1, x1, y1, x2, y2, rd45;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > cnsVal2) a1 = cnsVal2\r\n                        else a1 = adj1\r\n                        r2 = Math.sqrt(2);\r\n                        tw = r2 * (w / 2);\r\n                        th = r2 * (h / 2);\r\n                        sw = (tw * a1) / cnsVal1;\r\n                        sh = (th * a1) / cnsVal1;\r\n                        rd45 = (45 * (Math.PI) / 180);\r\n                        dx1 = sw * (Math.cos(rd45));\r\n                        dy1 = sh * (Math.cos(rd45));\r\n                        x1 = (w / 2) + dx1;\r\n                        y1 = (h / 2) - dy1;\r\n                        x2 = ((w / 2) + x1) / 2;\r\n                        y2 = ((h / 2) + y1) / 2;\r\n\r\n                        var d_val = shapeArc(w / 2, h / 2, w / 2, h / 2, 180, 270, false) +\r\n                            \"Q \" + x2 + \",0 \" + x1 + \",\" + y1 +\r\n                            \"Q \" + w + \",\" + y2 + \" \" + w + \",\" + h / 2 +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 0, 90, false).replace(\"M\", \"L\") +\r\n                            shapeArc(w / 2, h / 2, w / 2, h / 2, 90, 180, false).replace(\"M\", \"L\") + \" z\";\r\n                        result += \"<path   d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        // console.log(\"shapAdjst: \",shapAdjst,\", adj1: \",adj1);\r\n                        break;\r\n                    case \"plaque\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj1 = 16667 * 96 / 914400;\r\n                        var cnsVal1 = 50000 * 96 / 914400;\r\n                        var cnsVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj1 = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var a1, x1, x2, y2;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > cnsVal1) a1 = cnsVal1\r\n                        else a1 = adj1\r\n                        x1 = a1 * (Math.min(w, h)) / cnsVal2;\r\n                        x2 = w - x1;\r\n                        y2 = h - x1;\r\n\r\n                        var d_val = \"M0,\" + x1 +\r\n                            shapeArc(0, 0, x1, x1, 90, 0, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x2 + \",\" + 0 +\r\n                            shapeArc(w, 0, x1, x1, 180, 90, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w + \",\" + y2 +\r\n                            shapeArc(w, h, x1, x1, 270, 180, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + h +\r\n                            shapeArc(0, h, x1, x1, 0, -90, false).replace(\"M\", \"L\") + \" z\";\r\n                        result += \"<path   d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"sun\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var refr = 96 / 914400;\r\n                        var adj1 = 25000 * refr;\r\n                        var cnstVal1 = 12500 * refr;\r\n                        var cnstVal2 = 46875 * refr;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj1 = parseInt(shapAdjst.substr(4)) * refr;\r\n                        }\r\n                        var a1;\r\n                        if (adj1 < cnstVal1) a1 = cnstVal1\r\n                        else if (adj1 > cnstVal2) a1 = cnstVal2\r\n                        else a1 = adj1\r\n\r\n                        var cnstVa3 = 50000 * refr;\r\n                        var cnstVa4 = 100000 * refr;\r\n                        var g0 = cnstVa3 - a1,\r\n                            g1 = g0 * (30274 * refr) / (32768 * refr),\r\n                            g2 = g0 * (12540 * refr) / (32768 * refr),\r\n                            g3 = g1 + cnstVa3,\r\n                            g4 = g2 + cnstVa3,\r\n                            g5 = cnstVa3 - g1,\r\n                            g6 = cnstVa3 - g2,\r\n                            g7 = g0 * (23170 * refr) / (32768 * refr),\r\n                            g8 = cnstVa3 + g7,\r\n                            g9 = cnstVa3 - g7,\r\n                            g10 = g5 * 3 / 4,\r\n                            g11 = g6 * 3 / 4,\r\n                            g12 = g10 + 3662 * refr,\r\n                            g13 = g11 + 36620 * refr,\r\n                            g14 = g11 + 12500 * refr,\r\n                            g15 = cnstVa4 - g10,\r\n                            g16 = cnstVa4 - g12,\r\n                            g17 = cnstVa4 - g13,\r\n                            g18 = cnstVa4 - g14,\r\n                            ox1 = w * (18436 * refr) / (21600 * refr),\r\n                            oy1 = h * (3163 * refr) / (21600 * refr),\r\n                            ox2 = w * (3163 * refr) / (21600 * refr),\r\n                            oy2 = h * (18436 * refr) / (21600 * refr),\r\n                            x8 = w * g8 / cnstVa4,\r\n                            x9 = w * g9 / cnstVa4,\r\n                            x10 = w * g10 / cnstVa4,\r\n                            x12 = w * g12 / cnstVa4,\r\n                            x13 = w * g13 / cnstVa4,\r\n                            x14 = w * g14 / cnstVa4,\r\n                            x15 = w * g15 / cnstVa4,\r\n                            x16 = w * g16 / cnstVa4,\r\n                            x17 = w * g17 / cnstVa4,\r\n                            x18 = w * g18 / cnstVa4,\r\n                            x19 = w * a1 / cnstVa4,\r\n                            wR = w * g0 / cnstVa4,\r\n                            hR = h * g0 / cnstVa4,\r\n                            y8 = h * g8 / cnstVa4,\r\n                            y9 = h * g9 / cnstVa4,\r\n                            y10 = h * g10 / cnstVa4,\r\n                            y12 = h * g12 / cnstVa4,\r\n                            y13 = h * g13 / cnstVa4,\r\n                            y14 = h * g14 / cnstVa4,\r\n                            y15 = h * g15 / cnstVa4,\r\n                            y16 = h * g16 / cnstVa4,\r\n                            y17 = h * g17 / cnstVa4,\r\n                            y18 = h * g18 / cnstVa4;\r\n\r\n                        var d_val = \"M\" + w + \",\" + h / 2 +\r\n                            \" L\" + x15 + \",\" + y18 +\r\n                            \" L\" + x15 + \",\" + y14 +\r\n                            \"z\" +\r\n                            \" M\" + ox1 + \",\" + oy1 +\r\n                            \" L\" + x16 + \",\" + y17 +\r\n                            \" L\" + x13 + \",\" + y12 +\r\n                            \"z\" +\r\n                            \" M\" + w / 2 + \",\" + 0 +\r\n                            \" L\" + x18 + \",\" + y10 +\r\n                            \" L\" + x14 + \",\" + y10 +\r\n                            \"z\" +\r\n                            \" M\" + ox2 + \",\" + oy1 +\r\n                            \" L\" + x17 + \",\" + y12 +\r\n                            \" L\" + x12 + \",\" + y17 +\r\n                            \"z\" +\r\n                            \" M\" + 0 + \",\" + h / 2 +\r\n                            \" L\" + x10 + \",\" + y14 +\r\n                            \" L\" + x10 + \",\" + y18 +\r\n                            \"z\" +\r\n                            \" M\" + ox2 + \",\" + oy2 +\r\n                            \" L\" + x12 + \",\" + y13 +\r\n                            \" L\" + x17 + \",\" + y16 +\r\n                            \"z\" +\r\n                            \" M\" + w / 2 + \",\" + h +\r\n                            \" L\" + x14 + \",\" + y15 +\r\n                            \" L\" + x18 + \",\" + y15 +\r\n                            \"z\" +\r\n                            \" M\" + ox1 + \",\" + oy2 +\r\n                            \" L\" + x13 + \",\" + y16 +\r\n                            \" L\" + x16 + \",\" + y13 +\r\n                            \" z\" +\r\n                            \" M\" + x19 + \",\" + h / 2 +\r\n                            shapeArc(w / 2, h / 2, wR, hR, 180, 540, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        //console.log(\"adj1: \",adj1,d_val);\r\n                        result += \"<path   d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n\r\n                        break;\r\n                    case \"heart\":\r\n                        var dx1, dx2, x1, x2, x3, x4, y1;\r\n                        dx1 = w * 49 / 48;\r\n                        dx2 = w * 10 / 48\r\n                        x1 = w / 2 - dx1\r\n                        x2 = w / 2 - dx2\r\n                        x3 = w / 2 + dx2\r\n                        x4 = w / 2 + dx1\r\n                        y1 = -h / 3;\r\n                        var d_val = \"M\" + w / 2 + \",\" + h / 4 +\r\n                            \"C\" + x3 + \",\" + y1 + \" \" + x4 + \",\" + h / 4 + \" \" + w / 2 + \",\" + h +\r\n                            \"C\" + x1 + \",\" + h / 4 + \" \" + x2 + \",\" + y1 + \" \" + w / 2 + \",\" + h / 4 + \" z\";\r\n\r\n                        result += \"<path   d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"lightningBolt\":\r\n                        var x1 = w * 5022 / 21600,\r\n                            x2 = w * 11050 / 21600,\r\n                            x3 = w * 8472 / 21600,\r\n                            x4 = w * 8757 / 21600,\r\n                            x5 = w * 10012 / 21600,\r\n                            x6 = w * 14767 / 21600,\r\n                            x7 = w * 12222 / 21600,\r\n                            x8 = w * 12860 / 21600,\r\n                            x9 = w * 13917 / 21600,\r\n                            x10 = w * 7602 / 21600,\r\n                            x11 = w * 16577 / 21600,\r\n                            y1 = h * 3890 / 21600,\r\n                            y2 = h * 6080 / 21600,\r\n                            y3 = h * 6797 / 21600,\r\n                            y4 = h * 7437 / 21600,\r\n                            y5 = h * 12877 / 21600,\r\n                            y6 = h * 9705 / 21600,\r\n                            y7 = h * 12007 / 21600,\r\n                            y8 = h * 13987 / 21600,\r\n                            y9 = h * 8382 / 21600,\r\n                            y10 = h * 14277 / 21600,\r\n                            y11 = h * 14915 / 21600;\r\n\r\n                        var d_val = \"M\" + x3 + \",\" + 0 +\r\n                            \" L\" + x8 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + y3 +\r\n                            \" L\" + x11 + \",\" + y7 +\r\n                            \" L\" + x6 + \",\" + y5 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + x5 + \",\" + y11 +\r\n                            \" L\" + x7 + \",\" + y8 +\r\n                            \" L\" + x1 + \",\" + y6 +\r\n                            \" L\" + x10 + \",\" + y9 +\r\n                            \" L\" + 0 + \",\" + y1 + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"cube\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var refr = 96 / 914400;\r\n                        var adj = 25000 * refr;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * refr;\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal2 = 100000 * refr;\r\n                        var ss = Math.min(w, h);\r\n                        var a, y1, y4, x4;\r\n                        a = (adj < 0) ? 0 : (adj > cnstVal2) ? cnstVal2 : adj;\r\n                        y1 = ss * a / cnstVal2;\r\n                        y4 = h - y1;\r\n                        x4 = w - y1;\r\n                        d_val = \"M\" + 0 + \",\" + y1 +\r\n                            \" L\" + y1 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + y4 +\r\n                            \" L\" + x4 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \"M\" + 0 + \",\" + y1 +\r\n                            \" L\" + x4 + \",\" + y1 +\r\n                            \" M\" + x4 + \",\" + y1 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \"M\" + x4 + \",\" + y1 +\r\n                            \" L\" + x4 + \",\" + h;\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"bevel\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var refr = 96 / 914400;\r\n                        var adj = 12500 * refr;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * refr;\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 50000 * refr;\r\n                        var cnstVal2 = 100000 * refr;\r\n                        var ss = Math.min(w, h);\r\n                        var a, x1, x2, y2;\r\n                        a = (adj < 0) ? 0 : (adj > cnstVal1) ? cnstVal1 : adj;\r\n                        x1 = ss * a / cnstVal2;\r\n                        x2 = w - x1;\r\n                        y2 = h - x1;\r\n                        d_val = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" z\" +\r\n                            \" M\" + x1 + \",\" + x1 +\r\n                            \" L\" + x2 + \",\" + x1 +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" z\" +\r\n                            \" M\" + 0 + \",\" + 0 +\r\n                            \" L\" + x1 + \",\" + x1 +\r\n                            \" M\" + 0 + \",\" + h +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" M\" + w + \",\" + 0 +\r\n                            \" L\" + x2 + \",\" + x1 +\r\n                            \" M\" + w + \",\" + h +\r\n                            \" L\" + x2 + \",\" + y2;\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"foldedCorner\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var refr = 96 / 914400;\r\n                        var adj = 16667 * refr;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * refr;\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 50000 * refr;\r\n                        var cnstVal2 = 100000 * refr;\r\n                        var ss = Math.min(w, h);\r\n                        var a, dy2, dy1, x1, x2, y2, y1;\r\n                        a = (adj < 0) ? 0 : (adj > cnstVal1) ? cnstVal1 : adj;\r\n                        dy2 = ss * a / cnstVal2;\r\n                        dy1 = dy2 / 5;\r\n                        x1 = w - dy2;\r\n                        x2 = x1 + dy1;\r\n                        y2 = h - dy2;\r\n                        y1 = y2 + dy1;\r\n                        d_val = \"M\" + x1 + \",\" + h +\r\n                            \" L\" + x2 + \",\" + y1 +\r\n                            \" L\" + w + \",\" + y2 +\r\n                            \" L\" + x1 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + y2;\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"cloud\":\r\n                    case \"cloudCallout\":\r\n                        var x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11,\r\n                            rx1, rx2, rx3, rx4, rx5, rx6, rx7, rx8, rx9, rx10, rx11, ry1, ry2, ry3, ry4, ry5, ry6, ry7, ry8, ry9, ry10, ry11;\r\n                        x0 = w * 3900 / 43200;;\r\n                        x1 = w * 4693 / 43200;\r\n                        x2 = w * 6928 / 43200;\r\n                        x3 = w * 16478 / 43200;\r\n                        x4 = w * 28827 / 43200;\r\n                        x5 = w * 34129 / 43200;\r\n                        x6 = w * 41798 / 43200;\r\n                        x7 = w * 38324 / 43200;\r\n                        x8 = w * 29078 / 43200;\r\n                        x9 = w * 22141 / 43200;\r\n                        x10 = w * 14000 / 43200;\r\n                        x11 = w * 4127 / 43200;\r\n                        y0 = h * 14370 / 43200;\r\n                        y1 = h * 26177 / 43200;\r\n                        y2 = h * 34899 / 43200;\r\n                        y3 = h * 39090 / 43200;\r\n                        y4 = h * 34751 / 43200;\r\n                        y5 = h * 22954 / 43200;\r\n                        y6 = h * 15354 / 43200;\r\n                        y7 = h * 5426 / 43200;\r\n                        y8 = h * 3952 / 43200;\r\n                        y9 = h * 4720 / 43200;\r\n                        y10 = h * 5192 / 43200;\r\n                        y11 = h * 15789 / 43200;\r\n                        //Path:\r\n                        //(path attrs: w = 43200; h = 43200; )\r\n                        var rX1 = w * 6753 / 43200, rY1 = h * 9190 / 43200, rX2 = w * 5333 / 43200, rY2 = h * 7267 / 43200, rX3 = w * 4365 / 43200,\r\n                            rY3 = h * 5945 / 43200, rX4 = w * 4857 / 43200, rY4 = h * 6595 / 43200, rY5 = h * 7273 / 43200, rX6 = w * 6775 / 43200,\r\n                            rY6 = h * 9220 / 43200, rX7 = w * 5785 / 43200, rY7 = h * 7867 / 43200, rX8 = w * 6752 / 43200, rY8 = h * 9215 / 43200,\r\n                            rX9 = w * 7720 / 43200, rY9 = h * 10543 / 43200, rX10 = w * 4360 / 43200, rY10 = h * 5918 / 43200, rX11 = w * 4345 / 43200;\r\n                        var sA1 = -11429249 / 60000, wA1 = 7426832 / 60000, sA2 = -8646143 / 60000, wA2 = 5396714 / 60000, sA3 = -8748475 / 60000,\r\n                            wA3 = 5983381 / 60000, sA4 = -7859164 / 60000, wA4 = 7034504 / 60000, sA5 = -4722533 / 60000, wA5 = 6541615 / 60000,\r\n                            sA6 = -2776035 / 60000, wA6 = 7816140 / 60000, sA7 = 37501 / 60000, wA7 = 6842000 / 60000, sA8 = 1347096 / 60000,\r\n                            wA8 = 6910353 / 60000, sA9 = 3974558 / 60000, wA9 = 4542661 / 60000, sA10 = -16496525 / 60000, wA10 = 8804134 / 60000,\r\n                            sA11 = -14809710 / 60000, wA11 = 9151131 / 60000;\r\n\r\n                        var cX0, cX1, cX2, cX3, cX4, cX5, cX6, cX7, cX8, cX9, cX10, cY0, cY1, cY2, cY3, cY4, cY5, cY6, cY7, cY8, cY9, cY10;\r\n                        var arc1, arc2, arc3, arc4, arc5, arc6, arc7, arc8, arc9, arc10, arc11;\r\n                        var lxy1, lxy2, lxy3, lxy4, lxy5, lxy6, lxy7, lxy8, lxy9, lxy10;\r\n\r\n                        cX0 = x0 - rX1 * Math.cos(sA1 * Math.PI / 180);\r\n                        cY0 = y0 - rY1 * Math.sin(sA1 * Math.PI / 180);\r\n                        arc1 = shapeArc(cX0, cY0, rX1, rY1, sA1, sA1 + wA1, false).replace(\"M\", \"L\");\r\n                        lxy1 = arc1.substr(arc1.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX1 = parseInt(lxy1[0]) - rX2 * Math.cos(sA2 * Math.PI / 180);\r\n                        cY1 = parseInt(lxy1[1]) - rY2 * Math.sin(sA2 * Math.PI / 180);\r\n                        arc2 = shapeArc(cX1, cY1, rX2, rY2, sA2, sA2 + wA2, false).replace(\"M\", \"L\");\r\n                        lxy2 = arc2.substr(arc2.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX2 = parseInt(lxy2[0]) - rX3 * Math.cos(sA3 * Math.PI / 180);\r\n                        cY2 = parseInt(lxy2[1]) - rY3 * Math.sin(sA3 * Math.PI / 180);\r\n                        arc3 = shapeArc(cX2, cY2, rX3, rY3, sA3, sA3 + wA3, false).replace(\"M\", \"L\");\r\n                        lxy3 = arc3.substr(arc3.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX3 = parseInt(lxy3[0]) - rX4 * Math.cos(sA4 * Math.PI / 180);\r\n                        cY3 = parseInt(lxy3[1]) - rY4 * Math.sin(sA4 * Math.PI / 180);\r\n                        arc4 = shapeArc(cX3, cY3, rX4, rY4, sA4, sA4 + wA4, false).replace(\"M\", \"L\");\r\n                        lxy4 = arc4.substr(arc4.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX4 = parseInt(lxy4[0]) - rX2 * Math.cos(sA5 * Math.PI / 180);\r\n                        cY4 = parseInt(lxy4[1]) - rY5 * Math.sin(sA5 * Math.PI / 180);\r\n                        arc5 = shapeArc(cX4, cY4, rX2, rY5, sA5, sA5 + wA5, false).replace(\"M\", \"L\");\r\n                        lxy5 = arc5.substr(arc5.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX5 = parseInt(lxy5[0]) - rX6 * Math.cos(sA6 * Math.PI / 180);\r\n                        cY5 = parseInt(lxy5[1]) - rY6 * Math.sin(sA6 * Math.PI / 180);\r\n                        arc6 = shapeArc(cX5, cY5, rX6, rY6, sA6, sA6 + wA6, false).replace(\"M\", \"L\");\r\n                        lxy6 = arc6.substr(arc6.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX6 = parseInt(lxy6[0]) - rX7 * Math.cos(sA7 * Math.PI / 180);\r\n                        cY6 = parseInt(lxy6[1]) - rY7 * Math.sin(sA7 * Math.PI / 180);\r\n                        arc7 = shapeArc(cX6, cY6, rX7, rY7, sA7, sA7 + wA7, false).replace(\"M\", \"L\");\r\n                        lxy7 = arc7.substr(arc7.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX7 = parseInt(lxy7[0]) - rX8 * Math.cos(sA8 * Math.PI / 180);\r\n                        cY7 = parseInt(lxy7[1]) - rY8 * Math.sin(sA8 * Math.PI / 180);\r\n                        arc8 = shapeArc(cX7, cY7, rX8, rY8, sA8, sA8 + wA8, false).replace(\"M\", \"L\");\r\n                        lxy8 = arc8.substr(arc8.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX8 = parseInt(lxy8[0]) - rX9 * Math.cos(sA9 * Math.PI / 180);\r\n                        cY8 = parseInt(lxy8[1]) - rY9 * Math.sin(sA9 * Math.PI / 180);\r\n                        arc9 = shapeArc(cX8, cY8, rX9, rY9, sA9, sA9 + wA9, false).replace(\"M\", \"L\");\r\n                        lxy9 = arc9.substr(arc9.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX9 = parseInt(lxy9[0]) - rX10 * Math.cos(sA10 * Math.PI / 180);\r\n                        cY9 = parseInt(lxy9[1]) - rY10 * Math.sin(sA10 * Math.PI / 180);\r\n                        arc10 = shapeArc(cX9, cY9, rX10, rY10, sA10, sA10 + wA10, false).replace(\"M\", \"L\");\r\n                        lxy10 = arc10.substr(arc10.lastIndexOf(\"L\") + 1).split(\" \");\r\n                        cX10 = parseInt(lxy10[0]) - rX11 * Math.cos(sA11 * Math.PI / 180);\r\n                        cY10 = parseInt(lxy10[1]) - rY3 * Math.sin(sA11 * Math.PI / 180);\r\n                        arc11 = shapeArc(cX10, cY10, rX11, rY3, sA11, sA11 + wA11, false).replace(\"M\", \"L\");\r\n\r\n                        var d1 = \"M\" + x0 + \",\" + y0 +\r\n                            arc1 +\r\n                            arc2 +\r\n                            arc3 +\r\n                            arc4 +\r\n                            arc5 +\r\n                            arc6 +\r\n                            arc7 +\r\n                            arc8 +\r\n                            arc9 +\r\n                            arc10 +\r\n                            arc11 +\r\n                            \" z\";\r\n                        if (shapType == \"cloudCallout\") {\r\n                            var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                            var refr = 96 / 914400;\r\n                            var sAdj1, adj1 = -20833 * refr;\r\n                            var sAdj2, adj2 = 62500 * refr;\r\n                            if (shapAdjst_ary !== undefined) {\r\n                                for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                    var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                    if (sAdj_name == \"adj1\") {\r\n                                        sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                        adj1 = parseInt(sAdj1.substr(4)) * refr;\r\n                                    } else if (sAdj_name == \"adj2\") {\r\n                                        sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                        adj2 = parseInt(sAdj2.substr(4)) * refr;\r\n                                    }\r\n                                }\r\n                            }\r\n                            var d_val;\r\n                            var cnstVal2 = 100000 * refr;\r\n                            var ss = Math.min(w, h);\r\n                            var wd2 = w / 2, hd2 = h / 2;\r\n\r\n                            var dxPos, dyPos, xPos, yPos, ht, wt, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13, g14, g15, g16,\r\n                                g17, g18, g19, g20, g21, g22, g23, g24, g25, g26, x23, x24, x25;\r\n\r\n                            dxPos = w * adj1 / cnstVal2;\r\n                            dyPos = h * adj2 / cnstVal2;\r\n                            xPos = wd2 + dxPos;\r\n                            yPos = hd2 + dyPos;\r\n                            ht = hd2 * Math.cos(Math.atan(dyPos / dxPos));\r\n                            wt = wd2 * Math.sin(Math.atan(dyPos / dxPos));\r\n                            g2 = wd2 * Math.cos(Math.atan(wt / ht));\r\n                            g3 = hd2 * Math.sin(Math.atan(wt / ht));\r\n                            //console.log(\"adj1: \",adj1,\"adj2: \",adj2)\r\n                            if (adj1 >= 0) {\r\n                                g4 = wd2 + g2;\r\n                                g5 = hd2 + g3;\r\n                            } else {\r\n                                g4 = wd2 - g2;\r\n                                g5 = hd2 - g3;\r\n                            }\r\n                            g6 = g4 - xPos;\r\n                            g7 = g5 - yPos;\r\n                            g8 = Math.sqrt(g6 * g6 + g7 * g7);\r\n                            g9 = ss * 6600 / 21600;\r\n                            g10 = g8 - g9;\r\n                            g11 = g10 / 3;\r\n                            g12 = ss * 1800 / 21600;\r\n                            g13 = g11 + g12;\r\n                            g14 = g13 * g6 / g8;\r\n                            g15 = g13 * g7 / g8;\r\n                            g16 = g14 + xPos;\r\n                            g17 = g15 + yPos;\r\n                            g18 = ss * 4800 / 21600;\r\n                            g19 = g11 * 2;\r\n                            g20 = g18 + g19;\r\n                            g21 = g20 * g6 / g8;\r\n                            g22 = g20 * g7 / g8;\r\n                            g23 = g21 + xPos;\r\n                            g24 = g22 + yPos;\r\n                            g25 = ss * 1200 / 21600;\r\n                            g26 = ss * 600 / 21600;\r\n                            x23 = xPos + g26;\r\n                            x24 = g16 + g25;\r\n                            x25 = g23 + g12;\r\n\r\n                            d_val = //\" M\" + x23 + \",\" + yPos + \r\n                                shapeArc(x23 - g26, yPos, g26, g26, 0, 360, false) + //.replace(\"M\",\"L\") +\r\n                                \" z\" +\r\n                                \" M\" + x24 + \",\" + g17 +\r\n                                shapeArc(x24 - g25, g17, g25, g25, 0, 360, false).replace(\"M\", \"L\") +\r\n                                \" z\" +\r\n                                \" M\" + x25 + \",\" + g24 +\r\n                                shapeArc(x25 - g12, g24, g12, g12, 0, 360, false).replace(\"M\", \"L\") +\r\n                                \" z\";\r\n                            d1 += d_val;\r\n                        }\r\n                        result += \"<path d='\" + d1 + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"smileyFace\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var refr = 96 / 914400;\r\n                        var adj = 4653 * refr;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * refr;\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 50000 * refr;\r\n                        var cnstVal2 = 100000 * refr;\r\n                        var cnstVal3 = 4653 * refr;\r\n                        var ss = Math.min(w, h);\r\n                        var a, x1, x2, x3, x4, y1, y3, dy2, y2, y4, dy3, y5, wR, hR, wd2, hd2;\r\n                        wd2 = w / 2;\r\n                        hd2 = h / 2;\r\n                        a = (adj < -cnstVal3) ? -cnstVal3 : (adj > cnstVal3) ? cnstVal3 : adj;\r\n                        x1 = w * 4969 / 21699;\r\n                        x2 = w * 6215 / 21600;\r\n                        x3 = w * 13135 / 21600;\r\n                        x4 = w * 16640 / 21600;\r\n                        y1 = h * 7570 / 21600;\r\n                        y3 = h * 16515 / 21600;\r\n                        dy2 = h * a / cnstVal2;\r\n                        y2 = y3 - dy2;\r\n                        y4 = y3 + dy2;\r\n                        dy3 = h * a / cnstVal1;\r\n                        y5 = y4 + dy3;\r\n                        wR = w * 1125 / 21600;\r\n                        hR = h * 1125 / 21600;\r\n                        var cX1 = x2 - wR * Math.cos(Math.PI);\r\n                        var cY1 = y1 - hR * Math.sin(Math.PI);\r\n                        var cX2 = x3 - wR * Math.cos(Math.PI);\r\n                        d_val = //eyes\r\n                            shapeArc(cX1, cY1, wR, hR, 180, 540, false) +\r\n                            shapeArc(cX2, cY1, wR, hR, 180, 540, false) +\r\n                            //mouth\r\n                            \" M\" + x1 + \",\" + y2 +\r\n                            \" Q\" + wd2 + \",\" + y5 + \" \" + x4 + \",\" + y2 +\r\n                            \" Q\" + wd2 + \",\" + y5 + \" \" + x1 + \",\" + y2 +\r\n                            //head\r\n                            \" M\" + 0 + \",\" + hd2 +\r\n                            shapeArc(wd2, hd2, wd2, hd2, 180, 540, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"verticalScroll\":\r\n                    case \"horizontalScroll\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var refr = 96 / 914400;\r\n                        var adj = 12500 * refr;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * refr;\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 25000 * refr;\r\n                        var cnstVal2 = 100000 * refr;\r\n                        var ss = Math.min(w, h);\r\n                        var t = 0, l = 0, b = h, r = w;\r\n                        var a, ch, ch2, ch4;\r\n                        a = (adj < 0) ? 0 : (adj > cnstVal1) ? cnstVal1 : adj;\r\n                        ch = ss * a / cnstVal2;\r\n                        ch2 = ch / 2;\r\n                        ch4 = ch / 4;\r\n                        if (shapType == \"verticalScroll\") {\r\n                            var x3, x4, x6, x7, x5, y3, y4;\r\n                            x3 = ch + ch2;\r\n                            x4 = ch + ch;\r\n                            x6 = r - ch;\r\n                            x7 = r - ch2;\r\n                            x5 = x6 - ch2;\r\n                            y3 = b - ch;\r\n                            y4 = b - ch2;\r\n\r\n                            d_val = \"M\" + ch + \",\" + y3 +\r\n                                \" L\" + ch + \",\" + ch2 +\r\n                                shapeArc(x3, ch2, ch2, ch2, 180, 270, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x7 + \",\" + t +\r\n                                shapeArc(x7, ch2, ch2, ch2, 270, 450, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x6 + \",\" + ch +\r\n                                \" L\" + x6 + \",\" + y4 +\r\n                                shapeArc(x5, y4, ch2, ch2, 0, 90, false).replace(\"M\", \"L\") +\r\n                                \" L\" + ch2 + \",\" + b +\r\n                                shapeArc(ch2, y4, ch2, ch2, 90, 270, false).replace(\"M\", \"L\") +\r\n                                \" z\" +\r\n                                \" M\" + x3 + \",\" + t +\r\n                                shapeArc(x3, ch2, ch2, ch2, 270, 450, false).replace(\"M\", \"L\") +\r\n                                shapeArc(x3, x3 / 2, ch4, ch4, 90, 270, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x4 + \",\" + ch2 +\r\n                                \" M\" + x6 + \",\" + ch +\r\n                                \" L\" + x3 + \",\" + ch +\r\n                                \" M\" + ch + \",\" + y4 +\r\n                                shapeArc(ch2, y4, ch2, ch2, 0, 270, false).replace(\"M\", \"L\") +\r\n                                shapeArc(ch2, (y4 + y3) / 2, ch4, ch4, 270, 450, false).replace(\"M\", \"L\") +\r\n                                \" z\" +\r\n                                \" M\" + ch + \",\" + y4 +\r\n                                \" L\" + ch + \",\" + y3;\r\n                        } else if (shapType == \"horizontalScroll\") {\r\n                            var y3, y4, y6, y7, y5, x3, x4;\r\n                            y3 = ch + ch2;\r\n                            y4 = ch + ch;\r\n                            y6 = b - ch;\r\n                            y7 = b - ch2;\r\n                            y5 = y6 - ch2;\r\n                            x3 = r - ch;\r\n                            x4 = r - ch2;\r\n\r\n                            d_val = \"M\" + l + \",\" + y3 +\r\n                                shapeArc(ch2, y3, ch2, ch2, 180, 270, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x3 + \",\" + ch +\r\n                                \" L\" + x3 + \",\" + ch2 +\r\n                                shapeArc(x4, ch2, ch2, ch2, 180, 360, false).replace(\"M\", \"L\") +\r\n                                \" L\" + r + \",\" + y5 +\r\n                                shapeArc(x4, y5, ch2, ch2, 0, 90, false).replace(\"M\", \"L\") +\r\n                                \" L\" + ch + \",\" + y6 +\r\n                                \" L\" + ch + \",\" + y7 +\r\n                                shapeArc(ch2, y7, ch2, ch2, 0, 180, false).replace(\"M\", \"L\") +\r\n                                \" z\" +\r\n                                \"M\" + x4 + \",\" + ch +\r\n                                shapeArc(x4, ch2, ch2, ch2, 90, -180, false).replace(\"M\", \"L\") +\r\n                                shapeArc((x3 + x4) / 2, ch2, ch4, ch4, 180, 0, false).replace(\"M\", \"L\") +\r\n                                \" z\" +\r\n                                \" M\" + x4 + \",\" + ch +\r\n                                \" L\" + x3 + \",\" + ch +\r\n                                \" M\" + ch2 + \",\" + y4 +\r\n                                \" L\" + ch2 + \",\" + y3 +\r\n                                shapeArc(y3 / 2, y3, ch4, ch4, 180, 360, false).replace(\"M\", \"L\") +\r\n                                shapeArc(ch2, y3, ch2, ch2, 0, 180, false).replace(\"M\", \"L\") +\r\n                                \" M\" + ch + \",\" + y3 +\r\n                                \" L\" + ch + \",\" + y6;\r\n                        }\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"wedgeEllipseCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var refr = 96 / 914400;\r\n                        var sAdj1, adj1 = -20833 * refr;\r\n                        var sAdj2, adj2 = 62500 * refr;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * refr;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 100000 * 96 / 914400;\r\n                        var angVal1 = 11 * Math.PI / 180;\r\n                        var ss = Math.min(w, h);\r\n                        var dxPos, dyPos, xPos, yPos, sdx, sdy, pang, stAng, enAng, dx1, dy1, x1, y1, dx2, dy2,\r\n                            x2, y2, stAng1, enAng1, swAng1, swAng2, swAng,\r\n                            vc = h / 2, hc = w / 2;\r\n                        dxPos = w * adj1 / cnstVal1;\r\n                        dyPos = h * adj2 / cnstVal1;\r\n                        xPos = hc + dxPos;\r\n                        yPos = vc + dyPos;\r\n                        sdx = dxPos * h;\r\n                        sdy = dyPos * w;\r\n                        pang = Math.atan(sdy / sdx);\r\n                        stAng = pang + angVal1;\r\n                        enAng = pang - angVal1;\r\n                        console.log(\"dxPos: \", dxPos, \"dyPos: \", dyPos)\r\n                        dx1 = hc * Math.cos(stAng);\r\n                        dy1 = vc * Math.sin(stAng);\r\n                        dx2 = hc * Math.cos(enAng);\r\n                        dy2 = vc * Math.sin(enAng);\r\n                        if (dxPos >= 0) {\r\n                            x1 = hc + dx1;\r\n                            y1 = vc + dy1;\r\n                            x2 = hc + dx2;\r\n                            y2 = vc + dy2;\r\n                        } else {\r\n                            x1 = hc - dx1;\r\n                            y1 = vc - dy1;\r\n                            x2 = hc - dx2;\r\n                            y2 = vc - dy2;\r\n                        }\r\n                        /*\r\n                        //stAng = pang+angVal1;\r\n                        //enAng = pang-angVal1;\r\n                        //dx1 = hc*Math.cos(stAng);\r\n                        //dy1 = vc*Math.sin(stAng);\r\n                        x1 = hc+dx1;\r\n                        y1 = vc+dy1;\r\n                        dx2 = hc*Math.cos(enAng);\r\n                        dy2 = vc*Math.sin(enAng);\r\n                        x2 = hc+dx2;\r\n                        y2 = vc+dy2;\r\n                        stAng1 = Math.atan(dy1/dx1);\r\n                        enAng1 = Math.atan(dy2/dx2);\r\n                        swAng1 = enAng1-stAng1;\r\n                        swAng2 = swAng1+2*Math.PI;\r\n                        swAng = (swAng1 > 0)?swAng1:swAng2;\r\n                        var stAng1Dg = stAng1*180/Math.PI;\r\n                        var swAngDg = swAng*180/Math.PI;\r\n                        var endAng = stAng1Dg + swAngDg;\r\n                        */\r\n                        d_val = \"M\" + x1 + \",\" + y1 +\r\n                            \" L\" + xPos + \",\" + yPos +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            //\" z\" +\r\n                            shapeArc(hc, vc, hc, vc, 0, 360, true);// +\r\n                        //shapeArc(hc,vc,hc,vc,stAng1Dg,stAng1Dg+swAngDg,false).replace(\"M\",\"L\") +\r\n                        //\" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"wedgeRectCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var refr = 96 / 914400;\r\n                        var sAdj1, adj1 = -20833 * refr;\r\n                        var sAdj2, adj2 = 62500 * refr;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * refr;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 100000 * 96 / 914400;\r\n                        var dxPos, dyPos, xPos, yPos, dx, dy, dq, ady, adq, dz, xg1, xg2, x1, x2,\r\n                            yg1, yg2, y1, y2, t1, xl, t2, xt, t3, xr, t4, xb, t5, yl, t6, yt, t7, yr, t8, yb,\r\n                            vc = h / 2, hc = w / 2;\r\n                        dxPos = w * adj1 / cnstVal1;\r\n                        dyPos = h * adj2 / cnstVal1;\r\n                        xPos = hc + dxPos;\r\n                        yPos = vc + dyPos;\r\n                        dx = xPos - hc;\r\n                        dy = yPos - vc;\r\n                        dq = dxPos * h / w;\r\n                        ady = Math.abs(dyPos);\r\n                        adq = Math.abs(dq);\r\n                        dz = ady - adq;\r\n                        xg1 = (dxPos > 0) ? 7 : 2;\r\n                        xg2 = (dxPos > 0) ? 10 : 5;\r\n                        x1 = w * xg1 / 12;\r\n                        x2 = w * xg2 / 12;\r\n                        yg1 = (dyPos > 0) ? 7 : 2;\r\n                        yg2 = (dyPos > 0) ? 10 : 5;\r\n                        y1 = h * yg1 / 12;\r\n                        y2 = h * yg2 / 12;\r\n                        t1 = (dxPos > 0) ? 0 : xPos;\r\n                        xl = (dz > 0) ? 0 : t1;\r\n                        t2 = (dyPos > 0) ? x1 : xPos;\r\n                        xt = (dz > 0) ? t2 : x1;\r\n                        t3 = (dxPos > 0) ? xPos : w;\r\n                        xr = (dz > 0) ? w : t3;\r\n                        t4 = (dyPos > 0) ? xPos : x1;\r\n                        xb = (dz > 0) ? t4 : x1;\r\n                        t5 = (dxPos > 0) ? y1 : yPos;\r\n                        yl = (dz > 0) ? y1 : t5;\r\n                        t6 = (dyPos > 0) ? 0 : yPos;\r\n                        yt = (dz > 0) ? t6 : 0;\r\n                        t7 = (dxPos > 0) ? yPos : y1;\r\n                        yr = (dz > 0) ? y1 : t7;\r\n                        t8 = (dyPos > 0) ? yPos : h;\r\n                        yb = (dz > 0) ? t8 : h;\r\n\r\n                        d_val = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + x1 + \",\" + 0 +\r\n                            \" L\" + xt + \",\" + yt +\r\n                            \" L\" + x2 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + 0 +\r\n                            \" L\" + w + \",\" + y1 +\r\n                            \" L\" + xr + \",\" + yr +\r\n                            \" L\" + w + \",\" + y2 +\r\n                            \" L\" + w + \",\" + h +\r\n                            \" L\" + x2 + \",\" + h +\r\n                            \" L\" + xb + \",\" + yb +\r\n                            \" L\" + x1 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + y2 +\r\n                            \" L\" + xl + \",\" + yl +\r\n                            \" L\" + 0 + \",\" + y1 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"wedgeRoundRectCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var refr = 96 / 914400;\r\n                        var sAdj1, adj1 = -20833 * refr;\r\n                        var sAdj2, adj2 = 62500 * refr;\r\n                        var sAdj3, adj3 = 16667 * refr;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * refr;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 100000 * 96 / 914400;\r\n                        var ss = Math.min(w, h);\r\n                        var dxPos, dyPos, xPos, yPos, dq, ady, adq, dz, xg1, xg2, x1, x2, yg1, yg2, y1, y2,\r\n                            t1, xl, t2, xt, t3, xr, t4, xb, t5, yl, t6, yt, t7, yr, t8, yb, u1, u2, v2,\r\n                            vc = h / 2, hc = w / 2;\r\n                        dxPos = w * adj1 / cnstVal1;\r\n                        dyPos = h * adj2 / cnstVal1;\r\n                        xPos = hc + dxPos;\r\n                        yPos = vc + dyPos;\r\n                        dq = dxPos * h / w;\r\n                        ady = Math.abs(dyPos);\r\n                        adq = Math.abs(dq);\r\n                        dz = ady - adq;\r\n                        xg1 = (dxPos > 0) ? 7 : 2;\r\n                        xg2 = (dxPos > 0) ? 10 : 5;\r\n                        x1 = w * xg1 / 12;\r\n                        x2 = w * xg2 / 12;\r\n                        yg1 = (dyPos > 0) ? 7 : 2;\r\n                        yg2 = (dyPos > 0) ? 10 : 5;\r\n                        y1 = h * yg1 / 12;\r\n                        y2 = h * yg2 / 12;\r\n                        t1 = (dxPos > 0) ? 0 : xPos;\r\n                        xl = (dz > 0) ? 0 : t1;\r\n                        t2 = (dyPos > 0) ? x1 : xPos;\r\n                        xt = (dz > 0) ? t2 : x1;\r\n                        t3 = (dxPos > 0) ? xPos : w;\r\n                        xr = (dz > 0) ? w : t3;\r\n                        t4 = (dyPos > 0) ? xPos : x1;\r\n                        xb = (dz > 0) ? t4 : x1;\r\n                        t5 = (dxPos > 0) ? y1 : yPos;\r\n                        yl = (dz > 0) ? y1 : t5;\r\n                        t6 = (dyPos > 0) ? 0 : yPos;\r\n                        yt = (dz > 0) ? t6 : 0;\r\n                        t7 = (dxPos > 0) ? yPos : y1;\r\n                        yr = (dz > 0) ? y1 : t7;\r\n                        t8 = (dyPos > 0) ? yPos : h;\r\n                        yb = (dz > 0) ? t8 : h;\r\n                        u1 = ss * adj3 / cnstVal1;\r\n                        u2 = w - u1;\r\n                        v2 = h - u1;\r\n                        d_val = \"M\" + 0 + \",\" + u1 +\r\n                            shapeArc(u1, u1, u1, u1, 180, 270, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + 0 +\r\n                            \" L\" + xt + \",\" + yt +\r\n                            \" L\" + x2 + \",\" + 0 +\r\n                            \" L\" + u2 + \",\" + 0 +\r\n                            shapeArc(u2, u1, u1, u1, 270, 360, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w + \",\" + y1 +\r\n                            \" L\" + xr + \",\" + yr +\r\n                            \" L\" + w + \",\" + y2 +\r\n                            \" L\" + w + \",\" + v2 +\r\n                            shapeArc(u2, v2, u1, u1, 0, 90, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x2 + \",\" + h +\r\n                            \" L\" + xb + \",\" + yb +\r\n                            \" L\" + x1 + \",\" + h +\r\n                            \" L\" + u1 + \",\" + h +\r\n                            shapeArc(u1, v2, u1, u1, 90, 180, false).replace(\"M\", \"L\") +\r\n                            \" L\" + 0 + \",\" + y2 +\r\n                            \" L\" + xl + \",\" + yl +\r\n                            \" L\" + 0 + \",\" + y1 +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"accentBorderCallout1\":\r\n                    case \"accentBorderCallout2\":\r\n                    case \"accentBorderCallout3\":\r\n                    case \"borderCallout1\":\r\n                    case \"borderCallout2\":\r\n                    case \"borderCallout3\":\r\n                    case \"accentCallout1\":\r\n                    case \"accentCallout2\":\r\n                    case \"accentCallout3\":\r\n                    case \"callout1\":\r\n                    case \"callout2\":\r\n                    case \"callout3\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var refr = 96 / 914400;\r\n                        var sAdj1, adj1 = 18750 * refr;\r\n                        var sAdj2, adj2 = -8333 * refr;\r\n                        var sAdj3, adj3 = 18750 * refr;\r\n                        var sAdj4, adj4 = -16667 * refr;\r\n                        var sAdj5, adj5 = 100000 * refr;\r\n                        var sAdj6, adj6 = -16667 * refr;\r\n                        var sAdj7, adj7 = 112963 * refr;\r\n                        var sAdj8, adj8 = -8333 * refr;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj5\") {\r\n                                    sAdj5 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj5 = parseInt(sAdj5.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj6\") {\r\n                                    sAdj6 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj6 = parseInt(sAdj6.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj7\") {\r\n                                    sAdj7 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj7 = parseInt(sAdj7.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj8\") {\r\n                                    sAdj8 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj8 = parseInt(sAdj8.substr(4)) * refr;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 100000 * refr;\r\n                        var isBorder = true;\r\n                        switch (shapType) {\r\n                            case \"borderCallout1\":\r\n                            case \"callout1\":\r\n                                if (shapType == \"borderCallout1\") {\r\n                                    isBorder = true;\r\n                                } else {\r\n                                    isBorder = false;\r\n                                }\r\n                                if (shapAdjst_ary === undefined) {\r\n                                    adj1 = 18750 * refr;\r\n                                    adj2 = -8333 * refr;\r\n                                    adj3 = 112500 * refr;\r\n                                    adj4 = -38333 * refr;\r\n                                }\r\n                                var y1, x1, y2, x2;\r\n                                y1 = h * adj1 / cnstVal1;\r\n                                x1 = w * adj2 / cnstVal1;\r\n                                y2 = h * adj3 / cnstVal1;\r\n                                x2 = w * adj4 / cnstVal1;\r\n                                d_val = \"M\" + 0 + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + h +\r\n                                    \" L\" + 0 + \",\" + h +\r\n                                    \" z\" +\r\n                                    \" M\" + x1 + \",\" + y1 +\r\n                                    \" L\" + x2 + \",\" + y2;\r\n                                break;\r\n                            case \"borderCallout2\":\r\n                            case \"callout2\":\r\n                                if (shapType == \"borderCallout2\") {\r\n                                    isBorder = true;\r\n                                } else {\r\n                                    isBorder = false;\r\n                                }\r\n                                if (shapAdjst_ary === undefined) {\r\n                                    adj1 = 18750 * refr;\r\n                                    adj2 = -8333 * refr;\r\n                                    adj3 = 18750 * refr;\r\n                                    adj4 = -16667 * refr;\r\n\r\n                                    adj5 = 112500 * refr;\r\n                                    adj6 = -46667 * refr;\r\n                                }\r\n                                var y1, x1, y2, x2, y3, x3;\r\n\r\n                                y1 = h * adj1 / cnstVal1;\r\n                                x1 = w * adj2 / cnstVal1;\r\n                                y2 = h * adj3 / cnstVal1;\r\n                                x2 = w * adj4 / cnstVal1;\r\n\r\n                                y3 = h * adj5 / cnstVal1;\r\n                                x3 = w * adj6 / cnstVal1;\r\n                                d_val = \"M\" + 0 + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + h +\r\n                                    \" L\" + 0 + \",\" + h +\r\n                                    \" z\" +\r\n\r\n                                    \" M\" + x1 + \",\" + y1 +\r\n                                    \" L\" + x2 + \",\" + y2 +\r\n\r\n                                    \" L\" + x3 + \",\" + y3 +\r\n                                    \" L\" + x2 + \",\" + y2;\r\n\r\n                                break;\r\n                            case \"borderCallout3\":\r\n                            case \"callout3\":\r\n                                if (shapType == \"borderCallout3\") {\r\n                                    isBorder = true;\r\n                                } else {\r\n                                    isBorder = false;\r\n                                }\r\n                                if (shapAdjst_ary === undefined) {\r\n                                    adj1 = 18750 * refr;\r\n                                    adj2 = -8333 * refr;\r\n                                    adj3 = 18750 * refr;\r\n                                    adj4 = -16667 * refr;\r\n\r\n                                    adj5 = 100000 * refr;\r\n                                    adj6 = -16667 * refr;\r\n\r\n                                    adj7 = 112963 * refr;\r\n                                    adj8 = -8333 * refr;\r\n                                }\r\n                                var y1, x1, y2, x2, y3, x3, y4, x4;\r\n\r\n                                y1 = h * adj1 / cnstVal1;\r\n                                x1 = w * adj2 / cnstVal1;\r\n                                y2 = h * adj3 / cnstVal1;\r\n                                x2 = w * adj4 / cnstVal1;\r\n\r\n                                y3 = h * adj5 / cnstVal1;\r\n                                x3 = w * adj6 / cnstVal1;\r\n\r\n                                y4 = h * adj7 / cnstVal1;\r\n                                x4 = w * adj8 / cnstVal1;\r\n                                d_val = \"M\" + 0 + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + h +\r\n                                    \" L\" + 0 + \",\" + h +\r\n                                    \" z\" +\r\n\r\n                                    \" M\" + x1 + \",\" + y1 +\r\n                                    \" L\" + x2 + \",\" + y2 +\r\n\r\n                                    \" L\" + x3 + \",\" + y3 +\r\n\r\n                                    \" L\" + x4 + \",\" + y4 +\r\n                                    \" L\" + x3 + \",\" + y3 +\r\n                                    \" L\" + x2 + \",\" + y2;\r\n                                break;\r\n                            case \"accentBorderCallout1\":\r\n                            case \"accentCallout1\":\r\n                                if (shapType == \"accentBorderCallout1\") {\r\n                                    isBorder = true;\r\n                                } else {\r\n                                    isBorder = false;\r\n                                }\r\n\r\n                                if (shapAdjst_ary === undefined) {\r\n                                    adj1 = 18750 * refr;\r\n                                    adj2 = -8333 * refr;\r\n                                    adj3 = 112500 * refr;\r\n                                    adj4 = -38333 * refr;\r\n                                }\r\n                                var y1, x1, y2, x2;\r\n                                y1 = h * adj1 / cnstVal1;\r\n                                x1 = w * adj2 / cnstVal1;\r\n                                y2 = h * adj3 / cnstVal1;\r\n                                x2 = w * adj4 / cnstVal1;\r\n                                d_val = \"M\" + 0 + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + h +\r\n                                    \" L\" + 0 + \",\" + h +\r\n                                    \" z\" +\r\n\r\n                                    \" M\" + x1 + \",\" + y1 +\r\n                                    \" L\" + x2 + \",\" + y2 +\r\n\r\n                                    \" M\" + x1 + \",\" + 0 +\r\n                                    \" L\" + x1 + \",\" + h;\r\n                                break;\r\n                            case \"accentBorderCallout2\":\r\n                            case \"accentCallout2\":\r\n                                if (shapType == \"accentBorderCallout2\") {\r\n                                    isBorder = true;\r\n                                } else {\r\n                                    isBorder = false;\r\n                                }\r\n                                if (shapAdjst_ary === undefined) {\r\n                                    adj1 = 18750 * refr;\r\n                                    adj2 = -8333 * refr;\r\n                                    adj3 = 18750 * refr;\r\n                                    adj4 = -16667 * refr;\r\n                                    adj5 = 112500 * refr;\r\n                                    adj6 = -46667 * refr;\r\n                                }\r\n                                var y1, x1, y2, x2, y3, x3;\r\n\r\n                                y1 = h * adj1 / cnstVal1;\r\n                                x1 = w * adj2 / cnstVal1;\r\n                                y2 = h * adj3 / cnstVal1;\r\n                                x2 = w * adj4 / cnstVal1;\r\n                                y3 = h * adj5 / cnstVal1;\r\n                                x3 = w * adj6 / cnstVal1;\r\n                                d_val = \"M\" + 0 + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + h +\r\n                                    \" L\" + 0 + \",\" + h +\r\n                                    \" z\" +\r\n\r\n                                    \" M\" + x1 + \",\" + y1 +\r\n                                    \" L\" + x2 + \",\" + y2 +\r\n                                    \" L\" + x3 + \",\" + y3 +\r\n                                    \" L\" + x2 + \",\" + y2 +\r\n\r\n                                    \" M\" + x1 + \",\" + 0 +\r\n                                    \" L\" + x1 + \",\" + h;\r\n\r\n                                break;\r\n                            case \"accentBorderCallout3\":\r\n                            case \"accentCallout3\":\r\n                                if (shapType == \"accentBorderCallout3\") {\r\n                                    isBorder = true;\r\n                                } else {\r\n                                    isBorder = false;\r\n                                }\r\n                                isBorder = true;\r\n                                if (shapAdjst_ary === undefined) {\r\n                                    adj1 = 18750 * refr;\r\n                                    adj2 = -8333 * refr;\r\n                                    adj3 = 18750 * refr;\r\n                                    adj4 = -16667 * refr;\r\n                                    adj5 = 100000 * refr;\r\n                                    adj6 = -16667 * refr;\r\n                                    adj7 = 112963 * refr;\r\n                                    adj8 = -8333 * refr;\r\n                                }\r\n                                var y1, x1, y2, x2, y3, x3, y4, x4;\r\n\r\n                                y1 = h * adj1 / cnstVal1;\r\n                                x1 = w * adj2 / cnstVal1;\r\n                                y2 = h * adj3 / cnstVal1;\r\n                                x2 = w * adj4 / cnstVal1;\r\n                                y3 = h * adj5 / cnstVal1;\r\n                                x3 = w * adj6 / cnstVal1;\r\n                                y4 = h * adj7 / cnstVal1;\r\n                                x4 = w * adj8 / cnstVal1;\r\n                                d_val = \"M\" + 0 + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + 0 +\r\n                                    \" L\" + w + \",\" + h +\r\n                                    \" L\" + 0 + \",\" + h +\r\n                                    \" z\" +\r\n\r\n                                    \" M\" + x1 + \",\" + y1 +\r\n                                    \" L\" + x2 + \",\" + y2 +\r\n                                    \" L\" + x3 + \",\" + y3 +\r\n                                    \" L\" + x4 + \",\" + y4 +\r\n                                    \" L\" + x3 + \",\" + y3 +\r\n                                    \" L\" + x2 + \",\" + y2 +\r\n\r\n                                    \" M\" + x1 + \",\" + 0 +\r\n                                    \" L\" + x1 + \",\" + h;\r\n                                break;\r\n                        }\r\n\r\n                        console.log(\"shapType: \", shapType, \",isBorder:\", isBorder)\r\n                        //if(isBorder){\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        //}else{\r\n                        //    result += \"<path d='\"+d_val+\"' fill='\" + (!imgFillFlg?(grndFillFlg?\"url(#linGrd_\"+shpId+\")\":fillColor):\"url(#imgPtrn_\"+shpId+\")\") + \r\n                        //        \"' stroke='none' />\";\r\n\r\n                        //}\r\n                        break;\r\n                    case \"leftRightRibbon\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var refr = 96 / 914400;\r\n                        var sAdj1, adj1 = 50000 * refr;\r\n                        var sAdj2, adj2 = 50000 * refr;\r\n                        var sAdj3, adj3 = 16667 * refr;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * refr;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 33333 * refr;\r\n                        var cnstVal2 = 100000 * refr;\r\n                        var cnstVal3 = 200000 * refr;\r\n                        var cnstVal4 = 400000 * refr;\r\n                        var ss = Math.min(w, h);\r\n                        var a3, maxAdj1, a1, w1, maxAdj2, a2, x1, x4, dy1, dy2, ly1, ry4, ly2, ry3, ly4, ry1,\r\n                            ly3, ry2, hR, x2, x3, y1, y2, wd32 = w / 32, vc = h / 2, hc = w / 2;\r\n\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > cnstVal1) ? cnstVal1 : adj3;\r\n                        maxAdj1 = cnstVal2 - a3;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        w1 = hc - wd32;\r\n                        maxAdj2 = cnstVal2 * w1 / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        x1 = ss * a2 / cnstVal2;\r\n                        x4 = w - x1;\r\n                        dy1 = h * a1 / cnstVal3;\r\n                        dy2 = h * a3 / -cnstVal3;\r\n                        ly1 = vc + dy2 - dy1;\r\n                        ry4 = vc + dy1 - dy2;\r\n                        ly2 = ly1 + dy1;\r\n                        ry3 = h - ly2;\r\n                        ly4 = ly2 * 2;\r\n                        ry1 = h - ly4;\r\n                        ly3 = ly4 - ly1;\r\n                        ry2 = h - ly3;\r\n                        hR = a3 * ss / cnstVal4;\r\n                        x2 = hc - wd32;\r\n                        x3 = hc + wd32;\r\n                        y1 = ly1 + hR;\r\n                        y2 = ry2 - hR;\r\n\r\n                        d_val = \"M\" + 0 + \",\" + ly2 +\r\n                            \"L\" + x1 + \",\" + 0 +\r\n                            \"L\" + x1 + \",\" + ly1 +\r\n                            \"L\" + hc + \",\" + ly1 +\r\n                            shapeArc(hc, y1, wd32, hR, 270, 450, false).replace(\"M\", \"L\") +\r\n                            shapeArc(hc, y2, wd32, hR, 270, 90, false).replace(\"M\", \"L\") +\r\n                            \"L\" + x4 + \",\" + ry2 +\r\n                            \"L\" + x4 + \",\" + ry1 +\r\n                            \"L\" + w + \",\" + ry3 +\r\n                            \"L\" + x4 + \",\" + h +\r\n                            \"L\" + x4 + \",\" + ry4 +\r\n                            \"L\" + hc + \",\" + ry4 +\r\n                            shapeArc(hc, ry4 - hR, wd32, hR, 90, 180, false).replace(\"M\", \"L\") +\r\n                            \"L\" + x2 + \",\" + ly3 +\r\n                            \"L\" + x1 + \",\" + ly3 +\r\n                            \"L\" + x1 + \",\" + ly4 +\r\n                            \" z\" +\r\n                            \"M\" + x3 + \",\" + y1 +\r\n                            \"L\" + x3 + \",\" + ry2 +\r\n                            \"M\" + x2 + \",\" + y2 +\r\n                            \"L\" + x2 + \",\" + ly3;\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"ribbon\":\r\n                    case \"ribbon2\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 16667 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 25000 * 96 / 914400;\r\n                        var cnstVal2 = 33333 * 96 / 914400;\r\n                        var cnstVal3 = 75000 * 96 / 914400;\r\n                        var cnstVal4 = 100000 * 96 / 914400;\r\n                        var cnstVal5 = 200000 * 96 / 914400;\r\n                        var cnstVal6 = 400000 * 96 / 914400;\r\n                        var hc = w / 2, t = 0, l = 0, b = h, r = w, wd8 = w / 8, wd32 = w / 32;\r\n                        var a1, a2, x10, dx2, x2, x9, x3, x8, x5, x6, x4, x7, y1, y2, y4, y3, hR, y6;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal2) ? cnstVal2 : adj1;\r\n                        a2 = (adj2 < cnstVal1) ? cnstVal1 : (adj2 > cnstVal3) ? cnstVal3 : adj2;\r\n                        x10 = r - wd8;\r\n                        dx2 = w * a2 / cnstVal5;\r\n                        x2 = hc - dx2;\r\n                        x9 = hc + dx2;\r\n                        x3 = x2 + wd32;\r\n                        x8 = x9 - wd32;\r\n                        x5 = x2 + wd8;\r\n                        x6 = x9 - wd8;\r\n                        x4 = x5 - wd32;\r\n                        x7 = x6 + wd32;\r\n                        hR = h * a1 / cnstVal6;\r\n                        if (shapType == \"ribbon2\") {\r\n                            var dy1, dy2, y7;\r\n                            dy1 = h * a1 / cnstVal5;\r\n                            y1 = b - dy1;\r\n                            dy2 = h * a1 / cnstVal4;\r\n                            y2 = b - dy2;\r\n                            y4 = t + dy2;\r\n                            y3 = (y4 + b) / 2;\r\n                            y6 = b - hR;///////////////////\r\n                            y7 = y1 - hR;\r\n\r\n                            d_val = \"M\" + l + \",\" + b +\r\n                                \" L\" + wd8 + \",\" + y3 +\r\n                                \" L\" + l + \",\" + y4 +\r\n                                \" L\" + x2 + \",\" + y4 +\r\n                                \" L\" + x2 + \",\" + hR +\r\n                                shapeArc(x3, hR, wd32, hR, 180, 270, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x8 + \",\" + t +\r\n                                shapeArc(x8, hR, wd32, hR, 270, 360, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x9 + \",\" + y4 +\r\n                                \" L\" + x9 + \",\" + y4 +\r\n                                \" L\" + r + \",\" + y4 +\r\n                                \" L\" + x10 + \",\" + y3 +\r\n                                \" L\" + r + \",\" + b +\r\n                                \" L\" + x7 + \",\" + b +\r\n                                shapeArc(x7, y6, wd32, hR, 90, 270, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x8 + \",\" + y1 +\r\n                                shapeArc(x8, y7, wd32, hR, 90, -90, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x3 + \",\" + y2 +\r\n                                shapeArc(x3, y7, wd32, hR, 270, 90, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x4 + \",\" + y1 +\r\n                                shapeArc(x4, y6, wd32, hR, 270, 450, false).replace(\"M\", \"L\") +\r\n                                \" z\" +\r\n                                \" M\" + x5 + \",\" + y2 +\r\n                                \" L\" + x5 + \",\" + y6 +\r\n                                \"M\" + x6 + \",\" + y6 +\r\n                                \" L\" + x6 + \",\" + y2 +\r\n                                \"M\" + x2 + \",\" + y7 +\r\n                                \" L\" + x2 + \",\" + y4 +\r\n                                \"M\" + x9 + \",\" + y4 +\r\n                                \" L\" + x9 + \",\" + y7;\r\n                        } else if (shapType == \"ribbon\") {\r\n                            var y5;\r\n                            y1 = h * a1 / cnstVal5;\r\n                            y2 = h * a1 / cnstVal4;\r\n                            y4 = b - y2;\r\n                            y3 = y4 / 2;\r\n                            y5 = b - hR; ///////////////////////\r\n                            y6 = y2 - hR;\r\n                            d_val = \"M\" + l + \",\" + t +\r\n                                \" L\" + x4 + \",\" + t +\r\n                                shapeArc(x4, hR, wd32, hR, 270, 450, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x3 + \",\" + y1 +\r\n                                shapeArc(x3, y6, wd32, hR, 270, 90, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x8 + \",\" + y2 +\r\n                                shapeArc(x8, y6, wd32, hR, 90, -90, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x7 + \",\" + y1 +\r\n                                shapeArc(x7, hR, wd32, hR, 90, 270, false).replace(\"M\", \"L\") +\r\n                                \" L\" + r + \",\" + t +\r\n                                \" L\" + x10 + \",\" + y3 +\r\n                                \" L\" + r + \",\" + y4 +\r\n                                \" L\" + x9 + \",\" + y4 +\r\n                                \" L\" + x9 + \",\" + y5 +\r\n                                shapeArc(x8, y5, wd32, hR, 0, 90, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x3 + \",\" + b +\r\n                                shapeArc(x3, y5, wd32, hR, 90, 180, false).replace(\"M\", \"L\") +\r\n                                \" L\" + x2 + \",\" + y4 +\r\n                                \" L\" + l + \",\" + y4 +\r\n                                \" L\" + wd8 + \",\" + y3 +\r\n                                \" z\" +\r\n                                \" M\" + x5 + \",\" + hR +\r\n                                \" L\" + x5 + \",\" + y2 +\r\n                                \"M\" + x6 + \",\" + y2 +\r\n                                \" L\" + x6 + \",\" + hR +\r\n                                \"M\" + x2 + \",\" + y4 +\r\n                                \" L\" + x2 + \",\" + y6 +\r\n                                \"M\" + x9 + \",\" + y6 +\r\n                                \" L\" + x9 + \",\" + y4;\r\n                        }\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"doubleWave\":\r\n                    case \"wave\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = (shapType == \"doubleWave\") ? 6250 * 96 / 914400 : 12500 * 96 / 914400;\r\n                        var sAdj2, adj2 = 0;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal2 = -10000 * 96 / 914400;\r\n                        var cnstVal3 = 50000 * 96 / 914400;\r\n                        var cnstVal4 = 100000 * 96 / 914400;\r\n                        var hc = w / 2, t = 0, l = 0, b = h, r = w, wd8 = w / 8, wd32 = w / 32;\r\n                        if (shapType == \"doubleWave\") {\r\n                            var cnstVal1 = 12500 * 96 / 914400;\r\n                            var a1, a2, y1, dy2, y2, y3, y4, y5, y6, of2, dx2, x2, dx8, x8, dx3, x3, dx4, x4, x5, x6, x7, x9, x15, x10, x11, x12, x13, x14;\r\n                            a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal1) ? cnstVal1 : adj1;\r\n                            a2 = (adj2 < cnstVal2) ? cnstVal2 : (adj2 > cnstVal4) ? cnstVal4 : adj2;\r\n                            y1 = h * a1 / cnstVal4;\r\n                            dy2 = y1 * 10 / 3;\r\n                            y2 = y1 - dy2;\r\n                            y3 = y1 + dy2;\r\n                            y4 = b - y1;\r\n                            y5 = y4 - dy2;\r\n                            y6 = y4 + dy2;\r\n                            of2 = w * a2 / cnstVal3;\r\n                            dx2 = (of2 > 0) ? 0 : of2;\r\n                            x2 = l - dx2;\r\n                            dx8 = (of2 > 0) ? of2 : 0;\r\n                            x8 = r - dx8;\r\n                            dx3 = (dx2 + x8) / 6;\r\n                            x3 = x2 + dx3;\r\n                            dx4 = (dx2 + x8) / 3;\r\n                            x4 = x2 + dx4;\r\n                            x5 = (x2 + x8) / 2;\r\n                            x6 = x5 + dx3;\r\n                            x7 = (x6 + x8) / 2;\r\n                            x9 = l + dx8;\r\n                            x15 = r + dx2;\r\n                            x10 = x9 + dx3;\r\n                            x11 = x9 + dx4;\r\n                            x12 = (x9 + x15) / 2;\r\n                            x13 = x12 + dx3;\r\n                            x14 = (x13 + x15) / 2;\r\n\r\n                            d_val = \"M\" + x2 + \",\" + y1 +\r\n                                \" C\" + x3 + \",\" + y2 + \" \" + x4 + \",\" + y3 + \" \" + x5 + \",\" + y1 +\r\n                                \" C\" + x6 + \",\" + y2 + \" \" + x7 + \",\" + y3 + \" \" + x8 + \",\" + y1 +\r\n                                \" L\" + x15 + \",\" + y4 +\r\n                                \" C\" + x14 + \",\" + y6 + \" \" + x13 + \",\" + y5 + \" \" + x12 + \",\" + y4 +\r\n                                \" C\" + x11 + \",\" + y6 + \" \" + x10 + \",\" + y5 + \" \" + x9 + \",\" + y4 +\r\n                                \" z\";\r\n                        } else if (shapType == \"wave\") {\r\n                            var cnstVal5 = 20000 * 96 / 914400;\r\n                            var a1, a2, y1, dy2, y2, y3, y4, y5, y6, of2, dx2, x2, dx5, x5, dx3, x3, x4, x6, x10, x7, x8;\r\n                            a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal5) ? cnstVal5 : adj1;\r\n                            a2 = (adj2 < cnstVal2) ? cnstVal2 : (adj2 > cnstVal4) ? cnstVal4 : adj2;\r\n                            y1 = h * a1 / cnstVal4;\r\n                            dy2 = y1 * 10 / 3;\r\n                            y2 = y1 - dy2;\r\n                            y3 = y1 + dy2;\r\n                            y4 = b - y1;\r\n                            y5 = y4 - dy2;\r\n                            y6 = y4 + dy2;\r\n                            of2 = w * a2 / cnstVal3;\r\n                            dx2 = (of2 > 0) ? 0 : of2;\r\n                            x2 = l - dx2;\r\n                            dx5 = (of2 > 0) ? of2 : 0;\r\n                            x5 = r - dx5;\r\n                            dx3 = (dx2 + x5) / 3;\r\n                            x3 = x2 + dx3;\r\n                            x4 = (x3 + x5) / 2;\r\n                            x6 = l + dx5;\r\n                            x10 = r + dx2;\r\n                            x7 = x6 + dx3;\r\n                            x8 = (x7 + x10) / 2;\r\n\r\n                            d_val = \"M\" + x2 + \",\" + y1 +\r\n                                \" C\" + x3 + \",\" + y2 + \" \" + x4 + \",\" + y3 + \" \" + x5 + \",\" + y1 +\r\n                                \" L\" + x10 + \",\" + y4 +\r\n                                \" C\" + x8 + \",\" + y6 + \" \" + x7 + \",\" + y5 + \" \" + x6 + \",\" + y4 +\r\n                                \" z\";\r\n                        }\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"ellipseRibbon\":\r\n                    case \"ellipseRibbon2\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 12500 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var d_val;\r\n                        var cnstVal1 = 25000 * 96 / 914400;\r\n                        var cnstVal3 = 75000 * 96 / 914400;\r\n                        var cnstVal4 = 100000 * 96 / 914400;\r\n                        var cnstVal5 = 200000 * 96 / 914400;\r\n                        var hc = w / 2, t = 0, l = 0, b = h, r = w, wd8 = w / 8;\r\n                        var a1, a2, q10, q11, q12, minAdj3, a3, dx2, x2, x3, x4, x5, x6, dy1, f1, q1, q2,\r\n                            cx1, cx2, q1, dy3, q3, q4, q5, rh, q8, cx4, q9, cx5;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal4) ? cnstVal4 : adj1;\r\n                        a2 = (adj2 < cnstVal1) ? cnstVal1 : (adj2 > cnstVal3) ? cnstVal3 : adj2;\r\n                        q10 = cnstVal4 - a1;\r\n                        q11 = q10 / 2;\r\n                        q12 = a1 - q11;\r\n                        minAdj3 = (0 > q12) ? 0 : q12;\r\n                        a3 = (adj3 < minAdj3) ? minAdj3 : (adj3 > a1) ? a1 : adj3;\r\n                        dx2 = w * a2 / cnstVal5;\r\n                        x2 = hc - dx2;\r\n                        x3 = x2 + wd8;\r\n                        x4 = r - x3;\r\n                        x5 = r - x2;\r\n                        x6 = r - wd8;\r\n                        dy1 = h * a3 / cnstVal4;\r\n                        f1 = 4 * dy1 / w;\r\n                        q1 = x3 * x3 / w;\r\n                        q2 = x3 - q1;\r\n                        cx1 = x3 / 2;\r\n                        cx2 = r - cx1;\r\n                        q1 = h * a1 / cnstVal4;\r\n                        dy3 = q1 - dy1;\r\n                        q3 = x2 * x2 / w;\r\n                        q4 = x2 - q3;\r\n                        q5 = f1 * q4;\r\n                        rh = b - q1;\r\n                        q8 = dy1 * 14 / 16;\r\n                        cx4 = x2 / 2;\r\n                        q9 = f1 * cx4;\r\n                        cx5 = r - cx4;\r\n                        if (shapType == \"ellipseRibbon\") {\r\n                            var y1, cy1, y3, q6, q7, cy3, y2, y5, y6,\r\n                                cy4, cy6, y7, cy7, y8;\r\n                            y1 = f1 * q2;\r\n                            cy1 = f1 * cx1;\r\n                            y3 = q5 + dy3;\r\n                            q6 = dy1 + dy3 - y3;\r\n                            q7 = q6 + dy1;\r\n                            cy3 = q7 + dy3;\r\n                            y2 = (q8 + rh) / 2;\r\n                            y5 = q5 + rh;\r\n                            y6 = y3 + rh;\r\n                            cy4 = q9 + rh;\r\n                            cy6 = cy3 + rh;\r\n                            y7 = y1 + dy3;\r\n                            cy7 = q1 + q1 - y7;\r\n                            y8 = b - dy1;\r\n                            //\r\n                            d_val = \"M\" + l + \",\" + t +\r\n                                \" Q\" + cx1 + \",\" + cy1 + \" \" + x3 + \",\" + y1 +\r\n                                \" L\" + x2 + \",\" + y3 +\r\n                                \" Q\" + hc + \",\" + cy3 + \" \" + x5 + \",\" + y3 +\r\n                                \" L\" + x4 + \",\" + y1 +\r\n                                \" Q\" + cx2 + \",\" + cy1 + \" \" + r + \",\" + t +\r\n                                \" L\" + x6 + \",\" + y2 +\r\n                                \" L\" + r + \",\" + rh +\r\n                                \" Q\" + cx5 + \",\" + cy4 + \" \" + x5 + \",\" + y5 +\r\n                                \" L\" + x5 + \",\" + y6 +\r\n                                \" Q\" + hc + \",\" + cy6 + \" \" + x2 + \",\" + y6 +\r\n                                \" L\" + x2 + \",\" + y5 +\r\n                                \" Q\" + cx4 + \",\" + cy4 + \" \" + l + \",\" + rh +\r\n                                \" L\" + wd8 + \",\" + y2 +\r\n                                \" z\" +\r\n                                \"M\" + x2 + \",\" + y5 +\r\n                                \" L\" + x2 + \",\" + y3 +\r\n                                \"M\" + x5 + \",\" + y3 +\r\n                                \" L\" + x5 + \",\" + y5 +\r\n                                \"M\" + x3 + \",\" + y1 +\r\n                                \" L\" + x3 + \",\" + y7 +\r\n                                \"M\" + x4 + \",\" + y7 +\r\n                                \" L\" + x4 + \",\" + y1;\r\n                        } else if (shapType == \"ellipseRibbon2\") {\r\n                            var u1, y1, cu1, cy1, q3, q5, u3, y3, q6, q7, cu3, cy3, rh, q8, u2, y2,\r\n                                u5, y5, u6, y6, cu4, cy4, cu6, cy6, u7, y7, cu7, cy7;\r\n                            u1 = f1 * q2;\r\n                            y1 = b - u1;\r\n                            cu1 = f1 * cx1;\r\n                            cy1 = b - cu1;\r\n                            u3 = q5 + dy3;\r\n                            y3 = b - u3;\r\n                            q6 = dy1 + dy3 - u3;\r\n                            q7 = q6 + dy1;\r\n                            cu3 = q7 + dy3;\r\n                            cy3 = b - cu3;\r\n                            u2 = (q8 + rh) / 2;\r\n                            y2 = b - u2;\r\n                            u5 = q5 + rh;\r\n                            y5 = b - u5;\r\n                            u6 = u3 + rh;\r\n                            y6 = b - u6;\r\n                            cu4 = q9 + rh;\r\n                            cy4 = b - cu4;\r\n                            cu6 = cu3 + rh;\r\n                            cy6 = b - cu6;\r\n                            u7 = u1 + dy3;\r\n                            y7 = b - u7;\r\n                            cu7 = q1 + q1 - u7;\r\n                            cy7 = b - cu7;\r\n                            //\r\n                            d_val = \"M\" + l + \",\" + b +\r\n                                \" L\" + wd8 + \",\" + y2 +\r\n                                \" L\" + l + \",\" + q1 +\r\n                                \" Q\" + cx4 + \",\" + cy4 + \" \" + x2 + \",\" + y5 +\r\n                                \" L\" + x2 + \",\" + y6 +\r\n                                \" Q\" + hc + \",\" + cy6 + \" \" + x5 + \",\" + y6 +\r\n                                \" L\" + x5 + \",\" + y5 +\r\n                                \" Q\" + cx5 + \",\" + cy4 + \" \" + r + \",\" + q1 +\r\n                                \" L\" + x6 + \",\" + y2 +\r\n                                \" L\" + r + \",\" + b +\r\n                                \" Q\" + cx2 + \",\" + cy1 + \" \" + x4 + \",\" + y1 +\r\n                                \" L\" + x5 + \",\" + y3 +\r\n                                \" Q\" + hc + \",\" + cy3 + \" \" + x2 + \",\" + y3 +\r\n                                \" L\" + x3 + \",\" + y1 +\r\n                                \" Q\" + cx1 + \",\" + cy1 + \" \" + l + \",\" + b +\r\n                                \" z\" +\r\n                                \"M\" + x2 + \",\" + y3 +\r\n                                \" L\" + x2 + \",\" + y5 +\r\n                                \"M\" + x5 + \",\" + y5 +\r\n                                \" L\" + x5 + \",\" + y3 +\r\n                                \"M\" + x3 + \",\" + y7 +\r\n                                \" L\" + x3 + \",\" + y1 +\r\n                                \"M\" + x4 + \",\" + y1 +\r\n                                \" L\" + x4 + \",\" + y7;\r\n                        }\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"line\":\r\n                    case \"straightConnector1\":\r\n                    case \"bentConnector4\":\r\n                    case \"bentConnector5\":\r\n                    case \"curvedConnector2\":\r\n                    case \"curvedConnector3\":\r\n                    case \"curvedConnector4\":\r\n                    case \"curvedConnector5\":\r\n                        if (isFlipV) {\r\n                            result += \"<line x1='\" + w + \"' y1='0' x2='0' y2='\" + h + \"' stroke='\" + border.color +\r\n                                \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' \";\r\n                        } else {\r\n                            result += \"<line x1='0' y1='0' x2='\" + w + \"' y2='\" + h + \"' stroke='\" + border.color +\r\n                                \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' \";\r\n                        }\r\n                        if (headEndNodeAttrs !== undefined && (headEndNodeAttrs[\"type\"] === \"triangle\" || headEndNodeAttrs[\"type\"] === \"arrow\")) {\r\n                            result += \"marker-start='url(#markerTriangle_\" + shpId + \")' \";\r\n                        }\r\n                        if (tailEndNodeAttrs !== undefined && (tailEndNodeAttrs[\"type\"] === \"triangle\" || tailEndNodeAttrs[\"type\"] === \"arrow\")) {\r\n                            result += \"marker-end='url(#markerTriangle_\" + shpId + \")' \";\r\n                        }\r\n                        result += \"/>\";\r\n                        break;\r\n                    case \"rightArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 0.25;//0.5;\r\n                        var sAdj2, sAdj2_val = 0.5;\r\n                        var max_sAdj2_const = w / h;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = 0.5 - (parseInt(sAdj1.substr(4)) / 200000);\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    var sAdj2_val2 = parseInt(sAdj2.substr(4)) / 100000;\r\n                                    sAdj2_val = 1 - ((sAdj2_val2) / max_sAdj2_const);\r\n                                }\r\n                            }\r\n                        }\r\n                        //console.log(\"w: \"+w+\"\\nh: \"+h+\"\\nsAdj1: \"+sAdj1_val+\"\\nsAdj2: \"+sAdj2_val);\r\n\r\n                        result += \" <polygon points='\" + w + \" \" + h / 2 + \",\" + sAdj2_val * w + \" 0,\" + sAdj2_val * w + \" \" + sAdj1_val * h + \",0 \" + sAdj1_val * h +\r\n                            \",0 \" + (1 - sAdj1_val) * h + \",\" + sAdj2_val * w + \" \" + (1 - sAdj1_val) * h + \", \" + sAdj2_val * w + \" \" + h + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"leftArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 0.25;//0.5;\r\n                        var sAdj2, sAdj2_val = 0.5;\r\n                        var max_sAdj2_const = w / h;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = 0.5 - (parseInt(sAdj1.substr(4)) / 200000);\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    var sAdj2_val2 = parseInt(sAdj2.substr(4)) / 100000;\r\n                                    sAdj2_val = (sAdj2_val2) / max_sAdj2_const;\r\n                                }\r\n                            }\r\n                        }\r\n                        //console.log(\"w: \"+w+\"\\nh: \"+h+\"\\nsAdj1: \"+sAdj1_val+\"\\nsAdj2: \"+sAdj2_val);\r\n\r\n                        result += \" <polygon points='0 \" + h / 2 + \",\" + sAdj2_val * w + \" \" + h + \",\" + sAdj2_val * w + \" \" + (1 - sAdj1_val) * h + \",\" + w + \" \" + (1 - sAdj1_val) * h +\r\n                            \",\" + w + \" \" + sAdj1_val * h + \",\" + sAdj2_val * w + \" \" + sAdj1_val * h + \", \" + sAdj2_val * w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"downArrow\":\r\n                    case \"flowChartOffpageConnector\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 0.25;//0.5;\r\n                        var sAdj2, sAdj2_val = 0.5;\r\n                        var max_sAdj2_const = h / w;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = parseInt(sAdj1.substr(4)) / 200000;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    var sAdj2_val2 = parseInt(sAdj2.substr(4)) / 100000;\r\n                                    sAdj2_val = (sAdj2_val2) / max_sAdj2_const;\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        if (shapType == \"flowChartOffpageConnector\") {\r\n                            sAdj1_val = 0.5;\r\n                            sAdj2_val = 0.212;\r\n                        }\r\n                        result += \" <polygon points='\" + (0.5 - sAdj1_val) * w + \" 0,\" + (0.5 - sAdj1_val) * w + \" \" + (1 - sAdj2_val) * h + \",0 \" + (1 - sAdj2_val) * h + \",\" + (w / 2) + \" \" + h +\r\n                            \",\" + w + \" \" + (1 - sAdj2_val) * h + \",\" + (0.5 + sAdj1_val) * w + \" \" + (1 - sAdj2_val) * h + \", \" + (0.5 + sAdj1_val) * w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"upArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 0.25;//0.5;\r\n                        var sAdj2, sAdj2_val = 0.5;\r\n                        var max_sAdj2_const = h / w;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = parseInt(sAdj1.substr(4)) / 200000;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    var sAdj2_val2 = parseInt(sAdj2.substr(4)) / 100000;\r\n                                    sAdj2_val = (sAdj2_val2) / max_sAdj2_const;\r\n                                }\r\n                            }\r\n                        }\r\n                        result += \" <polygon points='\" + (w / 2) + \" 0,0 \" + sAdj2_val * h + \",\" + (0.5 - sAdj1_val) * w + \" \" + sAdj2_val * h + \",\" + (0.5 - sAdj1_val) * w + \" \" + h +\r\n                            \",\" + (0.5 + sAdj1_val) * w + \" \" + h + \",\" + (0.5 + sAdj1_val) * w + \" \" + sAdj2_val * h + \", \" + w + \" \" + sAdj2_val * h + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"leftRightArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 0.25;\r\n                        var sAdj2, sAdj2_val = 0.25;\r\n                        var max_sAdj2_const = w / h;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = 0.5 - (parseInt(sAdj1.substr(4)) / 200000);\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    var sAdj2_val2 = parseInt(sAdj2.substr(4)) / 100000;\r\n                                    sAdj2_val = (sAdj2_val2) / max_sAdj2_const;\r\n                                }\r\n                            }\r\n                        }\r\n                        //console.log(\"w: \"+w+\"\\nh: \"+h+\"\\nsAdj1: \"+sAdj1_val+\"\\nsAdj2: \"+sAdj2_val);\r\n\r\n                        result += \" <polygon points='0 \" + h / 2 + \",\" + sAdj2_val * w + \" \" + h + \",\" + sAdj2_val * w + \" \" + (1 - sAdj1_val) * h + \",\" + (1 - sAdj2_val) * w + \" \" + (1 - sAdj1_val) * h +\r\n                            \",\" + (1 - sAdj2_val) * w + \" \" + h + \",\" + w + \" \" + h / 2 + \", \" + (1 - sAdj2_val) * w + \" 0,\" + (1 - sAdj2_val) * w + \" \" + sAdj1_val * h + \",\" +\r\n                            sAdj2_val * w + \" \" + sAdj1_val * h + \",\" + sAdj2_val * w + \" 0' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"upDownArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, sAdj1_val = 0.25;\r\n                        var sAdj2, sAdj2_val = 0.25;\r\n                        var max_sAdj2_const = h / w;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    sAdj1_val = 0.5 - (parseInt(sAdj1.substr(4)) / 200000);\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    var sAdj2_val2 = parseInt(sAdj2.substr(4)) / 100000;\r\n                                    sAdj2_val = (sAdj2_val2) / max_sAdj2_const;\r\n                                }\r\n                            }\r\n                        }\r\n                        //console.log(\"w: \"+w+\"\\nh: \"+h+\"\\nsAdj1: \"+sAdj1_val+\"\\nsAdj2: \"+sAdj2_val);\r\n\r\n                        result += \" <polygon points='\" + w / 2 + \" 0,0 \" + sAdj2_val * h + \",\" + sAdj1_val * w + \" \" + sAdj2_val * h + \",\" + sAdj1_val * w + \" \" + (1 - sAdj2_val) * h +\r\n                            \",0 \" + (1 - sAdj2_val) * h + \",\" + w / 2 + \" \" + h + \", \" + w + \" \" + (1 - sAdj2_val) * h + \",\" + (1 - sAdj1_val) * w + \" \" + (1 - sAdj2_val) * h + \",\" +\r\n                            (1 - sAdj1_val) * w + \" \" + sAdj2_val * h + \",\" + w + \" \" + sAdj2_val * h + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n                        break;\r\n                    case \"quadArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 22500 * 96 / 914400;\r\n                        var sAdj2, adj2 = 22500 * 96 / 914400;\r\n                        var sAdj3, adj3 = 22500 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, a1, a2, a3, q1, x1, x2, dx2, x3, dx3, x4, x5, x6, y2, y3, y4, y5, y6, maxAdj1, maxAdj3;\r\n                        var minWH = Math.min(w, h);\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > cnstVal1) a2 = cnstVal1\r\n                        else a2 = adj2\r\n                        maxAdj1 = 2 * a2;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > maxAdj1) a1 = maxAdj1\r\n                        else a1 = adj1\r\n                        q1 = cnstVal2 - maxAdj1;\r\n                        maxAdj3 = q1 / 2;\r\n                        if (adj3 < 0) a3 = 0\r\n                        else if (adj3 > maxAdj3) a3 = maxAdj3\r\n                        else a3 = adj3\r\n                        x1 = minWH * a3 / cnstVal2;\r\n                        dx2 = minWH * a2 / cnstVal2;\r\n                        x2 = hc - dx2;\r\n                        x5 = hc + dx2;\r\n                        dx3 = minWH * a1 / cnstVal3;\r\n                        x3 = hc - dx3;\r\n                        x4 = hc + dx3;\r\n                        x6 = w - x1;\r\n                        y2 = vc - dx2;\r\n                        y5 = vc + dx2;\r\n                        y3 = vc - dx3;\r\n                        y4 = vc + dx3;\r\n                        y6 = h - x1;\r\n                        var d_val = \"M\" + 0 + \",\" + vc +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" L\" + x1 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + x1 +\r\n                            \" L\" + x2 + \",\" + x1 +\r\n                            \" L\" + hc + \",\" + 0 +\r\n                            \" L\" + x5 + \",\" + x1 +\r\n                            \" L\" + x4 + \",\" + x1 +\r\n                            \" L\" + x4 + \",\" + y3 +\r\n                            \" L\" + x6 + \",\" + y3 +\r\n                            \" L\" + x6 + \",\" + y2 +\r\n                            \" L\" + w + \",\" + vc +\r\n                            \" L\" + x6 + \",\" + y5 +\r\n                            \" L\" + x6 + \",\" + y4 +\r\n                            \" L\" + x4 + \",\" + y4 +\r\n                            \" L\" + x4 + \",\" + y6 +\r\n                            \" L\" + x5 + \",\" + y6 +\r\n                            \" L\" + hc + \",\" + h +\r\n                            \" L\" + x2 + \",\" + y6 +\r\n                            \" L\" + x3 + \",\" + y6 +\r\n                            \" L\" + x3 + \",\" + y4 +\r\n                            \" L\" + x1 + \",\" + y4 +\r\n                            \" L\" + x1 + \",\" + y5 + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"leftRightUpArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, a1, a2, a3, q1, x1, x2, dx2, x3, dx3, x4, x5, x6, y2, dy2, y3, y4, y5, maxAdj1, maxAdj3;\r\n                        var minWH = Math.min(w, h);\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > cnstVal1) a2 = cnstVal1\r\n                        else a2 = adj2\r\n                        maxAdj1 = 2 * a2;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > maxAdj1) a1 = maxAdj1\r\n                        else a1 = adj1\r\n                        q1 = cnstVal2 - maxAdj1;\r\n                        maxAdj3 = q1 / 2;\r\n                        if (adj3 < 0) a3 = 0\r\n                        else if (adj3 > maxAdj3) a3 = maxAdj3\r\n                        else a3 = adj3\r\n                        x1 = minWH * a3 / cnstVal2;\r\n                        dx2 = minWH * a2 / cnstVal2;\r\n                        x2 = hc - dx2;\r\n                        x5 = hc + dx2;\r\n                        dx3 = minWH * a1 / cnstVal3;\r\n                        x3 = hc - dx3;\r\n                        x4 = hc + dx3;\r\n                        x6 = w - x1;\r\n                        dy2 = minWH * a2 / cnstVal1;\r\n                        y2 = h - dy2;\r\n                        y4 = h - dx2;\r\n                        y3 = y4 - dx3;\r\n                        y5 = y4 + dx3;\r\n                        var d_val = \"M\" + 0 + \",\" + y4 +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" L\" + x1 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + x1 +\r\n                            \" L\" + x2 + \",\" + x1 +\r\n                            \" L\" + hc + \",\" + 0 +\r\n                            \" L\" + x5 + \",\" + x1 +\r\n                            \" L\" + x4 + \",\" + x1 +\r\n                            \" L\" + x4 + \",\" + y3 +\r\n                            \" L\" + x6 + \",\" + y3 +\r\n                            \" L\" + x6 + \",\" + y2 +\r\n                            \" L\" + w + \",\" + y4 +\r\n                            \" L\" + x6 + \",\" + h +\r\n                            \" L\" + x6 + \",\" + y5 +\r\n                            \" L\" + x1 + \",\" + y5 +\r\n                            \" L\" + x1 + \",\" + h + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"leftUpArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, a1, a2, a3, x1, x2, dx4, dx3, x3, x4, x5, y2, y3, y4, y5, maxAdj1, maxAdj3;\r\n                        var minWH = Math.min(w, h);\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > cnstVal1) a2 = cnstVal1\r\n                        else a2 = adj2\r\n                        maxAdj1 = 2 * a2;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > maxAdj1) a1 = maxAdj1\r\n                        else a1 = adj1\r\n                        maxAdj3 = cnstVal2 - maxAdj1;\r\n                        if (adj3 < 0) a3 = 0\r\n                        else if (adj3 > maxAdj3) a3 = maxAdj3\r\n                        else a3 = adj3\r\n                        x1 = minWH * a3 / cnstVal2;\r\n                        dx2 = minWH * a2 / cnstVal1;\r\n                        x2 = w - dx2;\r\n                        y2 = h - dx2;\r\n                        dx4 = minWH * a2 / cnstVal2;\r\n                        x4 = w - dx4;\r\n                        y4 = h - dx4;\r\n                        dx3 = minWH * a1 / cnstVal3;\r\n                        x3 = x4 - dx3;\r\n                        x5 = x4 + dx3;\r\n                        y3 = y4 - dx3;\r\n                        y5 = y4 + dx3;\r\n                        var d_val = \"M\" + 0 + \",\" + y4 +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" L\" + x1 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + x1 +\r\n                            \" L\" + x2 + \",\" + x1 +\r\n                            \" L\" + x4 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + x1 +\r\n                            \" L\" + x5 + \",\" + x1 +\r\n                            \" L\" + x5 + \",\" + y5 +\r\n                            \" L\" + x1 + \",\" + y5 +\r\n                            \" L\" + x1 + \",\" + h + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"bentUpArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, a1, a2, a3, dx1, x1, dx2, x2, dx3, x3, x4, y1, y2, dy2;\r\n                        var minWH = Math.min(w, h);\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > cnstVal1) a1 = cnstVal1\r\n                        else a1 = adj1\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > cnstVal1) a2 = cnstVal1\r\n                        else a2 = adj2\r\n                        if (adj3 < 0) a3 = 0\r\n                        else if (adj3 > maxAdj3) a3 = maxAdj3\r\n                        else a3 = adj3\r\n                        y1 = minWH * a3 / cnstVal2;\r\n                        dx1 = minWH * a2 / cnstVal1;\r\n                        x1 = w - dx1;\r\n                        dx3 = minWH * a2 / cnstVal2;\r\n                        x3 = w - dx3;\r\n                        dx2 = minWH * a1 / cnstVal3;\r\n                        x2 = x3 - dx2;\r\n                        x4 = x3 + dx2;\r\n                        dy2 = minWH * a1 / cnstVal2;\r\n                        y2 = h - dy2;\r\n                        var d_val = \"M\" + 0 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + y1 +\r\n                            \" L\" + x1 + \",\" + y1 +\r\n                            \" L\" + x3 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + y1 +\r\n                            \" L\" + x4 + \",\" + y1 +\r\n                            \" L\" + x4 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"bentArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var sAdj4, adj4 = 43750 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var a1, a2, a3, a4, x3, x4, y3, y4, y5, y6, maxAdj1, maxAdj4;\r\n                        var minWH = Math.min(w, h);\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > cnstVal1) a2 = cnstVal1\r\n                        else a2 = adj2\r\n                        maxAdj1 = 2 * a2;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > maxAdj1) a1 = maxAdj1\r\n                        else a1 = adj1\r\n                        if (adj3 < 0) a3 = 0\r\n                        else if (adj3 > cnstVal1) a3 = cnstVal1\r\n                        else a3 = adj3\r\n                        var th, aw2, th2, dh2, ah, bw, bh, bs, bd, bd3, bd2,\r\n                            th = minWH * a1 / cnstVal2;\r\n                        aw2 = minWH * a2 / cnstVal2;\r\n                        th2 = th / 2;\r\n                        dh2 = aw2 - th2;\r\n                        ah = minWH * a3 / cnstVal2;\r\n                        bw = w - ah;\r\n                        bh = h - dh2;\r\n                        bs = (bw < bh) ? bw : bh;\r\n                        maxAdj4 = cnstVal2 * bs / minWH;\r\n                        if (adj4 < 0) a4 = 0\r\n                        else if (adj4 > maxAdj4) a4 = maxAdj4\r\n                        else a4 = adj4\r\n                        bd = minWH * a4 / cnstVal2;\r\n                        bd3 = bd - th;\r\n                        bd2 = (bd3 > 0) ? bd3 : 0;\r\n                        x3 = th + bd2;\r\n                        x4 = w - ah;\r\n                        y3 = dh2 + th;\r\n                        y4 = y3 + dh2;\r\n                        y5 = dh2 + bd;\r\n                        y6 = y3 + bd2;\r\n\r\n                        var d_val = \"M\" + 0 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + y5 +\r\n                            shapeArc(bd, y5, bd, bd, 180, 270, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x4 + \",\" + dh2 +\r\n                            \" L\" + x4 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + aw2 +\r\n                            \" L\" + x4 + \",\" + y4 +\r\n                            \" L\" + x4 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + y3 +\r\n                            shapeArc(x3, y6, bd2, bd2, 270, 180, false).replace(\"M\", \"L\") +\r\n                            \" L\" + th + \",\" + h + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"uturnArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var sAdj4, adj4 = 43750 * 96 / 914400;\r\n                        var sAdj5, adj5 = 75000 * 96 / 914400;\r\n                        var cnstVal1 = 25000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj5\") {\r\n                                    sAdj5 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj5 = parseInt(sAdj5.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var a1, a2, a3, a4, a5, q1, q2, q3, x3, x4, x5, x6, x7, x8, x9, y4, y5, minAdj5, maxAdj1, maxAdj3, maxAdj4;\r\n                        var minWH = Math.min(w, h);\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > cnstVal1) a2 = cnstVal1\r\n                        else a2 = adj2\r\n                        maxAdj1 = 2 * a2;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > maxAdj1) a1 = maxAdj1\r\n                        else a1 = adj1\r\n                        q2 = a1 * minWH / h;\r\n                        q3 = cnstVal2 - q2;\r\n                        maxAdj3 = q3 * h / minWH;\r\n                        if (adj3 < 0) a3 = 0\r\n                        else if (adj3 > maxAdj3) a3 = maxAdj3\r\n                        else a3 = adj3\r\n                        q1 = a3 + a1;\r\n                        minAdj5 = q1 * minWH / h;\r\n                        if (adj5 < minAdj5) a5 = minAdj5\r\n                        else if (adj5 > cnstVal2) a5 = cnstVal2\r\n                        else a5 = adj5\r\n\r\n                        var th, aw2, th2, dh2, ah, bw, bs, bd, bd3, bd2,\r\n                            th = minWH * a1 / cnstVal2;\r\n                        aw2 = minWH * a2 / cnstVal2;\r\n                        th2 = th / 2;\r\n                        dh2 = aw2 - th2;\r\n                        y5 = h * a5 / cnstVal2;\r\n                        ah = minWH * a3 / cnstVal2;\r\n                        y4 = y5 - ah;\r\n                        x9 = w - dh2;\r\n                        bw = x9 / 2;\r\n                        bs = (bw < y4) ? bw : y4;\r\n                        maxAdj4 = cnstVal2 * bs / minWH;\r\n                        if (adj4 < 0) a4 = 0\r\n                        else if (adj4 > maxAdj4) a4 = maxAdj4\r\n                        else a4 = adj4\r\n                        bd = minWH * a4 / cnstVal2;\r\n                        bd3 = bd - th;\r\n                        bd2 = (bd3 > 0) ? bd3 : 0;\r\n                        x3 = th + bd2;\r\n                        x8 = w - aw2;\r\n                        x6 = x8 - aw2;\r\n                        x7 = x6 + dh2;\r\n                        x4 = x9 - bd;\r\n                        x5 = x7 - bd2;\r\n                        cx = (th + x7) / 2\r\n                        var cy = (y4 + th) / 2\r\n                        var d_val = \"M\" + 0 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + bd +\r\n                            shapeArc(bd, bd, bd, bd, 180, 270, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x4 + \",\" + 0 +\r\n                            shapeArc(x4, bd, bd, bd, 270, 360, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x9 + \",\" + y4 +\r\n                            \" L\" + w + \",\" + y4 +\r\n                            \" L\" + x8 + \",\" + y5 +\r\n                            \" L\" + x6 + \",\" + y4 +\r\n                            \" L\" + x7 + \",\" + y4 +\r\n                            \" L\" + x7 + \",\" + x3 +\r\n                            shapeArc(x5, x3, bd2, bd2, 0, -90, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x3 + \",\" + th +\r\n                            shapeArc(x3, x3, bd2, bd2, 270, 180, false).replace(\"M\", \"L\") +\r\n                            \" L\" + th + \",\" + h + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"stripedRightArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 50000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var cnstVal1 = 100000 * 96 / 914400;\r\n                        var cnstVal2 = 200000 * 96 / 914400;\r\n                        var cnstVal3 = 84375 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var a1, a2, x4, x5, dx5, x6, dx6, y1, dy1, y2, maxAdj2, vc = h / 2;\r\n                        var minWH = Math.min(w, h);\r\n                        maxAdj2 = cnstVal3 * w / minWH;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > cnstVal1) a1 = cnstVal1\r\n                        else a1 = adj1\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > maxAdj2) a2 = maxAdj2\r\n                        else a2 = adj2\r\n                        x4 = minWH * 5 / 32;\r\n                        dx5 = minWH * a2 / cnstVal1;\r\n                        x5 = w - dx5;\r\n                        dy1 = h * a1 / cnstVal2;\r\n                        y1 = vc - dy1;\r\n                        y2 = vc + dy1;\r\n                        //dx6 = dy1*dx5/hd2;\r\n                        //x6 = w-dx6;\r\n                        var ssd8 = minWH / 8,\r\n                            ssd16 = minWH / 16,\r\n                            ssd32 = minWH / 32;\r\n                        var d_val = \"M\" + 0 + \",\" + y1 +\r\n                            \" L\" + ssd32 + \",\" + y1 +\r\n                            \" L\" + ssd32 + \",\" + y2 +\r\n                            \" L\" + 0 + \",\" + y2 + \" z\" +\r\n                            \" M\" + ssd16 + \",\" + y1 +\r\n                            \" L\" + ssd8 + \",\" + y1 +\r\n                            \" L\" + ssd8 + \",\" + y2 +\r\n                            \" L\" + ssd16 + \",\" + y2 + \" z\" +\r\n                            \" M\" + x4 + \",\" + y1 +\r\n                            \" L\" + x5 + \",\" + y1 +\r\n                            \" L\" + x5 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + vc +\r\n                            \" L\" + x5 + \",\" + h +\r\n                            \" L\" + x5 + \",\" + y2 +\r\n                            \" L\" + x4 + \",\" + y2 + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"notchedRightArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 50000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var cnstVal1 = 100000 * 96 / 914400;\r\n                        var cnstVal2 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var a1, a2, x1, x2, dx2, y1, dy1, y2, maxAdj2, vc = h / 2, hd2 = vc;\r\n                        var minWH = Math.min(w, h);\r\n                        maxAdj2 = cnstVal1 * w / minWH;\r\n                        if (adj1 < 0) a1 = 0\r\n                        else if (adj1 > cnstVal1) a1 = cnstVal1\r\n                        else a1 = adj1\r\n                        if (adj2 < 0) a2 = 0\r\n                        else if (adj2 > maxAdj2) a2 = maxAdj2\r\n                        else a2 = adj2\r\n                        dx2 = minWH * a2 / cnstVal1;\r\n                        x2 = w - dx2;\r\n                        dy1 = h * a1 / cnstVal2;\r\n                        y1 = vc - dy1;\r\n                        y2 = vc + dy1;\r\n                        x1 = dy1 * dx2 / hd2;\r\n                        var d_val = \"M\" + 0 + \",\" + y1 +\r\n                            \" L\" + x2 + \",\" + y1 +\r\n                            \" L\" + x2 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + vc +\r\n                            \" L\" + x2 + \",\" + h +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + 0 + \",\" + y2 +\r\n                            \" L\" + x1 + \",\" + vc + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"homePlate\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 50000 * 96 / 914400;\r\n                        var cnstVal1 = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var a, x1, dx1, maxAdj, vc = h / 2;\r\n                        var minWH = Math.min(w, h);\r\n                        maxAdj = cnstVal1 * w / minWH;\r\n                        if (adj < 0) a = 0\r\n                        else if (adj > maxAdj) a = maxAdj\r\n                        else a = adj\r\n                        dx1 = minWH * a / cnstVal1;\r\n                        x1 = w - dx1;\r\n                        var d_val = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + x1 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + vc +\r\n                            \" L\" + x1 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h + \" z\";\r\n\r\n                        result += \"<path  d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"chevron\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 50000 * 96 / 914400;\r\n                        var cnstVal1 = 100000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var a, x1, dx1, x2, maxAdj, vc = h / 2;\r\n                        var minWH = Math.min(w, h);\r\n                        maxAdj = cnstVal1 * w / minWH;\r\n                        if (adj < 0) a = 0\r\n                        else if (adj > maxAdj) a = maxAdj\r\n                        else a = adj\r\n                        x1 = minWH * a / cnstVal1;\r\n                        x2 = w - x1;\r\n                        var d_val = \"M\" + 0 + \",\" + 0 +\r\n                            \" L\" + x2 + \",\" + 0 +\r\n                            \" L\" + w + \",\" + vc +\r\n                            \" L\" + x2 + \",\" + h +\r\n                            \" L\" + 0 + \",\" + h +\r\n                            \" L\" + x1 + \",\" + vc + \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n\r\n                        break;\r\n                    case \"rightArrowCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var sAdj4, adj4 = 64977 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var maxAdj2, a2, maxAdj1, a1, maxAdj3, a3, q2, maxAdj4, a4, dy1, dy2, y1, y2, y3, y4, dx3, x3, x2, x1;\r\n                        var vc = h / 2, r = w, b = h, l = 0, t = 0;\r\n                        var ss = Math.min(w, h);\r\n                        maxAdj2 = cnstVal1 * h / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        maxAdj1 = a2 * 2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        maxAdj3 = cnstVal2 * w / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        q2 = a3 * ss / w;\r\n                        maxAdj4 = cnstVal - q2;\r\n                        a4 = (adj4 < 0) ? 0 : (adj4 > maxAdj4) ? maxAdj4 : adj4;\r\n                        dy1 = ss * a2 / cnstVal2;\r\n                        dy2 = ss * a1 / cnstVal3;\r\n                        y1 = vc - dy1;\r\n                        y2 = vc - dy2;\r\n                        y3 = vc + dy2;\r\n                        y4 = vc + dy1;\r\n                        dx3 = ss * a3 / cnstVal2;\r\n                        x3 = r - dx3;\r\n                        x2 = w * a4 / cnstVal2;\r\n                        x1 = x2 / 2;\r\n                        var d_val = \"M\" + l + \",\" + t +\r\n                            \" L\" + x2 + \",\" + t +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + x3 + \",\" + y2 +\r\n                            \" L\" + x3 + \",\" + y1 +\r\n                            \" L\" + r + \",\" + vc +\r\n                            \" L\" + x3 + \",\" + y4 +\r\n                            \" L\" + x3 + \",\" + y3 +\r\n                            \" L\" + x2 + \",\" + y3 +\r\n                            \" L\" + x2 + \",\" + b +\r\n                            \" L\" + l + \",\" + b +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"downArrowCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var sAdj4, adj4 = 64977 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var maxAdj2, a2, maxAdj1, a1, maxAdj3, a3, q2, maxAdj4, a4, dx1, dx2, x1, x2, x3, x4, dy3, y3, y2, y1;\r\n                        var hc = w / 2, r = w, b = h, l = 0, t = 0;\r\n                        var ss = Math.min(w, h);\r\n\r\n                        maxAdj2 = cnstVal1 * w / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        maxAdj1 = a2 * 2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        maxAdj3 = cnstVal2 * h / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        q2 = a3 * ss / h;\r\n                        maxAdj4 = cnstVal2 - q2;\r\n                        a4 = (adj4 < 0) ? 0 : (adj4 > maxAdj4) ? maxAdj4 : adj4;\r\n                        dx1 = ss * a2 / cnstVal2;\r\n                        dx2 = ss * a1 / cnstVal3;\r\n                        x1 = hc - dx1;\r\n                        x2 = hc - dx2;\r\n                        x3 = hc + dx2;\r\n                        x4 = hc + dx1;\r\n                        dy3 = ss * a3 / cnstVal2;\r\n                        y3 = b - dy3;\r\n                        y2 = h * a4 / cnstVal2;\r\n                        y1 = y2 / 2;\r\n                        var d_val = \"M\" + l + \",\" + t +\r\n                            \" L\" + r + \",\" + t +\r\n                            \" L\" + r + \",\" + y2 +\r\n                            \" L\" + x3 + \",\" + y2 +\r\n                            \" L\" + x3 + \",\" + y3 +\r\n                            \" L\" + x4 + \",\" + y3 +\r\n                            \" L\" + hc + \",\" + b +\r\n                            \" L\" + x1 + \",\" + y3 +\r\n                            \" L\" + x2 + \",\" + y3 +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + l + \",\" + y2 +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"leftArrowCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var sAdj4, adj4 = 64977 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var maxAdj2, a2, maxAdj1, a1, maxAdj3, a3, q2, maxAdj4, a4, dy1, dy2, y1, y2, y3, y4, x1, dx2, x2, x3;\r\n                        var vc = h / 2, r = w, b = h, l = 0, t = 0;\r\n                        var ss = Math.min(w, h);\r\n\r\n                        maxAdj2 = cnstVal1 * h / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        maxAdj1 = a2 * 2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        maxAdj3 = cnstVal2 * w / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        q2 = a3 * ss / w;\r\n                        maxAdj4 = cnstVal2 - q2;\r\n                        a4 = (adj4 < 0) ? 0 : (adj4 > maxAdj4) ? maxAdj4 : adj4;\r\n                        dy1 = ss * a2 / cnstVal2;\r\n                        dy2 = ss * a1 / cnstVal3;\r\n                        y1 = vc - dy1;\r\n                        y2 = vc - dy2;\r\n                        y3 = vc + dy2;\r\n                        y4 = vc + dy1;\r\n                        x1 = ss * a3 / cnstVal2;\r\n                        dx2 = w * a4 / cnstVal2;\r\n                        x2 = r - dx2;\r\n                        x3 = (x2 + r) / 2;\r\n                        var d_val = \"M\" + l + \",\" + vc +\r\n                            \" L\" + x1 + \",\" + y1 +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + t +\r\n                            \" L\" + r + \",\" + t +\r\n                            \" L\" + r + \",\" + b +\r\n                            \" L\" + x2 + \",\" + b +\r\n                            \" L\" + x2 + \",\" + y3 +\r\n                            \" L\" + x1 + \",\" + y3 +\r\n                            \" L\" + x1 + \",\" + y4 +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"upArrowCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var sAdj4, adj4 = 64977 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var maxAdj2, a2, maxAdj1, a1, maxAdj3, a3, q2, maxAdj4, a4, dx1, dx2, x1, x2, x3, x4, y1, dy2, y2, y3;\r\n                        var hc = w / 2, r = w, b = h, l = 0, t = 0;\r\n                        var ss = Math.min(w, h);\r\n                        maxAdj2 = cnstVal1 * w / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        maxAdj1 = a2 * 2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        maxAdj3 = cnstVal2 * h / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        q2 = a3 * ss / h;\r\n                        maxAdj4 = cnstVal2 - q2;\r\n                        a4 = (adj4 < 0) ? 0 : (adj4 > maxAdj4) ? maxAdj4 : adj4;\r\n                        dx1 = ss * a2 / cnstVal2;\r\n                        dx2 = ss * a1 / cnstVal3;\r\n                        x1 = hc - dx1;\r\n                        x2 = hc - dx2;\r\n                        x3 = hc + dx2;\r\n                        x4 = hc + dx1;\r\n                        y1 = ss * a3 / cnstVal2;\r\n                        dy2 = h * a4 / cnstVal2;\r\n                        y2 = b - dy2;\r\n                        y3 = (y2 + b) / 2;\r\n\r\n                        var d_val = \"M\" + l + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + y1 +\r\n                            \" L\" + x1 + \",\" + y1 +\r\n                            \" L\" + hc + \",\" + t +\r\n                            \" L\" + x4 + \",\" + y1 +\r\n                            \" L\" + x3 + \",\" + y1 +\r\n                            \" L\" + x3 + \",\" + y2 +\r\n                            \" L\" + r + \",\" + y2 +\r\n                            \" L\" + r + \",\" + b +\r\n                            \" L\" + l + \",\" + b +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"leftRightArrowCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 25000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var sAdj4, adj4 = 48123 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var maxAdj2, a2, maxAdj1, a1, maxAdj3, a3, q2, maxAdj4, a4, dy1, dy2, y1, y2, y3, y4, x1, x4, dx2, x2, x3;\r\n                        var vc = h / 2, hc = w / 2, r = w, b = h, l = 0, t = 0;\r\n                        var ss = Math.min(w, h);\r\n                        maxAdj2 = cnstVal1 * h / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        maxAdj1 = a2 * 2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        maxAdj3 = cnstVal1 * w / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        q2 = a3 * ss / wd2;\r\n                        maxAdj4 = cnstVal2 - q2;\r\n                        a4 = (adj4 < 0) ? 0 : (adj4 > maxAdj4) ? maxAdj4 : adj4;\r\n                        dy1 = ss * a2 / cnstVal2;\r\n                        dy2 = ss * a1 / cnstVal3;\r\n                        y1 = vc - dy1;\r\n                        y2 = vc - dy2;\r\n                        y3 = vc + dy2;\r\n                        y4 = vc + dy1;\r\n                        x1 = ss * a3 / cnstVal2;\r\n                        x4 = r - x1;\r\n                        dx2 = w * a4 / cnstVal3;\r\n                        x2 = hc - dx2;\r\n                        x3 = hc + dx2;\r\n                        var d_val = \"M\" + l + \",\" + vc +\r\n                            \" L\" + x1 + \",\" + y1 +\r\n                            \" L\" + x1 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + x2 + \",\" + t +\r\n                            \" L\" + x3 + \",\" + t +\r\n                            \" L\" + x3 + \",\" + y2 +\r\n                            \" L\" + x4 + \",\" + y2 +\r\n                            \" L\" + x4 + \",\" + y1 +\r\n                            \" L\" + r + \",\" + vc +\r\n                            \" L\" + x4 + \",\" + y4 +\r\n                            \" L\" + x4 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + y3 +\r\n                            \" L\" + x3 + \",\" + b +\r\n                            \" L\" + x2 + \",\" + b +\r\n                            \" L\" + x2 + \",\" + y3 +\r\n                            \" L\" + x1 + \",\" + y3 +\r\n                            \" L\" + x1 + \",\" + y4 +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"quadArrowCallout\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 18515 * 96 / 914400;\r\n                        var sAdj2, adj2 = 18515 * 96 / 914400;\r\n                        var sAdj3, adj3 = 18515 * 96 / 914400;\r\n                        var sAdj4, adj4 = 48123 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = parseInt(sAdj4.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, r = w, b = h, l = 0, t = 0;\r\n                        var ss = Math.min(w, h);\r\n                        var a2, maxAdj1, a1, maxAdj3, a3, q2, maxAdj4, a4, dx2, dx3, ah, dx1, dy1, x8, x2, x7, x3, x6, x4, x5, y8, y2, y7, y3, y6, y4, y5;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > cnstVal1) ? cnstVal1 : adj2;\r\n                        maxAdj1 = a2 * 2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        maxAdj3 = cnstVal1 - a2;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        q2 = a3 * 2;\r\n                        maxAdj4 = cnstVal2 - q2;\r\n                        a4 = (adj4 < a1) ? a1 : (adj4 > maxAdj4) ? maxAdj4 : adj4;\r\n                        dx2 = ss * a2 / cnstVal2;\r\n                        dx3 = ss * a1 / cnstVal3;\r\n                        ah = ss * a3 / cnstVal2;\r\n                        dx1 = w * a4 / cnstVal3;\r\n                        dy1 = h * a4 / cnstVal3;\r\n                        x8 = r - ah;\r\n                        x2 = hc - dx1;\r\n                        x7 = hc + dx1;\r\n                        x3 = hc - dx2;\r\n                        x6 = hc + dx2;\r\n                        x4 = hc - dx3;\r\n                        x5 = hc + dx3;\r\n                        y8 = b - ah;\r\n                        y2 = vc - dy1;\r\n                        y7 = vc + dy1;\r\n                        y3 = vc - dx2;\r\n                        y6 = vc + dx2;\r\n                        y4 = vc - dx3;\r\n                        y5 = vc + dx3;\r\n                        var d_val = \"M\" + l + \",\" + vc +\r\n                            \" L\" + ah + \",\" + y3 +\r\n                            \" L\" + ah + \",\" + y4 +\r\n                            \" L\" + x2 + \",\" + y4 +\r\n                            \" L\" + x2 + \",\" + y2 +\r\n                            \" L\" + x4 + \",\" + y2 +\r\n                            \" L\" + x4 + \",\" + ah +\r\n                            \" L\" + x3 + \",\" + ah +\r\n                            \" L\" + hc + \",\" + t +\r\n                            \" L\" + x6 + \",\" + ah +\r\n                            \" L\" + x5 + \",\" + ah +\r\n                            \" L\" + x5 + \",\" + y2 +\r\n                            \" L\" + x7 + \",\" + y2 +\r\n                            \" L\" + x7 + \",\" + y4 +\r\n                            \" L\" + x8 + \",\" + y4 +\r\n                            \" L\" + x8 + \",\" + y3 +\r\n                            \" L\" + r + \",\" + vc +\r\n                            \" L\" + x8 + \",\" + y6 +\r\n                            \" L\" + x8 + \",\" + y5 +\r\n                            \" L\" + x7 + \",\" + y5 +\r\n                            \" L\" + x7 + \",\" + y7 +\r\n                            \" L\" + x5 + \",\" + y7 +\r\n                            \" L\" + x5 + \",\" + y8 +\r\n                            \" L\" + x6 + \",\" + y8 +\r\n                            \" L\" + hc + \",\" + b +\r\n                            \" L\" + x3 + \",\" + y8 +\r\n                            \" L\" + x4 + \",\" + y8 +\r\n                            \" L\" + x4 + \",\" + y7 +\r\n                            \" L\" + x2 + \",\" + y7 +\r\n                            \" L\" + x2 + \",\" + y5 +\r\n                            \" L\" + ah + \",\" + y5 +\r\n                            \" L\" + ah + \",\" + y6 +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"curvedDownArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, wd2 = w / 2, r = w, b = h, l = 0, t = 0, c3d4 = 270, cd2 = 180, cd4 = 90;\r\n                        var ss = Math.min(w, h);\r\n                        var maxAdj2, a2, a1, th, aw, q1, wR, q7, q8, q9, q10, q11, idy, maxAdj3, a3, ah, x3, q2, q3, q4, q5, dx, x5, x7, q6, dh, x4, x8, aw2, x6, y1, swAng, mswAng, iy, ix, q12, dang2, stAng, stAng2, swAng2, swAng3;\r\n\r\n                        maxAdj2 = cnstVal1 * w / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal2) ? cnstVal2 : adj1;\r\n                        th = ss * a1 / cnstVal2;\r\n                        aw = ss * a2 / cnstVal2;\r\n                        q1 = (th + aw) / 4;\r\n                        wR = wd2 - q1;\r\n                        q7 = wR * 2;\r\n                        q8 = q7 * q7;\r\n                        q9 = th * th;\r\n                        q10 = q8 - q9;\r\n                        q11 = Math.sqrt(q10);\r\n                        idy = q11 * h / q7;\r\n                        maxAdj3 = cnstVal2 * idy / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        ah = ss * adj3 / cnstVal2;\r\n                        x3 = wR + th;\r\n                        q2 = h * h;\r\n                        q3 = ah * ah;\r\n                        q4 = q2 - q3;\r\n                        q5 = Math.sqrt(q4);\r\n                        dx = q5 * wR / h;\r\n                        x5 = wR + dx;\r\n                        x7 = x3 + dx;\r\n                        q6 = aw - th;\r\n                        dh = q6 / 2;\r\n                        x4 = x5 - dh;\r\n                        x8 = x7 + dh;\r\n                        aw2 = aw / 2;\r\n                        x6 = r - aw2;\r\n                        y1 = b - ah;\r\n                        swAng = Math.atan(dx / ah);\r\n                        var swAngDeg = swAng * 180 / Math.PI;\r\n                        mswAng = -swAngDeg;\r\n                        iy = b - idy;\r\n                        ix = (wR + x3) / 2;\r\n                        q12 = th / 2;\r\n                        dang2 = Math.atan(q12 / idy);\r\n                        var dang2Deg = dang2 * 180 / Math.PI;\r\n                        stAng = c3d4 + swAngDeg;\r\n                        stAng2 = c3d4 - dang2Deg;\r\n                        swAng2 = dang2Deg - cd4;\r\n                        swAng3 = cd4 + dang2Deg;\r\n                        //var cX = x5 - Math.cos(stAng*Math.PI/180) * wR;\r\n                        //var cY = y1 - Math.sin(stAng*Math.PI/180) * h;\r\n\r\n                        var d_val = \"M\" + x6 + \",\" + b +\r\n                            \" L\" + x4 + \",\" + y1 +\r\n                            \" L\" + x5 + \",\" + y1 +\r\n                            shapeArc(wR, h, wR, h, stAng, (stAng + mswAng), false).replace(\"M\", \"L\") +\r\n                            \" L\" + x3 + \",\" + t +\r\n                            shapeArc(x3, h, wR, h, c3d4, (c3d4 + swAngDeg), false).replace(\"M\", \"L\") +\r\n                            \" L\" + (x5 + th) + \",\" + y1 +\r\n                            \" L\" + x8 + \",\" + y1 +\r\n                            \" z\" +\r\n                            \"M\" + x3 + \",\" + t +\r\n                            shapeArc(x3, h, wR, h, stAng2, (stAng2 + swAng2), false).replace(\"M\", \"L\") +\r\n                            shapeArc(wR, h, wR, h, cd2, (cd2 + swAng3), false).replace(\"M\", \"L\");\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"curvedLeftArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, hd2 = h / 2, r = w, b = h, l = 0, t = 0, c3d4 = 270, cd2 = 180, cd4 = 90;\r\n                        var ss = Math.min(w, h);\r\n                        var maxAdj2, a2, a1, th, aw, q1, hR, q7, q8, q9, q10, q11, idx, maxAdj3, a3, ah, y3, q2, q3, q4, q5, dy, y5, y7, q6, dh, y4, y8, aw2, y6, x1, swAng, mswAng, ix, iy, q12, dang2, swAng2, swAng3, stAng3;\r\n\r\n                        maxAdj2 = cnstVal1 * h / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > a2) ? a2 : adj1;\r\n                        th = ss * a1 / cnstVal2;\r\n                        aw = ss * a2 / cnstVal2;\r\n                        q1 = (th + aw) / 4;\r\n                        hR = hd2 - q1;\r\n                        q7 = hR * 2;\r\n                        q8 = q7 * q7;\r\n                        q9 = th * th;\r\n                        q10 = q8 - q9;\r\n                        q11 = Math.sqrt(q10);\r\n                        idx = q11 * w / q7;\r\n                        maxAdj3 = cnstVal2 * idx / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        ah = ss * a3 / cnstVal2;\r\n                        y3 = hR + th;\r\n                        q2 = w * w;\r\n                        q3 = ah * ah;\r\n                        q4 = q2 - q3;\r\n                        q5 = Math.sqrt(q4);\r\n                        dy = q5 * hR / w;\r\n                        y5 = hR + dy;\r\n                        y7 = y3 + dy;\r\n                        q6 = aw - th;\r\n                        dh = q6 / 2;\r\n                        y4 = y5 - dh;\r\n                        y8 = y7 + dh;\r\n                        aw2 = aw / 2;\r\n                        y6 = b - aw2;\r\n                        x1 = l + ah;\r\n                        swAng = Math.atan(dy / ah);\r\n                        mswAng = -swAng;\r\n                        ix = l + idx;\r\n                        iy = (hR + y3) / 2;\r\n                        q12 = th / 2;\r\n                        dang2 = Math.atan(q12 / idx);\r\n                        swAng2 = dang2 - swAng;\r\n                        swAng3 = swAng + dang2;\r\n                        stAng3 = -dang2;\r\n                        var swAngDg, swAng2Dg, swAng3Dg, stAng3dg;\r\n                        swAngDg = swAng * 180 / Math.PI;\r\n                        swAng2Dg = swAng2 * 180 / Math.PI;\r\n                        swAng3Dg = swAng3 * 180 / Math.PI;\r\n                        stAng3dg = stAng3 * 180 / Math.PI;\r\n\r\n                        var d_val = \"M\" + r + \",\" + y3 +\r\n                            shapeArc(l, hR, w, hR, 0, -cd4, false).replace(\"M\", \"L\") +\r\n                            \" L\" + l + \",\" + t +\r\n                            shapeArc(l, y3, w, hR, c3d4, (c3d4 + cd4), false).replace(\"M\", \"L\") +\r\n                            \" L\" + r + \",\" + y3 +\r\n                            shapeArc(l, y3, w, hR, 0, swAngDg, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + y7 +\r\n                            \" L\" + x1 + \",\" + y8 +\r\n                            \" L\" + l + \",\" + y6 +\r\n                            \" L\" + x1 + \",\" + y4 +\r\n                            \" L\" + x1 + \",\" + y5 +\r\n                            shapeArc(l, hR, w, hR, swAngDg, (swAngDg + swAng2Dg), false).replace(\"M\", \"L\") +\r\n                            shapeArc(l, hR, w, hR, 0, -cd4, false).replace(\"M\", \"L\") +\r\n                            shapeArc(l, y3, w, hR, c3d4, (c3d4 + cd4), false).replace(\"M\", \"L\");\r\n\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"curvedRightArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, hd2 = h / 2, r = w, b = h, l = 0, t = 0, c3d4 = 270, cd2 = 180, cd4 = 90;\r\n                        var ss = Math.min(w, h);\r\n                        var maxAdj2, a2, a1, th, aw, q1, hR, q7, q8, q9, q10, q11, idx, maxAdj3, a3, ah, y3, q2, q3, q4, q5, dy, y5, y7, q6, dh, y4, y8, aw2, y6, x1, swAng, stAng, mswAng, ix, iy, q12, dang2, swAng2, swAng3, stAng3;\r\n\r\n                        maxAdj2 = cnstVal1 * h / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > a2) ? a2 : adj1;\r\n                        th = ss * a1 / cnstVal2;\r\n                        aw = ss * a2 / cnstVal2;\r\n                        q1 = (th + aw) / 4;\r\n                        hR = hd2 - q1;\r\n                        q7 = hR * 2;\r\n                        q8 = q7 * q7;\r\n                        q9 = th * th;\r\n                        q10 = q8 - q9;\r\n                        q11 = Math.sqrt(q10);\r\n                        idx = q11 * w / q7;\r\n                        maxAdj3 = cnstVal2 * idx / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        ah = ss * a3 / cnstVal2;\r\n                        y3 = hR + th;\r\n                        q2 = w * w;\r\n                        q3 = ah * ah;\r\n                        q4 = q2 - q3;\r\n                        q5 = Math.sqrt(q4);\r\n                        dy = q5 * hR / w;\r\n                        y5 = hR + dy;\r\n                        y7 = y3 + dy;\r\n                        q6 = aw - th;\r\n                        dh = q6 / 2;\r\n                        y4 = y5 - dh;\r\n                        y8 = y7 + dh;\r\n                        aw2 = aw / 2;\r\n                        y6 = b - aw2;\r\n                        x1 = r - ah;\r\n                        swAng = Math.atan(dy / ah);\r\n                        stAng = Math.PI + 0 - swAng;\r\n                        mswAng = -swAng;\r\n                        ix = r - idx;\r\n                        iy = (hR + y3) / 2;\r\n                        q12 = th / 2;\r\n                        dang2 = Math.atan(q12 / idx);\r\n                        swAng2 = dang2 - Math.PI / 2;\r\n                        swAng3 = Math.PI / 2 + dang2;\r\n                        stAng3 = Math.PI - dang2;\r\n\r\n                        var stAngDg, mswAngDg, swAngDg, swAng2dg;\r\n                        stAngDg = stAng * 180 / Math.PI;\r\n                        mswAngDg = mswAng * 180 / Math.PI;\r\n                        swAngDg = swAng * 180 / Math.PI;\r\n                        swAng2dg = swAng2 * 180 / Math.PI;\r\n\r\n                        var d_val = \"M\" + l + \",\" + hR +\r\n                            shapeArc(w, hR, w, hR, cd2, cd2 + mswAngDg, false).replace(\"M\", \"L\") +\r\n                            \" L\" + x1 + \",\" + y5 +\r\n                            \" L\" + x1 + \",\" + y4 +\r\n                            \" L\" + r + \",\" + y6 +\r\n                            \" L\" + x1 + \",\" + y8 +\r\n                            \" L\" + x1 + \",\" + y7 +\r\n                            shapeArc(w, y3, w, hR, stAngDg, stAngDg + swAngDg, false).replace(\"M\", \"L\") +\r\n                            \" L\" + l + \",\" + hR +\r\n                            shapeArc(w, hR, w, hR, cd2, cd2 + cd4, false).replace(\"M\", \"L\") +\r\n                            \" L\" + r + \",\" + th +\r\n                            shapeArc(w, y3, w, hR, c3d4, c3d4 + swAng2dg, false).replace(\"M\", \"L\")\r\n                        \"\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"curvedUpArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 25000 * 96 / 914400;\r\n                        var sAdj2, adj2 = 50000 * 96 / 914400;\r\n                        var sAdj3, adj3 = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = parseInt(sAdj3.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, wd2 = w / 2, r = w, b = h, l = 0, t = 0, c3d4 = 270, cd2 = 180, cd4 = 90;\r\n                        var ss = Math.min(w, h);\r\n                        var maxAdj2, a2, a1, th, aw, q1, wR, q7, q8, q9, q10, q11, idy, maxAdj3, a3, ah, x3, q2, q3, q4, q5, dx, x5, x7, q6, dh, x4, x8, aw2, x6, y1, swAng, mswAng, iy, ix, q12, dang2, swAng2, mswAng2, stAng3, swAng3, stAng2;\r\n\r\n                        maxAdj2 = cnstVal1 * w / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal2) ? cnstVal2 : adj1;\r\n                        th = ss * a1 / cnstVal2;\r\n                        aw = ss * a2 / cnstVal2;\r\n                        q1 = (th + aw) / 4;\r\n                        wR = wd2 - q1;\r\n                        q7 = wR * 2;\r\n                        q8 = q7 * q7;\r\n                        q9 = th * th;\r\n                        q10 = q8 - q9;\r\n                        q11 = Math.sqrt(q10);\r\n                        idy = q11 * h / q7;\r\n                        maxAdj3 = cnstVal2 * idy / ss;\r\n                        a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                        ah = ss * adj3 / cnstVal2;\r\n                        x3 = wR + th;\r\n                        q2 = h * h;\r\n                        q3 = ah * ah;\r\n                        q4 = q2 - q3;\r\n                        q5 = Math.sqrt(q4);\r\n                        dx = q5 * wR / h;\r\n                        x5 = wR + dx;\r\n                        x7 = x3 + dx;\r\n                        q6 = aw - th;\r\n                        dh = q6 / 2;\r\n                        x4 = x5 - dh;\r\n                        x8 = x7 + dh;\r\n                        aw2 = aw / 2;\r\n                        x6 = r - aw2;\r\n                        y1 = t + ah;\r\n                        swAng = Math.atan(dx / ah);\r\n                        mswAng = -swAng;\r\n                        iy = t + idy;\r\n                        ix = (wR + x3) / 2;\r\n                        q12 = th / 2;\r\n                        dang2 = Math.atan(q12 / idy);\r\n                        swAng2 = dang2 - swAng;\r\n                        mswAng2 = -swAng2;\r\n                        stAng3 = Math.PI / 2 - swAng;\r\n                        swAng3 = swAng + dang2;\r\n                        stAng2 = Math.PI / 2 - dang2;\r\n\r\n                        var stAng2dg, swAng2dg, swAngDg, swAng2dg;\r\n                        stAng2dg = stAng2 * 180 / Math.PI;\r\n                        swAng2dg = swAng2 * 180 / Math.PI;\r\n                        stAng3dg = stAng3 * 180 / Math.PI;\r\n                        swAngDg = swAng * 180 / Math.PI;\r\n\r\n                        var d_val = //\"M\" + ix + \",\" +iy + \r\n                            shapeArc(wR, 0, wR, h, stAng2dg, stAng2dg + swAng2dg, false) + //.replace(\"M\",\"L\") +\r\n                            \" L\" + x5 + \",\" + y1 +\r\n                            \" L\" + x4 + \",\" + y1 +\r\n                            \" L\" + x6 + \",\" + t +\r\n                            \" L\" + x8 + \",\" + y1 +\r\n                            \" L\" + x7 + \",\" + y1 +\r\n                            shapeArc(x3, 0, wR, h, stAng3dg, stAng3dg + swAngDg, false).replace(\"M\", \"L\") +\r\n                            \" L\" + wR + \",\" + b +\r\n                            shapeArc(wR, 0, wR, h, cd4, cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + th + \",\" + t +\r\n                            shapeArc(x3, 0, wR, h, cd2, cd4, false).replace(\"M\", \"L\") +\r\n                            \"\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"mathDivide\":\r\n                    case \"mathEqual\":\r\n                    case \"mathMinus\":\r\n                    case \"mathMultiply\":\r\n                    case \"mathNotEqual\":\r\n                    case \"mathPlus\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1;\r\n                        var sAdj2, adj2;\r\n                        var sAdj3, adj3;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            if (shapAdjst_ary.constructor === Array) {\r\n                                for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                    var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                    if (sAdj_name == \"adj1\") {\r\n                                        sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                        adj1 = parseInt(sAdj1.substr(4));\r\n                                    } else if (sAdj_name == \"adj2\") {\r\n                                        sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                        adj2 = parseInt(sAdj2.substr(4));\r\n                                    } else if (sAdj_name == \"adj3\") {\r\n                                        sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                        adj3 = parseInt(sAdj3.substr(4));\r\n                                    }\r\n                                }\r\n                            } else {\r\n                                sAdj1 = getTextByPathList(shapAdjst_ary, [\"attrs\", \"fmla\"]);\r\n                                adj1 = parseInt(sAdj1.substr(4));\r\n                            }\r\n                        }\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var cnstVal3 = 200000 * 96 / 914400;\r\n                        var dVal;\r\n                        var hc = w / 2, vc = h / 2, hd2 = h / 2;\r\n                        if (shapType == \"mathNotEqual\") {\r\n                            if (shapAdjst_ary === undefined) {\r\n                                adj1 = 23520 * 96 / 914400;\r\n                                adj2 = 110 * Math.PI / 180;\r\n                                adj3 = 11760 * 96 / 914400;\r\n                            } else {\r\n                                adj1 = adj1 * 96 / 914400;\r\n                                adj2 = (adj2 / 60000) * Math.PI / 180;\r\n                                adj3 = adj3 * 96 / 914400;\r\n                            }\r\n                            var a1, crAng, a2a1, maxAdj3, a3, dy1, dy2, dx1, x1, x8, y2, y3, y1, y4,\r\n                                cadj2, xadj2, len, bhw, bhw2, x7, dx67, x6, dx57, x5, dx47, x4, dx37,\r\n                                x3, dx27, x2, rx7, rx6, rx5, rx4, rx3, rx2, dx7, rxt, lxt, rx, lx,\r\n                                dy3, dy4, ry, ly, dlx, drx, dly, dry, xC1, xC2, yC1, yC2, yC3, yC4;\r\n                            var angVal1 = 70 * Math.PI / 180, angVal2 = 110 * Math.PI / 180;\r\n                            var cnstVal4 = 73490 * 96 / 914400;\r\n                            //var cd4 = 90;\r\n                            a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal1) ? cnstVal1 : adj1;\r\n                            crAng = (adj2 < angVal1) ? angVal1 : (adj2 > angVal2) ? angVal2 : adj2;\r\n                            a2a1 = a1 * 2;\r\n                            maxAdj3 = cnstVal2 - a2a1;\r\n                            a3 = (adj3 < 0) ? 0 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                            dy1 = h * a1 / cnstVal2;\r\n                            dy2 = h * a3 / cnstVal3;\r\n                            dx1 = w * cnstVal4 / cnstVal3;\r\n                            x1 = hc - dx1;\r\n                            x8 = hc + dx1;\r\n                            y2 = vc - dy2;\r\n                            y3 = vc + dy2;\r\n                            y1 = y2 - dy1;\r\n                            y4 = y3 + dy1;\r\n                            cadj2 = crAng - Math.PI / 2;\r\n                            xadj2 = hd2 * Math.tan(cadj2);\r\n                            len = Math.sqrt(xadj2 * xadj2 + hd2 * hd2);\r\n                            bhw = len * dy1 / hd2;\r\n                            bhw2 = bhw / 2;\r\n                            x7 = hc + xadj2 - bhw2;\r\n                            dx67 = xadj2 * y1 / hd2;\r\n                            x6 = x7 - dx67;\r\n                            dx57 = xadj2 * y2 / hd2;\r\n                            x5 = x7 - dx57;\r\n                            dx47 = xadj2 * y3 / hd2;\r\n                            x4 = x7 - dx47;\r\n                            dx37 = xadj2 * y4 / hd2;\r\n                            x3 = x7 - dx37;\r\n                            dx27 = xadj2 * 2;\r\n                            x2 = x7 - dx27;\r\n                            rx7 = x7 + bhw;\r\n                            rx6 = x6 + bhw;\r\n                            rx5 = x5 + bhw;\r\n                            rx4 = x4 + bhw;\r\n                            rx3 = x3 + bhw;\r\n                            rx2 = x2 + bhw;\r\n                            dx7 = dy1 * hd2 / len;\r\n                            rxt = x7 + dx7;\r\n                            lxt = rx7 - dx7;\r\n                            rx = (cadj2 > 0) ? rxt : rx7;\r\n                            lx = (cadj2 > 0) ? x7 : lxt;\r\n                            dy3 = dy1 * xadj2 / len;\r\n                            dy4 = -dy3;\r\n                            ry = (cadj2 > 0) ? dy3 : 0;\r\n                            ly = (cadj2 > 0) ? 0 : dy4;\r\n                            dlx = w - rx;\r\n                            drx = w - lx;\r\n                            dly = h - ry;\r\n                            dry = h - ly;\r\n                            xC1 = (rx + lx) / 2;\r\n                            xC2 = (drx + dlx) / 2;\r\n                            yC1 = (ry + ly) / 2;\r\n                            yC2 = (y1 + y2) / 2;\r\n                            yC3 = (y3 + y4) / 2;\r\n                            yC4 = (dry + dly) / 2;\r\n\r\n                            dVal = \"M\" + x1 + \",\" + y1 +\r\n                                \" L\" + x6 + \",\" + y1 +\r\n                                \" L\" + lx + \",\" + ly +\r\n                                \" L\" + rx + \",\" + ry +\r\n                                \" L\" + rx6 + \",\" + y1 +\r\n                                \" L\" + x8 + \",\" + y1 +\r\n                                \" L\" + x8 + \",\" + y2 +\r\n                                \" L\" + rx5 + \",\" + y2 +\r\n                                \" L\" + rx4 + \",\" + y3 +\r\n                                \" L\" + x8 + \",\" + y3 +\r\n                                \" L\" + x8 + \",\" + y4 +\r\n                                \" L\" + rx3 + \",\" + y4 +\r\n                                \" L\" + drx + \",\" + dry +\r\n                                \" L\" + dlx + \",\" + dly +\r\n                                \" L\" + x3 + \",\" + y4 +\r\n                                \" L\" + x1 + \",\" + y4 +\r\n                                \" L\" + x1 + \",\" + y3 +\r\n                                \" L\" + x4 + \",\" + y3 +\r\n                                \" L\" + x5 + \",\" + y2 +\r\n                                \" L\" + x1 + \",\" + y2 +\r\n                                \" z\";\r\n                        } else if (shapType == \"mathDivide\") {\r\n                            if (shapAdjst_ary === undefined) {\r\n                                adj1 = 23520 * 96 / 914400;\r\n                                adj2 = 5880 * 96 / 914400;\r\n                                adj3 = 11760 * 96 / 914400;\r\n                            } else {\r\n                                adj1 = adj1 * 96 / 914400;\r\n                                adj2 = adj2 * 96 / 914400;\r\n                                adj3 = adj3 * 96 / 914400;\r\n                            }\r\n                            var a1, ma1, ma3h, ma3w, maxAdj3, a3, m4a3, maxAdj2, a2, dy1, yg, rad, dx1,\r\n                                y3, y4, a, y2, y1, y5, x1, x3, x2;\r\n                            var cnstVal4 = 1000 * 96 / 914400;\r\n                            var cnstVal5 = 36745 * 96 / 914400;\r\n                            var cnstVal6 = 73490 * 96 / 914400;\r\n                            a1 = (adj1 < cnstVal4) ? cnstVal4 : (adj1 > cnstVal5) ? cnstVal5 : adj1;\r\n                            ma1 = -a1;\r\n                            ma3h = (cnstVal6 + ma1) / 4;\r\n                            ma3w = cnstVal5 * w / h;\r\n                            maxAdj3 = (ma3h < ma3w) ? ma3h : ma3w;\r\n                            a3 = (adj3 < cnstVal4) ? cnstVal4 : (adj3 > maxAdj3) ? maxAdj3 : adj3;\r\n                            m4a3 = -4 * a3;\r\n                            maxAdj2 = cnstVal6 + m4a3 - a1;\r\n                            a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                            dy1 = h * a1 / cnstVal3;\r\n                            yg = h * a2 / cnstVal2;\r\n                            rad = h * a3 / cnstVal2;\r\n                            dx1 = w * cnstVal6 / cnstVal3;\r\n                            y3 = vc - dy1;\r\n                            y4 = vc + dy1;\r\n                            a = yg + rad;\r\n                            y2 = y3 - a;\r\n                            y1 = y2 - rad;\r\n                            y5 = h - y1;\r\n                            x1 = hc - dx1;\r\n                            x3 = hc + dx1;\r\n                            x2 = hc - rad;\r\n                            var cd4 = 90, c3d4 = 270;\r\n                            var cX1 = hc - Math.cos(c3d4 * Math.PI / 180) * rad;\r\n                            var cY1 = y1 - Math.sin(c3d4 * Math.PI / 180) * rad;\r\n                            var cX2 = hc - Math.cos(Math.PI / 2) * rad;\r\n                            var cY2 = y5 - Math.sin(Math.PI / 2) * rad;\r\n                            dVal = \"M\" + hc + \",\" + y1 +\r\n                                shapeArc(cX1, cY1, rad, rad, c3d4, c3d4 + 360, false).replace(\"M\", \"L\") +\r\n                                \" z\" +\r\n                                \" M\" + hc + \",\" + y5 +\r\n                                shapeArc(cX2, cY2, rad, rad, cd4, cd4 + 360, false).replace(\"M\", \"L\") +\r\n                                \" z\" +\r\n                                \" M\" + x1 + \",\" + y3 +\r\n                                \" L\" + x3 + \",\" + y3 +\r\n                                \" L\" + x3 + \",\" + y4 +\r\n                                \" L\" + x1 + \",\" + y4 +\r\n                                \" z\";\r\n                        } else if (shapType == \"mathEqual\") {\r\n                            if (shapAdjst_ary === undefined) {\r\n                                adj1 = 23520 * 96 / 914400;\r\n                                adj2 = 11760 * 96 / 914400;\r\n                            } else {\r\n                                adj1 = adj1 * 96 / 914400;\r\n                                adj2 = adj2 * 96 / 914400;\r\n                            }\r\n                            var cnstVal5 = 36745 * 96 / 914400;\r\n                            var cnstVal6 = 73490 * 96 / 914400;\r\n                            var a1, a2a1, mAdj2, a2, dy1, dy2, dx1, y2, y3, y1, y4, x1, x2, yC1, yC2;\r\n\r\n                            a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal5) ? cnstVal5 : adj1;\r\n                            a2a1 = a1 * 2;\r\n                            mAdj2 = cnstVal2 - a2a1;\r\n                            a2 = (adj2 < 0) ? 0 : (adj2 > mAdj2) ? mAdj2 : adj2;\r\n                            dy1 = h * a1 / cnstVal2;\r\n                            dy2 = h * a2 / cnstVal3;\r\n                            dx1 = w * cnstVal6 / cnstVal3;\r\n                            y2 = vc - dy2;\r\n                            y3 = vc + dy2;\r\n                            y1 = y2 - dy1;\r\n                            y4 = y3 + dy1;\r\n                            x1 = hc - dx1;\r\n                            x2 = hc + dx1;\r\n                            yC1 = (y1 + y2) / 2;\r\n                            yC2 = (y3 + y4) / 2;\r\n                            dVal = \"M\" + x1 + \",\" + y1 +\r\n                                \" L\" + x2 + \",\" + y1 +\r\n                                \" L\" + x2 + \",\" + y2 +\r\n                                \" L\" + x1 + \",\" + y2 +\r\n                                \" z\" +\r\n                                \"M\" + x1 + \",\" + y3 +\r\n                                \" L\" + x2 + \",\" + y3 +\r\n                                \" L\" + x2 + \",\" + y4 +\r\n                                \" L\" + x1 + \",\" + y4 +\r\n                                \" z\";\r\n                        } else if (shapType == \"mathMinus\") {\r\n                            if (shapAdjst_ary === undefined) {\r\n                                adj1 = 23520 * 96 / 914400;\r\n                            } else {\r\n                                adj1 = adj1 * 96 / 914400;\r\n                            }\r\n                            var cnstVal6 = 73490 * 96 / 914400;\r\n                            var a1, dy1, dx1, y1, y2, x1, x2;\r\n                            a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal2) ? cnstVal2 : adj1;\r\n                            dy1 = h * a1 / cnstVal3;\r\n                            dx1 = w * cnstVal6 / cnstVal3;\r\n                            y1 = vc - dy1;\r\n                            y2 = vc + dy1;\r\n                            x1 = hc - dx1;\r\n                            x2 = hc + dx1;\r\n\r\n                            dVal = \"M\" + x1 + \",\" + y1 +\r\n                                \" L\" + x2 + \",\" + y1 +\r\n                                \" L\" + x2 + \",\" + y2 +\r\n                                \" L\" + x1 + \",\" + y2 +\r\n                                \" z\";\r\n                        } else if (shapType == \"mathMultiply\") {\r\n                            if (shapAdjst_ary === undefined) {\r\n                                adj1 = 23520 * 96 / 914400;\r\n                            } else {\r\n                                adj1 = adj1 * 96 / 914400;\r\n                            }\r\n                            var cnstVal6 = 51965 * 96 / 914400;\r\n                            var a1, th, a, sa, ca, ta, dl, rw, lM, xM, yM, dxAM, dyAM,\r\n                                xA, yA, xB, yB, xBC, yBC, yC, xD, xE, yFE, xFE, xF, xL, yG, yH, yI, xC2, yC3;\r\n                            var ss = Math.min(w, h);\r\n                            a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal6) ? cnstVal6 : adj1;\r\n                            th = ss * a1 / cnstVal2;\r\n                            a = Math.atan(h / w);\r\n                            sa = 1 * Math.sin(a);\r\n                            ca = 1 * Math.cos(a);\r\n                            ta = 1 * Math.tan(a);\r\n                            dl = Math.sqrt(w * w + h * h);\r\n                            rw = dl * cnstVal6 / cnstVal2;\r\n                            lM = dl - rw;\r\n                            xM = ca * lM / 2;\r\n                            yM = sa * lM / 2;\r\n                            dxAM = sa * th / 2;\r\n                            dyAM = ca * th / 2;\r\n                            xA = xM - dxAM;\r\n                            yA = yM + dyAM;\r\n                            xB = xM + dxAM;\r\n                            yB = yM - dyAM;\r\n                            xBC = hc - xB;\r\n                            yBC = xBC * ta;\r\n                            yC = yBC + yB;\r\n                            xD = w - xB;\r\n                            xE = w - xA;\r\n                            yFE = vc - yA;\r\n                            xFE = yFE / ta;\r\n                            xF = xE - xFE;\r\n                            xL = xA + xFE;\r\n                            yG = h - yA;\r\n                            yH = h - yB;\r\n                            yI = h - yC;\r\n                            xC2 = w - xM;\r\n                            yC3 = h - yM;\r\n\r\n                            dVal = \"M\" + xA + \",\" + yA +\r\n                                \" L\" + xB + \",\" + yB +\r\n                                \" L\" + hc + \",\" + yC +\r\n                                \" L\" + xD + \",\" + yB +\r\n                                \" L\" + xE + \",\" + yA +\r\n                                \" L\" + xF + \",\" + vc +\r\n                                \" L\" + xE + \",\" + yG +\r\n                                \" L\" + xD + \",\" + yH +\r\n                                \" L\" + hc + \",\" + yI +\r\n                                \" L\" + xB + \",\" + yH +\r\n                                \" L\" + xA + \",\" + yG +\r\n                                \" L\" + xL + \",\" + vc +\r\n                                \" z\";\r\n                        } else if (shapType == \"mathPlus\") {\r\n                            if (shapAdjst_ary === undefined) {\r\n                                adj1 = 23520 * 96 / 914400;\r\n                            } else {\r\n                                adj1 = adj1 * 96 / 914400;\r\n                            }\r\n                            var cnstVal6 = 73490 * 96 / 914400;\r\n                            var ss = Math.min(w, h);\r\n                            var a1, dx1, dy1, dx2, x1, x2, x3, x4, y1, y2, y3, y4;\r\n\r\n                            a1 = (adj1 < 0) ? 0 : (adj1 > cnstVal6) ? cnstVal6 : adj1;\r\n                            dx1 = w * cnstVal6 / cnstVal3;\r\n                            dy1 = h * cnstVal6 / cnstVal3;\r\n                            dx2 = ss * a1 / cnstVal3;\r\n                            x1 = hc - dx1;\r\n                            x2 = hc - dx2;\r\n                            x3 = hc + dx2;\r\n                            x4 = hc + dx1;\r\n                            y1 = vc - dy1;\r\n                            y2 = vc - dx2;\r\n                            y3 = vc + dx2;\r\n                            y4 = vc + dy1;\r\n\r\n                            dVal = \"M\" + x1 + \",\" + y2 +\r\n                                \" L\" + x2 + \",\" + y2 +\r\n                                \" L\" + x2 + \",\" + y1 +\r\n                                \" L\" + x3 + \",\" + y1 +\r\n                                \" L\" + x3 + \",\" + y2 +\r\n                                \" L\" + x4 + \",\" + y2 +\r\n                                \" L\" + x4 + \",\" + y3 +\r\n                                \" L\" + x3 + \",\" + y3 +\r\n                                \" L\" + x3 + \",\" + y4 +\r\n                                \" L\" + x2 + \",\" + y4 +\r\n                                \" L\" + x2 + \",\" + y3 +\r\n                                \" L\" + x1 + \",\" + y3 +\r\n                                \" z\";\r\n                        }\r\n                        result += \"<path d='\" + dVal + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        //console.log(shapType);\r\n                        break;\r\n                    case \"can\":\r\n                    case \"flowChartMagneticDisk\":\r\n                    case \"flowChartMagneticDrum\":\r\n                        var shapAdjst = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\", \"attrs\", \"fmla\"]);\r\n                        var adj = 25000 * 96 / 914400;\r\n                        var cnstVal1 = 50000 * 96 / 914400;\r\n                        var cnstVal2 = 200000 * 96 / 914400;\r\n                        if (shapAdjst !== undefined) {\r\n                            adj = parseInt(shapAdjst.substr(4)) * 96 / 914400;\r\n                        }\r\n                        var ss = Math.min(w, h);\r\n                        var maxAdj, a, y1, y2, y3, dVal;\r\n                        if (shapType == \"flowChartMagneticDisk\" || shapType == \"flowChartMagneticDrum\") {\r\n                            adj = 50000 * 96 / 914400;\r\n                        }\r\n                        maxAdj = cnstVal1 * h / ss;\r\n                        a = (adj < 0) ? 0 : (adj > maxAdj) ? maxAdj : adj;\r\n                        y1 = ss * a / cnstVal2;\r\n                        y2 = y1 + y1;\r\n                        y3 = h - y1;\r\n                        var cd2 = 180, wd2 = w / 2;\r\n\r\n                        var tranglRott = \"\";\r\n                        if (shapType == \"flowChartMagneticDrum\") {\r\n                            tranglRott = \"transform='rotate(90 \" + w / 2 + \",\" + h / 2 + \")'\";\r\n                        }\r\n                        dVal = shapeArc(wd2, y1, wd2, y1, 0, cd2, false) +\r\n                            shapeArc(wd2, y1, wd2, y1, cd2, cd2 + cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + w + \",\" + y3 +\r\n                            shapeArc(wd2, y3, wd2, y1, 0, cd2, false).replace(\"M\", \"L\") +\r\n                            \" L\" + 0 + \",\" + y1;\r\n\r\n                        result += \"<path \" + tranglRott + \" d='\" + dVal + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"swooshArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var refr = 96 / 914400;\r\n                        var sAdj1, adj1 = 25000 * refr;\r\n                        var sAdj2, adj2 = 16667 * refr;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * refr;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = parseInt(sAdj2.substr(4)) * refr;\r\n                                }\r\n                            }\r\n                        }\r\n                        var cnstVal1 = 1 * refr;\r\n                        var cnstVal2 = 70000 * refr;\r\n                        var cnstVal3 = 75000 * refr;\r\n                        var cnstVal4 = 100000 * refr;\r\n                        var ss = Math.min(w, h);\r\n                        var ssd8 = ss / 8;\r\n                        var hd6 = h / 6;\r\n\r\n                        var a1, maxAdj2, a2, ad1, ad2, xB, yB, alfa, dx0, xC, dx1, yF, xF, xE, yE, dy2, dy22, dy3, yD, dy4, yP1, xP1, dy5, yP2, xP2;\r\n\r\n                        a1 = (adj1 < cnstVal1) ? cnstVal1 : (adj1 > cnstVal3) ? cnstVal3 : adj1;\r\n                        maxAdj2 = cnstVal2 * w / ss;\r\n                        a2 = (adj2 < 0) ? 0 : (adj2 > maxAdj2) ? maxAdj2 : adj2;\r\n                        ad1 = h * a1 / cnstVal4;\r\n                        ad2 = ss * a2 / cnstVal4;\r\n                        xB = w - ad2;\r\n                        yB = ssd8;\r\n                        alfa = (Math.PI / 2) / 14;\r\n                        dx0 = ssd8 * Math.tan(alfa);\r\n                        xC = xB - dx0;\r\n                        dx1 = ad1 * Math.tan(alfa);\r\n                        yF = yB + ad1;\r\n                        xF = xB + dx1;\r\n                        xE = xF + dx0;\r\n                        yE = yF + ssd8;\r\n                        dy2 = yE - 0;\r\n                        dy22 = dy2 / 2;\r\n                        dy3 = h / 20;\r\n                        yD = dy22 - dy3;\r\n                        dy4 = hd6;\r\n                        yP1 = hd6 + dy4;\r\n                        xP1 = w / 6;\r\n                        dy5 = hd6 / 2;\r\n                        yP2 = yF + dy5;\r\n                        xP2 = w / 4;\r\n\r\n                        var dVal = \"M\" + 0 + \",\" + h +\r\n                            \" Q\" + xP1 + \",\" + yP1 + \" \" + xB + \",\" + yB +\r\n                            \" L\" + xC + \",\" + 0 +\r\n                            \" L\" + w + \",\" + yD +\r\n                            \" L\" + xE + \",\" + yE +\r\n                            \" L\" + xF + \",\" + yF +\r\n                            \" Q\" + xP2 + \",\" + yP2 + \" \" + 0 + \",\" + h +\r\n                            \" z\";\r\n\r\n                        result += \"<path d='\" + dVal + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"circularArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 12500 * 96 / 914400;\r\n                        var sAdj2, adj2 = (1142319 / 60000) * Math.PI / 180;\r\n                        var sAdj3, adj3 = (20457681 / 60000) * Math.PI / 180;\r\n                        var sAdj4, adj4 = (10800000 / 60000) * Math.PI / 180;\r\n                        var sAdj5, adj5 = 12500 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = (parseInt(sAdj2.substr(4)) / 60000) * Math.PI / 180;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = (parseInt(sAdj3.substr(4)) / 60000) * Math.PI / 180;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = (parseInt(sAdj4.substr(4)) / 60000) * Math.PI / 180;\r\n                                } else if (sAdj_name == \"adj5\") {\r\n                                    sAdj5 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj5 = parseInt(sAdj5.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, r = w, b = h, l = 0, t = 0, wd2 = w / 2, hd2 = h / 2;\r\n                        var ss = Math.min(w, h);\r\n                        var a5, maxAdj1, a1, enAng, stAng, th, thh, th2, rw1, rh1, rw2, rh2, rw3, rh3, wtH, htH, dxH,\r\n                            dyH, xH, yH, rI, u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15, u16, u17,\r\n                            u18, u19, u20, u21, maxAng, aAng, ptAng, wtA, htA, dxA, dyA, xA, yA, wtE, htE, dxE, dyE, xE, yE,\r\n                            dxG, dyG, xG, yG, dxB, dyB, xB, yB, sx1, sy1, sx2, sy2, rO, x1O, y1O, x2O, y2O, dxO, dyO, dO,\r\n                            q1, q2, DO, q3, q4, q5, q6, q7, q8, sdelO, ndyO, sdyO, q9, q10, q11, dxF1, q12, dxF2, adyO,\r\n                            q13, q14, dyF1, q15, dyF2, q16, q17, q18, q19, q20, q21, q22, dxF, dyF, sdxF, sdyF, xF, yF,\r\n                            x1I, y1I, x2I, y2I, dxI, dyI, dI, v1, v2, DI, v3, v4, v5, v6, v7, v8, sdelI, v9, v10, v11,\r\n                            dxC1, v12, dxC2, adyI, v13, v14, dyC1, v15, dyC2, v16, v17, v18, v19, v20, v21, v22, dxC, dyC,\r\n                            sdxC, sdyC, xC, yC, ist0, ist1, istAng, isw1, isw2, iswAng, p1, p2, p3, p4, p5, xGp, yGp,\r\n                            xBp, yBp, en0, en1, en2, sw0, sw1, swAng;\r\n                        var cnstVal1 = 25000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var rdAngVal1 = (1 / 60000) * Math.PI / 180;\r\n                        var rdAngVal2 = (21599999 / 60000) * Math.PI / 180;\r\n                        var rdAngVal3 = 2 * Math.PI;\r\n\r\n                        a5 = (adj5 < 0) ? 0 : (adj5 > cnstVal1) ? cnstVal1 : adj5;\r\n                        maxAdj1 = a5 * 2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        enAng = (adj3 < rdAngVal1) ? rdAngVal1 : (adj3 > rdAngVal2) ? rdAngVal2 : adj3;\r\n                        stAng = (adj4 < 0) ? 0 : (adj4 > rdAngVal2) ? rdAngVal2 : adj4; //////////////////////////////////////////\r\n                        th = ss * a1 / cnstVal2;\r\n                        thh = ss * a5 / cnstVal2;\r\n                        th2 = th / 2;\r\n                        rw1 = wd2 + th2 - thh;\r\n                        rh1 = hd2 + th2 - thh;\r\n                        rw2 = rw1 - th;\r\n                        rh2 = rh1 - th;\r\n                        rw3 = rw2 + th2;\r\n                        rh3 = rh2 + th2;\r\n                        wtH = rw3 * Math.sin(enAng);\r\n                        htH = rh3 * Math.cos(enAng);\r\n\r\n                        //dxH = rw3*Math.cos(Math.atan(wtH/htH));\r\n                        //dyH = rh3*Math.sin(Math.atan(wtH/htH));\r\n                        dxH = rw3 * Math.cos(Math.atan2(wtH, htH));\r\n                        dyH = rh3 * Math.sin(Math.atan2(wtH, htH));\r\n\r\n                        xH = hc + dxH;\r\n                        yH = vc + dyH;\r\n                        rI = (rw2 < rh2) ? rw2 : rh2;\r\n                        u1 = dxH * dxH;\r\n                        u2 = dyH * dyH;\r\n                        u3 = rI * rI;\r\n                        u4 = u1 - u3;\r\n                        u5 = u2 - u3;\r\n                        u6 = u4 * u5 / u1;\r\n                        u7 = u6 / u2;\r\n                        u8 = 1 - u7;\r\n                        u9 = Math.sqrt(u8);\r\n                        u10 = u4 / dxH;\r\n                        u11 = u10 / dyH;\r\n                        u12 = (1 + u9) / u11;\r\n\r\n                        //u13 = Math.atan(u12/1);\r\n                        u13 = Math.atan2(u12, 1);\r\n\r\n                        u14 = u13 + rdAngVal3;\r\n                        u15 = (u13 > 0) ? u13 : u14;\r\n                        u16 = u15 - enAng;\r\n                        u17 = u16 + rdAngVal3;\r\n                        u18 = (u16 > 0) ? u16 : u17;\r\n                        u19 = u18 - cd2;\r\n                        u20 = u18 - rdAngVal3;\r\n                        u21 = (u19 > 0) ? u20 : u18;\r\n                        maxAng = Math.abs(u21);\r\n                        aAng = (adj2 < 0) ? 0 : (adj2 > maxAng) ? maxAng : adj2;\r\n                        ptAng = enAng + aAng;\r\n                        wtA = rw3 * Math.sin(ptAng);\r\n                        htA = rh3 * Math.cos(ptAng);\r\n                        //dxA = rw3*Math.cos(Math.atan(wtA/htA));\r\n                        //dyA = rh3*Math.sin(Math.atan(wtA/htA));\r\n                        dxA = rw3 * Math.cos(Math.atan2(wtA, htA));\r\n                        dyA = rh3 * Math.sin(Math.atan2(wtA, htA));\r\n\r\n                        xA = hc + dxA;\r\n                        yA = vc + dyA;\r\n                        wtE = rw1 * Math.sin(stAng);\r\n                        htE = rh1 * Math.cos(stAng);\r\n\r\n                        //dxE = rw1*Math.cos(Math.atan(wtE/htE));\r\n                        //dyE = rh1*Math.sin(Math.atan(wtE/htE));\r\n                        dxE = rw1 * Math.cos(Math.atan2(wtE, htE));\r\n                        dyE = rh1 * Math.sin(Math.atan2(wtE, htE));\r\n\r\n                        xE = hc + dxE;\r\n                        yE = vc + dyE;\r\n                        dxG = thh * Math.cos(ptAng);\r\n                        dyG = thh * Math.sin(ptAng);\r\n                        xG = xH + dxG;\r\n                        yG = yH + dyG;\r\n                        dxB = thh * Math.cos(ptAng);\r\n                        dyB = thh * Math.sin(ptAng);\r\n                        xB = xH - dxB;\r\n                        yB = yH - dyB;\r\n                        sx1 = xB - hc;\r\n                        sy1 = yB - vc;\r\n                        sx2 = xG - hc;\r\n                        sy2 = yG - vc;\r\n                        rO = (rw1 < rh1) ? rw1 : rh1;\r\n                        x1O = sx1 * rO / rw1;\r\n                        y1O = sy1 * rO / rh1;\r\n                        x2O = sx2 * rO / rw1;\r\n                        y2O = sy2 * rO / rh1;\r\n                        dxO = x2O - x1O;\r\n                        dyO = y2O - y1O;\r\n                        dO = Math.sqrt(dxO * dxO + dyO * dyO);\r\n                        q1 = x1O * y2O;\r\n                        q2 = x2O * y1O;\r\n                        DO = q1 - q2;\r\n                        q3 = rO * rO;\r\n                        q4 = dO * dO;\r\n                        q5 = q3 * q4;\r\n                        q6 = DO * DO;\r\n                        q7 = q5 - q6;\r\n                        q8 = (q7 > 0) ? q7 : 0;\r\n                        sdelO = Math.sqrt(q8);\r\n                        ndyO = dyO * -1;\r\n                        sdyO = (ndyO > 0) ? -1 : 1;\r\n                        q9 = sdyO * dxO;\r\n                        q10 = q9 * sdelO;\r\n                        q11 = DO * dyO;\r\n                        dxF1 = (q11 + q10) / q4;\r\n                        q12 = q11 - q10;\r\n                        dxF2 = q12 / q4;\r\n                        adyO = Math.abs(dyO);\r\n                        q13 = adyO * sdelO;\r\n                        q14 = DO * dxO / -1;\r\n                        dyF1 = (q14 + q13) / q4;\r\n                        q15 = q14 - q13;\r\n                        dyF2 = q15 / q4;\r\n                        q16 = x2O - dxF1;\r\n                        q17 = x2O - dxF2;\r\n                        q18 = y2O - dyF1;\r\n                        q19 = y2O - dyF2;\r\n                        q20 = Math.sqrt(q16 * q16 + q18 * q18);\r\n                        q21 = Math.sqrt(q17 * q17 + q19 * q19);\r\n                        q22 = q21 - q20;\r\n                        dxF = (q22 > 0) ? dxF1 : dxF2;\r\n                        dyF = (q22 > 0) ? dyF1 : dyF2;\r\n                        sdxF = dxF * rw1 / rO;\r\n                        sdyF = dyF * rh1 / rO;\r\n                        xF = hc + sdxF;\r\n                        yF = vc + sdyF;\r\n                        x1I = sx1 * rI / rw2;\r\n                        y1I = sy1 * rI / rh2;\r\n                        x2I = sx2 * rI / rw2;\r\n                        y2I = sy2 * rI / rh2;\r\n                        dxI = x2I - x1I;\r\n                        dyI = y2I - y1I;\r\n                        dI = Math.sqrt(dxI * dxI + dyI * dyI);\r\n                        v1 = x1I * y2I;\r\n                        v2 = x2I * y1I;\r\n                        DI = v1 - v2;\r\n                        v3 = rI * rI;\r\n                        v4 = dI * dI;\r\n                        v5 = v3 * v4;\r\n                        v6 = DI * DI;\r\n                        v7 = v5 - v6;\r\n                        v8 = (v7 > 0) ? v7 : 0;\r\n                        sdelI = Math.sqrt(v8);\r\n                        v9 = sdyO * dxI;\r\n                        v10 = v9 * sdelI;\r\n                        v11 = DI * dyI;\r\n                        dxC1 = (v11 + v10) / v4;\r\n                        v12 = v11 - v10;\r\n                        dxC2 = v12 / v4;\r\n                        adyI = Math.abs(dyI);\r\n                        v13 = adyI * sdelI;\r\n                        v14 = DI * dxI / -1;\r\n                        dyC1 = (v14 + v13) / v4;\r\n                        v15 = v14 - v13;\r\n                        dyC2 = v15 / v4;\r\n                        v16 = x1I - dxC1;\r\n                        v17 = x1I - dxC2;\r\n                        v18 = y1I - dyC1;\r\n                        v19 = y1I - dyC2;\r\n                        v20 = Math.sqrt(v16 * v16 + v18 * v18);\r\n                        v21 = Math.sqrt(v17 * v17 + v19 * v19);\r\n                        v22 = v21 - v20;\r\n                        dxC = (v22 > 0) ? dxC1 : dxC2;\r\n                        dyC = (v22 > 0) ? dyC1 : dyC2;\r\n                        sdxC = dxC * rw2 / rI;\r\n                        sdyC = dyC * rh2 / rI;\r\n                        xC = hc + sdxC;\r\n                        yC = vc + sdyC;\r\n\r\n                        //ist0 = Math.atan(sdyC/sdxC);\r\n                        ist0 = Math.atan2(sdyC, sdxC);\r\n\r\n                        ist1 = ist0 + rdAngVal3;\r\n                        istAng = (ist0 > 0) ? ist0 : ist1;\r\n                        isw1 = stAng - istAng;\r\n                        isw2 = isw1 - rdAngVal3;\r\n                        iswAng = (isw1 > 0) ? isw2 : isw1;\r\n                        p1 = xF - xC;\r\n                        p2 = yF - yC;\r\n                        p3 = Math.sqrt(p1 * p1 + p2 * p2);\r\n                        p4 = p3 / 2;\r\n                        p5 = p4 - thh;\r\n                        xGp = (p5 > 0) ? xF : xG;\r\n                        yGp = (p5 > 0) ? yF : yG;\r\n                        xBp = (p5 > 0) ? xC : xB;\r\n                        yBp = (p5 > 0) ? yC : yB;\r\n\r\n                        //en0 = Math.atan(sdyF/sdxF);\r\n                        en0 = Math.atan2(sdyF, sdxF);\r\n\r\n                        en1 = en0 + rdAngVal3;\r\n                        en2 = (en0 > 0) ? en0 : en1;\r\n                        sw0 = en2 - stAng;\r\n                        sw1 = sw0 + rdAngVal3;\r\n                        swAng = (sw0 > 0) ? sw0 : sw1;\r\n\r\n                        var strtAng = stAng * 180 / Math.PI\r\n                        var endAng = strtAng + (swAng * 180 / Math.PI);\r\n                        var stiAng = istAng * 180 / Math.PI;\r\n                        var swiAng = iswAng * 180 / Math.PI;\r\n                        var ediAng = stiAng + swiAng;\r\n\r\n                        var d_val = shapeArc(w / 2, h / 2, rw1, rh1, strtAng, endAng, false) +\r\n                            \" L\" + xGp + \",\" + yGp +\r\n                            \" L\" + xA + \",\" + yA +\r\n                            \" L\" + xBp + \",\" + yBp +\r\n                            \" L\" + xC + \",\" + yC +\r\n                            shapeArc(w / 2, h / 2, rw2, rh2, stiAng, ediAng, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"leftCircularArrow\":\r\n                        var shapAdjst_ary = getTextByPathList(node, [\"p:spPr\", \"a:prstGeom\", \"a:avLst\", \"a:gd\"]);\r\n                        var sAdj1, adj1 = 12500 * 96 / 914400;\r\n                        var sAdj2, adj2 = (-1142319 / 60000) * Math.PI / 180;\r\n                        var sAdj3, adj3 = (1142319 / 60000) * Math.PI / 180;\r\n                        var sAdj4, adj4 = (10800000 / 60000) * Math.PI / 180;\r\n                        var sAdj5, adj5 = 12500 * 96 / 914400;\r\n                        if (shapAdjst_ary !== undefined) {\r\n                            for (var i = 0; i < shapAdjst_ary.length; i++) {\r\n                                var sAdj_name = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"name\"]);\r\n                                if (sAdj_name == \"adj1\") {\r\n                                    sAdj1 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj1 = parseInt(sAdj1.substr(4)) * 96 / 914400;\r\n                                } else if (sAdj_name == \"adj2\") {\r\n                                    sAdj2 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj2 = (parseInt(sAdj2.substr(4)) / 60000) * Math.PI / 180;\r\n                                } else if (sAdj_name == \"adj3\") {\r\n                                    sAdj3 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj3 = (parseInt(sAdj3.substr(4)) / 60000) * Math.PI / 180;\r\n                                } else if (sAdj_name == \"adj4\") {\r\n                                    sAdj4 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj4 = (parseInt(sAdj4.substr(4)) / 60000) * Math.PI / 180;\r\n                                } else if (sAdj_name == \"adj5\") {\r\n                                    sAdj5 = getTextByPathList(shapAdjst_ary[i], [\"attrs\", \"fmla\"]);\r\n                                    adj5 = parseInt(sAdj5.substr(4)) * 96 / 914400;\r\n                                }\r\n                            }\r\n                        }\r\n                        var vc = h / 2, hc = w / 2, r = w, b = h, l = 0, t = 0, wd2 = w / 2, hd2 = h / 2;\r\n                        var ss = Math.min(w, h);\r\n                        var cnstVal1 = 25000 * 96 / 914400;\r\n                        var cnstVal2 = 100000 * 96 / 914400;\r\n                        var rdAngVal1 = (1 / 60000) * Math.PI / 180;\r\n                        var rdAngVal2 = (21599999 / 60000) * Math.PI / 180;\r\n                        var rdAngVal3 = 2 * Math.PI;\r\n                        var a5, maxAdj1, a1, enAng, stAng, th, thh, th2, rw1, rh1, rw2, rh2, rw3, rh3, wtH, htH, dxH, dyH, xH, yH, rI,\r\n                            u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15, u16, u17, u18, u19, u20, u21, u22,\r\n                            minAng, u23, a2, aAng, ptAng, wtA, htA, dxA, dyA, xA, yA, wtE, htE, dxE, dyE, xE, yE, wtD, htD, dxD, dyD,\r\n                            xD, yD, dxG, dyG, xG, yG, dxB, dyB, xB, yB, sx1, sy1, sx2, sy2, rO, x1O, y1O, x2O, y2O, dxO, dyO, dO,\r\n                            q1, q2, DO, q3, q4, q5, q6, q7, q8, sdelO, ndyO, sdyO, q9, q10, q11, dxF1, q12, dxF2, adyO, q13, q14, dyF1,\r\n                            q15, dyF2, q16, q17, q18, q19, q20, q21, q22, dxF, dyF, sdxF, sdyF, xF, yF, x1I, y1I, x2I, y2I, dxI, dyI, dI,\r\n                            v1, v2, DI, v3, v4, v5, v6, v7, v8, sdelI, v9, v10, v11, dxC1, v12, dxC2, adyI, v13, v14, dyC1, v15, dyC2, v16,\r\n                            v17, v18, v19, v20, v21, v22, dxC, dyC, sdxC, sdyC, xC, yC, ist0, ist1, istAng0, isw1, isw2, iswAng0, istAng,\r\n                            iswAng, p1, p2, p3, p4, p5, xGp, yGp, xBp, yBp, en0, en1, en2, sw0, sw1, swAng, stAng0;\r\n\r\n                        a5 = (adj5 < 0) ? 0 : (adj5 > cnstVal1) ? cnstVal1 : adj5;\r\n                        maxAdj1 = a5 * 2;\r\n                        a1 = (adj1 < 0) ? 0 : (adj1 > maxAdj1) ? maxAdj1 : adj1;\r\n                        enAng = (adj3 < rdAngVal1) ? rdAngVal1 : (adj3 > rdAngVal2) ? rdAngVal2 : adj3;\r\n                        stAng = (adj4 < 0) ? 0 : (adj4 > rdAngVal2) ? rdAngVal2 : adj4;\r\n                        th = ss * a1 / cnstVal2;\r\n                        thh = ss * a5 / cnstVal2;\r\n                        th2 = th / 2;\r\n                        rw1 = wd2 + th2 - thh;\r\n                        rh1 = hd2 + th2 - thh;\r\n                        rw2 = rw1 - th;\r\n                        rh2 = rh1 - th;\r\n                        rw3 = rw2 + th2;\r\n                        rh3 = rh2 + th2;\r\n                        wtH = rw3 * Math.sin(enAng);\r\n                        htH = rh3 * Math.cos(enAng);\r\n                        dxH = rw3 * Math.cos(Math.atan2(wtH, htH));\r\n                        dyH = rh3 * Math.sin(Math.atan2(wtH, htH));\r\n                        xH = hc + dxH;\r\n                        yH = vc + dyH;\r\n                        rI = (rw2 < rh2) ? rw2 : rh2;\r\n                        u1 = dxH * dxH;\r\n                        u2 = dyH * dyH;\r\n                        u3 = rI * rI;\r\n                        u4 = u1 - u3;\r\n                        u5 = u2 - u3;\r\n                        u6 = u4 * u5 / u1;\r\n                        u7 = u6 / u2;\r\n                        u8 = 1 - u7;\r\n                        u9 = Math.sqrt(u8);\r\n                        u10 = u4 / dxH;\r\n                        u11 = u10 / dyH;\r\n                        u12 = (1 + u9) / u11;\r\n                        u13 = Math.atan2(u12, 1);\r\n                        u14 = u13 + rdAngVal3;\r\n                        u15 = (u13 > 0) ? u13 : u14;\r\n                        u16 = u15 - enAng;\r\n                        u17 = u16 + rdAngVal3;\r\n                        u18 = (u16 > 0) ? u16 : u17;\r\n                        u19 = u18 - cd2;\r\n                        u20 = u18 - rdAngVal3;\r\n                        u21 = (u19 > 0) ? u20 : u18;\r\n                        u22 = Math.abs(u21);\r\n                        minAng = u22 * -1;\r\n                        u23 = Math.abs(adj2);\r\n                        a2 = u23 * -1;\r\n                        aAng = (a2 < minAng) ? minAng : (a2 > 0) ? 0 : a2;\r\n                        ptAng = enAng + aAng;\r\n                        wtA = rw3 * Math.sin(ptAng);\r\n                        htA = rh3 * Math.cos(ptAng);\r\n                        dxA = rw3 * Math.cos(Math.atan2(wtA, htA));\r\n                        dyA = rh3 * Math.sin(Math.atan2(wtA, htA));\r\n                        xA = hc + dxA;\r\n                        yA = vc + dyA;\r\n                        wtE = rw1 * Math.sin(stAng);\r\n                        htE = rh1 * Math.cos(stAng);\r\n                        dxE = rw1 * Math.cos(Math.atan2(wtE, htE));\r\n                        dyE = rh1 * Math.sin(Math.atan2(wtE, htE));\r\n                        xE = hc + dxE;\r\n                        yE = vc + dyE;\r\n                        wtD = rw2 * Math.sin(stAng);\r\n                        htD = rh2 * Math.cos(stAng);\r\n                        dxD = rw2 * Math.cos(Math.atan2(wtD, htD));\r\n                        dyD = rh2 * Math.sin(Math.atan2(wtD, htD));\r\n                        xD = hc + dxD;\r\n                        yD = vc + dyD;\r\n                        dxG = thh * Math.cos(ptAng);\r\n                        dyG = thh * Math.sin(ptAng);\r\n                        xG = xH + dxG;\r\n                        yG = yH + dyG;\r\n                        dxB = thh * Math.cos(ptAng);\r\n                        dyB = thh * Math.sin(ptAng);\r\n                        xB = xH - dxB;\r\n                        yB = yH - dyB;\r\n                        sx1 = xB - hc;\r\n                        sy1 = yB - vc;\r\n                        sx2 = xG - hc;\r\n                        sy2 = yG - vc;\r\n                        rO = (rw1 < rh1) ? rw1 : rh1;\r\n                        x1O = sx1 * rO / rw1;\r\n                        y1O = sy1 * rO / rh1;\r\n                        x2O = sx2 * rO / rw1;\r\n                        y2O = sy2 * rO / rh1;\r\n                        dxO = x2O - x1O;\r\n                        dyO = y2O - y1O;\r\n                        dO = Math.sqrt(dxO * dxO + dyO * dyO);\r\n                        q1 = x1O * y2O;\r\n                        q2 = x2O * y1O;\r\n                        DO = q1 - q2;\r\n                        q3 = rO * rO;\r\n                        q4 = dO * dO;\r\n                        q5 = q3 * q4;\r\n                        q6 = DO * DO;\r\n                        q7 = q5 - q6;\r\n                        q8 = (q7 > 0) ? q7 : 0;\r\n                        sdelO = Math.sqrt(q8);\r\n                        ndyO = dyO * -1;\r\n                        sdyO = (ndyO > 0) ? -1 : 1;\r\n                        q9 = sdyO * dxO;\r\n                        q10 = q9 * sdelO;\r\n                        q11 = DO * dyO;\r\n                        dxF1 = (q11 + q10) / q4;\r\n                        q12 = q11 - q10;\r\n                        dxF2 = q12 / q4;\r\n                        adyO = Math.abs(dyO);\r\n                        q13 = adyO * sdelO;\r\n                        q14 = DO * dxO / -1;\r\n                        dyF1 = (q14 + q13) / q4;\r\n                        q15 = q14 - q13;\r\n                        dyF2 = q15 / q4;\r\n                        q16 = x2O - dxF1;\r\n                        q17 = x2O - dxF2;\r\n                        q18 = y2O - dyF1;\r\n                        q19 = y2O - dyF2;\r\n                        q20 = Math.sqrt(q16 * q16 + q18 * q18);\r\n                        q21 = Math.sqrt(q17 * q17 + q19 * q19);\r\n                        q22 = q21 - q20;\r\n                        dxF = (q22 > 0) ? dxF1 : dxF2;\r\n                        dyF = (q22 > 0) ? dyF1 : dyF2;\r\n                        sdxF = dxF * rw1 / rO;\r\n                        sdyF = dyF * rh1 / rO;\r\n                        xF = hc + sdxF;\r\n                        yF = vc + sdyF;\r\n                        x1I = sx1 * rI / rw2;\r\n                        y1I = sy1 * rI / rh2;\r\n                        x2I = sx2 * rI / rw2;\r\n                        y2I = sy2 * rI / rh2;\r\n                        dxI = x2I - x1I;\r\n                        dyI = y2I - y1I;\r\n                        dI = Math.sqrt(dxI * dxI + dyI * dyI);\r\n                        v1 = x1I * y2I;\r\n                        v2 = x2I * y1I;\r\n                        DI = v1 - v2;\r\n                        v3 = rI * rI;\r\n                        v4 = dI * dI;\r\n                        v5 = v3 * v4;\r\n                        v6 = DI * DI;\r\n                        v7 = v5 - v6;\r\n                        v8 = (v7 > 0) ? v7 : 0;\r\n                        sdelI = Math.sqrt(v8);\r\n                        v9 = sdyO * dxI;\r\n                        v10 = v9 * sdelI;\r\n                        v11 = DI * dyI;\r\n                        dxC1 = (v11 + v10) / v4;\r\n                        v12 = v11 - v10;\r\n                        dxC2 = v12 / v4;\r\n                        adyI = Math.abs(dyI);\r\n                        v13 = adyI * sdelI;\r\n                        v14 = DI * dxI / -1;\r\n                        dyC1 = (v14 + v13) / v4;\r\n                        v15 = v14 - v13;\r\n                        dyC2 = v15 / v4;\r\n                        v16 = x1I - dxC1;\r\n                        v17 = x1I - dxC2;\r\n                        v18 = y1I - dyC1;\r\n                        v19 = y1I - dyC2;\r\n                        v20 = Math.sqrt(v16 * v16 + v18 * v18);\r\n                        v21 = Math.sqrt(v17 * v17 + v19 * v19);\r\n                        v22 = v21 - v20;\r\n                        dxC = (v22 > 0) ? dxC1 : dxC2;\r\n                        dyC = (v22 > 0) ? dyC1 : dyC2;\r\n                        sdxC = dxC * rw2 / rI;\r\n                        sdyC = dyC * rh2 / rI;\r\n                        xC = hc + sdxC;\r\n                        yC = vc + sdyC;\r\n                        ist0 = Math.atan2(sdyC, sdxC);\r\n                        ist1 = ist0 + rdAngVal3;\r\n                        istAng0 = (ist0 > 0) ? ist0 : ist1;\r\n                        isw1 = stAng - istAng0;\r\n                        isw2 = isw1 + rdAngVal3;\r\n                        iswAng0 = (isw1 > 0) ? isw1 : isw2;\r\n                        istAng = istAng0 + iswAng0;\r\n                        iswAng = -iswAng0;\r\n                        p1 = xF - xC;\r\n                        p2 = yF - yC;\r\n                        p3 = Math.sqrt(p1 * p1 + p2 * p2);\r\n                        p4 = p3 / 2;\r\n                        p5 = p4 - thh;\r\n                        xGp = (p5 > 0) ? xF : xG;\r\n                        yGp = (p5 > 0) ? yF : yG;\r\n                        xBp = (p5 > 0) ? xC : xB;\r\n                        yBp = (p5 > 0) ? yC : yB;\r\n                        en0 = Math.atan2(sdyF, sdxF);\r\n                        en1 = en0 + rdAngVal3;\r\n                        en2 = (en0 > 0) ? en0 : en1;\r\n                        sw0 = en2 - stAng;\r\n                        sw1 = sw0 - rdAngVal3;\r\n                        swAng = (sw0 > 0) ? sw1 : sw0;\r\n                        stAng0 = stAng + swAng;\r\n\r\n                        var strtAng = stAng0 * 180 / Math.PI;\r\n                        var endAng = stAng * 180 / Math.PI;\r\n                        var stiAng = istAng * 180 / Math.PI;\r\n                        var swiAng = iswAng * 180 / Math.PI;\r\n                        var ediAng = stiAng + swiAng;\r\n\r\n                        var d_val = \"M\" + xE + \",\" + yE +\r\n                            \" L\" + xD + \",\" + yD +\r\n                            shapeArc(w / 2, h / 2, rw2, rh2, stiAng, ediAng, false).replace(\"M\", \"L\") +\r\n                            \" L\" + xBp + \",\" + yBp +\r\n                            \" L\" + xA + \",\" + yA +\r\n                            \" L\" + xGp + \",\" + yGp +\r\n                            \" L\" + xF + \",\" + yF +\r\n                            shapeArc(w / 2, h / 2, rw1, rh1, strtAng, endAng, false).replace(\"M\", \"L\") +\r\n                            \" z\";\r\n                        result += \"<path d='\" + d_val + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                            \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' />\";\r\n\r\n                        break;\r\n                    case \"leftRightCircularArrow\":\r\n                    case \"chartPlus\":\r\n                    case \"chartStar\":\r\n                    case \"chartX\":\r\n                    case \"cornerTabs\":\r\n                    case \"flowChartOfflineStorage\":\r\n                    case \"folderCorner\":\r\n                    case \"funnel\":\r\n                    case \"lineInv\":\r\n                    case \"nonIsoscelesTrapezoid\":\r\n                    case \"plaqueTabs\":\r\n                    case \"squareTabs\":\r\n                    case \"upDownArrowCallout\":\r\n                        console.log(shapType, \" -unsupported shape type.\");\r\n                        break;\r\n                    case undefined:\r\n                    default:\r\n                        console.warn(\"Undefine shape type.(\" + shapType + \")\");\r\n                }\r\n\r\n                result += \"</svg>\";\r\n\r\n                result += \"<div class='block content \" + getVerticalAlign(node, slideLayoutSpNode, slideMasterSpNode, type) +\r\n                    \"' _id='\" + id + \"' _idx='\" + idx + \"' _type='\" + type + \"' _name='\" + name +\r\n                    \"' style='\" +\r\n                    getPosition(slideXfrmNode, slideLayoutXfrmNode, slideMasterXfrmNode) +\r\n                    getSize(slideXfrmNode, slideLayoutXfrmNode, slideMasterXfrmNode) +\r\n                    \" z-index: \" + order + \";\" +\r\n                    \"transform: rotate(\" + txtRotate + \"deg);\" +\r\n                    \"'>\";\r\n\r\n                // TextBody\r\n                if (node[\"p:txBody\"] !== undefined) {\r\n                    result += genTextBody(node[\"p:txBody\"], node, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                }\r\n                result += \"</div>\";\r\n            } else if (custShapType !== undefined) {\r\n                //custGeom here - Amir ///////////////////////////////////////////////////////\r\n                //http://officeopenxml.com/drwSp-custGeom.php\r\n                var pathLstNode = getTextByPathList(custShapType, [\"a:pathLst\"]);\r\n                var pathNode = getTextByPathList(pathLstNode, [\"a:path\", \"attrs\"]);\r\n                var maxX = parseInt(pathNode[\"w\"]) * 96 / 914400;\r\n                var maxY = parseInt(pathNode[\"h\"]) * 96 / 914400;\r\n                //console.log(\"w = \"+w+\"\\nh = \"+h+\"\\nmaxX = \"+maxX +\"\\nmaxY = \" + maxY);\r\n                //cheke if it is close shape\r\n                var closeNode = getTextByPathList(pathLstNode, [\"a:path\", \"a:close\"]);\r\n                var startPoint = getTextByPathList(pathLstNode, [\"a:path\", \"a:moveTo\", \"a:pt\", \"attrs\"]);\r\n                var spX = parseInt(startPoint[\"x\"]) * 96 / 914400;\r\n                var spY = parseInt(startPoint[\"y\"]) * 96 / 914400;\r\n                var d = \"M\" + spX + \",\" + spY;\r\n                var pathNodes = getTextByPathList(pathLstNode, [\"a:path\"]);\r\n                var lnToNodes = pathNodes[\"a:lnTo\"];\r\n                var cubicBezToNodes = pathNodes[\"a:cubicBezTo\"];\r\n                var arcToNodes = pathNodes[\"a:arcTo\"];\r\n                var sortblAry = [];\r\n                if (lnToNodes !== undefined) {\r\n                    Object.keys(lnToNodes).forEach(function (key) {\r\n                        var lnToPtNode = lnToNodes[key][\"a:pt\"];\r\n                        if (lnToPtNode !== undefined) {\r\n                            Object.keys(lnToPtNode).forEach(function (key2) {\r\n                                var ptObj = {};\r\n                                var lnToNoPt = lnToPtNode[key2];\r\n                                var ptX = lnToNoPt[\"attrs\", \"x\"];\r\n                                var ptY = lnToNoPt[\"attrs\", \"y\"];\r\n                                var ptOrdr = lnToNoPt[\"attrs\", \"order\"];\r\n                                ptObj.type = \"lnto\";\r\n                                ptObj.order = ptOrdr;\r\n                                ptObj.x = ptX;\r\n                                ptObj.y = ptY;\r\n                                sortblAry.push(ptObj);\r\n                                //console.log(key2, lnToNoPt);\r\n\r\n                            });\r\n                        }\r\n                    });\r\n\r\n                }\r\n                if (cubicBezToNodes !== undefined) {\r\n                    Object.keys(cubicBezToNodes).forEach(function (key) {\r\n                        //console.log(\"cubicBezTo[\"+key+\"]:\");\r\n                        var cubicBezToPtNodes = cubicBezToNodes[key][\"a:pt\"];\r\n                        if (cubicBezToPtNodes !== undefined) {\r\n                            Object.keys(cubicBezToPtNodes).forEach(function (key2) {\r\n                                //console.log(\"cubicBezTo[\"+key+\"]pt[\"+key2+\"]:\");\r\n                                var cubBzPts = cubicBezToPtNodes[key2];\r\n                                Object.keys(cubBzPts).forEach(function (key3) {\r\n                                    //console.log(key3, cubBzPts[key3]);\r\n                                    var ptObj = {};\r\n                                    var cubBzPt = cubBzPts[key3];\r\n                                    var ptX = cubBzPt[\"attrs\", \"x\"];\r\n                                    var ptY = cubBzPt[\"attrs\", \"y\"];\r\n                                    var ptOrdr = cubBzPt[\"attrs\", \"order\"];\r\n                                    ptObj.type = \"cubicBezTo\";\r\n                                    ptObj.order = ptOrdr;\r\n                                    ptObj.x = ptX;\r\n                                    ptObj.y = ptY;\r\n                                    sortblAry.push(ptObj);\r\n                                });\r\n                            });\r\n                        }\r\n                    });\r\n                }\r\n                if (arcToNodes !== undefined) {\r\n                    var arcToNodesAttrs = arcToNodes[\"attrs\"];\r\n                    var arcOrder = arcToNodesAttrs[\"order\"];\r\n                    var hR = arcToNodesAttrs[\"hR\"];\r\n                    var wR = arcToNodesAttrs[\"wR\"];\r\n                    var stAng = arcToNodesAttrs[\"stAng\"];\r\n                    var swAng = arcToNodesAttrs[\"swAng\"];\r\n                    var shftX = 0;\r\n                    var shftY = 0;\r\n                    var arcToPtNode = getTextByPathList(arcToNodes, [\"a:pt\", \"attrs\"]);\r\n                    if (arcToPtNode !== undefined) {\r\n                        shftX = arcToPtNode[\"x\"];\r\n                        shftY = arcToPtNode[\"y\"];\r\n                        //console.log(\"shftX: \",shftX,\" shftY: \",shftY)\r\n                    }\r\n                    var ptObj = {};\r\n                    ptObj.type = \"arcTo\";\r\n                    ptObj.order = arcOrder;\r\n                    ptObj.hR = hR;\r\n                    ptObj.wR = wR;\r\n                    ptObj.stAng = stAng;\r\n                    ptObj.swAng = swAng;\r\n                    ptObj.shftX = shftX;\r\n                    ptObj.shftY = shftY;\r\n                    sortblAry.push(ptObj);\r\n\r\n                }\r\n                var sortByOrder = sortblAry.slice(0);\r\n                sortByOrder.sort(function (a, b) {\r\n                    return a.order - b.order;\r\n                });\r\n                //console.log(sortByOrder);\r\n                var k = 0;\r\n                while (k < sortByOrder.length) {\r\n                    if (sortByOrder[k].type == \"lnto\") {\r\n                        var Lx = parseInt(sortByOrder[k].x) * 96 / 914400;\r\n                        var Ly = parseInt(sortByOrder[k].y) * 96 / 914400;\r\n                        d += \"L\" + Lx + \",\" + Ly;\r\n                        k++;\r\n                    } else if (sortByOrder[k].type == \"cubicBezTo\") {\r\n                        var Cx1 = parseInt(sortByOrder[k].x) * 96 / 914400;\r\n                        var Cy1 = parseInt(sortByOrder[k].y) * 96 / 914400;\r\n                        var Cx2 = parseInt(sortByOrder[k + 1].x) * 96 / 914400;\r\n                        var Cy2 = parseInt(sortByOrder[k + 1].y) * 96 / 914400;\r\n                        var Cx3 = parseInt(sortByOrder[k + 2].x) * 96 / 914400;\r\n                        var Cy3 = parseInt(sortByOrder[k + 2].y) * 96 / 914400;\r\n\r\n                        d += \"C\" + Cx1 + \",\" + Cy1 + \" \" + Cx2 + \",\" + Cy2 + \" \" + Cx3 + \",\" + Cy3;\r\n                        k += 3;\r\n                    } else if (sortByOrder[k].type == \"arcTo\") {\r\n                        var hR = parseInt(sortByOrder[k].hR) * 96 / 914400;\r\n                        var wR = parseInt(sortByOrder[k].wR) * 96 / 914400;\r\n                        var stAng = parseInt(sortByOrder[k].stAng) / 60000;\r\n                        var swAng = parseInt(sortByOrder[k].swAng) / 60000;\r\n                        //var shftX = parseInt(sortByOrder[k].shftX) * 96 / 914400;\r\n                        //var shftY = parseInt(sortByOrder[k].shftY) * 96 / 914400;\r\n                        var endAng = stAng + swAng;\r\n\r\n                        d += shapeArc(wR, hR, wR, hR, stAng, endAng, false);\r\n                        k++;\r\n                    }\r\n                }\r\n                result += \"<path d='\" + d + \"' fill='\" + (!imgFillFlg ? (grndFillFlg ? \"url(#linGrd_\" + shpId + \")\" : fillColor) : \"url(#imgPtrn_\" + shpId + \")\") +\r\n                    \"' stroke='\" + border.color + \"' stroke-width='\" + border.width + \"' stroke-dasharray='\" + border.strokeDasharray + \"' \";\r\n                if (closeNode !== undefined) {\r\n                    //console.log(\"Close shape\");\r\n                    result += \"/>\";\r\n                } else {\r\n                    //console.log(\"Open shape\");\r\n                    //check and add \"marker-start\" and \"marker-end\"\r\n                    if (headEndNodeAttrs !== undefined && (headEndNodeAttrs[\"type\"] === \"triangle\" || headEndNodeAttrs[\"type\"] === \"arrow\")) {\r\n                        result += \"marker-start='url(#markerTriangle_\" + shpId + \")' \";\r\n                    }\r\n                    if (tailEndNodeAttrs !== undefined && (tailEndNodeAttrs[\"type\"] === \"triangle\" || tailEndNodeAttrs[\"type\"] === \"arrow\")) {\r\n                        result += \"marker-end='url(#markerTriangle_\" + shpId + \")' \";\r\n                    }\r\n                    result += \"/>\";\r\n\r\n                }\r\n\r\n                result += \"</svg>\";\r\n\r\n                result += \"<div class='block content \" + getVerticalAlign(node, slideLayoutSpNode, slideMasterSpNode, type) +\r\n                    \"' _id='\" + id + \"' _idx='\" + idx + \"' _type='\" + type + \"' _name='\" + name +\r\n                    \"' style='\" +\r\n                    getPosition(slideXfrmNode, slideLayoutXfrmNode, slideMasterXfrmNode) +\r\n                    getSize(slideXfrmNode, slideLayoutXfrmNode, slideMasterXfrmNode) +\r\n                    \" z-index: \" + order + \";\" +\r\n                    \"transform: rotate(\" + txtRotate + \"deg);\" +\r\n                    \"'>\";\r\n\r\n                // TextBody\r\n                if (node[\"p:txBody\"] !== undefined) {\r\n                    result += genTextBody(node[\"p:txBody\"], node, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                }\r\n                result += \"</div>\";\r\n\r\n                // result = \"\";\r\n            } else {\r\n\r\n                result += \"<div class='block content \" + getVerticalAlign(node, slideLayoutSpNode, slideMasterSpNode, type) +\r\n                    \"' _id='\" + id + \"' _idx='\" + idx + \"' _type='\" + type + \"' _name='\" + name +\r\n                    \"' style='\" +\r\n                    getPosition(slideXfrmNode, slideLayoutXfrmNode, slideMasterXfrmNode) +\r\n                    getSize(slideXfrmNode, slideLayoutXfrmNode, slideMasterXfrmNode) +\r\n                    getBorder(node, false, \"shape\") +\r\n                    getShapeFill(node, false, warpObj) +\r\n                    \" z-index: \" + order + \";\" +\r\n                    \"transform: rotate(\" + txtRotate + \"deg);\" +\r\n                    \"'>\";\r\n\r\n                // TextBody\r\n                if (node[\"p:txBody\"] !== undefined) {\r\n                    result += genTextBody(node[\"p:txBody\"], node, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                }\r\n                result += \"</div>\";\r\n\r\n            }\r\n\r\n            return result;\r\n        }\r\n        function shapeStar(adj, starNum) {\r\n            var innerRadius = adj; /*1-100*/\r\n            var outerRadius = 100;//star.outerRadius;\r\n            var numPoints = starNum;/*1-100*/\r\n            var center = Math.max(innerRadius, outerRadius);\r\n            var angle = Math.PI / numPoints;\r\n            var points = [];\r\n\r\n            for (var i = 0; i < numPoints * 2; i++) {\r\n                var radius = i & 1 ? innerRadius : outerRadius;\r\n                points.push(center + radius * Math.sin(i * angle));\r\n                points.push(center - radius * Math.cos(i * angle));\r\n            }\r\n\r\n            return points;\r\n        }\r\n        function shapePie(H, w, adj1, adj2, isClose) {\r\n            var pieVal = parseInt(adj2);\r\n            var piAngle = parseInt(adj1);\r\n            var size = parseInt(H),\r\n                radius = (size / 2),\r\n                value = pieVal - piAngle;\r\n            if (value < 0) {\r\n                value = 360 + value;\r\n            }\r\n            //console.log(\"value: \",value)      \r\n            value = Math.min(Math.max(value, 0), 360);\r\n\r\n            //calculate x,y coordinates of the point on the circle to draw the arc to. \r\n            var x = Math.cos((2 * Math.PI) / (360 / value));\r\n            var y = Math.sin((2 * Math.PI) / (360 / value));\r\n\r\n\r\n            //d is a string that describes the path of the slice.\r\n            var longArc, d, rot;\r\n            if (isClose) {\r\n                longArc = (value <= 180) ? 0 : 1;\r\n                d = \"M\" + radius + \",\" + radius + \" L\" + radius + \",\" + 0 + \" A\" + radius + \",\" + radius + \" 0 \" + longArc + \",1 \" + (radius + y * radius) + \",\" + (radius - x * radius) + \" z\";\r\n                rot = \"rotate(\" + (piAngle - 270) + \", \" + radius + \", \" + radius + \")\";\r\n            } else {\r\n                longArc = (value <= 180) ? 0 : 1;\r\n                var radius1 = radius;\r\n                var radius2 = w / 2;\r\n                d = \"M\" + radius1 + \",\" + 0 + \" A\" + radius2 + \",\" + radius1 + \" 0 \" + longArc + \",1 \" + (radius2 + y * radius2) + \",\" + (radius1 - x * radius1);\r\n                rot = \"rotate(\" + (piAngle + 90) + \", \" + radius + \", \" + radius + \")\";\r\n            }\r\n\r\n            return [d, rot];\r\n        }\r\n        function shapeGear(w, h, points) {\r\n            var innerRadius = h;//gear.innerRadius;\r\n            var outerRadius = 1.5 * innerRadius;\r\n            var cx = outerRadius;//Math.max(innerRadius, outerRadius),                   // center x\r\n            cy = outerRadius;//Math.max(innerRadius, outerRadius),                    // center y\r\n            notches = points,//gear.points,                      // num. of notches\r\n                radiusO = outerRadius,                    // outer radius\r\n                radiusI = innerRadius,                    // inner radius\r\n                taperO = 50,                     // outer taper %\r\n                taperI = 35,                     // inner taper %\r\n\r\n                // pre-calculate values for loop\r\n\r\n                pi2 = 2 * Math.PI,            // cache 2xPI (360deg)\r\n                angle = pi2 / (notches * 2),    // angle between notches\r\n                taperAI = angle * taperI * 0.005, // inner taper offset (100% = half notch)\r\n                taperAO = angle * taperO * 0.005, // outer taper offset\r\n                a = angle,                  // iterator (angle)\r\n                toggle = false;\r\n            // move to starting point\r\n            var d = \" M\" + (cx + radiusO * Math.cos(taperAO)) + \" \" + (cy + radiusO * Math.sin(taperAO));\r\n\r\n            // loop\r\n            for (; a <= pi2 + angle; a += angle) {\r\n                // draw inner to outer line\r\n                if (toggle) {\r\n                    d += \" L\" + (cx + radiusI * Math.cos(a - taperAI)) + \",\" + (cy + radiusI * Math.sin(a - taperAI));\r\n                    d += \" L\" + (cx + radiusO * Math.cos(a + taperAO)) + \",\" + (cy + radiusO * Math.sin(a + taperAO));\r\n                } else { // draw outer to inner line\r\n                    d += \" L\" + (cx + radiusO * Math.cos(a - taperAO)) + \",\" + (cy + radiusO * Math.sin(a - taperAO)); // outer line\r\n                    d += \" L\" + (cx + radiusI * Math.cos(a + taperAI)) + \",\" + (cy + radiusI * Math.sin(a + taperAI));// inner line\r\n\r\n                }\r\n                // switch level\r\n                toggle = !toggle;\r\n            }\r\n            // close the final line\r\n            d += \" \";\r\n            return d;\r\n        }\r\n        function shapeArc(cX, cY, rX, rY, stAng, endAng, isClose) {\r\n            var dData;\r\n            var angle = stAng;\r\n            if (endAng >= stAng) {\r\n                while (angle <= endAng) {\r\n                    var radians = angle * (Math.PI / 180);  // convert degree to radians\r\n                    var x = cX + Math.cos(radians) * rX;\r\n                    var y = cY + Math.sin(radians) * rY;\r\n                    if (angle == stAng) {\r\n                        dData = \" M\" + x + \" \" + y;\r\n                    }\r\n                    dData += \" L\" + x + \" \" + y;\r\n                    angle++;\r\n                }\r\n            } else {\r\n                while (angle > endAng) {\r\n                    var radians = angle * (Math.PI / 180);  // convert degree to radians\r\n                    var x = cX + Math.cos(radians) * rX;\r\n                    var y = cY + Math.sin(radians) * rY;\r\n                    if (angle == stAng) {\r\n                        dData = \" M \" + x + \" \" + y;\r\n                    }\r\n                    dData += \" L \" + x + \" \" + y;\r\n                    angle--;\r\n                }\r\n            }\r\n            dData += (isClose ? \" z\" : \"\");\r\n            return dData;\r\n        }\r\n        function shapeSnipRoundRect(w, h, adj1, adj2, shapeType, adjType) {\r\n            /* \r\n            shapeType: snip,round\r\n            adjType: cornr1,cornr2,cornrAll,diag\r\n            */\r\n            var adjA, adjB, adjC, adjD;\r\n            if (adjType == \"cornr1\") {\r\n                adjA = 0;\r\n                adjB = 0;\r\n                adjC = 0;\r\n                adjD = adj1;\r\n            } else if (adjType == \"cornr2\") {\r\n                adjA = adj1;\r\n                adjB = adj2;\r\n                adjC = adj2;\r\n                adjD = adj1;\r\n            } else if (adjType == \"cornrAll\") {\r\n                adjA = adj1;\r\n                adjB = adj1;\r\n                adjC = adj1;\r\n                adjD = adj1;\r\n            } else if (adjType == \"diag\") {\r\n                adjA = adj1;\r\n                adjB = adj2;\r\n                adjC = adj1;\r\n                adjD = adj2;\r\n            }\r\n            //d is a string that describes the path of the slice.\r\n            var d;\r\n            if (shapeType == \"round\") {\r\n                d = \"M0\" + \",\" + (h / 2 + (1 - adjB) * (h / 2)) + \" Q\" + 0 + \",\" + h + \" \" + adjB * (w / 2) + \",\" + h + \" L\" + (w / 2 + (1 - adjC) * (w / 2)) + \",\" + h +\r\n                    \" Q\" + w + \",\" + h + \" \" + w + \",\" + (h / 2 + (h / 2) * (1 - adjC)) + \"L\" + w + \",\" + (h / 2) * adjD +\r\n                    \" Q\" + w + \",\" + 0 + \" \" + (w / 2 + (w / 2) * (1 - adjD)) + \",0 L\" + (w / 2) * adjA + \",0\" +\r\n                    \" Q\" + 0 + \",\" + 0 + \" 0,\" + (h / 2) * (adjA) + \" z\";\r\n            } else if (shapeType == \"snip\") {\r\n                d = \"M0\" + \",\" + adjA * (h / 2) + \" L0\" + \",\" + (h / 2 + (h / 2) * (1 - adjB)) + \"L\" + adjB * (w / 2) + \",\" + h +\r\n                    \" L\" + (w / 2 + (w / 2) * (1 - adjC)) + \",\" + h + \"L\" + w + \",\" + (h / 2 + (h / 2) * (1 - adjC)) +\r\n                    \" L\" + w + \",\" + adjD * (h / 2) + \"L\" + (w / 2 + (w / 2) * (1 - adjD)) + \",0 L\" + ((w / 2) * adjA) + \",0 z\";\r\n            }\r\n            return d;\r\n        }\r\n        /*\r\n        function shapePolygon(sidesNum) {\r\n            var sides  = sidesNum;\r\n            var radius = 100;\r\n            var angle  = 2 * Math.PI / sides;\r\n            var points = []; \r\n            \r\n            for (var i = 0; i < sides; i++) {\r\n                points.push(radius + radius * Math.sin(i * angle));\r\n                points.push(radius - radius * Math.cos(i * angle));\r\n            }\r\n            \r\n            return points;\r\n        }\r\n        */\r\n        function processPicNode(node, warpObj) {\r\n            var rtrnData = \"\";\r\n            var mediaPicFlag = false;\r\n            var order = node[\"attrs\"][\"order\"];\r\n\r\n            var rid = node[\"p:blipFill\"][\"a:blip\"][\"attrs\"][\"r:embed\"];\r\n            var imgName = warpObj[\"slideResObj\"][rid][\"target\"];\r\n            var imgFileExt = extractFileExtension(imgName).toLowerCase();\r\n            var zip = warpObj[\"zip\"];\r\n            var imgArrayBuffer = zip.file(imgName).asArrayBuffer();\r\n            var mimeType = \"\";\r\n            var xfrmNode = node[\"p:spPr\"][\"a:xfrm\"];\r\n            ///////////////////////////////////////Amir//////////////////////////////\r\n            var rotate = 0;\r\n            var rotateNode = getTextByPathList(node, [\"p:spPr\", \"a:xfrm\", \"attrs\", \"rot\"]);\r\n            if (rotateNode !== undefined) {\r\n                rotate = angleToDegrees(rotateNode);\r\n            }\r\n            //video\r\n            var vdoNode = getTextByPathList(node, [\"p:nvPicPr\", \"p:nvPr\", \"a:videoFile\"]);\r\n            var vdoRid, vdoFile, vdoFileExt, vdoMimeType, uInt8Array, blob, vdoBlob, mediaSupportFlag = false, isVdeoLink = false;\r\n            var mediaProcess = settings.mediaProcess;\r\n            if (vdoNode !== undefined & mediaProcess) {\r\n                vdoRid = vdoNode[\"attrs\"][\"r:link\"];\r\n                vdoFile = warpObj[\"slideResObj\"][vdoRid][\"target\"];\r\n                var checkIfLink = IsVideoLink(vdoFile);\r\n                if (checkIfLink) {\r\n                    vdoFile = escapeHtml(vdoFile);\r\n                    //vdoBlob = vdoFile;\r\n                    isVdeoLink = true;\r\n                    mediaSupportFlag = true;\r\n                    mediaPicFlag = true;\r\n                } else {\r\n                    vdoFileExt = extractFileExtension(vdoFile).toLowerCase();\r\n                    if (vdoFileExt == \"mp4\" || vdoFileExt == \"webm\" || vdoFileExt == \"ogg\") {\r\n                        uInt8Array = zip.file(vdoFile).asArrayBuffer();\r\n                        vdoMimeType = getMimeType(vdoFileExt);\r\n                        blob = new Blob([uInt8Array], {\r\n                            type: vdoMimeType\r\n                        });\r\n                        vdoBlob = URL.createObjectURL(blob);\r\n                        mediaSupportFlag = true;\r\n                        mediaPicFlag = true;\r\n                    }\r\n                }\r\n            }\r\n            //Audio\r\n            var audioNode = getTextByPathList(node, [\"p:nvPicPr\", \"p:nvPr\", \"a:audioFile\"]);\r\n            var audioRid, audioFile, audioFileExt, audioMimeType, uInt8ArrayAudio, blobAudio, audioBlob;\r\n            var audioPlayerFlag = false;\r\n            var audioObjc;\r\n            if (audioNode !== undefined & mediaProcess) {\r\n                audioRid = audioNode[\"attrs\"][\"r:link\"];\r\n                audioFile = warpObj[\"slideResObj\"][audioRid][\"target\"];\r\n                audioFileExt = extractFileExtension(audioFile).toLowerCase();\r\n                if (audioFileExt == \"mp3\" || audioFileExt == \"wav\" || audioFileExt == \"ogg\") {\r\n                    uInt8ArrayAudio = zip.file(audioFile).asArrayBuffer();\r\n                    blobAudio = new Blob([uInt8ArrayAudio]);\r\n                    audioBlob = URL.createObjectURL(blobAudio);\r\n                    var cx = parseInt(xfrmNode[\"a:ext\"][\"attrs\"][\"cx\"]) * 20;\r\n                    var cy = xfrmNode[\"a:ext\"][\"attrs\"][\"cy\"];\r\n                    var x = parseInt(xfrmNode[\"a:off\"][\"attrs\"][\"x\"]) / 2.5;\r\n                    var y = xfrmNode[\"a:off\"][\"attrs\"][\"y\"];\r\n                    audioObjc = {\r\n                        \"a:ext\": {\r\n                            \"attrs\": {\r\n                                \"cx\": cx,\r\n                                \"cy\": cy\r\n                            }\r\n                        },\r\n                        \"a:off\": {\r\n                            \"attrs\": {\r\n                                \"x\": x,\r\n                                \"y\": y\r\n\r\n                            }\r\n                        }\r\n                    }\r\n                    audioPlayerFlag = true;\r\n                    mediaSupportFlag = true;\r\n                    mediaPicFlag = true;\r\n                }\r\n            }\r\n            //console.log(node)\r\n            //////////////////////////////////////////////////////////////////////////\r\n            mimeType = getMimeType(imgFileExt);\r\n            rtrnData = \"<div class='block content' style='\" +\r\n                ((mediaProcess && audioPlayerFlag) ? getPosition(audioObjc, undefined, undefined) : getPosition(xfrmNode, undefined, undefined)) +\r\n                ((mediaProcess && audioPlayerFlag) ? getSize(audioObjc, undefined, undefined) : getSize(xfrmNode, undefined, undefined)) +\r\n                \" z-index: \" + order + \";\" +\r\n                \"transform: rotate(\" + rotate + \"deg);'>\";\r\n            if ((vdoNode === undefined && audioNode === undefined) || !mediaProcess || !mediaSupportFlag) {\r\n                rtrnData += \"<img src='data:\" + mimeType + \";base64,\" + base64ArrayBuffer(imgArrayBuffer) + \"' style='width: 100%; height: 100%'/>\";\r\n            } else if ((vdoNode !== undefined || audioNode !== undefined) && mediaProcess && mediaSupportFlag) {\r\n                if (vdoNode !== undefined && !isVdeoLink) {\r\n                    rtrnData += \"<video  src='\" + vdoBlob + \"' controls style='width: 100%; height: 100%'>Your browser does not support the video tag.</video>\";\r\n                } else if (vdoNode !== undefined && isVdeoLink) {\r\n                    rtrnData += \"<iframe   src='\" + vdoFile + \"' controls style='width: 100%; height: 100%'></iframe >\";\r\n                }\r\n                if (audioNode !== undefined) {\r\n                    rtrnData += '<audio id=\"audio_player\" controls ><source src=\"' + audioBlob + '\"></audio>';\r\n                    //'<button onclick=\"audio_player.play()\">Play</button>'+\r\n                    //'<button onclick=\"audio_player.pause()\">Pause</button>';\r\n                }\r\n            }\r\n            if (!mediaSupportFlag && mediaPicFlag) {\r\n                rtrnData += \"<span style='color:red;font-size:40px;position: absolute;'>This media file Not supported by HTML5</span>\";\r\n            }\r\n            if ((vdoNode !== undefined || audioNode !== undefined) && !mediaProcess && mediaSupportFlag) {\r\n                console.log(\"Founded supported media file but media process disabled (mediaProcess=false)\");\r\n            }\r\n            rtrnData += \"</div>\";\r\n            //console.log(rtrnData)\r\n            return rtrnData;\r\n        }\r\n\r\n        function processGraphicFrameNode(node, warpObj) {\r\n\r\n            var result = \"\";\r\n            var graphicTypeUri = getTextByPathList(node, [\"a:graphic\", \"a:graphicData\", \"attrs\", \"uri\"]);\r\n\r\n            switch (graphicTypeUri) {\r\n                case \"http://schemas.openxmlformats.org/drawingml/2006/table\":\r\n                    result = genTable(node, warpObj);\r\n                    break;\r\n                case \"http://schemas.openxmlformats.org/drawingml/2006/chart\":\r\n                    result = genChart(node, warpObj);\r\n                    break;\r\n                case \"http://schemas.openxmlformats.org/drawingml/2006/diagram\":\r\n                    result = genDiagram(node, warpObj);\r\n                    break;\r\n                default:\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        function processSpPrNode(node, warpObj) {\r\n\r\n            /*\r\n            * 2241 <xsd:complexType name=\"CT_ShapeProperties\">\r\n            * 2242   <xsd:sequence>\r\n            * 2243     <xsd:element name=\"xfrm\" type=\"CT_Transform2D\"  minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            * 2244     <xsd:group   ref=\"EG_Geometry\"                  minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            * 2245     <xsd:group   ref=\"EG_FillProperties\"            minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            * 2246     <xsd:element name=\"ln\" type=\"CT_LineProperties\" minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            * 2247     <xsd:group   ref=\"EG_EffectProperties\"          minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            * 2248     <xsd:element name=\"scene3d\" type=\"CT_Scene3D\"   minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            * 2249     <xsd:element name=\"sp3d\" type=\"CT_Shape3D\"      minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            * 2250     <xsd:element name=\"extLst\" type=\"CT_OfficeArtExtensionList\" minOccurs=\"0\" maxOccurs=\"1\"/>\r\n            * 2251   </xsd:sequence>\r\n            * 2252   <xsd:attribute name=\"bwMode\" type=\"ST_BlackWhiteMode\" use=\"optional\"/>\r\n            * 2253 </xsd:complexType>\r\n            */\r\n\r\n            // TODO:\r\n        }\r\n\r\n        function genTextBody(textBodyNode, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj) {\r\n            var text = \"\";\r\n            var slideMasterTextStyles = warpObj[\"slideMasterTextStyles\"];\r\n\r\n            if (textBodyNode === undefined) {\r\n                return text;\r\n            }\r\n            //rtl : <p:txBody>\r\n            //          <a:bodyPr wrap=\"square\" rtlCol=\"1\">\r\n\r\n            //var rtlStr = \"\";\r\n            if (textBodyNode[\"a:p\"].constructor === Array) {\r\n                // multi p\r\n                for (var i = 0; i < textBodyNode[\"a:p\"].length; i++) {\r\n                    var pNode = textBodyNode[\"a:p\"][i];\r\n                    var rNode = pNode[\"a:r\"];\r\n\r\n                    //var isRTL = getTextDirection(pNode, type, slideMasterTextStyles);\r\n                    //rtlStr = \"\";//\"dir='\"+isRTL+\"'\";\r\n\r\n                    text += \"<div  class='\" + getHorizontalAlign(pNode, slideLayoutSpNode, slideMasterSpNode, type, slideMasterTextStyles) + \"'>\";\r\n                    text += genBuChar(pNode, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n\r\n                    if (rNode === undefined) {\r\n                        // without r\r\n                        text += genSpanElement(pNode, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                    } else if (rNode.constructor === Array) {\r\n                        // with multi r\r\n                        for (var j = 0; j < rNode.length; j++) {\r\n                            text += genSpanElement(rNode[j], spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                            //////////////////Amir////////////\r\n                            if (pNode[\"a:br\"] !== undefined) {\r\n                                text += \"<br>\";\r\n                            }\r\n                            //////////////////////////////////                    \r\n                        }\r\n                    } else {\r\n                        // with one r\r\n                        text += genSpanElement(rNode, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                    }\r\n                    text += \"</div>\";\r\n                }\r\n            } else {\r\n                // one p\r\n                var pNode = textBodyNode[\"a:p\"];\r\n                var rNode = pNode[\"a:r\"];\r\n\r\n                //var isRTL = getTextDirection(pNode, type, slideMasterTextStyles);\r\n                //rtlStr = \"\";//\"dir='\"+isRTL+\"'\";\r\n\r\n                text += \"<div class='slide-prgrph \" + getHorizontalAlign(pNode, slideLayoutSpNode, slideMasterSpNode, type, slideMasterTextStyles) + \"'>\";\r\n                text += genBuChar(pNode, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                if (rNode === undefined) {\r\n                    // without r\r\n                    text += genSpanElement(pNode, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                } else if (rNode.constructor === Array) {\r\n                    // with multi r\r\n                    for (var j = 0; j < rNode.length; j++) {\r\n                        text += genSpanElement(rNode[j], spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                        //////////////////Amir////////////\r\n                        if (pNode[\"a:br\"] !== undefined) {\r\n                            text += \"<br>\";\r\n                        }\r\n                        //////////////////////////////////\r\n                    }\r\n                } else {\r\n                    // with one r\r\n                    text += genSpanElement(rNode, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj);\r\n                }\r\n                text += \"</div>\";\r\n            }\r\n\r\n            return text;\r\n        }\r\n\r\n        function genBuChar(node, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj) {\r\n            ///////////////////////////////////////Amir///////////////////////////////\r\n            var sldMstrTxtStyles = warpObj[\"slideMasterTextStyles\"];\r\n\r\n            var rNode = getTextByPathList(node, [\"a:r\"]);\r\n            if (rNode !== undefined && rNode.constructor === Array) {\r\n                rNode = rNode[0];\r\n            }\r\n            var dfltBultColor, dfltBultSize, bultColor, bultSize;\r\n            if (rNode !== undefined) {\r\n                dfltBultColor = getFontColorPr(rNode, spNode, type, sldMstrTxtStyles)[0];\r\n                dfltBultSize = getFontSize(rNode, slideLayoutSpNode, slideMasterSpNode, type, sldMstrTxtStyles);\r\n            } else {\r\n                dfltBultColor = getFontColorPr(node, spNode, type, sldMstrTxtStyles)[0];\r\n                dfltBultSize = getFontSize(node, slideLayoutSpNode, slideMasterSpNode, type, sldMstrTxtStyles);\r\n            }\r\n            //console.log(\"Bullet Size: \" + bultSize);\r\n\r\n            var bullet = \"\";\r\n            /////////////////////////////////////////////////////////////////\r\n\r\n\r\n            var pPrNode = node[\"a:pPr\"];\r\n\r\n            //////////////////cheke if is rtl ///Amir ////////////////////////////////////\r\n            var getRtlVal = getTextByPathList(pPrNode, [\"attrs\", \"rtl\"])\r\n            var isRTL = false;\r\n            if (getRtlVal !== undefined && getRtlVal == \"1\") {\r\n                isRTL = true;\r\n            }\r\n            ////////////////////////////////////////////////////////////\r\n\r\n            var lvl = parseInt(getTextByPathList(pPrNode, [\"attrs\", \"lvl\"]));\r\n            if (isNaN(lvl)) {\r\n                lvl = 0;\r\n            }\r\n\r\n            var buChar = getTextByPathList(pPrNode, [\"a:buChar\", \"attrs\", \"char\"]);\r\n            /////////////////////////////////Amir///////////////////////////////////\r\n            var buType = \"TYPE_NONE\";\r\n            var buNum = getTextByPathList(pPrNode, [\"a:buAutoNum\", \"attrs\", \"type\"]);\r\n            var buPic = getTextByPathList(pPrNode, [\"a:buBlip\"]);\r\n            if (buChar !== undefined) {\r\n                buType = \"TYPE_BULLET\";\r\n                // console.log(\"Bullet Chr to code: \" + buChar.charCodeAt(0));\r\n            }\r\n            if (buNum !== undefined) {\r\n                buType = \"TYPE_NUMERIC\";\r\n            }\r\n            if (buPic !== undefined) {\r\n                buType = \"TYPE_BULPIC\";\r\n            }\r\n\r\n            if (buType != \"TYPE_NONE\") {\r\n                var buFontAttrs = getTextByPathList(pPrNode, [\"a:buFont\", \"attrs\"]);\r\n            }\r\n            //console.log(\"Bullet Type: \" + buType);\r\n            //console.log(\"NumericTypr: \" + buNum);\r\n            //console.log(\"buChar: \" + (buChar === undefined?'':buChar.charCodeAt(0)));\r\n            //get definde bullet COLOR\r\n            var buClrNode = getTextByPathList(pPrNode, [\"a:buClr\"]);\r\n            var defBultColor = \"NoNe\";\r\n            if (buClrNode !== undefined) {\r\n                defBultColor = getSolidFill(buClrNode);\r\n            } else {\r\n                // console.log(\"buClrNode: \" + buClrNode);\r\n            }\r\n\r\n            if (defBultColor == \"NoNe\") {\r\n                bultColor = dfltBultColor;\r\n            } else {\r\n                bultColor = \"#\" + defBultColor;\r\n            }\r\n            //get definde bullet SIZE\r\n            var buFontSize;\r\n            buFontSize = getTextByPathList(pPrNode, [\"a:buSzPts\", \"attrs\", \"val\"]); //pt\r\n            if (buFontSize !== undefined) {\r\n                bultSize = parseInt(buFontSize) / 100 + \"pt\";\r\n            } else {\r\n                buFontSize = getTextByPathList(pPrNode, [\"a:buSzPct\", \"attrs\", \"val\"]);\r\n                if (buFontSize !== undefined) {\r\n                    var prcnt = parseInt(buFontSize) / 100000;\r\n                    //dfltBultSize = XXpt\r\n                    var dfltBultSizeNoPt = dfltBultSize.substr(0, dfltBultSize.length - 2);\r\n                    bultSize = prcnt * (parseInt(dfltBultSizeNoPt)) + \"pt\";\r\n                } else {\r\n                    bultSize = dfltBultSize;\r\n                }\r\n            }\r\n            ////////////////////////////////////////////////////////////////////////\r\n            if (buType == \"TYPE_BULLET\") {\r\n                //var buFontAttrs = getTextByPathList(pPrNode, [\"a:buFont\", \"attrs\"]);\r\n                if (buFontAttrs !== undefined) {\r\n                    var marginLeft = parseInt(getTextByPathList(pPrNode, [\"attrs\", \"marL\"])) * 96 / 914400;\r\n                    var marginRight = parseInt(buFontAttrs[\"pitchFamily\"]);\r\n                    if (isNaN(marginLeft)) {\r\n                        marginLeft = 328600 * 96 / 914400;\r\n                    }\r\n                    if (isNaN(marginRight)) {\r\n                        marginRight = 0;\r\n                    }\r\n                    var typeface = buFontAttrs[\"typeface\"];\r\n\r\n                    bullet = \"<span style='font-family: \" + typeface +\r\n                        \"; margin-left: \" + marginLeft * lvl + \"px\" +\r\n                        \"; margin-right: \" + marginRight + \"px\" +\r\n                        \";color:\" + bultColor +\r\n                        \";font-size:\" + bultSize + \";\";\r\n                    if (isRTL) {\r\n                        bullet += \" float: right;  direction:rtl\";\r\n                    }\r\n                    bullet += \"'>\" + buChar + \"</span>\";\r\n                } else {\r\n                    marginLeft = 328600 * 96 / 914400 * lvl;\r\n\r\n                    bullet = \"<span style='margin-left: \" + marginLeft + \"px;'>\" + buChar + \"</span>\";\r\n                }\r\n            } else if (buType == \"TYPE_NUMERIC\") { ///////////Amir///////////////////////////////\r\n                if (buFontAttrs !== undefined) {\r\n                    var marginLeft = parseInt(getTextByPathList(pPrNode, [\"attrs\", \"marL\"])) * 96 / 914400;\r\n                    var marginRight = parseInt(buFontAttrs[\"pitchFamily\"]);\r\n\r\n                    if (isNaN(marginLeft)) {\r\n                        marginLeft = 328600 * 96 / 914400;\r\n                    }\r\n                    if (isNaN(marginRight)) {\r\n                        marginRight = 0;\r\n                    }\r\n                    //var typeface = buFontAttrs[\"typeface\"];\r\n\r\n                    bullet = \"<span style='margin-left: \" + marginLeft * lvl + \"px\" +\r\n                        \"; margin-right: \" + marginRight + \"px\" +\r\n                        \";color:\" + bultColor +\r\n                        \";font-size:\" + bultSize + \";\";\r\n                    if (isRTL) {\r\n                        bullet += \" float: right; direction:rtl;\";\r\n                    } else {\r\n                        bullet += \" float: left; direction:ltr;\";\r\n                    }\r\n                    bullet += \"' data-bulltname = '\" + buNum + \"' data-bulltlvl = '\" + lvl + \"' class='numeric-bullet-style'></span>\";\r\n                } else {\r\n                    marginLeft = 328600 * 96 / 914400 * lvl;\r\n                    bullet = \"<span style='margin-left: \" + marginLeft + \"px;\";\r\n                    if (isRTL) {\r\n                        bullet += \" float: right; direction:rtl;\";\r\n                    } else {\r\n                        bullet += \" float: left; direction:ltr;\";\r\n                    }\r\n                    bullet += \"' data-bulltname = '\" + buNum + \"' data-bulltlvl = '\" + lvl + \"' class='numeric-bullet-style'></span>\";\r\n                }\r\n\r\n            } else if (buType == \"TYPE_BULPIC\") { //PIC BULLET\r\n                var marginLeft = parseInt(getTextByPathList(pPrNode, [\"attrs\", \"marL\"])) * 96 / 914400;\r\n                var marginRight = parseInt(getTextByPathList(pPrNode, [\"attrs\", \"marR\"])) * 96 / 914400;\r\n\r\n                if (isNaN(marginRight)) {\r\n                    marginRight = 0;\r\n                }\r\n                //console.log(\"marginRight: \"+marginRight)\r\n                //buPic\r\n                if (isNaN(marginLeft)) {\r\n                    marginLeft = 328600 * 96 / 914400;\r\n                } else {\r\n                    marginLeft = 0;\r\n                }\r\n                //var buPicId = getTextByPathList(buPic, [\"a:blip\",\"a:extLst\",\"a:ext\",\"asvg:svgBlip\" , \"attrs\", \"r:embed\"]);\r\n                var buPicId = getTextByPathList(buPic, [\"a:blip\", \"attrs\", \"r:embed\"]);\r\n                var svgPicPath = \"\";\r\n                var buImg;\r\n                if (buPicId !== undefined) {\r\n                    //svgPicPath = warpObj[\"slideResObj\"][buPicId][\"target\"];\r\n                    //buImg = warpObj[\"zip\"].file(svgPicPath).asText();\r\n                    //}else{\r\n                    //buPicId = getTextByPathList(buPic, [\"a:blip\", \"attrs\", \"r:embed\"]);\r\n                    var imgPath = warpObj[\"slideResObj\"][buPicId][\"target\"];\r\n                    //console.log(\"imgPath: \", imgPath);\r\n                    var imgArrayBuffer = warpObj[\"zip\"].file(imgPath).asArrayBuffer();\r\n                    var imgExt = imgPath.split(\".\").pop();\r\n                    var imgMimeType = getMimeType(imgExt);\r\n                    buImg = \"<img src='data:\" + imgMimeType + \";base64,\" + base64ArrayBuffer(imgArrayBuffer) + \"' style='width: 100%; height: 100%'/>\"\r\n                    //console.log(\"imgPath: \"+imgPath+\"\\nimgMimeType: \"+imgMimeType)\r\n                }\r\n                if (buPicId === undefined) {\r\n                    buImg = \"&#8227;\";\r\n                }\r\n                bullet = \"<span style='margin-left: \" + marginLeft * lvl + \"px\" +\r\n                    \"; margin-right: \" + marginRight + \"px\" +\r\n                    \";width:\" + bultSize + \";display: inline-block; \";\r\n                if (isRTL) {\r\n                    bullet += \" float: right;direction:rtl\";\r\n                }\r\n                bullet += \"'>\" + buImg + \"  </span>\";\r\n                //////////////////////////////////////////////////////////////////////////////////////\r\n            } else {\r\n                bullet = \"<span style='margin-left: \" + 328600 * 96 / 914400 * lvl + \"px\" +\r\n                    \"; margin-right: \" + 0 + \"px;'></span>\";\r\n            }\r\n\r\n            return bullet;\r\n        }\r\n\r\n        function genSpanElement(node, spNode, slideLayoutSpNode, slideMasterSpNode, type, warpObj) {\r\n\r\n            var slideMasterTextStyles = warpObj[\"slideMasterTextStyles\"];\r\n\r\n            var text = node[\"a:t\"];\r\n            if (typeof text !== 'string') {\r\n                text = getTextByPathList(node, [\"a:fld\", \"a:t\"]);\r\n                if (typeof text !== 'string') {\r\n                    text = \"&nbsp;\";\r\n                }\r\n            }\r\n            //console.log(\"genSpanElement: \",node)\r\n            //getFontColor\r\n            var fontClrPr = getFontColorPr(node, spNode, type, slideMasterTextStyles);\r\n            var styleText =\r\n                \"color:\" + fontClrPr[0] + \";\" +\r\n                \"text-shadow:\" + fontClrPr[1] + \";\" +\r\n                \"font-size:\" + getFontSize(node, slideLayoutSpNode, slideMasterSpNode, type, slideMasterTextStyles) + \";\" +\r\n                \"font-family:\" + getFontType(node, type, slideMasterTextStyles) + \";\" +\r\n                \"font-weight:\" + getFontBold(node, type, slideMasterTextStyles) + \";\" +\r\n                \"font-style:\" + getFontItalic(node, type, slideMasterTextStyles) + \";\" +\r\n                \"text-decoration:\" + getFontDecoration(node, type, slideMasterTextStyles) + \";\" +\r\n                \"text-align:\" + getTextHorizontalAlign(node, type, slideMasterTextStyles) + \";\" +\r\n                \"vertical-align:\" + getTextVerticalAlign(node, type, slideMasterTextStyles) + \";\";\r\n            //////////////////Amir///////////////\r\n            var highlight = getTextByPathList(node, [\"a:rPr\", \"a:highlight\"]);\r\n            if (highlight !== undefined) {\r\n                styleText += \"background-color:#\" + getSolidFill(highlight) + \";\";\r\n                styleText += \"Opacity:\" + getColorOpacity(highlight) + \";\";\r\n            }\r\n            ///////////////////////////////////////////\r\n            var cssName = \"\";\r\n\r\n            if (styleText in styleTable) {\r\n                cssName = styleTable[styleText][\"name\"];\r\n            } else {\r\n                cssName = \"_css_\" + (Object.keys(styleTable).length + 1);\r\n                styleTable[styleText] = {\r\n                    \"name\": cssName,\r\n                    \"text\": styleText\r\n                };\r\n            }\r\n\r\n            var linkID = getTextByPathList(node, [\"a:rPr\", \"a:hlinkClick\", \"attrs\", \"r:id\"]);\r\n            //get link colors : TODO\r\n            if (linkID !== undefined) {\r\n                var linkURL = warpObj[\"slideResObj\"][linkID][\"target\"];\r\n                linkURL = escapeHtml(linkURL);\r\n                return \"<span class='text-block \" + cssName + \"'><a href='\" + linkURL + \"' target='_blank'>\" + text.replace(/\\s/i, \"&nbsp;\") + \"</a></span>\";\r\n            } else {\r\n                return \"<span class='text-block \" + cssName + \"'>\" + text.replace(/\\s/i, \"&nbsp;\") + \"</span>\";\r\n            }\r\n\r\n        }\r\n\r\n        function genGlobalCSS() {\r\n            var cssText = \"\";\r\n            for (var key in styleTable) {\r\n                var tagname = \"\";\r\n                if (settings.slideMode && settings.slideType == \"revealjs\") {\r\n                    tagname = \"section\";\r\n                } else {\r\n                    tagname = \"div\";\r\n                }\r\n                cssText += tagname + \" .\" + styleTable[key][\"name\"] + \"{\" + styleTable[key][\"text\"] + \"}\\n\"; //section > div\r\n            }\r\n            //cssText += \" .slide{margin-bottom: 5px;}\\n\"; // TODO\r\n\r\n            if (settings.slideMode && settings.slideType == \"divs2slidesjs\") {\r\n                //divId\r\n                //console.log(\"slideWidth: \", slideWidth)\r\n                cssText += \"#all_slides_warpper{margin-right: auto;margin-left: auto;padding-top:10px;width: \" + slideWidth + \"px;}\\n\"; // TODO\r\n            }\r\n            return cssText;\r\n        }\r\n\r\n        function genTable(node, warpObj) {\r\n\r\n            var order = node[\"attrs\"][\"order\"];\r\n            var tableNode = getTextByPathList(node, [\"a:graphic\", \"a:graphicData\", \"a:tbl\"]);\r\n            var xfrmNode = getTextByPathList(node, [\"p:xfrm\"]);\r\n            /////////////////////////////////////////Amir////////////////////////////////////////////////\r\n            var getTblPr = getTextByPathList(node, [\"a:graphic\", \"a:graphicData\", \"a:tbl\", \"a:tblPr\"]);\r\n            var getColsGrid = getTextByPathList(node, [\"a:graphic\", \"a:graphicData\", \"a:tbl\", \"a:tblGrid\", \"a:gridCol\"]);\r\n            var tblDir = \"\";\r\n            if (getTblPr !== undefined) {\r\n                var isRTL = getTblPr[\"attrs\"][\"rtl\"];\r\n                tblDir = (isRTL == 1 ? \"dir=rtl\" : \"dir=ltr\");\r\n            }\r\n            var firstRowAttr = getTblPr[\"attrs\"][\"firstRow\"]; //associated element <a:firstRow> in the table styles\r\n            var firstColAttr = getTblPr[\"attrs\"][\"firstCol\"]; //associated element <a:firstCol> in the table styles\r\n            var lastRowAttr = getTblPr[\"attrs\"][\"lastRow\"]; //associated element <a:lastRow> in the table styles\r\n            var lastColAttr = getTblPr[\"attrs\"][\"lastCol\"]; //associated element <a:lastCol> in the table styles\r\n            var bandRowAttr = getTblPr[\"attrs\"][\"bandRow\"]; //associated element <a:band1H>, <a:band2H> in the table styles\r\n            var bandColAttr = getTblPr[\"attrs\"][\"bandCol\"]; //associated element <a:band1V>, <a:band2V> in the table styles\r\n            //console.log(firstColAttr);\r\n            ////////////////////////////////////////////////////////////////////////////////////////////\r\n            var tableHtml = \"<table \" + tblDir + \" style='border-collapse: collapse;\" + getPosition(xfrmNode, undefined, undefined) + getSize(xfrmNode, undefined, undefined) + \" z-index: \" + order + \";'>\";\r\n\r\n            var trNodes = tableNode[\"a:tr\"];\r\n            if (trNodes.constructor === Array) {\r\n                for (var i = 0; i < trNodes.length; i++) {\r\n                    //////////////rows Style ////////////Amir\r\n                    var rowHeightParam = trNodes[i][\"attrs\"][\"h\"];\r\n                    var rowHeight = 0;\r\n                    var rowsStyl = \"\";\r\n                    if (rowHeightParam !== undefined) {\r\n                        rowHeight = parseInt(rowHeightParam) * 96 / 914400;\r\n                        rowsStyl += \"height:\" + rowHeight + \"px;\";\r\n                        //tableHtml += \"<tr style='height:\"+rowHeight+\"px;'>\";\r\n                    }\r\n\r\n                    //get from Theme (tableStyles.xml) TODO \r\n                    //get tableStyleId = a:tbl => a:tblPr => a:tableStyleId\r\n                    var thisTblStyle;\r\n                    var tbleStyleId = getTblPr[\"a:tableStyleId\"];\r\n                    if (tbleStyleId !== undefined) {\r\n                        //get Style from tableStyles.xml by {var tbleStyleId}\r\n                        //table style object : tableStyles\r\n                        var tbleStylList = tableStyles[\"a:tblStyleLst\"][\"a:tblStyle\"];\r\n                        if (tbleStylList.constructor === Array) {\r\n                            for (var k = 0; k < tbleStylList.length; k++) {\r\n                                if (tbleStylList[k][\"attrs\"][\"styleId\"] == tbleStyleId) {\r\n                                    thisTblStyle = tbleStylList[k];\r\n                                }\r\n                            }\r\n                        } else {\r\n                            if (tbleStylList[\"attrs\"][\"styleId\"] == tbleStyleId) {\r\n                                thisTblStyle = tbleStylList;\r\n                            }\r\n                        }\r\n                    }\r\n                    //console.log(thisTblStyle);\r\n                    if (i == 0 && firstRowAttr !== undefined) {\r\n                        var fillColor = \"fff\";\r\n                        var colorOpacity = 1;\r\n                        if (thisTblStyle[\"a:firstRow\"] !== undefined) {\r\n                            var bgFillschemeClr = getTextByPathList(thisTblStyle, [\"a:firstRow\", \"a:tcStyle\", \"a:fill\", \"a:solidFill\"]);\r\n                            if (bgFillschemeClr !== undefined) {\r\n                                fillColor = getSolidFill(bgFillschemeClr);\r\n                                colorOpacity = getColorOpacity(bgFillschemeClr);\r\n                            }\r\n                            //console.log(thisTblStyle[\"a:firstRow\"])\r\n\r\n                            //borders color\r\n                            //borders Width\r\n                            var borderStyl = getTextByPathList(thisTblStyle, [\"a:firstRow\", \"a:tcStyle\", \"a:tcBdr\"]);\r\n                            if (borderStyl !== undefined) {\r\n                                var row_borders = getTableBorders(borderStyl);\r\n                                rowsStyl += row_borders;\r\n                            }\r\n                            //console.log(thisTblStyle[\"a:firstRow\"])\r\n\r\n                            //Text Style - TODO\r\n                            var rowTxtStyl = getTextByPathList(thisTblStyle, [\"a:firstRow\", \"a:tcTxStyle\"]);\r\n                            if (rowTxtStyl !== undefined) {\r\n                                /*\r\n                            var fontClrPr = getFontColorPr(node, spNode, type, slideMasterTextStyles);\r\n                            var styleText = \r\n                                \"color:\" + fontClrPr[0] + \";\" +\r\n                                \"text-shadow:\" + fontClrPr[1] + \";\" +\r\n                                \"font-size:\" + getFontSize(node, slideLayoutSpNode, slideMasterSpNode, type, slideMasterTextStyles) + \";\" + \r\n                                \"font-family:\" + getFontType(node, type, slideMasterTextStyles) + \";\" + \r\n                                \"font-weight:\" + getFontBold(node, type, slideMasterTextStyles) + \";\" +\r\n                                \"font-style:\" + getFontItalic(node, type, slideMasterTextStyles) + \";\" +\r\n                                \"text-decoration:\" + getFontDecoration(node, type, slideMasterTextStyles) + \";\" +\r\n                                \"text-align:\" + getTextHorizontalAlign(node, type, slideMasterTextStyles) + \";\" +\r\n                                \"vertical-align:\" + getTextVerticalAlign(node, type, slideMasterTextStyles) + \";\";\r\n                                */\r\n                            }\r\n\r\n                        }\r\n                        rowsStyl += \" background-color:#\" + fillColor + \";\" +\r\n                            \" opacity:\" + colorOpacity + \";\";\r\n\r\n                    } else if (i > 0 && bandRowAttr !== undefined) {\r\n                        var fillColor = \"fff\";\r\n                        var colorOpacity = 1;\r\n                        if ((i % 2) == 0) {\r\n                            if (thisTblStyle[\"a:band2H\"] !== undefined) {\r\n                                //console.log(thisTblStyle[\"a:band2H\"]);\r\n                                var bgFillschemeClr = getTextByPathList(thisTblStyle, [\"a:band2H\", \"a:tcStyle\", \"a:fill\", \"a:solidFill\"]);\r\n                                if (bgFillschemeClr !== undefined) {\r\n                                    fillColor = getSolidFill(bgFillschemeClr);\r\n                                    colorOpacity = getColorOpacity(bgFillschemeClr);\r\n                                }\r\n                                //borders color\r\n                                //borders Width\r\n                                var borderStyl = getTextByPathList(thisTblStyle, [\"a:band2H\", \"a:tcStyle\", \"a:tcBdr\"]);\r\n                                if (borderStyl !== undefined) {\r\n                                    var row_borders = getTableBorders(borderStyl);\r\n                                    rowsStyl += row_borders;\r\n                                }\r\n                                //console.log(thisTblStyle[\"a:band2H\"])\r\n\r\n                                //Text Style - TODO\r\n                                var rowTxtStyl = getTextByPathList(thisTblStyle, [\"a:band2H\", \"a:tcTxStyle\"]);\r\n                                if (rowTxtStyl !== undefined) {\r\n\r\n                                }\r\n                                //console.log(i,thisTblStyle)\r\n                            }/*else{\r\n                                var bgFillschemeClr = thisTblStyle[\"a:wholeTbl\"][\"a:tcStyle\"][\"a:fill\"][\"a:solidFill\"];\r\n                                if(bgFillschemeClr !==undefined){\r\n                                    fillColor = getSolidFill(bgFillschemeClr);\r\n                                    colorOpacity = getColorOpacity(bgFillschemeClr);\r\n                                }\r\n                                //borders color\r\n                                //borders Width\r\n                                var borderStyl = thisTblStyle[\"a:wholeTbl\"][\"a:tcStyle\"][\"a:tcBdr\"];\r\n                                if(borderStyl !== undefined){\r\n                                    var row_borders = getTableBorders(borderStyl);\r\n                                    rowsStyl += row_borders;\r\n                                }\r\n                                //console.log(thisTblStyle[\"a:wholeTbl\"])\r\n                                \r\n                                //Text Style - TODO\r\n                                var rowTxtStyl = thisTblStyle[\"a:wholeTbl\"][\"a:tcTxStyle\"];\r\n                                if(rowTxtStyl !== undefined){\r\n                                    \r\n                                }                        \r\n                            }*/\r\n                        } else {\r\n                            if (thisTblStyle[\"a:band1H\"] !== undefined) {\r\n                                var bgFillschemeClr = getTextByPathList(thisTblStyle, [\"a:band1H\", \"a:tcStyle\", \"a:fill\", \"a:solidFill\"]);\r\n                                if (bgFillschemeClr !== undefined) {\r\n                                    fillColor = getSolidFill(bgFillschemeClr);\r\n                                    colorOpacity = getColorOpacity(bgFillschemeClr);\r\n                                }\r\n                                //borders color\r\n                                //borders Width\r\n                                var borderStyl = getTextByPathList(thisTblStyle, [\"a:band1H\", \"a:tcStyle\", \"a:tcBdr\"]);\r\n                                if (borderStyl !== undefined) {\r\n                                    var row_borders = getTableBorders(borderStyl);\r\n                                    rowsStyl += row_borders;\r\n                                }\r\n                                //console.log(thisTblStyle[\"a:band1H\"])\r\n\r\n                                //Text Style - TODO\r\n                                var rowTxtStyl = getTextByPathList(thisTblStyle, [\"a:band1H\", \"a:tcTxStyle\"]);\r\n                                if (rowTxtStyl !== undefined) {\r\n\r\n                                }\r\n                            }\r\n                        }\r\n                        rowsStyl += \" background-color:#\" + fillColor + \";\" +\r\n                            \" opacity:\" + colorOpacity + \";\";\r\n                    }\r\n                    tableHtml += \"<tr style='\" + rowsStyl + \"'>\";\r\n                    ////////////////////////////////////////////////\r\n\r\n                    var tcNodes = trNodes[i][\"a:tc\"];\r\n\r\n                    if (tcNodes.constructor === Array) {\r\n                        for (var j = 0; j < tcNodes.length; j++) {\r\n                            var text = genTextBody(tcNodes[j][\"a:txBody\"], node, undefined, undefined, undefined, warpObj);\r\n                            var rowSpan = getTextByPathList(tcNodes[j], [\"attrs\", \"rowSpan\"]);\r\n                            var colSpan = getTextByPathList(tcNodes[j], [\"attrs\", \"gridSpan\"]);\r\n                            var vMerge = getTextByPathList(tcNodes[j], [\"attrs\", \"vMerge\"]);\r\n                            var hMerge = getTextByPathList(tcNodes[j], [\"attrs\", \"hMerge\"]);\r\n                            //Cells Style : TODO /////////////Amir\r\n                            //console.log(tcNodes[j]);\r\n                            //if(j==0 && ())\r\n                            var colWidthParam = getColsGrid[j][\"attrs\"][\"w\"];\r\n                            var colStyl = \"\";\r\n                            if (colWidthParam !== undefined) {\r\n                                var colWidth = parseInt(colWidthParam) * 96 / 914400;\r\n                                colStyl += \"width:\" + colWidth + \"px;\"\r\n                            }\r\n                            var getFill = tcNodes[j][\"a:tcPr\"][\"a:solidFill\"];\r\n                            var fillColor = \"\";\r\n                            var colorOpacity = 1;\r\n                            if (getFill !== undefined) {\r\n                                //console.log(getFill);\r\n                                fillColor = getSolidFill(getFill);\r\n                                colorOpacity = getColorOpacity(getFill);\r\n                            } else {\r\n                                //get from Theme (tableStyles.xml) TODO \r\n                                //get tableStyleId = a:tbl => a:tblPr => a:tableStyleId\r\n                                var tbleStyleId = getTblPr[\"a:tableStyleId\"];\r\n                                if (tbleStyleId !== undefined) {\r\n                                    //get Style from tableStyles.xml by {var tbleStyleId}\r\n                                    //table style object : tableStyles\r\n                                    var tbleStylList = tableStyles[\"a:tblStyleLst\"][\"a:tblStyle\"];\r\n\r\n                                    for (var k = 0; k < tbleStylList.length; k++) {\r\n                                        if (tbleStylList[k][\"attrs\"][\"styleId\"] == tbleStyleId) {\r\n                                            //console.log(tbleStylList[k]);\r\n                                        }\r\n                                    }\r\n                                }\r\n                                //console.log(tbleStyleId);\r\n                            }\r\n                            if (fillColor != \"\") {\r\n                                colStyl += \" background-color:#\" + fillColor + \";\";\r\n                                colStyl += \" opacity\" + colorOpacity + \";\";\r\n                            }\r\n                            //console.log(fillColor);\r\n                            ////////////////////////////////////\r\n\r\n\r\n                            if (rowSpan !== undefined) {\r\n                                tableHtml += \"<td rowspan='\" + parseInt(rowSpan) + \"' style='\" + colStyl + \"'>\" + text + \"</td>\";\r\n                            } else if (colSpan !== undefined) {\r\n                                tableHtml += \"<td colspan='\" + parseInt(colSpan) + \"' style='\" + colStyl + \"'>\" + text + \"</td>\";\r\n                            } else if (vMerge === undefined && hMerge === undefined) {\r\n                                tableHtml += \"<td style='\" + colStyl + \"'>\" + text + \"</td>\";\r\n                            }\r\n                        }\r\n                    } else {\r\n                        var text = genTextBody(tcNodes[\"a:txBody\"], node, undefined, undefined, undefined, warpObj);\r\n                        //Cells Style : TODO /////////////Amir\r\n                        var colWidthParam = getColsGrid[0][\"attrs\"][\"w\"];\r\n                        var colStyl = \"\";\r\n                        if (colWidthParam !== undefined) {\r\n                            var colWidth = parseInt(colWidthParam) * 96 / 914400;\r\n                            colStyl += \"width:\" + colWidth + \"px;\"\r\n                        }\r\n                        var getFill = tcNodes[\"a:tcPr\"][\"a:solidFill\"];\r\n                        var fillColor = \"\";\r\n                        var colorOpacity = 1;\r\n                        if (getFill !== undefined) {\r\n                            //console.log(getFill);   \r\n                            fillColor = getSolidFill(getFill);\r\n                            colorOpacity = getColorOpacity(getFill);\r\n                        } else {\r\n                            //get from Theme TODO\r\n                        }\r\n                        if (fillColor != \"\") {\r\n                            colStyl += \" background-color:#\" + fillColor + \";\"\r\n                            colStyl += \" opacity\" + colorOpacity + \";\";\r\n                        }\r\n                        ////////////////////////////////////\r\n                        tableHtml += \"<td style='\" + colStyl + \"'>\" + text + \"</td>\";\r\n                    }\r\n                    tableHtml += \"</tr>\";\r\n                }\r\n            } else {\r\n                //////////////row height ////////////Amir\r\n                var rowHeightParam = trNodes[\"attrs\"][\"h\"];\r\n                var rowHeight = 0;\r\n                if (rowHeightParam !== undefined) {\r\n                    rowHeight = parseInt(rowHeightParam) * 96 / 914400;\r\n                    tableHtml += \"<tr style='height:\" + rowHeight + \"px;'>\";\r\n                } else {\r\n                    tableHtml += \"<tr>\";\r\n                }\r\n                ////////////////////////////////////////////////\r\n                var tcNodes = trNodes[\"a:tc\"];\r\n                if (tcNodes.constructor === Array) {\r\n                    for (var j = 0; j < tcNodes.length; j++) {\r\n                        var text = genTextBody(tcNodes[j][\"a:txBody\"], node, undefined, undefined, undefined, warpObj);\r\n                        //Cells Style : TODO /////////////Amir\r\n                        var colWidthParam = getColsGrid[j][\"attrs\"][\"w\"];\r\n                        var colStyl = \"\";\r\n                        if (colWidthParam !== undefined) {\r\n                            var colWidth = parseInt(colWidthParam) * 96 / 914400;\r\n                            colStyl += \"width:\" + colWidth + \"px;\"\r\n                        }\r\n                        var getFill = tcNodes[j][\"a:tcPr\"][\"a:solidFill\"];\r\n                        var fillColor = \"\";\r\n                        var colorOpacity = 1;\r\n                        if (getFill !== undefined) {\r\n                            fillColor = getSolidFill(getFill);\r\n                            colorOpacity = getColorOpacity(getFill);\r\n                        } else {\r\n                            //get from Theme TODO\r\n                            //get tableStyleId\r\n                            // a:tbl => a:tblPr => a:tableStyleId\r\n                        }\r\n                        if (fillColor != \"\") {\r\n                            colStyl += \" background-color:#\" + fillColor + \";\"\r\n                            colStyl += \" opacity\" + colorOpacity + \";\";\r\n                        }\r\n                        ////////////////////////////////////\r\n                        tableHtml += \"<td style='\" + colStyl + \"'>\" + text + \"</td>\";\r\n                    }\r\n                } else {\r\n                    var text = genTextBody(tcNodes[\"a:txBody\"], node, undefined, undefined, undefined, warpObj);\r\n                    //Cells Style : TODO /////////////Amir\r\n                    var colWidthParam = getColsGrid[0][\"attrs\"][\"w\"];\r\n                    var colStyl = \"\";\r\n                    if (colWidthParam !== undefined) {\r\n                        var colWidth = parseInt(colWidthParam) * 96 / 914400;\r\n                        colStyl += \"width:\" + colWidth + \"px;\"\r\n                    }\r\n                    var getFill = tcNodes[j][\"a:tcPr\"][\"a:solidFill\"];\r\n                    var fillColor = \"\";\r\n                    var colorOpacity = 1;\r\n                    if (getFill !== undefined) {\r\n                        //console.log(getFill);\r\n                        fillColor = getSolidFill(getFill);\r\n                        colorOpacity = getColorOpacity(getFill);\r\n                    } else {\r\n                        //get from Theme TODO\r\n                    }\r\n                    if (fillColor != \"\") {\r\n                        colStyl += \" background-color:#\" + fillColor + \";\"\r\n                        colStyl += \" opacity\" + colorOpacity + \";\";\r\n                    }\r\n                    ////////////////////////////////////\r\n                    tableHtml += \"<td style='\" + colStyl + \"'>\" + text + \"</td>\";\r\n                }\r\n                tableHtml += \"</tr>\";\r\n            }\r\n\r\n            return tableHtml;\r\n        }\r\n\r\n        function genChart(node, warpObj) {\r\n\r\n            var order = node[\"attrs\"][\"order\"];\r\n            var xfrmNode = getTextByPathList(node, [\"p:xfrm\"]);\r\n            var result = \"<div id='chart\" + chartID + \"' class='block content' style='\" +\r\n                getPosition(xfrmNode, undefined, undefined) + getSize(xfrmNode, undefined, undefined) +\r\n                \" z-index: \" + order + \";'></div>\";\r\n\r\n            var rid = node[\"a:graphic\"][\"a:graphicData\"][\"c:chart\"][\"attrs\"][\"r:id\"];\r\n            var refName = warpObj[\"slideResObj\"][rid][\"target\"];\r\n            var content = readXmlFile(warpObj[\"zip\"], refName);\r\n            var plotArea = getTextByPathList(content, [\"c:chartSpace\", \"c:chart\", \"c:plotArea\"]);\r\n\r\n            var chartData = null;\r\n            for (var key in plotArea) {\r\n                switch (key) {\r\n                    case \"c:lineChart\":\r\n                        chartData = {\r\n                            \"type\": \"createChart\",\r\n                            \"data\": {\r\n                                \"chartID\": \"chart\" + chartID,\r\n                                \"chartType\": \"lineChart\",\r\n                                \"chartData\": extractChartData(plotArea[key][\"c:ser\"])\r\n                            }\r\n                        };\r\n                        break;\r\n                    case \"c:barChart\":\r\n                        chartData = {\r\n                            \"type\": \"createChart\",\r\n                            \"data\": {\r\n                                \"chartID\": \"chart\" + chartID,\r\n                                \"chartType\": \"barChart\",\r\n                                \"chartData\": extractChartData(plotArea[key][\"c:ser\"])\r\n                            }\r\n                        };\r\n                        break;\r\n                    case \"c:pieChart\":\r\n                        chartData = {\r\n                            \"type\": \"createChart\",\r\n                            \"data\": {\r\n                                \"chartID\": \"chart\" + chartID,\r\n                                \"chartType\": \"pieChart\",\r\n                                \"chartData\": extractChartData(plotArea[key][\"c:ser\"])\r\n                            }\r\n                        };\r\n                        break;\r\n                    case \"c:pie3DChart\":\r\n                        chartData = {\r\n                            \"type\": \"createChart\",\r\n                            \"data\": {\r\n                                \"chartID\": \"chart\" + chartID,\r\n                                \"chartType\": \"pie3DChart\",\r\n                                \"chartData\": extractChartData(plotArea[key][\"c:ser\"])\r\n                            }\r\n                        };\r\n                        break;\r\n                    case \"c:areaChart\":\r\n                        chartData = {\r\n                            \"type\": \"createChart\",\r\n                            \"data\": {\r\n                                \"chartID\": \"chart\" + chartID,\r\n                                \"chartType\": \"areaChart\",\r\n                                \"chartData\": extractChartData(plotArea[key][\"c:ser\"])\r\n                            }\r\n                        };\r\n                        break;\r\n                    case \"c:scatterChart\":\r\n                        chartData = {\r\n                            \"type\": \"createChart\",\r\n                            \"data\": {\r\n                                \"chartID\": \"chart\" + chartID,\r\n                                \"chartType\": \"scatterChart\",\r\n                                \"chartData\": extractChartData(plotArea[key][\"c:ser\"])\r\n                            }\r\n                        };\r\n                        break;\r\n                    case \"c:catAx\":\r\n                        break;\r\n                    case \"c:valAx\":\r\n                        break;\r\n                    default:\r\n                }\r\n            }\r\n\r\n            if (chartData !== null) {\r\n                MsgQueue.push(chartData);\r\n            }\r\n\r\n            chartID++;\r\n            return result;\r\n        }\r\n\r\n        function genDiagram(node, warpObj) {\r\n            //console.log(warpObj)\r\n            //readXmlFile(zip, sldFileName)\r\n            /**files define the diagram:\r\n             * 1-colors#.xml,\r\n             * 2-data#.xml, \r\n             * 3-layout#.xml,\r\n             * 4-quickStyle#.xml.\r\n             * 5-drawing#.xml, which Microsoft added as an extension for persisting diagram layout information.\r\n             */\r\n            ///get colors#.xml, data#.xml , layout#.xml , quickStyle#.xml\r\n            var order = node[\"attrs\"][\"order\"];\r\n            var zip = warpObj[\"zip\"];\r\n            var xfrmNode = getTextByPathList(node, [\"p:xfrm\"]);\r\n            var dgmRelIds = getTextByPathList(node, [\"a:graphic\", \"a:graphicData\", \"dgm:relIds\", \"attrs\"]);\r\n            //console.log(dgmRelIds)\r\n            var dgmClrFileId = dgmRelIds[\"r:cs\"];\r\n            var dgmDataFileId = dgmRelIds[\"r:dm\"];\r\n            var dgmLayoutFileId = dgmRelIds[\"r:lo\"];\r\n            var dgmQuickStyleFileId = dgmRelIds[\"r:qs\"];\r\n            var dgmClrFileName = warpObj[\"slideResObj\"][dgmClrFileId].target,\r\n                dgmDataFileName = warpObj[\"slideResObj\"][dgmDataFileId].target,\r\n                dgmLayoutFileName = warpObj[\"slideResObj\"][dgmLayoutFileId].target;\r\n            dgmQuickStyleFileName = warpObj[\"slideResObj\"][dgmQuickStyleFileId].target;\r\n            //console.log(dgmClrFileName,\"\\n\",dgmDataFileName,\"\\n\",dgmLayoutFileName,\"\\n\",dgmQuickStyleFileName);\r\n            var dgmClr = readXmlFile(zip, dgmClrFileName);\r\n            var dgmData = readXmlFile(zip, dgmDataFileName);\r\n            var dgmLayout = readXmlFile(zip, dgmLayoutFileName);\r\n            var dgmQuickStyle = readXmlFile(zip, dgmQuickStyleFileName);\r\n            //console.log(dgmClr,dgmData,dgmLayout,dgmQuickStyle)\r\n            ///get drawing#.xml\r\n            var dgmDrwFileName = \"\";\r\n            var dataModelExt = getTextByPathList(dgmData, [\"dgm:dataModel\", \"dgm:extLst\", \"a:ext\", \"dsp:dataModelExt\", \"attrs\"]);\r\n            if (dataModelExt !== undefined) {\r\n                var dgmDrwFileId = dataModelExt[\"relId\"];\r\n                dgmDrwFileName = warpObj[\"slideResObj\"][dgmDrwFileId][\"target\"];\r\n            }\r\n            //console.log(\"dgmDrwFileName: \",dgmDrwFileName);\r\n            var dgmDrwFile = \"\";\r\n            if (dgmDrwFileName != \"\") {\r\n                dgmDrwFile = readXmlFile(zip, dgmDrwFileName);\r\n            }\r\n            //console.log(\"dgmDrwFile: \",dgmDrwFile);\r\n            //processSpNode(node, warpObj)\r\n            var dgmDrwSpArray = getTextByPathList(dgmDrwFile, [\"dsp:drawing\", \"dsp:spTree\", \"dsp:sp\"]);\r\n            var rslt = \"\";\r\n            if (dgmDrwSpArray !== undefined) {\r\n                var dgmDrwSpArrayLen = dgmDrwSpArray.length;\r\n                for (var i = 0; i < dgmDrwSpArrayLen; i++) {\r\n                    var dspSp = dgmDrwSpArray[i];\r\n                    var dspSpObjToStr = JSON.stringify(dspSp);\r\n                    var pSpStr = dspSpObjToStr.replace(/dsp:/g, \"p:\");\r\n                    var pSpStrToObj = JSON.parse(pSpStr);\r\n                    //console.log(\"pSpStrToObj[\"+i+\"]: \",pSpStrToObj);\r\n                    rslt += processSpNode(pSpStrToObj, warpObj)\r\n                    //console.log(\"rslt[\"+i+\"]: \",rslt);\r\n                }\r\n                // dgmDrwFile: \"dsp:\"-> \"p:\"\r\n            }\r\n\r\n            return \"<div class='block content' style='\" +\r\n                getPosition(xfrmNode, undefined, undefined) +\r\n                getSize(xfrmNode, undefined, undefined) +\r\n                \"'>\" + rslt + \"</div>\";\r\n        }\r\n\r\n        function getPosition(slideSpNode, slideLayoutSpNode, slideMasterSpNode) {\r\n\r\n            var off = undefined;\r\n            var x = -1, y = -1;\r\n\r\n            if (slideSpNode !== undefined) {\r\n                off = slideSpNode[\"a:off\"][\"attrs\"];\r\n            } else if (slideLayoutSpNode !== undefined) {\r\n                off = slideLayoutSpNode[\"a:off\"][\"attrs\"];\r\n            } else if (slideMasterSpNode !== undefined) {\r\n                off = slideMasterSpNode[\"a:off\"][\"attrs\"];\r\n            }\r\n\r\n            if (off === undefined) {\r\n                return \"\";\r\n            } else {\r\n                x = parseInt(off[\"x\"]) * 96 / 914400;\r\n                y = parseInt(off[\"y\"]) * 96 / 914400;\r\n                return (isNaN(x) || isNaN(y)) ? \"\" : \"top:\" + y + \"px; left:\" + x + \"px;\";\r\n            }\r\n\r\n        }\r\n\r\n        function getSize(slideSpNode, slideLayoutSpNode, slideMasterSpNode) {\r\n\r\n            var ext = undefined;\r\n            var w = -1, h = -1;\r\n\r\n            if (slideSpNode !== undefined) {\r\n                ext = slideSpNode[\"a:ext\"][\"attrs\"];\r\n            } else if (slideLayoutSpNode !== undefined) {\r\n                ext = slideLayoutSpNode[\"a:ext\"][\"attrs\"];\r\n            } else if (slideMasterSpNode !== undefined) {\r\n                ext = slideMasterSpNode[\"a:ext\"][\"attrs\"];\r\n            }\r\n\r\n            if (ext === undefined) {\r\n                return \"\";\r\n            } else {\r\n                w = parseInt(ext[\"cx\"]) * 96 / 914400;\r\n                h = parseInt(ext[\"cy\"]) * 96 / 914400;\r\n                return (isNaN(w) || isNaN(h)) ? \"\" : \"width:\" + w + \"px; height:\" + h + \"px;\";\r\n            }\r\n\r\n        }\r\n\r\n        function getHorizontalAlign(node, slideLayoutSpNode, slideMasterSpNode, type, slideMasterTextStyles) {\r\n\r\n            var algn = getTextByPathList(node, [\"a:pPr\", \"attrs\", \"algn\"]);\r\n            if (algn === undefined) {\r\n                algn = getTextByPathList(slideLayoutSpNode, [\"p:txBody\", \"a:p\", \"a:pPr\", \"attrs\", \"algn\"]);\r\n                if (algn === undefined) {\r\n                    algn = getTextByPathList(slideMasterSpNode, [\"p:txBody\", \"a:p\", \"a:pPr\", \"attrs\", \"algn\"]);\r\n                    if (algn === undefined) {\r\n                        switch (type) {\r\n                            case \"title\":\r\n                            case \"subTitle\":\r\n                            case \"ctrTitle\":\r\n                                algn = getTextByPathList(slideMasterTextStyles, [\"p:titleStyle\", \"a:lvl1pPr\", \"attrs\", \"alng\"]);\r\n                                break;\r\n                            default:\r\n                                algn = getTextByPathList(slideMasterTextStyles, [\"p:otherStyle\", \"a:lvl1pPr\", \"attrs\", \"alng\"]);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (algn === undefined) {\r\n                if (type == \"title\" || type == \"subTitle\" || type == \"ctrTitle\") {\r\n                    return \"h-mid\";\r\n                } else if (type == \"sldNum\") {\r\n                    return \"h-right\";\r\n                }\r\n            }\r\n            return algn === \"ctr\" ? \"h-mid\" : algn === \"r\" ? \"h-right\" : \"h-left\";\r\n        }\r\n\r\n        function getVerticalAlign(node, slideLayoutSpNode, slideMasterSpNode, type, slideMasterTextStyles) {\r\n\r\n            // 上中下對齊: X, <a:bodyPr anchor=\"ctr\">, <a:bodyPr anchor=\"b\">\r\n            var anchor = getTextByPathList(node, [\"p:txBody\", \"a:bodyPr\", \"attrs\", \"anchor\"]);\r\n            if (anchor === undefined) {\r\n                anchor = getTextByPathList(slideLayoutSpNode, [\"p:txBody\", \"a:bodyPr\", \"attrs\", \"anchor\"]);\r\n                if (anchor === undefined) {\r\n                    anchor = getTextByPathList(slideMasterSpNode, [\"p:txBody\", \"a:bodyPr\", \"attrs\", \"anchor\"]);\r\n                }\r\n            }\r\n\r\n            return anchor === \"ctr\" ? \"v-mid\" : anchor === \"b\" ? \"v-down\" : \"v-up\";\r\n        }\r\n\r\n        function getFontType(node, type, slideMasterTextStyles) {\r\n            var typeface = getTextByPathList(node, [\"a:rPr\", \"a:latin\", \"attrs\", \"typeface\"]);\r\n\r\n            if (typeface === undefined) {\r\n                var fontSchemeNode = getTextByPathList(themeContent, [\"a:theme\", \"a:themeElements\", \"a:fontScheme\"]);\r\n                if (type == \"title\" || type == \"subTitle\" || type == \"ctrTitle\") {\r\n                    typeface = getTextByPathList(fontSchemeNode, [\"a:majorFont\", \"a:latin\", \"attrs\", \"typeface\"]);\r\n                } else if (type == \"body\") {\r\n                    typeface = getTextByPathList(fontSchemeNode, [\"a:minorFont\", \"a:latin\", \"attrs\", \"typeface\"]);\r\n                } else {\r\n                    typeface = getTextByPathList(fontSchemeNode, [\"a:minorFont\", \"a:latin\", \"attrs\", \"typeface\"]);\r\n                }\r\n            }\r\n\r\n            return (typeface === undefined) ? \"inherit\" : typeface;\r\n        }\r\n\r\n        function getFontColorPr(node, spNode, type, slideMasterTextStyles) {\r\n            //text border using: text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;\r\n            //{getFontColor(..) return color} -> getFontColorPr(..) return array[color,textBordr/shadow]\r\n            //https://stackoverflow.com/questions/2570972/css-font-border\r\n            //https://www.w3schools.com/cssref/css3_pr_text-shadow.asp\r\n            //console.log(node)\r\n            var rPrNode = getTextByPathList(node, [\"a:rPr\"]);\r\n            var filTyp, color, textBordr;\r\n            if (rPrNode !== undefined) {\r\n                filTyp = getFillType(rPrNode);\r\n                if (filTyp == \"SOLID_FILL\") {\r\n                    var solidFillNode = getTextByPathList(node, [\"a:rPr\", \"a:solidFill\"]);\r\n                    color = getSolidFill(solidFillNode);\r\n                } else if (filTyp == \"PATTERN_FILL\") {\r\n                    var pattFill = getTextByPathList(node, [\"a:rPr\", \"a:pattFill\"]);\r\n                    color = getPatternFill(pattFill);\r\n                } else {\r\n                    var sPstyle = getTextByPathList(spNode, [\"p:style\", \"a:fontRef\"]);\r\n                    if (sPstyle !== undefined) {\r\n                        color = getSolidFill(sPstyle);\r\n                    }\r\n                }\r\n                //console.log(node,filTyp,color)\r\n            }\r\n            if (color === undefined || color === \"FFF\") {\r\n                color = \"#000\";\r\n            } else {\r\n                color = \"#\" + color;\r\n            }\r\n            //textBordr\r\n            var txtBrdrNode = getTextByPathList(node, [\"a:rPr\", \"a:ln\"]);\r\n            if (txtBrdrNode !== undefined) {\r\n                var txBrd = getBorder(node, false, \"text\");\r\n                var txBrdAry = txBrd.split(\" \");\r\n                var brdSize = (parseInt(txBrdAry[0].substring(0, txBrdAry[0].indexOf(\"pt\"))) * (4 / 3)) + \"px\";\r\n                var brdClr = txBrdAry[2];\r\n                //var brdTyp = txBrdAry[1]; //not in use\r\n                textBordr = \"-\" + brdSize + \" 0 \" + brdClr + \", 0 \" + brdSize + \" \" + brdClr + \", \" + brdSize + \" 0 \" + brdClr + \", 0 -\" + brdSize + \" \" + brdClr + \";\"\r\n                //console.log(node,\"txBrd: \",textBordr);\r\n            } else {\r\n                textBordr = \"none\";\r\n            }\r\n            return [color, textBordr];\r\n        }\r\n        function getFontSize(node, slideLayoutSpNode, slideMasterSpNode, type, slideMasterTextStyles) {\r\n            var fontSize = undefined;\r\n            if (node[\"a:rPr\"] !== undefined) {\r\n                fontSize = parseInt(node[\"a:rPr\"][\"attrs\"][\"sz\"]) / 100;\r\n            }\r\n\r\n            if ((isNaN(fontSize) || fontSize === undefined)) {\r\n                var sz = getTextByPathList(slideLayoutSpNode, [\"p:txBody\", \"a:lstStyle\", \"a:lvl1pPr\", \"a:defRPr\", \"attrs\", \"sz\"]);\r\n                fontSize = parseInt(sz) / 100;\r\n            }\r\n\r\n            if (isNaN(fontSize) || fontSize === undefined) {\r\n                if (type == \"title\" || type == \"subTitle\" || type == \"ctrTitle\") {\r\n                    var sz = getTextByPathList(slideMasterTextStyles, [\"p:titleStyle\", \"a:lvl1pPr\", \"a:defRPr\", \"attrs\", \"sz\"]);\r\n                } else if (type == \"body\") {\r\n                    var sz = getTextByPathList(slideMasterTextStyles, [\"p:bodyStyle\", \"a:lvl1pPr\", \"a:defRPr\", \"attrs\", \"sz\"]);\r\n                } else if (type == \"dt\" || type == \"sldNum\") {\r\n                    var sz = \"1200\";\r\n                } else if (type === undefined) {\r\n                    var sz = getTextByPathList(slideMasterTextStyles, [\"p:otherStyle\", \"a:lvl1pPr\", \"a:defRPr\", \"attrs\", \"sz\"]);\r\n                }\r\n                fontSize = parseInt(sz) / 100;\r\n            }\r\n\r\n            var baseline = getTextByPathList(node, [\"a:rPr\", \"attrs\", \"baseline\"]);\r\n            if (baseline !== undefined && !isNaN(fontSize)) {\r\n                fontSize -= 10;\r\n            }\r\n\r\n            return isNaN(fontSize) ? \"inherit\" : (fontSize + \"pt\");\r\n        }\r\n\r\n        function getFontBold(node, type, slideMasterTextStyles) {\r\n            return (node[\"a:rPr\"] !== undefined && node[\"a:rPr\"][\"attrs\"][\"b\"] === \"1\") ? \"bold\" : \"initial\";\r\n        }\r\n\r\n        function getFontItalic(node, type, slideMasterTextStyles) {\r\n            return (node[\"a:rPr\"] !== undefined && node[\"a:rPr\"][\"attrs\"][\"i\"] === \"1\") ? \"italic\" : \"normal\";\r\n        }\r\n\r\n        function getFontDecoration(node, type, slideMasterTextStyles) {\r\n            ///////////////////////////////Amir///////////////////////////////\r\n            if (node[\"a:rPr\"] !== undefined) {\r\n                var underLine = node[\"a:rPr\"][\"attrs\"][\"u\"] !== undefined ? node[\"a:rPr\"][\"attrs\"][\"u\"] : \"none\";\r\n                var strikethrough = node[\"a:rPr\"][\"attrs\"][\"strike\"] !== undefined ? node[\"a:rPr\"][\"attrs\"][\"strike\"] : 'noStrike';\r\n                //console.log(\"strikethrough: \"+strikethrough);\r\n\r\n                if (underLine != \"none\" && strikethrough == \"noStrike\") {\r\n                    return \"underline\";\r\n                } else if (underLine == \"none\" && strikethrough != \"noStrike\") {\r\n                    return \"line-through\";\r\n                } else if (underLine != \"none\" && strikethrough != \"noStrike\") {\r\n                    return \"underline line-through\";\r\n                } else {\r\n                    return \"initial\";\r\n                }\r\n            } else {\r\n                return \"initial\";\r\n            }\r\n            /////////////////////////////////////////////////////////////////\r\n            //return (node[\"a:rPr\"] !== undefined && node[\"a:rPr\"][\"attrs\"][\"u\"] === \"sng\") ? \"underline\" : \"initial\";\r\n        }\r\n        ////////////////////////////////////Amir/////////////////////////////////////\r\n        function getTextHorizontalAlign(node, type, slideMasterTextStyles) {\r\n            var getAlgn = getTextByPathList(node, [\"a:pPr\", \"attrs\", \"algn\"]);\r\n            var align = \"initial\";\r\n            if (getAlgn !== undefined) {\r\n                switch (getAlgn) {\r\n                    case \"l\":\r\n                        align = \"left\";\r\n                        break;\r\n                    case \"r\":\r\n                        align = \"right\";\r\n                        break;\r\n                    case \"ctr\":\r\n                        align = \"center\";\r\n                        break;\r\n                    case \"just\":\r\n                        align = \"justify\";\r\n                        break;\r\n                    case \"dist\":\r\n                        align = \"justify\";\r\n                        break;\r\n                    default:\r\n                        align = \"initial\";\r\n                }\r\n            }\r\n            return align;\r\n        }\r\n        /////////////////////////////////////////////////////////////////////\r\n        function getTextVerticalAlign(node, type, slideMasterTextStyles) {\r\n            var baseline = getTextByPathList(node, [\"a:rPr\", \"attrs\", \"baseline\"]);\r\n            return baseline === undefined ? \"baseline\" : (parseInt(baseline) / 1000) + \"%\";\r\n        }\r\n        ///////////////////////////////////Amir/////////////////////////////\r\n        function getTextDirection(node, type, slideMasterTextStyles) {\r\n            //get lvl\r\n            var pprLvl = getTextByPathList(node, [\"a:pPr\", \"attrs\", \"lvl\"]);\r\n            var pprLvlNum = pprLvl === undefined ? 1 : Number(pprLvl) + 1;\r\n            var lvlNode = \"a:lvl\" + pprLvlNum + \"pPr\";\r\n            var pprAlgn = getTextByPathList(node, [\"a:pPr\", \"attrs\", \"algn\"]);\r\n            var isDir = getTextByPathList(slideMasterTextStyles, [\"p:bodyStyle\", lvlNode, \"attrs\", \"rtl\"]);\r\n            //var tmp = getTextByPathList(node, [\"a:r\", \"a:t\"]);\r\n            var dir = \"\";\r\n            if (isDir !== undefined) {\r\n                if (isDir == \"1\" && (pprAlgn === undefined || pprAlgn == \"r\")) {\r\n                    dir = \"rtl\";\r\n                } else { //isDir ==\"0\"\r\n                    dir = \"ltr\";\r\n                }\r\n            }\r\n            //console.log(tmp,isDir,pprAlgn,dir)\r\n            return dir;\r\n        }\r\n        function getTableBorders(node) {\r\n            var borderStyle = \"\";\r\n            if (node[\"a:bottom\"] !== undefined) {\r\n                var obj = {\r\n                    \"p:spPr\": {\r\n                        \"a:ln\": node[\"a:bottom\"][\"a:ln\"]\r\n                    }\r\n                }\r\n                var borders = getBorder(obj, false, \"shape\");\r\n                borderStyle += borders.replace(\"border\", \"border-bottom\");\r\n            }\r\n            if (node[\"a:top\"] !== undefined) {\r\n                var obj = {\r\n                    \"p:spPr\": {\r\n                        \"a:ln\": node[\"a:top\"][\"a:ln\"]\r\n                    }\r\n                }\r\n                var borders = getBorder(obj, false, \"shape\");\r\n                borderStyle += borders.replace(\"border\", \"border-top\");\r\n            }\r\n            if (node[\"a:right\"] !== undefined) {\r\n                var obj = {\r\n                    \"p:spPr\": {\r\n                        \"a:ln\": node[\"a:right\"][\"a:ln\"]\r\n                    }\r\n                }\r\n                var borders = getBorder(obj, false, \"shape\");\r\n                borderStyle += borders.replace(\"border\", \"border-right\");\r\n            }\r\n            if (node[\"a:left\"] !== undefined) {\r\n                var obj = {\r\n                    \"p:spPr\": {\r\n                        \"a:ln\": node[\"a:left\"][\"a:ln\"]\r\n                    }\r\n                }\r\n                var borders = getBorder(obj, false, \"shape\");\r\n                borderStyle += borders.replace(\"border\", \"border-left\");\r\n            }\r\n\r\n            return borderStyle;\r\n        }\r\n        //////////////////////////////////////////////////////////////////\r\n        function getBorder(node, isSvgMode, bType) {\r\n            var cssText, lineNode;\r\n            if (bType == \"shape\") {\r\n                cssText = \"border: \";\r\n                lineNode = node[\"p:spPr\"][\"a:ln\"];\r\n            } else if (bType == \"text\") {\r\n                cssText = \"\";\r\n                lineNode = node[\"a:rPr\"][\"a:ln\"];\r\n\r\n            }\r\n\r\n            // Border width: 1pt = 12700, default = 0.75pt\r\n            var borderWidth = parseInt(getTextByPathList(lineNode, [\"attrs\", \"w\"])) / 12700;\r\n            if (isNaN(borderWidth) || borderWidth < 1) {\r\n                cssText += \"1pt \";\r\n            } else {\r\n                cssText += borderWidth + \"pt \";\r\n            }\r\n            // Border type\r\n            var borderType = getTextByPathList(lineNode, [\"a:prstDash\", \"attrs\", \"val\"]);\r\n            var strokeDasharray = \"0\";\r\n            switch (borderType) {\r\n                case \"solid\":\r\n                    cssText += \"solid\";\r\n                    strokeDasharray = \"0\";\r\n                    break;\r\n                case \"dash\":\r\n                    cssText += \"dashed\";\r\n                    strokeDasharray = \"5\";\r\n                    break;\r\n                case \"dashDot\":\r\n                    cssText += \"dashed\";\r\n                    strokeDasharray = \"5, 5, 1, 5\";\r\n                    break;\r\n                case \"dot\":\r\n                    cssText += \"dotted\";\r\n                    strokeDasharray = \"1, 5\";\r\n                    break;\r\n                case \"lgDash\":\r\n                    cssText += \"dashed\";\r\n                    strokeDasharray = \"10, 5\";\r\n                    break;\r\n                case \"lgDashDotDot\":\r\n                    cssText += \"dashed\";\r\n                    strokeDasharray = \"10, 5, 1, 5, 1, 5\";\r\n                    break;\r\n                case \"sysDash\":\r\n                    cssText += \"dashed\";\r\n                    strokeDasharray = \"5, 2\";\r\n                    break;\r\n                case \"sysDashDot\":\r\n                    cssText += \"dashed\";\r\n                    strokeDasharray = \"5, 2, 1, 5\";\r\n                    break;\r\n                case \"sysDashDotDot\":\r\n                    cssText += \"dashed\";\r\n                    strokeDasharray = \"5, 2, 1, 5, 1, 5\";\r\n                    break;\r\n                case \"sysDot\":\r\n                    cssText += \"dotted\";\r\n                    strokeDasharray = \"2, 5\";\r\n                    break;\r\n                case undefined:\r\n                //console.log(borderType);\r\n                default:\r\n                    cssText += \"solid\";\r\n                    strokeDasharray = \"0\";\r\n            }\r\n            // Border color\r\n            var borderColor = getTextByPathList(lineNode, [\"a:solidFill\", \"a:srgbClr\", \"attrs\", \"val\"]);\r\n            if (borderColor === undefined) {\r\n                var schemeClrNode = getTextByPathList(lineNode, [\"a:solidFill\", \"a:schemeClr\"]);\r\n                if (schemeClrNode !== undefined) {\r\n                    var schemeClr = \"a:\" + getTextByPathList(schemeClrNode, [\"attrs\", \"val\"]);\r\n                    var borderColor = getSchemeColorFromTheme(schemeClr, undefined);\r\n                }\r\n            }\r\n\r\n            // 2. drawingML namespace\r\n            if (borderColor === undefined) {\r\n                var schemeClrNode = getTextByPathList(node, [\"p:style\", \"a:lnRef\", \"a:schemeClr\"]);\r\n                if (schemeClrNode !== undefined) {\r\n                    var schemeClr = \"a:\" + getTextByPathList(schemeClrNode, [\"attrs\", \"val\"]);\r\n                    var borderColor = getSchemeColorFromTheme(schemeClr, undefined);\r\n                }\r\n\r\n                if (borderColor !== undefined) {\r\n                    var shade = getTextByPathList(schemeClrNode, [\"a:shade\", \"attrs\", \"val\"]);\r\n                    if (shade !== undefined) {\r\n                        shade = parseInt(shade) / 100000;\r\n                        var color = new colz.Color(\"#\" + borderColor);\r\n                        color.setLum(color.hsl.l * shade);\r\n                        borderColor = color.hex.replace(\"#\", \"\");\r\n                    }\r\n                }\r\n\r\n            }\r\n\r\n            if (borderColor === undefined) {\r\n                if (isSvgMode) {\r\n                    borderColor = \"none\";\r\n                } else {\r\n                    borderColor = \"#000\";\r\n                }\r\n            } else {\r\n                borderColor = \"#\" + borderColor;\r\n\r\n            }\r\n            cssText += \" \" + borderColor + \" \";\r\n\r\n\r\n\r\n            if (isSvgMode) {\r\n                return { \"color\": borderColor, \"width\": borderWidth, \"type\": borderType, \"strokeDasharray\": strokeDasharray };\r\n            } else {\r\n                return cssText + \";\";\r\n            }\r\n        }\r\n\r\n        function getSlideBackgroundFill(slideContent, slideLayoutContent, slideMasterContent, warpObj) {\r\n            //console.log(slideContent)\r\n            //getFillType(node)\r\n            var bgPr = getTextByPathList(slideContent, [\"p:sld\", \"p:cSld\", \"p:bg\", \"p:bgPr\"]);\r\n            var bgRef = getTextByPathList(slideContent, [\"p:sld\", \"p:cSld\", \"p:bg\", \"p:bgRef\"]);\r\n            var bgcolor;\r\n            if (bgPr !== undefined) {\r\n                //bgcolor = \"background-color: blue;\";\r\n                var bgFillTyp = getFillType(bgPr);\r\n\r\n                if (bgFillTyp == \"SOLID_FILL\") {\r\n                    var sldFill = bgPr[\"a:solidFill\"];\r\n                    var bgColor = getSolidFill(sldFill);\r\n                    var sldTint = getColorOpacity(sldFill);\r\n                    bgcolor = \"background: rgba(\" + hexToRgbNew(bgColor) + \",\" + sldTint + \");\";\r\n\r\n                } else if (bgFillTyp == \"GRADIENT_FILL\") {\r\n                    bgcolor = getBgGradientFill(bgPr, undefined, slideMasterContent);\r\n                } else if (bgFillTyp == \"PIC_FILL\") {\r\n                    bgcolor = getBgPicFill(bgPr, \"slideBg\", warpObj);\r\n\r\n                }\r\n                //console.log(slideContent,slideMasterContent,color_ary,tint_ary,rot,bgcolor)\r\n            } else if (bgRef !== undefined) {\r\n                //console.log(\"slideContent\",bgRef)\r\n                var phClr;\r\n                if (bgRef[\"a:srgbClr\"] !== undefined) {\r\n                    phClr = getTextByPathList(bgRef, [\"a:srgbClr\", \"attrs\", \"val\"]); //#...\r\n                } else if (bgRef[\"a:schemeClr\"] !== undefined) { //a:schemeClr\r\n                    var schemeClr = getTextByPathList(bgRef, [\"a:schemeClr\", \"attrs\", \"val\"]);\r\n                    phClr = getSchemeColorFromTheme(\"a:\" + schemeClr, slideMasterContent); //#...\r\n                    //console.log(\"schemeClr\",schemeClr,\"phClr=\",phClr)\r\n                }\r\n                var idx = Number(bgRef[\"attrs\"][\"idx\"]);\r\n\r\n\r\n                if (idx == 0 || idx == 1000) {\r\n                    //no background\r\n                } else if (idx > 0 && idx < 1000) {\r\n                    //fillStyleLst in themeContent\r\n                    //themeContent[\"a:fmtScheme\"][\"a:fillStyleLst\"]\r\n                    //bgcolor = \"background: red;\";\r\n                } else if (idx > 1000) {\r\n                    //bgFillStyleLst  in themeContent\r\n                    //themeContent[\"a:fmtScheme\"][\"a:bgFillStyleLst\"]\r\n                    var trueIdx = idx - 1000;\r\n                    var bgFillLst = themeContent[\"a:theme\"][\"a:themeElements\"][\"a:fmtScheme\"][\"a:bgFillStyleLst\"];\r\n                    var sortblAry = [];\r\n                    Object.keys(bgFillLst).forEach(function (key) {\r\n                        var bgFillLstTyp = bgFillLst[key];\r\n                        if (key != \"attrs\") {\r\n                            if (bgFillLstTyp.constructor === Array) {\r\n                                for (var i = 0; i < bgFillLstTyp.length; i++) {\r\n                                    var obj = {};\r\n                                    obj[key] = bgFillLstTyp[i];\r\n                                    obj[\"idex\"] = bgFillLstTyp[i][\"attrs\"][\"order\"];\r\n                                    sortblAry.push(obj)\r\n                                }\r\n                            } else {\r\n                                var obj = {};\r\n                                obj[key] = bgFillLstTyp;\r\n                                obj[\"idex\"] = bgFillLstTyp[\"attrs\"][\"order\"];\r\n                                sortblAry.push(obj)\r\n                            }\r\n                        }\r\n                    });\r\n                    var sortByOrder = sortblAry.slice(0);\r\n                    sortByOrder.sort(function (a, b) {\r\n                        return a.idex - b.idex;\r\n                    });\r\n                    var bgFillLstIdx = sortByOrder[trueIdx - 1];\r\n                    var bgFillTyp = getFillType(bgFillLstIdx);\r\n                    if (bgFillTyp == \"SOLID_FILL\") {\r\n                        var sldFill = bgFillLstIdx[\"a:solidFill\"];\r\n                        //var sldBgColor = getSolidFill(sldFill);\r\n                        var sldTint = getColorOpacity(sldFill);\r\n                        bgcolor = \"background: rgba(\" + hexToRgbNew(phClr) + \",\" + sldTint + \");\";\r\n                        //console.log(\"slideMasterContent - sldFill\",sldFill)\r\n                    } else if (bgFillTyp == \"GRADIENT_FILL\") {\r\n                        bgcolor = getBgGradientFill(bgFillLstIdx, phClr, slideMasterContent);\r\n                    }\r\n                }\r\n\r\n            } else {\r\n                bgPr = getTextByPathList(slideLayoutContent, [\"p:sldLayout\", \"p:cSld\", \"p:bg\", \"p:bgPr\"]);\r\n                bgRef = getTextByPathList(slideLayoutContent, [\"p:sldLayout\", \"p:cSld\", \"p:bg\", \"p:bgRef\"]);\r\n                //console.log(\"slideLayoutContent\",bgPr,bgRef)\r\n                if (bgPr !== undefined) {\r\n                    var bgFillTyp = getFillType(bgPr);\r\n                    if (bgFillTyp == \"SOLID_FILL\") {\r\n                        var sldFill = bgPr[\"a:solidFill\"];\r\n                        var bgColor = getSolidFill(sldFill);\r\n                        var sldTint = getColorOpacity(sldFill);\r\n                        bgcolor = \"background: rgba(\" + hexToRgbNew(bgColor) + \",\" + sldTint + \");\";\r\n                    } else if (bgFillTyp == \"GRADIENT_FILL\") {\r\n                        bgcolor = getBgGradientFill(bgPr, undefined, slideMasterContent);\r\n                    } else if (bgFillTyp == \"PIC_FILL\") {\r\n                        bgcolor = getBgPicFill(bgPr, \"layoutBg\", warpObj);\r\n\r\n                    }\r\n                    //console.log(\"slideLayoutContent\",bgcolor)\r\n                } else if (bgRef !== undefined) {\r\n                    bgcolor = \"background: red;\";\r\n                } else {\r\n                    bgPr = getTextByPathList(slideMasterContent, [\"p:sldMaster\", \"p:cSld\", \"p:bg\", \"p:bgPr\"]);\r\n                    bgRef = getTextByPathList(slideMasterContent, [\"p:sldMaster\", \"p:cSld\", \"p:bg\", \"p:bgRef\"]);\r\n\r\n                    //console.log(\"bgRef\",bgRef[\"a:schemeClr\"][\"attrs\"][\"val\"])\r\n                    if (bgPr !== undefined) {\r\n                        var bgFillTyp = getFillType(bgPr);\r\n                        if (bgFillTyp == \"SOLID_FILL\") {\r\n                            var sldFill = bgPr[\"a:solidFill\"];\r\n                            var bgColor = getSolidFill(sldFill);\r\n                            var sldTint = getColorOpacity(sldFill);\r\n                            bgcolor = \"background: rgba(\" + hexToRgbNew(bgColor) + \",\" + sldTint + \");\";\r\n                        } else if (bgFillTyp == \"GRADIENT_FILL\") {\r\n                            bgcolor = getBgGradientFill(bgPr, undefined, slideMasterContent);\r\n                        } else if (bgFillTyp == \"PIC_FILL\") {\r\n                            bgcolor = getBgPicFill(bgPr, \"masterBg\", warpObj);\r\n                        }\r\n                    } else if (bgRef !== undefined) {\r\n                        //var obj={\r\n                        //    \"a:solidFill\": bgRef\r\n                        //}\r\n                        //var phClr = getSolidFill(bgRef);\r\n                        var phClr;\r\n                        if (bgRef[\"a:srgbClr\"] !== undefined) {\r\n                            phClr = getTextByPathList(bgRef, [\"a:srgbClr\", \"attrs\", \"val\"]); //#...\r\n                        } else if (bgRef[\"a:schemeClr\"] !== undefined) { //a:schemeClr\r\n                            var schemeClr = getTextByPathList(bgRef, [\"a:schemeClr\", \"attrs\", \"val\"]);\r\n\r\n                            phClr = getSchemeColorFromTheme(\"a:\" + schemeClr, slideMasterContent); //#...\r\n                            //console.log(\"phClr\",phClr)\r\n                        }\r\n                        var idx = Number(bgRef[\"attrs\"][\"idx\"]);\r\n                        //console.log(\"phClr=\",phClr,\"idx=\",idx)\r\n\r\n                        if (idx == 0 || idx == 1000) {\r\n                            //no background\r\n                        } else if (idx > 0 && idx < 1000) {\r\n                            //fillStyleLst in themeContent\r\n                            //themeContent[\"a:fmtScheme\"][\"a:fillStyleLst\"]\r\n                            //bgcolor = \"background: red;\";\r\n                        } else if (idx > 1000) {\r\n                            //bgFillStyleLst  in themeContent\r\n                            //themeContent[\"a:fmtScheme\"][\"a:bgFillStyleLst\"]\r\n                            var trueIdx = idx - 1000;\r\n                            var bgFillLst = themeContent[\"a:theme\"][\"a:themeElements\"][\"a:fmtScheme\"][\"a:bgFillStyleLst\"];\r\n                            var sortblAry = [];\r\n                            Object.keys(bgFillLst).forEach(function (key) {\r\n                                //console.log(\"cubicBezTo[\"+key+\"]:\");\r\n                                var bgFillLstTyp = bgFillLst[key];\r\n                                if (key != \"attrs\") {\r\n                                    if (bgFillLstTyp.constructor === Array) {\r\n                                        for (var i = 0; i < bgFillLstTyp.length; i++) {\r\n                                            var obj = {};\r\n                                            obj[key] = bgFillLstTyp[i];\r\n                                            obj[\"idex\"] = bgFillLstTyp[i][\"attrs\"][\"order\"];\r\n                                            sortblAry.push(obj)\r\n                                        }\r\n                                    } else {\r\n                                        var obj = {};\r\n                                        obj[key] = bgFillLstTyp;\r\n                                        obj[\"idex\"] = bgFillLstTyp[\"attrs\"][\"order\"];\r\n                                        sortblAry.push(obj)\r\n                                    }\r\n                                }\r\n                            });\r\n                            var sortByOrder = sortblAry.slice(0);\r\n                            sortByOrder.sort(function (a, b) {\r\n                                return a.idex - b.idex;\r\n                            });\r\n                            var bgFillLstIdx = sortByOrder[trueIdx - 1];\r\n                            var bgFillTyp = getFillType(bgFillLstIdx);\r\n                            //console.log(\"bgFillLstIdx\",bgFillLstIdx);\r\n                            if (bgFillTyp == \"SOLID_FILL\") {\r\n                                var sldFill = bgFillLstIdx[\"a:solidFill\"];\r\n                                var sldTint = getColorOpacity(sldFill);\r\n                                bgcolor = \"background: rgba(\" + hexToRgbNew(phClr) + \",\" + sldTint + \");\";\r\n                            } else if (bgFillTyp == \"GRADIENT_FILL\") {\r\n                                bgcolor = getBgGradientFill(bgFillLstIdx, phClr, slideMasterContent);\r\n                            } else {\r\n                                console.log(bgFillTyp)\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            //console.log(\"bgcolor: \",bgcolor)   \r\n            return bgcolor;\r\n        }\r\n        function getBgGradientFill(bgPr, phClr, slideMasterContent) {\r\n            var bgcolor = \"\";\r\n            if (bgPr !== undefined) {\r\n                var grdFill = bgPr[\"a:gradFill\"];\r\n                var gsLst = grdFill[\"a:gsLst\"][\"a:gs\"];\r\n                var startColorNode, endColorNode;\r\n                var color_ary = [];\r\n                var tint_ary = [];\r\n                for (var i = 0; i < gsLst.length; i++) {\r\n                    var lo_tint;\r\n                    var lo_color = \"\";\r\n                    if (gsLst[i][\"a:srgbClr\"] !== undefined) {\r\n                        if (phClr === undefined) {\r\n                            lo_color = getTextByPathList(gsLst[i], [\"a:srgbClr\", \"attrs\", \"val\"]); //#...\r\n                        }\r\n                        lo_tint = getTextByPathList(gsLst[i], [\"a:srgbClr\", \"a:tint\", \"attrs\", \"val\"]);\r\n                    } else if (gsLst[i][\"a:schemeClr\"] !== undefined) { //a:schemeClr\r\n                        if (phClr === undefined) {\r\n                            var schemeClr = getTextByPathList(gsLst[i], [\"a:schemeClr\", \"attrs\", \"val\"]);\r\n                            lo_color = getSchemeColorFromTheme(\"a:\" + schemeClr, slideMasterContent); //#...\r\n                        }\r\n                        lo_tint = getTextByPathList(gsLst[i], [\"a:schemeClr\", \"a:tint\", \"attrs\", \"val\"]);\r\n                        //console.log(\"schemeClr\",schemeClr,slideMasterContent)\r\n                    }\r\n                    //console.log(\"lo_color\",lo_color)\r\n                    color_ary[i] = lo_color;\r\n                    tint_ary[i] = (lo_tint !== undefined) ? parseInt(lo_tint) / 100000 : 1;\r\n                }\r\n                //get rot\r\n                var lin = grdFill[\"a:lin\"];\r\n                var rot = 90;\r\n                if (lin !== undefined) {\r\n                    rot = angleToDegrees(lin[\"attrs\"][\"ang\"]) + 90;\r\n                }\r\n                bgcolor = \"background: linear-gradient(\" + rot + \"deg,\";\r\n                for (var i = 0; i < gsLst.length; i++) {\r\n                    if (i == gsLst.length - 1) {\r\n                        if (phClr === undefined) {\r\n                            bgcolor += \"rgba(\" + hexToRgbNew(color_ary[i]) + \",\" + tint_ary[i] + \")\" + \");\";\r\n                        } else {\r\n                            bgcolor += \"rgba(\" + hexToRgbNew(phClr) + \",\" + tint_ary[i] + \")\" + \");\";\r\n                        }\r\n                    } else {\r\n                        if (phClr === undefined) {\r\n                            bgcolor += \"rgba(\" + hexToRgbNew(color_ary[i]) + \",\" + tint_ary[i] + \")\" + \", \";\r\n                        } else {\r\n                            bgcolor += \"rgba(\" + hexToRgbNew(phClr) + \",\" + tint_ary[i] + \")\" + \", \";\r\n                        }\r\n                    }\r\n                }\r\n            } else {\r\n                if (phClr === undefined) {\r\n                    bgcolor = \"rgba(\" + hexToRgbNew(phClr) + \",0);\";\r\n                }\r\n            }\r\n            return bgcolor;\r\n        }\r\n        function getBgPicFill(bgPr, sorce, warpObj) {\r\n            var bgcolor;\r\n            var picFillBase64 = getPicFill(sorce, bgPr[\"a:blipFill\"], warpObj);\r\n            var ordr = bgPr[\"attrs\"][\"order\"];\r\n            //a:srcRect\r\n            //a:stretch => a:fillRect =>attrs (l:-17000, r:-17000)\r\n            bgcolor = \"background-image: url(\" + picFillBase64 + \");  z-index: \" + ordr + \";\";\r\n            return bgcolor;\r\n        }\r\n        function hexToRgbNew(hex) {\r\n            var arrBuff = new ArrayBuffer(4);\r\n            var vw = new DataView(arrBuff);\r\n            vw.setUint32(0, parseInt(hex, 16), false);\r\n            var arrByte = new Uint8Array(arrBuff);\r\n\r\n            return arrByte[1] + \",\" + arrByte[2] + \",\" + arrByte[3];\r\n        }\r\n        function getShapeFill(node, isSvgMode, warpObj) {\r\n\r\n            // 1. presentationML\r\n            // p:spPr/ [a:noFill, solidFill, gradFill, blipFill, pattFill, grpFill]\r\n            // From slide\r\n            //Fill Type:\r\n            //console.log(\"ShapeFill: \", node)\r\n            var fillType = getFillType(getTextByPathList(node, [\"p:spPr\"]));\r\n            var fillColor;\r\n            if (fillType == \"NO_FILL\") {\r\n                return isSvgMode ? \"none\" : \"background-color: initial;\";\r\n            } else if (fillType == \"SOLID_FILL\") {\r\n                var shpFill = node[\"p:spPr\"][\"a:solidFill\"];\r\n                fillColor = getSolidFill(shpFill);\r\n            } else if (fillType == \"GRADIENT_FILL\") {\r\n                var shpFill = node[\"p:spPr\"][\"a:gradFill\"];\r\n                // fillColor = getSolidFill(shpFill);\r\n                fillColor = getGradientFill(shpFill);\r\n                //console.log(\"shpFill\",shpFill,grndColor.color)\r\n            } else if (fillType == \"PATTERN_FILL\") {\r\n                var shpFill = node[\"p:spPr\"][\"a:pattFill\"];\r\n                fillColor = getPatternFill(shpFill);\r\n            } else if (fillType == \"PIC_FILL\") {\r\n                var shpFill = node[\"p:spPr\"][\"a:blipFill\"];\r\n                fillColor = getPicFill(\"slideBg\", shpFill, warpObj);\r\n            }\r\n\r\n\r\n            // 2. drawingML namespace\r\n            if (fillColor === undefined) {\r\n                var clrName = getTextByPathList(node, [\"p:style\", \"a:fillRef\"]);\r\n                fillColor = getSolidFill(clrName);\r\n            }\r\n\r\n            if (fillColor !== undefined) {\r\n                if (fillType == \"GRADIENT_FILL\") {\r\n                    if (isSvgMode) {\r\n                        // console.log(\"GRADIENT_FILL color\", fillColor.color[0])\r\n                        return fillColor;\r\n                    } else {\r\n                        var colorAry = fillColor.color;\r\n                        var rot = fillColor.rot;\r\n\r\n                        var bgcolor = \"background: linear-gradient(\" + rot + \"deg,\";\r\n                        for (var i = 0; i < colorAry.length; i++) {\r\n                            if (i == colorAry.length - 1) {\r\n                                bgcolor += colorAry[i] + \");\";\r\n                            } else {\r\n                                bgcolor += colorAry[i] + \", \";\r\n                            }\r\n\r\n                        }\r\n                        return bgcolor;\r\n                    }\r\n                } else if (fillType == \"PIC_FILL\") {\r\n                    if (isSvgMode) {\r\n                        return fillColor;\r\n                    } else {\r\n\r\n                        return \"background-image:url(\" + fillColor + \");\";\r\n                    }\r\n                } else {\r\n                    if (isSvgMode) {\r\n                        var color = new colz.Color(fillColor);\r\n                        fillColor = color.rgb.toString();\r\n\r\n                        return fillColor;\r\n                    } else {\r\n                        //console.log(node,\"fillColor: \",fillColor,\"fillType: \",fillType,\"isSvgMode: \",isSvgMode)\r\n                        return \"background-color: #\" + fillColor + \";\";\r\n                    }\r\n                }\r\n            } else {\r\n                if (isSvgMode) {\r\n                    return \"none\";\r\n                } else {\r\n                    return \"background-color: initial;\";\r\n                }\r\n\r\n            }\r\n\r\n        }\r\n        ///////////////////////Amir//////////////////////////////\r\n        function getFillType(node) {\r\n            //Need to test/////////////////////////////////////////////\r\n            //SOLID_FILL\r\n            //PIC_FILL\r\n            //GRADIENT_FILL\r\n            //PATTERN_FILL\r\n            //NO_FILL\r\n            var fillType = \"\";\r\n            if (node[\"a:noFill\"] !== undefined) {\r\n                fillType = \"NO_FILL\";\r\n            }\r\n            if (node[\"a:solidFill\"] !== undefined) {\r\n                fillType = \"SOLID_FILL\";\r\n            }\r\n            if (node[\"a:gradFill\"] !== undefined) {\r\n                fillType = \"GRADIENT_FILL\";\r\n            }\r\n            if (node[\"a:pattFill\"] !== undefined) {\r\n                fillType = \"PATTERN_FILL\";\r\n            }\r\n            if (node[\"a:blipFill\"] !== undefined) {\r\n                fillType = \"PIC_FILL\";\r\n            }\r\n\r\n            return fillType;\r\n        }\r\n        function getGradientFill(node) {\r\n            var gsLst = node[\"a:gsLst\"][\"a:gs\"];\r\n            //get start color\r\n            var color_ary = [];\r\n            var tint_ary = [];\r\n            for (var i = 0; i < gsLst.length; i++) {\r\n                var lo_tint;\r\n                var lo_color = getSolidFill(gsLst[i]);\r\n                if (gsLst[i][\"a:srgbClr\"] !== undefined) {\r\n                    var lumMod = parseInt(getTextByPathList(node, [\"a:srgbClr\", \"a:lumMod\", \"attrs\", \"val\"])) / 100000;\r\n                    var lumOff = parseInt(getTextByPathList(node, [\"a:srgbClr\", \"a:lumOff\", \"attrs\", \"val\"])) / 100000;\r\n                    if (isNaN(lumMod)) {\r\n                        lumMod = 1.0;\r\n                    }\r\n                    if (isNaN(lumOff)) {\r\n                        lumOff = 0;\r\n                    }\r\n                    //console.log([lumMod, lumOff]);\r\n                    lo_color = applyLumModify(lo_color, lumMod, lumOff);\r\n                } else if (gsLst[i][\"a:schemeClr\"] !== undefined) { //a:schemeClr\r\n                    var lumMod = parseInt(getTextByPathList(gsLst[i], [\"a:schemeClr\", \"a:lumMod\", \"attrs\", \"val\"])) / 100000;\r\n                    var lumOff = parseInt(getTextByPathList(gsLst[i], [\"a:schemeClr\", \"a:lumOff\", \"attrs\", \"val\"])) / 100000;\r\n                    if (isNaN(lumMod)) {\r\n                        lumMod = 1.0;\r\n                    }\r\n                    if (isNaN(lumOff)) {\r\n                        lumOff = 0;\r\n                    }\r\n                    //console.log([lumMod, lumOff]);\r\n                    lo_color = applyLumModify(lo_color, lumMod, lumOff);\r\n                }\r\n                //console.log(\"lo_color\",lo_color)\r\n                color_ary[i] = lo_color;\r\n            }\r\n            //get rot\r\n            var lin = node[\"a:lin\"];\r\n            var rot = 0;\r\n            if (lin !== undefined) {\r\n                rot = angleToDegrees(lin[\"attrs\"][\"ang\"]) + 90;\r\n            }\r\n            return {\r\n                \"color\": color_ary,\r\n                \"rot\": rot\r\n            }\r\n        }\r\n        function getPicFill(type, node, warpObj) {\r\n            //Need to test/////////////////////////////////////////////\r\n            //rId\r\n            //TODO - Image Properties - Tile, Stretch, or Display Portion of Image\r\n            //(http://officeopenxml.com/drwPic-tile.php)\r\n            var img;\r\n            var rId = node[\"a:blip\"][\"attrs\"][\"r:embed\"];\r\n            var imgPath;\r\n            if (type == \"slideBg\") {\r\n                imgPath = getTextByPathList(warpObj, [\"slideResObj\", rId, \"target\"]);\r\n            } else if (type == \"layoutBg\") {\r\n                imgPath = getTextByPathList(warpObj, [\"layoutResObj\", rId, \"target\"]);\r\n            } else if (type == \"masterBg\") {\r\n                imgPath = getTextByPathList(warpObj, [\"masterResObj\", rId, \"target\"]);\r\n            }\r\n            imgPath = escapeHtml(imgPath);\r\n\r\n            if (imgPath === undefined) {\r\n                return undefined;\r\n            }\r\n            var imgExt = imgPath.split(\".\").pop();\r\n            if (imgExt == \"xml\") {\r\n                return undefined;\r\n            }\r\n            var imgArrayBuffer = warpObj[\"zip\"].file(imgPath).asArrayBuffer();\r\n            var imgMimeType = getMimeType(imgExt);\r\n            img = \"data:\" + imgMimeType + \";base64,\" + base64ArrayBuffer(imgArrayBuffer);\r\n            return img;\r\n        }\r\n        function getPatternFill(node) {\r\n            var color = \"\";\r\n            var fgClr = node[\"a:fgClr\"];\r\n            color = getSolidFill(fgClr);\r\n            return color;\r\n        }\r\n\r\n        function getSolidFill(node) {\r\n\r\n            if (node === undefined) {\r\n                return undefined;\r\n            }\r\n\r\n            var color = \"FFF\";\r\n\r\n            if (node[\"a:srgbClr\"] !== undefined) {\r\n                color = getTextByPathList(node, [\"a:srgbClr\", \"attrs\", \"val\"]); //#...\r\n            } else if (node[\"a:schemeClr\"] !== undefined) { //a:schemeClr\r\n                var schemeClr = getTextByPathList(node, [\"a:schemeClr\", \"attrs\", \"val\"]);\r\n                //console.log(schemeClr)\r\n                color = getSchemeColorFromTheme(\"a:\" + schemeClr, undefined); //#...\r\n\r\n            } else if (node[\"a:scrgbClr\"] !== undefined) {\r\n                //<a:scrgbClr r=\"50%\" g=\"50%\" b=\"50%\"/>  //Need to test/////////////////////////////////////////////\r\n                var defBultColorVals = node[\"a:scrgbClr\"][\"attrs\"];\r\n                var red = (defBultColorVals[\"r\"].indexOf(\"%\") != -1) ? defBultColorVals[\"r\"].split(\"%\").shift() : defBultColorVals[\"r\"];\r\n                var green = (defBultColorVals[\"g\"].indexOf(\"%\") != -1) ? defBultColorVals[\"g\"].split(\"%\").shift() : defBultColorVals[\"g\"];\r\n                var blue = (defBultColorVals[\"b\"].indexOf(\"%\") != -1) ? defBultColorVals[\"b\"].split(\"%\").shift() : defBultColorVals[\"b\"];\r\n                var scrgbClr = red + \",\" + green + \",\" + blue;\r\n                color = toHex(255 * (Number(red) / 100)) + toHex(255 * (Number(green) / 100)) + toHex(255 * (Number(blue) / 100));\r\n                //console.log(\"scrgbClr: \" + scrgbClr);\r\n\r\n            } else if (node[\"a:prstClr\"] !== undefined) {\r\n                //<a:prstClr val=\"black\"/>  //Need to test/////////////////////////////////////////////\r\n                var prstClr = node[\"a:prstClr\"][\"attrs\"][\"val\"];\r\n                color = getColorName2Hex(prstClr);\r\n                //console.log(\"prstClr: \" + prstClr+\" => hexClr: \"+color);\r\n            } else if (node[\"a:hslClr\"] !== undefined) {\r\n                //<a:hslClr hue=\"14400000\" sat=\"100%\" lum=\"50%\"/>  //Need to test/////////////////////////////////////////////\r\n                var defBultColorVals = node[\"a:hslClr\"][\"attrs\"];\r\n                var hue = Number(defBultColorVals[\"hue\"]) / 100000;\r\n                var sat = Number((defBultColorVals[\"sat\"].indexOf(\"%\") != -1) ? defBultColorVals[\"sat\"].split(\"%\").shift() : defBultColorVals[\"sat\"]) / 100;\r\n                var lum = Number((defBultColorVals[\"lum\"].indexOf(\"%\") != -1) ? defBultColorVals[\"lum\"].split(\"%\").shift() : defBultColorVals[\"lum\"]) / 100;\r\n                var hslClr = defBultColorVals[\"hue\"] + \",\" + defBultColorVals[\"sat\"] + \",\" + defBultColorVals[\"lum\"];\r\n                var hsl2rgb = hslToRgb(hue, sat, lum);\r\n                color = toHex(hsl2rgb.r) + toHex(hsl2rgb.g) + toHex(hsl2rgb.b);\r\n                //defBultColor = cnvrtHslColor2Hex(hslClr); //TODO\r\n                // console.log(\"hslClr: \" + hslClr);\r\n            } else if (node[\"a:sysClr\"] !== undefined) {\r\n                //<a:sysClr val=\"windowText\" lastClr=\"000000\"/>  //Need to test/////////////////////////////////////////////\r\n                var sysClr = getTextByPathList(node, [\"a:sysClr\", \"attrs\", \"lastClr\"]);\r\n                if (sysClr !== undefined) {\r\n                    color = sysClr;\r\n                }\r\n            }\r\n            return color;\r\n        }\r\n        function toHex(n) {\r\n            var hex = n.toString(16);\r\n            while (hex.length < 2) { hex = \"0\" + hex; }\r\n            return hex;\r\n        }\r\n        function hslToRgb(hue, sat, light) {\r\n            var t1, t2, r, g, b;\r\n            hue = hue / 60;\r\n            if (light <= 0.5) {\r\n                t2 = light * (sat + 1);\r\n            } else {\r\n                t2 = light + sat - (light * sat);\r\n            }\r\n            t1 = light * 2 - t2;\r\n            r = hueToRgb(t1, t2, hue + 2) * 255;\r\n            g = hueToRgb(t1, t2, hue) * 255;\r\n            b = hueToRgb(t1, t2, hue - 2) * 255;\r\n            return { r: r, g: g, b: b };\r\n        }\r\n        function hueToRgb(t1, t2, hue) {\r\n            if (hue < 0) hue += 6;\r\n            if (hue >= 6) hue -= 6;\r\n            if (hue < 1) return (t2 - t1) * hue + t1;\r\n            else if (hue < 3) return t2;\r\n            else if (hue < 4) return (t2 - t1) * (4 - hue) + t1;\r\n            else return t1;\r\n        }\r\n        function getColorName2Hex(name) {\r\n            var hex;\r\n            var colorName = ['AliceBlue', 'AntiqueWhite', 'Aqua', 'Aquamarine', 'Azure', 'Beige', 'Bisque', 'Black', 'BlanchedAlmond', 'Blue', 'BlueViolet', 'Brown', 'BurlyWood', 'CadetBlue', 'Chartreuse', 'Chocolate', 'Coral', 'CornflowerBlue', 'Cornsilk', 'Crimson', 'Cyan', 'DarkBlue', 'DarkCyan', 'DarkGoldenRod', 'DarkGray', 'DarkGrey', 'DarkGreen', 'DarkKhaki', 'DarkMagenta', 'DarkOliveGreen', 'DarkOrange', 'DarkOrchid', 'DarkRed', 'DarkSalmon', 'DarkSeaGreen', 'DarkSlateBlue', 'DarkSlateGray', 'DarkSlateGrey', 'DarkTurquoise', 'DarkViolet', 'DeepPink', 'DeepSkyBlue', 'DimGray', 'DimGrey', 'DodgerBlue', 'FireBrick', 'FloralWhite', 'ForestGreen', 'Fuchsia', 'Gainsboro', 'GhostWhite', 'Gold', 'GoldenRod', 'Gray', 'Grey', 'Green', 'GreenYellow', 'HoneyDew', 'HotPink', 'IndianRed', 'Indigo', 'Ivory', 'Khaki', 'Lavender', 'LavenderBlush', 'LawnGreen', 'LemonChiffon', 'LightBlue', 'LightCoral', 'LightCyan', 'LightGoldenRodYellow', 'LightGray', 'LightGrey', 'LightGreen', 'LightPink', 'LightSalmon', 'LightSeaGreen', 'LightSkyBlue', 'LightSlateGray', 'LightSlateGrey', 'LightSteelBlue', 'LightYellow', 'Lime', 'LimeGreen', 'Linen', 'Magenta', 'Maroon', 'MediumAquaMarine', 'MediumBlue', 'MediumOrchid', 'MediumPurple', 'MediumSeaGreen', 'MediumSlateBlue', 'MediumSpringGreen', 'MediumTurquoise', 'MediumVioletRed', 'MidnightBlue', 'MintCream', 'MistyRose', 'Moccasin', 'NavajoWhite', 'Navy', 'OldLace', 'Olive', 'OliveDrab', 'Orange', 'OrangeRed', 'Orchid', 'PaleGoldenRod', 'PaleGreen', 'PaleTurquoise', 'PaleVioletRed', 'PapayaWhip', 'PeachPuff', 'Peru', 'Pink', 'Plum', 'PowderBlue', 'Purple', 'RebeccaPurple', 'Red', 'RosyBrown', 'RoyalBlue', 'SaddleBrown', 'Salmon', 'SandyBrown', 'SeaGreen', 'SeaShell', 'Sienna', 'Silver', 'SkyBlue', 'SlateBlue', 'SlateGray', 'SlateGrey', 'Snow', 'SpringGreen', 'SteelBlue', 'Tan', 'Teal', 'Thistle', 'Tomato', 'Turquoise', 'Violet', 'Wheat', 'White', 'WhiteSmoke', 'Yellow', 'YellowGreen'];\r\n            var colorHex = ['f0f8ff', 'faebd7', '00ffff', '7fffd4', 'f0ffff', 'f5f5dc', 'ffe4c4', '000000', 'ffebcd', '0000ff', '8a2be2', 'a52a2a', 'deb887', '5f9ea0', '7fff00', 'd2691e', 'ff7f50', '6495ed', 'fff8dc', 'dc143c', '00ffff', '00008b', '008b8b', 'b8860b', 'a9a9a9', 'a9a9a9', '006400', 'bdb76b', '8b008b', '556b2f', 'ff8c00', '9932cc', '8b0000', 'e9967a', '8fbc8f', '483d8b', '2f4f4f', '2f4f4f', '00ced1', '9400d3', 'ff1493', '00bfff', '696969', '696969', '1e90ff', 'b22222', 'fffaf0', '228b22', 'ff00ff', 'dcdcdc', 'f8f8ff', 'ffd700', 'daa520', '808080', '808080', '008000', 'adff2f', 'f0fff0', 'ff69b4', 'cd5c5c', '4b0082', 'fffff0', 'f0e68c', 'e6e6fa', 'fff0f5', '7cfc00', 'fffacd', 'add8e6', 'f08080', 'e0ffff', 'fafad2', 'd3d3d3', 'd3d3d3', '90ee90', 'ffb6c1', 'ffa07a', '20b2aa', '87cefa', '778899', '778899', 'b0c4de', 'ffffe0', '00ff00', '32cd32', 'faf0e6', 'ff00ff', '800000', '66cdaa', '0000cd', 'ba55d3', '9370db', '3cb371', '7b68ee', '00fa9a', '48d1cc', 'c71585', '191970', 'f5fffa', 'ffe4e1', 'ffe4b5', 'ffdead', '000080', 'fdf5e6', '808000', '6b8e23', 'ffa500', 'ff4500', 'da70d6', 'eee8aa', '98fb98', 'afeeee', 'db7093', 'ffefd5', 'ffdab9', 'cd853f', 'ffc0cb', 'dda0dd', 'b0e0e6', '800080', '663399', 'ff0000', 'bc8f8f', '4169e1', '8b4513', 'fa8072', 'f4a460', '2e8b57', 'fff5ee', 'a0522d', 'c0c0c0', '87ceeb', '6a5acd', '708090', '708090', 'fffafa', '00ff7f', '4682b4', 'd2b48c', '008080', 'd8bfd8', 'ff6347', '40e0d0', 'ee82ee', 'f5deb3', 'ffffff', 'f5f5f5', 'ffff00', '9acd32'];\r\n            var findIndx = colorName.indexOf(name);\r\n            if (findIndx != -1) {\r\n                hex = colorHex[findIndx];\r\n            }\r\n            return hex;\r\n        }\r\n        function getColorOpacity(solidFill) {\r\n\r\n            if (solidFill === undefined) {\r\n                return undefined;\r\n            }\r\n            var opcity = 1;\r\n\r\n            if (solidFill[\"a:srgbClr\"] !== undefined) {\r\n                var tint = getTextByPathList(solidFill, [\"a:srgbClr\", \"a:tint\", \"attrs\", \"val\"]);\r\n                if (tint !== undefined) {\r\n                    opcity = parseInt(tint) / 100000;\r\n                }\r\n            } else if (solidFill[\"a:schemeClr\"] !== undefined) {\r\n                var tint = getTextByPathList(solidFill, [\"a:schemeClr\", \"a:tint\", \"attrs\", \"val\"]);\r\n                if (tint !== undefined) {\r\n                    opcity = parseInt(tint) / 100000;\r\n                }\r\n            } else if (solidFill[\"a:scrgbClr\"] !== undefined) {\r\n                var tint = getTextByPathList(solidFill, [\"a:scrgbClr\", \"a:tint\", \"attrs\", \"val\"]);\r\n                if (tint !== undefined) {\r\n                    opcity = parseInt(tint) / 100000;\r\n                }\r\n\r\n            } else if (solidFill[\"a:prstClr\"] !== undefined) {\r\n                var tint = getTextByPathList(solidFill, [\"a:prstClr\", \"a:tint\", \"attrs\", \"val\"]);\r\n                if (tint !== undefined) {\r\n                    opcity = parseInt(tint) / 100000;\r\n                }\r\n            } else if (solidFill[\"a:hslClr\"] !== undefined) {\r\n                var tint = getTextByPathList(solidFill, [\"a:hslClr\", \"a:tint\", \"attrs\", \"val\"]);\r\n                if (tint !== undefined) {\r\n                    opcity = parseInt(tint) / 100000;\r\n                }\r\n            } else if (solidFill[\"a:sysClr\"] !== undefined) {\r\n                var tint = getTextByPathList(solidFill, [\"a:sysClr\", \"a:tint\", \"attrs\", \"val\"]);\r\n                if (tint !== undefined) {\r\n                    opcity = parseInt(tint) / 100000;\r\n                }\r\n            }\r\n\r\n            return opcity;\r\n        }\r\n        function getSchemeColorFromTheme(schemeClr, sldMasterNode) {\r\n            //<p:clrMap ...> in slide master\r\n            // e.g. tx2=\"dk2\" bg2=\"lt2\" tx1=\"dk1\" bg1=\"lt1\" slideLayoutClrOvride\r\n\r\n            if (slideLayoutClrOvride == \"\" || slideLayoutClrOvride === undefined) {\r\n                slideLayoutClrOvride = getTextByPathList(sldMasterNode, [\"p:sldMaster\", \"p:clrMap\", \"attrs\"])\r\n            }\r\n            //console.log(slideLayoutClrOvride);\r\n            var schmClrName = schemeClr.substr(2);\r\n            if (slideLayoutClrOvride !== undefined) {\r\n                switch (schmClrName) {\r\n                    case \"tx1\":\r\n                    case \"tx2\":\r\n                    case \"bg1\":\r\n                    case \"bg2\":\r\n                        schemeClr = \"a:\" + slideLayoutClrOvride[schmClrName];\r\n                        //console.log(schmClrName+ \"=> \"+schemeClr);\r\n                        break;\r\n                }\r\n            } else {\r\n                switch (schmClrName) {\r\n                    case \"tx1\":\r\n                        schemeClr = \"a:dk1\";\r\n                        break;\r\n                    case \"tx2\":\r\n                        schemeClr = \"a:dk2\";\r\n                        break;\r\n                    case \"bg1\":\r\n                        schemeClr = \"a:lt1\";\r\n                        break;\r\n                    case \"bg2\":\r\n                        schemeClr = \"a:lt2\";\r\n                        break;\r\n                }\r\n            }\r\n            var refNode = getTextByPathList(themeContent, [\"a:theme\", \"a:themeElements\", \"a:clrScheme\", schemeClr]);\r\n            var color = getTextByPathList(refNode, [\"a:srgbClr\", \"attrs\", \"val\"]);\r\n            if (color === undefined && refNode !== undefined) {\r\n                color = getTextByPathList(refNode, [\"a:sysClr\", \"attrs\", \"lastClr\"]);\r\n            }\r\n            //console.log(color)\r\n            return color;\r\n        }\r\n\r\n        function extractChartData(serNode) {\r\n\r\n            var dataMat = new Array();\r\n\r\n            if (serNode === undefined) {\r\n                return dataMat;\r\n            }\r\n\r\n            if (serNode[\"c:xVal\"] !== undefined) {\r\n                var dataRow = new Array();\r\n                eachElement(serNode[\"c:xVal\"][\"c:numRef\"][\"c:numCache\"][\"c:pt\"], function (innerNode, index) {\r\n                    dataRow.push(parseFloat(innerNode[\"c:v\"]));\r\n                    return \"\";\r\n                });\r\n                dataMat.push(dataRow);\r\n                dataRow = new Array();\r\n                eachElement(serNode[\"c:yVal\"][\"c:numRef\"][\"c:numCache\"][\"c:pt\"], function (innerNode, index) {\r\n                    dataRow.push(parseFloat(innerNode[\"c:v\"]));\r\n                    return \"\";\r\n                });\r\n                dataMat.push(dataRow);\r\n            } else {\r\n                eachElement(serNode, function (innerNode, index) {\r\n                    var dataRow = new Array();\r\n                    var colName = getTextByPathList(innerNode, [\"c:tx\", \"c:strRef\", \"c:strCache\", \"c:pt\", \"c:v\"]) || index;\r\n\r\n                    // Category (string or number)\r\n                    var rowNames = {};\r\n                    if (getTextByPathList(innerNode, [\"c:cat\", \"c:strRef\", \"c:strCache\", \"c:pt\"]) !== undefined) {\r\n                        eachElement(innerNode[\"c:cat\"][\"c:strRef\"][\"c:strCache\"][\"c:pt\"], function (innerNode, index) {\r\n                            rowNames[innerNode[\"attrs\"][\"idx\"]] = innerNode[\"c:v\"];\r\n                            return \"\";\r\n                        });\r\n                    } else if (getTextByPathList(innerNode, [\"c:cat\", \"c:numRef\", \"c:numCache\", \"c:pt\"]) !== undefined) {\r\n                        eachElement(innerNode[\"c:cat\"][\"c:numRef\"][\"c:numCache\"][\"c:pt\"], function (innerNode, index) {\r\n                            rowNames[innerNode[\"attrs\"][\"idx\"]] = innerNode[\"c:v\"];\r\n                            return \"\";\r\n                        });\r\n                    }\r\n\r\n                    // Value\r\n                    if (getTextByPathList(innerNode, [\"c:val\", \"c:numRef\", \"c:numCache\", \"c:pt\"]) !== undefined) {\r\n                        eachElement(innerNode[\"c:val\"][\"c:numRef\"][\"c:numCache\"][\"c:pt\"], function (innerNode, index) {\r\n                            dataRow.push({ x: innerNode[\"attrs\"][\"idx\"], y: parseFloat(innerNode[\"c:v\"]) });\r\n                            return \"\";\r\n                        });\r\n                    }\r\n\r\n                    dataMat.push({ key: colName, values: dataRow, xlabels: rowNames });\r\n                    return \"\";\r\n                });\r\n            }\r\n\r\n            return dataMat;\r\n        }\r\n\r\n        // ===== Node functions =====\r\n        /**\r\n         * getTextByPathStr\r\n         * @param {Object} node\r\n         * @param {string} pathStr\r\n         */\r\n        function getTextByPathStr(node, pathStr) {\r\n            return getTextByPathList(node, pathStr.trim().split(/\\s+/));\r\n        }\r\n\r\n        /**\r\n         * getTextByPathList\r\n         * @param {Object} node\r\n         * @param {string Array} path\r\n         */\r\n        function getTextByPathList(node, path) {\r\n\r\n            if (path.constructor !== Array) {\r\n                throw Error(\"Error of path type! path is not array.\");\r\n            }\r\n\r\n            if (node === undefined) {\r\n                return undefined;\r\n            }\r\n\r\n            var l = path.length;\r\n            for (var i = 0; i < l; i++) {\r\n                node = node[path[i]];\r\n                if (node === undefined) {\r\n                    return undefined;\r\n                }\r\n            }\r\n\r\n            return node;\r\n        }\r\n\r\n        /**\r\n         * eachElement\r\n         * @param {Object} node\r\n         * @param {function} doFunction\r\n         */\r\n        function eachElement(node, doFunction) {\r\n            if (node === undefined) {\r\n                return;\r\n            }\r\n            var result = \"\";\r\n            if (node.constructor === Array) {\r\n                var l = node.length;\r\n                for (var i = 0; i < l; i++) {\r\n                    result += doFunction(node[i], i);\r\n                }\r\n            } else {\r\n                result += doFunction(node, 0);\r\n            }\r\n            return result;\r\n        }\r\n\r\n        // ===== Color functions =====\r\n        /**\r\n         * applyShade\r\n         * @param {string} rgbStr\r\n         * @param {number} shadeValue\r\n         */\r\n        function applyShade(rgbStr, shadeValue) {\r\n            var color = new colz.Color(rgbStr);\r\n            color.setLum(color.hsl.l * shadeValue);\r\n            return color.rgb.toString();\r\n        }\r\n\r\n        /**\r\n         * applyTint\r\n         * @param {string} rgbStr\r\n         * @param {number} tintValue\r\n         */\r\n        function applyTint(rgbStr, tintValue) {\r\n            var color = new colz.Color(rgbStr);\r\n            color.setLum(color.hsl.l * tintValue + (1 - tintValue));\r\n            return color.rgb.toString();\r\n        }\r\n\r\n        /**\r\n         * applyLumModify\r\n         * @param {string} rgbStr\r\n         * @param {number} factor\r\n         * @param {number} offset\r\n         */\r\n        function applyLumModify(rgbStr, factor, offset) {\r\n            var color = new colz.Color(rgbStr);\r\n            //color.setLum(color.hsl.l * factor);\r\n            color.setLum(color.hsl.l * (1 + offset));\r\n            return color.rgb.toString();\r\n        }\r\n\r\n        ///////////////////////Amir////////////////\r\n        function angleToDegrees(angle) {\r\n            if (angle == \"\" || angle == null) {\r\n                return 0;\r\n            }\r\n            return Math.round(angle / 60000);\r\n        }\r\n        function getMimeType(imgFileExt) {\r\n            var mimeType = \"\";\r\n            //console.log(imgFileExt)\r\n            switch (imgFileExt.toLowerCase()) {\r\n                case \"jpg\":\r\n                case \"jpeg\":\r\n                    mimeType = \"image/jpeg\";\r\n                    break;\r\n                case \"png\":\r\n                    mimeType = \"image/png\";\r\n                    break;\r\n                case \"gif\":\r\n                    mimeType = \"image/gif\";\r\n                    break;\r\n                case \"emf\": // Not native support\r\n                    mimeType = \"image/x-emf\";\r\n                    break;\r\n                case \"wmf\": // Not native support\r\n                    mimeType = \"image/x-wmf\";\r\n                    break;\r\n                case \"svg\":\r\n                    mimeType = \"image/svg+xml\";\r\n                    break;\r\n                case \"mp4\":\r\n                    mimeType = \"video/mp4\";\r\n                    break;\r\n                case \"webm\":\r\n                    mimeType = \"video/webm\";\r\n                    break;\r\n                case \"ogg\":\r\n                    mimeType = \"video/ogg\";\r\n                    break;\r\n                case \"avi\":\r\n                    mimeType = \"video/avi\";\r\n                    break;\r\n                case \"mpg\":\r\n                    mimeType = \"video/mpg\";\r\n                    break;\r\n                case \"wmv\":\r\n                    mimeType = \"video/wmv\";\r\n                    break;\r\n                case \"mp3\":\r\n                    mimeType = \"audio/mpeg\";\r\n                    break;\r\n                case \"wav\":\r\n                    mimeType = \"audio/wav\";\r\n                    break;\r\n                case \"emf\":\r\n                    mimeType = \"image/emf\";\r\n                    break;\r\n                case \"wmf\":\r\n                    mimeType = \"image/wmf\";\r\n                    break;\r\n            }\r\n            return mimeType;\r\n        }\r\n        function getSvgGradient(w, h, angl, color_arry, shpId) {\r\n            var stopsArray = getMiddleStops(color_arry.length - 2);\r\n\r\n            var svgAngle = '',\r\n                svgHeight = h,\r\n                svgWidth = w,\r\n                svg = '',\r\n                xy_ary = SVGangle(angl, svgHeight, svgWidth),\r\n                x1 = xy_ary[0],\r\n                y1 = xy_ary[1],\r\n                x2 = xy_ary[2],\r\n                y2 = xy_ary[3];\r\n\r\n            var sal = stopsArray.length,\r\n                sr = sal < 20 ? 100 : 1000;\r\n            svgAngle = ' gradientUnits=\"userSpaceOnUse\" x1=\"' + x1 + '%\" y1=\"' + y1 + '%\" x2=\"' + x2 + '%\" y2=\"' + y2 + '%\"';\r\n            svgAngle = '<linearGradient id=\"linGrd_' + shpId + '\"' + svgAngle + '>\\n';\r\n            svg += svgAngle;\r\n\r\n            for (var i = 0; i < sal; i++) {\r\n                svg += '<stop offset=\"' + Math.round(parseFloat(stopsArray[i]) / 100 * sr) / sr + '\" stop-color=\"' + color_arry[i] + '\"';\r\n                svg += '/>\\n'\r\n            }\r\n\r\n            svg += '</linearGradient>\\n' + '';\r\n\r\n            return svg\r\n        }\r\n        function getMiddleStops(s) {\r\n            var sArry = ['0%', '100%'];\r\n            if (s == 0) {\r\n                return true\r\n            } else {\r\n                var i = s;\r\n                while (i--) {\r\n                    var middleStop = 100 - ((100 / (s + 1)) * (i + 1)), // AM: Ex - For 3 middle stops, progression will be 25%, 50%, and 75%, plus 0% and 100% at the ends.\r\n                        middleStopString = middleStop + \"%\";\r\n                    sArry.splice(-1, 0, middleStopString);\r\n                } // AM: add into stopsArray before 100%\r\n            }\r\n            return sArry\r\n        }\r\n        function SVGangle(deg, svgHeight, svgWidth) {\r\n            var w = parseFloat(svgWidth),\r\n                h = parseFloat(svgHeight),\r\n                ang = parseFloat(deg),\r\n                o = 2,\r\n                n = 2,\r\n                wc = w / 2,\r\n                hc = h / 2,\r\n                tx1 = 2,\r\n                ty1 = 2,\r\n                tx2 = 2,\r\n                ty2 = 2,\r\n                k = (((ang % 360) + 360) % 360),\r\n                j = (360 - k) * Math.PI / 180,\r\n                i = Math.tan(j),\r\n                l = hc - i * wc;\r\n\r\n            if (k == 0) {\r\n                tx1 = w,\r\n                    ty1 = hc,\r\n                    tx2 = 0,\r\n                    ty2 = hc\r\n            } else if (k < 90) {\r\n                n = w,\r\n                    o = 0\r\n            } else if (k == 90) {\r\n                tx1 = wc,\r\n                    ty1 = 0,\r\n                    tx2 = wc,\r\n                    ty2 = h\r\n            } else if (k < 180) {\r\n                n = 0,\r\n                    o = 0\r\n            } else if (k == 180) {\r\n                tx1 = 0,\r\n                    ty1 = hc,\r\n                    tx2 = w,\r\n                    ty2 = hc\r\n            } else if (k < 270) {\r\n                n = 0,\r\n                    o = h\r\n            } else if (k == 270) {\r\n                tx1 = wc,\r\n                    ty1 = h,\r\n                    tx2 = wc,\r\n                    ty2 = 0\r\n            } else {\r\n                n = w,\r\n                    o = h;\r\n            }\r\n            // AM: I could not quite figure out what m, n, and o are supposed to represent from the original code on visualcsstools.com.\r\n            var m = o + (n / i),\r\n                tx1 = tx1 == 2 ? i * (m - l) / (Math.pow(i, 2) + 1) : tx1,\r\n                ty1 = ty1 == 2 ? i * tx1 + l : ty1,\r\n                tx2 = tx2 == 2 ? w - tx1 : tx2,\r\n                ty2 = ty2 == 2 ? h - ty1 : ty2,\r\n                x1 = Math.round(tx2 / w * 100 * 100) / 100,\r\n                y1 = Math.round(ty2 / h * 100 * 100) / 100,\r\n                x2 = Math.round(tx1 / w * 100 * 100) / 100,\r\n                y2 = Math.round(ty1 / h * 100 * 100) / 100;\r\n            return [x1, y1, x2, y2];\r\n        }\r\n        function getSvgImagePattern(fillColor, shpId) {\r\n            var ptrn = '<pattern id=\"imgPtrn_' + shpId + '\"  patternContentUnits=\"objectBoundingBox\"  width=\"1\" height=\"1\">';\r\n            //console.log(\"fillColor: \", fillColor)\r\n            fillColor = escapeHtml(fillColor);\r\n            ptrn += '<image  xlink:href=\"' + fillColor + '\" preserveAspectRatio=\"none\" width=\"1\" height=\"1\"></image>';\r\n            ptrn += '</pattern>';\r\n            return ptrn;\r\n        }\r\n\r\n        function processMsgQueue(queue) {\r\n            for (var i = 0; i < queue.length; i++) {\r\n                processSingleMsg(queue[i].data);\r\n            }\r\n        }\r\n\r\n        function processSingleMsg(d) {\r\n\r\n            var chartID = d.chartID;\r\n            var chartType = d.chartType;\r\n            var chartData = d.chartData;\r\n\r\n            var data = [];\r\n\r\n            var chart = null;\r\n            switch (chartType) {\r\n                case \"lineChart\":\r\n                    data = chartData;\r\n                    chart = nv.models.lineChart()\r\n                        .useInteractiveGuideline(true);\r\n                    chart.xAxis.tickFormat(function (d) { return chartData[0].xlabels[d] || d; });\r\n                    break;\r\n                case \"barChart\":\r\n                    data = chartData;\r\n                    chart = nv.models.multiBarChart();\r\n                    chart.xAxis.tickFormat(function (d) { return chartData[0].xlabels[d] || d; });\r\n                    break;\r\n                case \"pieChart\":\r\n                case \"pie3DChart\":\r\n                    data = chartData[0].values;\r\n                    chart = nv.models.pieChart();\r\n                    break;\r\n                case \"areaChart\":\r\n                    data = chartData;\r\n                    chart = nv.models.stackedAreaChart()\r\n                        .clipEdge(true)\r\n                        .useInteractiveGuideline(true);\r\n                    chart.xAxis.tickFormat(function (d) { return chartData[0].xlabels[d] || d; });\r\n                    break;\r\n                case \"scatterChart\":\r\n\r\n                    for (var i = 0; i < chartData.length; i++) {\r\n                        var arr = [];\r\n                        for (var j = 0; j < chartData[i].length; j++) {\r\n                            arr.push({ x: j, y: chartData[i][j] });\r\n                        }\r\n                        data.push({ key: 'data' + (i + 1), values: arr });\r\n                    }\r\n\r\n                    //data = chartData;\r\n                    chart = nv.models.scatterChart()\r\n                        .showDistX(true)\r\n                        .showDistY(true)\r\n                        .color(d3.scale.category10().range());\r\n                    chart.xAxis.axisLabel('X').tickFormat(d3.format('.02f'));\r\n                    chart.yAxis.axisLabel('Y').tickFormat(d3.format('.02f'));\r\n                    break;\r\n                default:\r\n            }\r\n\r\n            if (chart !== null) {\r\n\r\n                d3.select(\"#\" + chartID)\r\n                    .append(\"svg\")\r\n                    .datum(data)\r\n                    .transition().duration(500)\r\n                    .call(chart);\r\n\r\n                nv.utils.windowResize(chart.update);\r\n                isDone = true;\r\n            }\r\n\r\n        }\r\n\r\n        function setNumericBullets(elem) {\r\n            var prgrphs_arry = elem;\r\n            for (var i = 0; i < prgrphs_arry.length; i++) {\r\n                var buSpan = $(prgrphs_arry[i]).find('.numeric-bullet-style');\r\n                if (buSpan.length > 0) {\r\n                    //console.log(\"DIV-\"+i+\":\");\r\n                    var prevBultTyp = \"\";\r\n                    var prevBultLvl = \"\";\r\n                    var buletIndex = 0;\r\n                    var tmpArry = new Array();\r\n                    var tmpArryIndx = 0;\r\n                    var buletTypSrry = new Array();\r\n                    for (var j = 0; j < buSpan.length; j++) {\r\n                        var bult_typ = $(buSpan[j]).data(\"bulltname\");\r\n                        var bult_lvl = $(buSpan[j]).data(\"bulltlvl\");\r\n                        //console.log(j+\" - \"+bult_typ+\" lvl: \"+bult_lvl );\r\n                        if (buletIndex == 0) {\r\n                            prevBultTyp = bult_typ;\r\n                            prevBultLvl = bult_lvl;\r\n                            tmpArry[tmpArryIndx] = buletIndex;\r\n                            buletTypSrry[tmpArryIndx] = bult_typ;\r\n                            buletIndex++;\r\n                        } else {\r\n                            if (bult_typ == prevBultTyp && bult_lvl == prevBultLvl) {\r\n                                prevBultTyp = bult_typ;\r\n                                prevBultLvl = bult_lvl;\r\n                                buletIndex++;\r\n                                tmpArry[tmpArryIndx] = buletIndex;\r\n                                buletTypSrry[tmpArryIndx] = bult_typ;\r\n                            } else if (bult_typ != prevBultTyp && bult_lvl == prevBultLvl) {\r\n                                prevBultTyp = bult_typ;\r\n                                prevBultLvl = bult_lvl;\r\n                                tmpArryIndx++;\r\n                                tmpArry[tmpArryIndx] = buletIndex;\r\n                                buletTypSrry[tmpArryIndx] = bult_typ;\r\n                                buletIndex = 1;\r\n                            } else if (bult_typ != prevBultTyp && Number(bult_lvl) > Number(prevBultLvl)) {\r\n                                prevBultTyp = bult_typ;\r\n                                prevBultLvl = bult_lvl;\r\n                                tmpArryIndx++;\r\n                                tmpArry[tmpArryIndx] = buletIndex;\r\n                                buletTypSrry[tmpArryIndx] = bult_typ;\r\n                                buletIndex = 1;\r\n                            } else if (bult_typ != prevBultTyp && Number(bult_lvl) < Number(prevBultLvl)) {\r\n                                prevBultTyp = bult_typ;\r\n                                prevBultLvl = bult_lvl;\r\n                                tmpArryIndx--;\r\n                                buletIndex = tmpArry[tmpArryIndx] + 1;\r\n                            }\r\n                        }\r\n                        //console.log(buletTypSrry[tmpArryIndx]+\" - \"+buletIndex);\r\n                        var numIdx = getNumTypeNum(buletTypSrry[tmpArryIndx], buletIndex);\r\n                        $(buSpan[j]).html(numIdx);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        function getNumTypeNum(numTyp, num) {\r\n            var rtrnNum = \"\";\r\n            switch (numTyp) {\r\n                case \"arabicPeriod\":\r\n                    rtrnNum = num + \". \";\r\n                    break;\r\n                case \"arabicParenR\":\r\n                    rtrnNum = num + \") \";\r\n                    break;\r\n                case \"alphaLcParenR\":\r\n                    rtrnNum = alphaNumeric(num, \"lowerCase\") + \") \";\r\n                    break;\r\n                case \"alphaLcPeriod\":\r\n                    rtrnNum = alphaNumeric(num, \"lowerCase\") + \". \";\r\n                    break;\r\n\r\n                case \"alphaUcParenR\":\r\n                    rtrnNum = alphaNumeric(num, \"upperCase\") + \") \";\r\n                    break;\r\n                case \"alphaUcPeriod\":\r\n                    rtrnNum = alphaNumeric(num, \"upperCase\") + \". \";\r\n                    break;\r\n\r\n                case \"romanUcPeriod\":\r\n                    rtrnNum = romanize(num) + \". \";\r\n                    break;\r\n                case \"romanLcParenR\":\r\n                    rtrnNum = romanize(num) + \") \";\r\n                    break;\r\n                case \"hebrew2Minus\":\r\n                    rtrnNum = hebrew2Minus.format(num) + \"-\";\r\n                    break;\r\n                default:\r\n                    rtrnNum = num;\r\n            }\r\n            return rtrnNum;\r\n        }\r\n        function romanize(num) {\r\n            if (!+num)\r\n                return false;\r\n            var digits = String(+num).split(\"\"),\r\n                key = [\"\", \"C\", \"CC\", \"CCC\", \"CD\", \"D\", \"DC\", \"DCC\", \"DCCC\", \"CM\",\r\n                    \"\", \"X\", \"XX\", \"XXX\", \"XL\", \"L\", \"LX\", \"LXX\", \"LXXX\", \"XC\",\r\n                    \"\", \"I\", \"II\", \"III\", \"IV\", \"V\", \"VI\", \"VII\", \"VIII\", \"IX\"],\r\n                roman = \"\",\r\n                i = 3;\r\n            while (i--)\r\n                roman = (key[+digits.pop() + (i * 10)] || \"\") + roman;\r\n            return Array(+digits.join(\"\") + 1).join(\"M\") + roman;\r\n        }\r\n        var hebrew2Minus = archaicNumbers([\r\n            [1000, ''],\r\n            [400, 'ת'],\r\n            [300, 'ש'],\r\n            [200, 'ר'],\r\n            [100, 'ק'],\r\n            [90, 'צ'],\r\n            [80, 'פ'],\r\n            [70, 'ע'],\r\n            [60, 'ס'],\r\n            [50, 'נ'],\r\n            [40, 'מ'],\r\n            [30, 'ל'],\r\n            [20, 'כ'],\r\n            [10, 'י'],\r\n            [9, 'ט'],\r\n            [8, 'ח'],\r\n            [7, 'ז'],\r\n            [6, 'ו'],\r\n            [5, 'ה'],\r\n            [4, 'ד'],\r\n            [3, 'ג'],\r\n            [2, 'ב'],\r\n            [1, 'א'],\r\n            [/יה/, 'ט״ו'],\r\n            [/יו/, 'ט״ז'],\r\n            [/([א-ת])([א-ת])$/, '$1״$2'],\r\n            [/^([א-ת])$/, \"$1׳\"]\r\n        ]);\r\n        function archaicNumbers(arr) {\r\n            var arrParse = arr.slice().sort(function (a, b) { return b[1].length - a[1].length });\r\n            return {\r\n                format: function (n) {\r\n                    var ret = '';\r\n                    jQuery.each(arr, function () {\r\n                        var num = this[0];\r\n                        if (parseInt(num) > 0) {\r\n                            for (; n >= num; n -= num) ret += this[1];\r\n                        } else {\r\n                            ret = ret.replace(num, this[1]);\r\n                        }\r\n                    });\r\n                    return ret;\r\n                }\r\n            }\r\n        }\r\n        function alphaNumeric(num, upperLower) {\r\n            num = Number(num) - 1;\r\n            var aNum = \"\";\r\n            if (upperLower == \"upperCase\") {\r\n                aNum = (((num / 26 >= 1) ? String.fromCharCode(num / 26 + 64) : '') + String.fromCharCode(num % 26 + 65)).toUpperCase();\r\n            } else if (upperLower == \"lowerCase\") {\r\n                aNum = (((num / 26 >= 1) ? String.fromCharCode(num / 26 + 64) : '') + String.fromCharCode(num % 26 + 65)).toLowerCase();\r\n            }\r\n            return aNum;\r\n        }\r\n        function base64ArrayBuffer(arrayBuffer) {\r\n            var base64 = '';\r\n            var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\n            var bytes = new Uint8Array(arrayBuffer);\r\n            var byteLength = bytes.byteLength;\r\n            var byteRemainder = byteLength % 3;\r\n            var mainLength = byteLength - byteRemainder;\r\n\r\n            var a, b, c, d;\r\n            var chunk;\r\n\r\n            for (var i = 0; i < mainLength; i = i + 3) {\r\n                chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];\r\n                a = (chunk & 16515072) >> 18;\r\n                b = (chunk & 258048) >> 12;\r\n                c = (chunk & 4032) >> 6;\r\n                d = chunk & 63;\r\n                base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d];\r\n            }\r\n\r\n            if (byteRemainder == 1) {\r\n                chunk = bytes[mainLength];\r\n                a = (chunk & 252) >> 2;\r\n                b = (chunk & 3) << 4;\r\n                base64 += encodings[a] + encodings[b] + '==';\r\n            } else if (byteRemainder == 2) {\r\n                chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1];\r\n                a = (chunk & 64512) >> 10;\r\n                b = (chunk & 1008) >> 4;\r\n                c = (chunk & 15) << 2;\r\n                base64 += encodings[a] + encodings[b] + encodings[c] + '=';\r\n            }\r\n\r\n            return base64;\r\n        }\r\n\r\n        function IsVideoLink(vdoFile) {\r\n            /*\r\n            var ext = extractFileExtension(vdoFile);\r\n            if (ext.length == 3){\r\n                return false;\r\n            }else{\r\n                return true;\r\n            }\r\n            */\r\n            var urlregex = /^(https?|ftp):\\/\\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+\\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\\/($|[a-zA-Z0-9.,?'\\\\+&%$#=~_-]+))*$/;\r\n            return urlregex.test(vdoFile);\r\n        }\r\n\r\n        function extractFileExtension(filename) {\r\n            return filename.substr((~-filename.lastIndexOf(\".\") >>> 0) + 2);\r\n        }\r\n\r\n        function escapeHtml(text) {\r\n            var map = {\r\n                '&': '&amp;',\r\n                '<': '&lt;',\r\n                '>': '&gt;',\r\n                '\"': '&quot;',\r\n                \"'\": '&#039;'\r\n            };\r\n            return text.replace(/[&<>\"']/g, function (m) { return map[m]; });\r\n        }\r\n        /////////////////////////////////////tXml///////////////////////////\r\n        /*\r\n        This is my custom tXml.js file\r\n        */\r\n        function tXml(t, r) { \"use strict\"; function e() { for (var r = []; t[l];)if (t.charCodeAt(l) == s) { if (t.charCodeAt(l + 1) === h) return l = t.indexOf(u, l), l + 1 && (l += 1), r; if (t.charCodeAt(l + 1) === v) { if (t.charCodeAt(l + 2) == m) { for (; -1 !== l && (t.charCodeAt(l) !== d || t.charCodeAt(l - 1) != m || t.charCodeAt(l - 2) != m || -1 == l);)l = t.indexOf(u, l + 1); -1 === l && (l = t.length) } else for (l += 2; t.charCodeAt(l) !== d && t[l];)l++; l++; continue } var e = a(); r.push(e) } else { var i = n(); i.trim().length > 0 && r.push(i), l++ } return r } function n() { var r = l; return l = t.indexOf(c, l) - 1, -2 === l && (l = t.length), t.slice(r, l + 1) } function i() { for (var r = l; -1 === A.indexOf(t[l]) && t[l];)l++; return t.slice(r, l) } function a() { var r = {}; l++, r.tagName = i(); for (var n = !1; t.charCodeAt(l) !== d && t[l];) { var a = t.charCodeAt(l); if (a > 64 && 91 > a || a > 96 && 123 > a) { for (var f = i(), c = t.charCodeAt(l); c && c !== p && c !== g && !(c > 64 && 91 > c || c > 96 && 123 > c) && c !== d;)l++, c = t.charCodeAt(l); if (n || (r.attributes = {}, n = !0), c === p || c === g) { var s = o(); if (-1 === l) return r } else s = null, l--; r.attributes[f] = s } l++ } if (t.charCodeAt(l - 1) !== h) if (\"script\" == r.tagName) { var u = l + 1; l = t.indexOf(\"</script>\", l), r.children = [t.slice(u, l - 1)], l += 8 } else if (\"style\" == r.tagName) { var u = l + 1; l = t.indexOf(\"</style>\", l), r.children = [t.slice(u, l - 1)], l += 7 } else -1 == C.indexOf(r.tagName) && (l++, r.children = e(f)); else l++; return r } function o() { var r = t[l], e = ++l; return l = t.indexOf(r, e), t.slice(e, l) } function f() { var e = new RegExp(\"\\\\s\" + r.attrName + \"\\\\s*=['\\\"]\" + r.attrValue + \"['\\\"]\").exec(t); return e ? e.index : -1 } r = r || {}; var l = r.pos || 0, c = \"<\", s = \"<\".charCodeAt(0), u = \">\", d = \">\".charCodeAt(0), m = \"-\".charCodeAt(0), h = \"/\".charCodeAt(0), v = \"!\".charCodeAt(0), p = \"'\".charCodeAt(0), g = '\"'.charCodeAt(0), A = \"\\n\t>/= \", C = [\"img\", \"br\", \"input\", \"meta\", \"link\"], y = null; if (void 0 !== r.attrValue) { r.attrName = r.attrName || \"id\"; for (var y = []; -1 !== (l = f());)l = t.lastIndexOf(\"<\", l), -1 !== l && y.push(a()), t = t.substr(l), l = 0 } else y = r.parseNode ? a() : e(); return r.filter && (y = tXml.filter(y, r.filter)), r.simplify && (y = tXml.simplify(y)), y.pos = l, y } var _order = 1; tXml.simplify = function (t) { var r = {}; if (void 0 === t) return {}; if (1 === t.length && \"string\" == typeof t[0]) return t[0]; t.forEach(function (t) { if (\"object\" == typeof t) { r[t.tagName] || (r[t.tagName] = []); var e = tXml.simplify(t.children || []); r[t.tagName].push(e), t.attributes && (e.attrs = t.attributes), void 0 === e.attrs ? e.attrs = { order: _order } : e.attrs.order = _order, _order++ } }); for (var e in r) 1 == r[e].length && (r[e] = r[e][0]); return r }, tXml.filter = function (t, r) { var e = []; return t.forEach(function (t) { if (\"object\" == typeof t && r(t) && e.push(t), t.children) { var n = tXml.filter(t.children, r); e = e.concat(n) } }), e }, tXml.stringify = function (t) { function r(t) { if (t) for (var r = 0; r < t.length; r++)\"string\" == typeof t[r] ? n += t[r].trim() : e(t[r]) } function e(t) { n += \"<\" + t.tagName; for (var e in t.attributes) n += null === t.attributes[e] ? \" \" + e : -1 === t.attributes[e].indexOf('\"') ? \" \" + e + '=\"' + t.attributes[e].trim() + '\"' : \" \" + e + \"='\" + t.attributes[e].trim() + \"'\"; n += \">\", r(t.children), n += \"</\" + t.tagName + \">\" } var n = \"\"; return r(t), n }, tXml.toContentString = function (t) { if (Array.isArray(t)) { var r = \"\"; return t.forEach(function (t) { r += \" \" + tXml.toContentString(t), r = r.trim() }), r } return \"object\" == typeof t ? tXml.toContentString(t.children) : \" \" + t }, tXml.getElementById = function (t, r, e) { var n = tXml(t, { attrValue: r, simplify: e }); return e ? n : n[0] }, tXml.getElementsByClassName = function (t, r, e) { return tXml(t, { attrName: \"class\", attrValue: \"[a-zA-Z0-9-s ]*\" + r + \"[a-zA-Z0-9-s ]*\", simplify: e }) }, tXml.parseStream = function (t, r) { if (\"function\" == typeof r && (cb = r, r = 0), \"string\" == typeof r && (r = r.length + 2), \"string\" == typeof t) { var e = require(\"fs\"); t = e.createReadStream(t, { start: r }), r = 0 } var n = r, i = \"\", a = 0; return t.on(\"data\", function (r) { a++, i += r; for (var e = 0; ;) { n = i.indexOf(\"<\", n) + 1; var o = tXml(i, { pos: n, parseNode: !0 }); if (n = o.pos, n > i.length - 1 || e > n) return void (e && (i = i.slice(e), n = 0, e = 0)); t.emit(\"xml\", o), e = n } i = i.slice(n), n = 0 }), t.on(\"end\", function () { console.log(\"end\") }), t }, \"object\" == typeof module && (module.exports = tXml);\r\n    };\r\n\r\n    /*!\r\n    JSZipUtils - A collection of cross-browser utilities to go along with JSZip.\r\n    <http://stuk.github.io/jszip-utils>\r\n    (c) 2014 Stuart Knightley, David Duponchel\r\n    Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip-utils/master/LICENSE.markdown.\r\n    */\r\n    !function (a) { \"object\" == typeof exports ? module.exports = a() : \"function\" == typeof define && define.amd ? define(a) : \"undefined\" != typeof window ? window.JSZipUtils = a() : \"undefined\" != typeof global ? global.JSZipUtils = a() : \"undefined\" != typeof self && (self.JSZipUtils = a()) }(function () { return function a(b, c, d) { function e(g, h) { if (!c[g]) { if (!b[g]) { var i = \"function\" == typeof require && require; if (!h && i) return i(g, !0); if (f) return f(g, !0); throw new Error(\"Cannot find module '\" + g + \"'\") } var j = c[g] = { exports: {} }; b[g][0].call(j.exports, function (a) { var c = b[g][1][a]; return e(c ? c : a) }, j, j.exports, a, b, c, d) } return c[g].exports } for (var f = \"function\" == typeof require && require, g = 0; g < d.length; g++)e(d[g]); return e }({ 1: [function (a, b) { \"use strict\"; function c() { try { return new window.XMLHttpRequest } catch (a) { } } function d() { try { return new window.ActiveXObject(\"Microsoft.XMLHTTP\") } catch (a) { } } var e = {}; e._getBinaryFromXHR = function (a) { return a.response || a.responseText }; var f = window.ActiveXObject ? function () { return c() || d() } : c; e.getBinaryContent = function (a, b) { try { var c = f(); c.open(\"GET\", a, !0), \"responseType\" in c && (c.responseType = \"arraybuffer\"), c.overrideMimeType && c.overrideMimeType(\"text/plain; charset=x-user-defined\"), c.onreadystatechange = function () { var d, f; if (4 === c.readyState) if (200 === c.status || 0 === c.status) { d = null, f = null; try { d = e._getBinaryFromXHR(c) } catch (g) { f = new Error(g) } b(f, d) } else b(new Error(\"Ajax error for \" + a + \" : \" + this.status + \" \" + this.statusText), null) }, c.send() } catch (d) { b(new Error(d), null) } }, b.exports = e }, {}] }, {}, [1])(1) });\r\n\r\n    /**\r\n     * Colorz (or Colz) is a Javascript \"library\" to help\r\n     * in color conversion between the usual color-spaces\r\n     * Hex - Rgb - Hsl / Hsv - Hsb\r\n     *\r\n     * It provides some helpers to output Canvas / CSS\r\n     * color strings.\r\n     *\r\n     * by Carlos Cabo 2013\r\n     * http://carloscabo.com\r\n     *\r\n     * Some formulas borrowed from Wikipedia or other authors.\r\n    */\r\n\r\n    (function (name, definition) {\r\n        if (typeof define === \"function\") {\r\n            define(definition);\r\n        } else if (typeof module !== \"undefined\" && module.exports) {\r\n            module.exports = definition();\r\n        } else {\r\n            var theModule = definition(),\r\n                global = this,\r\n                old = global[name];\r\n            theModule.noConflict = function () {\r\n                global[name] = old;\r\n                return theModule;\r\n            };\r\n            global[name] = theModule;\r\n        }\r\n    })(\"colz\", function () {\r\n        var round = Math.round,\r\n            toString = \"toString\",\r\n            colz = colz || {},\r\n            Rgb,\r\n            Rgba,\r\n            Hsl,\r\n            Hsla,\r\n            Color,\r\n            ColorScheme,\r\n            hexToRgb,\r\n            componentToHex,\r\n            rgbToHex,\r\n            rgbToHsl,\r\n            hue2rgb,\r\n            hslToRgb,\r\n            rgbToHsb,\r\n            hsbToRgb,\r\n            hsbToHsl,\r\n            hsvToHsl,\r\n            hsvToRgb,\r\n            randomColor;\r\n        Rgb = colz.Rgb = function (col) {\r\n            this.r = col[0];\r\n            this.g = col[1];\r\n            this.b = col[2];\r\n        };\r\n        Rgb.prototype[toString] = function () {\r\n            return \"rgb(\" + this.r + \",\" + this.g + \",\" + this.b + \")\";\r\n        };\r\n        Rgba = colz.Rgba = function (col) {\r\n            this.r = col[0];\r\n            this.g = col[1];\r\n            this.b = col[2];\r\n            this.a = col[3];\r\n        };\r\n        Rgba.prototype[toString] = function () {\r\n            return (\r\n                \"rgba(\" + this.r + \",\" + this.g + \",\" + this.b + \",\" + this.a + \")\"\r\n            );\r\n        };\r\n        Hsl = colz.Hsl = function (col) {\r\n            this.h = col[0];\r\n            this.s = col[1];\r\n            this.l = col[2];\r\n        };\r\n        Hsl.prototype[toString] = function () {\r\n            return \"hsl(\" + this.h + \",\" + this.s + \"%,\" + this.l + \"%)\";\r\n        };\r\n        Hsla = colz.Hsla = function (col) {\r\n            this.h = col[0];\r\n            this.s = col[1];\r\n            this.l = col[2];\r\n            this.a = col[3];\r\n        };\r\n        Hsla.prototype[toString] = function () {\r\n            return (\r\n                \"hsla(\" + this.h + \",\" + this.s + \"%,\" + this.l + \"%,\" + this.a + \")\"\r\n            );\r\n        };\r\n        Color = colz.Color = function () {\r\n            this.hex = this.r = this.g = this.b = this.h = this.s = this.l = this.a = this.hsl = this.hsla = this.rgb = this.rgba = null;\r\n            this.init(arguments);\r\n        };\r\n        var colorPrototype = Color.prototype;\r\n        colorPrototype.init = function (arg) {\r\n            var _this = this;\r\n            if (typeof arg[0] === \"string\") {\r\n                if (arg[0].charAt(0) !== \"#\") {\r\n                    arg[0] = \"#\" + arg[0];\r\n                }\r\n                if (arg[0].length < 7) {\r\n                    arg[0] =\r\n                        \"#\" +\r\n                        arg[0][1] +\r\n                        arg[0][1] +\r\n                        arg[0][2] +\r\n                        arg[0][2] +\r\n                        arg[0][3] +\r\n                        arg[0][3];\r\n                }\r\n                _this.hex = arg[0].toLowerCase();\r\n                _this.rgb = new Rgb(hexToRgb(_this.hex));\r\n                _this.r = _this.rgb.r;\r\n                _this.g = _this.rgb.g;\r\n                _this.b = _this.rgb.b;\r\n                _this.a = 1;\r\n                _this.rgba = new Rgba([_this.r, _this.g, _this.b, _this.a]);\r\n            }\r\n            if (typeof arg[0] === \"number\") {\r\n                _this.r = arg[0];\r\n                _this.g = arg[1];\r\n                _this.b = arg[2];\r\n                if (typeof arg[3] === \"undefined\") {\r\n                    _this.a = 1;\r\n                } else {\r\n                    _this.a = arg[3];\r\n                }\r\n                _this.rgb = new Rgb([_this.r, _this.g, _this.b]);\r\n                _this.rgba = new Rgba([_this.r, _this.g, _this.b, _this.a]);\r\n                _this.hex = rgbToHex([_this.r, _this.g, _this.b]);\r\n            }\r\n            if (arg[0] instanceof Array) {\r\n                _this.r = arg[0][0];\r\n                _this.g = arg[0][1];\r\n                _this.b = arg[0][2];\r\n                if (typeof arg[0][3] === \"undefined\") {\r\n                    _this.a = 1;\r\n                } else {\r\n                    _this.a = arg[0][3];\r\n                }\r\n                _this.rgb = new Rgb([_this.r, _this.g, _this.b]);\r\n                _this.rgba = new Rgba([_this.r, _this.g, _this.b, _this.a]);\r\n                _this.hex = rgbToHex([_this.r, _this.g, _this.b]);\r\n            }\r\n            _this.hsl = new Hsl(colz.rgbToHsl([_this.r, _this.g, _this.b]));\r\n            _this.h = _this.hsl.h;\r\n            _this.s = _this.hsl.s;\r\n            _this.l = _this.hsl.l;\r\n            _this.hsla = new Hsla([_this.h, _this.s, _this.l, _this.a]);\r\n        };\r\n        colorPrototype.setHue = function (newhue) {\r\n            var _this = this;\r\n            _this.h = newhue;\r\n            _this.hsl.h = newhue;\r\n            _this.hsla.h = newhue;\r\n            _this.updateFromHsl();\r\n        };\r\n        colorPrototype.setSat = function (newsat) {\r\n            var _this = this;\r\n            _this.s = newsat;\r\n            _this.hsl.s = newsat;\r\n            _this.hsla.s = newsat;\r\n            _this.updateFromHsl();\r\n        };\r\n        colorPrototype.setLum = function (newlum) {\r\n            var _this = this;\r\n            _this.l = newlum;\r\n            _this.hsl.l = newlum;\r\n            _this.hsla.l = newlum;\r\n            _this.updateFromHsl();\r\n        };\r\n        colorPrototype.setAlpha = function (newalpha) {\r\n            this.a = newalpha;\r\n            this.hsla.a = newalpha;\r\n            this.rgba.a = newalpha;\r\n        };\r\n        colorPrototype.updateFromHsl = function () {\r\n            this.rgb = null;\r\n            this.rgb = new Rgb(colz.hslToRgb([this.h, this.s, this.l]));\r\n            this.r = this.rgb.r;\r\n            this.g = this.rgb.g;\r\n            this.b = this.rgb.b;\r\n            this.rgba.r = this.rgb.r;\r\n            this.rgba.g = this.rgb.g;\r\n            this.rgba.b = this.rgb.b;\r\n            this.hex = null;\r\n            this.hex = rgbToHex([this.r, this.g, this.b]);\r\n        };\r\n        randomColor = colz.randomColor = function () {\r\n            var r = \"#\" + Math.random().toString(16).slice(2, 8);\r\n            return new Color(r);\r\n        };\r\n        hexToRgb = colz.hexToRgb = function (hex) {\r\n            var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n            return result\r\n                ? [\r\n                    parseInt(result[1], 16),\r\n                    parseInt(result[2], 16),\r\n                    parseInt(result[3], 16)\r\n                ]\r\n                : null;\r\n        };\r\n        componentToHex = colz.componentToHex = function (c) {\r\n            var hex = c.toString(16);\r\n            return hex.length === 1 ? \"0\" + hex : hex;\r\n        };\r\n        rgbToHex = colz.rgbToHex = function () {\r\n            var arg, r, g, b;\r\n            arg = arguments;\r\n            if (arg.length > 1) {\r\n                r = arg[0];\r\n                g = arg[1];\r\n                b = arg[2];\r\n            } else {\r\n                r = arg[0][0];\r\n                g = arg[0][1];\r\n                b = arg[0][2];\r\n            }\r\n            return \"#\" + componentToHex(r) + componentToHex(g) + componentToHex(b);\r\n        };\r\n        rgbToHsl = colz.rgbToHsl = function () {\r\n            var arg, r, g, b, h, s, l, d, max, min;\r\n            arg = arguments;\r\n            if (typeof arg[0] === \"number\") {\r\n                r = arg[0];\r\n                g = arg[1];\r\n                b = arg[2];\r\n            } else {\r\n                r = arg[0][0];\r\n                g = arg[0][1];\r\n                b = arg[0][2];\r\n            }\r\n            r /= 255;\r\n            g /= 255;\r\n            b /= 255;\r\n            max = Math.max(r, g, b);\r\n            min = Math.min(r, g, b);\r\n            l = (max + min) / 2;\r\n            if (max === min) {\r\n                h = s = 0;\r\n            } else {\r\n                d = max - min;\r\n                s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n                switch (max) {\r\n                    case r:\r\n                        h = (g - b) / d + (g < b ? 6 : 0);\r\n                        break;\r\n                    case g:\r\n                        h = (b - r) / d + 2;\r\n                        break;\r\n                    case b:\r\n                        h = (r - g) / d + 4;\r\n                        break;\r\n                }\r\n                h /= 6;\r\n            }\r\n            h = round(h * 360);\r\n            s = round(s * 100);\r\n            l = round(l * 100);\r\n            return [h, s, l];\r\n        };\r\n        hue2rgb = colz.hue2rgb = function (p, q, t) {\r\n            if (t < 0) {\r\n                t += 1;\r\n            }\r\n            if (t > 1) {\r\n                t -= 1;\r\n            }\r\n            if (t < 1 / 6) {\r\n                return p + (q - p) * 6 * t;\r\n            }\r\n            if (t < 1 / 2) {\r\n                return q;\r\n            }\r\n            if (t < 2 / 3) {\r\n                return p + (q - p) * (2 / 3 - t) * 6;\r\n            }\r\n            return p;\r\n        };\r\n        hslToRgb = colz.hslToRgb = function () {\r\n            var arg, r, g, b, h, s, l, q, p;\r\n            arg = arguments;\r\n            if (typeof arg[0] === \"number\") {\r\n                h = arg[0] / 360;\r\n                s = arg[1] / 100;\r\n                l = arg[2] / 100;\r\n            } else {\r\n                h = arg[0][0] / 360;\r\n                s = arg[0][1] / 100;\r\n                l = arg[0][2] / 100;\r\n            }\r\n            if (s === 0) {\r\n                r = g = b = l;\r\n            } else {\r\n                q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n                p = 2 * l - q;\r\n                r = colz.hue2rgb(p, q, h + 1 / 3);\r\n                g = colz.hue2rgb(p, q, h);\r\n                b = colz.hue2rgb(p, q, h - 1 / 3);\r\n            }\r\n            return [round(r * 255), round(g * 255), round(b * 255)];\r\n        };\r\n        rgbToHsb = colz.rgbToHsb = function (r, g, b) {\r\n            var max, min, h, s, v, d;\r\n            r = r / 255;\r\n            g = g / 255;\r\n            b = b / 255;\r\n            max = Math.max(r, g, b);\r\n            min = Math.min(r, g, b);\r\n            v = max;\r\n            d = max - min;\r\n            s = max === 0 ? 0 : d / max;\r\n            if (max === min) {\r\n                h = 0;\r\n            } else {\r\n                switch (max) {\r\n                    case r:\r\n                        h = (g - b) / d + (g < b ? 6 : 0);\r\n                        break;\r\n                    case g:\r\n                        h = (b - r) / d + 2;\r\n                        break;\r\n                    case b:\r\n                        h = (r - g) / d + 4;\r\n                        break;\r\n                }\r\n                h /= 6;\r\n            }\r\n            h = round(h * 360);\r\n            s = round(s * 100);\r\n            v = round(v * 100);\r\n            return [h, s, v];\r\n        };\r\n        hsbToRgb = colz.hsbToRgb = function (h, s, v) {\r\n            var r, g, b, i, f, p, q, t;\r\n            if (v === 0) {\r\n                return [0, 0, 0];\r\n            }\r\n            s = s / 100;\r\n            v = v / 100;\r\n            h = h / 60;\r\n            i = Math.floor(h);\r\n            f = h - i;\r\n            p = v * (1 - s);\r\n            q = v * (1 - s * f);\r\n            t = v * (1 - s * (1 - f));\r\n            if (i === 0) {\r\n                r = v;\r\n                g = t;\r\n                b = p;\r\n            } else if (i === 1) {\r\n                r = q;\r\n                g = v;\r\n                b = p;\r\n            } else if (i === 2) {\r\n                r = p;\r\n                g = v;\r\n                b = t;\r\n            } else if (i === 3) {\r\n                r = p;\r\n                g = q;\r\n                b = v;\r\n            } else if (i === 4) {\r\n                r = t;\r\n                g = p;\r\n                b = v;\r\n            } else if (i === 5) {\r\n                r = v;\r\n                g = p;\r\n                b = q;\r\n            }\r\n            r = Math.floor(r * 255);\r\n            g = Math.floor(g * 255);\r\n            b = Math.floor(b * 255);\r\n            return [r, g, b];\r\n        };\r\n        hsbToHsl = colz.hsbToHsl = function (h, s, b) {\r\n            return colz.rgbToHsl(colz.hsbToRgb(h, s, b));\r\n        };\r\n        hsvToHsl = colz.hsvToHsl = colz.hsbToHsl;\r\n        hsvToRgb = colz.hsvToRgb = colz.hsbToRgb;\r\n        ColorScheme = colz.ColorScheme = function (color_val, angle_array) {\r\n            this.palette = [];\r\n            if (angle_array === undefined && color_val instanceof Array) {\r\n                this.createFromColors(color_val);\r\n            } else {\r\n                this.createFromAngles(color_val, angle_array);\r\n            }\r\n        };\r\n        var colorSchemePrototype = ColorScheme.prototype;\r\n        colorSchemePrototype.createFromColors = function (color_val) {\r\n            for (var i in color_val) {\r\n                if (color_val.hasOwnProperty(i)) {\r\n                    this.palette.push(new Color(color_val[i]));\r\n                }\r\n            }\r\n            return this.palette;\r\n        };\r\n        colorSchemePrototype.createFromAngles = function (color_val, angle_array) {\r\n            this.palette.push(new Color(color_val));\r\n            for (var i in angle_array) {\r\n                if (angle_array.hasOwnProperty(i)) {\r\n                    var tempHue = (this.palette[0].h + angle_array[i]) % 360;\r\n                    this.palette.push(\r\n                        new Color(\r\n                            colz.hslToRgb([tempHue, this.palette[0].s, this.palette[0].l])\r\n                        )\r\n                    );\r\n                }\r\n            }\r\n            return this.palette;\r\n        };\r\n        ColorScheme.Compl = function (color_val) {\r\n            return new ColorScheme(color_val, [180]);\r\n        };\r\n        ColorScheme.Triad = function (color_val) {\r\n            return new ColorScheme(color_val, [120, 240]);\r\n        };\r\n        ColorScheme.Tetrad = function (color_val) {\r\n            return new ColorScheme(color_val, [60, 180, 240]);\r\n        };\r\n        ColorScheme.Analog = function (color_val) {\r\n            return new ColorScheme(color_val, [-45, 45]);\r\n        };\r\n        ColorScheme.Split = function (color_val) {\r\n            return new ColorScheme(color_val, [150, 210]);\r\n        };\r\n        ColorScheme.Accent = function (color_val) {\r\n            return new ColorScheme(color_val, [-45, 45, 180]);\r\n        };\r\n        return colz;\r\n    });\r\n}(jQuery));\r\n"
  },
  {
    "path": "pages/include/SheetJS/del/css/sheetjs.css",
    "content": "/* sheetjs.css (C) 2014-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n#drop{\n  border:2px dashed #bbb;\n  -moz-border-radius:5px;\n  -webkit-border-radius:5px;\n  border-radius:5px;\n  padding:25px;\n  text-align:center;\n  width:128px;\n  font:20pt bold,\"Vollkorn\";color:#bbb\n}\n\n#left {\n  width:188px;\n  position:absolute;\n  left:0;\n}\n#right {\n  position:absolute;\n  left:200px;\n}\n#logo {\n  padding:25px;\n}\n#header {\n  height:168px;\n}\n\n.winpt { width:98%; }\n.success { color: #468847; }\n.error { color: #b94a48; }\n.info { color: #3a87ad; }\npre { white-space: pre-wrap; }\n"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/dist/README.md",
    "content": "# Handsontable distributions\n\n## Full distribution (recommended)\n\nThe full distribution allows you to use Handsontable by including just 2 files:\n```html\n<script src=\"dist/handsontable.full.js\"></script>\n<link rel=\"stylesheet\" media=\"screen\" href=\"dist/handsontable.full.css\">\n```\nYou can also use minified files:  \n```html\n<script src=\"dist/handsontable.full.min.js\"></script>\n<link rel=\"stylesheet\" media=\"screen\" href=\"dist/handsontable.full.min.css\">\n```\n\nIf you use a date picker or numeric cell types, you will also have to include Pikaday, moment.js and numbro.js.\n\n**handsontable.full.js** and **handsontable.full.css** are compiled with ___all___ the needed dependencies (except language files - see below).\n\n## Bare distribution\n\nIf you are a \"Bob the Builder\" kind of hacker, you will need to load Handsontable JS, CSS and their dependencies:\n```html\n<!-- Required dependencies (as external scripts) -->\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.5.1/pikaday.min.js\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/numbro/1.11.0/numbro.min.js\"></script>\n\n<!-- Handsontable bare files -->\n<script src=\"dist/handsontable.js\"></script>\n<link rel=\"stylesheet\" media=\"screen\" href=\"https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.5.1/css/pikaday.min.css\">\n<link rel=\"stylesheet\" media=\"screen\" href=\"dist/handsontable.css\">\n```\n\n**handsontable.js** and **handsontable.css** are compiled ___without___ the needed dependencies.\n\n## Internationalization\nSince Handsontable [35.0.0](https://docs.handsontable.com/0.35.0/tutorial-release-notes.html) it is possible to include files which will register languages dictionaries. They allow to translate parts of Handsontable UI. You can either use only particular languages files or include all of them at once as a single file.\n\nAll the information about the API and additional options can be found at our [official documentation](https://docs.handsontable.com/0.35.0/tutorial-internationalization.html).\n\n```html\n<!-- Internationalization, Polish - Poland language-country file -->\n<script src=\"languages/pl-PL.js\"></script>\n\n<!-- Internationalization, all available language files in one file -->\n<script src=\"languages/all.js\"></script>\n```\n\n## Custom distribution\n\nIf you want to build your own custom Handsontable package distribution check out our [guide](https://docs.handsontable.com/tutorial-custom-build.html) covering all the details.\n"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/dist/handsontable.css",
    "content": "/*!\n * (The MIT License)\n * \n * Copyright (c) 2012-2014 Marcin Warpechowski\n * Copyright (c) 2015 Handsoncode sp. z o.o. <hello@handsoncode.net>\n * \n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * 'Software'), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n * \n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n * \n * Version: 2.0.0\n * Release date: 11/04/2018 (built at 10/04/2018 11:38:33)\n */\n/**\n * Fix for bootstrap styles\n */\n.handsontable .table th, .handsontable .table td {\n  border-top: none;\n}\n\n.handsontable tr {\n  background: #fff;\n}\n\n.handsontable td {\n  background-color: inherit;\n}\n\n.handsontable .table caption + thead tr:first-child th,\n.handsontable .table caption + thead tr:first-child td,\n.handsontable .table colgroup + thead tr:first-child th,\n.handsontable .table colgroup + thead tr:first-child td,\n.handsontable .table thead:first-child tr:first-child th,\n.handsontable .table thead:first-child tr:first-child td {\n  border-top: 1px solid #CCCCCC;\n}\n\n/* table-bordered */\n.handsontable .table-bordered {\n  border: 0;\n  border-collapse: separate;\n}\n\n.handsontable .table-bordered th,\n.handsontable .table-bordered td {\n  border-left: none;\n}\n\n.handsontable .table-bordered th:first-child,\n.handsontable .table-bordered td:first-child {\n  border-left: 1px solid #CCCCCC;\n}\n\n.handsontable .table > tbody > tr > td,\n.handsontable .table > tbody > tr > th,\n.handsontable .table > tfoot > tr > td,\n.handsontable .table > tfoot > tr > th,\n.handsontable .table > thead > tr > td,\n.handsontable .table > thead > tr > th {\n  line-height: 21px;\n  padding: 0 4px;\n}\n\n.col-lg-1.handsontable, .col-lg-10.handsontable, .col-lg-11.handsontable, .col-lg-12.handsontable,\n.col-lg-2.handsontable, .col-lg-3.handsontable, .col-lg-4.handsontable, .col-lg-5.handsontable, .col-lg-6.handsontable, .col-lg-7.handsontable, .col-lg-8.handsontable, .col-lg-9.handsontable,\n.col-md-1.handsontable, .col-md-10.handsontable, .col-md-11.handsontable, .col-md-12.handsontable,\n.col-md-2.handsontable, .col-md-3.handsontable, .col-md-4.handsontable, .col-md-5.handsontable, .col-md-6.handsontable, .col-md-7.handsontable, .col-md-8.handsontable, .col-md-9.handsontable\n.col-sm-1.handsontable, .col-sm-10.handsontable, .col-sm-11.handsontable, .col-sm-12.handsontable,\n.col-sm-2.handsontable, .col-sm-3.handsontable, .col-sm-4.handsontable, .col-sm-5.handsontable, .col-sm-6.handsontable, .col-sm-7.handsontable, .col-sm-8.handsontable, .col-sm-9.handsontable\n.col-xs-1.handsontable, .col-xs-10.handsontable, .col-xs-11.handsontable, .col-xs-12.handsontable,\n.col-xs-2.handsontable, .col-xs-3.handsontable, .col-xs-4.handsontable, .col-xs-5.handsontable, .col-xs-6.handsontable, .col-xs-7.handsontable, .col-xs-8.handsontable, .col-xs-9.handsontable {\n  padding-left: 0;\n  padding-right: 0;\n}\n\n.handsontable .table-striped > tbody > tr:nth-of-type(even) {\n  background-color: #FFF;\n}\n.handsontable {\n  position: relative;\n}\n\n.handsontable .hide{\n  display: none;\n}\n.handsontable .relative {\n  position: relative;\n}\n\n.handsontable.htAutoSize {\n  visibility: hidden;\n  left: -99000px;\n  position: absolute;\n  top: -99000px;\n}\n\n.handsontable .wtHider {\n  width: 0;\n}\n\n.handsontable .wtSpreader {\n  position: relative;\n  width: 0; /*must be 0, otherwise blank space appears in scroll demo after scrolling max to the right */\n  height: auto;\n}\n\n.handsontable table,\n.handsontable tbody,\n.handsontable thead,\n.handsontable td,\n.handsontable th,\n.handsontable input,\n.handsontable textarea,\n.handsontable div {\n  box-sizing: content-box;\n  -webkit-box-sizing: content-box;\n  -moz-box-sizing: content-box;\n}\n\n.handsontable input,\n.handsontable textarea {\n  min-height: initial;\n}\n\n.handsontable table.htCore {\n  border-collapse: separate;\n  /* it must be separate, otherwise there are offset miscalculations in WebKit: http://stackoverflow.com/questions/2655987/border-collapse-differences-in-ff-and-webkit */\n  /* this actually only changes appearance of user selection - does not make text unselectable */\n  /* -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -o-user-select: none;\n  -ms-user-select: none;\n  user-select: none; */ /* no browser supports unprefixed version */\n  border-spacing: 0;\n  margin: 0;\n  border-width: 0;\n  table-layout: fixed;\n  width: 0;\n  outline-width: 0;\n  /* reset bootstrap table style. for more info see: https://github.com/handsontable/handsontable/issues/224 */\n  max-width: none;\n  max-height: none;\n}\n\n.handsontable col {\n  width: 50px;\n}\n\n.handsontable col.rowHeader {\n  width: 50px;\n}\n\n.handsontable th,\n.handsontable td {\n  border-top-width: 0;\n  border-left-width: 0;\n  border-right: 1px solid #CCC;\n  border-bottom: 1px solid #CCC;\n  height: 22px;\n  empty-cells: show;\n  line-height: 21px;\n  padding: 0 4px 0 4px;\n  /* top, bottom padding different than 0 is handled poorly by FF with HTML5 doctype */\n  background-color: #FFF;\n  vertical-align: top;\n  overflow: hidden;\n  outline-width: 0;\n  white-space: pre-line;\n  /* preserve new line character in cell */\n  background-clip: padding-box;\n}\n\n.handsontable td.htInvalid {\n  background-color: #ff4c42 !important; /*gives priority over td.area selection background*/\n}\n\n.handsontable td.htNoWrap {\n  white-space: nowrap;\n}\n\n.handsontable th:last-child {\n  /*Foundation framework fix*/\n  border-right: 1px solid #CCC;\n  border-bottom: 1px solid #CCC;\n}\n\n.handsontable tr:first-child th.htNoFrame,\n.handsontable th:first-child.htNoFrame,\n.handsontable th.htNoFrame {\n  border-left-width: 0;\n  background-color: white;\n  border-color: #FFF;\n}\n\n.handsontable th:first-child,\n.handsontable th:nth-child(2),\n.handsontable td:first-of-type,\n.handsontable .htNoFrame + th,\n.handsontable .htNoFrame + td {\n  border-left: 1px solid #CCC;\n}\n\n.handsontable.htRowHeaders thead tr th:nth-child(2) {\n  border-left: 1px solid #CCC;\n}\n\n.handsontable tr:first-child th,\n.handsontable tr:first-child td {\n  border-top: 1px solid #CCC;\n}\n\n.ht_master:not(.innerBorderLeft):not(.emptyColumns) ~ .handsontable tbody tr th,\n.ht_master:not(.innerBorderLeft):not(.emptyColumns) ~ .handsontable:not(.ht_clone_top) thead tr th:first-child {\n  border-right-width: 0;\n}\n\n.ht_master:not(.innerBorderTop) thead tr:last-child th,\n.ht_master:not(.innerBorderTop) ~ .handsontable thead tr:last-child th,\n.ht_master:not(.innerBorderTop) thead tr.lastChild th,\n.ht_master:not(.innerBorderTop) ~ .handsontable thead tr.lastChild th {\n  border-bottom-width: 0;\n}\n\n.handsontable th {\n  background-color: #f3f3f3;\n  color: #222;\n  text-align: center;\n  font-weight: normal;\n  white-space: nowrap;\n}\n\n.handsontable thead th {\n  padding: 0;\n}\n\n.handsontable th.active {\n  background-color: #CCC;\n}\n.handsontable thead th .relative {\n  padding: 2px 4px;\n}\n\n#hot-display-license-info {\n  font-size: 9px;\n  color: #323232 ;\n  padding: 5px 0 3px 0;\n  font-family: Helvetica, Arial, sans-serif;\n  text-align: left;\n}\n\n/* plugins */\n\n/* row + column resizer*/\n.handsontable .manualColumnResizer {\n  position: fixed;\n  top: 0;\n  cursor: col-resize;\n  z-index: 110;\n  width: 5px;\n  height: 25px;\n}\n\n.handsontable .manualRowResizer {\n  position: fixed;\n  left: 0;\n  cursor: row-resize;\n  z-index: 110;\n  height: 5px;\n  width: 50px;\n}\n\n.handsontable .manualColumnResizer:hover,\n.handsontable .manualColumnResizer.active,\n.handsontable .manualRowResizer:hover,\n.handsontable .manualRowResizer.active {\n  background-color: #AAB;\n}\n\n.handsontable .manualColumnResizerGuide {\n  position: fixed;\n  right: 0;\n  top: 0;\n  background-color: #AAB;\n  display: none;\n  width: 0;\n  border-right: 1px dashed #777;\n  margin-left: 5px;\n}\n\n.handsontable .manualRowResizerGuide {\n  position: fixed;\n  left: 0;\n  bottom: 0;\n  background-color: #AAB;\n  display: none;\n  height: 0;\n  border-bottom: 1px dashed #777;\n  margin-top: 5px;\n}\n\n.handsontable .manualColumnResizerGuide.active,\n.handsontable .manualRowResizerGuide.active {\n  display: block;\n  z-index: 199;\n}\n\n.handsontable .columnSorting {\n  position: relative;\n}\n\n.handsontable .columnSorting:hover {\n  text-decoration: underline;\n  cursor: pointer;\n}\n\n.handsontable .columnSorting.ascending::after {\n  content: '\\25B2';\n  color: #5f5f5f;\n  position: absolute;\n  right: -15px;\n}\n\n.handsontable .columnSorting.descending::after {\n  content: '\\25BC';\n  color: #5f5f5f;\n  position: absolute;\n  right: -15px;\n}\n\n/* Selection */\n.handsontable .wtBorder {\n  position: absolute;\n  font-size: 0;\n}\n.handsontable .wtBorder.hidden{\n  display:none !important;\n}\n\n.handsontable td.area,\n.handsontable td.area-1,\n.handsontable td.area-2,\n.handsontable td.area-3,\n.handsontable td.area-4,\n.handsontable td.area-5,\n.handsontable td.area-6,\n.handsontable td.area-7 {\n  position: relative;\n}\n\n.handsontable td.area:before,\n.handsontable td.area-1:before,\n.handsontable td.area-2:before,\n.handsontable td.area-3:before,\n.handsontable td.area-4:before,\n.handsontable td.area-5:before,\n.handsontable td.area-6:before,\n.handsontable td.area-7:before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  bottom: -100%\\9; /* Fix for IE9 to spread the \":before\" pseudo element to 100% height of the parent element */\n  background: #005eff;\n}\n\n/* Fix for IE10 and IE11 to spread the \":before\" pseudo element to 100% height of the parent element */\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n  .handsontable td.area:before,\n  .handsontable td.area-1:before,\n  .handsontable td.area-2:before,\n  .handsontable td.area-3:before,\n  .handsontable td.area-4:before,\n  .handsontable td.area-5:before,\n  .handsontable td.area-6:before,\n  .handsontable td.area-7:before {\n    bottom: -100%;\n  }\n}\n\n.handsontable td.area:before {\n  opacity: 0.1;\n}\n.handsontable td.area-1:before {\n  opacity: 0.2;\n}\n.handsontable td.area-2:before {\n  opacity: 0.27;\n}\n.handsontable td.area-3:before {\n  opacity: 0.35;\n}\n.handsontable td.area-4:before {\n  opacity: 0.41;\n}\n.handsontable td.area-5:before {\n  opacity: 0.47;\n}\n.handsontable td.area-6:before {\n  opacity: 0.54;\n}\n.handsontable td.area-7:before {\n  opacity: 0.58;\n}\n\n.handsontable tbody th.ht__highlight,\n.handsontable thead th.ht__highlight {\n  background-color: #dcdcdc;\n}\n\n.handsontable tbody th.ht__active_highlight,\n.handsontable thead th.ht__active_highlight {\n  background-color: #8eb0e7;\n  color: #000;\n}\n\n/* fill handle */\n\n.handsontable .wtBorder.corner {\n  font-size: 0;\n  cursor: crosshair;\n}\n\n.handsontable .htBorder.htFillBorder {\n  background: red;\n  width: 1px;\n  height: 1px;\n}\n\n.handsontableInput {\n  border:none;\n  outline-width: 0;\n  margin: 0 ;\n  padding: 1px 5px 0 5px;\n  font-family: inherit;\n  line-height: 21px;\n  font-size: inherit;\n  box-shadow: 0 0 0 2px #5292F7 inset;\n  resize: none;\n  /*below are needed to overwrite stuff added by jQuery UI Bootstrap theme*/\n  display: block;\n  color: #000;\n  border-radius: 0;\n  background-color: #FFF;\n  /*overwrite styles potentionally made by a framework*/\n}\n\n.handsontableInputHolder {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 104;\n}\n\n.htSelectEditor {\n  -webkit-appearance: menulist-button !important;\n  position: absolute;\n  width: auto;\n}\n\n/*\nTextRenderer readOnly cell\n*/\n\n.handsontable .htDimmed {\n  color: #777;\n}\n\n.handsontable .htSubmenu {\n  position: relative;\n}\n\n.handsontable .htSubmenu :after{\n  content: '\\25B6';\n  color: #777;\n  position: absolute;\n  right: 5px;\n}\n\n\n/*\nTextRenderer horizontal alignment\n*/\n.handsontable .htLeft{\n  text-align: left;\n}\n.handsontable .htCenter{\n  text-align: center;\n}\n.handsontable .htRight{\n  text-align: right;\n}\n.handsontable .htJustify{\n  text-align: justify;\n}\n/*\nTextRenderer vertical alignment\n*/\n.handsontable .htTop{\n  vertical-align: top;\n}\n.handsontable .htMiddle{\n  vertical-align: middle;\n}\n.handsontable .htBottom{\n  vertical-align: bottom;\n}\n\n/*\nTextRenderer placeholder value\n*/\n\n.handsontable .htPlaceholder {\n  color: #999;\n}\n\n/*\nAutocompleteRenderer down arrow\n*/\n\n.handsontable .htAutocompleteArrow {\n  float: right;\n  font-size: 10px;\n  color: #EEE;\n  cursor: default;\n  width: 16px;\n  text-align: center;\n}\n\n.handsontable td .htAutocompleteArrow:hover {\n  color: #777;\n}\n\n.handsontable td.area .htAutocompleteArrow {\n  color: #d3d3d3;\n}\n\n/*\nCheckboxRenderer\n*/\n.handsontable .htCheckboxRendererInput {\n  display: inline-block;\n  vertical-align: middle;\n}\n.handsontable .htCheckboxRendererInput.noValue {\n  opacity: 0.5;\n}\n.handsontable .htCheckboxRendererLabel {\n  cursor: pointer;\n  display: inline-block;\n  width: 100%;\n}\n\n/**\n * Handsontable in Handsontable\n */\n\n.handsontable .handsontable.ht_clone_top .wtHider {\n  padding: 0 0 5px 0;\n}\n\n/**\n* Autocomplete Editor\n*/\n.handsontable .autocompleteEditor.handsontable {\n  padding-right: 17px;\n}\n.handsontable .autocompleteEditor.handsontable.htMacScroll {\n  padding-right: 15px;\n}\n\n\n/**\n * Handsontable listbox theme\n */\n\n.handsontable.listbox {\n  margin: 0;\n}\n\n.handsontable.listbox .ht_master table {\n  border: 1px solid #ccc;\n  border-collapse: separate;\n  background: white;\n}\n\n.handsontable.listbox th,\n.handsontable.listbox tr:first-child th,\n.handsontable.listbox tr:last-child th,\n.handsontable.listbox tr:first-child td,\n.handsontable.listbox td {\n  border-color: transparent;\n}\n\n.handsontable.listbox th,\n.handsontable.listbox td {\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.handsontable.listbox td.htDimmed {\n  cursor: default;\n  color: inherit;\n  font-style: inherit;\n}\n\n.handsontable.listbox .wtBorder {\n  visibility: hidden;\n}\n\n.handsontable.listbox tr td.current,\n.handsontable.listbox tr:hover td {\n  background: #eee;\n}\n\n.ht_clone_top {\n  z-index: 101;\n}\n\n.ht_clone_left {\n  z-index: 102;\n}\n\n.ht_clone_top_left_corner,\n.ht_clone_bottom_left_corner {\n  z-index: 103;\n}\n\n.ht_clone_debug {\n  z-index: 103;\n}\n\n.handsontable td.htSearchResult {\n  background: #fcedd9;\n  color: #583707;\n}\n\n/*\nCell borders\n*/\n.htBordered{\n  /*box-sizing: border-box !important;*/\n  border-width: 1px;\n}\n.htBordered.htTopBorderSolid {\n  border-top-style: solid;\n  border-top-color: #000;\n}\n.htBordered.htRightBorderSolid {\n  border-right-style: solid;\n  border-right-color: #000;\n}\n.htBordered.htBottomBorderSolid {\n  border-bottom-style: solid;\n  border-bottom-color: #000;\n}\n.htBordered.htLeftBorderSolid {\n  border-left-style: solid;\n  border-left-color: #000;\n}\n\n.handsontable tbody tr th:nth-last-child(2) {\n  border-right: 1px solid #CCC;\n}\n\n.handsontable thead tr:nth-last-child(2) th.htGroupIndicatorContainer {\n  border-bottom: 1px solid #CCC;\n  padding-bottom: 5px;\n}\n\n\n.ht_clone_top_left_corner thead tr th:nth-last-child(2) {\n  border-right: 1px solid #CCC;\n}\n\n.htCollapseButton {\n  width: 10px;\n  height: 10px;\n  line-height: 10px;\n  text-align: center;\n  border-radius: 5px;\n  border: 1px solid #f3f3f3;\n  -webkit-box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);\n  box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);\n  cursor: pointer;\n  margin-bottom: 3px;\n  position: relative;\n}\n\n.htCollapseButton:after {\n  content: \"\";\n  height: 300%;\n  width: 1px;\n  display: block;\n  background: #ccc;\n  margin-left: 4px;\n  position: absolute;\n  /*top: -300%;*/\n  bottom: 10px;\n}\n\n\nthead .htCollapseButton {\n  right: 5px;\n  position: absolute;\n  top: 5px;\n  background: #fff;\n}\n\nthead .htCollapseButton:after {\n  height: 1px;\n  width: 700%;\n  right: 10px;\n  top: 4px;\n}\n\n.handsontable tr th .htExpandButton {\n  position: absolute;\n  width: 10px;\n  height: 10px;\n  line-height: 10px;\n  text-align: center;\n  border-radius: 5px;\n  border: 1px solid #f3f3f3;\n  -webkit-box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);\n  box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);\n  cursor: pointer;\n  top: 0;\n  display: none;\n}\n\n.handsontable thead tr th .htExpandButton {\n  /*left: 5px;*/\n  top: 5px;\n}\n\n.handsontable tr th .htExpandButton.clickable {\n  display: block;\n}\n\n.collapsibleIndicator {\n  position: absolute;\n  top: 50%;\n  transform: translate(0% ,-50%);\n  right: 5px;\n  border: 1px solid #A6A6A6;\n  line-height: 10px;\n  color: #222;\n  border-radius: 10px;\n  font-size: 10px;\n  width: 10px;\n  height: 10px;\n  cursor: pointer;\n  -webkit-box-shadow: 0 0 0 6px rgba(238,238,238,1);\n  -moz-box-shadow: 0 0 0 6px rgba(238,238,238,1);\n  box-shadow: 0 0 0 6px rgba(238,238,238,1);\n  background: #eee;\n}\n\n.handsontable col.hidden {\n  width: 0 !important;\n}\n\n.handsontable table tr th.lightRightBorder {\n  border-right: 1px solid #E6E6E6;\n}\n\n.handsontable tr.hidden,\n.handsontable tr.hidden td,\n.handsontable tr.hidden th {\n  display: none;\n}\n\n.ht_master,\n.ht_clone_left,\n.ht_clone_top,\n.ht_clone_bottom {\n  overflow: hidden;\n}\n\n.ht_master .wtHolder {\n  overflow: auto;\n}\n\n.handsontable .ht_master thead,\n.handsontable .ht_master tr th,\n.handsontable .ht_clone_left thead {\n  visibility: hidden;\n}\n\n.ht_clone_top .wtHolder,\n.ht_clone_left .wtHolder,\n.ht_clone_bottom .wtHolder {\n  overflow: hidden;\n}\n/*\n\n Handsontable Mobile Text Editor stylesheet\n\n */\n\n.handsontable.mobile,\n.handsontable.mobile .wtHolder {\n  -webkit-touch-callout:none;\n  -webkit-user-select:none;\n  -khtml-user-select:none;\n  -moz-user-select:none;\n  -ms-user-select:none;\n  user-select:none;\n  -webkit-tap-highlight-color:rgba(0,0,0,0);\n  -webkit-overflow-scrolling: touch;\n}\n\n.htMobileEditorContainer {\n  display: none;\n  position: absolute;\n  top: 0;\n  width: 70%;\n  height: 54pt;\n  background: #f8f8f8;\n  border-radius: 20px;\n  border: 1px solid #ebebeb;\n  z-index: 999;\n  box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  -webkit-text-size-adjust: none;\n}\n\n.topLeftSelectionHandle:not(.ht_master .topLeftSelectionHandle),\n.topLeftSelectionHandle-HitArea:not(.ht_master .topLeftSelectionHandle-HitArea) {\n  z-index: 9999;\n}\n\n/* Initial left/top coordinates - overwritten when actual position is set */\n.topLeftSelectionHandle,\n.topLeftSelectionHandle-HitArea,\n.bottomRightSelectionHandle,\n.bottomRightSelectionHandle-HitArea {\n  left: -10000px;\n  top: -10000px;\n}\n\n.htMobileEditorContainer.active {\n  display: block;\n}\n\n.htMobileEditorContainer .inputs {\n  position: absolute;\n  right: 210pt;\n  bottom: 10pt;\n  top: 10pt;\n  left: 14px;\n  height: 34pt;\n}\n\n.htMobileEditorContainer .inputs textarea {\n  font-size: 13pt;\n  border: 1px solid #a1a1a1;\n  -webkit-appearance: none;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n  position: absolute;\n  left: 14px;\n  right: 14px;\n  top: 0;\n  bottom: 0;\n  padding: 7pt;\n}\n\n.htMobileEditorContainer .cellPointer {\n  position: absolute;\n  top: -13pt;\n  height: 0;\n  width: 0;\n  left: 30px;\n\n  border-left: 13pt solid transparent;\n  border-right: 13pt solid transparent;\n  border-bottom: 13pt solid #ebebeb;\n}\n\n.htMobileEditorContainer .cellPointer.hidden {\n  display: none;\n}\n\n.htMobileEditorContainer .cellPointer:before {\n  content: '';\n  display: block;\n  position: absolute;\n  top: 2px;\n  height: 0;\n  width: 0;\n  left: -13pt;\n\n  border-left: 13pt solid transparent;\n  border-right: 13pt solid transparent;\n  border-bottom: 13pt solid #f8f8f8;\n}\n\n.htMobileEditorContainer .moveHandle {\n  position: absolute;\n  top: 10pt;\n  left: 5px;\n  width: 30px;\n  bottom: 0px;\n  cursor: move;\n  z-index: 9999;\n}\n\n.htMobileEditorContainer .moveHandle:after {\n  content: \"..\\A..\\A..\\A..\";\n  white-space: pre;\n  line-height: 10px;\n  font-size: 20pt;\n  display: inline-block;\n  margin-top: -8px;\n  color: #ebebeb;\n}\n\n.htMobileEditorContainer .positionControls {\n  width: 205pt;\n  position: absolute;\n  right: 5pt;\n  top: 0;\n  bottom: 0;\n}\n\n.htMobileEditorContainer .positionControls > div {\n  width: 50pt;\n  height: 100%;\n  float: left;\n}\n\n.htMobileEditorContainer .positionControls > div:after {\n  content: \" \";\n  display: block;\n  width: 15pt;\n  height: 15pt;\n  text-align: center;\n  line-height: 50pt;\n}\n\n.htMobileEditorContainer .leftButton:after,\n.htMobileEditorContainer .rightButton:after,\n.htMobileEditorContainer .upButton:after,\n.htMobileEditorContainer .downButton:after {\n  transform-origin: 5pt 5pt;\n  -webkit-transform-origin: 5pt 5pt;\n  margin: 21pt 0 0 21pt;\n}\n\n.htMobileEditorContainer .leftButton:after {\n  border-top: 2px solid #288ffe;\n  border-left: 2px solid #288ffe;\n  -webkit-transform: rotate(-45deg);\n  /*margin-top: 17pt;*/\n  /*margin-left: 20pt;*/\n}\n.htMobileEditorContainer .leftButton:active:after {\n  border-color: #cfcfcf;\n}\n\n.htMobileEditorContainer .rightButton:after {\n  border-top: 2px solid #288ffe;\n  border-left: 2px solid #288ffe;\n  -webkit-transform: rotate(135deg);\n  /*margin-top: 17pt;*/\n  /*margin-left: 10pt;*/\n}\n.htMobileEditorContainer .rightButton:active:after {\n  border-color: #cfcfcf;\n}\n\n.htMobileEditorContainer .upButton:after {\n  /*border-top: 2px solid #cfcfcf;*/\n  border-top: 2px solid #288ffe;\n  border-left: 2px solid #288ffe;\n  -webkit-transform: rotate(45deg);\n  /*margin-top: 22pt;*/\n  /*margin-left: 15pt;*/\n}\n.htMobileEditorContainer .upButton:active:after {\n  border-color: #cfcfcf;\n}\n\n.htMobileEditorContainer .downButton:after {\n  border-top: 2px solid #288ffe;\n  border-left: 2px solid #288ffe;\n  -webkit-transform: rotate(225deg);\n  /*margin-top: 15pt;*/\n  /*margin-left: 15pt;*/\n}\n.htMobileEditorContainer .downButton:active:after {\n  border-color: #cfcfcf;\n}\n\n.handsontable.hide-tween {\n  -webkit-animation: opacity-hide 0.3s;\n  animation: opacity-hide 0.3s;\n  animation-fill-mode: forwards;\n  -webkit-animation-fill-mode: forwards;\n}\n\n.handsontable.show-tween {\n  -webkit-animation: opacity-show 0.3s;\n  animation: opacity-show 0.3s;\n  animation-fill-mode: forwards;\n  -webkit-animation-fill-mode: forwards;\n}\n.htCommentCell {\n    position: relative;\n}\n\n.htCommentCell:after {\n    content: '';\n    position: absolute;\n    top: 0;\n    right: 0;\n    border-left: 6px solid transparent;\n    border-top: 6px solid black;\n}\n\n.htComments {\n    display: none;\n    z-index: 1059;\n    position: absolute;\n}\n\n.htCommentTextArea {\n    box-shadow: rgba(0, 0, 0, 0.117647) 0 1px 3px, rgba(0, 0, 0, 0.239216) 0 1px 2px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n    border: none;\n    border-left: 3px solid #ccc;\n    background-color: #fff;\n    width: 215px;\n    height: 90px;\n    font-size: 12px;\n    padding: 5px;\n    outline: 0px !important;\n    -webkit-appearance: none;\n}\n\n.htCommentTextArea:focus {\n    box-shadow: rgba(0, 0, 0, 0.117647) 0 1px 3px, rgba(0, 0, 0, 0.239216) 0 1px 2px, inset 0 0 0 1px #5292f7;\n    border-left: 3px solid #5292f7;\n}\n/*!\n * Handsontable ContextMenu\n */\n\n.htContextMenu:not(.htGhostTable) {\n  display: none;\n  position: absolute;\n  z-index: 1060; /* needs to be higher than 1050 - z-index for Twitter Bootstrap modal (#1569) */\n}\n\n.htContextMenu .ht_clone_top,\n.htContextMenu .ht_clone_left,\n.htContextMenu .ht_clone_corner,\n.htContextMenu .ht_clone_debug {\n  display: none;\n}\n\n.htContextMenu table.htCore {\n  border: 1px solid #ccc;\n  border-bottom-width: 2px;\n  border-right-width: 2px;\n}\n\n.htContextMenu .wtBorder {\n  visibility: hidden;\n}\n\n.htContextMenu table tbody tr td {\n  background: white;\n  border-width: 0;\n  padding: 4px 6px 0 6px;\n  cursor: pointer;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.htContextMenu table tbody tr td:first-child {\n  border: 0;\n}\n\n.htContextMenu table tbody tr td.htDimmed {\n  font-style: normal;\n  color: #323232;\n}\n\n.htContextMenu table tbody tr td.current,\n.htContextMenu table tbody tr td.zeroclipboard-is-hover {\n  background: #f3f3f3;\n}\n\n.htContextMenu table tbody tr td.htSeparator {\n  border-top: 1px solid #bbb;\n  height: 0;\n  padding: 0;\n  cursor: default;\n}\n\n.htContextMenu table tbody tr td.htDisabled {\n  color: #999;\n  cursor: default;\n}\n\n.htContextMenu table tbody tr td.htDisabled:hover {\n  background: #fff;\n  color: #999;\n  cursor: default;\n}\n\n.htContextMenu table tbody tr.htHidden {\n  display: none;\n}\n\n.htContextMenu table tbody tr td .htItemWrapper {\n  margin-left: 10px;\n  margin-right: 6px;\n}\n\n.htContextMenu table tbody tr td div span.selected {\n  margin-top: -2px;\n  position: absolute;\n  left: 4px;\n}\n\n.htContextMenu .ht_master .wtHolder {\n  overflow: hidden;\n}\ntextarea#HandsontableCopyPaste {\n  position: fixed !important;\n  top: 0 !important;\n  right: 100% !important;\n  overflow: hidden;\n  opacity: 0;\n  outline: 0 none !important;\n}\n.htRowHeaders .ht_master.innerBorderLeft ~ .ht_clone_top_left_corner th:nth-child(2),\n.htRowHeaders .ht_master.innerBorderLeft ~ .ht_clone_left td:first-of-type {\n  border-left: 0 none;\n}\n.handsontable .wtHider {\n  position: relative;\n}\n.handsontable.ht__manualColumnMove.after-selection--columns thead th.ht__highlight {\n  cursor: move;\n  cursor: -moz-grab;\n  cursor: -webkit-grab;\n  cursor: grab;\n}\n.handsontable.ht__manualColumnMove.on-moving--columns,\n.handsontable.ht__manualColumnMove.on-moving--columns thead th.ht__highlight {\n  cursor: move;\n  cursor: -moz-grabbing;\n  cursor: -webkit-grabbing;\n  cursor: grabbing;\n}\n.handsontable.ht__manualColumnMove.on-moving--columns .manualColumnResizer {\n  display: none;\n}\n.handsontable .ht__manualColumnMove--guideline,\n.handsontable .ht__manualColumnMove--backlight {\n  position: absolute;\n  height: 100%;\n  display: none;\n}\n.handsontable .ht__manualColumnMove--guideline {\n  background: #757575;\n  width: 2px;\n  top: 0;\n  margin-left: -1px;\n  z-index: 105;\n}\n.handsontable .ht__manualColumnMove--backlight {\n  background: #343434;\n  background: rgba(52, 52, 52, 0.25);\n  display: none;\n  z-index: 105;\n  pointer-events: none;\n}\n.handsontable.on-moving--columns.show-ui .ht__manualColumnMove--guideline,\n.handsontable.on-moving--columns .ht__manualColumnMove--backlight {\n  display: block;\n}\n.handsontable .wtHider {\n  position: relative;\n}\n.handsontable.ht__manualRowMove.after-selection--rows tbody th.ht__highlight {\n  cursor: move;\n  cursor: -moz-grab;\n  cursor: -webkit-grab;\n  cursor: grab;\n}\n.handsontable.ht__manualRowMove.on-moving--rows,\n.handsontable.ht__manualRowMove.on-moving--rows tbody th.ht__highlight {\n  cursor: move;\n  cursor: -moz-grabbing;\n  cursor: -webkit-grabbing;\n  cursor: grabbing;\n}\n.handsontable.ht__manualRowMove.on-moving--rows .manualRowResizer {\n  display: none;\n}\n.handsontable .ht__manualRowMove--guideline,\n.handsontable .ht__manualRowMove--backlight {\n  position: absolute;\n  width: 100%;\n  display: none;\n}\n.handsontable .ht__manualRowMove--guideline {\n  background: #757575;\n  height: 2px;\n  left: 0;\n  margin-top: -1px;\n  z-index: 105;\n}\n.handsontable .ht__manualRowMove--backlight {\n  background: #343434;\n  background: rgba(52, 52, 52, 0.25);\n  display: none;\n  z-index: 105;\n  pointer-events: none;\n}\n.handsontable.on-moving--rows.show-ui .ht__manualRowMove--guideline,\n.handsontable.on-moving--rows .ht__manualRowMove--backlight {\n  display: block;\n}\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"]:not([class*=\"fullySelectedMergedCell\"]):before {\n    opacity: 0;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-multiple\"]:before {\n    opacity: 0.1;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-0\"]:before {\n    opacity: 0.1;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-1\"]:before {\n    opacity: 0.2;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-2\"]:before {\n    opacity: 0.27;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-3\"]:before {\n    opacity: 0.35;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-4\"]:before {\n    opacity: 0.41;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-5\"]:before {\n    opacity: 0.47;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-6\"]:before {\n    opacity: 0.54;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-7\"]:before {\n    opacity: 0.58;\n}\n\n/*# sourceMappingURL=handsontable.css.map*/"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/dist/handsontable.full.css",
    "content": "/*!\n * (The MIT License)\n * \n * Copyright (c) 2012-2014 Marcin Warpechowski\n * Copyright (c) 2015 Handsoncode sp. z o.o. <hello@handsoncode.net>\n * \n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * 'Software'), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n * \n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n * \n * Version: 2.0.0\n * Release date: 11/04/2018 (built at 10/04/2018 11:38:33)\n */\n/**\n * Fix for bootstrap styles\n */\n.handsontable .table th, .handsontable .table td {\n  border-top: none;\n}\n\n.handsontable tr {\n  background: #fff;\n}\n\n.handsontable td {\n  background-color: inherit;\n}\n\n.handsontable .table caption + thead tr:first-child th,\n.handsontable .table caption + thead tr:first-child td,\n.handsontable .table colgroup + thead tr:first-child th,\n.handsontable .table colgroup + thead tr:first-child td,\n.handsontable .table thead:first-child tr:first-child th,\n.handsontable .table thead:first-child tr:first-child td {\n  border-top: 1px solid #CCCCCC;\n}\n\n/* table-bordered */\n.handsontable .table-bordered {\n  border: 0;\n  border-collapse: separate;\n}\n\n.handsontable .table-bordered th,\n.handsontable .table-bordered td {\n  border-left: none;\n}\n\n.handsontable .table-bordered th:first-child,\n.handsontable .table-bordered td:first-child {\n  border-left: 1px solid #CCCCCC;\n}\n\n.handsontable .table > tbody > tr > td,\n.handsontable .table > tbody > tr > th,\n.handsontable .table > tfoot > tr > td,\n.handsontable .table > tfoot > tr > th,\n.handsontable .table > thead > tr > td,\n.handsontable .table > thead > tr > th {\n  line-height: 21px;\n  padding: 0 4px;\n}\n\n.col-lg-1.handsontable, .col-lg-10.handsontable, .col-lg-11.handsontable, .col-lg-12.handsontable,\n.col-lg-2.handsontable, .col-lg-3.handsontable, .col-lg-4.handsontable, .col-lg-5.handsontable, .col-lg-6.handsontable, .col-lg-7.handsontable, .col-lg-8.handsontable, .col-lg-9.handsontable,\n.col-md-1.handsontable, .col-md-10.handsontable, .col-md-11.handsontable, .col-md-12.handsontable,\n.col-md-2.handsontable, .col-md-3.handsontable, .col-md-4.handsontable, .col-md-5.handsontable, .col-md-6.handsontable, .col-md-7.handsontable, .col-md-8.handsontable, .col-md-9.handsontable\n.col-sm-1.handsontable, .col-sm-10.handsontable, .col-sm-11.handsontable, .col-sm-12.handsontable,\n.col-sm-2.handsontable, .col-sm-3.handsontable, .col-sm-4.handsontable, .col-sm-5.handsontable, .col-sm-6.handsontable, .col-sm-7.handsontable, .col-sm-8.handsontable, .col-sm-9.handsontable\n.col-xs-1.handsontable, .col-xs-10.handsontable, .col-xs-11.handsontable, .col-xs-12.handsontable,\n.col-xs-2.handsontable, .col-xs-3.handsontable, .col-xs-4.handsontable, .col-xs-5.handsontable, .col-xs-6.handsontable, .col-xs-7.handsontable, .col-xs-8.handsontable, .col-xs-9.handsontable {\n  padding-left: 0;\n  padding-right: 0;\n}\n\n.handsontable .table-striped > tbody > tr:nth-of-type(even) {\n  background-color: #FFF;\n}\n.handsontable {\n  position: relative;\n}\n\n.handsontable .hide{\n  display: none;\n}\n.handsontable .relative {\n  position: relative;\n}\n\n.handsontable.htAutoSize {\n  visibility: hidden;\n  left: -99000px;\n  position: absolute;\n  top: -99000px;\n}\n\n.handsontable .wtHider {\n  width: 0;\n}\n\n.handsontable .wtSpreader {\n  position: relative;\n  width: 0; /*must be 0, otherwise blank space appears in scroll demo after scrolling max to the right */\n  height: auto;\n}\n\n.handsontable table,\n.handsontable tbody,\n.handsontable thead,\n.handsontable td,\n.handsontable th,\n.handsontable input,\n.handsontable textarea,\n.handsontable div {\n  box-sizing: content-box;\n  -webkit-box-sizing: content-box;\n  -moz-box-sizing: content-box;\n}\n\n.handsontable input,\n.handsontable textarea {\n  min-height: initial;\n}\n\n.handsontable table.htCore {\n  border-collapse: separate;\n  /* it must be separate, otherwise there are offset miscalculations in WebKit: http://stackoverflow.com/questions/2655987/border-collapse-differences-in-ff-and-webkit */\n  /* this actually only changes appearance of user selection - does not make text unselectable */\n  /* -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -o-user-select: none;\n  -ms-user-select: none;\n  user-select: none; */ /* no browser supports unprefixed version */\n  border-spacing: 0;\n  margin: 0;\n  border-width: 0;\n  table-layout: fixed;\n  width: 0;\n  outline-width: 0;\n  /* reset bootstrap table style. for more info see: https://github.com/handsontable/handsontable/issues/224 */\n  max-width: none;\n  max-height: none;\n}\n\n.handsontable col {\n  width: 50px;\n}\n\n.handsontable col.rowHeader {\n  width: 50px;\n}\n\n.handsontable th,\n.handsontable td {\n  border-top-width: 0;\n  border-left-width: 0;\n  border-right: 1px solid #CCC;\n  border-bottom: 1px solid #CCC;\n  height: 22px;\n  empty-cells: show;\n  line-height: 21px;\n  padding: 0 4px 0 4px;\n  /* top, bottom padding different than 0 is handled poorly by FF with HTML5 doctype */\n  background-color: #FFF;\n  vertical-align: top;\n  overflow: hidden;\n  outline-width: 0;\n  white-space: pre-line;\n  /* preserve new line character in cell */\n  background-clip: padding-box;\n}\n\n.handsontable td.htInvalid {\n  background-color: #ff4c42 !important; /*gives priority over td.area selection background*/\n}\n\n.handsontable td.htNoWrap {\n  white-space: nowrap;\n}\n\n.handsontable th:last-child {\n  /*Foundation framework fix*/\n  border-right: 1px solid #CCC;\n  border-bottom: 1px solid #CCC;\n}\n\n.handsontable tr:first-child th.htNoFrame,\n.handsontable th:first-child.htNoFrame,\n.handsontable th.htNoFrame {\n  border-left-width: 0;\n  background-color: white;\n  border-color: #FFF;\n}\n\n.handsontable th:first-child,\n.handsontable th:nth-child(2),\n.handsontable td:first-of-type,\n.handsontable .htNoFrame + th,\n.handsontable .htNoFrame + td {\n  border-left: 1px solid #CCC;\n}\n\n.handsontable.htRowHeaders thead tr th:nth-child(2) {\n  border-left: 1px solid #CCC;\n}\n\n.handsontable tr:first-child th,\n.handsontable tr:first-child td {\n  border-top: 1px solid #CCC;\n}\n\n.ht_master:not(.innerBorderLeft):not(.emptyColumns) ~ .handsontable tbody tr th,\n.ht_master:not(.innerBorderLeft):not(.emptyColumns) ~ .handsontable:not(.ht_clone_top) thead tr th:first-child {\n  border-right-width: 0;\n}\n\n.ht_master:not(.innerBorderTop) thead tr:last-child th,\n.ht_master:not(.innerBorderTop) ~ .handsontable thead tr:last-child th,\n.ht_master:not(.innerBorderTop) thead tr.lastChild th,\n.ht_master:not(.innerBorderTop) ~ .handsontable thead tr.lastChild th {\n  border-bottom-width: 0;\n}\n\n.handsontable th {\n  background-color: #f3f3f3;\n  color: #222;\n  text-align: center;\n  font-weight: normal;\n  white-space: nowrap;\n}\n\n.handsontable thead th {\n  padding: 0;\n}\n\n.handsontable th.active {\n  background-color: #CCC;\n}\n.handsontable thead th .relative {\n  padding: 2px 4px;\n}\n\n#hot-display-license-info {\n  font-size: 9px;\n  color: #323232 ;\n  padding: 5px 0 3px 0;\n  font-family: Helvetica, Arial, sans-serif;\n  text-align: left;\n}\n\n/* plugins */\n\n/* row + column resizer*/\n.handsontable .manualColumnResizer {\n  position: fixed;\n  top: 0;\n  cursor: col-resize;\n  z-index: 110;\n  width: 5px;\n  height: 25px;\n}\n\n.handsontable .manualRowResizer {\n  position: fixed;\n  left: 0;\n  cursor: row-resize;\n  z-index: 110;\n  height: 5px;\n  width: 50px;\n}\n\n.handsontable .manualColumnResizer:hover,\n.handsontable .manualColumnResizer.active,\n.handsontable .manualRowResizer:hover,\n.handsontable .manualRowResizer.active {\n  background-color: #AAB;\n}\n\n.handsontable .manualColumnResizerGuide {\n  position: fixed;\n  right: 0;\n  top: 0;\n  background-color: #AAB;\n  display: none;\n  width: 0;\n  border-right: 1px dashed #777;\n  margin-left: 5px;\n}\n\n.handsontable .manualRowResizerGuide {\n  position: fixed;\n  left: 0;\n  bottom: 0;\n  background-color: #AAB;\n  display: none;\n  height: 0;\n  border-bottom: 1px dashed #777;\n  margin-top: 5px;\n}\n\n.handsontable .manualColumnResizerGuide.active,\n.handsontable .manualRowResizerGuide.active {\n  display: block;\n  z-index: 199;\n}\n\n.handsontable .columnSorting {\n  position: relative;\n}\n\n.handsontable .columnSorting:hover {\n  text-decoration: underline;\n  cursor: pointer;\n}\n\n.handsontable .columnSorting.ascending::after {\n  content: '\\25B2';\n  color: #5f5f5f;\n  position: absolute;\n  right: -15px;\n}\n\n.handsontable .columnSorting.descending::after {\n  content: '\\25BC';\n  color: #5f5f5f;\n  position: absolute;\n  right: -15px;\n}\n\n/* Selection */\n.handsontable .wtBorder {\n  position: absolute;\n  font-size: 0;\n}\n.handsontable .wtBorder.hidden{\n  display:none !important;\n}\n\n.handsontable td.area,\n.handsontable td.area-1,\n.handsontable td.area-2,\n.handsontable td.area-3,\n.handsontable td.area-4,\n.handsontable td.area-5,\n.handsontable td.area-6,\n.handsontable td.area-7 {\n  position: relative;\n}\n\n.handsontable td.area:before,\n.handsontable td.area-1:before,\n.handsontable td.area-2:before,\n.handsontable td.area-3:before,\n.handsontable td.area-4:before,\n.handsontable td.area-5:before,\n.handsontable td.area-6:before,\n.handsontable td.area-7:before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  bottom: -100%\\9; /* Fix for IE9 to spread the \":before\" pseudo element to 100% height of the parent element */\n  background: #005eff;\n}\n\n/* Fix for IE10 and IE11 to spread the \":before\" pseudo element to 100% height of the parent element */\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n  .handsontable td.area:before,\n  .handsontable td.area-1:before,\n  .handsontable td.area-2:before,\n  .handsontable td.area-3:before,\n  .handsontable td.area-4:before,\n  .handsontable td.area-5:before,\n  .handsontable td.area-6:before,\n  .handsontable td.area-7:before {\n    bottom: -100%;\n  }\n}\n\n.handsontable td.area:before {\n  opacity: 0.1;\n}\n.handsontable td.area-1:before {\n  opacity: 0.2;\n}\n.handsontable td.area-2:before {\n  opacity: 0.27;\n}\n.handsontable td.area-3:before {\n  opacity: 0.35;\n}\n.handsontable td.area-4:before {\n  opacity: 0.41;\n}\n.handsontable td.area-5:before {\n  opacity: 0.47;\n}\n.handsontable td.area-6:before {\n  opacity: 0.54;\n}\n.handsontable td.area-7:before {\n  opacity: 0.58;\n}\n\n.handsontable tbody th.ht__highlight,\n.handsontable thead th.ht__highlight {\n  background-color: #dcdcdc;\n}\n\n.handsontable tbody th.ht__active_highlight,\n.handsontable thead th.ht__active_highlight {\n  background-color: #8eb0e7;\n  color: #000;\n}\n\n/* fill handle */\n\n.handsontable .wtBorder.corner {\n  font-size: 0;\n  cursor: crosshair;\n}\n\n.handsontable .htBorder.htFillBorder {\n  background: red;\n  width: 1px;\n  height: 1px;\n}\n\n.handsontableInput {\n  border:none;\n  outline-width: 0;\n  margin: 0 ;\n  padding: 1px 5px 0 5px;\n  font-family: inherit;\n  line-height: 21px;\n  font-size: inherit;\n  box-shadow: 0 0 0 2px #5292F7 inset;\n  resize: none;\n  /*below are needed to overwrite stuff added by jQuery UI Bootstrap theme*/\n  display: block;\n  color: #000;\n  border-radius: 0;\n  background-color: #FFF;\n  /*overwrite styles potentionally made by a framework*/\n}\n\n.handsontableInputHolder {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 104;\n}\n\n.htSelectEditor {\n  -webkit-appearance: menulist-button !important;\n  position: absolute;\n  width: auto;\n}\n\n/*\nTextRenderer readOnly cell\n*/\n\n.handsontable .htDimmed {\n  color: #777;\n}\n\n.handsontable .htSubmenu {\n  position: relative;\n}\n\n.handsontable .htSubmenu :after{\n  content: '\\25B6';\n  color: #777;\n  position: absolute;\n  right: 5px;\n}\n\n\n/*\nTextRenderer horizontal alignment\n*/\n.handsontable .htLeft{\n  text-align: left;\n}\n.handsontable .htCenter{\n  text-align: center;\n}\n.handsontable .htRight{\n  text-align: right;\n}\n.handsontable .htJustify{\n  text-align: justify;\n}\n/*\nTextRenderer vertical alignment\n*/\n.handsontable .htTop{\n  vertical-align: top;\n}\n.handsontable .htMiddle{\n  vertical-align: middle;\n}\n.handsontable .htBottom{\n  vertical-align: bottom;\n}\n\n/*\nTextRenderer placeholder value\n*/\n\n.handsontable .htPlaceholder {\n  color: #999;\n}\n\n/*\nAutocompleteRenderer down arrow\n*/\n\n.handsontable .htAutocompleteArrow {\n  float: right;\n  font-size: 10px;\n  color: #EEE;\n  cursor: default;\n  width: 16px;\n  text-align: center;\n}\n\n.handsontable td .htAutocompleteArrow:hover {\n  color: #777;\n}\n\n.handsontable td.area .htAutocompleteArrow {\n  color: #d3d3d3;\n}\n\n/*\nCheckboxRenderer\n*/\n.handsontable .htCheckboxRendererInput {\n  display: inline-block;\n  vertical-align: middle;\n}\n.handsontable .htCheckboxRendererInput.noValue {\n  opacity: 0.5;\n}\n.handsontable .htCheckboxRendererLabel {\n  cursor: pointer;\n  display: inline-block;\n  width: 100%;\n}\n\n/**\n * Handsontable in Handsontable\n */\n\n.handsontable .handsontable.ht_clone_top .wtHider {\n  padding: 0 0 5px 0;\n}\n\n/**\n* Autocomplete Editor\n*/\n.handsontable .autocompleteEditor.handsontable {\n  padding-right: 17px;\n}\n.handsontable .autocompleteEditor.handsontable.htMacScroll {\n  padding-right: 15px;\n}\n\n\n/**\n * Handsontable listbox theme\n */\n\n.handsontable.listbox {\n  margin: 0;\n}\n\n.handsontable.listbox .ht_master table {\n  border: 1px solid #ccc;\n  border-collapse: separate;\n  background: white;\n}\n\n.handsontable.listbox th,\n.handsontable.listbox tr:first-child th,\n.handsontable.listbox tr:last-child th,\n.handsontable.listbox tr:first-child td,\n.handsontable.listbox td {\n  border-color: transparent;\n}\n\n.handsontable.listbox th,\n.handsontable.listbox td {\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.handsontable.listbox td.htDimmed {\n  cursor: default;\n  color: inherit;\n  font-style: inherit;\n}\n\n.handsontable.listbox .wtBorder {\n  visibility: hidden;\n}\n\n.handsontable.listbox tr td.current,\n.handsontable.listbox tr:hover td {\n  background: #eee;\n}\n\n.ht_clone_top {\n  z-index: 101;\n}\n\n.ht_clone_left {\n  z-index: 102;\n}\n\n.ht_clone_top_left_corner,\n.ht_clone_bottom_left_corner {\n  z-index: 103;\n}\n\n.ht_clone_debug {\n  z-index: 103;\n}\n\n.handsontable td.htSearchResult {\n  background: #fcedd9;\n  color: #583707;\n}\n\n/*\nCell borders\n*/\n.htBordered{\n  /*box-sizing: border-box !important;*/\n  border-width: 1px;\n}\n.htBordered.htTopBorderSolid {\n  border-top-style: solid;\n  border-top-color: #000;\n}\n.htBordered.htRightBorderSolid {\n  border-right-style: solid;\n  border-right-color: #000;\n}\n.htBordered.htBottomBorderSolid {\n  border-bottom-style: solid;\n  border-bottom-color: #000;\n}\n.htBordered.htLeftBorderSolid {\n  border-left-style: solid;\n  border-left-color: #000;\n}\n\n.handsontable tbody tr th:nth-last-child(2) {\n  border-right: 1px solid #CCC;\n}\n\n.handsontable thead tr:nth-last-child(2) th.htGroupIndicatorContainer {\n  border-bottom: 1px solid #CCC;\n  padding-bottom: 5px;\n}\n\n\n.ht_clone_top_left_corner thead tr th:nth-last-child(2) {\n  border-right: 1px solid #CCC;\n}\n\n.htCollapseButton {\n  width: 10px;\n  height: 10px;\n  line-height: 10px;\n  text-align: center;\n  border-radius: 5px;\n  border: 1px solid #f3f3f3;\n  -webkit-box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);\n  box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);\n  cursor: pointer;\n  margin-bottom: 3px;\n  position: relative;\n}\n\n.htCollapseButton:after {\n  content: \"\";\n  height: 300%;\n  width: 1px;\n  display: block;\n  background: #ccc;\n  margin-left: 4px;\n  position: absolute;\n  /*top: -300%;*/\n  bottom: 10px;\n}\n\n\nthead .htCollapseButton {\n  right: 5px;\n  position: absolute;\n  top: 5px;\n  background: #fff;\n}\n\nthead .htCollapseButton:after {\n  height: 1px;\n  width: 700%;\n  right: 10px;\n  top: 4px;\n}\n\n.handsontable tr th .htExpandButton {\n  position: absolute;\n  width: 10px;\n  height: 10px;\n  line-height: 10px;\n  text-align: center;\n  border-radius: 5px;\n  border: 1px solid #f3f3f3;\n  -webkit-box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);\n  box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);\n  cursor: pointer;\n  top: 0;\n  display: none;\n}\n\n.handsontable thead tr th .htExpandButton {\n  /*left: 5px;*/\n  top: 5px;\n}\n\n.handsontable tr th .htExpandButton.clickable {\n  display: block;\n}\n\n.collapsibleIndicator {\n  position: absolute;\n  top: 50%;\n  transform: translate(0% ,-50%);\n  right: 5px;\n  border: 1px solid #A6A6A6;\n  line-height: 10px;\n  color: #222;\n  border-radius: 10px;\n  font-size: 10px;\n  width: 10px;\n  height: 10px;\n  cursor: pointer;\n  -webkit-box-shadow: 0 0 0 6px rgba(238,238,238,1);\n  -moz-box-shadow: 0 0 0 6px rgba(238,238,238,1);\n  box-shadow: 0 0 0 6px rgba(238,238,238,1);\n  background: #eee;\n}\n\n.handsontable col.hidden {\n  width: 0 !important;\n}\n\n.handsontable table tr th.lightRightBorder {\n  border-right: 1px solid #E6E6E6;\n}\n\n.handsontable tr.hidden,\n.handsontable tr.hidden td,\n.handsontable tr.hidden th {\n  display: none;\n}\n\n.ht_master,\n.ht_clone_left,\n.ht_clone_top,\n.ht_clone_bottom {\n  overflow: hidden;\n}\n\n.ht_master .wtHolder {\n  overflow: auto;\n}\n\n.handsontable .ht_master thead,\n.handsontable .ht_master tr th,\n.handsontable .ht_clone_left thead {\n  visibility: hidden;\n}\n\n.ht_clone_top .wtHolder,\n.ht_clone_left .wtHolder,\n.ht_clone_bottom .wtHolder {\n  overflow: hidden;\n}\n/*\n\n Handsontable Mobile Text Editor stylesheet\n\n */\n\n.handsontable.mobile,\n.handsontable.mobile .wtHolder {\n  -webkit-touch-callout:none;\n  -webkit-user-select:none;\n  -khtml-user-select:none;\n  -moz-user-select:none;\n  -ms-user-select:none;\n  user-select:none;\n  -webkit-tap-highlight-color:rgba(0,0,0,0);\n  -webkit-overflow-scrolling: touch;\n}\n\n.htMobileEditorContainer {\n  display: none;\n  position: absolute;\n  top: 0;\n  width: 70%;\n  height: 54pt;\n  background: #f8f8f8;\n  border-radius: 20px;\n  border: 1px solid #ebebeb;\n  z-index: 999;\n  box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  -webkit-text-size-adjust: none;\n}\n\n.topLeftSelectionHandle:not(.ht_master .topLeftSelectionHandle),\n.topLeftSelectionHandle-HitArea:not(.ht_master .topLeftSelectionHandle-HitArea) {\n  z-index: 9999;\n}\n\n/* Initial left/top coordinates - overwritten when actual position is set */\n.topLeftSelectionHandle,\n.topLeftSelectionHandle-HitArea,\n.bottomRightSelectionHandle,\n.bottomRightSelectionHandle-HitArea {\n  left: -10000px;\n  top: -10000px;\n}\n\n.htMobileEditorContainer.active {\n  display: block;\n}\n\n.htMobileEditorContainer .inputs {\n  position: absolute;\n  right: 210pt;\n  bottom: 10pt;\n  top: 10pt;\n  left: 14px;\n  height: 34pt;\n}\n\n.htMobileEditorContainer .inputs textarea {\n  font-size: 13pt;\n  border: 1px solid #a1a1a1;\n  -webkit-appearance: none;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n  position: absolute;\n  left: 14px;\n  right: 14px;\n  top: 0;\n  bottom: 0;\n  padding: 7pt;\n}\n\n.htMobileEditorContainer .cellPointer {\n  position: absolute;\n  top: -13pt;\n  height: 0;\n  width: 0;\n  left: 30px;\n\n  border-left: 13pt solid transparent;\n  border-right: 13pt solid transparent;\n  border-bottom: 13pt solid #ebebeb;\n}\n\n.htMobileEditorContainer .cellPointer.hidden {\n  display: none;\n}\n\n.htMobileEditorContainer .cellPointer:before {\n  content: '';\n  display: block;\n  position: absolute;\n  top: 2px;\n  height: 0;\n  width: 0;\n  left: -13pt;\n\n  border-left: 13pt solid transparent;\n  border-right: 13pt solid transparent;\n  border-bottom: 13pt solid #f8f8f8;\n}\n\n.htMobileEditorContainer .moveHandle {\n  position: absolute;\n  top: 10pt;\n  left: 5px;\n  width: 30px;\n  bottom: 0px;\n  cursor: move;\n  z-index: 9999;\n}\n\n.htMobileEditorContainer .moveHandle:after {\n  content: \"..\\A..\\A..\\A..\";\n  white-space: pre;\n  line-height: 10px;\n  font-size: 20pt;\n  display: inline-block;\n  margin-top: -8px;\n  color: #ebebeb;\n}\n\n.htMobileEditorContainer .positionControls {\n  width: 205pt;\n  position: absolute;\n  right: 5pt;\n  top: 0;\n  bottom: 0;\n}\n\n.htMobileEditorContainer .positionControls > div {\n  width: 50pt;\n  height: 100%;\n  float: left;\n}\n\n.htMobileEditorContainer .positionControls > div:after {\n  content: \" \";\n  display: block;\n  width: 15pt;\n  height: 15pt;\n  text-align: center;\n  line-height: 50pt;\n}\n\n.htMobileEditorContainer .leftButton:after,\n.htMobileEditorContainer .rightButton:after,\n.htMobileEditorContainer .upButton:after,\n.htMobileEditorContainer .downButton:after {\n  transform-origin: 5pt 5pt;\n  -webkit-transform-origin: 5pt 5pt;\n  margin: 21pt 0 0 21pt;\n}\n\n.htMobileEditorContainer .leftButton:after {\n  border-top: 2px solid #288ffe;\n  border-left: 2px solid #288ffe;\n  -webkit-transform: rotate(-45deg);\n  /*margin-top: 17pt;*/\n  /*margin-left: 20pt;*/\n}\n.htMobileEditorContainer .leftButton:active:after {\n  border-color: #cfcfcf;\n}\n\n.htMobileEditorContainer .rightButton:after {\n  border-top: 2px solid #288ffe;\n  border-left: 2px solid #288ffe;\n  -webkit-transform: rotate(135deg);\n  /*margin-top: 17pt;*/\n  /*margin-left: 10pt;*/\n}\n.htMobileEditorContainer .rightButton:active:after {\n  border-color: #cfcfcf;\n}\n\n.htMobileEditorContainer .upButton:after {\n  /*border-top: 2px solid #cfcfcf;*/\n  border-top: 2px solid #288ffe;\n  border-left: 2px solid #288ffe;\n  -webkit-transform: rotate(45deg);\n  /*margin-top: 22pt;*/\n  /*margin-left: 15pt;*/\n}\n.htMobileEditorContainer .upButton:active:after {\n  border-color: #cfcfcf;\n}\n\n.htMobileEditorContainer .downButton:after {\n  border-top: 2px solid #288ffe;\n  border-left: 2px solid #288ffe;\n  -webkit-transform: rotate(225deg);\n  /*margin-top: 15pt;*/\n  /*margin-left: 15pt;*/\n}\n.htMobileEditorContainer .downButton:active:after {\n  border-color: #cfcfcf;\n}\n\n.handsontable.hide-tween {\n  -webkit-animation: opacity-hide 0.3s;\n  animation: opacity-hide 0.3s;\n  animation-fill-mode: forwards;\n  -webkit-animation-fill-mode: forwards;\n}\n\n.handsontable.show-tween {\n  -webkit-animation: opacity-show 0.3s;\n  animation: opacity-show 0.3s;\n  animation-fill-mode: forwards;\n  -webkit-animation-fill-mode: forwards;\n}\n@charset \"UTF-8\";\n\n/*!\n * Pikaday\n * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/\n */\n\n.pika-single {\n    z-index: 9999;\n    display: block;\n    position: relative;\n    color: #333;\n    background: #fff;\n    border: 1px solid #ccc;\n    border-bottom-color: #bbb;\n    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\n/*\nclear child float (pika-lendar), using the famous micro clearfix hack\nhttp://nicolasgallagher.com/micro-clearfix-hack/\n*/\n.pika-single:before,\n.pika-single:after {\n    content: \" \";\n    display: table;\n}\n.pika-single:after { clear: both }\n.pika-single { *zoom: 1 }\n\n.pika-single.is-hidden {\n    display: none;\n}\n\n.pika-single.is-bound {\n    position: absolute;\n    box-shadow: 0 5px 15px -5px rgba(0,0,0,.5);\n}\n\n.pika-lendar {\n    float: left;\n    width: 240px;\n    margin: 8px;\n}\n\n.pika-title {\n    position: relative;\n    text-align: center;\n}\n\n.pika-label {\n    display: inline-block;\n    *display: inline;\n    position: relative;\n    z-index: 9999;\n    overflow: hidden;\n    margin: 0;\n    padding: 5px 3px;\n    font-size: 14px;\n    line-height: 20px;\n    font-weight: bold;\n    background-color: #fff;\n}\n.pika-title select {\n    cursor: pointer;\n    position: absolute;\n    z-index: 9998;\n    margin: 0;\n    left: 0;\n    top: 5px;\n    filter: alpha(opacity=0);\n    opacity: 0;\n}\n\n.pika-prev,\n.pika-next {\n    display: block;\n    cursor: pointer;\n    position: relative;\n    outline: none;\n    border: 0;\n    padding: 0;\n    width: 20px;\n    height: 30px;\n    /* hide text using text-indent trick, using width value (it's enough) */\n    text-indent: 20px;\n    white-space: nowrap;\n    overflow: hidden;\n    background-color: transparent;\n    background-position: center center;\n    background-repeat: no-repeat;\n    background-size: 75% 75%;\n    opacity: .5;\n    *position: absolute;\n    *top: 0;\n}\n\n.pika-prev:hover,\n.pika-next:hover {\n    opacity: 1;\n}\n\n.pika-prev,\n.is-rtl .pika-next {\n    float: left;\n    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==');\n    *left: 0;\n}\n\n.pika-next,\n.is-rtl .pika-prev {\n    float: right;\n    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=');\n    *right: 0;\n}\n\n.pika-prev.is-disabled,\n.pika-next.is-disabled {\n    cursor: default;\n    opacity: .2;\n}\n\n.pika-select {\n    display: inline-block;\n    *display: inline;\n}\n\n.pika-table {\n    width: 100%;\n    border-collapse: collapse;\n    border-spacing: 0;\n    border: 0;\n}\n\n.pika-table th,\n.pika-table td {\n    width: 14.285714285714286%;\n    padding: 0;\n}\n\n.pika-table th {\n    color: #999;\n    font-size: 12px;\n    line-height: 25px;\n    font-weight: bold;\n    text-align: center;\n}\n\n.pika-button {\n    cursor: pointer;\n    display: block;\n    box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    outline: none;\n    border: 0;\n    margin: 0;\n    width: 100%;\n    padding: 5px;\n    color: #666;\n    font-size: 12px;\n    line-height: 15px;\n    text-align: right;\n    background: #f5f5f5;\n}\n\n.pika-week {\n    font-size: 11px;\n    color: #999;\n}\n\n.is-today .pika-button {\n    color: #33aaff;\n    font-weight: bold;\n}\n\n.is-selected .pika-button {\n    color: #fff;\n    font-weight: bold;\n    background: #33aaff;\n    box-shadow: inset 0 1px 3px #178fe5;\n    border-radius: 3px;\n}\n\n.is-inrange .pika-button {\n    background: #D5E9F7;\n}\n\n.is-startrange .pika-button {\n    color: #fff;\n    background: #6CB31D;\n    box-shadow: none;\n    border-radius: 3px;\n}\n\n.is-endrange .pika-button {\n    color: #fff;\n    background: #33aaff;\n    box-shadow: none;\n    border-radius: 3px;\n}\n\n.is-disabled .pika-button,\n.is-outside-current-month .pika-button {\n    pointer-events: none;\n    cursor: default;\n    color: #999;\n    opacity: .3;\n}\n\n.pika-button:hover {\n    color: #fff;\n    background: #ff8000;\n    box-shadow: none;\n    border-radius: 3px;\n}\n\n/* styling for abbr */\n.pika-table abbr {\n    border-bottom: none;\n    cursor: help;\n}\n\n.htCommentCell {\n    position: relative;\n}\n\n.htCommentCell:after {\n    content: '';\n    position: absolute;\n    top: 0;\n    right: 0;\n    border-left: 6px solid transparent;\n    border-top: 6px solid black;\n}\n\n.htComments {\n    display: none;\n    z-index: 1059;\n    position: absolute;\n}\n\n.htCommentTextArea {\n    box-shadow: rgba(0, 0, 0, 0.117647) 0 1px 3px, rgba(0, 0, 0, 0.239216) 0 1px 2px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n    border: none;\n    border-left: 3px solid #ccc;\n    background-color: #fff;\n    width: 215px;\n    height: 90px;\n    font-size: 12px;\n    padding: 5px;\n    outline: 0px !important;\n    -webkit-appearance: none;\n}\n\n.htCommentTextArea:focus {\n    box-shadow: rgba(0, 0, 0, 0.117647) 0 1px 3px, rgba(0, 0, 0, 0.239216) 0 1px 2px, inset 0 0 0 1px #5292f7;\n    border-left: 3px solid #5292f7;\n}\n/*!\n * Handsontable ContextMenu\n */\n\n.htContextMenu:not(.htGhostTable) {\n  display: none;\n  position: absolute;\n  z-index: 1060; /* needs to be higher than 1050 - z-index for Twitter Bootstrap modal (#1569) */\n}\n\n.htContextMenu .ht_clone_top,\n.htContextMenu .ht_clone_left,\n.htContextMenu .ht_clone_corner,\n.htContextMenu .ht_clone_debug {\n  display: none;\n}\n\n.htContextMenu table.htCore {\n  border: 1px solid #ccc;\n  border-bottom-width: 2px;\n  border-right-width: 2px;\n}\n\n.htContextMenu .wtBorder {\n  visibility: hidden;\n}\n\n.htContextMenu table tbody tr td {\n  background: white;\n  border-width: 0;\n  padding: 4px 6px 0 6px;\n  cursor: pointer;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.htContextMenu table tbody tr td:first-child {\n  border: 0;\n}\n\n.htContextMenu table tbody tr td.htDimmed {\n  font-style: normal;\n  color: #323232;\n}\n\n.htContextMenu table tbody tr td.current,\n.htContextMenu table tbody tr td.zeroclipboard-is-hover {\n  background: #f3f3f3;\n}\n\n.htContextMenu table tbody tr td.htSeparator {\n  border-top: 1px solid #bbb;\n  height: 0;\n  padding: 0;\n  cursor: default;\n}\n\n.htContextMenu table tbody tr td.htDisabled {\n  color: #999;\n  cursor: default;\n}\n\n.htContextMenu table tbody tr td.htDisabled:hover {\n  background: #fff;\n  color: #999;\n  cursor: default;\n}\n\n.htContextMenu table tbody tr.htHidden {\n  display: none;\n}\n\n.htContextMenu table tbody tr td .htItemWrapper {\n  margin-left: 10px;\n  margin-right: 6px;\n}\n\n.htContextMenu table tbody tr td div span.selected {\n  margin-top: -2px;\n  position: absolute;\n  left: 4px;\n}\n\n.htContextMenu .ht_master .wtHolder {\n  overflow: hidden;\n}\ntextarea#HandsontableCopyPaste {\n  position: fixed !important;\n  top: 0 !important;\n  right: 100% !important;\n  overflow: hidden;\n  opacity: 0;\n  outline: 0 none !important;\n}\n.htRowHeaders .ht_master.innerBorderLeft ~ .ht_clone_top_left_corner th:nth-child(2),\n.htRowHeaders .ht_master.innerBorderLeft ~ .ht_clone_left td:first-of-type {\n  border-left: 0 none;\n}\n.handsontable .wtHider {\n  position: relative;\n}\n.handsontable.ht__manualColumnMove.after-selection--columns thead th.ht__highlight {\n  cursor: move;\n  cursor: -moz-grab;\n  cursor: -webkit-grab;\n  cursor: grab;\n}\n.handsontable.ht__manualColumnMove.on-moving--columns,\n.handsontable.ht__manualColumnMove.on-moving--columns thead th.ht__highlight {\n  cursor: move;\n  cursor: -moz-grabbing;\n  cursor: -webkit-grabbing;\n  cursor: grabbing;\n}\n.handsontable.ht__manualColumnMove.on-moving--columns .manualColumnResizer {\n  display: none;\n}\n.handsontable .ht__manualColumnMove--guideline,\n.handsontable .ht__manualColumnMove--backlight {\n  position: absolute;\n  height: 100%;\n  display: none;\n}\n.handsontable .ht__manualColumnMove--guideline {\n  background: #757575;\n  width: 2px;\n  top: 0;\n  margin-left: -1px;\n  z-index: 105;\n}\n.handsontable .ht__manualColumnMove--backlight {\n  background: #343434;\n  background: rgba(52, 52, 52, 0.25);\n  display: none;\n  z-index: 105;\n  pointer-events: none;\n}\n.handsontable.on-moving--columns.show-ui .ht__manualColumnMove--guideline,\n.handsontable.on-moving--columns .ht__manualColumnMove--backlight {\n  display: block;\n}\n.handsontable .wtHider {\n  position: relative;\n}\n.handsontable.ht__manualRowMove.after-selection--rows tbody th.ht__highlight {\n  cursor: move;\n  cursor: -moz-grab;\n  cursor: -webkit-grab;\n  cursor: grab;\n}\n.handsontable.ht__manualRowMove.on-moving--rows,\n.handsontable.ht__manualRowMove.on-moving--rows tbody th.ht__highlight {\n  cursor: move;\n  cursor: -moz-grabbing;\n  cursor: -webkit-grabbing;\n  cursor: grabbing;\n}\n.handsontable.ht__manualRowMove.on-moving--rows .manualRowResizer {\n  display: none;\n}\n.handsontable .ht__manualRowMove--guideline,\n.handsontable .ht__manualRowMove--backlight {\n  position: absolute;\n  width: 100%;\n  display: none;\n}\n.handsontable .ht__manualRowMove--guideline {\n  background: #757575;\n  height: 2px;\n  left: 0;\n  margin-top: -1px;\n  z-index: 105;\n}\n.handsontable .ht__manualRowMove--backlight {\n  background: #343434;\n  background: rgba(52, 52, 52, 0.25);\n  display: none;\n  z-index: 105;\n  pointer-events: none;\n}\n.handsontable.on-moving--rows.show-ui .ht__manualRowMove--guideline,\n.handsontable.on-moving--rows .ht__manualRowMove--backlight {\n  display: block;\n}\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"]:not([class*=\"fullySelectedMergedCell\"]):before {\n    opacity: 0;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-multiple\"]:before {\n    opacity: 0.1;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-0\"]:before {\n    opacity: 0.1;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-1\"]:before {\n    opacity: 0.2;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-2\"]:before {\n    opacity: 0.27;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-3\"]:before {\n    opacity: 0.35;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-4\"]:before {\n    opacity: 0.41;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-5\"]:before {\n    opacity: 0.47;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-6\"]:before {\n    opacity: 0.54;\n}\n\n.handsontable tbody td[rowspan][class*=\"area\"][class*=\"highlight\"][class*=\"fullySelectedMergedCell-7\"]:before {\n    opacity: 0.58;\n}\n"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/dist/handsontable.full.js",
    "content": "/*!\n * (The MIT License)\n * \n * Copyright (c) 2012-2014 Marcin Warpechowski\n * Copyright (c) 2015 Handsoncode sp. z o.o. <hello@handsoncode.net>\n * \n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * 'Software'), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n * \n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n * \n * Version: 2.0.0\n * Release date: 11/04/2018 (built at 10/04/2018 11:38:33)\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"Handsontable\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Handsontable\"] = factory();\n\telse\n\t\troot[\"Handsontable\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 326);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.HTML_CHARACTERS = undefined;\nexports.getParent = getParent;\nexports.closest = closest;\nexports.closestDown = closestDown;\nexports.isChildOf = isChildOf;\nexports.isChildOfWebComponentTable = isChildOfWebComponentTable;\nexports.polymerWrap = polymerWrap;\nexports.polymerUnwrap = polymerUnwrap;\nexports.index = index;\nexports.overlayContainsElement = overlayContainsElement;\nexports.hasClass = hasClass;\nexports.addClass = addClass;\nexports.removeClass = removeClass;\nexports.removeTextNodes = removeTextNodes;\nexports.empty = empty;\nexports.fastInnerHTML = fastInnerHTML;\nexports.fastInnerText = fastInnerText;\nexports.isVisible = isVisible;\nexports.offset = offset;\nexports.getWindowScrollTop = getWindowScrollTop;\nexports.getWindowScrollLeft = getWindowScrollLeft;\nexports.getScrollTop = getScrollTop;\nexports.getScrollLeft = getScrollLeft;\nexports.getScrollableElement = getScrollableElement;\nexports.getTrimmingContainer = getTrimmingContainer;\nexports.getStyle = getStyle;\nexports.getComputedStyle = getComputedStyle;\nexports.outerWidth = outerWidth;\nexports.outerHeight = outerHeight;\nexports.innerHeight = innerHeight;\nexports.innerWidth = innerWidth;\nexports.addEvent = addEvent;\nexports.removeEvent = removeEvent;\nexports.getCaretPosition = getCaretPosition;\nexports.getSelectionEndPosition = getSelectionEndPosition;\nexports.getSelectionText = getSelectionText;\nexports.setCaretPosition = setCaretPosition;\nexports.getScrollbarWidth = getScrollbarWidth;\nexports.hasVerticalScrollbar = hasVerticalScrollbar;\nexports.hasHorizontalScrollbar = hasHorizontalScrollbar;\nexports.setOverlayPosition = setOverlayPosition;\nexports.getCssTransform = getCssTransform;\nexports.resetCssTransform = resetCssTransform;\nexports.isInput = isInput;\nexports.isOutsideInput = isOutsideInput;\n\nvar _browser = __webpack_require__(27);\n\nvar _feature = __webpack_require__(40);\n\n/**\n * Get the parent of the specified node in the DOM tree.\n *\n * @param  {HTMLElement} element Element from which traversing is started.\n * @param  {Number} [level=0] Traversing deep level.\n * @return {HTMLElement|null}\n */\nfunction getParent(element) {\n  var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n  var iteration = -1;\n  var parent = null;\n\n  while (element != null) {\n    if (iteration === level) {\n      parent = element;\n      break;\n    }\n\n    if (element.host && element.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      element = element.host;\n    } else {\n      iteration++;\n      element = element.parentNode;\n    }\n  }\n\n  return parent;\n}\n\n/**\n * Goes up the DOM tree (including given element) until it finds an element that matches the nodes or nodes name.\n * This method goes up through web components.\n *\n * @param {HTMLElement} element Element from which traversing is started\n * @param {Array} nodes Array of elements or Array of elements name\n * @param {HTMLElement} [until]\n * @returns {HTMLElement|null}\n */\nfunction closest(element, nodes, until) {\n  while (element != null && element !== until) {\n    if (element.nodeType === Node.ELEMENT_NODE && (nodes.indexOf(element.nodeName) > -1 || nodes.indexOf(element) > -1)) {\n      return element;\n    }\n    if (element.host && element.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      element = element.host;\n    } else {\n      element = element.parentNode;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Goes \"down\" the DOM tree (including given element) until it finds an element that matches the nodes or nodes name.\n *\n * @param {HTMLElement} element Element from which traversing is started\n * @param {Array} nodes Array of elements or Array of elements name\n * @param {HTMLElement} [until]\n * @returns {HTMLElement|null}\n */\nfunction closestDown(element, nodes, until) {\n  var matched = [];\n\n  while (element) {\n    element = closest(element, nodes, until);\n\n    if (!element || until && !until.contains(element)) {\n      break;\n    }\n    matched.push(element);\n\n    if (element.host && element.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      element = element.host;\n    } else {\n      element = element.parentNode;\n    }\n  }\n  var length = matched.length;\n\n  return length ? matched[length - 1] : null;\n}\n\n/**\n * Goes up the DOM tree and checks if element is child of another element.\n *\n * @param child Child element\n * @param {Object|String} parent Parent element OR selector of the parent element.\n *                               If string provided, function returns `true` for the first occurrence of element with that class.\n * @returns {Boolean}\n */\nfunction isChildOf(child, parent) {\n  var node = child.parentNode;\n  var queriedParents = [];\n\n  if (typeof parent === 'string') {\n    queriedParents = Array.prototype.slice.call(document.querySelectorAll(parent), 0);\n  } else {\n    queriedParents.push(parent);\n  }\n\n  while (node != null) {\n    if (queriedParents.indexOf(node) > -1) {\n      return true;\n    }\n    node = node.parentNode;\n  }\n\n  return false;\n}\n\n/**\n * Check if an element is part of `hot-table` web component.\n *\n * @param {Element} element\n * @returns {Boolean}\n */\nfunction isChildOfWebComponentTable(element) {\n  var hotTableName = 'hot-table',\n      result = false,\n      parentNode;\n\n  parentNode = polymerWrap(element);\n\n  function isHotTable(element) {\n    return element.nodeType === Node.ELEMENT_NODE && element.nodeName === hotTableName.toUpperCase();\n  }\n\n  while (parentNode != null) {\n    if (isHotTable(parentNode)) {\n      result = true;\n      break;\n    } else if (parentNode.host && parentNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      result = isHotTable(parentNode.host);\n\n      if (result) {\n        break;\n      }\n      parentNode = parentNode.host;\n    }\n    parentNode = parentNode.parentNode;\n  }\n\n  return result;\n}\n\n/**\n * Wrap element into polymer/webcomponent container if exists\n *\n * @param element\n * @returns {*}\n */\nfunction polymerWrap(element) {\n  /* global Polymer */\n  return typeof Polymer !== 'undefined' && typeof wrap === 'function' ? wrap(element) : element;\n}\n\n/**\n * Unwrap element from polymer/webcomponent container if exists\n *\n * @param element\n * @returns {*}\n */\nfunction polymerUnwrap(element) {\n  /* global Polymer */\n  return typeof Polymer !== 'undefined' && typeof unwrap === 'function' ? unwrap(element) : element;\n}\n\n/**\n * Counts index of element within its parent\n * WARNING: for performance reasons, assumes there are only element nodes (no text nodes). This is true for Walkotnable\n * Otherwise would need to check for nodeType or use previousElementSibling\n *\n * @see http://jsperf.com/sibling-index/10\n * @param {Element} element\n * @return {Number}\n */\nfunction index(element) {\n  var i = 0;\n\n  if (element.previousSibling) {\n    /* eslint-disable no-cond-assign */\n    while (element = element.previousSibling) {\n      ++i;\n    }\n  }\n\n  return i;\n}\n\n/**\n * Check if the provided overlay contains the provided element\n *\n * @param {String} overlay\n * @param {HTMLElement} element\n * @returns {boolean}\n */\nfunction overlayContainsElement(overlayType, element) {\n  var overlayElement = document.querySelector('.ht_clone_' + overlayType);\n  return overlayElement ? overlayElement.contains(element) : null;\n}\n\nvar classListSupport = !!document.documentElement.classList;\nvar _hasClass, _addClass, _removeClass;\n\nfunction filterEmptyClassNames(classNames) {\n  var result = [];\n\n  if (!classNames || !classNames.length) {\n    return result;\n  }\n\n  var len = 0;\n\n  while (classNames[len]) {\n    result.push(classNames[len]);\n    len++;\n  }\n\n  return result;\n}\n\nif (classListSupport) {\n  var isSupportMultipleClassesArg = function () {\n    var element = document.createElement('div');\n\n    element.classList.add('test', 'test2');\n\n    return element.classList.contains('test2');\n  }();\n\n  _hasClass = function _hasClass(element, className) {\n    if (element.classList === void 0 || typeof className !== 'string' || className === '') {\n      return false;\n    }\n\n    return element.classList.contains(className);\n  };\n\n  _addClass = function _addClass(element, className) {\n    if (typeof className === 'string') {\n      className = className.split(' ');\n    }\n\n    className = filterEmptyClassNames(className);\n\n    if (className.length > 0) {\n      if (isSupportMultipleClassesArg) {\n        element.classList.add.apply(element.classList, className);\n      } else {\n        var len = 0;\n\n        while (className && className[len]) {\n          element.classList.add(className[len]);\n          len++;\n        }\n      }\n    }\n  };\n\n  _removeClass = function _removeClass(element, className) {\n    if (typeof className === 'string') {\n      className = className.split(' ');\n    }\n\n    className = filterEmptyClassNames(className);\n\n    if (className.length > 0) {\n      if (isSupportMultipleClassesArg) {\n        element.classList.remove.apply(element.classList, className);\n      } else {\n        var len = 0;\n\n        while (className && className[len]) {\n          element.classList.remove(className[len]);\n          len++;\n        }\n      }\n    }\n  };\n} else {\n  var createClassNameRegExp = function createClassNameRegExp(className) {\n    return new RegExp('(\\\\s|^)' + className + '(\\\\s|$)');\n  };\n\n  _hasClass = function _hasClass(element, className) {\n    // http://snipplr.com/view/3561/addclass-removeclass-hasclass/\n    return element.className !== void 0 && createClassNameRegExp(className).test(element.className);\n  };\n\n  _addClass = function _addClass(element, className) {\n    var len = 0,\n        _className = element.className;\n\n    if (typeof className === 'string') {\n      className = className.split(' ');\n    }\n    if (_className === '') {\n      _className = className.join(' ');\n    } else {\n      while (className && className[len]) {\n        if (!createClassNameRegExp(className[len]).test(_className)) {\n          _className += ' ' + className[len];\n        }\n        len++;\n      }\n    }\n    element.className = _className;\n  };\n\n  _removeClass = function _removeClass(element, className) {\n    var len = 0,\n        _className = element.className;\n\n    if (typeof className === 'string') {\n      className = className.split(' ');\n    }\n    while (className && className[len]) {\n      // String.prototype.trim is defined in polyfill.js\n      _className = _className.replace(createClassNameRegExp(className[len]), ' ').trim();\n      len++;\n    }\n    if (element.className !== _className) {\n      element.className = _className;\n    }\n  };\n}\n\n/**\n * Checks if element has class name\n *\n * @param {HTMLElement} element\n * @param {String} className Class name to check\n * @returns {Boolean}\n */\nfunction hasClass(element, className) {\n  return _hasClass(element, className);\n}\n\n/**\n * Add class name to an element\n *\n * @param {HTMLElement} element\n * @param {String|Array} className Class name as string or array of strings\n */\nfunction addClass(element, className) {\n  return _addClass(element, className);\n}\n\n/**\n * Remove class name from an element\n *\n * @param {HTMLElement} element\n * @param {String|Array} className Class name as string or array of strings\n */\nfunction removeClass(element, className) {\n  return _removeClass(element, className);\n}\n\nfunction removeTextNodes(element, parent) {\n  if (element.nodeType === 3) {\n    parent.removeChild(element); // bye text nodes!\n  } else if (['TABLE', 'THEAD', 'TBODY', 'TFOOT', 'TR'].indexOf(element.nodeName) > -1) {\n    var childs = element.childNodes;\n    for (var i = childs.length - 1; i >= 0; i--) {\n      removeTextNodes(childs[i], element);\n    }\n  }\n}\n\n/**\n * Remove childs function\n * WARNING - this doesn't unload events and data attached by jQuery\n * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/9\n * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/11 - no siginificant improvement with Chrome remove() method\n *\n * @param element\n * @returns {void}\n */\n//\nfunction empty(element) {\n  var child;\n  /* eslint-disable no-cond-assign */\n  while (child = element.lastChild) {\n    element.removeChild(child);\n  }\n}\n\nvar HTML_CHARACTERS = exports.HTML_CHARACTERS = /(<(.*)>|&(.*);)/;\n\n/**\n * Insert content into element trying avoid innerHTML method.\n * @return {void}\n */\nfunction fastInnerHTML(element, content) {\n  if (HTML_CHARACTERS.test(content)) {\n    element.innerHTML = content;\n  } else {\n    fastInnerText(element, content);\n  }\n}\n\n/**\n * Insert text content into element\n * @return {void}\n */\n\nvar textContextSupport = !!document.createTextNode('test').textContent;\n\nfunction fastInnerText(element, content) {\n  var child = element.firstChild;\n\n  if (child && child.nodeType === 3 && child.nextSibling === null) {\n    // fast lane - replace existing text node\n\n    if (textContextSupport) {\n      // http://jsperf.com/replace-text-vs-reuse\n      child.textContent = content;\n    } else {\n      // http://jsperf.com/replace-text-vs-reuse\n      child.data = content;\n    }\n  } else {\n    // slow lane - empty element and insert a text node\n    empty(element);\n    element.appendChild(document.createTextNode(content));\n  }\n}\n\n/**\n * Returns true if element is attached to the DOM and visible, false otherwise\n * @param elem\n * @returns {boolean}\n */\nfunction isVisible(elem) {\n  var next = elem;\n\n  while (polymerUnwrap(next) !== document.documentElement) {\n    // until <html> reached\n    if (next === null) {\n      // parent detached from DOM\n      return false;\n    } else if (next.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      if (next.host) {\n        // this is Web Components Shadow DOM\n        // see: http://w3c.github.io/webcomponents/spec/shadow/#encapsulation\n        // according to spec, should be if (next.ownerDocument !== window.document), but that doesn't work yet\n        if (next.host.impl) {\n          // Chrome 33.0.1723.0 canary (2013-11-29) Web Platform features disabled\n          return isVisible(next.host.impl);\n        } else if (next.host) {\n          // Chrome 33.0.1723.0 canary (2013-11-29) Web Platform features enabled\n          return isVisible(next.host);\n        }\n        throw new Error('Lost in Web Components world');\n      } else {\n        return false; // this is a node detached from document in IE8\n      }\n    } else if (next.style.display === 'none') {\n      return false;\n    }\n    next = next.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * Returns elements top and left offset relative to the document. Function is not compatible with jQuery offset.\n *\n * @param {HTMLElement} elem\n * @return {Object} Returns object with `top` and `left` props\n */\nfunction offset(elem) {\n  var offsetLeft, offsetTop, lastElem, docElem, box;\n\n  docElem = document.documentElement;\n\n  if ((0, _feature.hasCaptionProblem)() && elem.firstChild && elem.firstChild.nodeName === 'CAPTION') {\n    // fixes problem with Firefox ignoring <caption> in TABLE offset (see also export outerHeight)\n    // http://jsperf.com/offset-vs-getboundingclientrect/8\n    box = elem.getBoundingClientRect();\n\n    return {\n      top: box.top + (window.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\n      left: box.left + (window.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\n    };\n  }\n  offsetLeft = elem.offsetLeft;\n  offsetTop = elem.offsetTop;\n  lastElem = elem;\n\n  /* eslint-disable no-cond-assign */\n  while (elem = elem.offsetParent) {\n    // from my observation, document.body always has scrollLeft/scrollTop == 0\n    if (elem === document.body) {\n      break;\n    }\n    offsetLeft += elem.offsetLeft;\n    offsetTop += elem.offsetTop;\n    lastElem = elem;\n  }\n\n  // slow - http://jsperf.com/offset-vs-getboundingclientrect/6\n  if (lastElem && lastElem.style.position === 'fixed') {\n    // if(lastElem !== document.body) { //faster but does gives false positive in Firefox\n    offsetLeft += window.pageXOffset || docElem.scrollLeft;\n    offsetTop += window.pageYOffset || docElem.scrollTop;\n  }\n\n  return {\n    left: offsetLeft,\n    top: offsetTop\n  };\n}\n\n/**\n * Returns the document's scrollTop property.\n *\n * @returns {Number}\n */\nfunction getWindowScrollTop() {\n  var res = window.scrollY;\n\n  if (res === void 0) {\n    // IE8-11\n    res = document.documentElement.scrollTop;\n  }\n\n  return res;\n}\n\n/**\n * Returns the document's scrollLeft property.\n *\n * @returns {Number}\n */\nfunction getWindowScrollLeft() {\n  var res = window.scrollX;\n\n  if (res === void 0) {\n    // IE8-11\n    res = document.documentElement.scrollLeft;\n  }\n\n  return res;\n}\n\n/**\n * Returns the provided element's scrollTop property.\n *\n * @param element\n * @returns {Number}\n */\nfunction getScrollTop(element) {\n  if (element === window) {\n    return getWindowScrollTop();\n  }\n  return element.scrollTop;\n}\n\n/**\n * Returns the provided element's scrollLeft property.\n *\n * @param element\n * @returns {Number}\n */\nfunction getScrollLeft(element) {\n  if (element === window) {\n    return getWindowScrollLeft();\n  }\n  return element.scrollLeft;\n}\n\n/**\n * Returns a DOM element responsible for scrolling of the provided element.\n *\n * @param {HTMLElement} element\n * @returns {HTMLElement} Element's scrollable parent\n */\nfunction getScrollableElement(element) {\n  var el = element.parentNode,\n      props = ['auto', 'scroll'],\n      overflow,\n      overflowX,\n      overflowY,\n      computedStyle = '',\n      computedOverflow = '',\n      computedOverflowY = '',\n      computedOverflowX = '';\n\n  while (el && el.style && document.body !== el) {\n    overflow = el.style.overflow;\n    overflowX = el.style.overflowX;\n    overflowY = el.style.overflowY;\n\n    if (overflow == 'scroll' || overflowX == 'scroll' || overflowY == 'scroll') {\n      return el;\n    } else if (window.getComputedStyle) {\n      computedStyle = window.getComputedStyle(el);\n      computedOverflow = computedStyle.getPropertyValue('overflow');\n      computedOverflowY = computedStyle.getPropertyValue('overflow-y');\n      computedOverflowX = computedStyle.getPropertyValue('overflow-x');\n\n      if (computedOverflow === 'scroll' || computedOverflowX === 'scroll' || computedOverflowY === 'scroll') {\n        return el;\n      }\n    }\n\n    // The '+ 1' after the scrollHeight/scrollWidth is to prevent problems with zoomed out Chrome.\n    if (el.clientHeight <= el.scrollHeight + 1 && (props.indexOf(overflowY) !== -1 || props.indexOf(overflow) !== -1 || props.indexOf(computedOverflow) !== -1 || props.indexOf(computedOverflowY) !== -1)) {\n      return el;\n    }\n    if (el.clientWidth <= el.scrollWidth + 1 && (props.indexOf(overflowX) !== -1 || props.indexOf(overflow) !== -1 || props.indexOf(computedOverflow) !== -1 || props.indexOf(computedOverflowX) !== -1)) {\n      return el;\n    }\n    el = el.parentNode;\n  }\n\n  return window;\n}\n\n/**\n * Returns a DOM element responsible for trimming the provided element.\n *\n * @param {HTMLElement} base Base element\n * @returns {HTMLElement} Base element's trimming parent\n */\nfunction getTrimmingContainer(base) {\n  var el = base.parentNode;\n\n  while (el && el.style && document.body !== el) {\n    if (el.style.overflow !== 'visible' && el.style.overflow !== '') {\n      return el;\n    } else if (window.getComputedStyle) {\n      var computedStyle = window.getComputedStyle(el);\n\n      if (computedStyle.getPropertyValue('overflow') !== 'visible' && computedStyle.getPropertyValue('overflow') !== '') {\n        return el;\n      }\n    }\n\n    el = el.parentNode;\n  }\n\n  return window;\n}\n\n/**\n * Returns a style property for the provided element. (Be it an inline or external style).\n *\n * @param {HTMLElement} element\n * @param {String} prop Wanted property\n * @returns {String|undefined} Element's style property\n */\nfunction getStyle(element, prop) {\n  /* eslint-disable */\n  if (!element) {\n    return;\n  } else if (element === window) {\n    if (prop === 'width') {\n      return window.innerWidth + 'px';\n    } else if (prop === 'height') {\n      return window.innerHeight + 'px';\n    }\n\n    return;\n  }\n\n  var styleProp = element.style[prop],\n      computedStyle;\n\n  if (styleProp !== '' && styleProp !== void 0) {\n    return styleProp;\n  } else {\n    computedStyle = getComputedStyle(element);\n\n    if (computedStyle[prop] !== '' && computedStyle[prop] !== void 0) {\n      return computedStyle[prop];\n    }\n  }\n}\n\n/**\n * Returns a computed style object for the provided element. (Needed if style is declared in external stylesheet).\n *\n * @param element\n * @returns {IEElementStyle|CssStyle} Elements computed style object\n */\nfunction getComputedStyle(element) {\n  return element.currentStyle || document.defaultView.getComputedStyle(element);\n}\n\n/**\n * Returns the element's outer width.\n *\n * @param element\n * @returns {number} Element's outer width\n */\nfunction outerWidth(element) {\n  return element.offsetWidth;\n}\n\n/**\n * Returns the element's outer height\n *\n * @param elem\n * @returns {number} Element's outer height\n */\nfunction outerHeight(elem) {\n  if ((0, _feature.hasCaptionProblem)() && elem.firstChild && elem.firstChild.nodeName === 'CAPTION') {\n    // fixes problem with Firefox ignoring <caption> in TABLE.offsetHeight\n    // jQuery (1.10.1) still has this unsolved\n    // may be better to just switch to getBoundingClientRect\n    // http://bililite.com/blog/2009/03/27/finding-the-size-of-a-table/\n    // http://lists.w3.org/Archives/Public/www-style/2009Oct/0089.html\n    // http://bugs.jquery.com/ticket/2196\n    // http://lists.w3.org/Archives/Public/www-style/2009Oct/0140.html#start140\n    return elem.offsetHeight + elem.firstChild.offsetHeight;\n  }\n\n  return elem.offsetHeight;\n}\n\n/**\n * Returns the element's inner height.\n *\n * @param element\n * @returns {number} Element's inner height\n */\nfunction innerHeight(element) {\n  return element.clientHeight || element.innerHeight;\n}\n\n/**\n * Returns the element's inner width.\n *\n * @param element\n * @returns {number} Element's inner width\n */\nfunction innerWidth(element) {\n  return element.clientWidth || element.innerWidth;\n}\n\nfunction addEvent(element, event, callback) {\n  if (window.addEventListener) {\n    element.addEventListener(event, callback, false);\n  } else {\n    element.attachEvent('on' + event, callback);\n  }\n}\n\nfunction removeEvent(element, event, callback) {\n  if (window.removeEventListener) {\n    element.removeEventListener(event, callback, false);\n  } else {\n    element.detachEvent('on' + event, callback);\n  }\n}\n\n/**\n * Returns caret position in text input\n *\n * @author http://stackoverflow.com/questions/263743/how-to-get-caret-position-in-textarea\n * @return {Number}\n */\nfunction getCaretPosition(el) {\n  if (el.selectionStart) {\n    return el.selectionStart;\n  } else if (document.selection) {\n    // IE8\n    el.focus();\n\n    var r = document.selection.createRange();\n\n    if (r == null) {\n      return 0;\n    }\n    var re = el.createTextRange();\n    var rc = re.duplicate();\n\n    re.moveToBookmark(r.getBookmark());\n    rc.setEndPoint('EndToStart', re);\n\n    return rc.text.length;\n  }\n\n  return 0;\n}\n\n/**\n * Returns end of the selection in text input\n *\n * @return {Number}\n */\nfunction getSelectionEndPosition(el) {\n  if (el.selectionEnd) {\n    return el.selectionEnd;\n  } else if (document.selection) {\n    // IE8\n    var r = document.selection.createRange();\n\n    if (r == null) {\n      return 0;\n    }\n    var re = el.createTextRange();\n\n    return re.text.indexOf(r.text) + r.text.length;\n  }\n\n  return 0;\n}\n\n/**\n * Returns text under selection.\n *\n * @returns {String}\n */\nfunction getSelectionText() {\n  var text = '';\n\n  if (window.getSelection) {\n    text = window.getSelection().toString();\n  } else if (document.selection && document.selection.type !== 'Control') {\n    text = document.selection.createRange().text;\n  }\n\n  return text;\n}\n\n/**\n * Sets caret position in text input.\n *\n * @author http://blog.vishalon.net/index.php/javascript-getting-and-setting-caret-position-in-textarea/\n * @param {Element} element\n * @param {Number} pos\n * @param {Number} endPos\n */\nfunction setCaretPosition(element, pos, endPos) {\n  if (endPos === void 0) {\n    endPos = pos;\n  }\n  if (element.setSelectionRange) {\n    element.focus();\n\n    try {\n      element.setSelectionRange(pos, endPos);\n    } catch (err) {\n      var elementParent = element.parentNode;\n      var parentDisplayValue = elementParent.style.display;\n      elementParent.style.display = 'block';\n      element.setSelectionRange(pos, endPos);\n      elementParent.style.display = parentDisplayValue;\n    }\n  } else if (element.createTextRange) {\n    // IE8\n    var range = element.createTextRange();\n    range.collapse(true);\n    range.moveEnd('character', endPos);\n    range.moveStart('character', pos);\n    range.select();\n  }\n}\n\nvar cachedScrollbarWidth;\n\n// http://stackoverflow.com/questions/986937/how-can-i-get-the-browsers-scrollbar-sizes\nfunction walkontableCalculateScrollbarWidth() {\n  var inner = document.createElement('div');\n  inner.style.height = '200px';\n  inner.style.width = '100%';\n\n  var outer = document.createElement('div');\n  outer.style.boxSizing = 'content-box';\n  outer.style.height = '150px';\n  outer.style.left = '0px';\n  outer.style.overflow = 'hidden';\n  outer.style.position = 'absolute';\n  outer.style.top = '0px';\n  outer.style.width = '200px';\n  outer.style.visibility = 'hidden';\n  outer.appendChild(inner);\n\n  (document.body || document.documentElement).appendChild(outer);\n  var w1 = inner.offsetWidth;\n  outer.style.overflow = 'scroll';\n  var w2 = inner.offsetWidth;\n  if (w1 == w2) {\n    w2 = outer.clientWidth;\n  }\n\n  (document.body || document.documentElement).removeChild(outer);\n\n  return w1 - w2;\n}\n\n/**\n * Returns the computed width of the native browser scroll bar.\n *\n * @return {Number} width\n */\nfunction getScrollbarWidth() {\n  if (cachedScrollbarWidth === void 0) {\n    cachedScrollbarWidth = walkontableCalculateScrollbarWidth();\n  }\n\n  return cachedScrollbarWidth;\n}\n\n/**\n * Checks if the provided element has a vertical scrollbar.\n *\n * @param {HTMLElement} element\n * @returns {Boolean}\n */\nfunction hasVerticalScrollbar(element) {\n  return element.offsetWidth !== element.clientWidth;\n}\n\n/**\n * Checks if the provided element has a vertical scrollbar.\n *\n * @param {HTMLElement} element\n * @returns {Boolean}\n */\nfunction hasHorizontalScrollbar(element) {\n  return element.offsetHeight !== element.clientHeight;\n}\n\n/**\n * Sets overlay position depending on it's type and used browser\n */\nfunction setOverlayPosition(overlayElem, left, top) {\n  if ((0, _browser.isIE8)() || (0, _browser.isIE9)()) {\n    overlayElem.style.top = top;\n    overlayElem.style.left = left;\n  } else if ((0, _browser.isSafari)()) {\n    overlayElem.style['-webkit-transform'] = 'translate3d(' + left + ',' + top + ',0)';\n  } else {\n    overlayElem.style.transform = 'translate3d(' + left + ',' + top + ',0)';\n  }\n}\n\nfunction getCssTransform(element) {\n  var transform;\n\n  if (element.style.transform && (transform = element.style.transform) !== '') {\n    return ['transform', transform];\n  } else if (element.style['-webkit-transform'] && (transform = element.style['-webkit-transform']) !== '') {\n\n    return ['-webkit-transform', transform];\n  }\n\n  return -1;\n}\n\nfunction resetCssTransform(element) {\n  if (element.style.transform && element.style.transform !== '') {\n    element.style.transform = '';\n  } else if (element.style['-webkit-transform'] && element.style['-webkit-transform'] !== '') {\n    element.style['-webkit-transform'] = '';\n  }\n}\n\n/**\n * Determines if the given DOM element is an input field.\n * Notice: By 'input' we mean input, textarea and select nodes\n *\n * @param {HTMLElement} element - DOM element\n * @returns {Boolean}\n */\nfunction isInput(element) {\n  var inputs = ['INPUT', 'SELECT', 'TEXTAREA'];\n\n  return element && (inputs.indexOf(element.nodeName) > -1 || element.contentEditable === 'true');\n}\n\n/**\n * Determines if the given DOM element is an input field placed OUTSIDE of HOT.\n * Notice: By 'input' we mean input, textarea and select nodes\n *\n * @param {HTMLElement} element - DOM element\n * @returns {Boolean}\n */\nfunction isOutsideInput(element) {\n  return isInput(element) && element.className.indexOf('handsontableInput') == -1 && element.className.indexOf('copyPaste') == -1;\n}\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.to2dArray = to2dArray;\nexports.extendArray = extendArray;\nexports.pivot = pivot;\nexports.arrayReduce = arrayReduce;\nexports.arrayFilter = arrayFilter;\nexports.arrayMap = arrayMap;\nexports.arrayEach = arrayEach;\nexports.arraySum = arraySum;\nexports.arrayMax = arrayMax;\nexports.arrayMin = arrayMin;\nexports.arrayAvg = arrayAvg;\nexports.arrayFlatten = arrayFlatten;\nexports.arrayUnique = arrayUnique;\nfunction to2dArray(arr) {\n  var i = 0,\n      ilen = arr.length;\n\n  while (i < ilen) {\n    arr[i] = [arr[i]];\n    i++;\n  }\n}\n\nfunction extendArray(arr, extension) {\n  var i = 0,\n      ilen = extension.length;\n\n  while (i < ilen) {\n    arr.push(extension[i]);\n    i++;\n  }\n}\n\nfunction pivot(arr) {\n  var pivotedArr = [];\n\n  if (!arr || arr.length === 0 || !arr[0] || arr[0].length === 0) {\n    return pivotedArr;\n  }\n\n  var rowCount = arr.length;\n  var colCount = arr[0].length;\n\n  for (var i = 0; i < rowCount; i++) {\n    for (var j = 0; j < colCount; j++) {\n      if (!pivotedArr[j]) {\n        pivotedArr[j] = [];\n      }\n\n      pivotedArr[j][i] = arr[i][j];\n    }\n  }\n\n  return pivotedArr;\n}\n\n/**\n * A specialized version of `.reduce` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * {@link https://github.com/lodash/lodash/blob/master/lodash.js}\n *\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {Boolean} [initFromArray] Specify using the first element of `array` as the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initFromArray) {\n  var index = -1;\n  var iterable = array;\n\n  if (!Array.isArray(array)) {\n    iterable = Array.from(array);\n  }\n  var length = iterable.length;\n\n  if (initFromArray && length) {\n    accumulator = iterable[++index];\n  }\n  while (++index < length) {\n    accumulator = iteratee(accumulator, iterable[index], index, iterable);\n  }\n\n  return accumulator;\n}\n\n/**\n * A specialized version of `.filter` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * {@link https://github.com/lodash/lodash/blob/master/lodash.js}\n *\n * @param {Array} array The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1;\n  var iterable = array;\n\n  if (!Array.isArray(array)) {\n    iterable = Array.from(array);\n  }\n\n  var length = iterable.length;\n  var result = [];\n  var resIndex = -1;\n\n  while (++index < length) {\n    var value = iterable[index];\n\n    if (predicate(value, index, iterable)) {\n      result[++resIndex] = value;\n    }\n  }\n\n  return result;\n}\n\n/**\n * A specialized version of `.map` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1;\n  var iterable = array;\n\n  if (!Array.isArray(array)) {\n    iterable = Array.from(array);\n  }\n\n  var length = iterable.length;\n  var result = [];\n  var resIndex = -1;\n\n  while (++index < length) {\n    var value = iterable[index];\n\n    result[++resIndex] = iteratee(value, index, iterable);\n  }\n\n  return result;\n}\n\n/**\n * A specialized version of `.forEach` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * {@link https://github.com/lodash/lodash/blob/master/lodash.js}\n *\n * @param {Array|*} array The array to iterate over or an any element with implemented iterator protocol.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1;\n  var iterable = array;\n\n  if (!Array.isArray(array)) {\n    iterable = Array.from(array);\n  }\n\n  var length = iterable.length;\n\n  while (++index < length) {\n    if (iteratee(iterable[index], index, iterable) === false) {\n      break;\n    }\n  }\n\n  return array;\n}\n\n/**\n * Calculate sum value for each item of the array.\n *\n * @param {Array} array The array to process.\n * @returns {Number} Returns calculated sum value.\n */\nfunction arraySum(array) {\n  return arrayReduce(array, function (a, b) {\n    return a + b;\n  }, 0);\n}\n\n/**\n * Returns the highest value from an array. Can be array of numbers or array of strings.\n * NOTICE: Mixed values is not supported.\n *\n * @param {Array} array The array to process.\n * @returns {Number} Returns the highest value from an array.\n */\nfunction arrayMax(array) {\n  return arrayReduce(array, function (a, b) {\n    return a > b ? a : b;\n  }, Array.isArray(array) ? array[0] : void 0);\n}\n\n/**\n * Returns the lowest value from an array. Can be array of numbers or array of strings.\n * NOTICE: Mixed values is not supported.\n *\n * @param {Array} array The array to process.\n * @returns {Number} Returns the lowest value from an array.\n */\nfunction arrayMin(array) {\n  return arrayReduce(array, function (a, b) {\n    return a < b ? a : b;\n  }, Array.isArray(array) ? array[0] : void 0);\n}\n\n/**\n * Calculate average value for each item of the array.\n *\n * @param {Array} array The array to process.\n * @returns {Number} Returns calculated average value.\n */\nfunction arrayAvg(array) {\n  if (!array.length) {\n    return 0;\n  }\n\n  return arraySum(array) / array.length;\n}\n\n/**\n * Flatten multidimensional array.\n *\n * @param {Array} array Array of Arrays\n * @returns {Array}\n */\nfunction arrayFlatten(array) {\n  return arrayReduce(array, function (initial, value) {\n    return initial.concat(Array.isArray(value) ? arrayFlatten(value) : value);\n  }, []);\n}\n\n/**\n * Unique values in the array.\n *\n * @param {Array} array The array to process.\n * @returns {Array}\n */\nfunction arrayUnique(array) {\n  var unique = [];\n\n  arrayEach(array, function (value) {\n    if (unique.indexOf(value) === -1) {\n      unique.push(value);\n    }\n  });\n\n  return unique;\n}\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.duckSchema = duckSchema;\nexports.inherit = inherit;\nexports.extend = extend;\nexports.deepExtend = deepExtend;\nexports.deepClone = deepClone;\nexports.clone = clone;\nexports.mixin = mixin;\nexports.isObjectEqual = isObjectEqual;\nexports.isObject = isObject;\nexports.defineGetter = defineGetter;\nexports.objectEach = objectEach;\nexports.getProperty = getProperty;\nexports.deepObjectSize = deepObjectSize;\nexports.createObjectPropListener = createObjectPropListener;\nexports.hasOwnProperty = hasOwnProperty;\n\nvar _array = __webpack_require__(1);\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/**\n * Generate schema for passed object.\n *\n * @param {Array|Object} object\n * @returns {Array|Object}\n */\nfunction duckSchema(object) {\n  var schema;\n\n  if (Array.isArray(object)) {\n    schema = [];\n  } else {\n    schema = {};\n\n    objectEach(object, function (value, key) {\n      if (key === '__children') {\n        return;\n      }\n\n      if (value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && !Array.isArray(value)) {\n        schema[key] = duckSchema(value);\n      } else if (Array.isArray(value)) {\n        if (value.length && _typeof(value[0]) === 'object' && !Array.isArray(value[0])) {\n          schema[key] = [duckSchema(value[0])];\n        } else {\n          schema[key] = [];\n        }\n      } else {\n        schema[key] = null;\n      }\n    });\n  }\n\n  return schema;\n}\n\n/**\n * Inherit without without calling parent constructor, and setting `Child.prototype.constructor` to `Child` instead of `Parent`.\n * Creates temporary dummy function to call it as constructor.\n * Described in ticket: https://github.com/handsontable/handsontable/pull/516\n *\n * @param  {Object} Child  child class\n * @param  {Object} Parent parent class\n * @return {Object}        extended Child\n */\nfunction inherit(Child, Parent) {\n  Parent.prototype.constructor = Parent;\n  Child.prototype = new Parent();\n  Child.prototype.constructor = Child;\n\n  return Child;\n}\n\n/**\n * Perform shallow extend of a target object with extension's own properties.\n *\n * @param {Object} target An object that will receive the new properties.\n * @param {Object} extension An object containing additional properties to merge into the target.\n */\nfunction extend(target, extension) {\n  objectEach(extension, function (value, key) {\n    target[key] = value;\n  });\n\n  return target;\n}\n\n/**\n * Perform deep extend of a target object with extension's own properties.\n *\n * @param {Object} target An object that will receive the new properties.\n * @param {Object} extension An object containing additional properties to merge into the target.\n */\nfunction deepExtend(target, extension) {\n  objectEach(extension, function (value, key) {\n    if (extension[key] && _typeof(extension[key]) === 'object') {\n      if (!target[key]) {\n        if (Array.isArray(extension[key])) {\n          target[key] = [];\n        } else if (Object.prototype.toString.call(extension[key]) === '[object Date]') {\n          target[key] = extension[key];\n        } else {\n          target[key] = {};\n        }\n      }\n      deepExtend(target[key], extension[key]);\n    } else {\n      target[key] = extension[key];\n    }\n  });\n}\n\n/**\n * Perform deep clone of an object.\n * WARNING! Only clones JSON properties. Will cause error when `obj` contains a function, Date, etc.\n *\n * @param {Object} obj An object that will be cloned\n * @return {Object}\n */\nfunction deepClone(obj) {\n  if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object') {\n    return JSON.parse(JSON.stringify(obj));\n  }\n\n  return obj;\n}\n\n/**\n * Shallow clone object.\n *\n * @param {Object} object\n * @returns {Object}\n */\nfunction clone(object) {\n  var result = {};\n\n  objectEach(object, function (value, key) {\n    result[key] = value;\n  });\n\n  return result;\n}\n\n/**\n * Extend the Base object (usually prototype) of the functionality the `mixins` objects.\n *\n * @param {Object} Base Base object which will be extended.\n * @param {Object} mixins The object of the functionality will be \"copied\".\n * @returns {Object}\n */\nfunction mixin(Base) {\n  if (!Base.MIXINS) {\n    Base.MIXINS = [];\n  }\n\n  for (var _len = arguments.length, mixins = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    mixins[_key - 1] = arguments[_key];\n  }\n\n  (0, _array.arrayEach)(mixins, function (mixin) {\n    Base.MIXINS.push(mixin.MIXIN_NAME);\n\n    objectEach(mixin, function (value, key) {\n      if (Base.prototype[key] !== void 0) {\n        throw new Error('Mixin conflict. Property \\'' + key + '\\' already exist and cannot be overwritten.');\n      }\n      if (typeof value === 'function') {\n        Base.prototype[key] = value;\n      } else {\n        var getter = function _getter(propertyName, initialValue) {\n          propertyName = '_' + propertyName;\n\n          var initValue = function initValue(value) {\n            if (Array.isArray(value) || isObject(value)) {\n              value = deepClone(value);\n            }\n\n            return value;\n          };\n\n          return function () {\n            if (this[propertyName] === void 0) {\n              this[propertyName] = initValue(initialValue);\n            }\n\n            return this[propertyName];\n          };\n        };\n        var setter = function _setter(propertyName) {\n          propertyName = '_' + propertyName;\n\n          return function (value) {\n            this[propertyName] = value;\n          };\n        };\n        Object.defineProperty(Base.prototype, key, {\n          get: getter(key, value),\n          set: setter(key),\n          configurable: true\n        });\n      }\n    });\n  });\n\n  return Base;\n}\n\n/**\n * Checks if two objects or arrays are (deep) equal\n *\n * @param {Object|Array} object1\n * @param {Object|Array} object2\n * @returns {Boolean}\n */\nfunction isObjectEqual(object1, object2) {\n  return JSON.stringify(object1) === JSON.stringify(object2);\n}\n\n/**\n * Determines whether given object is a plain Object.\n * Note: String and Array are not plain Objects\n * @param {*} obj\n * @returns {boolean}\n */\nfunction isObject(obj) {\n  return Object.prototype.toString.call(obj) == '[object Object]';\n}\n\nfunction defineGetter(object, property, value, options) {\n  options.value = value;\n  options.writable = options.writable !== false;\n  options.enumerable = options.enumerable !== false;\n  options.configurable = options.configurable !== false;\n\n  Object.defineProperty(object, property, options);\n}\n\n/**\n * A specialized version of `.forEach` for objects.\n *\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction objectEach(object, iteratee) {\n  for (var key in object) {\n    if (!object.hasOwnProperty || object.hasOwnProperty && Object.prototype.hasOwnProperty.call(object, key)) {\n      if (iteratee(object[key], key, object) === false) {\n        break;\n      }\n    }\n  }\n\n  return object;\n}\n\n/**\n * Get object property by its name. Access to sub properties can be achieved by dot notation (e.q. `'foo.bar.baz'`).\n *\n * @param {Object} object Object which value will be exported.\n * @param {String} name Object property name.\n * @returns {*}\n */\nfunction getProperty(object, name) {\n  var names = name.split('.');\n  var result = object;\n\n  objectEach(names, function (name) {\n    result = result[name];\n\n    if (result === void 0) {\n      result = void 0;\n\n      return false;\n    }\n  });\n\n  return result;\n}\n\n/**\n * Return object length (recursively).\n *\n * @param {*} object Object for which we want get length.\n * @returns {Number}\n */\nfunction deepObjectSize(object) {\n  if (!isObject(object)) {\n    return 0;\n  }\n  var recursObjLen = function recursObjLen(obj) {\n    var result = 0;\n\n    if (isObject(obj)) {\n      objectEach(obj, function (key) {\n        result += recursObjLen(key);\n      });\n    } else {\n      result++;\n    }\n\n    return result;\n  };\n\n  return recursObjLen(object);\n}\n\n/**\n * Create object with property where its value change will be observed.\n *\n * @param {*} [defaultValue=undefined] Default value.\n * @param {String} [propertyToListen='value'] Property to listen.\n * @returns {Object}\n */\nfunction createObjectPropListener(defaultValue) {\n  var _holder;\n\n  var propertyToListen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'value';\n\n  var privateProperty = '_' + propertyToListen;\n  var holder = (_holder = {\n    _touched: false\n  }, _defineProperty(_holder, privateProperty, defaultValue), _defineProperty(_holder, 'isTouched', function isTouched() {\n    return this._touched;\n  }), _holder);\n\n  Object.defineProperty(holder, propertyToListen, {\n    get: function get() {\n      return this[privateProperty];\n    },\n    set: function set(value) {\n      this._touched = true;\n      this[privateProperty] = value;\n    },\n\n    enumerable: true,\n    configurable: true\n  });\n\n  return holder;\n}\n\n/**\n * Check if at specified `key` there is any value for `object`.\n *\n * @param {Object} object Object to search value at specyfic key.\n * @param {String} key String key to check.\n */\nfunction hasOwnProperty(object, key) {\n  return Object.prototype.hasOwnProperty.call(object, key);\n}\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar core = __webpack_require__(45);\nvar hide = __webpack_require__(31);\nvar redefine = __webpack_require__(30);\nvar ctx = __webpack_require__(32);\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n  var IS_FORCED = type & $export.F;\n  var IS_GLOBAL = type & $export.G;\n  var IS_STATIC = type & $export.S;\n  var IS_PROTO = type & $export.P;\n  var IS_BIND = type & $export.B;\n  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n  var key, own, out, exp;\n  if (IS_GLOBAL) source = name;\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    // export native or passed\n    out = (own ? target : source)[key];\n    // bind timers to global for call from export context\n    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // extend global\n    if (target) redefine(target, key, out, type & $export.U);\n    // export\n    if (exports[key] != out) hide(exports, key, exp);\n    if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n  }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1;   // forced\n$export.G = 2;   // global\n$export.S = 4;   // static\n$export.P = 8;   // proto\n$export.B = 16;  // bind\n$export.W = 32;  // wrap\n$export.U = 64;  // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.Viewport = exports.TableRenderer = exports.Table = exports.Settings = exports.Selection = exports.Scroll = exports.Overlays = exports.Event = exports.Core = exports.default = exports.Border = exports.TopLeftCornerOverlay = exports.TopOverlay = exports.LeftOverlay = exports.DebugOverlay = exports.RowFilter = exports.ColumnFilter = exports.CellRange = exports.CellCoords = exports.ViewportRowsCalculator = exports.ViewportColumnsCalculator = undefined;\n\n__webpack_require__(96);\n\n__webpack_require__(111);\n\n__webpack_require__(112);\n\n__webpack_require__(116);\n\n__webpack_require__(117);\n\n__webpack_require__(119);\n\n__webpack_require__(122);\n\n__webpack_require__(123);\n\n__webpack_require__(124);\n\n__webpack_require__(125);\n\n__webpack_require__(126);\n\n__webpack_require__(127);\n\n__webpack_require__(128);\n\n__webpack_require__(129);\n\n__webpack_require__(130);\n\n__webpack_require__(131);\n\n__webpack_require__(132);\n\n__webpack_require__(133);\n\n__webpack_require__(134);\n\n__webpack_require__(135);\n\n__webpack_require__(136);\n\n__webpack_require__(137);\n\n__webpack_require__(138);\n\n__webpack_require__(139);\n\n__webpack_require__(141);\n\n__webpack_require__(143);\n\n__webpack_require__(144);\n\n__webpack_require__(145);\n\n__webpack_require__(146);\n\n__webpack_require__(147);\n\n__webpack_require__(148);\n\n__webpack_require__(149);\n\n__webpack_require__(150);\n\n__webpack_require__(151);\n\n__webpack_require__(152);\n\n__webpack_require__(153);\n\n__webpack_require__(154);\n\n__webpack_require__(155);\n\n__webpack_require__(85);\n\n__webpack_require__(156);\n\n__webpack_require__(157);\n\n__webpack_require__(159);\n\n__webpack_require__(160);\n\n__webpack_require__(161);\n\n__webpack_require__(162);\n\n__webpack_require__(163);\n\n__webpack_require__(164);\n\n__webpack_require__(165);\n\n__webpack_require__(167);\n\n__webpack_require__(168);\n\n__webpack_require__(169);\n\n__webpack_require__(172);\n\n__webpack_require__(173);\n\n__webpack_require__(174);\n\nvar _viewportColumns = __webpack_require__(175);\n\nvar _viewportColumns2 = _interopRequireDefault(_viewportColumns);\n\nvar _viewportRows = __webpack_require__(176);\n\nvar _viewportRows2 = _interopRequireDefault(_viewportRows);\n\nvar _coords = __webpack_require__(55);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nvar _range = __webpack_require__(86);\n\nvar _range2 = _interopRequireDefault(_range);\n\nvar _column = __webpack_require__(177);\n\nvar _column2 = _interopRequireDefault(_column);\n\nvar _row = __webpack_require__(178);\n\nvar _row2 = _interopRequireDefault(_row);\n\nvar _debug = __webpack_require__(348);\n\nvar _debug2 = _interopRequireDefault(_debug);\n\nvar _left = __webpack_require__(351);\n\nvar _left2 = _interopRequireDefault(_left);\n\nvar _top = __webpack_require__(352);\n\nvar _top2 = _interopRequireDefault(_top);\n\nvar _topLeftCorner = __webpack_require__(353);\n\nvar _topLeftCorner2 = _interopRequireDefault(_topLeftCorner);\n\nvar _border = __webpack_require__(306);\n\nvar _border2 = _interopRequireDefault(_border);\n\nvar _core = __webpack_require__(179);\n\nvar _core2 = _interopRequireDefault(_core);\n\nvar _event = __webpack_require__(299);\n\nvar _event2 = _interopRequireDefault(_event);\n\nvar _overlays = __webpack_require__(300);\n\nvar _overlays2 = _interopRequireDefault(_overlays);\n\nvar _scroll = __webpack_require__(301);\n\nvar _scroll2 = _interopRequireDefault(_scroll);\n\nvar _selection = __webpack_require__(354);\n\nvar _selection2 = _interopRequireDefault(_selection);\n\nvar _settings = __webpack_require__(302);\n\nvar _settings2 = _interopRequireDefault(_settings);\n\nvar _table = __webpack_require__(303);\n\nvar _table2 = _interopRequireDefault(_table);\n\nvar _tableRenderer = __webpack_require__(304);\n\nvar _tableRenderer2 = _interopRequireDefault(_tableRenderer);\n\nvar _viewport = __webpack_require__(305);\n\nvar _viewport2 = _interopRequireDefault(_viewport);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.ViewportColumnsCalculator = _viewportColumns2.default;\nexports.ViewportRowsCalculator = _viewportRows2.default;\nexports.CellCoords = _coords2.default;\nexports.CellRange = _range2.default;\nexports.ColumnFilter = _column2.default;\nexports.RowFilter = _row2.default;\nexports.DebugOverlay = _debug2.default;\nexports.LeftOverlay = _left2.default;\nexports.TopOverlay = _top2.default;\nexports.TopLeftCornerOverlay = _topLeftCorner2.default;\nexports.Border = _border2.default;\nexports.default = _core2.default;\nexports.Core = _core2.default;\nexports.Event = _event2.default;\nexports.Overlays = _overlays2.default;\nexports.Scroll = _scroll2.default;\nexports.Selection = _selection2.default;\nexports.Settings = _settings2.default;\nexports.Table = _table2.default;\nexports.TableRenderer = _tableRenderer2.default;\nexports.Viewport = _viewport2.default;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.isNumeric = isNumeric;\nexports.rangeEach = rangeEach;\nexports.rangeEachReverse = rangeEachReverse;\nexports.valueAccordingPercent = valueAccordingPercent;\n/**\n * Checks if value of n is a numeric one\n * http://jsperf.com/isnan-vs-isnumeric/4\n * @param n\n * @returns {boolean}\n */\nfunction isNumeric(n) {\n  /* eslint-disable */\n  var t = typeof n === 'undefined' ? 'undefined' : _typeof(n);\n\n  return t == 'number' ? !isNaN(n) && isFinite(n) : t == 'string' ? !n.length ? false : n.length == 1 ? /\\d/.test(n) : /^\\s*[+-]?\\s*(?:(?:\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)|(?:0x[a-f\\d]+))\\s*$/i.test(n) : t == 'object' ? !!n && typeof n.valueOf() == 'number' && !(n instanceof Date) : false;\n}\n\n/**\n * A specialized version of `.forEach` defined by ranges.\n *\n * @param {Number} rangeFrom The number from start iterate.\n * @param {Number|Function} rangeTo The number where finish iterate or function as a iteratee.\n * @param {Function} [iteratee] The function invoked per iteration.\n */\nfunction rangeEach(rangeFrom, rangeTo, iteratee) {\n  var index = -1;\n\n  if (typeof rangeTo === 'function') {\n    iteratee = rangeTo;\n    rangeTo = rangeFrom;\n  } else {\n    index = rangeFrom - 1;\n  }\n  while (++index <= rangeTo) {\n    if (iteratee(index) === false) {\n      break;\n    }\n  }\n}\n\n/**\n * A specialized version of `.forEach` defined by ranges iterable in reverse order.\n *\n * @param {Number} rangeFrom The number from start iterate.\n * @param {Number|Function} rangeTo The number where finish iterate or function as a iteratee.\n * @param {Function} [iteratee] The function invoked per iteration.\n */\nfunction rangeEachReverse(rangeFrom, rangeTo, iteratee) {\n  var index = rangeFrom + 1;\n\n  if (typeof rangeTo === 'function') {\n    iteratee = rangeTo;\n    rangeTo = 0;\n  }\n  while (--index >= rangeTo) {\n    if (iteratee(index) === false) {\n      break;\n    }\n  }\n}\n\n/**\n * Calculate value from percent.\n *\n * @param {Number} value Base value from percent will be calculated.\n * @param {String|Number} percent Can be Number or String (eq. `'33%'`).\n * @returns {Number}\n */\nfunction valueAccordingPercent(value, percent) {\n  percent = parseInt(percent.toString().replace('%', ''), 10);\n  percent = parseInt(value * percent / 100, 10);\n\n  return percent;\n}\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.getListenersCounter = getListenersCounter;\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _feature = __webpack_require__(40);\n\nvar _event = __webpack_require__(12);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Counter which tracks unregistered listeners (useful for detecting memory leaks).\n *\n * @type {Number}\n */\nvar listenersCounter = 0;\n\n/**\n * Event DOM manager for internal use in Handsontable.\n *\n * @class EventManager\n * @util\n */\n\nvar EventManager = function () {\n  /**\n   * @param {Object} [context=null]\n   * @private\n   */\n  function EventManager() {\n    var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n    _classCallCheck(this, EventManager);\n\n    this.context = context || this;\n\n    if (!this.context.eventListeners) {\n      this.context.eventListeners = [];\n    }\n  }\n\n  /**\n   * Register specified listener (`eventName`) to the element.\n   *\n   * @param {Element} element Target element.\n   * @param {String} eventName Event name.\n   * @param {Function} callback Function which will be called after event occur.\n   * @returns {Function} Returns function which you can easily call to remove that event\n   */\n\n\n  _createClass(EventManager, [{\n    key: 'addEventListener',\n    value: function addEventListener(element, eventName, callback) {\n      var _this = this;\n\n      var context = this.context;\n\n      function callbackProxy(event) {\n        event = extendEvent(context, event);\n\n        callback.call(this, event);\n      }\n      this.context.eventListeners.push({\n        element: element,\n        event: eventName,\n        callback: callback,\n        callbackProxy: callbackProxy\n      });\n\n      if (window.addEventListener) {\n        element.addEventListener(eventName, callbackProxy, false);\n      } else {\n        element.attachEvent('on' + eventName, callbackProxy);\n      }\n      listenersCounter++;\n\n      return function () {\n        _this.removeEventListener(element, eventName, callback);\n      };\n    }\n\n    /**\n     * Remove the event listener previously registered.\n     *\n     * @param {Element} element Target element.\n     * @param {String} eventName Event name.\n     * @param {Function} callback Function to remove from the event target. It must be the same as during registration listener.\n     */\n\n  }, {\n    key: 'removeEventListener',\n    value: function removeEventListener(element, eventName, callback) {\n      var len = this.context.eventListeners.length;\n      var tmpEvent = void 0;\n\n      while (len--) {\n        tmpEvent = this.context.eventListeners[len];\n\n        if (tmpEvent.event == eventName && tmpEvent.element == element) {\n          if (callback && callback != tmpEvent.callback) {\n            /* eslint-disable no-continue */\n            continue;\n          }\n          this.context.eventListeners.splice(len, 1);\n\n          if (tmpEvent.element.removeEventListener) {\n            tmpEvent.element.removeEventListener(tmpEvent.event, tmpEvent.callbackProxy, false);\n          } else {\n            tmpEvent.element.detachEvent('on' + tmpEvent.event, tmpEvent.callbackProxy);\n          }\n          listenersCounter--;\n        }\n      }\n    }\n\n    /**\n     * Clear all previously registered events.\n     *\n     * @private\n     * @since 0.15.0-beta3\n     */\n\n  }, {\n    key: 'clearEvents',\n    value: function clearEvents() {\n      if (!this.context) {\n        return;\n      }\n      var len = this.context.eventListeners.length;\n\n      while (len--) {\n        var event = this.context.eventListeners[len];\n\n        if (event) {\n          this.removeEventListener(event.element, event.event, event.callback);\n        }\n      }\n    }\n\n    /**\n     * Clear all previously registered events.\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.clearEvents();\n    }\n\n    /**\n     * Destroy instance of EventManager.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.clearEvents();\n      this.context = null;\n    }\n\n    /**\n     * Trigger event at the specified target element.\n     *\n     * @param {Element} element Target element.\n     * @param {String} eventName Event name.\n     */\n\n  }, {\n    key: 'fireEvent',\n    value: function fireEvent(element, eventName) {\n      var options = {\n        bubbles: true,\n        cancelable: eventName !== 'mousemove',\n        view: window,\n        detail: 0,\n        screenX: 0,\n        screenY: 0,\n        clientX: 1,\n        clientY: 1,\n        ctrlKey: false,\n        altKey: false,\n        shiftKey: false,\n        metaKey: false,\n        button: 0,\n        relatedTarget: undefined\n      };\n      var event;\n\n      if (document.createEvent) {\n        event = document.createEvent('MouseEvents');\n        event.initMouseEvent(eventName, options.bubbles, options.cancelable, options.view, options.detail, options.screenX, options.screenY, options.clientX, options.clientY, options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, options.relatedTarget || document.body.parentNode);\n      } else {\n        event = document.createEventObject();\n      }\n\n      if (element.dispatchEvent) {\n        element.dispatchEvent(event);\n      } else {\n        element.fireEvent('on' + eventName, event);\n      }\n    }\n  }]);\n\n  return EventManager;\n}();\n\n/**\n * @param {Object} context\n * @param {Event} event\n * @private\n * @returns {*}\n */\n\n\nfunction extendEvent(context, event) {\n  var componentName = 'HOT-TABLE';\n  var isHotTableSpotted = void 0;\n  var fromElement = void 0;\n  var realTarget = void 0;\n  var target = void 0;\n  var len = void 0;\n  var nativeStopImmediatePropagation = void 0;\n\n  event.isTargetWebComponent = false;\n  event.realTarget = event.target;\n\n  nativeStopImmediatePropagation = event.stopImmediatePropagation;\n  event.stopImmediatePropagation = function () {\n    nativeStopImmediatePropagation.apply(this);\n    (0, _event.stopImmediatePropagation)(this);\n  };\n\n  if (!EventManager.isHotTableEnv) {\n    return event;\n  }\n  event = (0, _element.polymerWrap)(event);\n  len = event.path ? event.path.length : 0;\n\n  while (len--) {\n    if (event.path[len].nodeName === componentName) {\n      isHotTableSpotted = true;\n    } else if (isHotTableSpotted && event.path[len].shadowRoot) {\n      target = event.path[len];\n\n      break;\n    }\n    if (len === 0 && !target) {\n      target = event.path[len];\n    }\n  }\n  if (!target) {\n    target = event.target;\n  }\n  event.isTargetWebComponent = true;\n\n  if ((0, _feature.isWebComponentSupportedNatively)()) {\n    event.realTarget = event.srcElement || event.toElement;\n  } else if ((0, _object.hasOwnProperty)(context, 'hot') || context.isHotTableEnv || context.wtTable) {\n    // Polymer doesn't support `event.target` property properly we must emulate it ourselves\n    if ((0, _object.hasOwnProperty)(context, 'hot')) {\n      // Custom element\n      fromElement = context.hot ? context.hot.view.wt.wtTable.TABLE : null;\n    } else if (context.isHotTableEnv) {\n      // Handsontable.Core\n      fromElement = context.view.activeWt.wtTable.TABLE.parentNode.parentNode;\n    } else if (context.wtTable) {\n      // Walkontable\n      fromElement = context.wtTable.TABLE.parentNode.parentNode;\n    }\n    realTarget = (0, _element.closest)(event.target, [componentName], fromElement);\n\n    if (realTarget) {\n      event.realTarget = fromElement.querySelector(componentName) || event.target;\n    } else {\n      event.realTarget = event.target;\n    }\n  }\n\n  Object.defineProperty(event, 'target', {\n    get: function get() {\n      return (0, _element.polymerWrap)(target);\n    },\n\n    enumerable: true,\n    configurable: true\n  });\n\n  return event;\n}\n\nexports.default = EventManager;\nfunction getListenersCounter() {\n  return listenersCounter;\n};\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n/**\n * Constants for parts of translation.\n */\n\nvar CONTEXT_MENU_ITEMS_NAMESPACE = exports.CONTEXT_MENU_ITEMS_NAMESPACE = 'ContextMenu:items';\nvar CONTEXTMENU_ITEMS_ROW_ABOVE = exports.CONTEXTMENU_ITEMS_ROW_ABOVE = CONTEXT_MENU_ITEMS_NAMESPACE + '.insertRowAbove';\nvar CONTEXTMENU_ITEMS_ROW_BELOW = exports.CONTEXTMENU_ITEMS_ROW_BELOW = CONTEXT_MENU_ITEMS_NAMESPACE + '.insertRowBelow';\nvar CONTEXTMENU_ITEMS_INSERT_LEFT = exports.CONTEXTMENU_ITEMS_INSERT_LEFT = CONTEXT_MENU_ITEMS_NAMESPACE + '.insertColumnOnTheLeft';\nvar CONTEXTMENU_ITEMS_INSERT_RIGHT = exports.CONTEXTMENU_ITEMS_INSERT_RIGHT = CONTEXT_MENU_ITEMS_NAMESPACE + '.insertColumnOnTheRight';\nvar CONTEXTMENU_ITEMS_REMOVE_ROW = exports.CONTEXTMENU_ITEMS_REMOVE_ROW = CONTEXT_MENU_ITEMS_NAMESPACE + '.removeRow';\nvar CONTEXTMENU_ITEMS_REMOVE_COLUMN = exports.CONTEXTMENU_ITEMS_REMOVE_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.removeColumn';\nvar CONTEXTMENU_ITEMS_UNDO = exports.CONTEXTMENU_ITEMS_UNDO = CONTEXT_MENU_ITEMS_NAMESPACE + '.undo';\nvar CONTEXTMENU_ITEMS_REDO = exports.CONTEXTMENU_ITEMS_REDO = CONTEXT_MENU_ITEMS_NAMESPACE + '.redo';\nvar CONTEXTMENU_ITEMS_READ_ONLY = exports.CONTEXTMENU_ITEMS_READ_ONLY = CONTEXT_MENU_ITEMS_NAMESPACE + '.readOnly';\nvar CONTEXTMENU_ITEMS_CLEAR_COLUMN = exports.CONTEXTMENU_ITEMS_CLEAR_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.clearColumn';\n\nvar CONTEXTMENU_ITEMS_COPY = exports.CONTEXTMENU_ITEMS_COPY = CONTEXT_MENU_ITEMS_NAMESPACE + '.copy';\nvar CONTEXTMENU_ITEMS_CUT = exports.CONTEXTMENU_ITEMS_CUT = CONTEXT_MENU_ITEMS_NAMESPACE + '.cut';\n\nvar CONTEXTMENU_ITEMS_FREEZE_COLUMN = exports.CONTEXTMENU_ITEMS_FREEZE_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.freezeColumn';\nvar CONTEXTMENU_ITEMS_UNFREEZE_COLUMN = exports.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.unfreezeColumn';\n\nvar CONTEXTMENU_ITEMS_MERGE_CELLS = exports.CONTEXTMENU_ITEMS_MERGE_CELLS = CONTEXT_MENU_ITEMS_NAMESPACE + '.mergeCells';\nvar CONTEXTMENU_ITEMS_UNMERGE_CELLS = exports.CONTEXTMENU_ITEMS_UNMERGE_CELLS = CONTEXT_MENU_ITEMS_NAMESPACE + '.unmergeCells';\n\nvar CONTEXTMENU_ITEMS_ADD_COMMENT = exports.CONTEXTMENU_ITEMS_ADD_COMMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.addComment';\nvar CONTEXTMENU_ITEMS_EDIT_COMMENT = exports.CONTEXTMENU_ITEMS_EDIT_COMMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.editComment';\nvar CONTEXTMENU_ITEMS_REMOVE_COMMENT = exports.CONTEXTMENU_ITEMS_REMOVE_COMMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.removeComment';\nvar CONTEXTMENU_ITEMS_READ_ONLY_COMMENT = exports.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.readOnlyComment';\n\nvar CONTEXTMENU_ITEMS_ALIGNMENT = exports.CONTEXTMENU_ITEMS_ALIGNMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.align';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_LEFT = exports.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.left';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_CENTER = exports.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.center';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT = exports.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.right';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY = exports.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.justify';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_TOP = exports.CONTEXTMENU_ITEMS_ALIGNMENT_TOP = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.top';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE = exports.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.middle';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM = exports.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.bottom';\n\nvar CONTEXTMENU_ITEMS_BORDERS = exports.CONTEXTMENU_ITEMS_BORDERS = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders';\nvar CONTEXTMENU_ITEMS_BORDERS_TOP = exports.CONTEXTMENU_ITEMS_BORDERS_TOP = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.top';\nvar CONTEXTMENU_ITEMS_BORDERS_RIGHT = exports.CONTEXTMENU_ITEMS_BORDERS_RIGHT = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.right';\nvar CONTEXTMENU_ITEMS_BORDERS_BOTTOM = exports.CONTEXTMENU_ITEMS_BORDERS_BOTTOM = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.bottom';\nvar CONTEXTMENU_ITEMS_BORDERS_LEFT = exports.CONTEXTMENU_ITEMS_BORDERS_LEFT = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.left';\nvar CONTEXTMENU_ITEMS_REMOVE_BORDERS = exports.CONTEXTMENU_ITEMS_REMOVE_BORDERS = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.remove';\n\nvar CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD = exports.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD = CONTEXT_MENU_ITEMS_NAMESPACE + '.nestedHeaders.insertChildRow';\nvar CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD = exports.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD = CONTEXT_MENU_ITEMS_NAMESPACE + '.nestedHeaders.detachFromParent';\n\nvar CONTEXTMENU_ITEMS_HIDE_COLUMN = exports.CONTEXTMENU_ITEMS_HIDE_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.hideColumn';\nvar CONTEXTMENU_ITEMS_SHOW_COLUMN = exports.CONTEXTMENU_ITEMS_SHOW_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.showColumn';\n\nvar CONTEXTMENU_ITEMS_HIDE_ROW = exports.CONTEXTMENU_ITEMS_HIDE_ROW = CONTEXT_MENU_ITEMS_NAMESPACE + '.hideRow';\nvar CONTEXTMENU_ITEMS_SHOW_ROW = exports.CONTEXTMENU_ITEMS_SHOW_ROW = CONTEXT_MENU_ITEMS_NAMESPACE + '.showRow';\n\nvar FILTERS_NAMESPACE = exports.FILTERS_NAMESPACE = 'Filters:';\nvar FILTERS_CONDITIONS_NAMESPACE = exports.FILTERS_CONDITIONS_NAMESPACE = FILTERS_NAMESPACE + 'conditions';\nvar FILTERS_CONDITIONS_NONE = exports.FILTERS_CONDITIONS_NONE = FILTERS_CONDITIONS_NAMESPACE + '.none';\nvar FILTERS_CONDITIONS_EMPTY = exports.FILTERS_CONDITIONS_EMPTY = FILTERS_CONDITIONS_NAMESPACE + '.isEmpty';\nvar FILTERS_CONDITIONS_NOT_EMPTY = exports.FILTERS_CONDITIONS_NOT_EMPTY = FILTERS_CONDITIONS_NAMESPACE + '.isNotEmpty';\nvar FILTERS_CONDITIONS_EQUAL = exports.FILTERS_CONDITIONS_EQUAL = FILTERS_CONDITIONS_NAMESPACE + '.isEqualTo';\nvar FILTERS_CONDITIONS_NOT_EQUAL = exports.FILTERS_CONDITIONS_NOT_EQUAL = FILTERS_CONDITIONS_NAMESPACE + '.isNotEqualTo';\nvar FILTERS_CONDITIONS_BEGINS_WITH = exports.FILTERS_CONDITIONS_BEGINS_WITH = FILTERS_CONDITIONS_NAMESPACE + '.beginsWith';\nvar FILTERS_CONDITIONS_ENDS_WITH = exports.FILTERS_CONDITIONS_ENDS_WITH = FILTERS_CONDITIONS_NAMESPACE + '.endsWith';\nvar FILTERS_CONDITIONS_CONTAINS = exports.FILTERS_CONDITIONS_CONTAINS = FILTERS_CONDITIONS_NAMESPACE + '.contains';\nvar FILTERS_CONDITIONS_NOT_CONTAIN = exports.FILTERS_CONDITIONS_NOT_CONTAIN = FILTERS_CONDITIONS_NAMESPACE + '.doesNotContain';\nvar FILTERS_CONDITIONS_BY_VALUE = exports.FILTERS_CONDITIONS_BY_VALUE = FILTERS_CONDITIONS_NAMESPACE + '.byValue';\nvar FILTERS_CONDITIONS_GREATER_THAN = exports.FILTERS_CONDITIONS_GREATER_THAN = FILTERS_CONDITIONS_NAMESPACE + '.greaterThan';\nvar FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL = exports.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL = FILTERS_CONDITIONS_NAMESPACE + '.greaterThanOrEqualTo';\nvar FILTERS_CONDITIONS_LESS_THAN = exports.FILTERS_CONDITIONS_LESS_THAN = FILTERS_CONDITIONS_NAMESPACE + '.lessThan';\nvar FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL = exports.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL = FILTERS_CONDITIONS_NAMESPACE + '.lessThanOrEqualTo';\nvar FILTERS_CONDITIONS_BETWEEN = exports.FILTERS_CONDITIONS_BETWEEN = FILTERS_CONDITIONS_NAMESPACE + '.isBetween';\nvar FILTERS_CONDITIONS_NOT_BETWEEN = exports.FILTERS_CONDITIONS_NOT_BETWEEN = FILTERS_CONDITIONS_NAMESPACE + '.isNotBetween';\nvar FILTERS_CONDITIONS_AFTER = exports.FILTERS_CONDITIONS_AFTER = FILTERS_CONDITIONS_NAMESPACE + '.after';\nvar FILTERS_CONDITIONS_BEFORE = exports.FILTERS_CONDITIONS_BEFORE = FILTERS_CONDITIONS_NAMESPACE + '.before';\nvar FILTERS_CONDITIONS_TODAY = exports.FILTERS_CONDITIONS_TODAY = FILTERS_CONDITIONS_NAMESPACE + '.today';\nvar FILTERS_CONDITIONS_TOMORROW = exports.FILTERS_CONDITIONS_TOMORROW = FILTERS_CONDITIONS_NAMESPACE + '.tomorrow';\nvar FILTERS_CONDITIONS_YESTERDAY = exports.FILTERS_CONDITIONS_YESTERDAY = FILTERS_CONDITIONS_NAMESPACE + '.yesterday';\n\nvar FILTERS_DIVS_FILTER_BY_CONDITION = exports.FILTERS_DIVS_FILTER_BY_CONDITION = FILTERS_NAMESPACE + 'labels.filterByCondition';\nvar FILTERS_DIVS_FILTER_BY_VALUE = exports.FILTERS_DIVS_FILTER_BY_VALUE = FILTERS_NAMESPACE + 'labels.filterByValue';\n\nvar FILTERS_LABELS_CONJUNCTION = exports.FILTERS_LABELS_CONJUNCTION = FILTERS_NAMESPACE + 'labels.conjunction';\nvar FILTERS_LABELS_DISJUNCTION = exports.FILTERS_LABELS_DISJUNCTION = FILTERS_NAMESPACE + 'labels.disjunction';\n\nvar FILTERS_VALUES_BLANK_CELLS = exports.FILTERS_VALUES_BLANK_CELLS = FILTERS_NAMESPACE + 'values.blankCells';\n\nvar FILTERS_BUTTONS_SELECT_ALL = exports.FILTERS_BUTTONS_SELECT_ALL = FILTERS_NAMESPACE + 'buttons.selectAll';\nvar FILTERS_BUTTONS_CLEAR = exports.FILTERS_BUTTONS_CLEAR = FILTERS_NAMESPACE + 'buttons.clear';\nvar FILTERS_BUTTONS_OK = exports.FILTERS_BUTTONS_OK = FILTERS_NAMESPACE + 'buttons.ok';\nvar FILTERS_BUTTONS_CANCEL = exports.FILTERS_BUTTONS_CANCEL = FILTERS_NAMESPACE + 'buttons.cancel';\n\nvar FILTERS_BUTTONS_PLACEHOLDER_SEARCH = exports.FILTERS_BUTTONS_PLACEHOLDER_SEARCH = FILTERS_NAMESPACE + 'buttons.placeholder.search';\nvar FILTERS_BUTTONS_PLACEHOLDER_VALUE = exports.FILTERS_BUTTONS_PLACEHOLDER_VALUE = FILTERS_NAMESPACE + 'buttons.placeholder.value';\nvar FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE = exports.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE = FILTERS_NAMESPACE + 'buttons.placeholder.secondValue';\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getPluginName = exports.getRegistredPluginNames = exports.getPlugin = exports.registerPlugin = undefined;\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _object = __webpack_require__(2);\n\nvar _string = __webpack_require__(36);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar registeredPlugins = new WeakMap();\n\n/**\n * Registers plugin under given name\n *\n * @param {String} pluginName\n * @param {Function} PluginClass\n */\n/**\n * Utility to register plugins and common namespace for keeping reference to all plugins classes\n */\nfunction registerPlugin(pluginName, PluginClass) {\n  pluginName = (0, _string.toUpperCaseFirst)(pluginName);\n\n  _pluginHooks2.default.getSingleton().add('construct', function () {\n    var holder = void 0;\n\n    if (!registeredPlugins.has(this)) {\n      registeredPlugins.set(this, {});\n    }\n    holder = registeredPlugins.get(this);\n\n    if (!holder[pluginName]) {\n      holder[pluginName] = new PluginClass(this);\n    }\n  });\n  _pluginHooks2.default.getSingleton().add('afterDestroy', function () {\n    if (registeredPlugins.has(this)) {\n      var pluginsHolder = registeredPlugins.get(this);\n\n      (0, _object.objectEach)(pluginsHolder, function (plugin) {\n        return plugin.destroy();\n      });\n      registeredPlugins.delete(this);\n    }\n  });\n}\n\n/**\n * @param {Object} instance\n * @param {String|Function} pluginName\n * @returns {Function} pluginClass Returns plugin instance if exists or `undefined` if not exists.\n */\nfunction getPlugin(instance, pluginName) {\n  if (typeof pluginName != 'string') {\n    throw Error('Only strings can be passed as \"plugin\" parameter');\n  }\n  var _pluginName = (0, _string.toUpperCaseFirst)(pluginName);\n\n  if (!registeredPlugins.has(instance) || !registeredPlugins.get(instance)[_pluginName]) {\n    return void 0;\n  }\n\n  return registeredPlugins.get(instance)[_pluginName];\n}\n\n/**\n * Get all registred plugins names for concrete Handsontable instance.\n *\n * @param {Object} hotInstance\n * @returns {Array}\n */\nfunction getRegistredPluginNames(hotInstance) {\n  return registeredPlugins.has(hotInstance) ? Object.keys(registeredPlugins.get(hotInstance)) : [];\n}\n\n/**\n * Get plugin name.\n *\n * @param {Object} hotInstance\n * @param {Object} plugin\n * @returns {String|null}\n */\nfunction getPluginName(hotInstance, plugin) {\n  var pluginName = null;\n\n  if (registeredPlugins.has(hotInstance)) {\n    (0, _object.objectEach)(registeredPlugins.get(hotInstance), function (pluginInstance, name) {\n      if (pluginInstance === plugin) {\n        pluginName = name;\n      }\n    });\n  }\n\n  return pluginName;\n}\n\nexports.registerPlugin = registerPlugin;\nexports.getPlugin = getPlugin;\nexports.getRegistredPluginNames = getRegistredPluginNames;\nexports.getPluginName = getPluginName;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _recordTranslator = __webpack_require__(313);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar privatePool = new WeakMap();\nvar initializedPlugins = null;\n\n/**\n * @private\n */\n\nvar BasePlugin = function () {\n  /**\n   * @param {Object} hotInstance Handsontable instance.\n   */\n  function BasePlugin(hotInstance) {\n    var _this = this;\n\n    _classCallCheck(this, BasePlugin);\n\n    /**\n     * Handsontable instance.\n     *\n     * @type {Core}\n     */\n    (0, _object.defineGetter)(this, 'hot', hotInstance, {\n      writable: false\n    });\n    (0, _object.defineGetter)(this, 't', (0, _recordTranslator.getTranslator)(hotInstance), {\n      writable: false\n    });\n\n    privatePool.set(this, { hooks: {} });\n    initializedPlugins = null;\n\n    this.pluginName = null;\n    this.pluginsInitializedCallbacks = [];\n    this.isPluginsReady = false;\n    this.enabled = false;\n    this.initialized = false;\n\n    this.hot.addHook('afterPluginsInitialized', function () {\n      return _this.onAfterPluginsInitialized();\n    });\n    this.hot.addHook('afterUpdateSettings', function () {\n      return _this.onUpdateSettings();\n    });\n    this.hot.addHook('beforeInit', function () {\n      return _this.init();\n    });\n  }\n\n  _createClass(BasePlugin, [{\n    key: 'init',\n    value: function init() {\n      this.pluginName = (0, _plugins.getPluginName)(this.hot, this);\n\n      if (this.isEnabled && this.isEnabled()) {\n        this.enablePlugin();\n      }\n      if (!initializedPlugins) {\n        initializedPlugins = (0, _plugins.getRegistredPluginNames)(this.hot);\n      }\n      if (initializedPlugins.indexOf(this.pluginName) >= 0) {\n        initializedPlugins.splice(initializedPlugins.indexOf(this.pluginName), 1);\n      }\n      if (!initializedPlugins.length) {\n        this.hot.runHooks('afterPluginsInitialized');\n      }\n      this.initialized = true;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      this.enabled = true;\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      if (this.eventManager) {\n        this.eventManager.clear();\n      }\n      this.clearHooks();\n      this.enabled = false;\n    }\n\n    /**\n     * Add listener to plugin hooks system.\n     *\n     * @param {String} name\n     * @param {Function} callback\n     */\n\n  }, {\n    key: 'addHook',\n    value: function addHook(name, callback) {\n      privatePool.get(this).hooks[name] = privatePool.get(this).hooks[name] || [];\n\n      var hooks = privatePool.get(this).hooks[name];\n\n      this.hot.addHook(name, callback);\n      hooks.push(callback);\n      privatePool.get(this).hooks[name] = hooks;\n    }\n\n    /**\n     * Remove all hooks listeners by hook name.\n     *\n     * @param {String} name\n     */\n\n  }, {\n    key: 'removeHooks',\n    value: function removeHooks(name) {\n      var _this2 = this;\n\n      (0, _array.arrayEach)(privatePool.get(this).hooks[name] || [], function (callback) {\n        _this2.hot.removeHook(name, callback);\n      });\n    }\n\n    /**\n     * Clear all hooks.\n     */\n\n  }, {\n    key: 'clearHooks',\n    value: function clearHooks() {\n      var _this3 = this;\n\n      var hooks = privatePool.get(this).hooks;\n\n      (0, _object.objectEach)(hooks, function (callbacks, name) {\n        return _this3.removeHooks(name);\n      });\n      hooks.length = 0;\n    }\n\n    /**\n     * Register function which will be immediately called after all plugins initialized.\n     *\n     * @param {Function} callback\n     */\n\n  }, {\n    key: 'callOnPluginsReady',\n    value: function callOnPluginsReady(callback) {\n      if (this.isPluginsReady) {\n        callback();\n      } else {\n        this.pluginsInitializedCallbacks.push(callback);\n      }\n    }\n\n    /**\n     * On after plugins initialized listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterPluginsInitialized',\n    value: function onAfterPluginsInitialized() {\n      (0, _array.arrayEach)(this.pluginsInitializedCallbacks, function (callback) {\n        return callback();\n      });\n      this.pluginsInitializedCallbacks.length = 0;\n      this.isPluginsReady = true;\n    }\n\n    /**\n     * On update settings listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onUpdateSettings',\n    value: function onUpdateSettings() {\n      if (this.isEnabled) {\n        if (this.enabled && !this.isEnabled()) {\n          this.disablePlugin();\n        }\n        if (!this.enabled && this.isEnabled()) {\n          this.enablePlugin();\n        }\n        if (this.enabled && this.isEnabled()) {\n          this.updatePlugin();\n        }\n      }\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {}\n\n    /**\n     * Destroy plugin.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      var _this4 = this;\n\n      if (this.eventManager) {\n        this.eventManager.destroy();\n      }\n      this.clearHooks();\n\n      (0, _object.objectEach)(this, function (value, property) {\n        if (property !== 'hot' && property !== 't') {\n          _this4[property] = null;\n        }\n      });\n      delete this.t;\n      delete this.hot;\n    }\n  }]);\n\n  return BasePlugin;\n}();\n\nexports.default = BasePlugin;\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar store = __webpack_require__(77)('wks');\nvar uid = __webpack_require__(49);\nvar Symbol = __webpack_require__(14).Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n  return store[name] || (store[name] =\n    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.stopImmediatePropagation = stopImmediatePropagation;\nexports.isImmediatePropagationStopped = isImmediatePropagationStopped;\nexports.stopPropagation = stopPropagation;\nexports.pageX = pageX;\nexports.pageY = pageY;\nexports.isRightClick = isRightClick;\nexports.isLeftClick = isLeftClick;\n\nvar _element = __webpack_require__(0);\n\n/**\n * Prevent other listeners of the same event from being called.\n *\n * @param {Event} event\n */\nfunction stopImmediatePropagation(event) {\n  event.isImmediatePropagationEnabled = false;\n  event.cancelBubble = true;\n}\n\n/**\n * Check if event was stopped by `stopImmediatePropagation`.\n *\n * @param event {Event}\n * @returns {Boolean}\n */\nfunction isImmediatePropagationStopped(event) {\n  return event.isImmediatePropagationEnabled === false;\n}\n\n/**\n * Prevent further propagation of the current event (prevent bubbling).\n *\n * @param event {Event}\n */\nfunction stopPropagation(event) {\n  // ie8\n  // http://msdn.microsoft.com/en-us/library/ie/ff975462(v=vs.85).aspx\n  if (typeof event.stopPropagation === 'function') {\n    event.stopPropagation();\n  } else {\n    event.cancelBubble = true;\n  }\n}\n\n/**\n * Get horizontal coordinate of the event object relative to the whole document.\n *\n * @param {Event} event\n * @returns {Number}\n */\nfunction pageX(event) {\n  if (event.pageX) {\n    return event.pageX;\n  }\n\n  return event.clientX + (0, _element.getWindowScrollLeft)();\n}\n\n/**\n * Get vertical coordinate of the event object relative to the whole document.\n *\n * @param {Event} event\n * @returns {Number}\n */\nfunction pageY(event) {\n  if (event.pageY) {\n    return event.pageY;\n  }\n\n  return event.clientY + (0, _element.getWindowScrollTop)();\n}\n\n/**\n * Check if provided event was triggered by clicking the right mouse button.\n *\n * @param {Event} event DOM Event.\n * @returns {Boolean}\n */\nfunction isRightClick(event) {\n  return event.button === 2;\n}\n\n/**\n * Check if provided event was triggered by clicking the left mouse button.\n *\n * @param {Event} event DOM Event.\n * @returns {Boolean}\n */\nfunction isLeftClick(event) {\n  return event.button === 0;\n}\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getRegisteredRenderers = exports.getRegisteredRendererNames = exports.hasRenderer = exports.getRenderer = exports.registerRenderer = undefined;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _cellDecorator = __webpack_require__(364);\n\nvar _cellDecorator2 = _interopRequireDefault(_cellDecorator);\n\nvar _autocompleteRenderer = __webpack_require__(365);\n\nvar _autocompleteRenderer2 = _interopRequireDefault(_autocompleteRenderer);\n\nvar _checkboxRenderer = __webpack_require__(366);\n\nvar _checkboxRenderer2 = _interopRequireDefault(_checkboxRenderer);\n\nvar _htmlRenderer = __webpack_require__(367);\n\nvar _htmlRenderer2 = _interopRequireDefault(_htmlRenderer);\n\nvar _numericRenderer = __webpack_require__(368);\n\nvar _numericRenderer2 = _interopRequireDefault(_numericRenderer);\n\nvar _passwordRenderer = __webpack_require__(370);\n\nvar _passwordRenderer2 = _interopRequireDefault(_passwordRenderer);\n\nvar _textRenderer = __webpack_require__(371);\n\nvar _textRenderer2 = _interopRequireDefault(_textRenderer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _staticRegister = (0, _staticRegister3.default)('renderers'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem,\n    hasItem = _staticRegister.hasItem,\n    getNames = _staticRegister.getNames,\n    getValues = _staticRegister.getValues;\n\nregister('base', _cellDecorator2.default);\nregister('autocomplete', _autocompleteRenderer2.default);\nregister('checkbox', _checkboxRenderer2.default);\nregister('html', _htmlRenderer2.default);\nregister('numeric', _numericRenderer2.default);\nregister('password', _passwordRenderer2.default);\nregister('text', _textRenderer2.default);\n\n/**\n * Retrieve renderer function.\n *\n * @param {String} name Renderer identification.\n * @returns {Function} Returns renderer function.\n */\nfunction _getItem(name) {\n  if (typeof name === 'function') {\n    return name;\n  }\n  if (!hasItem(name)) {\n    throw Error('No registered renderer found under \"' + name + '\" name');\n  }\n\n  return getItem(name);\n}\n\nexports.registerRenderer = register;\nexports.getRenderer = _getItem;\nexports.hasRenderer = hasItem;\nexports.getRegisteredRendererNames = getNames;\nexports.getRegisteredRenderers = getValues;\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports) {\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self\n  // eslint-disable-next-line no-new-func\n  : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @description\n * Handsontable events are the common interface that function in 2 ways: as __callbacks__ and as __hooks__.\n *\n * @example\n *\n * ```js\n * // Using events as callbacks:\n * ...\n * var hot1 = new Handsontable(document.getElementById('example1'), {\n *   afterChange: function(changes, source) {\n *     $.ajax({\n *       url: \"save.php',\n *       data: change\n *     });\n *   }\n * });\n * ...\n * ```\n *\n * ```js\n * // Using events as plugin hooks:\n * ...\n * var hot1 = new Handsontable(document.getElementById('example1'), {\n *   myPlugin: true\n * });\n *\n * var hot2 = new Handsontable(document.getElementById('example2'), {\n *   myPlugin: false\n * });\n *\n * // global hook\n * Handsontable.hooks.add('afterChange', function() {\n *   // Fired twice - for hot1 and hot2\n *   if (this.getSettings().myPlugin) {\n *     // function body - will only run for hot1\n *   }\n * });\n *\n * // local hook (has same effect as a callback)\n * hot2.addHook('afterChange', function() {\n *   // function body - will only run in #example2\n * });\n * ```\n * ...\n */\n\n// @TODO: Move plugin description hooks to plugin?\nvar REGISTERED_HOOKS = [\n/**\n * Callback fired after resetting a cell's meta.\n *\n * @event Hooks#afterCellMetaReset\n * @since 0.11\n */\n'afterCellMetaReset',\n\n/**\n * @description\n * Callback fired after one or more cells has been changed. Its main use case is to save the input.\n *\n * __Note:__ For performance reasons, the `changes` array is null for `\"loadData\"` source.\n *\n * @event Hooks#afterChange\n * @param {Array} changes 2D array containing information about each of the edited cells `[[row, prop, oldVal, newVal], ...]`.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterChange',\n\n/**\n * @description\n * Fired after observing changes.\n *\n * @event Hooks#afterChangesObserved\n */\n'afterChangesObserved',\n\n/**\n * @description\n * Fired after setting up the Context Menu's default options. These options are a collection which user can select by setting\n * an array of keys or an array of objects in `contextMenu` option.\n *\n * @event Hooks#afterContextMenuDefaultOptions\n * @param {Array} predefinedItems Array of objects containing information about the pre-defined Context Menu items.\n */\n'afterContextMenuDefaultOptions',\n\n/**\n * @description\n * Fired before setting up the Context Menu's items but after filtering these options by user (`contextMenu` option). This hook\n * can by helpful to determine if user use specified menu item or to set up one of the menu item to by always visible.\n *\n * @event Hooks#beforeContextMenuSetItems\n * @param {Array} menuItems Array of objects containing information about to generated Context Menu items.\n */\n'beforeContextMenuSetItems',\n\n/**\n * @description\n * Fired after setting up the Context Menu's default options. These options are a collection which user can select by setting\n * an array of keys or an array of objects in `contextMenu` option.\n *\n * @pro\n * @event Hooks#afterDropdownMenuDefaultOptions\n * @param {Array} predefinedItems Array of objects containing information about the pre-defined Context Menu items.\n */\n'afterDropdownMenuDefaultOptions',\n\n/**\n * @description\n * Fired before setting up the Dropdown Menu's items but after filtering these options by user (`dropdownMenu` option). This hook\n * can by helpful to determine if user use specified menu item or to set up one of the menu item to by always visible.\n *\n * @pro\n * @event Hooks#beforeDropdownMenuSetItems\n * @param {Array} menuItems Array of objects containing information about to generated Dropdown Menu items.\n */\n'beforeDropdownMenuSetItems',\n\n/**\n * @description\n * Fired after hiding the Context Menu.\n *\n * @event Hooks#afterContextMenuHide\n * @param {Object} context The Context menu instance.\n */\n'afterContextMenuHide',\n\n/**\n * @description\n * Fired before opening the Context Menu.\n *\n * @event Hooks#beforeContextMenuShow\n * @param {Object} context The Context Menu instance.\n */\n'beforeContextMenuShow',\n\n/**\n * @description\n * Fired after opening the Context Menu.\n *\n * @event Hooks#afterContextMenuShow\n * @param {Object} context The Context Menu instance.\n */\n'afterContextMenuShow',\n\n/**\n * @description\n * Fired after reaching the copy limit while copying data.\n *\n * @event Hooks#afterCopyLimit\n * @param {Number} selectedRows Count of selected copyable rows.\n * @param {Number} selectedColumns Count of selected copyable columns.\n * @param {Number} copyRowsLimit Current copy rows limit.\n * @param {Number} copyColumnsLimit Current copy columns limit.\n */\n'afterCopyLimit',\n\n/**\n * Callback is fired before a new column was created.\n *\n * @since 0.28.0\n * @event Hooks#beforeCreateCol\n * @param {Number} index Represents the visual index of first newly created column in the data source array.\n * @param {Number} amount Number of newly created columns in the data source array.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'beforeCreateCol',\n\n/**\n * Callback is fired after a new column was created.\n *\n * @event Hooks#afterCreateCol\n * @param {Number} index Represents the visual index of first newly created column in the data source array.\n * @param {Number} amount Number of newly created columns in the data source array.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterCreateCol',\n\n/**\n * Callback is fired before a new row was created.\n *\n * @since 0.28.0\n * @event Hooks#beforeCreateRow\n * @param {Number} index Represents the visual index of first newly created row in the data source array.\n * @param {Number} amount Number of newly created rows in the data source array.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'beforeCreateRow',\n\n/**\n * Callback is fired after a new row was created.\n *\n * @event Hooks#afterCreateRow\n * @param {Number} index Represents the visual index of first newly created row in the data source array.\n * @param {Number} amount Number of newly created rows in the data source array.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterCreateRow',\n\n/**\n * Fired after the current cell is deselected.\n *\n * @event Hooks#afterDeselect\n */\n'afterDeselect',\n\n/**\n * Fired after destroying the Handsontable instance.\n *\n * @event Hooks#afterDestroy\n */\n'afterDestroy',\n\n/**\n * Fired on a `keydown` event on the document body.\n *\n * @event Hooks#afterDocumentKeyDown\n * @param {Event} event A `keydown` event.\n */\n'afterDocumentKeyDown',\n\n/**\n * Fired inside the Walkontable's selection `draw` method. Can be used to add additional class names to cells, depending on the current selection.\n *\n * @event Hooks#afterDrawSelection\n * @param {Number} currentRow Row index of the currently processed cell.\n * @param {Number} currentColumn Column index of the currently cell.\n * @param {Array} cornersOfSelection Array of the current selection in a form of `[startRow, startColumn, endRow, endColumn]`.\n * @param {Number|undefined} layerLevel Number indicating which layer of selection is currently processed.\n * @since 0.38.1\n * @returns {String|undefined} Can return a `String`, which will act as an additional `className` to be added to the currently processed cell.\n */\n'afterDrawSelection',\n/**\n * Fired inside the Walkontable's `refreshSelections` method. Can be used to remove additional class names from all cells in the table.\n *\n * @event Hooks#beforeRemoveCellClassNames\n * @since 0.38.1\n * @returns {String[]|undefined} Can return an `Array` of `String`s. Each of these strings will act like class names to be removed from all the cells in the table.\n */\n'beforeRemoveCellClassNames',\n/**\n * Callback fired after getting the cell settings.\n *\n * @event Hooks#afterGetCellMeta\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {Object} cellProperties Object containing the cell properties.\n */\n'afterGetCellMeta',\n\n/**\n * Callback fired after retrieving information about a column header and appending it to the table header.\n *\n * @event Hooks#afterGetColHeader\n * @param {Number} col Visual column index.\n * @param {Element} TH Header's TH element.\n */\n'afterGetColHeader',\n\n/**\n * Callback fired after retrieving information about a column header and appending it to the table header.\n *\n * @event Hooks#afterGetRowHeader\n * @param {Number} row Visual row index.\n * @param {Element} TH Header's TH element.\n */\n'afterGetRowHeader',\n\n/**\n * Callback fired after Handsontable instance is initiated.\n *\n * @event Hooks#afterInit\n */\n'afterInit',\n\n/**\n * Callback fired after new data is loaded (by `loadData` method) into the data source array.\n *\n * @event Hooks#afterLoadData\n * @param {Boolean} firstTime flag that determines whether the data has been loaded during the initialization.\n */\n'afterLoadData',\n\n/**\n * Fired after a scroll event, which is identified as a momentum scroll (e.g. on an iPad).\n *\n * @event Hooks#afterMomentumScroll\n */\n'afterMomentumScroll',\n\n/**\n * Fired after a `mousedown` event is triggered on the cell corner (the drag handle).\n *\n * @event Hooks#afterOnCellCornerMouseDown\n * @since 0.11\n * @param {Object} event `mousedown` event object.\n */\n'afterOnCellCornerMouseDown',\n\n/**\n * Fired after a `dblclick` event is triggered on the cell corner (the drag handle).\n *\n * @event Hooks#afterOnCellCornerDblClick\n * @since 0.30.0\n * @param {Object} event `dblclick` event object.\n */\n'afterOnCellCornerDblClick',\n\n/**\n * Callback fired after clicking on a cell or row/column header.\n * In case the row/column header was clicked, the index is negative.\n * For example clicking on the row header of cell (0, 0) results with `afterOnCellMouseDown` called\n * with coords `{row: 0, col: -1}`.\n *\n * @event Hooks#afterOnCellMouseDown\n * @since 0.11\n * @param {Object} event `mousedown` event object.\n * @param {Object} coords Coordinates object containing the visual row and visual column indexes of the clicked cell.\n * @param {Element} TD Cell's TD (or TH) element.\n */\n'afterOnCellMouseDown',\n\n/**\n * Callback fired after hovering a cell or row/column header with the mouse cursor.\n * In case the row/column header was hovered, the index is negative.\n * For example, hovering over the row header of cell (0, 0) results with `afterOnCellMouseOver` called\n * with coords `{row: 0, col: -1}`.\n *\n * @event Hooks#afterOnCellMouseOver\n * @since 0.11\n * @param {Object} event `mouseover` event object.\n * @param {Object} coords Hovered cell's visual coordinate object.\n * @param {Element} TD Cell's TD (or TH) element.\n */\n'afterOnCellMouseOver',\n\n/**\n * Callback fired after leaving a cell or row/column header with the mouse cursor.\n *\n * @event Hooks#afterOnCellMouseOut\n * @since 0.31.1\n * @param {Object} event `mouseout` event object.\n * @param {Object} coords Leaved cell's visual coordinate object.\n * @param {Element} TD Cell's TD (or TH) element.\n */\n'afterOnCellMouseOut',\n\n/**\n * Callback is fired when one or more columns are removed.\n *\n * @event Hooks#afterRemoveCol\n * @param {Number} index Is an visual index of starter column.\n * @param {Number} amount Is an amount of removed columns.\n */\n'afterRemoveCol',\n\n/**\n * Callback is fired when one or more rows are removed.\n *\n * @event Hooks#afterRemoveRow\n * @param {Number} index Is an visual index of starter row.\n * @param {Number} amount Is an amount of removed rows.\n */\n'afterRemoveRow',\n\n/**\n * Callback fired after the Handsontable table is rendered.\n *\n * @event Hooks#afterRender\n * @param {Boolean} isForced Is `true` if rendering was triggered by a change of settings or data; or `false` if\n *                           rendering was triggered by scrolling or moving selection.\n */\n'afterRender',\n\n/**\n * Fired before starting rendering the cell.\n *\n * @event Hooks#beforeRenderer\n * @since 0.24.2\n * @param {Element} TD Currently rendered cell's TD element.\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String|Number} prop Column property name or a column index, if datasource is an array of arrays.\n * @param {String} value Value of the rendered cell.\n * @param {Object} cellProperties Object containing the cell's properties.\n */\n'beforeRenderer',\n\n/**\n * Fired after finishing rendering the cell (after the renderer finishes).\n *\n * @event Hooks#afterRenderer\n * @since 0.11.0\n * @param {Element} TD Currently rendered cell's TD element.\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String|Number} prop Column property name or a column index, if datasource is an array of arrays.\n * @param {String} value Value of the rendered cell.\n * @param {Object} cellProperties Object containing the cell's properties.\n */\n'afterRenderer',\n\n/**\n * Fired after the horizontal scroll event.\n *\n * @event Hooks#afterScrollHorizontally\n * @since 0.11\n */\n'afterScrollHorizontally',\n\n/**\n * Fired after the vertical scroll event.\n *\n * @event Hooks#afterScrollVertically\n * @since 0.11\n */\n'afterScrollVertically',\n\n/**\n * Callback fired after one or more cells are selected (e.g. during mouse move).\n *\n * @event Hooks#afterSelection\n * @param {Number} r Selection start visual row index.\n * @param {Number} c Selection start visual column index.\n * @param {Number} r2 Selection end visual row index.\n * @param {Number} c2 Selection end visual column index.\n * @param {Object} preventScrolling Object with `value` property where its value change will be observed.\n * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n * @example\n * ```js\n * handsontable({\n *   afterSelection: function (r, c, r2, c2, preventScrolling, selectionLayerLevel) {\n *     // setting if prevent scrolling after selection\n *     preventScrolling.value = true;\n *   }\n * })\n * ```\n */\n'afterSelection',\n\n/**\n * Callback fired after one or more cells are selected. The `p` argument represents the source object property name instead of the column number.\n *\n * @event Hooks#afterSelectionByProp\n * @param {Number} r Selection start visual row index.\n * @param {String} p Selection start data source object property name.\n * @param {Number} r2 Selection end visual row index.\n * @param {String} p2 Selection end data source object property name.\n * @param {Object} preventScrolling Object with `value` property where its value change will be observed.\n * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n * @example\n * ```js\n * handsontable({\n *   afterSelectionByProp: function (r, c, r2, c2, preventScrolling, selectionLayerLevel) {\n *     // setting if prevent scrolling after selection\n *     preventScrolling.value = true;\n *   }\n * })\n * ```\n */\n'afterSelectionByProp',\n\n/**\n * Callback fired after one or more cells are selected (e.g. on mouse up).\n *\n * @event Hooks#afterSelectionEnd\n * @param {Number} r Selection start visual row index.\n * @param {Number} c Selection start visual column index.\n * @param {Number} r2 Selection end visual row index.\n * @param {Number} c2 Selection end visual column index.\n * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n */\n'afterSelectionEnd',\n\n/**\n * Callback fired after one or more cells are selected (e.g. on mouse up). The `p` argument represents the data source object\n * property name instead of the column number.\n *\n * @event Hooks#afterSelectionEndByProp\n * @param {Number} r Selection start visual row index.\n * @param {String} p Selection start data source object property index.\n * @param {Number} r2 Selection end visual row index.\n * @param {String} p2 Selection end data source object property index.\n * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n */\n'afterSelectionEndByProp',\n\n/**\n * Called after cell meta is changed.\n *\n * @event Hooks#afterSetCellMeta\n * @since 0.11.0\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String} key The updated meta key.\n * @param {*} value The updated meta value.\n */\n'afterSetCellMeta',\n\n/**\n * Called after cell meta is removed.\n *\n * @event Hooks#afterRemoveCellMeta\n * @since 0.33.1\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String} key The removed meta key.\n * @param {*} value Value which was under removed key of cell meta.\n */\n'afterRemoveCellMeta',\n\n/**\n * Called after cell data was changed.\n *\n * @event Hooks#afterSetDataAtCell\n * @since 0.28.0\n * @param {Array} changes An array of changes in format `[[row, col, oldValue, value], ...]`.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterSetDataAtCell',\n\n/**\n * Called after cell data was changed.\n *\n * @event Hooks#afterSetDataAtRowProp\n * @since 0.28.0\n * @param {Array} changes An array of changes in format `[[row, prop, oldValue, value], ...]`.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterSetDataAtRowProp',\n\n/**\n * Fired after calling the `updateSettings` method.\n *\n * @event Hooks#afterUpdateSettings\n * @param {Object} settings New settings object.\n */\n'afterUpdateSettings',\n\n/**\n * @description\n * A plugin hook executed after validator function, only if validator function is defined.\n * Validation result is the first parameter. This can be used to determinate if validation passed successfully or not.\n *\n * __Returning false from the callback will mark the cell as invalid.__\n *\n * @event Hooks#afterValidate\n * @since 0.9.5\n * @param {Boolean} isValid `true` if valid, `false` if not.\n * @param {*} value The value in question.\n * @param {Number} row Row index.\n * @param {String|Number} prop Property name / column index.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterValidate',\n\n/**\n * Fired before successful change of language (when proper language code was set)\n *\n * @event Hooks#beforeLanguageChange\n * @since 0.35.0\n * @param {String} languageCode New language code.\n */\n'beforeLanguageChange',\n\n/**\n * Fired after successful change of language (when proper language code was set)\n *\n * @event Hooks#afterLanguageChange\n * @since 0.35.0\n * @param {String} languageCode New language code.\n */\n'afterLanguageChange',\n\n/**\n * Fired before populating the data in the autofill feature.\n *\n * @event Hooks#beforeAutofill\n * @param {Object} start Object containing information about first filled cell: `{row: 2, col: 0}`.\n * @param {Object} end Object containing information about last filled cell: `{row: 4, col: 1}`.\n * @param {Array} data 2D array containing information about fill pattern: `[[\"1\", \"Ted\"], [\"1\", \"John\"]]`.\n * @param {Array} baseRange The coordinates of the base area for autofill.\n */\n'beforeAutofill',\n\n/**\n * Fired before aligning the cell contents.\n *\n * @event Hooks#beforeCellAlignment\n * @param stateBefore\n * @param range\n * @param {String} type Type of the alignment - either `horizontal` or `vertical`\n * @param {String} alignmentClass String defining the alignment class added to the cell.\n * Possible values:\n * * `htLeft`,\n * * `htCenter`,\n * * `htRight`,\n * * `htJustify`\n * for horizontal alignment,\n *\n *\n * * `htTop`,\n * * `htMiddle`,\n * * `htBottom`\n * for vertical alignment.\n */\n'beforeCellAlignment',\n\n/**\n * Callback fired before one or more cells is changed. Its main purpose is to alter changes silently before input.\n *\n * @event Hooks#beforeChange\n * @param {Array} changes 2D array containing information about each of the edited cells.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n * @example\n * ```js\n * // To disregard a single change, set changes[i] to null or remove it from array using changes.splice(i, 1).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeChange: function(changes, source) {\n *     // [[row, prop, oldVal, newVal], ...]\n *     changes[0] = null;\n *   }\n * });\n * ...\n *\n * // To alter a single change, overwrite the desired value to changes[i][3].\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeChange: function(changes, source) {\n *     // [[row, prop, oldVal, newVal], ...]\n *     changes[0][3] = 10;\n *   }\n * });\n * ...\n *\n * // To cancel all edit, return false from the callback or set array length to 0 (changes.length = 0).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeChange: function(changes, source) {\n *     // [[row, prop, oldVal, newVal], ...]\n *     return false;\n *   }\n * });\n * ...\n * ```\n */\n'beforeChange',\n\n/**\n * Fired right before rendering the changes.\n *\n * @event Hooks#beforeChangeRender\n * @since 0.11\n * @param {Array} changes Array in form of [row, prop, oldValue, newValue].\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'beforeChangeRender',\n\n/**\n * Fired before drawing the borders.\n *\n * @event Hooks#beforeDrawBorders\n * @param {Array} corners Array specifying the current selection borders.\n * @param {String} borderClassName Specifies the border class name.\n */\n'beforeDrawBorders',\n\n/**\n * Callback fired before getting cell settings.\n *\n * @event Hooks#beforeGetCellMeta\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {Object} cellProperties Object containing the cell's properties.\n */\n'beforeGetCellMeta',\n\n/**\n * Called before cell meta is removed.\n *\n * @event Hooks#beforeRemoveCellMeta\n * @since 0.33.1\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String} key The removed meta key.\n * @param {*} value Value which is under removed key of cell meta.\n */\n'beforeRemoveCellMeta',\n\n/**\n * @description\n * Callback fired before Handsontable instance is initiated.\n *\n * @event Hooks#beforeInit\n */\n'beforeInit',\n\n/**\n * Callback fired before Walkontable instance is initiated.\n *\n * @since 0.11\n * @event Hooks#beforeInitWalkontable\n * @param {Object} walkontableConfig Walkontable configuration object.\n */\n'beforeInitWalkontable',\n\n/**\n * Callback fired before keydown event is handled. It can be used to overwrite default key bindings.\n * Caution - in your `beforeKeyDown` handler you need to call `event.stopImmediatePropagation()` to prevent default key behavior.\n *\n * @event Hooks#beforeKeyDown\n * @since 0.9.0\n * @param {Event} event Original DOM event.\n */\n'beforeKeyDown',\n\n/**\n * Fired after the user clicked a cell, but before all the calculations related with it.\n *\n * @event Hooks#beforeOnCellMouseDown\n * @param {Event} event The `mousedown` event object.\n * @param {CellCoords} coords Cell coords object containing the visual coordinates of the clicked cell.\n * @param {Element} TD TD element.\n */\n'beforeOnCellMouseDown',\n\n/**\n * Fired after the user moved cursor over a cell, but before all the calculations related with it.\n *\n * @event Hooks#beforeOnCellMouseOver\n * @param {Event} event The `mouseover` event object.\n * @param {CellCoords} coords CellCoords object containing the visual coordinates of the clicked cell.\n * @param {Element} TD TD element.\n * @param {Object} blockCalculations Contain keys 'row' and 'column' with boolean value.\n */\n'beforeOnCellMouseOver',\n\n/**\n * Fired after the user moved cursor out from a cell, but before all the calculations related with it.\n *\n * @event Hooks#beforeOnCellMouseOut\n * @since 0.31.1\n * @param {Event} event The `mouseout` event object.\n * @param {WalkontableCellCoords} coords WalkontableCellCoords object containing the visual coordinates of the leaved cell.\n * @param {Element} TD TD element.\n */\n'beforeOnCellMouseOut',\n\n/**\n * Callback is fired when one or more columns are about to be removed.\n *\n * @event Hooks#beforeRemoveCol\n * @param {Number} index Visual index of starter column.\n * @param {Number} amount Amount of columns to be removed.\n * @param {Array} [visualCols] Consists of visual indexes of processed columns.\n */\n'beforeRemoveCol',\n\n/**\n * Callback is fired when one or more rows are about to be removed.\n *\n * @event Hooks#beforeRemoveRow\n * @param {Number} index Visual index of starter column.\n * @param {Number} amount Amount of columns to be removed.\n * @param {Array} [visualRows] Consists of visual indexes of processed rows.\n */\n'beforeRemoveRow',\n\n/**\n * Callback fired before Handsontable table is rendered.\n *\n * @event Hooks#beforeRender\n * @param {Boolean} isForced If `true` rendering was triggered by a change of settings or data; or `false` if\n *                           rendering was triggered by scrolling or moving selection.\n */\n'beforeRender',\n\n/**\n * Callback fired before setting range is started but not finished yet.\n *\n * @event Hooks#beforeSetRangeStartOnly\n * @param {CellCoords} coords CellCoords instance.\n */\n'beforeSetRangeStartOnly',\n\n/**\n * Callback fired before setting range is started.\n *\n * @event Hooks#beforeSetRangeStart\n * @param {CellCoords} coords CellCoords instance.\n */\n'beforeSetRangeStart',\n\n/**\n * Callback fired before setting range is ended.\n *\n * @event Hooks#beforeSetRangeEnd\n * @param {CellCoords} coords CellCoords instance.\n */\n'beforeSetRangeEnd',\n\n/**\n * Fired before the logic of handling a touch scroll, when user started scrolling on a touch-enabled device.\n *\n * @event Hooks#beforeTouchScroll\n */\n'beforeTouchScroll',\n\n/**\n * @description\n * A plugin hook executed before validator function, only if validator function is defined.\n * This can be used to manipulate the value of changed cell before it is applied to the validator function.\n *\n * __Notice:__ this will not affect values of changes. This will change value ONLY for validation!\n *\n * @event Hooks#beforeValidate\n * @since 0.9.5\n * @param {*} value Value of the cell.\n * @param {Number} row Row index.\n * @param {String|Number} prop Property name / column index.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'beforeValidate',\n\n/**\n * Callback fired before cell value is rendered into the DOM (through renderer function).\n *\n * @event Hooks#beforeValueRender\n * @since 0.29.0\n * @param {*} value Cell value to render.\n */\n'beforeValueRender',\n\n/**\n * Callback fired after Handsontable instance is constructed (via `new` operator).\n *\n * @event Hooks#construct\n * @since 0.16.1\n */\n'construct',\n\n/**\n * Callback fired after Handsontable instance is initiated but before table is rendered.\n *\n * @event Hooks#init\n * @since 0.16.1\n */\n'init',\n\n/**\n * Fired when a column index is about to be modified by a callback function.\n *\n * @event Hooks#modifyCol\n * @since 0.11\n * @param {Number} col Visual column index.\n */\n'modifyCol',\n\n/**\n * Fired when a column index is about to be de-modified by a callback function.\n *\n * @event Hooks#unmodifyCol\n * @since 0.23.0\n * @param {Number} col Physical column index.\n */\n'unmodifyCol',\n\n/**\n * Fired when a physical row index is about to be de-modified by a callback function.\n *\n * @event Hooks#unmodifyRow\n * @since 0.26.2\n * @param {Number} row Physical row index.\n */\n'unmodifyRow',\n/**\n * Fired when a column header index is about to be modified by a callback function.\n *\n * @event Hooks#modifyColHeader\n * @since 0.20.0\n * @param {Number} column Visual column header index.\n */\n'modifyColHeader',\n\n/**\n * Fired when a column width is about to be modified by a callback function.\n *\n * @event Hooks#modifyColWidth\n * @since 0.11\n * @param {Number} width Current column width.\n * @param {Number} col Column index.\n */\n'modifyColWidth',\n\n/**\n * Fired when a row index is about to be modified by a callback function.\n *\n * @event Hooks#modifyRow\n * @since 0.11\n * @param {Number} row Row index.\n */\n'modifyRow',\n\n/**\n * Fired when a row header index is about to be modified by a callback function.\n *\n * @event Hooks#modifyRowHeader\n * @since 0.20.0\n * @param {Number} row Row header index.\n */\n'modifyRowHeader',\n\n/**\n * Fired when a row height is about to be modified by a callback function.\n *\n * @event Hooks#modifyRowHeight\n * @since 0.11.0\n * @param {Number} height Row height.\n * @param {Number} row Row index.\n */\n'modifyRowHeight',\n\n/**\n * Fired when a data was retrieved or modified.\n *\n * @event Hooks#modifyData\n * @since 0.28.0\n * @param {Number} row Row height.\n * @param {Number} column Column index.\n * @param {Object} valueHolder Object which contains original value which can be modified by overwriting `.value` property.\n * @param {String} ioMode String which indicates for what operation hook is fired (`get` or `set`).\n */\n'modifyData',\n\n/**\n * Fired when a data was retrieved or modified.\n *\n * @event Hooks#modifyRowData\n * @since 0.28.0\n * @param {Number} row Physical row index.\n */\n'modifyRowData',\n\n/**\n * Used to modify the cell coordinates when using the `getCell` method.\n *\n * @event Hooks#modifyGetCellCoords\n * @since 0.36.0\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {Boolean} topmost If set to true, it returns the TD element from the topmost overlay. For example,\n * if the wanted cell is in the range of fixed rows, it will return a TD element from the `top` overlay.\n */\n'modifyGetCellCoords',\n\n/**\n * Fired after loading data using the Persistent State plugin.\n *\n * @event Hooks#persistentStateLoad\n * @param {String} key Key string.\n * @param {Object} valuePlaceholder Object containing the loaded data.\n */\n'persistentStateLoad',\n\n/**\n * Fired after resetting data using the Persistent State plugin.\n *\n * @event Hooks#persistentStateReset\n * @param {String} key Key string.\n */\n'persistentStateReset',\n\n/**\n * Fired after resetting data using the Persistent State plugin.\n *\n * @event Hooks#persistentStateSave\n * @param {String} key Key string.\n * @param {Mixed} value Value to save.\n */\n'persistentStateSave',\n\n/**\n * Fired before sorting the column. If you return `false` value then sorting will be not applied by\n * Handsontable (useful for server-side sorting).\n *\n * @event Hooks#beforeColumnSort\n * @param {Number} column Sorted visual column index.\n * @param {Boolean} order Soring order where:\n *  * `true` means ascending order,\n *  * `false` means descending order,\n *  * `undefined` means original order.\n */\n'beforeColumnSort',\n\n/**\n * Fired after sorting the column.\n *\n * @event Hooks#afterColumnSort\n * @param {Number} column Sorted visual column index.\n * @param {Boolean} order Soring order where:\n *  * `true` means ascending order\n *  * `false` means descending order\n *  * `undefined` means original order\n */\n'afterColumnSort',\n\n/**\n * @description\n * Fired after setting range of autofill.\n * Both arguments are provided in the following format:\n * ```js\n * [startRow, startColumn, endRow, endColumn]\n * ```\n *\n * @event Hooks#modifyAutofillRange\n * @param {Array} startArea Array of visual coordinates of the starting point for the drag-down operation.\n * @param {Array} entireArea Array of visual coordinates of the entire area of the drag-down operation.\n */\n'modifyAutofillRange',\n\n/**\n * Fired to allow modifying the copyable range with a callback function.\n *\n * @since 0.19.0\n * @event Hooks#modifyCopyableRange\n * @param {Array} copyableRanges Array of objects defining copyable cells.\n */\n'modifyCopyableRange',\n\n/**\n * Called before copying the values into clipboard and before clearing values of the selected cells.\n *\n * @event Hooks#beforeCut\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains data to cut.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       which will be cut out.\n * @returns {*} If returns `false` then operation of the cutting out is cancelled.\n *\n * @example\n * ```js\n * // To disregard a single row, remove it from array using data.splice(i, 1).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeCut: function(data, coords) {\n *     // data -> [[1, 2, 3], [4, 5, 6]]\n *     data.splice(0, 1);\n *     // data -> [[4, 5, 6]]\n *     // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n *   }\n * });\n * ...\n *\n * // To cancel cutting out, return false from the callback.\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeCut: function(data, coords) {\n *     return false;\n *   }\n * });\n * ...\n * ```\n */\n'beforeCut',\n\n/**\n * Fired after data are cutted out from the table.\n *\n * @event Hooks#afterCut\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains the cutted out data.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       which was cut out.\n */\n'afterCut',\n\n/**\n * Fired before values are copied into clipboard.\n *\n * @event Hooks#beforeCopy\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains data to copied.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       which will copied.\n * @returns {*} If returns `false` then copying is cancelled.\n *\n * @example\n * ```js\n * // To disregard a single row, remove it from array using data.splice(i, 1).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeCopy: function(data, coords) {\n *     // data -> [[1, 2, 3], [4, 5, 6]]\n *     data.splice(0, 1);\n *     // data -> [[4, 5, 6]]\n *     // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n *   }\n * });\n * ...\n *\n * // To cancel copying, return false from the callback.\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeCopy: function(data, coords) {\n *     return false;\n *   }\n * });\n * ...\n * ```\n */\n'beforeCopy',\n\n/**\n * Fired after data are pasted into table.\n *\n * @event Hooks#afterCopy\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains the copied data.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       which was copied.\n */\n'afterCopy',\n\n/**\n * Fired before values are pasted into table.\n *\n * @event Hooks#beforePaste\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains data to paste.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       that correspond to the previously selected area.\n * @returns {*} If returns `false` then pasting is cancelled.\n *\n * @example\n * ```js\n * // To disregard a single row, remove it from array using data.splice(i, 1).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforePaste: function(data, coords) {\n *     // data -> [[1, 2, 3], [4, 5, 6]]\n *     data.splice(0, 1);\n *     // data -> [[4, 5, 6]]\n *     // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n *   }\n * });\n * ...\n *\n * // To cancel pasting, return false from the callback.\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforePaste: function(data, coords) {\n *     return false;\n *   }\n * });\n * ...\n * ```\n */\n'beforePaste',\n\n/**\n * Fired after values are pasted into table.\n *\n * @event Hooks#afterPaste\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains the pasted data.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       that correspond to the previously selected area.\n */\n'afterPaste',\n\n/**\n * Fired before change order of the visual indexes.\n *\n * @event Hooks#beforeColumnMove\n * @param {Array} columns Array of visual column indexes to be moved.\n * @param {Number} target Visual column index being a target for moved columns.\n */\n'beforeColumnMove',\n\n/**\n * Fired after change order of the visual indexes.\n *\n * @event Hooks#afterColumnMove\n * @param {Array} columns Array of visual column indexes that were moved.\n * @param {Number} target Visual column index being a target for moved columns.\n */\n'afterColumnMove',\n\n/**\n * Fired before change order of the visual indexes.\n *\n * @event Hooks#beforeRowMove\n * @param {Array} rows Array of visual row indexes to be moved.\n * @param {Number} target Visual row index being a target for moved rows.\n */\n'beforeRowMove',\n\n/**\n * Fired after change order of the visual indexes.\n *\n * @event Hooks#afterRowMove\n * @param {Array} rows Array of visual row indexes that were moved.\n * @param {Number} target Visual row index being a target for moved rows.\n */\n'afterRowMove',\n\n/**\n * Fired before rendering the table with modified column sizes.\n *\n * @event Hooks#beforeColumnResize\n * @param {Number} currentColumn Visual index of the resized column.\n * @param {Number} newSize Calculated new column width.\n * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n * @returns {Number} Returns a new column size or `undefined`, if column size should be calculated automatically.\n */\n'beforeColumnResize',\n\n/**\n * Fired after rendering the table with modified column sizes.\n *\n * @event Hooks#afterColumnResize\n * @param {Number} currentColumn Visual index of the resized column.\n * @param {Number} newSize Calculated new column width.\n * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n */\n'afterColumnResize',\n\n/**\n * Fired before rendering the table with modified row sizes.\n *\n * @event Hooks#beforeRowResize\n * @param {Number} currentRow Visual index of the resized row.\n * @param {Number} newSize Calculated new row height.\n * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n * @returns {Number} Returns the new row size or `undefined` if row size should be calculated automatically.\n */\n'beforeRowResize',\n\n/**\n * Fired after rendering the table with modified row sizes.\n *\n * @event Hooks#afterRowResize\n * @param {Number} currentRow Visual index of the resized row.\n * @param {Number} newSize Calculated new row height.\n * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n */\n'afterRowResize',\n\n/**\n * Fired after getting the column header renderers.\n *\n * @event Hooks#afterGetColumnHeaderRenderers\n * @param {Array} array Array of the column header renderers.\n */\n'afterGetColumnHeaderRenderers',\n\n/**\n * Fired after getting the row header renderers.\n *\n * @event Hooks#afterGetRowHeaderRenderers\n * @param {Array} array Array of the row header renderers.\n */\n'afterGetRowHeaderRenderers',\n\n/**\n * Fired before applying stretched column width to column.\n *\n * @event Hooks#beforeStretchingColumnWidth\n * @param {Number} stretchedWidth Calculated width.\n * @param {Number} column Visual column index.\n * @returns {Number} Returns new width which will be applied to the column element.\n */\n'beforeStretchingColumnWidth',\n\n/**\n * Fired before applying [filtering]{@link http://docs.handsontable.com/pro/demo-filtering.html}.\n *\n * @pro\n * @event Hooks#beforeFilter\n * @param {Array} conditionsStack An array of objects with added formulas.\n * @returns {Boolean} If hook returns `false` value then filtering won't be applied on the UI side (server-side filtering).\n */\n'beforeFilter',\n\n/**\n * Fired after applying [filtering]{@link http://docs.handsontable.com/pro/demo-filtering.html}.\n *\n * @pro\n * @event Hooks#afterFilter\n * @param {Array} conditionsStack An array of objects with added formulas.\n */\n'afterFilter',\n\n/**\n * Used to modify the column header height.\n *\n * @event Hooks#modifyColumnHeaderHeight\n * @since 0.25.0\n * @param {Number} col Visual column index.\n */\n'modifyColumnHeaderHeight',\n\n/**\n * Fired before the undo action. Contains information about the action that is being undone.\n *\n * @event Hooks#beforeUndo\n * @since 0.26.2\n * @param {Object} action The action object. Contains information about the action being undone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n */\n'beforeUndo',\n\n/**\n * Fired after the undo action. Contains information about the action that is being undone.\n *\n * @event Hooks#afterUndo\n * @since 0.26.2\n * @param {Object} action The action object. Contains information about the action being undone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n */\n'afterUndo',\n\n/**\n * Fired before the redo action. Contains information about the action that is being redone.\n *\n * @event Hooks#beforeRedo\n * @since 0.26.2\n * @param {Object} action The action object. Contains information about the action being redone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n */\n'beforeRedo',\n\n/**\n * Fired after the redo action. Contains information about the action that is being redone.\n *\n * @event Hooks#afterRedo\n * @since 0.26.2\n * @param {Object} action The action object. Contains information about the action being redone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n */\n'afterRedo',\n\n/**\n * Used to modify the row header width.\n *\n * @event Hooks#modifyRowHeaderWidth\n * @param {Number} rowHeaderWidth Row header width.\n */\n'modifyRowHeaderWidth',\n\n/**\n * Fired from the `populateFromArray` method during the `autofill` process. Fired for each \"autofilled\" cell individually.\n *\n * @event Hooks#beforeAutofillInsidePopulate\n * @param {Object} index Object containing `row` and `col` properties, defining the number of rows/columns from the initial cell of the autofill.\n * @param {String} direction Declares the direction of the autofill. Possible values: `up`, `down`, `left`, `right`.\n * @param {Array} input Array of arrays. Contains an array of rows with data being used in the autofill.\n * @param {Array} deltas The deltas array passed to the `populateFromArray` method.\n */\n'beforeAutofillInsidePopulate',\n\n/**\n * Fired when the start of the selection is being modified. (e.g. moving the selection with the arrow keys).\n *\n * @event Hooks#modifyTransformStart\n * @param {CellCoords} delta Cell coords object declaring the delta of the new selection relative to the previous one.\n */\n'modifyTransformStart',\n\n/**\n * Fired when the end of the selection is being modified. (e.g. moving the selection with the arrow keys).\n *\n * @event Hooks#modifyTransformEnd\n * @param {CellCoords} delta Cell coords object declaring the delta of the new selection relative to the previous one.\n */\n'modifyTransformEnd',\n\n/**\n * Fired after the start of the selection is being modified. (e.g. moving the selection with the arrow keys).\n *\n * @event Hooks#afterModifyTransformStart\n * @param {CellCoords} coords Coords of the freshly selected cell.\n * @param {Number} rowTransformDir `-1` if trying to select a cell with a negative row index. `0` otherwise.\n * @param {Number} colTransformDir `-1` if trying to select a cell with a negative column index. `0` otherwise.\n */\n'afterModifyTransformStart',\n\n/**\n * Fired after the end of the selection is being modified. (e.g. moving the selection with the arrow keys).\n *\n * @event Hooks#afterModifyTransformEnd\n * @param {CellCoords} coords Visual coords of the freshly selected cell.\n * @param {Number} rowTransformDir `-1` if trying to select a cell with a negative row index. `0` otherwise.\n * @param {Number} colTransformDir `-1` if trying to select a cell with a negative column index. `0` otherwise.\n */\n'afterModifyTransformEnd',\n\n/**\n * Fired inside the `viewportRowCalculatorOverride` method. Allows modifying the row calculator parameters.\n *\n * @event Hooks#afterViewportRowCalculatorOverride\n * @param {Object} calc The row calculator.\n */\n'afterViewportRowCalculatorOverride',\n\n/**\n * Fired inside the `viewportColumnCalculatorOverride` method. Allows modifying the row calculator parameters.\n *\n * @event Hooks#afterViewportColumnCalculatorOverride\n * @param {Object} calc The row calculator.\n */\n'afterViewportColumnCalculatorOverride',\n\n/**\n * Fired after initializing all the plugins.\n *\n * @event Hooks#afterPluginsInitialized\n */\n'afterPluginsInitialized',\n\n/**\n * Used when saving/loading the manual row heights state.\n *\n * @event Hooks#manualRowHeights\n * @param {Array} state The current manual row heights state.\n */\n'manualRowHeights',\n\n/**\n * Used to skip the length cache calculation for a defined period of time.\n *\n * @event Hooks#skipLengthCache\n * @param {Number} delay The delay in milliseconds.\n */\n'skipLengthCache',\n\n/**\n * Fired after trimming rows in the TrimRows plugin.\n *\n * @pro\n * @event Hooks#afterTrimRow\n * @param {Array} rows Physical indexes of trimmed rows.\n */\n'afterTrimRow',\n\n/**\n * Fired after untrimming rows in the TrimRows plugin.\n *\n * @pro\n * @event Hooks#afterUntrimRow\n * @param {Array} rows Physical indexes of untrimmed rows.\n */\n'afterUntrimRow',\n\n/**\n * Fired before opening the dropdown menu.\n *\n * @pro\n * @event Hooks#beforeDropdownMenuShow\n * @param {DropdownMenu} instance The DropdownMenu instance.\n */\n'beforeDropdownMenuShow',\n\n/**\n * Fired after opening the dropdown menu.\n *\n * @pro\n * @event Hooks#afterDropdownMenuShow\n * @param {DropdownMenu} instance The DropdownMenu instance.\n */\n'afterDropdownMenuShow',\n\n/**\n * Fired after hiding the dropdown menu.\n *\n * @pro\n * @event Hooks#afterDropdownMenuHide\n * @param {DropdownMenu} instance The DropdownMenu instance.\n */\n'afterDropdownMenuHide',\n\n/**\n * Used to check whether the provided row index is hidden.\n *\n * @pro\n * @event Hooks#hiddenRow\n * @param {Number} row The visual row index in question.\n */\n'hiddenRow',\n\n/**\n * Used to check whether the provided column index is hidden.\n *\n * @pro\n * @event Hooks#hiddenColumn\n * @param {Number} column The visual column index in question.\n */\n'hiddenColumn',\n\n/**\n * Fired before adding a children to the NestedRows structure.\n *\n * @pro\n * @event Hooks#beforeAddChild\n * @param {Object} parent The parent object.\n * @param {Object|undefined} element The element added as a child. If `undefined`, a blank child was added.\n * @param {Number|undefined} index The index within the parent where the new child was added. If `undefined`, the element was added as the last child.\n */\n'beforeAddChild',\n\n/**\n * Fired after adding a children to the NestedRows structure.\n *\n * @pro\n * @event Hooks#afterAddChild\n * @param {Object} parent The parent object.\n * @param {Object|undefined} element The element added as a child. If `undefined`, a blank child was added.\n * @param {Number|undefined} index The index within the parent where the new child was added. If `undefined`, the element was added as the last child.\n */\n'afterAddChild',\n\n/**\n * Fired before detaching a child from its parent in the NestedRows plugin.\n *\n * @pro\n * @event Hooks#beforeDetachChild\n * @param {Object} parent An object representing the parent from which the element is to be detached.\n * @param {Object} element The detached element.\n */\n'beforeDetachChild',\n\n/**\n * Fired after detaching a child from its parent in the NestedRows plugin.\n *\n * @pro\n * @event Hooks#afterDetachChild\n * @param {Object} parent An object representing the parent from which the element was detached.\n * @param {Object} element The detached element.\n */\n'afterDetachChild',\n\n/**\n * Fired after the editor is opened and rendered.\n *\n * @event Hooks#afterBeginEditing\n * @param {Number} row Row index of the edited cell.\n * @param {Number} column Column index of the edited cell.\n */\n'afterBeginEditing',\n\n/**\n * Fired before cell merging.\n *\n * @event Hooks#beforeMergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'beforeMergeCells',\n\n/**\n * Fired after cell merging.\n *\n * @event Hooks#afterMergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {Object} mergeParent The parent collection of the provided cell range.\n * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'afterMergeCells',\n\n/**\n * Fired before unmerging the cells.\n *\n * @event Hooks#beforeUnmergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'beforeUnmergeCells',\n\n/**\n * Fired after unmerging the cells.\n *\n * @event Hooks#beforeUnmergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'afterUnmergeCells',\n\n/**\n * Fired after the listening is turned on.\n *\n * @event Hooks#afterListen\n * @since 0.34.5\n */\n'afterListen',\n\n/**\n * Fired after the listening is turned off.\n *\n * @event Hooks#afterUnlisten\n * @since 0.34.5\n */\n'afterUnlisten'];\n\nvar Hooks = function () {\n  _createClass(Hooks, null, [{\n    key: 'getSingleton',\n    value: function getSingleton() {\n      return globalSingleton;\n    }\n\n    /**\n     *\n     */\n\n  }]);\n\n  function Hooks() {\n    _classCallCheck(this, Hooks);\n\n    this.globalBucket = this.createEmptyBucket();\n  }\n\n  /**\n   * Returns a new object with empty handlers related to every registered hook name.\n   *\n   * @returns {Object} The empty bucket object.\n   *\n   * @example\n   * ```js\n   * Handsontable.hooks.createEmptyBucket();\n   * // Results:\n   * {\n   * ...\n   * afterCreateCol: [],\n   * afterCreateRow: [],\n   * beforeInit: [],\n   * ...\n   * }\n   * ```\n   */\n\n\n  _createClass(Hooks, [{\n    key: 'createEmptyBucket',\n    value: function createEmptyBucket() {\n      var bucket = Object.create(null);\n\n      // eslint-disable-next-line no-return-assign\n      (0, _array.arrayEach)(REGISTERED_HOOKS, function (hook) {\n        return bucket[hook] = [];\n      });\n\n      return bucket;\n    }\n\n    /**\n     * Get hook bucket based on the context of the object or if argument is `undefined`, get the global hook bucket.\n     *\n     * @param {Object} [context=null] A Handsontable instance.\n     * @returns {Object} Returns a global or Handsontable instance bucket.\n     */\n\n  }, {\n    key: 'getBucket',\n    value: function getBucket() {\n      var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      if (context) {\n        if (!context.pluginHookBucket) {\n          context.pluginHookBucket = this.createEmptyBucket();\n        }\n\n        return context.pluginHookBucket;\n      }\n\n      return this.globalBucket;\n    }\n\n    /**\n     * Adds a listener (globally or locally) to a specified hook name.\n     * If the `context` parameter is provided, the hook will be added only to the instance it references.\n     * Otherwise, the callback will be used everytime the hook fires on any Handsontable instance.\n     * You can provide an array of callback functions as the `callback` argument, this way they will all be fired\n     * once the hook is triggered.\n     *\n     * @see Core#addHook\n     * @param {String} key Hook name.\n     * @param {Function|Array} callback Callback function or an array of functions.\n     * @param {Object} [context=null] The context for the hook callback to be added - a Handsontable instance or leave empty.\n     * @returns {Hooks} Instance of Hooks.\n     *\n     * @example\n     * ```js\n     * // single callback, added locally\n     * Handsontable.hooks.add('beforeInit', myCallback, hotInstance);\n     *\n     * // single callback, added globally\n     * Handsontable.hooks.add('beforeInit', myCallback);\n     *\n     * // multiple callbacks, added locally\n     * Handsontable.hooks.add('beforeInit', [myCallback, anotherCallback], hotInstance);\n     *\n     * // multiple callbacks, added globally\n     * Handsontable.hooks.add('beforeInit', [myCallback, anotherCallback]);\n     * ```\n     */\n\n  }, {\n    key: 'add',\n    value: function add(key, callback) {\n      var _this = this;\n\n      var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n      if (Array.isArray(callback)) {\n        (0, _array.arrayEach)(callback, function (c) {\n          return _this.add(key, c, context);\n        });\n      } else {\n        var bucket = this.getBucket(context);\n\n        if (typeof bucket[key] === 'undefined') {\n          this.register(key);\n          bucket[key] = [];\n        }\n        callback.skip = false;\n\n        if (bucket[key].indexOf(callback) === -1) {\n          // only add a hook if it has not already been added (adding the same hook twice is now silently ignored)\n          var foundInitialHook = false;\n\n          if (callback.initialHook) {\n            (0, _array.arrayEach)(bucket[key], function (cb, i) {\n              if (cb.initialHook) {\n                bucket[key][i] = callback;\n                foundInitialHook = true;\n\n                return false;\n              }\n            });\n          }\n\n          if (!foundInitialHook) {\n            bucket[key].push(callback);\n          }\n        }\n      }\n\n      return this;\n    }\n\n    /**\n     * Adds a listener to a specified hook. After the hook runs this listener will be automatically removed from the bucket.\n     *\n     * @see Core#addHookOnce\n     * @param {String} key Hook/Event name.\n     * @param {Function|Array} callback Callback function.\n     * @param {Object} [context=null] A Handsontable instance.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.once('beforeInit', myCallback, hotInstance);\n     * ```\n     */\n\n  }, {\n    key: 'once',\n    value: function once(key, callback) {\n      var _this2 = this;\n\n      var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n      if (Array.isArray(callback)) {\n        (0, _array.arrayEach)(callback, function (c) {\n          return _this2.once(key, c, context);\n        });\n      } else {\n        callback.runOnce = true;\n        this.add(key, callback, context);\n      }\n    }\n\n    /**\n     * Removes a listener from a hook with a given name. If the `context` argument is provided, it removes a listener from a local hook assigned to the given Handsontable instance.\n     *\n     * @see Core#removeHook\n     * @param {String} key Hook/Event name.\n     * @param {Function} callback Callback function (needs the be the function that was previously added to the hook).\n     * @param {Object} [context=null] Handsontable instance.\n     * @return {Boolean} Returns `true` if hook was removed, `false` otherwise.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.remove('beforeInit', myCallback);\n     * ```\n     */\n\n  }, {\n    key: 'remove',\n    value: function remove(key, callback) {\n      var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n      var bucket = this.getBucket(context);\n\n      if (typeof bucket[key] !== 'undefined') {\n        if (bucket[key].indexOf(callback) >= 0) {\n          callback.skip = true;\n\n          return true;\n        }\n      }\n\n      return false;\n    }\n\n    /**\n     * Checks whether there are any registered listeners for the provided hook name.\n     * If the `context` parameter is provided, it only checks for listeners assigned to the given Handsontable instance.\n     *\n     * @param {String} key Hook name.\n     * @param {Object} [context=null] A Handsontable instance.\n     * @returns {Boolean} `true` for success, `false` otherwise.\n     */\n\n  }, {\n    key: 'has',\n    value: function has(key) {\n      var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n      var bucket = this.getBucket(context);\n\n      return !!(bucket[key] !== void 0 && bucket[key].length);\n    }\n\n    /**\n     * Runs all local and global callbacks assigned to the hook identified by the `key` parameter.\n     * It returns either a return value from the last called callback or the first parameter (`p1`) passed to the `run` function.\n     *\n     * @see Core#runHooks\n     * @param {Object} context Handsontable instance.\n     * @param {String} key Hook/Event name.\n     * @param {*} [p1] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p2] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p3] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p4] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p5] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p6] Parameter to be passed as an argument to the callback function.\n     * @returns {*} Either a return value from the last called callback or `p1`.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.run(hot, 'beforeInit');\n     * ```\n     */\n\n  }, {\n    key: 'run',\n    value: function run(context, key, p1, p2, p3, p4, p5, p6) {\n      {\n        var globalHandlers = this.globalBucket[key];\n        var index = -1;\n        var length = globalHandlers ? globalHandlers.length : 0;\n\n        if (length) {\n          // Do not optimise this loop with arrayEach or arrow function! If you do You'll decrease perf because of GC.\n          while (++index < length) {\n            if (!globalHandlers[index] || globalHandlers[index].skip) {\n              /* eslint-disable no-continue */\n              continue;\n            }\n            // performance considerations - http://jsperf.com/call-vs-apply-for-a-plugin-architecture\n            var res = globalHandlers[index].call(context, p1, p2, p3, p4, p5, p6);\n\n            if (res !== void 0) {\n              p1 = res;\n            }\n            if (globalHandlers[index] && globalHandlers[index].runOnce) {\n              this.remove(key, globalHandlers[index]);\n            }\n          }\n        }\n      }\n      {\n        var localHandlers = this.getBucket(context)[key];\n        var _index = -1;\n        var _length = localHandlers ? localHandlers.length : 0;\n\n        if (_length) {\n          // Do not optimise this loop with arrayEach or arrow function! If you do You'll decrease perf because of GC.\n          while (++_index < _length) {\n            if (!localHandlers[_index] || localHandlers[_index].skip) {\n              /* eslint-disable no-continue */\n              continue;\n            }\n            // performance considerations - http://jsperf.com/call-vs-apply-for-a-plugin-architecture\n            var _res = localHandlers[_index].call(context, p1, p2, p3, p4, p5, p6);\n\n            if (_res !== void 0) {\n              p1 = _res;\n            }\n            if (localHandlers[_index] && localHandlers[_index].runOnce) {\n              this.remove(key, localHandlers[_index], context);\n            }\n          }\n        }\n      }\n\n      return p1;\n    }\n\n    /**\n     * Destroy all listeners connected to the context. If no context is provided, the global listeners will be destroyed.\n     *\n     * @param {Object} [context=null] A Handsontable instance.\n     * @example\n     * ```js\n     * // destroy the global listeners\n     * Handsontable.hooks.destroy();\n     *\n     * // destroy the local listeners\n     * Handsontable.hooks.destroy(hotInstance);\n     * ```\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      // eslint-disable-next-line no-return-assign\n      (0, _object.objectEach)(this.getBucket(context), function (value, key, bucket) {\n        return bucket[key].length = 0;\n      });\n    }\n\n    /**\n     * Registers a hook name (adds it to the list of the known hook names). Used by plugins.\n     * It is not necessary to call register, but if you use it, your plugin hook will be used returned by\n     * the `getRegistered` method. (which itself is used in the demo http://docs.handsontable.com/tutorial-callbacks.html).\n     *\n     * @param key {String} The hook name.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.register('myHook');\n     * ```\n     */\n\n  }, {\n    key: 'register',\n    value: function register(key) {\n      if (!this.isRegistered(key)) {\n        REGISTERED_HOOKS.push(key);\n      }\n    }\n\n    /**\n     * Deregisters a hook name (removes it from the list of known hook names).\n     *\n     * @param key {String} Hook name.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.deregister('myHook');\n     * ```\n     */\n\n  }, {\n    key: 'deregister',\n    value: function deregister(key) {\n      if (this.isRegistered(key)) {\n        REGISTERED_HOOKS.splice(REGISTERED_HOOKS.indexOf(key), 1);\n      }\n    }\n\n    /**\n     * Returns a boolean depending on if a hook by such name has been registered.\n     *\n     * @param key {String} Hook name.\n     * @returns {Boolean} `true` for success, `false` otherwise.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.isRegistered('beforeInit');\n     *\n     * // Results:\n     * true\n     * ```\n     */\n\n  }, {\n    key: 'isRegistered',\n    value: function isRegistered(key) {\n      return REGISTERED_HOOKS.indexOf(key) >= 0;\n    }\n\n    /**\n     * Returns an array of registered hooks.\n     *\n     * @returns {Array} An array of registered hooks.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.getRegistered();\n     *\n     * // Results:\n     * [\n     * ...\n     *   'beforeInit',\n     *   'beforeRender',\n     *   'beforeSetRangeEnd',\n     *   'beforeDrawBorders',\n     *   'beforeChange',\n     * ...\n     * ]\n     * ```\n     */\n\n  }, {\n    key: 'getRegistered',\n    value: function getRegistered() {\n      return REGISTERED_HOOKS;\n    }\n  }]);\n\n  return Hooks;\n}();\n\nvar globalSingleton = new Hooks();\n\nexports.default = Hooks;\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _templateObject = _taggedTemplateLiteral(['\\n          Your license key of Handsontable Pro has expired.\\u200C\\u200C\\u200C\\u200C \\n          Renew your maintenance plan at https://handsontable.com or downgrade to the previous version of the software.\\n          '], ['\\n          Your license key of Handsontable Pro has expired.\\u200C\\u200C\\u200C\\u200C\\\\x20\\n          Renew your maintenance plan at https://handsontable.com or downgrade to the previous version of the software.\\n          ']);\n\nexports.stringify = stringify;\nexports.isDefined = isDefined;\nexports.isUndefined = isUndefined;\nexports.isEmpty = isEmpty;\nexports.isRegExp = isRegExp;\nexports._injectProductInfo = _injectProductInfo;\n\nvar _moment = __webpack_require__(41);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _templateLiteralTag = __webpack_require__(42);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\n/**\n * Converts any value to string.\n *\n * @param {*} value\n * @returns {String}\n */\nfunction stringify(value) {\n  var result = void 0;\n\n  switch (typeof value === 'undefined' ? 'undefined' : _typeof(value)) {\n    case 'string':\n    case 'number':\n      result = '' + value;\n      break;\n\n    case 'object':\n      result = value === null ? '' : value.toString();\n      break;\n    case 'undefined':\n      result = '';\n      break;\n    default:\n      result = value.toString();\n      break;\n  }\n\n  return result;\n}\n\n/**\n * Checks if given variable is defined.\n *\n * @param {*} variable Variable to check.\n * @returns {Boolean}\n */\nfunction isDefined(variable) {\n  return typeof variable !== 'undefined';\n}\n\n/**\n * Checks if given variable is undefined.\n *\n * @param {*} variable Variable to check.\n * @returns {Boolean}\n */\nfunction isUndefined(variable) {\n  return typeof variable === 'undefined';\n}\n\n/**\n * Check if given variable is null, empty string or undefined.\n *\n * @param {*} variable Variable to check.\n * @returns {Boolean}\n */\nfunction isEmpty(variable) {\n  return variable === null || variable === '' || isUndefined(variable);\n}\n\n/**\n * Check if given variable is a regular expression.\n *\n * @param {*} variable Variable to check.\n * @returns {Boolean}\n */\nfunction isRegExp(variable) {\n  return Object.prototype.toString.call(variable) === '[object RegExp]';\n}\n\n/* eslint-disable */\nvar _m = '\\x6C\\x65\\x6E\\x67\\x74\\x68';\nvar _hd = function _hd(v) {\n  return parseInt(v, 16);\n};\nvar _pi = function _pi(v) {\n  return parseInt(v, 10);\n};\nvar _ss = function _ss(v, s, l) {\n  return v['\\x73\\x75\\x62\\x73\\x74\\x72'](s, l);\n};\nvar _cp = function _cp(v) {\n  return v['\\x63\\x6F\\x64\\x65\\x50\\x6F\\x69\\x6E\\x74\\x41\\x74'](0) - 65;\n};\nvar _norm = function _norm(v) {\n  return ('' + v).replace(/\\-/g, '');\n};\nvar _extractTime = function _extractTime(v) {\n  return _hd(_ss(_norm(v), _hd('12'), _cp('\\x46'))) / (_hd(_ss(_norm(v), _cp('\\x42'), ~~![][_m])) || 9);\n};\nvar _ignored = function _ignored() {\n  return typeof location !== 'undefined' && /^([a-z0-9\\-]+\\.)?\\x68\\x61\\x6E\\x64\\x73\\x6F\\x6E\\x74\\x61\\x62\\x6C\\x65\\x2E\\x63\\x6F\\x6D$/i.test(location.host);\n};\nvar _notified = false;\n\nfunction _injectProductInfo(key, element) {\n  key = _norm(key || '');\n\n  var warningMessage = '';\n  var showDomMessage = true;\n  var schemaValidity = _checkKeySchema(key);\n  var ignored = _ignored();\n  var trial = isEmpty(key) || key === 'trial';\n\n  if (trial || schemaValidity) {\n    if (schemaValidity) {\n      var releaseTime = Math.floor((0, _moment2.default)('11/04/2018', 'DD/MM/YYYY').toDate().getTime() / 8.64e7);\n      var keyGenTime = _extractTime(key);\n\n      if (keyGenTime > 45000 || keyGenTime !== parseInt(keyGenTime, 10)) {\n        warningMessage = 'The license key provided to Handsontable Pro is invalid. Make sure you pass it correctly.';\n      }\n\n      if (!warningMessage) {\n        if (releaseTime > keyGenTime + 1) {\n          warningMessage = (0, _templateLiteralTag.toSingleLine)(_templateObject);\n        }\n        showDomMessage = releaseTime > keyGenTime + 15;\n      }\n    } else {\n      warningMessage = 'Evaluation version of Handsontable Pro. Not licensed for use in a production environment.';\n    }\n  } else {\n    warningMessage = 'The license key provided to Handsontable Pro is invalid. Make sure you pass it correctly.';\n  }\n  if (ignored) {\n    warningMessage = false;\n    showDomMessage = false;\n  }\n\n  if (warningMessage && !_notified) {\n    console[trial ? 'info' : 'warn'](warningMessage);\n    _notified = true;\n  }\n  if (showDomMessage && element.parentNode) {\n    var message = document.createElement('div');\n\n    message.id = 'hot-display-license-info';\n    message.appendChild(document.createTextNode('Evaluation version of Handsontable Pro.'));\n    message.appendChild(document.createElement('br'));\n    message.appendChild(document.createTextNode('Not licensed for production use.'));\n\n    element.parentNode.insertBefore(message, element.nextSibling);\n  }\n}\n\nfunction _checkKeySchema(v) {\n  var z = [][_m];\n  var p = z;\n\n  if (v[_m] !== _cp('\\x5A')) {\n    return false;\n  }\n\n  for (var c = '', i = '\\x42\\x3C\\x48\\x34\\x50\\x2B'.split(''), j = _cp(i.shift()); j; j = _cp(i.shift() || 'A')) {\n    --j < ''[_m] ? p = p | (_pi('' + _pi(_hd(c) + (_hd(_ss(v, Math.abs(j), 2)) + []).padStart(2, '0'))) % 97 || 2) >> 1 : c = _ss(v, j, !j ? 6 : i[_m] === 1 ? 9 : 8);\n  }\n\n  return p === z;\n}\n/* eslint-enable */\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getRegisteredEditors = exports.getRegisteredEditorNames = exports.hasEditor = exports.getEditorInstance = exports.getEditor = exports.registerEditor = undefined;\nexports.RegisteredEditor = RegisteredEditor;\nexports._getEditorInstance = _getEditorInstance;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _baseEditor = __webpack_require__(54);\n\nvar _baseEditor2 = _interopRequireDefault(_baseEditor);\n\nvar _autocompleteEditor = __webpack_require__(307);\n\nvar _autocompleteEditor2 = _interopRequireDefault(_autocompleteEditor);\n\nvar _checkboxEditor = __webpack_require__(356);\n\nvar _checkboxEditor2 = _interopRequireDefault(_checkboxEditor);\n\nvar _dateEditor = __webpack_require__(357);\n\nvar _dateEditor2 = _interopRequireDefault(_dateEditor);\n\nvar _dropdownEditor = __webpack_require__(360);\n\nvar _dropdownEditor2 = _interopRequireDefault(_dropdownEditor);\n\nvar _handsontableEditor = __webpack_require__(308);\n\nvar _handsontableEditor2 = _interopRequireDefault(_handsontableEditor);\n\nvar _numericEditor = __webpack_require__(361);\n\nvar _numericEditor2 = _interopRequireDefault(_numericEditor);\n\nvar _passwordEditor = __webpack_require__(362);\n\nvar _passwordEditor2 = _interopRequireDefault(_passwordEditor);\n\nvar _selectEditor = __webpack_require__(363);\n\nvar _selectEditor2 = _interopRequireDefault(_selectEditor);\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Utility to register editors and common namespace for keeping reference to all editor classes\n */\nvar registeredEditorClasses = new WeakMap();\n\nvar _staticRegister = (0, _staticRegister3.default)('editors'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem,\n    hasItem = _staticRegister.hasItem,\n    getNames = _staticRegister.getNames,\n    getValues = _staticRegister.getValues;\n\n_register('base', _baseEditor2.default);\n_register('autocomplete', _autocompleteEditor2.default);\n_register('checkbox', _checkboxEditor2.default);\n_register('date', _dateEditor2.default);\n_register('dropdown', _dropdownEditor2.default);\n_register('handsontable', _handsontableEditor2.default);\n_register('numeric', _numericEditor2.default);\n_register('password', _passwordEditor2.default);\n_register('select', _selectEditor2.default);\n_register('text', _textEditor2.default);\n\nfunction RegisteredEditor(editorClass) {\n  var instances = {};\n  var Clazz = editorClass;\n\n  this.getConstructor = function () {\n    return editorClass;\n  };\n\n  this.getInstance = function (hotInstance) {\n    if (!(hotInstance.guid in instances)) {\n      instances[hotInstance.guid] = new Clazz(hotInstance);\n    }\n\n    return instances[hotInstance.guid];\n  };\n\n  _pluginHooks2.default.getSingleton().add('afterDestroy', function () {\n    instances = {};\n  });\n}\n\n/**\n * Returns instance (singleton) of editor class.\n *\n * @param {String} name Name of an editor under which it has been stored.\n * @param {Object} hotInstance Instance of Handsontable.\n * @returns {Function} Returns instance of editor.\n */\nfunction _getEditorInstance(name, hotInstance) {\n  var editor = void 0;\n\n  if (typeof name === 'function') {\n    if (!registeredEditorClasses.get(name)) {\n      _register(null, name);\n    }\n    editor = registeredEditorClasses.get(name);\n  } else if (typeof name === 'string') {\n    editor = getItem(name);\n  } else {\n    throw Error('Only strings and functions can be passed as \"editor\" parameter');\n  }\n\n  if (!editor) {\n    throw Error('No editor registered under name \"' + name + '\"');\n  }\n\n  return editor.getInstance(hotInstance);\n}\n\n/**\n * Retrieve editor class.\n *\n * @param {String} name Editor identification.\n * @returns {Function} Returns editor class.\n */\nfunction _getItem(name) {\n  if (!hasItem(name)) {\n    throw Error('No registered editor found under \"' + name + '\" name');\n  }\n\n  return getItem(name).getConstructor();\n}\n\n/**\n * Register editor class under specified name.\n *\n * @param {String} name Editor identification.\n * @param {Function} editorClass Editor class.\n */\nfunction _register(name, editorClass) {\n  var editorWrapper = new RegisteredEditor(editorClass);\n\n  if (typeof name === 'string') {\n    register(name, editorWrapper);\n  }\n  registeredEditorClasses.set(editorClass, editorWrapper);\n}\n\nexports.registerEditor = _register;\nexports.getEditor = _getItem;\nexports.getEditorInstance = _getEditorInstance;\nexports.hasEditor = hasItem;\nexports.getRegisteredEditorNames = getNames;\nexports.getRegisteredEditors = getValues;\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.normalizeSelection = normalizeSelection;\nexports.isSeparator = isSeparator;\nexports.hasSubMenu = hasSubMenu;\nexports.isDisabled = isDisabled;\nexports.isSelectionDisabled = isSelectionDisabled;\nexports.getValidSelection = getValidSelection;\nexports.prepareVerticalAlignClass = prepareVerticalAlignClass;\nexports.prepareHorizontalAlignClass = prepareHorizontalAlignClass;\nexports.getAlignmentClasses = getAlignmentClasses;\nexports.align = align;\nexports.checkSelectionConsistency = checkSelectionConsistency;\nexports.markLabelAsSelected = markLabelAsSelected;\nexports.isItemHidden = isItemHidden;\nexports.filterSeparators = filterSeparators;\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _element = __webpack_require__(0);\n\nvar _separator = __webpack_require__(93);\n\nfunction normalizeSelection(selRanges) {\n  return (0, _array.arrayMap)(selRanges, function (range) {\n    return {\n      start: range.getTopLeftCorner(),\n      end: range.getBottomRightCorner()\n    };\n  });\n}\n\nfunction isSeparator(cell) {\n  return (0, _element.hasClass)(cell, 'htSeparator');\n}\n\nfunction hasSubMenu(cell) {\n  return (0, _element.hasClass)(cell, 'htSubmenu');\n}\n\nfunction isDisabled(cell) {\n  return (0, _element.hasClass)(cell, 'htDisabled');\n}\n\nfunction isSelectionDisabled(cell) {\n  return (0, _element.hasClass)(cell, 'htSelectionDisabled');\n}\n\nfunction getValidSelection(hot) {\n  var selected = hot.getSelected();\n\n  if (!selected) {\n    return null;\n  }\n  if (selected[0] < 0) {\n    return null;\n  }\n\n  return selected;\n}\n\nfunction prepareVerticalAlignClass(className, alignment) {\n  if (className.indexOf(alignment) != -1) {\n    return className;\n  }\n  className = className.replace('htTop', '').replace('htMiddle', '').replace('htBottom', '').replace('  ', '');\n\n  className += ' ' + alignment;\n\n  return className;\n}\n\nfunction prepareHorizontalAlignClass(className, alignment) {\n  if (className.indexOf(alignment) != -1) {\n    return className;\n  }\n  className = className.replace('htLeft', '').replace('htCenter', '').replace('htRight', '').replace('htJustify', '').replace('  ', '');\n\n  className += ' ' + alignment;\n\n  return className;\n}\n\nfunction getAlignmentClasses(ranges, callback) {\n  var classes = {};\n\n  (0, _array.arrayEach)(ranges, function (_ref) {\n    var from = _ref.from,\n        to = _ref.to;\n\n    for (var row = from.row; row <= to.row; row++) {\n      for (var col = from.col; col <= to.col; col++) {\n        if (!classes[row]) {\n          classes[row] = [];\n        }\n        classes[row][col] = callback(row, col);\n      }\n    }\n  });\n\n  return classes;\n}\n\nfunction align(ranges, type, alignment, cellDescriptor, propertySetter) {\n  (0, _array.arrayEach)(ranges, function (_ref2) {\n    var from = _ref2.from,\n        to = _ref2.to;\n\n    if (from.row == to.row && from.col == to.col) {\n      applyAlignClassName(from.row, from.col, type, alignment, cellDescriptor, propertySetter);\n    } else {\n      for (var row = from.row; row <= to.row; row++) {\n        for (var col = from.col; col <= to.col; col++) {\n          applyAlignClassName(row, col, type, alignment, cellDescriptor, propertySetter);\n        }\n      }\n    }\n  });\n}\n\nfunction applyAlignClassName(row, col, type, alignment, cellDescriptor, propertySetter) {\n  var cellMeta = cellDescriptor(row, col);\n  var className = alignment;\n\n  if (cellMeta.className) {\n    if (type === 'vertical') {\n      className = prepareVerticalAlignClass(cellMeta.className, alignment);\n    } else {\n      className = prepareHorizontalAlignClass(cellMeta.className, alignment);\n    }\n  }\n\n  propertySetter(row, col, 'className', className);\n}\n\nfunction checkSelectionConsistency(ranges, comparator) {\n  var result = false;\n\n  if (Array.isArray(ranges)) {\n    (0, _array.arrayEach)(ranges, function (range) {\n      range.forAll(function (row, col) {\n        if (comparator(row, col)) {\n          result = true;\n\n          return false;\n        }\n      });\n\n      return result;\n    });\n  }\n\n  return result;\n}\n\nfunction markLabelAsSelected(label) {\n  // workaround for https://github.com/handsontable/handsontable/issues/1946\n  return '<span class=\"selected\">' + String.fromCharCode(10003) + '</span>' + label;\n}\n\nfunction isItemHidden(item, instance) {\n  return !item.hidden || !(typeof item.hidden == 'function' && item.hidden.call(instance));\n}\n\nfunction shiftSeparators(items, separator) {\n  var result = items.slice(0);\n\n  for (var i = 0; i < result.length;) {\n    if (result[i].name === separator) {\n      result.shift();\n    } else {\n      break;\n    }\n  }\n  return result;\n}\n\nfunction popSeparators(items, separator) {\n  var result = items.slice(0);\n\n  result.reverse();\n  result = shiftSeparators(result, separator);\n  result.reverse();\n\n  return result;\n}\n\nfunction removeDuplicatedSeparators(items) {\n  var result = [];\n\n  (0, _array.arrayEach)(items, function (value, index) {\n    if (index > 0) {\n      if (result[result.length - 1].name !== value.name) {\n        result.push(value);\n      }\n    } else {\n      result.push(value);\n    }\n  });\n\n  return result;\n}\n\nfunction filterSeparators(items) {\n  var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _separator.KEY;\n\n  var result = items.slice(0);\n\n  result = shiftSeparators(result, separator);\n  result = popSeparators(result, separator);\n  result = removeDuplicatedSeparators(result);\n\n  return result;\n}\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(18);\nvar IE8_DOM_DEFINE = __webpack_require__(98);\nvar toPrimitive = __webpack_require__(73);\nvar dP = Object.defineProperty;\n\nexports.f = __webpack_require__(22) ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return dP(O, P, Attributes);\n  } catch (e) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY_CODES = undefined;\nexports.isPrintableChar = isPrintableChar;\nexports.isMetaKey = isMetaKey;\nexports.isCtrlKey = isCtrlKey;\nexports.isCtrlMetaKey = isCtrlMetaKey;\nexports.isKey = isKey;\n\nvar _array = __webpack_require__(1);\n\nvar KEY_CODES = exports.KEY_CODES = {\n  MOUSE_LEFT: 1,\n  MOUSE_RIGHT: 3,\n  MOUSE_MIDDLE: 2,\n  BACKSPACE: 8,\n  COMMA: 188,\n  INSERT: 45,\n  DELETE: 46,\n  END: 35,\n  ENTER: 13,\n  ESCAPE: 27,\n  CONTROL: 17,\n  COMMAND_LEFT: 91,\n  COMMAND_RIGHT: 93,\n  COMMAND_FIREFOX: 224,\n  ALT: 18,\n  HOME: 36,\n  PAGE_DOWN: 34,\n  PAGE_UP: 33,\n  PERIOD: 190,\n  SPACE: 32,\n  SHIFT: 16,\n  CAPS_LOCK: 20,\n  TAB: 9,\n  ARROW_RIGHT: 39,\n  ARROW_LEFT: 37,\n  ARROW_UP: 38,\n  ARROW_DOWN: 40,\n  F1: 112,\n  F2: 113,\n  F3: 114,\n  F4: 115,\n  F5: 116,\n  F6: 117,\n  F7: 118,\n  F8: 119,\n  F9: 120,\n  F10: 121,\n  F11: 122,\n  F12: 123,\n  A: 65,\n  X: 88,\n  C: 67,\n  V: 86\n};\n\n/**\n * Returns true if keyCode represents a printable character.\n *\n * @param {Number} keyCode\n * @returns {Boolean}\n */\nfunction isPrintableChar(keyCode) {\n  return keyCode == 32 || // space\n  keyCode >= 48 && keyCode <= 57 || // 0-9\n  keyCode >= 96 && keyCode <= 111 || // numpad\n  keyCode >= 186 && keyCode <= 192 || // ;=,-./`\n  keyCode >= 219 && keyCode <= 222 || // []{}\\|\"'\n  keyCode >= 226 || // special chars (229 for Asian chars)\n  keyCode >= 65 && keyCode <= 90; // a-z\n}\n\n/**\n * @param {Number} keyCode\n * @returns {Boolean}\n */\nfunction isMetaKey(keyCode) {\n  var metaKeys = [KEY_CODES.ARROW_DOWN, KEY_CODES.ARROW_UP, KEY_CODES.ARROW_LEFT, KEY_CODES.ARROW_RIGHT, KEY_CODES.HOME, KEY_CODES.END, KEY_CODES.DELETE, KEY_CODES.BACKSPACE, KEY_CODES.F1, KEY_CODES.F2, KEY_CODES.F3, KEY_CODES.F4, KEY_CODES.F5, KEY_CODES.F6, KEY_CODES.F7, KEY_CODES.F8, KEY_CODES.F9, KEY_CODES.F10, KEY_CODES.F11, KEY_CODES.F12, KEY_CODES.TAB, KEY_CODES.PAGE_DOWN, KEY_CODES.PAGE_UP, KEY_CODES.ENTER, KEY_CODES.ESCAPE, KEY_CODES.SHIFT, KEY_CODES.CAPS_LOCK, KEY_CODES.ALT];\n\n  return metaKeys.indexOf(keyCode) !== -1;\n}\n\n/**\n * Checks if passed key code is ctrl or cmd key. Depends on what OS the code runs it check key code based on\n * different meta key codes.\n *\n * @param {Number} keyCode Key code to check.\n * @returns {Boolean}\n */\nfunction isCtrlKey(keyCode) {\n  var keys = [];\n\n  if (window.navigator.platform.includes('Mac')) {\n    keys.push(KEY_CODES.COMMAND_LEFT, KEY_CODES.COMMAND_RIGHT, KEY_CODES.COMMAND_FIREFOX);\n  } else {\n    keys.push(KEY_CODES.CONTROL);\n  }\n\n  return keys.includes(keyCode);\n}\n\n/**\n * Checks if passed key code is ctrl or cmd key. This helper checks if the key code matches to meta keys\n * regardless of the OS on which it is running.\n *\n * @param {Number} keyCode Key code to check.\n * @returns {Boolean}\n */\nfunction isCtrlMetaKey(keyCode) {\n  return [KEY_CODES.CONTROL, KEY_CODES.COMMAND_LEFT, KEY_CODES.COMMAND_RIGHT, KEY_CODES.COMMAND_FIREFOX].includes(keyCode);\n}\n\n/**\n * @param {Number} keyCode\n * @param {String} baseCode\n * @returns {Boolean}\n */\nfunction isKey(keyCode, baseCode) {\n  var keys = baseCode.split('|');\n  var result = false;\n\n  (0, _array.arrayEach)(keys, function (key) {\n    if (keyCode === KEY_CODES[key]) {\n      result = true;\n\n      return false;\n    }\n  });\n\n  return result;\n}\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(23)(function () {\n  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(75);\nvar defined = __webpack_require__(38);\nmodule.exports = function (it) {\n  return IObject(defined(it));\n};\n\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.15 ToLength\nvar toInteger = __webpack_require__(59);\nvar min = Math.min;\nmodule.exports = function (it) {\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// most Object methods by ES6 should accept primitives\nvar $export = __webpack_require__(3);\nvar core = __webpack_require__(45);\nvar fails = __webpack_require__(23);\nmodule.exports = function (KEY, exec) {\n  var fn = (core.Object || {})[KEY] || Object[KEY];\n  var exp = {};\n  exp[KEY] = exec(fn);\n  $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.isIE8 = isIE8;\nexports.isIE9 = isIE9;\nexports.isSafari = isSafari;\nexports.isChrome = isChrome;\nexports.isMobileBrowser = isMobileBrowser;\nvar _isIE8 = !document.createTextNode('test').textContent;\n\nfunction isIE8() {\n  return _isIE8;\n}\n\nvar _isIE9 = !!document.documentMode;\n\nfunction isIE9() {\n  return _isIE9;\n}\n\nvar _isSafari = /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);\n\nfunction isSafari() {\n  return _isSafari;\n}\n\nvar _isChrome = /Chrome/.test(navigator.userAgent) && /Google/.test(navigator.vendor);\n\nfunction isChrome() {\n  return _isChrome;\n}\n\nfunction isMobileBrowser(userAgent) {\n  if (!userAgent) {\n    userAgent = navigator.userAgent;\n  }\n\n  return (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent)\n  );\n}\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getRegisteredValidators = exports.getRegisteredValidatorNames = exports.hasValidator = exports.getValidator = exports.registerValidator = undefined;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _autocompleteValidator = __webpack_require__(372);\n\nvar _autocompleteValidator2 = _interopRequireDefault(_autocompleteValidator);\n\nvar _dateValidator = __webpack_require__(373);\n\nvar _dateValidator2 = _interopRequireDefault(_dateValidator);\n\nvar _numericValidator = __webpack_require__(374);\n\nvar _numericValidator2 = _interopRequireDefault(_numericValidator);\n\nvar _timeValidator = __webpack_require__(375);\n\nvar _timeValidator2 = _interopRequireDefault(_timeValidator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _staticRegister = (0, _staticRegister3.default)('validators'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem,\n    hasItem = _staticRegister.hasItem,\n    getNames = _staticRegister.getNames,\n    getValues = _staticRegister.getValues;\n\nregister('autocomplete', _autocompleteValidator2.default);\nregister('date', _dateValidator2.default);\nregister('numeric', _numericValidator2.default);\nregister('time', _timeValidator2.default);\n\n/**\n * Retrieve validator function.\n *\n * @param {String} name Validator identification.\n * @returns {Function} Returns validator function.\n */\nfunction _getItem(name) {\n  if (typeof name === 'function') {\n    return name;\n  }\n  if (!hasItem(name)) {\n    throw Error('No registered validator found under \"' + name + '\" name');\n  }\n\n  return getItem(name);\n}\n\nexports.registerValidator = register;\nexports.getValidator = _getItem;\nexports.hasValidator = hasItem;\nexports.getRegisteredValidatorNames = getNames;\nexports.getRegisteredValidators = getValues;\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports) {\n\nvar hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar hide = __webpack_require__(31);\nvar has = __webpack_require__(29);\nvar SRC = __webpack_require__(49)('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\n__webpack_require__(45).inspectSource = function (it) {\n  return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n  var isFunction = typeof val == 'function';\n  if (isFunction) has(val, 'name') || hide(val, 'name', key);\n  if (O[key] === val) return;\n  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n  if (O === global) {\n    O[key] = val;\n  } else if (!safe) {\n    delete O[key];\n    hide(O, key, val);\n  } else if (O[key]) {\n    O[key] = val;\n  } else {\n    hide(O, key, val);\n  }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n  return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(20);\nvar createDesc = __webpack_require__(50);\nmodule.exports = __webpack_require__(22) ? function (object, key, value) {\n  return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// optional / simple context binding\nvar aFunction = __webpack_require__(62);\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n  switch (length) {\n    case 1: return function (a) {\n      return fn.call(that, a);\n    };\n    case 2: return function (a, b) {\n      return fn.call(that, a, b);\n    };\n    case 3: return function (a, b, c) {\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(38);\nmodule.exports = function (it) {\n  return Object(defined(it));\n};\n\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar META = __webpack_require__(49)('meta');\nvar isObject = __webpack_require__(9);\nvar has = __webpack_require__(29);\nvar setDesc = __webpack_require__(20).f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n  return true;\n};\nvar FREEZE = !__webpack_require__(23)(function () {\n  return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n  setDesc(it, META, { value: {\n    i: 'O' + ++id, // object ID\n    w: {}          // weak collections IDs\n  } });\n};\nvar fastKey = function (it, create) {\n  // return primitive with prefix\n  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return 'F';\n    // not necessary to add metadata\n    if (!create) return 'E';\n    // add missing metadata\n    setMeta(it);\n  // return object ID\n  } return it[META].i;\n};\nvar getWeak = function (it, create) {\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return true;\n    // not necessary to add metadata\n    if (!create) return false;\n    // add missing metadata\n    setMeta(it);\n  // return hash weak collections IDs\n  } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n  return it;\n};\nvar meta = module.exports = {\n  KEY: META,\n  NEED: false,\n  fastKey: fastKey,\n  getWeak: getWeak,\n  onFreeze: onFreeze\n};\n\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _core = __webpack_require__(179);\n\nvar _core2 = _interopRequireDefault(_core);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar registeredOverlays = {};\n\n/**\n * Creates an overlay over the original Walkontable instance. The overlay renders the clone of the original Walkontable\n * and (optionally) implements behavior needed for native horizontal and vertical scrolling.\n *\n * @class Overlay\n */\n\nvar Overlay = function () {\n  _createClass(Overlay, null, [{\n    key: 'registerOverlay',\n\n\n    /**\n     * Register overlay class.\n     *\n     * @param {String} type Overlay type, one of the CLONE_TYPES value\n     * @param {Overlay} overlayClass Overlay class extended from base overlay class {@link Overlay}\n     */\n    value: function registerOverlay(type, overlayClass) {\n      if (Overlay.CLONE_TYPES.indexOf(type) === -1) {\n        throw new Error('Unsupported overlay (' + type + ').');\n      }\n      registeredOverlays[type] = overlayClass;\n    }\n\n    /**\n     * Create new instance of overlay type.\n     *\n     * @param {String} type Overlay type, one of the CLONE_TYPES value\n     * @param {Walkontable} wot Walkontable instance\n     */\n\n  }, {\n    key: 'createOverlay',\n    value: function createOverlay(type, wot) {\n      return new registeredOverlays[type](wot);\n    }\n\n    /**\n     * Check if specified overlay was registered.\n     *\n     * @param {String} type Overlay type, one of the CLONE_TYPES value\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasOverlay',\n    value: function hasOverlay(type) {\n      return registeredOverlays[type] !== void 0;\n    }\n\n    /**\n     * Checks if overlay object (`overlay`) is instance of overlay type (`type`).\n     *\n     * @param {Overlay} overlay Overlay object\n     * @param {String} type Overlay type, one of the CLONE_TYPES value\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isOverlayTypeOf',\n    value: function isOverlayTypeOf(overlay, type) {\n      if (!overlay || !registeredOverlays[type]) {\n        return false;\n      }\n\n      return overlay instanceof registeredOverlays[type];\n    }\n\n    /**\n     * @param {Walkontable} wotInstance\n     */\n\n  }, {\n    key: 'CLONE_TOP',\n\n    /**\n     * @type {String}\n     */\n    get: function get() {\n      return 'top';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_BOTTOM',\n    get: function get() {\n      return 'bottom';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_LEFT',\n    get: function get() {\n      return 'left';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_TOP_LEFT_CORNER',\n    get: function get() {\n      return 'top_left_corner';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_BOTTOM_LEFT_CORNER',\n    get: function get() {\n      return 'bottom_left_corner';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_DEBUG',\n    get: function get() {\n      return 'debug';\n    }\n\n    /**\n     * List of all availables clone types\n     *\n     * @type {Array}\n     */\n\n  }, {\n    key: 'CLONE_TYPES',\n    get: function get() {\n      return [Overlay.CLONE_TOP, Overlay.CLONE_BOTTOM, Overlay.CLONE_LEFT, Overlay.CLONE_TOP_LEFT_CORNER, Overlay.CLONE_BOTTOM_LEFT_CORNER, Overlay.CLONE_DEBUG];\n    }\n  }]);\n\n  function Overlay(wotInstance) {\n    _classCallCheck(this, Overlay);\n\n    (0, _object.defineGetter)(this, 'wot', wotInstance, {\n      writable: false\n    });\n\n    // legacy support, deprecated in the future\n    this.instance = this.wot;\n\n    this.type = '';\n    this.mainTableScrollableElement = null;\n    this.TABLE = this.wot.wtTable.TABLE;\n    this.hider = this.wot.wtTable.hider;\n    this.spreader = this.wot.wtTable.spreader;\n    this.holder = this.wot.wtTable.holder;\n    this.wtRootElement = this.wot.wtTable.wtRootElement;\n    this.trimmingContainer = (0, _element.getTrimmingContainer)(this.hider.parentNode.parentNode);\n    this.areElementSizesAdjusted = false;\n    this.updateStateOfRendering();\n  }\n\n  /**\n   * Update internal state of object with an information about the need of full rendering of the overlay.\n   *\n   * @returns {Boolean} Returns `true` if the state has changed since the last check.\n   */\n\n\n  _createClass(Overlay, [{\n    key: 'updateStateOfRendering',\n    value: function updateStateOfRendering() {\n      var previousState = this.needFullRender;\n\n      this.needFullRender = this.shouldBeRendered();\n\n      var changed = previousState !== this.needFullRender;\n\n      if (changed && !this.needFullRender) {\n        this.reset();\n      }\n\n      return changed;\n    }\n\n    /**\n     * Checks if overlay should be fully rendered\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'shouldBeRendered',\n    value: function shouldBeRendered() {\n      return true;\n    }\n\n    /**\n     * Update the trimming container.\n     */\n\n  }, {\n    key: 'updateTrimmingContainer',\n    value: function updateTrimmingContainer() {\n      this.trimmingContainer = (0, _element.getTrimmingContainer)(this.hider.parentNode.parentNode);\n    }\n\n    /**\n     * Update the main scrollable element.\n     */\n\n  }, {\n    key: 'updateMainScrollableElement',\n    value: function updateMainScrollableElement() {\n      this.mainTableScrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);\n    }\n\n    /**\n     * Make a clone of table for overlay\n     *\n     * @param {String} direction Can be `Overlay.CLONE_TOP`, `Overlay.CLONE_LEFT`,\n     *                           `Overlay.CLONE_TOP_LEFT_CORNER`, `Overlay.CLONE_DEBUG`\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'makeClone',\n    value: function makeClone(direction) {\n      if (Overlay.CLONE_TYPES.indexOf(direction) === -1) {\n        throw new Error('Clone type \"' + direction + '\" is not supported.');\n      }\n      var clone = document.createElement('DIV');\n      var clonedTable = document.createElement('TABLE');\n\n      clone.className = 'ht_clone_' + direction + ' handsontable';\n      clone.style.position = 'absolute';\n      clone.style.top = 0;\n      clone.style.left = 0;  //.right = 0 for RTL\n      clone.style.overflow = 'hidden';\n\n      clonedTable.className = this.wot.wtTable.TABLE.className;\n      clone.appendChild(clonedTable);\n\n      this.type = direction;\n      this.wot.wtTable.wtRootElement.parentNode.appendChild(clone);\n\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (preventOverflow === true || preventOverflow === 'horizontal' && this.type === Overlay.CLONE_TOP || preventOverflow === 'vertical' && this.type === Overlay.CLONE_LEFT) {\n        this.mainTableScrollableElement = window;\n      } else {\n        this.mainTableScrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);\n      }\n\n      return new _core2.default({\n        cloneSource: this.wot,\n        cloneOverlay: this,\n        table: clonedTable\n      });\n    }\n\n    /**\n     * Refresh/Redraw overlay\n     *\n     * @param {Boolean} [fastDraw=false]\n     */\n\n  }, {\n    key: 'refresh',\n    value: function refresh() {\n      var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      // When hot settings are changed we allow to refresh overlay once before blocking\n      var nextCycleRenderFlag = this.shouldBeRendered();\n\n      if (this.clone && (this.needFullRender || nextCycleRenderFlag)) {\n        this.clone.draw(fastDraw);\n      }\n      this.needFullRender = nextCycleRenderFlag;\n    }\n\n    /**\n     * Reset overlay styles to initial values.\n     */\n\n  }, {\n    key: 'reset',\n    value: function reset() {\n      if (!this.clone) {\n        return;\n      }\n      var holder = this.clone.wtTable.holder;\n      var hider = this.clone.wtTable.hider;\n      var holderStyle = holder.style;\n      var hidderStyle = hider.style;\n      var rootStyle = holder.parentNode.style;\n\n      (0, _array.arrayEach)([holderStyle, hidderStyle, rootStyle], function (style) {\n        style.width = '';\n        style.height = '';\n      });\n    }\n\n    /**\n     * Destroy overlay instance\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      new _eventManager2.default(this.clone).destroy();\n    }\n  }]);\n\n  return Overlay;\n}();\n\nexports.default = Overlay;\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.toUpperCaseFirst = toUpperCaseFirst;\nexports.equalsIgnoreCase = equalsIgnoreCase;\nexports.randomString = randomString;\nexports.isPercentValue = isPercentValue;\nexports.substitute = substitute;\nexports.stripTags = stripTags;\n\nvar _mixed = __webpack_require__(16);\n\nvar _number = __webpack_require__(5);\n\n/**\n * Convert string to upper case first letter.\n *\n * @param {String} string String to convert.\n * @returns {String}\n */\nfunction toUpperCaseFirst(string) {\n  return string[0].toUpperCase() + string.substr(1);\n}\n\n/**\n * Compare strings case insensitively.\n *\n * @param {...String} strings Strings to compare.\n * @returns {Boolean}\n */\nfunction equalsIgnoreCase() {\n  var unique = [];\n\n  for (var _len = arguments.length, strings = Array(_len), _key = 0; _key < _len; _key++) {\n    strings[_key] = arguments[_key];\n  }\n\n  var length = strings.length;\n\n  while (length--) {\n    var string = (0, _mixed.stringify)(strings[length]).toLowerCase();\n\n    if (unique.indexOf(string) === -1) {\n      unique.push(string);\n    }\n  }\n\n  return unique.length === 1;\n}\n\n/**\n * Generates a random hex string. Used as namespace for Handsontable instance events.\n *\n * @return {String} Returns 16-long character random string (eq. `'92b1bfc74ec4'`).\n */\nfunction randomString() {\n  function s4() {\n    return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n  }\n\n  return s4() + s4() + s4() + s4();\n}\n\n/**\n * Checks if value is valid percent.\n *\n * @param {String} value\n * @returns {Boolean}\n */\nfunction isPercentValue(value) {\n  return (/^([0-9][0-9]?%$)|(^100%$)/.test(value)\n  );\n}\n\n/**\n * Substitute strings placed beetwen square brackets into value defined in `variables` object. String names defined in\n * square brackets must be the same as property name of `variables` object.\n *\n * @param {String} template Template string.\n * @param {Object} variables Object which contains all available values which can be injected into template.\n * @returns {String}\n */\nfunction substitute(template) {\n  var variables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  return ('' + template).replace(/(?:\\\\)?\\[([^[\\]]+)]/g, function (match, name) {\n    if (match.charAt(0) === '\\\\') {\n      return match.substr(1, match.length - 1);\n    }\n\n    return variables[name] === void 0 ? '' : variables[name];\n  });\n}\n\nvar STRIP_TAGS_REGEX = /<\\/?\\w+\\/?>|<\\w+[\\s|/][^>]*>/gi;\n\n/**\n * Strip any HTML tag from the string.\n *\n * @param  {String} string String to cut HTML from.\n * @return {String}\n */\nfunction stripTags(string) {\n  string += '';\n\n  return string.replace(STRIP_TAGS_REGEX, '');\n}\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(99);\nvar enumBugKeys = __webpack_require__(78);\n\nmodule.exports = Object.keys || function keys(O) {\n  return $keys(O, enumBugKeys);\n};\n\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports) {\n\n// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = staticRegister;\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar collection = exports.collection = new Map();\n\nfunction staticRegister() {\n  var namespace = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'common';\n\n  if (!collection.has(namespace)) {\n    collection.set(namespace, new Map());\n  }\n  var subCollection = collection.get(namespace);\n\n  /**\n   * Register an item to the collection. If the item under the same was exist earlier then this item will be replaced with new one.\n   *\n   * @param {String} name Identification of the item.\n   * @param {*} item Item to save in the collection.\n   */\n  function register(name, item) {\n    subCollection.set(name, item);\n  }\n\n  /**\n   * Retrieve the item from the collection.\n   *\n   * @param {String} name Identification of the item.\n   * @returns {*} Returns item which was saved in the collection.\n   */\n  function getItem(name) {\n    return subCollection.get(name);\n  }\n\n  /**\n   * Check if item under specyfied name is exists.\n   *\n   * @param {String} name Identification of the item.\n   * @returns {Boolean} Returns `true` or `false` depends on if element exists in the collection.\n   */\n  function hasItem(name) {\n    return subCollection.has(name);\n  }\n\n  /**\n   * Retrieve list of names registered from the collection.\n   *\n   * @returns {Array} Returns an array of strings with all names under which objects are stored.\n   */\n  function getNames() {\n    return [].concat(_toConsumableArray(subCollection.keys()));\n  }\n\n  /**\n   * Retrieve all registered values from the collection.\n   *\n   * @returns {Array} Returns an array with all values stored in the collection.\n   */\n  function getValues() {\n    return [].concat(_toConsumableArray(subCollection.values()));\n  }\n\n  return {\n    register: register,\n    getItem: getItem,\n    hasItem: hasItem,\n    getNames: getNames,\n    getValues: getValues\n  };\n}\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.requestAnimationFrame = requestAnimationFrame;\nexports.cancelAnimationFrame = cancelAnimationFrame;\nexports.isTouchSupported = isTouchSupported;\nexports.isWebComponentSupportedNatively = isWebComponentSupportedNatively;\nexports.hasCaptionProblem = hasCaptionProblem;\nexports.getComparisonFunction = getComparisonFunction;\n// https://gist.github.com/paulirish/1579671\nvar lastTime = 0;\nvar vendors = ['ms', 'moz', 'webkit', 'o'];\nvar _requestAnimationFrame = window.requestAnimationFrame;\nvar _cancelAnimationFrame = window.cancelAnimationFrame;\n\nfor (var x = 0; x < vendors.length && !_requestAnimationFrame; ++x) {\n  _requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\n  _cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!_requestAnimationFrame) {\n  _requestAnimationFrame = function _requestAnimationFrame(callback) {\n    var currTime = new Date().getTime();\n    var timeToCall = Math.max(0, 16 - (currTime - lastTime));\n    var id = window.setTimeout(function () {\n      callback(currTime + timeToCall);\n    }, timeToCall);\n    lastTime = currTime + timeToCall;\n\n    return id;\n  };\n}\n\nif (!_cancelAnimationFrame) {\n  _cancelAnimationFrame = function _cancelAnimationFrame(id) {\n    clearTimeout(id);\n  };\n}\n\n/**\n * Polyfill for requestAnimationFrame\n *\n * @param {Function} callback\n * @returns {Number}\n */\nfunction requestAnimationFrame(callback) {\n  return _requestAnimationFrame.call(window, callback);\n}\n\n/**\n * Polyfill for cancelAnimationFrame\n *\n * @param {Number} id\n */\nfunction cancelAnimationFrame(id) {\n  _cancelAnimationFrame.call(window, id);\n}\n\nfunction isTouchSupported() {\n  return 'ontouchstart' in window;\n}\n\n/**\n * Checks if browser is support web components natively\n *\n * @returns {Boolean}\n */\nfunction isWebComponentSupportedNatively() {\n  var test = document.createElement('div');\n\n  return !!(test.createShadowRoot && test.createShadowRoot.toString().match(/\\[native code\\]/));\n}\n\nvar _hasCaptionProblem;\n\nfunction detectCaptionProblem() {\n  var TABLE = document.createElement('TABLE');\n  TABLE.style.borderSpacing = 0;\n  TABLE.style.borderWidth = 0;\n  TABLE.style.padding = 0;\n  var TBODY = document.createElement('TBODY');\n  TABLE.appendChild(TBODY);\n  TBODY.appendChild(document.createElement('TR'));\n  TBODY.firstChild.appendChild(document.createElement('TD'));\n  TBODY.firstChild.firstChild.innerHTML = '<tr><td>t<br>t</td></tr>';\n\n  var CAPTION = document.createElement('CAPTION');\n  CAPTION.innerHTML = 'c<br>c<br>c<br>c';\n  CAPTION.style.padding = 0;\n  CAPTION.style.margin = 0;\n  TABLE.insertBefore(CAPTION, TBODY);\n\n  document.body.appendChild(TABLE);\n  _hasCaptionProblem = TABLE.offsetHeight < 2 * TABLE.lastChild.offsetHeight; // boolean\n  document.body.removeChild(TABLE);\n}\n\nfunction hasCaptionProblem() {\n  if (_hasCaptionProblem === void 0) {\n    detectCaptionProblem();\n  }\n\n  return _hasCaptionProblem;\n}\n\nvar comparisonFunction = void 0;\n\n/**\n * Get string comparison function for sorting purposes. It supports multilingual string comparison base on Internationalization API.\n *\n * @param {String} [language]\n * @param {Object} [options]\n * @returns {*}\n */\nfunction getComparisonFunction(language) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (comparisonFunction) {\n    return comparisonFunction;\n  }\n\n  if ((typeof Intl === 'undefined' ? 'undefined' : _typeof(Intl)) === 'object') {\n    comparisonFunction = new Intl.Collator(language, options).compare;\n  } else if (typeof String.prototype.localeCompare === 'function') {\n    comparisonFunction = function comparisonFunction(a, b) {\n      return ('' + a).localeCompare(b);\n    };\n  } else {\n    comparisonFunction = function comparisonFunction(a, b) {\n      if (a === b) {\n        return 0;\n      }\n\n      return a > b ? -1 : 1;\n    };\n  }\n\n  return comparisonFunction;\n}\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(module) {var require;//! moment.js\n//! version : 2.20.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n;(function (global, factory) {\n     true ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, (function () { 'use strict';\n\nvar hookCallback;\n\nfunction hooks () {\n    return hookCallback.apply(null, arguments);\n}\n\n// This is done to register the method called with moment()\n// without creating circular dependencies.\nfunction setHookCallback (callback) {\n    hookCallback = callback;\n}\n\nfunction isArray(input) {\n    return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n}\n\nfunction isObject(input) {\n    // IE8 will treat undefined and null as object if it wasn't for\n    // input != null\n    return input != null && Object.prototype.toString.call(input) === '[object Object]';\n}\n\nfunction isObjectEmpty(obj) {\n    if (Object.getOwnPropertyNames) {\n        return (Object.getOwnPropertyNames(obj).length === 0);\n    } else {\n        var k;\n        for (k in obj) {\n            if (obj.hasOwnProperty(k)) {\n                return false;\n            }\n        }\n        return true;\n    }\n}\n\nfunction isUndefined(input) {\n    return input === void 0;\n}\n\nfunction isNumber(input) {\n    return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n}\n\nfunction isDate(input) {\n    return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n}\n\nfunction map(arr, fn) {\n    var res = [], i;\n    for (i = 0; i < arr.length; ++i) {\n        res.push(fn(arr[i], i));\n    }\n    return res;\n}\n\nfunction hasOwnProp(a, b) {\n    return Object.prototype.hasOwnProperty.call(a, b);\n}\n\nfunction extend(a, b) {\n    for (var i in b) {\n        if (hasOwnProp(b, i)) {\n            a[i] = b[i];\n        }\n    }\n\n    if (hasOwnProp(b, 'toString')) {\n        a.toString = b.toString;\n    }\n\n    if (hasOwnProp(b, 'valueOf')) {\n        a.valueOf = b.valueOf;\n    }\n\n    return a;\n}\n\nfunction createUTC (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, true).utc();\n}\n\nfunction defaultParsingFlags() {\n    // We need to deep clone this object.\n    return {\n        empty           : false,\n        unusedTokens    : [],\n        unusedInput     : [],\n        overflow        : -2,\n        charsLeftOver   : 0,\n        nullInput       : false,\n        invalidMonth    : null,\n        invalidFormat   : false,\n        userInvalidated : false,\n        iso             : false,\n        parsedDateParts : [],\n        meridiem        : null,\n        rfc2822         : false,\n        weekdayMismatch : false\n    };\n}\n\nfunction getParsingFlags(m) {\n    if (m._pf == null) {\n        m._pf = defaultParsingFlags();\n    }\n    return m._pf;\n}\n\nvar some;\nif (Array.prototype.some) {\n    some = Array.prototype.some;\n} else {\n    some = function (fun) {\n        var t = Object(this);\n        var len = t.length >>> 0;\n\n        for (var i = 0; i < len; i++) {\n            if (i in t && fun.call(this, t[i], i, t)) {\n                return true;\n            }\n        }\n\n        return false;\n    };\n}\n\nfunction isValid(m) {\n    if (m._isValid == null) {\n        var flags = getParsingFlags(m);\n        var parsedParts = some.call(flags.parsedDateParts, function (i) {\n            return i != null;\n        });\n        var isNowValid = !isNaN(m._d.getTime()) &&\n            flags.overflow < 0 &&\n            !flags.empty &&\n            !flags.invalidMonth &&\n            !flags.invalidWeekday &&\n            !flags.weekdayMismatch &&\n            !flags.nullInput &&\n            !flags.invalidFormat &&\n            !flags.userInvalidated &&\n            (!flags.meridiem || (flags.meridiem && parsedParts));\n\n        if (m._strict) {\n            isNowValid = isNowValid &&\n                flags.charsLeftOver === 0 &&\n                flags.unusedTokens.length === 0 &&\n                flags.bigHour === undefined;\n        }\n\n        if (Object.isFrozen == null || !Object.isFrozen(m)) {\n            m._isValid = isNowValid;\n        }\n        else {\n            return isNowValid;\n        }\n    }\n    return m._isValid;\n}\n\nfunction createInvalid (flags) {\n    var m = createUTC(NaN);\n    if (flags != null) {\n        extend(getParsingFlags(m), flags);\n    }\n    else {\n        getParsingFlags(m).userInvalidated = true;\n    }\n\n    return m;\n}\n\n// Plugins that add properties should also add the key here (null value),\n// so we can properly clone ourselves.\nvar momentProperties = hooks.momentProperties = [];\n\nfunction copyConfig(to, from) {\n    var i, prop, val;\n\n    if (!isUndefined(from._isAMomentObject)) {\n        to._isAMomentObject = from._isAMomentObject;\n    }\n    if (!isUndefined(from._i)) {\n        to._i = from._i;\n    }\n    if (!isUndefined(from._f)) {\n        to._f = from._f;\n    }\n    if (!isUndefined(from._l)) {\n        to._l = from._l;\n    }\n    if (!isUndefined(from._strict)) {\n        to._strict = from._strict;\n    }\n    if (!isUndefined(from._tzm)) {\n        to._tzm = from._tzm;\n    }\n    if (!isUndefined(from._isUTC)) {\n        to._isUTC = from._isUTC;\n    }\n    if (!isUndefined(from._offset)) {\n        to._offset = from._offset;\n    }\n    if (!isUndefined(from._pf)) {\n        to._pf = getParsingFlags(from);\n    }\n    if (!isUndefined(from._locale)) {\n        to._locale = from._locale;\n    }\n\n    if (momentProperties.length > 0) {\n        for (i = 0; i < momentProperties.length; i++) {\n            prop = momentProperties[i];\n            val = from[prop];\n            if (!isUndefined(val)) {\n                to[prop] = val;\n            }\n        }\n    }\n\n    return to;\n}\n\nvar updateInProgress = false;\n\n// Moment prototype object\nfunction Moment(config) {\n    copyConfig(this, config);\n    this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n    if (!this.isValid()) {\n        this._d = new Date(NaN);\n    }\n    // Prevent infinite loop in case updateOffset creates new moment\n    // objects.\n    if (updateInProgress === false) {\n        updateInProgress = true;\n        hooks.updateOffset(this);\n        updateInProgress = false;\n    }\n}\n\nfunction isMoment (obj) {\n    return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n}\n\nfunction absFloor (number) {\n    if (number < 0) {\n        // -0 -> 0\n        return Math.ceil(number) || 0;\n    } else {\n        return Math.floor(number);\n    }\n}\n\nfunction toInt(argumentForCoercion) {\n    var coercedNumber = +argumentForCoercion,\n        value = 0;\n\n    if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n        value = absFloor(coercedNumber);\n    }\n\n    return value;\n}\n\n// compare two arrays, return the number of differences\nfunction compareArrays(array1, array2, dontConvert) {\n    var len = Math.min(array1.length, array2.length),\n        lengthDiff = Math.abs(array1.length - array2.length),\n        diffs = 0,\n        i;\n    for (i = 0; i < len; i++) {\n        if ((dontConvert && array1[i] !== array2[i]) ||\n            (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n            diffs++;\n        }\n    }\n    return diffs + lengthDiff;\n}\n\nfunction warn(msg) {\n    if (hooks.suppressDeprecationWarnings === false &&\n            (typeof console !==  'undefined') && console.warn) {\n        console.warn('Deprecation warning: ' + msg);\n    }\n}\n\nfunction deprecate(msg, fn) {\n    var firstTime = true;\n\n    return extend(function () {\n        if (hooks.deprecationHandler != null) {\n            hooks.deprecationHandler(null, msg);\n        }\n        if (firstTime) {\n            var args = [];\n            var arg;\n            for (var i = 0; i < arguments.length; i++) {\n                arg = '';\n                if (typeof arguments[i] === 'object') {\n                    arg += '\\n[' + i + '] ';\n                    for (var key in arguments[0]) {\n                        arg += key + ': ' + arguments[0][key] + ', ';\n                    }\n                    arg = arg.slice(0, -2); // Remove trailing comma and space\n                } else {\n                    arg = arguments[i];\n                }\n                args.push(arg);\n            }\n            warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n            firstTime = false;\n        }\n        return fn.apply(this, arguments);\n    }, fn);\n}\n\nvar deprecations = {};\n\nfunction deprecateSimple(name, msg) {\n    if (hooks.deprecationHandler != null) {\n        hooks.deprecationHandler(name, msg);\n    }\n    if (!deprecations[name]) {\n        warn(msg);\n        deprecations[name] = true;\n    }\n}\n\nhooks.suppressDeprecationWarnings = false;\nhooks.deprecationHandler = null;\n\nfunction isFunction(input) {\n    return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n}\n\nfunction set (config) {\n    var prop, i;\n    for (i in config) {\n        prop = config[i];\n        if (isFunction(prop)) {\n            this[i] = prop;\n        } else {\n            this['_' + i] = prop;\n        }\n    }\n    this._config = config;\n    // Lenient ordinal parsing accepts just a number in addition to\n    // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n    // TODO: Remove \"ordinalParse\" fallback in next major release.\n    this._dayOfMonthOrdinalParseLenient = new RegExp(\n        (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n            '|' + (/\\d{1,2}/).source);\n}\n\nfunction mergeConfigs(parentConfig, childConfig) {\n    var res = extend({}, parentConfig), prop;\n    for (prop in childConfig) {\n        if (hasOwnProp(childConfig, prop)) {\n            if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n                res[prop] = {};\n                extend(res[prop], parentConfig[prop]);\n                extend(res[prop], childConfig[prop]);\n            } else if (childConfig[prop] != null) {\n                res[prop] = childConfig[prop];\n            } else {\n                delete res[prop];\n            }\n        }\n    }\n    for (prop in parentConfig) {\n        if (hasOwnProp(parentConfig, prop) &&\n                !hasOwnProp(childConfig, prop) &&\n                isObject(parentConfig[prop])) {\n            // make sure changes to properties don't modify parent config\n            res[prop] = extend({}, res[prop]);\n        }\n    }\n    return res;\n}\n\nfunction Locale(config) {\n    if (config != null) {\n        this.set(config);\n    }\n}\n\nvar keys;\n\nif (Object.keys) {\n    keys = Object.keys;\n} else {\n    keys = function (obj) {\n        var i, res = [];\n        for (i in obj) {\n            if (hasOwnProp(obj, i)) {\n                res.push(i);\n            }\n        }\n        return res;\n    };\n}\n\nvar defaultCalendar = {\n    sameDay : '[Today at] LT',\n    nextDay : '[Tomorrow at] LT',\n    nextWeek : 'dddd [at] LT',\n    lastDay : '[Yesterday at] LT',\n    lastWeek : '[Last] dddd [at] LT',\n    sameElse : 'L'\n};\n\nfunction calendar (key, mom, now) {\n    var output = this._calendar[key] || this._calendar['sameElse'];\n    return isFunction(output) ? output.call(mom, now) : output;\n}\n\nvar defaultLongDateFormat = {\n    LTS  : 'h:mm:ss A',\n    LT   : 'h:mm A',\n    L    : 'MM/DD/YYYY',\n    LL   : 'MMMM D, YYYY',\n    LLL  : 'MMMM D, YYYY h:mm A',\n    LLLL : 'dddd, MMMM D, YYYY h:mm A'\n};\n\nfunction longDateFormat (key) {\n    var format = this._longDateFormat[key],\n        formatUpper = this._longDateFormat[key.toUpperCase()];\n\n    if (format || !formatUpper) {\n        return format;\n    }\n\n    this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n        return val.slice(1);\n    });\n\n    return this._longDateFormat[key];\n}\n\nvar defaultInvalidDate = 'Invalid date';\n\nfunction invalidDate () {\n    return this._invalidDate;\n}\n\nvar defaultOrdinal = '%d';\nvar defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\nfunction ordinal (number) {\n    return this._ordinal.replace('%d', number);\n}\n\nvar defaultRelativeTime = {\n    future : 'in %s',\n    past   : '%s ago',\n    s  : 'a few seconds',\n    ss : '%d seconds',\n    m  : 'a minute',\n    mm : '%d minutes',\n    h  : 'an hour',\n    hh : '%d hours',\n    d  : 'a day',\n    dd : '%d days',\n    M  : 'a month',\n    MM : '%d months',\n    y  : 'a year',\n    yy : '%d years'\n};\n\nfunction relativeTime (number, withoutSuffix, string, isFuture) {\n    var output = this._relativeTime[string];\n    return (isFunction(output)) ?\n        output(number, withoutSuffix, string, isFuture) :\n        output.replace(/%d/i, number);\n}\n\nfunction pastFuture (diff, output) {\n    var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n    return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n}\n\nvar aliases = {};\n\nfunction addUnitAlias (unit, shorthand) {\n    var lowerCase = unit.toLowerCase();\n    aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n}\n\nfunction normalizeUnits(units) {\n    return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n}\n\nfunction normalizeObjectUnits(inputObject) {\n    var normalizedInput = {},\n        normalizedProp,\n        prop;\n\n    for (prop in inputObject) {\n        if (hasOwnProp(inputObject, prop)) {\n            normalizedProp = normalizeUnits(prop);\n            if (normalizedProp) {\n                normalizedInput[normalizedProp] = inputObject[prop];\n            }\n        }\n    }\n\n    return normalizedInput;\n}\n\nvar priorities = {};\n\nfunction addUnitPriority(unit, priority) {\n    priorities[unit] = priority;\n}\n\nfunction getPrioritizedUnits(unitsObj) {\n    var units = [];\n    for (var u in unitsObj) {\n        units.push({unit: u, priority: priorities[u]});\n    }\n    units.sort(function (a, b) {\n        return a.priority - b.priority;\n    });\n    return units;\n}\n\nfunction zeroFill(number, targetLength, forceSign) {\n    var absNumber = '' + Math.abs(number),\n        zerosToFill = targetLength - absNumber.length,\n        sign = number >= 0;\n    return (sign ? (forceSign ? '+' : '') : '-') +\n        Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n}\n\nvar formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\nvar localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\nvar formatFunctions = {};\n\nvar formatTokenFunctions = {};\n\n// token:    'M'\n// padded:   ['MM', 2]\n// ordinal:  'Mo'\n// callback: function () { this.month() + 1 }\nfunction addFormatToken (token, padded, ordinal, callback) {\n    var func = callback;\n    if (typeof callback === 'string') {\n        func = function () {\n            return this[callback]();\n        };\n    }\n    if (token) {\n        formatTokenFunctions[token] = func;\n    }\n    if (padded) {\n        formatTokenFunctions[padded[0]] = function () {\n            return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n        };\n    }\n    if (ordinal) {\n        formatTokenFunctions[ordinal] = function () {\n            return this.localeData().ordinal(func.apply(this, arguments), token);\n        };\n    }\n}\n\nfunction removeFormattingTokens(input) {\n    if (input.match(/\\[[\\s\\S]/)) {\n        return input.replace(/^\\[|\\]$/g, '');\n    }\n    return input.replace(/\\\\/g, '');\n}\n\nfunction makeFormatFunction(format) {\n    var array = format.match(formattingTokens), i, length;\n\n    for (i = 0, length = array.length; i < length; i++) {\n        if (formatTokenFunctions[array[i]]) {\n            array[i] = formatTokenFunctions[array[i]];\n        } else {\n            array[i] = removeFormattingTokens(array[i]);\n        }\n    }\n\n    return function (mom) {\n        var output = '', i;\n        for (i = 0; i < length; i++) {\n            output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n        }\n        return output;\n    };\n}\n\n// format date using native date object\nfunction formatMoment(m, format) {\n    if (!m.isValid()) {\n        return m.localeData().invalidDate();\n    }\n\n    format = expandFormat(format, m.localeData());\n    formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n    return formatFunctions[format](m);\n}\n\nfunction expandFormat(format, locale) {\n    var i = 5;\n\n    function replaceLongDateFormatTokens(input) {\n        return locale.longDateFormat(input) || input;\n    }\n\n    localFormattingTokens.lastIndex = 0;\n    while (i >= 0 && localFormattingTokens.test(format)) {\n        format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n        localFormattingTokens.lastIndex = 0;\n        i -= 1;\n    }\n\n    return format;\n}\n\nvar match1         = /\\d/;            //       0 - 9\nvar match2         = /\\d\\d/;          //      00 - 99\nvar match3         = /\\d{3}/;         //     000 - 999\nvar match4         = /\\d{4}/;         //    0000 - 9999\nvar match6         = /[+-]?\\d{6}/;    // -999999 - 999999\nvar match1to2      = /\\d\\d?/;         //       0 - 99\nvar match3to4      = /\\d\\d\\d\\d?/;     //     999 - 9999\nvar match5to6      = /\\d\\d\\d\\d\\d\\d?/; //   99999 - 999999\nvar match1to3      = /\\d{1,3}/;       //       0 - 999\nvar match1to4      = /\\d{1,4}/;       //       0 - 9999\nvar match1to6      = /[+-]?\\d{1,6}/;  // -999999 - 999999\n\nvar matchUnsigned  = /\\d+/;           //       0 - inf\nvar matchSigned    = /[+-]?\\d+/;      //    -inf - inf\n\nvar matchOffset    = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\nvar matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\nvar matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n// any word (or two) characters or numbers including two/three word month in arabic.\n// includes scottish gaelic two word and hyphenated months\nvar matchWord = /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i;\n\n\nvar regexes = {};\n\nfunction addRegexToken (token, regex, strictRegex) {\n    regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n        return (isStrict && strictRegex) ? strictRegex : regex;\n    };\n}\n\nfunction getParseRegexForToken (token, config) {\n    if (!hasOwnProp(regexes, token)) {\n        return new RegExp(unescapeFormat(token));\n    }\n\n    return regexes[token](config._strict, config._locale);\n}\n\n// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\nfunction unescapeFormat(s) {\n    return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n        return p1 || p2 || p3 || p4;\n    }));\n}\n\nfunction regexEscape(s) {\n    return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nvar tokens = {};\n\nfunction addParseToken (token, callback) {\n    var i, func = callback;\n    if (typeof token === 'string') {\n        token = [token];\n    }\n    if (isNumber(callback)) {\n        func = function (input, array) {\n            array[callback] = toInt(input);\n        };\n    }\n    for (i = 0; i < token.length; i++) {\n        tokens[token[i]] = func;\n    }\n}\n\nfunction addWeekParseToken (token, callback) {\n    addParseToken(token, function (input, array, config, token) {\n        config._w = config._w || {};\n        callback(input, config._w, config, token);\n    });\n}\n\nfunction addTimeToArrayFromToken(token, input, config) {\n    if (input != null && hasOwnProp(tokens, token)) {\n        tokens[token](input, config._a, config, token);\n    }\n}\n\nvar YEAR = 0;\nvar MONTH = 1;\nvar DATE = 2;\nvar HOUR = 3;\nvar MINUTE = 4;\nvar SECOND = 5;\nvar MILLISECOND = 6;\nvar WEEK = 7;\nvar WEEKDAY = 8;\n\n// FORMATTING\n\naddFormatToken('Y', 0, 0, function () {\n    var y = this.year();\n    return y <= 9999 ? '' + y : '+' + y;\n});\n\naddFormatToken(0, ['YY', 2], 0, function () {\n    return this.year() % 100;\n});\n\naddFormatToken(0, ['YYYY',   4],       0, 'year');\naddFormatToken(0, ['YYYYY',  5],       0, 'year');\naddFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n// ALIASES\n\naddUnitAlias('year', 'y');\n\n// PRIORITIES\n\naddUnitPriority('year', 1);\n\n// PARSING\n\naddRegexToken('Y',      matchSigned);\naddRegexToken('YY',     match1to2, match2);\naddRegexToken('YYYY',   match1to4, match4);\naddRegexToken('YYYYY',  match1to6, match6);\naddRegexToken('YYYYYY', match1to6, match6);\n\naddParseToken(['YYYYY', 'YYYYYY'], YEAR);\naddParseToken('YYYY', function (input, array) {\n    array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n});\naddParseToken('YY', function (input, array) {\n    array[YEAR] = hooks.parseTwoDigitYear(input);\n});\naddParseToken('Y', function (input, array) {\n    array[YEAR] = parseInt(input, 10);\n});\n\n// HELPERS\n\nfunction daysInYear(year) {\n    return isLeapYear(year) ? 366 : 365;\n}\n\nfunction isLeapYear(year) {\n    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n// HOOKS\n\nhooks.parseTwoDigitYear = function (input) {\n    return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n};\n\n// MOMENTS\n\nvar getSetYear = makeGetSet('FullYear', true);\n\nfunction getIsLeapYear () {\n    return isLeapYear(this.year());\n}\n\nfunction makeGetSet (unit, keepTime) {\n    return function (value) {\n        if (value != null) {\n            set$1(this, unit, value);\n            hooks.updateOffset(this, keepTime);\n            return this;\n        } else {\n            return get(this, unit);\n        }\n    };\n}\n\nfunction get (mom, unit) {\n    return mom.isValid() ?\n        mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n}\n\nfunction set$1 (mom, unit, value) {\n    if (mom.isValid() && !isNaN(value)) {\n        if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {\n            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));\n        }\n        else {\n            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n        }\n    }\n}\n\n// MOMENTS\n\nfunction stringGet (units) {\n    units = normalizeUnits(units);\n    if (isFunction(this[units])) {\n        return this[units]();\n    }\n    return this;\n}\n\n\nfunction stringSet (units, value) {\n    if (typeof units === 'object') {\n        units = normalizeObjectUnits(units);\n        var prioritized = getPrioritizedUnits(units);\n        for (var i = 0; i < prioritized.length; i++) {\n            this[prioritized[i].unit](units[prioritized[i].unit]);\n        }\n    } else {\n        units = normalizeUnits(units);\n        if (isFunction(this[units])) {\n            return this[units](value);\n        }\n    }\n    return this;\n}\n\nfunction mod(n, x) {\n    return ((n % x) + x) % x;\n}\n\nvar indexOf;\n\nif (Array.prototype.indexOf) {\n    indexOf = Array.prototype.indexOf;\n} else {\n    indexOf = function (o) {\n        // I know\n        var i;\n        for (i = 0; i < this.length; ++i) {\n            if (this[i] === o) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\n\nfunction daysInMonth(year, month) {\n    if (isNaN(year) || isNaN(month)) {\n        return NaN;\n    }\n    var modMonth = mod(month, 12);\n    year += (month - modMonth) / 12;\n    return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);\n}\n\n// FORMATTING\n\naddFormatToken('M', ['MM', 2], 'Mo', function () {\n    return this.month() + 1;\n});\n\naddFormatToken('MMM', 0, 0, function (format) {\n    return this.localeData().monthsShort(this, format);\n});\n\naddFormatToken('MMMM', 0, 0, function (format) {\n    return this.localeData().months(this, format);\n});\n\n// ALIASES\n\naddUnitAlias('month', 'M');\n\n// PRIORITY\n\naddUnitPriority('month', 8);\n\n// PARSING\n\naddRegexToken('M',    match1to2);\naddRegexToken('MM',   match1to2, match2);\naddRegexToken('MMM',  function (isStrict, locale) {\n    return locale.monthsShortRegex(isStrict);\n});\naddRegexToken('MMMM', function (isStrict, locale) {\n    return locale.monthsRegex(isStrict);\n});\n\naddParseToken(['M', 'MM'], function (input, array) {\n    array[MONTH] = toInt(input) - 1;\n});\n\naddParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n    var month = config._locale.monthsParse(input, token, config._strict);\n    // if we didn't find a month name, mark the date as invalid.\n    if (month != null) {\n        array[MONTH] = month;\n    } else {\n        getParsingFlags(config).invalidMonth = input;\n    }\n});\n\n// LOCALES\n\nvar MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\nvar defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\nfunction localeMonths (m, format) {\n    if (!m) {\n        return isArray(this._months) ? this._months :\n            this._months['standalone'];\n    }\n    return isArray(this._months) ? this._months[m.month()] :\n        this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nvar defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\nfunction localeMonthsShort (m, format) {\n    if (!m) {\n        return isArray(this._monthsShort) ? this._monthsShort :\n            this._monthsShort['standalone'];\n    }\n    return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n        this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nfunction handleStrictParse(monthName, format, strict) {\n    var i, ii, mom, llc = monthName.toLocaleLowerCase();\n    if (!this._monthsParse) {\n        // this is not used\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n        for (i = 0; i < 12; ++i) {\n            mom = createUTC([2000, i]);\n            this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n            this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'MMM') {\n            ii = indexOf.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'MMM') {\n            ii = indexOf.call(this._shortMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._longMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeMonthsParse (monthName, format, strict) {\n    var i, mom, regex;\n\n    if (this._monthsParseExact) {\n        return handleStrictParse.call(this, monthName, format, strict);\n    }\n\n    if (!this._monthsParse) {\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n    }\n\n    // TODO: add sorting\n    // Sorting makes sure if one month (or abbr) is a prefix of another\n    // see sorting in computeMonthsParse\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        if (strict && !this._longMonthsParse[i]) {\n            this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n            this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n        }\n        if (!strict && !this._monthsParse[i]) {\n            regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n            this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (!strict && this._monthsParse[i].test(monthName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction setMonth (mom, value) {\n    var dayOfMonth;\n\n    if (!mom.isValid()) {\n        // No op\n        return mom;\n    }\n\n    if (typeof value === 'string') {\n        if (/^\\d+$/.test(value)) {\n            value = toInt(value);\n        } else {\n            value = mom.localeData().monthsParse(value);\n            // TODO: Another silent failure?\n            if (!isNumber(value)) {\n                return mom;\n            }\n        }\n    }\n\n    dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n    mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n    return mom;\n}\n\nfunction getSetMonth (value) {\n    if (value != null) {\n        setMonth(this, value);\n        hooks.updateOffset(this, true);\n        return this;\n    } else {\n        return get(this, 'Month');\n    }\n}\n\nfunction getDaysInMonth () {\n    return daysInMonth(this.year(), this.month());\n}\n\nvar defaultMonthsShortRegex = matchWord;\nfunction monthsShortRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsShortStrictRegex;\n        } else {\n            return this._monthsShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsShortRegex')) {\n            this._monthsShortRegex = defaultMonthsShortRegex;\n        }\n        return this._monthsShortStrictRegex && isStrict ?\n            this._monthsShortStrictRegex : this._monthsShortRegex;\n    }\n}\n\nvar defaultMonthsRegex = matchWord;\nfunction monthsRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsStrictRegex;\n        } else {\n            return this._monthsRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            this._monthsRegex = defaultMonthsRegex;\n        }\n        return this._monthsStrictRegex && isStrict ?\n            this._monthsStrictRegex : this._monthsRegex;\n    }\n}\n\nfunction computeMonthsParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom;\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        shortPieces.push(this.monthsShort(mom, ''));\n        longPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.monthsShort(mom, ''));\n    }\n    // Sorting makes sure if one month (or abbr) is a prefix of another it\n    // will match the longer piece.\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 12; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n    }\n    for (i = 0; i < 24; i++) {\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._monthsShortRegex = this._monthsRegex;\n    this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n}\n\nfunction createDate (y, m, d, h, M, s, ms) {\n    // can't just apply() to create a date:\n    // https://stackoverflow.com/q/181348\n    var date = new Date(y, m, d, h, M, s, ms);\n\n    // the date constructor remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n        date.setFullYear(y);\n    }\n    return date;\n}\n\nfunction createUTCDate (y) {\n    var date = new Date(Date.UTC.apply(null, arguments));\n\n    // the Date.UTC function remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n        date.setUTCFullYear(y);\n    }\n    return date;\n}\n\n// start-of-first-week - start-of-year\nfunction firstWeekOffset(year, dow, doy) {\n    var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n        fwd = 7 + dow - doy,\n        // first-week day local weekday -- which local weekday is fwd\n        fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n    return -fwdlw + fwd - 1;\n}\n\n// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\nfunction dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n    var localWeekday = (7 + weekday - dow) % 7,\n        weekOffset = firstWeekOffset(year, dow, doy),\n        dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n        resYear, resDayOfYear;\n\n    if (dayOfYear <= 0) {\n        resYear = year - 1;\n        resDayOfYear = daysInYear(resYear) + dayOfYear;\n    } else if (dayOfYear > daysInYear(year)) {\n        resYear = year + 1;\n        resDayOfYear = dayOfYear - daysInYear(year);\n    } else {\n        resYear = year;\n        resDayOfYear = dayOfYear;\n    }\n\n    return {\n        year: resYear,\n        dayOfYear: resDayOfYear\n    };\n}\n\nfunction weekOfYear(mom, dow, doy) {\n    var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n        week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n        resWeek, resYear;\n\n    if (week < 1) {\n        resYear = mom.year() - 1;\n        resWeek = week + weeksInYear(resYear, dow, doy);\n    } else if (week > weeksInYear(mom.year(), dow, doy)) {\n        resWeek = week - weeksInYear(mom.year(), dow, doy);\n        resYear = mom.year() + 1;\n    } else {\n        resYear = mom.year();\n        resWeek = week;\n    }\n\n    return {\n        week: resWeek,\n        year: resYear\n    };\n}\n\nfunction weeksInYear(year, dow, doy) {\n    var weekOffset = firstWeekOffset(year, dow, doy),\n        weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n    return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n}\n\n// FORMATTING\n\naddFormatToken('w', ['ww', 2], 'wo', 'week');\naddFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n// ALIASES\n\naddUnitAlias('week', 'w');\naddUnitAlias('isoWeek', 'W');\n\n// PRIORITIES\n\naddUnitPriority('week', 5);\naddUnitPriority('isoWeek', 5);\n\n// PARSING\n\naddRegexToken('w',  match1to2);\naddRegexToken('ww', match1to2, match2);\naddRegexToken('W',  match1to2);\naddRegexToken('WW', match1to2, match2);\n\naddWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n    week[token.substr(0, 1)] = toInt(input);\n});\n\n// HELPERS\n\n// LOCALES\n\nfunction localeWeek (mom) {\n    return weekOfYear(mom, this._week.dow, this._week.doy).week;\n}\n\nvar defaultLocaleWeek = {\n    dow : 0, // Sunday is the first day of the week.\n    doy : 6  // The week that contains Jan 1st is the first week of the year.\n};\n\nfunction localeFirstDayOfWeek () {\n    return this._week.dow;\n}\n\nfunction localeFirstDayOfYear () {\n    return this._week.doy;\n}\n\n// MOMENTS\n\nfunction getSetWeek (input) {\n    var week = this.localeData().week(this);\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\nfunction getSetISOWeek (input) {\n    var week = weekOfYear(this, 1, 4).week;\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\n// FORMATTING\n\naddFormatToken('d', 0, 'do', 'day');\n\naddFormatToken('dd', 0, 0, function (format) {\n    return this.localeData().weekdaysMin(this, format);\n});\n\naddFormatToken('ddd', 0, 0, function (format) {\n    return this.localeData().weekdaysShort(this, format);\n});\n\naddFormatToken('dddd', 0, 0, function (format) {\n    return this.localeData().weekdays(this, format);\n});\n\naddFormatToken('e', 0, 0, 'weekday');\naddFormatToken('E', 0, 0, 'isoWeekday');\n\n// ALIASES\n\naddUnitAlias('day', 'd');\naddUnitAlias('weekday', 'e');\naddUnitAlias('isoWeekday', 'E');\n\n// PRIORITY\naddUnitPriority('day', 11);\naddUnitPriority('weekday', 11);\naddUnitPriority('isoWeekday', 11);\n\n// PARSING\n\naddRegexToken('d',    match1to2);\naddRegexToken('e',    match1to2);\naddRegexToken('E',    match1to2);\naddRegexToken('dd',   function (isStrict, locale) {\n    return locale.weekdaysMinRegex(isStrict);\n});\naddRegexToken('ddd',   function (isStrict, locale) {\n    return locale.weekdaysShortRegex(isStrict);\n});\naddRegexToken('dddd',   function (isStrict, locale) {\n    return locale.weekdaysRegex(isStrict);\n});\n\naddWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n    var weekday = config._locale.weekdaysParse(input, token, config._strict);\n    // if we didn't get a weekday name, mark the date as invalid\n    if (weekday != null) {\n        week.d = weekday;\n    } else {\n        getParsingFlags(config).invalidWeekday = input;\n    }\n});\n\naddWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n    week[token] = toInt(input);\n});\n\n// HELPERS\n\nfunction parseWeekday(input, locale) {\n    if (typeof input !== 'string') {\n        return input;\n    }\n\n    if (!isNaN(input)) {\n        return parseInt(input, 10);\n    }\n\n    input = locale.weekdaysParse(input);\n    if (typeof input === 'number') {\n        return input;\n    }\n\n    return null;\n}\n\nfunction parseIsoWeekday(input, locale) {\n    if (typeof input === 'string') {\n        return locale.weekdaysParse(input) % 7 || 7;\n    }\n    return isNaN(input) ? null : input;\n}\n\n// LOCALES\n\nvar defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\nfunction localeWeekdays (m, format) {\n    if (!m) {\n        return isArray(this._weekdays) ? this._weekdays :\n            this._weekdays['standalone'];\n    }\n    return isArray(this._weekdays) ? this._weekdays[m.day()] :\n        this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n}\n\nvar defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\nfunction localeWeekdaysShort (m) {\n    return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n}\n\nvar defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\nfunction localeWeekdaysMin (m) {\n    return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n}\n\nfunction handleStrictParse$1(weekdayName, format, strict) {\n    var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._minWeekdaysParse = [];\n\n        for (i = 0; i < 7; ++i) {\n            mom = createUTC([2000, 1]).day(i);\n            this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n            this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n            this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'dddd') {\n            ii = indexOf.call(this._weekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'dddd') {\n            ii = indexOf.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeWeekdaysParse (weekdayName, format, strict) {\n    var i, mom, regex;\n\n    if (this._weekdaysParseExact) {\n        return handleStrictParse$1.call(this, weekdayName, format, strict);\n    }\n\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._minWeekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._fullWeekdaysParse = [];\n    }\n\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n\n        mom = createUTC([2000, 1]).day(i);\n        if (strict && !this._fullWeekdaysParse[i]) {\n            this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n        }\n        if (!this._weekdaysParse[i]) {\n            regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n            this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction getSetDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n    if (input != null) {\n        input = parseWeekday(input, this.localeData());\n        return this.add(input - day, 'd');\n    } else {\n        return day;\n    }\n}\n\nfunction getSetLocaleDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n    return input == null ? weekday : this.add(input - weekday, 'd');\n}\n\nfunction getSetISODayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n\n    // behaves the same as moment#day except\n    // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n    // as a setter, sunday should belong to the previous week.\n\n    if (input != null) {\n        var weekday = parseIsoWeekday(input, this.localeData());\n        return this.day(this.day() % 7 ? weekday : weekday - 7);\n    } else {\n        return this.day() || 7;\n    }\n}\n\nvar defaultWeekdaysRegex = matchWord;\nfunction weekdaysRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysStrictRegex;\n        } else {\n            return this._weekdaysRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            this._weekdaysRegex = defaultWeekdaysRegex;\n        }\n        return this._weekdaysStrictRegex && isStrict ?\n            this._weekdaysStrictRegex : this._weekdaysRegex;\n    }\n}\n\nvar defaultWeekdaysShortRegex = matchWord;\nfunction weekdaysShortRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysShortStrictRegex;\n        } else {\n            return this._weekdaysShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n            this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n        }\n        return this._weekdaysShortStrictRegex && isStrict ?\n            this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n    }\n}\n\nvar defaultWeekdaysMinRegex = matchWord;\nfunction weekdaysMinRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysMinStrictRegex;\n        } else {\n            return this._weekdaysMinRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n            this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n        }\n        return this._weekdaysMinStrictRegex && isStrict ?\n            this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n    }\n}\n\n\nfunction computeWeekdaysParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom, minp, shortp, longp;\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, 1]).day(i);\n        minp = this.weekdaysMin(mom, '');\n        shortp = this.weekdaysShort(mom, '');\n        longp = this.weekdays(mom, '');\n        minPieces.push(minp);\n        shortPieces.push(shortp);\n        longPieces.push(longp);\n        mixedPieces.push(minp);\n        mixedPieces.push(shortp);\n        mixedPieces.push(longp);\n    }\n    // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n    // will match the longer piece.\n    minPieces.sort(cmpLenRev);\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 7; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._weekdaysShortRegex = this._weekdaysRegex;\n    this._weekdaysMinRegex = this._weekdaysRegex;\n\n    this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n    this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n}\n\n// FORMATTING\n\nfunction hFormat() {\n    return this.hours() % 12 || 12;\n}\n\nfunction kFormat() {\n    return this.hours() || 24;\n}\n\naddFormatToken('H', ['HH', 2], 0, 'hour');\naddFormatToken('h', ['hh', 2], 0, hFormat);\naddFormatToken('k', ['kk', 2], 0, kFormat);\n\naddFormatToken('hmm', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('hmmss', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\naddFormatToken('Hmm', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('Hmmss', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\nfunction meridiem (token, lowercase) {\n    addFormatToken(token, 0, 0, function () {\n        return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n    });\n}\n\nmeridiem('a', true);\nmeridiem('A', false);\n\n// ALIASES\n\naddUnitAlias('hour', 'h');\n\n// PRIORITY\naddUnitPriority('hour', 13);\n\n// PARSING\n\nfunction matchMeridiem (isStrict, locale) {\n    return locale._meridiemParse;\n}\n\naddRegexToken('a',  matchMeridiem);\naddRegexToken('A',  matchMeridiem);\naddRegexToken('H',  match1to2);\naddRegexToken('h',  match1to2);\naddRegexToken('k',  match1to2);\naddRegexToken('HH', match1to2, match2);\naddRegexToken('hh', match1to2, match2);\naddRegexToken('kk', match1to2, match2);\n\naddRegexToken('hmm', match3to4);\naddRegexToken('hmmss', match5to6);\naddRegexToken('Hmm', match3to4);\naddRegexToken('Hmmss', match5to6);\n\naddParseToken(['H', 'HH'], HOUR);\naddParseToken(['k', 'kk'], function (input, array, config) {\n    var kInput = toInt(input);\n    array[HOUR] = kInput === 24 ? 0 : kInput;\n});\naddParseToken(['a', 'A'], function (input, array, config) {\n    config._isPm = config._locale.isPM(input);\n    config._meridiem = input;\n});\naddParseToken(['h', 'hh'], function (input, array, config) {\n    array[HOUR] = toInt(input);\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('Hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n});\naddParseToken('Hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n});\n\n// LOCALES\n\nfunction localeIsPM (input) {\n    // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n    // Using charAt should be more compatible.\n    return ((input + '').toLowerCase().charAt(0) === 'p');\n}\n\nvar defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\nfunction localeMeridiem (hours, minutes, isLower) {\n    if (hours > 11) {\n        return isLower ? 'pm' : 'PM';\n    } else {\n        return isLower ? 'am' : 'AM';\n    }\n}\n\n\n// MOMENTS\n\n// Setting the hour should keep the time, because the user explicitly\n// specified which hour he wants. So trying to maintain the same hour (in\n// a new timezone) makes sense. Adding/subtracting hours does not follow\n// this rule.\nvar getSetHour = makeGetSet('Hours', true);\n\n// months\n// week\n// weekdays\n// meridiem\nvar baseConfig = {\n    calendar: defaultCalendar,\n    longDateFormat: defaultLongDateFormat,\n    invalidDate: defaultInvalidDate,\n    ordinal: defaultOrdinal,\n    dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n    relativeTime: defaultRelativeTime,\n\n    months: defaultLocaleMonths,\n    monthsShort: defaultLocaleMonthsShort,\n\n    week: defaultLocaleWeek,\n\n    weekdays: defaultLocaleWeekdays,\n    weekdaysMin: defaultLocaleWeekdaysMin,\n    weekdaysShort: defaultLocaleWeekdaysShort,\n\n    meridiemParse: defaultLocaleMeridiemParse\n};\n\n// internal storage for locale config files\nvar locales = {};\nvar localeFamilies = {};\nvar globalLocale;\n\nfunction normalizeLocale(key) {\n    return key ? key.toLowerCase().replace('_', '-') : key;\n}\n\n// pick the locale from the array\n// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\nfunction chooseLocale(names) {\n    var i = 0, j, next, locale, split;\n\n    while (i < names.length) {\n        split = normalizeLocale(names[i]).split('-');\n        j = split.length;\n        next = normalizeLocale(names[i + 1]);\n        next = next ? next.split('-') : null;\n        while (j > 0) {\n            locale = loadLocale(split.slice(0, j).join('-'));\n            if (locale) {\n                return locale;\n            }\n            if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n                //the next array item is better than a shallower substring of this one\n                break;\n            }\n            j--;\n        }\n        i++;\n    }\n    return null;\n}\n\nfunction loadLocale(name) {\n    var oldLocale = null;\n    // TODO: Find a better way to register and load all the locales in Node\n    if (!locales[name] && (typeof module !== 'undefined') &&\n            module && module.exports) {\n        try {\n            oldLocale = globalLocale._abbr;\n            var aliasedRequire = require;\n            __webpack_require__(350)(\"./\" + name);\n            getSetGlobalLocale(oldLocale);\n        } catch (e) {}\n    }\n    return locales[name];\n}\n\n// This function will load locale and then set the global locale.  If\n// no arguments are passed in, it will simply return the current global\n// locale key.\nfunction getSetGlobalLocale (key, values) {\n    var data;\n    if (key) {\n        if (isUndefined(values)) {\n            data = getLocale(key);\n        }\n        else {\n            data = defineLocale(key, values);\n        }\n\n        if (data) {\n            // moment.duration._locale = moment._locale = data;\n            globalLocale = data;\n        }\n    }\n\n    return globalLocale._abbr;\n}\n\nfunction defineLocale (name, config) {\n    if (config !== null) {\n        var parentConfig = baseConfig;\n        config.abbr = name;\n        if (locales[name] != null) {\n            deprecateSimple('defineLocaleOverride',\n                    'use moment.updateLocale(localeName, config) to change ' +\n                    'an existing locale. moment.defineLocale(localeName, ' +\n                    'config) should only be used for creating a new locale ' +\n                    'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n            parentConfig = locales[name]._config;\n        } else if (config.parentLocale != null) {\n            if (locales[config.parentLocale] != null) {\n                parentConfig = locales[config.parentLocale]._config;\n            } else {\n                if (!localeFamilies[config.parentLocale]) {\n                    localeFamilies[config.parentLocale] = [];\n                }\n                localeFamilies[config.parentLocale].push({\n                    name: name,\n                    config: config\n                });\n                return null;\n            }\n        }\n        locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n        if (localeFamilies[name]) {\n            localeFamilies[name].forEach(function (x) {\n                defineLocale(x.name, x.config);\n            });\n        }\n\n        // backwards compat for now: also set the locale\n        // make sure we set the locale AFTER all child locales have been\n        // created, so we won't end up with the child locale set.\n        getSetGlobalLocale(name);\n\n\n        return locales[name];\n    } else {\n        // useful for testing\n        delete locales[name];\n        return null;\n    }\n}\n\nfunction updateLocale(name, config) {\n    if (config != null) {\n        var locale, tmpLocale, parentConfig = baseConfig;\n        // MERGE\n        tmpLocale = loadLocale(name);\n        if (tmpLocale != null) {\n            parentConfig = tmpLocale._config;\n        }\n        config = mergeConfigs(parentConfig, config);\n        locale = new Locale(config);\n        locale.parentLocale = locales[name];\n        locales[name] = locale;\n\n        // backwards compat for now: also set the locale\n        getSetGlobalLocale(name);\n    } else {\n        // pass null for config to unupdate, useful for tests\n        if (locales[name] != null) {\n            if (locales[name].parentLocale != null) {\n                locales[name] = locales[name].parentLocale;\n            } else if (locales[name] != null) {\n                delete locales[name];\n            }\n        }\n    }\n    return locales[name];\n}\n\n// returns locale data\nfunction getLocale (key) {\n    var locale;\n\n    if (key && key._locale && key._locale._abbr) {\n        key = key._locale._abbr;\n    }\n\n    if (!key) {\n        return globalLocale;\n    }\n\n    if (!isArray(key)) {\n        //short-circuit everything else\n        locale = loadLocale(key);\n        if (locale) {\n            return locale;\n        }\n        key = [key];\n    }\n\n    return chooseLocale(key);\n}\n\nfunction listLocales() {\n    return keys(locales);\n}\n\nfunction checkOverflow (m) {\n    var overflow;\n    var a = m._a;\n\n    if (a && getParsingFlags(m).overflow === -2) {\n        overflow =\n            a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :\n            a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n            a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n            a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :\n            a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :\n            a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n            -1;\n\n        if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n            overflow = DATE;\n        }\n        if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n            overflow = WEEK;\n        }\n        if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n            overflow = WEEKDAY;\n        }\n\n        getParsingFlags(m).overflow = overflow;\n    }\n\n    return m;\n}\n\n// Pick the first defined of two or three arguments.\nfunction defaults(a, b, c) {\n    if (a != null) {\n        return a;\n    }\n    if (b != null) {\n        return b;\n    }\n    return c;\n}\n\nfunction currentDateArray(config) {\n    // hooks is actually the exported moment object\n    var nowValue = new Date(hooks.now());\n    if (config._useUTC) {\n        return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n    }\n    return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n}\n\n// convert an array to a date.\n// the array should mirror the parameters below\n// note: all values past the year are optional and will default to the lowest possible value.\n// [year, month, day , hour, minute, second, millisecond]\nfunction configFromArray (config) {\n    var i, date, input = [], currentDate, expectedWeekday, yearToUse;\n\n    if (config._d) {\n        return;\n    }\n\n    currentDate = currentDateArray(config);\n\n    //compute day of the year from weeks and weekdays\n    if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n        dayOfYearFromWeekInfo(config);\n    }\n\n    //if the day of the year is set, figure out what it is\n    if (config._dayOfYear != null) {\n        yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n        if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n            getParsingFlags(config)._overflowDayOfYear = true;\n        }\n\n        date = createUTCDate(yearToUse, 0, config._dayOfYear);\n        config._a[MONTH] = date.getUTCMonth();\n        config._a[DATE] = date.getUTCDate();\n    }\n\n    // Default to current date.\n    // * if no year, month, day of month are given, default to today\n    // * if day of month is given, default month and year\n    // * if month is given, default only year\n    // * if year is given, don't default anything\n    for (i = 0; i < 3 && config._a[i] == null; ++i) {\n        config._a[i] = input[i] = currentDate[i];\n    }\n\n    // Zero out whatever was not defaulted, including time\n    for (; i < 7; i++) {\n        config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n    }\n\n    // Check for 24:00:00.000\n    if (config._a[HOUR] === 24 &&\n            config._a[MINUTE] === 0 &&\n            config._a[SECOND] === 0 &&\n            config._a[MILLISECOND] === 0) {\n        config._nextDay = true;\n        config._a[HOUR] = 0;\n    }\n\n    config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n    expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();\n\n    // Apply timezone offset from input. The actual utcOffset can be changed\n    // with parseZone.\n    if (config._tzm != null) {\n        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n    }\n\n    if (config._nextDay) {\n        config._a[HOUR] = 24;\n    }\n\n    // check for mismatching day of week\n    if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {\n        getParsingFlags(config).weekdayMismatch = true;\n    }\n}\n\nfunction dayOfYearFromWeekInfo(config) {\n    var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n    w = config._w;\n    if (w.GG != null || w.W != null || w.E != null) {\n        dow = 1;\n        doy = 4;\n\n        // TODO: We need to take the current isoWeekYear, but that depends on\n        // how we interpret now (local, utc, fixed offset). So create\n        // a now version of current config (take local/utc/offset flags, and\n        // create now).\n        weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n        week = defaults(w.W, 1);\n        weekday = defaults(w.E, 1);\n        if (weekday < 1 || weekday > 7) {\n            weekdayOverflow = true;\n        }\n    } else {\n        dow = config._locale._week.dow;\n        doy = config._locale._week.doy;\n\n        var curWeek = weekOfYear(createLocal(), dow, doy);\n\n        weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n        // Default to current week.\n        week = defaults(w.w, curWeek.week);\n\n        if (w.d != null) {\n            // weekday -- low day numbers are considered next week\n            weekday = w.d;\n            if (weekday < 0 || weekday > 6) {\n                weekdayOverflow = true;\n            }\n        } else if (w.e != null) {\n            // local weekday -- counting starts from begining of week\n            weekday = w.e + dow;\n            if (w.e < 0 || w.e > 6) {\n                weekdayOverflow = true;\n            }\n        } else {\n            // default to begining of week\n            weekday = dow;\n        }\n    }\n    if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n        getParsingFlags(config)._overflowWeeks = true;\n    } else if (weekdayOverflow != null) {\n        getParsingFlags(config)._overflowWeekday = true;\n    } else {\n        temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n        config._a[YEAR] = temp.year;\n        config._dayOfYear = temp.dayOfYear;\n    }\n}\n\n// iso 8601 regex\n// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\nvar extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\nvar basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n\nvar tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\nvar isoDates = [\n    ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n    ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n    ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n    ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n    ['YYYY-DDD', /\\d{4}-\\d{3}/],\n    ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n    ['YYYYYYMMDD', /[+-]\\d{10}/],\n    ['YYYYMMDD', /\\d{8}/],\n    // YYYYMM is NOT allowed by the standard\n    ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n    ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n    ['YYYYDDD', /\\d{7}/]\n];\n\n// iso time formats and regexes\nvar isoTimes = [\n    ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n    ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n    ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n    ['HH:mm', /\\d\\d:\\d\\d/],\n    ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n    ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n    ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n    ['HHmm', /\\d\\d\\d\\d/],\n    ['HH', /\\d\\d/]\n];\n\nvar aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n// date from iso format\nfunction configFromISO(config) {\n    var i, l,\n        string = config._i,\n        match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n        allowTime, dateFormat, timeFormat, tzFormat;\n\n    if (match) {\n        getParsingFlags(config).iso = true;\n\n        for (i = 0, l = isoDates.length; i < l; i++) {\n            if (isoDates[i][1].exec(match[1])) {\n                dateFormat = isoDates[i][0];\n                allowTime = isoDates[i][2] !== false;\n                break;\n            }\n        }\n        if (dateFormat == null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[3]) {\n            for (i = 0, l = isoTimes.length; i < l; i++) {\n                if (isoTimes[i][1].exec(match[3])) {\n                    // match[2] should be 'T' or space\n                    timeFormat = (match[2] || ' ') + isoTimes[i][0];\n                    break;\n                }\n            }\n            if (timeFormat == null) {\n                config._isValid = false;\n                return;\n            }\n        }\n        if (!allowTime && timeFormat != null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[4]) {\n            if (tzRegex.exec(match[4])) {\n                tzFormat = 'Z';\n            } else {\n                config._isValid = false;\n                return;\n            }\n        }\n        config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n        configFromStringAndFormat(config);\n    } else {\n        config._isValid = false;\n    }\n}\n\n// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\nvar rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/;\n\nfunction extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n    var result = [\n        untruncateYear(yearStr),\n        defaultLocaleMonthsShort.indexOf(monthStr),\n        parseInt(dayStr, 10),\n        parseInt(hourStr, 10),\n        parseInt(minuteStr, 10)\n    ];\n\n    if (secondStr) {\n        result.push(parseInt(secondStr, 10));\n    }\n\n    return result;\n}\n\nfunction untruncateYear(yearStr) {\n    var year = parseInt(yearStr, 10);\n    if (year <= 49) {\n        return 2000 + year;\n    } else if (year <= 999) {\n        return 1900 + year;\n    }\n    return year;\n}\n\nfunction preprocessRFC2822(s) {\n    // Remove comments and folding whitespace and replace multiple-spaces with a single space\n    return s.replace(/\\([^)]*\\)|[\\n\\t]/g, ' ').replace(/(\\s\\s+)/g, ' ').trim();\n}\n\nfunction checkWeekday(weekdayStr, parsedInput, config) {\n    if (weekdayStr) {\n        // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n        var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n            weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();\n        if (weekdayProvided !== weekdayActual) {\n            getParsingFlags(config).weekdayMismatch = true;\n            config._isValid = false;\n            return false;\n        }\n    }\n    return true;\n}\n\nvar obsOffsets = {\n    UT: 0,\n    GMT: 0,\n    EDT: -4 * 60,\n    EST: -5 * 60,\n    CDT: -5 * 60,\n    CST: -6 * 60,\n    MDT: -6 * 60,\n    MST: -7 * 60,\n    PDT: -7 * 60,\n    PST: -8 * 60\n};\n\nfunction calculateOffset(obsOffset, militaryOffset, numOffset) {\n    if (obsOffset) {\n        return obsOffsets[obsOffset];\n    } else if (militaryOffset) {\n        // the only allowed military tz is Z\n        return 0;\n    } else {\n        var hm = parseInt(numOffset, 10);\n        var m = hm % 100, h = (hm - m) / 100;\n        return h * 60 + m;\n    }\n}\n\n// date and time from ref 2822 format\nfunction configFromRFC2822(config) {\n    var match = rfc2822.exec(preprocessRFC2822(config._i));\n    if (match) {\n        var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);\n        if (!checkWeekday(match[1], parsedArray, config)) {\n            return;\n        }\n\n        config._a = parsedArray;\n        config._tzm = calculateOffset(match[8], match[9], match[10]);\n\n        config._d = createUTCDate.apply(null, config._a);\n        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n        getParsingFlags(config).rfc2822 = true;\n    } else {\n        config._isValid = false;\n    }\n}\n\n// date from iso format or fallback\nfunction configFromString(config) {\n    var matched = aspNetJsonRegex.exec(config._i);\n\n    if (matched !== null) {\n        config._d = new Date(+matched[1]);\n        return;\n    }\n\n    configFromISO(config);\n    if (config._isValid === false) {\n        delete config._isValid;\n    } else {\n        return;\n    }\n\n    configFromRFC2822(config);\n    if (config._isValid === false) {\n        delete config._isValid;\n    } else {\n        return;\n    }\n\n    // Final attempt, use Input Fallback\n    hooks.createFromInputFallback(config);\n}\n\nhooks.createFromInputFallback = deprecate(\n    'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n    'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n    'discouraged and will be removed in an upcoming major release. Please refer to ' +\n    'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n    function (config) {\n        config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n    }\n);\n\n// constant that refers to the ISO standard\nhooks.ISO_8601 = function () {};\n\n// constant that refers to the RFC 2822 form\nhooks.RFC_2822 = function () {};\n\n// date from string and format string\nfunction configFromStringAndFormat(config) {\n    // TODO: Move this to another part of the creation flow to prevent circular deps\n    if (config._f === hooks.ISO_8601) {\n        configFromISO(config);\n        return;\n    }\n    if (config._f === hooks.RFC_2822) {\n        configFromRFC2822(config);\n        return;\n    }\n    config._a = [];\n    getParsingFlags(config).empty = true;\n\n    // This array is used to make a Date, either with `new Date` or `Date.UTC`\n    var string = '' + config._i,\n        i, parsedInput, tokens, token, skipped,\n        stringLength = string.length,\n        totalParsedInputLength = 0;\n\n    tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n    for (i = 0; i < tokens.length; i++) {\n        token = tokens[i];\n        parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n        // console.log('token', token, 'parsedInput', parsedInput,\n        //         'regex', getParseRegexForToken(token, config));\n        if (parsedInput) {\n            skipped = string.substr(0, string.indexOf(parsedInput));\n            if (skipped.length > 0) {\n                getParsingFlags(config).unusedInput.push(skipped);\n            }\n            string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n            totalParsedInputLength += parsedInput.length;\n        }\n        // don't parse if it's not a known token\n        if (formatTokenFunctions[token]) {\n            if (parsedInput) {\n                getParsingFlags(config).empty = false;\n            }\n            else {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n            addTimeToArrayFromToken(token, parsedInput, config);\n        }\n        else if (config._strict && !parsedInput) {\n            getParsingFlags(config).unusedTokens.push(token);\n        }\n    }\n\n    // add remaining unparsed input length to the string\n    getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n    if (string.length > 0) {\n        getParsingFlags(config).unusedInput.push(string);\n    }\n\n    // clear _12h flag if hour is <= 12\n    if (config._a[HOUR] <= 12 &&\n        getParsingFlags(config).bigHour === true &&\n        config._a[HOUR] > 0) {\n        getParsingFlags(config).bigHour = undefined;\n    }\n\n    getParsingFlags(config).parsedDateParts = config._a.slice(0);\n    getParsingFlags(config).meridiem = config._meridiem;\n    // handle meridiem\n    config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n    configFromArray(config);\n    checkOverflow(config);\n}\n\n\nfunction meridiemFixWrap (locale, hour, meridiem) {\n    var isPm;\n\n    if (meridiem == null) {\n        // nothing to do\n        return hour;\n    }\n    if (locale.meridiemHour != null) {\n        return locale.meridiemHour(hour, meridiem);\n    } else if (locale.isPM != null) {\n        // Fallback\n        isPm = locale.isPM(meridiem);\n        if (isPm && hour < 12) {\n            hour += 12;\n        }\n        if (!isPm && hour === 12) {\n            hour = 0;\n        }\n        return hour;\n    } else {\n        // this is not supposed to happen\n        return hour;\n    }\n}\n\n// date from string and array of format strings\nfunction configFromStringAndArray(config) {\n    var tempConfig,\n        bestMoment,\n\n        scoreToBeat,\n        i,\n        currentScore;\n\n    if (config._f.length === 0) {\n        getParsingFlags(config).invalidFormat = true;\n        config._d = new Date(NaN);\n        return;\n    }\n\n    for (i = 0; i < config._f.length; i++) {\n        currentScore = 0;\n        tempConfig = copyConfig({}, config);\n        if (config._useUTC != null) {\n            tempConfig._useUTC = config._useUTC;\n        }\n        tempConfig._f = config._f[i];\n        configFromStringAndFormat(tempConfig);\n\n        if (!isValid(tempConfig)) {\n            continue;\n        }\n\n        // if there is any input that was not parsed add a penalty for that format\n        currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n        //or tokens\n        currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n        getParsingFlags(tempConfig).score = currentScore;\n\n        if (scoreToBeat == null || currentScore < scoreToBeat) {\n            scoreToBeat = currentScore;\n            bestMoment = tempConfig;\n        }\n    }\n\n    extend(config, bestMoment || tempConfig);\n}\n\nfunction configFromObject(config) {\n    if (config._d) {\n        return;\n    }\n\n    var i = normalizeObjectUnits(config._i);\n    config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n        return obj && parseInt(obj, 10);\n    });\n\n    configFromArray(config);\n}\n\nfunction createFromConfig (config) {\n    var res = new Moment(checkOverflow(prepareConfig(config)));\n    if (res._nextDay) {\n        // Adding is smart enough around DST\n        res.add(1, 'd');\n        res._nextDay = undefined;\n    }\n\n    return res;\n}\n\nfunction prepareConfig (config) {\n    var input = config._i,\n        format = config._f;\n\n    config._locale = config._locale || getLocale(config._l);\n\n    if (input === null || (format === undefined && input === '')) {\n        return createInvalid({nullInput: true});\n    }\n\n    if (typeof input === 'string') {\n        config._i = input = config._locale.preparse(input);\n    }\n\n    if (isMoment(input)) {\n        return new Moment(checkOverflow(input));\n    } else if (isDate(input)) {\n        config._d = input;\n    } else if (isArray(format)) {\n        configFromStringAndArray(config);\n    } else if (format) {\n        configFromStringAndFormat(config);\n    }  else {\n        configFromInput(config);\n    }\n\n    if (!isValid(config)) {\n        config._d = null;\n    }\n\n    return config;\n}\n\nfunction configFromInput(config) {\n    var input = config._i;\n    if (isUndefined(input)) {\n        config._d = new Date(hooks.now());\n    } else if (isDate(input)) {\n        config._d = new Date(input.valueOf());\n    } else if (typeof input === 'string') {\n        configFromString(config);\n    } else if (isArray(input)) {\n        config._a = map(input.slice(0), function (obj) {\n            return parseInt(obj, 10);\n        });\n        configFromArray(config);\n    } else if (isObject(input)) {\n        configFromObject(config);\n    } else if (isNumber(input)) {\n        // from milliseconds\n        config._d = new Date(input);\n    } else {\n        hooks.createFromInputFallback(config);\n    }\n}\n\nfunction createLocalOrUTC (input, format, locale, strict, isUTC) {\n    var c = {};\n\n    if (locale === true || locale === false) {\n        strict = locale;\n        locale = undefined;\n    }\n\n    if ((isObject(input) && isObjectEmpty(input)) ||\n            (isArray(input) && input.length === 0)) {\n        input = undefined;\n    }\n    // object construction must be done this way.\n    // https://github.com/moment/moment/issues/1423\n    c._isAMomentObject = true;\n    c._useUTC = c._isUTC = isUTC;\n    c._l = locale;\n    c._i = input;\n    c._f = format;\n    c._strict = strict;\n\n    return createFromConfig(c);\n}\n\nfunction createLocal (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, false);\n}\n\nvar prototypeMin = deprecate(\n    'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other < this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\nvar prototypeMax = deprecate(\n    'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other > this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\n// Pick a moment m from moments so that m[fn](other) is true for all\n// other. This relies on the function fn to be transitive.\n//\n// moments should either be an array of moment objects or an array, whose\n// first element is an array of moment objects.\nfunction pickBy(fn, moments) {\n    var res, i;\n    if (moments.length === 1 && isArray(moments[0])) {\n        moments = moments[0];\n    }\n    if (!moments.length) {\n        return createLocal();\n    }\n    res = moments[0];\n    for (i = 1; i < moments.length; ++i) {\n        if (!moments[i].isValid() || moments[i][fn](res)) {\n            res = moments[i];\n        }\n    }\n    return res;\n}\n\n// TODO: Use [].sort instead?\nfunction min () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isBefore', args);\n}\n\nfunction max () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isAfter', args);\n}\n\nvar now = function () {\n    return Date.now ? Date.now() : +(new Date());\n};\n\nvar ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\nfunction isDurationValid(m) {\n    for (var key in m) {\n        if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n            return false;\n        }\n    }\n\n    var unitHasDecimal = false;\n    for (var i = 0; i < ordering.length; ++i) {\n        if (m[ordering[i]]) {\n            if (unitHasDecimal) {\n                return false; // only allow non-integers for smallest unit\n            }\n            if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n                unitHasDecimal = true;\n            }\n        }\n    }\n\n    return true;\n}\n\nfunction isValid$1() {\n    return this._isValid;\n}\n\nfunction createInvalid$1() {\n    return createDuration(NaN);\n}\n\nfunction Duration (duration) {\n    var normalizedInput = normalizeObjectUnits(duration),\n        years = normalizedInput.year || 0,\n        quarters = normalizedInput.quarter || 0,\n        months = normalizedInput.month || 0,\n        weeks = normalizedInput.week || 0,\n        days = normalizedInput.day || 0,\n        hours = normalizedInput.hour || 0,\n        minutes = normalizedInput.minute || 0,\n        seconds = normalizedInput.second || 0,\n        milliseconds = normalizedInput.millisecond || 0;\n\n    this._isValid = isDurationValid(normalizedInput);\n\n    // representation for dateAddRemove\n    this._milliseconds = +milliseconds +\n        seconds * 1e3 + // 1000\n        minutes * 6e4 + // 1000 * 60\n        hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n    // Because of dateAddRemove treats 24 hours as different from a\n    // day when working around DST, we need to store them separately\n    this._days = +days +\n        weeks * 7;\n    // It is impossible to translate months into days without knowing\n    // which months you are are talking about, so we have to store\n    // it separately.\n    this._months = +months +\n        quarters * 3 +\n        years * 12;\n\n    this._data = {};\n\n    this._locale = getLocale();\n\n    this._bubble();\n}\n\nfunction isDuration (obj) {\n    return obj instanceof Duration;\n}\n\nfunction absRound (number) {\n    if (number < 0) {\n        return Math.round(-1 * number) * -1;\n    } else {\n        return Math.round(number);\n    }\n}\n\n// FORMATTING\n\nfunction offset (token, separator) {\n    addFormatToken(token, 0, 0, function () {\n        var offset = this.utcOffset();\n        var sign = '+';\n        if (offset < 0) {\n            offset = -offset;\n            sign = '-';\n        }\n        return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n    });\n}\n\noffset('Z', ':');\noffset('ZZ', '');\n\n// PARSING\n\naddRegexToken('Z',  matchShortOffset);\naddRegexToken('ZZ', matchShortOffset);\naddParseToken(['Z', 'ZZ'], function (input, array, config) {\n    config._useUTC = true;\n    config._tzm = offsetFromString(matchShortOffset, input);\n});\n\n// HELPERS\n\n// timezone chunker\n// '+10:00' > ['10',  '00']\n// '-1530'  > ['-15', '30']\nvar chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\nfunction offsetFromString(matcher, string) {\n    var matches = (string || '').match(matcher);\n\n    if (matches === null) {\n        return null;\n    }\n\n    var chunk   = matches[matches.length - 1] || [];\n    var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n    var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n    return minutes === 0 ?\n      0 :\n      parts[0] === '+' ? minutes : -minutes;\n}\n\n// Return a moment from input, that is local/utc/zone equivalent to model.\nfunction cloneWithOffset(input, model) {\n    var res, diff;\n    if (model._isUTC) {\n        res = model.clone();\n        diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n        // Use low-level api, because this fn is low-level api.\n        res._d.setTime(res._d.valueOf() + diff);\n        hooks.updateOffset(res, false);\n        return res;\n    } else {\n        return createLocal(input).local();\n    }\n}\n\nfunction getDateOffset (m) {\n    // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n    // https://github.com/moment/moment/pull/1871\n    return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n}\n\n// HOOKS\n\n// This function will be called whenever a moment is mutated.\n// It is intended to keep the offset in sync with the timezone.\nhooks.updateOffset = function () {};\n\n// MOMENTS\n\n// keepLocalTime = true means only change the timezone, without\n// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n// +0200, so we adjust the time as needed, to be valid.\n//\n// Keeping the time actually adds/subtracts (one hour)\n// from the actual represented time. That is why we call updateOffset\n// a second time. In case it wants us to change the offset again\n// _changeInProgress == true case, then we have to adjust, because\n// there is no such time in the given timezone.\nfunction getSetOffset (input, keepLocalTime, keepMinutes) {\n    var offset = this._offset || 0,\n        localAdjust;\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    if (input != null) {\n        if (typeof input === 'string') {\n            input = offsetFromString(matchShortOffset, input);\n            if (input === null) {\n                return this;\n            }\n        } else if (Math.abs(input) < 16 && !keepMinutes) {\n            input = input * 60;\n        }\n        if (!this._isUTC && keepLocalTime) {\n            localAdjust = getDateOffset(this);\n        }\n        this._offset = input;\n        this._isUTC = true;\n        if (localAdjust != null) {\n            this.add(localAdjust, 'm');\n        }\n        if (offset !== input) {\n            if (!keepLocalTime || this._changeInProgress) {\n                addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n            } else if (!this._changeInProgress) {\n                this._changeInProgress = true;\n                hooks.updateOffset(this, true);\n                this._changeInProgress = null;\n            }\n        }\n        return this;\n    } else {\n        return this._isUTC ? offset : getDateOffset(this);\n    }\n}\n\nfunction getSetZone (input, keepLocalTime) {\n    if (input != null) {\n        if (typeof input !== 'string') {\n            input = -input;\n        }\n\n        this.utcOffset(input, keepLocalTime);\n\n        return this;\n    } else {\n        return -this.utcOffset();\n    }\n}\n\nfunction setOffsetToUTC (keepLocalTime) {\n    return this.utcOffset(0, keepLocalTime);\n}\n\nfunction setOffsetToLocal (keepLocalTime) {\n    if (this._isUTC) {\n        this.utcOffset(0, keepLocalTime);\n        this._isUTC = false;\n\n        if (keepLocalTime) {\n            this.subtract(getDateOffset(this), 'm');\n        }\n    }\n    return this;\n}\n\nfunction setOffsetToParsedOffset () {\n    if (this._tzm != null) {\n        this.utcOffset(this._tzm, false, true);\n    } else if (typeof this._i === 'string') {\n        var tZone = offsetFromString(matchOffset, this._i);\n        if (tZone != null) {\n            this.utcOffset(tZone);\n        }\n        else {\n            this.utcOffset(0, true);\n        }\n    }\n    return this;\n}\n\nfunction hasAlignedHourOffset (input) {\n    if (!this.isValid()) {\n        return false;\n    }\n    input = input ? createLocal(input).utcOffset() : 0;\n\n    return (this.utcOffset() - input) % 60 === 0;\n}\n\nfunction isDaylightSavingTime () {\n    return (\n        this.utcOffset() > this.clone().month(0).utcOffset() ||\n        this.utcOffset() > this.clone().month(5).utcOffset()\n    );\n}\n\nfunction isDaylightSavingTimeShifted () {\n    if (!isUndefined(this._isDSTShifted)) {\n        return this._isDSTShifted;\n    }\n\n    var c = {};\n\n    copyConfig(c, this);\n    c = prepareConfig(c);\n\n    if (c._a) {\n        var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n        this._isDSTShifted = this.isValid() &&\n            compareArrays(c._a, other.toArray()) > 0;\n    } else {\n        this._isDSTShifted = false;\n    }\n\n    return this._isDSTShifted;\n}\n\nfunction isLocal () {\n    return this.isValid() ? !this._isUTC : false;\n}\n\nfunction isUtcOffset () {\n    return this.isValid() ? this._isUTC : false;\n}\n\nfunction isUtc () {\n    return this.isValid() ? this._isUTC && this._offset === 0 : false;\n}\n\n// ASP.NET json date format regex\nvar aspNetRegex = /^(\\-|\\+)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n// and further modified to allow for strings containing both week and day\nvar isoRegex = /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\nfunction createDuration (input, key) {\n    var duration = input,\n        // matching against regexp is expensive, do it on demand\n        match = null,\n        sign,\n        ret,\n        diffRes;\n\n    if (isDuration(input)) {\n        duration = {\n            ms : input._milliseconds,\n            d  : input._days,\n            M  : input._months\n        };\n    } else if (isNumber(input)) {\n        duration = {};\n        if (key) {\n            duration[key] = input;\n        } else {\n            duration.milliseconds = input;\n        }\n    } else if (!!(match = aspNetRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : 1;\n        duration = {\n            y  : 0,\n            d  : toInt(match[DATE])                         * sign,\n            h  : toInt(match[HOUR])                         * sign,\n            m  : toInt(match[MINUTE])                       * sign,\n            s  : toInt(match[SECOND])                       * sign,\n            ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n        };\n    } else if (!!(match = isoRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1;\n        duration = {\n            y : parseIso(match[2], sign),\n            M : parseIso(match[3], sign),\n            w : parseIso(match[4], sign),\n            d : parseIso(match[5], sign),\n            h : parseIso(match[6], sign),\n            m : parseIso(match[7], sign),\n            s : parseIso(match[8], sign)\n        };\n    } else if (duration == null) {// checks for null or undefined\n        duration = {};\n    } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n        diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n        duration = {};\n        duration.ms = diffRes.milliseconds;\n        duration.M = diffRes.months;\n    }\n\n    ret = new Duration(duration);\n\n    if (isDuration(input) && hasOwnProp(input, '_locale')) {\n        ret._locale = input._locale;\n    }\n\n    return ret;\n}\n\ncreateDuration.fn = Duration.prototype;\ncreateDuration.invalid = createInvalid$1;\n\nfunction parseIso (inp, sign) {\n    // We'd normally use ~~inp for this, but unfortunately it also\n    // converts floats to ints.\n    // inp may be undefined, so careful calling replace on it.\n    var res = inp && parseFloat(inp.replace(',', '.'));\n    // apply sign while we're at it\n    return (isNaN(res) ? 0 : res) * sign;\n}\n\nfunction positiveMomentsDifference(base, other) {\n    var res = {milliseconds: 0, months: 0};\n\n    res.months = other.month() - base.month() +\n        (other.year() - base.year()) * 12;\n    if (base.clone().add(res.months, 'M').isAfter(other)) {\n        --res.months;\n    }\n\n    res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n    return res;\n}\n\nfunction momentsDifference(base, other) {\n    var res;\n    if (!(base.isValid() && other.isValid())) {\n        return {milliseconds: 0, months: 0};\n    }\n\n    other = cloneWithOffset(other, base);\n    if (base.isBefore(other)) {\n        res = positiveMomentsDifference(base, other);\n    } else {\n        res = positiveMomentsDifference(other, base);\n        res.milliseconds = -res.milliseconds;\n        res.months = -res.months;\n    }\n\n    return res;\n}\n\n// TODO: remove 'name' arg after deprecation is removed\nfunction createAdder(direction, name) {\n    return function (val, period) {\n        var dur, tmp;\n        //invert the arguments, but complain about it\n        if (period !== null && !isNaN(+period)) {\n            deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n            'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n            tmp = val; val = period; period = tmp;\n        }\n\n        val = typeof val === 'string' ? +val : val;\n        dur = createDuration(val, period);\n        addSubtract(this, dur, direction);\n        return this;\n    };\n}\n\nfunction addSubtract (mom, duration, isAdding, updateOffset) {\n    var milliseconds = duration._milliseconds,\n        days = absRound(duration._days),\n        months = absRound(duration._months);\n\n    if (!mom.isValid()) {\n        // No op\n        return;\n    }\n\n    updateOffset = updateOffset == null ? true : updateOffset;\n\n    if (months) {\n        setMonth(mom, get(mom, 'Month') + months * isAdding);\n    }\n    if (days) {\n        set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n    }\n    if (milliseconds) {\n        mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n    }\n    if (updateOffset) {\n        hooks.updateOffset(mom, days || months);\n    }\n}\n\nvar add      = createAdder(1, 'add');\nvar subtract = createAdder(-1, 'subtract');\n\nfunction getCalendarFormat(myMoment, now) {\n    var diff = myMoment.diff(now, 'days', true);\n    return diff < -6 ? 'sameElse' :\n            diff < -1 ? 'lastWeek' :\n            diff < 0 ? 'lastDay' :\n            diff < 1 ? 'sameDay' :\n            diff < 2 ? 'nextDay' :\n            diff < 7 ? 'nextWeek' : 'sameElse';\n}\n\nfunction calendar$1 (time, formats) {\n    // We want to compare the start of today, vs this.\n    // Getting start-of-today depends on whether we're local/utc/offset or not.\n    var now = time || createLocal(),\n        sod = cloneWithOffset(now, this).startOf('day'),\n        format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n    var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n    return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n}\n\nfunction clone () {\n    return new Moment(this);\n}\n\nfunction isAfter (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() > localInput.valueOf();\n    } else {\n        return localInput.valueOf() < this.clone().startOf(units).valueOf();\n    }\n}\n\nfunction isBefore (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() < localInput.valueOf();\n    } else {\n        return this.clone().endOf(units).valueOf() < localInput.valueOf();\n    }\n}\n\nfunction isBetween (from, to, units, inclusivity) {\n    inclusivity = inclusivity || '()';\n    return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n        (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n}\n\nfunction isSame (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input),\n        inputMs;\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(units || 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() === localInput.valueOf();\n    } else {\n        inputMs = localInput.valueOf();\n        return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n    }\n}\n\nfunction isSameOrAfter (input, units) {\n    return this.isSame(input, units) || this.isAfter(input,units);\n}\n\nfunction isSameOrBefore (input, units) {\n    return this.isSame(input, units) || this.isBefore(input,units);\n}\n\nfunction diff (input, units, asFloat) {\n    var that,\n        zoneDelta,\n        delta, output;\n\n    if (!this.isValid()) {\n        return NaN;\n    }\n\n    that = cloneWithOffset(input, this);\n\n    if (!that.isValid()) {\n        return NaN;\n    }\n\n    zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n    units = normalizeUnits(units);\n\n    switch (units) {\n        case 'year': output = monthDiff(this, that) / 12; break;\n        case 'month': output = monthDiff(this, that); break;\n        case 'quarter': output = monthDiff(this, that) / 3; break;\n        case 'second': output = (this - that) / 1e3; break; // 1000\n        case 'minute': output = (this - that) / 6e4; break; // 1000 * 60\n        case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60\n        case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst\n        case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst\n        default: output = this - that;\n    }\n\n    return asFloat ? output : absFloor(output);\n}\n\nfunction monthDiff (a, b) {\n    // difference in months\n    var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n        // b is in (anchor - 1 month, anchor + 1 month)\n        anchor = a.clone().add(wholeMonthDiff, 'months'),\n        anchor2, adjust;\n\n    if (b - anchor < 0) {\n        anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor - anchor2);\n    } else {\n        anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor2 - anchor);\n    }\n\n    //check for negative zero, return zero if negative zero\n    return -(wholeMonthDiff + adjust) || 0;\n}\n\nhooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\nhooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\nfunction toString () {\n    return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n}\n\nfunction toISOString(keepOffset) {\n    if (!this.isValid()) {\n        return null;\n    }\n    var utc = keepOffset !== true;\n    var m = utc ? this.clone().utc() : this;\n    if (m.year() < 0 || m.year() > 9999) {\n        return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');\n    }\n    if (isFunction(Date.prototype.toISOString)) {\n        // native implementation is ~50x faster, use it when we can\n        if (utc) {\n            return this.toDate().toISOString();\n        } else {\n            return new Date(this._d.valueOf()).toISOString().replace('Z', formatMoment(m, 'Z'));\n        }\n    }\n    return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');\n}\n\n/**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\nfunction inspect () {\n    if (!this.isValid()) {\n        return 'moment.invalid(/* ' + this._i + ' */)';\n    }\n    var func = 'moment';\n    var zone = '';\n    if (!this.isLocal()) {\n        func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n        zone = 'Z';\n    }\n    var prefix = '[' + func + '(\"]';\n    var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n    var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n    var suffix = zone + '[\")]';\n\n    return this.format(prefix + year + datetime + suffix);\n}\n\nfunction format (inputString) {\n    if (!inputString) {\n        inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n    }\n    var output = formatMoment(this, inputString);\n    return this.localeData().postformat(output);\n}\n\nfunction from (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction fromNow (withoutSuffix) {\n    return this.from(createLocal(), withoutSuffix);\n}\n\nfunction to (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction toNow (withoutSuffix) {\n    return this.to(createLocal(), withoutSuffix);\n}\n\n// If passed a locale key, it will set the locale for this\n// instance.  Otherwise, it will return the locale configuration\n// variables for this instance.\nfunction locale (key) {\n    var newLocaleData;\n\n    if (key === undefined) {\n        return this._locale._abbr;\n    } else {\n        newLocaleData = getLocale(key);\n        if (newLocaleData != null) {\n            this._locale = newLocaleData;\n        }\n        return this;\n    }\n}\n\nvar lang = deprecate(\n    'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n    function (key) {\n        if (key === undefined) {\n            return this.localeData();\n        } else {\n            return this.locale(key);\n        }\n    }\n);\n\nfunction localeData () {\n    return this._locale;\n}\n\nfunction startOf (units) {\n    units = normalizeUnits(units);\n    // the following switch intentionally omits break keywords\n    // to utilize falling through the cases.\n    switch (units) {\n        case 'year':\n            this.month(0);\n            /* falls through */\n        case 'quarter':\n        case 'month':\n            this.date(1);\n            /* falls through */\n        case 'week':\n        case 'isoWeek':\n        case 'day':\n        case 'date':\n            this.hours(0);\n            /* falls through */\n        case 'hour':\n            this.minutes(0);\n            /* falls through */\n        case 'minute':\n            this.seconds(0);\n            /* falls through */\n        case 'second':\n            this.milliseconds(0);\n    }\n\n    // weeks are a special case\n    if (units === 'week') {\n        this.weekday(0);\n    }\n    if (units === 'isoWeek') {\n        this.isoWeekday(1);\n    }\n\n    // quarters are also special\n    if (units === 'quarter') {\n        this.month(Math.floor(this.month() / 3) * 3);\n    }\n\n    return this;\n}\n\nfunction endOf (units) {\n    units = normalizeUnits(units);\n    if (units === undefined || units === 'millisecond') {\n        return this;\n    }\n\n    // 'date' is an alias for 'day', so it should be considered as such.\n    if (units === 'date') {\n        units = 'day';\n    }\n\n    return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n}\n\nfunction valueOf () {\n    return this._d.valueOf() - ((this._offset || 0) * 60000);\n}\n\nfunction unix () {\n    return Math.floor(this.valueOf() / 1000);\n}\n\nfunction toDate () {\n    return new Date(this.valueOf());\n}\n\nfunction toArray () {\n    var m = this;\n    return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n}\n\nfunction toObject () {\n    var m = this;\n    return {\n        years: m.year(),\n        months: m.month(),\n        date: m.date(),\n        hours: m.hours(),\n        minutes: m.minutes(),\n        seconds: m.seconds(),\n        milliseconds: m.milliseconds()\n    };\n}\n\nfunction toJSON () {\n    // new Date(NaN).toJSON() === null\n    return this.isValid() ? this.toISOString() : null;\n}\n\nfunction isValid$2 () {\n    return isValid(this);\n}\n\nfunction parsingFlags () {\n    return extend({}, getParsingFlags(this));\n}\n\nfunction invalidAt () {\n    return getParsingFlags(this).overflow;\n}\n\nfunction creationData() {\n    return {\n        input: this._i,\n        format: this._f,\n        locale: this._locale,\n        isUTC: this._isUTC,\n        strict: this._strict\n    };\n}\n\n// FORMATTING\n\naddFormatToken(0, ['gg', 2], 0, function () {\n    return this.weekYear() % 100;\n});\n\naddFormatToken(0, ['GG', 2], 0, function () {\n    return this.isoWeekYear() % 100;\n});\n\nfunction addWeekYearFormatToken (token, getter) {\n    addFormatToken(0, [token, token.length], 0, getter);\n}\n\naddWeekYearFormatToken('gggg',     'weekYear');\naddWeekYearFormatToken('ggggg',    'weekYear');\naddWeekYearFormatToken('GGGG',  'isoWeekYear');\naddWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n// ALIASES\n\naddUnitAlias('weekYear', 'gg');\naddUnitAlias('isoWeekYear', 'GG');\n\n// PRIORITY\n\naddUnitPriority('weekYear', 1);\naddUnitPriority('isoWeekYear', 1);\n\n\n// PARSING\n\naddRegexToken('G',      matchSigned);\naddRegexToken('g',      matchSigned);\naddRegexToken('GG',     match1to2, match2);\naddRegexToken('gg',     match1to2, match2);\naddRegexToken('GGGG',   match1to4, match4);\naddRegexToken('gggg',   match1to4, match4);\naddRegexToken('GGGGG',  match1to6, match6);\naddRegexToken('ggggg',  match1to6, match6);\n\naddWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n    week[token.substr(0, 2)] = toInt(input);\n});\n\naddWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n    week[token] = hooks.parseTwoDigitYear(input);\n});\n\n// MOMENTS\n\nfunction getSetWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input,\n            this.week(),\n            this.weekday(),\n            this.localeData()._week.dow,\n            this.localeData()._week.doy);\n}\n\nfunction getSetISOWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input, this.isoWeek(), this.isoWeekday(), 1, 4);\n}\n\nfunction getISOWeeksInYear () {\n    return weeksInYear(this.year(), 1, 4);\n}\n\nfunction getWeeksInYear () {\n    var weekInfo = this.localeData()._week;\n    return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n}\n\nfunction getSetWeekYearHelper(input, week, weekday, dow, doy) {\n    var weeksTarget;\n    if (input == null) {\n        return weekOfYear(this, dow, doy).year;\n    } else {\n        weeksTarget = weeksInYear(input, dow, doy);\n        if (week > weeksTarget) {\n            week = weeksTarget;\n        }\n        return setWeekAll.call(this, input, week, weekday, dow, doy);\n    }\n}\n\nfunction setWeekAll(weekYear, week, weekday, dow, doy) {\n    var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n        date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n    this.year(date.getUTCFullYear());\n    this.month(date.getUTCMonth());\n    this.date(date.getUTCDate());\n    return this;\n}\n\n// FORMATTING\n\naddFormatToken('Q', 0, 'Qo', 'quarter');\n\n// ALIASES\n\naddUnitAlias('quarter', 'Q');\n\n// PRIORITY\n\naddUnitPriority('quarter', 7);\n\n// PARSING\n\naddRegexToken('Q', match1);\naddParseToken('Q', function (input, array) {\n    array[MONTH] = (toInt(input) - 1) * 3;\n});\n\n// MOMENTS\n\nfunction getSetQuarter (input) {\n    return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n}\n\n// FORMATTING\n\naddFormatToken('D', ['DD', 2], 'Do', 'date');\n\n// ALIASES\n\naddUnitAlias('date', 'D');\n\n// PRIOROITY\naddUnitPriority('date', 9);\n\n// PARSING\n\naddRegexToken('D',  match1to2);\naddRegexToken('DD', match1to2, match2);\naddRegexToken('Do', function (isStrict, locale) {\n    // TODO: Remove \"ordinalParse\" fallback in next major release.\n    return isStrict ?\n      (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :\n      locale._dayOfMonthOrdinalParseLenient;\n});\n\naddParseToken(['D', 'DD'], DATE);\naddParseToken('Do', function (input, array) {\n    array[DATE] = toInt(input.match(match1to2)[0]);\n});\n\n// MOMENTS\n\nvar getSetDayOfMonth = makeGetSet('Date', true);\n\n// FORMATTING\n\naddFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n// ALIASES\n\naddUnitAlias('dayOfYear', 'DDD');\n\n// PRIORITY\naddUnitPriority('dayOfYear', 4);\n\n// PARSING\n\naddRegexToken('DDD',  match1to3);\naddRegexToken('DDDD', match3);\naddParseToken(['DDD', 'DDDD'], function (input, array, config) {\n    config._dayOfYear = toInt(input);\n});\n\n// HELPERS\n\n// MOMENTS\n\nfunction getSetDayOfYear (input) {\n    var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n    return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n}\n\n// FORMATTING\n\naddFormatToken('m', ['mm', 2], 0, 'minute');\n\n// ALIASES\n\naddUnitAlias('minute', 'm');\n\n// PRIORITY\n\naddUnitPriority('minute', 14);\n\n// PARSING\n\naddRegexToken('m',  match1to2);\naddRegexToken('mm', match1to2, match2);\naddParseToken(['m', 'mm'], MINUTE);\n\n// MOMENTS\n\nvar getSetMinute = makeGetSet('Minutes', false);\n\n// FORMATTING\n\naddFormatToken('s', ['ss', 2], 0, 'second');\n\n// ALIASES\n\naddUnitAlias('second', 's');\n\n// PRIORITY\n\naddUnitPriority('second', 15);\n\n// PARSING\n\naddRegexToken('s',  match1to2);\naddRegexToken('ss', match1to2, match2);\naddParseToken(['s', 'ss'], SECOND);\n\n// MOMENTS\n\nvar getSetSecond = makeGetSet('Seconds', false);\n\n// FORMATTING\n\naddFormatToken('S', 0, 0, function () {\n    return ~~(this.millisecond() / 100);\n});\n\naddFormatToken(0, ['SS', 2], 0, function () {\n    return ~~(this.millisecond() / 10);\n});\n\naddFormatToken(0, ['SSS', 3], 0, 'millisecond');\naddFormatToken(0, ['SSSS', 4], 0, function () {\n    return this.millisecond() * 10;\n});\naddFormatToken(0, ['SSSSS', 5], 0, function () {\n    return this.millisecond() * 100;\n});\naddFormatToken(0, ['SSSSSS', 6], 0, function () {\n    return this.millisecond() * 1000;\n});\naddFormatToken(0, ['SSSSSSS', 7], 0, function () {\n    return this.millisecond() * 10000;\n});\naddFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n    return this.millisecond() * 100000;\n});\naddFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n    return this.millisecond() * 1000000;\n});\n\n\n// ALIASES\n\naddUnitAlias('millisecond', 'ms');\n\n// PRIORITY\n\naddUnitPriority('millisecond', 16);\n\n// PARSING\n\naddRegexToken('S',    match1to3, match1);\naddRegexToken('SS',   match1to3, match2);\naddRegexToken('SSS',  match1to3, match3);\n\nvar token;\nfor (token = 'SSSS'; token.length <= 9; token += 'S') {\n    addRegexToken(token, matchUnsigned);\n}\n\nfunction parseMs(input, array) {\n    array[MILLISECOND] = toInt(('0.' + input) * 1000);\n}\n\nfor (token = 'S'; token.length <= 9; token += 'S') {\n    addParseToken(token, parseMs);\n}\n// MOMENTS\n\nvar getSetMillisecond = makeGetSet('Milliseconds', false);\n\n// FORMATTING\n\naddFormatToken('z',  0, 0, 'zoneAbbr');\naddFormatToken('zz', 0, 0, 'zoneName');\n\n// MOMENTS\n\nfunction getZoneAbbr () {\n    return this._isUTC ? 'UTC' : '';\n}\n\nfunction getZoneName () {\n    return this._isUTC ? 'Coordinated Universal Time' : '';\n}\n\nvar proto = Moment.prototype;\n\nproto.add               = add;\nproto.calendar          = calendar$1;\nproto.clone             = clone;\nproto.diff              = diff;\nproto.endOf             = endOf;\nproto.format            = format;\nproto.from              = from;\nproto.fromNow           = fromNow;\nproto.to                = to;\nproto.toNow             = toNow;\nproto.get               = stringGet;\nproto.invalidAt         = invalidAt;\nproto.isAfter           = isAfter;\nproto.isBefore          = isBefore;\nproto.isBetween         = isBetween;\nproto.isSame            = isSame;\nproto.isSameOrAfter     = isSameOrAfter;\nproto.isSameOrBefore    = isSameOrBefore;\nproto.isValid           = isValid$2;\nproto.lang              = lang;\nproto.locale            = locale;\nproto.localeData        = localeData;\nproto.max               = prototypeMax;\nproto.min               = prototypeMin;\nproto.parsingFlags      = parsingFlags;\nproto.set               = stringSet;\nproto.startOf           = startOf;\nproto.subtract          = subtract;\nproto.toArray           = toArray;\nproto.toObject          = toObject;\nproto.toDate            = toDate;\nproto.toISOString       = toISOString;\nproto.inspect           = inspect;\nproto.toJSON            = toJSON;\nproto.toString          = toString;\nproto.unix              = unix;\nproto.valueOf           = valueOf;\nproto.creationData      = creationData;\n\n// Year\nproto.year       = getSetYear;\nproto.isLeapYear = getIsLeapYear;\n\n// Week Year\nproto.weekYear    = getSetWeekYear;\nproto.isoWeekYear = getSetISOWeekYear;\n\n// Quarter\nproto.quarter = proto.quarters = getSetQuarter;\n\n// Month\nproto.month       = getSetMonth;\nproto.daysInMonth = getDaysInMonth;\n\n// Week\nproto.week           = proto.weeks        = getSetWeek;\nproto.isoWeek        = proto.isoWeeks     = getSetISOWeek;\nproto.weeksInYear    = getWeeksInYear;\nproto.isoWeeksInYear = getISOWeeksInYear;\n\n// Day\nproto.date       = getSetDayOfMonth;\nproto.day        = proto.days             = getSetDayOfWeek;\nproto.weekday    = getSetLocaleDayOfWeek;\nproto.isoWeekday = getSetISODayOfWeek;\nproto.dayOfYear  = getSetDayOfYear;\n\n// Hour\nproto.hour = proto.hours = getSetHour;\n\n// Minute\nproto.minute = proto.minutes = getSetMinute;\n\n// Second\nproto.second = proto.seconds = getSetSecond;\n\n// Millisecond\nproto.millisecond = proto.milliseconds = getSetMillisecond;\n\n// Offset\nproto.utcOffset            = getSetOffset;\nproto.utc                  = setOffsetToUTC;\nproto.local                = setOffsetToLocal;\nproto.parseZone            = setOffsetToParsedOffset;\nproto.hasAlignedHourOffset = hasAlignedHourOffset;\nproto.isDST                = isDaylightSavingTime;\nproto.isLocal              = isLocal;\nproto.isUtcOffset          = isUtcOffset;\nproto.isUtc                = isUtc;\nproto.isUTC                = isUtc;\n\n// Timezone\nproto.zoneAbbr = getZoneAbbr;\nproto.zoneName = getZoneName;\n\n// Deprecations\nproto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\nproto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\nproto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);\nproto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\nproto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\nfunction createUnix (input) {\n    return createLocal(input * 1000);\n}\n\nfunction createInZone () {\n    return createLocal.apply(null, arguments).parseZone();\n}\n\nfunction preParsePostFormat (string) {\n    return string;\n}\n\nvar proto$1 = Locale.prototype;\n\nproto$1.calendar        = calendar;\nproto$1.longDateFormat  = longDateFormat;\nproto$1.invalidDate     = invalidDate;\nproto$1.ordinal         = ordinal;\nproto$1.preparse        = preParsePostFormat;\nproto$1.postformat      = preParsePostFormat;\nproto$1.relativeTime    = relativeTime;\nproto$1.pastFuture      = pastFuture;\nproto$1.set             = set;\n\n// Month\nproto$1.months            =        localeMonths;\nproto$1.monthsShort       =        localeMonthsShort;\nproto$1.monthsParse       =        localeMonthsParse;\nproto$1.monthsRegex       = monthsRegex;\nproto$1.monthsShortRegex  = monthsShortRegex;\n\n// Week\nproto$1.week = localeWeek;\nproto$1.firstDayOfYear = localeFirstDayOfYear;\nproto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n// Day of Week\nproto$1.weekdays       =        localeWeekdays;\nproto$1.weekdaysMin    =        localeWeekdaysMin;\nproto$1.weekdaysShort  =        localeWeekdaysShort;\nproto$1.weekdaysParse  =        localeWeekdaysParse;\n\nproto$1.weekdaysRegex       =        weekdaysRegex;\nproto$1.weekdaysShortRegex  =        weekdaysShortRegex;\nproto$1.weekdaysMinRegex    =        weekdaysMinRegex;\n\n// Hours\nproto$1.isPM = localeIsPM;\nproto$1.meridiem = localeMeridiem;\n\nfunction get$1 (format, index, field, setter) {\n    var locale = getLocale();\n    var utc = createUTC().set(setter, index);\n    return locale[field](utc, format);\n}\n\nfunction listMonthsImpl (format, index, field) {\n    if (isNumber(format)) {\n        index = format;\n        format = undefined;\n    }\n\n    format = format || '';\n\n    if (index != null) {\n        return get$1(format, index, field, 'month');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 12; i++) {\n        out[i] = get$1(format, i, field, 'month');\n    }\n    return out;\n}\n\n// ()\n// (5)\n// (fmt, 5)\n// (fmt)\n// (true)\n// (true, 5)\n// (true, fmt, 5)\n// (true, fmt)\nfunction listWeekdaysImpl (localeSorted, format, index, field) {\n    if (typeof localeSorted === 'boolean') {\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    } else {\n        format = localeSorted;\n        index = format;\n        localeSorted = false;\n\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    }\n\n    var locale = getLocale(),\n        shift = localeSorted ? locale._week.dow : 0;\n\n    if (index != null) {\n        return get$1(format, (index + shift) % 7, field, 'day');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 7; i++) {\n        out[i] = get$1(format, (i + shift) % 7, field, 'day');\n    }\n    return out;\n}\n\nfunction listMonths (format, index) {\n    return listMonthsImpl(format, index, 'months');\n}\n\nfunction listMonthsShort (format, index) {\n    return listMonthsImpl(format, index, 'monthsShort');\n}\n\nfunction listWeekdays (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n}\n\nfunction listWeekdaysShort (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n}\n\nfunction listWeekdaysMin (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n}\n\ngetSetGlobalLocale('en', {\n    dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (toInt(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    }\n});\n\n// Side effect imports\nhooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\nhooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\nvar mathAbs = Math.abs;\n\nfunction abs () {\n    var data           = this._data;\n\n    this._milliseconds = mathAbs(this._milliseconds);\n    this._days         = mathAbs(this._days);\n    this._months       = mathAbs(this._months);\n\n    data.milliseconds  = mathAbs(data.milliseconds);\n    data.seconds       = mathAbs(data.seconds);\n    data.minutes       = mathAbs(data.minutes);\n    data.hours         = mathAbs(data.hours);\n    data.months        = mathAbs(data.months);\n    data.years         = mathAbs(data.years);\n\n    return this;\n}\n\nfunction addSubtract$1 (duration, input, value, direction) {\n    var other = createDuration(input, value);\n\n    duration._milliseconds += direction * other._milliseconds;\n    duration._days         += direction * other._days;\n    duration._months       += direction * other._months;\n\n    return duration._bubble();\n}\n\n// supports only 2.0-style add(1, 's') or add(duration)\nfunction add$1 (input, value) {\n    return addSubtract$1(this, input, value, 1);\n}\n\n// supports only 2.0-style subtract(1, 's') or subtract(duration)\nfunction subtract$1 (input, value) {\n    return addSubtract$1(this, input, value, -1);\n}\n\nfunction absCeil (number) {\n    if (number < 0) {\n        return Math.floor(number);\n    } else {\n        return Math.ceil(number);\n    }\n}\n\nfunction bubble () {\n    var milliseconds = this._milliseconds;\n    var days         = this._days;\n    var months       = this._months;\n    var data         = this._data;\n    var seconds, minutes, hours, years, monthsFromDays;\n\n    // if we have a mix of positive and negative values, bubble down first\n    // check: https://github.com/moment/moment/issues/2166\n    if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n            (milliseconds <= 0 && days <= 0 && months <= 0))) {\n        milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n        days = 0;\n        months = 0;\n    }\n\n    // The following code bubbles up values, see the tests for\n    // examples of what that means.\n    data.milliseconds = milliseconds % 1000;\n\n    seconds           = absFloor(milliseconds / 1000);\n    data.seconds      = seconds % 60;\n\n    minutes           = absFloor(seconds / 60);\n    data.minutes      = minutes % 60;\n\n    hours             = absFloor(minutes / 60);\n    data.hours        = hours % 24;\n\n    days += absFloor(hours / 24);\n\n    // convert days to months\n    monthsFromDays = absFloor(daysToMonths(days));\n    months += monthsFromDays;\n    days -= absCeil(monthsToDays(monthsFromDays));\n\n    // 12 months -> 1 year\n    years = absFloor(months / 12);\n    months %= 12;\n\n    data.days   = days;\n    data.months = months;\n    data.years  = years;\n\n    return this;\n}\n\nfunction daysToMonths (days) {\n    // 400 years have 146097 days (taking into account leap year rules)\n    // 400 years have 12 months === 4800\n    return days * 4800 / 146097;\n}\n\nfunction monthsToDays (months) {\n    // the reverse of daysToMonths\n    return months * 146097 / 4800;\n}\n\nfunction as (units) {\n    if (!this.isValid()) {\n        return NaN;\n    }\n    var days;\n    var months;\n    var milliseconds = this._milliseconds;\n\n    units = normalizeUnits(units);\n\n    if (units === 'month' || units === 'year') {\n        days   = this._days   + milliseconds / 864e5;\n        months = this._months + daysToMonths(days);\n        return units === 'month' ? months : months / 12;\n    } else {\n        // handle milliseconds separately because of floating point math errors (issue #1867)\n        days = this._days + Math.round(monthsToDays(this._months));\n        switch (units) {\n            case 'week'   : return days / 7     + milliseconds / 6048e5;\n            case 'day'    : return days         + milliseconds / 864e5;\n            case 'hour'   : return days * 24    + milliseconds / 36e5;\n            case 'minute' : return days * 1440  + milliseconds / 6e4;\n            case 'second' : return days * 86400 + milliseconds / 1000;\n            // Math.floor prevents floating point math errors here\n            case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n            default: throw new Error('Unknown unit ' + units);\n        }\n    }\n}\n\n// TODO: Use this.as('ms')?\nfunction valueOf$1 () {\n    if (!this.isValid()) {\n        return NaN;\n    }\n    return (\n        this._milliseconds +\n        this._days * 864e5 +\n        (this._months % 12) * 2592e6 +\n        toInt(this._months / 12) * 31536e6\n    );\n}\n\nfunction makeAs (alias) {\n    return function () {\n        return this.as(alias);\n    };\n}\n\nvar asMilliseconds = makeAs('ms');\nvar asSeconds      = makeAs('s');\nvar asMinutes      = makeAs('m');\nvar asHours        = makeAs('h');\nvar asDays         = makeAs('d');\nvar asWeeks        = makeAs('w');\nvar asMonths       = makeAs('M');\nvar asYears        = makeAs('y');\n\nfunction clone$1 () {\n    return createDuration(this);\n}\n\nfunction get$2 (units) {\n    units = normalizeUnits(units);\n    return this.isValid() ? this[units + 's']() : NaN;\n}\n\nfunction makeGetter(name) {\n    return function () {\n        return this.isValid() ? this._data[name] : NaN;\n    };\n}\n\nvar milliseconds = makeGetter('milliseconds');\nvar seconds      = makeGetter('seconds');\nvar minutes      = makeGetter('minutes');\nvar hours        = makeGetter('hours');\nvar days         = makeGetter('days');\nvar months       = makeGetter('months');\nvar years        = makeGetter('years');\n\nfunction weeks () {\n    return absFloor(this.days() / 7);\n}\n\nvar round = Math.round;\nvar thresholds = {\n    ss: 44,         // a few seconds to seconds\n    s : 45,         // seconds to minute\n    m : 45,         // minutes to hour\n    h : 22,         // hours to day\n    d : 26,         // days to month\n    M : 11          // months to year\n};\n\n// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\nfunction substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n    return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n}\n\nfunction relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n    var duration = createDuration(posNegDuration).abs();\n    var seconds  = round(duration.as('s'));\n    var minutes  = round(duration.as('m'));\n    var hours    = round(duration.as('h'));\n    var days     = round(duration.as('d'));\n    var months   = round(duration.as('M'));\n    var years    = round(duration.as('y'));\n\n    var a = seconds <= thresholds.ss && ['s', seconds]  ||\n            seconds < thresholds.s   && ['ss', seconds] ||\n            minutes <= 1             && ['m']           ||\n            minutes < thresholds.m   && ['mm', minutes] ||\n            hours   <= 1             && ['h']           ||\n            hours   < thresholds.h   && ['hh', hours]   ||\n            days    <= 1             && ['d']           ||\n            days    < thresholds.d   && ['dd', days]    ||\n            months  <= 1             && ['M']           ||\n            months  < thresholds.M   && ['MM', months]  ||\n            years   <= 1             && ['y']           || ['yy', years];\n\n    a[2] = withoutSuffix;\n    a[3] = +posNegDuration > 0;\n    a[4] = locale;\n    return substituteTimeAgo.apply(null, a);\n}\n\n// This function allows you to set the rounding function for relative time strings\nfunction getSetRelativeTimeRounding (roundingFunction) {\n    if (roundingFunction === undefined) {\n        return round;\n    }\n    if (typeof(roundingFunction) === 'function') {\n        round = roundingFunction;\n        return true;\n    }\n    return false;\n}\n\n// This function allows you to set a threshold for relative time strings\nfunction getSetRelativeTimeThreshold (threshold, limit) {\n    if (thresholds[threshold] === undefined) {\n        return false;\n    }\n    if (limit === undefined) {\n        return thresholds[threshold];\n    }\n    thresholds[threshold] = limit;\n    if (threshold === 's') {\n        thresholds.ss = limit - 1;\n    }\n    return true;\n}\n\nfunction humanize (withSuffix) {\n    if (!this.isValid()) {\n        return this.localeData().invalidDate();\n    }\n\n    var locale = this.localeData();\n    var output = relativeTime$1(this, !withSuffix, locale);\n\n    if (withSuffix) {\n        output = locale.pastFuture(+this, output);\n    }\n\n    return locale.postformat(output);\n}\n\nvar abs$1 = Math.abs;\n\nfunction sign(x) {\n    return ((x > 0) - (x < 0)) || +x;\n}\n\nfunction toISOString$1() {\n    // for ISO strings we do not use the normal bubbling rules:\n    //  * milliseconds bubble up until they become hours\n    //  * days do not bubble at all\n    //  * months bubble up until they become years\n    // This is because there is no context-free conversion between hours and days\n    // (think of clock changes)\n    // and also not between days and months (28-31 days per month)\n    if (!this.isValid()) {\n        return this.localeData().invalidDate();\n    }\n\n    var seconds = abs$1(this._milliseconds) / 1000;\n    var days         = abs$1(this._days);\n    var months       = abs$1(this._months);\n    var minutes, hours, years;\n\n    // 3600 seconds -> 60 minutes -> 1 hour\n    minutes           = absFloor(seconds / 60);\n    hours             = absFloor(minutes / 60);\n    seconds %= 60;\n    minutes %= 60;\n\n    // 12 months -> 1 year\n    years  = absFloor(months / 12);\n    months %= 12;\n\n\n    // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n    var Y = years;\n    var M = months;\n    var D = days;\n    var h = hours;\n    var m = minutes;\n    var s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n    var total = this.asSeconds();\n\n    if (!total) {\n        // this is the same as C#'s (Noda) and python (isodate)...\n        // but not other JS (goog.date)\n        return 'P0D';\n    }\n\n    var totalSign = total < 0 ? '-' : '';\n    var ymSign = sign(this._months) !== sign(total) ? '-' : '';\n    var daysSign = sign(this._days) !== sign(total) ? '-' : '';\n    var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n    return totalSign + 'P' +\n        (Y ? ymSign + Y + 'Y' : '') +\n        (M ? ymSign + M + 'M' : '') +\n        (D ? daysSign + D + 'D' : '') +\n        ((h || m || s) ? 'T' : '') +\n        (h ? hmsSign + h + 'H' : '') +\n        (m ? hmsSign + m + 'M' : '') +\n        (s ? hmsSign + s + 'S' : '');\n}\n\nvar proto$2 = Duration.prototype;\n\nproto$2.isValid        = isValid$1;\nproto$2.abs            = abs;\nproto$2.add            = add$1;\nproto$2.subtract       = subtract$1;\nproto$2.as             = as;\nproto$2.asMilliseconds = asMilliseconds;\nproto$2.asSeconds      = asSeconds;\nproto$2.asMinutes      = asMinutes;\nproto$2.asHours        = asHours;\nproto$2.asDays         = asDays;\nproto$2.asWeeks        = asWeeks;\nproto$2.asMonths       = asMonths;\nproto$2.asYears        = asYears;\nproto$2.valueOf        = valueOf$1;\nproto$2._bubble        = bubble;\nproto$2.clone          = clone$1;\nproto$2.get            = get$2;\nproto$2.milliseconds   = milliseconds;\nproto$2.seconds        = seconds;\nproto$2.minutes        = minutes;\nproto$2.hours          = hours;\nproto$2.days           = days;\nproto$2.weeks          = weeks;\nproto$2.months         = months;\nproto$2.years          = years;\nproto$2.humanize       = humanize;\nproto$2.toISOString    = toISOString$1;\nproto$2.toString       = toISOString$1;\nproto$2.toJSON         = toISOString$1;\nproto$2.locale         = locale;\nproto$2.localeData     = localeData;\n\n// Deprecations\nproto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\nproto$2.lang = lang;\n\n// Side effect imports\n\n// FORMATTING\n\naddFormatToken('X', 0, 0, 'unix');\naddFormatToken('x', 0, 0, 'valueOf');\n\n// PARSING\n\naddRegexToken('x', matchSigned);\naddRegexToken('X', matchTimestamp);\naddParseToken('X', function (input, array, config) {\n    config._d = new Date(parseFloat(input, 10) * 1000);\n});\naddParseToken('x', function (input, array, config) {\n    config._d = new Date(toInt(input));\n});\n\n// Side effect imports\n\n\nhooks.version = '2.20.1';\n\nsetHookCallback(createLocal);\n\nhooks.fn                    = proto;\nhooks.min                   = min;\nhooks.max                   = max;\nhooks.now                   = now;\nhooks.utc                   = createUTC;\nhooks.unix                  = createUnix;\nhooks.months                = listMonths;\nhooks.isDate                = isDate;\nhooks.locale                = getSetGlobalLocale;\nhooks.invalid               = createInvalid;\nhooks.duration              = createDuration;\nhooks.isMoment              = isMoment;\nhooks.weekdays              = listWeekdays;\nhooks.parseZone             = createInZone;\nhooks.localeData            = getLocale;\nhooks.isDuration            = isDuration;\nhooks.monthsShort           = listMonthsShort;\nhooks.weekdaysMin           = listWeekdaysMin;\nhooks.defineLocale          = defineLocale;\nhooks.updateLocale          = updateLocale;\nhooks.locales               = listLocales;\nhooks.weekdaysShort         = listWeekdaysShort;\nhooks.normalizeUnits        = normalizeUnits;\nhooks.relativeTimeRounding  = getSetRelativeTimeRounding;\nhooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\nhooks.calendarFormat        = getCalendarFormat;\nhooks.prototype             = proto;\n\n// currently HTML5 input type only supports 24-hour formats\nhooks.HTML5_FMT = {\n    DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm',             // <input type=\"datetime-local\" />\n    DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss',  // <input type=\"datetime-local\" step=\"1\" />\n    DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS',   // <input type=\"datetime-local\" step=\"0.001\" />\n    DATE: 'YYYY-MM-DD',                             // <input type=\"date\" />\n    TIME: 'HH:mm',                                  // <input type=\"time\" />\n    TIME_SECONDS: 'HH:mm:ss',                       // <input type=\"time\" step=\"1\" />\n    TIME_MS: 'HH:mm:ss.SSS',                        // <input type=\"time\" step=\"0.001\" />\n    WEEK: 'YYYY-[W]WW',                             // <input type=\"week\" />\n    MONTH: 'YYYY-MM'                                // <input type=\"month\" />\n};\n\nreturn hooks;\n\n})));\n\n\n/*** EXPORTS FROM exports-to-window-loader ***/\nwindow['moment'] = __webpack_require__(41);\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(349)(module)))\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.toSingleLine = toSingleLine;\n\nvar _array = __webpack_require__(1);\n\n/**\n * Tags a multiline string and return new one without line break characters and following spaces.\n *\n * @param {Array} strings Parts of the entire string without expressions.\n * @param {...String} expressions Expressions converted to strings, which are added to the entire string.\n * @returns {String}\n */\nfunction toSingleLine(strings) {\n  for (var _len = arguments.length, expressions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    expressions[_key - 1] = arguments[_key];\n  }\n\n  var result = (0, _array.arrayReduce)(strings, function (previousValue, currentValue, index) {\n\n    var valueWithoutWhiteSpaces = currentValue.replace(/(?:\\r?\\n\\s+)/g, '');\n    var expressionForIndex = expressions[index] ? expressions[index] : '';\n\n    return previousValue + valueWithoutWhiteSpaces + expressionForIndex;\n  }, '');\n\n  return result.trim();\n} /* eslint-disable import/prefer-default-export */\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.isFunction = isFunction;\nexports.throttle = throttle;\nexports.throttleAfterHits = throttleAfterHits;\nexports.debounce = debounce;\nexports.pipe = pipe;\nexports.partial = partial;\nexports.curry = curry;\nexports.curryRight = curryRight;\n\nvar _array = __webpack_require__(1);\n\n/**\n * Checks if given variable is function.\n *\n * @param {*} func Variable to check.\n * @returns {Boolean}\n */\nfunction isFunction(func) {\n  return typeof func === 'function';\n}\n\n/**\n * Creates throttle function that enforces a maximum number of times a function (`func`) can be called over time (`wait`).\n *\n * @param {Function} func Function to invoke.\n * @param {Number} wait Delay in miliseconds.\n * @returns {Function}\n */\nfunction throttle(func) {\n  var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;\n\n  var lastCalled = 0;\n  var result = {\n    lastCallThrottled: true\n  };\n  var lastTimer = null;\n\n  function _throttle() {\n    var _this = this;\n\n    var args = arguments;\n    var stamp = Date.now();\n    var needCall = false;\n\n    result.lastCallThrottled = true;\n\n    if (!lastCalled) {\n      lastCalled = stamp;\n      needCall = true;\n    }\n    var remaining = wait - (stamp - lastCalled);\n\n    if (needCall) {\n      result.lastCallThrottled = false;\n      func.apply(this, args);\n    } else {\n      if (lastTimer) {\n        clearTimeout(lastTimer);\n      }\n      lastTimer = setTimeout(function () {\n        result.lastCallThrottled = false;\n        func.apply(_this, args);\n        lastCalled = 0;\n        lastTimer = void 0;\n      }, remaining);\n    }\n\n    return result;\n  }\n\n  return _throttle;\n}\n\n/**\n * Creates throttle function that enforces a maximum number of times a function (`func`) can be called over\n * time (`wait`) after specified hits.\n *\n * @param {Function} func Function to invoke.\n * @param {Number} wait Delay in miliseconds.\n * @param {Number} hits Number of hits after throttling will be applied.\n * @returns {Function}\n */\nfunction throttleAfterHits(func) {\n  var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;\n  var hits = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;\n\n  var funcThrottle = throttle(func, wait);\n  var remainHits = hits;\n\n  function _clearHits() {\n    remainHits = hits;\n  }\n  function _throttleAfterHits() {\n    if (remainHits) {\n      remainHits--;\n\n      return func.apply(this, arguments);\n    }\n\n    return funcThrottle.apply(this, arguments);\n  }\n  _throttleAfterHits.clearHits = _clearHits;\n\n  return _throttleAfterHits;\n}\n\n/**\n * Creates debounce function that enforces a function (`func`) not be called again until a certain amount of time (`wait`)\n * has passed without it being called.\n *\n * @param {Function} func Function to invoke.\n * @param {Number} wait Delay in milliseconds.\n * @returns {Function}\n */\nfunction debounce(func) {\n  var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;\n\n  var lastTimer = null;\n  var result = void 0;\n\n  function _debounce() {\n    var _this2 = this;\n\n    var args = arguments;\n\n    if (lastTimer) {\n      clearTimeout(lastTimer);\n    }\n    lastTimer = setTimeout(function () {\n      result = func.apply(_this2, args);\n    }, wait);\n\n    return result;\n  }\n\n  return _debounce;\n}\n\n/**\n * Creates the function that returns the result of calling the given functions. Result of the first function is passed to\n * the second as an argument and so on. Only first function in the chain can handle multiple arguments.\n *\n * @param {Function} functions Functions to compose.\n * @returns {Function}\n */\nfunction pipe() {\n  for (var _len = arguments.length, functions = Array(_len), _key = 0; _key < _len; _key++) {\n    functions[_key] = arguments[_key];\n  }\n\n  var firstFunc = functions[0],\n      restFunc = functions.slice(1);\n\n\n  return function _pipe() {\n    return (0, _array.arrayReduce)(restFunc, function (acc, fn) {\n      return fn(acc);\n    }, firstFunc.apply(this, arguments));\n  };\n}\n\n/**\n * Creates the function that returns the function with cached arguments.\n *\n * @param {Function} func Function to partialization.\n * @param {Array} params Function arguments to cache.\n * @returns {Function}\n */\nfunction partial(func) {\n  for (var _len2 = arguments.length, params = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n    params[_key2 - 1] = arguments[_key2];\n  }\n\n  return function _partial() {\n    for (var _len3 = arguments.length, restParams = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n      restParams[_key3] = arguments[_key3];\n    }\n\n    return func.apply(this, params.concat(restParams));\n  };\n}\n\n/**\n * Creates the functions that returns the function with cached arguments. If count if passed arguments will be matched\n * to the arguments defined in `func` then function will be invoked.\n * Arguments are added to the stack in direction from the left to the right.\n *\n * @example\n * ```\n * var replace = curry(function(find, replace, string) {\n *   return string.replace(find, replace);\n * });\n *\n * // returns function with bounded first argument\n * var replace = replace('foo')\n *\n * // returns replaced string - all arguments was passed so function was invoked\n * replace('bar', 'Some test with foo...');\n *\n * ```\n *\n * @param {Function} func Function to currying.\n * @returns {Function}\n */\nfunction curry(func) {\n  var argsLength = func.length;\n\n  function given(argsSoFar) {\n    return function _curry() {\n      for (var _len4 = arguments.length, params = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        params[_key4] = arguments[_key4];\n      }\n\n      var passedArgsSoFar = argsSoFar.concat(params);\n      var result = void 0;\n\n      if (passedArgsSoFar.length >= argsLength) {\n        result = func.apply(this, passedArgsSoFar);\n      } else {\n        result = given(passedArgsSoFar);\n      }\n\n      return result;\n    };\n  }\n\n  return given([]);\n}\n\n/**\n * Creates the functions that returns the function with cached arguments. If count if passed arguments will be matched\n * to the arguments defined in `func` then function will be invoked.\n * Arguments are added to the stack in direction from the right to the left.\n *\n * @example\n * ```\n * var replace = curry(function(find, replace, string) {\n *   return string.replace(find, replace);\n * });\n *\n * // returns function with bounded first argument\n * var replace = replace('Some test with foo...')\n *\n * // returns replaced string - all arguments was passed so function was invoked\n * replace('bar', 'foo');\n *\n * ```\n *\n * @param {Function} func Function to currying.\n * @returns {Function}\n */\nfunction curryRight(func) {\n  var argsLength = func.length;\n\n  function given(argsSoFar) {\n    return function _curry() {\n      for (var _len5 = arguments.length, params = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n        params[_key5] = arguments[_key5];\n      }\n\n      var passedArgsSoFar = argsSoFar.concat(params.reverse());\n      var result = void 0;\n\n      if (passedArgsSoFar.length >= argsLength) {\n        result = func.apply(this, passedArgsSoFar);\n      } else {\n        result = given(passedArgsSoFar);\n      }\n\n      return result;\n    };\n  }\n\n  return given([]);\n}\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports) {\n\nvar toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports) {\n\nvar core = module.exports = { version: '2.5.5' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nmodule.exports = function (it, TYPE) {\n  if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n  return it;\n};\n\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = __webpack_require__(11)('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(31)(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n  ArrayProto[UNSCOPABLES][key] = true;\n};\n\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.createClassName = createClassName;\nexports.createDefaultCustomBorder = createDefaultCustomBorder;\nexports.createSingleEmptyBorder = createSingleEmptyBorder;\nexports.createDefaultHtBorder = createDefaultHtBorder;\nexports.createEmptyBorders = createEmptyBorders;\nexports.extendDefaultBorder = extendDefaultBorder;\nexports.checkSelectionBorders = checkSelectionBorders;\nexports.markSelected = markSelected;\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\n/**\n * Create separated class name for borders for each cell.\n *\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @returns {String}\n */\nfunction createClassName(row, col) {\n  return 'border_row' + row + 'col' + col;\n}\n\n/**\n * Create default single border for each position (top/right/bottom/left).\n *\n * @returns {Object} `{{width: number, color: string}}`\n */\nfunction createDefaultCustomBorder() {\n  return {\n    width: 1,\n    color: '#000'\n  };\n}\n\n/**\n * Create default object for empty border.\n *\n * @returns {Object} `{{hide: boolean}}`\n */\nfunction createSingleEmptyBorder() {\n  return { hide: true };\n}\n\n/**\n * Create default Handsontable border object.\n *\n * @returns {Object} `{{width: number, color: string, cornerVisible: boolean}}`\n */\nfunction createDefaultHtBorder() {\n  return {\n    width: 1,\n    color: '#000',\n    cornerVisible: false\n  };\n}\n\n/**\n * Prepare empty border for each cell with all custom borders hidden.\n *\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @returns {Object} `{{className: *, border: *, row: *, col: *, top: {hide: boolean}, right: {hide: boolean}, bottom: {hide: boolean}, left: {hide: boolean}}}`\n */\nfunction createEmptyBorders(row, col) {\n  return {\n    className: createClassName(row, col),\n    border: createDefaultHtBorder(),\n    row: row,\n    col: col,\n    top: createSingleEmptyBorder(),\n    right: createSingleEmptyBorder(),\n    bottom: createSingleEmptyBorder(),\n    left: createSingleEmptyBorder()\n  };\n}\n\nfunction extendDefaultBorder(defaultBorder, customBorder) {\n  if ((0, _object.hasOwnProperty)(customBorder, 'border')) {\n    defaultBorder.border = customBorder.border;\n  }\n\n  if ((0, _object.hasOwnProperty)(customBorder, 'top')) {\n    defaultBorder.top = customBorder.top;\n  }\n\n  if ((0, _object.hasOwnProperty)(customBorder, 'right')) {\n    defaultBorder.right = customBorder.right;\n  }\n\n  if ((0, _object.hasOwnProperty)(customBorder, 'bottom')) {\n    defaultBorder.bottom = customBorder.bottom;\n  }\n\n  if ((0, _object.hasOwnProperty)(customBorder, 'left')) {\n    defaultBorder.left = customBorder.left;\n  }\n\n  return defaultBorder;\n}\n\n/**\n * Check if selection has border by className\n *\n * @param hot\n * @param direction\n */\nfunction checkSelectionBorders(hot, direction) {\n  var atLeastOneHasBorder = false;\n\n  (0, _array.arrayEach)(hot.getSelectedRange(), function (range) {\n    range.forAll(function (r, c) {\n      var metaBorders = hot.getCellMeta(r, c).borders;\n\n      if (metaBorders) {\n        if (direction) {\n          if (!(0, _object.hasOwnProperty)(metaBorders[direction], 'hide')) {\n            atLeastOneHasBorder = true;\n            return false; // breaks forAll\n          }\n        } else {\n          atLeastOneHasBorder = true;\n          return false; // breaks forAll\n        }\n      }\n    });\n  });\n\n  return atLeastOneHasBorder;\n}\n\n/**\n * Mark label in contextMenu as selected\n *\n * @param label\n * @returns {string}\n */\nfunction markSelected(label) {\n  return '<span class=\"selected\">' + String.fromCharCode(10003) + '</span>' + label; // workaround for https://github.com/handsontable/handsontable/issues/1946\n}\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports) {\n\nvar id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports) {\n\nmodule.exports = {};\n\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar def = __webpack_require__(20).f;\nvar has = __webpack_require__(29);\nvar TAG = __webpack_require__(11)('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports) {\n\nexports.f = {}.propertyIsEnumerable;\n\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.EditorState = undefined;\n\nvar _src = __webpack_require__(4);\n\nvar _mixed = __webpack_require__(16);\n\nvar EditorState = exports.EditorState = {\n  VIRGIN: 'STATE_VIRGIN', // before editing\n  EDITING: 'STATE_EDITING',\n  WAITING: 'STATE_WAITING', // waiting for async validation\n  FINISHED: 'STATE_FINISHED'\n};\n\nfunction BaseEditor(instance) {\n  this.instance = instance;\n  this.state = EditorState.VIRGIN;\n\n  this._opened = false;\n  this._fullEditMode = false;\n  this._closeCallback = null;\n\n  this.init();\n}\n\nBaseEditor.prototype._fireCallbacks = function (result) {\n  if (this._closeCallback) {\n    this._closeCallback(result);\n    this._closeCallback = null;\n  }\n};\n\nBaseEditor.prototype.init = function () {};\n\nBaseEditor.prototype.getValue = function () {\n  throw Error('Editor getValue() method unimplemented');\n};\n\nBaseEditor.prototype.setValue = function (newValue) {\n  throw Error('Editor setValue() method unimplemented');\n};\n\nBaseEditor.prototype.open = function () {\n  throw Error('Editor open() method unimplemented');\n};\n\nBaseEditor.prototype.close = function () {\n  throw Error('Editor close() method unimplemented');\n};\n\nBaseEditor.prototype.prepare = function (row, col, prop, td, originalValue, cellProperties) {\n  this.TD = td;\n  this.row = row;\n  this.col = col;\n  this.prop = prop;\n  this.originalValue = originalValue;\n  this.cellProperties = cellProperties;\n  this.state = EditorState.VIRGIN;\n};\n\nBaseEditor.prototype.extend = function () {\n  var baseClass = this.constructor;\n\n  function Editor() {\n    baseClass.apply(this, arguments);\n  }\n\n  function inherit(Child, Parent) {\n    function Bridge() {}\n    Bridge.prototype = Parent.prototype;\n    Child.prototype = new Bridge();\n    Child.prototype.constructor = Child;\n\n    return Child;\n  }\n\n  return inherit(Editor, baseClass);\n};\n\nBaseEditor.prototype.saveValue = function (value, ctrlDown) {\n  var selection = void 0;\n  var tmp = void 0;\n\n  // if ctrl+enter and multiple cells selected, behave like Excel (finish editing and apply to all cells)\n  if (ctrlDown) {\n    selection = this.instance.getSelectedLast();\n\n    if (selection[0] > selection[2]) {\n      tmp = selection[0];\n      selection[0] = selection[2];\n      selection[2] = tmp;\n    }\n    if (selection[1] > selection[3]) {\n      tmp = selection[1];\n      selection[1] = selection[3];\n      selection[3] = tmp;\n    }\n  } else {\n    selection = [this.row, this.col, null, null];\n  }\n\n  this.instance.populateFromArray(selection[0], selection[1], value, selection[2], selection[3], 'edit');\n};\n\nBaseEditor.prototype.beginEditing = function (newInitialValue, event) {\n  if (this.state !== EditorState.VIRGIN) {\n    return;\n  }\n  this.instance.view.scrollViewport(new _src.CellCoords(this.row, this.col));\n  this.instance.view.render();\n  this.state = EditorState.EDITING;\n\n  newInitialValue = typeof newInitialValue === 'string' ? newInitialValue : this.originalValue;\n  this.setValue((0, _mixed.stringify)(newInitialValue));\n\n  this.open(event);\n  this._opened = true;\n  this.focus();\n\n  // only rerender the selections (FillHandle should disappear when beginediting is triggered)\n  this.instance.view.render();\n\n  this.instance.runHooks('afterBeginEditing', this.row, this.col);\n};\n\nBaseEditor.prototype.finishEditing = function (restoreOriginalValue, ctrlDown, callback) {\n  var _this = this,\n      val;\n\n  if (callback) {\n    var previousCloseCallback = this._closeCallback;\n\n    this._closeCallback = function (result) {\n      if (previousCloseCallback) {\n        previousCloseCallback(result);\n      }\n\n      callback(result);\n      _this.instance.view.render();\n    };\n  }\n\n  if (this.isWaiting()) {\n    return;\n  }\n\n  if (this.state == EditorState.VIRGIN) {\n    this.instance._registerTimeout(setTimeout(function () {\n      _this._fireCallbacks(true);\n    }, 0));\n\n    return;\n  }\n\n  if (this.state == EditorState.EDITING) {\n    if (restoreOriginalValue) {\n      this.cancelChanges();\n      this.instance.view.render();\n\n      return;\n    }\n\n    var value = this.getValue();\n\n    if (this.instance.getSettings().trimWhitespace) {\n      // We trim only string values\n      val = [[typeof value === 'string' ? String.prototype.trim.call(value || '') : value]];\n    } else {\n      val = [[value]];\n    }\n\n    this.state = EditorState.WAITING;\n    this.saveValue(val, ctrlDown);\n\n    if (this.instance.getCellValidator(this.cellProperties)) {\n      this.instance.addHookOnce('postAfterValidate', function (result) {\n        _this.state = EditorState.FINISHED;\n        _this.discardEditor(result);\n      });\n    } else {\n      this.state = EditorState.FINISHED;\n      this.discardEditor(true);\n    }\n  }\n};\n\nBaseEditor.prototype.cancelChanges = function () {\n  this.state = EditorState.FINISHED;\n  this.discardEditor();\n};\n\nBaseEditor.prototype.discardEditor = function (result) {\n  if (this.state !== EditorState.FINISHED) {\n    return;\n  }\n  // validator was defined and failed\n  if (result === false && this.cellProperties.allowInvalid !== true) {\n    this.instance.selectCell(this.row, this.col);\n    this.focus();\n    this.state = EditorState.EDITING;\n    this._fireCallbacks(false);\n  } else {\n    this.close();\n    this._opened = false;\n    this._fullEditMode = false;\n    this.state = EditorState.VIRGIN;\n    this._fireCallbacks(true);\n  }\n};\n\n/**\n * Switch editor into full edit mode. In this state navigation keys don't close editor. This mode is activated\n * automatically after hit ENTER or F2 key on the cell or while editing cell press F2 key.\n */\nBaseEditor.prototype.enableFullEditMode = function () {\n  this._fullEditMode = true;\n};\n\n/**\n * Checks if editor is in full edit mode.\n *\n * @returns {Boolean}\n */\nBaseEditor.prototype.isInFullEditMode = function () {\n  return this._fullEditMode;\n};\n\nBaseEditor.prototype.isOpened = function () {\n  return this._opened;\n};\n\nBaseEditor.prototype.isWaiting = function () {\n  return this.state === EditorState.WAITING;\n};\n\nBaseEditor.prototype.checkEditorSection = function () {\n  var totalRows = this.instance.countRows();\n  var section = '';\n\n  if (this.row < this.instance.getSettings().fixedRowsTop) {\n    if (this.col < this.instance.getSettings().fixedColumnsLeft) {\n      section = 'top-left-corner';\n    } else {\n      section = 'top';\n    }\n  } else if (this.instance.getSettings().fixedRowsBottom && this.row >= totalRows - this.instance.getSettings().fixedRowsBottom) {\n    if (this.col < this.instance.getSettings().fixedColumnsLeft) {\n      section = 'bottom-left-corner';\n    } else {\n      section = 'bottom';\n    }\n  } else if (this.col < this.instance.getSettings().fixedColumnsLeft) {\n    section = 'left';\n  }\n\n  return section;\n};\n\nexports.default = BaseEditor;\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * CellCoords holds cell coordinates (row, column) and few method to validate them and\n * retrieve as an array or an object\n *\n * @class CellCoords\n */\nvar CellCoords = function () {\n  /**\n   * @param {Number} row Row index\n   * @param {Number} col Column index\n   */\n  function CellCoords(row, col) {\n    _classCallCheck(this, CellCoords);\n\n    if (typeof row !== 'undefined' && typeof col !== 'undefined') {\n      this.row = row;\n      this.col = col;\n    } else {\n      this.row = null;\n      this.col = null;\n    }\n  }\n\n  /**\n   * Checks if given set of coordinates is valid in context of a given Walkontable instance\n   *\n   * @param {Walkontable} wotInstance\n   * @returns {Boolean}\n   */\n\n\n  _createClass(CellCoords, [{\n    key: 'isValid',\n    value: function isValid(wotInstance) {\n      // is it a valid cell index (0 or higher)\n      if (this.row < 0 || this.col < 0) {\n        return false;\n      }\n      // is selection within total rows and columns\n      if (this.row >= wotInstance.getSetting('totalRows') || this.col >= wotInstance.getSetting('totalColumns')) {\n        return false;\n      }\n\n      return true;\n    }\n\n    /**\n     * Checks if this cell coords are the same as cell coords given as a parameter\n     *\n     * @param {CellCoords} cellCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isEqual',\n    value: function isEqual(cellCoords) {\n      if (cellCoords === this) {\n        return true;\n      }\n\n      return this.row === cellCoords.row && this.col === cellCoords.col;\n    }\n\n    /**\n     * Checks if tested coordinates are positioned in south-east from this cell coords\n     *\n     * @param {Object} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSouthEastOf',\n    value: function isSouthEastOf(testedCoords) {\n      return this.row >= testedCoords.row && this.col >= testedCoords.col;\n    }\n\n    /**\n     * Checks if tested coordinates are positioned in north-east from this cell coords\n     *\n     * @param {Object} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNorthWestOf',\n    value: function isNorthWestOf(testedCoords) {\n      return this.row <= testedCoords.row && this.col <= testedCoords.col;\n    }\n\n    /**\n     * Checks if tested coordinates are positioned in south-west from this cell coords\n     *\n     * @param {Object} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSouthWestOf',\n    value: function isSouthWestOf(testedCoords) {\n      return this.row >= testedCoords.row && this.col <= testedCoords.col;\n    }\n\n    /**\n     * Checks if tested coordinates are positioned in north-east from this cell coords\n     *\n     * @param {Object} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNorthEastOf',\n    value: function isNorthEastOf(testedCoords) {\n      return this.row <= testedCoords.row && this.col >= testedCoords.col;\n    }\n\n    /**\n     * Convert CellCoords to literal object.\n     *\n     * @return {Object} Returns a literal object with `row` and `col` properties.\n     */\n\n  }, {\n    key: 'toObject',\n    value: function toObject() {\n      return {\n        row: this.row,\n        col: this.col\n      };\n    }\n  }]);\n\n  return CellCoords;\n}();\n\nexports.default = CellCoords;\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.log = log;\nexports.warn = warn;\nexports.info = info;\nexports.error = error;\n\nvar _mixed = __webpack_require__(16);\n\n/**\n * Logs message to the console if the `console` object is exposed.\n *\n * @param {...*} args Values which will be logged.\n */\nfunction log() {\n  if ((0, _mixed.isDefined)(console)) {\n    var _console;\n\n    (_console = console).log.apply(_console, arguments);\n  }\n} /* eslint-disable no-console */\n/* eslint-disable no-restricted-globals */\n\n/**\n * \"In Internet Explorer 9 (and 8), the console object is only exposed when the developer tools are opened\n * for a particular tab.\"\n *\n * Source: https://stackoverflow.com/a/5473193\n */\n\n;\n\n/**\n * Logs warn to the console if the `console` object is exposed.\n *\n * @param {...*} args Values which will be logged.\n */\nfunction warn() {\n  if ((0, _mixed.isDefined)(console)) {\n    var _console2;\n\n    (_console2 = console).warn.apply(_console2, arguments);\n  }\n};\n\n/**\n * Logs info to the console if the `console` object is exposed.\n *\n * @param {...*} args Values which will be logged.\n */\nfunction info() {\n  if ((0, _mixed.isDefined)(console)) {\n    var _console3;\n\n    (_console3 = console).info.apply(_console3, arguments);\n  }\n};\n\n/**\n * Logs error to the console if the `console` object is exposed.\n *\n * @param {...*} args Values which will be logged.\n */\nfunction error() {\n  if ((0, _mixed.isDefined)(console)) {\n    var _console4;\n\n    (_console4 = console).error.apply(_console4, arguments);\n  }\n};\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _autoResize = __webpack_require__(355);\n\nvar _autoResize2 = _interopRequireDefault(_autoResize);\n\nvar _baseEditor = __webpack_require__(54);\n\nvar _baseEditor2 = _interopRequireDefault(_baseEditor);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _unicode = __webpack_require__(21);\n\nvar _event = __webpack_require__(12);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar TextEditor = _baseEditor2.default.prototype.extend();\n\n/**\n * @private\n * @editor TextEditor\n * @class TextEditor\n * @dependencies autoResize\n */\nTextEditor.prototype.init = function () {\n  var that = this;\n  this.createElements();\n  this.eventManager = new _eventManager2.default(this);\n  this.bindEvents();\n  this.autoResize = (0, _autoResize2.default)();\n\n  this.instance.addHook('afterDestroy', function () {\n    that.destroy();\n  });\n};\n\nTextEditor.prototype.getValue = function () {\n  return this.TEXTAREA.value;\n};\n\nTextEditor.prototype.setValue = function (newValue) {\n  this.TEXTAREA.value = newValue;\n};\n\nvar onBeforeKeyDown = function onBeforeKeyDown(event) {\n  var instance = this,\n      that = instance.getActiveEditor(),\n      ctrlDown;\n\n  // catch CTRL but not right ALT (which in some systems triggers ALT+CTRL)\n  ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey;\n\n  // Process only events that have been fired in the editor\n  if (event.target !== that.TEXTAREA || (0, _event.isImmediatePropagationStopped)(event)) {\n    return;\n  }\n\n  if (event.keyCode === 17 || event.keyCode === 224 || event.keyCode === 91 || event.keyCode === 93) {\n    // when CTRL or its equivalent is pressed and cell is edited, don't prepare selectable text in textarea\n    (0, _event.stopImmediatePropagation)(event);\n    return;\n  }\n\n  switch (event.keyCode) {\n    case _unicode.KEY_CODES.ARROW_RIGHT:\n      if (that.isInFullEditMode()) {\n        if (!that.isWaiting() && !that.allowKeyEventPropagation || !that.isWaiting() && that.allowKeyEventPropagation && !that.allowKeyEventPropagation(event.keyCode)) {\n          (0, _event.stopImmediatePropagation)(event);\n        }\n      }\n      break;\n    case _unicode.KEY_CODES.ARROW_LEFT:\n      if (that.isInFullEditMode()) {\n        if (!that.isWaiting() && !that.allowKeyEventPropagation || !that.isWaiting() && that.allowKeyEventPropagation && !that.allowKeyEventPropagation(event.keyCode)) {\n          (0, _event.stopImmediatePropagation)(event);\n        }\n      }\n      break;\n    case _unicode.KEY_CODES.ARROW_UP:\n    case _unicode.KEY_CODES.ARROW_DOWN:\n      if (that.isInFullEditMode()) {\n        if (!that.isWaiting() && !that.allowKeyEventPropagation || !that.isWaiting() && that.allowKeyEventPropagation && !that.allowKeyEventPropagation(event.keyCode)) {\n          (0, _event.stopImmediatePropagation)(event);\n        }\n      }\n      break;\n\n    case _unicode.KEY_CODES.ENTER:\n      {\n        var isMultipleSelection = this.selection.isMultiple();\n\n        if (ctrlDown && !isMultipleSelection || event.altKey) {\n          // if ctrl+enter or alt+enter, add new line\n          if (that.isOpened()) {\n            var caretPosition = (0, _element.getCaretPosition)(that.TEXTAREA);\n            var value = that.getValue();\n            var newValue = value.slice(0, caretPosition) + '\\n' + value.slice(caretPosition);\n\n            that.setValue(newValue);\n\n            (0, _element.setCaretPosition)(that.TEXTAREA, caretPosition + 1);\n          } else {\n            that.beginEditing(that.originalValue + '\\n');\n          }\n          (0, _event.stopImmediatePropagation)(event);\n        }\n        event.preventDefault(); // don't add newline to field\n        break;\n      }\n    case _unicode.KEY_CODES.A:\n    case _unicode.KEY_CODES.X:\n    case _unicode.KEY_CODES.C:\n    case _unicode.KEY_CODES.V:\n      if (ctrlDown) {\n        (0, _event.stopImmediatePropagation)(event); // CTRL+A, CTRL+C, CTRL+V, CTRL+X should only work locally when cell is edited (not in table context)\n      }\n      break;\n\n    case _unicode.KEY_CODES.BACKSPACE:\n    case _unicode.KEY_CODES.DELETE:\n    case _unicode.KEY_CODES.HOME:\n    case _unicode.KEY_CODES.END:\n      (0, _event.stopImmediatePropagation)(event); // backspace, delete, home, end should only work locally when cell is edited (not in table context)\n      break;\n    default:\n      break;\n  }\n\n  if ([_unicode.KEY_CODES.ARROW_UP, _unicode.KEY_CODES.ARROW_RIGHT, _unicode.KEY_CODES.ARROW_DOWN, _unicode.KEY_CODES.ARROW_LEFT].indexOf(event.keyCode) === -1) {\n    that.autoResize.resize(String.fromCharCode(event.keyCode));\n  }\n};\n\nTextEditor.prototype.open = function () {\n  this.refreshDimensions(); // need it instantly, to prevent https://github.com/handsontable/handsontable/issues/348\n\n  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);\n};\n\nTextEditor.prototype.close = function (tdOutside) {\n  this.textareaParentStyle.display = 'none';\n\n  this.autoResize.unObserve();\n\n  if (document.activeElement === this.TEXTAREA) {\n    this.instance.listen(); // don't refocus the table if user focused some cell outside of HT on purpose\n  }\n  this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n};\n\nTextEditor.prototype.focus = function () {\n  this.TEXTAREA.focus();\n  (0, _element.setCaretPosition)(this.TEXTAREA, this.TEXTAREA.value.length);\n};\n\nTextEditor.prototype.createElements = function () {\n  //    this.$body = $(document.body);\n\n  this.TEXTAREA = document.createElement('TEXTAREA');\n\n  (0, _element.addClass)(this.TEXTAREA, 'handsontableInput');\n\n  this.textareaStyle = this.TEXTAREA.style;\n  this.textareaStyle.width = 0;\n  this.textareaStyle.height = 0;\n\n  this.TEXTAREA_PARENT = document.createElement('DIV');\n  (0, _element.addClass)(this.TEXTAREA_PARENT, 'handsontableInputHolder');\n\n  this.textareaParentStyle = this.TEXTAREA_PARENT.style;\n  this.textareaParentStyle.top = 0;\n  this.textareaParentStyle.left = 0;\n  this.textareaParentStyle.display = 'none';\n\n  this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n\n  this.instance.rootElement.appendChild(this.TEXTAREA_PARENT);\n\n  var that = this;\n  this.instance._registerTimeout(setTimeout(function () {\n    that.refreshDimensions();\n  }, 0));\n};\n\nTextEditor.prototype.getEditedCell = function () {\n  var editorSection = this.checkEditorSection(),\n      editedCell;\n\n  switch (editorSection) {\n    case 'top':\n      editedCell = this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 101;\n      break;\n    case 'top-left-corner':\n      editedCell = this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 103;\n      break;\n    case 'bottom-left-corner':\n      editedCell = this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 103;\n      break;\n    case 'left':\n      editedCell = this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 102;\n      break;\n    case 'bottom':\n      editedCell = this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 102;\n      break;\n    default:\n      editedCell = this.instance.getCell(this.row, this.col);\n      this.textareaParentStyle.zIndex = '';\n      break;\n  }\n\n  return editedCell != -1 && editedCell != -2 ? editedCell : void 0;\n};\n\nTextEditor.prototype.refreshValue = function () {\n  var sourceData = this.instance.getSourceDataAtCell(this.row, this.prop);\n  this.originalValue = sourceData;\n\n  this.setValue(sourceData);\n  this.refreshDimensions();\n};\n\nTextEditor.prototype.refreshDimensions = function () {\n  if (this.state !== _baseEditor.EditorState.EDITING) {\n    return;\n  }\n  this.TD = this.getEditedCell();\n\n  // TD is outside of the viewport.\n  if (!this.TD) {\n    this.close(true);\n\n    return;\n  }\n\n  var currentOffset = (0, _element.offset)(this.TD);\n  var containerOffset = (0, _element.offset)(this.instance.rootElement);\n  var scrollableContainer = this.instance.view.wt.wtOverlays.topOverlay.mainTableScrollableElement;\n  var totalRowsCount = this.instance.countRows();\n  var containerScrollTop = scrollableContainer !== window ? scrollableContainer.scrollTop : 0;\n  var containerScrollLeft = scrollableContainer !== window ? scrollableContainer.scrollLeft : 0;\n\n  var editorSection = this.checkEditorSection();\n\n  var scrollTop = ['', 'left'].includes(editorSection) ? containerScrollTop : 0;\n  var scrollLeft = ['', 'top', 'bottom'].includes(editorSection) ? containerScrollLeft : 0;\n\n  // If colHeaders is disabled, cells in the first row have border-top\n  var editTopModifier = currentOffset.top === containerOffset.top ? 0 : 1;\n\n  var settings = this.instance.getSettings();\n  var rowHeadersCount = this.instance.hasRowHeaders();\n  var colHeadersCount = this.instance.hasColHeaders();\n  var backgroundColor = this.TD.style.backgroundColor;\n\n  var editTop = currentOffset.top - containerOffset.top - editTopModifier - scrollTop;\n  var editLeft = currentOffset.left - containerOffset.left - 1 - scrollLeft;\n  var cssTransformOffset = void 0;\n\n  // TODO: Refactor this to the new instance.getCell method (from #ply-59), after 0.12.1 is released\n  switch (editorSection) {\n    case 'top':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'left':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'top-left-corner':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'bottom-left-corner':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'bottom':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.holder.parentNode);\n      break;\n    default:\n      break;\n  }\n\n  if (colHeadersCount && this.instance.getSelectedLast()[0] === 0 || settings.fixedRowsBottom && this.instance.getSelectedLast()[0] === totalRowsCount - settings.fixedRowsBottom) {\n    editTop += 1;\n  }\n\n  if (this.instance.getSelectedLast()[1] === 0) {\n    editLeft += 1;\n  }\n\n  if (cssTransformOffset && cssTransformOffset != -1) {\n    this.textareaParentStyle[cssTransformOffset[0]] = cssTransformOffset[1];\n  } else {\n    (0, _element.resetCssTransform)(this.TEXTAREA_PARENT);\n  }\n\n  this.textareaParentStyle.top = editTop + 'px';\n  this.textareaParentStyle.left = editLeft + 'px';\n\n  var firstRowOffset = this.instance.view.wt.wtViewport.rowsRenderCalculator.startPosition;\n  var firstColumnOffset = this.instance.view.wt.wtViewport.columnsRenderCalculator.startPosition;\n  var horizontalScrollPosition = this.instance.view.wt.wtOverlays.leftOverlay.getScrollPosition();\n  var verticalScrollPosition = this.instance.view.wt.wtOverlays.topOverlay.getScrollPosition();\n  var scrollbarWidth = (0, _element.getScrollbarWidth)();\n\n  var cellTopOffset = this.TD.offsetTop + firstRowOffset - verticalScrollPosition;\n  var cellLeftOffset = this.TD.offsetLeft + firstColumnOffset - horizontalScrollPosition;\n\n  var width = (0, _element.innerWidth)(this.TD) - 8;\n  var actualVerticalScrollbarWidth = (0, _element.hasVerticalScrollbar)(scrollableContainer) ? scrollbarWidth : 0;\n  var actualHorizontalScrollbarWidth = (0, _element.hasHorizontalScrollbar)(scrollableContainer) ? scrollbarWidth : 0;\n  var maxWidth = this.instance.view.maximumVisibleElementWidth(cellLeftOffset) - 9 - actualVerticalScrollbarWidth;\n  var height = this.TD.scrollHeight + 1;\n  var maxHeight = Math.max(this.instance.view.maximumVisibleElementHeight(cellTopOffset) - actualHorizontalScrollbarWidth, 23);\n\n  var cellComputedStyle = (0, _element.getComputedStyle)(this.TD);\n\n  this.TEXTAREA.style.fontSize = cellComputedStyle.fontSize;\n  this.TEXTAREA.style.fontFamily = cellComputedStyle.fontFamily;\n  this.TEXTAREA.style.backgroundColor = ''; // RESET STYLE\n  this.TEXTAREA.style.backgroundColor = backgroundColor ? backgroundColor : (0, _element.getComputedStyle)(this.TEXTAREA).backgroundColor;\n\n  this.autoResize.init(this.TEXTAREA, {\n    minHeight: Math.min(height, maxHeight),\n    maxHeight: maxHeight, // TEXTAREA should never be wider than visible part of the viewport (should not cover the scrollbar)\n    minWidth: Math.min(width, maxWidth),\n    maxWidth: maxWidth // TEXTAREA should never be wider than visible part of the viewport (should not cover the scrollbar)\n  }, true);\n\n  this.textareaParentStyle.display = 'block';\n};\n\nTextEditor.prototype.bindEvents = function () {\n  var editor = this;\n\n  this.eventManager.addEventListener(this.TEXTAREA, 'cut', function (event) {\n    (0, _event.stopPropagation)(event);\n  });\n\n  this.eventManager.addEventListener(this.TEXTAREA, 'paste', function (event) {\n    (0, _event.stopPropagation)(event);\n  });\n\n  this.instance.addHook('afterScrollHorizontally', function () {\n    editor.refreshDimensions();\n  });\n\n  this.instance.addHook('afterScrollVertically', function () {\n    editor.refreshDimensions();\n  });\n\n  this.instance.addHook('afterColumnResize', function () {\n    editor.refreshDimensions();\n    editor.focus();\n  });\n\n  this.instance.addHook('afterRowResize', function () {\n    editor.refreshDimensions();\n    editor.focus();\n  });\n\n  this.instance.addHook('afterDestroy', function () {\n    editor.eventManager.destroy();\n  });\n};\n\nTextEditor.prototype.destroy = function () {\n  this.eventManager.destroy();\n};\n\nexports.default = TextEditor;\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar MIXIN_NAME = 'localHooks';\n\n/**\n * Mixin object to extend objects functionality for local hooks.\n *\n * @type {Object}\n */\nvar localHooks = {\n  /**\n   * Internal hooks storage.\n   */\n  _localHooks: Object.create(null),\n\n  /**\n   * Add hook to the collection.\n   *\n   * @param {String} key Hook name.\n   * @param {Function} callback Hook callback\n   */\n  addLocalHook: function addLocalHook(key, callback) {\n    if (!this._localHooks[key]) {\n      this._localHooks[key] = [];\n    }\n    this._localHooks[key].push(callback);\n  },\n\n\n  /**\n   * Run hooks.\n   *\n   * @param {String} key Hook name.\n   * @param {*} params\n   */\n  runLocalHooks: function runLocalHooks(key) {\n    var _this = this;\n\n    for (var _len = arguments.length, params = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      params[_key - 1] = arguments[_key];\n    }\n\n    if (this._localHooks[key]) {\n      (0, _array.arrayEach)(this._localHooks[key], function (callback) {\n        return callback.apply(_this, params);\n      });\n    }\n  },\n\n\n  /**\n   * Clear all added hooks.\n   */\n  clearLocalHooks: function clearLocalHooks() {\n    this._localHooks = {};\n  }\n};\n\n(0, _object.defineGetter)(localHooks, 'MIXIN_NAME', MIXIN_NAME, {\n  writable: false,\n  enumerable: false\n});\n\nexports.default = localHooks;\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports) {\n\n// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(59);\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar redefine = __webpack_require__(30);\nmodule.exports = function (target, src, safe) {\n  for (var key in src) redefine(target, key, src[key], safe);\n  return target;\n};\n\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it, Constructor, name, forbiddenField) {\n  if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n    throw TypeError(name + ': incorrect invocation!');\n  } return it;\n};\n\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ctx = __webpack_require__(32);\nvar call = __webpack_require__(102);\nvar isArrayIter = __webpack_require__(103);\nvar anObject = __webpack_require__(18);\nvar toLength = __webpack_require__(25);\nvar getIterFn = __webpack_require__(104);\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n  var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n  var f = ctx(fn, that, entries ? 2 : 1);\n  var index = 0;\n  var length, step, iterator, result;\n  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n  // fast case for arrays with default iterator\n  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n    if (result === BREAK || result === RETURN) return result;\n  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n    result = call(iterator, f, step.value, entries);\n    if (result === BREAK || result === RETURN) return result;\n  }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports) {\n\nmodule.exports = false;\n\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar global = __webpack_require__(14);\nvar $export = __webpack_require__(3);\nvar redefine = __webpack_require__(30);\nvar redefineAll = __webpack_require__(61);\nvar meta = __webpack_require__(34);\nvar forOf = __webpack_require__(64);\nvar anInstance = __webpack_require__(63);\nvar isObject = __webpack_require__(9);\nvar fails = __webpack_require__(23);\nvar $iterDetect = __webpack_require__(79);\nvar setToStringTag = __webpack_require__(52);\nvar inheritIfRequired = __webpack_require__(329);\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n  var Base = global[NAME];\n  var C = Base;\n  var ADDER = IS_MAP ? 'set' : 'add';\n  var proto = C && C.prototype;\n  var O = {};\n  var fixMethod = function (KEY) {\n    var fn = proto[KEY];\n    redefine(proto, KEY,\n      KEY == 'delete' ? function (a) {\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'has' ? function has(a) {\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'get' ? function get(a) {\n        return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n        : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n    );\n  };\n  if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n    new C().entries().next();\n  }))) {\n    // create collection constructor\n    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n    redefineAll(C.prototype, methods);\n    meta.NEED = true;\n  } else {\n    var instance = new C();\n    // early implementations not supports chaining\n    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n    // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false\n    var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n    // most early implementations doesn't supports iterables, most modern - not close it correctly\n    var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n    // for early implementations -0 and +0 not the same\n    var BUGGY_ZERO = !IS_WEAK && fails(function () {\n      // V8 ~ Chromium 42- fails only with 5+ elements\n      var $instance = new C();\n      var index = 5;\n      while (index--) $instance[ADDER](index, index);\n      return !$instance.has(-0);\n    });\n    if (!ACCEPT_ITERABLES) {\n      C = wrapper(function (target, iterable) {\n        anInstance(target, C, NAME);\n        var that = inheritIfRequired(new Base(), target, C);\n        if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n        return that;\n      });\n      C.prototype = proto;\n      proto.constructor = C;\n    }\n    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n      fixMethod('delete');\n      fixMethod('has');\n      IS_MAP && fixMethod('get');\n    }\n    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n    // weak collections should not contains .clear method\n    if (IS_WEAK && proto.clear) delete proto.clear;\n  }\n\n  setToStringTag(C, NAME);\n\n  O[NAME] = C;\n  $export($export.G + $export.W + $export.F * (C != Base), O);\n\n  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n  return C;\n};\n\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar pIE = __webpack_require__(53);\nvar createDesc = __webpack_require__(50);\nvar toIObject = __webpack_require__(24);\nvar toPrimitive = __webpack_require__(73);\nvar has = __webpack_require__(29);\nvar IE8_DOM_DEFINE = __webpack_require__(98);\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = __webpack_require__(22) ? gOPD : function getOwnPropertyDescriptor(O, P) {\n  O = toIObject(O);\n  P = toPrimitive(P, true);\n  if (IE8_DOM_DEFINE) try {\n    return gOPD(O, P);\n  } catch (e) { /* empty */ }\n  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = __webpack_require__(32);\nvar IObject = __webpack_require__(75);\nvar toObject = __webpack_require__(33);\nvar toLength = __webpack_require__(25);\nvar asc = __webpack_require__(330);\nmodule.exports = function (TYPE, $create) {\n  var IS_MAP = TYPE == 1;\n  var IS_FILTER = TYPE == 2;\n  var IS_SOME = TYPE == 3;\n  var IS_EVERY = TYPE == 4;\n  var IS_FIND_INDEX = TYPE == 6;\n  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n  var create = $create || asc;\n  return function ($this, callbackfn, that) {\n    var O = toObject($this);\n    var self = IObject(O);\n    var f = ctx(callbackfn, that, 3);\n    var length = toLength(self.length);\n    var index = 0;\n    var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n    var val, res;\n    for (;length > index; index++) if (NO_HOLES || index in self) {\n      val = self[index];\n      res = f(val, index, O);\n      if (TYPE) {\n        if (IS_MAP) result[index] = res;   // map\n        else if (res) switch (TYPE) {\n          case 3: return true;             // some\n          case 5: return val;              // find\n          case 6: return index;            // findIndex\n          case 2: result.push(val);        // filter\n        } else if (IS_EVERY) return false; // every\n      }\n    }\n    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n  };\n};\n\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports) {\n\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar hide = __webpack_require__(31);\nvar redefine = __webpack_require__(30);\nvar fails = __webpack_require__(23);\nvar defined = __webpack_require__(38);\nvar wks = __webpack_require__(11);\n\nmodule.exports = function (KEY, length, exec) {\n  var SYMBOL = wks(KEY);\n  var fns = exec(defined, SYMBOL, ''[KEY]);\n  var strfn = fns[0];\n  var rxfn = fns[1];\n  if (fails(function () {\n    var O = {};\n    O[SYMBOL] = function () { return 7; };\n    return ''[KEY](O) != 7;\n  })) {\n    redefine(String.prototype, KEY, strfn);\n    hide(RegExp.prototype, SYMBOL, length == 2\n      // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n      // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n      ? function (string, arg) { return rxfn.call(string, this, arg); }\n      // 21.2.5.6 RegExp.prototype[@@match](string)\n      // 21.2.5.9 RegExp.prototype[@@search](string)\n      : function (string) { return rxfn.call(string, this); }\n    );\n  }\n};\n\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.DEFAULT_LANGUAGE_CODE = exports.getLanguagesDictionaries = exports.getDefaultLanguageDictionary = exports.hasLanguageDictionary = exports.getLanguageDictionary = exports.registerLanguageDictionary = undefined;\n\nvar _object = __webpack_require__(2);\n\nvar _utils = __webpack_require__(317);\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _enUS = __webpack_require__(391);\n\nvar _enUS2 = _interopRequireDefault(_enUS);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar DEFAULT_LANGUAGE_CODE = _enUS2.default.languageCode;\n\nvar _staticRegister = (0, _staticRegister3.default)('languagesDictionaries'),\n    registerGloballyLanguageDictionary = _staticRegister.register,\n    getGlobalLanguageDictionary = _staticRegister.getItem,\n    hasGlobalLanguageDictionary = _staticRegister.hasItem,\n    getGlobalLanguagesDictionaries = _staticRegister.getValues;\n\n/**\n * Register language dictionary for specific language code.\n *\n * @param {String|Object} languageCodeOrDictionary Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE' or object representing dictionary.\n * @param {Object} dictionary Dictionary for specific language (optional if first parameter has already dictionary).\n */\n\n\nfunction registerLanguage(languageCodeOrDictionary, dictionary) {\n  var languageCode = languageCodeOrDictionary;\n\n  // Dictionary passed as first argument.\n  if ((0, _object.isObject)(languageCodeOrDictionary)) {\n    dictionary = languageCodeOrDictionary;\n    languageCode = dictionary.languageCode;\n  }\n\n  extendLanguageDictionary(languageCode, dictionary);\n  registerGloballyLanguageDictionary(languageCode, (0, _object.deepClone)(dictionary));\n\n  // We do not allow user to work with dictionary by reference, it can cause lot of bugs.\n  return (0, _object.deepClone)(dictionary);\n};\n\n/**\n * Get language dictionary for specific language code.\n *\n * @param {String} languageCode Language code.\n * @returns {Object} Object with constants representing identifiers for translation (as keys) and corresponding translation phrases (as values).\n */\nfunction getLanguage(languageCode) {\n  if (!hasLanguage(languageCode)) {\n    return null;\n  }\n\n  return (0, _object.deepClone)(getGlobalLanguageDictionary(languageCode));\n}\n\n/**\n *\n * Get if language with specified language code was registered.\n *\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n * @returns {Boolean}\n */\nfunction hasLanguage(languageCode) {\n  return hasGlobalLanguageDictionary(languageCode);\n}\n\n/**\n * Get default language dictionary.\n *\n * @returns {Object} Object with constants representing identifiers for translation (as keys) and corresponding translation phrases (as values).\n */\nfunction getDefaultLanguage() {\n  return _enUS2.default;\n}\n\n/**\n * Extend handled dictionary by default language dictionary. As result, if any dictionary key isn't defined for specific language, it will be filled with default language value (\"dictionary gaps\" are supplemented).\n *\n * @private\n * @param {String} languageCode Language code.\n * @param {Object} dictionary Dictionary which is extended.\n */\nfunction extendLanguageDictionary(languageCode, dictionary) {\n  if (languageCode !== DEFAULT_LANGUAGE_CODE) {\n    (0, _utils.extendNotExistingKeys)(dictionary, getGlobalLanguageDictionary(DEFAULT_LANGUAGE_CODE));\n  }\n}\n\n/**\n * Get registered language dictionaries.\n *\n * @returns {Array}\n */\nfunction getLanguages() {\n  return getGlobalLanguagesDictionaries();\n}\n\nexports.registerLanguageDictionary = registerLanguage;\nexports.getLanguageDictionary = getLanguage;\nexports.hasLanguageDictionary = hasLanguage;\nexports.getDefaultLanguageDictionary = getDefaultLanguage;\nexports.getLanguagesDictionaries = getLanguages;\nexports.DEFAULT_LANGUAGE_CODE = DEFAULT_LANGUAGE_CODE;\n\n/**\n * Automatically registers default dictionary.\n */\n\nregisterLanguage(_enUS2.default);\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nvar document = __webpack_require__(14).document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(9);\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(18);\nvar dPs = __webpack_require__(327);\nvar enumBugKeys = __webpack_require__(78);\nvar IE_PROTO = __webpack_require__(76)('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = __webpack_require__(72)('iframe');\n  var i = enumBugKeys.length;\n  var lt = '<';\n  var gt = '>';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  __webpack_require__(101).appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n  return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty();\n    Empty[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = createDict();\n  return Properties === undefined ? result : dPs(result, Properties);\n};\n\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(44);\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar shared = __webpack_require__(77)('keys');\nvar uid = __webpack_require__(49);\nmodule.exports = function (key) {\n  return shared[key] || (shared[key] = uid(key));\n};\n\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function (key) {\n  return store[key] || (store[key] = {});\n};\n\n\n/***/ }),\n/* 78 */\n/***/ (function(module, exports) {\n\n// IE 8- don't enum bug keys\nmodule.exports = (\n  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n\n\n/***/ }),\n/* 79 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ITERATOR = __webpack_require__(11)('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n  var riter = [7][ITERATOR]();\n  riter['return'] = function () { SAFE_CLOSING = true; };\n  // eslint-disable-next-line no-throw-literal\n  Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n  if (!skipClosing && !SAFE_CLOSING) return false;\n  var safe = false;\n  try {\n    var arr = [7];\n    var iter = arr[ITERATOR]();\n    iter.next = function () { return { done: safe = true }; };\n    arr[ITERATOR] = function () { return iter; };\n    exec(arr);\n  } catch (e) { /* empty */ }\n  return safe;\n};\n\n\n/***/ }),\n/* 80 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ctx = __webpack_require__(32);\nvar invoke = __webpack_require__(333);\nvar html = __webpack_require__(101);\nvar cel = __webpack_require__(72);\nvar global = __webpack_require__(14);\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n  var id = +this;\n  // eslint-disable-next-line no-prototype-builtins\n  if (queue.hasOwnProperty(id)) {\n    var fn = queue[id];\n    delete queue[id];\n    fn();\n  }\n};\nvar listener = function (event) {\n  run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n  setTask = function setImmediate(fn) {\n    var args = [];\n    var i = 1;\n    while (arguments.length > i) args.push(arguments[i++]);\n    queue[++counter] = function () {\n      // eslint-disable-next-line no-new-func\n      invoke(typeof fn == 'function' ? fn : Function(fn), args);\n    };\n    defer(counter);\n    return counter;\n  };\n  clearTask = function clearImmediate(id) {\n    delete queue[id];\n  };\n  // Node.js 0.8-\n  if (__webpack_require__(44)(process) == 'process') {\n    defer = function (id) {\n      process.nextTick(ctx(run, id, 1));\n    };\n  // Sphere (JS game engine) Dispatch API\n  } else if (Dispatch && Dispatch.now) {\n    defer = function (id) {\n      Dispatch.now(ctx(run, id, 1));\n    };\n  // Browsers with MessageChannel, includes WebWorkers\n  } else if (MessageChannel) {\n    channel = new MessageChannel();\n    port = channel.port2;\n    channel.port1.onmessage = listener;\n    defer = ctx(port.postMessage, port, 1);\n  // Browsers with postMessage, skip WebWorkers\n  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n    defer = function (id) {\n      global.postMessage(id + '', '*');\n    };\n    global.addEventListener('message', listener, false);\n  // IE8-\n  } else if (ONREADYSTATECHANGE in cel('script')) {\n    defer = function (id) {\n      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n        html.removeChild(this);\n        run.call(id);\n      };\n    };\n  // Rest old browsers\n  } else {\n    defer = function (id) {\n      setTimeout(ctx(run, id, 1), 0);\n    };\n  }\n}\nmodule.exports = {\n  set: setTask,\n  clear: clearTask\n};\n\n\n/***/ }),\n/* 81 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = __webpack_require__(99);\nvar hiddenKeys = __webpack_require__(78).concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return $keys(O, hiddenKeys);\n};\n\n\n/***/ }),\n/* 82 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = __webpack_require__(142);\nvar defined = __webpack_require__(38);\n\nmodule.exports = function (that, searchString, NAME) {\n  if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n  return String(defined(that));\n};\n\n\n/***/ }),\n/* 83 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar MATCH = __webpack_require__(11)('match');\nmodule.exports = function (KEY) {\n  var re = /./;\n  try {\n    '/./'[KEY](re);\n  } catch (e) {\n    try {\n      re[MATCH] = false;\n      return !'/./'[KEY](re);\n    } catch (f) { /* empty */ }\n  } return true;\n};\n\n\n/***/ }),\n/* 84 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $defineProperty = __webpack_require__(20);\nvar createDesc = __webpack_require__(50);\n\nmodule.exports = function (object, index, value) {\n  if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n  else object[index] = value;\n};\n\n\n/***/ }),\n/* 85 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar addToUnscopables = __webpack_require__(47);\nvar step = __webpack_require__(108);\nvar Iterators = __webpack_require__(51);\nvar toIObject = __webpack_require__(24);\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = __webpack_require__(106)(Array, 'Array', function (iterated, kind) {\n  this._t = toIObject(iterated); // target\n  this._i = 0;                   // next index\n  this._k = kind;                // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var kind = this._k;\n  var index = this._i++;\n  if (!O || index >= O.length) {\n    this._t = undefined;\n    return step(1);\n  }\n  if (kind == 'keys') return step(0, index);\n  if (kind == 'values') return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n\n/***/ }),\n/* 86 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _coords = __webpack_require__(55);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * A cell range is a set of exactly two CellCoords (that can be the same or different).\n *\n * @class CellRange\n */\nvar CellRange = function () {\n  /**\n   * @param {CellCoords} highlight Used to draw bold border around a cell where selection was\n   *                               started and to edit the cell when you press Enter.\n   * @param {CellCoords} [from] Usually the same as highlight, but in Excel there is distinction - one can change\n   *                            highlight within a selection.\n   * @param {CellCoords} [to] End selection.\n   */\n  function CellRange(highlight) {\n    var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : highlight;\n    var to = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : highlight;\n\n    _classCallCheck(this, CellRange);\n\n    this.highlight = highlight;\n    this.from = from;\n    this.to = to;\n  }\n\n  /**\n   * Set the new coordinates for highlighting selection.\n   *\n   * @param {CellCoords} coords Coordinates to use.\n   */\n\n\n  _createClass(CellRange, [{\n    key: 'setHighlight',\n    value: function setHighlight(coords) {\n      this.highlight = coords;\n\n      return this;\n    }\n\n    /**\n     * Set the new coordinates where selection starts from.\n     *\n     * @param {CellCoords} coords Coordinates to use.\n     */\n\n  }, {\n    key: 'setFrom',\n    value: function setFrom(coords) {\n      this.from = coords;\n\n      return this;\n    }\n\n    /**\n     * Set new coordinates where selection ends from.\n     *\n     * @param {CellCoords} coords Coordinates to use.\n     */\n\n  }, {\n    key: 'setTo',\n    value: function setTo(coords) {\n      this.to = coords;\n\n      return this;\n    }\n\n    /**\n     * Checks if given coords are valid in context of a given Walkontable instance\n     *\n     * @param {Walkontable} wotInstance\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isValid',\n    value: function isValid(wotInstance) {\n      return this.from.isValid(wotInstance) && this.to.isValid(wotInstance);\n    }\n\n    /**\n     * Checks if this cell range is restricted to one cell\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSingle',\n    value: function isSingle() {\n      return this.from.row === this.to.row && this.from.col === this.to.col;\n    }\n\n    /**\n     * Returns selected range height (in number of rows)\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getHeight',\n    value: function getHeight() {\n      return Math.max(this.from.row, this.to.row) - Math.min(this.from.row, this.to.row) + 1;\n    }\n\n    /**\n     * Returns selected range width (in number of columns)\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getWidth',\n    value: function getWidth() {\n      return Math.max(this.from.col, this.to.col) - Math.min(this.from.col, this.to.col) + 1;\n    }\n\n    /**\n     * Checks if given cell coords is within `from` and `to` cell coords of this range\n     *\n     * @param {CellCoords} cellCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'includes',\n    value: function includes(cellCoords) {\n      var row = cellCoords.row,\n          col = cellCoords.col;\n\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n\n      return topLeft.row <= row && bottomRight.row >= row && topLeft.col <= col && bottomRight.col >= col;\n    }\n\n    /**\n     * Checks if given range is within of this range\n     *\n     * @param {CellRange} testedRange\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'includesRange',\n    value: function includesRange(testedRange) {\n      return this.includes(testedRange.getTopLeftCorner()) && this.includes(testedRange.getBottomRightCorner());\n    }\n\n    /**\n     * Checks if given range is equal to this range\n     *\n     * @param {CellRange} testedRange\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isEqual',\n    value: function isEqual(testedRange) {\n      return Math.min(this.from.row, this.to.row) === Math.min(testedRange.from.row, testedRange.to.row) && Math.max(this.from.row, this.to.row) === Math.max(testedRange.from.row, testedRange.to.row) && Math.min(this.from.col, this.to.col) === Math.min(testedRange.from.col, testedRange.to.col) && Math.max(this.from.col, this.to.col) === Math.max(testedRange.from.col, testedRange.to.col);\n    }\n\n    /**\n     * Checks if tested range overlaps with the range.\n     * Range A is considered to to be overlapping with range B if intersection of A and B or B and A is not empty.\n     *\n     * @param {CellRange} testedRange\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'overlaps',\n    value: function overlaps(testedRange) {\n      return testedRange.isSouthEastOf(this.getTopLeftCorner()) && testedRange.isNorthWestOf(this.getBottomRightCorner());\n    }\n\n    /**\n     * @param {CellRange} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSouthEastOf',\n    value: function isSouthEastOf(testedCoords) {\n      return this.getTopLeftCorner().isSouthEastOf(testedCoords) || this.getBottomRightCorner().isSouthEastOf(testedCoords);\n    }\n\n    /**\n     * @param {CellRange} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNorthWestOf',\n    value: function isNorthWestOf(testedCoords) {\n      return this.getTopLeftCorner().isNorthWestOf(testedCoords) || this.getBottomRightCorner().isNorthWestOf(testedCoords);\n    }\n\n    /**\n     * Returns `true` if the provided range is overlapping the current range horizontally\n     * (e.g. the current range's last column is 5 and the provided range's first column is 3).\n     *\n     * @param {CellRange} range The range to check against.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isOverlappingHorizontally',\n    value: function isOverlappingHorizontally(range) {\n      return this.getTopRightCorner().col >= range.getTopLeftCorner().col && this.getTopRightCorner().col <= range.getTopRightCorner().col || this.getTopLeftCorner().col <= range.getTopRightCorner().col && this.getTopLeftCorner().col >= range.getTopLeftCorner().col;\n    }\n\n    /**\n     * Returns `true` if the provided range is overlapping the current range vertically\n     * (e.g. the current range's last row is 5 and the provided range's first row is 3).\n     *\n     * @param {CellRange} range The range to check against.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isOverlappingVertically',\n    value: function isOverlappingVertically(range) {\n      return this.getBottomRightCorner().row >= range.getTopRightCorner().row && this.getBottomRightCorner().row <= range.getBottomRightCorner().row || this.getTopRightCorner().row <= range.getBottomRightCorner().row && this.getTopRightCorner().row >= range.getTopRightCorner().row;\n    }\n\n    /**\n     * Adds a cell to a range (only if exceeds corners of the range). Returns information if range was expanded\n     *\n     * @param {CellCoords} cellCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'expand',\n    value: function expand(cellCoords) {\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n\n      if (cellCoords.row < topLeft.row || cellCoords.col < topLeft.col || cellCoords.row > bottomRight.row || cellCoords.col > bottomRight.col) {\n        this.from = new _coords2.default(Math.min(topLeft.row, cellCoords.row), Math.min(topLeft.col, cellCoords.col));\n        this.to = new _coords2.default(Math.max(bottomRight.row, cellCoords.row), Math.max(bottomRight.col, cellCoords.col));\n\n        return true;\n      }\n\n      return false;\n    }\n\n    /**\n     * @param {CellRange} expandingRange\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'expandByRange',\n    value: function expandByRange(expandingRange) {\n      if (this.includesRange(expandingRange) || !this.overlaps(expandingRange)) {\n        return false;\n      }\n\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n      var initialDirection = this.getDirection();\n\n      var expandingTopLeft = expandingRange.getTopLeftCorner();\n      var expandingBottomRight = expandingRange.getBottomRightCorner();\n\n      var resultTopRow = Math.min(topLeft.row, expandingTopLeft.row);\n      var resultTopCol = Math.min(topLeft.col, expandingTopLeft.col);\n      var resultBottomRow = Math.max(bottomRight.row, expandingBottomRight.row);\n      var resultBottomCol = Math.max(bottomRight.col, expandingBottomRight.col);\n\n      var finalFrom = new _coords2.default(resultTopRow, resultTopCol);\n      var finalTo = new _coords2.default(resultBottomRow, resultBottomCol);\n\n      this.from = finalFrom;\n      this.to = finalTo;\n\n      this.setDirection(initialDirection);\n\n      if (this.highlight.row === this.getBottomRightCorner().row && this.getVerticalDirection() === 'N-S') {\n        this.flipDirectionVertically();\n      }\n\n      if (this.highlight.col === this.getTopRightCorner().col && this.getHorizontalDirection() === 'W-E') {\n        this.flipDirectionHorizontally();\n      }\n\n      return true;\n    }\n\n    /**\n     * @returns {String}\n     */\n\n  }, {\n    key: 'getDirection',\n    value: function getDirection() {\n      if (this.from.isNorthWestOf(this.to)) {\n        // NorthWest - SouthEast\n        return 'NW-SE';\n      } else if (this.from.isNorthEastOf(this.to)) {\n        // NorthEast - SouthWest\n        return 'NE-SW';\n      } else if (this.from.isSouthEastOf(this.to)) {\n        // SouthEast - NorthWest\n        return 'SE-NW';\n      } else if (this.from.isSouthWestOf(this.to)) {\n        // SouthWest - NorthEast\n        return 'SW-NE';\n      }\n    }\n\n    /**\n     * Get the vertical direction of the range.\n     *\n     * @returns {String} Available options: `N-S` (north->south), `S-N` (south->north).\n     */\n\n  }, {\n    key: 'getVerticalDirection',\n    value: function getVerticalDirection() {\n      return ['NE-SW', 'NW-SE'].indexOf(this.getDirection()) > -1 ? 'N-S' : 'S-N';\n    }\n\n    /**\n     * Get the horizontal direction of the range.\n     *\n     * @returns {String} Available options: `W-E` (west->east), `E-W` (east->west).\n     */\n\n  }, {\n    key: 'getHorizontalDirection',\n    value: function getHorizontalDirection() {\n      return ['NW-SE', 'SW-NE'].indexOf(this.getDirection()) > -1 ? 'W-E' : 'E-W';\n    }\n\n    /**\n     * @param {String} direction\n     */\n\n  }, {\n    key: 'setDirection',\n    value: function setDirection(direction) {\n      switch (direction) {\n        case 'NW-SE':\n          var _ref = [this.getTopLeftCorner(), this.getBottomRightCorner()];\n          this.from = _ref[0];\n          this.to = _ref[1];\n\n          break;\n        case 'NE-SW':\n          var _ref2 = [this.getTopRightCorner(), this.getBottomLeftCorner()];\n          this.from = _ref2[0];\n          this.to = _ref2[1];\n\n          break;\n        case 'SE-NW':\n          var _ref3 = [this.getBottomRightCorner(), this.getTopLeftCorner()];\n          this.from = _ref3[0];\n          this.to = _ref3[1];\n\n          break;\n        case 'SW-NE':\n          var _ref4 = [this.getBottomLeftCorner(), this.getTopRightCorner()];\n          this.from = _ref4[0];\n          this.to = _ref4[1];\n\n          break;\n        default:\n          break;\n      }\n    }\n\n    /**\n     * Flip the direction vertically. (e.g. `NW-SE` changes to `SW-NE`)\n     */\n\n  }, {\n    key: 'flipDirectionVertically',\n    value: function flipDirectionVertically() {\n      var direction = this.getDirection();\n      switch (direction) {\n        case 'NW-SE':\n          this.setDirection('SW-NE');\n          break;\n        case 'NE-SW':\n          this.setDirection('SE-NW');\n          break;\n        case 'SE-NW':\n          this.setDirection('NE-SW');\n          break;\n        case 'SW-NE':\n          this.setDirection('NW-SE');\n          break;\n        default:\n          break;\n      }\n    }\n\n    /**\n     * Flip the direction horizontally. (e.g. `NW-SE` changes to `NE-SW`)\n     */\n\n  }, {\n    key: 'flipDirectionHorizontally',\n    value: function flipDirectionHorizontally() {\n      var direction = this.getDirection();\n      switch (direction) {\n        case 'NW-SE':\n          this.setDirection('NE-SW');\n          break;\n        case 'NE-SW':\n          this.setDirection('NW-SE');\n          break;\n        case 'SE-NW':\n          this.setDirection('SW-NE');\n          break;\n        case 'SW-NE':\n          this.setDirection('SE-NW');\n          break;\n        default:\n          break;\n      }\n    }\n\n    /**\n     * Get top left corner of this range\n     *\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getTopLeftCorner',\n    value: function getTopLeftCorner() {\n      return new _coords2.default(Math.min(this.from.row, this.to.row), Math.min(this.from.col, this.to.col));\n    }\n\n    /**\n     * Get bottom right corner of this range\n     *\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getBottomRightCorner',\n    value: function getBottomRightCorner() {\n      return new _coords2.default(Math.max(this.from.row, this.to.row), Math.max(this.from.col, this.to.col));\n    }\n\n    /**\n     * Get top right corner of this range\n     *\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getTopRightCorner',\n    value: function getTopRightCorner() {\n      return new _coords2.default(Math.min(this.from.row, this.to.row), Math.max(this.from.col, this.to.col));\n    }\n\n    /**\n     * Get bottom left corner of this range\n     *\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getBottomLeftCorner',\n    value: function getBottomLeftCorner() {\n      return new _coords2.default(Math.max(this.from.row, this.to.row), Math.min(this.from.col, this.to.col));\n    }\n\n    /**\n     * @param {CellCoords} coords\n     * @param {CellRange} expandedRange\n     * @returns {*}\n     */\n\n  }, {\n    key: 'isCorner',\n    value: function isCorner(coords, expandedRange) {\n      if (expandedRange && expandedRange.includes(coords) && (this.getTopLeftCorner().isEqual(new _coords2.default(expandedRange.from.row, expandedRange.from.col)) || this.getTopRightCorner().isEqual(new _coords2.default(expandedRange.from.row, expandedRange.to.col)) || this.getBottomLeftCorner().isEqual(new _coords2.default(expandedRange.to.row, expandedRange.from.col)) || this.getBottomRightCorner().isEqual(new _coords2.default(expandedRange.to.row, expandedRange.to.col)))) {\n        return true;\n      }\n\n      return coords.isEqual(this.getTopLeftCorner()) || coords.isEqual(this.getTopRightCorner()) || coords.isEqual(this.getBottomLeftCorner()) || coords.isEqual(this.getBottomRightCorner());\n    }\n\n    /**\n     * @param {CellCoords} coords\n     * @param {CellRange} expandedRange\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getOppositeCorner',\n    value: function getOppositeCorner(coords, expandedRange) {\n      if (!(coords instanceof _coords2.default)) {\n        return false;\n      }\n\n      if (expandedRange) {\n        if (expandedRange.includes(coords)) {\n          if (this.getTopLeftCorner().isEqual(new _coords2.default(expandedRange.from.row, expandedRange.from.col))) {\n            return this.getBottomRightCorner();\n          }\n          if (this.getTopRightCorner().isEqual(new _coords2.default(expandedRange.from.row, expandedRange.to.col))) {\n            return this.getBottomLeftCorner();\n          }\n          if (this.getBottomLeftCorner().isEqual(new _coords2.default(expandedRange.to.row, expandedRange.from.col))) {\n            return this.getTopRightCorner();\n          }\n          if (this.getBottomRightCorner().isEqual(new _coords2.default(expandedRange.to.row, expandedRange.to.col))) {\n            return this.getTopLeftCorner();\n          }\n        }\n      }\n\n      if (coords.isEqual(this.getBottomRightCorner())) {\n        return this.getTopLeftCorner();\n      } else if (coords.isEqual(this.getTopLeftCorner())) {\n        return this.getBottomRightCorner();\n      } else if (coords.isEqual(this.getTopRightCorner())) {\n        return this.getBottomLeftCorner();\n      } else if (coords.isEqual(this.getBottomLeftCorner())) {\n        return this.getTopRightCorner();\n      }\n    }\n\n    /**\n     * @param {CellRange} range\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getBordersSharedWith',\n    value: function getBordersSharedWith(range) {\n      if (!this.includesRange(range)) {\n        return [];\n      }\n\n      var thisBorders = {\n        top: Math.min(this.from.row, this.to.row),\n        bottom: Math.max(this.from.row, this.to.row),\n        left: Math.min(this.from.col, this.to.col),\n        right: Math.max(this.from.col, this.to.col)\n      };\n      var rangeBorders = {\n        top: Math.min(range.from.row, range.to.row),\n        bottom: Math.max(range.from.row, range.to.row),\n        left: Math.min(range.from.col, range.to.col),\n        right: Math.max(range.from.col, range.to.col)\n      };\n      var result = [];\n\n      if (thisBorders.top == rangeBorders.top) {\n        result.push('top');\n      }\n      if (thisBorders.right == rangeBorders.right) {\n        result.push('right');\n      }\n      if (thisBorders.bottom == rangeBorders.bottom) {\n        result.push('bottom');\n      }\n      if (thisBorders.left == rangeBorders.left) {\n        result.push('left');\n      }\n\n      return result;\n    }\n\n    /**\n     * Get inner selected cell coords defined by this range\n     *\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getInner',\n    value: function getInner() {\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n      var out = [];\n\n      for (var r = topLeft.row; r <= bottomRight.row; r++) {\n        for (var c = topLeft.col; c <= bottomRight.col; c++) {\n          if (!(this.from.row === r && this.from.col === c) && !(this.to.row === r && this.to.col === c)) {\n            out.push(new _coords2.default(r, c));\n          }\n        }\n      }\n      return out;\n    }\n\n    /**\n     * Get all selected cell coords defined by this range\n     *\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getAll',\n    value: function getAll() {\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n      var out = [];\n\n      for (var r = topLeft.row; r <= bottomRight.row; r++) {\n        for (var c = topLeft.col; c <= bottomRight.col; c++) {\n          if (topLeft.row === r && topLeft.col === c) {\n            out.push(topLeft);\n          } else if (bottomRight.row === r && bottomRight.col === c) {\n            out.push(bottomRight);\n          } else {\n            out.push(new _coords2.default(r, c));\n          }\n        }\n      }\n\n      return out;\n    }\n\n    /**\n     * Runs a callback function against all cells in the range. You can break the iteration by returning\n     * `false` in the callback function\n     *\n     * @param callback {Function}\n     */\n\n  }, {\n    key: 'forAll',\n    value: function forAll(callback) {\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n\n      for (var r = topLeft.row; r <= bottomRight.row; r++) {\n        for (var c = topLeft.col; c <= bottomRight.col; c++) {\n          var breakIteration = callback(r, c);\n\n          if (breakIteration === false) {\n            return;\n          }\n        }\n      }\n    }\n\n    /**\n     * Convert CellRange to literal object.\n     *\n     * @return {Object} Returns a literal object with `from` and `to` properties which each of that object\n     *                  contains `row` and `col` keys.\n     */\n\n  }, {\n    key: 'toObject',\n    value: function toObject() {\n      return {\n        from: this.from.toObject(),\n        to: this.to.toObject()\n      };\n    }\n  }]);\n\n  return CellRange;\n}();\n\nexports.default = CellRange;\n\n/***/ }),\n/* 87 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getRegisteredCellTypes = exports.getRegisteredCellTypeNames = exports.hasCellType = exports.getCellType = exports.registerCellType = undefined;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar _autocompleteType = __webpack_require__(376);\n\nvar _autocompleteType2 = _interopRequireDefault(_autocompleteType);\n\nvar _checkboxType = __webpack_require__(377);\n\nvar _checkboxType2 = _interopRequireDefault(_checkboxType);\n\nvar _dateType = __webpack_require__(378);\n\nvar _dateType2 = _interopRequireDefault(_dateType);\n\nvar _dropdownType = __webpack_require__(379);\n\nvar _dropdownType2 = _interopRequireDefault(_dropdownType);\n\nvar _handsontableType = __webpack_require__(380);\n\nvar _handsontableType2 = _interopRequireDefault(_handsontableType);\n\nvar _numericType = __webpack_require__(381);\n\nvar _numericType2 = _interopRequireDefault(_numericType);\n\nvar _passwordType = __webpack_require__(382);\n\nvar _passwordType2 = _interopRequireDefault(_passwordType);\n\nvar _textType = __webpack_require__(383);\n\nvar _textType2 = _interopRequireDefault(_textType);\n\nvar _timeType = __webpack_require__(384);\n\nvar _timeType2 = _interopRequireDefault(_timeType);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _staticRegister = (0, _staticRegister3.default)('cellTypes'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem,\n    hasItem = _staticRegister.hasItem,\n    getNames = _staticRegister.getNames,\n    getValues = _staticRegister.getValues;\n\n_register('autocomplete', _autocompleteType2.default);\n_register('checkbox', _checkboxType2.default);\n_register('date', _dateType2.default);\n_register('dropdown', _dropdownType2.default);\n_register('handsontable', _handsontableType2.default);\n_register('numeric', _numericType2.default);\n_register('password', _passwordType2.default);\n_register('text', _textType2.default);\n_register('time', _timeType2.default);\n\n/**\n * Retrieve cell type object.\n *\n * @param {String} name Cell type identification.\n * @returns {Object} Returns cell type object.\n */\nfunction _getItem(name) {\n  if (!hasItem(name)) {\n    throw Error('You declared cell type \"' + name + '\" as a string that is not mapped to a known object.\\n                 Cell type must be an object or a string mapped to an object registered by \"Handsontable.cellTypes.registerCellType\" method');\n  }\n\n  return getItem(name);\n}\n\n/**\n * Register cell type under specified name.\n *\n * @param {String} name Cell type identification.\n * @param {Object} type An object with contains keys (eq: `editor`, `renderer`, `validator`) which describes specified behaviour of the cell.\n */\nfunction _register(name, type) {\n  var editor = type.editor,\n      renderer = type.renderer,\n      validator = type.validator;\n\n\n  if (editor) {\n    (0, _editors.registerEditor)(name, editor);\n  }\n  if (renderer) {\n    (0, _renderers.registerRenderer)(name, renderer);\n  }\n  if (validator) {\n    (0, _validators.registerValidator)(name, validator);\n  }\n\n  register(name, type);\n}\n\nexports.registerCellType = _register;\nexports.getCellType = _getItem;\nexports.hasCellType = hasItem;\nexports.getRegisteredCellTypeNames = getNames;\nexports.getRegisteredCellTypes = getValues;\n\n/***/ }),\n/* 88 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['Deprecation warning: This method is going to be removed in the next release. \\n      If you want to select a cell using props, please use the `selectCell` method.'], ['Deprecation warning: This method is going to be removed in the next release.\\\\x20\\n      If you want to select a cell using props, please use the \\\\`selectCell\\\\` method.']);\n\nexports.default = Core;\n\nvar _element = __webpack_require__(0);\n\nvar _setting = __webpack_require__(89);\n\nvar _function = __webpack_require__(43);\n\nvar _console = __webpack_require__(56);\n\nvar _mixed = __webpack_require__(16);\n\nvar _browser = __webpack_require__(27);\n\nvar _dataMap = __webpack_require__(385);\n\nvar _dataMap2 = _interopRequireDefault(_dataMap);\n\nvar _editorManager = __webpack_require__(388);\n\nvar _editorManager2 = _interopRequireDefault(_editorManager);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _templateLiteralTag = __webpack_require__(42);\n\nvar _plugins = __webpack_require__(8);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar _string = __webpack_require__(36);\n\nvar _number = __webpack_require__(5);\n\nvar _tableView = __webpack_require__(389);\n\nvar _tableView2 = _interopRequireDefault(_tableView);\n\nvar _dataSource = __webpack_require__(390);\n\nvar _dataSource2 = _interopRequireDefault(_dataSource);\n\nvar _data = __webpack_require__(90);\n\nvar _recordTranslator = __webpack_require__(313);\n\nvar _rootInstance = __webpack_require__(314);\n\nvar _src = __webpack_require__(4);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _defaultSettings = __webpack_require__(315);\n\nvar _defaultSettings2 = _interopRequireDefault(_defaultSettings);\n\nvar _cellTypes = __webpack_require__(87);\n\nvar _i18n = __webpack_require__(316);\n\nvar _dictionariesManager = __webpack_require__(71);\n\nvar _utils = __webpack_require__(317);\n\nvar _keyStateObserver = __webpack_require__(318);\n\nvar _selection = __webpack_require__(394);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar activeGuid = null;\n\n/**\n * Handsontable constructor\n *\n * @core\n * @constructor Core\n * @description\n *\n * After Handsontable is constructed, you can modify the grid behavior using the available public methods.\n *\n * ---\n * ## How to call methods\n *\n * These are 2 equal ways to call a Handsontable method:\n *\n * ```js\n * // all following examples assume that you constructed Handsontable like this\n * var ht = new Handsontable(document.getElementById('example1'), options);\n *\n * // now, to use setDataAtCell method, you can either:\n * ht.setDataAtCell(0, 0, 'new value');\n * ```\n *\n * Alternatively, you can call the method using jQuery wrapper (__obsolete__, requires initialization using our jQuery guide\n * ```js\n *   $('#example1').handsontable('setDataAtCell', 0, 0, 'new value');\n * ```\n * ---\n */\nfunction Core(rootElement, userSettings) {\n  var _this = this;\n\n  var rootInstanceSymbol = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n  var priv,\n      datamap,\n      dataSource,\n      grid,\n      editorManager,\n      preventScrollingToCell = false,\n      instance = this,\n      GridSettings = function GridSettings() {},\n      eventManager = new _eventManager2.default(instance);\n\n  (0, _object.extend)(GridSettings.prototype, _defaultSettings2.default.prototype); // create grid settings as a copy of default settings\n  (0, _object.extend)(GridSettings.prototype, userSettings); // overwrite defaults with user settings\n  (0, _object.extend)(GridSettings.prototype, expandType(userSettings));\n\n  (0, _utils.applyLanguageSetting)(GridSettings.prototype, userSettings.language);\n\n  if ((0, _rootInstance.hasValidParameter)(rootInstanceSymbol)) {\n    (0, _rootInstance.registerAsRootInstance)(this);\n  }\n\n  (0, _keyStateObserver.startObserving)();\n\n  this.rootElement = rootElement;\n  this.isHotTableEnv = (0, _element.isChildOfWebComponentTable)(this.rootElement);\n  _eventManager2.default.isHotTableEnv = this.isHotTableEnv;\n\n  this.container = document.createElement('div');\n  this.renderCall = false;\n\n  rootElement.insertBefore(this.container, rootElement.firstChild);\n\n  if (false) {\n    (0, _mixed._injectProductInfo)(userSettings.licenseKey, rootElement);\n  }\n\n  this.guid = 'ht_' + (0, _string.randomString)(); // this is the namespace for global events\n\n  var recordTranslator = (0, _recordTranslator.getTranslator)(instance);\n\n  dataSource = new _dataSource2.default(instance);\n\n  if (!this.rootElement.id || this.rootElement.id.substring(0, 3) === 'ht_') {\n    this.rootElement.id = this.guid; // if root element does not have an id, assign a random id\n  }\n  priv = {\n    cellSettings: [],\n    columnSettings: [],\n    columnsSettingConflicts: ['data', 'width', 'language'],\n    settings: new GridSettings(), // current settings instance\n    selRange: null, // exposed by public method `getSelectedRange`\n    isPopulated: null,\n    scrollable: null,\n    firstRun: true\n  };\n\n  var selection = new _selection.Selection(priv.settings, {\n    countCols: function countCols() {\n      return instance.countCols();\n    },\n    countRows: function countRows() {\n      return instance.countRows();\n    },\n    propToCol: function propToCol(prop) {\n      return datamap.propToCol(prop);\n    },\n    isEditorOpened: function isEditorOpened() {\n      return instance.getActiveEditor() ? instance.getActiveEditor().isOpened() : false;\n    }\n  });\n\n  this.selection = selection;\n\n  this.selection.addLocalHook('beforeSetRangeStart', function (cellCoords) {\n    _this.runHooks('beforeSetRangeStart', cellCoords);\n  });\n\n  this.selection.addLocalHook('beforeSetRangeStartOnly', function (cellCoords) {\n    _this.runHooks('beforeSetRangeStartOnly', cellCoords);\n  });\n\n  this.selection.addLocalHook('beforeSetRangeEnd', function (cellCoords) {\n    _this.runHooks('beforeSetRangeEnd', cellCoords);\n\n    if (cellCoords.row < 0) {\n      cellCoords.row = _this.view.wt.wtTable.getFirstVisibleRow();\n    }\n    if (cellCoords.col < 0) {\n      cellCoords.col = _this.view.wt.wtTable.getFirstVisibleColumn();\n    }\n  });\n\n  this.selection.addLocalHook('afterSetRangeEnd', function (cellCoords) {\n    var preventScrolling = (0, _object.createObjectPropListener)(false);\n    var selectionRange = _this.selection.getSelectedRange();\n\n    var _selectionRange$curre = selectionRange.current(),\n        from = _selectionRange$curre.from,\n        to = _selectionRange$curre.to;\n\n    var selectionLayerLevel = selectionRange.size() - 1;\n\n    _this.runHooks('afterSelection', from.row, from.col, to.row, to.col, preventScrolling, selectionLayerLevel);\n    _this.runHooks('afterSelectionByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), preventScrolling, selectionLayerLevel);\n\n    var isSelectedByAnyHeader = _this.selection.isSelectedByAnyHeader();\n    var currentSelectedRange = _this.selection.selectedRange.current();\n\n    var scrollToCell = true;\n\n    if (preventScrollingToCell) {\n      scrollToCell = false;\n    }\n\n    if (preventScrolling.isTouched()) {\n      scrollToCell = !preventScrolling.value;\n    }\n\n    if (scrollToCell !== false && !isSelectedByAnyHeader) {\n      if (currentSelectedRange && !_this.selection.isMultiple()) {\n        _this.view.scrollViewport(currentSelectedRange.from);\n      } else {\n        _this.view.scrollViewport(cellCoords);\n      }\n    }\n\n    var isSelectedByRowHeader = _this.selection.isSelectedByRowHeader();\n    var isSelectedByColumnHeader = _this.selection.isSelectedByColumnHeader();\n\n    // @TODO: These CSS classes are no longer needed anymore. They are used only as a indicator of the selected\n    // rows/columns in the MergedCells plugin (via border.js#L520 in the walkontable module). After fixing\n    // the Border class this should be removed.\n    if (isSelectedByRowHeader && isSelectedByColumnHeader) {\n      (0, _element.addClass)(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);\n    } else if (isSelectedByRowHeader) {\n      (0, _element.removeClass)(_this.rootElement, 'ht__selection--columns');\n      (0, _element.addClass)(_this.rootElement, 'ht__selection--rows');\n    } else if (isSelectedByColumnHeader) {\n      (0, _element.removeClass)(_this.rootElement, 'ht__selection--rows');\n      (0, _element.addClass)(_this.rootElement, 'ht__selection--columns');\n    } else {\n      (0, _element.removeClass)(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);\n    }\n\n    _this._refreshBorders(null);\n  });\n\n  this.selection.addLocalHook('afterSelectionFinished', function (cellRanges) {\n    var selectionLayerLevel = cellRanges.length - 1;\n    var _cellRanges$selection = cellRanges[selectionLayerLevel],\n        from = _cellRanges$selection.from,\n        to = _cellRanges$selection.to;\n\n\n    _this.runHooks('afterSelectionEnd', from.row, from.col, to.row, to.col, selectionLayerLevel);\n    _this.runHooks('afterSelectionEndByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), selectionLayerLevel);\n  });\n\n  this.selection.addLocalHook('afterIsMultipleSelection', function (isMultiple) {\n    var changedIsMultiple = _this.runHooks('afterIsMultipleSelection', isMultiple.value);\n\n    if (isMultiple.value) {\n      isMultiple.value = changedIsMultiple;\n    }\n  });\n\n  this.selection.addLocalHook('beforeModifyTransformStart', function (cellCoordsDelta) {\n    _this.runHooks('modifyTransformStart', cellCoordsDelta);\n  });\n  this.selection.addLocalHook('afterModifyTransformStart', function (coords, rowTransformDir, colTransformDir) {\n    _this.runHooks('afterModifyTransformStart', coords, rowTransformDir, colTransformDir);\n  });\n  this.selection.addLocalHook('beforeModifyTransformEnd', function (cellCoordsDelta) {\n    _this.runHooks('modifyTransformEnd', cellCoordsDelta);\n  });\n  this.selection.addLocalHook('afterModifyTransformEnd', function (coords, rowTransformDir, colTransformDir) {\n    _this.runHooks('afterModifyTransformEnd', coords, rowTransformDir, colTransformDir);\n  });\n  this.selection.addLocalHook('afterDeselect', function () {\n    editorManager.destroyEditor();\n\n    _this._refreshBorders();\n    (0, _element.removeClass)(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);\n\n    _this.runHooks('afterDeselect');\n  });\n  this.selection.addLocalHook('insertRowRequire', function (totalRows) {\n    _this.alter('insert_row', totalRows, 1, 'auto');\n  });\n  this.selection.addLocalHook('insertColRequire', function (totalCols) {\n    _this.alter('insert_col', totalCols, 1, 'auto');\n  });\n\n  grid = {\n    /**\n     * Inserts or removes rows and columns.\n     *\n     * @memberof Core#\n     * @function alter\n     * @private\n     * @param {String} action Possible values: \"insert_row\", \"insert_col\", \"remove_row\", \"remove_col\".\n     * @param {Number|Array} index Row or column visual index which from the alter action will be triggered.\n     *                             Alter actions such as \"remove_row\" and \"remove_col\" support array indexes in the\n     *                             format `[[index, amount], [index, amount]...]` this can be used to remove\n     *                             non-consecutive columns or rows in one call.\n     * @param {Number} amount Ammount rows or columns to remove.\n     * @param {String} [source] Optional. Source of hook runner.\n     * @param {Boolean} [keepEmptyRows] Optional. Flag for preventing deletion of empty rows.\n     */\n    alter: function alter(action, index, amount, source, keepEmptyRows) {\n      var delta;\n\n      amount = amount || 1;\n\n      function spliceWith(data, index, count, toInject) {\n        var valueFactory = function valueFactory() {\n          var result = void 0;\n\n          if (toInject === 'array') {\n            result = [];\n          } else if (toInject === 'object') {\n            result = {};\n          }\n\n          return result;\n        };\n        var spliceArgs = (0, _array.arrayMap)(new Array(count), function () {\n          return valueFactory();\n        });\n\n        spliceArgs.unshift(index, 0);\n        data.splice.apply(data, _toConsumableArray(spliceArgs));\n      }\n\n      var normalizeIndexesGroup = function normalizeIndexesGroup(indexes) {\n        if (indexes.length === 0) {\n          return [];\n        }\n\n        var sortedIndexes = [].concat(_toConsumableArray(indexes));\n\n        // Sort the indexes in ascending order.\n        sortedIndexes.sort(function (_ref, _ref2) {\n          var _ref4 = _slicedToArray(_ref, 1),\n              indexA = _ref4[0];\n\n          var _ref3 = _slicedToArray(_ref2, 1),\n              indexB = _ref3[0];\n\n          if (indexA === indexB) {\n            return 0;\n          }\n\n          return indexA > indexB ? 1 : -1;\n        });\n\n        // Normalize the {index, amount} groups into bigger groups.\n        var normalizedIndexes = (0, _array.arrayReduce)(sortedIndexes, function (acc, _ref5) {\n          var _ref6 = _slicedToArray(_ref5, 2),\n              index = _ref6[0],\n              amount = _ref6[1];\n\n          var previousItem = acc[acc.length - 1];\n\n          var _previousItem = _slicedToArray(previousItem, 2),\n              prevIndex = _previousItem[0],\n              prevAmount = _previousItem[1];\n\n          var prevLastIndex = prevIndex + prevAmount;\n\n          if (index <= prevLastIndex) {\n            var amountToAdd = Math.max(amount - (prevLastIndex - index), 0);\n\n            previousItem[1] += amountToAdd;\n          } else {\n            acc.push([index, amount]);\n          }\n\n          return acc;\n        }, [sortedIndexes[0]]);\n\n        return normalizedIndexes;\n      };\n\n      /* eslint-disable no-case-declarations */\n      switch (action) {\n        case 'insert_row':\n\n          var numberOfSourceRows = instance.countSourceRows();\n\n          if (instance.getSettings().maxRows === numberOfSourceRows) {\n            return;\n          }\n\n          index = (0, _mixed.isDefined)(index) ? index : numberOfSourceRows;\n\n          delta = datamap.createRow(index, amount, source);\n          spliceWith(priv.cellSettings, index, amount, 'array');\n\n          if (delta) {\n            if (selection.isSelected() && selection.selectedRange.current().from.row >= index) {\n              selection.selectedRange.current().from.row += delta;\n              selection.transformEnd(delta, 0); // will call render() internally\n            } else {\n              instance._refreshBorders(); // it will call render and prepare methods\n            }\n          }\n          break;\n\n        case 'insert_col':\n          delta = datamap.createCol(index, amount, source);\n\n          for (var row = 0, len = instance.countSourceRows(); row < len; row++) {\n            if (priv.cellSettings[row]) {\n              spliceWith(priv.cellSettings[row], index, amount);\n            }\n          }\n\n          if (delta) {\n            if (Array.isArray(instance.getSettings().colHeaders)) {\n              var spliceArray = [index, 0];\n              spliceArray.length += delta; // inserts empty (undefined) elements at the end of an array\n              Array.prototype.splice.apply(instance.getSettings().colHeaders, spliceArray); // inserts empty (undefined) elements into the colHeader array\n            }\n\n            if (selection.isSelected() && selection.selectedRange.current().from.col >= index) {\n              selection.selectedRange.current().from.col += delta;\n              selection.transformEnd(0, delta); // will call render() internally\n            } else {\n              instance._refreshBorders(); // it will call render and prepare methods\n            }\n          }\n          break;\n\n        case 'remove_row':\n\n          var removeRow = function removeRow(indexes) {\n            var offset = 0;\n\n            (0, _array.arrayEach)(indexes, function (_ref7) {\n              var _ref8 = _slicedToArray(_ref7, 2),\n                  index = _ref8[0],\n                  amount = _ref8[1];\n\n              var calcIndex = (0, _mixed.isEmpty)(index) ? instance.countRows() - 1 : Math.max(index - offset, 0);\n\n              // If the 'index' is an integer decrease it by 'offset' otherwise pass it through to make the value\n              // compatible with datamap.removeCol method.\n              if (Number.isInteger(index)) {\n                index = Math.max(index - offset, 0);\n              }\n\n              // TODO: for datamap.removeRow index should be passed as it is (with undefined and null values). If not, the logic\n              // inside the datamap.removeRow breaks the removing functionality.\n              datamap.removeRow(index, amount, source);\n              priv.cellSettings.splice(calcIndex, amount);\n\n              var totalRows = instance.countRows();\n              var fixedRowsTop = instance.getSettings().fixedRowsTop;\n\n              if (fixedRowsTop >= calcIndex + 1) {\n                instance.getSettings().fixedRowsTop -= Math.min(amount, fixedRowsTop - calcIndex);\n              }\n\n              var fixedRowsBottom = instance.getSettings().fixedRowsBottom;\n\n              if (fixedRowsBottom && calcIndex >= totalRows - fixedRowsBottom) {\n                instance.getSettings().fixedRowsBottom -= Math.min(amount, fixedRowsBottom);\n              }\n\n              offset += amount;\n            });\n          };\n\n          if (Array.isArray(index)) {\n            removeRow(normalizeIndexesGroup(index));\n          } else {\n            removeRow([[index, amount]]);\n          }\n\n          grid.adjustRowsAndCols();\n          instance._refreshBorders(); // it will call render and prepare methods\n          break;\n\n        case 'remove_col':\n\n          var removeCol = function removeCol(indexes) {\n            var offset = 0;\n\n            (0, _array.arrayEach)(indexes, function (_ref9) {\n              var _ref10 = _slicedToArray(_ref9, 2),\n                  index = _ref10[0],\n                  amount = _ref10[1];\n\n              var calcIndex = (0, _mixed.isEmpty)(index) ? instance.countCols() - 1 : Math.max(index - offset, 0);\n\n              var visualColumnIndex = recordTranslator.toPhysicalColumn(calcIndex);\n\n              // If the 'index' is an integer decrease it by 'offset' otherwise pass it through to make the value\n              // compatible with datamap.removeCol method.\n              if (Number.isInteger(index)) {\n                index = Math.max(index - offset, 0);\n              }\n\n              // TODO: for datamap.removeCol index should be passed as it is (with undefined and null values). If not, the logic\n              // inside the datamap.removeCol breaks the removing functionality.\n              datamap.removeCol(index, amount, source);\n\n              for (var _row = 0, _len = instance.countSourceRows(); _row < _len; _row++) {\n                if (priv.cellSettings[_row]) {\n                  // if row hasn't been rendered it wouldn't have cellSettings\n                  priv.cellSettings[_row].splice(visualColumnIndex, amount);\n                }\n              }\n              var fixedColumnsLeft = instance.getSettings().fixedColumnsLeft;\n\n              if (fixedColumnsLeft >= calcIndex + 1) {\n                instance.getSettings().fixedColumnsLeft -= Math.min(amount, fixedColumnsLeft - calcIndex);\n              }\n\n              if (Array.isArray(instance.getSettings().colHeaders)) {\n                if (typeof visualColumnIndex === 'undefined') {\n                  visualColumnIndex = -1;\n                }\n                instance.getSettings().colHeaders.splice(visualColumnIndex, amount);\n              }\n\n              offset += amount;\n            });\n          };\n\n          if (Array.isArray(index)) {\n            removeCol(normalizeIndexesGroup(index));\n          } else {\n            removeCol([[index, amount]]);\n          }\n\n          grid.adjustRowsAndCols();\n          instance._refreshBorders(); // it will call render and prepare methods\n\n          break;\n        default:\n          throw new Error('There is no such action \"' + action + '\"');\n      }\n\n      if (!keepEmptyRows) {\n        grid.adjustRowsAndCols(); // makes sure that we did not add rows that will be removed in next refresh\n      }\n    },\n\n\n    /**\n     * Makes sure there are empty rows at the bottom of the table\n     */\n    adjustRowsAndCols: function adjustRowsAndCols() {\n      if (priv.settings.minRows) {\n        // should I add empty rows to data source to meet minRows?\n        var rows = instance.countRows();\n\n        if (rows < priv.settings.minRows) {\n          for (var r = 0, minRows = priv.settings.minRows; r < minRows - rows; r++) {\n            datamap.createRow(instance.countRows(), 1, 'auto');\n          }\n        }\n      }\n      if (priv.settings.minSpareRows) {\n        var emptyRows = instance.countEmptyRows(true);\n\n        // should I add empty rows to meet minSpareRows?\n        if (emptyRows < priv.settings.minSpareRows) {\n          for (; emptyRows < priv.settings.minSpareRows && instance.countSourceRows() < priv.settings.maxRows; emptyRows++) {\n            datamap.createRow(instance.countRows(), 1, 'auto');\n          }\n        }\n      }\n      {\n        var emptyCols = void 0;\n\n        // count currently empty cols\n        if (priv.settings.minCols || priv.settings.minSpareCols) {\n          emptyCols = instance.countEmptyCols(true);\n        }\n\n        // should I add empty cols to meet minCols?\n        if (priv.settings.minCols && !priv.settings.columns && instance.countCols() < priv.settings.minCols) {\n          for (; instance.countCols() < priv.settings.minCols; emptyCols++) {\n            datamap.createCol(instance.countCols(), 1, 'auto');\n          }\n        }\n        // should I add empty cols to meet minSpareCols?\n        if (priv.settings.minSpareCols && !priv.settings.columns && instance.dataType === 'array' && emptyCols < priv.settings.minSpareCols) {\n          for (; emptyCols < priv.settings.minSpareCols && instance.countCols() < priv.settings.maxCols; emptyCols++) {\n            datamap.createCol(instance.countCols(), 1, 'auto');\n          }\n        }\n      }\n      var rowCount = instance.countRows();\n      var colCount = instance.countCols();\n\n      if (rowCount === 0 || colCount === 0) {\n        selection.deselect();\n      }\n\n      if (selection.isSelected()) {\n        (0, _array.arrayEach)(selection.selectedRange, function (range) {\n          var selectionChanged = false;\n          var fromRow = range.from.row;\n          var fromCol = range.from.col;\n          var toRow = range.to.row;\n          var toCol = range.to.col;\n\n          // if selection is outside, move selection to last row\n          if (fromRow > rowCount - 1) {\n            fromRow = rowCount - 1;\n            selectionChanged = true;\n\n            if (toRow > fromRow) {\n              toRow = fromRow;\n            }\n          } else if (toRow > rowCount - 1) {\n            toRow = rowCount - 1;\n            selectionChanged = true;\n\n            if (fromRow > toRow) {\n              fromRow = toRow;\n            }\n          }\n          // if selection is outside, move selection to last row\n          if (fromCol > colCount - 1) {\n            fromCol = colCount - 1;\n            selectionChanged = true;\n\n            if (toCol > fromCol) {\n              toCol = fromCol;\n            }\n          } else if (toCol > colCount - 1) {\n            toCol = colCount - 1;\n            selectionChanged = true;\n\n            if (fromCol > toCol) {\n              fromCol = toCol;\n            }\n          }\n\n          if (selectionChanged) {\n            instance.selectCell(fromRow, fromCol, toRow, toCol);\n          }\n        });\n      }\n      if (instance.view) {\n        instance.view.wt.wtOverlays.adjustElementsSize();\n      }\n    },\n\n\n    /**\n     * Populate the data from the provided 2d array from the given cell coordinates.\n     *\n     * @private\n     * @param {Object} start Start selection position. Visual indexes.\n     * @param {Array} input 2d data array.\n     * @param {Object} [end] End selection position (only for drag-down mode). Visual indexes.\n     * @param {String} [source=\"populateFromArray\"] Source information string.\n     * @param {String} [method=\"overwrite\"] Populate method. Possible options: `shift_down`, `shift_right`, `overwrite`.\n     * @param {String} direction (left|right|up|down) String specifying the direction.\n     * @param {Array} deltas The deltas array. A difference between values of adjacent cells.\n     *                       Useful **only** when the type of handled cells is `numeric`.\n     * @returns {Object|undefined} ending td in pasted area (only if any cell was changed).\n     */\n    populateFromArray: function populateFromArray(start, input, end, source, method, direction, deltas) {\n      // TODO: either remove or implement the `direction` argument. Currently it's not working at all.\n      var r,\n          rlen,\n          c,\n          clen,\n          setData = [],\n          current = {};\n\n      rlen = input.length;\n\n      if (rlen === 0) {\n        return false;\n      }\n\n      var repeatCol,\n          repeatRow,\n          cmax,\n          rmax,\n          baseEnd = {\n        row: end === null ? null : end.row,\n        col: end === null ? null : end.col\n      };\n\n      /* eslint-disable no-case-declarations */\n      // insert data with specified pasteMode method\n      switch (method) {\n        case 'shift_down':\n          repeatCol = end ? end.col - start.col + 1 : 0;\n          repeatRow = end ? end.row - start.row + 1 : 0;\n          input = (0, _data.translateRowsToColumns)(input);\n          for (c = 0, clen = input.length, cmax = Math.max(clen, repeatCol); c < cmax; c++) {\n            if (c < clen) {\n              var _instance;\n\n              for (r = 0, rlen = input[c].length; r < repeatRow - rlen; r++) {\n                input[c].push(input[c][r % rlen]);\n              }\n              input[c].unshift(start.col + c, start.row, 0);\n              (_instance = instance).spliceCol.apply(_instance, _toConsumableArray(input[c]));\n            } else {\n              var _instance2;\n\n              input[c % clen][0] = start.col + c;\n              (_instance2 = instance).spliceCol.apply(_instance2, _toConsumableArray(input[c % clen]));\n            }\n          }\n          break;\n\n        case 'shift_right':\n          repeatCol = end ? end.col - start.col + 1 : 0;\n          repeatRow = end ? end.row - start.row + 1 : 0;\n          for (r = 0, rlen = input.length, rmax = Math.max(rlen, repeatRow); r < rmax; r++) {\n            if (r < rlen) {\n              var _instance3;\n\n              for (c = 0, clen = input[r].length; c < repeatCol - clen; c++) {\n                input[r].push(input[r][c % clen]);\n              }\n              input[r].unshift(start.row + r, start.col, 0);\n              (_instance3 = instance).spliceRow.apply(_instance3, _toConsumableArray(input[r]));\n            } else {\n              var _instance4;\n\n              input[r % rlen][0] = start.row + r;\n              (_instance4 = instance).spliceRow.apply(_instance4, _toConsumableArray(input[r % rlen]));\n            }\n          }\n          break;\n\n        case 'overwrite':\n        default:\n          // overwrite and other not specified options\n          current.row = start.row;\n          current.col = start.col;\n\n          var selected = { // selected range\n            row: end && start ? end.row - start.row + 1 : 1,\n            col: end && start ? end.col - start.col + 1 : 1\n          };\n          var skippedRow = 0;\n          var skippedColumn = 0;\n          var pushData = true;\n          var cellMeta = void 0;\n\n          var getInputValue = function getInputValue(row) {\n            var col = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n            var rowValue = input[row % input.length];\n\n            if (col !== null) {\n              return rowValue[col % rowValue.length];\n            }\n\n            return rowValue;\n          };\n          var rowInputLength = input.length;\n          var rowSelectionLength = end ? end.row - start.row + 1 : 0;\n\n          if (end) {\n            rlen = rowSelectionLength;\n          } else {\n            rlen = Math.max(rowInputLength, rowSelectionLength);\n          }\n          for (r = 0; r < rlen; r++) {\n            if (end && current.row > end.row && rowSelectionLength > rowInputLength || !priv.settings.allowInsertRow && current.row > instance.countRows() - 1 || current.row >= priv.settings.maxRows) {\n              break;\n            }\n            var visualRow = r - skippedRow;\n            var colInputLength = getInputValue(visualRow).length;\n            var colSelectionLength = end ? end.col - start.col + 1 : 0;\n\n            if (end) {\n              clen = colSelectionLength;\n            } else {\n              clen = Math.max(colInputLength, colSelectionLength);\n            }\n            current.col = start.col;\n            cellMeta = instance.getCellMeta(current.row, current.col);\n\n            if ((source === 'CopyPaste.paste' || source === 'Autofill.autofill') && cellMeta.skipRowOnPaste) {\n              skippedRow++;\n              current.row++;\n              rlen++;\n              /* eslint-disable no-continue */\n              continue;\n            }\n            skippedColumn = 0;\n\n            for (c = 0; c < clen; c++) {\n              if (end && current.col > end.col && colSelectionLength > colInputLength || !priv.settings.allowInsertColumn && current.col > instance.countCols() - 1 || current.col >= priv.settings.maxCols) {\n                break;\n              }\n              cellMeta = instance.getCellMeta(current.row, current.col);\n\n              if ((source === 'CopyPaste.paste' || source === 'Autofill.fill') && cellMeta.skipColumnOnPaste) {\n                skippedColumn++;\n                current.col++;\n                clen++;\n                continue;\n              }\n              if (cellMeta.readOnly) {\n                current.col++;\n                /* eslint-disable no-continue */\n                continue;\n              }\n              var visualColumn = c - skippedColumn;\n              var value = getInputValue(visualRow, visualColumn);\n              var orgValue = instance.getDataAtCell(current.row, current.col);\n              var index = {\n                row: visualRow,\n                col: visualColumn\n              };\n\n              if (source === 'Autofill.fill') {\n                var result = instance.runHooks('beforeAutofillInsidePopulate', index, direction, input, deltas, {}, selected);\n\n                if (result) {\n                  value = (0, _mixed.isUndefined)(result.value) ? value : result.value;\n                }\n              }\n              if (value !== null && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') {\n                if (orgValue === null || (typeof orgValue === 'undefined' ? 'undefined' : _typeof(orgValue)) !== 'object') {\n                  pushData = false;\n                } else {\n                  var orgValueSchema = (0, _object.duckSchema)(orgValue[0] || orgValue);\n                  var valueSchema = (0, _object.duckSchema)(value[0] || value);\n\n                  /* eslint-disable max-depth */\n                  if ((0, _object.isObjectEqual)(orgValueSchema, valueSchema)) {\n                    value = (0, _object.deepClone)(value);\n                  } else {\n                    pushData = false;\n                  }\n                }\n              } else if (orgValue !== null && (typeof orgValue === 'undefined' ? 'undefined' : _typeof(orgValue)) === 'object') {\n                pushData = false;\n              }\n              if (pushData) {\n                setData.push([current.row, current.col, value]);\n              }\n              pushData = true;\n              current.col++;\n            }\n            current.row++;\n          }\n          instance.setDataAtCell(setData, null, null, source || 'populateFromArray');\n          break;\n      }\n    }\n  };\n\n  /**\n   * Internal function to set `language` key of settings.\n   *\n   * @private\n   * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'\n   * @fires Hooks#afterLanguageChange\n   */\n  function setLanguage(languageCode) {\n    var normalizedLanguageCode = (0, _utils.normalizeLanguageCode)(languageCode);\n\n    if ((0, _dictionariesManager.hasLanguageDictionary)(normalizedLanguageCode)) {\n      instance.runHooks('beforeLanguageChange', normalizedLanguageCode);\n\n      GridSettings.prototype.language = normalizedLanguageCode;\n\n      instance.runHooks('afterLanguageChange', normalizedLanguageCode);\n    } else {\n      (0, _utils.warnUserAboutLanguageRegistration)(languageCode);\n    }\n  }\n\n  this.init = function () {\n    dataSource.setData(priv.settings.data);\n    instance.runHooks('beforeInit');\n\n    if ((0, _browser.isMobileBrowser)()) {\n      (0, _element.addClass)(instance.rootElement, 'mobile');\n    }\n\n    this.updateSettings(priv.settings, true);\n\n    this.view = new _tableView2.default(this);\n    editorManager = _editorManager2.default.getInstance(instance, priv, selection, datamap);\n\n    this.forceFullRender = true; // used when data was changed\n\n    instance.runHooks('init');\n    this.view.render();\n\n    if (_typeof(priv.firstRun) === 'object') {\n      instance.runHooks('afterChange', priv.firstRun[0], priv.firstRun[1]);\n      priv.firstRun = false;\n    }\n    instance.runHooks('afterInit');\n  };\n\n  function ValidatorsQueue() {\n    // moved this one level up so it can be used in any function here. Probably this should be moved to a separate file\n    var resolved = false;\n\n    return {\n      validatorsInQueue: 0,\n      valid: true,\n      addValidatorToQueue: function addValidatorToQueue() {\n        this.validatorsInQueue++;\n        resolved = false;\n      },\n      removeValidatorFormQueue: function removeValidatorFormQueue() {\n        this.validatorsInQueue = this.validatorsInQueue - 1 < 0 ? 0 : this.validatorsInQueue - 1;\n        this.checkIfQueueIsEmpty();\n      },\n      onQueueEmpty: function onQueueEmpty(valid) {},\n      checkIfQueueIsEmpty: function checkIfQueueIsEmpty() {\n        if (this.validatorsInQueue == 0 && resolved == false) {\n          resolved = true;\n          this.onQueueEmpty(this.valid);\n        }\n      }\n    };\n  }\n\n  /**\n   * Get parsed number from numeric string.\n   *\n   * @private\n   * @param {String} numericData Float (separated by a dot or a comma) or integer.\n   * @returns {Number} Number if we get data in parsable format, not changed value otherwise.\n   */\n  function getParsedNumber(numericData) {\n    // Unifying \"float like\" string. Change from value with comma determiner to value with dot determiner,\n    // for example from `450,65` to `450.65`.\n    var unifiedNumericData = numericData.replace(',', '.');\n\n    if (isNaN(parseFloat(unifiedNumericData)) === false) {\n      return parseFloat(unifiedNumericData);\n    }\n\n    return numericData;\n  }\n\n  function validateChanges(changes, source, callback) {\n    var waitingForValidator = new ValidatorsQueue();\n    var isNumericData = function isNumericData(value) {\n      return value.length > 0 && /^-?[\\d\\s]*(\\.|,)?\\d*$/.test(value);\n    };\n\n    waitingForValidator.onQueueEmpty = resolve;\n\n    for (var i = changes.length - 1; i >= 0; i--) {\n      if (changes[i] === null) {\n        changes.splice(i, 1);\n      } else {\n        var _changes$i = _slicedToArray(changes[i], 4),\n            row = _changes$i[0],\n            prop = _changes$i[1],\n            newValue = _changes$i[3];\n\n        var col = datamap.propToCol(prop);\n        var cellProperties = instance.getCellMeta(row, col);\n\n        if (cellProperties.type === 'numeric' && typeof newValue === 'string' && isNumericData(newValue)) {\n          changes[i][3] = getParsedNumber(newValue);\n        }\n\n        /* eslint-disable no-loop-func */\n        if (instance.getCellValidator(cellProperties)) {\n          waitingForValidator.addValidatorToQueue();\n          instance.validateCell(changes[i][3], cellProperties, function (i, cellProperties) {\n            return function (result) {\n              if (typeof result !== 'boolean') {\n                throw new Error('Validation error: result is not boolean');\n              }\n              if (result === false && cellProperties.allowInvalid === false) {\n                changes.splice(i, 1); // cancel the change\n                cellProperties.valid = true; // we cancelled the change, so cell value is still valid\n                var cell = instance.getCell(cellProperties.visualRow, cellProperties.visualCol);\n                (0, _element.removeClass)(cell, instance.getSettings().invalidCellClassName);\n                --i;\n              }\n              waitingForValidator.removeValidatorFormQueue();\n            };\n          }(i, cellProperties), source);\n        }\n      }\n    }\n    waitingForValidator.checkIfQueueIsEmpty();\n\n    function resolve() {\n      var beforeChangeResult;\n\n      if (changes.length) {\n        beforeChangeResult = instance.runHooks('beforeChange', changes, source || 'edit');\n        if ((0, _function.isFunction)(beforeChangeResult)) {\n          (0, _console.warn)('Your beforeChange callback returns a function. It\\'s not supported since Handsontable 0.12.1 (and the returned function will not be executed).');\n        } else if (beforeChangeResult === false) {\n          changes.splice(0, changes.length); // invalidate all changes (remove everything from array)\n        }\n      }\n      callback(); // called when async validators are resolved and beforeChange was not async\n    }\n  }\n\n  /**\n   * Internal function to apply changes. Called after validateChanges\n   *\n   * @private\n   * @param {Array} changes Array in form of [row, prop, oldValue, newValue]\n   * @param {String} source String that identifies how this change will be described in changes array (useful in onChange callback)\n   * @fires Hooks#beforeChangeRender\n   * @fires Hooks#afterChange\n   */\n  function applyChanges(changes, source) {\n    var i = changes.length - 1;\n\n    if (i < 0) {\n      return;\n    }\n\n    for (; i >= 0; i--) {\n      var skipThisChange = false;\n\n      if (changes[i] === null) {\n        changes.splice(i, 1);\n        /* eslint-disable no-continue */\n        continue;\n      }\n\n      if (changes[i][2] == null && changes[i][3] == null) {\n        /* eslint-disable no-continue */\n        continue;\n      }\n\n      if (priv.settings.allowInsertRow) {\n        while (changes[i][0] > instance.countRows() - 1) {\n          var numberOfCreatedRows = datamap.createRow(void 0, void 0, source);\n\n          if (numberOfCreatedRows === 0) {\n            skipThisChange = true;\n            break;\n          }\n        }\n      }\n\n      if (skipThisChange) {\n        /* eslint-disable no-continue */\n        continue;\n      }\n\n      if (instance.dataType === 'array' && (!priv.settings.columns || priv.settings.columns.length === 0) && priv.settings.allowInsertColumn) {\n        while (datamap.propToCol(changes[i][1]) > instance.countCols() - 1) {\n          datamap.createCol(void 0, void 0, source);\n        }\n      }\n\n      datamap.set(changes[i][0], changes[i][1], changes[i][3]);\n    }\n\n    instance.forceFullRender = true; // used when data was changed\n    grid.adjustRowsAndCols();\n    instance.runHooks('beforeChangeRender', changes, source);\n    editorManager.lockEditor();\n    instance._refreshBorders(null);\n    editorManager.unlockEditor();\n    instance.view.wt.wtOverlays.adjustElementsSize();\n    instance.runHooks('afterChange', changes, source || 'edit');\n\n    var activeEditor = instance.getActiveEditor();\n\n    if (activeEditor && (0, _mixed.isDefined)(activeEditor.refreshValue)) {\n      activeEditor.refreshValue();\n    }\n  }\n\n  /**\n   * Validate a single cell.\n   *\n   * @param {String|Number} value\n   * @param cellProperties\n   * @param callback\n   * @param source\n   */\n  this.validateCell = function (value, cellProperties, callback, source) {\n    var validator = instance.getCellValidator(cellProperties);\n\n    // the `canBeValidated = false` argument suggests, that the cell passes validation by default.\n    function done(valid) {\n      var canBeValidated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n      // Fixes GH#3903\n      if (!canBeValidated || cellProperties.hidden === true) {\n        callback(valid);\n        return;\n      }\n\n      var col = cellProperties.visualCol,\n          row = cellProperties.visualRow,\n          td = instance.getCell(row, col, true);\n\n      if (td && td.nodeName != 'TH') {\n        instance.view.wt.wtSettings.settings.cellRenderer(row, col, td);\n      }\n      callback(valid);\n    }\n\n    if ((0, _mixed.isRegExp)(validator)) {\n      validator = function (validator) {\n        return function (value, callback) {\n          callback(validator.test(value));\n        };\n      }(validator);\n    }\n\n    if ((0, _function.isFunction)(validator)) {\n\n      value = instance.runHooks('beforeValidate', value, cellProperties.visualRow, cellProperties.prop, source);\n\n      // To provide consistent behaviour, validation should be always asynchronous\n      instance._registerTimeout(setTimeout(function () {\n        validator.call(cellProperties, value, function (valid) {\n          valid = instance.runHooks('afterValidate', valid, value, cellProperties.visualRow, cellProperties.prop, source);\n          cellProperties.valid = valid;\n\n          done(valid);\n          instance.runHooks('postAfterValidate', valid, value, cellProperties.visualRow, cellProperties.prop, source);\n        });\n      }, 0));\n    } else {\n      // resolve callback even if validator function was not found\n      instance._registerTimeout(setTimeout(function () {\n        cellProperties.valid = true;\n        done(cellProperties.valid, false);\n      }, 0));\n    }\n  };\n\n  function setDataInputToArray(row, propOrCol, value) {\n    if ((typeof row === 'undefined' ? 'undefined' : _typeof(row)) === 'object') {\n      // is it an array of changes\n      return row;\n    }\n    return [[row, propOrCol, value]];\n  }\n\n  /**\n   * @description\n   * Set new value to a cell. To change many cells at once, pass an array of `changes` in format `[[row, col, value], ...]` as\n   * the only parameter. `col` is the index of a __visible__ column (note that if columns were reordered,\n   * the current visible order will be used). `source` is a flag for before/afterChange events. If you pass only array of\n   * changes then `source` could be set as second parameter.\n   *\n   * @memberof Core#\n   * @function setDataAtCell\n   * @param {Number|Array} row Visual row index or array of changes in format `[[row, col, value], ...]`.\n   * @param {Number} col Visual column index.\n   * @param {String} value New value.\n   * @param {String} [source] String that identifies how this change will be described in the changes array (useful in onAfterChange or onBeforeChange callback).\n   */\n  this.setDataAtCell = function (row, col, value, source) {\n    var input = setDataInputToArray(row, col, value),\n        i,\n        ilen,\n        changes = [],\n        prop;\n\n    for (i = 0, ilen = input.length; i < ilen; i++) {\n      if (_typeof(input[i]) !== 'object') {\n        throw new Error('Method `setDataAtCell` accepts row number or changes array of arrays as its first parameter');\n      }\n      if (typeof input[i][1] !== 'number') {\n        throw new Error('Method `setDataAtCell` accepts row and column number as its parameters. If you want to use object property name, use method `setDataAtRowProp`');\n      }\n      prop = datamap.colToProp(input[i][1]);\n      changes.push([input[i][0], prop, dataSource.getAtCell(recordTranslator.toPhysicalRow(input[i][0]), input[i][1]), input[i][2]]);\n    }\n\n    if (!source && (typeof row === 'undefined' ? 'undefined' : _typeof(row)) === 'object') {\n      source = col;\n    }\n\n    instance.runHooks('afterSetDataAtCell', changes, source);\n\n    validateChanges(changes, source, function () {\n      applyChanges(changes, source);\n    });\n  };\n\n  /**\n   * @description\n   * Set new value to a cell. To change many cells at once, pass an array of `changes` in format `[[row, prop, value], ...]` as\n   * the only parameter. `prop` is the name of the object property (e.g. `first.name`). `source` is a flag for before/afterChange events.\n   * If you pass only array of changes then `source` could be set as second parameter.\n   *\n   * @memberof Core#\n   * @function setDataAtRowProp\n   * @param {Number|Array} row Visual row index or array of changes in format `[[row, prop, value], ...]`.\n   * @param {String} prop Property name or the source string.\n   * @param {String} value Value to be set.\n   * @param {String} [source] String that identifies how this change will be described in changes array (useful in onChange callback).\n   */\n  this.setDataAtRowProp = function (row, prop, value, source) {\n    var input = setDataInputToArray(row, prop, value),\n        i,\n        ilen,\n        changes = [];\n\n    for (i = 0, ilen = input.length; i < ilen; i++) {\n      changes.push([input[i][0], input[i][1], dataSource.getAtCell(recordTranslator.toPhysicalRow(input[i][0]), input[i][1]), input[i][2]]);\n    }\n\n    if (!source && (typeof row === 'undefined' ? 'undefined' : _typeof(row)) === 'object') {\n      source = prop;\n    }\n\n    instance.runHooks('afterSetDataAtRowProp', changes, source);\n\n    validateChanges(changes, source, function () {\n      applyChanges(changes, source);\n    });\n  };\n\n  /**\n   * Listen to the keyboard input on document body.\n   *\n   * @memberof Core#\n   * @function listen\n   * @since 0.11\n   * @param {Boolean} [modifyDocumentFocus=true] If `true`, currently focused element will be blured (which returns focus\n   *                                             to the document.body). Otherwise the active element does not lose its focus.\n   */\n  this.listen = function () {\n    var modifyDocumentFocus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n    if (modifyDocumentFocus) {\n      var invalidActiveElement = !document.activeElement || document.activeElement && document.activeElement.nodeName === void 0;\n\n      if (document.activeElement && document.activeElement !== document.body && !invalidActiveElement) {\n        document.activeElement.blur();\n      } else if (invalidActiveElement) {\n        // IE\n        document.body.focus();\n      }\n    }\n\n    if (instance && !instance.isListening()) {\n      activeGuid = instance.guid;\n      instance.runHooks('afterListen');\n    }\n  };\n\n  /**\n   * Stop listening to keyboard input on the document body.\n   *\n   * @memberof Core#\n   * @function unlisten\n   * @since 0.11\n   */\n  this.unlisten = function () {\n    if (this.isListening()) {\n      activeGuid = null;\n      instance.runHooks('afterUnlisten');\n    }\n  };\n\n  /**\n   * Returns `true` if the current Handsontable instance is listening to keyboard input on document body.\n   *\n   * @memberof Core#\n   * @function isListening\n   * @since 0.11\n   * @returns {Boolean} `true` if the instance is listening, `false` otherwise.\n   */\n  this.isListening = function () {\n    return activeGuid === instance.guid;\n  };\n\n  /**\n   * Destroys the current editor, renders and selects the current cell.\n   *\n   * @memberof Core#\n   * @function destroyEditor\n   * @param {Boolean} [revertOriginal] If != `true`, edited data is saved. Otherwise the previous value is restored.\n   */\n  this.destroyEditor = function (revertOriginal) {\n    instance._refreshBorders(revertOriginal);\n  };\n\n  /**\n   * Populate cells at position with 2D input array (e.g. `[[1, 2], [3, 4]]`).\n   * Use `endRow`, `endCol` when you want to cut input when a certain row is reached.\n   * Optional `source` parameter (default value \"populateFromArray\") is used to identify this call in the resulting events (beforeChange, afterChange).\n   * Optional `populateMethod` parameter (default value \"overwrite\", possible values \"shift_down\" and \"shift_right\")\n   * has the same effect as pasteMode option {@link Options#pasteMode}\n   *\n   * @memberof Core#\n   * @function populateFromArray\n   * @since 0.9.0\n   * @param {Number} row Start visual row index.\n   * @param {Number} col Start visual column index.\n   * @param {Array} input 2d array\n   * @param {Number} [endRow] End visual row index (use when you want to cut input when certain row is reached).\n   * @param {Number} [endCol] End visual column index (use when you want to cut input when certain column is reached).\n   * @param {String} [source=\"populateFromArray\"] Source string.\n   * @param {String} [method=\"overwrite\"] Populate method. Possible options: `shift_down`, `shift_right`, `overwrite`.\n   * @param {String} direction Populate direction. (left|right|up|down)\n   * @param {Array} deltas Deltas array.\n   * @returns {Object|undefined} The ending TD element in pasted area (only if any cells were changed).\n   */\n  this.populateFromArray = function (row, col, input, endRow, endCol, source, method, direction, deltas) {\n    var c;\n\n    if (!((typeof input === 'undefined' ? 'undefined' : _typeof(input)) === 'object' && _typeof(input[0]) === 'object')) {\n      throw new Error('populateFromArray parameter `input` must be an array of arrays'); // API changed in 0.9-beta2, let's check if you use it correctly\n    }\n    c = typeof endRow === 'number' ? new _src.CellCoords(endRow, endCol) : null;\n\n    return grid.populateFromArray(new _src.CellCoords(row, col), input, c, source, method, direction, deltas);\n  };\n\n  /**\n   * Adds/removes data from the column. This function is modelled after Array.splice.\n   * Parameter `col` is the index of the column in which do you want to do splice.\n   * Parameter `index` is the row index at which to start changing the array.\n   * If negative, will begin that many elements from the end. Parameter `amount`, is the number of the old array elements to remove.\n   * If the amount is 0, no elements are removed. Fourth and further parameters are the `elements` to add to the array.\n   * If you don't specify any elements, spliceCol simply removes elements from the array.\n   * {@link DataMap#spliceCol}\n   *\n   * @memberof Core#\n   * @function spliceCol\n   * @since 0.9-beta2\n   * @param {Number} col Index of the column in which do you want to do splice.\n   * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end.\n   * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed.\n   * @param {*} [elements] The elements to add to the array. If you don't specify any elements, spliceCol simply removes elements from the array.\n   */\n  this.spliceCol = function (col, index, amount /* , elements... */) {\n    var _datamap;\n\n    return (_datamap = datamap).spliceCol.apply(_datamap, arguments);\n  };\n\n  /**\n   * Adds/removes data from the row. This function works is modelled after Array.splice.\n   * Parameter `row` is the index of row in which do you want to do splice.\n   * Parameter `index` is the column index at which to start changing the array.\n   * If negative, will begin that many elements from the end. Parameter `amount`, is the number of old array elements to remove.\n   * If the amount is 0, no elements are removed. Fourth and further parameters are the `elements` to add to the array.\n   * If you don't specify any elements, spliceCol simply removes elements from the array.\n   * {@link DataMap#spliceRow}\n   *\n   * @memberof Core#\n   * @function spliceRow\n   * @since 0.11\n   * @param {Number} row Index of column in which do you want to do splice.\n   * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end.\n   * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed.\n   * @param {*} [elements] The elements to add to the array. If you don't specify any elements, spliceCol simply removes elements from the array.\n   */\n  this.spliceRow = function (row, index, amount /* , elements... */) {\n    var _datamap2;\n\n    return (_datamap2 = datamap).spliceRow.apply(_datamap2, arguments);\n  };\n\n  /**\n   * Returns indexes of the currently selected cells as an array of arrays `[[startRow, startCol, endRow, endCol], ...]`.\n   *\n   * Start row and start col are the coordinates of the active cell (where the selection was started).\n   *\n   * The version 0.36.0 adds a non-consecutive selection feature. Since this version, the method returns an array of arrays.\n   * Additionally to collect the coordinates of the currently selected area (as it was previously done by the method)\n   * you need to use `getSelectedLast` method.\n   *\n   * @memberof Core#\n   * @function getSelected\n   * @returns {Array[]|undefined} An array of arrays of the selection's coordinates.\n   */\n  this.getSelected = function () {\n    // https://github.com/handsontable/handsontable/issues/44  //cjl\n    if (selection.isSelected()) {\n      return (0, _array.arrayMap)(selection.getSelectedRange(), function (_ref11) {\n        var from = _ref11.from,\n            to = _ref11.to;\n        return [from.row, from.col, to.row, to.col];\n      });\n    }\n  };\n\n  /**\n   * Returns the last coordinates applied to the table as a an array `[startRow, startCol, endRow, endCol]`.\n   *\n   * @since 0.36.0\n   * @memberof Core#\n   * @function getSelectedLast\n   * @returns {Array|undefined} An array of the selection's coordinates.\n   */\n  this.getSelectedLast = function () {\n    var selected = this.getSelected();\n    var result = void 0;\n\n    if (selected && selected.length > 0) {\n      result = selected[selected.length - 1];\n    }\n\n    return result;\n  };\n\n  /**\n   * Returns the current selection as an array of CellRange objects.\n   *\n   * The version 0.36.0 adds a non-consecutive selection feature. Since this version, the method returns an array of arrays.\n   * Additionally to collect the coordinates of the currently selected area (as it was previously done by the method)\n   * you need to use `getSelectedRangeLast` method.\n   *\n   * @memberof Core#\n   * @function getSelectedRange\n   * @since 0.11\n   * @returns {CellRange[]|undefined} Selected range object or undefined` if there is no selection.\n   */\n  this.getSelectedRange = function () {\n    // https://github.com/handsontable/handsontable/issues/44  //cjl\n    if (selection.isSelected()) {\n      return Array.from(selection.getSelectedRange());\n    }\n  };\n\n  /**\n  * Returns the last coordinates applied to the table as a CellRange object.\n  *\n  * @memberof Core#\n  * @function getSelectedRangeLast\n  * @since 0.36.0\n  * @returns {CellRange|undefined} Selected range object or undefined` if there is no selection.\n   */\n  this.getSelectedRangeLast = function () {\n    var selectedRange = this.getSelectedRange();\n    var result = void 0;\n\n    if (selectedRange && selectedRange.length > 0) {\n      result = selectedRange[selectedRange.length - 1];\n    }\n\n    return result;\n  };\n\n  /**\n   * Erases content from cells that have been selected in the table.\n   *\n   * @memberof Core#\n   * @function emptySelectedCells\n   * @since 0.36.0\n   */\n  this.emptySelectedCells = function () {\n    var _this2 = this;\n\n    if (!selection.isSelected()) {\n      return;\n    }\n    var changes = [];\n\n    (0, _array.arrayEach)(selection.getSelectedRange(), function (cellRange) {\n      var topLeft = cellRange.getTopLeftCorner();\n      var bottomRight = cellRange.getBottomRightCorner();\n\n      (0, _number.rangeEach)(topLeft.row, bottomRight.row, function (row) {\n        (0, _number.rangeEach)(topLeft.col, bottomRight.col, function (column) {\n          if (!_this2.getCellMeta(row, column).readOnly) {\n            changes.push([row, column, '']);\n          }\n        });\n      });\n    });\n\n    if (changes.length > 0) {\n      this.setDataAtCell(changes);\n    }\n  };\n\n  /**\n   * Rerender the table.\n   *\n   * @memberof Core#\n   * @function render\n   */\n  this.render = function () {\n    if (instance.view) {\n      instance.renderCall = true;\n      instance.forceFullRender = true; // used when data was changed\n      editorManager.lockEditor();\n      instance._refreshBorders(null);\n      editorManager.unlockEditor();\n    }\n  };\n\n  /**\n   * Reset all cells in the grid to contain data from the data array.\n   *\n   * @memberof Core#\n   * @function loadData\n   * @param {Array} data Array of arrays or array of objects containing data.\n   * @fires Hooks#afterLoadData\n   * @fires Hooks#afterChange\n   */\n  this.loadData = function (data) {\n    if (Array.isArray(priv.settings.dataSchema)) {\n      instance.dataType = 'array';\n    } else if ((0, _function.isFunction)(priv.settings.dataSchema)) {\n      instance.dataType = 'function';\n    } else {\n      instance.dataType = 'object';\n    }\n\n    if (datamap) {\n      datamap.destroy();\n    }\n    datamap = new _dataMap2.default(instance, priv, GridSettings);\n\n    if ((typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object' && data !== null) {\n      if (!(data.push && data.splice)) {\n        // check if data is array. Must use duck-type check so Backbone Collections also pass it\n        // when data is not an array, attempt to make a single-row array of it\n        data = [data];\n      }\n    } else if (data === null) {\n      data = [];\n      var row;\n      var r = 0;\n      var rlen = 0;\n      var dataSchema = datamap.getSchema();\n\n      for (r = 0, rlen = priv.settings.startRows; r < rlen; r++) {\n        if ((instance.dataType === 'object' || instance.dataType === 'function') && priv.settings.dataSchema) {\n          row = (0, _object.deepClone)(dataSchema);\n          data.push(row);\n        } else if (instance.dataType === 'array') {\n          row = (0, _object.deepClone)(dataSchema[0]);\n          data.push(row);\n        } else {\n          row = [];\n\n          for (var c = 0, clen = priv.settings.startCols; c < clen; c++) {\n            row.push(null);\n          }\n\n          data.push(row);\n        }\n      }\n    } else {\n      throw new Error('loadData only accepts array of objects or array of arrays (' + (typeof data === 'undefined' ? 'undefined' : _typeof(data)) + ' given)');\n    }\n\n    priv.isPopulated = false;\n    GridSettings.prototype.data = data;\n\n    if (Array.isArray(data[0])) {\n      instance.dataType = 'array';\n    }\n\n    datamap.dataSource = data;\n    dataSource.data = data;\n    dataSource.dataType = instance.dataType;\n    dataSource.colToProp = datamap.colToProp.bind(datamap);\n    dataSource.propToCol = datamap.propToCol.bind(datamap);\n\n    clearCellSettingCache();\n\n    grid.adjustRowsAndCols();\n    instance.runHooks('afterLoadData', priv.firstRun);\n\n    if (priv.firstRun) {\n      priv.firstRun = [null, 'loadData'];\n    } else {\n      instance.runHooks('afterChange', null, 'loadData');\n      instance.render();\n    }\n    priv.isPopulated = true;\n\n    function clearCellSettingCache() {\n      priv.cellSettings.length = 0;\n    }\n  };\n\n  /**\n   * Returns the current data object (the same one that was passed by `data` configuration option or `loadData` method,\n   * unless the `modifyRow` hook was used to trim some of the rows. If that's the case - use the {@link Core#getSourceData} method.).\n   * Optionally you can provide cell range by defining `row`, `col`, `row2`, `col2` to get only a fragment of grid data.\n   *\n   * Note: getData functionality changed with the release of version 0.20. If you're looking for the previous functionality,\n   * you should use the {@link Core#getSourceData} method.\n   *\n   * @memberof Core#\n   * @function getData\n   * @param {Number} [r] From visual row index.\n   * @param {Number} [c] From visual column index.\n   * @param {Number} [r2] To visual row index.\n   * @param {Number} [c2] To visual column index.\n   * @returns {Array} Array with the data.\n   */\n  this.getData = function (r, c, r2, c2) {\n    if ((0, _mixed.isUndefined)(r)) {\n      return datamap.getAll();\n    }\n    return datamap.getRange(new _src.CellCoords(r, c), new _src.CellCoords(r2, c2), datamap.DESTINATION_RENDERER);\n  };\n\n  /**\n   * Returns a string value of the selected range. Each column is separated by tab, each row is separated by a new line character.\n   * {@link DataMap#getCopyableText}\n   *\n   * @memberof Core#\n   * @function getCopyableText\n   * @since 0.11\n   * @param {Number} startRow From visual row index.\n   * @param {Number} startCol From visual column index.\n   * @param {Number} endRow To visual row index.\n   * @param {Number} endCol To visual column index.\n   * @returns {String}\n   */\n  this.getCopyableText = function (startRow, startCol, endRow, endCol) {\n    return datamap.getCopyableText(new _src.CellCoords(startRow, startCol), new _src.CellCoords(endRow, endCol));\n  };\n\n  /**\n   * Returns the data's copyable value at specified row and column index ({@link DataMap#getCopyable}).\n   *\n   * @memberof Core#\n   * @function getCopyableData\n   * @since 0.19.0\n   * @param {Number} row Visual row index.\n   * @param {Number} column Visual column index.\n   * @returns {String}\n   */\n  this.getCopyableData = function (row, column) {\n    return datamap.getCopyable(row, datamap.colToProp(column));\n  };\n\n  /**\n   * Returns schema provided by constructor settings. If it doesn't exist then it returns the schema based on the data\n   * structure in the first row.\n   *\n   * @memberof Core#\n   * @function getSchema\n   * @since 0.13.2\n   * @returns {Object} Schema object.\n   */\n  this.getSchema = function () {\n    return datamap.getSchema();\n  };\n\n  /**\n   * Use it if you need to change configuration after initialization. The `settings` parameter is an object containing the new\n   * settings, declared the same way as in the initial settings object.\n   * Note, that although the `updateSettings` method doesn't overwrite the previously declared settings, it might reset\n   * the settings made post-initialization. (for example - ignore changes made using the columnResize feature).\n   *\n   * @memberof Core#\n   * @function updateSettings\n   * @param {Object} settings New settings object.\n   * @param {Boolean} init Calls this method in the initialization mode. Internal use only.\n   *                       Used by API could be cause of the unexpected behaviour of the Handsontable.\n   * @example\n   * ```js\n   * hot.updateSettings({\n   *    contextMenu: true,\n   *    colHeaders: true,\n   *    fixedRowsTop: 2\n   * });\n   * ```\n   * @fires Hooks#afterCellMetaReset\n   * @fires Hooks#afterUpdateSettings\n   */\n  this.updateSettings = function (settings, init) {\n    var columnsAsFunc = false;\n    var i = void 0;\n    var j = void 0;\n    var clen = void 0;\n\n    if ((0, _mixed.isDefined)(settings.rows)) {\n      throw new Error('\"rows\" setting is no longer supported. do you mean startRows, minRows or maxRows?');\n    }\n    if ((0, _mixed.isDefined)(settings.cols)) {\n      throw new Error('\"cols\" setting is no longer supported. do you mean startCols, minCols or maxCols?');\n    }\n\n    for (i in settings) {\n      if (i === 'data') {\n        /* eslint-disable-next-line no-continue */\n        continue; // loadData will be triggered later\n      } else if (i === 'language') {\n        setLanguage(settings.language);\n\n        /* eslint-disable-next-line no-continue */\n        continue;\n      } else if (_pluginHooks2.default.getSingleton().getRegistered().indexOf(i) > -1) {\n        if ((0, _function.isFunction)(settings[i]) || Array.isArray(settings[i])) {\n          settings[i].initialHook = true;\n          instance.addHook(i, settings[i]);\n        }\n      } else if (!init && (0, _object.hasOwnProperty)(settings, i)) {\n        // Update settings\n        GridSettings.prototype[i] = settings[i];\n      }\n    }\n\n    // Load data or create data map\n    if (settings.data === void 0 && priv.settings.data === void 0) {\n      instance.loadData(null); // data source created just now\n    } else if (settings.data !== void 0) {\n      instance.loadData(settings.data); // data source given as option\n    } else if (settings.columns !== void 0) {\n      datamap.createMap();\n    }\n\n    clen = instance.countCols();\n\n    var columnSetting = settings.columns || GridSettings.prototype.columns;\n\n    // Init columns constructors configuration\n    if (columnSetting && (0, _function.isFunction)(columnSetting)) {\n      clen = instance.countSourceCols();\n      columnsAsFunc = true;\n    }\n\n    // Clear cellSettings cache\n    if (settings.cell !== void 0 || settings.cells !== void 0 || settings.columns !== void 0) {\n      priv.cellSettings.length = 0;\n    }\n\n    if (clen > 0) {\n      var proto = void 0;\n      var column = void 0;\n\n      for (i = 0, j = 0; i < clen; i++) {\n        if (columnsAsFunc && !columnSetting(i)) {\n          /* eslint-disable no-continue */\n          continue;\n        }\n        priv.columnSettings[j] = (0, _setting.columnFactory)(GridSettings, priv.columnsSettingConflicts);\n\n        // shortcut for prototype\n        proto = priv.columnSettings[j].prototype;\n\n        // Use settings provided by user\n        if (columnSetting) {\n          if (columnsAsFunc) {\n            column = columnSetting(i);\n          } else {\n            column = columnSetting[j];\n          }\n\n          if (column) {\n            (0, _object.extend)(proto, column);\n            (0, _object.extend)(proto, expandType(column));\n          }\n        }\n\n        j++;\n      }\n    }\n\n    if ((0, _mixed.isDefined)(settings.cell)) {\n      for (var key in settings.cell) {\n        if ((0, _object.hasOwnProperty)(settings.cell, key)) {\n          var cell = settings.cell[key];\n\n          instance.setCellMetaObject(cell.row, cell.col, cell);\n        }\n      }\n    }\n\n    instance.runHooks('afterCellMetaReset');\n\n    if ((0, _mixed.isDefined)(settings.className)) {\n      if (GridSettings.prototype.className) {\n        (0, _element.removeClass)(instance.rootElement, GridSettings.prototype.className);\n      }\n      if (settings.className) {\n        (0, _element.addClass)(instance.rootElement, settings.className);\n      }\n    }\n\n    var currentHeight = instance.rootElement.style.height;\n    if (currentHeight !== '') {\n      currentHeight = parseInt(instance.rootElement.style.height, 10);\n    }\n\n    var height = settings.height;\n    if ((0, _function.isFunction)(height)) {\n      height = height();\n    }\n\n    if (init) {\n      var initialStyle = instance.rootElement.getAttribute('style');\n\n      if (initialStyle) {\n        instance.rootElement.setAttribute('data-initialstyle', instance.rootElement.getAttribute('style'));\n      }\n    }\n\n    if (height === null) {\n      var _initialStyle = instance.rootElement.getAttribute('data-initialstyle');\n\n      if (_initialStyle && (_initialStyle.indexOf('height') > -1 || _initialStyle.indexOf('overflow') > -1)) {\n        instance.rootElement.setAttribute('style', _initialStyle);\n      } else {\n        instance.rootElement.style.height = '';\n        instance.rootElement.style.overflow = '';\n      }\n    } else if (height !== void 0) {\n      instance.rootElement.style.height = height + 'px';\n      instance.rootElement.style.overflow = 'hidden';\n    }\n\n    if (typeof settings.width !== 'undefined') {\n      var width = settings.width;\n\n      if ((0, _function.isFunction)(width)) {\n        width = width();\n      }\n\n      instance.rootElement.style.width = width + 'px';\n    }\n\n    if (!init) {\n      datamap.clearLengthCache(); // force clear cache length on updateSettings() #3416\n\n      if (instance.view) {\n        instance.view.wt.wtViewport.resetHasOversizedColumnHeadersMarked();\n      }\n\n      instance.runHooks('afterUpdateSettings', settings);\n    }\n\n    grid.adjustRowsAndCols();\n    if (instance.view && !priv.firstRun) {\n      instance.forceFullRender = true; // used when data was changed\n      editorManager.lockEditor();\n      instance._refreshBorders(null);\n      editorManager.unlockEditor();\n    }\n\n    if (!init && instance.view && (currentHeight === '' || height === '' || height === void 0) && currentHeight !== height) {\n      instance.view.wt.wtOverlays.updateMainScrollableElements();\n    }\n  };\n\n  /**\n   * Get value from the selected cell.\n   *\n   * @memberof Core#\n   * @function getValue\n   * @since 0.11\n   * @returns {*} Value of selected cell.\n   */\n  this.getValue = function () {\n    var sel = instance.getSelectedLast();\n\n    if (GridSettings.prototype.getValue) {\n      if ((0, _function.isFunction)(GridSettings.prototype.getValue)) {\n        return GridSettings.prototype.getValue.call(instance);\n      } else if (sel) {\n        return instance.getData()[sel[0][0]][GridSettings.prototype.getValue];\n      }\n    } else if (sel) {\n      return instance.getDataAtCell(sel[0], sel[1]);\n    }\n  };\n\n  function expandType(obj) {\n    if (!(0, _object.hasOwnProperty)(obj, 'type')) {\n      // ignore obj.prototype.type\n      return;\n    }\n\n    var type,\n        expandedType = {};\n\n    if (_typeof(obj.type) === 'object') {\n      type = obj.type;\n    } else if (typeof obj.type === 'string') {\n      type = (0, _cellTypes.getCellType)(obj.type);\n    }\n\n    for (var i in type) {\n      if ((0, _object.hasOwnProperty)(type, i) && !(0, _object.hasOwnProperty)(obj, i)) {\n        expandedType[i] = type[i];\n      }\n    }\n\n    return expandedType;\n  }\n\n  /**\n   * Returns the object settings.\n   *\n   * @memberof Core#\n   * @function getSettings\n   * @returns {Object} Object containing the current grid settings.\n   */\n  this.getSettings = function () {\n    return priv.settings;\n  };\n\n  /**\n   * Clears the data from the grid (the table settings remain intact).\n   *\n   * @memberof Core#\n   * @function clear\n   * @since 0.11.0\n   */\n  this.clear = function () {\n    this.selectAll();\n    this.emptySelectedCells();\n  };\n\n  /**\n   * @memberof Core#\n   * @function alter\n   * @param {String} action See grid.alter for possible values: `\"insert_row\"`, `\"insert_col\"`, `\"remove_row\"`, `\"remove_col\"`\n   * @param {Number} index Visual index of the row/column before which the new row/column will be inserted/removed.\n   * @param {Number} [amount = 1] Amound of rows/columns to be inserted/removed.\n   * @param {String} [source] Source indicator.\n   * @param {Boolean} [keepEmptyRows] Flag for preventing deletion of empty rows.\n   * @description\n   *\n   * Allows altering the table structure by either inserting/removing rows or inserting/removing columns:\n   *\n   * Insert new row(s) above the row with a given `index`. If index is `null` or `undefined`, the new row will be\n   * added after the last row.\n   * ```js\n   * var hot = new Handsontable(document.getElementById('example'));\n   * hot.alter('insert_row', 10);\n   * ```\n   *\n   * Insert new column(s) before the column with a given `index`. If index is `null` or `undefined`, the new column\n   * will be added after the last column.\n   * ```js\n   * var hot = new Handsontable(document.getElementById('example'));\n   * hot.alter('insert_col', 10);\n   * ```\n   *\n   * Remove the row(s) at the given `index`.\n   * ```js\n   * var hot = new Handsontable(document.getElementById('example'));\n   * hot.alter('remove_row', 10);\n   * ```\n   *\n   * Remove the column(s) at the given `index`.\n   * ```js\n   * var hot = new Handsontable(document.getElementById('example'));\n   * hot.alter('remove_col', 10);\n   * ```\n   */\n  this.alter = function (action, index, amount, source, keepEmptyRows) {\n    grid.alter(action, index, amount, source, keepEmptyRows);\n  };\n\n  /**\n   * Returns a TD element for the given `row` and `col` arguments, if it is rendered on screen.\n   * Returns `null` if the TD is not rendered on screen (probably because that part of the table is not visible).\n   *\n   * @memberof Core#\n   * @function getCell\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @param {Boolean} topmost If set to true, it returns the TD element from the topmost overlay. For example,\n   * if the wanted cell is in the range of fixed rows, it will return a TD element from the `top` overlay.\n   * @returns {Element} The cell's TD element.\n   */\n  this.getCell = function (row, col, topmost) {\n    return instance.view.getCellAtCoords(new _src.CellCoords(row, col), topmost);\n  };\n\n  /**\n   * Returns the coordinates of the cell, provided as a HTML Element.\n   *\n   * @memberof Core#\n   * @function getCoords\n   * @param {Element} elem The HTML Element representing the cell.\n   * @returns {CellCoords} Visual coordinates object.\n   */\n  this.getCoords = function (elem) {\n    return this.view.wt.wtTable.getCoords.call(this.view.wt.wtTable, elem);\n  };\n\n  /**\n   * Returns the property name that corresponds with the given column index. {@link DataMap#colToProp}\n   * If the data source is an array of arrays, it returns the columns index.\n   *\n   * @memberof Core#\n   * @function colToProp\n   * @param {Number} col Visual column index.\n   * @returns {String|Number} Column property or physical column index.\n   */\n  this.colToProp = function (col) {\n    return datamap.colToProp(col);\n  };\n\n  /**\n   * Returns column index that corresponds with the given property. {@link DataMap#propToCol}\n   *\n   * @memberof Core#\n   * @function propToCol\n   * @param {String|Number} prop Property name or physical column index.\n   * @returns {Number} Visual column index.\n   */\n  this.propToCol = function (prop) {\n    return datamap.propToCol(prop);\n  };\n\n  /**\n   * Translate physical row index into visual.\n   *\n   * @since 0.29.0\n   * @memberof Core#\n   * @function toVisualRow\n   * @param {Number} row Physical row index.\n   * @returns {Number} Returns visual row index.\n   */\n  this.toVisualRow = function (row) {\n    return recordTranslator.toVisualRow(row);\n  };\n\n  /**\n   * Translate physical column index into visual.\n   *\n   * @since 0.29.0\n   * @memberof Core#\n   * @function toVisualColumn\n   * @param {Number} column Physical column index.\n   * @returns {Number} Returns visual column index.\n   */\n  this.toVisualColumn = function (column) {\n    return recordTranslator.toVisualColumn(column);\n  };\n\n  /**\n   * Translate visual row index into physical.\n   * If displayed rows order is different than the order of rows stored in memory (i.e. sorting is applied)\n   * to retrieve valid physical row index you can use this method.\n   *\n   * @since 0.29.0\n   * @memberof Core#\n   * @function toPhysicalRow\n   * @param {Number} row Visual row index.\n   * @returns {Number} Returns physical row index.\n   */\n  this.toPhysicalRow = function (row) {\n    return recordTranslator.toPhysicalRow(row);\n  };\n\n  /**\n   * Translate visual column index into physical.\n   * If displayed columns order is different than the order of columns stored in memory (i.e. manual column move is applied)\n   * to retrieve valid physical column index you can use this method.\n   *\n   * @since 0.29.0\n   * @memberof Core#\n   * @function toPhysicalColumn\n   * @param {Number} column Visual column index.\n   * @returns {Number} Returns physical column index.\n   */\n  this.toPhysicalColumn = function (column) {\n    return recordTranslator.toPhysicalColumn(column);\n  };\n\n  /**\n   * @description\n   * Returns the cell value at `row`, `col`. `row` and `col` are the __visible__ indexes (note, that if columns were reordered or sorted,\n   * the currently visible order will be used).\n   *\n   * @memberof Core#\n   * @function getDataAtCell\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @returns {String|Boolean|null} Data at cell.\n   */\n  this.getDataAtCell = function (row, col) {\n    return datamap.get(row, datamap.colToProp(col));\n  };\n\n  /**\n   * Return value at `row`, `prop`. (Uses {@link DataMap#get})\n   *\n   * @memberof Core#\n   * @function getDataAtRowProp\n   * @param {Number} row Visual row index.\n   * @param {String} prop Property name.\n   * @returns {*} Cell value.\n   */\n  this.getDataAtRowProp = function (row, prop) {\n    return datamap.get(row, prop);\n  };\n\n  /**\n   * @description\n   * Returns array of column values from the data source. `col` is the __visible__ index of the column.\n   * Note, that if columns were reordered or sorted, the currently visible order will be used.\n   *\n   * @memberof Core#\n   * @function getDataAtCol\n   * @since 0.9-beta2\n   * @param {Number} col Visual column index.\n   * @returns {Array} Array of cell values.\n   */\n  this.getDataAtCol = function (col) {\n    var out = [];\n    return out.concat.apply(out, _toConsumableArray(datamap.getRange(new _src.CellCoords(0, col), new _src.CellCoords(priv.settings.data.length - 1, col), datamap.DESTINATION_RENDERER)));\n  };\n\n  /**\n   * Given the object property name (e.g. `'first.name'`), returns an array of column's values from the data source.\n   * You can also provide a column index as the first argument.\n   *\n   * @memberof Core#\n   * @function getDataAtProp\n   * @since 0.9-beta2\n   * @param {String|Number} prop Property name / physical column index.\n   * @returns {Array} Array of cell values.\n   */\n  // TODO: Getting data from `datamap` should work on visual indexes.\n  this.getDataAtProp = function (prop) {\n    var out = [],\n        range;\n\n    range = datamap.getRange(new _src.CellCoords(0, datamap.propToCol(prop)), new _src.CellCoords(priv.settings.data.length - 1, datamap.propToCol(prop)), datamap.DESTINATION_RENDERER);\n\n    return out.concat.apply(out, _toConsumableArray(range));\n  };\n\n  /**\n   * Returns the source data object (the same that was passed by `data` configuration option or `loadData` method).\n   * Optionally you can provide a cell range by using the `row`, `col`, `row2`, `col2` arguments, to get only a fragment of grid data.\n   *\n   * @memberof Core#\n   * @function getSourceData\n   * @since 0.20.0\n   * @param {Number} [r] From physical row index.\n   * @param {Number} [c] From physical column index (or visual index, if data type is an array of objects).\n   * @param {Number} [r2] To physical row index.\n   * @param {Number} [c2] To physical column index (or visual index, if data type is an array of objects).\n   * @returns {Array} Array of grid data.\n   */\n  this.getSourceData = function (r, c, r2, c2) {\n    var data = void 0;\n\n    if (r === void 0) {\n      data = dataSource.getData();\n    } else {\n      data = dataSource.getByRange(new _src.CellCoords(r, c), new _src.CellCoords(r2, c2));\n    }\n\n    return data;\n  };\n\n  /**\n   * Returns the source data object as an arrays of arrays format even when source data was provided in another format.\n   * Optionally you can provide a cell range by using the `row`, `col`, `row2`, `col2` arguments, to get only a fragment of grid data.\n   *\n   * @memberof Core#\n   * @function getSourceDataArray\n   * @since 0.28.0\n   * @param {Number} [r] From physical row index.\n   * @param {Number} [c] From physical column index (or visual index, if data type is an array of objects).\n   * @param {Number} [r2] To physical row index.\n   * @param {Number} [c2] To physical column index (or visual index, if data type is an array of objects).\n   * @returns {Array} An array of arrays.\n   */\n  this.getSourceDataArray = function (r, c, r2, c2) {\n    var data = void 0;\n\n    if (r === void 0) {\n      data = dataSource.getData(true);\n    } else {\n      data = dataSource.getByRange(new _src.CellCoords(r, c), new _src.CellCoords(r2, c2), true);\n    }\n\n    return data;\n  };\n\n  /**\n   * Returns an array of column values from the data source. `col` is the index of the row in the data source.\n   *\n   * @memberof Core#\n   * @function getSourceDataAtCol\n   * @since 0.11.0-beta3\n   * @param {Number} column Visual column index.\n   * @returns {Array} Array of the column's cell values.\n   */\n  // TODO: Getting data from `sourceData` should work always on physical indexes.\n  this.getSourceDataAtCol = function (column) {\n    return dataSource.getAtColumn(column);\n  };\n\n  /**\n   * Returns a single row of the data (array or object, depending on what you have). `row` is the index of the row in the data source.\n   *\n   * @memberof Core#\n   * @function getSourceDataAtRow\n   * @since 0.11.0-beta3\n   * @param {Number} row Physical row index.\n   * @returns {Array|Object} Single row of data.\n   */\n  this.getSourceDataAtRow = function (row) {\n    return dataSource.getAtRow(row);\n  };\n\n  /**\n   * Returns a single value from the data source.\n   *\n   * @memberof Core#\n   * @function getSourceDataAtCell\n   * @param {Number} row Physical row index.\n   * @param {Number} column Visual column index.\n   * @returns {*} Cell data.\n   * @since 0.20.0\n   */\n  // TODO: Getting data from `sourceData` should work always on physical indexes.\n  this.getSourceDataAtCell = function (row, column) {\n    return dataSource.getAtCell(row, column);\n  };\n\n  /**\n   * @description\n   * Returns a single row of the data. The `row` argument is the __visible__ index of the row.\n   *\n   * @memberof Core#\n   * @function getDataAtRow\n   * @param {Number} row Visual row index.\n   * @returns {Array} Array of row's cell data.\n   * @since 0.9-beta2\n   */\n  this.getDataAtRow = function (row) {\n    var data = datamap.getRange(new _src.CellCoords(row, 0), new _src.CellCoords(row, this.countCols() - 1), datamap.DESTINATION_RENDERER);\n\n    return data[0] || [];\n  };\n\n  /**\n   * @description\n   * Returns a data type defined in the Handsontable settings under the `type` key ([Options#type](http://docs.handsontable.com/Options.html#type)).\n   * If there are cells with different types in the selected range, it returns `'mixed'`.\n   *\n   * @since 0.18.1\n   * @memberof Core#\n   * @function getDataType\n   * @param {Number} rowFrom From visual row index.\n   * @param {Number} columnFrom From visual column index.\n   * @param {Number} rowTo To visual row index.\n   * @param {Number} columnTo To visual column index.\n   * @returns {String} Cell type (e.q: `'mixed'`, `'text'`, `'numeric'`, `'autocomplete'`).\n   */\n  this.getDataType = function (rowFrom, columnFrom, rowTo, columnTo) {\n    var _this3 = this;\n\n    var previousType = null;\n    var currentType = null;\n\n    if (rowFrom === void 0) {\n      rowFrom = 0;\n      rowTo = this.countRows();\n      columnFrom = 0;\n      columnTo = this.countCols();\n    }\n    if (rowTo === void 0) {\n      rowTo = rowFrom;\n    }\n    if (columnTo === void 0) {\n      columnTo = columnFrom;\n    }\n    var type = 'mixed';\n\n    (0, _number.rangeEach)(Math.min(rowFrom, rowTo), Math.max(rowFrom, rowTo), function (row) {\n      var isTypeEqual = true;\n\n      (0, _number.rangeEach)(Math.min(columnFrom, columnTo), Math.max(columnFrom, columnTo), function (column) {\n        var cellType = _this3.getCellMeta(row, column);\n\n        currentType = cellType.type;\n\n        if (previousType) {\n          isTypeEqual = previousType === currentType;\n        } else {\n          previousType = currentType;\n        }\n\n        return isTypeEqual;\n      });\n      type = isTypeEqual ? currentType : 'mixed';\n\n      return isTypeEqual;\n    });\n\n    return type;\n  };\n\n  /**\n   * Remove a property defined by the `key` argument from the cell meta object for the provided `row` and `col` coordinates.\n   *\n   * @memberof Core#\n   * @function removeCellMeta\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @param {String} key Property name.\n   * @fires Hooks#beforeRemoveCellMeta\n   * @fires Hooks#afterRemoveCellMeta\n   */\n  this.removeCellMeta = function (row, col, key) {\n    var _recordTranslator$toP = recordTranslator.toPhysical(row, col),\n        _recordTranslator$toP2 = _slicedToArray(_recordTranslator$toP, 2),\n        physicalRow = _recordTranslator$toP2[0],\n        physicalColumn = _recordTranslator$toP2[1];\n\n    var cachedValue = priv.cellSettings[physicalRow][physicalColumn][key];\n\n    var hookResult = instance.runHooks('beforeRemoveCellMeta', row, col, key, cachedValue);\n\n    if (hookResult !== false) {\n      delete priv.cellSettings[physicalRow][physicalColumn][key];\n\n      instance.runHooks('afterRemoveCellMeta', row, col, key, cachedValue);\n    }\n\n    cachedValue = null;\n  };\n\n  /**\n   * Remove one or more rows from the cell meta object.\n   *\n   * @since 0.30.0\n   * @param {Number} index An integer that specifies at what position to add/remove items, Use negative values to specify the position from the end of the array.\n   * @param {Number} deleteAmount The number of items to be removed. If set to 0, no items will be removed.\n   * @param {Array} items The new items to be added to the array.\n   */\n  this.spliceCellsMeta = function (index, deleteAmount) {\n    var _priv$cellSettings;\n\n    for (var _len2 = arguments.length, items = Array(_len2 > 2 ? _len2 - 2 : 0), _key = 2; _key < _len2; _key++) {\n      items[_key - 2] = arguments[_key];\n    }\n\n    (_priv$cellSettings = priv.cellSettings).splice.apply(_priv$cellSettings, [index, deleteAmount].concat(items));\n  };\n\n  /**\n   * Set cell meta data object defined by `prop` to the corresponding params `row` and `col`.\n   *\n   * @memberof Core#\n   * @function setCellMetaObject\n   * @since 0.11\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @param {Object} prop Meta object.\n   */\n  this.setCellMetaObject = function (row, col, prop) {\n    if ((typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) === 'object') {\n      for (var key in prop) {\n        if ((0, _object.hasOwnProperty)(prop, key)) {\n          var value = prop[key];\n          this.setCellMeta(row, col, key, value);\n        }\n      }\n    }\n  };\n\n  /**\n   * Sets a property defined by the `key` object to the meta object of a cell corresponding to params `row` and `col`.\n   *\n   * @memberof Core#\n   * @function setCellMeta\n   * @since 0.11\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @param {String} key Property name.\n   * @param {String} val Property value.\n   * @fires Hooks#afterSetCellMeta\n   */\n  this.setCellMeta = function (row, col, key, val) {\n    var _recordTranslator$toP3 = recordTranslator.toPhysical(row, col),\n        _recordTranslator$toP4 = _slicedToArray(_recordTranslator$toP3, 2),\n        physicalRow = _recordTranslator$toP4[0],\n        physicalColumn = _recordTranslator$toP4[1];\n\n    if (!priv.columnSettings[physicalColumn]) {\n      priv.columnSettings[physicalColumn] = (0, _setting.columnFactory)(GridSettings, priv.columnsSettingConflicts);\n    }\n\n    if (!priv.cellSettings[physicalRow]) {\n      priv.cellSettings[physicalRow] = [];\n    }\n    if (!priv.cellSettings[physicalRow][physicalColumn]) {\n      priv.cellSettings[physicalRow][physicalColumn] = new priv.columnSettings[physicalColumn]();\n    }\n    priv.cellSettings[physicalRow][physicalColumn][key] = val;\n    instance.runHooks('afterSetCellMeta', row, col, key, val);\n  };\n\n  /**\n   * Get all the cells meta settings at least once generated in the table (in order of cell initialization).\n   *\n   * @since 0.19.0\n   * @returns {Array} Returns Array of ColumnSettings object.\n   */\n  this.getCellsMeta = function () {\n    return (0, _array.arrayFlatten)(priv.cellSettings);\n  };\n\n  /**\n   * Returns the cell properties object for the given `row` and `col` coordinates.\n   *\n   * @memberof Core#\n   * @function getCellMeta\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @returns {Object} The cell properties object.\n   * @fires Hooks#beforeGetCellMeta\n   * @fires Hooks#afterGetCellMeta\n   */\n  this.getCellMeta = function (row, col) {\n    var prop = datamap.colToProp(col);\n    var cellProperties = void 0;\n\n    var _recordTranslator$toP5 = recordTranslator.toPhysical(row, col),\n        _recordTranslator$toP6 = _slicedToArray(_recordTranslator$toP5, 2),\n        physicalRow = _recordTranslator$toP6[0],\n        physicalColumn = _recordTranslator$toP6[1];\n\n    // Workaround for #11. Connected also with #3849. It should be fixed within #4497.\n\n\n    if (physicalRow === null) {\n      physicalRow = row;\n    }\n\n    if (!priv.columnSettings[physicalColumn]) {\n      priv.columnSettings[physicalColumn] = (0, _setting.columnFactory)(GridSettings, priv.columnsSettingConflicts);\n    }\n\n    if (!priv.cellSettings[physicalRow]) {\n      priv.cellSettings[physicalRow] = [];\n    }\n    if (!priv.cellSettings[physicalRow][physicalColumn]) {\n      priv.cellSettings[physicalRow][physicalColumn] = new priv.columnSettings[physicalColumn]();\n    }\n\n    cellProperties = priv.cellSettings[physicalRow][physicalColumn]; // retrieve cellProperties from cache\n\n    cellProperties.row = physicalRow;\n    cellProperties.col = physicalColumn;\n    cellProperties.visualRow = row;\n    cellProperties.visualCol = col;\n    cellProperties.prop = prop;\n    cellProperties.instance = instance;\n\n    instance.runHooks('beforeGetCellMeta', row, col, cellProperties);\n    (0, _object.extend)(cellProperties, expandType(cellProperties)); // for `type` added in beforeGetCellMeta\n\n    if (cellProperties.cells) {\n      var settings = cellProperties.cells.call(cellProperties, physicalRow, physicalColumn, prop);\n\n      if (settings) {\n        (0, _object.extend)(cellProperties, settings);\n        (0, _object.extend)(cellProperties, expandType(settings)); // for `type` added in cells\n      }\n    }\n\n    instance.runHooks('afterGetCellMeta', row, col, cellProperties);\n\n    return cellProperties;\n  };\n\n  /**\n   * Returns a row off the cell meta array.\n   *\n   * @memberof Core#\n   * @function getCellMetaAtRow\n   * @since 0.30.0\n   * @param {Number} row Physical index of the row to return cell meta for.\n   * @returns {Array}\n   */\n  this.getCellMetaAtRow = function (row) {\n    return priv.cellSettings[row];\n  };\n\n  /**\n   * Checks if the data format and config allows user to modify the column structure.\n   * @returns {boolean}\n   */\n  this.isColumnModificationAllowed = function () {\n    return !(instance.dataType === 'object' || instance.getSettings().columns);\n  };\n\n  var rendererLookup = (0, _data.cellMethodLookupFactory)('renderer');\n\n  /**\n   * Returns the cell renderer function by given `row` and `col` arguments.\n   *\n   * @memberof Core#\n   * @function getCellRenderer\n   * @since 0.11\n   * @param {Number|Object} row Visual row index or cell meta object.\n   * @param {Number} [col] Visual column index.\n   * @returns {Function} The renderer function.\n   */\n  this.getCellRenderer = function (row, col) {\n    return (0, _renderers.getRenderer)(rendererLookup.call(this, row, col));\n  };\n\n  /**\n   * Returns the cell editor by the provided `row` and `col` arguments.\n   *\n   * @memberof Core#\n   * @function getCellEditor\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @returns {Object} The Editor object.\n   */\n  this.getCellEditor = (0, _data.cellMethodLookupFactory)('editor');\n\n  var validatorLookup = (0, _data.cellMethodLookupFactory)('validator');\n\n  /**\n   * Returns the cell validator by `row` and `col`, provided a validator is defined. If not - it doesn't return anything.\n   *\n   * @memberof Core#\n   * @function getCellValidator\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @returns {Function|RegExp|undefined} The validator function.\n   */\n  this.getCellValidator = function (row, col) {\n    var validator = validatorLookup.call(this, row, col);\n\n    if (typeof validator === 'string') {\n      validator = (0, _validators.getValidator)(validator);\n    }\n\n    return validator;\n  };\n\n  /**\n   * Validates all cells using their validator functions and calls callback when finished.\n   *\n   * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`.\n   *\n   * @memberof Core#\n   * @function validateCells\n   * @param {Function} [callback] The callback function.\n   */\n  this.validateCells = function (callback) {\n    this._validateCells(callback);\n  };\n\n  /**\n   * Validates rows using their validator functions and calls callback when finished.\n   *\n   * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`.\n   *\n   * @memberof Core#\n   * @function validateRows\n   * @param {Array} [rows] Array of validation target visual row indexes.\n   * @param {Function} [callback] The callback function.\n   */\n  this.validateRows = function (rows, callback) {\n    if (!Array.isArray(rows)) {\n      throw new Error('validateRows parameter `rows` must be an array');\n    }\n    this._validateCells(callback, rows);\n  };\n\n  /**\n   * Validates columns using their validator functions and calls callback when finished.\n   *\n   * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`.\n   *\n   * @memberof Core#\n   * @function validateColumns\n   * @param {Array} [columns] Array of validation target visual columns indexes.\n   * @param {Function} [callback] The callback function.\n   */\n  this.validateColumns = function (columns, callback) {\n    if (!Array.isArray(columns)) {\n      throw new Error('validateColumns parameter `columns` must be an array');\n    }\n    this._validateCells(callback, undefined, columns);\n  };\n\n  /**\n   * Validates all cells using their validator functions and calls callback when finished.\n   *\n   * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`.\n   *\n   * Private use intended.\n   *\n   * @private\n   * @memberof Core#\n   * @function _validateCells\n   * @param {Function} [callback] The callback function.\n   * @param {Array} [rows] Optional. Array of validation target visual row indexes.\n   * @param {Array} [columns] Optional. Array of validation target visual column indexes.\n   */\n  this._validateCells = function (callback, rows, columns) {\n    var waitingForValidator = new ValidatorsQueue();\n\n    if (callback) {\n      waitingForValidator.onQueueEmpty = callback;\n    }\n\n    var i = instance.countRows() - 1;\n\n    while (i >= 0) {\n      if (rows !== undefined && rows.indexOf(i) === -1) {\n        i--;\n        continue;\n      }\n      var j = instance.countCols() - 1;\n\n      while (j >= 0) {\n        if (columns !== undefined && columns.indexOf(j) === -1) {\n          j--;\n          continue;\n        }\n        waitingForValidator.addValidatorToQueue();\n\n        instance.validateCell(instance.getDataAtCell(i, j), instance.getCellMeta(i, j), function (result) {\n          if (typeof result !== 'boolean') {\n            throw new Error('Validation error: result is not boolean');\n          }\n          if (result === false) {\n            waitingForValidator.valid = false;\n          }\n          waitingForValidator.removeValidatorFormQueue();\n        }, 'validateCells');\n        j--;\n      }\n      i--;\n    }\n    waitingForValidator.checkIfQueueIsEmpty();\n  };\n\n  /**\n   * Returns an array of row headers' values (if they are enabled). If param `row` was given, it returns the header of the given row as a string.\n   *\n   * @memberof Core#\n   * @function getRowHeader\n   * @param {Number} [row] Visual row index.\n   * @fires Hooks#modifyRowHeader\n   * @returns {Array|String} Array of header values / single header value.\n   */\n  this.getRowHeader = function (row) {\n    var rowHeader = priv.settings.rowHeaders;\n\n    if (row !== void 0) {\n      row = instance.runHooks('modifyRowHeader', row);\n    }\n    if (row === void 0) {\n      rowHeader = [];\n      (0, _number.rangeEach)(instance.countRows() - 1, function (i) {\n        rowHeader.push(instance.getRowHeader(i));\n      });\n    } else if (Array.isArray(rowHeader) && rowHeader[row] !== void 0) {\n      rowHeader = rowHeader[row];\n    } else if ((0, _function.isFunction)(rowHeader)) {\n      rowHeader = rowHeader(row);\n    } else if (rowHeader && typeof rowHeader !== 'string' && typeof rowHeader !== 'number') {\n      rowHeader = row + 1;\n    }\n\n    return rowHeader;\n  };\n\n  /**\n   * Returns information about if this table is configured to display row headers.\n   *\n   * @memberof Core#\n   * @function hasRowHeaders\n   * @returns {Boolean} `true` if the instance has the row headers enabled, `false` otherwise.\n   * @since 0.11\n   */\n  this.hasRowHeaders = function () {\n    return !!priv.settings.rowHeaders;\n  };\n\n  /**\n   * Returns information about if this table is configured to display column headers.\n   *\n   * @memberof Core#\n   * @function hasColHeaders\n   * @since 0.11\n   * @returns {Boolean} `True` if the instance has the column headers enabled, `false` otherwise.\n   */\n  this.hasColHeaders = function () {\n    if (priv.settings.colHeaders !== void 0 && priv.settings.colHeaders !== null) {\n      // Polymer has empty value = null\n      return !!priv.settings.colHeaders;\n    }\n    for (var i = 0, ilen = instance.countCols(); i < ilen; i++) {\n      if (instance.getColHeader(i)) {\n        return true;\n      }\n    }\n\n    return false;\n  };\n\n  /**\n   * Returns an array of column headers (in string format, if they are enabled). If param `col` is given, it returns the header at the given column as a string.\n   *\n   * @memberof Core#\n   * @function getColHeader\n   * @param {Number} [col] Visual column index.\n   * @fires Hooks#modifyColHeader\n   * @returns {Array|String} The column header(s).\n   */\n  this.getColHeader = function (col) {\n    var columnsAsFunc = priv.settings.columns && (0, _function.isFunction)(priv.settings.columns);\n    var result = priv.settings.colHeaders;\n\n    col = instance.runHooks('modifyColHeader', col);\n\n    if (col === void 0) {\n      var out = [];\n      var ilen = columnsAsFunc ? instance.countSourceCols() : instance.countCols();\n\n      for (var i = 0; i < ilen; i++) {\n        out.push(instance.getColHeader(i));\n      }\n\n      result = out;\n    } else {\n      var translateVisualIndexToColumns = function translateVisualIndexToColumns(col) {\n        var arr = [];\n        var columnsLen = instance.countSourceCols();\n        var index = 0;\n\n        for (; index < columnsLen; index++) {\n          if ((0, _function.isFunction)(instance.getSettings().columns) && instance.getSettings().columns(index)) {\n            arr.push(index);\n          }\n        }\n\n        return arr[col];\n      };\n      var baseCol = col;\n      col = instance.runHooks('modifyCol', col);\n\n      var prop = translateVisualIndexToColumns(col);\n\n      if (priv.settings.columns && (0, _function.isFunction)(priv.settings.columns) && priv.settings.columns(prop) && priv.settings.columns(prop).title) {\n        result = priv.settings.columns(prop).title;\n      } else if (priv.settings.columns && priv.settings.columns[col] && priv.settings.columns[col].title) {\n        result = priv.settings.columns[col].title;\n      } else if (Array.isArray(priv.settings.colHeaders) && priv.settings.colHeaders[col] !== void 0) {\n        result = priv.settings.colHeaders[col];\n      } else if ((0, _function.isFunction)(priv.settings.colHeaders)) {\n        result = priv.settings.colHeaders(col);\n      } else if (priv.settings.colHeaders && typeof priv.settings.colHeaders !== 'string' && typeof priv.settings.colHeaders !== 'number') {\n        result = (0, _data.spreadsheetColumnLabel)(baseCol); // see #1458\n      }\n    }\n\n    return result;\n  };\n\n  /**\n   * Return column width from settings (no guessing). Private use intended.\n   *\n   * @private\n   * @memberof Core#\n   * @function _getColWidthFromSettings\n   * @param {Number} col Visual col index.\n   * @returns {Number}\n   */\n  this._getColWidthFromSettings = function (col) {\n    var cellProperties = instance.getCellMeta(0, col);\n    var width = cellProperties.width;\n\n    if (width === void 0 || width === priv.settings.width) {\n      width = cellProperties.colWidths;\n    }\n    if (width !== void 0 && width !== null) {\n      switch (typeof width === 'undefined' ? 'undefined' : _typeof(width)) {\n        case 'object':\n          // array\n          width = width[col];\n          break;\n\n        case 'function':\n          width = width(col);\n          break;\n        default:\n          break;\n      }\n      if (typeof width === 'string') {\n        width = parseInt(width, 10);\n      }\n    }\n\n    return width;\n  };\n\n  /**\n   * Returns the width of the requested column.\n   *\n   * @memberof Core#\n   * @function getColWidth\n   * @since 0.11\n   * @param {Number} col Visual column index.\n   * @returns {Number} Column width.\n   * @fires Hooks#modifyColWidth\n   */\n  this.getColWidth = function (col) {\n    var width = instance._getColWidthFromSettings(col);\n\n    width = instance.runHooks('modifyColWidth', width, col);\n\n    if (width === void 0) {\n      width = _src.ViewportColumnsCalculator.DEFAULT_WIDTH;\n    }\n\n    return width;\n  };\n\n  /**\n   * Return row height from settings (no guessing). Private use intended.\n   *\n   * @private\n   * @memberof Core#\n   * @function _getRowHeightFromSettings\n   * @param {Number} row Visual row index.\n   * @returns {Number}\n   */\n  this._getRowHeightFromSettings = function (row) {\n    // let cellProperties = instance.getCellMeta(row, 0);\n    // let height = cellProperties.height;\n    //\n    // if (height === void 0 || height === priv.settings.height) {\n    //  height = cellProperties.rowHeights;\n    // }\n    var height = priv.settings.rowHeights;\n\n    if (height !== void 0 && height !== null) {\n      switch (typeof height === 'undefined' ? 'undefined' : _typeof(height)) {\n        case 'object':\n          // array\n          height = height[row];\n          break;\n\n        case 'function':\n          height = height(row);\n          break;\n        default:\n          break;\n      }\n      if (typeof height === 'string') {\n        height = parseInt(height, 10);\n      }\n    }\n\n    return height;\n  };\n\n  /**\n   * Returns the row height.\n   *\n   * @memberof Core#\n   * @function getRowHeight\n   * @since 0.11\n   * @param {Number} row Visual row index.\n   * @returns {Number} The given row's height.\n   * @fires Hooks#modifyRowHeight\n   */\n  this.getRowHeight = function (row) {\n    var height = instance._getRowHeightFromSettings(row);\n\n    height = instance.runHooks('modifyRowHeight', height, row);\n\n    return height;\n  };\n\n  /**\n   * Returns the total number of rows in the data source.\n   *\n   * @memberof Core#\n   * @function countSourceRows\n   * @since 0.20.0\n   * @returns {Number} Total number in rows in data source.\n   */\n  this.countSourceRows = function () {\n    var sourceLength = instance.runHooks('modifySourceLength');\n    return sourceLength || (instance.getSourceData() ? instance.getSourceData().length : 0);\n  };\n\n  /**\n   * Returns the total number of columns in the data source.\n   *\n   * @memberof Core#\n   * @function countSourceCols\n   * @since 0.26.1\n   * @returns {Number} Total number in columns in data source.\n   */\n  this.countSourceCols = function () {\n    var len = 0;\n    var obj = instance.getSourceData() && instance.getSourceData()[0] ? instance.getSourceData()[0] : [];\n\n    if ((0, _object.isObject)(obj)) {\n      len = (0, _object.deepObjectSize)(obj);\n    } else {\n      len = obj.length || 0;\n    }\n\n    return len;\n  };\n\n  /**\n   * Returns the total number of rows in the grid.\n   *\n   * @memberof Core#\n   * @function countRows\n   * @returns {Number} Total number in rows the grid.\n   */\n  this.countRows = function () {\n    return datamap.getLength();\n  };\n\n  /**\n   * Returns the total number of columns in the grid.\n   *\n   * @memberof Core#\n   * @function countCols\n   * @returns {Number} Total number of columns.\n   */\n  this.countCols = function () {\n    var maxCols = this.getSettings().maxCols;\n    var dataHasLength = false;\n    var dataLen = 0;\n\n    if (instance.dataType === 'array') {\n      dataHasLength = priv.settings.data && priv.settings.data[0] && priv.settings.data[0].length;\n    }\n\n    if (dataHasLength) {\n      dataLen = priv.settings.data[0].length;\n    }\n\n    if (priv.settings.columns) {\n      var columnsIsFunction = (0, _function.isFunction)(priv.settings.columns);\n\n      if (columnsIsFunction) {\n        if (instance.dataType === 'array') {\n          var columnLen = 0;\n\n          for (var i = 0; i < dataLen; i++) {\n            if (priv.settings.columns(i)) {\n              columnLen++;\n            }\n          }\n\n          dataLen = columnLen;\n        } else if (instance.dataType === 'object' || instance.dataType === 'function') {\n          dataLen = datamap.colToPropCache.length;\n        }\n      } else {\n        dataLen = priv.settings.columns.length;\n      }\n    } else if (instance.dataType === 'object' || instance.dataType === 'function') {\n      dataLen = datamap.colToPropCache.length;\n    }\n\n    return Math.min(maxCols, dataLen);\n  };\n\n  /**\n   * Returns an visual index of the first rendered row.\n   *\n   * @memberof Core#\n   * @function rowOffset\n   * @returns {Number} Visual index of first rendered row.\n   */\n  this.rowOffset = function () {\n    return instance.view.wt.wtTable.getFirstRenderedRow();\n  };\n\n  /**\n   * Returns the visual index of the first rendered column.\n   *\n   * @memberof Core#\n   * @function colOffset\n   * @returns {Number} Visual index of the first visible column.\n   */\n  this.colOffset = function () {\n    return instance.view.wt.wtTable.getFirstRenderedColumn();\n  };\n\n  /**\n   * Returns the number of rendered rows (including rows partially or fully rendered outside viewport).\n   *\n   * @memberof Core#\n   * @function countRenderedRows\n   * @returns {Number} Returns -1 if table is not visible.\n   */\n  this.countRenderedRows = function () {\n    return instance.view.wt.drawn ? instance.view.wt.wtTable.getRenderedRowsCount() : -1;\n  };\n\n  /**\n   * Returns the number of visible rows (rendered rows that fully fit inside viewport).\n   *\n   * @memberof Core#\n   * @function countVisibleRows\n   * @returns {Number} Number of visible rows or -1.\n   */\n  this.countVisibleRows = function () {\n    return instance.view.wt.drawn ? instance.view.wt.wtTable.getVisibleRowsCount() : -1;\n  };\n\n  /**\n   * Returns the number of rendered columns (including columns partially or fully rendered outside viewport).\n   *\n   * @memberof Core#\n   * @function countRenderedCols\n   * @returns {Number} Returns -1 if table is not visible.\n   */\n  this.countRenderedCols = function () {\n    return instance.view.wt.drawn ? instance.view.wt.wtTable.getRenderedColumnsCount() : -1;\n  };\n\n  /**\n   * Returns the number of visible columns. Returns -1 if table is not visible\n   *\n   * @memberof Core#\n   * @function countVisibleCols\n   * @return {Number} Number of visible columns or -1.\n   */\n  this.countVisibleCols = function () {\n    return instance.view.wt.drawn ? instance.view.wt.wtTable.getVisibleColumnsCount() : -1;\n  };\n\n  /**\n   * Returns the number of empty rows. If the optional ending parameter is `true`, returns the\n   * number of empty rows at the bottom of the table.\n   *\n   * @memberof Core#\n   * @function countEmptyRows\n   * @param {Boolean} [ending] If `true`, will only count empty rows at the end of the data source.\n   * @returns {Number} Count empty rows.\n   */\n  this.countEmptyRows = function (ending) {\n    var emptyRows = 0;\n\n    (0, _number.rangeEachReverse)(instance.countRows() - 1, function (visualIndex) {\n      if (instance.isEmptyRow(visualIndex)) {\n        emptyRows += 1;\n      } else if (ending === true) {\n        return false;\n      }\n    });\n\n    return emptyRows;\n  };\n\n  /**\n   * Returns the number of empty columns. If the optional ending parameter is `true`, returns the number of empty\n   * columns at right hand edge of the table.\n   *\n   * @memberof Core#\n   * @function countEmptyCols\n   * @param {Boolean} [ending] If `true`, will only count empty columns at the end of the data source row.\n   * @returns {Number} Count empty cols.\n   */\n  this.countEmptyCols = function (ending) {\n    if (instance.countRows() < 1) {\n      return 0;\n    }\n\n    var emptyColumns = 0;\n\n    (0, _number.rangeEachReverse)(instance.countCols() - 1, function (visualIndex) {\n      if (instance.isEmptyCol(visualIndex)) {\n        emptyColumns += 1;\n      } else if (ending === true) {\n        return false;\n      }\n    });\n\n    return emptyColumns;\n  };\n\n  /**\n   * Check if all cells in the row declared by the `row` argument are empty.\n   *\n   * @memberof Core#\n   * @function isEmptyRow\n   * @param {Number} row Visual row index.\n   * @returns {Boolean} `true` if the row at the given `row` is empty, `false` otherwise.\n   */\n  this.isEmptyRow = function (row) {\n    return priv.settings.isEmptyRow.call(instance, row);\n  };\n\n  /**\n   * Check if all cells in the the column declared by the `col` argument are empty.\n   *\n   * @memberof Core#\n   * @function isEmptyCol\n   * @param {Number} col Column index.\n   * @returns {Boolean} `true` if the column at the given `col` is empty, `false` otherwise.\n   */\n  this.isEmptyCol = function (col) {\n    return priv.settings.isEmptyCol.call(instance, col);\n  };\n\n  /**\n   * Select cell specified by `row` and `col` values or a range of cells finishing at `endRow`, `endCol`. If the table\n   * was configured to support data column properties that properties can be used to making a selection.\n   *\n   * By default, viewport will be scrolled to the selection. After the `selectCell` method had finished, the instance\n   * will be listening to keyboard input on the document.\n   *\n   * @example\n   * ```js\n   * // select a single cell\n   * hot.selectCell(2, 4);\n   * // select a single cell using column property\n   * hot.selectCell(2, 'address');\n   * // select a range of cells\n   * hot.selectCell(2, 4, 3, 5);\n   * // select a range of cells using column properties\n   * hot.selectCell(2, 'address', 3, 'phone_number');\n   * // select a range of cells without scrolling to them\n   * hot.selectCell(2, 'address', 3, 'phone_number', false);\n   * ```\n   *\n   * @memberof Core#\n   * @function selectCell\n   * @param {Number} row Visual row index.\n   * @param {Number|String} column Visual column index or column property.\n   * @param {Number} [endRow] Visual end row index (if selecting a range).\n   * @param {Number|String} [endColumn] Visual end column index or column property (if selecting a range).\n   * @param {Boolean} [scrollToCell=true] If `true`, the viewport will be scrolled to the selection.\n   * @param {Boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectCell = function (row, column, endRow, endColumn) {\n    var scrollToCell = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n    var changeListener = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n\n    if ((0, _mixed.isUndefined)(row) || (0, _mixed.isUndefined)(column)) {\n      return false;\n    }\n\n    return this.selectCells([[row, column, endRow, endColumn]], scrollToCell, changeListener);\n  };\n\n  /**\n   * Make multiple, non-contiguous selection specified by `row` and `column` values or a range of cells\n   * finishing at `endRow`, `endColumn`. The method supports two input formats which are the same as that\n   * produces by `getSelected` and `getSelectedRange` methods.\n   *\n   * By default, viewport will be scrolled to selection. After the `selectCells` method had finished, the instance\n   * will be listening to keyboard input on the document.\n   *\n   * @example\n   * ```js\n   * // using an array of arrays\n   * hot.selectCells([[1, 1, 2, 2], [3, 3], [6, 2, 0, 2]]);\n   * // using an array of arrays with defined columns as props\n   * hot.selectCells([[1, 'id', 2, 'first_name'], [3, 'full_name'], [6, 'last_name', 0, 'first_name']]);\n   * // or using an array of CellRange objects (produced by `.getSelectedRange()` method)\n   * const selected = hot.getSelectedRange();\n   *\n   * selected[0].from.row = 0;\n   * selected[0].from.col = 0;\n   *\n   * hot.selectCells(selected);\n   * ```\n   *\n   * @memberof Core#\n   * @since 0.38.0\n   * @function selectCells\n   * @param {Array[]|CellRange[]} coords Visual coords passed as an array of array (`[[rowStart, columnStart, rowEnd, columnEnd], ...]`)\n   *                                     the same format as `getSelected` method returns or as an CellRange objects\n   *                                     which is the same format what `getSelectedRange` method returns.\n   * @param {Boolean} [scrollToCell=true] If `true`, the viewport will be scrolled to the selection.\n   * @param {Boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectCells = function () {\n    var coords = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [[]];\n    var scrollToCell = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n    var changeListener = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n    if (scrollToCell === false) {\n      preventScrollingToCell = true;\n    }\n\n    var wasSelected = selection.selectCells(coords);\n\n    if (wasSelected && changeListener) {\n      instance.listen();\n    }\n    preventScrollingToCell = false;\n\n    return wasSelected;\n  };\n\n  /**\n   * Select the cell specified by the `row` and `prop` arguments, or a range finishing at `endRow`, `endProp`.\n   * By default, viewport will be scrolled to selection.\n   *\n   * @deprecated\n   * @memberof Core#\n   * @function selectCellByProp\n   * @param {Number} row Visual row index.\n   * @param {String} prop Property name.\n   * @param {Number} [endRow] visual end row index (if selecting a range).\n   * @param {String} [endProp] End property name (if selecting a range).\n   * @param {Boolean} [scrollToCell=true] If `true`, viewport will be scrolled to the selection.\n   * @param {Boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectCellByProp = function (row, prop, endRow, endProp) {\n    var scrollToCell = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n    var changeListener = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n\n    (0, _console.warn)((0, _templateLiteralTag.toSingleLine)(_templateObject));\n\n    return this.selectCells([[row, prop, endRow, endProp]], scrollToCell, changeListener);\n  };\n\n  /**\n   * Select column specified by `startColumn` visual index, column property or a range of columns finishing at `endColumn`.\n   *\n   * @example\n   * ```js\n   * // select column using visual index\n   * hot.selectColumns(1);\n   * // select column using column property\n   * hot.selectColumns('id');\n   * // select range of columns using visual indexes\n   * hot.selectColumns(1, 4);\n   * // select range of columns using column properties\n   * hot.selectColumns('id', 'last_name');\n   * ```\n   *\n   * @memberof Core#\n   * @since 0.38.0\n   * @function selectColumns\n   * @param {Number} startColumn The visual column index from which the selection starts.\n   * @param {Number} [endColumn=startColumn] The visual column index to which the selection finishes. If `endColumn`\n   *                                         is not defined the column defined by `startColumn` will be selected.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectColumns = function (startColumn) {\n    var endColumn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startColumn;\n\n    return selection.selectColumns(startColumn, endColumn);\n  };\n\n  /**\n   * Select row specified by `startRow` visual index or a range of rows finishing at `endRow`.\n   *\n   * @example\n   * ```js\n   * select row using visual index\n   * hot.selectRows(1);\n   * select range of rows using visual indexes\n   * hot.selectRows(1, 4);\n   * ```\n   *\n   * @memberof Core#\n   * @since 0.38.0\n   * @function selectRows\n   * @param {Number} startRow The visual row index from which the selection starts.\n   * @param {Number} [endRow=startRow] The visual row index to which the selection finishes. If `endRow`\n   *                                   is not defined the row defined by `startRow` will be selected.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectRows = function (startRow) {\n    var endRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startRow;\n\n    return selection.selectRows(startRow, endRow);\n  };\n\n  /**\n   * Deselects the current cell selection on grid.\n   *\n   * @memberof Core#\n   * @function deselectCell\n   */\n  this.deselectCell = function () {\n    selection.deselect();\n  };\n\n  /**\n   * Select the whole table. The previous selection will be overwritten.\n   *\n   * @since 0.38.2\n   * @memberof Core#\n   * @function selectAll\n   */\n  this.selectAll = function () {\n    preventScrollingToCell = true;\n    selection.selectAll();\n    preventScrollingToCell = false;\n  };\n\n  /**\n   * Scroll viewport to coords specified by the `row` and `column` arguments.\n   *\n   * @since 0.24.3\n   * @memberof Core#\n   * @function scrollViewportTo\n   * @param {Number} [row] Visual row index.\n   * @param {Number} [column] Visual column index.\n   * @param {Boolean} [snapToBottom = false] If `true`, viewport is scrolled to show the cell on the bottom of the table.\n   * @param {Boolean} [snapToRight = false] If `true`, viewport is scrolled to show the cell on the right side of the table.\n   * @returns {Boolean} `true` if scroll was successful, `false` otherwise.\n   */\n  this.scrollViewportTo = function (row, column) {\n    var snapToBottom = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n    var snapToRight = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n    if (row !== void 0 && (row < 0 || row >= instance.countRows())) {\n      return false;\n    }\n    if (column !== void 0 && (column < 0 || column >= instance.countCols())) {\n      return false;\n    }\n\n    var result = false;\n\n    if (row !== void 0 && column !== void 0) {\n      instance.view.wt.wtOverlays.topOverlay.scrollTo(row, snapToBottom);\n      instance.view.wt.wtOverlays.leftOverlay.scrollTo(column, snapToRight);\n\n      result = true;\n    }\n    if (typeof row === 'number' && typeof column !== 'number') {\n      instance.view.wt.wtOverlays.topOverlay.scrollTo(row, snapToBottom);\n\n      result = true;\n    }\n    if (typeof column === 'number' && typeof row !== 'number') {\n      instance.view.wt.wtOverlays.leftOverlay.scrollTo(column, snapToRight);\n\n      result = true;\n    }\n\n    return result;\n  };\n\n  /**\n   * Removes grid from the DOM.\n   *\n   * @memberof Core#\n   * @function destroy\n   * @fires Hooks#afterDestroy\n   */\n  this.destroy = function () {\n\n    instance._clearTimeouts();\n    if (instance.view) {\n      // in case HT is destroyed before initialization has finished\n      instance.view.destroy();\n    }\n    if (dataSource) {\n      dataSource.destroy();\n    }\n    dataSource = null;\n\n    (0, _keyStateObserver.stopObserving)();\n\n    if (false) {\n      var licenseInfo = document.querySelector('#hot-display-license-info');\n\n      if (licenseInfo) {\n        licenseInfo.parentNode.removeChild(licenseInfo);\n      }\n    }\n    (0, _element.empty)(instance.rootElement);\n    eventManager.destroy();\n\n    if (editorManager) {\n      editorManager.destroy();\n    }\n\n    instance.runHooks('afterDestroy');\n    _pluginHooks2.default.getSingleton().destroy(instance);\n\n    for (var i in instance) {\n      if ((0, _object.hasOwnProperty)(instance, i)) {\n        // replace instance methods with post mortem\n        if ((0, _function.isFunction)(instance[i])) {\n          instance[i] = postMortem;\n        } else if (i !== 'guid') {\n          // replace instance properties with null (restores memory)\n          // it should not be necessary but this prevents a memory leak side effects that show itself in Jasmine tests\n          instance[i] = null;\n        }\n      }\n    }\n\n    // replace private properties with null (restores memory)\n    // it should not be necessary but this prevents a memory leak side effects that show itself in Jasmine tests\n    if (datamap) {\n      datamap.destroy();\n    }\n    datamap = null;\n    priv = null;\n    grid = null;\n    selection = null;\n    editorManager = null;\n    instance = null;\n    GridSettings = null;\n  };\n\n  /**\n   * Replacement for all methods after Handsotnable was destroyed.\n   *\n   * @private\n   */\n  function postMortem() {\n    throw new Error('This method cannot be called because this Handsontable instance has been destroyed');\n  }\n\n  /**\n   * Returns the active editor object.\n   *\n   * @memberof Core#\n   * @function getActiveEditor\n   * @returns {Object} The active editor object.\n   */\n  this.getActiveEditor = function () {\n    return editorManager.getActiveEditor();\n  };\n\n  /**\n   * Returns plugin instance using the plugin name provided.\n   *\n   * @memberof Core#\n   * @function getPlugin\n   * @param {String} pluginName The plugin name.\n   * @returns {*} The plugin instance.\n   * @since 0.15.0\n   */\n  this.getPlugin = function (pluginName) {\n    return (0, _plugins.getPlugin)(this, pluginName);\n  };\n\n  /**\n   * Returns the Handsontable instance.\n   *\n   * @memberof Core#\n   * @function getInstance\n   * @returns {Handsontable} The Handsontable instance.\n   */\n  this.getInstance = function () {\n    return instance;\n  };\n\n  /**\n   * Adds listener to the specified hook name (only for this Handsontable instance).\n   *\n   * @memberof Core#\n   * @function addHook\n   * @see Hooks#add\n   * @param {String} key Hook name.\n   * @param {Function|Array} callback Function or array of Functions.\n   *\n   * @example\n   * ```js\n   * hot.addHook('beforeInit', myCallback);\n   * ```\n   */\n  this.addHook = function (key, callback) {\n    _pluginHooks2.default.getSingleton().add(key, callback, instance);\n  };\n\n  /**\n   * Check if for a specified hook name there are added listeners (only for this Handsontable instance).\n   *\n   * @memberof Core#\n   * @function hasHook\n   * @see Hooks#has\n   * @param {String} key Hook name\n   * @return {Boolean}\n   *\n   * @example\n   * ```js\n   * var hasBeforeInitListeners = hot.hasHook('beforeInit');\n   * ```\n   */\n  this.hasHook = function (key) {\n    return _pluginHooks2.default.getSingleton().has(key, instance);\n  };\n\n  /**\n   * Adds listener to specified hook name (only for this Handsontable instance).\n   * After the listener is triggered, it will be automatically removed.\n   *\n   * @memberof Core#\n   * @function addHookOnce\n   * @see Hooks#once\n   * @param {String} key Hook name.\n   * @param {Function|Array} callback Function or array of Functions.\n   *\n   * @example\n   * ```js\n   * hot.addHookOnce('beforeInit', myCallback);\n   * ```\n   */\n  this.addHookOnce = function (key, callback) {\n    _pluginHooks2.default.getSingleton().once(key, callback, instance);\n  };\n\n  /**\n   * Removes the hook listener previously registered with {@link Core#addHook}.\n   *\n   * @memberof Core#\n   * @function removeHook\n   * @see Hooks#remove\n   * @param {String} key Hook name.\n   * @param {Function} callback Function which have been registered via {@link Core#addHook}.\n   *\n   * @example\n   * ```js\n   * hot.removeHook('beforeInit', myCallback);\n   * ```\n   */\n  this.removeHook = function (key, callback) {\n    _pluginHooks2.default.getSingleton().remove(key, callback, instance);\n  };\n\n  /**\n   * Run the callbacks for the hook provided in the `key` argument using the parameters given in the other arguments.\n   *\n   * @memberof Core#\n   * @function runHooks\n   * @see Hooks#run\n   * @param {String} key Hook name.\n   * @param {*} [p1] Argument passed to the callback.\n   * @param {*} [p2] Argument passed to the callback.\n   * @param {*} [p3] Argument passed to the callback.\n   * @param {*} [p4] Argument passed to the callback.\n   * @param {*} [p5] Argument passed to the callback.\n   * @param {*} [p6] Argument passed to the callback.\n   * @returns {*}\n   *\n   * @example\n   * ```js\n   * hot.runHooks('beforeInit');\n   * ```\n   */\n  this.runHooks = function (key, p1, p2, p3, p4, p5, p6) {\n    return _pluginHooks2.default.getSingleton().run(instance, key, p1, p2, p3, p4, p5, p6);\n  };\n\n  /**\n   * Get phrase for specified dictionary key.\n   *\n   * @memberof Core#\n   * @function getTranslatedPhrase\n   * @since 0.35.0\n   * @param {String} dictionaryKey Constant which is dictionary key.\n   * @param {*} extraArguments Arguments which will be handled by formatters.\n   *\n   * @returns {String}\n   */\n  this.getTranslatedPhrase = function (dictionaryKey, extraArguments) {\n    return (0, _i18n.getTranslatedPhrase)(priv.settings.language, dictionaryKey, extraArguments);\n  };\n\n  this.timeouts = [];\n\n  /**\n   * Sets timeout. Purpose of this method is to clear all known timeouts when `destroy` method is called.\n   *\n   * @param {*} handle\n   * @private\n   */\n  this._registerTimeout = function (handle) {\n    this.timeouts.push(handle);\n  };\n\n  /**\n   * Clears all known timeouts.\n   *\n   * @private\n   */\n  this._clearTimeouts = function () {\n    for (var i = 0, ilen = this.timeouts.length; i < ilen; i++) {\n      clearTimeout(this.timeouts[i]);\n    }\n  };\n\n  /**\n   * Refresh selection borders. This is temporary method relic after selection rewrite.\n   *\n   * @private\n   * @param {Boolean} revertOriginal\n   */\n  this._refreshBorders = function (revertOriginal) {\n    editorManager.destroyEditor(revertOriginal);\n    instance.view.render();\n\n    if (selection.isSelected()) {\n      editorManager.prepareEditor();\n    }\n  };\n\n  _pluginHooks2.default.getSingleton().run(instance, 'construct');\n};\n\n/***/ }),\n/* 89 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.columnFactory = columnFactory;\n\nvar _object = __webpack_require__(2);\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Factory for columns constructors.\n *\n * @param {Object} GridSettings\n * @param {Array} conflictList\n * @return {Object} ColumnSettings\n */\nfunction columnFactory(GridSettings, conflictList) {\n  function ColumnSettings() {};\n\n  (0, _object.inherit)(ColumnSettings, GridSettings);\n\n  // Clear conflict settings\n  for (var i = 0, len = conflictList.length; i < len; i++) {\n    ColumnSettings.prototype[conflictList[i]] = void 0;\n  }\n\n  return ColumnSettings;\n}\n\n/***/ }),\n/* 90 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.spreadsheetColumnLabel = spreadsheetColumnLabel;\nexports.spreadsheetColumnIndex = spreadsheetColumnIndex;\nexports.createSpreadsheetData = createSpreadsheetData;\nexports.createSpreadsheetObjectData = createSpreadsheetObjectData;\nexports.createEmptySpreadsheetData = createEmptySpreadsheetData;\nexports.translateRowsToColumns = translateRowsToColumns;\nexports.cellMethodLookupFactory = cellMethodLookupFactory;\n\nvar _cellTypes = __webpack_require__(87);\n\nvar _object = __webpack_require__(2);\n\nvar COLUMN_LABEL_BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\nvar COLUMN_LABEL_BASE_LENGTH = COLUMN_LABEL_BASE.length;\n\n/**\n * Generates spreadsheet-like column names: A, B, C, ..., Z, AA, AB, etc.\n *\n * @param {Number} index Column index.\n * @returns {String}\n */\nfunction spreadsheetColumnLabel(index) {\n  var dividend = index + 1;\n  var columnLabel = '';\n  var modulo = void 0;\n\n  while (dividend > 0) {\n    modulo = (dividend - 1) % COLUMN_LABEL_BASE_LENGTH;\n    columnLabel = String.fromCharCode(65 + modulo) + columnLabel;\n    dividend = parseInt((dividend - modulo) / COLUMN_LABEL_BASE_LENGTH, 10);\n  }\n\n  return columnLabel;\n}\n\n/**\n * Generates spreadsheet-like column index from theirs labels: A, B, C ...., Z, AA, AB, etc.\n *\n * @param {String} label Column label.\n * @returns {Number}\n */\nfunction spreadsheetColumnIndex(label) {\n  var result = 0;\n\n  if (label) {\n    for (var i = 0, j = label.length - 1; i < label.length; i += 1, j -= 1) {\n      result += Math.pow(COLUMN_LABEL_BASE_LENGTH, j) * (COLUMN_LABEL_BASE.indexOf(label[i]) + 1);\n    }\n  }\n  --result;\n\n  return result;\n}\n\n/**\n * Creates 2D array of Excel-like values \"A1\", \"A2\", ...\n *\n * @param {Number} rows Number of rows to generate.\n * @param {Number} columns Number of columns to generate.\n * @returns {Array}\n */\nfunction createSpreadsheetData() {\n  var rows = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100;\n  var columns = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 4;\n\n  var _rows = [],\n      i,\n      j;\n\n  for (i = 0; i < rows; i++) {\n    var row = [];\n\n    for (j = 0; j < columns; j++) {\n      row.push(spreadsheetColumnLabel(j) + (i + 1));\n    }\n    _rows.push(row);\n  }\n\n  return _rows;\n}\n\n/**\n * Creates 2D array of Excel-like values \"A1\", \"A2\", as an array of objects.\n *\n * @param {Number} rows Number of rows to generate.\n * @param {Number} colCount Number of columns to generate.\n * @returns {Array}\n */\nfunction createSpreadsheetObjectData() {\n  var rows = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100;\n  var colCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 4;\n\n  var _rows = [],\n      i,\n      j;\n\n  for (i = 0; i < rows; i++) {\n    var row = {};\n\n    for (j = 0; j < colCount; j++) {\n      row['prop' + j] = spreadsheetColumnLabel(j) + (i + 1);\n    }\n    _rows.push(row);\n  }\n\n  return _rows;\n}\n\n/**\n * Generates an empty data object.\n *\n * @param {Number} rows Number of rows to generate.\n * @param {Number} columns Number of columns to generate\n * @returns {Array}\n */\nfunction createEmptySpreadsheetData(rows, columns) {\n  var data = [];\n  var row = void 0;\n\n  for (var i = 0; i < rows; i++) {\n    row = [];\n    for (var j = 0; j < columns; j++) {\n      row.push('');\n    }\n    data.push(row);\n  }\n\n  return data;\n}\n\nfunction translateRowsToColumns(input) {\n  var i,\n      ilen,\n      j,\n      jlen,\n      output = [],\n      olen = 0;\n\n  for (i = 0, ilen = input.length; i < ilen; i++) {\n    for (j = 0, jlen = input[i].length; j < jlen; j++) {\n      if (j == olen) {\n        output.push([]);\n        olen++;\n      }\n      output[j].push(input[i][j]);\n    }\n  }\n\n  return output;\n}\n\n/**\n * Factory that produces a function for searching methods (or any properties) which could be defined directly in\n * table configuration or implicitly, within cell type definition.\n *\n * For example: renderer can be defined explicitly using \"renderer\" property in column configuration or it can be\n * defined implicitly using \"type\" property.\n *\n * Methods/properties defined explicitly always takes precedence over those defined through \"type\".\n *\n * If the method/property is not found in an object, searching is continued recursively through prototype chain, until\n * it reaches the Object.prototype.\n *\n *\n * @param methodName {String} name of the method/property to search (i.e. 'renderer', 'validator', 'copyable')\n * @param allowUndefined {Boolean} [optional] if false, the search is continued if methodName has not been found in cell \"type\"\n * @returns {Function}\n */\nfunction cellMethodLookupFactory(methodName, allowUndefined) {\n\n  allowUndefined = typeof allowUndefined == 'undefined' ? true : allowUndefined;\n\n  return function cellMethodLookup(row, col) {\n    return function getMethodFromProperties(properties) {\n\n      if (!properties) {\n        return; // method not found\n      } else if ((0, _object.hasOwnProperty)(properties, methodName) && properties[methodName] !== void 0) {\n        // check if it is own and is not empty\n        return properties[methodName]; // method defined directly\n      } else if ((0, _object.hasOwnProperty)(properties, 'type') && properties.type) {\n        // check if it is own and is not empty\n        var type;\n\n        if (typeof properties.type != 'string') {\n          throw new Error('Cell type must be a string ');\n        }\n        type = (0, _cellTypes.getCellType)(properties.type);\n\n        if ((0, _object.hasOwnProperty)(type, methodName)) {\n          return type[methodName]; // method defined in type.\n        } else if (allowUndefined) {\n          return; // method does not defined in type (eg. validator), returns undefined\n        }\n      }\n\n      return getMethodFromProperties(Object.getPrototypeOf(properties));\n    }(typeof row == 'number' ? this.getCellMeta(row, col) : row);\n  };\n}\n\n/***/ }),\n/* 91 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.SELECTION_TYPES = exports.SELECTION_TYPE_OBJECT = exports.SELECTION_TYPE_ARRAY = exports.SELECTION_TYPE_EMPTY = exports.SELECTION_TYPE_UNRECOGNIZED = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.detectSelectionType = detectSelectionType;\nexports.normalizeSelectionFactory = normalizeSelectionFactory;\nexports.transformSelectionToColumnDistance = transformSelectionToColumnDistance;\nexports.transformSelectionToRowDistance = transformSelectionToRowDistance;\nexports.isValidCoord = isValidCoord;\n\nvar _src = __webpack_require__(4);\n\nvar _array = __webpack_require__(1);\n\nvar _mixed = __webpack_require__(16);\n\nvar SELECTION_TYPE_UNRECOGNIZED = exports.SELECTION_TYPE_UNRECOGNIZED = 0;\nvar SELECTION_TYPE_EMPTY = exports.SELECTION_TYPE_EMPTY = 1;\nvar SELECTION_TYPE_ARRAY = exports.SELECTION_TYPE_ARRAY = 2;\nvar SELECTION_TYPE_OBJECT = exports.SELECTION_TYPE_OBJECT = 3;\nvar SELECTION_TYPES = exports.SELECTION_TYPES = [SELECTION_TYPE_OBJECT, SELECTION_TYPE_ARRAY];\nvar ARRAY_TYPE_PATTERN = [['number'], ['number', 'string'], ['number', 'undefined'], ['number', 'string', 'undefined']];\nvar rootCall = Symbol('root');\nvar childCall = Symbol('child');\n\n/**\n * Detect selection schema structure.\n *\n * @param {*} selectionRanges The selected range or and array of selected ranges. This type of data is produced by\n *                            `hot.getSelected()`, `hot.getSelectedLast()`, `hot.getSelectedRange()`\n *                            and `hot.getSelectedRangeLast()` methods.\n * @returns {Number} Returns a number that specifies the type of detected selection schema. If selection schema type\n *                   is unrecognized than it returns `0`.\n */\nfunction detectSelectionType(selectionRanges) {\n  var _callSymbol = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : rootCall;\n\n  if (_callSymbol !== rootCall && _callSymbol !== childCall) {\n    throw new Error('The second argument is used internally only and cannot be overwritten.');\n  }\n\n  var isArray = Array.isArray(selectionRanges);\n  var isRootCall = _callSymbol === rootCall;\n  var result = SELECTION_TYPE_UNRECOGNIZED;\n\n  if (isArray) {\n    var firstItem = selectionRanges[0];\n\n    if (selectionRanges.length === 0) {\n      result = SELECTION_TYPE_EMPTY;\n    } else if (isRootCall && firstItem instanceof _src.CellRange) {\n      result = SELECTION_TYPE_OBJECT;\n    } else if (isRootCall && Array.isArray(firstItem)) {\n      result = detectSelectionType(firstItem, childCall);\n    } else if (selectionRanges.length >= 2 && selectionRanges.length <= 4) {\n      var isArrayType = !selectionRanges.some(function (value, index) {\n        return !ARRAY_TYPE_PATTERN[index].includes(typeof value === 'undefined' ? 'undefined' : _typeof(value));\n      });\n\n      if (isArrayType) {\n        result = SELECTION_TYPE_ARRAY;\n      }\n    }\n  }\n\n  return result;\n}\n\n/**\n * Factory function designed for normalization data schema from different data structures of the selection ranges.\n *\n * @param {String} type Selection type which will be processed.\n * @param {Object} [options]\n * @param {Boolean} [options.keepDirection=false] If `true`, the coordinates which contain the direction of the\n *                                                selected cells won't be changed. Otherwise, the selection will be\n *                                                normalized to values starting from top-left to bottom-right.\n * @param {Function} [options.propToCol] Pass the converting function (usually `datamap.propToCol`) if the column\n *                                       defined as props should be normalized to the numeric values.\n * @returns {Number[]} Returns normalized data about selected range as an array (`[rowStart, columnStart, rowEnd, columnEnd]`).\n */\nfunction normalizeSelectionFactory(type) {\n  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref$keepDirection = _ref.keepDirection,\n      keepDirection = _ref$keepDirection === undefined ? false : _ref$keepDirection,\n      propToCol = _ref.propToCol;\n\n  if (!SELECTION_TYPES.includes(type)) {\n    throw new Error('Unsupported selection ranges schema type was provided.');\n  }\n\n  return function (selection) {\n    var isObjectType = type === SELECTION_TYPE_OBJECT;\n    var rowStart = isObjectType ? selection.from.row : selection[0];\n    var columnStart = isObjectType ? selection.from.col : selection[1];\n    var rowEnd = isObjectType ? selection.to.row : selection[2];\n    var columnEnd = isObjectType ? selection.to.col : selection[3];\n\n    if (typeof propToCol === 'function') {\n      if (typeof columnStart === 'string') {\n        columnStart = propToCol(columnStart);\n      }\n      if (typeof columnEnd === 'string') {\n        columnEnd = propToCol(columnEnd);\n      }\n    }\n\n    if ((0, _mixed.isUndefined)(rowEnd)) {\n      rowEnd = rowStart;\n    }\n    if ((0, _mixed.isUndefined)(columnEnd)) {\n      columnEnd = columnStart;\n    }\n\n    if (!keepDirection) {\n      var origRowStart = rowStart;\n      var origColumnStart = columnStart;\n      var origRowEnd = rowEnd;\n      var origColumnEnd = columnEnd;\n\n      rowStart = Math.min(origRowStart, origRowEnd);\n      columnStart = Math.min(origColumnStart, origColumnEnd);\n      rowEnd = Math.max(origRowStart, origRowEnd);\n      columnEnd = Math.max(origColumnStart, origColumnEnd);\n    }\n\n    return [rowStart, columnStart, rowEnd, columnEnd];\n  };\n}\n\n/**\n * Function transform selection ranges (produced by `hot.getSelected()` and `hot.getSelectedRange()`) to normalized\n * data structure. It merges repeated ranges into consecutive coordinates. The returned structure\n * contains an array of arrays. The single item contains at index 0 visual column index from the selection was\n * started and at index 1 distance as a count of selected columns.\n *\n * @param {Array[]|CellRange[]} selectionRanges Selection ranges produced by Handsontable.\n * @return {Array[]} Returns an array of arrays with ranges defines in that schema:\n *                   `[[visualColumnStart, distance], [visualColumnStart, distance], ...]`.\n *                   The column distances are always created starting from the left (zero index) to the\n *                   right (the latest column index).\n */\nfunction transformSelectionToColumnDistance(selectionRanges) {\n  var selectionType = detectSelectionType(selectionRanges);\n\n  if (selectionType === SELECTION_TYPE_UNRECOGNIZED || selectionType === SELECTION_TYPE_EMPTY) {\n    return [];\n  }\n\n  var selectionSchemaNormalizer = normalizeSelectionFactory(selectionType);\n  var unorderedIndexes = new Set();\n\n  // Iterate through all ranges and collect all column indexes which are not saved yet.\n  (0, _array.arrayEach)(selectionRanges, function (selection) {\n    var _selectionSchemaNorma = selectionSchemaNormalizer(selection),\n        _selectionSchemaNorma2 = _slicedToArray(_selectionSchemaNorma, 4),\n        columnStart = _selectionSchemaNorma2[1],\n        columnEnd = _selectionSchemaNorma2[3];\n\n    var amount = columnEnd - columnStart + 1;\n\n    (0, _array.arrayEach)(Array.from(new Array(amount), function (_, i) {\n      return columnStart + i;\n    }), function (index) {\n      if (!unorderedIndexes.has(index)) {\n        unorderedIndexes.add(index);\n      }\n    });\n  });\n\n  // Sort indexes in ascending order to easily detecting non-consecutive columns.\n  var orderedIndexes = Array.from(unorderedIndexes).sort(function (a, b) {\n    return a - b;\n  });\n  var normalizedColumnRanges = (0, _array.arrayReduce)(orderedIndexes, function (acc, visualColumnIndex, index, array) {\n    if (index !== 0 && visualColumnIndex === array[index - 1] + 1) {\n      acc[acc.length - 1][1]++;\n    } else {\n      acc.push([visualColumnIndex, 1]);\n    }\n\n    return acc;\n  }, []);\n\n  return normalizedColumnRanges;\n}\n\n/**\n * Function transform selection ranges (produced by `hot.getSelected()` and `hot.getSelectedRange()`) to normalized\n * data structure. It merges repeated ranges into consecutive coordinates. The returned structure\n * contains an array of arrays. The single item contains at index 0 visual column index from the selection was\n * started and at index 1 distance as a count of selected columns.\n *\n * @param {Array[]|CellRange[]} selectionRanges Selection ranges produced by Handsontable.\n * @return {Array[]} Returns an array of arrays with ranges defines in that schema:\n *                   `[[visualColumnStart, distance], [visualColumnStart, distance], ...]`.\n *                   The column distances are always created starting from the left (zero index) to the\n *                   right (the latest column index).\n */\nfunction transformSelectionToRowDistance(selectionRanges) {\n  var selectionType = detectSelectionType(selectionRanges);\n\n  if (selectionType === SELECTION_TYPE_UNRECOGNIZED || selectionType === SELECTION_TYPE_EMPTY) {\n    return [];\n  }\n\n  var selectionSchemaNormalizer = normalizeSelectionFactory(selectionType);\n  var unorderedIndexes = new Set();\n\n  // Iterate through all ranges and collect all column indexes which are not saved yet.\n  (0, _array.arrayEach)(selectionRanges, function (selection) {\n    var _selectionSchemaNorma3 = selectionSchemaNormalizer(selection),\n        _selectionSchemaNorma4 = _slicedToArray(_selectionSchemaNorma3, 3),\n        rowStart = _selectionSchemaNorma4[0],\n        rowEnd = _selectionSchemaNorma4[2];\n\n    var amount = rowEnd - rowStart + 1;\n\n    (0, _array.arrayEach)(Array.from(new Array(amount), function (_, i) {\n      return rowStart + i;\n    }), function (index) {\n      if (!unorderedIndexes.has(index)) {\n        unorderedIndexes.add(index);\n      }\n    });\n  });\n\n  // Sort indexes in ascending order to easily detecting non-consecutive columns.\n  var orderedIndexes = Array.from(unorderedIndexes).sort(function (a, b) {\n    return a - b;\n  });\n  var normalizedRowRanges = (0, _array.arrayReduce)(orderedIndexes, function (acc, rowIndex, index, array) {\n    if (index !== 0 && rowIndex === array[index - 1] + 1) {\n      acc[acc.length - 1][1]++;\n    } else {\n      acc.push([rowIndex, 1]);\n    }\n\n    return acc;\n  }, []);\n\n  return normalizedRowRanges;\n}\n\n/**\n * Check if passed value can be treated as valid cell coordinate. The second argument is\n * used to check if the value doesn't exceed the defined max table rows/columns count.\n *\n * @param {*} coord\n * @param {Number} maxTableItemsCount The value that declares the maximum coordinate that is still validatable.\n * @return {Boolean}\n */\nfunction isValidCoord(coord) {\n  var maxTableItemsCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Infinity;\n\n  return typeof coord === 'number' && coord >= 0 && coord < maxTableItemsCount;\n};\n\n/***/ }),\n/* 92 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class GhostTable\n * @util\n */\nvar GhostTable = function () {\n  function GhostTable(hotInstance) {\n    _classCallCheck(this, GhostTable);\n\n    /**\n     * Handsontable instance.\n     *\n     * @type {Core}\n     */\n    this.hot = hotInstance;\n    /**\n     * Container element where every table will be injected.\n     *\n     * @type {HTMLElement|null}\n     */\n    this.container = null;\n    /**\n     * Flag which determine is table was injected to DOM.\n     *\n     * @type {Boolean}\n     */\n    this.injected = false;\n    /**\n     * Added rows collection.\n     *\n     * @type {Array}\n     */\n    this.rows = [];\n    /**\n     * Added columns collection.\n     *\n     * @type {Array}\n     */\n    this.columns = [];\n    /**\n     * Samples prepared for calculations.\n     *\n     * @type {Map}\n     * @default {null}\n     */\n    this.samples = null;\n    /**\n     * Ghost table settings.\n     *\n     * @type {Object}\n     * @default {Object}\n     */\n    this.settings = {\n      useHeaders: true\n    };\n  }\n\n  /**\n   * Add row.\n   *\n   * @param {Number} row Row index.\n   * @param {Map} samples Samples Map object.\n   */\n\n\n  _createClass(GhostTable, [{\n    key: 'addRow',\n    value: function addRow(row, samples) {\n      if (this.columns.length) {\n        throw new Error('Doesn\\'t support multi-dimensional table');\n      }\n      if (!this.rows.length) {\n        this.container = this.createContainer(this.hot.rootElement.className);\n      }\n      var rowObject = { row: row };\n      this.rows.push(rowObject);\n\n      this.samples = samples;\n      this.table = this.createTable(this.hot.table.className);\n      this.table.colGroup.appendChild(this.createColGroupsCol());\n      this.table.tr.appendChild(this.createRow(row));\n      this.container.container.appendChild(this.table.fragment);\n\n      rowObject.table = this.table.table;\n    }\n\n    /**\n     * Add a row consisting of the column headers.\n     */\n\n  }, {\n    key: 'addColumnHeadersRow',\n    value: function addColumnHeadersRow(samples) {\n      if (this.hot.getColHeader(0) != null) {\n        var rowObject = { row: -1 };\n        this.rows.push(rowObject);\n\n        this.container = this.createContainer(this.hot.rootElement.className);\n\n        this.samples = samples;\n        this.table = this.createTable(this.hot.table.className);\n        this.table.colGroup.appendChild(this.createColGroupsCol());\n        this.table.tHead.appendChild(this.createColumnHeadersRow());\n        this.container.container.appendChild(this.table.fragment);\n\n        rowObject.table = this.table.table;\n      }\n    }\n\n    /**\n     * Add column.\n     *\n     * @param {Number} column Column index.\n     * @param {Map} samples Samples Map object.\n     */\n\n  }, {\n    key: 'addColumn',\n    value: function addColumn(column, samples) {\n      if (this.rows.length) {\n        throw new Error('Doesn\\'t support multi-dimensional table');\n      }\n      if (!this.columns.length) {\n        this.container = this.createContainer(this.hot.rootElement.className);\n      }\n      var columnObject = { col: column };\n      this.columns.push(columnObject);\n\n      this.samples = samples;\n      this.table = this.createTable(this.hot.table.className);\n\n      if (this.getSetting('useHeaders') && this.hot.getColHeader(column) !== null) {\n        this.hot.view.appendColHeader(column, this.table.th);\n      }\n      this.table.tBody.appendChild(this.createCol(column));\n      this.container.container.appendChild(this.table.fragment);\n\n      columnObject.table = this.table.table;\n    }\n\n    /**\n     * Get calculated heights.\n     *\n     * @param {Function} callback Callback which will be fired for each calculated row.\n     */\n\n  }, {\n    key: 'getHeights',\n    value: function getHeights(callback) {\n      if (!this.injected) {\n        this.injectTable();\n      }\n      (0, _array.arrayEach)(this.rows, function (row) {\n        // -1 <- reduce border-top from table\n        callback(row.row, (0, _element.outerHeight)(row.table) - 1);\n      });\n    }\n\n    /**\n     * Get calculated widths.\n     *\n     * @param {Function} callback Callback which will be fired for each calculated column.\n     */\n\n  }, {\n    key: 'getWidths',\n    value: function getWidths(callback) {\n      if (!this.injected) {\n        this.injectTable();\n      }\n      (0, _array.arrayEach)(this.columns, function (column) {\n        callback(column.col, (0, _element.outerWidth)(column.table));\n      });\n    }\n\n    /**\n     * Set the Ghost Table settings to the provided object.\n     *\n     * @param {Object} settings New Ghost Table Settings\n     */\n\n  }, {\n    key: 'setSettings',\n    value: function setSettings(settings) {\n      this.settings = settings;\n    }\n\n    /**\n     * Set a single setting of the Ghost Table.\n     *\n     * @param {String} name Setting name.\n     * @param {*} value Setting value.\n     */\n\n  }, {\n    key: 'setSetting',\n    value: function setSetting(name, value) {\n      if (!this.settings) {\n        this.settings = {};\n      }\n\n      this.settings[name] = value;\n    }\n\n    /**\n     * Get the Ghost Table settings.\n     *\n     * @returns {Object|null}\n     */\n\n  }, {\n    key: 'getSettings',\n    value: function getSettings() {\n      return this.settings;\n    }\n\n    /**\n     * Get a single Ghost Table setting.\n     *\n     * @param {String} name\n     * @returns {Boolean|null}\n     */\n\n  }, {\n    key: 'getSetting',\n    value: function getSetting(name) {\n      if (this.settings) {\n        return this.settings[name];\n      }\n      return null;\n    }\n\n    /**\n     * Create colgroup col elements.\n     *\n     * @returns {DocumentFragment}\n     */\n\n  }, {\n    key: 'createColGroupsCol',\n    value: function createColGroupsCol() {\n      var _this = this;\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n\n      if (this.hot.hasRowHeaders()) {\n        fragment.appendChild(this.createColElement(-1));\n      }\n\n      this.samples.forEach(function (sample) {\n        (0, _array.arrayEach)(sample.strings, function (string) {\n          fragment.appendChild(_this.createColElement(string.col));\n        });\n      });\n\n      return fragment;\n    }\n\n    /**\n     * Create table row element.\n     *\n     * @param {Number} row Row index.\n     * @returns {DocumentFragment} Returns created table row elements.\n     */\n\n  }, {\n    key: 'createRow',\n    value: function createRow(row) {\n      var _this2 = this;\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n      var th = d.createElement('th');\n\n      if (this.hot.hasRowHeaders()) {\n        this.hot.view.appendRowHeader(row, th);\n\n        fragment.appendChild(th);\n      }\n\n      this.samples.forEach(function (sample) {\n        (0, _array.arrayEach)(sample.strings, function (string) {\n          var column = string.col;\n          var cellProperties = _this2.hot.getCellMeta(row, column);\n\n          cellProperties.col = column;\n          cellProperties.row = row;\n\n          var renderer = _this2.hot.getCellRenderer(cellProperties);\n          var td = d.createElement('td');\n\n          renderer(_this2.hot, td, row, column, _this2.hot.colToProp(column), string.value, cellProperties);\n          fragment.appendChild(td);\n        });\n      });\n\n      return fragment;\n    }\n  }, {\n    key: 'createColumnHeadersRow',\n    value: function createColumnHeadersRow() {\n      var _this3 = this;\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n\n      if (this.hot.hasRowHeaders()) {\n        var th = d.createElement('th');\n        this.hot.view.appendColHeader(-1, th);\n        fragment.appendChild(th);\n      }\n\n      this.samples.forEach(function (sample) {\n        (0, _array.arrayEach)(sample.strings, function (string) {\n          var column = string.col;\n\n          var th = d.createElement('th');\n\n          _this3.hot.view.appendColHeader(column, th);\n          fragment.appendChild(th);\n        });\n      });\n\n      return fragment;\n    }\n\n    /**\n     * Create table column elements.\n     *\n     * @param {Number} column Column index.\n     * @returns {DocumentFragment} Returns created column table column elements.\n     */\n\n  }, {\n    key: 'createCol',\n    value: function createCol(column) {\n      var _this4 = this;\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n\n      this.samples.forEach(function (sample) {\n        (0, _array.arrayEach)(sample.strings, function (string) {\n          var row = string.row;\n          var cellProperties = _this4.hot.getCellMeta(row, column);\n\n          cellProperties.col = column;\n          cellProperties.row = row;\n\n          var renderer = _this4.hot.getCellRenderer(cellProperties);\n          var td = d.createElement('td');\n          var tr = d.createElement('tr');\n\n          renderer(_this4.hot, td, row, column, _this4.hot.colToProp(column), string.value, cellProperties);\n          tr.appendChild(td);\n          fragment.appendChild(tr);\n        });\n      });\n\n      return fragment;\n    }\n\n    /**\n     * Remove table from document and reset internal state.\n     */\n\n  }, {\n    key: 'clean',\n    value: function clean() {\n      this.rows.length = 0;\n      this.rows[-1] = void 0;\n      this.columns.length = 0;\n\n      if (this.samples) {\n        this.samples.clear();\n      }\n      this.samples = null;\n      this.removeTable();\n    }\n\n    /**\n     * Inject generated table into document.\n     *\n     * @param {HTMLElement} [parent=null]\n     */\n\n  }, {\n    key: 'injectTable',\n    value: function injectTable() {\n      var parent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      if (!this.injected) {\n        (parent || this.hot.rootElement).appendChild(this.container.fragment);\n        this.injected = true;\n      }\n    }\n\n    /**\n     * Remove table from document.\n     */\n\n  }, {\n    key: 'removeTable',\n    value: function removeTable() {\n      if (this.injected && this.container.container.parentNode) {\n        this.container.container.parentNode.removeChild(this.container.container);\n        this.container = null;\n        this.injected = false;\n      }\n    }\n\n    /**\n     * Create col element.\n     *\n     * @param {Number} column Column index.\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createColElement',\n    value: function createColElement(column) {\n      var d = document;\n      var col = d.createElement('col');\n\n      col.style.width = this.hot.view.wt.wtTable.getStretchedColumnWidth(column) + 'px';\n\n      return col;\n    }\n\n    /**\n     * Create table element.\n     *\n     * @param {String} className\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'createTable',\n    value: function createTable() {\n      var className = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n      var table = d.createElement('table');\n      var tHead = d.createElement('thead');\n      var tBody = d.createElement('tbody');\n      var colGroup = d.createElement('colgroup');\n      var tr = d.createElement('tr');\n      var th = d.createElement('th');\n\n      if (this.isVertical()) {\n        table.appendChild(colGroup);\n      }\n      if (this.isHorizontal()) {\n        tr.appendChild(th);\n        tHead.appendChild(tr);\n        table.style.tableLayout = 'auto';\n        table.style.width = 'auto';\n      }\n      table.appendChild(tHead);\n\n      if (this.isVertical()) {\n        tBody.appendChild(tr);\n      }\n      table.appendChild(tBody);\n      (0, _element.addClass)(table, className);\n      fragment.appendChild(table);\n\n      return { fragment: fragment, table: table, tHead: tHead, tBody: tBody, colGroup: colGroup, tr: tr, th: th };\n    }\n\n    /**\n     * Create container for tables.\n     *\n     * @param {String} className\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'createContainer',\n    value: function createContainer() {\n      var className = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n      var container = d.createElement('div');\n\n      className = 'htGhostTable htAutoSize ' + className.trim();\n      (0, _element.addClass)(container, className);\n      fragment.appendChild(container);\n\n      return { fragment: fragment, container: container };\n    }\n\n    /**\n     * Checks if table is raised vertically (checking rows).\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isVertical',\n    value: function isVertical() {\n      return !!(this.rows.length && !this.columns.length);\n    }\n\n    /**\n     * Checks if table is raised horizontally (checking columns).\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isHorizontal',\n    value: function isHorizontal() {\n      return !!(this.columns.length && !this.rows.length);\n    }\n  }]);\n\n  return GhostTable;\n}();\n\nexports.default = GhostTable;\n\n/***/ }),\n/* 93 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = separatorItem;\nvar KEY = exports.KEY = '---------';\n\nfunction separatorItem() {\n  return {\n    name: KEY\n  };\n}\n\n/***/ }),\n/* 94 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.ITEMS = exports.UNDO = exports.SEPARATOR = exports.ROW_BELOW = exports.ROW_ABOVE = exports.REMOVE_ROW = exports.REMOVE_COLUMN = exports.REDO = exports.READ_ONLY = exports.COLUMN_RIGHT = exports.COLUMN_LEFT = exports.CLEAR_COLUMN = exports.ALIGNMENT = undefined;\n\nvar _predefinedItems2;\n\nvar _alignment = __webpack_require__(422);\n\nObject.defineProperty(exports, 'ALIGNMENT', {\n  enumerable: true,\n  get: function get() {\n    return _alignment.KEY;\n  }\n});\n\nvar _clearColumn = __webpack_require__(423);\n\nObject.defineProperty(exports, 'CLEAR_COLUMN', {\n  enumerable: true,\n  get: function get() {\n    return _clearColumn.KEY;\n  }\n});\n\nvar _columnLeft = __webpack_require__(424);\n\nObject.defineProperty(exports, 'COLUMN_LEFT', {\n  enumerable: true,\n  get: function get() {\n    return _columnLeft.KEY;\n  }\n});\n\nvar _columnRight = __webpack_require__(425);\n\nObject.defineProperty(exports, 'COLUMN_RIGHT', {\n  enumerable: true,\n  get: function get() {\n    return _columnRight.KEY;\n  }\n});\n\nvar _readOnly = __webpack_require__(426);\n\nObject.defineProperty(exports, 'READ_ONLY', {\n  enumerable: true,\n  get: function get() {\n    return _readOnly.KEY;\n  }\n});\n\nvar _redo = __webpack_require__(427);\n\nObject.defineProperty(exports, 'REDO', {\n  enumerable: true,\n  get: function get() {\n    return _redo.KEY;\n  }\n});\n\nvar _removeColumn = __webpack_require__(428);\n\nObject.defineProperty(exports, 'REMOVE_COLUMN', {\n  enumerable: true,\n  get: function get() {\n    return _removeColumn.KEY;\n  }\n});\n\nvar _removeRow = __webpack_require__(429);\n\nObject.defineProperty(exports, 'REMOVE_ROW', {\n  enumerable: true,\n  get: function get() {\n    return _removeRow.KEY;\n  }\n});\n\nvar _rowAbove = __webpack_require__(430);\n\nObject.defineProperty(exports, 'ROW_ABOVE', {\n  enumerable: true,\n  get: function get() {\n    return _rowAbove.KEY;\n  }\n});\n\nvar _rowBelow = __webpack_require__(431);\n\nObject.defineProperty(exports, 'ROW_BELOW', {\n  enumerable: true,\n  get: function get() {\n    return _rowBelow.KEY;\n  }\n});\n\nvar _separator = __webpack_require__(93);\n\nObject.defineProperty(exports, 'SEPARATOR', {\n  enumerable: true,\n  get: function get() {\n    return _separator.KEY;\n  }\n});\n\nvar _undo = __webpack_require__(432);\n\nObject.defineProperty(exports, 'UNDO', {\n  enumerable: true,\n  get: function get() {\n    return _undo.KEY;\n  }\n});\nexports.predefinedItems = predefinedItems;\nexports.addItem = addItem;\n\nvar _object = __webpack_require__(2);\n\nvar _alignment2 = _interopRequireDefault(_alignment);\n\nvar _clearColumn2 = _interopRequireDefault(_clearColumn);\n\nvar _columnLeft2 = _interopRequireDefault(_columnLeft);\n\nvar _columnRight2 = _interopRequireDefault(_columnRight);\n\nvar _readOnly2 = _interopRequireDefault(_readOnly);\n\nvar _redo2 = _interopRequireDefault(_redo);\n\nvar _removeColumn2 = _interopRequireDefault(_removeColumn);\n\nvar _removeRow2 = _interopRequireDefault(_removeRow);\n\nvar _rowAbove2 = _interopRequireDefault(_rowAbove);\n\nvar _rowBelow2 = _interopRequireDefault(_rowBelow);\n\nvar _separator2 = _interopRequireDefault(_separator);\n\nvar _undo2 = _interopRequireDefault(_undo);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar ITEMS = exports.ITEMS = [_rowAbove.KEY, _rowBelow.KEY, _columnLeft.KEY, _columnRight.KEY, _clearColumn.KEY, _removeRow.KEY, _removeColumn.KEY, _undo.KEY, _redo.KEY, _readOnly.KEY, _alignment.KEY, _separator.KEY];\n\nvar _predefinedItems = (_predefinedItems2 = {}, _defineProperty(_predefinedItems2, _separator.KEY, _separator2.default), _defineProperty(_predefinedItems2, _rowAbove.KEY, _rowAbove2.default), _defineProperty(_predefinedItems2, _rowBelow.KEY, _rowBelow2.default), _defineProperty(_predefinedItems2, _columnLeft.KEY, _columnLeft2.default), _defineProperty(_predefinedItems2, _columnRight.KEY, _columnRight2.default), _defineProperty(_predefinedItems2, _clearColumn.KEY, _clearColumn2.default), _defineProperty(_predefinedItems2, _removeRow.KEY, _removeRow2.default), _defineProperty(_predefinedItems2, _removeColumn.KEY, _removeColumn2.default), _defineProperty(_predefinedItems2, _undo.KEY, _undo2.default), _defineProperty(_predefinedItems2, _redo.KEY, _redo2.default), _defineProperty(_predefinedItems2, _readOnly.KEY, _readOnly2.default), _defineProperty(_predefinedItems2, _alignment.KEY, _alignment2.default), _predefinedItems2);\n\n/**\n * Gets new object with all predefined menu items.\n *\n * @returns {Object}\n */\nfunction predefinedItems() {\n  var items = {};\n\n  (0, _object.objectEach)(_predefinedItems, function (itemFactory, key) {\n    items[key] = itemFactory();\n  });\n\n  return items;\n}\n\n/**\n * Add new predefined menu item to the collection.\n *\n * @param {String} key Menu command id.\n * @param {Object} item Object command descriptor.\n */\nfunction addItem(key, item) {\n  if (ITEMS.indexOf(key) === -1) {\n    _predefinedItems[key] = item;\n  }\n}\n\n/***/ }),\n/* 95 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['The merged cell declared with {row: ', ', col: ', ', rowspan: \\n    ', ', colspan: ', '} contains negative values, which is not supported. It \\n    will not be added to the collection.'], ['The merged cell declared with {row: ', ', col: ', ', rowspan: \\n    ', ', colspan: ', '} contains negative values, which is not supported. It \\n    will not be added to the collection.']),\n    _templateObject2 = _taggedTemplateLiteral(['The merged cell declared at [', ', ', '] is positioned (or positioned partially) \\n       outside of the table range. It was not added to the table, please fix your setup.'], ['The merged cell declared at [', ', ', '] is positioned (or positioned partially) \\n       outside of the table range. It was not added to the table, please fix your setup.']),\n    _templateObject3 = _taggedTemplateLiteral(['The merged cell declared at [', ', ', '] has both \"rowspan\" \\n     and \"colspan\" declared as \"1\", which makes it a single cell. It cannot be added to the collection.'], ['The merged cell declared at [', ', ', '] has both \"rowspan\" \\n     and \"colspan\" declared as \"1\", which makes it a single cell. It cannot be added to the collection.']),\n    _templateObject4 = _taggedTemplateLiteral(['The merged cell declared at [', ', ', '] has \"rowspan\" or \"colspan\" declared as \\n      \"0\", which is not supported. It cannot be added to the collection.'], ['The merged cell declared at [', ', ', '] has \"rowspan\" or \"colspan\" declared as \\n      \"0\", which is not supported. It cannot be added to the collection.']);\n\nvar _index = __webpack_require__(4);\n\nvar _templateLiteralTag = __webpack_require__(42);\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * The `MergedCellCoords` class represents a single merged cell.\n *\n * @class MergedCellCoords\n * @plugin MergeCells\n */\nvar MergedCellCoords = function () {\n  function MergedCellCoords(row, column, rowspan, colspan) {\n    _classCallCheck(this, MergedCellCoords);\n\n    /**\n     * The index of the topmost merged cell row.\n     *\n     * @type {Number}\n     */\n    this.row = row;\n    /**\n     * The index of the leftmost column.\n     *\n     * @type {Number}\n     */\n    this.col = column;\n    /**\n     * The `rowspan` value of the merged cell.\n     *\n     * @type {Number}\n     */\n    this.rowspan = rowspan;\n    /**\n     * The `colspan` value of the merged cell.\n     *\n     * @type {Number}\n     */\n    this.colspan = colspan;\n    /**\n     * `true` only if the merged cell is bound to be removed.\n     *\n     * @type {Boolean}\n     */\n    this.removed = false;\n  }\n\n  /**\n   * Get a warning message for when the declared merged cell data contains negative values.\n   *\n   * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n   * @return {String}\n   */\n\n\n  _createClass(MergedCellCoords, [{\n    key: 'normalize',\n\n\n    /**\n     * Sanitize (prevent from going outside the boundaries) the merged cell.\n     *\n     * @param hotInstance\n     */\n    value: function normalize(hotInstance) {\n      var totalRows = hotInstance.countRows();\n      var totalColumns = hotInstance.countCols();\n\n      if (this.row < 0) {\n        this.row = 0;\n      } else if (this.row > totalRows - 1) {\n        this.row = totalRows - 1;\n      }\n\n      if (this.col < 0) {\n        this.col = 0;\n      } else if (this.col > totalColumns - 1) {\n        this.col = totalColumns - 1;\n      }\n\n      if (this.row + this.rowspan > totalRows - 1) {\n        this.rowspan = totalRows - this.row;\n      }\n\n      if (this.col + this.colspan > totalColumns - 1) {\n        this.colspan = totalColumns - this.col;\n      }\n    }\n\n    /**\n     * Returns `true` if the provided coordinates are inside the merged cell.\n     *\n     * @param {Number} row The row index.\n     * @param {Number} column The column index.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'includes',\n    value: function includes(row, column) {\n      return this.row <= row && this.col <= column && this.row + this.rowspan - 1 >= row && this.col + this.colspan - 1 >= column;\n    }\n\n    /**\n     * Returns `true` if the provided `column` property is within the column span of the merged cell.\n     *\n     * @param {Number} column The column index.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'includesHorizontally',\n    value: function includesHorizontally(column) {\n      return this.col <= column && this.col + this.colspan - 1 >= column;\n    }\n\n    /**\n     * Returns `true` if the provided `row` property is within the row span of the merged cell.\n     *\n     * @param {Number} row Row index.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'includesVertically',\n    value: function includesVertically(row) {\n      return this.row <= row && this.row + this.rowspan - 1 >= row;\n    }\n\n    /**\n     * Shift (and possibly resize, if needed) the merged cell.\n     *\n     * @param {Array} shiftVector 2-element array containing the information on the shifting in the `x` and `y` axis.\n     * @param {Number} indexOfChange Index of the preceding change.\n     * @returns {Boolean} Returns `false` if the whole merged cell was removed.\n     */\n\n  }, {\n    key: 'shift',\n    value: function shift(shiftVector, indexOfChange) {\n      var shiftValue = shiftVector[0] || shiftVector[1];\n      var shiftedIndex = indexOfChange + Math.abs(shiftVector[0] || shiftVector[1]) - 1;\n      var span = shiftVector[0] ? 'colspan' : 'rowspan';\n      var index = shiftVector[0] ? 'col' : 'row';\n      var changeStart = Math.min(indexOfChange, shiftedIndex);\n      var changeEnd = Math.max(indexOfChange, shiftedIndex);\n      var mergeStart = this[index];\n      var mergeEnd = this[index] + this[span] - 1;\n\n      if (mergeStart >= indexOfChange) {\n        this[index] += shiftValue;\n      }\n\n      // adding rows/columns\n      if (shiftValue > 0) {\n        if (indexOfChange <= mergeEnd && indexOfChange > mergeStart) {\n          this[span] += shiftValue;\n        }\n\n        // removing rows/columns\n      } else if (shiftValue < 0) {\n\n        // removing the whole merge\n        if (changeStart <= mergeStart && changeEnd >= mergeEnd) {\n          this.removed = true;\n          return false;\n\n          // removing the merge partially, including the beginning\n        } else if (mergeStart >= changeStart && mergeStart <= changeEnd) {\n          var removedOffset = changeEnd - mergeStart + 1;\n          var preRemovedOffset = Math.abs(shiftValue) - removedOffset;\n\n          this[index] -= preRemovedOffset + shiftValue;\n          this[span] -= removedOffset;\n\n          // removing the middle part of the merge\n        } else if (mergeStart <= changeStart && mergeEnd >= changeEnd) {\n          this[span] += shiftValue;\n\n          // removing the end part of the merge\n        } else if (mergeStart <= changeStart && mergeEnd >= changeStart && mergeEnd < changeEnd) {\n          var removedPart = mergeEnd - changeStart + 1;\n\n          this[span] -= removedPart;\n        }\n      }\n\n      return true;\n    }\n\n    /**\n     * Check if the second provided merged cell is \"farther\" in the provided direction.\n     *\n     * @param {MergedCellCoords} mergedCell The merged cell to check.\n     * @param {String} direction Drag direction.\n     * @return {Boolean|null} `true` if the second provided merged cell is \"farther\".\n     */\n\n  }, {\n    key: 'isFarther',\n    value: function isFarther(mergedCell, direction) {\n      if (!mergedCell) {\n        return true;\n      }\n\n      if (direction === 'down') {\n        return mergedCell.row + mergedCell.rowspan - 1 < this.row + this.rowspan - 1;\n      } else if (direction === 'up') {\n        return mergedCell.row > this.row;\n      } else if (direction === 'right') {\n        return mergedCell.col + mergedCell.colspan - 1 < this.col + this.colspan - 1;\n      } else if (direction === 'left') {\n        return mergedCell.col > this.col;\n      }\n      return null;\n    }\n\n    /**\n     * Get the bottom row index of the merged cell.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getLastRow',\n    value: function getLastRow() {\n      return this.row + this.rowspan - 1;\n    }\n\n    /**\n     * Get the rightmost column index of the merged cell.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getLastColumn',\n    value: function getLastColumn() {\n      return this.col + this.colspan - 1;\n    }\n\n    /**\n     * Get the range coordinates of the merged cell.\n     *\n     * @return {CellRange}\n     */\n\n  }, {\n    key: 'getRange',\n    value: function getRange() {\n      return new _index.CellRange(new _index.CellCoords(this.row, this.col), new _index.CellCoords(this.row, this.col), new _index.CellCoords(this.getLastRow(), this.getLastColumn()));\n    }\n  }], [{\n    key: 'NEGATIVE_VALUES_WARNING',\n    value: function NEGATIVE_VALUES_WARNING(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject, newMergedCell.row, newMergedCell.col, newMergedCell.rowspan, newMergedCell.colspan);\n    }\n\n    /**\n     * Get a warning message for when the declared merged cell data contains values exceeding the table limits.\n     *\n     * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n     * @return {String}\n     */\n\n  }, {\n    key: 'IS_OUT_OF_BOUNDS_WARNING',\n    value: function IS_OUT_OF_BOUNDS_WARNING(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject2, newMergedCell.row, newMergedCell.col);\n    }\n\n    /**\n     * Get a warning message for when the declared merged cell data represents a single cell.\n     *\n     * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n     * @return {String}\n     */\n\n  }, {\n    key: 'IS_SINGLE_CELL',\n    value: function IS_SINGLE_CELL(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject3, newMergedCell.row, newMergedCell.col);\n    }\n\n    /**\n     * Get a warning message for when the declared merged cell data contains \"colspan\" or \"rowspan\", that equals 0.\n     *\n     * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n     * @return {String}\n     */\n\n  }, {\n    key: 'ZERO_SPAN_WARNING',\n    value: function ZERO_SPAN_WARNING(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject4, newMergedCell.row, newMergedCell.col);\n    }\n\n    /**\n     * Check whether the values provided for a merged cell contain any negative values.\n     *\n     * @param {Object} mergedCellInfo Object containing the `row`, `col`, `rowspan` and `colspan` properties.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'containsNegativeValues',\n    value: function containsNegativeValues(mergedCellInfo) {\n      return mergedCellInfo.row < 0 || mergedCellInfo.col < 0 || mergedCellInfo.rowspan < 0 || mergedCellInfo.colspan < 0;\n    }\n\n    /**\n     * Check whether the provided merged cell information object represents a single cell.\n     *\n     * @private\n     * @param {Object} mergedCellInfo An object with `row`, `col`, `rowspan` and `colspan` properties.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSingleCell',\n    value: function isSingleCell(mergedCellInfo) {\n      return mergedCellInfo.colspan === 1 && mergedCellInfo.rowspan === 1;\n    }\n\n    /**\n     * Check whether the provided merged cell information object contains a rowspan or colspan of 0.\n     *\n     * @private\n     * @param {Object} mergedCellInfo An object with `row`, `col`, `rowspan` and `colspan` properties.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'containsZeroSpan',\n    value: function containsZeroSpan(mergedCellInfo) {\n      return mergedCellInfo.colspan === 0 || mergedCellInfo.rowspan === 0;\n    }\n\n    /**\n     * Check whether the provided merged cell object is to be declared out of bounds of the table.\n     *\n     * @param {Object} mergeCell Object containing the `row`, `col`, `rowspan` and `colspan` properties.\n     * @param {Number} rowCount Number of rows in the table.\n     * @param {Number} columnCount Number of rows in the table.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isOutOfBounds',\n    value: function isOutOfBounds(mergeCell, rowCount, columnCount) {\n      return mergeCell.row < 0 || mergeCell.col < 0 || mergeCell.row >= rowCount || mergeCell.row + mergeCell.rowspan - 1 >= rowCount || mergeCell.col >= columnCount || mergeCell.col + mergeCell.colspan - 1 >= columnCount;\n    }\n  }]);\n\n  return MergedCellCoords;\n}();\n\nexports.default = MergedCellCoords;\n\n/***/ }),\n/* 96 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar strong = __webpack_require__(97);\nvar validate = __webpack_require__(46);\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = __webpack_require__(66)(MAP, function (get) {\n  return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.1.3.6 Map.prototype.get(key)\n  get: function get(key) {\n    var entry = strong.getEntry(validate(this, MAP), key);\n    return entry && entry.v;\n  },\n  // 23.1.3.9 Map.prototype.set(key, value)\n  set: function set(key, value) {\n    return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n  }\n}, strong, true);\n\n\n/***/ }),\n/* 97 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar dP = __webpack_require__(20).f;\nvar create = __webpack_require__(74);\nvar redefineAll = __webpack_require__(61);\nvar ctx = __webpack_require__(32);\nvar anInstance = __webpack_require__(63);\nvar forOf = __webpack_require__(64);\nvar $iterDefine = __webpack_require__(106);\nvar step = __webpack_require__(108);\nvar setSpecies = __webpack_require__(109);\nvar DESCRIPTORS = __webpack_require__(22);\nvar fastKey = __webpack_require__(34).fastKey;\nvar validate = __webpack_require__(46);\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n  // fast case\n  var index = fastKey(key);\n  var entry;\n  if (index !== 'F') return that._i[index];\n  // frozen object case\n  for (entry = that._f; entry; entry = entry.n) {\n    if (entry.k == key) return entry;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      anInstance(that, C, NAME, '_i');\n      that._t = NAME;         // collection type\n      that._i = create(null); // index\n      that._f = undefined;    // first entry\n      that._l = undefined;    // last entry\n      that[SIZE] = 0;         // size\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.1.3.1 Map.prototype.clear()\n      // 23.2.3.2 Set.prototype.clear()\n      clear: function clear() {\n        for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n          entry.r = true;\n          if (entry.p) entry.p = entry.p.n = undefined;\n          delete data[entry.i];\n        }\n        that._f = that._l = undefined;\n        that[SIZE] = 0;\n      },\n      // 23.1.3.3 Map.prototype.delete(key)\n      // 23.2.3.4 Set.prototype.delete(value)\n      'delete': function (key) {\n        var that = validate(this, NAME);\n        var entry = getEntry(that, key);\n        if (entry) {\n          var next = entry.n;\n          var prev = entry.p;\n          delete that._i[entry.i];\n          entry.r = true;\n          if (prev) prev.n = next;\n          if (next) next.p = prev;\n          if (that._f == entry) that._f = next;\n          if (that._l == entry) that._l = prev;\n          that[SIZE]--;\n        } return !!entry;\n      },\n      // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n      // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n      forEach: function forEach(callbackfn /* , that = undefined */) {\n        validate(this, NAME);\n        var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n        var entry;\n        while (entry = entry ? entry.n : this._f) {\n          f(entry.v, entry.k, this);\n          // revert to the last existing entry\n          while (entry && entry.r) entry = entry.p;\n        }\n      },\n      // 23.1.3.7 Map.prototype.has(key)\n      // 23.2.3.7 Set.prototype.has(value)\n      has: function has(key) {\n        return !!getEntry(validate(this, NAME), key);\n      }\n    });\n    if (DESCRIPTORS) dP(C.prototype, 'size', {\n      get: function () {\n        return validate(this, NAME)[SIZE];\n      }\n    });\n    return C;\n  },\n  def: function (that, key, value) {\n    var entry = getEntry(that, key);\n    var prev, index;\n    // change existing entry\n    if (entry) {\n      entry.v = value;\n    // create new entry\n    } else {\n      that._l = entry = {\n        i: index = fastKey(key, true), // <- index\n        k: key,                        // <- key\n        v: value,                      // <- value\n        p: prev = that._l,             // <- previous entry\n        n: undefined,                  // <- next entry\n        r: false                       // <- removed\n      };\n      if (!that._f) that._f = entry;\n      if (prev) prev.n = entry;\n      that[SIZE]++;\n      // add to index\n      if (index !== 'F') that._i[index] = entry;\n    } return that;\n  },\n  getEntry: getEntry,\n  setStrong: function (C, NAME, IS_MAP) {\n    // add .keys, .values, .entries, [@@iterator]\n    // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n    $iterDefine(C, NAME, function (iterated, kind) {\n      this._t = validate(iterated, NAME); // target\n      this._k = kind;                     // kind\n      this._l = undefined;                // previous\n    }, function () {\n      var that = this;\n      var kind = that._k;\n      var entry = that._l;\n      // revert to the last existing entry\n      while (entry && entry.r) entry = entry.p;\n      // get next entry\n      if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n        // or finish the iteration\n        that._t = undefined;\n        return step(1);\n      }\n      // return step by kind\n      if (kind == 'keys') return step(0, entry.k);\n      if (kind == 'values') return step(0, entry.v);\n      return step(0, [entry.k, entry.v]);\n    }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n    // add [@@species], 23.1.2.2, 23.2.2.2\n    setSpecies(NAME);\n  }\n};\n\n\n/***/ }),\n/* 98 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = !__webpack_require__(22) && !__webpack_require__(23)(function () {\n  return Object.defineProperty(__webpack_require__(72)('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n/* 99 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar has = __webpack_require__(29);\nvar toIObject = __webpack_require__(24);\nvar arrayIndexOf = __webpack_require__(100)(false);\nvar IE_PROTO = __webpack_require__(76)('IE_PROTO');\n\nmodule.exports = function (object, names) {\n  var O = toIObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (has(O, key = names[i++])) {\n    ~arrayIndexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n\n\n/***/ }),\n/* 100 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = __webpack_require__(24);\nvar toLength = __webpack_require__(25);\nvar toAbsoluteIndex = __webpack_require__(60);\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIObject($this);\n    var length = toLength(O.length);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n      if (O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n\n\n/***/ }),\n/* 101 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar document = __webpack_require__(14).document;\nmodule.exports = document && document.documentElement;\n\n\n/***/ }),\n/* 102 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// call something on iterator step with safe closing on error\nvar anObject = __webpack_require__(18);\nmodule.exports = function (iterator, fn, value, entries) {\n  try {\n    return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n  // 7.4.6 IteratorClose(iterator, completion)\n  } catch (e) {\n    var ret = iterator['return'];\n    if (ret !== undefined) anObject(ret.call(iterator));\n    throw e;\n  }\n};\n\n\n/***/ }),\n/* 103 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// check on default Array iterator\nvar Iterators = __webpack_require__(51);\nvar ITERATOR = __webpack_require__(11)('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n\n\n/***/ }),\n/* 104 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar classof = __webpack_require__(105);\nvar ITERATOR = __webpack_require__(11)('iterator');\nvar Iterators = __webpack_require__(51);\nmodule.exports = __webpack_require__(45).getIteratorMethod = function (it) {\n  if (it != undefined) return it[ITERATOR]\n    || it['@@iterator']\n    || Iterators[classof(it)];\n};\n\n\n/***/ }),\n/* 105 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(44);\nvar TAG = __webpack_require__(11)('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n    // builtinTag case\n    : ARG ? cof(O)\n    // ES3 arguments fallback\n    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\n\n/***/ }),\n/* 106 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(65);\nvar $export = __webpack_require__(3);\nvar redefine = __webpack_require__(30);\nvar hide = __webpack_require__(31);\nvar Iterators = __webpack_require__(51);\nvar $iterCreate = __webpack_require__(328);\nvar setToStringTag = __webpack_require__(52);\nvar getPrototypeOf = __webpack_require__(107);\nvar ITERATOR = __webpack_require__(11)('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function (kind) {\n    if (!BUGGY && kind in proto) return proto[kind];\n    switch (kind) {\n      case KEYS: return function keys() { return new Constructor(this, kind); };\n      case VALUES: return function values() { return new Constructor(this, kind); };\n    } return function entries() { return new Constructor(this, kind); };\n  };\n  var TAG = NAME + ' Iterator';\n  var DEF_VALUES = DEFAULT == VALUES;\n  var VALUES_BUG = false;\n  var proto = Base.prototype;\n  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n  var $default = $native || getMethod(DEFAULT);\n  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n  var methods, key, IteratorPrototype;\n  // Fix native\n  if ($anyNative) {\n    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n      // Set @@toStringTag to native iterators\n      setToStringTag(IteratorPrototype, TAG, true);\n      // fix for some old engines\n      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n    }\n  }\n  // fix Array#{values, @@iterator}.name in V8 / FF\n  if (DEF_VALUES && $native && $native.name !== VALUES) {\n    VALUES_BUG = true;\n    $default = function values() { return $native.call(this); };\n  }\n  // Define iterator\n  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG] = returnThis;\n  if (DEFAULT) {\n    methods = {\n      values: DEF_VALUES ? $default : getMethod(VALUES),\n      keys: IS_SET ? $default : getMethod(KEYS),\n      entries: $entries\n    };\n    if (FORCED) for (key in methods) {\n      if (!(key in proto)) redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n\n\n/***/ }),\n/* 107 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(29);\nvar toObject = __webpack_require__(33);\nvar IE_PROTO = __webpack_require__(76)('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n  O = toObject(O);\n  if (has(O, IE_PROTO)) return O[IE_PROTO];\n  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  } return O instanceof Object ? ObjectProto : null;\n};\n\n\n/***/ }),\n/* 108 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (done, value) {\n  return { value: value, done: !!done };\n};\n\n\n/***/ }),\n/* 109 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar global = __webpack_require__(14);\nvar dP = __webpack_require__(20);\nvar DESCRIPTORS = __webpack_require__(22);\nvar SPECIES = __webpack_require__(11)('species');\n\nmodule.exports = function (KEY) {\n  var C = global[KEY];\n  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n    configurable: true,\n    get: function () { return this; }\n  });\n};\n\n\n/***/ }),\n/* 110 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = __webpack_require__(9);\nvar anObject = __webpack_require__(18);\nvar check = function (O, proto) {\n  anObject(O);\n  if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n    function (test, buggy, set) {\n      try {\n        set = __webpack_require__(32)(Function.call, __webpack_require__(67).f(Object.prototype, '__proto__').set, 2);\n        set(test, []);\n        buggy = !(test instanceof Array);\n      } catch (e) { buggy = true; }\n      return function setPrototypeOf(O, proto) {\n        check(O, proto);\n        if (buggy) O.__proto__ = proto;\n        else set(O, proto);\n        return O;\n      };\n    }({}, false) : undefined),\n  check: check\n};\n\n\n/***/ }),\n/* 111 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar strong = __webpack_require__(97);\nvar validate = __webpack_require__(46);\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = __webpack_require__(66)(SET, function (get) {\n  return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.2.3.1 Set.prototype.add(value)\n  add: function add(value) {\n    return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n  }\n}, strong);\n\n\n/***/ }),\n/* 112 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar each = __webpack_require__(68)(0);\nvar redefine = __webpack_require__(30);\nvar meta = __webpack_require__(34);\nvar assign = __webpack_require__(114);\nvar weak = __webpack_require__(115);\nvar isObject = __webpack_require__(9);\nvar fails = __webpack_require__(23);\nvar validate = __webpack_require__(46);\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n  return function WeakMap() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n};\n\nvar methods = {\n  // 23.3.3.3 WeakMap.prototype.get(key)\n  get: function get(key) {\n    if (isObject(key)) {\n      var data = getWeak(key);\n      if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n      return data ? data[this._i] : undefined;\n    }\n  },\n  // 23.3.3.5 WeakMap.prototype.set(key, value)\n  set: function set(key, value) {\n    return weak.def(validate(this, WEAK_MAP), key, value);\n  }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = __webpack_require__(66)(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n  InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n  assign(InternalMap.prototype, methods);\n  meta.NEED = true;\n  each(['delete', 'has', 'get', 'set'], function (key) {\n    var proto = $WeakMap.prototype;\n    var method = proto[key];\n    redefine(proto, key, function (a, b) {\n      // store frozen objects on internal weakmap shim\n      if (isObject(a) && !isExtensible(a)) {\n        if (!this._f) this._f = new InternalMap();\n        var result = this._f[key](a, b);\n        return key == 'set' ? this : result;\n      // store all the rest on native weakmap\n      } return method.call(this, a, b);\n    });\n  });\n}\n\n\n/***/ }),\n/* 113 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.2.2 IsArray(argument)\nvar cof = __webpack_require__(44);\nmodule.exports = Array.isArray || function isArray(arg) {\n  return cof(arg) == 'Array';\n};\n\n\n/***/ }),\n/* 114 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = __webpack_require__(37);\nvar gOPS = __webpack_require__(69);\nvar pIE = __webpack_require__(53);\nvar toObject = __webpack_require__(33);\nvar IObject = __webpack_require__(75);\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || __webpack_require__(23)(function () {\n  var A = {};\n  var B = {};\n  // eslint-disable-next-line no-undef\n  var S = Symbol();\n  var K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function (k) { B[k] = k; });\n  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n  var T = toObject(target);\n  var aLen = arguments.length;\n  var index = 1;\n  var getSymbols = gOPS.f;\n  var isEnum = pIE.f;\n  while (aLen > index) {\n    var S = IObject(arguments[index++]);\n    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n    while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n  } return T;\n} : $assign;\n\n\n/***/ }),\n/* 115 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar redefineAll = __webpack_require__(61);\nvar getWeak = __webpack_require__(34).getWeak;\nvar anObject = __webpack_require__(18);\nvar isObject = __webpack_require__(9);\nvar anInstance = __webpack_require__(63);\nvar forOf = __webpack_require__(64);\nvar createArrayMethod = __webpack_require__(68);\nvar $has = __webpack_require__(29);\nvar validate = __webpack_require__(46);\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n  return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n  this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n  return arrayFind(store.a, function (it) {\n    return it[0] === key;\n  });\n};\nUncaughtFrozenStore.prototype = {\n  get: function (key) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) return entry[1];\n  },\n  has: function (key) {\n    return !!findUncaughtFrozen(this, key);\n  },\n  set: function (key, value) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) entry[1] = value;\n    else this.a.push([key, value]);\n  },\n  'delete': function (key) {\n    var index = arrayFindIndex(this.a, function (it) {\n      return it[0] === key;\n    });\n    if (~index) this.a.splice(index, 1);\n    return !!~index;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      anInstance(that, C, NAME, '_i');\n      that._t = NAME;      // collection type\n      that._i = id++;      // collection id\n      that._l = undefined; // leak store for uncaught frozen objects\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.3.3.2 WeakMap.prototype.delete(key)\n      // 23.4.3.3 WeakSet.prototype.delete(value)\n      'delete': function (key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n        return data && $has(data, this._i) && delete data[this._i];\n      },\n      // 23.3.3.4 WeakMap.prototype.has(key)\n      // 23.4.3.4 WeakSet.prototype.has(value)\n      has: function has(key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n        return data && $has(data, this._i);\n      }\n    });\n    return C;\n  },\n  def: function (that, key, value) {\n    var data = getWeak(anObject(key), true);\n    if (data === true) uncaughtFrozenStore(that).set(key, value);\n    else data[that._i] = value;\n    return that;\n  },\n  ufstore: uncaughtFrozenStore\n};\n\n\n/***/ }),\n/* 116 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar weak = __webpack_require__(115);\nvar validate = __webpack_require__(46);\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\n__webpack_require__(66)(WEAK_SET, function (get) {\n  return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.4.3.1 WeakSet.prototype.add(value)\n  add: function add(value) {\n    return weak.def(validate(this, WEAK_SET), value, true);\n  }\n}, weak, false, true);\n\n\n/***/ }),\n/* 117 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(65);\nvar global = __webpack_require__(14);\nvar ctx = __webpack_require__(32);\nvar classof = __webpack_require__(105);\nvar $export = __webpack_require__(3);\nvar isObject = __webpack_require__(9);\nvar aFunction = __webpack_require__(62);\nvar anInstance = __webpack_require__(63);\nvar forOf = __webpack_require__(64);\nvar speciesConstructor = __webpack_require__(332);\nvar task = __webpack_require__(80).set;\nvar microtask = __webpack_require__(334)();\nvar newPromiseCapabilityModule = __webpack_require__(118);\nvar perform = __webpack_require__(335);\nvar promiseResolve = __webpack_require__(336);\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n  try {\n    // correct subclassing with @@species support\n    var promise = $Promise.resolve(1);\n    var FakePromise = (promise.constructor = {})[__webpack_require__(11)('species')] = function (exec) {\n      exec(empty, empty);\n    };\n    // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n    return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;\n  } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n  var then;\n  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n  if (promise._n) return;\n  promise._n = true;\n  var chain = promise._c;\n  microtask(function () {\n    var value = promise._v;\n    var ok = promise._s == 1;\n    var i = 0;\n    var run = function (reaction) {\n      var handler = ok ? reaction.ok : reaction.fail;\n      var resolve = reaction.resolve;\n      var reject = reaction.reject;\n      var domain = reaction.domain;\n      var result, then, exited;\n      try {\n        if (handler) {\n          if (!ok) {\n            if (promise._h == 2) onHandleUnhandled(promise);\n            promise._h = 1;\n          }\n          if (handler === true) result = value;\n          else {\n            if (domain) domain.enter();\n            result = handler(value); // may throw\n            if (domain) {\n              domain.exit();\n              exited = true;\n            }\n          }\n          if (result === reaction.promise) {\n            reject(TypeError('Promise-chain cycle'));\n          } else if (then = isThenable(result)) {\n            then.call(result, resolve, reject);\n          } else resolve(result);\n        } else reject(value);\n      } catch (e) {\n        if (domain && !exited) domain.exit();\n        reject(e);\n      }\n    };\n    while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n    promise._c = [];\n    promise._n = false;\n    if (isReject && !promise._h) onUnhandled(promise);\n  });\n};\nvar onUnhandled = function (promise) {\n  task.call(global, function () {\n    var value = promise._v;\n    var unhandled = isUnhandled(promise);\n    var result, handler, console;\n    if (unhandled) {\n      result = perform(function () {\n        if (isNode) {\n          process.emit('unhandledRejection', value, promise);\n        } else if (handler = global.onunhandledrejection) {\n          handler({ promise: promise, reason: value });\n        } else if ((console = global.console) && console.error) {\n          console.error('Unhandled promise rejection', value);\n        }\n      });\n      // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n      promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n    } promise._a = undefined;\n    if (unhandled && result.e) throw result.v;\n  });\n};\nvar isUnhandled = function (promise) {\n  return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n  task.call(global, function () {\n    var handler;\n    if (isNode) {\n      process.emit('rejectionHandled', promise);\n    } else if (handler = global.onrejectionhandled) {\n      handler({ promise: promise, reason: promise._v });\n    }\n  });\n};\nvar $reject = function (value) {\n  var promise = this;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  promise._v = value;\n  promise._s = 2;\n  if (!promise._a) promise._a = promise._c.slice();\n  notify(promise, true);\n};\nvar $resolve = function (value) {\n  var promise = this;\n  var then;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  try {\n    if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n    if (then = isThenable(value)) {\n      microtask(function () {\n        var wrapper = { _w: promise, _d: false }; // wrap\n        try {\n          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n        } catch (e) {\n          $reject.call(wrapper, e);\n        }\n      });\n    } else {\n      promise._v = value;\n      promise._s = 1;\n      notify(promise, false);\n    }\n  } catch (e) {\n    $reject.call({ _w: promise, _d: false }, e); // wrap\n  }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n  // 25.4.3.1 Promise(executor)\n  $Promise = function Promise(executor) {\n    anInstance(this, $Promise, PROMISE, '_h');\n    aFunction(executor);\n    Internal.call(this);\n    try {\n      executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n    } catch (err) {\n      $reject.call(this, err);\n    }\n  };\n  // eslint-disable-next-line no-unused-vars\n  Internal = function Promise(executor) {\n    this._c = [];             // <- awaiting reactions\n    this._a = undefined;      // <- checked in isUnhandled reactions\n    this._s = 0;              // <- state\n    this._d = false;          // <- done\n    this._v = undefined;      // <- value\n    this._h = 0;              // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n    this._n = false;          // <- notify\n  };\n  Internal.prototype = __webpack_require__(61)($Promise.prototype, {\n    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n    then: function then(onFulfilled, onRejected) {\n      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n      reaction.fail = typeof onRejected == 'function' && onRejected;\n      reaction.domain = isNode ? process.domain : undefined;\n      this._c.push(reaction);\n      if (this._a) this._a.push(reaction);\n      if (this._s) notify(this, false);\n      return reaction.promise;\n    },\n    // 25.4.5.1 Promise.prototype.catch(onRejected)\n    'catch': function (onRejected) {\n      return this.then(undefined, onRejected);\n    }\n  });\n  OwnPromiseCapability = function () {\n    var promise = new Internal();\n    this.promise = promise;\n    this.resolve = ctx($resolve, promise, 1);\n    this.reject = ctx($reject, promise, 1);\n  };\n  newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n    return C === $Promise || C === Wrapper\n      ? new OwnPromiseCapability(C)\n      : newGenericPromiseCapability(C);\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\n__webpack_require__(52)($Promise, PROMISE);\n__webpack_require__(109)(PROMISE);\nWrapper = __webpack_require__(45)[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n  // 25.4.4.5 Promise.reject(r)\n  reject: function reject(r) {\n    var capability = newPromiseCapability(this);\n    var $$reject = capability.reject;\n    $$reject(r);\n    return capability.promise;\n  }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n  // 25.4.4.6 Promise.resolve(x)\n  resolve: function resolve(x) {\n    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n  }\n});\n$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(79)(function (iter) {\n  $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n  // 25.4.4.1 Promise.all(iterable)\n  all: function all(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var resolve = capability.resolve;\n    var reject = capability.reject;\n    var result = perform(function () {\n      var values = [];\n      var index = 0;\n      var remaining = 1;\n      forOf(iterable, false, function (promise) {\n        var $index = index++;\n        var alreadyCalled = false;\n        values.push(undefined);\n        remaining++;\n        C.resolve(promise).then(function (value) {\n          if (alreadyCalled) return;\n          alreadyCalled = true;\n          values[$index] = value;\n          --remaining || resolve(values);\n        }, reject);\n      });\n      --remaining || resolve(values);\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  },\n  // 25.4.4.4 Promise.race(iterable)\n  race: function race(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var reject = capability.reject;\n    var result = perform(function () {\n      forOf(iterable, false, function (promise) {\n        C.resolve(promise).then(capability.resolve, reject);\n      });\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  }\n});\n\n\n/***/ }),\n/* 118 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = __webpack_require__(62);\n\nfunction PromiseCapability(C) {\n  var resolve, reject;\n  this.promise = new C(function ($$resolve, $$reject) {\n    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n    resolve = $$resolve;\n    reject = $$reject;\n  });\n  this.resolve = aFunction(resolve);\n  this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n  return new PromiseCapability(C);\n};\n\n\n/***/ }),\n/* 119 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// ECMAScript 6 symbols shim\nvar global = __webpack_require__(14);\nvar has = __webpack_require__(29);\nvar DESCRIPTORS = __webpack_require__(22);\nvar $export = __webpack_require__(3);\nvar redefine = __webpack_require__(30);\nvar META = __webpack_require__(34).KEY;\nvar $fails = __webpack_require__(23);\nvar shared = __webpack_require__(77);\nvar setToStringTag = __webpack_require__(52);\nvar uid = __webpack_require__(49);\nvar wks = __webpack_require__(11);\nvar wksExt = __webpack_require__(120);\nvar wksDefine = __webpack_require__(337);\nvar enumKeys = __webpack_require__(338);\nvar isArray = __webpack_require__(113);\nvar anObject = __webpack_require__(18);\nvar isObject = __webpack_require__(9);\nvar toIObject = __webpack_require__(24);\nvar toPrimitive = __webpack_require__(73);\nvar createDesc = __webpack_require__(50);\nvar _create = __webpack_require__(74);\nvar gOPNExt = __webpack_require__(121);\nvar $GOPD = __webpack_require__(67);\nvar $DP = __webpack_require__(20);\nvar $keys = __webpack_require__(37);\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n  return _create(dP({}, 'a', {\n    get: function () { return dP(this, 'a', { value: 7 }).a; }\n  })).a != 7;\n}) ? function (it, key, D) {\n  var protoDesc = gOPD(ObjectProto, key);\n  if (protoDesc) delete ObjectProto[key];\n  dP(it, key, D);\n  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n  sym._k = tag;\n  return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n  return typeof it == 'symbol';\n} : function (it) {\n  return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n  anObject(it);\n  key = toPrimitive(key, true);\n  anObject(D);\n  if (has(AllSymbols, key)) {\n    if (!D.enumerable) {\n      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n      it[HIDDEN][key] = true;\n    } else {\n      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n      D = _create(D, { enumerable: createDesc(0, false) });\n    } return setSymbolDesc(it, key, D);\n  } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n  anObject(it);\n  var keys = enumKeys(P = toIObject(P));\n  var i = 0;\n  var l = keys.length;\n  var key;\n  while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n  return it;\n};\nvar $create = function create(it, P) {\n  return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n  var E = isEnum.call(this, key = toPrimitive(key, true));\n  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n  it = toIObject(it);\n  key = toPrimitive(key, true);\n  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n  var D = gOPD(it, key);\n  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n  return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n  var names = gOPN(toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n  } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n  var IS_OP = it === ObjectProto;\n  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n  } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n  $Symbol = function Symbol() {\n    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n    var $set = function (value) {\n      if (this === ObjectProto) $set.call(OPSymbols, value);\n      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n      setSymbolDesc(this, tag, createDesc(1, value));\n    };\n    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n    return wrap(tag);\n  };\n  redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n    return this._k;\n  });\n\n  $GOPD.f = $getOwnPropertyDescriptor;\n  $DP.f = $defineProperty;\n  __webpack_require__(81).f = gOPNExt.f = $getOwnPropertyNames;\n  __webpack_require__(53).f = $propertyIsEnumerable;\n  __webpack_require__(69).f = $getOwnPropertySymbols;\n\n  if (DESCRIPTORS && !__webpack_require__(65)) {\n    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n  }\n\n  wksExt.f = function (name) {\n    return wrap(wks(name));\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n  // 19.4.2.1 Symbol.for(key)\n  'for': function (key) {\n    return has(SymbolRegistry, key += '')\n      ? SymbolRegistry[key]\n      : SymbolRegistry[key] = $Symbol(key);\n  },\n  // 19.4.2.5 Symbol.keyFor(sym)\n  keyFor: function keyFor(sym) {\n    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n  },\n  useSetter: function () { setter = true; },\n  useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n  // 19.1.2.2 Object.create(O [, Properties])\n  create: $create,\n  // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n  defineProperty: $defineProperty,\n  // 19.1.2.3 Object.defineProperties(O, Properties)\n  defineProperties: $defineProperties,\n  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n  // 19.1.2.7 Object.getOwnPropertyNames(O)\n  getOwnPropertyNames: $getOwnPropertyNames,\n  // 19.1.2.8 Object.getOwnPropertySymbols(O)\n  getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n  var S = $Symbol();\n  // MS Edge converts symbol values to JSON as {}\n  // WebKit converts symbol values to JSON as null\n  // V8 throws on boxed symbols\n  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n  stringify: function stringify(it) {\n    var args = [it];\n    var i = 1;\n    var replacer, $replacer;\n    while (arguments.length > i) args.push(arguments[i++]);\n    $replacer = replacer = args[1];\n    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n    if (!isArray(replacer)) replacer = function (key, value) {\n      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n      if (!isSymbol(value)) return value;\n    };\n    args[1] = replacer;\n    return _stringify.apply($JSON, args);\n  }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(31)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n\n\n/***/ }),\n/* 120 */\n/***/ (function(module, exports, __webpack_require__) {\n\nexports.f = __webpack_require__(11);\n\n\n/***/ }),\n/* 121 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = __webpack_require__(24);\nvar gOPN = __webpack_require__(81).f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n  ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n  try {\n    return gOPN(it);\n  } catch (e) {\n    return windowNames.slice();\n  }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n\n\n/***/ }),\n/* 122 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.5 Object.freeze(O)\nvar isObject = __webpack_require__(9);\nvar meta = __webpack_require__(34).onFreeze;\n\n__webpack_require__(26)('freeze', function ($freeze) {\n  return function freeze(it) {\n    return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n  };\n});\n\n\n/***/ }),\n/* 123 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.17 Object.seal(O)\nvar isObject = __webpack_require__(9);\nvar meta = __webpack_require__(34).onFreeze;\n\n__webpack_require__(26)('seal', function ($seal) {\n  return function seal(it) {\n    return $seal && isObject(it) ? $seal(meta(it)) : it;\n  };\n});\n\n\n/***/ }),\n/* 124 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = __webpack_require__(9);\nvar meta = __webpack_require__(34).onFreeze;\n\n__webpack_require__(26)('preventExtensions', function ($preventExtensions) {\n  return function preventExtensions(it) {\n    return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n  };\n});\n\n\n/***/ }),\n/* 125 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.12 Object.isFrozen(O)\nvar isObject = __webpack_require__(9);\n\n__webpack_require__(26)('isFrozen', function ($isFrozen) {\n  return function isFrozen(it) {\n    return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n  };\n});\n\n\n/***/ }),\n/* 126 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.13 Object.isSealed(O)\nvar isObject = __webpack_require__(9);\n\n__webpack_require__(26)('isSealed', function ($isSealed) {\n  return function isSealed(it) {\n    return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n  };\n});\n\n\n/***/ }),\n/* 127 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.11 Object.isExtensible(O)\nvar isObject = __webpack_require__(9);\n\n__webpack_require__(26)('isExtensible', function ($isExtensible) {\n  return function isExtensible(it) {\n    return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n  };\n});\n\n\n/***/ }),\n/* 128 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = __webpack_require__(24);\nvar $getOwnPropertyDescriptor = __webpack_require__(67).f;\n\n__webpack_require__(26)('getOwnPropertyDescriptor', function () {\n  return function getOwnPropertyDescriptor(it, key) {\n    return $getOwnPropertyDescriptor(toIObject(it), key);\n  };\n});\n\n\n/***/ }),\n/* 129 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = __webpack_require__(33);\nvar $getPrototypeOf = __webpack_require__(107);\n\n__webpack_require__(26)('getPrototypeOf', function () {\n  return function getPrototypeOf(it) {\n    return $getPrototypeOf(toObject(it));\n  };\n});\n\n\n/***/ }),\n/* 130 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 Object.keys(O)\nvar toObject = __webpack_require__(33);\nvar $keys = __webpack_require__(37);\n\n__webpack_require__(26)('keys', function () {\n  return function keys(it) {\n    return $keys(toObject(it));\n  };\n});\n\n\n/***/ }),\n/* 131 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.7 Object.getOwnPropertyNames(O)\n__webpack_require__(26)('getOwnPropertyNames', function () {\n  return __webpack_require__(121).f;\n});\n\n\n/***/ }),\n/* 132 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.1 Object.assign(target, source)\nvar $export = __webpack_require__(3);\n\n$export($export.S + $export.F, 'Object', { assign: __webpack_require__(114) });\n\n\n/***/ }),\n/* 133 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.10 Object.is(value1, value2)\nvar $export = __webpack_require__(3);\n$export($export.S, 'Object', { is: __webpack_require__(339) });\n\n\n/***/ }),\n/* 134 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = __webpack_require__(3);\n$export($export.S, 'Object', { setPrototypeOf: __webpack_require__(110).set });\n\n\n/***/ }),\n/* 135 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(20).f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || __webpack_require__(22) && dP(FProto, NAME, {\n  configurable: true,\n  get: function () {\n    try {\n      return ('' + this).match(nameRE)[1];\n    } catch (e) {\n      return '';\n    }\n  }\n});\n\n\n/***/ }),\n/* 136 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\nvar toIObject = __webpack_require__(24);\nvar toLength = __webpack_require__(25);\n\n$export($export.S, 'String', {\n  // 21.1.2.4 String.raw(callSite, ...substitutions)\n  raw: function raw(callSite) {\n    var tpl = toIObject(callSite.raw);\n    var len = toLength(tpl.length);\n    var aLen = arguments.length;\n    var res = [];\n    var i = 0;\n    while (len > i) {\n      res.push(String(tpl[i++]));\n      if (i < aLen) res.push(String(arguments[i]));\n    } return res.join('');\n  }\n});\n\n\n/***/ }),\n/* 137 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\nvar toAbsoluteIndex = __webpack_require__(60);\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n  // 21.1.2.2 String.fromCodePoint(...codePoints)\n  fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n    var res = [];\n    var aLen = arguments.length;\n    var i = 0;\n    var code;\n    while (aLen > i) {\n      code = +arguments[i++];\n      if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n      res.push(code < 0x10000\n        ? fromCharCode(code)\n        : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n      );\n    } return res.join('');\n  }\n});\n\n\n/***/ }),\n/* 138 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(3);\nvar $at = __webpack_require__(340)(false);\n$export($export.P, 'String', {\n  // 21.1.3.3 String.prototype.codePointAt(pos)\n  codePointAt: function codePointAt(pos) {\n    return $at(this, pos);\n  }\n});\n\n\n/***/ }),\n/* 139 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\n\n$export($export.P, 'String', {\n  // 21.1.3.13 String.prototype.repeat(count)\n  repeat: __webpack_require__(140)\n});\n\n\n/***/ }),\n/* 140 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar toInteger = __webpack_require__(59);\nvar defined = __webpack_require__(38);\n\nmodule.exports = function repeat(count) {\n  var str = String(defined(this));\n  var res = '';\n  var n = toInteger(count);\n  if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n  for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n  return res;\n};\n\n\n/***/ }),\n/* 141 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n\nvar $export = __webpack_require__(3);\nvar toLength = __webpack_require__(25);\nvar context = __webpack_require__(82);\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * __webpack_require__(83)(STARTS_WITH), 'String', {\n  startsWith: function startsWith(searchString /* , position = 0 */) {\n    var that = context(this, searchString, STARTS_WITH);\n    var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n    var search = String(searchString);\n    return $startsWith\n      ? $startsWith.call(that, search, index)\n      : that.slice(index, index + search.length) === search;\n  }\n});\n\n\n/***/ }),\n/* 142 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.2.8 IsRegExp(argument)\nvar isObject = __webpack_require__(9);\nvar cof = __webpack_require__(44);\nvar MATCH = __webpack_require__(11)('match');\nmodule.exports = function (it) {\n  var isRegExp;\n  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n\n\n/***/ }),\n/* 143 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n\nvar $export = __webpack_require__(3);\nvar toLength = __webpack_require__(25);\nvar context = __webpack_require__(82);\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * __webpack_require__(83)(ENDS_WITH), 'String', {\n  endsWith: function endsWith(searchString /* , endPosition = @length */) {\n    var that = context(this, searchString, ENDS_WITH);\n    var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n    var len = toLength(that.length);\n    var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n    var search = String(searchString);\n    return $endsWith\n      ? $endsWith.call(that, search, end)\n      : that.slice(end - search.length, end) === search;\n  }\n});\n\n\n/***/ }),\n/* 144 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n\nvar $export = __webpack_require__(3);\nvar context = __webpack_require__(82);\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * __webpack_require__(83)(INCLUDES), 'String', {\n  includes: function includes(searchString /* , position = 0 */) {\n    return !!~context(this, searchString, INCLUDES)\n      .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n\n/***/ }),\n/* 145 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 21.2.5.3 get RegExp.prototype.flags()\nif (__webpack_require__(22) && /./g.flags != 'g') __webpack_require__(20).f(RegExp.prototype, 'flags', {\n  configurable: true,\n  get: __webpack_require__(341)\n});\n\n\n/***/ }),\n/* 146 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// @@match logic\n__webpack_require__(70)('match', 1, function (defined, MATCH, $match) {\n  // 21.1.3.11 String.prototype.match(regexp)\n  return [function match(regexp) {\n    'use strict';\n    var O = defined(this);\n    var fn = regexp == undefined ? undefined : regexp[MATCH];\n    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n  }, $match];\n});\n\n\n/***/ }),\n/* 147 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// @@replace logic\n__webpack_require__(70)('replace', 2, function (defined, REPLACE, $replace) {\n  // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n  return [function replace(searchValue, replaceValue) {\n    'use strict';\n    var O = defined(this);\n    var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n    return fn !== undefined\n      ? fn.call(searchValue, O, replaceValue)\n      : $replace.call(String(O), searchValue, replaceValue);\n  }, $replace];\n});\n\n\n/***/ }),\n/* 148 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// @@split logic\n__webpack_require__(70)('split', 2, function (defined, SPLIT, $split) {\n  'use strict';\n  var isRegExp = __webpack_require__(142);\n  var _split = $split;\n  var $push = [].push;\n  var $SPLIT = 'split';\n  var LENGTH = 'length';\n  var LAST_INDEX = 'lastIndex';\n  if (\n    'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n    'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n    'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n    '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n    '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n    ''[$SPLIT](/.?/)[LENGTH]\n  ) {\n    var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n    // based on es5-shim implementation, need to rework it\n    $split = function (separator, limit) {\n      var string = String(this);\n      if (separator === undefined && limit === 0) return [];\n      // If `separator` is not a regex, use native split\n      if (!isRegExp(separator)) return _split.call(string, separator, limit);\n      var output = [];\n      var flags = (separator.ignoreCase ? 'i' : '') +\n                  (separator.multiline ? 'm' : '') +\n                  (separator.unicode ? 'u' : '') +\n                  (separator.sticky ? 'y' : '');\n      var lastLastIndex = 0;\n      var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n      // Make `global` and avoid `lastIndex` issues by working with a copy\n      var separatorCopy = new RegExp(separator.source, flags + 'g');\n      var separator2, match, lastIndex, lastLength, i;\n      // Doesn't need flags gy, but they don't hurt\n      if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n      while (match = separatorCopy.exec(string)) {\n        // `separatorCopy.lastIndex` is not reliable cross-browser\n        lastIndex = match.index + match[0][LENGTH];\n        if (lastIndex > lastLastIndex) {\n          output.push(string.slice(lastLastIndex, match.index));\n          // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n          // eslint-disable-next-line no-loop-func\n          if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {\n            for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;\n          });\n          if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n          lastLength = match[0][LENGTH];\n          lastLastIndex = lastIndex;\n          if (output[LENGTH] >= splitLimit) break;\n        }\n        if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n      }\n      if (lastLastIndex === string[LENGTH]) {\n        if (lastLength || !separatorCopy.test('')) output.push('');\n      } else output.push(string.slice(lastLastIndex));\n      return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n    };\n  // Chakra, V8\n  } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n    $split = function (separator, limit) {\n      return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n    };\n  }\n  // 21.1.3.17 String.prototype.split(separator, limit)\n  return [function split(separator, limit) {\n    var O = defined(this);\n    var fn = separator == undefined ? undefined : separator[SPLIT];\n    return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n  }, $split];\n});\n\n\n/***/ }),\n/* 149 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// @@search logic\n__webpack_require__(70)('search', 1, function (defined, SEARCH, $search) {\n  // 21.1.3.15 String.prototype.search(regexp)\n  return [function search(regexp) {\n    'use strict';\n    var O = defined(this);\n    var fn = regexp == undefined ? undefined : regexp[SEARCH];\n    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n  }, $search];\n});\n\n\n/***/ }),\n/* 150 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar ctx = __webpack_require__(32);\nvar $export = __webpack_require__(3);\nvar toObject = __webpack_require__(33);\nvar call = __webpack_require__(102);\nvar isArrayIter = __webpack_require__(103);\nvar toLength = __webpack_require__(25);\nvar createProperty = __webpack_require__(84);\nvar getIterFn = __webpack_require__(104);\n\n$export($export.S + $export.F * !__webpack_require__(79)(function (iter) { Array.from(iter); }), 'Array', {\n  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n  from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n    var O = toObject(arrayLike);\n    var C = typeof this == 'function' ? this : Array;\n    var aLen = arguments.length;\n    var mapfn = aLen > 1 ? arguments[1] : undefined;\n    var mapping = mapfn !== undefined;\n    var index = 0;\n    var iterFn = getIterFn(O);\n    var length, result, step, iterator;\n    if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n    // if object isn't iterable or it's array with default iterator - use simple case\n    if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n      for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n        createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n      }\n    } else {\n      length = toLength(O.length);\n      for (result = new C(length); length > index; index++) {\n        createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n      }\n    }\n    result.length = index;\n    return result;\n  }\n});\n\n\n/***/ }),\n/* 151 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(3);\nvar createProperty = __webpack_require__(84);\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * __webpack_require__(23)(function () {\n  function F() { /* empty */ }\n  return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n  // 22.1.2.3 Array.of( ...items)\n  of: function of(/* ...args */) {\n    var index = 0;\n    var aLen = arguments.length;\n    var result = new (typeof this == 'function' ? this : Array)(aLen);\n    while (aLen > index) createProperty(result, index, arguments[index++]);\n    result.length = aLen;\n    return result;\n  }\n});\n\n\n/***/ }),\n/* 152 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = __webpack_require__(3);\n\n$export($export.P, 'Array', { copyWithin: __webpack_require__(342) });\n\n__webpack_require__(47)('copyWithin');\n\n\n/***/ }),\n/* 153 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = __webpack_require__(3);\nvar $find = __webpack_require__(68)(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n  find: function find(callbackfn /* , that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n__webpack_require__(47)(KEY);\n\n\n/***/ }),\n/* 154 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = __webpack_require__(3);\nvar $find = __webpack_require__(68)(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n  findIndex: function findIndex(callbackfn /* , that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n__webpack_require__(47)(KEY);\n\n\n/***/ }),\n/* 155 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = __webpack_require__(3);\n\n$export($export.P, 'Array', { fill: __webpack_require__(343) });\n\n__webpack_require__(47)('fill');\n\n\n/***/ }),\n/* 156 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.2 Number.isFinite(number)\nvar $export = __webpack_require__(3);\nvar _isFinite = __webpack_require__(14).isFinite;\n\n$export($export.S, 'Number', {\n  isFinite: function isFinite(it) {\n    return typeof it == 'number' && _isFinite(it);\n  }\n});\n\n\n/***/ }),\n/* 157 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.3 Number.isInteger(number)\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', { isInteger: __webpack_require__(158) });\n\n\n/***/ }),\n/* 158 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.3 Number.isInteger(number)\nvar isObject = __webpack_require__(9);\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n  return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n\n\n/***/ }),\n/* 159 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = __webpack_require__(3);\nvar isInteger = __webpack_require__(158);\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n  isSafeInteger: function isSafeInteger(number) {\n    return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n  }\n});\n\n\n/***/ }),\n/* 160 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.4 Number.isNaN(number)\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', {\n  isNaN: function isNaN(number) {\n    // eslint-disable-next-line no-self-compare\n    return number != number;\n  }\n});\n\n\n/***/ }),\n/* 161 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.1 Number.EPSILON\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n\n\n/***/ }),\n/* 162 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n\n\n/***/ }),\n/* 163 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n\n\n/***/ }),\n/* 164 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/Array.prototype.includes\nvar $export = __webpack_require__(3);\nvar $includes = __webpack_require__(100)(true);\n\n$export($export.P, 'Array', {\n  includes: function includes(el /* , fromIndex = 0 */) {\n    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n__webpack_require__(47)('includes');\n\n\n/***/ }),\n/* 165 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-object-values-entries\nvar $export = __webpack_require__(3);\nvar $values = __webpack_require__(166)(false);\n\n$export($export.S, 'Object', {\n  values: function values(it) {\n    return $values(it);\n  }\n});\n\n\n/***/ }),\n/* 166 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getKeys = __webpack_require__(37);\nvar toIObject = __webpack_require__(24);\nvar isEnum = __webpack_require__(53).f;\nmodule.exports = function (isEntries) {\n  return function (it) {\n    var O = toIObject(it);\n    var keys = getKeys(O);\n    var length = keys.length;\n    var i = 0;\n    var result = [];\n    var key;\n    while (length > i) if (isEnum.call(O, key = keys[i++])) {\n      result.push(isEntries ? [key, O[key]] : O[key]);\n    } return result;\n  };\n};\n\n\n/***/ }),\n/* 167 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-object-values-entries\nvar $export = __webpack_require__(3);\nvar $entries = __webpack_require__(166)(true);\n\n$export($export.S, 'Object', {\n  entries: function entries(it) {\n    return $entries(it);\n  }\n});\n\n\n/***/ }),\n/* 168 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = __webpack_require__(3);\nvar ownKeys = __webpack_require__(344);\nvar toIObject = __webpack_require__(24);\nvar gOPD = __webpack_require__(67);\nvar createProperty = __webpack_require__(84);\n\n$export($export.S, 'Object', {\n  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n    var O = toIObject(object);\n    var getDesc = gOPD.f;\n    var keys = ownKeys(O);\n    var result = {};\n    var i = 0;\n    var key, desc;\n    while (keys.length > i) {\n      desc = getDesc(O, key = keys[i++]);\n      if (desc !== undefined) createProperty(result, key, desc);\n    }\n    return result;\n  }\n});\n\n\n/***/ }),\n/* 169 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = __webpack_require__(3);\nvar $pad = __webpack_require__(170);\nvar userAgent = __webpack_require__(171);\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n  padStart: function padStart(maxLength /* , fillString = ' ' */) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n  }\n});\n\n\n/***/ }),\n/* 170 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = __webpack_require__(25);\nvar repeat = __webpack_require__(140);\nvar defined = __webpack_require__(38);\n\nmodule.exports = function (that, maxLength, fillString, left) {\n  var S = String(defined(that));\n  var stringLength = S.length;\n  var fillStr = fillString === undefined ? ' ' : String(fillString);\n  var intMaxLength = toLength(maxLength);\n  if (intMaxLength <= stringLength || fillStr == '') return S;\n  var fillLen = intMaxLength - stringLength;\n  var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n  if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n  return left ? stringFiller + S : S + stringFiller;\n};\n\n\n/***/ }),\n/* 171 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n\n\n/***/ }),\n/* 172 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = __webpack_require__(3);\nvar $pad = __webpack_require__(170);\nvar userAgent = __webpack_require__(171);\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n  padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n  }\n});\n\n\n/***/ }),\n/* 173 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\nvar $task = __webpack_require__(80);\n$export($export.G + $export.B, {\n  setImmediate: $task.set,\n  clearImmediate: $task.clear\n});\n\n\n/***/ }),\n/* 174 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $iterators = __webpack_require__(85);\nvar getKeys = __webpack_require__(37);\nvar redefine = __webpack_require__(30);\nvar global = __webpack_require__(14);\nvar hide = __webpack_require__(31);\nvar Iterators = __webpack_require__(51);\nvar wks = __webpack_require__(11);\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n  CSSRuleList: true, // TODO: Not spec compliant, should be false.\n  CSSStyleDeclaration: false,\n  CSSValueList: false,\n  ClientRectList: false,\n  DOMRectList: false,\n  DOMStringList: false,\n  DOMTokenList: true,\n  DataTransferItemList: false,\n  FileList: false,\n  HTMLAllCollection: false,\n  HTMLCollection: false,\n  HTMLFormElement: false,\n  HTMLSelectElement: false,\n  MediaList: true, // TODO: Not spec compliant, should be false.\n  MimeTypeArray: false,\n  NamedNodeMap: false,\n  NodeList: true,\n  PaintRequestList: false,\n  Plugin: false,\n  PluginArray: false,\n  SVGLengthList: false,\n  SVGNumberList: false,\n  SVGPathSegList: false,\n  SVGPointList: false,\n  SVGStringList: false,\n  SVGTransformList: false,\n  SourceBufferList: false,\n  StyleSheetList: true, // TODO: Not spec compliant, should be false.\n  TextTrackCueList: false,\n  TextTrackList: false,\n  TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n  var NAME = collections[i];\n  var explicit = DOMIterables[NAME];\n  var Collection = global[NAME];\n  var proto = Collection && Collection.prototype;\n  var key;\n  if (proto) {\n    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n    Iterators[NAME] = ArrayValues;\n    if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n  }\n}\n\n\n/***/ }),\n/* 175 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar privatePool = new WeakMap();\n\n/**\n * Calculates indexes of columns to render OR columns that are visible.\n * To redo the calculation, you need to create a new calculator.\n *\n * @class ViewportColumnsCalculator\n */\n\nvar ViewportColumnsCalculator = function () {\n  _createClass(ViewportColumnsCalculator, null, [{\n    key: 'DEFAULT_WIDTH',\n\n    /**\n     * Default column width\n     *\n     * @type {Number}\n     */\n    get: function get() {\n      return 50;\n    }\n\n    /**\n     * @param {Number} viewportWidth Width of the viewport\n     * @param {Number} scrollOffset Current horizontal scroll position of the viewport\n     * @param {Number} totalColumns Total number of rows\n     * @param {Function} columnWidthFn Function that returns the width of the column at a given index (in px)\n     * @param {Function} overrideFn Function that changes calculated this.startRow, this.endRow (used by MergeCells plugin)\n     * @param {Boolean} onlyFullyVisible if `true`, only startRow and endRow will be indexes of rows that are fully in viewport\n     * @param {Boolean} stretchH\n     * @param {Function} [stretchingColumnWidthFn] Function that returns the new width of the stretched column.\n     */\n\n  }]);\n\n  function ViewportColumnsCalculator(viewportWidth, scrollOffset, totalColumns, columnWidthFn, overrideFn, onlyFullyVisible, stretchH) {\n    var stretchingColumnWidthFn = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : function (width) {\n      return width;\n    };\n\n    _classCallCheck(this, ViewportColumnsCalculator);\n\n    privatePool.set(this, {\n      viewportWidth: viewportWidth,\n      scrollOffset: scrollOffset,\n      totalColumns: totalColumns,\n      columnWidthFn: columnWidthFn,\n      overrideFn: overrideFn,\n      onlyFullyVisible: onlyFullyVisible,\n      stretchingColumnWidthFn: stretchingColumnWidthFn\n    });\n\n    /**\n     * Number of rendered/visible columns\n     *\n     * @type {Number}\n     */\n    this.count = 0;\n\n    /**\n     * Index of the first rendered/visible column (can be overwritten using overrideFn)\n     *\n     * @type {Number|null}\n     */\n    this.startColumn = null;\n\n    /**\n     * Index of the last rendered/visible column (can be overwritten using overrideFn)\n     *\n     * @type {null}\n     */\n    this.endColumn = null;\n\n    /**\n     * Position of the first rendered/visible column (in px)\n     *\n     * @type {Number|null}\n     */\n    this.startPosition = null;\n\n    this.stretchAllRatio = 0;\n    this.stretchLastWidth = 0;\n    this.stretch = stretchH;\n    this.totalTargetWidth = 0;\n    this.needVerifyLastColumnWidth = true;\n    this.stretchAllColumnsWidth = [];\n\n    this.calculate();\n  }\n\n  /**\n   * Calculates viewport\n   */\n\n\n  _createClass(ViewportColumnsCalculator, [{\n    key: 'calculate',\n    value: function calculate() {\n      var sum = 0;\n      var needReverse = true;\n      var startPositions = [];\n      var columnWidth = void 0;\n\n      var priv = privatePool.get(this);\n      var onlyFullyVisible = priv.onlyFullyVisible;\n      var overrideFn = priv.overrideFn;\n      var scrollOffset = priv.scrollOffset;\n      var totalColumns = priv.totalColumns;\n      var viewportWidth = priv.viewportWidth;\n\n      for (var i = 0; i < totalColumns; i++) {\n        columnWidth = this._getColumnWidth(i);\n\n        if (sum <= scrollOffset && !onlyFullyVisible) {\n          this.startColumn = i;\n        }\n\n        // +1 pixel for row header width compensation for horizontal scroll > 0\n        var compensatedViewportWidth = scrollOffset > 0 ? viewportWidth + 1 : viewportWidth;\n\n        if (sum >= scrollOffset && sum + columnWidth <= scrollOffset + compensatedViewportWidth) {\n          if (this.startColumn == null) {\n            this.startColumn = i;\n          }\n          this.endColumn = i;\n        }\n        startPositions.push(sum);\n        sum += columnWidth;\n\n        if (!onlyFullyVisible) {\n          this.endColumn = i;\n        }\n        if (sum >= scrollOffset + viewportWidth) {\n          needReverse = false;\n          break;\n        }\n      }\n\n      if (this.endColumn === totalColumns - 1 && needReverse) {\n        this.startColumn = this.endColumn;\n\n        while (this.startColumn > 0) {\n          var viewportSum = startPositions[this.endColumn] + columnWidth - startPositions[this.startColumn - 1];\n\n          if (viewportSum <= viewportWidth || !onlyFullyVisible) {\n            this.startColumn--;\n          }\n          if (viewportSum > viewportWidth) {\n            break;\n          }\n        }\n      }\n\n      if (this.startColumn !== null && overrideFn) {\n        overrideFn(this);\n      }\n      this.startPosition = startPositions[this.startColumn];\n\n      if (this.startPosition == void 0) {\n        this.startPosition = null;\n      }\n      if (this.startColumn !== null) {\n        this.count = this.endColumn - this.startColumn + 1;\n      }\n    }\n\n    /**\n     * Recalculate columns stretching.\n     *\n     * @param {Number} totalWidth\n     */\n\n  }, {\n    key: 'refreshStretching',\n    value: function refreshStretching(totalWidth) {\n      if (this.stretch === 'none') {\n        return;\n      }\n      this.totalTargetWidth = totalWidth;\n\n      var priv = privatePool.get(this);\n      var totalColumns = priv.totalColumns;\n      var sumAll = 0;\n\n      for (var i = 0; i < totalColumns; i++) {\n        var columnWidth = this._getColumnWidth(i);\n        var permanentColumnWidth = priv.stretchingColumnWidthFn(void 0, i);\n\n        if (typeof permanentColumnWidth === 'number') {\n          totalWidth -= permanentColumnWidth;\n        } else {\n          sumAll += columnWidth;\n        }\n      }\n      var remainingSize = totalWidth - sumAll;\n\n      if (this.stretch === 'all' && remainingSize > 0) {\n        this.stretchAllRatio = totalWidth / sumAll;\n        this.stretchAllColumnsWidth = [];\n        this.needVerifyLastColumnWidth = true;\n      } else if (this.stretch === 'last' && totalWidth !== Infinity) {\n        var _columnWidth = this._getColumnWidth(totalColumns - 1);\n        var lastColumnWidth = remainingSize + _columnWidth;\n\n        this.stretchLastWidth = lastColumnWidth >= 0 ? lastColumnWidth : _columnWidth;\n      }\n    }\n\n    /**\n     * Get stretched column width based on stretchH (all or last) setting passed in handsontable instance.\n     *\n     * @param {Number} column\n     * @param {Number} baseWidth\n     * @returns {Number|null}\n     */\n\n  }, {\n    key: 'getStretchedColumnWidth',\n    value: function getStretchedColumnWidth(column, baseWidth) {\n      var result = null;\n\n      if (this.stretch === 'all' && this.stretchAllRatio !== 0) {\n        result = this._getStretchedAllColumnWidth(column, baseWidth);\n      } else if (this.stretch === 'last' && this.stretchLastWidth !== 0) {\n        result = this._getStretchedLastColumnWidth(column);\n      }\n\n      return result;\n    }\n\n    /**\n     * @param {Number} column\n     * @param {Number} baseWidth\n     * @returns {Number}\n     * @private\n     */\n\n  }, {\n    key: '_getStretchedAllColumnWidth',\n    value: function _getStretchedAllColumnWidth(column, baseWidth) {\n      var sumRatioWidth = 0;\n      var priv = privatePool.get(this);\n      var totalColumns = priv.totalColumns;\n\n      if (!this.stretchAllColumnsWidth[column]) {\n        var stretchedWidth = Math.round(baseWidth * this.stretchAllRatio);\n        var newStretchedWidth = priv.stretchingColumnWidthFn(stretchedWidth, column);\n\n        if (newStretchedWidth === void 0) {\n          this.stretchAllColumnsWidth[column] = stretchedWidth;\n        } else {\n          this.stretchAllColumnsWidth[column] = isNaN(newStretchedWidth) ? this._getColumnWidth(column) : newStretchedWidth;\n        }\n      }\n\n      if (this.stretchAllColumnsWidth.length === totalColumns && this.needVerifyLastColumnWidth) {\n        this.needVerifyLastColumnWidth = false;\n\n        for (var i = 0; i < this.stretchAllColumnsWidth.length; i++) {\n          sumRatioWidth += this.stretchAllColumnsWidth[i];\n        }\n        if (sumRatioWidth !== this.totalTargetWidth) {\n          this.stretchAllColumnsWidth[this.stretchAllColumnsWidth.length - 1] += this.totalTargetWidth - sumRatioWidth;\n        }\n      }\n\n      return this.stretchAllColumnsWidth[column];\n    }\n\n    /**\n     * @param {Number} column\n     * @returns {Number|null}\n     * @private\n     */\n\n  }, {\n    key: '_getStretchedLastColumnWidth',\n    value: function _getStretchedLastColumnWidth(column) {\n      var priv = privatePool.get(this);\n      var totalColumns = priv.totalColumns;\n\n      if (column === totalColumns - 1) {\n        return this.stretchLastWidth;\n      }\n\n      return null;\n    }\n\n    /**\n     * @param {Number} column Column index.\n     * @returns {Number}\n     * @private\n     */\n\n  }, {\n    key: '_getColumnWidth',\n    value: function _getColumnWidth(column) {\n      var width = privatePool.get(this).columnWidthFn(column);\n\n      if (width === void 0) {\n        width = ViewportColumnsCalculator.DEFAULT_WIDTH;\n      }\n\n      return width;\n    }\n  }]);\n\n  return ViewportColumnsCalculator;\n}();\n\nexports.default = ViewportColumnsCalculator;\n\n/***/ }),\n/* 176 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar privatePool = new WeakMap();\n\n/**\n * Calculates indexes of rows to render OR rows that are visible.\n * To redo the calculation, you need to create a new calculator.\n *\n * @class ViewportRowsCalculator\n */\n\nvar ViewportRowsCalculator = function () {\n  _createClass(ViewportRowsCalculator, null, [{\n    key: \"DEFAULT_HEIGHT\",\n\n    /**\n     * Default row height\n     *\n     * @type {Number}\n     */\n    get: function get() {\n      return 23;\n    }\n\n    /**\n     * @param {Number} viewportHeight Height of the viewport\n     * @param {Number} scrollOffset Current vertical scroll position of the viewport\n     * @param {Number} totalRows Total number of rows\n     * @param {Function} rowHeightFn Function that returns the height of the row at a given index (in px)\n     * @param {Function} overrideFn Function that changes calculated this.startRow, this.endRow (used by MergeCells plugin)\n     * @param {Boolean} onlyFullyVisible if `true`, only startRow and endRow will be indexes of rows that are fully in viewport\n     * @param {Number} horizontalScrollbarHeight\n     */\n\n  }]);\n\n  function ViewportRowsCalculator(viewportHeight, scrollOffset, totalRows, rowHeightFn, overrideFn, onlyFullyVisible, horizontalScrollbarHeight) {\n    _classCallCheck(this, ViewportRowsCalculator);\n\n    privatePool.set(this, {\n      viewportHeight: viewportHeight,\n      scrollOffset: scrollOffset,\n      totalRows: totalRows,\n      rowHeightFn: rowHeightFn,\n      overrideFn: overrideFn,\n      onlyFullyVisible: onlyFullyVisible,\n      horizontalScrollbarHeight: horizontalScrollbarHeight\n    });\n\n    /**\n     * Number of rendered/visible rows\n     *\n     * @type {Number}\n     */\n    this.count = 0;\n\n    /**\n     * Index of the first rendered/visible row (can be overwritten using overrideFn)\n     *\n     * @type {Number|null}\n     */\n    this.startRow = null;\n\n    /**\n     * Index of the last rendered/visible row (can be overwritten using overrideFn)\n     *\n     * @type {null}\n     */\n    this.endRow = null;\n\n    /**\n     * Position of the first rendered/visible row (in px)\n     *\n     * @type {Number|null}\n     */\n    this.startPosition = null;\n\n    this.calculate();\n  }\n\n  /**\n   * Calculates viewport\n   */\n\n\n  _createClass(ViewportRowsCalculator, [{\n    key: \"calculate\",\n    value: function calculate() {\n      var sum = 0;\n      var needReverse = true;\n      var startPositions = [];\n\n      var priv = privatePool.get(this);\n      var onlyFullyVisible = priv.onlyFullyVisible;\n      var overrideFn = priv.overrideFn;\n      var rowHeightFn = priv.rowHeightFn;\n      var scrollOffset = priv.scrollOffset;\n      var totalRows = priv.totalRows;\n      var viewportHeight = priv.viewportHeight;\n      var horizontalScrollbarHeight = priv.horizontalScrollbarHeight || 0;\n      var rowHeight = void 0;\n\n      // Calculate the number (start and end index) of rows needed\n      for (var i = 0; i < totalRows; i++) {\n        rowHeight = rowHeightFn(i);\n\n        if (rowHeight === undefined) {\n          rowHeight = ViewportRowsCalculator.DEFAULT_HEIGHT;\n        }\n        if (sum <= scrollOffset && !onlyFullyVisible) {\n          this.startRow = i;\n        }\n\n        // the row is within the \"visible range\"\n        if (sum >= scrollOffset && sum + rowHeight <= scrollOffset + viewportHeight - horizontalScrollbarHeight) {\n          if (this.startRow === null) {\n            this.startRow = i;\n          }\n          this.endRow = i;\n        }\n        startPositions.push(sum);\n        sum += rowHeight;\n\n        if (!onlyFullyVisible) {\n          this.endRow = i;\n        }\n        if (sum >= scrollOffset + viewportHeight - horizontalScrollbarHeight) {\n          needReverse = false;\n          break;\n        }\n      }\n\n      // If the estimation has reached the last row and there is still some space available in the viewport,\n      // we need to render in reverse in order to fill the whole viewport with rows\n      if (this.endRow === totalRows - 1 && needReverse) {\n        this.startRow = this.endRow;\n\n        while (this.startRow > 0) {\n          // rowHeight is the height of the last row\n          var viewportSum = startPositions[this.endRow] + rowHeight - startPositions[this.startRow - 1];\n\n          if (viewportSum <= viewportHeight - horizontalScrollbarHeight || !onlyFullyVisible) {\n            this.startRow--;\n          }\n          if (viewportSum >= viewportHeight - horizontalScrollbarHeight) {\n            break;\n          }\n        }\n      }\n\n      if (this.startRow !== null && overrideFn) {\n        overrideFn(this);\n      }\n      this.startPosition = startPositions[this.startRow];\n\n      if (this.startPosition == void 0) {\n        this.startPosition = null;\n      }\n      if (this.startRow !== null) {\n        this.count = this.endRow - this.startRow + 1;\n      }\n    }\n  }]);\n\n  return ViewportRowsCalculator;\n}();\n\nexports.default = ViewportRowsCalculator;\n\n/***/ }),\n/* 177 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class ColumnFilter\n */\nvar ColumnFilter = function () {\n  /**\n   * @param {Number} offset\n   * @param {Number} total\n   * @param {Number} countTH\n   */\n  function ColumnFilter(offset, total, countTH) {\n    _classCallCheck(this, ColumnFilter);\n\n    this.offset = offset;\n    this.total = total;\n    this.countTH = countTH;\n  }\n\n  /**\n   * @param index\n   * @returns {Number}\n   */\n\n\n  _createClass(ColumnFilter, [{\n    key: \"offsetted\",\n    value: function offsetted(index) {\n      return index + this.offset;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"unOffsetted\",\n    value: function unOffsetted(index) {\n      return index - this.offset;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"renderedToSource\",\n    value: function renderedToSource(index) {\n      return this.offsetted(index);\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"sourceToRendered\",\n    value: function sourceToRendered(index) {\n      return this.unOffsetted(index);\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"offsettedTH\",\n    value: function offsettedTH(index) {\n      return index - this.countTH;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"unOffsettedTH\",\n    value: function unOffsettedTH(index) {\n      return index + this.countTH;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"visibleRowHeadedColumnToSourceColumn\",\n    value: function visibleRowHeadedColumnToSourceColumn(index) {\n      return this.renderedToSource(this.offsettedTH(index));\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"sourceColumnToVisibleRowHeadedColumn\",\n    value: function sourceColumnToVisibleRowHeadedColumn(index) {\n      return this.unOffsettedTH(this.sourceToRendered(index));\n    }\n  }]);\n\n  return ColumnFilter;\n}();\n\nexports.default = ColumnFilter;\n\n/***/ }),\n/* 178 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class RowFilter\n */\nvar RowFilter = function () {\n  /**\n   * @param {Number} offset\n   * @param {Number} total\n   * @param {Number} countTH\n   */\n  function RowFilter(offset, total, countTH) {\n    _classCallCheck(this, RowFilter);\n\n    this.offset = offset;\n    this.total = total;\n    this.countTH = countTH;\n  }\n\n  /**\n   * @param index\n   * @returns {Number}\n   */\n\n\n  _createClass(RowFilter, [{\n    key: \"offsetted\",\n    value: function offsetted(index) {\n      return index + this.offset;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"unOffsetted\",\n    value: function unOffsetted(index) {\n      return index - this.offset;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"renderedToSource\",\n    value: function renderedToSource(index) {\n      return this.offsetted(index);\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"sourceToRendered\",\n    value: function sourceToRendered(index) {\n      return this.unOffsetted(index);\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"offsettedTH\",\n    value: function offsettedTH(index) {\n      return index - this.countTH;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"unOffsettedTH\",\n    value: function unOffsettedTH(index) {\n      return index + this.countTH;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"visibleColHeadedRowToSourceRow\",\n    value: function visibleColHeadedRowToSourceRow(index) {\n      return this.renderedToSource(this.offsettedTH(index));\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"sourceRowToVisibleColHeadedRow\",\n    value: function sourceRowToVisibleColHeadedRow(index) {\n      return this.unOffsettedTH(this.sourceToRendered(index));\n    }\n  }]);\n\n  return RowFilter;\n}();\n\nexports.default = RowFilter;\n\n/***/ }),\n/* 179 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _string = __webpack_require__(36);\n\nvar _event = __webpack_require__(299);\n\nvar _event2 = _interopRequireDefault(_event);\n\nvar _overlays = __webpack_require__(300);\n\nvar _overlays2 = _interopRequireDefault(_overlays);\n\nvar _scroll = __webpack_require__(301);\n\nvar _scroll2 = _interopRequireDefault(_scroll);\n\nvar _settings = __webpack_require__(302);\n\nvar _settings2 = _interopRequireDefault(_settings);\n\nvar _table = __webpack_require__(303);\n\nvar _table2 = _interopRequireDefault(_table);\n\nvar _viewport = __webpack_require__(305);\n\nvar _viewport2 = _interopRequireDefault(_viewport);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Walkontable\n */\nvar Walkontable = function () {\n  /**\n   * @param {Object} settings\n   */\n  function Walkontable(settings) {\n    _classCallCheck(this, Walkontable);\n\n    var originalHeaders = [];\n\n    // this is the namespace for global events\n    this.guid = 'wt_' + (0, _string.randomString)();\n\n    // bootstrap from settings\n    if (settings.cloneSource) {\n      this.cloneSource = settings.cloneSource;\n      this.cloneOverlay = settings.cloneOverlay;\n      this.wtSettings = settings.cloneSource.wtSettings;\n      this.wtTable = new _table2.default(this, settings.table, settings.wtRootElement);\n      this.wtScroll = new _scroll2.default(this);\n      this.wtViewport = settings.cloneSource.wtViewport;\n      this.wtEvent = new _event2.default(this);\n      this.selections = this.cloneSource.selections;\n    } else {\n      this.wtSettings = new _settings2.default(this, settings);\n      this.wtTable = new _table2.default(this, settings.table);\n      this.wtScroll = new _scroll2.default(this);\n      this.wtViewport = new _viewport2.default(this);\n      this.wtEvent = new _event2.default(this);\n      this.selections = this.getSetting('selections');\n      this.wtOverlays = new _overlays2.default(this);\n      this.exportSettingsAsClassNames();\n    }\n\n    // find original headers\n    if (this.wtTable.THEAD.childNodes.length && this.wtTable.THEAD.childNodes[0].childNodes.length) {\n      for (var c = 0, clen = this.wtTable.THEAD.childNodes[0].childNodes.length; c < clen; c++) {\n        originalHeaders.push(this.wtTable.THEAD.childNodes[0].childNodes[c].innerHTML);\n      }\n      if (!this.getSetting('columnHeaders').length) {\n        this.update('columnHeaders', [function (column, TH) {\n          (0, _element.fastInnerText)(TH, originalHeaders[column]);\n        }]);\n      }\n    }\n    this.drawn = false;\n    this.drawInterrupted = false;\n  }\n\n  /**\n   * Force rerender of Walkontable\n   *\n   * @param {Boolean} [fastDraw=false] When `true`, try to refresh only the positions of borders without rerendering\n   *                                   the data. It will only work if Table.draw() does not force\n   *                                   rendering anyway\n   * @returns {Walkontable}\n   */\n\n\n  _createClass(Walkontable, [{\n    key: 'draw',\n    value: function draw() {\n      var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      this.drawInterrupted = false;\n\n      if (!fastDraw && !(0, _element.isVisible)(this.wtTable.TABLE)) {\n        // draw interrupted because TABLE is not visible\n        this.drawInterrupted = true;\n      } else {\n        this.wtTable.draw(fastDraw);\n      }\n\n      return this;\n    }\n\n    /**\n     * Returns the TD at coords. If topmost is set to true, returns TD from the topmost overlay layer,\n     * if not set or set to false, returns TD from the master table.\n     *\n     * @param {CellCoords} coords\n     * @param {Boolean} [topmost=false]\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'getCell',\n    value: function getCell(coords) {\n      var topmost = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (!topmost) {\n        return this.wtTable.getCell(coords);\n      }\n\n      var totalRows = this.wtSettings.getSetting('totalRows');\n      var fixedRowsTop = this.wtSettings.getSetting('fixedRowsTop');\n      var fixedRowsBottom = this.wtSettings.getSetting('fixedRowsBottom');\n      var fixedColumns = this.wtSettings.getSetting('fixedColumnsLeft');\n\n      if (coords.row < fixedRowsTop && coords.col < fixedColumns) {\n        return this.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell(coords);\n      } else if (coords.row < fixedRowsTop) {\n        return this.wtOverlays.topOverlay.clone.wtTable.getCell(coords);\n      } else if (coords.col < fixedColumns && coords.row >= totalRows - fixedRowsBottom) {\n        if (this.wtOverlays.bottomLeftCornerOverlay && this.wtOverlays.bottomLeftCornerOverlay.clone) {\n          return this.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.getCell(coords);\n        }\n      } else if (coords.col < fixedColumns) {\n        return this.wtOverlays.leftOverlay.clone.wtTable.getCell(coords);\n      } else if (coords.row < totalRows && coords.row > totalRows - fixedRowsBottom) {\n        if (this.wtOverlays.bottomOverlay && this.wtOverlays.bottomOverlay.clone) {\n          return this.wtOverlays.bottomOverlay.clone.wtTable.getCell(coords);\n        }\n      }\n\n      return this.wtTable.getCell(coords);\n    }\n\n    /**\n     * @param {Object} settings\n     * @param {*} value\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'update',\n    value: function update(settings, value) {\n      return this.wtSettings.update(settings, value);\n    }\n\n    /**\n     * Scroll the viewport to a row at the given index in the data source\n     *\n     * @param {Number} row\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'scrollVertical',\n    value: function scrollVertical(row) {\n      this.wtOverlays.topOverlay.scrollTo(row);\n      this.getSetting('onScrollVertically');\n\n      return this;\n    }\n\n    /**\n     * Scroll the viewport to a column at the given index in the data source\n     *\n     * @param {Number} column\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'scrollHorizontal',\n    value: function scrollHorizontal(column) {\n      this.wtOverlays.leftOverlay.scrollTo(column);\n      this.getSetting('onScrollHorizontally');\n\n      return this;\n    }\n\n    /**\n     * Scrolls the viewport to a cell (rerenders if needed)\n     *\n     * @param {CellCoords} coords\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'scrollViewport',\n    value: function scrollViewport(coords) {\n      this.wtScroll.scrollViewport(coords);\n\n      return this;\n    }\n\n    /**\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getViewport',\n    value: function getViewport() {\n      return [this.wtTable.getFirstVisibleRow(), this.wtTable.getFirstVisibleColumn(), this.wtTable.getLastVisibleRow(), this.wtTable.getLastVisibleColumn()];\n    }\n\n    /**\n     * Get overlay name\n     *\n     * @returns {String}\n     */\n\n  }, {\n    key: 'getOverlayName',\n    value: function getOverlayName() {\n      return this.cloneOverlay ? this.cloneOverlay.type : 'master';\n    }\n\n    /**\n     * Check overlay type of this Walkontable instance.\n     *\n     * @param {String} name Clone type @see {Overlay.CLONE_TYPES}.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isOverlayName',\n    value: function isOverlayName(name) {\n      if (this.cloneOverlay) {\n        return this.cloneOverlay.type === name;\n      }\n\n      return false;\n    }\n\n    /**\n     * Export settings as class names added to the parent element of the table.\n     */\n\n  }, {\n    key: 'exportSettingsAsClassNames',\n    value: function exportSettingsAsClassNames() {\n      var _this = this;\n\n      var toExport = {\n        rowHeaders: ['array'],\n        columnHeaders: ['array']\n      };\n      var allClassNames = [];\n      var newClassNames = [];\n\n      (0, _object.objectEach)(toExport, function (optionType, key) {\n        if (optionType.indexOf('array') > -1 && _this.getSetting(key).length) {\n          newClassNames.push('ht' + (0, _string.toUpperCaseFirst)(key));\n        }\n        allClassNames.push('ht' + (0, _string.toUpperCaseFirst)(key));\n      });\n      (0, _element.removeClass)(this.wtTable.wtRootElement.parentNode, allClassNames);\n      (0, _element.addClass)(this.wtTable.wtRootElement.parentNode, newClassNames);\n    }\n\n    /**\n     * Get/Set Walkontable instance setting\n     *\n     * @param {String} key\n     * @param {*} [param1]\n     * @param {*} [param2]\n     * @param {*} [param3]\n     * @param {*} [param4]\n     * @returns {*}\n     */\n\n  }, {\n    key: 'getSetting',\n    value: function getSetting(key, param1, param2, param3, param4) {\n      // this is faster than .apply - https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\n      return this.wtSettings.getSetting(key, param1, param2, param3, param4);\n    }\n\n    /**\n     * Checks if setting exists\n     *\n     * @param {String} key\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasSetting',\n    value: function hasSetting(key) {\n      return this.wtSettings.has(key);\n    }\n\n    /**\n     * Destroy instance\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.wtOverlays.destroy();\n      this.wtEvent.destroy();\n    }\n  }]);\n\n  return Walkontable;\n}();\n\nexports.default = Walkontable;\n\n/***/ }),\n/* 180 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 181 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 182 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 183 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 184 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 185 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 186 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 187 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 188 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 189 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 190 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 191 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 192 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 193 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 194 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 195 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 196 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 197 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 198 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 199 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 200 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 201 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 202 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 203 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 204 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 205 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 206 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 207 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 208 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 209 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 210 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 211 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 212 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 213 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 214 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 215 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 216 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 217 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 218 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 219 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 220 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 221 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 222 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 223 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 224 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 225 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 226 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 227 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 228 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 229 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 230 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 231 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 232 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 233 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 234 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 235 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 236 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 237 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 238 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 239 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 240 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 241 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 242 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 243 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 244 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 245 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 246 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 247 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 248 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 249 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 250 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 251 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 252 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 253 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 254 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 255 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 256 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 257 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 258 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 259 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 260 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 261 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 262 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 263 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 264 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 265 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 266 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 267 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 268 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 269 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 270 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 271 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 272 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 273 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 274 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 275 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 276 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 277 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 278 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 279 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 280 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 281 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 282 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 283 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 284 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 285 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 286 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 287 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 288 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 289 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 290 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 291 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 292 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 293 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 294 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 295 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 296 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 297 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 298 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 299 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _function = __webpack_require__(43);\n\nvar _browser = __webpack_require__(27);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n *\n */\nfunction Event(instance) {\n  var that = this;\n  var eventManager = new _eventManager2.default(instance);\n  var selectedCellBeforeTouchEnd = void 0;\n\n  this.instance = instance;\n\n  var dblClickOrigin = [null, null];\n  this.dblClickTimeout = [null, null];\n\n  var onMouseDown = function onMouseDown(event) {\n    var activeElement = document.activeElement;\n    var getParentNode = (0, _function.partial)(_element.getParent, event.realTarget);\n    var realTarget = event.realTarget;\n\n    // ignore focusable element from mouse down processing (https://github.com/handsontable/handsontable/issues/3555)\n    if (realTarget === activeElement || getParentNode(0) === activeElement || getParentNode(1) === activeElement) {\n      return;\n    }\n\n    var cell = that.parentCell(realTarget);\n\n    if ((0, _element.hasClass)(realTarget, 'corner')) {\n      that.instance.getSetting('onCellCornerMouseDown', event, realTarget);\n    } else if (cell.TD) {\n      if (that.instance.hasSetting('onCellMouseDown')) {\n        that.instance.getSetting('onCellMouseDown', event, cell.coords, cell.TD, that.instance);\n      }\n    }\n\n    if (event.button !== 2) {\n      // if not right mouse button\n      if (cell.TD) {\n        dblClickOrigin[0] = cell.TD;\n        clearTimeout(that.dblClickTimeout[0]);\n        that.dblClickTimeout[0] = setTimeout(function () {\n          dblClickOrigin[0] = null;\n        }, 1000);\n      }\n    }\n  };\n\n  var onTouchMove = function onTouchMove(event) {\n    that.instance.touchMoving = true;\n  };\n\n  var onTouchStart = function onTouchStart(event) {\n    eventManager.addEventListener(this, 'touchmove', onTouchMove);\n\n    // Prevent cell selection when scrolling with touch event - not the best solution performance-wise\n    that.checkIfTouchMove = setTimeout(function () {\n      if (that.instance.touchMoving === true) {\n        that.instance.touchMoving = void 0;\n\n        eventManager.removeEventListener('touchmove', onTouchMove, false);\n      }\n\n      onMouseDown(event);\n    }, 30);\n  };\n\n  var onMouseOver = function onMouseOver(event) {\n    var table, td, mainWOT;\n\n    if (that.instance.hasSetting('onCellMouseOver')) {\n      table = that.instance.wtTable.TABLE;\n      td = (0, _element.closestDown)(event.realTarget, ['TD', 'TH'], table);\n      mainWOT = that.instance.cloneSource || that.instance;\n\n      if (td && td !== mainWOT.lastMouseOver && (0, _element.isChildOf)(td, table)) {\n        mainWOT.lastMouseOver = td;\n\n        that.instance.getSetting('onCellMouseOver', event, that.instance.wtTable.getCoords(td), td, that.instance);\n      }\n    }\n  };\n\n  var onMouseOut = function onMouseOut(event) {\n    var table = void 0;\n    var lastTD = void 0;\n    var nextTD = void 0;\n\n    if (that.instance.hasSetting('onCellMouseOut')) {\n      table = that.instance.wtTable.TABLE;\n      lastTD = (0, _element.closestDown)(event.realTarget, ['TD', 'TH'], table);\n      nextTD = (0, _element.closestDown)(event.relatedTarget, ['TD', 'TH'], table);\n\n      if (lastTD && lastTD !== nextTD && (0, _element.isChildOf)(lastTD, table)) {\n        that.instance.getSetting('onCellMouseOut', event, that.instance.wtTable.getCoords(lastTD), lastTD, that.instance);\n      }\n    }\n  };\n\n  var onMouseUp = function onMouseUp(event) {\n    if (event.button !== 2) {\n      // if not right mouse button\n      var cell = that.parentCell(event.realTarget);\n\n      if (cell.TD === dblClickOrigin[0] && cell.TD === dblClickOrigin[1]) {\n        if ((0, _element.hasClass)(event.realTarget, 'corner')) {\n          that.instance.getSetting('onCellCornerDblClick', event, cell.coords, cell.TD, that.instance);\n        } else {\n          that.instance.getSetting('onCellDblClick', event, cell.coords, cell.TD, that.instance);\n        }\n\n        dblClickOrigin[0] = null;\n        dblClickOrigin[1] = null;\n      } else if (cell.TD === dblClickOrigin[0]) {\n        that.instance.getSetting('onCellMouseUp', event, cell.coords, cell.TD, that.instance);\n\n        dblClickOrigin[1] = cell.TD;\n        clearTimeout(that.dblClickTimeout[1]);\n        that.dblClickTimeout[1] = setTimeout(function () {\n          dblClickOrigin[1] = null;\n        }, 500);\n      } else if (cell.TD && that.instance.hasSetting('onCellMouseUp')) {\n        that.instance.getSetting('onCellMouseUp', event, cell.coords, cell.TD, that.instance);\n      }\n    }\n  };\n\n  var selectedCellWasTouched = function selectedCellWasTouched(touchTarget) {\n    var cellUnderFinger = that.parentCell(touchTarget);\n    var coordsOfCellUnderFinger = cellUnderFinger.coords;\n\n    if (selectedCellBeforeTouchEnd && coordsOfCellUnderFinger) {\n      var _ref = [coordsOfCellUnderFinger.row, selectedCellBeforeTouchEnd.from.row],\n          rowTouched = _ref[0],\n          rowSelected = _ref[1];\n      var _ref2 = [coordsOfCellUnderFinger.col, selectedCellBeforeTouchEnd.from.col],\n          colTouched = _ref2[0],\n          colSelected = _ref2[1];\n\n\n      return rowTouched === rowSelected && colTouched === colSelected;\n    }\n\n    return false;\n  };\n\n  var onTouchEnd = function onTouchEnd(event) {\n    var excludeTags = ['A', 'BUTTON', 'INPUT'];\n    var target = event.target;\n\n    // touched link which was placed inside a cell (a cell with DOM `a` element) WILL NOT trigger the below function calls\n    // and as consequence will behave as standard (open the link).\n    if (selectedCellWasTouched(target) === false || excludeTags.includes(target.tagName) === false) {\n      event.preventDefault();\n      onMouseUp(event);\n    }\n  };\n\n  eventManager.addEventListener(this.instance.wtTable.holder, 'mousedown', onMouseDown);\n  eventManager.addEventListener(this.instance.wtTable.TABLE, 'mouseover', onMouseOver);\n  eventManager.addEventListener(this.instance.wtTable.TABLE, 'mouseout', onMouseOut);\n  eventManager.addEventListener(this.instance.wtTable.holder, 'mouseup', onMouseUp);\n\n  // check if full HOT instance, or detached WOT AND run on mobile device\n  if (this.instance.wtTable.holder.parentNode.parentNode && (0, _browser.isMobileBrowser)() && !that.instance.wtTable.isWorkingOnClone()) {\n    var classSelector = '.' + this.instance.wtTable.holder.parentNode.className.split(' ').join('.');\n\n    eventManager.addEventListener(this.instance.wtTable.holder, 'touchstart', function (event) {\n      selectedCellBeforeTouchEnd = instance.selections.getCell().cellRange;\n\n      that.instance.touchApplied = true;\n      if ((0, _element.isChildOf)(event.target, classSelector)) {\n        onTouchStart.call(event.target, event);\n      }\n    });\n    eventManager.addEventListener(this.instance.wtTable.holder, 'touchend', function (event) {\n      that.instance.touchApplied = false;\n      if ((0, _element.isChildOf)(event.target, classSelector)) {\n        onTouchEnd.call(event.target, event);\n      }\n    });\n\n    if (!that.instance.momentumScrolling) {\n      that.instance.momentumScrolling = {};\n    }\n    eventManager.addEventListener(this.instance.wtTable.holder, 'scroll', function (event) {\n      clearTimeout(that.instance.momentumScrolling._timeout);\n\n      if (!that.instance.momentumScrolling.ongoing) {\n        that.instance.getSetting('onBeforeTouchScroll');\n      }\n      that.instance.momentumScrolling.ongoing = true;\n\n      that.instance.momentumScrolling._timeout = setTimeout(function () {\n        if (!that.instance.touchApplied) {\n          that.instance.momentumScrolling.ongoing = false;\n\n          that.instance.getSetting('onAfterMomentumScroll');\n        }\n      }, 200);\n    });\n  }\n\n  eventManager.addEventListener(window, 'resize', function () {\n    if (that.instance.getSetting('stretchH') !== 'none') {\n      that.instance.draw();\n    }\n  });\n\n  this.destroy = function () {\n    clearTimeout(this.dblClickTimeout[0]);\n    clearTimeout(this.dblClickTimeout[1]);\n\n    eventManager.destroy();\n  };\n}\n\nEvent.prototype.parentCell = function (elem) {\n  var cell = {};\n  var TABLE = this.instance.wtTable.TABLE;\n  var TD = (0, _element.closestDown)(elem, ['TD', 'TH'], TABLE);\n\n  if (TD) {\n    cell.coords = this.instance.wtTable.getCoords(TD);\n    cell.TD = TD;\n  } else if ((0, _element.hasClass)(elem, 'wtBorder') && (0, _element.hasClass)(elem, 'current')) {\n    cell.coords = this.instance.selections.getCell().cellRange.highlight;\n    cell.TD = this.instance.wtTable.getCell(cell.coords);\n  } else if ((0, _element.hasClass)(elem, 'wtBorder') && (0, _element.hasClass)(elem, 'area')) {\n    if (this.instance.selections.createOrGetArea().cellRange) {\n      cell.coords = this.instance.selections.createOrGetArea().cellRange.to;\n      cell.TD = this.instance.wtTable.getCell(cell.coords);\n    }\n  }\n\n  return cell;\n};\n\nexports.default = Event;\n\n/***/ }),\n/* 300 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _unicode = __webpack_require__(21);\n\nvar _browser = __webpack_require__(27);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Overlays\n */\nvar Overlays = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function Overlays(wotInstance) {\n    _classCallCheck(this, Overlays);\n\n    /**\n     * Sometimes `line-height` might be set to 'normal'. In that case, a default `font-size` should be multiplied by roughly 1.2.\n     * https://developer.mozilla.org/pl/docs/Web/CSS/line-height#Values\n     */\n    var BODY_LINE_HEIGHT = parseInt(getComputedStyle(document.body).lineHeight, 10);\n    var FALLBACK_BODY_LINE_HEIGHT = parseInt(getComputedStyle(document.body).fontSize, 10) * 1.2;\n\n    this.wot = wotInstance;\n\n    // legacy support\n    this.instance = this.wot;\n    this.eventManager = new _eventManager2.default(this.wot);\n\n    this.wot.update('scrollbarWidth', (0, _element.getScrollbarWidth)());\n    this.wot.update('scrollbarHeight', (0, _element.getScrollbarWidth)());\n\n    this.scrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);\n\n    this.prepareOverlays();\n\n    this.destroyed = false;\n    this.keyPressed = false;\n    this.spreaderLastSize = {\n      width: null,\n      height: null\n    };\n    this.overlayScrollPositions = {\n      master: {\n        top: 0,\n        left: 0\n      },\n      top: {\n        top: null,\n        left: 0\n      },\n      bottom: {\n        top: null,\n        left: 0\n      },\n      left: {\n        top: 0,\n        left: null\n      }\n    };\n\n    this.pendingScrollCallbacks = {\n      master: {\n        top: 0,\n        left: 0\n      },\n      top: {\n        left: 0\n      },\n      bottom: {\n        left: 0\n      },\n      left: {\n        top: 0\n      }\n    };\n\n    this.verticalScrolling = false;\n    this.horizontalScrolling = false;\n    this.delegatedScrollCallback = false;\n\n    this.registeredListeners = [];\n\n    this.browserLineHeight = BODY_LINE_HEIGHT || FALLBACK_BODY_LINE_HEIGHT;\n\n    this.registerListeners();\n  }\n\n  /**\n   * Prepare overlays based on user settings.\n   *\n   * @returns {Boolean} Returns `true` if changes applied to overlay needs scroll synchronization.\n   */\n\n\n  _createClass(Overlays, [{\n    key: 'prepareOverlays',\n    value: function prepareOverlays() {\n      var syncScroll = false;\n\n      if (this.topOverlay) {\n        syncScroll = this.topOverlay.updateStateOfRendering() || syncScroll;\n      } else {\n        this.topOverlay = _base2.default.createOverlay(_base2.default.CLONE_TOP, this.wot);\n      }\n\n      if (!_base2.default.hasOverlay(_base2.default.CLONE_BOTTOM)) {\n        this.bottomOverlay = {\n          needFullRender: false,\n          updateStateOfRendering: function updateStateOfRendering() {\n            return false;\n          }\n        };\n      }\n      if (!_base2.default.hasOverlay(_base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n        this.bottomLeftCornerOverlay = {\n          needFullRender: false,\n          updateStateOfRendering: function updateStateOfRendering() {\n            return false;\n          }\n        };\n      }\n\n      if (this.bottomOverlay) {\n        syncScroll = this.bottomOverlay.updateStateOfRendering() || syncScroll;\n      } else {\n        this.bottomOverlay = _base2.default.createOverlay(_base2.default.CLONE_BOTTOM, this.wot);\n      }\n\n      if (this.leftOverlay) {\n        syncScroll = this.leftOverlay.updateStateOfRendering() || syncScroll;\n      } else {\n        this.leftOverlay = _base2.default.createOverlay(_base2.default.CLONE_LEFT, this.wot);\n      }\n\n      if (this.topOverlay.needFullRender && this.leftOverlay.needFullRender) {\n        if (this.topLeftCornerOverlay) {\n          syncScroll = this.topLeftCornerOverlay.updateStateOfRendering() || syncScroll;\n        } else {\n          this.topLeftCornerOverlay = _base2.default.createOverlay(_base2.default.CLONE_TOP_LEFT_CORNER, this.wot);\n        }\n      }\n\n      if (this.bottomOverlay.needFullRender && this.leftOverlay.needFullRender) {\n        if (this.bottomLeftCornerOverlay) {\n          syncScroll = this.bottomLeftCornerOverlay.updateStateOfRendering() || syncScroll;\n        } else {\n          this.bottomLeftCornerOverlay = _base2.default.createOverlay(_base2.default.CLONE_BOTTOM_LEFT_CORNER, this.wot);\n        }\n      }\n\n      if (this.wot.getSetting('debug') && !this.debug) {\n        this.debug = _base2.default.createOverlay(_base2.default.CLONE_DEBUG, this.wot);\n      }\n\n      return syncScroll;\n    }\n\n    /**\n     * Refresh and redraw table\n     */\n\n  }, {\n    key: 'refreshAll',\n    value: function refreshAll() {\n      if (!this.wot.drawn) {\n        return;\n      }\n      if (!this.wot.wtTable.holder.parentNode) {\n        // Walkontable was detached from DOM, but this handler was not removed\n        this.destroy();\n\n        return;\n      }\n      this.wot.draw(true);\n\n      if (this.verticalScrolling) {\n        this.leftOverlay.onScroll();\n      }\n\n      if (this.horizontalScrolling) {\n        this.topOverlay.onScroll();\n      }\n\n      this.verticalScrolling = false;\n      this.horizontalScrolling = false;\n    }\n\n    /**\n     * Register all necessary event listeners.\n     */\n\n  }, {\n    key: 'registerListeners',\n    value: function registerListeners() {\n      var _this = this;\n\n      var topOverlayScrollable = this.topOverlay.mainTableScrollableElement;\n      var leftOverlayScrollable = this.leftOverlay.mainTableScrollableElement;\n\n      var listenersToRegister = [];\n      listenersToRegister.push([document.documentElement, 'keydown', function (event) {\n        return _this.onKeyDown(event);\n      }]);\n      listenersToRegister.push([document.documentElement, 'keyup', function () {\n        return _this.onKeyUp();\n      }]);\n      listenersToRegister.push([document, 'visibilitychange', function () {\n        return _this.onKeyUp();\n      }]);\n      listenersToRegister.push([topOverlayScrollable, 'scroll', function (event) {\n        return _this.onTableScroll(event);\n      }]);\n\n      if (topOverlayScrollable !== leftOverlayScrollable) {\n        listenersToRegister.push([leftOverlayScrollable, 'scroll', function (event) {\n          return _this.onTableScroll(event);\n        }]);\n      }\n\n      var isHighPixelRatio = window.devicePixelRatio && window.devicePixelRatio > 1;\n\n      if (isHighPixelRatio || !(0, _browser.isChrome)()) {\n        listenersToRegister.push([this.instance.wtTable.wtRootElement.parentNode, 'wheel', function (event) {\n          return _this.onCloneWheel(event);\n        }]);\n      } else {\n        if (this.topOverlay.needFullRender) {\n          listenersToRegister.push([this.topOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n\n        if (this.bottomOverlay.needFullRender) {\n          listenersToRegister.push([this.bottomOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n\n        if (this.leftOverlay.needFullRender) {\n          listenersToRegister.push([this.leftOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n\n        if (this.topLeftCornerOverlay && this.topLeftCornerOverlay.needFullRender) {\n          listenersToRegister.push([this.topLeftCornerOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n\n        if (this.bottomLeftCornerOverlay && this.bottomLeftCornerOverlay.needFullRender) {\n          listenersToRegister.push([this.bottomLeftCornerOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n      }\n\n      if (this.topOverlay.trimmingContainer !== window && this.leftOverlay.trimmingContainer !== window) {\n        // This is necessary?\n        // eventManager.addEventListener(window, 'scroll', (event) => this.refreshAll(event));\n        listenersToRegister.push([window, 'wheel', function (event) {\n          var overlay = void 0;\n          var deltaY = event.wheelDeltaY || event.deltaY;\n          var deltaX = event.wheelDeltaX || event.deltaX;\n\n          if (_this.topOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'top';\n          } else if (_this.bottomOverlay.clone && _this.bottomOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'bottom';\n          } else if (_this.leftOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'left';\n          } else if (_this.topLeftCornerOverlay && _this.topLeftCornerOverlay.clone && _this.topLeftCornerOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'topLeft';\n          } else if (_this.bottomLeftCornerOverlay && _this.bottomLeftCornerOverlay.clone && _this.bottomLeftCornerOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'bottomLeft';\n          }\n\n          if (overlay === 'top' && deltaY !== 0 || overlay === 'left' && deltaX !== 0 || overlay === 'bottom' && deltaY !== 0 || (overlay === 'topLeft' || overlay === 'bottomLeft') && (deltaY !== 0 || deltaX !== 0)) {\n\n            event.preventDefault();\n          }\n        }]);\n      }\n\n      while (listenersToRegister.length) {\n        var listener = listenersToRegister.pop();\n        this.eventManager.addEventListener(listener[0], listener[1], listener[2]);\n\n        this.registeredListeners.push(listener);\n      }\n    }\n\n    /**\n     * Deregister all previously registered listeners.\n     */\n\n  }, {\n    key: 'deregisterListeners',\n    value: function deregisterListeners() {\n      while (this.registeredListeners.length) {\n        var listener = this.registeredListeners.pop();\n        this.eventManager.removeEventListener(listener[0], listener[1], listener[2]);\n      }\n    }\n\n    /**\n     * Scroll listener\n     *\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onTableScroll',\n    value: function onTableScroll(event) {\n      // There was if statement which controlled flow of this function. It avoided the execution of the next lines\n      // on mobile devices. It was changed. Broader description of this case is included within issue #4856.\n\n      var masterHorizontal = this.leftOverlay.mainTableScrollableElement;\n      var masterVertical = this.topOverlay.mainTableScrollableElement;\n      var target = event.target;\n\n      // For key press, sync only master -> overlay position because while pressing Walkontable.render is triggered\n      // by hot.refreshBorder\n      if (this.keyPressed) {\n        if (masterVertical !== window && target !== window && !event.target.contains(masterVertical) || masterHorizontal !== window && target !== window && !event.target.contains(masterHorizontal)) {\n          return;\n        }\n      }\n\n      this.syncScrollPositions(event);\n    }\n\n    /**\n     * Wheel listener for cloned overlays.\n     *\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onCloneWheel',\n    value: function onCloneWheel(event) {\n      if (this.scrollableElement !== window) {\n        event.preventDefault();\n      }\n      // There was if statement which controlled flow of this function. It avoided the execution of the next lines\n      // on mobile devices. It was changed. Broader description of this case is included within issue #4856.\n\n      var masterHorizontal = this.leftOverlay.mainTableScrollableElement;\n      var masterVertical = this.topOverlay.mainTableScrollableElement;\n      var target = event.target;\n\n      // For key press, sync only master -> overlay position because while pressing Walkontable.render is triggered\n      // by hot.refreshBorder\n      var shouldNotWheelVertically = masterVertical !== window && target !== window && !event.target.contains(masterVertical);\n      var shouldNotWheelHorizontally = masterHorizontal !== window && target !== window && !event.target.contains(masterHorizontal);\n\n      if (this.keyPressed && (shouldNotWheelVertically || shouldNotWheelHorizontally)) {\n        return;\n      }\n\n      this.translateMouseWheelToScroll(event);\n    }\n\n    /**\n     * Key down listener\n     */\n\n  }, {\n    key: 'onKeyDown',\n    value: function onKeyDown(event) {\n      this.keyPressed = (0, _unicode.isKey)(event.keyCode, 'ARROW_UP|ARROW_RIGHT|ARROW_DOWN|ARROW_LEFT');\n    }\n\n    /**\n     * Key up listener\n     */\n\n  }, {\n    key: 'onKeyUp',\n    value: function onKeyUp() {\n      this.keyPressed = false;\n    }\n\n    /**\n     * Translate wheel event into scroll event and sync scroll overlays position\n     *\n     * @private\n     * @param {Event} event\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'translateMouseWheelToScroll',\n    value: function translateMouseWheelToScroll(event) {\n      var deltaY = isNaN(event.deltaY) ? -1 * event.wheelDeltaY : event.deltaY;\n      var deltaX = isNaN(event.deltaX) ? -1 * event.wheelDeltaX : event.deltaX;\n\n      if (event.deltaMode === 1) {\n        deltaX += deltaX * this.browserLineHeight;\n        deltaY += deltaY * this.browserLineHeight;\n      }\n\n      this.scrollVertically(deltaY);\n      this.scrollHorizontally(deltaX);\n\n      return false;\n    }\n  }, {\n    key: 'scrollVertically',\n    value: function scrollVertically(distance) {\n      if (distance === 0) {\n        return 0;\n      }\n      this.scrollableElement.scrollTop += distance;\n    }\n  }, {\n    key: 'scrollHorizontally',\n    value: function scrollHorizontally(distance) {\n      if (distance === 0) {\n        return 0;\n      }\n      this.scrollableElement.scrollLeft += distance;\n    }\n\n    /**\n     * Synchronize scroll position between master table and overlay table.\n     *\n     * @private\n     * @param {Event|Object} event\n     */\n\n  }, {\n    key: 'syncScrollPositions',\n    value: function syncScrollPositions(event) {\n      if (this.destroyed) {\n        return;\n      }\n\n      var topHolder = this.topOverlay.clone.wtTable.holder;\n      var leftHolder = this.leftOverlay.clone.wtTable.holder;\n\n      var _ref = [this.scrollableElement.scrollLeft, this.scrollableElement.scrollTop],\n          scrollLeft = _ref[0],\n          scrollTop = _ref[1];\n\n\n      this.horizontalScrolling = topHolder.scrollLeft !== scrollLeft;\n      this.verticalScrolling = leftHolder.scrollTop !== scrollTop;\n\n      if (this.horizontalScrolling) {\n        topHolder.scrollLeft = scrollLeft;\n      }\n\n      if (this.verticalScrolling) {\n        leftHolder.scrollTop = scrollTop;\n\n        if (this.bottomOverlay.needFullRender) {\n          this.bottomOverlay.clone.wtTable.holder.scrollLeft = scrollLeft;\n        }\n      }\n\n      this.refreshAll();\n    }\n\n    /**\n     * Synchronize overlay scrollbars with the master scrollbar\n     */\n\n  }, {\n    key: 'syncScrollWithMaster',\n    value: function syncScrollWithMaster() {\n      var master = this.topOverlay.mainTableScrollableElement;\n      var scrollLeft = master.scrollLeft,\n          scrollTop = master.scrollTop;\n\n\n      if (this.topOverlay.needFullRender) {\n        this.topOverlay.clone.wtTable.holder.scrollLeft = scrollLeft;\n      }\n      if (this.bottomOverlay.needFullRender) {\n        this.bottomOverlay.clone.wtTable.holder.scrollLeft = scrollLeft;\n      }\n      if (this.leftOverlay.needFullRender) {\n        this.leftOverlay.clone.wtTable.holder.scrollTop = scrollTop;\n      }\n    }\n\n    /**\n     * Update the main scrollable elements for all the overlays.\n     */\n\n  }, {\n    key: 'updateMainScrollableElements',\n    value: function updateMainScrollableElements() {\n      this.deregisterListeners();\n\n      this.leftOverlay.updateMainScrollableElement();\n      this.topOverlay.updateMainScrollableElement();\n\n      if (this.bottomOverlay.needFullRender) {\n        this.bottomOverlay.updateMainScrollableElement();\n      }\n\n      this.scrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);\n\n      this.registerListeners();\n    }\n\n    /**\n     *\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.eventManager.destroy();\n      this.topOverlay.destroy();\n\n      if (this.bottomOverlay.clone) {\n        this.bottomOverlay.destroy();\n      }\n      this.leftOverlay.destroy();\n\n      if (this.topLeftCornerOverlay) {\n        this.topLeftCornerOverlay.destroy();\n      }\n\n      if (this.bottomLeftCornerOverlay && this.bottomLeftCornerOverlay.clone) {\n        this.bottomLeftCornerOverlay.destroy();\n      }\n\n      if (this.debug) {\n        this.debug.destroy();\n      }\n      this.destroyed = true;\n    }\n\n    /**\n     * @param {Boolean} [fastDraw=false]\n     */\n\n  }, {\n    key: 'refresh',\n    value: function refresh() {\n      var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (this.topOverlay.areElementSizesAdjusted && this.leftOverlay.areElementSizesAdjusted) {\n        var container = this.wot.wtTable.wtRootElement.parentNode || this.wot.wtTable.wtRootElement;\n        var width = container.clientWidth;\n        var height = container.clientHeight;\n\n        if (width !== this.spreaderLastSize.width || height !== this.spreaderLastSize.height) {\n          this.spreaderLastSize.width = width;\n          this.spreaderLastSize.height = height;\n          this.adjustElementsSize();\n        }\n      }\n\n      if (this.bottomOverlay.clone) {\n        this.bottomOverlay.refresh(fastDraw);\n      }\n\n      this.leftOverlay.refresh(fastDraw);\n      this.topOverlay.refresh(fastDraw);\n\n      if (this.topLeftCornerOverlay) {\n        this.topLeftCornerOverlay.refresh(fastDraw);\n      }\n\n      if (this.bottomLeftCornerOverlay && this.bottomLeftCornerOverlay.clone) {\n        this.bottomLeftCornerOverlay.refresh(fastDraw);\n      }\n\n      if (this.debug) {\n        this.debug.refresh(fastDraw);\n      }\n    }\n\n    /**\n     * Adjust overlays elements size and master table size\n     *\n     * @param {Boolean} [force=false]\n     */\n\n  }, {\n    key: 'adjustElementsSize',\n    value: function adjustElementsSize() {\n      var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      var totalColumns = this.wot.getSetting('totalColumns');\n      var totalRows = this.wot.getSetting('totalRows');\n      var headerRowSize = this.wot.wtViewport.getRowHeaderWidth();\n      var headerColumnSize = this.wot.wtViewport.getColumnHeaderHeight();\n      var hiderStyle = this.wot.wtTable.hider.style;\n\n      hiderStyle.width = headerRowSize + this.leftOverlay.sumCellSizes(0, totalColumns) + 'px';\n      hiderStyle.height = headerColumnSize + this.topOverlay.sumCellSizes(0, totalRows) + 1 + 'px';\n\n      this.topOverlay.adjustElementsSize(force);\n      this.leftOverlay.adjustElementsSize(force);\n\n      if (this.bottomOverlay.clone) {\n        this.bottomOverlay.adjustElementsSize(force);\n      }\n    }\n\n    /**\n     *\n     */\n\n  }, {\n    key: 'applyToDOM',\n    value: function applyToDOM() {\n      if (!this.topOverlay.areElementSizesAdjusted || !this.leftOverlay.areElementSizesAdjusted) {\n        this.adjustElementsSize();\n      }\n      this.topOverlay.applyToDOM();\n\n      if (this.bottomOverlay.clone) {\n        this.bottomOverlay.applyToDOM();\n      }\n\n      this.leftOverlay.applyToDOM();\n    }\n\n    /**\n     * Get the parent overlay of the provided element.\n     *\n     * @param {HTMLElement} element\n     * @returns {Object|null}\n     */\n\n  }, {\n    key: 'getParentOverlay',\n    value: function getParentOverlay(element) {\n      if (!element) {\n        return null;\n      }\n\n      var overlays = [this.topOverlay, this.leftOverlay, this.bottomOverlay, this.topLeftCornerOverlay, this.bottomLeftCornerOverlay];\n      var result = null;\n\n      (0, _array.arrayEach)(overlays, function (elem, i) {\n        if (!elem) {\n          return;\n        }\n\n        if (elem.clone && elem.clone.wtTable.TABLE.contains(element)) {\n          result = elem.clone;\n        }\n      });\n\n      return result;\n    }\n  }]);\n\n  return Overlays;\n}();\n\nexports.default = Overlays;\n\n/***/ }),\n/* 301 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _number = __webpack_require__(5);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Scroll\n */\nvar Scroll = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function Scroll(wotInstance) {\n    _classCallCheck(this, Scroll);\n\n    this.wot = wotInstance;\n\n    // legacy support\n    this.instance = wotInstance;\n  }\n\n  /**\n   * Scrolls viewport to a cell by minimum number of cells\n   *\n   * @param {CellCoords} coords\n   */\n\n\n  _createClass(Scroll, [{\n    key: 'scrollViewport',\n    value: function scrollViewport(coords) {\n      if (!this.wot.drawn) {\n        return;\n      }\n\n      var _getVariables2 = this._getVariables(),\n          topOverlay = _getVariables2.topOverlay,\n          leftOverlay = _getVariables2.leftOverlay,\n          totalRows = _getVariables2.totalRows,\n          totalColumns = _getVariables2.totalColumns,\n          fixedRowsTop = _getVariables2.fixedRowsTop,\n          fixedRowsBottom = _getVariables2.fixedRowsBottom,\n          fixedColumnsLeft = _getVariables2.fixedColumnsLeft;\n\n      if (coords.row < 0 || coords.row > Math.max(totalRows - 1, 0)) {\n        throw new Error('row ' + coords.row + ' does not exist');\n      }\n\n      if (coords.col < 0 || coords.col > Math.max(totalColumns - 1, 0)) {\n        throw new Error('column ' + coords.col + ' does not exist');\n      }\n\n      if (coords.row >= fixedRowsTop && coords.row < this.getFirstVisibleRow()) {\n        topOverlay.scrollTo(coords.row);\n      } else if (coords.row > this.getLastVisibleRow() && coords.row < totalRows - fixedRowsBottom) {\n        topOverlay.scrollTo(coords.row, true);\n      }\n\n      if (coords.col >= fixedColumnsLeft && coords.col < this.getFirstVisibleColumn()) {\n        leftOverlay.scrollTo(coords.col);\n      } else if (coords.col > this.getLastVisibleColumn()) {\n        leftOverlay.scrollTo(coords.col, true);\n      }\n    }\n\n    /**\n     * Get first visible row based on virtual dom and how table is visible in browser window viewport.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getFirstVisibleRow',\n    value: function getFirstVisibleRow() {\n      var _getVariables3 = this._getVariables(),\n          topOverlay = _getVariables3.topOverlay,\n          wtTable = _getVariables3.wtTable,\n          wtViewport = _getVariables3.wtViewport,\n          totalRows = _getVariables3.totalRows,\n          fixedRowsTop = _getVariables3.fixedRowsTop;\n\n      var firstVisibleRow = wtTable.getFirstVisibleRow();\n\n      if (topOverlay.mainTableScrollableElement === window) {\n        var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);\n        var totalTableHeight = (0, _element.innerHeight)(wtTable.hider);\n        var windowHeight = (0, _element.innerHeight)(window);\n        var windowScrollTop = (0, _element.getScrollTop)(window);\n\n        // Only calculate firstVisibleRow when table didn't filled (from up) whole viewport space\n        if (rootElementOffset.top + totalTableHeight - windowHeight <= windowScrollTop) {\n          var rowsHeight = wtViewport.getColumnHeaderHeight();\n\n          rowsHeight += topOverlay.sumCellSizes(0, fixedRowsTop);\n\n          (0, _number.rangeEachReverse)(totalRows, 1, function (row) {\n            rowsHeight += topOverlay.sumCellSizes(row - 1, row);\n\n            if (rootElementOffset.top + totalTableHeight - rowsHeight <= windowScrollTop) {\n              // Return physical row + 1\n              firstVisibleRow = row;\n\n              return false;\n            }\n          });\n        }\n      }\n\n      return firstVisibleRow;\n    }\n\n    /**\n     * Get last visible row based on virtual dom and how table is visible in browser window viewport.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getLastVisibleRow',\n    value: function getLastVisibleRow() {\n      var _getVariables4 = this._getVariables(),\n          topOverlay = _getVariables4.topOverlay,\n          wtTable = _getVariables4.wtTable,\n          wtViewport = _getVariables4.wtViewport,\n          totalRows = _getVariables4.totalRows;\n\n      var lastVisibleRow = wtTable.getLastVisibleRow();\n\n      if (topOverlay.mainTableScrollableElement === window) {\n        var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);\n        var windowHeight = (0, _element.innerHeight)(window);\n        var windowScrollTop = (0, _element.getScrollTop)(window);\n\n        // Only calculate lastVisibleRow when table didn't filled (from bottom) whole viewport space\n        if (rootElementOffset.top > windowScrollTop) {\n          var rowsHeight = wtViewport.getColumnHeaderHeight();\n\n          (0, _number.rangeEach)(1, totalRows, function (row) {\n            rowsHeight += topOverlay.sumCellSizes(row - 1, row);\n\n            if (rootElementOffset.top + rowsHeight - windowScrollTop >= windowHeight) {\n              // Return physical row - 1 (-2 because rangeEach gives row index + 1 - sumCellSizes requirements)\n              lastVisibleRow = row - 2;\n\n              return false;\n            }\n          });\n        }\n      }\n\n      return lastVisibleRow;\n    }\n\n    /**\n     * Get first visible column based on virtual dom and how table is visible in browser window viewport.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getFirstVisibleColumn',\n    value: function getFirstVisibleColumn() {\n      var _getVariables5 = this._getVariables(),\n          leftOverlay = _getVariables5.leftOverlay,\n          wtTable = _getVariables5.wtTable,\n          wtViewport = _getVariables5.wtViewport,\n          totalColumns = _getVariables5.totalColumns,\n          fixedColumnsLeft = _getVariables5.fixedColumnsLeft;\n\n      var firstVisibleColumn = wtTable.getFirstVisibleColumn();\n\n      if (leftOverlay.mainTableScrollableElement === window) {\n        var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);\n        var totalTableWidth = (0, _element.innerWidth)(wtTable.hider);\n        var windowWidth = (0, _element.innerWidth)(window);\n        var windowScrollLeft = (0, _element.getScrollLeft)(window);\n\n        // Only calculate firstVisibleColumn when table didn't filled (from left) whole viewport space\n        if (rootElementOffset.left + totalTableWidth - windowWidth <= windowScrollLeft) {\n          var columnsWidth = wtViewport.getRowHeaderWidth();\n\n          (0, _number.rangeEachReverse)(totalColumns, 1, function (column) {\n            columnsWidth += leftOverlay.sumCellSizes(column - 1, column);\n\n            if (rootElementOffset.left + totalTableWidth - columnsWidth <= windowScrollLeft) {\n              // Return physical column + 1\n              firstVisibleColumn = column;\n\n              return false;\n            }\n          });\n        }\n      }\n\n      return firstVisibleColumn;\n    }\n\n    /**\n     * Get last visible column based on virtual dom and how table is visible in browser window viewport.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getLastVisibleColumn',\n    value: function getLastVisibleColumn() {\n      var _getVariables6 = this._getVariables(),\n          leftOverlay = _getVariables6.leftOverlay,\n          wtTable = _getVariables6.wtTable,\n          wtViewport = _getVariables6.wtViewport,\n          totalColumns = _getVariables6.totalColumns;\n\n      var lastVisibleColumn = wtTable.getLastVisibleColumn();\n\n      if (leftOverlay.mainTableScrollableElement === window) {\n        var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);\n        var windowWidth = (0, _element.innerWidth)(window);\n        var windowScrollLeft = (0, _element.getScrollLeft)(window);\n\n        // Only calculate lastVisibleColumn when table didn't filled (from right) whole viewport space\n        if (rootElementOffset.left > windowScrollLeft) {\n          var columnsWidth = wtViewport.getRowHeaderWidth();\n\n          (0, _number.rangeEach)(1, totalColumns, function (column) {\n            columnsWidth += leftOverlay.sumCellSizes(column - 1, column);\n\n            if (rootElementOffset.left + columnsWidth - windowScrollLeft >= windowWidth) {\n              // Return physical column - 1 (-2 because rangeEach gives column index + 1 - sumCellSizes requirements)\n              lastVisibleColumn = column - 2;\n\n              return false;\n            }\n          });\n        }\n      }\n\n      return lastVisibleColumn;\n    }\n\n    /**\n     * Returns collection of variables used to rows and columns visibility calculations.\n     *\n     * @returns {Object}\n     * @private\n     */\n\n  }, {\n    key: '_getVariables',\n    value: function _getVariables() {\n      var wot = this.wot;\n      var topOverlay = wot.wtOverlays.topOverlay;\n      var leftOverlay = wot.wtOverlays.leftOverlay;\n      var wtTable = wot.wtTable;\n      var wtViewport = wot.wtViewport;\n      var totalRows = wot.getSetting('totalRows');\n      var totalColumns = wot.getSetting('totalColumns');\n      var fixedRowsTop = wot.getSetting('fixedRowsTop');\n      var fixedRowsBottom = wot.getSetting('fixedRowsBottom');\n      var fixedColumnsLeft = wot.getSetting('fixedColumnsLeft');\n\n      return {\n        topOverlay: topOverlay,\n        leftOverlay: leftOverlay,\n        wtTable: wtTable,\n        wtViewport: wtViewport,\n        totalRows: totalRows,\n        totalColumns: totalColumns,\n        fixedRowsTop: fixedRowsTop,\n        fixedRowsBottom: fixedRowsBottom,\n        fixedColumnsLeft: fixedColumnsLeft\n      };\n    }\n  }]);\n\n  return Scroll;\n}();\n\nexports.default = Scroll;\n\n/***/ }),\n/* 302 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Settings\n */\nvar Settings = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   * @param {Object} settings\n   */\n  function Settings(wotInstance, settings) {\n    var _this = this;\n\n    _classCallCheck(this, Settings);\n\n    this.wot = wotInstance;\n\n    // legacy support\n    this.instance = wotInstance;\n\n    // default settings. void 0 means it is required, null means it can be empty\n    this.defaults = {\n      table: void 0,\n      debug: false, // shows WalkontableDebugOverlay\n\n      // presentation mode\n      externalRowCalculator: false,\n      stretchH: 'none', // values: all, last, none\n      currentRowClassName: null,\n      currentColumnClassName: null,\n      preventOverflow: function preventOverflow() {\n        return false;\n      },\n\n\n      // data source\n      data: void 0,\n      freezeOverlays: false,\n      fixedColumnsLeft: 0,\n      fixedRowsTop: 0,\n      fixedRowsBottom: 0,\n      minSpareRows: 0,\n\n      // this must be array of functions: [function (row, TH) {}]\n      rowHeaders: function rowHeaders() {\n        return [];\n      },\n\n\n      // this must be array of functions: [function (column, TH) {}]\n      columnHeaders: function columnHeaders() {\n        return [];\n      },\n\n      totalRows: void 0,\n      totalColumns: void 0,\n      cellRenderer: function cellRenderer(row, column, TD) {\n        var cellData = _this.getSetting('data', row, column);\n\n        (0, _element.fastInnerText)(TD, cellData === void 0 || cellData === null ? '' : cellData);\n      },\n\n      // columnWidth: 50,\n      columnWidth: function columnWidth(col) {\n        // return undefined means use default size for the rendered cell content\n      },\n      rowHeight: function rowHeight(row) {\n        // return undefined means use default size for the rendered cell content\n      },\n\n      defaultRowHeight: 23,\n      defaultColumnWidth: 50,\n      selections: null,\n      hideBorderOnMouseDownOver: false,\n      viewportRowCalculatorOverride: null,\n      viewportColumnCalculatorOverride: null,\n\n      // callbacks\n      onCellMouseDown: null,\n      onCellMouseOver: null,\n      onCellMouseOut: null,\n      onCellMouseUp: null,\n\n      //    onCellMouseOut: null,\n      onCellDblClick: null,\n      onCellCornerMouseDown: null,\n      onCellCornerDblClick: null,\n      beforeDraw: null,\n      onDraw: null,\n      onBeforeRemoveCellClassNames: null,\n      onAfterDrawSelection: null,\n      onBeforeDrawBorders: null,\n      onScrollVertically: null,\n      onScrollHorizontally: null,\n      onBeforeTouchScroll: null,\n      onAfterMomentumScroll: null,\n      onBeforeStretchingColumnWidth: function onBeforeStretchingColumnWidth(width) {\n        return width;\n      },\n      onModifyRowHeaderWidth: null,\n      onModifyGetCellCoords: null,\n\n      // constants\n      scrollbarWidth: 10,\n      scrollbarHeight: 10,\n\n      renderAllRows: false,\n      groups: false,\n      rowHeaderWidth: null,\n      columnHeaderHeight: null,\n      headerClassName: null\n    };\n\n    // reference to settings\n    this.settings = {};\n\n    for (var i in this.defaults) {\n      if ((0, _object.hasOwnProperty)(this.defaults, i)) {\n        if (settings[i] !== void 0) {\n          this.settings[i] = settings[i];\n        } else if (this.defaults[i] === void 0) {\n          throw new Error('A required setting \"' + i + '\" was not provided');\n        } else {\n          this.settings[i] = this.defaults[i];\n        }\n      }\n    }\n  }\n\n  /**\n   * Update settings\n   *\n   * @param {Object} settings\n   * @param {*} value\n   * @returns {Walkontable}\n   */\n\n\n  _createClass(Settings, [{\n    key: 'update',\n    value: function update(settings, value) {\n      if (value === void 0) {\n        // settings is object\n        for (var i in settings) {\n          if ((0, _object.hasOwnProperty)(settings, i)) {\n            this.settings[i] = settings[i];\n          }\n        }\n      } else {\n        // if value is defined then settings is the key\n        this.settings[settings] = value;\n      }\n      return this.wot;\n    }\n\n    /**\n     * Get setting by name\n     *\n     * @param {String} key\n     * @param {*} param1\n     * @param {*} param2\n     * @param {*} param3\n     * @param {*} param4\n     * @returns {*}\n     */\n\n  }, {\n    key: 'getSetting',\n    value: function getSetting(key, param1, param2, param3, param4) {\n      if (typeof this.settings[key] === 'function') {\n        // this is faster than .apply - https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\n        return this.settings[key](param1, param2, param3, param4);\n      } else if (param1 !== void 0 && Array.isArray(this.settings[key])) {\n        // perhaps this can be removed, it is only used in tests\n        return this.settings[key][param1];\n      }\n\n      return this.settings[key];\n    }\n\n    /**\n     * Checks if setting exists\n     *\n     * @param {Boolean} key\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'has',\n    value: function has(key) {\n      return !!this.settings[key];\n    }\n  }]);\n\n  return Settings;\n}();\n\nexports.default = Settings;\n\n/***/ }),\n/* 303 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _function = __webpack_require__(43);\n\nvar _coords = __webpack_require__(55);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nvar _range = __webpack_require__(86);\n\nvar _range2 = _interopRequireDefault(_range);\n\nvar _column = __webpack_require__(177);\n\nvar _column2 = _interopRequireDefault(_column);\n\nvar _row = __webpack_require__(178);\n\nvar _row2 = _interopRequireDefault(_row);\n\nvar _tableRenderer = __webpack_require__(304);\n\nvar _tableRenderer2 = _interopRequireDefault(_tableRenderer);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n *\n */\nvar Table = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   * @param {HTMLTableElement} table\n   */\n  function Table(wotInstance, table) {\n    var _this = this;\n\n    _classCallCheck(this, Table);\n\n    this.wot = wotInstance;\n\n    // legacy support\n    this.instance = this.wot;\n    this.TABLE = table;\n    this.TBODY = null;\n    this.THEAD = null;\n    this.COLGROUP = null;\n    this.tableOffset = 0;\n    this.holderOffset = 0;\n\n    (0, _element.removeTextNodes)(this.TABLE);\n\n    this.spreader = this.createSpreader(this.TABLE);\n    this.hider = this.createHider(this.spreader);\n    this.holder = this.createHolder(this.hider);\n\n    this.wtRootElement = this.holder.parentNode;\n    this.alignOverlaysWithTrimmingContainer();\n    this.fixTableDomTree();\n\n    this.colgroupChildrenLength = this.COLGROUP.childNodes.length;\n    this.theadChildrenLength = this.THEAD.firstChild ? this.THEAD.firstChild.childNodes.length : 0;\n    this.tbodyChildrenLength = this.TBODY.childNodes.length;\n\n    this.rowFilter = null;\n    this.columnFilter = null;\n    this.correctHeaderWidth = false;\n\n    var origRowHeaderWidth = this.wot.wtSettings.settings.rowHeaderWidth;\n\n    // Fix for jumping row headers (https://github.com/handsontable/handsontable/issues/3850)\n    this.wot.wtSettings.settings.rowHeaderWidth = function () {\n      return _this._modifyRowHeaderWidth(origRowHeaderWidth);\n    };\n  }\n\n  /**\n   *\n   */\n\n\n  _createClass(Table, [{\n    key: 'fixTableDomTree',\n    value: function fixTableDomTree() {\n      this.TBODY = this.TABLE.querySelector('tbody');\n\n      if (!this.TBODY) {\n        this.TBODY = document.createElement('tbody');\n        this.TABLE.appendChild(this.TBODY);\n      }\n      this.THEAD = this.TABLE.querySelector('thead');\n\n      if (!this.THEAD) {\n        this.THEAD = document.createElement('thead');\n        this.TABLE.insertBefore(this.THEAD, this.TBODY);\n      }\n      this.COLGROUP = this.TABLE.querySelector('colgroup');\n\n      if (!this.COLGROUP) {\n        this.COLGROUP = document.createElement('colgroup');\n        this.TABLE.insertBefore(this.COLGROUP, this.THEAD);\n      }\n\n      if (this.wot.getSetting('columnHeaders').length && !this.THEAD.childNodes.length) {\n        this.THEAD.appendChild(document.createElement('TR'));\n      }\n    }\n\n    /**\n     * @param table\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createSpreader',\n    value: function createSpreader(table) {\n      var parent = table.parentNode;\n      var spreader = void 0;\n\n      if (!parent || parent.nodeType !== 1 || !(0, _element.hasClass)(parent, 'wtHolder')) {\n        spreader = document.createElement('div');\n        spreader.className = 'wtSpreader';\n\n        if (parent) {\n          // if TABLE is detached (e.g. in Jasmine test), it has no parentNode so we cannot attach holder to it\n          parent.insertBefore(spreader, table);\n        }\n        spreader.appendChild(table);\n      }\n      spreader.style.position = 'relative';\n\n      return spreader;\n    }\n\n    /**\n     * @param spreader\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createHider',\n    value: function createHider(spreader) {\n      var parent = spreader.parentNode;\n      var hider = void 0;\n\n      if (!parent || parent.nodeType !== 1 || !(0, _element.hasClass)(parent, 'wtHolder')) {\n        hider = document.createElement('div');\n        hider.className = 'wtHider';\n\n        if (parent) {\n          // if TABLE is detached (e.g. in Jasmine test), it has no parentNode so we cannot attach holder to it\n          parent.insertBefore(hider, spreader);\n        }\n        hider.appendChild(spreader);\n      }\n\n      return hider;\n    }\n\n    /**\n     *\n     * @param hider\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createHolder',\n    value: function createHolder(hider) {\n      var parent = hider.parentNode;\n      var holder = void 0;\n\n      if (!parent || parent.nodeType !== 1 || !(0, _element.hasClass)(parent, 'wtHolder')) {\n        holder = document.createElement('div');\n        holder.style.position = 'relative';\n        holder.className = 'wtHolder';\n\n        if (parent) {\n          // if TABLE is detached (e.g. in Jasmine test), it has no parentNode so we cannot attach holder to it\n          parent.insertBefore(holder, hider);\n        }\n        if (!this.isWorkingOnClone()) {\n          holder.parentNode.className += 'ht_master handsontable';\n        }\n        holder.appendChild(hider);\n      }\n\n      return holder;\n    }\n  }, {\n    key: 'alignOverlaysWithTrimmingContainer',\n    value: function alignOverlaysWithTrimmingContainer() {\n      var trimmingElement = (0, _element.getTrimmingContainer)(this.wtRootElement);\n\n      if (!this.isWorkingOnClone()) {\n        this.holder.parentNode.style.position = 'relative';\n\n        if (trimmingElement === window) {\n          var preventOverflow = this.wot.getSetting('preventOverflow');\n\n          if (!preventOverflow) {\n            this.holder.style.overflow = 'visible';\n            this.wtRootElement.style.overflow = 'visible';\n          }\n        } else {\n          this.holder.style.width = (0, _element.getStyle)(trimmingElement, 'width');\n          this.holder.style.height = (0, _element.getStyle)(trimmingElement, 'height');\n          this.holder.style.overflow = '';\n        }\n      }\n    }\n  }, {\n    key: 'isWorkingOnClone',\n    value: function isWorkingOnClone() {\n      return !!this.wot.cloneSource;\n    }\n\n    /**\n     * Redraws the table\n     *\n     * @param {Boolean} fastDraw If TRUE, will try to avoid full redraw and only update the border positions. If FALSE or UNDEFINED, will perform a full redraw\n     * @returns {Table}\n     */\n\n  }, {\n    key: 'draw',\n    value: function draw(fastDraw) {\n      var _wot = this.wot,\n          wtOverlays = _wot.wtOverlays,\n          wtViewport = _wot.wtViewport;\n\n      var totalRows = this.instance.getSetting('totalRows');\n      var rowHeaders = this.wot.getSetting('rowHeaders').length;\n      var columnHeaders = this.wot.getSetting('columnHeaders').length;\n      var syncScroll = false;\n\n      if (!this.isWorkingOnClone()) {\n        this.holderOffset = (0, _element.offset)(this.holder);\n        fastDraw = wtViewport.createRenderCalculators(fastDraw);\n\n        if (rowHeaders && !this.wot.getSetting('fixedColumnsLeft')) {\n          var leftScrollPos = wtOverlays.leftOverlay.getScrollPosition();\n          var previousState = this.correctHeaderWidth;\n\n          this.correctHeaderWidth = leftScrollPos > 0;\n\n          if (previousState !== this.correctHeaderWidth) {\n            fastDraw = false;\n          }\n        }\n      }\n\n      if (!this.isWorkingOnClone()) {\n        syncScroll = wtOverlays.prepareOverlays();\n      }\n\n      if (fastDraw) {\n        if (!this.isWorkingOnClone()) {\n          // in case we only scrolled without redraw, update visible rows information in oldRowsCalculator\n          wtViewport.createVisibleCalculators();\n        }\n        if (wtOverlays) {\n          wtOverlays.refresh(true);\n        }\n      } else {\n        if (this.isWorkingOnClone()) {\n          this.tableOffset = this.wot.cloneSource.wtTable.tableOffset;\n        } else {\n          this.tableOffset = (0, _element.offset)(this.TABLE);\n        }\n        var startRow = void 0;\n\n        if (_base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_DEBUG) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_TOP) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_TOP_LEFT_CORNER)) {\n          startRow = 0;\n        } else if (_base2.default.isOverlayTypeOf(this.instance.cloneOverlay, _base2.default.CLONE_BOTTOM) || _base2.default.isOverlayTypeOf(this.instance.cloneOverlay, _base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n          startRow = Math.max(totalRows - this.wot.getSetting('fixedRowsBottom'), 0);\n        } else {\n          startRow = wtViewport.rowsRenderCalculator.startRow;\n        }\n        var startColumn = void 0;\n\n        if (_base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_DEBUG) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_LEFT) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_TOP_LEFT_CORNER) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n          startColumn = 0;\n        } else {\n          startColumn = wtViewport.columnsRenderCalculator.startColumn;\n        }\n        this.rowFilter = new _row2.default(startRow, totalRows, columnHeaders);\n        this.columnFilter = new _column2.default(startColumn, this.wot.getSetting('totalColumns'), rowHeaders);\n\n        this.alignOverlaysWithTrimmingContainer();\n        this._doDraw(); // creates calculator after draw\n      }\n      this.refreshSelections(fastDraw);\n\n      if (!this.isWorkingOnClone()) {\n        wtOverlays.topOverlay.resetFixedPosition();\n\n        if (wtOverlays.bottomOverlay.clone) {\n          wtOverlays.bottomOverlay.resetFixedPosition();\n        }\n\n        wtOverlays.leftOverlay.resetFixedPosition();\n\n        if (wtOverlays.topLeftCornerOverlay) {\n          wtOverlays.topLeftCornerOverlay.resetFixedPosition();\n        }\n\n        if (wtOverlays.bottomLeftCornerOverlay && wtOverlays.bottomLeftCornerOverlay.clone) {\n          wtOverlays.bottomLeftCornerOverlay.resetFixedPosition();\n        }\n      }\n      if (syncScroll) {\n        wtOverlays.syncScrollWithMaster();\n      }\n      this.wot.drawn = true;\n\n      return this;\n    }\n  }, {\n    key: '_doDraw',\n    value: function _doDraw() {\n      var wtRenderer = new _tableRenderer2.default(this);\n\n      wtRenderer.render();\n    }\n  }, {\n    key: 'removeClassFromCells',\n    value: function removeClassFromCells(className) {\n      var nodes = this.TABLE.querySelectorAll('.' + className);\n\n      for (var i = 0, len = nodes.length; i < len; i++) {\n        (0, _element.removeClass)(nodes[i], className);\n      }\n    }\n\n    /**\n     * Refresh the table selection by re-rendering Selection instances connected with that instance.\n     *\n     * @param {Boolean} fastDraw If fast drawing is enabled than additionally className clearing is applied.\n     */\n\n  }, {\n    key: 'refreshSelections',\n    value: function refreshSelections(fastDraw) {\n      if (!this.wot.selections) {\n        return;\n      }\n      var highlights = Array.from(this.wot.selections);\n      var len = highlights.length;\n\n      if (fastDraw) {\n        var classesToRemove = [];\n\n        for (var i = 0; i < len; i++) {\n          var _highlights$i$setting = highlights[i].settings,\n              highlightHeaderClassName = _highlights$i$setting.highlightHeaderClassName,\n              highlightRowClassName = _highlights$i$setting.highlightRowClassName,\n              highlightColumnClassName = _highlights$i$setting.highlightColumnClassName;\n\n          var classNames = highlights[i].classNames;\n          var classNamesLength = classNames.length;\n\n          for (var j = 0; j < classNamesLength; j++) {\n            if (!classesToRemove.includes(classNames[j])) {\n              classesToRemove.push(classNames[j]);\n            }\n          }\n\n          if (highlightHeaderClassName && !classesToRemove.includes(highlightHeaderClassName)) {\n            classesToRemove.push(highlightHeaderClassName);\n          }\n          if (highlightRowClassName && !classesToRemove.includes(highlightRowClassName)) {\n            classesToRemove.push(highlightRowClassName);\n          }\n          if (highlightColumnClassName && !classesToRemove.includes(highlightColumnClassName)) {\n            classesToRemove.push(highlightColumnClassName);\n          }\n        }\n\n        var additionalClassesToRemove = this.wot.getSetting('onBeforeRemoveCellClassNames');\n\n        if (Array.isArray(additionalClassesToRemove)) {\n          for (var _i = 0; _i < additionalClassesToRemove.length; _i++) {\n            classesToRemove.push(additionalClassesToRemove[_i]);\n          }\n        }\n\n        var classesToRemoveLength = classesToRemove.length;\n\n        for (var _i2 = 0; _i2 < classesToRemoveLength; _i2++) {\n          // there was no rerender, so we need to remove classNames by ourselves\n          this.removeClassFromCells(classesToRemove[_i2]);\n        }\n      }\n\n      for (var _i3 = 0; _i3 < len; _i3++) {\n        highlights[_i3].draw(this.wot, fastDraw);\n      }\n    }\n\n    /**\n     * Get cell element at coords.\n     *\n     * @param {CellCoords} coords\n     * @returns {HTMLElement|Number} HTMLElement on success or Number one of the exit codes on error:\n     *  -1 row before viewport\n     *  -2 row after viewport\n     */\n\n  }, {\n    key: 'getCell',\n    value: function getCell(coords) {\n      var row = coords.row;\n      var column = coords.col;\n      var hookResult = this.wot.getSetting('onModifyGetCellCoords', row, column);\n\n      if (hookResult && Array.isArray(hookResult)) {\n        var _hookResult = _slicedToArray(hookResult, 2);\n\n        row = _hookResult[0];\n        column = _hookResult[1];\n      }\n\n      if (this.isRowBeforeRenderedRows(row)) {\n        // row before rendered rows\n        return -1;\n      } else if (this.isRowAfterRenderedRows(row)) {\n        // row after rendered rows\n        return -2;\n      }\n\n      var TR = this.TBODY.childNodes[this.rowFilter.sourceToRendered(row)];\n\n      if (TR) {\n        return TR.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(column)];\n      }\n    }\n\n    /**\n     * getColumnHeader\n     *\n     * @param {Number} col Column index\n     * @param {Number} [level=0] Header level (0 = most distant to the table)\n     * @returns {Object} HTMLElement on success or undefined on error\n     */\n\n  }, {\n    key: 'getColumnHeader',\n    value: function getColumnHeader(col) {\n      var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n      var TR = this.THEAD.childNodes[level];\n\n      if (TR) {\n        return TR.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(col)];\n      }\n    }\n\n    /**\n     * getRowHeader\n     *\n     * @param {Number} row Row index\n     * @returns {HTMLElement} HTMLElement on success or Number one of the exit codes on error: `null table doesn't have row headers`\n     */\n\n  }, {\n    key: 'getRowHeader',\n    value: function getRowHeader(row) {\n      if (this.columnFilter.sourceColumnToVisibleRowHeadedColumn(0) === 0) {\n        return null;\n      }\n      var TR = this.TBODY.childNodes[this.rowFilter.sourceToRendered(row)];\n\n      if (TR) {\n        return TR.childNodes[0];\n      }\n    }\n\n    /**\n     * Returns cell coords object for a given TD (or a child element of a TD element).\n     *\n     * @param {HTMLTableCellElement} TD A cell DOM element (or a child of one).\n     * @returns {CellCoords|null} The coordinates of the provided TD element (or the closest TD element) or null, if the provided element is not applicable.\n     */\n\n  }, {\n    key: 'getCoords',\n    value: function getCoords(TD) {\n      if (TD.nodeName !== 'TD' && TD.nodeName !== 'TH') {\n        TD = (0, _element.closest)(TD, ['TD', 'TH']);\n      }\n\n      if (TD === null) {\n        return null;\n      }\n\n      var TR = TD.parentNode;\n      var CONTAINER = TR.parentNode;\n      var row = (0, _element.index)(TR);\n      var col = TD.cellIndex;\n\n      if ((0, _element.overlayContainsElement)(_base2.default.CLONE_TOP_LEFT_CORNER, TD) || (0, _element.overlayContainsElement)(_base2.default.CLONE_TOP, TD)) {\n        if (CONTAINER.nodeName === 'THEAD') {\n          row -= CONTAINER.childNodes.length;\n        }\n      } else if (CONTAINER === this.THEAD) {\n        row = this.rowFilter.visibleColHeadedRowToSourceRow(row);\n      } else {\n        row = this.rowFilter.renderedToSource(row);\n      }\n\n      if ((0, _element.overlayContainsElement)(_base2.default.CLONE_TOP_LEFT_CORNER, TD) || (0, _element.overlayContainsElement)(_base2.default.CLONE_LEFT, TD)) {\n        col = this.columnFilter.offsettedTH(col);\n      } else {\n        col = this.columnFilter.visibleRowHeadedColumnToSourceColumn(col);\n      }\n\n      return new _coords2.default(row, col);\n    }\n  }, {\n    key: 'getTrForRow',\n    value: function getTrForRow(row) {\n      return this.TBODY.childNodes[this.rowFilter.sourceToRendered(row)];\n    }\n  }, {\n    key: 'getFirstRenderedRow',\n    value: function getFirstRenderedRow() {\n      return this.wot.wtViewport.rowsRenderCalculator.startRow;\n    }\n  }, {\n    key: 'getFirstVisibleRow',\n    value: function getFirstVisibleRow() {\n      return this.wot.wtViewport.rowsVisibleCalculator.startRow;\n    }\n  }, {\n    key: 'getFirstRenderedColumn',\n    value: function getFirstRenderedColumn() {\n      return this.wot.wtViewport.columnsRenderCalculator.startColumn;\n    }\n\n    /**\n     * @returns {Number} Returns -1 if no row is visible\n     */\n\n  }, {\n    key: 'getFirstVisibleColumn',\n    value: function getFirstVisibleColumn() {\n      return this.wot.wtViewport.columnsVisibleCalculator.startColumn;\n    }\n\n    /**\n     * @returns {Number} Returns -1 if no row is visible\n     */\n\n  }, {\n    key: 'getLastRenderedRow',\n    value: function getLastRenderedRow() {\n      return this.wot.wtViewport.rowsRenderCalculator.endRow;\n    }\n  }, {\n    key: 'getLastVisibleRow',\n    value: function getLastVisibleRow() {\n      return this.wot.wtViewport.rowsVisibleCalculator.endRow;\n    }\n  }, {\n    key: 'getLastRenderedColumn',\n    value: function getLastRenderedColumn() {\n      return this.wot.wtViewport.columnsRenderCalculator.endColumn;\n    }\n\n    /**\n     * @returns {Number} Returns -1 if no column is visible\n     */\n\n  }, {\n    key: 'getLastVisibleColumn',\n    value: function getLastVisibleColumn() {\n      return this.wot.wtViewport.columnsVisibleCalculator.endColumn;\n    }\n  }, {\n    key: 'isRowBeforeRenderedRows',\n    value: function isRowBeforeRenderedRows(row) {\n      return this.rowFilter && this.rowFilter.sourceToRendered(row) < 0 && row >= 0;\n    }\n  }, {\n    key: 'isRowAfterViewport',\n    value: function isRowAfterViewport(row) {\n      return this.rowFilter && this.rowFilter.sourceToRendered(row) > this.getLastVisibleRow();\n    }\n  }, {\n    key: 'isRowAfterRenderedRows',\n    value: function isRowAfterRenderedRows(row) {\n      return this.rowFilter && this.rowFilter.sourceToRendered(row) > this.getLastRenderedRow();\n    }\n  }, {\n    key: 'isColumnBeforeViewport',\n    value: function isColumnBeforeViewport(column) {\n      return this.columnFilter && this.columnFilter.sourceToRendered(column) < 0 && column >= 0;\n    }\n  }, {\n    key: 'isColumnAfterViewport',\n    value: function isColumnAfterViewport(column) {\n      return this.columnFilter && this.columnFilter.sourceToRendered(column) > this.getLastVisibleColumn();\n    }\n  }, {\n    key: 'isLastRowFullyVisible',\n    value: function isLastRowFullyVisible() {\n      return this.getLastVisibleRow() === this.getLastRenderedRow();\n    }\n  }, {\n    key: 'isLastColumnFullyVisible',\n    value: function isLastColumnFullyVisible() {\n      return this.getLastVisibleColumn() === this.getLastRenderedColumn();\n    }\n  }, {\n    key: 'getRenderedColumnsCount',\n    value: function getRenderedColumnsCount() {\n      var columnsCount = this.wot.wtViewport.columnsRenderCalculator.count;\n      var totalColumns = this.wot.getSetting('totalColumns');\n\n      if (this.wot.isOverlayName(_base2.default.CLONE_DEBUG)) {\n        columnsCount = totalColumns;\n      } else if (this.wot.isOverlayName(_base2.default.CLONE_LEFT) || this.wot.isOverlayName(_base2.default.CLONE_TOP_LEFT_CORNER) || this.wot.isOverlayName(_base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n        return Math.min(this.wot.getSetting('fixedColumnsLeft'), totalColumns);\n      }\n\n      return columnsCount;\n    }\n  }, {\n    key: 'getRenderedRowsCount',\n    value: function getRenderedRowsCount() {\n      var rowsCount = this.wot.wtViewport.rowsRenderCalculator.count;\n      var totalRows = this.wot.getSetting('totalRows');\n\n      if (this.wot.isOverlayName(_base2.default.CLONE_DEBUG)) {\n        rowsCount = totalRows;\n      } else if (this.wot.isOverlayName(_base2.default.CLONE_TOP) || this.wot.isOverlayName(_base2.default.CLONE_TOP_LEFT_CORNER)) {\n        rowsCount = Math.min(this.wot.getSetting('fixedRowsTop'), totalRows);\n      } else if (this.wot.isOverlayName(_base2.default.CLONE_BOTTOM) || this.wot.isOverlayName(_base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n        rowsCount = Math.min(this.wot.getSetting('fixedRowsBottom'), totalRows);\n      }\n\n      return rowsCount;\n    }\n  }, {\n    key: 'getVisibleRowsCount',\n    value: function getVisibleRowsCount() {\n      return this.wot.wtViewport.rowsVisibleCalculator.count;\n    }\n  }, {\n    key: 'allRowsInViewport',\n    value: function allRowsInViewport() {\n      return this.wot.getSetting('totalRows') == this.getVisibleRowsCount();\n    }\n\n    /**\n     * Checks if any of the row's cells content exceeds its initial height, and if so, returns the oversized height\n     *\n     * @param {Number} sourceRow\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getRowHeight',\n    value: function getRowHeight(sourceRow) {\n      var height = this.wot.wtSettings.settings.rowHeight(sourceRow);\n      var oversizedHeight = this.wot.wtViewport.oversizedRows[sourceRow];\n\n      if (oversizedHeight !== void 0) {\n        height = height === void 0 ? oversizedHeight : Math.max(height, oversizedHeight);\n      }\n\n      return height;\n    }\n  }, {\n    key: 'getColumnHeaderHeight',\n    value: function getColumnHeaderHeight(level) {\n      var height = this.wot.wtSettings.settings.defaultRowHeight;\n      var oversizedHeight = this.wot.wtViewport.oversizedColumnHeaders[level];\n\n      if (oversizedHeight !== void 0) {\n        height = height ? Math.max(height, oversizedHeight) : oversizedHeight;\n      }\n\n      return height;\n    }\n  }, {\n    key: 'getVisibleColumnsCount',\n    value: function getVisibleColumnsCount() {\n      return this.wot.wtViewport.columnsVisibleCalculator.count;\n    }\n  }, {\n    key: 'allColumnsInViewport',\n    value: function allColumnsInViewport() {\n      return this.wot.getSetting('totalColumns') == this.getVisibleColumnsCount();\n    }\n  }, {\n    key: 'getColumnWidth',\n    value: function getColumnWidth(sourceColumn) {\n      var width = this.wot.wtSettings.settings.columnWidth;\n\n      if (typeof width === 'function') {\n        width = width(sourceColumn);\n      } else if ((typeof width === 'undefined' ? 'undefined' : _typeof(width)) === 'object') {\n        width = width[sourceColumn];\n      }\n\n      return width || this.wot.wtSettings.settings.defaultColumnWidth;\n    }\n  }, {\n    key: 'getStretchedColumnWidth',\n    value: function getStretchedColumnWidth(sourceColumn) {\n      var columnWidth = this.getColumnWidth(sourceColumn);\n      var width = columnWidth == null ? this.instance.wtSettings.settings.defaultColumnWidth : columnWidth;\n      var calculator = this.wot.wtViewport.columnsRenderCalculator;\n\n      if (calculator) {\n        var stretchedWidth = calculator.getStretchedColumnWidth(sourceColumn, width);\n\n        if (stretchedWidth) {\n          width = stretchedWidth;\n        }\n      }\n\n      return width;\n    }\n\n    /**\n     * Modify row header widths provided by user in class contructor.\n     *\n     * @private\n     */\n\n  }, {\n    key: '_modifyRowHeaderWidth',\n    value: function _modifyRowHeaderWidth(rowHeaderWidthFactory) {\n      var widths = (0, _function.isFunction)(rowHeaderWidthFactory) ? rowHeaderWidthFactory() : null;\n\n      if (Array.isArray(widths)) {\n        widths = [].concat(_toConsumableArray(widths));\n        widths[widths.length - 1] = this._correctRowHeaderWidth(widths[widths.length - 1]);\n      } else {\n        widths = this._correctRowHeaderWidth(widths);\n      }\n\n      return widths;\n    }\n\n    /**\n     * Correct row header width if necessary.\n     *\n     * @private\n     */\n\n  }, {\n    key: '_correctRowHeaderWidth',\n    value: function _correctRowHeaderWidth(width) {\n      if (typeof width !== 'number') {\n        width = this.wot.getSetting('defaultColumnWidth');\n      }\n      if (this.correctHeaderWidth) {\n        width++;\n      }\n\n      return width;\n    }\n  }]);\n\n  return Table;\n}();\n\nexports.default = Table;\n\n/***/ }),\n/* 304 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['Performance tip: Handsontable rendered more than 1000 visible rows. Consider limiting the number \\n          of rendered rows by specifying the table height and/or turning off the \"renderAllRows\" option.'], ['Performance tip: Handsontable rendered more than 1000 visible rows. Consider limiting the number \\n          of rendered rows by specifying the table height and/or turning off the \"renderAllRows\" option.']);\n\nvar _element = __webpack_require__(0);\n\nvar _console = __webpack_require__(56);\n\nvar _templateLiteralTag = __webpack_require__(42);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar performanceWarningAppeared = false;\n\n/**\n * @class TableRenderer\n */\n\nvar TableRenderer = function () {\n  /**\n   * @param {WalkontableTable} wtTable\n   */\n  function TableRenderer(wtTable) {\n    _classCallCheck(this, TableRenderer);\n\n    this.wtTable = wtTable;\n    this.wot = wtTable.instance;\n\n    // legacy support\n    this.instance = wtTable.instance;\n\n    this.rowFilter = wtTable.rowFilter;\n    this.columnFilter = wtTable.columnFilter;\n\n    this.TABLE = wtTable.TABLE;\n    this.THEAD = wtTable.THEAD;\n    this.TBODY = wtTable.TBODY;\n    this.COLGROUP = wtTable.COLGROUP;\n\n    this.rowHeaders = [];\n    this.rowHeaderCount = 0;\n    this.columnHeaders = [];\n    this.columnHeaderCount = 0;\n    this.fixedRowsTop = 0;\n    this.fixedRowsBottom = 0;\n  }\n\n  /**\n   *\n   */\n\n\n  _createClass(TableRenderer, [{\n    key: 'render',\n    value: function render() {\n      if (!this.wtTable.isWorkingOnClone()) {\n        var skipRender = {};\n        this.wot.getSetting('beforeDraw', true, skipRender);\n\n        if (skipRender.skipRender === true) {\n          return;\n        }\n      }\n\n      this.rowHeaders = this.wot.getSetting('rowHeaders');\n      this.rowHeaderCount = this.rowHeaders.length;\n      this.fixedRowsTop = this.wot.getSetting('fixedRowsTop');\n      this.fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');\n      this.columnHeaders = this.wot.getSetting('columnHeaders');\n      this.columnHeaderCount = this.columnHeaders.length;\n\n      var columnsToRender = this.wtTable.getRenderedColumnsCount();\n      var rowsToRender = this.wtTable.getRenderedRowsCount();\n      var totalColumns = this.wot.getSetting('totalColumns');\n      var totalRows = this.wot.getSetting('totalRows');\n      var workspaceWidth = void 0;\n      var adjusted = false;\n\n      if (_base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_BOTTOM) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n\n        // do NOT render headers on the bottom or bottom-left corner overlay\n        this.columnHeaders = [];\n        this.columnHeaderCount = 0;\n      }\n\n      if (totalColumns >= 0) {\n        // prepare COL and TH elements for rendering\n        this.adjustAvailableNodes();\n        adjusted = true;\n\n        // adjust column widths according to user widths settings\n        this.renderColumnHeaders();\n\n        // Render table rows\n        this.renderRows(totalRows, rowsToRender, columnsToRender);\n\n        if (!this.wtTable.isWorkingOnClone()) {\n          workspaceWidth = this.wot.wtViewport.getWorkspaceWidth();\n          this.wot.wtViewport.containerWidth = null;\n        }\n\n        this.adjustColumnWidths(columnsToRender);\n        this.markOversizedColumnHeaders();\n        this.adjustColumnHeaderHeights();\n      }\n\n      if (!adjusted) {\n        this.adjustAvailableNodes();\n      }\n      this.removeRedundantRows(rowsToRender);\n\n      if (!this.wtTable.isWorkingOnClone() || this.wot.isOverlayName(_base2.default.CLONE_BOTTOM)) {\n        this.markOversizedRows();\n      }\n      if (!this.wtTable.isWorkingOnClone()) {\n        this.wot.wtViewport.createVisibleCalculators();\n        this.wot.wtOverlays.refresh(false);\n\n        this.wot.wtOverlays.applyToDOM();\n\n        var hiderWidth = (0, _element.outerWidth)(this.wtTable.hider);\n        var tableWidth = (0, _element.outerWidth)(this.wtTable.TABLE);\n\n        if (hiderWidth !== 0 && tableWidth !== hiderWidth) {\n          // Recalculate the column widths, if width changes made in the overlays removed the scrollbar, thus changing the viewport width.\n          this.adjustColumnWidths(columnsToRender);\n        }\n\n        if (workspaceWidth !== this.wot.wtViewport.getWorkspaceWidth()) {\n          // workspace width changed though to shown/hidden vertical scrollbar. Let's reapply stretching\n          this.wot.wtViewport.containerWidth = null;\n\n          var firstRendered = this.wtTable.getFirstRenderedColumn();\n          var lastRendered = this.wtTable.getLastRenderedColumn();\n          var defaultColumnWidth = this.wot.getSetting('defaultColumnWidth');\n          var rowHeaderWidthSetting = this.wot.getSetting('rowHeaderWidth');\n\n          rowHeaderWidthSetting = this.instance.getSetting('onModifyRowHeaderWidth', rowHeaderWidthSetting);\n\n          if (rowHeaderWidthSetting != null) {\n            for (var i = 0; i < this.rowHeaderCount; i++) {\n              var width = Array.isArray(rowHeaderWidthSetting) ? rowHeaderWidthSetting[i] : rowHeaderWidthSetting;\n\n              width = width == null ? defaultColumnWidth : width;\n\n              this.COLGROUP.childNodes[i].style.width = width + 'px';\n            }\n          }\n\n          for (var _i = firstRendered; _i < lastRendered; _i++) {\n            var _width = this.wtTable.getStretchedColumnWidth(_i);\n            var renderedIndex = this.columnFilter.sourceToRendered(_i);\n\n            this.COLGROUP.childNodes[renderedIndex + this.rowHeaderCount].style.width = _width + 'px';\n          }\n        }\n\n        this.wot.getSetting('onDraw', true);\n      } else if (this.wot.isOverlayName(_base2.default.CLONE_BOTTOM)) {\n        this.wot.cloneSource.wtOverlays.adjustElementsSize();\n      }\n    }\n\n    /**\n     * @param {Number} renderedRowsCount\n     */\n\n  }, {\n    key: 'removeRedundantRows',\n    value: function removeRedundantRows(renderedRowsCount) {\n      while (this.wtTable.tbodyChildrenLength > renderedRowsCount) {\n        this.TBODY.removeChild(this.TBODY.lastChild);\n        this.wtTable.tbodyChildrenLength--;\n      }\n    }\n\n    /**\n     * @param {Number} totalRows\n     * @param {Number} rowsToRender\n     * @param {Number} columnsToRender\n     */\n\n  }, {\n    key: 'renderRows',\n    value: function renderRows(totalRows, rowsToRender, columnsToRender) {\n      var lastTD = void 0;\n      var TR = void 0;\n      var visibleRowIndex = 0;\n      var sourceRowIndex = this.rowFilter.renderedToSource(visibleRowIndex);\n      var isWorkingOnClone = this.wtTable.isWorkingOnClone();\n\n      while (sourceRowIndex < totalRows && sourceRowIndex >= 0) {\n        if (!performanceWarningAppeared && visibleRowIndex > 1000) {\n          performanceWarningAppeared = true;\n          (0, _console.warn)((0, _templateLiteralTag.toSingleLine)(_templateObject));\n        }\n        if (rowsToRender !== void 0 && visibleRowIndex === rowsToRender) {\n          // We have as much rows as needed for this clone\n          break;\n        }\n        TR = this.getOrCreateTrForRow(visibleRowIndex, TR);\n\n        // Render row headers\n        this.renderRowHeaders(sourceRowIndex, TR);\n        // Add and/or remove TDs to TR to match the desired number\n        this.adjustColumns(TR, columnsToRender + this.rowHeaderCount);\n\n        lastTD = this.renderCells(sourceRowIndex, TR, columnsToRender);\n\n        if (!isWorkingOnClone ||\n        // Necessary to refresh oversized row heights after editing cell in overlays\n        this.wot.isOverlayName(_base2.default.CLONE_BOTTOM)) {\n          // Reset the oversized row cache for this row\n          this.resetOversizedRow(sourceRowIndex);\n        }\n\n        if (TR.firstChild) {\n          // if I have 2 fixed columns with one-line content and the 3rd column has a multiline content, this is\n          // the way to make sure that the overlay will has same row height\n          var height = this.wot.wtTable.getRowHeight(sourceRowIndex);\n\n          if (height) {\n            // Decrease height. 1 pixel will be \"replaced\" by 1px border top\n            height--;\n            TR.firstChild.style.height = height + 'px';\n          } else {\n            TR.firstChild.style.height = '';\n          }\n        }\n        visibleRowIndex++;\n        sourceRowIndex = this.rowFilter.renderedToSource(visibleRowIndex);\n      }\n    }\n\n    /**\n     * Reset the oversized row cache for the provided index\n     *\n     * @param {Number} sourceRow Row index\n     */\n\n  }, {\n    key: 'resetOversizedRow',\n    value: function resetOversizedRow(sourceRow) {\n      if (this.wot.getSetting('externalRowCalculator')) {\n        return;\n      }\n      if (this.wot.wtViewport.oversizedRows && this.wot.wtViewport.oversizedRows[sourceRow]) {\n        this.wot.wtViewport.oversizedRows[sourceRow] = void 0;\n      }\n    }\n\n    /**\n     * Check if any of the rendered rows is higher than expected, and if so, cache them\n     */\n\n  }, {\n    key: 'markOversizedRows',\n    value: function markOversizedRows() {\n      if (this.wot.getSetting('externalRowCalculator')) {\n        return;\n      }\n      var rowCount = this.instance.wtTable.TBODY.childNodes.length;\n      var expectedTableHeight = rowCount * this.instance.wtSettings.settings.defaultRowHeight;\n      var actualTableHeight = (0, _element.innerHeight)(this.instance.wtTable.TBODY) - 1;\n      var previousRowHeight = void 0;\n      var rowInnerHeight = void 0;\n      var sourceRowIndex = void 0;\n      var currentTr = void 0;\n      var rowHeader = void 0;\n      var totalRows = this.instance.getSetting('totalRows');\n\n      if (expectedTableHeight === actualTableHeight && !this.instance.getSetting('fixedRowsBottom')) {\n        // If the actual table height equals rowCount * default single row height, no row is oversized -> no need to iterate over them\n        return;\n      }\n\n      while (rowCount) {\n        rowCount--;\n        sourceRowIndex = this.instance.wtTable.rowFilter.renderedToSource(rowCount);\n        previousRowHeight = this.instance.wtTable.getRowHeight(sourceRowIndex);\n        currentTr = this.instance.wtTable.getTrForRow(sourceRowIndex);\n        rowHeader = currentTr.querySelector('th');\n\n        if (rowHeader) {\n          rowInnerHeight = (0, _element.innerHeight)(rowHeader);\n        } else {\n          rowInnerHeight = (0, _element.innerHeight)(currentTr) - 1;\n        }\n\n        if (!previousRowHeight && this.instance.wtSettings.settings.defaultRowHeight < rowInnerHeight || previousRowHeight < rowInnerHeight) {\n          this.instance.wtViewport.oversizedRows[sourceRowIndex] = ++rowInnerHeight;\n        }\n      }\n    }\n\n    /**\n     * Check if any of the rendered columns is higher than expected, and if so, cache them.\n     */\n\n  }, {\n    key: 'markOversizedColumnHeaders',\n    value: function markOversizedColumnHeaders() {\n      var overlayName = this.wot.getOverlayName();\n\n      if (!this.columnHeaderCount || this.wot.wtViewport.hasOversizedColumnHeadersMarked[overlayName] || this.wtTable.isWorkingOnClone()) {\n        return;\n      }\n      var columnCount = this.wtTable.getRenderedColumnsCount();\n\n      for (var i = 0; i < this.columnHeaderCount; i++) {\n        for (var renderedColumnIndex = -1 * this.rowHeaderCount; renderedColumnIndex < columnCount; renderedColumnIndex++) {\n          this.markIfOversizedColumnHeader(renderedColumnIndex);\n        }\n      }\n      this.wot.wtViewport.hasOversizedColumnHeadersMarked[overlayName] = true;\n    }\n\n    /**\n     *\n     */\n\n  }, {\n    key: 'adjustColumnHeaderHeights',\n    value: function adjustColumnHeaderHeights() {\n      var columnHeaders = this.wot.getSetting('columnHeaders');\n      var children = this.wot.wtTable.THEAD.childNodes;\n      var oversizedColumnHeaders = this.wot.wtViewport.oversizedColumnHeaders;\n\n      for (var i = 0, len = columnHeaders.length; i < len; i++) {\n        if (oversizedColumnHeaders[i]) {\n          if (!children[i] || children[i].childNodes.length === 0) {\n            return;\n          }\n          children[i].childNodes[0].style.height = oversizedColumnHeaders[i] + 'px';\n        }\n      }\n    }\n\n    /**\n     * Check if column header for the specified column is higher than expected, and if so, cache it\n     *\n     * @param {Number} col Index of column\n     */\n\n  }, {\n    key: 'markIfOversizedColumnHeader',\n    value: function markIfOversizedColumnHeader(col) {\n      var sourceColIndex = this.wot.wtTable.columnFilter.renderedToSource(col);\n      var level = this.columnHeaderCount;\n      var defaultRowHeight = this.wot.wtSettings.settings.defaultRowHeight;\n      var previousColHeaderHeight = void 0;\n      var currentHeader = void 0;\n      var currentHeaderHeight = void 0;\n      var columnHeaderHeightSetting = this.wot.getSetting('columnHeaderHeight') || [];\n\n      while (level) {\n        level--;\n\n        previousColHeaderHeight = this.wot.wtTable.getColumnHeaderHeight(level);\n        currentHeader = this.wot.wtTable.getColumnHeader(sourceColIndex, level);\n\n        if (!currentHeader) {\n          /* eslint-disable no-continue */\n          continue;\n        }\n        currentHeaderHeight = (0, _element.innerHeight)(currentHeader);\n\n        if (!previousColHeaderHeight && defaultRowHeight < currentHeaderHeight || previousColHeaderHeight < currentHeaderHeight) {\n          this.wot.wtViewport.oversizedColumnHeaders[level] = currentHeaderHeight;\n        }\n\n        if (Array.isArray(columnHeaderHeightSetting)) {\n          if (columnHeaderHeightSetting[level] != null) {\n            this.wot.wtViewport.oversizedColumnHeaders[level] = columnHeaderHeightSetting[level];\n          }\n        } else if (!isNaN(columnHeaderHeightSetting)) {\n          this.wot.wtViewport.oversizedColumnHeaders[level] = columnHeaderHeightSetting;\n        }\n\n        if (this.wot.wtViewport.oversizedColumnHeaders[level] < (columnHeaderHeightSetting[level] || columnHeaderHeightSetting)) {\n          this.wot.wtViewport.oversizedColumnHeaders[level] = columnHeaderHeightSetting[level] || columnHeaderHeightSetting;\n        }\n      }\n    }\n\n    /**\n     * @param {Number} sourceRowIndex\n     * @param {HTMLTableRowElement} TR\n     * @param {Number} columnsToRender\n     * @returns {HTMLTableCellElement}\n     */\n\n  }, {\n    key: 'renderCells',\n    value: function renderCells(sourceRowIndex, TR, columnsToRender) {\n      var TD = void 0;\n      var sourceColIndex = void 0;\n\n      for (var visibleColIndex = 0; visibleColIndex < columnsToRender; visibleColIndex++) {\n        sourceColIndex = this.columnFilter.renderedToSource(visibleColIndex);\n\n        if (visibleColIndex === 0) {\n          TD = TR.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(sourceColIndex)];\n        } else {\n          TD = TD.nextSibling; // http://jsperf.com/nextsibling-vs-indexed-childnodes\n        }\n        // If the number of headers has been reduced, we need to replace excess TH with TD\n        if (TD.nodeName == 'TH') {\n          TD = replaceThWithTd(TD, TR);\n        }\n        if (!(0, _element.hasClass)(TD, 'hide')) {\n          TD.className = '';\n        }\n        TD.removeAttribute('style');\n        this.wot.wtSettings.settings.cellRenderer(sourceRowIndex, sourceColIndex, TD);\n      }\n\n      return TD;\n    }\n\n    /**\n     * @param {Number} columnsToRender Number of columns to render.\n     */\n\n  }, {\n    key: 'adjustColumnWidths',\n    value: function adjustColumnWidths(columnsToRender) {\n      var scrollbarCompensation = 0;\n      var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot;\n      var mainHolder = sourceInstance.wtTable.holder;\n      var defaultColumnWidth = this.wot.getSetting('defaultColumnWidth');\n      var rowHeaderWidthSetting = this.wot.getSetting('rowHeaderWidth');\n\n      if (mainHolder.offsetHeight < mainHolder.scrollHeight) {\n        scrollbarCompensation = (0, _element.getScrollbarWidth)();\n      }\n      this.wot.wtViewport.columnsRenderCalculator.refreshStretching(this.wot.wtViewport.getViewportWidth() - scrollbarCompensation);\n\n      rowHeaderWidthSetting = this.instance.getSetting('onModifyRowHeaderWidth', rowHeaderWidthSetting);\n\n      if (rowHeaderWidthSetting != null) {\n        for (var i = 0; i < this.rowHeaderCount; i++) {\n          var width = Array.isArray(rowHeaderWidthSetting) ? rowHeaderWidthSetting[i] : rowHeaderWidthSetting;\n\n          width = width == null ? defaultColumnWidth : width;\n\n          this.COLGROUP.childNodes[i].style.width = width + 'px';\n        }\n      }\n\n      for (var renderedColIndex = 0; renderedColIndex < columnsToRender; renderedColIndex++) {\n        var _width2 = this.wtTable.getStretchedColumnWidth(this.columnFilter.renderedToSource(renderedColIndex));\n\n        this.COLGROUP.childNodes[renderedColIndex + this.rowHeaderCount].style.width = _width2 + 'px';\n      }\n    }\n\n    /**\n     * @param {HTMLTableCellElement} TR\n     */\n\n  }, {\n    key: 'appendToTbody',\n    value: function appendToTbody(TR) {\n      this.TBODY.appendChild(TR);\n      this.wtTable.tbodyChildrenLength++;\n    }\n\n    /**\n     * @param {Number} rowIndex\n     * @param {HTMLTableRowElement} currentTr\n     * @returns {HTMLTableCellElement}\n     */\n\n  }, {\n    key: 'getOrCreateTrForRow',\n    value: function getOrCreateTrForRow(rowIndex, currentTr) {\n      var TR = void 0;\n\n      if (rowIndex >= this.wtTable.tbodyChildrenLength) {\n        TR = this.createRow();\n        this.appendToTbody(TR);\n      } else if (rowIndex === 0) {\n        TR = this.TBODY.firstChild;\n      } else {\n        // http://jsperf.com/nextsibling-vs-indexed-childnodes\n        TR = currentTr.nextSibling;\n      }\n      if (TR.className) {\n        TR.removeAttribute('class');\n      }\n\n      return TR;\n    }\n\n    /**\n     * @returns {HTMLTableCellElement}\n     */\n\n  }, {\n    key: 'createRow',\n    value: function createRow() {\n      var TR = document.createElement('TR');\n\n      for (var visibleColIndex = 0; visibleColIndex < this.rowHeaderCount; visibleColIndex++) {\n        TR.appendChild(document.createElement('TH'));\n      }\n\n      return TR;\n    }\n\n    /**\n     * @param {Number} row\n     * @param {Number} col\n     * @param {HTMLTableCellElement} TH\n     */\n\n  }, {\n    key: 'renderRowHeader',\n    value: function renderRowHeader(row, col, TH) {\n      TH.className = '';\n      TH.removeAttribute('style');\n      this.rowHeaders[col](row, TH, col);\n    }\n\n    /**\n     * @param {Number} row\n     * @param {HTMLTableCellElement} TR\n     */\n\n  }, {\n    key: 'renderRowHeaders',\n    value: function renderRowHeaders(row, TR) {\n      for (var TH = TR.firstChild, visibleColIndex = 0; visibleColIndex < this.rowHeaderCount; visibleColIndex++) {\n        // If the number of row headers increased we need to create TH or replace an existing TD node with TH\n        if (!TH) {\n          TH = document.createElement('TH');\n          TR.appendChild(TH);\n        } else if (TH.nodeName == 'TD') {\n          TH = replaceTdWithTh(TH, TR);\n        }\n        this.renderRowHeader(row, visibleColIndex, TH);\n        // http://jsperf.com/nextsibling-vs-indexed-childnodes\n        TH = TH.nextSibling;\n      }\n    }\n\n    /**\n     * Adjust the number of COL and TH elements to match the number of columns and headers that need to be rendered\n     */\n\n  }, {\n    key: 'adjustAvailableNodes',\n    value: function adjustAvailableNodes() {\n      this.adjustColGroups();\n      this.adjustThead();\n    }\n\n    /**\n     * Renders the column headers\n     */\n\n  }, {\n    key: 'renderColumnHeaders',\n    value: function renderColumnHeaders() {\n      if (!this.columnHeaderCount) {\n        return;\n      }\n      var columnCount = this.wtTable.getRenderedColumnsCount();\n\n      for (var i = 0; i < this.columnHeaderCount; i++) {\n        var TR = this.getTrForColumnHeaders(i);\n\n        for (var renderedColumnIndex = -1 * this.rowHeaderCount; renderedColumnIndex < columnCount; renderedColumnIndex++) {\n          var sourceCol = this.columnFilter.renderedToSource(renderedColumnIndex);\n\n          this.renderColumnHeader(i, sourceCol, TR.childNodes[renderedColumnIndex + this.rowHeaderCount]);\n        }\n      }\n    }\n\n    /**\n     * Adjusts the number of COL elements to match the number of columns that need to be rendered\n     */\n\n  }, {\n    key: 'adjustColGroups',\n    value: function adjustColGroups() {\n      var columnCount = this.wtTable.getRenderedColumnsCount();\n\n      while (this.wtTable.colgroupChildrenLength < columnCount + this.rowHeaderCount) {\n        this.COLGROUP.appendChild(document.createElement('COL'));\n        this.wtTable.colgroupChildrenLength++;\n      }\n      while (this.wtTable.colgroupChildrenLength > columnCount + this.rowHeaderCount) {\n        this.COLGROUP.removeChild(this.COLGROUP.lastChild);\n        this.wtTable.colgroupChildrenLength--;\n      }\n      if (this.rowHeaderCount) {\n        (0, _element.addClass)(this.COLGROUP.childNodes[0], 'rowHeader');\n      }\n    }\n\n    /**\n     * Adjusts the number of TH elements in THEAD to match the number of headers and columns that need to be rendered\n     */\n\n  }, {\n    key: 'adjustThead',\n    value: function adjustThead() {\n      var columnCount = this.wtTable.getRenderedColumnsCount();\n      var TR = this.THEAD.firstChild;\n\n      if (this.columnHeaders.length) {\n        for (var i = 0, len = this.columnHeaders.length; i < len; i++) {\n          TR = this.THEAD.childNodes[i];\n\n          if (!TR) {\n            TR = document.createElement('TR');\n            this.THEAD.appendChild(TR);\n          }\n          this.theadChildrenLength = TR.childNodes.length;\n\n          while (this.theadChildrenLength < columnCount + this.rowHeaderCount) {\n            TR.appendChild(document.createElement('TH'));\n            this.theadChildrenLength++;\n          }\n          while (this.theadChildrenLength > columnCount + this.rowHeaderCount) {\n            TR.removeChild(TR.lastChild);\n            this.theadChildrenLength--;\n          }\n        }\n        var theadChildrenLength = this.THEAD.childNodes.length;\n\n        if (theadChildrenLength > this.columnHeaders.length) {\n          for (var _i2 = this.columnHeaders.length; _i2 < theadChildrenLength; _i2++) {\n            this.THEAD.removeChild(this.THEAD.lastChild);\n          }\n        }\n      } else if (TR) {\n        (0, _element.empty)(TR);\n      }\n    }\n\n    /**\n     * @param {Number} index\n     * @returns {HTMLTableCellElement}\n     */\n\n  }, {\n    key: 'getTrForColumnHeaders',\n    value: function getTrForColumnHeaders(index) {\n      return this.THEAD.childNodes[index];\n    }\n\n    /**\n     * @param {Number} row\n     * @param {Number} col\n     * @param {HTMLTableCellElement} TH\n     * @returns {*}\n     */\n\n  }, {\n    key: 'renderColumnHeader',\n    value: function renderColumnHeader(row, col, TH) {\n      TH.className = '';\n      TH.removeAttribute('style');\n\n      return this.columnHeaders[row](col, TH, row);\n    }\n\n    /**\n     * Add and/or remove the TDs to match the desired number\n     *\n     * @param {HTMLTableCellElement} TR Table row in question\n     * @param {Number} desiredCount The desired number of TDs in the TR\n     */\n\n  }, {\n    key: 'adjustColumns',\n    value: function adjustColumns(TR, desiredCount) {\n      var count = TR.childNodes.length;\n\n      while (count < desiredCount) {\n        var TD = document.createElement('TD');\n\n        TR.appendChild(TD);\n        count++;\n      }\n      while (count > desiredCount) {\n        TR.removeChild(TR.lastChild);\n        count--;\n      }\n    }\n\n    /**\n     * @param {Number} columnsToRender\n     */\n\n  }, {\n    key: 'removeRedundantColumns',\n    value: function removeRedundantColumns(columnsToRender) {\n      while (this.wtTable.tbodyChildrenLength > columnsToRender) {\n        this.TBODY.removeChild(this.TBODY.lastChild);\n        this.wtTable.tbodyChildrenLength--;\n      }\n    }\n  }]);\n\n  return TableRenderer;\n}();\n\nfunction replaceTdWithTh(TD, TR) {\n  var TH = document.createElement('TH');\n\n  TR.insertBefore(TH, TD);\n  TR.removeChild(TD);\n\n  return TH;\n}\n\nfunction replaceThWithTd(TH, TR) {\n  var TD = document.createElement('TD');\n\n  TR.insertBefore(TD, TH);\n  TR.removeChild(TH);\n\n  return TD;\n}\n\nexports.default = TableRenderer;\n\n/***/ }),\n/* 305 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _viewportColumns = __webpack_require__(175);\n\nvar _viewportColumns2 = _interopRequireDefault(_viewportColumns);\n\nvar _viewportRows = __webpack_require__(176);\n\nvar _viewportRows2 = _interopRequireDefault(_viewportRows);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Viewport\n */\nvar Viewport = function () {\n  /**\n   * @param wotInstance\n   */\n  function Viewport(wotInstance) {\n    var _this = this;\n\n    _classCallCheck(this, Viewport);\n\n    this.wot = wotInstance;\n    // legacy support\n    this.instance = this.wot;\n\n    this.oversizedRows = [];\n    this.oversizedColumnHeaders = [];\n    this.hasOversizedColumnHeadersMarked = {};\n    this.clientHeight = 0;\n    this.containerWidth = NaN;\n    this.rowHeaderWidth = NaN;\n    this.rowsVisibleCalculator = null;\n    this.columnsVisibleCalculator = null;\n\n    this.eventManager = new _eventManager2.default(this.wot);\n    this.eventManager.addEventListener(window, 'resize', function () {\n      _this.clientHeight = _this.getWorkspaceHeight();\n    });\n  }\n\n  /**\n   * @returns {number}\n   */\n\n\n  _createClass(Viewport, [{\n    key: 'getWorkspaceHeight',\n    value: function getWorkspaceHeight() {\n      var trimmingContainer = this.instance.wtOverlays.topOverlay.trimmingContainer;\n      var elemHeight = void 0;\n      var height = 0;\n\n      if (trimmingContainer === window) {\n        height = document.documentElement.clientHeight;\n      } else {\n        elemHeight = (0, _element.outerHeight)(trimmingContainer);\n        // returns height without DIV scrollbar\n        height = elemHeight > 0 && trimmingContainer.clientHeight > 0 ? trimmingContainer.clientHeight : Infinity;\n      }\n\n      return height;\n    }\n  }, {\n    key: 'getWorkspaceWidth',\n    value: function getWorkspaceWidth() {\n      var width = void 0;\n      var totalColumns = this.wot.getSetting('totalColumns');\n      var trimmingContainer = this.instance.wtOverlays.leftOverlay.trimmingContainer;\n      var overflow = void 0;\n      var stretchSetting = this.wot.getSetting('stretchH');\n      var docOffsetWidth = document.documentElement.offsetWidth;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (preventOverflow) {\n        return (0, _element.outerWidth)(this.instance.wtTable.wtRootElement);\n      }\n\n      if (this.wot.getSetting('freezeOverlays')) {\n        width = Math.min(docOffsetWidth - this.getWorkspaceOffset().left, docOffsetWidth);\n      } else {\n        width = Math.min(this.getContainerFillWidth(), docOffsetWidth - this.getWorkspaceOffset().left, docOffsetWidth);\n      }\n\n      if (trimmingContainer === window && totalColumns > 0 && this.sumColumnWidths(0, totalColumns - 1) > width) {\n        // in case sum of column widths is higher than available stylesheet width, let's assume using the whole window\n        // otherwise continue below, which will allow stretching\n        // this is used in `scroll_window.html`\n        // TODO test me\n        return document.documentElement.clientWidth;\n      }\n\n      if (trimmingContainer !== window) {\n        overflow = (0, _element.getStyle)(this.instance.wtOverlays.leftOverlay.trimmingContainer, 'overflow');\n\n        if (overflow == 'scroll' || overflow == 'hidden' || overflow == 'auto') {\n          // this is used in `scroll.html`\n          // TODO test me\n          return Math.max(width, trimmingContainer.clientWidth);\n        }\n      }\n\n      if (stretchSetting === 'none' || !stretchSetting) {\n        // if no stretching is used, return the maximum used workspace width\n        return Math.max(width, (0, _element.outerWidth)(this.instance.wtTable.TABLE));\n      }\n\n      // if stretching is used, return the actual container width, so the columns can fit inside it\n      return width;\n    }\n\n    /**\n     * Checks if viewport has vertical scroll\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasVerticalScroll',\n    value: function hasVerticalScroll() {\n      return this.getWorkspaceActualHeight() > this.getWorkspaceHeight();\n    }\n\n    /**\n     * Checks if viewport has horizontal scroll\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasHorizontalScroll',\n    value: function hasHorizontalScroll() {\n      return this.getWorkspaceActualWidth() > this.getWorkspaceWidth();\n    }\n\n    /**\n     * @param from\n     * @param length\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'sumColumnWidths',\n    value: function sumColumnWidths(from, length) {\n      var sum = 0;\n\n      while (from < length) {\n        sum += this.wot.wtTable.getColumnWidth(from);\n        from++;\n      }\n\n      return sum;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getContainerFillWidth',\n    value: function getContainerFillWidth() {\n      if (this.containerWidth) {\n        return this.containerWidth;\n      }\n      var mainContainer = this.instance.wtTable.holder;\n      var fillWidth = void 0;\n      var dummyElement = void 0;\n\n      dummyElement = document.createElement('div');\n      dummyElement.style.width = '100%';\n      dummyElement.style.height = '1px';\n      mainContainer.appendChild(dummyElement);\n      fillWidth = dummyElement.offsetWidth;\n\n      this.containerWidth = fillWidth;\n      mainContainer.removeChild(dummyElement);\n\n      return fillWidth;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getWorkspaceOffset',\n    value: function getWorkspaceOffset() {\n      return (0, _element.offset)(this.wot.wtTable.TABLE);\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getWorkspaceActualHeight',\n    value: function getWorkspaceActualHeight() {\n      return (0, _element.outerHeight)(this.wot.wtTable.TABLE);\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getWorkspaceActualWidth',\n    value: function getWorkspaceActualWidth() {\n      return (0, _element.outerWidth)(this.wot.wtTable.TABLE) || (0, _element.outerWidth)(this.wot.wtTable.TBODY) || (0, _element.outerWidth)(this.wot.wtTable.THEAD); // IE8 reports 0 as <table> offsetWidth;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getColumnHeaderHeight',\n    value: function getColumnHeaderHeight() {\n      if (isNaN(this.columnHeaderHeight)) {\n        this.columnHeaderHeight = (0, _element.outerHeight)(this.wot.wtTable.THEAD);\n      }\n\n      return this.columnHeaderHeight;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getViewportHeight',\n    value: function getViewportHeight() {\n      var containerHeight = this.getWorkspaceHeight();\n      var columnHeaderHeight = void 0;\n\n      if (containerHeight === Infinity) {\n        return containerHeight;\n      }\n      columnHeaderHeight = this.getColumnHeaderHeight();\n\n      if (columnHeaderHeight > 0) {\n        containerHeight -= columnHeaderHeight;\n      }\n\n      return containerHeight;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getRowHeaderWidth',\n    value: function getRowHeaderWidth() {\n      var rowHeadersHeightSetting = this.instance.getSetting('rowHeaderWidth');\n      var rowHeaders = this.instance.getSetting('rowHeaders');\n\n      if (rowHeadersHeightSetting) {\n        this.rowHeaderWidth = 0;\n\n        for (var i = 0, len = rowHeaders.length; i < len; i++) {\n          this.rowHeaderWidth += rowHeadersHeightSetting[i] || rowHeadersHeightSetting;\n        }\n      }\n\n      if (this.wot.cloneSource) {\n        return this.wot.cloneSource.wtViewport.getRowHeaderWidth();\n      }\n\n      if (isNaN(this.rowHeaderWidth)) {\n\n        if (rowHeaders.length) {\n          var TH = this.instance.wtTable.TABLE.querySelector('TH');\n          this.rowHeaderWidth = 0;\n\n          for (var _i = 0, _len = rowHeaders.length; _i < _len; _i++) {\n            if (TH) {\n              this.rowHeaderWidth += (0, _element.outerWidth)(TH);\n              TH = TH.nextSibling;\n            } else {\n              // yes this is a cheat but it worked like that before, just taking assumption from CSS instead of measuring.\n              // TODO: proper fix\n              this.rowHeaderWidth += 50;\n            }\n          }\n        } else {\n          this.rowHeaderWidth = 0;\n        }\n      }\n\n      this.rowHeaderWidth = this.instance.getSetting('onModifyRowHeaderWidth', this.rowHeaderWidth) || this.rowHeaderWidth;\n\n      return this.rowHeaderWidth;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getViewportWidth',\n    value: function getViewportWidth() {\n      var containerWidth = this.getWorkspaceWidth();\n      var rowHeaderWidth = void 0;\n\n      if (containerWidth === Infinity) {\n        return containerWidth;\n      }\n      rowHeaderWidth = this.getRowHeaderWidth();\n\n      if (rowHeaderWidth > 0) {\n        return containerWidth - rowHeaderWidth;\n      }\n\n      return containerWidth;\n    }\n\n    /**\n     * Creates:\n     *  - rowsRenderCalculator (before draw, to qualify rows for rendering)\n     *  - rowsVisibleCalculator (after draw, to measure which rows are actually visible)\n     *\n     * @returns {ViewportRowsCalculator}\n     */\n\n  }, {\n    key: 'createRowsCalculator',\n    value: function createRowsCalculator() {\n      var _this2 = this;\n\n      var visible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      var height = void 0;\n      var pos = void 0;\n      var fixedRowsTop = void 0;\n      var scrollbarHeight = void 0;\n      var fixedRowsBottom = void 0;\n      var fixedRowsHeight = void 0;\n      var totalRows = void 0;\n\n      this.rowHeaderWidth = NaN;\n\n      if (this.wot.wtSettings.settings.renderAllRows && !visible) {\n        height = Infinity;\n      } else {\n        height = this.getViewportHeight();\n      }\n      pos = this.wot.wtOverlays.topOverlay.getScrollPosition() - this.wot.wtOverlays.topOverlay.getTableParentOffset();\n\n      if (pos < 0) {\n        pos = 0;\n      }\n      fixedRowsTop = this.wot.getSetting('fixedRowsTop');\n      fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');\n      totalRows = this.wot.getSetting('totalRows');\n\n      if (fixedRowsTop) {\n        fixedRowsHeight = this.wot.wtOverlays.topOverlay.sumCellSizes(0, fixedRowsTop);\n        pos += fixedRowsHeight;\n        height -= fixedRowsHeight;\n      }\n\n      if (fixedRowsBottom && this.wot.wtOverlays.bottomOverlay.clone) {\n        fixedRowsHeight = this.wot.wtOverlays.bottomOverlay.sumCellSizes(totalRows - fixedRowsBottom, totalRows);\n\n        height -= fixedRowsHeight;\n      }\n\n      if (this.wot.wtTable.holder.clientHeight === this.wot.wtTable.holder.offsetHeight) {\n        scrollbarHeight = 0;\n      } else {\n        scrollbarHeight = (0, _element.getScrollbarWidth)();\n      }\n\n      return new _viewportRows2.default(height, pos, this.wot.getSetting('totalRows'), function (sourceRow) {\n        return _this2.wot.wtTable.getRowHeight(sourceRow);\n      }, visible ? null : this.wot.wtSettings.settings.viewportRowCalculatorOverride, visible, scrollbarHeight);\n    }\n\n    /**\n     * Creates:\n     *  - columnsRenderCalculator (before draw, to qualify columns for rendering)\n     *  - columnsVisibleCalculator (after draw, to measure which columns are actually visible)\n     *\n     * @returns {ViewportRowsCalculator}\n     */\n\n  }, {\n    key: 'createColumnsCalculator',\n    value: function createColumnsCalculator() {\n      var _this3 = this;\n\n      var visible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      var width = this.getViewportWidth();\n      var pos = void 0;\n      var fixedColumnsLeft = void 0;\n\n      this.columnHeaderHeight = NaN;\n\n      pos = this.wot.wtOverlays.leftOverlay.getScrollPosition() - this.wot.wtOverlays.leftOverlay.getTableParentOffset();\n\n      if (pos < 0) {\n        pos = 0;\n      }\n      fixedColumnsLeft = this.wot.getSetting('fixedColumnsLeft');\n\n      if (fixedColumnsLeft) {\n        var fixedColumnsWidth = this.wot.wtOverlays.leftOverlay.sumCellSizes(0, fixedColumnsLeft);\n        pos += fixedColumnsWidth;\n        width -= fixedColumnsWidth;\n      }\n      if (this.wot.wtTable.holder.clientWidth !== this.wot.wtTable.holder.offsetWidth) {\n        width -= (0, _element.getScrollbarWidth)();\n      }\n\n      return new _viewportColumns2.default(width, pos, this.wot.getSetting('totalColumns'), function (sourceCol) {\n        return _this3.wot.wtTable.getColumnWidth(sourceCol);\n      }, visible ? null : this.wot.wtSettings.settings.viewportColumnCalculatorOverride, visible, this.wot.getSetting('stretchH'), function (stretchedWidth, column) {\n        return _this3.wot.getSetting('onBeforeStretchingColumnWidth', stretchedWidth, column);\n      });\n    }\n\n    /**\n     * Creates rowsRenderCalculator and columnsRenderCalculator (before draw, to determine what rows and\n     * cols should be rendered)\n     *\n     * @param fastDraw {Boolean} If `true`, will try to avoid full redraw and only update the border positions.\n     *                           If `false` or `undefined`, will perform a full redraw\n     * @returns fastDraw {Boolean} The fastDraw value, possibly modified\n     */\n\n  }, {\n    key: 'createRenderCalculators',\n    value: function createRenderCalculators() {\n      var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (fastDraw) {\n        var proposedRowsVisibleCalculator = this.createRowsCalculator(true);\n        var proposedColumnsVisibleCalculator = this.createColumnsCalculator(true);\n\n        if (!(this.areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator) && this.areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator))) {\n          fastDraw = false;\n        }\n      }\n\n      if (!fastDraw) {\n        this.rowsRenderCalculator = this.createRowsCalculator();\n        this.columnsRenderCalculator = this.createColumnsCalculator();\n      }\n      // delete temporarily to make sure that renderers always use rowsRenderCalculator, not rowsVisibleCalculator\n      this.rowsVisibleCalculator = null;\n      this.columnsVisibleCalculator = null;\n\n      return fastDraw;\n    }\n\n    /**\n     * Creates rowsVisibleCalculator and columnsVisibleCalculator (after draw, to determine what are\n     * the actually visible rows and columns)\n     */\n\n  }, {\n    key: 'createVisibleCalculators',\n    value: function createVisibleCalculators() {\n      this.rowsVisibleCalculator = this.createRowsCalculator(true);\n      this.columnsVisibleCalculator = this.createColumnsCalculator(true);\n    }\n\n    /**\n     * Returns information whether proposedRowsVisibleCalculator viewport\n     * is contained inside rows rendered in previous draw (cached in rowsRenderCalculator)\n     *\n     * @param {Object} proposedRowsVisibleCalculator\n     * @returns {Boolean} Returns `true` if all proposed visible rows are already rendered (meaning: redraw is not needed).\n     *                    Returns `false` if at least one proposed visible row is not already rendered (meaning: redraw is needed)\n     */\n\n  }, {\n    key: 'areAllProposedVisibleRowsAlreadyRendered',\n    value: function areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator) {\n      if (this.rowsVisibleCalculator) {\n        if (proposedRowsVisibleCalculator.startRow < this.rowsRenderCalculator.startRow || proposedRowsVisibleCalculator.startRow === this.rowsRenderCalculator.startRow && proposedRowsVisibleCalculator.startRow > 0) {\n          return false;\n        } else if (proposedRowsVisibleCalculator.endRow > this.rowsRenderCalculator.endRow || proposedRowsVisibleCalculator.endRow === this.rowsRenderCalculator.endRow && proposedRowsVisibleCalculator.endRow < this.wot.getSetting('totalRows') - 1) {\n          return false;\n        }\n        return true;\n      }\n\n      return false;\n    }\n\n    /**\n     * Returns information whether proposedColumnsVisibleCalculator viewport\n     * is contained inside column rendered in previous draw (cached in columnsRenderCalculator)\n     *\n     * @param {Object} proposedColumnsVisibleCalculator\n     * @returns {Boolean} Returns `true` if all proposed visible columns are already rendered (meaning: redraw is not needed).\n     *                    Returns `false` if at least one proposed visible column is not already rendered (meaning: redraw is needed)\n     */\n\n  }, {\n    key: 'areAllProposedVisibleColumnsAlreadyRendered',\n    value: function areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator) {\n      if (this.columnsVisibleCalculator) {\n        if (proposedColumnsVisibleCalculator.startColumn < this.columnsRenderCalculator.startColumn || proposedColumnsVisibleCalculator.startColumn === this.columnsRenderCalculator.startColumn && proposedColumnsVisibleCalculator.startColumn > 0) {\n          return false;\n        } else if (proposedColumnsVisibleCalculator.endColumn > this.columnsRenderCalculator.endColumn || proposedColumnsVisibleCalculator.endColumn === this.columnsRenderCalculator.endColumn && proposedColumnsVisibleCalculator.endColumn < this.wot.getSetting('totalColumns') - 1) {\n          return false;\n        }\n        return true;\n      }\n\n      return false;\n    }\n\n    /**\n     * Resets values in keys of the hasOversizedColumnHeadersMarked object after updateSettings.\n     */\n\n  }, {\n    key: 'resetHasOversizedColumnHeadersMarked',\n    value: function resetHasOversizedColumnHeadersMarked() {\n      (0, _object.objectEach)(this.hasOversizedColumnHeadersMarked, function (value, key, object) {\n        object[key] = void 0;\n      });\n    }\n  }]);\n\n  return Viewport;\n}();\n\nexports.default = Viewport;\n\n/***/ }),\n/* 306 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _event = __webpack_require__(12);\n\nvar _object = __webpack_require__(2);\n\nvar _browser = __webpack_require__(27);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _coords = __webpack_require__(55);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n *\n */\nvar Border = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   * @param {Object} settings\n   */\n  function Border(wotInstance, settings) {\n    _classCallCheck(this, Border);\n\n    if (!settings) {\n      return;\n    }\n    this.eventManager = new _eventManager2.default(wotInstance);\n    this.instance = wotInstance;\n    this.wot = wotInstance;\n    this.settings = settings;\n    this.mouseDown = false;\n    this.main = null;\n\n    this.top = null;\n    this.left = null;\n    this.bottom = null;\n    this.right = null;\n\n    this.topStyle = null;\n    this.leftStyle = null;\n    this.bottomStyle = null;\n    this.rightStyle = null;\n\n    this.cornerDefaultStyle = {\n      width: '6px',\n      height: '6px',\n      borderWidth: '1px',\n      borderStyle: 'solid',\n      borderColor: '#FFF'\n    };\n    this.corner = null;\n    this.cornerStyle = null;\n\n    this.createBorders(settings);\n    this.registerListeners();\n  }\n\n  /**\n   * Register all necessary events\n   */\n\n\n  _createClass(Border, [{\n    key: 'registerListeners',\n    value: function registerListeners() {\n      var _this2 = this;\n\n      this.eventManager.addEventListener(document.body, 'mousedown', function () {\n        return _this2.onMouseDown();\n      });\n      this.eventManager.addEventListener(document.body, 'mouseup', function () {\n        return _this2.onMouseUp();\n      });\n\n      var _loop = function _loop(c, len) {\n        _this2.eventManager.addEventListener(_this2.main.childNodes[c], 'mouseenter', function (event) {\n          return _this2.onMouseEnter(event, _this2.main.childNodes[c]);\n        });\n      };\n\n      for (var c = 0, len = this.main.childNodes.length; c < len; c++) {\n        _loop(c, len);\n      }\n    }\n\n    /**\n     * Mouse down listener\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseDown',\n    value: function onMouseDown() {\n      this.mouseDown = true;\n    }\n\n    /**\n     * Mouse up listener\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      this.mouseDown = false;\n    }\n\n    /**\n     * Mouse enter listener for fragment selection functionality.\n     *\n     * @private\n     * @param {Event} event Dom event\n     * @param {HTMLElement} parentElement Part of border element.\n     */\n\n  }, {\n    key: 'onMouseEnter',\n    value: function onMouseEnter(event, parentElement) {\n      if (!this.mouseDown || !this.wot.getSetting('hideBorderOnMouseDownOver')) {\n        return;\n      }\n      event.preventDefault();\n      (0, _event.stopImmediatePropagation)(event);\n\n      var _this = this;\n      var bounds = parentElement.getBoundingClientRect();\n      // Hide border to prevents selection jumping when fragmentSelection is enabled.\n      parentElement.style.display = 'none';\n\n      function isOutside(event) {\n        if (event.clientY < Math.floor(bounds.top)) {\n          return true;\n        }\n        if (event.clientY > Math.ceil(bounds.top + bounds.height)) {\n          return true;\n        }\n        if (event.clientX < Math.floor(bounds.left)) {\n          return true;\n        }\n        if (event.clientX > Math.ceil(bounds.left + bounds.width)) {\n          return true;\n        }\n      }\n\n      function handler(event) {\n        if (isOutside(event)) {\n          _this.eventManager.removeEventListener(document.body, 'mousemove', handler);\n          parentElement.style.display = 'block';\n        }\n      }\n\n      this.eventManager.addEventListener(document.body, 'mousemove', handler);\n    }\n\n    /**\n     * Create border elements\n     *\n     * @param {Object} settings\n     */\n\n  }, {\n    key: 'createBorders',\n    value: function createBorders(settings) {\n      this.main = document.createElement('div');\n\n      var borderDivs = ['top', 'left', 'bottom', 'right', 'corner'];\n      var style = this.main.style;\n      style.position = 'absolute';\n      style.top = 0;\n      style.left = 0;\n\n      for (var i = 0; i < 5; i++) {\n        var position = borderDivs[i];\n        var div = document.createElement('div');\n        div.className = 'wtBorder ' + (this.settings.className || ''); // + borderDivs[i];\n\n        if (this.settings[position] && this.settings[position].hide) {\n          div.className += ' hidden';\n        }\n        style = div.style;\n        style.backgroundColor = this.settings[position] && this.settings[position].color ? this.settings[position].color : settings.border.color;\n        style.height = this.settings[position] && this.settings[position].width ? this.settings[position].width + 'px' : settings.border.width + 'px';\n        style.width = this.settings[position] && this.settings[position].width ? this.settings[position].width + 'px' : settings.border.width + 'px';\n\n        this.main.appendChild(div);\n      }\n      this.top = this.main.childNodes[0];\n      this.left = this.main.childNodes[1];\n      this.bottom = this.main.childNodes[2];\n      this.right = this.main.childNodes[3];\n\n      this.topStyle = this.top.style;\n      this.leftStyle = this.left.style;\n      this.bottomStyle = this.bottom.style;\n      this.rightStyle = this.right.style;\n\n      this.corner = this.main.childNodes[4];\n      this.corner.className += ' corner';\n      this.cornerStyle = this.corner.style;\n      this.cornerStyle.width = this.cornerDefaultStyle.width;\n      this.cornerStyle.height = this.cornerDefaultStyle.height;\n      this.cornerStyle.border = [this.cornerDefaultStyle.borderWidth, this.cornerDefaultStyle.borderStyle, this.cornerDefaultStyle.borderColor].join(' ');\n\n      if ((0, _browser.isMobileBrowser)()) {\n        this.createMultipleSelectorHandles();\n      }\n      this.disappear();\n\n      if (!this.wot.wtTable.bordersHolder) {\n        this.wot.wtTable.bordersHolder = document.createElement('div');\n        this.wot.wtTable.bordersHolder.className = 'htBorders';\n        this.wot.wtTable.spreader.appendChild(this.wot.wtTable.bordersHolder);\n      }\n      this.wot.wtTable.bordersHolder.insertBefore(this.main, this.wot.wtTable.bordersHolder.firstChild);\n    }\n\n    /**\n     * Create multiple selector handler for mobile devices\n     */\n\n  }, {\n    key: 'createMultipleSelectorHandles',\n    value: function createMultipleSelectorHandles() {\n      this.selectionHandles = {\n        topLeft: document.createElement('DIV'),\n        topLeftHitArea: document.createElement('DIV'),\n        bottomRight: document.createElement('DIV'),\n        bottomRightHitArea: document.createElement('DIV')\n      };\n      var width = 10;\n      var hitAreaWidth = 40;\n\n      this.selectionHandles.topLeft.className = 'topLeftSelectionHandle';\n      this.selectionHandles.topLeftHitArea.className = 'topLeftSelectionHandle-HitArea';\n      this.selectionHandles.bottomRight.className = 'bottomRightSelectionHandle';\n      this.selectionHandles.bottomRightHitArea.className = 'bottomRightSelectionHandle-HitArea';\n\n      this.selectionHandles.styles = {\n        topLeft: this.selectionHandles.topLeft.style,\n        topLeftHitArea: this.selectionHandles.topLeftHitArea.style,\n        bottomRight: this.selectionHandles.bottomRight.style,\n        bottomRightHitArea: this.selectionHandles.bottomRightHitArea.style\n      };\n\n      var hitAreaStyle = {\n        position: 'absolute',\n        height: hitAreaWidth + 'px',\n        width: hitAreaWidth + 'px',\n        'border-radius': parseInt(hitAreaWidth / 1.5, 10) + 'px'\n      };\n\n      for (var prop in hitAreaStyle) {\n        if ((0, _object.hasOwnProperty)(hitAreaStyle, prop)) {\n          this.selectionHandles.styles.bottomRightHitArea[prop] = hitAreaStyle[prop];\n          this.selectionHandles.styles.topLeftHitArea[prop] = hitAreaStyle[prop];\n        }\n      }\n\n      var handleStyle = {\n        position: 'absolute',\n        height: width + 'px',\n        width: width + 'px',\n        'border-radius': parseInt(width / 1.5, 10) + 'px',\n        background: '#F5F5FF',\n        border: '1px solid #4285c8'\n      };\n\n      for (var _prop in handleStyle) {\n        if ((0, _object.hasOwnProperty)(handleStyle, _prop)) {\n          this.selectionHandles.styles.bottomRight[_prop] = handleStyle[_prop];\n          this.selectionHandles.styles.topLeft[_prop] = handleStyle[_prop];\n        }\n      }\n      this.main.appendChild(this.selectionHandles.topLeft);\n      this.main.appendChild(this.selectionHandles.bottomRight);\n      this.main.appendChild(this.selectionHandles.topLeftHitArea);\n      this.main.appendChild(this.selectionHandles.bottomRightHitArea);\n    }\n  }, {\n    key: 'isPartRange',\n    value: function isPartRange(row, col) {\n      var areaSelection = this.wot.selections.createOrGetArea();\n\n      if (areaSelection.cellRange) {\n        if (row != areaSelection.cellRange.to.row || col != areaSelection.cellRange.to.col) {\n          return true;\n        }\n      }\n\n      return false;\n    }\n  }, {\n    key: 'updateMultipleSelectionHandlesPosition',\n    value: function updateMultipleSelectionHandlesPosition(row, col, top, left, width, height) {\n      var handleWidth = parseInt(this.selectionHandles.styles.topLeft.width, 10);\n      var hitAreaWidth = parseInt(this.selectionHandles.styles.topLeftHitArea.width, 10);\n\n      this.selectionHandles.styles.topLeft.top = parseInt(top - handleWidth, 10) + 'px';\n      this.selectionHandles.styles.topLeft.left = parseInt(left - handleWidth, 10) + 'px';\n\n      this.selectionHandles.styles.topLeftHitArea.top = parseInt(top - hitAreaWidth / 4 * 3, 10) + 'px';\n      this.selectionHandles.styles.topLeftHitArea.left = parseInt(left - hitAreaWidth / 4 * 3, 10) + 'px';\n\n      this.selectionHandles.styles.bottomRight.top = parseInt(top + height, 10) + 'px';\n      this.selectionHandles.styles.bottomRight.left = parseInt(left + width, 10) + 'px';\n\n      this.selectionHandles.styles.bottomRightHitArea.top = parseInt(top + height - hitAreaWidth / 4, 10) + 'px';\n      this.selectionHandles.styles.bottomRightHitArea.left = parseInt(left + width - hitAreaWidth / 4, 10) + 'px';\n\n      if (this.settings.border.cornerVisible && this.settings.border.cornerVisible()) {\n        this.selectionHandles.styles.topLeft.display = 'block';\n        this.selectionHandles.styles.topLeftHitArea.display = 'block';\n\n        if (this.isPartRange(row, col)) {\n          this.selectionHandles.styles.bottomRight.display = 'none';\n          this.selectionHandles.styles.bottomRightHitArea.display = 'none';\n        } else {\n          this.selectionHandles.styles.bottomRight.display = 'block';\n          this.selectionHandles.styles.bottomRightHitArea.display = 'block';\n        }\n      } else {\n        this.selectionHandles.styles.topLeft.display = 'none';\n        this.selectionHandles.styles.bottomRight.display = 'none';\n        this.selectionHandles.styles.topLeftHitArea.display = 'none';\n        this.selectionHandles.styles.bottomRightHitArea.display = 'none';\n      }\n\n      if (row == this.wot.wtSettings.getSetting('fixedRowsTop') || col == this.wot.wtSettings.getSetting('fixedColumnsLeft')) {\n        this.selectionHandles.styles.topLeft.zIndex = '9999';\n        this.selectionHandles.styles.topLeftHitArea.zIndex = '9999';\n      } else {\n        this.selectionHandles.styles.topLeft.zIndex = '';\n        this.selectionHandles.styles.topLeftHitArea.zIndex = '';\n      }\n    }\n\n    /**\n     * Show border around one or many cells\n     *\n     * @param {Array} corners\n     */\n\n  }, {\n    key: 'appear',\n    value: function appear(corners) {\n      if (this.disabled) {\n        return;\n      }\n\n      var fromRow = void 0;\n      var toRow = void 0;\n      var fromColumn = void 0;\n      var toColumn = void 0;\n\n      var rowsCount = this.wot.wtTable.getRenderedRowsCount();\n\n      for (var i = 0; i < rowsCount; i += 1) {\n        var s = this.wot.wtTable.rowFilter.renderedToSource(i);\n\n        if (s >= corners[0] && s <= corners[2]) {\n          fromRow = s;\n          break;\n        }\n      }\n\n      for (var _i = rowsCount - 1; _i >= 0; _i -= 1) {\n        var _s = this.wot.wtTable.rowFilter.renderedToSource(_i);\n\n        if (_s >= corners[0] && _s <= corners[2]) {\n          toRow = _s;\n          break;\n        }\n      }\n\n      var columnsCount = this.wot.wtTable.getRenderedColumnsCount();\n\n      for (var _i2 = 0; _i2 < columnsCount; _i2 += 1) {\n        var _s2 = this.wot.wtTable.columnFilter.renderedToSource(_i2);\n\n        if (_s2 >= corners[1] && _s2 <= corners[3]) {\n          fromColumn = _s2;\n          break;\n        }\n      }\n\n      for (var _i3 = columnsCount - 1; _i3 >= 0; _i3 -= 1) {\n        var _s3 = this.wot.wtTable.columnFilter.renderedToSource(_i3);\n\n        if (_s3 >= corners[1] && _s3 <= corners[3]) {\n          toColumn = _s3;\n          break;\n        }\n      }\n      if (fromRow === void 0 || fromColumn === void 0) {\n        this.disappear();\n\n        return;\n      }\n      var fromTD = this.wot.wtTable.getCell(new _coords2.default(fromRow, fromColumn));\n      var isMultiple = fromRow !== toRow || fromColumn !== toColumn;\n      var toTD = isMultiple ? this.wot.wtTable.getCell(new _coords2.default(toRow, toColumn)) : fromTD;\n      var fromOffset = (0, _element.offset)(fromTD);\n      var toOffset = isMultiple ? (0, _element.offset)(toTD) : fromOffset;\n      var containerOffset = (0, _element.offset)(this.wot.wtTable.TABLE);\n      var minTop = fromOffset.top;\n      var minLeft = fromOffset.left;\n\n      var left = minLeft - containerOffset.left - 1;\n      var width = toOffset.left + (0, _element.outerWidth)(toTD) - minLeft;\n\n      if (this.isEntireColumnSelected(fromRow, toRow)) {\n        var modifiedValues = this.getDimensionsFromHeader('columns', fromColumn, toColumn, containerOffset);\n        var fromTH = null;\n\n        if (modifiedValues) {\n          var _modifiedValues = _slicedToArray(modifiedValues, 3);\n\n          fromTH = _modifiedValues[0];\n          left = _modifiedValues[1];\n          width = _modifiedValues[2];\n        }\n\n        if (fromTH) {\n          fromTD = fromTH;\n        }\n      }\n\n      var top = minTop - containerOffset.top - 1;\n      var height = toOffset.top + (0, _element.outerHeight)(toTD) - minTop;\n\n      if (this.isEntireRowSelected(fromColumn, toColumn)) {\n        var _modifiedValues2 = this.getDimensionsFromHeader('rows', fromRow, toRow, containerOffset);\n        var _fromTH = null;\n\n        if (_modifiedValues2) {\n          var _modifiedValues3 = _slicedToArray(_modifiedValues2, 3);\n\n          _fromTH = _modifiedValues3[0];\n          top = _modifiedValues3[1];\n          height = _modifiedValues3[2];\n        }\n\n        if (_fromTH) {\n          fromTD = _fromTH;\n        }\n      }\n\n      var style = (0, _element.getComputedStyle)(fromTD);\n\n      if (parseInt(style.borderTopWidth, 10) > 0) {\n        top += 1;\n        height = height > 0 ? height - 1 : 0;\n      }\n      if (parseInt(style.borderLeftWidth, 10) > 0) {\n        left += 1;\n        width = width > 0 ? width - 1 : 0;\n      }\n\n      this.topStyle.top = top + 'px';\n      this.topStyle.left = left + 'px';\n      this.topStyle.width = width + 'px';\n      this.topStyle.display = 'block';\n\n      this.leftStyle.top = top + 'px';\n      this.leftStyle.left = left + 'px';\n      this.leftStyle.height = height + 'px';\n      this.leftStyle.display = 'block';\n\n      var delta = Math.floor(this.settings.border.width / 2);\n\n      this.bottomStyle.top = top + height - delta + 'px';\n      this.bottomStyle.left = left + 'px';\n      this.bottomStyle.width = width + 'px';\n      this.bottomStyle.display = 'block';\n\n      this.rightStyle.top = top + 'px';\n      this.rightStyle.left = left + width - delta + 'px';\n      this.rightStyle.height = height + 1 + 'px';\n      this.rightStyle.display = 'block';\n\n      var cornerVisibleSetting = this.settings.border.cornerVisible;\n      cornerVisibleSetting = typeof cornerVisibleSetting === 'function' ? cornerVisibleSetting(this.settings.layerLevel) : cornerVisibleSetting;\n\n      var hookResult = this.wot.getSetting('onModifyGetCellCoords', toRow, toColumn);\n      var checkRow = toRow,\n          checkCol = toColumn;\n\n\n      if (hookResult && Array.isArray(hookResult)) {\n        var _hookResult = _slicedToArray(hookResult, 4);\n\n        checkRow = _hookResult[2];\n        checkCol = _hookResult[3];\n      }\n\n      if ((0, _browser.isMobileBrowser)() || !cornerVisibleSetting || this.isPartRange(checkRow, checkCol)) {\n        this.cornerStyle.display = 'none';\n      } else {\n        this.cornerStyle.top = top + height - 4 + 'px';\n        this.cornerStyle.left = left + width - 4 + 'px';\n        this.cornerStyle.borderRightWidth = this.cornerDefaultStyle.borderWidth;\n        this.cornerStyle.width = this.cornerDefaultStyle.width;\n\n        // Hide the fill handle, so the possible further adjustments won't force unneeded scrollbars.\n        this.cornerStyle.display = 'none';\n\n        var trimmingContainer = (0, _element.getTrimmingContainer)(this.wot.wtTable.TABLE);\n\n        if (toColumn === this.wot.getSetting('totalColumns') - 1) {\n          var cornerOverlappingContainer = toTD.offsetLeft + (0, _element.outerWidth)(toTD) + parseInt(this.cornerDefaultStyle.width, 10) / 2 >= (0, _element.innerWidth)(trimmingContainer);\n\n          if (cornerOverlappingContainer) {\n            this.cornerStyle.left = Math.floor(left + width - 3 - parseInt(this.cornerDefaultStyle.width, 10) / 2) + 'px';\n            this.cornerStyle.borderRightWidth = 0;\n          }\n        }\n\n        if (toRow === this.wot.getSetting('totalRows') - 1) {\n          var _cornerOverlappingContainer = toTD.offsetTop + (0, _element.outerHeight)(toTD) + parseInt(this.cornerDefaultStyle.height, 10) / 2 >= (0, _element.innerHeight)(trimmingContainer);\n\n          if (_cornerOverlappingContainer) {\n            this.cornerStyle.top = Math.floor(top + height - 3 - parseInt(this.cornerDefaultStyle.height, 10) / 2) + 'px';\n            this.cornerStyle.borderBottomWidth = 0;\n          }\n        }\n\n        this.cornerStyle.display = 'block';\n      }\n\n      if ((0, _browser.isMobileBrowser)()) {\n        this.updateMultipleSelectionHandlesPosition(toRow, toColumn, top, left, width, height);\n      }\n    }\n\n    /**\n     * Check whether an entire column of cells is selected.\n     *\n     * @private\n     * @param {Number} startRowIndex Start row index.\n     * @param {Number} endRowIndex End row index.\n     */\n\n  }, {\n    key: 'isEntireColumnSelected',\n    value: function isEntireColumnSelected(startRowIndex, endRowIndex) {\n      return startRowIndex === this.wot.wtTable.getFirstRenderedRow() && endRowIndex === this.wot.wtTable.getLastRenderedRow();\n    }\n\n    /**\n     * Check whether an entire row of cells is selected.\n     *\n     * @private\n     * @param {Number} startColumnIndex Start column index.\n     * @param {Number} endColumnIndex End column index.\n     */\n\n  }, {\n    key: 'isEntireRowSelected',\n    value: function isEntireRowSelected(startColumnIndex, endColumnIndex) {\n      return startColumnIndex === this.wot.wtTable.getFirstRenderedColumn() && endColumnIndex === this.wot.wtTable.getLastRenderedColumn();\n    }\n\n    /**\n     * Get left/top index and width/height depending on the `direction` provided.\n     *\n     * @private\n     * @param {String} direction `rows` or `columns`, defines if an entire column or row is selected.\n     * @param {Number} fromIndex Start index of the selection.\n     * @param {Number} toIndex End index of the selection.\n     * @param {Number} containerOffset offset of the container.\n     * @return {Array|Boolean} Returns an array of [headerElement, left, width] or [headerElement, top, height], depending on `direction` (`false` in case of an error getting the headers).\n     */\n\n  }, {\n    key: 'getDimensionsFromHeader',\n    value: function getDimensionsFromHeader(direction, fromIndex, toIndex, containerOffset) {\n      var _this3 = this;\n\n      var rootHotElement = this.wot.wtTable.wtRootElement.parentNode;\n      var getHeaderFn = null;\n      var dimensionFn = null;\n      var entireSelectionClassname = null;\n      var index = null;\n      var dimension = null;\n      var dimensionProperty = null;\n      var startHeader = null;\n      var endHeader = null;\n\n      switch (direction) {\n        case 'rows':\n          getHeaderFn = function getHeaderFn() {\n            var _wot$wtTable;\n\n            return (_wot$wtTable = _this3.wot.wtTable).getRowHeader.apply(_wot$wtTable, arguments);\n          };\n          dimensionFn = function dimensionFn() {\n            return _element.outerHeight.apply(undefined, arguments);\n          };\n          entireSelectionClassname = 'ht__selection--rows';\n          dimensionProperty = 'top';\n\n          break;\n\n        case 'columns':\n          getHeaderFn = function getHeaderFn() {\n            var _wot$wtTable2;\n\n            return (_wot$wtTable2 = _this3.wot.wtTable).getColumnHeader.apply(_wot$wtTable2, arguments);\n          };\n          dimensionFn = function dimensionFn() {\n            return _element.outerWidth.apply(undefined, arguments);\n          };\n          entireSelectionClassname = 'ht__selection--columns';\n          dimensionProperty = 'left';\n          break;\n        default:\n      }\n\n      if (rootHotElement.className.includes(entireSelectionClassname)) {\n        var columnHeaderLevelCount = this.wot.getSetting('columnHeaders').length;\n\n        startHeader = getHeaderFn(fromIndex, columnHeaderLevelCount - 1);\n        endHeader = getHeaderFn(toIndex, columnHeaderLevelCount - 1);\n\n        if (!startHeader || !endHeader) {\n          return false;\n        }\n\n        var startHeaderOffset = (0, _element.offset)(startHeader);\n        var endOffset = (0, _element.offset)(endHeader);\n\n        if (startHeader && endHeader) {\n          index = startHeaderOffset[dimensionProperty] - containerOffset[dimensionProperty] - 1;\n          dimension = endOffset[dimensionProperty] + dimensionFn(endHeader) - startHeaderOffset[dimensionProperty];\n        }\n\n        return [startHeader, index, dimension];\n      }\n\n      return false;\n    }\n\n    /**\n     * Hide border\n     */\n\n  }, {\n    key: 'disappear',\n    value: function disappear() {\n      this.topStyle.display = 'none';\n      this.leftStyle.display = 'none';\n      this.bottomStyle.display = 'none';\n      this.rightStyle.display = 'none';\n      this.cornerStyle.display = 'none';\n\n      if ((0, _browser.isMobileBrowser)()) {\n        this.selectionHandles.styles.topLeft.display = 'none';\n        this.selectionHandles.styles.bottomRight.display = 'none';\n      }\n    }\n  }]);\n\n  return Border;\n}();\n\nexports.default = Border;\n\n/***/ }),\n/* 307 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _unicode = __webpack_require__(21);\n\nvar _mixed = __webpack_require__(16);\n\nvar _string = __webpack_require__(36);\n\nvar _array = __webpack_require__(1);\n\nvar _element = __webpack_require__(0);\n\nvar _handsontableEditor = __webpack_require__(308);\n\nvar _handsontableEditor2 = _interopRequireDefault(_handsontableEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AutocompleteEditor = _handsontableEditor2.default.prototype.extend();\n\n/**\n * @private\n * @editor AutocompleteEditor\n * @class AutocompleteEditor\n * @dependencies HandsontableEditor\n */\nAutocompleteEditor.prototype.init = function () {\n  _handsontableEditor2.default.prototype.init.apply(this, arguments);\n  this.query = null;\n  this.strippedChoices = [];\n  this.rawChoices = [];\n};\n\nAutocompleteEditor.prototype.getValue = function () {\n  var _this2 = this;\n\n  var selectedValue = this.rawChoices.find(function (value) {\n    var strippedValue = _this2.stripValueIfNeeded(value);\n\n    return strippedValue === _this2.TEXTAREA.value;\n  });\n\n  if ((0, _mixed.isDefined)(selectedValue)) {\n    return selectedValue;\n  }\n\n  return this.TEXTAREA.value;\n};\n\nAutocompleteEditor.prototype.createElements = function () {\n  _handsontableEditor2.default.prototype.createElements.apply(this, arguments);\n\n  (0, _element.addClass)(this.htContainer, 'autocompleteEditor');\n  (0, _element.addClass)(this.htContainer, window.navigator.platform.indexOf('Mac') === -1 ? '' : 'htMacScroll');\n};\n\nvar skipOne = false;\nfunction onBeforeKeyDown(event) {\n  skipOne = false;\n  var editor = this.getActiveEditor();\n\n  if ((0, _unicode.isPrintableChar)(event.keyCode) || event.keyCode === _unicode.KEY_CODES.BACKSPACE || event.keyCode === _unicode.KEY_CODES.DELETE || event.keyCode === _unicode.KEY_CODES.INSERT) {\n    var timeOffset = 0;\n\n    // on ctl+c / cmd+c don't update suggestion list\n    if (event.keyCode === _unicode.KEY_CODES.C && (event.ctrlKey || event.metaKey)) {\n      return;\n    }\n    if (!editor.isOpened()) {\n      timeOffset += 10;\n    }\n\n    if (editor.htEditor) {\n      editor.instance._registerTimeout(setTimeout(function () {\n        editor.queryChoices(editor.TEXTAREA.value);\n        skipOne = true;\n      }, timeOffset));\n    }\n  }\n}\n\nAutocompleteEditor.prototype.prepare = function () {\n  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);\n  _handsontableEditor2.default.prototype.prepare.apply(this, arguments);\n};\n\nAutocompleteEditor.prototype.open = function () {\n  // Ugly fix for handsontable which grab window object for autocomplete scroll listener instead table element.\n  this.TEXTAREA_PARENT.style.overflow = 'auto';\n  _handsontableEditor2.default.prototype.open.apply(this, arguments);\n  this.TEXTAREA_PARENT.style.overflow = '';\n\n  var choicesListHot = this.htEditor.getInstance();\n  var _this = this;\n  var trimDropdown = this.cellProperties.trimDropdown === void 0 ? true : this.cellProperties.trimDropdown;\n\n  this.TEXTAREA.style.visibility = 'visible';\n  this.focus();\n\n  choicesListHot.updateSettings({\n    colWidths: trimDropdown ? [(0, _element.outerWidth)(this.TEXTAREA) - 2] : void 0,\n    width: trimDropdown ? (0, _element.outerWidth)(this.TEXTAREA) + (0, _element.getScrollbarWidth)() + 2 : void 0,\n    afterRenderer: function afterRenderer(TD, row, col, prop, value, cellProperties) {\n      var _this$cellProperties = _this.cellProperties,\n          filteringCaseSensitive = _this$cellProperties.filteringCaseSensitive,\n          allowHtml = _this$cellProperties.allowHtml;\n\n      var indexOfMatch = void 0;\n      var match = void 0;\n\n      value = (0, _mixed.stringify)(value);\n\n      if (value && !allowHtml) {\n        indexOfMatch = filteringCaseSensitive === true ? value.indexOf(this.query) : value.toLowerCase().indexOf(_this.query.toLowerCase());\n\n        if (indexOfMatch !== -1) {\n          match = value.substr(indexOfMatch, _this.query.length);\n          value = value.replace(match, '<strong>' + match + '</strong>');\n        }\n      }\n      TD.innerHTML = value;\n    },\n\n    autoColumnSize: true,\n    modifyColWidth: function modifyColWidth(width, col) {\n      // workaround for <strong> text overlapping the dropdown, not really accurate\n      var autoWidths = this.getPlugin('autoColumnSize').widths;\n\n      if (autoWidths[col]) {\n        width = autoWidths[col];\n      }\n\n      return trimDropdown ? width : width + 15;\n    }\n  });\n\n  // Add additional space for autocomplete holder\n  this.htEditor.view.wt.wtTable.holder.parentNode.style['padding-right'] = (0, _element.getScrollbarWidth)() + 2 + 'px';\n\n  if (skipOne) {\n    skipOne = false;\n  }\n\n  _this.instance._registerTimeout(setTimeout(function () {\n    _this.queryChoices(_this.TEXTAREA.value);\n  }, 0));\n};\n\nAutocompleteEditor.prototype.close = function () {\n  _handsontableEditor2.default.prototype.close.apply(this, arguments);\n};\nAutocompleteEditor.prototype.queryChoices = function (query) {\n  var _this3 = this;\n\n  this.query = query;\n  var source = this.cellProperties.source;\n\n  if (typeof source == 'function') {\n    source.call(this.cellProperties, query, function (choices) {\n      _this3.rawChoices = choices;\n      _this3.updateChoicesList(_this3.stripValuesIfNeeded(choices));\n    });\n  } else if (Array.isArray(source)) {\n    this.rawChoices = source;\n    this.updateChoicesList(this.stripValuesIfNeeded(source));\n  } else {\n    this.updateChoicesList([]);\n  }\n};\n\nAutocompleteEditor.prototype.updateChoicesList = function (choices) {\n  var pos = (0, _element.getCaretPosition)(this.TEXTAREA);\n  var endPos = (0, _element.getSelectionEndPosition)(this.TEXTAREA);\n  var sortByRelevanceSetting = this.cellProperties.sortByRelevance;\n  var filterSetting = this.cellProperties.filter;\n  var orderByRelevance = null;\n  var highlightIndex = null;\n\n  if (sortByRelevanceSetting) {\n    orderByRelevance = AutocompleteEditor.sortByRelevance(this.stripValueIfNeeded(this.getValue()), choices, this.cellProperties.filteringCaseSensitive);\n  }\n  var orderByRelevanceLength = Array.isArray(orderByRelevance) ? orderByRelevance.length : 0;\n\n  if (filterSetting === false) {\n    if (orderByRelevanceLength) {\n      highlightIndex = orderByRelevance[0];\n    }\n  } else {\n    var sorted = [];\n\n    for (var i = 0, choicesCount = choices.length; i < choicesCount; i++) {\n      if (sortByRelevanceSetting && orderByRelevanceLength <= i) {\n        break;\n      }\n      if (orderByRelevanceLength) {\n        sorted.push(choices[orderByRelevance[i]]);\n      } else {\n        sorted.push(choices[i]);\n      }\n    }\n\n    highlightIndex = 0;\n    choices = sorted;\n  }\n\n  this.strippedChoices = choices;\n  this.htEditor.loadData((0, _array.pivot)([choices]));\n\n  this.updateDropdownHeight();\n\n  this.flipDropdownIfNeeded();\n\n  if (this.cellProperties.strict === true) {\n    this.highlightBestMatchingChoice(highlightIndex);\n  }\n\n  this.instance.listen(false);\n\n  (0, _element.setCaretPosition)(this.TEXTAREA, pos, pos === endPos ? void 0 : endPos);\n};\n\nAutocompleteEditor.prototype.flipDropdownIfNeeded = function () {\n  var textareaOffset = (0, _element.offset)(this.TEXTAREA);\n  var textareaHeight = (0, _element.outerHeight)(this.TEXTAREA);\n  var dropdownHeight = this.getDropdownHeight();\n  var trimmingContainer = (0, _element.getTrimmingContainer)(this.instance.view.wt.wtTable.TABLE);\n  var trimmingContainerScrollTop = trimmingContainer.scrollTop;\n  var headersHeight = (0, _element.outerHeight)(this.instance.view.wt.wtTable.THEAD);\n  var containerOffset = {\n    row: 0,\n    col: 0\n  };\n\n  if (trimmingContainer !== window) {\n    containerOffset = (0, _element.offset)(trimmingContainer);\n  }\n\n  var spaceAbove = textareaOffset.top - containerOffset.top - headersHeight + trimmingContainerScrollTop;\n  var spaceBelow = trimmingContainer.scrollHeight - spaceAbove - headersHeight - textareaHeight;\n  var flipNeeded = dropdownHeight > spaceBelow && spaceAbove > spaceBelow;\n\n  if (flipNeeded) {\n    this.flipDropdown(dropdownHeight);\n  } else {\n    this.unflipDropdown();\n  }\n\n  this.limitDropdownIfNeeded(flipNeeded ? spaceAbove : spaceBelow, dropdownHeight);\n\n  return flipNeeded;\n};\n\nAutocompleteEditor.prototype.limitDropdownIfNeeded = function (spaceAvailable, dropdownHeight) {\n  if (dropdownHeight > spaceAvailable) {\n    var tempHeight = 0;\n    var i = 0;\n    var lastRowHeight = 0;\n    var height = null;\n\n    do {\n      lastRowHeight = this.htEditor.getRowHeight(i) || this.htEditor.view.wt.wtSettings.settings.defaultRowHeight;\n      tempHeight += lastRowHeight;\n      i++;\n    } while (tempHeight < spaceAvailable);\n\n    height = tempHeight - lastRowHeight;\n\n    if (this.htEditor.flipped) {\n      this.htEditor.rootElement.style.top = parseInt(this.htEditor.rootElement.style.top, 10) + dropdownHeight - height + 'px';\n    }\n\n    this.setDropdownHeight(tempHeight - lastRowHeight);\n  }\n};\n\nAutocompleteEditor.prototype.flipDropdown = function (dropdownHeight) {\n  var dropdownStyle = this.htEditor.rootElement.style;\n\n  dropdownStyle.position = 'absolute';\n  dropdownStyle.top = -dropdownHeight + 'px';\n\n  this.htEditor.flipped = true;\n};\n\nAutocompleteEditor.prototype.unflipDropdown = function () {\n  var dropdownStyle = this.htEditor.rootElement.style;\n\n  if (dropdownStyle.position === 'absolute') {\n    dropdownStyle.position = '';\n    dropdownStyle.top = '';\n  }\n\n  this.htEditor.flipped = void 0;\n};\n\nAutocompleteEditor.prototype.updateDropdownHeight = function () {\n  var currentDropdownWidth = this.htEditor.getColWidth(0) + (0, _element.getScrollbarWidth)() + 2;\n  var trimDropdown = this.cellProperties.trimDropdown;\n\n  this.htEditor.updateSettings({\n    height: this.getDropdownHeight(),\n    width: trimDropdown ? void 0 : currentDropdownWidth\n  });\n\n  this.htEditor.view.wt.wtTable.alignOverlaysWithTrimmingContainer();\n};\n\nAutocompleteEditor.prototype.setDropdownHeight = function (height) {\n  this.htEditor.updateSettings({\n    height: height\n  });\n};\n\nAutocompleteEditor.prototype.finishEditing = function (restoreOriginalValue) {\n  if (!restoreOriginalValue) {\n    this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n  }\n  _handsontableEditor2.default.prototype.finishEditing.apply(this, arguments);\n};\n\nAutocompleteEditor.prototype.highlightBestMatchingChoice = function (index) {\n  if (typeof index === 'number') {\n    this.htEditor.selectCell(index, 0, void 0, void 0, void 0, false);\n  } else {\n    this.htEditor.deselectCell();\n  }\n};\n\n/**\n * Filters and sorts by relevance\n * @param value\n * @param choices\n * @param caseSensitive\n * @returns {Array} array of indexes in original choices array\n */\nAutocompleteEditor.sortByRelevance = function (value, choices, caseSensitive) {\n  var choicesRelevance = [];\n  var currentItem = void 0;\n  var valueLength = value.length;\n  var valueIndex = void 0;\n  var charsLeft = void 0;\n  var result = [];\n  var i = void 0;\n  var choicesCount = choices.length;\n\n  if (valueLength === 0) {\n    for (i = 0; i < choicesCount; i++) {\n      result.push(i);\n    }\n    return result;\n  }\n\n  for (i = 0; i < choicesCount; i++) {\n    currentItem = (0, _string.stripTags)((0, _mixed.stringify)(choices[i]));\n\n    if (caseSensitive) {\n      valueIndex = currentItem.indexOf(value);\n    } else {\n      valueIndex = currentItem.toLowerCase().indexOf(value.toLowerCase());\n    }\n\n    if (valueIndex !== -1) {\n      charsLeft = currentItem.length - valueIndex - valueLength;\n\n      choicesRelevance.push({\n        baseIndex: i,\n        index: valueIndex,\n        charsLeft: charsLeft,\n        value: currentItem\n      });\n    }\n  }\n\n  choicesRelevance.sort(function (a, b) {\n\n    if (b.index === -1) {\n      return -1;\n    }\n    if (a.index === -1) {\n      return 1;\n    }\n\n    if (a.index < b.index) {\n      return -1;\n    } else if (b.index < a.index) {\n      return 1;\n    } else if (a.index === b.index) {\n      if (a.charsLeft < b.charsLeft) {\n        return -1;\n      } else if (a.charsLeft > b.charsLeft) {\n        return 1;\n      }\n    }\n\n    return 0;\n  });\n\n  for (i = 0, choicesCount = choicesRelevance.length; i < choicesCount; i++) {\n    result.push(choicesRelevance[i].baseIndex);\n  }\n\n  return result;\n};\n\nAutocompleteEditor.prototype.getDropdownHeight = function () {\n  var firstRowHeight = this.htEditor.getInstance().getRowHeight(0) || 23;\n  var visibleRows = this.cellProperties.visibleRows;\n\n  return this.strippedChoices.length >= visibleRows ? visibleRows * firstRowHeight : this.strippedChoices.length * firstRowHeight + 8;\n};\n\nAutocompleteEditor.prototype.stripValueIfNeeded = function (value) {\n  return this.stripValuesIfNeeded([value])[0];\n};\n\nAutocompleteEditor.prototype.stripValuesIfNeeded = function (values) {\n  var allowHtml = this.cellProperties.allowHtml;\n\n\n  var stringifiedValues = (0, _array.arrayMap)(values, function (value) {\n    return (0, _mixed.stringify)(value);\n  });\n  var strippedValues = (0, _array.arrayMap)(stringifiedValues, function (value) {\n    return allowHtml ? value : (0, _string.stripTags)(value);\n  });\n\n  return strippedValues;\n};\n\nAutocompleteEditor.prototype.allowKeyEventPropagation = function (keyCode) {\n  var selectedRange = this.htEditor.getSelectedRangeLast();\n\n  var selected = { row: selectedRange ? selectedRange.from.row : -1 };\n  var allowed = false;\n\n  if (keyCode === _unicode.KEY_CODES.ARROW_DOWN && selected.row > 0 && selected.row < this.htEditor.countRows() - 1) {\n    allowed = true;\n  }\n  if (keyCode === _unicode.KEY_CODES.ARROW_UP && selected.row > -1) {\n    allowed = true;\n  }\n\n  return allowed;\n};\n\nAutocompleteEditor.prototype.discardEditor = function (result) {\n  _handsontableEditor2.default.prototype.discardEditor.apply(this, arguments);\n\n  this.instance.view.render();\n};\n\nexports.default = AutocompleteEditor;\n\n/***/ }),\n/* 308 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _unicode = __webpack_require__(21);\n\nvar _object = __webpack_require__(2);\n\nvar _element = __webpack_require__(0);\n\nvar _event = __webpack_require__(12);\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar HandsontableEditor = _textEditor2.default.prototype.extend();\n\n/**\n * @private\n * @editor HandsontableEditor\n * @class HandsontableEditor\n * @dependencies TextEditor\n */\nHandsontableEditor.prototype.createElements = function () {\n  _textEditor2.default.prototype.createElements.apply(this, arguments);\n\n  var DIV = document.createElement('DIV');\n  DIV.className = 'handsontableEditor';\n  this.TEXTAREA_PARENT.appendChild(DIV);\n\n  this.htContainer = DIV;\n  this.assignHooks();\n};\n\nHandsontableEditor.prototype.prepare = function (td, row, col, prop, value, cellProperties) {\n  _textEditor2.default.prototype.prepare.apply(this, arguments);\n\n  var parent = this;\n  var options = {\n    startRows: 0,\n    startCols: 0,\n    minRows: 0,\n    minCols: 0,\n    className: 'listbox',\n    copyPaste: false,\n    autoColumnSize: false,\n    autoRowSize: false,\n    readOnly: true,\n    fillHandle: false,\n    afterOnCellMouseDown: function afterOnCellMouseDown(_, coords) {\n      var value = this.getSourceData(coords.row, coords.col);\n\n      // if the value is undefined then it means we don't want to set the value\n      if (value !== void 0) {\n        parent.setValue(value);\n      }\n      parent.instance.destroyEditor();\n    }\n  };\n\n  if (this.cellProperties.handsontable) {\n    (0, _object.extend)(options, cellProperties.handsontable);\n  }\n  this.htOptions = options;\n};\n\nvar onBeforeKeyDown = function onBeforeKeyDown(event) {\n  if ((0, _event.isImmediatePropagationStopped)(event)) {\n    return;\n  }\n  var editor = this.getActiveEditor();\n\n  var innerHOT = editor.htEditor.getInstance();\n\n  var rowToSelect;\n  var selectedRow;\n\n  if (event.keyCode == _unicode.KEY_CODES.ARROW_DOWN) {\n    if (!innerHOT.getSelectedLast() && !innerHOT.flipped) {\n      rowToSelect = 0;\n    } else if (innerHOT.getSelectedLast()) {\n      if (innerHOT.flipped) {\n        rowToSelect = innerHOT.getSelectedLast()[0] + 1;\n      } else if (!innerHOT.flipped) {\n        selectedRow = innerHOT.getSelectedLast()[0];\n        var lastRow = innerHOT.countRows() - 1;\n        rowToSelect = Math.min(lastRow, selectedRow + 1);\n      }\n    }\n  } else if (event.keyCode == _unicode.KEY_CODES.ARROW_UP) {\n    if (!innerHOT.getSelectedLast() && innerHOT.flipped) {\n      rowToSelect = innerHOT.countRows() - 1;\n    } else if (innerHOT.getSelectedLast()) {\n      if (innerHOT.flipped) {\n        selectedRow = innerHOT.getSelectedLast()[0];\n        rowToSelect = Math.max(0, selectedRow - 1);\n      } else {\n        selectedRow = innerHOT.getSelectedLast()[0];\n        rowToSelect = selectedRow - 1;\n      }\n    }\n  }\n\n  if (rowToSelect !== void 0) {\n    if (rowToSelect < 0 || innerHOT.flipped && rowToSelect > innerHOT.countRows() - 1) {\n      innerHOT.deselectCell();\n    } else {\n      innerHOT.selectCell(rowToSelect, 0);\n    }\n    if (innerHOT.getData().length) {\n      event.preventDefault();\n      (0, _event.stopImmediatePropagation)(event);\n\n      editor.instance.listen();\n      editor.TEXTAREA.focus();\n    }\n  }\n};\n\nHandsontableEditor.prototype.open = function () {\n  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);\n\n  _textEditor2.default.prototype.open.apply(this, arguments);\n\n  if (this.htEditor) {\n    this.htEditor.destroy();\n  }\n  // Construct and initialise a new Handsontable\n  this.htEditor = new this.instance.constructor(this.htContainer, this.htOptions);\n  this.htEditor.init();\n\n  if (this.cellProperties.strict) {\n    this.htEditor.selectCell(0, 0);\n    this.TEXTAREA.style.visibility = 'hidden';\n  } else {\n    this.htEditor.deselectCell();\n    this.TEXTAREA.style.visibility = 'visible';\n  }\n\n  (0, _element.setCaretPosition)(this.TEXTAREA, 0, this.TEXTAREA.value.length);\n};\n\nHandsontableEditor.prototype.close = function () {\n  this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n  this.instance.listen();\n\n  _textEditor2.default.prototype.close.apply(this, arguments);\n};\n\nHandsontableEditor.prototype.focus = function () {\n  this.instance.listen();\n  _textEditor2.default.prototype.focus.apply(this, arguments);\n};\n\nHandsontableEditor.prototype.beginEditing = function (initialValue) {\n  var onBeginEditing = this.instance.getSettings().onBeginEditing;\n\n  if (onBeginEditing && onBeginEditing() === false) {\n    return;\n  }\n  _textEditor2.default.prototype.beginEditing.apply(this, arguments);\n};\n\nHandsontableEditor.prototype.finishEditing = function (isCancelled, ctrlDown) {\n  if (this.htEditor && this.htEditor.isListening()) {\n    // if focus is still in the HOT editor\n\n    this.instance.listen(); // return the focus to the parent HOT instance\n  }\n\n  if (this.htEditor && this.htEditor.getSelectedLast()) {\n    var value = this.htEditor.getInstance().getValue();\n\n    if (value !== void 0) {\n      // if the value is undefined then it means we don't want to set the value\n      this.setValue(value);\n    }\n  }\n\n  return _textEditor2.default.prototype.finishEditing.apply(this, arguments);\n};\n\nHandsontableEditor.prototype.assignHooks = function () {\n  var _this = this;\n\n  this.instance.addHook('afterDestroy', function () {\n    if (_this.htEditor) {\n      _this.htEditor.destroy();\n    }\n  });\n};\n\nexports.default = HandsontableEditor;\n\n/***/ }),\n/* 309 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * numbro.js\n * version : 1.11.0\n * author : Företagsplatsen AB\n * license : MIT\n * http://www.foretagsplatsen.se\n */\n\n(function () {\n    'use strict';\n\n    /************************************\n        Constants\n    ************************************/\n\n    var numbro,\n        VERSION = '1.11.0',\n        binarySuffixes = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'],\n        decimalSuffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],\n        bytes = {\n            general: { scale: 1024, suffixes: decimalSuffixes, marker: 'bd' },\n            binary:  { scale: 1024, suffixes: binarySuffixes, marker: 'b' },\n            decimal: { scale: 1000, suffixes: decimalSuffixes, marker: 'd' }\n        },\n        // general must be before the others because it reuses their characters!\n        byteFormatOrder = [ bytes.general, bytes.binary, bytes.decimal ],\n    // internal storage for culture config files\n        cultures = {},\n    // Todo: Remove in 2.0.0\n        languages = cultures,\n        currentCulture = 'en-US',\n        zeroFormat = null,\n        defaultFormat = '0,0',\n        defaultCurrencyFormat = '0$',\n        // check for nodeJS\n        hasModule = (typeof module !== 'undefined' && module.exports),\n    // default culture\n        enUS = {\n            delimiters: {\n                thousands: ',',\n                decimal: '.'\n            },\n            abbreviations: {\n                thousand: 'k',\n                million: 'm',\n                billion: 'b',\n                trillion: 't'\n            },\n            ordinal: function(number) {\n                var b = number % 10;\n                return (~~(number % 100 / 10) === 1) ? 'th' :\n                    (b === 1) ? 'st' :\n                        (b === 2) ? 'nd' :\n                            (b === 3) ? 'rd' : 'th';\n            },\n            currency: {\n                symbol: '$',\n                position: 'prefix'\n            },\n            defaults: {\n                currencyFormat: ',0000 a'\n            },\n            formats: {\n                fourDigits: '0000 a',\n                fullWithTwoDecimals: '$ ,0.00',\n                fullWithTwoDecimalsNoCurrency: ',0.00'\n            }\n        };\n\n    /************************************\n        Constructors\n    ************************************/\n\n\n    // Numbro prototype object\n    function Numbro(number) {\n        this._value = number;\n    }\n\n    function numberLength(number) {\n        if (number === 0) { return 1; }\n        return Math.floor(Math.log(Math.abs(number)) / Math.LN10) + 1;\n    }\n\n    function zeroes(count) {\n        var i, ret = '';\n\n        for (i = 0; i < count; i++) {\n            ret += '0';\n        }\n\n        return ret;\n    }\n    /**\n     * Implementation of toFixed() for numbers with exponents\n     * This function may return negative representations for zero values e.g. \"-0.0\"\n     */\n    function toFixedLargeSmall(value, precision) {\n        var mantissa,\n            beforeDec,\n            afterDec,\n            exponent,\n            prefix,\n            endStr,\n            zerosStr,\n            str;\n\n        str = value.toString();\n\n        mantissa = str.split('e')[0];\n        exponent = str.split('e')[1];\n\n        beforeDec = mantissa.split('.')[0];\n        afterDec = mantissa.split('.')[1] || '';\n\n        if (+exponent > 0) {\n            // exponent is positive - add zeros after the numbers\n            str = beforeDec + afterDec + zeroes(exponent - afterDec.length);\n        } else {\n            // exponent is negative\n\n            if (+beforeDec < 0) {\n                prefix = '-0';\n            } else {\n                prefix = '0';\n            }\n\n            // tack on the decimal point if needed\n            if (precision > 0) {\n                prefix += '.';\n            }\n\n            zerosStr = zeroes((-1 * exponent) - 1);\n            // substring off the end to satisfy the precision\n            endStr = (zerosStr + Math.abs(beforeDec) + afterDec).substr(0, precision);\n            str = prefix + endStr;\n        }\n\n        // only add percision 0's if the exponent is positive\n        if (+exponent > 0 && precision > 0) {\n            str += '.' + zeroes(precision);\n        }\n\n        return str;\n    }\n\n    /**\n     * Implementation of toFixed() that treats floats more like decimals\n     *\n     * Fixes binary rounding issues (eg. (0.615).toFixed(2) === '0.61') that present\n     * problems for accounting- and finance-related software.\n     *\n     * Also removes negative signs for zero-formatted numbers. e.g. -0.01 w/ precision 1 -> 0.0\n     */\n    function toFixed(value, precision, roundingFunction, optionals) {\n        var power = Math.pow(10, precision),\n            optionalsRegExp,\n            output;\n\n        if (value.toString().indexOf('e') > -1) {\n            // toFixed returns scientific notation for numbers above 1e21 and below 1e-7\n            output = toFixedLargeSmall(value, precision);\n            // remove the leading negative sign if it exists and should not be present (e.g. -0.00)\n            if (output.charAt(0) === '-' && +output >= 0) {\n                output = output.substr(1); // chop off the '-'\n            }\n        }\n        else {\n            // Multiply up by precision, round accurately, then divide and use native toFixed():\n            output = (roundingFunction(value + 'e+' + precision) / power).toFixed(precision);\n        }\n\n        if (optionals) {\n            optionalsRegExp = new RegExp('0{1,' + optionals + '}$');\n            output = output.replace(optionalsRegExp, '');\n        }\n\n        return output;\n    }\n\n    /************************************\n        Formatting\n    ************************************/\n\n    // determine what type of formatting we need to do\n    function formatNumbro(n, format, roundingFunction) {\n        var output,\n            escapedFormat = format.replace(/\\{[^\\{\\}]*\\}/g, '');\n\n        // figure out what kind of format we are dealing with\n        if (escapedFormat.indexOf('$') > -1) { // currency!!!!!\n            output = formatCurrency(n, cultures[currentCulture].currency.symbol, format, roundingFunction);\n        } else if (escapedFormat.indexOf('%') > -1) { // percentage\n            output = formatPercentage(n, format, roundingFunction);\n        } else if (escapedFormat.indexOf(':') > -1) { // time\n            output = formatTime(n, format);\n        } else { // plain ol' numbers or bytes\n            output = formatNumber(n._value, format, roundingFunction);\n        }\n\n        // return string\n        return output;\n    }\n\n    // revert to number\n    function unformatNumbro(n, string) {\n        var stringOriginal = string,\n            thousandRegExp,\n            millionRegExp,\n            billionRegExp,\n            trillionRegExp,\n            bytesMultiplier = false,\n            power;\n\n        if (string.indexOf(':') > -1) {\n            n._value = unformatTime(string);\n        } else {\n            if (string === zeroFormat) {\n                n._value = 0;\n            } else {\n                if (cultures[currentCulture].delimiters.decimal !== '.') {\n                    string = string.replace(/\\./g, '').replace(cultures[currentCulture].delimiters.decimal, '.');\n                }\n\n                // see if abbreviations are there so that we can multiply to the correct number\n                thousandRegExp = new RegExp('[^a-zA-Z]' + cultures[currentCulture].abbreviations.thousand +\n                    '(?:\\\\)|(\\\\' + cultures[currentCulture].currency.symbol + ')?(?:\\\\))?)?$');\n                millionRegExp = new RegExp('[^a-zA-Z]' + cultures[currentCulture].abbreviations.million +\n                    '(?:\\\\)|(\\\\' + cultures[currentCulture].currency.symbol + ')?(?:\\\\))?)?$');\n                billionRegExp = new RegExp('[^a-zA-Z]' + cultures[currentCulture].abbreviations.billion +\n                    '(?:\\\\)|(\\\\' + cultures[currentCulture].currency.symbol + ')?(?:\\\\))?)?$');\n                trillionRegExp = new RegExp('[^a-zA-Z]' + cultures[currentCulture].abbreviations.trillion +\n                    '(?:\\\\)|(\\\\' + cultures[currentCulture].currency.symbol + ')?(?:\\\\))?)?$');\n\n                // see if bytes are there so that we can multiply to the correct number\n                for (power = 1; power < binarySuffixes.length && !bytesMultiplier; ++power) {\n                    if (string.indexOf(binarySuffixes[power]) > -1) {\n                        bytesMultiplier = Math.pow(1024, power);\n                    } else if (string.indexOf(decimalSuffixes[power]) > -1) {\n                        bytesMultiplier = Math.pow(1000, power);\n                    }\n                }\n\n                var str = string.replace(/[^0-9\\.]+/g, '');\n                if (str === '') {\n                    // An empty string is not a number.\n                    n._value = NaN;\n\n                } else {\n                    // do some math to create our number\n                    n._value = ((bytesMultiplier) ? bytesMultiplier : 1) *\n                        ((stringOriginal.match(thousandRegExp)) ? Math.pow(10, 3) : 1) *\n                        ((stringOriginal.match(millionRegExp)) ? Math.pow(10, 6) : 1) *\n                        ((stringOriginal.match(billionRegExp)) ? Math.pow(10, 9) : 1) *\n                        ((stringOriginal.match(trillionRegExp)) ? Math.pow(10, 12) : 1) *\n                        ((string.indexOf('%') > -1) ? 0.01 : 1) *\n                        (((string.split('-').length +\n                            Math.min(string.split('(').length - 1, string.split(')').length - 1)) % 2) ? 1 : -1) *\n                        Number(str);\n\n                    // round if we are talking about bytes\n                    n._value = (bytesMultiplier) ? Math.ceil(n._value) : n._value;\n                }\n            }\n        }\n        return n._value;\n    }\n\n    function formatCurrency(n, currencySymbol, originalFormat, roundingFunction) {\n        var format = originalFormat,\n            symbolIndex = format.indexOf('$'),\n            openParenIndex = format.indexOf('('),\n            plusSignIndex = format.indexOf('+'),\n            minusSignIndex = format.indexOf('-'),\n            space = '',\n            decimalSeparator = '',\n            spliceIndex,\n            output;\n\n        if(format.indexOf('$') === -1){\n            // Use defaults instead of the format provided\n            if (cultures[currentCulture].currency.position === 'infix') {\n                decimalSeparator = currencySymbol;\n                if (cultures[currentCulture].currency.spaceSeparated) {\n                    decimalSeparator = ' ' + decimalSeparator + ' ';\n                }\n            } else if (cultures[currentCulture].currency.spaceSeparated) {\n                space = ' ';\n            }\n        } else {\n            // check for space before or after currency\n            if (format.indexOf(' $') > -1) {\n                space = ' ';\n                format = format.replace(' $', '');\n            } else if (format.indexOf('$ ') > -1) {\n                space = ' ';\n                format = format.replace('$ ', '');\n            } else {\n                format = format.replace('$', '');\n            }\n        }\n\n        // Format The Number\n        output = formatNumber(n._value, format, roundingFunction, decimalSeparator);\n\n        if (originalFormat.indexOf('$') === -1) {\n            // Use defaults instead of the format provided\n            switch (cultures[currentCulture].currency.position) {\n                case 'postfix':\n                    if (output.indexOf(')') > -1) {\n                        output = output.split('');\n                        output.splice(-1, 0, space + currencySymbol);\n                        output = output.join('');\n                    } else {\n                        output = output + space + currencySymbol;\n                    }\n                    break;\n                case 'infix':\n                    break;\n                case 'prefix':\n                    if (output.indexOf('(') > -1 || output.indexOf('-') > -1) {\n                        output = output.split('');\n                        spliceIndex = Math.max(openParenIndex, minusSignIndex) + 1;\n\n                        output.splice(spliceIndex, 0, currencySymbol + space);\n                        output = output.join('');\n                    } else {\n                        output = currencySymbol + space + output;\n                    }\n                    break;\n                default:\n                    throw Error('Currency position should be among [\"prefix\", \"infix\", \"postfix\"]');\n            }\n        } else {\n            // position the symbol\n            if (symbolIndex <= 1) {\n                if (output.indexOf('(') > -1 || output.indexOf('+') > -1 || output.indexOf('-') > -1) {\n                    output = output.split('');\n                    spliceIndex = 1;\n                    if (symbolIndex < openParenIndex || symbolIndex < plusSignIndex || symbolIndex < minusSignIndex) {\n                        // the symbol appears before the \"(\", \"+\" or \"-\"\n                        spliceIndex = 0;\n                    }\n                    output.splice(spliceIndex, 0, currencySymbol + space);\n                    output = output.join('');\n                } else {\n                    output = currencySymbol + space + output;\n                }\n            } else {\n                if (output.indexOf(')') > -1) {\n                    output = output.split('');\n                    output.splice(-1, 0, space + currencySymbol);\n                    output = output.join('');\n                } else {\n                    output = output + space + currencySymbol;\n                }\n            }\n        }\n\n        return output;\n    }\n\n    function formatForeignCurrency(n, foreignCurrencySymbol, originalFormat, roundingFunction) {\n        return formatCurrency(n, foreignCurrencySymbol, originalFormat, roundingFunction);\n    }\n\n    function formatPercentage(n, format, roundingFunction) {\n        var space = '',\n            output,\n            value = n._value * 100;\n\n        // check for space before %\n        if (format.indexOf(' %') > -1) {\n            space = ' ';\n            format = format.replace(' %', '');\n        } else {\n            format = format.replace('%', '');\n        }\n\n        output = formatNumber(value, format, roundingFunction);\n\n        if (output.indexOf(')') > -1) {\n            output = output.split('');\n            output.splice(-1, 0, space + '%');\n            output = output.join('');\n        } else {\n            output = output + space + '%';\n        }\n\n        return output;\n    }\n\n    function formatTime(n) {\n        var hours = Math.floor(n._value / 60 / 60),\n            minutes = Math.floor((n._value - (hours * 60 * 60)) / 60),\n            seconds = Math.round(n._value - (hours * 60 * 60) - (minutes * 60));\n        return hours + ':' +\n            ((minutes < 10) ? '0' + minutes : minutes) + ':' +\n            ((seconds < 10) ? '0' + seconds : seconds);\n    }\n\n    function unformatTime(string) {\n        var timeArray = string.split(':'),\n            seconds = 0;\n        // turn hours and minutes into seconds and add them all up\n        if (timeArray.length === 3) {\n            // hours\n            seconds = seconds + (Number(timeArray[0]) * 60 * 60);\n            // minutes\n            seconds = seconds + (Number(timeArray[1]) * 60);\n            // seconds\n            seconds = seconds + Number(timeArray[2]);\n        } else if (timeArray.length === 2) {\n            // minutes\n            seconds = seconds + (Number(timeArray[0]) * 60);\n            // seconds\n            seconds = seconds + Number(timeArray[1]);\n        }\n        return Number(seconds);\n    }\n\n    function formatByteUnits (value, suffixes, scale) {\n        var suffix = suffixes[0],\n            power,\n            min,\n            max,\n            abs = Math.abs(value);\n\n        if (abs >= scale) {\n            for (power = 1; power < suffixes.length; ++power) {\n                min = Math.pow(scale, power);\n                max = Math.pow(scale, power + 1);\n\n                if (abs >= min && abs < max) {\n                    suffix = suffixes[power];\n                    value = value / min;\n                    break;\n                }\n            }\n\n            // values greater than or equal to [scale] YB never set the suffix\n            if (suffix === suffixes[0]) {\n                value = value / Math.pow(scale, suffixes.length - 1);\n                suffix = suffixes[suffixes.length - 1];\n            }\n        }\n\n        return { value: value, suffix: suffix };\n    }\n\n    function formatNumber (value, format, roundingFunction, sep) {\n        var negP = false,\n            signed = false,\n            optDec = false,\n            abbr = '',\n            abbrK = false, // force abbreviation to thousands\n            abbrM = false, // force abbreviation to millions\n            abbrB = false, // force abbreviation to billions\n            abbrT = false, // force abbreviation to trillions\n            abbrForce = false, // force abbreviation\n            bytes = '',\n            byteFormat,\n            units,\n            ord = '',\n            abs = Math.abs(value),\n            totalLength,\n            length,\n            minimumPrecision,\n            pow,\n            w,\n            intPrecision,\n            precision,\n            prefix,\n            postfix,\n            thousands,\n            d = '',\n            forcedNeg = false,\n            neg = false,\n            indexOpenP,\n            indexMinus,\n            paren = '',\n            minlen,\n            i;\n\n        // check if number is zero and a custom zero format has been set\n        if (value === 0 && zeroFormat !== null) {\n            return zeroFormat;\n        }\n\n        if (!isFinite(value)) {\n            return '' + value;\n        }\n\n        if (format.indexOf('{') === 0) {\n            var end = format.indexOf('}');\n            if (end === -1) {\n                throw Error('Format should also contain a \"}\"');\n            }\n            prefix = format.slice(1, end);\n            format = format.slice(end + 1);\n        } else {\n            prefix = '';\n        }\n\n        if (format.indexOf('}') === format.length - 1 && format.length) {\n            var start = format.indexOf('{');\n            if (start === -1) {\n                throw Error('Format should also contain a \"{\"');\n            }\n            postfix = format.slice(start + 1, -1);\n            format = format.slice(0, start + 1);\n        } else {\n            postfix = '';\n        }\n\n        // check for min length\n        var info;\n        if (format.indexOf('.') === -1) {\n            info = format.match(/([0-9]+).*/);\n        } else {\n            info = format.match(/([0-9]+)\\..*/);\n        }\n        minlen = info === null ? -1 : info[1].length;\n\n        // see if we should use parentheses for negative number or if we should prefix with a sign\n        // if both are present we default to parentheses\n        if (format.indexOf('-') !== -1) {\n            forcedNeg = true;\n        }\n        if (format.indexOf('(') > -1) {\n            negP = true;\n            format = format.slice(1, -1);\n        } else if (format.indexOf('+') > -1) {\n            signed = true;\n            format = format.replace(/\\+/g, '');\n        }\n\n        // see if abbreviation is wanted\n        if (format.indexOf('a') > -1) {\n            intPrecision = format.split('.')[0].match(/[0-9]+/g) || ['0'];\n            intPrecision = parseInt(intPrecision[0], 10);\n\n            // check if abbreviation is specified\n            abbrK = format.indexOf('aK') >= 0;\n            abbrM = format.indexOf('aM') >= 0;\n            abbrB = format.indexOf('aB') >= 0;\n            abbrT = format.indexOf('aT') >= 0;\n            abbrForce = abbrK || abbrM || abbrB || abbrT;\n\n            // check for space before abbreviation\n            if (format.indexOf(' a') > -1) {\n                abbr = ' ';\n                format = format.replace(' a', '');\n            } else {\n                format = format.replace('a', '');\n            }\n\n            totalLength = numberLength(value);\n            minimumPrecision = totalLength % 3;\n            minimumPrecision = minimumPrecision === 0 ? 3 : minimumPrecision;\n\n            if (intPrecision && abs !== 0) {\n                pow = 3 * ~~((Math.min(intPrecision, totalLength) - minimumPrecision) / 3);\n                abs = abs / Math.pow(10, pow);\n            }\n\n            if (totalLength !== intPrecision) {\n                if (abs >= Math.pow(10, 12) && !abbrForce || abbrT) {\n                    // trillion\n                    abbr = abbr + cultures[currentCulture].abbreviations.trillion;\n                    value = value / Math.pow(10, 12);\n                } else if (abs < Math.pow(10, 12) && abs >= Math.pow(10, 9) && !abbrForce || abbrB) {\n                    // billion\n                    abbr = abbr + cultures[currentCulture].abbreviations.billion;\n                    value = value / Math.pow(10, 9);\n                } else if (abs < Math.pow(10, 9) && abs >= Math.pow(10, 6) && !abbrForce || abbrM) {\n                    // million\n                    abbr = abbr + cultures[currentCulture].abbreviations.million;\n                    value = value / Math.pow(10, 6);\n                } else if (abs < Math.pow(10, 6) && abs >= Math.pow(10, 3) && !abbrForce || abbrK) {\n                    // thousand\n                    abbr = abbr + cultures[currentCulture].abbreviations.thousand;\n                    value = value / Math.pow(10, 3);\n                }\n            }\n\n            length = numberLength(value);\n            if (intPrecision && length < intPrecision && format.indexOf('.') === -1) {\n                format += '[.]';\n                format += zeroes(intPrecision - length);\n            }\n        }\n\n        // see if we are formatting\n        //   binary-decimal bytes (1024 MB), binary bytes (1024 MiB), or decimal bytes (1000 MB)\n        for (i = 0; i < byteFormatOrder.length; ++i) {\n            byteFormat = byteFormatOrder[i];\n\n            if (format.indexOf(byteFormat.marker) > -1) {\n                // check for space before\n                if (format.indexOf(' ' + byteFormat.marker) >-1) {\n                    bytes = ' ';\n                }\n\n                // remove the marker (with the space if it had one)\n                format = format.replace(bytes + byteFormat.marker, '');\n\n                units = formatByteUnits(value, byteFormat.suffixes, byteFormat.scale);\n\n                value = units.value;\n                bytes = bytes + units.suffix;\n\n                break;\n            }\n        }\n\n        // see if ordinal is wanted\n        if (format.indexOf('o') > -1) {\n            // check for space before\n            if (format.indexOf(' o') > -1) {\n                ord = ' ';\n                format = format.replace(' o', '');\n            } else {\n                format = format.replace('o', '');\n            }\n\n            if (cultures[currentCulture].ordinal) {\n                ord = ord + cultures[currentCulture].ordinal(value);\n            }\n        }\n\n        if (format.indexOf('[.]') > -1) {\n            optDec = true;\n            format = format.replace('[.]', '.');\n        }\n\n        precision = format.split('.')[1];\n        thousands = format.indexOf(',');\n\n        if (precision) {\n            var dSplit = [];\n\n            if (precision.indexOf('*') !== -1) {\n                d = value.toString();\n                dSplit = d.split('.');\n                if (dSplit.length > 1) {\n                    d = toFixed(value, dSplit[1].length, roundingFunction);\n                }\n            } else {\n                if (precision.indexOf('[') > -1) {\n                    precision = precision.replace(']', '');\n                    precision = precision.split('[');\n                    d = toFixed(value, (precision[0].length + precision[1].length), roundingFunction,\n                        precision[1].length);\n                } else {\n                    d = toFixed(value, precision.length, roundingFunction);\n                }\n            }\n\n            dSplit = d.split('.');\n            w = dSplit[0];\n\n            if (dSplit.length > 1 && dSplit[1].length) {\n                var p = sep ? abbr + sep : cultures[currentCulture].delimiters.decimal;\n                d = p + dSplit[1];\n            } else {\n                d = '';\n            }\n\n            if (optDec && Number(d.slice(1)) === 0) {\n                d = '';\n            }\n        } else {\n            w = toFixed(value, 0, roundingFunction);\n        }\n\n        // format number\n        if (w.indexOf('-') > -1) {\n            w = w.slice(1);\n            neg = true;\n        }\n\n        if (w.length < minlen) {\n            w = zeroes(minlen - w.length) + w;\n        }\n\n        if (thousands > -1) {\n            w = w.toString().replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1' +\n                cultures[currentCulture].delimiters.thousands);\n        }\n\n        if (format.indexOf('.') === 0) {\n            w = '';\n        }\n\n        indexOpenP = format.indexOf('(');\n        indexMinus = format.indexOf('-');\n\n        if (indexOpenP < indexMinus) {\n            paren = ((negP && neg) ? '(' : '') + (((forcedNeg && neg) || (!negP && neg)) ? '-' : '');\n        } else {\n            paren = (((forcedNeg && neg) || (!negP && neg)) ? '-' : '') + ((negP && neg) ? '(' : '');\n        }\n\n        return prefix +\n            paren + ((!neg && signed && value !== 0) ? '+' : '') +\n            w + d +\n            ((ord) ? ord : '') +\n            ((abbr && !sep) ? abbr : '') +\n            ((bytes) ? bytes : '') +\n            ((negP && neg) ? ')' : '') +\n            postfix;\n    }\n\n    /************************************\n        Top Level Functions\n    ************************************/\n\n    numbro = function(input) {\n        if (numbro.isNumbro(input)) {\n            input = input.value();\n        } else if (typeof input === 'string' || typeof input === 'number') {\n            input = numbro.fn.unformat(input);\n        } else {\n            input = NaN;\n        }\n\n        return new Numbro(Number(input));\n    };\n\n    // version number\n    numbro.version = VERSION;\n\n    // compare numbro object\n    numbro.isNumbro = function(obj) {\n        return obj instanceof Numbro;\n    };\n\n    /**\n     * This function allow the user to set a new language with a fallback if\n     * the language does not exist. If no fallback language is provided,\n     * it fallbacks to english.\n     *\n     * @deprecated Since in version 1.6.0. It will be deleted in version 2.0\n     * `setCulture` should be used instead.\n     */\n    numbro.setLanguage = function(newLanguage, fallbackLanguage) {\n        console.warn('`setLanguage` is deprecated since version 1.6.0. Use `setCulture` instead');\n        var key = newLanguage,\n            prefix = newLanguage.split('-')[0],\n            matchingLanguage = null;\n        if (!languages[key]) {\n            Object.keys(languages).forEach(function(language) {\n                if (!matchingLanguage && language.split('-')[0] === prefix) {\n                    matchingLanguage = language;\n                }\n            });\n            key = matchingLanguage || fallbackLanguage || 'en-US';\n        }\n        chooseCulture(key);\n    };\n\n    /**\n     * This function allow the user to set a new culture with a fallback if\n     * the culture does not exist. If no fallback culture is provided,\n     * it falls back to \"en-US\".\n     */\n    numbro.setCulture = function(newCulture, fallbackCulture) {\n        var key = newCulture,\n            suffix = newCulture.split('-')[1],\n            matchingCulture = null;\n        if (!cultures[key]) {\n            if (suffix) {\n                Object.keys(cultures).forEach(function(language) {\n                    if (!matchingCulture && language.split('-')[1] === suffix) {\n                        matchingCulture = language;\n                    }\n                });\n            }\n\n            key = matchingCulture || fallbackCulture || 'en-US';\n        }\n        chooseCulture(key);\n    };\n\n    /**\n     * This function will load languages and then set the global language.  If\n     * no arguments are passed in, it will simply return the current global\n     * language key.\n     *\n     * @deprecated Since in version 1.6.0. It will be deleted in version 2.0\n     * `culture` should be used instead.\n     */\n    numbro.language = function(key, values) {\n        console.warn('`language` is deprecated since version 1.6.0. Use `culture` instead');\n\n        if (!key) {\n            return currentCulture;\n        }\n\n        if (key && !values) {\n            if (!languages[key]) {\n                throw new Error('Unknown language : ' + key);\n            }\n            chooseCulture(key);\n        }\n\n        if (values || !languages[key]) {\n            setCulture(key, values);\n        }\n\n        return numbro;\n    };\n\n    /**\n     * This function will load cultures and then set the global culture.  If\n     * no arguments are passed in, it will simply return the current global\n     * culture code.\n     */\n    numbro.culture = function(code, values) {\n        if (!code) {\n            return currentCulture;\n        }\n\n        if (code && !values) {\n            if (!cultures[code]) {\n                throw new Error('Unknown culture : ' + code);\n            }\n            chooseCulture(code);\n        }\n\n        if (values || !cultures[code]) {\n            setCulture(code, values);\n        }\n\n        return numbro;\n    };\n\n    /**\n     * This function provides access to the loaded language data.  If\n     * no arguments are passed in, it will simply return the current\n     * global language object.\n     *\n     * @deprecated Since in version 1.6.0. It will be deleted in version 2.0\n     * `culture` should be used instead.\n     */\n    numbro.languageData = function(key) {\n        console.warn('`languageData` is deprecated since version 1.6.0. Use `cultureData` instead');\n\n        if (!key) {\n            return languages[currentCulture];\n        }\n\n        if (!languages[key]) {\n            throw new Error('Unknown language : ' + key);\n        }\n\n        return languages[key];\n    };\n\n    /**\n     * This function provides access to the loaded culture data.  If\n     * no arguments are passed in, it will simply return the current\n     * global culture object.\n     */\n    numbro.cultureData = function(code) {\n        if (!code) {\n            return cultures[currentCulture];\n        }\n\n        if (!cultures[code]) {\n            throw new Error('Unknown culture : ' + code);\n        }\n\n        return cultures[code];\n    };\n\n    numbro.culture('en-US', enUS);\n\n    /**\n     * @deprecated Since in version 1.6.0. It will be deleted in version 2.0\n     * `cultures` should be used instead.\n     */\n    numbro.languages = function() {\n        console.warn('`languages` is deprecated since version 1.6.0. Use `cultures` instead');\n\n        return languages;\n    };\n\n    numbro.cultures = function() {\n        return cultures;\n    };\n\n    numbro.zeroFormat = function(format) {\n        zeroFormat = typeof(format) === 'string' ? format : null;\n    };\n\n    numbro.defaultFormat = function(format) {\n        defaultFormat = typeof(format) === 'string' ? format : '0.0';\n    };\n\n    numbro.defaultCurrencyFormat = function (format) {\n        defaultCurrencyFormat = typeof(format) === 'string' ? format : '0$';\n    };\n\n    numbro.validate = function(val, culture) {\n\n        var _decimalSep,\n            _thousandSep,\n            _currSymbol,\n            _valArray,\n            _abbrObj,\n            _thousandRegEx,\n            cultureData,\n            temp;\n\n        //coerce val to string\n        if (typeof val !== 'string') {\n            val += '';\n            if (console.warn) {\n                console.warn('Numbro.js: Value is not string. It has been co-erced to: ', val);\n            }\n        }\n\n        //trim whitespaces from either sides\n        val = val.trim();\n\n        //replace the initial '+' or '-' sign if present\n        val = val.replace(/^[+-]?/, '');\n\n        //if val is just digits return true\n        if ( !! val.match(/^\\d+$/)) {\n            return true;\n        }\n\n        //if val is empty return false\n        if (val === '') {\n            return false;\n        }\n\n        //get the decimal and thousands separator from numbro.cultureData\n        try {\n            //check if the culture is understood by numbro. if not, default it to current culture\n            cultureData = numbro.cultureData(culture);\n        } catch (e) {\n            cultureData = numbro.cultureData(numbro.culture());\n        }\n\n        //setup the delimiters and currency symbol based on culture\n        _currSymbol = cultureData.currency.symbol;\n        _abbrObj = cultureData.abbreviations;\n        _decimalSep = cultureData.delimiters.decimal;\n        if (cultureData.delimiters.thousands === '.') {\n            _thousandSep = '\\\\.';\n        } else {\n            _thousandSep = cultureData.delimiters.thousands;\n        }\n\n        // validating currency symbol\n        temp = val.match(/^[^\\d\\.\\,]+/);\n        if (temp !== null) {\n            val = val.substr(1);\n            if (temp[0] !== _currSymbol) {\n                return false;\n            }\n        }\n\n        //validating abbreviation symbol\n        temp = val.match(/[^\\d]+$/);\n        if (temp !== null) {\n            val = val.slice(0, -1);\n            if (temp[0] !== _abbrObj.thousand && temp[0] !== _abbrObj.million &&\n                    temp[0] !== _abbrObj.billion && temp[0] !== _abbrObj.trillion) {\n                return false;\n            }\n        }\n\n        _thousandRegEx = new RegExp(_thousandSep + '{2}');\n\n        if (!val.match(/[^\\d.,]/g)) {\n            _valArray = val.split(_decimalSep);\n            if (_valArray.length > 2) {\n                return false;\n            } else {\n                if (_valArray.length < 2) {\n                    return ( !! _valArray[0].match(/^\\d+.*\\d$/) && !_valArray[0].match(_thousandRegEx));\n                } else {\n                    if (_valArray[0] === '') {\n                        // for values without leading zero eg. .984\n                        return (!_valArray[0].match(_thousandRegEx) &&\n                            !!_valArray[1].match(/^\\d+$/));\n\n                    } else if (_valArray[0].length === 1) {\n                        return ( !! _valArray[0].match(/^\\d+$/) &&\n                            !_valArray[0].match(_thousandRegEx) &&\n                            !! _valArray[1].match(/^\\d+$/));\n                    } else {\n                        return ( !! _valArray[0].match(/^\\d+.*\\d$/) &&\n                            !_valArray[0].match(_thousandRegEx) &&\n                            !! _valArray[1].match(/^\\d+$/));\n                    }\n                }\n            }\n        }\n\n        return false;\n    };\n\n    /**\n     * * @deprecated Since in version 1.6.0. It will be deleted in version 2.0\n     * `loadCulturesInNode` should be used instead.\n     */\n    numbro.loadLanguagesInNode = function() {\n        console.warn('`loadLanguagesInNode` is deprecated since version 1.6.0. Use `loadCulturesInNode` instead');\n\n        numbro.loadCulturesInNode();\n    };\n\n    numbro.loadCulturesInNode = function() {\n        // TODO: Rename the folder in 2.0.0\n        var cultures = __webpack_require__(369);\n\n        for(var langLocaleCode in cultures) {\n            if(langLocaleCode) {\n                numbro.culture(langLocaleCode, cultures[langLocaleCode]);\n            }\n        }\n    };\n\n    /************************************\n        Helpers\n    ************************************/\n\n    function setCulture(code, values) {\n        cultures[code] = values;\n    }\n\n    function chooseCulture(code) {\n        currentCulture = code;\n        var defaults = cultures[code].defaults;\n        if (defaults && defaults.format) {\n            numbro.defaultFormat(defaults.format);\n        }\n        if (defaults && defaults.currencyFormat) {\n            numbro.defaultCurrencyFormat(defaults.currencyFormat);\n        }\n    }\n\n    function inNodejsRuntime() {\n        return (typeof process !== 'undefined') &&\n            (process.browser === undefined) &&\n            process.title &&\n            (\n                process.title.indexOf('node') !== -1 ||\n                process.title.indexOf('meteor-tool') > 0 ||\n                process.title === 'grunt' ||\n                process.title === 'gulp'\n            ) &&\n            (\"function\" !== 'undefined');\n    }\n\n    /************************************\n        Floating-point helpers\n    ************************************/\n\n    // The floating-point helper functions and implementation\n    // borrows heavily from sinful.js: http://guipn.github.io/sinful.js/\n\n    /**\n     * Array.prototype.reduce for browsers that don't support it\n     * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Compatibility\n     */\n    if ('function' !== typeof Array.prototype.reduce) {\n        Array.prototype.reduce = function(callback, optInitialValue) {\n\n            if (null === this || 'undefined' === typeof this) {\n                // At the moment all modern browsers, that support strict mode, have\n                // native implementation of Array.prototype.reduce. For instance, IE8\n                // does not support strict mode, so this check is actually useless.\n                throw new TypeError('Array.prototype.reduce called on null or undefined');\n            }\n\n            if ('function' !== typeof callback) {\n                throw new TypeError(callback + ' is not a function');\n            }\n\n            var index,\n                value,\n                length = this.length >>> 0,\n                isValueSet = false;\n\n            if (1 < arguments.length) {\n                value = optInitialValue;\n                isValueSet = true;\n            }\n\n            for (index = 0; length > index; ++index) {\n                if (this.hasOwnProperty(index)) {\n                    if (isValueSet) {\n                        value = callback(value, this[index], index, this);\n                    } else {\n                        value = this[index];\n                        isValueSet = true;\n                    }\n                }\n            }\n\n            if (!isValueSet) {\n                throw new TypeError('Reduce of empty array with no initial value');\n            }\n\n            return value;\n        };\n    }\n\n\n    /**\n     * Computes the multiplier necessary to make x >= 1,\n     * effectively eliminating miscalculations caused by\n     * finite precision.\n     */\n    function multiplier(x) {\n        var parts = x.toString().split('.');\n        if (parts.length < 2) {\n            return 1;\n        }\n        return Math.pow(10, parts[1].length);\n    }\n\n    /**\n     * Given a variable number of arguments, returns the maximum\n     * multiplier that must be used to normalize an operation involving\n     * all of them.\n     */\n    function correctionFactor() {\n        var args = Array.prototype.slice.call(arguments);\n        return args.reduce(function(prev, next) {\n            var mp = multiplier(prev),\n                mn = multiplier(next);\n            return mp > mn ? mp : mn;\n        }, -Infinity);\n    }\n\n    /************************************\n        Numbro Prototype\n    ************************************/\n\n\n    numbro.fn = Numbro.prototype = {\n\n        clone: function() {\n            return numbro(this);\n        },\n\n        format: function(inputString, roundingFunction) {\n            return formatNumbro(this,\n                inputString ? inputString : defaultFormat,\n                (roundingFunction !== undefined) ? roundingFunction : Math.round\n            );\n        },\n\n        formatCurrency: function(inputString, roundingFunction) {\n            return formatCurrency(this,\n                cultures[currentCulture].currency.symbol,\n                inputString ? inputString : defaultCurrencyFormat,\n                (roundingFunction !== undefined) ? roundingFunction : Math.round\n            );\n        },\n\n        formatForeignCurrency: function(currencySymbol, inputString, roundingFunction) {\n            return formatForeignCurrency(this,\n                currencySymbol,\n                inputString ? inputString : defaultCurrencyFormat,\n                (roundingFunction !== undefined) ? roundingFunction : Math.round\n            );\n        },\n\n        unformat: function(inputString) {\n            if (typeof inputString === 'number') {\n                return inputString;\n            } else if (typeof inputString === 'string') {\n                var result = unformatNumbro(this, inputString);\n\n                // Any unparseable string (represented as NaN in the result) is\n                // converted into undefined.\n                return isNaN(result) ? undefined : result;\n            } else {\n                return undefined;\n            }\n        },\n\n        binaryByteUnits: function() {\n            return formatByteUnits(this._value, bytes.binary.suffixes, bytes.binary.scale).suffix;\n        },\n\n        byteUnits: function() {\n            return formatByteUnits(this._value, bytes.general.suffixes, bytes.general.scale).suffix;\n        },\n\n        decimalByteUnits: function() {\n            return formatByteUnits(this._value, bytes.decimal.suffixes, bytes.decimal.scale).suffix;\n        },\n\n        value: function() {\n            return this._value;\n        },\n\n        valueOf: function() {\n            return this._value;\n        },\n\n        set: function(value) {\n            this._value = Number(value);\n            return this;\n        },\n\n        add: function(value) {\n            var corrFactor = correctionFactor.call(null, this._value, value);\n\n            function cback(accum, curr) {\n                return accum + corrFactor * curr;\n            }\n            this._value = [this._value, value].reduce(cback, 0) / corrFactor;\n            return this;\n        },\n\n        subtract: function(value) {\n            var corrFactor = correctionFactor.call(null, this._value, value);\n\n            function cback(accum, curr) {\n                return accum - corrFactor * curr;\n            }\n            this._value = [value].reduce(cback, this._value * corrFactor) / corrFactor;\n            return this;\n        },\n\n        multiply: function(value) {\n            function cback(accum, curr) {\n                var corrFactor = correctionFactor(accum, curr),\n                    result = accum * corrFactor;\n                result *= curr * corrFactor;\n                result /= corrFactor * corrFactor;\n                return result;\n            }\n            this._value = [this._value, value].reduce(cback, 1);\n            return this;\n        },\n\n        divide: function(value) {\n            function cback(accum, curr) {\n                var corrFactor = correctionFactor(accum, curr);\n                return (accum * corrFactor) / (curr * corrFactor);\n            }\n            this._value = [this._value, value].reduce(cback);\n            return this;\n        },\n\n        difference: function(value) {\n            return Math.abs(numbro(this._value).subtract(value).value());\n        }\n\n    };\n\n    /************************************\n        Exposing Numbro\n    ************************************/\n\n    if (inNodejsRuntime()) {\n        //Todo: Rename the folder in 2.0.0\n        numbro.loadCulturesInNode();\n    }\n\n    // CommonJS module is defined\n    if (hasModule) {\n        module.exports = numbro;\n    } else {\n        /*global ender:false */\n        if (typeof ender === 'undefined') {\n            // here, `this` means `window` in the browser, or `global` on the server\n            // add `numbro` as a global object via a string identifier,\n            // for Closure Compiler 'advanced' mode\n            this.numbro = numbro;\n        }\n\n        /*global define:false */\n        if (true) {\n            !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n                return numbro;\n            }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n        }\n    }\n\n}.call(typeof window === 'undefined' ? this : window));\n\n\n/*** EXPORTS FROM exports-to-window-loader ***/\nwindow['numbro'] = __webpack_require__(309);\n\n/***/ }),\n/* 310 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getNormalizedDate = getNormalizedDate;\n/* eslint-disable import/prefer-default-export */\n\n/**\n * Get normalized Date object for the ISO formatted date strings.\n * Natively, the date object parsed from a ISO 8601 string will be offsetted by the timezone difference, which may result in returning a wrong date.\n * See: Github issue #3338.\n *\n * @param {String} dateString String representing the date.\n * @returns {Date} The proper Date object.\n */\nfunction getNormalizedDate(dateString) {\n  var nativeDate = new Date(dateString);\n\n  // NaN if dateString is not in ISO format\n  if (!isNaN(new Date(dateString + \"T00:00\").getDate())) {\n\n    // Compensate timezone offset\n    return new Date(nativeDate.getTime() + nativeDate.getTimezoneOffset() * 60000);\n  }\n\n  return nativeDate;\n}\n\n/***/ }),\n/* 311 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * SheetClip - Spreadsheet Clipboard Parser\n * version 0.2\n *\n * This tiny library transforms JavaScript arrays to strings that are pasteable by LibreOffice, OpenOffice,\n * Google Docs and Microsoft Excel.\n *\n * Copyright 2012, Marcin Warpechowski\n * Licensed under the MIT license.\n * http://github.com/warpech/sheetclip/\n */\n/*jslint white: true*/\n(function (global) {\n  \"use strict\";\n\n  function countQuotes(str) {\n    return str.split('\"').length - 1;\n  }\n\n  var SheetClip = {\n    /**\n     * Decode spreadsheet string into array\n     *\n     * @param {String} str\n     * @returns {Array}\n     */\n    parse: function parse(str) {\n      var r,\n          rLen,\n          rows,\n          arr = [],\n          a = 0,\n          c,\n          cLen,\n          multiline,\n          last;\n\n      rows = str.split('\\n');\n\n      if (rows.length > 1 && rows[rows.length - 1] === '') {\n        rows.pop();\n      }\n      for (r = 0, rLen = rows.length; r < rLen; r += 1) {\n        rows[r] = rows[r].split('\\t');\n\n        for (c = 0, cLen = rows[r].length; c < cLen; c += 1) {\n          if (!arr[a]) {\n            arr[a] = [];\n          }\n          if (multiline && c === 0) {\n            last = arr[a].length - 1;\n            arr[a][last] = arr[a][last] + '\\n' + rows[r][0];\n\n            if (multiline && countQuotes(rows[r][0]) & 1) {\n              //& 1 is a bitwise way of performing mod 2\n              multiline = false;\n              arr[a][last] = arr[a][last].substring(0, arr[a][last].length - 1).replace(/\"\"/g, '\"');\n            }\n          } else {\n            if (c === cLen - 1 && rows[r][c].indexOf('\"') === 0 && countQuotes(rows[r][c]) & 1) {\n              arr[a].push(rows[r][c].substring(1).replace(/\"\"/g, '\"'));\n              multiline = true;\n            } else {\n              arr[a].push(rows[r][c].replace(/\"\"/g, '\"'));\n              multiline = false;\n            }\n          }\n        }\n        if (!multiline) {\n          a += 1;\n        }\n      }\n\n      return arr;\n    },\n\n    /**\n     * Encode array into valid spreadsheet string\n     *\n     * @param arr\n     * @returns {String}\n     */\n    stringify: function stringify(arr) {\n      var r,\n          rLen,\n          c,\n          cLen,\n          str = '',\n          val;\n\n      for (r = 0, rLen = arr.length; r < rLen; r += 1) {\n        cLen = arr[r].length;\n\n        for (c = 0; c < cLen; c += 1) {\n          if (c > 0) {\n            str += '\\t';\n          }\n          val = arr[r][c];\n\n          if (typeof val === 'string') {\n            if (val.indexOf('\\n') > -1) {\n              str += '\"' + val.replace(/\"/g, '\"\"') + '\"';\n            } else {\n              str += val;\n            }\n          } else if (val === null || val === void 0) {\n            // void 0 resolves to undefined\n            str += '';\n          } else {\n            str += val;\n          }\n        }\n\n        if (r !== rLen - 1) {\n          str += '\\n';\n        }\n      }\n\n      return str;\n    }\n  };\n\n  if (true) {\n    exports.parse = SheetClip.parse;\n    exports.stringify = SheetClip.stringify;\n  } else {\n    global.SheetClip = SheetClip;\n  }\n})(window);\n\n/***/ }),\n/* 312 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.mouseDown = mouseDown;\nexports.mouseOver = mouseOver;\nexports.handleMouseEvent = handleMouseEvent;\n\nvar _event = __webpack_require__(12);\n\nvar _src = __webpack_require__(4);\n\n/**\n * MouseDown handler.\n *\n * @param {Object} options\n * @param {Boolean} options.isShiftKey The flag which indicates if the shift key is pressed.\n * @param {Boolean} options.isLeftClick The flag which indicates if the left mouse button is pressed.\n * @param {Boolean} options.isRightClick The flag which indicates if the right mouse button is pressed.\n * @param {CellRange} options.coords The CellCoords object with defined visual coordinates.\n * @param {Selection} options.selection The Selection class instance.\n * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what\n *                                    operation will be performed in later selection stages.\n */\nfunction mouseDown(_ref) {\n  var isShiftKey = _ref.isShiftKey,\n      isLeftClick = _ref.isLeftClick,\n      isRightClick = _ref.isRightClick,\n      coords = _ref.coords,\n      selection = _ref.selection,\n      controller = _ref.controller;\n\n  var currentSelection = selection.isSelected() ? selection.getSelectedRange().current() : null;\n  var selectedCorner = selection.isSelectedByCorner();\n  var selectedRow = selection.isSelectedByRowHeader();\n  var selectedColumn = selection.isSelectedByColumnHeader();\n\n  if (isShiftKey && currentSelection) {\n    if (coords.row >= 0 && coords.col >= 0 && !controller.cells) {\n      selection.setRangeEnd(coords);\n    } else if ((selectedCorner || selectedRow) && coords.row >= 0 && coords.col >= 0 && !controller.cells) {\n      selection.setRangeEnd(new _src.CellCoords(coords.row, coords.col));\n    } else if (selectedCorner && coords.row < 0 && !controller.column) {\n      selection.setRangeEnd(new _src.CellCoords(currentSelection.to.row, coords.col));\n    } else if (selectedRow && coords.col < 0 && !controller.row) {\n      selection.setRangeEnd(new _src.CellCoords(coords.row, currentSelection.to.col));\n    } else if ((!selectedCorner && !selectedRow && coords.col < 0 || selectedCorner && coords.col < 0) && !controller.row) {\n      selection.selectRows(currentSelection.from.row, coords.row);\n    } else if ((!selectedCorner && !selectedRow && coords.row < 0 || selectedRow && coords.row < 0) && !controller.column) {\n      selection.selectColumns(currentSelection.from.col, coords.col);\n    }\n  } else {\n    var newCoord = new _src.CellCoords(coords.row, coords.col);\n\n    if (newCoord.row < 0) {\n      newCoord.row = 0;\n    }\n    if (newCoord.col < 0) {\n      newCoord.col = 0;\n    }\n\n    var allowRightClickSelection = !selection.inInSelection(newCoord);\n    var performSelection = isLeftClick || isRightClick && allowRightClickSelection;\n\n    // clicked row header and when some column was selected\n    if (coords.row < 0 && coords.col >= 0 && !controller.column) {\n      if (performSelection) {\n        selection.selectColumns(coords.col);\n      }\n\n      // clicked column header and when some row was selected\n    } else if (coords.col < 0 && coords.row >= 0 && !controller.row) {\n      if (performSelection) {\n        selection.selectRows(coords.row);\n      }\n    } else if (coords.col >= 0 && coords.row >= 0 && !controller.cells) {\n      if (performSelection) {\n        selection.setRangeStart(coords);\n      }\n    } else if (coords.col < 0 && coords.row < 0) {\n      selection.setRangeStart(coords);\n    }\n  }\n}\n\n/**\n * MouseOver handler.\n *\n * @param {Object} options\n * @param {Boolean} options.isLeftClick\n * @param {CellRange} options.coords The CellCoords object with defined visual coordinates.\n * @param {Selection} options.selection The Selection class instance.\n * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what\n *                                    operation will be performed in later selection stages.\n */\nfunction mouseOver(_ref2) {\n  var isLeftClick = _ref2.isLeftClick,\n      coords = _ref2.coords,\n      selection = _ref2.selection,\n      controller = _ref2.controller;\n\n  if (!isLeftClick) {\n    return;\n  }\n\n  var selectedRow = selection.isSelectedByRowHeader();\n  var selectedColumn = selection.isSelectedByColumnHeader();\n  var countCols = selection.tableProps.countCols();\n  var countRows = selection.tableProps.countRows();\n\n  if (selectedColumn && !controller.column) {\n    selection.setRangeEnd(new _src.CellCoords(countRows - 1, coords.col));\n  } else if (selectedRow && !controller.row) {\n    selection.setRangeEnd(new _src.CellCoords(coords.row, countCols - 1));\n  } else if (!controller.cell) {\n    selection.setRangeEnd(coords);\n  }\n}\n\nvar handlers = new Map([['mousedown', mouseDown], ['mouseover', mouseOver], ['touchstart', mouseDown]]);\n\n/**\n * Mouse handler for selection functionality.\n *\n * @param {Event} event An native event to handle.\n * @param {Object} options\n * @param {CellRange} options.coords The CellCoords object with defined visual coordinates.\n * @param {Selection} options.selection The Selection class instance.\n * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what\n *                                    operation will be performed in later selection stages.\n */\nfunction handleMouseEvent(event, _ref3) {\n  var coords = _ref3.coords,\n      selection = _ref3.selection,\n      controller = _ref3.controller;\n\n  handlers.get(event.type)({\n    coords: coords,\n    selection: selection,\n    controller: controller,\n    isShiftKey: event.shiftKey,\n    isLeftClick: (0, _event.isLeftClick)(event) || event.type === 'touchstart',\n    isRightClick: (0, _event.isRightClick)(event)\n  });\n}\n\n/***/ }),\n/* 313 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.RecordTranslator = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.registerIdentity = registerIdentity;\nexports.getTranslator = getTranslator;\n\nvar _core = __webpack_require__(88);\n\nvar _core2 = _interopRequireDefault(_core);\n\nvar _object = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class RecordTranslator\n * @util\n */\nvar RecordTranslator = function () {\n  function RecordTranslator(hot) {\n    _classCallCheck(this, RecordTranslator);\n\n    this.hot = hot;\n  }\n\n  /**\n   * Translate physical row index into visual.\n   *\n   * @param {Number} row Physical row index.\n   * @returns {Number} Returns visual row index.\n   */\n\n\n  _createClass(RecordTranslator, [{\n    key: 'toVisualRow',\n    value: function toVisualRow(row) {\n      return this.hot.runHooks('unmodifyRow', row);\n    }\n\n    /**\n     * Translate physical column index into visual.\n     *\n     * @param {Number} column Physical column index.\n     * @returns {Number} Returns visual column index.\n     */\n\n  }, {\n    key: 'toVisualColumn',\n    value: function toVisualColumn(column) {\n      return this.hot.runHooks('unmodifyCol', column);\n    }\n\n    /**\n     * Translate physical coordinates into visual. Can be passed as separate 2 arguments (row, column) or as an object in first\n     * argument with `row` and `column` keys.\n     *\n     * @param {Number|Object} row Physical coordinates or row index.\n     * @param {Number} [column] Physical column index.\n     * @returns {Object|Array} Returns an object with visual records or an array if coordinates passed as separate arguments.\n     */\n\n  }, {\n    key: 'toVisual',\n    value: function toVisual(row, column) {\n      var result = void 0;\n\n      if ((0, _object.isObject)(row)) {\n        result = {\n          row: this.toVisualRow(row.row),\n          column: this.toVisualColumn(row.column)\n        };\n      } else {\n        result = [this.toVisualRow(row), this.toVisualColumn(column)];\n      }\n\n      return result;\n    }\n\n    /**\n     * Translate visual row index into physical.\n     *\n     * @param {Number} row Visual row index.\n     * @returns {Number} Returns physical row index.\n     */\n\n  }, {\n    key: 'toPhysicalRow',\n    value: function toPhysicalRow(row) {\n      return this.hot.runHooks('modifyRow', row);\n    }\n\n    /**\n     * Translate visual column index into physical.\n     *\n     * @param {Number} column Visual column index.\n     * @returns {Number} Returns physical column index.\n     */\n\n  }, {\n    key: 'toPhysicalColumn',\n    value: function toPhysicalColumn(column) {\n      return this.hot.runHooks('modifyCol', column);\n    }\n\n    /**\n     * Translate visual coordinates into physical. Can be passed as separate 2 arguments (row, column) or as an object in first\n     * argument with `row` and `column` keys.\n     *\n     * @param {Number|Object} row Visual coordinates or row index.\n     * @param {Number} [column] Visual column index.\n     * @returns {Object|Array} Returns an object with physical records or an array if coordinates passed as separate arguments.\n     */\n\n  }, {\n    key: 'toPhysical',\n    value: function toPhysical(row, column) {\n      var result = void 0;\n\n      if ((0, _object.isObject)(row)) {\n        result = {\n          row: this.toPhysicalRow(row.row),\n          column: this.toPhysicalColumn(row.column)\n        };\n      } else {\n        result = [this.toPhysicalRow(row), this.toPhysicalColumn(column)];\n      }\n\n      return result;\n    }\n  }]);\n\n  return RecordTranslator;\n}();\n\nexports.RecordTranslator = RecordTranslator;\n\n\nvar identities = new WeakMap();\nvar translatorSingletons = new WeakMap();\n\nfunction registerIdentity(identity, hot) {\n  identities.set(identity, hot);\n}\n\nfunction getTranslator(identity) {\n  var singleton = void 0;\n\n  if (!(identity instanceof _core2.default)) {\n    if (!identities.has(identity)) {\n      throw Error('Record translator was not registered for this object identity');\n    }\n    identity = identities.get(identity);\n  }\n  if (translatorSingletons.has(identity)) {\n    singleton = translatorSingletons.get(identity);\n  } else {\n    singleton = new RecordTranslator(identity);\n    translatorSingletons.set(identity, singleton);\n  }\n\n  return singleton;\n}\n\n/***/ }),\n/* 314 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.registerAsRootInstance = registerAsRootInstance;\nexports.hasValidParameter = hasValidParameter;\nexports.isRootInstance = isRootInstance;\nvar holder = exports.holder = new WeakMap();\n\nvar rootInstanceSymbol = exports.rootInstanceSymbol = Symbol('rootInstance');\n\n/**\n * Register an object as a root instance.\n *\n * @param  {Object} object An object to associate with root instance flag.\n */\nfunction registerAsRootInstance(object) {\n  holder.set(object, true);\n}\n\n/**\n * Check if the source of the root indication call is valid.\n *\n * @param  {Symbol} rootSymbol A symbol as a source of truth.\n * @return {Boolean}\n */\nfunction hasValidParameter(rootSymbol) {\n  return rootSymbol === rootInstanceSymbol;\n}\n\n/**\n * Check if passed an object was flagged as a root instance.\n *\n * @param  {Object} object An object to check.\n * @return {Boolean}\n */\nfunction isRootInstance(object) {\n  return holder.has(object);\n}\n\n/***/ }),\n/* 315 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _mixed = __webpack_require__(16);\n\nvar _object = __webpack_require__(2);\n\n/**\n * @alias Options\n * @constructor\n * @description\n\n * ## Constructor options\n *\n * Constructor options are applied using an object literal passed as a second argument to the Handsontable constructor.\n *\n * ```js\n * var hot = new Handsontable(document.getElementById('example1'), {\n *   data: myArray,\n *   width: 400,\n *   height: 300\n * });\n * ```\n *\n * ---\n * ## Cascading configuration\n *\n * Handsontable 0.9 and newer is using *Cascading Configuration*, which is a fast way to provide configuration options\n * for the entire table, including its columns and particular cells.\n *\n * Consider the following example:\n * ```js\n * var hot = new Handsontable(document.getElementById('example'), {\n *   readOnly: true,\n *   columns: [\n *     {readOnly: false},\n *     {},\n *     {}\n *   ],\n *   cells: function (row, col, prop) {\n *     var cellProperties = {};\n *\n *     if (row === 0 && col === 0) {\n *       cellProperties.readOnly = true;\n *     }\n *\n *     return cellProperties;\n *   }\n * });\n * ```\n *\n * The above notation will result in all TDs being *read only*, except for first column TDs which will be *editable*, except for the TD in top left corner which will still be *read only*.\n *\n * ### The Cascading Configuration model\n *\n * ##### 1. Constructor\n *\n * Configuration options that are provided using first-level `handsontable(container, {option: \"value\"})` and `updateSettings` method.\n *\n * ##### 2. Columns\n *\n * Configuration options that are provided using second-level object `handsontable(container, {columns: {option: \"value\"}]})`\n *\n * ##### 3. Cells\n *\n * Configuration options that are provided using third-level function `handsontable(container, {cells: function: (row, col, prop){ }})`\n *\n * ---\n * ## Architecture performance\n *\n * The Cascading Configuration model is based on prototypical inheritance. It is much faster and memory efficient compared\n * to the previous model that used jQuery extend. See: [http://jsperf.com/extending-settings](http://jsperf.com/extending-settings).\n *\n * ---\n * __Important notice:__ In order for the data separation to work properly, make sure that each instance of Handsontable has a unique `id`.\n */\nfunction DefaultSettings() {};\n\nDefaultSettings.prototype = {\n  /**\n   * License key for commercial version of Handsontable.\n   *\n   * @pro\n   * @type {String}\n   * @default 'trial'\n   */\n  licenseKey: 'trial',\n\n  /**\n   * @description\n   * Initial data source that will be bound to the data grid __by reference__ (editing data grid alters the data source).\n   * Can be declared as an Array of Arrays, Array of Objects or a Function.\n   *\n   * See [Understanding binding as reference](http://docs.handsontable.com/tutorial-data-binding.html#page-reference).\n   *\n   * @type {Array|Function}\n   * @default undefined\n   */\n  data: void 0,\n\n  /**\n   * @description\n   * Defines the structure of a new row when data source is an array of objects.\n   *\n   * See [data-schema](http://docs.handsontable.com/tutorial-data-sources.html#page-data-schema) for examples.\n   *\n   * @type {Object}\n   * @default undefined\n   */\n  dataSchema: void 0,\n\n  /**\n   * Width of the grid. Can be a value or a function that returns a value.\n   *\n   * @type {Number|Function}\n   * @default undefined\n   */\n  width: void 0,\n\n  /**\n   * Height of the grid. Can be a number or a function that returns a number.\n   *\n   * @type {Number|Function}\n   * @default undefined\n   */\n  height: void 0,\n\n  /**\n   * @description\n   * Initial number of rows.\n   *\n   * __Notice:__ This option only has effect in Handsontable constructor and only if `data` option is not provided\n   *\n   * @type {Number}\n   * @default 5\n   */\n  startRows: 5,\n\n  /**\n   * @description\n   * Initial number of columns.\n   *\n   * __Notice:__ This option only has effect in Handsontable constructor and only if `data` option is not provided\n   *\n   * @type {Number}\n   * @default 5\n   */\n  startCols: 5,\n\n  /**\n   * Setting `true` or `false` will enable or disable the default row headers (1, 2, 3).\n   * You can also define an array `['One', 'Two', 'Three', ...]` or a function to define the headers.\n   * If a function is set the index of the row is passed as a parameter.\n   *\n   * @type {Boolean|Array|Function}\n   * @default null\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * rowHeaders: true,\n   * ...\n   *\n   * ...\n   * // as array\n   * rowHeaders: [1, 2, 3],\n   * ...\n   *\n   * ...\n   * // as function\n   * rowHeaders: function(index) {\n   *   return index + ': AB';\n   * },\n   * ...\n   * ```\n   */\n  rowHeaders: void 0,\n\n  /**\n   * Setting `true` or `false` will enable or disable the default column headers (A, B, C).\n   * You can also define an array `['One', 'Two', 'Three', ...]` or a function to define the headers.\n   * If a function is set, then the index of the column is passed as a parameter.\n   *\n   * @type {Boolean|Array|Function}\n   * @default null\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * colHeaders: true,\n   * ...\n   *\n   * ...\n   * // as array\n   * colHeaders: ['A', 'B', 'C'],\n   * ...\n   *\n   * ...\n   * // as function\n   * colHeaders: function(index) {\n   *   return index + ': AB';\n   * },\n   * ...\n   * ```\n   */\n  colHeaders: null,\n\n  /**\n   * Defines column widths in pixels. Accepts number, string (that will be converted to a number),\n   * array of numbers (if you want to define column width separately for each column) or a\n   * function (if you want to set column width dynamically on each render).\n   *\n   * @type {Array|Function|Number|String}\n   * @default undefined\n   * @example\n   * ```js\n   * ...\n   * // as numeric, for each column.\n   * colWidths: 100,\n   * ...\n   *\n   * * ...\n   * // as string, for each column.\n   * colWidths: '100px',\n   * ...\n   *\n   * ...\n   * // as array, based on visual indexes. The rest of the columns have a default width.\n   * colWidths: [100, 120, 90],\n   * ...\n   *\n   * ...\n   * // as function, based on visual indexes.\n   * colWidths: function(index) {\n   *   return index * 10;\n   * },\n   * ...\n   * ```\n   */\n  colWidths: void 0,\n\n  /**\n   * Defines row heights in pixels. Accepts numbers, strings (that will be converted into a number),\n   * array of numbers (if you want to define row height separately for each row) or a\n   * function (if you want to set row height dynamically on each render).\n   * If the ManualRowResize or AutoRowSize plugins are enabled, this is also the minimum height that can be set\n   * via either of those two plugins.\n   * Height should be equal or greater than 23px. Table is rendered incorrectly if height is less than 23px.\n   *\n   * @type {Array|Function|Number|String}\n   * @default undefined\n   * @example\n   * ```js\n   * ...\n   * // as numeric, for each row.\n   * rowHeights: 100,\n   * ...\n   *\n   * * ...\n   * // as string, for each row.\n   * rowHeights: '100px',\n   * ...\n   *\n   * ...\n   * // as array, based on visual indexes. The rest of the rows have a default height.\n   * rowHeights: [100, 120, 90],\n   * ...\n   *\n   * ...\n   * // as function, based on visual indexes.\n   * rowHeights: function(index) {\n   *   return index * 10;\n   * },\n   * ...\n   * ```\n   */\n  rowHeights: void 0,\n\n  /**\n   * @description\n   * Defines the cell properties and data binding for certain columns.\n   *\n   * __Notice:__ Using this option sets a fixed number of columns (options `startCols`, `minCols`, `maxCols` will be ignored).\n   *\n   * See [documentation -> datasources.html](http://docs.handsontable.com/tutorial-data-sources.html#page-nested) for examples.\n   *\n   * @type {Array|Function}\n   * @default undefined\n   * @example\n   * ```js\n   * ...\n   * // as an array of objects. Order of the objects in array is representation of physical indexes.\n   * columns: [\n   *   {\n   *     // column options for the first column\n   *     type: 'numeric',\n   *     numericFormat: {\n   *       pattern: '0,0.00 $'\n   *     }\n   *   },\n   *   {\n   *     // column options for the second column\n   *     type: 'text',\n   *     readOnly: true\n   *   }\n   * ],\n   * ...\n   *\n   * // or as function, based on physical indexes\n   * ...\n   * columns: function(index) {\n  *    return {\n  *      type: index > 0 ? 'numeric' : 'text',\n  *      readOnly: index < 1\n  *    }\n   * }\n   * ...\n   * ```\n   */\n  columns: void 0,\n\n  /**\n   * @description\n   * Defines the cell properties for given `row`, `col`, `prop` coordinates.\n   * Any constructor or column option may be overwritten for a particular cell (row/column combination)\n   * using the `cells` property in the Handsontable constructor.\n   *\n   * __Note:__ Parameters `row` and `col` always represent __physical indexes__. Example below show how to execute\n   * operations based on the __visual__ representation of Handsontable.\n   *\n   * Possible values of `prop`:\n   * - property name for column's data source object, when dataset is an [array of objects](/tutorial-data-sources.html#page-object)\n   * - the same number as `col`, when dataset is an [array of arrays](/tutorial-data-sources.html#page-array)\n   *\n   * @type {Function}\n   * @default undefined\n   * @example\n   * ```js\n   * ...\n   * cells: function (row, col, prop) {\n   *   var cellProperties = {};\n   *   var visualRowIndex = this.instance.toVisualRow(row);\n   *   var visualColIndex = this.instance.toVisualColumn(col);\n   *\n   *   if (visualRowIndex === 0 && visualColIndex === 0) {\n   *     cellProperties.readOnly = true;\n   *   }\n   *\n   *   return cellProperties;\n   * },\n   * ...\n   * ```\n   */\n  cells: void 0,\n\n  /**\n   * Any constructor or column option may be overwritten for a particular cell (row/column combination), using `cell`\n   * array passed to the Handsontable constructor.\n   *\n   * @type {Array}\n   * @default []\n   * @example\n   * ```js\n   * ...\n   * cell: [\n   *   {row: 0, col: 0, readOnly: true}\n   * ],\n   * ...\n   * ```\n   */\n  cell: [],\n\n  /**\n   * @description\n   * If `true`, enables the {@link Comments} plugin, which enables an option to apply cell comments through the context menu\n   * (configurable with context menu keys `commentsAddEdit`, `commentsRemove`).\n   *\n   * To initialize Handsontable with predefined comments, provide cell coordinates and comment text values in a form of an array.\n   *\n   * See [Comments](http://docs.handsontable.com/demo-comments_.html) demo for examples.\n   *\n   * @since 0.11.0\n   * @type {Boolean|Array}\n   * @default false\n   * @example\n   * ```js\n   * ...\n   * comments: [{row: 1, col: 1, comment: {value: \"Test comment\"}}],\n   * ...\n   * ```\n   */\n  comments: false,\n\n  /**\n   * @description\n   * If `true`, enables the Custom Borders plugin, which enables an option to apply custom borders through the context menu (configurable with context menu key `borders`).\n   *\n   * To initialize Handsontable with predefined custom borders, provide cell coordinates and border styles in a form of an array.\n   *\n   * See [Custom Borders](http://docs.handsontable.com/demo-custom-borders.html) demo for examples.\n   *\n   * @since 0.11.0\n   * @type {Boolean|Array}\n   * @default false\n   * @example\n   * ```js\n   * ...\n   * customBorders: [\n   *   {range: {\n   *     from: {row: 1, col: 1},\n   *     to: {row: 3, col: 4}},\n   *     left: {},\n   *     right: {},\n   *     top: {},\n   *     bottom: {}\n   *   }\n   * ],\n   * ...\n   *\n   * // or\n   * ...\n   * customBorders: [\n   *   {row: 2, col: 2, left: {width: 2, color: 'red'},\n   *     right: {width: 1, color: 'green'}, top: '', bottom: ''}\n   * ],\n   * ...\n   * ```\n   */\n  customBorders: false,\n\n  /**\n   * Minimum number of rows. At least that number of rows will be created during initialization.\n   *\n   * @type {Number}\n   * @default 0\n   */\n  minRows: 0,\n\n  /**\n   * Minimum number of columns. At least that number of columns will be created during initialization.\n   *\n   * @type {Number}\n   * @default 0\n   */\n  minCols: 0,\n\n  /**\n   * Maximum number of rows. If set to a value lower than the initial row count, the data will be trimmed to the provided value as the number of rows.\n   *\n   * @type {Number}\n   * @default Infinity\n   */\n  maxRows: Infinity,\n\n  /**\n   * Maximum number of cols. If set to a value lower than the initial col count, the data will be trimmed to the provided value as the number of cols.\n   *\n   * @type {Number}\n   * @default Infinity\n   */\n  maxCols: Infinity,\n\n  /**\n   * When set to 1 (or more), Handsontable will add a new row at the end of grid if there are no more empty rows.\n   * (unless the number of rows exceeds the one set in the `maxRows` property)\n   *\n   * @type {Number}\n   * @default 0\n   */\n  minSpareRows: 0,\n\n  /**\n   * When set to 1 (or more), Handsontable will add a new column at the end of grid if there are no more empty columns.\n   * (unless the number of rows exceeds the one set in the `maxCols` property)\n   *\n   * @type {Number}\n   * @default 0\n   */\n  minSpareCols: 0,\n\n  /**\n   * If set to `false`, there won't be an option to insert new rows in the Context Menu.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  allowInsertRow: true,\n\n  /**\n   * If set to `false`, there won't be an option to insert new columns in the Context Menu.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  allowInsertColumn: true,\n\n  /**\n   * If set to `false`, there won't be an option to remove rows in the Context Menu.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  allowRemoveRow: true,\n\n  /**\n   * If set to `false`, there won't be an option to remove columns in the Context Menu.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  allowRemoveColumn: true,\n\n  /**\n   * @description\n   * Defines how the table selection reacts. The selection support three different behaviors defined as:\n   *  * `'single'` Only a single cell can be selected.\n   *  * `'range'` Multiple cells within a single range can be selected.\n   *  * `'multiple'` Multiple ranges of cells can be selected.\n   *\n   * To see how to interact with selection by getting selected data or change styles of the selected cells go to\n   * [https://docs.handsontable.com/demo-selecting-ranges.html](https://docs.handsontable.com/demo-selecting-ranges.html).\n   *\n   * @since 0.36.0\n   * @type {String}\n   * @default 'multiple'\n   */\n  selectionMode: 'multiple',\n\n  /**\n   * Enables the fill handle (drag-down and copy-down) functionality, which shows a small rectangle in bottom\n   * right corner of the selected area, that let's you expand values to the adjacent cells.\n   *\n   * Possible values: `true` (to enable in all directions), `'vertical'` or `'horizontal'` (to enable in one direction),\n   * `false` (to disable completely). Setting to `true` enables the fillHandle plugin.\n   *\n   * Since 0.23.0 you can pass object to plugin which allows you to add more options for this functionality. If `autoInsertRow`\n   * option is `true`, fill-handler will create new rows till it reaches the last row. It is enabled by default.\n   *\n   * @example\n   * ```js\n   * ...\n   * fillHandle: true // enable plugin in all directions and with autoInsertRow as true\n   * ...\n   * // or\n   * ...\n   * fillHandle: 'vertical' // enable plugin in vertical direction and with autoInsertRow as true\n   * ...\n   * // or\n   * ...\n   * fillHandle: { // enable plugin in both directions and with autoInsertRow as false\n   *   autoInsertRow: false,\n   * }\n   * // or\n   * ...\n   * fillHandle: { // enable plugin in vertical direction and with autoInsertRow as false\n   *   autoInsertRow: false,\n   *   direction: 'vertical' // 'vertical' or 'horizontal'\n   * }\n   * ```\n   *\n   * @type {Boolean|String|Object}\n   * @default true\n   */\n  fillHandle: true,\n\n  /**\n   * Allows to specify the number of fixed (or *frozen*) rows at the top of the table.\n   *\n   * @type {Number}\n   * @default 0\n   * @example\n   * ```js\n   * fixedRowsTop: 3 // This would freeze the top 3 rows of the table.\n   * ```\n   */\n  fixedRowsTop: 0,\n\n  /**\n   * Allows to specify the number of fixed (or *frozen*) rows at the bottom of the table.\n   *\n   * @pro\n   * @type {Number}\n   * @default 0\n   * @example\n   * ```js\n   * fixedRowsBottom: 3 // This would freeze the top 3 rows of the table.\n   * ```\n   */\n  fixedRowsBottom: 0,\n\n  /**\n   * Allows to specify the number of fixed (or *frozen*) columns on the left of the table.\n   *\n   * @type {Number}\n   * @default 0\n   * @example\n   * ```js\n   * fixedColumnsLeft: 3 // This would freeze the top 3 rows of the table.\n   * ```\n   */\n  fixedColumnsLeft: 0,\n\n  /**\n   * If `true`, mouse click outside the grid will deselect the current selection.\n   * Can be a function that takes the click event target and returns a boolean.\n   *\n   * @type {Boolean|Function}\n   * @default true\n   */\n  outsideClickDeselects: true,\n\n  /**\n   * If `true`, <kbd>ENTER</kbd> begins editing mode (like in Google Docs). If `false`, <kbd>ENTER</kbd> moves to next\n   * row (like Excel) and adds a new row if necessary. <kbd>TAB</kbd> adds new column if necessary.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  enterBeginsEditing: true,\n\n  /**\n   * Defines the cursor movement after <kbd>ENTER</kbd> was pressed (<kbd>SHIFT</kbd> + <kbd>ENTER</kbd> uses a negative vector).\n   * Can be an object or a function that returns an object. The event argument passed to the function\n   * is a DOM Event object received after the <kbd>ENTER</kbd> key has been pressed. This event object can be used to check\n   * whether user pressed <kbd>ENTER</kbd> or <kbd>SHIFT</kbd> + <kbd>ENTER</kbd>.\n   *\n   * @type {Object|Function}\n   * @default {row: 1, col: 0}\n   */\n  enterMoves: { row: 1, col: 0 },\n\n  /**\n   * Defines the cursor movement after <kbd>TAB</kbd> is pressed (<kbd>SHIFT</kbd> + <kbd>TAB</kbd> uses a negative vector).\n   * Can be an object or a function that returns an object. The event argument passed to the function\n   * is a DOM Event object received after the <kbd>TAB</kbd> key has been pressed. This event object can be used to check\n   * whether user pressed <kbd>TAB</kbd> or <kbd>SHIFT</kbd> + <kbd>TAB</kbd>.\n   *\n   * @type {Object}\n   * @default {row: 0, col: 1}\n   */\n  tabMoves: { row: 0, col: 1 },\n\n  /**\n   * If `true`, pressing <kbd>TAB</kbd> or right arrow in the last column will move to first column in next row.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  autoWrapRow: false,\n\n  /**\n   * If `true`, pressing <kbd>ENTER</kbd> or down arrow in the last row will move to the first row in the next column.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  autoWrapCol: false,\n\n  /**\n   * @description\n   * Turns on saving the state of column sorting, column positions and column sizes in local storage.\n   *\n   * You can save any sort of data in local storage to preserve table state between page reloads.\n   * In order to enable data storage mechanism, `persistentState` option must be set to `true` (you can set it\n   * either during Handsontable initialization or using the `updateSettings` method). When `persistentState` is enabled it exposes 3 hooks:\n   *\n   * __persistentStateSave__ (key: String, value: Mixed)\n   *\n   *   * Saves value under given key in browser local storage.\n   *\n   * __persistentStateLoad__ (key: String, valuePlaceholder: Object)\n   *\n   *   * Loads `value`, saved under given key, form browser local storage. The loaded `value` will be saved in `valuePlaceholder.value`\n   *     (this is due to specific behaviour of `Hooks.run()` method). If no value have been saved under key `valuePlaceholder.value`\n   *     will be `undefined`.\n   *\n   * __persistentStateReset__ (key: String)\n   *\n   *   * Clears the value saved under `key`. If no `key` is given, all values associated with table will be cleared.\n   *\n   * __Note:__ The main reason behind using `persistentState` hooks rather than regular LocalStorage API is that it\n   * ensures separation of data stored by multiple Handsontable instances. In other words, if you have two (or more)\n   * instances of Handsontable on one page, data saved by one instance won't be accessible by the second instance.\n   * Those two instances can store data under the same key and no data would be overwritten.\n   *\n   * __Important:__ In order for the data separation to work properly, make sure that each instance of Handsontable has a unique `id`.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  persistentState: void 0,\n\n  /**\n   * Class name for all visible rows in the current selection.\n   *\n   * @type {String}\n   * @default undefined\n   * @example\n   * ```js\n   * currentRowClassName: 'currentRow' // This will add a 'currentRow' class name to appropriate table cells.\n   * ```\n   */\n  currentRowClassName: void 0,\n\n  /**\n   * Class name for all visible columns in the current selection.\n   *\n   * @type {String}\n   * @default undefined\n   * @example\n   * ```js\n   * currentColClassName: 'currentColumn' // This will add a 'currentColumn' class name to appropriate table cells.\n   * ```\n   */\n  currentColClassName: void 0,\n\n  /**\n   * Class name for all visible headers in current selection.\n   *\n   * @type {String}\n   * @since 0.27.0\n   * @default 'ht__highlight'\n   * @example\n   * ```js\n   * currentHeaderClassName: 'ht__highlight' // This will add a 'ht__highlight' class name to appropriate table headers.\n   * ```\n   */\n  currentHeaderClassName: 'ht__highlight',\n\n  /**\n   * Class name for all active headers in selections. The header will be marked with this class name\n   * only when a whole column or row will be selected.\n   *\n   * @type {String}\n   * @since 0.38.2\n   * @default 'ht__active_highlight'\n   * @example\n   * ```js\n   * activeHeaderClassName: 'ht__active_highlight' // This will add a 'ht__active_highlight' class name to appropriate table headers.\n   * ```\n   */\n  activeHeaderClassName: 'ht__active_highlight',\n\n  /**\n   * Class name for the Handsontable container element.\n   *\n   * @type {String|Array}\n   * @default undefined\n   */\n  className: void 0,\n\n  /**\n   * Class name for all tables inside container element.\n   *\n   * @since 0.17.0\n   * @type {String|Array}\n   * @default undefined\n   */\n  tableClassName: void 0,\n\n  /**\n   * @description\n   * Defines how the columns react, when the declared table width is different than the calculated sum of all column widths.\n   * [See more](http://docs.handsontable.com/demo-stretching.html) mode. Possible values:\n   *  * `'none'` Disable stretching\n   *  * `'last'` Stretch only the last column\n   *  * `'all'` Stretch all the columns evenly\n   *\n   * @type {String}\n   * @default 'none'\n   */\n  stretchH: 'none',\n\n  /**\n   * Lets you overwrite the default `isEmptyRow` method, which checks if row at the provided index is empty.\n   *\n   * @type {Function}\n   * @param {Number} row Visual row index.\n   * @returns {Boolean}\n   */\n  isEmptyRow: function isEmptyRow(row) {\n    var col, colLen, value, meta;\n\n    for (col = 0, colLen = this.countCols(); col < colLen; col++) {\n      value = this.getDataAtCell(row, col);\n\n      if (value !== '' && value !== null && (0, _mixed.isDefined)(value)) {\n        if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') {\n          meta = this.getCellMeta(row, col);\n\n          return (0, _object.isObjectEqual)(this.getSchema()[meta.prop], value);\n        }\n        return false;\n      }\n    }\n\n    return true;\n  },\n\n\n  /**\n   * Lets you overwrite the default `isEmptyCol` method, which checks if column at the provided index is empty.\n   *\n   * @type {Function}\n   * @param {Number} col Visual column index\n   * @returns {Boolean}\n   */\n  isEmptyCol: function isEmptyCol(col) {\n    var row, rowLen, value;\n\n    for (row = 0, rowLen = this.countRows(); row < rowLen; row++) {\n      value = this.getDataAtCell(row, col);\n\n      if (value !== '' && value !== null && (0, _mixed.isDefined)(value)) {\n        return false;\n      }\n    }\n\n    return true;\n  },\n\n\n  /**\n   * When set to `true`, the table is re-rendered when it is detected that it was made visible in DOM.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  observeDOMVisibility: true,\n\n  /**\n   * If set to `true`, Handsontable will accept values that were marked as invalid by the cell `validator`.\n   * It will result with *invalid* cells being treated as *valid* (will save the *invalid* value into the Handsontable data source).\n   * If set to `false`, Handsontable will *not* accept the invalid values and won't allow the user to close the editor.\n   * This option will be particularly useful when used with the Autocomplete's `strict` mode.\n   *\n   * @type {Boolean}\n   * @default true\n   * @since 0.9.5\n   */\n  allowInvalid: true,\n\n  /**\n   * If set to `true`, Handsontable will accept values that are empty (`null`, `undefined` or `''`).\n   * If set to `false`, Handsontable will *not* accept the empty values and mark cell as invalid.\n   *\n   * @example\n   * ```js\n   * ...\n   * allowEmpty: true // allow empty values for all cells (whole table)\n   * ...\n   * // or\n   * ...\n   * columns: [\n   *   // allow empty values only for 'date' column\n   *   {data: 'date', dateFormat: 'DD/MM/YYYY', allowEmpty: true}\n   * ]\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   * @default true\n   * @since 0.23.0\n   */\n  allowEmpty: true,\n\n  /**\n   * CSS class name for cells that did not pass validation.\n   *\n   * @type {String}\n   * @default 'htInvalid'\n   */\n  invalidCellClassName: 'htInvalid',\n\n  /**\n   * When set to an non-empty string, displayed as the cell content for empty cells. If a value of a different type is provided,\n   * it will be stringified and applied as a string.\n   *\n   * @type {Mixed}\n   * @default false\n   */\n  placeholder: false,\n\n  /**\n   * CSS class name for cells that have a placeholder in use.\n   *\n   * @type {String}\n   * @default 'htPlaceholder'\n   */\n  placeholderCellClassName: 'htPlaceholder',\n\n  /**\n   * CSS class name for read-only cells.\n   *\n   * @type {String}\n   * @default 'htDimmed'\n   */\n  readOnlyCellClassName: 'htDimmed',\n\n  /**\n   * @description\n   * If a string is provided, it may be one of the following predefined values:\n   * * `autocomplete`,\n   * * `checkbox`,\n   * * `html`,\n   * * `numeric`,\n   * * `password`.\n   * * `text`.\n   *\n   * Or you can [register](http://docs.handsontable.com/demo-custom-renderers.html) the custom renderer under specified name and use\n   * its name as an alias in your configuration.\n   *\n   * If a function is provided, it will receive the following arguments:\n   * ```js\n   * function(instance, TD, row, col, prop, value, cellProperties) {}\n   * ```\n   *\n   * You can read more about custom renderes [in the documentation](http://docs.handsontable.com/demo-custom-renderers.html).\n   *\n   * @example\n   * ```js\n   * ...\n   * Handsontable.renderers.registerRenderer('my.renderer', function(instance, TD, row, col, prop, value, cellProperties) {\n   *   TD.innerHTML = value;\n   * });\n   * ...\n   * columns: [\n   *   {\n   *     editor: 'select',\n   *     renderer: 'autocomplete' // as string\n   *   },\n   *   {\n   *     renderer: 'my.renderer' // custom renderer as an alias\n   *   },\n   *   {\n   *     // renderer as custom function\n   *     renderer: function(hotInstance, TD, row, col, prop, value, cellProperties) {\n   *       TD.style.color = 'blue';\n   *       TD.innerHTML = value;\n   *     }\n   *   }\n   * ]\n   * ...\n   * ```\n   *\n   * @type {String|Function}\n   * @default undefined\n   */\n  renderer: void 0,\n\n  /**\n   * CSS class name added to the commented cells.\n   *\n   * @type {String}\n   * @default 'htCommentCell'\n   */\n  commentedCellClassName: 'htCommentCell',\n\n  /**\n   * If set to `true`, it enables the browser's native selection of a fragment of the text within a single cell, between adjacent cells or in a whole table.\n   * If set to `'cell'`, it enables the possibility of selecting a fragment of the text within a single cell's body.\n   *\n   * @type {Boolean|String}\n   * @default false\n   */\n  fragmentSelection: false,\n\n  /**\n   * @description\n   * Make cell [read only](http://docs.handsontable.com/demo-read-only.html).\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  readOnly: false,\n\n  /**\n   * @description\n   * When added to a `column` property, it skips the column on paste and pastes the data on the next column to the right.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  skipColumnOnPaste: false,\n\n  /**\n   * @description\n   * Setting to true enables the search plugin (see [demo](http://docs.handsontable.com/demo-search-for-values.html)).\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  search: false,\n\n  /**\n   * @description\n   * Shortcut to define the combination of the cell renderer, editor and validator for the column, cell or whole table.\n   *\n   * Possible values:\n   *  * [autocomplete](http://docs.handsontable.com/demo-autocomplete.html)\n   *  * [checkbox](http://docs.handsontable.com/demo-checkbox.html)\n   *  * [date](http://docs.handsontable.com/demo-date.html)\n   *  * [dropdown](http://docs.handsontable.com/demo-dropdown.html)\n   *  * [handsontable](http://docs.handsontable.com/demo-handsontable.html)\n   *  * [numeric](http://docs.handsontable.com/demo-numeric.html)\n   *  * [password](http://docs.handsontable.com/demo-password.html)\n   *  * text\n   *  * [time](http://docs.handsontable.com/demo-time.html)\n   *\n   * Or you can register the custom cell type under specified name and use\n   * its name as an alias in your configuration.\n   *\n   * @example\n   * ```js\n   * ...\n   * Handsontable.cellTypes.registerCellType('my.type', {\n   *   editor: MyEditorClass,\n   *   renderer: function(hot, td, row, col, prop, value, cellProperties) {\n   *     td.innerHTML = value;\n   *   },\n   *   validator: function(value, callback) {\n   *     callback(value === 'foo' ? true : false);\n   *   }\n   * });\n   * ...\n   * columns: [\n   *   {\n   *     type: 'text'\n   *   },\n   *   {\n   *     type: 'my.type' // an alias to custom type\n   *   },\n   *   {\n   *     type: 'checkbox'\n   *   }\n   * ]\n   * ...\n   * ```\n   *\n   * @type {String}\n   * @default 'text'\n   */\n  type: 'text',\n\n  /**\n   * @description\n   * Make cell copyable (pressing <kbd>CTRL</kbd> + <kbd>C</kbd> on your keyboard moves its value to system clipboard).\n   *\n   * __Note:__ this setting is `false` by default for cells with type `password`.\n   *\n   * @type {Boolean}\n   * @default true\n   * @since 0.10.2\n   */\n  copyable: true,\n\n  /**\n   * Defines the editor for the table/column/cell.\n   *\n   * If a string is provided, it may be one of the following predefined values:\n   *  * [autocomplete](http://docs.handsontable.com/demo-autocomplete.html)\n   *  * [checkbox](http://docs.handsontable.com/demo-checkbox.html)\n   *  * [date](http://docs.handsontable.com/demo-date.html)\n   *  * [dropdown](http://docs.handsontable.com/demo-dropdown.html)\n   *  * [handsontable](http://docs.handsontable.com/demo-handsontable.html)\n   *  * [mobile](http://docs.handsontable.com/demo-mobiles-and-tablets.html)\n   *  * [password](http://docs.handsontable.com/demo-password.html)\n   *  * [select](http://docs.handsontable.com/demo-select.html)\n   *  * text\n   *\n   * Or you can [register](http://docs.handsontable.com/tutorial-cell-editor.html#registering-an-editor) the custom editor under specified name and use\n   * its name as an alias in your configuration.\n   *\n   * To disable cell editing completely set `editor` property to `false`.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [\n   *   {\n   *     editor: 'select'\n   *   },\n   *   {\n   *     editor: false\n   *   }\n   * ]\n   * ...\n   * ```\n   *\n   * @type {String|Function|Boolean}\n   * @default 'text'\n   */\n  editor: void 0,\n\n  /**\n   * @description\n   * Autocomplete definitions. See [autocomplete demo](http://docs.handsontable.com/demo-autocomplete.html) for examples and definitions.\n   *\n   * @type {Array}\n   * @default undefined\n   */\n  autoComplete: void 0,\n\n  /**\n   * Control number of choices for the autocomplete (or dropdown) typed cells. After exceeding it, a scrollbar for the dropdown list of choices will appear.\n   *\n   * @since 0.18.0\n   * @type {Number}\n   * @default 10\n   */\n  visibleRows: 10,\n\n  /**\n   * Makes autocomplete or dropdown width the same as the edited cell width. If `false` then editor will be scaled\n   * according to its content.\n   *\n   * @since 0.17.0\n   * @type {Boolean}\n   * @default true\n   */\n  trimDropdown: true,\n\n  /**\n   * Setting to true enables the debug mode, currently used to test the correctness of the row and column\n   * header fixed positioning on a layer above the master table.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  debug: false,\n\n  /**\n   * When set to `true`, the text of the cell content is wrapped if it does not fit in the fixed column width.\n   *\n   * @type {Boolean}\n   * @default true\n   * @since 0.11.0\n   */\n  wordWrap: true,\n\n  /**\n   * CSS class name added to cells with cell meta `wordWrap: false`.\n   *\n   * @type {String}\n   * @default 'htNoWrap'\n   * @since 0.11.0\n   */\n  noWordWrapClassName: 'htNoWrap',\n\n  /**\n   * @description\n   * Defines if the right-click context menu should be enabled. Context menu allows to create new row or\n   * column at any place in the grid among [other features](http://docs.handsontable.com/demo-context-menu.html).\n   * Possible values:\n   * * `true` (to enable default options),\n   * * `false` (to disable completely)\n   * * an array of [predefined options](https://docs.handsontable.com/demo-context-menu.html#page-specific),\n   * * an object [with defined structure](http://docs.handsontable.com/demo-context-menu.html#page-custom)\n   *\n   * See [the context menu demo](http://docs.handsontable.com/demo-context-menu.html) for examples.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as a boolean\n   * contextMenu: true\n   * ...\n   * // as an array\n   * contextMenu: ['row_above', 'row_below', '--------', 'undo', 'redo']\n   * ...\n   * ```\n   * ...\n   * // as an object (`name` attribute is required in the custom keys)\n   * contextMenu: {\n   *   items: {\n   *     \"option1\": {\n   *       name: \"option1\"\n   *     },\n   *     \"option2\": {\n   *       name: \"option2\",\n   *       submenu: {\n   *         items: [\n   *           {\n   *             key: \"option2:suboption1\",\n   *             name: \"option2:suboption1\",\n   *             callback: function(key, options) {\n   *               ...\n   *             }\n   *           },\n   *           ...\n   *         ]\n   *       }\n   *     }\n   *   }\n   * }\n   * ...\n   * ```\n   * @type {Boolean|Array|Object}\n   * @default undefined\n   */\n  contextMenu: void 0,\n\n  /**\n   * @description\n   * Disable or enable the copy/paste functionality.\n   *\n   * @example\n   * ```js\n   * ...\n   * copyPaste: false,\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  copyPaste: true,\n\n  /**\n   * If `true`, undo/redo functionality is enabled.\n   *\n   * @type {Boolean}\n   * @default undefined\n   */\n  undo: void 0,\n\n  /**\n   * @description\n   * Turns on [Column sorting](http://docs.handsontable.com/demo-sorting-data.html).\n   * Can be either a boolean (true/false) or an object with a declared sorting options. See the below example:\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * columnSorting: true\n   * ...\n   * // as a object with initial order (sort ascending column at index 2)\n   * columnSorting: {\n   *   column: 2,\n   *   sortOrder: true, // true = ascending, false = descending, undefined = original order\n   *   sortEmptyCells: true // true = the table sorts empty cells, false = the table moves all empty cells to the end of the table\n   * }\n   * ...\n   * ```\n   *\n   * @type {Boolean|Object}\n   * @default undefined\n   */\n  columnSorting: void 0,\n\n  /**\n   * @description\n   * Turns on [Manual column move](http://docs.handsontable.com/demo-moving-rows-and-columns.html), if set to a boolean or define initial\n   * column order, if set to an array of column indexes.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * manualColumnMove: true\n   * ...\n   * // as a array with initial order (move column index at 0 to 1 and move column index at 1 to 4)\n   * manualColumnMove: [1, 4]\n   * ...\n   * ```\n   *\n   * @type {Boolean|Array}\n   * @default undefined\n   */\n  manualColumnMove: void 0,\n\n  /**\n   * @description\n   * Turns on [Manual column resize](http://docs.handsontable.com/demo-resizing.html), if set to a boolean or define initial\n   * column resized widths, if set to an array of numbers.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * manualColumnResize: true\n   * ...\n   * // as a array with initial widths (column at 0 index has 40px and column at 1 index has 50px)\n   * manualColumnResize: [40, 50]\n   * ...\n   * ```\n   *\n   * @type {Boolean|Array}\n   * @default undefined\n   */\n  manualColumnResize: void 0,\n\n  /**\n   * @description\n   * Turns on [Manual row move](http://docs.handsontable.com/demo-moving-rows-and-columns.html), if set to a boolean or define initial\n   * row order, if set to an array of row indexes.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * manualRowMove: true\n   * ...\n   * // as a array with initial order (move row index at 0 to 1 and move row index at 1 to 4)\n   * manualRowMove: [1, 4]\n   * ...\n   * ```\n   *\n   * @type {Boolean|Array}\n   * @default undefined\n   * @since 0.11.0\n   */\n  manualRowMove: void 0,\n\n  /**\n   * @description\n   * Turns on [Manual row resize](http://docs.handsontable.com/demo-resizing.html), if set to a boolean or define initial\n   * row resized heights, if set to an array of numbers.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * manualRowResize: true\n   * ...\n   * // as a array with initial heights (row at 0 index has 40px and row at 1 index has 50px)\n   * manualRowResize: [40, 50]\n   * ...\n   * ```\n   *\n   * @type {Boolean|Array}\n   * @default undefined\n   * @since 0.11.0\n   */\n  manualRowResize: void 0,\n\n  /**\n   * @description\n   * If set to `true`, it enables a possibility to merge cells. If set to an array of objects, it merges the cells provided in the objects (see the example below).\n   * [More information on the demo page.](http://docs.handsontable.com/demo-merge-cells.html)\n   *\n   * @example\n   * ```js\n   * // enables the mergeCells plugin:\n   * margeCells: true\n   * ...\n   * // declares a list of merged sections:\n   * mergeCells: [\n   *   {row: 1, col: 1, rowspan: 3, colspan: 3}, // rowspan and colspan properties declare the width and height of a merged section in cells\n   *   {row: 3, col: 4, rowspan: 2, colspan: 2},\n   *   {row: 5, col: 6, rowspan: 3, colspan: 3}\n   * ]\n   * ```\n   * @type {Boolean|Array}\n   * @default false\n   */\n  mergeCells: false,\n\n  /**\n   * Number of rows to be rendered outside of the visible part of the table.\n   * By default, it's set to `'auto'`, which makes Handsontable to attempt to calculate the best offset performance-wise.\n   *\n   * You may test out different values to find the best one that works for your specific implementation.\n   *\n   * @type {Number|String}\n   * @default 'auto'\n   */\n  viewportRowRenderingOffset: 'auto',\n\n  /**\n   * Number of columns to be rendered outside of the visible part of the table.\n   * By default, it's set to `'auto'`, which makes Handsontable try calculating the best offset performance-wise.\n   *\n   * You may experiment with the value to find the one that works best for your specific implementation.\n   *\n   * @type {Number|String}\n   * @default 'auto'\n   */\n  viewportColumnRenderingOffset: 'auto',\n\n  /**\n   * A function, regular expression or a string, which will be used in the process of cell validation.\n   * If a function is used, be sure to execute the callback argument with either `true` (`callback(true)`) if the validation passed\n   * or with `false` (`callback(false)`), if the validation failed.\n   * Note, that `this` in the function points to the `cellProperties` object.\n   *\n   * If a string is provided, it may be one of the following predefined values:\n   * * `autocomplete`,\n   * * `date`,\n   * * `numeric`,\n   * * `time`.\n   *\n   * Or you can [register](http://docs.handsontable.com/demo-data-validation.html) the validator function under specified name and use\n   * its name as an alias in your configuration.\n   *\n   * See more [in the demo](http://docs.handsontable.com/demo-data-validation.html).\n   *\n   * @example\n   * ```js\n   * // as a function\n   * columns: [\n   *    {\n   *      validator: function(value, callback) { // validation rules }\n   *    }\n   * ]\n   * ...\n   * // as a regexp\n   * columns: [\n   *    {\n   *      validator: /^[0-9]$/ // regular expression\n   *    }\n   * ]\n   * // as a string\n   * columns: [\n   *    {\n   *      validator: 'numeric'\n   *    }\n   * ]\n   * ```\n   * @type {Function|RegExp|String}\n   * @default undefined\n   * @since 0.9.5\n   */\n  validator: void 0,\n\n  /**\n   * @description\n   * Disable visual cells selection.\n   *\n   * Possible values:\n   *  * `true` - Disables any type of visual selection (current and area selection),\n   *  * `false` - Enables any type of visual selection. This is default value.\n   *  * `'current'` - Disables the selection of a currently selected cell, the area selection is still present.\n   *  * `'area'` - Disables the area selection, the currently selected cell selection is still present.\n   *  * `'header'` - Disables the headers selection, the currently selected cell selection is still present (available since 0.36.0).\n   *\n   * @type {Boolean|String|Array}\n   * @default false\n   * @since 0.13.2\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * disableVisualSelection: true,\n   * ...\n   *\n   * ...\n   * // as string ('current', 'area' or 'header')\n   * disableVisualSelection: 'current',\n   * ...\n   *\n   * ...\n   * // as array\n   * disableVisualSelection: ['current', 'area'],\n   * ...\n   * ```\n   */\n  disableVisualSelection: false,\n\n  /**\n   * @description\n   * Set whether to display the current sorting order indicator (a triangle icon in the column header, specifying the sorting order).\n   *\n   * @type {Boolean}\n   * @default false\n   * @since 0.15.0-beta3\n   */\n  sortIndicator: void 0,\n\n  /**\n   * Disable or enable ManualColumnFreeze plugin.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  manualColumnFreeze: void 0,\n\n  /**\n   * @description\n   * Defines whether Handsontable should trim the whitespace at the beginning and the end of the cell contents.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  trimWhitespace: true,\n\n  settings: void 0,\n\n  /**\n   * @description\n   * Defines data source for Autocomplete or Dropdown cell types.\n   *\n   * @example\n   * ```js\n   * ...\n   * // source as a array\n   * columns: [{\n   *   type: 'autocomplete',\n   *   source: ['A', 'B', 'C', 'D']\n   * }]\n   * ...\n   * // source as a function\n   * columns: [{\n   *   type: 'autocomplete',\n   *   source: function(query, callback) {\n   *     fetch('http://example.com/query?q=' + query, function(response) {\n   *       callback(response.items);\n   *     })\n   *   }\n   * }]\n   * ...\n   * ```\n   *\n   * @type {Array|Function}\n   * @default undefined\n   */\n  source: void 0,\n\n  /**\n   * @description\n   * Defines the column header name.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *     title: 'First name',\n   *     type: 'text',\n   *   },\n   *   {\n   *     title: 'Last name',\n   *     type: 'text',\n   *   }]\n   * ...\n   * ```\n   *\n   * @type {String}\n   * @default undefined\n   */\n  title: void 0,\n\n  /**\n   * Data template for `'checkbox'` type when checkbox is checked.\n   *\n   * @example\n   * ```js\n   * checkedTemplate: 'good'\n   *\n   * // if a checkbox-typed cell is checked, then getDataAtCell(x,y), where x and y are the coordinates of the cell\n   * // will return 'good'.\n   * ```\n   * @type {Boolean|String}\n   * @default true\n   */\n  checkedTemplate: void 0,\n\n  /**\n   * Data template for `'checkbox'` type when checkbox is unchecked.\n   *\n   * @example\n   * ```js\n   * uncheckedTemplate: 'bad'\n   *\n   * // if a checkbox-typed cell is not checked, then getDataAtCell(x,y), where x and y are the coordinates of the cell\n   * // will return 'bad'.\n   * ```\n   * @type {Boolean|String}\n   * @default false\n   */\n  uncheckedTemplate: void 0,\n\n  /**\n   * @description\n   * Object which describes if renderer should create checkbox element with label element as a parent. Option desired for\n   * [checkbox](http://docs.handsontable.com/demo-checkbox.html)-typed cells.\n   *\n   * By default the [checkbox](http://docs.handsontable.com/demo-checkbox.html) renderer renders the checkbox without a label.\n   *\n   * Possible object properties:\n   *  * `property` - Defines the property name of the data object, which will to be used as a label.\n   *  (eg. `label: {property: 'name.last'}`). This option works only if data was passed as an array of objects.\n   *  * `position` - String which describes where to place the label text (before or after checkbox element).\n   * Valid values are `'before'` and '`after`' (defaults to `'after'`).\n   *  * `value` - String or a Function which will be used as label text.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'checkbox',\n   *   label: {position: 'after', value: 'My label: '}\n   * }]\n   * ...\n   * ```\n   *\n   * @since 0.19.0\n   * @type {Object}\n   * @default undefined\n   */\n  label: void 0,\n\n  /**\n   * Display format. This option is desired for [numeric-typed](http://docs.handsontable.com/demo-numeric.html) cells. Format is described by two properties:\n   *\n   * - pattern, which is handled by `numbro` for purpose of formatting numbers to desired pattern. List of supported patterns can be found [here](http://numbrojs.com/format.html#numbers).\n   * - culture, which is handled by `numbro` for purpose of formatting currencies. Examples showing how it works can be found [here](http://numbrojs.com/format.html#currency). List of supported cultures can be found [here](http://numbrojs.com/languages.html#supported-languages).\n   *\n   * __Note:__ Please keep in mind that this option is used only to format the displayed output! It has no effect on the input data provided for the cell. The numeric data can be entered to the table only as floats (separated by a dot or a comma) or integers, and are stored in the source dataset as JavaScript numbers.\n   *\n   * Since 0.26.0 Handsontable uses [numbro](http://numbrojs.com/) as a main library for numbers formatting.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'numeric',\n   *   numericFormat: {\n   *     pattern: '0,00',\n   *     culture: 'en-US'\n   *   }\n   * }]\n   * ...\n   * ```\n   *\n   * @since 0.35.0\n   * @type {Object}\n   */\n  numericFormat: void 0,\n\n  /**\n   * Language for Handsontable translation. Possible language codes are: `en-US`, `pl-PL`.\n   *\n   * @type {String}\n   * @default 'en-US'\n   */\n  language: void 0,\n\n  /**\n   * @description\n   * Data source for [select](http://docs.handsontable.com/demo-select.html)-typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   editor: 'select',\n   *   selectOptions: ['A', 'B', 'C'],\n   * }]\n   * ...\n   * ```\n   *\n   * @type {Array}\n   */\n  selectOptions: void 0,\n\n  /**\n   * Enables or disables the autoColumnSize plugin. Default value is `undefined`, which has the same effect as `true`.\n   * Disabling this plugin can increase performance, as no size-related calculations would be done.\n   *\n   * Column width calculations are divided into sync and async part. Each of this parts has their own advantages and\n   * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous operations don't\n   * block the browser UI.\n   *\n   * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value.\n   * `syncLimit` option is available since 0.16.0.\n   *\n   * You can also use the `useHeaders` option to take the column headers with into calculation.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as a number (300 columns in sync, rest async)\n   * autoColumnSize: {syncLimit: 300},\n   * ...\n   *\n   * ...\n   * // as a string (percent)\n   * autoColumnSize: {syncLimit: '40%'},\n   * ...\n   *\n   * ...\n   * // use headers width while calculation the column width\n   * autoColumnSize: {useHeaders: true},\n   * ...\n   *\n   * ```\n   *\n   * @type {Object|Boolean}\n   * @default {syncLimit: 50}\n   */\n  autoColumnSize: void 0,\n\n  /**\n   * Enables or disables autoRowSize plugin. Default value is `undefined`, which has the same effect as `false` (disabled).\n   * Enabling this plugin can decrease performance, as size-related calculations would be performed.\n   *\n   * Row height calculations are divided into sync and async stages. Each of these stages has their own advantages and\n   * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous operations don't\n   * block the browser UI.\n   *\n   * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value.\n   * `syncLimit` options is available since 0.16.0.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as number (300 columns in sync, rest async)\n   * autoRowSize: {syncLimit: 300},\n   * ...\n   *\n   * ...\n   * // as string (percent)\n   * autoRowSize: {syncLimit: '40%'},\n   * ...\n   * ```\n   * @type {Object|Boolean}\n   * @default {syncLimit: 1000}\n   */\n  autoRowSize: void 0,\n\n  /**\n   * Date validation format.\n   *\n   * Option desired for `'date'` - typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'date',\n   *   dateFormat: 'MM/DD/YYYY'\n   * }]\n   * ...\n   * ```\n   *\n   * @type {String}\n   * @default 'DD/MM/YYYY'\n   */\n  dateFormat: void 0,\n\n  /**\n   * If `true` then dates will be automatically formatted to match the desired format.\n   *\n   * Option desired for `'date'`-typed typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'date',\n   *   dateFormat: 'YYYY-MM-DD',\n   *   correctFormat: true\n   * }]\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  correctFormat: false,\n\n  /**\n   * Definition of default value which will fill the empty cells.\n   *\n   * Option desired for `'date'`-typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'date',\n   *   defaultData: '2015-02-02'\n   * }]\n   * ...\n   * ```\n   *\n   * @type {String}\n   */\n  defaultDate: void 0,\n\n  /**\n   * If set to `true`, the value entered into the cell must match (case-sensitive) the autocomplete source. Otherwise, cell won't pass the validation.\n   * When filtering the autocomplete source list, the editor will be working in case-insensitive mode.\n   *\n   * Option desired for `autocomplete`-typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'autocomplete',\n   *   source: ['A', 'B', 'C'],\n   *   strict: true\n   * }]\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   */\n  strict: void 0,\n\n  /**\n   * @description\n   * If typed `true`, data defined in `source` of the autocomplete or dropdown cell will be treated as HTML.\n   *\n   * __Warning:__ Enabling this option can cause serious XSS vulnerabilities.\n   *\n   * Option desired for `'autocomplete'`-typed cells.\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'autocomplete',\n   *   allowHtml: true,\n   *   source: ['<b>foo</b>', '<b>bar</b>']\n   * }]\n   * ...\n   * ```\n   * @type {Boolean}\n   * @default false\n   */\n  allowHtml: false,\n\n  /**\n   * If typed `true` then virtual rendering mechanism for handsontable will be disabled.\n   *\n   * @type {Boolean}\n   */\n  renderAllRows: void 0,\n\n  /**\n   * Prevents table to overlap outside the parent element. If `'horizontal'` option is chosen then table will appear horizontal\n   * scrollbar in case where parent's width is narrower then table's width.\n   *\n   * Possible values:\n   *  * `false` - Disables functionality (Default option).\n   *  * `horizontal` - Prevents horizontal overflow table.\n   *  * `vertical` - Prevents vertical overflow table (Not implemented yet).\n   *\n   * @since 0.20.3\n   * @example\n   * ```js\n   * ...\n   * preventOverflow: 'horizontal'\n   * ...\n   * ```\n   *\n   * @type {String|Boolean}\n   */\n  preventOverflow: false,\n\n  /**\n   * @description\n   * Plugin allowing binding the table rows with their headers.\n   * If the plugin is enabled, the table row headers will \"stick\" to the rows, when they are hidden/moved. Basically, if at the initialization\n   * row 0 has a header titled \"A\", it will have it no matter what you do with the table.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|String}\n   * @example\n   *\n   * ```js\n   * ...\n   * var hot = new Handsontable(document.getElementById('example'), {\n   *   date: getData(),\n   *   bindRowsWithHeaders: true\n   * });\n   * ...\n   * ```\n   *\n   */\n  bindRowsWithHeaders: void 0,\n\n  /**\n   * @description\n   * The CollapsibleColumns plugin allows collapsing of columns, covered by a header with the `colspan` property defined.\n   *\n   * Clicking the \"collapse/expand\" button collapses (or expands) all \"child\" headers except the first one.\n   *\n   * Setting the `collapsibleColumns` property to `true` will display a \"collapse/expand\" button in every header with a defined\n   * `colspan` property.\n   *\n   * To limit this functionality to a smaller group of headers, define the `collapsibleColumns` property as an array of objects, as in\n   * the example below.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Array}\n   * @example\n   * ```js\n   * ...\n   *  collapsibleColumns: [\n   *    {row: -4, col: 1, collapsible: true},\n   *    {row: -3, col: 5, collapsible: true}\n   *  ]\n   * ...\n   * // or\n   * ...\n   *  collapsibleColumns: true\n   * ...\n   * ```\n   */\n  collapsibleColumns: void 0,\n\n  /**\n   * @description\n   * Allows making pre-defined calculations on the cell values and display the results within Handsontable.\n   * See the demo for more information.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Object}\n   */\n  columnSummary: void 0,\n\n  /**\n   * This plugin allows adding a configurable dropdown menu to the table's column headers.\n   * The dropdown menu acts like the Context Menu, but is triggered by clicking the button in the header.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Object|Array}\n   */\n  dropdownMenu: void 0,\n\n  /**\n   * The filters plugin.\n   * It allows filtering the table data either by the built-in component or with the API.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean}\n   */\n  filters: void 0,\n\n  /**\n   * It allows Handsontable to process formula expressions defined in the provided data.\n   *\n   * @pro\n   * @since 1.7.0\n   * @type {Boolean}\n   */\n  formulas: void 0,\n\n  /**\n   * @description\n   * GanttChart plugin enables a possibility to create a Gantt chart using a Handsontable instance.\n   * In this case, the whole table becomes read-only.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Object}\n   */\n  ganttChart: void 0,\n\n  /**\n   * @description\n   * Allows adding a tooltip to the table headers.\n   *\n   * Available options:\n   * * the `rows` property defines if tooltips should be added to row headers,\n   * * the `columns` property defines if tooltips should be added to column headers,\n   * * the `onlyTrimmed` property defines if tooltips should be added only to headers, which content is trimmed by the header itself (the content being wider then the header).\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Object}\n   */\n  headerTooltips: void 0,\n\n  /**\n   * Plugin allowing hiding of certain columns.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Object}\n   */\n  hiddenColumns: void 0,\n\n  /**\n   * @description\n   * Plugin allowing hiding of certain rows.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Object}\n   */\n  hiddenRows: void 0,\n\n  /**\n   * @description\n   * Allows creating a nested header structure, using the HTML's colspan attribute.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Array}\n   */\n  nestedHeaders: void 0,\n\n  /**\n   * @description\n   * Plugin allowing hiding of certain rows.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Array}\n   */\n  trimRows: void 0,\n\n  /**\n   * @description\n   * Allows setting a custom width of the row headers. You can provide a number or an array of widths, if many row header levels are defined.\n   *\n   * @since 0.22.0\n   * @type {Number|Array}\n   */\n  rowHeaderWidth: void 0,\n\n  /**\n   * @description\n   * Allows setting a custom height of the column headers. You can provide a number or an array of heights, if many column header levels are defined.\n   *\n   * @since 0.22.0\n   * @type {Number|Array}\n   */\n  columnHeaderHeight: void 0,\n\n  /**\n   * @description\n   * Enabling this plugin switches table into one-way data binding where changes are applied into data source (from outside table)\n   * will be automatically reflected in the table.\n   *\n   * For every data change [afterChangesObserved](Hooks.html#event:afterChangesObserved) hook will be fired.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  observeChanges: void 0,\n\n  /**\n   * @description\n   * When passed to the `column` property, allows specifying a custom sorting function for the desired column.\n   *\n   * @since 0.24.0\n   * @type {Function}\n   * @example\n   * ```js\n   * columns: [\n   *   {\n   *     sortFunction: function(sortOrder) {\n   *        return function(a, b) {\n   *          // sorting function body.\n   *          //\n   *          // Function parameters:\n   *          // sortOrder: If true, the order is ascending, if false - descending. undefined = original order\n   *          // a, b: Two compared elements. These are 2-element arrays, with the first element being the row index, the second - cell value.\n   *        }\n   *     }\n   *   }\n   * ]\n   * ```\n   */\n  sortFunction: void 0,\n\n  /**\n   * If defined as 'true', the Autocomplete's suggestion list would be sorted by relevance (the closer to the left the match is, the higher the suggestion).\n   *\n   * Option desired for cells of the `'autocomplete'` type.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  sortByRelevance: true,\n\n  /**\n   * If defined as 'true', when the user types into the input area the Autocomplete's suggestion list is updated to only\n   * include those choices starting with what has been typed; if defined as 'false' all suggestions remain shown, with\n   * those matching what has been typed marked in bold.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  filter: true,\n\n  /**\n   * If defined as 'true', filtering in the Autocomplete Editor will be case-sensitive.\n   *\n   * @type {Boolean}\n   * @default: false\n   */\n  filteringCaseSensitive: false,\n\n  /**\n   * @description\n   * Disable or enable the drag to scroll functionality.\n   *\n   * @example\n   * ```js\n   * ...\n   * dragToScroll: false,\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  dragToScroll: true\n};\n\nexports.default = DefaultSettings;\n\n/***/ }),\n/* 316 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getTranslatedPhrase = getTranslatedPhrase;\n\nvar _array = __webpack_require__(1);\n\nvar _dictionariesManager = __webpack_require__(71);\n\nvar _phraseFormatters = __webpack_require__(392);\n\nvar _mixed = __webpack_require__(16);\n\n/**\n * Get phrase for specified dictionary key.\n *\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n * @param {String} dictionaryKey Constant which is dictionary key.\n * @param {*} argumentsForFormatters Arguments which will be handled by formatters.\n *\n * @returns {String}\n */\n// eslint-disable-next-line import/prefer-default-export\nfunction getTranslatedPhrase(languageCode, dictionaryKey, argumentsForFormatters) {\n  var languageDictionary = (0, _dictionariesManager.getLanguageDictionary)(languageCode);\n\n  if (languageDictionary === null) {\n    return null;\n  }\n\n  var phrasePropositions = languageDictionary[dictionaryKey];\n\n  if ((0, _mixed.isUndefined)(phrasePropositions)) {\n    return null;\n  }\n\n  var formattedPhrase = getFormattedPhrase(phrasePropositions, argumentsForFormatters);\n\n  if (Array.isArray(formattedPhrase)) {\n    return formattedPhrase[0];\n  }\n\n  return formattedPhrase;\n}\n\n/**\n * Get formatted phrase from phrases propositions for specified dictionary key.\n *\n * @private\n * @param {Array|string} phrasePropositions List of phrase propositions.\n * @param {*} argumentsForFormatters Arguments which will be handled by formatters.\n *\n * @returns {Array|string}\n */\nfunction getFormattedPhrase(phrasePropositions, argumentsForFormatters) {\n  var formattedPhrasePropositions = phrasePropositions;\n\n  (0, _array.arrayEach)((0, _phraseFormatters.getPhraseFormatters)(), function (formatter) {\n    formattedPhrasePropositions = formatter(phrasePropositions, argumentsForFormatters);\n  });\n\n  return formattedPhrasePropositions;\n}\n\n/***/ }),\n/* 317 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _templateObject = _taggedTemplateLiteral(['Language with code \"', '\" was not found. You should register particular language \\n    before using it. Read more about this issue at: https://docs.handsontable.com/i18n/missing-language-code.'], ['Language with code \"', '\" was not found. You should register particular language \\n    before using it. Read more about this issue at: https://docs.handsontable.com/i18n/missing-language-code.']);\n\nexports.extendNotExistingKeys = extendNotExistingKeys;\nexports.createCellHeadersRange = createCellHeadersRange;\nexports.normalizeLanguageCode = normalizeLanguageCode;\nexports.applyLanguageSetting = applyLanguageSetting;\nexports.warnUserAboutLanguageRegistration = warnUserAboutLanguageRegistration;\n\nvar _mixed = __webpack_require__(16);\n\nvar _object = __webpack_require__(2);\n\nvar _console = __webpack_require__(56);\n\nvar _templateLiteralTag = __webpack_require__(42);\n\nvar _dictionariesManager = __webpack_require__(71);\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\n/**\n * Perform shallow extend of a target object with only this extension's properties which doesn't exist in the target.\n *\n * @param {Object} target An object that will receive the new properties.\n * @param {Object} extension An object containing additional properties to merge into the target.\n */\n// TODO: Maybe it should be moved to global helpers? It's changed `extend` function.\nfunction extendNotExistingKeys(target, extension) {\n  (0, _object.objectEach)(extension, function (value, key) {\n    if ((0, _mixed.isUndefined)(target[key])) {\n      target[key] = value;\n    }\n  });\n\n  return target;\n}\n\n/**\n * Create range of values basing on cell indexes. For example, it will create below ranges for specified function arguments:\n *\n * createCellHeadersRange(2, 7) => `2-7`\n * createCellHeadersRange(7, 2) => `2-7`\n * createCellHeadersRange(0, 4, 'A', 'D') => `A-D`\n * createCellHeadersRange(4, 0, 'D', 'A') => `A-D`\n *\n * @param {number} firstRowIndex Index of \"first\" cell\n * @param {number} nextRowIndex Index of \"next\" cell\n * @param {*} fromValue Value which will represent \"first\" cell\n * @param {*} toValue Value which will represent \"next\" cell\n * @returns {String} Value representing range i.e. A-Z, 11-15.\n */\nfunction createCellHeadersRange(firstRowIndex, nextRowIndex) {\n  var fromValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : firstRowIndex;\n  var toValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : nextRowIndex;\n\n  // Will swap `fromValue` with `toValue` if it's necessary.\n  if (firstRowIndex > nextRowIndex) {\n    var _ref = [toValue, fromValue];\n    fromValue = _ref[0];\n    toValue = _ref[1];\n  }\n\n  return fromValue + '-' + toValue;\n}\n\n/**\n * Normalize language code. It takes handled languageCode proposition and change it to proper languageCode.\n * For example, when it takes `eN-us` as parameter it return `en-US`\n *\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n * @returns {String}\n */\nfunction normalizeLanguageCode(languageCode) {\n  var languageCodePattern = /^([a-zA-Z]{2})-([a-zA-Z]{2})$/;\n  var partsOfLanguageCode = languageCodePattern.exec(languageCode);\n\n  if (partsOfLanguageCode) {\n    return partsOfLanguageCode[1].toLowerCase() + '-' + partsOfLanguageCode[2].toUpperCase();\n  }\n\n  return languageCode;\n}\n\n/**\n * Set proper start language code. User may set language code which is not proper.\n *\n * @param {Object} settings Settings object.\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n * @returns {String}\n */\nfunction applyLanguageSetting(settings, languageCode) {\n  var normalizedLanguageCode = normalizeLanguageCode(languageCode);\n\n  if ((0, _dictionariesManager.hasLanguageDictionary)(normalizedLanguageCode)) {\n    settings.language = normalizedLanguageCode;\n  } else {\n    settings.language = _dictionariesManager.DEFAULT_LANGUAGE_CODE;\n\n    warnUserAboutLanguageRegistration(languageCode);\n  }\n}\n\n/**\n *\n * Warn user if there is no registered language.\n *\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n */\nfunction warnUserAboutLanguageRegistration(languageCode) {\n  if ((0, _mixed.isDefined)(languageCode)) {\n    (0, _console.error)((0, _templateLiteralTag.toSingleLine)(_templateObject, languageCode));\n  }\n}\n\n/***/ }),\n/* 318 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.stopObserving = exports.startObserving = exports.isPressedCtrlKey = exports.isPressed = exports._resetState = exports._getRefCount = undefined;\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _unicode = __webpack_require__(21);\n\nvar _array = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar eventManager = new _eventManager2.default();\nvar pressedKeys = new Set();\nvar refCount = 0;\n\n/**\n * Begins observing keyboard keys states.\n */\nfunction startObserving() {\n  if (refCount === 0) {\n    eventManager.addEventListener(document, 'keydown', function (event) {\n      if (!pressedKeys.has(event.keyCode)) {\n        pressedKeys.add(event.keyCode);\n      }\n    });\n    eventManager.addEventListener(document, 'keyup', function (event) {\n      if (pressedKeys.has(event.keyCode)) {\n        pressedKeys.delete(event.keyCode);\n      }\n    });\n    eventManager.addEventListener(document, 'visibilitychange', function () {\n      if (document.hidden) {\n        pressedKeys.clear();\n      }\n    });\n  }\n\n  refCount += 1;\n}\n\n/**\n * Stops observing keyboard keys states and clear all previously saved states.\n */\nfunction stopObserving() {\n  if (refCount > 0) {\n    refCount -= 1;\n  }\n\n  if (refCount === 0) {\n    _resetState();\n  }\n}\n\n/**\n * Remove all listeners attached to the DOM and clear all previously saved states.\n */\nfunction _resetState() {\n  eventManager.clearEvents();\n  pressedKeys.clear();\n  refCount = 0;\n}\n\n/**\n * Checks if provided keyCode or keyCodes are pressed.\n *\n * @param {String} keyCodes The key codes passed as a string defined in helpers/unicode.js file delimited with '|'.\n * @return {Boolean}\n */\nfunction isPressed(keyCodes) {\n  return Array.from(pressedKeys.values()).some(function (_keyCode) {\n    return (0, _unicode.isKey)(_keyCode, keyCodes);\n  });\n}\n\n/**\n * Checks if ctrl keys are pressed.\n *\n * @return {Boolean}\n */\nfunction isPressedCtrlKey() {\n  return Array.from(pressedKeys.values()).some(function (_keyCode) {\n    return (0, _unicode.isCtrlMetaKey)(_keyCode);\n  });\n}\n\n/**\n * Returns reference count. Useful for debugging and testing purposes.\n *\n * @return {Number}\n */\nfunction _getRefCount() {\n  return refCount;\n}\n\nexports._getRefCount = _getRefCount;\nexports._resetState = _resetState;\nexports.isPressed = isPressed;\nexports.isPressedCtrlKey = isPressedCtrlKey;\nexports.startObserving = startObserving;\nexports.stopObserving = stopObserving;\n\n/***/ }),\n/* 319 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.HEADER_TYPE = exports.FILL_TYPE = exports.CELL_TYPE = exports.AREA_TYPE = exports.ACTIVE_HEADER_TYPE = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _types = __webpack_require__(395);\n\nvar _array = __webpack_require__(1);\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ACTIVE_HEADER_TYPE = exports.ACTIVE_HEADER_TYPE = 'active-header';\nvar AREA_TYPE = exports.AREA_TYPE = 'area';\nvar CELL_TYPE = exports.CELL_TYPE = 'cell';\nvar FILL_TYPE = exports.FILL_TYPE = 'fill';\nvar HEADER_TYPE = exports.HEADER_TYPE = 'header';\n\n/**\n * Highlight class responsible for managing Walkontable Selection classes.\n *\n * With Highlight object you can manipulate four different highlight types:\n *  - `cell` can be added only to a single cell at a time and it defines currently selected cell;\n *  - `fill` can occur only once and its highlight defines selection of autofill functionality (managed by the plugin with the same name);\n *  - `areas` can be added to multiple cells at a time. This type highlights selected cell or multiple cells.\n *    The multiple cells have to be defined as an uninterrupted order (regular shape). Otherwise, the new layer of\n *    that type should be created to manage not-consecutive selection;\n *  - `header` can occur multiple times. This type is designed to highlight only headers. Like `area` type it\n *    can appear with multiple highlights (accessed under different level layers).\n *\n * @class Highlight\n * @util\n */\n\nvar Highlight = function () {\n  function Highlight(options) {\n    _classCallCheck(this, Highlight);\n\n    /**\n     * Options consumed by Highlight class and Walkontable Selection classes.\n     *\n     * @type {Object}\n     */\n    this.options = options;\n    /**\n     * The property which describes which layer level of the visual selection will be modified.\n     * This option is valid only for `area` and `header` highlight types which occurs multiple times on\n     * the table (as a non-consecutive selection).\n     *\n     * An order of the layers is the same as the order of added new non-consecutive selections.\n     *\n     * @type {Number}\n     * @default 0\n     */\n    this.layerLevel = 0;\n    /**\n     * `cell` highlight object which describes attributes for the currently selected cell.\n     * It can only occur only once on the table.\n     *\n     * @type {Selection}\n     */\n    this.cell = (0, _types.createHighlight)(CELL_TYPE, options);\n    /**\n     * `fill` highlight object which describes attributes for the borders for autofill functionality.\n     * It can only occur only once on the table.\n     *\n     * @type {Selection}\n     */\n    this.fill = (0, _types.createHighlight)(FILL_TYPE, options);\n    /**\n     * Collection of the `area` highlights. That objects describes attributes for the borders and selection of\n     * the multiple selected cells. It can occur multiple times on the table.\n     *\n     * @type {Map.<number, Selection>}\n     */\n    this.areas = new Map();\n    /**\n     * Collection of the `header` highlights. That objects describes attributes for the selection of\n     * the multiple selected rows and columns in the table header. It can occur multiple times on the table.\n     *\n     * @type {Map.<number, Selection>}\n     */\n    this.headers = new Map();\n    /**\n     * Collection of the `active-header` highlights. That objects describes attributes for the selection of\n     * the multiple selected rows and columns in the table header. The table headers which have selected all items in\n     * a row will be marked as `active-header`.\n     *\n     * @type {Map.<number, Selection>}\n     */\n    this.activeHeaders = new Map();\n    /**\n     * The temporary property, holder for borders added through CustomBorders plugin.\n     *\n     * @type {Selection[]}\n     */\n    this.borders = [];\n  }\n\n  /**\n   * Check if highlight cell rendering is disabled for specyfied highlight type.\n   *\n   * @param {String} highlightType Highlight type. Possible values are: `cell`, `area`, `fill` or `header`.\n   * @return {Boolean}\n   */\n\n\n  _createClass(Highlight, [{\n    key: 'isEnabledFor',\n    value: function isEnabledFor(highlightType) {\n      var disableHighlight = this.options.disableHighlight;\n\n      // Legacy compatibility.\n      if (highlightType === 'current') {\n        highlightType = CELL_TYPE;\n      }\n\n      if (typeof disableHighlight === 'string') {\n        disableHighlight = [disableHighlight];\n      }\n\n      return disableHighlight === false || Array.isArray(disableHighlight) && !disableHighlight.includes(highlightType);\n    }\n\n    /**\n     * Set a new layer level to make access to the desire `area` and `header` highlights.\n     *\n     * @param {Number} [level=0] Layer level to use.\n     * @returns {Highlight}\n     */\n\n  }, {\n    key: 'useLayerLevel',\n    value: function useLayerLevel() {\n      var level = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n      this.layerLevel = level;\n\n      return this;\n    }\n\n    /**\n     * Get Walkontable Selection instance created for controlling highlight of the currently selected/edited cell.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'getCell',\n    value: function getCell() {\n      return this.cell;\n    }\n\n    /**\n     * Get Walkontable Selection instance created for controlling highlight of the autofill functionality.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'getFill',\n    value: function getFill() {\n      return this.fill;\n    }\n\n    /**\n     * Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight\n     * of the multiple selected cells.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'createOrGetArea',\n    value: function createOrGetArea() {\n      var layerLevel = this.layerLevel;\n      var area = void 0;\n\n      if (this.areas.has(layerLevel)) {\n        area = this.areas.get(layerLevel);\n      } else {\n        area = (0, _types.createHighlight)(AREA_TYPE, Object.assign({ layerLevel: layerLevel }, this.options));\n\n        this.areas.set(layerLevel, area);\n      }\n\n      return area;\n    }\n\n    /**\n     * Get all Walkontable Selection instances which describes the state of the visual highlight of the cells.\n     *\n     * @return {Selection[]}\n     */\n\n  }, {\n    key: 'getAreas',\n    value: function getAreas() {\n      return [].concat(_toConsumableArray(this.areas.values()));\n    }\n\n    /**\n     * Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight\n     * of the multiple selected header cells.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'createOrGetHeader',\n    value: function createOrGetHeader() {\n      var layerLevel = this.layerLevel;\n      var header = void 0;\n\n      if (this.headers.has(layerLevel)) {\n        header = this.headers.get(layerLevel);\n      } else {\n        header = (0, _types.createHighlight)(HEADER_TYPE, Object.assign({}, this.options));\n\n        this.headers.set(layerLevel, header);\n      }\n\n      return header;\n    }\n\n    /**\n     * Get all Walkontable Selection instances which describes the state of the visual highlight of the headers.\n     *\n     * @return {Selection[]}\n     */\n\n  }, {\n    key: 'getHeaders',\n    value: function getHeaders() {\n      return [].concat(_toConsumableArray(this.headers.values()));\n    }\n\n    /**\n     * Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight\n     * of the multiple selected active header cells.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'createOrGetActiveHeader',\n    value: function createOrGetActiveHeader() {\n      var layerLevel = this.layerLevel;\n      var header = void 0;\n\n      if (this.activeHeaders.has(layerLevel)) {\n        header = this.activeHeaders.get(layerLevel);\n      } else {\n        header = (0, _types.createHighlight)(ACTIVE_HEADER_TYPE, Object.assign({}, this.options));\n\n        this.activeHeaders.set(layerLevel, header);\n      }\n\n      return header;\n    }\n\n    /**\n     * Get all Walkontable Selection instances which describes the state of the visual highlight of the active headers.\n     *\n     * @return {Selection[]}\n     */\n\n  }, {\n    key: 'getActiveHeaders',\n    value: function getActiveHeaders() {\n      return [].concat(_toConsumableArray(this.activeHeaders.values()));\n    }\n\n    /**\n     * Perform cleaning visual highlights for the whole table.\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.cell.clear();\n      this.fill.clear();\n\n      (0, _array.arrayEach)(this.areas.values(), function (highlight) {\n        return void highlight.clear();\n      });\n      (0, _array.arrayEach)(this.headers.values(), function (highlight) {\n        return void highlight.clear();\n      });\n      (0, _array.arrayEach)(this.activeHeaders.values(), function (highlight) {\n        return void highlight.clear();\n      });\n    }\n\n    /**\n     * This object can be iterate over using `for of` syntax or using internal `arrayEach` helper.\n     */\n\n  }, {\n    key: Symbol.iterator,\n    value: function value() {\n      return [this.cell, this.fill].concat(_toConsumableArray(this.areas.values()), _toConsumableArray(this.headers.values()), _toConsumableArray(this.activeHeaders.values()), _toConsumableArray(this.borders))[Symbol.iterator]();\n    }\n  }]);\n\n  return Highlight;\n}();\n\nexports.default = Highlight;\n\n/***/ }),\n/* 320 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _mixed = __webpack_require__(16);\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class SamplesGenerator\n * @util\n */\nvar SamplesGenerator = function () {\n  _createClass(SamplesGenerator, null, [{\n    key: 'SAMPLE_COUNT',\n\n    /**\n     * Number of samples to take of each value length.\n     *\n     * @type {Number}\n     */\n    get: function get() {\n      return 3;\n    }\n  }]);\n\n  function SamplesGenerator(dataFactory) {\n    _classCallCheck(this, SamplesGenerator);\n\n    /**\n     * Samples prepared for calculations.\n     *\n     * @type {Map}\n     * @default {null}\n     */\n    this.samples = null;\n    /**\n     * Function which give the data to collect samples.\n     *\n     * @type {Function}\n     */\n    this.dataFactory = dataFactory;\n    /**\n     * Custom number of samples to take of each value length.\n     *\n     * @type {Number}\n     * @default {null}\n     */\n    this.customSampleCount = null;\n    /**\n     * `true` if duplicate samples collection should be allowed, `false` otherwise.\n     *\n     * @type {Boolean}\n     * @default {false}\n     */\n    this.allowDuplicates = false;\n  }\n\n  /**\n   * Get the sample count for this instance.\n   *\n   * @returns {Number}\n   */\n\n\n  _createClass(SamplesGenerator, [{\n    key: 'getSampleCount',\n    value: function getSampleCount() {\n      if (this.customSampleCount) {\n        return this.customSampleCount;\n      }\n      return SamplesGenerator.SAMPLE_COUNT;\n    }\n  }, {\n    key: 'setSampleCount',\n\n\n    /**\n     * Set the sample count.\n     *\n     * @param {Number} sampleCount Number of samples to be collected.\n     */\n    value: function setSampleCount(sampleCount) {\n      this.customSampleCount = sampleCount;\n    }\n\n    /**\n     * Set if the generator should accept duplicate values.\n     *\n     * @param {Boolean} allowDuplicates `true` to allow duplicate values.\n     */\n\n  }, {\n    key: 'setAllowDuplicates',\n    value: function setAllowDuplicates(allowDuplicates) {\n      this.allowDuplicates = allowDuplicates;\n    }\n\n    /**\n     * Generate samples for row. You can control which area should be sampled by passing `rowRange` object and `colRange` object.\n     *\n     * @param {Object|Number} rowRange\n     * @param {Object} colRange\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'generateRowSamples',\n    value: function generateRowSamples(rowRange, colRange) {\n      return this.generateSamples('row', colRange, rowRange);\n    }\n\n    /**\n     * Generate samples for column. You can control which area should be sampled by passing `colRange` object and `rowRange` object.\n     *\n     * @param {Object} colRange Column index.\n     * @param {Object} rowRange Column index.\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'generateColumnSamples',\n    value: function generateColumnSamples(colRange, rowRange) {\n      return this.generateSamples('col', rowRange, colRange);\n    }\n\n    /**\n     * Generate collection of samples.\n     *\n     * @param {String} type Type to generate. Can be `col` or `row`.\n     * @param {Object} range\n     * @param {Object|Number} specifierRange\n     * @returns {Map}\n     */\n\n  }, {\n    key: 'generateSamples',\n    value: function generateSamples(type, range, specifierRange) {\n      var _this = this;\n\n      var samples = new Map();\n\n      if (typeof specifierRange === 'number') {\n        specifierRange = { from: specifierRange, to: specifierRange };\n      }\n      (0, _number.rangeEach)(specifierRange.from, specifierRange.to, function (index) {\n        var sample = _this.generateSample(type, range, index);\n\n        samples.set(index, sample);\n      });\n\n      return samples;\n    }\n\n    /**\n     * Generate sample for specified type (`row` or `col`).\n     *\n     * @param {String} type Samples type `row` or `col`.\n     * @param {Object} range\n     * @param {Number} specifierValue\n     * @returns {Map}\n     */\n\n  }, {\n    key: 'generateSample',\n    value: function generateSample(type, range, specifierValue) {\n      var _this2 = this;\n\n      var samples = new Map();\n      var sampledValues = [];\n      var length = void 0;\n\n      (0, _number.rangeEach)(range.from, range.to, function (index) {\n        var value = void 0;\n\n        if (type === 'row') {\n          value = _this2.dataFactory(specifierValue, index);\n        } else if (type === 'col') {\n          value = _this2.dataFactory(index, specifierValue);\n        } else {\n          throw new Error('Unsupported sample type');\n        }\n\n        if ((0, _object.isObject)(value)) {\n          length = Object.keys(value).length;\n        } else if (Array.isArray(value)) {\n          length = value.length;\n        } else {\n          length = (0, _mixed.stringify)(value).length;\n        }\n\n        if (!samples.has(length)) {\n          samples.set(length, {\n            needed: _this2.getSampleCount(),\n            strings: []\n          });\n        }\n        var sample = samples.get(length);\n\n        if (sample.needed) {\n          var duplicate = sampledValues.indexOf(value) > -1;\n\n          if (!duplicate || _this2.allowDuplicates) {\n            var computedKey = type === 'row' ? 'col' : 'row';\n\n            sample.strings.push(_defineProperty({ value: value }, computedKey, index));\n            sampledValues.push(value);\n            sample.needed--;\n          }\n        }\n      });\n\n      return samples;\n    }\n  }]);\n\n  return SamplesGenerator;\n}();\n\nexports.default = SamplesGenerator;\n\n/***/ }),\n/* 321 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar MIXIN_NAME = 'arrayMapper';\n\n/**\n * @type {Object}\n */\nvar arrayMapper = {\n  _arrayMap: [],\n\n  /**\n   * Get translated index by its physical index.\n   *\n   * @param {Number} physicalIndex Physical index.\n   * @return {Number|null} Returns translated index mapped by passed physical index.\n   */\n  getValueByIndex: function getValueByIndex(physicalIndex) {\n    var length = this._arrayMap.length;\n    var translatedIndex = null;\n\n    if (physicalIndex < length) {\n      translatedIndex = this._arrayMap[physicalIndex];\n    }\n\n    return translatedIndex;\n  },\n\n\n  /**\n   * Get physical index by its translated index.\n   *\n   * @param {*} translatedIndex Value to search.\n   * @returns {Number|null} Returns a physical index of the array mapper.\n   */\n  getIndexByValue: function getIndexByValue(translatedIndex) {\n    var physicalIndex = void 0;\n\n    // eslint-disable-next-line no-cond-assign, no-return-assign\n    return (physicalIndex = this._arrayMap.indexOf(translatedIndex)) === -1 ? null : physicalIndex;\n  },\n\n\n  /**\n   * Insert new items to array mapper starting at passed index. New entries will be a continuation of last value in the array.\n   *\n   * @param {Number} physicalIndex Array index.\n   * @param {Number} [amount=1] Defines how many items will be created to an array.\n   * @returns {Array} Returns added items.\n   */\n  insertItems: function insertItems(physicalIndex) {\n    var _this = this;\n\n    var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n    var newIndex = (0, _array.arrayMax)(this._arrayMap) + 1;\n    var addedItems = [];\n\n    (0, _number.rangeEach)(amount - 1, function (count) {\n      addedItems.push(_this._arrayMap.splice(physicalIndex + count, 0, newIndex + count));\n    });\n\n    return addedItems;\n  },\n\n\n  /**\n   * Remove items from array mapper.\n   *\n   * @param {Number} physicalIndex Array index.\n   * @param {Number} [amount=1] Defines how many items will be created to an array.\n   * @returns {Array} Returns removed items.\n   */\n  removeItems: function removeItems(physicalIndex) {\n    var _this2 = this;\n\n    var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n    var removedItems = [];\n\n    if (Array.isArray(physicalIndex)) {\n      var mapCopy = [].concat(this._arrayMap);\n\n      // Sort descending\n      physicalIndex.sort(function (a, b) {\n        return b - a;\n      });\n\n      removedItems = (0, _array.arrayReduce)(physicalIndex, function (acc, item) {\n        _this2._arrayMap.splice(item, 1);\n\n        return acc.concat(mapCopy.slice(item, item + 1));\n      }, []);\n    } else {\n      removedItems = this._arrayMap.splice(physicalIndex, amount);\n    }\n\n    return removedItems;\n  },\n\n\n  /**\n   * Unshift items (remove and shift chunk of array to the left).\n   *\n   * @param {Number|Array} physicalIndex Array index or Array of indexes to unshift.\n   * @param {Number} [amount=1] Defines how many items will be removed from an array (when index is passed as number).\n   */\n  unshiftItems: function unshiftItems(physicalIndex) {\n    var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n    var removedItems = this.removeItems(physicalIndex, amount);\n\n    function countRowShift(logicalRow) {\n      // Todo: compare perf between reduce vs sort->each->brake\n      return (0, _array.arrayReduce)(removedItems, function (count, removedLogicalRow) {\n        if (logicalRow > removedLogicalRow) {\n          count++;\n        }\n\n        return count;\n      }, 0);\n    }\n\n    this._arrayMap = (0, _array.arrayMap)(this._arrayMap, function (logicalRow, physicalRow) {\n      var rowShift = countRowShift(logicalRow);\n\n      if (rowShift) {\n        logicalRow -= rowShift;\n      }\n\n      return logicalRow;\n    });\n  },\n\n\n  /**\n   * Shift (right shifting) items starting at passed index.\n   *\n   * @param {Number} physicalIndex Array index.\n   * @param {Number} [amount=1] Defines how many items will be created to an array.\n   */\n  shiftItems: function shiftItems(physicalIndex) {\n    var _this3 = this;\n\n    var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n    this._arrayMap = (0, _array.arrayMap)(this._arrayMap, function (row) {\n      if (row >= physicalIndex) {\n        row += amount;\n      }\n      return row;\n    });\n\n    (0, _number.rangeEach)(amount - 1, function (count) {\n      _this3._arrayMap.splice(physicalIndex + count, 0, physicalIndex + count);\n    });\n  },\n\n\n  /**\n   * Swap indexes in arrayMapper.\n   *\n   * @param {Number} physicalIndexFrom index to move.\n   * @param {Number} physicalIndexTo index to.\n   */\n  swapIndexes: function swapIndexes(physicalIndexFrom, physicalIndexTo) {\n    var _arrayMap;\n\n    (_arrayMap = this._arrayMap).splice.apply(_arrayMap, [physicalIndexTo, 0].concat(_toConsumableArray(this._arrayMap.splice(physicalIndexFrom, 1))));\n  },\n\n\n  /**\n   * Clear all stored index<->value information from an array.\n   */\n  clearMap: function clearMap() {\n    this._arrayMap.length = 0;\n  }\n};\n\n(0, _object.defineGetter)(arrayMapper, 'MIXIN_NAME', MIXIN_NAME, {\n  writable: false,\n  enumerable: false\n});\n\nexports.default = arrayMapper;\n\n/***/ }),\n/* 322 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _number = __webpack_require__(5);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar STATE_INITIALIZED = 0;\nvar STATE_BUILT = 1;\nvar STATE_APPENDED = 2;\nvar UNIT = 'px';\n\n/**\n * @class\n * @private\n */\n\nvar BaseUI = function () {\n  function BaseUI(hotInstance) {\n    _classCallCheck(this, BaseUI);\n\n    /**\n     * Instance of Handsontable.\n     *\n     * @type {Core}\n     */\n    this.hot = hotInstance;\n    /**\n     * DOM element representing the ui element.\n     *\n     * @type {HTMLElement}\n     * @private\n     */\n    this._element = null;\n    /**\n     * Flag which determines build state of element.\n     *\n     * @type {Boolean}\n     */\n    this.state = STATE_INITIALIZED;\n  }\n\n  /**\n   * Add created UI elements to table.\n   *\n   * @param {HTMLElement} wrapper Element which are parent for our UI element.\n   */\n\n\n  _createClass(BaseUI, [{\n    key: 'appendTo',\n    value: function appendTo(wrapper) {\n      wrapper.appendChild(this._element);\n\n      this.state = STATE_APPENDED;\n    }\n\n    /**\n     * Method for create UI element. Only create, without append to table.\n     */\n\n  }, {\n    key: 'build',\n    value: function build() {\n      this._element = document.createElement('div');\n      this.state = STATE_BUILT;\n    }\n\n    /**\n     * Method for remove UI element.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.isAppended()) {\n        this._element.parentElement.removeChild(this._element);\n      }\n\n      this._element = null;\n      this.state = STATE_INITIALIZED;\n    }\n\n    /**\n     * Check if UI element are appended.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isAppended',\n    value: function isAppended() {\n      return this.state === STATE_APPENDED;\n    }\n\n    /**\n     * Check if UI element are built.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isBuilt',\n    value: function isBuilt() {\n      return this.state >= STATE_BUILT;\n    }\n\n    /**\n     * Setter for position.\n     *\n     * @param {Number} top New top position of the element.\n     * @param {Number} left New left position of the element.\n     */\n\n  }, {\n    key: 'setPosition',\n    value: function setPosition(top, left) {\n      if ((0, _number.isNumeric)(top)) {\n        this._element.style.top = top + UNIT;\n      }\n      if ((0, _number.isNumeric)(left)) {\n        this._element.style.left = left + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element position.\n     *\n     * @returns {Object} Object contains left and top position of the element.\n     */\n\n  }, {\n    key: 'getPosition',\n    value: function getPosition() {\n      return {\n        top: this._element.style.top ? parseInt(this._element.style.top, 10) : 0,\n        left: this._element.style.left ? parseInt(this._element.style.left, 10) : 0\n      };\n    }\n\n    /**\n     * Setter for the element size.\n     *\n     * @param {Number} width New width of the element.\n     * @param {Number} height New height of the element.\n     */\n\n  }, {\n    key: 'setSize',\n    value: function setSize(width, height) {\n      if ((0, _number.isNumeric)(width)) {\n        this._element.style.width = width + UNIT;\n      }\n      if ((0, _number.isNumeric)(height)) {\n        this._element.style.height = height + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element position.\n     *\n     * @returns {Object} Object contains height and width of the element.\n     */\n\n  }, {\n    key: 'getSize',\n    value: function getSize() {\n      return {\n        width: this._element.style.width ? parseInt(this._element.style.width, 10) : 0,\n        height: this._element.style.height ? parseInt(this._element.style.height, 10) : 0\n      };\n    }\n\n    /**\n     * Setter for the element offset. Offset means marginTop and marginLeft of the element.\n     *\n     * @param {Number} top New margin top of the element.\n     * @param {Number} left New margin left of the element.\n     */\n\n  }, {\n    key: 'setOffset',\n    value: function setOffset(top, left) {\n      if ((0, _number.isNumeric)(top)) {\n        this._element.style.marginTop = top + UNIT;\n      }\n      if ((0, _number.isNumeric)(left)) {\n        this._element.style.marginLeft = left + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element offset.\n     *\n     * @returns {Object} Object contains top and left offset of the element.\n     */\n\n  }, {\n    key: 'getOffset',\n    value: function getOffset() {\n      return {\n        top: this._element.style.marginTop ? parseInt(this._element.style.marginTop, 10) : 0,\n        left: this._element.style.marginLeft ? parseInt(this._element.style.marginLeft, 10) : 0\n      };\n    }\n  }]);\n\n  return BaseUI;\n}();\n\nexports.default = BaseUI;\n\n/***/ }),\n/* 323 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar STATE_INITIALIZED = 0;\nvar STATE_BUILT = 1;\nvar STATE_APPENDED = 2;\nvar UNIT = 'px';\n\n/**\n * @class\n * @private\n */\n\nvar BaseUI = function () {\n  function BaseUI(hotInstance) {\n    _classCallCheck(this, BaseUI);\n\n    /**\n     * Instance of Handsontable.\n     *\n     * @type {Core}\n     */\n    this.hot = hotInstance;\n    /**\n     * DOM element representing the ui element.\n     *\n     * @type {HTMLElement}\n     * @private\n     */\n    this._element = null;\n    /**\n     * Flag which determines build state of element.\n     *\n     * @type {Boolean}\n     */\n    this.state = STATE_INITIALIZED;\n  }\n\n  /**\n   * Add created UI elements to table.\n   *\n   * @param {HTMLElement} wrapper Element which are parent for our UI element.\n   */\n\n\n  _createClass(BaseUI, [{\n    key: 'appendTo',\n    value: function appendTo(wrapper) {\n      wrapper.appendChild(this._element);\n\n      this.state = STATE_APPENDED;\n    }\n\n    /**\n     * Method for create UI element. Only create, without append to table.\n     */\n\n  }, {\n    key: 'build',\n    value: function build() {\n      this._element = document.createElement('div');\n      this.state = STATE_BUILT;\n    }\n\n    /**\n     * Method for remove UI element.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.isAppended()) {\n        this._element.parentElement.removeChild(this._element);\n      }\n\n      this._element = null;\n      this.state = STATE_INITIALIZED;\n    }\n\n    /**\n     * Check if UI element are appended.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isAppended',\n    value: function isAppended() {\n      return this.state === STATE_APPENDED;\n    }\n\n    /**\n     * Check if UI element are built.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isBuilt',\n    value: function isBuilt() {\n      return this.state >= STATE_BUILT;\n    }\n\n    /**\n     * Setter for position.\n     *\n     * @param {Number} top New top position of the element.\n     * @param {Number} left New left position of the element.\n     */\n\n  }, {\n    key: 'setPosition',\n    value: function setPosition(top, left) {\n      if (top !== void 0) {\n        this._element.style.top = top + UNIT;\n      }\n      if (left !== void 0) {\n        this._element.style.left = left + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element position.\n     *\n     * @returns {Object} Object contains left and top position of the element.\n     */\n\n  }, {\n    key: 'getPosition',\n    value: function getPosition() {\n      return {\n        top: this._element.style.top ? parseInt(this._element.style.top, 10) : 0,\n        left: this._element.style.left ? parseInt(this._element.style.left, 10) : 0\n      };\n    }\n\n    /**\n     * Setter for the element size.\n     *\n     * @param {Number} width New width of the element.\n     * @param {Number} height New height of the element.\n     */\n\n  }, {\n    key: 'setSize',\n    value: function setSize(width, height) {\n      if (width) {\n        this._element.style.width = width + UNIT;\n      }\n      if (height) {\n        this._element.style.height = height + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element position.\n     *\n     * @returns {Object} Object contains height and width of the element.\n     */\n\n  }, {\n    key: 'getSize',\n    value: function getSize() {\n      return {\n        width: this._element.style.width ? parseInt(this._element.style.width, 10) : 0,\n        height: this._element.style.height ? parseInt(this._element.style.height, 10) : 0\n      };\n    }\n\n    /**\n     * Setter for the element offset. Offset means marginTop and marginLeft of the element.\n     *\n     * @param {Number} top New margin top of the element.\n     * @param {Number} left New margin left of the element.\n     */\n\n  }, {\n    key: 'setOffset',\n    value: function setOffset(top, left) {\n      if (top) {\n        this._element.style.marginTop = top + UNIT;\n      }\n      if (left) {\n        this._element.style.marginLeft = left + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element offset.\n     *\n     * @returns {Object} Object contains top and left offset of the element.\n     */\n\n  }, {\n    key: 'getOffset',\n    value: function getOffset() {\n      return {\n        top: this._element.style.marginTop ? parseInt(this._element.style.marginTop, 10) : 0,\n        left: this._element.style.marginLeft ? parseInt(this._element.style.marginLeft, 10) : 0\n      };\n    }\n  }]);\n\n  return BaseUI;\n}();\n\nexports.default = BaseUI;\n\n/***/ }),\n/* 324 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.applySpanProperties = applySpanProperties;\n/**\n * Apply the `colspan`/`rowspan` properties.\n *\n * @param {HTMLElement} TD The soon-to-be-modified cell.\n * @param {MergedCellCoords} merged cellInfo The merged cell in question.\n * @param {Number} row Row index.\n * @param {Number} col Column index.\n */\n// eslint-disable-next-line import/prefer-default-export\nfunction applySpanProperties(TD, mergedCellInfo, row, col) {\n  if (mergedCellInfo) {\n    if (mergedCellInfo.row === row && mergedCellInfo.col === col) {\n      TD.setAttribute('rowspan', mergedCellInfo.rowspan.toString());\n      TD.setAttribute('colspan', mergedCellInfo.colspan.toString());\n    } else {\n      TD.removeAttribute('rowspan');\n      TD.removeAttribute('colspan');\n\n      TD.style.display = 'none';\n    }\n  } else {\n    TD.removeAttribute('rowspan');\n    TD.removeAttribute('colspan');\n\n    TD.style.display = '';\n  }\n}\n\n/***/ }),\n/* 325 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/*!\n * https://github.com/Starcounter-Jack/JSON-Patch\n * json-patch-duplex.js version: 0.5.7\n * (c) 2013 Joachim Wester\n * MIT license\n */\nvar __extends = undefined && undefined.__extends || function (d, b) {\n    for (var p in b) {\n        if (b.hasOwnProperty(p)) d[p] = b[p];\n    }function __() {\n        this.constructor = d;\n    }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OriginalError = Error;\nvar jsonpatch;\n(function (jsonpatch) {\n    var _objectKeys = function _objectKeys(obj) {\n        if (_isArray(obj)) {\n            var keys = new Array(obj.length);\n            for (var k = 0; k < keys.length; k++) {\n                keys[k] = \"\" + k;\n            }\n            return keys;\n        }\n        if (Object.keys) {\n            return Object.keys(obj);\n        }\n        var keys = [];\n        for (var i in obj) {\n            if (obj.hasOwnProperty(i)) {\n                keys.push(i);\n            }\n        }\n        return keys;\n    };\n    function _equals(a, b) {\n        switch (typeof a === 'undefined' ? 'undefined' : _typeof(a)) {\n            case 'undefined': //backward compatibility, but really I think we should return false\n            case 'boolean':\n            case 'string':\n            case 'number':\n                return a === b;\n            case 'object':\n                if (a === null) return b === null;\n                if (_isArray(a)) {\n                    if (!_isArray(b) || a.length !== b.length) return false;\n                    for (var i = 0, l = a.length; i < l; i++) {\n                        if (!_equals(a[i], b[i])) return false;\n                    }return true;\n                }\n                var bKeys = _objectKeys(b);\n                var bLength = bKeys.length;\n                if (_objectKeys(a).length !== bLength) return false;\n                for (var i = 0; i < bLength; i++) {\n                    if (!_equals(a[i], b[i])) return false;\n                }return true;\n            default:\n                return false;\n        }\n    }\n    /* We use a Javascript hash to store each\n     function. Each hash entry (property) uses\n     the operation identifiers specified in rfc6902.\n     In this way, we can map each patch operation\n     to its dedicated function in efficient way.\n     */\n    /* The operations applicable to an object */\n    var objOps = {\n        add: function add(obj, key) {\n            obj[key] = this.value;\n            return true;\n        },\n        remove: function remove(obj, key) {\n            delete obj[key];\n            return true;\n        },\n        replace: function replace(obj, key) {\n            obj[key] = this.value;\n            return true;\n        },\n        move: function move(obj, key, tree) {\n            var temp = { op: \"_get\", path: this.from };\n            apply(tree, [temp]);\n            apply(tree, [{ op: \"remove\", path: this.from }]);\n            apply(tree, [{ op: \"add\", path: this.path, value: temp.value }]);\n            return true;\n        },\n        copy: function copy(obj, key, tree) {\n            var temp = { op: \"_get\", path: this.from };\n            apply(tree, [temp]);\n            apply(tree, [{ op: \"add\", path: this.path, value: temp.value }]);\n            return true;\n        },\n        test: function test(obj, key) {\n            return _equals(obj[key], this.value);\n        },\n        _get: function _get(obj, key) {\n            this.value = obj[key];\n        }\n    };\n    /* The operations applicable to an array. Many are the same as for the object */\n    var arrOps = {\n        add: function add(arr, i) {\n            arr.splice(i, 0, this.value);\n            return true;\n        },\n        remove: function remove(arr, i) {\n            arr.splice(i, 1);\n            return true;\n        },\n        replace: function replace(arr, i) {\n            arr[i] = this.value;\n            return true;\n        },\n        move: objOps.move,\n        copy: objOps.copy,\n        test: objOps.test,\n        _get: objOps._get\n    };\n    /* The operations applicable to object root. Many are the same as for the object */\n    var rootOps = {\n        add: function add(obj) {\n            rootOps.remove.call(this, obj);\n            for (var key in this.value) {\n                if (this.value.hasOwnProperty(key)) {\n                    obj[key] = this.value[key];\n                }\n            }\n            return true;\n        },\n        remove: function remove(obj) {\n            for (var key in obj) {\n                if (obj.hasOwnProperty(key)) {\n                    objOps.remove.call(this, obj, key);\n                }\n            }\n            return true;\n        },\n        replace: function replace(obj) {\n            apply(obj, [{ op: \"remove\", path: this.path }]);\n            apply(obj, [{ op: \"add\", path: this.path, value: this.value }]);\n            return true;\n        },\n        move: objOps.move,\n        copy: objOps.copy,\n        test: function test(obj) {\n            return JSON.stringify(obj) === JSON.stringify(this.value);\n        },\n        _get: function _get(obj) {\n            this.value = obj;\n        }\n    };\n    var observeOps = {\n        add: function add(patches, path) {\n            var patch = {\n                op: \"add\",\n                path: path + escapePathComponent(this.name),\n                value: this.object[this.name] };\n            patches.push(patch);\n        },\n        'delete': function _delete(patches, path) {\n            var patch = {\n                op: \"remove\",\n                path: path + escapePathComponent(this.name)\n            };\n            patches.push(patch);\n        },\n        update: function update(patches, path) {\n            var patch = {\n                op: \"replace\",\n                path: path + escapePathComponent(this.name),\n                value: this.object[this.name]\n            };\n            patches.push(patch);\n        }\n    };\n    function escapePathComponent(str) {\n        if (str.indexOf('/') === -1 && str.indexOf('~') === -1) return str;\n        return str.replace(/~/g, '~0').replace(/\\//g, '~1');\n    }\n    function _getPathRecursive(root, obj) {\n        var found;\n        for (var key in root) {\n            if (root.hasOwnProperty(key)) {\n                if (root[key] === obj) {\n                    return escapePathComponent(key) + '/';\n                } else if (_typeof(root[key]) === 'object') {\n                    found = _getPathRecursive(root[key], obj);\n                    if (found != '') {\n                        return escapePathComponent(key) + '/' + found;\n                    }\n                }\n            }\n        }\n        return '';\n    }\n    function getPath(root, obj) {\n        if (root === obj) {\n            return '/';\n        }\n        var path = _getPathRecursive(root, obj);\n        if (path === '') {\n            throw new OriginalError(\"Object not found in root\");\n        }\n        return '/' + path;\n    }\n    var beforeDict = [];\n    var Mirror = function () {\n        function Mirror(obj) {\n            this.observers = [];\n            this.obj = obj;\n        }\n        return Mirror;\n    }();\n    var ObserverInfo = function () {\n        function ObserverInfo(callback, observer) {\n            this.callback = callback;\n            this.observer = observer;\n        }\n        return ObserverInfo;\n    }();\n    function getMirror(obj) {\n        for (var i = 0, ilen = beforeDict.length; i < ilen; i++) {\n            if (beforeDict[i].obj === obj) {\n                return beforeDict[i];\n            }\n        }\n    }\n    function getObserverFromMirror(mirror, callback) {\n        for (var j = 0, jlen = mirror.observers.length; j < jlen; j++) {\n            if (mirror.observers[j].callback === callback) {\n                return mirror.observers[j].observer;\n            }\n        }\n    }\n    function removeObserverFromMirror(mirror, observer) {\n        for (var j = 0, jlen = mirror.observers.length; j < jlen; j++) {\n            if (mirror.observers[j].observer === observer) {\n                mirror.observers.splice(j, 1);\n                return;\n            }\n        }\n    }\n    function unobserve(root, observer) {\n        observer.unobserve();\n    }\n    jsonpatch.unobserve = unobserve;\n    function deepClone(obj) {\n        if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === \"object\") {\n            return JSON.parse(JSON.stringify(obj)); //Faster than ES5 clone - http://jsperf.com/deep-cloning-of-objects/5\n        } else {\n            return obj; //no need to clone primitives\n        }\n    }\n    function observe(obj, callback) {\n        var patches = [];\n        var root = obj;\n        var observer;\n        var mirror = getMirror(obj);\n        if (!mirror) {\n            mirror = new Mirror(obj);\n            beforeDict.push(mirror);\n        } else {\n            observer = getObserverFromMirror(mirror, callback);\n        }\n        if (observer) {\n            return observer;\n        }\n        observer = {};\n        mirror.value = deepClone(obj);\n        if (callback) {\n            observer.callback = callback;\n            observer.next = null;\n            var intervals = this.intervals || [100, 1000, 10000, 60000];\n            if (intervals.push === void 0) {\n                throw new OriginalError(\"jsonpatch.intervals must be an array\");\n            }\n            var currentInterval = 0;\n            var dirtyCheck = function dirtyCheck() {\n                generate(observer);\n            };\n            var fastCheck = function fastCheck() {\n                clearTimeout(observer.next);\n                observer.next = setTimeout(function () {\n                    dirtyCheck();\n                    currentInterval = 0;\n                    observer.next = setTimeout(slowCheck, intervals[currentInterval++]);\n                }, 0);\n            };\n            var slowCheck = function slowCheck() {\n                dirtyCheck();\n                if (currentInterval == intervals.length) currentInterval = intervals.length - 1;\n                observer.next = setTimeout(slowCheck, intervals[currentInterval++]);\n            };\n            if (typeof window !== 'undefined') {\n                if (window.addEventListener) {\n                    window.addEventListener('mousedown', fastCheck);\n                    window.addEventListener('mouseup', fastCheck);\n                    window.addEventListener('keydown', fastCheck);\n                } else {\n                    document.documentElement.attachEvent('onmousedown', fastCheck);\n                    document.documentElement.attachEvent('onmouseup', fastCheck);\n                    document.documentElement.attachEvent('onkeydown', fastCheck);\n                }\n            }\n            observer.next = setTimeout(slowCheck, intervals[currentInterval++]);\n        }\n        observer.patches = patches;\n        observer.object = obj;\n        observer.unobserve = function () {\n            generate(observer);\n            clearTimeout(observer.next);\n            removeObserverFromMirror(mirror, observer);\n            if (typeof window !== 'undefined') {\n                if (window.removeEventListener) {\n                    window.removeEventListener('mousedown', fastCheck);\n                    window.removeEventListener('mouseup', fastCheck);\n                    window.removeEventListener('keydown', fastCheck);\n                } else {\n                    document.documentElement.detachEvent('onmousedown', fastCheck);\n                    document.documentElement.detachEvent('onmouseup', fastCheck);\n                    document.documentElement.detachEvent('onkeydown', fastCheck);\n                }\n            }\n        };\n        mirror.observers.push(new ObserverInfo(callback, observer));\n        return observer;\n    }\n    jsonpatch.observe = observe;\n    function generate(observer) {\n        var mirror;\n        for (var i = 0, ilen = beforeDict.length; i < ilen; i++) {\n            if (beforeDict[i].obj === observer.object) {\n                mirror = beforeDict[i];\n                break;\n            }\n        }\n        _generate(mirror.value, observer.object, observer.patches, \"\");\n        if (observer.patches.length) {\n            apply(mirror.value, observer.patches);\n        }\n        var temp = observer.patches;\n        if (temp.length > 0) {\n            observer.patches = [];\n            if (observer.callback) {\n                observer.callback(temp);\n            }\n        }\n        return temp;\n    }\n    jsonpatch.generate = generate;\n    // Dirty check if obj is different from mirror, generate patches and update mirror\n    function _generate(mirror, obj, patches, path) {\n        var newKeys = _objectKeys(obj);\n        var oldKeys = _objectKeys(mirror);\n        var changed = false;\n        var deleted = false;\n        //if ever \"move\" operation is implemented here, make sure this test runs OK: \"should not generate the same patch twice (move)\"\n        for (var t = oldKeys.length - 1; t >= 0; t--) {\n            var key = oldKeys[t];\n            var oldVal = mirror[key];\n            if (obj.hasOwnProperty(key)) {\n                var newVal = obj[key];\n                if ((typeof oldVal === 'undefined' ? 'undefined' : _typeof(oldVal)) == \"object\" && oldVal != null && (typeof newVal === 'undefined' ? 'undefined' : _typeof(newVal)) == \"object\" && newVal != null) {\n                    _generate(oldVal, newVal, patches, path + \"/\" + escapePathComponent(key));\n                } else {\n                    if (oldVal != newVal) {\n                        changed = true;\n                        patches.push({ op: \"replace\", path: path + \"/\" + escapePathComponent(key), value: deepClone(newVal) });\n                    }\n                }\n            } else {\n                patches.push({ op: \"remove\", path: path + \"/\" + escapePathComponent(key) });\n                deleted = true; // property has been deleted\n            }\n        }\n        if (!deleted && newKeys.length == oldKeys.length) {\n            return;\n        }\n        for (var t = 0; t < newKeys.length; t++) {\n            var key = newKeys[t];\n            if (!mirror.hasOwnProperty(key)) {\n                patches.push({ op: \"add\", path: path + \"/\" + escapePathComponent(key), value: deepClone(obj[key]) });\n            }\n        }\n    }\n    var _isArray;\n    if (Array.isArray) {\n        _isArray = Array.isArray;\n    } else {\n        _isArray = function _isArray(obj) {\n            return obj.push && typeof obj.length === 'number';\n        };\n    }\n    //3x faster than cached /^\\d+$/.test(str)\n    function isInteger(str) {\n        var i = 0;\n        var len = str.length;\n        var charCode;\n        while (i < len) {\n            charCode = str.charCodeAt(i);\n            if (charCode >= 48 && charCode <= 57) {\n                i++;\n                continue;\n            }\n            return false;\n        }\n        return true;\n    }\n    /// Apply a json-patch operation on an object tree\n    function apply(tree, patches, validate) {\n        var result = false,\n            p = 0,\n            plen = patches.length,\n            patch,\n            key;\n        while (p < plen) {\n            patch = patches[p];\n            p++;\n            // Find the object\n            var path = patch.path || \"\";\n            var keys = path.split('/');\n            var obj = tree;\n            var t = 1; //skip empty element - http://jsperf.com/to-shift-or-not-to-shift\n            var len = keys.length;\n            var existingPathFragment = undefined;\n            while (true) {\n                key = keys[t];\n                if (validate) {\n                    if (existingPathFragment === undefined) {\n                        if (obj[key] === undefined) {\n                            existingPathFragment = keys.slice(0, t).join('/');\n                        } else if (t == len - 1) {\n                            existingPathFragment = patch.path;\n                        }\n                        if (existingPathFragment !== undefined) {\n                            this.validator(patch, p - 1, tree, existingPathFragment);\n                        }\n                    }\n                }\n                t++;\n                if (key === undefined) {\n                    if (t >= len) {\n                        result = rootOps[patch.op].call(patch, obj, key, tree); // Apply patch\n                        break;\n                    }\n                }\n                if (_isArray(obj)) {\n                    if (key === '-') {\n                        key = obj.length;\n                    } else {\n                        if (validate && !isInteger(key)) {\n                            throw new JsonPatchError(\"Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index\", \"OPERATION_PATH_ILLEGAL_ARRAY_INDEX\", p - 1, patch.path, patch);\n                        }\n                        key = parseInt(key, 10);\n                    }\n                    if (t >= len) {\n                        if (validate && patch.op === \"add\" && key > obj.length) {\n                            throw new JsonPatchError(\"The specified index MUST NOT be greater than the number of elements in the array\", \"OPERATION_VALUE_OUT_OF_BOUNDS\", p - 1, patch.path, patch);\n                        }\n                        result = arrOps[patch.op].call(patch, obj, key, tree); // Apply patch\n                        break;\n                    }\n                } else {\n                    if (key && key.indexOf('~') != -1) key = key.replace(/~1/g, '/').replace(/~0/g, '~'); // escape chars\n                    if (t >= len) {\n                        result = objOps[patch.op].call(patch, obj, key, tree); // Apply patch\n                        break;\n                    }\n                }\n                obj = obj[key];\n            }\n        }\n        return result;\n    }\n    jsonpatch.apply = apply;\n    function compare(tree1, tree2) {\n        var patches = [];\n        _generate(tree1, tree2, patches, '');\n        return patches;\n    }\n    jsonpatch.compare = compare;\n    var JsonPatchError = function (_super) {\n        __extends(JsonPatchError, _super);\n        function JsonPatchError(message, name, index, operation, tree) {\n            _super.call(this, message);\n            this.message = message;\n            this.name = name;\n            this.index = index;\n            this.operation = operation;\n            this.tree = tree;\n        }\n        return JsonPatchError;\n    }(OriginalError);\n    jsonpatch.JsonPatchError = JsonPatchError;\n    jsonpatch.Error = JsonPatchError;\n    /**\n     * Recursively checks whether an object has any undefined values inside.\n     */\n    function hasUndefined(obj) {\n        if (obj === undefined) {\n            return true;\n        }\n        if (typeof obj == \"array\" || (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) == \"object\") {\n            for (var i in obj) {\n                if (hasUndefined(obj[i])) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n    /**\n     * Validates a single operation. Called from `jsonpatch.validate`. Throws `JsonPatchError` in case of an error.\n     * @param {object} operation - operation object (patch)\n     * @param {number} index - index of operation in the sequence\n     * @param {object} [tree] - object where the operation is supposed to be applied\n     * @param {string} [existingPathFragment] - comes along with `tree`\n     */\n    function validator(operation, index, tree, existingPathFragment) {\n        if ((typeof operation === 'undefined' ? 'undefined' : _typeof(operation)) !== 'object' || operation === null || _isArray(operation)) {\n            throw new JsonPatchError('Operation is not an object', 'OPERATION_NOT_AN_OBJECT', index, operation, tree);\n        } else if (!objOps[operation.op]) {\n            throw new JsonPatchError('Operation `op` property is not one of operations defined in RFC-6902', 'OPERATION_OP_INVALID', index, operation, tree);\n        } else if (typeof operation.path !== 'string') {\n            throw new JsonPatchError('Operation `path` property is not a string', 'OPERATION_PATH_INVALID', index, operation, tree);\n        } else if ((operation.op === 'move' || operation.op === 'copy') && typeof operation.from !== 'string') {\n            throw new JsonPatchError('Operation `from` property is not present (applicable in `move` and `copy` operations)', 'OPERATION_FROM_REQUIRED', index, operation, tree);\n        } else if ((operation.op === 'add' || operation.op === 'replace' || operation.op === 'test') && operation.value === undefined) {\n            throw new JsonPatchError('Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)', 'OPERATION_VALUE_REQUIRED', index, operation, tree);\n        } else if ((operation.op === 'add' || operation.op === 'replace' || operation.op === 'test') && hasUndefined(operation.value)) {\n            throw new JsonPatchError('Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)', 'OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED', index, operation, tree);\n        } else if (tree) {\n            if (operation.op == \"add\") {\n                var pathLen = operation.path.split(\"/\").length;\n                var existingPathLen = existingPathFragment.split(\"/\").length;\n                if (pathLen !== existingPathLen + 1 && pathLen !== existingPathLen) {\n                    throw new JsonPatchError('Cannot perform an `add` operation at the desired path', 'OPERATION_PATH_CANNOT_ADD', index, operation, tree);\n                }\n            } else if (operation.op === 'replace' || operation.op === 'remove' || operation.op === '_get') {\n                if (operation.path !== existingPathFragment) {\n                    throw new JsonPatchError('Cannot perform the operation at a path that does not exist', 'OPERATION_PATH_UNRESOLVABLE', index, operation, tree);\n                }\n            } else if (operation.op === 'move' || operation.op === 'copy') {\n                var existingValue = { op: \"_get\", path: operation.from, value: undefined };\n                var error = jsonpatch.validate([existingValue], tree);\n                if (error && error.name === 'OPERATION_PATH_UNRESOLVABLE') {\n                    throw new JsonPatchError('Cannot perform the operation from a path that does not exist', 'OPERATION_FROM_UNRESOLVABLE', index, operation, tree);\n                }\n            }\n        }\n    }\n    jsonpatch.validator = validator;\n    /**\n     * Validates a sequence of operations. If `tree` parameter is provided, the sequence is additionally validated against the object tree.\n     * If error is encountered, returns a JsonPatchError object\n     * @param sequence\n     * @param tree\n     * @returns {JsonPatchError|undefined}\n     */\n    function validate(sequence, tree) {\n        try {\n            if (!_isArray(sequence)) {\n                throw new JsonPatchError('Patch sequence must be an array', 'SEQUENCE_NOT_AN_ARRAY');\n            }\n            if (tree) {\n                tree = JSON.parse(JSON.stringify(tree)); //clone tree so that we can safely try applying operations\n                apply.call(this, tree, sequence, true);\n            } else {\n                for (var i = 0; i < sequence.length; i++) {\n                    this.validator(sequence[i], i);\n                }\n            }\n        } catch (e) {\n            if (e instanceof JsonPatchError) {\n                return e;\n            } else {\n                throw e;\n            }\n        }\n    }\n    jsonpatch.validate = validate;\n})(jsonpatch || (jsonpatch = {}));\nif (true) {\n    exports.apply = jsonpatch.apply;\n    exports.observe = jsonpatch.observe;\n    exports.unobserve = jsonpatch.unobserve;\n    exports.generate = jsonpatch.generate;\n    exports.compare = jsonpatch.compare;\n    exports.validate = jsonpatch.validate;\n    exports.validator = jsonpatch.validator;\n    exports.JsonPatchError = jsonpatch.JsonPatchError;\n    exports.Error = jsonpatch.Error;\n}\n\n/***/ }),\n/* 326 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\n__webpack_require__(96);\n\n__webpack_require__(111);\n\n__webpack_require__(112);\n\n__webpack_require__(116);\n\n__webpack_require__(117);\n\n__webpack_require__(119);\n\n__webpack_require__(122);\n\n__webpack_require__(123);\n\n__webpack_require__(124);\n\n__webpack_require__(125);\n\n__webpack_require__(126);\n\n__webpack_require__(127);\n\n__webpack_require__(128);\n\n__webpack_require__(129);\n\n__webpack_require__(130);\n\n__webpack_require__(131);\n\n__webpack_require__(132);\n\n__webpack_require__(133);\n\n__webpack_require__(134);\n\n__webpack_require__(135);\n\n__webpack_require__(136);\n\n__webpack_require__(137);\n\n__webpack_require__(138);\n\n__webpack_require__(139);\n\n__webpack_require__(141);\n\n__webpack_require__(143);\n\n__webpack_require__(144);\n\n__webpack_require__(145);\n\n__webpack_require__(146);\n\n__webpack_require__(147);\n\n__webpack_require__(148);\n\n__webpack_require__(149);\n\n__webpack_require__(150);\n\n__webpack_require__(151);\n\n__webpack_require__(152);\n\n__webpack_require__(153);\n\n__webpack_require__(154);\n\n__webpack_require__(155);\n\n__webpack_require__(85);\n\n__webpack_require__(156);\n\n__webpack_require__(157);\n\n__webpack_require__(159);\n\n__webpack_require__(160);\n\n__webpack_require__(161);\n\n__webpack_require__(162);\n\n__webpack_require__(163);\n\n__webpack_require__(164);\n\n__webpack_require__(165);\n\n__webpack_require__(167);\n\n__webpack_require__(168);\n\n__webpack_require__(169);\n\n__webpack_require__(172);\n\n__webpack_require__(173);\n\n__webpack_require__(174);\n\n__webpack_require__(345);\n\n__webpack_require__(346);\n\n__webpack_require__(347);\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar _cellTypes = __webpack_require__(87);\n\nvar _core = __webpack_require__(88);\n\nvar _core2 = _interopRequireDefault(_core);\n\nvar _jquery = __webpack_require__(404);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _ghostTable = __webpack_require__(92);\n\nvar _ghostTable2 = _interopRequireDefault(_ghostTable);\n\nvar _array = __webpack_require__(1);\n\nvar arrayHelpers = _interopRequireWildcard(_array);\n\nvar _browser = __webpack_require__(27);\n\nvar browserHelpers = _interopRequireWildcard(_browser);\n\nvar _data = __webpack_require__(90);\n\nvar dataHelpers = _interopRequireWildcard(_data);\n\nvar _date = __webpack_require__(310);\n\nvar dateHelpers = _interopRequireWildcard(_date);\n\nvar _feature = __webpack_require__(40);\n\nvar featureHelpers = _interopRequireWildcard(_feature);\n\nvar _function = __webpack_require__(43);\n\nvar functionHelpers = _interopRequireWildcard(_function);\n\nvar _mixed = __webpack_require__(16);\n\nvar mixedHelpers = _interopRequireWildcard(_mixed);\n\nvar _number = __webpack_require__(5);\n\nvar numberHelpers = _interopRequireWildcard(_number);\n\nvar _object = __webpack_require__(2);\n\nvar objectHelpers = _interopRequireWildcard(_object);\n\nvar _setting = __webpack_require__(89);\n\nvar settingHelpers = _interopRequireWildcard(_setting);\n\nvar _string = __webpack_require__(36);\n\nvar stringHelpers = _interopRequireWildcard(_string);\n\nvar _unicode = __webpack_require__(21);\n\nvar unicodeHelpers = _interopRequireWildcard(_unicode);\n\nvar _element = __webpack_require__(0);\n\nvar domHelpers = _interopRequireWildcard(_element);\n\nvar _event = __webpack_require__(12);\n\nvar domEventHelpers = _interopRequireWildcard(_event);\n\nvar _index = __webpack_require__(405);\n\nvar plugins = _interopRequireWildcard(_index);\n\nvar _plugins = __webpack_require__(8);\n\nvar _defaultSettings = __webpack_require__(315);\n\nvar _defaultSettings2 = _interopRequireDefault(_defaultSettings);\n\nvar _rootInstance = __webpack_require__(314);\n\nvar _i18n = __webpack_require__(316);\n\nvar _constants = __webpack_require__(7);\n\nvar constants = _interopRequireWildcard(_constants);\n\nvar _dictionariesManager = __webpack_require__(71);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Handsontable(rootElement, userSettings) {\n  var instance = new _core2.default(rootElement, userSettings || {}, _rootInstance.rootInstanceSymbol);\n\n  instance.init();\n\n  return instance;\n}\n\n(0, _jquery2.default)(Handsontable);\n\nHandsontable.Core = _core2.default;\nHandsontable.DefaultSettings = _defaultSettings2.default;\nHandsontable.EventManager = _eventManager2.default;\nHandsontable._getListenersCounter = _eventManager.getListenersCounter; // For MemoryLeak tests\n\nHandsontable.buildDate = '10/04/2018 11:38:33';\nHandsontable.packageName = 'handsontable';\nHandsontable.version = '2.0.0';\n\nvar baseVersion = '';\n\nif (baseVersion) {\n  Handsontable.baseVersion = baseVersion;\n}\n\n// Export Hooks singleton\nHandsontable.hooks = _pluginHooks2.default.getSingleton();\n\n// TODO: Remove this exports after rewrite tests about this module\nHandsontable.__GhostTable = _ghostTable2.default;\n//\n\n// Export all helpers to the Handsontable object\nvar HELPERS = [arrayHelpers, browserHelpers, dataHelpers, dateHelpers, featureHelpers, functionHelpers, mixedHelpers, numberHelpers, objectHelpers, settingHelpers, stringHelpers, unicodeHelpers];\nvar DOM = [domHelpers, domEventHelpers];\n\nHandsontable.helper = {};\nHandsontable.dom = {};\n\n// Fill general helpers.\narrayHelpers.arrayEach(HELPERS, function (helper) {\n  arrayHelpers.arrayEach(Object.getOwnPropertyNames(helper), function (key) {\n    if (key.charAt(0) !== '_') {\n      Handsontable.helper[key] = helper[key];\n    }\n  });\n});\n\n// Fill DOM helpers.\narrayHelpers.arrayEach(DOM, function (helper) {\n  arrayHelpers.arrayEach(Object.getOwnPropertyNames(helper), function (key) {\n    if (key.charAt(0) !== '_') {\n      Handsontable.dom[key] = helper[key];\n    }\n  });\n});\n\n// Export cell types.\nHandsontable.cellTypes = {};\n\narrayHelpers.arrayEach((0, _cellTypes.getRegisteredCellTypeNames)(), function (cellTypeName) {\n  Handsontable.cellTypes[cellTypeName] = (0, _cellTypes.getCellType)(cellTypeName);\n});\n\nHandsontable.cellTypes.registerCellType = _cellTypes.registerCellType;\nHandsontable.cellTypes.getCellType = _cellTypes.getCellType;\n\n// Export all registered editors from the Handsontable.\nHandsontable.editors = {};\n\narrayHelpers.arrayEach((0, _editors.getRegisteredEditorNames)(), function (editorName) {\n  Handsontable.editors[stringHelpers.toUpperCaseFirst(editorName) + 'Editor'] = (0, _editors.getEditor)(editorName);\n});\n\nHandsontable.editors.registerEditor = _editors.registerEditor;\nHandsontable.editors.getEditor = _editors.getEditor;\n\n// Export all registered renderers from the Handsontable.\nHandsontable.renderers = {};\n\narrayHelpers.arrayEach((0, _renderers.getRegisteredRendererNames)(), function (rendererName) {\n  var renderer = (0, _renderers.getRenderer)(rendererName);\n\n  if (rendererName === 'base') {\n    Handsontable.renderers.cellDecorator = renderer;\n  }\n  Handsontable.renderers[stringHelpers.toUpperCaseFirst(rendererName) + 'Renderer'] = renderer;\n});\n\nHandsontable.renderers.registerRenderer = _renderers.registerRenderer;\nHandsontable.renderers.getRenderer = _renderers.getRenderer;\n\n// Export all registered validators from the Handsontable.\nHandsontable.validators = {};\n\narrayHelpers.arrayEach((0, _validators.getRegisteredValidatorNames)(), function (validatorName) {\n  Handsontable.validators[stringHelpers.toUpperCaseFirst(validatorName) + 'Validator'] = (0, _validators.getValidator)(validatorName);\n});\n\nHandsontable.validators.registerValidator = _validators.registerValidator;\nHandsontable.validators.getValidator = _validators.getValidator;\n\n// Export all registered plugins from the Handsontable.\nHandsontable.plugins = {};\n\narrayHelpers.arrayEach(Object.getOwnPropertyNames(plugins), function (pluginName) {\n  var plugin = plugins[pluginName];\n\n  if (pluginName === 'Base') {\n    Handsontable.plugins[pluginName + 'Plugin'] = plugin;\n  } else {\n    Handsontable.plugins[pluginName] = plugin;\n  }\n});\n\nHandsontable.plugins.registerPlugin = _plugins.registerPlugin;\n\nHandsontable.languages = {};\nHandsontable.languages.dictionaryKeys = constants;\nHandsontable.languages.getLanguageDictionary = _dictionariesManager.getLanguageDictionary;\nHandsontable.languages.getLanguagesDictionaries = _dictionariesManager.getLanguagesDictionaries;\nHandsontable.languages.registerLanguageDictionary = _dictionariesManager.registerLanguageDictionary;\n\n// Alias to `getTranslatedPhrase` function, for more information check it API.\nHandsontable.languages.getTranslatedPhrase = function () {\n  return _i18n.getTranslatedPhrase.apply(undefined, arguments);\n};\n\nexports.default = Handsontable;\n\n/***/ }),\n/* 327 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(20);\nvar anObject = __webpack_require__(18);\nvar getKeys = __webpack_require__(37);\n\nmodule.exports = __webpack_require__(22) ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var keys = getKeys(Properties);\n  var length = keys.length;\n  var i = 0;\n  var P;\n  while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n  return O;\n};\n\n\n/***/ }),\n/* 328 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar create = __webpack_require__(74);\nvar descriptor = __webpack_require__(50);\nvar setToStringTag = __webpack_require__(52);\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__webpack_require__(31)(IteratorPrototype, __webpack_require__(11)('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n\n/***/ }),\n/* 329 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nvar setPrototypeOf = __webpack_require__(110).set;\nmodule.exports = function (that, target, C) {\n  var S = target.constructor;\n  var P;\n  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n    setPrototypeOf(that, P);\n  } return that;\n};\n\n\n/***/ }),\n/* 330 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = __webpack_require__(331);\n\nmodule.exports = function (original, length) {\n  return new (speciesConstructor(original))(length);\n};\n\n\n/***/ }),\n/* 331 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nvar isArray = __webpack_require__(113);\nvar SPECIES = __webpack_require__(11)('species');\n\nmodule.exports = function (original) {\n  var C;\n  if (isArray(original)) {\n    C = original.constructor;\n    // cross-realm fallback\n    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n    if (isObject(C)) {\n      C = C[SPECIES];\n      if (C === null) C = undefined;\n    }\n  } return C === undefined ? Array : C;\n};\n\n\n/***/ }),\n/* 332 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = __webpack_require__(18);\nvar aFunction = __webpack_require__(62);\nvar SPECIES = __webpack_require__(11)('species');\nmodule.exports = function (O, D) {\n  var C = anObject(O).constructor;\n  var S;\n  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n\n\n/***/ }),\n/* 333 */\n/***/ (function(module, exports) {\n\n// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n  var un = that === undefined;\n  switch (args.length) {\n    case 0: return un ? fn()\n                      : fn.call(that);\n    case 1: return un ? fn(args[0])\n                      : fn.call(that, args[0]);\n    case 2: return un ? fn(args[0], args[1])\n                      : fn.call(that, args[0], args[1]);\n    case 3: return un ? fn(args[0], args[1], args[2])\n                      : fn.call(that, args[0], args[1], args[2]);\n    case 4: return un ? fn(args[0], args[1], args[2], args[3])\n                      : fn.call(that, args[0], args[1], args[2], args[3]);\n  } return fn.apply(that, args);\n};\n\n\n/***/ }),\n/* 334 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar macrotask = __webpack_require__(80).set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = __webpack_require__(44)(process) == 'process';\n\nmodule.exports = function () {\n  var head, last, notify;\n\n  var flush = function () {\n    var parent, fn;\n    if (isNode && (parent = process.domain)) parent.exit();\n    while (head) {\n      fn = head.fn;\n      head = head.next;\n      try {\n        fn();\n      } catch (e) {\n        if (head) notify();\n        else last = undefined;\n        throw e;\n      }\n    } last = undefined;\n    if (parent) parent.enter();\n  };\n\n  // Node.js\n  if (isNode) {\n    notify = function () {\n      process.nextTick(flush);\n    };\n  // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n  } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n    var toggle = true;\n    var node = document.createTextNode('');\n    new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n    notify = function () {\n      node.data = toggle = !toggle;\n    };\n  // environments with maybe non-completely correct, but existent Promise\n  } else if (Promise && Promise.resolve) {\n    var promise = Promise.resolve();\n    notify = function () {\n      promise.then(flush);\n    };\n  // for other environments - macrotask based on:\n  // - setImmediate\n  // - MessageChannel\n  // - window.postMessag\n  // - onreadystatechange\n  // - setTimeout\n  } else {\n    notify = function () {\n      // strange IE + webpack dev server bug - use .call(global)\n      macrotask.call(global, flush);\n    };\n  }\n\n  return function (fn) {\n    var task = { fn: fn, next: undefined };\n    if (last) last.next = task;\n    if (!head) {\n      head = task;\n      notify();\n    } last = task;\n  };\n};\n\n\n/***/ }),\n/* 335 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (exec) {\n  try {\n    return { e: false, v: exec() };\n  } catch (e) {\n    return { e: true, v: e };\n  }\n};\n\n\n/***/ }),\n/* 336 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(18);\nvar isObject = __webpack_require__(9);\nvar newPromiseCapability = __webpack_require__(118);\n\nmodule.exports = function (C, x) {\n  anObject(C);\n  if (isObject(x) && x.constructor === C) return x;\n  var promiseCapability = newPromiseCapability.f(C);\n  var resolve = promiseCapability.resolve;\n  resolve(x);\n  return promiseCapability.promise;\n};\n\n\n/***/ }),\n/* 337 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar core = __webpack_require__(45);\nvar LIBRARY = __webpack_require__(65);\nvar wksExt = __webpack_require__(120);\nvar defineProperty = __webpack_require__(20).f;\nmodule.exports = function (name) {\n  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n\n\n/***/ }),\n/* 338 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// all enumerable object keys, includes symbols\nvar getKeys = __webpack_require__(37);\nvar gOPS = __webpack_require__(69);\nvar pIE = __webpack_require__(53);\nmodule.exports = function (it) {\n  var result = getKeys(it);\n  var getSymbols = gOPS.f;\n  if (getSymbols) {\n    var symbols = getSymbols(it);\n    var isEnum = pIE.f;\n    var i = 0;\n    var key;\n    while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n  } return result;\n};\n\n\n/***/ }),\n/* 339 */\n/***/ (function(module, exports) {\n\n// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n  // eslint-disable-next-line no-self-compare\n  return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n\n\n/***/ }),\n/* 340 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(59);\nvar defined = __webpack_require__(38);\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n  return function (that, pos) {\n    var s = String(defined(that));\n    var i = toInteger(pos);\n    var l = s.length;\n    var a, b;\n    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n      ? TO_STRING ? s.charAt(i) : a\n      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n\n\n/***/ }),\n/* 341 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = __webpack_require__(18);\nmodule.exports = function () {\n  var that = anObject(this);\n  var result = '';\n  if (that.global) result += 'g';\n  if (that.ignoreCase) result += 'i';\n  if (that.multiline) result += 'm';\n  if (that.unicode) result += 'u';\n  if (that.sticky) result += 'y';\n  return result;\n};\n\n\n/***/ }),\n/* 342 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n\nvar toObject = __webpack_require__(33);\nvar toAbsoluteIndex = __webpack_require__(60);\nvar toLength = __webpack_require__(25);\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n  var O = toObject(this);\n  var len = toLength(O.length);\n  var to = toAbsoluteIndex(target, len);\n  var from = toAbsoluteIndex(start, len);\n  var end = arguments.length > 2 ? arguments[2] : undefined;\n  var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n  var inc = 1;\n  if (from < to && to < from + count) {\n    inc = -1;\n    from += count - 1;\n    to += count - 1;\n  }\n  while (count-- > 0) {\n    if (from in O) O[to] = O[from];\n    else delete O[to];\n    to += inc;\n    from += inc;\n  } return O;\n};\n\n\n/***/ }),\n/* 343 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n\nvar toObject = __webpack_require__(33);\nvar toAbsoluteIndex = __webpack_require__(60);\nvar toLength = __webpack_require__(25);\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n  var O = toObject(this);\n  var length = toLength(O.length);\n  var aLen = arguments.length;\n  var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n  var end = aLen > 2 ? arguments[2] : undefined;\n  var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n  while (endPos > index) O[index++] = value;\n  return O;\n};\n\n\n/***/ }),\n/* 344 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// all object keys, includes non-enumerable and symbols\nvar gOPN = __webpack_require__(81);\nvar gOPS = __webpack_require__(69);\nvar anObject = __webpack_require__(18);\nvar Reflect = __webpack_require__(14).Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n  var keys = gOPN.f(anObject(it));\n  var getSymbols = gOPS.f;\n  return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n\n\n/***/ }),\n/* 345 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 346 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 347 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 348 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * A overlay that renders ALL available rows & columns positioned on top of the original Walkontable instance and all other overlays.\n * Used for debugging purposes to see if the other overlays (that render only part of the rows & columns) are positioned correctly\n *\n * @class DebugOverlay\n */\nvar DebugOverlay = function (_Overlay) {\n  _inherits(DebugOverlay, _Overlay);\n\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function DebugOverlay(wotInstance) {\n    _classCallCheck(this, DebugOverlay);\n\n    var _this = _possibleConstructorReturn(this, (DebugOverlay.__proto__ || Object.getPrototypeOf(DebugOverlay)).call(this, wotInstance));\n\n    _this.clone = _this.makeClone(_base2.default.CLONE_DEBUG);\n    _this.clone.wtTable.holder.style.opacity = 0.4;\n    _this.clone.wtTable.holder.style.textShadow = '0 0 2px #ff0000';\n\n    (0, _element.addClass)(_this.clone.wtTable.holder.parentNode, 'wtDebugVisible');\n    return _this;\n  }\n\n  return DebugOverlay;\n}(_base2.default);\n\n_base2.default.registerOverlay(_base2.default.CLONE_DEBUG, DebugOverlay);\n\nexports.default = DebugOverlay;\n\n/***/ }),\n/* 349 */\n/***/ (function(module, exports) {\n\nmodule.exports = function(module) {\n\tif(!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif(!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n\n\n/***/ }),\n/* 350 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar map = {\n\t\"./af\": 180,\n\t\"./af.js\": 180,\n\t\"./ar\": 181,\n\t\"./ar-dz\": 182,\n\t\"./ar-dz.js\": 182,\n\t\"./ar-kw\": 183,\n\t\"./ar-kw.js\": 183,\n\t\"./ar-ly\": 184,\n\t\"./ar-ly.js\": 184,\n\t\"./ar-ma\": 185,\n\t\"./ar-ma.js\": 185,\n\t\"./ar-sa\": 186,\n\t\"./ar-sa.js\": 186,\n\t\"./ar-tn\": 187,\n\t\"./ar-tn.js\": 187,\n\t\"./ar.js\": 181,\n\t\"./az\": 188,\n\t\"./az.js\": 188,\n\t\"./be\": 189,\n\t\"./be.js\": 189,\n\t\"./bg\": 190,\n\t\"./bg.js\": 190,\n\t\"./bm\": 191,\n\t\"./bm.js\": 191,\n\t\"./bn\": 192,\n\t\"./bn.js\": 192,\n\t\"./bo\": 193,\n\t\"./bo.js\": 193,\n\t\"./br\": 194,\n\t\"./br.js\": 194,\n\t\"./bs\": 195,\n\t\"./bs.js\": 195,\n\t\"./ca\": 196,\n\t\"./ca.js\": 196,\n\t\"./cs\": 197,\n\t\"./cs.js\": 197,\n\t\"./cv\": 198,\n\t\"./cv.js\": 198,\n\t\"./cy\": 199,\n\t\"./cy.js\": 199,\n\t\"./da\": 200,\n\t\"./da.js\": 200,\n\t\"./de\": 201,\n\t\"./de-at\": 202,\n\t\"./de-at.js\": 202,\n\t\"./de-ch\": 203,\n\t\"./de-ch.js\": 203,\n\t\"./de.js\": 201,\n\t\"./dv\": 204,\n\t\"./dv.js\": 204,\n\t\"./el\": 205,\n\t\"./el.js\": 205,\n\t\"./en-au\": 206,\n\t\"./en-au.js\": 206,\n\t\"./en-ca\": 207,\n\t\"./en-ca.js\": 207,\n\t\"./en-gb\": 208,\n\t\"./en-gb.js\": 208,\n\t\"./en-ie\": 209,\n\t\"./en-ie.js\": 209,\n\t\"./en-nz\": 210,\n\t\"./en-nz.js\": 210,\n\t\"./eo\": 211,\n\t\"./eo.js\": 211,\n\t\"./es\": 212,\n\t\"./es-do\": 213,\n\t\"./es-do.js\": 213,\n\t\"./es-us\": 214,\n\t\"./es-us.js\": 214,\n\t\"./es.js\": 212,\n\t\"./et\": 215,\n\t\"./et.js\": 215,\n\t\"./eu\": 216,\n\t\"./eu.js\": 216,\n\t\"./fa\": 217,\n\t\"./fa.js\": 217,\n\t\"./fi\": 218,\n\t\"./fi.js\": 218,\n\t\"./fo\": 219,\n\t\"./fo.js\": 219,\n\t\"./fr\": 220,\n\t\"./fr-ca\": 221,\n\t\"./fr-ca.js\": 221,\n\t\"./fr-ch\": 222,\n\t\"./fr-ch.js\": 222,\n\t\"./fr.js\": 220,\n\t\"./fy\": 223,\n\t\"./fy.js\": 223,\n\t\"./gd\": 224,\n\t\"./gd.js\": 224,\n\t\"./gl\": 225,\n\t\"./gl.js\": 225,\n\t\"./gom-latn\": 226,\n\t\"./gom-latn.js\": 226,\n\t\"./gu\": 227,\n\t\"./gu.js\": 227,\n\t\"./he\": 228,\n\t\"./he.js\": 228,\n\t\"./hi\": 229,\n\t\"./hi.js\": 229,\n\t\"./hr\": 230,\n\t\"./hr.js\": 230,\n\t\"./hu\": 231,\n\t\"./hu.js\": 231,\n\t\"./hy-am\": 232,\n\t\"./hy-am.js\": 232,\n\t\"./id\": 233,\n\t\"./id.js\": 233,\n\t\"./is\": 234,\n\t\"./is.js\": 234,\n\t\"./it\": 235,\n\t\"./it.js\": 235,\n\t\"./ja\": 236,\n\t\"./ja.js\": 236,\n\t\"./jv\": 237,\n\t\"./jv.js\": 237,\n\t\"./ka\": 238,\n\t\"./ka.js\": 238,\n\t\"./kk\": 239,\n\t\"./kk.js\": 239,\n\t\"./km\": 240,\n\t\"./km.js\": 240,\n\t\"./kn\": 241,\n\t\"./kn.js\": 241,\n\t\"./ko\": 242,\n\t\"./ko.js\": 242,\n\t\"./ky\": 243,\n\t\"./ky.js\": 243,\n\t\"./lb\": 244,\n\t\"./lb.js\": 244,\n\t\"./lo\": 245,\n\t\"./lo.js\": 245,\n\t\"./lt\": 246,\n\t\"./lt.js\": 246,\n\t\"./lv\": 247,\n\t\"./lv.js\": 247,\n\t\"./me\": 248,\n\t\"./me.js\": 248,\n\t\"./mi\": 249,\n\t\"./mi.js\": 249,\n\t\"./mk\": 250,\n\t\"./mk.js\": 250,\n\t\"./ml\": 251,\n\t\"./ml.js\": 251,\n\t\"./mr\": 252,\n\t\"./mr.js\": 252,\n\t\"./ms\": 253,\n\t\"./ms-my\": 254,\n\t\"./ms-my.js\": 254,\n\t\"./ms.js\": 253,\n\t\"./mt\": 255,\n\t\"./mt.js\": 255,\n\t\"./my\": 256,\n\t\"./my.js\": 256,\n\t\"./nb\": 257,\n\t\"./nb.js\": 257,\n\t\"./ne\": 258,\n\t\"./ne.js\": 258,\n\t\"./nl\": 259,\n\t\"./nl-be\": 260,\n\t\"./nl-be.js\": 260,\n\t\"./nl.js\": 259,\n\t\"./nn\": 261,\n\t\"./nn.js\": 261,\n\t\"./pa-in\": 262,\n\t\"./pa-in.js\": 262,\n\t\"./pl\": 263,\n\t\"./pl.js\": 263,\n\t\"./pt\": 264,\n\t\"./pt-br\": 265,\n\t\"./pt-br.js\": 265,\n\t\"./pt.js\": 264,\n\t\"./ro\": 266,\n\t\"./ro.js\": 266,\n\t\"./ru\": 267,\n\t\"./ru.js\": 267,\n\t\"./sd\": 268,\n\t\"./sd.js\": 268,\n\t\"./se\": 269,\n\t\"./se.js\": 269,\n\t\"./si\": 270,\n\t\"./si.js\": 270,\n\t\"./sk\": 271,\n\t\"./sk.js\": 271,\n\t\"./sl\": 272,\n\t\"./sl.js\": 272,\n\t\"./sq\": 273,\n\t\"./sq.js\": 273,\n\t\"./sr\": 274,\n\t\"./sr-cyrl\": 275,\n\t\"./sr-cyrl.js\": 275,\n\t\"./sr.js\": 274,\n\t\"./ss\": 276,\n\t\"./ss.js\": 276,\n\t\"./sv\": 277,\n\t\"./sv.js\": 277,\n\t\"./sw\": 278,\n\t\"./sw.js\": 278,\n\t\"./ta\": 279,\n\t\"./ta.js\": 279,\n\t\"./te\": 280,\n\t\"./te.js\": 280,\n\t\"./tet\": 281,\n\t\"./tet.js\": 281,\n\t\"./th\": 282,\n\t\"./th.js\": 282,\n\t\"./tl-ph\": 283,\n\t\"./tl-ph.js\": 283,\n\t\"./tlh\": 284,\n\t\"./tlh.js\": 284,\n\t\"./tr\": 285,\n\t\"./tr.js\": 285,\n\t\"./tzl\": 286,\n\t\"./tzl.js\": 286,\n\t\"./tzm\": 287,\n\t\"./tzm-latn\": 288,\n\t\"./tzm-latn.js\": 288,\n\t\"./tzm.js\": 287,\n\t\"./uk\": 289,\n\t\"./uk.js\": 289,\n\t\"./ur\": 290,\n\t\"./ur.js\": 290,\n\t\"./uz\": 291,\n\t\"./uz-latn\": 292,\n\t\"./uz-latn.js\": 292,\n\t\"./uz.js\": 291,\n\t\"./vi\": 293,\n\t\"./vi.js\": 293,\n\t\"./x-pseudo\": 294,\n\t\"./x-pseudo.js\": 294,\n\t\"./yo\": 295,\n\t\"./yo.js\": 295,\n\t\"./zh-cn\": 296,\n\t\"./zh-cn.js\": 296,\n\t\"./zh-hk\": 297,\n\t\"./zh-hk.js\": 297,\n\t\"./zh-tw\": 298,\n\t\"./zh-tw.js\": 298\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 350;\n\n/***/ }),\n/* 351 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @class LeftOverlay\n */\nvar LeftOverlay = function (_Overlay) {\n  _inherits(LeftOverlay, _Overlay);\n\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function LeftOverlay(wotInstance) {\n    _classCallCheck(this, LeftOverlay);\n\n    var _this = _possibleConstructorReturn(this, (LeftOverlay.__proto__ || Object.getPrototypeOf(LeftOverlay)).call(this, wotInstance));\n\n    _this.clone = _this.makeClone(_base2.default.CLONE_LEFT);\n    return _this;\n  }\n\n  /**\n   * Checks if overlay should be fully rendered\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(LeftOverlay, [{\n    key: 'shouldBeRendered',\n    value: function shouldBeRendered() {\n      return !!(this.wot.getSetting('fixedColumnsLeft') || this.wot.getSetting('rowHeaders').length);\n    }\n\n    /**\n     * Updates the left overlay position\n     */\n\n  }, {\n    key: 'resetFixedPosition',\n    value: function resetFixedPosition() {\n      if (!this.needFullRender || !this.wot.wtTable.holder.parentNode) {\n        // removed from DOM\n        return;\n      }\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var headerPosition = 0;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (this.trimmingContainer === window && (!preventOverflow || preventOverflow !== 'horizontal')) {\n        var box = this.wot.wtTable.hider.getBoundingClientRect();\n        var left = Math.ceil(box.left);\n        var right = Math.ceil(box.right);\n        var finalLeft = void 0;\n        var finalTop = void 0;\n\n        finalTop = this.wot.wtTable.hider.style.top;\n        finalTop = finalTop === '' ? 0 : finalTop;\n\n        if (left < 0 && right - overlayRoot.offsetWidth > 0) {\n          finalLeft = -left;\n        } else {\n          finalLeft = 0;\n        }\n        headerPosition = finalLeft;\n        finalLeft += 'px';\n\n        (0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop);\n      } else {\n        headerPosition = this.getScrollPosition();\n        (0, _element.resetCssTransform)(overlayRoot);\n      }\n      this.adjustHeaderBordersPosition(headerPosition);\n\n      this.adjustElementsSize();\n    }\n\n    /**\n     * Sets the main overlay's horizontal scroll position\n     *\n     * @param {Number} pos\n     */\n\n  }, {\n    key: 'setScrollPosition',\n    value: function setScrollPosition(pos) {\n      if (this.mainTableScrollableElement === window) {\n        window.scrollTo(pos, (0, _element.getWindowScrollTop)());\n      } else {\n        this.mainTableScrollableElement.scrollLeft = pos;\n      }\n    }\n\n    /**\n     * Triggers onScroll hook callback\n     */\n\n  }, {\n    key: 'onScroll',\n    value: function onScroll() {\n      this.wot.getSetting('onScrollVertically');\n    }\n\n    /**\n     * Calculates total sum cells width\n     *\n     * @param {Number} from Column index which calculates started from\n     * @param {Number} to Column index where calculation is finished\n     * @returns {Number} Width sum\n     */\n\n  }, {\n    key: 'sumCellSizes',\n    value: function sumCellSizes(from, to) {\n      var sum = 0;\n      var defaultColumnWidth = this.wot.wtSettings.defaultColumnWidth;\n\n      while (from < to) {\n        sum += this.wot.wtTable.getStretchedColumnWidth(from) || defaultColumnWidth;\n        from++;\n      }\n\n      return sum;\n    }\n\n    /**\n     * Adjust overlay root element, childs and master table element sizes (width, height).\n     *\n     * @param {Boolean} [force=false]\n     */\n\n  }, {\n    key: 'adjustElementsSize',\n    value: function adjustElementsSize() {\n      var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      this.updateTrimmingContainer();\n\n      if (this.needFullRender || force) {\n        this.adjustRootElementSize();\n        this.adjustRootChildrenSize();\n\n        if (!force) {\n          this.areElementSizesAdjusted = true;\n        }\n      }\n    }\n\n    /**\n     * Adjust overlay root element size (width and height).\n     */\n\n  }, {\n    key: 'adjustRootElementSize',\n    value: function adjustRootElementSize() {\n      var masterHolder = this.wot.wtTable.holder;\n      var scrollbarHeight = masterHolder.clientHeight === masterHolder.offsetHeight ? 0 : (0, _element.getScrollbarWidth)();\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var overlayRootStyle = overlayRoot.style;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n      var tableWidth = void 0;\n\n      if (this.trimmingContainer !== window || preventOverflow === 'vertical') {\n        var height = this.wot.wtViewport.getWorkspaceHeight() - scrollbarHeight;\n\n        height = Math.min(height, (0, _element.innerHeight)(this.wot.wtTable.wtRootElement));\n\n        overlayRootStyle.height = height + 'px';\n      } else {\n        overlayRootStyle.height = '';\n      }\n\n      this.clone.wtTable.holder.style.height = overlayRootStyle.height;\n\n      tableWidth = (0, _element.outerWidth)(this.clone.wtTable.TABLE);\n      overlayRootStyle.width = (tableWidth === 0 ? tableWidth : tableWidth + 4) + 'px';\n    }\n\n    /**\n     * Adjust overlay root childs size\n     */\n\n  }, {\n    key: 'adjustRootChildrenSize',\n    value: function adjustRootChildrenSize() {\n      var scrollbarWidth = (0, _element.getScrollbarWidth)();\n\n      this.clone.wtTable.hider.style.height = this.hider.style.height;\n      this.clone.wtTable.holder.style.height = this.clone.wtTable.holder.parentNode.style.height;\n\n      if (scrollbarWidth === 0) {\n        scrollbarWidth = 30;\n      }\n      this.clone.wtTable.holder.style.width = parseInt(this.clone.wtTable.holder.parentNode.style.width, 10) + scrollbarWidth + 'px';\n    }\n\n    /**\n     * Adjust the overlay dimensions and position\n     */\n\n  }, {\n    key: 'applyToDOM',\n    value: function applyToDOM() {\n      var total = this.wot.getSetting('totalColumns');\n\n      if (!this.areElementSizesAdjusted) {\n        this.adjustElementsSize();\n      }\n      if (typeof this.wot.wtViewport.columnsRenderCalculator.startPosition === 'number') {\n        this.spreader.style.left = this.wot.wtViewport.columnsRenderCalculator.startPosition + 'px';\n      } else if (total === 0) {\n        this.spreader.style.left = '0';\n      } else {\n        throw new Error('Incorrect value of the columnsRenderCalculator');\n      }\n      this.spreader.style.right = '';\n\n      if (this.needFullRender) {\n        this.syncOverlayOffset();\n      }\n    }\n\n    /**\n     * Synchronize calculated top position to an element\n     */\n\n  }, {\n    key: 'syncOverlayOffset',\n    value: function syncOverlayOffset() {\n      if (typeof this.wot.wtViewport.rowsRenderCalculator.startPosition === 'number') {\n        this.clone.wtTable.spreader.style.top = this.wot.wtViewport.rowsRenderCalculator.startPosition + 'px';\n      } else {\n        this.clone.wtTable.spreader.style.top = '';\n      }\n    }\n\n    /**\n     * Scrolls horizontally to a column at the left edge of the viewport\n     *\n     * @param sourceCol {Number} Column index which you want to scroll to\n     * @param [beyondRendered=false] {Boolean} if `true`, scrolls according to the bottom edge (top edge is by default)\n     */\n\n  }, {\n    key: 'scrollTo',\n    value: function scrollTo(sourceCol, beyondRendered) {\n      var newX = this.getTableParentOffset();\n      var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot;\n      var mainHolder = sourceInstance.wtTable.holder;\n      var scrollbarCompensation = 0;\n\n      if (beyondRendered && mainHolder.offsetWidth !== mainHolder.clientWidth) {\n        scrollbarCompensation = (0, _element.getScrollbarWidth)();\n      }\n      if (beyondRendered) {\n        newX += this.sumCellSizes(0, sourceCol + 1);\n        newX -= this.wot.wtViewport.getViewportWidth();\n      } else {\n        newX += this.sumCellSizes(this.wot.getSetting('fixedColumnsLeft'), sourceCol);\n      }\n      newX += scrollbarCompensation;\n\n      this.setScrollPosition(newX);\n    }\n\n    /**\n     * Gets table parent left position\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getTableParentOffset',\n    value: function getTableParentOffset() {\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n      var offset = 0;\n\n      if (!preventOverflow && this.trimmingContainer === window) {\n        offset = this.wot.wtTable.holderOffset.left;\n      }\n\n      return offset;\n    }\n\n    /**\n     * Gets the main overlay's horizontal scroll position\n     *\n     * @returns {Number} Main table's vertical scroll position\n     */\n\n  }, {\n    key: 'getScrollPosition',\n    value: function getScrollPosition() {\n      return (0, _element.getScrollLeft)(this.mainTableScrollableElement);\n    }\n\n    /**\n     * Adds css classes to hide the header border's header (cell-selection border hiding issue)\n     *\n     * @param {Number} position Header X position if trimming container is window or scroll top if not\n     */\n\n  }, {\n    key: 'adjustHeaderBordersPosition',\n    value: function adjustHeaderBordersPosition(position) {\n      var masterParent = this.wot.wtTable.holder.parentNode;\n      var rowHeaders = this.wot.getSetting('rowHeaders');\n      var fixedColumnsLeft = this.wot.getSetting('fixedColumnsLeft');\n      var totalRows = this.wot.getSetting('totalRows');\n\n      if (totalRows) {\n        (0, _element.removeClass)(masterParent, 'emptyRows');\n      } else {\n        (0, _element.addClass)(masterParent, 'emptyRows');\n      }\n\n      if (fixedColumnsLeft && !rowHeaders.length) {\n        (0, _element.addClass)(masterParent, 'innerBorderLeft');\n      } else if (!fixedColumnsLeft && rowHeaders.length) {\n        var previousState = (0, _element.hasClass)(masterParent, 'innerBorderLeft');\n\n        if (position) {\n          (0, _element.addClass)(masterParent, 'innerBorderLeft');\n        } else {\n          (0, _element.removeClass)(masterParent, 'innerBorderLeft');\n        }\n        if (!previousState && position || previousState && !position) {\n          this.wot.wtOverlays.adjustElementsSize();\n        }\n      }\n    }\n  }]);\n\n  return LeftOverlay;\n}(_base2.default);\n\n_base2.default.registerOverlay(_base2.default.CLONE_LEFT, LeftOverlay);\n\nexports.default = LeftOverlay;\n\n/***/ }),\n/* 352 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @class TopOverlay\n */\nvar TopOverlay = function (_Overlay) {\n  _inherits(TopOverlay, _Overlay);\n\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function TopOverlay(wotInstance) {\n    _classCallCheck(this, TopOverlay);\n\n    var _this = _possibleConstructorReturn(this, (TopOverlay.__proto__ || Object.getPrototypeOf(TopOverlay)).call(this, wotInstance));\n\n    _this.clone = _this.makeClone(_base2.default.CLONE_TOP);\n    return _this;\n  }\n\n  /**\n   * Checks if overlay should be fully rendered\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(TopOverlay, [{\n    key: 'shouldBeRendered',\n    value: function shouldBeRendered() {\n      return !!(this.wot.getSetting('fixedRowsTop') || this.wot.getSetting('columnHeaders').length);\n    }\n\n    /**\n     * Updates the top overlay position\n     */\n\n  }, {\n    key: 'resetFixedPosition',\n    value: function resetFixedPosition() {\n      if (!this.needFullRender || !this.wot.wtTable.holder.parentNode) {\n        // removed from DOM\n        return;\n      }\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var headerPosition = 0;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (this.trimmingContainer === window && (!preventOverflow || preventOverflow !== 'vertical')) {\n        var box = this.wot.wtTable.hider.getBoundingClientRect();\n        var top = Math.ceil(box.top);\n        var bottom = Math.ceil(box.bottom);\n        var finalLeft = void 0;\n        var finalTop = void 0;\n\n        finalLeft = this.wot.wtTable.hider.style.left;\n        finalLeft = finalLeft === '' ? 0 : finalLeft;\n\n        if (top < 0 && bottom - overlayRoot.offsetHeight > 0) {\n          finalTop = -top;\n        } else {\n          finalTop = 0;\n        }\n        headerPosition = finalTop;\n        finalTop += 'px';\n\n        (0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop);\n      } else {\n        headerPosition = this.getScrollPosition();\n        (0, _element.resetCssTransform)(overlayRoot);\n      }\n\n      this.adjustHeaderBordersPosition(headerPosition);\n\n      this.adjustElementsSize();\n    }\n\n    /**\n     * Sets the main overlay's vertical scroll position\n     *\n     * @param {Number} pos\n     */\n\n  }, {\n    key: 'setScrollPosition',\n    value: function setScrollPosition(pos) {\n      if (this.mainTableScrollableElement === window) {\n        window.scrollTo((0, _element.getWindowScrollLeft)(), pos);\n      } else {\n        this.mainTableScrollableElement.scrollTop = pos;\n      }\n    }\n\n    /**\n     * Triggers onScroll hook callback\n     */\n\n  }, {\n    key: 'onScroll',\n    value: function onScroll() {\n      this.wot.getSetting('onScrollHorizontally');\n    }\n\n    /**\n     * Calculates total sum cells height\n     *\n     * @param {Number} from Row index which calculates started from\n     * @param {Number} to Row index where calculation is finished\n     * @returns {Number} Height sum\n     */\n\n  }, {\n    key: 'sumCellSizes',\n    value: function sumCellSizes(from, to) {\n      var sum = 0;\n      var defaultRowHeight = this.wot.wtSettings.settings.defaultRowHeight;\n\n      while (from < to) {\n        var height = this.wot.wtTable.getRowHeight(from);\n\n        sum += height === void 0 ? defaultRowHeight : height;\n        from++;\n      }\n\n      return sum;\n    }\n\n    /**\n     * Adjust overlay root element, childs and master table element sizes (width, height).\n     *\n     * @param {Boolean} [force=false]\n     */\n\n  }, {\n    key: 'adjustElementsSize',\n    value: function adjustElementsSize() {\n      var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      this.updateTrimmingContainer();\n\n      if (this.needFullRender || force) {\n        this.adjustRootElementSize();\n        this.adjustRootChildrenSize();\n\n        if (!force) {\n          this.areElementSizesAdjusted = true;\n        }\n      }\n    }\n\n    /**\n     * Adjust overlay root element size (width and height).\n     */\n\n  }, {\n    key: 'adjustRootElementSize',\n    value: function adjustRootElementSize() {\n      var masterHolder = this.wot.wtTable.holder;\n      var scrollbarWidth = masterHolder.clientWidth === masterHolder.offsetWidth ? 0 : (0, _element.getScrollbarWidth)();\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var overlayRootStyle = overlayRoot.style;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n      var tableHeight = void 0;\n\n      if (this.trimmingContainer !== window || preventOverflow === 'horizontal') {\n        var width = this.wot.wtViewport.getWorkspaceWidth() - scrollbarWidth;\n\n        width = Math.min(width, (0, _element.innerWidth)(this.wot.wtTable.wtRootElement));\n\n        overlayRootStyle.width = width + 'px';\n      } else {\n        overlayRootStyle.width = '';\n      }\n\n      this.clone.wtTable.holder.style.width = overlayRootStyle.width;\n\n      tableHeight = (0, _element.outerHeight)(this.clone.wtTable.TABLE);\n      overlayRootStyle.height = (tableHeight === 0 ? tableHeight : tableHeight + 4) + 'px';\n    }\n\n    /**\n     * Adjust overlay root childs size\n     */\n\n  }, {\n    key: 'adjustRootChildrenSize',\n    value: function adjustRootChildrenSize() {\n      var scrollbarWidth = (0, _element.getScrollbarWidth)();\n\n      this.clone.wtTable.hider.style.width = this.hider.style.width;\n      this.clone.wtTable.holder.style.width = this.clone.wtTable.holder.parentNode.style.width;\n\n      if (scrollbarWidth === 0) {\n        scrollbarWidth = 30;\n      }\n      this.clone.wtTable.holder.style.height = parseInt(this.clone.wtTable.holder.parentNode.style.height, 10) + scrollbarWidth + 'px';\n    }\n\n    /**\n     * Adjust the overlay dimensions and position\n     */\n\n  }, {\n    key: 'applyToDOM',\n    value: function applyToDOM() {\n      var total = this.wot.getSetting('totalRows');\n\n      if (!this.areElementSizesAdjusted) {\n        this.adjustElementsSize();\n      }\n      if (typeof this.wot.wtViewport.rowsRenderCalculator.startPosition === 'number') {\n        this.spreader.style.top = this.wot.wtViewport.rowsRenderCalculator.startPosition + 'px';\n      } else if (total === 0) {\n        // can happen if there are 0 rows\n        this.spreader.style.top = '0';\n      } else {\n        throw new Error('Incorrect value of the rowsRenderCalculator');\n      }\n      this.spreader.style.bottom = '';\n\n      if (this.needFullRender) {\n        this.syncOverlayOffset();\n      }\n    }\n\n    /**\n     * Synchronize calculated left position to an element\n     */\n\n  }, {\n    key: 'syncOverlayOffset',\n    value: function syncOverlayOffset() {\n      if (typeof this.wot.wtViewport.columnsRenderCalculator.startPosition === 'number') {\n        this.clone.wtTable.spreader.style.left = this.wot.wtViewport.columnsRenderCalculator.startPosition + 'px';\n      } else {\n        this.clone.wtTable.spreader.style.left = '';\n      }\n    }\n\n    /**\n     * Scrolls vertically to a row\n     *\n     * @param sourceRow {Number} Row index which you want to scroll to\n     * @param [bottomEdge=false] {Boolean} if `true`, scrolls according to the bottom edge (top edge is by default)\n     */\n\n  }, {\n    key: 'scrollTo',\n    value: function scrollTo(sourceRow, bottomEdge) {\n      var newY = this.getTableParentOffset();\n      var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot;\n      var mainHolder = sourceInstance.wtTable.holder;\n      var scrollbarCompensation = 0;\n\n      if (bottomEdge && mainHolder.offsetHeight !== mainHolder.clientHeight) {\n        scrollbarCompensation = (0, _element.getScrollbarWidth)();\n      }\n\n      if (bottomEdge) {\n        var fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');\n        var fixedRowsTop = this.wot.getSetting('fixedRowsTop');\n        var totalRows = this.wot.getSetting('totalRows');\n\n        newY += this.sumCellSizes(0, sourceRow + 1);\n        newY -= this.wot.wtViewport.getViewportHeight() - this.sumCellSizes(totalRows - fixedRowsBottom, totalRows);\n        // Fix 1 pixel offset when cell is selected\n        newY += 1;\n      } else {\n        newY += this.sumCellSizes(this.wot.getSetting('fixedRowsTop'), sourceRow);\n      }\n      newY += scrollbarCompensation;\n\n      this.setScrollPosition(newY);\n    }\n\n    /**\n     * Gets table parent top position\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getTableParentOffset',\n    value: function getTableParentOffset() {\n      if (this.mainTableScrollableElement === window) {\n        return this.wot.wtTable.holderOffset.top;\n      }\n      return 0;\n    }\n\n    /**\n     * Gets the main overlay's vertical scroll position\n     *\n     * @returns {Number} Main table's vertical scroll position\n     */\n\n  }, {\n    key: 'getScrollPosition',\n    value: function getScrollPosition() {\n      return (0, _element.getScrollTop)(this.mainTableScrollableElement);\n    }\n\n    /**\n     * Redraw borders of selection\n     *\n     * @param {WalkontableSelection} selection Selection for redraw\n     */\n\n  }, {\n    key: 'redrawSelectionBorders',\n    value: function redrawSelectionBorders(selection) {\n      if (selection && selection.cellRange) {\n        var border = selection.getBorder(this.wot);\n        var corners = selection.getCorners();\n\n        border.disappear();\n        border.appear(corners);\n      }\n    }\n\n    /**\n     * Redrawing borders of all selections\n     */\n\n  }, {\n    key: 'redrawAllSelectionsBorders',\n    value: function redrawAllSelectionsBorders() {\n      var _this2 = this;\n\n      var selections = this.wot.selections;\n\n      this.redrawSelectionBorders(selections.getCell());\n\n      (0, _array.arrayEach)(selections.getAreas(), function (area) {\n        _this2.redrawSelectionBorders(area);\n      });\n      this.redrawSelectionBorders(selections.getFill());\n\n      this.wot.wtTable.wot.wtOverlays.leftOverlay.refresh();\n    }\n\n    /**\n     * Adds css classes to hide the header border's header (cell-selection border hiding issue)\n     *\n     * @param {Number} position Header Y position if trimming container is window or scroll top if not\n     */\n\n  }, {\n    key: 'adjustHeaderBordersPosition',\n    value: function adjustHeaderBordersPosition(position) {\n      var masterParent = this.wot.wtTable.holder.parentNode;\n      var totalColumns = this.wot.getSetting('totalColumns');\n\n      if (totalColumns) {\n        (0, _element.removeClass)(masterParent, 'emptyColumns');\n      } else {\n        (0, _element.addClass)(masterParent, 'emptyColumns');\n      }\n\n      if (this.wot.getSetting('fixedRowsTop') === 0 && this.wot.getSetting('columnHeaders').length > 0) {\n        var previousState = (0, _element.hasClass)(masterParent, 'innerBorderTop');\n\n        if (position || this.wot.getSetting('totalRows') === 0) {\n          (0, _element.addClass)(masterParent, 'innerBorderTop');\n        } else {\n          (0, _element.removeClass)(masterParent, 'innerBorderTop');\n        }\n\n        if (!previousState && position || previousState && !position) {\n          this.wot.wtOverlays.adjustElementsSize();\n\n          // cell borders should be positioned once again,\n          // because we added / removed 1px border from table header\n          this.redrawAllSelectionsBorders();\n        }\n      }\n\n      // nasty workaround for double border in the header, TODO: find a pure-css solution\n      if (this.wot.getSetting('rowHeaders').length === 0) {\n        var secondHeaderCell = this.clone.wtTable.THEAD.querySelectorAll('th:nth-of-type(2)');\n\n        if (secondHeaderCell) {\n          for (var i = 0; i < secondHeaderCell.length; i++) {\n            secondHeaderCell[i].style['border-left-width'] = 0;\n          }\n        }\n      }\n    }\n  }]);\n\n  return TopOverlay;\n}(_base2.default);\n\n_base2.default.registerOverlay(_base2.default.CLONE_TOP, TopOverlay);\n\nexports.default = TopOverlay;\n\n/***/ }),\n/* 353 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @class TopLeftCornerOverlay\n */\nvar TopLeftCornerOverlay = function (_Overlay) {\n  _inherits(TopLeftCornerOverlay, _Overlay);\n\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function TopLeftCornerOverlay(wotInstance) {\n    _classCallCheck(this, TopLeftCornerOverlay);\n\n    var _this = _possibleConstructorReturn(this, (TopLeftCornerOverlay.__proto__ || Object.getPrototypeOf(TopLeftCornerOverlay)).call(this, wotInstance));\n\n    _this.clone = _this.makeClone(_base2.default.CLONE_TOP_LEFT_CORNER);\n    return _this;\n  }\n\n  /**\n   * Checks if overlay should be fully rendered\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(TopLeftCornerOverlay, [{\n    key: 'shouldBeRendered',\n    value: function shouldBeRendered() {\n      return !!((this.wot.getSetting('fixedRowsTop') || this.wot.getSetting('columnHeaders').length) && (this.wot.getSetting('fixedColumnsLeft') || this.wot.getSetting('rowHeaders').length));\n    }\n\n    /**\n     * Updates the corner overlay position\n     */\n\n  }, {\n    key: 'resetFixedPosition',\n    value: function resetFixedPosition() {\n      this.updateTrimmingContainer();\n\n      if (!this.wot.wtTable.holder.parentNode) {\n        // removed from DOM\n        return;\n      }\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var tableHeight = (0, _element.outerHeight)(this.clone.wtTable.TABLE);\n      var tableWidth = (0, _element.outerWidth)(this.clone.wtTable.TABLE);\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (this.trimmingContainer === window) {\n        var box = this.wot.wtTable.hider.getBoundingClientRect();\n        var top = Math.ceil(box.top);\n        var left = Math.ceil(box.left);\n        var bottom = Math.ceil(box.bottom);\n        var right = Math.ceil(box.right);\n        var finalLeft = '0';\n        var finalTop = '0';\n\n        if (!preventOverflow || preventOverflow === 'vertical') {\n          if (left < 0 && right - overlayRoot.offsetWidth > 0) {\n            finalLeft = -left + 'px';\n          }\n        }\n\n        if (!preventOverflow || preventOverflow === 'horizontal') {\n          if (top < 0 && bottom - overlayRoot.offsetHeight > 0) {\n            finalTop = -top + 'px';\n          }\n        }\n        (0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop);\n      } else {\n        (0, _element.resetCssTransform)(overlayRoot);\n      }\n      overlayRoot.style.height = (tableHeight === 0 ? tableHeight : tableHeight + 4) + 'px';\n      overlayRoot.style.width = (tableWidth === 0 ? tableWidth : tableWidth + 4) + 'px';\n    }\n  }]);\n\n  return TopLeftCornerOverlay;\n}(_base2.default);\n\n_base2.default.registerOverlay(_base2.default.CLONE_TOP_LEFT_CORNER, TopLeftCornerOverlay);\n\nexports.default = TopLeftCornerOverlay;\n\n/***/ }),\n/* 354 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _border = __webpack_require__(306);\n\nvar _border2 = _interopRequireDefault(_border);\n\nvar _coords = __webpack_require__(55);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nvar _range = __webpack_require__(86);\n\nvar _range2 = _interopRequireDefault(_range);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Selection\n */\nvar Selection = function () {\n  /**\n   * @param {Object} settings\n   * @param {CellRange} cellRange\n   */\n  function Selection(settings, cellRange) {\n    _classCallCheck(this, Selection);\n\n    this.settings = settings;\n    this.cellRange = cellRange || null;\n    this.instanceBorders = {};\n    this.classNames = [this.settings.className];\n    this.classNameGenerator = this.linearClassNameGenerator(this.settings.className, this.settings.layerLevel);\n  }\n\n  /**\n   * Each Walkontable clone requires it's own border for every selection. This method creates and returns selection\n   * borders per instance\n   *\n   * @param {Walkontable} wotInstance\n   * @returns {Border}\n   */\n\n\n  _createClass(Selection, [{\n    key: 'getBorder',\n    value: function getBorder(wotInstance) {\n      if (!this.instanceBorders[wotInstance.guid]) {\n        this.instanceBorders[wotInstance.guid] = new _border2.default(wotInstance, this.settings);\n      }\n\n      return this.instanceBorders[wotInstance.guid];\n    }\n\n    /**\n     * Checks if selection is empty\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isEmpty',\n    value: function isEmpty() {\n      return this.cellRange === null;\n    }\n\n    /**\n     * Adds a cell coords to the selection\n     *\n     * @param {CellCoords} coords\n     */\n\n  }, {\n    key: 'add',\n    value: function add(coords) {\n      if (this.isEmpty()) {\n        this.cellRange = new _range2.default(coords);\n      } else {\n        this.cellRange.expand(coords);\n      }\n\n      return this;\n    }\n\n    /**\n     * If selection range from or to property equals oldCoords, replace it with newCoords. Return boolean\n     * information about success\n     *\n     * @param {CellCoords} oldCoords\n     * @param {CellCoords} newCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'replace',\n    value: function replace(oldCoords, newCoords) {\n      if (!this.isEmpty()) {\n        if (this.cellRange.from.isEqual(oldCoords)) {\n          this.cellRange.from = newCoords;\n\n          return true;\n        }\n        if (this.cellRange.to.isEqual(oldCoords)) {\n          this.cellRange.to = newCoords;\n\n          return true;\n        }\n      }\n\n      return false;\n    }\n\n    /**\n     * Clears selection\n     *\n     * @returns {Selection}\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.cellRange = null;\n\n      return this;\n    }\n\n    /**\n     * Returns the top left (TL) and bottom right (BR) selection coordinates\n     *\n     * @returns {Array} Returns array of coordinates for example `[1, 1, 5, 5]`\n     */\n\n  }, {\n    key: 'getCorners',\n    value: function getCorners() {\n      var topLeft = this.cellRange.getTopLeftCorner();\n      var bottomRight = this.cellRange.getBottomRightCorner();\n\n      return [topLeft.row, topLeft.col, bottomRight.row, bottomRight.col];\n    }\n\n    /**\n     * Adds class name to cell element at given coords\n     *\n     * @param {Walkontable} wotInstance Walkontable instance\n     * @param {Number} sourceRow Cell row coord\n     * @param {Number} sourceColumn Cell column coord\n     * @param {String} className Class name\n     * @param {Boolean} [markIntersections=false] If `true`, linear className generator will be used to add CSS classes\n     *                                            in a continuous way.\n     * @returns {Selection}\n     */\n\n  }, {\n    key: 'addClassAtCoords',\n    value: function addClassAtCoords(wotInstance, sourceRow, sourceColumn, className) {\n      var markIntersections = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n      var TD = wotInstance.wtTable.getCell(new _coords2.default(sourceRow, sourceColumn));\n\n      if ((typeof TD === 'undefined' ? 'undefined' : _typeof(TD)) === 'object') {\n        if (markIntersections) {\n          className = this.classNameGenerator(TD);\n\n          if (!this.classNames.includes(className)) {\n            this.classNames.push(className);\n          }\n        }\n\n        (0, _element.addClass)(TD, className);\n      }\n\n      return this;\n    }\n\n    /**\n     * Generate helper for calculating classNames based on previously added base className.\n     * The generated className is always generated as a continuation of the previous className. For example, when\n     * the currently checked element has 'area-2' className the generated new className will be 'area-3'. When\n     * the element doesn't have any classNames than the base className will be returned ('area');\n     *\n     * @param {String} baseClassName Base className to be used.\n     * @param {Number} layerLevelOwner Layer level which the instance of the Selection belongs to.\n     * @return {Function}\n     */\n\n  }, {\n    key: 'linearClassNameGenerator',\n    value: function linearClassNameGenerator(baseClassName, layerLevelOwner) {\n      // TODO: Make this recursive function Proper Tail Calls (TCO/PTC) friendly.\n      return function calcClassName(element) {\n        var previousIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;\n\n        if (layerLevelOwner === 0 || previousIndex === 0) {\n          return baseClassName;\n        }\n\n        var index = previousIndex >= 0 ? previousIndex : layerLevelOwner;\n        var className = baseClassName;\n\n        index -= 1;\n\n        var previousClassName = index === 0 ? baseClassName : baseClassName + '-' + index;\n\n        if ((0, _element.hasClass)(element, previousClassName)) {\n          var currentLayer = index + 1;\n\n          className = baseClassName + '-' + currentLayer;\n        } else {\n          className = calcClassName(element, index);\n        }\n\n        return className;\n      };\n    }\n\n    /**\n     * @param wotInstance\n     */\n\n  }, {\n    key: 'draw',\n    value: function draw(wotInstance) {\n      if (this.isEmpty()) {\n        if (this.settings.border) {\n          this.getBorder(wotInstance).disappear();\n        }\n\n        return;\n      }\n\n      var renderedRows = wotInstance.wtTable.getRenderedRowsCount();\n      var renderedColumns = wotInstance.wtTable.getRenderedColumnsCount();\n      var corners = this.getCorners();\n\n      var _corners = _slicedToArray(corners, 4),\n          topRow = _corners[0],\n          topColumn = _corners[1],\n          bottomRow = _corners[2],\n          bottomColumn = _corners[3];\n\n      for (var column = 0; column < renderedColumns; column += 1) {\n        var sourceCol = wotInstance.wtTable.columnFilter.renderedToSource(column);\n\n        if (sourceCol >= topColumn && sourceCol <= bottomColumn) {\n          var TH = wotInstance.wtTable.getColumnHeader(sourceCol);\n\n          if (TH) {\n            var newClasses = [];\n\n            if (this.settings.highlightHeaderClassName) {\n              newClasses.push(this.settings.highlightHeaderClassName);\n            }\n\n            if (this.settings.highlightColumnClassName) {\n              newClasses.push(this.settings.highlightColumnClassName);\n            }\n\n            (0, _element.addClass)(TH, newClasses);\n          }\n        }\n      }\n\n      for (var row = 0; row < renderedRows; row += 1) {\n        var sourceRow = wotInstance.wtTable.rowFilter.renderedToSource(row);\n\n        if (sourceRow >= topRow && sourceRow <= bottomRow) {\n          var _TH = wotInstance.wtTable.getRowHeader(sourceRow);\n\n          if (_TH) {\n            var _newClasses = [];\n\n            if (this.settings.highlightHeaderClassName) {\n              _newClasses.push(this.settings.highlightHeaderClassName);\n            }\n\n            if (this.settings.highlightRowClassName) {\n              _newClasses.push(this.settings.highlightRowClassName);\n            }\n\n            (0, _element.addClass)(_TH, _newClasses);\n          }\n        }\n\n        for (var _column = 0; _column < renderedColumns; _column += 1) {\n          var _sourceCol = wotInstance.wtTable.columnFilter.renderedToSource(_column);\n\n          if (sourceRow >= topRow && sourceRow <= bottomRow && _sourceCol >= topColumn && _sourceCol <= bottomColumn) {\n            // selected cell\n            if (this.settings.className) {\n              this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.className, this.settings.markIntersections);\n            }\n          } else if (sourceRow >= topRow && sourceRow <= bottomRow) {\n            // selection is in this row\n            if (this.settings.highlightRowClassName) {\n              this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.highlightRowClassName);\n            }\n          } else if (_sourceCol >= topColumn && _sourceCol <= bottomColumn) {\n            // selection is in this column\n            if (this.settings.highlightColumnClassName) {\n              this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.highlightColumnClassName);\n            }\n          }\n\n          var additionalSelectionClass = wotInstance.getSetting('onAfterDrawSelection', sourceRow, _sourceCol, corners, this.settings.layerLevel);\n\n          if (typeof additionalSelectionClass === 'string') {\n            this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, additionalSelectionClass);\n          }\n        }\n      }\n\n      wotInstance.getSetting('onBeforeDrawBorders', corners, this.settings.className);\n\n      if (this.settings.border) {\n        // warning! border.appear modifies corners!\n        this.getBorder(wotInstance).appear(corners);\n      }\n    }\n  }]);\n\n  return Selection;\n}();\n\nexports.default = Selection;\n\n/***/ }),\n/* 355 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * autoResize - resizes a DOM element to the width and height of another DOM element\n *\n * Copyright 2014, Marcin Warpechowski\n * Licensed under the MIT license\n */\n\nfunction autoResize() {\n  var defaults = {\n    minHeight: 200,\n    maxHeight: 300,\n    minWidth: 100,\n    maxWidth: 300\n  },\n      el,\n      body = document.body,\n      text = document.createTextNode(''),\n      span = document.createElement('SPAN'),\n      observe = function observe(element, event, handler) {\n    if (element.attachEvent) {\n      element.attachEvent('on' + event, handler);\n    } else {\n      element.addEventListener(event, handler, false);\n    }\n  },\n      _unObserve = function _unObserve(element, event, handler) {\n    if (element.removeEventListener) {\n      element.removeEventListener(event, handler, false);\n    } else {\n      element.detachEvent('on' + event, handler);\n    }\n  },\n      resize = function resize(newChar) {\n    var width, scrollHeight;\n\n    if (!newChar) {\n      newChar = \"\";\n    } else if (!/^[a-zA-Z \\.,\\\\\\/\\|0-9]$/.test(newChar)) {\n      newChar = \".\";\n    }\n\n    if (text.textContent !== void 0) {\n      text.textContent = el.value + newChar;\n    } else {\n      text.data = el.value + newChar; //IE8\n    }\n    span.style.fontSize = getComputedStyle(el).fontSize;\n    span.style.fontFamily = getComputedStyle(el).fontFamily;\n    span.style.whiteSpace = \"pre\";\n\n    body.appendChild(span);\n    width = span.clientWidth + 2;\n    body.removeChild(span);\n\n    el.style.height = defaults.minHeight + 'px';\n\n    if (defaults.minWidth > width) {\n      el.style.width = defaults.minWidth + 'px';\n    } else if (width > defaults.maxWidth) {\n      el.style.width = defaults.maxWidth + 'px';\n    } else {\n      el.style.width = width + 'px';\n    }\n    scrollHeight = el.scrollHeight ? el.scrollHeight - 1 : 0;\n\n    if (defaults.minHeight > scrollHeight) {\n      el.style.height = defaults.minHeight + 'px';\n    } else if (defaults.maxHeight < scrollHeight) {\n      el.style.height = defaults.maxHeight + 'px';\n      el.style.overflowY = 'visible';\n    } else {\n      el.style.height = scrollHeight + 'px';\n    }\n  },\n      delayedResize = function delayedResize() {\n    window.setTimeout(resize, 0);\n  },\n      extendDefaults = function extendDefaults(config) {\n\n    if (config && config.minHeight) {\n      if (config.minHeight == 'inherit') {\n        defaults.minHeight = el.clientHeight;\n      } else {\n        var minHeight = parseInt(config.minHeight);\n        if (!isNaN(minHeight)) {\n          defaults.minHeight = minHeight;\n        }\n      }\n    }\n\n    if (config && config.maxHeight) {\n      if (config.maxHeight == 'inherit') {\n        defaults.maxHeight = el.clientHeight;\n      } else {\n        var maxHeight = parseInt(config.maxHeight);\n        if (!isNaN(maxHeight)) {\n          defaults.maxHeight = maxHeight;\n        }\n      }\n    }\n\n    if (config && config.minWidth) {\n      if (config.minWidth == 'inherit') {\n        defaults.minWidth = el.clientWidth;\n      } else {\n        var minWidth = parseInt(config.minWidth);\n        if (!isNaN(minWidth)) {\n          defaults.minWidth = minWidth;\n        }\n      }\n    }\n\n    if (config && config.maxWidth) {\n      if (config.maxWidth == 'inherit') {\n        defaults.maxWidth = el.clientWidth;\n      } else {\n        var maxWidth = parseInt(config.maxWidth);\n        if (!isNaN(maxWidth)) {\n          defaults.maxWidth = maxWidth;\n        }\n      }\n    }\n\n    if (!span.firstChild) {\n      span.className = \"autoResize\";\n      span.style.display = 'inline-block';\n      span.appendChild(text);\n    }\n  },\n      _init = function _init(el_, config, doObserve) {\n    el = el_;\n    extendDefaults(config);\n\n    if (el.nodeName == 'TEXTAREA') {\n\n      el.style.resize = 'none';\n      el.style.overflowY = '';\n      el.style.height = defaults.minHeight + 'px';\n      el.style.minWidth = defaults.minWidth + 'px';\n      el.style.maxWidth = defaults.maxWidth + 'px';\n      el.style.overflowY = 'hidden';\n    }\n\n    if (doObserve) {\n      observe(el, 'change', resize);\n      observe(el, 'cut', delayedResize);\n      observe(el, 'paste', delayedResize);\n      observe(el, 'drop', delayedResize);\n      observe(el, 'keydown', delayedResize);\n      observe(el, 'focus', resize);\n    }\n\n    resize();\n  };\n\n  function getComputedStyle(element) {\n    return element.currentStyle || document.defaultView.getComputedStyle(element);\n  }\n\n  return {\n    init: function init(el_, config, doObserve) {\n      _init(el_, config, doObserve);\n    },\n    unObserve: function unObserve() {\n      _unObserve(el, 'change', resize);\n      _unObserve(el, 'cut', delayedResize);\n      _unObserve(el, 'paste', delayedResize);\n      _unObserve(el, 'drop', delayedResize);\n      _unObserve(el, 'keydown', delayedResize);\n      _unObserve(el, 'focus', resize);\n    },\n    resize: resize\n  };\n}\n\nif (true) {\n  module.exports = autoResize;\n}\n\n/***/ }),\n/* 356 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _baseEditor = __webpack_require__(54);\n\nvar _baseEditor2 = _interopRequireDefault(_baseEditor);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor CheckboxEditor\n * @class CheckboxEditor\n */\nvar CheckboxEditor = function (_BaseEditor) {\n  _inherits(CheckboxEditor, _BaseEditor);\n\n  function CheckboxEditor() {\n    _classCallCheck(this, CheckboxEditor);\n\n    return _possibleConstructorReturn(this, (CheckboxEditor.__proto__ || Object.getPrototypeOf(CheckboxEditor)).apply(this, arguments));\n  }\n\n  _createClass(CheckboxEditor, [{\n    key: 'beginEditing',\n    value: function beginEditing(initialValue, event) {\n      // Just some events connected with checkbox editor are delegated here. Some `keydown` events like `enter` and `space` key press\n      // are handled inside `checkboxRenderer`. Some events come here from `editorManager`. Below `if` statement was created by author\n      // for purpose of handling only `doubleclick` event which may be done on a cell with checkbox.\n\n      if (event.type === 'mouseup') {\n        var checkbox = this.TD.querySelector('input[type=\"checkbox\"]');\n\n        if (!(0, _element.hasClass)(checkbox, 'htBadValue')) {\n          checkbox.click();\n        }\n      }\n    }\n  }, {\n    key: 'finishEditing',\n    value: function finishEditing() {}\n  }, {\n    key: 'init',\n    value: function init() {}\n  }, {\n    key: 'open',\n    value: function open() {}\n  }, {\n    key: 'close',\n    value: function close() {}\n  }, {\n    key: 'getValue',\n    value: function getValue() {}\n  }, {\n    key: 'setValue',\n    value: function setValue() {}\n  }, {\n    key: 'focus',\n    value: function focus() {}\n  }]);\n\n  return CheckboxEditor;\n}(_baseEditor2.default);\n\nexports.default = CheckboxEditor;\n\n/***/ }),\n/* 357 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _moment = __webpack_require__(41);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _pikaday = __webpack_require__(358);\n\nvar _pikaday2 = _interopRequireDefault(_pikaday);\n\n__webpack_require__(359);\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _unicode = __webpack_require__(21);\n\nvar _event = __webpack_require__(12);\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor DateEditor\n * @class DateEditor\n * @dependencies TextEditor moment pikaday\n */\nvar DateEditor = function (_TextEditor) {\n  _inherits(DateEditor, _TextEditor);\n\n  /**\n   * @param {Core} hotInstance Handsontable instance\n   * @private\n   */\n  function DateEditor(hotInstance) {\n    _classCallCheck(this, DateEditor);\n\n    // TODO: Move this option to general settings\n    var _this = _possibleConstructorReturn(this, (DateEditor.__proto__ || Object.getPrototypeOf(DateEditor)).call(this, hotInstance));\n\n    _this.defaultDateFormat = 'DD/MM/YYYY';\n    _this.isCellEdited = false;\n    _this.parentDestroyed = false;\n    return _this;\n  }\n\n  _createClass(DateEditor, [{\n    key: 'init',\n    value: function init() {\n      var _this2 = this;\n\n      if (typeof _moment2.default !== 'function') {\n        throw new Error('You need to include moment.js to your project.');\n      }\n\n      if (typeof _pikaday2.default !== 'function') {\n        throw new Error('You need to include Pikaday to your project.');\n      }\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'init', this).call(this);\n      this.instance.addHook('afterDestroy', function () {\n        _this2.parentDestroyed = true;\n        _this2.destroyElements();\n      });\n    }\n\n    /**\n     * Create data picker instance\n     */\n\n  }, {\n    key: 'createElements',\n    value: function createElements() {\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'createElements', this).call(this);\n\n      this.datePicker = document.createElement('DIV');\n      this.datePickerStyle = this.datePicker.style;\n      this.datePickerStyle.position = 'absolute';\n      this.datePickerStyle.top = 0;\n      this.datePickerStyle.left = 0;\n      this.datePickerStyle.zIndex = 9999;\n\n      (0, _element.addClass)(this.datePicker, 'htDatepickerHolder');\n      document.body.appendChild(this.datePicker);\n\n      this.$datePicker = new _pikaday2.default(this.getDatePickerConfig());\n      var eventManager = new _eventManager2.default(this);\n\n      /**\n       * Prevent recognizing clicking on datepicker as clicking outside of table\n       */\n      eventManager.addEventListener(this.datePicker, 'mousedown', function (event) {\n        return (0, _event.stopPropagation)(event);\n      });\n      this.hideDatepicker();\n    }\n\n    /**\n     * Destroy data picker instance\n     */\n\n  }, {\n    key: 'destroyElements',\n    value: function destroyElements() {\n      this.$datePicker.destroy();\n    }\n\n    /**\n     * Prepare editor to appear\n     *\n     * @param {Number} row Row index\n     * @param {Number} col Column index\n     * @param {String} prop Property name (passed when datasource is an array of objects)\n     * @param {HTMLTableCellElement} td Table cell element\n     * @param {*} originalValue Original value\n     * @param {Object} cellProperties Object with cell properties ({@see Core#getCellMeta})\n     */\n\n  }, {\n    key: 'prepare',\n    value: function prepare(row, col, prop, td, originalValue, cellProperties) {\n      this._opened = false;\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'prepare', this).call(this, row, col, prop, td, originalValue, cellProperties);\n    }\n\n    /**\n     * Open editor\n     *\n     * @param {Event} [event=null]\n     */\n\n  }, {\n    key: 'open',\n    value: function open() {\n      var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'open', this).call(this);\n      this.showDatepicker(event);\n    }\n\n    /**\n     * Close editor\n     */\n\n  }, {\n    key: 'close',\n    value: function close() {\n      var _this3 = this;\n\n      this._opened = false;\n      this.instance._registerTimeout(setTimeout(function () {\n        _this3.instance._refreshBorders();\n      }, 0));\n\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'close', this).call(this);\n    }\n\n    /**\n     * @param {Boolean} [isCancelled=false]\n     * @param {Boolean} [ctrlDown=false]\n     */\n\n  }, {\n    key: 'finishEditing',\n    value: function finishEditing() {\n      var isCancelled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n      var ctrlDown = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (isCancelled) {\n        // pressed ESC, restore original value\n        // var value = this.instance.getDataAtCell(this.row, this.col);\n        var value = this.originalValue;\n\n        if (value !== void 0) {\n          this.setValue(value);\n        }\n      }\n      this.hideDatepicker();\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'finishEditing', this).call(this, isCancelled, ctrlDown);\n    }\n\n    /**\n     * Show data picker\n     *\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'showDatepicker',\n    value: function showDatepicker(event) {\n      this.$datePicker.config(this.getDatePickerConfig());\n\n      var offset = this.TD.getBoundingClientRect();\n      var dateFormat = this.cellProperties.dateFormat || this.defaultDateFormat;\n      var datePickerConfig = this.$datePicker.config();\n      var dateStr = void 0;\n      var isMouseDown = this.instance.view.isMouseDown();\n      var isMeta = event ? (0, _unicode.isMetaKey)(event.keyCode) : false;\n\n      this.datePickerStyle.top = window.pageYOffset + offset.top + (0, _element.outerHeight)(this.TD) + 'px';\n      this.datePickerStyle.left = window.pageXOffset + offset.left + 'px';\n\n      this.$datePicker._onInputFocus = function () {};\n      datePickerConfig.format = dateFormat;\n\n      if (this.originalValue) {\n        dateStr = this.originalValue;\n\n        if ((0, _moment2.default)(dateStr, dateFormat, true).isValid()) {\n          this.$datePicker.setMoment((0, _moment2.default)(dateStr, dateFormat), true);\n        }\n\n        // workaround for date/time cells - pikaday resets the cell value to 12:00 AM by default, this will overwrite the value.\n        if (this.getValue() !== this.originalValue) {\n          this.setValue(this.originalValue);\n        }\n\n        if (!isMeta && !isMouseDown) {\n          this.setValue('');\n        }\n      } else if (this.cellProperties.defaultDate) {\n        dateStr = this.cellProperties.defaultDate;\n\n        datePickerConfig.defaultDate = dateStr;\n\n        if ((0, _moment2.default)(dateStr, dateFormat, true).isValid()) {\n          this.$datePicker.setMoment((0, _moment2.default)(dateStr, dateFormat), true);\n        }\n\n        if (!isMeta && !isMouseDown) {\n          this.setValue('');\n        }\n      } else {\n        // if a default date is not defined, set a soft-default-date: display the current day and month in the\n        // datepicker, but don't fill the editor input\n        this.$datePicker.gotoToday();\n      }\n\n      this.datePickerStyle.display = 'block';\n      this.$datePicker.show();\n    }\n\n    /**\n     * Hide data picker\n     */\n\n  }, {\n    key: 'hideDatepicker',\n    value: function hideDatepicker() {\n      this.datePickerStyle.display = 'none';\n      this.$datePicker.hide();\n    }\n\n    /**\n     * Get date picker options.\n     *\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'getDatePickerConfig',\n    value: function getDatePickerConfig() {\n      var _this4 = this;\n\n      var htInput = this.TEXTAREA;\n      var options = {};\n\n      if (this.cellProperties && this.cellProperties.datePickerConfig) {\n        (0, _object.deepExtend)(options, this.cellProperties.datePickerConfig);\n      }\n      var origOnSelect = options.onSelect;\n      var origOnClose = options.onClose;\n\n      options.field = htInput;\n      options.trigger = htInput;\n      options.container = this.datePicker;\n      options.bound = false;\n      options.format = options.format || this.defaultDateFormat;\n      options.reposition = options.reposition || false;\n      options.onSelect = function (dateStr) {\n        if (!isNaN(dateStr.getTime())) {\n          dateStr = (0, _moment2.default)(dateStr).format(_this4.cellProperties.dateFormat || _this4.defaultDateFormat);\n        }\n        _this4.setValue(dateStr);\n        _this4.hideDatepicker();\n\n        if (origOnSelect) {\n          origOnSelect();\n        }\n      };\n      options.onClose = function () {\n        if (!_this4.parentDestroyed) {\n          _this4.finishEditing(false);\n        }\n        if (origOnClose) {\n          origOnClose();\n        }\n      };\n\n      return options;\n    }\n  }]);\n\n  return DateEditor;\n}(_textEditor2.default);\n\nexports.default = DateEditor;\n\n/***/ }),\n/* 358 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*!\n * Pikaday\n *\n * Copyright © 2014 David Bushell | BSD & MIT license | https://github.com/dbushell/Pikaday\n */\n\n(function (root, factory)\n{\n    'use strict';\n\n    var moment;\n    if (true) {\n        // CommonJS module\n        // Load moment.js as an optional dependency\n        try { moment = __webpack_require__(41); } catch (e) {}\n        module.exports = factory(moment);\n    } else if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(function (req)\n        {\n            // Load moment.js as an optional dependency\n            var id = 'moment';\n            try { moment = req(id); } catch (e) {}\n            return factory(moment);\n        });\n    } else {\n        root.Pikaday = factory(root.moment);\n    }\n}(this, function (moment)\n{\n    'use strict';\n\n    /**\n     * feature detection and helper functions\n     */\n    var hasMoment = typeof moment === 'function',\n\n    hasEventListeners = !!window.addEventListener,\n\n    document = window.document,\n\n    sto = window.setTimeout,\n\n    addEvent = function(el, e, callback, capture)\n    {\n        if (hasEventListeners) {\n            el.addEventListener(e, callback, !!capture);\n        } else {\n            el.attachEvent('on' + e, callback);\n        }\n    },\n\n    removeEvent = function(el, e, callback, capture)\n    {\n        if (hasEventListeners) {\n            el.removeEventListener(e, callback, !!capture);\n        } else {\n            el.detachEvent('on' + e, callback);\n        }\n    },\n\n    fireEvent = function(el, eventName, data)\n    {\n        var ev;\n\n        if (document.createEvent) {\n            ev = document.createEvent('HTMLEvents');\n            ev.initEvent(eventName, true, false);\n            ev = extend(ev, data);\n            el.dispatchEvent(ev);\n        } else if (document.createEventObject) {\n            ev = document.createEventObject();\n            ev = extend(ev, data);\n            el.fireEvent('on' + eventName, ev);\n        }\n    },\n\n    trim = function(str)\n    {\n        return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g,'');\n    },\n\n    hasClass = function(el, cn)\n    {\n        return (' ' + el.className + ' ').indexOf(' ' + cn + ' ') !== -1;\n    },\n\n    addClass = function(el, cn)\n    {\n        if (!hasClass(el, cn)) {\n            el.className = (el.className === '') ? cn : el.className + ' ' + cn;\n        }\n    },\n\n    removeClass = function(el, cn)\n    {\n        el.className = trim((' ' + el.className + ' ').replace(' ' + cn + ' ', ' '));\n    },\n\n    isArray = function(obj)\n    {\n        return (/Array/).test(Object.prototype.toString.call(obj));\n    },\n\n    isDate = function(obj)\n    {\n        return (/Date/).test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime());\n    },\n\n    isWeekend = function(date)\n    {\n        var day = date.getDay();\n        return day === 0 || day === 6;\n    },\n\n    isLeapYear = function(year)\n    {\n        // solution by Matti Virkkunen: http://stackoverflow.com/a/4881951\n        return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;\n    },\n\n    getDaysInMonth = function(year, month)\n    {\n        return [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n    },\n\n    setToStartOfDay = function(date)\n    {\n        if (isDate(date)) date.setHours(0,0,0,0);\n    },\n\n    compareDates = function(a,b)\n    {\n        // weak date comparison (use setToStartOfDay(date) to ensure correct result)\n        return a.getTime() === b.getTime();\n    },\n\n    extend = function(to, from, overwrite)\n    {\n        var prop, hasProp;\n        for (prop in from) {\n            hasProp = to[prop] !== undefined;\n            if (hasProp && typeof from[prop] === 'object' && from[prop] !== null && from[prop].nodeName === undefined) {\n                if (isDate(from[prop])) {\n                    if (overwrite) {\n                        to[prop] = new Date(from[prop].getTime());\n                    }\n                }\n                else if (isArray(from[prop])) {\n                    if (overwrite) {\n                        to[prop] = from[prop].slice(0);\n                    }\n                } else {\n                    to[prop] = extend({}, from[prop], overwrite);\n                }\n            } else if (overwrite || !hasProp) {\n                to[prop] = from[prop];\n            }\n        }\n        return to;\n    },\n\n    adjustCalendar = function(calendar) {\n        if (calendar.month < 0) {\n            calendar.year -= Math.ceil(Math.abs(calendar.month)/12);\n            calendar.month += 12;\n        }\n        if (calendar.month > 11) {\n            calendar.year += Math.floor(Math.abs(calendar.month)/12);\n            calendar.month -= 12;\n        }\n        return calendar;\n    },\n\n    /**\n     * defaults and localisation\n     */\n    defaults = {\n\n        // bind the picker to a form field\n        field: null,\n\n        // automatically show/hide the picker on `field` focus (default `true` if `field` is set)\n        bound: undefined,\n\n        // position of the datepicker, relative to the field (default to bottom & left)\n        // ('bottom' & 'left' keywords are not used, 'top' & 'right' are modifier on the bottom/left position)\n        position: 'bottom left',\n\n        // automatically fit in the viewport even if it means repositioning from the position option\n        reposition: true,\n\n        // the default output format for `.toString()` and `field` value\n        format: 'YYYY-MM-DD',\n\n        // the initial date to view when first opened\n        defaultDate: null,\n\n        // make the `defaultDate` the initial selected value\n        setDefaultDate: false,\n\n        // first day of week (0: Sunday, 1: Monday etc)\n        firstDay: 0,\n\n        // the default flag for moment's strict date parsing\n        formatStrict: false,\n\n        // the minimum/earliest date that can be selected\n        minDate: null,\n        // the maximum/latest date that can be selected\n        maxDate: null,\n\n        // number of years either side, or array of upper/lower range\n        yearRange: 10,\n\n        // show week numbers at head of row\n        showWeekNumber: false,\n\n        // used internally (don't config outside)\n        minYear: 0,\n        maxYear: 9999,\n        minMonth: undefined,\n        maxMonth: undefined,\n\n        startRange: null,\n        endRange: null,\n\n        isRTL: false,\n\n        // Additional text to append to the year in the calendar title\n        yearSuffix: '',\n\n        // Render the month after year in the calendar title\n        showMonthAfterYear: false,\n\n        // Render days of the calendar grid that fall in the next or previous month\n        showDaysInNextAndPreviousMonths: false,\n\n        // how many months are visible\n        numberOfMonths: 1,\n\n        // when numberOfMonths is used, this will help you to choose where the main calendar will be (default `left`, can be set to `right`)\n        // only used for the first display or when a selected date is not visible\n        mainCalendar: 'left',\n\n        // Specify a DOM element to render the calendar in\n        container: undefined,\n\n        // internationalization\n        i18n: {\n            previousMonth : 'Previous Month',\n            nextMonth     : 'Next Month',\n            months        : ['January','February','March','April','May','June','July','August','September','October','November','December'],\n            weekdays      : ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],\n            weekdaysShort : ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']\n        },\n\n        // Theme Classname\n        theme: null,\n\n        // callback function\n        onSelect: null,\n        onOpen: null,\n        onClose: null,\n        onDraw: null\n    },\n\n\n    /**\n     * templating functions to abstract HTML rendering\n     */\n    renderDayName = function(opts, day, abbr)\n    {\n        day += opts.firstDay;\n        while (day >= 7) {\n            day -= 7;\n        }\n        return abbr ? opts.i18n.weekdaysShort[day] : opts.i18n.weekdays[day];\n    },\n\n    renderDay = function(opts)\n    {\n        var arr = [];\n        var ariaSelected = 'false';\n        if (opts.isEmpty) {\n            if (opts.showDaysInNextAndPreviousMonths) {\n                arr.push('is-outside-current-month');\n            } else {\n                return '<td class=\"is-empty\"></td>';\n            }\n        }\n        if (opts.isDisabled) {\n            arr.push('is-disabled');\n        }\n        if (opts.isToday) {\n            arr.push('is-today');\n        }\n        if (opts.isSelected) {\n            arr.push('is-selected');\n            ariaSelected = 'true';\n        }\n        if (opts.isInRange) {\n            arr.push('is-inrange');\n        }\n        if (opts.isStartRange) {\n            arr.push('is-startrange');\n        }\n        if (opts.isEndRange) {\n            arr.push('is-endrange');\n        }\n        return '<td data-day=\"' + opts.day + '\" class=\"' + arr.join(' ') + '\" aria-selected=\"' + ariaSelected + '\">' +\n                 '<button class=\"pika-button pika-day\" type=\"button\" ' +\n                    'data-pika-year=\"' + opts.year + '\" data-pika-month=\"' + opts.month + '\" data-pika-day=\"' + opts.day + '\">' +\n                        opts.day +\n                 '</button>' +\n               '</td>';\n    },\n\n    renderWeek = function (d, m, y) {\n        // Lifted from http://javascript.about.com/library/blweekyear.htm, lightly modified.\n        var onejan = new Date(y, 0, 1),\n            weekNum = Math.ceil((((new Date(y, m, d) - onejan) / 86400000) + onejan.getDay()+1)/7);\n        return '<td class=\"pika-week\">' + weekNum + '</td>';\n    },\n\n    renderRow = function(days, isRTL)\n    {\n        return '<tr>' + (isRTL ? days.reverse() : days).join('') + '</tr>';\n    },\n\n    renderBody = function(rows)\n    {\n        return '<tbody>' + rows.join('') + '</tbody>';\n    },\n\n    renderHead = function(opts)\n    {\n        var i, arr = [];\n        if (opts.showWeekNumber) {\n            arr.push('<th></th>');\n        }\n        for (i = 0; i < 7; i++) {\n            arr.push('<th scope=\"col\"><abbr title=\"' + renderDayName(opts, i) + '\">' + renderDayName(opts, i, true) + '</abbr></th>');\n        }\n        return '<thead><tr>' + (opts.isRTL ? arr.reverse() : arr).join('') + '</tr></thead>';\n    },\n\n    renderTitle = function(instance, c, year, month, refYear, randId)\n    {\n        var i, j, arr,\n            opts = instance._o,\n            isMinYear = year === opts.minYear,\n            isMaxYear = year === opts.maxYear,\n            html = '<div id=\"' + randId + '\" class=\"pika-title\" role=\"heading\" aria-live=\"assertive\">',\n            monthHtml,\n            yearHtml,\n            prev = true,\n            next = true;\n\n        for (arr = [], i = 0; i < 12; i++) {\n            arr.push('<option value=\"' + (year === refYear ? i - c : 12 + i - c) + '\"' +\n                (i === month ? ' selected=\"selected\"': '') +\n                ((isMinYear && i < opts.minMonth) || (isMaxYear && i > opts.maxMonth) ? 'disabled=\"disabled\"' : '') + '>' +\n                opts.i18n.months[i] + '</option>');\n        }\n\n        monthHtml = '<div class=\"pika-label\">' + opts.i18n.months[month] + '<select class=\"pika-select pika-select-month\" tabindex=\"-1\">' + arr.join('') + '</select></div>';\n\n        if (isArray(opts.yearRange)) {\n            i = opts.yearRange[0];\n            j = opts.yearRange[1] + 1;\n        } else {\n            i = year - opts.yearRange;\n            j = 1 + year + opts.yearRange;\n        }\n\n        for (arr = []; i < j && i <= opts.maxYear; i++) {\n            if (i >= opts.minYear) {\n                arr.push('<option value=\"' + i + '\"' + (i === year ? ' selected=\"selected\"': '') + '>' + (i) + '</option>');\n            }\n        }\n        yearHtml = '<div class=\"pika-label\">' + year + opts.yearSuffix + '<select class=\"pika-select pika-select-year\" tabindex=\"-1\">' + arr.join('') + '</select></div>';\n\n        if (opts.showMonthAfterYear) {\n            html += yearHtml + monthHtml;\n        } else {\n            html += monthHtml + yearHtml;\n        }\n\n        if (isMinYear && (month === 0 || opts.minMonth >= month)) {\n            prev = false;\n        }\n\n        if (isMaxYear && (month === 11 || opts.maxMonth <= month)) {\n            next = false;\n        }\n\n        if (c === 0) {\n            html += '<button class=\"pika-prev' + (prev ? '' : ' is-disabled') + '\" type=\"button\">' + opts.i18n.previousMonth + '</button>';\n        }\n        if (c === (instance._o.numberOfMonths - 1) ) {\n            html += '<button class=\"pika-next' + (next ? '' : ' is-disabled') + '\" type=\"button\">' + opts.i18n.nextMonth + '</button>';\n        }\n\n        return html += '</div>';\n    },\n\n    renderTable = function(opts, data, randId)\n    {\n        return '<table cellpadding=\"0\" cellspacing=\"0\" class=\"pika-table\" role=\"grid\" aria-labelledby=\"' + randId + '\">' + renderHead(opts) + renderBody(data) + '</table>';\n    },\n\n\n    /**\n     * Pikaday constructor\n     */\n    Pikaday = function(options)\n    {\n        var self = this,\n            opts = self.config(options);\n\n        self._onMouseDown = function(e)\n        {\n            if (!self._v) {\n                return;\n            }\n            e = e || window.event;\n            var target = e.target || e.srcElement;\n            if (!target) {\n                return;\n            }\n\n            if (!hasClass(target, 'is-disabled')) {\n                if (hasClass(target, 'pika-button') && !hasClass(target, 'is-empty') && !hasClass(target.parentNode, 'is-disabled')) {\n                    self.setDate(new Date(target.getAttribute('data-pika-year'), target.getAttribute('data-pika-month'), target.getAttribute('data-pika-day')));\n                    if (opts.bound) {\n                        sto(function() {\n                            self.hide();\n                            if (opts.field) {\n                                opts.field.blur();\n                            }\n                        }, 100);\n                    }\n                }\n                else if (hasClass(target, 'pika-prev')) {\n                    self.prevMonth();\n                }\n                else if (hasClass(target, 'pika-next')) {\n                    self.nextMonth();\n                }\n            }\n            if (!hasClass(target, 'pika-select')) {\n                // if this is touch event prevent mouse events emulation\n                if (e.preventDefault) {\n                    e.preventDefault();\n                } else {\n                    e.returnValue = false;\n                    return false;\n                }\n            } else {\n                self._c = true;\n            }\n        };\n\n        self._onChange = function(e)\n        {\n            e = e || window.event;\n            var target = e.target || e.srcElement;\n            if (!target) {\n                return;\n            }\n            if (hasClass(target, 'pika-select-month')) {\n                self.gotoMonth(target.value);\n            }\n            else if (hasClass(target, 'pika-select-year')) {\n                self.gotoYear(target.value);\n            }\n        };\n\n        self._onKeyChange = function(e)\n        {\n            e = e || window.event;\n\n            if (self.isVisible()) {\n\n                switch(e.keyCode){\n                    case 13:\n                    case 27:\n                        opts.field.blur();\n                        break;\n                    case 37:\n                        e.preventDefault();\n                        self.adjustDate('subtract', 1);\n                        break;\n                    case 38:\n                        self.adjustDate('subtract', 7);\n                        break;\n                    case 39:\n                        self.adjustDate('add', 1);\n                        break;\n                    case 40:\n                        self.adjustDate('add', 7);\n                        break;\n                }\n            }\n        };\n\n        self._onInputChange = function(e)\n        {\n            var date;\n\n            if (e.firedBy === self) {\n                return;\n            }\n            if (hasMoment) {\n                date = moment(opts.field.value, opts.format, opts.formatStrict);\n                date = (date && date.isValid()) ? date.toDate() : null;\n            }\n            else {\n                date = new Date(Date.parse(opts.field.value));\n            }\n            if (isDate(date)) {\n              self.setDate(date);\n            }\n            if (!self._v) {\n                self.show();\n            }\n        };\n\n        self._onInputFocus = function()\n        {\n            self.show();\n        };\n\n        self._onInputClick = function()\n        {\n            self.show();\n        };\n\n        self._onInputBlur = function()\n        {\n            // IE allows pika div to gain focus; catch blur the input field\n            var pEl = document.activeElement;\n            do {\n                if (hasClass(pEl, 'pika-single')) {\n                    return;\n                }\n            }\n            while ((pEl = pEl.parentNode));\n\n            if (!self._c) {\n                self._b = sto(function() {\n                    self.hide();\n                }, 50);\n            }\n            self._c = false;\n        };\n\n        self._onClick = function(e)\n        {\n            e = e || window.event;\n            var target = e.target || e.srcElement,\n                pEl = target;\n            if (!target) {\n                return;\n            }\n            if (!hasEventListeners && hasClass(target, 'pika-select')) {\n                if (!target.onchange) {\n                    target.setAttribute('onchange', 'return;');\n                    addEvent(target, 'change', self._onChange);\n                }\n            }\n            do {\n                if (hasClass(pEl, 'pika-single') || pEl === opts.trigger) {\n                    return;\n                }\n            }\n            while ((pEl = pEl.parentNode));\n            if (self._v && target !== opts.trigger && pEl !== opts.trigger) {\n                self.hide();\n            }\n        };\n\n        self.el = document.createElement('div');\n        self.el.className = 'pika-single' + (opts.isRTL ? ' is-rtl' : '') + (opts.theme ? ' ' + opts.theme : '');\n\n        addEvent(self.el, 'mousedown', self._onMouseDown, true);\n        addEvent(self.el, 'touchend', self._onMouseDown, true);\n        addEvent(self.el, 'change', self._onChange);\n        addEvent(document, 'keydown', self._onKeyChange);\n\n        if (opts.field) {\n            if (opts.container) {\n                opts.container.appendChild(self.el);\n            } else if (opts.bound) {\n                document.body.appendChild(self.el);\n            } else {\n                opts.field.parentNode.insertBefore(self.el, opts.field.nextSibling);\n            }\n            addEvent(opts.field, 'change', self._onInputChange);\n\n            if (!opts.defaultDate) {\n                if (hasMoment && opts.field.value) {\n                    opts.defaultDate = moment(opts.field.value, opts.format).toDate();\n                } else {\n                    opts.defaultDate = new Date(Date.parse(opts.field.value));\n                }\n                opts.setDefaultDate = true;\n            }\n        }\n\n        var defDate = opts.defaultDate;\n\n        if (isDate(defDate)) {\n            if (opts.setDefaultDate) {\n                self.setDate(defDate, true);\n            } else {\n                self.gotoDate(defDate);\n            }\n        } else {\n            self.gotoDate(new Date());\n        }\n\n        if (opts.bound) {\n            this.hide();\n            self.el.className += ' is-bound';\n            addEvent(opts.trigger, 'click', self._onInputClick);\n            addEvent(opts.trigger, 'focus', self._onInputFocus);\n            addEvent(opts.trigger, 'blur', self._onInputBlur);\n        } else {\n            this.show();\n        }\n    };\n\n\n    /**\n     * public Pikaday API\n     */\n    Pikaday.prototype = {\n\n\n        /**\n         * configure functionality\n         */\n        config: function(options)\n        {\n            if (!this._o) {\n                this._o = extend({}, defaults, true);\n            }\n\n            var opts = extend(this._o, options, true);\n\n            opts.isRTL = !!opts.isRTL;\n\n            opts.field = (opts.field && opts.field.nodeName) ? opts.field : null;\n\n            opts.theme = (typeof opts.theme) === 'string' && opts.theme ? opts.theme : null;\n\n            opts.bound = !!(opts.bound !== undefined ? opts.field && opts.bound : opts.field);\n\n            opts.trigger = (opts.trigger && opts.trigger.nodeName) ? opts.trigger : opts.field;\n\n            opts.disableWeekends = !!opts.disableWeekends;\n\n            opts.disableDayFn = (typeof opts.disableDayFn) === 'function' ? opts.disableDayFn : null;\n\n            var nom = parseInt(opts.numberOfMonths, 10) || 1;\n            opts.numberOfMonths = nom > 4 ? 4 : nom;\n\n            if (!isDate(opts.minDate)) {\n                opts.minDate = false;\n            }\n            if (!isDate(opts.maxDate)) {\n                opts.maxDate = false;\n            }\n            if ((opts.minDate && opts.maxDate) && opts.maxDate < opts.minDate) {\n                opts.maxDate = opts.minDate = false;\n            }\n            if (opts.minDate) {\n                this.setMinDate(opts.minDate);\n            }\n            if (opts.maxDate) {\n                this.setMaxDate(opts.maxDate);\n            }\n\n            if (isArray(opts.yearRange)) {\n                var fallback = new Date().getFullYear() - 10;\n                opts.yearRange[0] = parseInt(opts.yearRange[0], 10) || fallback;\n                opts.yearRange[1] = parseInt(opts.yearRange[1], 10) || fallback;\n            } else {\n                opts.yearRange = Math.abs(parseInt(opts.yearRange, 10)) || defaults.yearRange;\n                if (opts.yearRange > 100) {\n                    opts.yearRange = 100;\n                }\n            }\n\n            return opts;\n        },\n\n        /**\n         * return a formatted string of the current selection (using Moment.js if available)\n         */\n        toString: function(format)\n        {\n            return !isDate(this._d) ? '' : hasMoment ? moment(this._d).format(format || this._o.format) : this._d.toDateString();\n        },\n\n        /**\n         * return a Moment.js object of the current selection (if available)\n         */\n        getMoment: function()\n        {\n            return hasMoment ? moment(this._d) : null;\n        },\n\n        /**\n         * set the current selection from a Moment.js object (if available)\n         */\n        setMoment: function(date, preventOnSelect)\n        {\n            if (hasMoment && moment.isMoment(date)) {\n                this.setDate(date.toDate(), preventOnSelect);\n            }\n        },\n\n        /**\n         * return a Date object of the current selection with fallback for the current date\n         */\n        getDate: function()\n        {\n            return isDate(this._d) ? new Date(this._d.getTime()) : new Date();\n        },\n\n        /**\n         * set the current selection\n         */\n        setDate: function(date, preventOnSelect)\n        {\n            if (!date) {\n                this._d = null;\n\n                if (this._o.field) {\n                    this._o.field.value = '';\n                    fireEvent(this._o.field, 'change', { firedBy: this });\n                }\n\n                return this.draw();\n            }\n            if (typeof date === 'string') {\n                date = new Date(Date.parse(date));\n            }\n            if (!isDate(date)) {\n                return;\n            }\n\n            var min = this._o.minDate,\n                max = this._o.maxDate;\n\n            if (isDate(min) && date < min) {\n                date = min;\n            } else if (isDate(max) && date > max) {\n                date = max;\n            }\n\n            this._d = new Date(date.getTime());\n            setToStartOfDay(this._d);\n            this.gotoDate(this._d);\n\n            if (this._o.field) {\n                this._o.field.value = this.toString();\n                fireEvent(this._o.field, 'change', { firedBy: this });\n            }\n            if (!preventOnSelect && typeof this._o.onSelect === 'function') {\n                this._o.onSelect.call(this, this.getDate());\n            }\n        },\n\n        /**\n         * change view to a specific date\n         */\n        gotoDate: function(date)\n        {\n            var newCalendar = true;\n\n            if (!isDate(date)) {\n                return;\n            }\n\n            if (this.calendars) {\n                var firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1),\n                    lastVisibleDate = new Date(this.calendars[this.calendars.length-1].year, this.calendars[this.calendars.length-1].month, 1),\n                    visibleDate = date.getTime();\n                // get the end of the month\n                lastVisibleDate.setMonth(lastVisibleDate.getMonth()+1);\n                lastVisibleDate.setDate(lastVisibleDate.getDate()-1);\n                newCalendar = (visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate);\n            }\n\n            if (newCalendar) {\n                this.calendars = [{\n                    month: date.getMonth(),\n                    year: date.getFullYear()\n                }];\n                if (this._o.mainCalendar === 'right') {\n                    this.calendars[0].month += 1 - this._o.numberOfMonths;\n                }\n            }\n\n            this.adjustCalendars();\n        },\n\n        adjustDate: function(sign, days) {\n\n            var day = this.getDate();\n            var difference = parseInt(days)*24*60*60*1000;\n\n            var newDay;\n\n            if (sign === 'add') {\n                newDay = new Date(day.valueOf() + difference);\n            } else if (sign === 'subtract') {\n                newDay = new Date(day.valueOf() - difference);\n            }\n\n            if (hasMoment) {\n                if (sign === 'add') {\n                    newDay = moment(day).add(days, \"days\").toDate();\n                } else if (sign === 'subtract') {\n                    newDay = moment(day).subtract(days, \"days\").toDate();\n                }\n            }\n\n            this.setDate(newDay);\n        },\n\n        adjustCalendars: function() {\n            this.calendars[0] = adjustCalendar(this.calendars[0]);\n            for (var c = 1; c < this._o.numberOfMonths; c++) {\n                this.calendars[c] = adjustCalendar({\n                    month: this.calendars[0].month + c,\n                    year: this.calendars[0].year\n                });\n            }\n            this.draw();\n        },\n\n        gotoToday: function()\n        {\n            this.gotoDate(new Date());\n        },\n\n        /**\n         * change view to a specific month (zero-index, e.g. 0: January)\n         */\n        gotoMonth: function(month)\n        {\n            if (!isNaN(month)) {\n                this.calendars[0].month = parseInt(month, 10);\n                this.adjustCalendars();\n            }\n        },\n\n        nextMonth: function()\n        {\n            this.calendars[0].month++;\n            this.adjustCalendars();\n        },\n\n        prevMonth: function()\n        {\n            this.calendars[0].month--;\n            this.adjustCalendars();\n        },\n\n        /**\n         * change view to a specific full year (e.g. \"2012\")\n         */\n        gotoYear: function(year)\n        {\n            if (!isNaN(year)) {\n                this.calendars[0].year = parseInt(year, 10);\n                this.adjustCalendars();\n            }\n        },\n\n        /**\n         * change the minDate\n         */\n        setMinDate: function(value)\n        {\n            if(value instanceof Date) {\n                setToStartOfDay(value);\n                this._o.minDate = value;\n                this._o.minYear  = value.getFullYear();\n                this._o.minMonth = value.getMonth();\n            } else {\n                this._o.minDate = defaults.minDate;\n                this._o.minYear  = defaults.minYear;\n                this._o.minMonth = defaults.minMonth;\n                this._o.startRange = defaults.startRange;\n            }\n\n            this.draw();\n        },\n\n        /**\n         * change the maxDate\n         */\n        setMaxDate: function(value)\n        {\n            if(value instanceof Date) {\n                setToStartOfDay(value);\n                this._o.maxDate = value;\n                this._o.maxYear = value.getFullYear();\n                this._o.maxMonth = value.getMonth();\n            } else {\n                this._o.maxDate = defaults.maxDate;\n                this._o.maxYear = defaults.maxYear;\n                this._o.maxMonth = defaults.maxMonth;\n                this._o.endRange = defaults.endRange;\n            }\n\n            this.draw();\n        },\n\n        setStartRange: function(value)\n        {\n            this._o.startRange = value;\n        },\n\n        setEndRange: function(value)\n        {\n            this._o.endRange = value;\n        },\n\n        /**\n         * refresh the HTML\n         */\n        draw: function(force)\n        {\n            if (!this._v && !force) {\n                return;\n            }\n            var opts = this._o,\n                minYear = opts.minYear,\n                maxYear = opts.maxYear,\n                minMonth = opts.minMonth,\n                maxMonth = opts.maxMonth,\n                html = '',\n                randId;\n\n            if (this._y <= minYear) {\n                this._y = minYear;\n                if (!isNaN(minMonth) && this._m < minMonth) {\n                    this._m = minMonth;\n                }\n            }\n            if (this._y >= maxYear) {\n                this._y = maxYear;\n                if (!isNaN(maxMonth) && this._m > maxMonth) {\n                    this._m = maxMonth;\n                }\n            }\n\n            randId = 'pika-title-' + Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 2);\n\n            for (var c = 0; c < opts.numberOfMonths; c++) {\n                html += '<div class=\"pika-lendar\">' + renderTitle(this, c, this.calendars[c].year, this.calendars[c].month, this.calendars[0].year, randId) + this.render(this.calendars[c].year, this.calendars[c].month, randId) + '</div>';\n            }\n\n            this.el.innerHTML = html;\n\n            if (opts.bound) {\n                if(opts.field.type !== 'hidden') {\n                    sto(function() {\n                        opts.trigger.focus();\n                    }, 1);\n                }\n            }\n\n            if (typeof this._o.onDraw === 'function') {\n                this._o.onDraw(this);\n            }\n            \n            if (opts.bound) {\n                // let the screen reader user know to use arrow keys\n                opts.field.setAttribute('aria-label', 'Use the arrow keys to pick a date');\n            }\n        },\n\n        adjustPosition: function()\n        {\n            var field, pEl, width, height, viewportWidth, viewportHeight, scrollTop, left, top, clientRect;\n\n            if (this._o.container) return;\n\n            this.el.style.position = 'absolute';\n\n            field = this._o.trigger;\n            pEl = field;\n            width = this.el.offsetWidth;\n            height = this.el.offsetHeight;\n            viewportWidth = window.innerWidth || document.documentElement.clientWidth;\n            viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n            scrollTop = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;\n\n            if (typeof field.getBoundingClientRect === 'function') {\n                clientRect = field.getBoundingClientRect();\n                left = clientRect.left + window.pageXOffset;\n                top = clientRect.bottom + window.pageYOffset;\n            } else {\n                left = pEl.offsetLeft;\n                top  = pEl.offsetTop + pEl.offsetHeight;\n                while((pEl = pEl.offsetParent)) {\n                    left += pEl.offsetLeft;\n                    top  += pEl.offsetTop;\n                }\n            }\n\n            // default position is bottom & left\n            if ((this._o.reposition && left + width > viewportWidth) ||\n                (\n                    this._o.position.indexOf('right') > -1 &&\n                    left - width + field.offsetWidth > 0\n                )\n            ) {\n                left = left - width + field.offsetWidth;\n            }\n            if ((this._o.reposition && top + height > viewportHeight + scrollTop) ||\n                (\n                    this._o.position.indexOf('top') > -1 &&\n                    top - height - field.offsetHeight > 0\n                )\n            ) {\n                top = top - height - field.offsetHeight;\n            }\n\n            this.el.style.left = left + 'px';\n            this.el.style.top = top + 'px';\n        },\n\n        /**\n         * render HTML for a particular month\n         */\n        render: function(year, month, randId)\n        {\n            var opts   = this._o,\n                now    = new Date(),\n                days   = getDaysInMonth(year, month),\n                before = new Date(year, month, 1).getDay(),\n                data   = [],\n                row    = [];\n            setToStartOfDay(now);\n            if (opts.firstDay > 0) {\n                before -= opts.firstDay;\n                if (before < 0) {\n                    before += 7;\n                }\n            }\n            var previousMonth = month === 0 ? 11 : month - 1,\n                nextMonth = month === 11 ? 0 : month + 1,\n                yearOfPreviousMonth = month === 0 ? year - 1 : year,\n                yearOfNextMonth = month === 11 ? year + 1 : year,\n                daysInPreviousMonth = getDaysInMonth(yearOfPreviousMonth, previousMonth);\n            var cells = days + before,\n                after = cells;\n            while(after > 7) {\n                after -= 7;\n            }\n            cells += 7 - after;\n            for (var i = 0, r = 0; i < cells; i++)\n            {\n                var day = new Date(year, month, 1 + (i - before)),\n                    isSelected = isDate(this._d) ? compareDates(day, this._d) : false,\n                    isToday = compareDates(day, now),\n                    isEmpty = i < before || i >= (days + before),\n                    dayNumber = 1 + (i - before),\n                    monthNumber = month,\n                    yearNumber = year,\n                    isStartRange = opts.startRange && compareDates(opts.startRange, day),\n                    isEndRange = opts.endRange && compareDates(opts.endRange, day),\n                    isInRange = opts.startRange && opts.endRange && opts.startRange < day && day < opts.endRange,\n                    isDisabled = (opts.minDate && day < opts.minDate) ||\n                                 (opts.maxDate && day > opts.maxDate) ||\n                                 (opts.disableWeekends && isWeekend(day)) ||\n                                 (opts.disableDayFn && opts.disableDayFn(day));\n\n                if (isEmpty) {\n                    if (i < before) {\n                        dayNumber = daysInPreviousMonth + dayNumber;\n                        monthNumber = previousMonth;\n                        yearNumber = yearOfPreviousMonth;\n                    } else {\n                        dayNumber = dayNumber - days;\n                        monthNumber = nextMonth;\n                        yearNumber = yearOfNextMonth;\n                    }\n                }\n\n                var dayConfig = {\n                        day: dayNumber,\n                        month: monthNumber,\n                        year: yearNumber,\n                        isSelected: isSelected,\n                        isToday: isToday,\n                        isDisabled: isDisabled,\n                        isEmpty: isEmpty,\n                        isStartRange: isStartRange,\n                        isEndRange: isEndRange,\n                        isInRange: isInRange,\n                        showDaysInNextAndPreviousMonths: opts.showDaysInNextAndPreviousMonths\n                    };\n\n                row.push(renderDay(dayConfig));\n\n                if (++r === 7) {\n                    if (opts.showWeekNumber) {\n                        row.unshift(renderWeek(i - before, month, year));\n                    }\n                    data.push(renderRow(row, opts.isRTL));\n                    row = [];\n                    r = 0;\n                }\n            }\n            return renderTable(opts, data, randId);\n        },\n\n        isVisible: function()\n        {\n            return this._v;\n        },\n\n        show: function()\n        {\n            if (!this.isVisible()) {\n                removeClass(this.el, 'is-hidden');\n                this._v = true;\n                this.draw();\n                if (this._o.bound) {\n                    addEvent(document, 'click', this._onClick);\n                    this.adjustPosition();\n                }\n                if (typeof this._o.onOpen === 'function') {\n                    this._o.onOpen.call(this);\n                }\n            }\n        },\n\n        hide: function()\n        {\n            var v = this._v;\n            if (v !== false) {\n                if (this._o.bound) {\n                    removeEvent(document, 'click', this._onClick);\n                }\n                this.el.style.position = 'static'; // reset\n                this.el.style.left = 'auto';\n                this.el.style.top = 'auto';\n                addClass(this.el, 'is-hidden');\n                this._v = false;\n                if (v !== undefined && typeof this._o.onClose === 'function') {\n                    this._o.onClose.call(this);\n                }\n            }\n        },\n\n        /**\n         * GAME OVER\n         */\n        destroy: function()\n        {\n            this.hide();\n            removeEvent(this.el, 'mousedown', this._onMouseDown, true);\n            removeEvent(this.el, 'touchend', this._onMouseDown, true);\n            removeEvent(this.el, 'change', this._onChange);\n            if (this._o.field) {\n                removeEvent(this._o.field, 'change', this._onInputChange);\n                if (this._o.bound) {\n                    removeEvent(this._o.trigger, 'click', this._onInputClick);\n                    removeEvent(this._o.trigger, 'focus', this._onInputFocus);\n                    removeEvent(this._o.trigger, 'blur', this._onInputBlur);\n                }\n            }\n            if (this.el.parentNode) {\n                this.el.parentNode.removeChild(this.el);\n            }\n        }\n\n    };\n\n    return Pikaday;\n\n}));\n\n\n/***/ }),\n/* 359 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 360 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _autocompleteEditor = __webpack_require__(307);\n\nvar _autocompleteEditor2 = _interopRequireDefault(_autocompleteEditor);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor DropdownEditor\n * @class DropdownEditor\n * @dependencies AutocompleteEditor\n */\nvar DropdownEditor = function (_AutocompleteEditor) {\n  _inherits(DropdownEditor, _AutocompleteEditor);\n\n  function DropdownEditor() {\n    _classCallCheck(this, DropdownEditor);\n\n    return _possibleConstructorReturn(this, (DropdownEditor.__proto__ || Object.getPrototypeOf(DropdownEditor)).apply(this, arguments));\n  }\n\n  _createClass(DropdownEditor, [{\n    key: 'prepare',\n    value: function prepare(row, col, prop, td, originalValue, cellProperties) {\n      _get(DropdownEditor.prototype.__proto__ || Object.getPrototypeOf(DropdownEditor.prototype), 'prepare', this).call(this, row, col, prop, td, originalValue, cellProperties);\n      this.cellProperties.filter = false;\n      this.cellProperties.strict = true;\n    }\n  }]);\n\n  return DropdownEditor;\n}(_autocompleteEditor2.default);\n\n_pluginHooks2.default.getSingleton().add('beforeValidate', function (value, row, col, source) {\n  var cellMeta = this.getCellMeta(row, this.propToCol(col));\n\n  if (cellMeta.editor === DropdownEditor) {\n    if (cellMeta.strict === void 0) {\n      cellMeta.filter = false;\n      cellMeta.strict = true;\n    }\n  }\n});\n\nexports.default = DropdownEditor;\n\n/***/ }),\n/* 361 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor NumericEditor\n * @class NumericEditor\n */\nvar NumericEditor = function (_TextEditor) {\n  _inherits(NumericEditor, _TextEditor);\n\n  function NumericEditor() {\n    _classCallCheck(this, NumericEditor);\n\n    return _possibleConstructorReturn(this, (NumericEditor.__proto__ || Object.getPrototypeOf(NumericEditor)).apply(this, arguments));\n  }\n\n  return NumericEditor;\n}(_textEditor2.default);\n\nexports.default = NumericEditor;\n\n/***/ }),\n/* 362 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _element = __webpack_require__(0);\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor PasswordEditor\n * @class PasswordEditor\n * @dependencies TextEditor\n */\nvar PasswordEditor = function (_TextEditor) {\n  _inherits(PasswordEditor, _TextEditor);\n\n  function PasswordEditor() {\n    _classCallCheck(this, PasswordEditor);\n\n    return _possibleConstructorReturn(this, (PasswordEditor.__proto__ || Object.getPrototypeOf(PasswordEditor)).apply(this, arguments));\n  }\n\n  _createClass(PasswordEditor, [{\n    key: 'createElements',\n    value: function createElements() {\n      _get(PasswordEditor.prototype.__proto__ || Object.getPrototypeOf(PasswordEditor.prototype), 'createElements', this).call(this);\n\n      this.TEXTAREA = document.createElement('input');\n      this.TEXTAREA.setAttribute('type', 'password');\n      this.TEXTAREA.className = 'handsontableInput';\n      this.textareaStyle = this.TEXTAREA.style;\n      this.textareaStyle.width = 0;\n      this.textareaStyle.height = 0;\n\n      (0, _element.empty)(this.TEXTAREA_PARENT);\n      this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n    }\n  }]);\n\n  return PasswordEditor;\n}(_textEditor2.default);\n\nexports.default = PasswordEditor;\n\n/***/ }),\n/* 363 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _element = __webpack_require__(0);\n\nvar _event = __webpack_require__(12);\n\nvar _unicode = __webpack_require__(21);\n\nvar _baseEditor = __webpack_require__(54);\n\nvar _baseEditor2 = _interopRequireDefault(_baseEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SelectEditor = _baseEditor2.default.prototype.extend();\n\n/**\n * @private\n * @editor SelectEditor\n * @class SelectEditor\n */\nSelectEditor.prototype.init = function () {\n  this.select = document.createElement('SELECT');\n  (0, _element.addClass)(this.select, 'htSelectEditor');\n  this.select.style.display = 'none';\n  this.instance.rootElement.appendChild(this.select);\n  this.registerHooks();\n};\n\nSelectEditor.prototype.registerHooks = function () {\n  var _this = this;\n\n  this.instance.addHook('afterScrollHorizontally', function () {\n    return _this.refreshDimensions();\n  });\n  this.instance.addHook('afterScrollVertically', function () {\n    return _this.refreshDimensions();\n  });\n  this.instance.addHook('afterColumnResize', function () {\n    return _this.refreshDimensions();\n  });\n  this.instance.addHook('afterRowResize', function () {\n    return _this.refreshDimensions();\n  });\n};\n\nSelectEditor.prototype.prepare = function () {\n  _baseEditor2.default.prototype.prepare.apply(this, arguments);\n\n  var selectOptions = this.cellProperties.selectOptions;\n  var options;\n\n  if (typeof selectOptions == 'function') {\n    options = this.prepareOptions(selectOptions(this.row, this.col, this.prop));\n  } else {\n    options = this.prepareOptions(selectOptions);\n  }\n\n  (0, _element.empty)(this.select);\n\n  for (var option in options) {\n    if (Object.prototype.hasOwnProperty.call(options, option)) {\n      var optionElement = document.createElement('OPTION');\n      optionElement.value = option;\n      (0, _element.fastInnerHTML)(optionElement, options[option]);\n      this.select.appendChild(optionElement);\n    }\n  }\n};\n\nSelectEditor.prototype.prepareOptions = function (optionsToPrepare) {\n  var preparedOptions = {};\n\n  if (Array.isArray(optionsToPrepare)) {\n    for (var i = 0, len = optionsToPrepare.length; i < len; i++) {\n      preparedOptions[optionsToPrepare[i]] = optionsToPrepare[i];\n    }\n  } else if ((typeof optionsToPrepare === 'undefined' ? 'undefined' : _typeof(optionsToPrepare)) == 'object') {\n    preparedOptions = optionsToPrepare;\n  }\n\n  return preparedOptions;\n};\n\nSelectEditor.prototype.getValue = function () {\n  return this.select.value;\n};\n\nSelectEditor.prototype.setValue = function (value) {\n  this.select.value = value;\n};\n\nvar onBeforeKeyDown = function onBeforeKeyDown(event) {\n  var instance = this;\n  var editor = instance.getActiveEditor();\n\n  switch (event.keyCode) {\n    case _unicode.KEY_CODES.ARROW_UP:\n      var previousOptionIndex = editor.select.selectedIndex - 1;\n      if (previousOptionIndex >= 0) {\n        editor.select[previousOptionIndex].selected = true;\n      }\n\n      (0, _event.stopImmediatePropagation)(event);\n      event.preventDefault();\n      break;\n\n    case _unicode.KEY_CODES.ARROW_DOWN:\n      var nextOptionIndex = editor.select.selectedIndex + 1;\n      if (nextOptionIndex <= editor.select.length - 1) {\n        editor.select[nextOptionIndex].selected = true;\n      }\n\n      (0, _event.stopImmediatePropagation)(event);\n      event.preventDefault();\n      break;\n    default:\n      break;\n  }\n};\n\nSelectEditor.prototype.open = function () {\n  this._opened = true;\n  this.refreshDimensions();\n  this.select.style.display = '';\n  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);\n};\n\nSelectEditor.prototype.close = function () {\n  this._opened = false;\n  this.select.style.display = 'none';\n  this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n};\n\nSelectEditor.prototype.focus = function () {\n  this.select.focus();\n};\n\nSelectEditor.prototype.refreshValue = function () {\n  var sourceData = this.instance.getSourceDataAtCell(this.row, this.prop);\n  this.originalValue = sourceData;\n\n  this.setValue(sourceData);\n  this.refreshDimensions();\n};\n\nSelectEditor.prototype.refreshDimensions = function () {\n  if (this.state !== _baseEditor.EditorState.EDITING) {\n    return;\n  }\n  this.TD = this.getEditedCell();\n\n  // TD is outside of the viewport.\n  if (!this.TD) {\n    this.close();\n\n    return;\n  }\n  var width = (0, _element.outerWidth)(this.TD) + 1,\n      height = (0, _element.outerHeight)(this.TD) + 1,\n      currentOffset = (0, _element.offset)(this.TD),\n      containerOffset = (0, _element.offset)(this.instance.rootElement),\n      scrollableContainer = (0, _element.getScrollableElement)(this.TD),\n      editTop = currentOffset.top - containerOffset.top - 1 - (scrollableContainer.scrollTop || 0),\n      editLeft = currentOffset.left - containerOffset.left - 1 - (scrollableContainer.scrollLeft || 0),\n      editorSection = this.checkEditorSection(),\n      cssTransformOffset;\n\n  var settings = this.instance.getSettings();\n  var rowHeadersCount = settings.rowHeaders ? 1 : 0;\n  var colHeadersCount = settings.colHeaders ? 1 : 0;\n\n  switch (editorSection) {\n    case 'top':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'left':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'top-left-corner':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'bottom-left-corner':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'bottom':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.holder.parentNode);\n      break;\n    default:\n      break;\n  }\n  if (this.instance.getSelectedLast()[0] === 0) {\n    editTop += 1;\n  }\n\n  if (this.instance.getSelectedLast()[1] === 0) {\n    editLeft += 1;\n  }\n\n  var selectStyle = this.select.style;\n\n  if (cssTransformOffset && cssTransformOffset != -1) {\n    selectStyle[cssTransformOffset[0]] = cssTransformOffset[1];\n  } else {\n    (0, _element.resetCssTransform)(this.select);\n  }\n  var cellComputedStyle = (0, _element.getComputedStyle)(this.TD);\n\n  if (parseInt(cellComputedStyle.borderTopWidth, 10) > 0) {\n    height -= 1;\n  }\n  if (parseInt(cellComputedStyle.borderLeftWidth, 10) > 0) {\n    width -= 1;\n  }\n\n  selectStyle.height = height + 'px';\n  selectStyle.minWidth = width + 'px';\n  selectStyle.top = editTop + 'px';\n  selectStyle.left = editLeft + 'px';\n  selectStyle.margin = '0px';\n};\n\nSelectEditor.prototype.getEditedCell = function () {\n  var editorSection = this.checkEditorSection(),\n      editedCell;\n\n  switch (editorSection) {\n    case 'top':\n      editedCell = this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.select.style.zIndex = 101;\n      break;\n    case 'corner':\n      editedCell = this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.select.style.zIndex = 103;\n      break;\n    case 'left':\n      editedCell = this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.select.style.zIndex = 102;\n      break;\n    default:\n      editedCell = this.instance.getCell(this.row, this.col);\n      this.select.style.zIndex = '';\n      break;\n  }\n\n  return editedCell != -1 && editedCell != -2 ? editedCell : void 0;\n};\n\nexports.default = SelectEditor;\n\n/***/ }),\n/* 364 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nfunction cellDecorator(instance, TD, row, col, prop, value, cellProperties) {\n  var classesToAdd = [];\n  var classesToRemove = [];\n\n  if (cellProperties.className) {\n    if (TD.className) {\n      TD.className = TD.className + ' ' + cellProperties.className;\n    } else {\n      TD.className = cellProperties.className;\n    }\n  }\n\n  if (cellProperties.readOnly) {\n    classesToAdd.push(cellProperties.readOnlyCellClassName);\n  }\n\n  if (cellProperties.valid === false && cellProperties.invalidCellClassName) {\n    classesToAdd.push(cellProperties.invalidCellClassName);\n  } else {\n    classesToRemove.push(cellProperties.invalidCellClassName);\n  }\n\n  if (cellProperties.wordWrap === false && cellProperties.noWordWrapClassName) {\n    classesToAdd.push(cellProperties.noWordWrapClassName);\n  }\n\n  if (!value && cellProperties.placeholder) {\n    classesToAdd.push(cellProperties.placeholderCellClassName);\n  }\n\n  (0, _element.removeClass)(TD, classesToRemove);\n  (0, _element.addClass)(TD, classesToAdd);\n} /**\n   * Adds appropriate CSS class to table cell, based on cellProperties\n   */\nexports.default = cellDecorator;\n\n/***/ }),\n/* 365 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _src = __webpack_require__(4);\n\nvar _index = __webpack_require__(13);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar clonableWRAPPER = document.createElement('DIV');\nclonableWRAPPER.className = 'htAutocompleteWrapper';\n\nvar clonableARROW = document.createElement('DIV');\nclonableARROW.className = 'htAutocompleteArrow';\n// workaround for https://github.com/handsontable/handsontable/issues/1946\n// this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\nclonableARROW.appendChild(document.createTextNode(String.fromCharCode(9660)));\n\nvar wrapTdContentWithWrapper = function wrapTdContentWithWrapper(TD, WRAPPER) {\n  WRAPPER.innerHTML = TD.innerHTML;\n  (0, _element.empty)(TD);\n  TD.appendChild(WRAPPER);\n};\n\n/**\n * Autocomplete renderer\n *\n * @private\n * @renderer AutocompleteRenderer\n * @param {Object} instance Handsontable instance\n * @param {Element} TD Table cell where to render\n * @param {Number} row\n * @param {Number} col\n * @param {String|Number} prop Row object property name\n * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)\n * @param {Object} cellProperties Cell properites (shared by cell renderer and editor)\n */\nfunction autocompleteRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  var WRAPPER = clonableWRAPPER.cloneNode(true); // this is faster than createElement\n  var ARROW = clonableARROW.cloneNode(true); // this is faster than createElement\n\n  if (cellProperties.allowHtml) {\n    (0, _index.getRenderer)('html').apply(this, arguments);\n  } else {\n    (0, _index.getRenderer)('text').apply(this, arguments);\n  }\n\n  TD.appendChild(ARROW);\n  (0, _element.addClass)(TD, 'htAutocomplete');\n\n  if (!TD.firstChild) {\n    // http://jsperf.com/empty-node-if-needed\n    // otherwise empty fields appear borderless in demo/renderers.html (IE)\n    TD.appendChild(document.createTextNode(String.fromCharCode(160))); // workaround for https://github.com/handsontable/handsontable/issues/1946\n    // this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\n  }\n\n  if (!instance.acArrowListener) {\n    var eventManager = new _eventManager2.default(instance);\n\n    // not very elegant but easy and fast\n    instance.acArrowListener = function (event) {\n      if ((0, _element.hasClass)(event.target, 'htAutocompleteArrow')) {\n        instance.view.wt.getSetting('onCellDblClick', null, new _src.CellCoords(row, col), TD);\n      }\n    };\n\n    eventManager.addEventListener(instance.rootElement, 'mousedown', instance.acArrowListener);\n\n    // We need to unbind the listener after the table has been destroyed\n    instance.addHookOnce('afterDestroy', function () {\n      eventManager.destroy();\n    });\n  }\n}\n\nexports.default = autocompleteRenderer;\n\n/***/ }),\n/* 366 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _string = __webpack_require__(36);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _unicode = __webpack_require__(21);\n\nvar _function = __webpack_require__(43);\n\nvar _event = __webpack_require__(12);\n\nvar _index = __webpack_require__(13);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar isListeningKeyDownEvent = new WeakMap();\nvar isCheckboxListenerAdded = new WeakMap();\nvar BAD_VALUE_CLASS = 'htBadValue';\n\n/**\n * Checkbox renderer\n *\n * @private\n * @param {Object} instance Handsontable instance\n * @param {Element} TD Table cell where to render\n * @param {Number} row\n * @param {Number} col\n * @param {String|Number} prop Row object property name\n * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)\n * @param {Object} cellProperties Cell properties (shared by cell renderer and editor)\n */\nfunction checkboxRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  (0, _index.getRenderer)('base').apply(this, arguments);\n\n  var eventManager = registerEvents(instance);\n  var input = createInput();\n  var labelOptions = cellProperties.label;\n  var badValue = false;\n\n  if (typeof cellProperties.checkedTemplate === 'undefined') {\n    cellProperties.checkedTemplate = true;\n  }\n  if (typeof cellProperties.uncheckedTemplate === 'undefined') {\n    cellProperties.uncheckedTemplate = false;\n  }\n\n  (0, _element.empty)(TD); // TODO identify under what circumstances this line can be removed\n\n  if (value === cellProperties.checkedTemplate || (0, _string.equalsIgnoreCase)(value, cellProperties.checkedTemplate)) {\n    input.checked = true;\n  } else if (value === cellProperties.uncheckedTemplate || (0, _string.equalsIgnoreCase)(value, cellProperties.uncheckedTemplate)) {\n    input.checked = false;\n  } else if (value === null) {\n    // default value\n    (0, _element.addClass)(input, 'noValue');\n  } else {\n    input.style.display = 'none';\n    (0, _element.addClass)(input, BAD_VALUE_CLASS);\n    badValue = true;\n  }\n\n  input.setAttribute('data-row', row);\n  input.setAttribute('data-col', col);\n\n  if (!badValue && labelOptions) {\n    var labelText = '';\n\n    if (labelOptions.value) {\n      labelText = typeof labelOptions.value === 'function' ? labelOptions.value.call(this, row, col, prop, value) : labelOptions.value;\n    } else if (labelOptions.property) {\n      labelText = instance.getDataAtRowProp(row, labelOptions.property);\n    }\n    var label = createLabel(labelText);\n\n    if (labelOptions.position === 'before') {\n      label.appendChild(input);\n    } else {\n      label.insertBefore(input, label.firstChild);\n    }\n    input = label;\n  }\n\n  TD.appendChild(input);\n\n  if (badValue) {\n    TD.appendChild(document.createTextNode('#bad-value#'));\n  }\n\n  if (!isListeningKeyDownEvent.has(instance)) {\n    isListeningKeyDownEvent.set(instance, true);\n    instance.addHook('beforeKeyDown', onBeforeKeyDown);\n  }\n\n  /**\n   * On before key down DOM listener.\n   *\n   * @private\n   * @param {Event} event\n   */\n  function onBeforeKeyDown(event) {\n    var toggleKeys = 'SPACE|ENTER';\n    var switchOffKeys = 'DELETE|BACKSPACE';\n    var isKeyCode = (0, _function.partial)(_unicode.isKey, event.keyCode);\n\n    if (isKeyCode(toggleKeys + '|' + switchOffKeys) && !(0, _event.isImmediatePropagationStopped)(event)) {\n      eachSelectedCheckboxCell(function () {\n        (0, _event.stopImmediatePropagation)(event);\n        event.preventDefault();\n      });\n    }\n    if (isKeyCode(toggleKeys)) {\n      changeSelectedCheckboxesState();\n    }\n    if (isKeyCode(switchOffKeys)) {\n      changeSelectedCheckboxesState(true);\n    }\n  }\n\n  /**\n   * Change checkbox checked property\n   *\n   * @private\n   * @param {Boolean} [uncheckCheckbox=false]\n   */\n  function changeSelectedCheckboxesState() {\n    var uncheckCheckbox = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n    var selRange = instance.getSelectedRangeLast();\n\n    if (!selRange) {\n      return;\n    }\n\n    var _selRange$getTopLeftC = selRange.getTopLeftCorner(),\n        startRow = _selRange$getTopLeftC.row,\n        startColumn = _selRange$getTopLeftC.col;\n\n    var _selRange$getBottomRi = selRange.getBottomRightCorner(),\n        endRow = _selRange$getBottomRi.row,\n        endColumn = _selRange$getBottomRi.col;\n\n    var changes = [];\n\n    for (var _row = startRow; _row <= endRow; _row += 1) {\n      for (var _col = startColumn; _col <= endColumn; _col += 1) {\n        var _cellProperties = instance.getCellMeta(_row, _col);\n\n        if (_cellProperties.type !== 'checkbox') {\n          return;\n        }\n\n        /* eslint-disable no-continue */\n        if (_cellProperties.readOnly === true) {\n          continue;\n        }\n\n        if (typeof _cellProperties.checkedTemplate === 'undefined') {\n          _cellProperties.checkedTemplate = true;\n        }\n        if (typeof _cellProperties.uncheckedTemplate === 'undefined') {\n          _cellProperties.uncheckedTemplate = false;\n        }\n\n        var dataAtCell = instance.getDataAtCell(_row, _col);\n\n        if (uncheckCheckbox === false) {\n          if ([_cellProperties.checkedTemplate, _cellProperties.checkedTemplate.toString()].includes(dataAtCell)) {\n            changes.push([_row, _col, _cellProperties.uncheckedTemplate]);\n          } else if ([_cellProperties.uncheckedTemplate, _cellProperties.uncheckedTemplate.toString(), null, void 0].includes(dataAtCell)) {\n            changes.push([_row, _col, _cellProperties.checkedTemplate]);\n          }\n        } else {\n          changes.push([_row, _col, _cellProperties.uncheckedTemplate]);\n        }\n      }\n    }\n\n    if (changes.length > 0) {\n      instance.setDataAtCell(changes);\n    }\n  }\n\n  /**\n   * Call callback for each found selected cell with checkbox type.\n   *\n   * @private\n   * @param {Function} callback\n   */\n  function eachSelectedCheckboxCell(callback) {\n    var selRange = instance.getSelectedRangeLast();\n\n    if (!selRange) {\n      return;\n    }\n    var topLeft = selRange.getTopLeftCorner();\n    var bottomRight = selRange.getBottomRightCorner();\n\n    for (var _row2 = topLeft.row; _row2 <= bottomRight.row; _row2++) {\n      for (var _col2 = topLeft.col; _col2 <= bottomRight.col; _col2++) {\n        var _cellProperties2 = instance.getCellMeta(_row2, _col2);\n\n        if (_cellProperties2.type !== 'checkbox') {\n          return;\n        }\n\n        var cell = instance.getCell(_row2, _col2);\n\n        if (cell == null) {\n\n          callback(_row2, _col2, _cellProperties2);\n        } else {\n          var checkboxes = cell.querySelectorAll('input[type=checkbox]');\n\n          if (checkboxes.length > 0 && !_cellProperties2.readOnly) {\n            callback(checkboxes);\n          }\n        }\n      }\n    }\n  }\n}\n\n/**\n * Register checkbox listeners.\n *\n * @param {Handsontable} instance Handsontable instance.\n * @returns {EventManager}\n */\nfunction registerEvents(instance) {\n  var eventManager = isCheckboxListenerAdded.get(instance);\n\n  if (!eventManager) {\n    eventManager = new _eventManager2.default(instance);\n    eventManager.addEventListener(instance.rootElement, 'click', function (event) {\n      return onClick(event, instance);\n    });\n    eventManager.addEventListener(instance.rootElement, 'mouseup', function (event) {\n      return onMouseUp(event, instance);\n    });\n    eventManager.addEventListener(instance.rootElement, 'change', function (event) {\n      return onChange(event, instance);\n    });\n\n    isCheckboxListenerAdded.set(instance, eventManager);\n  }\n\n  return eventManager;\n}\n\n/**\n * Create input element.\n *\n * @returns {Node}\n */\nfunction createInput() {\n  var input = document.createElement('input');\n\n  input.className = 'htCheckboxRendererInput';\n  input.type = 'checkbox';\n  input.setAttribute('autocomplete', 'off');\n  input.setAttribute('tabindex', '-1');\n\n  return input.cloneNode(false);\n}\n\n/**\n * Create label element.\n *\n * @returns {Node}\n */\nfunction createLabel(text) {\n  var label = document.createElement('label');\n\n  label.className = 'htCheckboxRendererLabel';\n  label.appendChild(document.createTextNode(text));\n\n  return label.cloneNode(true);\n}\n\n/**\n * `mouseup` callback.\n *\n * @private\n * @param {Event} event `mouseup` event.\n * @param {Object} instance Handsontable instance.\n */\nfunction onMouseUp(event, instance) {\n  if (!isCheckboxInput(event.target)) {\n    return;\n  }\n  setTimeout(instance.listen, 10);\n}\n\n/**\n * `click` callback.\n *\n * @private\n * @param {Event} event `click` event.\n * @param {Object} instance Handsontable instance.\n */\nfunction onClick(event, instance) {\n  if (!isCheckboxInput(event.target)) {\n    return false;\n  }\n\n  var row = parseInt(event.target.getAttribute('data-row'), 10);\n  var col = parseInt(event.target.getAttribute('data-col'), 10);\n  var cellProperties = instance.getCellMeta(row, col);\n\n  if (cellProperties.readOnly) {\n    event.preventDefault();\n  }\n}\n\n/**\n * `change` callback.\n *\n * @param {Event} event `change` event.\n * @param {Object} instance Handsontable instance.\n * @param {Object} cellProperties Reference to cell properties.\n * @returns {Boolean}\n */\nfunction onChange(event, instance) {\n  if (!isCheckboxInput(event.target)) {\n    return false;\n  }\n\n  var row = parseInt(event.target.getAttribute('data-row'), 10);\n  var col = parseInt(event.target.getAttribute('data-col'), 10);\n  var cellProperties = instance.getCellMeta(row, col);\n\n  if (!cellProperties.readOnly) {\n    var newCheckboxValue = null;\n\n    if (event.target.checked) {\n      newCheckboxValue = cellProperties.uncheckedTemplate === void 0 ? true : cellProperties.checkedTemplate;\n    } else {\n      newCheckboxValue = cellProperties.uncheckedTemplate === void 0 ? false : cellProperties.uncheckedTemplate;\n    }\n\n    instance.setDataAtCell(row, col, newCheckboxValue);\n  }\n}\n\n/**\n * Check if the provided element is the checkbox input.\n *\n * @private\n * @param {HTMLElement} element The element in question.\n * @returns {Boolean}\n */\nfunction isCheckboxInput(element) {\n  return element.tagName === 'INPUT' && element.getAttribute('type') === 'checkbox';\n}\n\nexports.default = checkboxRenderer;\n\n/***/ }),\n/* 367 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _index = __webpack_require__(13);\n\n/**\n * @private\n * @renderer HtmlRenderer\n * @param instance\n * @param TD\n * @param row\n * @param col\n * @param prop\n * @param value\n * @param cellProperties\n */\nfunction htmlRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  (0, _index.getRenderer)('base').apply(this, arguments);\n\n  if (value === null || value === void 0) {\n    value = '';\n  }\n\n  (0, _element.fastInnerHTML)(TD, value);\n}\n\nexports.default = htmlRenderer;\n\n/***/ }),\n/* 368 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _numbro = __webpack_require__(309);\n\nvar _numbro2 = _interopRequireDefault(_numbro);\n\nvar _index = __webpack_require__(13);\n\nvar _number = __webpack_require__(5);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Numeric cell renderer\n *\n * @private\n * @renderer NumericRenderer\n * @dependencies numbro\n * @param {Object} instance Handsontable instance\n * @param {Element} TD Table cell where to render\n * @param {Number} row\n * @param {Number} col\n * @param {String|Number} prop Row object property name\n * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)\n * @param {Object} cellProperties Cell properties (shared by cell renderer and editor)\n */\nfunction numericRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  if ((0, _number.isNumeric)(value)) {\n    var numericFormat = cellProperties.numericFormat;\n    var cellCulture = numericFormat && numericFormat.culture;\n    var cellFormatPattern = numericFormat && numericFormat.pattern;\n    var className = cellProperties.className || '';\n    var classArr = className.length ? className.split(' ') : [];\n\n    if (typeof cellCulture !== 'undefined') {\n      _numbro2.default.culture(cellCulture);\n    }\n\n    value = (0, _numbro2.default)(value).format(cellFormatPattern || '0');\n\n    if (classArr.indexOf('htLeft') < 0 && classArr.indexOf('htCenter') < 0 && classArr.indexOf('htRight') < 0 && classArr.indexOf('htJustify') < 0) {\n      classArr.push('htRight');\n    }\n\n    if (classArr.indexOf('htNumeric') < 0) {\n      classArr.push('htNumeric');\n    }\n\n    cellProperties.className = classArr.join(' ');\n  }\n\n  (0, _index.getRenderer)('text')(instance, TD, row, col, prop, value, cellProperties);\n}\n\nexports.default = numericRenderer;\n\n/***/ }),\n/* 369 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 370 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _index = __webpack_require__(13);\n\nvar _number = __webpack_require__(5);\n\n/**\n * @private\n * @renderer PasswordRenderer\n * @param instance\n * @param TD\n * @param row\n * @param col\n * @param prop\n * @param value\n * @param cellProperties\n */\nfunction passwordRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  (0, _index.getRenderer)('text').apply(this, arguments);\n\n  value = TD.innerHTML;\n\n  var hashLength = cellProperties.hashLength || value.length;\n  var hashSymbol = cellProperties.hashSymbol || '*';\n\n  var hash = '';\n\n  (0, _number.rangeEach)(hashLength - 1, function () {\n    hash += hashSymbol;\n  });\n  (0, _element.fastInnerHTML)(TD, hash);\n}\n\nexports.default = passwordRenderer;\n\n/***/ }),\n/* 371 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _mixed = __webpack_require__(16);\n\nvar _index = __webpack_require__(13);\n\n/**\n * Default text renderer\n *\n * @private\n * @renderer TextRenderer\n * @param {Object} instance Handsontable instance\n * @param {Element} TD Table cell where to render\n * @param {Number} row\n * @param {Number} col\n * @param {String|Number} prop Row object property name\n * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)\n * @param {Object} cellProperties Cell properties (shared by cell renderer and editor)\n */\nfunction textRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  (0, _index.getRenderer)('base').apply(this, arguments);\n\n  if (!value && cellProperties.placeholder) {\n    value = cellProperties.placeholder;\n  }\n\n  var escaped = (0, _mixed.stringify)(value);\n\n  if (!instance.getSettings().trimWhitespace) {\n    escaped = escaped.replace(/ /g, String.fromCharCode(160));\n  }\n\n  if (cellProperties.rendererTemplate) {\n    (0, _element.empty)(TD);\n    var TEMPLATE = document.createElement('TEMPLATE');\n    TEMPLATE.setAttribute('bind', '{{}}');\n    TEMPLATE.innerHTML = cellProperties.rendererTemplate;\n    HTMLTemplateElement.decorate(TEMPLATE);\n    TEMPLATE.model = instance.getSourceDataAtRow(row);\n    TD.appendChild(TEMPLATE);\n  } else {\n    // this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\n    (0, _element.fastInnerText)(TD, escaped);\n  }\n}\n\nexports.default = textRenderer;\n\n/***/ }),\n/* 372 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = autocompleteValidator;\n/**\n * Autocomplete cell validator.\n *\n * @private\n * @validator AutocompleteValidator\n * @param {*} value - Value of edited cell\n * @param {Function} callback - Callback called with validation result\n */\nfunction autocompleteValidator(value, callback) {\n  if (value == null) {\n    value = '';\n  }\n\n  if (this.allowEmpty && value === '') {\n    callback(true);\n\n    return;\n  }\n\n  if (this.strict && this.source) {\n    if (typeof this.source === 'function') {\n      this.source(value, process(value, callback));\n    } else {\n      process(value, callback)(this.source);\n    }\n  } else {\n    callback(true);\n  }\n};\n\n/**\n * Function responsible for validation of autocomplete value.\n *\n * @param {*} value - Value of edited cell\n * @param {Function} callback - Callback called with validation result\n */\nfunction process(value, callback) {\n  var originalVal = value;\n\n  return function (source) {\n    var found = false;\n\n    for (var s = 0, slen = source.length; s < slen; s++) {\n      if (originalVal === source[s]) {\n        found = true; // perfect match\n        break;\n      }\n    }\n\n    callback(found);\n  };\n}\n\n/***/ }),\n/* 373 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = dateValidator;\nexports.correctFormat = correctFormat;\n\nvar _moment = __webpack_require__(41);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _date = __webpack_require__(310);\n\nvar _editors = __webpack_require__(17);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Date cell validator\n *\n * @private\n * @validator DateValidator\n * @dependencies moment\n * @param {*} value - Value of edited cell\n * @param {Function} callback - Callback called with validation result\n */\nfunction dateValidator(value, callback) {\n  var valid = true;\n  var dateEditor = (0, _editors.getEditorInstance)('date', this.instance);\n\n  if (value == null) {\n    value = '';\n  }\n  var isValidDate = (0, _moment2.default)(new Date(value)).isValid() || (0, _moment2.default)(value, dateEditor.defaultDateFormat).isValid();\n  // is it in the specified format\n  var isValidFormat = (0, _moment2.default)(value, this.dateFormat || dateEditor.defaultDateFormat, true).isValid();\n\n  if (this.allowEmpty && value === '') {\n    isValidDate = true;\n    isValidFormat = true;\n  }\n  if (!isValidDate) {\n    valid = false;\n  }\n  if (!isValidDate && isValidFormat) {\n    valid = true;\n  }\n\n  if (isValidDate && !isValidFormat) {\n    if (this.correctFormat === true) {\n      // if format correction is enabled\n      var correctedValue = correctFormat(value, this.dateFormat);\n      var row = this.instance.runHooks('unmodifyRow', this.row);\n      var column = this.instance.runHooks('unmodifyCol', this.col);\n\n      this.instance.setDataAtCell(row, column, correctedValue, 'dateValidator');\n      valid = true;\n    } else {\n      valid = false;\n    }\n  }\n\n  callback(valid);\n};\n\n/**\n * Format the given string using moment.js' format feature\n *\n * @param {String} value\n * @param {String} dateFormat\n * @returns {String}\n */\nfunction correctFormat(value, dateFormat) {\n  var dateFromDate = (0, _moment2.default)((0, _date.getNormalizedDate)(value));\n  var dateFromMoment = (0, _moment2.default)(value, dateFormat);\n  var isAlphanumeric = value.search(/[A-z]/g) > -1;\n  var date = void 0;\n\n  if (dateFromDate.isValid() && dateFromDate.format('x') === dateFromMoment.format('x') || !dateFromMoment.isValid() || isAlphanumeric) {\n    date = dateFromDate;\n  } else {\n    date = dateFromMoment;\n  }\n\n  return date.format(dateFormat);\n};\n\n/***/ }),\n/* 374 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = numericValidator;\n/**\n * Numeric cell validator\n *\n * @private\n * @validator NumericValidator\n * @param {*} value - Value of edited cell\n * @param {*} callback - Callback called with validation result\n */\nfunction numericValidator(value, callback) {\n  if (value == null) {\n    value = '';\n  }\n  if (this.allowEmpty && value === '') {\n    callback(true);\n  } else if (value === '') {\n    callback(false);\n  } else {\n    callback(/^-?\\d*(\\.|,)?\\d*$/.test(value));\n  }\n};\n\n/***/ }),\n/* 375 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = timeValidator;\n\nvar _moment = __webpack_require__(41);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Formats which are correctly parsed to time (supported by momentjs)\nvar STRICT_FORMATS = ['YYYY-MM-DDTHH:mm:ss.SSSZ', 'X', // Unix timestamp\n'x' // Unix ms timestamp\n];\n\n/**\n * Time cell validator\n *\n * @private\n * @validator TimeValidator\n * @dependencies moment\n * @param {*} value - Value of edited cell\n * @param {Function} callback - Callback called with validation result\n */\nfunction timeValidator(value, callback) {\n  var valid = true;\n  var timeFormat = this.timeFormat || 'h:mm:ss a';\n\n  if (value === null) {\n    value = '';\n  }\n\n  value = /^\\d{3,}$/.test(value) ? parseInt(value, 10) : value;\n\n  var twoDigitValue = /^\\d{1,2}$/.test(value);\n\n  if (twoDigitValue) {\n    value += ':00';\n  }\n\n  var date = (0, _moment2.default)(value, STRICT_FORMATS, true).isValid() ? (0, _moment2.default)(value) : (0, _moment2.default)(value, timeFormat);\n  var isValidTime = date.isValid();\n\n  // is it in the specified format\n  var isValidFormat = (0, _moment2.default)(value, timeFormat, true).isValid() && !twoDigitValue;\n\n  if (this.allowEmpty && value === '') {\n    isValidTime = true;\n    isValidFormat = true;\n  }\n  if (!isValidTime) {\n    valid = false;\n  }\n  if (!isValidTime && isValidFormat) {\n    valid = true;\n  }\n  if (isValidTime && !isValidFormat) {\n    if (this.correctFormat === true) {\n      // if format correction is enabled\n      var correctedValue = date.format(timeFormat);\n      var row = this.instance.runHooks('unmodifyRow', this.row);\n      var column = this.instance.runHooks('unmodifyCol', this.col);\n\n      this.instance.setDataAtCell(row, column, correctedValue, 'timeValidator');\n      valid = true;\n    } else {\n      valid = false;\n    }\n  }\n\n  callback(valid);\n};\n\n/***/ }),\n/* 376 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'autocomplete';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE),\n  validator: (0, _validators.getValidator)(CELL_TYPE)\n};\n\n/***/ }),\n/* 377 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar CELL_TYPE = 'checkbox';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE)\n};\n\n/***/ }),\n/* 378 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'date';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  // displays small gray arrow on right side of the cell\n  renderer: (0, _renderers.getRenderer)('autocomplete'),\n  validator: (0, _validators.getValidator)(CELL_TYPE)\n};\n\n/***/ }),\n/* 379 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'dropdown';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  // displays small gray arrow on right side of the cell\n  renderer: (0, _renderers.getRenderer)('autocomplete'),\n  validator: (0, _validators.getValidator)('autocomplete')\n};\n\n/***/ }),\n/* 380 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar CELL_TYPE = 'handsontable';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  // displays small gray arrow on right side of the cell\n  renderer: (0, _renderers.getRenderer)('autocomplete')\n};\n\n/***/ }),\n/* 381 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'numeric';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE),\n  validator: (0, _validators.getValidator)(CELL_TYPE),\n  dataType: 'number'\n};\n\n/***/ }),\n/* 382 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'password';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE),\n  copyable: false\n};\n\n/***/ }),\n/* 383 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _browser = __webpack_require__(27);\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar CELL_TYPE = 'text';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE)\n};\n\n/***/ }),\n/* 384 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'time';\n\nexports.default = {\n  editor: (0, _editors.getEditor)('text'),\n  // displays small gray arrow on right side of the cell\n  renderer: (0, _renderers.getRenderer)('text'),\n  validator: (0, _validators.getValidator)(CELL_TYPE)\n};\n\n/***/ }),\n/* 385 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _SheetClip = __webpack_require__(311);\n\nvar _SheetClip2 = _interopRequireDefault(_SheetClip);\n\nvar _data = __webpack_require__(90);\n\nvar _setting = __webpack_require__(89);\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _interval = __webpack_require__(386);\n\nvar _interval2 = _interopRequireDefault(_interval);\n\nvar _number = __webpack_require__(5);\n\nvar _multiMap = __webpack_require__(387);\n\nvar _multiMap2 = _interopRequireDefault(_multiMap);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Utility class that gets and saves data from/to the data source using mapping of columns numbers to object property names\n * @todo refactor arguments of methods getRange, getText to be numbers (not objects)\n * @todo remove priv, GridSettings from object constructor\n *\n * @param {Object} instance Instance of Handsontable\n * @param {*} priv\n * @param {*} GridSettings Grid settings\n * @util\n * @class DataMap\n */\nfunction DataMap(instance, priv, GridSettings) {\n  var _this = this;\n\n  this.instance = instance;\n  this.priv = priv;\n  this.GridSettings = GridSettings;\n  this.dataSource = this.instance.getSettings().data;\n  this.cachedLength = null;\n  this.skipCache = false;\n  this.latestSourceRowsCount = 0;\n\n  if (this.dataSource && this.dataSource[0]) {\n    this.duckSchema = this.recursiveDuckSchema(this.dataSource[0]);\n  } else {\n    this.duckSchema = {};\n  }\n  this.createMap();\n  this.interval = _interval2.default.create(function () {\n    return _this.clearLengthCache();\n  }, '15fps');\n\n  this.instance.addHook('skipLengthCache', function (delay) {\n    return _this.onSkipLengthCache(delay);\n  });\n  this.onSkipLengthCache(500);\n}\n\nDataMap.prototype.DESTINATION_RENDERER = 1;\nDataMap.prototype.DESTINATION_CLIPBOARD_GENERATOR = 2;\n\n/**\n * @param {Object|Array} object\n * @returns {Object|Array}\n */\nDataMap.prototype.recursiveDuckSchema = function (object) {\n  return (0, _object.duckSchema)(object);\n};\n\n/**\n * @param {Object} schema\n * @param {Number} lastCol\n * @param {Number} parent\n * @returns {Number}\n */\nDataMap.prototype.recursiveDuckColumns = function (schema, lastCol, parent) {\n  var prop, i;\n  if (typeof lastCol === 'undefined') {\n    lastCol = 0;\n    parent = '';\n  }\n  if ((typeof schema === 'undefined' ? 'undefined' : _typeof(schema)) === 'object' && !Array.isArray(schema)) {\n    for (i in schema) {\n      if ((0, _object.hasOwnProperty)(schema, i)) {\n        if (schema[i] === null) {\n          prop = parent + i;\n          this.colToPropCache.push(prop);\n          this.propToColCache.set(prop, lastCol);\n\n          lastCol++;\n        } else {\n          lastCol = this.recursiveDuckColumns(schema[i], lastCol, i + '.');\n        }\n      }\n    }\n  }\n\n  return lastCol;\n};\n\nDataMap.prototype.createMap = function () {\n  var i = void 0;\n  var schema = this.getSchema();\n\n  if (typeof schema === 'undefined') {\n    throw new Error('trying to create `columns` definition but you didn\\'t provide `schema` nor `data`');\n  }\n\n  this.colToPropCache = [];\n  this.propToColCache = new _multiMap2.default();\n\n  var columns = this.instance.getSettings().columns;\n\n  if (columns) {\n    var maxCols = this.instance.getSettings().maxCols;\n    var columnsLen = Math.min(maxCols, columns.length);\n    var filteredIndex = 0;\n    var columnsAsFunc = false;\n    var schemaLen = (0, _object.deepObjectSize)(schema);\n\n    if (typeof columns === 'function') {\n      columnsLen = schemaLen > 0 ? schemaLen : this.instance.countSourceCols();\n      columnsAsFunc = true;\n    }\n\n    for (i = 0; i < columnsLen; i++) {\n      var column = columnsAsFunc ? columns(i) : columns[i];\n\n      if ((0, _object.isObject)(column)) {\n        if (typeof column.data !== 'undefined') {\n          var index = columnsAsFunc ? filteredIndex : i;\n          this.colToPropCache[index] = column.data;\n          this.propToColCache.set(column.data, index);\n        }\n\n        filteredIndex++;\n      }\n    }\n  } else {\n    this.recursiveDuckColumns(schema);\n  }\n};\n\n/**\n * Returns property name that corresponds with the given column index.\n *\n * @param {Number} col Visual column index.\n * @returns {Number} Physical column index.\n */\nDataMap.prototype.colToProp = function (col) {\n  col = this.instance.runHooks('modifyCol', col);\n\n  if (!isNaN(col) && this.colToPropCache && typeof this.colToPropCache[col] !== 'undefined') {\n    return this.colToPropCache[col];\n  }\n\n  return col;\n};\n\n/**\n * @param {Object} prop\n * @fires Hooks#modifyCol\n * @returns {*}\n */\nDataMap.prototype.propToCol = function (prop) {\n  var col;\n\n  if (typeof this.propToColCache.get(prop) === 'undefined') {\n    col = prop;\n  } else {\n    col = this.propToColCache.get(prop);\n  }\n  col = this.instance.runHooks('unmodifyCol', col);\n\n  return col;\n};\n\n/**\n * @returns {Object}\n */\nDataMap.prototype.getSchema = function () {\n  var schema = this.instance.getSettings().dataSchema;\n\n  if (schema) {\n    if (typeof schema === 'function') {\n      return schema();\n    }\n    return schema;\n  }\n\n  return this.duckSchema;\n};\n\n/**\n * Creates row at the bottom of the data array.\n *\n * @param {Number} [index] Physical index of the row before which the new row will be inserted.\n * @param {Number} [amount=1] An amount of rows to add.\n * @param {String} [source] Source of method call.\n * @fires Hooks#afterCreateRow\n * @returns {Number} Returns number of created rows.\n */\nDataMap.prototype.createRow = function (index) {\n  var _this2 = this;\n\n  var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n  var source = arguments[2];\n\n  var numberOfCreatedRows = 0;\n\n  if (typeof index !== 'number' || index >= this.instance.countSourceRows()) {\n    index = this.instance.countSourceRows();\n  }\n\n  var continueProcess = this.instance.runHooks('beforeCreateRow', index, amount, source);\n\n  if (continueProcess === false) {\n    return 0;\n  }\n\n  var maxRows = this.instance.getSettings().maxRows;\n  var columnCount = this.instance.countCols();\n\n  var _loop = function _loop() {\n    var row = null;\n\n    if (_this2.instance.dataType === 'array') {\n      if (_this2.instance.getSettings().dataSchema) {\n        // Clone template array\n        row = (0, _object.deepClone)(_this2.getSchema());\n      } else {\n        row = [];\n        /* eslint-disable no-loop-func */\n        (0, _number.rangeEach)(columnCount - 1, function () {\n          return row.push(null);\n        });\n      }\n    } else if (_this2.instance.dataType === 'function') {\n      row = _this2.instance.getSettings().dataSchema(index);\n    } else {\n      row = {};\n      (0, _object.deepExtend)(row, _this2.getSchema());\n    }\n\n    if (index === _this2.instance.countSourceRows()) {\n      _this2.dataSource.push(row);\n    } else {\n      _this2.spliceData(index, 0, row);\n    }\n\n    numberOfCreatedRows++;\n  };\n\n  while (numberOfCreatedRows < amount && this.instance.countSourceRows() < maxRows) {\n    _loop();\n  }\n\n  this.instance.runHooks('afterCreateRow', index, numberOfCreatedRows, source);\n  this.instance.forceFullRender = true; // used when data was changed\n\n  return numberOfCreatedRows;\n};\n\n/**\n * Creates col at the right of the data array.\n *\n * @param {Number} [index] Visual index of the column before which the new column will be inserted\n * @param {Number} [amount] An amount of columns to add.\n * @param {String} [source] Source of method call.\n * @fires Hooks#afterCreateCol\n * @returns {Number} Returns number of created columns\n */\nDataMap.prototype.createCol = function (index, amount, source) {\n  if (!this.instance.isColumnModificationAllowed()) {\n    throw new Error('Cannot create new column. When data source in an object, ' + 'you can only have as much columns as defined in first data row, data schema or in the \\'columns\\' setting.' + 'If you want to be able to add new columns, you have to use array datasource.');\n  }\n  var rlen = this.instance.countSourceRows(),\n      data = this.dataSource,\n      constructor,\n      numberOfCreatedCols = 0,\n      currentIndex;\n\n  if (!amount) {\n    amount = 1;\n  }\n\n  if (typeof index !== 'number' || index >= this.instance.countCols()) {\n    index = this.instance.countCols();\n  }\n  this.instance.runHooks('beforeCreateCol', index, amount, source);\n\n  currentIndex = index;\n\n  var maxCols = this.instance.getSettings().maxCols;\n  while (numberOfCreatedCols < amount && this.instance.countCols() < maxCols) {\n    constructor = (0, _setting.columnFactory)(this.GridSettings, this.priv.columnsSettingConflicts);\n\n    if (typeof index !== 'number' || index >= this.instance.countCols()) {\n      if (rlen > 0) {\n        for (var r = 0; r < rlen; r++) {\n          if (typeof data[r] === 'undefined') {\n            data[r] = [];\n          }\n          data[r].push(null);\n        }\n      } else {\n        data.push([null]);\n      }\n      // Add new column constructor\n      this.priv.columnSettings.push(constructor);\n    } else {\n      for (var _r = 0; _r < rlen; _r++) {\n        data[_r].splice(currentIndex, 0, null);\n      }\n      // Add new column constructor at given index\n      this.priv.columnSettings.splice(currentIndex, 0, constructor);\n    }\n\n    numberOfCreatedCols++;\n    currentIndex++;\n  }\n\n  this.instance.runHooks('afterCreateCol', index, numberOfCreatedCols, source);\n  this.instance.forceFullRender = true; // used when data was changed\n\n  return numberOfCreatedCols;\n};\n\n/**\n * Removes row from the data array.\n *\n * @param {Number} [index] Visual index of the row to be removed. If not provided, the last row will be removed\n * @param {Number} [amount] Amount of the rows to be removed. If not provided, one row will be removed\n * @param {String} [source] Source of method call.\n * @fires Hooks#beforeRemoveRow\n * @fires Hooks#afterRemoveRow\n */\nDataMap.prototype.removeRow = function (index, amount, source) {\n  if (!amount) {\n    amount = 1;\n  }\n  if (typeof index !== 'number') {\n    index = -amount;\n  }\n\n  amount = this.instance.runHooks('modifyRemovedAmount', amount, index);\n\n  index = (this.instance.countSourceRows() + index) % this.instance.countSourceRows();\n\n  var logicRows = this.visualRowsToPhysical(index, amount);\n  var actionWasNotCancelled = this.instance.runHooks('beforeRemoveRow', index, amount, logicRows, source);\n\n  if (actionWasNotCancelled === false) {\n    return;\n  }\n\n  var data = this.dataSource;\n  var newData = void 0;\n\n  newData = this.filterData(index, amount);\n\n  if (newData) {\n    data.length = 0;\n    Array.prototype.push.apply(data, newData);\n  }\n\n  this.instance.runHooks('afterRemoveRow', index, amount, logicRows, source);\n\n  this.instance.forceFullRender = true; // used when data was changed\n};\n\n/**\n * Removes column from the data array.\n *\n * @param {Number} [index] Visual index of the column to be removed. If not provided, the last column will be removed\n * @param {Number} [amount] Amount of the columns to be removed. If not provided, one column will be removed\n * @param {String} [source] Source of method call.\n * @fires Hooks#beforeRemoveCol\n * @fires Hooks#afterRemoveCol\n */\nDataMap.prototype.removeCol = function (index, amount, source) {\n  if (this.instance.dataType === 'object' || this.instance.getSettings().columns) {\n    throw new Error('cannot remove column with object data source or columns option specified');\n  }\n  if (!amount) {\n    amount = 1;\n  }\n  if (typeof index !== 'number') {\n    index = -amount;\n  }\n\n  index = (this.instance.countCols() + index) % this.instance.countCols();\n\n  var logicColumns = this.visualColumnsToPhysical(index, amount);\n  var descendingLogicColumns = logicColumns.slice(0).sort(function (a, b) {\n    return b - a;\n  });\n  var actionWasNotCancelled = this.instance.runHooks('beforeRemoveCol', index, amount, logicColumns, source);\n\n  if (actionWasNotCancelled === false) {\n    return;\n  }\n\n  var isTableUniform = true;\n  var removedColumnsCount = descendingLogicColumns.length;\n  var data = this.dataSource;\n\n  for (var c = 0; c < removedColumnsCount; c++) {\n    if (isTableUniform && logicColumns[0] !== logicColumns[c] - c) {\n      isTableUniform = false;\n    }\n  }\n\n  if (isTableUniform) {\n    for (var r = 0, rlen = this.instance.countSourceRows(); r < rlen; r++) {\n      data[r].splice(logicColumns[0], amount);\n    }\n  } else {\n    for (var _r2 = 0, _rlen = this.instance.countSourceRows(); _r2 < _rlen; _r2++) {\n      for (var _c = 0; _c < removedColumnsCount; _c++) {\n        data[_r2].splice(descendingLogicColumns[_c], 1);\n      }\n    }\n\n    for (var _c2 = 0; _c2 < removedColumnsCount; _c2++) {\n      this.priv.columnSettings.splice(logicColumns[_c2], 1);\n    }\n  }\n\n  this.instance.runHooks('afterRemoveCol', index, amount, logicColumns, source);\n\n  this.instance.forceFullRender = true; // used when data was changed\n};\n\n/**\n * Add/Removes data from the column.\n *\n * @param {Number} col Physical index of column in which do you want to do splice\n * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end\n * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed\n * @returns {Array} Returns removed portion of columns\n */\nDataMap.prototype.spliceCol = function (col, index, amount /* , elements... */) {\n  var elements = arguments.length >= 4 ? [].slice.call(arguments, 3) : [];\n\n  var colData = this.instance.getDataAtCol(col);\n  var removed = colData.slice(index, index + amount);\n  var after = colData.slice(index + amount);\n\n  (0, _array.extendArray)(elements, after);\n  var i = 0;\n  while (i < amount) {\n    elements.push(null); // add null in place of removed elements\n    i++;\n  }\n  (0, _array.to2dArray)(elements);\n  this.instance.populateFromArray(index, col, elements, null, null, 'spliceCol');\n\n  return removed;\n};\n\n/**\n * Add/Removes data from the row.\n *\n * @param {Number} row Physical index of row in which do you want to do splice\n * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end.\n * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed.\n * @returns {Array} Returns removed portion of rows\n */\nDataMap.prototype.spliceRow = function (row, index, amount /* , elements... */) {\n  var elements = arguments.length >= 4 ? [].slice.call(arguments, 3) : [];\n\n  var rowData = this.instance.getSourceDataAtRow(row);\n  var removed = rowData.slice(index, index + amount);\n  var after = rowData.slice(index + amount);\n\n  (0, _array.extendArray)(elements, after);\n  var i = 0;\n  while (i < amount) {\n    elements.push(null); // add null in place of removed elements\n    i++;\n  }\n  this.instance.populateFromArray(row, index, [elements], null, null, 'spliceRow');\n\n  return removed;\n};\n\n/**\n * Add/remove row(s) to/from the data source.\n *\n * @param {Number} index Physical index of the element to remove.\n * @param {Number} amount Number of rows to add/remove.\n * @param {Object} element Row to add.\n */\nDataMap.prototype.spliceData = function (index, amount, element) {\n  var continueSplicing = this.instance.runHooks('beforeDataSplice', index, amount, element);\n\n  if (continueSplicing !== false) {\n    this.dataSource.splice(index, amount, element);\n  }\n};\n\n/**\n * Filter unwanted data elements from the data source.\n *\n * @param {Number} index Visual index of the element to remove.\n * @param {Number} amount Number of rows to add/remove.\n * @returns {Array}\n */\nDataMap.prototype.filterData = function (index, amount) {\n  var physicalRows = this.visualRowsToPhysical(index, amount);\n  var continueSplicing = this.instance.runHooks('beforeDataFilter', index, amount, physicalRows);\n\n  if (continueSplicing !== false) {\n    var newData = this.dataSource.filter(function (row, index) {\n      return physicalRows.indexOf(index) == -1;\n    });\n\n    return newData;\n  }\n};\n\n/**\n * Returns single value from the data array.\n *\n * @param {Number} row Visual row index.\n * @param {Number} prop\n */\nDataMap.prototype.get = function (row, prop) {\n  row = this.instance.runHooks('modifyRow', row);\n\n  var dataRow = this.dataSource[row];\n  // TODO: To remove, use 'modifyData' hook instead (see below)\n  var modifiedRowData = this.instance.runHooks('modifyRowData', row);\n\n  dataRow = isNaN(modifiedRowData) ? modifiedRowData : dataRow;\n  //\n\n  var value = null;\n\n  // try to get value under property `prop` (includes dot)\n  if (dataRow && dataRow.hasOwnProperty && (0, _object.hasOwnProperty)(dataRow, prop)) {\n    value = dataRow[prop];\n  } else if (typeof prop === 'string' && prop.indexOf('.') > -1) {\n    var sliced = prop.split('.');\n    var out = dataRow;\n\n    if (!out) {\n      return null;\n    }\n    for (var i = 0, ilen = sliced.length; i < ilen; i++) {\n      out = out[sliced[i]];\n\n      if (typeof out === 'undefined') {\n        return null;\n      }\n    }\n    value = out;\n  } else if (typeof prop === 'function') {\n    /**\n     *  allows for interacting with complex structures, for example\n     *  d3/jQuery getter/setter properties:\n     *\n     *    {columns: [{\n     *      data: function(row, value){\n     *        if(arguments.length === 1){\n     *          return row.property();\n     *        }\n     *        row.property(value);\n     *      }\n     *    }]}\n     */\n    value = prop(this.dataSource.slice(row, row + 1)[0]);\n  }\n\n  if (this.instance.hasHook('modifyData')) {\n    var valueHolder = (0, _object.createObjectPropListener)(value);\n\n    this.instance.runHooks('modifyData', row, this.propToCol(prop), valueHolder, 'get');\n\n    if (valueHolder.isTouched()) {\n      value = valueHolder.value;\n    }\n  }\n\n  return value;\n};\n\nvar copyableLookup = (0, _data.cellMethodLookupFactory)('copyable', false);\n\n/**\n * Returns single value from the data array (intended for clipboard copy to an external application).\n *\n * @param {Number} row Physical row index.\n * @param {Number} prop\n * @returns {String}\n */\nDataMap.prototype.getCopyable = function (row, prop) {\n  if (copyableLookup.call(this.instance, row, this.propToCol(prop))) {\n    return this.get(row, prop);\n  }\n  return '';\n};\n\n/**\n * Saves single value to the data array.\n *\n * @param {Number} row Visual row index.\n * @param {Number} prop\n * @param {String} value\n * @param {String} [source] Source of hook runner.\n */\nDataMap.prototype.set = function (row, prop, value, source) {\n  row = this.instance.runHooks('modifyRow', row, source || 'datamapGet');\n\n  var dataRow = this.dataSource[row];\n  // TODO: To remove, use 'modifyData' hook instead (see below)\n  var modifiedRowData = this.instance.runHooks('modifyRowData', row);\n\n  dataRow = isNaN(modifiedRowData) ? modifiedRowData : dataRow;\n  //\n\n  if (this.instance.hasHook('modifyData')) {\n    var valueHolder = (0, _object.createObjectPropListener)(value);\n\n    this.instance.runHooks('modifyData', row, this.propToCol(prop), valueHolder, 'set');\n\n    if (valueHolder.isTouched()) {\n      value = valueHolder.value;\n    }\n  }\n\n  // try to set value under property `prop` (includes dot)\n  if (dataRow && dataRow.hasOwnProperty && (0, _object.hasOwnProperty)(dataRow, prop)) {\n    dataRow[prop] = value;\n  } else if (typeof prop === 'string' && prop.indexOf('.') > -1) {\n    var sliced = prop.split('.');\n    var out = dataRow;\n    var i = 0;\n    var ilen = void 0;\n\n    for (i = 0, ilen = sliced.length - 1; i < ilen; i++) {\n      if (typeof out[sliced[i]] === 'undefined') {\n        out[sliced[i]] = {};\n      }\n      out = out[sliced[i]];\n    }\n    out[sliced[i]] = value;\n  } else if (typeof prop === 'function') {\n    /* see the `function` handler in `get` */\n    prop(this.dataSource.slice(row, row + 1)[0], value);\n  } else {\n    dataRow[prop] = value;\n  }\n};\n\n/**\n * This ridiculous piece of code maps rows Id that are present in table data to those displayed for user.\n * The trick is, the physical row id (stored in settings.data) is not necessary the same\n * as the visual (displayed) row id (e.g. when sorting is applied).\n *\n * @param {Number} index Visual row index.\n * @param {Number} amount\n * @fires Hooks#modifyRow\n * @returns {Number}\n */\nDataMap.prototype.visualRowsToPhysical = function (index, amount) {\n  var totalRows = this.instance.countSourceRows();\n  var physicRow = (totalRows + index) % totalRows;\n  var logicRows = [];\n  var rowsToRemove = amount;\n  var row;\n\n  while (physicRow < totalRows && rowsToRemove) {\n    row = this.instance.runHooks('modifyRow', physicRow);\n    logicRows.push(row);\n\n    rowsToRemove--;\n    physicRow++;\n  }\n\n  return logicRows;\n};\n\n/**\n *\n * @param index Visual column index.\n * @param amount\n * @returns {Array}\n */\nDataMap.prototype.visualColumnsToPhysical = function (index, amount) {\n  var totalCols = this.instance.countCols();\n  var physicalCol = (totalCols + index) % totalCols;\n  var visualCols = [];\n  var colsToRemove = amount;\n\n  while (physicalCol < totalCols && colsToRemove) {\n    var col = this.instance.runHooks('modifyCol', physicalCol);\n\n    visualCols.push(col);\n\n    colsToRemove--;\n    physicalCol++;\n  }\n\n  return visualCols;\n};\n\n/**\n * Clears the data array.\n */\nDataMap.prototype.clear = function () {\n  for (var r = 0; r < this.instance.countSourceRows(); r++) {\n    for (var c = 0; c < this.instance.countCols(); c++) {\n      this.set(r, this.colToProp(c), '');\n    }\n  }\n};\n\n/**\n * Clear cached data length.\n */\nDataMap.prototype.clearLengthCache = function () {\n  this.cachedLength = null;\n};\n\n/**\n * Get data length.\n *\n * @returns {Number}\n */\nDataMap.prototype.getLength = function () {\n  var _this3 = this;\n\n  var maxRows = void 0,\n      maxRowsFromSettings = this.instance.getSettings().maxRows;\n\n  if (maxRowsFromSettings < 0 || maxRowsFromSettings === 0) {\n    maxRows = 0;\n  } else {\n    maxRows = maxRowsFromSettings || Infinity;\n  }\n\n  var length = this.instance.countSourceRows();\n\n  if (this.instance.hasHook('modifyRow')) {\n    var reValidate = this.skipCache;\n\n    this.interval.start();\n    if (length !== this.latestSourceRowsCount) {\n      reValidate = true;\n    }\n\n    this.latestSourceRowsCount = length;\n    if (this.cachedLength === null || reValidate) {\n      (0, _number.rangeEach)(length - 1, function (row) {\n        row = _this3.instance.runHooks('modifyRow', row);\n\n        if (row === null) {\n          --length;\n        }\n      });\n      this.cachedLength = length;\n    } else {\n      length = this.cachedLength;\n    }\n  } else {\n    this.interval.stop();\n  }\n\n  return Math.min(length, maxRows);\n};\n\n/**\n * Returns the data array.\n *\n * @returns {Array}\n */\nDataMap.prototype.getAll = function () {\n  var start = {\n    row: 0,\n    col: 0\n  };\n\n  var end = {\n    row: Math.max(this.instance.countSourceRows() - 1, 0),\n    col: Math.max(this.instance.countCols() - 1, 0)\n  };\n\n  if (start.row - end.row === 0 && !this.instance.countSourceRows()) {\n    return [];\n  }\n\n  return this.getRange(start, end, DataMap.prototype.DESTINATION_RENDERER);\n};\n\n/**\n * Returns data range as array.\n *\n * @param {Object} [start] Start selection position. Visual indexes.\n * @param {Object} [end] End selection position. Visual indexes.\n * @param {Number} destination Destination of datamap.get\n * @returns {Array}\n */\nDataMap.prototype.getRange = function (start, end, destination) {\n  var r,\n      rlen,\n      c,\n      clen,\n      output = [],\n      row;\n\n  var maxRows = this.instance.getSettings().maxRows;\n  var maxCols = this.instance.getSettings().maxCols;\n\n  if (maxRows === 0 || maxCols === 0) {\n    return [];\n  }\n\n  var getFn = destination === this.DESTINATION_CLIPBOARD_GENERATOR ? this.getCopyable : this.get;\n\n  rlen = Math.min(Math.max(maxRows - 1, 0), Math.max(start.row, end.row));\n  clen = Math.min(Math.max(maxCols - 1, 0), Math.max(start.col, end.col));\n\n  for (r = Math.min(start.row, end.row); r <= rlen; r++) {\n    row = [];\n    var physicalRow = this.instance.runHooks('modifyRow', r);\n\n    for (c = Math.min(start.col, end.col); c <= clen; c++) {\n\n      if (physicalRow === null) {\n        break;\n      }\n      row.push(getFn.call(this, r, this.colToProp(c)));\n    }\n    if (physicalRow !== null) {\n      output.push(row);\n    }\n  }\n\n  return output;\n};\n\n/**\n * Return data as text (tab separated columns).\n *\n * @param {Object} [start] Start selection position. Visual indexes.\n * @param {Object} [end] End selection position. Visual indexes.\n * @returns {String}\n */\nDataMap.prototype.getText = function (start, end) {\n  return _SheetClip2.default.stringify(this.getRange(start, end, this.DESTINATION_RENDERER));\n};\n\n/**\n * Return data as copyable text (tab separated columns intended for clipboard copy to an external application).\n *\n * @param {Object} [start] Start selection position. Visual indexes.\n * @param {Object} [end] End selection position. Visual indexes.\n * @returns {String}\n */\nDataMap.prototype.getCopyableText = function (start, end) {\n  return _SheetClip2.default.stringify(this.getRange(start, end, this.DESTINATION_CLIPBOARD_GENERATOR));\n};\n\n/**\n * `skipLengthCache` callback.\n * @private\n * @param {Number} delay Time of the delay in milliseconds.\n */\nDataMap.prototype.onSkipLengthCache = function (delay) {\n  var _this4 = this;\n\n  this.skipCache = true;\n  setTimeout(function () {\n    _this4.skipCache = false;\n  }, delay);\n};\n\n/**\n * Destroy instance.\n */\nDataMap.prototype.destroy = function () {\n  this.interval.stop();\n\n  this.interval = null;\n  this.instance = null;\n  this.priv = null;\n  this.GridSettings = null;\n  this.dataSource = null;\n  this.cachedLength = null;\n  this.duckSchema = null;\n};\n\nexports.default = DataMap;\n\n/***/ }),\n/* 386 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.parseDelay = parseDelay;\n\nvar _feature = __webpack_require__(40);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Interval\n * @util\n */\nvar Interval = function () {\n  _createClass(Interval, null, [{\n    key: 'create',\n    value: function create(func, delay) {\n      return new Interval(func, delay);\n    }\n  }]);\n\n  function Interval(func, delay) {\n    var _this = this;\n\n    _classCallCheck(this, Interval);\n\n    /**\n     * Animation frame request id.\n     *\n     * @type {Number}\n     */\n    this.timer = null;\n    /**\n     * Function to invoke repeatedly.\n     *\n     * @type {Function}\n     */\n    this.func = func;\n    /**\n     * Number of milliseconds that function should wait before next call.\n     */\n    this.delay = parseDelay(delay);\n    /**\n     * Flag which indicates if interval object was stopped.\n     *\n     * @type {Boolean}\n     * @default true\n     */\n    this.stopped = true;\n    /**\n     * Interval time (in milliseconds) of the last callback call.\n     *\n     * @private\n     * @type {Number}\n     */\n    this._then = null;\n    /**\n     * Bounded function `func`.\n     *\n     * @private\n     * @type {Function}\n     */\n    this._callback = function () {\n      return _this.__callback();\n    };\n  }\n\n  /**\n   * Start loop.\n   *\n   * @returns {Interval}\n   */\n\n\n  _createClass(Interval, [{\n    key: 'start',\n    value: function start() {\n      if (this.stopped) {\n        this._then = Date.now();\n        this.stopped = false;\n        this.timer = (0, _feature.requestAnimationFrame)(this._callback);\n      }\n\n      return this;\n    }\n\n    /**\n     * Stop looping.\n     *\n     * @returns {Interval}\n     */\n\n  }, {\n    key: 'stop',\n    value: function stop() {\n      if (!this.stopped) {\n        this.stopped = true;\n        (0, _feature.cancelAnimationFrame)(this.timer);\n        this.timer = null;\n      }\n\n      return this;\n    }\n\n    /**\n     * Loop callback, fired on every animation frame.\n     *\n     * @private\n     */\n\n  }, {\n    key: '__callback',\n    value: function __callback() {\n      this.timer = (0, _feature.requestAnimationFrame)(this._callback);\n\n      if (this.delay) {\n        var now = Date.now();\n        var elapsed = now - this._then;\n\n        if (elapsed > this.delay) {\n          this._then = now - elapsed % this.delay;\n          this.func();\n        }\n      } else {\n        this.func();\n      }\n    }\n  }]);\n\n  return Interval;\n}();\n\nexports.default = Interval;\nfunction parseDelay(delay) {\n  if (typeof delay === 'string' && /fps$/.test(delay)) {\n    delay = 1000 / parseInt(delay.replace('fps', '') || 0, 10);\n  }\n\n  return delay;\n}\n\n/***/ }),\n/* 387 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction MultiMap() {\n  var map = {\n    arrayMap: [],\n    weakMap: new WeakMap()\n  };\n\n  return {\n    get: function get(key) {\n      if (canBeAnArrayMapKey(key)) {\n        return map.arrayMap[key];\n      } else if (canBeAWeakMapKey(key)) {\n        return map.weakMap.get(key);\n      }\n    },\n    set: function set(key, value) {\n      if (canBeAnArrayMapKey(key)) {\n        map.arrayMap[key] = value;\n      } else if (canBeAWeakMapKey(key)) {\n        map.weakMap.set(key, value);\n      } else {\n        throw new Error('Invalid key type');\n      }\n    },\n    delete: function _delete(key) {\n      if (canBeAnArrayMapKey(key)) {\n        delete map.arrayMap[key];\n      } else if (canBeAWeakMapKey(key)) {\n        map.weakMap.delete(key);\n      }\n    }\n  };\n\n  function canBeAnArrayMapKey(obj) {\n    return obj !== null && !isNaNSymbol(obj) && (typeof obj == 'string' || typeof obj == 'number');\n  }\n\n  function canBeAWeakMapKey(obj) {\n    return obj !== null && ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) == 'object' || typeof obj == 'function');\n  }\n\n  function isNaNSymbol(obj) {\n    /* eslint-disable no-self-compare */\n    return obj !== obj; // NaN === NaN is always false\n  }\n}\n\nexports.default = MultiMap;\n\n/***/ }),\n/* 388 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\nvar _unicode = __webpack_require__(21);\n\nvar _event = __webpack_require__(12);\n\nvar _editors = __webpack_require__(17);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _baseEditor = __webpack_require__(54);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction EditorManager(instance, priv, selection) {\n  var _this = this,\n      destroyed = false,\n      lock = false,\n      eventManager,\n      activeEditor;\n\n  eventManager = new _eventManager2.default(instance);\n\n  function moveSelectionAfterEnter(shiftKey) {\n    var enterMoves = typeof priv.settings.enterMoves === 'function' ? priv.settings.enterMoves(event) : priv.settings.enterMoves;\n\n    if (shiftKey) {\n      // move selection up\n      selection.transformStart(-enterMoves.row, -enterMoves.col);\n    } else {\n      // move selection down (add a new row if needed)\n      selection.transformStart(enterMoves.row, enterMoves.col, true);\n    }\n  }\n\n  function moveSelectionUp(shiftKey) {\n    if (shiftKey) {\n      selection.transformEnd(-1, 0);\n    } else {\n      selection.transformStart(-1, 0);\n    }\n  }\n\n  function moveSelectionDown(shiftKey) {\n    if (shiftKey) {\n      // expanding selection down with shift\n      selection.transformEnd(1, 0);\n    } else {\n      selection.transformStart(1, 0);\n    }\n  }\n\n  function moveSelectionRight(shiftKey) {\n    if (shiftKey) {\n      selection.transformEnd(0, 1);\n    } else {\n      selection.transformStart(0, 1);\n    }\n  }\n\n  function moveSelectionLeft(shiftKey) {\n    if (shiftKey) {\n      selection.transformEnd(0, -1);\n    } else {\n      selection.transformStart(0, -1);\n    }\n  }\n\n  function onKeyDown(event) {\n    if (!instance.isListening()) {\n      return;\n    }\n    instance.runHooks('beforeKeyDown', event);\n\n    if (destroyed) {\n      return;\n    }\n    if ((0, _event.isImmediatePropagationStopped)(event)) {\n      return;\n    }\n    priv.lastKeyCode = event.keyCode;\n\n    if (!selection.isSelected()) {\n      return;\n    }\n    // catch CTRL but not right ALT (which in some systems triggers ALT+CTRL)\n    var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey;\n\n    if (activeEditor && !activeEditor.isWaiting()) {\n      if (!(0, _unicode.isMetaKey)(event.keyCode) && !(0, _unicode.isCtrlMetaKey)(event.keyCode) && !ctrlDown && !_this.isEditorOpened()) {\n        _this.openEditor('', event);\n\n        return;\n      }\n    }\n    var rangeModifier = event.shiftKey ? selection.setRangeEnd : selection.setRangeStart;\n    var tabMoves = void 0;\n\n    switch (event.keyCode) {\n      case _unicode.KEY_CODES.A:\n        if (!_this.isEditorOpened() && ctrlDown) {\n          instance.selectAll();\n\n          event.preventDefault();\n          (0, _event.stopPropagation)(event);\n        }\n        break;\n\n      case _unicode.KEY_CODES.ARROW_UP:\n        if (_this.isEditorOpened() && !activeEditor.isWaiting()) {\n          _this.closeEditorAndSaveChanges(ctrlDown);\n        }\n        moveSelectionUp(event.shiftKey);\n\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.ARROW_DOWN:\n        if (_this.isEditorOpened() && !activeEditor.isWaiting()) {\n          _this.closeEditorAndSaveChanges(ctrlDown);\n        }\n\n        moveSelectionDown(event.shiftKey);\n\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.ARROW_RIGHT:\n        if (_this.isEditorOpened() && !activeEditor.isWaiting()) {\n          _this.closeEditorAndSaveChanges(ctrlDown);\n        }\n\n        moveSelectionRight(event.shiftKey);\n\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.ARROW_LEFT:\n        if (_this.isEditorOpened() && !activeEditor.isWaiting()) {\n          _this.closeEditorAndSaveChanges(ctrlDown);\n        }\n\n        moveSelectionLeft(event.shiftKey);\n\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.TAB:\n        tabMoves = typeof priv.settings.tabMoves === 'function' ? priv.settings.tabMoves(event) : priv.settings.tabMoves;\n\n        if (event.shiftKey) {\n          // move selection left\n          selection.transformStart(-tabMoves.row, -tabMoves.col);\n        } else {\n          // move selection right (add a new column if needed)\n          selection.transformStart(tabMoves.row, tabMoves.col, true);\n        }\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.BACKSPACE:\n      case _unicode.KEY_CODES.DELETE:\n        instance.emptySelectedCells();\n        _this.prepareEditor();\n        event.preventDefault();\n        break;\n\n      case _unicode.KEY_CODES.F2:\n        /* F2 */\n        _this.openEditor(null, event);\n\n        if (activeEditor) {\n          activeEditor.enableFullEditMode();\n        }\n        event.preventDefault(); // prevent Opera from opening 'Go to Page dialog'\n        break;\n\n      case _unicode.KEY_CODES.ENTER:\n        /* return/enter */\n        if (_this.isEditorOpened()) {\n\n          if (activeEditor && activeEditor.state !== _baseEditor.EditorState.WAITING) {\n            _this.closeEditorAndSaveChanges(ctrlDown);\n          }\n          moveSelectionAfterEnter(event.shiftKey);\n        } else if (instance.getSettings().enterBeginsEditing) {\n          _this.openEditor(null, event);\n\n          if (activeEditor) {\n            activeEditor.enableFullEditMode();\n          }\n        } else {\n          moveSelectionAfterEnter(event.shiftKey);\n        }\n        event.preventDefault(); // don't add newline to field\n        (0, _event.stopImmediatePropagation)(event); // required by HandsontableEditor\n        break;\n\n      case _unicode.KEY_CODES.ESCAPE:\n        if (_this.isEditorOpened()) {\n          _this.closeEditorAndRestoreOriginalValue(ctrlDown);\n        }\n        event.preventDefault();\n        break;\n\n      case _unicode.KEY_CODES.HOME:\n        if (event.ctrlKey || event.metaKey) {\n          rangeModifier.call(selection, new _src.CellCoords(0, selection.selectedRange.current().from.col));\n        } else {\n          rangeModifier.call(selection, new _src.CellCoords(selection.selectedRange.current().from.row, 0));\n        }\n        event.preventDefault(); // don't scroll the window\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.END:\n        if (event.ctrlKey || event.metaKey) {\n          rangeModifier.call(selection, new _src.CellCoords(instance.countRows() - 1, selection.selectedRange.current().from.col));\n        } else {\n          rangeModifier.call(selection, new _src.CellCoords(selection.selectedRange.current().from.row, instance.countCols() - 1));\n        }\n        event.preventDefault(); // don't scroll the window\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.PAGE_UP:\n        selection.transformStart(-instance.countVisibleRows(), 0);\n        event.preventDefault(); // don't page up the window\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.PAGE_DOWN:\n        selection.transformStart(instance.countVisibleRows(), 0);\n        event.preventDefault(); // don't page down the window\n        (0, _event.stopPropagation)(event);\n        break;\n      default:\n        break;\n    }\n  }\n\n  function init() {\n    instance.addHook('afterDocumentKeyDown', onKeyDown);\n\n    eventManager.addEventListener(document.documentElement, 'keydown', function (event) {\n      if (!destroyed) {\n        instance.runHooks('afterDocumentKeyDown', event);\n      }\n    });\n\n    function onDblClick(event, coords, elem) {\n      // may be TD or TH\n      if (elem.nodeName === 'TD') {\n        _this.openEditor(null, event);\n\n        if (activeEditor) {\n          activeEditor.enableFullEditMode();\n        }\n      }\n    }\n    instance.view.wt.update('onCellDblClick', onDblClick);\n  }\n\n  /**\n  * Lock the editor from being prepared and closed. Locking the editor prevents its closing and\n  * reinitialized after selecting the new cell. This feature is necessary for a mobile editor.\n  *\n  * @function lockEditor\n  * @memberof! Handsontable.EditorManager#\n   */\n  this.lockEditor = function () {\n    lock = true;\n  };\n\n  /**\n  * Unlock the editor from being prepared and closed. This method restores the original behavior of\n  * the editors where for every new selection its instances are closed.\n  *\n  * @function unlockEditor\n  * @memberof! Handsontable.EditorManager#\n   */\n  this.unlockEditor = function () {\n    lock = false;\n  };\n\n  /**\n   * Destroy current editor, if exists.\n   *\n   * @function destroyEditor\n   * @memberof! Handsontable.EditorManager#\n   * @param {Boolean} revertOriginal\n   */\n  this.destroyEditor = function (revertOriginal) {\n    if (!lock) {\n      this.closeEditor(revertOriginal);\n    }\n  };\n\n  /**\n   * Get active editor.\n   *\n   * @function getActiveEditor\n   * @memberof! Handsontable.EditorManager#\n   * @returns {*}\n   */\n  this.getActiveEditor = function () {\n    return activeEditor;\n  };\n\n  /**\n   * Prepare text input to be displayed at given grid cell.\n   *\n   * @function prepareEditor\n   * @memberof! Handsontable.EditorManager#\n   */\n  this.prepareEditor = function () {\n    if (lock) {\n      return;\n    }\n\n    var row, col, prop, td, originalValue, cellProperties, editorClass;\n\n    if (activeEditor && activeEditor.isWaiting()) {\n      this.closeEditor(false, false, function (dataSaved) {\n        if (dataSaved) {\n          _this.prepareEditor();\n        }\n      });\n\n      return;\n    }\n    row = instance.selection.selectedRange.current().highlight.row;\n    col = instance.selection.selectedRange.current().highlight.col;\n    prop = instance.colToProp(col);\n    td = instance.getCell(row, col);\n\n    originalValue = instance.getSourceDataAtCell(instance.runHooks('modifyRow', row), col);\n    cellProperties = instance.getCellMeta(row, col);\n    editorClass = instance.getCellEditor(cellProperties);\n\n    if (editorClass) {\n      activeEditor = (0, _editors.getEditorInstance)(editorClass, instance);\n      activeEditor.prepare(row, col, prop, td, originalValue, cellProperties);\n    } else {\n      activeEditor = void 0;\n    }\n  };\n\n  /**\n   * Check is editor is opened/showed.\n   *\n   * @function isEditorOpened\n   * @memberof! Handsontable.EditorManager#\n   * @returns {Boolean}\n   */\n  this.isEditorOpened = function () {\n    return activeEditor && activeEditor.isOpened();\n  };\n\n  /**\n   * Open editor with initial value.\n   *\n   * @function openEditor\n   * @memberof! Handsontable.EditorManager#\n   * @param {null|String} newInitialValue new value from which editor will start if handled property it's not the `null`.\n   * @param {DOMEvent} event\n   */\n  this.openEditor = function (newInitialValue, event) {\n    if (activeEditor && !activeEditor.cellProperties.readOnly) {\n      activeEditor.beginEditing(newInitialValue, event);\n    } else if (activeEditor && activeEditor.cellProperties.readOnly) {\n\n      // move the selection after opening the editor with ENTER key\n      if (event && event.keyCode === _unicode.KEY_CODES.ENTER) {\n        moveSelectionAfterEnter();\n      }\n    }\n  };\n\n  /**\n   * Close editor, finish editing cell.\n   *\n   * @function closeEditor\n   * @memberof! Handsontable.EditorManager#\n   * @param {Boolean} restoreOriginalValue\n   * @param {Boolean} [ctrlDown]\n   * @param {Function} [callback]\n   */\n  this.closeEditor = function (restoreOriginalValue, ctrlDown, callback) {\n    if (activeEditor) {\n      activeEditor.finishEditing(restoreOriginalValue, ctrlDown, callback);\n    } else if (callback) {\n      callback(false);\n    }\n  };\n\n  /**\n   * Close editor and save changes.\n   *\n   * @function closeEditorAndSaveChanges\n   * @memberof! Handsontable.EditorManager#\n   * @param {Boolean} ctrlDown\n   */\n  this.closeEditorAndSaveChanges = function (ctrlDown) {\n    return this.closeEditor(false, ctrlDown);\n  };\n\n  /**\n   * Close editor and restore original value.\n   *\n   * @function closeEditorAndRestoreOriginalValue\n   * @memberof! Handsontable.EditorManager#\n   * @param {Boolean} ctrlDown\n   */\n  this.closeEditorAndRestoreOriginalValue = function (ctrlDown) {\n    return this.closeEditor(true, ctrlDown);\n  };\n\n  /**\n   * Destroy the instance.\n   */\n  this.destroy = function () {\n    destroyed = true;\n  };\n\n  init();\n}\n\nvar instances = new WeakMap();\n\nEditorManager.getInstance = function (hotInstance, hotSettings, selection, datamap) {\n  var editorManager = instances.get(hotInstance);\n\n  if (!editorManager) {\n    editorManager = new EditorManager(hotInstance, hotSettings, selection, datamap);\n    instances.set(hotInstance, editorManager);\n  }\n\n  return editorManager;\n};\n\nexports.default = EditorManager;\n\n/***/ }),\n/* 389 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _browser = __webpack_require__(27);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _event = __webpack_require__(12);\n\nvar _src = __webpack_require__(4);\n\nvar _src2 = _interopRequireDefault(_src);\n\nvar _mouseEventHandler = __webpack_require__(312);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Handsontable TableView constructor\n * @param {Object} instance\n */\nfunction TableView(instance) {\n  var _this = this;\n\n  var that = this;\n\n  this.eventManager = new _eventManager2.default(instance);\n  this.instance = instance;\n  this.settings = instance.getSettings();\n  this.selectionMouseDown = false;\n\n  var originalStyle = instance.rootElement.getAttribute('style');\n\n  if (originalStyle) {\n    instance.rootElement.setAttribute('data-originalstyle', originalStyle); // needed to retrieve original style in jsFiddle link generator in HT examples. may be removed in future versions\n  }\n\n  (0, _element.addClass)(instance.rootElement, 'handsontable');\n\n  var table = document.createElement('TABLE');\n  (0, _element.addClass)(table, 'htCore');\n\n  if (instance.getSettings().tableClassName) {\n    (0, _element.addClass)(table, instance.getSettings().tableClassName);\n  }\n  this.THEAD = document.createElement('THEAD');\n  table.appendChild(this.THEAD);\n  this.TBODY = document.createElement('TBODY');\n  table.appendChild(this.TBODY);\n\n  instance.table = table;\n\n  instance.container.insertBefore(table, instance.container.firstChild);\n\n  this.eventManager.addEventListener(instance.rootElement, 'mousedown', function (event) {\n    this.selectionMouseDown = true;\n\n    if (!that.isTextSelectionAllowed(event.target)) {\n      clearTextSelection();\n      event.preventDefault();\n      window.focus(); // make sure that window that contains HOT is active. Important when HOT is in iframe.\n    }\n  });\n  this.eventManager.addEventListener(instance.rootElement, 'mouseup', function (event) {\n    this.selectionMouseDown = false;\n  });\n  this.eventManager.addEventListener(instance.rootElement, 'mousemove', function (event) {\n    if (this.selectionMouseDown && !that.isTextSelectionAllowed(event.target)) {\n      clearTextSelection();\n      event.preventDefault();\n    }\n  });\n\n  this.eventManager.addEventListener(document.documentElement, 'keyup', function (event) {\n    if (instance.selection.isInProgress() && !event.shiftKey) {\n      instance.selection.finish();\n    }\n  });\n\n  var isMouseDown;\n  this.isMouseDown = function () {\n    return isMouseDown;\n  };\n\n  this.eventManager.addEventListener(document.documentElement, 'mouseup', function (event) {\n    if (instance.selection.isInProgress() && (0, _event.isLeftClick)(event)) {\n      // is left mouse button\n      instance.selection.finish();\n    }\n\n    isMouseDown = false;\n\n    if ((0, _element.isOutsideInput)(document.activeElement) || !instance.selection.isSelected() && !(0, _event.isRightClick)(event)) {\n      instance.unlisten();\n    }\n  });\n\n  this.eventManager.addEventListener(document.documentElement, 'mousedown', function (event) {\n    var originalTarget = event.target;\n    var next = event.target;\n    var eventX = event.x || event.clientX;\n    var eventY = event.y || event.clientY;\n\n    if (isMouseDown || !instance.rootElement) {\n      return; // it must have been started in a cell\n    }\n\n    // immediate click on \"holder\" means click on the right side of vertical scrollbar\n    if (next === instance.view.wt.wtTable.holder) {\n      var scrollbarWidth = (0, _element.getScrollbarWidth)();\n\n      if (document.elementFromPoint(eventX + scrollbarWidth, eventY) !== instance.view.wt.wtTable.holder || document.elementFromPoint(eventX, eventY + scrollbarWidth) !== instance.view.wt.wtTable.holder) {\n        return;\n      }\n    } else {\n      while (next !== document.documentElement) {\n        if (next === null) {\n          if (event.isTargetWebComponent) {\n            break;\n          }\n          // click on something that was a row but now is detached (possibly because your click triggered a rerender)\n          return;\n        }\n        if (next === instance.rootElement) {\n          // click inside container\n          return;\n        }\n        next = next.parentNode;\n      }\n    }\n\n    // function did not return until here, we have an outside click!\n\n    var outsideClickDeselects = typeof that.settings.outsideClickDeselects === 'function' ? that.settings.outsideClickDeselects(originalTarget) : that.settings.outsideClickDeselects;\n\n    if (outsideClickDeselects) {\n      instance.deselectCell();\n    } else {\n      instance.destroyEditor();\n    }\n  });\n\n  this.eventManager.addEventListener(table, 'selectstart', function (event) {\n    if (that.settings.fragmentSelection || (0, _element.isInput)(event.target)) {\n      return;\n    }\n    // https://github.com/handsontable/handsontable/issues/160\n    // Prevent text from being selected when performing drag down.\n    event.preventDefault();\n  });\n\n  var clearTextSelection = function clearTextSelection() {\n    // http://stackoverflow.com/questions/3169786/clear-text-selection-with-javascript\n    if (window.getSelection) {\n      if (window.getSelection().empty) {\n        // Chrome\n        window.getSelection().empty();\n      } else if (window.getSelection().removeAllRanges) {\n        // Firefox\n        window.getSelection().removeAllRanges();\n      }\n    } else if (document.selection) {\n      // IE?\n      document.selection.empty();\n    }\n  };\n\n  var walkontableConfig = {\n    debug: function debug() {\n      return that.settings.debug;\n    },\n    externalRowCalculator: this.instance.getPlugin('autoRowSize') && this.instance.getPlugin('autoRowSize').isEnabled(),\n    table: table,\n    preventOverflow: function preventOverflow() {\n      return _this.settings.preventOverflow;\n    },\n    stretchH: function stretchH() {\n      return that.settings.stretchH;\n    },\n    data: instance.getDataAtCell,\n    totalRows: function totalRows() {\n      return instance.countRows();\n    },\n    totalColumns: function totalColumns() {\n      return instance.countCols();\n    },\n    fixedColumnsLeft: function fixedColumnsLeft() {\n      return that.settings.fixedColumnsLeft;\n    },\n    fixedRowsTop: function fixedRowsTop() {\n      return that.settings.fixedRowsTop;\n    },\n    fixedRowsBottom: function fixedRowsBottom() {\n      return that.settings.fixedRowsBottom;\n    },\n    minSpareRows: function minSpareRows() {\n      return that.settings.minSpareRows;\n    },\n    renderAllRows: that.settings.renderAllRows,\n    rowHeaders: function rowHeaders() {\n      var headerRenderers = [];\n\n      if (instance.hasRowHeaders()) {\n        headerRenderers.push(function (row, TH) {\n          that.appendRowHeader(row, TH);\n        });\n      }\n      instance.runHooks('afterGetRowHeaderRenderers', headerRenderers);\n\n      return headerRenderers;\n    },\n    columnHeaders: function columnHeaders() {\n      var headerRenderers = [];\n\n      if (instance.hasColHeaders()) {\n        headerRenderers.push(function (column, TH) {\n          that.appendColHeader(column, TH);\n        });\n      }\n\n      instance.runHooks('afterGetColumnHeaderRenderers', headerRenderers);\n\n      return headerRenderers;\n    },\n    columnWidth: instance.getColWidth,\n    rowHeight: instance.getRowHeight,\n    cellRenderer: function cellRenderer(row, col, TD) {\n      var cellProperties = that.instance.getCellMeta(row, col);\n      var prop = that.instance.colToProp(col);\n      var value = that.instance.getDataAtRowProp(row, prop);\n\n      if (that.instance.hasHook('beforeValueRender')) {\n        value = that.instance.runHooks('beforeValueRender', value, cellProperties);\n      }\n\n      that.instance.runHooks('beforeRenderer', TD, row, col, prop, value, cellProperties);\n      that.instance.getCellRenderer(cellProperties)(that.instance, TD, row, col, prop, value, cellProperties);\n      that.instance.runHooks('afterRenderer', TD, row, col, prop, value, cellProperties);\n    },\n    selections: that.instance.selection.highlight,\n    hideBorderOnMouseDownOver: function hideBorderOnMouseDownOver() {\n      return that.settings.fragmentSelection;\n    },\n    onCellMouseDown: function onCellMouseDown(event, coords, TD, wt) {\n      var blockCalculations = {\n        row: false,\n        column: false,\n        cell: false\n      };\n\n      instance.listen();\n\n      that.activeWt = wt;\n      isMouseDown = true;\n\n      instance.runHooks('beforeOnCellMouseDown', event, coords, TD, blockCalculations);\n\n      if ((0, _event.isImmediatePropagationStopped)(event)) {\n        return;\n      }\n\n      (0, _mouseEventHandler.handleMouseEvent)(event, {\n        coords: coords,\n        selection: instance.selection,\n        controller: blockCalculations\n      });\n\n      instance.runHooks('afterOnCellMouseDown', event, coords, TD);\n      that.activeWt = that.wt;\n    },\n    onCellMouseOut: function onCellMouseOut(event, coords, TD, wt) {\n      that.activeWt = wt;\n      instance.runHooks('beforeOnCellMouseOut', event, coords, TD);\n\n      if ((0, _event.isImmediatePropagationStopped)(event)) {\n        return;\n      }\n\n      instance.runHooks('afterOnCellMouseOut', event, coords, TD);\n      that.activeWt = that.wt;\n    },\n    onCellMouseOver: function onCellMouseOver(event, coords, TD, wt) {\n      var blockCalculations = {\n        row: false,\n        column: false,\n        cell: false\n      };\n\n      that.activeWt = wt;\n\n      instance.runHooks('beforeOnCellMouseOver', event, coords, TD, blockCalculations);\n\n      if ((0, _event.isImmediatePropagationStopped)(event)) {\n        return;\n      }\n\n      if (isMouseDown) {\n        (0, _mouseEventHandler.handleMouseEvent)(event, {\n          coords: coords,\n          selection: instance.selection,\n          controller: blockCalculations\n        });\n      }\n\n      instance.runHooks('afterOnCellMouseOver', event, coords, TD);\n      that.activeWt = that.wt;\n    },\n    onCellMouseUp: function onCellMouseUp(event, coords, TD, wt) {\n      that.activeWt = wt;\n      instance.runHooks('beforeOnCellMouseUp', event, coords, TD);\n\n      instance.runHooks('afterOnCellMouseUp', event, coords, TD);\n      that.activeWt = that.wt;\n    },\n    onCellCornerMouseDown: function onCellCornerMouseDown(event) {\n      event.preventDefault();\n      instance.runHooks('afterOnCellCornerMouseDown', event);\n    },\n    onCellCornerDblClick: function onCellCornerDblClick(event) {\n      event.preventDefault();\n      instance.runHooks('afterOnCellCornerDblClick', event);\n    },\n    beforeDraw: function beforeDraw(force, skipRender) {\n      that.beforeRender(force, skipRender);\n    },\n    onDraw: function onDraw(force) {\n      that.onDraw(force);\n    },\n    onScrollVertically: function onScrollVertically() {\n      instance.runHooks('afterScrollVertically');\n    },\n    onScrollHorizontally: function onScrollHorizontally() {\n      instance.runHooks('afterScrollHorizontally');\n    },\n    onBeforeRemoveCellClassNames: function onBeforeRemoveCellClassNames() {\n      return instance.runHooks('beforeRemoveCellClassNames');\n    },\n    onAfterDrawSelection: function onAfterDrawSelection(currentRow, currentColumn, cornersOfSelection, layerLevel) {\n      return instance.runHooks('afterDrawSelection', currentRow, currentColumn, cornersOfSelection, layerLevel);\n    },\n    onBeforeDrawBorders: function onBeforeDrawBorders(corners, borderClassName) {\n      instance.runHooks('beforeDrawBorders', corners, borderClassName);\n    },\n    onBeforeTouchScroll: function onBeforeTouchScroll() {\n      instance.runHooks('beforeTouchScroll');\n    },\n    onAfterMomentumScroll: function onAfterMomentumScroll() {\n      instance.runHooks('afterMomentumScroll');\n    },\n    onBeforeStretchingColumnWidth: function onBeforeStretchingColumnWidth(stretchedWidth, column) {\n      return instance.runHooks('beforeStretchingColumnWidth', stretchedWidth, column);\n    },\n    onModifyRowHeaderWidth: function onModifyRowHeaderWidth(rowHeaderWidth) {\n      return instance.runHooks('modifyRowHeaderWidth', rowHeaderWidth);\n    },\n    onModifyGetCellCoords: function onModifyGetCellCoords(row, column, topmost) {\n      return instance.runHooks('modifyGetCellCoords', row, column, topmost);\n    },\n    viewportRowCalculatorOverride: function viewportRowCalculatorOverride(calc) {\n      var rows = instance.countRows();\n      var viewportOffset = that.settings.viewportRowRenderingOffset;\n\n      if (viewportOffset === 'auto' && that.settings.fixedRowsTop) {\n        viewportOffset = 10;\n      }\n      if (typeof viewportOffset === 'number') {\n        calc.startRow = Math.max(calc.startRow - viewportOffset, 0);\n        calc.endRow = Math.min(calc.endRow + viewportOffset, rows - 1);\n      }\n      if (viewportOffset === 'auto') {\n        var center = calc.startRow + calc.endRow - calc.startRow;\n        var offset = Math.ceil(center / rows * 12);\n\n        calc.startRow = Math.max(calc.startRow - offset, 0);\n        calc.endRow = Math.min(calc.endRow + offset, rows - 1);\n      }\n      instance.runHooks('afterViewportRowCalculatorOverride', calc);\n    },\n    viewportColumnCalculatorOverride: function viewportColumnCalculatorOverride(calc) {\n      var cols = instance.countCols();\n      var viewportOffset = that.settings.viewportColumnRenderingOffset;\n\n      if (viewportOffset === 'auto' && that.settings.fixedColumnsLeft) {\n        viewportOffset = 10;\n      }\n      if (typeof viewportOffset === 'number') {\n        calc.startColumn = Math.max(calc.startColumn - viewportOffset, 0);\n        calc.endColumn = Math.min(calc.endColumn + viewportOffset, cols - 1);\n      }\n      if (viewportOffset === 'auto') {\n        var center = calc.startColumn + calc.endColumn - calc.startColumn;\n        var offset = Math.ceil(center / cols * 12);\n\n        calc.startRow = Math.max(calc.startColumn - offset, 0);\n        calc.endColumn = Math.min(calc.endColumn + offset, cols - 1);\n      }\n      instance.runHooks('afterViewportColumnCalculatorOverride', calc);\n    },\n    rowHeaderWidth: function rowHeaderWidth() {\n      return that.settings.rowHeaderWidth;\n    },\n    columnHeaderHeight: function columnHeaderHeight() {\n      var columnHeaderHeight = instance.runHooks('modifyColumnHeaderHeight');\n      return that.settings.columnHeaderHeight || columnHeaderHeight;\n    }\n  };\n\n  instance.runHooks('beforeInitWalkontable', walkontableConfig);\n\n  this.wt = new _src2.default(walkontableConfig);\n  this.activeWt = this.wt;\n\n  this.eventManager.addEventListener(that.wt.wtTable.spreader, 'mousedown', function (event) {\n    // right mouse button exactly on spreader means right click on the right hand side of vertical scrollbar\n    if (event.target === that.wt.wtTable.spreader && event.which === 3) {\n      (0, _event.stopPropagation)(event);\n    }\n  });\n\n  this.eventManager.addEventListener(that.wt.wtTable.spreader, 'contextmenu', function (event) {\n    // right mouse button exactly on spreader means right click on the right hand side of vertical scrollbar\n    if (event.target === that.wt.wtTable.spreader && event.which === 3) {\n      (0, _event.stopPropagation)(event);\n    }\n  });\n\n  this.eventManager.addEventListener(document.documentElement, 'click', function () {\n    if (that.settings.observeDOMVisibility) {\n      if (that.wt.drawInterrupted) {\n        that.instance.forceFullRender = true;\n        that.render();\n      }\n    }\n  });\n}\n\nTableView.prototype.isTextSelectionAllowed = function (el) {\n  if ((0, _element.isInput)(el)) {\n    return true;\n  }\n  var isChildOfTableBody = (0, _element.isChildOf)(el, this.instance.view.wt.wtTable.spreader);\n\n  if (this.settings.fragmentSelection === true && isChildOfTableBody) {\n    return true;\n  }\n  if (this.settings.fragmentSelection === 'cell' && this.isSelectedOnlyCell() && isChildOfTableBody) {\n    return true;\n  }\n  if (!this.settings.fragmentSelection && this.isCellEdited() && this.isSelectedOnlyCell()) {\n    return true;\n  }\n\n  return false;\n};\n\n/**\n * Check if selected only one cell.\n *\n * @returns {Boolean}\n */\nTableView.prototype.isSelectedOnlyCell = function () {\n  var _ref = this.instance.getSelectedLast() || [],\n      _ref2 = _slicedToArray(_ref, 4),\n      row = _ref2[0],\n      col = _ref2[1],\n      rowEnd = _ref2[2],\n      colEnd = _ref2[3];\n\n  return row !== void 0 && row === rowEnd && col === colEnd;\n};\n\nTableView.prototype.isCellEdited = function () {\n  var activeEditor = this.instance.getActiveEditor();\n\n  return activeEditor && activeEditor.isOpened();\n};\n\nTableView.prototype.beforeRender = function (force, skipRender) {\n  if (force) {\n    // this.instance.forceFullRender = did Handsontable request full render?\n    this.instance.runHooks('beforeRender', this.instance.forceFullRender, skipRender);\n  }\n};\n\nTableView.prototype.onDraw = function (force) {\n  if (force) {\n    // this.instance.forceFullRender = did Handsontable request full render?\n    this.instance.runHooks('afterRender', this.instance.forceFullRender);\n  }\n};\n\nTableView.prototype.render = function () {\n  this.wt.draw(!this.instance.forceFullRender);\n  this.instance.forceFullRender = false;\n  this.instance.renderCall = false;\n};\n\n/**\n * Returns td object given coordinates\n *\n * @param {CellCoords} coords\n * @param {Boolean} topmost\n */\nTableView.prototype.getCellAtCoords = function (coords, topmost) {\n  var td = this.wt.getCell(coords, topmost);\n\n  if (td < 0) {\n    // there was an exit code (cell is out of bounds)\n    return null;\n  }\n\n  return td;\n};\n\n/**\n * Scroll viewport to selection.\n *\n * @param {CellCoords} coords\n */\nTableView.prototype.scrollViewport = function (coords) {\n  this.wt.scrollViewport(coords);\n};\n\n/**\n * Append row header to a TH element\n * @param row\n * @param TH\n */\nTableView.prototype.appendRowHeader = function (row, TH) {\n  if (TH.firstChild) {\n    var container = TH.firstChild;\n\n    if (!(0, _element.hasClass)(container, 'relative')) {\n      (0, _element.empty)(TH);\n      this.appendRowHeader(row, TH);\n\n      return;\n    }\n    this.updateCellHeader(container.querySelector('.rowHeader'), row, this.instance.getRowHeader);\n  } else {\n    var div = document.createElement('div');\n    var span = document.createElement('span');\n\n    div.className = 'relative';\n    span.className = 'rowHeader';\n    this.updateCellHeader(span, row, this.instance.getRowHeader);\n\n    div.appendChild(span);\n    TH.appendChild(div);\n  }\n\n  this.instance.runHooks('afterGetRowHeader', row, TH);\n};\n\n/**\n * Append column header to a TH element\n * @param col\n * @param TH\n */\nTableView.prototype.appendColHeader = function (col, TH) {\n  if (TH.firstChild) {\n    var container = TH.firstChild;\n\n    if ((0, _element.hasClass)(container, 'relative')) {\n      this.updateCellHeader(container.querySelector('.colHeader'), col, this.instance.getColHeader);\n    } else {\n      (0, _element.empty)(TH);\n      this.appendColHeader(col, TH);\n    }\n  } else {\n    var div = document.createElement('div');\n    var span = document.createElement('span');\n\n    div.className = 'relative';\n    span.className = 'colHeader';\n    this.updateCellHeader(span, col, this.instance.getColHeader);\n\n    div.appendChild(span);\n    TH.appendChild(div);\n  }\n\n  this.instance.runHooks('afterGetColHeader', col, TH);\n};\n\n/**\n * Update header cell content\n *\n * @since 0.15.0-beta4\n * @param {HTMLElement} element Element to update\n * @param {Number} index Row index or column index\n * @param {Function} content Function which should be returns content for this cell\n */\nTableView.prototype.updateCellHeader = function (element, index, content) {\n  var renderedIndex = index;\n  var parentOverlay = this.wt.wtOverlays.getParentOverlay(element) || this.wt;\n\n  // prevent wrong calculations from SampleGenerator\n  if (element.parentNode) {\n    if ((0, _element.hasClass)(element, 'colHeader')) {\n      renderedIndex = parentOverlay.wtTable.columnFilter.sourceToRendered(index);\n    } else if ((0, _element.hasClass)(element, 'rowHeader')) {\n      renderedIndex = parentOverlay.wtTable.rowFilter.sourceToRendered(index);\n    }\n  }\n\n  if (renderedIndex > -1) {\n    (0, _element.fastInnerHTML)(element, content(index));\n  } else {\n    // workaround for https://github.com/handsontable/handsontable/issues/1946\n    (0, _element.fastInnerText)(element, String.fromCharCode(160));\n    (0, _element.addClass)(element, 'cornerHeader');\n  }\n};\n\n/**\n * Given a element's left position relative to the viewport, returns maximum element width until the right\n * edge of the viewport (before scrollbar)\n *\n * @param {Number} leftOffset\n * @return {Number}\n */\nTableView.prototype.maximumVisibleElementWidth = function (leftOffset) {\n  var workspaceWidth = this.wt.wtViewport.getWorkspaceWidth();\n  var maxWidth = workspaceWidth - leftOffset;\n  return maxWidth > 0 ? maxWidth : 0;\n};\n\n/**\n * Given a element's top position relative to the viewport, returns maximum element height until the bottom\n * edge of the viewport (before scrollbar)\n *\n * @param {Number} topOffset\n * @return {Number}\n */\nTableView.prototype.maximumVisibleElementHeight = function (topOffset) {\n  var workspaceHeight = this.wt.wtViewport.getWorkspaceHeight();\n  var maxHeight = workspaceHeight - topOffset;\n  return maxHeight > 0 ? maxHeight : 0;\n};\n\nTableView.prototype.mainViewIsActive = function () {\n  return this.wt === this.activeWt;\n};\n\nTableView.prototype.destroy = function () {\n  this.wt.destroy();\n  this.eventManager.destroy();\n};\n\nexports.default = TableView;\n\n/***/ }),\n/* 390 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class DataSource\n * @private\n */\nvar DataSource = function () {\n  function DataSource(hotInstance) {\n    var dataSource = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\n    _classCallCheck(this, DataSource);\n\n    /**\n     * Instance of Handsontable.\n     *\n     * @type {Handsontable}\n     */\n    this.hot = hotInstance;\n    /**\n     * Data source\n     *\n     * @type {Array}\n     */\n    this.data = dataSource;\n    /**\n     * Type of data source.\n     *\n     * @type {String}\n     * @default 'array'\n     */\n    this.dataType = 'array';\n\n    this.colToProp = function () {};\n    this.propToCol = function () {};\n  }\n\n  /**\n   * Get all data.\n   *\n   * @param {Boolean} [toArray=false] If `true` return source data as an array of arrays even when source data was provided\n   *                                  in another format.\n   * @returns {Array}\n   */\n\n\n  _createClass(DataSource, [{\n    key: 'getData',\n    value: function getData() {\n      var toArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      var result = this.data;\n\n      if (toArray) {\n        result = this.getByRange({ row: 0, col: 0 }, { row: Math.max(this.countRows() - 1, 0), col: Math.max(this.countColumns() - 1, 0) }, true);\n      }\n\n      return result;\n    }\n\n    /**\n     * Set new data source.\n     *\n     * @param data {Array}\n     */\n\n  }, {\n    key: 'setData',\n    value: function setData(data) {\n      this.data = data;\n    }\n\n    /**\n     * Returns array of column values from the data source. `column` is the index of the row in the data source.\n     *\n     * @param {Number} column Visual column index.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getAtColumn',\n    value: function getAtColumn(column) {\n      var _this = this;\n\n      var result = [];\n\n      (0, _array.arrayEach)(this.data, function (row) {\n        var property = _this.colToProp(column);\n\n        if (typeof property === 'string') {\n          row = (0, _object.getProperty)(row, property);\n        } else {\n          row = row[property];\n        }\n        result.push(row);\n      });\n\n      return result;\n    }\n\n    /**\n     * Returns a single row of the data (array or object, depending on what you have). `row` is the index of the row in the data source.\n     *\n     * @param {Number} row Physical row index.\n     * @returns {Array|Object}\n     */\n\n  }, {\n    key: 'getAtRow',\n    value: function getAtRow(row) {\n      return this.data[row];\n    }\n\n    /**\n     * Returns a single value from the data.\n     *\n     * @param {Number} row Physical row index.\n     * @param {Number} column Visual column index.\n     * @returns {*}\n     */\n\n  }, {\n    key: 'getAtCell',\n    value: function getAtCell(row, column) {\n      var result = null;\n\n      var modifyRowData = this.hot.runHooks('modifyRowData', row);\n\n      var dataRow = isNaN(modifyRowData) ? modifyRowData : this.data[row];\n\n      if (dataRow) {\n        var prop = this.colToProp(column);\n\n        if (typeof prop === 'string') {\n          result = (0, _object.getProperty)(dataRow, prop);\n        } else if (typeof prop === 'function') {\n          result = prop(this.data.slice(row, row + 1)[0]);\n        } else {\n          result = dataRow[prop];\n        }\n      }\n\n      return result;\n    }\n\n    /**\n     * Returns source data by passed range.\n     *\n     * @param {Object} start Object with physical `row` and `col` keys (or visual column index, if data type is an array of objects).\n     * @param {Object} end Object with physical `row` and `col` keys (or visual column index, if data type is an array of objects).\n     * @param {Boolean} [toArray=false] If `true` return source data as an array of arrays even when source data was provided\n     *                                  in another format.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getByRange',\n    value: function getByRange(start, end) {\n      var _this2 = this;\n\n      var toArray = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      var startRow = Math.min(start.row, end.row);\n      var startCol = Math.min(start.col, end.col);\n      var endRow = Math.max(start.row, end.row);\n      var endCol = Math.max(start.col, end.col);\n      var result = [];\n\n      (0, _number.rangeEach)(startRow, endRow, function (currentRow) {\n        var row = _this2.getAtRow(currentRow);\n        var newRow = void 0;\n\n        if (_this2.dataType === 'array') {\n          newRow = row.slice(startCol, endCol + 1);\n        } else if (_this2.dataType === 'object') {\n          newRow = toArray ? [] : {};\n\n          (0, _number.rangeEach)(startCol, endCol, function (column) {\n            var prop = _this2.colToProp(column);\n\n            if (toArray) {\n              newRow.push(row[prop]);\n            } else {\n              newRow[prop] = row[prop];\n            }\n          });\n        }\n\n        result.push(newRow);\n      });\n\n      return result;\n    }\n\n    /**\n     * Count number of rows.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'countRows',\n    value: function countRows() {\n      return Array.isArray(this.data) ? this.data.length : 0;\n    }\n\n    /**\n     * Count number of columns.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'countColumns',\n    value: function countColumns() {\n      var result = 0;\n\n      if (Array.isArray(this.data)) {\n        if (this.dataType === 'array') {\n          result = this.data[0].length;\n        } else if (this.dataType === 'object') {\n          result = Object.keys(this.data[0]).length;\n        }\n      }\n\n      return result;\n    }\n\n    /**\n     * Destroy instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.data = null;\n      this.hot = null;\n    }\n  }]);\n\n  return DataSource;\n}();\n\nexports.default = DataSource;\n\n/***/ }),\n/* 391 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 15, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for English - United States language-country.\n                                                                                                                                                                                                                   */\n\n\nvar dictionary = (_dictionary = {\n  languageCode: 'en-US'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Insert row above'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Insert row below'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Insert column left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Insert column right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Remove row', 'Remove rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Remove column', 'Remove columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Undo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Redo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Read only'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Clear column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alignment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Center'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justify'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Middle'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Freeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Unfreeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Borders'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Remove border(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Add comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edit comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Delete comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Read-only comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Merge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Unmerge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copy'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Cut'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Insert child row'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Detach from parent'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Hide column', 'Hide columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Show column', 'Show columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Hide row', 'Hide rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Show row', 'Show rows']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'None'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Is empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Is not empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Is equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Is not equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Begins with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Ends with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contains'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Does not contain'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Greater than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Greater than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Less than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Less than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Is between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Is not between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'After'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Before'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Today'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Tomorrow'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Yesterday'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Blank cells'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filter by condition'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filter by value'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'And'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Or'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Select all'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Clear'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancel'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Search'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Value'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Second value'), _dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 392 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getPhraseFormatters = exports.registerPhraseFormatter = undefined;\nexports.register = register;\nexports.getAll = getAll;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _pluralize = __webpack_require__(393);\n\nvar _pluralize2 = _interopRequireDefault(_pluralize);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _staticRegister = (0, _staticRegister3.default)('phraseFormatters'),\n    registerGloballyPhraseFormatter = _staticRegister.register,\n    getGlobalPhraseFormatters = _staticRegister.getValues;\n\n/**\n * Register phrase formatter.\n *\n * @param {String} name Name of formatter.\n * @param {Function} formatterFn Function which will be applied on phrase propositions. It will transform them if it's possible.\n */\n\n\nfunction register(name, formatterFn) {\n  registerGloballyPhraseFormatter(name, formatterFn);\n}\n\n/**\n * Get all registered previously formatters.\n *\n * @returns {Array}\n */\nfunction getAll() {\n  return getGlobalPhraseFormatters();\n}\n\nexports.registerPhraseFormatter = register;\nexports.getPhraseFormatters = getAll;\n\n\nregister('pluralize', _pluralize2.default);\n\n/***/ }),\n/* 393 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = pluralize;\n/**\n * Try to choose plural form from available phrase propositions.\n *\n * @param {Array} phrasePropositions List of phrases propositions.\n * @param {number} pluralForm Number determining which phrase form should be used.\n *\n * @returns {String|Array} One particular phrase if it's possible, list of unchanged phrase propositions otherwise.\n */\nfunction pluralize(phrasePropositions, pluralForm) {\n  var isPluralizable = Array.isArray(phrasePropositions) && Number.isInteger(pluralForm);\n\n  if (isPluralizable) {\n    return phrasePropositions[pluralForm];\n  }\n\n  return phrasePropositions;\n};\n\n/***/ }),\n/* 394 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.Selection = exports.Highlight = exports.handleMouseEvent = undefined;\n\nvar _highlight = __webpack_require__(319);\n\nvar _highlight2 = _interopRequireDefault(_highlight);\n\nvar _selection = __webpack_require__(401);\n\nvar _selection2 = _interopRequireDefault(_selection);\n\nvar _mouseEventHandler = __webpack_require__(312);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.handleMouseEvent = _mouseEventHandler.handleMouseEvent;\nexports.Highlight = _highlight2.default;\nexports.Selection = _selection2.default;\n\n/***/ }),\n/* 395 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.createHighlight = undefined;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _activeHeader = __webpack_require__(396);\n\nvar _activeHeader2 = _interopRequireDefault(_activeHeader);\n\nvar _area = __webpack_require__(397);\n\nvar _area2 = _interopRequireDefault(_area);\n\nvar _cell = __webpack_require__(398);\n\nvar _cell2 = _interopRequireDefault(_cell);\n\nvar _fill = __webpack_require__(399);\n\nvar _fill2 = _interopRequireDefault(_fill);\n\nvar _header = __webpack_require__(400);\n\nvar _header2 = _interopRequireDefault(_header);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint-disable import/prefer-default-export */\nvar _staticRegister = (0, _staticRegister3.default)('highlight/types'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem;\n\nregister('active-header', _activeHeader2.default);\nregister('area', _area2.default);\nregister('cell', _cell2.default);\nregister('fill', _fill2.default);\nregister('header', _header2.default);\n\nfunction createHighlight(highlightType, options) {\n  return getItem(highlightType)(options);\n}\n\nexports.createHighlight = createHighlight;\n\n/***/ }),\n/* 396 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * @return {Selection}\n */\nfunction createHighlight(_ref) {\n  var activeHeaderClassName = _ref.activeHeaderClassName;\n\n  var s = new _src.Selection({\n    highlightHeaderClassName: activeHeaderClassName\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 397 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * Creates the new instance of Selection responsible for highlighting area of the selected multiple cells.\n *\n * @return {Selection}\n */\nfunction createHighlight(_ref) {\n  var layerLevel = _ref.layerLevel,\n      areaCornerVisible = _ref.areaCornerVisible;\n\n  var s = new _src.Selection({\n    className: 'area',\n    markIntersections: true,\n    layerLevel: Math.min(layerLevel, 7),\n    border: {\n      width: 1,\n      color: '#4b89ff',\n      cornerVisible: areaCornerVisible\n    }\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 398 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * Creates the new instance of Selection responsible for highlighting currently selected cell. This type of selection\n * can present on the table only one at the time.\n *\n * @return {Selection}\n */\nfunction createHighlight(_ref) {\n  var cellCornerVisible = _ref.cellCornerVisible;\n\n  var s = new _src.Selection({\n    className: 'current',\n    border: {\n      width: 2,\n      color: '#4b89ff',\n      cornerVisible: cellCornerVisible\n    }\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 399 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * Creates the new instance of Selection, responsible for highlighting cells which are covered by fill handle\n * functionality. This type of selection can present on the table only one at the time.\n *\n * @return {Selection}\n */\nfunction createHighlight() {\n  var s = new _src.Selection({\n    className: 'fill',\n    border: {\n      width: 1,\n      color: '#ff0000'\n    }\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 400 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * Creates the new instance of Selection, responsible for highlighting row and column headers. This type of selection\n * can occur multiple times.\n *\n * @return {Selection}\n */\nfunction createHighlight(_ref) {\n  var headerClassName = _ref.headerClassName,\n      rowClassName = _ref.rowClassName,\n      columnClassName = _ref.columnClassName;\n\n  var s = new _src.Selection({\n    className: 'highlight',\n    highlightHeaderClassName: headerClassName,\n    highlightRowClassName: rowClassName,\n    highlightColumnClassName: columnClassName\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 401 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['Unsupported format of the selection ranges was passed. To select cells pass \\n        the coordinates as an array of arrays ([[rowStart, columnStart/columnPropStart, rowEnd, columnEnd/columnPropEnd]]) \\n        or as an array of CellRange objects.'], ['Unsupported format of the selection ranges was passed. To select cells pass\\\\x20\\n        the coordinates as an array of arrays ([[rowStart, columnStart/columnPropStart, rowEnd, columnEnd/columnPropEnd]])\\\\x20\\n        or as an array of CellRange objects.']);\n\nvar _highlight = __webpack_require__(319);\n\nvar _highlight2 = _interopRequireDefault(_highlight);\n\nvar _range = __webpack_require__(402);\n\nvar _range2 = _interopRequireDefault(_range);\n\nvar _src = __webpack_require__(4);\n\nvar _keyStateObserver = __webpack_require__(318);\n\nvar _object = __webpack_require__(2);\n\nvar _mixed = __webpack_require__(16);\n\nvar _array = __webpack_require__(1);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nvar _transformation = __webpack_require__(403);\n\nvar _transformation2 = _interopRequireDefault(_transformation);\n\nvar _utils = __webpack_require__(91);\n\nvar _templateLiteralTag = __webpack_require__(42);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Selection\n * @util\n */\nvar Selection = function () {\n  function Selection(settings, tableProps) {\n    var _this = this;\n\n    _classCallCheck(this, Selection);\n\n    /**\n     * Handsontable settings instance.\n     *\n     * @type {GridSettings}\n     */\n    this.settings = settings;\n    /**\n     * An additional object with dynamically defined properties which describes table state.\n     *\n     * @type {Object}\n     */\n    this.tableProps = tableProps;\n    /**\n     * The flag which determines if the selection is in progress.\n     *\n     * @type {Boolean}\n     */\n    this.inProgress = false;\n    /**\n     * The flag indicates that selection was performed by clicking the corner overlay.\n     *\n     * @type {Boolean}\n     */\n    this.selectedByCorner = false;\n    /**\n     * The collection of the selection layer levels where the whole row was selected using the row header.\n     *\n     * @type {Set.<Number>}\n     */\n    this.selectedByRowHeader = new Set();\n    /**\n     * The collection of the selection layer levels where the whole column was selected using the column header.\n     *\n     * @type {Set.<Number>}\n     */\n    this.selectedByColumnHeader = new Set();\n    /**\n     * Selection data layer.\n     *\n     * @type {SelectionRange}\n     */\n    this.selectedRange = new _range2.default();\n    /**\n     * Visualization layer.\n     *\n     * @type {Highlight}\n     */\n    this.highlight = new _highlight2.default({\n      headerClassName: settings.currentHeaderClassName,\n      activeHeaderClassName: settings.activeHeaderClassName,\n      rowClassName: settings.currentRowClassName,\n      columnClassName: settings.currentColClassName,\n      disableHighlight: this.settings.disableVisualSelection,\n      cellCornerVisible: function cellCornerVisible() {\n        return _this.isCellCornerVisible.apply(_this, arguments);\n      },\n      areaCornerVisible: function areaCornerVisible() {\n        return _this.isAreaCornerVisible.apply(_this, arguments);\n      }\n    });\n    /**\n     * The module for modifying coordinates.\n     *\n     * @type {Transformation}\n     */\n    this.transformation = new _transformation2.default(this.selectedRange, {\n      countRows: function countRows() {\n        return _this.tableProps.countRows();\n      },\n      countCols: function countCols() {\n        return _this.tableProps.countCols();\n      },\n      fixedRowsBottom: function fixedRowsBottom() {\n        return settings.fixedRowsBottom;\n      },\n      minSpareRows: function minSpareRows() {\n        return settings.minSpareRows;\n      },\n      minSpareCols: function minSpareCols() {\n        return settings.minSpareCols;\n      },\n      autoWrapRow: function autoWrapRow() {\n        return settings.autoWrapRow;\n      },\n      autoWrapCol: function autoWrapCol() {\n        return settings.autoWrapCol;\n      }\n    });\n\n    this.transformation.addLocalHook('beforeTransformStart', function () {\n      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['beforeModifyTransformStart'].concat(args));\n    });\n    this.transformation.addLocalHook('afterTransformStart', function () {\n      for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['afterModifyTransformStart'].concat(args));\n    });\n    this.transformation.addLocalHook('beforeTransformEnd', function () {\n      for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['beforeModifyTransformEnd'].concat(args));\n    });\n    this.transformation.addLocalHook('afterTransformEnd', function () {\n      for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        args[_key4] = arguments[_key4];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['afterModifyTransformEnd'].concat(args));\n    });\n    this.transformation.addLocalHook('insertRowRequire', function () {\n      for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n        args[_key5] = arguments[_key5];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['insertRowRequire'].concat(args));\n    });\n    this.transformation.addLocalHook('insertColRequire', function () {\n      for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n        args[_key6] = arguments[_key6];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['insertColRequire'].concat(args));\n    });\n  }\n\n  /**\n   * Get data layer for current selection.\n   *\n   * @return {SelectionRange}\n   */\n\n\n  _createClass(Selection, [{\n    key: 'getSelectedRange',\n    value: function getSelectedRange() {\n      return this.selectedRange;\n    }\n\n    /**\n     * Indicate that selection process began. It sets internaly `.inProgress` property to `true`.\n     */\n\n  }, {\n    key: 'begin',\n    value: function begin() {\n      this.inProgress = true;\n    }\n\n    /**\n     * Indicate that selection process finished. It sets internaly `.inProgress` property to `false`.\n     */\n\n  }, {\n    key: 'finish',\n    value: function finish() {\n      this.runLocalHooks('afterSelectionFinished', Array.from(this.selectedRange));\n      this.inProgress = false;\n    }\n\n    /**\n     * Check if the process of selecting the cell/cells is in progress.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isInProgress',\n    value: function isInProgress() {\n      return this.inProgress;\n    }\n\n    /**\n     * Starts selection range on given coordinate object.\n     *\n     * @param {CellCoords} coords Visual coords.\n     * @param {Boolean} [multipleSelection] If `true`, selection will be worked in 'multiple' mode. This option works\n     *                                      only when 'selectionMode' is set as 'multiple'. If the argument is not defined\n     *                                      the default trigger will be used (isPressedCtrlKey() helper).\n     * @param {Boolean} [fragment=false] If `true`, the selection will be treated as a partial selection where the\n     *                                   `setRangeEnd` method won't be called on every `setRangeStart` call.\n     */\n\n  }, {\n    key: 'setRangeStart',\n    value: function setRangeStart(coords, multipleSelection) {\n      var fragment = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      var isMultipleMode = this.settings.selectionMode === 'multiple';\n      var isMultipleSelection = (0, _mixed.isUndefined)(multipleSelection) ? (0, _keyStateObserver.isPressedCtrlKey)() : multipleSelection;\n      var isRowNegative = coords.row < 0;\n      var isColumnNegative = coords.col < 0;\n      var selectedByCorner = isRowNegative && isColumnNegative;\n\n      if (isRowNegative) {\n        coords.row = 0;\n      }\n      if (isColumnNegative) {\n        coords.col = 0;\n      }\n\n      this.selectedByCorner = selectedByCorner;\n      this.runLocalHooks('beforeSetRangeStart' + (fragment ? 'Only' : ''), coords);\n\n      if (!isMultipleMode || isMultipleMode && !isMultipleSelection && (0, _mixed.isUndefined)(multipleSelection)) {\n        this.selectedRange.clear();\n      }\n\n      this.selectedRange.add(coords);\n\n      if (this.getLayerLevel() === 0) {\n        this.selectedByRowHeader.clear();\n        this.selectedByColumnHeader.clear();\n      }\n\n      if (!selectedByCorner && isColumnNegative) {\n        this.selectedByRowHeader.add(this.getLayerLevel());\n      }\n      if (!selectedByCorner && isRowNegative) {\n        this.selectedByColumnHeader.add(this.getLayerLevel());\n      }\n\n      if (!fragment) {\n        this.setRangeEnd(coords);\n      }\n    }\n\n    /**\n     * Starts selection range on given coordinate object.\n     *\n     * @param {CellCoords} coords Visual coords.\n     * @param {Boolean} [multipleSelection] If `true`, selection will be worked in 'multiple' mode. This option works\n     *                                      only when 'selectionMode' is set as 'multiple'. If the argument is not defined\n     *                                      the default trigger will be used (isPressedCtrlKey() helper).\n     */\n\n  }, {\n    key: 'setRangeStartOnly',\n    value: function setRangeStartOnly(coords, multipleSelection) {\n      this.setRangeStart(coords, multipleSelection, true);\n    }\n\n    /**\n     * Ends selection range on given coordinate object.\n     *\n     * @param {CellCoords} coords Visual coords.\n     */\n\n  }, {\n    key: 'setRangeEnd',\n    value: function setRangeEnd(coords) {\n      if (this.selectedRange.isEmpty()) {\n        return;\n      }\n\n      this.runLocalHooks('beforeSetRangeEnd', coords);\n      this.begin();\n\n      var cellRange = this.selectedRange.current();\n\n      if (this.settings.selectionMode !== 'single') {\n        cellRange.setTo(new _src.CellCoords(coords.row, coords.col));\n      }\n\n      // Set up current selection.\n      this.highlight.getCell().clear();\n\n      if (this.highlight.isEnabledFor(_highlight.CELL_TYPE)) {\n        this.highlight.getCell().add(this.selectedRange.current().highlight);\n      }\n\n      var layerLevel = this.getLayerLevel();\n\n      // If the next layer level is lower than previous then clear all area and header highlights. This is the\n      // indication that the new selection is performing.\n      if (layerLevel < this.highlight.layerLevel) {\n        (0, _array.arrayEach)(this.highlight.getAreas(), function (highlight) {\n          return void highlight.clear();\n        });\n        (0, _array.arrayEach)(this.highlight.getHeaders(), function (highlight) {\n          return void highlight.clear();\n        });\n        (0, _array.arrayEach)(this.highlight.getActiveHeaders(), function (highlight) {\n          return void highlight.clear();\n        });\n      }\n\n      this.highlight.useLayerLevel(layerLevel);\n\n      var areaHighlight = this.highlight.createOrGetArea();\n      var headerHighlight = this.highlight.createOrGetHeader();\n      var activeHeaderHighlight = this.highlight.createOrGetActiveHeader();\n\n      areaHighlight.clear();\n      headerHighlight.clear();\n      activeHeaderHighlight.clear();\n\n      if (this.highlight.isEnabledFor(_highlight.AREA_TYPE) && (this.isMultiple() || layerLevel >= 1)) {\n        areaHighlight.add(cellRange.from).add(cellRange.to);\n\n        if (layerLevel === 1) {\n          // For single cell selection in the same layer, we do not create area selection to prevent blue background.\n          // When non-consecutive selection is performed we have to add that missing area selection to the previous layer\n          // based on previous coordinates. It only occurs when the previous selection wasn't select multiple cells.\n          this.highlight.useLayerLevel(layerLevel - 1).createOrGetArea().add(this.selectedRange.previous().from);\n\n          this.highlight.useLayerLevel(layerLevel);\n        }\n      }\n\n      if (this.highlight.isEnabledFor(_highlight.HEADER_TYPE)) {\n        if (this.settings.selectionMode === 'single') {\n          headerHighlight.add(cellRange.highlight);\n        } else {\n          headerHighlight.add(cellRange.from).add(cellRange.to);\n        }\n      }\n\n      if (this.isSelectedByRowHeader()) {\n        var isRowSelected = this.tableProps.countCols() === cellRange.getWidth();\n\n        // Make sure that the whole row is selected (in case where selectionMode is set to 'single')\n        if (isRowSelected) {\n          activeHeaderHighlight.add(new _src.CellCoords(cellRange.from.row, -1)).add(new _src.CellCoords(cellRange.to.row, -1));\n        }\n      }\n\n      if (this.isSelectedByColumnHeader()) {\n        var isColumnSelected = this.tableProps.countRows() === cellRange.getHeight();\n\n        // Make sure that the whole column is selected (in case where selectionMode is set to 'single')\n        if (isColumnSelected) {\n          activeHeaderHighlight.add(new _src.CellCoords(-1, cellRange.from.col)).add(new _src.CellCoords(-1, cellRange.to.col));\n        }\n      }\n\n      this.runLocalHooks('afterSetRangeEnd', coords);\n    }\n\n    /**\n     * Returns information if we have a multiselection. This method check multiselection only on the latest layer of\n     * the selection.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isMultiple',\n    value: function isMultiple() {\n      var isMultipleListener = (0, _object.createObjectPropListener)(!this.selectedRange.current().isSingle());\n\n      this.runLocalHooks('afterIsMultipleSelection', isMultipleListener);\n\n      return isMultipleListener.value;\n    }\n\n    /**\n     * Selects cell relative to the current cell (if possible).\n     *\n     * @param {Number} rowDelta Rows number to move, value can be passed as negative number.\n     * @param {Number} colDelta Columns number to move, value can be passed as negative number.\n     * @param {Boolean} force If `true` the new rows/columns will be created if necessary. Otherwise, row/column will\n     *                        be created according to `minSpareRows/minSpareCols` settings of Handsontable.\n     */\n\n  }, {\n    key: 'transformStart',\n    value: function transformStart(rowDelta, colDelta, force) {\n      this.setRangeStart(this.transformation.transformStart(rowDelta, colDelta, force));\n    }\n\n    /**\n     * Sets selection end cell relative to the current selection end cell (if possible).\n     *\n     * @param {Number} rowDelta Rows number to move, value can be passed as negative number.\n     * @param {Number} colDelta Columns number to move, value can be passed as negative number.\n     */\n\n  }, {\n    key: 'transformEnd',\n    value: function transformEnd(rowDelta, colDelta) {\n      this.setRangeEnd(this.transformation.transformEnd(rowDelta, colDelta));\n    }\n\n    /**\n     * Returns currently used layer level.\n     *\n     * @return {Number} Returns layer level starting from 0. If no selection was added to the table -1 is returned.\n     */\n\n  }, {\n    key: 'getLayerLevel',\n    value: function getLayerLevel() {\n      return this.selectedRange.size() - 1;\n    }\n\n    /**\n     * Returns `true` if currently there is a selection on the screen, `false` otherwise.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSelected',\n    value: function isSelected() {\n      return !this.selectedRange.isEmpty();\n    }\n\n    /**\n     * Returns `true` if the selection was applied by clicking to the row header. If the `layerLevel`\n     * argument is passed then only that layer will be checked. Otherwise, it checks if any row header\n     * was clicked on any selection layer level.\n     *\n     * @param {Number} [layerLevel=this.getLayerLevel()] Selection layer level to check.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSelectedByRowHeader',\n    value: function isSelectedByRowHeader() {\n      var layerLevel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getLayerLevel();\n\n      return layerLevel === -1 ? this.selectedByRowHeader.size > 0 : this.selectedByRowHeader.has(layerLevel);\n    }\n\n    /**\n     * Returns `true` if the selection was applied by clicking to the column header. If the `layerLevel`\n     * argument is passed then only that layer will be checked. Otherwise, it checks if any column header\n     * was clicked on any selection layer level.\n     *\n     * @param {Number} [layerLevel=this.getLayerLevel()] Selection layer level to check.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSelectedByColumnHeader',\n    value: function isSelectedByColumnHeader() {\n      var layerLevel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getLayerLevel();\n\n      return layerLevel === -1 ? this.selectedByColumnHeader.size > 0 : this.selectedByColumnHeader.has(layerLevel);\n    }\n\n    /**\n     * Returns `true` if the selection was applied by clicking on the row or column header on any layer level.\n     *\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSelectedByAnyHeader',\n    value: function isSelectedByAnyHeader() {\n      return this.isSelectedByRowHeader(-1) || this.isSelectedByColumnHeader(-1);\n    }\n\n    /**\n     * Returns `true` if the selection was applied by clicking on the left-top corner overlay.\n     *\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSelectedByCorner',\n    value: function isSelectedByCorner() {\n      return this.selectedByCorner;\n    }\n\n    /**\n     * Returns `true` if coords is within selection coords. This method iterates through all selection layers to check if\n     * the coords object is within selection range.\n     *\n     * @param {CellCoords} coords The CellCoords instance with defined visual coordinates.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'inInSelection',\n    value: function inInSelection(coords) {\n      return this.selectedRange.includes(coords);\n    }\n\n    /**\n     * Returns `true` if the cell corner should be visible.\n     *\n     * @private\n     * @return {Boolean} `true` if the corner element has to be visible, `false` otherwise.\n     */\n\n  }, {\n    key: 'isCellCornerVisible',\n    value: function isCellCornerVisible() {\n      return this.settings.fillHandle && !this.tableProps.isEditorOpened() && !this.isMultiple();\n    }\n\n    /**\n     * Returns `true` if the area corner should be visible.\n     *\n     * @param {Number} layerLevel The layer level.\n     * @return {Boolean} `true` if the corner element has to be visible, `false` otherwise.\n     */\n\n  }, {\n    key: 'isAreaCornerVisible',\n    value: function isAreaCornerVisible(layerLevel) {\n      if (Number.isInteger(layerLevel) && layerLevel !== this.getLayerLevel()) {\n        return false;\n      }\n\n      return this.settings.fillHandle && !this.tableProps.isEditorOpened() && this.isMultiple();\n    }\n\n    /**\n     * Clear the selection by resetting the collected ranges and highlights.\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.selectedRange.clear();\n      this.highlight.clear();\n    }\n\n    /**\n     * Deselects all selected cells.\n     */\n\n  }, {\n    key: 'deselect',\n    value: function deselect() {\n      if (!this.isSelected()) {\n        return;\n      }\n\n      this.inProgress = false;\n      this.clear();\n      this.runLocalHooks('afterDeselect');\n    }\n\n    /**\n     * Select all cells.\n     */\n\n  }, {\n    key: 'selectAll',\n    value: function selectAll() {\n      this.clear();\n      this.setRangeStart(new _src.CellCoords(-1, -1));\n      this.selectedByRowHeader.add(this.getLayerLevel());\n      this.selectedByColumnHeader.add(this.getLayerLevel());\n      this.setRangeEnd(new _src.CellCoords(this.tableProps.countRows() - 1, this.tableProps.countCols() - 1));\n    }\n\n    /**\n     * Make multiple, non-contiguous selection specified by `row` and `column` values or a range of cells\n     * finishing at `endRow`, `endColumn`. The method supports two input formats, first as an array of arrays such\n     * as `[[rowStart, columnStart, rowEnd, columnEnd]]` and second format as an array of CellRange objects.\n     * If the passed ranges have another format the exception will be thrown.\n     *\n     * @param {Array[]|CellRange[]} selectionRanges The coordinates which define what the cells should be selected.\n     * @return {Boolean} Returns `true` if selection was successful, `false` otherwise.\n     */\n\n  }, {\n    key: 'selectCells',\n    value: function selectCells(selectionRanges) {\n      var _this2 = this;\n\n      var selectionType = (0, _utils.detectSelectionType)(selectionRanges);\n\n      if (selectionType === _utils.SELECTION_TYPE_EMPTY) {\n        return false;\n      } else if (selectionType === _utils.SELECTION_TYPE_UNRECOGNIZED) {\n        throw new Error((0, _templateLiteralTag.toSingleLine)(_templateObject));\n      }\n\n      var selectionSchemaNormalizer = (0, _utils.normalizeSelectionFactory)(selectionType, {\n        propToCol: function propToCol(prop) {\n          return _this2.tableProps.propToCol(prop);\n        },\n        keepDirection: true\n      });\n      var countRows = this.tableProps.countRows();\n      var countCols = this.tableProps.countCols();\n\n      // Check if every layer of the coordinates are valid.\n      var isValid = !selectionRanges.some(function (selection) {\n        var _selectionSchemaNorma = selectionSchemaNormalizer(selection),\n            _selectionSchemaNorma2 = _slicedToArray(_selectionSchemaNorma, 4),\n            rowStart = _selectionSchemaNorma2[0],\n            columnStart = _selectionSchemaNorma2[1],\n            rowEnd = _selectionSchemaNorma2[2],\n            columnEnd = _selectionSchemaNorma2[3];\n\n        var _isValid = (0, _utils.isValidCoord)(rowStart, countRows) && (0, _utils.isValidCoord)(columnStart, countCols) && (0, _utils.isValidCoord)(rowEnd, countRows) && (0, _utils.isValidCoord)(columnEnd, countCols);\n\n        return !_isValid;\n      });\n\n      if (isValid) {\n        this.clear();\n\n        (0, _array.arrayEach)(selectionRanges, function (selection) {\n          var _selectionSchemaNorma3 = selectionSchemaNormalizer(selection),\n              _selectionSchemaNorma4 = _slicedToArray(_selectionSchemaNorma3, 4),\n              rowStart = _selectionSchemaNorma4[0],\n              columnStart = _selectionSchemaNorma4[1],\n              rowEnd = _selectionSchemaNorma4[2],\n              columnEnd = _selectionSchemaNorma4[3];\n\n          _this2.setRangeStartOnly(new _src.CellCoords(rowStart, columnStart), false);\n          _this2.setRangeEnd(new _src.CellCoords(rowEnd, columnEnd));\n          _this2.finish();\n        });\n      }\n\n      return isValid;\n    }\n\n    /**\n     * Select column specified by `startColumn` visual index or column property or a range of columns finishing at `endColumn`.\n     *\n     * @param {Number|String} startColumn Visual column index or column property from which the selection starts.\n     * @param {Number|String} [endColumn] Visual column index or column property from to the selection finishes.\n     * @returns {Boolean} Returns `true` if selection was successful, `false` otherwise.\n     */\n\n  }, {\n    key: 'selectColumns',\n    value: function selectColumns(startColumn) {\n      var endColumn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startColumn;\n\n      startColumn = typeof startColumn === 'string' ? this.tableProps.propToCol(startColumn) : startColumn;\n      endColumn = typeof endColumn === 'string' ? this.tableProps.propToCol(endColumn) : endColumn;\n\n      var countCols = this.tableProps.countCols();\n      var isValid = (0, _utils.isValidCoord)(startColumn, countCols) && (0, _utils.isValidCoord)(endColumn, countCols);\n\n      if (isValid) {\n        this.setRangeStartOnly(new _src.CellCoords(-1, startColumn));\n        this.setRangeEnd(new _src.CellCoords(this.tableProps.countRows() - 1, endColumn));\n        this.finish();\n      }\n\n      return isValid;\n    }\n\n    /**\n     * Select row specified by `startRow` visual index or a range of rows finishing at `endRow`.\n     *\n     * @param {Number} startRow Visual row index from which the selection starts.\n     * @param {Number} [endRow] Visual row index from to the selection finishes.\n     * @returns {Boolean} Returns `true` if selection was successful, `false` otherwise.\n     */\n\n  }, {\n    key: 'selectRows',\n    value: function selectRows(startRow) {\n      var endRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startRow;\n\n      var countRows = this.tableProps.countRows();\n      var isValid = (0, _utils.isValidCoord)(startRow, countRows) && (0, _utils.isValidCoord)(endRow, countRows);\n\n      if (isValid) {\n        this.setRangeStartOnly(new _src.CellCoords(startRow, -1));\n        this.setRangeEnd(new _src.CellCoords(endRow, this.tableProps.countCols() - 1));\n        this.finish();\n      }\n\n      return isValid;\n    }\n  }]);\n\n  return Selection;\n}();\n\n(0, _object.mixin)(Selection, _localHooks2.default);\n\nexports.default = Selection;\n\n/***/ }),\n/* 402 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _src = __webpack_require__(4);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * The SelectionRange class is a simple CellRanges collection designed for easy manipulation of the multiple\n * consecutive and non-consecutive selections.\n *\n * @class SelectionRange\n * @util\n */\nvar SelectionRange = function () {\n  function SelectionRange() {\n    _classCallCheck(this, SelectionRange);\n\n    /**\n     * List of all CellRanges added to the class instance.\n     *\n     * @type {CellRange[]}\n     */\n    this.ranges = [];\n  }\n\n  /**\n   * Check if selected range is empty.\n   *\n   * @return {Boolean}\n   */\n\n\n  _createClass(SelectionRange, [{\n    key: 'isEmpty',\n    value: function isEmpty() {\n      return this.size() === 0;\n    }\n\n    /**\n     * Set coordinates to the class instance. It clears all previously added coordinates and push `coords`\n     * to the collection.\n     *\n     * @param {CellCoords} coords The CellCoords instance with defined visual coordinates.\n     * @returns {SelectionRange}\n     */\n\n  }, {\n    key: 'set',\n    value: function set(coords) {\n      this.clear();\n      this.ranges.push(new _src.CellRange(coords));\n\n      return this;\n    }\n\n    /**\n     * Add coordinates to the class instance. The new coordinates are added to the end of the range collection.\n     *\n     * @param {CellCoords} coords The CellCoords instance with defined visual coordinates.\n     * @returns {SelectionRange}\n     */\n\n  }, {\n    key: 'add',\n    value: function add(coords) {\n      this.ranges.push(new _src.CellRange(coords));\n\n      return this;\n    }\n\n    /**\n     * Get last added coordinates from ranges, it returns a CellRange instance.\n     *\n     * @return {CellRange|undefined}\n     */\n\n  }, {\n    key: 'current',\n    value: function current() {\n      return this.peekByIndex(0);\n    }\n\n    /**\n     * Get previously added coordinates from ranges, it returns a CellRange instance.\n     *\n     * @return {CellRange|undefined}\n     */\n\n  }, {\n    key: 'previous',\n    value: function previous() {\n      return this.peekByIndex(-1);\n    }\n\n    /**\n     * Returns `true` if coords is within selection coords. This method iterates through all selection layers to check if\n     * the coords object is within selection range.\n     *\n     * @param {CellCoords} coords The CellCoords instance with defined visual coordinates.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'includes',\n    value: function includes(coords) {\n      return this.ranges.some(function (cellRange) {\n        return cellRange.includes(coords);\n      });\n    }\n\n    /**\n     * Clear collection.\n     *\n     * @return {SelectionRange}\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.ranges.length = 0;\n\n      return this;\n    }\n\n    /**\n     * Get count of added all coordinates added to the selection.\n     *\n     * @return {Number}\n     */\n\n  }, {\n    key: 'size',\n    value: function size() {\n      return this.ranges.length;\n    }\n\n    /**\n     * Peek the coordinates based on the offset where that coordinate resides in the collection.\n     *\n     * @param {Number} [offset=0] An offset where the coordinate will be retrieved from.\n     * @return {CellRange|undefined}\n     */\n\n  }, {\n    key: 'peekByIndex',\n    value: function peekByIndex() {\n      var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n      var rangeIndex = this.size() + offset - 1;\n      var cellRange = void 0;\n\n      if (rangeIndex >= 0) {\n        cellRange = this.ranges[rangeIndex];\n      }\n\n      return cellRange;\n    }\n  }, {\n    key: Symbol.iterator,\n    value: function value() {\n      return this.ranges[Symbol.iterator]();\n    }\n  }]);\n\n  return SelectionRange;\n}();\n\nexports.default = SelectionRange;\n\n/***/ }),\n/* 403 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _src = __webpack_require__(4);\n\nvar _object = __webpack_require__(2);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * The Transformation class implements algorithms for transforming coordinates based on current settings\n * passed to the Handsontable.\n *\n * Transformation is always applied relative to the current selection.\n *\n * @class Transformation\n * @util\n */\nvar Transformation = function () {\n  function Transformation(range, options) {\n    _classCallCheck(this, Transformation);\n\n    /**\n     * Instance of the SelectionRange, holder for coordinates applied to the table.\n     *\n     * @type {SelectionRange}\n     */\n    this.range = range;\n    /**\n     * Additional options which define the state of the settings which can infer transformation.\n     *\n     * @type {Object}\n     */\n    this.options = options;\n  }\n\n  /**\n   * Selects cell relative to current cell (if possible).\n   *\n   * @param {Number} rowDelta Rows number to move, value can be passed as negative number.\n   * @param {Number} colDelta Columns number to move, value can be passed as negative number.\n   * @param {Boolean} force If `true` the new rows/columns will be created if necessary. Otherwise, row/column will\n   *                        be created according to `minSpareRows/minSpareCols` settings of Handsontable.\n   * @returns {CellCoords}\n   */\n\n\n  _createClass(Transformation, [{\n    key: 'transformStart',\n    value: function transformStart(rowDelta, colDelta, force) {\n      var delta = new _src.CellCoords(rowDelta, colDelta);\n\n      this.runLocalHooks('beforeTransformStart', delta);\n\n      var totalRows = this.options.countRows();\n      var totalCols = this.options.countCols();\n      var fixedRowsBottom = this.options.fixedRowsBottom();\n      var minSpareRows = this.options.minSpareRows();\n      var minSpareCols = this.options.minSpareCols();\n      var autoWrapRow = this.options.autoWrapRow();\n      var autoWrapCol = this.options.autoWrapCol();\n      var highlightCoords = this.range.current().highlight;\n\n      if (highlightCoords.row + rowDelta > totalRows - 1) {\n        if (force && minSpareRows > 0 && !(fixedRowsBottom && highlightCoords.row >= totalRows - fixedRowsBottom - 1)) {\n          this.runLocalHooks('insertRowRequire', totalRows);\n          totalRows = this.options.countRows();\n        } else if (autoWrapCol) {\n          delta.row = 1 - totalRows;\n          delta.col = highlightCoords.col + delta.col == totalCols - 1 ? 1 - totalCols : 1;\n        }\n      } else if (autoWrapCol && highlightCoords.row + delta.row < 0 && highlightCoords.col + delta.col >= 0) {\n        delta.row = totalRows - 1;\n        delta.col = highlightCoords.col + delta.col == 0 ? totalCols - 1 : -1;\n      }\n\n      if (highlightCoords.col + delta.col > totalCols - 1) {\n        if (force && minSpareCols > 0) {\n          this.runLocalHooks('insertColRequire', totalRows);\n          totalCols = this.options.countCols();\n        } else if (autoWrapRow) {\n          delta.row = highlightCoords.row + delta.row == totalRows - 1 ? 1 - totalRows : 1;\n          delta.col = 1 - totalCols;\n        }\n      } else if (autoWrapRow && highlightCoords.col + delta.col < 0 && highlightCoords.row + delta.row >= 0) {\n        delta.row = highlightCoords.row + delta.row == 0 ? totalRows - 1 : -1;\n        delta.col = totalCols - 1;\n      }\n\n      var coords = new _src.CellCoords(highlightCoords.row + delta.row, highlightCoords.col + delta.col);\n      var rowTransformDir = 0;\n      var colTransformDir = 0;\n\n      if (coords.row < 0) {\n        rowTransformDir = -1;\n        coords.row = 0;\n      } else if (coords.row > 0 && coords.row >= totalRows) {\n        rowTransformDir = 1;\n        coords.row = totalRows - 1;\n      }\n\n      if (coords.col < 0) {\n        colTransformDir = -1;\n        coords.col = 0;\n      } else if (coords.col > 0 && coords.col >= totalCols) {\n        colTransformDir = 1;\n        coords.col = totalCols - 1;\n      }\n      this.runLocalHooks('afterTransformStart', coords, rowTransformDir, colTransformDir);\n\n      return coords;\n    }\n\n    /**\n     * Sets selection end cell relative to current selection end cell (if possible).\n     *\n     * @param {Number} rowDelta Rows number to move, value can be passed as negative number.\n     * @param {Number} colDelta Columns number to move, value can be passed as negative number.\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'transformEnd',\n    value: function transformEnd(rowDelta, colDelta) {\n      var delta = new _src.CellCoords(rowDelta, colDelta);\n\n      this.runLocalHooks('beforeTransformEnd', delta);\n\n      var totalRows = this.options.countRows();\n      var totalCols = this.options.countCols();\n      var cellRange = this.range.current();\n      var coords = new _src.CellCoords(cellRange.to.row + delta.row, cellRange.to.col + delta.col);\n      var rowTransformDir = 0;\n      var colTransformDir = 0;\n\n      if (coords.row < 0) {\n        rowTransformDir = -1;\n        coords.row = 0;\n      } else if (coords.row > 0 && coords.row >= totalRows) {\n        rowTransformDir = 1;\n        coords.row = totalRows - 1;\n      }\n\n      if (coords.col < 0) {\n        colTransformDir = -1;\n        coords.col = 0;\n      } else if (coords.col > 0 && coords.col >= totalCols) {\n        colTransformDir = 1;\n        coords.col = totalCols - 1;\n      }\n      this.runLocalHooks('afterTransformEnd', coords, rowTransformDir, colTransformDir);\n\n      return coords;\n    }\n  }]);\n\n  return Transformation;\n}();\n\n(0, _object.mixin)(Transformation, _localHooks2.default);\n\nexports.default = Transformation;\n\n/***/ }),\n/* 404 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = jQueryWrapper;\nfunction jQueryWrapper(Handsontable) {\n  var jQuery = typeof window === 'undefined' ? false : window.jQuery;\n\n  if (!jQuery) {\n    return;\n  }\n\n  jQuery.fn.handsontable = function (action) {\n    var $this = this.first(); // Use only first element from list\n    var instance = $this.data('handsontable');\n\n    // Init case\n    if (typeof action !== 'string') {\n      var userSettings = action || {};\n\n      if (instance) {\n        instance.updateSettings(userSettings);\n      } else {\n        instance = new Handsontable.Core($this[0], userSettings);\n        $this.data('handsontable', instance);\n        instance.init();\n      }\n\n      return $this;\n    }\n\n    // Action case\n    var args = [];\n    var output = void 0;\n\n    if (arguments.length > 1) {\n      for (var i = 1, ilen = arguments.length; i < ilen; i++) {\n        args.push(arguments[i]);\n      }\n    }\n\n    if (instance) {\n      if (typeof instance[action] !== 'undefined') {\n        output = instance[action].apply(instance, args);\n\n        if (action === 'destroy') {\n          $this.removeData();\n        }\n      } else {\n        throw new Error('Handsontable do not provide action: ' + action);\n      }\n    }\n\n    return output;\n  };\n};\n\n/***/ }),\n/* 405 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.Base = exports.UndoRedo = exports.TouchScroll = exports.Search = exports.PersistentState = exports.ObserveChanges = exports.MultipleSelectionHandles = exports.MergeCells = exports.ManualRowResize = exports.ManualRowMove = exports.ManualColumnResize = exports.ManualColumnMove = exports.ManualColumnFreeze = exports.DragToScroll = exports.CustomBorders = exports.CopyPaste = exports.ContextMenu = exports.Comments = exports.ColumnSorting = exports.AutoRowSize = exports.AutoFill = exports.AutoColumnSize = undefined;\n\nvar _persistentState = __webpack_require__(406);\n\nvar _persistentState2 = _interopRequireDefault(_persistentState);\n\nvar _autoColumnSize = __webpack_require__(408);\n\nvar _autoColumnSize2 = _interopRequireDefault(_autoColumnSize);\n\nvar _autofill = __webpack_require__(409);\n\nvar _autofill2 = _interopRequireDefault(_autofill);\n\nvar _autoRowSize = __webpack_require__(411);\n\nvar _autoRowSize2 = _interopRequireDefault(_autoRowSize);\n\nvar _columnSorting = __webpack_require__(412);\n\nvar _columnSorting2 = _interopRequireDefault(_columnSorting);\n\nvar _comments = __webpack_require__(415);\n\nvar _comments2 = _interopRequireDefault(_comments);\n\nvar _contextMenu = __webpack_require__(419);\n\nvar _contextMenu2 = _interopRequireDefault(_contextMenu);\n\nvar _copyPaste = __webpack_require__(436);\n\nvar _copyPaste2 = _interopRequireDefault(_copyPaste);\n\nvar _customBorders = __webpack_require__(443);\n\nvar _customBorders2 = _interopRequireDefault(_customBorders);\n\nvar _dragToScroll = __webpack_require__(449);\n\nvar _dragToScroll2 = _interopRequireDefault(_dragToScroll);\n\nvar _manualColumnFreeze = __webpack_require__(450);\n\nvar _manualColumnFreeze2 = _interopRequireDefault(_manualColumnFreeze);\n\nvar _manualColumnMove = __webpack_require__(454);\n\nvar _manualColumnMove2 = _interopRequireDefault(_manualColumnMove);\n\nvar _manualColumnResize = __webpack_require__(459);\n\nvar _manualColumnResize2 = _interopRequireDefault(_manualColumnResize);\n\nvar _manualRowMove = __webpack_require__(460);\n\nvar _manualRowMove2 = _interopRequireDefault(_manualRowMove);\n\nvar _manualRowResize = __webpack_require__(465);\n\nvar _manualRowResize2 = _interopRequireDefault(_manualRowResize);\n\nvar _mergeCells = __webpack_require__(466);\n\nvar _mergeCells2 = _interopRequireDefault(_mergeCells);\n\nvar _multipleSelectionHandles = __webpack_require__(472);\n\nvar _multipleSelectionHandles2 = _interopRequireDefault(_multipleSelectionHandles);\n\nvar _observeChanges = __webpack_require__(473);\n\nvar _observeChanges2 = _interopRequireDefault(_observeChanges);\n\nvar _search = __webpack_require__(476);\n\nvar _search2 = _interopRequireDefault(_search);\n\nvar _touchScroll = __webpack_require__(477);\n\nvar _touchScroll2 = _interopRequireDefault(_touchScroll);\n\nvar _undoRedo = __webpack_require__(478);\n\nvar _undoRedo2 = _interopRequireDefault(_undoRedo);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.AutoColumnSize = _autoColumnSize2.default;\nexports.AutoFill = _autofill2.default;\nexports.AutoRowSize = _autoRowSize2.default;\nexports.ColumnSorting = _columnSorting2.default;\nexports.Comments = _comments2.default;\nexports.ContextMenu = _contextMenu2.default;\nexports.CopyPaste = _copyPaste2.default;\nexports.CustomBorders = _customBorders2.default;\nexports.DragToScroll = _dragToScroll2.default;\nexports.ManualColumnFreeze = _manualColumnFreeze2.default;\nexports.ManualColumnMove = _manualColumnMove2.default;\nexports.ManualColumnResize = _manualColumnResize2.default;\nexports.ManualRowMove = _manualRowMove2.default;\nexports.ManualRowResize = _manualRowResize2.default;\nexports.MergeCells = _mergeCells2.default;\nexports.MultipleSelectionHandles = _multipleSelectionHandles2.default;\nexports.ObserveChanges = _observeChanges2.default;\nexports.PersistentState = _persistentState2.default;\nexports.Search = _search2.default;\nexports.TouchScroll = _touchScroll2.default;\nexports.UndoRedo = _undoRedo2.default;\nexports.Base = _base2.default;\n\n/***/ }),\n/* 406 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _storage = __webpack_require__(407);\n\nvar _storage2 = _interopRequireDefault(_storage);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('persistentStateSave');\n_pluginHooks2.default.getSingleton().register('persistentStateLoad');\n_pluginHooks2.default.getSingleton().register('persistentStateReset');\n\n/**\n * Save the state of column sorting, column positions and column sizes in local storage\n * to preserve table state between page reloads.\n *\n * In order to enable data storage mechanism, persistentState option must be set to true.\n *\n * When persistentState is enabled it exposes 3 hooks:\n *\n * persistentStateSave (key: String, value: Mixed) -\n * Saves value under given key in browser local storage.\n *\n * persistentStateLoad (key: String, saveTo: Object) -\n * Loads value, saved under given key, form browser local storage.\n * The loaded value will be saved in saveTo.value.\n *\n * persistentStateReset (key: String) -\n * Clears the value saved under key.\n * If no key is given, all values associated with table will be cleared.\n *\n * @plugin persistentState\n */\n\nvar PersistentState = function (_BasePlugin) {\n  _inherits(PersistentState, _BasePlugin);\n\n  function PersistentState(hotInstance) {\n    _classCallCheck(this, PersistentState);\n\n    /**\n     * Instance of {@link Storage}.\n     *\n     * @type {Storage}\n     */\n    var _this = _possibleConstructorReturn(this, (PersistentState.__proto__ || Object.getPrototypeOf(PersistentState)).call(this, hotInstance));\n\n    _this.storage = void 0;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(PersistentState, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().persistentState;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      if (!this.storage) {\n        this.storage = new _storage2.default(this.hot.rootElement.id);\n      }\n\n      this.addHook('persistentStateSave', function (key, value) {\n        return _this2.saveValue(key, value);\n      });\n      this.addHook('persistentStateLoad', function (key, saveTo) {\n        return _this2.loadValue(key, saveTo);\n      });\n      this.addHook('persistentStateReset', function () {\n        return _this2.resetValue();\n      });\n\n      _get(PersistentState.prototype.__proto__ || Object.getPrototypeOf(PersistentState.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.storage = void 0;\n\n      _get(PersistentState.prototype.__proto__ || Object.getPrototypeOf(PersistentState.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(PersistentState.prototype.__proto__ || Object.getPrototypeOf(PersistentState.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Load value from localStorage.\n     *\n     * @param {String} key Key string.\n     * @param {Object} saveTo Saved value from browser local storage.\n     */\n\n  }, {\n    key: 'loadValue',\n    value: function loadValue(key, saveTo) {\n      saveTo.value = this.storage.loadValue(key);\n    }\n\n    /**\n     * Save data to localStorage.\n     *\n     * @param {String} key Key string.\n     * @param {Mixed} value Value to save.\n     */\n\n  }, {\n    key: 'saveValue',\n    value: function saveValue(key, value) {\n      this.storage.saveValue(key, value);\n    }\n\n    /**\n     * Reset given data or all data from localStorage.\n     *\n     * @param {String} key [optional] Key string.\n     */\n\n  }, {\n    key: 'resetValue',\n    value: function resetValue(key) {\n      if (typeof key === 'undefined') {\n        this.storage.resetAll();\n      } else {\n        this.storage.reset(key);\n      }\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(PersistentState.prototype.__proto__ || Object.getPrototypeOf(PersistentState.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return PersistentState;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('persistentState', PersistentState);\n\nexports.default = PersistentState;\n\n/***/ }),\n/* 407 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _array = __webpack_require__(1);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Storage\n * @plugin PersistentState\n */\nvar Storage = function () {\n  function Storage(prefix) {\n    _classCallCheck(this, Storage);\n\n    /**\n     * Prefix for key (id element).\n     *\n     * @type {String}\n     */\n    this.prefix = prefix;\n\n    /**\n     * Saved keys.\n     *\n     * @type {Array}\n     */\n    this.savedKeys = [];\n    this.loadSavedKeys();\n  }\n\n  /**\n   * Save data to localStorage.\n   *\n   * @param {String} key Key string.\n   * @param {Mixed} value Value to save.\n   */\n\n\n  _createClass(Storage, [{\n    key: 'saveValue',\n    value: function saveValue(key, value) {\n      window.localStorage.setItem(this.prefix + '_' + key, JSON.stringify(value));\n\n      if (this.savedKeys.indexOf(key) === -1) {\n        this.savedKeys.push(key);\n        this.saveSavedKeys();\n      }\n    }\n\n    /**\n     * Load data from localStorage.\n     *\n     * @param {String} key Key string.\n     * @param {Object} defaultValue Object containing the loaded data.\n     *\n     * @returns {}\n     */\n\n  }, {\n    key: 'loadValue',\n    value: function loadValue(key, defaultValue) {\n      key = typeof key === 'undefined' ? defaultValue : key;\n\n      var value = window.localStorage.getItem(this.prefix + '_' + key);\n\n      return value === null ? void 0 : JSON.parse(value);\n    }\n\n    /**\n     * Reset given data from localStorage.\n     *\n     * @param {String} key Key string.\n     */\n\n  }, {\n    key: 'reset',\n    value: function reset(key) {\n      window.localStorage.removeItem(this.prefix + '_' + key);\n    }\n\n    /**\n     * Reset all data from localStorage.\n     *\n     */\n\n  }, {\n    key: 'resetAll',\n    value: function resetAll() {\n      var _this = this;\n\n      (0, _array.arrayEach)(this.savedKeys, function (value, index) {\n        window.localStorage.removeItem(_this.prefix + '_' + _this.savedKeys[index]);\n      });\n\n      this.clearSavedKeys();\n    }\n\n    /**\n     * Load and save all keys from localStorage.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'loadSavedKeys',\n    value: function loadSavedKeys() {\n      var keysJSON = window.localStorage.getItem(this.prefix + '__persistentStateKeys');\n      var keys = typeof keysJSON === 'string' ? JSON.parse(keysJSON) : void 0;\n\n      this.savedKeys = keys ? keys : [];\n    }\n  }, {\n    key: 'saveSavedKeys',\n\n\n    /**\n     * Save saved key in localStorage.\n     *\n     * @private\n     */\n    value: function saveSavedKeys() {\n      window.localStorage.setItem(this.prefix + '__persistentStateKeys', JSON.stringify(this.savedKeys));\n    }\n  }, {\n    key: 'clearSavedKeys',\n\n\n    /**\n     * Clear saved key from localStorage.\n     *\n     * @private\n     */\n    value: function clearSavedKeys() {\n      this.savedKeys.length = 0;\n      this.saveSavedKeys();\n    }\n  }]);\n\n  return Storage;\n}();\n\nexports.default = Storage;\n\n/***/ }),\n/* 408 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _array = __webpack_require__(1);\n\nvar _feature = __webpack_require__(40);\n\nvar _element = __webpack_require__(0);\n\nvar _ghostTable = __webpack_require__(92);\n\nvar _ghostTable2 = _interopRequireDefault(_ghostTable);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nvar _samplesGenerator = __webpack_require__(320);\n\nvar _samplesGenerator2 = _interopRequireDefault(_samplesGenerator);\n\nvar _string = __webpack_require__(36);\n\nvar _src = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar privatePool = new WeakMap();\n\n/**\n * @plugin AutoColumnSize\n *\n * @description\n * This plugin allows to set column widths based on their widest cells.\n *\n * By default, the plugin is declared as `undefined`, which makes it enabled (same as if it was declared as `true`).\n * Enabling this plugin may decrease the overall table performance, as it needs to calculate the widths of all cells to\n * resize the columns accordingly.\n * If you experience problems with the performance, try turning this feature off and declaring the column widths manually.\n *\n * Column width calculations are divided into sync and async part. Each of this parts has their own advantages and\n * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous operations don't\n * block the browser UI.\n *\n * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value to a config object:\n * ```js\n * ...\n * // as a number (300 columns in sync, rest async)\n * autoColumnSize: {syncLimit: 300},\n * ...\n *\n * ...\n * // as a string (percent)\n * autoColumnSize: {syncLimit: '40%'},\n * ...\n * ```\n *\n * To configure this plugin see {@link Options#autoColumnSize}.\n *\n * @example\n * ```js\n * ...\n * var hot = new Handsontable(document.getElementById('example'), {\n *   date: getData(),\n *   autoColumnSize: true\n * });\n * // Access to plugin instance:\n * var plugin = hot.getPlugin('autoColumnSize');\n *\n * plugin.getColumnWidth(4);\n *\n * if (plugin.isEnabled()) {\n *   // code...\n * }\n * ...\n * ```\n */\n\nvar AutoColumnSize = function (_BasePlugin) {\n  _inherits(AutoColumnSize, _BasePlugin);\n\n  _createClass(AutoColumnSize, null, [{\n    key: 'CALCULATION_STEP',\n    get: function get() {\n      return 50;\n    }\n  }, {\n    key: 'SYNC_CALCULATION_LIMIT',\n    get: function get() {\n      return 50;\n    }\n  }]);\n\n  function AutoColumnSize(hotInstance) {\n    _classCallCheck(this, AutoColumnSize);\n\n    var _this = _possibleConstructorReturn(this, (AutoColumnSize.__proto__ || Object.getPrototypeOf(AutoColumnSize)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      /**\n       * Cached column header names. It is used to diff current column headers with previous state and detect which\n       * columns width should be updated.\n       *\n       * @private\n       * @type {Array}\n       */\n      cachedColumnHeaders: []\n    });\n    /**\n     * Cached columns widths.\n     *\n     * @type {Array}\n     */\n    _this.widths = [];\n    /**\n     * Instance of {@link GhostTable} for rows and columns size calculations.\n     *\n     * @type {GhostTable}\n     */\n    _this.ghostTable = new _ghostTable2.default(_this.hot);\n    /**\n     * Instance of {@link SamplesGenerator} for generating samples necessary for columns width calculations.\n     *\n     * @type {SamplesGenerator}\n     */\n    _this.samplesGenerator = new _samplesGenerator2.default(function (row, col) {\n      return _this.hot.getCellMeta(row, col).spanned ? '' : _this.hot.getDataAtCell(row, col);\n    });\n    /**\n     * `true` only if the first calculation was performed\n     *\n     * @type {Boolean}\n     */\n    _this.firstCalculation = true;\n    /**\n     * `true` if the size calculation is in progress.\n     *\n     * @type {Boolean}\n     */\n    _this.inProgress = false;\n\n    // moved to constructor to allow auto-sizing the columns when the plugin is disabled\n    _this.addHook('beforeColumnResize', function (col, size, isDblClick) {\n      return _this.onBeforeColumnResize(col, size, isDblClick);\n    });\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(AutoColumnSize, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().autoColumnSize !== false && !this.hot.getSettings().colWidths;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      var setting = this.hot.getSettings().autoColumnSize;\n\n      if (setting && setting.useHeaders != null) {\n        this.ghostTable.setSetting('useHeaders', setting.useHeaders);\n      }\n\n      this.addHook('afterLoadData', function () {\n        return _this2.onAfterLoadData();\n      });\n      this.addHook('beforeChange', function (changes) {\n        return _this2.onBeforeChange(changes);\n      });\n\n      this.addHook('beforeRender', function (force) {\n        return _this2.onBeforeRender(force);\n      });\n      this.addHook('modifyColWidth', function (width, col) {\n        return _this2.getColumnWidth(col, width);\n      });\n      this.addHook('afterInit', function () {\n        return _this2.onAfterInit();\n      });\n      _get(AutoColumnSize.prototype.__proto__ || Object.getPrototypeOf(AutoColumnSize.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Update plugin state.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      var changedColumns = this.findColumnsWhereHeaderWasChanged();\n\n      if (changedColumns.length) {\n        this.clearCache(changedColumns);\n      }\n      _get(AutoColumnSize.prototype.__proto__ || Object.getPrototypeOf(AutoColumnSize.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(AutoColumnSize.prototype.__proto__ || Object.getPrototypeOf(AutoColumnSize.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Calculate a columns width.\n     *\n     * @param {Number|Object} colRange Column range object.\n     * @param {Number|Object} rowRange Row range object.\n     * @param {Boolean} [force=false] If `true` force calculate width even when value was cached earlier.\n     */\n\n  }, {\n    key: 'calculateColumnsWidth',\n    value: function calculateColumnsWidth() {\n      var colRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countCols() - 1 };\n\n      var _this3 = this;\n\n      var rowRange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { from: 0, to: this.hot.countRows() - 1 };\n      var force = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      if (typeof colRange === 'number') {\n        colRange = { from: colRange, to: colRange };\n      }\n      if (typeof rowRange === 'number') {\n        rowRange = { from: rowRange, to: rowRange };\n      }\n\n      (0, _number.rangeEach)(colRange.from, colRange.to, function (col) {\n        if (force || _this3.widths[col] === void 0 && !_this3.hot._getColWidthFromSettings(col)) {\n          var samples = _this3.samplesGenerator.generateColumnSamples(col, rowRange);\n\n          samples.forEach(function (sample, col) {\n            return _this3.ghostTable.addColumn(col, sample);\n          });\n        }\n      });\n\n      if (this.ghostTable.columns.length) {\n        this.ghostTable.getWidths(function (col, width) {\n          _this3.widths[col] = width;\n        });\n        this.ghostTable.clean();\n      }\n    }\n\n    /**\n     * Calculate all columns width.\n     *\n     * @param {Object|Number} rowRange Row range object.\n     */\n\n  }, {\n    key: 'calculateAllColumnsWidth',\n    value: function calculateAllColumnsWidth() {\n      var _this4 = this;\n\n      var rowRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countRows() - 1 };\n\n      var current = 0;\n      var length = this.hot.countCols() - 1;\n      var timer = null;\n\n      this.inProgress = true;\n\n      var loop = function loop() {\n        // When hot was destroyed after calculating finished cancel frame\n        if (!_this4.hot) {\n          (0, _feature.cancelAnimationFrame)(timer);\n          _this4.inProgress = false;\n\n          return;\n        }\n\n        _this4.calculateColumnsWidth({\n          from: current,\n          to: Math.min(current + AutoColumnSize.CALCULATION_STEP, length)\n        }, rowRange);\n\n        current = current + AutoColumnSize.CALCULATION_STEP + 1;\n\n        if (current < length) {\n          timer = (0, _feature.requestAnimationFrame)(loop);\n        } else {\n          (0, _feature.cancelAnimationFrame)(timer);\n          _this4.inProgress = false;\n\n          // @TODO Should call once per render cycle, currently fired separately in different plugins\n          _this4.hot.view.wt.wtOverlays.adjustElementsSize(true);\n          // tmp\n          if (_this4.hot.view.wt.wtOverlays.leftOverlay.needFullRender) {\n            _this4.hot.view.wt.wtOverlays.leftOverlay.clone.draw();\n          }\n        }\n      };\n      // sync\n      if (this.firstCalculation && this.getSyncCalculationLimit()) {\n        this.calculateColumnsWidth({ from: 0, to: this.getSyncCalculationLimit() }, rowRange);\n        this.firstCalculation = false;\n        current = this.getSyncCalculationLimit() + 1;\n      }\n      // async\n      if (current < length) {\n        loop();\n      } else {\n        this.inProgress = false;\n      }\n    }\n\n    /**\n     * Set the sampling options.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'setSamplingOptions',\n    value: function setSamplingOptions() {\n      var setting = this.hot.getSettings().autoColumnSize;\n      var samplingRatio = setting && (0, _object.hasOwnProperty)(setting, 'samplingRatio') ? this.hot.getSettings().autoColumnSize.samplingRatio : void 0;\n      var allowSampleDuplicates = setting && (0, _object.hasOwnProperty)(setting, 'allowSampleDuplicates') ? this.hot.getSettings().autoColumnSize.allowSampleDuplicates : void 0;\n\n      if (samplingRatio && !isNaN(samplingRatio)) {\n        this.samplesGenerator.setSampleCount(parseInt(samplingRatio, 10));\n      }\n\n      if (allowSampleDuplicates) {\n        this.samplesGenerator.setAllowDuplicates(allowSampleDuplicates);\n      }\n    }\n\n    /**\n     * Recalculate all columns width (overwrite cache values).\n     */\n\n  }, {\n    key: 'recalculateAllColumnsWidth',\n    value: function recalculateAllColumnsWidth() {\n      if (this.hot.view && (0, _element.isVisible)(this.hot.view.wt.wtTable.TABLE)) {\n        this.clearCache();\n        this.calculateAllColumnsWidth();\n      }\n    }\n\n    /**\n     * Get value which tells how many columns should be calculated synchronously. Rest of the columns will be calculated asynchronously.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getSyncCalculationLimit',\n    value: function getSyncCalculationLimit() {\n      /* eslint-disable no-bitwise */\n      var limit = AutoColumnSize.SYNC_CALCULATION_LIMIT;\n      var colsLimit = this.hot.countCols() - 1;\n\n      if ((0, _object.isObject)(this.hot.getSettings().autoColumnSize)) {\n        limit = this.hot.getSettings().autoColumnSize.syncLimit;\n\n        if ((0, _string.isPercentValue)(limit)) {\n          limit = (0, _number.valueAccordingPercent)(colsLimit, limit);\n        } else {\n          // Force to Number\n          limit >>= 0;\n        }\n      }\n\n      return Math.min(limit, colsLimit);\n    }\n\n    /**\n     * Get the calculated column width.\n     *\n     * @param {Number} col Column index.\n     * @param {Number} [defaultWidth] Default column width. It will be picked up if no calculated width found.\n     * @param {Boolean} [keepMinimum=true] If `true` then returned value won't be smaller then 50 (default column width).\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getColumnWidth',\n    value: function getColumnWidth(col) {\n      var defaultWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : void 0;\n      var keepMinimum = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n      var width = defaultWidth;\n\n      if (width === void 0) {\n        width = this.widths[col];\n\n        if (keepMinimum && typeof width === 'number') {\n          width = Math.max(width, _src.ViewportColumnsCalculator.DEFAULT_WIDTH);\n        }\n      }\n\n      return width;\n    }\n\n    /**\n     * Get the first visible column.\n     *\n     * @returns {Number} Returns column index or -1 if table is not rendered.\n     */\n\n  }, {\n    key: 'getFirstVisibleColumn',\n    value: function getFirstVisibleColumn() {\n      var wot = this.hot.view.wt;\n\n      if (wot.wtViewport.columnsVisibleCalculator) {\n        return wot.wtTable.getFirstVisibleColumn();\n      }\n      if (wot.wtViewport.columnsRenderCalculator) {\n        return wot.wtTable.getFirstRenderedColumn();\n      }\n\n      return -1;\n    }\n\n    /**\n     * Get the last visible column.\n     *\n     * @returns {Number} Returns column index or -1 if table is not rendered.\n     */\n\n  }, {\n    key: 'getLastVisibleColumn',\n    value: function getLastVisibleColumn() {\n      var wot = this.hot.view.wt;\n\n      if (wot.wtViewport.columnsVisibleCalculator) {\n        return wot.wtTable.getLastVisibleColumn();\n      }\n      if (wot.wtViewport.columnsRenderCalculator) {\n        return wot.wtTable.getLastRenderedColumn();\n      }\n\n      return -1;\n    }\n\n    /**\n     * Collects all columns which titles has been changed in comparison to the previous state.\n     *\n     * @returns {Array} It returns an array of physical column indexes.\n     */\n\n  }, {\n    key: 'findColumnsWhereHeaderWasChanged',\n    value: function findColumnsWhereHeaderWasChanged() {\n      var columnHeaders = this.hot.getColHeader();\n\n      var _privatePool$get = privatePool.get(this),\n          cachedColumnHeaders = _privatePool$get.cachedColumnHeaders;\n\n      var changedColumns = (0, _array.arrayReduce)(columnHeaders, function (acc, columnTitle, physicalColumn) {\n        var cachedColumnsLength = cachedColumnHeaders.length;\n\n        if (cachedColumnsLength - 1 < physicalColumn || cachedColumnHeaders[physicalColumn] !== columnTitle) {\n          acc.push(physicalColumn);\n        }\n        if (cachedColumnsLength - 1 < physicalColumn) {\n          cachedColumnHeaders.push(columnTitle);\n        } else {\n          cachedColumnHeaders[physicalColumn] = columnTitle;\n        }\n\n        return acc;\n      }, []);\n\n      return changedColumns;\n    }\n\n    /**\n     * Clear cache of calculated column widths. If you want to clear only selected columns pass an array with their indexes.\n     * Otherwise whole cache will be cleared.\n     *\n     * @param {Array} [columns=[]] List of column indexes (physical indexes) to clear.\n     */\n\n  }, {\n    key: 'clearCache',\n    value: function clearCache() {\n      var _this5 = this;\n\n      var columns = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n      if (columns.length) {\n        (0, _array.arrayEach)(columns, function (physicalIndex) {\n          _this5.widths[physicalIndex] = void 0;\n        });\n      } else {\n        this.widths.length = 0;\n      }\n    }\n\n    /**\n     * Check if all widths were calculated. If not then return `true` (need recalculate).\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNeedRecalculate',\n    value: function isNeedRecalculate() {\n      return !!(0, _array.arrayFilter)(this.widths, function (item) {\n        return item === void 0;\n      }).length;\n    }\n\n    /**\n     * On before render listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onBeforeRender',\n    value: function onBeforeRender() {\n      var force = this.hot.renderCall;\n      var rowsCount = this.hot.countRows();\n\n      // Keep last column widths unchanged for situation when all rows was deleted or trimmed (pro #6)\n      if (!rowsCount) {\n        return;\n      }\n\n      this.calculateColumnsWidth({ from: this.getFirstVisibleColumn(), to: this.getLastVisibleColumn() }, void 0, force);\n\n      if (this.isNeedRecalculate() && !this.inProgress) {\n        this.calculateAllColumnsWidth();\n      }\n    }\n\n    /**\n     * On after load data listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData() {\n      var _this6 = this;\n\n      if (this.hot.view) {\n        this.recalculateAllColumnsWidth();\n      } else {\n        // first load - initialization\n        setTimeout(function () {\n          if (_this6.hot) {\n            _this6.recalculateAllColumnsWidth();\n          }\n        }, 0);\n      }\n    }\n\n    /**\n     * On before change listener.\n     *\n     * @private\n     * @param {Array} changes\n     */\n\n  }, {\n    key: 'onBeforeChange',\n    value: function onBeforeChange(changes) {\n      var _this7 = this;\n\n      var changedColumns = (0, _array.arrayMap)(changes, function (_ref) {\n        var _ref2 = _slicedToArray(_ref, 2),\n            row = _ref2[0],\n            column = _ref2[1];\n\n        return _this7.hot.propToCol(column);\n      });\n\n      this.clearCache(changedColumns);\n    }\n\n    /**\n     * On before column resize listener.\n     *\n     * @private\n     * @param {Number} col\n     * @param {Number} size\n     * @param {Boolean} isDblClick\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onBeforeColumnResize',\n    value: function onBeforeColumnResize(col, size, isDblClick) {\n      if (isDblClick) {\n        this.calculateColumnsWidth(col, void 0, true);\n        size = this.getColumnWidth(col, void 0, false);\n      }\n\n      return size;\n    }\n\n    /**\n     * On after Handsontable init fill plugin with all necessary values.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      privatePool.get(this).cachedColumnHeaders = this.hot.getColHeader();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.ghostTable.clean();\n      _get(AutoColumnSize.prototype.__proto__ || Object.getPrototypeOf(AutoColumnSize.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return AutoColumnSize;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('autoColumnSize', AutoColumnSize);\n\nexports.default = AutoColumnSize;\n\n/***/ }),\n/* 409 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _element = __webpack_require__(0);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nvar _src = __webpack_require__(4);\n\nvar _utils = __webpack_require__(410);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('modifyAutofillRange');\n_pluginHooks2.default.getSingleton().register('beforeAutofill');\n\nvar INSERT_ROW_ALTER_ACTION_NAME = 'insert_row';\nvar INTERVAL_FOR_ADDING_ROW = 200;\n\n/**\n * This plugin provides \"drag-down\" and \"copy-down\" functionalities, both operated\n * using the small square in the right bottom of the cell selection.\n *\n * \"Drag-down\" expands the value of the selected cells to the neighbouring\n * cells when you drag the small square in the corner.\n *\n * \"Copy-down\" copies the value of the selection to all empty cells\n * below when you double click the small square.\n *\n * @class Autofill\n * @plugin Autofill\n */\n\nvar Autofill = function (_BasePlugin) {\n  _inherits(Autofill, _BasePlugin);\n\n  function Autofill(hotInstance) {\n    _classCallCheck(this, Autofill);\n\n    /**\n     * Event manager\n     *\n     * @type {EventManager}\n     */\n    var _this = _possibleConstructorReturn(this, (Autofill.__proto__ || Object.getPrototypeOf(Autofill)).call(this, hotInstance));\n\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Specifies if adding new row started.\n     *\n     * @type {Boolean}\n     */\n    _this.addingStarted = false;\n    /**\n     * Specifies if there was mouse down on the cell corner.\n     *\n     * @type {Boolean}\n     */\n    _this.mouseDownOnCellCorner = false;\n    /**\n     * Specifies if mouse was dragged outside Handsontable.\n     *\n     * @type {Boolean}\n     */\n    _this.mouseDragOutside = false;\n    /**\n     * Specifies how many cell levels were dragged using the handle.\n     *\n     * @type {Boolean}\n     */\n    _this.handleDraggedCells = 0;\n    /**\n     * Specifies allowed directions of drag.\n     *\n     * @type {Array}\n     */\n    _this.directions = [];\n    /**\n     * Specifies if can insert new rows if needed.\n     *\n     * @type {Boolean}\n     */\n    _this.autoInsertRow = false;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(Autofill, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().fillHandle;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.mapSettings();\n      this.registerEvents();\n\n      this.addHook('afterOnCellCornerMouseDown', function (event) {\n        return _this2.onAfterCellCornerMouseDown(event);\n      });\n      this.addHook('afterOnCellCornerDblClick', function (event) {\n        return _this2.onCellCornerDblClick(event);\n      });\n      this.addHook('beforeOnCellMouseOver', function (event, coords, TD) {\n        return _this2.onBeforeCellMouseOver(coords);\n      });\n\n      _get(Autofill.prototype.__proto__ || Object.getPrototypeOf(Autofill.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Update plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n      _get(Autofill.prototype.__proto__ || Object.getPrototypeOf(Autofill.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.clearMappedSettings();\n      _get(Autofill.prototype.__proto__ || Object.getPrototypeOf(Autofill.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Get selection data\n     *\n     * @private\n     * @returns {Array} Array with the data.\n     */\n\n  }, {\n    key: 'getSelectionData',\n    value: function getSelectionData() {\n      var selRange = {\n        from: this.hot.getSelectedRangeLast().from,\n        to: this.hot.getSelectedRangeLast().to\n      };\n\n      return this.hot.getData(selRange.from.row, selRange.from.col, selRange.to.row, selRange.to.col);\n    }\n\n    /**\n     * Try to apply fill values to the area in fill border, omitting the selection border.\n     *\n     * @private\n     * @returns {Boolean} reports if fill was applied.\n     */\n\n  }, {\n    key: 'fillIn',\n    value: function fillIn() {\n      if (this.hot.selection.highlight.getFill().isEmpty()) {\n        return false;\n      }\n\n      var cornersOfSelectionAndDragAreas = this.hot.selection.highlight.getFill().getCorners();\n\n      this.resetSelectionOfDraggedArea();\n\n      var cornersOfSelectedCells = this.getCornersOfSelectedCells();\n      cornersOfSelectionAndDragAreas = this.hot.runHooks('modifyAutofillRange', cornersOfSelectionAndDragAreas, cornersOfSelectedCells);\n\n      var _getDragDirectionAndR = (0, _utils.getDragDirectionAndRange)(cornersOfSelectedCells, cornersOfSelectionAndDragAreas),\n          directionOfDrag = _getDragDirectionAndR.directionOfDrag,\n          startOfDragCoords = _getDragDirectionAndR.startOfDragCoords,\n          endOfDragCoords = _getDragDirectionAndR.endOfDragCoords;\n\n      if (startOfDragCoords && startOfDragCoords.row > -1 && startOfDragCoords.col > -1) {\n        var selectionData = this.getSelectionData();\n\n        this.hot.runHooks('beforeAutofill', startOfDragCoords, endOfDragCoords, selectionData);\n\n        var deltas = (0, _utils.getDeltas)(startOfDragCoords, endOfDragCoords, selectionData, directionOfDrag);\n        var fillData = selectionData;\n\n        if (['up', 'left'].indexOf(directionOfDrag) > -1) {\n          fillData = [];\n\n          var dragLength = null;\n          var fillOffset = null;\n\n          if (directionOfDrag === 'up') {\n            dragLength = endOfDragCoords.row - startOfDragCoords.row + 1;\n            fillOffset = dragLength % selectionData.length;\n\n            for (var i = 0; i < dragLength; i++) {\n              fillData.push(selectionData[(i + (selectionData.length - fillOffset)) % selectionData.length]);\n            }\n          } else {\n            dragLength = endOfDragCoords.col - startOfDragCoords.col + 1;\n            fillOffset = dragLength % selectionData[0].length;\n\n            for (var _i = 0; _i < selectionData.length; _i++) {\n              fillData.push([]);\n              for (var j = 0; j < dragLength; j++) {\n                fillData[_i].push(selectionData[_i][(j + (selectionData[_i].length - fillOffset)) % selectionData[_i].length]);\n              }\n            }\n          }\n        }\n\n        this.hot.populateFromArray(startOfDragCoords.row, startOfDragCoords.col, fillData, endOfDragCoords.row, endOfDragCoords.col, this.pluginName + '.fill', null, directionOfDrag, deltas);\n\n        this.setSelection(cornersOfSelectionAndDragAreas);\n      } else {\n        // reset to avoid some range bug\n        this.hot._refreshBorders();\n      }\n\n      return true;\n    }\n\n    /**\n     * Reduce the selection area if the handle was dragged outside of the table or on headers.\n     *\n     * @private\n     * @param {CellCoords} coords indexes of selection corners.\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'reduceSelectionAreaIfNeeded',\n    value: function reduceSelectionAreaIfNeeded(coords) {\n      if (coords.row < 0) {\n        coords.row = 0;\n      }\n\n      if (coords.col < 0) {\n        coords.col = 0;\n      }\n      return coords;\n    }\n\n    /**\n     * Get the coordinates of the drag & drop borders.\n     *\n     * @private\n     * @param {CellCoords} coordsOfSelection `CellCoords` coord object.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getCoordsOfDragAndDropBorders',\n    value: function getCoordsOfDragAndDropBorders(coordsOfSelection) {\n      var topLeftCorner = this.hot.getSelectedRangeLast().getTopLeftCorner();\n      var bottomRightCorner = this.hot.getSelectedRangeLast().getBottomRightCorner();\n      var coords = void 0;\n\n      if (this.directions.includes(_utils.DIRECTIONS.vertical) && (bottomRightCorner.row < coordsOfSelection.row || topLeftCorner.row > coordsOfSelection.row)) {\n        coords = new _src.CellCoords(coordsOfSelection.row, bottomRightCorner.col);\n      } else if (this.directions.includes(_utils.DIRECTIONS.horizontal)) {\n        coords = new _src.CellCoords(bottomRightCorner.row, coordsOfSelection.col);\n      } else {\n        // wrong direction\n        return;\n      }\n\n      return this.reduceSelectionAreaIfNeeded(coords);\n    }\n\n    /**\n     * Show the fill border.\n     *\n     * @private\n     * @param {CellCoords} coordsOfSelection `CellCoords` coord object.\n     */\n\n  }, {\n    key: 'showBorder',\n    value: function showBorder(coordsOfSelection) {\n      var coordsOfDragAndDropBorders = this.getCoordsOfDragAndDropBorders(coordsOfSelection);\n\n      if (coordsOfDragAndDropBorders) {\n        this.redrawBorders(coordsOfDragAndDropBorders);\n      }\n    }\n\n    /**\n     * Add new row\n     *\n     * @private\n     */\n\n  }, {\n    key: 'addRow',\n    value: function addRow() {\n      var _this3 = this;\n\n      this.hot._registerTimeout(setTimeout(function () {\n        _this3.hot.alter(INSERT_ROW_ALTER_ACTION_NAME, void 0, 1, _this3.pluginName + '.fill');\n\n        _this3.addingStarted = false;\n      }, INTERVAL_FOR_ADDING_ROW));\n    }\n\n    /**\n     * Add new rows if they are needed to continue auto-filling values.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'addNewRowIfNeeded',\n    value: function addNewRowIfNeeded() {\n      if (this.hot.selection.highlight.getFill().cellRange && this.addingStarted === false && this.autoInsertRow) {\n        var cornersOfSelectedCells = this.hot.getSelectedLast();\n        var cornersOfSelectedDragArea = this.hot.selection.highlight.getFill().getCorners();\n        var nrOfTableRows = this.hot.countRows();\n\n        if (cornersOfSelectedCells[2] < nrOfTableRows - 1 && cornersOfSelectedDragArea[2] === nrOfTableRows - 1) {\n          this.addingStarted = true;\n\n          this.addRow();\n        }\n      }\n    }\n\n    /**\n     * Get corners of selected cells.\n     *\n     * @private\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getCornersOfSelectedCells',\n    value: function getCornersOfSelectedCells() {\n      if (this.hot.selection.isMultiple()) {\n        return this.hot.selection.highlight.createOrGetArea().getCorners();\n      }\n      return this.hot.selection.highlight.getCell().getCorners();\n    }\n\n    /**\n     * Get index of last adjacent filled in row\n     *\n     * @private\n     * @param {Array} cornersOfSelectedCells indexes of selection corners.\n     * @returns {Number} gives number greater than or equal to zero when selection adjacent can be applied.\n     * or -1 when selection adjacent can't be applied\n     */\n\n  }, {\n    key: 'getIndexOfLastAdjacentFilledInRow',\n    value: function getIndexOfLastAdjacentFilledInRow(cornersOfSelectedCells) {\n      var data = this.hot.getData();\n      var nrOfTableRows = this.hot.countRows();\n      var lastFilledInRowIndex = void 0;\n\n      for (var rowIndex = cornersOfSelectedCells[2] + 1; rowIndex < nrOfTableRows; rowIndex++) {\n        for (var columnIndex = cornersOfSelectedCells[1]; columnIndex <= cornersOfSelectedCells[3]; columnIndex++) {\n          var dataInCell = data[rowIndex][columnIndex];\n\n          if (dataInCell) {\n            return -1;\n          }\n        }\n\n        var dataInNextLeftCell = data[rowIndex][cornersOfSelectedCells[1] - 1];\n        var dataInNextRightCell = data[rowIndex][cornersOfSelectedCells[3] + 1];\n\n        if (!!dataInNextLeftCell || !!dataInNextRightCell) {\n          lastFilledInRowIndex = rowIndex;\n        }\n      }\n      return lastFilledInRowIndex;\n    }\n\n    /**\n     * Add a selection from the start area to the specific row index.\n     *\n     * @private\n     * @param {Array} selectStartArea selection area from which we start to create more comprehensive selection.\n     * @param {Number} rowIndex\n     */\n\n  }, {\n    key: 'addSelectionFromStartAreaToSpecificRowIndex',\n    value: function addSelectionFromStartAreaToSpecificRowIndex(selectStartArea, rowIndex) {\n      this.hot.selection.highlight.getFill().clear().add(new _src.CellCoords(selectStartArea[0], selectStartArea[1])).add(new _src.CellCoords(rowIndex, selectStartArea[3]));\n    }\n\n    /**\n     * Set selection based on passed corners.\n     *\n     * @private\n     * @param {Array} cornersOfArea\n     */\n\n  }, {\n    key: 'setSelection',\n    value: function setSelection(cornersOfArea) {\n      var _hot;\n\n      (_hot = this.hot).selectCell.apply(_hot, _toConsumableArray(cornersOfArea).concat([false, false]));\n    }\n\n    /**\n     * Try to select cells down to the last row in the left column and then returns if selection was applied.\n     *\n     * @private\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'selectAdjacent',\n    value: function selectAdjacent() {\n      var cornersOfSelectedCells = this.getCornersOfSelectedCells();\n      var lastFilledInRowIndex = this.getIndexOfLastAdjacentFilledInRow(cornersOfSelectedCells);\n\n      if (lastFilledInRowIndex === -1) {\n        return false;\n      }\n      this.addSelectionFromStartAreaToSpecificRowIndex(cornersOfSelectedCells, lastFilledInRowIndex);\n\n      return true;\n    }\n\n    /**\n     * Reset selection of dragged area.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'resetSelectionOfDraggedArea',\n    value: function resetSelectionOfDraggedArea() {\n      this.handleDraggedCells = 0;\n\n      this.hot.selection.highlight.getFill().clear();\n    }\n\n    /**\n     * Redraw borders.\n     *\n     * @private\n     * @param {CellCoords} coords `CellCoords` coord object.\n     */\n\n  }, {\n    key: 'redrawBorders',\n    value: function redrawBorders(coords) {\n      this.hot.selection.highlight.getFill().clear().add(this.hot.getSelectedRangeLast().from).add(this.hot.getSelectedRangeLast().to).add(coords);\n\n      this.hot.view.render();\n    }\n\n    /**\n     * Get if mouse was dragged outside.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'getIfMouseWasDraggedOutside',\n    value: function getIfMouseWasDraggedOutside(event) {\n      var tableBottom = (0, _element.offset)(this.hot.table).top - (window.pageYOffset || document.documentElement.scrollTop) + (0, _element.outerHeight)(this.hot.table);\n      var tableRight = (0, _element.offset)(this.hot.table).left - (window.pageXOffset || document.documentElement.scrollLeft) + (0, _element.outerWidth)(this.hot.table);\n\n      return event.clientY > tableBottom && event.clientX <= tableRight;\n    }\n\n    /**\n     * Bind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this4 = this;\n\n      this.eventManager.addEventListener(document.documentElement, 'mouseup', function () {\n        return _this4.onMouseUp();\n      });\n      this.eventManager.addEventListener(document.documentElement, 'mousemove', function (event) {\n        return _this4.onMouseMove(event);\n      });\n    }\n\n    /**\n     * On cell corner double click callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onCellCornerDblClick',\n    value: function onCellCornerDblClick() {\n      var selectionApplied = this.selectAdjacent();\n\n      if (selectionApplied) {\n        this.fillIn();\n      }\n    }\n\n    /**\n     * On after cell corner mouse down listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterCellCornerMouseDown',\n    value: function onAfterCellCornerMouseDown() {\n      this.handleDraggedCells = 1;\n      this.mouseDownOnCellCorner = true;\n    }\n\n    /**\n     * On before cell mouse over listener.\n     *\n     * @private\n     * @param {CellCoords} coords `CellCoords` coord object.\n     */\n\n  }, {\n    key: 'onBeforeCellMouseOver',\n    value: function onBeforeCellMouseOver(coords) {\n      if (this.mouseDownOnCellCorner && !this.hot.view.isMouseDown() && this.handleDraggedCells) {\n        this.handleDraggedCells++;\n\n        this.showBorder(coords);\n        this.addNewRowIfNeeded();\n      }\n    }\n\n    /**\n     * On mouse up listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      if (this.handleDraggedCells) {\n        if (this.handleDraggedCells > 1) {\n          this.fillIn();\n        }\n\n        this.handleDraggedCells = 0;\n        this.mouseDownOnCellCorner = false;\n      }\n    }\n\n    /**\n     * On mouse move listener.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var mouseWasDraggedOutside = this.getIfMouseWasDraggedOutside(event);\n\n      if (this.addingStarted === false && this.handleDraggedCells > 0 && mouseWasDraggedOutside) {\n        this.mouseDragOutside = true;\n        this.addingStarted = true;\n      } else {\n        this.mouseDragOutside = false;\n      }\n\n      if (this.mouseDragOutside && this.autoInsertRow) {\n        this.addRow();\n      }\n    }\n\n    /**\n     * Clear mapped settings.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'clearMappedSettings',\n    value: function clearMappedSettings() {\n      this.directions.length = 0;\n      this.autoInsertRow = false;\n    }\n\n    /**\n     * Map settings.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'mapSettings',\n    value: function mapSettings() {\n      var mappedSettings = (0, _utils.getMappedFillHandleSetting)(this.hot.getSettings().fillHandle);\n      this.directions = mappedSettings.directions;\n      this.autoInsertRow = mappedSettings.autoInsertRow;\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(Autofill.prototype.__proto__ || Object.getPrototypeOf(Autofill.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return Autofill;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('autofill', Autofill);\n\nexports.default = Autofill;\n\n/***/ }),\n/* 410 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.DIRECTIONS = undefined;\nexports.getDeltas = getDeltas;\nexports.getDragDirectionAndRange = getDragDirectionAndRange;\nexports.getMappedFillHandleSetting = getMappedFillHandleSetting;\n\nvar _object = __webpack_require__(2);\n\nvar _mixed = __webpack_require__(16);\n\nvar _src = __webpack_require__(4);\n\nvar DIRECTIONS = exports.DIRECTIONS = {\n  horizontal: 'horizontal',\n  vertical: 'vertical'\n};\n\n/**\n * Get deltas array.\n *\n * @param {CellCoords} start\n * @param {CellCoords} end\n * @param {Array} data\n * @param {String} direction\n * @returns {Array}\n */\nfunction getDeltas(start, end, data, direction) {\n  var rowsLength = data.length;\n  var columnsLength = data ? data[0].length : 0;\n  var deltas = [];\n  var diffRow = end.row - start.row;\n  var diffCol = end.col - start.col;\n\n  if (['down', 'up'].indexOf(direction) !== -1) {\n    var arr = [];\n\n    for (var col = 0; col <= diffCol; col++) {\n      var startValue = parseInt(data[0][col], 10);\n      var endValue = parseInt(data[rowsLength - 1][col], 10);\n      var delta = (direction === 'down' ? endValue - startValue : startValue - endValue) / (rowsLength - 1) || 0;\n\n      arr.push(delta);\n    }\n\n    deltas.push(arr);\n  }\n\n  if (['right', 'left'].indexOf(direction) !== -1) {\n    for (var row = 0; row <= diffRow; row++) {\n      var _startValue = parseInt(data[row][0], 10);\n      var _endValue = parseInt(data[row][columnsLength - 1], 10);\n      var _delta = (direction === 'right' ? _endValue - _startValue : _startValue - _endValue) / (columnsLength - 1) || 0;\n\n      deltas.push([_delta]);\n    }\n  }\n\n  return deltas;\n}\n\n/**\n * Get direction between positions and cords of selections difference (drag area)\n *\n * @param {Array} startSelection\n * @param {Array} endSelection\n * @returns {{direction: String, start: CellCoords, end: CellCoords}}\n */\nfunction getDragDirectionAndRange(startSelection, endSelection) {\n  var startOfDragCoords = void 0,\n      endOfDragCoords = void 0,\n      directionOfDrag = void 0;\n\n  if (endSelection[0] === startSelection[0] && endSelection[1] < startSelection[1]) {\n    directionOfDrag = 'left';\n\n    startOfDragCoords = new _src.CellCoords(endSelection[0], endSelection[1]);\n    endOfDragCoords = new _src.CellCoords(endSelection[2], startSelection[1] - 1);\n  } else if (endSelection[2] === startSelection[2] && endSelection[0] === startSelection[0] && endSelection[3] > startSelection[3]) {\n    directionOfDrag = 'right';\n\n    startOfDragCoords = new _src.CellCoords(endSelection[0], startSelection[3] + 1);\n    endOfDragCoords = new _src.CellCoords(endSelection[2], endSelection[3]);\n  } else if (endSelection[0] < startSelection[0] && endSelection[1] === startSelection[1]) {\n    directionOfDrag = 'up';\n\n    startOfDragCoords = new _src.CellCoords(endSelection[0], endSelection[1]);\n    endOfDragCoords = new _src.CellCoords(startSelection[0] - 1, endSelection[3]);\n  } else if (endSelection[2] > startSelection[2] && endSelection[1] === startSelection[1]) {\n    directionOfDrag = 'down';\n\n    startOfDragCoords = new _src.CellCoords(startSelection[2] + 1, endSelection[1]);\n    endOfDragCoords = new _src.CellCoords(endSelection[2], endSelection[3]);\n  }\n\n  return {\n    directionOfDrag: directionOfDrag,\n    startOfDragCoords: startOfDragCoords,\n    endOfDragCoords: endOfDragCoords\n  };\n}\n\n/**\n * Get mapped FillHandle setting containing information about\n * allowed FillHandle directions and if allowed is automatic insertion of rows on drag\n *\n * @param {Boolean|Object} fillHandle property of Handsontable settings\n * @returns {{directions: Array, autoInsertRow: Boolean}} object allowing access to information\n * about FillHandle in more useful way\n */\nfunction getMappedFillHandleSetting(fillHandle) {\n  var mappedSettings = {};\n\n  if (fillHandle === true) {\n    mappedSettings.directions = Object.keys(DIRECTIONS);\n    mappedSettings.autoInsertRow = true;\n  } else if ((0, _object.isObject)(fillHandle)) {\n    if ((0, _mixed.isDefined)(fillHandle.autoInsertRow)) {\n\n      // autoInsertRow for horizontal direction will be always false\n\n      if (fillHandle.direction === DIRECTIONS.horizontal) {\n        mappedSettings.autoInsertRow = false;\n      } else {\n        mappedSettings.autoInsertRow = fillHandle.autoInsertRow;\n      }\n    } else {\n      mappedSettings.autoInsertRow = false;\n    }\n\n    if ((0, _mixed.isDefined)(fillHandle.direction)) {\n      mappedSettings.directions = [fillHandle.direction];\n    } else {\n      mappedSettings.directions = Object.keys(DIRECTIONS);\n    }\n  } else if (typeof fillHandle === 'string') {\n    mappedSettings.directions = [fillHandle];\n    mappedSettings.autoInsertRow = true;\n  } else {\n    mappedSettings.directions = [];\n    mappedSettings.autoInsertRow = false;\n  }\n\n  return mappedSettings;\n}\n\n/***/ }),\n/* 411 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _array = __webpack_require__(1);\n\nvar _feature = __webpack_require__(40);\n\nvar _element = __webpack_require__(0);\n\nvar _ghostTable = __webpack_require__(92);\n\nvar _ghostTable2 = _interopRequireDefault(_ghostTable);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nvar _samplesGenerator = __webpack_require__(320);\n\nvar _samplesGenerator2 = _interopRequireDefault(_samplesGenerator);\n\nvar _string = __webpack_require__(36);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @plugin AutoRowSize\n *\n * @description\n * This plugin allows to set row heights based on their highest cells.\n *\n * By default, the plugin is declared as `undefined`, which makes it disabled (same as if it was declared as `false`).\n * Enabling this plugin may decrease the overall table performance, as it needs to calculate the heights of all cells to\n * resize the rows accordingly.\n * If you experience problems with the performance, try turning this feature off and declaring the row heights manually.\n *\n * Row height calculations are divided into sync and async part. Each of this parts has their own advantages and\n * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous operations don't\n * block the browser UI.\n *\n * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value to a config object:\n * ```js\n * ...\n * // as a number (300 columns in sync, rest async)\n * autoRowSize: {syncLimit: 300},\n * ...\n *\n * ...\n * // as a string (percent)\n * autoRowSize: {syncLimit: '40%'},\n * ...\n * ```\n *\n * You can also use the `allowSampleDuplicates` option to allow sampling duplicate values when calculating the row height. Note, that this might have\n * a negative impact on performance.\n *\n * To configure this plugin see {@link Options#autoRowSize}.\n *\n * @example\n *\n * ```js\n * ...\n * var hot = new Handsontable(document.getElementById('example'), {\n *   date: getData(),\n *   autoRowSize: true\n * });\n * // Access to plugin instance:\n * var plugin = hot.getPlugin('autoRowSize');\n *\n * plugin.getRowHeight(4);\n *\n * if (plugin.isEnabled()) {\n *   // code...\n * }\n * ...\n * ```\n */\nvar AutoRowSize = function (_BasePlugin) {\n  _inherits(AutoRowSize, _BasePlugin);\n\n  _createClass(AutoRowSize, null, [{\n    key: 'CALCULATION_STEP',\n    get: function get() {\n      return 50;\n    }\n  }, {\n    key: 'SYNC_CALCULATION_LIMIT',\n    get: function get() {\n      return 500;\n    }\n  }]);\n\n  function AutoRowSize(hotInstance) {\n    _classCallCheck(this, AutoRowSize);\n\n    /**\n     * Cached rows heights.\n     *\n     * @type {Array}\n     */\n    var _this = _possibleConstructorReturn(this, (AutoRowSize.__proto__ || Object.getPrototypeOf(AutoRowSize)).call(this, hotInstance));\n\n    _this.heights = [];\n    /**\n     * Instance of {@link GhostTable} for rows and columns size calculations.\n     *\n     * @type {GhostTable}\n     */\n    _this.ghostTable = new _ghostTable2.default(_this.hot);\n    /**\n     * Instance of {@link SamplesGenerator} for generating samples necessary for rows height calculations.\n     *\n     * @type {SamplesGenerator}\n     */\n    _this.samplesGenerator = new _samplesGenerator2.default(function (row, col) {\n      if (row >= 0) {\n        return _this.hot.getDataAtCell(row, col);\n      } else if (row === -1) {\n        return _this.hot.getColHeader(col);\n      }\n      return null;\n    });\n    /**\n     * `true` if only the first calculation was performed.\n     *\n     * @type {Boolean}\n     */\n    _this.firstCalculation = true;\n    /**\n     * `true` if the size calculation is in progress.\n     *\n     * @type {Boolean}\n     */\n    _this.inProgress = false;\n\n    // moved to constructor to allow auto-sizing the rows when the plugin is disabled\n    _this.addHook('beforeRowResize', function (row, size, isDblClick) {\n      return _this.onBeforeRowResize(row, size, isDblClick);\n    });\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(AutoRowSize, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().autoRowSize === true || (0, _object.isObject)(this.hot.getSettings().autoRowSize);\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.setSamplingOptions();\n\n      this.addHook('afterLoadData', function () {\n        return _this2.onAfterLoadData();\n      });\n      this.addHook('beforeChange', function (changes) {\n        return _this2.onBeforeChange(changes);\n      });\n      this.addHook('beforeColumnMove', function () {\n        return _this2.recalculateAllRowsHeight();\n      });\n      this.addHook('beforeColumnResize', function () {\n        return _this2.recalculateAllRowsHeight();\n      });\n      this.addHook('beforeColumnSort', function () {\n        return _this2.clearCache();\n      });\n      this.addHook('beforeRender', function (force) {\n        return _this2.onBeforeRender(force);\n      });\n      this.addHook('beforeRowMove', function (rowStart, rowEnd) {\n        return _this2.onBeforeRowMove(rowStart, rowEnd);\n      });\n      this.addHook('modifyRowHeight', function (height, row) {\n        return _this2.getRowHeight(row, height);\n      });\n      this.addHook('modifyColumnHeaderHeight', function () {\n        return _this2.getColumnHeaderHeight();\n      });\n      _get(AutoRowSize.prototype.__proto__ || Object.getPrototypeOf(AutoRowSize.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(AutoRowSize.prototype.__proto__ || Object.getPrototypeOf(AutoRowSize.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Calculate a given rows height.\n     *\n     * @param {Number|Object} rowRange Row range object.\n     * @param {Number|Object} colRange Column range object.\n     * @param {Boolean} [force=false] If `true` force calculate height even when value was cached earlier.\n     */\n\n  }, {\n    key: 'calculateRowsHeight',\n    value: function calculateRowsHeight() {\n      var rowRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countRows() - 1 };\n\n      var _this3 = this;\n\n      var colRange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { from: 0, to: this.hot.countCols() - 1 };\n      var force = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      if (typeof rowRange === 'number') {\n        rowRange = { from: rowRange, to: rowRange };\n      }\n      if (typeof colRange === 'number') {\n        colRange = { from: colRange, to: colRange };\n      }\n\n      if (this.hot.getColHeader(0) !== null) {\n        var samples = this.samplesGenerator.generateRowSamples(-1, colRange);\n\n        this.ghostTable.addColumnHeadersRow(samples.get(-1));\n      }\n\n      (0, _number.rangeEach)(rowRange.from, rowRange.to, function (row) {\n        // For rows we must calculate row height even when user had set height value manually.\n        // We can shrink column but cannot shrink rows!\n        if (force || _this3.heights[row] === void 0) {\n          var _samples = _this3.samplesGenerator.generateRowSamples(row, colRange);\n\n          _samples.forEach(function (sample, row) {\n            _this3.ghostTable.addRow(row, sample);\n          });\n        }\n      });\n      if (this.ghostTable.rows.length) {\n        this.ghostTable.getHeights(function (row, height) {\n          _this3.heights[row] = height;\n        });\n        this.ghostTable.clean();\n      }\n    }\n\n    /**\n     * Calculate the height of all the rows.\n     *\n     * @param {Object|Number} colRange Column range object.\n     */\n\n  }, {\n    key: 'calculateAllRowsHeight',\n    value: function calculateAllRowsHeight() {\n      var _this4 = this;\n\n      var colRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countCols() - 1 };\n\n      var current = 0;\n      var length = this.hot.countRows() - 1;\n      var timer = null;\n\n      this.inProgress = true;\n\n      var loop = function loop() {\n        // When hot was destroyed after calculating finished cancel frame\n        if (!_this4.hot) {\n          (0, _feature.cancelAnimationFrame)(timer);\n          _this4.inProgress = false;\n\n          return;\n        }\n        _this4.calculateRowsHeight({ from: current, to: Math.min(current + AutoRowSize.CALCULATION_STEP, length) }, colRange);\n        current = current + AutoRowSize.CALCULATION_STEP + 1;\n\n        if (current < length) {\n          timer = (0, _feature.requestAnimationFrame)(loop);\n        } else {\n          (0, _feature.cancelAnimationFrame)(timer);\n          _this4.inProgress = false;\n\n          // @TODO Should call once per render cycle, currently fired separately in different plugins\n          _this4.hot.view.wt.wtOverlays.adjustElementsSize(true);\n          // tmp\n          if (_this4.hot.view.wt.wtOverlays.leftOverlay.needFullRender) {\n            _this4.hot.view.wt.wtOverlays.leftOverlay.clone.draw();\n          }\n        }\n      };\n      // sync\n      if (this.firstCalculation && this.getSyncCalculationLimit()) {\n        this.calculateRowsHeight({ from: 0, to: this.getSyncCalculationLimit() }, colRange);\n        this.firstCalculation = false;\n        current = this.getSyncCalculationLimit() + 1;\n      }\n      // async\n      if (current < length) {\n        loop();\n      } else {\n        this.inProgress = false;\n        this.hot.view.wt.wtOverlays.adjustElementsSize(false);\n      }\n    }\n\n    /**\n     * Set the sampling options.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'setSamplingOptions',\n    value: function setSamplingOptions() {\n      var setting = this.hot.getSettings().autoRowSize;\n      var samplingRatio = setting && (0, _object.hasOwnProperty)(setting, 'samplingRatio') ? this.hot.getSettings().autoRowSize.samplingRatio : void 0;\n      var allowSampleDuplicates = setting && (0, _object.hasOwnProperty)(setting, 'allowSampleDuplicates') ? this.hot.getSettings().autoRowSize.allowSampleDuplicates : void 0;\n\n      if (samplingRatio && !isNaN(samplingRatio)) {\n        this.samplesGenerator.setSampleCount(parseInt(samplingRatio, 10));\n      }\n\n      if (allowSampleDuplicates) {\n        this.samplesGenerator.setAllowDuplicates(allowSampleDuplicates);\n      }\n    }\n\n    /**\n     * Recalculate all rows height (overwrite cache values).\n     */\n\n  }, {\n    key: 'recalculateAllRowsHeight',\n    value: function recalculateAllRowsHeight() {\n      if ((0, _element.isVisible)(this.hot.view.wt.wtTable.TABLE)) {\n        this.clearCache();\n        this.calculateAllRowsHeight();\n      }\n    }\n\n    /**\n     * Get value which tells how much rows will be calculated synchronously. Rest rows will be calculated asynchronously.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getSyncCalculationLimit',\n    value: function getSyncCalculationLimit() {\n      /* eslint-disable no-bitwise */\n      var limit = AutoRowSize.SYNC_CALCULATION_LIMIT;\n      var rowsLimit = this.hot.countRows() - 1;\n\n      if ((0, _object.isObject)(this.hot.getSettings().autoRowSize)) {\n        limit = this.hot.getSettings().autoRowSize.syncLimit;\n\n        if ((0, _string.isPercentValue)(limit)) {\n          limit = (0, _number.valueAccordingPercent)(rowsLimit, limit);\n        } else {\n          // Force to Number\n          limit >>= 0;\n        }\n      }\n\n      return Math.min(limit, rowsLimit);\n    }\n\n    /**\n     * Get the calculated row height.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} [defaultHeight] Default row height. It will be pick up if no calculated height found.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getRowHeight',\n    value: function getRowHeight(row) {\n      var defaultHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : void 0;\n\n      var height = defaultHeight;\n\n      if (this.heights[row] !== void 0 && this.heights[row] > (defaultHeight || 0)) {\n        height = this.heights[row];\n      }\n\n      return height;\n    }\n\n    /**\n     * Get the calculated column header height.\n     *\n     * @returns {Number|undefined}\n     */\n\n  }, {\n    key: 'getColumnHeaderHeight',\n    value: function getColumnHeaderHeight() {\n      return this.heights[-1];\n    }\n\n    /**\n     * Get the first visible row.\n     *\n     * @returns {Number} Returns row index or -1 if table is not rendered.\n     */\n\n  }, {\n    key: 'getFirstVisibleRow',\n    value: function getFirstVisibleRow() {\n      var wot = this.hot.view.wt;\n\n      if (wot.wtViewport.rowsVisibleCalculator) {\n        return wot.wtTable.getFirstVisibleRow();\n      }\n      if (wot.wtViewport.rowsRenderCalculator) {\n        return wot.wtTable.getFirstRenderedRow();\n      }\n\n      return -1;\n    }\n\n    /**\n     * Get the last visible row.\n     *\n     * @returns {Number} Returns row index or -1 if table is not rendered.\n     */\n\n  }, {\n    key: 'getLastVisibleRow',\n    value: function getLastVisibleRow() {\n      var wot = this.hot.view.wt;\n\n      if (wot.wtViewport.rowsVisibleCalculator) {\n        return wot.wtTable.getLastVisibleRow();\n      }\n      if (wot.wtViewport.rowsRenderCalculator) {\n        return wot.wtTable.getLastRenderedRow();\n      }\n\n      return -1;\n    }\n\n    /**\n     * Clear cached heights.\n     */\n\n  }, {\n    key: 'clearCache',\n    value: function clearCache() {\n      this.heights.length = 0;\n      this.heights[-1] = void 0;\n    }\n\n    /**\n     * Clear cache by range.\n     *\n     * @param {Object|Number} range Row range object.\n     */\n\n  }, {\n    key: 'clearCacheByRange',\n    value: function clearCacheByRange(range) {\n      var _this5 = this;\n\n      if (typeof range === 'number') {\n        range = { from: range, to: range };\n      }\n      (0, _number.rangeEach)(Math.min(range.from, range.to), Math.max(range.from, range.to), function (row) {\n        _this5.heights[row] = void 0;\n      });\n    }\n\n    /**\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNeedRecalculate',\n    value: function isNeedRecalculate() {\n      return !!(0, _array.arrayFilter)(this.heights, function (item) {\n        return item === void 0;\n      }).length;\n    }\n\n    /**\n     * On before render listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onBeforeRender',\n    value: function onBeforeRender() {\n      var force = this.hot.renderCall;\n      this.calculateRowsHeight({ from: this.getFirstVisibleRow(), to: this.getLastVisibleRow() }, void 0, force);\n\n      var fixedRowsBottom = this.hot.getSettings().fixedRowsBottom;\n\n      // Calculate rows height synchronously for bottom overlay\n      if (fixedRowsBottom) {\n        var totalRows = this.hot.countRows() - 1;\n        this.calculateRowsHeight({ from: totalRows - fixedRowsBottom, to: totalRows });\n      }\n\n      if (this.isNeedRecalculate() && !this.inProgress) {\n        this.calculateAllRowsHeight();\n      }\n    }\n\n    /**\n     * On before row move listener.\n     *\n     * @private\n     * @param {Number} from Row index where was grabbed.\n     * @param {Number} to Destination row index.\n     */\n\n  }, {\n    key: 'onBeforeRowMove',\n    value: function onBeforeRowMove(from, to) {\n      this.clearCacheByRange({ from: from, to: to });\n      this.calculateAllRowsHeight();\n    }\n\n    /**\n     * On before row resize listener.\n     *\n     * @private\n     * @param {Number} row\n     * @param {Number} size\n     * @param {Boolean} isDblClick\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onBeforeRowResize',\n    value: function onBeforeRowResize(row, size, isDblClick) {\n      if (isDblClick) {\n        this.calculateRowsHeight(row, void 0, true);\n        size = this.getRowHeight(row);\n      }\n\n      return size;\n    }\n\n    /**\n     * On after load data listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData() {\n      var _this6 = this;\n\n      if (this.hot.view) {\n        this.recalculateAllRowsHeight();\n      } else {\n        // first load - initialization\n        setTimeout(function () {\n          if (_this6.hot) {\n            _this6.recalculateAllRowsHeight();\n          }\n        }, 0);\n      }\n    }\n\n    /**\n     * On before change listener.\n     *\n     * @private\n     * @param {Array} changes\n     */\n\n  }, {\n    key: 'onBeforeChange',\n    value: function onBeforeChange(changes) {\n      var range = null;\n\n      if (changes.length === 1) {\n        range = changes[0][0];\n      } else if (changes.length > 1) {\n        range = {\n          from: changes[0][0],\n          to: changes[changes.length - 1][0]\n        };\n      }\n      if (range !== null) {\n        this.clearCacheByRange(range);\n      }\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.ghostTable.clean();\n      _get(AutoRowSize.prototype.__proto__ || Object.getPrototypeOf(AutoRowSize.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return AutoRowSize;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('autoRowSize', AutoRowSize);\n\nexports.default = AutoRowSize;\n\n/***/ }),\n/* 412 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _moment = __webpack_require__(41);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _mixed = __webpack_require__(16);\n\nvar _object = __webpack_require__(2);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _mergeSort = __webpack_require__(413);\n\nvar _mergeSort2 = _interopRequireDefault(_mergeSort);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('beforeColumnSort');\n_pluginHooks2.default.getSingleton().register('afterColumnSort');\n\n// TODO: Implement mixin arrayMapper to ColumnSorting plugin.\n\n/**\n * @plugin ColumnSorting\n *\n * @description\n * This plugin sorts the view by a column (but does not sort the data source!).\n * To enable the plugin, set the `columnSorting` property to either:\n * * a boolean value (`true`/`false`),\n * * an object defining the initial sorting order (see the example below).\n *\n * @example\n * ```js\n * ...\n * // as boolean\n * columnSorting: true\n * ...\n * // as a object with initial order (sort ascending column at index 2)\n * columnSorting: {\n *  column: 2,\n *  sortOrder: true, // true = ascending, false = descending, undefined = original order\n *  sortEmptyCells: true // true = the table sorts empty cells, false = the table moves all empty cells to the end of the table\n * }\n * ...\n * ```\n * @dependencies ObserveChanges\n */\n\nvar ColumnSorting = function (_BasePlugin) {\n  _inherits(ColumnSorting, _BasePlugin);\n\n  function ColumnSorting(hotInstance) {\n    _classCallCheck(this, ColumnSorting);\n\n    var _this2 = _possibleConstructorReturn(this, (ColumnSorting.__proto__ || Object.getPrototypeOf(ColumnSorting)).call(this, hotInstance));\n\n    _this2.sortIndicators = [];\n    _this2.lastSortedColumn = null;\n    _this2.sortEmptyCells = false;\n    return _this2;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ColumnSorting, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().columnSorting;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this3 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.setPluginOptions();\n\n      var _this = this;\n      this.hot.sortIndex = [];\n\n      this.hot.sort = function () {\n        var args = Array.prototype.slice.call(arguments);\n\n        return _this.sortByColumn.apply(_this, _toConsumableArray(args));\n      };\n\n      if (typeof this.hot.getSettings().observeChanges === 'undefined') {\n        this.enableObserveChangesPlugin();\n      }\n\n      this.addHook('afterTrimRow', function (row) {\n        return _this3.sort();\n      });\n      this.addHook('afterUntrimRow', function (row) {\n        return _this3.sort();\n      });\n      this.addHook('modifyRow', function (row) {\n        return _this3.translateRow(row);\n      });\n      this.addHook('unmodifyRow', function (row) {\n        return _this3.untranslateRow(row);\n      });\n      this.addHook('afterUpdateSettings', function () {\n        return _this3.onAfterUpdateSettings();\n      });\n      this.addHook('afterGetColHeader', function (col, TH) {\n        return _this3.getColHeader(col, TH);\n      });\n      this.addHook('afterOnCellMouseDown', function (event, target) {\n        return _this3.onAfterOnCellMouseDown(event, target);\n      });\n      this.addHook('afterCreateRow', function () {\n        _this.afterCreateRow.apply(_this, arguments);\n      });\n      this.addHook('afterRemoveRow', function () {\n        _this.afterRemoveRow.apply(_this, arguments);\n      });\n      this.addHook('afterInit', function () {\n        return _this3.sortBySettings();\n      });\n      this.addHook('afterLoadData', function () {\n        _this3.hot.sortIndex = [];\n\n        if (_this3.hot.view) {\n          _this3.sortBySettings();\n        }\n      });\n      if (this.hot.view) {\n        this.sortBySettings();\n      }\n      _get(ColumnSorting.prototype.__proto__ || Object.getPrototypeOf(ColumnSorting.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.hot.sort = void 0;\n      _get(ColumnSorting.prototype.__proto__ || Object.getPrototypeOf(ColumnSorting.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * afterUpdateSettings callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterUpdateSettings',\n    value: function onAfterUpdateSettings() {\n      this.sortBySettings();\n    }\n  }, {\n    key: 'sortBySettings',\n    value: function sortBySettings() {\n      var sortingSettings = this.hot.getSettings().columnSorting;\n      var loadedSortingState = this.loadSortingState();\n      var sortingColumn = void 0;\n      var sortingOrder = void 0;\n\n      if (typeof loadedSortingState === 'undefined') {\n        sortingColumn = sortingSettings.column;\n        sortingOrder = sortingSettings.sortOrder;\n      } else {\n        sortingColumn = loadedSortingState.sortColumn;\n        sortingOrder = loadedSortingState.sortOrder;\n      }\n      if (typeof sortingColumn === 'number') {\n        this.lastSortedColumn = sortingColumn;\n        this.sortByColumn(sortingColumn, sortingOrder);\n      }\n    }\n\n    /**\n     * Set sorted column and order info\n     *\n     * @param {number} col Sorted visual column index.\n     * @param {boolean|undefined} order Sorting order (`true` for ascending, `false` for descending).\n     */\n\n  }, {\n    key: 'setSortingColumn',\n    value: function setSortingColumn(col, order) {\n      if (typeof col == 'undefined') {\n        this.hot.sortColumn = void 0;\n        this.hot.sortOrder = void 0;\n\n        return;\n      } else if (this.hot.sortColumn === col && typeof order == 'undefined') {\n        if (this.hot.sortOrder === false) {\n          this.hot.sortOrder = void 0;\n        } else {\n          this.hot.sortOrder = !this.hot.sortOrder;\n        }\n      } else {\n        this.hot.sortOrder = typeof order === 'undefined' ? true : order;\n      }\n\n      this.hot.sortColumn = col;\n    }\n  }, {\n    key: 'sortByColumn',\n    value: function sortByColumn(col, order) {\n      this.setSortingColumn(col, order);\n\n      if (typeof this.hot.sortColumn == 'undefined') {\n        return;\n      }\n\n      var allowSorting = this.hot.runHooks('beforeColumnSort', this.hot.sortColumn, this.hot.sortOrder);\n\n      if (allowSorting !== false) {\n        this.sort();\n      }\n      this.updateOrderClass();\n      this.updateSortIndicator();\n\n      this.hot.runHooks('afterColumnSort', this.hot.sortColumn, this.hot.sortOrder);\n\n      this.hot.render();\n      this.saveSortingState();\n    }\n\n    /**\n     * Save the sorting state\n     */\n\n  }, {\n    key: 'saveSortingState',\n    value: function saveSortingState() {\n      var sortingState = {};\n\n      if (typeof this.hot.sortColumn != 'undefined') {\n        sortingState.sortColumn = this.hot.sortColumn;\n      }\n\n      if (typeof this.hot.sortOrder != 'undefined') {\n        sortingState.sortOrder = this.hot.sortOrder;\n      }\n\n      if ((0, _object.hasOwnProperty)(sortingState, 'sortColumn') || (0, _object.hasOwnProperty)(sortingState, 'sortOrder')) {\n        this.hot.runHooks('persistentStateSave', 'columnSorting', sortingState);\n      }\n    }\n\n    /**\n     * Load the sorting state.\n     *\n     * @returns {*} Previously saved sorting state.\n     */\n\n  }, {\n    key: 'loadSortingState',\n    value: function loadSortingState() {\n      var storedState = {};\n      this.hot.runHooks('persistentStateLoad', 'columnSorting', storedState);\n\n      return storedState.value;\n    }\n\n    /**\n     * Update sorting class name state.\n     */\n\n  }, {\n    key: 'updateOrderClass',\n    value: function updateOrderClass() {\n      var orderClass = void 0;\n\n      if (this.hot.sortOrder === true) {\n        orderClass = 'ascending';\n      } else if (this.hot.sortOrder === false) {\n        orderClass = 'descending';\n      }\n      this.sortOrderClass = orderClass;\n    }\n  }, {\n    key: 'enableObserveChangesPlugin',\n    value: function enableObserveChangesPlugin() {\n      var _this = this;\n\n      this.hot._registerTimeout(setTimeout(function () {\n        _this.hot.updateSettings({\n          observeChanges: true\n        });\n      }, 0));\n    }\n\n    /**\n     * Default sorting algorithm.\n     *\n     * @param {Boolean} sortOrder Sorting order - `true` for ascending, `false` for descending.\n     * @param {Object} columnMeta Column meta object.\n     * @returns {Function} The comparing function.\n     */\n\n  }, {\n    key: 'defaultSort',\n    value: function defaultSort(sortOrder, columnMeta) {\n      return function (a, b) {\n        if (typeof a[1] == 'string') {\n          a[1] = a[1].toLowerCase();\n        }\n        if (typeof b[1] == 'string') {\n          b[1] = b[1].toLowerCase();\n        }\n\n        if (a[1] === b[1]) {\n          return 0;\n        }\n\n        if ((0, _mixed.isEmpty)(a[1])) {\n          if ((0, _mixed.isEmpty)(b[1])) {\n            return 0;\n          }\n\n          if (columnMeta.columnSorting.sortEmptyCells) {\n            return sortOrder ? -1 : 1;\n          }\n\n          return 1;\n        }\n        if ((0, _mixed.isEmpty)(b[1])) {\n          if ((0, _mixed.isEmpty)(a[1])) {\n            return 0;\n          }\n\n          if (columnMeta.columnSorting.sortEmptyCells) {\n            return sortOrder ? 1 : -1;\n          }\n\n          return -1;\n        }\n\n        if (isNaN(a[1]) && !isNaN(b[1])) {\n          return sortOrder ? 1 : -1;\n        } else if (!isNaN(a[1]) && isNaN(b[1])) {\n          return sortOrder ? -1 : 1;\n        } else if (!(isNaN(a[1]) || isNaN(b[1]))) {\n          a[1] = parseFloat(a[1]);\n          b[1] = parseFloat(b[1]);\n        }\n        if (a[1] < b[1]) {\n          return sortOrder ? -1 : 1;\n        }\n        if (a[1] > b[1]) {\n          return sortOrder ? 1 : -1;\n        }\n\n        return 0;\n      };\n    }\n\n    /**\n     * Date sorting algorithm\n     * @param {Boolean} sortOrder Sorting order (`true` for ascending, `false` for descending).\n     * @param {Object} columnMeta Column meta object.\n     * @returns {Function} The compare function.\n     */\n\n  }, {\n    key: 'dateSort',\n    value: function dateSort(sortOrder, columnMeta) {\n      return function (a, b) {\n        if (a[1] === b[1]) {\n          return 0;\n        }\n\n        if ((0, _mixed.isEmpty)(a[1])) {\n          if ((0, _mixed.isEmpty)(b[1])) {\n            return 0;\n          }\n\n          if (columnMeta.columnSorting.sortEmptyCells) {\n            return sortOrder ? -1 : 1;\n          }\n\n          return 1;\n        }\n\n        if ((0, _mixed.isEmpty)(b[1])) {\n          if ((0, _mixed.isEmpty)(a[1])) {\n            return 0;\n          }\n\n          if (columnMeta.columnSorting.sortEmptyCells) {\n            return sortOrder ? 1 : -1;\n          }\n\n          return -1;\n        }\n\n        var aDate = (0, _moment2.default)(a[1], columnMeta.dateFormat);\n        var bDate = (0, _moment2.default)(b[1], columnMeta.dateFormat);\n\n        if (!aDate.isValid()) {\n          return 1;\n        }\n        if (!bDate.isValid()) {\n          return -1;\n        }\n\n        if (bDate.isAfter(aDate)) {\n          return sortOrder ? -1 : 1;\n        }\n        if (bDate.isBefore(aDate)) {\n          return sortOrder ? 1 : -1;\n        }\n\n        return 0;\n      };\n    }\n\n    /**\n     * Numeric sorting algorithm.\n     *\n     * @param {Boolean} sortOrder Sorting order (`true` for ascending, `false` for descending).\n     * @param {Object} columnMeta Column meta object.\n     * @returns {Function} The compare function.\n     */\n\n  }, {\n    key: 'numericSort',\n    value: function numericSort(sortOrder, columnMeta) {\n      return function (a, b) {\n        var parsedA = parseFloat(a[1]);\n        var parsedB = parseFloat(b[1]);\n\n        // Watch out when changing this part of code!\n        // Check below returns 0 (as expected) when comparing empty string, null, undefined\n        if (parsedA === parsedB || isNaN(parsedA) && isNaN(parsedB)) {\n          return 0;\n        }\n\n        if (columnMeta.columnSorting.sortEmptyCells) {\n          if ((0, _mixed.isEmpty)(a[1])) {\n            return sortOrder ? -1 : 1;\n          }\n\n          if ((0, _mixed.isEmpty)(b[1])) {\n            return sortOrder ? 1 : -1;\n          }\n        }\n\n        if (isNaN(parsedA)) {\n          return 1;\n        }\n\n        if (isNaN(parsedB)) {\n          return -1;\n        }\n\n        if (parsedA < parsedB) {\n          return sortOrder ? -1 : 1;\n        } else if (parsedA > parsedB) {\n          return sortOrder ? 1 : -1;\n        }\n\n        return 0;\n      };\n    }\n\n    /**\n     * Perform the sorting.\n     */\n\n  }, {\n    key: 'sort',\n    value: function sort() {\n      if (typeof this.hot.sortOrder == 'undefined') {\n        this.hot.sortIndex.length = 0;\n\n        return;\n      }\n\n      var colMeta = this.hot.getCellMeta(0, this.hot.sortColumn);\n      var emptyRows = this.hot.countEmptyRows();\n      var sortFunction = void 0;\n      var nrOfRows = void 0;\n\n      this.hot.sortingEnabled = false; // this is required by translateRow plugin hook\n      this.hot.sortIndex.length = 0;\n\n      if (typeof colMeta.columnSorting.sortEmptyCells === 'undefined') {\n        colMeta.columnSorting = { sortEmptyCells: this.sortEmptyCells };\n      }\n\n      if (this.hot.getSettings().maxRows === Number.POSITIVE_INFINITY) {\n        nrOfRows = this.hot.countRows() - this.hot.getSettings().minSpareRows;\n      } else {\n        nrOfRows = this.hot.countRows() - emptyRows;\n      }\n\n      for (var i = 0, ilen = nrOfRows; i < ilen; i++) {\n        this.hot.sortIndex.push([i, this.hot.getDataAtCell(i, this.hot.sortColumn)]);\n      }\n\n      if (colMeta.sortFunction) {\n        sortFunction = colMeta.sortFunction;\n      } else {\n        switch (colMeta.type) {\n          case 'date':\n            sortFunction = this.dateSort;\n            break;\n          case 'numeric':\n            sortFunction = this.numericSort;\n            break;\n          default:\n            sortFunction = this.defaultSort;\n        }\n      }\n\n      (0, _mergeSort2.default)(this.hot.sortIndex, sortFunction(this.hot.sortOrder, colMeta));\n\n      // Append spareRows\n      for (var _i = this.hot.sortIndex.length; _i < this.hot.countRows(); _i++) {\n        this.hot.sortIndex.push([_i, this.hot.getDataAtCell(_i, this.hot.sortColumn)]);\n      }\n\n      this.hot.sortingEnabled = true; // this is required by translateRow plugin hook\n    }\n\n    /**\n     * Update indicator states.\n     */\n\n  }, {\n    key: 'updateSortIndicator',\n    value: function updateSortIndicator() {\n      if (typeof this.hot.sortOrder == 'undefined') {\n        return;\n      }\n      var colMeta = this.hot.getCellMeta(0, this.hot.sortColumn);\n\n      this.sortIndicators[this.hot.sortColumn] = colMeta.sortIndicator;\n    }\n\n    /**\n     * `modifyRow` hook callback. Translates physical row index to the sorted row index.\n     *\n     * @param {Number} row Row index.\n     * @returns {Number} Sorted row index.\n     */\n\n  }, {\n    key: 'translateRow',\n    value: function translateRow(row) {\n      if (this.hot.sortingEnabled && typeof this.hot.sortOrder !== 'undefined' && this.hot.sortIndex && this.hot.sortIndex.length && this.hot.sortIndex[row]) {\n        return this.hot.sortIndex[row][0];\n      }\n\n      return row;\n    }\n\n    /**\n     * Translates sorted row index to physical row index.\n     *\n     * @param {Number} row Sorted (visual) row index.\n     * @returns {number} Physical row index.\n     */\n\n  }, {\n    key: 'untranslateRow',\n    value: function untranslateRow(row) {\n      if (this.hot.sortingEnabled && this.hot.sortIndex && this.hot.sortIndex.length) {\n        for (var i = 0; i < this.hot.sortIndex.length; i++) {\n          if (this.hot.sortIndex[i][0] == row) {\n            return i;\n          }\n        }\n      }\n    }\n\n    /**\n     * `afterGetColHeader` callback. Adds column sorting css classes to clickable headers.\n     *\n     * @private\n     * @param {Number} col Visual column index.\n     * @param {Element} TH TH HTML element.\n     */\n\n  }, {\n    key: 'getColHeader',\n    value: function getColHeader(col, TH) {\n      if (col < 0 || !TH.parentNode) {\n        return false;\n      }\n\n      var headerLink = TH.querySelector('.colHeader');\n      var colspan = TH.getAttribute('colspan');\n      var TRs = TH.parentNode.parentNode.childNodes;\n      var headerLevel = Array.prototype.indexOf.call(TRs, TH.parentNode);\n      headerLevel -= TRs.length;\n\n      if (!headerLink) {\n        return;\n      }\n\n      if (this.hot.getSettings().columnSorting && col >= 0 && headerLevel === -1) {\n        (0, _element.addClass)(headerLink, 'columnSorting');\n      }\n      (0, _element.removeClass)(headerLink, 'descending');\n      (0, _element.removeClass)(headerLink, 'ascending');\n\n      if (this.sortIndicators[col]) {\n        if (col === this.hot.sortColumn) {\n          if (this.sortOrderClass === 'ascending') {\n            (0, _element.addClass)(headerLink, 'ascending');\n          } else if (this.sortOrderClass === 'descending') {\n            (0, _element.addClass)(headerLink, 'descending');\n          }\n        }\n      }\n    }\n\n    /**\n     * Check if any column is in a sorted state.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSorted',\n    value: function isSorted() {\n      return typeof this.hot.sortColumn != 'undefined';\n    }\n\n    /**\n     * `afterCreateRow` callback. Updates the sorting state after a row have been created.\n     *\n     * @private\n     * @param {Number} index Visual row index.\n     * @param {Number} amount\n     */\n\n  }, {\n    key: 'afterCreateRow',\n    value: function afterCreateRow(index, amount) {\n      if (!this.isSorted()) {\n        return;\n      }\n\n      for (var i = 0; i < this.hot.sortIndex.length; i++) {\n        if (this.hot.sortIndex[i][0] >= index) {\n          this.hot.sortIndex[i][0] += amount;\n        }\n      }\n\n      for (var _i2 = 0; _i2 < amount; _i2++) {\n        this.hot.sortIndex.splice(index + _i2, 0, [index + _i2, this.hot.getSourceData()[index + _i2][this.hot.sortColumn + this.hot.colOffset()]]);\n      }\n\n      this.saveSortingState();\n    }\n\n    /**\n     * `afterRemoveRow` hook callback.\n     *\n     * @private\n     * @param {Number} index Visual row index.\n     * @param {Number} amount\n     */\n\n  }, {\n    key: 'afterRemoveRow',\n    value: function afterRemoveRow(index, amount) {\n      if (!this.isSorted()) {\n        return;\n      }\n      var removedRows = this.hot.sortIndex.splice(index, amount);\n\n      removedRows = (0, _array.arrayMap)(removedRows, function (row) {\n        return row[0];\n      });\n\n      function countRowShift(logicalRow) {\n        // Todo: compare perf between reduce vs sort->each->brake\n        return (0, _array.arrayReduce)(removedRows, function (count, removedLogicalRow) {\n          if (logicalRow > removedLogicalRow) {\n            count++;\n          }\n\n          return count;\n        }, 0);\n      }\n\n      this.hot.sortIndex = (0, _array.arrayMap)(this.hot.sortIndex, function (logicalRow, physicalRow) {\n        var rowShift = countRowShift(logicalRow[0]);\n\n        if (rowShift) {\n          logicalRow[0] -= rowShift;\n        }\n\n        return logicalRow;\n      });\n\n      this.saveSortingState();\n    }\n\n    /**\n     * Set options by passed settings\n     *\n     * @private\n     */\n\n  }, {\n    key: 'setPluginOptions',\n    value: function setPluginOptions() {\n      var columnSorting = this.hot.getSettings().columnSorting;\n\n      if ((typeof columnSorting === 'undefined' ? 'undefined' : _typeof(columnSorting)) === 'object') {\n        this.sortEmptyCells = columnSorting.sortEmptyCells || false;\n      } else {\n        this.sortEmptyCells = false;\n      }\n    }\n\n    /**\n     * `onAfterOnCellMouseDown` hook callback.\n     *\n     * @private\n     * @param {Event} event Event which are provided by hook.\n     * @param {CellCoords} coords Visual coords of the selected cell.\n     */\n\n  }, {\n    key: 'onAfterOnCellMouseDown',\n    value: function onAfterOnCellMouseDown(event, coords) {\n      if (coords.row > -1) {\n        return;\n      }\n\n      if ((0, _element.hasClass)(event.realTarget, 'columnSorting')) {\n        // reset order state on every new column header click\n        if (coords.col !== this.lastSortedColumn) {\n          this.hot.sortOrder = true;\n        }\n\n        this.lastSortedColumn = coords.col;\n\n        this.sortByColumn(coords.col);\n      }\n    }\n  }]);\n\n  return ColumnSorting;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('columnSorting', ColumnSorting);\n\nexports.default = ColumnSorting;\n\n/***/ }),\n/* 413 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = mergeSort;\nexports.merge = merge;\n\nvar _linkedList = __webpack_require__(414);\n\nvar _linkedList2 = _interopRequireDefault(_linkedList);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Refactored implementation of mergeSort (part of javascript-algorithms project) by Github users:\n * mgechev, AndriiHeonia and lekkas (part of javascript-algorithms project - all project contributors\n * at repository website)\n *\n * Link to repository: https://github.com/mgechev/javascript-algorithms\n */\n\n/**\n * Specifies a function that defines the sort order. The array is sorted according to each\n * character's Unicode code point value, according to the string conversion of each element.\n *\n * @param a {*} first compared element.\n * @param b {*} second compared element.\n * @returns {Number}\n */\nvar defaultCompareFunction = function defaultCompareFunction(a, b) {\n  // sort lexically\n\n  var firstValue = a.toString();\n  var secondValue = b.toString();\n\n  if (firstValue === secondValue) {\n    return 0;\n  } else if (firstValue < secondValue) {\n    return -1;\n  }\n  return 1;\n};\n\n/**\n * Mergesort method which is recursively called for sorting the input array.\n *\n * @param {Array} array The array which should be sorted.\n * @param {Function} compareFunction Compares two items in an array. If compareFunction is not supplied,\n * elements are sorted by converting them to strings and comparing strings in Unicode code point order.\n * @param {Number} startIndex Left side of the subarray.\n * @param {Number} endIndex Right side of the subarray.\n * @returns {Array} Array with sorted subarray.\n */\nfunction mergeSort(array) {\n  var compareFunction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultCompareFunction;\n  var startIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n  var endIndex = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : array.length;\n\n  if (Math.abs(endIndex - startIndex) <= 1) {\n    return [];\n  }\n\n  var middleIndex = Math.ceil((startIndex + endIndex) / 2);\n\n  mergeSort(array, compareFunction, startIndex, middleIndex);\n  mergeSort(array, compareFunction, middleIndex, endIndex);\n\n  return merge(array, compareFunction, startIndex, middleIndex, endIndex);\n}\n\n/**\n * Devides and sort merges two subarrays of given array\n *\n * @param {Array} array The array which subarrays should be sorted.\n * @param {Number} startIndex The start of the first subarray.\n *   This subarray is with end middle - 1.\n * @param {Number} middleIndex The start of the second array.\n * @param {Number} endIndex end - 1 is the end of the second array.\n * @returns {Array} The array with sorted subarray.\n */\nfunction merge(array, compareFunction, startIndex, middleIndex, endIndex) {\n  var leftElements = new _linkedList2.default();\n  var rightElements = new _linkedList2.default();\n  var leftSize = middleIndex - startIndex;\n  var rightSize = endIndex - middleIndex;\n  var maxSize = Math.max(leftSize, rightSize);\n  var size = endIndex - startIndex;\n\n  for (var _i = 0; _i < maxSize; _i += 1) {\n    if (_i < leftSize) {\n      leftElements.push(array[startIndex + _i]);\n    }\n\n    if (_i < rightSize) {\n      rightElements.push(array[middleIndex + _i]);\n    }\n  }\n\n  var i = 0;\n\n  while (i < size) {\n    if (leftElements.first && rightElements.first) {\n      if (compareFunction(leftElements.first.data, rightElements.first.data) > 0) {\n        array[startIndex + i] = rightElements.shift().data;\n      } else {\n        array[startIndex + i] = leftElements.shift().data;\n      }\n    } else if (leftElements.first) {\n\n      array[startIndex + i] = leftElements.shift().data;\n    } else {\n\n      array[startIndex + i] = rightElements.shift().data;\n    }\n\n    i += 1;\n  }\n\n  return array;\n};\n\n/***/ }),\n/* 414 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Refactored implementation of LinkedList (part of javascript-algorithms project) by Github users:\n * mgechev, AndriiHeonia, Microfed and Jakeh (part of javascript-algorithms project - all project contributors\n * at repository website)\n *\n * Link to repository: https://github.com/mgechev/javascript-algorithms\n */\n\n/**\n * Linked list node.\n *\n * @class NodeStructure\n * @util\n */\nvar NodeStructure = function NodeStructure(data) {\n  _classCallCheck(this, NodeStructure);\n\n  /**\n   * Data of the node.\n   * @member {Object}\n   */\n  this.data = data;\n  /**\n   * Next node.\n   * @member {NodeStructure}\n   */\n  this.next = null;\n  /**\n   * Previous node.\n   * @member {NodeStructure}\n   */\n  this.prev = null;\n};\n\n/**\n * Linked list.\n *\n * @class LinkedList\n * @util\n */\n\n\nvar LinkedList = function () {\n  function LinkedList() {\n    _classCallCheck(this, LinkedList);\n\n    this.first = null;\n    this.last = null;\n  }\n\n  /**\n   * Add data to the end of linked list.\n   *\n   * @param {Object} data Data which should be added.\n   */\n\n\n  _createClass(LinkedList, [{\n    key: \"push\",\n    value: function push(data) {\n      var node = new NodeStructure(data);\n\n      if (this.first === null) {\n        this.first = node;\n        this.last = node;\n      } else {\n        var temp = this.last;\n\n        this.last = node;\n        node.prev = temp;\n        temp.next = node;\n      }\n    }\n\n    /**\n     * Add data to the beginning of linked list.\n     *\n     * @param {Object} data Data which should be added.\n     */\n\n  }, {\n    key: \"unshift\",\n    value: function unshift(data) {\n      var node = new NodeStructure(data);\n\n      if (this.first === null) {\n        this.first = node;\n        this.last = node;\n      } else {\n        var temp = this.first;\n\n        this.first = node;\n        node.next = temp;\n        temp.prev = node;\n      }\n    }\n\n    /**\n     * In order traversal of the linked list.\n     *\n     * @param {Function} callback Callback which should be executed on each node.\n     */\n\n  }, {\n    key: \"inorder\",\n    value: function inorder(callback) {\n      var temp = this.first;\n\n      while (temp) {\n        callback(temp);\n        temp = temp.next;\n      }\n    }\n\n    /**\n     * Remove data from the linked list.\n     *\n     * @param {Object} data Data which should be removed.\n     * @returns {Boolean} Returns true if data has been removed.\n     */\n\n  }, {\n    key: \"remove\",\n    value: function remove(data) {\n      if (this.first === null) {\n        return false;\n      }\n\n      var temp = this.first;\n      var next = void 0;\n      var prev = void 0;\n\n      while (temp) {\n        if (temp.data === data) {\n          next = temp.next;\n          prev = temp.prev;\n\n          if (next) {\n            next.prev = prev;\n          }\n\n          if (prev) {\n            prev.next = next;\n          }\n\n          if (temp === this.first) {\n            this.first = next;\n          }\n\n          if (temp === this.last) {\n            this.last = prev;\n          }\n\n          return true;\n        }\n\n        temp = temp.next;\n      }\n\n      return false;\n    }\n\n    /**\n     * Check if linked list contains cycle.\n     *\n     * @returns {Boolean} Returns true if linked list contains cycle.\n     */\n\n  }, {\n    key: \"hasCycle\",\n    value: function hasCycle() {\n      var fast = this.first;\n      var slow = this.first;\n\n      while (true) {\n        if (fast === null) {\n          return false;\n        }\n\n        fast = fast.next;\n\n        if (fast === null) {\n          return false;\n        }\n\n        fast = fast.next;\n        slow = slow.next;\n\n        if (fast === slow) {\n          return true;\n        }\n      }\n    }\n  }, {\n    key: \"pop\",\n\n\n    /**\n     * Return last node from the linked list.\n     *\n     * @returns {NodeStructure} Last node.\n     */\n    value: function pop() {\n      if (this.last === null) {\n        return null;\n      }\n\n      var temp = this.last;\n      this.last = this.last.prev;\n\n      return temp;\n    }\n  }, {\n    key: \"shift\",\n\n\n    /**\n     * Return first node from the linked list.\n     *\n     * @returns {NodeStructure} First node.\n     */\n    value: function shift() {\n      if (this.first === null) {\n        return null;\n      }\n\n      var temp = this.first;\n      this.first = this.first.next;\n\n      return temp;\n    }\n  }, {\n    key: \"recursiveReverse\",\n\n\n    /**\n     * Reverses the linked list recursively\n     */\n    value: function recursiveReverse() {\n      function inverse(current, next) {\n        if (!next) {\n          return;\n        }\n        inverse(next, next.next);\n        next.next = current;\n      }\n\n      if (!this.first) {\n        return;\n      }\n\n      inverse(this.first, this.first.next);\n\n      this.first.next = null;\n      var temp = this.first;\n      this.first = this.last;\n      this.last = temp;\n    }\n  }, {\n    key: \"reverse\",\n\n\n    /**\n     * Reverses the linked list iteratively\n     */\n    value: function reverse() {\n      if (!this.first || !this.first.next) {\n        return;\n      }\n\n      var current = this.first.next;\n      var prev = this.first;\n      var temp = void 0;\n\n      while (current) {\n        temp = current.next;\n        current.next = prev;\n        prev.prev = current;\n        prev = current;\n        current = temp;\n      }\n\n      this.first.next = null;\n      this.last.prev = null;\n      temp = this.first;\n      this.first = prev;\n      this.last = temp;\n    }\n  }]);\n\n  return LinkedList;\n}();\n\n;\n\nexports.NodeStructure = NodeStructure;\nexports.default = LinkedList;\n\n/***/ }),\n/* 415 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _src = __webpack_require__(4);\n\nvar _plugins = __webpack_require__(8);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _commentEditor = __webpack_require__(416);\n\nvar _commentEditor2 = _interopRequireDefault(_commentEditor);\n\nvar _utils = __webpack_require__(19);\n\nvar _displaySwitch = __webpack_require__(417);\n\nvar _displaySwitch2 = _interopRequireDefault(_displaySwitch);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\n__webpack_require__(418);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar privatePool = new WeakMap();\nvar META_COMMENT = 'comment';\nvar META_COMMENT_VALUE = 'value';\nvar META_STYLE = 'style';\nvar META_READONLY = 'readOnly';\n\n/**\n * @plugin Comments\n *\n * @description\n * This plugin allows setting and managing cell comments by either an option in the context menu or with the use of the API.\n *\n * To enable the plugin, you'll need to set the comments property of the config object to `true`:\n * ```js\n * ...\n * comments: true\n * ...\n * ```\n *\n * or object with extra predefined plugin config:\n *\n * ```js\n * ...\n * comments: {\n *   displayDelay: 1000\n * }\n * ...\n * ```\n *\n * To add comments at the table initialization, define the `comment` property in the `cell` config array as in an example below.\n *\n * @example\n *\n * ```js\n * ...\n * var hot = new Handsontable(document.getElementById('example'), {\n *   date: getData(),\n *   comments: true,\n *   cell: [\n *     {row: 1, col: 1, comment: {value: 'Foo'}},\n *     {row: 2, col: 2, comment: {value: 'Bar'}}\n *   ]\n * });\n *\n * // Access to the Comments plugin instance:\n * var commentsPlugin = hot.getPlugin('comments');\n *\n * // Manage comments programmatically:\n * commentsPlugin.setCommentAtCell(1, 6, 'Comment contents');\n * commentsPlugin.showAtCell(1, 6);\n * commentsPlugin.removeCommentAtCell(1, 6);\n *\n * // You can also set range once and use proper methods:\n * commentsPlugin.setRange({row: 1, col: 6});\n * commentsPlugin.setComment('Comment contents');\n * commentsPlugin.show();\n * commentsPlugin.removeComment();\n * ...\n * ```\n */\n\nvar Comments = function (_BasePlugin) {\n  _inherits(Comments, _BasePlugin);\n\n  function Comments(hotInstance) {\n    _classCallCheck(this, Comments);\n\n    /**\n     * Instance of {@link CommentEditor}.\n     *\n     * @type {CommentEditor}\n     */\n    var _this = _possibleConstructorReturn(this, (Comments.__proto__ || Object.getPrototypeOf(Comments)).call(this, hotInstance));\n\n    _this.editor = null;\n    /**\n     * Instance of {@link DisplaySwitch}.\n     *\n     * @type {DisplaySwitch}\n     */\n    _this.displaySwitch = null;\n    /**\n     * Instance of {@link EventManager}.\n     *\n     * @private\n     * @type {EventManager}\n     */\n    _this.eventManager = null;\n    /**\n     * Current cell range.\n     *\n     * @type {Object}\n     */\n    _this.range = {};\n    /**\n     * @private\n     * @type {Boolean}\n     */\n    _this.mouseDown = false;\n    /**\n     * @private\n     * @type {Boolean}\n     */\n    _this.contextMenuEvent = false;\n    /**\n     * @private\n     * @type {*}\n     */\n    _this.timer = null;\n\n    privatePool.set(_this, {\n      tempEditorDimensions: {},\n      cellBelowCursor: null\n    });\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(Comments, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().comments;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      if (!this.editor) {\n        this.editor = new _commentEditor2.default();\n      }\n\n      if (!this.eventManager) {\n        this.eventManager = new _eventManager2.default(this);\n      }\n\n      if (!this.displaySwitch) {\n        this.displaySwitch = new _displaySwitch2.default(this.getDisplayDelaySetting());\n      }\n\n      this.addHook('afterContextMenuDefaultOptions', function (options) {\n        return _this2.addToContextMenu(options);\n      });\n      this.addHook('afterRenderer', function (TD, row, col, prop, value, cellProperties) {\n        return _this2.onAfterRenderer(TD, cellProperties);\n      });\n      this.addHook('afterScrollHorizontally', function () {\n        return _this2.hide();\n      });\n      this.addHook('afterScrollVertically', function () {\n        return _this2.hide();\n      });\n      this.addHook('afterBeginEditing', function (args) {\n        return _this2.onAfterBeginEditing(args);\n      });\n\n      this.displaySwitch.addLocalHook('hide', function () {\n        return _this2.hide();\n      });\n      this.displaySwitch.addLocalHook('show', function (row, col) {\n        return _this2.showAtCell(row, col);\n      });\n\n      this.registerListeners();\n\n      _get(Comments.prototype.__proto__ || Object.getPrototypeOf(Comments.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Update plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n      _get(Comments.prototype.__proto__ || Object.getPrototypeOf(Comments.prototype), 'updatePlugin', this).call(this);\n\n      this.displaySwitch.updateDelay(this.getDisplayDelaySetting());\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(Comments.prototype.__proto__ || Object.getPrototypeOf(Comments.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Register all necessary DOM listeners.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerListeners',\n    value: function registerListeners() {\n      var _this3 = this;\n\n      this.eventManager.addEventListener(document, 'mouseover', function (event) {\n        return _this3.onMouseOver(event);\n      });\n      this.eventManager.addEventListener(document, 'mousedown', function (event) {\n        return _this3.onMouseDown(event);\n      });\n      this.eventManager.addEventListener(document, 'mouseup', function (event) {\n        return _this3.onMouseUp(event);\n      });\n      this.eventManager.addEventListener(this.editor.getInputElement(), 'blur', function (event) {\n        return _this3.onEditorBlur(event);\n      });\n      this.eventManager.addEventListener(this.editor.getInputElement(), 'mousedown', function (event) {\n        return _this3.onEditorMouseDown(event);\n      });\n      this.eventManager.addEventListener(this.editor.getInputElement(), 'mouseup', function (event) {\n        return _this3.onEditorMouseUp(event);\n      });\n    }\n\n    /**\n     * Set current cell range to be able to use general methods like {@link Comments#setComment},\n     * {@link Comments#removeComment}, {@link Comments#show}.\n     *\n     * @param {Object} range Object with `from` and `to` properties, each with `row` and `col` properties.\n     */\n\n  }, {\n    key: 'setRange',\n    value: function setRange(range) {\n      this.range = range;\n    }\n\n    /**\n     * Clear the currently selected cell.\n     */\n\n  }, {\n    key: 'clearRange',\n    value: function clearRange() {\n      this.range = {};\n    }\n\n    /**\n     * Check if the event target is a cell containing a comment.\n     *\n     * @param {Event} event DOM event\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'targetIsCellWithComment',\n    value: function targetIsCellWithComment(event) {\n      var closestCell = (0, _element.closest)(event.target, 'TD', 'TBODY');\n\n      return !!(closestCell && (0, _element.hasClass)(closestCell, 'htCommentCell') && (0, _element.closest)(closestCell, [this.hot.rootElement]));\n    }\n\n    /**\n     * Check if the event target is a comment textarea.\n     *\n     * @param {Event} event DOM event.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'targetIsCommentTextArea',\n    value: function targetIsCommentTextArea(event) {\n      return this.editor.getInputElement() === event.target;\n    }\n\n    /**\n     * Set a comment for a cell according to the previously set range (see {@link Comments#setRange}).\n     *\n     * @param {String} value Comment contents.\n     */\n\n  }, {\n    key: 'setComment',\n    value: function setComment(value) {\n      if (!this.range.from) {\n        throw new Error('Before using this method, first set cell range (hot.getPlugin(\"comment\").setRange())');\n      }\n      var editorValue = this.editor.getValue();\n      var comment = '';\n\n      if (value != null) {\n        comment = value;\n      } else if (editorValue != null) {\n        comment = editorValue;\n      }\n\n      var row = this.range.from.row;\n      var col = this.range.from.col;\n\n      this.updateCommentMeta(row, col, _defineProperty({}, META_COMMENT_VALUE, comment));\n      this.hot.render();\n    }\n\n    /**\n     * Set a comment for a cell.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {String} value Comment contents.\n     */\n\n  }, {\n    key: 'setCommentAtCell',\n    value: function setCommentAtCell(row, col, value) {\n      this.setRange({\n        from: new _src.CellCoords(row, col)\n      });\n      this.setComment(value);\n    }\n\n    /**\n     * Remove a comment from a cell according to previously set range (see {@link Comments#setRange}).\n     *\n     * @param {Boolean} [forceRender = true] If set to `true`, the table will be re-rendered at the end of the operation.\n     */\n\n  }, {\n    key: 'removeComment',\n    value: function removeComment() {\n      var forceRender = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n      if (!this.range.from) {\n        throw new Error('Before using this method, first set cell range (hot.getPlugin(\"comment\").setRange())');\n      }\n\n      this.hot.setCellMeta(this.range.from.row, this.range.from.col, META_COMMENT, void 0);\n\n      if (forceRender) {\n        this.hot.render();\n      }\n\n      this.hide();\n    }\n\n    /**\n     * Remove comment from a cell.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {Boolean} [forceRender = true] If `true`, the table will be re-rendered at the end of the operation.\n     */\n\n  }, {\n    key: 'removeCommentAtCell',\n    value: function removeCommentAtCell(row, col) {\n      var forceRender = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n      this.setRange({\n        from: new _src.CellCoords(row, col)\n      });\n      this.removeComment(forceRender);\n    }\n\n    /**\n     * Get comment from a cell at the predefined range.\n     */\n\n  }, {\n    key: 'getComment',\n    value: function getComment() {\n      var row = this.range.from.row;\n      var column = this.range.from.col;\n\n      return this.getCommentMeta(row, column, META_COMMENT_VALUE);\n    }\n\n    /**\n     * Get comment from a cell at the provided coordinates.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'getCommentAtCell',\n    value: function getCommentAtCell(row, column) {\n      return this.getCommentMeta(row, column, META_COMMENT_VALUE);\n    }\n\n    /**\n     * Show the comment editor accordingly to the previously set range (see {@link Comments#setRange}).\n     *\n     * @returns {Boolean} Returns `true` if comment editor was shown.\n     */\n\n  }, {\n    key: 'show',\n    value: function show() {\n      if (!this.range.from) {\n        throw new Error('Before using this method, first set cell range (hot.getPlugin(\"comment\").setRange())');\n      }\n      var meta = this.hot.getCellMeta(this.range.from.row, this.range.from.col);\n\n      this.refreshEditor(true);\n      this.editor.setValue(meta[META_COMMENT] ? meta[META_COMMENT][META_COMMENT_VALUE] : null || '');\n\n      if (this.editor.hidden) {\n        this.editor.show();\n      }\n\n      return true;\n    }\n\n    /**\n     * Show comment editor according to cell coordinates.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @returns {Boolean} Returns `true` if comment editor was shown.\n     */\n\n  }, {\n    key: 'showAtCell',\n    value: function showAtCell(row, col) {\n      this.setRange({\n        from: new _src.CellCoords(row, col)\n      });\n\n      return this.show();\n    }\n\n    /**\n     * Hide the comment editor.\n     */\n\n  }, {\n    key: 'hide',\n    value: function hide() {\n      if (!this.editor.hidden) {\n        this.editor.hide();\n      }\n    }\n\n    /**\n     * Refresh comment editor position and styling.\n     *\n     * @param {Boolean} [force=false] If `true` then recalculation will be forced.\n     */\n\n  }, {\n    key: 'refreshEditor',\n    value: function refreshEditor() {\n      var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (!force && (!this.range.from || !this.editor.isVisible())) {\n        return;\n      }\n      var scrollableElement = (0, _element.getScrollableElement)(this.hot.view.wt.wtTable.TABLE);\n      var TD = this.hot.view.wt.wtTable.getCell(this.range.from);\n      var row = this.range.from.row;\n      var column = this.range.from.col;\n      var cellOffset = (0, _element.offset)(TD);\n      var lastColWidth = this.hot.view.wt.wtTable.getStretchedColumnWidth(column);\n      var cellTopOffset = cellOffset.top < 0 ? 0 : cellOffset.top;\n      var cellLeftOffset = cellOffset.left;\n\n      if (this.hot.view.wt.wtViewport.hasVerticalScroll() && scrollableElement !== window) {\n        cellTopOffset -= this.hot.view.wt.wtOverlays.topOverlay.getScrollPosition();\n      }\n\n      if (this.hot.view.wt.wtViewport.hasHorizontalScroll() && scrollableElement !== window) {\n        cellLeftOffset -= this.hot.view.wt.wtOverlays.leftOverlay.getScrollPosition();\n      }\n\n      var x = cellLeftOffset + lastColWidth;\n      var y = cellTopOffset;\n\n      var commentStyle = this.getCommentMeta(row, column, META_STYLE);\n      var readOnly = this.getCommentMeta(row, column, META_READONLY);\n\n      if (commentStyle) {\n        this.editor.setSize(commentStyle.width, commentStyle.height);\n      } else {\n        this.editor.resetSize();\n      }\n\n      this.editor.setReadOnlyState(readOnly);\n\n      this.editor.setPosition(x, y);\n    }\n\n    /**\n     * Check if there is a comment for selected range.\n     *\n     * @private\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'checkSelectionCommentsConsistency',\n    value: function checkSelectionCommentsConsistency() {\n      var selected = this.hot.getSelectedRangeLast();\n\n      if (!selected) {\n        return false;\n      }\n      var hasComment = false;\n      var cell = selected.from; // IN EXCEL THERE IS COMMENT ONLY FOR TOP LEFT CELL IN SELECTION\n\n      if (this.getCommentMeta(cell.row, cell.col, META_COMMENT_VALUE)) {\n        hasComment = true;\n      }\n\n      return hasComment;\n    }\n\n    /**\n     * Set or update the comment-related cell meta.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} column Visual column index.\n     * @param {Object} metaObject Object defining all the comment-related meta information.\n     */\n\n  }, {\n    key: 'updateCommentMeta',\n    value: function updateCommentMeta(row, column, metaObject) {\n      var oldComment = this.hot.getCellMeta(row, column)[META_COMMENT];\n      var newComment = void 0;\n\n      if (oldComment) {\n        newComment = (0, _object.deepClone)(oldComment);\n        (0, _object.deepExtend)(newComment, metaObject);\n      } else {\n        newComment = metaObject;\n      }\n\n      this.hot.setCellMeta(row, column, META_COMMENT, newComment);\n    }\n\n    /**\n     * Get the comment related meta information.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} column Visual column index.\n     * @param {String} property Cell meta property.\n     * @returns {Mixed}\n     */\n\n  }, {\n    key: 'getCommentMeta',\n    value: function getCommentMeta(row, column, property) {\n      var cellMeta = this.hot.getCellMeta(row, column);\n\n      if (!cellMeta[META_COMMENT]) {\n        return void 0;\n      }\n\n      return cellMeta[META_COMMENT][property];\n    }\n\n    /**\n     * `mousedown` event callback.\n     *\n     * @private\n     * @param {MouseEvent} event The `mousedown` event.\n     */\n\n  }, {\n    key: 'onMouseDown',\n    value: function onMouseDown(event) {\n      this.mouseDown = true;\n\n      if (!this.hot.view || !this.hot.view.wt) {\n        return;\n      }\n\n      if (!this.contextMenuEvent && !this.targetIsCommentTextArea(event)) {\n        var eventCell = (0, _element.closest)(event.target, 'TD', 'TBODY');\n        var coordinates = null;\n\n        if (eventCell) {\n          coordinates = this.hot.view.wt.wtTable.getCoords(eventCell);\n        }\n\n        if (!eventCell || this.range.from && coordinates && (this.range.from.row !== coordinates.row || this.range.from.col !== coordinates.col)) {\n          this.hide();\n        }\n      }\n      this.contextMenuEvent = false;\n    }\n\n    /**\n     * `mouseover` event callback.\n     *\n     * @private\n     * @param {MouseEvent} event The `mouseover` event.\n     */\n\n  }, {\n    key: 'onMouseOver',\n    value: function onMouseOver(event) {\n      var priv = privatePool.get(this);\n\n      priv.cellBelowCursor = document.elementFromPoint(event.clientX, event.clientY);\n\n      if (this.mouseDown || this.editor.isFocused() || (0, _element.hasClass)(event.target, 'wtBorder') || priv.cellBelowCursor !== event.target || !this.editor) {\n        return;\n      }\n\n      if (this.targetIsCellWithComment(event)) {\n        var coordinates = this.hot.view.wt.wtTable.getCoords(event.target);\n        var range = {\n          from: new _src.CellCoords(coordinates.row, coordinates.col)\n        };\n\n        this.displaySwitch.show(range);\n      } else if ((0, _element.isChildOf)(event.target, document) && !this.targetIsCommentTextArea(event)) {\n        this.displaySwitch.hide();\n      }\n    }\n\n    /**\n     * `mouseup` event callback.\n     *\n     * @private\n     * @param {MouseEvent} event The `mouseup` event.\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp(event) {\n      this.mouseDown = false;\n    }\n\n    /** *\n     * The `afterRenderer` hook callback..\n     *\n     * @private\n     * @param {HTMLTableCellElement} TD The rendered `TD` element.\n     * @param {Object} cellProperties The rendered cell's property object.\n     */\n\n  }, {\n    key: 'onAfterRenderer',\n    value: function onAfterRenderer(TD, cellProperties) {\n      if (cellProperties[META_COMMENT] && cellProperties[META_COMMENT][META_COMMENT_VALUE]) {\n        (0, _element.addClass)(TD, cellProperties.commentedCellClassName);\n      }\n    }\n\n    /**\n     * `blur` event callback for the comment editor.\n     *\n     * @private\n     * @param {Event} event The `blur` event.\n     */\n\n  }, {\n    key: 'onEditorBlur',\n    value: function onEditorBlur(event) {\n      this.setComment();\n    }\n\n    /**\n     * `mousedown` hook. Along with `onEditorMouseUp` used to simulate the textarea resizing event.\n     *\n     * @private\n     * @param {MouseEvent} event The `mousedown` event.\n     */\n\n  }, {\n    key: 'onEditorMouseDown',\n    value: function onEditorMouseDown(event) {\n      var priv = privatePool.get(this);\n\n      priv.tempEditorDimensions = {\n        width: (0, _element.outerWidth)(event.target),\n        height: (0, _element.outerHeight)(event.target)\n      };\n    }\n\n    /**\n     * `mouseup` hook. Along with `onEditorMouseDown` used to simulate the textarea resizing event.\n     *\n     * @private\n     * @param {MouseEvent} event The `mouseup` event.\n     */\n\n  }, {\n    key: 'onEditorMouseUp',\n    value: function onEditorMouseUp(event) {\n      var priv = privatePool.get(this);\n      var currentWidth = (0, _element.outerWidth)(event.target);\n      var currentHeight = (0, _element.outerHeight)(event.target);\n\n      if (currentWidth !== priv.tempEditorDimensions.width + 1 || currentHeight !== priv.tempEditorDimensions.height + 2) {\n        this.updateCommentMeta(this.range.from.row, this.range.from.col, _defineProperty({}, META_STYLE, {\n          width: currentWidth,\n          height: currentHeight\n        }));\n      }\n    }\n\n    /**\n     * Context Menu's \"Add comment\" callback. Results in showing the comment editor.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onContextMenuAddComment',\n    value: function onContextMenuAddComment() {\n      var _this4 = this;\n\n      this.displaySwitch.cancelHiding();\n      var coords = this.hot.getSelectedRangeLast();\n\n      this.contextMenuEvent = true;\n      this.setRange({\n        from: coords.from\n      });\n      this.show();\n      setTimeout(function () {\n        if (_this4.hot) {\n          _this4.hot.deselectCell();\n          _this4.editor.focus();\n        }\n      }, 10);\n    }\n\n    /**\n     * Context Menu's \"remove comment\" callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onContextMenuRemoveComment',\n    value: function onContextMenuRemoveComment() {\n      this.contextMenuEvent = true;\n\n      var _hot$getSelectedRange = this.hot.getSelectedRangeLast(),\n          from = _hot$getSelectedRange.from,\n          to = _hot$getSelectedRange.to;\n\n      for (var i = from.row; i <= to.row; i++) {\n        for (var j = from.col; j <= to.col; j++) {\n          this.removeCommentAtCell(i, j, false);\n        }\n      }\n\n      this.hot.render();\n    }\n\n    /**\n     * Context Menu's \"make comment read-only\" callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onContextMenuMakeReadOnly',\n    value: function onContextMenuMakeReadOnly() {\n      this.contextMenuEvent = true;\n\n      var _hot$getSelectedRange2 = this.hot.getSelectedRangeLast(),\n          from = _hot$getSelectedRange2.from,\n          to = _hot$getSelectedRange2.to;\n\n      for (var i = from.row; i <= to.row; i++) {\n        for (var j = from.col; j <= to.col; j++) {\n          var currentState = !!this.getCommentMeta(i, j, META_READONLY);\n\n          this.updateCommentMeta(i, j, _defineProperty({}, META_READONLY, !currentState));\n        }\n      }\n    }\n\n    /**\n     * Add Comments plugin options to the Context Menu.\n     *\n     * @private\n     * @param {Object} defaultOptions\n     */\n\n  }, {\n    key: 'addToContextMenu',\n    value: function addToContextMenu(defaultOptions) {\n      var _this5 = this;\n\n      defaultOptions.items.push({\n        name: '---------'\n      }, {\n        key: 'commentsAddEdit',\n        name: function name() {\n          if (_this5.checkSelectionCommentsConsistency()) {\n            return _this5.hot.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_EDIT_COMMENT);\n          }\n\n          return _this5.hot.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ADD_COMMENT);\n        },\n        callback: function callback() {\n          return _this5.onContextMenuAddComment();\n        },\n        disabled: function disabled() {\n          return !(this.getSelectedLast() && !this.selection.isSelectedByCorner());\n        }\n      }, {\n        key: 'commentsRemove',\n        name: function name() {\n          return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_COMMENT);\n        },\n\n        callback: function callback() {\n          return _this5.onContextMenuRemoveComment();\n        },\n        disabled: function disabled() {\n          return _this5.hot.selection.isSelectedByCorner();\n        }\n      }, {\n        key: 'commentsReadOnly',\n        name: function name() {\n          var _this6 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT);\n          var hasProperty = (0, _utils.checkSelectionConsistency)(this.getSelectedRangeLast(), function (row, col) {\n            var readOnlyProperty = _this6.getCellMeta(row, col)[META_COMMENT];\n            if (readOnlyProperty) {\n              readOnlyProperty = readOnlyProperty[META_READONLY];\n            }\n\n            if (readOnlyProperty) {\n              return true;\n            }\n          });\n\n          if (hasProperty) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n\n        callback: function callback() {\n          return _this5.onContextMenuMakeReadOnly();\n        },\n        disabled: function disabled() {\n          return _this5.hot.selection.isSelectedByCorner() || !_this5.checkSelectionCommentsConsistency();\n        }\n      });\n    }\n\n    /**\n     * Get `displayDelay` setting of comment plugin.\n     *\n     * @returns {Number|undefined}\n     */\n\n  }, {\n    key: 'getDisplayDelaySetting',\n    value: function getDisplayDelaySetting() {\n      var commentSetting = this.hot.getSettings().comments;\n\n      if ((0, _object.isObject)(commentSetting)) {\n        return commentSetting.displayDelay;\n      }\n\n      return void 0;\n    }\n\n    /**\n     * `afterBeginEditing` hook callback.\n     *\n     * @private\n     * @param {Number} row Visual row index of the currently edited cell.\n     * @param {Number} column Visual column index of the currently edited cell.\n     */\n\n  }, {\n    key: 'onAfterBeginEditing',\n    value: function onAfterBeginEditing(row, column) {\n      this.hide();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.editor) {\n        this.editor.destroy();\n      }\n\n      if (this.displaySwitch) {\n        this.displaySwitch.destroy();\n      }\n\n      _get(Comments.prototype.__proto__ || Object.getPrototypeOf(Comments.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return Comments;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('comments', Comments);\n\nexports.default = Comments;\n\n/***/ }),\n/* 416 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Comment editor for the Comments plugin.\n *\n * @class CommentEditor\n * @plugin Comments\n */\nvar CommentEditor = function () {\n  _createClass(CommentEditor, null, [{\n    key: 'CLASS_EDITOR_CONTAINER',\n    get: function get() {\n      return 'htCommentsContainer';\n    }\n  }, {\n    key: 'CLASS_EDITOR',\n    get: function get() {\n      return 'htComments';\n    }\n  }, {\n    key: 'CLASS_INPUT',\n    get: function get() {\n      return 'htCommentTextArea';\n    }\n  }, {\n    key: 'CLASS_CELL',\n    get: function get() {\n      return 'htCommentCell';\n    }\n  }]);\n\n  function CommentEditor() {\n    _classCallCheck(this, CommentEditor);\n\n    this.editor = this.createEditor();\n    this.editorStyle = this.editor.style;\n\n    this.hidden = true;\n\n    this.hide();\n  }\n\n  /**\n   * Set position of the comments editor according to the  provided x and y coordinates.\n   *\n   * @param {Number} x X position (in pixels).\n   * @param {Number} y Y position (in pixels).\n   */\n\n\n  _createClass(CommentEditor, [{\n    key: 'setPosition',\n    value: function setPosition(x, y) {\n      this.editorStyle.left = x + 'px';\n      this.editorStyle.top = y + 'px';\n    }\n\n    /**\n     * Set the editor size according to the provided arguments.\n     *\n     * @param {Number} width Width in pixels.\n     * @param {Number} height Height in pixels.\n     */\n\n  }, {\n    key: 'setSize',\n    value: function setSize(width, height) {\n      if (width && height) {\n        var input = this.getInputElement();\n\n        input.style.width = width + 'px';\n        input.style.height = height + 'px';\n      }\n    }\n\n    /**\n     * Reset the editor size to its initial state.\n     */\n\n  }, {\n    key: 'resetSize',\n    value: function resetSize() {\n      var input = this.getInputElement();\n\n      input.style.width = '';\n      input.style.height = '';\n    }\n\n    /**\n     * Set the read-only state for the comments editor.\n     *\n     * @param {Boolean} state The new read only state.\n     */\n\n  }, {\n    key: 'setReadOnlyState',\n    value: function setReadOnlyState(state) {\n      var input = this.getInputElement();\n\n      input.readOnly = state;\n    }\n\n    /**\n     * Show the comments editor.\n     */\n\n  }, {\n    key: 'show',\n    value: function show() {\n      this.editorStyle.display = 'block';\n      this.hidden = false;\n    }\n\n    /**\n     * Hide the comments editor.\n     */\n\n  }, {\n    key: 'hide',\n    value: function hide() {\n      this.editorStyle.display = 'none';\n      this.hidden = true;\n    }\n\n    /**\n     * Checks if the editor is visible.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isVisible',\n    value: function isVisible() {\n      return this.editorStyle.display === 'block';\n    }\n\n    /**\n     * Set the comment value.\n     *\n     * @param {String} [value] The value to use.\n     */\n\n  }, {\n    key: 'setValue',\n    value: function setValue() {\n      var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      value = value || '';\n      this.getInputElement().value = value;\n    }\n\n    /**\n     * Get the comment value.\n     *\n     * @returns {String}\n     */\n\n  }, {\n    key: 'getValue',\n    value: function getValue() {\n      return this.getInputElement().value;\n    }\n\n    /**\n     * Checks if the comment input element is focused.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isFocused',\n    value: function isFocused() {\n      return document.activeElement === this.getInputElement();\n    }\n\n    /**\n     * Focus the comments input element.\n     */\n\n  }, {\n    key: 'focus',\n    value: function focus() {\n      this.getInputElement().focus();\n    }\n\n    /**\n     * Create the `textarea` to be used as a comments editor.\n     *\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createEditor',\n    value: function createEditor() {\n      var container = document.querySelector('.' + CommentEditor.CLASS_EDITOR_CONTAINER);\n      var editor = void 0;\n      var textArea = void 0;\n\n      if (!container) {\n        container = document.createElement('div');\n        (0, _element.addClass)(container, CommentEditor.CLASS_EDITOR_CONTAINER);\n        document.body.appendChild(container);\n      }\n      editor = document.createElement('div');\n      (0, _element.addClass)(editor, CommentEditor.CLASS_EDITOR);\n\n      textArea = document.createElement('textarea');\n      (0, _element.addClass)(textArea, CommentEditor.CLASS_INPUT);\n\n      editor.appendChild(textArea);\n      container.appendChild(editor);\n\n      return editor;\n    }\n\n    /**\n     * Get the input element.\n     *\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'getInputElement',\n    value: function getInputElement() {\n      return this.editor.querySelector('.' + CommentEditor.CLASS_INPUT);\n    }\n\n    /**\n     * Destroy the comments editor.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.editor.parentNode.removeChild(this.editor);\n      this.editor = null;\n      this.editorStyle = null;\n    }\n  }]);\n\n  return CommentEditor;\n}();\n\nexports.default = CommentEditor;\n\n/***/ }),\n/* 417 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _function = __webpack_require__(43);\n\nvar _object = __webpack_require__(2);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DEFAULT_DISPLAY_DELAY = 250;\nvar DEFAULT_HIDE_DELAY = 250;\n\n/**\n * Display switch for the Comments plugin. Manages the time of delayed displaying / hiding comments.\n *\n * @class DisplaySwitch\n * @plugin Comments\n */\n\nvar DisplaySwitch = function () {\n  function DisplaySwitch(displayDelay) {\n    _classCallCheck(this, DisplaySwitch);\n\n    /**\n     * Flag to determine if comment can be showed or hidden. State `true` mean that last performed action\n     * was an attempt to show comment element. State `false` mean that it was attempt to hide comment element.\n     *\n     * @type {Boolean}\n     */\n    this.wasLastActionShow = true;\n    /**\n     * Show comment after predefined delay. It keeps reference to immutable `debounce` function.\n     *\n     * @type {Function}\n     */\n    this.showDebounced = null;\n    /**\n     * Reference to timer, run by `setTimeout`, which is hiding comment\n     *\n     * @type {Number}\n     */\n    this.hidingTimer = null;\n\n    this.updateDelay(displayDelay);\n  }\n\n  /**\n   * Responsible for hiding comment after proper delay.\n   */\n\n\n  _createClass(DisplaySwitch, [{\n    key: 'hide',\n    value: function hide() {\n      var _this = this;\n\n      this.wasLastActionShow = false;\n\n      this.hidingTimer = setTimeout(function () {\n        if (_this.wasLastActionShow === false) {\n          _this.runLocalHooks('hide');\n        }\n      }, DEFAULT_HIDE_DELAY);\n    }\n\n    /**\n     * Responsible for showing comment after proper delay.\n     *\n     * @param {Object} range Coordinates of selected cell.\n     */\n\n  }, {\n    key: 'show',\n    value: function show(range) {\n      this.wasLastActionShow = true;\n      this.showDebounced(range);\n    }\n  }, {\n    key: 'cancelHiding',\n\n\n    /**\n     * Cancel hiding comment.\n     */\n    value: function cancelHiding() {\n      this.wasLastActionShow = true;\n\n      clearTimeout(this.hidingTimer);\n      this.hidingTimer = null;\n    }\n\n    /**\n     * Update the switch settings.\n     *\n     * @param {Number} displayDelay Delay of showing the comments (in milliseconds).\n     */\n\n  }, {\n    key: 'updateDelay',\n    value: function updateDelay() {\n      var _this2 = this;\n\n      var displayDelay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_DISPLAY_DELAY;\n\n      this.showDebounced = (0, _function.debounce)(function (range) {\n        if (_this2.wasLastActionShow) {\n          _this2.runLocalHooks('show', range.from.row, range.from.col);\n        }\n      }, displayDelay);\n    }\n\n    /**\n     * Destroy the switcher.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.clearLocalHooks();\n    }\n  }]);\n\n  return DisplaySwitch;\n}();\n\n(0, _object.mixin)(DisplaySwitch, _localHooks2.default);\n\nexports.default = DisplaySwitch;\n\n/***/ }),\n/* 418 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 419 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _commandExecutor = __webpack_require__(420);\n\nvar _commandExecutor2 = _interopRequireDefault(_commandExecutor);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _itemsFactory = __webpack_require__(421);\n\nvar _itemsFactory2 = _interopRequireDefault(_itemsFactory);\n\nvar _menu = __webpack_require__(433);\n\nvar _menu2 = _interopRequireDefault(_menu);\n\nvar _plugins = __webpack_require__(8);\n\nvar _event = __webpack_require__(12);\n\nvar _element = __webpack_require__(0);\n\nvar _predefinedItems = __webpack_require__(94);\n\n__webpack_require__(435);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('afterContextMenuDefaultOptions');\n_pluginHooks2.default.getSingleton().register('beforeContextMenuShow');\n_pluginHooks2.default.getSingleton().register('afterContextMenuShow');\n_pluginHooks2.default.getSingleton().register('afterContextMenuHide');\n_pluginHooks2.default.getSingleton().register('afterContextMenuExecute');\n\n/**\n * @description\n * This plugin creates the Handsontable Context Menu. It allows to create a new row or\n * column at any place in the grid among [other features](http://docs.handsontable.com/demo-context-menu.html).\n * Possible values:\n * * `true` (to enable default options),\n * * `false` (to disable completely)\n *\n * or array of any available strings:\n * * `[\"row_above\", \"row_below\", \"col_left\", \"col_right\",\n * \"remove_row\", \"remove_col\", \"---------\", \"undo\", \"redo\"]`.\n *\n * See [the context menu demo](http://docs.handsontable.com/demo-context-menu.html) for examples.\n *\n * @example\n * ```js\n * ...\n * // as a boolean\n * contextMenu: true\n * ...\n * // as a array\n * contextMenu: ['row_above', 'row_below', '---------', 'undo', 'redo']\n * ...\n * ```\n *\n * @plugin ContextMenu\n */\n\nvar ContextMenu = function (_BasePlugin) {\n  _inherits(ContextMenu, _BasePlugin);\n\n  _createClass(ContextMenu, null, [{\n    key: 'DEFAULT_ITEMS',\n\n    /**\n     * Default menu items order when `contextMenu` is enabled by `true`.\n     *\n     * @returns {Array}\n     */\n    get: function get() {\n      return [_predefinedItems.ROW_ABOVE, _predefinedItems.ROW_BELOW, _predefinedItems.SEPARATOR, _predefinedItems.COLUMN_LEFT, _predefinedItems.COLUMN_RIGHT, _predefinedItems.SEPARATOR, _predefinedItems.REMOVE_ROW, _predefinedItems.REMOVE_COLUMN, _predefinedItems.SEPARATOR, _predefinedItems.UNDO, _predefinedItems.REDO, _predefinedItems.SEPARATOR, _predefinedItems.READ_ONLY, _predefinedItems.SEPARATOR, _predefinedItems.ALIGNMENT];\n    }\n  }]);\n\n  function ContextMenu(hotInstance) {\n    _classCallCheck(this, ContextMenu);\n\n    /**\n     * Instance of {@link EventManager}.\n     *\n     * @type {EventManager}\n     */\n    var _this = _possibleConstructorReturn(this, (ContextMenu.__proto__ || Object.getPrototypeOf(ContextMenu)).call(this, hotInstance));\n\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Instance of {@link CommandExecutor}.\n     *\n     * @type {CommandExecutor}\n     */\n    _this.commandExecutor = new _commandExecutor2.default(_this.hot);\n    /**\n     * Instance of {@link ItemsFactory}.\n     *\n     * @type {ItemsFactory}\n     */\n    _this.itemsFactory = null;\n    /**\n     * Instance of {@link Menu}.\n     *\n     * @type {Menu}\n     */\n    _this.menu = null;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ContextMenu, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().contextMenu;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n      this.itemsFactory = new _itemsFactory2.default(this.hot, ContextMenu.DEFAULT_ITEMS);\n\n      var settings = this.hot.getSettings().contextMenu;\n      var predefinedItems = {\n        items: this.itemsFactory.getItems(settings)\n      };\n      this.registerEvents();\n\n      if (typeof settings.callback === 'function') {\n        this.commandExecutor.setCommonCallback(settings.callback);\n      }\n      _get(ContextMenu.prototype.__proto__ || Object.getPrototypeOf(ContextMenu.prototype), 'enablePlugin', this).call(this);\n\n      var delayedInitialization = function delayedInitialization() {\n        if (!_this2.hot) {\n          return;\n        }\n\n        _this2.hot.runHooks('afterContextMenuDefaultOptions', predefinedItems);\n\n        _this2.itemsFactory.setPredefinedItems(predefinedItems.items);\n        var menuItems = _this2.itemsFactory.getItems(settings);\n\n        _this2.menu = new _menu2.default(_this2.hot, {\n          className: 'htContextMenu',\n          keepInViewport: true\n        });\n        _this2.hot.runHooks('beforeContextMenuSetItems', menuItems);\n\n        _this2.menu.setMenuItems(menuItems);\n\n        _this2.menu.addLocalHook('beforeOpen', function () {\n          return _this2.onMenuBeforeOpen();\n        });\n        _this2.menu.addLocalHook('afterOpen', function () {\n          return _this2.onMenuAfterOpen();\n        });\n        _this2.menu.addLocalHook('afterClose', function () {\n          return _this2.onMenuAfterClose();\n        });\n        _this2.menu.addLocalHook('executeCommand', function () {\n          for (var _len = arguments.length, params = Array(_len), _key = 0; _key < _len; _key++) {\n            params[_key] = arguments[_key];\n          }\n\n          return _this2.executeCommand.apply(_this2, params);\n        });\n\n        // Register all commands. Predefined and added by user or by plugins\n        (0, _array.arrayEach)(menuItems, function (command) {\n          return _this2.commandExecutor.registerCommand(command.key, command);\n        });\n      };\n\n      this.callOnPluginsReady(function () {\n        if (_this2.isPluginsReady) {\n          setTimeout(delayedInitialization, 0);\n        } else {\n          delayedInitialization();\n        }\n      });\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(ContextMenu.prototype.__proto__ || Object.getPrototypeOf(ContextMenu.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.close();\n\n      if (this.menu) {\n        this.menu.destroy();\n        this.menu = null;\n      }\n      _get(ContextMenu.prototype.__proto__ || Object.getPrototypeOf(ContextMenu.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Register dom listeners.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this3 = this;\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'contextmenu', function (event) {\n        return _this3.onContextMenu(event);\n      });\n    }\n\n    /**\n     * Open menu and re-position it based on dom event object.\n     *\n     * @param {Event} event The event object.\n     */\n\n  }, {\n    key: 'open',\n    value: function open(event) {\n      if (!this.menu) {\n        return;\n      }\n      this.menu.open();\n      this.menu.setPosition({\n        top: parseInt((0, _event.pageY)(event), 10) - (0, _element.getWindowScrollTop)(),\n        left: parseInt((0, _event.pageX)(event), 10) - (0, _element.getWindowScrollLeft)()\n      });\n\n      // ContextMenu is not detected HotTableEnv correctly because is injected outside hot-table\n      this.menu.hotMenu.isHotTableEnv = this.hot.isHotTableEnv;\n      // Handsontable.eventManager.isHotTableEnv = this.hot.isHotTableEnv;\n    }\n\n    /**\n     * Close menu.\n     */\n\n  }, {\n    key: 'close',\n    value: function close() {\n      if (!this.menu) {\n        return;\n      }\n      this.menu.close();\n    }\n\n    /**\n     * Execute context menu command.\n     *\n     * You can execute all predefined commands:\n     *  * `'row_above'` - Insert row above\n     *  * `'row_below'` - Insert row below\n     *  * `'col_left'` - Insert column left\n     *  * `'col_right'` - Insert column right\n     *  * `'clear_column'` - Clear selected column\n     *  * `'remove_row'` - Remove row\n     *  * `'remove_col'` - Remove column\n     *  * `'undo'` - Undo last action\n     *  * `'redo'` - Redo last action\n     *  * `'make_read_only'` - Make cell read only\n     *  * `'alignment:left'` - Alignment to the left\n     *  * `'alignment:top'` - Alignment to the top\n     *  * `'alignment:right'` - Alignment to the right\n     *  * `'alignment:bottom'` - Alignment to the bottom\n     *  * `'alignment:middle'` - Alignment to the middle\n     *  * `'alignment:center'` - Alignment to the center (justify)\n     *\n     * Or you can execute command registered in settings where `key` is your command name.\n     *\n     * @param {String} commandName\n     * @param {*} params\n     */\n\n  }, {\n    key: 'executeCommand',\n    value: function executeCommand() {\n      for (var _len2 = arguments.length, params = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        params[_key2] = arguments[_key2];\n      }\n\n      this.commandExecutor.execute.apply(this.commandExecutor, params);\n    }\n\n    /**\n     * On context menu listener.\n     *\n     * @private\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onContextMenu',\n    value: function onContextMenu(event) {\n      var settings = this.hot.getSettings();\n      var showRowHeaders = settings.rowHeaders;\n      var showColHeaders = settings.colHeaders;\n\n      function isValidElement(element) {\n        return element.nodeName === 'TD' || element.parentNode.nodeName === 'TD';\n      }\n      // if event is from hot-table we must get web component element not element inside him\n      var element = event.realTarget;\n      this.close();\n\n      if ((0, _element.hasClass)(element, 'handsontableInput')) {\n        return;\n      }\n\n      event.preventDefault();\n      (0, _event.stopPropagation)(event);\n\n      if (!(showRowHeaders || showColHeaders)) {\n        if (!isValidElement(element) && !((0, _element.hasClass)(element, 'current') && (0, _element.hasClass)(element, 'wtBorder'))) {\n          return;\n        }\n      }\n\n      this.open(event);\n    }\n\n    /**\n     * On menu before open listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMenuBeforeOpen',\n    value: function onMenuBeforeOpen() {\n      this.hot.runHooks('beforeContextMenuShow', this);\n    }\n\n    /**\n     * On menu after open listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMenuAfterOpen',\n    value: function onMenuAfterOpen() {\n      this.hot.runHooks('afterContextMenuShow', this);\n    }\n\n    /**\n     * On menu after close listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMenuAfterClose',\n    value: function onMenuAfterClose() {\n      this.hot.listen();\n      this.hot.runHooks('afterContextMenuHide', this);\n    }\n\n    /**\n     * Destroy instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.close();\n\n      if (this.menu) {\n        this.menu.destroy();\n      }\n      _get(ContextMenu.prototype.__proto__ || Object.getPrototypeOf(ContextMenu.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return ContextMenu;\n}(_base2.default);\n\nContextMenu.SEPARATOR = {\n  name: _predefinedItems.SEPARATOR\n};\n\n(0, _plugins.registerPlugin)('contextMenu', ContextMenu);\n\nexports.default = ContextMenu;\n\n/***/ }),\n/* 420 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Command executor for ContextMenu.\n *\n * @class CommandExecutor\n * @plugin ContextMenu\n */\nvar CommandExecutor = function () {\n  function CommandExecutor(hotInstance) {\n    _classCallCheck(this, CommandExecutor);\n\n    this.hot = hotInstance;\n    this.commands = {};\n    this.commonCallback = null;\n  }\n\n  /**\n   * Register command.\n   *\n   * @param {String} name Command name.\n   * @param {Object} commandDescriptor Command descriptor object with properties like `key` (command id),\n   *                                   `callback` (task to execute), `name` (command name), `disabled` (command availability).\n   */\n\n\n  _createClass(CommandExecutor, [{\n    key: 'registerCommand',\n    value: function registerCommand(name, commandDescriptor) {\n      this.commands[name] = commandDescriptor;\n    }\n\n    /**\n     * Set common callback which will be trigger on every executed command.\n     *\n     * @param {Function} callback Function which will be fired on every command execute.\n     */\n\n  }, {\n    key: 'setCommonCallback',\n    value: function setCommonCallback(callback) {\n      this.commonCallback = callback;\n    }\n\n    /**\n     * Execute command by its name.\n     *\n     * @param {String} commandName Command id.\n     * @param {*} params Arguments passed to command task.\n     */\n\n  }, {\n    key: 'execute',\n    value: function execute(commandName) {\n      var _this = this;\n\n      for (var _len = arguments.length, params = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        params[_key - 1] = arguments[_key];\n      }\n\n      var commandSplit = commandName.split(':');\n      commandName = commandSplit[0];\n\n      var subCommandName = commandSplit.length === 2 ? commandSplit[1] : null;\n      var command = this.commands[commandName];\n\n      if (!command) {\n        throw new Error('Menu command \\'' + commandName + '\\' not exists.');\n      }\n      if (subCommandName && command.submenu) {\n        command = findSubCommand(subCommandName, command.submenu.items);\n      }\n      if (command.disabled === true) {\n        return;\n      }\n      if (typeof command.disabled == 'function' && command.disabled.call(this.hot) === true) {\n        return;\n      }\n      if ((0, _object.hasOwnProperty)(command, 'submenu')) {\n        return;\n      }\n      var callbacks = [];\n\n      if (typeof command.callback === 'function') {\n        callbacks.push(command.callback);\n      }\n      if (typeof this.commonCallback === 'function') {\n        callbacks.push(this.commonCallback);\n      }\n      params.unshift(commandSplit.join(':'));\n      (0, _array.arrayEach)(callbacks, function (callback) {\n        return callback.apply(_this.hot, params);\n      });\n    }\n  }]);\n\n  return CommandExecutor;\n}();\n\nfunction findSubCommand(subCommandName, subCommands) {\n  var command = void 0;\n\n  (0, _array.arrayEach)(subCommands, function (cmd) {\n    var cmds = cmd.key ? cmd.key.split(':') : null;\n\n    if (Array.isArray(cmds) && cmds[1] === subCommandName) {\n      command = cmd;\n\n      return false;\n    }\n  });\n\n  return command;\n}\n\nexports.default = CommandExecutor;\n\n/***/ }),\n/* 421 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _predefinedItems = __webpack_require__(94);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Predefined items class factory for menu items.\n *\n * @class ItemsFactory\n * @plugin ContextMenu\n */\nvar ItemsFactory = function () {\n  function ItemsFactory(hotInstance) {\n    var orderPattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n    _classCallCheck(this, ItemsFactory);\n\n    this.hot = hotInstance;\n    this.predefinedItems = (0, _predefinedItems.predefinedItems)();\n    this.defaultOrderPattern = orderPattern;\n  }\n\n  /**\n   * Set predefined items.\n   *\n   * @param {Array} predefinedItems Array of predefined items.\n   */\n\n\n  _createClass(ItemsFactory, [{\n    key: 'setPredefinedItems',\n    value: function setPredefinedItems(predefinedItems) {\n      var _this = this;\n\n      var items = {};\n\n      this.defaultOrderPattern.length = 0;\n\n      (0, _object.objectEach)(predefinedItems, function (value, key) {\n        var menuItemKey = '';\n\n        if (value.name === _predefinedItems.SEPARATOR) {\n          items[_predefinedItems.SEPARATOR] = value;\n          menuItemKey = _predefinedItems.SEPARATOR;\n\n          // Menu item added as a property to array\n        } else if (isNaN(parseInt(key, 10))) {\n          value.key = value.key === void 0 ? key : value.key;\n          items[key] = value;\n          menuItemKey = value.key;\n        } else {\n          items[value.key] = value;\n          menuItemKey = value.key;\n        }\n        _this.defaultOrderPattern.push(menuItemKey);\n      });\n      this.predefinedItems = items;\n    }\n\n    /**\n     * Get all menu items based on pattern.\n     *\n     * @param {Array|Object|Boolean} pattern Pattern which you can define by displaying menu items order. If `true` default\n     *                                       pattern will be used.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getItems',\n    value: function getItems() {\n      var pattern = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      return _getItems(pattern, this.defaultOrderPattern, this.predefinedItems);\n    }\n  }]);\n\n  return ItemsFactory;\n}();\n\nfunction _getItems() {\n  var pattern = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n  var defaultPattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n  var items = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n  var result = [];\n\n  if (pattern && pattern.items) {\n    pattern = pattern.items;\n  } else if (!Array.isArray(pattern)) {\n    pattern = defaultPattern;\n  }\n  if ((0, _object.isObject)(pattern)) {\n    (0, _object.objectEach)(pattern, function (value, key) {\n      var item = items[typeof value === 'string' ? value : key];\n\n      if (!item) {\n        item = value;\n      }\n      if ((0, _object.isObject)(value)) {\n        (0, _object.extend)(item, value);\n      } else if (typeof item === 'string') {\n        item = { name: item };\n      }\n      if (item.key === void 0) {\n        item.key = key;\n      }\n      result.push(item);\n    });\n  } else {\n    (0, _array.arrayEach)(pattern, function (name, key) {\n      var item = items[name];\n\n      // Item deleted from settings `allowInsertRow: false` etc.\n      if (!item && _predefinedItems.ITEMS.indexOf(name) >= 0) {\n        return;\n      }\n      if (!item) {\n        item = { name: name, key: '' + key };\n      }\n      if ((0, _object.isObject)(name)) {\n        (0, _object.extend)(item, name);\n      }\n      if (item.key === void 0) {\n        item.key = key;\n      }\n      result.push(item);\n    });\n  }\n\n  return result;\n}\n\nexports.default = ItemsFactory;\n\n/***/ }),\n/* 422 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = alignmentItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _separator = __webpack_require__(93);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'alignment';\n\nfunction alignmentItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT);\n    },\n    disabled: function disabled() {\n      return !(this.getSelectedRange() && !this.selection.isSelectedByCorner());\n    },\n\n    submenu: {\n      items: [{\n        key: KEY + ':left',\n        name: function name() {\n          var _this = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htLeft') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this2 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this2.getCellMeta(row, col).className;\n          });\n          var type = 'horizontal';\n          var alignment = 'htLeft';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this2.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this2.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':center',\n        name: function name() {\n          var _this3 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this3.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htCenter') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback(key, selection) {\n          var _this4 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this4.getCellMeta(row, col).className;\n          });\n          var type = 'horizontal';\n          var alignment = 'htCenter';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this4.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this4.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':right',\n        name: function name() {\n          var _this5 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this5.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htRight') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this6 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this6.getCellMeta(row, col).className;\n          });\n          var type = 'horizontal';\n          var alignment = 'htRight';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this6.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this6.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':justify',\n        name: function name() {\n          var _this7 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this7.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htJustify') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this8 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this8.getCellMeta(row, col).className;\n          });\n          var type = 'horizontal';\n          var alignment = 'htJustify';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this8.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this8.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        name: _separator.KEY\n      }, {\n        key: KEY + ':top',\n        name: function name() {\n          var _this9 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this9.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htTop') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n          return label;\n        },\n        callback: function callback() {\n          var _this10 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this10.getCellMeta(row, col).className;\n          });\n          var type = 'vertical';\n          var alignment = 'htTop';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this10.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this10.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':middle',\n        name: function name() {\n          var _this11 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this11.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htMiddle') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this12 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this12.getCellMeta(row, col).className;\n          });\n          var type = 'vertical';\n          var alignment = 'htMiddle';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this12.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this12.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':bottom',\n        name: function name() {\n          var _this13 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this13.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htBottom') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this14 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this14.getCellMeta(row, col).className;\n          });\n          var type = 'vertical';\n          var alignment = 'htBottom';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this14.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this14.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }]\n    }\n  };\n}\n\n/***/ }),\n/* 423 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = clearColumnItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'clear_column';\n\nfunction clearColumnItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_CLEAR_COLUMN);\n    },\n    callback: function callback(key, selection) {\n      var column = selection[0].start.col;\n\n      if (this.countRows()) {\n        this.populateFromArray(0, column, [[null]], Math.max(selection[0].start.row, selection[0].end.row), column, 'ContextMenu.clearColumn');\n      }\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n\n      var _selected$ = _slicedToArray(selected[0], 4),\n          startRow = _selected$[0],\n          startColumn = _selected$[1],\n          endRow = _selected$[2],\n          endColumn = _selected$[3];\n\n      var entireRowSelection = [startRow, 0, endRow, this.countCols() - 1];\n      var rowSelected = entireRowSelection.join(',') === selected.join(',');\n\n      return startColumn < 0 || this.countCols() >= this.getSettings().maxCols || rowSelected;\n    }\n  };\n}\n\n/***/ }),\n/* 424 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = columnLeftItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'col_left';\n\nfunction columnLeftItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_INSERT_LEFT);\n    },\n    callback: function callback(key, normalizedSelection) {\n      var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)];\n\n      this.alter('insert_col', latestSelection.start.col, 1, 'ContextMenu.columnLeft');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n      if (!this.isColumnModificationAllowed()) {\n        return true;\n      }\n\n      var _selected$ = _slicedToArray(selected[0], 4),\n          startRow = _selected$[0],\n          startColumn = _selected$[1],\n          endRow = _selected$[2],\n          endColumn = _selected$[3];\n\n      var entireRowSelection = [startRow, 0, endRow, this.countCols() - 1];\n      var rowSelected = entireRowSelection.join(',') === selected.join(',');\n      var onlyOneColumn = this.countCols() === 1;\n\n      return startColumn < 0 || this.countCols() >= this.getSettings().maxCols || !onlyOneColumn && rowSelected;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowInsertColumn;\n    }\n  };\n}\n\n/***/ }),\n/* 425 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = columnRightItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'col_right';\n\nfunction columnRightItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_INSERT_RIGHT);\n    },\n    callback: function callback(key, normalizedSelection) {\n      var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)];\n\n      this.alter('insert_col', latestSelection.end.col + 1, 1, 'ContextMenu.columnRight');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n      if (!this.isColumnModificationAllowed()) {\n        return true;\n      }\n\n      var _selected$ = _slicedToArray(selected[0], 4),\n          startRow = _selected$[0],\n          startColumn = _selected$[1],\n          endRow = _selected$[2],\n          endColumn = _selected$[3];\n\n      var entireRowSelection = [startRow, 0, endRow, this.countCols() - 1];\n      var rowSelected = entireRowSelection.join(',') === selected.join(',');\n      var onlyOneColumn = this.countCols() === 1;\n\n      return startColumn < 0 || this.countCols() >= this.getSettings().maxCols || !onlyOneColumn && rowSelected;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowInsertColumn;\n    }\n  };\n}\n\n/***/ }),\n/* 426 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = readOnlyItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _array = __webpack_require__(1);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'make_read_only';\n\nfunction readOnlyItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      var _this = this;\n\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_READ_ONLY);\n      var atLeastOneReadOnly = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n        return _this.getCellMeta(row, col).readOnly;\n      });\n\n      if (atLeastOneReadOnly) {\n        label = (0, _utils.markLabelAsSelected)(label);\n      }\n\n      return label;\n    },\n    callback: function callback() {\n      var _this2 = this;\n\n      var ranges = this.getSelectedRange();\n      var atLeastOneReadOnly = (0, _utils.checkSelectionConsistency)(ranges, function (row, col) {\n        return _this2.getCellMeta(row, col).readOnly;\n      });\n\n      (0, _array.arrayEach)(ranges, function (range) {\n        range.forAll(function (row, col) {\n          _this2.setCellMeta(row, col, 'readOnly', !atLeastOneReadOnly);\n        });\n      });\n\n      this.render();\n    },\n    disabled: function disabled() {\n      return !(this.getSelectedRange() && !this.selection.isSelectedByCorner());\n    }\n  };\n}\n\n/***/ }),\n/* 427 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = redoItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'redo';\n\nfunction redoItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REDO);\n    },\n    callback: function callback() {\n      this.redo();\n    },\n    disabled: function disabled() {\n      return this.undoRedo && !this.undoRedo.isRedoAvailable();\n    }\n  };\n}\n\n/***/ }),\n/* 428 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = removeColumnItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _array = __webpack_require__(1);\n\nvar _utils2 = __webpack_require__(91);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'remove_col';\n\nfunction removeColumnItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      var selection = this.getSelected();\n      var pluralForm = 0;\n\n      if (selection) {\n        if (selection.length > 1) {\n          pluralForm = 1;\n        } else {\n          var _selection$ = _slicedToArray(selection[0], 4),\n              fromColumn = _selection$[1],\n              toColumn = _selection$[3];\n\n          if (fromColumn - toColumn !== 0) {\n            pluralForm = 1;\n          }\n        }\n      }\n\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, pluralForm);\n    },\n    callback: function callback() {\n      this.alter('remove_col', (0, _utils2.transformSelectionToColumnDistance)(this.getSelected()), null, 'ContextMenu.removeColumn');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n      var totalColumns = this.countCols();\n\n      if (!selected) {\n        return true;\n      }\n\n      return this.selection.isSelectedByRowHeader() || this.selection.isSelectedByCorner() || !this.isColumnModificationAllowed() || !totalColumns;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowRemoveColumn;\n    }\n  };\n}\n\n/***/ }),\n/* 429 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = removeRowItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _array = __webpack_require__(1);\n\nvar _utils2 = __webpack_require__(91);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'remove_row';\n\nfunction removeRowItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      var selection = this.getSelected();\n      var pluralForm = 0;\n\n      if (selection) {\n        if (selection.length > 1) {\n          pluralForm = 1;\n        } else {\n          var _selection$ = _slicedToArray(selection[0], 3),\n              fromRow = _selection$[0],\n              toRow = _selection$[2];\n\n          if (fromRow - toRow !== 0) {\n            pluralForm = 1;\n          }\n        }\n      }\n\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_ROW, pluralForm);\n    },\n    callback: function callback() {\n      this.alter('remove_row', (0, _utils2.transformSelectionToRowDistance)(this.getSelected()), null, 'ContextMenu.removeRow');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n      var totalRows = this.countRows();\n\n      if (!selected) {\n        return true;\n      }\n\n      return this.selection.isSelectedByColumnHeader() || this.selection.isSelectedByCorner() || !totalRows;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowRemoveRow;\n    }\n  };\n}\n\n/***/ }),\n/* 430 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = rowAboveItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'row_above';\n\nfunction rowAboveItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ROW_ABOVE);\n    },\n    callback: function callback(key, normalizedSelection) {\n      var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)];\n\n      this.alter('insert_row', latestSelection.start.row, 1, 'ContextMenu.rowAbove');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n\n      return this.selection.isSelectedByColumnHeader() || this.countRows() >= this.getSettings().maxRows;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowInsertRow;\n    }\n  };\n}\n\n/***/ }),\n/* 431 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = rowBelowItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'row_below';\n\nfunction rowBelowItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ROW_BELOW);\n    },\n    callback: function callback(key, normalizedSelection) {\n      var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)];\n\n      this.alter('insert_row', latestSelection.end.row + 1, 1, 'ContextMenu.rowBelow');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n\n      return this.selection.isSelectedByColumnHeader() || this.countRows() >= this.getSettings().maxRows;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowInsertRow;\n    }\n  };\n}\n\n/***/ }),\n/* 432 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = undoItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'undo';\n\nfunction undoItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_UNDO);\n    },\n    callback: function callback() {\n      this.undo();\n    },\n    disabled: function disabled() {\n      return this.undoRedo && !this.undoRedo.isUndoAvailable();\n    }\n  };\n}\n\n/***/ }),\n/* 433 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _core = __webpack_require__(88);\n\nvar _core2 = _interopRequireDefault(_core);\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _cursor = __webpack_require__(434);\n\nvar _cursor2 = _interopRequireDefault(_cursor);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _object = __webpack_require__(2);\n\nvar _mixed = __webpack_require__(16);\n\nvar _function = __webpack_require__(43);\n\nvar _utils = __webpack_require__(19);\n\nvar _unicode = __webpack_require__(21);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nvar _predefinedItems = __webpack_require__(94);\n\nvar _event = __webpack_require__(12);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar MIN_WIDTH = 215;\n\n/**\n * @class Menu\n * @plugin ContextMenu\n */\n\nvar Menu = function () {\n  function Menu(hotInstance, options) {\n    _classCallCheck(this, Menu);\n\n    this.hot = hotInstance;\n    this.options = options || {\n      parent: null,\n      name: null,\n      className: '',\n      keepInViewport: true,\n      standalone: false,\n      minWidth: MIN_WIDTH\n    };\n    this.eventManager = new _eventManager2.default(this);\n    this.container = this.createContainer(this.options.name);\n    this.hotMenu = null;\n    this.hotSubMenus = {};\n    this.parentMenu = this.options.parent || null;\n    this.menuItems = null;\n    this.origOutsideClickDeselects = null;\n    this.keyEvent = false;\n\n    this.offset = {\n      above: 0,\n      below: 0,\n      left: 0,\n      right: 0\n    };\n    this._afterScrollCallback = null;\n\n    this.registerEvents();\n  }\n\n  /**\n   * Register event listeners.\n   *\n   * @private\n   */\n\n\n  _createClass(Menu, [{\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this = this;\n\n      this.eventManager.addEventListener(document.documentElement, 'mousedown', function (event) {\n        return _this.onDocumentMouseDown(event);\n      });\n    }\n\n    /**\n     * Set array of objects which defines menu items.\n     *\n     * @param {Array} menuItems Menu items to display.\n     */\n\n  }, {\n    key: 'setMenuItems',\n    value: function setMenuItems(menuItems) {\n      this.menuItems = menuItems;\n    }\n\n    /**\n     * Set offset menu position for specified area (`above`, `below`, `left` or `right`).\n     *\n     * @param {String} area Specified area name (`above`, `below`, `left` or `right`).\n     * @param {Number} offset Offset value.\n     */\n\n  }, {\n    key: 'setOffset',\n    value: function setOffset(area) {\n      var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n      this.offset[area] = offset;\n    }\n\n    /**\n     * Check if menu is using as sub-menu.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSubMenu',\n    value: function isSubMenu() {\n      return this.parentMenu !== null;\n    }\n\n    /**\n     * Open menu.\n     *\n     * @fires Hooks#beforeContextMenuShow\n     * @fires Hooks#afterContextMenuShow\n     */\n\n  }, {\n    key: 'open',\n    value: function open() {\n      var _this2 = this;\n\n      this.runLocalHooks('beforeOpen');\n\n      this.container.removeAttribute('style');\n      this.container.style.display = 'block';\n\n      var delayedOpenSubMenu = (0, _function.debounce)(function (row) {\n        return _this2.openSubMenu(row);\n      }, 300);\n      var minWidthOfMenu = this.options.minWidth || MIN_WIDTH;\n\n      var filteredItems = (0, _array.arrayFilter)(this.menuItems, function (item) {\n        return (0, _utils.isItemHidden)(item, _this2.hot);\n      });\n\n      filteredItems = (0, _utils.filterSeparators)(filteredItems, _predefinedItems.SEPARATOR);\n\n      var settings = {\n        data: filteredItems,\n        colHeaders: false,\n        autoColumnSize: true,\n        modifyColWidth: function modifyColWidth(width) {\n          if ((0, _mixed.isDefined)(width) && width < minWidthOfMenu) {\n            return minWidthOfMenu;\n          }\n\n          return width;\n        },\n\n        autoRowSize: false,\n        readOnly: true,\n        copyPaste: false,\n        columns: [{\n          data: 'name',\n          renderer: function renderer(hot, TD, row, col, prop, value) {\n            return _this2.menuItemRenderer(hot, TD, row, col, prop, value);\n          }\n        }],\n        renderAllRows: true,\n        fragmentSelection: 'cell',\n        disableVisualSelection: 'area',\n        beforeKeyDown: function beforeKeyDown(event) {\n          return _this2.onBeforeKeyDown(event);\n        },\n        afterOnCellMouseOver: function afterOnCellMouseOver(event, coords, TD) {\n          if (_this2.isAllSubMenusClosed()) {\n            delayedOpenSubMenu(coords.row);\n          } else {\n            _this2.openSubMenu(coords.row);\n          }\n        },\n        rowHeights: function rowHeights(row) {\n          return filteredItems[row].name === _predefinedItems.SEPARATOR ? 1 : 23;\n        }\n      };\n      this.origOutsideClickDeselects = this.hot.getSettings().outsideClickDeselects;\n      this.hot.getSettings().outsideClickDeselects = false;\n      this.hotMenu = new _core2.default(this.container, settings);\n      this.hotMenu.addHook('afterInit', function () {\n        return _this2.onAfterInit();\n      });\n      this.hotMenu.addHook('afterSelection', function () {\n        return _this2.onAfterSelection.apply(_this2, arguments);\n      });\n      this.hotMenu.init();\n      this.hotMenu.listen();\n      this.blockMainTableCallbacks();\n      this.runLocalHooks('afterOpen');\n    }\n\n    /**\n     * Close menu.\n     *\n     * @param {Boolean} [closeParent=false] if `true` try to close parent menu if exists.\n     */\n\n  }, {\n    key: 'close',\n    value: function close() {\n      var closeParent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (!this.isOpened()) {\n        return;\n      }\n      if (closeParent && this.parentMenu) {\n        this.parentMenu.close();\n      } else {\n        this.closeAllSubMenus();\n        this.container.style.display = 'none';\n        this.releaseMainTableCallbacks();\n        this.hotMenu.destroy();\n        this.hotMenu = null;\n        this.hot.getSettings().outsideClickDeselects = this.origOutsideClickDeselects;\n        this.runLocalHooks('afterClose');\n\n        if (this.parentMenu) {\n          this.parentMenu.hotMenu.listen();\n        }\n      }\n    }\n\n    /**\n     * Open sub menu at the provided row index.\n     *\n     * @param {Number} row Row index.\n     * @returns {Menu|Boolean} Returns created menu or `false` if no one menu was created.\n     */\n\n  }, {\n    key: 'openSubMenu',\n    value: function openSubMenu(row) {\n      if (!this.hotMenu) {\n        return false;\n      }\n      var cell = this.hotMenu.getCell(row, 0);\n\n      this.closeAllSubMenus();\n\n      if (!cell || !(0, _utils.hasSubMenu)(cell)) {\n        return false;\n      }\n      var dataItem = this.hotMenu.getSourceDataAtRow(row);\n      var subMenu = new Menu(this.hot, {\n        parent: this,\n        name: dataItem.name,\n        className: this.options.className,\n        keepInViewport: true\n      });\n      subMenu.setMenuItems(dataItem.submenu.items);\n      subMenu.open();\n      subMenu.setPosition(cell.getBoundingClientRect());\n      this.hotSubMenus[dataItem.key] = subMenu;\n\n      return subMenu;\n    }\n\n    /**\n     * Close sub menu at row index.\n     *\n     * @param {Number} row Row index.\n     */\n\n  }, {\n    key: 'closeSubMenu',\n    value: function closeSubMenu(row) {\n      var dataItem = this.hotMenu.getSourceDataAtRow(row);\n      var menus = this.hotSubMenus[dataItem.key];\n\n      if (menus) {\n        menus.destroy();\n        delete this.hotSubMenus[dataItem.key];\n      }\n    }\n\n    /**\n     * Close all opened sub menus.\n     */\n\n  }, {\n    key: 'closeAllSubMenus',\n    value: function closeAllSubMenus() {\n      var _this3 = this;\n\n      (0, _array.arrayEach)(this.hotMenu.getData(), function (value, row) {\n        return _this3.closeSubMenu(row);\n      });\n    }\n\n    /**\n     * Checks if all created and opened sub menus are closed.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isAllSubMenusClosed',\n    value: function isAllSubMenusClosed() {\n      return Object.keys(this.hotSubMenus).length === 0;\n    }\n\n    /**\n     * Destroy instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.clearLocalHooks();\n      this.close();\n      this.parentMenu = null;\n      this.eventManager.destroy();\n    }\n\n    /**\n     * Checks if menu was opened.\n     *\n     * @returns {Boolean} Returns `true` if menu was opened.\n     */\n\n  }, {\n    key: 'isOpened',\n    value: function isOpened() {\n      return this.hotMenu !== null;\n    }\n\n    /**\n     * Execute menu command.\n     *\n     * @param {Event} [event]\n     */\n\n  }, {\n    key: 'executeCommand',\n    value: function executeCommand(event) {\n      if (!this.isOpened() || !this.hotMenu.getSelectedLast()) {\n        return;\n      }\n      var selectedItem = this.hotMenu.getSourceDataAtRow(this.hotMenu.getSelectedLast()[0]);\n\n      this.runLocalHooks('select', selectedItem, event);\n\n      if (selectedItem.isCommand === false || selectedItem.name === _predefinedItems.SEPARATOR) {\n        return;\n      }\n      var selRanges = this.hot.getSelectedRange();\n      var normalizedSelection = selRanges ? (0, _utils.normalizeSelection)(selRanges) : [];\n      var autoClose = true;\n\n      // Don't close context menu if item is disabled or it has submenu\n      if (selectedItem.disabled === true || typeof selectedItem.disabled === 'function' && selectedItem.disabled.call(this.hot) === true || selectedItem.submenu) {\n        autoClose = false;\n      }\n\n      this.runLocalHooks('executeCommand', selectedItem.key, normalizedSelection, event);\n\n      if (this.isSubMenu()) {\n        this.parentMenu.runLocalHooks('executeCommand', selectedItem.key, normalizedSelection, event);\n      }\n\n      if (autoClose) {\n        this.close(true);\n      }\n    }\n\n    /**\n     * Set menu position based on dom event or based on literal object.\n     *\n     * @param {Event|Object} coords Event or literal Object with coordinates.\n     */\n\n  }, {\n    key: 'setPosition',\n    value: function setPosition(coords) {\n      var cursor = new _cursor2.default(coords);\n\n      if (this.options.keepInViewport) {\n        if (cursor.fitsBelow(this.container)) {\n          this.setPositionBelowCursor(cursor);\n        } else if (cursor.fitsAbove(this.container)) {\n          this.setPositionAboveCursor(cursor);\n        } else {\n          this.setPositionBelowCursor(cursor);\n        }\n        if (cursor.fitsOnRight(this.container)) {\n          this.setPositionOnRightOfCursor(cursor);\n        } else {\n          this.setPositionOnLeftOfCursor(cursor);\n        }\n      } else {\n        this.setPositionBelowCursor(cursor);\n        this.setPositionOnRightOfCursor(cursor);\n      }\n    }\n\n    /**\n     * Set menu position above cursor object.\n     *\n     * @param {Cursor} cursor `Cursor` object.\n     */\n\n  }, {\n    key: 'setPositionAboveCursor',\n    value: function setPositionAboveCursor(cursor) {\n      var top = this.offset.above + cursor.top - this.container.offsetHeight;\n\n      if (this.isSubMenu()) {\n        top = cursor.top + cursor.cellHeight - this.container.offsetHeight + 3;\n      }\n      this.container.style.top = top + 'px';\n    }\n\n    /**\n     * Set menu position below cursor object.\n     *\n     * @param {Cursor} cursor `Cursor` object.\n     */\n\n  }, {\n    key: 'setPositionBelowCursor',\n    value: function setPositionBelowCursor(cursor) {\n      var top = this.offset.below + cursor.top;\n\n      if (this.isSubMenu()) {\n        top = cursor.top - 1;\n      }\n      this.container.style.top = top + 'px';\n    }\n\n    /**\n     * Set menu position on the right of cursor object.\n     *\n     * @param {Cursor} cursor `Cursor` object.\n     */\n\n  }, {\n    key: 'setPositionOnRightOfCursor',\n    value: function setPositionOnRightOfCursor(cursor) {\n      var left = void 0;\n\n      if (this.isSubMenu()) {\n        left = 1 + cursor.left + cursor.cellWidth;\n      } else {\n        left = this.offset.right + 1 + cursor.left;\n      }\n\n      this.container.style.left = left + 'px';\n    }\n\n    /**\n     * Set menu position on the left of cursor object.\n     *\n     * @param {Cursor} cursor `Cursor` object.\n     */\n\n  }, {\n    key: 'setPositionOnLeftOfCursor',\n    value: function setPositionOnLeftOfCursor(cursor) {\n      var left = this.offset.left + cursor.left - this.container.offsetWidth + (0, _element.getScrollbarWidth)() + 4;\n\n      this.container.style.left = left + 'px';\n    }\n\n    /**\n     * Select first cell in opened menu.\n     */\n\n  }, {\n    key: 'selectFirstCell',\n    value: function selectFirstCell() {\n      var cell = this.hotMenu.getCell(0, 0);\n\n      if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {\n        this.selectNextCell(0, 0);\n      } else {\n        this.hotMenu.selectCell(0, 0);\n      }\n    }\n\n    /**\n     * Select last cell in opened menu.\n     */\n\n  }, {\n    key: 'selectLastCell',\n    value: function selectLastCell() {\n      var lastRow = this.hotMenu.countRows() - 1;\n      var cell = this.hotMenu.getCell(lastRow, 0);\n\n      if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {\n        this.selectPrevCell(lastRow, 0);\n      } else {\n        this.hotMenu.selectCell(lastRow, 0);\n      }\n    }\n\n    /**\n     * Select next cell in opened menu.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} col Column index.\n     */\n\n  }, {\n    key: 'selectNextCell',\n    value: function selectNextCell(row, col) {\n      var nextRow = row + 1;\n      var cell = nextRow < this.hotMenu.countRows() ? this.hotMenu.getCell(nextRow, col) : null;\n\n      if (!cell) {\n        return;\n      }\n      if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {\n        this.selectNextCell(nextRow, col);\n      } else {\n        this.hotMenu.selectCell(nextRow, col);\n      }\n    }\n\n    /**\n     * Select previous cell in opened menu.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} col Column index.\n     */\n\n  }, {\n    key: 'selectPrevCell',\n    value: function selectPrevCell(row, col) {\n      var prevRow = row - 1;\n      var cell = prevRow >= 0 ? this.hotMenu.getCell(prevRow, col) : null;\n\n      if (!cell) {\n        return;\n      }\n      if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {\n        this.selectPrevCell(prevRow, col);\n      } else {\n        this.hotMenu.selectCell(prevRow, col);\n      }\n    }\n\n    /**\n     * Menu item renderer.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'menuItemRenderer',\n    value: function menuItemRenderer(hot, TD, row, col, prop, value) {\n      var _this4 = this;\n\n      var item = hot.getSourceDataAtRow(row);\n      var wrapper = document.createElement('div');\n\n      var isSubMenu = function isSubMenu(item) {\n        return (0, _object.hasOwnProperty)(item, 'submenu');\n      };\n      var itemIsSeparator = function itemIsSeparator(item) {\n        return new RegExp(_predefinedItems.SEPARATOR, 'i').test(item.name);\n      };\n      var itemIsDisabled = function itemIsDisabled(item) {\n        return item.disabled === true || typeof item.disabled == 'function' && item.disabled.call(_this4.hot) === true;\n      };\n      var itemIsSelectionDisabled = function itemIsSelectionDisabled(item) {\n        return item.disableSelection;\n      };\n\n      if (typeof value === 'function') {\n        value = value.call(this.hot);\n      }\n      (0, _element.empty)(TD);\n      (0, _element.addClass)(wrapper, 'htItemWrapper');\n      TD.appendChild(wrapper);\n\n      if (itemIsSeparator(item)) {\n        (0, _element.addClass)(TD, 'htSeparator');\n      } else if (typeof item.renderer === 'function') {\n        (0, _element.addClass)(TD, 'htCustomMenuRenderer');\n        TD.appendChild(item.renderer(hot, wrapper, row, col, prop, value));\n      } else {\n        (0, _element.fastInnerHTML)(wrapper, value);\n      }\n      if (itemIsDisabled(item)) {\n        (0, _element.addClass)(TD, 'htDisabled');\n        this.eventManager.addEventListener(TD, 'mouseenter', function () {\n          return hot.deselectCell();\n        });\n      } else if (itemIsSelectionDisabled(item)) {\n        (0, _element.addClass)(TD, 'htSelectionDisabled');\n        this.eventManager.addEventListener(TD, 'mouseenter', function () {\n          return hot.deselectCell();\n        });\n      } else if (isSubMenu(item)) {\n        (0, _element.addClass)(TD, 'htSubmenu');\n\n        if (itemIsSelectionDisabled(item)) {\n          this.eventManager.addEventListener(TD, 'mouseenter', function () {\n            return hot.deselectCell();\n          });\n        } else {\n          this.eventManager.addEventListener(TD, 'mouseenter', function () {\n            return hot.selectCell(row, col, void 0, void 0, false, false);\n          });\n        }\n      } else {\n        (0, _element.removeClass)(TD, 'htSubmenu');\n        (0, _element.removeClass)(TD, 'htDisabled');\n\n        if (itemIsSelectionDisabled(item)) {\n          this.eventManager.addEventListener(TD, 'mouseenter', function () {\n            return hot.deselectCell();\n          });\n        } else {\n          this.eventManager.addEventListener(TD, 'mouseenter', function () {\n            return hot.selectCell(row, col, void 0, void 0, false, false);\n          });\n        }\n      }\n    }\n\n    /**\n     * Create container/wrapper for handsontable.\n     *\n     * @private\n     * @param {String} [name] Class name.\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createContainer',\n    value: function createContainer() {\n      var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      var container = void 0;\n\n      if (name) {\n        if ((0, _function.isFunction)(name)) {\n          name = name.call(this.hot);\n\n          if (name === null || (0, _mixed.isUndefined)(name)) {\n            name = '';\n          } else {\n            name = name.toString();\n          }\n        }\n\n        name = name.replace(/[^A-z0-9]/g, '_');\n        name = this.options.className + 'Sub_' + name;\n\n        container = document.querySelector('.' + this.options.className + '.' + name);\n      } else {\n        container = document.querySelector('.' + this.options.className);\n      }\n\n      if (!container) {\n        container = document.createElement('div');\n\n        (0, _element.addClass)(container, 'htMenu ' + this.options.className);\n\n        if (name) {\n          (0, _element.addClass)(container, name);\n        }\n        document.getElementsByTagName('body')[0].appendChild(container);\n      }\n\n      return container;\n    }\n\n    /**\n     * @private\n     */\n\n  }, {\n    key: 'blockMainTableCallbacks',\n    value: function blockMainTableCallbacks() {\n      this._afterScrollCallback = function () {};\n      this.hot.addHook('afterScrollVertically', this._afterScrollCallback);\n      this.hot.addHook('afterScrollHorizontally', this._afterScrollCallback);\n    }\n\n    /**\n     * @private\n     */\n\n  }, {\n    key: 'releaseMainTableCallbacks',\n    value: function releaseMainTableCallbacks() {\n      if (this._afterScrollCallback) {\n        this.hot.removeHook('afterScrollVertically', this._afterScrollCallback);\n        this.hot.removeHook('afterScrollHorizontally', this._afterScrollCallback);\n        this._afterScrollCallback = null;\n      }\n    }\n\n    /**\n     * On before key down listener.\n     *\n     * @private\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onBeforeKeyDown',\n    value: function onBeforeKeyDown(event) {\n      var selection = this.hotMenu.getSelectedLast();\n      var stopEvent = false;\n      this.keyEvent = true;\n\n      switch (event.keyCode) {\n        case _unicode.KEY_CODES.ESCAPE:\n          this.close();\n          stopEvent = true;\n          break;\n\n        case _unicode.KEY_CODES.ENTER:\n          if (selection) {\n            if (this.hotMenu.getSourceDataAtRow(selection[0]).submenu) {\n              stopEvent = true;\n            } else {\n              this.executeCommand(event);\n              this.close(true);\n            }\n          }\n          break;\n\n        case _unicode.KEY_CODES.ARROW_DOWN:\n          if (selection) {\n            this.selectNextCell(selection[0], selection[1]);\n          } else {\n            this.selectFirstCell();\n          }\n          stopEvent = true;\n          break;\n\n        case _unicode.KEY_CODES.ARROW_UP:\n          if (selection) {\n            this.selectPrevCell(selection[0], selection[1]);\n          } else {\n            this.selectLastCell();\n          }\n          stopEvent = true;\n          break;\n\n        case _unicode.KEY_CODES.ARROW_RIGHT:\n          if (selection) {\n            var menu = this.openSubMenu(selection[0]);\n\n            if (menu) {\n              menu.selectFirstCell();\n            }\n          }\n          stopEvent = true;\n\n          break;\n\n        case _unicode.KEY_CODES.ARROW_LEFT:\n          if (selection && this.isSubMenu()) {\n            this.close();\n\n            if (this.parentMenu) {\n              this.parentMenu.hotMenu.listen();\n            }\n            stopEvent = true;\n          }\n          break;\n        default:\n          break;\n      }\n      if (stopEvent) {\n        event.preventDefault();\n        (0, _event.stopImmediatePropagation)(event);\n      }\n\n      this.keyEvent = false;\n    }\n\n    /**\n     * On after init listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      var data = this.hotMenu.getSettings().data;\n      var hiderStyle = this.hotMenu.view.wt.wtTable.hider.style;\n      var holderStyle = this.hotMenu.view.wt.wtTable.holder.style;\n      var currentHiderWidth = parseInt(hiderStyle.width, 10);\n\n      var realHeight = (0, _array.arrayReduce)(data, function (accumulator, value) {\n        return accumulator + (value.name === _predefinedItems.SEPARATOR ? 1 : 26);\n      }, 0);\n\n      holderStyle.width = currentHiderWidth + 22 + 'px';\n      holderStyle.height = realHeight + 4 + 'px';\n      hiderStyle.height = holderStyle.height;\n    }\n\n    /**\n     * On after selection listener.\n     *\n     * @param {Number} r Selection start row index.\n     * @param {Number} c Selection start column index.\n     * @param {Number} r2 Selection end row index.\n     * @param {Number} c2 Selection end column index.\n     * @param {Object} preventScrolling Object with `value` property where its value change will be observed.\n     * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n     */\n\n  }, {\n    key: 'onAfterSelection',\n    value: function onAfterSelection(r, c, r2, c2, preventScrolling) {\n      if (this.keyEvent === false) {\n        preventScrolling.value = true;\n      }\n    }\n\n    /**\n     * Document mouse down listener.\n     *\n     * @private\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onDocumentMouseDown',\n    value: function onDocumentMouseDown(event) {\n      if (!this.isOpened()) {\n        return;\n      }\n      if (this.container && (0, _element.isChildOf)(event.target, this.container)) {\n        this.executeCommand(event);\n      }\n      // Close menu when clicked element is not belongs to menu itself\n      if (this.options.standalone && this.hotMenu && !(0, _element.isChildOf)(event.target, this.hotMenu.rootElement)) {\n        this.close(true);\n\n        // Automatically close menu when clicked element is not belongs to menu or submenu (not necessarily to itself)\n      } else if ((this.isAllSubMenusClosed() || this.isSubMenu()) && !(0, _element.isChildOf)(event.target, '.htMenu') && (0, _element.isChildOf)(event.target, document)) {\n        this.close(true);\n      }\n    }\n  }]);\n\n  return Menu;\n}();\n\n(0, _object.mixin)(Menu, _localHooks2.default);\n\nexports.default = Menu;\n\n/***/ }),\n/* 434 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _event = __webpack_require__(12);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Helper class for checking if element will fit at the desired side of cursor.\n *\n * @class Cursor\n * @plugin ContextMenu\n */\nvar Cursor = function () {\n  function Cursor(object) {\n    _classCallCheck(this, Cursor);\n\n    var windowScrollTop = (0, _element.getWindowScrollTop)();\n    var windowScrollLeft = (0, _element.getWindowScrollLeft)();\n    var top = void 0,\n        topRelative = void 0;\n    var left = void 0,\n        leftRelative = void 0;\n    var cellHeight = void 0,\n        cellWidth = void 0;\n\n    this.type = this.getSourceType(object);\n\n    if (this.type === 'literal') {\n      top = parseInt(object.top, 10);\n      left = parseInt(object.left, 10);\n      cellHeight = object.height || 0;\n      cellWidth = object.width || 0;\n      topRelative = top;\n      leftRelative = left;\n      top += windowScrollTop;\n      left += windowScrollLeft;\n    } else if (this.type === 'event') {\n      top = parseInt((0, _event.pageY)(object), 10);\n      left = parseInt((0, _event.pageX)(object), 10);\n      cellHeight = object.target.clientHeight;\n      cellWidth = object.target.clientWidth;\n      topRelative = top - windowScrollTop;\n      leftRelative = left - windowScrollLeft;\n    }\n\n    this.top = top;\n    this.topRelative = topRelative;\n    this.left = left;\n    this.leftRelative = leftRelative;\n    this.scrollTop = windowScrollTop;\n    this.scrollLeft = windowScrollLeft;\n    this.cellHeight = cellHeight;\n    this.cellWidth = cellWidth;\n  }\n\n  /**\n   * Get source type name.\n   *\n   * @param {*} object Event or Object with coordinates.\n   * @returns {String} Returns one of this values: `'literal'`, `'event'`.\n   */\n\n\n  _createClass(Cursor, [{\n    key: 'getSourceType',\n    value: function getSourceType(object) {\n      var type = 'literal';\n\n      if (object instanceof Event) {\n        type = 'event';\n      }\n\n      return type;\n    }\n\n    /**\n     * Checks if element can be placed above the cursor.\n     *\n     * @param {HTMLElement} element Element to check if it's size will fit above the cursor.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'fitsAbove',\n    value: function fitsAbove(element) {\n      return this.topRelative >= element.offsetHeight;\n    }\n\n    /**\n     * Checks if element can be placed below the cursor.\n     *\n     * @param {HTMLElement} element Element to check if it's size will fit below the cursor.\n     * @param {Number} [viewportHeight] The viewport height.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'fitsBelow',\n    value: function fitsBelow(element) {\n      var viewportHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window.innerHeight;\n\n      return this.topRelative + element.offsetHeight <= viewportHeight;\n    }\n\n    /**\n     * Checks if element can be placed on the right of the cursor.\n     *\n     * @param {HTMLElement} element Element to check if it's size will fit on the right of the cursor.\n     * @param {Number} [viewportWidth] The viewport width.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'fitsOnRight',\n    value: function fitsOnRight(element) {\n      var viewportWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window.innerWidth;\n\n      return this.leftRelative + this.cellWidth + element.offsetWidth <= viewportWidth;\n    }\n\n    /**\n     * Checks if element can be placed on the left on the cursor.\n     *\n     * @param {HTMLElement} element Element to check if it's size will fit on the left of the cursor.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'fitsOnLeft',\n    value: function fitsOnLeft(element) {\n      return this.leftRelative >= element.offsetWidth;\n    }\n  }]);\n\n  return Cursor;\n}();\n\nexports.default = Cursor;\n\n/***/ }),\n/* 435 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 436 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _SheetClip = __webpack_require__(311);\n\nvar _SheetClip2 = _interopRequireDefault(_SheetClip);\n\nvar _src = __webpack_require__(4);\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nvar _textarea = __webpack_require__(437);\n\nvar _textarea2 = _interopRequireDefault(_textarea);\n\nvar _copy = __webpack_require__(438);\n\nvar _copy2 = _interopRequireDefault(_copy);\n\nvar _cut = __webpack_require__(439);\n\nvar _cut2 = _interopRequireDefault(_cut);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _pasteEvent = __webpack_require__(440);\n\nvar _pasteEvent2 = _interopRequireDefault(_pasteEvent);\n\n__webpack_require__(442);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('afterCopyLimit');\n_pluginHooks2.default.getSingleton().register('modifyCopyableRange');\n_pluginHooks2.default.getSingleton().register('beforeCut');\n_pluginHooks2.default.getSingleton().register('afterCut');\n_pluginHooks2.default.getSingleton().register('beforePaste');\n_pluginHooks2.default.getSingleton().register('afterPaste');\n_pluginHooks2.default.getSingleton().register('beforeCopy');\n_pluginHooks2.default.getSingleton().register('afterCopy');\n\nvar ROWS_LIMIT = 1000;\nvar COLUMNS_LIMIT = 1000;\nvar privatePool = new WeakMap();\n\n/**\n * @description\n * This plugin enables the copy/paste functionality in the Handsontable.\n *\n * @example\n * ```js\n * ...\n * copyPaste: true,\n * ...\n * ```\n * @class CopyPaste\n * @plugin CopyPaste\n */\n\nvar CopyPaste = function (_BasePlugin) {\n  _inherits(CopyPaste, _BasePlugin);\n\n  function CopyPaste(hotInstance) {\n    _classCallCheck(this, CopyPaste);\n\n    /**\n     * Event manager\n     *\n     * @type {EventManager}\n     */\n    var _this = _possibleConstructorReturn(this, (CopyPaste.__proto__ || Object.getPrototypeOf(CopyPaste)).call(this, hotInstance));\n\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Maximum number of columns than can be copied to clipboard using <kbd>CTRL</kbd> + <kbd>C</kbd>.\n     *\n     * @private\n     * @type {Number}\n     * @default 1000\n     */\n    _this.columnsLimit = COLUMNS_LIMIT;\n    /**\n     * Ranges of the cells coordinates, which should be used to copy/cut/paste actions.\n     *\n     * @private\n     * @type {Array}\n     */\n    _this.copyableRanges = [];\n    /**\n     * Defines paste (<kbd>CTRL</kbd> + <kbd>V</kbd>) behavior.\n     * * Default value `\"overwrite\"` will paste clipboard value over current selection.\n     * * When set to `\"shift_down\"`, clipboard data will be pasted in place of current selection, while all selected cells are moved down.\n     * * When set to `\"shift_right\"`, clipboard data will be pasted in place of current selection, while all selected cells are moved right.\n     *\n     * @private\n     * @type {String}\n     * @default 'overwrite'\n     */\n    _this.pasteMode = 'overwrite';\n    /**\n     * Maximum number of rows than can be copied to clipboard using <kbd>CTRL</kbd> + <kbd>C</kbd>.\n     *\n     * @private\n     * @type {Number}\n     * @default 1000\n     */\n    _this.rowsLimit = ROWS_LIMIT;\n    /**\n     * The `textarea` element which is necessary to process copying, cutting off and pasting.\n     *\n     * @private\n     * @type {HTMLElement}\n     * @default undefined\n     */\n    _this.textarea = void 0;\n\n    privatePool.set(_this, {\n      isTriggeredByCopy: false,\n      isTriggeredByCut: false,\n      isBeginEditing: false,\n      isFragmentSelectionEnabled: false\n    });\n    return _this;\n  }\n\n  /**\n   * Check if plugin is enabled.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(CopyPaste, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().copyPaste;\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n      var settings = this.hot.getSettings();\n      var priv = privatePool.get(this);\n\n      this.textarea = _textarea2.default.getSingleton();\n      priv.isFragmentSelectionEnabled = settings.fragmentSelection;\n\n      if (_typeof(settings.copyPaste) === 'object') {\n        this.pasteMode = settings.copyPaste.pasteMode || this.pasteMode;\n        this.rowsLimit = settings.copyPaste.rowsLimit || this.rowsLimit;\n        this.columnsLimit = settings.copyPaste.columnsLimit || this.columnsLimit;\n      }\n\n      this.addHook('afterContextMenuDefaultOptions', function (options) {\n        return _this2.onAfterContextMenuDefaultOptions(options);\n      });\n      this.addHook('afterSelectionEnd', function () {\n        return _this2.onAfterSelectionEnd();\n      });\n\n      this.registerEvents();\n\n      _get(CopyPaste.prototype.__proto__ || Object.getPrototypeOf(CopyPaste.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(CopyPaste.prototype.__proto__ || Object.getPrototypeOf(CopyPaste.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      if (this.textarea) {\n        this.textarea.destroy();\n      }\n\n      _get(CopyPaste.prototype.__proto__ || Object.getPrototypeOf(CopyPaste.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Prepares copyable text from the cells selection in the invisible textarea.\n     *\n     * @function setCopyable\n     * @memberof CopyPaste#\n     */\n\n  }, {\n    key: 'setCopyableText',\n    value: function setCopyableText() {\n      var selRange = this.hot.getSelectedRangeLast();\n\n      if (!selRange) {\n        return;\n      }\n      var topLeft = selRange.getTopLeftCorner();\n      var bottomRight = selRange.getBottomRightCorner();\n      var startRow = topLeft.row;\n      var startCol = topLeft.col;\n      var endRow = bottomRight.row;\n      var endCol = bottomRight.col;\n      var finalEndRow = Math.min(endRow, startRow + this.rowsLimit - 1);\n      var finalEndCol = Math.min(endCol, startCol + this.columnsLimit - 1);\n\n      this.copyableRanges.length = 0;\n\n      this.copyableRanges.push({\n        startRow: startRow,\n        startCol: startCol,\n        endRow: finalEndRow,\n        endCol: finalEndCol\n      });\n\n      this.copyableRanges = this.hot.runHooks('modifyCopyableRange', this.copyableRanges);\n\n      if (endRow !== finalEndRow || endCol !== finalEndCol) {\n        this.hot.runHooks('afterCopyLimit', endRow - startRow + 1, endCol - startCol + 1, this.rowsLimit, this.columnsLimit);\n      }\n    }\n\n    /**\n     * Create copyable text releated to range objects.\n     *\n     * @since 0.19.0\n     * @param {Array} ranges Array of Objects with properties `startRow`, `endRow`, `startCol` and `endCol`.\n     * @returns {String} Returns string which will be copied into clipboard.\n     */\n\n  }, {\n    key: 'getRangedCopyableData',\n    value: function getRangedCopyableData(ranges) {\n      var _this3 = this;\n\n      var dataSet = [];\n      var copyableRows = [];\n      var copyableColumns = [];\n\n      // Count all copyable rows and columns\n      (0, _array.arrayEach)(ranges, function (range) {\n        (0, _number.rangeEach)(range.startRow, range.endRow, function (row) {\n          if (copyableRows.indexOf(row) === -1) {\n            copyableRows.push(row);\n          }\n        });\n        (0, _number.rangeEach)(range.startCol, range.endCol, function (column) {\n          if (copyableColumns.indexOf(column) === -1) {\n            copyableColumns.push(column);\n          }\n        });\n      });\n      // Concat all rows and columns data defined in ranges into one copyable string\n      (0, _array.arrayEach)(copyableRows, function (row) {\n        var rowSet = [];\n\n        (0, _array.arrayEach)(copyableColumns, function (column) {\n          rowSet.push(_this3.hot.getCopyableData(row, column));\n        });\n\n        dataSet.push(rowSet);\n      });\n\n      return _SheetClip2.default.stringify(dataSet);\n    }\n\n    /**\n     * Create copyable text releated to range objects.\n     *\n     * @since 0.31.1\n     * @param {Array} ranges Array of Objects with properties `startRow`, `startCol`, `endRow` and `endCol`.\n     * @returns {Array} Returns array of arrays which will be copied into clipboard.\n     */\n\n  }, {\n    key: 'getRangedData',\n    value: function getRangedData(ranges) {\n      var _this4 = this;\n\n      var dataSet = [];\n      var copyableRows = [];\n      var copyableColumns = [];\n\n      // Count all copyable rows and columns\n      (0, _array.arrayEach)(ranges, function (range) {\n        (0, _number.rangeEach)(range.startRow, range.endRow, function (row) {\n          if (copyableRows.indexOf(row) === -1) {\n            copyableRows.push(row);\n          }\n        });\n        (0, _number.rangeEach)(range.startCol, range.endCol, function (column) {\n          if (copyableColumns.indexOf(column) === -1) {\n            copyableColumns.push(column);\n          }\n        });\n      });\n      // Concat all rows and columns data defined in ranges into one copyable string\n      (0, _array.arrayEach)(copyableRows, function (row) {\n        var rowSet = [];\n\n        (0, _array.arrayEach)(copyableColumns, function (column) {\n          rowSet.push(_this4.hot.getCopyableData(row, column));\n        });\n\n        dataSet.push(rowSet);\n      });\n\n      return dataSet;\n    }\n\n    /**\n     * Copy action.\n     */\n\n  }, {\n    key: 'copy',\n    value: function copy() {\n      var priv = privatePool.get(this);\n\n      priv.isTriggeredByCopy = true;\n\n      this.textarea.select();\n      document.execCommand('copy');\n    }\n\n    /**\n     * Cut action.\n     */\n\n  }, {\n    key: 'cut',\n    value: function cut() {\n      var priv = privatePool.get(this);\n\n      priv.isTriggeredByCut = true;\n\n      this.textarea.select();\n      document.execCommand('cut');\n    }\n\n    /**\n     * Simulated paste action.\n     *\n     * @param {String} [value=''] New value, which should be `pasted`.\n     */\n\n  }, {\n    key: 'paste',\n    value: function paste() {\n      var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      var pasteData = new _pasteEvent2.default();\n      pasteData.clipboardData.setData('text/plain', value);\n\n      this.onPaste(pasteData);\n    }\n\n    /**\n     * Register event listeners.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this5 = this;\n\n      this.eventManager.addEventListener(this.textarea.element, 'paste', function (event) {\n        return _this5.onPaste(event);\n      });\n      this.eventManager.addEventListener(this.textarea.element, 'cut', function (event) {\n        return _this5.onCut(event);\n      });\n      this.eventManager.addEventListener(this.textarea.element, 'copy', function (event) {\n        return _this5.onCopy(event);\n      });\n    }\n\n    /**\n     * `copy` event callback on textarea element.\n     *\n     * @param {Event} event ClipboardEvent.\n     * @private\n     */\n\n  }, {\n    key: 'onCopy',\n    value: function onCopy(event) {\n      var priv = privatePool.get(this);\n\n      if (!this.hot.isListening() && !priv.isTriggeredByCopy) {\n        return;\n      }\n\n      this.setCopyableText();\n      priv.isTriggeredByCopy = false;\n\n      var rangedData = this.getRangedData(this.copyableRanges);\n      var allowCopying = !!this.hot.runHooks('beforeCopy', rangedData, this.copyableRanges);\n      var value = '';\n\n      if (allowCopying) {\n        value = _SheetClip2.default.stringify(rangedData);\n\n        if (event && event.clipboardData) {\n          event.clipboardData.setData('text/plain', value);\n        } else if (typeof ClipboardEvent === 'undefined') {\n          window.clipboardData.setData('Text', value);\n        }\n\n        this.hot.runHooks('afterCopy', rangedData, this.copyableRanges);\n      }\n\n      event.preventDefault();\n    }\n\n    /**\n     * `cut` event callback on textarea element.\n     *\n     * @param {Event} event ClipboardEvent.\n     * @private\n     */\n\n  }, {\n    key: 'onCut',\n    value: function onCut(event) {\n      var priv = privatePool.get(this);\n\n      if (!this.hot.isListening() && !priv.isTriggeredByCut) {\n        return;\n      }\n\n      this.setCopyableText();\n      priv.isTriggeredByCut = false;\n\n      var rangedData = this.getRangedData(this.copyableRanges);\n      var allowCuttingOut = !!this.hot.runHooks('beforeCut', rangedData, this.copyableRanges);\n      var value = void 0;\n\n      if (allowCuttingOut) {\n        value = _SheetClip2.default.stringify(rangedData);\n\n        if (event && event.clipboardData) {\n          event.clipboardData.setData('text/plain', value);\n        } else if (typeof ClipboardEvent === 'undefined') {\n          window.clipboardData.setData('Text', value);\n        }\n\n        this.hot.emptySelectedCells();\n        this.hot.runHooks('afterCut', rangedData, this.copyableRanges);\n      }\n\n      event.preventDefault();\n    }\n\n    /**\n     * `paste` event callback on textarea element.\n     *\n     * @param {Event} event ClipboardEvent or pseudo ClipboardEvent, if paste was called manually.\n     * @private\n     */\n\n  }, {\n    key: 'onPaste',\n    value: function onPaste(event) {\n      var _this6 = this;\n\n      if (!this.hot.isListening()) {\n        return;\n      }\n      if (event && event.preventDefault) {\n        event.preventDefault();\n      }\n\n      var inputArray = void 0;\n\n      if (event && typeof event.clipboardData !== 'undefined') {\n        this.textarea.setValue(event.clipboardData.getData('text/plain'));\n      } else if (typeof ClipboardEvent === 'undefined' && typeof window.clipboardData !== 'undefined') {\n        this.textarea.setValue(window.clipboardData.getData('Text'));\n      }\n\n      inputArray = _SheetClip2.default.parse(this.textarea.getValue());\n      this.textarea.setValue(' ');\n\n      if (inputArray.length === 0) {\n        return;\n      }\n\n      var allowPasting = !!this.hot.runHooks('beforePaste', inputArray, this.copyableRanges);\n\n      if (!allowPasting) {\n        return;\n      }\n\n      var selected = this.hot.getSelectedLast();\n      var coordsFrom = new _src.CellCoords(selected[0], selected[1]);\n      var coordsTo = new _src.CellCoords(selected[2], selected[3]);\n      var cellRange = new _src.CellRange(coordsFrom, coordsFrom, coordsTo);\n      var topLeftCorner = cellRange.getTopLeftCorner();\n      var bottomRightCorner = cellRange.getBottomRightCorner();\n      var areaStart = topLeftCorner;\n      var areaEnd = new _src.CellCoords(Math.max(bottomRightCorner.row, inputArray.length - 1 + topLeftCorner.row), Math.max(bottomRightCorner.col, inputArray[0].length - 1 + topLeftCorner.col));\n\n      var isSelRowAreaCoverInputValue = coordsTo.row - coordsFrom.row >= inputArray.length - 1;\n      var isSelColAreaCoverInputValue = coordsTo.col - coordsFrom.col >= inputArray[0].length - 1;\n\n      this.hot.addHookOnce('afterChange', function (changes) {\n        var changesLength = changes ? changes.length : 0;\n\n        if (changesLength) {\n          var offset = { row: 0, col: 0 };\n          var highestColumnIndex = -1;\n\n          (0, _array.arrayEach)(changes, function (change, index) {\n            var nextChange = changesLength > index + 1 ? changes[index + 1] : null;\n\n            if (nextChange) {\n              if (!isSelRowAreaCoverInputValue) {\n                offset.row += Math.max(nextChange[0] - change[0] - 1, 0);\n              }\n              if (!isSelColAreaCoverInputValue && change[1] > highestColumnIndex) {\n                highestColumnIndex = change[1];\n                offset.col += Math.max(nextChange[1] - change[1] - 1, 0);\n              }\n            }\n          });\n          _this6.hot.selectCell(areaStart.row, areaStart.col, areaEnd.row + offset.row, areaEnd.col + offset.col);\n        }\n      });\n\n      this.hot.populateFromArray(areaStart.row, areaStart.col, inputArray, areaEnd.row, areaEnd.col, 'CopyPaste.paste', this.pasteMode);\n      this.hot.runHooks('afterPaste', inputArray, this.copyableRanges);\n    }\n\n    /**\n     * Add copy, cut and paste options to the Context Menu.\n     *\n     * @private\n     * @param {Object} options Contains default added options of the Context Menu.\n     */\n\n  }, {\n    key: 'onAfterContextMenuDefaultOptions',\n    value: function onAfterContextMenuDefaultOptions(options) {\n      options.items.push({\n        name: '---------'\n      }, (0, _copy2.default)(this), (0, _cut2.default)(this));\n    }\n\n    /**\n     * We have to keep focus on textarea element, to make possible use of the browser tools (copy, cut, paste).\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterSelectionEnd',\n    value: function onAfterSelectionEnd() {\n      var priv = privatePool.get(this);\n      var editor = this.hot.getActiveEditor();\n\n      if (editor && typeof editor.isOpened !== 'undefined' && editor.isOpened()) {\n        return;\n      }\n      if (priv.isFragmentSelectionEnabled && !this.textarea.isActive() && (0, _element.getSelectionText)()) {\n        return;\n      }\n\n      this.setCopyableText();\n      this.textarea.select();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.textarea) {\n        this.textarea.destroy();\n      }\n\n      _get(CopyPaste.prototype.__proto__ || Object.getPrototypeOf(CopyPaste.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return CopyPaste;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('CopyPaste', CopyPaste);\n\nexports.default = CopyPaste;\n\n/***/ }),\n/* 437 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Textarea\n *\n * @plugin CopyPaste\n */\nvar Textarea = function () {\n  _createClass(Textarea, null, [{\n    key: 'getSingleton',\n    value: function getSingleton() {\n      globalSingleton.append();\n\n      return globalSingleton;\n    }\n  }]);\n\n  function Textarea() {\n    _classCallCheck(this, Textarea);\n\n    /**\n     * Main textarea element.\n     *\n     * @type {HTMLElement}\n     */\n    this.element = void 0;\n    /**\n     * Store information about append to the document.body.\n     *\n     * @type {Boolean}\n     */\n    this.isAppended = false;\n    /**\n     * Reference counter.\n     *\n     * @type {Number}\n     */\n    this.refCounter = 0;\n  }\n\n  /**\n   * Apends textarea element to the `body`\n   */\n\n\n  _createClass(Textarea, [{\n    key: 'append',\n    value: function append() {\n      if (this.hasBeenDestroyed()) {\n        this.create();\n      }\n\n      this.refCounter++;\n\n      if (!this.isAppended && document.body) {\n        if (document.body) {\n          this.isAppended = true;\n          document.body.appendChild(this.element);\n        }\n      }\n    }\n\n    /**\n     * Prepares textarea element with proper attributes.\n     */\n\n  }, {\n    key: 'create',\n    value: function create() {\n      this.element = document.createElement('textarea');\n      this.element.id = 'HandsontableCopyPaste';\n      this.element.className = 'copyPaste';\n      this.element.tabIndex = -1;\n      this.element.autocomplete = 'off';\n      this.element.wrap = 'hard';\n      this.element.value = ' ';\n    }\n\n    /**\n     * Deselects textarea element if is active.\n     */\n\n  }, {\n    key: 'deselect',\n    value: function deselect() {\n      if (this.element === document.activeElement) {\n        document.activeElement.blur();\n      }\n    }\n\n    /**\n     * Destroy instance\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.refCounter--;\n      this.refCounter = this.refCounter < 0 ? 0 : this.refCounter;\n\n      if (this.hasBeenDestroyed() && this.element && this.element.parentNode) {\n        this.element.parentNode.removeChild(this.element);\n        this.element = null;\n        this.isAppended = false;\n      }\n    }\n\n    /**\n     * Getter for the element.\n     *\n     * @returns {String}\n     */\n\n  }, {\n    key: 'getValue',\n    value: function getValue() {\n      return this.element.value;\n    }\n\n    /**\n     * Check if instance has been destroyed\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasBeenDestroyed',\n    value: function hasBeenDestroyed() {\n      return this.refCounter < 1;\n    }\n\n    /**\n     * Check if the element is an active element in frame.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isActive',\n    value: function isActive() {\n      return this.element === document.activeElement;\n    }\n\n    /**\n     * Sets focus on the element and select content.\n     */\n\n  }, {\n    key: 'select',\n    value: function select() {\n      this.element.focus();\n      this.element.select();\n    }\n\n    /**\n     * Setter for the element.\n     *\n     * @param {String} data Value which should be insert into the element.\n     */\n\n  }, {\n    key: 'setValue',\n    value: function setValue(data) {\n      this.element.value = data;\n    }\n  }]);\n\n  return Textarea;\n}();\n\nvar globalSingleton = new Textarea();\n\nexports.default = Textarea;\n\n/***/ }),\n/* 438 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = copyItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction copyItem(copyPastePlugin) {\n  return {\n    key: 'copy',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_COPY);\n    },\n    callback: function callback() {\n      copyPastePlugin.copy();\n    },\n    disabled: function disabled() {\n      var selected = this.getSelected();\n\n      if (!selected || selected.length > 1) {\n        return true;\n      }\n\n      return false;\n    },\n\n    hidden: false\n  };\n}\n\n/***/ }),\n/* 439 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = cutItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction cutItem(copyPastePlugin) {\n  return {\n    key: 'cut',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_CUT);\n    },\n    callback: function callback() {\n      copyPastePlugin.cut();\n    },\n    disabled: function disabled() {\n      var selected = this.getSelected();\n\n      if (!selected || selected.length > 1) {\n        return true;\n      }\n\n      return false;\n    },\n\n    hidden: false\n  };\n}\n\n/***/ }),\n/* 440 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _clipboardData = __webpack_require__(441);\n\nvar _clipboardData2 = _interopRequireDefault(_clipboardData);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar PasteEvent = function PasteEvent() {\n  _classCallCheck(this, PasteEvent);\n\n  this.clipboardData = new _clipboardData2.default();\n};\n\nexports.default = PasteEvent;\n\n/***/ }),\n/* 441 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ClipboardData = function () {\n  function ClipboardData() {\n    _classCallCheck(this, ClipboardData);\n\n    this.data = {};\n  }\n\n  _createClass(ClipboardData, [{\n    key: \"setData\",\n    value: function setData(type, value) {\n      this.data[type] = value;\n    }\n  }, {\n    key: \"getData\",\n    value: function getData(type) {\n      return this.data[type] || void 0;\n    }\n  }]);\n\n  return ClipboardData;\n}();\n\nexports.default = ClipboardData;\n\n/***/ }),\n/* 442 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 443 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _src = __webpack_require__(4);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _bottom = __webpack_require__(444);\n\nvar _bottom2 = _interopRequireDefault(_bottom);\n\nvar _left = __webpack_require__(445);\n\nvar _left2 = _interopRequireDefault(_left);\n\nvar _noBorders = __webpack_require__(446);\n\nvar _noBorders2 = _interopRequireDefault(_noBorders);\n\nvar _right = __webpack_require__(447);\n\nvar _right2 = _interopRequireDefault(_right);\n\nvar _top = __webpack_require__(448);\n\nvar _top2 = _interopRequireDefault(_top);\n\nvar _utils = __webpack_require__(48);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @plugin CustomBorders\n *\n * @description\n * This plugin enables an option to apply custom borders through the context menu (configurable with context menu key `borders`).\n *\n * To initialize Handsontable with predefined custom borders, provide cell coordinates and border styles in a form of an array.\n *\n * See [Custom Borders](http://docs.handsontable.com/demo-custom-borders.html) demo for more examples.\n *\n * @example\n * ```js\n * ...\n * customBorders: [\n *   {\n *    range: {\n *      from: {\n *        row: 1,\n *        col: 1\n *      },\n *      to: {\n *        row: 3,\n *        col: 4\n *      },\n *    },\n *    left: {},\n *    right: {},\n *    top: {},\n *    bottom: {},\n *   },\n * ],\n * ...\n *\n * // or\n * ...\n * customBorders: [\n *   { row: 2,\n *     col: 2,\n *     left: {\n *       width: 2,\n *       color: 'red',\n *     },\n *     right: {\n *       width: 1,\n *       color: 'green',\n *     },\n *     top: '',\n *     bottom: '',\n *   }.\n * ],\n * ...\n * ```\n * @private\n * @class CustomBorders\n */\nvar CustomBorders = function (_BasePlugin) {\n  _inherits(CustomBorders, _BasePlugin);\n\n  function CustomBorders(hotInstance) {\n    _classCallCheck(this, CustomBorders);\n\n    /**\n     * Saved borders settings.\n     *\n     * @type {Array}\n     */\n    var _this = _possibleConstructorReturn(this, (CustomBorders.__proto__ || Object.getPrototypeOf(CustomBorders)).call(this, hotInstance));\n\n    _this.savedBorderSettings = void 0;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(CustomBorders, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().customBorders;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('afterContextMenuDefaultOptions', function (options) {\n        return _this2.onAfterContextMenuDefaultOptions(options);\n      });\n      this.addHook('afterInit', function () {\n        return _this2.onAfterInit();\n      });\n\n      _get(CustomBorders.prototype.__proto__ || Object.getPrototypeOf(CustomBorders.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.clearBorders();\n\n      _get(CustomBorders.prototype.__proto__ || Object.getPrototypeOf(CustomBorders.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      this.changeBorderSettings();\n\n      _get(CustomBorders.prototype.__proto__ || Object.getPrototypeOf(CustomBorders.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Get index of border from the settings.\n     *\n     * @param {String} className Class name as string.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getSettingIndex',\n    value: function getSettingIndex(className) {\n      var index = -1;\n\n      (0, _array.arrayEach)(this.hot.selection.highlight.borders, function (selection, i) {\n        if (selection.settings.className === className) {\n          index = i;\n\n          return false;\n        }\n      });\n\n      return index;\n    }\n\n    /**\n     * Insert WalkontableSelection instance into Walkontable settings.\n     *\n     * @param {Object} border Object with `row` and `col`, `left`, `right`, `top` and `bottom`, `className` and `border` ({Object} with `color`, `width` and `cornerVisible` property) properties.\n     */\n\n  }, {\n    key: 'insertBorderIntoSettings',\n    value: function insertBorderIntoSettings(border) {\n      var coordinates = {\n        row: border.row,\n        col: border.col\n      };\n      var selection = new _src.Selection(border, new _src.CellRange(coordinates, coordinates, coordinates));\n      var index = this.getSettingIndex(border.className);\n\n      if (index >= 0) {\n        this.hot.selection.highlight.borders[index] = selection;\n      } else {\n        this.hot.selection.highlight.borders.push(selection);\n      }\n    }\n\n    /**\n     * Prepare borders from setting (single cell).\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {Object} borderObj Object with `row` and `col`, `left`, `right`, `top` and `bottom` properties.\n     */\n\n  }, {\n    key: 'prepareBorderFromCustomAdded',\n    value: function prepareBorderFromCustomAdded(row, col, borderObj) {\n      var border = (0, _utils.createEmptyBorders)(row, col);\n\n      border = (0, _utils.extendDefaultBorder)(border, borderObj);\n      this.hot.setCellMeta(row, col, 'borders', border);\n\n      this.insertBorderIntoSettings(border);\n    }\n\n    /** *\n     * Prepare borders from setting (object).\n     *\n     * @param {Object} rowObj Object with `range`, `left`, `right`, `top` and `bottom` properties.\n     */\n\n  }, {\n    key: 'prepareBorderFromCustomAddedRange',\n    value: function prepareBorderFromCustomAddedRange(rowObj) {\n      var _this3 = this;\n\n      var range = rowObj.range;\n\n      (0, _number.rangeEach)(range.from.row, range.to.row, function (rowIndex) {\n        (0, _number.rangeEach)(range.from.col, range.to.col, function (colIndex) {\n          var border = (0, _utils.createEmptyBorders)(rowIndex, colIndex);\n          var add = 0;\n\n          if (rowIndex === range.from.row) {\n            add += 1;\n\n            if ((0, _object.hasOwnProperty)(rowObj, 'top')) {\n              border.top = rowObj.top;\n            }\n          }\n\n          if (rowIndex === range.to.row) {\n            add += 1;\n\n            if ((0, _object.hasOwnProperty)(rowObj, 'bottom')) {\n              border.bottom = rowObj.bottom;\n            }\n          }\n\n          if (colIndex === range.from.col) {\n            add += 1;\n\n            if ((0, _object.hasOwnProperty)(rowObj, 'left')) {\n              border.left = rowObj.left;\n            }\n          }\n\n          if (colIndex === range.to.col) {\n            add += 1;\n\n            if ((0, _object.hasOwnProperty)(rowObj, 'right')) {\n              border.right = rowObj.right;\n            }\n          }\n\n          if (add > 0) {\n            _this3.hot.setCellMeta(rowIndex, colIndex, 'borders', border);\n            _this3.insertBorderIntoSettings(border);\n          }\n        });\n      });\n    }\n\n    /**\n     * Remove borders divs from DOM.\n     *\n     * @param {String} borderClassName Border class name as string.\n     */\n\n  }, {\n    key: 'removeBordersFromDom',\n    value: function removeBordersFromDom(borderClassName) {\n      var borders = this.hot.rootElement.querySelectorAll('.' + borderClassName + ':not(td)');\n\n      (0, _number.rangeEach)(0, borders.length - 1, function (index) {\n        var parent = borders[index].parentNode;\n\n        if (parent.parentNode) {\n          parent.parentNode.removeChild(parent);\n        }\n      });\n    }\n\n    /**\n     * Remove border (triggered from context menu).\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     */\n\n  }, {\n    key: 'removeAllBorders',\n    value: function removeAllBorders(row, col) {\n      var borderClassName = (0, _utils.createClassName)(row, col);\n\n      this.removeBordersFromDom(borderClassName);\n      this.hot.removeCellMeta(row, col, 'borders');\n    }\n\n    /**\n     * Set borders for each cell re. to border position.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {String} place Coordinate where add/remove border - `top`, `bottom`, `left`, `right` and `noBorders`.\n     * @param {Boolean} remove True when remove borders, and false when add borders.\n     */\n\n  }, {\n    key: 'setBorder',\n    value: function setBorder(row, col, place, remove) {\n      var bordersMeta = this.hot.getCellMeta(row, col).borders;\n\n      if (!bordersMeta || bordersMeta.border === void 0) {\n        bordersMeta = (0, _utils.createEmptyBorders)(row, col);\n      }\n\n      if (remove) {\n        bordersMeta[place] = (0, _utils.createSingleEmptyBorder)();\n      } else {\n        bordersMeta[place] = (0, _utils.createDefaultCustomBorder)();\n      }\n\n      this.hot.setCellMeta(row, col, 'borders', bordersMeta);\n\n      var borderClassName = (0, _utils.createClassName)(row, col);\n      this.removeBordersFromDom(borderClassName);\n      this.insertBorderIntoSettings(bordersMeta);\n\n      this.hot.render();\n    }\n\n    /**\n     * Prepare borders based on cell and border position.\n     *\n     * @param {Object} selected\n     * @param {String} place Coordinate where add/remove border - `top`, `bottom`, `left`, `right` and `noBorders`.\n     * @param {Boolean} remove True when remove borders, and false when add borders.\n     */\n\n  }, {\n    key: 'prepareBorder',\n    value: function prepareBorder(selected, place, remove) {\n      var _this4 = this;\n\n      (0, _array.arrayEach)(selected, function (_ref) {\n        var start = _ref.start,\n            end = _ref.end;\n\n        if (start.row === end.row && start.col === end.col) {\n          if (place === 'noBorders') {\n            _this4.removeAllBorders(start.row, start.col);\n          } else {\n            _this4.setBorder(start.row, start.col, place, remove);\n          }\n        } else {\n          switch (place) {\n            case 'noBorders':\n              (0, _number.rangeEach)(start.col, end.col, function (colIndex) {\n                (0, _number.rangeEach)(start.row, end.row, function (rowIndex) {\n                  _this4.removeAllBorders(rowIndex, colIndex);\n                });\n              });\n              break;\n\n            case 'top':\n              (0, _number.rangeEach)(start.col, end.col, function (topCol) {\n                _this4.setBorder(start.row, topCol, place, remove);\n              });\n              break;\n\n            case 'right':\n              (0, _number.rangeEach)(start.row, end.row, function (rowRight) {\n                _this4.setBorder(rowRight, end.col, place, remove);\n              });\n              break;\n\n            case 'bottom':\n              (0, _number.rangeEach)(start.col, end.col, function (bottomCol) {\n                _this4.setBorder(end.row, bottomCol, place, remove);\n              });\n              break;\n\n            case 'left':\n              (0, _number.rangeEach)(start.row, end.row, function (rowLeft) {\n                _this4.setBorder(rowLeft, start.col, place, remove);\n              });\n              break;\n            default:\n              break;\n          }\n        }\n      });\n    }\n\n    /**\n     * Create borders from settings.\n     *\n     * @private\n     * @param {Array} customBorders Object with `row` and `col`, `left`, `right`, `top` and `bottom` properties.\n     */\n\n  }, {\n    key: 'createCustomBorders',\n    value: function createCustomBorders(customBorders) {\n      var _this5 = this;\n\n      (0, _number.rangeEach)(0, customBorders.length - 1, function (index) {\n        if (customBorders[index].range) {\n          _this5.prepareBorderFromCustomAddedRange(customBorders[index]);\n        } else {\n          _this5.prepareBorderFromCustomAdded(customBorders[index].row, customBorders[index].col, customBorders[index]);\n        }\n      });\n\n      this.hot.render();\n      this.hot.view.wt.draw(true);\n    }\n\n    /**\n     * Add border options to context menu.\n     *\n     * @private\n     * @param {Object} defaultOptions Context menu items.\n     */\n\n  }, {\n    key: 'onAfterContextMenuDefaultOptions',\n    value: function onAfterContextMenuDefaultOptions(defaultOptions) {\n      if (!this.hot.getSettings().customBorders) {\n        return;\n      }\n\n      defaultOptions.items.push({\n        name: '---------'\n      }, {\n        key: 'borders',\n        name: function name() {\n          return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS);\n        },\n        disabled: function disabled() {\n          return this.selection.isSelectedByCorner();\n        },\n\n        submenu: {\n          items: [(0, _top2.default)(this), (0, _right2.default)(this), (0, _bottom2.default)(this), (0, _left2.default)(this), (0, _noBorders2.default)(this)]\n        }\n      });\n    }\n\n    /**\n      * Clear borders.\n      *\n      * @private\n      */\n\n  }, {\n    key: 'clearBorders',\n    value: function clearBorders() {\n      var _this6 = this;\n\n      var bordersFromTable = this.hot.rootElement.querySelectorAll('td[class^=\"border\"]');\n\n      (0, _number.rangeEach)(0, bordersFromTable.length - 1, function (index) {\n        _this6.removeBordersFromDom(bordersFromTable[index].className);\n      });\n    }\n\n    /**\n     * Change borders from settings.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'changeBorderSettings',\n    value: function changeBorderSettings() {\n      var customBorders = this.hot.getSettings().customBorders;\n\n      if (customBorders) {\n        if (Array.isArray(customBorders)) {\n          this.savedBorderSettings = customBorders;\n          this.createCustomBorders(customBorders);\n        } else if (customBorders !== void 0) {\n          var borders = this.savedBorderSettings ? this.savedBorderSettings : customBorders;\n\n          this.createCustomBorders(borders);\n        }\n      }\n    }\n\n    /**\n     * `afterInit` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      this.changeBorderSettings();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(CustomBorders.prototype.__proto__ || Object.getPrototypeOf(CustomBorders.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return CustomBorders;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('customBorders', CustomBorders);\n\nexports.default = CustomBorders;\n\n/***/ }),\n/* 444 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = bottom;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(48);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction bottom(customBordersPlugin) {\n  return {\n    key: 'borders:bottom',\n    name: function name() {\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM);\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'bottom');\n      if (hasBorder) {\n        label = (0, _utils.markSelected)(label);\n      }\n      return label;\n    },\n    callback: function callback(key, selected) {\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'bottom');\n      customBordersPlugin.prepareBorder(selected, 'bottom', hasBorder);\n    }\n  };\n}\n\n/***/ }),\n/* 445 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = left;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(48);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction left(customBordersPlugin) {\n  return {\n    key: 'borders:left',\n    name: function name() {\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_LEFT);\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'left');\n      if (hasBorder) {\n        label = (0, _utils.markSelected)(label);\n      }\n\n      return label;\n    },\n    callback: function callback(key, selected) {\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'left');\n      customBordersPlugin.prepareBorder(selected, 'left', hasBorder);\n    }\n  };\n}\n\n/***/ }),\n/* 446 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = noBorders;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(48);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction noBorders(customBordersPlugin) {\n  return {\n    key: 'borders:no_borders',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_BORDERS);\n    },\n    callback: function callback(key, selected) {\n      customBordersPlugin.prepareBorder(selected, 'noBorders');\n    },\n    disabled: function disabled() {\n      return !(0, _utils.checkSelectionBorders)(this);\n    }\n  };\n}\n\n/***/ }),\n/* 447 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = right;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(48);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction right(customBordersPlugin) {\n  return {\n    key: 'borders:right',\n    name: function name() {\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_RIGHT);\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'right');\n      if (hasBorder) {\n        label = (0, _utils.markSelected)(label);\n      }\n      return label;\n    },\n    callback: function callback(key, selected) {\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'right');\n      customBordersPlugin.prepareBorder(selected, 'right', hasBorder);\n    }\n  };\n}\n\n/***/ }),\n/* 448 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = top;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(48);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction top(customBordersPlugin) {\n  return {\n    key: 'borders:top',\n    name: function name() {\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_TOP);\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'top');\n      if (hasBorder) {\n        label = (0, _utils.markSelected)(label);\n      }\n\n      return label;\n    },\n    callback: function callback(key, selected) {\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'top');\n      customBordersPlugin.prepareBorder(selected, 'top', hasBorder);\n    }\n  };\n}\n\n/***/ }),\n/* 449 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @description\n * Plugin used to scroll Handsontable by selecting a cell and dragging outside of the visible viewport.\n *\n *\n * @class DragToScroll\n * @plugin DragToScroll\n */\nvar DragToScroll = function (_BasePlugin) {\n  _inherits(DragToScroll, _BasePlugin);\n\n  function DragToScroll(hotInstance) {\n    _classCallCheck(this, DragToScroll);\n\n    /**\n     * Instance of {@link EventManager}.\n     *\n     * @type {EventManager}\n     */\n    var _this = _possibleConstructorReturn(this, (DragToScroll.__proto__ || Object.getPrototypeOf(DragToScroll)).call(this, hotInstance));\n\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * DOMRect - size of an element and its position relative to the viewport,\n     * e.g. {bottom: 449, height: 441, left: 8, right: 814, top: 8, width: 806, x: 8, y:8}.\n     *\n     * @type {Object}\n     */\n    _this.boundaries = null;\n    /**\n     * Callback function.\n     *\n     * @type {Function}\n     */\n    _this.callback = null;\n    /**\n     * Flag indicates mouseDown/mouseUp.\n     *\n     * @type {Boolean}\n     */\n    _this.listening = false;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(DragToScroll, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().dragToScroll;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('afterOnCellMouseDown', function () {\n        return _this2.setupListening();\n      });\n      this.addHook('afterOnCellCornerMouseDown', function () {\n        return _this2.setupListening();\n      });\n\n      this.registerEvents();\n\n      _get(DragToScroll.prototype.__proto__ || Object.getPrototypeOf(DragToScroll.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(DragToScroll.prototype.__proto__ || Object.getPrototypeOf(DragToScroll.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.unregisterEvents();\n\n      _get(DragToScroll.prototype.__proto__ || Object.getPrototypeOf(DragToScroll.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Sets the value of the visible element.\n     *\n     * @param boundaries {Object} compatible with getBoundingClientRect\n     */\n\n  }, {\n    key: 'setBoundaries',\n    value: function setBoundaries(boundaries) {\n      this.boundaries = boundaries;\n    }\n\n    /**\n     * Change callback function.\n     *\n     * @param callback {Function}\n     */\n\n  }, {\n    key: 'setCallback',\n    value: function setCallback(callback) {\n      this.callback = callback;\n    }\n\n    /**\n     * Check if mouse position (x, y) is outside of the viewport.\n     *\n     * @param {Number} x\n     * @param {Number} y\n     */\n\n  }, {\n    key: 'check',\n    value: function check(x, y) {\n      var diffX = 0;\n      var diffY = 0;\n\n      if (y < this.boundaries.top) {\n        // y is less than top\n        diffY = y - this.boundaries.top;\n      } else if (y > this.boundaries.bottom) {\n        // y is more than bottom\n        diffY = y - this.boundaries.bottom;\n      }\n\n      if (x < this.boundaries.left) {\n        // x is less than left\n        diffX = x - this.boundaries.left;\n      } else if (x > this.boundaries.right) {\n        // x is more than right\n        diffX = x - this.boundaries.right;\n      }\n\n      this.callback(diffX, diffY);\n    }\n\n    /**\n     * Register dom listeners.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this3 = this;\n\n      this.eventManager.addEventListener(document, 'mouseup', function () {\n        return _this3.onMouseUp();\n      });\n      this.eventManager.addEventListener(document, 'mousemove', function (event) {\n        return _this3.onMouseMove(event);\n      });\n    }\n\n    /**\n     * Unbind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'unregisterEvents',\n    value: function unregisterEvents() {\n      this.eventManager.clear();\n    }\n\n    /**\n     * On after on cell/cellCorner mouse down listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'setupListening',\n    value: function setupListening() {\n      var scrollHandler = this.hot.view.wt.wtTable.holder; // native scroll\n\n      if (scrollHandler === window) {\n        // not much we can do currently\n        return;\n      }\n\n      this.setBoundaries(scrollHandler.getBoundingClientRect());\n      this.setCallback(function (scrollX, scrollY) {\n        if (scrollX < 0) {\n          scrollHandler.scrollLeft -= 50;\n        } else if (scrollX > 0) {\n          scrollHandler.scrollLeft += 50;\n        }\n\n        if (scrollY < 0) {\n          scrollHandler.scrollTop -= 20;\n        } else if (scrollY > 0) {\n          scrollHandler.scrollTop += 20;\n        }\n      });\n\n      this.listening = true;\n    }\n\n    /**\n     * 'mouseMove' event callback.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      if (this.listening) {\n        this.check(event.clientX, event.clientY);\n      }\n    }\n\n    /**\n     * `onMouseUp` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      this.listening = false;\n    }\n\n    /**\n     * Destroy instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(DragToScroll.prototype.__proto__ || Object.getPrototypeOf(DragToScroll.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return DragToScroll;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('dragToScroll', DragToScroll);\n\nexports.default = DragToScroll;\n\n/***/ }),\n/* 450 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _array = __webpack_require__(1);\n\nvar _freezeColumn = __webpack_require__(451);\n\nvar _freezeColumn2 = _interopRequireDefault(_freezeColumn);\n\nvar _unfreezeColumn = __webpack_require__(452);\n\nvar _unfreezeColumn2 = _interopRequireDefault(_unfreezeColumn);\n\n__webpack_require__(453);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar privatePool = new WeakMap();\n/**\n * This plugin allows to manually \"freeze\" and \"unfreeze\" a column using an entry in the Context Menu.\n * You can turn it on by setting a `manualColumnFreeze` property to `true`.\n *\n * @plugin ManualColumnFreeze\n * @dependencies ManualColumnMove\n */\n\nvar ManualColumnFreeze = function (_BasePlugin) {\n  _inherits(ManualColumnFreeze, _BasePlugin);\n\n  function ManualColumnFreeze(hotInstance) {\n    _classCallCheck(this, ManualColumnFreeze);\n\n    var _this = _possibleConstructorReturn(this, (ManualColumnFreeze.__proto__ || Object.getPrototypeOf(ManualColumnFreeze)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      moveByFreeze: false,\n      afterFirstUse: false\n    });\n    /**\n     * Original column positions\n     *\n     * @type {Array}\n     */\n    _this.frozenColumnsBasePositions = [];\n    /**\n     * Reference to the `ManualColumnMove` plugin.\n     */\n    _this.manualColumnMovePlugin = void 0;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualColumnFreeze, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().manualColumnFreeze;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('afterContextMenuDefaultOptions', function (options) {\n        return _this2.addContextMenuEntry(options);\n      });\n      this.addHook('afterInit', function () {\n        return _this2.onAfterInit();\n      });\n      this.addHook('beforeColumnMove', function (rows, target) {\n        return _this2.onBeforeColumnMove(rows, target);\n      });\n\n      _get(ManualColumnFreeze.prototype.__proto__ || Object.getPrototypeOf(ManualColumnFreeze.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      var priv = privatePool.get(this);\n\n      priv.afterFirstUse = false;\n      priv.moveByFreeze = false;\n\n      _get(ManualColumnFreeze.prototype.__proto__ || Object.getPrototypeOf(ManualColumnFreeze.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(ManualColumnFreeze.prototype.__proto__ || Object.getPrototypeOf(ManualColumnFreeze.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Freeze the given column (add it to fixed columns).\n     *\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'freezeColumn',\n    value: function freezeColumn(column) {\n      var priv = privatePool.get(this);\n      var settings = this.hot.getSettings();\n\n      if (!priv.afterFirstUse) {\n        priv.afterFirstUse = true;\n      }\n\n      if (settings.fixedColumnsLeft === this.hot.countCols() || column <= settings.fixedColumnsLeft - 1) {\n        return; // already fixed\n      }\n\n      priv.moveByFreeze = true;\n\n      if (column !== this.getMovePlugin().columnsMapper.getValueByIndex(column)) {\n        this.frozenColumnsBasePositions[settings.fixedColumnsLeft] = column;\n      }\n\n      this.getMovePlugin().moveColumn(column, settings.fixedColumnsLeft++);\n    }\n\n    /**\n     * Unfreeze the given column (remove it from fixed columns and bring to it's previous position).\n     *\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'unfreezeColumn',\n    value: function unfreezeColumn(column) {\n      var priv = privatePool.get(this);\n      var settings = this.hot.getSettings();\n\n      if (!priv.afterFirstUse) {\n        priv.afterFirstUse = true;\n      }\n\n      if (settings.fixedColumnsLeft <= 0 || column > settings.fixedColumnsLeft - 1) {\n        return; // not fixed\n      }\n\n      var returnCol = this.getBestColumnReturnPosition(column);\n\n      priv.moveByFreeze = true;\n      settings.fixedColumnsLeft--;\n\n      this.getMovePlugin().moveColumn(column, returnCol + 1);\n    }\n\n    /**\n     * Get the reference to the ManualColumnMove plugin.\n     *\n     * @private\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'getMovePlugin',\n    value: function getMovePlugin() {\n      if (!this.manualColumnMovePlugin) {\n        this.manualColumnMovePlugin = this.hot.getPlugin('manualColumnMove');\n      }\n\n      return this.manualColumnMovePlugin;\n    }\n\n    /**\n     * Estimates the most fitting return position for unfrozen column.\n     *\n     * @private\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'getBestColumnReturnPosition',\n    value: function getBestColumnReturnPosition(column) {\n      var movePlugin = this.getMovePlugin();\n      var settings = this.hot.getSettings();\n      var i = settings.fixedColumnsLeft;\n      var j = movePlugin.columnsMapper.getValueByIndex(i);\n      var initialCol = void 0;\n\n      if (this.frozenColumnsBasePositions[column] === null || this.frozenColumnsBasePositions[column] === void 0) {\n        initialCol = movePlugin.columnsMapper.getValueByIndex(column);\n\n        while (j !== null && j <= initialCol) {\n          i++;\n          j = movePlugin.columnsMapper.getValueByIndex(i);\n        }\n      } else {\n        initialCol = this.frozenColumnsBasePositions[column];\n        this.frozenColumnsBasePositions[column] = void 0;\n\n        while (j !== null && j <= initialCol) {\n          i++;\n          j = movePlugin.columnsMapper.getValueByIndex(i);\n        }\n        i = j;\n      }\n\n      return i - 1;\n    }\n    /**\n     * Add the manualColumnFreeze context menu entries.\n     *\n     * @private\n     * @param {Object} options Context menu options.\n     */\n\n  }, {\n    key: 'addContextMenuEntry',\n    value: function addContextMenuEntry(options) {\n      options.items.push({ name: '---------' }, (0, _freezeColumn2.default)(this), (0, _unfreezeColumn2.default)(this));\n    }\n\n    /**\n     * Enabling `manualColumnMove` plugin on `afterInit` hook.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      if (!this.getMovePlugin().isEnabled()) {\n        this.getMovePlugin().enablePlugin();\n      }\n    }\n\n    /**\n     * Prevent moving the rows from/to fixed area.\n     *\n     * @private\n     * @param {Array} rows\n     * @param {Number} target\n     */\n\n  }, {\n    key: 'onBeforeColumnMove',\n    value: function onBeforeColumnMove(rows, target) {\n      var priv = privatePool.get(this);\n\n      if (priv.afterFirstUse && !priv.moveByFreeze) {\n        var frozenLen = this.hot.getSettings().fixedColumnsLeft;\n        var disallowMoving = target < frozenLen;\n\n        if (!disallowMoving) {\n          (0, _array.arrayEach)(rows, function (value, index, array) {\n            if (value < frozenLen) {\n              disallowMoving = true;\n              return false;\n            }\n          });\n        }\n\n        if (disallowMoving) {\n          return false;\n        }\n      }\n\n      if (priv.moveByFreeze) {\n        priv.moveByFreeze = false;\n      }\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(ManualColumnFreeze.prototype.__proto__ || Object.getPrototypeOf(ManualColumnFreeze.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return ManualColumnFreeze;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('manualColumnFreeze', ManualColumnFreeze);\n\nexports.default = ManualColumnFreeze;\n\n/***/ }),\n/* 451 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = freezeColumnItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction freezeColumnItem(manualColumnFreezePlugin) {\n  return {\n    key: 'freeze_column',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_FREEZE_COLUMN);\n    },\n    callback: function callback(key, selected) {\n      var _selected = _slicedToArray(selected, 1),\n          selectedColumn = _selected[0].start.col;\n\n      manualColumnFreezePlugin.freezeColumn(selectedColumn);\n\n      this.render();\n      this.view.wt.wtOverlays.adjustElementsSize(true);\n    },\n    hidden: function hidden() {\n      var selection = this.getSelectedRange();\n      var hide = false;\n\n      if (selection === void 0) {\n        hide = true;\n      } else if (selection.length > 1) {\n        hide = true;\n      } else if (selection[0].from.col !== selection[0].to.col || selection[0].from.col <= this.getSettings().fixedColumnsLeft - 1) {\n        hide = true;\n      }\n\n      return hide;\n    }\n  };\n}\n\n/***/ }),\n/* 452 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = unfreezeColumnItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction unfreezeColumnItem(manualColumnFreezePlugin) {\n  return {\n    key: 'unfreeze_column',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN);\n    },\n    callback: function callback(key, selected) {\n      var _selected = _slicedToArray(selected, 1),\n          selectedColumn = _selected[0].start.col;\n\n      manualColumnFreezePlugin.unfreezeColumn(selectedColumn);\n\n      this.render();\n      this.view.wt.wtOverlays.adjustElementsSize(true);\n    },\n    hidden: function hidden() {\n      var selection = this.getSelectedRange();\n      var hide = false;\n\n      if (selection === void 0) {\n        hide = true;\n      } else if (selection.length > 1) {\n        hide = true;\n      } else if (selection[0].from.col !== selection[0].to.col || selection[0].from.col >= this.getSettings().fixedColumnsLeft) {\n        hide = true;\n      }\n\n      return hide;\n    }\n  };\n}\n\n/***/ }),\n/* 453 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 454 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _element = __webpack_require__(0);\n\nvar _number = __webpack_require__(5);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nvar _columnsMapper = __webpack_require__(455);\n\nvar _columnsMapper2 = _interopRequireDefault(_columnsMapper);\n\nvar _backlight = __webpack_require__(456);\n\nvar _backlight2 = _interopRequireDefault(_backlight);\n\nvar _guideline = __webpack_require__(457);\n\nvar _guideline2 = _interopRequireDefault(_guideline);\n\nvar _src = __webpack_require__(4);\n\n__webpack_require__(458);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('beforeColumnMove');\n_pluginHooks2.default.getSingleton().register('afterColumnMove');\n_pluginHooks2.default.getSingleton().register('unmodifyCol');\n\nvar privatePool = new WeakMap();\nvar CSS_PLUGIN = 'ht__manualColumnMove';\nvar CSS_SHOW_UI = 'show-ui';\nvar CSS_ON_MOVING = 'on-moving--columns';\nvar CSS_AFTER_SELECTION = 'after-selection--columns';\n\n/**\n * @plugin ManualColumnMove\n *\n * @description\n * This plugin allows to change columns order.\n *\n * API:\n * - moveColumn - move single column to the new position.\n * - moveColumns - move many columns (as an array of indexes) to the new position.\n *\n * If you want apply visual changes, you have to call manually the render() method on the instance of Handsontable.\n *\n * UI components:\n * - backlight - highlight of selected columns.\n * - guideline - line which shows where rows has been moved.\n *\n * @class ManualColumnMove\n * @plugin ManualColumnMove\n */\n\nvar ManualColumnMove = function (_BasePlugin) {\n  _inherits(ManualColumnMove, _BasePlugin);\n\n  function ManualColumnMove(hotInstance) {\n    _classCallCheck(this, ManualColumnMove);\n\n    /**\n     * Set up WeakMap of plugin to sharing private parameters;\n     */\n    var _this = _possibleConstructorReturn(this, (ManualColumnMove.__proto__ || Object.getPrototypeOf(ManualColumnMove)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      columnsToMove: [],\n      countCols: 0,\n      fixedColumns: 0,\n      pressed: void 0,\n      disallowMoving: void 0,\n      target: {\n        eventPageX: void 0,\n        coords: void 0,\n        TD: void 0,\n        col: void 0\n      }\n    });\n\n    /**\n     * List of last removed row indexes.\n     *\n     * @type {Array}\n     */\n    _this.removedColumns = [];\n    /**\n     * Object containing visual row indexes mapped to data source indexes.\n     *\n     * @type {RowsMapper}\n     */\n    _this.columnsMapper = new _columnsMapper2.default(_this);\n    /**\n     * Event Manager object.\n     *\n     * @type {Object}\n     */\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Backlight UI object.\n     *\n     * @type {Object}\n     */\n    _this.backlight = new _backlight2.default(hotInstance);\n    /**\n     * Guideline UI object.\n     *\n     * @type {Object}\n     */\n    _this.guideline = new _guideline2.default(hotInstance);\n    return _this;\n  }\n\n  /**\n   * Check if plugin is enabled.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualColumnMove, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().manualColumnMove;\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('beforeOnCellMouseDown', function (event, coords, TD, blockCalculations) {\n        return _this2.onBeforeOnCellMouseDown(event, coords, TD, blockCalculations);\n      });\n      this.addHook('beforeOnCellMouseOver', function (event, coords, TD, blockCalculations) {\n        return _this2.onBeforeOnCellMouseOver(event, coords, TD, blockCalculations);\n      });\n      this.addHook('afterScrollVertically', function () {\n        return _this2.onAfterScrollVertically();\n      });\n      this.addHook('modifyCol', function (row, source) {\n        return _this2.onModifyCol(row, source);\n      });\n      this.addHook('beforeRemoveCol', function (index, amount) {\n        return _this2.onBeforeRemoveCol(index, amount);\n      });\n      this.addHook('afterRemoveCol', function () {\n        return _this2.onAfterRemoveCol();\n      });\n      this.addHook('afterCreateCol', function (index, amount) {\n        return _this2.onAfterCreateCol(index, amount);\n      });\n      this.addHook('afterLoadData', function () {\n        return _this2.onAfterLoadData();\n      });\n      this.addHook('unmodifyCol', function (column) {\n        return _this2.onUnmodifyCol(column);\n      });\n\n      this.registerEvents();\n\n      // TODO: move adding plugin classname to BasePlugin.\n      (0, _element.addClass)(this.hot.rootElement, CSS_PLUGIN);\n\n      _get(ManualColumnMove.prototype.__proto__ || Object.getPrototypeOf(ManualColumnMove.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      this.onAfterPluginsInitialized();\n\n      _get(ManualColumnMove.prototype.__proto__ || Object.getPrototypeOf(ManualColumnMove.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      var pluginSettings = this.hot.getSettings().manualColumnMove;\n\n      if (Array.isArray(pluginSettings)) {\n        this.columnsMapper.clearMap();\n      }\n\n      (0, _element.removeClass)(this.hot.rootElement, CSS_PLUGIN);\n\n      this.unregisterEvents();\n      this.backlight.destroy();\n      this.guideline.destroy();\n\n      _get(ManualColumnMove.prototype.__proto__ || Object.getPrototypeOf(ManualColumnMove.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Move a single column.\n     *\n     * @param {Number} column Visual column index to be moved.\n     * @param {Number} target Visual column index being a target for the moved column.\n     */\n\n  }, {\n    key: 'moveColumn',\n    value: function moveColumn(column, target) {\n      this.moveColumns([column], target);\n    }\n\n    /**\n     * Move multiple columns.\n     *\n     * @param {Array} columns Array of visual column indexes to be moved.\n     * @param {Number} target Visual column index being a target for the moved columns.\n     */\n\n  }, {\n    key: 'moveColumns',\n    value: function moveColumns(columns, target) {\n      var _this3 = this;\n\n      var visualColumns = [].concat(_toConsumableArray(columns));\n      var priv = privatePool.get(this);\n      var beforeColumnHook = this.hot.runHooks('beforeColumnMove', visualColumns, target);\n\n      priv.disallowMoving = !beforeColumnHook;\n\n      if (beforeColumnHook !== false) {\n        // first we need to rewrite an visual indexes to physical for save reference after move\n        (0, _array.arrayEach)(columns, function (column, index, array) {\n          array[index] = _this3.columnsMapper.getValueByIndex(column);\n        });\n\n        // next, when we have got an physical indexes, we can move columns\n        (0, _array.arrayEach)(columns, function (column, index) {\n          var actualPosition = _this3.columnsMapper.getIndexByValue(column);\n\n          if (actualPosition !== target) {\n            _this3.columnsMapper.moveColumn(actualPosition, target + index);\n          }\n        });\n\n        // after moving we have to clear columnsMapper from null entries\n        this.columnsMapper.clearNull();\n      }\n\n      this.hot.runHooks('afterColumnMove', visualColumns, target);\n    }\n\n    /**\n     * Correct the cell selection after the move action. Fired only when action was made with a mouse.\n     * That means that changing the column order using the API won't correct the selection.\n     *\n     * @private\n     * @param {Number} startColumn Visual column index for the start of the selection.\n     * @param {Number} endColumn Visual column index for the end of the selection.\n     */\n\n  }, {\n    key: 'changeSelection',\n    value: function changeSelection(startColumn, endColumn) {\n      this.hot.selectColumns(startColumn, endColumn);\n    }\n\n    /**\n     * Get the sum of the widths of columns in the provided range.\n     *\n     * @private\n     * @param {Number} from Visual column index.\n     * @param {Number} to Visual column index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getColumnsWidth',\n    value: function getColumnsWidth(from, to) {\n      var width = 0;\n\n      for (var i = from; i < to; i++) {\n        var columnWidth = 0;\n\n        if (i < 0) {\n          columnWidth = this.hot.view.wt.wtViewport.getRowHeaderWidth() || 0;\n        } else {\n          columnWidth = this.hot.view.wt.wtTable.getStretchedColumnWidth(i) || 0;\n        }\n\n        width += columnWidth;\n      }\n\n      return width;\n    }\n\n    /**\n     * Load initial settings when persistent state is saved or when plugin was initialized as an array.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'initialSettings',\n    value: function initialSettings() {\n      var pluginSettings = this.hot.getSettings().manualColumnMove;\n\n      if (Array.isArray(pluginSettings)) {\n        this.moveColumns(pluginSettings, 0);\n      } else if (pluginSettings !== void 0) {\n        this.persistentStateLoad();\n      }\n    }\n\n    /**\n     * Check if the provided column is in the fixedColumnsLeft section.\n     *\n     * @private\n     * @param {Number} column Visual column index to check.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isFixedColumnsLeft',\n    value: function isFixedColumnsLeft(column) {\n      return column < this.hot.getSettings().fixedColumnsLeft;\n    }\n\n    /**\n     * Save the manual column positions to the persistent state.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'persistentStateSave',\n    value: function persistentStateSave() {\n      this.hot.runHooks('persistentStateSave', 'manualColumnMove', this.columnsMapper._arrayMap);\n    }\n\n    /**\n     * Load the manual column positions from the persistent state.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'persistentStateLoad',\n    value: function persistentStateLoad() {\n      var storedState = {};\n\n      this.hot.runHooks('persistentStateLoad', 'manualColumnMove', storedState);\n\n      if (storedState.value) {\n        this.columnsMapper._arrayMap = storedState.value;\n      }\n    }\n\n    /**\n     * Prepare array of indexes based on actual selection.\n     *\n     * @private\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'prepareColumnsToMoving',\n    value: function prepareColumnsToMoving(start, end) {\n      var selectedColumns = [];\n\n      (0, _number.rangeEach)(start, end, function (i) {\n        selectedColumns.push(i);\n      });\n\n      return selectedColumns;\n    }\n\n    /**\n     * Update the UI visual position.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'refreshPositions',\n    value: function refreshPositions() {\n      var priv = privatePool.get(this);\n      var firstVisible = this.hot.view.wt.wtTable.getFirstVisibleColumn();\n      var lastVisible = this.hot.view.wt.wtTable.getLastVisibleColumn();\n      var wtTable = this.hot.view.wt.wtTable;\n      var scrollableElement = this.hot.view.wt.wtOverlays.scrollableElement;\n      var scrollLeft = typeof scrollableElement.scrollX === 'number' ? scrollableElement.scrollX : scrollableElement.scrollLeft;\n      var tdOffsetLeft = this.hot.view.THEAD.offsetLeft + this.getColumnsWidth(0, priv.coordsColumn);\n      var mouseOffsetLeft = priv.target.eventPageX - (priv.rootElementOffset - (scrollableElement.scrollX === void 0 ? scrollLeft : 0));\n      var hiderWidth = wtTable.hider.offsetWidth;\n      var tbodyOffsetLeft = wtTable.TBODY.offsetLeft;\n      var backlightElemMarginLeft = this.backlight.getOffset().left;\n      var backlightElemWidth = this.backlight.getSize().width;\n      var rowHeaderWidth = 0;\n\n      if (priv.rootElementOffset + wtTable.holder.offsetWidth + scrollLeft < priv.target.eventPageX) {\n        if (priv.coordsColumn < priv.countCols) {\n          priv.coordsColumn++;\n        }\n      }\n\n      if (priv.hasRowHeaders) {\n        rowHeaderWidth = this.hot.view.wt.wtOverlays.leftOverlay.clone.wtTable.getColumnHeader(-1).offsetWidth;\n      }\n      if (this.isFixedColumnsLeft(priv.coordsColumn)) {\n        tdOffsetLeft += scrollLeft;\n      }\n      tdOffsetLeft += rowHeaderWidth;\n\n      if (priv.coordsColumn < 0) {\n        // if hover on rowHeader\n        if (priv.fixedColumns > 0) {\n          priv.target.col = 0;\n        } else {\n          priv.target.col = firstVisible > 0 ? firstVisible - 1 : firstVisible;\n        }\n      } else if (priv.target.TD.offsetWidth / 2 + tdOffsetLeft <= mouseOffsetLeft) {\n        var newCoordsCol = priv.coordsColumn >= priv.countCols ? priv.countCols - 1 : priv.coordsColumn;\n        // if hover on right part of TD\n        priv.target.col = newCoordsCol + 1;\n        // unfortunately first column is bigger than rest\n        tdOffsetLeft += priv.target.TD.offsetWidth;\n\n        if (priv.target.col > lastVisible) {\n          this.hot.scrollViewportTo(void 0, lastVisible + 1, void 0, true);\n        }\n      } else {\n        // elsewhere on table\n        priv.target.col = priv.coordsColumn;\n\n        if (priv.target.col <= firstVisible && priv.target.col >= priv.fixedColumns) {\n          this.hot.scrollViewportTo(void 0, firstVisible - 1);\n        }\n      }\n\n      if (priv.target.col <= firstVisible && priv.target.col >= priv.fixedColumns) {\n        this.hot.scrollViewportTo(void 0, firstVisible - 1);\n      }\n\n      var backlightLeft = mouseOffsetLeft;\n      var guidelineLeft = tdOffsetLeft;\n\n      if (mouseOffsetLeft + backlightElemWidth + backlightElemMarginLeft >= hiderWidth) {\n        // prevent display backlight on the right side of the table\n        backlightLeft = hiderWidth - backlightElemWidth - backlightElemMarginLeft;\n      } else if (mouseOffsetLeft + backlightElemMarginLeft < tbodyOffsetLeft + rowHeaderWidth) {\n        // prevent display backlight on the left side of the table\n        backlightLeft = tbodyOffsetLeft + rowHeaderWidth + Math.abs(backlightElemMarginLeft);\n      }\n\n      if (tdOffsetLeft >= hiderWidth - 1) {\n        // prevent display guideline outside the table\n        guidelineLeft = hiderWidth - 1;\n      } else if (guidelineLeft === 0) {\n        // guideline has got `margin-left: -1px` as default\n        guidelineLeft = 1;\n      } else if (scrollableElement.scrollX !== void 0 && priv.coordsColumn < priv.fixedColumns) {\n        guidelineLeft -= priv.rootElementOffset <= scrollableElement.scrollX ? priv.rootElementOffset : 0;\n      }\n\n      this.backlight.setPosition(null, backlightLeft);\n      this.guideline.setPosition(null, guidelineLeft);\n    }\n\n    /**\n     * This method checks arrayMap from columnsMapper and updates the columnsMapper if it's necessary.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'updateColumnsMapper',\n    value: function updateColumnsMapper() {\n      var countCols = this.hot.countSourceCols();\n      var columnsMapperLen = this.columnsMapper._arrayMap.length;\n\n      if (columnsMapperLen === 0) {\n        this.columnsMapper.createMap(countCols || this.hot.getSettings().startCols);\n      } else if (columnsMapperLen < countCols) {\n        var diff = countCols - columnsMapperLen;\n\n        this.columnsMapper.insertItems(columnsMapperLen, diff);\n      } else if (columnsMapperLen > countCols) {\n        var maxIndex = countCols - 1;\n        var columnsToRemove = [];\n\n        (0, _array.arrayEach)(this.columnsMapper._arrayMap, function (value, index) {\n          if (value > maxIndex) {\n            columnsToRemove.push(index);\n          }\n        });\n\n        this.columnsMapper.removeItems(columnsToRemove);\n      }\n    }\n\n    /**\n     * Bind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this4 = this;\n\n      this.eventManager.addEventListener(document.documentElement, 'mousemove', function (event) {\n        return _this4.onMouseMove(event);\n      });\n      this.eventManager.addEventListener(document.documentElement, 'mouseup', function () {\n        return _this4.onMouseUp();\n      });\n    }\n\n    /**\n     * Unbind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'unregisterEvents',\n    value: function unregisterEvents() {\n      this.eventManager.clear();\n    }\n\n    /**\n     * Change the behavior of selection / dragging.\n     *\n     * @private\n     * @param {MouseEvent} event `mousedown` event properties.\n     * @param {CellCoords} coords Visual cell coordinates where was fired event.\n     * @param {HTMLElement} TD Cell represented as HTMLElement.\n     * @param {Object} blockCalculations Object which contains information about blockCalculation for row, column or cells.\n     */\n\n  }, {\n    key: 'onBeforeOnCellMouseDown',\n    value: function onBeforeOnCellMouseDown(event, coords, TD, blockCalculations) {\n      var wtTable = this.hot.view.wt.wtTable;\n      var isHeaderSelection = this.hot.selection.isSelectedByColumnHeader();\n      var selection = this.hot.getSelectedRangeLast();\n      var priv = privatePool.get(this);\n      var isSortingElement = event.realTarget.className.indexOf('columnSorting') > -1;\n\n      if (!selection || !isHeaderSelection || priv.pressed || event.button !== 0 || isSortingElement) {\n        priv.pressed = false;\n        priv.columnsToMove.length = 0;\n        (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI]);\n        return;\n      }\n\n      var guidelineIsNotReady = this.guideline.isBuilt() && !this.guideline.isAppended();\n      var backlightIsNotReady = this.backlight.isBuilt() && !this.backlight.isAppended();\n\n      if (guidelineIsNotReady && backlightIsNotReady) {\n        this.guideline.appendTo(wtTable.hider);\n        this.backlight.appendTo(wtTable.hider);\n      }\n\n      var from = selection.from,\n          to = selection.to;\n\n      var start = Math.min(from.col, to.col);\n      var end = Math.max(from.col, to.col);\n\n      if (coords.row < 0 && coords.col >= start && coords.col <= end) {\n        blockCalculations.column = true;\n        priv.pressed = true;\n        priv.target.eventPageX = event.pageX;\n        priv.coordsColumn = coords.col;\n        priv.target.TD = TD;\n        priv.target.col = coords.col;\n        priv.columnsToMove = this.prepareColumnsToMoving(start, end);\n        priv.hasRowHeaders = !!this.hot.getSettings().rowHeaders;\n        priv.countCols = this.hot.countCols();\n        priv.fixedColumns = this.hot.getSettings().fixedColumnsLeft;\n        priv.rootElementOffset = (0, _element.offset)(this.hot.rootElement).left;\n\n        var countColumnsFrom = priv.hasRowHeaders ? -1 : 0;\n        var topPos = wtTable.holder.scrollTop + wtTable.getColumnHeaderHeight(0) + 1;\n        var fixedColumns = coords.col < priv.fixedColumns;\n        var scrollableElement = this.hot.view.wt.wtOverlays.scrollableElement;\n        var wrapperIsWindow = scrollableElement.scrollX ? scrollableElement.scrollX - priv.rootElementOffset : 0;\n\n        var mouseOffset = event.layerX - (fixedColumns ? wrapperIsWindow : 0);\n        var leftOffset = Math.abs(this.getColumnsWidth(start, coords.col) + mouseOffset);\n\n        this.backlight.setPosition(topPos, this.getColumnsWidth(countColumnsFrom, start) + leftOffset);\n        this.backlight.setSize(this.getColumnsWidth(start, end + 1), wtTable.hider.offsetHeight - topPos);\n        this.backlight.setOffset(null, leftOffset * -1);\n\n        (0, _element.addClass)(this.hot.rootElement, CSS_ON_MOVING);\n      } else {\n        (0, _element.removeClass)(this.hot.rootElement, CSS_AFTER_SELECTION);\n        priv.pressed = false;\n        priv.columnsToMove.length = 0;\n      }\n    }\n\n    /**\n     * 'mouseMove' event callback. Fired when pointer move on document.documentElement.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var priv = privatePool.get(this);\n\n      if (!priv.pressed) {\n        return;\n      }\n\n      // callback for browser which doesn't supports CSS pointer-event: none\n      if (event.realTarget === this.backlight.element) {\n        var width = this.backlight.getSize().width;\n        this.backlight.setSize(0);\n\n        setTimeout(function () {\n          this.backlight.setPosition(width);\n        });\n      }\n\n      priv.target.eventPageX = event.pageX;\n      this.refreshPositions();\n    }\n\n    /**\n     * 'beforeOnCellMouseOver' hook callback. Fired when pointer was over cell.\n     *\n     * @private\n     * @param {MouseEvent} event `mouseover` event properties.\n     * @param {CellCoords} coords Visual cell coordinates where was fired event.\n     * @param {HTMLElement} TD Cell represented as HTMLElement.\n     * @param {Object} blockCalculations Object which contains information about blockCalculation for row, column or cells.\n     */\n\n  }, {\n    key: 'onBeforeOnCellMouseOver',\n    value: function onBeforeOnCellMouseOver(event, coords, TD, blockCalculations) {\n      var selectedRange = this.hot.getSelectedRangeLast();\n      var priv = privatePool.get(this);\n\n      if (!selectedRange || !priv.pressed) {\n        return;\n      }\n\n      if (priv.columnsToMove.indexOf(coords.col) > -1) {\n        (0, _element.removeClass)(this.hot.rootElement, CSS_SHOW_UI);\n      } else {\n        (0, _element.addClass)(this.hot.rootElement, CSS_SHOW_UI);\n      }\n\n      blockCalculations.row = true;\n      blockCalculations.column = true;\n      blockCalculations.cell = true;\n      priv.coordsColumn = coords.col;\n      priv.target.TD = TD;\n    }\n\n    /**\n     * `onMouseUp` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      var priv = privatePool.get(this);\n\n      priv.coordsColumn = void 0;\n      priv.pressed = false;\n      priv.backlightWidth = 0;\n\n      (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI, CSS_AFTER_SELECTION]);\n\n      if (this.hot.selection.isSelectedByColumnHeader()) {\n        (0, _element.addClass)(this.hot.rootElement, CSS_AFTER_SELECTION);\n      }\n      if (priv.columnsToMove.length < 1 || priv.target.col === void 0 || priv.columnsToMove.indexOf(priv.target.col) > -1) {\n        return;\n      }\n\n      this.moveColumns(priv.columnsToMove, priv.target.col);\n      this.persistentStateSave();\n      this.hot.render();\n      this.hot.view.wt.wtOverlays.adjustElementsSize(true);\n\n      if (!priv.disallowMoving) {\n        var selectionStart = this.columnsMapper.getIndexByValue(priv.columnsToMove[0]);\n        var selectionEnd = this.columnsMapper.getIndexByValue(priv.columnsToMove[priv.columnsToMove.length - 1]);\n        this.changeSelection(selectionStart, selectionEnd);\n      }\n\n      priv.columnsToMove.length = 0;\n    }\n\n    /**\n     * `afterScrollHorizontally` hook callback. Fired the table was scrolled horizontally.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterScrollVertically',\n    value: function onAfterScrollVertically() {\n      var wtTable = this.hot.view.wt.wtTable;\n      var headerHeight = wtTable.getColumnHeaderHeight(0) + 1;\n      var scrollTop = wtTable.holder.scrollTop;\n      var posTop = headerHeight + scrollTop;\n\n      this.backlight.setPosition(posTop);\n      this.backlight.setSize(null, wtTable.hider.offsetHeight - posTop);\n    }\n\n    /**\n     * `afterCreateCol` hook callback.\n     *\n     * @private\n     * @param {Number} index Visual index of the created column.\n     * @param {Number} amount Amount of created columns.\n     */\n\n  }, {\n    key: 'onAfterCreateCol',\n    value: function onAfterCreateCol(index, amount) {\n      this.columnsMapper.shiftItems(index, amount);\n    }\n\n    /**\n     * On before remove column listener.\n     *\n     * @private\n     * @param {Number} index Visual column index.\n     * @param {Number} amount Defines how many columns removed.\n     */\n\n  }, {\n    key: 'onBeforeRemoveCol',\n    value: function onBeforeRemoveCol(index, amount) {\n      var _this5 = this;\n\n      this.removedColumns.length = 0;\n\n      if (index !== false) {\n        // Collect physical row index.\n        (0, _number.rangeEach)(index, index + amount - 1, function (removedIndex) {\n          _this5.removedColumns.push(_this5.hot.runHooks('modifyCol', removedIndex, _this5.pluginName));\n        });\n      }\n    }\n\n    /**\n     * `afterRemoveCol` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterRemoveCol',\n    value: function onAfterRemoveCol() {\n      this.columnsMapper.unshiftItems(this.removedColumns);\n    }\n\n    /**\n     * `afterLoadData` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData() {\n      this.updateColumnsMapper();\n    }\n\n    /**\n     * 'modifyRow' hook callback.\n     *\n     * @private\n     * @param {Number} column Visual column index.\n     * @returns {Number} Physical column index.\n     */\n\n  }, {\n    key: 'onModifyCol',\n    value: function onModifyCol(column, source) {\n      if (source !== this.pluginName) {\n        // ugly fix for try to insert new, needed columns after pasting data\n        var columnInMapper = this.columnsMapper.getValueByIndex(column);\n        column = columnInMapper === null ? column : columnInMapper;\n      }\n\n      return column;\n    }\n\n    /**\n     * 'unmodifyCol' hook callback.\n     *\n     * @private\n     * @param {Number} column Physical column index.\n     * @returns {Number} Visual column index.\n     */\n\n  }, {\n    key: 'onUnmodifyCol',\n    value: function onUnmodifyCol(column) {\n      var indexInMapper = this.columnsMapper.getIndexByValue(column);\n\n      return indexInMapper === null ? column : indexInMapper;\n    }\n\n    /**\n     * `afterPluginsInitialized` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterPluginsInitialized',\n    value: function onAfterPluginsInitialized() {\n      this.updateColumnsMapper();\n      this.initialSettings();\n      this.backlight.build();\n      this.guideline.build();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.backlight.destroy();\n      this.guideline.destroy();\n\n      _get(ManualColumnMove.prototype.__proto__ || Object.getPrototypeOf(ManualColumnMove.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return ManualColumnMove;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('ManualColumnMove', ManualColumnMove);\n\nexports.default = ManualColumnMove;\n\n/***/ }),\n/* 455 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _arrayMapper = __webpack_require__(321);\n\nvar _arrayMapper2 = _interopRequireDefault(_arrayMapper);\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class ColumnsMapper\n * @plugin ManualColumnMove\n */\nvar ColumnsMapper = function () {\n  function ColumnsMapper(manualColumnMove) {\n    _classCallCheck(this, ColumnsMapper);\n\n    /**\n     * Instance of ManualColumnMove plugin.\n     *\n     * @type {ManualColumnMove}\n     */\n    this.manualColumnMove = manualColumnMove;\n  }\n\n  /**\n   * Reset current map array and create new one.\n   *\n   * @param {Number} [length] Custom generated map length.\n   */\n\n\n  _createClass(ColumnsMapper, [{\n    key: 'createMap',\n    value: function createMap(length) {\n      var _this = this;\n\n      var originLength = length === void 0 ? this._arrayMap.length : length;\n\n      this._arrayMap.length = 0;\n\n      (0, _number.rangeEach)(originLength - 1, function (itemIndex) {\n        _this._arrayMap[itemIndex] = itemIndex;\n      });\n    }\n\n    /**\n     * Destroy class.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this._arrayMap = null;\n    }\n\n    /**\n     * Moving elements in columnsMapper.\n     *\n     * @param {Number} from Column index to move.\n     * @param {Number} to Target index.\n     */\n\n  }, {\n    key: 'moveColumn',\n    value: function moveColumn(from, to) {\n      var indexToMove = this._arrayMap[from];\n      this._arrayMap[from] = null;\n      this._arrayMap.splice(to, 0, indexToMove);\n    }\n\n    /**\n     * Clearing arrayMap from `null` entries.\n     */\n\n  }, {\n    key: 'clearNull',\n    value: function clearNull() {\n      this._arrayMap = (0, _array.arrayFilter)(this._arrayMap, function (i) {\n        return i !== null;\n      });\n    }\n  }]);\n\n  return ColumnsMapper;\n}();\n\n(0, _object.mixin)(ColumnsMapper, _arrayMapper2.default);\n\nexports.default = ColumnsMapper;\n\n/***/ }),\n/* 456 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(322);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CSS_CLASSNAME = 'ht__manualColumnMove--backlight';\n\n/**\n * @class BacklightUI\n * @util\n */\n\nvar BacklightUI = function (_BaseUI) {\n  _inherits(BacklightUI, _BaseUI);\n\n  function BacklightUI() {\n    _classCallCheck(this, BacklightUI);\n\n    return _possibleConstructorReturn(this, (BacklightUI.__proto__ || Object.getPrototypeOf(BacklightUI)).apply(this, arguments));\n  }\n\n  _createClass(BacklightUI, [{\n    key: 'build',\n\n    /**\n     * Custom className on build process.\n     */\n    value: function build() {\n      _get(BacklightUI.prototype.__proto__ || Object.getPrototypeOf(BacklightUI.prototype), 'build', this).call(this);\n\n      (0, _element.addClass)(this._element, CSS_CLASSNAME);\n    }\n  }]);\n\n  return BacklightUI;\n}(_base2.default);\n\nexports.default = BacklightUI;\n\n/***/ }),\n/* 457 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(322);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CSS_CLASSNAME = 'ht__manualColumnMove--guideline';\n\n/**\n * @class GuidelineUI\n * @util\n */\n\nvar GuidelineUI = function (_BaseUI) {\n  _inherits(GuidelineUI, _BaseUI);\n\n  function GuidelineUI() {\n    _classCallCheck(this, GuidelineUI);\n\n    return _possibleConstructorReturn(this, (GuidelineUI.__proto__ || Object.getPrototypeOf(GuidelineUI)).apply(this, arguments));\n  }\n\n  _createClass(GuidelineUI, [{\n    key: 'build',\n\n    /**\n     * Custom className on build process.\n     */\n    value: function build() {\n      _get(GuidelineUI.prototype.__proto__ || Object.getPrototypeOf(GuidelineUI.prototype), 'build', this).call(this);\n\n      (0, _element.addClass)(this._element, CSS_CLASSNAME);\n    }\n  }]);\n\n  return GuidelineUI;\n}(_base2.default);\n\nexports.default = GuidelineUI;\n\n/***/ }),\n/* 458 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 459 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _event = __webpack_require__(12);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// Developer note! Whenever you make a change in this file, make an analogous change in manualRowResize.js\n\n/**\n * @description\n * ManualColumnResize Plugin.\n *\n * Has 2 UI components:\n * - handle - the draggable element that sets the desired width of the column.\n * - guide - the helper guide that shows the desired width as a vertical guide.\n *\n * @plugin ManualColumnResize\n */\nvar ManualColumnResize = function (_BasePlugin) {\n  _inherits(ManualColumnResize, _BasePlugin);\n\n  function ManualColumnResize(hotInstance) {\n    _classCallCheck(this, ManualColumnResize);\n\n    var _this = _possibleConstructorReturn(this, (ManualColumnResize.__proto__ || Object.getPrototypeOf(ManualColumnResize)).call(this, hotInstance));\n\n    _this.currentTH = null;\n    _this.currentCol = null;\n    _this.selectedCols = [];\n    _this.currentWidth = null;\n    _this.newSize = null;\n    _this.startY = null;\n    _this.startWidth = null;\n    _this.startOffset = null;\n    _this.handle = document.createElement('DIV');\n    _this.guide = document.createElement('DIV');\n    _this.eventManager = new _eventManager2.default(_this);\n    _this.pressed = null;\n    _this.dblclick = 0;\n    _this.autoresizeTimeout = null;\n    _this.manualColumnWidths = [];\n\n    (0, _element.addClass)(_this.handle, 'manualColumnResizer');\n    (0, _element.addClass)(_this.guide, 'manualColumnResizerGuide');\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualColumnResize, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().manualColumnResize;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.manualColumnWidths = [];\n      var initialColumnWidth = this.hot.getSettings().manualColumnResize;\n      var loadedManualColumnWidths = this.loadManualColumnWidths();\n\n      this.addHook('modifyColWidth', function (width, col) {\n        return _this2.onModifyColWidth(width, col);\n      });\n      this.addHook('beforeStretchingColumnWidth', function (stretchedWidth, column) {\n        return _this2.onBeforeStretchingColumnWidth(stretchedWidth, column);\n      });\n      this.addHook('beforeColumnResize', function (currentColumn, newSize, isDoubleClick) {\n        return _this2.onBeforeColumnResize(currentColumn, newSize, isDoubleClick);\n      });\n\n      if (typeof loadedManualColumnWidths != 'undefined') {\n        this.manualColumnWidths = loadedManualColumnWidths;\n      } else if (Array.isArray(initialColumnWidth)) {\n        this.manualColumnWidths = initialColumnWidth;\n      } else {\n        this.manualColumnWidths = [];\n      }\n\n      // Handsontable.hooks.register('beforeColumnResize');\n      // Handsontable.hooks.register('afterColumnResize');\n\n      this.bindEvents();\n\n      _get(ManualColumnResize.prototype.__proto__ || Object.getPrototypeOf(ManualColumnResize.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      var initialColumnWidth = this.hot.getSettings().manualColumnResize;\n\n      if (Array.isArray(initialColumnWidth)) {\n        this.manualColumnWidths = initialColumnWidth;\n      } else if (!initialColumnWidth) {\n        this.manualColumnWidths = [];\n      }\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(ManualColumnResize.prototype.__proto__ || Object.getPrototypeOf(ManualColumnResize.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Save the current sizes using the persistentState plugin.\n     */\n\n  }, {\n    key: 'saveManualColumnWidths',\n    value: function saveManualColumnWidths() {\n      this.hot.runHooks('persistentStateSave', 'manualColumnWidths', this.manualColumnWidths);\n    }\n\n    /**\n     * Load the previously saved sizes using the persistentState plugin.\n     *\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'loadManualColumnWidths',\n    value: function loadManualColumnWidths() {\n      var storedState = {};\n\n      this.hot.runHooks('persistentStateLoad', 'manualColumnWidths', storedState);\n\n      return storedState.value;\n    }\n\n    /**\n     * Set the resize handle position.\n     *\n     * @param {HTMLCellElement} TH TH HTML element.\n     */\n\n  }, {\n    key: 'setupHandlePosition',\n    value: function setupHandlePosition(TH) {\n      var _this3 = this;\n\n      if (!TH.parentNode) {\n        return false;\n      }\n\n      this.currentTH = TH;\n\n      var col = this.hot.view.wt.wtTable.getCoords(TH).col; // getCoords returns CellCoords\n      var headerHeight = (0, _element.outerHeight)(this.currentTH);\n\n      if (col >= 0) {\n        // if not col header\n        var box = this.currentTH.getBoundingClientRect();\n\n        this.currentCol = col;\n        this.selectedCols = [];\n\n        if (this.hot.selection.isSelected() && this.hot.selection.isSelectedByColumnHeader()) {\n          var _hot$getSelectedRange = this.hot.getSelectedRangeLast(),\n              from = _hot$getSelectedRange.from,\n              to = _hot$getSelectedRange.to;\n\n          var start = from.col;\n          var end = to.col;\n\n          if (start >= end) {\n            start = to.col;\n            end = from.col;\n          }\n\n          if (this.currentCol >= start && this.currentCol <= end) {\n            (0, _number.rangeEach)(start, end, function (i) {\n              return _this3.selectedCols.push(i);\n            });\n          } else {\n            this.selectedCols.push(this.currentCol);\n          }\n        } else {\n          this.selectedCols.push(this.currentCol);\n        }\n\n        this.startOffset = box.left - 6;\n        this.startWidth = parseInt(box.width, 10);\n        this.handle.style.top = box.top + 'px';\n        this.handle.style.left = this.startOffset + this.startWidth + 'px';\n        this.handle.style.height = headerHeight + 'px';\n        this.hot.rootElement.appendChild(this.handle);\n      }\n    }\n\n    /**\n     * Refresh the resize handle position.\n     */\n\n  }, {\n    key: 'refreshHandlePosition',\n    value: function refreshHandlePosition() {\n      this.handle.style.left = this.startOffset + this.currentWidth + 'px';\n    }\n\n    /**\n     * Set the resize guide position.\n     */\n\n  }, {\n    key: 'setupGuidePosition',\n    value: function setupGuidePosition() {\n      var handleHeight = parseInt((0, _element.outerHeight)(this.handle), 10);\n      var handleBottomPosition = parseInt(this.handle.style.top, 10) + handleHeight;\n      var maximumVisibleElementHeight = parseInt(this.hot.view.maximumVisibleElementHeight(0), 10);\n\n      (0, _element.addClass)(this.handle, 'active');\n      (0, _element.addClass)(this.guide, 'active');\n\n      this.guide.style.top = handleBottomPosition + 'px';\n      this.guide.style.left = this.handle.style.left;\n      this.guide.style.height = maximumVisibleElementHeight - handleHeight + 'px';\n      this.hot.rootElement.appendChild(this.guide);\n    }\n\n    /**\n     * Refresh the resize guide position.\n     */\n\n  }, {\n    key: 'refreshGuidePosition',\n    value: function refreshGuidePosition() {\n      this.guide.style.left = this.handle.style.left;\n    }\n\n    /**\n     * Hide both the resize handle and resize guide.\n     */\n\n  }, {\n    key: 'hideHandleAndGuide',\n    value: function hideHandleAndGuide() {\n      (0, _element.removeClass)(this.handle, 'active');\n      (0, _element.removeClass)(this.guide, 'active');\n    }\n\n    /**\n     * Check if provided element is considered a column header.\n     *\n     * @param {HTMLElement} element HTML element.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'checkIfColumnHeader',\n    value: function checkIfColumnHeader(element) {\n      if (element != this.hot.rootElement) {\n        var parent = element.parentNode;\n\n        if (parent.tagName === 'THEAD') {\n          return true;\n        }\n\n        return this.checkIfColumnHeader(parent);\n      }\n\n      return false;\n    }\n\n    /**\n     * Get the TH element from the provided element.\n     *\n     * @param {HTMLElement} element HTML element.\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'getTHFromTargetElement',\n    value: function getTHFromTargetElement(element) {\n      if (element.tagName != 'TABLE') {\n        if (element.tagName == 'TH') {\n          return element;\n        }\n        return this.getTHFromTargetElement(element.parentNode);\n      }\n\n      return null;\n    }\n\n    /**\n     * 'mouseover' event callback - set the handle position.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseOver',\n    value: function onMouseOver(event) {\n      if (this.checkIfColumnHeader(event.target)) {\n        var th = this.getTHFromTargetElement(event.target);\n\n        if (!th) {\n          return;\n        }\n\n        var colspan = th.getAttribute('colspan');\n\n        if (th && (colspan === null || colspan === 1)) {\n          if (!this.pressed) {\n            this.setupHandlePosition(th);\n          }\n        }\n      }\n    }\n\n    /**\n     * Auto-size row after doubleclick - callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'afterMouseDownTimeout',\n    value: function afterMouseDownTimeout() {\n      var _this4 = this;\n\n      var render = function render() {\n        _this4.hot.forceFullRender = true;\n        _this4.hot.view.render(); // updates all\n        _this4.hot.view.wt.wtOverlays.adjustElementsSize(true);\n      };\n      var resize = function resize(selectedCol, forceRender) {\n        var hookNewSize = _this4.hot.runHooks('beforeColumnResize', selectedCol, _this4.newSize, true);\n\n        if (hookNewSize !== void 0) {\n          _this4.newSize = hookNewSize;\n        }\n\n        if (_this4.hot.getSettings().stretchH === 'all') {\n          _this4.clearManualSize(selectedCol);\n        } else {\n          _this4.setManualSize(selectedCol, _this4.newSize); // double click sets by auto row size plugin\n        }\n\n        if (forceRender) {\n          render();\n        }\n\n        _this4.saveManualColumnWidths();\n\n        _this4.hot.runHooks('afterColumnResize', selectedCol, _this4.newSize, true);\n      };\n\n      if (this.dblclick >= 2) {\n        var selectedColsLength = this.selectedCols.length;\n\n        if (selectedColsLength > 1) {\n          (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n            resize(selectedCol);\n          });\n          render();\n        } else {\n          (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n            resize(selectedCol, true);\n          });\n        }\n      }\n      this.dblclick = 0;\n      this.autoresizeTimeout = null;\n    }\n\n    /**\n     * 'mousedown' event callback.\n     *\n     * @private\n     * @param {MouseEvent} e\n     */\n\n  }, {\n    key: 'onMouseDown',\n    value: function onMouseDown(event) {\n      var _this5 = this;\n\n      if ((0, _element.hasClass)(event.target, 'manualColumnResizer')) {\n        this.setupGuidePosition();\n        this.pressed = this.hot;\n\n        if (this.autoresizeTimeout === null) {\n          this.autoresizeTimeout = setTimeout(function () {\n            return _this5.afterMouseDownTimeout();\n          }, 500);\n\n          this.hot._registerTimeout(this.autoresizeTimeout);\n        }\n        this.dblclick++;\n\n        this.startX = (0, _event.pageX)(event);\n        this.newSize = this.startWidth;\n      }\n    }\n\n    /**\n     * 'mousemove' event callback - refresh the handle and guide positions, cache the new column width.\n     *\n     * @private\n     * @param {MouseEvent} e\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var _this6 = this;\n\n      if (this.pressed) {\n        this.currentWidth = this.startWidth + ((0, _event.pageX)(event) - this.startX);\n\n        (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n          _this6.newSize = _this6.setManualSize(selectedCol, _this6.currentWidth);\n        });\n\n        this.refreshHandlePosition();\n        this.refreshGuidePosition();\n      }\n    }\n\n    /**\n     * 'mouseup' event callback - apply the column resizing.\n     *\n     * @private\n     * @param {MouseEvent} e\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp(event) {\n      var _this7 = this;\n\n      var render = function render() {\n        _this7.hot.forceFullRender = true;\n        _this7.hot.view.render(); // updates all\n        _this7.hot.view.wt.wtOverlays.adjustElementsSize(true);\n      };\n      var resize = function resize(selectedCol, forceRender) {\n        _this7.hot.runHooks('beforeColumnResize', selectedCol, _this7.newSize);\n\n        if (forceRender) {\n          render();\n        }\n\n        _this7.saveManualColumnWidths();\n\n        _this7.hot.runHooks('afterColumnResize', selectedCol, _this7.newSize);\n      };\n\n      if (this.pressed) {\n        this.hideHandleAndGuide();\n        this.pressed = false;\n\n        if (this.newSize != this.startWidth) {\n          var selectedColsLength = this.selectedCols.length;\n\n          if (selectedColsLength > 1) {\n            (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n              resize(selectedCol);\n            });\n            render();\n          } else {\n            (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n              resize(selectedCol, true);\n            });\n          }\n        }\n\n        this.setupHandlePosition(this.currentTH);\n      }\n    }\n\n    /**\n     * Bind the mouse events.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'bindEvents',\n    value: function bindEvents() {\n      var _this8 = this;\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'mouseover', function (e) {\n        return _this8.onMouseOver(e);\n      });\n      this.eventManager.addEventListener(this.hot.rootElement, 'mousedown', function (e) {\n        return _this8.onMouseDown(e);\n      });\n      this.eventManager.addEventListener(window, 'mousemove', function (e) {\n        return _this8.onMouseMove(e);\n      });\n      this.eventManager.addEventListener(window, 'mouseup', function (e) {\n        return _this8.onMouseUp(e);\n      });\n    }\n\n    /**\n     * Cache the current column width.\n     *\n     * @param {Number} column Visual column index.\n     * @param {Number} width Column width.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'setManualSize',\n    value: function setManualSize(column, width) {\n      width = Math.max(width, 20);\n\n      /**\n       *  We need to run col through modifyCol hook, in case the order of displayed columns is different than the order\n       *  in data source. For instance, this order can be modified by manualColumnMove plugin.\n       */\n      column = this.hot.runHooks('modifyCol', column);\n\n      this.manualColumnWidths[column] = width;\n\n      return width;\n    }\n\n    /**\n     * Clear cache for the current column index.\n     *\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'clearManualSize',\n    value: function clearManualSize(column) {\n      column = this.hot.runHooks('modifyCol', column);\n\n      this.manualColumnWidths[column] = void 0;\n    }\n\n    /**\n     * Modify the provided column width, based on the plugin settings\n     *\n     * @private\n     * @param {Number} width Column width.\n     * @param {Number} column Visual column index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onModifyColWidth',\n    value: function onModifyColWidth(width, column) {\n      if (this.enabled) {\n        column = this.hot.runHooks('modifyCol', column);\n\n        if (this.hot.getSettings().manualColumnResize && this.manualColumnWidths[column]) {\n          return this.manualColumnWidths[column];\n        }\n      }\n\n      return width;\n    }\n\n    /**\n     * Modify the provided column stretched width. This hook decides if specified column should be stretched or not.\n     *\n     * @private\n     * @param {Number} stretchedWidth Stretched width.\n     * @param {Number} column Physical column index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onBeforeStretchingColumnWidth',\n    value: function onBeforeStretchingColumnWidth(stretchedWidth, column) {\n      var width = this.manualColumnWidths[column];\n\n      if (width === void 0) {\n        width = stretchedWidth;\n      }\n\n      return width;\n    }\n\n    /**\n     * `beforeColumnResize` hook callback.\n     *\n     * @private\n     * @param {Number} currentColumn Index of the resized column.\n     * @param {Number} newSize Calculated new column width.\n     * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n     */\n\n  }, {\n    key: 'onBeforeColumnResize',\n    value: function onBeforeColumnResize() {\n      // clear the header height cache information\n      this.hot.view.wt.wtViewport.hasOversizedColumnHeadersMarked = {};\n    }\n  }]);\n\n  return ManualColumnResize;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('manualColumnResize', ManualColumnResize);\n\nexports.default = ManualColumnResize;\n\n/***/ }),\n/* 460 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _element = __webpack_require__(0);\n\nvar _number = __webpack_require__(5);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nvar _rowsMapper = __webpack_require__(461);\n\nvar _rowsMapper2 = _interopRequireDefault(_rowsMapper);\n\nvar _backlight = __webpack_require__(462);\n\nvar _backlight2 = _interopRequireDefault(_backlight);\n\nvar _guideline = __webpack_require__(463);\n\nvar _guideline2 = _interopRequireDefault(_guideline);\n\nvar _src = __webpack_require__(4);\n\n__webpack_require__(464);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('beforeRowMove');\n_pluginHooks2.default.getSingleton().register('afterRowMove');\n_pluginHooks2.default.getSingleton().register('unmodifyRow');\n\nvar privatePool = new WeakMap();\nvar CSS_PLUGIN = 'ht__manualRowMove';\nvar CSS_SHOW_UI = 'show-ui';\nvar CSS_ON_MOVING = 'on-moving--rows';\nvar CSS_AFTER_SELECTION = 'after-selection--rows';\n\n/**\n * @plugin ManualRowMove\n *\n * @description\n * This plugin allows to change rows order.\n *\n * API:\n * - moveRow - move single row to the new position.\n * - moveRows - move many rows (as an array of indexes) to the new position.\n *\n * If you want apply visual changes, you have to call manually the render() method on the instance of handsontable.\n *\n * UI components:\n * - backlight - highlight of selected rows.\n * - guideline - line which shows where rows has been moved.\n *\n * @class ManualRowMove\n * @plugin ManualRowMove\n */\n\nvar ManualRowMove = function (_BasePlugin) {\n  _inherits(ManualRowMove, _BasePlugin);\n\n  function ManualRowMove(hotInstance) {\n    _classCallCheck(this, ManualRowMove);\n\n    /**\n     * Set up WeakMap of plugin to sharing private parameters;\n     */\n    var _this = _possibleConstructorReturn(this, (ManualRowMove.__proto__ || Object.getPrototypeOf(ManualRowMove)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      rowsToMove: [],\n      pressed: void 0,\n      disallowMoving: void 0,\n      target: {\n        eventPageY: void 0,\n        coords: void 0,\n        TD: void 0,\n        row: void 0\n      }\n    });\n\n    /**\n     * List of last removed row indexes.\n     *\n     * @type {Array}\n     */\n    _this.removedRows = [];\n    /**\n     * Object containing visual row indexes mapped to data source indexes.\n     *\n     * @type {RowsMapper}\n     */\n    _this.rowsMapper = new _rowsMapper2.default(_this);\n    /**\n     * Event Manager object.\n     *\n     * @type {Object}\n     */\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Backlight UI object.\n     *\n     * @type {Object}\n     */\n    _this.backlight = new _backlight2.default(hotInstance);\n    /**\n     * Guideline UI object.\n     *\n     * @type {Object}\n     */\n    _this.guideline = new _guideline2.default(hotInstance);\n    return _this;\n  }\n\n  /**\n   * Check if plugin is enabled.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualRowMove, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().manualRowMove;\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('beforeOnCellMouseDown', function (event, coords, TD, blockCalculations) {\n        return _this2.onBeforeOnCellMouseDown(event, coords, TD, blockCalculations);\n      });\n      this.addHook('beforeOnCellMouseOver', function (event, coords, TD, blockCalculations) {\n        return _this2.onBeforeOnCellMouseOver(event, coords, TD, blockCalculations);\n      });\n      this.addHook('afterScrollHorizontally', function () {\n        return _this2.onAfterScrollHorizontally();\n      });\n      this.addHook('modifyRow', function (row, source) {\n        return _this2.onModifyRow(row, source);\n      });\n      this.addHook('beforeRemoveRow', function (index, amount) {\n        return _this2.onBeforeRemoveRow(index, amount);\n      });\n      this.addHook('afterRemoveRow', function () {\n        return _this2.onAfterRemoveRow();\n      });\n      this.addHook('afterCreateRow', function (index, amount) {\n        return _this2.onAfterCreateRow(index, amount);\n      });\n      this.addHook('afterLoadData', function () {\n        return _this2.onAfterLoadData();\n      });\n      this.addHook('beforeColumnSort', function (column, order) {\n        return _this2.onBeforeColumnSort(column, order);\n      });\n      this.addHook('unmodifyRow', function (row) {\n        return _this2.onUnmodifyRow(row);\n      });\n\n      this.registerEvents();\n\n      // TODO: move adding plugin classname to BasePlugin.\n      (0, _element.addClass)(this.hot.rootElement, CSS_PLUGIN);\n\n      _get(ManualRowMove.prototype.__proto__ || Object.getPrototypeOf(ManualRowMove.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      this.onAfterPluginsInitialized();\n\n      _get(ManualRowMove.prototype.__proto__ || Object.getPrototypeOf(ManualRowMove.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      var pluginSettings = this.hot.getSettings().manualRowMove;\n\n      if (Array.isArray(pluginSettings)) {\n        this.rowsMapper.clearMap();\n      }\n\n      (0, _element.removeClass)(this.hot.rootElement, CSS_PLUGIN);\n\n      this.unregisterEvents();\n      this.backlight.destroy();\n      this.guideline.destroy();\n\n      _get(ManualRowMove.prototype.__proto__ || Object.getPrototypeOf(ManualRowMove.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Move a single row.\n     *\n     * @param {Number} row Visual row index to be moved.\n     * @param {Number} target Visual row index being a target for the moved row.\n     */\n\n  }, {\n    key: 'moveRow',\n    value: function moveRow(row, target) {\n      this.moveRows([row], target);\n    }\n\n    /**\n     * Move multiple rows.\n     *\n     * @param {Array} rows Array of visual row indexes to be moved.\n     * @param {Number} target Visual row index being a target for the moved rows.\n     */\n\n  }, {\n    key: 'moveRows',\n    value: function moveRows(rows, target) {\n      var _this3 = this;\n\n      var visualRows = [].concat(_toConsumableArray(rows));\n      var priv = privatePool.get(this);\n      var beforeMoveHook = this.hot.runHooks('beforeRowMove', visualRows, target);\n\n      priv.disallowMoving = beforeMoveHook === false;\n\n      if (!priv.disallowMoving) {\n        // first we need to rewrite an visual indexes to physical for save reference after move\n        (0, _array.arrayEach)(rows, function (row, index, array) {\n          array[index] = _this3.rowsMapper.getValueByIndex(row);\n        });\n\n        // next, when we have got an physical indexes, we can move rows\n        (0, _array.arrayEach)(rows, function (row, index) {\n          var actualPosition = _this3.rowsMapper.getIndexByValue(row);\n\n          if (actualPosition !== target) {\n            _this3.rowsMapper.moveRow(actualPosition, target + index);\n          }\n        });\n\n        // after moving we have to clear rowsMapper from null entries\n        this.rowsMapper.clearNull();\n      }\n\n      this.hot.runHooks('afterRowMove', visualRows, target);\n    }\n\n    /**\n     * Correct the cell selection after the move action. Fired only when action was made with a mouse.\n     * That means that changing the row order using the API won't correct the selection.\n     *\n     * @private\n     * @param {Number} startRow Visual row index for the start of the selection.\n     * @param {Number} endRow Visual row index for the end of the selection.\n     */\n\n  }, {\n    key: 'changeSelection',\n    value: function changeSelection(startRow, endRow) {\n      this.hot.selectRows(startRow, endRow);\n    }\n\n    /**\n     * Get the sum of the heights of rows in the provided range.\n     *\n     * @private\n     * @param {Number} from Visual row index.\n     * @param {Number} to Visual row index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getRowsHeight',\n    value: function getRowsHeight(from, to) {\n      var height = 0;\n\n      for (var i = from; i < to; i++) {\n        var rowHeight = this.hot.view.wt.wtTable.getRowHeight(i) || 23;\n\n        height += rowHeight;\n      }\n\n      return height;\n    }\n\n    /**\n     * Load initial settings when persistent state is saved or when plugin was initialized as an array.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'initialSettings',\n    value: function initialSettings() {\n      var pluginSettings = this.hot.getSettings().manualRowMove;\n\n      if (Array.isArray(pluginSettings)) {\n        this.moveRows(pluginSettings, 0);\n      } else if (pluginSettings !== void 0) {\n        var persistentState = this.persistentStateLoad();\n\n        if (persistentState.length) {\n          this.moveRows(persistentState, 0);\n        }\n      }\n    }\n\n    /**\n     * Check if the provided row is in the fixedRowsTop section.\n     *\n     * @private\n     * @param {Number} row Visual row index to check.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isFixedRowTop',\n    value: function isFixedRowTop(row) {\n      return row < this.hot.getSettings().fixedRowsTop;\n    }\n\n    /**\n     * Check if the provided row is in the fixedRowsBottom section.\n     *\n     * @private\n     * @param {Number} row Visual row index to check.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isFixedRowBottom',\n    value: function isFixedRowBottom(row) {\n      return row > this.hot.getSettings().fixedRowsBottom;\n    }\n\n    /**\n     * Save the manual row positions to the persistent state.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'persistentStateSave',\n    value: function persistentStateSave() {\n      this.hot.runHooks('persistentStateSave', 'manualRowMove', this.rowsMapper._arrayMap);\n    }\n\n    /**\n     * Load the manual row positions from the persistent state.\n     *\n     * @private\n     * @returns {Array} Stored state.\n     */\n\n  }, {\n    key: 'persistentStateLoad',\n    value: function persistentStateLoad() {\n      var storedState = {};\n\n      this.hot.runHooks('persistentStateLoad', 'manualRowMove', storedState);\n\n      return storedState.value ? storedState.value : [];\n    }\n\n    /**\n     * Prepare array of indexes based on actual selection.\n     *\n     * @private\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'prepareRowsToMoving',\n    value: function prepareRowsToMoving() {\n      var selection = this.hot.getSelectedRangeLast();\n      var selectedRows = [];\n\n      if (!selection) {\n        return selectedRows;\n      }\n\n      var from = selection.from,\n          to = selection.to;\n\n      var start = Math.min(from.row, to.row);\n      var end = Math.max(from.row, to.row);\n\n      (0, _number.rangeEach)(start, end, function (i) {\n        selectedRows.push(i);\n      });\n\n      return selectedRows;\n    }\n\n    /**\n     * Update the UI visual position.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'refreshPositions',\n    value: function refreshPositions() {\n      var priv = privatePool.get(this);\n      var coords = priv.target.coords;\n      var firstVisible = this.hot.view.wt.wtTable.getFirstVisibleRow();\n      var lastVisible = this.hot.view.wt.wtTable.getLastVisibleRow();\n      var fixedRows = this.hot.getSettings().fixedRowsTop;\n      var countRows = this.hot.countRows();\n\n      if (coords.row < fixedRows && firstVisible > 0) {\n        this.hot.scrollViewportTo(firstVisible - 1);\n      }\n      if (coords.row >= lastVisible && lastVisible < countRows) {\n        this.hot.scrollViewportTo(lastVisible + 1, undefined, true);\n      }\n\n      var wtTable = this.hot.view.wt.wtTable;\n      var TD = priv.target.TD;\n      var rootElementOffset = (0, _element.offset)(this.hot.rootElement);\n      var tdOffsetTop = this.hot.view.THEAD.offsetHeight + this.getRowsHeight(0, coords.row);\n      var mouseOffsetTop = priv.target.eventPageY - rootElementOffset.top + wtTable.holder.scrollTop;\n      var hiderHeight = wtTable.hider.offsetHeight;\n      var tbodyOffsetTop = wtTable.TBODY.offsetTop;\n      var backlightElemMarginTop = this.backlight.getOffset().top;\n      var backlightElemHeight = this.backlight.getSize().height;\n\n      if (this.isFixedRowTop(coords.row)) {\n        tdOffsetTop += wtTable.holder.scrollTop;\n      }\n\n      // todo: fixedRowsBottom\n      // if (this.isFixedRowBottom(coords.row)) {\n      //\n      // }\n\n      if (coords.row < 0) {\n        // if hover on colHeader\n        priv.target.row = firstVisible > 0 ? firstVisible - 1 : firstVisible;\n      } else if (TD.offsetHeight / 2 + tdOffsetTop <= mouseOffsetTop) {\n        // if hover on lower part of TD\n        priv.target.row = coords.row + 1;\n        // unfortunately first row is bigger than rest\n        tdOffsetTop += coords.row === 0 ? TD.offsetHeight - 1 : TD.offsetHeight;\n      } else {\n        // elsewhere on table\n        priv.target.row = coords.row;\n      }\n\n      var backlightTop = mouseOffsetTop;\n      var guidelineTop = tdOffsetTop;\n\n      if (mouseOffsetTop + backlightElemHeight + backlightElemMarginTop >= hiderHeight) {\n        // prevent display backlight below table\n        backlightTop = hiderHeight - backlightElemHeight - backlightElemMarginTop;\n      } else if (mouseOffsetTop + backlightElemMarginTop < tbodyOffsetTop) {\n        // prevent display above below table\n        backlightTop = tbodyOffsetTop + Math.abs(backlightElemMarginTop);\n      }\n\n      if (tdOffsetTop >= hiderHeight - 1) {\n        // prevent display guideline below table\n        guidelineTop = hiderHeight - 1;\n      }\n\n      var topOverlayHeight = 0;\n      if (this.hot.view.wt.wtOverlays.topOverlay) {\n        topOverlayHeight = this.hot.view.wt.wtOverlays.topOverlay.clone.wtTable.TABLE.offsetHeight;\n      }\n\n      if (coords.row >= fixedRows && guidelineTop - wtTable.holder.scrollTop < topOverlayHeight) {\n        this.hot.scrollViewportTo(coords.row);\n      }\n\n      this.backlight.setPosition(backlightTop);\n      this.guideline.setPosition(guidelineTop);\n    }\n\n    /**\n     * This method checks arrayMap from rowsMapper and updates the rowsMapper if it's necessary.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'updateRowsMapper',\n    value: function updateRowsMapper() {\n      var countRows = this.hot.countSourceRows();\n      var rowsMapperLen = this.rowsMapper._arrayMap.length;\n\n      if (rowsMapperLen === 0) {\n        this.rowsMapper.createMap(countRows || this.hot.getSettings().startRows);\n      } else if (rowsMapperLen < countRows) {\n        var diff = countRows - rowsMapperLen;\n\n        this.rowsMapper.insertItems(rowsMapperLen, diff);\n      } else if (rowsMapperLen > countRows) {\n        var maxIndex = countRows - 1;\n        var rowsToRemove = [];\n\n        (0, _array.arrayEach)(this.rowsMapper._arrayMap, function (value, index) {\n          if (value > maxIndex) {\n            rowsToRemove.push(index);\n          }\n        });\n\n        this.rowsMapper.removeItems(rowsToRemove);\n      }\n    }\n\n    /**\n     * Bind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this4 = this;\n\n      this.eventManager.addEventListener(document.documentElement, 'mousemove', function (event) {\n        return _this4.onMouseMove(event);\n      });\n      this.eventManager.addEventListener(document.documentElement, 'mouseup', function () {\n        return _this4.onMouseUp();\n      });\n    }\n\n    /**\n     * Unbind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'unregisterEvents',\n    value: function unregisterEvents() {\n      this.eventManager.clear();\n    }\n\n    /**\n     * `beforeColumnSort` hook callback. If user uses the sorting, manual row moving is disabled.\n     *\n     * @private\n     * @param {Number} column Column index where soring is present\n     * @param {*} order State of sorting. ASC/DESC/None\n     */\n\n  }, {\n    key: 'onBeforeColumnSort',\n    value: function onBeforeColumnSort(column, order) {\n      var priv = privatePool.get(this);\n\n      priv.disallowMoving = order !== void 0;\n    }\n\n    /**\n     * Change the behavior of selection / dragging.\n     *\n     * @private\n     * @param {MouseEvent} event\n     * @param {CellCoords} coords Visual coordinates.\n     * @param {HTMLElement} TD\n     * @param {Object} blockCalculations\n     */\n\n  }, {\n    key: 'onBeforeOnCellMouseDown',\n    value: function onBeforeOnCellMouseDown(event, coords, TD, blockCalculations) {\n      var wtTable = this.hot.view.wt.wtTable;\n      var isHeaderSelection = this.hot.selection.isSelectedByRowHeader();\n      var selection = this.hot.getSelectedRangeLast();\n      var priv = privatePool.get(this);\n\n      if (!selection || !isHeaderSelection || priv.pressed || event.button !== 0) {\n        priv.pressed = false;\n        priv.rowsToMove.length = 0;\n        (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI]);\n        return;\n      }\n\n      var guidelineIsNotReady = this.guideline.isBuilt() && !this.guideline.isAppended();\n      var backlightIsNotReady = this.backlight.isBuilt() && !this.backlight.isAppended();\n\n      if (guidelineIsNotReady && backlightIsNotReady) {\n        this.guideline.appendTo(wtTable.hider);\n        this.backlight.appendTo(wtTable.hider);\n      }\n\n      var from = selection.from,\n          to = selection.to;\n\n      var start = Math.min(from.row, to.row);\n      var end = Math.max(from.row, to.row);\n\n      if (coords.col < 0 && coords.row >= start && coords.row <= end) {\n        blockCalculations.row = true;\n        priv.pressed = true;\n        priv.target.eventPageY = event.pageY;\n        priv.target.coords = coords;\n        priv.target.TD = TD;\n        priv.rowsToMove = this.prepareRowsToMoving();\n\n        var leftPos = wtTable.holder.scrollLeft + this.hot.view.wt.wtViewport.getRowHeaderWidth();\n\n        this.backlight.setPosition(null, leftPos);\n        this.backlight.setSize(wtTable.hider.offsetWidth - leftPos, this.getRowsHeight(start, end + 1));\n        this.backlight.setOffset((this.getRowsHeight(start, coords.row) + event.layerY) * -1, null);\n\n        (0, _element.addClass)(this.hot.rootElement, CSS_ON_MOVING);\n\n        this.refreshPositions();\n      } else {\n        (0, _element.removeClass)(this.hot.rootElement, CSS_AFTER_SELECTION);\n        priv.pressed = false;\n        priv.rowsToMove.length = 0;\n      }\n    }\n\n    /**\n     * 'mouseMove' event callback. Fired when pointer move on document.documentElement.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var priv = privatePool.get(this);\n\n      if (!priv.pressed) {\n        return;\n      }\n\n      // callback for browser which doesn't supports CSS pointer-event: none\n      if (event.realTarget === this.backlight.element) {\n        var height = this.backlight.getSize().height;\n        this.backlight.setSize(null, 0);\n\n        setTimeout(function () {\n          this.backlight.setPosition(null, height);\n        });\n      }\n\n      priv.target.eventPageY = event.pageY;\n      this.refreshPositions();\n    }\n\n    /**\n     * 'beforeOnCellMouseOver' hook callback. Fired when pointer was over cell.\n     *\n     * @private\n     * @param {MouseEvent} event `mouseover` event properties.\n     * @param {CellCoords} coords Visual cell coordinates where was fired event.\n     * @param {HTMLElement} TD Cell represented as HTMLElement.\n     * @param {Object} blockCalculations Object which contains information about blockCalculation for row, column or cells.\n     */\n\n  }, {\n    key: 'onBeforeOnCellMouseOver',\n    value: function onBeforeOnCellMouseOver(event, coords, TD, blockCalculations) {\n      var selectedRange = this.hot.getSelectedRangeLast();\n      var priv = privatePool.get(this);\n\n      if (!selectedRange || !priv.pressed) {\n        return;\n      }\n\n      if (priv.rowsToMove.indexOf(coords.row) > -1) {\n        (0, _element.removeClass)(this.hot.rootElement, CSS_SHOW_UI);\n      } else {\n        (0, _element.addClass)(this.hot.rootElement, CSS_SHOW_UI);\n      }\n\n      blockCalculations.row = true;\n      blockCalculations.column = true;\n      blockCalculations.cell = true;\n      priv.target.coords = coords;\n      priv.target.TD = TD;\n    }\n\n    /**\n     * `onMouseUp` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      var priv = privatePool.get(this);\n      var target = priv.target.row;\n      var rowsLen = priv.rowsToMove.length;\n\n      priv.pressed = false;\n      priv.backlightHeight = 0;\n\n      (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI, CSS_AFTER_SELECTION]);\n\n      if (this.hot.selection.isSelectedByRowHeader()) {\n        (0, _element.addClass)(this.hot.rootElement, CSS_AFTER_SELECTION);\n      }\n\n      if (rowsLen < 1 || target === void 0 || priv.rowsToMove.indexOf(target) > -1 || priv.rowsToMove[rowsLen - 1] === target - 1) {\n        return;\n      }\n\n      this.moveRows(priv.rowsToMove, target);\n\n      this.persistentStateSave();\n      this.hot.render();\n\n      if (!priv.disallowMoving) {\n        var selectionStart = this.rowsMapper.getIndexByValue(priv.rowsToMove[0]);\n        var selectionEnd = this.rowsMapper.getIndexByValue(priv.rowsToMove[rowsLen - 1]);\n        this.changeSelection(selectionStart, selectionEnd);\n      }\n\n      priv.rowsToMove.length = 0;\n    }\n\n    /**\n     * `afterScrollHorizontally` hook callback. Fired the table was scrolled horizontally.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterScrollHorizontally',\n    value: function onAfterScrollHorizontally() {\n      var wtTable = this.hot.view.wt.wtTable;\n      var headerWidth = this.hot.view.wt.wtViewport.getRowHeaderWidth();\n      var scrollLeft = wtTable.holder.scrollLeft;\n      var posLeft = headerWidth + scrollLeft;\n\n      this.backlight.setPosition(null, posLeft);\n      this.backlight.setSize(wtTable.hider.offsetWidth - posLeft);\n    }\n\n    /**\n     * `afterCreateRow` hook callback.\n     *\n     * @private\n     * @param {Number} index Visual index of the created row.\n     * @param {Number} amount Amount of created rows.\n     */\n\n  }, {\n    key: 'onAfterCreateRow',\n    value: function onAfterCreateRow(index, amount) {\n      this.rowsMapper.shiftItems(index, amount);\n    }\n\n    /**\n     * On before remove row listener.\n     *\n     * @private\n     * @param {Number} index Visual row index.\n     * @param {Number} amount Defines how many rows removed.\n     */\n\n  }, {\n    key: 'onBeforeRemoveRow',\n    value: function onBeforeRemoveRow(index, amount) {\n      var _this5 = this;\n\n      this.removedRows.length = 0;\n\n      if (index !== false) {\n        // Collect physical row index.\n        (0, _number.rangeEach)(index, index + amount - 1, function (removedIndex) {\n          _this5.removedRows.push(_this5.hot.runHooks('modifyRow', removedIndex, _this5.pluginName));\n        });\n      }\n    }\n\n    /**\n     * `afterRemoveRow` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterRemoveRow',\n    value: function onAfterRemoveRow() {\n      this.rowsMapper.unshiftItems(this.removedRows);\n    }\n\n    /**\n     * `afterLoadData` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData() {\n      this.updateRowsMapper();\n    }\n\n    /**\n     * 'modifyRow' hook callback.\n     *\n     * @private\n     * @param {Number} row Visual Row index.\n     * @returns {Number} Physical row index.\n     */\n\n  }, {\n    key: 'onModifyRow',\n    value: function onModifyRow(row, source) {\n      if (source !== this.pluginName) {\n        var rowInMapper = this.rowsMapper.getValueByIndex(row);\n        row = rowInMapper === null ? row : rowInMapper;\n      }\n\n      return row;\n    }\n\n    /**\n     * 'unmodifyRow' hook callback.\n     *\n     * @private\n     * @param {Number} row Physical row index.\n     * @returns {Number} Visual row index.\n     */\n\n  }, {\n    key: 'onUnmodifyRow',\n    value: function onUnmodifyRow(row) {\n      var indexInMapper = this.rowsMapper.getIndexByValue(row);\n\n      return indexInMapper === null ? row : indexInMapper;\n    }\n\n    /**\n     * `afterPluginsInitialized` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterPluginsInitialized',\n    value: function onAfterPluginsInitialized() {\n      this.updateRowsMapper();\n      this.initialSettings();\n      this.backlight.build();\n      this.guideline.build();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.backlight.destroy();\n      this.guideline.destroy();\n\n      _get(ManualRowMove.prototype.__proto__ || Object.getPrototypeOf(ManualRowMove.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return ManualRowMove;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('ManualRowMove', ManualRowMove);\n\nexports.default = ManualRowMove;\n\n/***/ }),\n/* 461 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _arrayMapper = __webpack_require__(321);\n\nvar _arrayMapper2 = _interopRequireDefault(_arrayMapper);\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class RowsMapper\n * @plugin ManualRowMove\n */\nvar RowsMapper = function () {\n  function RowsMapper(manualRowMove) {\n    _classCallCheck(this, RowsMapper);\n\n    /**\n     * Instance of ManualRowMove plugin.\n     *\n     * @type {ManualRowMove}\n     */\n    this.manualRowMove = manualRowMove;\n  }\n\n  /**\n   * Reset current map array and create new one.\n   *\n   * @param {Number} [length] Custom generated map length.\n   */\n\n\n  _createClass(RowsMapper, [{\n    key: 'createMap',\n    value: function createMap(length) {\n      var _this = this;\n\n      var originLength = length === void 0 ? this._arrayMap.length : length;\n\n      this._arrayMap.length = 0;\n\n      (0, _number.rangeEach)(originLength - 1, function (itemIndex) {\n        _this._arrayMap[itemIndex] = itemIndex;\n      });\n    }\n\n    /**\n     * Destroy class.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this._arrayMap = null;\n    }\n\n    /**\n     *\n     * Moving elements in rowsMapper.\n     * @param {Number} from Row index to move.\n     * @param {Number} to Target index.\n     */\n\n  }, {\n    key: 'moveRow',\n    value: function moveRow(from, to) {\n      var indexToMove = this._arrayMap[from];\n      this._arrayMap[from] = null;\n      this._arrayMap.splice(to, 0, indexToMove);\n    }\n\n    /**\n     * Clearing arrayMap from `null` entries.\n     */\n\n  }, {\n    key: 'clearNull',\n    value: function clearNull() {\n      this._arrayMap = (0, _array.arrayFilter)(this._arrayMap, function (i) {\n        return i !== null;\n      });\n    }\n  }]);\n\n  return RowsMapper;\n}();\n\n(0, _object.mixin)(RowsMapper, _arrayMapper2.default);\n\nexports.default = RowsMapper;\n\n/***/ }),\n/* 462 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(323);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CSS_CLASSNAME = 'ht__manualRowMove--backlight';\n\n/**\n * @class BacklightUI\n * @util\n */\n\nvar BacklightUI = function (_BaseUI) {\n  _inherits(BacklightUI, _BaseUI);\n\n  function BacklightUI() {\n    _classCallCheck(this, BacklightUI);\n\n    return _possibleConstructorReturn(this, (BacklightUI.__proto__ || Object.getPrototypeOf(BacklightUI)).apply(this, arguments));\n  }\n\n  _createClass(BacklightUI, [{\n    key: 'build',\n\n    /**\n     * Custom className on build process.\n     */\n    value: function build() {\n      _get(BacklightUI.prototype.__proto__ || Object.getPrototypeOf(BacklightUI.prototype), 'build', this).call(this);\n\n      (0, _element.addClass)(this._element, CSS_CLASSNAME);\n    }\n  }]);\n\n  return BacklightUI;\n}(_base2.default);\n\nexports.default = BacklightUI;\n\n/***/ }),\n/* 463 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(323);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CSS_CLASSNAME = 'ht__manualRowMove--guideline';\n\n/**\n * @class GuidelineUI\n * @util\n */\n\nvar GuidelineUI = function (_BaseUI) {\n  _inherits(GuidelineUI, _BaseUI);\n\n  function GuidelineUI() {\n    _classCallCheck(this, GuidelineUI);\n\n    return _possibleConstructorReturn(this, (GuidelineUI.__proto__ || Object.getPrototypeOf(GuidelineUI)).apply(this, arguments));\n  }\n\n  _createClass(GuidelineUI, [{\n    key: 'build',\n\n    /**\n     * Custom className on build process.\n     */\n    value: function build() {\n      _get(GuidelineUI.prototype.__proto__ || Object.getPrototypeOf(GuidelineUI.prototype), 'build', this).call(this);\n\n      (0, _element.addClass)(this._element, CSS_CLASSNAME);\n    }\n  }]);\n\n  return GuidelineUI;\n}(_base2.default);\n\nexports.default = GuidelineUI;\n\n/***/ }),\n/* 464 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 465 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _event = __webpack_require__(12);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// Developer note! Whenever you make a change in this file, make an analogous change in manualRowResize.js\n\n/**\n * @description\n * ManualRowResize Plugin.\n *\n * Has 2 UI components:\n * - handle - the draggable element that sets the desired height of the row.\n * - guide - the helper guide that shows the desired height as a horizontal guide.\n *\n * @plugin ManualRowResize\n */\nvar ManualRowResize = function (_BasePlugin) {\n  _inherits(ManualRowResize, _BasePlugin);\n\n  function ManualRowResize(hotInstance) {\n    _classCallCheck(this, ManualRowResize);\n\n    var _this = _possibleConstructorReturn(this, (ManualRowResize.__proto__ || Object.getPrototypeOf(ManualRowResize)).call(this, hotInstance));\n\n    _this.currentTH = null;\n    _this.currentRow = null;\n    _this.selectedRows = [];\n    _this.currentHeight = null;\n    _this.newSize = null;\n    _this.startY = null;\n    _this.startHeight = null;\n    _this.startOffset = null;\n    _this.handle = document.createElement('DIV');\n    _this.guide = document.createElement('DIV');\n    _this.eventManager = new _eventManager2.default(_this);\n    _this.pressed = null;\n    _this.dblclick = 0;\n    _this.autoresizeTimeout = null;\n    _this.manualRowHeights = [];\n\n    (0, _element.addClass)(_this.handle, 'manualRowResizer');\n    (0, _element.addClass)(_this.guide, 'manualRowResizerGuide');\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualRowResize, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().manualRowResize;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.manualRowHeights = [];\n\n      var initialRowHeights = this.hot.getSettings().manualRowResize;\n      var loadedManualRowHeights = this.loadManualRowHeights();\n\n      if (typeof loadedManualRowHeights != 'undefined') {\n        this.manualRowHeights = loadedManualRowHeights;\n      } else if (Array.isArray(initialRowHeights)) {\n        this.manualRowHeights = initialRowHeights;\n      } else {\n        this.manualRowHeights = [];\n      }\n\n      this.addHook('modifyRowHeight', function (height, row) {\n        return _this2.onModifyRowHeight(height, row);\n      });\n\n      // Handsontable.hooks.register('beforeRowResize');\n      // Handsontable.hooks.register('afterRowResize');\n\n      this.bindEvents();\n\n      _get(ManualRowResize.prototype.__proto__ || Object.getPrototypeOf(ManualRowResize.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      var initialRowHeights = this.hot.getSettings().manualRowResize;\n\n      if (Array.isArray(initialRowHeights)) {\n        this.manualRowHeights = initialRowHeights;\n      } else if (!initialRowHeights) {\n        this.manualRowHeights = [];\n      }\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(ManualRowResize.prototype.__proto__ || Object.getPrototypeOf(ManualRowResize.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Save the current sizes using the persistentState plugin.\n     */\n\n  }, {\n    key: 'saveManualRowHeights',\n    value: function saveManualRowHeights() {\n      this.hot.runHooks('persistentStateSave', 'manualRowHeights', this.manualRowHeights);\n    }\n\n    /**\n     * Load the previously saved sizes using the persistentState plugin.\n     *\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'loadManualRowHeights',\n    value: function loadManualRowHeights() {\n      var storedState = {};\n\n      this.hot.runHooks('persistentStateLoad', 'manualRowHeights', storedState);\n\n      return storedState.value;\n    }\n\n    /**\n     * Set the resize handle position.\n     *\n     * @param {HTMLCellElement} TH TH HTML element.\n     */\n\n  }, {\n    key: 'setupHandlePosition',\n    value: function setupHandlePosition(TH) {\n      var _this3 = this;\n\n      this.currentTH = TH;\n      var row = this.hot.view.wt.wtTable.getCoords(TH).row; // getCoords returns CellCoords\n      var headerWidth = (0, _element.outerWidth)(this.currentTH);\n\n      if (row >= 0) {\n        // if not col header\n        var box = this.currentTH.getBoundingClientRect();\n\n        this.currentRow = row;\n        this.selectedRows = [];\n\n        if (this.hot.selection.isSelected() && this.hot.selection.isSelectedByRowHeader()) {\n          var _hot$getSelectedRange = this.hot.getSelectedRangeLast(),\n              from = _hot$getSelectedRange.from,\n              to = _hot$getSelectedRange.to;\n\n          var start = from.row;\n          var end = to.row;\n\n          if (start >= end) {\n            start = to.row;\n            end = from.row;\n          }\n\n          if (this.currentRow >= start && this.currentRow <= end) {\n            (0, _number.rangeEach)(start, end, function (i) {\n              return _this3.selectedRows.push(i);\n            });\n          } else {\n            this.selectedRows.push(this.currentRow);\n          }\n        } else {\n          this.selectedRows.push(this.currentRow);\n        }\n\n        this.startOffset = box.top - 6;\n        this.startHeight = parseInt(box.height, 10);\n        this.handle.style.left = box.left + 'px';\n        this.handle.style.top = this.startOffset + this.startHeight + 'px';\n        this.handle.style.width = headerWidth + 'px';\n        this.hot.rootElement.appendChild(this.handle);\n      }\n    }\n\n    /**\n     * Refresh the resize handle position.\n     */\n\n  }, {\n    key: 'refreshHandlePosition',\n    value: function refreshHandlePosition() {\n      this.handle.style.top = this.startOffset + this.currentHeight + 'px';\n    }\n\n    /**\n     * Set the resize guide position.\n     */\n\n  }, {\n    key: 'setupGuidePosition',\n    value: function setupGuidePosition() {\n      var handleWidth = parseInt((0, _element.outerWidth)(this.handle), 10);\n      var handleRightPosition = parseInt(this.handle.style.left, 10) + handleWidth;\n      var maximumVisibleElementWidth = parseInt(this.hot.view.maximumVisibleElementWidth(0), 10);\n      (0, _element.addClass)(this.handle, 'active');\n      (0, _element.addClass)(this.guide, 'active');\n\n      this.guide.style.top = this.handle.style.top;\n      this.guide.style.left = handleRightPosition + 'px';\n      this.guide.style.width = maximumVisibleElementWidth - handleWidth + 'px';\n      this.hot.rootElement.appendChild(this.guide);\n    }\n\n    /**\n     * Refresh the resize guide position.\n     */\n\n  }, {\n    key: 'refreshGuidePosition',\n    value: function refreshGuidePosition() {\n      this.guide.style.top = this.handle.style.top;\n    }\n\n    /**\n     * Hide both the resize handle and resize guide.\n     */\n\n  }, {\n    key: 'hideHandleAndGuide',\n    value: function hideHandleAndGuide() {\n      (0, _element.removeClass)(this.handle, 'active');\n      (0, _element.removeClass)(this.guide, 'active');\n    }\n\n    /**\n     * Check if provided element is considered as a row header.\n     *\n     * @param {HTMLElement} element HTML element.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'checkIfRowHeader',\n    value: function checkIfRowHeader(element) {\n      if (element != this.hot.rootElement) {\n        var parent = element.parentNode;\n\n        if (parent.tagName === 'TBODY') {\n          return true;\n        }\n\n        return this.checkIfRowHeader(parent);\n      }\n\n      return false;\n    }\n\n    /**\n     * Get the TH element from the provided element.\n     *\n     * @param {HTMLElement} element HTML element.\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'getTHFromTargetElement',\n    value: function getTHFromTargetElement(element) {\n      if (element.tagName != 'TABLE') {\n        if (element.tagName == 'TH') {\n          return element;\n        }\n        return this.getTHFromTargetElement(element.parentNode);\n      }\n\n      return null;\n    }\n\n    /**\n     * 'mouseover' event callback - set the handle position.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseOver',\n    value: function onMouseOver(event) {\n      if (this.checkIfRowHeader(event.target)) {\n        var th = this.getTHFromTargetElement(event.target);\n\n        if (th) {\n          if (!this.pressed) {\n            this.setupHandlePosition(th);\n          }\n        }\n      }\n    }\n\n    /**\n     * Auto-size row after doubleclick - callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'afterMouseDownTimeout',\n    value: function afterMouseDownTimeout() {\n      var _this4 = this;\n\n      var render = function render() {\n        _this4.hot.forceFullRender = true;\n        _this4.hot.view.render(); // updates all\n        _this4.hot.view.wt.wtOverlays.adjustElementsSize(true);\n      };\n      var resize = function resize(selectedRow, forceRender) {\n        var hookNewSize = _this4.hot.runHooks('beforeRowResize', selectedRow, _this4.newSize, true);\n\n        if (hookNewSize !== void 0) {\n          _this4.newSize = hookNewSize;\n        }\n\n        _this4.setManualSize(selectedRow, _this4.newSize); // double click sets auto row size\n\n        if (forceRender) {\n          render();\n        }\n\n        _this4.hot.runHooks('afterRowResize', selectedRow, _this4.newSize, true);\n      };\n\n      if (this.dblclick >= 2) {\n        var selectedRowsLength = this.selectedRows.length;\n\n        if (selectedRowsLength > 1) {\n          (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n            resize(selectedRow);\n          });\n          render();\n        } else {\n          (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n            resize(selectedRow, true);\n          });\n        }\n      }\n      this.dblclick = 0;\n      this.autoresizeTimeout = null;\n    }\n\n    /**\n     * 'mousedown' event callback.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseDown',\n    value: function onMouseDown(event) {\n      var _this5 = this;\n\n      if ((0, _element.hasClass)(event.target, 'manualRowResizer')) {\n        this.setupGuidePosition();\n        this.pressed = this.hot;\n\n        if (this.autoresizeTimeout == null) {\n          this.autoresizeTimeout = setTimeout(function () {\n            return _this5.afterMouseDownTimeout();\n          }, 500);\n\n          this.hot._registerTimeout(this.autoresizeTimeout);\n        }\n        this.dblclick++;\n\n        this.startY = (0, _event.pageY)(event);\n        this.newSize = this.startHeight;\n      }\n    }\n\n    /**\n     * 'mousemove' event callback - refresh the handle and guide positions, cache the new row height.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var _this6 = this;\n\n      if (this.pressed) {\n        this.currentHeight = this.startHeight + ((0, _event.pageY)(event) - this.startY);\n\n        (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n          _this6.newSize = _this6.setManualSize(selectedRow, _this6.currentHeight);\n        });\n\n        this.refreshHandlePosition();\n        this.refreshGuidePosition();\n      }\n    }\n\n    /**\n     * 'mouseup' event callback - apply the row resizing.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp(event) {\n      var _this7 = this;\n\n      var render = function render() {\n        _this7.hot.forceFullRender = true;\n        _this7.hot.view.render(); // updates all\n        _this7.hot.view.wt.wtOverlays.adjustElementsSize(true);\n      };\n      var runHooks = function runHooks(selectedRow, forceRender) {\n        _this7.hot.runHooks('beforeRowResize', selectedRow, _this7.newSize);\n\n        if (forceRender) {\n          render();\n        }\n\n        _this7.saveManualRowHeights();\n\n        _this7.hot.runHooks('afterRowResize', selectedRow, _this7.newSize);\n      };\n      if (this.pressed) {\n        this.hideHandleAndGuide();\n        this.pressed = false;\n\n        if (this.newSize != this.startHeight) {\n          var selectedRowsLength = this.selectedRows.length;\n\n          if (selectedRowsLength > 1) {\n            (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n              runHooks(selectedRow);\n            });\n            render();\n          } else {\n            (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n              runHooks(selectedRow, true);\n            });\n          }\n        }\n\n        this.setupHandlePosition(this.currentTH);\n      }\n    }\n\n    /**\n     * Bind the mouse events.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'bindEvents',\n    value: function bindEvents() {\n      var _this8 = this;\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'mouseover', function (e) {\n        return _this8.onMouseOver(e);\n      });\n      this.eventManager.addEventListener(this.hot.rootElement, 'mousedown', function (e) {\n        return _this8.onMouseDown(e);\n      });\n      this.eventManager.addEventListener(window, 'mousemove', function (e) {\n        return _this8.onMouseMove(e);\n      });\n      this.eventManager.addEventListener(window, 'mouseup', function (e) {\n        return _this8.onMouseUp(e);\n      });\n    }\n\n    /**\n     * Cache the current row height.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} height Row height.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'setManualSize',\n    value: function setManualSize(row, height) {\n      row = this.hot.runHooks('modifyRow', row);\n      this.manualRowHeights[row] = height;\n\n      return height;\n    }\n\n    /**\n     * Modify the provided row height, based on the plugin settings.\n     *\n     * @private\n     * @param {Number} height Row height.\n     * @param {Number} row Visual row index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onModifyRowHeight',\n    value: function onModifyRowHeight(height, row) {\n      if (this.enabled) {\n        var autoRowSizePlugin = this.hot.getPlugin('autoRowSize');\n        var autoRowHeightResult = autoRowSizePlugin ? autoRowSizePlugin.heights[row] : null;\n\n        row = this.hot.runHooks('modifyRow', row);\n\n        var manualRowHeight = this.manualRowHeights[row];\n\n        if (manualRowHeight !== void 0 && (manualRowHeight === autoRowHeightResult || manualRowHeight > (height || 0))) {\n          return manualRowHeight;\n        }\n      }\n\n      return height;\n    }\n  }]);\n\n  return ManualRowResize;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('manualRowResize', ManualRowResize);\n\nexports.default = ManualRowResize;\n\n/***/ }),\n/* 466 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _plugins = __webpack_require__(8);\n\nvar _event = __webpack_require__(12);\n\nvar _src = __webpack_require__(4);\n\nvar _cellsCollection = __webpack_require__(467);\n\nvar _cellsCollection2 = _interopRequireDefault(_cellsCollection);\n\nvar _cellCoords = __webpack_require__(95);\n\nvar _cellCoords2 = _interopRequireDefault(_cellCoords);\n\nvar _autofill = __webpack_require__(468);\n\nvar _autofill2 = _interopRequireDefault(_autofill);\n\nvar _selection = __webpack_require__(469);\n\nvar _selection2 = _interopRequireDefault(_selection);\n\nvar _toggleMerge = __webpack_require__(470);\n\nvar _toggleMerge2 = _interopRequireDefault(_toggleMerge);\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar _console = __webpack_require__(56);\n\nvar _number = __webpack_require__(5);\n\nvar _utils = __webpack_require__(324);\n\n__webpack_require__(471);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('beforeMergeCells');\n_pluginHooks2.default.getSingleton().register('afterMergeCells');\n_pluginHooks2.default.getSingleton().register('beforeUnmergeCells');\n_pluginHooks2.default.getSingleton().register('afterUnmergeCells');\n\nvar privatePool = new WeakMap();\n\n/**\n * @plugin MergeCells\n *\n * @description Plugin, which allows merging cells in the table (using the initial configuration, API or context menu).\n *\n * @example\n *\n * ```js\n * ...\n * let hot = new Handsontable(document.getElementById('example'), {\n *  data: getData(),\n *  mergeCells: [\n *    {row: 0, col: 3, rowspan: 3, colspan: 3},\n *    {row: 2, col: 6, rowspan: 2, colspan: 2},\n *    {row: 4, col: 8, rowspan: 3, colspan: 3}\n *  ],\n * ...\n * ```\n */\n\nvar MergeCells = function (_BasePlugin) {\n  _inherits(MergeCells, _BasePlugin);\n\n  function MergeCells(hotInstance) {\n    _classCallCheck(this, MergeCells);\n\n    var _this = _possibleConstructorReturn(this, (MergeCells.__proto__ || Object.getPrototypeOf(MergeCells)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      lastDesiredCoords: null\n    });\n\n    /**\n     * A container for all the merged cells.\n     *\n     * @type {MergedCellsCollection}\n     */\n    _this.mergedCellsCollection = null;\n    /**\n     * Instance of the class responsible for all the autofill-related calculations.\n     *\n     * @private\n     * @type {AutofillCalculations}\n     */\n    _this.autofillCalculations = null;\n    /**\n     * Instance of the class responsible for the selection-related calculations.\n     *\n     * @private\n     * @type {SelectionCalculations}\n     */\n    _this.selectionCalculations = null;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(MergeCells, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().mergeCells;\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.mergedCellsCollection = new _cellsCollection2.default(this);\n      this.autofillCalculations = new _autofill2.default(this);\n      this.selectionCalculations = new _selection2.default(this);\n\n      this.addHook('afterInit', function () {\n        return _this2.onAfterInit.apply(_this2, arguments);\n      });\n      this.addHook('beforeKeyDown', function () {\n        return _this2.onBeforeKeyDown.apply(_this2, arguments);\n      });\n      this.addHook('modifyTransformStart', function () {\n        return _this2.onModifyTransformStart.apply(_this2, arguments);\n      });\n      this.addHook('afterModifyTransformStart', function () {\n        return _this2.onAfterModifyTransformStart.apply(_this2, arguments);\n      });\n      this.addHook('modifyTransformEnd', function () {\n        return _this2.onModifyTransformEnd.apply(_this2, arguments);\n      });\n      this.addHook('modifyGetCellCoords', function () {\n        return _this2.onModifyGetCellCoords.apply(_this2, arguments);\n      });\n      this.addHook('beforeSetRangeEnd', function () {\n        return _this2.onBeforeSetRangeEnd.apply(_this2, arguments);\n      });\n      this.addHook('afterIsMultipleSelection', function () {\n        return _this2.onAfterIsMultipleSelection.apply(_this2, arguments);\n      });\n      this.addHook('afterRenderer', function () {\n        return _this2.onAfterRenderer.apply(_this2, arguments);\n      });\n      this.addHook('afterContextMenuDefaultOptions', function () {\n        return _this2.addMergeActionsToContextMenu.apply(_this2, arguments);\n      });\n      this.addHook('afterGetCellMeta', function () {\n        return _this2.onAfterGetCellMeta.apply(_this2, arguments);\n      });\n      this.addHook('afterViewportRowCalculatorOverride', function () {\n        return _this2.onAfterViewportRowCalculatorOverride.apply(_this2, arguments);\n      });\n      this.addHook('afterViewportColumnCalculatorOverride', function () {\n        return _this2.onAfterViewportColumnCalculatorOverride.apply(_this2, arguments);\n      });\n      this.addHook('modifyAutofillRange', function () {\n        return _this2.onModifyAutofillRange.apply(_this2, arguments);\n      });\n      this.addHook('afterCreateCol', function () {\n        return _this2.onAfterCreateCol.apply(_this2, arguments);\n      });\n      this.addHook('afterRemoveCol', function () {\n        return _this2.onAfterRemoveCol.apply(_this2, arguments);\n      });\n      this.addHook('afterCreateRow', function () {\n        return _this2.onAfterCreateRow.apply(_this2, arguments);\n      });\n      this.addHook('afterRemoveRow', function () {\n        return _this2.onAfterRemoveRow.apply(_this2, arguments);\n      });\n      this.addHook('afterChange', function () {\n        return _this2.onAfterChange.apply(_this2, arguments);\n      });\n      this.addHook('beforeDrawBorders', function () {\n        return _this2.onBeforeDrawAreaBorders.apply(_this2, arguments);\n      });\n      this.addHook('afterDrawSelection', function () {\n        return _this2.onAfterDrawSelection.apply(_this2, arguments);\n      });\n      this.addHook('beforeRemoveCellClassNames', function () {\n        return _this2.onBeforeRemoveCellClassNames.apply(_this2, arguments);\n      });\n\n      _get(MergeCells.prototype.__proto__ || Object.getPrototypeOf(MergeCells.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable the plugin.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.clearCollections();\n      this.hot.render();\n      _get(MergeCells.prototype.__proto__ || Object.getPrototypeOf(MergeCells.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Update the plugin (after using the `updateSettings` method)\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      var settings = this.hot.getSettings().mergeCells;\n\n      this.clearCollections();\n      this.disablePlugin();\n      this.enablePlugin();\n\n      this.generateFromSettings(settings);\n\n      _get(MergeCells.prototype.__proto__ || Object.getPrototypeOf(MergeCells.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Validate a single setting object, represented by a single merged cell information object.\n     *\n     * @private\n     * @param {Object} setting An object with `row`, `col`, `rowspan` and `colspan` properties.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'validateSetting',\n    value: function validateSetting(setting) {\n      var valid = true;\n\n      if (!setting) {\n        return false;\n      }\n\n      if (_cellCoords2.default.containsNegativeValues(setting)) {\n        (0, _console.warn)(_cellCoords2.default.NEGATIVE_VALUES_WARNING(setting));\n\n        valid = false;\n      } else if (_cellCoords2.default.isOutOfBounds(setting, this.hot.countRows(), this.hot.countCols())) {\n        (0, _console.warn)(_cellCoords2.default.IS_OUT_OF_BOUNDS_WARNING(setting));\n\n        valid = false;\n      } else if (_cellCoords2.default.isSingleCell(setting)) {\n        (0, _console.warn)(_cellCoords2.default.IS_SINGLE_CELL(setting));\n\n        valid = false;\n      } else if (_cellCoords2.default.containsZeroSpan(setting)) {\n        (0, _console.warn)(_cellCoords2.default.ZERO_SPAN_WARNING(setting));\n\n        valid = false;\n      }\n\n      return valid;\n    }\n\n    /**\n     * Generate the merged cells from the settings provided to the plugin.\n     *\n     * @private\n     * @param {Array|Boolean} settings The settings provided to the plugin.\n     */\n\n  }, {\n    key: 'generateFromSettings',\n    value: function generateFromSettings(settings) {\n      var _this3 = this;\n\n      if (Array.isArray(settings)) {\n        var _hot;\n\n        var populationArgumentsList = [];\n\n        (0, _array.arrayEach)(settings, function (setting) {\n          if (!_this3.validateSetting(setting)) {\n            return;\n          }\n\n          var highlight = new _src.CellCoords(setting.row, setting.col);\n          var rangeEnd = new _src.CellCoords(setting.row + setting.rowspan - 1, setting.col + setting.colspan - 1);\n          var mergeRange = new _src.CellRange(highlight, highlight, rangeEnd);\n\n          populationArgumentsList.push(_this3.mergeRange(mergeRange, true, true));\n        });\n\n        // remove 'empty' setting objects, caused by improper merge range declarations\n        populationArgumentsList = populationArgumentsList.filter(function (value) {\n          return value !== true;\n        });\n\n        var bulkPopulationData = this.getBulkCollectionData(populationArgumentsList);\n\n        (_hot = this.hot).populateFromArray.apply(_hot, _toConsumableArray(bulkPopulationData));\n      }\n    }\n\n    /**\n     * Generates a bulk set of all the data to be populated to fill the data \"under\" the added merged cells.\n     *\n     * @private\n     * @param {Array} populationArgumentsList Array in a form of `[row, column, dataUnderCollection]`.\n     * @return {Array} Array in a form of `[row, column, dataOfAllCollections]`.\n     */\n\n  }, {\n    key: 'getBulkCollectionData',\n    value: function getBulkCollectionData(populationArgumentsList) {\n      var _hot2;\n\n      var populationDataRange = this.getBulkCollectionDataRange(populationArgumentsList);\n      var dataAtRange = (_hot2 = this.hot).getData.apply(_hot2, _toConsumableArray(populationDataRange));\n      var newDataAtRange = dataAtRange.splice(0);\n\n      (0, _array.arrayEach)(populationArgumentsList, function (mergedCellArguments) {\n        var _mergedCellArguments = _slicedToArray(mergedCellArguments, 3),\n            mergedCellRowIndex = _mergedCellArguments[0],\n            mergedCellColumnIndex = _mergedCellArguments[1],\n            mergedCellData = _mergedCellArguments[2];\n\n        (0, _array.arrayEach)(mergedCellData, function (mergedCellRow, rowIndex) {\n          (0, _array.arrayEach)(mergedCellRow, function (mergedCellElement, columnIndex) {\n            newDataAtRange[mergedCellRowIndex - populationDataRange[0] + rowIndex][mergedCellColumnIndex - populationDataRange[1] + columnIndex] = mergedCellElement;\n          });\n        });\n      });\n\n      return [populationDataRange[0], populationDataRange[1], newDataAtRange];\n    }\n\n    /**\n     * Get the range of combined data ranges provided in a form of an array of arrays ([row, column, dataUnderCollection])\n     *\n     * @private\n     * @param {Array} populationArgumentsList Array containing argument lists for the `populateFromArray` method - row, column and data for population.\n     * @return {Array[]} Start and end coordinates of the merged cell range. (in a form of [rowIndex, columnIndex])\n     */\n\n  }, {\n    key: 'getBulkCollectionDataRange',\n    value: function getBulkCollectionDataRange(populationArgumentsList) {\n      var start = [0, 0];\n      var end = [0, 0];\n      var mergedCellRow = null;\n      var mergedCellColumn = null;\n      var mergedCellData = null;\n\n      (0, _array.arrayEach)(populationArgumentsList, function (mergedCellArguments) {\n        mergedCellRow = mergedCellArguments[0];\n        mergedCellColumn = mergedCellArguments[1];\n        mergedCellData = mergedCellArguments[2];\n\n        start[0] = Math.min(mergedCellRow, start[0]);\n        start[1] = Math.min(mergedCellColumn, start[1]);\n        end[0] = Math.max(mergedCellRow + mergedCellData.length - 1, end[0]);\n        end[1] = Math.max(mergedCellColumn + mergedCellData[0].length - 1, end[1]);\n      });\n\n      return [].concat(start, end);\n    }\n\n    /**\n     * Clear the merged cells from the merged cell container.\n     */\n\n  }, {\n    key: 'clearCollections',\n    value: function clearCollections() {\n      this.mergedCellsCollection.clear();\n    }\n\n    /**\n     * Returns `true` if a range is mergeable.\n     *\n     * @private\n     * @param {Object} newMergedCellInfo Merged cell information object to test.\n     * @param {Boolean} [auto=false] `true` if triggered at initialization.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'canMergeRange',\n    value: function canMergeRange(newMergedCellInfo) {\n      var auto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      return auto ? true : this.validateSetting(newMergedCellInfo);\n    }\n\n    /**\n     * Merge or unmerge, based on last selected range.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'toggleMergeOnSelection',\n    value: function toggleMergeOnSelection() {\n      var currentRange = this.hot.getSelectedRangeLast();\n\n      if (!currentRange) {\n        return;\n      }\n\n      currentRange.setDirection('NW-SE');\n\n      var from = currentRange.from,\n          to = currentRange.to;\n\n\n      this.toggleMerge(currentRange);\n      this.hot.selectCell(from.row, from.col, to.row, to.col, false);\n    }\n\n    /**\n     * Merge the selection provided as a cell range.\n     *\n     * @param {CellRange} [cellRange] Selection cell range.\n     */\n\n  }, {\n    key: 'mergeSelection',\n    value: function mergeSelection() {\n      var cellRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.hot.getSelectedRangeLast();\n\n      if (!cellRange) {\n        return;\n      }\n\n      cellRange.setDirection('NW-SE');\n\n      var from = cellRange.from,\n          to = cellRange.to;\n\n\n      this.unmergeRange(cellRange, true);\n      this.mergeRange(cellRange);\n      this.hot.selectCell(from.row, from.col, to.row, to.col, false);\n    }\n\n    /**\n     * Unmerge the selection provided as a cell range.\n     *\n     * @param {CellRange} [cellRange] Selection cell range.\n     */\n\n  }, {\n    key: 'unmergeSelection',\n    value: function unmergeSelection() {\n      var cellRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.hot.getSelectedRangeLast();\n\n      if (!cellRange) {\n        return;\n      }\n\n      var from = cellRange.from,\n          to = cellRange.to;\n\n\n      this.unmergeRange(cellRange, true);\n      this.hot.selectCell(from.row, from.col, to.row, to.col, false);\n    }\n\n    /**\n     * Merge cells in the provided cell range.\n     *\n     * @private\n     * @param {CellRange} cellRange Cell range to merge.\n     * @param {Boolean} [auto=false] `true` if is called automatically, e.g. at initialization.\n     * @param {Boolean} [preventPopulation=false] `true`, if the method should not run `populateFromArray` at the end, but rather return its arguments.\n     * @returns {Array|Boolean} Returns an array of [row, column, dataUnderCollection] if preventPopulation is set to true. If the the merging process went successful, it returns `true`, otherwise - `false`.\n     * @fires Hooks#beforeMergeCells\n     * @fires Hooks#afterMergeCells\n     */\n\n  }, {\n    key: 'mergeRange',\n    value: function mergeRange(cellRange) {\n      var _this4 = this;\n\n      var auto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n      var preventPopulation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      var topLeft = cellRange.getTopLeftCorner();\n      var bottomRight = cellRange.getBottomRightCorner();\n      var mergeParent = {\n        row: topLeft.row,\n        col: topLeft.col,\n        rowspan: bottomRight.row - topLeft.row + 1,\n        colspan: bottomRight.col - topLeft.col + 1\n      };\n      var clearedData = [];\n      var populationInfo = null;\n\n      if (!this.canMergeRange(mergeParent, auto)) {\n        return false;\n      }\n\n      this.hot.runHooks('beforeMergeCells', cellRange, auto);\n\n      (0, _number.rangeEach)(0, mergeParent.rowspan - 1, function (i) {\n        (0, _number.rangeEach)(0, mergeParent.colspan - 1, function (j) {\n          var clearedValue = null;\n\n          if (!clearedData[i]) {\n            clearedData[i] = [];\n          }\n\n          if (i === 0 && j === 0) {\n            clearedValue = _this4.hot.getDataAtCell(mergeParent.row, mergeParent.col);\n          } else {\n            _this4.hot.setCellMeta(mergeParent.row + i, mergeParent.col + j, 'hidden', true);\n          }\n\n          clearedData[i][j] = clearedValue;\n        });\n      });\n\n      this.hot.setCellMeta(mergeParent.row, mergeParent.col, 'spanned', true);\n\n      var mergedCellAdded = this.mergedCellsCollection.add(mergeParent);\n\n      if (mergedCellAdded) {\n        if (preventPopulation) {\n          populationInfo = [mergeParent.row, mergeParent.col, clearedData];\n        } else {\n          this.hot.populateFromArray(mergeParent.row, mergeParent.col, clearedData, void 0, void 0, this.pluginName);\n        }\n\n        this.hot.runHooks('afterMergeCells', cellRange, mergeParent, auto);\n\n        return populationInfo;\n      }\n\n      return true;\n    }\n\n    /**\n     * Unmerge the selection provided as a cell range. If no cell range is provided, it uses the current selection.\n     *\n     * @private\n     * @param {CellRange} cellRange Selection cell range.\n     * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n     */\n\n  }, {\n    key: 'unmergeRange',\n    value: function unmergeRange(cellRange) {\n      var _this5 = this;\n\n      var auto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      var mergedCells = this.mergedCellsCollection.getWithinRange(cellRange);\n\n      if (!mergedCells) {\n        return;\n      }\n\n      this.hot.runHooks('beforeUnmergeCells', cellRange, auto);\n\n      (0, _array.arrayEach)(mergedCells, function (currentCollection) {\n        _this5.mergedCellsCollection.remove(currentCollection.row, currentCollection.col);\n\n        (0, _number.rangeEach)(0, currentCollection.rowspan - 1, function (i) {\n          (0, _number.rangeEach)(0, currentCollection.colspan - 1, function (j) {\n            _this5.hot.removeCellMeta(currentCollection.row + i, currentCollection.col + j, 'hidden');\n          });\n        });\n\n        _this5.hot.removeCellMeta(currentCollection.row, currentCollection.col, 'spanned');\n      });\n\n      this.hot.render();\n      this.hot.runHooks('afterUnmergeCells', cellRange, auto);\n    }\n\n    /**\n     * Merge or unmerge, based on the cell range provided as `cellRange`.\n     *\n     * @private\n     * @param {CellRange} cellRange The cell range to merge or unmerged.\n     */\n\n  }, {\n    key: 'toggleMerge',\n    value: function toggleMerge(cellRange) {\n      var mergedCell = this.mergedCellsCollection.get(cellRange.from.row, cellRange.from.col);\n      var mergedCellCoversWholeRange = mergedCell.row === cellRange.from.row && mergedCell.col === cellRange.from.col && mergedCell.row + mergedCell.rowspan - 1 === cellRange.to.row && mergedCell.col + mergedCell.colspan - 1 === cellRange.to.col;\n\n      if (mergedCellCoversWholeRange) {\n        this.unmergeRange(cellRange);\n      } else {\n        this.mergeSelection(cellRange);\n      }\n    }\n\n    /**\n     * Merge the specified range.\n     *\n     * @param {Number} startRow Start row of the merged cell.\n     * @param {Number} startColumn Start column of the merged cell.\n     * @param {Number} endRow End row of the merged cell.\n     * @param {Number} endColumn End column of the merged cell.\n     */\n\n  }, {\n    key: 'merge',\n    value: function merge(startRow, startColumn, endRow, endColumn) {\n      var start = new _src.CellCoords(startRow, startColumn);\n      var end = new _src.CellCoords(endRow, endColumn);\n\n      this.mergeRange(new _src.CellRange(start, start, end));\n    }\n\n    /**\n     * Unmerge the merged cell in the provided range.\n     *\n     * @param {Number} startRow Start row of the merged cell.\n     * @param {Number} startColumn Start column of the merged cell.\n     * @param {Number} endRow End row of the merged cell.\n     * @param {Number} endColumn End column of the merged cell.\n     */\n\n  }, {\n    key: 'unmerge',\n    value: function unmerge(startRow, startColumn, endRow, endColumn) {\n      var start = new _src.CellCoords(startRow, startColumn);\n      var end = new _src.CellCoords(endRow, endColumn);\n\n      this.unmergeRange(new _src.CellRange(start, start, end));\n    }\n\n    /**\n     * `afterInit` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      this.generateFromSettings(this.hot.getSettings().mergeCells);\n      this.hot.render();\n    }\n\n    /**\n     * `beforeKeyDown` hook callback.\n     *\n     * @private\n     * @param {KeyboardEvent} event The `keydown` event object.\n     */\n\n  }, {\n    key: 'onBeforeKeyDown',\n    value: function onBeforeKeyDown(event) {\n      var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey;\n\n      if (ctrlDown && event.keyCode === 77) {\n        // CTRL + M\n        this.toggleMerge(this.hot.getSelectedRangeLast());\n\n        this.hot.render();\n        (0, _event.stopImmediatePropagation)(event);\n      }\n    }\n\n    /**\n     * Modify the information on whether the current selection contains multiple cells. The `afterIsMultipleSelection` hook callback.\n     *\n     * @private\n     * @param {Boolean} isMultiple\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'onAfterIsMultipleSelection',\n    value: function onAfterIsMultipleSelection(isMultiple) {\n      if (isMultiple) {\n        var mergedCells = this.mergedCellsCollection.mergedCells;\n        var selectionRange = this.hot.getSelectedRangeLast();\n\n        for (var group = 0; group < mergedCells.length; group += 1) {\n          if (selectionRange.highlight.row === mergedCells[group].row && selectionRange.highlight.col === mergedCells[group].col && selectionRange.to.row === mergedCells[group].row + mergedCells[group].rowspan - 1 && selectionRange.to.col === mergedCells[group].col + mergedCells[group].colspan - 1) {\n            return false;\n          }\n        }\n      }\n\n      return isMultiple;\n    }\n\n    /**\n     * `modifyTransformStart` hook callback.\n     *\n     * @private\n     * @param {Object} delta The transformation delta.\n     */\n\n  }, {\n    key: 'onModifyTransformStart',\n    value: function onModifyTransformStart(delta) {\n      var priv = privatePool.get(this);\n      var currentlySelectedRange = this.hot.getSelectedRangeLast();\n      var newDelta = {\n        row: delta.row,\n        col: delta.col\n      };\n      var nextPosition = null;\n      var currentPosition = new _src.CellCoords(currentlySelectedRange.highlight.row, currentlySelectedRange.highlight.col);\n      var mergedParent = this.mergedCellsCollection.get(currentPosition.row, currentPosition.col);\n\n      if (!priv.lastDesiredCoords) {\n        priv.lastDesiredCoords = new _src.CellCoords(null, null);\n      }\n\n      if (mergedParent) {\n        // only merge selected\n        var mergeTopLeft = new _src.CellCoords(mergedParent.row, mergedParent.col);\n        var mergeBottomRight = new _src.CellCoords(mergedParent.row + mergedParent.rowspan - 1, mergedParent.col + mergedParent.colspan - 1);\n        var mergeRange = new _src.CellRange(mergeTopLeft, mergeTopLeft, mergeBottomRight);\n\n        if (!mergeRange.includes(priv.lastDesiredCoords)) {\n          priv.lastDesiredCoords = new _src.CellCoords(null, null); // reset outdated version of lastDesiredCoords\n        }\n\n        newDelta.row = priv.lastDesiredCoords.row ? priv.lastDesiredCoords.row - currentPosition.row : newDelta.row;\n        newDelta.col = priv.lastDesiredCoords.col ? priv.lastDesiredCoords.col - currentPosition.col : newDelta.col;\n\n        if (delta.row > 0) {\n          // moving down\n          newDelta.row = mergedParent.row + mergedParent.rowspan - 1 - currentPosition.row + delta.row;\n        } else if (delta.row < 0) {\n          // moving up\n          newDelta.row = currentPosition.row - mergedParent.row + delta.row;\n        }\n\n        if (delta.col > 0) {\n          // moving right\n          newDelta.col = mergedParent.col + mergedParent.colspan - 1 - currentPosition.col + delta.col;\n        } else if (delta.col < 0) {\n          // moving left\n          newDelta.col = currentPosition.col - mergedParent.col + delta.col;\n        }\n      }\n\n      nextPosition = new _src.CellCoords(currentlySelectedRange.highlight.row + newDelta.row, currentlySelectedRange.highlight.col + newDelta.col);\n\n      var nextParentIsMerged = this.mergedCellsCollection.get(nextPosition.row, nextPosition.col);\n\n      if (nextParentIsMerged) {\n        // skipping the invisible cells in the merge range\n        priv.lastDesiredCoords = nextPosition;\n        newDelta = {\n          row: nextParentIsMerged.row - currentPosition.row,\n          col: nextParentIsMerged.col - currentPosition.col\n        };\n      }\n\n      if (newDelta.row !== 0) {\n        delta.row = newDelta.row;\n      }\n      if (newDelta.col !== 0) {\n        delta.col = newDelta.col;\n      }\n    }\n\n    /**\n     * `modifyTransformEnd` hook callback. Needed to handle \"jumping over\" merged merged cells, while selecting.\n     *\n     * @private\n     * @param {Object} delta The transformation delta.\n     */\n\n  }, {\n    key: 'onModifyTransformEnd',\n    value: function onModifyTransformEnd(delta) {\n      var _this6 = this;\n\n      var currentSelectionRange = this.hot.getSelectedRangeLast();\n      var newDelta = (0, _object.clone)(delta);\n      var newSelectionRange = this.selectionCalculations.getUpdatedSelectionRange(currentSelectionRange, delta);\n      var tempDelta = (0, _object.clone)(newDelta);\n\n      var mergedCellsWithinRange = this.mergedCellsCollection.getWithinRange(newSelectionRange, true);\n\n      do {\n        tempDelta = (0, _object.clone)(newDelta);\n        this.selectionCalculations.getUpdatedSelectionRange(currentSelectionRange, newDelta);\n\n        (0, _array.arrayEach)(mergedCellsWithinRange, function (mergedCell) {\n          _this6.selectionCalculations.snapDelta(newDelta, currentSelectionRange, mergedCell);\n        });\n      } while (newDelta.row !== tempDelta.row || newDelta.col !== tempDelta.col);\n\n      delta.row = newDelta.row;\n      delta.col = newDelta.col;\n    }\n\n    /**\n     * `modifyGetCellCoords` hook callback. Swaps the `getCell` coords with the merged parent coords.\n     *\n     * @private\n     * @param {Number} row Row index.\n     * @param {Number} column Column index.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'onModifyGetCellCoords',\n    value: function onModifyGetCellCoords(row, column) {\n      var mergeParent = this.mergedCellsCollection.get(row, column);\n\n      return mergeParent ? [mergeParent.row, mergeParent.col, mergeParent.row + mergeParent.rowspan - 1, mergeParent.col + mergeParent.colspan - 1] : void 0;\n    }\n\n    /**\n     * `afterContextMenuDefaultOptions` hook callback.\n     *\n     * @private\n     * @param {Object} defaultOptions The default context menu options.\n     */\n\n  }, {\n    key: 'addMergeActionsToContextMenu',\n    value: function addMergeActionsToContextMenu(defaultOptions) {\n      defaultOptions.items.push({\n        name: '---------'\n      }, (0, _toggleMerge2.default)(this));\n    }\n\n    /**\n     * `afterRenderer` hook callback.\n     *\n     * @private\n     * @param {HTMLElement} TD The cell to be modified.\n     * @param {Number} row Row index.\n     * @param {Number} col Column index.\n     */\n\n  }, {\n    key: 'onAfterRenderer',\n    value: function onAfterRenderer(TD, row, col) {\n      var mergedCell = this.mergedCellsCollection.get(row, col);\n\n      (0, _utils.applySpanProperties)(TD, mergedCell, row, col);\n    }\n\n    /**\n     * `beforeSetRangeEnd` hook callback.\n     * While selecting cells with keyboard or mouse, make sure that rectangular area is expanded to the extent of the merged cell\n     *\n     * @private\n     * @param {Object} coords Cell coords.\n     */\n\n  }, {\n    key: 'onBeforeSetRangeEnd',\n    value: function onBeforeSetRangeEnd(coords) {\n      var selRange = this.hot.getSelectedRangeLast();\n      selRange.highlight = new _src.CellCoords(selRange.highlight.row, selRange.highlight.col); // clone in case we will modify its reference\n      selRange.to = coords;\n      var rangeExpanded = false;\n\n      if (selRange.from.row === 0 && selRange.to.row === this.hot.countRows() - 1 || selRange.from.col === 0 && selRange.to.col === this.hot.countCols() - 1) {\n        return;\n      }\n\n      do {\n        rangeExpanded = false;\n\n        for (var i = 0; i < this.mergedCellsCollection.mergedCells.length; i += 1) {\n          var cellInfo = this.mergedCellsCollection.mergedCells[i];\n          var mergedCellRange = cellInfo.getRange();\n\n          if (selRange.expandByRange(mergedCellRange)) {\n            coords.row = selRange.to.row;\n            coords.col = selRange.to.col;\n\n            rangeExpanded = true;\n          }\n        }\n      } while (rangeExpanded);\n    }\n\n    /**\n     * The `afterGetCellMeta` hook callback.\n     *\n     * @private\n     * @param {Number} row Row index.\n     * @param {Number} col Column index.\n     * @param {Object} cellProperties The cell properties object.\n     */\n\n  }, {\n    key: 'onAfterGetCellMeta',\n    value: function onAfterGetCellMeta(row, col, cellProperties) {\n      var mergeParent = this.mergedCellsCollection.get(row, col);\n\n      if (mergeParent && (mergeParent.row !== row || mergeParent.col !== col)) {\n        cellProperties.copyable = false;\n      }\n    }\n\n    /**\n     * `afterViewportRowCalculatorOverride` hook callback.\n     *\n     * @private\n     * @param {Object} calc The row calculator object.\n     */\n\n  }, {\n    key: 'onAfterViewportRowCalculatorOverride',\n    value: function onAfterViewportRowCalculatorOverride(calc) {\n      var _this7 = this;\n\n      var colCount = this.hot.countCols();\n      var mergeParent = void 0;\n\n      (0, _number.rangeEach)(0, colCount - 1, function (c) {\n        mergeParent = _this7.mergedCellsCollection.get(calc.startRow, c);\n        if (mergeParent) {\n          if (mergeParent.row < calc.startRow) {\n            calc.startRow = mergeParent.row;\n            return _this7.onAfterViewportRowCalculatorOverride.call(_this7, calc); // recursively search upwards\n          }\n        }\n\n        mergeParent = _this7.mergedCellsCollection.get(calc.endRow, c);\n\n        if (mergeParent) {\n          var mergeEnd = mergeParent.row + mergeParent.rowspan - 1;\n          if (mergeEnd > calc.endRow) {\n            calc.endRow = mergeEnd;\n            return _this7.onAfterViewportRowCalculatorOverride.call(_this7, calc); // recursively search upwards\n          }\n        }\n\n        return true;\n      });\n    }\n\n    /**\n     * `afterViewportColumnCalculatorOverride` hook callback.\n     *\n     * @private\n     * @param {Object} calc The column calculator object.\n     */\n\n  }, {\n    key: 'onAfterViewportColumnCalculatorOverride',\n    value: function onAfterViewportColumnCalculatorOverride(calc) {\n      var _this8 = this;\n\n      var rowCount = this.hot.countRows();\n      var mergeParent = void 0;\n\n      (0, _number.rangeEach)(0, rowCount - 1, function (r) {\n        mergeParent = _this8.mergedCellsCollection.get(r, calc.startColumn);\n\n        if (mergeParent && mergeParent.col < calc.startColumn) {\n          calc.startColumn = mergeParent.col;\n          return _this8.onAfterViewportColumnCalculatorOverride.call(_this8, calc); // recursively search upwards\n        }\n\n        mergeParent = _this8.mergedCellsCollection.get(r, calc.endColumn);\n\n        if (mergeParent) {\n          var mergeEnd = mergeParent.col + mergeParent.colspan - 1;\n          if (mergeEnd > calc.endColumn) {\n            calc.endColumn = mergeEnd;\n            return _this8.onAfterViewportColumnCalculatorOverride.call(_this8, calc); // recursively search upwards\n          }\n        }\n\n        return true;\n      });\n    }\n\n    /**\n     * The `modifyAutofillRange` hook callback.\n     *\n     * @private\n     * @param {Array} drag The drag area coordinates.\n     * @param {Array} select The selection information.\n     * @return {Array} The new drag area.\n     */\n\n  }, {\n    key: 'onModifyAutofillRange',\n    value: function onModifyAutofillRange(drag, select) {\n      this.autofillCalculations.correctSelectionAreaSize(select);\n      var dragDirection = this.autofillCalculations.getDirection(select, drag);\n\n      if (this.autofillCalculations.dragAreaOverlapsCollections(select, drag, dragDirection)) {\n        drag = select;\n        return drag;\n      }\n\n      var mergedCellsWithinSelectionArea = this.mergedCellsCollection.getWithinRange({\n        from: { row: select[0], col: select[1] },\n        to: { row: select[2], col: select[3] }\n      });\n\n      if (!mergedCellsWithinSelectionArea) {\n        return drag;\n      }\n\n      drag = this.autofillCalculations.snapDragArea(select, drag, dragDirection, mergedCellsWithinSelectionArea);\n\n      return drag;\n    }\n\n    /**\n     * `afterCreateCol` hook callback.\n     *\n     * @private\n     * @param {Number} column Column index.\n     * @param {Number} count Number of created columns.\n     */\n\n  }, {\n    key: 'onAfterCreateCol',\n    value: function onAfterCreateCol(column, count) {\n      this.mergedCellsCollection.shiftCollections('right', column, count);\n    }\n\n    /**\n     * `afterRemoveCol` hook callback.\n     *\n     * @private\n     * @param {Number} column Column index.\n     * @param {Number} count Number of removed columns.\n     */\n\n  }, {\n    key: 'onAfterRemoveCol',\n    value: function onAfterRemoveCol(column, count) {\n      this.mergedCellsCollection.shiftCollections('left', column, count);\n    }\n\n    /**\n     * `afterCreateRow` hook callback.\n     *\n     * @private\n     * @param {Number} row Row index.\n     * @param {Number} count Number of created rows.\n     * @param {String} source Source of change.\n     */\n\n  }, {\n    key: 'onAfterCreateRow',\n    value: function onAfterCreateRow(row, count, source) {\n      if (source === 'auto') {\n        return;\n      }\n\n      this.mergedCellsCollection.shiftCollections('down', row, count);\n    }\n\n    /**\n     * `afterRemoveRow` hook callback.\n     *\n     * @private\n     * @param {Number} row Row index.\n     * @param {Number} count Number of removed rows.\n     */\n\n  }, {\n    key: 'onAfterRemoveRow',\n    value: function onAfterRemoveRow(row, count) {\n      this.mergedCellsCollection.shiftCollections('up', row, count);\n    }\n\n    /**\n     * `afterChange` hook callback. Used to propagate merged cells after using Autofill.\n     *\n     * @private\n     * @param {Array} changes The changes array.\n     * @param {String} source Determines the source of the change.\n     */\n\n  }, {\n    key: 'onAfterChange',\n    value: function onAfterChange(changes, source) {\n      if (source !== 'Autofill.fill') {\n        return;\n      }\n\n      this.autofillCalculations.recreateAfterDataPopulation(changes);\n    }\n\n    /**\n     * `beforeDrawAreaBorders` hook callback.\n     *\n     * @private\n     * @param {Array} corners Coordinates of the area corners.\n     * @param {String} className Class name for the area.\n     */\n\n  }, {\n    key: 'onBeforeDrawAreaBorders',\n    value: function onBeforeDrawAreaBorders(corners, className) {\n      if (className && className === 'area') {\n        var selectedRange = this.hot.getSelectedRangeLast();\n        var mergedCellsWithinRange = this.mergedCellsCollection.getWithinRange(selectedRange);\n\n        (0, _array.arrayEach)(mergedCellsWithinRange, function (mergedCell) {\n          if (selectedRange.getBottomRightCorner().row === mergedCell.getLastRow() && selectedRange.getBottomRightCorner().col === mergedCell.getLastColumn()) {\n            corners[2] = mergedCell.row;\n            corners[3] = mergedCell.col;\n          }\n        });\n      }\n    }\n\n    /**\n     * `afterModifyTransformStart` hook callback. Fixes a problem with navigating through merged cells at the edges of the table\n     * with the ENTER/SHIFT+ENTER/TAB/SHIFT+TAB keys.\n     *\n     * @private\n     * @param {CellCoords} coords Coordinates of the to-be-selected cell.\n     * @param {Number} rowTransformDir Row transformation direction (negative value = up, 0 = none, positive value = down)\n     * @param {Number} colTransformDir Column transformation direction (negative value = up, 0 = none, positive value = down)\n     */\n\n  }, {\n    key: 'onAfterModifyTransformStart',\n    value: function onAfterModifyTransformStart(coords, rowTransformDir, colTransformDir) {\n      if (!this.enabled) {\n        return;\n      }\n\n      var mergedCellAtCoords = this.mergedCellsCollection.get(coords.row, coords.col);\n\n      if (!mergedCellAtCoords) {\n        return;\n      }\n\n      var goingDown = rowTransformDir > 0;\n      var goingUp = rowTransformDir < 0;\n      var goingLeft = colTransformDir < 0;\n      var goingRight = colTransformDir > 0;\n      var mergedCellOnBottomEdge = mergedCellAtCoords.row + mergedCellAtCoords.rowspan - 1 === this.hot.countRows() - 1;\n      var mergedCellOnTopEdge = mergedCellAtCoords.row === 0;\n      var mergedCellOnRightEdge = mergedCellAtCoords.col + mergedCellAtCoords.colspan - 1 === this.hot.countCols() - 1;\n      var mergedCellOnLeftEdge = mergedCellAtCoords.col === 0;\n\n      if (goingDown && mergedCellOnBottomEdge || goingUp && mergedCellOnTopEdge || goingRight && mergedCellOnRightEdge || goingLeft && mergedCellOnLeftEdge) {\n        coords.row = mergedCellAtCoords.row;\n        coords.col = mergedCellAtCoords.col;\n      }\n    }\n\n    /**\n     * `afterDrawSelection` hook callback. Used to add the additional class name for the entirely-selected merged cells.\n     *\n     * @private\n     * @param {Number} currentRow Row index of the currently processed cell.\n     * @param {Number} currentColumn Column index of the currently cell.\n     * @param {Array} cornersOfSelection Array of the current selection in a form of `[startRow, startColumn, endRow, endColumn]`.\n     * @param {Number|undefined} layerLevel Number indicating which layer of selection is currently processed.\n     * @returns {String|undefined} A `String`, which will act as an additional `className` to be added to the currently processed cell.\n     */\n\n  }, {\n    key: 'onAfterDrawSelection',\n    value: function onAfterDrawSelection(currentRow, currentColumn, cornersOfSelection, layerLevel) {\n      return this.selectionCalculations.getSelectedMergedCellClassName(currentRow, currentColumn, cornersOfSelection, layerLevel);\n    }\n\n    /**\n     * `beforeRemoveCellClassNames` hook callback. Used to remove additional class name from all cells in the table.\n     *\n     * @private\n     * @returns {String[]} An `Array` of `String`s. Each of these strings will act like class names to be removed from all the cells in the table.\n     */\n\n  }, {\n    key: 'onBeforeRemoveCellClassNames',\n    value: function onBeforeRemoveCellClassNames() {\n      return this.selectionCalculations.getSelectedMergedCellClassNameToRemove();\n    }\n  }]);\n\n  return MergeCells;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('mergeCells', MergeCells);\n\nexports.default = MergeCells;\n\n/***/ }),\n/* 467 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['The merged cell declared at [', ', ', '] overlaps with the other declared merged \\n      cell. The overlapping merged cell was not added to the table, please fix your setup.'], ['The merged cell declared at [', ', ', '] overlaps with the other declared merged \\n      cell. The overlapping merged cell was not added to the table, please fix your setup.']);\n\nvar _cellCoords = __webpack_require__(95);\n\nvar _cellCoords2 = _interopRequireDefault(_cellCoords);\n\nvar _index = __webpack_require__(4);\n\nvar _number = __webpack_require__(5);\n\nvar _console = __webpack_require__(56);\n\nvar _array = __webpack_require__(1);\n\nvar _utils = __webpack_require__(324);\n\nvar _templateLiteralTag = __webpack_require__(42);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Defines a container object for the merged cells.\n *\n * @class MergedCellsCollection\n * @plugin MergeCells\n */\nvar MergedCellsCollection = function () {\n  function MergedCellsCollection(plugin) {\n    _classCallCheck(this, MergedCellsCollection);\n\n    /**\n     * Reference to the Merge Cells plugin.\n     *\n     * @type {MergeCells}\n     */\n    this.plugin = plugin;\n    /**\n     * Array of merged cells.\n     *\n     * @type {Array}\n     */\n    this.mergedCells = [];\n    /**\n     * The Handsontable instance.\n     *\n     * @type {Handsontable}\n     */\n    this.hot = plugin.hot;\n  }\n\n  /**\n   * Get a warning message for when the declared merged cell data overlaps already existing merged cells.\n   *\n   * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n   * @return {String}\n   */\n\n\n  _createClass(MergedCellsCollection, [{\n    key: 'get',\n\n\n    /**\n     * Get a merged cell from the container, based on the provided arguments. You can provide either the \"starting coordinates\"\n     * of a merged cell, or any coordinates from the body of the merged cell.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} column Column index.\n     * @returns {MergedCellCoords|Boolean} Returns a wanted merged cell on success and `false` on failure.\n     */\n    value: function get(row, column) {\n      var mergedCells = this.mergedCells;\n      var result = false;\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        if (mergedCell.row <= row && mergedCell.row + mergedCell.rowspan - 1 >= row && mergedCell.col <= column && mergedCell.col + mergedCell.colspan - 1 >= column) {\n          result = mergedCell;\n          return false;\n        }\n\n        return true;\n      });\n\n      return result;\n    }\n\n    /**\n     * Get a merged cell containing the provided range.\n     *\n     * @param {CellRange|Object} range The range to search merged cells for.\n     * @return {MergedCellCoords|Boolean}\n     */\n\n  }, {\n    key: 'getByRange',\n    value: function getByRange(range) {\n      var mergedCells = this.mergedCells;\n      var result = false;\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        if (mergedCell.row <= range.from.row && mergedCell.row + mergedCell.rowspan - 1 >= range.to.row && mergedCell.col <= range.from.col && mergedCell.col + mergedCell.colspan - 1 >= range.to.col) {\n          result = mergedCell;\n          return result;\n        }\n\n        return true;\n      });\n\n      return result;\n    }\n\n    /**\n     * Get a merged cell contained in the provided range.\n     *\n     * @param {CellRange|Object} range The range to search merged cells in.\n     * @param [countPartials=false] If set to `true`, all the merged cells overlapping the range will be taken into calculation.\n     * @return {Array|Boolean} Array of found merged cells of `false` if none were found.\n     */\n\n  }, {\n    key: 'getWithinRange',\n    value: function getWithinRange(range) {\n      var countPartials = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      var mergedCells = this.mergedCells;\n      var foundMergedCells = [];\n\n      if (!range.includesRange) {\n        var from = new _index.CellCoords(range.from.row, range.from.col);\n        var to = new _index.CellCoords(range.to.row, range.to.col);\n        range = new _index.CellRange(from, from, to);\n      }\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        var mergedCellTopLeft = new _index.CellCoords(mergedCell.row, mergedCell.col);\n        var mergedCellBottomRight = new _index.CellCoords(mergedCell.row + mergedCell.rowspan - 1, mergedCell.col + mergedCell.colspan - 1);\n        var mergedCellRange = new _index.CellRange(mergedCellTopLeft, mergedCellTopLeft, mergedCellBottomRight);\n\n        if (countPartials) {\n          if (range.overlaps(mergedCellRange)) {\n            foundMergedCells.push(mergedCell);\n          }\n        } else if (range.includesRange(mergedCellRange)) {\n          foundMergedCells.push(mergedCell);\n        }\n      });\n\n      return foundMergedCells.length ? foundMergedCells : false;\n    }\n\n    /**\n     * Add a merged cell to the container.\n     *\n     * @param {Object} mergedCellInfo The merged cell information object. Has to contain `row`, `col`, `colspan` and `rowspan` properties.\n     * @return {MergedCellCoords|Boolean} Returns the new merged cell on success and `false` on failure.\n     */\n\n  }, {\n    key: 'add',\n    value: function add(mergedCellInfo) {\n      var mergedCells = this.mergedCells;\n      var row = mergedCellInfo.row;\n      var column = mergedCellInfo.col;\n      var rowspan = mergedCellInfo.rowspan;\n      var colspan = mergedCellInfo.colspan;\n      var newMergedCell = new _cellCoords2.default(row, column, rowspan, colspan);\n      var alreadyExists = this.get(row, column);\n      var isOverlapping = this.isOverlapping(newMergedCell);\n\n      if (!alreadyExists && !isOverlapping) {\n        if (this.hot) {\n          newMergedCell.normalize(this.hot);\n        }\n\n        mergedCells.push(newMergedCell);\n\n        return newMergedCell;\n      }\n\n      (0, _console.warn)(MergedCellsCollection.IS_OVERLAPPING_WARNING(newMergedCell));\n\n      return false;\n    }\n\n    /**\n     * Remove a merged cell from the container. You can provide either the \"starting coordinates\"\n     * of a merged cell, or any coordinates from the body of the merged cell.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} column Column index.\n     * @return {MergedCellCoords|Boolean} Returns the removed merged cell on success and `false` on failure.\n     */\n\n  }, {\n    key: 'remove',\n    value: function remove(row, column) {\n      var mergedCells = this.mergedCells;\n      var wantedCollection = this.get(row, column);\n      var wantedCollectionIndex = wantedCollection ? this.mergedCells.indexOf(wantedCollection) : null;\n\n      if (wantedCollection && wantedCollectionIndex !== false) {\n        mergedCells.splice(wantedCollectionIndex, 1);\n        return wantedCollection;\n      }\n\n      return false;\n    }\n\n    /**\n     * Clear all the merged cells.\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      var _this = this;\n\n      var mergedCells = this.mergedCells;\n      var mergedCellParentsToClear = [];\n      var hiddenCollectionElements = [];\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        mergedCellParentsToClear.push([_this.hot.getCell(mergedCell.row, mergedCell.col), _this.get(mergedCell.row, mergedCell.col), mergedCell.row, mergedCell.col]);\n      });\n\n      this.mergedCells.length = 0;\n\n      (0, _array.arrayEach)(mergedCellParentsToClear, function (mergedCell, i) {\n        (0, _number.rangeEach)(0, mergedCell.rowspan - 1, function (j) {\n          (0, _number.rangeEach)(0, mergedCell.colspan - 1, function (k) {\n            if (k !== 0 || j !== 0) {\n              hiddenCollectionElements.push([_this.hot.getCell(mergedCell.row + j, mergedCell.col + k), null, null, null]);\n            }\n          });\n        });\n\n        mergedCellParentsToClear[i][1] = null;\n      });\n\n      (0, _array.arrayEach)(mergedCellParentsToClear, function (mergedCellParents) {\n        _utils.applySpanProperties.apply(undefined, _toConsumableArray(mergedCellParents));\n      });\n\n      (0, _array.arrayEach)(hiddenCollectionElements, function (hiddenCollectionElement) {\n        _utils.applySpanProperties.apply(undefined, _toConsumableArray(hiddenCollectionElement));\n      });\n    }\n\n    /**\n     * Check if the provided merged cell overlaps with the others in the container.\n     *\n     * @param {MergedCellCoords} mergedCell The merged cell to check against all others in the container.\n     * @return {Boolean} `true` if the provided merged cell overlaps with the others, `false` otherwise.\n     */\n\n  }, {\n    key: 'isOverlapping',\n    value: function isOverlapping(mergedCell) {\n      var mergedCellRange = new _index.CellRange(null, new _index.CellCoords(mergedCell.row, mergedCell.col), new _index.CellCoords(mergedCell.row + mergedCell.rowspan - 1, mergedCell.col + mergedCell.colspan - 1));\n      var result = false;\n\n      (0, _array.arrayEach)(this.mergedCells, function (col) {\n        var currentRange = new _index.CellRange(null, new _index.CellCoords(col.row, col.col), new _index.CellCoords(col.row + col.rowspan - 1, col.col + col.colspan - 1));\n\n        if (currentRange.overlaps(mergedCellRange)) {\n          result = true;\n          return false;\n        }\n\n        return true;\n      });\n\n      return result;\n    }\n\n    /**\n     * Check whether the provided row/col coordinates direct to a merged parent.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} column Column index.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isMergedParent',\n    value: function isMergedParent(row, column) {\n      var mergedCells = this.mergedCells;\n      var result = false;\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        if (mergedCell.row === row && mergedCell.col === column) {\n          result = true;\n          return false;\n        }\n\n        return true;\n      });\n\n      return result;\n    }\n\n    /**\n     * Shift the merged cell in the direction and by an offset defined in the arguments.\n     *\n     * @param {String} direction `right`, `left`, `up` or `down`.\n     * @param {Number} index Index where the change, which caused the shifting took place.\n     * @param {Number} count Number of rows/columns added/removed in the preceding action.\n     */\n\n  }, {\n    key: 'shiftCollections',\n    value: function shiftCollections(direction, index, count) {\n      var _this2 = this;\n\n      var shiftVector = [0, 0];\n\n      switch (direction) {\n        case 'right':\n          shiftVector[0] += count;\n          break;\n\n        case 'left':\n          shiftVector[0] -= count;\n          break;\n\n        case 'down':\n          shiftVector[1] += count;\n          break;\n\n        case 'up':\n          shiftVector[1] -= count;\n          break;\n\n        default:\n      }\n\n      (0, _array.arrayEach)(this.mergedCells, function (currentMerge) {\n        currentMerge.shift(shiftVector, index);\n      });\n\n      (0, _number.rangeEachReverse)(this.mergedCells.length - 1, 0, function (i) {\n        var currentMerge = _this2.mergedCells[i];\n\n        if (currentMerge && currentMerge.removed) {\n          _this2.mergedCells.splice(_this2.mergedCells.indexOf(currentMerge), 1);\n        }\n      });\n    }\n  }], [{\n    key: 'IS_OVERLAPPING_WARNING',\n    value: function IS_OVERLAPPING_WARNING(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject, newMergedCell.row, newMergedCell.col);\n    }\n  }]);\n\n  return MergedCellsCollection;\n}();\n\nexports.default = MergedCellsCollection;\n\n/***/ }),\n/* 468 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _src = __webpack_require__(4);\n\nvar _array = __webpack_require__(1);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Class responsible for all of the Autofill-related operations on merged cells.\n *\n * @class AutofillCalculations\n * @plugin MergeCells\n * @util\n */\nvar AutofillCalculations = function () {\n  function AutofillCalculations(plugin) {\n    _classCallCheck(this, AutofillCalculations);\n\n    /**\n     * Reference to the Merge Cells plugin.\n     *\n     * @type {MergeCells}\n     */\n    this.plugin = plugin;\n    /**\n     * Reference to the MergedCellsCollection class instance.\n     *\n     * @type {MergedCellsCollection}\n     */\n    this.mergedCellsCollection = this.plugin.mergedCellsCollection;\n    /**\n     * Cache of the currently processed autofill data.\n     *\n     * @private\n     * @type {Object}\n     */\n    this.currentFillData = null;\n  }\n\n  /**\n   * Correct the provided selection area, so it's not selecting only a part of a merged cell.\n   *\n   * @param {Array} selectionArea\n   */\n\n\n  _createClass(AutofillCalculations, [{\n    key: 'correctSelectionAreaSize',\n    value: function correctSelectionAreaSize(selectionArea) {\n      if (selectionArea[0] === selectionArea[2] && selectionArea[1] === selectionArea[3]) {\n        var mergedCell = this.mergedCellsCollection.get(selectionArea[0], selectionArea[1]);\n\n        if (mergedCell) {\n          selectionArea[2] = selectionArea[0] + mergedCell.rowspan - 1;\n          selectionArea[3] = selectionArea[1] + mergedCell.colspan - 1;\n        }\n      }\n    }\n\n    /**\n     * Get the direction of the autofill process.\n     *\n     * @param {Array} selectionArea The selection area.\n     * @param {Array} finalArea The final area (base + drag).\n     * @return {String} `up`, `down`, `left` or `right`.\n     */\n\n  }, {\n    key: 'getDirection',\n    value: function getDirection(selectionArea, finalArea) {\n      var direction = null;\n\n      if (finalArea[0] === selectionArea[0] && finalArea[1] === selectionArea[1] && finalArea[3] === selectionArea[3]) {\n        direction = 'down';\n      } else if (finalArea[2] === selectionArea[2] && finalArea[1] === selectionArea[1] && finalArea[3] === selectionArea[3]) {\n        direction = 'up';\n      } else if (finalArea[1] === selectionArea[1] && finalArea[2] === selectionArea[2]) {\n        direction = 'right';\n      } else {\n        direction = 'left';\n      }\n\n      return direction;\n    }\n\n    /**\n     * Snap the drag area to the farthest merged cell, so it won't clip any of the merged cells.\n     *\n     * @param {Array} baseArea The base selected area.\n     * @param {Array} dragArea The drag area.\n     * @param {String} dragDirection The autofill drag direction.\n     * @param {Array} foundMergedCells MergeCellCoords found in the base selection area.\n     * @return {Array} The new drag area\n     */\n\n  }, {\n    key: 'snapDragArea',\n    value: function snapDragArea(baseArea, dragArea, dragDirection, foundMergedCells) {\n      var newDragArea = dragArea.slice(0);\n      var fillSize = this.getAutofillSize(baseArea, dragArea, dragDirection);\n\n      var _baseArea = _slicedToArray(baseArea, 4),\n          baseAreaStartRow = _baseArea[0],\n          baseAreaStartColumn = _baseArea[1],\n          baseAreaEndRow = _baseArea[2],\n          baseAreaEndColumn = _baseArea[3];\n\n      var verticalDirection = ['up', 'down'].indexOf(dragDirection) > -1;\n      var fullCycle = verticalDirection ? baseAreaEndRow - baseAreaStartRow + 1 : baseAreaEndColumn - baseAreaStartColumn + 1;\n      var fulls = Math.floor(fillSize / fullCycle) * fullCycle;\n      var partials = fillSize - fulls;\n      var farthestCollection = this.getFarthestCollection(baseArea, dragArea, dragDirection, foundMergedCells);\n\n      if (farthestCollection) {\n        if (dragDirection === 'down') {\n          var fill = farthestCollection.row + farthestCollection.rowspan - baseAreaStartRow - partials;\n          var newLimit = newDragArea[2] + fill;\n\n          if (newLimit >= this.plugin.hot.countRows()) {\n            newDragArea[2] -= partials;\n          } else {\n            newDragArea[2] += partials ? fill : 0;\n          }\n        } else if (dragDirection === 'right') {\n          var _fill = farthestCollection.col + farthestCollection.colspan - baseAreaStartColumn - partials;\n          var _newLimit = newDragArea[3] + _fill;\n\n          if (_newLimit >= this.plugin.hot.countCols()) {\n            newDragArea[3] -= partials;\n          } else {\n            newDragArea[3] += partials ? _fill : 0;\n          }\n        } else if (dragDirection === 'up') {\n          var _fill2 = baseAreaEndRow - partials - farthestCollection.row + 1;\n          var _newLimit2 = newDragArea[0] + _fill2;\n\n          if (_newLimit2 < 0) {\n            newDragArea[0] += partials;\n          } else {\n            newDragArea[0] -= partials ? _fill2 : 0;\n          }\n        } else if (dragDirection === 'left') {\n          var _fill3 = baseAreaEndColumn - partials - farthestCollection.col + 1;\n          var _newLimit3 = newDragArea[1] + _fill3;\n\n          if (_newLimit3 < 0) {\n            newDragArea[1] += partials;\n          } else {\n            newDragArea[1] -= partials ? _fill3 : 0;\n          }\n        }\n      }\n\n      this.updateCurrentFillCache({\n        baseArea: baseArea,\n        dragDirection: dragDirection,\n        foundMergedCells: foundMergedCells,\n        fillSize: fillSize,\n        dragArea: newDragArea,\n        cycleLength: fullCycle\n      });\n\n      return newDragArea;\n    }\n\n    /**\n     * Update the current fill cache with the provided object.\n     *\n     * @private\n     * @param {Object} updateObject\n     */\n\n  }, {\n    key: 'updateCurrentFillCache',\n    value: function updateCurrentFillCache(updateObject) {\n      if (!this.currentFillData) {\n        this.currentFillData = {};\n      }\n\n      (0, _object.extend)(this.currentFillData, updateObject);\n    }\n\n    /**\n     * Get the \"length\" of the drag area.\n     *\n     * @private\n     * @param {Array} baseArea The base selection area.\n     * @param {Array} dragArea The drag area (containing the base area).\n     * @param {String} direction The drag direction.\n     * @return {Number|null} The \"length\" (height or width, depending on the direction) of the drag.\n     */\n\n  }, {\n    key: 'getAutofillSize',\n    value: function getAutofillSize(baseArea, dragArea, direction) {\n      var _baseArea2 = _slicedToArray(baseArea, 4),\n          baseAreaStartRow = _baseArea2[0],\n          baseAreaStartColumn = _baseArea2[1],\n          baseAreaEndRow = _baseArea2[2],\n          baseAreaEndColumn = _baseArea2[3];\n\n      var _dragArea = _slicedToArray(dragArea, 4),\n          dragAreaStartRow = _dragArea[0],\n          dragAreaStartColumn = _dragArea[1],\n          dragAreaEndRow = _dragArea[2],\n          dragAreaEndColumn = _dragArea[3];\n\n      switch (direction) {\n        case 'up':\n          return baseAreaStartRow - dragAreaStartRow;\n        case 'down':\n          return dragAreaEndRow - baseAreaEndRow;\n        case 'left':\n          return baseAreaStartColumn - dragAreaStartColumn;\n        case 'right':\n          return dragAreaEndColumn - baseAreaEndColumn;\n        default:\n          return null;\n      }\n    }\n\n    /**\n     * Trim the default drag area (containing the selection area) to the drag-only area.\n     *\n     * @private\n     * @param {Array} baseArea The base selection area.\n     * @param {Array} dragArea The base selection area extended by the drag area.\n     * @param {String} direction Drag direction.\n     * @return {Array|null} Array representing the drag area coordinates.\n     */\n\n  }, {\n    key: 'getDragArea',\n    value: function getDragArea(baseArea, dragArea, direction) {\n      var _baseArea3 = _slicedToArray(baseArea, 4),\n          baseAreaStartRow = _baseArea3[0],\n          baseAreaStartColumn = _baseArea3[1],\n          baseAreaEndRow = _baseArea3[2],\n          baseAreaEndColumn = _baseArea3[3];\n\n      var _dragArea2 = _slicedToArray(dragArea, 4),\n          dragAreaStartRow = _dragArea2[0],\n          dragAreaStartColumn = _dragArea2[1],\n          dragAreaEndRow = _dragArea2[2],\n          dragAreaEndColumn = _dragArea2[3];\n\n      switch (direction) {\n        case 'up':\n          return [dragAreaStartRow, dragAreaStartColumn, baseAreaStartRow - 1, baseAreaEndColumn];\n        case 'down':\n          return [baseAreaEndRow + 1, baseAreaStartColumn, dragAreaEndRow, baseAreaEndColumn];\n        case 'left':\n          return [dragAreaStartRow, dragAreaStartColumn, baseAreaEndRow, baseAreaStartColumn - 1];\n        case 'right':\n          return [baseAreaStartRow, baseAreaEndColumn + 1, dragAreaEndRow, dragAreaEndColumn];\n        default:\n          return null;\n      }\n    }\n\n    /**\n     * Get the to-be-farthest merged cell in the newly filled area.\n     *\n     * @private\n     * @param {Array} baseArea The base selection area.\n     * @param {Array} dragArea The drag area (containing the base area).\n     * @param {String} direction The drag direction.\n     * @param {Array} mergedCellArray Array of the merged cells found in the base area.\n     * @return {MergedCellCoords|null}\n     */\n\n  }, {\n    key: 'getFarthestCollection',\n    value: function getFarthestCollection(baseArea, dragArea, direction, mergedCellArray) {\n      var _baseArea4 = _slicedToArray(baseArea, 4),\n          baseAreaStartRow = _baseArea4[0],\n          baseAreaStartColumn = _baseArea4[1],\n          baseAreaEndRow = _baseArea4[2],\n          baseAreaEndColumn = _baseArea4[3];\n\n      var verticalDirection = ['up', 'down'].indexOf(direction) > -1;\n      var baseEnd = verticalDirection ? baseAreaEndRow : baseAreaEndColumn;\n      var baseStart = verticalDirection ? baseAreaStartRow : baseAreaStartColumn;\n      var fillSize = this.getAutofillSize(baseArea, dragArea, direction);\n      var fullCycle = verticalDirection ? baseAreaEndRow - baseAreaStartRow + 1 : baseAreaEndColumn - baseAreaStartColumn + 1;\n      var fulls = Math.floor(fillSize / fullCycle) * fullCycle;\n      var partials = fillSize - fulls;\n      var inclusionFunctionName = null;\n      var farthestCollection = null;\n      var endOfDragRecreationIndex = null;\n\n      switch (direction) {\n        case 'up':\n          inclusionFunctionName = 'includesVertically';\n          endOfDragRecreationIndex = baseEnd - partials + 1;\n          break;\n\n        case 'left':\n          inclusionFunctionName = 'includesHorizontally';\n          endOfDragRecreationIndex = baseEnd - partials + 1;\n          break;\n\n        case 'down':\n          inclusionFunctionName = 'includesVertically';\n          endOfDragRecreationIndex = baseStart + partials - 1;\n          break;\n\n        case 'right':\n          inclusionFunctionName = 'includesHorizontally';\n          endOfDragRecreationIndex = baseStart + partials - 1;\n          break;\n\n        default:\n      }\n\n      (0, _array.arrayEach)(mergedCellArray, function (currentCollection) {\n        if (currentCollection[inclusionFunctionName](endOfDragRecreationIndex) && currentCollection.isFarther(farthestCollection, direction)) {\n          farthestCollection = currentCollection;\n        }\n      });\n\n      return farthestCollection;\n    }\n\n    /**\n     * Recreate the merged cells after the autofill process.\n     *\n     * @param {Array} changes Changes made.\n     */\n\n  }, {\n    key: 'recreateAfterDataPopulation',\n    value: function recreateAfterDataPopulation(changes) {\n      if (!this.currentFillData) {\n        return;\n      }\n\n      var fillRange = this.getRangeFromChanges(changes);\n      var foundMergedCells = this.currentFillData.foundMergedCells;\n      var dragDirection = this.currentFillData.dragDirection;\n      var inBounds = function inBounds(current, offset) {\n        switch (dragDirection) {\n          case 'up':\n            return current.row - offset >= fillRange.from.row;\n          case 'down':\n            return current.row + current.rowspan - 1 + offset <= fillRange.to.row;\n          case 'left':\n            return current.col - offset >= fillRange.from.column;\n          case 'right':\n            return current.col + current.colspan - 1 + offset <= fillRange.to.column;\n          default:\n            return null;\n        }\n      };\n      var fillOffset = 0;\n      var current = null;\n      var multiplier = 1;\n\n      do {\n        for (var j = 0; j < foundMergedCells.length; j += 1) {\n          current = foundMergedCells[j];\n\n          fillOffset = multiplier * this.currentFillData.cycleLength;\n\n          if (inBounds(current, fillOffset)) {\n            switch (dragDirection) {\n              case 'up':\n                this.plugin.mergedCellsCollection.add({\n                  row: current.row - fillOffset,\n                  rowspan: current.rowspan,\n                  col: current.col,\n                  colspan: current.colspan\n                });\n                break;\n\n              case 'down':\n                this.plugin.mergedCellsCollection.add({\n                  row: current.row + fillOffset,\n                  rowspan: current.rowspan,\n                  col: current.col,\n                  colspan: current.colspan\n                });\n                break;\n\n              case 'left':\n                this.plugin.mergedCellsCollection.add({\n                  row: current.row,\n                  rowspan: current.rowspan,\n                  col: current.col - fillOffset,\n                  colspan: current.colspan\n                });\n                break;\n\n              case 'right':\n                this.plugin.mergedCellsCollection.add({\n                  row: current.row,\n                  rowspan: current.rowspan,\n                  col: current.col + fillOffset,\n                  colspan: current.colspan\n                });\n                break;\n\n              default:\n            }\n          }\n\n          if (j === foundMergedCells.length - 1) {\n            multiplier += 1;\n          }\n        }\n      } while (inBounds(current, fillOffset));\n\n      this.currentFillData = null;\n      this.plugin.hot.render();\n    }\n\n    /**\n     * Get the drag range from the changes made.\n     *\n     * @private\n     * @param {Array} changes The changes made.\n     * @returns {Object} Object with `from` and `to` properties, both containing `row` and `column` keys.\n     */\n\n  }, {\n    key: 'getRangeFromChanges',\n    value: function getRangeFromChanges(changes) {\n      var rows = { min: null, max: null };\n      var columns = { min: null, max: null };\n\n      (0, _array.arrayEach)(changes, function (change) {\n        if (rows.min === null || change[0] < rows.min) {\n          rows.min = change[0];\n        }\n\n        if (rows.max === null || change[0] > rows.max) {\n          rows.max = change[0];\n        }\n\n        if (columns.min === null || change[1] < columns.min) {\n          columns.min = change[1];\n        }\n\n        if (columns.max === null || change[1] > columns.max) {\n          columns.max = change[1];\n        }\n      });\n\n      return {\n        from: {\n          row: rows.min,\n          column: columns.min\n        },\n        to: {\n          row: rows.max,\n          column: columns.max\n        }\n      };\n    }\n\n    /**\n     * Check if the drag area contains any merged cells.\n     *\n     * @param {Array} baseArea The base selection area.\n     * @param {Array} fullArea The base area extended by the drag area.\n     * @param {String} direction Drag direction.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'dragAreaOverlapsCollections',\n    value: function dragAreaOverlapsCollections(baseArea, fullArea, direction) {\n      var dragArea = this.getDragArea(baseArea, fullArea, direction);\n\n      var _dragArea3 = _slicedToArray(dragArea, 4),\n          dragAreaStartRow = _dragArea3[0],\n          dragAreaStartColumn = _dragArea3[1],\n          dragAreaEndRow = _dragArea3[2],\n          dragAreaEndColumn = _dragArea3[3];\n\n      var topLeft = new _src.CellCoords(dragAreaStartRow, dragAreaStartColumn);\n      var bottomRight = new _src.CellCoords(dragAreaEndRow, dragAreaEndColumn);\n      var dragRange = new _src.CellRange(topLeft, topLeft, bottomRight);\n\n      return !!this.mergedCellsCollection.getWithinRange(dragRange, true);\n    }\n  }]);\n\n  return AutofillCalculations;\n}();\n\nexports.default = AutofillCalculations;\n\n/***/ }),\n/* 469 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _src = __webpack_require__(4);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Class responsible for all of the Selection-related operations on merged cells.\n *\n * @class SelectionCalculations\n * @plugin MergeCells\n * @util\n */\nvar SelectionCalculations = function () {\n  function SelectionCalculations(plugin) {\n    _classCallCheck(this, SelectionCalculations);\n\n    /**\n     * Reference to the Merge Cells plugin.\n     *\n     * @type {MergeCells}\n     */\n    this.plugin = plugin;\n    /**\n     * Class name used for fully selected merged cells.\n     *\n     * @type {String}\n     */\n    this.fullySelectedMergedCellClassName = 'fullySelectedMergedCell';\n  }\n\n  /**\n   * \"Snap\" the delta value according to defined merged cells. (In other words, compensate the rowspan -\n   * e.g. going up with `delta.row = -1` over a merged cell with `rowspan = 3`, `delta.row` should change to `-3`.)\n   *\n   * @param {Object} delta The delta object containing `row` and `col` properties.\n   * @param {CellRange} selectionRange The selection range.\n   * @param {Object} mergedCell A merged cell object.\n   */\n\n\n  _createClass(SelectionCalculations, [{\n    key: 'snapDelta',\n    value: function snapDelta(delta, selectionRange, mergedCell) {\n      var cellCoords = selectionRange.to;\n      var newRow = cellCoords.row + delta.row;\n      var newColumn = cellCoords.col + delta.col;\n\n      if (delta.row) {\n        this.jumpOverMergedCell(delta, mergedCell, newRow);\n      } else if (delta.col) {\n        this.jumpOverMergedCell(delta, mergedCell, newColumn);\n      }\n    }\n\n    /**\n     * \"Jump\" over the merged cell (compensate for the indexes within the merged cell to get past it)\n     *\n     * @private\n     * @param {Object} delta The delta object.\n     * @param {MergedCellCoords} mergedCell The merge cell object.\n     * @param {Number} newIndex New row/column index, created with the delta.\n     */\n\n  }, {\n    key: 'jumpOverMergedCell',\n    value: function jumpOverMergedCell(delta, mergedCell, newIndex) {\n      var flatDelta = delta.row || delta.col;\n      var includesIndex = null;\n      var firstIndex = null;\n      var lastIndex = null;\n\n      if (delta.row) {\n        includesIndex = mergedCell.includesVertically(newIndex);\n        firstIndex = mergedCell.row;\n        lastIndex = mergedCell.getLastRow();\n      } else if (delta.col) {\n        includesIndex = mergedCell.includesHorizontally(newIndex);\n        firstIndex = mergedCell.col;\n        lastIndex = mergedCell.getLastColumn();\n      }\n\n      if (flatDelta === 0) {\n        return;\n      } else if (flatDelta > 0) {\n        if (includesIndex && newIndex !== firstIndex) {\n          flatDelta += lastIndex - newIndex + 1;\n        }\n      } else if (includesIndex && newIndex !== lastIndex) {\n        flatDelta -= newIndex - firstIndex + 1;\n      }\n\n      if (delta.row) {\n        delta.row = flatDelta;\n      } else if (delta.col) {\n        delta.col = flatDelta;\n      }\n    }\n\n    /**\n     * Get a selection range with `to` property incremented by the provided delta.\n     *\n     * @param {CellRange} oldSelectionRange The base selection range.\n     * @param {Object} delta The delta object with `row` and `col` properties.\n     * @returns {CellRange} A new `CellRange` object.\n     */\n\n  }, {\n    key: 'getUpdatedSelectionRange',\n    value: function getUpdatedSelectionRange(oldSelectionRange, delta) {\n      return new _src.CellRange(oldSelectionRange.highlight, oldSelectionRange.from, new _src.CellCoords(oldSelectionRange.to.row + delta.row, oldSelectionRange.to.col + delta.col));\n    }\n\n    /**\n     * Generate an additional class name for the entirely-selected merged cells.\n     *\n     * @param {Number} currentRow Row index of the currently processed cell.\n     * @param {Number} currentColumn Column index of the currently cell.\n     * @param {Array} cornersOfSelection Array of the current selection in a form of `[startRow, startColumn, endRow, endColumn]`.\n     * @param {Number|undefined} layerLevel Number indicating which layer of selection is currently processed.\n     * @returns {String|undefined} A `String`, which will act as an additional `className` to be added to the currently processed cell.\n     */\n\n  }, {\n    key: 'getSelectedMergedCellClassName',\n    value: function getSelectedMergedCellClassName(currentRow, currentColumn, cornersOfSelection, layerLevel) {\n      var _cornersOfSelection = _slicedToArray(cornersOfSelection, 4),\n          startRow = _cornersOfSelection[0],\n          startColumn = _cornersOfSelection[1],\n          endRow = _cornersOfSelection[2],\n          endColumn = _cornersOfSelection[3];\n\n      if (layerLevel === void 0) {\n        return;\n      }\n\n      if (currentRow >= startRow && currentRow <= endRow && currentColumn >= startColumn && currentColumn <= endColumn) {\n\n        var isMergedCellParent = this.plugin.mergedCellsCollection.isMergedParent(currentRow, currentColumn);\n\n        if (!isMergedCellParent) {\n          return;\n        }\n\n        var mergedCell = this.plugin.mergedCellsCollection.get(currentRow, currentColumn);\n\n        if (!mergedCell) {\n          return;\n        }\n\n        if (mergedCell.row + mergedCell.rowspan - 1 <= endRow && mergedCell.col + mergedCell.colspan - 1 <= endColumn) {\n          return this.fullySelectedMergedCellClassName + '-' + layerLevel;\n        } else if (this.plugin.selectionCalculations.isMergeCellFullySelected(mergedCell, this.plugin.hot.getSelectedRange())) {\n          return this.fullySelectedMergedCellClassName + '-multiple';\n        }\n      }\n    }\n\n    /**\n     * Check if the provided merged cell is fully selected (by one or many layers of selection)\n     *\n     * @param {MergedCellCoords} mergedCell The merged cell to be processed.\n     * @param {CellRange[]} selectionRangesArray Array of selection ranges.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isMergeCellFullySelected',\n    value: function isMergeCellFullySelected(mergedCell, selectionRangesArray) {\n      var mergedCellIndividualCoords = [];\n\n      if (!selectionRangesArray || !mergedCell) {\n        return false;\n      }\n\n      for (var r = 0; r < mergedCell.rowspan; r += 1) {\n        for (var c = 0; c < mergedCell.colspan; c += 1) {\n          mergedCellIndividualCoords.push(new _src.CellCoords(mergedCell.row + r, mergedCell.col + c));\n        }\n      }\n\n      for (var i = 0; i < mergedCellIndividualCoords.length; i += 1) {\n        var insideSelections = [];\n\n        for (var s = 0; s < selectionRangesArray.length; s += 1) {\n          insideSelections[s] = selectionRangesArray[s].includes(mergedCellIndividualCoords[i]);\n        }\n\n        if (!insideSelections.includes(true)) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n\n    /**\n     * Generate an array of the entirely-selected merged cells' class names.\n     *\n     * @returns {String[]} An `Array` of `String`s. Each of these strings will act like class names to be removed from all the cells in the table.\n     */\n\n  }, {\n    key: 'getSelectedMergedCellClassNameToRemove',\n    value: function getSelectedMergedCellClassNameToRemove() {\n      var classNames = [];\n\n      for (var i = 0; i <= 7; i += 1) {\n        classNames.push(this.fullySelectedMergedCellClassName + '-' + i);\n      }\n\n      classNames.push(this.fullySelectedMergedCellClassName + '-multiple');\n\n      return classNames;\n    }\n  }]);\n\n  return SelectionCalculations;\n}();\n\nexports.default = SelectionCalculations;\n\n/***/ }),\n/* 470 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = toggleMergeItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _cellCoords = __webpack_require__(95);\n\nvar _cellCoords2 = _interopRequireDefault(_cellCoords);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction toggleMergeItem(plugin) {\n  return {\n    key: 'mergeCells',\n    name: function name() {\n      var sel = this.getSelectedLast();\n\n      if (sel) {\n        var info = plugin.mergedCellsCollection.get(sel[0], sel[1]);\n\n        if (info.row === sel[0] && info.col === sel[1] && info.row + info.rowspan - 1 === sel[2] && info.col + info.colspan - 1 === sel[3]) {\n          return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_UNMERGE_CELLS);\n        }\n      }\n\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_MERGE_CELLS);\n    },\n    callback: function callback() {\n      plugin.toggleMergeOnSelection();\n    },\n    disabled: function disabled() {\n      var sel = this.getSelectedLast();\n\n      if (!sel) {\n        return true;\n      }\n\n      var isSingleCell = _cellCoords2.default.isSingleCell({\n        row: sel[0],\n        col: sel[1],\n        rowspan: sel[2] - sel[0] + 1,\n        colspan: sel[3] - sel[1] + 1\n      });\n\n      return isSingleCell || this.selection.isSelectedByCorner();\n    },\n\n    hidden: false\n  };\n}\n\n/***/ }),\n/* 471 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 472 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _element = __webpack_require__(0);\n\nvar _browser = __webpack_require__(27);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nvar _src = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @plugin MultipleSelectionHandles\n */\nvar MultipleSelectionHandles = function (_BasePlugin) {\n  _inherits(MultipleSelectionHandles, _BasePlugin);\n\n  /**\n   * @param {Object} hotInstance\n   */\n  function MultipleSelectionHandles(hotInstance) {\n    _classCallCheck(this, MultipleSelectionHandles);\n\n    /**\n     * @type {Array}\n     */\n    var _this2 = _possibleConstructorReturn(this, (MultipleSelectionHandles.__proto__ || Object.getPrototypeOf(MultipleSelectionHandles)).call(this, hotInstance));\n\n    _this2.dragged = [];\n    /**\n     * Instance of EventManager.\n     *\n     * @type {EventManager}\n     */\n    _this2.eventManager = null;\n    /**\n     * @type {null}\n     */\n    _this2.lastSetCell = null;\n    return _this2;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(MultipleSelectionHandles, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return (0, _browser.isMobileBrowser)();\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      if (this.enabled) {\n        return;\n      }\n      if (!this.eventManager) {\n        this.eventManager = new _eventManager2.default(this);\n      }\n      this.registerListeners();\n      _get(MultipleSelectionHandles.prototype.__proto__ || Object.getPrototypeOf(MultipleSelectionHandles.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Bind the touch events\n     * @private\n     */\n\n  }, {\n    key: 'registerListeners',\n    value: function registerListeners() {\n      var _this = this;\n\n      function removeFromDragged(query) {\n\n        if (_this.dragged.length === 1) {\n          // clear array\n          _this.dragged.splice(0, _this.dragged.length);\n\n          return true;\n        }\n\n        var entryPosition = _this.dragged.indexOf(query);\n\n        if (entryPosition == -1) {\n          return false;\n        } else if (entryPosition === 0) {\n          _this.dragged = _this.dragged.slice(0, 1);\n        } else if (entryPosition == 1) {\n          _this.dragged = _this.dragged.slice(-1);\n        }\n      }\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'touchstart', function (event) {\n        var selectedRange = void 0;\n\n        if ((0, _element.hasClass)(event.target, 'topLeftSelectionHandle-HitArea')) {\n          selectedRange = _this.hot.getSelectedRangeLast();\n\n          _this.dragged.push('topLeft');\n\n          _this.touchStartRange = {\n            width: selectedRange.getWidth(),\n            height: selectedRange.getHeight(),\n            direction: selectedRange.getDirection()\n          };\n\n          event.preventDefault();\n          return false;\n        } else if ((0, _element.hasClass)(event.target, 'bottomRightSelectionHandle-HitArea')) {\n          selectedRange = _this.hot.getSelectedRangeLast();\n\n          _this.dragged.push('bottomRight');\n\n          _this.touchStartRange = {\n            width: selectedRange.getWidth(),\n            height: selectedRange.getHeight(),\n            direction: selectedRange.getDirection()\n          };\n\n          event.preventDefault();\n          return false;\n        }\n      });\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'touchend', function (event) {\n        if ((0, _element.hasClass)(event.target, 'topLeftSelectionHandle-HitArea')) {\n          removeFromDragged.call(_this, 'topLeft');\n\n          _this.touchStartRange = void 0;\n\n          event.preventDefault();\n          return false;\n        } else if ((0, _element.hasClass)(event.target, 'bottomRightSelectionHandle-HitArea')) {\n          removeFromDragged.call(_this, 'bottomRight');\n\n          _this.touchStartRange = void 0;\n\n          event.preventDefault();\n          return false;\n        }\n      });\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'touchmove', function (event) {\n        var scrollTop = (0, _element.getWindowScrollTop)(),\n            scrollLeft = (0, _element.getWindowScrollLeft)(),\n            endTarget = void 0,\n            targetCoords = void 0,\n            selectedRange = void 0,\n            rangeWidth = void 0,\n            rangeHeight = void 0,\n            rangeDirection = void 0,\n            newRangeCoords = void 0;\n\n        if (_this.dragged.length === 0) {\n          return;\n        }\n\n        endTarget = document.elementFromPoint(event.touches[0].screenX - scrollLeft, event.touches[0].screenY - scrollTop);\n\n        if (!endTarget || endTarget === _this.lastSetCell) {\n          return;\n        }\n\n        if (endTarget.nodeName == 'TD' || endTarget.nodeName == 'TH') {\n          targetCoords = _this.hot.getCoords(endTarget);\n\n          if (targetCoords.col == -1) {\n            targetCoords.col = 0;\n          }\n\n          selectedRange = _this.hot.getSelectedRangeLast();\n          rangeWidth = selectedRange.getWidth();\n          rangeHeight = selectedRange.getHeight();\n          rangeDirection = selectedRange.getDirection();\n\n          if (rangeWidth == 1 && rangeHeight == 1) {\n            _this.hot.selection.setRangeEnd(targetCoords);\n          }\n\n          newRangeCoords = _this.getCurrentRangeCoords(selectedRange, targetCoords, _this.touchStartRange.direction, rangeDirection, _this.dragged[0]);\n\n          if (newRangeCoords.start !== null) {\n            _this.hot.selection.setRangeStart(newRangeCoords.start);\n          }\n\n          _this.hot.selection.setRangeEnd(newRangeCoords.end);\n\n          _this.lastSetCell = endTarget;\n        }\n\n        event.preventDefault();\n      });\n    }\n  }, {\n    key: 'getCurrentRangeCoords',\n    value: function getCurrentRangeCoords(selectedRange, currentTouch, touchStartDirection, currentDirection, draggedHandle) {\n      var topLeftCorner = selectedRange.getTopLeftCorner(),\n          bottomRightCorner = selectedRange.getBottomRightCorner(),\n          bottomLeftCorner = selectedRange.getBottomLeftCorner(),\n          topRightCorner = selectedRange.getTopRightCorner();\n\n      var newCoords = {\n        start: null,\n        end: null\n      };\n\n      switch (touchStartDirection) {\n        case 'NE-SW':\n          switch (currentDirection) {\n            case 'NE-SW':\n            case 'NW-SE':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: new _src.CellCoords(currentTouch.row, selectedRange.highlight.col),\n                  end: new _src.CellCoords(bottomLeftCorner.row, currentTouch.col)\n                };\n              } else {\n                newCoords = {\n                  start: new _src.CellCoords(selectedRange.highlight.row, currentTouch.col),\n                  end: new _src.CellCoords(currentTouch.row, topLeftCorner.col)\n                };\n              }\n              break;\n            case 'SE-NW':\n              if (draggedHandle == 'bottomRight') {\n                newCoords = {\n                  start: new _src.CellCoords(bottomRightCorner.row, currentTouch.col),\n                  end: new _src.CellCoords(currentTouch.row, topLeftCorner.col)\n                };\n              }\n              break;\n            default:\n              break;\n          }\n          break;\n        case 'NW-SE':\n          switch (currentDirection) {\n            case 'NE-SW':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: currentTouch,\n                  end: bottomLeftCorner\n                };\n              } else {\n                newCoords.end = currentTouch;\n              }\n              break;\n            case 'NW-SE':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: currentTouch,\n                  end: bottomRightCorner\n                };\n              } else {\n                newCoords.end = currentTouch;\n              }\n              break;\n            case 'SE-NW':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: currentTouch,\n                  end: topLeftCorner\n                };\n              } else {\n                newCoords.end = currentTouch;\n              }\n              break;\n            case 'SW-NE':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: currentTouch,\n                  end: topRightCorner\n                };\n              } else {\n                newCoords.end = currentTouch;\n              }\n              break;\n            default:\n              break;\n          }\n          break;\n        case 'SW-NE':\n          switch (currentDirection) {\n            case 'NW-SE':\n              if (draggedHandle == 'bottomRight') {\n                newCoords = {\n                  start: new _src.CellCoords(currentTouch.row, topLeftCorner.col),\n                  end: new _src.CellCoords(bottomLeftCorner.row, currentTouch.col)\n                };\n              } else {\n                newCoords = {\n                  start: new _src.CellCoords(topLeftCorner.row, currentTouch.col),\n                  end: new _src.CellCoords(currentTouch.row, bottomRightCorner.col)\n                };\n              }\n              break;\n            // case 'NE-SW':\n            //\n            //  break;\n            case 'SW-NE':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: new _src.CellCoords(selectedRange.highlight.row, currentTouch.col),\n                  end: new _src.CellCoords(currentTouch.row, bottomRightCorner.col)\n                };\n              } else {\n                newCoords = {\n                  start: new _src.CellCoords(currentTouch.row, topLeftCorner.col),\n                  end: new _src.CellCoords(topLeftCorner.row, currentTouch.col)\n                };\n              }\n              break;\n            case 'SE-NW':\n              if (draggedHandle == 'bottomRight') {\n                newCoords = {\n                  start: new _src.CellCoords(currentTouch.row, topRightCorner.col),\n                  end: new _src.CellCoords(topLeftCorner.row, currentTouch.col)\n                };\n              } else if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: bottomLeftCorner,\n                  end: currentTouch\n                };\n              }\n              break;\n            default:\n              break;\n          }\n          break;\n        case 'SE-NW':\n          switch (currentDirection) {\n            case 'NW-SE':\n            case 'NE-SW':\n            case 'SW-NE':\n              if (draggedHandle == 'topLeft') {\n                newCoords.end = currentTouch;\n              }\n              break;\n            case 'SE-NW':\n              if (draggedHandle == 'topLeft') {\n                newCoords.end = currentTouch;\n              } else {\n                newCoords = {\n                  start: currentTouch,\n                  end: topLeftCorner\n                };\n              }\n              break;\n            default:\n              break;\n          }\n          break;\n        default:\n          break;\n      }\n\n      return newCoords;\n    }\n\n    /**\n     * Check if user is currently dragging the handle.\n     *\n     * @returns {boolean} Dragging state\n     */\n\n  }, {\n    key: 'isDragged',\n    value: function isDragged() {\n      return this.dragged.length > 0;\n    }\n  }]);\n\n  return MultipleSelectionHandles;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('multipleSelectionHandles', MultipleSelectionHandles);\n\nexports.default = MultipleSelectionHandles;\n\n/***/ }),\n/* 473 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _jsonPatchDuplex = __webpack_require__(325);\n\nvar _jsonPatchDuplex2 = _interopRequireDefault(_jsonPatchDuplex);\n\nvar _dataObserver = __webpack_require__(474);\n\nvar _dataObserver2 = _interopRequireDefault(_dataObserver);\n\nvar _array = __webpack_require__(1);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// Handsontable.hooks.register('afterChangesObserved');\n\n/**\n * @plugin ObserveChanges\n *\n * @description\n * This plugin allows to observe data source changes.\n *\n * By default, the plugin is declared as `undefined`, which makes it disabled.\n * Enabling this plugin switches the table into one-way data binding where changes are applied into the data source (outside from the table)\n * will be automatically reflected in the table.\n *\n * ```js\n * ...\n * // as a boolean\n * observeChanges: true,\n * ...\n * ```\n *\n * To configure this plugin see {@link Options#observeChanges}.\n */\nvar ObserveChanges = function (_BasePlugin) {\n  _inherits(ObserveChanges, _BasePlugin);\n\n  function ObserveChanges(hotInstance) {\n    _classCallCheck(this, ObserveChanges);\n\n    /**\n     * Instance of {@link DataObserver}.\n     *\n     * @type {DataObserver}\n     */\n    var _this = _possibleConstructorReturn(this, (ObserveChanges.__proto__ || Object.getPrototypeOf(ObserveChanges)).call(this, hotInstance));\n\n    _this.observer = null;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ObserveChanges, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().observeChanges;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n      if (!this.observer) {\n        this.observer = new _dataObserver2.default(this.hot.getSourceData());\n        this._exposePublicApi();\n      }\n\n      this.observer.addLocalHook('change', function (patches) {\n        return _this2.onDataChange(patches);\n      });\n      this.addHook('afterCreateRow', function () {\n        return _this2.onAfterTableAlter();\n      });\n      this.addHook('afterRemoveRow', function () {\n        return _this2.onAfterTableAlter();\n      });\n      this.addHook('afterCreateCol', function () {\n        return _this2.onAfterTableAlter();\n      });\n      this.addHook('afterRemoveCol', function () {\n        return _this2.onAfterTableAlter();\n      });\n      this.addHook('afterChange', function (changes, source) {\n        return _this2.onAfterTableAlter(source);\n      });\n      this.addHook('afterLoadData', function (firstRun) {\n        return _this2.onAfterLoadData(firstRun);\n      });\n\n      _get(ObserveChanges.prototype.__proto__ || Object.getPrototypeOf(ObserveChanges.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      if (this.observer) {\n        this.observer.destroy();\n        this.observer = null;\n        this._deletePublicApi();\n      }\n\n      _get(ObserveChanges.prototype.__proto__ || Object.getPrototypeOf(ObserveChanges.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Data change observer.\n     *\n     * @private\n     * @param {Array} patches An array of objects which every item defines coordinates where data was changed.\n     */\n\n  }, {\n    key: 'onDataChange',\n    value: function onDataChange(patches) {\n      var _this3 = this;\n\n      if (!this.observer.isPaused()) {\n        var sourceName = this.pluginName + '.change';\n        var actions = {\n          add: function add(patch) {\n            if (isNaN(patch.col)) {\n              _this3.hot.runHooks('afterCreateRow', patch.row, 1, sourceName);\n            } else {\n              _this3.hot.runHooks('afterCreateCol', patch.col, 1, sourceName);\n            }\n          },\n          remove: function remove(patch) {\n            if (isNaN(patch.col)) {\n              _this3.hot.runHooks('afterRemoveRow', patch.row, 1, sourceName);\n            } else {\n              _this3.hot.runHooks('afterRemoveCol', patch.col, 1, sourceName);\n            }\n          },\n          replace: function replace(patch) {\n            _this3.hot.runHooks('afterChange', [[patch.row, patch.col, null, patch.value]], sourceName);\n          }\n        };\n\n        (0, _array.arrayEach)(patches, function (patch) {\n          if (actions[patch.op]) {\n            actions[patch.op](patch);\n          }\n        });\n        this.hot.render();\n      }\n\n      this.hot.runHooks('afterChangesObserved');\n    }\n\n    /**\n     * On after table alter listener. Prevents infinity loop between internal and external data changing.\n     *\n     * @private\n     * @param source\n     */\n\n  }, {\n    key: 'onAfterTableAlter',\n    value: function onAfterTableAlter(source) {\n      var _this4 = this;\n\n      if (source !== 'loadData') {\n        this.observer.pause();\n        this.hot.addHookOnce('afterChangesObserved', function () {\n          return _this4.observer.resume();\n        });\n      }\n    }\n\n    /**\n     * On after load data listener.\n     *\n     * @private\n     * @param {Boolean} firstRun `true` if event was fired first time.\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData(firstRun) {\n      if (!firstRun) {\n        this.observer.setObservedData(this.hot.getSourceData());\n      }\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.observer) {\n        this.observer.destroy();\n        this._deletePublicApi();\n      }\n      _get(ObserveChanges.prototype.__proto__ || Object.getPrototypeOf(ObserveChanges.prototype), 'destroy', this).call(this);\n    }\n\n    /**\n     * Expose plugins methods to the core.\n     *\n     * @private\n     */\n\n  }, {\n    key: '_exposePublicApi',\n    value: function _exposePublicApi() {\n      var _this5 = this;\n\n      var hot = this.hot;\n\n      hot.pauseObservingChanges = function () {\n        return _this5.observer.pause();\n      };\n      hot.resumeObservingChanges = function () {\n        return _this5.observer.resume();\n      };\n      hot.isPausedObservingChanges = function () {\n        return _this5.observer.isPaused();\n      };\n    }\n\n    /**\n     * Delete all previously exposed methods.\n     *\n     * @private\n     */\n\n  }, {\n    key: '_deletePublicApi',\n    value: function _deletePublicApi() {\n      var hot = this.hot;\n\n      delete hot.pauseObservingChanges;\n      delete hot.resumeObservingChanges;\n      delete hot.isPausedObservingChanges;\n    }\n  }]);\n\n  return ObserveChanges;\n}(_base2.default);\n\nexports.default = ObserveChanges;\n\n\n(0, _plugins.registerPlugin)('observeChanges', ObserveChanges);\n\n/***/ }),\n/* 474 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _jsonPatchDuplex = __webpack_require__(325);\n\nvar _jsonPatchDuplex2 = _interopRequireDefault(_jsonPatchDuplex);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nvar _object = __webpack_require__(2);\n\nvar _utils = __webpack_require__(475);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class DataObserver\n * @plugin ObserveChanges\n */\nvar DataObserver = function () {\n  function DataObserver(observedData) {\n    _classCallCheck(this, DataObserver);\n\n    /**\n     * Observed source data.\n     *\n     * @type {Array}\n     */\n    this.observedData = null;\n    /**\n     * JsonPatch observer.\n     *\n     * @type {Object}\n     */\n    this.observer = null;\n    /**\n     * Flag which determines if observer is paused or not. Paused observer doesn't emit `change` hooks.\n     *\n     * @type {Boolean}\n     * @default false\n     */\n    this.paused = false;\n\n    this.setObservedData(observedData);\n  }\n\n  /**\n   * Set data to observe.\n   *\n   * @param {*} observedData\n   */\n\n\n  _createClass(DataObserver, [{\n    key: 'setObservedData',\n    value: function setObservedData(observedData) {\n      var _this = this;\n\n      if (this.observer) {\n        _jsonPatchDuplex2.default.unobserve(this.observedData, this.observer);\n      }\n      this.observedData = observedData;\n      this.observer = _jsonPatchDuplex2.default.observe(this.observedData, function (patches) {\n        return _this.onChange(patches);\n      });\n    }\n\n    /**\n     * Check if observer was paused.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isPaused',\n    value: function isPaused() {\n      return this.paused;\n    }\n\n    /**\n     * Pause observer (stop emitting all detected changes).\n     */\n\n  }, {\n    key: 'pause',\n    value: function pause() {\n      this.paused = true;\n    }\n\n    /**\n     * Resume observer (emit all detected changes).\n     */\n\n  }, {\n    key: 'resume',\n    value: function resume() {\n      this.paused = false;\n    }\n\n    /**\n     * JsonPatch on change listener.\n     *\n     * @private\n     * @param {Array} patches An array of object passed from jsonpatch.\n     */\n\n  }, {\n    key: 'onChange',\n    value: function onChange(patches) {\n      this.runLocalHooks('change', (0, _utils.cleanPatches)(patches));\n    }\n\n    /**\n     * Destroy observer instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _jsonPatchDuplex2.default.unobserve(this.observedData, this.observer);\n      this.observedData = null;\n      this.observer = null;\n    }\n  }]);\n\n  return DataObserver;\n}();\n\n(0, _object.mixin)(DataObserver, _localHooks2.default);\n\nexports.default = DataObserver;\n\n/***/ }),\n/* 475 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.cleanPatches = cleanPatches;\nexports.parsePath = parsePath;\n\nvar _array = __webpack_require__(1);\n\n/**\n * Clean and extend patches from jsonpatch observer.\n *\n * @param {Array} patches\n * @returns {Array}\n */\nfunction cleanPatches(patches) {\n  var newOrRemovedColumns = [];\n\n  /**\n   * If observeChanges uses native Object.observe method, then it produces patches for length property. Filter them.\n   * If path can't be parsed. Filter it.\n   */\n  patches = (0, _array.arrayFilter)(patches, function (patch) {\n    if (/[/]length/ig.test(patch.path)) {\n      return false;\n    }\n    if (!parsePath(patch.path)) {\n      return false;\n    }\n\n    return true;\n  });\n  /**\n   * Extend patches with changed cells coords\n   */\n  patches = (0, _array.arrayMap)(patches, function (patch) {\n    var coords = parsePath(patch.path);\n\n    patch.row = coords.row;\n    patch.col = coords.col;\n\n    return patch;\n  });\n  /**\n   * Removing or adding column will produce one patch for each table row.\n   * Leaves only one patch for each column add/remove operation.\n   */\n  patches = (0, _array.arrayFilter)(patches, function (patch) {\n    if (['add', 'remove'].indexOf(patch.op) !== -1 && !isNaN(patch.col)) {\n      if (newOrRemovedColumns.indexOf(patch.col) !== -1) {\n        return false;\n      }\n      newOrRemovedColumns.push(patch.col);\n    }\n\n    return true;\n  });\n  newOrRemovedColumns.length = 0;\n\n  return patches;\n}\n\n/**\n * Extract coordinates from path where data was changed.\n *\n * @param {String} path Path describing where data was changed.\n * @returns {Object|null} Returns an object with `row` and `col` properties or `null` if path doesn't have necessary information.\n */\nfunction parsePath(path) {\n  var match = path.match(/^\\/(\\d+)\\/?(.*)?$/);\n\n  if (!match) {\n    return null;\n  }\n\n  var _match = _slicedToArray(match, 3),\n      row = _match[1],\n      column = _match[2];\n\n  return {\n    row: parseInt(row, 10),\n    col: /^\\d*$/.test(column) ? parseInt(column, 10) : column\n  };\n}\n\n/***/ }),\n/* 476 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _mixed = __webpack_require__(16);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar DEFAULT_SEARCH_RESULT_CLASS = 'htSearchResult';\n\nvar DEFAULT_CALLBACK = function DEFAULT_CALLBACK(instance, row, col, data, testResult) {\n  instance.getCellMeta(row, col).isSearchResult = testResult;\n};\n\nvar DEFAULT_QUERY_METHOD = function DEFAULT_QUERY_METHOD(query, value) {\n  if ((0, _mixed.isUndefined)(query) || query === null || !query.toLowerCase || query.length === 0) {\n    return false;\n  }\n  if ((0, _mixed.isUndefined)(value) || value === null) {\n    return false;\n  }\n\n  return value.toString().toLowerCase().indexOf(query.toLowerCase()) !== -1;\n};\n\n/**\n * @plugin Search\n *\n * @example\n *\n * ```js\n * ...\n *  // as boolean\n *  search: true\n *\n *  // as a object with one or more options\n *  search: {\n *    callback: myNewCallbackFunction,\n *    queryMethod: myNewQueryMethod,\n *    searchResultClass: 'customClass'\n *  }\n *\n * // Access to search plugin instance:\n * var searchPlugin = hot.getPlugin('search');\n *\n * // Set callback programmatically:\n * searchPlugin.setCallback(myNewCallbackFunction);\n * // Set query method programmatically:\n * searchPlugin.setQueryMethod(myNewQueryMethod);\n * // Set search result cells class programmatically:\n * searchPlugin.setSearchResultClass(customClass);\n * ...\n * ```\n */\n\nvar Search = function (_BasePlugin) {\n  _inherits(Search, _BasePlugin);\n\n  function Search(hotInstance) {\n    _classCallCheck(this, Search);\n\n    /**\n     * Function called during querying for each cell from the {@link DataMap}.\n     *\n     * @type {Function}\n     */\n    var _this = _possibleConstructorReturn(this, (Search.__proto__ || Object.getPrototypeOf(Search)).call(this, hotInstance));\n\n    _this.callback = DEFAULT_CALLBACK;\n    /**\n     * Query function is responsible for determining whether a query matches the value stored in a cell.\n     *\n     * @type {Function}\n     */\n    _this.queryMethod = DEFAULT_QUERY_METHOD;\n    /**\n     * Class name added to each cell that belongs to the searched query.\n     *\n     * @type {String}\n     */\n    _this.searchResultClass = DEFAULT_SEARCH_RESULT_CLASS;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(Search, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().search;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      var searchSettings = this.hot.getSettings().search;\n      this.updatePluginSettings(searchSettings);\n\n      this.addHook('beforeRenderer', function () {\n        return _this2.onBeforeRenderer.apply(_this2, arguments);\n      });\n\n      _get(Search.prototype.__proto__ || Object.getPrototypeOf(Search.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      var _this3 = this;\n\n      var beforeRendererCallback = function beforeRendererCallback() {\n        return _this3.onBeforeRenderer.apply(_this3, arguments);\n      };\n\n      this.hot.addHook('beforeRenderer', beforeRendererCallback);\n      this.hot.addHookOnce('afterRender', function () {\n        _this3.hot.removeHook('beforeRenderer', beforeRendererCallback);\n      });\n\n      _get(Search.prototype.__proto__ || Object.getPrototypeOf(Search.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(Search.prototype.__proto__ || Object.getPrototypeOf(Search.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Query method - used inside search input listener.\n     *\n     * @param {String} queryStr Searched value.\n     * @param {Function} [callback] Callback function performed on cells with values which matches to the searched query.\n     * @param {Function} [queryMethod] Query function responsible for determining whether a query matches the value stored in a cell.\n     *\n     * @returns {Array} Return array of objects with `row`, `col`, `data` properties or empty array.\n     */\n\n  }, {\n    key: 'query',\n    value: function query(queryStr) {\n      var _this4 = this;\n\n      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getCallback();\n      var queryMethod = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.getQueryMethod();\n\n      var rowCount = this.hot.countRows();\n      var colCount = this.hot.countCols();\n      var queryResult = [];\n      var instance = this.hot;\n\n      (0, _number.rangeEach)(0, rowCount - 1, function (rowIndex) {\n        (0, _number.rangeEach)(0, colCount - 1, function (colIndex) {\n          var cellData = _this4.hot.getDataAtCell(rowIndex, colIndex);\n          var cellProperties = _this4.hot.getCellMeta(rowIndex, colIndex);\n          var cellCallback = cellProperties.search.callback || callback;\n          var cellQueryMethod = cellProperties.search.queryMethod || queryMethod;\n          var testResult = cellQueryMethod(queryStr, cellData);\n\n          if (testResult) {\n            var singleResult = {\n              row: rowIndex,\n              col: colIndex,\n              data: cellData\n            };\n\n            queryResult.push(singleResult);\n          }\n\n          if (cellCallback) {\n            cellCallback(instance, rowIndex, colIndex, cellData, testResult);\n          }\n        });\n      });\n\n      return queryResult;\n    }\n  }, {\n    key: 'getCallback',\n\n\n    /**\n     * Get callback function.\n     *\n     * @returns {Function} Return the callback function.\n     */\n    value: function getCallback() {\n      return this.callback;\n    }\n\n    /**\n     * Set callback function.\n     *\n     * @param {Function} newCallback\n     */\n\n  }, {\n    key: 'setCallback',\n    value: function setCallback(newCallback) {\n      this.callback = newCallback;\n    }\n\n    /**\n     * Get queryMethod function.\n     *\n     * @returns {Function} Return the query method.\n     */\n\n  }, {\n    key: 'getQueryMethod',\n    value: function getQueryMethod() {\n      return this.queryMethod;\n    }\n\n    /**\n     * Set queryMethod function.\n     *\n     * @param {Function} newQueryMethod\n     */\n\n  }, {\n    key: 'setQueryMethod',\n    value: function setQueryMethod(newQueryMethod) {\n      this.queryMethod = newQueryMethod;\n    }\n\n    /**\n     * Get search result cells class.\n     *\n     * @returns {Function} Return the cell class.\n     */\n\n  }, {\n    key: 'getSearchResultClass',\n    value: function getSearchResultClass() {\n      return this.searchResultClass;\n    }\n\n    /**\n     * Set search result cells class.\n     *\n     * @param {String} newElementClass\n     */\n\n  }, {\n    key: 'setSearchResultClass',\n    value: function setSearchResultClass(newElementClass) {\n      this.searchResultClass = newElementClass;\n    }\n\n    /**\n     * Updates the settings of the plugin.\n     *\n     * @param {Object} searchSettings The plugin settings, taken from Handsontable configuration.\n     * @private\n     */\n\n  }, {\n    key: 'updatePluginSettings',\n    value: function updatePluginSettings(searchSettings) {\n      if ((0, _object.isObject)(searchSettings)) {\n        if (searchSettings.searchResultClass) {\n          this.setSearchResultClass(searchSettings.searchResultClass);\n        }\n\n        if (searchSettings.queryMethod) {\n          this.setQueryMethod(searchSettings.queryMethod);\n        }\n\n        if (searchSettings.callback) {\n          this.setCallback(searchSettings.callback);\n        }\n      }\n    }\n\n    /** *\n     * The `beforeRenderer` hook callback.\n     *\n     * @private\n     * @param {HTMLTableCellElement} TD The rendered `TD` element.\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {String | Number} prop Column property name or a column index, if datasource is an array of arrays.\n     * @param {String} value Value of the rendered cell.\n     * @param {Object} cellProperties Object containing the cell's properties.\n     */\n\n  }, {\n    key: 'onBeforeRenderer',\n    value: function onBeforeRenderer(TD, row, col, prop, value, cellProperties) {\n      // TODO: #4972\n      var className = cellProperties.className || [];\n      var classArray = [];\n\n      if (typeof className === 'string') {\n        classArray = className.split(' ');\n      } else {\n        var _classArray;\n\n        (_classArray = classArray).push.apply(_classArray, _toConsumableArray(className));\n      }\n\n      if (this.isEnabled() && cellProperties.isSearchResult) {\n        if (!classArray.includes(this.searchResultClass)) {\n          classArray.push('' + this.searchResultClass);\n        }\n      } else if (classArray.includes(this.searchResultClass)) {\n        classArray.splice(classArray.indexOf(this.searchResultClass), 1);\n      }\n\n      cellProperties.className = classArray.join(' ');\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(Search.prototype.__proto__ || Object.getPrototypeOf(Search.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return Search;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('search', Search);\n\nexports.default = Search;\n\n/***/ }),\n/* 477 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _feature = __webpack_require__(40);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @plugin TouchScroll\n * @class TouchScroll\n */\nvar TouchScroll = function (_BasePlugin) {\n  _inherits(TouchScroll, _BasePlugin);\n\n  function TouchScroll(hotInstance) {\n    _classCallCheck(this, TouchScroll);\n\n    /**\n     * Collection of scrollbars to update.\n     *\n     * @type {Array}\n     */\n    var _this = _possibleConstructorReturn(this, (TouchScroll.__proto__ || Object.getPrototypeOf(TouchScroll)).call(this, hotInstance));\n\n    _this.scrollbars = [];\n    /**\n     * Collection of overlays to update.\n     *\n     * @type {Array}\n     */\n    _this.clones = [];\n    /**\n     * Flag which determines if collection of overlays should be refilled on every table render.\n     *\n     * @type {Boolean}\n     * @default false\n     */\n    _this.lockedCollection = false;\n    /**\n     * Flag which determines if walkontable should freeze overlays while scrolling.\n     *\n     * @type {Boolean}\n     * @default false\n     */\n    _this.freezeOverlays = false;\n    return _this;\n  }\n\n  /**\n   * Check if plugin is enabled.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(TouchScroll, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return (0, _feature.isTouchSupported)();\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('afterRender', function () {\n        return _this2.onAfterRender();\n      });\n      this.registerEvents();\n\n      _get(TouchScroll.prototype.__proto__ || Object.getPrototypeOf(TouchScroll.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.lockedCollection = false;\n\n      _get(TouchScroll.prototype.__proto__ || Object.getPrototypeOf(TouchScroll.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(TouchScroll.prototype.__proto__ || Object.getPrototypeOf(TouchScroll.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Register all necessary events.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this3 = this;\n\n      this.addHook('beforeTouchScroll', function () {\n        return _this3.onBeforeTouchScroll();\n      });\n      this.addHook('afterMomentumScroll', function () {\n        return _this3.onAfterMomentumScroll();\n      });\n    }\n\n    /**\n     * After render listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterRender',\n    value: function onAfterRender() {\n      if (this.lockedCollection) {\n        return;\n      }\n\n      var _hot$view$wt$wtOverla = this.hot.view.wt.wtOverlays,\n          topOverlay = _hot$view$wt$wtOverla.topOverlay,\n          bottomOverlay = _hot$view$wt$wtOverla.bottomOverlay,\n          leftOverlay = _hot$view$wt$wtOverla.leftOverlay,\n          topLeftCornerOverlay = _hot$view$wt$wtOverla.topLeftCornerOverlay,\n          bottomLeftCornerOverlay = _hot$view$wt$wtOverla.bottomLeftCornerOverlay;\n\n\n      this.lockedCollection = true;\n      this.scrollbars.length = 0;\n      this.scrollbars.push(topOverlay);\n\n      if (bottomOverlay.clone) {\n        this.scrollbars.push(bottomOverlay);\n      }\n      this.scrollbars.push(leftOverlay);\n\n      if (topLeftCornerOverlay) {\n        this.scrollbars.push(topLeftCornerOverlay);\n      }\n      if (bottomLeftCornerOverlay && bottomLeftCornerOverlay.clone) {\n        this.scrollbars.push(bottomLeftCornerOverlay);\n      }\n\n      this.clones.length = 0;\n\n      if (topOverlay.needFullRender) {\n        this.clones.push(topOverlay.clone.wtTable.holder.parentNode);\n      }\n      if (bottomOverlay.needFullRender) {\n        this.clones.push(bottomOverlay.clone.wtTable.holder.parentNode);\n      }\n      if (leftOverlay.needFullRender) {\n        this.clones.push(leftOverlay.clone.wtTable.holder.parentNode);\n      }\n      if (topLeftCornerOverlay) {\n        this.clones.push(topLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      }\n      if (bottomLeftCornerOverlay && bottomLeftCornerOverlay.clone) {\n        this.clones.push(bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      }\n    }\n\n    /**\n     * Touch scroll listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onBeforeTouchScroll',\n    value: function onBeforeTouchScroll() {\n      this.freezeOverlays = true;\n\n      (0, _array.arrayEach)(this.clones, function (clone) {\n        (0, _element.addClass)(clone, 'hide-tween');\n      });\n    }\n\n    /**\n     * After momentum scroll listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterMomentumScroll',\n    value: function onAfterMomentumScroll() {\n      var _this4 = this;\n\n      this.freezeOverlays = false;\n\n      (0, _array.arrayEach)(this.clones, function (clone) {\n        (0, _element.removeClass)(clone, 'hide-tween');\n        (0, _element.addClass)(clone, 'show-tween');\n      });\n\n      setTimeout(function () {\n        (0, _array.arrayEach)(_this4.clones, function (clone) {\n          (0, _element.removeClass)(clone, 'show-tween');\n        });\n      }, 400);\n\n      (0, _array.arrayEach)(this.scrollbars, function (scrollbar) {\n        scrollbar.refresh();\n        scrollbar.resetFixedPosition();\n      });\n\n      this.hot.view.wt.wtOverlays.syncScrollWithMaster();\n    }\n  }]);\n\n  return TouchScroll;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('touchScroll', TouchScroll);\n\nexports.default = TouchScroll;\n\n/***/ }),\n/* 478 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _object = __webpack_require__(2);\n\nvar _event = __webpack_require__(12);\n\nvar _src = __webpack_require__(4);\n\nvar _utils = __webpack_require__(19);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /**\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * Handsontable UndoRedo class\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                */\n\n\n/**\n * @description\n * Handsontable UndoRedo plugin. It allows to undo and redo certain actions done in the table.\n * Please note, that not all actions are currently undo-able.\n *\n * @example\n * ```js\n * ...\n * undo: true\n * ...\n * ```\n * @class UndoRedo\n * @plugin UndoRedo\n */\nfunction UndoRedo(instance) {\n  var plugin = this;\n  this.instance = instance;\n  this.doneActions = [];\n  this.undoneActions = [];\n  this.ignoreNewActions = false;\n\n  instance.addHook('afterChange', function (changes, source) {\n    if (changes && source !== 'UndoRedo.undo' && source !== 'UndoRedo.redo' && source !== 'MergeCells') {\n      plugin.done(new UndoRedo.ChangeAction(changes));\n    }\n  });\n\n  instance.addHook('afterCreateRow', function (index, amount, source) {\n    if (source === 'UndoRedo.undo' || source === 'UndoRedo.undo' || source === 'auto') {\n      return;\n    }\n\n    var action = new UndoRedo.CreateRowAction(index, amount);\n    plugin.done(action);\n  });\n\n  instance.addHook('beforeRemoveRow', function (index, amount, logicRows, source) {\n    if (source === 'UndoRedo.undo' || source === 'UndoRedo.redo' || source === 'auto') {\n      return;\n    }\n\n    var originalData = plugin.instance.getSourceDataArray();\n\n    index = (originalData.length + index) % originalData.length;\n\n    var removedData = (0, _object.deepClone)(originalData.slice(index, index + amount));\n\n    plugin.done(new UndoRedo.RemoveRowAction(index, removedData));\n  });\n\n  instance.addHook('afterCreateCol', function (index, amount, source) {\n    if (source === 'UndoRedo.undo' || source === 'UndoRedo.redo' || source === 'auto') {\n      return;\n    }\n\n    plugin.done(new UndoRedo.CreateColumnAction(index, amount));\n  });\n\n  instance.addHook('beforeRemoveCol', function (index, amount, logicColumns, source) {\n    if (source === 'UndoRedo.undo' || source === 'UndoRedo.redo' || source === 'auto') {\n      return;\n    }\n\n    var originalData = plugin.instance.getSourceDataArray();\n\n    index = (plugin.instance.countCols() + index) % plugin.instance.countCols();\n\n    var removedData = [];\n    var headers = [];\n    var indexes = [];\n\n    (0, _number.rangeEach)(originalData.length - 1, function (i) {\n      var column = [];\n      var origRow = originalData[i];\n\n      (0, _number.rangeEach)(index, index + (amount - 1), function (j) {\n        column.push(origRow[instance.runHooks('modifyCol', j)]);\n      });\n      removedData.push(column);\n    });\n\n    (0, _number.rangeEach)(amount - 1, function (i) {\n      indexes.push(instance.runHooks('modifyCol', index + i));\n    });\n\n    if (Array.isArray(instance.getSettings().colHeaders)) {\n      (0, _number.rangeEach)(amount - 1, function (i) {\n        headers.push(instance.getSettings().colHeaders[instance.runHooks('modifyCol', index + i)] || null);\n      });\n    }\n\n    var manualColumnMovePlugin = plugin.instance.getPlugin('manualColumnMove');\n\n    var columnsMap = manualColumnMovePlugin.isEnabled() ? manualColumnMovePlugin.columnsMapper.__arrayMap : [];\n    var action = new UndoRedo.RemoveColumnAction(index, indexes, removedData, headers, columnsMap);\n\n    plugin.done(action);\n  });\n\n  instance.addHook('beforeCellAlignment', function (stateBefore, range, type, alignment) {\n    var action = new UndoRedo.CellAlignmentAction(stateBefore, range, type, alignment);\n    plugin.done(action);\n  });\n\n  instance.addHook('beforeFilter', function (conditionsStack) {\n    plugin.done(new UndoRedo.FiltersAction(conditionsStack));\n  });\n\n  instance.addHook('beforeRowMove', function (movedRows, target) {\n    if (movedRows === false) {\n      return;\n    }\n\n    plugin.done(new UndoRedo.RowMoveAction(movedRows, target));\n  });\n\n  instance.addHook('beforeMergeCells', function (cellRange, auto) {\n    if (auto) {\n      return;\n    }\n\n    plugin.done(new UndoRedo.MergeCellsAction(instance, cellRange));\n  });\n\n  instance.addHook('afterUnmergeCells', function (cellRange, auto) {\n    if (auto) {\n      return;\n    }\n\n    plugin.done(new UndoRedo.UnmergeCellsAction(instance, cellRange));\n  });\n}\n\nUndoRedo.prototype.done = function (action) {\n  if (!this.ignoreNewActions) {\n    this.doneActions.push(action);\n    this.undoneActions.length = 0;\n  }\n};\n\n/**\n * Undo last edit.\n *\n * @function undo\n * @memberof UndoRedo#\n */\nUndoRedo.prototype.undo = function () {\n  if (this.isUndoAvailable()) {\n    var action = this.doneActions.pop();\n    var actionClone = (0, _object.deepClone)(action);\n    var instance = this.instance;\n\n    var continueAction = instance.runHooks('beforeUndo', actionClone);\n\n    if (continueAction === false) {\n      return;\n    }\n\n    this.ignoreNewActions = true;\n    var that = this;\n    action.undo(this.instance, function () {\n      that.ignoreNewActions = false;\n      that.undoneActions.push(action);\n    });\n\n    instance.runHooks('afterUndo', actionClone);\n  }\n};\n\n/**\n * Redo edit (used to reverse an undo).\n *\n * @function redo\n * @memberof UndoRedo#\n */\nUndoRedo.prototype.redo = function () {\n  if (this.isRedoAvailable()) {\n    var action = this.undoneActions.pop();\n    var actionClone = (0, _object.deepClone)(action);\n    var instance = this.instance;\n\n    var continueAction = instance.runHooks('beforeRedo', actionClone);\n\n    if (continueAction === false) {\n      return;\n    }\n\n    this.ignoreNewActions = true;\n    var that = this;\n    action.redo(this.instance, function () {\n      that.ignoreNewActions = false;\n      that.doneActions.push(action);\n    });\n\n    instance.runHooks('afterRedo', actionClone);\n  }\n};\n\n/**\n * Check if undo action is available.\n *\n * @function isUndoAvailable\n * @memberof UndoRedo#\n * @return {Boolean} Return `true` if undo can be performed, `false` otherwise\n */\nUndoRedo.prototype.isUndoAvailable = function () {\n  return this.doneActions.length > 0;\n};\n\n/**\n * Check if redo action is available.\n *\n * @function isRedoAvailable\n * @memberof UndoRedo#\n * @return {Boolean} Return `true` if redo can be performed, `false` otherwise.\n */\nUndoRedo.prototype.isRedoAvailable = function () {\n  return this.undoneActions.length > 0;\n};\n\n/**\n * Clears undo history.\n *\n * @function clear\n * @memberof UndoRedo#\n */\nUndoRedo.prototype.clear = function () {\n  this.doneActions.length = 0;\n  this.undoneActions.length = 0;\n};\n\nUndoRedo.Action = function () {};\nUndoRedo.Action.prototype.undo = function () {};\nUndoRedo.Action.prototype.redo = function () {};\n\n/**\n * Change action.\n */\nUndoRedo.ChangeAction = function (changes) {\n  this.changes = changes;\n  this.actionType = 'change';\n};\n(0, _object.inherit)(UndoRedo.ChangeAction, UndoRedo.Action);\n\nUndoRedo.ChangeAction.prototype.undo = function (instance, undoneCallback) {\n  var data = (0, _object.deepClone)(this.changes),\n      emptyRowsAtTheEnd = instance.countEmptyRows(true),\n      emptyColsAtTheEnd = instance.countEmptyCols(true);\n\n  for (var i = 0, len = data.length; i < len; i++) {\n    data[i].splice(3, 1);\n  }\n\n  instance.addHookOnce('afterChange', undoneCallback);\n\n  instance.setDataAtRowProp(data, null, null, 'UndoRedo.undo');\n\n  for (var _i = 0, _len = data.length; _i < _len; _i++) {\n    if (instance.getSettings().minSpareRows && data[_i][0] + 1 + instance.getSettings().minSpareRows === instance.countRows() && emptyRowsAtTheEnd === instance.getSettings().minSpareRows) {\n\n      instance.alter('remove_row', parseInt(data[_i][0] + 1, 10), instance.getSettings().minSpareRows);\n      instance.undoRedo.doneActions.pop();\n    }\n\n    if (instance.getSettings().minSpareCols && data[_i][1] + 1 + instance.getSettings().minSpareCols === instance.countCols() && emptyColsAtTheEnd === instance.getSettings().minSpareCols) {\n\n      instance.alter('remove_col', parseInt(data[_i][1] + 1, 10), instance.getSettings().minSpareCols);\n      instance.undoRedo.doneActions.pop();\n    }\n  }\n};\nUndoRedo.ChangeAction.prototype.redo = function (instance, onFinishCallback) {\n  var data = (0, _object.deepClone)(this.changes);\n\n  for (var i = 0, len = data.length; i < len; i++) {\n    data[i].splice(2, 1);\n  }\n\n  instance.addHookOnce('afterChange', onFinishCallback);\n  instance.setDataAtRowProp(data, null, null, 'UndoRedo.redo');\n};\n\n/**\n * Create row action.\n */\nUndoRedo.CreateRowAction = function (index, amount) {\n  this.index = index;\n  this.amount = amount;\n  this.actionType = 'insert_row';\n};\n(0, _object.inherit)(UndoRedo.CreateRowAction, UndoRedo.Action);\n\nUndoRedo.CreateRowAction.prototype.undo = function (instance, undoneCallback) {\n  var rowCount = instance.countRows(),\n      minSpareRows = instance.getSettings().minSpareRows;\n\n  if (this.index >= rowCount && this.index - minSpareRows < rowCount) {\n    this.index -= minSpareRows; // work around the situation where the needed row was removed due to an 'undo' of a made change\n  }\n\n  instance.addHookOnce('afterRemoveRow', undoneCallback);\n  instance.alter('remove_row', this.index, this.amount, 'UndoRedo.undo');\n};\nUndoRedo.CreateRowAction.prototype.redo = function (instance, redoneCallback) {\n  instance.addHookOnce('afterCreateRow', redoneCallback);\n  instance.alter('insert_row', this.index, this.amount, 'UndoRedo.redo');\n};\n\n/**\n * Remove row action.\n */\nUndoRedo.RemoveRowAction = function (index, data) {\n  this.index = index;\n  this.data = data;\n  this.actionType = 'remove_row';\n};\n(0, _object.inherit)(UndoRedo.RemoveRowAction, UndoRedo.Action);\n\nUndoRedo.RemoveRowAction.prototype.undo = function (instance, undoneCallback) {\n  instance.alter('insert_row', this.index, this.data.length, 'UndoRedo.undo');\n  instance.addHookOnce('afterRender', undoneCallback);\n  instance.populateFromArray(this.index, 0, this.data, void 0, void 0, 'UndoRedo.undo');\n};\nUndoRedo.RemoveRowAction.prototype.redo = function (instance, redoneCallback) {\n  instance.addHookOnce('afterRemoveRow', redoneCallback);\n  instance.alter('remove_row', this.index, this.data.length, 'UndoRedo.redo');\n};\n\n/**\n * Create column action.\n */\nUndoRedo.CreateColumnAction = function (index, amount) {\n  this.index = index;\n  this.amount = amount;\n  this.actionType = 'insert_col';\n};\n(0, _object.inherit)(UndoRedo.CreateColumnAction, UndoRedo.Action);\n\nUndoRedo.CreateColumnAction.prototype.undo = function (instance, undoneCallback) {\n  instance.addHookOnce('afterRemoveCol', undoneCallback);\n  instance.alter('remove_col', this.index, this.amount, 'UndoRedo.undo');\n};\nUndoRedo.CreateColumnAction.prototype.redo = function (instance, redoneCallback) {\n  instance.addHookOnce('afterCreateCol', redoneCallback);\n  instance.alter('insert_col', this.index, this.amount, 'UndoRedo.redo');\n};\n\n/**\n * Remove column action.\n */\nUndoRedo.RemoveColumnAction = function (index, indexes, data, headers, columnPositions) {\n  this.index = index;\n  this.indexes = indexes;\n  this.data = data;\n  this.amount = this.data[0].length;\n  this.headers = headers;\n  this.columnPositions = columnPositions.slice(0);\n  this.actionType = 'remove_col';\n};\n(0, _object.inherit)(UndoRedo.RemoveColumnAction, UndoRedo.Action);\n\nUndoRedo.RemoveColumnAction.prototype.undo = function (instance, undoneCallback) {\n  var _this = this;\n\n  var row = void 0;\n  var ascendingIndexes = this.indexes.slice(0).sort();\n  var sortByIndexes = function sortByIndexes(elem, j, arr) {\n    return arr[_this.indexes.indexOf(ascendingIndexes[j])];\n  };\n\n  var sortedData = [];\n  (0, _number.rangeEach)(this.data.length - 1, function (i) {\n    sortedData[i] = (0, _array.arrayMap)(_this.data[i], sortByIndexes);\n  });\n\n  var sortedHeaders = [];\n  sortedHeaders = (0, _array.arrayMap)(this.headers, sortByIndexes);\n\n  var changes = [];\n\n  // TODO: Temporary hook for undo/redo mess\n  instance.runHooks('beforeCreateCol', this.indexes[0], this.indexes.length, 'UndoRedo.undo');\n\n  (0, _number.rangeEach)(this.data.length - 1, function (i) {\n    row = instance.getSourceDataAtRow(i);\n\n    (0, _number.rangeEach)(ascendingIndexes.length - 1, function (j) {\n      row.splice(ascendingIndexes[j], 0, sortedData[i][j]);\n      changes.push([i, ascendingIndexes[j], null, sortedData[i][j]]);\n    });\n  });\n\n  // TODO: Temporary hook for undo/redo mess\n  if (instance.getPlugin('formulas')) {\n    instance.getPlugin('formulas').onAfterSetDataAtCell(changes);\n  }\n\n  if (typeof this.headers !== 'undefined') {\n    (0, _number.rangeEach)(sortedHeaders.length - 1, function (j) {\n      instance.getSettings().colHeaders.splice(ascendingIndexes[j], 0, sortedHeaders[j]);\n    });\n  }\n\n  if (instance.getPlugin('manualColumnMove')) {\n    instance.getPlugin('manualColumnMove').columnsMapper.__arrayMap = this.columnPositions;\n  }\n\n  instance.addHookOnce('afterRender', undoneCallback);\n\n  // TODO: Temporary hook for undo/redo mess\n  instance.runHooks('afterCreateCol', this.indexes[0], this.indexes.length, 'UndoRedo.undo');\n\n  if (instance.getPlugin('formulas')) {\n    instance.getPlugin('formulas').recalculateFull();\n  }\n\n  instance.render();\n};\n\nUndoRedo.RemoveColumnAction.prototype.redo = function (instance, redoneCallback) {\n  instance.addHookOnce('afterRemoveCol', redoneCallback);\n  instance.alter('remove_col', this.index, this.amount, 'UndoRedo.redo');\n};\n\n/**\n * Cell alignment action.\n */\nUndoRedo.CellAlignmentAction = function (stateBefore, range, type, alignment) {\n  this.stateBefore = stateBefore;\n  this.range = range;\n  this.type = type;\n  this.alignment = alignment;\n};\nUndoRedo.CellAlignmentAction.prototype.undo = function (instance, undoneCallback) {\n  var _this2 = this;\n\n  (0, _array.arrayEach)(this.range, function (_ref) {\n    var from = _ref.from,\n        to = _ref.to;\n\n    for (var row = from.row; row <= to.row; row += 1) {\n      for (var col = from.col; col <= to.col; col += 1) {\n        instance.setCellMeta(row, col, 'className', _this2.stateBefore[row][col] || ' htLeft');\n      }\n    }\n  });\n\n  instance.addHookOnce('afterRender', undoneCallback);\n  instance.render();\n};\nUndoRedo.CellAlignmentAction.prototype.redo = function (instance, undoneCallback) {\n  (0, _utils.align)(this.range, this.type, this.alignment, function (row, col) {\n    return instance.getCellMeta(row, col);\n  }, function (row, col, key, value) {\n    return instance.setCellMeta(row, col, key, value);\n  });\n\n  instance.addHookOnce('afterRender', undoneCallback);\n  instance.render();\n};\n\n/**\n * Filters action.\n */\nUndoRedo.FiltersAction = function (conditionsStack) {\n  this.conditionsStack = conditionsStack;\n  this.actionType = 'filter';\n};\n(0, _object.inherit)(UndoRedo.FiltersAction, UndoRedo.Action);\n\nUndoRedo.FiltersAction.prototype.undo = function (instance, undoneCallback) {\n  var filters = instance.getPlugin('filters');\n\n  instance.addHookOnce('afterRender', undoneCallback);\n\n  filters.conditionCollection.importAllConditions(this.conditionsStack.slice(0, this.conditionsStack.length - 1));\n  filters.filter();\n};\nUndoRedo.FiltersAction.prototype.redo = function (instance, redoneCallback) {\n  var filters = instance.getPlugin('filters');\n\n  instance.addHookOnce('afterRender', redoneCallback);\n\n  filters.conditionCollection.importAllConditions(this.conditionsStack);\n  filters.filter();\n};\n\n/**\n * Merge Cells action.\n * @util\n */\n\nvar MergeCellsAction = function (_UndoRedo$Action) {\n  _inherits(MergeCellsAction, _UndoRedo$Action);\n\n  function MergeCellsAction(instance, cellRange) {\n    _classCallCheck(this, MergeCellsAction);\n\n    var _this3 = _possibleConstructorReturn(this, (MergeCellsAction.__proto__ || Object.getPrototypeOf(MergeCellsAction)).call(this));\n\n    _this3.cellRange = cellRange;\n    _this3.rangeData = instance.getData(cellRange.from.row, cellRange.from.col, cellRange.to.row, cellRange.to.col);\n    return _this3;\n  }\n\n  _createClass(MergeCellsAction, [{\n    key: 'undo',\n    value: function undo(instance, undoneCallback) {\n      var mergeCellsPlugin = instance.getPlugin('mergeCells');\n      instance.addHookOnce('afterRender', undoneCallback);\n\n      mergeCellsPlugin.unmergeRange(this.cellRange, true);\n      instance.populateFromArray(this.cellRange.from.row, this.cellRange.from.col, this.rangeData, void 0, void 0, 'MergeCells');\n    }\n  }, {\n    key: 'redo',\n    value: function redo(instance, redoneCallback) {\n      var mergeCellsPlugin = instance.getPlugin('mergeCells');\n      instance.addHookOnce('afterRender', redoneCallback);\n\n      mergeCellsPlugin.mergeRange(this.cellRange);\n    }\n  }]);\n\n  return MergeCellsAction;\n}(UndoRedo.Action);\n\nUndoRedo.MergeCellsAction = MergeCellsAction;\n\n/**\n * Unmerge Cells action.\n * @util\n */\n\nvar UnmergeCellsAction = function (_UndoRedo$Action2) {\n  _inherits(UnmergeCellsAction, _UndoRedo$Action2);\n\n  function UnmergeCellsAction(instance, cellRange) {\n    _classCallCheck(this, UnmergeCellsAction);\n\n    var _this4 = _possibleConstructorReturn(this, (UnmergeCellsAction.__proto__ || Object.getPrototypeOf(UnmergeCellsAction)).call(this));\n\n    _this4.cellRange = cellRange;\n    return _this4;\n  }\n\n  _createClass(UnmergeCellsAction, [{\n    key: 'undo',\n    value: function undo(instance, undoneCallback) {\n      var mergeCellsPlugin = instance.getPlugin('mergeCells');\n      instance.addHookOnce('afterRender', undoneCallback);\n\n      mergeCellsPlugin.mergeRange(this.cellRange, true);\n    }\n  }, {\n    key: 'redo',\n    value: function redo(instance, redoneCallback) {\n      var mergeCellsPlugin = instance.getPlugin('mergeCells');\n      instance.addHookOnce('afterRender', redoneCallback);\n\n      mergeCellsPlugin.unmergeRange(this.cellRange, true);\n      instance.render();\n    }\n  }]);\n\n  return UnmergeCellsAction;\n}(UndoRedo.Action);\n\nUndoRedo.UnmergeCellsAction = UnmergeCellsAction;\n\n/**\n * ManualRowMove action.\n * @TODO: removeRow undo should works on logical index\n */\nUndoRedo.RowMoveAction = function (movedRows, target) {\n  this.rows = movedRows.slice();\n  this.target = target;\n};\n(0, _object.inherit)(UndoRedo.RowMoveAction, UndoRedo.Action);\n\nUndoRedo.RowMoveAction.prototype.undo = function (instance, undoneCallback) {\n  var manualRowMove = instance.getPlugin('manualRowMove');\n\n  instance.addHookOnce('afterRender', undoneCallback);\n\n  var mod = this.rows[0] < this.target ? -1 * this.rows.length : 0;\n  var newTarget = this.rows[0] > this.target ? this.rows[0] + this.rows.length : this.rows[0];\n  var newRows = [];\n  var rowsLen = this.rows.length + mod;\n\n  for (var i = mod; i < rowsLen; i += 1) {\n    newRows.push(this.target + i);\n  }\n\n  manualRowMove.moveRows(newRows.slice(), newTarget);\n  instance.render();\n\n  instance.selectCell(this.rows[0], 0, this.rows[this.rows.length - 1], instance.countCols() - 1, false, false);\n};\nUndoRedo.RowMoveAction.prototype.redo = function (instance, redoneCallback) {\n  var manualRowMove = instance.getPlugin('manualRowMove');\n\n  instance.addHookOnce('afterRender', redoneCallback);\n  manualRowMove.moveRows(this.rows.slice(), this.target);\n  instance.render();\n  var startSelection = this.rows[0] < this.target ? this.target - this.rows.length : this.target;\n\n  instance.selectCell(startSelection, 0, startSelection + this.rows.length - 1, instance.countCols() - 1, false, false);\n};\n\nfunction init() {\n  var instance = this;\n  var pluginEnabled = typeof instance.getSettings().undo == 'undefined' || instance.getSettings().undo;\n\n  if (pluginEnabled) {\n    if (!instance.undoRedo) {\n      /**\n       * Instance of Handsontable.UndoRedo Plugin {@link Handsontable.UndoRedo}\n       *\n       * @alias undoRedo\n       * @memberof! Handsontable.Core#\n       * @type {UndoRedo}\n       */\n      instance.undoRedo = new UndoRedo(instance);\n\n      exposeUndoRedoMethods(instance);\n\n      instance.addHook('beforeKeyDown', onBeforeKeyDown);\n      instance.addHook('afterChange', onAfterChange);\n    }\n  } else if (instance.undoRedo) {\n    delete instance.undoRedo;\n\n    removeExposedUndoRedoMethods(instance);\n\n    instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n    instance.removeHook('afterChange', onAfterChange);\n  }\n}\n\nfunction onBeforeKeyDown(event) {\n  var instance = this;\n\n  var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey;\n\n  if (ctrlDown) {\n    if (event.keyCode === 89 || event.shiftKey && event.keyCode === 90) {\n      // CTRL + Y or CTRL + SHIFT + Z\n      instance.undoRedo.redo();\n      (0, _event.stopImmediatePropagation)(event);\n    } else if (event.keyCode === 90) {\n      // CTRL + Z\n      instance.undoRedo.undo();\n      (0, _event.stopImmediatePropagation)(event);\n    }\n  }\n}\n\nfunction onAfterChange(changes, source) {\n  var instance = this;\n  if (source === 'loadData') {\n    return instance.undoRedo.clear();\n  }\n}\n\nfunction exposeUndoRedoMethods(instance) {\n  /**\n   * {@link UndoRedo#undo}\n   * @alias undo\n   * @memberof! Handsontable.Core#\n   */\n  instance.undo = function () {\n    return instance.undoRedo.undo();\n  };\n\n  /**\n   * {@link UndoRedo#redo}\n   * @alias redo\n   * @memberof! Handsontable.Core#\n   */\n  instance.redo = function () {\n    return instance.undoRedo.redo();\n  };\n\n  /**\n   * {@link UndoRedo#isUndoAvailable}\n   * @alias isUndoAvailable\n   * @memberof! Handsontable.Core#\n   */\n  instance.isUndoAvailable = function () {\n    return instance.undoRedo.isUndoAvailable();\n  };\n\n  /**\n   * {@link UndoRedo#isRedoAvailable}\n   * @alias isRedoAvailable\n   * @memberof! Handsontable.Core#\n   */\n  instance.isRedoAvailable = function () {\n    return instance.undoRedo.isRedoAvailable();\n  };\n\n  /**\n   * {@link UndoRedo#clear}\n   * @alias clearUndo\n   * @memberof! Handsontable.Core#\n   */\n  instance.clearUndo = function () {\n    return instance.undoRedo.clear();\n  };\n}\n\nfunction removeExposedUndoRedoMethods(instance) {\n  delete instance.undo;\n  delete instance.redo;\n  delete instance.isUndoAvailable;\n  delete instance.isRedoAvailable;\n  delete instance.clearUndo;\n}\n\nvar hook = _pluginHooks2.default.getSingleton();\n\nhook.add('afterInit', init);\nhook.add('afterUpdateSettings', init);\n\nhook.register('beforeUndo');\nhook.register('afterUndo');\nhook.register('beforeRedo');\nhook.register('afterRedo');\n\nexports.default = UndoRedo;\n\n/***/ })\n/******/ ])[\"default\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/dist/handsontable.js",
    "content": "/*!\n * (The MIT License)\n * \n * Copyright (c) 2012-2014 Marcin Warpechowski\n * Copyright (c) 2015 Handsoncode sp. z o.o. <hello@handsoncode.net>\n * \n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * 'Software'), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n * \n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n * \n * Version: 2.0.0\n * Release date: 11/04/2018 (built at 10/04/2018 11:38:33)\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"moment\"), require(\"numbro\"), require(\"pikaday\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"Handsontable\", [\"moment\", \"numbro\", \"pikaday\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Handsontable\"] = factory(require(\"moment\"), require(\"numbro\"), require(\"pikaday\"));\n\telse\n\t\troot[\"Handsontable\"] = factory(root[\"moment\"], root[\"numbro\"], root[\"Pikaday\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_55__, __WEBPACK_EXTERNAL_MODULE_247__, __WEBPACK_EXTERNAL_MODULE_236__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 206);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.HTML_CHARACTERS = undefined;\nexports.getParent = getParent;\nexports.closest = closest;\nexports.closestDown = closestDown;\nexports.isChildOf = isChildOf;\nexports.isChildOfWebComponentTable = isChildOfWebComponentTable;\nexports.polymerWrap = polymerWrap;\nexports.polymerUnwrap = polymerUnwrap;\nexports.index = index;\nexports.overlayContainsElement = overlayContainsElement;\nexports.hasClass = hasClass;\nexports.addClass = addClass;\nexports.removeClass = removeClass;\nexports.removeTextNodes = removeTextNodes;\nexports.empty = empty;\nexports.fastInnerHTML = fastInnerHTML;\nexports.fastInnerText = fastInnerText;\nexports.isVisible = isVisible;\nexports.offset = offset;\nexports.getWindowScrollTop = getWindowScrollTop;\nexports.getWindowScrollLeft = getWindowScrollLeft;\nexports.getScrollTop = getScrollTop;\nexports.getScrollLeft = getScrollLeft;\nexports.getScrollableElement = getScrollableElement;\nexports.getTrimmingContainer = getTrimmingContainer;\nexports.getStyle = getStyle;\nexports.getComputedStyle = getComputedStyle;\nexports.outerWidth = outerWidth;\nexports.outerHeight = outerHeight;\nexports.innerHeight = innerHeight;\nexports.innerWidth = innerWidth;\nexports.addEvent = addEvent;\nexports.removeEvent = removeEvent;\nexports.getCaretPosition = getCaretPosition;\nexports.getSelectionEndPosition = getSelectionEndPosition;\nexports.getSelectionText = getSelectionText;\nexports.setCaretPosition = setCaretPosition;\nexports.getScrollbarWidth = getScrollbarWidth;\nexports.hasVerticalScrollbar = hasVerticalScrollbar;\nexports.hasHorizontalScrollbar = hasHorizontalScrollbar;\nexports.setOverlayPosition = setOverlayPosition;\nexports.getCssTransform = getCssTransform;\nexports.resetCssTransform = resetCssTransform;\nexports.isInput = isInput;\nexports.isOutsideInput = isOutsideInput;\n\nvar _browser = __webpack_require__(27);\n\nvar _feature = __webpack_require__(40);\n\n/**\n * Get the parent of the specified node in the DOM tree.\n *\n * @param  {HTMLElement} element Element from which traversing is started.\n * @param  {Number} [level=0] Traversing deep level.\n * @return {HTMLElement|null}\n */\nfunction getParent(element) {\n  var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n  var iteration = -1;\n  var parent = null;\n\n  while (element != null) {\n    if (iteration === level) {\n      parent = element;\n      break;\n    }\n\n    if (element.host && element.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      element = element.host;\n    } else {\n      iteration++;\n      element = element.parentNode;\n    }\n  }\n\n  return parent;\n}\n\n/**\n * Goes up the DOM tree (including given element) until it finds an element that matches the nodes or nodes name.\n * This method goes up through web components.\n *\n * @param {HTMLElement} element Element from which traversing is started\n * @param {Array} nodes Array of elements or Array of elements name\n * @param {HTMLElement} [until]\n * @returns {HTMLElement|null}\n */\nfunction closest(element, nodes, until) {\n  while (element != null && element !== until) {\n    if (element.nodeType === Node.ELEMENT_NODE && (nodes.indexOf(element.nodeName) > -1 || nodes.indexOf(element) > -1)) {\n      return element;\n    }\n    if (element.host && element.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      element = element.host;\n    } else {\n      element = element.parentNode;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Goes \"down\" the DOM tree (including given element) until it finds an element that matches the nodes or nodes name.\n *\n * @param {HTMLElement} element Element from which traversing is started\n * @param {Array} nodes Array of elements or Array of elements name\n * @param {HTMLElement} [until]\n * @returns {HTMLElement|null}\n */\nfunction closestDown(element, nodes, until) {\n  var matched = [];\n\n  while (element) {\n    element = closest(element, nodes, until);\n\n    if (!element || until && !until.contains(element)) {\n      break;\n    }\n    matched.push(element);\n\n    if (element.host && element.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      element = element.host;\n    } else {\n      element = element.parentNode;\n    }\n  }\n  var length = matched.length;\n\n  return length ? matched[length - 1] : null;\n}\n\n/**\n * Goes up the DOM tree and checks if element is child of another element.\n *\n * @param child Child element\n * @param {Object|String} parent Parent element OR selector of the parent element.\n *                               If string provided, function returns `true` for the first occurrence of element with that class.\n * @returns {Boolean}\n */\nfunction isChildOf(child, parent) {\n  var node = child.parentNode;\n  var queriedParents = [];\n\n  if (typeof parent === 'string') {\n    queriedParents = Array.prototype.slice.call(document.querySelectorAll(parent), 0);\n  } else {\n    queriedParents.push(parent);\n  }\n\n  while (node != null) {\n    if (queriedParents.indexOf(node) > -1) {\n      return true;\n    }\n    node = node.parentNode;\n  }\n\n  return false;\n}\n\n/**\n * Check if an element is part of `hot-table` web component.\n *\n * @param {Element} element\n * @returns {Boolean}\n */\nfunction isChildOfWebComponentTable(element) {\n  var hotTableName = 'hot-table',\n      result = false,\n      parentNode;\n\n  parentNode = polymerWrap(element);\n\n  function isHotTable(element) {\n    return element.nodeType === Node.ELEMENT_NODE && element.nodeName === hotTableName.toUpperCase();\n  }\n\n  while (parentNode != null) {\n    if (isHotTable(parentNode)) {\n      result = true;\n      break;\n    } else if (parentNode.host && parentNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      result = isHotTable(parentNode.host);\n\n      if (result) {\n        break;\n      }\n      parentNode = parentNode.host;\n    }\n    parentNode = parentNode.parentNode;\n  }\n\n  return result;\n}\n\n/**\n * Wrap element into polymer/webcomponent container if exists\n *\n * @param element\n * @returns {*}\n */\nfunction polymerWrap(element) {\n  /* global Polymer */\n  return typeof Polymer !== 'undefined' && typeof wrap === 'function' ? wrap(element) : element;\n}\n\n/**\n * Unwrap element from polymer/webcomponent container if exists\n *\n * @param element\n * @returns {*}\n */\nfunction polymerUnwrap(element) {\n  /* global Polymer */\n  return typeof Polymer !== 'undefined' && typeof unwrap === 'function' ? unwrap(element) : element;\n}\n\n/**\n * Counts index of element within its parent\n * WARNING: for performance reasons, assumes there are only element nodes (no text nodes). This is true for Walkotnable\n * Otherwise would need to check for nodeType or use previousElementSibling\n *\n * @see http://jsperf.com/sibling-index/10\n * @param {Element} element\n * @return {Number}\n */\nfunction index(element) {\n  var i = 0;\n\n  if (element.previousSibling) {\n    /* eslint-disable no-cond-assign */\n    while (element = element.previousSibling) {\n      ++i;\n    }\n  }\n\n  return i;\n}\n\n/**\n * Check if the provided overlay contains the provided element\n *\n * @param {String} overlay\n * @param {HTMLElement} element\n * @returns {boolean}\n */\nfunction overlayContainsElement(overlayType, element) {\n  var overlayElement = document.querySelector('.ht_clone_' + overlayType);\n  return overlayElement ? overlayElement.contains(element) : null;\n}\n\nvar classListSupport = !!document.documentElement.classList;\nvar _hasClass, _addClass, _removeClass;\n\nfunction filterEmptyClassNames(classNames) {\n  var result = [];\n\n  if (!classNames || !classNames.length) {\n    return result;\n  }\n\n  var len = 0;\n\n  while (classNames[len]) {\n    result.push(classNames[len]);\n    len++;\n  }\n\n  return result;\n}\n\nif (classListSupport) {\n  var isSupportMultipleClassesArg = function () {\n    var element = document.createElement('div');\n\n    element.classList.add('test', 'test2');\n\n    return element.classList.contains('test2');\n  }();\n\n  _hasClass = function _hasClass(element, className) {\n    if (element.classList === void 0 || typeof className !== 'string' || className === '') {\n      return false;\n    }\n\n    return element.classList.contains(className);\n  };\n\n  _addClass = function _addClass(element, className) {\n    if (typeof className === 'string') {\n      className = className.split(' ');\n    }\n\n    className = filterEmptyClassNames(className);\n\n    if (className.length > 0) {\n      if (isSupportMultipleClassesArg) {\n        element.classList.add.apply(element.classList, className);\n      } else {\n        var len = 0;\n\n        while (className && className[len]) {\n          element.classList.add(className[len]);\n          len++;\n        }\n      }\n    }\n  };\n\n  _removeClass = function _removeClass(element, className) {\n    if (typeof className === 'string') {\n      className = className.split(' ');\n    }\n\n    className = filterEmptyClassNames(className);\n\n    if (className.length > 0) {\n      if (isSupportMultipleClassesArg) {\n        element.classList.remove.apply(element.classList, className);\n      } else {\n        var len = 0;\n\n        while (className && className[len]) {\n          element.classList.remove(className[len]);\n          len++;\n        }\n      }\n    }\n  };\n} else {\n  var createClassNameRegExp = function createClassNameRegExp(className) {\n    return new RegExp('(\\\\s|^)' + className + '(\\\\s|$)');\n  };\n\n  _hasClass = function _hasClass(element, className) {\n    // http://snipplr.com/view/3561/addclass-removeclass-hasclass/\n    return element.className !== void 0 && createClassNameRegExp(className).test(element.className);\n  };\n\n  _addClass = function _addClass(element, className) {\n    var len = 0,\n        _className = element.className;\n\n    if (typeof className === 'string') {\n      className = className.split(' ');\n    }\n    if (_className === '') {\n      _className = className.join(' ');\n    } else {\n      while (className && className[len]) {\n        if (!createClassNameRegExp(className[len]).test(_className)) {\n          _className += ' ' + className[len];\n        }\n        len++;\n      }\n    }\n    element.className = _className;\n  };\n\n  _removeClass = function _removeClass(element, className) {\n    var len = 0,\n        _className = element.className;\n\n    if (typeof className === 'string') {\n      className = className.split(' ');\n    }\n    while (className && className[len]) {\n      // String.prototype.trim is defined in polyfill.js\n      _className = _className.replace(createClassNameRegExp(className[len]), ' ').trim();\n      len++;\n    }\n    if (element.className !== _className) {\n      element.className = _className;\n    }\n  };\n}\n\n/**\n * Checks if element has class name\n *\n * @param {HTMLElement} element\n * @param {String} className Class name to check\n * @returns {Boolean}\n */\nfunction hasClass(element, className) {\n  return _hasClass(element, className);\n}\n\n/**\n * Add class name to an element\n *\n * @param {HTMLElement} element\n * @param {String|Array} className Class name as string or array of strings\n */\nfunction addClass(element, className) {\n  return _addClass(element, className);\n}\n\n/**\n * Remove class name from an element\n *\n * @param {HTMLElement} element\n * @param {String|Array} className Class name as string or array of strings\n */\nfunction removeClass(element, className) {\n  return _removeClass(element, className);\n}\n\nfunction removeTextNodes(element, parent) {\n  if (element.nodeType === 3) {\n    parent.removeChild(element); // bye text nodes!\n  } else if (['TABLE', 'THEAD', 'TBODY', 'TFOOT', 'TR'].indexOf(element.nodeName) > -1) {\n    var childs = element.childNodes;\n    for (var i = childs.length - 1; i >= 0; i--) {\n      removeTextNodes(childs[i], element);\n    }\n  }\n}\n\n/**\n * Remove childs function\n * WARNING - this doesn't unload events and data attached by jQuery\n * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/9\n * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/11 - no siginificant improvement with Chrome remove() method\n *\n * @param element\n * @returns {void}\n */\n//\nfunction empty(element) {\n  var child;\n  /* eslint-disable no-cond-assign */\n  while (child = element.lastChild) {\n    element.removeChild(child);\n  }\n}\n\nvar HTML_CHARACTERS = exports.HTML_CHARACTERS = /(<(.*)>|&(.*);)/;\n\n/**\n * Insert content into element trying avoid innerHTML method.\n * @return {void}\n */\nfunction fastInnerHTML(element, content) {\n  if (HTML_CHARACTERS.test(content)) {\n    element.innerHTML = content;\n  } else {\n    fastInnerText(element, content);\n  }\n}\n\n/**\n * Insert text content into element\n * @return {void}\n */\n\nvar textContextSupport = !!document.createTextNode('test').textContent;\n\nfunction fastInnerText(element, content) {\n  var child = element.firstChild;\n\n  if (child && child.nodeType === 3 && child.nextSibling === null) {\n    // fast lane - replace existing text node\n\n    if (textContextSupport) {\n      // http://jsperf.com/replace-text-vs-reuse\n      child.textContent = content;\n    } else {\n      // http://jsperf.com/replace-text-vs-reuse\n      child.data = content;\n    }\n  } else {\n    // slow lane - empty element and insert a text node\n    empty(element);\n    element.appendChild(document.createTextNode(content));\n  }\n}\n\n/**\n * Returns true if element is attached to the DOM and visible, false otherwise\n * @param elem\n * @returns {boolean}\n */\nfunction isVisible(elem) {\n  var next = elem;\n\n  while (polymerUnwrap(next) !== document.documentElement) {\n    // until <html> reached\n    if (next === null) {\n      // parent detached from DOM\n      return false;\n    } else if (next.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      if (next.host) {\n        // this is Web Components Shadow DOM\n        // see: http://w3c.github.io/webcomponents/spec/shadow/#encapsulation\n        // according to spec, should be if (next.ownerDocument !== window.document), but that doesn't work yet\n        if (next.host.impl) {\n          // Chrome 33.0.1723.0 canary (2013-11-29) Web Platform features disabled\n          return isVisible(next.host.impl);\n        } else if (next.host) {\n          // Chrome 33.0.1723.0 canary (2013-11-29) Web Platform features enabled\n          return isVisible(next.host);\n        }\n        throw new Error('Lost in Web Components world');\n      } else {\n        return false; // this is a node detached from document in IE8\n      }\n    } else if (next.style.display === 'none') {\n      return false;\n    }\n    next = next.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * Returns elements top and left offset relative to the document. Function is not compatible with jQuery offset.\n *\n * @param {HTMLElement} elem\n * @return {Object} Returns object with `top` and `left` props\n */\nfunction offset(elem) {\n  var offsetLeft, offsetTop, lastElem, docElem, box;\n\n  docElem = document.documentElement;\n\n  if ((0, _feature.hasCaptionProblem)() && elem.firstChild && elem.firstChild.nodeName === 'CAPTION') {\n    // fixes problem with Firefox ignoring <caption> in TABLE offset (see also export outerHeight)\n    // http://jsperf.com/offset-vs-getboundingclientrect/8\n    box = elem.getBoundingClientRect();\n\n    return {\n      top: box.top + (window.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\n      left: box.left + (window.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)\n    };\n  }\n  offsetLeft = elem.offsetLeft;\n  offsetTop = elem.offsetTop;\n  lastElem = elem;\n\n  /* eslint-disable no-cond-assign */\n  while (elem = elem.offsetParent) {\n    // from my observation, document.body always has scrollLeft/scrollTop == 0\n    if (elem === document.body) {\n      break;\n    }\n    offsetLeft += elem.offsetLeft;\n    offsetTop += elem.offsetTop;\n    lastElem = elem;\n  }\n\n  // slow - http://jsperf.com/offset-vs-getboundingclientrect/6\n  if (lastElem && lastElem.style.position === 'fixed') {\n    // if(lastElem !== document.body) { //faster but does gives false positive in Firefox\n    offsetLeft += window.pageXOffset || docElem.scrollLeft;\n    offsetTop += window.pageYOffset || docElem.scrollTop;\n  }\n\n  return {\n    left: offsetLeft,\n    top: offsetTop\n  };\n}\n\n/**\n * Returns the document's scrollTop property.\n *\n * @returns {Number}\n */\nfunction getWindowScrollTop() {\n  var res = window.scrollY;\n\n  if (res === void 0) {\n    // IE8-11\n    res = document.documentElement.scrollTop;\n  }\n\n  return res;\n}\n\n/**\n * Returns the document's scrollLeft property.\n *\n * @returns {Number}\n */\nfunction getWindowScrollLeft() {\n  var res = window.scrollX;\n\n  if (res === void 0) {\n    // IE8-11\n    res = document.documentElement.scrollLeft;\n  }\n\n  return res;\n}\n\n/**\n * Returns the provided element's scrollTop property.\n *\n * @param element\n * @returns {Number}\n */\nfunction getScrollTop(element) {\n  if (element === window) {\n    return getWindowScrollTop();\n  }\n  return element.scrollTop;\n}\n\n/**\n * Returns the provided element's scrollLeft property.\n *\n * @param element\n * @returns {Number}\n */\nfunction getScrollLeft(element) {\n  if (element === window) {\n    return getWindowScrollLeft();\n  }\n  return element.scrollLeft;\n}\n\n/**\n * Returns a DOM element responsible for scrolling of the provided element.\n *\n * @param {HTMLElement} element\n * @returns {HTMLElement} Element's scrollable parent\n */\nfunction getScrollableElement(element) {\n  var el = element.parentNode,\n      props = ['auto', 'scroll'],\n      overflow,\n      overflowX,\n      overflowY,\n      computedStyle = '',\n      computedOverflow = '',\n      computedOverflowY = '',\n      computedOverflowX = '';\n\n  while (el && el.style && document.body !== el) {\n    overflow = el.style.overflow;\n    overflowX = el.style.overflowX;\n    overflowY = el.style.overflowY;\n\n    if (overflow == 'scroll' || overflowX == 'scroll' || overflowY == 'scroll') {\n      return el;\n    } else if (window.getComputedStyle) {\n      computedStyle = window.getComputedStyle(el);\n      computedOverflow = computedStyle.getPropertyValue('overflow');\n      computedOverflowY = computedStyle.getPropertyValue('overflow-y');\n      computedOverflowX = computedStyle.getPropertyValue('overflow-x');\n\n      if (computedOverflow === 'scroll' || computedOverflowX === 'scroll' || computedOverflowY === 'scroll') {\n        return el;\n      }\n    }\n\n    // The '+ 1' after the scrollHeight/scrollWidth is to prevent problems with zoomed out Chrome.\n    if (el.clientHeight <= el.scrollHeight + 1 && (props.indexOf(overflowY) !== -1 || props.indexOf(overflow) !== -1 || props.indexOf(computedOverflow) !== -1 || props.indexOf(computedOverflowY) !== -1)) {\n      return el;\n    }\n    if (el.clientWidth <= el.scrollWidth + 1 && (props.indexOf(overflowX) !== -1 || props.indexOf(overflow) !== -1 || props.indexOf(computedOverflow) !== -1 || props.indexOf(computedOverflowX) !== -1)) {\n      return el;\n    }\n    el = el.parentNode;\n  }\n\n  return window;\n}\n\n/**\n * Returns a DOM element responsible for trimming the provided element.\n *\n * @param {HTMLElement} base Base element\n * @returns {HTMLElement} Base element's trimming parent\n */\nfunction getTrimmingContainer(base) {\n  var el = base.parentNode;\n\n  while (el && el.style && document.body !== el) {\n    if (el.style.overflow !== 'visible' && el.style.overflow !== '') {\n      return el;\n    } else if (window.getComputedStyle) {\n      var computedStyle = window.getComputedStyle(el);\n\n      if (computedStyle.getPropertyValue('overflow') !== 'visible' && computedStyle.getPropertyValue('overflow') !== '') {\n        return el;\n      }\n    }\n\n    el = el.parentNode;\n  }\n\n  return window;\n}\n\n/**\n * Returns a style property for the provided element. (Be it an inline or external style).\n *\n * @param {HTMLElement} element\n * @param {String} prop Wanted property\n * @returns {String|undefined} Element's style property\n */\nfunction getStyle(element, prop) {\n  /* eslint-disable */\n  if (!element) {\n    return;\n  } else if (element === window) {\n    if (prop === 'width') {\n      return window.innerWidth + 'px';\n    } else if (prop === 'height') {\n      return window.innerHeight + 'px';\n    }\n\n    return;\n  }\n\n  var styleProp = element.style[prop],\n      computedStyle;\n\n  if (styleProp !== '' && styleProp !== void 0) {\n    return styleProp;\n  } else {\n    computedStyle = getComputedStyle(element);\n\n    if (computedStyle[prop] !== '' && computedStyle[prop] !== void 0) {\n      return computedStyle[prop];\n    }\n  }\n}\n\n/**\n * Returns a computed style object for the provided element. (Needed if style is declared in external stylesheet).\n *\n * @param element\n * @returns {IEElementStyle|CssStyle} Elements computed style object\n */\nfunction getComputedStyle(element) {\n  return element.currentStyle || document.defaultView.getComputedStyle(element);\n}\n\n/**\n * Returns the element's outer width.\n *\n * @param element\n * @returns {number} Element's outer width\n */\nfunction outerWidth(element) {\n  return element.offsetWidth;\n}\n\n/**\n * Returns the element's outer height\n *\n * @param elem\n * @returns {number} Element's outer height\n */\nfunction outerHeight(elem) {\n  if ((0, _feature.hasCaptionProblem)() && elem.firstChild && elem.firstChild.nodeName === 'CAPTION') {\n    // fixes problem with Firefox ignoring <caption> in TABLE.offsetHeight\n    // jQuery (1.10.1) still has this unsolved\n    // may be better to just switch to getBoundingClientRect\n    // http://bililite.com/blog/2009/03/27/finding-the-size-of-a-table/\n    // http://lists.w3.org/Archives/Public/www-style/2009Oct/0089.html\n    // http://bugs.jquery.com/ticket/2196\n    // http://lists.w3.org/Archives/Public/www-style/2009Oct/0140.html#start140\n    return elem.offsetHeight + elem.firstChild.offsetHeight;\n  }\n\n  return elem.offsetHeight;\n}\n\n/**\n * Returns the element's inner height.\n *\n * @param element\n * @returns {number} Element's inner height\n */\nfunction innerHeight(element) {\n  return element.clientHeight || element.innerHeight;\n}\n\n/**\n * Returns the element's inner width.\n *\n * @param element\n * @returns {number} Element's inner width\n */\nfunction innerWidth(element) {\n  return element.clientWidth || element.innerWidth;\n}\n\nfunction addEvent(element, event, callback) {\n  if (window.addEventListener) {\n    element.addEventListener(event, callback, false);\n  } else {\n    element.attachEvent('on' + event, callback);\n  }\n}\n\nfunction removeEvent(element, event, callback) {\n  if (window.removeEventListener) {\n    element.removeEventListener(event, callback, false);\n  } else {\n    element.detachEvent('on' + event, callback);\n  }\n}\n\n/**\n * Returns caret position in text input\n *\n * @author http://stackoverflow.com/questions/263743/how-to-get-caret-position-in-textarea\n * @return {Number}\n */\nfunction getCaretPosition(el) {\n  if (el.selectionStart) {\n    return el.selectionStart;\n  } else if (document.selection) {\n    // IE8\n    el.focus();\n\n    var r = document.selection.createRange();\n\n    if (r == null) {\n      return 0;\n    }\n    var re = el.createTextRange();\n    var rc = re.duplicate();\n\n    re.moveToBookmark(r.getBookmark());\n    rc.setEndPoint('EndToStart', re);\n\n    return rc.text.length;\n  }\n\n  return 0;\n}\n\n/**\n * Returns end of the selection in text input\n *\n * @return {Number}\n */\nfunction getSelectionEndPosition(el) {\n  if (el.selectionEnd) {\n    return el.selectionEnd;\n  } else if (document.selection) {\n    // IE8\n    var r = document.selection.createRange();\n\n    if (r == null) {\n      return 0;\n    }\n    var re = el.createTextRange();\n\n    return re.text.indexOf(r.text) + r.text.length;\n  }\n\n  return 0;\n}\n\n/**\n * Returns text under selection.\n *\n * @returns {String}\n */\nfunction getSelectionText() {\n  var text = '';\n\n  if (window.getSelection) {\n    text = window.getSelection().toString();\n  } else if (document.selection && document.selection.type !== 'Control') {\n    text = document.selection.createRange().text;\n  }\n\n  return text;\n}\n\n/**\n * Sets caret position in text input.\n *\n * @author http://blog.vishalon.net/index.php/javascript-getting-and-setting-caret-position-in-textarea/\n * @param {Element} element\n * @param {Number} pos\n * @param {Number} endPos\n */\nfunction setCaretPosition(element, pos, endPos) {\n  if (endPos === void 0) {\n    endPos = pos;\n  }\n  if (element.setSelectionRange) {\n    element.focus();\n\n    try {\n      element.setSelectionRange(pos, endPos);\n    } catch (err) {\n      var elementParent = element.parentNode;\n      var parentDisplayValue = elementParent.style.display;\n      elementParent.style.display = 'block';\n      element.setSelectionRange(pos, endPos);\n      elementParent.style.display = parentDisplayValue;\n    }\n  } else if (element.createTextRange) {\n    // IE8\n    var range = element.createTextRange();\n    range.collapse(true);\n    range.moveEnd('character', endPos);\n    range.moveStart('character', pos);\n    range.select();\n  }\n}\n\nvar cachedScrollbarWidth;\n\n// http://stackoverflow.com/questions/986937/how-can-i-get-the-browsers-scrollbar-sizes\nfunction walkontableCalculateScrollbarWidth() {\n  var inner = document.createElement('div');\n  inner.style.height = '200px';\n  inner.style.width = '100%';\n\n  var outer = document.createElement('div');\n  outer.style.boxSizing = 'content-box';\n  outer.style.height = '150px';\n  outer.style.left = '0px';\n  outer.style.overflow = 'hidden';\n  outer.style.position = 'absolute';\n  outer.style.top = '0px';\n  outer.style.width = '200px';\n  outer.style.visibility = 'hidden';\n  outer.appendChild(inner);\n\n  (document.body || document.documentElement).appendChild(outer);\n  var w1 = inner.offsetWidth;\n  outer.style.overflow = 'scroll';\n  var w2 = inner.offsetWidth;\n  if (w1 == w2) {\n    w2 = outer.clientWidth;\n  }\n\n  (document.body || document.documentElement).removeChild(outer);\n\n  return w1 - w2;\n}\n\n/**\n * Returns the computed width of the native browser scroll bar.\n *\n * @return {Number} width\n */\nfunction getScrollbarWidth() {\n  if (cachedScrollbarWidth === void 0) {\n    cachedScrollbarWidth = walkontableCalculateScrollbarWidth();\n  }\n\n  return cachedScrollbarWidth;\n}\n\n/**\n * Checks if the provided element has a vertical scrollbar.\n *\n * @param {HTMLElement} element\n * @returns {Boolean}\n */\nfunction hasVerticalScrollbar(element) {\n  return element.offsetWidth !== element.clientWidth;\n}\n\n/**\n * Checks if the provided element has a vertical scrollbar.\n *\n * @param {HTMLElement} element\n * @returns {Boolean}\n */\nfunction hasHorizontalScrollbar(element) {\n  return element.offsetHeight !== element.clientHeight;\n}\n\n/**\n * Sets overlay position depending on it's type and used browser\n */\nfunction setOverlayPosition(overlayElem, left, top) {\n  if ((0, _browser.isIE8)() || (0, _browser.isIE9)()) {\n    overlayElem.style.top = top;\n    overlayElem.style.left = left;\n  } else if ((0, _browser.isSafari)()) {\n    overlayElem.style['-webkit-transform'] = 'translate3d(' + left + ',' + top + ',0)';\n  } else {\n    overlayElem.style.transform = 'translate3d(' + left + ',' + top + ',0)';\n  }\n}\n\nfunction getCssTransform(element) {\n  var transform;\n\n  if (element.style.transform && (transform = element.style.transform) !== '') {\n    return ['transform', transform];\n  } else if (element.style['-webkit-transform'] && (transform = element.style['-webkit-transform']) !== '') {\n\n    return ['-webkit-transform', transform];\n  }\n\n  return -1;\n}\n\nfunction resetCssTransform(element) {\n  if (element.style.transform && element.style.transform !== '') {\n    element.style.transform = '';\n  } else if (element.style['-webkit-transform'] && element.style['-webkit-transform'] !== '') {\n    element.style['-webkit-transform'] = '';\n  }\n}\n\n/**\n * Determines if the given DOM element is an input field.\n * Notice: By 'input' we mean input, textarea and select nodes\n *\n * @param {HTMLElement} element - DOM element\n * @returns {Boolean}\n */\nfunction isInput(element) {\n  var inputs = ['INPUT', 'SELECT', 'TEXTAREA'];\n\n  return element && (inputs.indexOf(element.nodeName) > -1 || element.contentEditable === 'true');\n}\n\n/**\n * Determines if the given DOM element is an input field placed OUTSIDE of HOT.\n * Notice: By 'input' we mean input, textarea and select nodes\n *\n * @param {HTMLElement} element - DOM element\n * @returns {Boolean}\n */\nfunction isOutsideInput(element) {\n  return isInput(element) && element.className.indexOf('handsontableInput') == -1 && element.className.indexOf('copyPaste') == -1;\n}\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.to2dArray = to2dArray;\nexports.extendArray = extendArray;\nexports.pivot = pivot;\nexports.arrayReduce = arrayReduce;\nexports.arrayFilter = arrayFilter;\nexports.arrayMap = arrayMap;\nexports.arrayEach = arrayEach;\nexports.arraySum = arraySum;\nexports.arrayMax = arrayMax;\nexports.arrayMin = arrayMin;\nexports.arrayAvg = arrayAvg;\nexports.arrayFlatten = arrayFlatten;\nexports.arrayUnique = arrayUnique;\nfunction to2dArray(arr) {\n  var i = 0,\n      ilen = arr.length;\n\n  while (i < ilen) {\n    arr[i] = [arr[i]];\n    i++;\n  }\n}\n\nfunction extendArray(arr, extension) {\n  var i = 0,\n      ilen = extension.length;\n\n  while (i < ilen) {\n    arr.push(extension[i]);\n    i++;\n  }\n}\n\nfunction pivot(arr) {\n  var pivotedArr = [];\n\n  if (!arr || arr.length === 0 || !arr[0] || arr[0].length === 0) {\n    return pivotedArr;\n  }\n\n  var rowCount = arr.length;\n  var colCount = arr[0].length;\n\n  for (var i = 0; i < rowCount; i++) {\n    for (var j = 0; j < colCount; j++) {\n      if (!pivotedArr[j]) {\n        pivotedArr[j] = [];\n      }\n\n      pivotedArr[j][i] = arr[i][j];\n    }\n  }\n\n  return pivotedArr;\n}\n\n/**\n * A specialized version of `.reduce` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * {@link https://github.com/lodash/lodash/blob/master/lodash.js}\n *\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {Boolean} [initFromArray] Specify using the first element of `array` as the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initFromArray) {\n  var index = -1;\n  var iterable = array;\n\n  if (!Array.isArray(array)) {\n    iterable = Array.from(array);\n  }\n  var length = iterable.length;\n\n  if (initFromArray && length) {\n    accumulator = iterable[++index];\n  }\n  while (++index < length) {\n    accumulator = iteratee(accumulator, iterable[index], index, iterable);\n  }\n\n  return accumulator;\n}\n\n/**\n * A specialized version of `.filter` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * {@link https://github.com/lodash/lodash/blob/master/lodash.js}\n *\n * @param {Array} array The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1;\n  var iterable = array;\n\n  if (!Array.isArray(array)) {\n    iterable = Array.from(array);\n  }\n\n  var length = iterable.length;\n  var result = [];\n  var resIndex = -1;\n\n  while (++index < length) {\n    var value = iterable[index];\n\n    if (predicate(value, index, iterable)) {\n      result[++resIndex] = value;\n    }\n  }\n\n  return result;\n}\n\n/**\n * A specialized version of `.map` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1;\n  var iterable = array;\n\n  if (!Array.isArray(array)) {\n    iterable = Array.from(array);\n  }\n\n  var length = iterable.length;\n  var result = [];\n  var resIndex = -1;\n\n  while (++index < length) {\n    var value = iterable[index];\n\n    result[++resIndex] = iteratee(value, index, iterable);\n  }\n\n  return result;\n}\n\n/**\n * A specialized version of `.forEach` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * {@link https://github.com/lodash/lodash/blob/master/lodash.js}\n *\n * @param {Array|*} array The array to iterate over or an any element with implemented iterator protocol.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1;\n  var iterable = array;\n\n  if (!Array.isArray(array)) {\n    iterable = Array.from(array);\n  }\n\n  var length = iterable.length;\n\n  while (++index < length) {\n    if (iteratee(iterable[index], index, iterable) === false) {\n      break;\n    }\n  }\n\n  return array;\n}\n\n/**\n * Calculate sum value for each item of the array.\n *\n * @param {Array} array The array to process.\n * @returns {Number} Returns calculated sum value.\n */\nfunction arraySum(array) {\n  return arrayReduce(array, function (a, b) {\n    return a + b;\n  }, 0);\n}\n\n/**\n * Returns the highest value from an array. Can be array of numbers or array of strings.\n * NOTICE: Mixed values is not supported.\n *\n * @param {Array} array The array to process.\n * @returns {Number} Returns the highest value from an array.\n */\nfunction arrayMax(array) {\n  return arrayReduce(array, function (a, b) {\n    return a > b ? a : b;\n  }, Array.isArray(array) ? array[0] : void 0);\n}\n\n/**\n * Returns the lowest value from an array. Can be array of numbers or array of strings.\n * NOTICE: Mixed values is not supported.\n *\n * @param {Array} array The array to process.\n * @returns {Number} Returns the lowest value from an array.\n */\nfunction arrayMin(array) {\n  return arrayReduce(array, function (a, b) {\n    return a < b ? a : b;\n  }, Array.isArray(array) ? array[0] : void 0);\n}\n\n/**\n * Calculate average value for each item of the array.\n *\n * @param {Array} array The array to process.\n * @returns {Number} Returns calculated average value.\n */\nfunction arrayAvg(array) {\n  if (!array.length) {\n    return 0;\n  }\n\n  return arraySum(array) / array.length;\n}\n\n/**\n * Flatten multidimensional array.\n *\n * @param {Array} array Array of Arrays\n * @returns {Array}\n */\nfunction arrayFlatten(array) {\n  return arrayReduce(array, function (initial, value) {\n    return initial.concat(Array.isArray(value) ? arrayFlatten(value) : value);\n  }, []);\n}\n\n/**\n * Unique values in the array.\n *\n * @param {Array} array The array to process.\n * @returns {Array}\n */\nfunction arrayUnique(array) {\n  var unique = [];\n\n  arrayEach(array, function (value) {\n    if (unique.indexOf(value) === -1) {\n      unique.push(value);\n    }\n  });\n\n  return unique;\n}\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.duckSchema = duckSchema;\nexports.inherit = inherit;\nexports.extend = extend;\nexports.deepExtend = deepExtend;\nexports.deepClone = deepClone;\nexports.clone = clone;\nexports.mixin = mixin;\nexports.isObjectEqual = isObjectEqual;\nexports.isObject = isObject;\nexports.defineGetter = defineGetter;\nexports.objectEach = objectEach;\nexports.getProperty = getProperty;\nexports.deepObjectSize = deepObjectSize;\nexports.createObjectPropListener = createObjectPropListener;\nexports.hasOwnProperty = hasOwnProperty;\n\nvar _array = __webpack_require__(1);\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/**\n * Generate schema for passed object.\n *\n * @param {Array|Object} object\n * @returns {Array|Object}\n */\nfunction duckSchema(object) {\n  var schema;\n\n  if (Array.isArray(object)) {\n    schema = [];\n  } else {\n    schema = {};\n\n    objectEach(object, function (value, key) {\n      if (key === '__children') {\n        return;\n      }\n\n      if (value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && !Array.isArray(value)) {\n        schema[key] = duckSchema(value);\n      } else if (Array.isArray(value)) {\n        if (value.length && _typeof(value[0]) === 'object' && !Array.isArray(value[0])) {\n          schema[key] = [duckSchema(value[0])];\n        } else {\n          schema[key] = [];\n        }\n      } else {\n        schema[key] = null;\n      }\n    });\n  }\n\n  return schema;\n}\n\n/**\n * Inherit without without calling parent constructor, and setting `Child.prototype.constructor` to `Child` instead of `Parent`.\n * Creates temporary dummy function to call it as constructor.\n * Described in ticket: https://github.com/handsontable/handsontable/pull/516\n *\n * @param  {Object} Child  child class\n * @param  {Object} Parent parent class\n * @return {Object}        extended Child\n */\nfunction inherit(Child, Parent) {\n  Parent.prototype.constructor = Parent;\n  Child.prototype = new Parent();\n  Child.prototype.constructor = Child;\n\n  return Child;\n}\n\n/**\n * Perform shallow extend of a target object with extension's own properties.\n *\n * @param {Object} target An object that will receive the new properties.\n * @param {Object} extension An object containing additional properties to merge into the target.\n */\nfunction extend(target, extension) {\n  objectEach(extension, function (value, key) {\n    target[key] = value;\n  });\n\n  return target;\n}\n\n/**\n * Perform deep extend of a target object with extension's own properties.\n *\n * @param {Object} target An object that will receive the new properties.\n * @param {Object} extension An object containing additional properties to merge into the target.\n */\nfunction deepExtend(target, extension) {\n  objectEach(extension, function (value, key) {\n    if (extension[key] && _typeof(extension[key]) === 'object') {\n      if (!target[key]) {\n        if (Array.isArray(extension[key])) {\n          target[key] = [];\n        } else if (Object.prototype.toString.call(extension[key]) === '[object Date]') {\n          target[key] = extension[key];\n        } else {\n          target[key] = {};\n        }\n      }\n      deepExtend(target[key], extension[key]);\n    } else {\n      target[key] = extension[key];\n    }\n  });\n}\n\n/**\n * Perform deep clone of an object.\n * WARNING! Only clones JSON properties. Will cause error when `obj` contains a function, Date, etc.\n *\n * @param {Object} obj An object that will be cloned\n * @return {Object}\n */\nfunction deepClone(obj) {\n  if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object') {\n    return JSON.parse(JSON.stringify(obj));\n  }\n\n  return obj;\n}\n\n/**\n * Shallow clone object.\n *\n * @param {Object} object\n * @returns {Object}\n */\nfunction clone(object) {\n  var result = {};\n\n  objectEach(object, function (value, key) {\n    result[key] = value;\n  });\n\n  return result;\n}\n\n/**\n * Extend the Base object (usually prototype) of the functionality the `mixins` objects.\n *\n * @param {Object} Base Base object which will be extended.\n * @param {Object} mixins The object of the functionality will be \"copied\".\n * @returns {Object}\n */\nfunction mixin(Base) {\n  if (!Base.MIXINS) {\n    Base.MIXINS = [];\n  }\n\n  for (var _len = arguments.length, mixins = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    mixins[_key - 1] = arguments[_key];\n  }\n\n  (0, _array.arrayEach)(mixins, function (mixin) {\n    Base.MIXINS.push(mixin.MIXIN_NAME);\n\n    objectEach(mixin, function (value, key) {\n      if (Base.prototype[key] !== void 0) {\n        throw new Error('Mixin conflict. Property \\'' + key + '\\' already exist and cannot be overwritten.');\n      }\n      if (typeof value === 'function') {\n        Base.prototype[key] = value;\n      } else {\n        var getter = function _getter(propertyName, initialValue) {\n          propertyName = '_' + propertyName;\n\n          var initValue = function initValue(value) {\n            if (Array.isArray(value) || isObject(value)) {\n              value = deepClone(value);\n            }\n\n            return value;\n          };\n\n          return function () {\n            if (this[propertyName] === void 0) {\n              this[propertyName] = initValue(initialValue);\n            }\n\n            return this[propertyName];\n          };\n        };\n        var setter = function _setter(propertyName) {\n          propertyName = '_' + propertyName;\n\n          return function (value) {\n            this[propertyName] = value;\n          };\n        };\n        Object.defineProperty(Base.prototype, key, {\n          get: getter(key, value),\n          set: setter(key),\n          configurable: true\n        });\n      }\n    });\n  });\n\n  return Base;\n}\n\n/**\n * Checks if two objects or arrays are (deep) equal\n *\n * @param {Object|Array} object1\n * @param {Object|Array} object2\n * @returns {Boolean}\n */\nfunction isObjectEqual(object1, object2) {\n  return JSON.stringify(object1) === JSON.stringify(object2);\n}\n\n/**\n * Determines whether given object is a plain Object.\n * Note: String and Array are not plain Objects\n * @param {*} obj\n * @returns {boolean}\n */\nfunction isObject(obj) {\n  return Object.prototype.toString.call(obj) == '[object Object]';\n}\n\nfunction defineGetter(object, property, value, options) {\n  options.value = value;\n  options.writable = options.writable !== false;\n  options.enumerable = options.enumerable !== false;\n  options.configurable = options.configurable !== false;\n\n  Object.defineProperty(object, property, options);\n}\n\n/**\n * A specialized version of `.forEach` for objects.\n *\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction objectEach(object, iteratee) {\n  for (var key in object) {\n    if (!object.hasOwnProperty || object.hasOwnProperty && Object.prototype.hasOwnProperty.call(object, key)) {\n      if (iteratee(object[key], key, object) === false) {\n        break;\n      }\n    }\n  }\n\n  return object;\n}\n\n/**\n * Get object property by its name. Access to sub properties can be achieved by dot notation (e.q. `'foo.bar.baz'`).\n *\n * @param {Object} object Object which value will be exported.\n * @param {String} name Object property name.\n * @returns {*}\n */\nfunction getProperty(object, name) {\n  var names = name.split('.');\n  var result = object;\n\n  objectEach(names, function (name) {\n    result = result[name];\n\n    if (result === void 0) {\n      result = void 0;\n\n      return false;\n    }\n  });\n\n  return result;\n}\n\n/**\n * Return object length (recursively).\n *\n * @param {*} object Object for which we want get length.\n * @returns {Number}\n */\nfunction deepObjectSize(object) {\n  if (!isObject(object)) {\n    return 0;\n  }\n  var recursObjLen = function recursObjLen(obj) {\n    var result = 0;\n\n    if (isObject(obj)) {\n      objectEach(obj, function (key) {\n        result += recursObjLen(key);\n      });\n    } else {\n      result++;\n    }\n\n    return result;\n  };\n\n  return recursObjLen(object);\n}\n\n/**\n * Create object with property where its value change will be observed.\n *\n * @param {*} [defaultValue=undefined] Default value.\n * @param {String} [propertyToListen='value'] Property to listen.\n * @returns {Object}\n */\nfunction createObjectPropListener(defaultValue) {\n  var _holder;\n\n  var propertyToListen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'value';\n\n  var privateProperty = '_' + propertyToListen;\n  var holder = (_holder = {\n    _touched: false\n  }, _defineProperty(_holder, privateProperty, defaultValue), _defineProperty(_holder, 'isTouched', function isTouched() {\n    return this._touched;\n  }), _holder);\n\n  Object.defineProperty(holder, propertyToListen, {\n    get: function get() {\n      return this[privateProperty];\n    },\n    set: function set(value) {\n      this._touched = true;\n      this[privateProperty] = value;\n    },\n\n    enumerable: true,\n    configurable: true\n  });\n\n  return holder;\n}\n\n/**\n * Check if at specified `key` there is any value for `object`.\n *\n * @param {Object} object Object to search value at specyfic key.\n * @param {String} key String key to check.\n */\nfunction hasOwnProperty(object, key) {\n  return Object.prototype.hasOwnProperty.call(object, key);\n}\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar core = __webpack_require__(44);\nvar hide = __webpack_require__(31);\nvar redefine = __webpack_require__(30);\nvar ctx = __webpack_require__(32);\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n  var IS_FORCED = type & $export.F;\n  var IS_GLOBAL = type & $export.G;\n  var IS_STATIC = type & $export.S;\n  var IS_PROTO = type & $export.P;\n  var IS_BIND = type & $export.B;\n  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n  var key, own, out, exp;\n  if (IS_GLOBAL) source = name;\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    // export native or passed\n    out = (own ? target : source)[key];\n    // bind timers to global for call from export context\n    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // extend global\n    if (target) redefine(target, key, out, type & $export.U);\n    // export\n    if (exports[key] != out) hide(exports, key, exp);\n    if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n  }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1;   // forced\n$export.G = 2;   // global\n$export.S = 4;   // static\n$export.P = 8;   // proto\n$export.B = 16;  // bind\n$export.W = 32;  // wrap\n$export.U = 64;  // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.Viewport = exports.TableRenderer = exports.Table = exports.Settings = exports.Selection = exports.Scroll = exports.Overlays = exports.Event = exports.Core = exports.default = exports.Border = exports.TopLeftCornerOverlay = exports.TopOverlay = exports.LeftOverlay = exports.DebugOverlay = exports.RowFilter = exports.ColumnFilter = exports.CellRange = exports.CellCoords = exports.ViewportRowsCalculator = exports.ViewportColumnsCalculator = undefined;\n\n__webpack_require__(96);\n\n__webpack_require__(111);\n\n__webpack_require__(112);\n\n__webpack_require__(116);\n\n__webpack_require__(117);\n\n__webpack_require__(119);\n\n__webpack_require__(122);\n\n__webpack_require__(123);\n\n__webpack_require__(124);\n\n__webpack_require__(125);\n\n__webpack_require__(126);\n\n__webpack_require__(127);\n\n__webpack_require__(128);\n\n__webpack_require__(129);\n\n__webpack_require__(130);\n\n__webpack_require__(131);\n\n__webpack_require__(132);\n\n__webpack_require__(133);\n\n__webpack_require__(134);\n\n__webpack_require__(135);\n\n__webpack_require__(136);\n\n__webpack_require__(137);\n\n__webpack_require__(138);\n\n__webpack_require__(139);\n\n__webpack_require__(141);\n\n__webpack_require__(143);\n\n__webpack_require__(144);\n\n__webpack_require__(145);\n\n__webpack_require__(146);\n\n__webpack_require__(147);\n\n__webpack_require__(148);\n\n__webpack_require__(149);\n\n__webpack_require__(150);\n\n__webpack_require__(151);\n\n__webpack_require__(152);\n\n__webpack_require__(153);\n\n__webpack_require__(154);\n\n__webpack_require__(155);\n\n__webpack_require__(85);\n\n__webpack_require__(156);\n\n__webpack_require__(157);\n\n__webpack_require__(159);\n\n__webpack_require__(160);\n\n__webpack_require__(161);\n\n__webpack_require__(162);\n\n__webpack_require__(163);\n\n__webpack_require__(164);\n\n__webpack_require__(165);\n\n__webpack_require__(167);\n\n__webpack_require__(168);\n\n__webpack_require__(169);\n\n__webpack_require__(172);\n\n__webpack_require__(173);\n\n__webpack_require__(174);\n\nvar _viewportColumns = __webpack_require__(175);\n\nvar _viewportColumns2 = _interopRequireDefault(_viewportColumns);\n\nvar _viewportRows = __webpack_require__(176);\n\nvar _viewportRows2 = _interopRequireDefault(_viewportRows);\n\nvar _coords = __webpack_require__(54);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nvar _range = __webpack_require__(86);\n\nvar _range2 = _interopRequireDefault(_range);\n\nvar _column = __webpack_require__(177);\n\nvar _column2 = _interopRequireDefault(_column);\n\nvar _row = __webpack_require__(178);\n\nvar _row2 = _interopRequireDefault(_row);\n\nvar _debug = __webpack_require__(228);\n\nvar _debug2 = _interopRequireDefault(_debug);\n\nvar _left = __webpack_require__(229);\n\nvar _left2 = _interopRequireDefault(_left);\n\nvar _top = __webpack_require__(230);\n\nvar _top2 = _interopRequireDefault(_top);\n\nvar _topLeftCorner = __webpack_require__(231);\n\nvar _topLeftCorner2 = _interopRequireDefault(_topLeftCorner);\n\nvar _border = __webpack_require__(187);\n\nvar _border2 = _interopRequireDefault(_border);\n\nvar _core = __webpack_require__(179);\n\nvar _core2 = _interopRequireDefault(_core);\n\nvar _event = __webpack_require__(180);\n\nvar _event2 = _interopRequireDefault(_event);\n\nvar _overlays = __webpack_require__(181);\n\nvar _overlays2 = _interopRequireDefault(_overlays);\n\nvar _scroll = __webpack_require__(182);\n\nvar _scroll2 = _interopRequireDefault(_scroll);\n\nvar _selection = __webpack_require__(232);\n\nvar _selection2 = _interopRequireDefault(_selection);\n\nvar _settings = __webpack_require__(183);\n\nvar _settings2 = _interopRequireDefault(_settings);\n\nvar _table = __webpack_require__(184);\n\nvar _table2 = _interopRequireDefault(_table);\n\nvar _tableRenderer = __webpack_require__(185);\n\nvar _tableRenderer2 = _interopRequireDefault(_tableRenderer);\n\nvar _viewport = __webpack_require__(186);\n\nvar _viewport2 = _interopRequireDefault(_viewport);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.ViewportColumnsCalculator = _viewportColumns2.default;\nexports.ViewportRowsCalculator = _viewportRows2.default;\nexports.CellCoords = _coords2.default;\nexports.CellRange = _range2.default;\nexports.ColumnFilter = _column2.default;\nexports.RowFilter = _row2.default;\nexports.DebugOverlay = _debug2.default;\nexports.LeftOverlay = _left2.default;\nexports.TopOverlay = _top2.default;\nexports.TopLeftCornerOverlay = _topLeftCorner2.default;\nexports.Border = _border2.default;\nexports.default = _core2.default;\nexports.Core = _core2.default;\nexports.Event = _event2.default;\nexports.Overlays = _overlays2.default;\nexports.Scroll = _scroll2.default;\nexports.Selection = _selection2.default;\nexports.Settings = _settings2.default;\nexports.Table = _table2.default;\nexports.TableRenderer = _tableRenderer2.default;\nexports.Viewport = _viewport2.default;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.isNumeric = isNumeric;\nexports.rangeEach = rangeEach;\nexports.rangeEachReverse = rangeEachReverse;\nexports.valueAccordingPercent = valueAccordingPercent;\n/**\n * Checks if value of n is a numeric one\n * http://jsperf.com/isnan-vs-isnumeric/4\n * @param n\n * @returns {boolean}\n */\nfunction isNumeric(n) {\n  /* eslint-disable */\n  var t = typeof n === 'undefined' ? 'undefined' : _typeof(n);\n\n  return t == 'number' ? !isNaN(n) && isFinite(n) : t == 'string' ? !n.length ? false : n.length == 1 ? /\\d/.test(n) : /^\\s*[+-]?\\s*(?:(?:\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)|(?:0x[a-f\\d]+))\\s*$/i.test(n) : t == 'object' ? !!n && typeof n.valueOf() == 'number' && !(n instanceof Date) : false;\n}\n\n/**\n * A specialized version of `.forEach` defined by ranges.\n *\n * @param {Number} rangeFrom The number from start iterate.\n * @param {Number|Function} rangeTo The number where finish iterate or function as a iteratee.\n * @param {Function} [iteratee] The function invoked per iteration.\n */\nfunction rangeEach(rangeFrom, rangeTo, iteratee) {\n  var index = -1;\n\n  if (typeof rangeTo === 'function') {\n    iteratee = rangeTo;\n    rangeTo = rangeFrom;\n  } else {\n    index = rangeFrom - 1;\n  }\n  while (++index <= rangeTo) {\n    if (iteratee(index) === false) {\n      break;\n    }\n  }\n}\n\n/**\n * A specialized version of `.forEach` defined by ranges iterable in reverse order.\n *\n * @param {Number} rangeFrom The number from start iterate.\n * @param {Number|Function} rangeTo The number where finish iterate or function as a iteratee.\n * @param {Function} [iteratee] The function invoked per iteration.\n */\nfunction rangeEachReverse(rangeFrom, rangeTo, iteratee) {\n  var index = rangeFrom + 1;\n\n  if (typeof rangeTo === 'function') {\n    iteratee = rangeTo;\n    rangeTo = 0;\n  }\n  while (--index >= rangeTo) {\n    if (iteratee(index) === false) {\n      break;\n    }\n  }\n}\n\n/**\n * Calculate value from percent.\n *\n * @param {Number} value Base value from percent will be calculated.\n * @param {String|Number} percent Can be Number or String (eq. `'33%'`).\n * @returns {Number}\n */\nfunction valueAccordingPercent(value, percent) {\n  percent = parseInt(percent.toString().replace('%', ''), 10);\n  percent = parseInt(value * percent / 100, 10);\n\n  return percent;\n}\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.getListenersCounter = getListenersCounter;\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _feature = __webpack_require__(40);\n\nvar _event = __webpack_require__(12);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Counter which tracks unregistered listeners (useful for detecting memory leaks).\n *\n * @type {Number}\n */\nvar listenersCounter = 0;\n\n/**\n * Event DOM manager for internal use in Handsontable.\n *\n * @class EventManager\n * @util\n */\n\nvar EventManager = function () {\n  /**\n   * @param {Object} [context=null]\n   * @private\n   */\n  function EventManager() {\n    var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n    _classCallCheck(this, EventManager);\n\n    this.context = context || this;\n\n    if (!this.context.eventListeners) {\n      this.context.eventListeners = [];\n    }\n  }\n\n  /**\n   * Register specified listener (`eventName`) to the element.\n   *\n   * @param {Element} element Target element.\n   * @param {String} eventName Event name.\n   * @param {Function} callback Function which will be called after event occur.\n   * @returns {Function} Returns function which you can easily call to remove that event\n   */\n\n\n  _createClass(EventManager, [{\n    key: 'addEventListener',\n    value: function addEventListener(element, eventName, callback) {\n      var _this = this;\n\n      var context = this.context;\n\n      function callbackProxy(event) {\n        event = extendEvent(context, event);\n\n        callback.call(this, event);\n      }\n      this.context.eventListeners.push({\n        element: element,\n        event: eventName,\n        callback: callback,\n        callbackProxy: callbackProxy\n      });\n\n      if (window.addEventListener) {\n        element.addEventListener(eventName, callbackProxy, false);\n      } else {\n        element.attachEvent('on' + eventName, callbackProxy);\n      }\n      listenersCounter++;\n\n      return function () {\n        _this.removeEventListener(element, eventName, callback);\n      };\n    }\n\n    /**\n     * Remove the event listener previously registered.\n     *\n     * @param {Element} element Target element.\n     * @param {String} eventName Event name.\n     * @param {Function} callback Function to remove from the event target. It must be the same as during registration listener.\n     */\n\n  }, {\n    key: 'removeEventListener',\n    value: function removeEventListener(element, eventName, callback) {\n      var len = this.context.eventListeners.length;\n      var tmpEvent = void 0;\n\n      while (len--) {\n        tmpEvent = this.context.eventListeners[len];\n\n        if (tmpEvent.event == eventName && tmpEvent.element == element) {\n          if (callback && callback != tmpEvent.callback) {\n            /* eslint-disable no-continue */\n            continue;\n          }\n          this.context.eventListeners.splice(len, 1);\n\n          if (tmpEvent.element.removeEventListener) {\n            tmpEvent.element.removeEventListener(tmpEvent.event, tmpEvent.callbackProxy, false);\n          } else {\n            tmpEvent.element.detachEvent('on' + tmpEvent.event, tmpEvent.callbackProxy);\n          }\n          listenersCounter--;\n        }\n      }\n    }\n\n    /**\n     * Clear all previously registered events.\n     *\n     * @private\n     * @since 0.15.0-beta3\n     */\n\n  }, {\n    key: 'clearEvents',\n    value: function clearEvents() {\n      if (!this.context) {\n        return;\n      }\n      var len = this.context.eventListeners.length;\n\n      while (len--) {\n        var event = this.context.eventListeners[len];\n\n        if (event) {\n          this.removeEventListener(event.element, event.event, event.callback);\n        }\n      }\n    }\n\n    /**\n     * Clear all previously registered events.\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.clearEvents();\n    }\n\n    /**\n     * Destroy instance of EventManager.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.clearEvents();\n      this.context = null;\n    }\n\n    /**\n     * Trigger event at the specified target element.\n     *\n     * @param {Element} element Target element.\n     * @param {String} eventName Event name.\n     */\n\n  }, {\n    key: 'fireEvent',\n    value: function fireEvent(element, eventName) {\n      var options = {\n        bubbles: true,\n        cancelable: eventName !== 'mousemove',\n        view: window,\n        detail: 0,\n        screenX: 0,\n        screenY: 0,\n        clientX: 1,\n        clientY: 1,\n        ctrlKey: false,\n        altKey: false,\n        shiftKey: false,\n        metaKey: false,\n        button: 0,\n        relatedTarget: undefined\n      };\n      var event;\n\n      if (document.createEvent) {\n        event = document.createEvent('MouseEvents');\n        event.initMouseEvent(eventName, options.bubbles, options.cancelable, options.view, options.detail, options.screenX, options.screenY, options.clientX, options.clientY, options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, options.relatedTarget || document.body.parentNode);\n      } else {\n        event = document.createEventObject();\n      }\n\n      if (element.dispatchEvent) {\n        element.dispatchEvent(event);\n      } else {\n        element.fireEvent('on' + eventName, event);\n      }\n    }\n  }]);\n\n  return EventManager;\n}();\n\n/**\n * @param {Object} context\n * @param {Event} event\n * @private\n * @returns {*}\n */\n\n\nfunction extendEvent(context, event) {\n  var componentName = 'HOT-TABLE';\n  var isHotTableSpotted = void 0;\n  var fromElement = void 0;\n  var realTarget = void 0;\n  var target = void 0;\n  var len = void 0;\n  var nativeStopImmediatePropagation = void 0;\n\n  event.isTargetWebComponent = false;\n  event.realTarget = event.target;\n\n  nativeStopImmediatePropagation = event.stopImmediatePropagation;\n  event.stopImmediatePropagation = function () {\n    nativeStopImmediatePropagation.apply(this);\n    (0, _event.stopImmediatePropagation)(this);\n  };\n\n  if (!EventManager.isHotTableEnv) {\n    return event;\n  }\n  event = (0, _element.polymerWrap)(event);\n  len = event.path ? event.path.length : 0;\n\n  while (len--) {\n    if (event.path[len].nodeName === componentName) {\n      isHotTableSpotted = true;\n    } else if (isHotTableSpotted && event.path[len].shadowRoot) {\n      target = event.path[len];\n\n      break;\n    }\n    if (len === 0 && !target) {\n      target = event.path[len];\n    }\n  }\n  if (!target) {\n    target = event.target;\n  }\n  event.isTargetWebComponent = true;\n\n  if ((0, _feature.isWebComponentSupportedNatively)()) {\n    event.realTarget = event.srcElement || event.toElement;\n  } else if ((0, _object.hasOwnProperty)(context, 'hot') || context.isHotTableEnv || context.wtTable) {\n    // Polymer doesn't support `event.target` property properly we must emulate it ourselves\n    if ((0, _object.hasOwnProperty)(context, 'hot')) {\n      // Custom element\n      fromElement = context.hot ? context.hot.view.wt.wtTable.TABLE : null;\n    } else if (context.isHotTableEnv) {\n      // Handsontable.Core\n      fromElement = context.view.activeWt.wtTable.TABLE.parentNode.parentNode;\n    } else if (context.wtTable) {\n      // Walkontable\n      fromElement = context.wtTable.TABLE.parentNode.parentNode;\n    }\n    realTarget = (0, _element.closest)(event.target, [componentName], fromElement);\n\n    if (realTarget) {\n      event.realTarget = fromElement.querySelector(componentName) || event.target;\n    } else {\n      event.realTarget = event.target;\n    }\n  }\n\n  Object.defineProperty(event, 'target', {\n    get: function get() {\n      return (0, _element.polymerWrap)(target);\n    },\n\n    enumerable: true,\n    configurable: true\n  });\n\n  return event;\n}\n\nexports.default = EventManager;\nfunction getListenersCounter() {\n  return listenersCounter;\n};\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n/**\n * Constants for parts of translation.\n */\n\nvar CONTEXT_MENU_ITEMS_NAMESPACE = exports.CONTEXT_MENU_ITEMS_NAMESPACE = 'ContextMenu:items';\nvar CONTEXTMENU_ITEMS_ROW_ABOVE = exports.CONTEXTMENU_ITEMS_ROW_ABOVE = CONTEXT_MENU_ITEMS_NAMESPACE + '.insertRowAbove';\nvar CONTEXTMENU_ITEMS_ROW_BELOW = exports.CONTEXTMENU_ITEMS_ROW_BELOW = CONTEXT_MENU_ITEMS_NAMESPACE + '.insertRowBelow';\nvar CONTEXTMENU_ITEMS_INSERT_LEFT = exports.CONTEXTMENU_ITEMS_INSERT_LEFT = CONTEXT_MENU_ITEMS_NAMESPACE + '.insertColumnOnTheLeft';\nvar CONTEXTMENU_ITEMS_INSERT_RIGHT = exports.CONTEXTMENU_ITEMS_INSERT_RIGHT = CONTEXT_MENU_ITEMS_NAMESPACE + '.insertColumnOnTheRight';\nvar CONTEXTMENU_ITEMS_REMOVE_ROW = exports.CONTEXTMENU_ITEMS_REMOVE_ROW = CONTEXT_MENU_ITEMS_NAMESPACE + '.removeRow';\nvar CONTEXTMENU_ITEMS_REMOVE_COLUMN = exports.CONTEXTMENU_ITEMS_REMOVE_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.removeColumn';\nvar CONTEXTMENU_ITEMS_UNDO = exports.CONTEXTMENU_ITEMS_UNDO = CONTEXT_MENU_ITEMS_NAMESPACE + '.undo';\nvar CONTEXTMENU_ITEMS_REDO = exports.CONTEXTMENU_ITEMS_REDO = CONTEXT_MENU_ITEMS_NAMESPACE + '.redo';\nvar CONTEXTMENU_ITEMS_READ_ONLY = exports.CONTEXTMENU_ITEMS_READ_ONLY = CONTEXT_MENU_ITEMS_NAMESPACE + '.readOnly';\nvar CONTEXTMENU_ITEMS_CLEAR_COLUMN = exports.CONTEXTMENU_ITEMS_CLEAR_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.clearColumn';\n\nvar CONTEXTMENU_ITEMS_COPY = exports.CONTEXTMENU_ITEMS_COPY = CONTEXT_MENU_ITEMS_NAMESPACE + '.copy';\nvar CONTEXTMENU_ITEMS_CUT = exports.CONTEXTMENU_ITEMS_CUT = CONTEXT_MENU_ITEMS_NAMESPACE + '.cut';\n\nvar CONTEXTMENU_ITEMS_FREEZE_COLUMN = exports.CONTEXTMENU_ITEMS_FREEZE_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.freezeColumn';\nvar CONTEXTMENU_ITEMS_UNFREEZE_COLUMN = exports.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.unfreezeColumn';\n\nvar CONTEXTMENU_ITEMS_MERGE_CELLS = exports.CONTEXTMENU_ITEMS_MERGE_CELLS = CONTEXT_MENU_ITEMS_NAMESPACE + '.mergeCells';\nvar CONTEXTMENU_ITEMS_UNMERGE_CELLS = exports.CONTEXTMENU_ITEMS_UNMERGE_CELLS = CONTEXT_MENU_ITEMS_NAMESPACE + '.unmergeCells';\n\nvar CONTEXTMENU_ITEMS_ADD_COMMENT = exports.CONTEXTMENU_ITEMS_ADD_COMMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.addComment';\nvar CONTEXTMENU_ITEMS_EDIT_COMMENT = exports.CONTEXTMENU_ITEMS_EDIT_COMMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.editComment';\nvar CONTEXTMENU_ITEMS_REMOVE_COMMENT = exports.CONTEXTMENU_ITEMS_REMOVE_COMMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.removeComment';\nvar CONTEXTMENU_ITEMS_READ_ONLY_COMMENT = exports.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.readOnlyComment';\n\nvar CONTEXTMENU_ITEMS_ALIGNMENT = exports.CONTEXTMENU_ITEMS_ALIGNMENT = CONTEXT_MENU_ITEMS_NAMESPACE + '.align';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_LEFT = exports.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.left';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_CENTER = exports.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.center';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT = exports.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.right';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY = exports.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.justify';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_TOP = exports.CONTEXTMENU_ITEMS_ALIGNMENT_TOP = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.top';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE = exports.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.middle';\nvar CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM = exports.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM = CONTEXT_MENU_ITEMS_NAMESPACE + '.align.bottom';\n\nvar CONTEXTMENU_ITEMS_BORDERS = exports.CONTEXTMENU_ITEMS_BORDERS = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders';\nvar CONTEXTMENU_ITEMS_BORDERS_TOP = exports.CONTEXTMENU_ITEMS_BORDERS_TOP = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.top';\nvar CONTEXTMENU_ITEMS_BORDERS_RIGHT = exports.CONTEXTMENU_ITEMS_BORDERS_RIGHT = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.right';\nvar CONTEXTMENU_ITEMS_BORDERS_BOTTOM = exports.CONTEXTMENU_ITEMS_BORDERS_BOTTOM = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.bottom';\nvar CONTEXTMENU_ITEMS_BORDERS_LEFT = exports.CONTEXTMENU_ITEMS_BORDERS_LEFT = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.left';\nvar CONTEXTMENU_ITEMS_REMOVE_BORDERS = exports.CONTEXTMENU_ITEMS_REMOVE_BORDERS = CONTEXT_MENU_ITEMS_NAMESPACE + '.borders.remove';\n\nvar CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD = exports.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD = CONTEXT_MENU_ITEMS_NAMESPACE + '.nestedHeaders.insertChildRow';\nvar CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD = exports.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD = CONTEXT_MENU_ITEMS_NAMESPACE + '.nestedHeaders.detachFromParent';\n\nvar CONTEXTMENU_ITEMS_HIDE_COLUMN = exports.CONTEXTMENU_ITEMS_HIDE_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.hideColumn';\nvar CONTEXTMENU_ITEMS_SHOW_COLUMN = exports.CONTEXTMENU_ITEMS_SHOW_COLUMN = CONTEXT_MENU_ITEMS_NAMESPACE + '.showColumn';\n\nvar CONTEXTMENU_ITEMS_HIDE_ROW = exports.CONTEXTMENU_ITEMS_HIDE_ROW = CONTEXT_MENU_ITEMS_NAMESPACE + '.hideRow';\nvar CONTEXTMENU_ITEMS_SHOW_ROW = exports.CONTEXTMENU_ITEMS_SHOW_ROW = CONTEXT_MENU_ITEMS_NAMESPACE + '.showRow';\n\nvar FILTERS_NAMESPACE = exports.FILTERS_NAMESPACE = 'Filters:';\nvar FILTERS_CONDITIONS_NAMESPACE = exports.FILTERS_CONDITIONS_NAMESPACE = FILTERS_NAMESPACE + 'conditions';\nvar FILTERS_CONDITIONS_NONE = exports.FILTERS_CONDITIONS_NONE = FILTERS_CONDITIONS_NAMESPACE + '.none';\nvar FILTERS_CONDITIONS_EMPTY = exports.FILTERS_CONDITIONS_EMPTY = FILTERS_CONDITIONS_NAMESPACE + '.isEmpty';\nvar FILTERS_CONDITIONS_NOT_EMPTY = exports.FILTERS_CONDITIONS_NOT_EMPTY = FILTERS_CONDITIONS_NAMESPACE + '.isNotEmpty';\nvar FILTERS_CONDITIONS_EQUAL = exports.FILTERS_CONDITIONS_EQUAL = FILTERS_CONDITIONS_NAMESPACE + '.isEqualTo';\nvar FILTERS_CONDITIONS_NOT_EQUAL = exports.FILTERS_CONDITIONS_NOT_EQUAL = FILTERS_CONDITIONS_NAMESPACE + '.isNotEqualTo';\nvar FILTERS_CONDITIONS_BEGINS_WITH = exports.FILTERS_CONDITIONS_BEGINS_WITH = FILTERS_CONDITIONS_NAMESPACE + '.beginsWith';\nvar FILTERS_CONDITIONS_ENDS_WITH = exports.FILTERS_CONDITIONS_ENDS_WITH = FILTERS_CONDITIONS_NAMESPACE + '.endsWith';\nvar FILTERS_CONDITIONS_CONTAINS = exports.FILTERS_CONDITIONS_CONTAINS = FILTERS_CONDITIONS_NAMESPACE + '.contains';\nvar FILTERS_CONDITIONS_NOT_CONTAIN = exports.FILTERS_CONDITIONS_NOT_CONTAIN = FILTERS_CONDITIONS_NAMESPACE + '.doesNotContain';\nvar FILTERS_CONDITIONS_BY_VALUE = exports.FILTERS_CONDITIONS_BY_VALUE = FILTERS_CONDITIONS_NAMESPACE + '.byValue';\nvar FILTERS_CONDITIONS_GREATER_THAN = exports.FILTERS_CONDITIONS_GREATER_THAN = FILTERS_CONDITIONS_NAMESPACE + '.greaterThan';\nvar FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL = exports.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL = FILTERS_CONDITIONS_NAMESPACE + '.greaterThanOrEqualTo';\nvar FILTERS_CONDITIONS_LESS_THAN = exports.FILTERS_CONDITIONS_LESS_THAN = FILTERS_CONDITIONS_NAMESPACE + '.lessThan';\nvar FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL = exports.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL = FILTERS_CONDITIONS_NAMESPACE + '.lessThanOrEqualTo';\nvar FILTERS_CONDITIONS_BETWEEN = exports.FILTERS_CONDITIONS_BETWEEN = FILTERS_CONDITIONS_NAMESPACE + '.isBetween';\nvar FILTERS_CONDITIONS_NOT_BETWEEN = exports.FILTERS_CONDITIONS_NOT_BETWEEN = FILTERS_CONDITIONS_NAMESPACE + '.isNotBetween';\nvar FILTERS_CONDITIONS_AFTER = exports.FILTERS_CONDITIONS_AFTER = FILTERS_CONDITIONS_NAMESPACE + '.after';\nvar FILTERS_CONDITIONS_BEFORE = exports.FILTERS_CONDITIONS_BEFORE = FILTERS_CONDITIONS_NAMESPACE + '.before';\nvar FILTERS_CONDITIONS_TODAY = exports.FILTERS_CONDITIONS_TODAY = FILTERS_CONDITIONS_NAMESPACE + '.today';\nvar FILTERS_CONDITIONS_TOMORROW = exports.FILTERS_CONDITIONS_TOMORROW = FILTERS_CONDITIONS_NAMESPACE + '.tomorrow';\nvar FILTERS_CONDITIONS_YESTERDAY = exports.FILTERS_CONDITIONS_YESTERDAY = FILTERS_CONDITIONS_NAMESPACE + '.yesterday';\n\nvar FILTERS_DIVS_FILTER_BY_CONDITION = exports.FILTERS_DIVS_FILTER_BY_CONDITION = FILTERS_NAMESPACE + 'labels.filterByCondition';\nvar FILTERS_DIVS_FILTER_BY_VALUE = exports.FILTERS_DIVS_FILTER_BY_VALUE = FILTERS_NAMESPACE + 'labels.filterByValue';\n\nvar FILTERS_LABELS_CONJUNCTION = exports.FILTERS_LABELS_CONJUNCTION = FILTERS_NAMESPACE + 'labels.conjunction';\nvar FILTERS_LABELS_DISJUNCTION = exports.FILTERS_LABELS_DISJUNCTION = FILTERS_NAMESPACE + 'labels.disjunction';\n\nvar FILTERS_VALUES_BLANK_CELLS = exports.FILTERS_VALUES_BLANK_CELLS = FILTERS_NAMESPACE + 'values.blankCells';\n\nvar FILTERS_BUTTONS_SELECT_ALL = exports.FILTERS_BUTTONS_SELECT_ALL = FILTERS_NAMESPACE + 'buttons.selectAll';\nvar FILTERS_BUTTONS_CLEAR = exports.FILTERS_BUTTONS_CLEAR = FILTERS_NAMESPACE + 'buttons.clear';\nvar FILTERS_BUTTONS_OK = exports.FILTERS_BUTTONS_OK = FILTERS_NAMESPACE + 'buttons.ok';\nvar FILTERS_BUTTONS_CANCEL = exports.FILTERS_BUTTONS_CANCEL = FILTERS_NAMESPACE + 'buttons.cancel';\n\nvar FILTERS_BUTTONS_PLACEHOLDER_SEARCH = exports.FILTERS_BUTTONS_PLACEHOLDER_SEARCH = FILTERS_NAMESPACE + 'buttons.placeholder.search';\nvar FILTERS_BUTTONS_PLACEHOLDER_VALUE = exports.FILTERS_BUTTONS_PLACEHOLDER_VALUE = FILTERS_NAMESPACE + 'buttons.placeholder.value';\nvar FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE = exports.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE = FILTERS_NAMESPACE + 'buttons.placeholder.secondValue';\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getPluginName = exports.getRegistredPluginNames = exports.getPlugin = exports.registerPlugin = undefined;\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _object = __webpack_require__(2);\n\nvar _string = __webpack_require__(36);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar registeredPlugins = new WeakMap();\n\n/**\n * Registers plugin under given name\n *\n * @param {String} pluginName\n * @param {Function} PluginClass\n */\n/**\n * Utility to register plugins and common namespace for keeping reference to all plugins classes\n */\nfunction registerPlugin(pluginName, PluginClass) {\n  pluginName = (0, _string.toUpperCaseFirst)(pluginName);\n\n  _pluginHooks2.default.getSingleton().add('construct', function () {\n    var holder = void 0;\n\n    if (!registeredPlugins.has(this)) {\n      registeredPlugins.set(this, {});\n    }\n    holder = registeredPlugins.get(this);\n\n    if (!holder[pluginName]) {\n      holder[pluginName] = new PluginClass(this);\n    }\n  });\n  _pluginHooks2.default.getSingleton().add('afterDestroy', function () {\n    if (registeredPlugins.has(this)) {\n      var pluginsHolder = registeredPlugins.get(this);\n\n      (0, _object.objectEach)(pluginsHolder, function (plugin) {\n        return plugin.destroy();\n      });\n      registeredPlugins.delete(this);\n    }\n  });\n}\n\n/**\n * @param {Object} instance\n * @param {String|Function} pluginName\n * @returns {Function} pluginClass Returns plugin instance if exists or `undefined` if not exists.\n */\nfunction getPlugin(instance, pluginName) {\n  if (typeof pluginName != 'string') {\n    throw Error('Only strings can be passed as \"plugin\" parameter');\n  }\n  var _pluginName = (0, _string.toUpperCaseFirst)(pluginName);\n\n  if (!registeredPlugins.has(instance) || !registeredPlugins.get(instance)[_pluginName]) {\n    return void 0;\n  }\n\n  return registeredPlugins.get(instance)[_pluginName];\n}\n\n/**\n * Get all registred plugins names for concrete Handsontable instance.\n *\n * @param {Object} hotInstance\n * @returns {Array}\n */\nfunction getRegistredPluginNames(hotInstance) {\n  return registeredPlugins.has(hotInstance) ? Object.keys(registeredPlugins.get(hotInstance)) : [];\n}\n\n/**\n * Get plugin name.\n *\n * @param {Object} hotInstance\n * @param {Object} plugin\n * @returns {String|null}\n */\nfunction getPluginName(hotInstance, plugin) {\n  var pluginName = null;\n\n  if (registeredPlugins.has(hotInstance)) {\n    (0, _object.objectEach)(registeredPlugins.get(hotInstance), function (pluginInstance, name) {\n      if (pluginInstance === plugin) {\n        pluginName = name;\n      }\n    });\n  }\n\n  return pluginName;\n}\n\nexports.registerPlugin = registerPlugin;\nexports.getPlugin = getPlugin;\nexports.getRegistredPluginNames = getRegistredPluginNames;\nexports.getPluginName = getPluginName;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _recordTranslator = __webpack_require__(193);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar privatePool = new WeakMap();\nvar initializedPlugins = null;\n\n/**\n * @private\n */\n\nvar BasePlugin = function () {\n  /**\n   * @param {Object} hotInstance Handsontable instance.\n   */\n  function BasePlugin(hotInstance) {\n    var _this = this;\n\n    _classCallCheck(this, BasePlugin);\n\n    /**\n     * Handsontable instance.\n     *\n     * @type {Core}\n     */\n    (0, _object.defineGetter)(this, 'hot', hotInstance, {\n      writable: false\n    });\n    (0, _object.defineGetter)(this, 't', (0, _recordTranslator.getTranslator)(hotInstance), {\n      writable: false\n    });\n\n    privatePool.set(this, { hooks: {} });\n    initializedPlugins = null;\n\n    this.pluginName = null;\n    this.pluginsInitializedCallbacks = [];\n    this.isPluginsReady = false;\n    this.enabled = false;\n    this.initialized = false;\n\n    this.hot.addHook('afterPluginsInitialized', function () {\n      return _this.onAfterPluginsInitialized();\n    });\n    this.hot.addHook('afterUpdateSettings', function () {\n      return _this.onUpdateSettings();\n    });\n    this.hot.addHook('beforeInit', function () {\n      return _this.init();\n    });\n  }\n\n  _createClass(BasePlugin, [{\n    key: 'init',\n    value: function init() {\n      this.pluginName = (0, _plugins.getPluginName)(this.hot, this);\n\n      if (this.isEnabled && this.isEnabled()) {\n        this.enablePlugin();\n      }\n      if (!initializedPlugins) {\n        initializedPlugins = (0, _plugins.getRegistredPluginNames)(this.hot);\n      }\n      if (initializedPlugins.indexOf(this.pluginName) >= 0) {\n        initializedPlugins.splice(initializedPlugins.indexOf(this.pluginName), 1);\n      }\n      if (!initializedPlugins.length) {\n        this.hot.runHooks('afterPluginsInitialized');\n      }\n      this.initialized = true;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      this.enabled = true;\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      if (this.eventManager) {\n        this.eventManager.clear();\n      }\n      this.clearHooks();\n      this.enabled = false;\n    }\n\n    /**\n     * Add listener to plugin hooks system.\n     *\n     * @param {String} name\n     * @param {Function} callback\n     */\n\n  }, {\n    key: 'addHook',\n    value: function addHook(name, callback) {\n      privatePool.get(this).hooks[name] = privatePool.get(this).hooks[name] || [];\n\n      var hooks = privatePool.get(this).hooks[name];\n\n      this.hot.addHook(name, callback);\n      hooks.push(callback);\n      privatePool.get(this).hooks[name] = hooks;\n    }\n\n    /**\n     * Remove all hooks listeners by hook name.\n     *\n     * @param {String} name\n     */\n\n  }, {\n    key: 'removeHooks',\n    value: function removeHooks(name) {\n      var _this2 = this;\n\n      (0, _array.arrayEach)(privatePool.get(this).hooks[name] || [], function (callback) {\n        _this2.hot.removeHook(name, callback);\n      });\n    }\n\n    /**\n     * Clear all hooks.\n     */\n\n  }, {\n    key: 'clearHooks',\n    value: function clearHooks() {\n      var _this3 = this;\n\n      var hooks = privatePool.get(this).hooks;\n\n      (0, _object.objectEach)(hooks, function (callbacks, name) {\n        return _this3.removeHooks(name);\n      });\n      hooks.length = 0;\n    }\n\n    /**\n     * Register function which will be immediately called after all plugins initialized.\n     *\n     * @param {Function} callback\n     */\n\n  }, {\n    key: 'callOnPluginsReady',\n    value: function callOnPluginsReady(callback) {\n      if (this.isPluginsReady) {\n        callback();\n      } else {\n        this.pluginsInitializedCallbacks.push(callback);\n      }\n    }\n\n    /**\n     * On after plugins initialized listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterPluginsInitialized',\n    value: function onAfterPluginsInitialized() {\n      (0, _array.arrayEach)(this.pluginsInitializedCallbacks, function (callback) {\n        return callback();\n      });\n      this.pluginsInitializedCallbacks.length = 0;\n      this.isPluginsReady = true;\n    }\n\n    /**\n     * On update settings listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onUpdateSettings',\n    value: function onUpdateSettings() {\n      if (this.isEnabled) {\n        if (this.enabled && !this.isEnabled()) {\n          this.disablePlugin();\n        }\n        if (!this.enabled && this.isEnabled()) {\n          this.enablePlugin();\n        }\n        if (this.enabled && this.isEnabled()) {\n          this.updatePlugin();\n        }\n      }\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {}\n\n    /**\n     * Destroy plugin.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      var _this4 = this;\n\n      if (this.eventManager) {\n        this.eventManager.destroy();\n      }\n      this.clearHooks();\n\n      (0, _object.objectEach)(this, function (value, property) {\n        if (property !== 'hot' && property !== 't') {\n          _this4[property] = null;\n        }\n      });\n      delete this.t;\n      delete this.hot;\n    }\n  }]);\n\n  return BasePlugin;\n}();\n\nexports.default = BasePlugin;\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar store = __webpack_require__(77)('wks');\nvar uid = __webpack_require__(48);\nvar Symbol = __webpack_require__(14).Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n  return store[name] || (store[name] =\n    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.stopImmediatePropagation = stopImmediatePropagation;\nexports.isImmediatePropagationStopped = isImmediatePropagationStopped;\nexports.stopPropagation = stopPropagation;\nexports.pageX = pageX;\nexports.pageY = pageY;\nexports.isRightClick = isRightClick;\nexports.isLeftClick = isLeftClick;\n\nvar _element = __webpack_require__(0);\n\n/**\n * Prevent other listeners of the same event from being called.\n *\n * @param {Event} event\n */\nfunction stopImmediatePropagation(event) {\n  event.isImmediatePropagationEnabled = false;\n  event.cancelBubble = true;\n}\n\n/**\n * Check if event was stopped by `stopImmediatePropagation`.\n *\n * @param event {Event}\n * @returns {Boolean}\n */\nfunction isImmediatePropagationStopped(event) {\n  return event.isImmediatePropagationEnabled === false;\n}\n\n/**\n * Prevent further propagation of the current event (prevent bubbling).\n *\n * @param event {Event}\n */\nfunction stopPropagation(event) {\n  // ie8\n  // http://msdn.microsoft.com/en-us/library/ie/ff975462(v=vs.85).aspx\n  if (typeof event.stopPropagation === 'function') {\n    event.stopPropagation();\n  } else {\n    event.cancelBubble = true;\n  }\n}\n\n/**\n * Get horizontal coordinate of the event object relative to the whole document.\n *\n * @param {Event} event\n * @returns {Number}\n */\nfunction pageX(event) {\n  if (event.pageX) {\n    return event.pageX;\n  }\n\n  return event.clientX + (0, _element.getWindowScrollLeft)();\n}\n\n/**\n * Get vertical coordinate of the event object relative to the whole document.\n *\n * @param {Event} event\n * @returns {Number}\n */\nfunction pageY(event) {\n  if (event.pageY) {\n    return event.pageY;\n  }\n\n  return event.clientY + (0, _element.getWindowScrollTop)();\n}\n\n/**\n * Check if provided event was triggered by clicking the right mouse button.\n *\n * @param {Event} event DOM Event.\n * @returns {Boolean}\n */\nfunction isRightClick(event) {\n  return event.button === 2;\n}\n\n/**\n * Check if provided event was triggered by clicking the left mouse button.\n *\n * @param {Event} event DOM Event.\n * @returns {Boolean}\n */\nfunction isLeftClick(event) {\n  return event.button === 0;\n}\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getRegisteredRenderers = exports.getRegisteredRendererNames = exports.hasRenderer = exports.getRenderer = exports.registerRenderer = undefined;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _cellDecorator = __webpack_require__(242);\n\nvar _cellDecorator2 = _interopRequireDefault(_cellDecorator);\n\nvar _autocompleteRenderer = __webpack_require__(243);\n\nvar _autocompleteRenderer2 = _interopRequireDefault(_autocompleteRenderer);\n\nvar _checkboxRenderer = __webpack_require__(244);\n\nvar _checkboxRenderer2 = _interopRequireDefault(_checkboxRenderer);\n\nvar _htmlRenderer = __webpack_require__(245);\n\nvar _htmlRenderer2 = _interopRequireDefault(_htmlRenderer);\n\nvar _numericRenderer = __webpack_require__(246);\n\nvar _numericRenderer2 = _interopRequireDefault(_numericRenderer);\n\nvar _passwordRenderer = __webpack_require__(248);\n\nvar _passwordRenderer2 = _interopRequireDefault(_passwordRenderer);\n\nvar _textRenderer = __webpack_require__(249);\n\nvar _textRenderer2 = _interopRequireDefault(_textRenderer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _staticRegister = (0, _staticRegister3.default)('renderers'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem,\n    hasItem = _staticRegister.hasItem,\n    getNames = _staticRegister.getNames,\n    getValues = _staticRegister.getValues;\n\nregister('base', _cellDecorator2.default);\nregister('autocomplete', _autocompleteRenderer2.default);\nregister('checkbox', _checkboxRenderer2.default);\nregister('html', _htmlRenderer2.default);\nregister('numeric', _numericRenderer2.default);\nregister('password', _passwordRenderer2.default);\nregister('text', _textRenderer2.default);\n\n/**\n * Retrieve renderer function.\n *\n * @param {String} name Renderer identification.\n * @returns {Function} Returns renderer function.\n */\nfunction _getItem(name) {\n  if (typeof name === 'function') {\n    return name;\n  }\n  if (!hasItem(name)) {\n    throw Error('No registered renderer found under \"' + name + '\" name');\n  }\n\n  return getItem(name);\n}\n\nexports.registerRenderer = register;\nexports.getRenderer = _getItem;\nexports.hasRenderer = hasItem;\nexports.getRegisteredRendererNames = getNames;\nexports.getRegisteredRenderers = getValues;\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports) {\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self\n  // eslint-disable-next-line no-new-func\n  : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @description\n * Handsontable events are the common interface that function in 2 ways: as __callbacks__ and as __hooks__.\n *\n * @example\n *\n * ```js\n * // Using events as callbacks:\n * ...\n * var hot1 = new Handsontable(document.getElementById('example1'), {\n *   afterChange: function(changes, source) {\n *     $.ajax({\n *       url: \"save.php',\n *       data: change\n *     });\n *   }\n * });\n * ...\n * ```\n *\n * ```js\n * // Using events as plugin hooks:\n * ...\n * var hot1 = new Handsontable(document.getElementById('example1'), {\n *   myPlugin: true\n * });\n *\n * var hot2 = new Handsontable(document.getElementById('example2'), {\n *   myPlugin: false\n * });\n *\n * // global hook\n * Handsontable.hooks.add('afterChange', function() {\n *   // Fired twice - for hot1 and hot2\n *   if (this.getSettings().myPlugin) {\n *     // function body - will only run for hot1\n *   }\n * });\n *\n * // local hook (has same effect as a callback)\n * hot2.addHook('afterChange', function() {\n *   // function body - will only run in #example2\n * });\n * ```\n * ...\n */\n\n// @TODO: Move plugin description hooks to plugin?\nvar REGISTERED_HOOKS = [\n/**\n * Callback fired after resetting a cell's meta.\n *\n * @event Hooks#afterCellMetaReset\n * @since 0.11\n */\n'afterCellMetaReset',\n\n/**\n * @description\n * Callback fired after one or more cells has been changed. Its main use case is to save the input.\n *\n * __Note:__ For performance reasons, the `changes` array is null for `\"loadData\"` source.\n *\n * @event Hooks#afterChange\n * @param {Array} changes 2D array containing information about each of the edited cells `[[row, prop, oldVal, newVal], ...]`.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterChange',\n\n/**\n * @description\n * Fired after observing changes.\n *\n * @event Hooks#afterChangesObserved\n */\n'afterChangesObserved',\n\n/**\n * @description\n * Fired after setting up the Context Menu's default options. These options are a collection which user can select by setting\n * an array of keys or an array of objects in `contextMenu` option.\n *\n * @event Hooks#afterContextMenuDefaultOptions\n * @param {Array} predefinedItems Array of objects containing information about the pre-defined Context Menu items.\n */\n'afterContextMenuDefaultOptions',\n\n/**\n * @description\n * Fired before setting up the Context Menu's items but after filtering these options by user (`contextMenu` option). This hook\n * can by helpful to determine if user use specified menu item or to set up one of the menu item to by always visible.\n *\n * @event Hooks#beforeContextMenuSetItems\n * @param {Array} menuItems Array of objects containing information about to generated Context Menu items.\n */\n'beforeContextMenuSetItems',\n\n/**\n * @description\n * Fired after setting up the Context Menu's default options. These options are a collection which user can select by setting\n * an array of keys or an array of objects in `contextMenu` option.\n *\n * @pro\n * @event Hooks#afterDropdownMenuDefaultOptions\n * @param {Array} predefinedItems Array of objects containing information about the pre-defined Context Menu items.\n */\n'afterDropdownMenuDefaultOptions',\n\n/**\n * @description\n * Fired before setting up the Dropdown Menu's items but after filtering these options by user (`dropdownMenu` option). This hook\n * can by helpful to determine if user use specified menu item or to set up one of the menu item to by always visible.\n *\n * @pro\n * @event Hooks#beforeDropdownMenuSetItems\n * @param {Array} menuItems Array of objects containing information about to generated Dropdown Menu items.\n */\n'beforeDropdownMenuSetItems',\n\n/**\n * @description\n * Fired after hiding the Context Menu.\n *\n * @event Hooks#afterContextMenuHide\n * @param {Object} context The Context menu instance.\n */\n'afterContextMenuHide',\n\n/**\n * @description\n * Fired before opening the Context Menu.\n *\n * @event Hooks#beforeContextMenuShow\n * @param {Object} context The Context Menu instance.\n */\n'beforeContextMenuShow',\n\n/**\n * @description\n * Fired after opening the Context Menu.\n *\n * @event Hooks#afterContextMenuShow\n * @param {Object} context The Context Menu instance.\n */\n'afterContextMenuShow',\n\n/**\n * @description\n * Fired after reaching the copy limit while copying data.\n *\n * @event Hooks#afterCopyLimit\n * @param {Number} selectedRows Count of selected copyable rows.\n * @param {Number} selectedColumns Count of selected copyable columns.\n * @param {Number} copyRowsLimit Current copy rows limit.\n * @param {Number} copyColumnsLimit Current copy columns limit.\n */\n'afterCopyLimit',\n\n/**\n * Callback is fired before a new column was created.\n *\n * @since 0.28.0\n * @event Hooks#beforeCreateCol\n * @param {Number} index Represents the visual index of first newly created column in the data source array.\n * @param {Number} amount Number of newly created columns in the data source array.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'beforeCreateCol',\n\n/**\n * Callback is fired after a new column was created.\n *\n * @event Hooks#afterCreateCol\n * @param {Number} index Represents the visual index of first newly created column in the data source array.\n * @param {Number} amount Number of newly created columns in the data source array.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterCreateCol',\n\n/**\n * Callback is fired before a new row was created.\n *\n * @since 0.28.0\n * @event Hooks#beforeCreateRow\n * @param {Number} index Represents the visual index of first newly created row in the data source array.\n * @param {Number} amount Number of newly created rows in the data source array.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'beforeCreateRow',\n\n/**\n * Callback is fired after a new row was created.\n *\n * @event Hooks#afterCreateRow\n * @param {Number} index Represents the visual index of first newly created row in the data source array.\n * @param {Number} amount Number of newly created rows in the data source array.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterCreateRow',\n\n/**\n * Fired after the current cell is deselected.\n *\n * @event Hooks#afterDeselect\n */\n'afterDeselect',\n\n/**\n * Fired after destroying the Handsontable instance.\n *\n * @event Hooks#afterDestroy\n */\n'afterDestroy',\n\n/**\n * Fired on a `keydown` event on the document body.\n *\n * @event Hooks#afterDocumentKeyDown\n * @param {Event} event A `keydown` event.\n */\n'afterDocumentKeyDown',\n\n/**\n * Fired inside the Walkontable's selection `draw` method. Can be used to add additional class names to cells, depending on the current selection.\n *\n * @event Hooks#afterDrawSelection\n * @param {Number} currentRow Row index of the currently processed cell.\n * @param {Number} currentColumn Column index of the currently cell.\n * @param {Array} cornersOfSelection Array of the current selection in a form of `[startRow, startColumn, endRow, endColumn]`.\n * @param {Number|undefined} layerLevel Number indicating which layer of selection is currently processed.\n * @since 0.38.1\n * @returns {String|undefined} Can return a `String`, which will act as an additional `className` to be added to the currently processed cell.\n */\n'afterDrawSelection',\n/**\n * Fired inside the Walkontable's `refreshSelections` method. Can be used to remove additional class names from all cells in the table.\n *\n * @event Hooks#beforeRemoveCellClassNames\n * @since 0.38.1\n * @returns {String[]|undefined} Can return an `Array` of `String`s. Each of these strings will act like class names to be removed from all the cells in the table.\n */\n'beforeRemoveCellClassNames',\n/**\n * Callback fired after getting the cell settings.\n *\n * @event Hooks#afterGetCellMeta\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {Object} cellProperties Object containing the cell properties.\n */\n'afterGetCellMeta',\n\n/**\n * Callback fired after retrieving information about a column header and appending it to the table header.\n *\n * @event Hooks#afterGetColHeader\n * @param {Number} col Visual column index.\n * @param {Element} TH Header's TH element.\n */\n'afterGetColHeader',\n\n/**\n * Callback fired after retrieving information about a column header and appending it to the table header.\n *\n * @event Hooks#afterGetRowHeader\n * @param {Number} row Visual row index.\n * @param {Element} TH Header's TH element.\n */\n'afterGetRowHeader',\n\n/**\n * Callback fired after Handsontable instance is initiated.\n *\n * @event Hooks#afterInit\n */\n'afterInit',\n\n/**\n * Callback fired after new data is loaded (by `loadData` method) into the data source array.\n *\n * @event Hooks#afterLoadData\n * @param {Boolean} firstTime flag that determines whether the data has been loaded during the initialization.\n */\n'afterLoadData',\n\n/**\n * Fired after a scroll event, which is identified as a momentum scroll (e.g. on an iPad).\n *\n * @event Hooks#afterMomentumScroll\n */\n'afterMomentumScroll',\n\n/**\n * Fired after a `mousedown` event is triggered on the cell corner (the drag handle).\n *\n * @event Hooks#afterOnCellCornerMouseDown\n * @since 0.11\n * @param {Object} event `mousedown` event object.\n */\n'afterOnCellCornerMouseDown',\n\n/**\n * Fired after a `dblclick` event is triggered on the cell corner (the drag handle).\n *\n * @event Hooks#afterOnCellCornerDblClick\n * @since 0.30.0\n * @param {Object} event `dblclick` event object.\n */\n'afterOnCellCornerDblClick',\n\n/**\n * Callback fired after clicking on a cell or row/column header.\n * In case the row/column header was clicked, the index is negative.\n * For example clicking on the row header of cell (0, 0) results with `afterOnCellMouseDown` called\n * with coords `{row: 0, col: -1}`.\n *\n * @event Hooks#afterOnCellMouseDown\n * @since 0.11\n * @param {Object} event `mousedown` event object.\n * @param {Object} coords Coordinates object containing the visual row and visual column indexes of the clicked cell.\n * @param {Element} TD Cell's TD (or TH) element.\n */\n'afterOnCellMouseDown',\n\n/**\n * Callback fired after hovering a cell or row/column header with the mouse cursor.\n * In case the row/column header was hovered, the index is negative.\n * For example, hovering over the row header of cell (0, 0) results with `afterOnCellMouseOver` called\n * with coords `{row: 0, col: -1}`.\n *\n * @event Hooks#afterOnCellMouseOver\n * @since 0.11\n * @param {Object} event `mouseover` event object.\n * @param {Object} coords Hovered cell's visual coordinate object.\n * @param {Element} TD Cell's TD (or TH) element.\n */\n'afterOnCellMouseOver',\n\n/**\n * Callback fired after leaving a cell or row/column header with the mouse cursor.\n *\n * @event Hooks#afterOnCellMouseOut\n * @since 0.31.1\n * @param {Object} event `mouseout` event object.\n * @param {Object} coords Leaved cell's visual coordinate object.\n * @param {Element} TD Cell's TD (or TH) element.\n */\n'afterOnCellMouseOut',\n\n/**\n * Callback is fired when one or more columns are removed.\n *\n * @event Hooks#afterRemoveCol\n * @param {Number} index Is an visual index of starter column.\n * @param {Number} amount Is an amount of removed columns.\n */\n'afterRemoveCol',\n\n/**\n * Callback is fired when one or more rows are removed.\n *\n * @event Hooks#afterRemoveRow\n * @param {Number} index Is an visual index of starter row.\n * @param {Number} amount Is an amount of removed rows.\n */\n'afterRemoveRow',\n\n/**\n * Callback fired after the Handsontable table is rendered.\n *\n * @event Hooks#afterRender\n * @param {Boolean} isForced Is `true` if rendering was triggered by a change of settings or data; or `false` if\n *                           rendering was triggered by scrolling or moving selection.\n */\n'afterRender',\n\n/**\n * Fired before starting rendering the cell.\n *\n * @event Hooks#beforeRenderer\n * @since 0.24.2\n * @param {Element} TD Currently rendered cell's TD element.\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String|Number} prop Column property name or a column index, if datasource is an array of arrays.\n * @param {String} value Value of the rendered cell.\n * @param {Object} cellProperties Object containing the cell's properties.\n */\n'beforeRenderer',\n\n/**\n * Fired after finishing rendering the cell (after the renderer finishes).\n *\n * @event Hooks#afterRenderer\n * @since 0.11.0\n * @param {Element} TD Currently rendered cell's TD element.\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String|Number} prop Column property name or a column index, if datasource is an array of arrays.\n * @param {String} value Value of the rendered cell.\n * @param {Object} cellProperties Object containing the cell's properties.\n */\n'afterRenderer',\n\n/**\n * Fired after the horizontal scroll event.\n *\n * @event Hooks#afterScrollHorizontally\n * @since 0.11\n */\n'afterScrollHorizontally',\n\n/**\n * Fired after the vertical scroll event.\n *\n * @event Hooks#afterScrollVertically\n * @since 0.11\n */\n'afterScrollVertically',\n\n/**\n * Callback fired after one or more cells are selected (e.g. during mouse move).\n *\n * @event Hooks#afterSelection\n * @param {Number} r Selection start visual row index.\n * @param {Number} c Selection start visual column index.\n * @param {Number} r2 Selection end visual row index.\n * @param {Number} c2 Selection end visual column index.\n * @param {Object} preventScrolling Object with `value` property where its value change will be observed.\n * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n * @example\n * ```js\n * handsontable({\n *   afterSelection: function (r, c, r2, c2, preventScrolling, selectionLayerLevel) {\n *     // setting if prevent scrolling after selection\n *     preventScrolling.value = true;\n *   }\n * })\n * ```\n */\n'afterSelection',\n\n/**\n * Callback fired after one or more cells are selected. The `p` argument represents the source object property name instead of the column number.\n *\n * @event Hooks#afterSelectionByProp\n * @param {Number} r Selection start visual row index.\n * @param {String} p Selection start data source object property name.\n * @param {Number} r2 Selection end visual row index.\n * @param {String} p2 Selection end data source object property name.\n * @param {Object} preventScrolling Object with `value` property where its value change will be observed.\n * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n * @example\n * ```js\n * handsontable({\n *   afterSelectionByProp: function (r, c, r2, c2, preventScrolling, selectionLayerLevel) {\n *     // setting if prevent scrolling after selection\n *     preventScrolling.value = true;\n *   }\n * })\n * ```\n */\n'afterSelectionByProp',\n\n/**\n * Callback fired after one or more cells are selected (e.g. on mouse up).\n *\n * @event Hooks#afterSelectionEnd\n * @param {Number} r Selection start visual row index.\n * @param {Number} c Selection start visual column index.\n * @param {Number} r2 Selection end visual row index.\n * @param {Number} c2 Selection end visual column index.\n * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n */\n'afterSelectionEnd',\n\n/**\n * Callback fired after one or more cells are selected (e.g. on mouse up). The `p` argument represents the data source object\n * property name instead of the column number.\n *\n * @event Hooks#afterSelectionEndByProp\n * @param {Number} r Selection start visual row index.\n * @param {String} p Selection start data source object property index.\n * @param {Number} r2 Selection end visual row index.\n * @param {String} p2 Selection end data source object property index.\n * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n */\n'afterSelectionEndByProp',\n\n/**\n * Called after cell meta is changed.\n *\n * @event Hooks#afterSetCellMeta\n * @since 0.11.0\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String} key The updated meta key.\n * @param {*} value The updated meta value.\n */\n'afterSetCellMeta',\n\n/**\n * Called after cell meta is removed.\n *\n * @event Hooks#afterRemoveCellMeta\n * @since 0.33.1\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String} key The removed meta key.\n * @param {*} value Value which was under removed key of cell meta.\n */\n'afterRemoveCellMeta',\n\n/**\n * Called after cell data was changed.\n *\n * @event Hooks#afterSetDataAtCell\n * @since 0.28.0\n * @param {Array} changes An array of changes in format `[[row, col, oldValue, value], ...]`.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterSetDataAtCell',\n\n/**\n * Called after cell data was changed.\n *\n * @event Hooks#afterSetDataAtRowProp\n * @since 0.28.0\n * @param {Array} changes An array of changes in format `[[row, prop, oldValue, value], ...]`.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterSetDataAtRowProp',\n\n/**\n * Fired after calling the `updateSettings` method.\n *\n * @event Hooks#afterUpdateSettings\n * @param {Object} settings New settings object.\n */\n'afterUpdateSettings',\n\n/**\n * @description\n * A plugin hook executed after validator function, only if validator function is defined.\n * Validation result is the first parameter. This can be used to determinate if validation passed successfully or not.\n *\n * __Returning false from the callback will mark the cell as invalid.__\n *\n * @event Hooks#afterValidate\n * @since 0.9.5\n * @param {Boolean} isValid `true` if valid, `false` if not.\n * @param {*} value The value in question.\n * @param {Number} row Row index.\n * @param {String|Number} prop Property name / column index.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'afterValidate',\n\n/**\n * Fired before successful change of language (when proper language code was set)\n *\n * @event Hooks#beforeLanguageChange\n * @since 0.35.0\n * @param {String} languageCode New language code.\n */\n'beforeLanguageChange',\n\n/**\n * Fired after successful change of language (when proper language code was set)\n *\n * @event Hooks#afterLanguageChange\n * @since 0.35.0\n * @param {String} languageCode New language code.\n */\n'afterLanguageChange',\n\n/**\n * Fired before populating the data in the autofill feature.\n *\n * @event Hooks#beforeAutofill\n * @param {Object} start Object containing information about first filled cell: `{row: 2, col: 0}`.\n * @param {Object} end Object containing information about last filled cell: `{row: 4, col: 1}`.\n * @param {Array} data 2D array containing information about fill pattern: `[[\"1\", \"Ted\"], [\"1\", \"John\"]]`.\n * @param {Array} baseRange The coordinates of the base area for autofill.\n */\n'beforeAutofill',\n\n/**\n * Fired before aligning the cell contents.\n *\n * @event Hooks#beforeCellAlignment\n * @param stateBefore\n * @param range\n * @param {String} type Type of the alignment - either `horizontal` or `vertical`\n * @param {String} alignmentClass String defining the alignment class added to the cell.\n * Possible values:\n * * `htLeft`,\n * * `htCenter`,\n * * `htRight`,\n * * `htJustify`\n * for horizontal alignment,\n *\n *\n * * `htTop`,\n * * `htMiddle`,\n * * `htBottom`\n * for vertical alignment.\n */\n'beforeCellAlignment',\n\n/**\n * Callback fired before one or more cells is changed. Its main purpose is to alter changes silently before input.\n *\n * @event Hooks#beforeChange\n * @param {Array} changes 2D array containing information about each of the edited cells.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n * @example\n * ```js\n * // To disregard a single change, set changes[i] to null or remove it from array using changes.splice(i, 1).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeChange: function(changes, source) {\n *     // [[row, prop, oldVal, newVal], ...]\n *     changes[0] = null;\n *   }\n * });\n * ...\n *\n * // To alter a single change, overwrite the desired value to changes[i][3].\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeChange: function(changes, source) {\n *     // [[row, prop, oldVal, newVal], ...]\n *     changes[0][3] = 10;\n *   }\n * });\n * ...\n *\n * // To cancel all edit, return false from the callback or set array length to 0 (changes.length = 0).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeChange: function(changes, source) {\n *     // [[row, prop, oldVal, newVal], ...]\n *     return false;\n *   }\n * });\n * ...\n * ```\n */\n'beforeChange',\n\n/**\n * Fired right before rendering the changes.\n *\n * @event Hooks#beforeChangeRender\n * @since 0.11\n * @param {Array} changes Array in form of [row, prop, oldValue, newValue].\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'beforeChangeRender',\n\n/**\n * Fired before drawing the borders.\n *\n * @event Hooks#beforeDrawBorders\n * @param {Array} corners Array specifying the current selection borders.\n * @param {String} borderClassName Specifies the border class name.\n */\n'beforeDrawBorders',\n\n/**\n * Callback fired before getting cell settings.\n *\n * @event Hooks#beforeGetCellMeta\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {Object} cellProperties Object containing the cell's properties.\n */\n'beforeGetCellMeta',\n\n/**\n * Called before cell meta is removed.\n *\n * @event Hooks#beforeRemoveCellMeta\n * @since 0.33.1\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {String} key The removed meta key.\n * @param {*} value Value which is under removed key of cell meta.\n */\n'beforeRemoveCellMeta',\n\n/**\n * @description\n * Callback fired before Handsontable instance is initiated.\n *\n * @event Hooks#beforeInit\n */\n'beforeInit',\n\n/**\n * Callback fired before Walkontable instance is initiated.\n *\n * @since 0.11\n * @event Hooks#beforeInitWalkontable\n * @param {Object} walkontableConfig Walkontable configuration object.\n */\n'beforeInitWalkontable',\n\n/**\n * Callback fired before keydown event is handled. It can be used to overwrite default key bindings.\n * Caution - in your `beforeKeyDown` handler you need to call `event.stopImmediatePropagation()` to prevent default key behavior.\n *\n * @event Hooks#beforeKeyDown\n * @since 0.9.0\n * @param {Event} event Original DOM event.\n */\n'beforeKeyDown',\n\n/**\n * Fired after the user clicked a cell, but before all the calculations related with it.\n *\n * @event Hooks#beforeOnCellMouseDown\n * @param {Event} event The `mousedown` event object.\n * @param {CellCoords} coords Cell coords object containing the visual coordinates of the clicked cell.\n * @param {Element} TD TD element.\n */\n'beforeOnCellMouseDown',\n\n/**\n * Fired after the user moved cursor over a cell, but before all the calculations related with it.\n *\n * @event Hooks#beforeOnCellMouseOver\n * @param {Event} event The `mouseover` event object.\n * @param {CellCoords} coords CellCoords object containing the visual coordinates of the clicked cell.\n * @param {Element} TD TD element.\n * @param {Object} blockCalculations Contain keys 'row' and 'column' with boolean value.\n */\n'beforeOnCellMouseOver',\n\n/**\n * Fired after the user moved cursor out from a cell, but before all the calculations related with it.\n *\n * @event Hooks#beforeOnCellMouseOut\n * @since 0.31.1\n * @param {Event} event The `mouseout` event object.\n * @param {WalkontableCellCoords} coords WalkontableCellCoords object containing the visual coordinates of the leaved cell.\n * @param {Element} TD TD element.\n */\n'beforeOnCellMouseOut',\n\n/**\n * Callback is fired when one or more columns are about to be removed.\n *\n * @event Hooks#beforeRemoveCol\n * @param {Number} index Visual index of starter column.\n * @param {Number} amount Amount of columns to be removed.\n * @param {Array} [visualCols] Consists of visual indexes of processed columns.\n */\n'beforeRemoveCol',\n\n/**\n * Callback is fired when one or more rows are about to be removed.\n *\n * @event Hooks#beforeRemoveRow\n * @param {Number} index Visual index of starter column.\n * @param {Number} amount Amount of columns to be removed.\n * @param {Array} [visualRows] Consists of visual indexes of processed rows.\n */\n'beforeRemoveRow',\n\n/**\n * Callback fired before Handsontable table is rendered.\n *\n * @event Hooks#beforeRender\n * @param {Boolean} isForced If `true` rendering was triggered by a change of settings or data; or `false` if\n *                           rendering was triggered by scrolling or moving selection.\n */\n'beforeRender',\n\n/**\n * Callback fired before setting range is started but not finished yet.\n *\n * @event Hooks#beforeSetRangeStartOnly\n * @param {CellCoords} coords CellCoords instance.\n */\n'beforeSetRangeStartOnly',\n\n/**\n * Callback fired before setting range is started.\n *\n * @event Hooks#beforeSetRangeStart\n * @param {CellCoords} coords CellCoords instance.\n */\n'beforeSetRangeStart',\n\n/**\n * Callback fired before setting range is ended.\n *\n * @event Hooks#beforeSetRangeEnd\n * @param {CellCoords} coords CellCoords instance.\n */\n'beforeSetRangeEnd',\n\n/**\n * Fired before the logic of handling a touch scroll, when user started scrolling on a touch-enabled device.\n *\n * @event Hooks#beforeTouchScroll\n */\n'beforeTouchScroll',\n\n/**\n * @description\n * A plugin hook executed before validator function, only if validator function is defined.\n * This can be used to manipulate the value of changed cell before it is applied to the validator function.\n *\n * __Notice:__ this will not affect values of changes. This will change value ONLY for validation!\n *\n * @event Hooks#beforeValidate\n * @since 0.9.5\n * @param {*} value Value of the cell.\n * @param {Number} row Row index.\n * @param {String|Number} prop Property name / column index.\n * @param {String} [source] String that identifies source of hook call\n *                          ([list of all available sources]{@link http://docs.handsontable.com/tutorial-using-callbacks.html#page-source-definition}).\n */\n'beforeValidate',\n\n/**\n * Callback fired before cell value is rendered into the DOM (through renderer function).\n *\n * @event Hooks#beforeValueRender\n * @since 0.29.0\n * @param {*} value Cell value to render.\n */\n'beforeValueRender',\n\n/**\n * Callback fired after Handsontable instance is constructed (via `new` operator).\n *\n * @event Hooks#construct\n * @since 0.16.1\n */\n'construct',\n\n/**\n * Callback fired after Handsontable instance is initiated but before table is rendered.\n *\n * @event Hooks#init\n * @since 0.16.1\n */\n'init',\n\n/**\n * Fired when a column index is about to be modified by a callback function.\n *\n * @event Hooks#modifyCol\n * @since 0.11\n * @param {Number} col Visual column index.\n */\n'modifyCol',\n\n/**\n * Fired when a column index is about to be de-modified by a callback function.\n *\n * @event Hooks#unmodifyCol\n * @since 0.23.0\n * @param {Number} col Physical column index.\n */\n'unmodifyCol',\n\n/**\n * Fired when a physical row index is about to be de-modified by a callback function.\n *\n * @event Hooks#unmodifyRow\n * @since 0.26.2\n * @param {Number} row Physical row index.\n */\n'unmodifyRow',\n/**\n * Fired when a column header index is about to be modified by a callback function.\n *\n * @event Hooks#modifyColHeader\n * @since 0.20.0\n * @param {Number} column Visual column header index.\n */\n'modifyColHeader',\n\n/**\n * Fired when a column width is about to be modified by a callback function.\n *\n * @event Hooks#modifyColWidth\n * @since 0.11\n * @param {Number} width Current column width.\n * @param {Number} col Column index.\n */\n'modifyColWidth',\n\n/**\n * Fired when a row index is about to be modified by a callback function.\n *\n * @event Hooks#modifyRow\n * @since 0.11\n * @param {Number} row Row index.\n */\n'modifyRow',\n\n/**\n * Fired when a row header index is about to be modified by a callback function.\n *\n * @event Hooks#modifyRowHeader\n * @since 0.20.0\n * @param {Number} row Row header index.\n */\n'modifyRowHeader',\n\n/**\n * Fired when a row height is about to be modified by a callback function.\n *\n * @event Hooks#modifyRowHeight\n * @since 0.11.0\n * @param {Number} height Row height.\n * @param {Number} row Row index.\n */\n'modifyRowHeight',\n\n/**\n * Fired when a data was retrieved or modified.\n *\n * @event Hooks#modifyData\n * @since 0.28.0\n * @param {Number} row Row height.\n * @param {Number} column Column index.\n * @param {Object} valueHolder Object which contains original value which can be modified by overwriting `.value` property.\n * @param {String} ioMode String which indicates for what operation hook is fired (`get` or `set`).\n */\n'modifyData',\n\n/**\n * Fired when a data was retrieved or modified.\n *\n * @event Hooks#modifyRowData\n * @since 0.28.0\n * @param {Number} row Physical row index.\n */\n'modifyRowData',\n\n/**\n * Used to modify the cell coordinates when using the `getCell` method.\n *\n * @event Hooks#modifyGetCellCoords\n * @since 0.36.0\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @param {Boolean} topmost If set to true, it returns the TD element from the topmost overlay. For example,\n * if the wanted cell is in the range of fixed rows, it will return a TD element from the `top` overlay.\n */\n'modifyGetCellCoords',\n\n/**\n * Fired after loading data using the Persistent State plugin.\n *\n * @event Hooks#persistentStateLoad\n * @param {String} key Key string.\n * @param {Object} valuePlaceholder Object containing the loaded data.\n */\n'persistentStateLoad',\n\n/**\n * Fired after resetting data using the Persistent State plugin.\n *\n * @event Hooks#persistentStateReset\n * @param {String} key Key string.\n */\n'persistentStateReset',\n\n/**\n * Fired after resetting data using the Persistent State plugin.\n *\n * @event Hooks#persistentStateSave\n * @param {String} key Key string.\n * @param {Mixed} value Value to save.\n */\n'persistentStateSave',\n\n/**\n * Fired before sorting the column. If you return `false` value then sorting will be not applied by\n * Handsontable (useful for server-side sorting).\n *\n * @event Hooks#beforeColumnSort\n * @param {Number} column Sorted visual column index.\n * @param {Boolean} order Soring order where:\n *  * `true` means ascending order,\n *  * `false` means descending order,\n *  * `undefined` means original order.\n */\n'beforeColumnSort',\n\n/**\n * Fired after sorting the column.\n *\n * @event Hooks#afterColumnSort\n * @param {Number} column Sorted visual column index.\n * @param {Boolean} order Soring order where:\n *  * `true` means ascending order\n *  * `false` means descending order\n *  * `undefined` means original order\n */\n'afterColumnSort',\n\n/**\n * @description\n * Fired after setting range of autofill.\n * Both arguments are provided in the following format:\n * ```js\n * [startRow, startColumn, endRow, endColumn]\n * ```\n *\n * @event Hooks#modifyAutofillRange\n * @param {Array} startArea Array of visual coordinates of the starting point for the drag-down operation.\n * @param {Array} entireArea Array of visual coordinates of the entire area of the drag-down operation.\n */\n'modifyAutofillRange',\n\n/**\n * Fired to allow modifying the copyable range with a callback function.\n *\n * @since 0.19.0\n * @event Hooks#modifyCopyableRange\n * @param {Array} copyableRanges Array of objects defining copyable cells.\n */\n'modifyCopyableRange',\n\n/**\n * Called before copying the values into clipboard and before clearing values of the selected cells.\n *\n * @event Hooks#beforeCut\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains data to cut.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       which will be cut out.\n * @returns {*} If returns `false` then operation of the cutting out is cancelled.\n *\n * @example\n * ```js\n * // To disregard a single row, remove it from array using data.splice(i, 1).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeCut: function(data, coords) {\n *     // data -> [[1, 2, 3], [4, 5, 6]]\n *     data.splice(0, 1);\n *     // data -> [[4, 5, 6]]\n *     // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n *   }\n * });\n * ...\n *\n * // To cancel cutting out, return false from the callback.\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeCut: function(data, coords) {\n *     return false;\n *   }\n * });\n * ...\n * ```\n */\n'beforeCut',\n\n/**\n * Fired after data are cutted out from the table.\n *\n * @event Hooks#afterCut\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains the cutted out data.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       which was cut out.\n */\n'afterCut',\n\n/**\n * Fired before values are copied into clipboard.\n *\n * @event Hooks#beforeCopy\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains data to copied.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       which will copied.\n * @returns {*} If returns `false` then copying is cancelled.\n *\n * @example\n * ```js\n * // To disregard a single row, remove it from array using data.splice(i, 1).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeCopy: function(data, coords) {\n *     // data -> [[1, 2, 3], [4, 5, 6]]\n *     data.splice(0, 1);\n *     // data -> [[4, 5, 6]]\n *     // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n *   }\n * });\n * ...\n *\n * // To cancel copying, return false from the callback.\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforeCopy: function(data, coords) {\n *     return false;\n *   }\n * });\n * ...\n * ```\n */\n'beforeCopy',\n\n/**\n * Fired after data are pasted into table.\n *\n * @event Hooks#afterCopy\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains the copied data.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       which was copied.\n */\n'afterCopy',\n\n/**\n * Fired before values are pasted into table.\n *\n * @event Hooks#beforePaste\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains data to paste.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       that correspond to the previously selected area.\n * @returns {*} If returns `false` then pasting is cancelled.\n *\n * @example\n * ```js\n * // To disregard a single row, remove it from array using data.splice(i, 1).\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforePaste: function(data, coords) {\n *     // data -> [[1, 2, 3], [4, 5, 6]]\n *     data.splice(0, 1);\n *     // data -> [[4, 5, 6]]\n *     // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n *   }\n * });\n * ...\n *\n * // To cancel pasting, return false from the callback.\n * ...\n * new Handsontable(document.getElementById('example'), {\n *   beforePaste: function(data, coords) {\n *     return false;\n *   }\n * });\n * ...\n * ```\n */\n'beforePaste',\n\n/**\n * Fired after values are pasted into table.\n *\n * @event Hooks#afterPaste\n * @since 0.31.1\n * @param {Array} data An array of arrays which contains the pasted data.\n * @param {Array} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n *                       that correspond to the previously selected area.\n */\n'afterPaste',\n\n/**\n * Fired before change order of the visual indexes.\n *\n * @event Hooks#beforeColumnMove\n * @param {Array} columns Array of visual column indexes to be moved.\n * @param {Number} target Visual column index being a target for moved columns.\n */\n'beforeColumnMove',\n\n/**\n * Fired after change order of the visual indexes.\n *\n * @event Hooks#afterColumnMove\n * @param {Array} columns Array of visual column indexes that were moved.\n * @param {Number} target Visual column index being a target for moved columns.\n */\n'afterColumnMove',\n\n/**\n * Fired before change order of the visual indexes.\n *\n * @event Hooks#beforeRowMove\n * @param {Array} rows Array of visual row indexes to be moved.\n * @param {Number} target Visual row index being a target for moved rows.\n */\n'beforeRowMove',\n\n/**\n * Fired after change order of the visual indexes.\n *\n * @event Hooks#afterRowMove\n * @param {Array} rows Array of visual row indexes that were moved.\n * @param {Number} target Visual row index being a target for moved rows.\n */\n'afterRowMove',\n\n/**\n * Fired before rendering the table with modified column sizes.\n *\n * @event Hooks#beforeColumnResize\n * @param {Number} currentColumn Visual index of the resized column.\n * @param {Number} newSize Calculated new column width.\n * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n * @returns {Number} Returns a new column size or `undefined`, if column size should be calculated automatically.\n */\n'beforeColumnResize',\n\n/**\n * Fired after rendering the table with modified column sizes.\n *\n * @event Hooks#afterColumnResize\n * @param {Number} currentColumn Visual index of the resized column.\n * @param {Number} newSize Calculated new column width.\n * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n */\n'afterColumnResize',\n\n/**\n * Fired before rendering the table with modified row sizes.\n *\n * @event Hooks#beforeRowResize\n * @param {Number} currentRow Visual index of the resized row.\n * @param {Number} newSize Calculated new row height.\n * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n * @returns {Number} Returns the new row size or `undefined` if row size should be calculated automatically.\n */\n'beforeRowResize',\n\n/**\n * Fired after rendering the table with modified row sizes.\n *\n * @event Hooks#afterRowResize\n * @param {Number} currentRow Visual index of the resized row.\n * @param {Number} newSize Calculated new row height.\n * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n */\n'afterRowResize',\n\n/**\n * Fired after getting the column header renderers.\n *\n * @event Hooks#afterGetColumnHeaderRenderers\n * @param {Array} array Array of the column header renderers.\n */\n'afterGetColumnHeaderRenderers',\n\n/**\n * Fired after getting the row header renderers.\n *\n * @event Hooks#afterGetRowHeaderRenderers\n * @param {Array} array Array of the row header renderers.\n */\n'afterGetRowHeaderRenderers',\n\n/**\n * Fired before applying stretched column width to column.\n *\n * @event Hooks#beforeStretchingColumnWidth\n * @param {Number} stretchedWidth Calculated width.\n * @param {Number} column Visual column index.\n * @returns {Number} Returns new width which will be applied to the column element.\n */\n'beforeStretchingColumnWidth',\n\n/**\n * Fired before applying [filtering]{@link http://docs.handsontable.com/pro/demo-filtering.html}.\n *\n * @pro\n * @event Hooks#beforeFilter\n * @param {Array} conditionsStack An array of objects with added formulas.\n * @returns {Boolean} If hook returns `false` value then filtering won't be applied on the UI side (server-side filtering).\n */\n'beforeFilter',\n\n/**\n * Fired after applying [filtering]{@link http://docs.handsontable.com/pro/demo-filtering.html}.\n *\n * @pro\n * @event Hooks#afterFilter\n * @param {Array} conditionsStack An array of objects with added formulas.\n */\n'afterFilter',\n\n/**\n * Used to modify the column header height.\n *\n * @event Hooks#modifyColumnHeaderHeight\n * @since 0.25.0\n * @param {Number} col Visual column index.\n */\n'modifyColumnHeaderHeight',\n\n/**\n * Fired before the undo action. Contains information about the action that is being undone.\n *\n * @event Hooks#beforeUndo\n * @since 0.26.2\n * @param {Object} action The action object. Contains information about the action being undone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n */\n'beforeUndo',\n\n/**\n * Fired after the undo action. Contains information about the action that is being undone.\n *\n * @event Hooks#afterUndo\n * @since 0.26.2\n * @param {Object} action The action object. Contains information about the action being undone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n */\n'afterUndo',\n\n/**\n * Fired before the redo action. Contains information about the action that is being redone.\n *\n * @event Hooks#beforeRedo\n * @since 0.26.2\n * @param {Object} action The action object. Contains information about the action being redone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n */\n'beforeRedo',\n\n/**\n * Fired after the redo action. Contains information about the action that is being redone.\n *\n * @event Hooks#afterRedo\n * @since 0.26.2\n * @param {Object} action The action object. Contains information about the action being redone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n */\n'afterRedo',\n\n/**\n * Used to modify the row header width.\n *\n * @event Hooks#modifyRowHeaderWidth\n * @param {Number} rowHeaderWidth Row header width.\n */\n'modifyRowHeaderWidth',\n\n/**\n * Fired from the `populateFromArray` method during the `autofill` process. Fired for each \"autofilled\" cell individually.\n *\n * @event Hooks#beforeAutofillInsidePopulate\n * @param {Object} index Object containing `row` and `col` properties, defining the number of rows/columns from the initial cell of the autofill.\n * @param {String} direction Declares the direction of the autofill. Possible values: `up`, `down`, `left`, `right`.\n * @param {Array} input Array of arrays. Contains an array of rows with data being used in the autofill.\n * @param {Array} deltas The deltas array passed to the `populateFromArray` method.\n */\n'beforeAutofillInsidePopulate',\n\n/**\n * Fired when the start of the selection is being modified. (e.g. moving the selection with the arrow keys).\n *\n * @event Hooks#modifyTransformStart\n * @param {CellCoords} delta Cell coords object declaring the delta of the new selection relative to the previous one.\n */\n'modifyTransformStart',\n\n/**\n * Fired when the end of the selection is being modified. (e.g. moving the selection with the arrow keys).\n *\n * @event Hooks#modifyTransformEnd\n * @param {CellCoords} delta Cell coords object declaring the delta of the new selection relative to the previous one.\n */\n'modifyTransformEnd',\n\n/**\n * Fired after the start of the selection is being modified. (e.g. moving the selection with the arrow keys).\n *\n * @event Hooks#afterModifyTransformStart\n * @param {CellCoords} coords Coords of the freshly selected cell.\n * @param {Number} rowTransformDir `-1` if trying to select a cell with a negative row index. `0` otherwise.\n * @param {Number} colTransformDir `-1` if trying to select a cell with a negative column index. `0` otherwise.\n */\n'afterModifyTransformStart',\n\n/**\n * Fired after the end of the selection is being modified. (e.g. moving the selection with the arrow keys).\n *\n * @event Hooks#afterModifyTransformEnd\n * @param {CellCoords} coords Visual coords of the freshly selected cell.\n * @param {Number} rowTransformDir `-1` if trying to select a cell with a negative row index. `0` otherwise.\n * @param {Number} colTransformDir `-1` if trying to select a cell with a negative column index. `0` otherwise.\n */\n'afterModifyTransformEnd',\n\n/**\n * Fired inside the `viewportRowCalculatorOverride` method. Allows modifying the row calculator parameters.\n *\n * @event Hooks#afterViewportRowCalculatorOverride\n * @param {Object} calc The row calculator.\n */\n'afterViewportRowCalculatorOverride',\n\n/**\n * Fired inside the `viewportColumnCalculatorOverride` method. Allows modifying the row calculator parameters.\n *\n * @event Hooks#afterViewportColumnCalculatorOverride\n * @param {Object} calc The row calculator.\n */\n'afterViewportColumnCalculatorOverride',\n\n/**\n * Fired after initializing all the plugins.\n *\n * @event Hooks#afterPluginsInitialized\n */\n'afterPluginsInitialized',\n\n/**\n * Used when saving/loading the manual row heights state.\n *\n * @event Hooks#manualRowHeights\n * @param {Array} state The current manual row heights state.\n */\n'manualRowHeights',\n\n/**\n * Used to skip the length cache calculation for a defined period of time.\n *\n * @event Hooks#skipLengthCache\n * @param {Number} delay The delay in milliseconds.\n */\n'skipLengthCache',\n\n/**\n * Fired after trimming rows in the TrimRows plugin.\n *\n * @pro\n * @event Hooks#afterTrimRow\n * @param {Array} rows Physical indexes of trimmed rows.\n */\n'afterTrimRow',\n\n/**\n * Fired after untrimming rows in the TrimRows plugin.\n *\n * @pro\n * @event Hooks#afterUntrimRow\n * @param {Array} rows Physical indexes of untrimmed rows.\n */\n'afterUntrimRow',\n\n/**\n * Fired before opening the dropdown menu.\n *\n * @pro\n * @event Hooks#beforeDropdownMenuShow\n * @param {DropdownMenu} instance The DropdownMenu instance.\n */\n'beforeDropdownMenuShow',\n\n/**\n * Fired after opening the dropdown menu.\n *\n * @pro\n * @event Hooks#afterDropdownMenuShow\n * @param {DropdownMenu} instance The DropdownMenu instance.\n */\n'afterDropdownMenuShow',\n\n/**\n * Fired after hiding the dropdown menu.\n *\n * @pro\n * @event Hooks#afterDropdownMenuHide\n * @param {DropdownMenu} instance The DropdownMenu instance.\n */\n'afterDropdownMenuHide',\n\n/**\n * Used to check whether the provided row index is hidden.\n *\n * @pro\n * @event Hooks#hiddenRow\n * @param {Number} row The visual row index in question.\n */\n'hiddenRow',\n\n/**\n * Used to check whether the provided column index is hidden.\n *\n * @pro\n * @event Hooks#hiddenColumn\n * @param {Number} column The visual column index in question.\n */\n'hiddenColumn',\n\n/**\n * Fired before adding a children to the NestedRows structure.\n *\n * @pro\n * @event Hooks#beforeAddChild\n * @param {Object} parent The parent object.\n * @param {Object|undefined} element The element added as a child. If `undefined`, a blank child was added.\n * @param {Number|undefined} index The index within the parent where the new child was added. If `undefined`, the element was added as the last child.\n */\n'beforeAddChild',\n\n/**\n * Fired after adding a children to the NestedRows structure.\n *\n * @pro\n * @event Hooks#afterAddChild\n * @param {Object} parent The parent object.\n * @param {Object|undefined} element The element added as a child. If `undefined`, a blank child was added.\n * @param {Number|undefined} index The index within the parent where the new child was added. If `undefined`, the element was added as the last child.\n */\n'afterAddChild',\n\n/**\n * Fired before detaching a child from its parent in the NestedRows plugin.\n *\n * @pro\n * @event Hooks#beforeDetachChild\n * @param {Object} parent An object representing the parent from which the element is to be detached.\n * @param {Object} element The detached element.\n */\n'beforeDetachChild',\n\n/**\n * Fired after detaching a child from its parent in the NestedRows plugin.\n *\n * @pro\n * @event Hooks#afterDetachChild\n * @param {Object} parent An object representing the parent from which the element was detached.\n * @param {Object} element The detached element.\n */\n'afterDetachChild',\n\n/**\n * Fired after the editor is opened and rendered.\n *\n * @event Hooks#afterBeginEditing\n * @param {Number} row Row index of the edited cell.\n * @param {Number} column Column index of the edited cell.\n */\n'afterBeginEditing',\n\n/**\n * Fired before cell merging.\n *\n * @event Hooks#beforeMergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'beforeMergeCells',\n\n/**\n * Fired after cell merging.\n *\n * @event Hooks#afterMergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {Object} mergeParent The parent collection of the provided cell range.\n * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'afterMergeCells',\n\n/**\n * Fired before unmerging the cells.\n *\n * @event Hooks#beforeUnmergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'beforeUnmergeCells',\n\n/**\n * Fired after unmerging the cells.\n *\n * @event Hooks#beforeUnmergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'afterUnmergeCells',\n\n/**\n * Fired after the listening is turned on.\n *\n * @event Hooks#afterListen\n * @since 0.34.5\n */\n'afterListen',\n\n/**\n * Fired after the listening is turned off.\n *\n * @event Hooks#afterUnlisten\n * @since 0.34.5\n */\n'afterUnlisten'];\n\nvar Hooks = function () {\n  _createClass(Hooks, null, [{\n    key: 'getSingleton',\n    value: function getSingleton() {\n      return globalSingleton;\n    }\n\n    /**\n     *\n     */\n\n  }]);\n\n  function Hooks() {\n    _classCallCheck(this, Hooks);\n\n    this.globalBucket = this.createEmptyBucket();\n  }\n\n  /**\n   * Returns a new object with empty handlers related to every registered hook name.\n   *\n   * @returns {Object} The empty bucket object.\n   *\n   * @example\n   * ```js\n   * Handsontable.hooks.createEmptyBucket();\n   * // Results:\n   * {\n   * ...\n   * afterCreateCol: [],\n   * afterCreateRow: [],\n   * beforeInit: [],\n   * ...\n   * }\n   * ```\n   */\n\n\n  _createClass(Hooks, [{\n    key: 'createEmptyBucket',\n    value: function createEmptyBucket() {\n      var bucket = Object.create(null);\n\n      // eslint-disable-next-line no-return-assign\n      (0, _array.arrayEach)(REGISTERED_HOOKS, function (hook) {\n        return bucket[hook] = [];\n      });\n\n      return bucket;\n    }\n\n    /**\n     * Get hook bucket based on the context of the object or if argument is `undefined`, get the global hook bucket.\n     *\n     * @param {Object} [context=null] A Handsontable instance.\n     * @returns {Object} Returns a global or Handsontable instance bucket.\n     */\n\n  }, {\n    key: 'getBucket',\n    value: function getBucket() {\n      var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      if (context) {\n        if (!context.pluginHookBucket) {\n          context.pluginHookBucket = this.createEmptyBucket();\n        }\n\n        return context.pluginHookBucket;\n      }\n\n      return this.globalBucket;\n    }\n\n    /**\n     * Adds a listener (globally or locally) to a specified hook name.\n     * If the `context` parameter is provided, the hook will be added only to the instance it references.\n     * Otherwise, the callback will be used everytime the hook fires on any Handsontable instance.\n     * You can provide an array of callback functions as the `callback` argument, this way they will all be fired\n     * once the hook is triggered.\n     *\n     * @see Core#addHook\n     * @param {String} key Hook name.\n     * @param {Function|Array} callback Callback function or an array of functions.\n     * @param {Object} [context=null] The context for the hook callback to be added - a Handsontable instance or leave empty.\n     * @returns {Hooks} Instance of Hooks.\n     *\n     * @example\n     * ```js\n     * // single callback, added locally\n     * Handsontable.hooks.add('beforeInit', myCallback, hotInstance);\n     *\n     * // single callback, added globally\n     * Handsontable.hooks.add('beforeInit', myCallback);\n     *\n     * // multiple callbacks, added locally\n     * Handsontable.hooks.add('beforeInit', [myCallback, anotherCallback], hotInstance);\n     *\n     * // multiple callbacks, added globally\n     * Handsontable.hooks.add('beforeInit', [myCallback, anotherCallback]);\n     * ```\n     */\n\n  }, {\n    key: 'add',\n    value: function add(key, callback) {\n      var _this = this;\n\n      var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n      if (Array.isArray(callback)) {\n        (0, _array.arrayEach)(callback, function (c) {\n          return _this.add(key, c, context);\n        });\n      } else {\n        var bucket = this.getBucket(context);\n\n        if (typeof bucket[key] === 'undefined') {\n          this.register(key);\n          bucket[key] = [];\n        }\n        callback.skip = false;\n\n        if (bucket[key].indexOf(callback) === -1) {\n          // only add a hook if it has not already been added (adding the same hook twice is now silently ignored)\n          var foundInitialHook = false;\n\n          if (callback.initialHook) {\n            (0, _array.arrayEach)(bucket[key], function (cb, i) {\n              if (cb.initialHook) {\n                bucket[key][i] = callback;\n                foundInitialHook = true;\n\n                return false;\n              }\n            });\n          }\n\n          if (!foundInitialHook) {\n            bucket[key].push(callback);\n          }\n        }\n      }\n\n      return this;\n    }\n\n    /**\n     * Adds a listener to a specified hook. After the hook runs this listener will be automatically removed from the bucket.\n     *\n     * @see Core#addHookOnce\n     * @param {String} key Hook/Event name.\n     * @param {Function|Array} callback Callback function.\n     * @param {Object} [context=null] A Handsontable instance.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.once('beforeInit', myCallback, hotInstance);\n     * ```\n     */\n\n  }, {\n    key: 'once',\n    value: function once(key, callback) {\n      var _this2 = this;\n\n      var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n      if (Array.isArray(callback)) {\n        (0, _array.arrayEach)(callback, function (c) {\n          return _this2.once(key, c, context);\n        });\n      } else {\n        callback.runOnce = true;\n        this.add(key, callback, context);\n      }\n    }\n\n    /**\n     * Removes a listener from a hook with a given name. If the `context` argument is provided, it removes a listener from a local hook assigned to the given Handsontable instance.\n     *\n     * @see Core#removeHook\n     * @param {String} key Hook/Event name.\n     * @param {Function} callback Callback function (needs the be the function that was previously added to the hook).\n     * @param {Object} [context=null] Handsontable instance.\n     * @return {Boolean} Returns `true` if hook was removed, `false` otherwise.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.remove('beforeInit', myCallback);\n     * ```\n     */\n\n  }, {\n    key: 'remove',\n    value: function remove(key, callback) {\n      var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n      var bucket = this.getBucket(context);\n\n      if (typeof bucket[key] !== 'undefined') {\n        if (bucket[key].indexOf(callback) >= 0) {\n          callback.skip = true;\n\n          return true;\n        }\n      }\n\n      return false;\n    }\n\n    /**\n     * Checks whether there are any registered listeners for the provided hook name.\n     * If the `context` parameter is provided, it only checks for listeners assigned to the given Handsontable instance.\n     *\n     * @param {String} key Hook name.\n     * @param {Object} [context=null] A Handsontable instance.\n     * @returns {Boolean} `true` for success, `false` otherwise.\n     */\n\n  }, {\n    key: 'has',\n    value: function has(key) {\n      var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n      var bucket = this.getBucket(context);\n\n      return !!(bucket[key] !== void 0 && bucket[key].length);\n    }\n\n    /**\n     * Runs all local and global callbacks assigned to the hook identified by the `key` parameter.\n     * It returns either a return value from the last called callback or the first parameter (`p1`) passed to the `run` function.\n     *\n     * @see Core#runHooks\n     * @param {Object} context Handsontable instance.\n     * @param {String} key Hook/Event name.\n     * @param {*} [p1] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p2] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p3] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p4] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p5] Parameter to be passed as an argument to the callback function.\n     * @param {*} [p6] Parameter to be passed as an argument to the callback function.\n     * @returns {*} Either a return value from the last called callback or `p1`.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.run(hot, 'beforeInit');\n     * ```\n     */\n\n  }, {\n    key: 'run',\n    value: function run(context, key, p1, p2, p3, p4, p5, p6) {\n      {\n        var globalHandlers = this.globalBucket[key];\n        var index = -1;\n        var length = globalHandlers ? globalHandlers.length : 0;\n\n        if (length) {\n          // Do not optimise this loop with arrayEach or arrow function! If you do You'll decrease perf because of GC.\n          while (++index < length) {\n            if (!globalHandlers[index] || globalHandlers[index].skip) {\n              /* eslint-disable no-continue */\n              continue;\n            }\n            // performance considerations - http://jsperf.com/call-vs-apply-for-a-plugin-architecture\n            var res = globalHandlers[index].call(context, p1, p2, p3, p4, p5, p6);\n\n            if (res !== void 0) {\n              p1 = res;\n            }\n            if (globalHandlers[index] && globalHandlers[index].runOnce) {\n              this.remove(key, globalHandlers[index]);\n            }\n          }\n        }\n      }\n      {\n        var localHandlers = this.getBucket(context)[key];\n        var _index = -1;\n        var _length = localHandlers ? localHandlers.length : 0;\n\n        if (_length) {\n          // Do not optimise this loop with arrayEach or arrow function! If you do You'll decrease perf because of GC.\n          while (++_index < _length) {\n            if (!localHandlers[_index] || localHandlers[_index].skip) {\n              /* eslint-disable no-continue */\n              continue;\n            }\n            // performance considerations - http://jsperf.com/call-vs-apply-for-a-plugin-architecture\n            var _res = localHandlers[_index].call(context, p1, p2, p3, p4, p5, p6);\n\n            if (_res !== void 0) {\n              p1 = _res;\n            }\n            if (localHandlers[_index] && localHandlers[_index].runOnce) {\n              this.remove(key, localHandlers[_index], context);\n            }\n          }\n        }\n      }\n\n      return p1;\n    }\n\n    /**\n     * Destroy all listeners connected to the context. If no context is provided, the global listeners will be destroyed.\n     *\n     * @param {Object} [context=null] A Handsontable instance.\n     * @example\n     * ```js\n     * // destroy the global listeners\n     * Handsontable.hooks.destroy();\n     *\n     * // destroy the local listeners\n     * Handsontable.hooks.destroy(hotInstance);\n     * ```\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      // eslint-disable-next-line no-return-assign\n      (0, _object.objectEach)(this.getBucket(context), function (value, key, bucket) {\n        return bucket[key].length = 0;\n      });\n    }\n\n    /**\n     * Registers a hook name (adds it to the list of the known hook names). Used by plugins.\n     * It is not necessary to call register, but if you use it, your plugin hook will be used returned by\n     * the `getRegistered` method. (which itself is used in the demo http://docs.handsontable.com/tutorial-callbacks.html).\n     *\n     * @param key {String} The hook name.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.register('myHook');\n     * ```\n     */\n\n  }, {\n    key: 'register',\n    value: function register(key) {\n      if (!this.isRegistered(key)) {\n        REGISTERED_HOOKS.push(key);\n      }\n    }\n\n    /**\n     * Deregisters a hook name (removes it from the list of known hook names).\n     *\n     * @param key {String} Hook name.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.deregister('myHook');\n     * ```\n     */\n\n  }, {\n    key: 'deregister',\n    value: function deregister(key) {\n      if (this.isRegistered(key)) {\n        REGISTERED_HOOKS.splice(REGISTERED_HOOKS.indexOf(key), 1);\n      }\n    }\n\n    /**\n     * Returns a boolean depending on if a hook by such name has been registered.\n     *\n     * @param key {String} Hook name.\n     * @returns {Boolean} `true` for success, `false` otherwise.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.isRegistered('beforeInit');\n     *\n     * // Results:\n     * true\n     * ```\n     */\n\n  }, {\n    key: 'isRegistered',\n    value: function isRegistered(key) {\n      return REGISTERED_HOOKS.indexOf(key) >= 0;\n    }\n\n    /**\n     * Returns an array of registered hooks.\n     *\n     * @returns {Array} An array of registered hooks.\n     *\n     * @example\n     * ```js\n     * Handsontable.hooks.getRegistered();\n     *\n     * // Results:\n     * [\n     * ...\n     *   'beforeInit',\n     *   'beforeRender',\n     *   'beforeSetRangeEnd',\n     *   'beforeDrawBorders',\n     *   'beforeChange',\n     * ...\n     * ]\n     * ```\n     */\n\n  }, {\n    key: 'getRegistered',\n    value: function getRegistered() {\n      return REGISTERED_HOOKS;\n    }\n  }]);\n\n  return Hooks;\n}();\n\nvar globalSingleton = new Hooks();\n\nexports.default = Hooks;\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _templateObject = _taggedTemplateLiteral(['\\n          Your license key of Handsontable Pro has expired.\\u200C\\u200C\\u200C\\u200C \\n          Renew your maintenance plan at https://handsontable.com or downgrade to the previous version of the software.\\n          '], ['\\n          Your license key of Handsontable Pro has expired.\\u200C\\u200C\\u200C\\u200C\\\\x20\\n          Renew your maintenance plan at https://handsontable.com or downgrade to the previous version of the software.\\n          ']);\n\nexports.stringify = stringify;\nexports.isDefined = isDefined;\nexports.isUndefined = isUndefined;\nexports.isEmpty = isEmpty;\nexports.isRegExp = isRegExp;\nexports._injectProductInfo = _injectProductInfo;\n\nvar _moment = __webpack_require__(55);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _templateLiteralTag = __webpack_require__(41);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\n/**\n * Converts any value to string.\n *\n * @param {*} value\n * @returns {String}\n */\nfunction stringify(value) {\n  var result = void 0;\n\n  switch (typeof value === 'undefined' ? 'undefined' : _typeof(value)) {\n    case 'string':\n    case 'number':\n      result = '' + value;\n      break;\n\n    case 'object':\n      result = value === null ? '' : value.toString();\n      break;\n    case 'undefined':\n      result = '';\n      break;\n    default:\n      result = value.toString();\n      break;\n  }\n\n  return result;\n}\n\n/**\n * Checks if given variable is defined.\n *\n * @param {*} variable Variable to check.\n * @returns {Boolean}\n */\nfunction isDefined(variable) {\n  return typeof variable !== 'undefined';\n}\n\n/**\n * Checks if given variable is undefined.\n *\n * @param {*} variable Variable to check.\n * @returns {Boolean}\n */\nfunction isUndefined(variable) {\n  return typeof variable === 'undefined';\n}\n\n/**\n * Check if given variable is null, empty string or undefined.\n *\n * @param {*} variable Variable to check.\n * @returns {Boolean}\n */\nfunction isEmpty(variable) {\n  return variable === null || variable === '' || isUndefined(variable);\n}\n\n/**\n * Check if given variable is a regular expression.\n *\n * @param {*} variable Variable to check.\n * @returns {Boolean}\n */\nfunction isRegExp(variable) {\n  return Object.prototype.toString.call(variable) === '[object RegExp]';\n}\n\n/* eslint-disable */\nvar _m = '\\x6C\\x65\\x6E\\x67\\x74\\x68';\nvar _hd = function _hd(v) {\n  return parseInt(v, 16);\n};\nvar _pi = function _pi(v) {\n  return parseInt(v, 10);\n};\nvar _ss = function _ss(v, s, l) {\n  return v['\\x73\\x75\\x62\\x73\\x74\\x72'](s, l);\n};\nvar _cp = function _cp(v) {\n  return v['\\x63\\x6F\\x64\\x65\\x50\\x6F\\x69\\x6E\\x74\\x41\\x74'](0) - 65;\n};\nvar _norm = function _norm(v) {\n  return ('' + v).replace(/\\-/g, '');\n};\nvar _extractTime = function _extractTime(v) {\n  return _hd(_ss(_norm(v), _hd('12'), _cp('\\x46'))) / (_hd(_ss(_norm(v), _cp('\\x42'), ~~![][_m])) || 9);\n};\nvar _ignored = function _ignored() {\n  return typeof location !== 'undefined' && /^([a-z0-9\\-]+\\.)?\\x68\\x61\\x6E\\x64\\x73\\x6F\\x6E\\x74\\x61\\x62\\x6C\\x65\\x2E\\x63\\x6F\\x6D$/i.test(location.host);\n};\nvar _notified = false;\n\nfunction _injectProductInfo(key, element) {\n  key = _norm(key || '');\n\n  var warningMessage = '';\n  var showDomMessage = true;\n  var schemaValidity = _checkKeySchema(key);\n  var ignored = _ignored();\n  var trial = isEmpty(key) || key === 'trial';\n\n  if (trial || schemaValidity) {\n    if (schemaValidity) {\n      var releaseTime = Math.floor((0, _moment2.default)('11/04/2018', 'DD/MM/YYYY').toDate().getTime() / 8.64e7);\n      var keyGenTime = _extractTime(key);\n\n      if (keyGenTime > 45000 || keyGenTime !== parseInt(keyGenTime, 10)) {\n        warningMessage = 'The license key provided to Handsontable Pro is invalid. Make sure you pass it correctly.';\n      }\n\n      if (!warningMessage) {\n        if (releaseTime > keyGenTime + 1) {\n          warningMessage = (0, _templateLiteralTag.toSingleLine)(_templateObject);\n        }\n        showDomMessage = releaseTime > keyGenTime + 15;\n      }\n    } else {\n      warningMessage = 'Evaluation version of Handsontable Pro. Not licensed for use in a production environment.';\n    }\n  } else {\n    warningMessage = 'The license key provided to Handsontable Pro is invalid. Make sure you pass it correctly.';\n  }\n  if (ignored) {\n    warningMessage = false;\n    showDomMessage = false;\n  }\n\n  if (warningMessage && !_notified) {\n    console[trial ? 'info' : 'warn'](warningMessage);\n    _notified = true;\n  }\n  if (showDomMessage && element.parentNode) {\n    var message = document.createElement('div');\n\n    message.id = 'hot-display-license-info';\n    message.appendChild(document.createTextNode('Evaluation version of Handsontable Pro.'));\n    message.appendChild(document.createElement('br'));\n    message.appendChild(document.createTextNode('Not licensed for production use.'));\n\n    element.parentNode.insertBefore(message, element.nextSibling);\n  }\n}\n\nfunction _checkKeySchema(v) {\n  var z = [][_m];\n  var p = z;\n\n  if (v[_m] !== _cp('\\x5A')) {\n    return false;\n  }\n\n  for (var c = '', i = '\\x42\\x3C\\x48\\x34\\x50\\x2B'.split(''), j = _cp(i.shift()); j; j = _cp(i.shift() || 'A')) {\n    --j < ''[_m] ? p = p | (_pi('' + _pi(_hd(c) + (_hd(_ss(v, Math.abs(j), 2)) + []).padStart(2, '0'))) % 97 || 2) >> 1 : c = _ss(v, j, !j ? 6 : i[_m] === 1 ? 9 : 8);\n  }\n\n  return p === z;\n}\n/* eslint-enable */\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getRegisteredEditors = exports.getRegisteredEditorNames = exports.hasEditor = exports.getEditorInstance = exports.getEditor = exports.registerEditor = undefined;\nexports.RegisteredEditor = RegisteredEditor;\nexports._getEditorInstance = _getEditorInstance;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _baseEditor = __webpack_require__(53);\n\nvar _baseEditor2 = _interopRequireDefault(_baseEditor);\n\nvar _autocompleteEditor = __webpack_require__(188);\n\nvar _autocompleteEditor2 = _interopRequireDefault(_autocompleteEditor);\n\nvar _checkboxEditor = __webpack_require__(234);\n\nvar _checkboxEditor2 = _interopRequireDefault(_checkboxEditor);\n\nvar _dateEditor = __webpack_require__(235);\n\nvar _dateEditor2 = _interopRequireDefault(_dateEditor);\n\nvar _dropdownEditor = __webpack_require__(238);\n\nvar _dropdownEditor2 = _interopRequireDefault(_dropdownEditor);\n\nvar _handsontableEditor = __webpack_require__(189);\n\nvar _handsontableEditor2 = _interopRequireDefault(_handsontableEditor);\n\nvar _numericEditor = __webpack_require__(239);\n\nvar _numericEditor2 = _interopRequireDefault(_numericEditor);\n\nvar _passwordEditor = __webpack_require__(240);\n\nvar _passwordEditor2 = _interopRequireDefault(_passwordEditor);\n\nvar _selectEditor = __webpack_require__(241);\n\nvar _selectEditor2 = _interopRequireDefault(_selectEditor);\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Utility to register editors and common namespace for keeping reference to all editor classes\n */\nvar registeredEditorClasses = new WeakMap();\n\nvar _staticRegister = (0, _staticRegister3.default)('editors'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem,\n    hasItem = _staticRegister.hasItem,\n    getNames = _staticRegister.getNames,\n    getValues = _staticRegister.getValues;\n\n_register('base', _baseEditor2.default);\n_register('autocomplete', _autocompleteEditor2.default);\n_register('checkbox', _checkboxEditor2.default);\n_register('date', _dateEditor2.default);\n_register('dropdown', _dropdownEditor2.default);\n_register('handsontable', _handsontableEditor2.default);\n_register('numeric', _numericEditor2.default);\n_register('password', _passwordEditor2.default);\n_register('select', _selectEditor2.default);\n_register('text', _textEditor2.default);\n\nfunction RegisteredEditor(editorClass) {\n  var instances = {};\n  var Clazz = editorClass;\n\n  this.getConstructor = function () {\n    return editorClass;\n  };\n\n  this.getInstance = function (hotInstance) {\n    if (!(hotInstance.guid in instances)) {\n      instances[hotInstance.guid] = new Clazz(hotInstance);\n    }\n\n    return instances[hotInstance.guid];\n  };\n\n  _pluginHooks2.default.getSingleton().add('afterDestroy', function () {\n    instances = {};\n  });\n}\n\n/**\n * Returns instance (singleton) of editor class.\n *\n * @param {String} name Name of an editor under which it has been stored.\n * @param {Object} hotInstance Instance of Handsontable.\n * @returns {Function} Returns instance of editor.\n */\nfunction _getEditorInstance(name, hotInstance) {\n  var editor = void 0;\n\n  if (typeof name === 'function') {\n    if (!registeredEditorClasses.get(name)) {\n      _register(null, name);\n    }\n    editor = registeredEditorClasses.get(name);\n  } else if (typeof name === 'string') {\n    editor = getItem(name);\n  } else {\n    throw Error('Only strings and functions can be passed as \"editor\" parameter');\n  }\n\n  if (!editor) {\n    throw Error('No editor registered under name \"' + name + '\"');\n  }\n\n  return editor.getInstance(hotInstance);\n}\n\n/**\n * Retrieve editor class.\n *\n * @param {String} name Editor identification.\n * @returns {Function} Returns editor class.\n */\nfunction _getItem(name) {\n  if (!hasItem(name)) {\n    throw Error('No registered editor found under \"' + name + '\" name');\n  }\n\n  return getItem(name).getConstructor();\n}\n\n/**\n * Register editor class under specified name.\n *\n * @param {String} name Editor identification.\n * @param {Function} editorClass Editor class.\n */\nfunction _register(name, editorClass) {\n  var editorWrapper = new RegisteredEditor(editorClass);\n\n  if (typeof name === 'string') {\n    register(name, editorWrapper);\n  }\n  registeredEditorClasses.set(editorClass, editorWrapper);\n}\n\nexports.registerEditor = _register;\nexports.getEditor = _getItem;\nexports.getEditorInstance = _getEditorInstance;\nexports.hasEditor = hasItem;\nexports.getRegisteredEditorNames = getNames;\nexports.getRegisteredEditors = getValues;\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.normalizeSelection = normalizeSelection;\nexports.isSeparator = isSeparator;\nexports.hasSubMenu = hasSubMenu;\nexports.isDisabled = isDisabled;\nexports.isSelectionDisabled = isSelectionDisabled;\nexports.getValidSelection = getValidSelection;\nexports.prepareVerticalAlignClass = prepareVerticalAlignClass;\nexports.prepareHorizontalAlignClass = prepareHorizontalAlignClass;\nexports.getAlignmentClasses = getAlignmentClasses;\nexports.align = align;\nexports.checkSelectionConsistency = checkSelectionConsistency;\nexports.markLabelAsSelected = markLabelAsSelected;\nexports.isItemHidden = isItemHidden;\nexports.filterSeparators = filterSeparators;\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _element = __webpack_require__(0);\n\nvar _separator = __webpack_require__(93);\n\nfunction normalizeSelection(selRanges) {\n  return (0, _array.arrayMap)(selRanges, function (range) {\n    return {\n      start: range.getTopLeftCorner(),\n      end: range.getBottomRightCorner()\n    };\n  });\n}\n\nfunction isSeparator(cell) {\n  return (0, _element.hasClass)(cell, 'htSeparator');\n}\n\nfunction hasSubMenu(cell) {\n  return (0, _element.hasClass)(cell, 'htSubmenu');\n}\n\nfunction isDisabled(cell) {\n  return (0, _element.hasClass)(cell, 'htDisabled');\n}\n\nfunction isSelectionDisabled(cell) {\n  return (0, _element.hasClass)(cell, 'htSelectionDisabled');\n}\n\nfunction getValidSelection(hot) {\n  var selected = hot.getSelected();\n\n  if (!selected) {\n    return null;\n  }\n  if (selected[0] < 0) {\n    return null;\n  }\n\n  return selected;\n}\n\nfunction prepareVerticalAlignClass(className, alignment) {\n  if (className.indexOf(alignment) != -1) {\n    return className;\n  }\n  className = className.replace('htTop', '').replace('htMiddle', '').replace('htBottom', '').replace('  ', '');\n\n  className += ' ' + alignment;\n\n  return className;\n}\n\nfunction prepareHorizontalAlignClass(className, alignment) {\n  if (className.indexOf(alignment) != -1) {\n    return className;\n  }\n  className = className.replace('htLeft', '').replace('htCenter', '').replace('htRight', '').replace('htJustify', '').replace('  ', '');\n\n  className += ' ' + alignment;\n\n  return className;\n}\n\nfunction getAlignmentClasses(ranges, callback) {\n  var classes = {};\n\n  (0, _array.arrayEach)(ranges, function (_ref) {\n    var from = _ref.from,\n        to = _ref.to;\n\n    for (var row = from.row; row <= to.row; row++) {\n      for (var col = from.col; col <= to.col; col++) {\n        if (!classes[row]) {\n          classes[row] = [];\n        }\n        classes[row][col] = callback(row, col);\n      }\n    }\n  });\n\n  return classes;\n}\n\nfunction align(ranges, type, alignment, cellDescriptor, propertySetter) {\n  (0, _array.arrayEach)(ranges, function (_ref2) {\n    var from = _ref2.from,\n        to = _ref2.to;\n\n    if (from.row == to.row && from.col == to.col) {\n      applyAlignClassName(from.row, from.col, type, alignment, cellDescriptor, propertySetter);\n    } else {\n      for (var row = from.row; row <= to.row; row++) {\n        for (var col = from.col; col <= to.col; col++) {\n          applyAlignClassName(row, col, type, alignment, cellDescriptor, propertySetter);\n        }\n      }\n    }\n  });\n}\n\nfunction applyAlignClassName(row, col, type, alignment, cellDescriptor, propertySetter) {\n  var cellMeta = cellDescriptor(row, col);\n  var className = alignment;\n\n  if (cellMeta.className) {\n    if (type === 'vertical') {\n      className = prepareVerticalAlignClass(cellMeta.className, alignment);\n    } else {\n      className = prepareHorizontalAlignClass(cellMeta.className, alignment);\n    }\n  }\n\n  propertySetter(row, col, 'className', className);\n}\n\nfunction checkSelectionConsistency(ranges, comparator) {\n  var result = false;\n\n  if (Array.isArray(ranges)) {\n    (0, _array.arrayEach)(ranges, function (range) {\n      range.forAll(function (row, col) {\n        if (comparator(row, col)) {\n          result = true;\n\n          return false;\n        }\n      });\n\n      return result;\n    });\n  }\n\n  return result;\n}\n\nfunction markLabelAsSelected(label) {\n  // workaround for https://github.com/handsontable/handsontable/issues/1946\n  return '<span class=\"selected\">' + String.fromCharCode(10003) + '</span>' + label;\n}\n\nfunction isItemHidden(item, instance) {\n  return !item.hidden || !(typeof item.hidden == 'function' && item.hidden.call(instance));\n}\n\nfunction shiftSeparators(items, separator) {\n  var result = items.slice(0);\n\n  for (var i = 0; i < result.length;) {\n    if (result[i].name === separator) {\n      result.shift();\n    } else {\n      break;\n    }\n  }\n  return result;\n}\n\nfunction popSeparators(items, separator) {\n  var result = items.slice(0);\n\n  result.reverse();\n  result = shiftSeparators(result, separator);\n  result.reverse();\n\n  return result;\n}\n\nfunction removeDuplicatedSeparators(items) {\n  var result = [];\n\n  (0, _array.arrayEach)(items, function (value, index) {\n    if (index > 0) {\n      if (result[result.length - 1].name !== value.name) {\n        result.push(value);\n      }\n    } else {\n      result.push(value);\n    }\n  });\n\n  return result;\n}\n\nfunction filterSeparators(items) {\n  var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _separator.KEY;\n\n  var result = items.slice(0);\n\n  result = shiftSeparators(result, separator);\n  result = popSeparators(result, separator);\n  result = removeDuplicatedSeparators(result);\n\n  return result;\n}\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(18);\nvar IE8_DOM_DEFINE = __webpack_require__(98);\nvar toPrimitive = __webpack_require__(73);\nvar dP = Object.defineProperty;\n\nexports.f = __webpack_require__(22) ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return dP(O, P, Attributes);\n  } catch (e) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY_CODES = undefined;\nexports.isPrintableChar = isPrintableChar;\nexports.isMetaKey = isMetaKey;\nexports.isCtrlKey = isCtrlKey;\nexports.isCtrlMetaKey = isCtrlMetaKey;\nexports.isKey = isKey;\n\nvar _array = __webpack_require__(1);\n\nvar KEY_CODES = exports.KEY_CODES = {\n  MOUSE_LEFT: 1,\n  MOUSE_RIGHT: 3,\n  MOUSE_MIDDLE: 2,\n  BACKSPACE: 8,\n  COMMA: 188,\n  INSERT: 45,\n  DELETE: 46,\n  END: 35,\n  ENTER: 13,\n  ESCAPE: 27,\n  CONTROL: 17,\n  COMMAND_LEFT: 91,\n  COMMAND_RIGHT: 93,\n  COMMAND_FIREFOX: 224,\n  ALT: 18,\n  HOME: 36,\n  PAGE_DOWN: 34,\n  PAGE_UP: 33,\n  PERIOD: 190,\n  SPACE: 32,\n  SHIFT: 16,\n  CAPS_LOCK: 20,\n  TAB: 9,\n  ARROW_RIGHT: 39,\n  ARROW_LEFT: 37,\n  ARROW_UP: 38,\n  ARROW_DOWN: 40,\n  F1: 112,\n  F2: 113,\n  F3: 114,\n  F4: 115,\n  F5: 116,\n  F6: 117,\n  F7: 118,\n  F8: 119,\n  F9: 120,\n  F10: 121,\n  F11: 122,\n  F12: 123,\n  A: 65,\n  X: 88,\n  C: 67,\n  V: 86\n};\n\n/**\n * Returns true if keyCode represents a printable character.\n *\n * @param {Number} keyCode\n * @returns {Boolean}\n */\nfunction isPrintableChar(keyCode) {\n  return keyCode == 32 || // space\n  keyCode >= 48 && keyCode <= 57 || // 0-9\n  keyCode >= 96 && keyCode <= 111 || // numpad\n  keyCode >= 186 && keyCode <= 192 || // ;=,-./`\n  keyCode >= 219 && keyCode <= 222 || // []{}\\|\"'\n  keyCode >= 226 || // special chars (229 for Asian chars)\n  keyCode >= 65 && keyCode <= 90; // a-z\n}\n\n/**\n * @param {Number} keyCode\n * @returns {Boolean}\n */\nfunction isMetaKey(keyCode) {\n  var metaKeys = [KEY_CODES.ARROW_DOWN, KEY_CODES.ARROW_UP, KEY_CODES.ARROW_LEFT, KEY_CODES.ARROW_RIGHT, KEY_CODES.HOME, KEY_CODES.END, KEY_CODES.DELETE, KEY_CODES.BACKSPACE, KEY_CODES.F1, KEY_CODES.F2, KEY_CODES.F3, KEY_CODES.F4, KEY_CODES.F5, KEY_CODES.F6, KEY_CODES.F7, KEY_CODES.F8, KEY_CODES.F9, KEY_CODES.F10, KEY_CODES.F11, KEY_CODES.F12, KEY_CODES.TAB, KEY_CODES.PAGE_DOWN, KEY_CODES.PAGE_UP, KEY_CODES.ENTER, KEY_CODES.ESCAPE, KEY_CODES.SHIFT, KEY_CODES.CAPS_LOCK, KEY_CODES.ALT];\n\n  return metaKeys.indexOf(keyCode) !== -1;\n}\n\n/**\n * Checks if passed key code is ctrl or cmd key. Depends on what OS the code runs it check key code based on\n * different meta key codes.\n *\n * @param {Number} keyCode Key code to check.\n * @returns {Boolean}\n */\nfunction isCtrlKey(keyCode) {\n  var keys = [];\n\n  if (window.navigator.platform.includes('Mac')) {\n    keys.push(KEY_CODES.COMMAND_LEFT, KEY_CODES.COMMAND_RIGHT, KEY_CODES.COMMAND_FIREFOX);\n  } else {\n    keys.push(KEY_CODES.CONTROL);\n  }\n\n  return keys.includes(keyCode);\n}\n\n/**\n * Checks if passed key code is ctrl or cmd key. This helper checks if the key code matches to meta keys\n * regardless of the OS on which it is running.\n *\n * @param {Number} keyCode Key code to check.\n * @returns {Boolean}\n */\nfunction isCtrlMetaKey(keyCode) {\n  return [KEY_CODES.CONTROL, KEY_CODES.COMMAND_LEFT, KEY_CODES.COMMAND_RIGHT, KEY_CODES.COMMAND_FIREFOX].includes(keyCode);\n}\n\n/**\n * @param {Number} keyCode\n * @param {String} baseCode\n * @returns {Boolean}\n */\nfunction isKey(keyCode, baseCode) {\n  var keys = baseCode.split('|');\n  var result = false;\n\n  (0, _array.arrayEach)(keys, function (key) {\n    if (keyCode === KEY_CODES[key]) {\n      result = true;\n\n      return false;\n    }\n  });\n\n  return result;\n}\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(23)(function () {\n  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(75);\nvar defined = __webpack_require__(38);\nmodule.exports = function (it) {\n  return IObject(defined(it));\n};\n\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.15 ToLength\nvar toInteger = __webpack_require__(59);\nvar min = Math.min;\nmodule.exports = function (it) {\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// most Object methods by ES6 should accept primitives\nvar $export = __webpack_require__(3);\nvar core = __webpack_require__(44);\nvar fails = __webpack_require__(23);\nmodule.exports = function (KEY, exec) {\n  var fn = (core.Object || {})[KEY] || Object[KEY];\n  var exp = {};\n  exp[KEY] = exec(fn);\n  $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.isIE8 = isIE8;\nexports.isIE9 = isIE9;\nexports.isSafari = isSafari;\nexports.isChrome = isChrome;\nexports.isMobileBrowser = isMobileBrowser;\nvar _isIE8 = !document.createTextNode('test').textContent;\n\nfunction isIE8() {\n  return _isIE8;\n}\n\nvar _isIE9 = !!document.documentMode;\n\nfunction isIE9() {\n  return _isIE9;\n}\n\nvar _isSafari = /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);\n\nfunction isSafari() {\n  return _isSafari;\n}\n\nvar _isChrome = /Chrome/.test(navigator.userAgent) && /Google/.test(navigator.vendor);\n\nfunction isChrome() {\n  return _isChrome;\n}\n\nfunction isMobileBrowser(userAgent) {\n  if (!userAgent) {\n    userAgent = navigator.userAgent;\n  }\n\n  return (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent)\n  );\n}\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getRegisteredValidators = exports.getRegisteredValidatorNames = exports.hasValidator = exports.getValidator = exports.registerValidator = undefined;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _autocompleteValidator = __webpack_require__(250);\n\nvar _autocompleteValidator2 = _interopRequireDefault(_autocompleteValidator);\n\nvar _dateValidator = __webpack_require__(251);\n\nvar _dateValidator2 = _interopRequireDefault(_dateValidator);\n\nvar _numericValidator = __webpack_require__(252);\n\nvar _numericValidator2 = _interopRequireDefault(_numericValidator);\n\nvar _timeValidator = __webpack_require__(253);\n\nvar _timeValidator2 = _interopRequireDefault(_timeValidator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _staticRegister = (0, _staticRegister3.default)('validators'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem,\n    hasItem = _staticRegister.hasItem,\n    getNames = _staticRegister.getNames,\n    getValues = _staticRegister.getValues;\n\nregister('autocomplete', _autocompleteValidator2.default);\nregister('date', _dateValidator2.default);\nregister('numeric', _numericValidator2.default);\nregister('time', _timeValidator2.default);\n\n/**\n * Retrieve validator function.\n *\n * @param {String} name Validator identification.\n * @returns {Function} Returns validator function.\n */\nfunction _getItem(name) {\n  if (typeof name === 'function') {\n    return name;\n  }\n  if (!hasItem(name)) {\n    throw Error('No registered validator found under \"' + name + '\" name');\n  }\n\n  return getItem(name);\n}\n\nexports.registerValidator = register;\nexports.getValidator = _getItem;\nexports.hasValidator = hasItem;\nexports.getRegisteredValidatorNames = getNames;\nexports.getRegisteredValidators = getValues;\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports) {\n\nvar hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar hide = __webpack_require__(31);\nvar has = __webpack_require__(29);\nvar SRC = __webpack_require__(48)('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\n__webpack_require__(44).inspectSource = function (it) {\n  return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n  var isFunction = typeof val == 'function';\n  if (isFunction) has(val, 'name') || hide(val, 'name', key);\n  if (O[key] === val) return;\n  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n  if (O === global) {\n    O[key] = val;\n  } else if (!safe) {\n    delete O[key];\n    hide(O, key, val);\n  } else if (O[key]) {\n    O[key] = val;\n  } else {\n    hide(O, key, val);\n  }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n  return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(20);\nvar createDesc = __webpack_require__(49);\nmodule.exports = __webpack_require__(22) ? function (object, key, value) {\n  return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// optional / simple context binding\nvar aFunction = __webpack_require__(62);\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n  switch (length) {\n    case 1: return function (a) {\n      return fn.call(that, a);\n    };\n    case 2: return function (a, b) {\n      return fn.call(that, a, b);\n    };\n    case 3: return function (a, b, c) {\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(38);\nmodule.exports = function (it) {\n  return Object(defined(it));\n};\n\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar META = __webpack_require__(48)('meta');\nvar isObject = __webpack_require__(9);\nvar has = __webpack_require__(29);\nvar setDesc = __webpack_require__(20).f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n  return true;\n};\nvar FREEZE = !__webpack_require__(23)(function () {\n  return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n  setDesc(it, META, { value: {\n    i: 'O' + ++id, // object ID\n    w: {}          // weak collections IDs\n  } });\n};\nvar fastKey = function (it, create) {\n  // return primitive with prefix\n  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return 'F';\n    // not necessary to add metadata\n    if (!create) return 'E';\n    // add missing metadata\n    setMeta(it);\n  // return object ID\n  } return it[META].i;\n};\nvar getWeak = function (it, create) {\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return true;\n    // not necessary to add metadata\n    if (!create) return false;\n    // add missing metadata\n    setMeta(it);\n  // return hash weak collections IDs\n  } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n  return it;\n};\nvar meta = module.exports = {\n  KEY: META,\n  NEED: false,\n  fastKey: fastKey,\n  getWeak: getWeak,\n  onFreeze: onFreeze\n};\n\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _core = __webpack_require__(179);\n\nvar _core2 = _interopRequireDefault(_core);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar registeredOverlays = {};\n\n/**\n * Creates an overlay over the original Walkontable instance. The overlay renders the clone of the original Walkontable\n * and (optionally) implements behavior needed for native horizontal and vertical scrolling.\n *\n * @class Overlay\n */\n\nvar Overlay = function () {\n  _createClass(Overlay, null, [{\n    key: 'registerOverlay',\n\n\n    /**\n     * Register overlay class.\n     *\n     * @param {String} type Overlay type, one of the CLONE_TYPES value\n     * @param {Overlay} overlayClass Overlay class extended from base overlay class {@link Overlay}\n     */\n    value: function registerOverlay(type, overlayClass) {\n      if (Overlay.CLONE_TYPES.indexOf(type) === -1) {\n        throw new Error('Unsupported overlay (' + type + ').');\n      }\n      registeredOverlays[type] = overlayClass;\n    }\n\n    /**\n     * Create new instance of overlay type.\n     *\n     * @param {String} type Overlay type, one of the CLONE_TYPES value\n     * @param {Walkontable} wot Walkontable instance\n     */\n\n  }, {\n    key: 'createOverlay',\n    value: function createOverlay(type, wot) {\n      return new registeredOverlays[type](wot);\n    }\n\n    /**\n     * Check if specified overlay was registered.\n     *\n     * @param {String} type Overlay type, one of the CLONE_TYPES value\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasOverlay',\n    value: function hasOverlay(type) {\n      return registeredOverlays[type] !== void 0;\n    }\n\n    /**\n     * Checks if overlay object (`overlay`) is instance of overlay type (`type`).\n     *\n     * @param {Overlay} overlay Overlay object\n     * @param {String} type Overlay type, one of the CLONE_TYPES value\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isOverlayTypeOf',\n    value: function isOverlayTypeOf(overlay, type) {\n      if (!overlay || !registeredOverlays[type]) {\n        return false;\n      }\n\n      return overlay instanceof registeredOverlays[type];\n    }\n\n    /**\n     * @param {Walkontable} wotInstance\n     */\n\n  }, {\n    key: 'CLONE_TOP',\n\n    /**\n     * @type {String}\n     */\n    get: function get() {\n      return 'top';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_BOTTOM',\n    get: function get() {\n      return 'bottom';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_LEFT',\n    get: function get() {\n      return 'left';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_TOP_LEFT_CORNER',\n    get: function get() {\n      return 'top_left_corner';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_BOTTOM_LEFT_CORNER',\n    get: function get() {\n      return 'bottom_left_corner';\n    }\n\n    /**\n     * @type {String}\n     */\n\n  }, {\n    key: 'CLONE_DEBUG',\n    get: function get() {\n      return 'debug';\n    }\n\n    /**\n     * List of all availables clone types\n     *\n     * @type {Array}\n     */\n\n  }, {\n    key: 'CLONE_TYPES',\n    get: function get() {\n      return [Overlay.CLONE_TOP, Overlay.CLONE_BOTTOM, Overlay.CLONE_LEFT, Overlay.CLONE_TOP_LEFT_CORNER, Overlay.CLONE_BOTTOM_LEFT_CORNER, Overlay.CLONE_DEBUG];\n    }\n  }]);\n\n  function Overlay(wotInstance) {\n    _classCallCheck(this, Overlay);\n\n    (0, _object.defineGetter)(this, 'wot', wotInstance, {\n      writable: false\n    });\n\n    // legacy support, deprecated in the future\n    this.instance = this.wot;\n\n    this.type = '';\n    this.mainTableScrollableElement = null;\n    this.TABLE = this.wot.wtTable.TABLE;\n    this.hider = this.wot.wtTable.hider;\n    this.spreader = this.wot.wtTable.spreader;\n    this.holder = this.wot.wtTable.holder;\n    this.wtRootElement = this.wot.wtTable.wtRootElement;\n    this.trimmingContainer = (0, _element.getTrimmingContainer)(this.hider.parentNode.parentNode);\n    this.areElementSizesAdjusted = false;\n    this.updateStateOfRendering();\n  }\n\n  /**\n   * Update internal state of object with an information about the need of full rendering of the overlay.\n   *\n   * @returns {Boolean} Returns `true` if the state has changed since the last check.\n   */\n\n\n  _createClass(Overlay, [{\n    key: 'updateStateOfRendering',\n    value: function updateStateOfRendering() {\n      var previousState = this.needFullRender;\n\n      this.needFullRender = this.shouldBeRendered();\n\n      var changed = previousState !== this.needFullRender;\n\n      if (changed && !this.needFullRender) {\n        this.reset();\n      }\n\n      return changed;\n    }\n\n    /**\n     * Checks if overlay should be fully rendered\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'shouldBeRendered',\n    value: function shouldBeRendered() {\n      return true;\n    }\n\n    /**\n     * Update the trimming container.\n     */\n\n  }, {\n    key: 'updateTrimmingContainer',\n    value: function updateTrimmingContainer() {\n      this.trimmingContainer = (0, _element.getTrimmingContainer)(this.hider.parentNode.parentNode);\n    }\n\n    /**\n     * Update the main scrollable element.\n     */\n\n  }, {\n    key: 'updateMainScrollableElement',\n    value: function updateMainScrollableElement() {\n      this.mainTableScrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);\n    }\n\n    /**\n     * Make a clone of table for overlay\n     *\n     * @param {String} direction Can be `Overlay.CLONE_TOP`, `Overlay.CLONE_LEFT`,\n     *                           `Overlay.CLONE_TOP_LEFT_CORNER`, `Overlay.CLONE_DEBUG`\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'makeClone',\n    value: function makeClone(direction) {\n      if (Overlay.CLONE_TYPES.indexOf(direction) === -1) {\n        throw new Error('Clone type \"' + direction + '\" is not supported.');\n      }\n      var clone = document.createElement('DIV');\n      var clonedTable = document.createElement('TABLE');\n\n      clone.className = 'ht_clone_' + direction + ' handsontable';\n      clone.style.position = 'absolute';\n      clone.style.top = 0;\n      clone.style.left = 0;\n      clone.style.overflow = 'hidden';\n\n      clonedTable.className = this.wot.wtTable.TABLE.className;\n      clone.appendChild(clonedTable);\n\n      this.type = direction;\n      this.wot.wtTable.wtRootElement.parentNode.appendChild(clone);\n\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (preventOverflow === true || preventOverflow === 'horizontal' && this.type === Overlay.CLONE_TOP || preventOverflow === 'vertical' && this.type === Overlay.CLONE_LEFT) {\n        this.mainTableScrollableElement = window;\n      } else {\n        this.mainTableScrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);\n      }\n\n      return new _core2.default({\n        cloneSource: this.wot,\n        cloneOverlay: this,\n        table: clonedTable\n      });\n    }\n\n    /**\n     * Refresh/Redraw overlay\n     *\n     * @param {Boolean} [fastDraw=false]\n     */\n\n  }, {\n    key: 'refresh',\n    value: function refresh() {\n      var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      // When hot settings are changed we allow to refresh overlay once before blocking\n      var nextCycleRenderFlag = this.shouldBeRendered();\n\n      if (this.clone && (this.needFullRender || nextCycleRenderFlag)) {\n        this.clone.draw(fastDraw);\n      }\n      this.needFullRender = nextCycleRenderFlag;\n    }\n\n    /**\n     * Reset overlay styles to initial values.\n     */\n\n  }, {\n    key: 'reset',\n    value: function reset() {\n      if (!this.clone) {\n        return;\n      }\n      var holder = this.clone.wtTable.holder;\n      var hider = this.clone.wtTable.hider;\n      var holderStyle = holder.style;\n      var hidderStyle = hider.style;\n      var rootStyle = holder.parentNode.style;\n\n      (0, _array.arrayEach)([holderStyle, hidderStyle, rootStyle], function (style) {\n        style.width = '';\n        style.height = '';\n      });\n    }\n\n    /**\n     * Destroy overlay instance\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      new _eventManager2.default(this.clone).destroy();\n    }\n  }]);\n\n  return Overlay;\n}();\n\nexports.default = Overlay;\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.toUpperCaseFirst = toUpperCaseFirst;\nexports.equalsIgnoreCase = equalsIgnoreCase;\nexports.randomString = randomString;\nexports.isPercentValue = isPercentValue;\nexports.substitute = substitute;\nexports.stripTags = stripTags;\n\nvar _mixed = __webpack_require__(16);\n\nvar _number = __webpack_require__(5);\n\n/**\n * Convert string to upper case first letter.\n *\n * @param {String} string String to convert.\n * @returns {String}\n */\nfunction toUpperCaseFirst(string) {\n  return string[0].toUpperCase() + string.substr(1);\n}\n\n/**\n * Compare strings case insensitively.\n *\n * @param {...String} strings Strings to compare.\n * @returns {Boolean}\n */\nfunction equalsIgnoreCase() {\n  var unique = [];\n\n  for (var _len = arguments.length, strings = Array(_len), _key = 0; _key < _len; _key++) {\n    strings[_key] = arguments[_key];\n  }\n\n  var length = strings.length;\n\n  while (length--) {\n    var string = (0, _mixed.stringify)(strings[length]).toLowerCase();\n\n    if (unique.indexOf(string) === -1) {\n      unique.push(string);\n    }\n  }\n\n  return unique.length === 1;\n}\n\n/**\n * Generates a random hex string. Used as namespace for Handsontable instance events.\n *\n * @return {String} Returns 16-long character random string (eq. `'92b1bfc74ec4'`).\n */\nfunction randomString() {\n  function s4() {\n    return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n  }\n\n  return s4() + s4() + s4() + s4();\n}\n\n/**\n * Checks if value is valid percent.\n *\n * @param {String} value\n * @returns {Boolean}\n */\nfunction isPercentValue(value) {\n  return (/^([0-9][0-9]?%$)|(^100%$)/.test(value)\n  );\n}\n\n/**\n * Substitute strings placed beetwen square brackets into value defined in `variables` object. String names defined in\n * square brackets must be the same as property name of `variables` object.\n *\n * @param {String} template Template string.\n * @param {Object} variables Object which contains all available values which can be injected into template.\n * @returns {String}\n */\nfunction substitute(template) {\n  var variables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  return ('' + template).replace(/(?:\\\\)?\\[([^[\\]]+)]/g, function (match, name) {\n    if (match.charAt(0) === '\\\\') {\n      return match.substr(1, match.length - 1);\n    }\n\n    return variables[name] === void 0 ? '' : variables[name];\n  });\n}\n\nvar STRIP_TAGS_REGEX = /<\\/?\\w+\\/?>|<\\w+[\\s|/][^>]*>/gi;\n\n/**\n * Strip any HTML tag from the string.\n *\n * @param  {String} string String to cut HTML from.\n * @return {String}\n */\nfunction stripTags(string) {\n  string += '';\n\n  return string.replace(STRIP_TAGS_REGEX, '');\n}\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(99);\nvar enumBugKeys = __webpack_require__(78);\n\nmodule.exports = Object.keys || function keys(O) {\n  return $keys(O, enumBugKeys);\n};\n\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports) {\n\n// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = staticRegister;\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar collection = exports.collection = new Map();\n\nfunction staticRegister() {\n  var namespace = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'common';\n\n  if (!collection.has(namespace)) {\n    collection.set(namespace, new Map());\n  }\n  var subCollection = collection.get(namespace);\n\n  /**\n   * Register an item to the collection. If the item under the same was exist earlier then this item will be replaced with new one.\n   *\n   * @param {String} name Identification of the item.\n   * @param {*} item Item to save in the collection.\n   */\n  function register(name, item) {\n    subCollection.set(name, item);\n  }\n\n  /**\n   * Retrieve the item from the collection.\n   *\n   * @param {String} name Identification of the item.\n   * @returns {*} Returns item which was saved in the collection.\n   */\n  function getItem(name) {\n    return subCollection.get(name);\n  }\n\n  /**\n   * Check if item under specyfied name is exists.\n   *\n   * @param {String} name Identification of the item.\n   * @returns {Boolean} Returns `true` or `false` depends on if element exists in the collection.\n   */\n  function hasItem(name) {\n    return subCollection.has(name);\n  }\n\n  /**\n   * Retrieve list of names registered from the collection.\n   *\n   * @returns {Array} Returns an array of strings with all names under which objects are stored.\n   */\n  function getNames() {\n    return [].concat(_toConsumableArray(subCollection.keys()));\n  }\n\n  /**\n   * Retrieve all registered values from the collection.\n   *\n   * @returns {Array} Returns an array with all values stored in the collection.\n   */\n  function getValues() {\n    return [].concat(_toConsumableArray(subCollection.values()));\n  }\n\n  return {\n    register: register,\n    getItem: getItem,\n    hasItem: hasItem,\n    getNames: getNames,\n    getValues: getValues\n  };\n}\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.requestAnimationFrame = requestAnimationFrame;\nexports.cancelAnimationFrame = cancelAnimationFrame;\nexports.isTouchSupported = isTouchSupported;\nexports.isWebComponentSupportedNatively = isWebComponentSupportedNatively;\nexports.hasCaptionProblem = hasCaptionProblem;\nexports.getComparisonFunction = getComparisonFunction;\n// https://gist.github.com/paulirish/1579671\nvar lastTime = 0;\nvar vendors = ['ms', 'moz', 'webkit', 'o'];\nvar _requestAnimationFrame = window.requestAnimationFrame;\nvar _cancelAnimationFrame = window.cancelAnimationFrame;\n\nfor (var x = 0; x < vendors.length && !_requestAnimationFrame; ++x) {\n  _requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\n  _cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!_requestAnimationFrame) {\n  _requestAnimationFrame = function _requestAnimationFrame(callback) {\n    var currTime = new Date().getTime();\n    var timeToCall = Math.max(0, 16 - (currTime - lastTime));\n    var id = window.setTimeout(function () {\n      callback(currTime + timeToCall);\n    }, timeToCall);\n    lastTime = currTime + timeToCall;\n\n    return id;\n  };\n}\n\nif (!_cancelAnimationFrame) {\n  _cancelAnimationFrame = function _cancelAnimationFrame(id) {\n    clearTimeout(id);\n  };\n}\n\n/**\n * Polyfill for requestAnimationFrame\n *\n * @param {Function} callback\n * @returns {Number}\n */\nfunction requestAnimationFrame(callback) {\n  return _requestAnimationFrame.call(window, callback);\n}\n\n/**\n * Polyfill for cancelAnimationFrame\n *\n * @param {Number} id\n */\nfunction cancelAnimationFrame(id) {\n  _cancelAnimationFrame.call(window, id);\n}\n\nfunction isTouchSupported() {\n  return 'ontouchstart' in window;\n}\n\n/**\n * Checks if browser is support web components natively\n *\n * @returns {Boolean}\n */\nfunction isWebComponentSupportedNatively() {\n  var test = document.createElement('div');\n\n  return !!(test.createShadowRoot && test.createShadowRoot.toString().match(/\\[native code\\]/));\n}\n\nvar _hasCaptionProblem;\n\nfunction detectCaptionProblem() {\n  var TABLE = document.createElement('TABLE');\n  TABLE.style.borderSpacing = 0;\n  TABLE.style.borderWidth = 0;\n  TABLE.style.padding = 0;\n  var TBODY = document.createElement('TBODY');\n  TABLE.appendChild(TBODY);\n  TBODY.appendChild(document.createElement('TR'));\n  TBODY.firstChild.appendChild(document.createElement('TD'));\n  TBODY.firstChild.firstChild.innerHTML = '<tr><td>t<br>t</td></tr>';\n\n  var CAPTION = document.createElement('CAPTION');\n  CAPTION.innerHTML = 'c<br>c<br>c<br>c';\n  CAPTION.style.padding = 0;\n  CAPTION.style.margin = 0;\n  TABLE.insertBefore(CAPTION, TBODY);\n\n  document.body.appendChild(TABLE);\n  _hasCaptionProblem = TABLE.offsetHeight < 2 * TABLE.lastChild.offsetHeight; // boolean\n  document.body.removeChild(TABLE);\n}\n\nfunction hasCaptionProblem() {\n  if (_hasCaptionProblem === void 0) {\n    detectCaptionProblem();\n  }\n\n  return _hasCaptionProblem;\n}\n\nvar comparisonFunction = void 0;\n\n/**\n * Get string comparison function for sorting purposes. It supports multilingual string comparison base on Internationalization API.\n *\n * @param {String} [language]\n * @param {Object} [options]\n * @returns {*}\n */\nfunction getComparisonFunction(language) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (comparisonFunction) {\n    return comparisonFunction;\n  }\n\n  if ((typeof Intl === 'undefined' ? 'undefined' : _typeof(Intl)) === 'object') {\n    comparisonFunction = new Intl.Collator(language, options).compare;\n  } else if (typeof String.prototype.localeCompare === 'function') {\n    comparisonFunction = function comparisonFunction(a, b) {\n      return ('' + a).localeCompare(b);\n    };\n  } else {\n    comparisonFunction = function comparisonFunction(a, b) {\n      if (a === b) {\n        return 0;\n      }\n\n      return a > b ? -1 : 1;\n    };\n  }\n\n  return comparisonFunction;\n}\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.toSingleLine = toSingleLine;\n\nvar _array = __webpack_require__(1);\n\n/**\n * Tags a multiline string and return new one without line break characters and following spaces.\n *\n * @param {Array} strings Parts of the entire string without expressions.\n * @param {...String} expressions Expressions converted to strings, which are added to the entire string.\n * @returns {String}\n */\nfunction toSingleLine(strings) {\n  for (var _len = arguments.length, expressions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    expressions[_key - 1] = arguments[_key];\n  }\n\n  var result = (0, _array.arrayReduce)(strings, function (previousValue, currentValue, index) {\n\n    var valueWithoutWhiteSpaces = currentValue.replace(/(?:\\r?\\n\\s+)/g, '');\n    var expressionForIndex = expressions[index] ? expressions[index] : '';\n\n    return previousValue + valueWithoutWhiteSpaces + expressionForIndex;\n  }, '');\n\n  return result.trim();\n} /* eslint-disable import/prefer-default-export */\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.isFunction = isFunction;\nexports.throttle = throttle;\nexports.throttleAfterHits = throttleAfterHits;\nexports.debounce = debounce;\nexports.pipe = pipe;\nexports.partial = partial;\nexports.curry = curry;\nexports.curryRight = curryRight;\n\nvar _array = __webpack_require__(1);\n\n/**\n * Checks if given variable is function.\n *\n * @param {*} func Variable to check.\n * @returns {Boolean}\n */\nfunction isFunction(func) {\n  return typeof func === 'function';\n}\n\n/**\n * Creates throttle function that enforces a maximum number of times a function (`func`) can be called over time (`wait`).\n *\n * @param {Function} func Function to invoke.\n * @param {Number} wait Delay in miliseconds.\n * @returns {Function}\n */\nfunction throttle(func) {\n  var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;\n\n  var lastCalled = 0;\n  var result = {\n    lastCallThrottled: true\n  };\n  var lastTimer = null;\n\n  function _throttle() {\n    var _this = this;\n\n    var args = arguments;\n    var stamp = Date.now();\n    var needCall = false;\n\n    result.lastCallThrottled = true;\n\n    if (!lastCalled) {\n      lastCalled = stamp;\n      needCall = true;\n    }\n    var remaining = wait - (stamp - lastCalled);\n\n    if (needCall) {\n      result.lastCallThrottled = false;\n      func.apply(this, args);\n    } else {\n      if (lastTimer) {\n        clearTimeout(lastTimer);\n      }\n      lastTimer = setTimeout(function () {\n        result.lastCallThrottled = false;\n        func.apply(_this, args);\n        lastCalled = 0;\n        lastTimer = void 0;\n      }, remaining);\n    }\n\n    return result;\n  }\n\n  return _throttle;\n}\n\n/**\n * Creates throttle function that enforces a maximum number of times a function (`func`) can be called over\n * time (`wait`) after specified hits.\n *\n * @param {Function} func Function to invoke.\n * @param {Number} wait Delay in miliseconds.\n * @param {Number} hits Number of hits after throttling will be applied.\n * @returns {Function}\n */\nfunction throttleAfterHits(func) {\n  var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;\n  var hits = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;\n\n  var funcThrottle = throttle(func, wait);\n  var remainHits = hits;\n\n  function _clearHits() {\n    remainHits = hits;\n  }\n  function _throttleAfterHits() {\n    if (remainHits) {\n      remainHits--;\n\n      return func.apply(this, arguments);\n    }\n\n    return funcThrottle.apply(this, arguments);\n  }\n  _throttleAfterHits.clearHits = _clearHits;\n\n  return _throttleAfterHits;\n}\n\n/**\n * Creates debounce function that enforces a function (`func`) not be called again until a certain amount of time (`wait`)\n * has passed without it being called.\n *\n * @param {Function} func Function to invoke.\n * @param {Number} wait Delay in milliseconds.\n * @returns {Function}\n */\nfunction debounce(func) {\n  var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;\n\n  var lastTimer = null;\n  var result = void 0;\n\n  function _debounce() {\n    var _this2 = this;\n\n    var args = arguments;\n\n    if (lastTimer) {\n      clearTimeout(lastTimer);\n    }\n    lastTimer = setTimeout(function () {\n      result = func.apply(_this2, args);\n    }, wait);\n\n    return result;\n  }\n\n  return _debounce;\n}\n\n/**\n * Creates the function that returns the result of calling the given functions. Result of the first function is passed to\n * the second as an argument and so on. Only first function in the chain can handle multiple arguments.\n *\n * @param {Function} functions Functions to compose.\n * @returns {Function}\n */\nfunction pipe() {\n  for (var _len = arguments.length, functions = Array(_len), _key = 0; _key < _len; _key++) {\n    functions[_key] = arguments[_key];\n  }\n\n  var firstFunc = functions[0],\n      restFunc = functions.slice(1);\n\n\n  return function _pipe() {\n    return (0, _array.arrayReduce)(restFunc, function (acc, fn) {\n      return fn(acc);\n    }, firstFunc.apply(this, arguments));\n  };\n}\n\n/**\n * Creates the function that returns the function with cached arguments.\n *\n * @param {Function} func Function to partialization.\n * @param {Array} params Function arguments to cache.\n * @returns {Function}\n */\nfunction partial(func) {\n  for (var _len2 = arguments.length, params = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n    params[_key2 - 1] = arguments[_key2];\n  }\n\n  return function _partial() {\n    for (var _len3 = arguments.length, restParams = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n      restParams[_key3] = arguments[_key3];\n    }\n\n    return func.apply(this, params.concat(restParams));\n  };\n}\n\n/**\n * Creates the functions that returns the function with cached arguments. If count if passed arguments will be matched\n * to the arguments defined in `func` then function will be invoked.\n * Arguments are added to the stack in direction from the left to the right.\n *\n * @example\n * ```\n * var replace = curry(function(find, replace, string) {\n *   return string.replace(find, replace);\n * });\n *\n * // returns function with bounded first argument\n * var replace = replace('foo')\n *\n * // returns replaced string - all arguments was passed so function was invoked\n * replace('bar', 'Some test with foo...');\n *\n * ```\n *\n * @param {Function} func Function to currying.\n * @returns {Function}\n */\nfunction curry(func) {\n  var argsLength = func.length;\n\n  function given(argsSoFar) {\n    return function _curry() {\n      for (var _len4 = arguments.length, params = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        params[_key4] = arguments[_key4];\n      }\n\n      var passedArgsSoFar = argsSoFar.concat(params);\n      var result = void 0;\n\n      if (passedArgsSoFar.length >= argsLength) {\n        result = func.apply(this, passedArgsSoFar);\n      } else {\n        result = given(passedArgsSoFar);\n      }\n\n      return result;\n    };\n  }\n\n  return given([]);\n}\n\n/**\n * Creates the functions that returns the function with cached arguments. If count if passed arguments will be matched\n * to the arguments defined in `func` then function will be invoked.\n * Arguments are added to the stack in direction from the right to the left.\n *\n * @example\n * ```\n * var replace = curry(function(find, replace, string) {\n *   return string.replace(find, replace);\n * });\n *\n * // returns function with bounded first argument\n * var replace = replace('Some test with foo...')\n *\n * // returns replaced string - all arguments was passed so function was invoked\n * replace('bar', 'foo');\n *\n * ```\n *\n * @param {Function} func Function to currying.\n * @returns {Function}\n */\nfunction curryRight(func) {\n  var argsLength = func.length;\n\n  function given(argsSoFar) {\n    return function _curry() {\n      for (var _len5 = arguments.length, params = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n        params[_key5] = arguments[_key5];\n      }\n\n      var passedArgsSoFar = argsSoFar.concat(params.reverse());\n      var result = void 0;\n\n      if (passedArgsSoFar.length >= argsLength) {\n        result = func.apply(this, passedArgsSoFar);\n      } else {\n        result = given(passedArgsSoFar);\n      }\n\n      return result;\n    };\n  }\n\n  return given([]);\n}\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports) {\n\nvar toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports) {\n\nvar core = module.exports = { version: '2.5.5' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nmodule.exports = function (it, TYPE) {\n  if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n  return it;\n};\n\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = __webpack_require__(11)('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(31)(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n  ArrayProto[UNSCOPABLES][key] = true;\n};\n\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.createClassName = createClassName;\nexports.createDefaultCustomBorder = createDefaultCustomBorder;\nexports.createSingleEmptyBorder = createSingleEmptyBorder;\nexports.createDefaultHtBorder = createDefaultHtBorder;\nexports.createEmptyBorders = createEmptyBorders;\nexports.extendDefaultBorder = extendDefaultBorder;\nexports.checkSelectionBorders = checkSelectionBorders;\nexports.markSelected = markSelected;\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\n/**\n * Create separated class name for borders for each cell.\n *\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @returns {String}\n */\nfunction createClassName(row, col) {\n  return 'border_row' + row + 'col' + col;\n}\n\n/**\n * Create default single border for each position (top/right/bottom/left).\n *\n * @returns {Object} `{{width: number, color: string}}`\n */\nfunction createDefaultCustomBorder() {\n  return {\n    width: 1,\n    color: '#000'\n  };\n}\n\n/**\n * Create default object for empty border.\n *\n * @returns {Object} `{{hide: boolean}}`\n */\nfunction createSingleEmptyBorder() {\n  return { hide: true };\n}\n\n/**\n * Create default Handsontable border object.\n *\n * @returns {Object} `{{width: number, color: string, cornerVisible: boolean}}`\n */\nfunction createDefaultHtBorder() {\n  return {\n    width: 1,\n    color: '#000',\n    cornerVisible: false\n  };\n}\n\n/**\n * Prepare empty border for each cell with all custom borders hidden.\n *\n * @param {Number} row Visual row index.\n * @param {Number} col Visual column index.\n * @returns {Object} `{{className: *, border: *, row: *, col: *, top: {hide: boolean}, right: {hide: boolean}, bottom: {hide: boolean}, left: {hide: boolean}}}`\n */\nfunction createEmptyBorders(row, col) {\n  return {\n    className: createClassName(row, col),\n    border: createDefaultHtBorder(),\n    row: row,\n    col: col,\n    top: createSingleEmptyBorder(),\n    right: createSingleEmptyBorder(),\n    bottom: createSingleEmptyBorder(),\n    left: createSingleEmptyBorder()\n  };\n}\n\nfunction extendDefaultBorder(defaultBorder, customBorder) {\n  if ((0, _object.hasOwnProperty)(customBorder, 'border')) {\n    defaultBorder.border = customBorder.border;\n  }\n\n  if ((0, _object.hasOwnProperty)(customBorder, 'top')) {\n    defaultBorder.top = customBorder.top;\n  }\n\n  if ((0, _object.hasOwnProperty)(customBorder, 'right')) {\n    defaultBorder.right = customBorder.right;\n  }\n\n  if ((0, _object.hasOwnProperty)(customBorder, 'bottom')) {\n    defaultBorder.bottom = customBorder.bottom;\n  }\n\n  if ((0, _object.hasOwnProperty)(customBorder, 'left')) {\n    defaultBorder.left = customBorder.left;\n  }\n\n  return defaultBorder;\n}\n\n/**\n * Check if selection has border by className\n *\n * @param hot\n * @param direction\n */\nfunction checkSelectionBorders(hot, direction) {\n  var atLeastOneHasBorder = false;\n\n  (0, _array.arrayEach)(hot.getSelectedRange(), function (range) {\n    range.forAll(function (r, c) {\n      var metaBorders = hot.getCellMeta(r, c).borders;\n\n      if (metaBorders) {\n        if (direction) {\n          if (!(0, _object.hasOwnProperty)(metaBorders[direction], 'hide')) {\n            atLeastOneHasBorder = true;\n            return false; // breaks forAll\n          }\n        } else {\n          atLeastOneHasBorder = true;\n          return false; // breaks forAll\n        }\n      }\n    });\n  });\n\n  return atLeastOneHasBorder;\n}\n\n/**\n * Mark label in contextMenu as selected\n *\n * @param label\n * @returns {string}\n */\nfunction markSelected(label) {\n  return '<span class=\"selected\">' + String.fromCharCode(10003) + '</span>' + label; // workaround for https://github.com/handsontable/handsontable/issues/1946\n}\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports) {\n\nvar id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports) {\n\nmodule.exports = {};\n\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar def = __webpack_require__(20).f;\nvar has = __webpack_require__(29);\nvar TAG = __webpack_require__(11)('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports) {\n\nexports.f = {}.propertyIsEnumerable;\n\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.EditorState = undefined;\n\nvar _src = __webpack_require__(4);\n\nvar _mixed = __webpack_require__(16);\n\nvar EditorState = exports.EditorState = {\n  VIRGIN: 'STATE_VIRGIN', // before editing\n  EDITING: 'STATE_EDITING',\n  WAITING: 'STATE_WAITING', // waiting for async validation\n  FINISHED: 'STATE_FINISHED'\n};\n\nfunction BaseEditor(instance) {\n  this.instance = instance;\n  this.state = EditorState.VIRGIN;\n\n  this._opened = false;\n  this._fullEditMode = false;\n  this._closeCallback = null;\n\n  this.init();\n}\n\nBaseEditor.prototype._fireCallbacks = function (result) {\n  if (this._closeCallback) {\n    this._closeCallback(result);\n    this._closeCallback = null;\n  }\n};\n\nBaseEditor.prototype.init = function () {};\n\nBaseEditor.prototype.getValue = function () {\n  throw Error('Editor getValue() method unimplemented');\n};\n\nBaseEditor.prototype.setValue = function (newValue) {\n  throw Error('Editor setValue() method unimplemented');\n};\n\nBaseEditor.prototype.open = function () {\n  throw Error('Editor open() method unimplemented');\n};\n\nBaseEditor.prototype.close = function () {\n  throw Error('Editor close() method unimplemented');\n};\n\nBaseEditor.prototype.prepare = function (row, col, prop, td, originalValue, cellProperties) {\n  this.TD = td;\n  this.row = row;\n  this.col = col;\n  this.prop = prop;\n  this.originalValue = originalValue;\n  this.cellProperties = cellProperties;\n  this.state = EditorState.VIRGIN;\n};\n\nBaseEditor.prototype.extend = function () {\n  var baseClass = this.constructor;\n\n  function Editor() {\n    baseClass.apply(this, arguments);\n  }\n\n  function inherit(Child, Parent) {\n    function Bridge() {}\n    Bridge.prototype = Parent.prototype;\n    Child.prototype = new Bridge();\n    Child.prototype.constructor = Child;\n\n    return Child;\n  }\n\n  return inherit(Editor, baseClass);\n};\n\nBaseEditor.prototype.saveValue = function (value, ctrlDown) {\n  var selection = void 0;\n  var tmp = void 0;\n\n  // if ctrl+enter and multiple cells selected, behave like Excel (finish editing and apply to all cells)\n  if (ctrlDown) {\n    selection = this.instance.getSelectedLast();\n\n    if (selection[0] > selection[2]) {\n      tmp = selection[0];\n      selection[0] = selection[2];\n      selection[2] = tmp;\n    }\n    if (selection[1] > selection[3]) {\n      tmp = selection[1];\n      selection[1] = selection[3];\n      selection[3] = tmp;\n    }\n  } else {\n    selection = [this.row, this.col, null, null];\n  }\n\n  this.instance.populateFromArray(selection[0], selection[1], value, selection[2], selection[3], 'edit');\n};\n\nBaseEditor.prototype.beginEditing = function (newInitialValue, event) {\n  if (this.state !== EditorState.VIRGIN) {\n    return;\n  }\n  this.instance.view.scrollViewport(new _src.CellCoords(this.row, this.col));\n  this.instance.view.render();\n  this.state = EditorState.EDITING;\n\n  newInitialValue = typeof newInitialValue === 'string' ? newInitialValue : this.originalValue;\n  this.setValue((0, _mixed.stringify)(newInitialValue));\n\n  this.open(event);\n  this._opened = true;\n  this.focus();\n\n  // only rerender the selections (FillHandle should disappear when beginediting is triggered)\n  this.instance.view.render();\n\n  this.instance.runHooks('afterBeginEditing', this.row, this.col);\n};\n\nBaseEditor.prototype.finishEditing = function (restoreOriginalValue, ctrlDown, callback) {\n  var _this = this,\n      val;\n\n  if (callback) {\n    var previousCloseCallback = this._closeCallback;\n\n    this._closeCallback = function (result) {\n      if (previousCloseCallback) {\n        previousCloseCallback(result);\n      }\n\n      callback(result);\n      _this.instance.view.render();\n    };\n  }\n\n  if (this.isWaiting()) {\n    return;\n  }\n\n  if (this.state == EditorState.VIRGIN) {\n    this.instance._registerTimeout(setTimeout(function () {\n      _this._fireCallbacks(true);\n    }, 0));\n\n    return;\n  }\n\n  if (this.state == EditorState.EDITING) {\n    if (restoreOriginalValue) {\n      this.cancelChanges();\n      this.instance.view.render();\n\n      return;\n    }\n\n    var value = this.getValue();\n\n    if (this.instance.getSettings().trimWhitespace) {\n      // We trim only string values\n      val = [[typeof value === 'string' ? String.prototype.trim.call(value || '') : value]];\n    } else {\n      val = [[value]];\n    }\n\n    this.state = EditorState.WAITING;\n    this.saveValue(val, ctrlDown);\n\n    if (this.instance.getCellValidator(this.cellProperties)) {\n      this.instance.addHookOnce('postAfterValidate', function (result) {\n        _this.state = EditorState.FINISHED;\n        _this.discardEditor(result);\n      });\n    } else {\n      this.state = EditorState.FINISHED;\n      this.discardEditor(true);\n    }\n  }\n};\n\nBaseEditor.prototype.cancelChanges = function () {\n  this.state = EditorState.FINISHED;\n  this.discardEditor();\n};\n\nBaseEditor.prototype.discardEditor = function (result) {\n  if (this.state !== EditorState.FINISHED) {\n    return;\n  }\n  // validator was defined and failed\n  if (result === false && this.cellProperties.allowInvalid !== true) {\n    this.instance.selectCell(this.row, this.col);\n    this.focus();\n    this.state = EditorState.EDITING;\n    this._fireCallbacks(false);\n  } else {\n    this.close();\n    this._opened = false;\n    this._fullEditMode = false;\n    this.state = EditorState.VIRGIN;\n    this._fireCallbacks(true);\n  }\n};\n\n/**\n * Switch editor into full edit mode. In this state navigation keys don't close editor. This mode is activated\n * automatically after hit ENTER or F2 key on the cell or while editing cell press F2 key.\n */\nBaseEditor.prototype.enableFullEditMode = function () {\n  this._fullEditMode = true;\n};\n\n/**\n * Checks if editor is in full edit mode.\n *\n * @returns {Boolean}\n */\nBaseEditor.prototype.isInFullEditMode = function () {\n  return this._fullEditMode;\n};\n\nBaseEditor.prototype.isOpened = function () {\n  return this._opened;\n};\n\nBaseEditor.prototype.isWaiting = function () {\n  return this.state === EditorState.WAITING;\n};\n\nBaseEditor.prototype.checkEditorSection = function () {\n  var totalRows = this.instance.countRows();\n  var section = '';\n\n  if (this.row < this.instance.getSettings().fixedRowsTop) {\n    if (this.col < this.instance.getSettings().fixedColumnsLeft) {\n      section = 'top-left-corner';\n    } else {\n      section = 'top';\n    }\n  } else if (this.instance.getSettings().fixedRowsBottom && this.row >= totalRows - this.instance.getSettings().fixedRowsBottom) {\n    if (this.col < this.instance.getSettings().fixedColumnsLeft) {\n      section = 'bottom-left-corner';\n    } else {\n      section = 'bottom';\n    }\n  } else if (this.col < this.instance.getSettings().fixedColumnsLeft) {\n    section = 'left';\n  }\n\n  return section;\n};\n\nexports.default = BaseEditor;\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * CellCoords holds cell coordinates (row, column) and few method to validate them and\n * retrieve as an array or an object\n *\n * @class CellCoords\n */\nvar CellCoords = function () {\n  /**\n   * @param {Number} row Row index\n   * @param {Number} col Column index\n   */\n  function CellCoords(row, col) {\n    _classCallCheck(this, CellCoords);\n\n    if (typeof row !== 'undefined' && typeof col !== 'undefined') {\n      this.row = row;\n      this.col = col;\n    } else {\n      this.row = null;\n      this.col = null;\n    }\n  }\n\n  /**\n   * Checks if given set of coordinates is valid in context of a given Walkontable instance\n   *\n   * @param {Walkontable} wotInstance\n   * @returns {Boolean}\n   */\n\n\n  _createClass(CellCoords, [{\n    key: 'isValid',\n    value: function isValid(wotInstance) {\n      // is it a valid cell index (0 or higher)\n      if (this.row < 0 || this.col < 0) {\n        return false;\n      }\n      // is selection within total rows and columns\n      if (this.row >= wotInstance.getSetting('totalRows') || this.col >= wotInstance.getSetting('totalColumns')) {\n        return false;\n      }\n\n      return true;\n    }\n\n    /**\n     * Checks if this cell coords are the same as cell coords given as a parameter\n     *\n     * @param {CellCoords} cellCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isEqual',\n    value: function isEqual(cellCoords) {\n      if (cellCoords === this) {\n        return true;\n      }\n\n      return this.row === cellCoords.row && this.col === cellCoords.col;\n    }\n\n    /**\n     * Checks if tested coordinates are positioned in south-east from this cell coords\n     *\n     * @param {Object} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSouthEastOf',\n    value: function isSouthEastOf(testedCoords) {\n      return this.row >= testedCoords.row && this.col >= testedCoords.col;\n    }\n\n    /**\n     * Checks if tested coordinates are positioned in north-east from this cell coords\n     *\n     * @param {Object} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNorthWestOf',\n    value: function isNorthWestOf(testedCoords) {\n      return this.row <= testedCoords.row && this.col <= testedCoords.col;\n    }\n\n    /**\n     * Checks if tested coordinates are positioned in south-west from this cell coords\n     *\n     * @param {Object} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSouthWestOf',\n    value: function isSouthWestOf(testedCoords) {\n      return this.row >= testedCoords.row && this.col <= testedCoords.col;\n    }\n\n    /**\n     * Checks if tested coordinates are positioned in north-east from this cell coords\n     *\n     * @param {Object} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNorthEastOf',\n    value: function isNorthEastOf(testedCoords) {\n      return this.row <= testedCoords.row && this.col >= testedCoords.col;\n    }\n\n    /**\n     * Convert CellCoords to literal object.\n     *\n     * @return {Object} Returns a literal object with `row` and `col` properties.\n     */\n\n  }, {\n    key: 'toObject',\n    value: function toObject() {\n      return {\n        row: this.row,\n        col: this.col\n      };\n    }\n  }]);\n\n  return CellCoords;\n}();\n\nexports.default = CellCoords;\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_55__;\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.log = log;\nexports.warn = warn;\nexports.info = info;\nexports.error = error;\n\nvar _mixed = __webpack_require__(16);\n\n/**\n * Logs message to the console if the `console` object is exposed.\n *\n * @param {...*} args Values which will be logged.\n */\nfunction log() {\n  if ((0, _mixed.isDefined)(console)) {\n    var _console;\n\n    (_console = console).log.apply(_console, arguments);\n  }\n} /* eslint-disable no-console */\n/* eslint-disable no-restricted-globals */\n\n/**\n * \"In Internet Explorer 9 (and 8), the console object is only exposed when the developer tools are opened\n * for a particular tab.\"\n *\n * Source: https://stackoverflow.com/a/5473193\n */\n\n;\n\n/**\n * Logs warn to the console if the `console` object is exposed.\n *\n * @param {...*} args Values which will be logged.\n */\nfunction warn() {\n  if ((0, _mixed.isDefined)(console)) {\n    var _console2;\n\n    (_console2 = console).warn.apply(_console2, arguments);\n  }\n};\n\n/**\n * Logs info to the console if the `console` object is exposed.\n *\n * @param {...*} args Values which will be logged.\n */\nfunction info() {\n  if ((0, _mixed.isDefined)(console)) {\n    var _console3;\n\n    (_console3 = console).info.apply(_console3, arguments);\n  }\n};\n\n/**\n * Logs error to the console if the `console` object is exposed.\n *\n * @param {...*} args Values which will be logged.\n */\nfunction error() {\n  if ((0, _mixed.isDefined)(console)) {\n    var _console4;\n\n    (_console4 = console).error.apply(_console4, arguments);\n  }\n};\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _autoResize = __webpack_require__(233);\n\nvar _autoResize2 = _interopRequireDefault(_autoResize);\n\nvar _baseEditor = __webpack_require__(53);\n\nvar _baseEditor2 = _interopRequireDefault(_baseEditor);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _unicode = __webpack_require__(21);\n\nvar _event = __webpack_require__(12);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar TextEditor = _baseEditor2.default.prototype.extend();\n\n/**\n * @private\n * @editor TextEditor\n * @class TextEditor\n * @dependencies autoResize\n */\nTextEditor.prototype.init = function () {\n  var that = this;\n  this.createElements();\n  this.eventManager = new _eventManager2.default(this);\n  this.bindEvents();\n  this.autoResize = (0, _autoResize2.default)();\n\n  this.instance.addHook('afterDestroy', function () {\n    that.destroy();\n  });\n};\n\nTextEditor.prototype.getValue = function () {\n  return this.TEXTAREA.value;\n};\n\nTextEditor.prototype.setValue = function (newValue) {\n  this.TEXTAREA.value = newValue;\n};\n\nvar onBeforeKeyDown = function onBeforeKeyDown(event) {\n  var instance = this,\n      that = instance.getActiveEditor(),\n      ctrlDown;\n\n  // catch CTRL but not right ALT (which in some systems triggers ALT+CTRL)\n  ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey;\n\n  // Process only events that have been fired in the editor\n  if (event.target !== that.TEXTAREA || (0, _event.isImmediatePropagationStopped)(event)) {\n    return;\n  }\n\n  if (event.keyCode === 17 || event.keyCode === 224 || event.keyCode === 91 || event.keyCode === 93) {\n    // when CTRL or its equivalent is pressed and cell is edited, don't prepare selectable text in textarea\n    (0, _event.stopImmediatePropagation)(event);\n    return;\n  }\n\n  switch (event.keyCode) {\n    case _unicode.KEY_CODES.ARROW_RIGHT:\n      if (that.isInFullEditMode()) {\n        if (!that.isWaiting() && !that.allowKeyEventPropagation || !that.isWaiting() && that.allowKeyEventPropagation && !that.allowKeyEventPropagation(event.keyCode)) {\n          (0, _event.stopImmediatePropagation)(event);\n        }\n      }\n      break;\n    case _unicode.KEY_CODES.ARROW_LEFT:\n      if (that.isInFullEditMode()) {\n        if (!that.isWaiting() && !that.allowKeyEventPropagation || !that.isWaiting() && that.allowKeyEventPropagation && !that.allowKeyEventPropagation(event.keyCode)) {\n          (0, _event.stopImmediatePropagation)(event);\n        }\n      }\n      break;\n    case _unicode.KEY_CODES.ARROW_UP:\n    case _unicode.KEY_CODES.ARROW_DOWN:\n      if (that.isInFullEditMode()) {\n        if (!that.isWaiting() && !that.allowKeyEventPropagation || !that.isWaiting() && that.allowKeyEventPropagation && !that.allowKeyEventPropagation(event.keyCode)) {\n          (0, _event.stopImmediatePropagation)(event);\n        }\n      }\n      break;\n\n    case _unicode.KEY_CODES.ENTER:\n      {\n        var isMultipleSelection = this.selection.isMultiple();\n\n        if (ctrlDown && !isMultipleSelection || event.altKey) {\n          // if ctrl+enter or alt+enter, add new line\n          if (that.isOpened()) {\n            var caretPosition = (0, _element.getCaretPosition)(that.TEXTAREA);\n            var value = that.getValue();\n            var newValue = value.slice(0, caretPosition) + '\\n' + value.slice(caretPosition);\n\n            that.setValue(newValue);\n\n            (0, _element.setCaretPosition)(that.TEXTAREA, caretPosition + 1);\n          } else {\n            that.beginEditing(that.originalValue + '\\n');\n          }\n          (0, _event.stopImmediatePropagation)(event);\n        }\n        event.preventDefault(); // don't add newline to field\n        break;\n      }\n    case _unicode.KEY_CODES.A:\n    case _unicode.KEY_CODES.X:\n    case _unicode.KEY_CODES.C:\n    case _unicode.KEY_CODES.V:\n      if (ctrlDown) {\n        (0, _event.stopImmediatePropagation)(event); // CTRL+A, CTRL+C, CTRL+V, CTRL+X should only work locally when cell is edited (not in table context)\n      }\n      break;\n\n    case _unicode.KEY_CODES.BACKSPACE:\n    case _unicode.KEY_CODES.DELETE:\n    case _unicode.KEY_CODES.HOME:\n    case _unicode.KEY_CODES.END:\n      (0, _event.stopImmediatePropagation)(event); // backspace, delete, home, end should only work locally when cell is edited (not in table context)\n      break;\n    default:\n      break;\n  }\n\n  if ([_unicode.KEY_CODES.ARROW_UP, _unicode.KEY_CODES.ARROW_RIGHT, _unicode.KEY_CODES.ARROW_DOWN, _unicode.KEY_CODES.ARROW_LEFT].indexOf(event.keyCode) === -1) {\n    that.autoResize.resize(String.fromCharCode(event.keyCode));\n  }\n};\n\nTextEditor.prototype.open = function () {\n  this.refreshDimensions(); // need it instantly, to prevent https://github.com/handsontable/handsontable/issues/348\n\n  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);\n};\n\nTextEditor.prototype.close = function (tdOutside) {\n  this.textareaParentStyle.display = 'none';\n\n  this.autoResize.unObserve();\n\n  if (document.activeElement === this.TEXTAREA) {\n    this.instance.listen(); // don't refocus the table if user focused some cell outside of HT on purpose\n  }\n  this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n};\n\nTextEditor.prototype.focus = function () {\n  this.TEXTAREA.focus();\n  (0, _element.setCaretPosition)(this.TEXTAREA, this.TEXTAREA.value.length);\n};\n\nTextEditor.prototype.createElements = function () {\n  //    this.$body = $(document.body);\n\n  this.TEXTAREA = document.createElement('TEXTAREA');\n\n  (0, _element.addClass)(this.TEXTAREA, 'handsontableInput');\n\n  this.textareaStyle = this.TEXTAREA.style;\n  this.textareaStyle.width = 0;\n  this.textareaStyle.height = 0;\n\n  this.TEXTAREA_PARENT = document.createElement('DIV');\n  (0, _element.addClass)(this.TEXTAREA_PARENT, 'handsontableInputHolder');\n\n  this.textareaParentStyle = this.TEXTAREA_PARENT.style;\n  this.textareaParentStyle.top = 0;\n  this.textareaParentStyle.left = 0;\n  this.textareaParentStyle.display = 'none';\n\n  this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n\n  this.instance.rootElement.appendChild(this.TEXTAREA_PARENT);\n\n  var that = this;\n  this.instance._registerTimeout(setTimeout(function () {\n    that.refreshDimensions();\n  }, 0));\n};\n\nTextEditor.prototype.getEditedCell = function () {\n  var editorSection = this.checkEditorSection(),\n      editedCell;\n\n  switch (editorSection) {\n    case 'top':\n      editedCell = this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 101;\n      break;\n    case 'top-left-corner':\n      editedCell = this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 103;\n      break;\n    case 'bottom-left-corner':\n      editedCell = this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 103;\n      break;\n    case 'left':\n      editedCell = this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 102;\n      break;\n    case 'bottom':\n      editedCell = this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.textareaParentStyle.zIndex = 102;\n      break;\n    default:\n      editedCell = this.instance.getCell(this.row, this.col);\n      this.textareaParentStyle.zIndex = '';\n      break;\n  }\n\n  return editedCell != -1 && editedCell != -2 ? editedCell : void 0;\n};\n\nTextEditor.prototype.refreshValue = function () {\n  var sourceData = this.instance.getSourceDataAtCell(this.row, this.prop);\n  this.originalValue = sourceData;\n\n  this.setValue(sourceData);\n  this.refreshDimensions();\n};\n\nTextEditor.prototype.refreshDimensions = function () {\n  if (this.state !== _baseEditor.EditorState.EDITING) {\n    return;\n  }\n  this.TD = this.getEditedCell();\n\n  // TD is outside of the viewport.\n  if (!this.TD) {\n    this.close(true);\n\n    return;\n  }\n\n  var currentOffset = (0, _element.offset)(this.TD);\n  var containerOffset = (0, _element.offset)(this.instance.rootElement);\n  var scrollableContainer = this.instance.view.wt.wtOverlays.topOverlay.mainTableScrollableElement;\n  var totalRowsCount = this.instance.countRows();\n  var containerScrollTop = scrollableContainer !== window ? scrollableContainer.scrollTop : 0;\n  var containerScrollLeft = scrollableContainer !== window ? scrollableContainer.scrollLeft : 0;\n\n  var editorSection = this.checkEditorSection();\n\n  var scrollTop = ['', 'left'].includes(editorSection) ? containerScrollTop : 0;\n  var scrollLeft = ['', 'top', 'bottom'].includes(editorSection) ? containerScrollLeft : 0;\n\n  // If colHeaders is disabled, cells in the first row have border-top\n  var editTopModifier = currentOffset.top === containerOffset.top ? 0 : 1;\n\n  var settings = this.instance.getSettings();\n  var rowHeadersCount = this.instance.hasRowHeaders();\n  var colHeadersCount = this.instance.hasColHeaders();\n  var backgroundColor = this.TD.style.backgroundColor;\n\n  var editTop = currentOffset.top - containerOffset.top - editTopModifier - scrollTop;\n  var editLeft = currentOffset.left - containerOffset.left - 1 - scrollLeft;\n  var cssTransformOffset = void 0;\n\n  // TODO: Refactor this to the new instance.getCell method (from #ply-59), after 0.12.1 is released\n  switch (editorSection) {\n    case 'top':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'left':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'top-left-corner':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'bottom-left-corner':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'bottom':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.holder.parentNode);\n      break;\n    default:\n      break;\n  }\n\n  if (colHeadersCount && this.instance.getSelectedLast()[0] === 0 || settings.fixedRowsBottom && this.instance.getSelectedLast()[0] === totalRowsCount - settings.fixedRowsBottom) {\n    editTop += 1;\n  }\n\n  if (this.instance.getSelectedLast()[1] === 0) {\n    editLeft += 1;\n  }\n\n  if (cssTransformOffset && cssTransformOffset != -1) {\n    this.textareaParentStyle[cssTransformOffset[0]] = cssTransformOffset[1];\n  } else {\n    (0, _element.resetCssTransform)(this.TEXTAREA_PARENT);\n  }\n\n  this.textareaParentStyle.top = editTop + 'px';\n  this.textareaParentStyle.left = editLeft + 'px';\n\n  var firstRowOffset = this.instance.view.wt.wtViewport.rowsRenderCalculator.startPosition;\n  var firstColumnOffset = this.instance.view.wt.wtViewport.columnsRenderCalculator.startPosition;\n  var horizontalScrollPosition = this.instance.view.wt.wtOverlays.leftOverlay.getScrollPosition();\n  var verticalScrollPosition = this.instance.view.wt.wtOverlays.topOverlay.getScrollPosition();\n  var scrollbarWidth = (0, _element.getScrollbarWidth)();\n\n  var cellTopOffset = this.TD.offsetTop + firstRowOffset - verticalScrollPosition;\n  var cellLeftOffset = this.TD.offsetLeft + firstColumnOffset - horizontalScrollPosition;\n\n  var width = (0, _element.innerWidth)(this.TD) - 8;\n  var actualVerticalScrollbarWidth = (0, _element.hasVerticalScrollbar)(scrollableContainer) ? scrollbarWidth : 0;\n  var actualHorizontalScrollbarWidth = (0, _element.hasHorizontalScrollbar)(scrollableContainer) ? scrollbarWidth : 0;\n  var maxWidth = this.instance.view.maximumVisibleElementWidth(cellLeftOffset) - 9 - actualVerticalScrollbarWidth;\n  var height = this.TD.scrollHeight + 1;\n  var maxHeight = Math.max(this.instance.view.maximumVisibleElementHeight(cellTopOffset) - actualHorizontalScrollbarWidth, 23);\n\n  var cellComputedStyle = (0, _element.getComputedStyle)(this.TD);\n\n  this.TEXTAREA.style.fontSize = cellComputedStyle.fontSize;\n  this.TEXTAREA.style.fontFamily = cellComputedStyle.fontFamily;\n  this.TEXTAREA.style.backgroundColor = ''; // RESET STYLE\n  this.TEXTAREA.style.backgroundColor = backgroundColor ? backgroundColor : (0, _element.getComputedStyle)(this.TEXTAREA).backgroundColor;\n\n  this.autoResize.init(this.TEXTAREA, {\n    minHeight: Math.min(height, maxHeight),\n    maxHeight: maxHeight, // TEXTAREA should never be wider than visible part of the viewport (should not cover the scrollbar)\n    minWidth: Math.min(width, maxWidth),\n    maxWidth: maxWidth // TEXTAREA should never be wider than visible part of the viewport (should not cover the scrollbar)\n  }, true);\n\n  this.textareaParentStyle.display = 'block';\n};\n\nTextEditor.prototype.bindEvents = function () {\n  var editor = this;\n\n  this.eventManager.addEventListener(this.TEXTAREA, 'cut', function (event) {\n    (0, _event.stopPropagation)(event);\n  });\n\n  this.eventManager.addEventListener(this.TEXTAREA, 'paste', function (event) {\n    (0, _event.stopPropagation)(event);\n  });\n\n  this.instance.addHook('afterScrollHorizontally', function () {\n    editor.refreshDimensions();\n  });\n\n  this.instance.addHook('afterScrollVertically', function () {\n    editor.refreshDimensions();\n  });\n\n  this.instance.addHook('afterColumnResize', function () {\n    editor.refreshDimensions();\n    editor.focus();\n  });\n\n  this.instance.addHook('afterRowResize', function () {\n    editor.refreshDimensions();\n    editor.focus();\n  });\n\n  this.instance.addHook('afterDestroy', function () {\n    editor.eventManager.destroy();\n  });\n};\n\nTextEditor.prototype.destroy = function () {\n  this.eventManager.destroy();\n};\n\nexports.default = TextEditor;\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar MIXIN_NAME = 'localHooks';\n\n/**\n * Mixin object to extend objects functionality for local hooks.\n *\n * @type {Object}\n */\nvar localHooks = {\n  /**\n   * Internal hooks storage.\n   */\n  _localHooks: Object.create(null),\n\n  /**\n   * Add hook to the collection.\n   *\n   * @param {String} key Hook name.\n   * @param {Function} callback Hook callback\n   */\n  addLocalHook: function addLocalHook(key, callback) {\n    if (!this._localHooks[key]) {\n      this._localHooks[key] = [];\n    }\n    this._localHooks[key].push(callback);\n  },\n\n\n  /**\n   * Run hooks.\n   *\n   * @param {String} key Hook name.\n   * @param {*} params\n   */\n  runLocalHooks: function runLocalHooks(key) {\n    var _this = this;\n\n    for (var _len = arguments.length, params = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      params[_key - 1] = arguments[_key];\n    }\n\n    if (this._localHooks[key]) {\n      (0, _array.arrayEach)(this._localHooks[key], function (callback) {\n        return callback.apply(_this, params);\n      });\n    }\n  },\n\n\n  /**\n   * Clear all added hooks.\n   */\n  clearLocalHooks: function clearLocalHooks() {\n    this._localHooks = {};\n  }\n};\n\n(0, _object.defineGetter)(localHooks, 'MIXIN_NAME', MIXIN_NAME, {\n  writable: false,\n  enumerable: false\n});\n\nexports.default = localHooks;\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports) {\n\n// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(59);\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar redefine = __webpack_require__(30);\nmodule.exports = function (target, src, safe) {\n  for (var key in src) redefine(target, key, src[key], safe);\n  return target;\n};\n\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it, Constructor, name, forbiddenField) {\n  if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n    throw TypeError(name + ': incorrect invocation!');\n  } return it;\n};\n\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ctx = __webpack_require__(32);\nvar call = __webpack_require__(102);\nvar isArrayIter = __webpack_require__(103);\nvar anObject = __webpack_require__(18);\nvar toLength = __webpack_require__(25);\nvar getIterFn = __webpack_require__(104);\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n  var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n  var f = ctx(fn, that, entries ? 2 : 1);\n  var index = 0;\n  var length, step, iterator, result;\n  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n  // fast case for arrays with default iterator\n  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n    if (result === BREAK || result === RETURN) return result;\n  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n    result = call(iterator, f, step.value, entries);\n    if (result === BREAK || result === RETURN) return result;\n  }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports) {\n\nmodule.exports = false;\n\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar global = __webpack_require__(14);\nvar $export = __webpack_require__(3);\nvar redefine = __webpack_require__(30);\nvar redefineAll = __webpack_require__(61);\nvar meta = __webpack_require__(34);\nvar forOf = __webpack_require__(64);\nvar anInstance = __webpack_require__(63);\nvar isObject = __webpack_require__(9);\nvar fails = __webpack_require__(23);\nvar $iterDetect = __webpack_require__(79);\nvar setToStringTag = __webpack_require__(51);\nvar inheritIfRequired = __webpack_require__(209);\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n  var Base = global[NAME];\n  var C = Base;\n  var ADDER = IS_MAP ? 'set' : 'add';\n  var proto = C && C.prototype;\n  var O = {};\n  var fixMethod = function (KEY) {\n    var fn = proto[KEY];\n    redefine(proto, KEY,\n      KEY == 'delete' ? function (a) {\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'has' ? function has(a) {\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'get' ? function get(a) {\n        return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n        : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n    );\n  };\n  if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n    new C().entries().next();\n  }))) {\n    // create collection constructor\n    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n    redefineAll(C.prototype, methods);\n    meta.NEED = true;\n  } else {\n    var instance = new C();\n    // early implementations not supports chaining\n    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n    // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false\n    var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n    // most early implementations doesn't supports iterables, most modern - not close it correctly\n    var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n    // for early implementations -0 and +0 not the same\n    var BUGGY_ZERO = !IS_WEAK && fails(function () {\n      // V8 ~ Chromium 42- fails only with 5+ elements\n      var $instance = new C();\n      var index = 5;\n      while (index--) $instance[ADDER](index, index);\n      return !$instance.has(-0);\n    });\n    if (!ACCEPT_ITERABLES) {\n      C = wrapper(function (target, iterable) {\n        anInstance(target, C, NAME);\n        var that = inheritIfRequired(new Base(), target, C);\n        if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n        return that;\n      });\n      C.prototype = proto;\n      proto.constructor = C;\n    }\n    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n      fixMethod('delete');\n      fixMethod('has');\n      IS_MAP && fixMethod('get');\n    }\n    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n    // weak collections should not contains .clear method\n    if (IS_WEAK && proto.clear) delete proto.clear;\n  }\n\n  setToStringTag(C, NAME);\n\n  O[NAME] = C;\n  $export($export.G + $export.W + $export.F * (C != Base), O);\n\n  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n  return C;\n};\n\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar pIE = __webpack_require__(52);\nvar createDesc = __webpack_require__(49);\nvar toIObject = __webpack_require__(24);\nvar toPrimitive = __webpack_require__(73);\nvar has = __webpack_require__(29);\nvar IE8_DOM_DEFINE = __webpack_require__(98);\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = __webpack_require__(22) ? gOPD : function getOwnPropertyDescriptor(O, P) {\n  O = toIObject(O);\n  P = toPrimitive(P, true);\n  if (IE8_DOM_DEFINE) try {\n    return gOPD(O, P);\n  } catch (e) { /* empty */ }\n  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = __webpack_require__(32);\nvar IObject = __webpack_require__(75);\nvar toObject = __webpack_require__(33);\nvar toLength = __webpack_require__(25);\nvar asc = __webpack_require__(210);\nmodule.exports = function (TYPE, $create) {\n  var IS_MAP = TYPE == 1;\n  var IS_FILTER = TYPE == 2;\n  var IS_SOME = TYPE == 3;\n  var IS_EVERY = TYPE == 4;\n  var IS_FIND_INDEX = TYPE == 6;\n  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n  var create = $create || asc;\n  return function ($this, callbackfn, that) {\n    var O = toObject($this);\n    var self = IObject(O);\n    var f = ctx(callbackfn, that, 3);\n    var length = toLength(self.length);\n    var index = 0;\n    var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n    var val, res;\n    for (;length > index; index++) if (NO_HOLES || index in self) {\n      val = self[index];\n      res = f(val, index, O);\n      if (TYPE) {\n        if (IS_MAP) result[index] = res;   // map\n        else if (res) switch (TYPE) {\n          case 3: return true;             // some\n          case 5: return val;              // find\n          case 6: return index;            // findIndex\n          case 2: result.push(val);        // filter\n        } else if (IS_EVERY) return false; // every\n      }\n    }\n    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n  };\n};\n\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports) {\n\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar hide = __webpack_require__(31);\nvar redefine = __webpack_require__(30);\nvar fails = __webpack_require__(23);\nvar defined = __webpack_require__(38);\nvar wks = __webpack_require__(11);\n\nmodule.exports = function (KEY, length, exec) {\n  var SYMBOL = wks(KEY);\n  var fns = exec(defined, SYMBOL, ''[KEY]);\n  var strfn = fns[0];\n  var rxfn = fns[1];\n  if (fails(function () {\n    var O = {};\n    O[SYMBOL] = function () { return 7; };\n    return ''[KEY](O) != 7;\n  })) {\n    redefine(String.prototype, KEY, strfn);\n    hide(RegExp.prototype, SYMBOL, length == 2\n      // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n      // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n      ? function (string, arg) { return rxfn.call(string, this, arg); }\n      // 21.2.5.6 RegExp.prototype[@@match](string)\n      // 21.2.5.9 RegExp.prototype[@@search](string)\n      : function (string) { return rxfn.call(string, this); }\n    );\n  }\n};\n\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.DEFAULT_LANGUAGE_CODE = exports.getLanguagesDictionaries = exports.getDefaultLanguageDictionary = exports.hasLanguageDictionary = exports.getLanguageDictionary = exports.registerLanguageDictionary = undefined;\n\nvar _object = __webpack_require__(2);\n\nvar _utils = __webpack_require__(197);\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _enUS = __webpack_require__(269);\n\nvar _enUS2 = _interopRequireDefault(_enUS);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar DEFAULT_LANGUAGE_CODE = _enUS2.default.languageCode;\n\nvar _staticRegister = (0, _staticRegister3.default)('languagesDictionaries'),\n    registerGloballyLanguageDictionary = _staticRegister.register,\n    getGlobalLanguageDictionary = _staticRegister.getItem,\n    hasGlobalLanguageDictionary = _staticRegister.hasItem,\n    getGlobalLanguagesDictionaries = _staticRegister.getValues;\n\n/**\n * Register language dictionary for specific language code.\n *\n * @param {String|Object} languageCodeOrDictionary Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE' or object representing dictionary.\n * @param {Object} dictionary Dictionary for specific language (optional if first parameter has already dictionary).\n */\n\n\nfunction registerLanguage(languageCodeOrDictionary, dictionary) {\n  var languageCode = languageCodeOrDictionary;\n\n  // Dictionary passed as first argument.\n  if ((0, _object.isObject)(languageCodeOrDictionary)) {\n    dictionary = languageCodeOrDictionary;\n    languageCode = dictionary.languageCode;\n  }\n\n  extendLanguageDictionary(languageCode, dictionary);\n  registerGloballyLanguageDictionary(languageCode, (0, _object.deepClone)(dictionary));\n\n  // We do not allow user to work with dictionary by reference, it can cause lot of bugs.\n  return (0, _object.deepClone)(dictionary);\n};\n\n/**\n * Get language dictionary for specific language code.\n *\n * @param {String} languageCode Language code.\n * @returns {Object} Object with constants representing identifiers for translation (as keys) and corresponding translation phrases (as values).\n */\nfunction getLanguage(languageCode) {\n  if (!hasLanguage(languageCode)) {\n    return null;\n  }\n\n  return (0, _object.deepClone)(getGlobalLanguageDictionary(languageCode));\n}\n\n/**\n *\n * Get if language with specified language code was registered.\n *\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n * @returns {Boolean}\n */\nfunction hasLanguage(languageCode) {\n  return hasGlobalLanguageDictionary(languageCode);\n}\n\n/**\n * Get default language dictionary.\n *\n * @returns {Object} Object with constants representing identifiers for translation (as keys) and corresponding translation phrases (as values).\n */\nfunction getDefaultLanguage() {\n  return _enUS2.default;\n}\n\n/**\n * Extend handled dictionary by default language dictionary. As result, if any dictionary key isn't defined for specific language, it will be filled with default language value (\"dictionary gaps\" are supplemented).\n *\n * @private\n * @param {String} languageCode Language code.\n * @param {Object} dictionary Dictionary which is extended.\n */\nfunction extendLanguageDictionary(languageCode, dictionary) {\n  if (languageCode !== DEFAULT_LANGUAGE_CODE) {\n    (0, _utils.extendNotExistingKeys)(dictionary, getGlobalLanguageDictionary(DEFAULT_LANGUAGE_CODE));\n  }\n}\n\n/**\n * Get registered language dictionaries.\n *\n * @returns {Array}\n */\nfunction getLanguages() {\n  return getGlobalLanguagesDictionaries();\n}\n\nexports.registerLanguageDictionary = registerLanguage;\nexports.getLanguageDictionary = getLanguage;\nexports.hasLanguageDictionary = hasLanguage;\nexports.getDefaultLanguageDictionary = getDefaultLanguage;\nexports.getLanguagesDictionaries = getLanguages;\nexports.DEFAULT_LANGUAGE_CODE = DEFAULT_LANGUAGE_CODE;\n\n/**\n * Automatically registers default dictionary.\n */\n\nregisterLanguage(_enUS2.default);\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nvar document = __webpack_require__(14).document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(9);\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(18);\nvar dPs = __webpack_require__(207);\nvar enumBugKeys = __webpack_require__(78);\nvar IE_PROTO = __webpack_require__(76)('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = __webpack_require__(72)('iframe');\n  var i = enumBugKeys.length;\n  var lt = '<';\n  var gt = '>';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  __webpack_require__(101).appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n  return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty();\n    Empty[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = createDict();\n  return Properties === undefined ? result : dPs(result, Properties);\n};\n\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(43);\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar shared = __webpack_require__(77)('keys');\nvar uid = __webpack_require__(48);\nmodule.exports = function (key) {\n  return shared[key] || (shared[key] = uid(key));\n};\n\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function (key) {\n  return store[key] || (store[key] = {});\n};\n\n\n/***/ }),\n/* 78 */\n/***/ (function(module, exports) {\n\n// IE 8- don't enum bug keys\nmodule.exports = (\n  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n\n\n/***/ }),\n/* 79 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ITERATOR = __webpack_require__(11)('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n  var riter = [7][ITERATOR]();\n  riter['return'] = function () { SAFE_CLOSING = true; };\n  // eslint-disable-next-line no-throw-literal\n  Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n  if (!skipClosing && !SAFE_CLOSING) return false;\n  var safe = false;\n  try {\n    var arr = [7];\n    var iter = arr[ITERATOR]();\n    iter.next = function () { return { done: safe = true }; };\n    arr[ITERATOR] = function () { return iter; };\n    exec(arr);\n  } catch (e) { /* empty */ }\n  return safe;\n};\n\n\n/***/ }),\n/* 80 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ctx = __webpack_require__(32);\nvar invoke = __webpack_require__(213);\nvar html = __webpack_require__(101);\nvar cel = __webpack_require__(72);\nvar global = __webpack_require__(14);\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n  var id = +this;\n  // eslint-disable-next-line no-prototype-builtins\n  if (queue.hasOwnProperty(id)) {\n    var fn = queue[id];\n    delete queue[id];\n    fn();\n  }\n};\nvar listener = function (event) {\n  run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n  setTask = function setImmediate(fn) {\n    var args = [];\n    var i = 1;\n    while (arguments.length > i) args.push(arguments[i++]);\n    queue[++counter] = function () {\n      // eslint-disable-next-line no-new-func\n      invoke(typeof fn == 'function' ? fn : Function(fn), args);\n    };\n    defer(counter);\n    return counter;\n  };\n  clearTask = function clearImmediate(id) {\n    delete queue[id];\n  };\n  // Node.js 0.8-\n  if (__webpack_require__(43)(process) == 'process') {\n    defer = function (id) {\n      process.nextTick(ctx(run, id, 1));\n    };\n  // Sphere (JS game engine) Dispatch API\n  } else if (Dispatch && Dispatch.now) {\n    defer = function (id) {\n      Dispatch.now(ctx(run, id, 1));\n    };\n  // Browsers with MessageChannel, includes WebWorkers\n  } else if (MessageChannel) {\n    channel = new MessageChannel();\n    port = channel.port2;\n    channel.port1.onmessage = listener;\n    defer = ctx(port.postMessage, port, 1);\n  // Browsers with postMessage, skip WebWorkers\n  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n    defer = function (id) {\n      global.postMessage(id + '', '*');\n    };\n    global.addEventListener('message', listener, false);\n  // IE8-\n  } else if (ONREADYSTATECHANGE in cel('script')) {\n    defer = function (id) {\n      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n        html.removeChild(this);\n        run.call(id);\n      };\n    };\n  // Rest old browsers\n  } else {\n    defer = function (id) {\n      setTimeout(ctx(run, id, 1), 0);\n    };\n  }\n}\nmodule.exports = {\n  set: setTask,\n  clear: clearTask\n};\n\n\n/***/ }),\n/* 81 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = __webpack_require__(99);\nvar hiddenKeys = __webpack_require__(78).concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return $keys(O, hiddenKeys);\n};\n\n\n/***/ }),\n/* 82 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = __webpack_require__(142);\nvar defined = __webpack_require__(38);\n\nmodule.exports = function (that, searchString, NAME) {\n  if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n  return String(defined(that));\n};\n\n\n/***/ }),\n/* 83 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar MATCH = __webpack_require__(11)('match');\nmodule.exports = function (KEY) {\n  var re = /./;\n  try {\n    '/./'[KEY](re);\n  } catch (e) {\n    try {\n      re[MATCH] = false;\n      return !'/./'[KEY](re);\n    } catch (f) { /* empty */ }\n  } return true;\n};\n\n\n/***/ }),\n/* 84 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $defineProperty = __webpack_require__(20);\nvar createDesc = __webpack_require__(49);\n\nmodule.exports = function (object, index, value) {\n  if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n  else object[index] = value;\n};\n\n\n/***/ }),\n/* 85 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar addToUnscopables = __webpack_require__(46);\nvar step = __webpack_require__(108);\nvar Iterators = __webpack_require__(50);\nvar toIObject = __webpack_require__(24);\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = __webpack_require__(106)(Array, 'Array', function (iterated, kind) {\n  this._t = toIObject(iterated); // target\n  this._i = 0;                   // next index\n  this._k = kind;                // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var kind = this._k;\n  var index = this._i++;\n  if (!O || index >= O.length) {\n    this._t = undefined;\n    return step(1);\n  }\n  if (kind == 'keys') return step(0, index);\n  if (kind == 'values') return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n\n/***/ }),\n/* 86 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _coords = __webpack_require__(54);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * A cell range is a set of exactly two CellCoords (that can be the same or different).\n *\n * @class CellRange\n */\nvar CellRange = function () {\n  /**\n   * @param {CellCoords} highlight Used to draw bold border around a cell where selection was\n   *                               started and to edit the cell when you press Enter.\n   * @param {CellCoords} [from] Usually the same as highlight, but in Excel there is distinction - one can change\n   *                            highlight within a selection.\n   * @param {CellCoords} [to] End selection.\n   */\n  function CellRange(highlight) {\n    var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : highlight;\n    var to = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : highlight;\n\n    _classCallCheck(this, CellRange);\n\n    this.highlight = highlight;\n    this.from = from;\n    this.to = to;\n  }\n\n  /**\n   * Set the new coordinates for highlighting selection.\n   *\n   * @param {CellCoords} coords Coordinates to use.\n   */\n\n\n  _createClass(CellRange, [{\n    key: 'setHighlight',\n    value: function setHighlight(coords) {\n      this.highlight = coords;\n\n      return this;\n    }\n\n    /**\n     * Set the new coordinates where selection starts from.\n     *\n     * @param {CellCoords} coords Coordinates to use.\n     */\n\n  }, {\n    key: 'setFrom',\n    value: function setFrom(coords) {\n      this.from = coords;\n\n      return this;\n    }\n\n    /**\n     * Set new coordinates where selection ends from.\n     *\n     * @param {CellCoords} coords Coordinates to use.\n     */\n\n  }, {\n    key: 'setTo',\n    value: function setTo(coords) {\n      this.to = coords;\n\n      return this;\n    }\n\n    /**\n     * Checks if given coords are valid in context of a given Walkontable instance\n     *\n     * @param {Walkontable} wotInstance\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isValid',\n    value: function isValid(wotInstance) {\n      return this.from.isValid(wotInstance) && this.to.isValid(wotInstance);\n    }\n\n    /**\n     * Checks if this cell range is restricted to one cell\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSingle',\n    value: function isSingle() {\n      return this.from.row === this.to.row && this.from.col === this.to.col;\n    }\n\n    /**\n     * Returns selected range height (in number of rows)\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getHeight',\n    value: function getHeight() {\n      return Math.max(this.from.row, this.to.row) - Math.min(this.from.row, this.to.row) + 1;\n    }\n\n    /**\n     * Returns selected range width (in number of columns)\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getWidth',\n    value: function getWidth() {\n      return Math.max(this.from.col, this.to.col) - Math.min(this.from.col, this.to.col) + 1;\n    }\n\n    /**\n     * Checks if given cell coords is within `from` and `to` cell coords of this range\n     *\n     * @param {CellCoords} cellCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'includes',\n    value: function includes(cellCoords) {\n      var row = cellCoords.row,\n          col = cellCoords.col;\n\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n\n      return topLeft.row <= row && bottomRight.row >= row && topLeft.col <= col && bottomRight.col >= col;\n    }\n\n    /**\n     * Checks if given range is within of this range\n     *\n     * @param {CellRange} testedRange\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'includesRange',\n    value: function includesRange(testedRange) {\n      return this.includes(testedRange.getTopLeftCorner()) && this.includes(testedRange.getBottomRightCorner());\n    }\n\n    /**\n     * Checks if given range is equal to this range\n     *\n     * @param {CellRange} testedRange\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isEqual',\n    value: function isEqual(testedRange) {\n      return Math.min(this.from.row, this.to.row) === Math.min(testedRange.from.row, testedRange.to.row) && Math.max(this.from.row, this.to.row) === Math.max(testedRange.from.row, testedRange.to.row) && Math.min(this.from.col, this.to.col) === Math.min(testedRange.from.col, testedRange.to.col) && Math.max(this.from.col, this.to.col) === Math.max(testedRange.from.col, testedRange.to.col);\n    }\n\n    /**\n     * Checks if tested range overlaps with the range.\n     * Range A is considered to to be overlapping with range B if intersection of A and B or B and A is not empty.\n     *\n     * @param {CellRange} testedRange\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'overlaps',\n    value: function overlaps(testedRange) {\n      return testedRange.isSouthEastOf(this.getTopLeftCorner()) && testedRange.isNorthWestOf(this.getBottomRightCorner());\n    }\n\n    /**\n     * @param {CellRange} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSouthEastOf',\n    value: function isSouthEastOf(testedCoords) {\n      return this.getTopLeftCorner().isSouthEastOf(testedCoords) || this.getBottomRightCorner().isSouthEastOf(testedCoords);\n    }\n\n    /**\n     * @param {CellRange} testedCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNorthWestOf',\n    value: function isNorthWestOf(testedCoords) {\n      return this.getTopLeftCorner().isNorthWestOf(testedCoords) || this.getBottomRightCorner().isNorthWestOf(testedCoords);\n    }\n\n    /**\n     * Returns `true` if the provided range is overlapping the current range horizontally\n     * (e.g. the current range's last column is 5 and the provided range's first column is 3).\n     *\n     * @param {CellRange} range The range to check against.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isOverlappingHorizontally',\n    value: function isOverlappingHorizontally(range) {\n      return this.getTopRightCorner().col >= range.getTopLeftCorner().col && this.getTopRightCorner().col <= range.getTopRightCorner().col || this.getTopLeftCorner().col <= range.getTopRightCorner().col && this.getTopLeftCorner().col >= range.getTopLeftCorner().col;\n    }\n\n    /**\n     * Returns `true` if the provided range is overlapping the current range vertically\n     * (e.g. the current range's last row is 5 and the provided range's first row is 3).\n     *\n     * @param {CellRange} range The range to check against.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isOverlappingVertically',\n    value: function isOverlappingVertically(range) {\n      return this.getBottomRightCorner().row >= range.getTopRightCorner().row && this.getBottomRightCorner().row <= range.getBottomRightCorner().row || this.getTopRightCorner().row <= range.getBottomRightCorner().row && this.getTopRightCorner().row >= range.getTopRightCorner().row;\n    }\n\n    /**\n     * Adds a cell to a range (only if exceeds corners of the range). Returns information if range was expanded\n     *\n     * @param {CellCoords} cellCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'expand',\n    value: function expand(cellCoords) {\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n\n      if (cellCoords.row < topLeft.row || cellCoords.col < topLeft.col || cellCoords.row > bottomRight.row || cellCoords.col > bottomRight.col) {\n        this.from = new _coords2.default(Math.min(topLeft.row, cellCoords.row), Math.min(topLeft.col, cellCoords.col));\n        this.to = new _coords2.default(Math.max(bottomRight.row, cellCoords.row), Math.max(bottomRight.col, cellCoords.col));\n\n        return true;\n      }\n\n      return false;\n    }\n\n    /**\n     * @param {CellRange} expandingRange\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'expandByRange',\n    value: function expandByRange(expandingRange) {\n      if (this.includesRange(expandingRange) || !this.overlaps(expandingRange)) {\n        return false;\n      }\n\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n      var initialDirection = this.getDirection();\n\n      var expandingTopLeft = expandingRange.getTopLeftCorner();\n      var expandingBottomRight = expandingRange.getBottomRightCorner();\n\n      var resultTopRow = Math.min(topLeft.row, expandingTopLeft.row);\n      var resultTopCol = Math.min(topLeft.col, expandingTopLeft.col);\n      var resultBottomRow = Math.max(bottomRight.row, expandingBottomRight.row);\n      var resultBottomCol = Math.max(bottomRight.col, expandingBottomRight.col);\n\n      var finalFrom = new _coords2.default(resultTopRow, resultTopCol);\n      var finalTo = new _coords2.default(resultBottomRow, resultBottomCol);\n\n      this.from = finalFrom;\n      this.to = finalTo;\n\n      this.setDirection(initialDirection);\n\n      if (this.highlight.row === this.getBottomRightCorner().row && this.getVerticalDirection() === 'N-S') {\n        this.flipDirectionVertically();\n      }\n\n      if (this.highlight.col === this.getTopRightCorner().col && this.getHorizontalDirection() === 'W-E') {\n        this.flipDirectionHorizontally();\n      }\n\n      return true;\n    }\n\n    /**\n     * @returns {String}\n     */\n\n  }, {\n    key: 'getDirection',\n    value: function getDirection() {\n      if (this.from.isNorthWestOf(this.to)) {\n        // NorthWest - SouthEast\n        return 'NW-SE';\n      } else if (this.from.isNorthEastOf(this.to)) {\n        // NorthEast - SouthWest\n        return 'NE-SW';\n      } else if (this.from.isSouthEastOf(this.to)) {\n        // SouthEast - NorthWest\n        return 'SE-NW';\n      } else if (this.from.isSouthWestOf(this.to)) {\n        // SouthWest - NorthEast\n        return 'SW-NE';\n      }\n    }\n\n    /**\n     * Get the vertical direction of the range.\n     *\n     * @returns {String} Available options: `N-S` (north->south), `S-N` (south->north).\n     */\n\n  }, {\n    key: 'getVerticalDirection',\n    value: function getVerticalDirection() {\n      return ['NE-SW', 'NW-SE'].indexOf(this.getDirection()) > -1 ? 'N-S' : 'S-N';\n    }\n\n    /**\n     * Get the horizontal direction of the range.\n     *\n     * @returns {String} Available options: `W-E` (west->east), `E-W` (east->west).\n     */\n\n  }, {\n    key: 'getHorizontalDirection',\n    value: function getHorizontalDirection() {\n      return ['NW-SE', 'SW-NE'].indexOf(this.getDirection()) > -1 ? 'W-E' : 'E-W';\n    }\n\n    /**\n     * @param {String} direction\n     */\n\n  }, {\n    key: 'setDirection',\n    value: function setDirection(direction) {\n      switch (direction) {\n        case 'NW-SE':\n          var _ref = [this.getTopLeftCorner(), this.getBottomRightCorner()];\n          this.from = _ref[0];\n          this.to = _ref[1];\n\n          break;\n        case 'NE-SW':\n          var _ref2 = [this.getTopRightCorner(), this.getBottomLeftCorner()];\n          this.from = _ref2[0];\n          this.to = _ref2[1];\n\n          break;\n        case 'SE-NW':\n          var _ref3 = [this.getBottomRightCorner(), this.getTopLeftCorner()];\n          this.from = _ref3[0];\n          this.to = _ref3[1];\n\n          break;\n        case 'SW-NE':\n          var _ref4 = [this.getBottomLeftCorner(), this.getTopRightCorner()];\n          this.from = _ref4[0];\n          this.to = _ref4[1];\n\n          break;\n        default:\n          break;\n      }\n    }\n\n    /**\n     * Flip the direction vertically. (e.g. `NW-SE` changes to `SW-NE`)\n     */\n\n  }, {\n    key: 'flipDirectionVertically',\n    value: function flipDirectionVertically() {\n      var direction = this.getDirection();\n      switch (direction) {\n        case 'NW-SE':\n          this.setDirection('SW-NE');\n          break;\n        case 'NE-SW':\n          this.setDirection('SE-NW');\n          break;\n        case 'SE-NW':\n          this.setDirection('NE-SW');\n          break;\n        case 'SW-NE':\n          this.setDirection('NW-SE');\n          break;\n        default:\n          break;\n      }\n    }\n\n    /**\n     * Flip the direction horizontally. (e.g. `NW-SE` changes to `NE-SW`)\n     */\n\n  }, {\n    key: 'flipDirectionHorizontally',\n    value: function flipDirectionHorizontally() {\n      var direction = this.getDirection();\n      switch (direction) {\n        case 'NW-SE':\n          this.setDirection('NE-SW');\n          break;\n        case 'NE-SW':\n          this.setDirection('NW-SE');\n          break;\n        case 'SE-NW':\n          this.setDirection('SW-NE');\n          break;\n        case 'SW-NE':\n          this.setDirection('SE-NW');\n          break;\n        default:\n          break;\n      }\n    }\n\n    /**\n     * Get top left corner of this range\n     *\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getTopLeftCorner',\n    value: function getTopLeftCorner() {\n      return new _coords2.default(Math.min(this.from.row, this.to.row), Math.min(this.from.col, this.to.col));\n    }\n\n    /**\n     * Get bottom right corner of this range\n     *\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getBottomRightCorner',\n    value: function getBottomRightCorner() {\n      return new _coords2.default(Math.max(this.from.row, this.to.row), Math.max(this.from.col, this.to.col));\n    }\n\n    /**\n     * Get top right corner of this range\n     *\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getTopRightCorner',\n    value: function getTopRightCorner() {\n      return new _coords2.default(Math.min(this.from.row, this.to.row), Math.max(this.from.col, this.to.col));\n    }\n\n    /**\n     * Get bottom left corner of this range\n     *\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getBottomLeftCorner',\n    value: function getBottomLeftCorner() {\n      return new _coords2.default(Math.max(this.from.row, this.to.row), Math.min(this.from.col, this.to.col));\n    }\n\n    /**\n     * @param {CellCoords} coords\n     * @param {CellRange} expandedRange\n     * @returns {*}\n     */\n\n  }, {\n    key: 'isCorner',\n    value: function isCorner(coords, expandedRange) {\n      if (expandedRange && expandedRange.includes(coords) && (this.getTopLeftCorner().isEqual(new _coords2.default(expandedRange.from.row, expandedRange.from.col)) || this.getTopRightCorner().isEqual(new _coords2.default(expandedRange.from.row, expandedRange.to.col)) || this.getBottomLeftCorner().isEqual(new _coords2.default(expandedRange.to.row, expandedRange.from.col)) || this.getBottomRightCorner().isEqual(new _coords2.default(expandedRange.to.row, expandedRange.to.col)))) {\n        return true;\n      }\n\n      return coords.isEqual(this.getTopLeftCorner()) || coords.isEqual(this.getTopRightCorner()) || coords.isEqual(this.getBottomLeftCorner()) || coords.isEqual(this.getBottomRightCorner());\n    }\n\n    /**\n     * @param {CellCoords} coords\n     * @param {CellRange} expandedRange\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'getOppositeCorner',\n    value: function getOppositeCorner(coords, expandedRange) {\n      if (!(coords instanceof _coords2.default)) {\n        return false;\n      }\n\n      if (expandedRange) {\n        if (expandedRange.includes(coords)) {\n          if (this.getTopLeftCorner().isEqual(new _coords2.default(expandedRange.from.row, expandedRange.from.col))) {\n            return this.getBottomRightCorner();\n          }\n          if (this.getTopRightCorner().isEqual(new _coords2.default(expandedRange.from.row, expandedRange.to.col))) {\n            return this.getBottomLeftCorner();\n          }\n          if (this.getBottomLeftCorner().isEqual(new _coords2.default(expandedRange.to.row, expandedRange.from.col))) {\n            return this.getTopRightCorner();\n          }\n          if (this.getBottomRightCorner().isEqual(new _coords2.default(expandedRange.to.row, expandedRange.to.col))) {\n            return this.getTopLeftCorner();\n          }\n        }\n      }\n\n      if (coords.isEqual(this.getBottomRightCorner())) {\n        return this.getTopLeftCorner();\n      } else if (coords.isEqual(this.getTopLeftCorner())) {\n        return this.getBottomRightCorner();\n      } else if (coords.isEqual(this.getTopRightCorner())) {\n        return this.getBottomLeftCorner();\n      } else if (coords.isEqual(this.getBottomLeftCorner())) {\n        return this.getTopRightCorner();\n      }\n    }\n\n    /**\n     * @param {CellRange} range\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getBordersSharedWith',\n    value: function getBordersSharedWith(range) {\n      if (!this.includesRange(range)) {\n        return [];\n      }\n\n      var thisBorders = {\n        top: Math.min(this.from.row, this.to.row),\n        bottom: Math.max(this.from.row, this.to.row),\n        left: Math.min(this.from.col, this.to.col),\n        right: Math.max(this.from.col, this.to.col)\n      };\n      var rangeBorders = {\n        top: Math.min(range.from.row, range.to.row),\n        bottom: Math.max(range.from.row, range.to.row),\n        left: Math.min(range.from.col, range.to.col),\n        right: Math.max(range.from.col, range.to.col)\n      };\n      var result = [];\n\n      if (thisBorders.top == rangeBorders.top) {\n        result.push('top');\n      }\n      if (thisBorders.right == rangeBorders.right) {\n        result.push('right');\n      }\n      if (thisBorders.bottom == rangeBorders.bottom) {\n        result.push('bottom');\n      }\n      if (thisBorders.left == rangeBorders.left) {\n        result.push('left');\n      }\n\n      return result;\n    }\n\n    /**\n     * Get inner selected cell coords defined by this range\n     *\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getInner',\n    value: function getInner() {\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n      var out = [];\n\n      for (var r = topLeft.row; r <= bottomRight.row; r++) {\n        for (var c = topLeft.col; c <= bottomRight.col; c++) {\n          if (!(this.from.row === r && this.from.col === c) && !(this.to.row === r && this.to.col === c)) {\n            out.push(new _coords2.default(r, c));\n          }\n        }\n      }\n      return out;\n    }\n\n    /**\n     * Get all selected cell coords defined by this range\n     *\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getAll',\n    value: function getAll() {\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n      var out = [];\n\n      for (var r = topLeft.row; r <= bottomRight.row; r++) {\n        for (var c = topLeft.col; c <= bottomRight.col; c++) {\n          if (topLeft.row === r && topLeft.col === c) {\n            out.push(topLeft);\n          } else if (bottomRight.row === r && bottomRight.col === c) {\n            out.push(bottomRight);\n          } else {\n            out.push(new _coords2.default(r, c));\n          }\n        }\n      }\n\n      return out;\n    }\n\n    /**\n     * Runs a callback function against all cells in the range. You can break the iteration by returning\n     * `false` in the callback function\n     *\n     * @param callback {Function}\n     */\n\n  }, {\n    key: 'forAll',\n    value: function forAll(callback) {\n      var topLeft = this.getTopLeftCorner();\n      var bottomRight = this.getBottomRightCorner();\n\n      for (var r = topLeft.row; r <= bottomRight.row; r++) {\n        for (var c = topLeft.col; c <= bottomRight.col; c++) {\n          var breakIteration = callback(r, c);\n\n          if (breakIteration === false) {\n            return;\n          }\n        }\n      }\n    }\n\n    /**\n     * Convert CellRange to literal object.\n     *\n     * @return {Object} Returns a literal object with `from` and `to` properties which each of that object\n     *                  contains `row` and `col` keys.\n     */\n\n  }, {\n    key: 'toObject',\n    value: function toObject() {\n      return {\n        from: this.from.toObject(),\n        to: this.to.toObject()\n      };\n    }\n  }]);\n\n  return CellRange;\n}();\n\nexports.default = CellRange;\n\n/***/ }),\n/* 87 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getRegisteredCellTypes = exports.getRegisteredCellTypeNames = exports.hasCellType = exports.getCellType = exports.registerCellType = undefined;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar _autocompleteType = __webpack_require__(254);\n\nvar _autocompleteType2 = _interopRequireDefault(_autocompleteType);\n\nvar _checkboxType = __webpack_require__(255);\n\nvar _checkboxType2 = _interopRequireDefault(_checkboxType);\n\nvar _dateType = __webpack_require__(256);\n\nvar _dateType2 = _interopRequireDefault(_dateType);\n\nvar _dropdownType = __webpack_require__(257);\n\nvar _dropdownType2 = _interopRequireDefault(_dropdownType);\n\nvar _handsontableType = __webpack_require__(258);\n\nvar _handsontableType2 = _interopRequireDefault(_handsontableType);\n\nvar _numericType = __webpack_require__(259);\n\nvar _numericType2 = _interopRequireDefault(_numericType);\n\nvar _passwordType = __webpack_require__(260);\n\nvar _passwordType2 = _interopRequireDefault(_passwordType);\n\nvar _textType = __webpack_require__(261);\n\nvar _textType2 = _interopRequireDefault(_textType);\n\nvar _timeType = __webpack_require__(262);\n\nvar _timeType2 = _interopRequireDefault(_timeType);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _staticRegister = (0, _staticRegister3.default)('cellTypes'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem,\n    hasItem = _staticRegister.hasItem,\n    getNames = _staticRegister.getNames,\n    getValues = _staticRegister.getValues;\n\n_register('autocomplete', _autocompleteType2.default);\n_register('checkbox', _checkboxType2.default);\n_register('date', _dateType2.default);\n_register('dropdown', _dropdownType2.default);\n_register('handsontable', _handsontableType2.default);\n_register('numeric', _numericType2.default);\n_register('password', _passwordType2.default);\n_register('text', _textType2.default);\n_register('time', _timeType2.default);\n\n/**\n * Retrieve cell type object.\n *\n * @param {String} name Cell type identification.\n * @returns {Object} Returns cell type object.\n */\nfunction _getItem(name) {\n  if (!hasItem(name)) {\n    throw Error('You declared cell type \"' + name + '\" as a string that is not mapped to a known object.\\n                 Cell type must be an object or a string mapped to an object registered by \"Handsontable.cellTypes.registerCellType\" method');\n  }\n\n  return getItem(name);\n}\n\n/**\n * Register cell type under specified name.\n *\n * @param {String} name Cell type identification.\n * @param {Object} type An object with contains keys (eq: `editor`, `renderer`, `validator`) which describes specified behaviour of the cell.\n */\nfunction _register(name, type) {\n  var editor = type.editor,\n      renderer = type.renderer,\n      validator = type.validator;\n\n\n  if (editor) {\n    (0, _editors.registerEditor)(name, editor);\n  }\n  if (renderer) {\n    (0, _renderers.registerRenderer)(name, renderer);\n  }\n  if (validator) {\n    (0, _validators.registerValidator)(name, validator);\n  }\n\n  register(name, type);\n}\n\nexports.registerCellType = _register;\nexports.getCellType = _getItem;\nexports.hasCellType = hasItem;\nexports.getRegisteredCellTypeNames = getNames;\nexports.getRegisteredCellTypes = getValues;\n\n/***/ }),\n/* 88 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['Deprecation warning: This method is going to be removed in the next release. \\n      If you want to select a cell using props, please use the `selectCell` method.'], ['Deprecation warning: This method is going to be removed in the next release.\\\\x20\\n      If you want to select a cell using props, please use the \\\\`selectCell\\\\` method.']);\n\nexports.default = Core;\n\nvar _element = __webpack_require__(0);\n\nvar _setting = __webpack_require__(89);\n\nvar _function = __webpack_require__(42);\n\nvar _console = __webpack_require__(56);\n\nvar _mixed = __webpack_require__(16);\n\nvar _browser = __webpack_require__(27);\n\nvar _dataMap = __webpack_require__(263);\n\nvar _dataMap2 = _interopRequireDefault(_dataMap);\n\nvar _editorManager = __webpack_require__(266);\n\nvar _editorManager2 = _interopRequireDefault(_editorManager);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _templateLiteralTag = __webpack_require__(41);\n\nvar _plugins = __webpack_require__(8);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar _string = __webpack_require__(36);\n\nvar _number = __webpack_require__(5);\n\nvar _tableView = __webpack_require__(267);\n\nvar _tableView2 = _interopRequireDefault(_tableView);\n\nvar _dataSource = __webpack_require__(268);\n\nvar _dataSource2 = _interopRequireDefault(_dataSource);\n\nvar _data = __webpack_require__(90);\n\nvar _recordTranslator = __webpack_require__(193);\n\nvar _rootInstance = __webpack_require__(194);\n\nvar _src = __webpack_require__(4);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _defaultSettings = __webpack_require__(195);\n\nvar _defaultSettings2 = _interopRequireDefault(_defaultSettings);\n\nvar _cellTypes = __webpack_require__(87);\n\nvar _i18n = __webpack_require__(196);\n\nvar _dictionariesManager = __webpack_require__(71);\n\nvar _utils = __webpack_require__(197);\n\nvar _keyStateObserver = __webpack_require__(198);\n\nvar _selection = __webpack_require__(272);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar activeGuid = null;\n\n/**\n * Handsontable constructor\n *\n * @core\n * @constructor Core\n * @description\n *\n * After Handsontable is constructed, you can modify the grid behavior using the available public methods.\n *\n * ---\n * ## How to call methods\n *\n * These are 2 equal ways to call a Handsontable method:\n *\n * ```js\n * // all following examples assume that you constructed Handsontable like this\n * var ht = new Handsontable(document.getElementById('example1'), options);\n *\n * // now, to use setDataAtCell method, you can either:\n * ht.setDataAtCell(0, 0, 'new value');\n * ```\n *\n * Alternatively, you can call the method using jQuery wrapper (__obsolete__, requires initialization using our jQuery guide\n * ```js\n *   $('#example1').handsontable('setDataAtCell', 0, 0, 'new value');\n * ```\n * ---\n */\nfunction Core(rootElement, userSettings) {\n  var _this = this;\n\n  var rootInstanceSymbol = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n  var priv,\n      datamap,\n      dataSource,\n      grid,\n      editorManager,\n      preventScrollingToCell = false,\n      instance = this,\n      GridSettings = function GridSettings() {},\n      eventManager = new _eventManager2.default(instance);\n\n  (0, _object.extend)(GridSettings.prototype, _defaultSettings2.default.prototype); // create grid settings as a copy of default settings\n  (0, _object.extend)(GridSettings.prototype, userSettings); // overwrite defaults with user settings\n  (0, _object.extend)(GridSettings.prototype, expandType(userSettings));\n\n  (0, _utils.applyLanguageSetting)(GridSettings.prototype, userSettings.language);\n\n  if ((0, _rootInstance.hasValidParameter)(rootInstanceSymbol)) {\n    (0, _rootInstance.registerAsRootInstance)(this);\n  }\n\n  (0, _keyStateObserver.startObserving)();\n\n  this.rootElement = rootElement;\n  this.isHotTableEnv = (0, _element.isChildOfWebComponentTable)(this.rootElement);\n  _eventManager2.default.isHotTableEnv = this.isHotTableEnv;\n\n  this.container = document.createElement('div');\n  this.renderCall = false;\n\n  rootElement.insertBefore(this.container, rootElement.firstChild);\n\n  if (false) {\n    (0, _mixed._injectProductInfo)(userSettings.licenseKey, rootElement);\n  }\n\n  this.guid = 'ht_' + (0, _string.randomString)(); // this is the namespace for global events\n\n  var recordTranslator = (0, _recordTranslator.getTranslator)(instance);\n\n  dataSource = new _dataSource2.default(instance);\n\n  if (!this.rootElement.id || this.rootElement.id.substring(0, 3) === 'ht_') {\n    this.rootElement.id = this.guid; // if root element does not have an id, assign a random id\n  }\n  priv = {\n    cellSettings: [],\n    columnSettings: [],\n    columnsSettingConflicts: ['data', 'width', 'language'],\n    settings: new GridSettings(), // current settings instance\n    selRange: null, // exposed by public method `getSelectedRange`\n    isPopulated: null,\n    scrollable: null,\n    firstRun: true\n  };\n\n  var selection = new _selection.Selection(priv.settings, {\n    countCols: function countCols() {\n      return instance.countCols();\n    },\n    countRows: function countRows() {\n      return instance.countRows();\n    },\n    propToCol: function propToCol(prop) {\n      return datamap.propToCol(prop);\n    },\n    isEditorOpened: function isEditorOpened() {\n      return instance.getActiveEditor() ? instance.getActiveEditor().isOpened() : false;\n    }\n  });\n\n  this.selection = selection;\n\n  this.selection.addLocalHook('beforeSetRangeStart', function (cellCoords) {\n    _this.runHooks('beforeSetRangeStart', cellCoords);\n  });\n\n  this.selection.addLocalHook('beforeSetRangeStartOnly', function (cellCoords) {\n    _this.runHooks('beforeSetRangeStartOnly', cellCoords);\n  });\n\n  this.selection.addLocalHook('beforeSetRangeEnd', function (cellCoords) {\n    _this.runHooks('beforeSetRangeEnd', cellCoords);\n\n    if (cellCoords.row < 0) {\n      cellCoords.row = _this.view.wt.wtTable.getFirstVisibleRow();\n    }\n    if (cellCoords.col < 0) {\n      cellCoords.col = _this.view.wt.wtTable.getFirstVisibleColumn();\n    }\n  });\n\n  this.selection.addLocalHook('afterSetRangeEnd', function (cellCoords) {\n    var preventScrolling = (0, _object.createObjectPropListener)(false);\n    var selectionRange = _this.selection.getSelectedRange();\n\n    var _selectionRange$curre = selectionRange.current(),\n        from = _selectionRange$curre.from,\n        to = _selectionRange$curre.to;\n\n    var selectionLayerLevel = selectionRange.size() - 1;\n\n    _this.runHooks('afterSelection', from.row, from.col, to.row, to.col, preventScrolling, selectionLayerLevel);\n    _this.runHooks('afterSelectionByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), preventScrolling, selectionLayerLevel);\n\n    var isSelectedByAnyHeader = _this.selection.isSelectedByAnyHeader();\n    var currentSelectedRange = _this.selection.selectedRange.current();\n\n    var scrollToCell = true;\n\n    if (preventScrollingToCell) {\n      scrollToCell = false;\n    }\n\n    if (preventScrolling.isTouched()) {\n      scrollToCell = !preventScrolling.value;\n    }\n\n    if (scrollToCell !== false && !isSelectedByAnyHeader) {\n      if (currentSelectedRange && !_this.selection.isMultiple()) {\n        _this.view.scrollViewport(currentSelectedRange.from);\n      } else {\n        _this.view.scrollViewport(cellCoords);\n      }\n    }\n\n    var isSelectedByRowHeader = _this.selection.isSelectedByRowHeader();\n    var isSelectedByColumnHeader = _this.selection.isSelectedByColumnHeader();\n\n    // @TODO: These CSS classes are no longer needed anymore. They are used only as a indicator of the selected\n    // rows/columns in the MergedCells plugin (via border.js#L520 in the walkontable module). After fixing\n    // the Border class this should be removed.\n    if (isSelectedByRowHeader && isSelectedByColumnHeader) {\n      (0, _element.addClass)(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);\n    } else if (isSelectedByRowHeader) {\n      (0, _element.removeClass)(_this.rootElement, 'ht__selection--columns');\n      (0, _element.addClass)(_this.rootElement, 'ht__selection--rows');\n    } else if (isSelectedByColumnHeader) {\n      (0, _element.removeClass)(_this.rootElement, 'ht__selection--rows');\n      (0, _element.addClass)(_this.rootElement, 'ht__selection--columns');\n    } else {\n      (0, _element.removeClass)(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);\n    }\n\n    _this._refreshBorders(null);\n  });\n\n  this.selection.addLocalHook('afterSelectionFinished', function (cellRanges) {\n    var selectionLayerLevel = cellRanges.length - 1;\n    var _cellRanges$selection = cellRanges[selectionLayerLevel],\n        from = _cellRanges$selection.from,\n        to = _cellRanges$selection.to;\n\n\n    _this.runHooks('afterSelectionEnd', from.row, from.col, to.row, to.col, selectionLayerLevel);\n    _this.runHooks('afterSelectionEndByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), selectionLayerLevel);\n  });\n\n  this.selection.addLocalHook('afterIsMultipleSelection', function (isMultiple) {\n    var changedIsMultiple = _this.runHooks('afterIsMultipleSelection', isMultiple.value);\n\n    if (isMultiple.value) {\n      isMultiple.value = changedIsMultiple;\n    }\n  });\n\n  this.selection.addLocalHook('beforeModifyTransformStart', function (cellCoordsDelta) {\n    _this.runHooks('modifyTransformStart', cellCoordsDelta);\n  });\n  this.selection.addLocalHook('afterModifyTransformStart', function (coords, rowTransformDir, colTransformDir) {\n    _this.runHooks('afterModifyTransformStart', coords, rowTransformDir, colTransformDir);\n  });\n  this.selection.addLocalHook('beforeModifyTransformEnd', function (cellCoordsDelta) {\n    _this.runHooks('modifyTransformEnd', cellCoordsDelta);\n  });\n  this.selection.addLocalHook('afterModifyTransformEnd', function (coords, rowTransformDir, colTransformDir) {\n    _this.runHooks('afterModifyTransformEnd', coords, rowTransformDir, colTransformDir);\n  });\n  this.selection.addLocalHook('afterDeselect', function () {\n    editorManager.destroyEditor();\n\n    _this._refreshBorders();\n    (0, _element.removeClass)(_this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);\n\n    _this.runHooks('afterDeselect');\n  });\n  this.selection.addLocalHook('insertRowRequire', function (totalRows) {\n    _this.alter('insert_row', totalRows, 1, 'auto');\n  });\n  this.selection.addLocalHook('insertColRequire', function (totalCols) {\n    _this.alter('insert_col', totalCols, 1, 'auto');\n  });\n\n  grid = {\n    /**\n     * Inserts or removes rows and columns.\n     *\n     * @memberof Core#\n     * @function alter\n     * @private\n     * @param {String} action Possible values: \"insert_row\", \"insert_col\", \"remove_row\", \"remove_col\".\n     * @param {Number|Array} index Row or column visual index which from the alter action will be triggered.\n     *                             Alter actions such as \"remove_row\" and \"remove_col\" support array indexes in the\n     *                             format `[[index, amount], [index, amount]...]` this can be used to remove\n     *                             non-consecutive columns or rows in one call.\n     * @param {Number} amount Ammount rows or columns to remove.\n     * @param {String} [source] Optional. Source of hook runner.\n     * @param {Boolean} [keepEmptyRows] Optional. Flag for preventing deletion of empty rows.\n     */\n    alter: function alter(action, index, amount, source, keepEmptyRows) {\n      var delta;\n\n      amount = amount || 1;\n\n      function spliceWith(data, index, count, toInject) {\n        var valueFactory = function valueFactory() {\n          var result = void 0;\n\n          if (toInject === 'array') {\n            result = [];\n          } else if (toInject === 'object') {\n            result = {};\n          }\n\n          return result;\n        };\n        var spliceArgs = (0, _array.arrayMap)(new Array(count), function () {\n          return valueFactory();\n        });\n\n        spliceArgs.unshift(index, 0);\n        data.splice.apply(data, _toConsumableArray(spliceArgs));\n      }\n\n      var normalizeIndexesGroup = function normalizeIndexesGroup(indexes) {\n        if (indexes.length === 0) {\n          return [];\n        }\n\n        var sortedIndexes = [].concat(_toConsumableArray(indexes));\n\n        // Sort the indexes in ascending order.\n        sortedIndexes.sort(function (_ref, _ref2) {\n          var _ref4 = _slicedToArray(_ref, 1),\n              indexA = _ref4[0];\n\n          var _ref3 = _slicedToArray(_ref2, 1),\n              indexB = _ref3[0];\n\n          if (indexA === indexB) {\n            return 0;\n          }\n\n          return indexA > indexB ? 1 : -1;\n        });\n\n        // Normalize the {index, amount} groups into bigger groups.\n        var normalizedIndexes = (0, _array.arrayReduce)(sortedIndexes, function (acc, _ref5) {\n          var _ref6 = _slicedToArray(_ref5, 2),\n              index = _ref6[0],\n              amount = _ref6[1];\n\n          var previousItem = acc[acc.length - 1];\n\n          var _previousItem = _slicedToArray(previousItem, 2),\n              prevIndex = _previousItem[0],\n              prevAmount = _previousItem[1];\n\n          var prevLastIndex = prevIndex + prevAmount;\n\n          if (index <= prevLastIndex) {\n            var amountToAdd = Math.max(amount - (prevLastIndex - index), 0);\n\n            previousItem[1] += amountToAdd;\n          } else {\n            acc.push([index, amount]);\n          }\n\n          return acc;\n        }, [sortedIndexes[0]]);\n\n        return normalizedIndexes;\n      };\n\n      /* eslint-disable no-case-declarations */\n      switch (action) {\n        case 'insert_row':\n\n          var numberOfSourceRows = instance.countSourceRows();\n\n          if (instance.getSettings().maxRows === numberOfSourceRows) {\n            return;\n          }\n\n          index = (0, _mixed.isDefined)(index) ? index : numberOfSourceRows;\n\n          delta = datamap.createRow(index, amount, source);\n          spliceWith(priv.cellSettings, index, amount, 'array');\n\n          if (delta) {\n            if (selection.isSelected() && selection.selectedRange.current().from.row >= index) {\n              selection.selectedRange.current().from.row += delta;\n              selection.transformEnd(delta, 0); // will call render() internally\n            } else {\n              instance._refreshBorders(); // it will call render and prepare methods\n            }\n          }\n          break;\n\n        case 'insert_col':\n          delta = datamap.createCol(index, amount, source);\n\n          for (var row = 0, len = instance.countSourceRows(); row < len; row++) {\n            if (priv.cellSettings[row]) {\n              spliceWith(priv.cellSettings[row], index, amount);\n            }\n          }\n\n          if (delta) {\n            if (Array.isArray(instance.getSettings().colHeaders)) {\n              var spliceArray = [index, 0];\n              spliceArray.length += delta; // inserts empty (undefined) elements at the end of an array\n              Array.prototype.splice.apply(instance.getSettings().colHeaders, spliceArray); // inserts empty (undefined) elements into the colHeader array\n            }\n\n            if (selection.isSelected() && selection.selectedRange.current().from.col >= index) {\n              selection.selectedRange.current().from.col += delta;\n              selection.transformEnd(0, delta); // will call render() internally\n            } else {\n              instance._refreshBorders(); // it will call render and prepare methods\n            }\n          }\n          break;\n\n        case 'remove_row':\n\n          var removeRow = function removeRow(indexes) {\n            var offset = 0;\n\n            (0, _array.arrayEach)(indexes, function (_ref7) {\n              var _ref8 = _slicedToArray(_ref7, 2),\n                  index = _ref8[0],\n                  amount = _ref8[1];\n\n              var calcIndex = (0, _mixed.isEmpty)(index) ? instance.countRows() - 1 : Math.max(index - offset, 0);\n\n              // If the 'index' is an integer decrease it by 'offset' otherwise pass it through to make the value\n              // compatible with datamap.removeCol method.\n              if (Number.isInteger(index)) {\n                index = Math.max(index - offset, 0);\n              }\n\n              // TODO: for datamap.removeRow index should be passed as it is (with undefined and null values). If not, the logic\n              // inside the datamap.removeRow breaks the removing functionality.\n              datamap.removeRow(index, amount, source);\n              priv.cellSettings.splice(calcIndex, amount);\n\n              var totalRows = instance.countRows();\n              var fixedRowsTop = instance.getSettings().fixedRowsTop;\n\n              if (fixedRowsTop >= calcIndex + 1) {\n                instance.getSettings().fixedRowsTop -= Math.min(amount, fixedRowsTop - calcIndex);\n              }\n\n              var fixedRowsBottom = instance.getSettings().fixedRowsBottom;\n\n              if (fixedRowsBottom && calcIndex >= totalRows - fixedRowsBottom) {\n                instance.getSettings().fixedRowsBottom -= Math.min(amount, fixedRowsBottom);\n              }\n\n              offset += amount;\n            });\n          };\n\n          if (Array.isArray(index)) {\n            removeRow(normalizeIndexesGroup(index));\n          } else {\n            removeRow([[index, amount]]);\n          }\n\n          grid.adjustRowsAndCols();\n          instance._refreshBorders(); // it will call render and prepare methods\n          break;\n\n        case 'remove_col':\n\n          var removeCol = function removeCol(indexes) {\n            var offset = 0;\n\n            (0, _array.arrayEach)(indexes, function (_ref9) {\n              var _ref10 = _slicedToArray(_ref9, 2),\n                  index = _ref10[0],\n                  amount = _ref10[1];\n\n              var calcIndex = (0, _mixed.isEmpty)(index) ? instance.countCols() - 1 : Math.max(index - offset, 0);\n\n              var visualColumnIndex = recordTranslator.toPhysicalColumn(calcIndex);\n\n              // If the 'index' is an integer decrease it by 'offset' otherwise pass it through to make the value\n              // compatible with datamap.removeCol method.\n              if (Number.isInteger(index)) {\n                index = Math.max(index - offset, 0);\n              }\n\n              // TODO: for datamap.removeCol index should be passed as it is (with undefined and null values). If not, the logic\n              // inside the datamap.removeCol breaks the removing functionality.\n              datamap.removeCol(index, amount, source);\n\n              for (var _row = 0, _len = instance.countSourceRows(); _row < _len; _row++) {\n                if (priv.cellSettings[_row]) {\n                  // if row hasn't been rendered it wouldn't have cellSettings\n                  priv.cellSettings[_row].splice(visualColumnIndex, amount);\n                }\n              }\n              var fixedColumnsLeft = instance.getSettings().fixedColumnsLeft;\n\n              if (fixedColumnsLeft >= calcIndex + 1) {\n                instance.getSettings().fixedColumnsLeft -= Math.min(amount, fixedColumnsLeft - calcIndex);\n              }\n\n              if (Array.isArray(instance.getSettings().colHeaders)) {\n                if (typeof visualColumnIndex === 'undefined') {\n                  visualColumnIndex = -1;\n                }\n                instance.getSettings().colHeaders.splice(visualColumnIndex, amount);\n              }\n\n              offset += amount;\n            });\n          };\n\n          if (Array.isArray(index)) {\n            removeCol(normalizeIndexesGroup(index));\n          } else {\n            removeCol([[index, amount]]);\n          }\n\n          grid.adjustRowsAndCols();\n          instance._refreshBorders(); // it will call render and prepare methods\n\n          break;\n        default:\n          throw new Error('There is no such action \"' + action + '\"');\n      }\n\n      if (!keepEmptyRows) {\n        grid.adjustRowsAndCols(); // makes sure that we did not add rows that will be removed in next refresh\n      }\n    },\n\n\n    /**\n     * Makes sure there are empty rows at the bottom of the table\n     */\n    adjustRowsAndCols: function adjustRowsAndCols() {\n      if (priv.settings.minRows) {\n        // should I add empty rows to data source to meet minRows?\n        var rows = instance.countRows();\n\n        if (rows < priv.settings.minRows) {\n          for (var r = 0, minRows = priv.settings.minRows; r < minRows - rows; r++) {\n            datamap.createRow(instance.countRows(), 1, 'auto');\n          }\n        }\n      }\n      if (priv.settings.minSpareRows) {\n        var emptyRows = instance.countEmptyRows(true);\n\n        // should I add empty rows to meet minSpareRows?\n        if (emptyRows < priv.settings.minSpareRows) {\n          for (; emptyRows < priv.settings.minSpareRows && instance.countSourceRows() < priv.settings.maxRows; emptyRows++) {\n            datamap.createRow(instance.countRows(), 1, 'auto');\n          }\n        }\n      }\n      {\n        var emptyCols = void 0;\n\n        // count currently empty cols\n        if (priv.settings.minCols || priv.settings.minSpareCols) {\n          emptyCols = instance.countEmptyCols(true);\n        }\n\n        // should I add empty cols to meet minCols?\n        if (priv.settings.minCols && !priv.settings.columns && instance.countCols() < priv.settings.minCols) {\n          for (; instance.countCols() < priv.settings.minCols; emptyCols++) {\n            datamap.createCol(instance.countCols(), 1, 'auto');\n          }\n        }\n        // should I add empty cols to meet minSpareCols?\n        if (priv.settings.minSpareCols && !priv.settings.columns && instance.dataType === 'array' && emptyCols < priv.settings.minSpareCols) {\n          for (; emptyCols < priv.settings.minSpareCols && instance.countCols() < priv.settings.maxCols; emptyCols++) {\n            datamap.createCol(instance.countCols(), 1, 'auto');\n          }\n        }\n      }\n      var rowCount = instance.countRows();\n      var colCount = instance.countCols();\n\n      if (rowCount === 0 || colCount === 0) {\n        selection.deselect();\n      }\n\n      if (selection.isSelected()) {\n        (0, _array.arrayEach)(selection.selectedRange, function (range) {\n          var selectionChanged = false;\n          var fromRow = range.from.row;\n          var fromCol = range.from.col;\n          var toRow = range.to.row;\n          var toCol = range.to.col;\n\n          // if selection is outside, move selection to last row\n          if (fromRow > rowCount - 1) {\n            fromRow = rowCount - 1;\n            selectionChanged = true;\n\n            if (toRow > fromRow) {\n              toRow = fromRow;\n            }\n          } else if (toRow > rowCount - 1) {\n            toRow = rowCount - 1;\n            selectionChanged = true;\n\n            if (fromRow > toRow) {\n              fromRow = toRow;\n            }\n          }\n          // if selection is outside, move selection to last row\n          if (fromCol > colCount - 1) {\n            fromCol = colCount - 1;\n            selectionChanged = true;\n\n            if (toCol > fromCol) {\n              toCol = fromCol;\n            }\n          } else if (toCol > colCount - 1) {\n            toCol = colCount - 1;\n            selectionChanged = true;\n\n            if (fromCol > toCol) {\n              fromCol = toCol;\n            }\n          }\n\n          if (selectionChanged) {\n            instance.selectCell(fromRow, fromCol, toRow, toCol);\n          }\n        });\n      }\n      if (instance.view) {\n        instance.view.wt.wtOverlays.adjustElementsSize();\n      }\n    },\n\n\n    /**\n     * Populate the data from the provided 2d array from the given cell coordinates.\n     *\n     * @private\n     * @param {Object} start Start selection position. Visual indexes.\n     * @param {Array} input 2d data array.\n     * @param {Object} [end] End selection position (only for drag-down mode). Visual indexes.\n     * @param {String} [source=\"populateFromArray\"] Source information string.\n     * @param {String} [method=\"overwrite\"] Populate method. Possible options: `shift_down`, `shift_right`, `overwrite`.\n     * @param {String} direction (left|right|up|down) String specifying the direction.\n     * @param {Array} deltas The deltas array. A difference between values of adjacent cells.\n     *                       Useful **only** when the type of handled cells is `numeric`.\n     * @returns {Object|undefined} ending td in pasted area (only if any cell was changed).\n     */\n    populateFromArray: function populateFromArray(start, input, end, source, method, direction, deltas) {\n      // TODO: either remove or implement the `direction` argument. Currently it's not working at all.\n      var r,\n          rlen,\n          c,\n          clen,\n          setData = [],\n          current = {};\n\n      rlen = input.length;\n\n      if (rlen === 0) {\n        return false;\n      }\n\n      var repeatCol,\n          repeatRow,\n          cmax,\n          rmax,\n          baseEnd = {\n        row: end === null ? null : end.row,\n        col: end === null ? null : end.col\n      };\n\n      /* eslint-disable no-case-declarations */\n      // insert data with specified pasteMode method\n      switch (method) {\n        case 'shift_down':\n          repeatCol = end ? end.col - start.col + 1 : 0;\n          repeatRow = end ? end.row - start.row + 1 : 0;\n          input = (0, _data.translateRowsToColumns)(input);\n          for (c = 0, clen = input.length, cmax = Math.max(clen, repeatCol); c < cmax; c++) {\n            if (c < clen) {\n              var _instance;\n\n              for (r = 0, rlen = input[c].length; r < repeatRow - rlen; r++) {\n                input[c].push(input[c][r % rlen]);\n              }\n              input[c].unshift(start.col + c, start.row, 0);\n              (_instance = instance).spliceCol.apply(_instance, _toConsumableArray(input[c]));\n            } else {\n              var _instance2;\n\n              input[c % clen][0] = start.col + c;\n              (_instance2 = instance).spliceCol.apply(_instance2, _toConsumableArray(input[c % clen]));\n            }\n          }\n          break;\n\n        case 'shift_right':\n          repeatCol = end ? end.col - start.col + 1 : 0;\n          repeatRow = end ? end.row - start.row + 1 : 0;\n          for (r = 0, rlen = input.length, rmax = Math.max(rlen, repeatRow); r < rmax; r++) {\n            if (r < rlen) {\n              var _instance3;\n\n              for (c = 0, clen = input[r].length; c < repeatCol - clen; c++) {\n                input[r].push(input[r][c % clen]);\n              }\n              input[r].unshift(start.row + r, start.col, 0);\n              (_instance3 = instance).spliceRow.apply(_instance3, _toConsumableArray(input[r]));\n            } else {\n              var _instance4;\n\n              input[r % rlen][0] = start.row + r;\n              (_instance4 = instance).spliceRow.apply(_instance4, _toConsumableArray(input[r % rlen]));\n            }\n          }\n          break;\n\n        case 'overwrite':\n        default:\n          // overwrite and other not specified options\n          current.row = start.row;\n          current.col = start.col;\n\n          var selected = { // selected range\n            row: end && start ? end.row - start.row + 1 : 1,\n            col: end && start ? end.col - start.col + 1 : 1\n          };\n          var skippedRow = 0;\n          var skippedColumn = 0;\n          var pushData = true;\n          var cellMeta = void 0;\n\n          var getInputValue = function getInputValue(row) {\n            var col = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n            var rowValue = input[row % input.length];\n\n            if (col !== null) {\n              return rowValue[col % rowValue.length];\n            }\n\n            return rowValue;\n          };\n          var rowInputLength = input.length;\n          var rowSelectionLength = end ? end.row - start.row + 1 : 0;\n\n          if (end) {\n            rlen = rowSelectionLength;\n          } else {\n            rlen = Math.max(rowInputLength, rowSelectionLength);\n          }\n          for (r = 0; r < rlen; r++) {\n            if (end && current.row > end.row && rowSelectionLength > rowInputLength || !priv.settings.allowInsertRow && current.row > instance.countRows() - 1 || current.row >= priv.settings.maxRows) {\n              break;\n            }\n            var visualRow = r - skippedRow;\n            var colInputLength = getInputValue(visualRow).length;\n            var colSelectionLength = end ? end.col - start.col + 1 : 0;\n\n            if (end) {\n              clen = colSelectionLength;\n            } else {\n              clen = Math.max(colInputLength, colSelectionLength);\n            }\n            current.col = start.col;\n            cellMeta = instance.getCellMeta(current.row, current.col);\n\n            if ((source === 'CopyPaste.paste' || source === 'Autofill.autofill') && cellMeta.skipRowOnPaste) {\n              skippedRow++;\n              current.row++;\n              rlen++;\n              /* eslint-disable no-continue */\n              continue;\n            }\n            skippedColumn = 0;\n\n            for (c = 0; c < clen; c++) {\n              if (end && current.col > end.col && colSelectionLength > colInputLength || !priv.settings.allowInsertColumn && current.col > instance.countCols() - 1 || current.col >= priv.settings.maxCols) {\n                break;\n              }\n              cellMeta = instance.getCellMeta(current.row, current.col);\n\n              if ((source === 'CopyPaste.paste' || source === 'Autofill.fill') && cellMeta.skipColumnOnPaste) {\n                skippedColumn++;\n                current.col++;\n                clen++;\n                continue;\n              }\n              if (cellMeta.readOnly) {\n                current.col++;\n                /* eslint-disable no-continue */\n                continue;\n              }\n              var visualColumn = c - skippedColumn;\n              var value = getInputValue(visualRow, visualColumn);\n              var orgValue = instance.getDataAtCell(current.row, current.col);\n              var index = {\n                row: visualRow,\n                col: visualColumn\n              };\n\n              if (source === 'Autofill.fill') {\n                var result = instance.runHooks('beforeAutofillInsidePopulate', index, direction, input, deltas, {}, selected);\n\n                if (result) {\n                  value = (0, _mixed.isUndefined)(result.value) ? value : result.value;\n                }\n              }\n              if (value !== null && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') {\n                if (orgValue === null || (typeof orgValue === 'undefined' ? 'undefined' : _typeof(orgValue)) !== 'object') {\n                  pushData = false;\n                } else {\n                  var orgValueSchema = (0, _object.duckSchema)(orgValue[0] || orgValue);\n                  var valueSchema = (0, _object.duckSchema)(value[0] || value);\n\n                  /* eslint-disable max-depth */\n                  if ((0, _object.isObjectEqual)(orgValueSchema, valueSchema)) {\n                    value = (0, _object.deepClone)(value);\n                  } else {\n                    pushData = false;\n                  }\n                }\n              } else if (orgValue !== null && (typeof orgValue === 'undefined' ? 'undefined' : _typeof(orgValue)) === 'object') {\n                pushData = false;\n              }\n              if (pushData) {\n                setData.push([current.row, current.col, value]);\n              }\n              pushData = true;\n              current.col++;\n            }\n            current.row++;\n          }\n          instance.setDataAtCell(setData, null, null, source || 'populateFromArray');\n          break;\n      }\n    }\n  };\n\n  /**\n   * Internal function to set `language` key of settings.\n   *\n   * @private\n   * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'\n   * @fires Hooks#afterLanguageChange\n   */\n  function setLanguage(languageCode) {\n    var normalizedLanguageCode = (0, _utils.normalizeLanguageCode)(languageCode);\n\n    if ((0, _dictionariesManager.hasLanguageDictionary)(normalizedLanguageCode)) {\n      instance.runHooks('beforeLanguageChange', normalizedLanguageCode);\n\n      GridSettings.prototype.language = normalizedLanguageCode;\n\n      instance.runHooks('afterLanguageChange', normalizedLanguageCode);\n    } else {\n      (0, _utils.warnUserAboutLanguageRegistration)(languageCode);\n    }\n  }\n\n  this.init = function () {\n    dataSource.setData(priv.settings.data);\n    instance.runHooks('beforeInit');\n\n    if ((0, _browser.isMobileBrowser)()) {\n      (0, _element.addClass)(instance.rootElement, 'mobile');\n    }\n\n    this.updateSettings(priv.settings, true);\n\n    this.view = new _tableView2.default(this);\n    editorManager = _editorManager2.default.getInstance(instance, priv, selection, datamap);\n\n    this.forceFullRender = true; // used when data was changed\n\n    instance.runHooks('init');\n    this.view.render();\n\n    if (_typeof(priv.firstRun) === 'object') {\n      instance.runHooks('afterChange', priv.firstRun[0], priv.firstRun[1]);\n      priv.firstRun = false;\n    }\n    instance.runHooks('afterInit');\n  };\n\n  function ValidatorsQueue() {\n    // moved this one level up so it can be used in any function here. Probably this should be moved to a separate file\n    var resolved = false;\n\n    return {\n      validatorsInQueue: 0,\n      valid: true,\n      addValidatorToQueue: function addValidatorToQueue() {\n        this.validatorsInQueue++;\n        resolved = false;\n      },\n      removeValidatorFormQueue: function removeValidatorFormQueue() {\n        this.validatorsInQueue = this.validatorsInQueue - 1 < 0 ? 0 : this.validatorsInQueue - 1;\n        this.checkIfQueueIsEmpty();\n      },\n      onQueueEmpty: function onQueueEmpty(valid) {},\n      checkIfQueueIsEmpty: function checkIfQueueIsEmpty() {\n        if (this.validatorsInQueue == 0 && resolved == false) {\n          resolved = true;\n          this.onQueueEmpty(this.valid);\n        }\n      }\n    };\n  }\n\n  /**\n   * Get parsed number from numeric string.\n   *\n   * @private\n   * @param {String} numericData Float (separated by a dot or a comma) or integer.\n   * @returns {Number} Number if we get data in parsable format, not changed value otherwise.\n   */\n  function getParsedNumber(numericData) {\n    // Unifying \"float like\" string. Change from value with comma determiner to value with dot determiner,\n    // for example from `450,65` to `450.65`.\n    var unifiedNumericData = numericData.replace(',', '.');\n\n    if (isNaN(parseFloat(unifiedNumericData)) === false) {\n      return parseFloat(unifiedNumericData);\n    }\n\n    return numericData;\n  }\n\n  function validateChanges(changes, source, callback) {\n    var waitingForValidator = new ValidatorsQueue();\n    var isNumericData = function isNumericData(value) {\n      return value.length > 0 && /^-?[\\d\\s]*(\\.|,)?\\d*$/.test(value);\n    };\n\n    waitingForValidator.onQueueEmpty = resolve;\n\n    for (var i = changes.length - 1; i >= 0; i--) {\n      if (changes[i] === null) {\n        changes.splice(i, 1);\n      } else {\n        var _changes$i = _slicedToArray(changes[i], 4),\n            row = _changes$i[0],\n            prop = _changes$i[1],\n            newValue = _changes$i[3];\n\n        var col = datamap.propToCol(prop);\n        var cellProperties = instance.getCellMeta(row, col);\n\n        if (cellProperties.type === 'numeric' && typeof newValue === 'string' && isNumericData(newValue)) {\n          changes[i][3] = getParsedNumber(newValue);\n        }\n\n        /* eslint-disable no-loop-func */\n        if (instance.getCellValidator(cellProperties)) {\n          waitingForValidator.addValidatorToQueue();\n          instance.validateCell(changes[i][3], cellProperties, function (i, cellProperties) {\n            return function (result) {\n              if (typeof result !== 'boolean') {\n                throw new Error('Validation error: result is not boolean');\n              }\n              if (result === false && cellProperties.allowInvalid === false) {\n                changes.splice(i, 1); // cancel the change\n                cellProperties.valid = true; // we cancelled the change, so cell value is still valid\n                var cell = instance.getCell(cellProperties.visualRow, cellProperties.visualCol);\n                (0, _element.removeClass)(cell, instance.getSettings().invalidCellClassName);\n                --i;\n              }\n              waitingForValidator.removeValidatorFormQueue();\n            };\n          }(i, cellProperties), source);\n        }\n      }\n    }\n    waitingForValidator.checkIfQueueIsEmpty();\n\n    function resolve() {\n      var beforeChangeResult;\n\n      if (changes.length) {\n        beforeChangeResult = instance.runHooks('beforeChange', changes, source || 'edit');\n        if ((0, _function.isFunction)(beforeChangeResult)) {\n          (0, _console.warn)('Your beforeChange callback returns a function. It\\'s not supported since Handsontable 0.12.1 (and the returned function will not be executed).');\n        } else if (beforeChangeResult === false) {\n          changes.splice(0, changes.length); // invalidate all changes (remove everything from array)\n        }\n      }\n      callback(); // called when async validators are resolved and beforeChange was not async\n    }\n  }\n\n  /**\n   * Internal function to apply changes. Called after validateChanges\n   *\n   * @private\n   * @param {Array} changes Array in form of [row, prop, oldValue, newValue]\n   * @param {String} source String that identifies how this change will be described in changes array (useful in onChange callback)\n   * @fires Hooks#beforeChangeRender\n   * @fires Hooks#afterChange\n   */\n  function applyChanges(changes, source) {\n    var i = changes.length - 1;\n\n    if (i < 0) {\n      return;\n    }\n\n    for (; i >= 0; i--) {\n      var skipThisChange = false;\n\n      if (changes[i] === null) {\n        changes.splice(i, 1);\n        /* eslint-disable no-continue */\n        continue;\n      }\n\n      if (changes[i][2] == null && changes[i][3] == null) {\n        /* eslint-disable no-continue */\n        continue;\n      }\n\n      if (priv.settings.allowInsertRow) {\n        while (changes[i][0] > instance.countRows() - 1) {\n          var numberOfCreatedRows = datamap.createRow(void 0, void 0, source);\n\n          if (numberOfCreatedRows === 0) {\n            skipThisChange = true;\n            break;\n          }\n        }\n      }\n\n      if (skipThisChange) {\n        /* eslint-disable no-continue */\n        continue;\n      }\n\n      if (instance.dataType === 'array' && (!priv.settings.columns || priv.settings.columns.length === 0) && priv.settings.allowInsertColumn) {\n        while (datamap.propToCol(changes[i][1]) > instance.countCols() - 1) {\n          datamap.createCol(void 0, void 0, source);\n        }\n      }\n\n      datamap.set(changes[i][0], changes[i][1], changes[i][3]);\n    }\n\n    instance.forceFullRender = true; // used when data was changed\n    grid.adjustRowsAndCols();\n    instance.runHooks('beforeChangeRender', changes, source);\n    editorManager.lockEditor();\n    instance._refreshBorders(null);\n    editorManager.unlockEditor();\n    instance.view.wt.wtOverlays.adjustElementsSize();\n    instance.runHooks('afterChange', changes, source || 'edit');\n\n    var activeEditor = instance.getActiveEditor();\n\n    if (activeEditor && (0, _mixed.isDefined)(activeEditor.refreshValue)) {\n      activeEditor.refreshValue();\n    }\n  }\n\n  /**\n   * Validate a single cell.\n   *\n   * @param {String|Number} value\n   * @param cellProperties\n   * @param callback\n   * @param source\n   */\n  this.validateCell = function (value, cellProperties, callback, source) {\n    var validator = instance.getCellValidator(cellProperties);\n\n    // the `canBeValidated = false` argument suggests, that the cell passes validation by default.\n    function done(valid) {\n      var canBeValidated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n      // Fixes GH#3903\n      if (!canBeValidated || cellProperties.hidden === true) {\n        callback(valid);\n        return;\n      }\n\n      var col = cellProperties.visualCol,\n          row = cellProperties.visualRow,\n          td = instance.getCell(row, col, true);\n\n      if (td && td.nodeName != 'TH') {\n        instance.view.wt.wtSettings.settings.cellRenderer(row, col, td);\n      }\n      callback(valid);\n    }\n\n    if ((0, _mixed.isRegExp)(validator)) {\n      validator = function (validator) {\n        return function (value, callback) {\n          callback(validator.test(value));\n        };\n      }(validator);\n    }\n\n    if ((0, _function.isFunction)(validator)) {\n\n      value = instance.runHooks('beforeValidate', value, cellProperties.visualRow, cellProperties.prop, source);\n\n      // To provide consistent behaviour, validation should be always asynchronous\n      instance._registerTimeout(setTimeout(function () {\n        validator.call(cellProperties, value, function (valid) {\n          valid = instance.runHooks('afterValidate', valid, value, cellProperties.visualRow, cellProperties.prop, source);\n          cellProperties.valid = valid;\n\n          done(valid);\n          instance.runHooks('postAfterValidate', valid, value, cellProperties.visualRow, cellProperties.prop, source);\n        });\n      }, 0));\n    } else {\n      // resolve callback even if validator function was not found\n      instance._registerTimeout(setTimeout(function () {\n        cellProperties.valid = true;\n        done(cellProperties.valid, false);\n      }, 0));\n    }\n  };\n\n  function setDataInputToArray(row, propOrCol, value) {\n    if ((typeof row === 'undefined' ? 'undefined' : _typeof(row)) === 'object') {\n      // is it an array of changes\n      return row;\n    }\n    return [[row, propOrCol, value]];\n  }\n\n  /**\n   * @description\n   * Set new value to a cell. To change many cells at once, pass an array of `changes` in format `[[row, col, value], ...]` as\n   * the only parameter. `col` is the index of a __visible__ column (note that if columns were reordered,\n   * the current visible order will be used). `source` is a flag for before/afterChange events. If you pass only array of\n   * changes then `source` could be set as second parameter.\n   *\n   * @memberof Core#\n   * @function setDataAtCell\n   * @param {Number|Array} row Visual row index or array of changes in format `[[row, col, value], ...]`.\n   * @param {Number} col Visual column index.\n   * @param {String} value New value.\n   * @param {String} [source] String that identifies how this change will be described in the changes array (useful in onAfterChange or onBeforeChange callback).\n   */\n  this.setDataAtCell = function (row, col, value, source) {\n    var input = setDataInputToArray(row, col, value),\n        i,\n        ilen,\n        changes = [],\n        prop;\n\n    for (i = 0, ilen = input.length; i < ilen; i++) {\n      if (_typeof(input[i]) !== 'object') {\n        throw new Error('Method `setDataAtCell` accepts row number or changes array of arrays as its first parameter');\n      }\n      if (typeof input[i][1] !== 'number') {\n        throw new Error('Method `setDataAtCell` accepts row and column number as its parameters. If you want to use object property name, use method `setDataAtRowProp`');\n      }\n      prop = datamap.colToProp(input[i][1]);\n      changes.push([input[i][0], prop, dataSource.getAtCell(recordTranslator.toPhysicalRow(input[i][0]), input[i][1]), input[i][2]]);\n    }\n\n    if (!source && (typeof row === 'undefined' ? 'undefined' : _typeof(row)) === 'object') {\n      source = col;\n    }\n\n    instance.runHooks('afterSetDataAtCell', changes, source);\n\n    validateChanges(changes, source, function () {\n      applyChanges(changes, source);\n    });\n  };\n\n  /**\n   * @description\n   * Set new value to a cell. To change many cells at once, pass an array of `changes` in format `[[row, prop, value], ...]` as\n   * the only parameter. `prop` is the name of the object property (e.g. `first.name`). `source` is a flag for before/afterChange events.\n   * If you pass only array of changes then `source` could be set as second parameter.\n   *\n   * @memberof Core#\n   * @function setDataAtRowProp\n   * @param {Number|Array} row Visual row index or array of changes in format `[[row, prop, value], ...]`.\n   * @param {String} prop Property name or the source string.\n   * @param {String} value Value to be set.\n   * @param {String} [source] String that identifies how this change will be described in changes array (useful in onChange callback).\n   */\n  this.setDataAtRowProp = function (row, prop, value, source) {\n    var input = setDataInputToArray(row, prop, value),\n        i,\n        ilen,\n        changes = [];\n\n    for (i = 0, ilen = input.length; i < ilen; i++) {\n      changes.push([input[i][0], input[i][1], dataSource.getAtCell(recordTranslator.toPhysicalRow(input[i][0]), input[i][1]), input[i][2]]);\n    }\n\n    if (!source && (typeof row === 'undefined' ? 'undefined' : _typeof(row)) === 'object') {\n      source = prop;\n    }\n\n    instance.runHooks('afterSetDataAtRowProp', changes, source);\n\n    validateChanges(changes, source, function () {\n      applyChanges(changes, source);\n    });\n  };\n\n  /**\n   * Listen to the keyboard input on document body.\n   *\n   * @memberof Core#\n   * @function listen\n   * @since 0.11\n   * @param {Boolean} [modifyDocumentFocus=true] If `true`, currently focused element will be blured (which returns focus\n   *                                             to the document.body). Otherwise the active element does not lose its focus.\n   */\n  this.listen = function () {\n    var modifyDocumentFocus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n    if (modifyDocumentFocus) {\n      var invalidActiveElement = !document.activeElement || document.activeElement && document.activeElement.nodeName === void 0;\n\n      if (document.activeElement && document.activeElement !== document.body && !invalidActiveElement) {\n        document.activeElement.blur();\n      } else if (invalidActiveElement) {\n        // IE\n        document.body.focus();\n      }\n    }\n\n    if (instance && !instance.isListening()) {\n      activeGuid = instance.guid;\n      instance.runHooks('afterListen');\n    }\n  };\n\n  /**\n   * Stop listening to keyboard input on the document body.\n   *\n   * @memberof Core#\n   * @function unlisten\n   * @since 0.11\n   */\n  this.unlisten = function () {\n    if (this.isListening()) {\n      activeGuid = null;\n      instance.runHooks('afterUnlisten');\n    }\n  };\n\n  /**\n   * Returns `true` if the current Handsontable instance is listening to keyboard input on document body.\n   *\n   * @memberof Core#\n   * @function isListening\n   * @since 0.11\n   * @returns {Boolean} `true` if the instance is listening, `false` otherwise.\n   */\n  this.isListening = function () {\n    return activeGuid === instance.guid;\n  };\n\n  /**\n   * Destroys the current editor, renders and selects the current cell.\n   *\n   * @memberof Core#\n   * @function destroyEditor\n   * @param {Boolean} [revertOriginal] If != `true`, edited data is saved. Otherwise the previous value is restored.\n   */\n  this.destroyEditor = function (revertOriginal) {\n    instance._refreshBorders(revertOriginal);\n  };\n\n  /**\n   * Populate cells at position with 2D input array (e.g. `[[1, 2], [3, 4]]`).\n   * Use `endRow`, `endCol` when you want to cut input when a certain row is reached.\n   * Optional `source` parameter (default value \"populateFromArray\") is used to identify this call in the resulting events (beforeChange, afterChange).\n   * Optional `populateMethod` parameter (default value \"overwrite\", possible values \"shift_down\" and \"shift_right\")\n   * has the same effect as pasteMode option {@link Options#pasteMode}\n   *\n   * @memberof Core#\n   * @function populateFromArray\n   * @since 0.9.0\n   * @param {Number} row Start visual row index.\n   * @param {Number} col Start visual column index.\n   * @param {Array} input 2d array\n   * @param {Number} [endRow] End visual row index (use when you want to cut input when certain row is reached).\n   * @param {Number} [endCol] End visual column index (use when you want to cut input when certain column is reached).\n   * @param {String} [source=\"populateFromArray\"] Source string.\n   * @param {String} [method=\"overwrite\"] Populate method. Possible options: `shift_down`, `shift_right`, `overwrite`.\n   * @param {String} direction Populate direction. (left|right|up|down)\n   * @param {Array} deltas Deltas array.\n   * @returns {Object|undefined} The ending TD element in pasted area (only if any cells were changed).\n   */\n  this.populateFromArray = function (row, col, input, endRow, endCol, source, method, direction, deltas) {\n    var c;\n\n    if (!((typeof input === 'undefined' ? 'undefined' : _typeof(input)) === 'object' && _typeof(input[0]) === 'object')) {\n      throw new Error('populateFromArray parameter `input` must be an array of arrays'); // API changed in 0.9-beta2, let's check if you use it correctly\n    }\n    c = typeof endRow === 'number' ? new _src.CellCoords(endRow, endCol) : null;\n\n    return grid.populateFromArray(new _src.CellCoords(row, col), input, c, source, method, direction, deltas);\n  };\n\n  /**\n   * Adds/removes data from the column. This function is modelled after Array.splice.\n   * Parameter `col` is the index of the column in which do you want to do splice.\n   * Parameter `index` is the row index at which to start changing the array.\n   * If negative, will begin that many elements from the end. Parameter `amount`, is the number of the old array elements to remove.\n   * If the amount is 0, no elements are removed. Fourth and further parameters are the `elements` to add to the array.\n   * If you don't specify any elements, spliceCol simply removes elements from the array.\n   * {@link DataMap#spliceCol}\n   *\n   * @memberof Core#\n   * @function spliceCol\n   * @since 0.9-beta2\n   * @param {Number} col Index of the column in which do you want to do splice.\n   * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end.\n   * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed.\n   * @param {*} [elements] The elements to add to the array. If you don't specify any elements, spliceCol simply removes elements from the array.\n   */\n  this.spliceCol = function (col, index, amount /* , elements... */) {\n    var _datamap;\n\n    return (_datamap = datamap).spliceCol.apply(_datamap, arguments);\n  };\n\n  /**\n   * Adds/removes data from the row. This function works is modelled after Array.splice.\n   * Parameter `row` is the index of row in which do you want to do splice.\n   * Parameter `index` is the column index at which to start changing the array.\n   * If negative, will begin that many elements from the end. Parameter `amount`, is the number of old array elements to remove.\n   * If the amount is 0, no elements are removed. Fourth and further parameters are the `elements` to add to the array.\n   * If you don't specify any elements, spliceCol simply removes elements from the array.\n   * {@link DataMap#spliceRow}\n   *\n   * @memberof Core#\n   * @function spliceRow\n   * @since 0.11\n   * @param {Number} row Index of column in which do you want to do splice.\n   * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end.\n   * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed.\n   * @param {*} [elements] The elements to add to the array. If you don't specify any elements, spliceCol simply removes elements from the array.\n   */\n  this.spliceRow = function (row, index, amount /* , elements... */) {\n    var _datamap2;\n\n    return (_datamap2 = datamap).spliceRow.apply(_datamap2, arguments);\n  };\n\n  /**\n   * Returns indexes of the currently selected cells as an array of arrays `[[startRow, startCol, endRow, endCol], ...]`.\n   *\n   * Start row and start col are the coordinates of the active cell (where the selection was started).\n   *\n   * The version 0.36.0 adds a non-consecutive selection feature. Since this version, the method returns an array of arrays.\n   * Additionally to collect the coordinates of the currently selected area (as it was previously done by the method)\n   * you need to use `getSelectedLast` method.\n   *\n   * @memberof Core#\n   * @function getSelected\n   * @returns {Array[]|undefined} An array of arrays of the selection's coordinates.\n   */\n  this.getSelected = function () {\n    // https://github.com/handsontable/handsontable/issues/44  //cjl\n    if (selection.isSelected()) {\n      return (0, _array.arrayMap)(selection.getSelectedRange(), function (_ref11) {\n        var from = _ref11.from,\n            to = _ref11.to;\n        return [from.row, from.col, to.row, to.col];\n      });\n    }\n  };\n\n  /**\n   * Returns the last coordinates applied to the table as a an array `[startRow, startCol, endRow, endCol]`.\n   *\n   * @since 0.36.0\n   * @memberof Core#\n   * @function getSelectedLast\n   * @returns {Array|undefined} An array of the selection's coordinates.\n   */\n  this.getSelectedLast = function () {\n    var selected = this.getSelected();\n    var result = void 0;\n\n    if (selected && selected.length > 0) {\n      result = selected[selected.length - 1];\n    }\n\n    return result;\n  };\n\n  /**\n   * Returns the current selection as an array of CellRange objects.\n   *\n   * The version 0.36.0 adds a non-consecutive selection feature. Since this version, the method returns an array of arrays.\n   * Additionally to collect the coordinates of the currently selected area (as it was previously done by the method)\n   * you need to use `getSelectedRangeLast` method.\n   *\n   * @memberof Core#\n   * @function getSelectedRange\n   * @since 0.11\n   * @returns {CellRange[]|undefined} Selected range object or undefined` if there is no selection.\n   */\n  this.getSelectedRange = function () {\n    // https://github.com/handsontable/handsontable/issues/44  //cjl\n    if (selection.isSelected()) {\n      return Array.from(selection.getSelectedRange());\n    }\n  };\n\n  /**\n  * Returns the last coordinates applied to the table as a CellRange object.\n  *\n  * @memberof Core#\n  * @function getSelectedRangeLast\n  * @since 0.36.0\n  * @returns {CellRange|undefined} Selected range object or undefined` if there is no selection.\n   */\n  this.getSelectedRangeLast = function () {\n    var selectedRange = this.getSelectedRange();\n    var result = void 0;\n\n    if (selectedRange && selectedRange.length > 0) {\n      result = selectedRange[selectedRange.length - 1];\n    }\n\n    return result;\n  };\n\n  /**\n   * Erases content from cells that have been selected in the table.\n   *\n   * @memberof Core#\n   * @function emptySelectedCells\n   * @since 0.36.0\n   */\n  this.emptySelectedCells = function () {\n    var _this2 = this;\n\n    if (!selection.isSelected()) {\n      return;\n    }\n    var changes = [];\n\n    (0, _array.arrayEach)(selection.getSelectedRange(), function (cellRange) {\n      var topLeft = cellRange.getTopLeftCorner();\n      var bottomRight = cellRange.getBottomRightCorner();\n\n      (0, _number.rangeEach)(topLeft.row, bottomRight.row, function (row) {\n        (0, _number.rangeEach)(topLeft.col, bottomRight.col, function (column) {\n          if (!_this2.getCellMeta(row, column).readOnly) {\n            changes.push([row, column, '']);\n          }\n        });\n      });\n    });\n\n    if (changes.length > 0) {\n      this.setDataAtCell(changes);\n    }\n  };\n\n  /**\n   * Rerender the table.\n   *\n   * @memberof Core#\n   * @function render\n   */\n  this.render = function () {\n    if (instance.view) {\n      instance.renderCall = true;\n      instance.forceFullRender = true; // used when data was changed\n      editorManager.lockEditor();\n      instance._refreshBorders(null);\n      editorManager.unlockEditor();\n    }\n  };\n\n  /**\n   * Reset all cells in the grid to contain data from the data array.\n   *\n   * @memberof Core#\n   * @function loadData\n   * @param {Array} data Array of arrays or array of objects containing data.\n   * @fires Hooks#afterLoadData\n   * @fires Hooks#afterChange\n   */\n  this.loadData = function (data) {\n    if (Array.isArray(priv.settings.dataSchema)) {\n      instance.dataType = 'array';\n    } else if ((0, _function.isFunction)(priv.settings.dataSchema)) {\n      instance.dataType = 'function';\n    } else {\n      instance.dataType = 'object';\n    }\n\n    if (datamap) {\n      datamap.destroy();\n    }\n    datamap = new _dataMap2.default(instance, priv, GridSettings);\n\n    if ((typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object' && data !== null) {\n      if (!(data.push && data.splice)) {\n        // check if data is array. Must use duck-type check so Backbone Collections also pass it\n        // when data is not an array, attempt to make a single-row array of it\n        data = [data];\n      }\n    } else if (data === null) {\n      data = [];\n      var row;\n      var r = 0;\n      var rlen = 0;\n      var dataSchema = datamap.getSchema();\n\n      for (r = 0, rlen = priv.settings.startRows; r < rlen; r++) {\n        if ((instance.dataType === 'object' || instance.dataType === 'function') && priv.settings.dataSchema) {\n          row = (0, _object.deepClone)(dataSchema);\n          data.push(row);\n        } else if (instance.dataType === 'array') {\n          row = (0, _object.deepClone)(dataSchema[0]);\n          data.push(row);\n        } else {\n          row = [];\n\n          for (var c = 0, clen = priv.settings.startCols; c < clen; c++) {\n            row.push(null);\n          }\n\n          data.push(row);\n        }\n      }\n    } else {\n      throw new Error('loadData only accepts array of objects or array of arrays (' + (typeof data === 'undefined' ? 'undefined' : _typeof(data)) + ' given)');\n    }\n\n    priv.isPopulated = false;\n    GridSettings.prototype.data = data;\n\n    if (Array.isArray(data[0])) {\n      instance.dataType = 'array';\n    }\n\n    datamap.dataSource = data;\n    dataSource.data = data;\n    dataSource.dataType = instance.dataType;\n    dataSource.colToProp = datamap.colToProp.bind(datamap);\n    dataSource.propToCol = datamap.propToCol.bind(datamap);\n\n    clearCellSettingCache();\n\n    grid.adjustRowsAndCols();\n    instance.runHooks('afterLoadData', priv.firstRun);\n\n    if (priv.firstRun) {\n      priv.firstRun = [null, 'loadData'];\n    } else {\n      instance.runHooks('afterChange', null, 'loadData');\n      instance.render();\n    }\n    priv.isPopulated = true;\n\n    function clearCellSettingCache() {\n      priv.cellSettings.length = 0;\n    }\n  };\n\n  /**\n   * Returns the current data object (the same one that was passed by `data` configuration option or `loadData` method,\n   * unless the `modifyRow` hook was used to trim some of the rows. If that's the case - use the {@link Core#getSourceData} method.).\n   * Optionally you can provide cell range by defining `row`, `col`, `row2`, `col2` to get only a fragment of grid data.\n   *\n   * Note: getData functionality changed with the release of version 0.20. If you're looking for the previous functionality,\n   * you should use the {@link Core#getSourceData} method.\n   *\n   * @memberof Core#\n   * @function getData\n   * @param {Number} [r] From visual row index.\n   * @param {Number} [c] From visual column index.\n   * @param {Number} [r2] To visual row index.\n   * @param {Number} [c2] To visual column index.\n   * @returns {Array} Array with the data.\n   */\n  this.getData = function (r, c, r2, c2) {\n    if ((0, _mixed.isUndefined)(r)) {\n      return datamap.getAll();\n    }\n    return datamap.getRange(new _src.CellCoords(r, c), new _src.CellCoords(r2, c2), datamap.DESTINATION_RENDERER);\n  };\n\n  /**\n   * Returns a string value of the selected range. Each column is separated by tab, each row is separated by a new line character.\n   * {@link DataMap#getCopyableText}\n   *\n   * @memberof Core#\n   * @function getCopyableText\n   * @since 0.11\n   * @param {Number} startRow From visual row index.\n   * @param {Number} startCol From visual column index.\n   * @param {Number} endRow To visual row index.\n   * @param {Number} endCol To visual column index.\n   * @returns {String}\n   */\n  this.getCopyableText = function (startRow, startCol, endRow, endCol) {\n    return datamap.getCopyableText(new _src.CellCoords(startRow, startCol), new _src.CellCoords(endRow, endCol));\n  };\n\n  /**\n   * Returns the data's copyable value at specified row and column index ({@link DataMap#getCopyable}).\n   *\n   * @memberof Core#\n   * @function getCopyableData\n   * @since 0.19.0\n   * @param {Number} row Visual row index.\n   * @param {Number} column Visual column index.\n   * @returns {String}\n   */\n  this.getCopyableData = function (row, column) {\n    return datamap.getCopyable(row, datamap.colToProp(column));\n  };\n\n  /**\n   * Returns schema provided by constructor settings. If it doesn't exist then it returns the schema based on the data\n   * structure in the first row.\n   *\n   * @memberof Core#\n   * @function getSchema\n   * @since 0.13.2\n   * @returns {Object} Schema object.\n   */\n  this.getSchema = function () {\n    return datamap.getSchema();\n  };\n\n  /**\n   * Use it if you need to change configuration after initialization. The `settings` parameter is an object containing the new\n   * settings, declared the same way as in the initial settings object.\n   * Note, that although the `updateSettings` method doesn't overwrite the previously declared settings, it might reset\n   * the settings made post-initialization. (for example - ignore changes made using the columnResize feature).\n   *\n   * @memberof Core#\n   * @function updateSettings\n   * @param {Object} settings New settings object.\n   * @param {Boolean} init Calls this method in the initialization mode. Internal use only.\n   *                       Used by API could be cause of the unexpected behaviour of the Handsontable.\n   * @example\n   * ```js\n   * hot.updateSettings({\n   *    contextMenu: true,\n   *    colHeaders: true,\n   *    fixedRowsTop: 2\n   * });\n   * ```\n   * @fires Hooks#afterCellMetaReset\n   * @fires Hooks#afterUpdateSettings\n   */\n  this.updateSettings = function (settings, init) {\n    var columnsAsFunc = false;\n    var i = void 0;\n    var j = void 0;\n    var clen = void 0;\n\n    if ((0, _mixed.isDefined)(settings.rows)) {\n      throw new Error('\"rows\" setting is no longer supported. do you mean startRows, minRows or maxRows?');\n    }\n    if ((0, _mixed.isDefined)(settings.cols)) {\n      throw new Error('\"cols\" setting is no longer supported. do you mean startCols, minCols or maxCols?');\n    }\n\n    for (i in settings) {\n      if (i === 'data') {\n        /* eslint-disable-next-line no-continue */\n        continue; // loadData will be triggered later\n      } else if (i === 'language') {\n        setLanguage(settings.language);\n\n        /* eslint-disable-next-line no-continue */\n        continue;\n      } else if (_pluginHooks2.default.getSingleton().getRegistered().indexOf(i) > -1) {\n        if ((0, _function.isFunction)(settings[i]) || Array.isArray(settings[i])) {\n          settings[i].initialHook = true;\n          instance.addHook(i, settings[i]);\n        }\n      } else if (!init && (0, _object.hasOwnProperty)(settings, i)) {\n        // Update settings\n        GridSettings.prototype[i] = settings[i];\n      }\n    }\n\n    // Load data or create data map\n    if (settings.data === void 0 && priv.settings.data === void 0) {\n      instance.loadData(null); // data source created just now\n    } else if (settings.data !== void 0) {\n      instance.loadData(settings.data); // data source given as option\n    } else if (settings.columns !== void 0) {\n      datamap.createMap();\n    }\n\n    clen = instance.countCols();\n\n    var columnSetting = settings.columns || GridSettings.prototype.columns;\n\n    // Init columns constructors configuration\n    if (columnSetting && (0, _function.isFunction)(columnSetting)) {\n      clen = instance.countSourceCols();\n      columnsAsFunc = true;\n    }\n\n    // Clear cellSettings cache\n    if (settings.cell !== void 0 || settings.cells !== void 0 || settings.columns !== void 0) {\n      priv.cellSettings.length = 0;\n    }\n\n    if (clen > 0) {\n      var proto = void 0;\n      var column = void 0;\n\n      for (i = 0, j = 0; i < clen; i++) {\n        if (columnsAsFunc && !columnSetting(i)) {\n          /* eslint-disable no-continue */\n          continue;\n        }\n        priv.columnSettings[j] = (0, _setting.columnFactory)(GridSettings, priv.columnsSettingConflicts);\n\n        // shortcut for prototype\n        proto = priv.columnSettings[j].prototype;\n\n        // Use settings provided by user\n        if (columnSetting) {\n          if (columnsAsFunc) {\n            column = columnSetting(i);\n          } else {\n            column = columnSetting[j];\n          }\n\n          if (column) {\n            (0, _object.extend)(proto, column);\n            (0, _object.extend)(proto, expandType(column));\n          }\n        }\n\n        j++;\n      }\n    }\n\n    if ((0, _mixed.isDefined)(settings.cell)) {\n      for (var key in settings.cell) {\n        if ((0, _object.hasOwnProperty)(settings.cell, key)) {\n          var cell = settings.cell[key];\n\n          instance.setCellMetaObject(cell.row, cell.col, cell);\n        }\n      }\n    }\n\n    instance.runHooks('afterCellMetaReset');\n\n    if ((0, _mixed.isDefined)(settings.className)) {\n      if (GridSettings.prototype.className) {\n        (0, _element.removeClass)(instance.rootElement, GridSettings.prototype.className);\n      }\n      if (settings.className) {\n        (0, _element.addClass)(instance.rootElement, settings.className);\n      }\n    }\n\n    var currentHeight = instance.rootElement.style.height;\n    if (currentHeight !== '') {\n      currentHeight = parseInt(instance.rootElement.style.height, 10);\n    }\n\n    var height = settings.height;\n    if ((0, _function.isFunction)(height)) {\n      height = height();\n    }\n\n    if (init) {\n      var initialStyle = instance.rootElement.getAttribute('style');\n\n      if (initialStyle) {\n        instance.rootElement.setAttribute('data-initialstyle', instance.rootElement.getAttribute('style'));\n      }\n    }\n\n    if (height === null) {\n      var _initialStyle = instance.rootElement.getAttribute('data-initialstyle');\n\n      if (_initialStyle && (_initialStyle.indexOf('height') > -1 || _initialStyle.indexOf('overflow') > -1)) {\n        instance.rootElement.setAttribute('style', _initialStyle);\n      } else {\n        instance.rootElement.style.height = '';\n        instance.rootElement.style.overflow = '';\n      }\n    } else if (height !== void 0) {\n      instance.rootElement.style.height = height + 'px';\n      instance.rootElement.style.overflow = 'hidden';\n    }\n\n    if (typeof settings.width !== 'undefined') {\n      var width = settings.width;\n\n      if ((0, _function.isFunction)(width)) {\n        width = width();\n      }\n\n      instance.rootElement.style.width = width + 'px';\n    }\n\n    if (!init) {\n      datamap.clearLengthCache(); // force clear cache length on updateSettings() #3416\n\n      if (instance.view) {\n        instance.view.wt.wtViewport.resetHasOversizedColumnHeadersMarked();\n      }\n\n      instance.runHooks('afterUpdateSettings', settings);\n    }\n\n    grid.adjustRowsAndCols();\n    if (instance.view && !priv.firstRun) {\n      instance.forceFullRender = true; // used when data was changed\n      editorManager.lockEditor();\n      instance._refreshBorders(null);\n      editorManager.unlockEditor();\n    }\n\n    if (!init && instance.view && (currentHeight === '' || height === '' || height === void 0) && currentHeight !== height) {\n      instance.view.wt.wtOverlays.updateMainScrollableElements();\n    }\n  };\n\n  /**\n   * Get value from the selected cell.\n   *\n   * @memberof Core#\n   * @function getValue\n   * @since 0.11\n   * @returns {*} Value of selected cell.\n   */\n  this.getValue = function () {\n    var sel = instance.getSelectedLast();\n\n    if (GridSettings.prototype.getValue) {\n      if ((0, _function.isFunction)(GridSettings.prototype.getValue)) {\n        return GridSettings.prototype.getValue.call(instance);\n      } else if (sel) {\n        return instance.getData()[sel[0][0]][GridSettings.prototype.getValue];\n      }\n    } else if (sel) {\n      return instance.getDataAtCell(sel[0], sel[1]);\n    }\n  };\n\n  function expandType(obj) {\n    if (!(0, _object.hasOwnProperty)(obj, 'type')) {\n      // ignore obj.prototype.type\n      return;\n    }\n\n    var type,\n        expandedType = {};\n\n    if (_typeof(obj.type) === 'object') {\n      type = obj.type;\n    } else if (typeof obj.type === 'string') {\n      type = (0, _cellTypes.getCellType)(obj.type);\n    }\n\n    for (var i in type) {\n      if ((0, _object.hasOwnProperty)(type, i) && !(0, _object.hasOwnProperty)(obj, i)) {\n        expandedType[i] = type[i];\n      }\n    }\n\n    return expandedType;\n  }\n\n  /**\n   * Returns the object settings.\n   *\n   * @memberof Core#\n   * @function getSettings\n   * @returns {Object} Object containing the current grid settings.\n   */\n  this.getSettings = function () {\n    return priv.settings;\n  };\n\n  /**\n   * Clears the data from the grid (the table settings remain intact).\n   *\n   * @memberof Core#\n   * @function clear\n   * @since 0.11.0\n   */\n  this.clear = function () {\n    this.selectAll();\n    this.emptySelectedCells();\n  };\n\n  /**\n   * @memberof Core#\n   * @function alter\n   * @param {String} action See grid.alter for possible values: `\"insert_row\"`, `\"insert_col\"`, `\"remove_row\"`, `\"remove_col\"`\n   * @param {Number} index Visual index of the row/column before which the new row/column will be inserted/removed.\n   * @param {Number} [amount = 1] Amound of rows/columns to be inserted/removed.\n   * @param {String} [source] Source indicator.\n   * @param {Boolean} [keepEmptyRows] Flag for preventing deletion of empty rows.\n   * @description\n   *\n   * Allows altering the table structure by either inserting/removing rows or inserting/removing columns:\n   *\n   * Insert new row(s) above the row with a given `index`. If index is `null` or `undefined`, the new row will be\n   * added after the last row.\n   * ```js\n   * var hot = new Handsontable(document.getElementById('example'));\n   * hot.alter('insert_row', 10);\n   * ```\n   *\n   * Insert new column(s) before the column with a given `index`. If index is `null` or `undefined`, the new column\n   * will be added after the last column.\n   * ```js\n   * var hot = new Handsontable(document.getElementById('example'));\n   * hot.alter('insert_col', 10);\n   * ```\n   *\n   * Remove the row(s) at the given `index`.\n   * ```js\n   * var hot = new Handsontable(document.getElementById('example'));\n   * hot.alter('remove_row', 10);\n   * ```\n   *\n   * Remove the column(s) at the given `index`.\n   * ```js\n   * var hot = new Handsontable(document.getElementById('example'));\n   * hot.alter('remove_col', 10);\n   * ```\n   */\n  this.alter = function (action, index, amount, source, keepEmptyRows) {\n    grid.alter(action, index, amount, source, keepEmptyRows);\n  };\n\n  /**\n   * Returns a TD element for the given `row` and `col` arguments, if it is rendered on screen.\n   * Returns `null` if the TD is not rendered on screen (probably because that part of the table is not visible).\n   *\n   * @memberof Core#\n   * @function getCell\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @param {Boolean} topmost If set to true, it returns the TD element from the topmost overlay. For example,\n   * if the wanted cell is in the range of fixed rows, it will return a TD element from the `top` overlay.\n   * @returns {Element} The cell's TD element.\n   */\n  this.getCell = function (row, col, topmost) {\n    return instance.view.getCellAtCoords(new _src.CellCoords(row, col), topmost);\n  };\n\n  /**\n   * Returns the coordinates of the cell, provided as a HTML Element.\n   *\n   * @memberof Core#\n   * @function getCoords\n   * @param {Element} elem The HTML Element representing the cell.\n   * @returns {CellCoords} Visual coordinates object.\n   */\n  this.getCoords = function (elem) {\n    return this.view.wt.wtTable.getCoords.call(this.view.wt.wtTable, elem);\n  };\n\n  /**\n   * Returns the property name that corresponds with the given column index. {@link DataMap#colToProp}\n   * If the data source is an array of arrays, it returns the columns index.\n   *\n   * @memberof Core#\n   * @function colToProp\n   * @param {Number} col Visual column index.\n   * @returns {String|Number} Column property or physical column index.\n   */\n  this.colToProp = function (col) {\n    return datamap.colToProp(col);\n  };\n\n  /**\n   * Returns column index that corresponds with the given property. {@link DataMap#propToCol}\n   *\n   * @memberof Core#\n   * @function propToCol\n   * @param {String|Number} prop Property name or physical column index.\n   * @returns {Number} Visual column index.\n   */\n  this.propToCol = function (prop) {\n    return datamap.propToCol(prop);\n  };\n\n  /**\n   * Translate physical row index into visual.\n   *\n   * @since 0.29.0\n   * @memberof Core#\n   * @function toVisualRow\n   * @param {Number} row Physical row index.\n   * @returns {Number} Returns visual row index.\n   */\n  this.toVisualRow = function (row) {\n    return recordTranslator.toVisualRow(row);\n  };\n\n  /**\n   * Translate physical column index into visual.\n   *\n   * @since 0.29.0\n   * @memberof Core#\n   * @function toVisualColumn\n   * @param {Number} column Physical column index.\n   * @returns {Number} Returns visual column index.\n   */\n  this.toVisualColumn = function (column) {\n    return recordTranslator.toVisualColumn(column);\n  };\n\n  /**\n   * Translate visual row index into physical.\n   * If displayed rows order is different than the order of rows stored in memory (i.e. sorting is applied)\n   * to retrieve valid physical row index you can use this method.\n   *\n   * @since 0.29.0\n   * @memberof Core#\n   * @function toPhysicalRow\n   * @param {Number} row Visual row index.\n   * @returns {Number} Returns physical row index.\n   */\n  this.toPhysicalRow = function (row) {\n    return recordTranslator.toPhysicalRow(row);\n  };\n\n  /**\n   * Translate visual column index into physical.\n   * If displayed columns order is different than the order of columns stored in memory (i.e. manual column move is applied)\n   * to retrieve valid physical column index you can use this method.\n   *\n   * @since 0.29.0\n   * @memberof Core#\n   * @function toPhysicalColumn\n   * @param {Number} column Visual column index.\n   * @returns {Number} Returns physical column index.\n   */\n  this.toPhysicalColumn = function (column) {\n    return recordTranslator.toPhysicalColumn(column);\n  };\n\n  /**\n   * @description\n   * Returns the cell value at `row`, `col`. `row` and `col` are the __visible__ indexes (note, that if columns were reordered or sorted,\n   * the currently visible order will be used).\n   *\n   * @memberof Core#\n   * @function getDataAtCell\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @returns {String|Boolean|null} Data at cell.\n   */\n  this.getDataAtCell = function (row, col) {\n    return datamap.get(row, datamap.colToProp(col));\n  };\n\n  /**\n   * Return value at `row`, `prop`. (Uses {@link DataMap#get})\n   *\n   * @memberof Core#\n   * @function getDataAtRowProp\n   * @param {Number} row Visual row index.\n   * @param {String} prop Property name.\n   * @returns {*} Cell value.\n   */\n  this.getDataAtRowProp = function (row, prop) {\n    return datamap.get(row, prop);\n  };\n\n  /**\n   * @description\n   * Returns array of column values from the data source. `col` is the __visible__ index of the column.\n   * Note, that if columns were reordered or sorted, the currently visible order will be used.\n   *\n   * @memberof Core#\n   * @function getDataAtCol\n   * @since 0.9-beta2\n   * @param {Number} col Visual column index.\n   * @returns {Array} Array of cell values.\n   */\n  this.getDataAtCol = function (col) {\n    var out = [];\n    return out.concat.apply(out, _toConsumableArray(datamap.getRange(new _src.CellCoords(0, col), new _src.CellCoords(priv.settings.data.length - 1, col), datamap.DESTINATION_RENDERER)));\n  };\n\n  /**\n   * Given the object property name (e.g. `'first.name'`), returns an array of column's values from the data source.\n   * You can also provide a column index as the first argument.\n   *\n   * @memberof Core#\n   * @function getDataAtProp\n   * @since 0.9-beta2\n   * @param {String|Number} prop Property name / physical column index.\n   * @returns {Array} Array of cell values.\n   */\n  // TODO: Getting data from `datamap` should work on visual indexes.\n  this.getDataAtProp = function (prop) {\n    var out = [],\n        range;\n\n    range = datamap.getRange(new _src.CellCoords(0, datamap.propToCol(prop)), new _src.CellCoords(priv.settings.data.length - 1, datamap.propToCol(prop)), datamap.DESTINATION_RENDERER);\n\n    return out.concat.apply(out, _toConsumableArray(range));\n  };\n\n  /**\n   * Returns the source data object (the same that was passed by `data` configuration option or `loadData` method).\n   * Optionally you can provide a cell range by using the `row`, `col`, `row2`, `col2` arguments, to get only a fragment of grid data.\n   *\n   * @memberof Core#\n   * @function getSourceData\n   * @since 0.20.0\n   * @param {Number} [r] From physical row index.\n   * @param {Number} [c] From physical column index (or visual index, if data type is an array of objects).\n   * @param {Number} [r2] To physical row index.\n   * @param {Number} [c2] To physical column index (or visual index, if data type is an array of objects).\n   * @returns {Array} Array of grid data.\n   */\n  this.getSourceData = function (r, c, r2, c2) {\n    var data = void 0;\n\n    if (r === void 0) {\n      data = dataSource.getData();\n    } else {\n      data = dataSource.getByRange(new _src.CellCoords(r, c), new _src.CellCoords(r2, c2));\n    }\n\n    return data;\n  };\n\n  /**\n   * Returns the source data object as an arrays of arrays format even when source data was provided in another format.\n   * Optionally you can provide a cell range by using the `row`, `col`, `row2`, `col2` arguments, to get only a fragment of grid data.\n   *\n   * @memberof Core#\n   * @function getSourceDataArray\n   * @since 0.28.0\n   * @param {Number} [r] From physical row index.\n   * @param {Number} [c] From physical column index (or visual index, if data type is an array of objects).\n   * @param {Number} [r2] To physical row index.\n   * @param {Number} [c2] To physical column index (or visual index, if data type is an array of objects).\n   * @returns {Array} An array of arrays.\n   */\n  this.getSourceDataArray = function (r, c, r2, c2) {\n    var data = void 0;\n\n    if (r === void 0) {\n      data = dataSource.getData(true);\n    } else {\n      data = dataSource.getByRange(new _src.CellCoords(r, c), new _src.CellCoords(r2, c2), true);\n    }\n\n    return data;\n  };\n\n  /**\n   * Returns an array of column values from the data source. `col` is the index of the row in the data source.\n   *\n   * @memberof Core#\n   * @function getSourceDataAtCol\n   * @since 0.11.0-beta3\n   * @param {Number} column Visual column index.\n   * @returns {Array} Array of the column's cell values.\n   */\n  // TODO: Getting data from `sourceData` should work always on physical indexes.\n  this.getSourceDataAtCol = function (column) {\n    return dataSource.getAtColumn(column);\n  };\n\n  /**\n   * Returns a single row of the data (array or object, depending on what you have). `row` is the index of the row in the data source.\n   *\n   * @memberof Core#\n   * @function getSourceDataAtRow\n   * @since 0.11.0-beta3\n   * @param {Number} row Physical row index.\n   * @returns {Array|Object} Single row of data.\n   */\n  this.getSourceDataAtRow = function (row) {\n    return dataSource.getAtRow(row);\n  };\n\n  /**\n   * Returns a single value from the data source.\n   *\n   * @memberof Core#\n   * @function getSourceDataAtCell\n   * @param {Number} row Physical row index.\n   * @param {Number} column Visual column index.\n   * @returns {*} Cell data.\n   * @since 0.20.0\n   */\n  // TODO: Getting data from `sourceData` should work always on physical indexes.\n  this.getSourceDataAtCell = function (row, column) {\n    return dataSource.getAtCell(row, column);\n  };\n\n  /**\n   * @description\n   * Returns a single row of the data. The `row` argument is the __visible__ index of the row.\n   *\n   * @memberof Core#\n   * @function getDataAtRow\n   * @param {Number} row Visual row index.\n   * @returns {Array} Array of row's cell data.\n   * @since 0.9-beta2\n   */\n  this.getDataAtRow = function (row) {\n    var data = datamap.getRange(new _src.CellCoords(row, 0), new _src.CellCoords(row, this.countCols() - 1), datamap.DESTINATION_RENDERER);\n\n    return data[0] || [];\n  };\n\n  /**\n   * @description\n   * Returns a data type defined in the Handsontable settings under the `type` key ([Options#type](http://docs.handsontable.com/Options.html#type)).\n   * If there are cells with different types in the selected range, it returns `'mixed'`.\n   *\n   * @since 0.18.1\n   * @memberof Core#\n   * @function getDataType\n   * @param {Number} rowFrom From visual row index.\n   * @param {Number} columnFrom From visual column index.\n   * @param {Number} rowTo To visual row index.\n   * @param {Number} columnTo To visual column index.\n   * @returns {String} Cell type (e.q: `'mixed'`, `'text'`, `'numeric'`, `'autocomplete'`).\n   */\n  this.getDataType = function (rowFrom, columnFrom, rowTo, columnTo) {\n    var _this3 = this;\n\n    var previousType = null;\n    var currentType = null;\n\n    if (rowFrom === void 0) {\n      rowFrom = 0;\n      rowTo = this.countRows();\n      columnFrom = 0;\n      columnTo = this.countCols();\n    }\n    if (rowTo === void 0) {\n      rowTo = rowFrom;\n    }\n    if (columnTo === void 0) {\n      columnTo = columnFrom;\n    }\n    var type = 'mixed';\n\n    (0, _number.rangeEach)(Math.min(rowFrom, rowTo), Math.max(rowFrom, rowTo), function (row) {\n      var isTypeEqual = true;\n\n      (0, _number.rangeEach)(Math.min(columnFrom, columnTo), Math.max(columnFrom, columnTo), function (column) {\n        var cellType = _this3.getCellMeta(row, column);\n\n        currentType = cellType.type;\n\n        if (previousType) {\n          isTypeEqual = previousType === currentType;\n        } else {\n          previousType = currentType;\n        }\n\n        return isTypeEqual;\n      });\n      type = isTypeEqual ? currentType : 'mixed';\n\n      return isTypeEqual;\n    });\n\n    return type;\n  };\n\n  /**\n   * Remove a property defined by the `key` argument from the cell meta object for the provided `row` and `col` coordinates.\n   *\n   * @memberof Core#\n   * @function removeCellMeta\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @param {String} key Property name.\n   * @fires Hooks#beforeRemoveCellMeta\n   * @fires Hooks#afterRemoveCellMeta\n   */\n  this.removeCellMeta = function (row, col, key) {\n    var _recordTranslator$toP = recordTranslator.toPhysical(row, col),\n        _recordTranslator$toP2 = _slicedToArray(_recordTranslator$toP, 2),\n        physicalRow = _recordTranslator$toP2[0],\n        physicalColumn = _recordTranslator$toP2[1];\n\n    var cachedValue = priv.cellSettings[physicalRow][physicalColumn][key];\n\n    var hookResult = instance.runHooks('beforeRemoveCellMeta', row, col, key, cachedValue);\n\n    if (hookResult !== false) {\n      delete priv.cellSettings[physicalRow][physicalColumn][key];\n\n      instance.runHooks('afterRemoveCellMeta', row, col, key, cachedValue);\n    }\n\n    cachedValue = null;\n  };\n\n  /**\n   * Remove one or more rows from the cell meta object.\n   *\n   * @since 0.30.0\n   * @param {Number} index An integer that specifies at what position to add/remove items, Use negative values to specify the position from the end of the array.\n   * @param {Number} deleteAmount The number of items to be removed. If set to 0, no items will be removed.\n   * @param {Array} items The new items to be added to the array.\n   */\n  this.spliceCellsMeta = function (index, deleteAmount) {\n    var _priv$cellSettings;\n\n    for (var _len2 = arguments.length, items = Array(_len2 > 2 ? _len2 - 2 : 0), _key = 2; _key < _len2; _key++) {\n      items[_key - 2] = arguments[_key];\n    }\n\n    (_priv$cellSettings = priv.cellSettings).splice.apply(_priv$cellSettings, [index, deleteAmount].concat(items));\n  };\n\n  /**\n   * Set cell meta data object defined by `prop` to the corresponding params `row` and `col`.\n   *\n   * @memberof Core#\n   * @function setCellMetaObject\n   * @since 0.11\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @param {Object} prop Meta object.\n   */\n  this.setCellMetaObject = function (row, col, prop) {\n    if ((typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) === 'object') {\n      for (var key in prop) {\n        if ((0, _object.hasOwnProperty)(prop, key)) {\n          var value = prop[key];\n          this.setCellMeta(row, col, key, value);\n        }\n      }\n    }\n  };\n\n  /**\n   * Sets a property defined by the `key` object to the meta object of a cell corresponding to params `row` and `col`.\n   *\n   * @memberof Core#\n   * @function setCellMeta\n   * @since 0.11\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @param {String} key Property name.\n   * @param {String} val Property value.\n   * @fires Hooks#afterSetCellMeta\n   */\n  this.setCellMeta = function (row, col, key, val) {\n    var _recordTranslator$toP3 = recordTranslator.toPhysical(row, col),\n        _recordTranslator$toP4 = _slicedToArray(_recordTranslator$toP3, 2),\n        physicalRow = _recordTranslator$toP4[0],\n        physicalColumn = _recordTranslator$toP4[1];\n\n    if (!priv.columnSettings[physicalColumn]) {\n      priv.columnSettings[physicalColumn] = (0, _setting.columnFactory)(GridSettings, priv.columnsSettingConflicts);\n    }\n\n    if (!priv.cellSettings[physicalRow]) {\n      priv.cellSettings[physicalRow] = [];\n    }\n    if (!priv.cellSettings[physicalRow][physicalColumn]) {\n      priv.cellSettings[physicalRow][physicalColumn] = new priv.columnSettings[physicalColumn]();\n    }\n    priv.cellSettings[physicalRow][physicalColumn][key] = val;\n    instance.runHooks('afterSetCellMeta', row, col, key, val);\n  };\n\n  /**\n   * Get all the cells meta settings at least once generated in the table (in order of cell initialization).\n   *\n   * @since 0.19.0\n   * @returns {Array} Returns Array of ColumnSettings object.\n   */\n  this.getCellsMeta = function () {\n    return (0, _array.arrayFlatten)(priv.cellSettings);\n  };\n\n  /**\n   * Returns the cell properties object for the given `row` and `col` coordinates.\n   *\n   * @memberof Core#\n   * @function getCellMeta\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @returns {Object} The cell properties object.\n   * @fires Hooks#beforeGetCellMeta\n   * @fires Hooks#afterGetCellMeta\n   */\n  this.getCellMeta = function (row, col) {\n    var prop = datamap.colToProp(col);\n    var cellProperties = void 0;\n\n    var _recordTranslator$toP5 = recordTranslator.toPhysical(row, col),\n        _recordTranslator$toP6 = _slicedToArray(_recordTranslator$toP5, 2),\n        physicalRow = _recordTranslator$toP6[0],\n        physicalColumn = _recordTranslator$toP6[1];\n\n    // Workaround for #11. Connected also with #3849. It should be fixed within #4497.\n\n\n    if (physicalRow === null) {\n      physicalRow = row;\n    }\n\n    if (!priv.columnSettings[physicalColumn]) {\n      priv.columnSettings[physicalColumn] = (0, _setting.columnFactory)(GridSettings, priv.columnsSettingConflicts);\n    }\n\n    if (!priv.cellSettings[physicalRow]) {\n      priv.cellSettings[physicalRow] = [];\n    }\n    if (!priv.cellSettings[physicalRow][physicalColumn]) {\n      priv.cellSettings[physicalRow][physicalColumn] = new priv.columnSettings[physicalColumn]();\n    }\n\n    cellProperties = priv.cellSettings[physicalRow][physicalColumn]; // retrieve cellProperties from cache\n\n    cellProperties.row = physicalRow;\n    cellProperties.col = physicalColumn;\n    cellProperties.visualRow = row;\n    cellProperties.visualCol = col;\n    cellProperties.prop = prop;\n    cellProperties.instance = instance;\n\n    instance.runHooks('beforeGetCellMeta', row, col, cellProperties);\n    (0, _object.extend)(cellProperties, expandType(cellProperties)); // for `type` added in beforeGetCellMeta\n\n    if (cellProperties.cells) {\n      var settings = cellProperties.cells.call(cellProperties, physicalRow, physicalColumn, prop);\n\n      if (settings) {\n        (0, _object.extend)(cellProperties, settings);\n        (0, _object.extend)(cellProperties, expandType(settings)); // for `type` added in cells\n      }\n    }\n\n    instance.runHooks('afterGetCellMeta', row, col, cellProperties);\n\n    return cellProperties;\n  };\n\n  /**\n   * Returns a row off the cell meta array.\n   *\n   * @memberof Core#\n   * @function getCellMetaAtRow\n   * @since 0.30.0\n   * @param {Number} row Physical index of the row to return cell meta for.\n   * @returns {Array}\n   */\n  this.getCellMetaAtRow = function (row) {\n    return priv.cellSettings[row];\n  };\n\n  /**\n   * Checks if the data format and config allows user to modify the column structure.\n   * @returns {boolean}\n   */\n  this.isColumnModificationAllowed = function () {\n    return !(instance.dataType === 'object' || instance.getSettings().columns);\n  };\n\n  var rendererLookup = (0, _data.cellMethodLookupFactory)('renderer');\n\n  /**\n   * Returns the cell renderer function by given `row` and `col` arguments.\n   *\n   * @memberof Core#\n   * @function getCellRenderer\n   * @since 0.11\n   * @param {Number|Object} row Visual row index or cell meta object.\n   * @param {Number} [col] Visual column index.\n   * @returns {Function} The renderer function.\n   */\n  this.getCellRenderer = function (row, col) {\n    return (0, _renderers.getRenderer)(rendererLookup.call(this, row, col));\n  };\n\n  /**\n   * Returns the cell editor by the provided `row` and `col` arguments.\n   *\n   * @memberof Core#\n   * @function getCellEditor\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @returns {Object} The Editor object.\n   */\n  this.getCellEditor = (0, _data.cellMethodLookupFactory)('editor');\n\n  var validatorLookup = (0, _data.cellMethodLookupFactory)('validator');\n\n  /**\n   * Returns the cell validator by `row` and `col`, provided a validator is defined. If not - it doesn't return anything.\n   *\n   * @memberof Core#\n   * @function getCellValidator\n   * @param {Number} row Visual row index.\n   * @param {Number} col Visual column index.\n   * @returns {Function|RegExp|undefined} The validator function.\n   */\n  this.getCellValidator = function (row, col) {\n    var validator = validatorLookup.call(this, row, col);\n\n    if (typeof validator === 'string') {\n      validator = (0, _validators.getValidator)(validator);\n    }\n\n    return validator;\n  };\n\n  /**\n   * Validates all cells using their validator functions and calls callback when finished.\n   *\n   * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`.\n   *\n   * @memberof Core#\n   * @function validateCells\n   * @param {Function} [callback] The callback function.\n   */\n  this.validateCells = function (callback) {\n    this._validateCells(callback);\n  };\n\n  /**\n   * Validates rows using their validator functions and calls callback when finished.\n   *\n   * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`.\n   *\n   * @memberof Core#\n   * @function validateRows\n   * @param {Array} [rows] Array of validation target visual row indexes.\n   * @param {Function} [callback] The callback function.\n   */\n  this.validateRows = function (rows, callback) {\n    if (!Array.isArray(rows)) {\n      throw new Error('validateRows parameter `rows` must be an array');\n    }\n    this._validateCells(callback, rows);\n  };\n\n  /**\n   * Validates columns using their validator functions and calls callback when finished.\n   *\n   * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`.\n   *\n   * @memberof Core#\n   * @function validateColumns\n   * @param {Array} [columns] Array of validation target visual columns indexes.\n   * @param {Function} [callback] The callback function.\n   */\n  this.validateColumns = function (columns, callback) {\n    if (!Array.isArray(columns)) {\n      throw new Error('validateColumns parameter `columns` must be an array');\n    }\n    this._validateCells(callback, undefined, columns);\n  };\n\n  /**\n   * Validates all cells using their validator functions and calls callback when finished.\n   *\n   * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`.\n   *\n   * Private use intended.\n   *\n   * @private\n   * @memberof Core#\n   * @function _validateCells\n   * @param {Function} [callback] The callback function.\n   * @param {Array} [rows] Optional. Array of validation target visual row indexes.\n   * @param {Array} [columns] Optional. Array of validation target visual column indexes.\n   */\n  this._validateCells = function (callback, rows, columns) {\n    var waitingForValidator = new ValidatorsQueue();\n\n    if (callback) {\n      waitingForValidator.onQueueEmpty = callback;\n    }\n\n    var i = instance.countRows() - 1;\n\n    while (i >= 0) {\n      if (rows !== undefined && rows.indexOf(i) === -1) {\n        i--;\n        continue;\n      }\n      var j = instance.countCols() - 1;\n\n      while (j >= 0) {\n        if (columns !== undefined && columns.indexOf(j) === -1) {\n          j--;\n          continue;\n        }\n        waitingForValidator.addValidatorToQueue();\n\n        instance.validateCell(instance.getDataAtCell(i, j), instance.getCellMeta(i, j), function (result) {\n          if (typeof result !== 'boolean') {\n            throw new Error('Validation error: result is not boolean');\n          }\n          if (result === false) {\n            waitingForValidator.valid = false;\n          }\n          waitingForValidator.removeValidatorFormQueue();\n        }, 'validateCells');\n        j--;\n      }\n      i--;\n    }\n    waitingForValidator.checkIfQueueIsEmpty();\n  };\n\n  /**\n   * Returns an array of row headers' values (if they are enabled). If param `row` was given, it returns the header of the given row as a string.\n   *\n   * @memberof Core#\n   * @function getRowHeader\n   * @param {Number} [row] Visual row index.\n   * @fires Hooks#modifyRowHeader\n   * @returns {Array|String} Array of header values / single header value.\n   */\n  this.getRowHeader = function (row) {\n    var rowHeader = priv.settings.rowHeaders;\n\n    if (row !== void 0) {\n      row = instance.runHooks('modifyRowHeader', row);\n    }\n    if (row === void 0) {\n      rowHeader = [];\n      (0, _number.rangeEach)(instance.countRows() - 1, function (i) {\n        rowHeader.push(instance.getRowHeader(i));\n      });\n    } else if (Array.isArray(rowHeader) && rowHeader[row] !== void 0) {\n      rowHeader = rowHeader[row];\n    } else if ((0, _function.isFunction)(rowHeader)) {\n      rowHeader = rowHeader(row);\n    } else if (rowHeader && typeof rowHeader !== 'string' && typeof rowHeader !== 'number') {\n      rowHeader = row + 1;\n    }\n\n    return rowHeader;\n  };\n\n  /**\n   * Returns information about if this table is configured to display row headers.\n   *\n   * @memberof Core#\n   * @function hasRowHeaders\n   * @returns {Boolean} `true` if the instance has the row headers enabled, `false` otherwise.\n   * @since 0.11\n   */\n  this.hasRowHeaders = function () {\n    return !!priv.settings.rowHeaders;\n  };\n\n  /**\n   * Returns information about if this table is configured to display column headers.\n   *\n   * @memberof Core#\n   * @function hasColHeaders\n   * @since 0.11\n   * @returns {Boolean} `True` if the instance has the column headers enabled, `false` otherwise.\n   */\n  this.hasColHeaders = function () {\n    if (priv.settings.colHeaders !== void 0 && priv.settings.colHeaders !== null) {\n      // Polymer has empty value = null\n      return !!priv.settings.colHeaders;\n    }\n    for (var i = 0, ilen = instance.countCols(); i < ilen; i++) {\n      if (instance.getColHeader(i)) {\n        return true;\n      }\n    }\n\n    return false;\n  };\n\n  /**\n   * Returns an array of column headers (in string format, if they are enabled). If param `col` is given, it returns the header at the given column as a string.\n   *\n   * @memberof Core#\n   * @function getColHeader\n   * @param {Number} [col] Visual column index.\n   * @fires Hooks#modifyColHeader\n   * @returns {Array|String} The column header(s).\n   */\n  this.getColHeader = function (col) {\n    var columnsAsFunc = priv.settings.columns && (0, _function.isFunction)(priv.settings.columns);\n    var result = priv.settings.colHeaders;\n\n    col = instance.runHooks('modifyColHeader', col);\n\n    if (col === void 0) {\n      var out = [];\n      var ilen = columnsAsFunc ? instance.countSourceCols() : instance.countCols();\n\n      for (var i = 0; i < ilen; i++) {\n        out.push(instance.getColHeader(i));\n      }\n\n      result = out;\n    } else {\n      var translateVisualIndexToColumns = function translateVisualIndexToColumns(col) {\n        var arr = [];\n        var columnsLen = instance.countSourceCols();\n        var index = 0;\n\n        for (; index < columnsLen; index++) {\n          if ((0, _function.isFunction)(instance.getSettings().columns) && instance.getSettings().columns(index)) {\n            arr.push(index);\n          }\n        }\n\n        return arr[col];\n      };\n      var baseCol = col;\n      col = instance.runHooks('modifyCol', col);\n\n      var prop = translateVisualIndexToColumns(col);\n\n      if (priv.settings.columns && (0, _function.isFunction)(priv.settings.columns) && priv.settings.columns(prop) && priv.settings.columns(prop).title) {\n        result = priv.settings.columns(prop).title;\n      } else if (priv.settings.columns && priv.settings.columns[col] && priv.settings.columns[col].title) {\n        result = priv.settings.columns[col].title;\n      } else if (Array.isArray(priv.settings.colHeaders) && priv.settings.colHeaders[col] !== void 0) {\n        result = priv.settings.colHeaders[col];\n      } else if ((0, _function.isFunction)(priv.settings.colHeaders)) {\n        result = priv.settings.colHeaders(col);\n      } else if (priv.settings.colHeaders && typeof priv.settings.colHeaders !== 'string' && typeof priv.settings.colHeaders !== 'number') {\n        result = (0, _data.spreadsheetColumnLabel)(baseCol); // see #1458\n      }\n    }\n\n    return result;\n  };\n\n  /**\n   * Return column width from settings (no guessing). Private use intended.\n   *\n   * @private\n   * @memberof Core#\n   * @function _getColWidthFromSettings\n   * @param {Number} col Visual col index.\n   * @returns {Number}\n   */\n  this._getColWidthFromSettings = function (col) {\n    var cellProperties = instance.getCellMeta(0, col);\n    var width = cellProperties.width;\n\n    if (width === void 0 || width === priv.settings.width) {\n      width = cellProperties.colWidths;\n    }\n    if (width !== void 0 && width !== null) {\n      switch (typeof width === 'undefined' ? 'undefined' : _typeof(width)) {\n        case 'object':\n          // array\n          width = width[col];\n          break;\n\n        case 'function':\n          width = width(col);\n          break;\n        default:\n          break;\n      }\n      if (typeof width === 'string') {\n        width = parseInt(width, 10);\n      }\n    }\n\n    return width;\n  };\n\n  /**\n   * Returns the width of the requested column.\n   *\n   * @memberof Core#\n   * @function getColWidth\n   * @since 0.11\n   * @param {Number} col Visual column index.\n   * @returns {Number} Column width.\n   * @fires Hooks#modifyColWidth\n   */\n  this.getColWidth = function (col) {\n    var width = instance._getColWidthFromSettings(col);\n\n    width = instance.runHooks('modifyColWidth', width, col);\n\n    if (width === void 0) {\n      width = _src.ViewportColumnsCalculator.DEFAULT_WIDTH;\n    }\n\n    return width;\n  };\n\n  /**\n   * Return row height from settings (no guessing). Private use intended.\n   *\n   * @private\n   * @memberof Core#\n   * @function _getRowHeightFromSettings\n   * @param {Number} row Visual row index.\n   * @returns {Number}\n   */\n  this._getRowHeightFromSettings = function (row) {\n    // let cellProperties = instance.getCellMeta(row, 0);\n    // let height = cellProperties.height;\n    //\n    // if (height === void 0 || height === priv.settings.height) {\n    //  height = cellProperties.rowHeights;\n    // }\n    var height = priv.settings.rowHeights;\n\n    if (height !== void 0 && height !== null) {\n      switch (typeof height === 'undefined' ? 'undefined' : _typeof(height)) {\n        case 'object':\n          // array\n          height = height[row];\n          break;\n\n        case 'function':\n          height = height(row);\n          break;\n        default:\n          break;\n      }\n      if (typeof height === 'string') {\n        height = parseInt(height, 10);\n      }\n    }\n\n    return height;\n  };\n\n  /**\n   * Returns the row height.\n   *\n   * @memberof Core#\n   * @function getRowHeight\n   * @since 0.11\n   * @param {Number} row Visual row index.\n   * @returns {Number} The given row's height.\n   * @fires Hooks#modifyRowHeight\n   */\n  this.getRowHeight = function (row) {\n    var height = instance._getRowHeightFromSettings(row);\n\n    height = instance.runHooks('modifyRowHeight', height, row);\n\n    return height;\n  };\n\n  /**\n   * Returns the total number of rows in the data source.\n   *\n   * @memberof Core#\n   * @function countSourceRows\n   * @since 0.20.0\n   * @returns {Number} Total number in rows in data source.\n   */\n  this.countSourceRows = function () {\n    var sourceLength = instance.runHooks('modifySourceLength');\n    return sourceLength || (instance.getSourceData() ? instance.getSourceData().length : 0);\n  };\n\n  /**\n   * Returns the total number of columns in the data source.\n   *\n   * @memberof Core#\n   * @function countSourceCols\n   * @since 0.26.1\n   * @returns {Number} Total number in columns in data source.\n   */\n  this.countSourceCols = function () {\n    var len = 0;\n    var obj = instance.getSourceData() && instance.getSourceData()[0] ? instance.getSourceData()[0] : [];\n\n    if ((0, _object.isObject)(obj)) {\n      len = (0, _object.deepObjectSize)(obj);\n    } else {\n      len = obj.length || 0;\n    }\n\n    return len;\n  };\n\n  /**\n   * Returns the total number of rows in the grid.\n   *\n   * @memberof Core#\n   * @function countRows\n   * @returns {Number} Total number in rows the grid.\n   */\n  this.countRows = function () {\n    return datamap.getLength();\n  };\n\n  /**\n   * Returns the total number of columns in the grid.\n   *\n   * @memberof Core#\n   * @function countCols\n   * @returns {Number} Total number of columns.\n   */\n  this.countCols = function () {\n    var maxCols = this.getSettings().maxCols;\n    var dataHasLength = false;\n    var dataLen = 0;\n\n    if (instance.dataType === 'array') {\n      dataHasLength = priv.settings.data && priv.settings.data[0] && priv.settings.data[0].length;\n    }\n\n    if (dataHasLength) {\n      dataLen = priv.settings.data[0].length;\n    }\n\n    if (priv.settings.columns) {\n      var columnsIsFunction = (0, _function.isFunction)(priv.settings.columns);\n\n      if (columnsIsFunction) {\n        if (instance.dataType === 'array') {\n          var columnLen = 0;\n\n          for (var i = 0; i < dataLen; i++) {\n            if (priv.settings.columns(i)) {\n              columnLen++;\n            }\n          }\n\n          dataLen = columnLen;\n        } else if (instance.dataType === 'object' || instance.dataType === 'function') {\n          dataLen = datamap.colToPropCache.length;\n        }\n      } else {\n        dataLen = priv.settings.columns.length;\n      }\n    } else if (instance.dataType === 'object' || instance.dataType === 'function') {\n      dataLen = datamap.colToPropCache.length;\n    }\n\n    return Math.min(maxCols, dataLen);\n  };\n\n  /**\n   * Returns an visual index of the first rendered row.\n   *\n   * @memberof Core#\n   * @function rowOffset\n   * @returns {Number} Visual index of first rendered row.\n   */\n  this.rowOffset = function () {\n    return instance.view.wt.wtTable.getFirstRenderedRow();\n  };\n\n  /**\n   * Returns the visual index of the first rendered column.\n   *\n   * @memberof Core#\n   * @function colOffset\n   * @returns {Number} Visual index of the first visible column.\n   */\n  this.colOffset = function () {\n    return instance.view.wt.wtTable.getFirstRenderedColumn();\n  };\n\n  /**\n   * Returns the number of rendered rows (including rows partially or fully rendered outside viewport).\n   *\n   * @memberof Core#\n   * @function countRenderedRows\n   * @returns {Number} Returns -1 if table is not visible.\n   */\n  this.countRenderedRows = function () {\n    return instance.view.wt.drawn ? instance.view.wt.wtTable.getRenderedRowsCount() : -1;\n  };\n\n  /**\n   * Returns the number of visible rows (rendered rows that fully fit inside viewport).\n   *\n   * @memberof Core#\n   * @function countVisibleRows\n   * @returns {Number} Number of visible rows or -1.\n   */\n  this.countVisibleRows = function () {\n    return instance.view.wt.drawn ? instance.view.wt.wtTable.getVisibleRowsCount() : -1;\n  };\n\n  /**\n   * Returns the number of rendered columns (including columns partially or fully rendered outside viewport).\n   *\n   * @memberof Core#\n   * @function countRenderedCols\n   * @returns {Number} Returns -1 if table is not visible.\n   */\n  this.countRenderedCols = function () {\n    return instance.view.wt.drawn ? instance.view.wt.wtTable.getRenderedColumnsCount() : -1;\n  };\n\n  /**\n   * Returns the number of visible columns. Returns -1 if table is not visible\n   *\n   * @memberof Core#\n   * @function countVisibleCols\n   * @return {Number} Number of visible columns or -1.\n   */\n  this.countVisibleCols = function () {\n    return instance.view.wt.drawn ? instance.view.wt.wtTable.getVisibleColumnsCount() : -1;\n  };\n\n  /**\n   * Returns the number of empty rows. If the optional ending parameter is `true`, returns the\n   * number of empty rows at the bottom of the table.\n   *\n   * @memberof Core#\n   * @function countEmptyRows\n   * @param {Boolean} [ending] If `true`, will only count empty rows at the end of the data source.\n   * @returns {Number} Count empty rows.\n   */\n  this.countEmptyRows = function (ending) {\n    var emptyRows = 0;\n\n    (0, _number.rangeEachReverse)(instance.countRows() - 1, function (visualIndex) {\n      if (instance.isEmptyRow(visualIndex)) {\n        emptyRows += 1;\n      } else if (ending === true) {\n        return false;\n      }\n    });\n\n    return emptyRows;\n  };\n\n  /**\n   * Returns the number of empty columns. If the optional ending parameter is `true`, returns the number of empty\n   * columns at right hand edge of the table.\n   *\n   * @memberof Core#\n   * @function countEmptyCols\n   * @param {Boolean} [ending] If `true`, will only count empty columns at the end of the data source row.\n   * @returns {Number} Count empty cols.\n   */\n  this.countEmptyCols = function (ending) {\n    if (instance.countRows() < 1) {\n      return 0;\n    }\n\n    var emptyColumns = 0;\n\n    (0, _number.rangeEachReverse)(instance.countCols() - 1, function (visualIndex) {\n      if (instance.isEmptyCol(visualIndex)) {\n        emptyColumns += 1;\n      } else if (ending === true) {\n        return false;\n      }\n    });\n\n    return emptyColumns;\n  };\n\n  /**\n   * Check if all cells in the row declared by the `row` argument are empty.\n   *\n   * @memberof Core#\n   * @function isEmptyRow\n   * @param {Number} row Visual row index.\n   * @returns {Boolean} `true` if the row at the given `row` is empty, `false` otherwise.\n   */\n  this.isEmptyRow = function (row) {\n    return priv.settings.isEmptyRow.call(instance, row);\n  };\n\n  /**\n   * Check if all cells in the the column declared by the `col` argument are empty.\n   *\n   * @memberof Core#\n   * @function isEmptyCol\n   * @param {Number} col Column index.\n   * @returns {Boolean} `true` if the column at the given `col` is empty, `false` otherwise.\n   */\n  this.isEmptyCol = function (col) {\n    return priv.settings.isEmptyCol.call(instance, col);\n  };\n\n  /**\n   * Select cell specified by `row` and `col` values or a range of cells finishing at `endRow`, `endCol`. If the table\n   * was configured to support data column properties that properties can be used to making a selection.\n   *\n   * By default, viewport will be scrolled to the selection. After the `selectCell` method had finished, the instance\n   * will be listening to keyboard input on the document.\n   *\n   * @example\n   * ```js\n   * // select a single cell\n   * hot.selectCell(2, 4);\n   * // select a single cell using column property\n   * hot.selectCell(2, 'address');\n   * // select a range of cells\n   * hot.selectCell(2, 4, 3, 5);\n   * // select a range of cells using column properties\n   * hot.selectCell(2, 'address', 3, 'phone_number');\n   * // select a range of cells without scrolling to them\n   * hot.selectCell(2, 'address', 3, 'phone_number', false);\n   * ```\n   *\n   * @memberof Core#\n   * @function selectCell\n   * @param {Number} row Visual row index.\n   * @param {Number|String} column Visual column index or column property.\n   * @param {Number} [endRow] Visual end row index (if selecting a range).\n   * @param {Number|String} [endColumn] Visual end column index or column property (if selecting a range).\n   * @param {Boolean} [scrollToCell=true] If `true`, the viewport will be scrolled to the selection.\n   * @param {Boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectCell = function (row, column, endRow, endColumn) {\n    var scrollToCell = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n    var changeListener = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n\n    if ((0, _mixed.isUndefined)(row) || (0, _mixed.isUndefined)(column)) {\n      return false;\n    }\n\n    return this.selectCells([[row, column, endRow, endColumn]], scrollToCell, changeListener);\n  };\n\n  /**\n   * Make multiple, non-contiguous selection specified by `row` and `column` values or a range of cells\n   * finishing at `endRow`, `endColumn`. The method supports two input formats which are the same as that\n   * produces by `getSelected` and `getSelectedRange` methods.\n   *\n   * By default, viewport will be scrolled to selection. After the `selectCells` method had finished, the instance\n   * will be listening to keyboard input on the document.\n   *\n   * @example\n   * ```js\n   * // using an array of arrays\n   * hot.selectCells([[1, 1, 2, 2], [3, 3], [6, 2, 0, 2]]);\n   * // using an array of arrays with defined columns as props\n   * hot.selectCells([[1, 'id', 2, 'first_name'], [3, 'full_name'], [6, 'last_name', 0, 'first_name']]);\n   * // or using an array of CellRange objects (produced by `.getSelectedRange()` method)\n   * const selected = hot.getSelectedRange();\n   *\n   * selected[0].from.row = 0;\n   * selected[0].from.col = 0;\n   *\n   * hot.selectCells(selected);\n   * ```\n   *\n   * @memberof Core#\n   * @since 0.38.0\n   * @function selectCells\n   * @param {Array[]|CellRange[]} coords Visual coords passed as an array of array (`[[rowStart, columnStart, rowEnd, columnEnd], ...]`)\n   *                                     the same format as `getSelected` method returns or as an CellRange objects\n   *                                     which is the same format what `getSelectedRange` method returns.\n   * @param {Boolean} [scrollToCell=true] If `true`, the viewport will be scrolled to the selection.\n   * @param {Boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectCells = function () {\n    var coords = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [[]];\n    var scrollToCell = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n    var changeListener = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n    if (scrollToCell === false) {\n      preventScrollingToCell = true;\n    }\n\n    var wasSelected = selection.selectCells(coords);\n\n    if (wasSelected && changeListener) {\n      instance.listen();\n    }\n    preventScrollingToCell = false;\n\n    return wasSelected;\n  };\n\n  /**\n   * Select the cell specified by the `row` and `prop` arguments, or a range finishing at `endRow`, `endProp`.\n   * By default, viewport will be scrolled to selection.\n   *\n   * @deprecated\n   * @memberof Core#\n   * @function selectCellByProp\n   * @param {Number} row Visual row index.\n   * @param {String} prop Property name.\n   * @param {Number} [endRow] visual end row index (if selecting a range).\n   * @param {String} [endProp] End property name (if selecting a range).\n   * @param {Boolean} [scrollToCell=true] If `true`, viewport will be scrolled to the selection.\n   * @param {Boolean} [changeListener=true] If `false`, Handsontable will not change keyboard events listener to himself.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectCellByProp = function (row, prop, endRow, endProp) {\n    var scrollToCell = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n    var changeListener = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n\n    (0, _console.warn)((0, _templateLiteralTag.toSingleLine)(_templateObject));\n\n    return this.selectCells([[row, prop, endRow, endProp]], scrollToCell, changeListener);\n  };\n\n  /**\n   * Select column specified by `startColumn` visual index, column property or a range of columns finishing at `endColumn`.\n   *\n   * @example\n   * ```js\n   * // select column using visual index\n   * hot.selectColumns(1);\n   * // select column using column property\n   * hot.selectColumns('id');\n   * // select range of columns using visual indexes\n   * hot.selectColumns(1, 4);\n   * // select range of columns using column properties\n   * hot.selectColumns('id', 'last_name');\n   * ```\n   *\n   * @memberof Core#\n   * @since 0.38.0\n   * @function selectColumns\n   * @param {Number} startColumn The visual column index from which the selection starts.\n   * @param {Number} [endColumn=startColumn] The visual column index to which the selection finishes. If `endColumn`\n   *                                         is not defined the column defined by `startColumn` will be selected.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectColumns = function (startColumn) {\n    var endColumn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startColumn;\n\n    return selection.selectColumns(startColumn, endColumn);\n  };\n\n  /**\n   * Select row specified by `startRow` visual index or a range of rows finishing at `endRow`.\n   *\n   * @example\n   * ```js\n   * select row using visual index\n   * hot.selectRows(1);\n   * select range of rows using visual indexes\n   * hot.selectRows(1, 4);\n   * ```\n   *\n   * @memberof Core#\n   * @since 0.38.0\n   * @function selectRows\n   * @param {Number} startRow The visual row index from which the selection starts.\n   * @param {Number} [endRow=startRow] The visual row index to which the selection finishes. If `endRow`\n   *                                   is not defined the row defined by `startRow` will be selected.\n   * @returns {Boolean} `true` if selection was successful, `false` otherwise.\n   */\n  this.selectRows = function (startRow) {\n    var endRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startRow;\n\n    return selection.selectRows(startRow, endRow);\n  };\n\n  /**\n   * Deselects the current cell selection on grid.\n   *\n   * @memberof Core#\n   * @function deselectCell\n   */\n  this.deselectCell = function () {\n    selection.deselect();\n  };\n\n  /**\n   * Select the whole table. The previous selection will be overwritten.\n   *\n   * @since 0.38.2\n   * @memberof Core#\n   * @function selectAll\n   */\n  this.selectAll = function () {\n    preventScrollingToCell = true;\n    selection.selectAll();\n    preventScrollingToCell = false;\n  };\n\n  /**\n   * Scroll viewport to coords specified by the `row` and `column` arguments.\n   *\n   * @since 0.24.3\n   * @memberof Core#\n   * @function scrollViewportTo\n   * @param {Number} [row] Visual row index.\n   * @param {Number} [column] Visual column index.\n   * @param {Boolean} [snapToBottom = false] If `true`, viewport is scrolled to show the cell on the bottom of the table.\n   * @param {Boolean} [snapToRight = false] If `true`, viewport is scrolled to show the cell on the right side of the table.\n   * @returns {Boolean} `true` if scroll was successful, `false` otherwise.\n   */\n  this.scrollViewportTo = function (row, column) {\n    var snapToBottom = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n    var snapToRight = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n    if (row !== void 0 && (row < 0 || row >= instance.countRows())) {\n      return false;\n    }\n    if (column !== void 0 && (column < 0 || column >= instance.countCols())) {\n      return false;\n    }\n\n    var result = false;\n\n    if (row !== void 0 && column !== void 0) {\n      instance.view.wt.wtOverlays.topOverlay.scrollTo(row, snapToBottom);\n      instance.view.wt.wtOverlays.leftOverlay.scrollTo(column, snapToRight);\n\n      result = true;\n    }\n    if (typeof row === 'number' && typeof column !== 'number') {\n      instance.view.wt.wtOverlays.topOverlay.scrollTo(row, snapToBottom);\n\n      result = true;\n    }\n    if (typeof column === 'number' && typeof row !== 'number') {\n      instance.view.wt.wtOverlays.leftOverlay.scrollTo(column, snapToRight);\n\n      result = true;\n    }\n\n    return result;\n  };\n\n  /**\n   * Removes grid from the DOM.\n   *\n   * @memberof Core#\n   * @function destroy\n   * @fires Hooks#afterDestroy\n   */\n  this.destroy = function () {\n\n    instance._clearTimeouts();\n    if (instance.view) {\n      // in case HT is destroyed before initialization has finished\n      instance.view.destroy();\n    }\n    if (dataSource) {\n      dataSource.destroy();\n    }\n    dataSource = null;\n\n    (0, _keyStateObserver.stopObserving)();\n\n    if (false) {\n      var licenseInfo = document.querySelector('#hot-display-license-info');\n\n      if (licenseInfo) {\n        licenseInfo.parentNode.removeChild(licenseInfo);\n      }\n    }\n    (0, _element.empty)(instance.rootElement);\n    eventManager.destroy();\n\n    if (editorManager) {\n      editorManager.destroy();\n    }\n\n    instance.runHooks('afterDestroy');\n    _pluginHooks2.default.getSingleton().destroy(instance);\n\n    for (var i in instance) {\n      if ((0, _object.hasOwnProperty)(instance, i)) {\n        // replace instance methods with post mortem\n        if ((0, _function.isFunction)(instance[i])) {\n          instance[i] = postMortem;\n        } else if (i !== 'guid') {\n          // replace instance properties with null (restores memory)\n          // it should not be necessary but this prevents a memory leak side effects that show itself in Jasmine tests\n          instance[i] = null;\n        }\n      }\n    }\n\n    // replace private properties with null (restores memory)\n    // it should not be necessary but this prevents a memory leak side effects that show itself in Jasmine tests\n    if (datamap) {\n      datamap.destroy();\n    }\n    datamap = null;\n    priv = null;\n    grid = null;\n    selection = null;\n    editorManager = null;\n    instance = null;\n    GridSettings = null;\n  };\n\n  /**\n   * Replacement for all methods after Handsotnable was destroyed.\n   *\n   * @private\n   */\n  function postMortem() {\n    throw new Error('This method cannot be called because this Handsontable instance has been destroyed');\n  }\n\n  /**\n   * Returns the active editor object.\n   *\n   * @memberof Core#\n   * @function getActiveEditor\n   * @returns {Object} The active editor object.\n   */\n  this.getActiveEditor = function () {\n    return editorManager.getActiveEditor();\n  };\n\n  /**\n   * Returns plugin instance using the plugin name provided.\n   *\n   * @memberof Core#\n   * @function getPlugin\n   * @param {String} pluginName The plugin name.\n   * @returns {*} The plugin instance.\n   * @since 0.15.0\n   */\n  this.getPlugin = function (pluginName) {\n    return (0, _plugins.getPlugin)(this, pluginName);\n  };\n\n  /**\n   * Returns the Handsontable instance.\n   *\n   * @memberof Core#\n   * @function getInstance\n   * @returns {Handsontable} The Handsontable instance.\n   */\n  this.getInstance = function () {\n    return instance;\n  };\n\n  /**\n   * Adds listener to the specified hook name (only for this Handsontable instance).\n   *\n   * @memberof Core#\n   * @function addHook\n   * @see Hooks#add\n   * @param {String} key Hook name.\n   * @param {Function|Array} callback Function or array of Functions.\n   *\n   * @example\n   * ```js\n   * hot.addHook('beforeInit', myCallback);\n   * ```\n   */\n  this.addHook = function (key, callback) {\n    _pluginHooks2.default.getSingleton().add(key, callback, instance);\n  };\n\n  /**\n   * Check if for a specified hook name there are added listeners (only for this Handsontable instance).\n   *\n   * @memberof Core#\n   * @function hasHook\n   * @see Hooks#has\n   * @param {String} key Hook name\n   * @return {Boolean}\n   *\n   * @example\n   * ```js\n   * var hasBeforeInitListeners = hot.hasHook('beforeInit');\n   * ```\n   */\n  this.hasHook = function (key) {\n    return _pluginHooks2.default.getSingleton().has(key, instance);\n  };\n\n  /**\n   * Adds listener to specified hook name (only for this Handsontable instance).\n   * After the listener is triggered, it will be automatically removed.\n   *\n   * @memberof Core#\n   * @function addHookOnce\n   * @see Hooks#once\n   * @param {String} key Hook name.\n   * @param {Function|Array} callback Function or array of Functions.\n   *\n   * @example\n   * ```js\n   * hot.addHookOnce('beforeInit', myCallback);\n   * ```\n   */\n  this.addHookOnce = function (key, callback) {\n    _pluginHooks2.default.getSingleton().once(key, callback, instance);\n  };\n\n  /**\n   * Removes the hook listener previously registered with {@link Core#addHook}.\n   *\n   * @memberof Core#\n   * @function removeHook\n   * @see Hooks#remove\n   * @param {String} key Hook name.\n   * @param {Function} callback Function which have been registered via {@link Core#addHook}.\n   *\n   * @example\n   * ```js\n   * hot.removeHook('beforeInit', myCallback);\n   * ```\n   */\n  this.removeHook = function (key, callback) {\n    _pluginHooks2.default.getSingleton().remove(key, callback, instance);\n  };\n\n  /**\n   * Run the callbacks for the hook provided in the `key` argument using the parameters given in the other arguments.\n   *\n   * @memberof Core#\n   * @function runHooks\n   * @see Hooks#run\n   * @param {String} key Hook name.\n   * @param {*} [p1] Argument passed to the callback.\n   * @param {*} [p2] Argument passed to the callback.\n   * @param {*} [p3] Argument passed to the callback.\n   * @param {*} [p4] Argument passed to the callback.\n   * @param {*} [p5] Argument passed to the callback.\n   * @param {*} [p6] Argument passed to the callback.\n   * @returns {*}\n   *\n   * @example\n   * ```js\n   * hot.runHooks('beforeInit');\n   * ```\n   */\n  this.runHooks = function (key, p1, p2, p3, p4, p5, p6) {\n    return _pluginHooks2.default.getSingleton().run(instance, key, p1, p2, p3, p4, p5, p6);\n  };\n\n  /**\n   * Get phrase for specified dictionary key.\n   *\n   * @memberof Core#\n   * @function getTranslatedPhrase\n   * @since 0.35.0\n   * @param {String} dictionaryKey Constant which is dictionary key.\n   * @param {*} extraArguments Arguments which will be handled by formatters.\n   *\n   * @returns {String}\n   */\n  this.getTranslatedPhrase = function (dictionaryKey, extraArguments) {\n    return (0, _i18n.getTranslatedPhrase)(priv.settings.language, dictionaryKey, extraArguments);\n  };\n\n  this.timeouts = [];\n\n  /**\n   * Sets timeout. Purpose of this method is to clear all known timeouts when `destroy` method is called.\n   *\n   * @param {*} handle\n   * @private\n   */\n  this._registerTimeout = function (handle) {\n    this.timeouts.push(handle);\n  };\n\n  /**\n   * Clears all known timeouts.\n   *\n   * @private\n   */\n  this._clearTimeouts = function () {\n    for (var i = 0, ilen = this.timeouts.length; i < ilen; i++) {\n      clearTimeout(this.timeouts[i]);\n    }\n  };\n\n  /**\n   * Refresh selection borders. This is temporary method relic after selection rewrite.\n   *\n   * @private\n   * @param {Boolean} revertOriginal\n   */\n  this._refreshBorders = function (revertOriginal) {\n    editorManager.destroyEditor(revertOriginal);\n    instance.view.render();\n\n    if (selection.isSelected()) {\n      editorManager.prepareEditor();\n    }\n  };\n\n  _pluginHooks2.default.getSingleton().run(instance, 'construct');\n};\n\n/***/ }),\n/* 89 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.columnFactory = columnFactory;\n\nvar _object = __webpack_require__(2);\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Factory for columns constructors.\n *\n * @param {Object} GridSettings\n * @param {Array} conflictList\n * @return {Object} ColumnSettings\n */\nfunction columnFactory(GridSettings, conflictList) {\n  function ColumnSettings() {};\n\n  (0, _object.inherit)(ColumnSettings, GridSettings);\n\n  // Clear conflict settings\n  for (var i = 0, len = conflictList.length; i < len; i++) {\n    ColumnSettings.prototype[conflictList[i]] = void 0;\n  }\n\n  return ColumnSettings;\n}\n\n/***/ }),\n/* 90 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.spreadsheetColumnLabel = spreadsheetColumnLabel;\nexports.spreadsheetColumnIndex = spreadsheetColumnIndex;\nexports.createSpreadsheetData = createSpreadsheetData;\nexports.createSpreadsheetObjectData = createSpreadsheetObjectData;\nexports.createEmptySpreadsheetData = createEmptySpreadsheetData;\nexports.translateRowsToColumns = translateRowsToColumns;\nexports.cellMethodLookupFactory = cellMethodLookupFactory;\n\nvar _cellTypes = __webpack_require__(87);\n\nvar _object = __webpack_require__(2);\n\nvar COLUMN_LABEL_BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\nvar COLUMN_LABEL_BASE_LENGTH = COLUMN_LABEL_BASE.length;\n\n/**\n * Generates spreadsheet-like column names: A, B, C, ..., Z, AA, AB, etc.\n *\n * @param {Number} index Column index.\n * @returns {String}\n */\nfunction spreadsheetColumnLabel(index) {\n  var dividend = index + 1;\n  var columnLabel = '';\n  var modulo = void 0;\n\n  while (dividend > 0) {\n    modulo = (dividend - 1) % COLUMN_LABEL_BASE_LENGTH;\n    columnLabel = String.fromCharCode(65 + modulo) + columnLabel;\n    dividend = parseInt((dividend - modulo) / COLUMN_LABEL_BASE_LENGTH, 10);\n  }\n\n  return columnLabel;\n}\n\n/**\n * Generates spreadsheet-like column index from theirs labels: A, B, C ...., Z, AA, AB, etc.\n *\n * @param {String} label Column label.\n * @returns {Number}\n */\nfunction spreadsheetColumnIndex(label) {\n  var result = 0;\n\n  if (label) {\n    for (var i = 0, j = label.length - 1; i < label.length; i += 1, j -= 1) {\n      result += Math.pow(COLUMN_LABEL_BASE_LENGTH, j) * (COLUMN_LABEL_BASE.indexOf(label[i]) + 1);\n    }\n  }\n  --result;\n\n  return result;\n}\n\n/**\n * Creates 2D array of Excel-like values \"A1\", \"A2\", ...\n *\n * @param {Number} rows Number of rows to generate.\n * @param {Number} columns Number of columns to generate.\n * @returns {Array}\n */\nfunction createSpreadsheetData() {\n  var rows = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100;\n  var columns = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 4;\n\n  var _rows = [],\n      i,\n      j;\n\n  for (i = 0; i < rows; i++) {\n    var row = [];\n\n    for (j = 0; j < columns; j++) {\n      row.push(spreadsheetColumnLabel(j) + (i + 1));\n    }\n    _rows.push(row);\n  }\n\n  return _rows;\n}\n\n/**\n * Creates 2D array of Excel-like values \"A1\", \"A2\", as an array of objects.\n *\n * @param {Number} rows Number of rows to generate.\n * @param {Number} colCount Number of columns to generate.\n * @returns {Array}\n */\nfunction createSpreadsheetObjectData() {\n  var rows = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100;\n  var colCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 4;\n\n  var _rows = [],\n      i,\n      j;\n\n  for (i = 0; i < rows; i++) {\n    var row = {};\n\n    for (j = 0; j < colCount; j++) {\n      row['prop' + j] = spreadsheetColumnLabel(j) + (i + 1);\n    }\n    _rows.push(row);\n  }\n\n  return _rows;\n}\n\n/**\n * Generates an empty data object.\n *\n * @param {Number} rows Number of rows to generate.\n * @param {Number} columns Number of columns to generate\n * @returns {Array}\n */\nfunction createEmptySpreadsheetData(rows, columns) {\n  var data = [];\n  var row = void 0;\n\n  for (var i = 0; i < rows; i++) {\n    row = [];\n    for (var j = 0; j < columns; j++) {\n      row.push('');\n    }\n    data.push(row);\n  }\n\n  return data;\n}\n\nfunction translateRowsToColumns(input) {\n  var i,\n      ilen,\n      j,\n      jlen,\n      output = [],\n      olen = 0;\n\n  for (i = 0, ilen = input.length; i < ilen; i++) {\n    for (j = 0, jlen = input[i].length; j < jlen; j++) {\n      if (j == olen) {\n        output.push([]);\n        olen++;\n      }\n      output[j].push(input[i][j]);\n    }\n  }\n\n  return output;\n}\n\n/**\n * Factory that produces a function for searching methods (or any properties) which could be defined directly in\n * table configuration or implicitly, within cell type definition.\n *\n * For example: renderer can be defined explicitly using \"renderer\" property in column configuration or it can be\n * defined implicitly using \"type\" property.\n *\n * Methods/properties defined explicitly always takes precedence over those defined through \"type\".\n *\n * If the method/property is not found in an object, searching is continued recursively through prototype chain, until\n * it reaches the Object.prototype.\n *\n *\n * @param methodName {String} name of the method/property to search (i.e. 'renderer', 'validator', 'copyable')\n * @param allowUndefined {Boolean} [optional] if false, the search is continued if methodName has not been found in cell \"type\"\n * @returns {Function}\n */\nfunction cellMethodLookupFactory(methodName, allowUndefined) {\n\n  allowUndefined = typeof allowUndefined == 'undefined' ? true : allowUndefined;\n\n  return function cellMethodLookup(row, col) {\n    return function getMethodFromProperties(properties) {\n\n      if (!properties) {\n        return; // method not found\n      } else if ((0, _object.hasOwnProperty)(properties, methodName) && properties[methodName] !== void 0) {\n        // check if it is own and is not empty\n        return properties[methodName]; // method defined directly\n      } else if ((0, _object.hasOwnProperty)(properties, 'type') && properties.type) {\n        // check if it is own and is not empty\n        var type;\n\n        if (typeof properties.type != 'string') {\n          throw new Error('Cell type must be a string ');\n        }\n        type = (0, _cellTypes.getCellType)(properties.type);\n\n        if ((0, _object.hasOwnProperty)(type, methodName)) {\n          return type[methodName]; // method defined in type.\n        } else if (allowUndefined) {\n          return; // method does not defined in type (eg. validator), returns undefined\n        }\n      }\n\n      return getMethodFromProperties(Object.getPrototypeOf(properties));\n    }(typeof row == 'number' ? this.getCellMeta(row, col) : row);\n  };\n}\n\n/***/ }),\n/* 91 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.SELECTION_TYPES = exports.SELECTION_TYPE_OBJECT = exports.SELECTION_TYPE_ARRAY = exports.SELECTION_TYPE_EMPTY = exports.SELECTION_TYPE_UNRECOGNIZED = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.detectSelectionType = detectSelectionType;\nexports.normalizeSelectionFactory = normalizeSelectionFactory;\nexports.transformSelectionToColumnDistance = transformSelectionToColumnDistance;\nexports.transformSelectionToRowDistance = transformSelectionToRowDistance;\nexports.isValidCoord = isValidCoord;\n\nvar _src = __webpack_require__(4);\n\nvar _array = __webpack_require__(1);\n\nvar _mixed = __webpack_require__(16);\n\nvar SELECTION_TYPE_UNRECOGNIZED = exports.SELECTION_TYPE_UNRECOGNIZED = 0;\nvar SELECTION_TYPE_EMPTY = exports.SELECTION_TYPE_EMPTY = 1;\nvar SELECTION_TYPE_ARRAY = exports.SELECTION_TYPE_ARRAY = 2;\nvar SELECTION_TYPE_OBJECT = exports.SELECTION_TYPE_OBJECT = 3;\nvar SELECTION_TYPES = exports.SELECTION_TYPES = [SELECTION_TYPE_OBJECT, SELECTION_TYPE_ARRAY];\nvar ARRAY_TYPE_PATTERN = [['number'], ['number', 'string'], ['number', 'undefined'], ['number', 'string', 'undefined']];\nvar rootCall = Symbol('root');\nvar childCall = Symbol('child');\n\n/**\n * Detect selection schema structure.\n *\n * @param {*} selectionRanges The selected range or and array of selected ranges. This type of data is produced by\n *                            `hot.getSelected()`, `hot.getSelectedLast()`, `hot.getSelectedRange()`\n *                            and `hot.getSelectedRangeLast()` methods.\n * @returns {Number} Returns a number that specifies the type of detected selection schema. If selection schema type\n *                   is unrecognized than it returns `0`.\n */\nfunction detectSelectionType(selectionRanges) {\n  var _callSymbol = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : rootCall;\n\n  if (_callSymbol !== rootCall && _callSymbol !== childCall) {\n    throw new Error('The second argument is used internally only and cannot be overwritten.');\n  }\n\n  var isArray = Array.isArray(selectionRanges);\n  var isRootCall = _callSymbol === rootCall;\n  var result = SELECTION_TYPE_UNRECOGNIZED;\n\n  if (isArray) {\n    var firstItem = selectionRanges[0];\n\n    if (selectionRanges.length === 0) {\n      result = SELECTION_TYPE_EMPTY;\n    } else if (isRootCall && firstItem instanceof _src.CellRange) {\n      result = SELECTION_TYPE_OBJECT;\n    } else if (isRootCall && Array.isArray(firstItem)) {\n      result = detectSelectionType(firstItem, childCall);\n    } else if (selectionRanges.length >= 2 && selectionRanges.length <= 4) {\n      var isArrayType = !selectionRanges.some(function (value, index) {\n        return !ARRAY_TYPE_PATTERN[index].includes(typeof value === 'undefined' ? 'undefined' : _typeof(value));\n      });\n\n      if (isArrayType) {\n        result = SELECTION_TYPE_ARRAY;\n      }\n    }\n  }\n\n  return result;\n}\n\n/**\n * Factory function designed for normalization data schema from different data structures of the selection ranges.\n *\n * @param {String} type Selection type which will be processed.\n * @param {Object} [options]\n * @param {Boolean} [options.keepDirection=false] If `true`, the coordinates which contain the direction of the\n *                                                selected cells won't be changed. Otherwise, the selection will be\n *                                                normalized to values starting from top-left to bottom-right.\n * @param {Function} [options.propToCol] Pass the converting function (usually `datamap.propToCol`) if the column\n *                                       defined as props should be normalized to the numeric values.\n * @returns {Number[]} Returns normalized data about selected range as an array (`[rowStart, columnStart, rowEnd, columnEnd]`).\n */\nfunction normalizeSelectionFactory(type) {\n  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref$keepDirection = _ref.keepDirection,\n      keepDirection = _ref$keepDirection === undefined ? false : _ref$keepDirection,\n      propToCol = _ref.propToCol;\n\n  if (!SELECTION_TYPES.includes(type)) {\n    throw new Error('Unsupported selection ranges schema type was provided.');\n  }\n\n  return function (selection) {\n    var isObjectType = type === SELECTION_TYPE_OBJECT;\n    var rowStart = isObjectType ? selection.from.row : selection[0];\n    var columnStart = isObjectType ? selection.from.col : selection[1];\n    var rowEnd = isObjectType ? selection.to.row : selection[2];\n    var columnEnd = isObjectType ? selection.to.col : selection[3];\n\n    if (typeof propToCol === 'function') {\n      if (typeof columnStart === 'string') {\n        columnStart = propToCol(columnStart);\n      }\n      if (typeof columnEnd === 'string') {\n        columnEnd = propToCol(columnEnd);\n      }\n    }\n\n    if ((0, _mixed.isUndefined)(rowEnd)) {\n      rowEnd = rowStart;\n    }\n    if ((0, _mixed.isUndefined)(columnEnd)) {\n      columnEnd = columnStart;\n    }\n\n    if (!keepDirection) {\n      var origRowStart = rowStart;\n      var origColumnStart = columnStart;\n      var origRowEnd = rowEnd;\n      var origColumnEnd = columnEnd;\n\n      rowStart = Math.min(origRowStart, origRowEnd);\n      columnStart = Math.min(origColumnStart, origColumnEnd);\n      rowEnd = Math.max(origRowStart, origRowEnd);\n      columnEnd = Math.max(origColumnStart, origColumnEnd);\n    }\n\n    return [rowStart, columnStart, rowEnd, columnEnd];\n  };\n}\n\n/**\n * Function transform selection ranges (produced by `hot.getSelected()` and `hot.getSelectedRange()`) to normalized\n * data structure. It merges repeated ranges into consecutive coordinates. The returned structure\n * contains an array of arrays. The single item contains at index 0 visual column index from the selection was\n * started and at index 1 distance as a count of selected columns.\n *\n * @param {Array[]|CellRange[]} selectionRanges Selection ranges produced by Handsontable.\n * @return {Array[]} Returns an array of arrays with ranges defines in that schema:\n *                   `[[visualColumnStart, distance], [visualColumnStart, distance], ...]`.\n *                   The column distances are always created starting from the left (zero index) to the\n *                   right (the latest column index).\n */\nfunction transformSelectionToColumnDistance(selectionRanges) {\n  var selectionType = detectSelectionType(selectionRanges);\n\n  if (selectionType === SELECTION_TYPE_UNRECOGNIZED || selectionType === SELECTION_TYPE_EMPTY) {\n    return [];\n  }\n\n  var selectionSchemaNormalizer = normalizeSelectionFactory(selectionType);\n  var unorderedIndexes = new Set();\n\n  // Iterate through all ranges and collect all column indexes which are not saved yet.\n  (0, _array.arrayEach)(selectionRanges, function (selection) {\n    var _selectionSchemaNorma = selectionSchemaNormalizer(selection),\n        _selectionSchemaNorma2 = _slicedToArray(_selectionSchemaNorma, 4),\n        columnStart = _selectionSchemaNorma2[1],\n        columnEnd = _selectionSchemaNorma2[3];\n\n    var amount = columnEnd - columnStart + 1;\n\n    (0, _array.arrayEach)(Array.from(new Array(amount), function (_, i) {\n      return columnStart + i;\n    }), function (index) {\n      if (!unorderedIndexes.has(index)) {\n        unorderedIndexes.add(index);\n      }\n    });\n  });\n\n  // Sort indexes in ascending order to easily detecting non-consecutive columns.\n  var orderedIndexes = Array.from(unorderedIndexes).sort(function (a, b) {\n    return a - b;\n  });\n  var normalizedColumnRanges = (0, _array.arrayReduce)(orderedIndexes, function (acc, visualColumnIndex, index, array) {\n    if (index !== 0 && visualColumnIndex === array[index - 1] + 1) {\n      acc[acc.length - 1][1]++;\n    } else {\n      acc.push([visualColumnIndex, 1]);\n    }\n\n    return acc;\n  }, []);\n\n  return normalizedColumnRanges;\n}\n\n/**\n * Function transform selection ranges (produced by `hot.getSelected()` and `hot.getSelectedRange()`) to normalized\n * data structure. It merges repeated ranges into consecutive coordinates. The returned structure\n * contains an array of arrays. The single item contains at index 0 visual column index from the selection was\n * started and at index 1 distance as a count of selected columns.\n *\n * @param {Array[]|CellRange[]} selectionRanges Selection ranges produced by Handsontable.\n * @return {Array[]} Returns an array of arrays with ranges defines in that schema:\n *                   `[[visualColumnStart, distance], [visualColumnStart, distance], ...]`.\n *                   The column distances are always created starting from the left (zero index) to the\n *                   right (the latest column index).\n */\nfunction transformSelectionToRowDistance(selectionRanges) {\n  var selectionType = detectSelectionType(selectionRanges);\n\n  if (selectionType === SELECTION_TYPE_UNRECOGNIZED || selectionType === SELECTION_TYPE_EMPTY) {\n    return [];\n  }\n\n  var selectionSchemaNormalizer = normalizeSelectionFactory(selectionType);\n  var unorderedIndexes = new Set();\n\n  // Iterate through all ranges and collect all column indexes which are not saved yet.\n  (0, _array.arrayEach)(selectionRanges, function (selection) {\n    var _selectionSchemaNorma3 = selectionSchemaNormalizer(selection),\n        _selectionSchemaNorma4 = _slicedToArray(_selectionSchemaNorma3, 3),\n        rowStart = _selectionSchemaNorma4[0],\n        rowEnd = _selectionSchemaNorma4[2];\n\n    var amount = rowEnd - rowStart + 1;\n\n    (0, _array.arrayEach)(Array.from(new Array(amount), function (_, i) {\n      return rowStart + i;\n    }), function (index) {\n      if (!unorderedIndexes.has(index)) {\n        unorderedIndexes.add(index);\n      }\n    });\n  });\n\n  // Sort indexes in ascending order to easily detecting non-consecutive columns.\n  var orderedIndexes = Array.from(unorderedIndexes).sort(function (a, b) {\n    return a - b;\n  });\n  var normalizedRowRanges = (0, _array.arrayReduce)(orderedIndexes, function (acc, rowIndex, index, array) {\n    if (index !== 0 && rowIndex === array[index - 1] + 1) {\n      acc[acc.length - 1][1]++;\n    } else {\n      acc.push([rowIndex, 1]);\n    }\n\n    return acc;\n  }, []);\n\n  return normalizedRowRanges;\n}\n\n/**\n * Check if passed value can be treated as valid cell coordinate. The second argument is\n * used to check if the value doesn't exceed the defined max table rows/columns count.\n *\n * @param {*} coord\n * @param {Number} maxTableItemsCount The value that declares the maximum coordinate that is still validatable.\n * @return {Boolean}\n */\nfunction isValidCoord(coord) {\n  var maxTableItemsCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Infinity;\n\n  return typeof coord === 'number' && coord >= 0 && coord < maxTableItemsCount;\n};\n\n/***/ }),\n/* 92 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class GhostTable\n * @util\n */\nvar GhostTable = function () {\n  function GhostTable(hotInstance) {\n    _classCallCheck(this, GhostTable);\n\n    /**\n     * Handsontable instance.\n     *\n     * @type {Core}\n     */\n    this.hot = hotInstance;\n    /**\n     * Container element where every table will be injected.\n     *\n     * @type {HTMLElement|null}\n     */\n    this.container = null;\n    /**\n     * Flag which determine is table was injected to DOM.\n     *\n     * @type {Boolean}\n     */\n    this.injected = false;\n    /**\n     * Added rows collection.\n     *\n     * @type {Array}\n     */\n    this.rows = [];\n    /**\n     * Added columns collection.\n     *\n     * @type {Array}\n     */\n    this.columns = [];\n    /**\n     * Samples prepared for calculations.\n     *\n     * @type {Map}\n     * @default {null}\n     */\n    this.samples = null;\n    /**\n     * Ghost table settings.\n     *\n     * @type {Object}\n     * @default {Object}\n     */\n    this.settings = {\n      useHeaders: true\n    };\n  }\n\n  /**\n   * Add row.\n   *\n   * @param {Number} row Row index.\n   * @param {Map} samples Samples Map object.\n   */\n\n\n  _createClass(GhostTable, [{\n    key: 'addRow',\n    value: function addRow(row, samples) {\n      if (this.columns.length) {\n        throw new Error('Doesn\\'t support multi-dimensional table');\n      }\n      if (!this.rows.length) {\n        this.container = this.createContainer(this.hot.rootElement.className);\n      }\n      var rowObject = { row: row };\n      this.rows.push(rowObject);\n\n      this.samples = samples;\n      this.table = this.createTable(this.hot.table.className);\n      this.table.colGroup.appendChild(this.createColGroupsCol());\n      this.table.tr.appendChild(this.createRow(row));\n      this.container.container.appendChild(this.table.fragment);\n\n      rowObject.table = this.table.table;\n    }\n\n    /**\n     * Add a row consisting of the column headers.\n     */\n\n  }, {\n    key: 'addColumnHeadersRow',\n    value: function addColumnHeadersRow(samples) {\n      if (this.hot.getColHeader(0) != null) {\n        var rowObject = { row: -1 };\n        this.rows.push(rowObject);\n\n        this.container = this.createContainer(this.hot.rootElement.className);\n\n        this.samples = samples;\n        this.table = this.createTable(this.hot.table.className);\n        this.table.colGroup.appendChild(this.createColGroupsCol());\n        this.table.tHead.appendChild(this.createColumnHeadersRow());\n        this.container.container.appendChild(this.table.fragment);\n\n        rowObject.table = this.table.table;\n      }\n    }\n\n    /**\n     * Add column.\n     *\n     * @param {Number} column Column index.\n     * @param {Map} samples Samples Map object.\n     */\n\n  }, {\n    key: 'addColumn',\n    value: function addColumn(column, samples) {\n      if (this.rows.length) {\n        throw new Error('Doesn\\'t support multi-dimensional table');\n      }\n      if (!this.columns.length) {\n        this.container = this.createContainer(this.hot.rootElement.className);\n      }\n      var columnObject = { col: column };\n      this.columns.push(columnObject);\n\n      this.samples = samples;\n      this.table = this.createTable(this.hot.table.className);\n\n      if (this.getSetting('useHeaders') && this.hot.getColHeader(column) !== null) {\n        this.hot.view.appendColHeader(column, this.table.th);\n      }\n      this.table.tBody.appendChild(this.createCol(column));\n      this.container.container.appendChild(this.table.fragment);\n\n      columnObject.table = this.table.table;\n    }\n\n    /**\n     * Get calculated heights.\n     *\n     * @param {Function} callback Callback which will be fired for each calculated row.\n     */\n\n  }, {\n    key: 'getHeights',\n    value: function getHeights(callback) {\n      if (!this.injected) {\n        this.injectTable();\n      }\n      (0, _array.arrayEach)(this.rows, function (row) {\n        // -1 <- reduce border-top from table\n        callback(row.row, (0, _element.outerHeight)(row.table) - 1);\n      });\n    }\n\n    /**\n     * Get calculated widths.\n     *\n     * @param {Function} callback Callback which will be fired for each calculated column.\n     */\n\n  }, {\n    key: 'getWidths',\n    value: function getWidths(callback) {\n      if (!this.injected) {\n        this.injectTable();\n      }\n      (0, _array.arrayEach)(this.columns, function (column) {\n        callback(column.col, (0, _element.outerWidth)(column.table));\n      });\n    }\n\n    /**\n     * Set the Ghost Table settings to the provided object.\n     *\n     * @param {Object} settings New Ghost Table Settings\n     */\n\n  }, {\n    key: 'setSettings',\n    value: function setSettings(settings) {\n      this.settings = settings;\n    }\n\n    /**\n     * Set a single setting of the Ghost Table.\n     *\n     * @param {String} name Setting name.\n     * @param {*} value Setting value.\n     */\n\n  }, {\n    key: 'setSetting',\n    value: function setSetting(name, value) {\n      if (!this.settings) {\n        this.settings = {};\n      }\n\n      this.settings[name] = value;\n    }\n\n    /**\n     * Get the Ghost Table settings.\n     *\n     * @returns {Object|null}\n     */\n\n  }, {\n    key: 'getSettings',\n    value: function getSettings() {\n      return this.settings;\n    }\n\n    /**\n     * Get a single Ghost Table setting.\n     *\n     * @param {String} name\n     * @returns {Boolean|null}\n     */\n\n  }, {\n    key: 'getSetting',\n    value: function getSetting(name) {\n      if (this.settings) {\n        return this.settings[name];\n      }\n      return null;\n    }\n\n    /**\n     * Create colgroup col elements.\n     *\n     * @returns {DocumentFragment}\n     */\n\n  }, {\n    key: 'createColGroupsCol',\n    value: function createColGroupsCol() {\n      var _this = this;\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n\n      if (this.hot.hasRowHeaders()) {\n        fragment.appendChild(this.createColElement(-1));\n      }\n\n      this.samples.forEach(function (sample) {\n        (0, _array.arrayEach)(sample.strings, function (string) {\n          fragment.appendChild(_this.createColElement(string.col));\n        });\n      });\n\n      return fragment;\n    }\n\n    /**\n     * Create table row element.\n     *\n     * @param {Number} row Row index.\n     * @returns {DocumentFragment} Returns created table row elements.\n     */\n\n  }, {\n    key: 'createRow',\n    value: function createRow(row) {\n      var _this2 = this;\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n      var th = d.createElement('th');\n\n      if (this.hot.hasRowHeaders()) {\n        this.hot.view.appendRowHeader(row, th);\n\n        fragment.appendChild(th);\n      }\n\n      this.samples.forEach(function (sample) {\n        (0, _array.arrayEach)(sample.strings, function (string) {\n          var column = string.col;\n          var cellProperties = _this2.hot.getCellMeta(row, column);\n\n          cellProperties.col = column;\n          cellProperties.row = row;\n\n          var renderer = _this2.hot.getCellRenderer(cellProperties);\n          var td = d.createElement('td');\n\n          renderer(_this2.hot, td, row, column, _this2.hot.colToProp(column), string.value, cellProperties);\n          fragment.appendChild(td);\n        });\n      });\n\n      return fragment;\n    }\n  }, {\n    key: 'createColumnHeadersRow',\n    value: function createColumnHeadersRow() {\n      var _this3 = this;\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n\n      if (this.hot.hasRowHeaders()) {\n        var th = d.createElement('th');\n        this.hot.view.appendColHeader(-1, th);\n        fragment.appendChild(th);\n      }\n\n      this.samples.forEach(function (sample) {\n        (0, _array.arrayEach)(sample.strings, function (string) {\n          var column = string.col;\n\n          var th = d.createElement('th');\n\n          _this3.hot.view.appendColHeader(column, th);\n          fragment.appendChild(th);\n        });\n      });\n\n      return fragment;\n    }\n\n    /**\n     * Create table column elements.\n     *\n     * @param {Number} column Column index.\n     * @returns {DocumentFragment} Returns created column table column elements.\n     */\n\n  }, {\n    key: 'createCol',\n    value: function createCol(column) {\n      var _this4 = this;\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n\n      this.samples.forEach(function (sample) {\n        (0, _array.arrayEach)(sample.strings, function (string) {\n          var row = string.row;\n          var cellProperties = _this4.hot.getCellMeta(row, column);\n\n          cellProperties.col = column;\n          cellProperties.row = row;\n\n          var renderer = _this4.hot.getCellRenderer(cellProperties);\n          var td = d.createElement('td');\n          var tr = d.createElement('tr');\n\n          renderer(_this4.hot, td, row, column, _this4.hot.colToProp(column), string.value, cellProperties);\n          tr.appendChild(td);\n          fragment.appendChild(tr);\n        });\n      });\n\n      return fragment;\n    }\n\n    /**\n     * Remove table from document and reset internal state.\n     */\n\n  }, {\n    key: 'clean',\n    value: function clean() {\n      this.rows.length = 0;\n      this.rows[-1] = void 0;\n      this.columns.length = 0;\n\n      if (this.samples) {\n        this.samples.clear();\n      }\n      this.samples = null;\n      this.removeTable();\n    }\n\n    /**\n     * Inject generated table into document.\n     *\n     * @param {HTMLElement} [parent=null]\n     */\n\n  }, {\n    key: 'injectTable',\n    value: function injectTable() {\n      var parent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      if (!this.injected) {\n        (parent || this.hot.rootElement).appendChild(this.container.fragment);\n        this.injected = true;\n      }\n    }\n\n    /**\n     * Remove table from document.\n     */\n\n  }, {\n    key: 'removeTable',\n    value: function removeTable() {\n      if (this.injected && this.container.container.parentNode) {\n        this.container.container.parentNode.removeChild(this.container.container);\n        this.container = null;\n        this.injected = false;\n      }\n    }\n\n    /**\n     * Create col element.\n     *\n     * @param {Number} column Column index.\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createColElement',\n    value: function createColElement(column) {\n      var d = document;\n      var col = d.createElement('col');\n\n      col.style.width = this.hot.view.wt.wtTable.getStretchedColumnWidth(column) + 'px';\n\n      return col;\n    }\n\n    /**\n     * Create table element.\n     *\n     * @param {String} className\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'createTable',\n    value: function createTable() {\n      var className = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n      var table = d.createElement('table');\n      var tHead = d.createElement('thead');\n      var tBody = d.createElement('tbody');\n      var colGroup = d.createElement('colgroup');\n      var tr = d.createElement('tr');\n      var th = d.createElement('th');\n\n      if (this.isVertical()) {\n        table.appendChild(colGroup);\n      }\n      if (this.isHorizontal()) {\n        tr.appendChild(th);\n        tHead.appendChild(tr);\n        table.style.tableLayout = 'auto';\n        table.style.width = 'auto';\n      }\n      table.appendChild(tHead);\n\n      if (this.isVertical()) {\n        tBody.appendChild(tr);\n      }\n      table.appendChild(tBody);\n      (0, _element.addClass)(table, className);\n      fragment.appendChild(table);\n\n      return { fragment: fragment, table: table, tHead: tHead, tBody: tBody, colGroup: colGroup, tr: tr, th: th };\n    }\n\n    /**\n     * Create container for tables.\n     *\n     * @param {String} className\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'createContainer',\n    value: function createContainer() {\n      var className = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      var d = document;\n      var fragment = d.createDocumentFragment();\n      var container = d.createElement('div');\n\n      className = 'htGhostTable htAutoSize ' + className.trim();\n      (0, _element.addClass)(container, className);\n      fragment.appendChild(container);\n\n      return { fragment: fragment, container: container };\n    }\n\n    /**\n     * Checks if table is raised vertically (checking rows).\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isVertical',\n    value: function isVertical() {\n      return !!(this.rows.length && !this.columns.length);\n    }\n\n    /**\n     * Checks if table is raised horizontally (checking columns).\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isHorizontal',\n    value: function isHorizontal() {\n      return !!(this.columns.length && !this.rows.length);\n    }\n  }]);\n\n  return GhostTable;\n}();\n\nexports.default = GhostTable;\n\n/***/ }),\n/* 93 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = separatorItem;\nvar KEY = exports.KEY = '---------';\n\nfunction separatorItem() {\n  return {\n    name: KEY\n  };\n}\n\n/***/ }),\n/* 94 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.ITEMS = exports.UNDO = exports.SEPARATOR = exports.ROW_BELOW = exports.ROW_ABOVE = exports.REMOVE_ROW = exports.REMOVE_COLUMN = exports.REDO = exports.READ_ONLY = exports.COLUMN_RIGHT = exports.COLUMN_LEFT = exports.CLEAR_COLUMN = exports.ALIGNMENT = undefined;\n\nvar _predefinedItems2;\n\nvar _alignment = __webpack_require__(300);\n\nObject.defineProperty(exports, 'ALIGNMENT', {\n  enumerable: true,\n  get: function get() {\n    return _alignment.KEY;\n  }\n});\n\nvar _clearColumn = __webpack_require__(301);\n\nObject.defineProperty(exports, 'CLEAR_COLUMN', {\n  enumerable: true,\n  get: function get() {\n    return _clearColumn.KEY;\n  }\n});\n\nvar _columnLeft = __webpack_require__(302);\n\nObject.defineProperty(exports, 'COLUMN_LEFT', {\n  enumerable: true,\n  get: function get() {\n    return _columnLeft.KEY;\n  }\n});\n\nvar _columnRight = __webpack_require__(303);\n\nObject.defineProperty(exports, 'COLUMN_RIGHT', {\n  enumerable: true,\n  get: function get() {\n    return _columnRight.KEY;\n  }\n});\n\nvar _readOnly = __webpack_require__(304);\n\nObject.defineProperty(exports, 'READ_ONLY', {\n  enumerable: true,\n  get: function get() {\n    return _readOnly.KEY;\n  }\n});\n\nvar _redo = __webpack_require__(305);\n\nObject.defineProperty(exports, 'REDO', {\n  enumerable: true,\n  get: function get() {\n    return _redo.KEY;\n  }\n});\n\nvar _removeColumn = __webpack_require__(306);\n\nObject.defineProperty(exports, 'REMOVE_COLUMN', {\n  enumerable: true,\n  get: function get() {\n    return _removeColumn.KEY;\n  }\n});\n\nvar _removeRow = __webpack_require__(307);\n\nObject.defineProperty(exports, 'REMOVE_ROW', {\n  enumerable: true,\n  get: function get() {\n    return _removeRow.KEY;\n  }\n});\n\nvar _rowAbove = __webpack_require__(308);\n\nObject.defineProperty(exports, 'ROW_ABOVE', {\n  enumerable: true,\n  get: function get() {\n    return _rowAbove.KEY;\n  }\n});\n\nvar _rowBelow = __webpack_require__(309);\n\nObject.defineProperty(exports, 'ROW_BELOW', {\n  enumerable: true,\n  get: function get() {\n    return _rowBelow.KEY;\n  }\n});\n\nvar _separator = __webpack_require__(93);\n\nObject.defineProperty(exports, 'SEPARATOR', {\n  enumerable: true,\n  get: function get() {\n    return _separator.KEY;\n  }\n});\n\nvar _undo = __webpack_require__(310);\n\nObject.defineProperty(exports, 'UNDO', {\n  enumerable: true,\n  get: function get() {\n    return _undo.KEY;\n  }\n});\nexports.predefinedItems = predefinedItems;\nexports.addItem = addItem;\n\nvar _object = __webpack_require__(2);\n\nvar _alignment2 = _interopRequireDefault(_alignment);\n\nvar _clearColumn2 = _interopRequireDefault(_clearColumn);\n\nvar _columnLeft2 = _interopRequireDefault(_columnLeft);\n\nvar _columnRight2 = _interopRequireDefault(_columnRight);\n\nvar _readOnly2 = _interopRequireDefault(_readOnly);\n\nvar _redo2 = _interopRequireDefault(_redo);\n\nvar _removeColumn2 = _interopRequireDefault(_removeColumn);\n\nvar _removeRow2 = _interopRequireDefault(_removeRow);\n\nvar _rowAbove2 = _interopRequireDefault(_rowAbove);\n\nvar _rowBelow2 = _interopRequireDefault(_rowBelow);\n\nvar _separator2 = _interopRequireDefault(_separator);\n\nvar _undo2 = _interopRequireDefault(_undo);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar ITEMS = exports.ITEMS = [_rowAbove.KEY, _rowBelow.KEY, _columnLeft.KEY, _columnRight.KEY, _clearColumn.KEY, _removeRow.KEY, _removeColumn.KEY, _undo.KEY, _redo.KEY, _readOnly.KEY, _alignment.KEY, _separator.KEY];\n\nvar _predefinedItems = (_predefinedItems2 = {}, _defineProperty(_predefinedItems2, _separator.KEY, _separator2.default), _defineProperty(_predefinedItems2, _rowAbove.KEY, _rowAbove2.default), _defineProperty(_predefinedItems2, _rowBelow.KEY, _rowBelow2.default), _defineProperty(_predefinedItems2, _columnLeft.KEY, _columnLeft2.default), _defineProperty(_predefinedItems2, _columnRight.KEY, _columnRight2.default), _defineProperty(_predefinedItems2, _clearColumn.KEY, _clearColumn2.default), _defineProperty(_predefinedItems2, _removeRow.KEY, _removeRow2.default), _defineProperty(_predefinedItems2, _removeColumn.KEY, _removeColumn2.default), _defineProperty(_predefinedItems2, _undo.KEY, _undo2.default), _defineProperty(_predefinedItems2, _redo.KEY, _redo2.default), _defineProperty(_predefinedItems2, _readOnly.KEY, _readOnly2.default), _defineProperty(_predefinedItems2, _alignment.KEY, _alignment2.default), _predefinedItems2);\n\n/**\n * Gets new object with all predefined menu items.\n *\n * @returns {Object}\n */\nfunction predefinedItems() {\n  var items = {};\n\n  (0, _object.objectEach)(_predefinedItems, function (itemFactory, key) {\n    items[key] = itemFactory();\n  });\n\n  return items;\n}\n\n/**\n * Add new predefined menu item to the collection.\n *\n * @param {String} key Menu command id.\n * @param {Object} item Object command descriptor.\n */\nfunction addItem(key, item) {\n  if (ITEMS.indexOf(key) === -1) {\n    _predefinedItems[key] = item;\n  }\n}\n\n/***/ }),\n/* 95 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['The merged cell declared with {row: ', ', col: ', ', rowspan: \\n    ', ', colspan: ', '} contains negative values, which is not supported. It \\n    will not be added to the collection.'], ['The merged cell declared with {row: ', ', col: ', ', rowspan: \\n    ', ', colspan: ', '} contains negative values, which is not supported. It \\n    will not be added to the collection.']),\n    _templateObject2 = _taggedTemplateLiteral(['The merged cell declared at [', ', ', '] is positioned (or positioned partially) \\n       outside of the table range. It was not added to the table, please fix your setup.'], ['The merged cell declared at [', ', ', '] is positioned (or positioned partially) \\n       outside of the table range. It was not added to the table, please fix your setup.']),\n    _templateObject3 = _taggedTemplateLiteral(['The merged cell declared at [', ', ', '] has both \"rowspan\" \\n     and \"colspan\" declared as \"1\", which makes it a single cell. It cannot be added to the collection.'], ['The merged cell declared at [', ', ', '] has both \"rowspan\" \\n     and \"colspan\" declared as \"1\", which makes it a single cell. It cannot be added to the collection.']),\n    _templateObject4 = _taggedTemplateLiteral(['The merged cell declared at [', ', ', '] has \"rowspan\" or \"colspan\" declared as \\n      \"0\", which is not supported. It cannot be added to the collection.'], ['The merged cell declared at [', ', ', '] has \"rowspan\" or \"colspan\" declared as \\n      \"0\", which is not supported. It cannot be added to the collection.']);\n\nvar _index = __webpack_require__(4);\n\nvar _templateLiteralTag = __webpack_require__(41);\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * The `MergedCellCoords` class represents a single merged cell.\n *\n * @class MergedCellCoords\n * @plugin MergeCells\n */\nvar MergedCellCoords = function () {\n  function MergedCellCoords(row, column, rowspan, colspan) {\n    _classCallCheck(this, MergedCellCoords);\n\n    /**\n     * The index of the topmost merged cell row.\n     *\n     * @type {Number}\n     */\n    this.row = row;\n    /**\n     * The index of the leftmost column.\n     *\n     * @type {Number}\n     */\n    this.col = column;\n    /**\n     * The `rowspan` value of the merged cell.\n     *\n     * @type {Number}\n     */\n    this.rowspan = rowspan;\n    /**\n     * The `colspan` value of the merged cell.\n     *\n     * @type {Number}\n     */\n    this.colspan = colspan;\n    /**\n     * `true` only if the merged cell is bound to be removed.\n     *\n     * @type {Boolean}\n     */\n    this.removed = false;\n  }\n\n  /**\n   * Get a warning message for when the declared merged cell data contains negative values.\n   *\n   * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n   * @return {String}\n   */\n\n\n  _createClass(MergedCellCoords, [{\n    key: 'normalize',\n\n\n    /**\n     * Sanitize (prevent from going outside the boundaries) the merged cell.\n     *\n     * @param hotInstance\n     */\n    value: function normalize(hotInstance) {\n      var totalRows = hotInstance.countRows();\n      var totalColumns = hotInstance.countCols();\n\n      if (this.row < 0) {\n        this.row = 0;\n      } else if (this.row > totalRows - 1) {\n        this.row = totalRows - 1;\n      }\n\n      if (this.col < 0) {\n        this.col = 0;\n      } else if (this.col > totalColumns - 1) {\n        this.col = totalColumns - 1;\n      }\n\n      if (this.row + this.rowspan > totalRows - 1) {\n        this.rowspan = totalRows - this.row;\n      }\n\n      if (this.col + this.colspan > totalColumns - 1) {\n        this.colspan = totalColumns - this.col;\n      }\n    }\n\n    /**\n     * Returns `true` if the provided coordinates are inside the merged cell.\n     *\n     * @param {Number} row The row index.\n     * @param {Number} column The column index.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'includes',\n    value: function includes(row, column) {\n      return this.row <= row && this.col <= column && this.row + this.rowspan - 1 >= row && this.col + this.colspan - 1 >= column;\n    }\n\n    /**\n     * Returns `true` if the provided `column` property is within the column span of the merged cell.\n     *\n     * @param {Number} column The column index.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'includesHorizontally',\n    value: function includesHorizontally(column) {\n      return this.col <= column && this.col + this.colspan - 1 >= column;\n    }\n\n    /**\n     * Returns `true` if the provided `row` property is within the row span of the merged cell.\n     *\n     * @param {Number} row Row index.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'includesVertically',\n    value: function includesVertically(row) {\n      return this.row <= row && this.row + this.rowspan - 1 >= row;\n    }\n\n    /**\n     * Shift (and possibly resize, if needed) the merged cell.\n     *\n     * @param {Array} shiftVector 2-element array containing the information on the shifting in the `x` and `y` axis.\n     * @param {Number} indexOfChange Index of the preceding change.\n     * @returns {Boolean} Returns `false` if the whole merged cell was removed.\n     */\n\n  }, {\n    key: 'shift',\n    value: function shift(shiftVector, indexOfChange) {\n      var shiftValue = shiftVector[0] || shiftVector[1];\n      var shiftedIndex = indexOfChange + Math.abs(shiftVector[0] || shiftVector[1]) - 1;\n      var span = shiftVector[0] ? 'colspan' : 'rowspan';\n      var index = shiftVector[0] ? 'col' : 'row';\n      var changeStart = Math.min(indexOfChange, shiftedIndex);\n      var changeEnd = Math.max(indexOfChange, shiftedIndex);\n      var mergeStart = this[index];\n      var mergeEnd = this[index] + this[span] - 1;\n\n      if (mergeStart >= indexOfChange) {\n        this[index] += shiftValue;\n      }\n\n      // adding rows/columns\n      if (shiftValue > 0) {\n        if (indexOfChange <= mergeEnd && indexOfChange > mergeStart) {\n          this[span] += shiftValue;\n        }\n\n        // removing rows/columns\n      } else if (shiftValue < 0) {\n\n        // removing the whole merge\n        if (changeStart <= mergeStart && changeEnd >= mergeEnd) {\n          this.removed = true;\n          return false;\n\n          // removing the merge partially, including the beginning\n        } else if (mergeStart >= changeStart && mergeStart <= changeEnd) {\n          var removedOffset = changeEnd - mergeStart + 1;\n          var preRemovedOffset = Math.abs(shiftValue) - removedOffset;\n\n          this[index] -= preRemovedOffset + shiftValue;\n          this[span] -= removedOffset;\n\n          // removing the middle part of the merge\n        } else if (mergeStart <= changeStart && mergeEnd >= changeEnd) {\n          this[span] += shiftValue;\n\n          // removing the end part of the merge\n        } else if (mergeStart <= changeStart && mergeEnd >= changeStart && mergeEnd < changeEnd) {\n          var removedPart = mergeEnd - changeStart + 1;\n\n          this[span] -= removedPart;\n        }\n      }\n\n      return true;\n    }\n\n    /**\n     * Check if the second provided merged cell is \"farther\" in the provided direction.\n     *\n     * @param {MergedCellCoords} mergedCell The merged cell to check.\n     * @param {String} direction Drag direction.\n     * @return {Boolean|null} `true` if the second provided merged cell is \"farther\".\n     */\n\n  }, {\n    key: 'isFarther',\n    value: function isFarther(mergedCell, direction) {\n      if (!mergedCell) {\n        return true;\n      }\n\n      if (direction === 'down') {\n        return mergedCell.row + mergedCell.rowspan - 1 < this.row + this.rowspan - 1;\n      } else if (direction === 'up') {\n        return mergedCell.row > this.row;\n      } else if (direction === 'right') {\n        return mergedCell.col + mergedCell.colspan - 1 < this.col + this.colspan - 1;\n      } else if (direction === 'left') {\n        return mergedCell.col > this.col;\n      }\n      return null;\n    }\n\n    /**\n     * Get the bottom row index of the merged cell.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getLastRow',\n    value: function getLastRow() {\n      return this.row + this.rowspan - 1;\n    }\n\n    /**\n     * Get the rightmost column index of the merged cell.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getLastColumn',\n    value: function getLastColumn() {\n      return this.col + this.colspan - 1;\n    }\n\n    /**\n     * Get the range coordinates of the merged cell.\n     *\n     * @return {CellRange}\n     */\n\n  }, {\n    key: 'getRange',\n    value: function getRange() {\n      return new _index.CellRange(new _index.CellCoords(this.row, this.col), new _index.CellCoords(this.row, this.col), new _index.CellCoords(this.getLastRow(), this.getLastColumn()));\n    }\n  }], [{\n    key: 'NEGATIVE_VALUES_WARNING',\n    value: function NEGATIVE_VALUES_WARNING(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject, newMergedCell.row, newMergedCell.col, newMergedCell.rowspan, newMergedCell.colspan);\n    }\n\n    /**\n     * Get a warning message for when the declared merged cell data contains values exceeding the table limits.\n     *\n     * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n     * @return {String}\n     */\n\n  }, {\n    key: 'IS_OUT_OF_BOUNDS_WARNING',\n    value: function IS_OUT_OF_BOUNDS_WARNING(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject2, newMergedCell.row, newMergedCell.col);\n    }\n\n    /**\n     * Get a warning message for when the declared merged cell data represents a single cell.\n     *\n     * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n     * @return {String}\n     */\n\n  }, {\n    key: 'IS_SINGLE_CELL',\n    value: function IS_SINGLE_CELL(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject3, newMergedCell.row, newMergedCell.col);\n    }\n\n    /**\n     * Get a warning message for when the declared merged cell data contains \"colspan\" or \"rowspan\", that equals 0.\n     *\n     * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n     * @return {String}\n     */\n\n  }, {\n    key: 'ZERO_SPAN_WARNING',\n    value: function ZERO_SPAN_WARNING(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject4, newMergedCell.row, newMergedCell.col);\n    }\n\n    /**\n     * Check whether the values provided for a merged cell contain any negative values.\n     *\n     * @param {Object} mergedCellInfo Object containing the `row`, `col`, `rowspan` and `colspan` properties.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'containsNegativeValues',\n    value: function containsNegativeValues(mergedCellInfo) {\n      return mergedCellInfo.row < 0 || mergedCellInfo.col < 0 || mergedCellInfo.rowspan < 0 || mergedCellInfo.colspan < 0;\n    }\n\n    /**\n     * Check whether the provided merged cell information object represents a single cell.\n     *\n     * @private\n     * @param {Object} mergedCellInfo An object with `row`, `col`, `rowspan` and `colspan` properties.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSingleCell',\n    value: function isSingleCell(mergedCellInfo) {\n      return mergedCellInfo.colspan === 1 && mergedCellInfo.rowspan === 1;\n    }\n\n    /**\n     * Check whether the provided merged cell information object contains a rowspan or colspan of 0.\n     *\n     * @private\n     * @param {Object} mergedCellInfo An object with `row`, `col`, `rowspan` and `colspan` properties.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'containsZeroSpan',\n    value: function containsZeroSpan(mergedCellInfo) {\n      return mergedCellInfo.colspan === 0 || mergedCellInfo.rowspan === 0;\n    }\n\n    /**\n     * Check whether the provided merged cell object is to be declared out of bounds of the table.\n     *\n     * @param {Object} mergeCell Object containing the `row`, `col`, `rowspan` and `colspan` properties.\n     * @param {Number} rowCount Number of rows in the table.\n     * @param {Number} columnCount Number of rows in the table.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isOutOfBounds',\n    value: function isOutOfBounds(mergeCell, rowCount, columnCount) {\n      return mergeCell.row < 0 || mergeCell.col < 0 || mergeCell.row >= rowCount || mergeCell.row + mergeCell.rowspan - 1 >= rowCount || mergeCell.col >= columnCount || mergeCell.col + mergeCell.colspan - 1 >= columnCount;\n    }\n  }]);\n\n  return MergedCellCoords;\n}();\n\nexports.default = MergedCellCoords;\n\n/***/ }),\n/* 96 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar strong = __webpack_require__(97);\nvar validate = __webpack_require__(45);\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = __webpack_require__(66)(MAP, function (get) {\n  return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.1.3.6 Map.prototype.get(key)\n  get: function get(key) {\n    var entry = strong.getEntry(validate(this, MAP), key);\n    return entry && entry.v;\n  },\n  // 23.1.3.9 Map.prototype.set(key, value)\n  set: function set(key, value) {\n    return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n  }\n}, strong, true);\n\n\n/***/ }),\n/* 97 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar dP = __webpack_require__(20).f;\nvar create = __webpack_require__(74);\nvar redefineAll = __webpack_require__(61);\nvar ctx = __webpack_require__(32);\nvar anInstance = __webpack_require__(63);\nvar forOf = __webpack_require__(64);\nvar $iterDefine = __webpack_require__(106);\nvar step = __webpack_require__(108);\nvar setSpecies = __webpack_require__(109);\nvar DESCRIPTORS = __webpack_require__(22);\nvar fastKey = __webpack_require__(34).fastKey;\nvar validate = __webpack_require__(45);\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n  // fast case\n  var index = fastKey(key);\n  var entry;\n  if (index !== 'F') return that._i[index];\n  // frozen object case\n  for (entry = that._f; entry; entry = entry.n) {\n    if (entry.k == key) return entry;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      anInstance(that, C, NAME, '_i');\n      that._t = NAME;         // collection type\n      that._i = create(null); // index\n      that._f = undefined;    // first entry\n      that._l = undefined;    // last entry\n      that[SIZE] = 0;         // size\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.1.3.1 Map.prototype.clear()\n      // 23.2.3.2 Set.prototype.clear()\n      clear: function clear() {\n        for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n          entry.r = true;\n          if (entry.p) entry.p = entry.p.n = undefined;\n          delete data[entry.i];\n        }\n        that._f = that._l = undefined;\n        that[SIZE] = 0;\n      },\n      // 23.1.3.3 Map.prototype.delete(key)\n      // 23.2.3.4 Set.prototype.delete(value)\n      'delete': function (key) {\n        var that = validate(this, NAME);\n        var entry = getEntry(that, key);\n        if (entry) {\n          var next = entry.n;\n          var prev = entry.p;\n          delete that._i[entry.i];\n          entry.r = true;\n          if (prev) prev.n = next;\n          if (next) next.p = prev;\n          if (that._f == entry) that._f = next;\n          if (that._l == entry) that._l = prev;\n          that[SIZE]--;\n        } return !!entry;\n      },\n      // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n      // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n      forEach: function forEach(callbackfn /* , that = undefined */) {\n        validate(this, NAME);\n        var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n        var entry;\n        while (entry = entry ? entry.n : this._f) {\n          f(entry.v, entry.k, this);\n          // revert to the last existing entry\n          while (entry && entry.r) entry = entry.p;\n        }\n      },\n      // 23.1.3.7 Map.prototype.has(key)\n      // 23.2.3.7 Set.prototype.has(value)\n      has: function has(key) {\n        return !!getEntry(validate(this, NAME), key);\n      }\n    });\n    if (DESCRIPTORS) dP(C.prototype, 'size', {\n      get: function () {\n        return validate(this, NAME)[SIZE];\n      }\n    });\n    return C;\n  },\n  def: function (that, key, value) {\n    var entry = getEntry(that, key);\n    var prev, index;\n    // change existing entry\n    if (entry) {\n      entry.v = value;\n    // create new entry\n    } else {\n      that._l = entry = {\n        i: index = fastKey(key, true), // <- index\n        k: key,                        // <- key\n        v: value,                      // <- value\n        p: prev = that._l,             // <- previous entry\n        n: undefined,                  // <- next entry\n        r: false                       // <- removed\n      };\n      if (!that._f) that._f = entry;\n      if (prev) prev.n = entry;\n      that[SIZE]++;\n      // add to index\n      if (index !== 'F') that._i[index] = entry;\n    } return that;\n  },\n  getEntry: getEntry,\n  setStrong: function (C, NAME, IS_MAP) {\n    // add .keys, .values, .entries, [@@iterator]\n    // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n    $iterDefine(C, NAME, function (iterated, kind) {\n      this._t = validate(iterated, NAME); // target\n      this._k = kind;                     // kind\n      this._l = undefined;                // previous\n    }, function () {\n      var that = this;\n      var kind = that._k;\n      var entry = that._l;\n      // revert to the last existing entry\n      while (entry && entry.r) entry = entry.p;\n      // get next entry\n      if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n        // or finish the iteration\n        that._t = undefined;\n        return step(1);\n      }\n      // return step by kind\n      if (kind == 'keys') return step(0, entry.k);\n      if (kind == 'values') return step(0, entry.v);\n      return step(0, [entry.k, entry.v]);\n    }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n    // add [@@species], 23.1.2.2, 23.2.2.2\n    setSpecies(NAME);\n  }\n};\n\n\n/***/ }),\n/* 98 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = !__webpack_require__(22) && !__webpack_require__(23)(function () {\n  return Object.defineProperty(__webpack_require__(72)('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n/* 99 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar has = __webpack_require__(29);\nvar toIObject = __webpack_require__(24);\nvar arrayIndexOf = __webpack_require__(100)(false);\nvar IE_PROTO = __webpack_require__(76)('IE_PROTO');\n\nmodule.exports = function (object, names) {\n  var O = toIObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (has(O, key = names[i++])) {\n    ~arrayIndexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n\n\n/***/ }),\n/* 100 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = __webpack_require__(24);\nvar toLength = __webpack_require__(25);\nvar toAbsoluteIndex = __webpack_require__(60);\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIObject($this);\n    var length = toLength(O.length);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n      if (O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n\n\n/***/ }),\n/* 101 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar document = __webpack_require__(14).document;\nmodule.exports = document && document.documentElement;\n\n\n/***/ }),\n/* 102 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// call something on iterator step with safe closing on error\nvar anObject = __webpack_require__(18);\nmodule.exports = function (iterator, fn, value, entries) {\n  try {\n    return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n  // 7.4.6 IteratorClose(iterator, completion)\n  } catch (e) {\n    var ret = iterator['return'];\n    if (ret !== undefined) anObject(ret.call(iterator));\n    throw e;\n  }\n};\n\n\n/***/ }),\n/* 103 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// check on default Array iterator\nvar Iterators = __webpack_require__(50);\nvar ITERATOR = __webpack_require__(11)('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n\n\n/***/ }),\n/* 104 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar classof = __webpack_require__(105);\nvar ITERATOR = __webpack_require__(11)('iterator');\nvar Iterators = __webpack_require__(50);\nmodule.exports = __webpack_require__(44).getIteratorMethod = function (it) {\n  if (it != undefined) return it[ITERATOR]\n    || it['@@iterator']\n    || Iterators[classof(it)];\n};\n\n\n/***/ }),\n/* 105 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(43);\nvar TAG = __webpack_require__(11)('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n    // builtinTag case\n    : ARG ? cof(O)\n    // ES3 arguments fallback\n    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\n\n/***/ }),\n/* 106 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(65);\nvar $export = __webpack_require__(3);\nvar redefine = __webpack_require__(30);\nvar hide = __webpack_require__(31);\nvar Iterators = __webpack_require__(50);\nvar $iterCreate = __webpack_require__(208);\nvar setToStringTag = __webpack_require__(51);\nvar getPrototypeOf = __webpack_require__(107);\nvar ITERATOR = __webpack_require__(11)('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function (kind) {\n    if (!BUGGY && kind in proto) return proto[kind];\n    switch (kind) {\n      case KEYS: return function keys() { return new Constructor(this, kind); };\n      case VALUES: return function values() { return new Constructor(this, kind); };\n    } return function entries() { return new Constructor(this, kind); };\n  };\n  var TAG = NAME + ' Iterator';\n  var DEF_VALUES = DEFAULT == VALUES;\n  var VALUES_BUG = false;\n  var proto = Base.prototype;\n  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n  var $default = $native || getMethod(DEFAULT);\n  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n  var methods, key, IteratorPrototype;\n  // Fix native\n  if ($anyNative) {\n    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n      // Set @@toStringTag to native iterators\n      setToStringTag(IteratorPrototype, TAG, true);\n      // fix for some old engines\n      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n    }\n  }\n  // fix Array#{values, @@iterator}.name in V8 / FF\n  if (DEF_VALUES && $native && $native.name !== VALUES) {\n    VALUES_BUG = true;\n    $default = function values() { return $native.call(this); };\n  }\n  // Define iterator\n  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG] = returnThis;\n  if (DEFAULT) {\n    methods = {\n      values: DEF_VALUES ? $default : getMethod(VALUES),\n      keys: IS_SET ? $default : getMethod(KEYS),\n      entries: $entries\n    };\n    if (FORCED) for (key in methods) {\n      if (!(key in proto)) redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n\n\n/***/ }),\n/* 107 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(29);\nvar toObject = __webpack_require__(33);\nvar IE_PROTO = __webpack_require__(76)('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n  O = toObject(O);\n  if (has(O, IE_PROTO)) return O[IE_PROTO];\n  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  } return O instanceof Object ? ObjectProto : null;\n};\n\n\n/***/ }),\n/* 108 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (done, value) {\n  return { value: value, done: !!done };\n};\n\n\n/***/ }),\n/* 109 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar global = __webpack_require__(14);\nvar dP = __webpack_require__(20);\nvar DESCRIPTORS = __webpack_require__(22);\nvar SPECIES = __webpack_require__(11)('species');\n\nmodule.exports = function (KEY) {\n  var C = global[KEY];\n  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n    configurable: true,\n    get: function () { return this; }\n  });\n};\n\n\n/***/ }),\n/* 110 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = __webpack_require__(9);\nvar anObject = __webpack_require__(18);\nvar check = function (O, proto) {\n  anObject(O);\n  if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n    function (test, buggy, set) {\n      try {\n        set = __webpack_require__(32)(Function.call, __webpack_require__(67).f(Object.prototype, '__proto__').set, 2);\n        set(test, []);\n        buggy = !(test instanceof Array);\n      } catch (e) { buggy = true; }\n      return function setPrototypeOf(O, proto) {\n        check(O, proto);\n        if (buggy) O.__proto__ = proto;\n        else set(O, proto);\n        return O;\n      };\n    }({}, false) : undefined),\n  check: check\n};\n\n\n/***/ }),\n/* 111 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar strong = __webpack_require__(97);\nvar validate = __webpack_require__(45);\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = __webpack_require__(66)(SET, function (get) {\n  return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.2.3.1 Set.prototype.add(value)\n  add: function add(value) {\n    return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n  }\n}, strong);\n\n\n/***/ }),\n/* 112 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar each = __webpack_require__(68)(0);\nvar redefine = __webpack_require__(30);\nvar meta = __webpack_require__(34);\nvar assign = __webpack_require__(114);\nvar weak = __webpack_require__(115);\nvar isObject = __webpack_require__(9);\nvar fails = __webpack_require__(23);\nvar validate = __webpack_require__(45);\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n  return function WeakMap() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n};\n\nvar methods = {\n  // 23.3.3.3 WeakMap.prototype.get(key)\n  get: function get(key) {\n    if (isObject(key)) {\n      var data = getWeak(key);\n      if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n      return data ? data[this._i] : undefined;\n    }\n  },\n  // 23.3.3.5 WeakMap.prototype.set(key, value)\n  set: function set(key, value) {\n    return weak.def(validate(this, WEAK_MAP), key, value);\n  }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = __webpack_require__(66)(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n  InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n  assign(InternalMap.prototype, methods);\n  meta.NEED = true;\n  each(['delete', 'has', 'get', 'set'], function (key) {\n    var proto = $WeakMap.prototype;\n    var method = proto[key];\n    redefine(proto, key, function (a, b) {\n      // store frozen objects on internal weakmap shim\n      if (isObject(a) && !isExtensible(a)) {\n        if (!this._f) this._f = new InternalMap();\n        var result = this._f[key](a, b);\n        return key == 'set' ? this : result;\n      // store all the rest on native weakmap\n      } return method.call(this, a, b);\n    });\n  });\n}\n\n\n/***/ }),\n/* 113 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.2.2 IsArray(argument)\nvar cof = __webpack_require__(43);\nmodule.exports = Array.isArray || function isArray(arg) {\n  return cof(arg) == 'Array';\n};\n\n\n/***/ }),\n/* 114 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = __webpack_require__(37);\nvar gOPS = __webpack_require__(69);\nvar pIE = __webpack_require__(52);\nvar toObject = __webpack_require__(33);\nvar IObject = __webpack_require__(75);\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || __webpack_require__(23)(function () {\n  var A = {};\n  var B = {};\n  // eslint-disable-next-line no-undef\n  var S = Symbol();\n  var K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function (k) { B[k] = k; });\n  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n  var T = toObject(target);\n  var aLen = arguments.length;\n  var index = 1;\n  var getSymbols = gOPS.f;\n  var isEnum = pIE.f;\n  while (aLen > index) {\n    var S = IObject(arguments[index++]);\n    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n    while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n  } return T;\n} : $assign;\n\n\n/***/ }),\n/* 115 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar redefineAll = __webpack_require__(61);\nvar getWeak = __webpack_require__(34).getWeak;\nvar anObject = __webpack_require__(18);\nvar isObject = __webpack_require__(9);\nvar anInstance = __webpack_require__(63);\nvar forOf = __webpack_require__(64);\nvar createArrayMethod = __webpack_require__(68);\nvar $has = __webpack_require__(29);\nvar validate = __webpack_require__(45);\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n  return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n  this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n  return arrayFind(store.a, function (it) {\n    return it[0] === key;\n  });\n};\nUncaughtFrozenStore.prototype = {\n  get: function (key) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) return entry[1];\n  },\n  has: function (key) {\n    return !!findUncaughtFrozen(this, key);\n  },\n  set: function (key, value) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) entry[1] = value;\n    else this.a.push([key, value]);\n  },\n  'delete': function (key) {\n    var index = arrayFindIndex(this.a, function (it) {\n      return it[0] === key;\n    });\n    if (~index) this.a.splice(index, 1);\n    return !!~index;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      anInstance(that, C, NAME, '_i');\n      that._t = NAME;      // collection type\n      that._i = id++;      // collection id\n      that._l = undefined; // leak store for uncaught frozen objects\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.3.3.2 WeakMap.prototype.delete(key)\n      // 23.4.3.3 WeakSet.prototype.delete(value)\n      'delete': function (key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n        return data && $has(data, this._i) && delete data[this._i];\n      },\n      // 23.3.3.4 WeakMap.prototype.has(key)\n      // 23.4.3.4 WeakSet.prototype.has(value)\n      has: function has(key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n        return data && $has(data, this._i);\n      }\n    });\n    return C;\n  },\n  def: function (that, key, value) {\n    var data = getWeak(anObject(key), true);\n    if (data === true) uncaughtFrozenStore(that).set(key, value);\n    else data[that._i] = value;\n    return that;\n  },\n  ufstore: uncaughtFrozenStore\n};\n\n\n/***/ }),\n/* 116 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar weak = __webpack_require__(115);\nvar validate = __webpack_require__(45);\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\n__webpack_require__(66)(WEAK_SET, function (get) {\n  return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.4.3.1 WeakSet.prototype.add(value)\n  add: function add(value) {\n    return weak.def(validate(this, WEAK_SET), value, true);\n  }\n}, weak, false, true);\n\n\n/***/ }),\n/* 117 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(65);\nvar global = __webpack_require__(14);\nvar ctx = __webpack_require__(32);\nvar classof = __webpack_require__(105);\nvar $export = __webpack_require__(3);\nvar isObject = __webpack_require__(9);\nvar aFunction = __webpack_require__(62);\nvar anInstance = __webpack_require__(63);\nvar forOf = __webpack_require__(64);\nvar speciesConstructor = __webpack_require__(212);\nvar task = __webpack_require__(80).set;\nvar microtask = __webpack_require__(214)();\nvar newPromiseCapabilityModule = __webpack_require__(118);\nvar perform = __webpack_require__(215);\nvar promiseResolve = __webpack_require__(216);\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n  try {\n    // correct subclassing with @@species support\n    var promise = $Promise.resolve(1);\n    var FakePromise = (promise.constructor = {})[__webpack_require__(11)('species')] = function (exec) {\n      exec(empty, empty);\n    };\n    // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n    return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;\n  } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n  var then;\n  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n  if (promise._n) return;\n  promise._n = true;\n  var chain = promise._c;\n  microtask(function () {\n    var value = promise._v;\n    var ok = promise._s == 1;\n    var i = 0;\n    var run = function (reaction) {\n      var handler = ok ? reaction.ok : reaction.fail;\n      var resolve = reaction.resolve;\n      var reject = reaction.reject;\n      var domain = reaction.domain;\n      var result, then, exited;\n      try {\n        if (handler) {\n          if (!ok) {\n            if (promise._h == 2) onHandleUnhandled(promise);\n            promise._h = 1;\n          }\n          if (handler === true) result = value;\n          else {\n            if (domain) domain.enter();\n            result = handler(value); // may throw\n            if (domain) {\n              domain.exit();\n              exited = true;\n            }\n          }\n          if (result === reaction.promise) {\n            reject(TypeError('Promise-chain cycle'));\n          } else if (then = isThenable(result)) {\n            then.call(result, resolve, reject);\n          } else resolve(result);\n        } else reject(value);\n      } catch (e) {\n        if (domain && !exited) domain.exit();\n        reject(e);\n      }\n    };\n    while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n    promise._c = [];\n    promise._n = false;\n    if (isReject && !promise._h) onUnhandled(promise);\n  });\n};\nvar onUnhandled = function (promise) {\n  task.call(global, function () {\n    var value = promise._v;\n    var unhandled = isUnhandled(promise);\n    var result, handler, console;\n    if (unhandled) {\n      result = perform(function () {\n        if (isNode) {\n          process.emit('unhandledRejection', value, promise);\n        } else if (handler = global.onunhandledrejection) {\n          handler({ promise: promise, reason: value });\n        } else if ((console = global.console) && console.error) {\n          console.error('Unhandled promise rejection', value);\n        }\n      });\n      // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n      promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n    } promise._a = undefined;\n    if (unhandled && result.e) throw result.v;\n  });\n};\nvar isUnhandled = function (promise) {\n  return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n  task.call(global, function () {\n    var handler;\n    if (isNode) {\n      process.emit('rejectionHandled', promise);\n    } else if (handler = global.onrejectionhandled) {\n      handler({ promise: promise, reason: promise._v });\n    }\n  });\n};\nvar $reject = function (value) {\n  var promise = this;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  promise._v = value;\n  promise._s = 2;\n  if (!promise._a) promise._a = promise._c.slice();\n  notify(promise, true);\n};\nvar $resolve = function (value) {\n  var promise = this;\n  var then;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  try {\n    if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n    if (then = isThenable(value)) {\n      microtask(function () {\n        var wrapper = { _w: promise, _d: false }; // wrap\n        try {\n          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n        } catch (e) {\n          $reject.call(wrapper, e);\n        }\n      });\n    } else {\n      promise._v = value;\n      promise._s = 1;\n      notify(promise, false);\n    }\n  } catch (e) {\n    $reject.call({ _w: promise, _d: false }, e); // wrap\n  }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n  // 25.4.3.1 Promise(executor)\n  $Promise = function Promise(executor) {\n    anInstance(this, $Promise, PROMISE, '_h');\n    aFunction(executor);\n    Internal.call(this);\n    try {\n      executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n    } catch (err) {\n      $reject.call(this, err);\n    }\n  };\n  // eslint-disable-next-line no-unused-vars\n  Internal = function Promise(executor) {\n    this._c = [];             // <- awaiting reactions\n    this._a = undefined;      // <- checked in isUnhandled reactions\n    this._s = 0;              // <- state\n    this._d = false;          // <- done\n    this._v = undefined;      // <- value\n    this._h = 0;              // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n    this._n = false;          // <- notify\n  };\n  Internal.prototype = __webpack_require__(61)($Promise.prototype, {\n    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n    then: function then(onFulfilled, onRejected) {\n      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n      reaction.fail = typeof onRejected == 'function' && onRejected;\n      reaction.domain = isNode ? process.domain : undefined;\n      this._c.push(reaction);\n      if (this._a) this._a.push(reaction);\n      if (this._s) notify(this, false);\n      return reaction.promise;\n    },\n    // 25.4.5.1 Promise.prototype.catch(onRejected)\n    'catch': function (onRejected) {\n      return this.then(undefined, onRejected);\n    }\n  });\n  OwnPromiseCapability = function () {\n    var promise = new Internal();\n    this.promise = promise;\n    this.resolve = ctx($resolve, promise, 1);\n    this.reject = ctx($reject, promise, 1);\n  };\n  newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n    return C === $Promise || C === Wrapper\n      ? new OwnPromiseCapability(C)\n      : newGenericPromiseCapability(C);\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\n__webpack_require__(51)($Promise, PROMISE);\n__webpack_require__(109)(PROMISE);\nWrapper = __webpack_require__(44)[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n  // 25.4.4.5 Promise.reject(r)\n  reject: function reject(r) {\n    var capability = newPromiseCapability(this);\n    var $$reject = capability.reject;\n    $$reject(r);\n    return capability.promise;\n  }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n  // 25.4.4.6 Promise.resolve(x)\n  resolve: function resolve(x) {\n    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n  }\n});\n$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(79)(function (iter) {\n  $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n  // 25.4.4.1 Promise.all(iterable)\n  all: function all(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var resolve = capability.resolve;\n    var reject = capability.reject;\n    var result = perform(function () {\n      var values = [];\n      var index = 0;\n      var remaining = 1;\n      forOf(iterable, false, function (promise) {\n        var $index = index++;\n        var alreadyCalled = false;\n        values.push(undefined);\n        remaining++;\n        C.resolve(promise).then(function (value) {\n          if (alreadyCalled) return;\n          alreadyCalled = true;\n          values[$index] = value;\n          --remaining || resolve(values);\n        }, reject);\n      });\n      --remaining || resolve(values);\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  },\n  // 25.4.4.4 Promise.race(iterable)\n  race: function race(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var reject = capability.reject;\n    var result = perform(function () {\n      forOf(iterable, false, function (promise) {\n        C.resolve(promise).then(capability.resolve, reject);\n      });\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  }\n});\n\n\n/***/ }),\n/* 118 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = __webpack_require__(62);\n\nfunction PromiseCapability(C) {\n  var resolve, reject;\n  this.promise = new C(function ($$resolve, $$reject) {\n    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n    resolve = $$resolve;\n    reject = $$reject;\n  });\n  this.resolve = aFunction(resolve);\n  this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n  return new PromiseCapability(C);\n};\n\n\n/***/ }),\n/* 119 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// ECMAScript 6 symbols shim\nvar global = __webpack_require__(14);\nvar has = __webpack_require__(29);\nvar DESCRIPTORS = __webpack_require__(22);\nvar $export = __webpack_require__(3);\nvar redefine = __webpack_require__(30);\nvar META = __webpack_require__(34).KEY;\nvar $fails = __webpack_require__(23);\nvar shared = __webpack_require__(77);\nvar setToStringTag = __webpack_require__(51);\nvar uid = __webpack_require__(48);\nvar wks = __webpack_require__(11);\nvar wksExt = __webpack_require__(120);\nvar wksDefine = __webpack_require__(217);\nvar enumKeys = __webpack_require__(218);\nvar isArray = __webpack_require__(113);\nvar anObject = __webpack_require__(18);\nvar isObject = __webpack_require__(9);\nvar toIObject = __webpack_require__(24);\nvar toPrimitive = __webpack_require__(73);\nvar createDesc = __webpack_require__(49);\nvar _create = __webpack_require__(74);\nvar gOPNExt = __webpack_require__(121);\nvar $GOPD = __webpack_require__(67);\nvar $DP = __webpack_require__(20);\nvar $keys = __webpack_require__(37);\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n  return _create(dP({}, 'a', {\n    get: function () { return dP(this, 'a', { value: 7 }).a; }\n  })).a != 7;\n}) ? function (it, key, D) {\n  var protoDesc = gOPD(ObjectProto, key);\n  if (protoDesc) delete ObjectProto[key];\n  dP(it, key, D);\n  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n  sym._k = tag;\n  return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n  return typeof it == 'symbol';\n} : function (it) {\n  return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n  anObject(it);\n  key = toPrimitive(key, true);\n  anObject(D);\n  if (has(AllSymbols, key)) {\n    if (!D.enumerable) {\n      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n      it[HIDDEN][key] = true;\n    } else {\n      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n      D = _create(D, { enumerable: createDesc(0, false) });\n    } return setSymbolDesc(it, key, D);\n  } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n  anObject(it);\n  var keys = enumKeys(P = toIObject(P));\n  var i = 0;\n  var l = keys.length;\n  var key;\n  while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n  return it;\n};\nvar $create = function create(it, P) {\n  return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n  var E = isEnum.call(this, key = toPrimitive(key, true));\n  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n  it = toIObject(it);\n  key = toPrimitive(key, true);\n  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n  var D = gOPD(it, key);\n  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n  return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n  var names = gOPN(toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n  } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n  var IS_OP = it === ObjectProto;\n  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n  } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n  $Symbol = function Symbol() {\n    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n    var $set = function (value) {\n      if (this === ObjectProto) $set.call(OPSymbols, value);\n      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n      setSymbolDesc(this, tag, createDesc(1, value));\n    };\n    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n    return wrap(tag);\n  };\n  redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n    return this._k;\n  });\n\n  $GOPD.f = $getOwnPropertyDescriptor;\n  $DP.f = $defineProperty;\n  __webpack_require__(81).f = gOPNExt.f = $getOwnPropertyNames;\n  __webpack_require__(52).f = $propertyIsEnumerable;\n  __webpack_require__(69).f = $getOwnPropertySymbols;\n\n  if (DESCRIPTORS && !__webpack_require__(65)) {\n    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n  }\n\n  wksExt.f = function (name) {\n    return wrap(wks(name));\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n  // 19.4.2.1 Symbol.for(key)\n  'for': function (key) {\n    return has(SymbolRegistry, key += '')\n      ? SymbolRegistry[key]\n      : SymbolRegistry[key] = $Symbol(key);\n  },\n  // 19.4.2.5 Symbol.keyFor(sym)\n  keyFor: function keyFor(sym) {\n    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n  },\n  useSetter: function () { setter = true; },\n  useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n  // 19.1.2.2 Object.create(O [, Properties])\n  create: $create,\n  // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n  defineProperty: $defineProperty,\n  // 19.1.2.3 Object.defineProperties(O, Properties)\n  defineProperties: $defineProperties,\n  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n  // 19.1.2.7 Object.getOwnPropertyNames(O)\n  getOwnPropertyNames: $getOwnPropertyNames,\n  // 19.1.2.8 Object.getOwnPropertySymbols(O)\n  getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n  var S = $Symbol();\n  // MS Edge converts symbol values to JSON as {}\n  // WebKit converts symbol values to JSON as null\n  // V8 throws on boxed symbols\n  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n  stringify: function stringify(it) {\n    var args = [it];\n    var i = 1;\n    var replacer, $replacer;\n    while (arguments.length > i) args.push(arguments[i++]);\n    $replacer = replacer = args[1];\n    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n    if (!isArray(replacer)) replacer = function (key, value) {\n      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n      if (!isSymbol(value)) return value;\n    };\n    args[1] = replacer;\n    return _stringify.apply($JSON, args);\n  }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(31)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n\n\n/***/ }),\n/* 120 */\n/***/ (function(module, exports, __webpack_require__) {\n\nexports.f = __webpack_require__(11);\n\n\n/***/ }),\n/* 121 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = __webpack_require__(24);\nvar gOPN = __webpack_require__(81).f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n  ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n  try {\n    return gOPN(it);\n  } catch (e) {\n    return windowNames.slice();\n  }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n\n\n/***/ }),\n/* 122 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.5 Object.freeze(O)\nvar isObject = __webpack_require__(9);\nvar meta = __webpack_require__(34).onFreeze;\n\n__webpack_require__(26)('freeze', function ($freeze) {\n  return function freeze(it) {\n    return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n  };\n});\n\n\n/***/ }),\n/* 123 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.17 Object.seal(O)\nvar isObject = __webpack_require__(9);\nvar meta = __webpack_require__(34).onFreeze;\n\n__webpack_require__(26)('seal', function ($seal) {\n  return function seal(it) {\n    return $seal && isObject(it) ? $seal(meta(it)) : it;\n  };\n});\n\n\n/***/ }),\n/* 124 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = __webpack_require__(9);\nvar meta = __webpack_require__(34).onFreeze;\n\n__webpack_require__(26)('preventExtensions', function ($preventExtensions) {\n  return function preventExtensions(it) {\n    return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n  };\n});\n\n\n/***/ }),\n/* 125 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.12 Object.isFrozen(O)\nvar isObject = __webpack_require__(9);\n\n__webpack_require__(26)('isFrozen', function ($isFrozen) {\n  return function isFrozen(it) {\n    return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n  };\n});\n\n\n/***/ }),\n/* 126 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.13 Object.isSealed(O)\nvar isObject = __webpack_require__(9);\n\n__webpack_require__(26)('isSealed', function ($isSealed) {\n  return function isSealed(it) {\n    return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n  };\n});\n\n\n/***/ }),\n/* 127 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.11 Object.isExtensible(O)\nvar isObject = __webpack_require__(9);\n\n__webpack_require__(26)('isExtensible', function ($isExtensible) {\n  return function isExtensible(it) {\n    return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n  };\n});\n\n\n/***/ }),\n/* 128 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = __webpack_require__(24);\nvar $getOwnPropertyDescriptor = __webpack_require__(67).f;\n\n__webpack_require__(26)('getOwnPropertyDescriptor', function () {\n  return function getOwnPropertyDescriptor(it, key) {\n    return $getOwnPropertyDescriptor(toIObject(it), key);\n  };\n});\n\n\n/***/ }),\n/* 129 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = __webpack_require__(33);\nvar $getPrototypeOf = __webpack_require__(107);\n\n__webpack_require__(26)('getPrototypeOf', function () {\n  return function getPrototypeOf(it) {\n    return $getPrototypeOf(toObject(it));\n  };\n});\n\n\n/***/ }),\n/* 130 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 Object.keys(O)\nvar toObject = __webpack_require__(33);\nvar $keys = __webpack_require__(37);\n\n__webpack_require__(26)('keys', function () {\n  return function keys(it) {\n    return $keys(toObject(it));\n  };\n});\n\n\n/***/ }),\n/* 131 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.7 Object.getOwnPropertyNames(O)\n__webpack_require__(26)('getOwnPropertyNames', function () {\n  return __webpack_require__(121).f;\n});\n\n\n/***/ }),\n/* 132 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.1 Object.assign(target, source)\nvar $export = __webpack_require__(3);\n\n$export($export.S + $export.F, 'Object', { assign: __webpack_require__(114) });\n\n\n/***/ }),\n/* 133 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.10 Object.is(value1, value2)\nvar $export = __webpack_require__(3);\n$export($export.S, 'Object', { is: __webpack_require__(219) });\n\n\n/***/ }),\n/* 134 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = __webpack_require__(3);\n$export($export.S, 'Object', { setPrototypeOf: __webpack_require__(110).set });\n\n\n/***/ }),\n/* 135 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(20).f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || __webpack_require__(22) && dP(FProto, NAME, {\n  configurable: true,\n  get: function () {\n    try {\n      return ('' + this).match(nameRE)[1];\n    } catch (e) {\n      return '';\n    }\n  }\n});\n\n\n/***/ }),\n/* 136 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\nvar toIObject = __webpack_require__(24);\nvar toLength = __webpack_require__(25);\n\n$export($export.S, 'String', {\n  // 21.1.2.4 String.raw(callSite, ...substitutions)\n  raw: function raw(callSite) {\n    var tpl = toIObject(callSite.raw);\n    var len = toLength(tpl.length);\n    var aLen = arguments.length;\n    var res = [];\n    var i = 0;\n    while (len > i) {\n      res.push(String(tpl[i++]));\n      if (i < aLen) res.push(String(arguments[i]));\n    } return res.join('');\n  }\n});\n\n\n/***/ }),\n/* 137 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\nvar toAbsoluteIndex = __webpack_require__(60);\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n  // 21.1.2.2 String.fromCodePoint(...codePoints)\n  fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n    var res = [];\n    var aLen = arguments.length;\n    var i = 0;\n    var code;\n    while (aLen > i) {\n      code = +arguments[i++];\n      if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n      res.push(code < 0x10000\n        ? fromCharCode(code)\n        : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n      );\n    } return res.join('');\n  }\n});\n\n\n/***/ }),\n/* 138 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(3);\nvar $at = __webpack_require__(220)(false);\n$export($export.P, 'String', {\n  // 21.1.3.3 String.prototype.codePointAt(pos)\n  codePointAt: function codePointAt(pos) {\n    return $at(this, pos);\n  }\n});\n\n\n/***/ }),\n/* 139 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\n\n$export($export.P, 'String', {\n  // 21.1.3.13 String.prototype.repeat(count)\n  repeat: __webpack_require__(140)\n});\n\n\n/***/ }),\n/* 140 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar toInteger = __webpack_require__(59);\nvar defined = __webpack_require__(38);\n\nmodule.exports = function repeat(count) {\n  var str = String(defined(this));\n  var res = '';\n  var n = toInteger(count);\n  if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n  for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n  return res;\n};\n\n\n/***/ }),\n/* 141 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n\nvar $export = __webpack_require__(3);\nvar toLength = __webpack_require__(25);\nvar context = __webpack_require__(82);\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * __webpack_require__(83)(STARTS_WITH), 'String', {\n  startsWith: function startsWith(searchString /* , position = 0 */) {\n    var that = context(this, searchString, STARTS_WITH);\n    var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n    var search = String(searchString);\n    return $startsWith\n      ? $startsWith.call(that, search, index)\n      : that.slice(index, index + search.length) === search;\n  }\n});\n\n\n/***/ }),\n/* 142 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.2.8 IsRegExp(argument)\nvar isObject = __webpack_require__(9);\nvar cof = __webpack_require__(43);\nvar MATCH = __webpack_require__(11)('match');\nmodule.exports = function (it) {\n  var isRegExp;\n  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n\n\n/***/ }),\n/* 143 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n\nvar $export = __webpack_require__(3);\nvar toLength = __webpack_require__(25);\nvar context = __webpack_require__(82);\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * __webpack_require__(83)(ENDS_WITH), 'String', {\n  endsWith: function endsWith(searchString /* , endPosition = @length */) {\n    var that = context(this, searchString, ENDS_WITH);\n    var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n    var len = toLength(that.length);\n    var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n    var search = String(searchString);\n    return $endsWith\n      ? $endsWith.call(that, search, end)\n      : that.slice(end - search.length, end) === search;\n  }\n});\n\n\n/***/ }),\n/* 144 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n\nvar $export = __webpack_require__(3);\nvar context = __webpack_require__(82);\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * __webpack_require__(83)(INCLUDES), 'String', {\n  includes: function includes(searchString /* , position = 0 */) {\n    return !!~context(this, searchString, INCLUDES)\n      .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n\n/***/ }),\n/* 145 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 21.2.5.3 get RegExp.prototype.flags()\nif (__webpack_require__(22) && /./g.flags != 'g') __webpack_require__(20).f(RegExp.prototype, 'flags', {\n  configurable: true,\n  get: __webpack_require__(221)\n});\n\n\n/***/ }),\n/* 146 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// @@match logic\n__webpack_require__(70)('match', 1, function (defined, MATCH, $match) {\n  // 21.1.3.11 String.prototype.match(regexp)\n  return [function match(regexp) {\n    'use strict';\n    var O = defined(this);\n    var fn = regexp == undefined ? undefined : regexp[MATCH];\n    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n  }, $match];\n});\n\n\n/***/ }),\n/* 147 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// @@replace logic\n__webpack_require__(70)('replace', 2, function (defined, REPLACE, $replace) {\n  // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n  return [function replace(searchValue, replaceValue) {\n    'use strict';\n    var O = defined(this);\n    var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n    return fn !== undefined\n      ? fn.call(searchValue, O, replaceValue)\n      : $replace.call(String(O), searchValue, replaceValue);\n  }, $replace];\n});\n\n\n/***/ }),\n/* 148 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// @@split logic\n__webpack_require__(70)('split', 2, function (defined, SPLIT, $split) {\n  'use strict';\n  var isRegExp = __webpack_require__(142);\n  var _split = $split;\n  var $push = [].push;\n  var $SPLIT = 'split';\n  var LENGTH = 'length';\n  var LAST_INDEX = 'lastIndex';\n  if (\n    'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n    'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n    'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n    '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n    '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n    ''[$SPLIT](/.?/)[LENGTH]\n  ) {\n    var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n    // based on es5-shim implementation, need to rework it\n    $split = function (separator, limit) {\n      var string = String(this);\n      if (separator === undefined && limit === 0) return [];\n      // If `separator` is not a regex, use native split\n      if (!isRegExp(separator)) return _split.call(string, separator, limit);\n      var output = [];\n      var flags = (separator.ignoreCase ? 'i' : '') +\n                  (separator.multiline ? 'm' : '') +\n                  (separator.unicode ? 'u' : '') +\n                  (separator.sticky ? 'y' : '');\n      var lastLastIndex = 0;\n      var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n      // Make `global` and avoid `lastIndex` issues by working with a copy\n      var separatorCopy = new RegExp(separator.source, flags + 'g');\n      var separator2, match, lastIndex, lastLength, i;\n      // Doesn't need flags gy, but they don't hurt\n      if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n      while (match = separatorCopy.exec(string)) {\n        // `separatorCopy.lastIndex` is not reliable cross-browser\n        lastIndex = match.index + match[0][LENGTH];\n        if (lastIndex > lastLastIndex) {\n          output.push(string.slice(lastLastIndex, match.index));\n          // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n          // eslint-disable-next-line no-loop-func\n          if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {\n            for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;\n          });\n          if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n          lastLength = match[0][LENGTH];\n          lastLastIndex = lastIndex;\n          if (output[LENGTH] >= splitLimit) break;\n        }\n        if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n      }\n      if (lastLastIndex === string[LENGTH]) {\n        if (lastLength || !separatorCopy.test('')) output.push('');\n      } else output.push(string.slice(lastLastIndex));\n      return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n    };\n  // Chakra, V8\n  } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n    $split = function (separator, limit) {\n      return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n    };\n  }\n  // 21.1.3.17 String.prototype.split(separator, limit)\n  return [function split(separator, limit) {\n    var O = defined(this);\n    var fn = separator == undefined ? undefined : separator[SPLIT];\n    return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n  }, $split];\n});\n\n\n/***/ }),\n/* 149 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// @@search logic\n__webpack_require__(70)('search', 1, function (defined, SEARCH, $search) {\n  // 21.1.3.15 String.prototype.search(regexp)\n  return [function search(regexp) {\n    'use strict';\n    var O = defined(this);\n    var fn = regexp == undefined ? undefined : regexp[SEARCH];\n    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n  }, $search];\n});\n\n\n/***/ }),\n/* 150 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar ctx = __webpack_require__(32);\nvar $export = __webpack_require__(3);\nvar toObject = __webpack_require__(33);\nvar call = __webpack_require__(102);\nvar isArrayIter = __webpack_require__(103);\nvar toLength = __webpack_require__(25);\nvar createProperty = __webpack_require__(84);\nvar getIterFn = __webpack_require__(104);\n\n$export($export.S + $export.F * !__webpack_require__(79)(function (iter) { Array.from(iter); }), 'Array', {\n  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n  from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n    var O = toObject(arrayLike);\n    var C = typeof this == 'function' ? this : Array;\n    var aLen = arguments.length;\n    var mapfn = aLen > 1 ? arguments[1] : undefined;\n    var mapping = mapfn !== undefined;\n    var index = 0;\n    var iterFn = getIterFn(O);\n    var length, result, step, iterator;\n    if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n    // if object isn't iterable or it's array with default iterator - use simple case\n    if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n      for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n        createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n      }\n    } else {\n      length = toLength(O.length);\n      for (result = new C(length); length > index; index++) {\n        createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n      }\n    }\n    result.length = index;\n    return result;\n  }\n});\n\n\n/***/ }),\n/* 151 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(3);\nvar createProperty = __webpack_require__(84);\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * __webpack_require__(23)(function () {\n  function F() { /* empty */ }\n  return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n  // 22.1.2.3 Array.of( ...items)\n  of: function of(/* ...args */) {\n    var index = 0;\n    var aLen = arguments.length;\n    var result = new (typeof this == 'function' ? this : Array)(aLen);\n    while (aLen > index) createProperty(result, index, arguments[index++]);\n    result.length = aLen;\n    return result;\n  }\n});\n\n\n/***/ }),\n/* 152 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = __webpack_require__(3);\n\n$export($export.P, 'Array', { copyWithin: __webpack_require__(222) });\n\n__webpack_require__(46)('copyWithin');\n\n\n/***/ }),\n/* 153 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = __webpack_require__(3);\nvar $find = __webpack_require__(68)(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n  find: function find(callbackfn /* , that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n__webpack_require__(46)(KEY);\n\n\n/***/ }),\n/* 154 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = __webpack_require__(3);\nvar $find = __webpack_require__(68)(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n  findIndex: function findIndex(callbackfn /* , that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n__webpack_require__(46)(KEY);\n\n\n/***/ }),\n/* 155 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = __webpack_require__(3);\n\n$export($export.P, 'Array', { fill: __webpack_require__(223) });\n\n__webpack_require__(46)('fill');\n\n\n/***/ }),\n/* 156 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.2 Number.isFinite(number)\nvar $export = __webpack_require__(3);\nvar _isFinite = __webpack_require__(14).isFinite;\n\n$export($export.S, 'Number', {\n  isFinite: function isFinite(it) {\n    return typeof it == 'number' && _isFinite(it);\n  }\n});\n\n\n/***/ }),\n/* 157 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.3 Number.isInteger(number)\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', { isInteger: __webpack_require__(158) });\n\n\n/***/ }),\n/* 158 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.3 Number.isInteger(number)\nvar isObject = __webpack_require__(9);\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n  return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n\n\n/***/ }),\n/* 159 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = __webpack_require__(3);\nvar isInteger = __webpack_require__(158);\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n  isSafeInteger: function isSafeInteger(number) {\n    return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n  }\n});\n\n\n/***/ }),\n/* 160 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.4 Number.isNaN(number)\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', {\n  isNaN: function isNaN(number) {\n    // eslint-disable-next-line no-self-compare\n    return number != number;\n  }\n});\n\n\n/***/ }),\n/* 161 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.1 Number.EPSILON\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n\n\n/***/ }),\n/* 162 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n\n\n/***/ }),\n/* 163 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = __webpack_require__(3);\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n\n\n/***/ }),\n/* 164 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/Array.prototype.includes\nvar $export = __webpack_require__(3);\nvar $includes = __webpack_require__(100)(true);\n\n$export($export.P, 'Array', {\n  includes: function includes(el /* , fromIndex = 0 */) {\n    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n__webpack_require__(46)('includes');\n\n\n/***/ }),\n/* 165 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-object-values-entries\nvar $export = __webpack_require__(3);\nvar $values = __webpack_require__(166)(false);\n\n$export($export.S, 'Object', {\n  values: function values(it) {\n    return $values(it);\n  }\n});\n\n\n/***/ }),\n/* 166 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar getKeys = __webpack_require__(37);\nvar toIObject = __webpack_require__(24);\nvar isEnum = __webpack_require__(52).f;\nmodule.exports = function (isEntries) {\n  return function (it) {\n    var O = toIObject(it);\n    var keys = getKeys(O);\n    var length = keys.length;\n    var i = 0;\n    var result = [];\n    var key;\n    while (length > i) if (isEnum.call(O, key = keys[i++])) {\n      result.push(isEntries ? [key, O[key]] : O[key]);\n    } return result;\n  };\n};\n\n\n/***/ }),\n/* 167 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-object-values-entries\nvar $export = __webpack_require__(3);\nvar $entries = __webpack_require__(166)(true);\n\n$export($export.S, 'Object', {\n  entries: function entries(it) {\n    return $entries(it);\n  }\n});\n\n\n/***/ }),\n/* 168 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = __webpack_require__(3);\nvar ownKeys = __webpack_require__(224);\nvar toIObject = __webpack_require__(24);\nvar gOPD = __webpack_require__(67);\nvar createProperty = __webpack_require__(84);\n\n$export($export.S, 'Object', {\n  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n    var O = toIObject(object);\n    var getDesc = gOPD.f;\n    var keys = ownKeys(O);\n    var result = {};\n    var i = 0;\n    var key, desc;\n    while (keys.length > i) {\n      desc = getDesc(O, key = keys[i++]);\n      if (desc !== undefined) createProperty(result, key, desc);\n    }\n    return result;\n  }\n});\n\n\n/***/ }),\n/* 169 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = __webpack_require__(3);\nvar $pad = __webpack_require__(170);\nvar userAgent = __webpack_require__(171);\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n  padStart: function padStart(maxLength /* , fillString = ' ' */) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n  }\n});\n\n\n/***/ }),\n/* 170 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = __webpack_require__(25);\nvar repeat = __webpack_require__(140);\nvar defined = __webpack_require__(38);\n\nmodule.exports = function (that, maxLength, fillString, left) {\n  var S = String(defined(that));\n  var stringLength = S.length;\n  var fillStr = fillString === undefined ? ' ' : String(fillString);\n  var intMaxLength = toLength(maxLength);\n  if (intMaxLength <= stringLength || fillStr == '') return S;\n  var fillLen = intMaxLength - stringLength;\n  var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n  if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n  return left ? stringFiller + S : S + stringFiller;\n};\n\n\n/***/ }),\n/* 171 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n\n\n/***/ }),\n/* 172 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = __webpack_require__(3);\nvar $pad = __webpack_require__(170);\nvar userAgent = __webpack_require__(171);\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n  padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n  }\n});\n\n\n/***/ }),\n/* 173 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\nvar $task = __webpack_require__(80);\n$export($export.G + $export.B, {\n  setImmediate: $task.set,\n  clearImmediate: $task.clear\n});\n\n\n/***/ }),\n/* 174 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $iterators = __webpack_require__(85);\nvar getKeys = __webpack_require__(37);\nvar redefine = __webpack_require__(30);\nvar global = __webpack_require__(14);\nvar hide = __webpack_require__(31);\nvar Iterators = __webpack_require__(50);\nvar wks = __webpack_require__(11);\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n  CSSRuleList: true, // TODO: Not spec compliant, should be false.\n  CSSStyleDeclaration: false,\n  CSSValueList: false,\n  ClientRectList: false,\n  DOMRectList: false,\n  DOMStringList: false,\n  DOMTokenList: true,\n  DataTransferItemList: false,\n  FileList: false,\n  HTMLAllCollection: false,\n  HTMLCollection: false,\n  HTMLFormElement: false,\n  HTMLSelectElement: false,\n  MediaList: true, // TODO: Not spec compliant, should be false.\n  MimeTypeArray: false,\n  NamedNodeMap: false,\n  NodeList: true,\n  PaintRequestList: false,\n  Plugin: false,\n  PluginArray: false,\n  SVGLengthList: false,\n  SVGNumberList: false,\n  SVGPathSegList: false,\n  SVGPointList: false,\n  SVGStringList: false,\n  SVGTransformList: false,\n  SourceBufferList: false,\n  StyleSheetList: true, // TODO: Not spec compliant, should be false.\n  TextTrackCueList: false,\n  TextTrackList: false,\n  TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n  var NAME = collections[i];\n  var explicit = DOMIterables[NAME];\n  var Collection = global[NAME];\n  var proto = Collection && Collection.prototype;\n  var key;\n  if (proto) {\n    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n    Iterators[NAME] = ArrayValues;\n    if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n  }\n}\n\n\n/***/ }),\n/* 175 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar privatePool = new WeakMap();\n\n/**\n * Calculates indexes of columns to render OR columns that are visible.\n * To redo the calculation, you need to create a new calculator.\n *\n * @class ViewportColumnsCalculator\n */\n\nvar ViewportColumnsCalculator = function () {\n  _createClass(ViewportColumnsCalculator, null, [{\n    key: 'DEFAULT_WIDTH',\n\n    /**\n     * Default column width\n     *\n     * @type {Number}\n     */\n    get: function get() {\n      return 50;\n    }\n\n    /**\n     * @param {Number} viewportWidth Width of the viewport\n     * @param {Number} scrollOffset Current horizontal scroll position of the viewport\n     * @param {Number} totalColumns Total number of rows\n     * @param {Function} columnWidthFn Function that returns the width of the column at a given index (in px)\n     * @param {Function} overrideFn Function that changes calculated this.startRow, this.endRow (used by MergeCells plugin)\n     * @param {Boolean} onlyFullyVisible if `true`, only startRow and endRow will be indexes of rows that are fully in viewport\n     * @param {Boolean} stretchH\n     * @param {Function} [stretchingColumnWidthFn] Function that returns the new width of the stretched column.\n     */\n\n  }]);\n\n  function ViewportColumnsCalculator(viewportWidth, scrollOffset, totalColumns, columnWidthFn, overrideFn, onlyFullyVisible, stretchH) {\n    var stretchingColumnWidthFn = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : function (width) {\n      return width;\n    };\n\n    _classCallCheck(this, ViewportColumnsCalculator);\n\n    privatePool.set(this, {\n      viewportWidth: viewportWidth,\n      scrollOffset: scrollOffset,\n      totalColumns: totalColumns,\n      columnWidthFn: columnWidthFn,\n      overrideFn: overrideFn,\n      onlyFullyVisible: onlyFullyVisible,\n      stretchingColumnWidthFn: stretchingColumnWidthFn\n    });\n\n    /**\n     * Number of rendered/visible columns\n     *\n     * @type {Number}\n     */\n    this.count = 0;\n\n    /**\n     * Index of the first rendered/visible column (can be overwritten using overrideFn)\n     *\n     * @type {Number|null}\n     */\n    this.startColumn = null;\n\n    /**\n     * Index of the last rendered/visible column (can be overwritten using overrideFn)\n     *\n     * @type {null}\n     */\n    this.endColumn = null;\n\n    /**\n     * Position of the first rendered/visible column (in px)\n     *\n     * @type {Number|null}\n     */\n    this.startPosition = null;\n\n    this.stretchAllRatio = 0;\n    this.stretchLastWidth = 0;\n    this.stretch = stretchH;\n    this.totalTargetWidth = 0;\n    this.needVerifyLastColumnWidth = true;\n    this.stretchAllColumnsWidth = [];\n\n    this.calculate();\n  }\n\n  /**\n   * Calculates viewport\n   */\n\n\n  _createClass(ViewportColumnsCalculator, [{\n    key: 'calculate',\n    value: function calculate() {\n      var sum = 0;\n      var needReverse = true;\n      var startPositions = [];\n      var columnWidth = void 0;\n\n      var priv = privatePool.get(this);\n      var onlyFullyVisible = priv.onlyFullyVisible;\n      var overrideFn = priv.overrideFn;\n      var scrollOffset = priv.scrollOffset;\n      var totalColumns = priv.totalColumns;\n      var viewportWidth = priv.viewportWidth;\n\n      for (var i = 0; i < totalColumns; i++) {\n        columnWidth = this._getColumnWidth(i);\n\n        if (sum <= scrollOffset && !onlyFullyVisible) {\n          this.startColumn = i;\n        }\n\n        // +1 pixel for row header width compensation for horizontal scroll > 0\n        var compensatedViewportWidth = scrollOffset > 0 ? viewportWidth + 1 : viewportWidth;\n\n        if (sum >= scrollOffset && sum + columnWidth <= scrollOffset + compensatedViewportWidth) {\n          if (this.startColumn == null) {\n            this.startColumn = i;\n          }\n          this.endColumn = i;\n        }\n        startPositions.push(sum);\n        sum += columnWidth;\n\n        if (!onlyFullyVisible) {\n          this.endColumn = i;\n        }\n        if (sum >= scrollOffset + viewportWidth) {\n          needReverse = false;\n          break;\n        }\n      }\n\n      if (this.endColumn === totalColumns - 1 && needReverse) {\n        this.startColumn = this.endColumn;\n\n        while (this.startColumn > 0) {\n          var viewportSum = startPositions[this.endColumn] + columnWidth - startPositions[this.startColumn - 1];\n\n          if (viewportSum <= viewportWidth || !onlyFullyVisible) {\n            this.startColumn--;\n          }\n          if (viewportSum > viewportWidth) {\n            break;\n          }\n        }\n      }\n\n      if (this.startColumn !== null && overrideFn) {\n        overrideFn(this);\n      }\n      this.startPosition = startPositions[this.startColumn];\n\n      if (this.startPosition == void 0) {\n        this.startPosition = null;\n      }\n      if (this.startColumn !== null) {\n        this.count = this.endColumn - this.startColumn + 1;\n      }\n    }\n\n    /**\n     * Recalculate columns stretching.\n     *\n     * @param {Number} totalWidth\n     */\n\n  }, {\n    key: 'refreshStretching',\n    value: function refreshStretching(totalWidth) {\n      if (this.stretch === 'none') {\n        return;\n      }\n      this.totalTargetWidth = totalWidth;\n\n      var priv = privatePool.get(this);\n      var totalColumns = priv.totalColumns;\n      var sumAll = 0;\n\n      for (var i = 0; i < totalColumns; i++) {\n        var columnWidth = this._getColumnWidth(i);\n        var permanentColumnWidth = priv.stretchingColumnWidthFn(void 0, i);\n\n        if (typeof permanentColumnWidth === 'number') {\n          totalWidth -= permanentColumnWidth;\n        } else {\n          sumAll += columnWidth;\n        }\n      }\n      var remainingSize = totalWidth - sumAll;\n\n      if (this.stretch === 'all' && remainingSize > 0) {\n        this.stretchAllRatio = totalWidth / sumAll;\n        this.stretchAllColumnsWidth = [];\n        this.needVerifyLastColumnWidth = true;\n      } else if (this.stretch === 'last' && totalWidth !== Infinity) {\n        var _columnWidth = this._getColumnWidth(totalColumns - 1);\n        var lastColumnWidth = remainingSize + _columnWidth;\n\n        this.stretchLastWidth = lastColumnWidth >= 0 ? lastColumnWidth : _columnWidth;\n      }\n    }\n\n    /**\n     * Get stretched column width based on stretchH (all or last) setting passed in handsontable instance.\n     *\n     * @param {Number} column\n     * @param {Number} baseWidth\n     * @returns {Number|null}\n     */\n\n  }, {\n    key: 'getStretchedColumnWidth',\n    value: function getStretchedColumnWidth(column, baseWidth) {\n      var result = null;\n\n      if (this.stretch === 'all' && this.stretchAllRatio !== 0) {\n        result = this._getStretchedAllColumnWidth(column, baseWidth);\n      } else if (this.stretch === 'last' && this.stretchLastWidth !== 0) {\n        result = this._getStretchedLastColumnWidth(column);\n      }\n\n      return result;\n    }\n\n    /**\n     * @param {Number} column\n     * @param {Number} baseWidth\n     * @returns {Number}\n     * @private\n     */\n\n  }, {\n    key: '_getStretchedAllColumnWidth',\n    value: function _getStretchedAllColumnWidth(column, baseWidth) {\n      var sumRatioWidth = 0;\n      var priv = privatePool.get(this);\n      var totalColumns = priv.totalColumns;\n\n      if (!this.stretchAllColumnsWidth[column]) {\n        var stretchedWidth = Math.round(baseWidth * this.stretchAllRatio);\n        var newStretchedWidth = priv.stretchingColumnWidthFn(stretchedWidth, column);\n\n        if (newStretchedWidth === void 0) {\n          this.stretchAllColumnsWidth[column] = stretchedWidth;\n        } else {\n          this.stretchAllColumnsWidth[column] = isNaN(newStretchedWidth) ? this._getColumnWidth(column) : newStretchedWidth;\n        }\n      }\n\n      if (this.stretchAllColumnsWidth.length === totalColumns && this.needVerifyLastColumnWidth) {\n        this.needVerifyLastColumnWidth = false;\n\n        for (var i = 0; i < this.stretchAllColumnsWidth.length; i++) {\n          sumRatioWidth += this.stretchAllColumnsWidth[i];\n        }\n        if (sumRatioWidth !== this.totalTargetWidth) {\n          this.stretchAllColumnsWidth[this.stretchAllColumnsWidth.length - 1] += this.totalTargetWidth - sumRatioWidth;\n        }\n      }\n\n      return this.stretchAllColumnsWidth[column];\n    }\n\n    /**\n     * @param {Number} column\n     * @returns {Number|null}\n     * @private\n     */\n\n  }, {\n    key: '_getStretchedLastColumnWidth',\n    value: function _getStretchedLastColumnWidth(column) {\n      var priv = privatePool.get(this);\n      var totalColumns = priv.totalColumns;\n\n      if (column === totalColumns - 1) {\n        return this.stretchLastWidth;\n      }\n\n      return null;\n    }\n\n    /**\n     * @param {Number} column Column index.\n     * @returns {Number}\n     * @private\n     */\n\n  }, {\n    key: '_getColumnWidth',\n    value: function _getColumnWidth(column) {\n      var width = privatePool.get(this).columnWidthFn(column);\n\n      if (width === void 0) {\n        width = ViewportColumnsCalculator.DEFAULT_WIDTH;\n      }\n\n      return width;\n    }\n  }]);\n\n  return ViewportColumnsCalculator;\n}();\n\nexports.default = ViewportColumnsCalculator;\n\n/***/ }),\n/* 176 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar privatePool = new WeakMap();\n\n/**\n * Calculates indexes of rows to render OR rows that are visible.\n * To redo the calculation, you need to create a new calculator.\n *\n * @class ViewportRowsCalculator\n */\n\nvar ViewportRowsCalculator = function () {\n  _createClass(ViewportRowsCalculator, null, [{\n    key: \"DEFAULT_HEIGHT\",\n\n    /**\n     * Default row height\n     *\n     * @type {Number}\n     */\n    get: function get() {\n      return 23;\n    }\n\n    /**\n     * @param {Number} viewportHeight Height of the viewport\n     * @param {Number} scrollOffset Current vertical scroll position of the viewport\n     * @param {Number} totalRows Total number of rows\n     * @param {Function} rowHeightFn Function that returns the height of the row at a given index (in px)\n     * @param {Function} overrideFn Function that changes calculated this.startRow, this.endRow (used by MergeCells plugin)\n     * @param {Boolean} onlyFullyVisible if `true`, only startRow and endRow will be indexes of rows that are fully in viewport\n     * @param {Number} horizontalScrollbarHeight\n     */\n\n  }]);\n\n  function ViewportRowsCalculator(viewportHeight, scrollOffset, totalRows, rowHeightFn, overrideFn, onlyFullyVisible, horizontalScrollbarHeight) {\n    _classCallCheck(this, ViewportRowsCalculator);\n\n    privatePool.set(this, {\n      viewportHeight: viewportHeight,\n      scrollOffset: scrollOffset,\n      totalRows: totalRows,\n      rowHeightFn: rowHeightFn,\n      overrideFn: overrideFn,\n      onlyFullyVisible: onlyFullyVisible,\n      horizontalScrollbarHeight: horizontalScrollbarHeight\n    });\n\n    /**\n     * Number of rendered/visible rows\n     *\n     * @type {Number}\n     */\n    this.count = 0;\n\n    /**\n     * Index of the first rendered/visible row (can be overwritten using overrideFn)\n     *\n     * @type {Number|null}\n     */\n    this.startRow = null;\n\n    /**\n     * Index of the last rendered/visible row (can be overwritten using overrideFn)\n     *\n     * @type {null}\n     */\n    this.endRow = null;\n\n    /**\n     * Position of the first rendered/visible row (in px)\n     *\n     * @type {Number|null}\n     */\n    this.startPosition = null;\n\n    this.calculate();\n  }\n\n  /**\n   * Calculates viewport\n   */\n\n\n  _createClass(ViewportRowsCalculator, [{\n    key: \"calculate\",\n    value: function calculate() {\n      var sum = 0;\n      var needReverse = true;\n      var startPositions = [];\n\n      var priv = privatePool.get(this);\n      var onlyFullyVisible = priv.onlyFullyVisible;\n      var overrideFn = priv.overrideFn;\n      var rowHeightFn = priv.rowHeightFn;\n      var scrollOffset = priv.scrollOffset;\n      var totalRows = priv.totalRows;\n      var viewportHeight = priv.viewportHeight;\n      var horizontalScrollbarHeight = priv.horizontalScrollbarHeight || 0;\n      var rowHeight = void 0;\n\n      // Calculate the number (start and end index) of rows needed\n      for (var i = 0; i < totalRows; i++) {\n        rowHeight = rowHeightFn(i);\n\n        if (rowHeight === undefined) {\n          rowHeight = ViewportRowsCalculator.DEFAULT_HEIGHT;\n        }\n        if (sum <= scrollOffset && !onlyFullyVisible) {\n          this.startRow = i;\n        }\n\n        // the row is within the \"visible range\"\n        if (sum >= scrollOffset && sum + rowHeight <= scrollOffset + viewportHeight - horizontalScrollbarHeight) {\n          if (this.startRow === null) {\n            this.startRow = i;\n          }\n          this.endRow = i;\n        }\n        startPositions.push(sum);\n        sum += rowHeight;\n\n        if (!onlyFullyVisible) {\n          this.endRow = i;\n        }\n        if (sum >= scrollOffset + viewportHeight - horizontalScrollbarHeight) {\n          needReverse = false;\n          break;\n        }\n      }\n\n      // If the estimation has reached the last row and there is still some space available in the viewport,\n      // we need to render in reverse in order to fill the whole viewport with rows\n      if (this.endRow === totalRows - 1 && needReverse) {\n        this.startRow = this.endRow;\n\n        while (this.startRow > 0) {\n          // rowHeight is the height of the last row\n          var viewportSum = startPositions[this.endRow] + rowHeight - startPositions[this.startRow - 1];\n\n          if (viewportSum <= viewportHeight - horizontalScrollbarHeight || !onlyFullyVisible) {\n            this.startRow--;\n          }\n          if (viewportSum >= viewportHeight - horizontalScrollbarHeight) {\n            break;\n          }\n        }\n      }\n\n      if (this.startRow !== null && overrideFn) {\n        overrideFn(this);\n      }\n      this.startPosition = startPositions[this.startRow];\n\n      if (this.startPosition == void 0) {\n        this.startPosition = null;\n      }\n      if (this.startRow !== null) {\n        this.count = this.endRow - this.startRow + 1;\n      }\n    }\n  }]);\n\n  return ViewportRowsCalculator;\n}();\n\nexports.default = ViewportRowsCalculator;\n\n/***/ }),\n/* 177 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class ColumnFilter\n */\nvar ColumnFilter = function () {\n  /**\n   * @param {Number} offset\n   * @param {Number} total\n   * @param {Number} countTH\n   */\n  function ColumnFilter(offset, total, countTH) {\n    _classCallCheck(this, ColumnFilter);\n\n    this.offset = offset;\n    this.total = total;\n    this.countTH = countTH;\n  }\n\n  /**\n   * @param index\n   * @returns {Number}\n   */\n\n\n  _createClass(ColumnFilter, [{\n    key: \"offsetted\",\n    value: function offsetted(index) {\n      return index + this.offset;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"unOffsetted\",\n    value: function unOffsetted(index) {\n      return index - this.offset;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"renderedToSource\",\n    value: function renderedToSource(index) {\n      return this.offsetted(index);\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"sourceToRendered\",\n    value: function sourceToRendered(index) {\n      return this.unOffsetted(index);\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"offsettedTH\",\n    value: function offsettedTH(index) {\n      return index - this.countTH;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"unOffsettedTH\",\n    value: function unOffsettedTH(index) {\n      return index + this.countTH;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"visibleRowHeadedColumnToSourceColumn\",\n    value: function visibleRowHeadedColumnToSourceColumn(index) {\n      return this.renderedToSource(this.offsettedTH(index));\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"sourceColumnToVisibleRowHeadedColumn\",\n    value: function sourceColumnToVisibleRowHeadedColumn(index) {\n      return this.unOffsettedTH(this.sourceToRendered(index));\n    }\n  }]);\n\n  return ColumnFilter;\n}();\n\nexports.default = ColumnFilter;\n\n/***/ }),\n/* 178 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class RowFilter\n */\nvar RowFilter = function () {\n  /**\n   * @param {Number} offset\n   * @param {Number} total\n   * @param {Number} countTH\n   */\n  function RowFilter(offset, total, countTH) {\n    _classCallCheck(this, RowFilter);\n\n    this.offset = offset;\n    this.total = total;\n    this.countTH = countTH;\n  }\n\n  /**\n   * @param index\n   * @returns {Number}\n   */\n\n\n  _createClass(RowFilter, [{\n    key: \"offsetted\",\n    value: function offsetted(index) {\n      return index + this.offset;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"unOffsetted\",\n    value: function unOffsetted(index) {\n      return index - this.offset;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"renderedToSource\",\n    value: function renderedToSource(index) {\n      return this.offsetted(index);\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"sourceToRendered\",\n    value: function sourceToRendered(index) {\n      return this.unOffsetted(index);\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"offsettedTH\",\n    value: function offsettedTH(index) {\n      return index - this.countTH;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"unOffsettedTH\",\n    value: function unOffsettedTH(index) {\n      return index + this.countTH;\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"visibleColHeadedRowToSourceRow\",\n    value: function visibleColHeadedRowToSourceRow(index) {\n      return this.renderedToSource(this.offsettedTH(index));\n    }\n\n    /**\n     * @param index\n     * @returns {Number}\n     */\n\n  }, {\n    key: \"sourceRowToVisibleColHeadedRow\",\n    value: function sourceRowToVisibleColHeadedRow(index) {\n      return this.unOffsettedTH(this.sourceToRendered(index));\n    }\n  }]);\n\n  return RowFilter;\n}();\n\nexports.default = RowFilter;\n\n/***/ }),\n/* 179 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _string = __webpack_require__(36);\n\nvar _event = __webpack_require__(180);\n\nvar _event2 = _interopRequireDefault(_event);\n\nvar _overlays = __webpack_require__(181);\n\nvar _overlays2 = _interopRequireDefault(_overlays);\n\nvar _scroll = __webpack_require__(182);\n\nvar _scroll2 = _interopRequireDefault(_scroll);\n\nvar _settings = __webpack_require__(183);\n\nvar _settings2 = _interopRequireDefault(_settings);\n\nvar _table = __webpack_require__(184);\n\nvar _table2 = _interopRequireDefault(_table);\n\nvar _viewport = __webpack_require__(186);\n\nvar _viewport2 = _interopRequireDefault(_viewport);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Walkontable\n */\nvar Walkontable = function () {\n  /**\n   * @param {Object} settings\n   */\n  function Walkontable(settings) {\n    _classCallCheck(this, Walkontable);\n\n    var originalHeaders = [];\n\n    // this is the namespace for global events\n    this.guid = 'wt_' + (0, _string.randomString)();\n\n    // bootstrap from settings\n    if (settings.cloneSource) {\n      this.cloneSource = settings.cloneSource;\n      this.cloneOverlay = settings.cloneOverlay;\n      this.wtSettings = settings.cloneSource.wtSettings;\n      this.wtTable = new _table2.default(this, settings.table, settings.wtRootElement);\n      this.wtScroll = new _scroll2.default(this);\n      this.wtViewport = settings.cloneSource.wtViewport;\n      this.wtEvent = new _event2.default(this);\n      this.selections = this.cloneSource.selections;\n    } else {\n      this.wtSettings = new _settings2.default(this, settings);\n      this.wtTable = new _table2.default(this, settings.table);\n      this.wtScroll = new _scroll2.default(this);\n      this.wtViewport = new _viewport2.default(this);\n      this.wtEvent = new _event2.default(this);\n      this.selections = this.getSetting('selections');\n      this.wtOverlays = new _overlays2.default(this);\n      this.exportSettingsAsClassNames();\n    }\n\n    // find original headers\n    if (this.wtTable.THEAD.childNodes.length && this.wtTable.THEAD.childNodes[0].childNodes.length) {\n      for (var c = 0, clen = this.wtTable.THEAD.childNodes[0].childNodes.length; c < clen; c++) {\n        originalHeaders.push(this.wtTable.THEAD.childNodes[0].childNodes[c].innerHTML);\n      }\n      if (!this.getSetting('columnHeaders').length) {\n        this.update('columnHeaders', [function (column, TH) {\n          (0, _element.fastInnerText)(TH, originalHeaders[column]);\n        }]);\n      }\n    }\n    this.drawn = false;\n    this.drawInterrupted = false;\n  }\n\n  /**\n   * Force rerender of Walkontable\n   *\n   * @param {Boolean} [fastDraw=false] When `true`, try to refresh only the positions of borders without rerendering\n   *                                   the data. It will only work if Table.draw() does not force\n   *                                   rendering anyway\n   * @returns {Walkontable}\n   */\n\n\n  _createClass(Walkontable, [{\n    key: 'draw',\n    value: function draw() {\n      var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      this.drawInterrupted = false;\n\n      if (!fastDraw && !(0, _element.isVisible)(this.wtTable.TABLE)) {\n        // draw interrupted because TABLE is not visible\n        this.drawInterrupted = true;\n      } else {\n        this.wtTable.draw(fastDraw);\n      }\n\n      return this;\n    }\n\n    /**\n     * Returns the TD at coords. If topmost is set to true, returns TD from the topmost overlay layer,\n     * if not set or set to false, returns TD from the master table.\n     *\n     * @param {CellCoords} coords\n     * @param {Boolean} [topmost=false]\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'getCell',\n    value: function getCell(coords) {\n      var topmost = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (!topmost) {\n        return this.wtTable.getCell(coords);\n      }\n\n      var totalRows = this.wtSettings.getSetting('totalRows');\n      var fixedRowsTop = this.wtSettings.getSetting('fixedRowsTop');\n      var fixedRowsBottom = this.wtSettings.getSetting('fixedRowsBottom');\n      var fixedColumns = this.wtSettings.getSetting('fixedColumnsLeft');\n\n      if (coords.row < fixedRowsTop && coords.col < fixedColumns) {\n        return this.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell(coords);\n      } else if (coords.row < fixedRowsTop) {\n        return this.wtOverlays.topOverlay.clone.wtTable.getCell(coords);\n      } else if (coords.col < fixedColumns && coords.row >= totalRows - fixedRowsBottom) {\n        if (this.wtOverlays.bottomLeftCornerOverlay && this.wtOverlays.bottomLeftCornerOverlay.clone) {\n          return this.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.getCell(coords);\n        }\n      } else if (coords.col < fixedColumns) {\n        return this.wtOverlays.leftOverlay.clone.wtTable.getCell(coords);\n      } else if (coords.row < totalRows && coords.row > totalRows - fixedRowsBottom) {\n        if (this.wtOverlays.bottomOverlay && this.wtOverlays.bottomOverlay.clone) {\n          return this.wtOverlays.bottomOverlay.clone.wtTable.getCell(coords);\n        }\n      }\n\n      return this.wtTable.getCell(coords);\n    }\n\n    /**\n     * @param {Object} settings\n     * @param {*} value\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'update',\n    value: function update(settings, value) {\n      return this.wtSettings.update(settings, value);\n    }\n\n    /**\n     * Scroll the viewport to a row at the given index in the data source\n     *\n     * @param {Number} row\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'scrollVertical',\n    value: function scrollVertical(row) {\n      this.wtOverlays.topOverlay.scrollTo(row);\n      this.getSetting('onScrollVertically');\n\n      return this;\n    }\n\n    /**\n     * Scroll the viewport to a column at the given index in the data source\n     *\n     * @param {Number} column\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'scrollHorizontal',\n    value: function scrollHorizontal(column) {\n      this.wtOverlays.leftOverlay.scrollTo(column);\n      this.getSetting('onScrollHorizontally');\n\n      return this;\n    }\n\n    /**\n     * Scrolls the viewport to a cell (rerenders if needed)\n     *\n     * @param {CellCoords} coords\n     * @returns {Walkontable}\n     */\n\n  }, {\n    key: 'scrollViewport',\n    value: function scrollViewport(coords) {\n      this.wtScroll.scrollViewport(coords);\n\n      return this;\n    }\n\n    /**\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getViewport',\n    value: function getViewport() {\n      return [this.wtTable.getFirstVisibleRow(), this.wtTable.getFirstVisibleColumn(), this.wtTable.getLastVisibleRow(), this.wtTable.getLastVisibleColumn()];\n    }\n\n    /**\n     * Get overlay name\n     *\n     * @returns {String}\n     */\n\n  }, {\n    key: 'getOverlayName',\n    value: function getOverlayName() {\n      return this.cloneOverlay ? this.cloneOverlay.type : 'master';\n    }\n\n    /**\n     * Check overlay type of this Walkontable instance.\n     *\n     * @param {String} name Clone type @see {Overlay.CLONE_TYPES}.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isOverlayName',\n    value: function isOverlayName(name) {\n      if (this.cloneOverlay) {\n        return this.cloneOverlay.type === name;\n      }\n\n      return false;\n    }\n\n    /**\n     * Export settings as class names added to the parent element of the table.\n     */\n\n  }, {\n    key: 'exportSettingsAsClassNames',\n    value: function exportSettingsAsClassNames() {\n      var _this = this;\n\n      var toExport = {\n        rowHeaders: ['array'],\n        columnHeaders: ['array']\n      };\n      var allClassNames = [];\n      var newClassNames = [];\n\n      (0, _object.objectEach)(toExport, function (optionType, key) {\n        if (optionType.indexOf('array') > -1 && _this.getSetting(key).length) {\n          newClassNames.push('ht' + (0, _string.toUpperCaseFirst)(key));\n        }\n        allClassNames.push('ht' + (0, _string.toUpperCaseFirst)(key));\n      });\n      (0, _element.removeClass)(this.wtTable.wtRootElement.parentNode, allClassNames);\n      (0, _element.addClass)(this.wtTable.wtRootElement.parentNode, newClassNames);\n    }\n\n    /**\n     * Get/Set Walkontable instance setting\n     *\n     * @param {String} key\n     * @param {*} [param1]\n     * @param {*} [param2]\n     * @param {*} [param3]\n     * @param {*} [param4]\n     * @returns {*}\n     */\n\n  }, {\n    key: 'getSetting',\n    value: function getSetting(key, param1, param2, param3, param4) {\n      // this is faster than .apply - https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\n      return this.wtSettings.getSetting(key, param1, param2, param3, param4);\n    }\n\n    /**\n     * Checks if setting exists\n     *\n     * @param {String} key\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasSetting',\n    value: function hasSetting(key) {\n      return this.wtSettings.has(key);\n    }\n\n    /**\n     * Destroy instance\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.wtOverlays.destroy();\n      this.wtEvent.destroy();\n    }\n  }]);\n\n  return Walkontable;\n}();\n\nexports.default = Walkontable;\n\n/***/ }),\n/* 180 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _function = __webpack_require__(42);\n\nvar _browser = __webpack_require__(27);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n *\n */\nfunction Event(instance) {\n  var that = this;\n  var eventManager = new _eventManager2.default(instance);\n  var selectedCellBeforeTouchEnd = void 0;\n\n  this.instance = instance;\n\n  var dblClickOrigin = [null, null];\n  this.dblClickTimeout = [null, null];\n\n  var onMouseDown = function onMouseDown(event) {\n    var activeElement = document.activeElement;\n    var getParentNode = (0, _function.partial)(_element.getParent, event.realTarget);\n    var realTarget = event.realTarget;\n\n    // ignore focusable element from mouse down processing (https://github.com/handsontable/handsontable/issues/3555)\n    if (realTarget === activeElement || getParentNode(0) === activeElement || getParentNode(1) === activeElement) {\n      return;\n    }\n\n    var cell = that.parentCell(realTarget);\n\n    if ((0, _element.hasClass)(realTarget, 'corner')) {\n      that.instance.getSetting('onCellCornerMouseDown', event, realTarget);\n    } else if (cell.TD) {\n      if (that.instance.hasSetting('onCellMouseDown')) {\n        that.instance.getSetting('onCellMouseDown', event, cell.coords, cell.TD, that.instance);\n      }\n    }\n\n    if (event.button !== 2) {\n      // if not right mouse button\n      if (cell.TD) {\n        dblClickOrigin[0] = cell.TD;\n        clearTimeout(that.dblClickTimeout[0]);\n        that.dblClickTimeout[0] = setTimeout(function () {\n          dblClickOrigin[0] = null;\n        }, 1000);\n      }\n    }\n  };\n\n  var onTouchMove = function onTouchMove(event) {\n    that.instance.touchMoving = true;\n  };\n\n  var onTouchStart = function onTouchStart(event) {\n    eventManager.addEventListener(this, 'touchmove', onTouchMove);\n\n    // Prevent cell selection when scrolling with touch event - not the best solution performance-wise\n    that.checkIfTouchMove = setTimeout(function () {\n      if (that.instance.touchMoving === true) {\n        that.instance.touchMoving = void 0;\n\n        eventManager.removeEventListener('touchmove', onTouchMove, false);\n      }\n\n      onMouseDown(event);\n    }, 30);\n  };\n\n  var onMouseOver = function onMouseOver(event) {\n    var table, td, mainWOT;\n\n    if (that.instance.hasSetting('onCellMouseOver')) {\n      table = that.instance.wtTable.TABLE;\n      td = (0, _element.closestDown)(event.realTarget, ['TD', 'TH'], table);\n      mainWOT = that.instance.cloneSource || that.instance;\n\n      if (td && td !== mainWOT.lastMouseOver && (0, _element.isChildOf)(td, table)) {\n        mainWOT.lastMouseOver = td;\n\n        that.instance.getSetting('onCellMouseOver', event, that.instance.wtTable.getCoords(td), td, that.instance);\n      }\n    }\n  };\n\n  var onMouseOut = function onMouseOut(event) {\n    var table = void 0;\n    var lastTD = void 0;\n    var nextTD = void 0;\n\n    if (that.instance.hasSetting('onCellMouseOut')) {\n      table = that.instance.wtTable.TABLE;\n      lastTD = (0, _element.closestDown)(event.realTarget, ['TD', 'TH'], table);\n      nextTD = (0, _element.closestDown)(event.relatedTarget, ['TD', 'TH'], table);\n\n      if (lastTD && lastTD !== nextTD && (0, _element.isChildOf)(lastTD, table)) {\n        that.instance.getSetting('onCellMouseOut', event, that.instance.wtTable.getCoords(lastTD), lastTD, that.instance);\n      }\n    }\n  };\n\n  var onMouseUp = function onMouseUp(event) {\n    if (event.button !== 2) {\n      // if not right mouse button\n      var cell = that.parentCell(event.realTarget);\n\n      if (cell.TD === dblClickOrigin[0] && cell.TD === dblClickOrigin[1]) {\n        if ((0, _element.hasClass)(event.realTarget, 'corner')) {\n          that.instance.getSetting('onCellCornerDblClick', event, cell.coords, cell.TD, that.instance);\n        } else {\n          that.instance.getSetting('onCellDblClick', event, cell.coords, cell.TD, that.instance);\n        }\n\n        dblClickOrigin[0] = null;\n        dblClickOrigin[1] = null;\n      } else if (cell.TD === dblClickOrigin[0]) {\n        that.instance.getSetting('onCellMouseUp', event, cell.coords, cell.TD, that.instance);\n\n        dblClickOrigin[1] = cell.TD;\n        clearTimeout(that.dblClickTimeout[1]);\n        that.dblClickTimeout[1] = setTimeout(function () {\n          dblClickOrigin[1] = null;\n        }, 500);\n      } else if (cell.TD && that.instance.hasSetting('onCellMouseUp')) {\n        that.instance.getSetting('onCellMouseUp', event, cell.coords, cell.TD, that.instance);\n      }\n    }\n  };\n\n  var selectedCellWasTouched = function selectedCellWasTouched(touchTarget) {\n    var cellUnderFinger = that.parentCell(touchTarget);\n    var coordsOfCellUnderFinger = cellUnderFinger.coords;\n\n    if (selectedCellBeforeTouchEnd && coordsOfCellUnderFinger) {\n      var _ref = [coordsOfCellUnderFinger.row, selectedCellBeforeTouchEnd.from.row],\n          rowTouched = _ref[0],\n          rowSelected = _ref[1];\n      var _ref2 = [coordsOfCellUnderFinger.col, selectedCellBeforeTouchEnd.from.col],\n          colTouched = _ref2[0],\n          colSelected = _ref2[1];\n\n\n      return rowTouched === rowSelected && colTouched === colSelected;\n    }\n\n    return false;\n  };\n\n  var onTouchEnd = function onTouchEnd(event) {\n    var excludeTags = ['A', 'BUTTON', 'INPUT'];\n    var target = event.target;\n\n    // touched link which was placed inside a cell (a cell with DOM `a` element) WILL NOT trigger the below function calls\n    // and as consequence will behave as standard (open the link).\n    if (selectedCellWasTouched(target) === false || excludeTags.includes(target.tagName) === false) {\n      event.preventDefault();\n      onMouseUp(event);\n    }\n  };\n\n  eventManager.addEventListener(this.instance.wtTable.holder, 'mousedown', onMouseDown);\n  eventManager.addEventListener(this.instance.wtTable.TABLE, 'mouseover', onMouseOver);\n  eventManager.addEventListener(this.instance.wtTable.TABLE, 'mouseout', onMouseOut);\n  eventManager.addEventListener(this.instance.wtTable.holder, 'mouseup', onMouseUp);\n\n  // check if full HOT instance, or detached WOT AND run on mobile device\n  if (this.instance.wtTable.holder.parentNode.parentNode && (0, _browser.isMobileBrowser)() && !that.instance.wtTable.isWorkingOnClone()) {\n    var classSelector = '.' + this.instance.wtTable.holder.parentNode.className.split(' ').join('.');\n\n    eventManager.addEventListener(this.instance.wtTable.holder, 'touchstart', function (event) {\n      selectedCellBeforeTouchEnd = instance.selections.getCell().cellRange;\n\n      that.instance.touchApplied = true;\n      if ((0, _element.isChildOf)(event.target, classSelector)) {\n        onTouchStart.call(event.target, event);\n      }\n    });\n    eventManager.addEventListener(this.instance.wtTable.holder, 'touchend', function (event) {\n      that.instance.touchApplied = false;\n      if ((0, _element.isChildOf)(event.target, classSelector)) {\n        onTouchEnd.call(event.target, event);\n      }\n    });\n\n    if (!that.instance.momentumScrolling) {\n      that.instance.momentumScrolling = {};\n    }\n    eventManager.addEventListener(this.instance.wtTable.holder, 'scroll', function (event) {\n      clearTimeout(that.instance.momentumScrolling._timeout);\n\n      if (!that.instance.momentumScrolling.ongoing) {\n        that.instance.getSetting('onBeforeTouchScroll');\n      }\n      that.instance.momentumScrolling.ongoing = true;\n\n      that.instance.momentumScrolling._timeout = setTimeout(function () {\n        if (!that.instance.touchApplied) {\n          that.instance.momentumScrolling.ongoing = false;\n\n          that.instance.getSetting('onAfterMomentumScroll');\n        }\n      }, 200);\n    });\n  }\n\n  eventManager.addEventListener(window, 'resize', function () {\n    if (that.instance.getSetting('stretchH') !== 'none') {\n      that.instance.draw();\n    }\n  });\n\n  this.destroy = function () {\n    clearTimeout(this.dblClickTimeout[0]);\n    clearTimeout(this.dblClickTimeout[1]);\n\n    eventManager.destroy();\n  };\n}\n\nEvent.prototype.parentCell = function (elem) {\n  var cell = {};\n  var TABLE = this.instance.wtTable.TABLE;\n  var TD = (0, _element.closestDown)(elem, ['TD', 'TH'], TABLE);\n\n  if (TD) {\n    cell.coords = this.instance.wtTable.getCoords(TD);\n    cell.TD = TD;\n  } else if ((0, _element.hasClass)(elem, 'wtBorder') && (0, _element.hasClass)(elem, 'current')) {\n    cell.coords = this.instance.selections.getCell().cellRange.highlight;\n    cell.TD = this.instance.wtTable.getCell(cell.coords);\n  } else if ((0, _element.hasClass)(elem, 'wtBorder') && (0, _element.hasClass)(elem, 'area')) {\n    if (this.instance.selections.createOrGetArea().cellRange) {\n      cell.coords = this.instance.selections.createOrGetArea().cellRange.to;\n      cell.TD = this.instance.wtTable.getCell(cell.coords);\n    }\n  }\n\n  return cell;\n};\n\nexports.default = Event;\n\n/***/ }),\n/* 181 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _unicode = __webpack_require__(21);\n\nvar _browser = __webpack_require__(27);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Overlays\n */\nvar Overlays = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function Overlays(wotInstance) {\n    _classCallCheck(this, Overlays);\n\n    /**\n     * Sometimes `line-height` might be set to 'normal'. In that case, a default `font-size` should be multiplied by roughly 1.2.\n     * https://developer.mozilla.org/pl/docs/Web/CSS/line-height#Values\n     */\n    var BODY_LINE_HEIGHT = parseInt(getComputedStyle(document.body).lineHeight, 10);\n    var FALLBACK_BODY_LINE_HEIGHT = parseInt(getComputedStyle(document.body).fontSize, 10) * 1.2;\n\n    this.wot = wotInstance;\n\n    // legacy support\n    this.instance = this.wot;\n    this.eventManager = new _eventManager2.default(this.wot);\n\n    this.wot.update('scrollbarWidth', (0, _element.getScrollbarWidth)());\n    this.wot.update('scrollbarHeight', (0, _element.getScrollbarWidth)());\n\n    this.scrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);\n\n    this.prepareOverlays();\n\n    this.destroyed = false;\n    this.keyPressed = false;\n    this.spreaderLastSize = {\n      width: null,\n      height: null\n    };\n    this.overlayScrollPositions = {\n      master: {\n        top: 0,\n        left: 0\n      },\n      top: {\n        top: null,\n        left: 0\n      },\n      bottom: {\n        top: null,\n        left: 0\n      },\n      left: {\n        top: 0,\n        left: null\n      }\n    };\n\n    this.pendingScrollCallbacks = {\n      master: {\n        top: 0,\n        left: 0\n      },\n      top: {\n        left: 0\n      },\n      bottom: {\n        left: 0\n      },\n      left: {\n        top: 0\n      }\n    };\n\n    this.verticalScrolling = false;\n    this.horizontalScrolling = false;\n    this.delegatedScrollCallback = false;\n\n    this.registeredListeners = [];\n\n    this.browserLineHeight = BODY_LINE_HEIGHT || FALLBACK_BODY_LINE_HEIGHT;\n\n    this.registerListeners();\n  }\n\n  /**\n   * Prepare overlays based on user settings.\n   *\n   * @returns {Boolean} Returns `true` if changes applied to overlay needs scroll synchronization.\n   */\n\n\n  _createClass(Overlays, [{\n    key: 'prepareOverlays',\n    value: function prepareOverlays() {\n      var syncScroll = false;\n\n      if (this.topOverlay) {\n        syncScroll = this.topOverlay.updateStateOfRendering() || syncScroll;\n      } else {\n        this.topOverlay = _base2.default.createOverlay(_base2.default.CLONE_TOP, this.wot);\n      }\n\n      if (!_base2.default.hasOverlay(_base2.default.CLONE_BOTTOM)) {\n        this.bottomOverlay = {\n          needFullRender: false,\n          updateStateOfRendering: function updateStateOfRendering() {\n            return false;\n          }\n        };\n      }\n      if (!_base2.default.hasOverlay(_base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n        this.bottomLeftCornerOverlay = {\n          needFullRender: false,\n          updateStateOfRendering: function updateStateOfRendering() {\n            return false;\n          }\n        };\n      }\n\n      if (this.bottomOverlay) {\n        syncScroll = this.bottomOverlay.updateStateOfRendering() || syncScroll;\n      } else {\n        this.bottomOverlay = _base2.default.createOverlay(_base2.default.CLONE_BOTTOM, this.wot);\n      }\n\n      if (this.leftOverlay) {\n        syncScroll = this.leftOverlay.updateStateOfRendering() || syncScroll;\n      } else {\n        this.leftOverlay = _base2.default.createOverlay(_base2.default.CLONE_LEFT, this.wot);\n      }\n\n      if (this.topOverlay.needFullRender && this.leftOverlay.needFullRender) {\n        if (this.topLeftCornerOverlay) {\n          syncScroll = this.topLeftCornerOverlay.updateStateOfRendering() || syncScroll;\n        } else {\n          this.topLeftCornerOverlay = _base2.default.createOverlay(_base2.default.CLONE_TOP_LEFT_CORNER, this.wot);\n        }\n      }\n\n      if (this.bottomOverlay.needFullRender && this.leftOverlay.needFullRender) {\n        if (this.bottomLeftCornerOverlay) {\n          syncScroll = this.bottomLeftCornerOverlay.updateStateOfRendering() || syncScroll;\n        } else {\n          this.bottomLeftCornerOverlay = _base2.default.createOverlay(_base2.default.CLONE_BOTTOM_LEFT_CORNER, this.wot);\n        }\n      }\n\n      if (this.wot.getSetting('debug') && !this.debug) {\n        this.debug = _base2.default.createOverlay(_base2.default.CLONE_DEBUG, this.wot);\n      }\n\n      return syncScroll;\n    }\n\n    /**\n     * Refresh and redraw table\n     */\n\n  }, {\n    key: 'refreshAll',\n    value: function refreshAll() {\n      if (!this.wot.drawn) {\n        return;\n      }\n      if (!this.wot.wtTable.holder.parentNode) {\n        // Walkontable was detached from DOM, but this handler was not removed\n        this.destroy();\n\n        return;\n      }\n      this.wot.draw(true);\n\n      if (this.verticalScrolling) {\n        this.leftOverlay.onScroll();\n      }\n\n      if (this.horizontalScrolling) {\n        this.topOverlay.onScroll();\n      }\n\n      this.verticalScrolling = false;\n      this.horizontalScrolling = false;\n    }\n\n    /**\n     * Register all necessary event listeners.\n     */\n\n  }, {\n    key: 'registerListeners',\n    value: function registerListeners() {\n      var _this = this;\n\n      var topOverlayScrollable = this.topOverlay.mainTableScrollableElement;\n      var leftOverlayScrollable = this.leftOverlay.mainTableScrollableElement;\n\n      var listenersToRegister = [];\n      listenersToRegister.push([document.documentElement, 'keydown', function (event) {\n        return _this.onKeyDown(event);\n      }]);\n      listenersToRegister.push([document.documentElement, 'keyup', function () {\n        return _this.onKeyUp();\n      }]);\n      listenersToRegister.push([document, 'visibilitychange', function () {\n        return _this.onKeyUp();\n      }]);\n      listenersToRegister.push([topOverlayScrollable, 'scroll', function (event) {\n        return _this.onTableScroll(event);\n      }]);\n\n      if (topOverlayScrollable !== leftOverlayScrollable) {\n        listenersToRegister.push([leftOverlayScrollable, 'scroll', function (event) {\n          return _this.onTableScroll(event);\n        }]);\n      }\n\n      var isHighPixelRatio = window.devicePixelRatio && window.devicePixelRatio > 1;\n\n      if (isHighPixelRatio || !(0, _browser.isChrome)()) {\n        listenersToRegister.push([this.instance.wtTable.wtRootElement.parentNode, 'wheel', function (event) {\n          return _this.onCloneWheel(event);\n        }]);\n      } else {\n        if (this.topOverlay.needFullRender) {\n          listenersToRegister.push([this.topOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n\n        if (this.bottomOverlay.needFullRender) {\n          listenersToRegister.push([this.bottomOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n\n        if (this.leftOverlay.needFullRender) {\n          listenersToRegister.push([this.leftOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n\n        if (this.topLeftCornerOverlay && this.topLeftCornerOverlay.needFullRender) {\n          listenersToRegister.push([this.topLeftCornerOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n\n        if (this.bottomLeftCornerOverlay && this.bottomLeftCornerOverlay.needFullRender) {\n          listenersToRegister.push([this.bottomLeftCornerOverlay.clone.wtTable.holder, 'wheel', function (event) {\n            return _this.onCloneWheel(event);\n          }]);\n        }\n      }\n\n      if (this.topOverlay.trimmingContainer !== window && this.leftOverlay.trimmingContainer !== window) {\n        // This is necessary?\n        // eventManager.addEventListener(window, 'scroll', (event) => this.refreshAll(event));\n        listenersToRegister.push([window, 'wheel', function (event) {\n          var overlay = void 0;\n          var deltaY = event.wheelDeltaY || event.deltaY;\n          var deltaX = event.wheelDeltaX || event.deltaX;\n\n          if (_this.topOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'top';\n          } else if (_this.bottomOverlay.clone && _this.bottomOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'bottom';\n          } else if (_this.leftOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'left';\n          } else if (_this.topLeftCornerOverlay && _this.topLeftCornerOverlay.clone && _this.topLeftCornerOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'topLeft';\n          } else if (_this.bottomLeftCornerOverlay && _this.bottomLeftCornerOverlay.clone && _this.bottomLeftCornerOverlay.clone.wtTable.holder.contains(event.realTarget)) {\n            overlay = 'bottomLeft';\n          }\n\n          if (overlay === 'top' && deltaY !== 0 || overlay === 'left' && deltaX !== 0 || overlay === 'bottom' && deltaY !== 0 || (overlay === 'topLeft' || overlay === 'bottomLeft') && (deltaY !== 0 || deltaX !== 0)) {\n\n            event.preventDefault();\n          }\n        }]);\n      }\n\n      while (listenersToRegister.length) {\n        var listener = listenersToRegister.pop();\n        this.eventManager.addEventListener(listener[0], listener[1], listener[2]);\n\n        this.registeredListeners.push(listener);\n      }\n    }\n\n    /**\n     * Deregister all previously registered listeners.\n     */\n\n  }, {\n    key: 'deregisterListeners',\n    value: function deregisterListeners() {\n      while (this.registeredListeners.length) {\n        var listener = this.registeredListeners.pop();\n        this.eventManager.removeEventListener(listener[0], listener[1], listener[2]);\n      }\n    }\n\n    /**\n     * Scroll listener\n     *\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onTableScroll',\n    value: function onTableScroll(event) {\n      // There was if statement which controlled flow of this function. It avoided the execution of the next lines\n      // on mobile devices. It was changed. Broader description of this case is included within issue #4856.\n\n      var masterHorizontal = this.leftOverlay.mainTableScrollableElement;\n      var masterVertical = this.topOverlay.mainTableScrollableElement;\n      var target = event.target;\n\n      // For key press, sync only master -> overlay position because while pressing Walkontable.render is triggered\n      // by hot.refreshBorder\n      if (this.keyPressed) {\n        if (masterVertical !== window && target !== window && !event.target.contains(masterVertical) || masterHorizontal !== window && target !== window && !event.target.contains(masterHorizontal)) {\n          return;\n        }\n      }\n\n      this.syncScrollPositions(event);\n    }\n\n    /**\n     * Wheel listener for cloned overlays.\n     *\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onCloneWheel',\n    value: function onCloneWheel(event) {\n      if (this.scrollableElement !== window) {\n        event.preventDefault();\n      }\n      // There was if statement which controlled flow of this function. It avoided the execution of the next lines\n      // on mobile devices. It was changed. Broader description of this case is included within issue #4856.\n\n      var masterHorizontal = this.leftOverlay.mainTableScrollableElement;\n      var masterVertical = this.topOverlay.mainTableScrollableElement;\n      var target = event.target;\n\n      // For key press, sync only master -> overlay position because while pressing Walkontable.render is triggered\n      // by hot.refreshBorder\n      var shouldNotWheelVertically = masterVertical !== window && target !== window && !event.target.contains(masterVertical);\n      var shouldNotWheelHorizontally = masterHorizontal !== window && target !== window && !event.target.contains(masterHorizontal);\n\n      if (this.keyPressed && (shouldNotWheelVertically || shouldNotWheelHorizontally)) {\n        return;\n      }\n\n      this.translateMouseWheelToScroll(event);\n    }\n\n    /**\n     * Key down listener\n     */\n\n  }, {\n    key: 'onKeyDown',\n    value: function onKeyDown(event) {\n      this.keyPressed = (0, _unicode.isKey)(event.keyCode, 'ARROW_UP|ARROW_RIGHT|ARROW_DOWN|ARROW_LEFT');\n    }\n\n    /**\n     * Key up listener\n     */\n\n  }, {\n    key: 'onKeyUp',\n    value: function onKeyUp() {\n      this.keyPressed = false;\n    }\n\n    /**\n     * Translate wheel event into scroll event and sync scroll overlays position\n     *\n     * @private\n     * @param {Event} event\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'translateMouseWheelToScroll',\n    value: function translateMouseWheelToScroll(event) {\n      var deltaY = isNaN(event.deltaY) ? -1 * event.wheelDeltaY : event.deltaY;\n      var deltaX = isNaN(event.deltaX) ? -1 * event.wheelDeltaX : event.deltaX;\n\n      if (event.deltaMode === 1) {\n        deltaX += deltaX * this.browserLineHeight;\n        deltaY += deltaY * this.browserLineHeight;\n      }\n\n      this.scrollVertically(deltaY);\n      this.scrollHorizontally(deltaX);\n\n      return false;\n    }\n  }, {\n    key: 'scrollVertically',\n    value: function scrollVertically(distance) {\n      if (distance === 0) {\n        return 0;\n      }\n      this.scrollableElement.scrollTop += distance;\n    }\n  }, {\n    key: 'scrollHorizontally',\n    value: function scrollHorizontally(distance) {\n      if (distance === 0) {\n        return 0;\n      }\n      this.scrollableElement.scrollLeft += distance;\n    }\n\n    /**\n     * Synchronize scroll position between master table and overlay table.\n     *\n     * @private\n     * @param {Event|Object} event\n     */\n\n  }, {\n    key: 'syncScrollPositions',\n    value: function syncScrollPositions(event) {\n      if (this.destroyed) {\n        return;\n      }\n\n      var topHolder = this.topOverlay.clone.wtTable.holder;\n      var leftHolder = this.leftOverlay.clone.wtTable.holder;\n\n      var _ref = [this.scrollableElement.scrollLeft, this.scrollableElement.scrollTop],\n          scrollLeft = _ref[0],\n          scrollTop = _ref[1];\n\n\n      this.horizontalScrolling = topHolder.scrollLeft !== scrollLeft;\n      this.verticalScrolling = leftHolder.scrollTop !== scrollTop;\n\n      if (this.horizontalScrolling) {\n        topHolder.scrollLeft = scrollLeft;\n      }\n\n      if (this.verticalScrolling) {\n        leftHolder.scrollTop = scrollTop;\n\n        if (this.bottomOverlay.needFullRender) {\n          this.bottomOverlay.clone.wtTable.holder.scrollLeft = scrollLeft;\n        }\n      }\n\n      this.refreshAll();\n    }\n\n    /**\n     * Synchronize overlay scrollbars with the master scrollbar\n     */\n\n  }, {\n    key: 'syncScrollWithMaster',\n    value: function syncScrollWithMaster() {\n      var master = this.topOverlay.mainTableScrollableElement;\n      var scrollLeft = master.scrollLeft,\n          scrollTop = master.scrollTop;\n\n\n      if (this.topOverlay.needFullRender) {\n        this.topOverlay.clone.wtTable.holder.scrollLeft = scrollLeft;\n      }\n      if (this.bottomOverlay.needFullRender) {\n        this.bottomOverlay.clone.wtTable.holder.scrollLeft = scrollLeft;\n      }\n      if (this.leftOverlay.needFullRender) {\n        this.leftOverlay.clone.wtTable.holder.scrollTop = scrollTop;\n      }\n    }\n\n    /**\n     * Update the main scrollable elements for all the overlays.\n     */\n\n  }, {\n    key: 'updateMainScrollableElements',\n    value: function updateMainScrollableElements() {\n      this.deregisterListeners();\n\n      this.leftOverlay.updateMainScrollableElement();\n      this.topOverlay.updateMainScrollableElement();\n\n      if (this.bottomOverlay.needFullRender) {\n        this.bottomOverlay.updateMainScrollableElement();\n      }\n\n      this.scrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);\n\n      this.registerListeners();\n    }\n\n    /**\n     *\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.eventManager.destroy();\n      this.topOverlay.destroy();\n\n      if (this.bottomOverlay.clone) {\n        this.bottomOverlay.destroy();\n      }\n      this.leftOverlay.destroy();\n\n      if (this.topLeftCornerOverlay) {\n        this.topLeftCornerOverlay.destroy();\n      }\n\n      if (this.bottomLeftCornerOverlay && this.bottomLeftCornerOverlay.clone) {\n        this.bottomLeftCornerOverlay.destroy();\n      }\n\n      if (this.debug) {\n        this.debug.destroy();\n      }\n      this.destroyed = true;\n    }\n\n    /**\n     * @param {Boolean} [fastDraw=false]\n     */\n\n  }, {\n    key: 'refresh',\n    value: function refresh() {\n      var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (this.topOverlay.areElementSizesAdjusted && this.leftOverlay.areElementSizesAdjusted) {\n        var container = this.wot.wtTable.wtRootElement.parentNode || this.wot.wtTable.wtRootElement;\n        var width = container.clientWidth;\n        var height = container.clientHeight;\n\n        if (width !== this.spreaderLastSize.width || height !== this.spreaderLastSize.height) {\n          this.spreaderLastSize.width = width;\n          this.spreaderLastSize.height = height;\n          this.adjustElementsSize();\n        }\n      }\n\n      if (this.bottomOverlay.clone) {\n        this.bottomOverlay.refresh(fastDraw);\n      }\n\n      this.leftOverlay.refresh(fastDraw);\n      this.topOverlay.refresh(fastDraw);\n\n      if (this.topLeftCornerOverlay) {\n        this.topLeftCornerOverlay.refresh(fastDraw);\n      }\n\n      if (this.bottomLeftCornerOverlay && this.bottomLeftCornerOverlay.clone) {\n        this.bottomLeftCornerOverlay.refresh(fastDraw);\n      }\n\n      if (this.debug) {\n        this.debug.refresh(fastDraw);\n      }\n    }\n\n    /**\n     * Adjust overlays elements size and master table size\n     *\n     * @param {Boolean} [force=false]\n     */\n\n  }, {\n    key: 'adjustElementsSize',\n    value: function adjustElementsSize() {\n      var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      var totalColumns = this.wot.getSetting('totalColumns');\n      var totalRows = this.wot.getSetting('totalRows');\n      var headerRowSize = this.wot.wtViewport.getRowHeaderWidth();\n      var headerColumnSize = this.wot.wtViewport.getColumnHeaderHeight();\n      var hiderStyle = this.wot.wtTable.hider.style;\n\n      hiderStyle.width = headerRowSize + this.leftOverlay.sumCellSizes(0, totalColumns) + 'px';\n      hiderStyle.height = headerColumnSize + this.topOverlay.sumCellSizes(0, totalRows) + 1 + 'px';\n\n      this.topOverlay.adjustElementsSize(force);\n      this.leftOverlay.adjustElementsSize(force);\n\n      if (this.bottomOverlay.clone) {\n        this.bottomOverlay.adjustElementsSize(force);\n      }\n    }\n\n    /**\n     *\n     */\n\n  }, {\n    key: 'applyToDOM',\n    value: function applyToDOM() {\n      if (!this.topOverlay.areElementSizesAdjusted || !this.leftOverlay.areElementSizesAdjusted) {\n        this.adjustElementsSize();\n      }\n      this.topOverlay.applyToDOM();\n\n      if (this.bottomOverlay.clone) {\n        this.bottomOverlay.applyToDOM();\n      }\n\n      this.leftOverlay.applyToDOM();\n    }\n\n    /**\n     * Get the parent overlay of the provided element.\n     *\n     * @param {HTMLElement} element\n     * @returns {Object|null}\n     */\n\n  }, {\n    key: 'getParentOverlay',\n    value: function getParentOverlay(element) {\n      if (!element) {\n        return null;\n      }\n\n      var overlays = [this.topOverlay, this.leftOverlay, this.bottomOverlay, this.topLeftCornerOverlay, this.bottomLeftCornerOverlay];\n      var result = null;\n\n      (0, _array.arrayEach)(overlays, function (elem, i) {\n        if (!elem) {\n          return;\n        }\n\n        if (elem.clone && elem.clone.wtTable.TABLE.contains(element)) {\n          result = elem.clone;\n        }\n      });\n\n      return result;\n    }\n  }]);\n\n  return Overlays;\n}();\n\nexports.default = Overlays;\n\n/***/ }),\n/* 182 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _number = __webpack_require__(5);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Scroll\n */\nvar Scroll = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function Scroll(wotInstance) {\n    _classCallCheck(this, Scroll);\n\n    this.wot = wotInstance;\n\n    // legacy support\n    this.instance = wotInstance;\n  }\n\n  /**\n   * Scrolls viewport to a cell by minimum number of cells\n   *\n   * @param {CellCoords} coords\n   */\n\n\n  _createClass(Scroll, [{\n    key: 'scrollViewport',\n    value: function scrollViewport(coords) {\n      if (!this.wot.drawn) {\n        return;\n      }\n\n      var _getVariables2 = this._getVariables(),\n          topOverlay = _getVariables2.topOverlay,\n          leftOverlay = _getVariables2.leftOverlay,\n          totalRows = _getVariables2.totalRows,\n          totalColumns = _getVariables2.totalColumns,\n          fixedRowsTop = _getVariables2.fixedRowsTop,\n          fixedRowsBottom = _getVariables2.fixedRowsBottom,\n          fixedColumnsLeft = _getVariables2.fixedColumnsLeft;\n\n      if (coords.row < 0 || coords.row > Math.max(totalRows - 1, 0)) {\n        throw new Error('row ' + coords.row + ' does not exist');\n      }\n\n      if (coords.col < 0 || coords.col > Math.max(totalColumns - 1, 0)) {\n        throw new Error('column ' + coords.col + ' does not exist');\n      }\n\n      if (coords.row >= fixedRowsTop && coords.row < this.getFirstVisibleRow()) {\n        topOverlay.scrollTo(coords.row);\n      } else if (coords.row > this.getLastVisibleRow() && coords.row < totalRows - fixedRowsBottom) {\n        topOverlay.scrollTo(coords.row, true);\n      }\n\n      if (coords.col >= fixedColumnsLeft && coords.col < this.getFirstVisibleColumn()) {\n        leftOverlay.scrollTo(coords.col);\n      } else if (coords.col > this.getLastVisibleColumn()) {\n        leftOverlay.scrollTo(coords.col, true);\n      }\n    }\n\n    /**\n     * Get first visible row based on virtual dom and how table is visible in browser window viewport.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getFirstVisibleRow',\n    value: function getFirstVisibleRow() {\n      var _getVariables3 = this._getVariables(),\n          topOverlay = _getVariables3.topOverlay,\n          wtTable = _getVariables3.wtTable,\n          wtViewport = _getVariables3.wtViewport,\n          totalRows = _getVariables3.totalRows,\n          fixedRowsTop = _getVariables3.fixedRowsTop;\n\n      var firstVisibleRow = wtTable.getFirstVisibleRow();\n\n      if (topOverlay.mainTableScrollableElement === window) {\n        var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);\n        var totalTableHeight = (0, _element.innerHeight)(wtTable.hider);\n        var windowHeight = (0, _element.innerHeight)(window);\n        var windowScrollTop = (0, _element.getScrollTop)(window);\n\n        // Only calculate firstVisibleRow when table didn't filled (from up) whole viewport space\n        if (rootElementOffset.top + totalTableHeight - windowHeight <= windowScrollTop) {\n          var rowsHeight = wtViewport.getColumnHeaderHeight();\n\n          rowsHeight += topOverlay.sumCellSizes(0, fixedRowsTop);\n\n          (0, _number.rangeEachReverse)(totalRows, 1, function (row) {\n            rowsHeight += topOverlay.sumCellSizes(row - 1, row);\n\n            if (rootElementOffset.top + totalTableHeight - rowsHeight <= windowScrollTop) {\n              // Return physical row + 1\n              firstVisibleRow = row;\n\n              return false;\n            }\n          });\n        }\n      }\n\n      return firstVisibleRow;\n    }\n\n    /**\n     * Get last visible row based on virtual dom and how table is visible in browser window viewport.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getLastVisibleRow',\n    value: function getLastVisibleRow() {\n      var _getVariables4 = this._getVariables(),\n          topOverlay = _getVariables4.topOverlay,\n          wtTable = _getVariables4.wtTable,\n          wtViewport = _getVariables4.wtViewport,\n          totalRows = _getVariables4.totalRows;\n\n      var lastVisibleRow = wtTable.getLastVisibleRow();\n\n      if (topOverlay.mainTableScrollableElement === window) {\n        var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);\n        var windowHeight = (0, _element.innerHeight)(window);\n        var windowScrollTop = (0, _element.getScrollTop)(window);\n\n        // Only calculate lastVisibleRow when table didn't filled (from bottom) whole viewport space\n        if (rootElementOffset.top > windowScrollTop) {\n          var rowsHeight = wtViewport.getColumnHeaderHeight();\n\n          (0, _number.rangeEach)(1, totalRows, function (row) {\n            rowsHeight += topOverlay.sumCellSizes(row - 1, row);\n\n            if (rootElementOffset.top + rowsHeight - windowScrollTop >= windowHeight) {\n              // Return physical row - 1 (-2 because rangeEach gives row index + 1 - sumCellSizes requirements)\n              lastVisibleRow = row - 2;\n\n              return false;\n            }\n          });\n        }\n      }\n\n      return lastVisibleRow;\n    }\n\n    /**\n     * Get first visible column based on virtual dom and how table is visible in browser window viewport.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getFirstVisibleColumn',\n    value: function getFirstVisibleColumn() {\n      var _getVariables5 = this._getVariables(),\n          leftOverlay = _getVariables5.leftOverlay,\n          wtTable = _getVariables5.wtTable,\n          wtViewport = _getVariables5.wtViewport,\n          totalColumns = _getVariables5.totalColumns,\n          fixedColumnsLeft = _getVariables5.fixedColumnsLeft;\n\n      var firstVisibleColumn = wtTable.getFirstVisibleColumn();\n\n      if (leftOverlay.mainTableScrollableElement === window) {\n        var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);\n        var totalTableWidth = (0, _element.innerWidth)(wtTable.hider);\n        var windowWidth = (0, _element.innerWidth)(window);\n        var windowScrollLeft = (0, _element.getScrollLeft)(window);\n\n        // Only calculate firstVisibleColumn when table didn't filled (from left) whole viewport space\n        if (rootElementOffset.left + totalTableWidth - windowWidth <= windowScrollLeft) {\n          var columnsWidth = wtViewport.getRowHeaderWidth();\n\n          (0, _number.rangeEachReverse)(totalColumns, 1, function (column) {\n            columnsWidth += leftOverlay.sumCellSizes(column - 1, column);\n\n            if (rootElementOffset.left + totalTableWidth - columnsWidth <= windowScrollLeft) {\n              // Return physical column + 1\n              firstVisibleColumn = column;\n\n              return false;\n            }\n          });\n        }\n      }\n\n      return firstVisibleColumn;\n    }\n\n    /**\n     * Get last visible column based on virtual dom and how table is visible in browser window viewport.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getLastVisibleColumn',\n    value: function getLastVisibleColumn() {\n      var _getVariables6 = this._getVariables(),\n          leftOverlay = _getVariables6.leftOverlay,\n          wtTable = _getVariables6.wtTable,\n          wtViewport = _getVariables6.wtViewport,\n          totalColumns = _getVariables6.totalColumns;\n\n      var lastVisibleColumn = wtTable.getLastVisibleColumn();\n\n      if (leftOverlay.mainTableScrollableElement === window) {\n        var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);\n        var windowWidth = (0, _element.innerWidth)(window);\n        var windowScrollLeft = (0, _element.getScrollLeft)(window);\n\n        // Only calculate lastVisibleColumn when table didn't filled (from right) whole viewport space\n        if (rootElementOffset.left > windowScrollLeft) {\n          var columnsWidth = wtViewport.getRowHeaderWidth();\n\n          (0, _number.rangeEach)(1, totalColumns, function (column) {\n            columnsWidth += leftOverlay.sumCellSizes(column - 1, column);\n\n            if (rootElementOffset.left + columnsWidth - windowScrollLeft >= windowWidth) {\n              // Return physical column - 1 (-2 because rangeEach gives column index + 1 - sumCellSizes requirements)\n              lastVisibleColumn = column - 2;\n\n              return false;\n            }\n          });\n        }\n      }\n\n      return lastVisibleColumn;\n    }\n\n    /**\n     * Returns collection of variables used to rows and columns visibility calculations.\n     *\n     * @returns {Object}\n     * @private\n     */\n\n  }, {\n    key: '_getVariables',\n    value: function _getVariables() {\n      var wot = this.wot;\n      var topOverlay = wot.wtOverlays.topOverlay;\n      var leftOverlay = wot.wtOverlays.leftOverlay;\n      var wtTable = wot.wtTable;\n      var wtViewport = wot.wtViewport;\n      var totalRows = wot.getSetting('totalRows');\n      var totalColumns = wot.getSetting('totalColumns');\n      var fixedRowsTop = wot.getSetting('fixedRowsTop');\n      var fixedRowsBottom = wot.getSetting('fixedRowsBottom');\n      var fixedColumnsLeft = wot.getSetting('fixedColumnsLeft');\n\n      return {\n        topOverlay: topOverlay,\n        leftOverlay: leftOverlay,\n        wtTable: wtTable,\n        wtViewport: wtViewport,\n        totalRows: totalRows,\n        totalColumns: totalColumns,\n        fixedRowsTop: fixedRowsTop,\n        fixedRowsBottom: fixedRowsBottom,\n        fixedColumnsLeft: fixedColumnsLeft\n      };\n    }\n  }]);\n\n  return Scroll;\n}();\n\nexports.default = Scroll;\n\n/***/ }),\n/* 183 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Settings\n */\nvar Settings = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   * @param {Object} settings\n   */\n  function Settings(wotInstance, settings) {\n    var _this = this;\n\n    _classCallCheck(this, Settings);\n\n    this.wot = wotInstance;\n\n    // legacy support\n    this.instance = wotInstance;\n\n    // default settings. void 0 means it is required, null means it can be empty\n    this.defaults = {\n      table: void 0,\n      debug: false, // shows WalkontableDebugOverlay\n\n      // presentation mode\n      externalRowCalculator: false,\n      stretchH: 'none', // values: all, last, none\n      currentRowClassName: null,\n      currentColumnClassName: null,\n      preventOverflow: function preventOverflow() {\n        return false;\n      },\n\n\n      // data source\n      data: void 0,\n      freezeOverlays: false,\n      fixedColumnsLeft: 0,\n      fixedRowsTop: 0,\n      fixedRowsBottom: 0,\n      minSpareRows: 0,\n\n      // this must be array of functions: [function (row, TH) {}]\n      rowHeaders: function rowHeaders() {\n        return [];\n      },\n\n\n      // this must be array of functions: [function (column, TH) {}]\n      columnHeaders: function columnHeaders() {\n        return [];\n      },\n\n      totalRows: void 0,\n      totalColumns: void 0,\n      cellRenderer: function cellRenderer(row, column, TD) {\n        var cellData = _this.getSetting('data', row, column);\n\n        (0, _element.fastInnerText)(TD, cellData === void 0 || cellData === null ? '' : cellData);\n      },\n\n      // columnWidth: 50,\n      columnWidth: function columnWidth(col) {\n        // return undefined means use default size for the rendered cell content\n      },\n      rowHeight: function rowHeight(row) {\n        // return undefined means use default size for the rendered cell content\n      },\n\n      defaultRowHeight: 23,\n      defaultColumnWidth: 50,\n      selections: null,\n      hideBorderOnMouseDownOver: false,\n      viewportRowCalculatorOverride: null,\n      viewportColumnCalculatorOverride: null,\n\n      // callbacks\n      onCellMouseDown: null,\n      onCellMouseOver: null,\n      onCellMouseOut: null,\n      onCellMouseUp: null,\n\n      //    onCellMouseOut: null,\n      onCellDblClick: null,\n      onCellCornerMouseDown: null,\n      onCellCornerDblClick: null,\n      beforeDraw: null,\n      onDraw: null,\n      onBeforeRemoveCellClassNames: null,\n      onAfterDrawSelection: null,\n      onBeforeDrawBorders: null,\n      onScrollVertically: null,\n      onScrollHorizontally: null,\n      onBeforeTouchScroll: null,\n      onAfterMomentumScroll: null,\n      onBeforeStretchingColumnWidth: function onBeforeStretchingColumnWidth(width) {\n        return width;\n      },\n      onModifyRowHeaderWidth: null,\n      onModifyGetCellCoords: null,\n\n      // constants\n      scrollbarWidth: 10,\n      scrollbarHeight: 10,\n\n      renderAllRows: false,\n      groups: false,\n      rowHeaderWidth: null,\n      columnHeaderHeight: null,\n      headerClassName: null\n    };\n\n    // reference to settings\n    this.settings = {};\n\n    for (var i in this.defaults) {\n      if ((0, _object.hasOwnProperty)(this.defaults, i)) {\n        if (settings[i] !== void 0) {\n          this.settings[i] = settings[i];\n        } else if (this.defaults[i] === void 0) {\n          throw new Error('A required setting \"' + i + '\" was not provided');\n        } else {\n          this.settings[i] = this.defaults[i];\n        }\n      }\n    }\n  }\n\n  /**\n   * Update settings\n   *\n   * @param {Object} settings\n   * @param {*} value\n   * @returns {Walkontable}\n   */\n\n\n  _createClass(Settings, [{\n    key: 'update',\n    value: function update(settings, value) {\n      if (value === void 0) {\n        // settings is object\n        for (var i in settings) {\n          if ((0, _object.hasOwnProperty)(settings, i)) {\n            this.settings[i] = settings[i];\n          }\n        }\n      } else {\n        // if value is defined then settings is the key\n        this.settings[settings] = value;\n      }\n      return this.wot;\n    }\n\n    /**\n     * Get setting by name\n     *\n     * @param {String} key\n     * @param {*} param1\n     * @param {*} param2\n     * @param {*} param3\n     * @param {*} param4\n     * @returns {*}\n     */\n\n  }, {\n    key: 'getSetting',\n    value: function getSetting(key, param1, param2, param3, param4) {\n      if (typeof this.settings[key] === 'function') {\n        // this is faster than .apply - https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\n        return this.settings[key](param1, param2, param3, param4);\n      } else if (param1 !== void 0 && Array.isArray(this.settings[key])) {\n        // perhaps this can be removed, it is only used in tests\n        return this.settings[key][param1];\n      }\n\n      return this.settings[key];\n    }\n\n    /**\n     * Checks if setting exists\n     *\n     * @param {Boolean} key\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'has',\n    value: function has(key) {\n      return !!this.settings[key];\n    }\n  }]);\n\n  return Settings;\n}();\n\nexports.default = Settings;\n\n/***/ }),\n/* 184 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _function = __webpack_require__(42);\n\nvar _coords = __webpack_require__(54);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nvar _range = __webpack_require__(86);\n\nvar _range2 = _interopRequireDefault(_range);\n\nvar _column = __webpack_require__(177);\n\nvar _column2 = _interopRequireDefault(_column);\n\nvar _row = __webpack_require__(178);\n\nvar _row2 = _interopRequireDefault(_row);\n\nvar _tableRenderer = __webpack_require__(185);\n\nvar _tableRenderer2 = _interopRequireDefault(_tableRenderer);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n *\n */\nvar Table = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   * @param {HTMLTableElement} table\n   */\n  function Table(wotInstance, table) {\n    var _this = this;\n\n    _classCallCheck(this, Table);\n\n    this.wot = wotInstance;\n\n    // legacy support\n    this.instance = this.wot;\n    this.TABLE = table;\n    this.TBODY = null;\n    this.THEAD = null;\n    this.COLGROUP = null;\n    this.tableOffset = 0;\n    this.holderOffset = 0;\n\n    (0, _element.removeTextNodes)(this.TABLE);\n\n    this.spreader = this.createSpreader(this.TABLE);\n    this.hider = this.createHider(this.spreader);\n    this.holder = this.createHolder(this.hider);\n\n    this.wtRootElement = this.holder.parentNode;\n    this.alignOverlaysWithTrimmingContainer();\n    this.fixTableDomTree();\n\n    this.colgroupChildrenLength = this.COLGROUP.childNodes.length;\n    this.theadChildrenLength = this.THEAD.firstChild ? this.THEAD.firstChild.childNodes.length : 0;\n    this.tbodyChildrenLength = this.TBODY.childNodes.length;\n\n    this.rowFilter = null;\n    this.columnFilter = null;\n    this.correctHeaderWidth = false;\n\n    var origRowHeaderWidth = this.wot.wtSettings.settings.rowHeaderWidth;\n\n    // Fix for jumping row headers (https://github.com/handsontable/handsontable/issues/3850)\n    this.wot.wtSettings.settings.rowHeaderWidth = function () {\n      return _this._modifyRowHeaderWidth(origRowHeaderWidth);\n    };\n  }\n\n  /**\n   *\n   */\n\n\n  _createClass(Table, [{\n    key: 'fixTableDomTree',\n    value: function fixTableDomTree() {\n      this.TBODY = this.TABLE.querySelector('tbody');\n\n      if (!this.TBODY) {\n        this.TBODY = document.createElement('tbody');\n        this.TABLE.appendChild(this.TBODY);\n      }\n      this.THEAD = this.TABLE.querySelector('thead');\n\n      if (!this.THEAD) {\n        this.THEAD = document.createElement('thead');\n        this.TABLE.insertBefore(this.THEAD, this.TBODY);\n      }\n      this.COLGROUP = this.TABLE.querySelector('colgroup');\n\n      if (!this.COLGROUP) {\n        this.COLGROUP = document.createElement('colgroup');\n        this.TABLE.insertBefore(this.COLGROUP, this.THEAD);\n      }\n\n      if (this.wot.getSetting('columnHeaders').length && !this.THEAD.childNodes.length) {\n        this.THEAD.appendChild(document.createElement('TR'));\n      }\n    }\n\n    /**\n     * @param table\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createSpreader',\n    value: function createSpreader(table) {\n      var parent = table.parentNode;\n      var spreader = void 0;\n\n      if (!parent || parent.nodeType !== 1 || !(0, _element.hasClass)(parent, 'wtHolder')) {\n        spreader = document.createElement('div');\n        spreader.className = 'wtSpreader';\n\n        if (parent) {\n          // if TABLE is detached (e.g. in Jasmine test), it has no parentNode so we cannot attach holder to it\n          parent.insertBefore(spreader, table);\n        }\n        spreader.appendChild(table);\n      }\n      spreader.style.position = 'relative';\n\n      return spreader;\n    }\n\n    /**\n     * @param spreader\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createHider',\n    value: function createHider(spreader) {\n      var parent = spreader.parentNode;\n      var hider = void 0;\n\n      if (!parent || parent.nodeType !== 1 || !(0, _element.hasClass)(parent, 'wtHolder')) {\n        hider = document.createElement('div');\n        hider.className = 'wtHider';\n\n        if (parent) {\n          // if TABLE is detached (e.g. in Jasmine test), it has no parentNode so we cannot attach holder to it\n          parent.insertBefore(hider, spreader);\n        }\n        hider.appendChild(spreader);\n      }\n\n      return hider;\n    }\n\n    /**\n     *\n     * @param hider\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createHolder',\n    value: function createHolder(hider) {\n      var parent = hider.parentNode;\n      var holder = void 0;\n\n      if (!parent || parent.nodeType !== 1 || !(0, _element.hasClass)(parent, 'wtHolder')) {\n        holder = document.createElement('div');\n        holder.style.position = 'relative';\n        holder.className = 'wtHolder';\n\n        if (parent) {\n          // if TABLE is detached (e.g. in Jasmine test), it has no parentNode so we cannot attach holder to it\n          parent.insertBefore(holder, hider);\n        }\n        if (!this.isWorkingOnClone()) {\n          holder.parentNode.className += 'ht_master handsontable';\n        }\n        holder.appendChild(hider);\n      }\n\n      return holder;\n    }\n  }, {\n    key: 'alignOverlaysWithTrimmingContainer',\n    value: function alignOverlaysWithTrimmingContainer() {\n      var trimmingElement = (0, _element.getTrimmingContainer)(this.wtRootElement);\n\n      if (!this.isWorkingOnClone()) {\n        this.holder.parentNode.style.position = 'relative';\n\n        if (trimmingElement === window) {\n          var preventOverflow = this.wot.getSetting('preventOverflow');\n\n          if (!preventOverflow) {\n            this.holder.style.overflow = 'visible';\n            this.wtRootElement.style.overflow = 'visible';\n          }\n        } else {\n          this.holder.style.width = (0, _element.getStyle)(trimmingElement, 'width');\n          this.holder.style.height = (0, _element.getStyle)(trimmingElement, 'height');\n          this.holder.style.overflow = '';\n        }\n      }\n    }\n  }, {\n    key: 'isWorkingOnClone',\n    value: function isWorkingOnClone() {\n      return !!this.wot.cloneSource;\n    }\n\n    /**\n     * Redraws the table\n     *\n     * @param {Boolean} fastDraw If TRUE, will try to avoid full redraw and only update the border positions. If FALSE or UNDEFINED, will perform a full redraw\n     * @returns {Table}\n     */\n\n  }, {\n    key: 'draw',\n    value: function draw(fastDraw) {\n      var _wot = this.wot,\n          wtOverlays = _wot.wtOverlays,\n          wtViewport = _wot.wtViewport;\n\n      var totalRows = this.instance.getSetting('totalRows');\n      var rowHeaders = this.wot.getSetting('rowHeaders').length;\n      var columnHeaders = this.wot.getSetting('columnHeaders').length;\n      var syncScroll = false;\n\n      if (!this.isWorkingOnClone()) {\n        this.holderOffset = (0, _element.offset)(this.holder);\n        fastDraw = wtViewport.createRenderCalculators(fastDraw);\n\n        if (rowHeaders && !this.wot.getSetting('fixedColumnsLeft')) {\n          var leftScrollPos = wtOverlays.leftOverlay.getScrollPosition();\n          var previousState = this.correctHeaderWidth;\n\n          this.correctHeaderWidth = leftScrollPos > 0;\n\n          if (previousState !== this.correctHeaderWidth) {\n            fastDraw = false;\n          }\n        }\n      }\n\n      if (!this.isWorkingOnClone()) {\n        syncScroll = wtOverlays.prepareOverlays();\n      }\n\n      if (fastDraw) {\n        if (!this.isWorkingOnClone()) {\n          // in case we only scrolled without redraw, update visible rows information in oldRowsCalculator\n          wtViewport.createVisibleCalculators();\n        }\n        if (wtOverlays) {\n          wtOverlays.refresh(true);\n        }\n      } else {\n        if (this.isWorkingOnClone()) {\n          this.tableOffset = this.wot.cloneSource.wtTable.tableOffset;\n        } else {\n          this.tableOffset = (0, _element.offset)(this.TABLE);\n        }\n        var startRow = void 0;\n\n        if (_base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_DEBUG) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_TOP) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_TOP_LEFT_CORNER)) {\n          startRow = 0;\n        } else if (_base2.default.isOverlayTypeOf(this.instance.cloneOverlay, _base2.default.CLONE_BOTTOM) || _base2.default.isOverlayTypeOf(this.instance.cloneOverlay, _base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n          startRow = Math.max(totalRows - this.wot.getSetting('fixedRowsBottom'), 0);\n        } else {\n          startRow = wtViewport.rowsRenderCalculator.startRow;\n        }\n        var startColumn = void 0;\n\n        if (_base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_DEBUG) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_LEFT) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_TOP_LEFT_CORNER) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n          startColumn = 0;\n        } else {\n          startColumn = wtViewport.columnsRenderCalculator.startColumn;\n        }\n        this.rowFilter = new _row2.default(startRow, totalRows, columnHeaders);\n        this.columnFilter = new _column2.default(startColumn, this.wot.getSetting('totalColumns'), rowHeaders);\n\n        this.alignOverlaysWithTrimmingContainer();\n        this._doDraw(); // creates calculator after draw\n      }\n      this.refreshSelections(fastDraw);\n\n      if (!this.isWorkingOnClone()) {\n        wtOverlays.topOverlay.resetFixedPosition();\n\n        if (wtOverlays.bottomOverlay.clone) {\n          wtOverlays.bottomOverlay.resetFixedPosition();\n        }\n\n        wtOverlays.leftOverlay.resetFixedPosition();\n\n        if (wtOverlays.topLeftCornerOverlay) {\n          wtOverlays.topLeftCornerOverlay.resetFixedPosition();\n        }\n\n        if (wtOverlays.bottomLeftCornerOverlay && wtOverlays.bottomLeftCornerOverlay.clone) {\n          wtOverlays.bottomLeftCornerOverlay.resetFixedPosition();\n        }\n      }\n      if (syncScroll) {\n        wtOverlays.syncScrollWithMaster();\n      }\n      this.wot.drawn = true;\n\n      return this;\n    }\n  }, {\n    key: '_doDraw',\n    value: function _doDraw() {\n      var wtRenderer = new _tableRenderer2.default(this);\n\n      wtRenderer.render();\n    }\n  }, {\n    key: 'removeClassFromCells',\n    value: function removeClassFromCells(className) {\n      var nodes = this.TABLE.querySelectorAll('.' + className);\n\n      for (var i = 0, len = nodes.length; i < len; i++) {\n        (0, _element.removeClass)(nodes[i], className);\n      }\n    }\n\n    /**\n     * Refresh the table selection by re-rendering Selection instances connected with that instance.\n     *\n     * @param {Boolean} fastDraw If fast drawing is enabled than additionally className clearing is applied.\n     */\n\n  }, {\n    key: 'refreshSelections',\n    value: function refreshSelections(fastDraw) {\n      if (!this.wot.selections) {\n        return;\n      }\n      var highlights = Array.from(this.wot.selections);\n      var len = highlights.length;\n\n      if (fastDraw) {\n        var classesToRemove = [];\n\n        for (var i = 0; i < len; i++) {\n          var _highlights$i$setting = highlights[i].settings,\n              highlightHeaderClassName = _highlights$i$setting.highlightHeaderClassName,\n              highlightRowClassName = _highlights$i$setting.highlightRowClassName,\n              highlightColumnClassName = _highlights$i$setting.highlightColumnClassName;\n\n          var classNames = highlights[i].classNames;\n          var classNamesLength = classNames.length;\n\n          for (var j = 0; j < classNamesLength; j++) {\n            if (!classesToRemove.includes(classNames[j])) {\n              classesToRemove.push(classNames[j]);\n            }\n          }\n\n          if (highlightHeaderClassName && !classesToRemove.includes(highlightHeaderClassName)) {\n            classesToRemove.push(highlightHeaderClassName);\n          }\n          if (highlightRowClassName && !classesToRemove.includes(highlightRowClassName)) {\n            classesToRemove.push(highlightRowClassName);\n          }\n          if (highlightColumnClassName && !classesToRemove.includes(highlightColumnClassName)) {\n            classesToRemove.push(highlightColumnClassName);\n          }\n        }\n\n        var additionalClassesToRemove = this.wot.getSetting('onBeforeRemoveCellClassNames');\n\n        if (Array.isArray(additionalClassesToRemove)) {\n          for (var _i = 0; _i < additionalClassesToRemove.length; _i++) {\n            classesToRemove.push(additionalClassesToRemove[_i]);\n          }\n        }\n\n        var classesToRemoveLength = classesToRemove.length;\n\n        for (var _i2 = 0; _i2 < classesToRemoveLength; _i2++) {\n          // there was no rerender, so we need to remove classNames by ourselves\n          this.removeClassFromCells(classesToRemove[_i2]);\n        }\n      }\n\n      for (var _i3 = 0; _i3 < len; _i3++) {\n        highlights[_i3].draw(this.wot, fastDraw);\n      }\n    }\n\n    /**\n     * Get cell element at coords.\n     *\n     * @param {CellCoords} coords\n     * @returns {HTMLElement|Number} HTMLElement on success or Number one of the exit codes on error:\n     *  -1 row before viewport\n     *  -2 row after viewport\n     */\n\n  }, {\n    key: 'getCell',\n    value: function getCell(coords) {\n      var row = coords.row;\n      var column = coords.col;\n      var hookResult = this.wot.getSetting('onModifyGetCellCoords', row, column);\n\n      if (hookResult && Array.isArray(hookResult)) {\n        var _hookResult = _slicedToArray(hookResult, 2);\n\n        row = _hookResult[0];\n        column = _hookResult[1];\n      }\n\n      if (this.isRowBeforeRenderedRows(row)) {\n        // row before rendered rows\n        return -1;\n      } else if (this.isRowAfterRenderedRows(row)) {\n        // row after rendered rows\n        return -2;\n      }\n\n      var TR = this.TBODY.childNodes[this.rowFilter.sourceToRendered(row)];\n\n      if (TR) {\n        return TR.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(column)];\n      }\n    }\n\n    /**\n     * getColumnHeader\n     *\n     * @param {Number} col Column index\n     * @param {Number} [level=0] Header level (0 = most distant to the table)\n     * @returns {Object} HTMLElement on success or undefined on error\n     */\n\n  }, {\n    key: 'getColumnHeader',\n    value: function getColumnHeader(col) {\n      var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n      var TR = this.THEAD.childNodes[level];\n\n      if (TR) {\n        return TR.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(col)];\n      }\n    }\n\n    /**\n     * getRowHeader\n     *\n     * @param {Number} row Row index\n     * @returns {HTMLElement} HTMLElement on success or Number one of the exit codes on error: `null table doesn't have row headers`\n     */\n\n  }, {\n    key: 'getRowHeader',\n    value: function getRowHeader(row) {\n      if (this.columnFilter.sourceColumnToVisibleRowHeadedColumn(0) === 0) {\n        return null;\n      }\n      var TR = this.TBODY.childNodes[this.rowFilter.sourceToRendered(row)];\n\n      if (TR) {\n        return TR.childNodes[0];\n      }\n    }\n\n    /**\n     * Returns cell coords object for a given TD (or a child element of a TD element).\n     *\n     * @param {HTMLTableCellElement} TD A cell DOM element (or a child of one).\n     * @returns {CellCoords|null} The coordinates of the provided TD element (or the closest TD element) or null, if the provided element is not applicable.\n     */\n\n  }, {\n    key: 'getCoords',\n    value: function getCoords(TD) {\n      if (TD.nodeName !== 'TD' && TD.nodeName !== 'TH') {\n        TD = (0, _element.closest)(TD, ['TD', 'TH']);\n      }\n\n      if (TD === null) {\n        return null;\n      }\n\n      var TR = TD.parentNode;\n      var CONTAINER = TR.parentNode;\n      var row = (0, _element.index)(TR);\n      var col = TD.cellIndex;\n\n      if ((0, _element.overlayContainsElement)(_base2.default.CLONE_TOP_LEFT_CORNER, TD) || (0, _element.overlayContainsElement)(_base2.default.CLONE_TOP, TD)) {\n        if (CONTAINER.nodeName === 'THEAD') {\n          row -= CONTAINER.childNodes.length;\n        }\n      } else if (CONTAINER === this.THEAD) {\n        row = this.rowFilter.visibleColHeadedRowToSourceRow(row);\n      } else {\n        row = this.rowFilter.renderedToSource(row);\n      }\n\n      if ((0, _element.overlayContainsElement)(_base2.default.CLONE_TOP_LEFT_CORNER, TD) || (0, _element.overlayContainsElement)(_base2.default.CLONE_LEFT, TD)) {\n        col = this.columnFilter.offsettedTH(col);\n      } else {\n        col = this.columnFilter.visibleRowHeadedColumnToSourceColumn(col);\n      }\n\n      return new _coords2.default(row, col);\n    }\n  }, {\n    key: 'getTrForRow',\n    value: function getTrForRow(row) {\n      return this.TBODY.childNodes[this.rowFilter.sourceToRendered(row)];\n    }\n  }, {\n    key: 'getFirstRenderedRow',\n    value: function getFirstRenderedRow() {\n      return this.wot.wtViewport.rowsRenderCalculator.startRow;\n    }\n  }, {\n    key: 'getFirstVisibleRow',\n    value: function getFirstVisibleRow() {\n      return this.wot.wtViewport.rowsVisibleCalculator.startRow;\n    }\n  }, {\n    key: 'getFirstRenderedColumn',\n    value: function getFirstRenderedColumn() {\n      return this.wot.wtViewport.columnsRenderCalculator.startColumn;\n    }\n\n    /**\n     * @returns {Number} Returns -1 if no row is visible\n     */\n\n  }, {\n    key: 'getFirstVisibleColumn',\n    value: function getFirstVisibleColumn() {\n      return this.wot.wtViewport.columnsVisibleCalculator.startColumn;\n    }\n\n    /**\n     * @returns {Number} Returns -1 if no row is visible\n     */\n\n  }, {\n    key: 'getLastRenderedRow',\n    value: function getLastRenderedRow() {\n      return this.wot.wtViewport.rowsRenderCalculator.endRow;\n    }\n  }, {\n    key: 'getLastVisibleRow',\n    value: function getLastVisibleRow() {\n      return this.wot.wtViewport.rowsVisibleCalculator.endRow;\n    }\n  }, {\n    key: 'getLastRenderedColumn',\n    value: function getLastRenderedColumn() {\n      return this.wot.wtViewport.columnsRenderCalculator.endColumn;\n    }\n\n    /**\n     * @returns {Number} Returns -1 if no column is visible\n     */\n\n  }, {\n    key: 'getLastVisibleColumn',\n    value: function getLastVisibleColumn() {\n      return this.wot.wtViewport.columnsVisibleCalculator.endColumn;\n    }\n  }, {\n    key: 'isRowBeforeRenderedRows',\n    value: function isRowBeforeRenderedRows(row) {\n      return this.rowFilter && this.rowFilter.sourceToRendered(row) < 0 && row >= 0;\n    }\n  }, {\n    key: 'isRowAfterViewport',\n    value: function isRowAfterViewport(row) {\n      return this.rowFilter && this.rowFilter.sourceToRendered(row) > this.getLastVisibleRow();\n    }\n  }, {\n    key: 'isRowAfterRenderedRows',\n    value: function isRowAfterRenderedRows(row) {\n      return this.rowFilter && this.rowFilter.sourceToRendered(row) > this.getLastRenderedRow();\n    }\n  }, {\n    key: 'isColumnBeforeViewport',\n    value: function isColumnBeforeViewport(column) {\n      return this.columnFilter && this.columnFilter.sourceToRendered(column) < 0 && column >= 0;\n    }\n  }, {\n    key: 'isColumnAfterViewport',\n    value: function isColumnAfterViewport(column) {\n      return this.columnFilter && this.columnFilter.sourceToRendered(column) > this.getLastVisibleColumn();\n    }\n  }, {\n    key: 'isLastRowFullyVisible',\n    value: function isLastRowFullyVisible() {\n      return this.getLastVisibleRow() === this.getLastRenderedRow();\n    }\n  }, {\n    key: 'isLastColumnFullyVisible',\n    value: function isLastColumnFullyVisible() {\n      return this.getLastVisibleColumn() === this.getLastRenderedColumn();\n    }\n  }, {\n    key: 'getRenderedColumnsCount',\n    value: function getRenderedColumnsCount() {\n      var columnsCount = this.wot.wtViewport.columnsRenderCalculator.count;\n      var totalColumns = this.wot.getSetting('totalColumns');\n\n      if (this.wot.isOverlayName(_base2.default.CLONE_DEBUG)) {\n        columnsCount = totalColumns;\n      } else if (this.wot.isOverlayName(_base2.default.CLONE_LEFT) || this.wot.isOverlayName(_base2.default.CLONE_TOP_LEFT_CORNER) || this.wot.isOverlayName(_base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n        return Math.min(this.wot.getSetting('fixedColumnsLeft'), totalColumns);\n      }\n\n      return columnsCount;\n    }\n  }, {\n    key: 'getRenderedRowsCount',\n    value: function getRenderedRowsCount() {\n      var rowsCount = this.wot.wtViewport.rowsRenderCalculator.count;\n      var totalRows = this.wot.getSetting('totalRows');\n\n      if (this.wot.isOverlayName(_base2.default.CLONE_DEBUG)) {\n        rowsCount = totalRows;\n      } else if (this.wot.isOverlayName(_base2.default.CLONE_TOP) || this.wot.isOverlayName(_base2.default.CLONE_TOP_LEFT_CORNER)) {\n        rowsCount = Math.min(this.wot.getSetting('fixedRowsTop'), totalRows);\n      } else if (this.wot.isOverlayName(_base2.default.CLONE_BOTTOM) || this.wot.isOverlayName(_base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n        rowsCount = Math.min(this.wot.getSetting('fixedRowsBottom'), totalRows);\n      }\n\n      return rowsCount;\n    }\n  }, {\n    key: 'getVisibleRowsCount',\n    value: function getVisibleRowsCount() {\n      return this.wot.wtViewport.rowsVisibleCalculator.count;\n    }\n  }, {\n    key: 'allRowsInViewport',\n    value: function allRowsInViewport() {\n      return this.wot.getSetting('totalRows') == this.getVisibleRowsCount();\n    }\n\n    /**\n     * Checks if any of the row's cells content exceeds its initial height, and if so, returns the oversized height\n     *\n     * @param {Number} sourceRow\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getRowHeight',\n    value: function getRowHeight(sourceRow) {\n      var height = this.wot.wtSettings.settings.rowHeight(sourceRow);\n      var oversizedHeight = this.wot.wtViewport.oversizedRows[sourceRow];\n\n      if (oversizedHeight !== void 0) {\n        height = height === void 0 ? oversizedHeight : Math.max(height, oversizedHeight);\n      }\n\n      return height;\n    }\n  }, {\n    key: 'getColumnHeaderHeight',\n    value: function getColumnHeaderHeight(level) {\n      var height = this.wot.wtSettings.settings.defaultRowHeight;\n      var oversizedHeight = this.wot.wtViewport.oversizedColumnHeaders[level];\n\n      if (oversizedHeight !== void 0) {\n        height = height ? Math.max(height, oversizedHeight) : oversizedHeight;\n      }\n\n      return height;\n    }\n  }, {\n    key: 'getVisibleColumnsCount',\n    value: function getVisibleColumnsCount() {\n      return this.wot.wtViewport.columnsVisibleCalculator.count;\n    }\n  }, {\n    key: 'allColumnsInViewport',\n    value: function allColumnsInViewport() {\n      return this.wot.getSetting('totalColumns') == this.getVisibleColumnsCount();\n    }\n  }, {\n    key: 'getColumnWidth',\n    value: function getColumnWidth(sourceColumn) {\n      var width = this.wot.wtSettings.settings.columnWidth;\n\n      if (typeof width === 'function') {\n        width = width(sourceColumn);\n      } else if ((typeof width === 'undefined' ? 'undefined' : _typeof(width)) === 'object') {\n        width = width[sourceColumn];\n      }\n\n      return width || this.wot.wtSettings.settings.defaultColumnWidth;\n    }\n  }, {\n    key: 'getStretchedColumnWidth',\n    value: function getStretchedColumnWidth(sourceColumn) {\n      var columnWidth = this.getColumnWidth(sourceColumn);\n      var width = columnWidth == null ? this.instance.wtSettings.settings.defaultColumnWidth : columnWidth;\n      var calculator = this.wot.wtViewport.columnsRenderCalculator;\n\n      if (calculator) {\n        var stretchedWidth = calculator.getStretchedColumnWidth(sourceColumn, width);\n\n        if (stretchedWidth) {\n          width = stretchedWidth;\n        }\n      }\n\n      return width;\n    }\n\n    /**\n     * Modify row header widths provided by user in class contructor.\n     *\n     * @private\n     */\n\n  }, {\n    key: '_modifyRowHeaderWidth',\n    value: function _modifyRowHeaderWidth(rowHeaderWidthFactory) {\n      var widths = (0, _function.isFunction)(rowHeaderWidthFactory) ? rowHeaderWidthFactory() : null;\n\n      if (Array.isArray(widths)) {\n        widths = [].concat(_toConsumableArray(widths));\n        widths[widths.length - 1] = this._correctRowHeaderWidth(widths[widths.length - 1]);\n      } else {\n        widths = this._correctRowHeaderWidth(widths);\n      }\n\n      return widths;\n    }\n\n    /**\n     * Correct row header width if necessary.\n     *\n     * @private\n     */\n\n  }, {\n    key: '_correctRowHeaderWidth',\n    value: function _correctRowHeaderWidth(width) {\n      if (typeof width !== 'number') {\n        width = this.wot.getSetting('defaultColumnWidth');\n      }\n      if (this.correctHeaderWidth) {\n        width++;\n      }\n\n      return width;\n    }\n  }]);\n\n  return Table;\n}();\n\nexports.default = Table;\n\n/***/ }),\n/* 185 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['Performance tip: Handsontable rendered more than 1000 visible rows. Consider limiting the number \\n          of rendered rows by specifying the table height and/or turning off the \"renderAllRows\" option.'], ['Performance tip: Handsontable rendered more than 1000 visible rows. Consider limiting the number \\n          of rendered rows by specifying the table height and/or turning off the \"renderAllRows\" option.']);\n\nvar _element = __webpack_require__(0);\n\nvar _console = __webpack_require__(56);\n\nvar _templateLiteralTag = __webpack_require__(41);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar performanceWarningAppeared = false;\n\n/**\n * @class TableRenderer\n */\n\nvar TableRenderer = function () {\n  /**\n   * @param {WalkontableTable} wtTable\n   */\n  function TableRenderer(wtTable) {\n    _classCallCheck(this, TableRenderer);\n\n    this.wtTable = wtTable;\n    this.wot = wtTable.instance;\n\n    // legacy support\n    this.instance = wtTable.instance;\n\n    this.rowFilter = wtTable.rowFilter;\n    this.columnFilter = wtTable.columnFilter;\n\n    this.TABLE = wtTable.TABLE;\n    this.THEAD = wtTable.THEAD;\n    this.TBODY = wtTable.TBODY;\n    this.COLGROUP = wtTable.COLGROUP;\n\n    this.rowHeaders = [];\n    this.rowHeaderCount = 0;\n    this.columnHeaders = [];\n    this.columnHeaderCount = 0;\n    this.fixedRowsTop = 0;\n    this.fixedRowsBottom = 0;\n  }\n\n  /**\n   *\n   */\n\n\n  _createClass(TableRenderer, [{\n    key: 'render',\n    value: function render() {\n      if (!this.wtTable.isWorkingOnClone()) {\n        var skipRender = {};\n        this.wot.getSetting('beforeDraw', true, skipRender);\n\n        if (skipRender.skipRender === true) {\n          return;\n        }\n      }\n\n      this.rowHeaders = this.wot.getSetting('rowHeaders');\n      this.rowHeaderCount = this.rowHeaders.length;\n      this.fixedRowsTop = this.wot.getSetting('fixedRowsTop');\n      this.fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');\n      this.columnHeaders = this.wot.getSetting('columnHeaders');\n      this.columnHeaderCount = this.columnHeaders.length;\n\n      var columnsToRender = this.wtTable.getRenderedColumnsCount();\n      var rowsToRender = this.wtTable.getRenderedRowsCount();\n      var totalColumns = this.wot.getSetting('totalColumns');\n      var totalRows = this.wot.getSetting('totalRows');\n      var workspaceWidth = void 0;\n      var adjusted = false;\n\n      if (_base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_BOTTOM) || _base2.default.isOverlayTypeOf(this.wot.cloneOverlay, _base2.default.CLONE_BOTTOM_LEFT_CORNER)) {\n\n        // do NOT render headers on the bottom or bottom-left corner overlay\n        this.columnHeaders = [];\n        this.columnHeaderCount = 0;\n      }\n\n      if (totalColumns >= 0) {\n        // prepare COL and TH elements for rendering\n        this.adjustAvailableNodes();\n        adjusted = true;\n\n        // adjust column widths according to user widths settings\n        this.renderColumnHeaders();\n\n        // Render table rows\n        this.renderRows(totalRows, rowsToRender, columnsToRender);\n\n        if (!this.wtTable.isWorkingOnClone()) {\n          workspaceWidth = this.wot.wtViewport.getWorkspaceWidth();\n          this.wot.wtViewport.containerWidth = null;\n        }\n\n        this.adjustColumnWidths(columnsToRender);\n        this.markOversizedColumnHeaders();\n        this.adjustColumnHeaderHeights();\n      }\n\n      if (!adjusted) {\n        this.adjustAvailableNodes();\n      }\n      this.removeRedundantRows(rowsToRender);\n\n      if (!this.wtTable.isWorkingOnClone() || this.wot.isOverlayName(_base2.default.CLONE_BOTTOM)) {\n        this.markOversizedRows();\n      }\n      if (!this.wtTable.isWorkingOnClone()) {\n        this.wot.wtViewport.createVisibleCalculators();\n        this.wot.wtOverlays.refresh(false);\n\n        this.wot.wtOverlays.applyToDOM();\n\n        var hiderWidth = (0, _element.outerWidth)(this.wtTable.hider);\n        var tableWidth = (0, _element.outerWidth)(this.wtTable.TABLE);\n\n        if (hiderWidth !== 0 && tableWidth !== hiderWidth) {\n          // Recalculate the column widths, if width changes made in the overlays removed the scrollbar, thus changing the viewport width.\n          this.adjustColumnWidths(columnsToRender);\n        }\n\n        if (workspaceWidth !== this.wot.wtViewport.getWorkspaceWidth()) {\n          // workspace width changed though to shown/hidden vertical scrollbar. Let's reapply stretching\n          this.wot.wtViewport.containerWidth = null;\n\n          var firstRendered = this.wtTable.getFirstRenderedColumn();\n          var lastRendered = this.wtTable.getLastRenderedColumn();\n          var defaultColumnWidth = this.wot.getSetting('defaultColumnWidth');\n          var rowHeaderWidthSetting = this.wot.getSetting('rowHeaderWidth');\n\n          rowHeaderWidthSetting = this.instance.getSetting('onModifyRowHeaderWidth', rowHeaderWidthSetting);\n\n          if (rowHeaderWidthSetting != null) {\n            for (var i = 0; i < this.rowHeaderCount; i++) {\n              var width = Array.isArray(rowHeaderWidthSetting) ? rowHeaderWidthSetting[i] : rowHeaderWidthSetting;\n\n              width = width == null ? defaultColumnWidth : width;\n\n              this.COLGROUP.childNodes[i].style.width = width + 'px';\n            }\n          }\n\n          for (var _i = firstRendered; _i < lastRendered; _i++) {\n            var _width = this.wtTable.getStretchedColumnWidth(_i);\n            var renderedIndex = this.columnFilter.sourceToRendered(_i);\n\n            this.COLGROUP.childNodes[renderedIndex + this.rowHeaderCount].style.width = _width + 'px';\n          }\n        }\n\n        this.wot.getSetting('onDraw', true);\n      } else if (this.wot.isOverlayName(_base2.default.CLONE_BOTTOM)) {\n        this.wot.cloneSource.wtOverlays.adjustElementsSize();\n      }\n    }\n\n    /**\n     * @param {Number} renderedRowsCount\n     */\n\n  }, {\n    key: 'removeRedundantRows',\n    value: function removeRedundantRows(renderedRowsCount) {\n      while (this.wtTable.tbodyChildrenLength > renderedRowsCount) {\n        this.TBODY.removeChild(this.TBODY.lastChild);\n        this.wtTable.tbodyChildrenLength--;\n      }\n    }\n\n    /**\n     * @param {Number} totalRows\n     * @param {Number} rowsToRender\n     * @param {Number} columnsToRender\n     */\n\n  }, {\n    key: 'renderRows',\n    value: function renderRows(totalRows, rowsToRender, columnsToRender) {\n      var lastTD = void 0;\n      var TR = void 0;\n      var visibleRowIndex = 0;\n      var sourceRowIndex = this.rowFilter.renderedToSource(visibleRowIndex);\n      var isWorkingOnClone = this.wtTable.isWorkingOnClone();\n\n      while (sourceRowIndex < totalRows && sourceRowIndex >= 0) {\n        if (!performanceWarningAppeared && visibleRowIndex > 1000) {\n          performanceWarningAppeared = true;\n          (0, _console.warn)((0, _templateLiteralTag.toSingleLine)(_templateObject));\n        }\n        if (rowsToRender !== void 0 && visibleRowIndex === rowsToRender) {\n          // We have as much rows as needed for this clone\n          break;\n        }\n        TR = this.getOrCreateTrForRow(visibleRowIndex, TR);\n\n        // Render row headers\n        this.renderRowHeaders(sourceRowIndex, TR);\n        // Add and/or remove TDs to TR to match the desired number\n        this.adjustColumns(TR, columnsToRender + this.rowHeaderCount);\n\n        lastTD = this.renderCells(sourceRowIndex, TR, columnsToRender);\n\n        if (!isWorkingOnClone ||\n        // Necessary to refresh oversized row heights after editing cell in overlays\n        this.wot.isOverlayName(_base2.default.CLONE_BOTTOM)) {\n          // Reset the oversized row cache for this row\n          this.resetOversizedRow(sourceRowIndex);\n        }\n\n        if (TR.firstChild) {\n          // if I have 2 fixed columns with one-line content and the 3rd column has a multiline content, this is\n          // the way to make sure that the overlay will has same row height\n          var height = this.wot.wtTable.getRowHeight(sourceRowIndex);\n\n          if (height) {\n            // Decrease height. 1 pixel will be \"replaced\" by 1px border top\n            height--;\n            TR.firstChild.style.height = height + 'px';\n          } else {\n            TR.firstChild.style.height = '';\n          }\n        }\n        visibleRowIndex++;\n        sourceRowIndex = this.rowFilter.renderedToSource(visibleRowIndex);\n      }\n    }\n\n    /**\n     * Reset the oversized row cache for the provided index\n     *\n     * @param {Number} sourceRow Row index\n     */\n\n  }, {\n    key: 'resetOversizedRow',\n    value: function resetOversizedRow(sourceRow) {\n      if (this.wot.getSetting('externalRowCalculator')) {\n        return;\n      }\n      if (this.wot.wtViewport.oversizedRows && this.wot.wtViewport.oversizedRows[sourceRow]) {\n        this.wot.wtViewport.oversizedRows[sourceRow] = void 0;\n      }\n    }\n\n    /**\n     * Check if any of the rendered rows is higher than expected, and if so, cache them\n     */\n\n  }, {\n    key: 'markOversizedRows',\n    value: function markOversizedRows() {\n      if (this.wot.getSetting('externalRowCalculator')) {\n        return;\n      }\n      var rowCount = this.instance.wtTable.TBODY.childNodes.length;\n      var expectedTableHeight = rowCount * this.instance.wtSettings.settings.defaultRowHeight;\n      var actualTableHeight = (0, _element.innerHeight)(this.instance.wtTable.TBODY) - 1;\n      var previousRowHeight = void 0;\n      var rowInnerHeight = void 0;\n      var sourceRowIndex = void 0;\n      var currentTr = void 0;\n      var rowHeader = void 0;\n      var totalRows = this.instance.getSetting('totalRows');\n\n      if (expectedTableHeight === actualTableHeight && !this.instance.getSetting('fixedRowsBottom')) {\n        // If the actual table height equals rowCount * default single row height, no row is oversized -> no need to iterate over them\n        return;\n      }\n\n      while (rowCount) {\n        rowCount--;\n        sourceRowIndex = this.instance.wtTable.rowFilter.renderedToSource(rowCount);\n        previousRowHeight = this.instance.wtTable.getRowHeight(sourceRowIndex);\n        currentTr = this.instance.wtTable.getTrForRow(sourceRowIndex);\n        rowHeader = currentTr.querySelector('th');\n\n        if (rowHeader) {\n          rowInnerHeight = (0, _element.innerHeight)(rowHeader);\n        } else {\n          rowInnerHeight = (0, _element.innerHeight)(currentTr) - 1;\n        }\n\n        if (!previousRowHeight && this.instance.wtSettings.settings.defaultRowHeight < rowInnerHeight || previousRowHeight < rowInnerHeight) {\n          this.instance.wtViewport.oversizedRows[sourceRowIndex] = ++rowInnerHeight;\n        }\n      }\n    }\n\n    /**\n     * Check if any of the rendered columns is higher than expected, and if so, cache them.\n     */\n\n  }, {\n    key: 'markOversizedColumnHeaders',\n    value: function markOversizedColumnHeaders() {\n      var overlayName = this.wot.getOverlayName();\n\n      if (!this.columnHeaderCount || this.wot.wtViewport.hasOversizedColumnHeadersMarked[overlayName] || this.wtTable.isWorkingOnClone()) {\n        return;\n      }\n      var columnCount = this.wtTable.getRenderedColumnsCount();\n\n      for (var i = 0; i < this.columnHeaderCount; i++) {\n        for (var renderedColumnIndex = -1 * this.rowHeaderCount; renderedColumnIndex < columnCount; renderedColumnIndex++) {\n          this.markIfOversizedColumnHeader(renderedColumnIndex);\n        }\n      }\n      this.wot.wtViewport.hasOversizedColumnHeadersMarked[overlayName] = true;\n    }\n\n    /**\n     *\n     */\n\n  }, {\n    key: 'adjustColumnHeaderHeights',\n    value: function adjustColumnHeaderHeights() {\n      var columnHeaders = this.wot.getSetting('columnHeaders');\n      var children = this.wot.wtTable.THEAD.childNodes;\n      var oversizedColumnHeaders = this.wot.wtViewport.oversizedColumnHeaders;\n\n      for (var i = 0, len = columnHeaders.length; i < len; i++) {\n        if (oversizedColumnHeaders[i]) {\n          if (!children[i] || children[i].childNodes.length === 0) {\n            return;\n          }\n          children[i].childNodes[0].style.height = oversizedColumnHeaders[i] + 'px';\n        }\n      }\n    }\n\n    /**\n     * Check if column header for the specified column is higher than expected, and if so, cache it\n     *\n     * @param {Number} col Index of column\n     */\n\n  }, {\n    key: 'markIfOversizedColumnHeader',\n    value: function markIfOversizedColumnHeader(col) {\n      var sourceColIndex = this.wot.wtTable.columnFilter.renderedToSource(col);\n      var level = this.columnHeaderCount;\n      var defaultRowHeight = this.wot.wtSettings.settings.defaultRowHeight;\n      var previousColHeaderHeight = void 0;\n      var currentHeader = void 0;\n      var currentHeaderHeight = void 0;\n      var columnHeaderHeightSetting = this.wot.getSetting('columnHeaderHeight') || [];\n\n      while (level) {\n        level--;\n\n        previousColHeaderHeight = this.wot.wtTable.getColumnHeaderHeight(level);\n        currentHeader = this.wot.wtTable.getColumnHeader(sourceColIndex, level);\n\n        if (!currentHeader) {\n          /* eslint-disable no-continue */\n          continue;\n        }\n        currentHeaderHeight = (0, _element.innerHeight)(currentHeader);\n\n        if (!previousColHeaderHeight && defaultRowHeight < currentHeaderHeight || previousColHeaderHeight < currentHeaderHeight) {\n          this.wot.wtViewport.oversizedColumnHeaders[level] = currentHeaderHeight;\n        }\n\n        if (Array.isArray(columnHeaderHeightSetting)) {\n          if (columnHeaderHeightSetting[level] != null) {\n            this.wot.wtViewport.oversizedColumnHeaders[level] = columnHeaderHeightSetting[level];\n          }\n        } else if (!isNaN(columnHeaderHeightSetting)) {\n          this.wot.wtViewport.oversizedColumnHeaders[level] = columnHeaderHeightSetting;\n        }\n\n        if (this.wot.wtViewport.oversizedColumnHeaders[level] < (columnHeaderHeightSetting[level] || columnHeaderHeightSetting)) {\n          this.wot.wtViewport.oversizedColumnHeaders[level] = columnHeaderHeightSetting[level] || columnHeaderHeightSetting;\n        }\n      }\n    }\n\n    /**\n     * @param {Number} sourceRowIndex\n     * @param {HTMLTableRowElement} TR\n     * @param {Number} columnsToRender\n     * @returns {HTMLTableCellElement}\n     */\n\n  }, {\n    key: 'renderCells',\n    value: function renderCells(sourceRowIndex, TR, columnsToRender) {\n      var TD = void 0;\n      var sourceColIndex = void 0;\n\n      for (var visibleColIndex = 0; visibleColIndex < columnsToRender; visibleColIndex++) {\n        sourceColIndex = this.columnFilter.renderedToSource(visibleColIndex);\n\n        if (visibleColIndex === 0) {\n          TD = TR.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(sourceColIndex)];\n        } else {\n          TD = TD.nextSibling; // http://jsperf.com/nextsibling-vs-indexed-childnodes\n        }\n        // If the number of headers has been reduced, we need to replace excess TH with TD\n        if (TD.nodeName == 'TH') {\n          TD = replaceThWithTd(TD, TR);\n        }\n        if (!(0, _element.hasClass)(TD, 'hide')) {\n          TD.className = '';\n        }\n        TD.removeAttribute('style');\n        this.wot.wtSettings.settings.cellRenderer(sourceRowIndex, sourceColIndex, TD);\n      }\n\n      return TD;\n    }\n\n    /**\n     * @param {Number} columnsToRender Number of columns to render.\n     */\n\n  }, {\n    key: 'adjustColumnWidths',\n    value: function adjustColumnWidths(columnsToRender) {\n      var scrollbarCompensation = 0;\n      var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot;\n      var mainHolder = sourceInstance.wtTable.holder;\n      var defaultColumnWidth = this.wot.getSetting('defaultColumnWidth');\n      var rowHeaderWidthSetting = this.wot.getSetting('rowHeaderWidth');\n\n      if (mainHolder.offsetHeight < mainHolder.scrollHeight) {\n        scrollbarCompensation = (0, _element.getScrollbarWidth)();\n      }\n      this.wot.wtViewport.columnsRenderCalculator.refreshStretching(this.wot.wtViewport.getViewportWidth() - scrollbarCompensation);\n\n      rowHeaderWidthSetting = this.instance.getSetting('onModifyRowHeaderWidth', rowHeaderWidthSetting);\n\n      if (rowHeaderWidthSetting != null) {\n        for (var i = 0; i < this.rowHeaderCount; i++) {\n          var width = Array.isArray(rowHeaderWidthSetting) ? rowHeaderWidthSetting[i] : rowHeaderWidthSetting;\n\n          width = width == null ? defaultColumnWidth : width;\n\n          this.COLGROUP.childNodes[i].style.width = width + 'px';\n        }\n      }\n\n      for (var renderedColIndex = 0; renderedColIndex < columnsToRender; renderedColIndex++) {\n        var _width2 = this.wtTable.getStretchedColumnWidth(this.columnFilter.renderedToSource(renderedColIndex));\n\n        this.COLGROUP.childNodes[renderedColIndex + this.rowHeaderCount].style.width = _width2 + 'px';\n      }\n    }\n\n    /**\n     * @param {HTMLTableCellElement} TR\n     */\n\n  }, {\n    key: 'appendToTbody',\n    value: function appendToTbody(TR) {\n      this.TBODY.appendChild(TR);\n      this.wtTable.tbodyChildrenLength++;\n    }\n\n    /**\n     * @param {Number} rowIndex\n     * @param {HTMLTableRowElement} currentTr\n     * @returns {HTMLTableCellElement}\n     */\n\n  }, {\n    key: 'getOrCreateTrForRow',\n    value: function getOrCreateTrForRow(rowIndex, currentTr) {\n      var TR = void 0;\n\n      if (rowIndex >= this.wtTable.tbodyChildrenLength) {\n        TR = this.createRow();\n        this.appendToTbody(TR);\n      } else if (rowIndex === 0) {\n        TR = this.TBODY.firstChild;\n      } else {\n        // http://jsperf.com/nextsibling-vs-indexed-childnodes\n        TR = currentTr.nextSibling;\n      }\n      if (TR.className) {\n        TR.removeAttribute('class');\n      }\n\n      return TR;\n    }\n\n    /**\n     * @returns {HTMLTableCellElement}\n     */\n\n  }, {\n    key: 'createRow',\n    value: function createRow() {\n      var TR = document.createElement('TR');\n\n      for (var visibleColIndex = 0; visibleColIndex < this.rowHeaderCount; visibleColIndex++) {\n        TR.appendChild(document.createElement('TH'));\n      }\n\n      return TR;\n    }\n\n    /**\n     * @param {Number} row\n     * @param {Number} col\n     * @param {HTMLTableCellElement} TH\n     */\n\n  }, {\n    key: 'renderRowHeader',\n    value: function renderRowHeader(row, col, TH) {\n      TH.className = '';\n      TH.removeAttribute('style');\n      this.rowHeaders[col](row, TH, col);\n    }\n\n    /**\n     * @param {Number} row\n     * @param {HTMLTableCellElement} TR\n     */\n\n  }, {\n    key: 'renderRowHeaders',\n    value: function renderRowHeaders(row, TR) {\n      for (var TH = TR.firstChild, visibleColIndex = 0; visibleColIndex < this.rowHeaderCount; visibleColIndex++) {\n        // If the number of row headers increased we need to create TH or replace an existing TD node with TH\n        if (!TH) {\n          TH = document.createElement('TH');\n          TR.appendChild(TH);\n        } else if (TH.nodeName == 'TD') {\n          TH = replaceTdWithTh(TH, TR);\n        }\n        this.renderRowHeader(row, visibleColIndex, TH);\n        // http://jsperf.com/nextsibling-vs-indexed-childnodes\n        TH = TH.nextSibling;\n      }\n    }\n\n    /**\n     * Adjust the number of COL and TH elements to match the number of columns and headers that need to be rendered\n     */\n\n  }, {\n    key: 'adjustAvailableNodes',\n    value: function adjustAvailableNodes() {\n      this.adjustColGroups();\n      this.adjustThead();\n    }\n\n    /**\n     * Renders the column headers\n     */\n\n  }, {\n    key: 'renderColumnHeaders',\n    value: function renderColumnHeaders() {\n      if (!this.columnHeaderCount) {\n        return;\n      }\n      var columnCount = this.wtTable.getRenderedColumnsCount();\n\n      for (var i = 0; i < this.columnHeaderCount; i++) {\n        var TR = this.getTrForColumnHeaders(i);\n\n        for (var renderedColumnIndex = -1 * this.rowHeaderCount; renderedColumnIndex < columnCount; renderedColumnIndex++) {\n          var sourceCol = this.columnFilter.renderedToSource(renderedColumnIndex);\n\n          this.renderColumnHeader(i, sourceCol, TR.childNodes[renderedColumnIndex + this.rowHeaderCount]);\n        }\n      }\n    }\n\n    /**\n     * Adjusts the number of COL elements to match the number of columns that need to be rendered\n     */\n\n  }, {\n    key: 'adjustColGroups',\n    value: function adjustColGroups() {\n      var columnCount = this.wtTable.getRenderedColumnsCount();\n\n      while (this.wtTable.colgroupChildrenLength < columnCount + this.rowHeaderCount) {\n        this.COLGROUP.appendChild(document.createElement('COL'));\n        this.wtTable.colgroupChildrenLength++;\n      }\n      while (this.wtTable.colgroupChildrenLength > columnCount + this.rowHeaderCount) {\n        this.COLGROUP.removeChild(this.COLGROUP.lastChild);\n        this.wtTable.colgroupChildrenLength--;\n      }\n      if (this.rowHeaderCount) {\n        (0, _element.addClass)(this.COLGROUP.childNodes[0], 'rowHeader');\n      }\n    }\n\n    /**\n     * Adjusts the number of TH elements in THEAD to match the number of headers and columns that need to be rendered\n     */\n\n  }, {\n    key: 'adjustThead',\n    value: function adjustThead() {\n      var columnCount = this.wtTable.getRenderedColumnsCount();\n      var TR = this.THEAD.firstChild;\n\n      if (this.columnHeaders.length) {\n        for (var i = 0, len = this.columnHeaders.length; i < len; i++) {\n          TR = this.THEAD.childNodes[i];\n\n          if (!TR) {\n            TR = document.createElement('TR');\n            this.THEAD.appendChild(TR);\n          }\n          this.theadChildrenLength = TR.childNodes.length;\n\n          while (this.theadChildrenLength < columnCount + this.rowHeaderCount) {\n            TR.appendChild(document.createElement('TH'));\n            this.theadChildrenLength++;\n          }\n          while (this.theadChildrenLength > columnCount + this.rowHeaderCount) {\n            TR.removeChild(TR.lastChild);\n            this.theadChildrenLength--;\n          }\n        }\n        var theadChildrenLength = this.THEAD.childNodes.length;\n\n        if (theadChildrenLength > this.columnHeaders.length) {\n          for (var _i2 = this.columnHeaders.length; _i2 < theadChildrenLength; _i2++) {\n            this.THEAD.removeChild(this.THEAD.lastChild);\n          }\n        }\n      } else if (TR) {\n        (0, _element.empty)(TR);\n      }\n    }\n\n    /**\n     * @param {Number} index\n     * @returns {HTMLTableCellElement}\n     */\n\n  }, {\n    key: 'getTrForColumnHeaders',\n    value: function getTrForColumnHeaders(index) {\n      return this.THEAD.childNodes[index];\n    }\n\n    /**\n     * @param {Number} row\n     * @param {Number} col\n     * @param {HTMLTableCellElement} TH\n     * @returns {*}\n     */\n\n  }, {\n    key: 'renderColumnHeader',\n    value: function renderColumnHeader(row, col, TH) {\n      TH.className = '';\n      TH.removeAttribute('style');\n\n      return this.columnHeaders[row](col, TH, row);\n    }\n\n    /**\n     * Add and/or remove the TDs to match the desired number\n     *\n     * @param {HTMLTableCellElement} TR Table row in question\n     * @param {Number} desiredCount The desired number of TDs in the TR\n     */\n\n  }, {\n    key: 'adjustColumns',\n    value: function adjustColumns(TR, desiredCount) {\n      var count = TR.childNodes.length;\n\n      while (count < desiredCount) {\n        var TD = document.createElement('TD');\n\n        TR.appendChild(TD);\n        count++;\n      }\n      while (count > desiredCount) {\n        TR.removeChild(TR.lastChild);\n        count--;\n      }\n    }\n\n    /**\n     * @param {Number} columnsToRender\n     */\n\n  }, {\n    key: 'removeRedundantColumns',\n    value: function removeRedundantColumns(columnsToRender) {\n      while (this.wtTable.tbodyChildrenLength > columnsToRender) {\n        this.TBODY.removeChild(this.TBODY.lastChild);\n        this.wtTable.tbodyChildrenLength--;\n      }\n    }\n  }]);\n\n  return TableRenderer;\n}();\n\nfunction replaceTdWithTh(TD, TR) {\n  var TH = document.createElement('TH');\n\n  TR.insertBefore(TH, TD);\n  TR.removeChild(TD);\n\n  return TH;\n}\n\nfunction replaceThWithTd(TH, TR) {\n  var TD = document.createElement('TD');\n\n  TR.insertBefore(TD, TH);\n  TR.removeChild(TH);\n\n  return TD;\n}\n\nexports.default = TableRenderer;\n\n/***/ }),\n/* 186 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _viewportColumns = __webpack_require__(175);\n\nvar _viewportColumns2 = _interopRequireDefault(_viewportColumns);\n\nvar _viewportRows = __webpack_require__(176);\n\nvar _viewportRows2 = _interopRequireDefault(_viewportRows);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Viewport\n */\nvar Viewport = function () {\n  /**\n   * @param wotInstance\n   */\n  function Viewport(wotInstance) {\n    var _this = this;\n\n    _classCallCheck(this, Viewport);\n\n    this.wot = wotInstance;\n    // legacy support\n    this.instance = this.wot;\n\n    this.oversizedRows = [];\n    this.oversizedColumnHeaders = [];\n    this.hasOversizedColumnHeadersMarked = {};\n    this.clientHeight = 0;\n    this.containerWidth = NaN;\n    this.rowHeaderWidth = NaN;\n    this.rowsVisibleCalculator = null;\n    this.columnsVisibleCalculator = null;\n\n    this.eventManager = new _eventManager2.default(this.wot);\n    this.eventManager.addEventListener(window, 'resize', function () {\n      _this.clientHeight = _this.getWorkspaceHeight();\n    });\n  }\n\n  /**\n   * @returns {number}\n   */\n\n\n  _createClass(Viewport, [{\n    key: 'getWorkspaceHeight',\n    value: function getWorkspaceHeight() {\n      var trimmingContainer = this.instance.wtOverlays.topOverlay.trimmingContainer;\n      var elemHeight = void 0;\n      var height = 0;\n\n      if (trimmingContainer === window) {\n        height = document.documentElement.clientHeight;\n      } else {\n        elemHeight = (0, _element.outerHeight)(trimmingContainer);\n        // returns height without DIV scrollbar\n        height = elemHeight > 0 && trimmingContainer.clientHeight > 0 ? trimmingContainer.clientHeight : Infinity;\n      }\n\n      return height;\n    }\n  }, {\n    key: 'getWorkspaceWidth',\n    value: function getWorkspaceWidth() {\n      var width = void 0;\n      var totalColumns = this.wot.getSetting('totalColumns');\n      var trimmingContainer = this.instance.wtOverlays.leftOverlay.trimmingContainer;\n      var overflow = void 0;\n      var stretchSetting = this.wot.getSetting('stretchH');\n      var docOffsetWidth = document.documentElement.offsetWidth;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (preventOverflow) {\n        return (0, _element.outerWidth)(this.instance.wtTable.wtRootElement);\n      }\n\n      if (this.wot.getSetting('freezeOverlays')) {\n        width = Math.min(docOffsetWidth - this.getWorkspaceOffset().left, docOffsetWidth);\n      } else {\n        width = Math.min(this.getContainerFillWidth(), docOffsetWidth - this.getWorkspaceOffset().left, docOffsetWidth);\n      }\n\n      if (trimmingContainer === window && totalColumns > 0 && this.sumColumnWidths(0, totalColumns - 1) > width) {\n        // in case sum of column widths is higher than available stylesheet width, let's assume using the whole window\n        // otherwise continue below, which will allow stretching\n        // this is used in `scroll_window.html`\n        // TODO test me\n        return document.documentElement.clientWidth;\n      }\n\n      if (trimmingContainer !== window) {\n        overflow = (0, _element.getStyle)(this.instance.wtOverlays.leftOverlay.trimmingContainer, 'overflow');\n\n        if (overflow == 'scroll' || overflow == 'hidden' || overflow == 'auto') {\n          // this is used in `scroll.html`\n          // TODO test me\n          return Math.max(width, trimmingContainer.clientWidth);\n        }\n      }\n\n      if (stretchSetting === 'none' || !stretchSetting) {\n        // if no stretching is used, return the maximum used workspace width\n        return Math.max(width, (0, _element.outerWidth)(this.instance.wtTable.TABLE));\n      }\n\n      // if stretching is used, return the actual container width, so the columns can fit inside it\n      return width;\n    }\n\n    /**\n     * Checks if viewport has vertical scroll\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasVerticalScroll',\n    value: function hasVerticalScroll() {\n      return this.getWorkspaceActualHeight() > this.getWorkspaceHeight();\n    }\n\n    /**\n     * Checks if viewport has horizontal scroll\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasHorizontalScroll',\n    value: function hasHorizontalScroll() {\n      return this.getWorkspaceActualWidth() > this.getWorkspaceWidth();\n    }\n\n    /**\n     * @param from\n     * @param length\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'sumColumnWidths',\n    value: function sumColumnWidths(from, length) {\n      var sum = 0;\n\n      while (from < length) {\n        sum += this.wot.wtTable.getColumnWidth(from);\n        from++;\n      }\n\n      return sum;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getContainerFillWidth',\n    value: function getContainerFillWidth() {\n      if (this.containerWidth) {\n        return this.containerWidth;\n      }\n      var mainContainer = this.instance.wtTable.holder;\n      var fillWidth = void 0;\n      var dummyElement = void 0;\n\n      dummyElement = document.createElement('div');\n      dummyElement.style.width = '100%';\n      dummyElement.style.height = '1px';\n      mainContainer.appendChild(dummyElement);\n      fillWidth = dummyElement.offsetWidth;\n\n      this.containerWidth = fillWidth;\n      mainContainer.removeChild(dummyElement);\n\n      return fillWidth;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getWorkspaceOffset',\n    value: function getWorkspaceOffset() {\n      return (0, _element.offset)(this.wot.wtTable.TABLE);\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getWorkspaceActualHeight',\n    value: function getWorkspaceActualHeight() {\n      return (0, _element.outerHeight)(this.wot.wtTable.TABLE);\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getWorkspaceActualWidth',\n    value: function getWorkspaceActualWidth() {\n      return (0, _element.outerWidth)(this.wot.wtTable.TABLE) || (0, _element.outerWidth)(this.wot.wtTable.TBODY) || (0, _element.outerWidth)(this.wot.wtTable.THEAD); // IE8 reports 0 as <table> offsetWidth;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getColumnHeaderHeight',\n    value: function getColumnHeaderHeight() {\n      if (isNaN(this.columnHeaderHeight)) {\n        this.columnHeaderHeight = (0, _element.outerHeight)(this.wot.wtTable.THEAD);\n      }\n\n      return this.columnHeaderHeight;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getViewportHeight',\n    value: function getViewportHeight() {\n      var containerHeight = this.getWorkspaceHeight();\n      var columnHeaderHeight = void 0;\n\n      if (containerHeight === Infinity) {\n        return containerHeight;\n      }\n      columnHeaderHeight = this.getColumnHeaderHeight();\n\n      if (columnHeaderHeight > 0) {\n        containerHeight -= columnHeaderHeight;\n      }\n\n      return containerHeight;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getRowHeaderWidth',\n    value: function getRowHeaderWidth() {\n      var rowHeadersHeightSetting = this.instance.getSetting('rowHeaderWidth');\n      var rowHeaders = this.instance.getSetting('rowHeaders');\n\n      if (rowHeadersHeightSetting) {\n        this.rowHeaderWidth = 0;\n\n        for (var i = 0, len = rowHeaders.length; i < len; i++) {\n          this.rowHeaderWidth += rowHeadersHeightSetting[i] || rowHeadersHeightSetting;\n        }\n      }\n\n      if (this.wot.cloneSource) {\n        return this.wot.cloneSource.wtViewport.getRowHeaderWidth();\n      }\n\n      if (isNaN(this.rowHeaderWidth)) {\n\n        if (rowHeaders.length) {\n          var TH = this.instance.wtTable.TABLE.querySelector('TH');\n          this.rowHeaderWidth = 0;\n\n          for (var _i = 0, _len = rowHeaders.length; _i < _len; _i++) {\n            if (TH) {\n              this.rowHeaderWidth += (0, _element.outerWidth)(TH);\n              TH = TH.nextSibling;\n            } else {\n              // yes this is a cheat but it worked like that before, just taking assumption from CSS instead of measuring.\n              // TODO: proper fix\n              this.rowHeaderWidth += 50;\n            }\n          }\n        } else {\n          this.rowHeaderWidth = 0;\n        }\n      }\n\n      this.rowHeaderWidth = this.instance.getSetting('onModifyRowHeaderWidth', this.rowHeaderWidth) || this.rowHeaderWidth;\n\n      return this.rowHeaderWidth;\n    }\n\n    /**\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getViewportWidth',\n    value: function getViewportWidth() {\n      var containerWidth = this.getWorkspaceWidth();\n      var rowHeaderWidth = void 0;\n\n      if (containerWidth === Infinity) {\n        return containerWidth;\n      }\n      rowHeaderWidth = this.getRowHeaderWidth();\n\n      if (rowHeaderWidth > 0) {\n        return containerWidth - rowHeaderWidth;\n      }\n\n      return containerWidth;\n    }\n\n    /**\n     * Creates:\n     *  - rowsRenderCalculator (before draw, to qualify rows for rendering)\n     *  - rowsVisibleCalculator (after draw, to measure which rows are actually visible)\n     *\n     * @returns {ViewportRowsCalculator}\n     */\n\n  }, {\n    key: 'createRowsCalculator',\n    value: function createRowsCalculator() {\n      var _this2 = this;\n\n      var visible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      var height = void 0;\n      var pos = void 0;\n      var fixedRowsTop = void 0;\n      var scrollbarHeight = void 0;\n      var fixedRowsBottom = void 0;\n      var fixedRowsHeight = void 0;\n      var totalRows = void 0;\n\n      this.rowHeaderWidth = NaN;\n\n      if (this.wot.wtSettings.settings.renderAllRows && !visible) {\n        height = Infinity;\n      } else {\n        height = this.getViewportHeight();\n      }\n      pos = this.wot.wtOverlays.topOverlay.getScrollPosition() - this.wot.wtOverlays.topOverlay.getTableParentOffset();\n\n      if (pos < 0) {\n        pos = 0;\n      }\n      fixedRowsTop = this.wot.getSetting('fixedRowsTop');\n      fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');\n      totalRows = this.wot.getSetting('totalRows');\n\n      if (fixedRowsTop) {\n        fixedRowsHeight = this.wot.wtOverlays.topOverlay.sumCellSizes(0, fixedRowsTop);\n        pos += fixedRowsHeight;\n        height -= fixedRowsHeight;\n      }\n\n      if (fixedRowsBottom && this.wot.wtOverlays.bottomOverlay.clone) {\n        fixedRowsHeight = this.wot.wtOverlays.bottomOverlay.sumCellSizes(totalRows - fixedRowsBottom, totalRows);\n\n        height -= fixedRowsHeight;\n      }\n\n      if (this.wot.wtTable.holder.clientHeight === this.wot.wtTable.holder.offsetHeight) {\n        scrollbarHeight = 0;\n      } else {\n        scrollbarHeight = (0, _element.getScrollbarWidth)();\n      }\n\n      return new _viewportRows2.default(height, pos, this.wot.getSetting('totalRows'), function (sourceRow) {\n        return _this2.wot.wtTable.getRowHeight(sourceRow);\n      }, visible ? null : this.wot.wtSettings.settings.viewportRowCalculatorOverride, visible, scrollbarHeight);\n    }\n\n    /**\n     * Creates:\n     *  - columnsRenderCalculator (before draw, to qualify columns for rendering)\n     *  - columnsVisibleCalculator (after draw, to measure which columns are actually visible)\n     *\n     * @returns {ViewportRowsCalculator}\n     */\n\n  }, {\n    key: 'createColumnsCalculator',\n    value: function createColumnsCalculator() {\n      var _this3 = this;\n\n      var visible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      var width = this.getViewportWidth();\n      var pos = void 0;\n      var fixedColumnsLeft = void 0;\n\n      this.columnHeaderHeight = NaN;\n\n      pos = this.wot.wtOverlays.leftOverlay.getScrollPosition() - this.wot.wtOverlays.leftOverlay.getTableParentOffset();\n\n      if (pos < 0) {\n        pos = 0;\n      }\n      fixedColumnsLeft = this.wot.getSetting('fixedColumnsLeft');\n\n      if (fixedColumnsLeft) {\n        var fixedColumnsWidth = this.wot.wtOverlays.leftOverlay.sumCellSizes(0, fixedColumnsLeft);\n        pos += fixedColumnsWidth;\n        width -= fixedColumnsWidth;\n      }\n      if (this.wot.wtTable.holder.clientWidth !== this.wot.wtTable.holder.offsetWidth) {\n        width -= (0, _element.getScrollbarWidth)();\n      }\n\n      return new _viewportColumns2.default(width, pos, this.wot.getSetting('totalColumns'), function (sourceCol) {\n        return _this3.wot.wtTable.getColumnWidth(sourceCol);\n      }, visible ? null : this.wot.wtSettings.settings.viewportColumnCalculatorOverride, visible, this.wot.getSetting('stretchH'), function (stretchedWidth, column) {\n        return _this3.wot.getSetting('onBeforeStretchingColumnWidth', stretchedWidth, column);\n      });\n    }\n\n    /**\n     * Creates rowsRenderCalculator and columnsRenderCalculator (before draw, to determine what rows and\n     * cols should be rendered)\n     *\n     * @param fastDraw {Boolean} If `true`, will try to avoid full redraw and only update the border positions.\n     *                           If `false` or `undefined`, will perform a full redraw\n     * @returns fastDraw {Boolean} The fastDraw value, possibly modified\n     */\n\n  }, {\n    key: 'createRenderCalculators',\n    value: function createRenderCalculators() {\n      var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (fastDraw) {\n        var proposedRowsVisibleCalculator = this.createRowsCalculator(true);\n        var proposedColumnsVisibleCalculator = this.createColumnsCalculator(true);\n\n        if (!(this.areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator) && this.areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator))) {\n          fastDraw = false;\n        }\n      }\n\n      if (!fastDraw) {\n        this.rowsRenderCalculator = this.createRowsCalculator();\n        this.columnsRenderCalculator = this.createColumnsCalculator();\n      }\n      // delete temporarily to make sure that renderers always use rowsRenderCalculator, not rowsVisibleCalculator\n      this.rowsVisibleCalculator = null;\n      this.columnsVisibleCalculator = null;\n\n      return fastDraw;\n    }\n\n    /**\n     * Creates rowsVisibleCalculator and columnsVisibleCalculator (after draw, to determine what are\n     * the actually visible rows and columns)\n     */\n\n  }, {\n    key: 'createVisibleCalculators',\n    value: function createVisibleCalculators() {\n      this.rowsVisibleCalculator = this.createRowsCalculator(true);\n      this.columnsVisibleCalculator = this.createColumnsCalculator(true);\n    }\n\n    /**\n     * Returns information whether proposedRowsVisibleCalculator viewport\n     * is contained inside rows rendered in previous draw (cached in rowsRenderCalculator)\n     *\n     * @param {Object} proposedRowsVisibleCalculator\n     * @returns {Boolean} Returns `true` if all proposed visible rows are already rendered (meaning: redraw is not needed).\n     *                    Returns `false` if at least one proposed visible row is not already rendered (meaning: redraw is needed)\n     */\n\n  }, {\n    key: 'areAllProposedVisibleRowsAlreadyRendered',\n    value: function areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator) {\n      if (this.rowsVisibleCalculator) {\n        if (proposedRowsVisibleCalculator.startRow < this.rowsRenderCalculator.startRow || proposedRowsVisibleCalculator.startRow === this.rowsRenderCalculator.startRow && proposedRowsVisibleCalculator.startRow > 0) {\n          return false;\n        } else if (proposedRowsVisibleCalculator.endRow > this.rowsRenderCalculator.endRow || proposedRowsVisibleCalculator.endRow === this.rowsRenderCalculator.endRow && proposedRowsVisibleCalculator.endRow < this.wot.getSetting('totalRows') - 1) {\n          return false;\n        }\n        return true;\n      }\n\n      return false;\n    }\n\n    /**\n     * Returns information whether proposedColumnsVisibleCalculator viewport\n     * is contained inside column rendered in previous draw (cached in columnsRenderCalculator)\n     *\n     * @param {Object} proposedColumnsVisibleCalculator\n     * @returns {Boolean} Returns `true` if all proposed visible columns are already rendered (meaning: redraw is not needed).\n     *                    Returns `false` if at least one proposed visible column is not already rendered (meaning: redraw is needed)\n     */\n\n  }, {\n    key: 'areAllProposedVisibleColumnsAlreadyRendered',\n    value: function areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator) {\n      if (this.columnsVisibleCalculator) {\n        if (proposedColumnsVisibleCalculator.startColumn < this.columnsRenderCalculator.startColumn || proposedColumnsVisibleCalculator.startColumn === this.columnsRenderCalculator.startColumn && proposedColumnsVisibleCalculator.startColumn > 0) {\n          return false;\n        } else if (proposedColumnsVisibleCalculator.endColumn > this.columnsRenderCalculator.endColumn || proposedColumnsVisibleCalculator.endColumn === this.columnsRenderCalculator.endColumn && proposedColumnsVisibleCalculator.endColumn < this.wot.getSetting('totalColumns') - 1) {\n          return false;\n        }\n        return true;\n      }\n\n      return false;\n    }\n\n    /**\n     * Resets values in keys of the hasOversizedColumnHeadersMarked object after updateSettings.\n     */\n\n  }, {\n    key: 'resetHasOversizedColumnHeadersMarked',\n    value: function resetHasOversizedColumnHeadersMarked() {\n      (0, _object.objectEach)(this.hasOversizedColumnHeadersMarked, function (value, key, object) {\n        object[key] = void 0;\n      });\n    }\n  }]);\n\n  return Viewport;\n}();\n\nexports.default = Viewport;\n\n/***/ }),\n/* 187 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _event = __webpack_require__(12);\n\nvar _object = __webpack_require__(2);\n\nvar _browser = __webpack_require__(27);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _coords = __webpack_require__(54);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n *\n */\nvar Border = function () {\n  /**\n   * @param {Walkontable} wotInstance\n   * @param {Object} settings\n   */\n  function Border(wotInstance, settings) {\n    _classCallCheck(this, Border);\n\n    if (!settings) {\n      return;\n    }\n    this.eventManager = new _eventManager2.default(wotInstance);\n    this.instance = wotInstance;\n    this.wot = wotInstance;\n    this.settings = settings;\n    this.mouseDown = false;\n    this.main = null;\n\n    this.top = null;\n    this.left = null;\n    this.bottom = null;\n    this.right = null;\n\n    this.topStyle = null;\n    this.leftStyle = null;\n    this.bottomStyle = null;\n    this.rightStyle = null;\n\n    this.cornerDefaultStyle = {\n      width: '6px',\n      height: '6px',\n      borderWidth: '1px',\n      borderStyle: 'solid',\n      borderColor: '#FFF'\n    };\n    this.corner = null;\n    this.cornerStyle = null;\n\n    this.createBorders(settings);\n    this.registerListeners();\n  }\n\n  /**\n   * Register all necessary events\n   */\n\n\n  _createClass(Border, [{\n    key: 'registerListeners',\n    value: function registerListeners() {\n      var _this2 = this;\n\n      this.eventManager.addEventListener(document.body, 'mousedown', function () {\n        return _this2.onMouseDown();\n      });\n      this.eventManager.addEventListener(document.body, 'mouseup', function () {\n        return _this2.onMouseUp();\n      });\n\n      var _loop = function _loop(c, len) {\n        _this2.eventManager.addEventListener(_this2.main.childNodes[c], 'mouseenter', function (event) {\n          return _this2.onMouseEnter(event, _this2.main.childNodes[c]);\n        });\n      };\n\n      for (var c = 0, len = this.main.childNodes.length; c < len; c++) {\n        _loop(c, len);\n      }\n    }\n\n    /**\n     * Mouse down listener\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseDown',\n    value: function onMouseDown() {\n      this.mouseDown = true;\n    }\n\n    /**\n     * Mouse up listener\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      this.mouseDown = false;\n    }\n\n    /**\n     * Mouse enter listener for fragment selection functionality.\n     *\n     * @private\n     * @param {Event} event Dom event\n     * @param {HTMLElement} parentElement Part of border element.\n     */\n\n  }, {\n    key: 'onMouseEnter',\n    value: function onMouseEnter(event, parentElement) {\n      if (!this.mouseDown || !this.wot.getSetting('hideBorderOnMouseDownOver')) {\n        return;\n      }\n      event.preventDefault();\n      (0, _event.stopImmediatePropagation)(event);\n\n      var _this = this;\n      var bounds = parentElement.getBoundingClientRect();\n      // Hide border to prevents selection jumping when fragmentSelection is enabled.\n      parentElement.style.display = 'none';\n\n      function isOutside(event) {\n        if (event.clientY < Math.floor(bounds.top)) {\n          return true;\n        }\n        if (event.clientY > Math.ceil(bounds.top + bounds.height)) {\n          return true;\n        }\n        if (event.clientX < Math.floor(bounds.left)) {\n          return true;\n        }\n        if (event.clientX > Math.ceil(bounds.left + bounds.width)) {\n          return true;\n        }\n      }\n\n      function handler(event) {\n        if (isOutside(event)) {\n          _this.eventManager.removeEventListener(document.body, 'mousemove', handler);\n          parentElement.style.display = 'block';\n        }\n      }\n\n      this.eventManager.addEventListener(document.body, 'mousemove', handler);\n    }\n\n    /**\n     * Create border elements\n     *\n     * @param {Object} settings\n     */\n\n  }, {\n    key: 'createBorders',\n    value: function createBorders(settings) {\n      this.main = document.createElement('div');\n\n      var borderDivs = ['top', 'left', 'bottom', 'right', 'corner'];\n      var style = this.main.style;\n      style.position = 'absolute';\n      style.top = 0;\n      style.left = 0;\n\n      for (var i = 0; i < 5; i++) {\n        var position = borderDivs[i];\n        var div = document.createElement('div');\n        div.className = 'wtBorder ' + (this.settings.className || ''); // + borderDivs[i];\n\n        if (this.settings[position] && this.settings[position].hide) {\n          div.className += ' hidden';\n        }\n        style = div.style;\n        style.backgroundColor = this.settings[position] && this.settings[position].color ? this.settings[position].color : settings.border.color;\n        style.height = this.settings[position] && this.settings[position].width ? this.settings[position].width + 'px' : settings.border.width + 'px';\n        style.width = this.settings[position] && this.settings[position].width ? this.settings[position].width + 'px' : settings.border.width + 'px';\n\n        this.main.appendChild(div);\n      }\n      this.top = this.main.childNodes[0];\n      this.left = this.main.childNodes[1];\n      this.bottom = this.main.childNodes[2];\n      this.right = this.main.childNodes[3];\n\n      this.topStyle = this.top.style;\n      this.leftStyle = this.left.style;\n      this.bottomStyle = this.bottom.style;\n      this.rightStyle = this.right.style;\n\n      this.corner = this.main.childNodes[4];\n      this.corner.className += ' corner';\n      this.cornerStyle = this.corner.style;\n      this.cornerStyle.width = this.cornerDefaultStyle.width;\n      this.cornerStyle.height = this.cornerDefaultStyle.height;\n      this.cornerStyle.border = [this.cornerDefaultStyle.borderWidth, this.cornerDefaultStyle.borderStyle, this.cornerDefaultStyle.borderColor].join(' ');\n\n      if ((0, _browser.isMobileBrowser)()) {\n        this.createMultipleSelectorHandles();\n      }\n      this.disappear();\n\n      if (!this.wot.wtTable.bordersHolder) {\n        this.wot.wtTable.bordersHolder = document.createElement('div');\n        this.wot.wtTable.bordersHolder.className = 'htBorders';\n        this.wot.wtTable.spreader.appendChild(this.wot.wtTable.bordersHolder);\n      }\n      this.wot.wtTable.bordersHolder.insertBefore(this.main, this.wot.wtTable.bordersHolder.firstChild);\n    }\n\n    /**\n     * Create multiple selector handler for mobile devices\n     */\n\n  }, {\n    key: 'createMultipleSelectorHandles',\n    value: function createMultipleSelectorHandles() {\n      this.selectionHandles = {\n        topLeft: document.createElement('DIV'),\n        topLeftHitArea: document.createElement('DIV'),\n        bottomRight: document.createElement('DIV'),\n        bottomRightHitArea: document.createElement('DIV')\n      };\n      var width = 10;\n      var hitAreaWidth = 40;\n\n      this.selectionHandles.topLeft.className = 'topLeftSelectionHandle';\n      this.selectionHandles.topLeftHitArea.className = 'topLeftSelectionHandle-HitArea';\n      this.selectionHandles.bottomRight.className = 'bottomRightSelectionHandle';\n      this.selectionHandles.bottomRightHitArea.className = 'bottomRightSelectionHandle-HitArea';\n\n      this.selectionHandles.styles = {\n        topLeft: this.selectionHandles.topLeft.style,\n        topLeftHitArea: this.selectionHandles.topLeftHitArea.style,\n        bottomRight: this.selectionHandles.bottomRight.style,\n        bottomRightHitArea: this.selectionHandles.bottomRightHitArea.style\n      };\n\n      var hitAreaStyle = {\n        position: 'absolute',\n        height: hitAreaWidth + 'px',\n        width: hitAreaWidth + 'px',\n        'border-radius': parseInt(hitAreaWidth / 1.5, 10) + 'px'\n      };\n\n      for (var prop in hitAreaStyle) {\n        if ((0, _object.hasOwnProperty)(hitAreaStyle, prop)) {\n          this.selectionHandles.styles.bottomRightHitArea[prop] = hitAreaStyle[prop];\n          this.selectionHandles.styles.topLeftHitArea[prop] = hitAreaStyle[prop];\n        }\n      }\n\n      var handleStyle = {\n        position: 'absolute',\n        height: width + 'px',\n        width: width + 'px',\n        'border-radius': parseInt(width / 1.5, 10) + 'px',\n        background: '#F5F5FF',\n        border: '1px solid #4285c8'\n      };\n\n      for (var _prop in handleStyle) {\n        if ((0, _object.hasOwnProperty)(handleStyle, _prop)) {\n          this.selectionHandles.styles.bottomRight[_prop] = handleStyle[_prop];\n          this.selectionHandles.styles.topLeft[_prop] = handleStyle[_prop];\n        }\n      }\n      this.main.appendChild(this.selectionHandles.topLeft);\n      this.main.appendChild(this.selectionHandles.bottomRight);\n      this.main.appendChild(this.selectionHandles.topLeftHitArea);\n      this.main.appendChild(this.selectionHandles.bottomRightHitArea);\n    }\n  }, {\n    key: 'isPartRange',\n    value: function isPartRange(row, col) {\n      var areaSelection = this.wot.selections.createOrGetArea();\n\n      if (areaSelection.cellRange) {\n        if (row != areaSelection.cellRange.to.row || col != areaSelection.cellRange.to.col) {\n          return true;\n        }\n      }\n\n      return false;\n    }\n  }, {\n    key: 'updateMultipleSelectionHandlesPosition',\n    value: function updateMultipleSelectionHandlesPosition(row, col, top, left, width, height) {\n      var handleWidth = parseInt(this.selectionHandles.styles.topLeft.width, 10);\n      var hitAreaWidth = parseInt(this.selectionHandles.styles.topLeftHitArea.width, 10);\n\n      this.selectionHandles.styles.topLeft.top = parseInt(top - handleWidth, 10) + 'px';\n      this.selectionHandles.styles.topLeft.left = parseInt(left - handleWidth, 10) + 'px';\n\n      this.selectionHandles.styles.topLeftHitArea.top = parseInt(top - hitAreaWidth / 4 * 3, 10) + 'px';\n      this.selectionHandles.styles.topLeftHitArea.left = parseInt(left - hitAreaWidth / 4 * 3, 10) + 'px';\n\n      this.selectionHandles.styles.bottomRight.top = parseInt(top + height, 10) + 'px';\n      this.selectionHandles.styles.bottomRight.left = parseInt(left + width, 10) + 'px';\n\n      this.selectionHandles.styles.bottomRightHitArea.top = parseInt(top + height - hitAreaWidth / 4, 10) + 'px';\n      this.selectionHandles.styles.bottomRightHitArea.left = parseInt(left + width - hitAreaWidth / 4, 10) + 'px';\n\n      if (this.settings.border.cornerVisible && this.settings.border.cornerVisible()) {\n        this.selectionHandles.styles.topLeft.display = 'block';\n        this.selectionHandles.styles.topLeftHitArea.display = 'block';\n\n        if (this.isPartRange(row, col)) {\n          this.selectionHandles.styles.bottomRight.display = 'none';\n          this.selectionHandles.styles.bottomRightHitArea.display = 'none';\n        } else {\n          this.selectionHandles.styles.bottomRight.display = 'block';\n          this.selectionHandles.styles.bottomRightHitArea.display = 'block';\n        }\n      } else {\n        this.selectionHandles.styles.topLeft.display = 'none';\n        this.selectionHandles.styles.bottomRight.display = 'none';\n        this.selectionHandles.styles.topLeftHitArea.display = 'none';\n        this.selectionHandles.styles.bottomRightHitArea.display = 'none';\n      }\n\n      if (row == this.wot.wtSettings.getSetting('fixedRowsTop') || col == this.wot.wtSettings.getSetting('fixedColumnsLeft')) {\n        this.selectionHandles.styles.topLeft.zIndex = '9999';\n        this.selectionHandles.styles.topLeftHitArea.zIndex = '9999';\n      } else {\n        this.selectionHandles.styles.topLeft.zIndex = '';\n        this.selectionHandles.styles.topLeftHitArea.zIndex = '';\n      }\n    }\n\n    /**\n     * Show border around one or many cells\n     *\n     * @param {Array} corners\n     */\n\n  }, {\n    key: 'appear',\n    value: function appear(corners) {\n      if (this.disabled) {\n        return;\n      }\n\n      var fromRow = void 0;\n      var toRow = void 0;\n      var fromColumn = void 0;\n      var toColumn = void 0;\n\n      var rowsCount = this.wot.wtTable.getRenderedRowsCount();\n\n      for (var i = 0; i < rowsCount; i += 1) {\n        var s = this.wot.wtTable.rowFilter.renderedToSource(i);\n\n        if (s >= corners[0] && s <= corners[2]) {\n          fromRow = s;\n          break;\n        }\n      }\n\n      for (var _i = rowsCount - 1; _i >= 0; _i -= 1) {\n        var _s = this.wot.wtTable.rowFilter.renderedToSource(_i);\n\n        if (_s >= corners[0] && _s <= corners[2]) {\n          toRow = _s;\n          break;\n        }\n      }\n\n      var columnsCount = this.wot.wtTable.getRenderedColumnsCount();\n\n      for (var _i2 = 0; _i2 < columnsCount; _i2 += 1) {\n        var _s2 = this.wot.wtTable.columnFilter.renderedToSource(_i2);\n\n        if (_s2 >= corners[1] && _s2 <= corners[3]) {\n          fromColumn = _s2;\n          break;\n        }\n      }\n\n      for (var _i3 = columnsCount - 1; _i3 >= 0; _i3 -= 1) {\n        var _s3 = this.wot.wtTable.columnFilter.renderedToSource(_i3);\n\n        if (_s3 >= corners[1] && _s3 <= corners[3]) {\n          toColumn = _s3;\n          break;\n        }\n      }\n      if (fromRow === void 0 || fromColumn === void 0) {\n        this.disappear();\n\n        return;\n      }\n      var fromTD = this.wot.wtTable.getCell(new _coords2.default(fromRow, fromColumn));\n      var isMultiple = fromRow !== toRow || fromColumn !== toColumn;\n      var toTD = isMultiple ? this.wot.wtTable.getCell(new _coords2.default(toRow, toColumn)) : fromTD;\n      var fromOffset = (0, _element.offset)(fromTD);\n      var toOffset = isMultiple ? (0, _element.offset)(toTD) : fromOffset;\n      var containerOffset = (0, _element.offset)(this.wot.wtTable.TABLE);\n      var minTop = fromOffset.top;\n      var minLeft = fromOffset.left;\n\n      var left = minLeft - containerOffset.left - 1;\n      var width = toOffset.left + (0, _element.outerWidth)(toTD) - minLeft;\n\n      if (this.isEntireColumnSelected(fromRow, toRow)) {\n        var modifiedValues = this.getDimensionsFromHeader('columns', fromColumn, toColumn, containerOffset);\n        var fromTH = null;\n\n        if (modifiedValues) {\n          var _modifiedValues = _slicedToArray(modifiedValues, 3);\n\n          fromTH = _modifiedValues[0];\n          left = _modifiedValues[1];\n          width = _modifiedValues[2];\n        }\n\n        if (fromTH) {\n          fromTD = fromTH;\n        }\n      }\n\n      var top = minTop - containerOffset.top - 1;\n      var height = toOffset.top + (0, _element.outerHeight)(toTD) - minTop;\n\n      if (this.isEntireRowSelected(fromColumn, toColumn)) {\n        var _modifiedValues2 = this.getDimensionsFromHeader('rows', fromRow, toRow, containerOffset);\n        var _fromTH = null;\n\n        if (_modifiedValues2) {\n          var _modifiedValues3 = _slicedToArray(_modifiedValues2, 3);\n\n          _fromTH = _modifiedValues3[0];\n          top = _modifiedValues3[1];\n          height = _modifiedValues3[2];\n        }\n\n        if (_fromTH) {\n          fromTD = _fromTH;\n        }\n      }\n\n      var style = (0, _element.getComputedStyle)(fromTD);\n\n      if (parseInt(style.borderTopWidth, 10) > 0) {\n        top += 1;\n        height = height > 0 ? height - 1 : 0;\n      }\n      if (parseInt(style.borderLeftWidth, 10) > 0) {\n        left += 1;\n        width = width > 0 ? width - 1 : 0;\n      }\n\n      this.topStyle.top = top + 'px';\n      this.topStyle.left = left + 'px';\n      this.topStyle.width = width + 'px';\n      this.topStyle.display = 'block';\n\n      this.leftStyle.top = top + 'px';\n      this.leftStyle.left = left + 'px';\n      this.leftStyle.height = height + 'px';\n      this.leftStyle.display = 'block';\n\n      var delta = Math.floor(this.settings.border.width / 2);\n\n      this.bottomStyle.top = top + height - delta + 'px';\n      this.bottomStyle.left = left + 'px';\n      this.bottomStyle.width = width + 'px';\n      this.bottomStyle.display = 'block';\n\n      this.rightStyle.top = top + 'px';\n      this.rightStyle.left = left + width - delta + 'px';\n      this.rightStyle.height = height + 1 + 'px';\n      this.rightStyle.display = 'block';\n\n      var cornerVisibleSetting = this.settings.border.cornerVisible;\n      cornerVisibleSetting = typeof cornerVisibleSetting === 'function' ? cornerVisibleSetting(this.settings.layerLevel) : cornerVisibleSetting;\n\n      var hookResult = this.wot.getSetting('onModifyGetCellCoords', toRow, toColumn);\n      var checkRow = toRow,\n          checkCol = toColumn;\n\n\n      if (hookResult && Array.isArray(hookResult)) {\n        var _hookResult = _slicedToArray(hookResult, 4);\n\n        checkRow = _hookResult[2];\n        checkCol = _hookResult[3];\n      }\n\n      if ((0, _browser.isMobileBrowser)() || !cornerVisibleSetting || this.isPartRange(checkRow, checkCol)) {\n        this.cornerStyle.display = 'none';\n      } else {\n        this.cornerStyle.top = top + height - 4 + 'px';\n        this.cornerStyle.left = left + width - 4 + 'px';\n        this.cornerStyle.borderRightWidth = this.cornerDefaultStyle.borderWidth;\n        this.cornerStyle.width = this.cornerDefaultStyle.width;\n\n        // Hide the fill handle, so the possible further adjustments won't force unneeded scrollbars.\n        this.cornerStyle.display = 'none';\n\n        var trimmingContainer = (0, _element.getTrimmingContainer)(this.wot.wtTable.TABLE);\n\n        if (toColumn === this.wot.getSetting('totalColumns') - 1) {\n          var cornerOverlappingContainer = toTD.offsetLeft + (0, _element.outerWidth)(toTD) + parseInt(this.cornerDefaultStyle.width, 10) / 2 >= (0, _element.innerWidth)(trimmingContainer);\n\n          if (cornerOverlappingContainer) {\n            this.cornerStyle.left = Math.floor(left + width - 3 - parseInt(this.cornerDefaultStyle.width, 10) / 2) + 'px';\n            this.cornerStyle.borderRightWidth = 0;\n          }\n        }\n\n        if (toRow === this.wot.getSetting('totalRows') - 1) {\n          var _cornerOverlappingContainer = toTD.offsetTop + (0, _element.outerHeight)(toTD) + parseInt(this.cornerDefaultStyle.height, 10) / 2 >= (0, _element.innerHeight)(trimmingContainer);\n\n          if (_cornerOverlappingContainer) {\n            this.cornerStyle.top = Math.floor(top + height - 3 - parseInt(this.cornerDefaultStyle.height, 10) / 2) + 'px';\n            this.cornerStyle.borderBottomWidth = 0;\n          }\n        }\n\n        this.cornerStyle.display = 'block';\n      }\n\n      if ((0, _browser.isMobileBrowser)()) {\n        this.updateMultipleSelectionHandlesPosition(toRow, toColumn, top, left, width, height);\n      }\n    }\n\n    /**\n     * Check whether an entire column of cells is selected.\n     *\n     * @private\n     * @param {Number} startRowIndex Start row index.\n     * @param {Number} endRowIndex End row index.\n     */\n\n  }, {\n    key: 'isEntireColumnSelected',\n    value: function isEntireColumnSelected(startRowIndex, endRowIndex) {\n      return startRowIndex === this.wot.wtTable.getFirstRenderedRow() && endRowIndex === this.wot.wtTable.getLastRenderedRow();\n    }\n\n    /**\n     * Check whether an entire row of cells is selected.\n     *\n     * @private\n     * @param {Number} startColumnIndex Start column index.\n     * @param {Number} endColumnIndex End column index.\n     */\n\n  }, {\n    key: 'isEntireRowSelected',\n    value: function isEntireRowSelected(startColumnIndex, endColumnIndex) {\n      return startColumnIndex === this.wot.wtTable.getFirstRenderedColumn() && endColumnIndex === this.wot.wtTable.getLastRenderedColumn();\n    }\n\n    /**\n     * Get left/top index and width/height depending on the `direction` provided.\n     *\n     * @private\n     * @param {String} direction `rows` or `columns`, defines if an entire column or row is selected.\n     * @param {Number} fromIndex Start index of the selection.\n     * @param {Number} toIndex End index of the selection.\n     * @param {Number} containerOffset offset of the container.\n     * @return {Array|Boolean} Returns an array of [headerElement, left, width] or [headerElement, top, height], depending on `direction` (`false` in case of an error getting the headers).\n     */\n\n  }, {\n    key: 'getDimensionsFromHeader',\n    value: function getDimensionsFromHeader(direction, fromIndex, toIndex, containerOffset) {\n      var _this3 = this;\n\n      var rootHotElement = this.wot.wtTable.wtRootElement.parentNode;\n      var getHeaderFn = null;\n      var dimensionFn = null;\n      var entireSelectionClassname = null;\n      var index = null;\n      var dimension = null;\n      var dimensionProperty = null;\n      var startHeader = null;\n      var endHeader = null;\n\n      switch (direction) {\n        case 'rows':\n          getHeaderFn = function getHeaderFn() {\n            var _wot$wtTable;\n\n            return (_wot$wtTable = _this3.wot.wtTable).getRowHeader.apply(_wot$wtTable, arguments);\n          };\n          dimensionFn = function dimensionFn() {\n            return _element.outerHeight.apply(undefined, arguments);\n          };\n          entireSelectionClassname = 'ht__selection--rows';\n          dimensionProperty = 'top';\n\n          break;\n\n        case 'columns':\n          getHeaderFn = function getHeaderFn() {\n            var _wot$wtTable2;\n\n            return (_wot$wtTable2 = _this3.wot.wtTable).getColumnHeader.apply(_wot$wtTable2, arguments);\n          };\n          dimensionFn = function dimensionFn() {\n            return _element.outerWidth.apply(undefined, arguments);\n          };\n          entireSelectionClassname = 'ht__selection--columns';\n          dimensionProperty = 'left';\n          break;\n        default:\n      }\n\n      if (rootHotElement.className.includes(entireSelectionClassname)) {\n        var columnHeaderLevelCount = this.wot.getSetting('columnHeaders').length;\n\n        startHeader = getHeaderFn(fromIndex, columnHeaderLevelCount - 1);\n        endHeader = getHeaderFn(toIndex, columnHeaderLevelCount - 1);\n\n        if (!startHeader || !endHeader) {\n          return false;\n        }\n\n        var startHeaderOffset = (0, _element.offset)(startHeader);\n        var endOffset = (0, _element.offset)(endHeader);\n\n        if (startHeader && endHeader) {\n          index = startHeaderOffset[dimensionProperty] - containerOffset[dimensionProperty] - 1;\n          dimension = endOffset[dimensionProperty] + dimensionFn(endHeader) - startHeaderOffset[dimensionProperty];\n        }\n\n        return [startHeader, index, dimension];\n      }\n\n      return false;\n    }\n\n    /**\n     * Hide border\n     */\n\n  }, {\n    key: 'disappear',\n    value: function disappear() {\n      this.topStyle.display = 'none';\n      this.leftStyle.display = 'none';\n      this.bottomStyle.display = 'none';\n      this.rightStyle.display = 'none';\n      this.cornerStyle.display = 'none';\n\n      if ((0, _browser.isMobileBrowser)()) {\n        this.selectionHandles.styles.topLeft.display = 'none';\n        this.selectionHandles.styles.bottomRight.display = 'none';\n      }\n    }\n  }]);\n\n  return Border;\n}();\n\nexports.default = Border;\n\n/***/ }),\n/* 188 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _unicode = __webpack_require__(21);\n\nvar _mixed = __webpack_require__(16);\n\nvar _string = __webpack_require__(36);\n\nvar _array = __webpack_require__(1);\n\nvar _element = __webpack_require__(0);\n\nvar _handsontableEditor = __webpack_require__(189);\n\nvar _handsontableEditor2 = _interopRequireDefault(_handsontableEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar AutocompleteEditor = _handsontableEditor2.default.prototype.extend();\n\n/**\n * @private\n * @editor AutocompleteEditor\n * @class AutocompleteEditor\n * @dependencies HandsontableEditor\n */\nAutocompleteEditor.prototype.init = function () {\n  _handsontableEditor2.default.prototype.init.apply(this, arguments);\n  this.query = null;\n  this.strippedChoices = [];\n  this.rawChoices = [];\n};\n\nAutocompleteEditor.prototype.getValue = function () {\n  var _this2 = this;\n\n  var selectedValue = this.rawChoices.find(function (value) {\n    var strippedValue = _this2.stripValueIfNeeded(value);\n\n    return strippedValue === _this2.TEXTAREA.value;\n  });\n\n  if ((0, _mixed.isDefined)(selectedValue)) {\n    return selectedValue;\n  }\n\n  return this.TEXTAREA.value;\n};\n\nAutocompleteEditor.prototype.createElements = function () {\n  _handsontableEditor2.default.prototype.createElements.apply(this, arguments);\n\n  (0, _element.addClass)(this.htContainer, 'autocompleteEditor');\n  (0, _element.addClass)(this.htContainer, window.navigator.platform.indexOf('Mac') === -1 ? '' : 'htMacScroll');\n};\n\nvar skipOne = false;\nfunction onBeforeKeyDown(event) {\n  skipOne = false;\n  var editor = this.getActiveEditor();\n\n  if ((0, _unicode.isPrintableChar)(event.keyCode) || event.keyCode === _unicode.KEY_CODES.BACKSPACE || event.keyCode === _unicode.KEY_CODES.DELETE || event.keyCode === _unicode.KEY_CODES.INSERT) {\n    var timeOffset = 0;\n\n    // on ctl+c / cmd+c don't update suggestion list\n    if (event.keyCode === _unicode.KEY_CODES.C && (event.ctrlKey || event.metaKey)) {\n      return;\n    }\n    if (!editor.isOpened()) {\n      timeOffset += 10;\n    }\n\n    if (editor.htEditor) {\n      editor.instance._registerTimeout(setTimeout(function () {\n        editor.queryChoices(editor.TEXTAREA.value);\n        skipOne = true;\n      }, timeOffset));\n    }\n  }\n}\n\nAutocompleteEditor.prototype.prepare = function () {\n  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);\n  _handsontableEditor2.default.prototype.prepare.apply(this, arguments);\n};\n\nAutocompleteEditor.prototype.open = function () {\n  // Ugly fix for handsontable which grab window object for autocomplete scroll listener instead table element.\n  this.TEXTAREA_PARENT.style.overflow = 'auto';\n  _handsontableEditor2.default.prototype.open.apply(this, arguments);\n  this.TEXTAREA_PARENT.style.overflow = '';\n\n  var choicesListHot = this.htEditor.getInstance();\n  var _this = this;\n  var trimDropdown = this.cellProperties.trimDropdown === void 0 ? true : this.cellProperties.trimDropdown;\n\n  this.TEXTAREA.style.visibility = 'visible';\n  this.focus();\n\n  choicesListHot.updateSettings({\n    colWidths: trimDropdown ? [(0, _element.outerWidth)(this.TEXTAREA) - 2] : void 0,\n    width: trimDropdown ? (0, _element.outerWidth)(this.TEXTAREA) + (0, _element.getScrollbarWidth)() + 2 : void 0,\n    afterRenderer: function afterRenderer(TD, row, col, prop, value, cellProperties) {\n      var _this$cellProperties = _this.cellProperties,\n          filteringCaseSensitive = _this$cellProperties.filteringCaseSensitive,\n          allowHtml = _this$cellProperties.allowHtml;\n\n      var indexOfMatch = void 0;\n      var match = void 0;\n\n      value = (0, _mixed.stringify)(value);\n\n      if (value && !allowHtml) {\n        indexOfMatch = filteringCaseSensitive === true ? value.indexOf(this.query) : value.toLowerCase().indexOf(_this.query.toLowerCase());\n\n        if (indexOfMatch !== -1) {\n          match = value.substr(indexOfMatch, _this.query.length);\n          value = value.replace(match, '<strong>' + match + '</strong>');\n        }\n      }\n      TD.innerHTML = value;\n    },\n\n    autoColumnSize: true,\n    modifyColWidth: function modifyColWidth(width, col) {\n      // workaround for <strong> text overlapping the dropdown, not really accurate\n      var autoWidths = this.getPlugin('autoColumnSize').widths;\n\n      if (autoWidths[col]) {\n        width = autoWidths[col];\n      }\n\n      return trimDropdown ? width : width + 15;\n    }\n  });\n\n  // Add additional space for autocomplete holder\n  this.htEditor.view.wt.wtTable.holder.parentNode.style['padding-right'] = (0, _element.getScrollbarWidth)() + 2 + 'px';\n\n  if (skipOne) {\n    skipOne = false;\n  }\n\n  _this.instance._registerTimeout(setTimeout(function () {\n    _this.queryChoices(_this.TEXTAREA.value);\n  }, 0));\n};\n\nAutocompleteEditor.prototype.close = function () {\n  _handsontableEditor2.default.prototype.close.apply(this, arguments);\n};\nAutocompleteEditor.prototype.queryChoices = function (query) {\n  var _this3 = this;\n\n  this.query = query;\n  var source = this.cellProperties.source;\n\n  if (typeof source == 'function') {\n    source.call(this.cellProperties, query, function (choices) {\n      _this3.rawChoices = choices;\n      _this3.updateChoicesList(_this3.stripValuesIfNeeded(choices));\n    });\n  } else if (Array.isArray(source)) {\n    this.rawChoices = source;\n    this.updateChoicesList(this.stripValuesIfNeeded(source));\n  } else {\n    this.updateChoicesList([]);\n  }\n};\n\nAutocompleteEditor.prototype.updateChoicesList = function (choices) {\n  var pos = (0, _element.getCaretPosition)(this.TEXTAREA);\n  var endPos = (0, _element.getSelectionEndPosition)(this.TEXTAREA);\n  var sortByRelevanceSetting = this.cellProperties.sortByRelevance;\n  var filterSetting = this.cellProperties.filter;\n  var orderByRelevance = null;\n  var highlightIndex = null;\n\n  if (sortByRelevanceSetting) {\n    orderByRelevance = AutocompleteEditor.sortByRelevance(this.stripValueIfNeeded(this.getValue()), choices, this.cellProperties.filteringCaseSensitive);\n  }\n  var orderByRelevanceLength = Array.isArray(orderByRelevance) ? orderByRelevance.length : 0;\n\n  if (filterSetting === false) {\n    if (orderByRelevanceLength) {\n      highlightIndex = orderByRelevance[0];\n    }\n  } else {\n    var sorted = [];\n\n    for (var i = 0, choicesCount = choices.length; i < choicesCount; i++) {\n      if (sortByRelevanceSetting && orderByRelevanceLength <= i) {\n        break;\n      }\n      if (orderByRelevanceLength) {\n        sorted.push(choices[orderByRelevance[i]]);\n      } else {\n        sorted.push(choices[i]);\n      }\n    }\n\n    highlightIndex = 0;\n    choices = sorted;\n  }\n\n  this.strippedChoices = choices;\n  this.htEditor.loadData((0, _array.pivot)([choices]));\n\n  this.updateDropdownHeight();\n\n  this.flipDropdownIfNeeded();\n\n  if (this.cellProperties.strict === true) {\n    this.highlightBestMatchingChoice(highlightIndex);\n  }\n\n  this.instance.listen(false);\n\n  (0, _element.setCaretPosition)(this.TEXTAREA, pos, pos === endPos ? void 0 : endPos);\n};\n\nAutocompleteEditor.prototype.flipDropdownIfNeeded = function () {\n  var textareaOffset = (0, _element.offset)(this.TEXTAREA);\n  var textareaHeight = (0, _element.outerHeight)(this.TEXTAREA);\n  var dropdownHeight = this.getDropdownHeight();\n  var trimmingContainer = (0, _element.getTrimmingContainer)(this.instance.view.wt.wtTable.TABLE);\n  var trimmingContainerScrollTop = trimmingContainer.scrollTop;\n  var headersHeight = (0, _element.outerHeight)(this.instance.view.wt.wtTable.THEAD);\n  var containerOffset = {\n    row: 0,\n    col: 0\n  };\n\n  if (trimmingContainer !== window) {\n    containerOffset = (0, _element.offset)(trimmingContainer);\n  }\n\n  var spaceAbove = textareaOffset.top - containerOffset.top - headersHeight + trimmingContainerScrollTop;\n  var spaceBelow = trimmingContainer.scrollHeight - spaceAbove - headersHeight - textareaHeight;\n  var flipNeeded = dropdownHeight > spaceBelow && spaceAbove > spaceBelow;\n\n  if (flipNeeded) {\n    this.flipDropdown(dropdownHeight);\n  } else {\n    this.unflipDropdown();\n  }\n\n  this.limitDropdownIfNeeded(flipNeeded ? spaceAbove : spaceBelow, dropdownHeight);\n\n  return flipNeeded;\n};\n\nAutocompleteEditor.prototype.limitDropdownIfNeeded = function (spaceAvailable, dropdownHeight) {\n  if (dropdownHeight > spaceAvailable) {\n    var tempHeight = 0;\n    var i = 0;\n    var lastRowHeight = 0;\n    var height = null;\n\n    do {\n      lastRowHeight = this.htEditor.getRowHeight(i) || this.htEditor.view.wt.wtSettings.settings.defaultRowHeight;\n      tempHeight += lastRowHeight;\n      i++;\n    } while (tempHeight < spaceAvailable);\n\n    height = tempHeight - lastRowHeight;\n\n    if (this.htEditor.flipped) {\n      this.htEditor.rootElement.style.top = parseInt(this.htEditor.rootElement.style.top, 10) + dropdownHeight - height + 'px';\n    }\n\n    this.setDropdownHeight(tempHeight - lastRowHeight);\n  }\n};\n\nAutocompleteEditor.prototype.flipDropdown = function (dropdownHeight) {\n  var dropdownStyle = this.htEditor.rootElement.style;\n\n  dropdownStyle.position = 'absolute';\n  dropdownStyle.top = -dropdownHeight + 'px';\n\n  this.htEditor.flipped = true;\n};\n\nAutocompleteEditor.prototype.unflipDropdown = function () {\n  var dropdownStyle = this.htEditor.rootElement.style;\n\n  if (dropdownStyle.position === 'absolute') {\n    dropdownStyle.position = '';\n    dropdownStyle.top = '';\n  }\n\n  this.htEditor.flipped = void 0;\n};\n\nAutocompleteEditor.prototype.updateDropdownHeight = function () {\n  var currentDropdownWidth = this.htEditor.getColWidth(0) + (0, _element.getScrollbarWidth)() + 2;\n  var trimDropdown = this.cellProperties.trimDropdown;\n\n  this.htEditor.updateSettings({\n    height: this.getDropdownHeight(),\n    width: trimDropdown ? void 0 : currentDropdownWidth\n  });\n\n  this.htEditor.view.wt.wtTable.alignOverlaysWithTrimmingContainer();\n};\n\nAutocompleteEditor.prototype.setDropdownHeight = function (height) {\n  this.htEditor.updateSettings({\n    height: height\n  });\n};\n\nAutocompleteEditor.prototype.finishEditing = function (restoreOriginalValue) {\n  if (!restoreOriginalValue) {\n    this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n  }\n  _handsontableEditor2.default.prototype.finishEditing.apply(this, arguments);\n};\n\nAutocompleteEditor.prototype.highlightBestMatchingChoice = function (index) {\n  if (typeof index === 'number') {\n    this.htEditor.selectCell(index, 0, void 0, void 0, void 0, false);\n  } else {\n    this.htEditor.deselectCell();\n  }\n};\n\n/**\n * Filters and sorts by relevance\n * @param value\n * @param choices\n * @param caseSensitive\n * @returns {Array} array of indexes in original choices array\n */\nAutocompleteEditor.sortByRelevance = function (value, choices, caseSensitive) {\n  var choicesRelevance = [];\n  var currentItem = void 0;\n  var valueLength = value.length;\n  var valueIndex = void 0;\n  var charsLeft = void 0;\n  var result = [];\n  var i = void 0;\n  var choicesCount = choices.length;\n\n  if (valueLength === 0) {\n    for (i = 0; i < choicesCount; i++) {\n      result.push(i);\n    }\n    return result;\n  }\n\n  for (i = 0; i < choicesCount; i++) {\n    currentItem = (0, _string.stripTags)((0, _mixed.stringify)(choices[i]));\n\n    if (caseSensitive) {\n      valueIndex = currentItem.indexOf(value);\n    } else {\n      valueIndex = currentItem.toLowerCase().indexOf(value.toLowerCase());\n    }\n\n    if (valueIndex !== -1) {\n      charsLeft = currentItem.length - valueIndex - valueLength;\n\n      choicesRelevance.push({\n        baseIndex: i,\n        index: valueIndex,\n        charsLeft: charsLeft,\n        value: currentItem\n      });\n    }\n  }\n\n  choicesRelevance.sort(function (a, b) {\n\n    if (b.index === -1) {\n      return -1;\n    }\n    if (a.index === -1) {\n      return 1;\n    }\n\n    if (a.index < b.index) {\n      return -1;\n    } else if (b.index < a.index) {\n      return 1;\n    } else if (a.index === b.index) {\n      if (a.charsLeft < b.charsLeft) {\n        return -1;\n      } else if (a.charsLeft > b.charsLeft) {\n        return 1;\n      }\n    }\n\n    return 0;\n  });\n\n  for (i = 0, choicesCount = choicesRelevance.length; i < choicesCount; i++) {\n    result.push(choicesRelevance[i].baseIndex);\n  }\n\n  return result;\n};\n\nAutocompleteEditor.prototype.getDropdownHeight = function () {\n  var firstRowHeight = this.htEditor.getInstance().getRowHeight(0) || 23;\n  var visibleRows = this.cellProperties.visibleRows;\n\n  return this.strippedChoices.length >= visibleRows ? visibleRows * firstRowHeight : this.strippedChoices.length * firstRowHeight + 8;\n};\n\nAutocompleteEditor.prototype.stripValueIfNeeded = function (value) {\n  return this.stripValuesIfNeeded([value])[0];\n};\n\nAutocompleteEditor.prototype.stripValuesIfNeeded = function (values) {\n  var allowHtml = this.cellProperties.allowHtml;\n\n\n  var stringifiedValues = (0, _array.arrayMap)(values, function (value) {\n    return (0, _mixed.stringify)(value);\n  });\n  var strippedValues = (0, _array.arrayMap)(stringifiedValues, function (value) {\n    return allowHtml ? value : (0, _string.stripTags)(value);\n  });\n\n  return strippedValues;\n};\n\nAutocompleteEditor.prototype.allowKeyEventPropagation = function (keyCode) {\n  var selectedRange = this.htEditor.getSelectedRangeLast();\n\n  var selected = { row: selectedRange ? selectedRange.from.row : -1 };\n  var allowed = false;\n\n  if (keyCode === _unicode.KEY_CODES.ARROW_DOWN && selected.row > 0 && selected.row < this.htEditor.countRows() - 1) {\n    allowed = true;\n  }\n  if (keyCode === _unicode.KEY_CODES.ARROW_UP && selected.row > -1) {\n    allowed = true;\n  }\n\n  return allowed;\n};\n\nAutocompleteEditor.prototype.discardEditor = function (result) {\n  _handsontableEditor2.default.prototype.discardEditor.apply(this, arguments);\n\n  this.instance.view.render();\n};\n\nexports.default = AutocompleteEditor;\n\n/***/ }),\n/* 189 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _unicode = __webpack_require__(21);\n\nvar _object = __webpack_require__(2);\n\nvar _element = __webpack_require__(0);\n\nvar _event = __webpack_require__(12);\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar HandsontableEditor = _textEditor2.default.prototype.extend();\n\n/**\n * @private\n * @editor HandsontableEditor\n * @class HandsontableEditor\n * @dependencies TextEditor\n */\nHandsontableEditor.prototype.createElements = function () {\n  _textEditor2.default.prototype.createElements.apply(this, arguments);\n\n  var DIV = document.createElement('DIV');\n  DIV.className = 'handsontableEditor';\n  this.TEXTAREA_PARENT.appendChild(DIV);\n\n  this.htContainer = DIV;\n  this.assignHooks();\n};\n\nHandsontableEditor.prototype.prepare = function (td, row, col, prop, value, cellProperties) {\n  _textEditor2.default.prototype.prepare.apply(this, arguments);\n\n  var parent = this;\n  var options = {\n    startRows: 0,\n    startCols: 0,\n    minRows: 0,\n    minCols: 0,\n    className: 'listbox',\n    copyPaste: false,\n    autoColumnSize: false,\n    autoRowSize: false,\n    readOnly: true,\n    fillHandle: false,\n    afterOnCellMouseDown: function afterOnCellMouseDown(_, coords) {\n      var value = this.getSourceData(coords.row, coords.col);\n\n      // if the value is undefined then it means we don't want to set the value\n      if (value !== void 0) {\n        parent.setValue(value);\n      }\n      parent.instance.destroyEditor();\n    }\n  };\n\n  if (this.cellProperties.handsontable) {\n    (0, _object.extend)(options, cellProperties.handsontable);\n  }\n  this.htOptions = options;\n};\n\nvar onBeforeKeyDown = function onBeforeKeyDown(event) {\n  if ((0, _event.isImmediatePropagationStopped)(event)) {\n    return;\n  }\n  var editor = this.getActiveEditor();\n\n  var innerHOT = editor.htEditor.getInstance();\n\n  var rowToSelect;\n  var selectedRow;\n\n  if (event.keyCode == _unicode.KEY_CODES.ARROW_DOWN) {\n    if (!innerHOT.getSelectedLast() && !innerHOT.flipped) {\n      rowToSelect = 0;\n    } else if (innerHOT.getSelectedLast()) {\n      if (innerHOT.flipped) {\n        rowToSelect = innerHOT.getSelectedLast()[0] + 1;\n      } else if (!innerHOT.flipped) {\n        selectedRow = innerHOT.getSelectedLast()[0];\n        var lastRow = innerHOT.countRows() - 1;\n        rowToSelect = Math.min(lastRow, selectedRow + 1);\n      }\n    }\n  } else if (event.keyCode == _unicode.KEY_CODES.ARROW_UP) {\n    if (!innerHOT.getSelectedLast() && innerHOT.flipped) {\n      rowToSelect = innerHOT.countRows() - 1;\n    } else if (innerHOT.getSelectedLast()) {\n      if (innerHOT.flipped) {\n        selectedRow = innerHOT.getSelectedLast()[0];\n        rowToSelect = Math.max(0, selectedRow - 1);\n      } else {\n        selectedRow = innerHOT.getSelectedLast()[0];\n        rowToSelect = selectedRow - 1;\n      }\n    }\n  }\n\n  if (rowToSelect !== void 0) {\n    if (rowToSelect < 0 || innerHOT.flipped && rowToSelect > innerHOT.countRows() - 1) {\n      innerHOT.deselectCell();\n    } else {\n      innerHOT.selectCell(rowToSelect, 0);\n    }\n    if (innerHOT.getData().length) {\n      event.preventDefault();\n      (0, _event.stopImmediatePropagation)(event);\n\n      editor.instance.listen();\n      editor.TEXTAREA.focus();\n    }\n  }\n};\n\nHandsontableEditor.prototype.open = function () {\n  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);\n\n  _textEditor2.default.prototype.open.apply(this, arguments);\n\n  if (this.htEditor) {\n    this.htEditor.destroy();\n  }\n  // Construct and initialise a new Handsontable\n  this.htEditor = new this.instance.constructor(this.htContainer, this.htOptions);\n  this.htEditor.init();\n\n  if (this.cellProperties.strict) {\n    this.htEditor.selectCell(0, 0);\n    this.TEXTAREA.style.visibility = 'hidden';\n  } else {\n    this.htEditor.deselectCell();\n    this.TEXTAREA.style.visibility = 'visible';\n  }\n\n  (0, _element.setCaretPosition)(this.TEXTAREA, 0, this.TEXTAREA.value.length);\n};\n\nHandsontableEditor.prototype.close = function () {\n  this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n  this.instance.listen();\n\n  _textEditor2.default.prototype.close.apply(this, arguments);\n};\n\nHandsontableEditor.prototype.focus = function () {\n  this.instance.listen();\n  _textEditor2.default.prototype.focus.apply(this, arguments);\n};\n\nHandsontableEditor.prototype.beginEditing = function (initialValue) {\n  var onBeginEditing = this.instance.getSettings().onBeginEditing;\n\n  if (onBeginEditing && onBeginEditing() === false) {\n    return;\n  }\n  _textEditor2.default.prototype.beginEditing.apply(this, arguments);\n};\n\nHandsontableEditor.prototype.finishEditing = function (isCancelled, ctrlDown) {\n  if (this.htEditor && this.htEditor.isListening()) {\n    // if focus is still in the HOT editor\n\n    this.instance.listen(); // return the focus to the parent HOT instance\n  }\n\n  if (this.htEditor && this.htEditor.getSelectedLast()) {\n    var value = this.htEditor.getInstance().getValue();\n\n    if (value !== void 0) {\n      // if the value is undefined then it means we don't want to set the value\n      this.setValue(value);\n    }\n  }\n\n  return _textEditor2.default.prototype.finishEditing.apply(this, arguments);\n};\n\nHandsontableEditor.prototype.assignHooks = function () {\n  var _this = this;\n\n  this.instance.addHook('afterDestroy', function () {\n    if (_this.htEditor) {\n      _this.htEditor.destroy();\n    }\n  });\n};\n\nexports.default = HandsontableEditor;\n\n/***/ }),\n/* 190 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getNormalizedDate = getNormalizedDate;\n/* eslint-disable import/prefer-default-export */\n\n/**\n * Get normalized Date object for the ISO formatted date strings.\n * Natively, the date object parsed from a ISO 8601 string will be offsetted by the timezone difference, which may result in returning a wrong date.\n * See: Github issue #3338.\n *\n * @param {String} dateString String representing the date.\n * @returns {Date} The proper Date object.\n */\nfunction getNormalizedDate(dateString) {\n  var nativeDate = new Date(dateString);\n\n  // NaN if dateString is not in ISO format\n  if (!isNaN(new Date(dateString + \"T00:00\").getDate())) {\n\n    // Compensate timezone offset\n    return new Date(nativeDate.getTime() + nativeDate.getTimezoneOffset() * 60000);\n  }\n\n  return nativeDate;\n}\n\n/***/ }),\n/* 191 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * SheetClip - Spreadsheet Clipboard Parser\n * version 0.2\n *\n * This tiny library transforms JavaScript arrays to strings that are pasteable by LibreOffice, OpenOffice,\n * Google Docs and Microsoft Excel.\n *\n * Copyright 2012, Marcin Warpechowski\n * Licensed under the MIT license.\n * http://github.com/warpech/sheetclip/\n */\n/*jslint white: true*/\n(function (global) {\n  \"use strict\";\n\n  function countQuotes(str) {\n    return str.split('\"').length - 1;\n  }\n\n  var SheetClip = {\n    /**\n     * Decode spreadsheet string into array\n     *\n     * @param {String} str\n     * @returns {Array}\n     */\n    parse: function parse(str) {\n      var r,\n          rLen,\n          rows,\n          arr = [],\n          a = 0,\n          c,\n          cLen,\n          multiline,\n          last;\n\n      rows = str.split('\\n');\n\n      if (rows.length > 1 && rows[rows.length - 1] === '') {\n        rows.pop();\n      }\n      for (r = 0, rLen = rows.length; r < rLen; r += 1) {\n        rows[r] = rows[r].split('\\t');\n\n        for (c = 0, cLen = rows[r].length; c < cLen; c += 1) {\n          if (!arr[a]) {\n            arr[a] = [];\n          }\n          if (multiline && c === 0) {\n            last = arr[a].length - 1;\n            arr[a][last] = arr[a][last] + '\\n' + rows[r][0];\n\n            if (multiline && countQuotes(rows[r][0]) & 1) {\n              //& 1 is a bitwise way of performing mod 2\n              multiline = false;\n              arr[a][last] = arr[a][last].substring(0, arr[a][last].length - 1).replace(/\"\"/g, '\"');\n            }\n          } else {\n            if (c === cLen - 1 && rows[r][c].indexOf('\"') === 0 && countQuotes(rows[r][c]) & 1) {\n              arr[a].push(rows[r][c].substring(1).replace(/\"\"/g, '\"'));\n              multiline = true;\n            } else {\n              arr[a].push(rows[r][c].replace(/\"\"/g, '\"'));\n              multiline = false;\n            }\n          }\n        }\n        if (!multiline) {\n          a += 1;\n        }\n      }\n\n      return arr;\n    },\n\n    /**\n     * Encode array into valid spreadsheet string\n     *\n     * @param arr\n     * @returns {String}\n     */\n    stringify: function stringify(arr) {\n      var r,\n          rLen,\n          c,\n          cLen,\n          str = '',\n          val;\n\n      for (r = 0, rLen = arr.length; r < rLen; r += 1) {\n        cLen = arr[r].length;\n\n        for (c = 0; c < cLen; c += 1) {\n          if (c > 0) {\n            str += '\\t';\n          }\n          val = arr[r][c];\n\n          if (typeof val === 'string') {\n            if (val.indexOf('\\n') > -1) {\n              str += '\"' + val.replace(/\"/g, '\"\"') + '\"';\n            } else {\n              str += val;\n            }\n          } else if (val === null || val === void 0) {\n            // void 0 resolves to undefined\n            str += '';\n          } else {\n            str += val;\n          }\n        }\n\n        if (r !== rLen - 1) {\n          str += '\\n';\n        }\n      }\n\n      return str;\n    }\n  };\n\n  if (true) {\n    exports.parse = SheetClip.parse;\n    exports.stringify = SheetClip.stringify;\n  } else {\n    global.SheetClip = SheetClip;\n  }\n})(window);\n\n/***/ }),\n/* 192 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.mouseDown = mouseDown;\nexports.mouseOver = mouseOver;\nexports.handleMouseEvent = handleMouseEvent;\n\nvar _event = __webpack_require__(12);\n\nvar _src = __webpack_require__(4);\n\n/**\n * MouseDown handler.\n *\n * @param {Object} options\n * @param {Boolean} options.isShiftKey The flag which indicates if the shift key is pressed.\n * @param {Boolean} options.isLeftClick The flag which indicates if the left mouse button is pressed.\n * @param {Boolean} options.isRightClick The flag which indicates if the right mouse button is pressed.\n * @param {CellRange} options.coords The CellCoords object with defined visual coordinates.\n * @param {Selection} options.selection The Selection class instance.\n * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what\n *                                    operation will be performed in later selection stages.\n */\nfunction mouseDown(_ref) {\n  var isShiftKey = _ref.isShiftKey,\n      isLeftClick = _ref.isLeftClick,\n      isRightClick = _ref.isRightClick,\n      coords = _ref.coords,\n      selection = _ref.selection,\n      controller = _ref.controller;\n\n  var currentSelection = selection.isSelected() ? selection.getSelectedRange().current() : null;\n  var selectedCorner = selection.isSelectedByCorner();\n  var selectedRow = selection.isSelectedByRowHeader();\n  var selectedColumn = selection.isSelectedByColumnHeader();\n\n  if (isShiftKey && currentSelection) {\n    if (coords.row >= 0 && coords.col >= 0 && !controller.cells) {\n      selection.setRangeEnd(coords);\n    } else if ((selectedCorner || selectedRow) && coords.row >= 0 && coords.col >= 0 && !controller.cells) {\n      selection.setRangeEnd(new _src.CellCoords(coords.row, coords.col));\n    } else if (selectedCorner && coords.row < 0 && !controller.column) {\n      selection.setRangeEnd(new _src.CellCoords(currentSelection.to.row, coords.col));\n    } else if (selectedRow && coords.col < 0 && !controller.row) {\n      selection.setRangeEnd(new _src.CellCoords(coords.row, currentSelection.to.col));\n    } else if ((!selectedCorner && !selectedRow && coords.col < 0 || selectedCorner && coords.col < 0) && !controller.row) {\n      selection.selectRows(currentSelection.from.row, coords.row);\n    } else if ((!selectedCorner && !selectedRow && coords.row < 0 || selectedRow && coords.row < 0) && !controller.column) {\n      selection.selectColumns(currentSelection.from.col, coords.col);\n    }\n  } else {\n    var newCoord = new _src.CellCoords(coords.row, coords.col);\n\n    if (newCoord.row < 0) {\n      newCoord.row = 0;\n    }\n    if (newCoord.col < 0) {\n      newCoord.col = 0;\n    }\n\n    var allowRightClickSelection = !selection.inInSelection(newCoord);\n    var performSelection = isLeftClick || isRightClick && allowRightClickSelection;\n\n    // clicked row header and when some column was selected\n    if (coords.row < 0 && coords.col >= 0 && !controller.column) {\n      if (performSelection) {\n        selection.selectColumns(coords.col);\n      }\n\n      // clicked column header and when some row was selected\n    } else if (coords.col < 0 && coords.row >= 0 && !controller.row) {\n      if (performSelection) {\n        selection.selectRows(coords.row);\n      }\n    } else if (coords.col >= 0 && coords.row >= 0 && !controller.cells) {\n      if (performSelection) {\n        selection.setRangeStart(coords);\n      }\n    } else if (coords.col < 0 && coords.row < 0) {\n      selection.setRangeStart(coords);\n    }\n  }\n}\n\n/**\n * MouseOver handler.\n *\n * @param {Object} options\n * @param {Boolean} options.isLeftClick\n * @param {CellRange} options.coords The CellCoords object with defined visual coordinates.\n * @param {Selection} options.selection The Selection class instance.\n * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what\n *                                    operation will be performed in later selection stages.\n */\nfunction mouseOver(_ref2) {\n  var isLeftClick = _ref2.isLeftClick,\n      coords = _ref2.coords,\n      selection = _ref2.selection,\n      controller = _ref2.controller;\n\n  if (!isLeftClick) {\n    return;\n  }\n\n  var selectedRow = selection.isSelectedByRowHeader();\n  var selectedColumn = selection.isSelectedByColumnHeader();\n  var countCols = selection.tableProps.countCols();\n  var countRows = selection.tableProps.countRows();\n\n  if (selectedColumn && !controller.column) {\n    selection.setRangeEnd(new _src.CellCoords(countRows - 1, coords.col));\n  } else if (selectedRow && !controller.row) {\n    selection.setRangeEnd(new _src.CellCoords(coords.row, countCols - 1));\n  } else if (!controller.cell) {\n    selection.setRangeEnd(coords);\n  }\n}\n\nvar handlers = new Map([['mousedown', mouseDown], ['mouseover', mouseOver], ['touchstart', mouseDown]]);\n\n/**\n * Mouse handler for selection functionality.\n *\n * @param {Event} event An native event to handle.\n * @param {Object} options\n * @param {CellRange} options.coords The CellCoords object with defined visual coordinates.\n * @param {Selection} options.selection The Selection class instance.\n * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what\n *                                    operation will be performed in later selection stages.\n */\nfunction handleMouseEvent(event, _ref3) {\n  var coords = _ref3.coords,\n      selection = _ref3.selection,\n      controller = _ref3.controller;\n\n  handlers.get(event.type)({\n    coords: coords,\n    selection: selection,\n    controller: controller,\n    isShiftKey: event.shiftKey,\n    isLeftClick: (0, _event.isLeftClick)(event) || event.type === 'touchstart',\n    isRightClick: (0, _event.isRightClick)(event)\n  });\n}\n\n/***/ }),\n/* 193 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.RecordTranslator = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.registerIdentity = registerIdentity;\nexports.getTranslator = getTranslator;\n\nvar _core = __webpack_require__(88);\n\nvar _core2 = _interopRequireDefault(_core);\n\nvar _object = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class RecordTranslator\n * @util\n */\nvar RecordTranslator = function () {\n  function RecordTranslator(hot) {\n    _classCallCheck(this, RecordTranslator);\n\n    this.hot = hot;\n  }\n\n  /**\n   * Translate physical row index into visual.\n   *\n   * @param {Number} row Physical row index.\n   * @returns {Number} Returns visual row index.\n   */\n\n\n  _createClass(RecordTranslator, [{\n    key: 'toVisualRow',\n    value: function toVisualRow(row) {\n      return this.hot.runHooks('unmodifyRow', row);\n    }\n\n    /**\n     * Translate physical column index into visual.\n     *\n     * @param {Number} column Physical column index.\n     * @returns {Number} Returns visual column index.\n     */\n\n  }, {\n    key: 'toVisualColumn',\n    value: function toVisualColumn(column) {\n      return this.hot.runHooks('unmodifyCol', column);\n    }\n\n    /**\n     * Translate physical coordinates into visual. Can be passed as separate 2 arguments (row, column) or as an object in first\n     * argument with `row` and `column` keys.\n     *\n     * @param {Number|Object} row Physical coordinates or row index.\n     * @param {Number} [column] Physical column index.\n     * @returns {Object|Array} Returns an object with visual records or an array if coordinates passed as separate arguments.\n     */\n\n  }, {\n    key: 'toVisual',\n    value: function toVisual(row, column) {\n      var result = void 0;\n\n      if ((0, _object.isObject)(row)) {\n        result = {\n          row: this.toVisualRow(row.row),\n          column: this.toVisualColumn(row.column)\n        };\n      } else {\n        result = [this.toVisualRow(row), this.toVisualColumn(column)];\n      }\n\n      return result;\n    }\n\n    /**\n     * Translate visual row index into physical.\n     *\n     * @param {Number} row Visual row index.\n     * @returns {Number} Returns physical row index.\n     */\n\n  }, {\n    key: 'toPhysicalRow',\n    value: function toPhysicalRow(row) {\n      return this.hot.runHooks('modifyRow', row);\n    }\n\n    /**\n     * Translate visual column index into physical.\n     *\n     * @param {Number} column Visual column index.\n     * @returns {Number} Returns physical column index.\n     */\n\n  }, {\n    key: 'toPhysicalColumn',\n    value: function toPhysicalColumn(column) {\n      return this.hot.runHooks('modifyCol', column);\n    }\n\n    /**\n     * Translate visual coordinates into physical. Can be passed as separate 2 arguments (row, column) or as an object in first\n     * argument with `row` and `column` keys.\n     *\n     * @param {Number|Object} row Visual coordinates or row index.\n     * @param {Number} [column] Visual column index.\n     * @returns {Object|Array} Returns an object with physical records or an array if coordinates passed as separate arguments.\n     */\n\n  }, {\n    key: 'toPhysical',\n    value: function toPhysical(row, column) {\n      var result = void 0;\n\n      if ((0, _object.isObject)(row)) {\n        result = {\n          row: this.toPhysicalRow(row.row),\n          column: this.toPhysicalColumn(row.column)\n        };\n      } else {\n        result = [this.toPhysicalRow(row), this.toPhysicalColumn(column)];\n      }\n\n      return result;\n    }\n  }]);\n\n  return RecordTranslator;\n}();\n\nexports.RecordTranslator = RecordTranslator;\n\n\nvar identities = new WeakMap();\nvar translatorSingletons = new WeakMap();\n\nfunction registerIdentity(identity, hot) {\n  identities.set(identity, hot);\n}\n\nfunction getTranslator(identity) {\n  var singleton = void 0;\n\n  if (!(identity instanceof _core2.default)) {\n    if (!identities.has(identity)) {\n      throw Error('Record translator was not registered for this object identity');\n    }\n    identity = identities.get(identity);\n  }\n  if (translatorSingletons.has(identity)) {\n    singleton = translatorSingletons.get(identity);\n  } else {\n    singleton = new RecordTranslator(identity);\n    translatorSingletons.set(identity, singleton);\n  }\n\n  return singleton;\n}\n\n/***/ }),\n/* 194 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.registerAsRootInstance = registerAsRootInstance;\nexports.hasValidParameter = hasValidParameter;\nexports.isRootInstance = isRootInstance;\nvar holder = exports.holder = new WeakMap();\n\nvar rootInstanceSymbol = exports.rootInstanceSymbol = Symbol('rootInstance');\n\n/**\n * Register an object as a root instance.\n *\n * @param  {Object} object An object to associate with root instance flag.\n */\nfunction registerAsRootInstance(object) {\n  holder.set(object, true);\n}\n\n/**\n * Check if the source of the root indication call is valid.\n *\n * @param  {Symbol} rootSymbol A symbol as a source of truth.\n * @return {Boolean}\n */\nfunction hasValidParameter(rootSymbol) {\n  return rootSymbol === rootInstanceSymbol;\n}\n\n/**\n * Check if passed an object was flagged as a root instance.\n *\n * @param  {Object} object An object to check.\n * @return {Boolean}\n */\nfunction isRootInstance(object) {\n  return holder.has(object);\n}\n\n/***/ }),\n/* 195 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _mixed = __webpack_require__(16);\n\nvar _object = __webpack_require__(2);\n\n/**\n * @alias Options\n * @constructor\n * @description\n\n * ## Constructor options\n *\n * Constructor options are applied using an object literal passed as a second argument to the Handsontable constructor.\n *\n * ```js\n * var hot = new Handsontable(document.getElementById('example1'), {\n *   data: myArray,\n *   width: 400,\n *   height: 300\n * });\n * ```\n *\n * ---\n * ## Cascading configuration\n *\n * Handsontable 0.9 and newer is using *Cascading Configuration*, which is a fast way to provide configuration options\n * for the entire table, including its columns and particular cells.\n *\n * Consider the following example:\n * ```js\n * var hot = new Handsontable(document.getElementById('example'), {\n *   readOnly: true,\n *   columns: [\n *     {readOnly: false},\n *     {},\n *     {}\n *   ],\n *   cells: function (row, col, prop) {\n *     var cellProperties = {};\n *\n *     if (row === 0 && col === 0) {\n *       cellProperties.readOnly = true;\n *     }\n *\n *     return cellProperties;\n *   }\n * });\n * ```\n *\n * The above notation will result in all TDs being *read only*, except for first column TDs which will be *editable*, except for the TD in top left corner which will still be *read only*.\n *\n * ### The Cascading Configuration model\n *\n * ##### 1. Constructor\n *\n * Configuration options that are provided using first-level `handsontable(container, {option: \"value\"})` and `updateSettings` method.\n *\n * ##### 2. Columns\n *\n * Configuration options that are provided using second-level object `handsontable(container, {columns: {option: \"value\"}]})`\n *\n * ##### 3. Cells\n *\n * Configuration options that are provided using third-level function `handsontable(container, {cells: function: (row, col, prop){ }})`\n *\n * ---\n * ## Architecture performance\n *\n * The Cascading Configuration model is based on prototypical inheritance. It is much faster and memory efficient compared\n * to the previous model that used jQuery extend. See: [http://jsperf.com/extending-settings](http://jsperf.com/extending-settings).\n *\n * ---\n * __Important notice:__ In order for the data separation to work properly, make sure that each instance of Handsontable has a unique `id`.\n */\nfunction DefaultSettings() {};\n\nDefaultSettings.prototype = {\n  /**\n   * License key for commercial version of Handsontable.\n   *\n   * @pro\n   * @type {String}\n   * @default 'trial'\n   */\n  licenseKey: 'trial',\n\n  /**\n   * @description\n   * Initial data source that will be bound to the data grid __by reference__ (editing data grid alters the data source).\n   * Can be declared as an Array of Arrays, Array of Objects or a Function.\n   *\n   * See [Understanding binding as reference](http://docs.handsontable.com/tutorial-data-binding.html#page-reference).\n   *\n   * @type {Array|Function}\n   * @default undefined\n   */\n  data: void 0,\n\n  /**\n   * @description\n   * Defines the structure of a new row when data source is an array of objects.\n   *\n   * See [data-schema](http://docs.handsontable.com/tutorial-data-sources.html#page-data-schema) for examples.\n   *\n   * @type {Object}\n   * @default undefined\n   */\n  dataSchema: void 0,\n\n  /**\n   * Width of the grid. Can be a value or a function that returns a value.\n   *\n   * @type {Number|Function}\n   * @default undefined\n   */\n  width: void 0,\n\n  /**\n   * Height of the grid. Can be a number or a function that returns a number.\n   *\n   * @type {Number|Function}\n   * @default undefined\n   */\n  height: void 0,\n\n  /**\n   * @description\n   * Initial number of rows.\n   *\n   * __Notice:__ This option only has effect in Handsontable constructor and only if `data` option is not provided\n   *\n   * @type {Number}\n   * @default 5\n   */\n  startRows: 5,\n\n  /**\n   * @description\n   * Initial number of columns.\n   *\n   * __Notice:__ This option only has effect in Handsontable constructor and only if `data` option is not provided\n   *\n   * @type {Number}\n   * @default 5\n   */\n  startCols: 5,\n\n  /**\n   * Setting `true` or `false` will enable or disable the default row headers (1, 2, 3).\n   * You can also define an array `['One', 'Two', 'Three', ...]` or a function to define the headers.\n   * If a function is set the index of the row is passed as a parameter.\n   *\n   * @type {Boolean|Array|Function}\n   * @default null\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * rowHeaders: true,\n   * ...\n   *\n   * ...\n   * // as array\n   * rowHeaders: [1, 2, 3],\n   * ...\n   *\n   * ...\n   * // as function\n   * rowHeaders: function(index) {\n   *   return index + ': AB';\n   * },\n   * ...\n   * ```\n   */\n  rowHeaders: void 0,\n\n  /**\n   * Setting `true` or `false` will enable or disable the default column headers (A, B, C).\n   * You can also define an array `['One', 'Two', 'Three', ...]` or a function to define the headers.\n   * If a function is set, then the index of the column is passed as a parameter.\n   *\n   * @type {Boolean|Array|Function}\n   * @default null\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * colHeaders: true,\n   * ...\n   *\n   * ...\n   * // as array\n   * colHeaders: ['A', 'B', 'C'],\n   * ...\n   *\n   * ...\n   * // as function\n   * colHeaders: function(index) {\n   *   return index + ': AB';\n   * },\n   * ...\n   * ```\n   */\n  colHeaders: null,\n\n  /**\n   * Defines column widths in pixels. Accepts number, string (that will be converted to a number),\n   * array of numbers (if you want to define column width separately for each column) or a\n   * function (if you want to set column width dynamically on each render).\n   *\n   * @type {Array|Function|Number|String}\n   * @default undefined\n   * @example\n   * ```js\n   * ...\n   * // as numeric, for each column.\n   * colWidths: 100,\n   * ...\n   *\n   * * ...\n   * // as string, for each column.\n   * colWidths: '100px',\n   * ...\n   *\n   * ...\n   * // as array, based on visual indexes. The rest of the columns have a default width.\n   * colWidths: [100, 120, 90],\n   * ...\n   *\n   * ...\n   * // as function, based on visual indexes.\n   * colWidths: function(index) {\n   *   return index * 10;\n   * },\n   * ...\n   * ```\n   */\n  colWidths: void 0,\n\n  /**\n   * Defines row heights in pixels. Accepts numbers, strings (that will be converted into a number),\n   * array of numbers (if you want to define row height separately for each row) or a\n   * function (if you want to set row height dynamically on each render).\n   * If the ManualRowResize or AutoRowSize plugins are enabled, this is also the minimum height that can be set\n   * via either of those two plugins.\n   * Height should be equal or greater than 23px. Table is rendered incorrectly if height is less than 23px.\n   *\n   * @type {Array|Function|Number|String}\n   * @default undefined\n   * @example\n   * ```js\n   * ...\n   * // as numeric, for each row.\n   * rowHeights: 100,\n   * ...\n   *\n   * * ...\n   * // as string, for each row.\n   * rowHeights: '100px',\n   * ...\n   *\n   * ...\n   * // as array, based on visual indexes. The rest of the rows have a default height.\n   * rowHeights: [100, 120, 90],\n   * ...\n   *\n   * ...\n   * // as function, based on visual indexes.\n   * rowHeights: function(index) {\n   *   return index * 10;\n   * },\n   * ...\n   * ```\n   */\n  rowHeights: void 0,\n\n  /**\n   * @description\n   * Defines the cell properties and data binding for certain columns.\n   *\n   * __Notice:__ Using this option sets a fixed number of columns (options `startCols`, `minCols`, `maxCols` will be ignored).\n   *\n   * See [documentation -> datasources.html](http://docs.handsontable.com/tutorial-data-sources.html#page-nested) for examples.\n   *\n   * @type {Array|Function}\n   * @default undefined\n   * @example\n   * ```js\n   * ...\n   * // as an array of objects. Order of the objects in array is representation of physical indexes.\n   * columns: [\n   *   {\n   *     // column options for the first column\n   *     type: 'numeric',\n   *     numericFormat: {\n   *       pattern: '0,0.00 $'\n   *     }\n   *   },\n   *   {\n   *     // column options for the second column\n   *     type: 'text',\n   *     readOnly: true\n   *   }\n   * ],\n   * ...\n   *\n   * // or as function, based on physical indexes\n   * ...\n   * columns: function(index) {\n  *    return {\n  *      type: index > 0 ? 'numeric' : 'text',\n  *      readOnly: index < 1\n  *    }\n   * }\n   * ...\n   * ```\n   */\n  columns: void 0,\n\n  /**\n   * @description\n   * Defines the cell properties for given `row`, `col`, `prop` coordinates.\n   * Any constructor or column option may be overwritten for a particular cell (row/column combination)\n   * using the `cells` property in the Handsontable constructor.\n   *\n   * __Note:__ Parameters `row` and `col` always represent __physical indexes__. Example below show how to execute\n   * operations based on the __visual__ representation of Handsontable.\n   *\n   * Possible values of `prop`:\n   * - property name for column's data source object, when dataset is an [array of objects](/tutorial-data-sources.html#page-object)\n   * - the same number as `col`, when dataset is an [array of arrays](/tutorial-data-sources.html#page-array)\n   *\n   * @type {Function}\n   * @default undefined\n   * @example\n   * ```js\n   * ...\n   * cells: function (row, col, prop) {\n   *   var cellProperties = {};\n   *   var visualRowIndex = this.instance.toVisualRow(row);\n   *   var visualColIndex = this.instance.toVisualColumn(col);\n   *\n   *   if (visualRowIndex === 0 && visualColIndex === 0) {\n   *     cellProperties.readOnly = true;\n   *   }\n   *\n   *   return cellProperties;\n   * },\n   * ...\n   * ```\n   */\n  cells: void 0,\n\n  /**\n   * Any constructor or column option may be overwritten for a particular cell (row/column combination), using `cell`\n   * array passed to the Handsontable constructor.\n   *\n   * @type {Array}\n   * @default []\n   * @example\n   * ```js\n   * ...\n   * cell: [\n   *   {row: 0, col: 0, readOnly: true}\n   * ],\n   * ...\n   * ```\n   */\n  cell: [],\n\n  /**\n   * @description\n   * If `true`, enables the {@link Comments} plugin, which enables an option to apply cell comments through the context menu\n   * (configurable with context menu keys `commentsAddEdit`, `commentsRemove`).\n   *\n   * To initialize Handsontable with predefined comments, provide cell coordinates and comment text values in a form of an array.\n   *\n   * See [Comments](http://docs.handsontable.com/demo-comments_.html) demo for examples.\n   *\n   * @since 0.11.0\n   * @type {Boolean|Array}\n   * @default false\n   * @example\n   * ```js\n   * ...\n   * comments: [{row: 1, col: 1, comment: {value: \"Test comment\"}}],\n   * ...\n   * ```\n   */\n  comments: false,\n\n  /**\n   * @description\n   * If `true`, enables the Custom Borders plugin, which enables an option to apply custom borders through the context menu (configurable with context menu key `borders`).\n   *\n   * To initialize Handsontable with predefined custom borders, provide cell coordinates and border styles in a form of an array.\n   *\n   * See [Custom Borders](http://docs.handsontable.com/demo-custom-borders.html) demo for examples.\n   *\n   * @since 0.11.0\n   * @type {Boolean|Array}\n   * @default false\n   * @example\n   * ```js\n   * ...\n   * customBorders: [\n   *   {range: {\n   *     from: {row: 1, col: 1},\n   *     to: {row: 3, col: 4}},\n   *     left: {},\n   *     right: {},\n   *     top: {},\n   *     bottom: {}\n   *   }\n   * ],\n   * ...\n   *\n   * // or\n   * ...\n   * customBorders: [\n   *   {row: 2, col: 2, left: {width: 2, color: 'red'},\n   *     right: {width: 1, color: 'green'}, top: '', bottom: ''}\n   * ],\n   * ...\n   * ```\n   */\n  customBorders: false,\n\n  /**\n   * Minimum number of rows. At least that number of rows will be created during initialization.\n   *\n   * @type {Number}\n   * @default 0\n   */\n  minRows: 0,\n\n  /**\n   * Minimum number of columns. At least that number of columns will be created during initialization.\n   *\n   * @type {Number}\n   * @default 0\n   */\n  minCols: 0,\n\n  /**\n   * Maximum number of rows. If set to a value lower than the initial row count, the data will be trimmed to the provided value as the number of rows.\n   *\n   * @type {Number}\n   * @default Infinity\n   */\n  maxRows: Infinity,\n\n  /**\n   * Maximum number of cols. If set to a value lower than the initial col count, the data will be trimmed to the provided value as the number of cols.\n   *\n   * @type {Number}\n   * @default Infinity\n   */\n  maxCols: Infinity,\n\n  /**\n   * When set to 1 (or more), Handsontable will add a new row at the end of grid if there are no more empty rows.\n   * (unless the number of rows exceeds the one set in the `maxRows` property)\n   *\n   * @type {Number}\n   * @default 0\n   */\n  minSpareRows: 0,\n\n  /**\n   * When set to 1 (or more), Handsontable will add a new column at the end of grid if there are no more empty columns.\n   * (unless the number of rows exceeds the one set in the `maxCols` property)\n   *\n   * @type {Number}\n   * @default 0\n   */\n  minSpareCols: 0,\n\n  /**\n   * If set to `false`, there won't be an option to insert new rows in the Context Menu.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  allowInsertRow: true,\n\n  /**\n   * If set to `false`, there won't be an option to insert new columns in the Context Menu.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  allowInsertColumn: true,\n\n  /**\n   * If set to `false`, there won't be an option to remove rows in the Context Menu.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  allowRemoveRow: true,\n\n  /**\n   * If set to `false`, there won't be an option to remove columns in the Context Menu.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  allowRemoveColumn: true,\n\n  /**\n   * @description\n   * Defines how the table selection reacts. The selection support three different behaviors defined as:\n   *  * `'single'` Only a single cell can be selected.\n   *  * `'range'` Multiple cells within a single range can be selected.\n   *  * `'multiple'` Multiple ranges of cells can be selected.\n   *\n   * To see how to interact with selection by getting selected data or change styles of the selected cells go to\n   * [https://docs.handsontable.com/demo-selecting-ranges.html](https://docs.handsontable.com/demo-selecting-ranges.html).\n   *\n   * @since 0.36.0\n   * @type {String}\n   * @default 'multiple'\n   */\n  selectionMode: 'multiple',\n\n  /**\n   * Enables the fill handle (drag-down and copy-down) functionality, which shows a small rectangle in bottom\n   * right corner of the selected area, that let's you expand values to the adjacent cells.\n   *\n   * Possible values: `true` (to enable in all directions), `'vertical'` or `'horizontal'` (to enable in one direction),\n   * `false` (to disable completely). Setting to `true` enables the fillHandle plugin.\n   *\n   * Since 0.23.0 you can pass object to plugin which allows you to add more options for this functionality. If `autoInsertRow`\n   * option is `true`, fill-handler will create new rows till it reaches the last row. It is enabled by default.\n   *\n   * @example\n   * ```js\n   * ...\n   * fillHandle: true // enable plugin in all directions and with autoInsertRow as true\n   * ...\n   * // or\n   * ...\n   * fillHandle: 'vertical' // enable plugin in vertical direction and with autoInsertRow as true\n   * ...\n   * // or\n   * ...\n   * fillHandle: { // enable plugin in both directions and with autoInsertRow as false\n   *   autoInsertRow: false,\n   * }\n   * // or\n   * ...\n   * fillHandle: { // enable plugin in vertical direction and with autoInsertRow as false\n   *   autoInsertRow: false,\n   *   direction: 'vertical' // 'vertical' or 'horizontal'\n   * }\n   * ```\n   *\n   * @type {Boolean|String|Object}\n   * @default true\n   */\n  fillHandle: true,\n\n  /**\n   * Allows to specify the number of fixed (or *frozen*) rows at the top of the table.\n   *\n   * @type {Number}\n   * @default 0\n   * @example\n   * ```js\n   * fixedRowsTop: 3 // This would freeze the top 3 rows of the table.\n   * ```\n   */\n  fixedRowsTop: 0,\n\n  /**\n   * Allows to specify the number of fixed (or *frozen*) rows at the bottom of the table.\n   *\n   * @pro\n   * @type {Number}\n   * @default 0\n   * @example\n   * ```js\n   * fixedRowsBottom: 3 // This would freeze the top 3 rows of the table.\n   * ```\n   */\n  fixedRowsBottom: 0,\n\n  /**\n   * Allows to specify the number of fixed (or *frozen*) columns on the left of the table.\n   *\n   * @type {Number}\n   * @default 0\n   * @example\n   * ```js\n   * fixedColumnsLeft: 3 // This would freeze the top 3 rows of the table.\n   * ```\n   */\n  fixedColumnsLeft: 0,\n\n  /**\n   * If `true`, mouse click outside the grid will deselect the current selection.\n   * Can be a function that takes the click event target and returns a boolean.\n   *\n   * @type {Boolean|Function}\n   * @default true\n   */\n  outsideClickDeselects: true,\n\n  /**\n   * If `true`, <kbd>ENTER</kbd> begins editing mode (like in Google Docs). If `false`, <kbd>ENTER</kbd> moves to next\n   * row (like Excel) and adds a new row if necessary. <kbd>TAB</kbd> adds new column if necessary.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  enterBeginsEditing: true,\n\n  /**\n   * Defines the cursor movement after <kbd>ENTER</kbd> was pressed (<kbd>SHIFT</kbd> + <kbd>ENTER</kbd> uses a negative vector).\n   * Can be an object or a function that returns an object. The event argument passed to the function\n   * is a DOM Event object received after the <kbd>ENTER</kbd> key has been pressed. This event object can be used to check\n   * whether user pressed <kbd>ENTER</kbd> or <kbd>SHIFT</kbd> + <kbd>ENTER</kbd>.\n   *\n   * @type {Object|Function}\n   * @default {row: 1, col: 0}\n   */\n  enterMoves: { row: 1, col: 0 },\n\n  /**\n   * Defines the cursor movement after <kbd>TAB</kbd> is pressed (<kbd>SHIFT</kbd> + <kbd>TAB</kbd> uses a negative vector).\n   * Can be an object or a function that returns an object. The event argument passed to the function\n   * is a DOM Event object received after the <kbd>TAB</kbd> key has been pressed. This event object can be used to check\n   * whether user pressed <kbd>TAB</kbd> or <kbd>SHIFT</kbd> + <kbd>TAB</kbd>.\n   *\n   * @type {Object}\n   * @default {row: 0, col: 1}\n   */\n  tabMoves: { row: 0, col: 1 },\n\n  /**\n   * If `true`, pressing <kbd>TAB</kbd> or right arrow in the last column will move to first column in next row.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  autoWrapRow: false,\n\n  /**\n   * If `true`, pressing <kbd>ENTER</kbd> or down arrow in the last row will move to the first row in the next column.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  autoWrapCol: false,\n\n  /**\n   * @description\n   * Turns on saving the state of column sorting, column positions and column sizes in local storage.\n   *\n   * You can save any sort of data in local storage to preserve table state between page reloads.\n   * In order to enable data storage mechanism, `persistentState` option must be set to `true` (you can set it\n   * either during Handsontable initialization or using the `updateSettings` method). When `persistentState` is enabled it exposes 3 hooks:\n   *\n   * __persistentStateSave__ (key: String, value: Mixed)\n   *\n   *   * Saves value under given key in browser local storage.\n   *\n   * __persistentStateLoad__ (key: String, valuePlaceholder: Object)\n   *\n   *   * Loads `value`, saved under given key, form browser local storage. The loaded `value` will be saved in `valuePlaceholder.value`\n   *     (this is due to specific behaviour of `Hooks.run()` method). If no value have been saved under key `valuePlaceholder.value`\n   *     will be `undefined`.\n   *\n   * __persistentStateReset__ (key: String)\n   *\n   *   * Clears the value saved under `key`. If no `key` is given, all values associated with table will be cleared.\n   *\n   * __Note:__ The main reason behind using `persistentState` hooks rather than regular LocalStorage API is that it\n   * ensures separation of data stored by multiple Handsontable instances. In other words, if you have two (or more)\n   * instances of Handsontable on one page, data saved by one instance won't be accessible by the second instance.\n   * Those two instances can store data under the same key and no data would be overwritten.\n   *\n   * __Important:__ In order for the data separation to work properly, make sure that each instance of Handsontable has a unique `id`.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  persistentState: void 0,\n\n  /**\n   * Class name for all visible rows in the current selection.\n   *\n   * @type {String}\n   * @default undefined\n   * @example\n   * ```js\n   * currentRowClassName: 'currentRow' // This will add a 'currentRow' class name to appropriate table cells.\n   * ```\n   */\n  currentRowClassName: void 0,\n\n  /**\n   * Class name for all visible columns in the current selection.\n   *\n   * @type {String}\n   * @default undefined\n   * @example\n   * ```js\n   * currentColClassName: 'currentColumn' // This will add a 'currentColumn' class name to appropriate table cells.\n   * ```\n   */\n  currentColClassName: void 0,\n\n  /**\n   * Class name for all visible headers in current selection.\n   *\n   * @type {String}\n   * @since 0.27.0\n   * @default 'ht__highlight'\n   * @example\n   * ```js\n   * currentHeaderClassName: 'ht__highlight' // This will add a 'ht__highlight' class name to appropriate table headers.\n   * ```\n   */\n  currentHeaderClassName: 'ht__highlight',\n\n  /**\n   * Class name for all active headers in selections. The header will be marked with this class name\n   * only when a whole column or row will be selected.\n   *\n   * @type {String}\n   * @since 0.38.2\n   * @default 'ht__active_highlight'\n   * @example\n   * ```js\n   * activeHeaderClassName: 'ht__active_highlight' // This will add a 'ht__active_highlight' class name to appropriate table headers.\n   * ```\n   */\n  activeHeaderClassName: 'ht__active_highlight',\n\n  /**\n   * Class name for the Handsontable container element.\n   *\n   * @type {String|Array}\n   * @default undefined\n   */\n  className: void 0,\n\n  /**\n   * Class name for all tables inside container element.\n   *\n   * @since 0.17.0\n   * @type {String|Array}\n   * @default undefined\n   */\n  tableClassName: void 0,\n\n  /**\n   * @description\n   * Defines how the columns react, when the declared table width is different than the calculated sum of all column widths.\n   * [See more](http://docs.handsontable.com/demo-stretching.html) mode. Possible values:\n   *  * `'none'` Disable stretching\n   *  * `'last'` Stretch only the last column\n   *  * `'all'` Stretch all the columns evenly\n   *\n   * @type {String}\n   * @default 'none'\n   */\n  stretchH: 'none',\n\n  /**\n   * Lets you overwrite the default `isEmptyRow` method, which checks if row at the provided index is empty.\n   *\n   * @type {Function}\n   * @param {Number} row Visual row index.\n   * @returns {Boolean}\n   */\n  isEmptyRow: function isEmptyRow(row) {\n    var col, colLen, value, meta;\n\n    for (col = 0, colLen = this.countCols(); col < colLen; col++) {\n      value = this.getDataAtCell(row, col);\n\n      if (value !== '' && value !== null && (0, _mixed.isDefined)(value)) {\n        if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') {\n          meta = this.getCellMeta(row, col);\n\n          return (0, _object.isObjectEqual)(this.getSchema()[meta.prop], value);\n        }\n        return false;\n      }\n    }\n\n    return true;\n  },\n\n\n  /**\n   * Lets you overwrite the default `isEmptyCol` method, which checks if column at the provided index is empty.\n   *\n   * @type {Function}\n   * @param {Number} col Visual column index\n   * @returns {Boolean}\n   */\n  isEmptyCol: function isEmptyCol(col) {\n    var row, rowLen, value;\n\n    for (row = 0, rowLen = this.countRows(); row < rowLen; row++) {\n      value = this.getDataAtCell(row, col);\n\n      if (value !== '' && value !== null && (0, _mixed.isDefined)(value)) {\n        return false;\n      }\n    }\n\n    return true;\n  },\n\n\n  /**\n   * When set to `true`, the table is re-rendered when it is detected that it was made visible in DOM.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  observeDOMVisibility: true,\n\n  /**\n   * If set to `true`, Handsontable will accept values that were marked as invalid by the cell `validator`.\n   * It will result with *invalid* cells being treated as *valid* (will save the *invalid* value into the Handsontable data source).\n   * If set to `false`, Handsontable will *not* accept the invalid values and won't allow the user to close the editor.\n   * This option will be particularly useful when used with the Autocomplete's `strict` mode.\n   *\n   * @type {Boolean}\n   * @default true\n   * @since 0.9.5\n   */\n  allowInvalid: true,\n\n  /**\n   * If set to `true`, Handsontable will accept values that are empty (`null`, `undefined` or `''`).\n   * If set to `false`, Handsontable will *not* accept the empty values and mark cell as invalid.\n   *\n   * @example\n   * ```js\n   * ...\n   * allowEmpty: true // allow empty values for all cells (whole table)\n   * ...\n   * // or\n   * ...\n   * columns: [\n   *   // allow empty values only for 'date' column\n   *   {data: 'date', dateFormat: 'DD/MM/YYYY', allowEmpty: true}\n   * ]\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   * @default true\n   * @since 0.23.0\n   */\n  allowEmpty: true,\n\n  /**\n   * CSS class name for cells that did not pass validation.\n   *\n   * @type {String}\n   * @default 'htInvalid'\n   */\n  invalidCellClassName: 'htInvalid',\n\n  /**\n   * When set to an non-empty string, displayed as the cell content for empty cells. If a value of a different type is provided,\n   * it will be stringified and applied as a string.\n   *\n   * @type {Mixed}\n   * @default false\n   */\n  placeholder: false,\n\n  /**\n   * CSS class name for cells that have a placeholder in use.\n   *\n   * @type {String}\n   * @default 'htPlaceholder'\n   */\n  placeholderCellClassName: 'htPlaceholder',\n\n  /**\n   * CSS class name for read-only cells.\n   *\n   * @type {String}\n   * @default 'htDimmed'\n   */\n  readOnlyCellClassName: 'htDimmed',\n\n  /**\n   * @description\n   * If a string is provided, it may be one of the following predefined values:\n   * * `autocomplete`,\n   * * `checkbox`,\n   * * `html`,\n   * * `numeric`,\n   * * `password`.\n   * * `text`.\n   *\n   * Or you can [register](http://docs.handsontable.com/demo-custom-renderers.html) the custom renderer under specified name and use\n   * its name as an alias in your configuration.\n   *\n   * If a function is provided, it will receive the following arguments:\n   * ```js\n   * function(instance, TD, row, col, prop, value, cellProperties) {}\n   * ```\n   *\n   * You can read more about custom renderes [in the documentation](http://docs.handsontable.com/demo-custom-renderers.html).\n   *\n   * @example\n   * ```js\n   * ...\n   * Handsontable.renderers.registerRenderer('my.renderer', function(instance, TD, row, col, prop, value, cellProperties) {\n   *   TD.innerHTML = value;\n   * });\n   * ...\n   * columns: [\n   *   {\n   *     editor: 'select',\n   *     renderer: 'autocomplete' // as string\n   *   },\n   *   {\n   *     renderer: 'my.renderer' // custom renderer as an alias\n   *   },\n   *   {\n   *     // renderer as custom function\n   *     renderer: function(hotInstance, TD, row, col, prop, value, cellProperties) {\n   *       TD.style.color = 'blue';\n   *       TD.innerHTML = value;\n   *     }\n   *   }\n   * ]\n   * ...\n   * ```\n   *\n   * @type {String|Function}\n   * @default undefined\n   */\n  renderer: void 0,\n\n  /**\n   * CSS class name added to the commented cells.\n   *\n   * @type {String}\n   * @default 'htCommentCell'\n   */\n  commentedCellClassName: 'htCommentCell',\n\n  /**\n   * If set to `true`, it enables the browser's native selection of a fragment of the text within a single cell, between adjacent cells or in a whole table.\n   * If set to `'cell'`, it enables the possibility of selecting a fragment of the text within a single cell's body.\n   *\n   * @type {Boolean|String}\n   * @default false\n   */\n  fragmentSelection: false,\n\n  /**\n   * @description\n   * Make cell [read only](http://docs.handsontable.com/demo-read-only.html).\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  readOnly: false,\n\n  /**\n   * @description\n   * When added to a `column` property, it skips the column on paste and pastes the data on the next column to the right.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  skipColumnOnPaste: false,\n\n  /**\n   * @description\n   * Setting to true enables the search plugin (see [demo](http://docs.handsontable.com/demo-search-for-values.html)).\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  search: false,\n\n  /**\n   * @description\n   * Shortcut to define the combination of the cell renderer, editor and validator for the column, cell or whole table.\n   *\n   * Possible values:\n   *  * [autocomplete](http://docs.handsontable.com/demo-autocomplete.html)\n   *  * [checkbox](http://docs.handsontable.com/demo-checkbox.html)\n   *  * [date](http://docs.handsontable.com/demo-date.html)\n   *  * [dropdown](http://docs.handsontable.com/demo-dropdown.html)\n   *  * [handsontable](http://docs.handsontable.com/demo-handsontable.html)\n   *  * [numeric](http://docs.handsontable.com/demo-numeric.html)\n   *  * [password](http://docs.handsontable.com/demo-password.html)\n   *  * text\n   *  * [time](http://docs.handsontable.com/demo-time.html)\n   *\n   * Or you can register the custom cell type under specified name and use\n   * its name as an alias in your configuration.\n   *\n   * @example\n   * ```js\n   * ...\n   * Handsontable.cellTypes.registerCellType('my.type', {\n   *   editor: MyEditorClass,\n   *   renderer: function(hot, td, row, col, prop, value, cellProperties) {\n   *     td.innerHTML = value;\n   *   },\n   *   validator: function(value, callback) {\n   *     callback(value === 'foo' ? true : false);\n   *   }\n   * });\n   * ...\n   * columns: [\n   *   {\n   *     type: 'text'\n   *   },\n   *   {\n   *     type: 'my.type' // an alias to custom type\n   *   },\n   *   {\n   *     type: 'checkbox'\n   *   }\n   * ]\n   * ...\n   * ```\n   *\n   * @type {String}\n   * @default 'text'\n   */\n  type: 'text',\n\n  /**\n   * @description\n   * Make cell copyable (pressing <kbd>CTRL</kbd> + <kbd>C</kbd> on your keyboard moves its value to system clipboard).\n   *\n   * __Note:__ this setting is `false` by default for cells with type `password`.\n   *\n   * @type {Boolean}\n   * @default true\n   * @since 0.10.2\n   */\n  copyable: true,\n\n  /**\n   * Defines the editor for the table/column/cell.\n   *\n   * If a string is provided, it may be one of the following predefined values:\n   *  * [autocomplete](http://docs.handsontable.com/demo-autocomplete.html)\n   *  * [checkbox](http://docs.handsontable.com/demo-checkbox.html)\n   *  * [date](http://docs.handsontable.com/demo-date.html)\n   *  * [dropdown](http://docs.handsontable.com/demo-dropdown.html)\n   *  * [handsontable](http://docs.handsontable.com/demo-handsontable.html)\n   *  * [mobile](http://docs.handsontable.com/demo-mobiles-and-tablets.html)\n   *  * [password](http://docs.handsontable.com/demo-password.html)\n   *  * [select](http://docs.handsontable.com/demo-select.html)\n   *  * text\n   *\n   * Or you can [register](http://docs.handsontable.com/tutorial-cell-editor.html#registering-an-editor) the custom editor under specified name and use\n   * its name as an alias in your configuration.\n   *\n   * To disable cell editing completely set `editor` property to `false`.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [\n   *   {\n   *     editor: 'select'\n   *   },\n   *   {\n   *     editor: false\n   *   }\n   * ]\n   * ...\n   * ```\n   *\n   * @type {String|Function|Boolean}\n   * @default 'text'\n   */\n  editor: void 0,\n\n  /**\n   * @description\n   * Autocomplete definitions. See [autocomplete demo](http://docs.handsontable.com/demo-autocomplete.html) for examples and definitions.\n   *\n   * @type {Array}\n   * @default undefined\n   */\n  autoComplete: void 0,\n\n  /**\n   * Control number of choices for the autocomplete (or dropdown) typed cells. After exceeding it, a scrollbar for the dropdown list of choices will appear.\n   *\n   * @since 0.18.0\n   * @type {Number}\n   * @default 10\n   */\n  visibleRows: 10,\n\n  /**\n   * Makes autocomplete or dropdown width the same as the edited cell width. If `false` then editor will be scaled\n   * according to its content.\n   *\n   * @since 0.17.0\n   * @type {Boolean}\n   * @default true\n   */\n  trimDropdown: true,\n\n  /**\n   * Setting to true enables the debug mode, currently used to test the correctness of the row and column\n   * header fixed positioning on a layer above the master table.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  debug: false,\n\n  /**\n   * When set to `true`, the text of the cell content is wrapped if it does not fit in the fixed column width.\n   *\n   * @type {Boolean}\n   * @default true\n   * @since 0.11.0\n   */\n  wordWrap: true,\n\n  /**\n   * CSS class name added to cells with cell meta `wordWrap: false`.\n   *\n   * @type {String}\n   * @default 'htNoWrap'\n   * @since 0.11.0\n   */\n  noWordWrapClassName: 'htNoWrap',\n\n  /**\n   * @description\n   * Defines if the right-click context menu should be enabled. Context menu allows to create new row or\n   * column at any place in the grid among [other features](http://docs.handsontable.com/demo-context-menu.html).\n   * Possible values:\n   * * `true` (to enable default options),\n   * * `false` (to disable completely)\n   * * an array of [predefined options](https://docs.handsontable.com/demo-context-menu.html#page-specific),\n   * * an object [with defined structure](http://docs.handsontable.com/demo-context-menu.html#page-custom)\n   *\n   * See [the context menu demo](http://docs.handsontable.com/demo-context-menu.html) for examples.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as a boolean\n   * contextMenu: true\n   * ...\n   * // as an array\n   * contextMenu: ['row_above', 'row_below', '--------', 'undo', 'redo']\n   * ...\n   * ```\n   * ...\n   * // as an object (`name` attribute is required in the custom keys)\n   * contextMenu: {\n   *   items: {\n   *     \"option1\": {\n   *       name: \"option1\"\n   *     },\n   *     \"option2\": {\n   *       name: \"option2\",\n   *       submenu: {\n   *         items: [\n   *           {\n   *             key: \"option2:suboption1\",\n   *             name: \"option2:suboption1\",\n   *             callback: function(key, options) {\n   *               ...\n   *             }\n   *           },\n   *           ...\n   *         ]\n   *       }\n   *     }\n   *   }\n   * }\n   * ...\n   * ```\n   * @type {Boolean|Array|Object}\n   * @default undefined\n   */\n  contextMenu: void 0,\n\n  /**\n   * @description\n   * Disable or enable the copy/paste functionality.\n   *\n   * @example\n   * ```js\n   * ...\n   * copyPaste: false,\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  copyPaste: true,\n\n  /**\n   * If `true`, undo/redo functionality is enabled.\n   *\n   * @type {Boolean}\n   * @default undefined\n   */\n  undo: void 0,\n\n  /**\n   * @description\n   * Turns on [Column sorting](http://docs.handsontable.com/demo-sorting-data.html).\n   * Can be either a boolean (true/false) or an object with a declared sorting options. See the below example:\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * columnSorting: true\n   * ...\n   * // as a object with initial order (sort ascending column at index 2)\n   * columnSorting: {\n   *   column: 2,\n   *   sortOrder: true, // true = ascending, false = descending, undefined = original order\n   *   sortEmptyCells: true // true = the table sorts empty cells, false = the table moves all empty cells to the end of the table\n   * }\n   * ...\n   * ```\n   *\n   * @type {Boolean|Object}\n   * @default undefined\n   */\n  columnSorting: void 0,\n\n  /**\n   * @description\n   * Turns on [Manual column move](http://docs.handsontable.com/demo-moving-rows-and-columns.html), if set to a boolean or define initial\n   * column order, if set to an array of column indexes.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * manualColumnMove: true\n   * ...\n   * // as a array with initial order (move column index at 0 to 1 and move column index at 1 to 4)\n   * manualColumnMove: [1, 4]\n   * ...\n   * ```\n   *\n   * @type {Boolean|Array}\n   * @default undefined\n   */\n  manualColumnMove: void 0,\n\n  /**\n   * @description\n   * Turns on [Manual column resize](http://docs.handsontable.com/demo-resizing.html), if set to a boolean or define initial\n   * column resized widths, if set to an array of numbers.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * manualColumnResize: true\n   * ...\n   * // as a array with initial widths (column at 0 index has 40px and column at 1 index has 50px)\n   * manualColumnResize: [40, 50]\n   * ...\n   * ```\n   *\n   * @type {Boolean|Array}\n   * @default undefined\n   */\n  manualColumnResize: void 0,\n\n  /**\n   * @description\n   * Turns on [Manual row move](http://docs.handsontable.com/demo-moving-rows-and-columns.html), if set to a boolean or define initial\n   * row order, if set to an array of row indexes.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * manualRowMove: true\n   * ...\n   * // as a array with initial order (move row index at 0 to 1 and move row index at 1 to 4)\n   * manualRowMove: [1, 4]\n   * ...\n   * ```\n   *\n   * @type {Boolean|Array}\n   * @default undefined\n   * @since 0.11.0\n   */\n  manualRowMove: void 0,\n\n  /**\n   * @description\n   * Turns on [Manual row resize](http://docs.handsontable.com/demo-resizing.html), if set to a boolean or define initial\n   * row resized heights, if set to an array of numbers.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * manualRowResize: true\n   * ...\n   * // as a array with initial heights (row at 0 index has 40px and row at 1 index has 50px)\n   * manualRowResize: [40, 50]\n   * ...\n   * ```\n   *\n   * @type {Boolean|Array}\n   * @default undefined\n   * @since 0.11.0\n   */\n  manualRowResize: void 0,\n\n  /**\n   * @description\n   * If set to `true`, it enables a possibility to merge cells. If set to an array of objects, it merges the cells provided in the objects (see the example below).\n   * [More information on the demo page.](http://docs.handsontable.com/demo-merge-cells.html)\n   *\n   * @example\n   * ```js\n   * // enables the mergeCells plugin:\n   * margeCells: true\n   * ...\n   * // declares a list of merged sections:\n   * mergeCells: [\n   *   {row: 1, col: 1, rowspan: 3, colspan: 3}, // rowspan and colspan properties declare the width and height of a merged section in cells\n   *   {row: 3, col: 4, rowspan: 2, colspan: 2},\n   *   {row: 5, col: 6, rowspan: 3, colspan: 3}\n   * ]\n   * ```\n   * @type {Boolean|Array}\n   * @default false\n   */\n  mergeCells: false,\n\n  /**\n   * Number of rows to be rendered outside of the visible part of the table.\n   * By default, it's set to `'auto'`, which makes Handsontable to attempt to calculate the best offset performance-wise.\n   *\n   * You may test out different values to find the best one that works for your specific implementation.\n   *\n   * @type {Number|String}\n   * @default 'auto'\n   */\n  viewportRowRenderingOffset: 'auto',\n\n  /**\n   * Number of columns to be rendered outside of the visible part of the table.\n   * By default, it's set to `'auto'`, which makes Handsontable try calculating the best offset performance-wise.\n   *\n   * You may experiment with the value to find the one that works best for your specific implementation.\n   *\n   * @type {Number|String}\n   * @default 'auto'\n   */\n  viewportColumnRenderingOffset: 'auto',\n\n  /**\n   * A function, regular expression or a string, which will be used in the process of cell validation.\n   * If a function is used, be sure to execute the callback argument with either `true` (`callback(true)`) if the validation passed\n   * or with `false` (`callback(false)`), if the validation failed.\n   * Note, that `this` in the function points to the `cellProperties` object.\n   *\n   * If a string is provided, it may be one of the following predefined values:\n   * * `autocomplete`,\n   * * `date`,\n   * * `numeric`,\n   * * `time`.\n   *\n   * Or you can [register](http://docs.handsontable.com/demo-data-validation.html) the validator function under specified name and use\n   * its name as an alias in your configuration.\n   *\n   * See more [in the demo](http://docs.handsontable.com/demo-data-validation.html).\n   *\n   * @example\n   * ```js\n   * // as a function\n   * columns: [\n   *    {\n   *      validator: function(value, callback) { // validation rules }\n   *    }\n   * ]\n   * ...\n   * // as a regexp\n   * columns: [\n   *    {\n   *      validator: /^[0-9]$/ // regular expression\n   *    }\n   * ]\n   * // as a string\n   * columns: [\n   *    {\n   *      validator: 'numeric'\n   *    }\n   * ]\n   * ```\n   * @type {Function|RegExp|String}\n   * @default undefined\n   * @since 0.9.5\n   */\n  validator: void 0,\n\n  /**\n   * @description\n   * Disable visual cells selection.\n   *\n   * Possible values:\n   *  * `true` - Disables any type of visual selection (current and area selection),\n   *  * `false` - Enables any type of visual selection. This is default value.\n   *  * `'current'` - Disables the selection of a currently selected cell, the area selection is still present.\n   *  * `'area'` - Disables the area selection, the currently selected cell selection is still present.\n   *  * `'header'` - Disables the headers selection, the currently selected cell selection is still present (available since 0.36.0).\n   *\n   * @type {Boolean|String|Array}\n   * @default false\n   * @since 0.13.2\n   * @example\n   * ```js\n   * ...\n   * // as boolean\n   * disableVisualSelection: true,\n   * ...\n   *\n   * ...\n   * // as string ('current', 'area' or 'header')\n   * disableVisualSelection: 'current',\n   * ...\n   *\n   * ...\n   * // as array\n   * disableVisualSelection: ['current', 'area'],\n   * ...\n   * ```\n   */\n  disableVisualSelection: false,\n\n  /**\n   * @description\n   * Set whether to display the current sorting order indicator (a triangle icon in the column header, specifying the sorting order).\n   *\n   * @type {Boolean}\n   * @default false\n   * @since 0.15.0-beta3\n   */\n  sortIndicator: void 0,\n\n  /**\n   * Disable or enable ManualColumnFreeze plugin.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  manualColumnFreeze: void 0,\n\n  /**\n   * @description\n   * Defines whether Handsontable should trim the whitespace at the beginning and the end of the cell contents.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  trimWhitespace: true,\n\n  settings: void 0,\n\n  /**\n   * @description\n   * Defines data source for Autocomplete or Dropdown cell types.\n   *\n   * @example\n   * ```js\n   * ...\n   * // source as a array\n   * columns: [{\n   *   type: 'autocomplete',\n   *   source: ['A', 'B', 'C', 'D']\n   * }]\n   * ...\n   * // source as a function\n   * columns: [{\n   *   type: 'autocomplete',\n   *   source: function(query, callback) {\n   *     fetch('http://example.com/query?q=' + query, function(response) {\n   *       callback(response.items);\n   *     })\n   *   }\n   * }]\n   * ...\n   * ```\n   *\n   * @type {Array|Function}\n   * @default undefined\n   */\n  source: void 0,\n\n  /**\n   * @description\n   * Defines the column header name.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *     title: 'First name',\n   *     type: 'text',\n   *   },\n   *   {\n   *     title: 'Last name',\n   *     type: 'text',\n   *   }]\n   * ...\n   * ```\n   *\n   * @type {String}\n   * @default undefined\n   */\n  title: void 0,\n\n  /**\n   * Data template for `'checkbox'` type when checkbox is checked.\n   *\n   * @example\n   * ```js\n   * checkedTemplate: 'good'\n   *\n   * // if a checkbox-typed cell is checked, then getDataAtCell(x,y), where x and y are the coordinates of the cell\n   * // will return 'good'.\n   * ```\n   * @type {Boolean|String}\n   * @default true\n   */\n  checkedTemplate: void 0,\n\n  /**\n   * Data template for `'checkbox'` type when checkbox is unchecked.\n   *\n   * @example\n   * ```js\n   * uncheckedTemplate: 'bad'\n   *\n   * // if a checkbox-typed cell is not checked, then getDataAtCell(x,y), where x and y are the coordinates of the cell\n   * // will return 'bad'.\n   * ```\n   * @type {Boolean|String}\n   * @default false\n   */\n  uncheckedTemplate: void 0,\n\n  /**\n   * @description\n   * Object which describes if renderer should create checkbox element with label element as a parent. Option desired for\n   * [checkbox](http://docs.handsontable.com/demo-checkbox.html)-typed cells.\n   *\n   * By default the [checkbox](http://docs.handsontable.com/demo-checkbox.html) renderer renders the checkbox without a label.\n   *\n   * Possible object properties:\n   *  * `property` - Defines the property name of the data object, which will to be used as a label.\n   *  (eg. `label: {property: 'name.last'}`). This option works only if data was passed as an array of objects.\n   *  * `position` - String which describes where to place the label text (before or after checkbox element).\n   * Valid values are `'before'` and '`after`' (defaults to `'after'`).\n   *  * `value` - String or a Function which will be used as label text.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'checkbox',\n   *   label: {position: 'after', value: 'My label: '}\n   * }]\n   * ...\n   * ```\n   *\n   * @since 0.19.0\n   * @type {Object}\n   * @default undefined\n   */\n  label: void 0,\n\n  /**\n   * Display format. This option is desired for [numeric-typed](http://docs.handsontable.com/demo-numeric.html) cells. Format is described by two properties:\n   *\n   * - pattern, which is handled by `numbro` for purpose of formatting numbers to desired pattern. List of supported patterns can be found [here](http://numbrojs.com/format.html#numbers).\n   * - culture, which is handled by `numbro` for purpose of formatting currencies. Examples showing how it works can be found [here](http://numbrojs.com/format.html#currency). List of supported cultures can be found [here](http://numbrojs.com/languages.html#supported-languages).\n   *\n   * __Note:__ Please keep in mind that this option is used only to format the displayed output! It has no effect on the input data provided for the cell. The numeric data can be entered to the table only as floats (separated by a dot or a comma) or integers, and are stored in the source dataset as JavaScript numbers.\n   *\n   * Since 0.26.0 Handsontable uses [numbro](http://numbrojs.com/) as a main library for numbers formatting.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'numeric',\n   *   numericFormat: {\n   *     pattern: '0,00',\n   *     culture: 'en-US'\n   *   }\n   * }]\n   * ...\n   * ```\n   *\n   * @since 0.35.0\n   * @type {Object}\n   */\n  numericFormat: void 0,\n\n  /**\n   * Language for Handsontable translation. Possible language codes are: `en-US`, `pl-PL`.\n   *\n   * @type {String}\n   * @default 'en-US'\n   */\n  language: void 0,\n\n  /**\n   * @description\n   * Data source for [select](http://docs.handsontable.com/demo-select.html)-typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   editor: 'select',\n   *   selectOptions: ['A', 'B', 'C'],\n   * }]\n   * ...\n   * ```\n   *\n   * @type {Array}\n   */\n  selectOptions: void 0,\n\n  /**\n   * Enables or disables the autoColumnSize plugin. Default value is `undefined`, which has the same effect as `true`.\n   * Disabling this plugin can increase performance, as no size-related calculations would be done.\n   *\n   * Column width calculations are divided into sync and async part. Each of this parts has their own advantages and\n   * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous operations don't\n   * block the browser UI.\n   *\n   * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value.\n   * `syncLimit` option is available since 0.16.0.\n   *\n   * You can also use the `useHeaders` option to take the column headers with into calculation.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as a number (300 columns in sync, rest async)\n   * autoColumnSize: {syncLimit: 300},\n   * ...\n   *\n   * ...\n   * // as a string (percent)\n   * autoColumnSize: {syncLimit: '40%'},\n   * ...\n   *\n   * ...\n   * // use headers width while calculation the column width\n   * autoColumnSize: {useHeaders: true},\n   * ...\n   *\n   * ```\n   *\n   * @type {Object|Boolean}\n   * @default {syncLimit: 50}\n   */\n  autoColumnSize: void 0,\n\n  /**\n   * Enables or disables autoRowSize plugin. Default value is `undefined`, which has the same effect as `false` (disabled).\n   * Enabling this plugin can decrease performance, as size-related calculations would be performed.\n   *\n   * Row height calculations are divided into sync and async stages. Each of these stages has their own advantages and\n   * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous operations don't\n   * block the browser UI.\n   *\n   * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value.\n   * `syncLimit` options is available since 0.16.0.\n   *\n   * @example\n   * ```js\n   * ...\n   * // as number (300 columns in sync, rest async)\n   * autoRowSize: {syncLimit: 300},\n   * ...\n   *\n   * ...\n   * // as string (percent)\n   * autoRowSize: {syncLimit: '40%'},\n   * ...\n   * ```\n   * @type {Object|Boolean}\n   * @default {syncLimit: 1000}\n   */\n  autoRowSize: void 0,\n\n  /**\n   * Date validation format.\n   *\n   * Option desired for `'date'` - typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'date',\n   *   dateFormat: 'MM/DD/YYYY'\n   * }]\n   * ...\n   * ```\n   *\n   * @type {String}\n   * @default 'DD/MM/YYYY'\n   */\n  dateFormat: void 0,\n\n  /**\n   * If `true` then dates will be automatically formatted to match the desired format.\n   *\n   * Option desired for `'date'`-typed typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'date',\n   *   dateFormat: 'YYYY-MM-DD',\n   *   correctFormat: true\n   * }]\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  correctFormat: false,\n\n  /**\n   * Definition of default value which will fill the empty cells.\n   *\n   * Option desired for `'date'`-typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'date',\n   *   defaultData: '2015-02-02'\n   * }]\n   * ...\n   * ```\n   *\n   * @type {String}\n   */\n  defaultDate: void 0,\n\n  /**\n   * If set to `true`, the value entered into the cell must match (case-sensitive) the autocomplete source. Otherwise, cell won't pass the validation.\n   * When filtering the autocomplete source list, the editor will be working in case-insensitive mode.\n   *\n   * Option desired for `autocomplete`-typed cells.\n   *\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'autocomplete',\n   *   source: ['A', 'B', 'C'],\n   *   strict: true\n   * }]\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   */\n  strict: void 0,\n\n  /**\n   * @description\n   * If typed `true`, data defined in `source` of the autocomplete or dropdown cell will be treated as HTML.\n   *\n   * __Warning:__ Enabling this option can cause serious XSS vulnerabilities.\n   *\n   * Option desired for `'autocomplete'`-typed cells.\n   * @example\n   * ```js\n   * ...\n   * columns: [{\n   *   type: 'autocomplete',\n   *   allowHtml: true,\n   *   source: ['<b>foo</b>', '<b>bar</b>']\n   * }]\n   * ...\n   * ```\n   * @type {Boolean}\n   * @default false\n   */\n  allowHtml: false,\n\n  /**\n   * If typed `true` then virtual rendering mechanism for handsontable will be disabled.\n   *\n   * @type {Boolean}\n   */\n  renderAllRows: void 0,\n\n  /**\n   * Prevents table to overlap outside the parent element. If `'horizontal'` option is chosen then table will appear horizontal\n   * scrollbar in case where parent's width is narrower then table's width.\n   *\n   * Possible values:\n   *  * `false` - Disables functionality (Default option).\n   *  * `horizontal` - Prevents horizontal overflow table.\n   *  * `vertical` - Prevents vertical overflow table (Not implemented yet).\n   *\n   * @since 0.20.3\n   * @example\n   * ```js\n   * ...\n   * preventOverflow: 'horizontal'\n   * ...\n   * ```\n   *\n   * @type {String|Boolean}\n   */\n  preventOverflow: false,\n\n  /**\n   * @description\n   * Plugin allowing binding the table rows with their headers.\n   * If the plugin is enabled, the table row headers will \"stick\" to the rows, when they are hidden/moved. Basically, if at the initialization\n   * row 0 has a header titled \"A\", it will have it no matter what you do with the table.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|String}\n   * @example\n   *\n   * ```js\n   * ...\n   * var hot = new Handsontable(document.getElementById('example'), {\n   *   date: getData(),\n   *   bindRowsWithHeaders: true\n   * });\n   * ...\n   * ```\n   *\n   */\n  bindRowsWithHeaders: void 0,\n\n  /**\n   * @description\n   * The CollapsibleColumns plugin allows collapsing of columns, covered by a header with the `colspan` property defined.\n   *\n   * Clicking the \"collapse/expand\" button collapses (or expands) all \"child\" headers except the first one.\n   *\n   * Setting the `collapsibleColumns` property to `true` will display a \"collapse/expand\" button in every header with a defined\n   * `colspan` property.\n   *\n   * To limit this functionality to a smaller group of headers, define the `collapsibleColumns` property as an array of objects, as in\n   * the example below.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Array}\n   * @example\n   * ```js\n   * ...\n   *  collapsibleColumns: [\n   *    {row: -4, col: 1, collapsible: true},\n   *    {row: -3, col: 5, collapsible: true}\n   *  ]\n   * ...\n   * // or\n   * ...\n   *  collapsibleColumns: true\n   * ...\n   * ```\n   */\n  collapsibleColumns: void 0,\n\n  /**\n   * @description\n   * Allows making pre-defined calculations on the cell values and display the results within Handsontable.\n   * See the demo for more information.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Object}\n   */\n  columnSummary: void 0,\n\n  /**\n   * This plugin allows adding a configurable dropdown menu to the table's column headers.\n   * The dropdown menu acts like the Context Menu, but is triggered by clicking the button in the header.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Object|Array}\n   */\n  dropdownMenu: void 0,\n\n  /**\n   * The filters plugin.\n   * It allows filtering the table data either by the built-in component or with the API.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean}\n   */\n  filters: void 0,\n\n  /**\n   * It allows Handsontable to process formula expressions defined in the provided data.\n   *\n   * @pro\n   * @since 1.7.0\n   * @type {Boolean}\n   */\n  formulas: void 0,\n\n  /**\n   * @description\n   * GanttChart plugin enables a possibility to create a Gantt chart using a Handsontable instance.\n   * In this case, the whole table becomes read-only.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Object}\n   */\n  ganttChart: void 0,\n\n  /**\n   * @description\n   * Allows adding a tooltip to the table headers.\n   *\n   * Available options:\n   * * the `rows` property defines if tooltips should be added to row headers,\n   * * the `columns` property defines if tooltips should be added to column headers,\n   * * the `onlyTrimmed` property defines if tooltips should be added only to headers, which content is trimmed by the header itself (the content being wider then the header).\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Object}\n   */\n  headerTooltips: void 0,\n\n  /**\n   * Plugin allowing hiding of certain columns.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Object}\n   */\n  hiddenColumns: void 0,\n\n  /**\n   * @description\n   * Plugin allowing hiding of certain rows.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Object}\n   */\n  hiddenRows: void 0,\n\n  /**\n   * @description\n   * Allows creating a nested header structure, using the HTML's colspan attribute.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Array}\n   */\n  nestedHeaders: void 0,\n\n  /**\n   * @description\n   * Plugin allowing hiding of certain rows.\n   *\n   * @pro\n   * @since 1.0.0-beta1\n   * @type {Boolean|Array}\n   */\n  trimRows: void 0,\n\n  /**\n   * @description\n   * Allows setting a custom width of the row headers. You can provide a number or an array of widths, if many row header levels are defined.\n   *\n   * @since 0.22.0\n   * @type {Number|Array}\n   */\n  rowHeaderWidth: void 0,\n\n  /**\n   * @description\n   * Allows setting a custom height of the column headers. You can provide a number or an array of heights, if many column header levels are defined.\n   *\n   * @since 0.22.0\n   * @type {Number|Array}\n   */\n  columnHeaderHeight: void 0,\n\n  /**\n   * @description\n   * Enabling this plugin switches table into one-way data binding where changes are applied into data source (from outside table)\n   * will be automatically reflected in the table.\n   *\n   * For every data change [afterChangesObserved](Hooks.html#event:afterChangesObserved) hook will be fired.\n   *\n   * @type {Boolean}\n   * @default false\n   */\n  observeChanges: void 0,\n\n  /**\n   * @description\n   * When passed to the `column` property, allows specifying a custom sorting function for the desired column.\n   *\n   * @since 0.24.0\n   * @type {Function}\n   * @example\n   * ```js\n   * columns: [\n   *   {\n   *     sortFunction: function(sortOrder) {\n   *        return function(a, b) {\n   *          // sorting function body.\n   *          //\n   *          // Function parameters:\n   *          // sortOrder: If true, the order is ascending, if false - descending. undefined = original order\n   *          // a, b: Two compared elements. These are 2-element arrays, with the first element being the row index, the second - cell value.\n   *        }\n   *     }\n   *   }\n   * ]\n   * ```\n   */\n  sortFunction: void 0,\n\n  /**\n   * If defined as 'true', the Autocomplete's suggestion list would be sorted by relevance (the closer to the left the match is, the higher the suggestion).\n   *\n   * Option desired for cells of the `'autocomplete'` type.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  sortByRelevance: true,\n\n  /**\n   * If defined as 'true', when the user types into the input area the Autocomplete's suggestion list is updated to only\n   * include those choices starting with what has been typed; if defined as 'false' all suggestions remain shown, with\n   * those matching what has been typed marked in bold.\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  filter: true,\n\n  /**\n   * If defined as 'true', filtering in the Autocomplete Editor will be case-sensitive.\n   *\n   * @type {Boolean}\n   * @default: false\n   */\n  filteringCaseSensitive: false,\n\n  /**\n   * @description\n   * Disable or enable the drag to scroll functionality.\n   *\n   * @example\n   * ```js\n   * ...\n   * dragToScroll: false,\n   * ...\n   * ```\n   *\n   * @type {Boolean}\n   * @default true\n   */\n  dragToScroll: true\n};\n\nexports.default = DefaultSettings;\n\n/***/ }),\n/* 196 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getTranslatedPhrase = getTranslatedPhrase;\n\nvar _array = __webpack_require__(1);\n\nvar _dictionariesManager = __webpack_require__(71);\n\nvar _phraseFormatters = __webpack_require__(270);\n\nvar _mixed = __webpack_require__(16);\n\n/**\n * Get phrase for specified dictionary key.\n *\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n * @param {String} dictionaryKey Constant which is dictionary key.\n * @param {*} argumentsForFormatters Arguments which will be handled by formatters.\n *\n * @returns {String}\n */\n// eslint-disable-next-line import/prefer-default-export\nfunction getTranslatedPhrase(languageCode, dictionaryKey, argumentsForFormatters) {\n  var languageDictionary = (0, _dictionariesManager.getLanguageDictionary)(languageCode);\n\n  if (languageDictionary === null) {\n    return null;\n  }\n\n  var phrasePropositions = languageDictionary[dictionaryKey];\n\n  if ((0, _mixed.isUndefined)(phrasePropositions)) {\n    return null;\n  }\n\n  var formattedPhrase = getFormattedPhrase(phrasePropositions, argumentsForFormatters);\n\n  if (Array.isArray(formattedPhrase)) {\n    return formattedPhrase[0];\n  }\n\n  return formattedPhrase;\n}\n\n/**\n * Get formatted phrase from phrases propositions for specified dictionary key.\n *\n * @private\n * @param {Array|string} phrasePropositions List of phrase propositions.\n * @param {*} argumentsForFormatters Arguments which will be handled by formatters.\n *\n * @returns {Array|string}\n */\nfunction getFormattedPhrase(phrasePropositions, argumentsForFormatters) {\n  var formattedPhrasePropositions = phrasePropositions;\n\n  (0, _array.arrayEach)((0, _phraseFormatters.getPhraseFormatters)(), function (formatter) {\n    formattedPhrasePropositions = formatter(phrasePropositions, argumentsForFormatters);\n  });\n\n  return formattedPhrasePropositions;\n}\n\n/***/ }),\n/* 197 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _templateObject = _taggedTemplateLiteral(['Language with code \"', '\" was not found. You should register particular language \\n    before using it. Read more about this issue at: https://docs.handsontable.com/i18n/missing-language-code.'], ['Language with code \"', '\" was not found. You should register particular language \\n    before using it. Read more about this issue at: https://docs.handsontable.com/i18n/missing-language-code.']);\n\nexports.extendNotExistingKeys = extendNotExistingKeys;\nexports.createCellHeadersRange = createCellHeadersRange;\nexports.normalizeLanguageCode = normalizeLanguageCode;\nexports.applyLanguageSetting = applyLanguageSetting;\nexports.warnUserAboutLanguageRegistration = warnUserAboutLanguageRegistration;\n\nvar _mixed = __webpack_require__(16);\n\nvar _object = __webpack_require__(2);\n\nvar _console = __webpack_require__(56);\n\nvar _templateLiteralTag = __webpack_require__(41);\n\nvar _dictionariesManager = __webpack_require__(71);\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\n/**\n * Perform shallow extend of a target object with only this extension's properties which doesn't exist in the target.\n *\n * @param {Object} target An object that will receive the new properties.\n * @param {Object} extension An object containing additional properties to merge into the target.\n */\n// TODO: Maybe it should be moved to global helpers? It's changed `extend` function.\nfunction extendNotExistingKeys(target, extension) {\n  (0, _object.objectEach)(extension, function (value, key) {\n    if ((0, _mixed.isUndefined)(target[key])) {\n      target[key] = value;\n    }\n  });\n\n  return target;\n}\n\n/**\n * Create range of values basing on cell indexes. For example, it will create below ranges for specified function arguments:\n *\n * createCellHeadersRange(2, 7) => `2-7`\n * createCellHeadersRange(7, 2) => `2-7`\n * createCellHeadersRange(0, 4, 'A', 'D') => `A-D`\n * createCellHeadersRange(4, 0, 'D', 'A') => `A-D`\n *\n * @param {number} firstRowIndex Index of \"first\" cell\n * @param {number} nextRowIndex Index of \"next\" cell\n * @param {*} fromValue Value which will represent \"first\" cell\n * @param {*} toValue Value which will represent \"next\" cell\n * @returns {String} Value representing range i.e. A-Z, 11-15.\n */\nfunction createCellHeadersRange(firstRowIndex, nextRowIndex) {\n  var fromValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : firstRowIndex;\n  var toValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : nextRowIndex;\n\n  // Will swap `fromValue` with `toValue` if it's necessary.\n  if (firstRowIndex > nextRowIndex) {\n    var _ref = [toValue, fromValue];\n    fromValue = _ref[0];\n    toValue = _ref[1];\n  }\n\n  return fromValue + '-' + toValue;\n}\n\n/**\n * Normalize language code. It takes handled languageCode proposition and change it to proper languageCode.\n * For example, when it takes `eN-us` as parameter it return `en-US`\n *\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n * @returns {String}\n */\nfunction normalizeLanguageCode(languageCode) {\n  var languageCodePattern = /^([a-zA-Z]{2})-([a-zA-Z]{2})$/;\n  var partsOfLanguageCode = languageCodePattern.exec(languageCode);\n\n  if (partsOfLanguageCode) {\n    return partsOfLanguageCode[1].toLowerCase() + '-' + partsOfLanguageCode[2].toUpperCase();\n  }\n\n  return languageCode;\n}\n\n/**\n * Set proper start language code. User may set language code which is not proper.\n *\n * @param {Object} settings Settings object.\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n * @returns {String}\n */\nfunction applyLanguageSetting(settings, languageCode) {\n  var normalizedLanguageCode = normalizeLanguageCode(languageCode);\n\n  if ((0, _dictionariesManager.hasLanguageDictionary)(normalizedLanguageCode)) {\n    settings.language = normalizedLanguageCode;\n  } else {\n    settings.language = _dictionariesManager.DEFAULT_LANGUAGE_CODE;\n\n    warnUserAboutLanguageRegistration(languageCode);\n  }\n}\n\n/**\n *\n * Warn user if there is no registered language.\n *\n * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n */\nfunction warnUserAboutLanguageRegistration(languageCode) {\n  if ((0, _mixed.isDefined)(languageCode)) {\n    (0, _console.error)((0, _templateLiteralTag.toSingleLine)(_templateObject, languageCode));\n  }\n}\n\n/***/ }),\n/* 198 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.stopObserving = exports.startObserving = exports.isPressedCtrlKey = exports.isPressed = exports._resetState = exports._getRefCount = undefined;\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _unicode = __webpack_require__(21);\n\nvar _array = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar eventManager = new _eventManager2.default();\nvar pressedKeys = new Set();\nvar refCount = 0;\n\n/**\n * Begins observing keyboard keys states.\n */\nfunction startObserving() {\n  if (refCount === 0) {\n    eventManager.addEventListener(document, 'keydown', function (event) {\n      if (!pressedKeys.has(event.keyCode)) {\n        pressedKeys.add(event.keyCode);\n      }\n    });\n    eventManager.addEventListener(document, 'keyup', function (event) {\n      if (pressedKeys.has(event.keyCode)) {\n        pressedKeys.delete(event.keyCode);\n      }\n    });\n    eventManager.addEventListener(document, 'visibilitychange', function () {\n      if (document.hidden) {\n        pressedKeys.clear();\n      }\n    });\n  }\n\n  refCount += 1;\n}\n\n/**\n * Stops observing keyboard keys states and clear all previously saved states.\n */\nfunction stopObserving() {\n  if (refCount > 0) {\n    refCount -= 1;\n  }\n\n  if (refCount === 0) {\n    _resetState();\n  }\n}\n\n/**\n * Remove all listeners attached to the DOM and clear all previously saved states.\n */\nfunction _resetState() {\n  eventManager.clearEvents();\n  pressedKeys.clear();\n  refCount = 0;\n}\n\n/**\n * Checks if provided keyCode or keyCodes are pressed.\n *\n * @param {String} keyCodes The key codes passed as a string defined in helpers/unicode.js file delimited with '|'.\n * @return {Boolean}\n */\nfunction isPressed(keyCodes) {\n  return Array.from(pressedKeys.values()).some(function (_keyCode) {\n    return (0, _unicode.isKey)(_keyCode, keyCodes);\n  });\n}\n\n/**\n * Checks if ctrl keys are pressed.\n *\n * @return {Boolean}\n */\nfunction isPressedCtrlKey() {\n  return Array.from(pressedKeys.values()).some(function (_keyCode) {\n    return (0, _unicode.isCtrlMetaKey)(_keyCode);\n  });\n}\n\n/**\n * Returns reference count. Useful for debugging and testing purposes.\n *\n * @return {Number}\n */\nfunction _getRefCount() {\n  return refCount;\n}\n\nexports._getRefCount = _getRefCount;\nexports._resetState = _resetState;\nexports.isPressed = isPressed;\nexports.isPressedCtrlKey = isPressedCtrlKey;\nexports.startObserving = startObserving;\nexports.stopObserving = stopObserving;\n\n/***/ }),\n/* 199 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.HEADER_TYPE = exports.FILL_TYPE = exports.CELL_TYPE = exports.AREA_TYPE = exports.ACTIVE_HEADER_TYPE = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _types = __webpack_require__(273);\n\nvar _array = __webpack_require__(1);\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ACTIVE_HEADER_TYPE = exports.ACTIVE_HEADER_TYPE = 'active-header';\nvar AREA_TYPE = exports.AREA_TYPE = 'area';\nvar CELL_TYPE = exports.CELL_TYPE = 'cell';\nvar FILL_TYPE = exports.FILL_TYPE = 'fill';\nvar HEADER_TYPE = exports.HEADER_TYPE = 'header';\n\n/**\n * Highlight class responsible for managing Walkontable Selection classes.\n *\n * With Highlight object you can manipulate four different highlight types:\n *  - `cell` can be added only to a single cell at a time and it defines currently selected cell;\n *  - `fill` can occur only once and its highlight defines selection of autofill functionality (managed by the plugin with the same name);\n *  - `areas` can be added to multiple cells at a time. This type highlights selected cell or multiple cells.\n *    The multiple cells have to be defined as an uninterrupted order (regular shape). Otherwise, the new layer of\n *    that type should be created to manage not-consecutive selection;\n *  - `header` can occur multiple times. This type is designed to highlight only headers. Like `area` type it\n *    can appear with multiple highlights (accessed under different level layers).\n *\n * @class Highlight\n * @util\n */\n\nvar Highlight = function () {\n  function Highlight(options) {\n    _classCallCheck(this, Highlight);\n\n    /**\n     * Options consumed by Highlight class and Walkontable Selection classes.\n     *\n     * @type {Object}\n     */\n    this.options = options;\n    /**\n     * The property which describes which layer level of the visual selection will be modified.\n     * This option is valid only for `area` and `header` highlight types which occurs multiple times on\n     * the table (as a non-consecutive selection).\n     *\n     * An order of the layers is the same as the order of added new non-consecutive selections.\n     *\n     * @type {Number}\n     * @default 0\n     */\n    this.layerLevel = 0;\n    /**\n     * `cell` highlight object which describes attributes for the currently selected cell.\n     * It can only occur only once on the table.\n     *\n     * @type {Selection}\n     */\n    this.cell = (0, _types.createHighlight)(CELL_TYPE, options);\n    /**\n     * `fill` highlight object which describes attributes for the borders for autofill functionality.\n     * It can only occur only once on the table.\n     *\n     * @type {Selection}\n     */\n    this.fill = (0, _types.createHighlight)(FILL_TYPE, options);\n    /**\n     * Collection of the `area` highlights. That objects describes attributes for the borders and selection of\n     * the multiple selected cells. It can occur multiple times on the table.\n     *\n     * @type {Map.<number, Selection>}\n     */\n    this.areas = new Map();\n    /**\n     * Collection of the `header` highlights. That objects describes attributes for the selection of\n     * the multiple selected rows and columns in the table header. It can occur multiple times on the table.\n     *\n     * @type {Map.<number, Selection>}\n     */\n    this.headers = new Map();\n    /**\n     * Collection of the `active-header` highlights. That objects describes attributes for the selection of\n     * the multiple selected rows and columns in the table header. The table headers which have selected all items in\n     * a row will be marked as `active-header`.\n     *\n     * @type {Map.<number, Selection>}\n     */\n    this.activeHeaders = new Map();\n    /**\n     * The temporary property, holder for borders added through CustomBorders plugin.\n     *\n     * @type {Selection[]}\n     */\n    this.borders = [];\n  }\n\n  /**\n   * Check if highlight cell rendering is disabled for specyfied highlight type.\n   *\n   * @param {String} highlightType Highlight type. Possible values are: `cell`, `area`, `fill` or `header`.\n   * @return {Boolean}\n   */\n\n\n  _createClass(Highlight, [{\n    key: 'isEnabledFor',\n    value: function isEnabledFor(highlightType) {\n      var disableHighlight = this.options.disableHighlight;\n\n      // Legacy compatibility.\n      if (highlightType === 'current') {\n        highlightType = CELL_TYPE;\n      }\n\n      if (typeof disableHighlight === 'string') {\n        disableHighlight = [disableHighlight];\n      }\n\n      return disableHighlight === false || Array.isArray(disableHighlight) && !disableHighlight.includes(highlightType);\n    }\n\n    /**\n     * Set a new layer level to make access to the desire `area` and `header` highlights.\n     *\n     * @param {Number} [level=0] Layer level to use.\n     * @returns {Highlight}\n     */\n\n  }, {\n    key: 'useLayerLevel',\n    value: function useLayerLevel() {\n      var level = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n      this.layerLevel = level;\n\n      return this;\n    }\n\n    /**\n     * Get Walkontable Selection instance created for controlling highlight of the currently selected/edited cell.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'getCell',\n    value: function getCell() {\n      return this.cell;\n    }\n\n    /**\n     * Get Walkontable Selection instance created for controlling highlight of the autofill functionality.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'getFill',\n    value: function getFill() {\n      return this.fill;\n    }\n\n    /**\n     * Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight\n     * of the multiple selected cells.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'createOrGetArea',\n    value: function createOrGetArea() {\n      var layerLevel = this.layerLevel;\n      var area = void 0;\n\n      if (this.areas.has(layerLevel)) {\n        area = this.areas.get(layerLevel);\n      } else {\n        area = (0, _types.createHighlight)(AREA_TYPE, Object.assign({ layerLevel: layerLevel }, this.options));\n\n        this.areas.set(layerLevel, area);\n      }\n\n      return area;\n    }\n\n    /**\n     * Get all Walkontable Selection instances which describes the state of the visual highlight of the cells.\n     *\n     * @return {Selection[]}\n     */\n\n  }, {\n    key: 'getAreas',\n    value: function getAreas() {\n      return [].concat(_toConsumableArray(this.areas.values()));\n    }\n\n    /**\n     * Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight\n     * of the multiple selected header cells.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'createOrGetHeader',\n    value: function createOrGetHeader() {\n      var layerLevel = this.layerLevel;\n      var header = void 0;\n\n      if (this.headers.has(layerLevel)) {\n        header = this.headers.get(layerLevel);\n      } else {\n        header = (0, _types.createHighlight)(HEADER_TYPE, Object.assign({}, this.options));\n\n        this.headers.set(layerLevel, header);\n      }\n\n      return header;\n    }\n\n    /**\n     * Get all Walkontable Selection instances which describes the state of the visual highlight of the headers.\n     *\n     * @return {Selection[]}\n     */\n\n  }, {\n    key: 'getHeaders',\n    value: function getHeaders() {\n      return [].concat(_toConsumableArray(this.headers.values()));\n    }\n\n    /**\n     * Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight\n     * of the multiple selected active header cells.\n     *\n     * @return {Selection}\n     */\n\n  }, {\n    key: 'createOrGetActiveHeader',\n    value: function createOrGetActiveHeader() {\n      var layerLevel = this.layerLevel;\n      var header = void 0;\n\n      if (this.activeHeaders.has(layerLevel)) {\n        header = this.activeHeaders.get(layerLevel);\n      } else {\n        header = (0, _types.createHighlight)(ACTIVE_HEADER_TYPE, Object.assign({}, this.options));\n\n        this.activeHeaders.set(layerLevel, header);\n      }\n\n      return header;\n    }\n\n    /**\n     * Get all Walkontable Selection instances which describes the state of the visual highlight of the active headers.\n     *\n     * @return {Selection[]}\n     */\n\n  }, {\n    key: 'getActiveHeaders',\n    value: function getActiveHeaders() {\n      return [].concat(_toConsumableArray(this.activeHeaders.values()));\n    }\n\n    /**\n     * Perform cleaning visual highlights for the whole table.\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.cell.clear();\n      this.fill.clear();\n\n      (0, _array.arrayEach)(this.areas.values(), function (highlight) {\n        return void highlight.clear();\n      });\n      (0, _array.arrayEach)(this.headers.values(), function (highlight) {\n        return void highlight.clear();\n      });\n      (0, _array.arrayEach)(this.activeHeaders.values(), function (highlight) {\n        return void highlight.clear();\n      });\n    }\n\n    /**\n     * This object can be iterate over using `for of` syntax or using internal `arrayEach` helper.\n     */\n\n  }, {\n    key: Symbol.iterator,\n    value: function value() {\n      return [this.cell, this.fill].concat(_toConsumableArray(this.areas.values()), _toConsumableArray(this.headers.values()), _toConsumableArray(this.activeHeaders.values()), _toConsumableArray(this.borders))[Symbol.iterator]();\n    }\n  }]);\n\n  return Highlight;\n}();\n\nexports.default = Highlight;\n\n/***/ }),\n/* 200 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _mixed = __webpack_require__(16);\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class SamplesGenerator\n * @util\n */\nvar SamplesGenerator = function () {\n  _createClass(SamplesGenerator, null, [{\n    key: 'SAMPLE_COUNT',\n\n    /**\n     * Number of samples to take of each value length.\n     *\n     * @type {Number}\n     */\n    get: function get() {\n      return 3;\n    }\n  }]);\n\n  function SamplesGenerator(dataFactory) {\n    _classCallCheck(this, SamplesGenerator);\n\n    /**\n     * Samples prepared for calculations.\n     *\n     * @type {Map}\n     * @default {null}\n     */\n    this.samples = null;\n    /**\n     * Function which give the data to collect samples.\n     *\n     * @type {Function}\n     */\n    this.dataFactory = dataFactory;\n    /**\n     * Custom number of samples to take of each value length.\n     *\n     * @type {Number}\n     * @default {null}\n     */\n    this.customSampleCount = null;\n    /**\n     * `true` if duplicate samples collection should be allowed, `false` otherwise.\n     *\n     * @type {Boolean}\n     * @default {false}\n     */\n    this.allowDuplicates = false;\n  }\n\n  /**\n   * Get the sample count for this instance.\n   *\n   * @returns {Number}\n   */\n\n\n  _createClass(SamplesGenerator, [{\n    key: 'getSampleCount',\n    value: function getSampleCount() {\n      if (this.customSampleCount) {\n        return this.customSampleCount;\n      }\n      return SamplesGenerator.SAMPLE_COUNT;\n    }\n  }, {\n    key: 'setSampleCount',\n\n\n    /**\n     * Set the sample count.\n     *\n     * @param {Number} sampleCount Number of samples to be collected.\n     */\n    value: function setSampleCount(sampleCount) {\n      this.customSampleCount = sampleCount;\n    }\n\n    /**\n     * Set if the generator should accept duplicate values.\n     *\n     * @param {Boolean} allowDuplicates `true` to allow duplicate values.\n     */\n\n  }, {\n    key: 'setAllowDuplicates',\n    value: function setAllowDuplicates(allowDuplicates) {\n      this.allowDuplicates = allowDuplicates;\n    }\n\n    /**\n     * Generate samples for row. You can control which area should be sampled by passing `rowRange` object and `colRange` object.\n     *\n     * @param {Object|Number} rowRange\n     * @param {Object} colRange\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'generateRowSamples',\n    value: function generateRowSamples(rowRange, colRange) {\n      return this.generateSamples('row', colRange, rowRange);\n    }\n\n    /**\n     * Generate samples for column. You can control which area should be sampled by passing `colRange` object and `rowRange` object.\n     *\n     * @param {Object} colRange Column index.\n     * @param {Object} rowRange Column index.\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'generateColumnSamples',\n    value: function generateColumnSamples(colRange, rowRange) {\n      return this.generateSamples('col', rowRange, colRange);\n    }\n\n    /**\n     * Generate collection of samples.\n     *\n     * @param {String} type Type to generate. Can be `col` or `row`.\n     * @param {Object} range\n     * @param {Object|Number} specifierRange\n     * @returns {Map}\n     */\n\n  }, {\n    key: 'generateSamples',\n    value: function generateSamples(type, range, specifierRange) {\n      var _this = this;\n\n      var samples = new Map();\n\n      if (typeof specifierRange === 'number') {\n        specifierRange = { from: specifierRange, to: specifierRange };\n      }\n      (0, _number.rangeEach)(specifierRange.from, specifierRange.to, function (index) {\n        var sample = _this.generateSample(type, range, index);\n\n        samples.set(index, sample);\n      });\n\n      return samples;\n    }\n\n    /**\n     * Generate sample for specified type (`row` or `col`).\n     *\n     * @param {String} type Samples type `row` or `col`.\n     * @param {Object} range\n     * @param {Number} specifierValue\n     * @returns {Map}\n     */\n\n  }, {\n    key: 'generateSample',\n    value: function generateSample(type, range, specifierValue) {\n      var _this2 = this;\n\n      var samples = new Map();\n      var sampledValues = [];\n      var length = void 0;\n\n      (0, _number.rangeEach)(range.from, range.to, function (index) {\n        var value = void 0;\n\n        if (type === 'row') {\n          value = _this2.dataFactory(specifierValue, index);\n        } else if (type === 'col') {\n          value = _this2.dataFactory(index, specifierValue);\n        } else {\n          throw new Error('Unsupported sample type');\n        }\n\n        if ((0, _object.isObject)(value)) {\n          length = Object.keys(value).length;\n        } else if (Array.isArray(value)) {\n          length = value.length;\n        } else {\n          length = (0, _mixed.stringify)(value).length;\n        }\n\n        if (!samples.has(length)) {\n          samples.set(length, {\n            needed: _this2.getSampleCount(),\n            strings: []\n          });\n        }\n        var sample = samples.get(length);\n\n        if (sample.needed) {\n          var duplicate = sampledValues.indexOf(value) > -1;\n\n          if (!duplicate || _this2.allowDuplicates) {\n            var computedKey = type === 'row' ? 'col' : 'row';\n\n            sample.strings.push(_defineProperty({ value: value }, computedKey, index));\n            sampledValues.push(value);\n            sample.needed--;\n          }\n        }\n      });\n\n      return samples;\n    }\n  }]);\n\n  return SamplesGenerator;\n}();\n\nexports.default = SamplesGenerator;\n\n/***/ }),\n/* 201 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar MIXIN_NAME = 'arrayMapper';\n\n/**\n * @type {Object}\n */\nvar arrayMapper = {\n  _arrayMap: [],\n\n  /**\n   * Get translated index by its physical index.\n   *\n   * @param {Number} physicalIndex Physical index.\n   * @return {Number|null} Returns translated index mapped by passed physical index.\n   */\n  getValueByIndex: function getValueByIndex(physicalIndex) {\n    var length = this._arrayMap.length;\n    var translatedIndex = null;\n\n    if (physicalIndex < length) {\n      translatedIndex = this._arrayMap[physicalIndex];\n    }\n\n    return translatedIndex;\n  },\n\n\n  /**\n   * Get physical index by its translated index.\n   *\n   * @param {*} translatedIndex Value to search.\n   * @returns {Number|null} Returns a physical index of the array mapper.\n   */\n  getIndexByValue: function getIndexByValue(translatedIndex) {\n    var physicalIndex = void 0;\n\n    // eslint-disable-next-line no-cond-assign, no-return-assign\n    return (physicalIndex = this._arrayMap.indexOf(translatedIndex)) === -1 ? null : physicalIndex;\n  },\n\n\n  /**\n   * Insert new items to array mapper starting at passed index. New entries will be a continuation of last value in the array.\n   *\n   * @param {Number} physicalIndex Array index.\n   * @param {Number} [amount=1] Defines how many items will be created to an array.\n   * @returns {Array} Returns added items.\n   */\n  insertItems: function insertItems(physicalIndex) {\n    var _this = this;\n\n    var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n    var newIndex = (0, _array.arrayMax)(this._arrayMap) + 1;\n    var addedItems = [];\n\n    (0, _number.rangeEach)(amount - 1, function (count) {\n      addedItems.push(_this._arrayMap.splice(physicalIndex + count, 0, newIndex + count));\n    });\n\n    return addedItems;\n  },\n\n\n  /**\n   * Remove items from array mapper.\n   *\n   * @param {Number} physicalIndex Array index.\n   * @param {Number} [amount=1] Defines how many items will be created to an array.\n   * @returns {Array} Returns removed items.\n   */\n  removeItems: function removeItems(physicalIndex) {\n    var _this2 = this;\n\n    var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n    var removedItems = [];\n\n    if (Array.isArray(physicalIndex)) {\n      var mapCopy = [].concat(this._arrayMap);\n\n      // Sort descending\n      physicalIndex.sort(function (a, b) {\n        return b - a;\n      });\n\n      removedItems = (0, _array.arrayReduce)(physicalIndex, function (acc, item) {\n        _this2._arrayMap.splice(item, 1);\n\n        return acc.concat(mapCopy.slice(item, item + 1));\n      }, []);\n    } else {\n      removedItems = this._arrayMap.splice(physicalIndex, amount);\n    }\n\n    return removedItems;\n  },\n\n\n  /**\n   * Unshift items (remove and shift chunk of array to the left).\n   *\n   * @param {Number|Array} physicalIndex Array index or Array of indexes to unshift.\n   * @param {Number} [amount=1] Defines how many items will be removed from an array (when index is passed as number).\n   */\n  unshiftItems: function unshiftItems(physicalIndex) {\n    var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n    var removedItems = this.removeItems(physicalIndex, amount);\n\n    function countRowShift(logicalRow) {\n      // Todo: compare perf between reduce vs sort->each->brake\n      return (0, _array.arrayReduce)(removedItems, function (count, removedLogicalRow) {\n        if (logicalRow > removedLogicalRow) {\n          count++;\n        }\n\n        return count;\n      }, 0);\n    }\n\n    this._arrayMap = (0, _array.arrayMap)(this._arrayMap, function (logicalRow, physicalRow) {\n      var rowShift = countRowShift(logicalRow);\n\n      if (rowShift) {\n        logicalRow -= rowShift;\n      }\n\n      return logicalRow;\n    });\n  },\n\n\n  /**\n   * Shift (right shifting) items starting at passed index.\n   *\n   * @param {Number} physicalIndex Array index.\n   * @param {Number} [amount=1] Defines how many items will be created to an array.\n   */\n  shiftItems: function shiftItems(physicalIndex) {\n    var _this3 = this;\n\n    var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\n    this._arrayMap = (0, _array.arrayMap)(this._arrayMap, function (row) {\n      if (row >= physicalIndex) {\n        row += amount;\n      }\n      return row;\n    });\n\n    (0, _number.rangeEach)(amount - 1, function (count) {\n      _this3._arrayMap.splice(physicalIndex + count, 0, physicalIndex + count);\n    });\n  },\n\n\n  /**\n   * Swap indexes in arrayMapper.\n   *\n   * @param {Number} physicalIndexFrom index to move.\n   * @param {Number} physicalIndexTo index to.\n   */\n  swapIndexes: function swapIndexes(physicalIndexFrom, physicalIndexTo) {\n    var _arrayMap;\n\n    (_arrayMap = this._arrayMap).splice.apply(_arrayMap, [physicalIndexTo, 0].concat(_toConsumableArray(this._arrayMap.splice(physicalIndexFrom, 1))));\n  },\n\n\n  /**\n   * Clear all stored index<->value information from an array.\n   */\n  clearMap: function clearMap() {\n    this._arrayMap.length = 0;\n  }\n};\n\n(0, _object.defineGetter)(arrayMapper, 'MIXIN_NAME', MIXIN_NAME, {\n  writable: false,\n  enumerable: false\n});\n\nexports.default = arrayMapper;\n\n/***/ }),\n/* 202 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _number = __webpack_require__(5);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar STATE_INITIALIZED = 0;\nvar STATE_BUILT = 1;\nvar STATE_APPENDED = 2;\nvar UNIT = 'px';\n\n/**\n * @class\n * @private\n */\n\nvar BaseUI = function () {\n  function BaseUI(hotInstance) {\n    _classCallCheck(this, BaseUI);\n\n    /**\n     * Instance of Handsontable.\n     *\n     * @type {Core}\n     */\n    this.hot = hotInstance;\n    /**\n     * DOM element representing the ui element.\n     *\n     * @type {HTMLElement}\n     * @private\n     */\n    this._element = null;\n    /**\n     * Flag which determines build state of element.\n     *\n     * @type {Boolean}\n     */\n    this.state = STATE_INITIALIZED;\n  }\n\n  /**\n   * Add created UI elements to table.\n   *\n   * @param {HTMLElement} wrapper Element which are parent for our UI element.\n   */\n\n\n  _createClass(BaseUI, [{\n    key: 'appendTo',\n    value: function appendTo(wrapper) {\n      wrapper.appendChild(this._element);\n\n      this.state = STATE_APPENDED;\n    }\n\n    /**\n     * Method for create UI element. Only create, without append to table.\n     */\n\n  }, {\n    key: 'build',\n    value: function build() {\n      this._element = document.createElement('div');\n      this.state = STATE_BUILT;\n    }\n\n    /**\n     * Method for remove UI element.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.isAppended()) {\n        this._element.parentElement.removeChild(this._element);\n      }\n\n      this._element = null;\n      this.state = STATE_INITIALIZED;\n    }\n\n    /**\n     * Check if UI element are appended.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isAppended',\n    value: function isAppended() {\n      return this.state === STATE_APPENDED;\n    }\n\n    /**\n     * Check if UI element are built.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isBuilt',\n    value: function isBuilt() {\n      return this.state >= STATE_BUILT;\n    }\n\n    /**\n     * Setter for position.\n     *\n     * @param {Number} top New top position of the element.\n     * @param {Number} left New left position of the element.\n     */\n\n  }, {\n    key: 'setPosition',\n    value: function setPosition(top, left) {\n      if ((0, _number.isNumeric)(top)) {\n        this._element.style.top = top + UNIT;\n      }\n      if ((0, _number.isNumeric)(left)) {\n        this._element.style.left = left + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element position.\n     *\n     * @returns {Object} Object contains left and top position of the element.\n     */\n\n  }, {\n    key: 'getPosition',\n    value: function getPosition() {\n      return {\n        top: this._element.style.top ? parseInt(this._element.style.top, 10) : 0,\n        left: this._element.style.left ? parseInt(this._element.style.left, 10) : 0\n      };\n    }\n\n    /**\n     * Setter for the element size.\n     *\n     * @param {Number} width New width of the element.\n     * @param {Number} height New height of the element.\n     */\n\n  }, {\n    key: 'setSize',\n    value: function setSize(width, height) {\n      if ((0, _number.isNumeric)(width)) {\n        this._element.style.width = width + UNIT;\n      }\n      if ((0, _number.isNumeric)(height)) {\n        this._element.style.height = height + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element position.\n     *\n     * @returns {Object} Object contains height and width of the element.\n     */\n\n  }, {\n    key: 'getSize',\n    value: function getSize() {\n      return {\n        width: this._element.style.width ? parseInt(this._element.style.width, 10) : 0,\n        height: this._element.style.height ? parseInt(this._element.style.height, 10) : 0\n      };\n    }\n\n    /**\n     * Setter for the element offset. Offset means marginTop and marginLeft of the element.\n     *\n     * @param {Number} top New margin top of the element.\n     * @param {Number} left New margin left of the element.\n     */\n\n  }, {\n    key: 'setOffset',\n    value: function setOffset(top, left) {\n      if ((0, _number.isNumeric)(top)) {\n        this._element.style.marginTop = top + UNIT;\n      }\n      if ((0, _number.isNumeric)(left)) {\n        this._element.style.marginLeft = left + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element offset.\n     *\n     * @returns {Object} Object contains top and left offset of the element.\n     */\n\n  }, {\n    key: 'getOffset',\n    value: function getOffset() {\n      return {\n        top: this._element.style.marginTop ? parseInt(this._element.style.marginTop, 10) : 0,\n        left: this._element.style.marginLeft ? parseInt(this._element.style.marginLeft, 10) : 0\n      };\n    }\n  }]);\n\n  return BaseUI;\n}();\n\nexports.default = BaseUI;\n\n/***/ }),\n/* 203 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar STATE_INITIALIZED = 0;\nvar STATE_BUILT = 1;\nvar STATE_APPENDED = 2;\nvar UNIT = 'px';\n\n/**\n * @class\n * @private\n */\n\nvar BaseUI = function () {\n  function BaseUI(hotInstance) {\n    _classCallCheck(this, BaseUI);\n\n    /**\n     * Instance of Handsontable.\n     *\n     * @type {Core}\n     */\n    this.hot = hotInstance;\n    /**\n     * DOM element representing the ui element.\n     *\n     * @type {HTMLElement}\n     * @private\n     */\n    this._element = null;\n    /**\n     * Flag which determines build state of element.\n     *\n     * @type {Boolean}\n     */\n    this.state = STATE_INITIALIZED;\n  }\n\n  /**\n   * Add created UI elements to table.\n   *\n   * @param {HTMLElement} wrapper Element which are parent for our UI element.\n   */\n\n\n  _createClass(BaseUI, [{\n    key: 'appendTo',\n    value: function appendTo(wrapper) {\n      wrapper.appendChild(this._element);\n\n      this.state = STATE_APPENDED;\n    }\n\n    /**\n     * Method for create UI element. Only create, without append to table.\n     */\n\n  }, {\n    key: 'build',\n    value: function build() {\n      this._element = document.createElement('div');\n      this.state = STATE_BUILT;\n    }\n\n    /**\n     * Method for remove UI element.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.isAppended()) {\n        this._element.parentElement.removeChild(this._element);\n      }\n\n      this._element = null;\n      this.state = STATE_INITIALIZED;\n    }\n\n    /**\n     * Check if UI element are appended.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isAppended',\n    value: function isAppended() {\n      return this.state === STATE_APPENDED;\n    }\n\n    /**\n     * Check if UI element are built.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isBuilt',\n    value: function isBuilt() {\n      return this.state >= STATE_BUILT;\n    }\n\n    /**\n     * Setter for position.\n     *\n     * @param {Number} top New top position of the element.\n     * @param {Number} left New left position of the element.\n     */\n\n  }, {\n    key: 'setPosition',\n    value: function setPosition(top, left) {\n      if (top !== void 0) {\n        this._element.style.top = top + UNIT;\n      }\n      if (left !== void 0) {\n        this._element.style.left = left + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element position.\n     *\n     * @returns {Object} Object contains left and top position of the element.\n     */\n\n  }, {\n    key: 'getPosition',\n    value: function getPosition() {\n      return {\n        top: this._element.style.top ? parseInt(this._element.style.top, 10) : 0,\n        left: this._element.style.left ? parseInt(this._element.style.left, 10) : 0\n      };\n    }\n\n    /**\n     * Setter for the element size.\n     *\n     * @param {Number} width New width of the element.\n     * @param {Number} height New height of the element.\n     */\n\n  }, {\n    key: 'setSize',\n    value: function setSize(width, height) {\n      if (width) {\n        this._element.style.width = width + UNIT;\n      }\n      if (height) {\n        this._element.style.height = height + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element position.\n     *\n     * @returns {Object} Object contains height and width of the element.\n     */\n\n  }, {\n    key: 'getSize',\n    value: function getSize() {\n      return {\n        width: this._element.style.width ? parseInt(this._element.style.width, 10) : 0,\n        height: this._element.style.height ? parseInt(this._element.style.height, 10) : 0\n      };\n    }\n\n    /**\n     * Setter for the element offset. Offset means marginTop and marginLeft of the element.\n     *\n     * @param {Number} top New margin top of the element.\n     * @param {Number} left New margin left of the element.\n     */\n\n  }, {\n    key: 'setOffset',\n    value: function setOffset(top, left) {\n      if (top) {\n        this._element.style.marginTop = top + UNIT;\n      }\n      if (left) {\n        this._element.style.marginLeft = left + UNIT;\n      }\n    }\n\n    /**\n     * Getter for the element offset.\n     *\n     * @returns {Object} Object contains top and left offset of the element.\n     */\n\n  }, {\n    key: 'getOffset',\n    value: function getOffset() {\n      return {\n        top: this._element.style.marginTop ? parseInt(this._element.style.marginTop, 10) : 0,\n        left: this._element.style.marginLeft ? parseInt(this._element.style.marginLeft, 10) : 0\n      };\n    }\n  }]);\n\n  return BaseUI;\n}();\n\nexports.default = BaseUI;\n\n/***/ }),\n/* 204 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.applySpanProperties = applySpanProperties;\n/**\n * Apply the `colspan`/`rowspan` properties.\n *\n * @param {HTMLElement} TD The soon-to-be-modified cell.\n * @param {MergedCellCoords} merged cellInfo The merged cell in question.\n * @param {Number} row Row index.\n * @param {Number} col Column index.\n */\n// eslint-disable-next-line import/prefer-default-export\nfunction applySpanProperties(TD, mergedCellInfo, row, col) {\n  if (mergedCellInfo) {\n    if (mergedCellInfo.row === row && mergedCellInfo.col === col) {\n      TD.setAttribute('rowspan', mergedCellInfo.rowspan.toString());\n      TD.setAttribute('colspan', mergedCellInfo.colspan.toString());\n    } else {\n      TD.removeAttribute('rowspan');\n      TD.removeAttribute('colspan');\n\n      TD.style.display = 'none';\n    }\n  } else {\n    TD.removeAttribute('rowspan');\n    TD.removeAttribute('colspan');\n\n    TD.style.display = '';\n  }\n}\n\n/***/ }),\n/* 205 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/*!\n * https://github.com/Starcounter-Jack/JSON-Patch\n * json-patch-duplex.js version: 0.5.7\n * (c) 2013 Joachim Wester\n * MIT license\n */\nvar __extends = undefined && undefined.__extends || function (d, b) {\n    for (var p in b) {\n        if (b.hasOwnProperty(p)) d[p] = b[p];\n    }function __() {\n        this.constructor = d;\n    }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OriginalError = Error;\nvar jsonpatch;\n(function (jsonpatch) {\n    var _objectKeys = function _objectKeys(obj) {\n        if (_isArray(obj)) {\n            var keys = new Array(obj.length);\n            for (var k = 0; k < keys.length; k++) {\n                keys[k] = \"\" + k;\n            }\n            return keys;\n        }\n        if (Object.keys) {\n            return Object.keys(obj);\n        }\n        var keys = [];\n        for (var i in obj) {\n            if (obj.hasOwnProperty(i)) {\n                keys.push(i);\n            }\n        }\n        return keys;\n    };\n    function _equals(a, b) {\n        switch (typeof a === 'undefined' ? 'undefined' : _typeof(a)) {\n            case 'undefined': //backward compatibility, but really I think we should return false\n            case 'boolean':\n            case 'string':\n            case 'number':\n                return a === b;\n            case 'object':\n                if (a === null) return b === null;\n                if (_isArray(a)) {\n                    if (!_isArray(b) || a.length !== b.length) return false;\n                    for (var i = 0, l = a.length; i < l; i++) {\n                        if (!_equals(a[i], b[i])) return false;\n                    }return true;\n                }\n                var bKeys = _objectKeys(b);\n                var bLength = bKeys.length;\n                if (_objectKeys(a).length !== bLength) return false;\n                for (var i = 0; i < bLength; i++) {\n                    if (!_equals(a[i], b[i])) return false;\n                }return true;\n            default:\n                return false;\n        }\n    }\n    /* We use a Javascript hash to store each\n     function. Each hash entry (property) uses\n     the operation identifiers specified in rfc6902.\n     In this way, we can map each patch operation\n     to its dedicated function in efficient way.\n     */\n    /* The operations applicable to an object */\n    var objOps = {\n        add: function add(obj, key) {\n            obj[key] = this.value;\n            return true;\n        },\n        remove: function remove(obj, key) {\n            delete obj[key];\n            return true;\n        },\n        replace: function replace(obj, key) {\n            obj[key] = this.value;\n            return true;\n        },\n        move: function move(obj, key, tree) {\n            var temp = { op: \"_get\", path: this.from };\n            apply(tree, [temp]);\n            apply(tree, [{ op: \"remove\", path: this.from }]);\n            apply(tree, [{ op: \"add\", path: this.path, value: temp.value }]);\n            return true;\n        },\n        copy: function copy(obj, key, tree) {\n            var temp = { op: \"_get\", path: this.from };\n            apply(tree, [temp]);\n            apply(tree, [{ op: \"add\", path: this.path, value: temp.value }]);\n            return true;\n        },\n        test: function test(obj, key) {\n            return _equals(obj[key], this.value);\n        },\n        _get: function _get(obj, key) {\n            this.value = obj[key];\n        }\n    };\n    /* The operations applicable to an array. Many are the same as for the object */\n    var arrOps = {\n        add: function add(arr, i) {\n            arr.splice(i, 0, this.value);\n            return true;\n        },\n        remove: function remove(arr, i) {\n            arr.splice(i, 1);\n            return true;\n        },\n        replace: function replace(arr, i) {\n            arr[i] = this.value;\n            return true;\n        },\n        move: objOps.move,\n        copy: objOps.copy,\n        test: objOps.test,\n        _get: objOps._get\n    };\n    /* The operations applicable to object root. Many are the same as for the object */\n    var rootOps = {\n        add: function add(obj) {\n            rootOps.remove.call(this, obj);\n            for (var key in this.value) {\n                if (this.value.hasOwnProperty(key)) {\n                    obj[key] = this.value[key];\n                }\n            }\n            return true;\n        },\n        remove: function remove(obj) {\n            for (var key in obj) {\n                if (obj.hasOwnProperty(key)) {\n                    objOps.remove.call(this, obj, key);\n                }\n            }\n            return true;\n        },\n        replace: function replace(obj) {\n            apply(obj, [{ op: \"remove\", path: this.path }]);\n            apply(obj, [{ op: \"add\", path: this.path, value: this.value }]);\n            return true;\n        },\n        move: objOps.move,\n        copy: objOps.copy,\n        test: function test(obj) {\n            return JSON.stringify(obj) === JSON.stringify(this.value);\n        },\n        _get: function _get(obj) {\n            this.value = obj;\n        }\n    };\n    var observeOps = {\n        add: function add(patches, path) {\n            var patch = {\n                op: \"add\",\n                path: path + escapePathComponent(this.name),\n                value: this.object[this.name] };\n            patches.push(patch);\n        },\n        'delete': function _delete(patches, path) {\n            var patch = {\n                op: \"remove\",\n                path: path + escapePathComponent(this.name)\n            };\n            patches.push(patch);\n        },\n        update: function update(patches, path) {\n            var patch = {\n                op: \"replace\",\n                path: path + escapePathComponent(this.name),\n                value: this.object[this.name]\n            };\n            patches.push(patch);\n        }\n    };\n    function escapePathComponent(str) {\n        if (str.indexOf('/') === -1 && str.indexOf('~') === -1) return str;\n        return str.replace(/~/g, '~0').replace(/\\//g, '~1');\n    }\n    function _getPathRecursive(root, obj) {\n        var found;\n        for (var key in root) {\n            if (root.hasOwnProperty(key)) {\n                if (root[key] === obj) {\n                    return escapePathComponent(key) + '/';\n                } else if (_typeof(root[key]) === 'object') {\n                    found = _getPathRecursive(root[key], obj);\n                    if (found != '') {\n                        return escapePathComponent(key) + '/' + found;\n                    }\n                }\n            }\n        }\n        return '';\n    }\n    function getPath(root, obj) {\n        if (root === obj) {\n            return '/';\n        }\n        var path = _getPathRecursive(root, obj);\n        if (path === '') {\n            throw new OriginalError(\"Object not found in root\");\n        }\n        return '/' + path;\n    }\n    var beforeDict = [];\n    var Mirror = function () {\n        function Mirror(obj) {\n            this.observers = [];\n            this.obj = obj;\n        }\n        return Mirror;\n    }();\n    var ObserverInfo = function () {\n        function ObserverInfo(callback, observer) {\n            this.callback = callback;\n            this.observer = observer;\n        }\n        return ObserverInfo;\n    }();\n    function getMirror(obj) {\n        for (var i = 0, ilen = beforeDict.length; i < ilen; i++) {\n            if (beforeDict[i].obj === obj) {\n                return beforeDict[i];\n            }\n        }\n    }\n    function getObserverFromMirror(mirror, callback) {\n        for (var j = 0, jlen = mirror.observers.length; j < jlen; j++) {\n            if (mirror.observers[j].callback === callback) {\n                return mirror.observers[j].observer;\n            }\n        }\n    }\n    function removeObserverFromMirror(mirror, observer) {\n        for (var j = 0, jlen = mirror.observers.length; j < jlen; j++) {\n            if (mirror.observers[j].observer === observer) {\n                mirror.observers.splice(j, 1);\n                return;\n            }\n        }\n    }\n    function unobserve(root, observer) {\n        observer.unobserve();\n    }\n    jsonpatch.unobserve = unobserve;\n    function deepClone(obj) {\n        if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === \"object\") {\n            return JSON.parse(JSON.stringify(obj)); //Faster than ES5 clone - http://jsperf.com/deep-cloning-of-objects/5\n        } else {\n            return obj; //no need to clone primitives\n        }\n    }\n    function observe(obj, callback) {\n        var patches = [];\n        var root = obj;\n        var observer;\n        var mirror = getMirror(obj);\n        if (!mirror) {\n            mirror = new Mirror(obj);\n            beforeDict.push(mirror);\n        } else {\n            observer = getObserverFromMirror(mirror, callback);\n        }\n        if (observer) {\n            return observer;\n        }\n        observer = {};\n        mirror.value = deepClone(obj);\n        if (callback) {\n            observer.callback = callback;\n            observer.next = null;\n            var intervals = this.intervals || [100, 1000, 10000, 60000];\n            if (intervals.push === void 0) {\n                throw new OriginalError(\"jsonpatch.intervals must be an array\");\n            }\n            var currentInterval = 0;\n            var dirtyCheck = function dirtyCheck() {\n                generate(observer);\n            };\n            var fastCheck = function fastCheck() {\n                clearTimeout(observer.next);\n                observer.next = setTimeout(function () {\n                    dirtyCheck();\n                    currentInterval = 0;\n                    observer.next = setTimeout(slowCheck, intervals[currentInterval++]);\n                }, 0);\n            };\n            var slowCheck = function slowCheck() {\n                dirtyCheck();\n                if (currentInterval == intervals.length) currentInterval = intervals.length - 1;\n                observer.next = setTimeout(slowCheck, intervals[currentInterval++]);\n            };\n            if (typeof window !== 'undefined') {\n                if (window.addEventListener) {\n                    window.addEventListener('mousedown', fastCheck);\n                    window.addEventListener('mouseup', fastCheck);\n                    window.addEventListener('keydown', fastCheck);\n                } else {\n                    document.documentElement.attachEvent('onmousedown', fastCheck);\n                    document.documentElement.attachEvent('onmouseup', fastCheck);\n                    document.documentElement.attachEvent('onkeydown', fastCheck);\n                }\n            }\n            observer.next = setTimeout(slowCheck, intervals[currentInterval++]);\n        }\n        observer.patches = patches;\n        observer.object = obj;\n        observer.unobserve = function () {\n            generate(observer);\n            clearTimeout(observer.next);\n            removeObserverFromMirror(mirror, observer);\n            if (typeof window !== 'undefined') {\n                if (window.removeEventListener) {\n                    window.removeEventListener('mousedown', fastCheck);\n                    window.removeEventListener('mouseup', fastCheck);\n                    window.removeEventListener('keydown', fastCheck);\n                } else {\n                    document.documentElement.detachEvent('onmousedown', fastCheck);\n                    document.documentElement.detachEvent('onmouseup', fastCheck);\n                    document.documentElement.detachEvent('onkeydown', fastCheck);\n                }\n            }\n        };\n        mirror.observers.push(new ObserverInfo(callback, observer));\n        return observer;\n    }\n    jsonpatch.observe = observe;\n    function generate(observer) {\n        var mirror;\n        for (var i = 0, ilen = beforeDict.length; i < ilen; i++) {\n            if (beforeDict[i].obj === observer.object) {\n                mirror = beforeDict[i];\n                break;\n            }\n        }\n        _generate(mirror.value, observer.object, observer.patches, \"\");\n        if (observer.patches.length) {\n            apply(mirror.value, observer.patches);\n        }\n        var temp = observer.patches;\n        if (temp.length > 0) {\n            observer.patches = [];\n            if (observer.callback) {\n                observer.callback(temp);\n            }\n        }\n        return temp;\n    }\n    jsonpatch.generate = generate;\n    // Dirty check if obj is different from mirror, generate patches and update mirror\n    function _generate(mirror, obj, patches, path) {\n        var newKeys = _objectKeys(obj);\n        var oldKeys = _objectKeys(mirror);\n        var changed = false;\n        var deleted = false;\n        //if ever \"move\" operation is implemented here, make sure this test runs OK: \"should not generate the same patch twice (move)\"\n        for (var t = oldKeys.length - 1; t >= 0; t--) {\n            var key = oldKeys[t];\n            var oldVal = mirror[key];\n            if (obj.hasOwnProperty(key)) {\n                var newVal = obj[key];\n                if ((typeof oldVal === 'undefined' ? 'undefined' : _typeof(oldVal)) == \"object\" && oldVal != null && (typeof newVal === 'undefined' ? 'undefined' : _typeof(newVal)) == \"object\" && newVal != null) {\n                    _generate(oldVal, newVal, patches, path + \"/\" + escapePathComponent(key));\n                } else {\n                    if (oldVal != newVal) {\n                        changed = true;\n                        patches.push({ op: \"replace\", path: path + \"/\" + escapePathComponent(key), value: deepClone(newVal) });\n                    }\n                }\n            } else {\n                patches.push({ op: \"remove\", path: path + \"/\" + escapePathComponent(key) });\n                deleted = true; // property has been deleted\n            }\n        }\n        if (!deleted && newKeys.length == oldKeys.length) {\n            return;\n        }\n        for (var t = 0; t < newKeys.length; t++) {\n            var key = newKeys[t];\n            if (!mirror.hasOwnProperty(key)) {\n                patches.push({ op: \"add\", path: path + \"/\" + escapePathComponent(key), value: deepClone(obj[key]) });\n            }\n        }\n    }\n    var _isArray;\n    if (Array.isArray) {\n        _isArray = Array.isArray;\n    } else {\n        _isArray = function _isArray(obj) {\n            return obj.push && typeof obj.length === 'number';\n        };\n    }\n    //3x faster than cached /^\\d+$/.test(str)\n    function isInteger(str) {\n        var i = 0;\n        var len = str.length;\n        var charCode;\n        while (i < len) {\n            charCode = str.charCodeAt(i);\n            if (charCode >= 48 && charCode <= 57) {\n                i++;\n                continue;\n            }\n            return false;\n        }\n        return true;\n    }\n    /// Apply a json-patch operation on an object tree\n    function apply(tree, patches, validate) {\n        var result = false,\n            p = 0,\n            plen = patches.length,\n            patch,\n            key;\n        while (p < plen) {\n            patch = patches[p];\n            p++;\n            // Find the object\n            var path = patch.path || \"\";\n            var keys = path.split('/');\n            var obj = tree;\n            var t = 1; //skip empty element - http://jsperf.com/to-shift-or-not-to-shift\n            var len = keys.length;\n            var existingPathFragment = undefined;\n            while (true) {\n                key = keys[t];\n                if (validate) {\n                    if (existingPathFragment === undefined) {\n                        if (obj[key] === undefined) {\n                            existingPathFragment = keys.slice(0, t).join('/');\n                        } else if (t == len - 1) {\n                            existingPathFragment = patch.path;\n                        }\n                        if (existingPathFragment !== undefined) {\n                            this.validator(patch, p - 1, tree, existingPathFragment);\n                        }\n                    }\n                }\n                t++;\n                if (key === undefined) {\n                    if (t >= len) {\n                        result = rootOps[patch.op].call(patch, obj, key, tree); // Apply patch\n                        break;\n                    }\n                }\n                if (_isArray(obj)) {\n                    if (key === '-') {\n                        key = obj.length;\n                    } else {\n                        if (validate && !isInteger(key)) {\n                            throw new JsonPatchError(\"Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index\", \"OPERATION_PATH_ILLEGAL_ARRAY_INDEX\", p - 1, patch.path, patch);\n                        }\n                        key = parseInt(key, 10);\n                    }\n                    if (t >= len) {\n                        if (validate && patch.op === \"add\" && key > obj.length) {\n                            throw new JsonPatchError(\"The specified index MUST NOT be greater than the number of elements in the array\", \"OPERATION_VALUE_OUT_OF_BOUNDS\", p - 1, patch.path, patch);\n                        }\n                        result = arrOps[patch.op].call(patch, obj, key, tree); // Apply patch\n                        break;\n                    }\n                } else {\n                    if (key && key.indexOf('~') != -1) key = key.replace(/~1/g, '/').replace(/~0/g, '~'); // escape chars\n                    if (t >= len) {\n                        result = objOps[patch.op].call(patch, obj, key, tree); // Apply patch\n                        break;\n                    }\n                }\n                obj = obj[key];\n            }\n        }\n        return result;\n    }\n    jsonpatch.apply = apply;\n    function compare(tree1, tree2) {\n        var patches = [];\n        _generate(tree1, tree2, patches, '');\n        return patches;\n    }\n    jsonpatch.compare = compare;\n    var JsonPatchError = function (_super) {\n        __extends(JsonPatchError, _super);\n        function JsonPatchError(message, name, index, operation, tree) {\n            _super.call(this, message);\n            this.message = message;\n            this.name = name;\n            this.index = index;\n            this.operation = operation;\n            this.tree = tree;\n        }\n        return JsonPatchError;\n    }(OriginalError);\n    jsonpatch.JsonPatchError = JsonPatchError;\n    jsonpatch.Error = JsonPatchError;\n    /**\n     * Recursively checks whether an object has any undefined values inside.\n     */\n    function hasUndefined(obj) {\n        if (obj === undefined) {\n            return true;\n        }\n        if (typeof obj == \"array\" || (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) == \"object\") {\n            for (var i in obj) {\n                if (hasUndefined(obj[i])) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n    /**\n     * Validates a single operation. Called from `jsonpatch.validate`. Throws `JsonPatchError` in case of an error.\n     * @param {object} operation - operation object (patch)\n     * @param {number} index - index of operation in the sequence\n     * @param {object} [tree] - object where the operation is supposed to be applied\n     * @param {string} [existingPathFragment] - comes along with `tree`\n     */\n    function validator(operation, index, tree, existingPathFragment) {\n        if ((typeof operation === 'undefined' ? 'undefined' : _typeof(operation)) !== 'object' || operation === null || _isArray(operation)) {\n            throw new JsonPatchError('Operation is not an object', 'OPERATION_NOT_AN_OBJECT', index, operation, tree);\n        } else if (!objOps[operation.op]) {\n            throw new JsonPatchError('Operation `op` property is not one of operations defined in RFC-6902', 'OPERATION_OP_INVALID', index, operation, tree);\n        } else if (typeof operation.path !== 'string') {\n            throw new JsonPatchError('Operation `path` property is not a string', 'OPERATION_PATH_INVALID', index, operation, tree);\n        } else if ((operation.op === 'move' || operation.op === 'copy') && typeof operation.from !== 'string') {\n            throw new JsonPatchError('Operation `from` property is not present (applicable in `move` and `copy` operations)', 'OPERATION_FROM_REQUIRED', index, operation, tree);\n        } else if ((operation.op === 'add' || operation.op === 'replace' || operation.op === 'test') && operation.value === undefined) {\n            throw new JsonPatchError('Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)', 'OPERATION_VALUE_REQUIRED', index, operation, tree);\n        } else if ((operation.op === 'add' || operation.op === 'replace' || operation.op === 'test') && hasUndefined(operation.value)) {\n            throw new JsonPatchError('Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)', 'OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED', index, operation, tree);\n        } else if (tree) {\n            if (operation.op == \"add\") {\n                var pathLen = operation.path.split(\"/\").length;\n                var existingPathLen = existingPathFragment.split(\"/\").length;\n                if (pathLen !== existingPathLen + 1 && pathLen !== existingPathLen) {\n                    throw new JsonPatchError('Cannot perform an `add` operation at the desired path', 'OPERATION_PATH_CANNOT_ADD', index, operation, tree);\n                }\n            } else if (operation.op === 'replace' || operation.op === 'remove' || operation.op === '_get') {\n                if (operation.path !== existingPathFragment) {\n                    throw new JsonPatchError('Cannot perform the operation at a path that does not exist', 'OPERATION_PATH_UNRESOLVABLE', index, operation, tree);\n                }\n            } else if (operation.op === 'move' || operation.op === 'copy') {\n                var existingValue = { op: \"_get\", path: operation.from, value: undefined };\n                var error = jsonpatch.validate([existingValue], tree);\n                if (error && error.name === 'OPERATION_PATH_UNRESOLVABLE') {\n                    throw new JsonPatchError('Cannot perform the operation from a path that does not exist', 'OPERATION_FROM_UNRESOLVABLE', index, operation, tree);\n                }\n            }\n        }\n    }\n    jsonpatch.validator = validator;\n    /**\n     * Validates a sequence of operations. If `tree` parameter is provided, the sequence is additionally validated against the object tree.\n     * If error is encountered, returns a JsonPatchError object\n     * @param sequence\n     * @param tree\n     * @returns {JsonPatchError|undefined}\n     */\n    function validate(sequence, tree) {\n        try {\n            if (!_isArray(sequence)) {\n                throw new JsonPatchError('Patch sequence must be an array', 'SEQUENCE_NOT_AN_ARRAY');\n            }\n            if (tree) {\n                tree = JSON.parse(JSON.stringify(tree)); //clone tree so that we can safely try applying operations\n                apply.call(this, tree, sequence, true);\n            } else {\n                for (var i = 0; i < sequence.length; i++) {\n                    this.validator(sequence[i], i);\n                }\n            }\n        } catch (e) {\n            if (e instanceof JsonPatchError) {\n                return e;\n            } else {\n                throw e;\n            }\n        }\n    }\n    jsonpatch.validate = validate;\n})(jsonpatch || (jsonpatch = {}));\nif (true) {\n    exports.apply = jsonpatch.apply;\n    exports.observe = jsonpatch.observe;\n    exports.unobserve = jsonpatch.unobserve;\n    exports.generate = jsonpatch.generate;\n    exports.compare = jsonpatch.compare;\n    exports.validate = jsonpatch.validate;\n    exports.validator = jsonpatch.validator;\n    exports.JsonPatchError = jsonpatch.JsonPatchError;\n    exports.Error = jsonpatch.Error;\n}\n\n/***/ }),\n/* 206 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\n__webpack_require__(96);\n\n__webpack_require__(111);\n\n__webpack_require__(112);\n\n__webpack_require__(116);\n\n__webpack_require__(117);\n\n__webpack_require__(119);\n\n__webpack_require__(122);\n\n__webpack_require__(123);\n\n__webpack_require__(124);\n\n__webpack_require__(125);\n\n__webpack_require__(126);\n\n__webpack_require__(127);\n\n__webpack_require__(128);\n\n__webpack_require__(129);\n\n__webpack_require__(130);\n\n__webpack_require__(131);\n\n__webpack_require__(132);\n\n__webpack_require__(133);\n\n__webpack_require__(134);\n\n__webpack_require__(135);\n\n__webpack_require__(136);\n\n__webpack_require__(137);\n\n__webpack_require__(138);\n\n__webpack_require__(139);\n\n__webpack_require__(141);\n\n__webpack_require__(143);\n\n__webpack_require__(144);\n\n__webpack_require__(145);\n\n__webpack_require__(146);\n\n__webpack_require__(147);\n\n__webpack_require__(148);\n\n__webpack_require__(149);\n\n__webpack_require__(150);\n\n__webpack_require__(151);\n\n__webpack_require__(152);\n\n__webpack_require__(153);\n\n__webpack_require__(154);\n\n__webpack_require__(155);\n\n__webpack_require__(85);\n\n__webpack_require__(156);\n\n__webpack_require__(157);\n\n__webpack_require__(159);\n\n__webpack_require__(160);\n\n__webpack_require__(161);\n\n__webpack_require__(162);\n\n__webpack_require__(163);\n\n__webpack_require__(164);\n\n__webpack_require__(165);\n\n__webpack_require__(167);\n\n__webpack_require__(168);\n\n__webpack_require__(169);\n\n__webpack_require__(172);\n\n__webpack_require__(173);\n\n__webpack_require__(174);\n\n__webpack_require__(225);\n\n__webpack_require__(226);\n\n__webpack_require__(227);\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar _cellTypes = __webpack_require__(87);\n\nvar _core = __webpack_require__(88);\n\nvar _core2 = _interopRequireDefault(_core);\n\nvar _jquery = __webpack_require__(282);\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _ghostTable = __webpack_require__(92);\n\nvar _ghostTable2 = _interopRequireDefault(_ghostTable);\n\nvar _array = __webpack_require__(1);\n\nvar arrayHelpers = _interopRequireWildcard(_array);\n\nvar _browser = __webpack_require__(27);\n\nvar browserHelpers = _interopRequireWildcard(_browser);\n\nvar _data = __webpack_require__(90);\n\nvar dataHelpers = _interopRequireWildcard(_data);\n\nvar _date = __webpack_require__(190);\n\nvar dateHelpers = _interopRequireWildcard(_date);\n\nvar _feature = __webpack_require__(40);\n\nvar featureHelpers = _interopRequireWildcard(_feature);\n\nvar _function = __webpack_require__(42);\n\nvar functionHelpers = _interopRequireWildcard(_function);\n\nvar _mixed = __webpack_require__(16);\n\nvar mixedHelpers = _interopRequireWildcard(_mixed);\n\nvar _number = __webpack_require__(5);\n\nvar numberHelpers = _interopRequireWildcard(_number);\n\nvar _object = __webpack_require__(2);\n\nvar objectHelpers = _interopRequireWildcard(_object);\n\nvar _setting = __webpack_require__(89);\n\nvar settingHelpers = _interopRequireWildcard(_setting);\n\nvar _string = __webpack_require__(36);\n\nvar stringHelpers = _interopRequireWildcard(_string);\n\nvar _unicode = __webpack_require__(21);\n\nvar unicodeHelpers = _interopRequireWildcard(_unicode);\n\nvar _element = __webpack_require__(0);\n\nvar domHelpers = _interopRequireWildcard(_element);\n\nvar _event = __webpack_require__(12);\n\nvar domEventHelpers = _interopRequireWildcard(_event);\n\nvar _index = __webpack_require__(283);\n\nvar plugins = _interopRequireWildcard(_index);\n\nvar _plugins = __webpack_require__(8);\n\nvar _defaultSettings = __webpack_require__(195);\n\nvar _defaultSettings2 = _interopRequireDefault(_defaultSettings);\n\nvar _rootInstance = __webpack_require__(194);\n\nvar _i18n = __webpack_require__(196);\n\nvar _constants = __webpack_require__(7);\n\nvar constants = _interopRequireWildcard(_constants);\n\nvar _dictionariesManager = __webpack_require__(71);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Handsontable(rootElement, userSettings) {\n  var instance = new _core2.default(rootElement, userSettings || {}, _rootInstance.rootInstanceSymbol);\n\n  instance.init();\n\n  return instance;\n}\n\n(0, _jquery2.default)(Handsontable);\n\nHandsontable.Core = _core2.default;\nHandsontable.DefaultSettings = _defaultSettings2.default;\nHandsontable.EventManager = _eventManager2.default;\nHandsontable._getListenersCounter = _eventManager.getListenersCounter; // For MemoryLeak tests\n\nHandsontable.buildDate = '10/04/2018 11:38:33';\nHandsontable.packageName = 'handsontable';\nHandsontable.version = '2.0.0';\n\nvar baseVersion = '';\n\nif (baseVersion) {\n  Handsontable.baseVersion = baseVersion;\n}\n\n// Export Hooks singleton\nHandsontable.hooks = _pluginHooks2.default.getSingleton();\n\n// TODO: Remove this exports after rewrite tests about this module\nHandsontable.__GhostTable = _ghostTable2.default;\n//\n\n// Export all helpers to the Handsontable object\nvar HELPERS = [arrayHelpers, browserHelpers, dataHelpers, dateHelpers, featureHelpers, functionHelpers, mixedHelpers, numberHelpers, objectHelpers, settingHelpers, stringHelpers, unicodeHelpers];\nvar DOM = [domHelpers, domEventHelpers];\n\nHandsontable.helper = {};\nHandsontable.dom = {};\n\n// Fill general helpers.\narrayHelpers.arrayEach(HELPERS, function (helper) {\n  arrayHelpers.arrayEach(Object.getOwnPropertyNames(helper), function (key) {\n    if (key.charAt(0) !== '_') {\n      Handsontable.helper[key] = helper[key];\n    }\n  });\n});\n\n// Fill DOM helpers.\narrayHelpers.arrayEach(DOM, function (helper) {\n  arrayHelpers.arrayEach(Object.getOwnPropertyNames(helper), function (key) {\n    if (key.charAt(0) !== '_') {\n      Handsontable.dom[key] = helper[key];\n    }\n  });\n});\n\n// Export cell types.\nHandsontable.cellTypes = {};\n\narrayHelpers.arrayEach((0, _cellTypes.getRegisteredCellTypeNames)(), function (cellTypeName) {\n  Handsontable.cellTypes[cellTypeName] = (0, _cellTypes.getCellType)(cellTypeName);\n});\n\nHandsontable.cellTypes.registerCellType = _cellTypes.registerCellType;\nHandsontable.cellTypes.getCellType = _cellTypes.getCellType;\n\n// Export all registered editors from the Handsontable.\nHandsontable.editors = {};\n\narrayHelpers.arrayEach((0, _editors.getRegisteredEditorNames)(), function (editorName) {\n  Handsontable.editors[stringHelpers.toUpperCaseFirst(editorName) + 'Editor'] = (0, _editors.getEditor)(editorName);\n});\n\nHandsontable.editors.registerEditor = _editors.registerEditor;\nHandsontable.editors.getEditor = _editors.getEditor;\n\n// Export all registered renderers from the Handsontable.\nHandsontable.renderers = {};\n\narrayHelpers.arrayEach((0, _renderers.getRegisteredRendererNames)(), function (rendererName) {\n  var renderer = (0, _renderers.getRenderer)(rendererName);\n\n  if (rendererName === 'base') {\n    Handsontable.renderers.cellDecorator = renderer;\n  }\n  Handsontable.renderers[stringHelpers.toUpperCaseFirst(rendererName) + 'Renderer'] = renderer;\n});\n\nHandsontable.renderers.registerRenderer = _renderers.registerRenderer;\nHandsontable.renderers.getRenderer = _renderers.getRenderer;\n\n// Export all registered validators from the Handsontable.\nHandsontable.validators = {};\n\narrayHelpers.arrayEach((0, _validators.getRegisteredValidatorNames)(), function (validatorName) {\n  Handsontable.validators[stringHelpers.toUpperCaseFirst(validatorName) + 'Validator'] = (0, _validators.getValidator)(validatorName);\n});\n\nHandsontable.validators.registerValidator = _validators.registerValidator;\nHandsontable.validators.getValidator = _validators.getValidator;\n\n// Export all registered plugins from the Handsontable.\nHandsontable.plugins = {};\n\narrayHelpers.arrayEach(Object.getOwnPropertyNames(plugins), function (pluginName) {\n  var plugin = plugins[pluginName];\n\n  if (pluginName === 'Base') {\n    Handsontable.plugins[pluginName + 'Plugin'] = plugin;\n  } else {\n    Handsontable.plugins[pluginName] = plugin;\n  }\n});\n\nHandsontable.plugins.registerPlugin = _plugins.registerPlugin;\n\nHandsontable.languages = {};\nHandsontable.languages.dictionaryKeys = constants;\nHandsontable.languages.getLanguageDictionary = _dictionariesManager.getLanguageDictionary;\nHandsontable.languages.getLanguagesDictionaries = _dictionariesManager.getLanguagesDictionaries;\nHandsontable.languages.registerLanguageDictionary = _dictionariesManager.registerLanguageDictionary;\n\n// Alias to `getTranslatedPhrase` function, for more information check it API.\nHandsontable.languages.getTranslatedPhrase = function () {\n  return _i18n.getTranslatedPhrase.apply(undefined, arguments);\n};\n\nexports.default = Handsontable;\n\n/***/ }),\n/* 207 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(20);\nvar anObject = __webpack_require__(18);\nvar getKeys = __webpack_require__(37);\n\nmodule.exports = __webpack_require__(22) ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var keys = getKeys(Properties);\n  var length = keys.length;\n  var i = 0;\n  var P;\n  while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n  return O;\n};\n\n\n/***/ }),\n/* 208 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar create = __webpack_require__(74);\nvar descriptor = __webpack_require__(49);\nvar setToStringTag = __webpack_require__(51);\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__webpack_require__(31)(IteratorPrototype, __webpack_require__(11)('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n\n/***/ }),\n/* 209 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nvar setPrototypeOf = __webpack_require__(110).set;\nmodule.exports = function (that, target, C) {\n  var S = target.constructor;\n  var P;\n  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n    setPrototypeOf(that, P);\n  } return that;\n};\n\n\n/***/ }),\n/* 210 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = __webpack_require__(211);\n\nmodule.exports = function (original, length) {\n  return new (speciesConstructor(original))(length);\n};\n\n\n/***/ }),\n/* 211 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(9);\nvar isArray = __webpack_require__(113);\nvar SPECIES = __webpack_require__(11)('species');\n\nmodule.exports = function (original) {\n  var C;\n  if (isArray(original)) {\n    C = original.constructor;\n    // cross-realm fallback\n    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n    if (isObject(C)) {\n      C = C[SPECIES];\n      if (C === null) C = undefined;\n    }\n  } return C === undefined ? Array : C;\n};\n\n\n/***/ }),\n/* 212 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = __webpack_require__(18);\nvar aFunction = __webpack_require__(62);\nvar SPECIES = __webpack_require__(11)('species');\nmodule.exports = function (O, D) {\n  var C = anObject(O).constructor;\n  var S;\n  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n\n\n/***/ }),\n/* 213 */\n/***/ (function(module, exports) {\n\n// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n  var un = that === undefined;\n  switch (args.length) {\n    case 0: return un ? fn()\n                      : fn.call(that);\n    case 1: return un ? fn(args[0])\n                      : fn.call(that, args[0]);\n    case 2: return un ? fn(args[0], args[1])\n                      : fn.call(that, args[0], args[1]);\n    case 3: return un ? fn(args[0], args[1], args[2])\n                      : fn.call(that, args[0], args[1], args[2]);\n    case 4: return un ? fn(args[0], args[1], args[2], args[3])\n                      : fn.call(that, args[0], args[1], args[2], args[3]);\n  } return fn.apply(that, args);\n};\n\n\n/***/ }),\n/* 214 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar macrotask = __webpack_require__(80).set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = __webpack_require__(43)(process) == 'process';\n\nmodule.exports = function () {\n  var head, last, notify;\n\n  var flush = function () {\n    var parent, fn;\n    if (isNode && (parent = process.domain)) parent.exit();\n    while (head) {\n      fn = head.fn;\n      head = head.next;\n      try {\n        fn();\n      } catch (e) {\n        if (head) notify();\n        else last = undefined;\n        throw e;\n      }\n    } last = undefined;\n    if (parent) parent.enter();\n  };\n\n  // Node.js\n  if (isNode) {\n    notify = function () {\n      process.nextTick(flush);\n    };\n  // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n  } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n    var toggle = true;\n    var node = document.createTextNode('');\n    new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n    notify = function () {\n      node.data = toggle = !toggle;\n    };\n  // environments with maybe non-completely correct, but existent Promise\n  } else if (Promise && Promise.resolve) {\n    var promise = Promise.resolve();\n    notify = function () {\n      promise.then(flush);\n    };\n  // for other environments - macrotask based on:\n  // - setImmediate\n  // - MessageChannel\n  // - window.postMessag\n  // - onreadystatechange\n  // - setTimeout\n  } else {\n    notify = function () {\n      // strange IE + webpack dev server bug - use .call(global)\n      macrotask.call(global, flush);\n    };\n  }\n\n  return function (fn) {\n    var task = { fn: fn, next: undefined };\n    if (last) last.next = task;\n    if (!head) {\n      head = task;\n      notify();\n    } last = task;\n  };\n};\n\n\n/***/ }),\n/* 215 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (exec) {\n  try {\n    return { e: false, v: exec() };\n  } catch (e) {\n    return { e: true, v: e };\n  }\n};\n\n\n/***/ }),\n/* 216 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(18);\nvar isObject = __webpack_require__(9);\nvar newPromiseCapability = __webpack_require__(118);\n\nmodule.exports = function (C, x) {\n  anObject(C);\n  if (isObject(x) && x.constructor === C) return x;\n  var promiseCapability = newPromiseCapability.f(C);\n  var resolve = promiseCapability.resolve;\n  resolve(x);\n  return promiseCapability.promise;\n};\n\n\n/***/ }),\n/* 217 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(14);\nvar core = __webpack_require__(44);\nvar LIBRARY = __webpack_require__(65);\nvar wksExt = __webpack_require__(120);\nvar defineProperty = __webpack_require__(20).f;\nmodule.exports = function (name) {\n  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n\n\n/***/ }),\n/* 218 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// all enumerable object keys, includes symbols\nvar getKeys = __webpack_require__(37);\nvar gOPS = __webpack_require__(69);\nvar pIE = __webpack_require__(52);\nmodule.exports = function (it) {\n  var result = getKeys(it);\n  var getSymbols = gOPS.f;\n  if (getSymbols) {\n    var symbols = getSymbols(it);\n    var isEnum = pIE.f;\n    var i = 0;\n    var key;\n    while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n  } return result;\n};\n\n\n/***/ }),\n/* 219 */\n/***/ (function(module, exports) {\n\n// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n  // eslint-disable-next-line no-self-compare\n  return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n\n\n/***/ }),\n/* 220 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(59);\nvar defined = __webpack_require__(38);\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n  return function (that, pos) {\n    var s = String(defined(that));\n    var i = toInteger(pos);\n    var l = s.length;\n    var a, b;\n    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n      ? TO_STRING ? s.charAt(i) : a\n      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n\n\n/***/ }),\n/* 221 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = __webpack_require__(18);\nmodule.exports = function () {\n  var that = anObject(this);\n  var result = '';\n  if (that.global) result += 'g';\n  if (that.ignoreCase) result += 'i';\n  if (that.multiline) result += 'm';\n  if (that.unicode) result += 'u';\n  if (that.sticky) result += 'y';\n  return result;\n};\n\n\n/***/ }),\n/* 222 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n\nvar toObject = __webpack_require__(33);\nvar toAbsoluteIndex = __webpack_require__(60);\nvar toLength = __webpack_require__(25);\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n  var O = toObject(this);\n  var len = toLength(O.length);\n  var to = toAbsoluteIndex(target, len);\n  var from = toAbsoluteIndex(start, len);\n  var end = arguments.length > 2 ? arguments[2] : undefined;\n  var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n  var inc = 1;\n  if (from < to && to < from + count) {\n    inc = -1;\n    from += count - 1;\n    to += count - 1;\n  }\n  while (count-- > 0) {\n    if (from in O) O[to] = O[from];\n    else delete O[to];\n    to += inc;\n    from += inc;\n  } return O;\n};\n\n\n/***/ }),\n/* 223 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n\nvar toObject = __webpack_require__(33);\nvar toAbsoluteIndex = __webpack_require__(60);\nvar toLength = __webpack_require__(25);\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n  var O = toObject(this);\n  var length = toLength(O.length);\n  var aLen = arguments.length;\n  var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n  var end = aLen > 2 ? arguments[2] : undefined;\n  var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n  while (endPos > index) O[index++] = value;\n  return O;\n};\n\n\n/***/ }),\n/* 224 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// all object keys, includes non-enumerable and symbols\nvar gOPN = __webpack_require__(81);\nvar gOPS = __webpack_require__(69);\nvar anObject = __webpack_require__(18);\nvar Reflect = __webpack_require__(14).Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n  var keys = gOPN.f(anObject(it));\n  var getSymbols = gOPS.f;\n  return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n\n\n/***/ }),\n/* 225 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 226 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 227 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 228 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * A overlay that renders ALL available rows & columns positioned on top of the original Walkontable instance and all other overlays.\n * Used for debugging purposes to see if the other overlays (that render only part of the rows & columns) are positioned correctly\n *\n * @class DebugOverlay\n */\nvar DebugOverlay = function (_Overlay) {\n  _inherits(DebugOverlay, _Overlay);\n\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function DebugOverlay(wotInstance) {\n    _classCallCheck(this, DebugOverlay);\n\n    var _this = _possibleConstructorReturn(this, (DebugOverlay.__proto__ || Object.getPrototypeOf(DebugOverlay)).call(this, wotInstance));\n\n    _this.clone = _this.makeClone(_base2.default.CLONE_DEBUG);\n    _this.clone.wtTable.holder.style.opacity = 0.4;\n    _this.clone.wtTable.holder.style.textShadow = '0 0 2px #ff0000';\n\n    (0, _element.addClass)(_this.clone.wtTable.holder.parentNode, 'wtDebugVisible');\n    return _this;\n  }\n\n  return DebugOverlay;\n}(_base2.default);\n\n_base2.default.registerOverlay(_base2.default.CLONE_DEBUG, DebugOverlay);\n\nexports.default = DebugOverlay;\n\n/***/ }),\n/* 229 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @class LeftOverlay\n */\nvar LeftOverlay = function (_Overlay) {\n  _inherits(LeftOverlay, _Overlay);\n\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function LeftOverlay(wotInstance) {\n    _classCallCheck(this, LeftOverlay);\n\n    var _this = _possibleConstructorReturn(this, (LeftOverlay.__proto__ || Object.getPrototypeOf(LeftOverlay)).call(this, wotInstance));\n\n    _this.clone = _this.makeClone(_base2.default.CLONE_LEFT);\n    return _this;\n  }\n\n  /**\n   * Checks if overlay should be fully rendered\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(LeftOverlay, [{\n    key: 'shouldBeRendered',\n    value: function shouldBeRendered() {\n      return !!(this.wot.getSetting('fixedColumnsLeft') || this.wot.getSetting('rowHeaders').length);\n    }\n\n    /**\n     * Updates the left overlay position\n     */\n\n  }, {\n    key: 'resetFixedPosition',\n    value: function resetFixedPosition() {\n      if (!this.needFullRender || !this.wot.wtTable.holder.parentNode) {\n        // removed from DOM\n        return;\n      }\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var headerPosition = 0;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (this.trimmingContainer === window && (!preventOverflow || preventOverflow !== 'horizontal')) {\n        var box = this.wot.wtTable.hider.getBoundingClientRect();\n        var left = Math.ceil(box.left);\n        var right = Math.ceil(box.right);\n        var finalLeft = void 0;\n        var finalTop = void 0;\n\n        finalTop = this.wot.wtTable.hider.style.top;\n        finalTop = finalTop === '' ? 0 : finalTop;\n\n        if (left < 0 && right - overlayRoot.offsetWidth > 0) {\n          finalLeft = -left;\n        } else {\n          finalLeft = 0;\n        }\n        headerPosition = finalLeft;\n        finalLeft += 'px';\n\n        (0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop);\n      } else {\n        headerPosition = this.getScrollPosition();\n        (0, _element.resetCssTransform)(overlayRoot);\n      }\n      this.adjustHeaderBordersPosition(headerPosition);\n\n      this.adjustElementsSize();\n    }\n\n    /**\n     * Sets the main overlay's horizontal scroll position\n     *\n     * @param {Number} pos\n     */\n\n  }, {\n    key: 'setScrollPosition',\n    value: function setScrollPosition(pos) {\n      if (this.mainTableScrollableElement === window) {\n        window.scrollTo(pos, (0, _element.getWindowScrollTop)());\n      } else {\n        this.mainTableScrollableElement.scrollLeft = pos;\n      }\n    }\n\n    /**\n     * Triggers onScroll hook callback\n     */\n\n  }, {\n    key: 'onScroll',\n    value: function onScroll() {\n      this.wot.getSetting('onScrollVertically');\n    }\n\n    /**\n     * Calculates total sum cells width\n     *\n     * @param {Number} from Column index which calculates started from\n     * @param {Number} to Column index where calculation is finished\n     * @returns {Number} Width sum\n     */\n\n  }, {\n    key: 'sumCellSizes',\n    value: function sumCellSizes(from, to) {\n      var sum = 0;\n      var defaultColumnWidth = this.wot.wtSettings.defaultColumnWidth;\n\n      while (from < to) {\n        sum += this.wot.wtTable.getStretchedColumnWidth(from) || defaultColumnWidth;\n        from++;\n      }\n\n      return sum;\n    }\n\n    /**\n     * Adjust overlay root element, childs and master table element sizes (width, height).\n     *\n     * @param {Boolean} [force=false]\n     */\n\n  }, {\n    key: 'adjustElementsSize',\n    value: function adjustElementsSize() {\n      var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      this.updateTrimmingContainer();\n\n      if (this.needFullRender || force) {\n        this.adjustRootElementSize();\n        this.adjustRootChildrenSize();\n\n        if (!force) {\n          this.areElementSizesAdjusted = true;\n        }\n      }\n    }\n\n    /**\n     * Adjust overlay root element size (width and height).\n     */\n\n  }, {\n    key: 'adjustRootElementSize',\n    value: function adjustRootElementSize() {\n      var masterHolder = this.wot.wtTable.holder;\n      var scrollbarHeight = masterHolder.clientHeight === masterHolder.offsetHeight ? 0 : (0, _element.getScrollbarWidth)();\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var overlayRootStyle = overlayRoot.style;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n      var tableWidth = void 0;\n\n      if (this.trimmingContainer !== window || preventOverflow === 'vertical') {\n        var height = this.wot.wtViewport.getWorkspaceHeight() - scrollbarHeight;\n\n        height = Math.min(height, (0, _element.innerHeight)(this.wot.wtTable.wtRootElement));\n\n        overlayRootStyle.height = height + 'px';\n      } else {\n        overlayRootStyle.height = '';\n      }\n\n      this.clone.wtTable.holder.style.height = overlayRootStyle.height;\n\n      tableWidth = (0, _element.outerWidth)(this.clone.wtTable.TABLE);\n      overlayRootStyle.width = (tableWidth === 0 ? tableWidth : tableWidth + 4) + 'px';\n    }\n\n    /**\n     * Adjust overlay root childs size\n     */\n\n  }, {\n    key: 'adjustRootChildrenSize',\n    value: function adjustRootChildrenSize() {\n      var scrollbarWidth = (0, _element.getScrollbarWidth)();\n\n      this.clone.wtTable.hider.style.height = this.hider.style.height;\n      this.clone.wtTable.holder.style.height = this.clone.wtTable.holder.parentNode.style.height;\n\n      if (scrollbarWidth === 0) {\n        scrollbarWidth = 30;\n      }\n      this.clone.wtTable.holder.style.width = parseInt(this.clone.wtTable.holder.parentNode.style.width, 10) + scrollbarWidth + 'px';\n    }\n\n    /**\n     * Adjust the overlay dimensions and position\n     */\n\n  }, {\n    key: 'applyToDOM',\n    value: function applyToDOM() {\n      var total = this.wot.getSetting('totalColumns');\n\n      if (!this.areElementSizesAdjusted) {\n        this.adjustElementsSize();\n      }\n      if (typeof this.wot.wtViewport.columnsRenderCalculator.startPosition === 'number') {\n        this.spreader.style.left = this.wot.wtViewport.columnsRenderCalculator.startPosition + 'px';\n      } else if (total === 0) {\n        this.spreader.style.left = '0';\n      } else {\n        throw new Error('Incorrect value of the columnsRenderCalculator');\n      }\n      this.spreader.style.right = '';\n\n      if (this.needFullRender) {\n        this.syncOverlayOffset();\n      }\n    }\n\n    /**\n     * Synchronize calculated top position to an element\n     */\n\n  }, {\n    key: 'syncOverlayOffset',\n    value: function syncOverlayOffset() {\n      if (typeof this.wot.wtViewport.rowsRenderCalculator.startPosition === 'number') {\n        this.clone.wtTable.spreader.style.top = this.wot.wtViewport.rowsRenderCalculator.startPosition + 'px';\n      } else {\n        this.clone.wtTable.spreader.style.top = '';\n      }\n    }\n\n    /**\n     * Scrolls horizontally to a column at the left edge of the viewport\n     *\n     * @param sourceCol {Number} Column index which you want to scroll to\n     * @param [beyondRendered=false] {Boolean} if `true`, scrolls according to the bottom edge (top edge is by default)\n     */\n\n  }, {\n    key: 'scrollTo',\n    value: function scrollTo(sourceCol, beyondRendered) {\n      var newX = this.getTableParentOffset();\n      var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot;\n      var mainHolder = sourceInstance.wtTable.holder;\n      var scrollbarCompensation = 0;\n\n      if (beyondRendered && mainHolder.offsetWidth !== mainHolder.clientWidth) {\n        scrollbarCompensation = (0, _element.getScrollbarWidth)();\n      }\n      if (beyondRendered) {\n        newX += this.sumCellSizes(0, sourceCol + 1);\n        newX -= this.wot.wtViewport.getViewportWidth();\n      } else {\n        newX += this.sumCellSizes(this.wot.getSetting('fixedColumnsLeft'), sourceCol);\n      }\n      newX += scrollbarCompensation;\n\n      this.setScrollPosition(newX);\n    }\n\n    /**\n     * Gets table parent left position\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getTableParentOffset',\n    value: function getTableParentOffset() {\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n      var offset = 0;\n\n      if (!preventOverflow && this.trimmingContainer === window) {\n        offset = this.wot.wtTable.holderOffset.left;\n      }\n\n      return offset;\n    }\n\n    /**\n     * Gets the main overlay's horizontal scroll position\n     *\n     * @returns {Number} Main table's vertical scroll position\n     */\n\n  }, {\n    key: 'getScrollPosition',\n    value: function getScrollPosition() {\n      return (0, _element.getScrollLeft)(this.mainTableScrollableElement);\n    }\n\n    /**\n     * Adds css classes to hide the header border's header (cell-selection border hiding issue)\n     *\n     * @param {Number} position Header X position if trimming container is window or scroll top if not\n     */\n\n  }, {\n    key: 'adjustHeaderBordersPosition',\n    value: function adjustHeaderBordersPosition(position) {\n      var masterParent = this.wot.wtTable.holder.parentNode;\n      var rowHeaders = this.wot.getSetting('rowHeaders');\n      var fixedColumnsLeft = this.wot.getSetting('fixedColumnsLeft');\n      var totalRows = this.wot.getSetting('totalRows');\n\n      if (totalRows) {\n        (0, _element.removeClass)(masterParent, 'emptyRows');\n      } else {\n        (0, _element.addClass)(masterParent, 'emptyRows');\n      }\n\n      if (fixedColumnsLeft && !rowHeaders.length) {\n        (0, _element.addClass)(masterParent, 'innerBorderLeft');\n      } else if (!fixedColumnsLeft && rowHeaders.length) {\n        var previousState = (0, _element.hasClass)(masterParent, 'innerBorderLeft');\n\n        if (position) {\n          (0, _element.addClass)(masterParent, 'innerBorderLeft');\n        } else {\n          (0, _element.removeClass)(masterParent, 'innerBorderLeft');\n        }\n        if (!previousState && position || previousState && !position) {\n          this.wot.wtOverlays.adjustElementsSize();\n        }\n      }\n    }\n  }]);\n\n  return LeftOverlay;\n}(_base2.default);\n\n_base2.default.registerOverlay(_base2.default.CLONE_LEFT, LeftOverlay);\n\nexports.default = LeftOverlay;\n\n/***/ }),\n/* 230 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @class TopOverlay\n */\nvar TopOverlay = function (_Overlay) {\n  _inherits(TopOverlay, _Overlay);\n\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function TopOverlay(wotInstance) {\n    _classCallCheck(this, TopOverlay);\n\n    var _this = _possibleConstructorReturn(this, (TopOverlay.__proto__ || Object.getPrototypeOf(TopOverlay)).call(this, wotInstance));\n\n    _this.clone = _this.makeClone(_base2.default.CLONE_TOP);\n    return _this;\n  }\n\n  /**\n   * Checks if overlay should be fully rendered\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(TopOverlay, [{\n    key: 'shouldBeRendered',\n    value: function shouldBeRendered() {\n      return !!(this.wot.getSetting('fixedRowsTop') || this.wot.getSetting('columnHeaders').length);\n    }\n\n    /**\n     * Updates the top overlay position\n     */\n\n  }, {\n    key: 'resetFixedPosition',\n    value: function resetFixedPosition() {\n      if (!this.needFullRender || !this.wot.wtTable.holder.parentNode) {\n        // removed from DOM\n        return;\n      }\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var headerPosition = 0;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (this.trimmingContainer === window && (!preventOverflow || preventOverflow !== 'vertical')) {\n        var box = this.wot.wtTable.hider.getBoundingClientRect();\n        var top = Math.ceil(box.top);\n        var bottom = Math.ceil(box.bottom);\n        var finalLeft = void 0;\n        var finalTop = void 0;\n\n        finalLeft = this.wot.wtTable.hider.style.left;\n        finalLeft = finalLeft === '' ? 0 : finalLeft;\n\n        if (top < 0 && bottom - overlayRoot.offsetHeight > 0) {\n          finalTop = -top;\n        } else {\n          finalTop = 0;\n        }\n        headerPosition = finalTop;\n        finalTop += 'px';\n\n        (0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop);\n      } else {\n        headerPosition = this.getScrollPosition();\n        (0, _element.resetCssTransform)(overlayRoot);\n      }\n\n      this.adjustHeaderBordersPosition(headerPosition);\n\n      this.adjustElementsSize();\n    }\n\n    /**\n     * Sets the main overlay's vertical scroll position\n     *\n     * @param {Number} pos\n     */\n\n  }, {\n    key: 'setScrollPosition',\n    value: function setScrollPosition(pos) {\n      if (this.mainTableScrollableElement === window) {\n        window.scrollTo((0, _element.getWindowScrollLeft)(), pos);\n      } else {\n        this.mainTableScrollableElement.scrollTop = pos;\n      }\n    }\n\n    /**\n     * Triggers onScroll hook callback\n     */\n\n  }, {\n    key: 'onScroll',\n    value: function onScroll() {\n      this.wot.getSetting('onScrollHorizontally');\n    }\n\n    /**\n     * Calculates total sum cells height\n     *\n     * @param {Number} from Row index which calculates started from\n     * @param {Number} to Row index where calculation is finished\n     * @returns {Number} Height sum\n     */\n\n  }, {\n    key: 'sumCellSizes',\n    value: function sumCellSizes(from, to) {\n      var sum = 0;\n      var defaultRowHeight = this.wot.wtSettings.settings.defaultRowHeight;\n\n      while (from < to) {\n        var height = this.wot.wtTable.getRowHeight(from);\n\n        sum += height === void 0 ? defaultRowHeight : height;\n        from++;\n      }\n\n      return sum;\n    }\n\n    /**\n     * Adjust overlay root element, childs and master table element sizes (width, height).\n     *\n     * @param {Boolean} [force=false]\n     */\n\n  }, {\n    key: 'adjustElementsSize',\n    value: function adjustElementsSize() {\n      var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      this.updateTrimmingContainer();\n\n      if (this.needFullRender || force) {\n        this.adjustRootElementSize();\n        this.adjustRootChildrenSize();\n\n        if (!force) {\n          this.areElementSizesAdjusted = true;\n        }\n      }\n    }\n\n    /**\n     * Adjust overlay root element size (width and height).\n     */\n\n  }, {\n    key: 'adjustRootElementSize',\n    value: function adjustRootElementSize() {\n      var masterHolder = this.wot.wtTable.holder;\n      var scrollbarWidth = masterHolder.clientWidth === masterHolder.offsetWidth ? 0 : (0, _element.getScrollbarWidth)();\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var overlayRootStyle = overlayRoot.style;\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n      var tableHeight = void 0;\n\n      if (this.trimmingContainer !== window || preventOverflow === 'horizontal') {\n        var width = this.wot.wtViewport.getWorkspaceWidth() - scrollbarWidth;\n\n        width = Math.min(width, (0, _element.innerWidth)(this.wot.wtTable.wtRootElement));\n\n        overlayRootStyle.width = width + 'px';\n      } else {\n        overlayRootStyle.width = '';\n      }\n\n      this.clone.wtTable.holder.style.width = overlayRootStyle.width;\n\n      tableHeight = (0, _element.outerHeight)(this.clone.wtTable.TABLE);\n      overlayRootStyle.height = (tableHeight === 0 ? tableHeight : tableHeight + 4) + 'px';\n    }\n\n    /**\n     * Adjust overlay root childs size\n     */\n\n  }, {\n    key: 'adjustRootChildrenSize',\n    value: function adjustRootChildrenSize() {\n      var scrollbarWidth = (0, _element.getScrollbarWidth)();\n\n      this.clone.wtTable.hider.style.width = this.hider.style.width;\n      this.clone.wtTable.holder.style.width = this.clone.wtTable.holder.parentNode.style.width;\n\n      if (scrollbarWidth === 0) {\n        scrollbarWidth = 30;\n      }\n      this.clone.wtTable.holder.style.height = parseInt(this.clone.wtTable.holder.parentNode.style.height, 10) + scrollbarWidth + 'px';\n    }\n\n    /**\n     * Adjust the overlay dimensions and position\n     */\n\n  }, {\n    key: 'applyToDOM',\n    value: function applyToDOM() {\n      var total = this.wot.getSetting('totalRows');\n\n      if (!this.areElementSizesAdjusted) {\n        this.adjustElementsSize();\n      }\n      if (typeof this.wot.wtViewport.rowsRenderCalculator.startPosition === 'number') {\n        this.spreader.style.top = this.wot.wtViewport.rowsRenderCalculator.startPosition + 'px';\n      } else if (total === 0) {\n        // can happen if there are 0 rows\n        this.spreader.style.top = '0';\n      } else {\n        throw new Error('Incorrect value of the rowsRenderCalculator');\n      }\n      this.spreader.style.bottom = '';\n\n      if (this.needFullRender) {\n        this.syncOverlayOffset();\n      }\n    }\n\n    /**\n     * Synchronize calculated left position to an element\n     */\n\n  }, {\n    key: 'syncOverlayOffset',\n    value: function syncOverlayOffset() {\n      if (typeof this.wot.wtViewport.columnsRenderCalculator.startPosition === 'number') {\n        this.clone.wtTable.spreader.style.left = this.wot.wtViewport.columnsRenderCalculator.startPosition + 'px';\n      } else {\n        this.clone.wtTable.spreader.style.left = '';\n      }\n    }\n\n    /**\n     * Scrolls vertically to a row\n     *\n     * @param sourceRow {Number} Row index which you want to scroll to\n     * @param [bottomEdge=false] {Boolean} if `true`, scrolls according to the bottom edge (top edge is by default)\n     */\n\n  }, {\n    key: 'scrollTo',\n    value: function scrollTo(sourceRow, bottomEdge) {\n      var newY = this.getTableParentOffset();\n      var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot;\n      var mainHolder = sourceInstance.wtTable.holder;\n      var scrollbarCompensation = 0;\n\n      if (bottomEdge && mainHolder.offsetHeight !== mainHolder.clientHeight) {\n        scrollbarCompensation = (0, _element.getScrollbarWidth)();\n      }\n\n      if (bottomEdge) {\n        var fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');\n        var fixedRowsTop = this.wot.getSetting('fixedRowsTop');\n        var totalRows = this.wot.getSetting('totalRows');\n\n        newY += this.sumCellSizes(0, sourceRow + 1);\n        newY -= this.wot.wtViewport.getViewportHeight() - this.sumCellSizes(totalRows - fixedRowsBottom, totalRows);\n        // Fix 1 pixel offset when cell is selected\n        newY += 1;\n      } else {\n        newY += this.sumCellSizes(this.wot.getSetting('fixedRowsTop'), sourceRow);\n      }\n      newY += scrollbarCompensation;\n\n      this.setScrollPosition(newY);\n    }\n\n    /**\n     * Gets table parent top position\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getTableParentOffset',\n    value: function getTableParentOffset() {\n      if (this.mainTableScrollableElement === window) {\n        return this.wot.wtTable.holderOffset.top;\n      }\n      return 0;\n    }\n\n    /**\n     * Gets the main overlay's vertical scroll position\n     *\n     * @returns {Number} Main table's vertical scroll position\n     */\n\n  }, {\n    key: 'getScrollPosition',\n    value: function getScrollPosition() {\n      return (0, _element.getScrollTop)(this.mainTableScrollableElement);\n    }\n\n    /**\n     * Redraw borders of selection\n     *\n     * @param {WalkontableSelection} selection Selection for redraw\n     */\n\n  }, {\n    key: 'redrawSelectionBorders',\n    value: function redrawSelectionBorders(selection) {\n      if (selection && selection.cellRange) {\n        var border = selection.getBorder(this.wot);\n        var corners = selection.getCorners();\n\n        border.disappear();\n        border.appear(corners);\n      }\n    }\n\n    /**\n     * Redrawing borders of all selections\n     */\n\n  }, {\n    key: 'redrawAllSelectionsBorders',\n    value: function redrawAllSelectionsBorders() {\n      var _this2 = this;\n\n      var selections = this.wot.selections;\n\n      this.redrawSelectionBorders(selections.getCell());\n\n      (0, _array.arrayEach)(selections.getAreas(), function (area) {\n        _this2.redrawSelectionBorders(area);\n      });\n      this.redrawSelectionBorders(selections.getFill());\n\n      this.wot.wtTable.wot.wtOverlays.leftOverlay.refresh();\n    }\n\n    /**\n     * Adds css classes to hide the header border's header (cell-selection border hiding issue)\n     *\n     * @param {Number} position Header Y position if trimming container is window or scroll top if not\n     */\n\n  }, {\n    key: 'adjustHeaderBordersPosition',\n    value: function adjustHeaderBordersPosition(position) {\n      var masterParent = this.wot.wtTable.holder.parentNode;\n      var totalColumns = this.wot.getSetting('totalColumns');\n\n      if (totalColumns) {\n        (0, _element.removeClass)(masterParent, 'emptyColumns');\n      } else {\n        (0, _element.addClass)(masterParent, 'emptyColumns');\n      }\n\n      if (this.wot.getSetting('fixedRowsTop') === 0 && this.wot.getSetting('columnHeaders').length > 0) {\n        var previousState = (0, _element.hasClass)(masterParent, 'innerBorderTop');\n\n        if (position || this.wot.getSetting('totalRows') === 0) {\n          (0, _element.addClass)(masterParent, 'innerBorderTop');\n        } else {\n          (0, _element.removeClass)(masterParent, 'innerBorderTop');\n        }\n\n        if (!previousState && position || previousState && !position) {\n          this.wot.wtOverlays.adjustElementsSize();\n\n          // cell borders should be positioned once again,\n          // because we added / removed 1px border from table header\n          this.redrawAllSelectionsBorders();\n        }\n      }\n\n      // nasty workaround for double border in the header, TODO: find a pure-css solution\n      if (this.wot.getSetting('rowHeaders').length === 0) {\n        var secondHeaderCell = this.clone.wtTable.THEAD.querySelectorAll('th:nth-of-type(2)');\n\n        if (secondHeaderCell) {\n          for (var i = 0; i < secondHeaderCell.length; i++) {\n            secondHeaderCell[i].style['border-left-width'] = 0;\n          }\n        }\n      }\n    }\n  }]);\n\n  return TopOverlay;\n}(_base2.default);\n\n_base2.default.registerOverlay(_base2.default.CLONE_TOP, TopOverlay);\n\nexports.default = TopOverlay;\n\n/***/ }),\n/* 231 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _base = __webpack_require__(35);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @class TopLeftCornerOverlay\n */\nvar TopLeftCornerOverlay = function (_Overlay) {\n  _inherits(TopLeftCornerOverlay, _Overlay);\n\n  /**\n   * @param {Walkontable} wotInstance\n   */\n  function TopLeftCornerOverlay(wotInstance) {\n    _classCallCheck(this, TopLeftCornerOverlay);\n\n    var _this = _possibleConstructorReturn(this, (TopLeftCornerOverlay.__proto__ || Object.getPrototypeOf(TopLeftCornerOverlay)).call(this, wotInstance));\n\n    _this.clone = _this.makeClone(_base2.default.CLONE_TOP_LEFT_CORNER);\n    return _this;\n  }\n\n  /**\n   * Checks if overlay should be fully rendered\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(TopLeftCornerOverlay, [{\n    key: 'shouldBeRendered',\n    value: function shouldBeRendered() {\n      return !!((this.wot.getSetting('fixedRowsTop') || this.wot.getSetting('columnHeaders').length) && (this.wot.getSetting('fixedColumnsLeft') || this.wot.getSetting('rowHeaders').length));\n    }\n\n    /**\n     * Updates the corner overlay position\n     */\n\n  }, {\n    key: 'resetFixedPosition',\n    value: function resetFixedPosition() {\n      this.updateTrimmingContainer();\n\n      if (!this.wot.wtTable.holder.parentNode) {\n        // removed from DOM\n        return;\n      }\n      var overlayRoot = this.clone.wtTable.holder.parentNode;\n      var tableHeight = (0, _element.outerHeight)(this.clone.wtTable.TABLE);\n      var tableWidth = (0, _element.outerWidth)(this.clone.wtTable.TABLE);\n      var preventOverflow = this.wot.getSetting('preventOverflow');\n\n      if (this.trimmingContainer === window) {\n        var box = this.wot.wtTable.hider.getBoundingClientRect();\n        var top = Math.ceil(box.top);\n        var left = Math.ceil(box.left);\n        var bottom = Math.ceil(box.bottom);\n        var right = Math.ceil(box.right);\n        var finalLeft = '0';\n        var finalTop = '0';\n\n        if (!preventOverflow || preventOverflow === 'vertical') {\n          if (left < 0 && right - overlayRoot.offsetWidth > 0) {\n            finalLeft = -left + 'px';\n          }\n        }\n\n        if (!preventOverflow || preventOverflow === 'horizontal') {\n          if (top < 0 && bottom - overlayRoot.offsetHeight > 0) {\n            finalTop = -top + 'px';\n          }\n        }\n        (0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop);\n      } else {\n        (0, _element.resetCssTransform)(overlayRoot);\n      }\n      overlayRoot.style.height = (tableHeight === 0 ? tableHeight : tableHeight + 4) + 'px';\n      overlayRoot.style.width = (tableWidth === 0 ? tableWidth : tableWidth + 4) + 'px';\n    }\n  }]);\n\n  return TopLeftCornerOverlay;\n}(_base2.default);\n\n_base2.default.registerOverlay(_base2.default.CLONE_TOP_LEFT_CORNER, TopLeftCornerOverlay);\n\nexports.default = TopLeftCornerOverlay;\n\n/***/ }),\n/* 232 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _border = __webpack_require__(187);\n\nvar _border2 = _interopRequireDefault(_border);\n\nvar _coords = __webpack_require__(54);\n\nvar _coords2 = _interopRequireDefault(_coords);\n\nvar _range = __webpack_require__(86);\n\nvar _range2 = _interopRequireDefault(_range);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Selection\n */\nvar Selection = function () {\n  /**\n   * @param {Object} settings\n   * @param {CellRange} cellRange\n   */\n  function Selection(settings, cellRange) {\n    _classCallCheck(this, Selection);\n\n    this.settings = settings;\n    this.cellRange = cellRange || null;\n    this.instanceBorders = {};\n    this.classNames = [this.settings.className];\n    this.classNameGenerator = this.linearClassNameGenerator(this.settings.className, this.settings.layerLevel);\n  }\n\n  /**\n   * Each Walkontable clone requires it's own border for every selection. This method creates and returns selection\n   * borders per instance\n   *\n   * @param {Walkontable} wotInstance\n   * @returns {Border}\n   */\n\n\n  _createClass(Selection, [{\n    key: 'getBorder',\n    value: function getBorder(wotInstance) {\n      if (!this.instanceBorders[wotInstance.guid]) {\n        this.instanceBorders[wotInstance.guid] = new _border2.default(wotInstance, this.settings);\n      }\n\n      return this.instanceBorders[wotInstance.guid];\n    }\n\n    /**\n     * Checks if selection is empty\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isEmpty',\n    value: function isEmpty() {\n      return this.cellRange === null;\n    }\n\n    /**\n     * Adds a cell coords to the selection\n     *\n     * @param {CellCoords} coords\n     */\n\n  }, {\n    key: 'add',\n    value: function add(coords) {\n      if (this.isEmpty()) {\n        this.cellRange = new _range2.default(coords);\n      } else {\n        this.cellRange.expand(coords);\n      }\n\n      return this;\n    }\n\n    /**\n     * If selection range from or to property equals oldCoords, replace it with newCoords. Return boolean\n     * information about success\n     *\n     * @param {CellCoords} oldCoords\n     * @param {CellCoords} newCoords\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'replace',\n    value: function replace(oldCoords, newCoords) {\n      if (!this.isEmpty()) {\n        if (this.cellRange.from.isEqual(oldCoords)) {\n          this.cellRange.from = newCoords;\n\n          return true;\n        }\n        if (this.cellRange.to.isEqual(oldCoords)) {\n          this.cellRange.to = newCoords;\n\n          return true;\n        }\n      }\n\n      return false;\n    }\n\n    /**\n     * Clears selection\n     *\n     * @returns {Selection}\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.cellRange = null;\n\n      return this;\n    }\n\n    /**\n     * Returns the top left (TL) and bottom right (BR) selection coordinates\n     *\n     * @returns {Array} Returns array of coordinates for example `[1, 1, 5, 5]`\n     */\n\n  }, {\n    key: 'getCorners',\n    value: function getCorners() {\n      var topLeft = this.cellRange.getTopLeftCorner();\n      var bottomRight = this.cellRange.getBottomRightCorner();\n\n      return [topLeft.row, topLeft.col, bottomRight.row, bottomRight.col];\n    }\n\n    /**\n     * Adds class name to cell element at given coords\n     *\n     * @param {Walkontable} wotInstance Walkontable instance\n     * @param {Number} sourceRow Cell row coord\n     * @param {Number} sourceColumn Cell column coord\n     * @param {String} className Class name\n     * @param {Boolean} [markIntersections=false] If `true`, linear className generator will be used to add CSS classes\n     *                                            in a continuous way.\n     * @returns {Selection}\n     */\n\n  }, {\n    key: 'addClassAtCoords',\n    value: function addClassAtCoords(wotInstance, sourceRow, sourceColumn, className) {\n      var markIntersections = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n      var TD = wotInstance.wtTable.getCell(new _coords2.default(sourceRow, sourceColumn));\n\n      if ((typeof TD === 'undefined' ? 'undefined' : _typeof(TD)) === 'object') {\n        if (markIntersections) {\n          className = this.classNameGenerator(TD);\n\n          if (!this.classNames.includes(className)) {\n            this.classNames.push(className);\n          }\n        }\n\n        (0, _element.addClass)(TD, className);\n      }\n\n      return this;\n    }\n\n    /**\n     * Generate helper for calculating classNames based on previously added base className.\n     * The generated className is always generated as a continuation of the previous className. For example, when\n     * the currently checked element has 'area-2' className the generated new className will be 'area-3'. When\n     * the element doesn't have any classNames than the base className will be returned ('area');\n     *\n     * @param {String} baseClassName Base className to be used.\n     * @param {Number} layerLevelOwner Layer level which the instance of the Selection belongs to.\n     * @return {Function}\n     */\n\n  }, {\n    key: 'linearClassNameGenerator',\n    value: function linearClassNameGenerator(baseClassName, layerLevelOwner) {\n      // TODO: Make this recursive function Proper Tail Calls (TCO/PTC) friendly.\n      return function calcClassName(element) {\n        var previousIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;\n\n        if (layerLevelOwner === 0 || previousIndex === 0) {\n          return baseClassName;\n        }\n\n        var index = previousIndex >= 0 ? previousIndex : layerLevelOwner;\n        var className = baseClassName;\n\n        index -= 1;\n\n        var previousClassName = index === 0 ? baseClassName : baseClassName + '-' + index;\n\n        if ((0, _element.hasClass)(element, previousClassName)) {\n          var currentLayer = index + 1;\n\n          className = baseClassName + '-' + currentLayer;\n        } else {\n          className = calcClassName(element, index);\n        }\n\n        return className;\n      };\n    }\n\n    /**\n     * @param wotInstance\n     */\n\n  }, {\n    key: 'draw',\n    value: function draw(wotInstance) {\n      if (this.isEmpty()) {\n        if (this.settings.border) {\n          this.getBorder(wotInstance).disappear();\n        }\n\n        return;\n      }\n\n      var renderedRows = wotInstance.wtTable.getRenderedRowsCount();\n      var renderedColumns = wotInstance.wtTable.getRenderedColumnsCount();\n      var corners = this.getCorners();\n\n      var _corners = _slicedToArray(corners, 4),\n          topRow = _corners[0],\n          topColumn = _corners[1],\n          bottomRow = _corners[2],\n          bottomColumn = _corners[3];\n\n      for (var column = 0; column < renderedColumns; column += 1) {\n        var sourceCol = wotInstance.wtTable.columnFilter.renderedToSource(column);\n\n        if (sourceCol >= topColumn && sourceCol <= bottomColumn) {\n          var TH = wotInstance.wtTable.getColumnHeader(sourceCol);\n\n          if (TH) {\n            var newClasses = [];\n\n            if (this.settings.highlightHeaderClassName) {\n              newClasses.push(this.settings.highlightHeaderClassName);\n            }\n\n            if (this.settings.highlightColumnClassName) {\n              newClasses.push(this.settings.highlightColumnClassName);\n            }\n\n            (0, _element.addClass)(TH, newClasses);\n          }\n        }\n      }\n\n      for (var row = 0; row < renderedRows; row += 1) {\n        var sourceRow = wotInstance.wtTable.rowFilter.renderedToSource(row);\n\n        if (sourceRow >= topRow && sourceRow <= bottomRow) {\n          var _TH = wotInstance.wtTable.getRowHeader(sourceRow);\n\n          if (_TH) {\n            var _newClasses = [];\n\n            if (this.settings.highlightHeaderClassName) {\n              _newClasses.push(this.settings.highlightHeaderClassName);\n            }\n\n            if (this.settings.highlightRowClassName) {\n              _newClasses.push(this.settings.highlightRowClassName);\n            }\n\n            (0, _element.addClass)(_TH, _newClasses);\n          }\n        }\n\n        for (var _column = 0; _column < renderedColumns; _column += 1) {\n          var _sourceCol = wotInstance.wtTable.columnFilter.renderedToSource(_column);\n\n          if (sourceRow >= topRow && sourceRow <= bottomRow && _sourceCol >= topColumn && _sourceCol <= bottomColumn) {\n            // selected cell\n            if (this.settings.className) {\n              this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.className, this.settings.markIntersections);\n            }\n          } else if (sourceRow >= topRow && sourceRow <= bottomRow) {\n            // selection is in this row\n            if (this.settings.highlightRowClassName) {\n              this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.highlightRowClassName);\n            }\n          } else if (_sourceCol >= topColumn && _sourceCol <= bottomColumn) {\n            // selection is in this column\n            if (this.settings.highlightColumnClassName) {\n              this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.highlightColumnClassName);\n            }\n          }\n\n          var additionalSelectionClass = wotInstance.getSetting('onAfterDrawSelection', sourceRow, _sourceCol, corners, this.settings.layerLevel);\n\n          if (typeof additionalSelectionClass === 'string') {\n            this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, additionalSelectionClass);\n          }\n        }\n      }\n\n      wotInstance.getSetting('onBeforeDrawBorders', corners, this.settings.className);\n\n      if (this.settings.border) {\n        // warning! border.appear modifies corners!\n        this.getBorder(wotInstance).appear(corners);\n      }\n    }\n  }]);\n\n  return Selection;\n}();\n\nexports.default = Selection;\n\n/***/ }),\n/* 233 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * autoResize - resizes a DOM element to the width and height of another DOM element\n *\n * Copyright 2014, Marcin Warpechowski\n * Licensed under the MIT license\n */\n\nfunction autoResize() {\n  var defaults = {\n    minHeight: 200,\n    maxHeight: 300,\n    minWidth: 100,\n    maxWidth: 300\n  },\n      el,\n      body = document.body,\n      text = document.createTextNode(''),\n      span = document.createElement('SPAN'),\n      observe = function observe(element, event, handler) {\n    if (element.attachEvent) {\n      element.attachEvent('on' + event, handler);\n    } else {\n      element.addEventListener(event, handler, false);\n    }\n  },\n      _unObserve = function _unObserve(element, event, handler) {\n    if (element.removeEventListener) {\n      element.removeEventListener(event, handler, false);\n    } else {\n      element.detachEvent('on' + event, handler);\n    }\n  },\n      resize = function resize(newChar) {\n    var width, scrollHeight;\n\n    if (!newChar) {\n      newChar = \"\";\n    } else if (!/^[a-zA-Z \\.,\\\\\\/\\|0-9]$/.test(newChar)) {\n      newChar = \".\";\n    }\n\n    if (text.textContent !== void 0) {\n      text.textContent = el.value + newChar;\n    } else {\n      text.data = el.value + newChar; //IE8\n    }\n    span.style.fontSize = getComputedStyle(el).fontSize;\n    span.style.fontFamily = getComputedStyle(el).fontFamily;\n    span.style.whiteSpace = \"pre\";\n\n    body.appendChild(span);\n    width = span.clientWidth + 2;\n    body.removeChild(span);\n\n    el.style.height = defaults.minHeight + 'px';\n\n    if (defaults.minWidth > width) {\n      el.style.width = defaults.minWidth + 'px';\n    } else if (width > defaults.maxWidth) {\n      el.style.width = defaults.maxWidth + 'px';\n    } else {\n      el.style.width = width + 'px';\n    }\n    scrollHeight = el.scrollHeight ? el.scrollHeight - 1 : 0;\n\n    if (defaults.minHeight > scrollHeight) {\n      el.style.height = defaults.minHeight + 'px';\n    } else if (defaults.maxHeight < scrollHeight) {\n      el.style.height = defaults.maxHeight + 'px';\n      el.style.overflowY = 'visible';\n    } else {\n      el.style.height = scrollHeight + 'px';\n    }\n  },\n      delayedResize = function delayedResize() {\n    window.setTimeout(resize, 0);\n  },\n      extendDefaults = function extendDefaults(config) {\n\n    if (config && config.minHeight) {\n      if (config.minHeight == 'inherit') {\n        defaults.minHeight = el.clientHeight;\n      } else {\n        var minHeight = parseInt(config.minHeight);\n        if (!isNaN(minHeight)) {\n          defaults.minHeight = minHeight;\n        }\n      }\n    }\n\n    if (config && config.maxHeight) {\n      if (config.maxHeight == 'inherit') {\n        defaults.maxHeight = el.clientHeight;\n      } else {\n        var maxHeight = parseInt(config.maxHeight);\n        if (!isNaN(maxHeight)) {\n          defaults.maxHeight = maxHeight;\n        }\n      }\n    }\n\n    if (config && config.minWidth) {\n      if (config.minWidth == 'inherit') {\n        defaults.minWidth = el.clientWidth;\n      } else {\n        var minWidth = parseInt(config.minWidth);\n        if (!isNaN(minWidth)) {\n          defaults.minWidth = minWidth;\n        }\n      }\n    }\n\n    if (config && config.maxWidth) {\n      if (config.maxWidth == 'inherit') {\n        defaults.maxWidth = el.clientWidth;\n      } else {\n        var maxWidth = parseInt(config.maxWidth);\n        if (!isNaN(maxWidth)) {\n          defaults.maxWidth = maxWidth;\n        }\n      }\n    }\n\n    if (!span.firstChild) {\n      span.className = \"autoResize\";\n      span.style.display = 'inline-block';\n      span.appendChild(text);\n    }\n  },\n      _init = function _init(el_, config, doObserve) {\n    el = el_;\n    extendDefaults(config);\n\n    if (el.nodeName == 'TEXTAREA') {\n\n      el.style.resize = 'none';\n      el.style.overflowY = '';\n      el.style.height = defaults.minHeight + 'px';\n      el.style.minWidth = defaults.minWidth + 'px';\n      el.style.maxWidth = defaults.maxWidth + 'px';\n      el.style.overflowY = 'hidden';\n    }\n\n    if (doObserve) {\n      observe(el, 'change', resize);\n      observe(el, 'cut', delayedResize);\n      observe(el, 'paste', delayedResize);\n      observe(el, 'drop', delayedResize);\n      observe(el, 'keydown', delayedResize);\n      observe(el, 'focus', resize);\n    }\n\n    resize();\n  };\n\n  function getComputedStyle(element) {\n    return element.currentStyle || document.defaultView.getComputedStyle(element);\n  }\n\n  return {\n    init: function init(el_, config, doObserve) {\n      _init(el_, config, doObserve);\n    },\n    unObserve: function unObserve() {\n      _unObserve(el, 'change', resize);\n      _unObserve(el, 'cut', delayedResize);\n      _unObserve(el, 'paste', delayedResize);\n      _unObserve(el, 'drop', delayedResize);\n      _unObserve(el, 'keydown', delayedResize);\n      _unObserve(el, 'focus', resize);\n    },\n    resize: resize\n  };\n}\n\nif (true) {\n  module.exports = autoResize;\n}\n\n/***/ }),\n/* 234 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _baseEditor = __webpack_require__(53);\n\nvar _baseEditor2 = _interopRequireDefault(_baseEditor);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor CheckboxEditor\n * @class CheckboxEditor\n */\nvar CheckboxEditor = function (_BaseEditor) {\n  _inherits(CheckboxEditor, _BaseEditor);\n\n  function CheckboxEditor() {\n    _classCallCheck(this, CheckboxEditor);\n\n    return _possibleConstructorReturn(this, (CheckboxEditor.__proto__ || Object.getPrototypeOf(CheckboxEditor)).apply(this, arguments));\n  }\n\n  _createClass(CheckboxEditor, [{\n    key: 'beginEditing',\n    value: function beginEditing(initialValue, event) {\n      // Just some events connected with checkbox editor are delegated here. Some `keydown` events like `enter` and `space` key press\n      // are handled inside `checkboxRenderer`. Some events come here from `editorManager`. Below `if` statement was created by author\n      // for purpose of handling only `doubleclick` event which may be done on a cell with checkbox.\n\n      if (event.type === 'mouseup') {\n        var checkbox = this.TD.querySelector('input[type=\"checkbox\"]');\n\n        if (!(0, _element.hasClass)(checkbox, 'htBadValue')) {\n          checkbox.click();\n        }\n      }\n    }\n  }, {\n    key: 'finishEditing',\n    value: function finishEditing() {}\n  }, {\n    key: 'init',\n    value: function init() {}\n  }, {\n    key: 'open',\n    value: function open() {}\n  }, {\n    key: 'close',\n    value: function close() {}\n  }, {\n    key: 'getValue',\n    value: function getValue() {}\n  }, {\n    key: 'setValue',\n    value: function setValue() {}\n  }, {\n    key: 'focus',\n    value: function focus() {}\n  }]);\n\n  return CheckboxEditor;\n}(_baseEditor2.default);\n\nexports.default = CheckboxEditor;\n\n/***/ }),\n/* 235 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _moment = __webpack_require__(55);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _pikaday = __webpack_require__(236);\n\nvar _pikaday2 = _interopRequireDefault(_pikaday);\n\n__webpack_require__(237);\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _unicode = __webpack_require__(21);\n\nvar _event = __webpack_require__(12);\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor DateEditor\n * @class DateEditor\n * @dependencies TextEditor moment pikaday\n */\nvar DateEditor = function (_TextEditor) {\n  _inherits(DateEditor, _TextEditor);\n\n  /**\n   * @param {Core} hotInstance Handsontable instance\n   * @private\n   */\n  function DateEditor(hotInstance) {\n    _classCallCheck(this, DateEditor);\n\n    // TODO: Move this option to general settings\n    var _this = _possibleConstructorReturn(this, (DateEditor.__proto__ || Object.getPrototypeOf(DateEditor)).call(this, hotInstance));\n\n    _this.defaultDateFormat = 'DD/MM/YYYY';\n    _this.isCellEdited = false;\n    _this.parentDestroyed = false;\n    return _this;\n  }\n\n  _createClass(DateEditor, [{\n    key: 'init',\n    value: function init() {\n      var _this2 = this;\n\n      if (typeof _moment2.default !== 'function') {\n        throw new Error('You need to include moment.js to your project.');\n      }\n\n      if (typeof _pikaday2.default !== 'function') {\n        throw new Error('You need to include Pikaday to your project.');\n      }\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'init', this).call(this);\n      this.instance.addHook('afterDestroy', function () {\n        _this2.parentDestroyed = true;\n        _this2.destroyElements();\n      });\n    }\n\n    /**\n     * Create data picker instance\n     */\n\n  }, {\n    key: 'createElements',\n    value: function createElements() {\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'createElements', this).call(this);\n\n      this.datePicker = document.createElement('DIV');\n      this.datePickerStyle = this.datePicker.style;\n      this.datePickerStyle.position = 'absolute';\n      this.datePickerStyle.top = 0;\n      this.datePickerStyle.left = 0;\n      this.datePickerStyle.zIndex = 9999;\n\n      (0, _element.addClass)(this.datePicker, 'htDatepickerHolder');\n      document.body.appendChild(this.datePicker);\n\n      this.$datePicker = new _pikaday2.default(this.getDatePickerConfig());\n      var eventManager = new _eventManager2.default(this);\n\n      /**\n       * Prevent recognizing clicking on datepicker as clicking outside of table\n       */\n      eventManager.addEventListener(this.datePicker, 'mousedown', function (event) {\n        return (0, _event.stopPropagation)(event);\n      });\n      this.hideDatepicker();\n    }\n\n    /**\n     * Destroy data picker instance\n     */\n\n  }, {\n    key: 'destroyElements',\n    value: function destroyElements() {\n      this.$datePicker.destroy();\n    }\n\n    /**\n     * Prepare editor to appear\n     *\n     * @param {Number} row Row index\n     * @param {Number} col Column index\n     * @param {String} prop Property name (passed when datasource is an array of objects)\n     * @param {HTMLTableCellElement} td Table cell element\n     * @param {*} originalValue Original value\n     * @param {Object} cellProperties Object with cell properties ({@see Core#getCellMeta})\n     */\n\n  }, {\n    key: 'prepare',\n    value: function prepare(row, col, prop, td, originalValue, cellProperties) {\n      this._opened = false;\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'prepare', this).call(this, row, col, prop, td, originalValue, cellProperties);\n    }\n\n    /**\n     * Open editor\n     *\n     * @param {Event} [event=null]\n     */\n\n  }, {\n    key: 'open',\n    value: function open() {\n      var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'open', this).call(this);\n      this.showDatepicker(event);\n    }\n\n    /**\n     * Close editor\n     */\n\n  }, {\n    key: 'close',\n    value: function close() {\n      var _this3 = this;\n\n      this._opened = false;\n      this.instance._registerTimeout(setTimeout(function () {\n        _this3.instance._refreshBorders();\n      }, 0));\n\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'close', this).call(this);\n    }\n\n    /**\n     * @param {Boolean} [isCancelled=false]\n     * @param {Boolean} [ctrlDown=false]\n     */\n\n  }, {\n    key: 'finishEditing',\n    value: function finishEditing() {\n      var isCancelled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n      var ctrlDown = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (isCancelled) {\n        // pressed ESC, restore original value\n        // var value = this.instance.getDataAtCell(this.row, this.col);\n        var value = this.originalValue;\n\n        if (value !== void 0) {\n          this.setValue(value);\n        }\n      }\n      this.hideDatepicker();\n      _get(DateEditor.prototype.__proto__ || Object.getPrototypeOf(DateEditor.prototype), 'finishEditing', this).call(this, isCancelled, ctrlDown);\n    }\n\n    /**\n     * Show data picker\n     *\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'showDatepicker',\n    value: function showDatepicker(event) {\n      this.$datePicker.config(this.getDatePickerConfig());\n\n      var offset = this.TD.getBoundingClientRect();\n      var dateFormat = this.cellProperties.dateFormat || this.defaultDateFormat;\n      var datePickerConfig = this.$datePicker.config();\n      var dateStr = void 0;\n      var isMouseDown = this.instance.view.isMouseDown();\n      var isMeta = event ? (0, _unicode.isMetaKey)(event.keyCode) : false;\n\n      this.datePickerStyle.top = window.pageYOffset + offset.top + (0, _element.outerHeight)(this.TD) + 'px';\n      this.datePickerStyle.left = window.pageXOffset + offset.left + 'px';\n\n      this.$datePicker._onInputFocus = function () {};\n      datePickerConfig.format = dateFormat;\n\n      if (this.originalValue) {\n        dateStr = this.originalValue;\n\n        if ((0, _moment2.default)(dateStr, dateFormat, true).isValid()) {\n          this.$datePicker.setMoment((0, _moment2.default)(dateStr, dateFormat), true);\n        }\n\n        // workaround for date/time cells - pikaday resets the cell value to 12:00 AM by default, this will overwrite the value.\n        if (this.getValue() !== this.originalValue) {\n          this.setValue(this.originalValue);\n        }\n\n        if (!isMeta && !isMouseDown) {\n          this.setValue('');\n        }\n      } else if (this.cellProperties.defaultDate) {\n        dateStr = this.cellProperties.defaultDate;\n\n        datePickerConfig.defaultDate = dateStr;\n\n        if ((0, _moment2.default)(dateStr, dateFormat, true).isValid()) {\n          this.$datePicker.setMoment((0, _moment2.default)(dateStr, dateFormat), true);\n        }\n\n        if (!isMeta && !isMouseDown) {\n          this.setValue('');\n        }\n      } else {\n        // if a default date is not defined, set a soft-default-date: display the current day and month in the\n        // datepicker, but don't fill the editor input\n        this.$datePicker.gotoToday();\n      }\n\n      this.datePickerStyle.display = 'block';\n      this.$datePicker.show();\n    }\n\n    /**\n     * Hide data picker\n     */\n\n  }, {\n    key: 'hideDatepicker',\n    value: function hideDatepicker() {\n      this.datePickerStyle.display = 'none';\n      this.$datePicker.hide();\n    }\n\n    /**\n     * Get date picker options.\n     *\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'getDatePickerConfig',\n    value: function getDatePickerConfig() {\n      var _this4 = this;\n\n      var htInput = this.TEXTAREA;\n      var options = {};\n\n      if (this.cellProperties && this.cellProperties.datePickerConfig) {\n        (0, _object.deepExtend)(options, this.cellProperties.datePickerConfig);\n      }\n      var origOnSelect = options.onSelect;\n      var origOnClose = options.onClose;\n\n      options.field = htInput;\n      options.trigger = htInput;\n      options.container = this.datePicker;\n      options.bound = false;\n      options.format = options.format || this.defaultDateFormat;\n      options.reposition = options.reposition || false;\n      options.onSelect = function (dateStr) {\n        if (!isNaN(dateStr.getTime())) {\n          dateStr = (0, _moment2.default)(dateStr).format(_this4.cellProperties.dateFormat || _this4.defaultDateFormat);\n        }\n        _this4.setValue(dateStr);\n        _this4.hideDatepicker();\n\n        if (origOnSelect) {\n          origOnSelect();\n        }\n      };\n      options.onClose = function () {\n        if (!_this4.parentDestroyed) {\n          _this4.finishEditing(false);\n        }\n        if (origOnClose) {\n          origOnClose();\n        }\n      };\n\n      return options;\n    }\n  }]);\n\n  return DateEditor;\n}(_textEditor2.default);\n\nexports.default = DateEditor;\n\n/***/ }),\n/* 236 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_236__;\n\n/***/ }),\n/* 237 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 238 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _autocompleteEditor = __webpack_require__(188);\n\nvar _autocompleteEditor2 = _interopRequireDefault(_autocompleteEditor);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor DropdownEditor\n * @class DropdownEditor\n * @dependencies AutocompleteEditor\n */\nvar DropdownEditor = function (_AutocompleteEditor) {\n  _inherits(DropdownEditor, _AutocompleteEditor);\n\n  function DropdownEditor() {\n    _classCallCheck(this, DropdownEditor);\n\n    return _possibleConstructorReturn(this, (DropdownEditor.__proto__ || Object.getPrototypeOf(DropdownEditor)).apply(this, arguments));\n  }\n\n  _createClass(DropdownEditor, [{\n    key: 'prepare',\n    value: function prepare(row, col, prop, td, originalValue, cellProperties) {\n      _get(DropdownEditor.prototype.__proto__ || Object.getPrototypeOf(DropdownEditor.prototype), 'prepare', this).call(this, row, col, prop, td, originalValue, cellProperties);\n      this.cellProperties.filter = false;\n      this.cellProperties.strict = true;\n    }\n  }]);\n\n  return DropdownEditor;\n}(_autocompleteEditor2.default);\n\n_pluginHooks2.default.getSingleton().add('beforeValidate', function (value, row, col, source) {\n  var cellMeta = this.getCellMeta(row, this.propToCol(col));\n\n  if (cellMeta.editor === DropdownEditor) {\n    if (cellMeta.strict === void 0) {\n      cellMeta.filter = false;\n      cellMeta.strict = true;\n    }\n  }\n});\n\nexports.default = DropdownEditor;\n\n/***/ }),\n/* 239 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor NumericEditor\n * @class NumericEditor\n */\nvar NumericEditor = function (_TextEditor) {\n  _inherits(NumericEditor, _TextEditor);\n\n  function NumericEditor() {\n    _classCallCheck(this, NumericEditor);\n\n    return _possibleConstructorReturn(this, (NumericEditor.__proto__ || Object.getPrototypeOf(NumericEditor)).apply(this, arguments));\n  }\n\n  return NumericEditor;\n}(_textEditor2.default);\n\nexports.default = NumericEditor;\n\n/***/ }),\n/* 240 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _element = __webpack_require__(0);\n\nvar _textEditor = __webpack_require__(57);\n\nvar _textEditor2 = _interopRequireDefault(_textEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @editor PasswordEditor\n * @class PasswordEditor\n * @dependencies TextEditor\n */\nvar PasswordEditor = function (_TextEditor) {\n  _inherits(PasswordEditor, _TextEditor);\n\n  function PasswordEditor() {\n    _classCallCheck(this, PasswordEditor);\n\n    return _possibleConstructorReturn(this, (PasswordEditor.__proto__ || Object.getPrototypeOf(PasswordEditor)).apply(this, arguments));\n  }\n\n  _createClass(PasswordEditor, [{\n    key: 'createElements',\n    value: function createElements() {\n      _get(PasswordEditor.prototype.__proto__ || Object.getPrototypeOf(PasswordEditor.prototype), 'createElements', this).call(this);\n\n      this.TEXTAREA = document.createElement('input');\n      this.TEXTAREA.setAttribute('type', 'password');\n      this.TEXTAREA.className = 'handsontableInput';\n      this.textareaStyle = this.TEXTAREA.style;\n      this.textareaStyle.width = 0;\n      this.textareaStyle.height = 0;\n\n      (0, _element.empty)(this.TEXTAREA_PARENT);\n      this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n    }\n  }]);\n\n  return PasswordEditor;\n}(_textEditor2.default);\n\nexports.default = PasswordEditor;\n\n/***/ }),\n/* 241 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _element = __webpack_require__(0);\n\nvar _event = __webpack_require__(12);\n\nvar _unicode = __webpack_require__(21);\n\nvar _baseEditor = __webpack_require__(53);\n\nvar _baseEditor2 = _interopRequireDefault(_baseEditor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SelectEditor = _baseEditor2.default.prototype.extend();\n\n/**\n * @private\n * @editor SelectEditor\n * @class SelectEditor\n */\nSelectEditor.prototype.init = function () {\n  this.select = document.createElement('SELECT');\n  (0, _element.addClass)(this.select, 'htSelectEditor');\n  this.select.style.display = 'none';\n  this.instance.rootElement.appendChild(this.select);\n  this.registerHooks();\n};\n\nSelectEditor.prototype.registerHooks = function () {\n  var _this = this;\n\n  this.instance.addHook('afterScrollHorizontally', function () {\n    return _this.refreshDimensions();\n  });\n  this.instance.addHook('afterScrollVertically', function () {\n    return _this.refreshDimensions();\n  });\n  this.instance.addHook('afterColumnResize', function () {\n    return _this.refreshDimensions();\n  });\n  this.instance.addHook('afterRowResize', function () {\n    return _this.refreshDimensions();\n  });\n};\n\nSelectEditor.prototype.prepare = function () {\n  _baseEditor2.default.prototype.prepare.apply(this, arguments);\n\n  var selectOptions = this.cellProperties.selectOptions;\n  var options;\n\n  if (typeof selectOptions == 'function') {\n    options = this.prepareOptions(selectOptions(this.row, this.col, this.prop));\n  } else {\n    options = this.prepareOptions(selectOptions);\n  }\n\n  (0, _element.empty)(this.select);\n\n  for (var option in options) {\n    if (Object.prototype.hasOwnProperty.call(options, option)) {\n      var optionElement = document.createElement('OPTION');\n      optionElement.value = option;\n      (0, _element.fastInnerHTML)(optionElement, options[option]);\n      this.select.appendChild(optionElement);\n    }\n  }\n};\n\nSelectEditor.prototype.prepareOptions = function (optionsToPrepare) {\n  var preparedOptions = {};\n\n  if (Array.isArray(optionsToPrepare)) {\n    for (var i = 0, len = optionsToPrepare.length; i < len; i++) {\n      preparedOptions[optionsToPrepare[i]] = optionsToPrepare[i];\n    }\n  } else if ((typeof optionsToPrepare === 'undefined' ? 'undefined' : _typeof(optionsToPrepare)) == 'object') {\n    preparedOptions = optionsToPrepare;\n  }\n\n  return preparedOptions;\n};\n\nSelectEditor.prototype.getValue = function () {\n  return this.select.value;\n};\n\nSelectEditor.prototype.setValue = function (value) {\n  this.select.value = value;\n};\n\nvar onBeforeKeyDown = function onBeforeKeyDown(event) {\n  var instance = this;\n  var editor = instance.getActiveEditor();\n\n  switch (event.keyCode) {\n    case _unicode.KEY_CODES.ARROW_UP:\n      var previousOptionIndex = editor.select.selectedIndex - 1;\n      if (previousOptionIndex >= 0) {\n        editor.select[previousOptionIndex].selected = true;\n      }\n\n      (0, _event.stopImmediatePropagation)(event);\n      event.preventDefault();\n      break;\n\n    case _unicode.KEY_CODES.ARROW_DOWN:\n      var nextOptionIndex = editor.select.selectedIndex + 1;\n      if (nextOptionIndex <= editor.select.length - 1) {\n        editor.select[nextOptionIndex].selected = true;\n      }\n\n      (0, _event.stopImmediatePropagation)(event);\n      event.preventDefault();\n      break;\n    default:\n      break;\n  }\n};\n\nSelectEditor.prototype.open = function () {\n  this._opened = true;\n  this.refreshDimensions();\n  this.select.style.display = '';\n  this.instance.addHook('beforeKeyDown', onBeforeKeyDown);\n};\n\nSelectEditor.prototype.close = function () {\n  this._opened = false;\n  this.select.style.display = 'none';\n  this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n};\n\nSelectEditor.prototype.focus = function () {\n  this.select.focus();\n};\n\nSelectEditor.prototype.refreshValue = function () {\n  var sourceData = this.instance.getSourceDataAtCell(this.row, this.prop);\n  this.originalValue = sourceData;\n\n  this.setValue(sourceData);\n  this.refreshDimensions();\n};\n\nSelectEditor.prototype.refreshDimensions = function () {\n  if (this.state !== _baseEditor.EditorState.EDITING) {\n    return;\n  }\n  this.TD = this.getEditedCell();\n\n  // TD is outside of the viewport.\n  if (!this.TD) {\n    this.close();\n\n    return;\n  }\n  var width = (0, _element.outerWidth)(this.TD) + 1,\n      height = (0, _element.outerHeight)(this.TD) + 1,\n      currentOffset = (0, _element.offset)(this.TD),\n      containerOffset = (0, _element.offset)(this.instance.rootElement),\n      scrollableContainer = (0, _element.getScrollableElement)(this.TD),\n      editTop = currentOffset.top - containerOffset.top - 1 - (scrollableContainer.scrollTop || 0),\n      editLeft = currentOffset.left - containerOffset.left - 1 - (scrollableContainer.scrollLeft || 0),\n      editorSection = this.checkEditorSection(),\n      cssTransformOffset;\n\n  var settings = this.instance.getSettings();\n  var rowHeadersCount = settings.rowHeaders ? 1 : 0;\n  var colHeadersCount = settings.colHeaders ? 1 : 0;\n\n  switch (editorSection) {\n    case 'top':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'left':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'top-left-corner':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'bottom-left-corner':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      break;\n    case 'bottom':\n      cssTransformOffset = (0, _element.getCssTransform)(this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.holder.parentNode);\n      break;\n    default:\n      break;\n  }\n  if (this.instance.getSelectedLast()[0] === 0) {\n    editTop += 1;\n  }\n\n  if (this.instance.getSelectedLast()[1] === 0) {\n    editLeft += 1;\n  }\n\n  var selectStyle = this.select.style;\n\n  if (cssTransformOffset && cssTransformOffset != -1) {\n    selectStyle[cssTransformOffset[0]] = cssTransformOffset[1];\n  } else {\n    (0, _element.resetCssTransform)(this.select);\n  }\n  var cellComputedStyle = (0, _element.getComputedStyle)(this.TD);\n\n  if (parseInt(cellComputedStyle.borderTopWidth, 10) > 0) {\n    height -= 1;\n  }\n  if (parseInt(cellComputedStyle.borderLeftWidth, 10) > 0) {\n    width -= 1;\n  }\n\n  selectStyle.height = height + 'px';\n  selectStyle.minWidth = width + 'px';\n  selectStyle.top = editTop + 'px';\n  selectStyle.left = editLeft + 'px';\n  selectStyle.margin = '0px';\n};\n\nSelectEditor.prototype.getEditedCell = function () {\n  var editorSection = this.checkEditorSection(),\n      editedCell;\n\n  switch (editorSection) {\n    case 'top':\n      editedCell = this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.select.style.zIndex = 101;\n      break;\n    case 'corner':\n      editedCell = this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.select.style.zIndex = 103;\n      break;\n    case 'left':\n      editedCell = this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.getCell({\n        row: this.row,\n        col: this.col\n      });\n      this.select.style.zIndex = 102;\n      break;\n    default:\n      editedCell = this.instance.getCell(this.row, this.col);\n      this.select.style.zIndex = '';\n      break;\n  }\n\n  return editedCell != -1 && editedCell != -2 ? editedCell : void 0;\n};\n\nexports.default = SelectEditor;\n\n/***/ }),\n/* 242 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nfunction cellDecorator(instance, TD, row, col, prop, value, cellProperties) {\n  var classesToAdd = [];\n  var classesToRemove = [];\n\n  if (cellProperties.className) {\n    if (TD.className) {\n      TD.className = TD.className + ' ' + cellProperties.className;\n    } else {\n      TD.className = cellProperties.className;\n    }\n  }\n\n  if (cellProperties.readOnly) {\n    classesToAdd.push(cellProperties.readOnlyCellClassName);\n  }\n\n  if (cellProperties.valid === false && cellProperties.invalidCellClassName) {\n    classesToAdd.push(cellProperties.invalidCellClassName);\n  } else {\n    classesToRemove.push(cellProperties.invalidCellClassName);\n  }\n\n  if (cellProperties.wordWrap === false && cellProperties.noWordWrapClassName) {\n    classesToAdd.push(cellProperties.noWordWrapClassName);\n  }\n\n  if (!value && cellProperties.placeholder) {\n    classesToAdd.push(cellProperties.placeholderCellClassName);\n  }\n\n  (0, _element.removeClass)(TD, classesToRemove);\n  (0, _element.addClass)(TD, classesToAdd);\n} /**\n   * Adds appropriate CSS class to table cell, based on cellProperties\n   */\nexports.default = cellDecorator;\n\n/***/ }),\n/* 243 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _src = __webpack_require__(4);\n\nvar _index = __webpack_require__(13);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar clonableWRAPPER = document.createElement('DIV');\nclonableWRAPPER.className = 'htAutocompleteWrapper';\n\nvar clonableARROW = document.createElement('DIV');\nclonableARROW.className = 'htAutocompleteArrow';\n// workaround for https://github.com/handsontable/handsontable/issues/1946\n// this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\nclonableARROW.appendChild(document.createTextNode(String.fromCharCode(9660)));\n\nvar wrapTdContentWithWrapper = function wrapTdContentWithWrapper(TD, WRAPPER) {\n  WRAPPER.innerHTML = TD.innerHTML;\n  (0, _element.empty)(TD);\n  TD.appendChild(WRAPPER);\n};\n\n/**\n * Autocomplete renderer\n *\n * @private\n * @renderer AutocompleteRenderer\n * @param {Object} instance Handsontable instance\n * @param {Element} TD Table cell where to render\n * @param {Number} row\n * @param {Number} col\n * @param {String|Number} prop Row object property name\n * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)\n * @param {Object} cellProperties Cell properites (shared by cell renderer and editor)\n */\nfunction autocompleteRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  var WRAPPER = clonableWRAPPER.cloneNode(true); // this is faster than createElement\n  var ARROW = clonableARROW.cloneNode(true); // this is faster than createElement\n\n  if (cellProperties.allowHtml) {\n    (0, _index.getRenderer)('html').apply(this, arguments);\n  } else {\n    (0, _index.getRenderer)('text').apply(this, arguments);\n  }\n\n  TD.appendChild(ARROW);\n  (0, _element.addClass)(TD, 'htAutocomplete');\n\n  if (!TD.firstChild) {\n    // http://jsperf.com/empty-node-if-needed\n    // otherwise empty fields appear borderless in demo/renderers.html (IE)\n    TD.appendChild(document.createTextNode(String.fromCharCode(160))); // workaround for https://github.com/handsontable/handsontable/issues/1946\n    // this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\n  }\n\n  if (!instance.acArrowListener) {\n    var eventManager = new _eventManager2.default(instance);\n\n    // not very elegant but easy and fast\n    instance.acArrowListener = function (event) {\n      if ((0, _element.hasClass)(event.target, 'htAutocompleteArrow')) {\n        instance.view.wt.getSetting('onCellDblClick', null, new _src.CellCoords(row, col), TD);\n      }\n    };\n\n    eventManager.addEventListener(instance.rootElement, 'mousedown', instance.acArrowListener);\n\n    // We need to unbind the listener after the table has been destroyed\n    instance.addHookOnce('afterDestroy', function () {\n      eventManager.destroy();\n    });\n  }\n}\n\nexports.default = autocompleteRenderer;\n\n/***/ }),\n/* 244 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _string = __webpack_require__(36);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _unicode = __webpack_require__(21);\n\nvar _function = __webpack_require__(42);\n\nvar _event = __webpack_require__(12);\n\nvar _index = __webpack_require__(13);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar isListeningKeyDownEvent = new WeakMap();\nvar isCheckboxListenerAdded = new WeakMap();\nvar BAD_VALUE_CLASS = 'htBadValue';\n\n/**\n * Checkbox renderer\n *\n * @private\n * @param {Object} instance Handsontable instance\n * @param {Element} TD Table cell where to render\n * @param {Number} row\n * @param {Number} col\n * @param {String|Number} prop Row object property name\n * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)\n * @param {Object} cellProperties Cell properties (shared by cell renderer and editor)\n */\nfunction checkboxRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  (0, _index.getRenderer)('base').apply(this, arguments);\n\n  var eventManager = registerEvents(instance);\n  var input = createInput();\n  var labelOptions = cellProperties.label;\n  var badValue = false;\n\n  if (typeof cellProperties.checkedTemplate === 'undefined') {\n    cellProperties.checkedTemplate = true;\n  }\n  if (typeof cellProperties.uncheckedTemplate === 'undefined') {\n    cellProperties.uncheckedTemplate = false;\n  }\n\n  (0, _element.empty)(TD); // TODO identify under what circumstances this line can be removed\n\n  if (value === cellProperties.checkedTemplate || (0, _string.equalsIgnoreCase)(value, cellProperties.checkedTemplate)) {\n    input.checked = true;\n  } else if (value === cellProperties.uncheckedTemplate || (0, _string.equalsIgnoreCase)(value, cellProperties.uncheckedTemplate)) {\n    input.checked = false;\n  } else if (value === null) {\n    // default value\n    (0, _element.addClass)(input, 'noValue');\n  } else {\n    input.style.display = 'none';\n    (0, _element.addClass)(input, BAD_VALUE_CLASS);\n    badValue = true;\n  }\n\n  input.setAttribute('data-row', row);\n  input.setAttribute('data-col', col);\n\n  if (!badValue && labelOptions) {\n    var labelText = '';\n\n    if (labelOptions.value) {\n      labelText = typeof labelOptions.value === 'function' ? labelOptions.value.call(this, row, col, prop, value) : labelOptions.value;\n    } else if (labelOptions.property) {\n      labelText = instance.getDataAtRowProp(row, labelOptions.property);\n    }\n    var label = createLabel(labelText);\n\n    if (labelOptions.position === 'before') {\n      label.appendChild(input);\n    } else {\n      label.insertBefore(input, label.firstChild);\n    }\n    input = label;\n  }\n\n  TD.appendChild(input);\n\n  if (badValue) {\n    TD.appendChild(document.createTextNode('#bad-value#'));\n  }\n\n  if (!isListeningKeyDownEvent.has(instance)) {\n    isListeningKeyDownEvent.set(instance, true);\n    instance.addHook('beforeKeyDown', onBeforeKeyDown);\n  }\n\n  /**\n   * On before key down DOM listener.\n   *\n   * @private\n   * @param {Event} event\n   */\n  function onBeforeKeyDown(event) {\n    var toggleKeys = 'SPACE|ENTER';\n    var switchOffKeys = 'DELETE|BACKSPACE';\n    var isKeyCode = (0, _function.partial)(_unicode.isKey, event.keyCode);\n\n    if (isKeyCode(toggleKeys + '|' + switchOffKeys) && !(0, _event.isImmediatePropagationStopped)(event)) {\n      eachSelectedCheckboxCell(function () {\n        (0, _event.stopImmediatePropagation)(event);\n        event.preventDefault();\n      });\n    }\n    if (isKeyCode(toggleKeys)) {\n      changeSelectedCheckboxesState();\n    }\n    if (isKeyCode(switchOffKeys)) {\n      changeSelectedCheckboxesState(true);\n    }\n  }\n\n  /**\n   * Change checkbox checked property\n   *\n   * @private\n   * @param {Boolean} [uncheckCheckbox=false]\n   */\n  function changeSelectedCheckboxesState() {\n    var uncheckCheckbox = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n    var selRange = instance.getSelectedRangeLast();\n\n    if (!selRange) {\n      return;\n    }\n\n    var _selRange$getTopLeftC = selRange.getTopLeftCorner(),\n        startRow = _selRange$getTopLeftC.row,\n        startColumn = _selRange$getTopLeftC.col;\n\n    var _selRange$getBottomRi = selRange.getBottomRightCorner(),\n        endRow = _selRange$getBottomRi.row,\n        endColumn = _selRange$getBottomRi.col;\n\n    var changes = [];\n\n    for (var _row = startRow; _row <= endRow; _row += 1) {\n      for (var _col = startColumn; _col <= endColumn; _col += 1) {\n        var _cellProperties = instance.getCellMeta(_row, _col);\n\n        if (_cellProperties.type !== 'checkbox') {\n          return;\n        }\n\n        /* eslint-disable no-continue */\n        if (_cellProperties.readOnly === true) {\n          continue;\n        }\n\n        if (typeof _cellProperties.checkedTemplate === 'undefined') {\n          _cellProperties.checkedTemplate = true;\n        }\n        if (typeof _cellProperties.uncheckedTemplate === 'undefined') {\n          _cellProperties.uncheckedTemplate = false;\n        }\n\n        var dataAtCell = instance.getDataAtCell(_row, _col);\n\n        if (uncheckCheckbox === false) {\n          if ([_cellProperties.checkedTemplate, _cellProperties.checkedTemplate.toString()].includes(dataAtCell)) {\n            changes.push([_row, _col, _cellProperties.uncheckedTemplate]);\n          } else if ([_cellProperties.uncheckedTemplate, _cellProperties.uncheckedTemplate.toString(), null, void 0].includes(dataAtCell)) {\n            changes.push([_row, _col, _cellProperties.checkedTemplate]);\n          }\n        } else {\n          changes.push([_row, _col, _cellProperties.uncheckedTemplate]);\n        }\n      }\n    }\n\n    if (changes.length > 0) {\n      instance.setDataAtCell(changes);\n    }\n  }\n\n  /**\n   * Call callback for each found selected cell with checkbox type.\n   *\n   * @private\n   * @param {Function} callback\n   */\n  function eachSelectedCheckboxCell(callback) {\n    var selRange = instance.getSelectedRangeLast();\n\n    if (!selRange) {\n      return;\n    }\n    var topLeft = selRange.getTopLeftCorner();\n    var bottomRight = selRange.getBottomRightCorner();\n\n    for (var _row2 = topLeft.row; _row2 <= bottomRight.row; _row2++) {\n      for (var _col2 = topLeft.col; _col2 <= bottomRight.col; _col2++) {\n        var _cellProperties2 = instance.getCellMeta(_row2, _col2);\n\n        if (_cellProperties2.type !== 'checkbox') {\n          return;\n        }\n\n        var cell = instance.getCell(_row2, _col2);\n\n        if (cell == null) {\n\n          callback(_row2, _col2, _cellProperties2);\n        } else {\n          var checkboxes = cell.querySelectorAll('input[type=checkbox]');\n\n          if (checkboxes.length > 0 && !_cellProperties2.readOnly) {\n            callback(checkboxes);\n          }\n        }\n      }\n    }\n  }\n}\n\n/**\n * Register checkbox listeners.\n *\n * @param {Handsontable} instance Handsontable instance.\n * @returns {EventManager}\n */\nfunction registerEvents(instance) {\n  var eventManager = isCheckboxListenerAdded.get(instance);\n\n  if (!eventManager) {\n    eventManager = new _eventManager2.default(instance);\n    eventManager.addEventListener(instance.rootElement, 'click', function (event) {\n      return onClick(event, instance);\n    });\n    eventManager.addEventListener(instance.rootElement, 'mouseup', function (event) {\n      return onMouseUp(event, instance);\n    });\n    eventManager.addEventListener(instance.rootElement, 'change', function (event) {\n      return onChange(event, instance);\n    });\n\n    isCheckboxListenerAdded.set(instance, eventManager);\n  }\n\n  return eventManager;\n}\n\n/**\n * Create input element.\n *\n * @returns {Node}\n */\nfunction createInput() {\n  var input = document.createElement('input');\n\n  input.className = 'htCheckboxRendererInput';\n  input.type = 'checkbox';\n  input.setAttribute('autocomplete', 'off');\n  input.setAttribute('tabindex', '-1');\n\n  return input.cloneNode(false);\n}\n\n/**\n * Create label element.\n *\n * @returns {Node}\n */\nfunction createLabel(text) {\n  var label = document.createElement('label');\n\n  label.className = 'htCheckboxRendererLabel';\n  label.appendChild(document.createTextNode(text));\n\n  return label.cloneNode(true);\n}\n\n/**\n * `mouseup` callback.\n *\n * @private\n * @param {Event} event `mouseup` event.\n * @param {Object} instance Handsontable instance.\n */\nfunction onMouseUp(event, instance) {\n  if (!isCheckboxInput(event.target)) {\n    return;\n  }\n  setTimeout(instance.listen, 10);\n}\n\n/**\n * `click` callback.\n *\n * @private\n * @param {Event} event `click` event.\n * @param {Object} instance Handsontable instance.\n */\nfunction onClick(event, instance) {\n  if (!isCheckboxInput(event.target)) {\n    return false;\n  }\n\n  var row = parseInt(event.target.getAttribute('data-row'), 10);\n  var col = parseInt(event.target.getAttribute('data-col'), 10);\n  var cellProperties = instance.getCellMeta(row, col);\n\n  if (cellProperties.readOnly) {\n    event.preventDefault();\n  }\n}\n\n/**\n * `change` callback.\n *\n * @param {Event} event `change` event.\n * @param {Object} instance Handsontable instance.\n * @param {Object} cellProperties Reference to cell properties.\n * @returns {Boolean}\n */\nfunction onChange(event, instance) {\n  if (!isCheckboxInput(event.target)) {\n    return false;\n  }\n\n  var row = parseInt(event.target.getAttribute('data-row'), 10);\n  var col = parseInt(event.target.getAttribute('data-col'), 10);\n  var cellProperties = instance.getCellMeta(row, col);\n\n  if (!cellProperties.readOnly) {\n    var newCheckboxValue = null;\n\n    if (event.target.checked) {\n      newCheckboxValue = cellProperties.uncheckedTemplate === void 0 ? true : cellProperties.checkedTemplate;\n    } else {\n      newCheckboxValue = cellProperties.uncheckedTemplate === void 0 ? false : cellProperties.uncheckedTemplate;\n    }\n\n    instance.setDataAtCell(row, col, newCheckboxValue);\n  }\n}\n\n/**\n * Check if the provided element is the checkbox input.\n *\n * @private\n * @param {HTMLElement} element The element in question.\n * @returns {Boolean}\n */\nfunction isCheckboxInput(element) {\n  return element.tagName === 'INPUT' && element.getAttribute('type') === 'checkbox';\n}\n\nexports.default = checkboxRenderer;\n\n/***/ }),\n/* 245 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _index = __webpack_require__(13);\n\n/**\n * @private\n * @renderer HtmlRenderer\n * @param instance\n * @param TD\n * @param row\n * @param col\n * @param prop\n * @param value\n * @param cellProperties\n */\nfunction htmlRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  (0, _index.getRenderer)('base').apply(this, arguments);\n\n  if (value === null || value === void 0) {\n    value = '';\n  }\n\n  (0, _element.fastInnerHTML)(TD, value);\n}\n\nexports.default = htmlRenderer;\n\n/***/ }),\n/* 246 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _numbro = __webpack_require__(247);\n\nvar _numbro2 = _interopRequireDefault(_numbro);\n\nvar _index = __webpack_require__(13);\n\nvar _number = __webpack_require__(5);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Numeric cell renderer\n *\n * @private\n * @renderer NumericRenderer\n * @dependencies numbro\n * @param {Object} instance Handsontable instance\n * @param {Element} TD Table cell where to render\n * @param {Number} row\n * @param {Number} col\n * @param {String|Number} prop Row object property name\n * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)\n * @param {Object} cellProperties Cell properties (shared by cell renderer and editor)\n */\nfunction numericRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  if ((0, _number.isNumeric)(value)) {\n    var numericFormat = cellProperties.numericFormat;\n    var cellCulture = numericFormat && numericFormat.culture;\n    var cellFormatPattern = numericFormat && numericFormat.pattern;\n    var className = cellProperties.className || '';\n    var classArr = className.length ? className.split(' ') : [];\n\n    if (typeof cellCulture !== 'undefined') {\n      _numbro2.default.culture(cellCulture);\n    }\n\n    value = (0, _numbro2.default)(value).format(cellFormatPattern || '0');\n\n    if (classArr.indexOf('htLeft') < 0 && classArr.indexOf('htCenter') < 0 && classArr.indexOf('htRight') < 0 && classArr.indexOf('htJustify') < 0) {\n      classArr.push('htRight');\n    }\n\n    if (classArr.indexOf('htNumeric') < 0) {\n      classArr.push('htNumeric');\n    }\n\n    cellProperties.className = classArr.join(' ');\n  }\n\n  (0, _index.getRenderer)('text')(instance, TD, row, col, prop, value, cellProperties);\n}\n\nexports.default = numericRenderer;\n\n/***/ }),\n/* 247 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_247__;\n\n/***/ }),\n/* 248 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _index = __webpack_require__(13);\n\nvar _number = __webpack_require__(5);\n\n/**\n * @private\n * @renderer PasswordRenderer\n * @param instance\n * @param TD\n * @param row\n * @param col\n * @param prop\n * @param value\n * @param cellProperties\n */\nfunction passwordRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  (0, _index.getRenderer)('text').apply(this, arguments);\n\n  value = TD.innerHTML;\n\n  var hashLength = cellProperties.hashLength || value.length;\n  var hashSymbol = cellProperties.hashSymbol || '*';\n\n  var hash = '';\n\n  (0, _number.rangeEach)(hashLength - 1, function () {\n    hash += hashSymbol;\n  });\n  (0, _element.fastInnerHTML)(TD, hash);\n}\n\nexports.default = passwordRenderer;\n\n/***/ }),\n/* 249 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _element = __webpack_require__(0);\n\nvar _mixed = __webpack_require__(16);\n\nvar _index = __webpack_require__(13);\n\n/**\n * Default text renderer\n *\n * @private\n * @renderer TextRenderer\n * @param {Object} instance Handsontable instance\n * @param {Element} TD Table cell where to render\n * @param {Number} row\n * @param {Number} col\n * @param {String|Number} prop Row object property name\n * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)\n * @param {Object} cellProperties Cell properties (shared by cell renderer and editor)\n */\nfunction textRenderer(instance, TD, row, col, prop, value, cellProperties) {\n  (0, _index.getRenderer)('base').apply(this, arguments);\n\n  if (!value && cellProperties.placeholder) {\n    value = cellProperties.placeholder;\n  }\n\n  var escaped = (0, _mixed.stringify)(value);\n\n  if (!instance.getSettings().trimWhitespace) {\n    escaped = escaped.replace(/ /g, String.fromCharCode(160));\n  }\n\n  if (cellProperties.rendererTemplate) {\n    (0, _element.empty)(TD);\n    var TEMPLATE = document.createElement('TEMPLATE');\n    TEMPLATE.setAttribute('bind', '{{}}');\n    TEMPLATE.innerHTML = cellProperties.rendererTemplate;\n    HTMLTemplateElement.decorate(TEMPLATE);\n    TEMPLATE.model = instance.getSourceDataAtRow(row);\n    TD.appendChild(TEMPLATE);\n  } else {\n    // this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips\n    (0, _element.fastInnerText)(TD, escaped);\n  }\n}\n\nexports.default = textRenderer;\n\n/***/ }),\n/* 250 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = autocompleteValidator;\n/**\n * Autocomplete cell validator.\n *\n * @private\n * @validator AutocompleteValidator\n * @param {*} value - Value of edited cell\n * @param {Function} callback - Callback called with validation result\n */\nfunction autocompleteValidator(value, callback) {\n  if (value == null) {\n    value = '';\n  }\n\n  if (this.allowEmpty && value === '') {\n    callback(true);\n\n    return;\n  }\n\n  if (this.strict && this.source) {\n    if (typeof this.source === 'function') {\n      this.source(value, process(value, callback));\n    } else {\n      process(value, callback)(this.source);\n    }\n  } else {\n    callback(true);\n  }\n};\n\n/**\n * Function responsible for validation of autocomplete value.\n *\n * @param {*} value - Value of edited cell\n * @param {Function} callback - Callback called with validation result\n */\nfunction process(value, callback) {\n  var originalVal = value;\n\n  return function (source) {\n    var found = false;\n\n    for (var s = 0, slen = source.length; s < slen; s++) {\n      if (originalVal === source[s]) {\n        found = true; // perfect match\n        break;\n      }\n    }\n\n    callback(found);\n  };\n}\n\n/***/ }),\n/* 251 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = dateValidator;\nexports.correctFormat = correctFormat;\n\nvar _moment = __webpack_require__(55);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _date = __webpack_require__(190);\n\nvar _editors = __webpack_require__(17);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Date cell validator\n *\n * @private\n * @validator DateValidator\n * @dependencies moment\n * @param {*} value - Value of edited cell\n * @param {Function} callback - Callback called with validation result\n */\nfunction dateValidator(value, callback) {\n  var valid = true;\n  var dateEditor = (0, _editors.getEditorInstance)('date', this.instance);\n\n  if (value == null) {\n    value = '';\n  }\n  var isValidDate = (0, _moment2.default)(new Date(value)).isValid() || (0, _moment2.default)(value, dateEditor.defaultDateFormat).isValid();\n  // is it in the specified format\n  var isValidFormat = (0, _moment2.default)(value, this.dateFormat || dateEditor.defaultDateFormat, true).isValid();\n\n  if (this.allowEmpty && value === '') {\n    isValidDate = true;\n    isValidFormat = true;\n  }\n  if (!isValidDate) {\n    valid = false;\n  }\n  if (!isValidDate && isValidFormat) {\n    valid = true;\n  }\n\n  if (isValidDate && !isValidFormat) {\n    if (this.correctFormat === true) {\n      // if format correction is enabled\n      var correctedValue = correctFormat(value, this.dateFormat);\n      var row = this.instance.runHooks('unmodifyRow', this.row);\n      var column = this.instance.runHooks('unmodifyCol', this.col);\n\n      this.instance.setDataAtCell(row, column, correctedValue, 'dateValidator');\n      valid = true;\n    } else {\n      valid = false;\n    }\n  }\n\n  callback(valid);\n};\n\n/**\n * Format the given string using moment.js' format feature\n *\n * @param {String} value\n * @param {String} dateFormat\n * @returns {String}\n */\nfunction correctFormat(value, dateFormat) {\n  var dateFromDate = (0, _moment2.default)((0, _date.getNormalizedDate)(value));\n  var dateFromMoment = (0, _moment2.default)(value, dateFormat);\n  var isAlphanumeric = value.search(/[A-z]/g) > -1;\n  var date = void 0;\n\n  if (dateFromDate.isValid() && dateFromDate.format('x') === dateFromMoment.format('x') || !dateFromMoment.isValid() || isAlphanumeric) {\n    date = dateFromDate;\n  } else {\n    date = dateFromMoment;\n  }\n\n  return date.format(dateFormat);\n};\n\n/***/ }),\n/* 252 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = numericValidator;\n/**\n * Numeric cell validator\n *\n * @private\n * @validator NumericValidator\n * @param {*} value - Value of edited cell\n * @param {*} callback - Callback called with validation result\n */\nfunction numericValidator(value, callback) {\n  if (value == null) {\n    value = '';\n  }\n  if (this.allowEmpty && value === '') {\n    callback(true);\n  } else if (value === '') {\n    callback(false);\n  } else {\n    callback(/^-?\\d*(\\.|,)?\\d*$/.test(value));\n  }\n};\n\n/***/ }),\n/* 253 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = timeValidator;\n\nvar _moment = __webpack_require__(55);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Formats which are correctly parsed to time (supported by momentjs)\nvar STRICT_FORMATS = ['YYYY-MM-DDTHH:mm:ss.SSSZ', 'X', // Unix timestamp\n'x' // Unix ms timestamp\n];\n\n/**\n * Time cell validator\n *\n * @private\n * @validator TimeValidator\n * @dependencies moment\n * @param {*} value - Value of edited cell\n * @param {Function} callback - Callback called with validation result\n */\nfunction timeValidator(value, callback) {\n  var valid = true;\n  var timeFormat = this.timeFormat || 'h:mm:ss a';\n\n  if (value === null) {\n    value = '';\n  }\n\n  value = /^\\d{3,}$/.test(value) ? parseInt(value, 10) : value;\n\n  var twoDigitValue = /^\\d{1,2}$/.test(value);\n\n  if (twoDigitValue) {\n    value += ':00';\n  }\n\n  var date = (0, _moment2.default)(value, STRICT_FORMATS, true).isValid() ? (0, _moment2.default)(value) : (0, _moment2.default)(value, timeFormat);\n  var isValidTime = date.isValid();\n\n  // is it in the specified format\n  var isValidFormat = (0, _moment2.default)(value, timeFormat, true).isValid() && !twoDigitValue;\n\n  if (this.allowEmpty && value === '') {\n    isValidTime = true;\n    isValidFormat = true;\n  }\n  if (!isValidTime) {\n    valid = false;\n  }\n  if (!isValidTime && isValidFormat) {\n    valid = true;\n  }\n  if (isValidTime && !isValidFormat) {\n    if (this.correctFormat === true) {\n      // if format correction is enabled\n      var correctedValue = date.format(timeFormat);\n      var row = this.instance.runHooks('unmodifyRow', this.row);\n      var column = this.instance.runHooks('unmodifyCol', this.col);\n\n      this.instance.setDataAtCell(row, column, correctedValue, 'timeValidator');\n      valid = true;\n    } else {\n      valid = false;\n    }\n  }\n\n  callback(valid);\n};\n\n/***/ }),\n/* 254 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'autocomplete';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE),\n  validator: (0, _validators.getValidator)(CELL_TYPE)\n};\n\n/***/ }),\n/* 255 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar CELL_TYPE = 'checkbox';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE)\n};\n\n/***/ }),\n/* 256 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'date';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  // displays small gray arrow on right side of the cell\n  renderer: (0, _renderers.getRenderer)('autocomplete'),\n  validator: (0, _validators.getValidator)(CELL_TYPE)\n};\n\n/***/ }),\n/* 257 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'dropdown';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  // displays small gray arrow on right side of the cell\n  renderer: (0, _renderers.getRenderer)('autocomplete'),\n  validator: (0, _validators.getValidator)('autocomplete')\n};\n\n/***/ }),\n/* 258 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar CELL_TYPE = 'handsontable';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  // displays small gray arrow on right side of the cell\n  renderer: (0, _renderers.getRenderer)('autocomplete')\n};\n\n/***/ }),\n/* 259 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'numeric';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE),\n  validator: (0, _validators.getValidator)(CELL_TYPE),\n  dataType: 'number'\n};\n\n/***/ }),\n/* 260 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'password';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE),\n  copyable: false\n};\n\n/***/ }),\n/* 261 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _browser = __webpack_require__(27);\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar CELL_TYPE = 'text';\n\nexports.default = {\n  editor: (0, _editors.getEditor)(CELL_TYPE),\n  renderer: (0, _renderers.getRenderer)(CELL_TYPE)\n};\n\n/***/ }),\n/* 262 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _editors = __webpack_require__(17);\n\nvar _renderers = __webpack_require__(13);\n\nvar _validators = __webpack_require__(28);\n\nvar CELL_TYPE = 'time';\n\nexports.default = {\n  editor: (0, _editors.getEditor)('text'),\n  // displays small gray arrow on right side of the cell\n  renderer: (0, _renderers.getRenderer)('text'),\n  validator: (0, _validators.getValidator)(CELL_TYPE)\n};\n\n/***/ }),\n/* 263 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _SheetClip = __webpack_require__(191);\n\nvar _SheetClip2 = _interopRequireDefault(_SheetClip);\n\nvar _data = __webpack_require__(90);\n\nvar _setting = __webpack_require__(89);\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _interval = __webpack_require__(264);\n\nvar _interval2 = _interopRequireDefault(_interval);\n\nvar _number = __webpack_require__(5);\n\nvar _multiMap = __webpack_require__(265);\n\nvar _multiMap2 = _interopRequireDefault(_multiMap);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Utility class that gets and saves data from/to the data source using mapping of columns numbers to object property names\n * @todo refactor arguments of methods getRange, getText to be numbers (not objects)\n * @todo remove priv, GridSettings from object constructor\n *\n * @param {Object} instance Instance of Handsontable\n * @param {*} priv\n * @param {*} GridSettings Grid settings\n * @util\n * @class DataMap\n */\nfunction DataMap(instance, priv, GridSettings) {\n  var _this = this;\n\n  this.instance = instance;\n  this.priv = priv;\n  this.GridSettings = GridSettings;\n  this.dataSource = this.instance.getSettings().data;\n  this.cachedLength = null;\n  this.skipCache = false;\n  this.latestSourceRowsCount = 0;\n\n  if (this.dataSource && this.dataSource[0]) {\n    this.duckSchema = this.recursiveDuckSchema(this.dataSource[0]);\n  } else {\n    this.duckSchema = {};\n  }\n  this.createMap();\n  this.interval = _interval2.default.create(function () {\n    return _this.clearLengthCache();\n  }, '15fps');\n\n  this.instance.addHook('skipLengthCache', function (delay) {\n    return _this.onSkipLengthCache(delay);\n  });\n  this.onSkipLengthCache(500);\n}\n\nDataMap.prototype.DESTINATION_RENDERER = 1;\nDataMap.prototype.DESTINATION_CLIPBOARD_GENERATOR = 2;\n\n/**\n * @param {Object|Array} object\n * @returns {Object|Array}\n */\nDataMap.prototype.recursiveDuckSchema = function (object) {\n  return (0, _object.duckSchema)(object);\n};\n\n/**\n * @param {Object} schema\n * @param {Number} lastCol\n * @param {Number} parent\n * @returns {Number}\n */\nDataMap.prototype.recursiveDuckColumns = function (schema, lastCol, parent) {\n  var prop, i;\n  if (typeof lastCol === 'undefined') {\n    lastCol = 0;\n    parent = '';\n  }\n  if ((typeof schema === 'undefined' ? 'undefined' : _typeof(schema)) === 'object' && !Array.isArray(schema)) {\n    for (i in schema) {\n      if ((0, _object.hasOwnProperty)(schema, i)) {\n        if (schema[i] === null) {\n          prop = parent + i;\n          this.colToPropCache.push(prop);\n          this.propToColCache.set(prop, lastCol);\n\n          lastCol++;\n        } else {\n          lastCol = this.recursiveDuckColumns(schema[i], lastCol, i + '.');\n        }\n      }\n    }\n  }\n\n  return lastCol;\n};\n\nDataMap.prototype.createMap = function () {\n  var i = void 0;\n  var schema = this.getSchema();\n\n  if (typeof schema === 'undefined') {\n    throw new Error('trying to create `columns` definition but you didn\\'t provide `schema` nor `data`');\n  }\n\n  this.colToPropCache = [];\n  this.propToColCache = new _multiMap2.default();\n\n  var columns = this.instance.getSettings().columns;\n\n  if (columns) {\n    var maxCols = this.instance.getSettings().maxCols;\n    var columnsLen = Math.min(maxCols, columns.length);\n    var filteredIndex = 0;\n    var columnsAsFunc = false;\n    var schemaLen = (0, _object.deepObjectSize)(schema);\n\n    if (typeof columns === 'function') {\n      columnsLen = schemaLen > 0 ? schemaLen : this.instance.countSourceCols();\n      columnsAsFunc = true;\n    }\n\n    for (i = 0; i < columnsLen; i++) {\n      var column = columnsAsFunc ? columns(i) : columns[i];\n\n      if ((0, _object.isObject)(column)) {\n        if (typeof column.data !== 'undefined') {\n          var index = columnsAsFunc ? filteredIndex : i;\n          this.colToPropCache[index] = column.data;\n          this.propToColCache.set(column.data, index);\n        }\n\n        filteredIndex++;\n      }\n    }\n  } else {\n    this.recursiveDuckColumns(schema);\n  }\n};\n\n/**\n * Returns property name that corresponds with the given column index.\n *\n * @param {Number} col Visual column index.\n * @returns {Number} Physical column index.\n */\nDataMap.prototype.colToProp = function (col) {\n  col = this.instance.runHooks('modifyCol', col);\n\n  if (!isNaN(col) && this.colToPropCache && typeof this.colToPropCache[col] !== 'undefined') {\n    return this.colToPropCache[col];\n  }\n\n  return col;\n};\n\n/**\n * @param {Object} prop\n * @fires Hooks#modifyCol\n * @returns {*}\n */\nDataMap.prototype.propToCol = function (prop) {\n  var col;\n\n  if (typeof this.propToColCache.get(prop) === 'undefined') {\n    col = prop;\n  } else {\n    col = this.propToColCache.get(prop);\n  }\n  col = this.instance.runHooks('unmodifyCol', col);\n\n  return col;\n};\n\n/**\n * @returns {Object}\n */\nDataMap.prototype.getSchema = function () {\n  var schema = this.instance.getSettings().dataSchema;\n\n  if (schema) {\n    if (typeof schema === 'function') {\n      return schema();\n    }\n    return schema;\n  }\n\n  return this.duckSchema;\n};\n\n/**\n * Creates row at the bottom of the data array.\n *\n * @param {Number} [index] Physical index of the row before which the new row will be inserted.\n * @param {Number} [amount=1] An amount of rows to add.\n * @param {String} [source] Source of method call.\n * @fires Hooks#afterCreateRow\n * @returns {Number} Returns number of created rows.\n */\nDataMap.prototype.createRow = function (index) {\n  var _this2 = this;\n\n  var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n  var source = arguments[2];\n\n  var numberOfCreatedRows = 0;\n\n  if (typeof index !== 'number' || index >= this.instance.countSourceRows()) {\n    index = this.instance.countSourceRows();\n  }\n\n  var continueProcess = this.instance.runHooks('beforeCreateRow', index, amount, source);\n\n  if (continueProcess === false) {\n    return 0;\n  }\n\n  var maxRows = this.instance.getSettings().maxRows;\n  var columnCount = this.instance.countCols();\n\n  var _loop = function _loop() {\n    var row = null;\n\n    if (_this2.instance.dataType === 'array') {\n      if (_this2.instance.getSettings().dataSchema) {\n        // Clone template array\n        row = (0, _object.deepClone)(_this2.getSchema());\n      } else {\n        row = [];\n        /* eslint-disable no-loop-func */\n        (0, _number.rangeEach)(columnCount - 1, function () {\n          return row.push(null);\n        });\n      }\n    } else if (_this2.instance.dataType === 'function') {\n      row = _this2.instance.getSettings().dataSchema(index);\n    } else {\n      row = {};\n      (0, _object.deepExtend)(row, _this2.getSchema());\n    }\n\n    if (index === _this2.instance.countSourceRows()) {\n      _this2.dataSource.push(row);\n    } else {\n      _this2.spliceData(index, 0, row);\n    }\n\n    numberOfCreatedRows++;\n  };\n\n  while (numberOfCreatedRows < amount && this.instance.countSourceRows() < maxRows) {\n    _loop();\n  }\n\n  this.instance.runHooks('afterCreateRow', index, numberOfCreatedRows, source);\n  this.instance.forceFullRender = true; // used when data was changed\n\n  return numberOfCreatedRows;\n};\n\n/**\n * Creates col at the right of the data array.\n *\n * @param {Number} [index] Visual index of the column before which the new column will be inserted\n * @param {Number} [amount] An amount of columns to add.\n * @param {String} [source] Source of method call.\n * @fires Hooks#afterCreateCol\n * @returns {Number} Returns number of created columns\n */\nDataMap.prototype.createCol = function (index, amount, source) {\n  if (!this.instance.isColumnModificationAllowed()) {\n    throw new Error('Cannot create new column. When data source in an object, ' + 'you can only have as much columns as defined in first data row, data schema or in the \\'columns\\' setting.' + 'If you want to be able to add new columns, you have to use array datasource.');\n  }\n  var rlen = this.instance.countSourceRows(),\n      data = this.dataSource,\n      constructor,\n      numberOfCreatedCols = 0,\n      currentIndex;\n\n  if (!amount) {\n    amount = 1;\n  }\n\n  if (typeof index !== 'number' || index >= this.instance.countCols()) {\n    index = this.instance.countCols();\n  }\n  this.instance.runHooks('beforeCreateCol', index, amount, source);\n\n  currentIndex = index;\n\n  var maxCols = this.instance.getSettings().maxCols;\n  while (numberOfCreatedCols < amount && this.instance.countCols() < maxCols) {\n    constructor = (0, _setting.columnFactory)(this.GridSettings, this.priv.columnsSettingConflicts);\n\n    if (typeof index !== 'number' || index >= this.instance.countCols()) {\n      if (rlen > 0) {\n        for (var r = 0; r < rlen; r++) {\n          if (typeof data[r] === 'undefined') {\n            data[r] = [];\n          }\n          data[r].push(null);\n        }\n      } else {\n        data.push([null]);\n      }\n      // Add new column constructor\n      this.priv.columnSettings.push(constructor);\n    } else {\n      for (var _r = 0; _r < rlen; _r++) {\n        data[_r].splice(currentIndex, 0, null);\n      }\n      // Add new column constructor at given index\n      this.priv.columnSettings.splice(currentIndex, 0, constructor);\n    }\n\n    numberOfCreatedCols++;\n    currentIndex++;\n  }\n\n  this.instance.runHooks('afterCreateCol', index, numberOfCreatedCols, source);\n  this.instance.forceFullRender = true; // used when data was changed\n\n  return numberOfCreatedCols;\n};\n\n/**\n * Removes row from the data array.\n *\n * @param {Number} [index] Visual index of the row to be removed. If not provided, the last row will be removed\n * @param {Number} [amount] Amount of the rows to be removed. If not provided, one row will be removed\n * @param {String} [source] Source of method call.\n * @fires Hooks#beforeRemoveRow\n * @fires Hooks#afterRemoveRow\n */\nDataMap.prototype.removeRow = function (index, amount, source) {\n  if (!amount) {\n    amount = 1;\n  }\n  if (typeof index !== 'number') {\n    index = -amount;\n  }\n\n  amount = this.instance.runHooks('modifyRemovedAmount', amount, index);\n\n  index = (this.instance.countSourceRows() + index) % this.instance.countSourceRows();\n\n  var logicRows = this.visualRowsToPhysical(index, amount);\n  var actionWasNotCancelled = this.instance.runHooks('beforeRemoveRow', index, amount, logicRows, source);\n\n  if (actionWasNotCancelled === false) {\n    return;\n  }\n\n  var data = this.dataSource;\n  var newData = void 0;\n\n  newData = this.filterData(index, amount);\n\n  if (newData) {\n    data.length = 0;\n    Array.prototype.push.apply(data, newData);\n  }\n\n  this.instance.runHooks('afterRemoveRow', index, amount, logicRows, source);\n\n  this.instance.forceFullRender = true; // used when data was changed\n};\n\n/**\n * Removes column from the data array.\n *\n * @param {Number} [index] Visual index of the column to be removed. If not provided, the last column will be removed\n * @param {Number} [amount] Amount of the columns to be removed. If not provided, one column will be removed\n * @param {String} [source] Source of method call.\n * @fires Hooks#beforeRemoveCol\n * @fires Hooks#afterRemoveCol\n */\nDataMap.prototype.removeCol = function (index, amount, source) {\n  if (this.instance.dataType === 'object' || this.instance.getSettings().columns) {\n    throw new Error('cannot remove column with object data source or columns option specified');\n  }\n  if (!amount) {\n    amount = 1;\n  }\n  if (typeof index !== 'number') {\n    index = -amount;\n  }\n\n  index = (this.instance.countCols() + index) % this.instance.countCols();\n\n  var logicColumns = this.visualColumnsToPhysical(index, amount);\n  var descendingLogicColumns = logicColumns.slice(0).sort(function (a, b) {\n    return b - a;\n  });\n  var actionWasNotCancelled = this.instance.runHooks('beforeRemoveCol', index, amount, logicColumns, source);\n\n  if (actionWasNotCancelled === false) {\n    return;\n  }\n\n  var isTableUniform = true;\n  var removedColumnsCount = descendingLogicColumns.length;\n  var data = this.dataSource;\n\n  for (var c = 0; c < removedColumnsCount; c++) {\n    if (isTableUniform && logicColumns[0] !== logicColumns[c] - c) {\n      isTableUniform = false;\n    }\n  }\n\n  if (isTableUniform) {\n    for (var r = 0, rlen = this.instance.countSourceRows(); r < rlen; r++) {\n      data[r].splice(logicColumns[0], amount);\n    }\n  } else {\n    for (var _r2 = 0, _rlen = this.instance.countSourceRows(); _r2 < _rlen; _r2++) {\n      for (var _c = 0; _c < removedColumnsCount; _c++) {\n        data[_r2].splice(descendingLogicColumns[_c], 1);\n      }\n    }\n\n    for (var _c2 = 0; _c2 < removedColumnsCount; _c2++) {\n      this.priv.columnSettings.splice(logicColumns[_c2], 1);\n    }\n  }\n\n  this.instance.runHooks('afterRemoveCol', index, amount, logicColumns, source);\n\n  this.instance.forceFullRender = true; // used when data was changed\n};\n\n/**\n * Add/Removes data from the column.\n *\n * @param {Number} col Physical index of column in which do you want to do splice\n * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end\n * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed\n * @returns {Array} Returns removed portion of columns\n */\nDataMap.prototype.spliceCol = function (col, index, amount /* , elements... */) {\n  var elements = arguments.length >= 4 ? [].slice.call(arguments, 3) : [];\n\n  var colData = this.instance.getDataAtCol(col);\n  var removed = colData.slice(index, index + amount);\n  var after = colData.slice(index + amount);\n\n  (0, _array.extendArray)(elements, after);\n  var i = 0;\n  while (i < amount) {\n    elements.push(null); // add null in place of removed elements\n    i++;\n  }\n  (0, _array.to2dArray)(elements);\n  this.instance.populateFromArray(index, col, elements, null, null, 'spliceCol');\n\n  return removed;\n};\n\n/**\n * Add/Removes data from the row.\n *\n * @param {Number} row Physical index of row in which do you want to do splice\n * @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end.\n * @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed.\n * @returns {Array} Returns removed portion of rows\n */\nDataMap.prototype.spliceRow = function (row, index, amount /* , elements... */) {\n  var elements = arguments.length >= 4 ? [].slice.call(arguments, 3) : [];\n\n  var rowData = this.instance.getSourceDataAtRow(row);\n  var removed = rowData.slice(index, index + amount);\n  var after = rowData.slice(index + amount);\n\n  (0, _array.extendArray)(elements, after);\n  var i = 0;\n  while (i < amount) {\n    elements.push(null); // add null in place of removed elements\n    i++;\n  }\n  this.instance.populateFromArray(row, index, [elements], null, null, 'spliceRow');\n\n  return removed;\n};\n\n/**\n * Add/remove row(s) to/from the data source.\n *\n * @param {Number} index Physical index of the element to remove.\n * @param {Number} amount Number of rows to add/remove.\n * @param {Object} element Row to add.\n */\nDataMap.prototype.spliceData = function (index, amount, element) {\n  var continueSplicing = this.instance.runHooks('beforeDataSplice', index, amount, element);\n\n  if (continueSplicing !== false) {\n    this.dataSource.splice(index, amount, element);\n  }\n};\n\n/**\n * Filter unwanted data elements from the data source.\n *\n * @param {Number} index Visual index of the element to remove.\n * @param {Number} amount Number of rows to add/remove.\n * @returns {Array}\n */\nDataMap.prototype.filterData = function (index, amount) {\n  var physicalRows = this.visualRowsToPhysical(index, amount);\n  var continueSplicing = this.instance.runHooks('beforeDataFilter', index, amount, physicalRows);\n\n  if (continueSplicing !== false) {\n    var newData = this.dataSource.filter(function (row, index) {\n      return physicalRows.indexOf(index) == -1;\n    });\n\n    return newData;\n  }\n};\n\n/**\n * Returns single value from the data array.\n *\n * @param {Number} row Visual row index.\n * @param {Number} prop\n */\nDataMap.prototype.get = function (row, prop) {\n  row = this.instance.runHooks('modifyRow', row);\n\n  var dataRow = this.dataSource[row];\n  // TODO: To remove, use 'modifyData' hook instead (see below)\n  var modifiedRowData = this.instance.runHooks('modifyRowData', row);\n\n  dataRow = isNaN(modifiedRowData) ? modifiedRowData : dataRow;\n  //\n\n  var value = null;\n\n  // try to get value under property `prop` (includes dot)\n  if (dataRow && dataRow.hasOwnProperty && (0, _object.hasOwnProperty)(dataRow, prop)) {\n    value = dataRow[prop];\n  } else if (typeof prop === 'string' && prop.indexOf('.') > -1) {\n    var sliced = prop.split('.');\n    var out = dataRow;\n\n    if (!out) {\n      return null;\n    }\n    for (var i = 0, ilen = sliced.length; i < ilen; i++) {\n      out = out[sliced[i]];\n\n      if (typeof out === 'undefined') {\n        return null;\n      }\n    }\n    value = out;\n  } else if (typeof prop === 'function') {\n    /**\n     *  allows for interacting with complex structures, for example\n     *  d3/jQuery getter/setter properties:\n     *\n     *    {columns: [{\n     *      data: function(row, value){\n     *        if(arguments.length === 1){\n     *          return row.property();\n     *        }\n     *        row.property(value);\n     *      }\n     *    }]}\n     */\n    value = prop(this.dataSource.slice(row, row + 1)[0]);\n  }\n\n  if (this.instance.hasHook('modifyData')) {\n    var valueHolder = (0, _object.createObjectPropListener)(value);\n\n    this.instance.runHooks('modifyData', row, this.propToCol(prop), valueHolder, 'get');\n\n    if (valueHolder.isTouched()) {\n      value = valueHolder.value;\n    }\n  }\n\n  return value;\n};\n\nvar copyableLookup = (0, _data.cellMethodLookupFactory)('copyable', false);\n\n/**\n * Returns single value from the data array (intended for clipboard copy to an external application).\n *\n * @param {Number} row Physical row index.\n * @param {Number} prop\n * @returns {String}\n */\nDataMap.prototype.getCopyable = function (row, prop) {\n  if (copyableLookup.call(this.instance, row, this.propToCol(prop))) {\n    return this.get(row, prop);\n  }\n  return '';\n};\n\n/**\n * Saves single value to the data array.\n *\n * @param {Number} row Visual row index.\n * @param {Number} prop\n * @param {String} value\n * @param {String} [source] Source of hook runner.\n */\nDataMap.prototype.set = function (row, prop, value, source) {\n  row = this.instance.runHooks('modifyRow', row, source || 'datamapGet');\n\n  var dataRow = this.dataSource[row];\n  // TODO: To remove, use 'modifyData' hook instead (see below)\n  var modifiedRowData = this.instance.runHooks('modifyRowData', row);\n\n  dataRow = isNaN(modifiedRowData) ? modifiedRowData : dataRow;\n  //\n\n  if (this.instance.hasHook('modifyData')) {\n    var valueHolder = (0, _object.createObjectPropListener)(value);\n\n    this.instance.runHooks('modifyData', row, this.propToCol(prop), valueHolder, 'set');\n\n    if (valueHolder.isTouched()) {\n      value = valueHolder.value;\n    }\n  }\n\n  // try to set value under property `prop` (includes dot)\n  if (dataRow && dataRow.hasOwnProperty && (0, _object.hasOwnProperty)(dataRow, prop)) {\n    dataRow[prop] = value;\n  } else if (typeof prop === 'string' && prop.indexOf('.') > -1) {\n    var sliced = prop.split('.');\n    var out = dataRow;\n    var i = 0;\n    var ilen = void 0;\n\n    for (i = 0, ilen = sliced.length - 1; i < ilen; i++) {\n      if (typeof out[sliced[i]] === 'undefined') {\n        out[sliced[i]] = {};\n      }\n      out = out[sliced[i]];\n    }\n    out[sliced[i]] = value;\n  } else if (typeof prop === 'function') {\n    /* see the `function` handler in `get` */\n    prop(this.dataSource.slice(row, row + 1)[0], value);\n  } else {\n    dataRow[prop] = value;\n  }\n};\n\n/**\n * This ridiculous piece of code maps rows Id that are present in table data to those displayed for user.\n * The trick is, the physical row id (stored in settings.data) is not necessary the same\n * as the visual (displayed) row id (e.g. when sorting is applied).\n *\n * @param {Number} index Visual row index.\n * @param {Number} amount\n * @fires Hooks#modifyRow\n * @returns {Number}\n */\nDataMap.prototype.visualRowsToPhysical = function (index, amount) {\n  var totalRows = this.instance.countSourceRows();\n  var physicRow = (totalRows + index) % totalRows;\n  var logicRows = [];\n  var rowsToRemove = amount;\n  var row;\n\n  while (physicRow < totalRows && rowsToRemove) {\n    row = this.instance.runHooks('modifyRow', physicRow);\n    logicRows.push(row);\n\n    rowsToRemove--;\n    physicRow++;\n  }\n\n  return logicRows;\n};\n\n/**\n *\n * @param index Visual column index.\n * @param amount\n * @returns {Array}\n */\nDataMap.prototype.visualColumnsToPhysical = function (index, amount) {\n  var totalCols = this.instance.countCols();\n  var physicalCol = (totalCols + index) % totalCols;\n  var visualCols = [];\n  var colsToRemove = amount;\n\n  while (physicalCol < totalCols && colsToRemove) {\n    var col = this.instance.runHooks('modifyCol', physicalCol);\n\n    visualCols.push(col);\n\n    colsToRemove--;\n    physicalCol++;\n  }\n\n  return visualCols;\n};\n\n/**\n * Clears the data array.\n */\nDataMap.prototype.clear = function () {\n  for (var r = 0; r < this.instance.countSourceRows(); r++) {\n    for (var c = 0; c < this.instance.countCols(); c++) {\n      this.set(r, this.colToProp(c), '');\n    }\n  }\n};\n\n/**\n * Clear cached data length.\n */\nDataMap.prototype.clearLengthCache = function () {\n  this.cachedLength = null;\n};\n\n/**\n * Get data length.\n *\n * @returns {Number}\n */\nDataMap.prototype.getLength = function () {\n  var _this3 = this;\n\n  var maxRows = void 0,\n      maxRowsFromSettings = this.instance.getSettings().maxRows;\n\n  if (maxRowsFromSettings < 0 || maxRowsFromSettings === 0) {\n    maxRows = 0;\n  } else {\n    maxRows = maxRowsFromSettings || Infinity;\n  }\n\n  var length = this.instance.countSourceRows();\n\n  if (this.instance.hasHook('modifyRow')) {\n    var reValidate = this.skipCache;\n\n    this.interval.start();\n    if (length !== this.latestSourceRowsCount) {\n      reValidate = true;\n    }\n\n    this.latestSourceRowsCount = length;\n    if (this.cachedLength === null || reValidate) {\n      (0, _number.rangeEach)(length - 1, function (row) {\n        row = _this3.instance.runHooks('modifyRow', row);\n\n        if (row === null) {\n          --length;\n        }\n      });\n      this.cachedLength = length;\n    } else {\n      length = this.cachedLength;\n    }\n  } else {\n    this.interval.stop();\n  }\n\n  return Math.min(length, maxRows);\n};\n\n/**\n * Returns the data array.\n *\n * @returns {Array}\n */\nDataMap.prototype.getAll = function () {\n  var start = {\n    row: 0,\n    col: 0\n  };\n\n  var end = {\n    row: Math.max(this.instance.countSourceRows() - 1, 0),\n    col: Math.max(this.instance.countCols() - 1, 0)\n  };\n\n  if (start.row - end.row === 0 && !this.instance.countSourceRows()) {\n    return [];\n  }\n\n  return this.getRange(start, end, DataMap.prototype.DESTINATION_RENDERER);\n};\n\n/**\n * Returns data range as array.\n *\n * @param {Object} [start] Start selection position. Visual indexes.\n * @param {Object} [end] End selection position. Visual indexes.\n * @param {Number} destination Destination of datamap.get\n * @returns {Array}\n */\nDataMap.prototype.getRange = function (start, end, destination) {\n  var r,\n      rlen,\n      c,\n      clen,\n      output = [],\n      row;\n\n  var maxRows = this.instance.getSettings().maxRows;\n  var maxCols = this.instance.getSettings().maxCols;\n\n  if (maxRows === 0 || maxCols === 0) {\n    return [];\n  }\n\n  var getFn = destination === this.DESTINATION_CLIPBOARD_GENERATOR ? this.getCopyable : this.get;\n\n  rlen = Math.min(Math.max(maxRows - 1, 0), Math.max(start.row, end.row));\n  clen = Math.min(Math.max(maxCols - 1, 0), Math.max(start.col, end.col));\n\n  for (r = Math.min(start.row, end.row); r <= rlen; r++) {\n    row = [];\n    var physicalRow = this.instance.runHooks('modifyRow', r);\n\n    for (c = Math.min(start.col, end.col); c <= clen; c++) {\n\n      if (physicalRow === null) {\n        break;\n      }\n      row.push(getFn.call(this, r, this.colToProp(c)));\n    }\n    if (physicalRow !== null) {\n      output.push(row);\n    }\n  }\n\n  return output;\n};\n\n/**\n * Return data as text (tab separated columns).\n *\n * @param {Object} [start] Start selection position. Visual indexes.\n * @param {Object} [end] End selection position. Visual indexes.\n * @returns {String}\n */\nDataMap.prototype.getText = function (start, end) {\n  return _SheetClip2.default.stringify(this.getRange(start, end, this.DESTINATION_RENDERER));\n};\n\n/**\n * Return data as copyable text (tab separated columns intended for clipboard copy to an external application).\n *\n * @param {Object} [start] Start selection position. Visual indexes.\n * @param {Object} [end] End selection position. Visual indexes.\n * @returns {String}\n */\nDataMap.prototype.getCopyableText = function (start, end) {\n  return _SheetClip2.default.stringify(this.getRange(start, end, this.DESTINATION_CLIPBOARD_GENERATOR));\n};\n\n/**\n * `skipLengthCache` callback.\n * @private\n * @param {Number} delay Time of the delay in milliseconds.\n */\nDataMap.prototype.onSkipLengthCache = function (delay) {\n  var _this4 = this;\n\n  this.skipCache = true;\n  setTimeout(function () {\n    _this4.skipCache = false;\n  }, delay);\n};\n\n/**\n * Destroy instance.\n */\nDataMap.prototype.destroy = function () {\n  this.interval.stop();\n\n  this.interval = null;\n  this.instance = null;\n  this.priv = null;\n  this.GridSettings = null;\n  this.dataSource = null;\n  this.cachedLength = null;\n  this.duckSchema = null;\n};\n\nexports.default = DataMap;\n\n/***/ }),\n/* 264 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nexports.parseDelay = parseDelay;\n\nvar _feature = __webpack_require__(40);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Interval\n * @util\n */\nvar Interval = function () {\n  _createClass(Interval, null, [{\n    key: 'create',\n    value: function create(func, delay) {\n      return new Interval(func, delay);\n    }\n  }]);\n\n  function Interval(func, delay) {\n    var _this = this;\n\n    _classCallCheck(this, Interval);\n\n    /**\n     * Animation frame request id.\n     *\n     * @type {Number}\n     */\n    this.timer = null;\n    /**\n     * Function to invoke repeatedly.\n     *\n     * @type {Function}\n     */\n    this.func = func;\n    /**\n     * Number of milliseconds that function should wait before next call.\n     */\n    this.delay = parseDelay(delay);\n    /**\n     * Flag which indicates if interval object was stopped.\n     *\n     * @type {Boolean}\n     * @default true\n     */\n    this.stopped = true;\n    /**\n     * Interval time (in milliseconds) of the last callback call.\n     *\n     * @private\n     * @type {Number}\n     */\n    this._then = null;\n    /**\n     * Bounded function `func`.\n     *\n     * @private\n     * @type {Function}\n     */\n    this._callback = function () {\n      return _this.__callback();\n    };\n  }\n\n  /**\n   * Start loop.\n   *\n   * @returns {Interval}\n   */\n\n\n  _createClass(Interval, [{\n    key: 'start',\n    value: function start() {\n      if (this.stopped) {\n        this._then = Date.now();\n        this.stopped = false;\n        this.timer = (0, _feature.requestAnimationFrame)(this._callback);\n      }\n\n      return this;\n    }\n\n    /**\n     * Stop looping.\n     *\n     * @returns {Interval}\n     */\n\n  }, {\n    key: 'stop',\n    value: function stop() {\n      if (!this.stopped) {\n        this.stopped = true;\n        (0, _feature.cancelAnimationFrame)(this.timer);\n        this.timer = null;\n      }\n\n      return this;\n    }\n\n    /**\n     * Loop callback, fired on every animation frame.\n     *\n     * @private\n     */\n\n  }, {\n    key: '__callback',\n    value: function __callback() {\n      this.timer = (0, _feature.requestAnimationFrame)(this._callback);\n\n      if (this.delay) {\n        var now = Date.now();\n        var elapsed = now - this._then;\n\n        if (elapsed > this.delay) {\n          this._then = now - elapsed % this.delay;\n          this.func();\n        }\n      } else {\n        this.func();\n      }\n    }\n  }]);\n\n  return Interval;\n}();\n\nexports.default = Interval;\nfunction parseDelay(delay) {\n  if (typeof delay === 'string' && /fps$/.test(delay)) {\n    delay = 1000 / parseInt(delay.replace('fps', '') || 0, 10);\n  }\n\n  return delay;\n}\n\n/***/ }),\n/* 265 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction MultiMap() {\n  var map = {\n    arrayMap: [],\n    weakMap: new WeakMap()\n  };\n\n  return {\n    get: function get(key) {\n      if (canBeAnArrayMapKey(key)) {\n        return map.arrayMap[key];\n      } else if (canBeAWeakMapKey(key)) {\n        return map.weakMap.get(key);\n      }\n    },\n    set: function set(key, value) {\n      if (canBeAnArrayMapKey(key)) {\n        map.arrayMap[key] = value;\n      } else if (canBeAWeakMapKey(key)) {\n        map.weakMap.set(key, value);\n      } else {\n        throw new Error('Invalid key type');\n      }\n    },\n    delete: function _delete(key) {\n      if (canBeAnArrayMapKey(key)) {\n        delete map.arrayMap[key];\n      } else if (canBeAWeakMapKey(key)) {\n        map.weakMap.delete(key);\n      }\n    }\n  };\n\n  function canBeAnArrayMapKey(obj) {\n    return obj !== null && !isNaNSymbol(obj) && (typeof obj == 'string' || typeof obj == 'number');\n  }\n\n  function canBeAWeakMapKey(obj) {\n    return obj !== null && ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) == 'object' || typeof obj == 'function');\n  }\n\n  function isNaNSymbol(obj) {\n    /* eslint-disable no-self-compare */\n    return obj !== obj; // NaN === NaN is always false\n  }\n}\n\nexports.default = MultiMap;\n\n/***/ }),\n/* 266 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\nvar _unicode = __webpack_require__(21);\n\nvar _event = __webpack_require__(12);\n\nvar _editors = __webpack_require__(17);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _baseEditor = __webpack_require__(53);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction EditorManager(instance, priv, selection) {\n  var _this = this,\n      destroyed = false,\n      lock = false,\n      eventManager,\n      activeEditor;\n\n  eventManager = new _eventManager2.default(instance);\n\n  function moveSelectionAfterEnter(shiftKey) {\n    var enterMoves = typeof priv.settings.enterMoves === 'function' ? priv.settings.enterMoves(event) : priv.settings.enterMoves;\n\n    if (shiftKey) {\n      // move selection up\n      selection.transformStart(-enterMoves.row, -enterMoves.col);\n    } else {\n      // move selection down (add a new row if needed)\n      selection.transformStart(enterMoves.row, enterMoves.col, true);\n    }\n  }\n\n  function moveSelectionUp(shiftKey) {\n    if (shiftKey) {\n      selection.transformEnd(-1, 0);\n    } else {\n      selection.transformStart(-1, 0);\n    }\n  }\n\n  function moveSelectionDown(shiftKey) {\n    if (shiftKey) {\n      // expanding selection down with shift\n      selection.transformEnd(1, 0);\n    } else {\n      selection.transformStart(1, 0);\n    }\n  }\n\n  function moveSelectionRight(shiftKey) {\n    if (shiftKey) {\n      selection.transformEnd(0, 1);\n    } else {\n      selection.transformStart(0, 1);\n    }\n  }\n\n  function moveSelectionLeft(shiftKey) {\n    if (shiftKey) {\n      selection.transformEnd(0, -1);\n    } else {\n      selection.transformStart(0, -1);\n    }\n  }\n\n  function onKeyDown(event) {\n    if (!instance.isListening()) {\n      return;\n    }\n    instance.runHooks('beforeKeyDown', event);\n\n    if (destroyed) {\n      return;\n    }\n    if ((0, _event.isImmediatePropagationStopped)(event)) {\n      return;\n    }\n    priv.lastKeyCode = event.keyCode;\n\n    if (!selection.isSelected()) {\n      return;\n    }\n    // catch CTRL but not right ALT (which in some systems triggers ALT+CTRL)\n    var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey;\n\n    if (activeEditor && !activeEditor.isWaiting()) {\n      if (!(0, _unicode.isMetaKey)(event.keyCode) && !(0, _unicode.isCtrlMetaKey)(event.keyCode) && !ctrlDown && !_this.isEditorOpened()) {\n        _this.openEditor('', event);\n\n        return;\n      }\n    }\n    var rangeModifier = event.shiftKey ? selection.setRangeEnd : selection.setRangeStart;\n    var tabMoves = void 0;\n\n    switch (event.keyCode) {\n      case _unicode.KEY_CODES.A:\n        if (!_this.isEditorOpened() && ctrlDown) {\n          instance.selectAll();\n\n          event.preventDefault();\n          (0, _event.stopPropagation)(event);\n        }\n        break;\n\n      case _unicode.KEY_CODES.ARROW_UP:\n        if (_this.isEditorOpened() && !activeEditor.isWaiting()) {\n          _this.closeEditorAndSaveChanges(ctrlDown);\n        }\n        moveSelectionUp(event.shiftKey);\n\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.ARROW_DOWN:\n        if (_this.isEditorOpened() && !activeEditor.isWaiting()) {\n          _this.closeEditorAndSaveChanges(ctrlDown);\n        }\n\n        moveSelectionDown(event.shiftKey);\n\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.ARROW_RIGHT:\n        if (_this.isEditorOpened() && !activeEditor.isWaiting()) {\n          _this.closeEditorAndSaveChanges(ctrlDown);\n        }\n\n        moveSelectionRight(event.shiftKey);\n\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.ARROW_LEFT:\n        if (_this.isEditorOpened() && !activeEditor.isWaiting()) {\n          _this.closeEditorAndSaveChanges(ctrlDown);\n        }\n\n        moveSelectionLeft(event.shiftKey);\n\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.TAB:\n        tabMoves = typeof priv.settings.tabMoves === 'function' ? priv.settings.tabMoves(event) : priv.settings.tabMoves;\n\n        if (event.shiftKey) {\n          // move selection left\n          selection.transformStart(-tabMoves.row, -tabMoves.col);\n        } else {\n          // move selection right (add a new column if needed)\n          selection.transformStart(tabMoves.row, tabMoves.col, true);\n        }\n        event.preventDefault();\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.BACKSPACE:\n      case _unicode.KEY_CODES.DELETE:\n        instance.emptySelectedCells();\n        _this.prepareEditor();\n        event.preventDefault();\n        break;\n\n      case _unicode.KEY_CODES.F2:\n        /* F2 */\n        _this.openEditor(null, event);\n\n        if (activeEditor) {\n          activeEditor.enableFullEditMode();\n        }\n        event.preventDefault(); // prevent Opera from opening 'Go to Page dialog'\n        break;\n\n      case _unicode.KEY_CODES.ENTER:\n        /* return/enter */\n        if (_this.isEditorOpened()) {\n\n          if (activeEditor && activeEditor.state !== _baseEditor.EditorState.WAITING) {\n            _this.closeEditorAndSaveChanges(ctrlDown);\n          }\n          moveSelectionAfterEnter(event.shiftKey);\n        } else if (instance.getSettings().enterBeginsEditing) {\n          _this.openEditor(null, event);\n\n          if (activeEditor) {\n            activeEditor.enableFullEditMode();\n          }\n        } else {\n          moveSelectionAfterEnter(event.shiftKey);\n        }\n        event.preventDefault(); // don't add newline to field\n        (0, _event.stopImmediatePropagation)(event); // required by HandsontableEditor\n        break;\n\n      case _unicode.KEY_CODES.ESCAPE:\n        if (_this.isEditorOpened()) {\n          _this.closeEditorAndRestoreOriginalValue(ctrlDown);\n        }\n        event.preventDefault();\n        break;\n\n      case _unicode.KEY_CODES.HOME:\n        if (event.ctrlKey || event.metaKey) {\n          rangeModifier.call(selection, new _src.CellCoords(0, selection.selectedRange.current().from.col));\n        } else {\n          rangeModifier.call(selection, new _src.CellCoords(selection.selectedRange.current().from.row, 0));\n        }\n        event.preventDefault(); // don't scroll the window\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.END:\n        if (event.ctrlKey || event.metaKey) {\n          rangeModifier.call(selection, new _src.CellCoords(instance.countRows() - 1, selection.selectedRange.current().from.col));\n        } else {\n          rangeModifier.call(selection, new _src.CellCoords(selection.selectedRange.current().from.row, instance.countCols() - 1));\n        }\n        event.preventDefault(); // don't scroll the window\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.PAGE_UP:\n        selection.transformStart(-instance.countVisibleRows(), 0);\n        event.preventDefault(); // don't page up the window\n        (0, _event.stopPropagation)(event);\n        break;\n\n      case _unicode.KEY_CODES.PAGE_DOWN:\n        selection.transformStart(instance.countVisibleRows(), 0);\n        event.preventDefault(); // don't page down the window\n        (0, _event.stopPropagation)(event);\n        break;\n      default:\n        break;\n    }\n  }\n\n  function init() {\n    instance.addHook('afterDocumentKeyDown', onKeyDown);\n\n    eventManager.addEventListener(document.documentElement, 'keydown', function (event) {\n      if (!destroyed) {\n        instance.runHooks('afterDocumentKeyDown', event);\n      }\n    });\n\n    function onDblClick(event, coords, elem) {\n      // may be TD or TH\n      if (elem.nodeName === 'TD') {\n        _this.openEditor(null, event);\n\n        if (activeEditor) {\n          activeEditor.enableFullEditMode();\n        }\n      }\n    }\n    instance.view.wt.update('onCellDblClick', onDblClick);\n  }\n\n  /**\n  * Lock the editor from being prepared and closed. Locking the editor prevents its closing and\n  * reinitialized after selecting the new cell. This feature is necessary for a mobile editor.\n  *\n  * @function lockEditor\n  * @memberof! Handsontable.EditorManager#\n   */\n  this.lockEditor = function () {\n    lock = true;\n  };\n\n  /**\n  * Unlock the editor from being prepared and closed. This method restores the original behavior of\n  * the editors where for every new selection its instances are closed.\n  *\n  * @function unlockEditor\n  * @memberof! Handsontable.EditorManager#\n   */\n  this.unlockEditor = function () {\n    lock = false;\n  };\n\n  /**\n   * Destroy current editor, if exists.\n   *\n   * @function destroyEditor\n   * @memberof! Handsontable.EditorManager#\n   * @param {Boolean} revertOriginal\n   */\n  this.destroyEditor = function (revertOriginal) {\n    if (!lock) {\n      this.closeEditor(revertOriginal);\n    }\n  };\n\n  /**\n   * Get active editor.\n   *\n   * @function getActiveEditor\n   * @memberof! Handsontable.EditorManager#\n   * @returns {*}\n   */\n  this.getActiveEditor = function () {\n    return activeEditor;\n  };\n\n  /**\n   * Prepare text input to be displayed at given grid cell.\n   *\n   * @function prepareEditor\n   * @memberof! Handsontable.EditorManager#\n   */\n  this.prepareEditor = function () {\n    if (lock) {\n      return;\n    }\n\n    var row, col, prop, td, originalValue, cellProperties, editorClass;\n\n    if (activeEditor && activeEditor.isWaiting()) {\n      this.closeEditor(false, false, function (dataSaved) {\n        if (dataSaved) {\n          _this.prepareEditor();\n        }\n      });\n\n      return;\n    }\n    row = instance.selection.selectedRange.current().highlight.row;\n    col = instance.selection.selectedRange.current().highlight.col;\n    prop = instance.colToProp(col);\n    td = instance.getCell(row, col);\n\n    originalValue = instance.getSourceDataAtCell(instance.runHooks('modifyRow', row), col);\n    cellProperties = instance.getCellMeta(row, col);\n    editorClass = instance.getCellEditor(cellProperties);\n\n    if (editorClass) {\n      activeEditor = (0, _editors.getEditorInstance)(editorClass, instance);\n      activeEditor.prepare(row, col, prop, td, originalValue, cellProperties);\n    } else {\n      activeEditor = void 0;\n    }\n  };\n\n  /**\n   * Check is editor is opened/showed.\n   *\n   * @function isEditorOpened\n   * @memberof! Handsontable.EditorManager#\n   * @returns {Boolean}\n   */\n  this.isEditorOpened = function () {\n    return activeEditor && activeEditor.isOpened();\n  };\n\n  /**\n   * Open editor with initial value.\n   *\n   * @function openEditor\n   * @memberof! Handsontable.EditorManager#\n   * @param {null|String} newInitialValue new value from which editor will start if handled property it's not the `null`.\n   * @param {DOMEvent} event\n   */\n  this.openEditor = function (newInitialValue, event) {\n    if (activeEditor && !activeEditor.cellProperties.readOnly) {\n      activeEditor.beginEditing(newInitialValue, event);\n    } else if (activeEditor && activeEditor.cellProperties.readOnly) {\n\n      // move the selection after opening the editor with ENTER key\n      if (event && event.keyCode === _unicode.KEY_CODES.ENTER) {\n        moveSelectionAfterEnter();\n      }\n    }\n  };\n\n  /**\n   * Close editor, finish editing cell.\n   *\n   * @function closeEditor\n   * @memberof! Handsontable.EditorManager#\n   * @param {Boolean} restoreOriginalValue\n   * @param {Boolean} [ctrlDown]\n   * @param {Function} [callback]\n   */\n  this.closeEditor = function (restoreOriginalValue, ctrlDown, callback) {\n    if (activeEditor) {\n      activeEditor.finishEditing(restoreOriginalValue, ctrlDown, callback);\n    } else if (callback) {\n      callback(false);\n    }\n  };\n\n  /**\n   * Close editor and save changes.\n   *\n   * @function closeEditorAndSaveChanges\n   * @memberof! Handsontable.EditorManager#\n   * @param {Boolean} ctrlDown\n   */\n  this.closeEditorAndSaveChanges = function (ctrlDown) {\n    return this.closeEditor(false, ctrlDown);\n  };\n\n  /**\n   * Close editor and restore original value.\n   *\n   * @function closeEditorAndRestoreOriginalValue\n   * @memberof! Handsontable.EditorManager#\n   * @param {Boolean} ctrlDown\n   */\n  this.closeEditorAndRestoreOriginalValue = function (ctrlDown) {\n    return this.closeEditor(true, ctrlDown);\n  };\n\n  /**\n   * Destroy the instance.\n   */\n  this.destroy = function () {\n    destroyed = true;\n  };\n\n  init();\n}\n\nvar instances = new WeakMap();\n\nEditorManager.getInstance = function (hotInstance, hotSettings, selection, datamap) {\n  var editorManager = instances.get(hotInstance);\n\n  if (!editorManager) {\n    editorManager = new EditorManager(hotInstance, hotSettings, selection, datamap);\n    instances.set(hotInstance, editorManager);\n  }\n\n  return editorManager;\n};\n\nexports.default = EditorManager;\n\n/***/ }),\n/* 267 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _browser = __webpack_require__(27);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _event = __webpack_require__(12);\n\nvar _src = __webpack_require__(4);\n\nvar _src2 = _interopRequireDefault(_src);\n\nvar _mouseEventHandler = __webpack_require__(192);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Handsontable TableView constructor\n * @param {Object} instance\n */\nfunction TableView(instance) {\n  var _this = this;\n\n  var that = this;\n\n  this.eventManager = new _eventManager2.default(instance);\n  this.instance = instance;\n  this.settings = instance.getSettings();\n  this.selectionMouseDown = false;\n\n  var originalStyle = instance.rootElement.getAttribute('style');\n\n  if (originalStyle) {\n    instance.rootElement.setAttribute('data-originalstyle', originalStyle); // needed to retrieve original style in jsFiddle link generator in HT examples. may be removed in future versions\n  }\n\n  (0, _element.addClass)(instance.rootElement, 'handsontable');\n\n  var table = document.createElement('TABLE');\n  (0, _element.addClass)(table, 'htCore');\n\n  if (instance.getSettings().tableClassName) {\n    (0, _element.addClass)(table, instance.getSettings().tableClassName);\n  }\n  this.THEAD = document.createElement('THEAD');\n  table.appendChild(this.THEAD);\n  this.TBODY = document.createElement('TBODY');\n  table.appendChild(this.TBODY);\n\n  instance.table = table;\n\n  instance.container.insertBefore(table, instance.container.firstChild);\n\n  this.eventManager.addEventListener(instance.rootElement, 'mousedown', function (event) {\n    this.selectionMouseDown = true;\n\n    if (!that.isTextSelectionAllowed(event.target)) {\n      clearTextSelection();\n      event.preventDefault();\n      window.focus(); // make sure that window that contains HOT is active. Important when HOT is in iframe.\n    }\n  });\n  this.eventManager.addEventListener(instance.rootElement, 'mouseup', function (event) {\n    this.selectionMouseDown = false;\n  });\n  this.eventManager.addEventListener(instance.rootElement, 'mousemove', function (event) {\n    if (this.selectionMouseDown && !that.isTextSelectionAllowed(event.target)) {\n      clearTextSelection();\n      event.preventDefault();\n    }\n  });\n\n  this.eventManager.addEventListener(document.documentElement, 'keyup', function (event) {\n    if (instance.selection.isInProgress() && !event.shiftKey) {\n      instance.selection.finish();\n    }\n  });\n\n  var isMouseDown;\n  this.isMouseDown = function () {\n    return isMouseDown;\n  };\n\n  this.eventManager.addEventListener(document.documentElement, 'mouseup', function (event) {\n    if (instance.selection.isInProgress() && (0, _event.isLeftClick)(event)) {\n      // is left mouse button\n      instance.selection.finish();\n    }\n\n    isMouseDown = false;\n\n    if ((0, _element.isOutsideInput)(document.activeElement) || !instance.selection.isSelected() && !(0, _event.isRightClick)(event)) {\n      instance.unlisten();\n    }\n  });\n\n  this.eventManager.addEventListener(document.documentElement, 'mousedown', function (event) {\n    var originalTarget = event.target;\n    var next = event.target;\n    var eventX = event.x || event.clientX;\n    var eventY = event.y || event.clientY;\n\n    if (isMouseDown || !instance.rootElement) {\n      return; // it must have been started in a cell\n    }\n\n    // immediate click on \"holder\" means click on the right side of vertical scrollbar\n    if (next === instance.view.wt.wtTable.holder) {\n      var scrollbarWidth = (0, _element.getScrollbarWidth)();\n\n      if (document.elementFromPoint(eventX + scrollbarWidth, eventY) !== instance.view.wt.wtTable.holder || document.elementFromPoint(eventX, eventY + scrollbarWidth) !== instance.view.wt.wtTable.holder) {\n        return;\n      }\n    } else {\n      while (next !== document.documentElement) {\n        if (next === null) {\n          if (event.isTargetWebComponent) {\n            break;\n          }\n          // click on something that was a row but now is detached (possibly because your click triggered a rerender)\n          return;\n        }\n        if (next === instance.rootElement) {\n          // click inside container\n          return;\n        }\n        next = next.parentNode;\n      }\n    }\n\n    // function did not return until here, we have an outside click!\n\n    var outsideClickDeselects = typeof that.settings.outsideClickDeselects === 'function' ? that.settings.outsideClickDeselects(originalTarget) : that.settings.outsideClickDeselects;\n\n    if (outsideClickDeselects) {\n      instance.deselectCell();\n    } else {\n      instance.destroyEditor();\n    }\n  });\n\n  this.eventManager.addEventListener(table, 'selectstart', function (event) {\n    if (that.settings.fragmentSelection || (0, _element.isInput)(event.target)) {\n      return;\n    }\n    // https://github.com/handsontable/handsontable/issues/160\n    // Prevent text from being selected when performing drag down.\n    event.preventDefault();\n  });\n\n  var clearTextSelection = function clearTextSelection() {\n    // http://stackoverflow.com/questions/3169786/clear-text-selection-with-javascript\n    if (window.getSelection) {\n      if (window.getSelection().empty) {\n        // Chrome\n        window.getSelection().empty();\n      } else if (window.getSelection().removeAllRanges) {\n        // Firefox\n        window.getSelection().removeAllRanges();\n      }\n    } else if (document.selection) {\n      // IE?\n      document.selection.empty();\n    }\n  };\n\n  var walkontableConfig = {\n    debug: function debug() {\n      return that.settings.debug;\n    },\n    externalRowCalculator: this.instance.getPlugin('autoRowSize') && this.instance.getPlugin('autoRowSize').isEnabled(),\n    table: table,\n    preventOverflow: function preventOverflow() {\n      return _this.settings.preventOverflow;\n    },\n    stretchH: function stretchH() {\n      return that.settings.stretchH;\n    },\n    data: instance.getDataAtCell,\n    totalRows: function totalRows() {\n      return instance.countRows();\n    },\n    totalColumns: function totalColumns() {\n      return instance.countCols();\n    },\n    fixedColumnsLeft: function fixedColumnsLeft() {\n      return that.settings.fixedColumnsLeft;\n    },\n    fixedRowsTop: function fixedRowsTop() {\n      return that.settings.fixedRowsTop;\n    },\n    fixedRowsBottom: function fixedRowsBottom() {\n      return that.settings.fixedRowsBottom;\n    },\n    minSpareRows: function minSpareRows() {\n      return that.settings.minSpareRows;\n    },\n    renderAllRows: that.settings.renderAllRows,\n    rowHeaders: function rowHeaders() {\n      var headerRenderers = [];\n\n      if (instance.hasRowHeaders()) {\n        headerRenderers.push(function (row, TH) {\n          that.appendRowHeader(row, TH);\n        });\n      }\n      instance.runHooks('afterGetRowHeaderRenderers', headerRenderers);\n\n      return headerRenderers;\n    },\n    columnHeaders: function columnHeaders() {\n      var headerRenderers = [];\n\n      if (instance.hasColHeaders()) {\n        headerRenderers.push(function (column, TH) {\n          that.appendColHeader(column, TH);\n        });\n      }\n\n      instance.runHooks('afterGetColumnHeaderRenderers', headerRenderers);\n\n      return headerRenderers;\n    },\n    columnWidth: instance.getColWidth,\n    rowHeight: instance.getRowHeight,\n    cellRenderer: function cellRenderer(row, col, TD) {\n      var cellProperties = that.instance.getCellMeta(row, col);\n      var prop = that.instance.colToProp(col);\n      var value = that.instance.getDataAtRowProp(row, prop);\n\n      if (that.instance.hasHook('beforeValueRender')) {\n        value = that.instance.runHooks('beforeValueRender', value, cellProperties);\n      }\n\n      that.instance.runHooks('beforeRenderer', TD, row, col, prop, value, cellProperties);\n      that.instance.getCellRenderer(cellProperties)(that.instance, TD, row, col, prop, value, cellProperties);\n      that.instance.runHooks('afterRenderer', TD, row, col, prop, value, cellProperties);\n    },\n    selections: that.instance.selection.highlight,\n    hideBorderOnMouseDownOver: function hideBorderOnMouseDownOver() {\n      return that.settings.fragmentSelection;\n    },\n    onCellMouseDown: function onCellMouseDown(event, coords, TD, wt) {\n      var blockCalculations = {\n        row: false,\n        column: false,\n        cell: false\n      };\n\n      instance.listen();\n\n      that.activeWt = wt;\n      isMouseDown = true;\n\n      instance.runHooks('beforeOnCellMouseDown', event, coords, TD, blockCalculations);\n\n      if ((0, _event.isImmediatePropagationStopped)(event)) {\n        return;\n      }\n\n      (0, _mouseEventHandler.handleMouseEvent)(event, {\n        coords: coords,\n        selection: instance.selection,\n        controller: blockCalculations\n      });\n\n      instance.runHooks('afterOnCellMouseDown', event, coords, TD);\n      that.activeWt = that.wt;\n    },\n    onCellMouseOut: function onCellMouseOut(event, coords, TD, wt) {\n      that.activeWt = wt;\n      instance.runHooks('beforeOnCellMouseOut', event, coords, TD);\n\n      if ((0, _event.isImmediatePropagationStopped)(event)) {\n        return;\n      }\n\n      instance.runHooks('afterOnCellMouseOut', event, coords, TD);\n      that.activeWt = that.wt;\n    },\n    onCellMouseOver: function onCellMouseOver(event, coords, TD, wt) {\n      var blockCalculations = {\n        row: false,\n        column: false,\n        cell: false\n      };\n\n      that.activeWt = wt;\n\n      instance.runHooks('beforeOnCellMouseOver', event, coords, TD, blockCalculations);\n\n      if ((0, _event.isImmediatePropagationStopped)(event)) {\n        return;\n      }\n\n      if (isMouseDown) {\n        (0, _mouseEventHandler.handleMouseEvent)(event, {\n          coords: coords,\n          selection: instance.selection,\n          controller: blockCalculations\n        });\n      }\n\n      instance.runHooks('afterOnCellMouseOver', event, coords, TD);\n      that.activeWt = that.wt;\n    },\n    onCellMouseUp: function onCellMouseUp(event, coords, TD, wt) {\n      that.activeWt = wt;\n      instance.runHooks('beforeOnCellMouseUp', event, coords, TD);\n\n      instance.runHooks('afterOnCellMouseUp', event, coords, TD);\n      that.activeWt = that.wt;\n    },\n    onCellCornerMouseDown: function onCellCornerMouseDown(event) {\n      event.preventDefault();\n      instance.runHooks('afterOnCellCornerMouseDown', event);\n    },\n    onCellCornerDblClick: function onCellCornerDblClick(event) {\n      event.preventDefault();\n      instance.runHooks('afterOnCellCornerDblClick', event);\n    },\n    beforeDraw: function beforeDraw(force, skipRender) {\n      that.beforeRender(force, skipRender);\n    },\n    onDraw: function onDraw(force) {\n      that.onDraw(force);\n    },\n    onScrollVertically: function onScrollVertically() {\n      instance.runHooks('afterScrollVertically');\n    },\n    onScrollHorizontally: function onScrollHorizontally() {\n      instance.runHooks('afterScrollHorizontally');\n    },\n    onBeforeRemoveCellClassNames: function onBeforeRemoveCellClassNames() {\n      return instance.runHooks('beforeRemoveCellClassNames');\n    },\n    onAfterDrawSelection: function onAfterDrawSelection(currentRow, currentColumn, cornersOfSelection, layerLevel) {\n      return instance.runHooks('afterDrawSelection', currentRow, currentColumn, cornersOfSelection, layerLevel);\n    },\n    onBeforeDrawBorders: function onBeforeDrawBorders(corners, borderClassName) {\n      instance.runHooks('beforeDrawBorders', corners, borderClassName);\n    },\n    onBeforeTouchScroll: function onBeforeTouchScroll() {\n      instance.runHooks('beforeTouchScroll');\n    },\n    onAfterMomentumScroll: function onAfterMomentumScroll() {\n      instance.runHooks('afterMomentumScroll');\n    },\n    onBeforeStretchingColumnWidth: function onBeforeStretchingColumnWidth(stretchedWidth, column) {\n      return instance.runHooks('beforeStretchingColumnWidth', stretchedWidth, column);\n    },\n    onModifyRowHeaderWidth: function onModifyRowHeaderWidth(rowHeaderWidth) {\n      return instance.runHooks('modifyRowHeaderWidth', rowHeaderWidth);\n    },\n    onModifyGetCellCoords: function onModifyGetCellCoords(row, column, topmost) {\n      return instance.runHooks('modifyGetCellCoords', row, column, topmost);\n    },\n    viewportRowCalculatorOverride: function viewportRowCalculatorOverride(calc) {\n      var rows = instance.countRows();\n      var viewportOffset = that.settings.viewportRowRenderingOffset;\n\n      if (viewportOffset === 'auto' && that.settings.fixedRowsTop) {\n        viewportOffset = 10;\n      }\n      if (typeof viewportOffset === 'number') {\n        calc.startRow = Math.max(calc.startRow - viewportOffset, 0);\n        calc.endRow = Math.min(calc.endRow + viewportOffset, rows - 1);\n      }\n      if (viewportOffset === 'auto') {\n        var center = calc.startRow + calc.endRow - calc.startRow;\n        var offset = Math.ceil(center / rows * 12);\n\n        calc.startRow = Math.max(calc.startRow - offset, 0);\n        calc.endRow = Math.min(calc.endRow + offset, rows - 1);\n      }\n      instance.runHooks('afterViewportRowCalculatorOverride', calc);\n    },\n    viewportColumnCalculatorOverride: function viewportColumnCalculatorOverride(calc) {\n      var cols = instance.countCols();\n      var viewportOffset = that.settings.viewportColumnRenderingOffset;\n\n      if (viewportOffset === 'auto' && that.settings.fixedColumnsLeft) {\n        viewportOffset = 10;\n      }\n      if (typeof viewportOffset === 'number') {\n        calc.startColumn = Math.max(calc.startColumn - viewportOffset, 0);\n        calc.endColumn = Math.min(calc.endColumn + viewportOffset, cols - 1);\n      }\n      if (viewportOffset === 'auto') {\n        var center = calc.startColumn + calc.endColumn - calc.startColumn;\n        var offset = Math.ceil(center / cols * 12);\n\n        calc.startRow = Math.max(calc.startColumn - offset, 0);\n        calc.endColumn = Math.min(calc.endColumn + offset, cols - 1);\n      }\n      instance.runHooks('afterViewportColumnCalculatorOverride', calc);\n    },\n    rowHeaderWidth: function rowHeaderWidth() {\n      return that.settings.rowHeaderWidth;\n    },\n    columnHeaderHeight: function columnHeaderHeight() {\n      var columnHeaderHeight = instance.runHooks('modifyColumnHeaderHeight');\n      return that.settings.columnHeaderHeight || columnHeaderHeight;\n    }\n  };\n\n  instance.runHooks('beforeInitWalkontable', walkontableConfig);\n\n  this.wt = new _src2.default(walkontableConfig);\n  this.activeWt = this.wt;\n\n  this.eventManager.addEventListener(that.wt.wtTable.spreader, 'mousedown', function (event) {\n    // right mouse button exactly on spreader means right click on the right hand side of vertical scrollbar\n    if (event.target === that.wt.wtTable.spreader && event.which === 3) {\n      (0, _event.stopPropagation)(event);\n    }\n  });\n\n  this.eventManager.addEventListener(that.wt.wtTable.spreader, 'contextmenu', function (event) {\n    // right mouse button exactly on spreader means right click on the right hand side of vertical scrollbar\n    if (event.target === that.wt.wtTable.spreader && event.which === 3) {\n      (0, _event.stopPropagation)(event);\n    }\n  });\n\n  this.eventManager.addEventListener(document.documentElement, 'click', function () {\n    if (that.settings.observeDOMVisibility) {\n      if (that.wt.drawInterrupted) {\n        that.instance.forceFullRender = true;\n        that.render();\n      }\n    }\n  });\n}\n\nTableView.prototype.isTextSelectionAllowed = function (el) {\n  if ((0, _element.isInput)(el)) {\n    return true;\n  }\n  var isChildOfTableBody = (0, _element.isChildOf)(el, this.instance.view.wt.wtTable.spreader);\n\n  if (this.settings.fragmentSelection === true && isChildOfTableBody) {\n    return true;\n  }\n  if (this.settings.fragmentSelection === 'cell' && this.isSelectedOnlyCell() && isChildOfTableBody) {\n    return true;\n  }\n  if (!this.settings.fragmentSelection && this.isCellEdited() && this.isSelectedOnlyCell()) {\n    return true;\n  }\n\n  return false;\n};\n\n/**\n * Check if selected only one cell.\n *\n * @returns {Boolean}\n */\nTableView.prototype.isSelectedOnlyCell = function () {\n  var _ref = this.instance.getSelectedLast() || [],\n      _ref2 = _slicedToArray(_ref, 4),\n      row = _ref2[0],\n      col = _ref2[1],\n      rowEnd = _ref2[2],\n      colEnd = _ref2[3];\n\n  return row !== void 0 && row === rowEnd && col === colEnd;\n};\n\nTableView.prototype.isCellEdited = function () {\n  var activeEditor = this.instance.getActiveEditor();\n\n  return activeEditor && activeEditor.isOpened();\n};\n\nTableView.prototype.beforeRender = function (force, skipRender) {\n  if (force) {\n    // this.instance.forceFullRender = did Handsontable request full render?\n    this.instance.runHooks('beforeRender', this.instance.forceFullRender, skipRender);\n  }\n};\n\nTableView.prototype.onDraw = function (force) {\n  if (force) {\n    // this.instance.forceFullRender = did Handsontable request full render?\n    this.instance.runHooks('afterRender', this.instance.forceFullRender);\n  }\n};\n\nTableView.prototype.render = function () {\n  this.wt.draw(!this.instance.forceFullRender);\n  this.instance.forceFullRender = false;\n  this.instance.renderCall = false;\n};\n\n/**\n * Returns td object given coordinates\n *\n * @param {CellCoords} coords\n * @param {Boolean} topmost\n */\nTableView.prototype.getCellAtCoords = function (coords, topmost) {\n  var td = this.wt.getCell(coords, topmost);\n\n  if (td < 0) {\n    // there was an exit code (cell is out of bounds)\n    return null;\n  }\n\n  return td;\n};\n\n/**\n * Scroll viewport to selection.\n *\n * @param {CellCoords} coords\n */\nTableView.prototype.scrollViewport = function (coords) {\n  this.wt.scrollViewport(coords);\n};\n\n/**\n * Append row header to a TH element\n * @param row\n * @param TH\n */\nTableView.prototype.appendRowHeader = function (row, TH) {\n  if (TH.firstChild) {\n    var container = TH.firstChild;\n\n    if (!(0, _element.hasClass)(container, 'relative')) {\n      (0, _element.empty)(TH);\n      this.appendRowHeader(row, TH);\n\n      return;\n    }\n    this.updateCellHeader(container.querySelector('.rowHeader'), row, this.instance.getRowHeader);\n  } else {\n    var div = document.createElement('div');\n    var span = document.createElement('span');\n\n    div.className = 'relative';\n    span.className = 'rowHeader';\n    this.updateCellHeader(span, row, this.instance.getRowHeader);\n\n    div.appendChild(span);\n    TH.appendChild(div);\n  }\n\n  this.instance.runHooks('afterGetRowHeader', row, TH);\n};\n\n/**\n * Append column header to a TH element\n * @param col\n * @param TH\n */\nTableView.prototype.appendColHeader = function (col, TH) {\n  if (TH.firstChild) {\n    var container = TH.firstChild;\n\n    if ((0, _element.hasClass)(container, 'relative')) {\n      this.updateCellHeader(container.querySelector('.colHeader'), col, this.instance.getColHeader);\n    } else {\n      (0, _element.empty)(TH);\n      this.appendColHeader(col, TH);\n    }\n  } else {\n    var div = document.createElement('div');\n    var span = document.createElement('span');\n\n    div.className = 'relative';\n    span.className = 'colHeader';\n    this.updateCellHeader(span, col, this.instance.getColHeader);\n\n    div.appendChild(span);\n    TH.appendChild(div);\n  }\n\n  this.instance.runHooks('afterGetColHeader', col, TH);\n};\n\n/**\n * Update header cell content\n *\n * @since 0.15.0-beta4\n * @param {HTMLElement} element Element to update\n * @param {Number} index Row index or column index\n * @param {Function} content Function which should be returns content for this cell\n */\nTableView.prototype.updateCellHeader = function (element, index, content) {\n  var renderedIndex = index;\n  var parentOverlay = this.wt.wtOverlays.getParentOverlay(element) || this.wt;\n\n  // prevent wrong calculations from SampleGenerator\n  if (element.parentNode) {\n    if ((0, _element.hasClass)(element, 'colHeader')) {\n      renderedIndex = parentOverlay.wtTable.columnFilter.sourceToRendered(index);\n    } else if ((0, _element.hasClass)(element, 'rowHeader')) {\n      renderedIndex = parentOverlay.wtTable.rowFilter.sourceToRendered(index);\n    }\n  }\n\n  if (renderedIndex > -1) {\n    (0, _element.fastInnerHTML)(element, content(index));\n  } else {\n    // workaround for https://github.com/handsontable/handsontable/issues/1946\n    (0, _element.fastInnerText)(element, String.fromCharCode(160));\n    (0, _element.addClass)(element, 'cornerHeader');\n  }\n};\n\n/**\n * Given a element's left position relative to the viewport, returns maximum element width until the right\n * edge of the viewport (before scrollbar)\n *\n * @param {Number} leftOffset\n * @return {Number}\n */\nTableView.prototype.maximumVisibleElementWidth = function (leftOffset) {\n  var workspaceWidth = this.wt.wtViewport.getWorkspaceWidth();\n  var maxWidth = workspaceWidth - leftOffset;\n  return maxWidth > 0 ? maxWidth : 0;\n};\n\n/**\n * Given a element's top position relative to the viewport, returns maximum element height until the bottom\n * edge of the viewport (before scrollbar)\n *\n * @param {Number} topOffset\n * @return {Number}\n */\nTableView.prototype.maximumVisibleElementHeight = function (topOffset) {\n  var workspaceHeight = this.wt.wtViewport.getWorkspaceHeight();\n  var maxHeight = workspaceHeight - topOffset;\n  return maxHeight > 0 ? maxHeight : 0;\n};\n\nTableView.prototype.mainViewIsActive = function () {\n  return this.wt === this.activeWt;\n};\n\nTableView.prototype.destroy = function () {\n  this.wt.destroy();\n  this.eventManager.destroy();\n};\n\nexports.default = TableView;\n\n/***/ }),\n/* 268 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class DataSource\n * @private\n */\nvar DataSource = function () {\n  function DataSource(hotInstance) {\n    var dataSource = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\n    _classCallCheck(this, DataSource);\n\n    /**\n     * Instance of Handsontable.\n     *\n     * @type {Handsontable}\n     */\n    this.hot = hotInstance;\n    /**\n     * Data source\n     *\n     * @type {Array}\n     */\n    this.data = dataSource;\n    /**\n     * Type of data source.\n     *\n     * @type {String}\n     * @default 'array'\n     */\n    this.dataType = 'array';\n\n    this.colToProp = function () {};\n    this.propToCol = function () {};\n  }\n\n  /**\n   * Get all data.\n   *\n   * @param {Boolean} [toArray=false] If `true` return source data as an array of arrays even when source data was provided\n   *                                  in another format.\n   * @returns {Array}\n   */\n\n\n  _createClass(DataSource, [{\n    key: 'getData',\n    value: function getData() {\n      var toArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      var result = this.data;\n\n      if (toArray) {\n        result = this.getByRange({ row: 0, col: 0 }, { row: Math.max(this.countRows() - 1, 0), col: Math.max(this.countColumns() - 1, 0) }, true);\n      }\n\n      return result;\n    }\n\n    /**\n     * Set new data source.\n     *\n     * @param data {Array}\n     */\n\n  }, {\n    key: 'setData',\n    value: function setData(data) {\n      this.data = data;\n    }\n\n    /**\n     * Returns array of column values from the data source. `column` is the index of the row in the data source.\n     *\n     * @param {Number} column Visual column index.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getAtColumn',\n    value: function getAtColumn(column) {\n      var _this = this;\n\n      var result = [];\n\n      (0, _array.arrayEach)(this.data, function (row) {\n        var property = _this.colToProp(column);\n\n        if (typeof property === 'string') {\n          row = (0, _object.getProperty)(row, property);\n        } else {\n          row = row[property];\n        }\n        result.push(row);\n      });\n\n      return result;\n    }\n\n    /**\n     * Returns a single row of the data (array or object, depending on what you have). `row` is the index of the row in the data source.\n     *\n     * @param {Number} row Physical row index.\n     * @returns {Array|Object}\n     */\n\n  }, {\n    key: 'getAtRow',\n    value: function getAtRow(row) {\n      return this.data[row];\n    }\n\n    /**\n     * Returns a single value from the data.\n     *\n     * @param {Number} row Physical row index.\n     * @param {Number} column Visual column index.\n     * @returns {*}\n     */\n\n  }, {\n    key: 'getAtCell',\n    value: function getAtCell(row, column) {\n      var result = null;\n\n      var modifyRowData = this.hot.runHooks('modifyRowData', row);\n\n      var dataRow = isNaN(modifyRowData) ? modifyRowData : this.data[row];\n\n      if (dataRow) {\n        var prop = this.colToProp(column);\n\n        if (typeof prop === 'string') {\n          result = (0, _object.getProperty)(dataRow, prop);\n        } else if (typeof prop === 'function') {\n          result = prop(this.data.slice(row, row + 1)[0]);\n        } else {\n          result = dataRow[prop];\n        }\n      }\n\n      return result;\n    }\n\n    /**\n     * Returns source data by passed range.\n     *\n     * @param {Object} start Object with physical `row` and `col` keys (or visual column index, if data type is an array of objects).\n     * @param {Object} end Object with physical `row` and `col` keys (or visual column index, if data type is an array of objects).\n     * @param {Boolean} [toArray=false] If `true` return source data as an array of arrays even when source data was provided\n     *                                  in another format.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getByRange',\n    value: function getByRange(start, end) {\n      var _this2 = this;\n\n      var toArray = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      var startRow = Math.min(start.row, end.row);\n      var startCol = Math.min(start.col, end.col);\n      var endRow = Math.max(start.row, end.row);\n      var endCol = Math.max(start.col, end.col);\n      var result = [];\n\n      (0, _number.rangeEach)(startRow, endRow, function (currentRow) {\n        var row = _this2.getAtRow(currentRow);\n        var newRow = void 0;\n\n        if (_this2.dataType === 'array') {\n          newRow = row.slice(startCol, endCol + 1);\n        } else if (_this2.dataType === 'object') {\n          newRow = toArray ? [] : {};\n\n          (0, _number.rangeEach)(startCol, endCol, function (column) {\n            var prop = _this2.colToProp(column);\n\n            if (toArray) {\n              newRow.push(row[prop]);\n            } else {\n              newRow[prop] = row[prop];\n            }\n          });\n        }\n\n        result.push(newRow);\n      });\n\n      return result;\n    }\n\n    /**\n     * Count number of rows.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'countRows',\n    value: function countRows() {\n      return Array.isArray(this.data) ? this.data.length : 0;\n    }\n\n    /**\n     * Count number of columns.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'countColumns',\n    value: function countColumns() {\n      var result = 0;\n\n      if (Array.isArray(this.data)) {\n        if (this.dataType === 'array') {\n          result = this.data[0].length;\n        } else if (this.dataType === 'object') {\n          result = Object.keys(this.data[0]).length;\n        }\n      }\n\n      return result;\n    }\n\n    /**\n     * Destroy instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.data = null;\n      this.hot = null;\n    }\n  }]);\n\n  return DataSource;\n}();\n\nexports.default = DataSource;\n\n/***/ }),\n/* 269 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 15, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for English - United States language-country.\n                                                                                                                                                                                                                   */\n\n\nvar dictionary = (_dictionary = {\n  languageCode: 'en-US'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Insert row above'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Insert row below'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Insert column left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Insert column right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Remove row', 'Remove rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Remove column', 'Remove columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Undo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Redo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Read only'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Clear column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alignment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Center'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justify'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Middle'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Freeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Unfreeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Borders'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Remove border(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Add comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edit comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Delete comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Read-only comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Merge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Unmerge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copy'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Cut'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Insert child row'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Detach from parent'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Hide column', 'Hide columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Show column', 'Show columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Hide row', 'Hide rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Show row', 'Show rows']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'None'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Is empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Is not empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Is equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Is not equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Begins with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Ends with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contains'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Does not contain'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Greater than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Greater than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Less than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Less than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Is between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Is not between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'After'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Before'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Today'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Tomorrow'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Yesterday'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Blank cells'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filter by condition'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filter by value'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'And'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Or'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Select all'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Clear'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancel'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Search'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Value'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Second value'), _dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 270 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getPhraseFormatters = exports.registerPhraseFormatter = undefined;\nexports.register = register;\nexports.getAll = getAll;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _pluralize = __webpack_require__(271);\n\nvar _pluralize2 = _interopRequireDefault(_pluralize);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _staticRegister = (0, _staticRegister3.default)('phraseFormatters'),\n    registerGloballyPhraseFormatter = _staticRegister.register,\n    getGlobalPhraseFormatters = _staticRegister.getValues;\n\n/**\n * Register phrase formatter.\n *\n * @param {String} name Name of formatter.\n * @param {Function} formatterFn Function which will be applied on phrase propositions. It will transform them if it's possible.\n */\n\n\nfunction register(name, formatterFn) {\n  registerGloballyPhraseFormatter(name, formatterFn);\n}\n\n/**\n * Get all registered previously formatters.\n *\n * @returns {Array}\n */\nfunction getAll() {\n  return getGlobalPhraseFormatters();\n}\n\nexports.registerPhraseFormatter = register;\nexports.getPhraseFormatters = getAll;\n\n\nregister('pluralize', _pluralize2.default);\n\n/***/ }),\n/* 271 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = pluralize;\n/**\n * Try to choose plural form from available phrase propositions.\n *\n * @param {Array} phrasePropositions List of phrases propositions.\n * @param {number} pluralForm Number determining which phrase form should be used.\n *\n * @returns {String|Array} One particular phrase if it's possible, list of unchanged phrase propositions otherwise.\n */\nfunction pluralize(phrasePropositions, pluralForm) {\n  var isPluralizable = Array.isArray(phrasePropositions) && Number.isInteger(pluralForm);\n\n  if (isPluralizable) {\n    return phrasePropositions[pluralForm];\n  }\n\n  return phrasePropositions;\n};\n\n/***/ }),\n/* 272 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.Selection = exports.Highlight = exports.handleMouseEvent = undefined;\n\nvar _highlight = __webpack_require__(199);\n\nvar _highlight2 = _interopRequireDefault(_highlight);\n\nvar _selection = __webpack_require__(279);\n\nvar _selection2 = _interopRequireDefault(_selection);\n\nvar _mouseEventHandler = __webpack_require__(192);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.handleMouseEvent = _mouseEventHandler.handleMouseEvent;\nexports.Highlight = _highlight2.default;\nexports.Selection = _selection2.default;\n\n/***/ }),\n/* 273 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.createHighlight = undefined;\n\nvar _staticRegister2 = __webpack_require__(39);\n\nvar _staticRegister3 = _interopRequireDefault(_staticRegister2);\n\nvar _activeHeader = __webpack_require__(274);\n\nvar _activeHeader2 = _interopRequireDefault(_activeHeader);\n\nvar _area = __webpack_require__(275);\n\nvar _area2 = _interopRequireDefault(_area);\n\nvar _cell = __webpack_require__(276);\n\nvar _cell2 = _interopRequireDefault(_cell);\n\nvar _fill = __webpack_require__(277);\n\nvar _fill2 = _interopRequireDefault(_fill);\n\nvar _header = __webpack_require__(278);\n\nvar _header2 = _interopRequireDefault(_header);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint-disable import/prefer-default-export */\nvar _staticRegister = (0, _staticRegister3.default)('highlight/types'),\n    register = _staticRegister.register,\n    getItem = _staticRegister.getItem;\n\nregister('active-header', _activeHeader2.default);\nregister('area', _area2.default);\nregister('cell', _cell2.default);\nregister('fill', _fill2.default);\nregister('header', _header2.default);\n\nfunction createHighlight(highlightType, options) {\n  return getItem(highlightType)(options);\n}\n\nexports.createHighlight = createHighlight;\n\n/***/ }),\n/* 274 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * @return {Selection}\n */\nfunction createHighlight(_ref) {\n  var activeHeaderClassName = _ref.activeHeaderClassName;\n\n  var s = new _src.Selection({\n    highlightHeaderClassName: activeHeaderClassName\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 275 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * Creates the new instance of Selection responsible for highlighting area of the selected multiple cells.\n *\n * @return {Selection}\n */\nfunction createHighlight(_ref) {\n  var layerLevel = _ref.layerLevel,\n      areaCornerVisible = _ref.areaCornerVisible;\n\n  var s = new _src.Selection({\n    className: 'area',\n    markIntersections: true,\n    layerLevel: Math.min(layerLevel, 7),\n    border: {\n      width: 1,\n      color: '#4b89ff',\n      cornerVisible: areaCornerVisible\n    }\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 276 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * Creates the new instance of Selection responsible for highlighting currently selected cell. This type of selection\n * can present on the table only one at the time.\n *\n * @return {Selection}\n */\nfunction createHighlight(_ref) {\n  var cellCornerVisible = _ref.cellCornerVisible;\n\n  var s = new _src.Selection({\n    className: 'current',\n    border: {\n      width: 2,\n      color: '#4b89ff',\n      cornerVisible: cellCornerVisible\n    }\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 277 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * Creates the new instance of Selection, responsible for highlighting cells which are covered by fill handle\n * functionality. This type of selection can present on the table only one at the time.\n *\n * @return {Selection}\n */\nfunction createHighlight() {\n  var s = new _src.Selection({\n    className: 'fill',\n    border: {\n      width: 1,\n      color: '#ff0000'\n    }\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 278 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _src = __webpack_require__(4);\n\n/**\n * Creates the new instance of Selection, responsible for highlighting row and column headers. This type of selection\n * can occur multiple times.\n *\n * @return {Selection}\n */\nfunction createHighlight(_ref) {\n  var headerClassName = _ref.headerClassName,\n      rowClassName = _ref.rowClassName,\n      columnClassName = _ref.columnClassName;\n\n  var s = new _src.Selection({\n    className: 'highlight',\n    highlightHeaderClassName: headerClassName,\n    highlightRowClassName: rowClassName,\n    highlightColumnClassName: columnClassName\n  });\n\n  return s;\n}\n\nexports.default = createHighlight;\n\n/***/ }),\n/* 279 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['Unsupported format of the selection ranges was passed. To select cells pass \\n        the coordinates as an array of arrays ([[rowStart, columnStart/columnPropStart, rowEnd, columnEnd/columnPropEnd]]) \\n        or as an array of CellRange objects.'], ['Unsupported format of the selection ranges was passed. To select cells pass\\\\x20\\n        the coordinates as an array of arrays ([[rowStart, columnStart/columnPropStart, rowEnd, columnEnd/columnPropEnd]])\\\\x20\\n        or as an array of CellRange objects.']);\n\nvar _highlight = __webpack_require__(199);\n\nvar _highlight2 = _interopRequireDefault(_highlight);\n\nvar _range = __webpack_require__(280);\n\nvar _range2 = _interopRequireDefault(_range);\n\nvar _src = __webpack_require__(4);\n\nvar _keyStateObserver = __webpack_require__(198);\n\nvar _object = __webpack_require__(2);\n\nvar _mixed = __webpack_require__(16);\n\nvar _array = __webpack_require__(1);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nvar _transformation = __webpack_require__(281);\n\nvar _transformation2 = _interopRequireDefault(_transformation);\n\nvar _utils = __webpack_require__(91);\n\nvar _templateLiteralTag = __webpack_require__(41);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Selection\n * @util\n */\nvar Selection = function () {\n  function Selection(settings, tableProps) {\n    var _this = this;\n\n    _classCallCheck(this, Selection);\n\n    /**\n     * Handsontable settings instance.\n     *\n     * @type {GridSettings}\n     */\n    this.settings = settings;\n    /**\n     * An additional object with dynamically defined properties which describes table state.\n     *\n     * @type {Object}\n     */\n    this.tableProps = tableProps;\n    /**\n     * The flag which determines if the selection is in progress.\n     *\n     * @type {Boolean}\n     */\n    this.inProgress = false;\n    /**\n     * The flag indicates that selection was performed by clicking the corner overlay.\n     *\n     * @type {Boolean}\n     */\n    this.selectedByCorner = false;\n    /**\n     * The collection of the selection layer levels where the whole row was selected using the row header.\n     *\n     * @type {Set.<Number>}\n     */\n    this.selectedByRowHeader = new Set();\n    /**\n     * The collection of the selection layer levels where the whole column was selected using the column header.\n     *\n     * @type {Set.<Number>}\n     */\n    this.selectedByColumnHeader = new Set();\n    /**\n     * Selection data layer.\n     *\n     * @type {SelectionRange}\n     */\n    this.selectedRange = new _range2.default();\n    /**\n     * Visualization layer.\n     *\n     * @type {Highlight}\n     */\n    this.highlight = new _highlight2.default({\n      headerClassName: settings.currentHeaderClassName,\n      activeHeaderClassName: settings.activeHeaderClassName,\n      rowClassName: settings.currentRowClassName,\n      columnClassName: settings.currentColClassName,\n      disableHighlight: this.settings.disableVisualSelection,\n      cellCornerVisible: function cellCornerVisible() {\n        return _this.isCellCornerVisible.apply(_this, arguments);\n      },\n      areaCornerVisible: function areaCornerVisible() {\n        return _this.isAreaCornerVisible.apply(_this, arguments);\n      }\n    });\n    /**\n     * The module for modifying coordinates.\n     *\n     * @type {Transformation}\n     */\n    this.transformation = new _transformation2.default(this.selectedRange, {\n      countRows: function countRows() {\n        return _this.tableProps.countRows();\n      },\n      countCols: function countCols() {\n        return _this.tableProps.countCols();\n      },\n      fixedRowsBottom: function fixedRowsBottom() {\n        return settings.fixedRowsBottom;\n      },\n      minSpareRows: function minSpareRows() {\n        return settings.minSpareRows;\n      },\n      minSpareCols: function minSpareCols() {\n        return settings.minSpareCols;\n      },\n      autoWrapRow: function autoWrapRow() {\n        return settings.autoWrapRow;\n      },\n      autoWrapCol: function autoWrapCol() {\n        return settings.autoWrapCol;\n      }\n    });\n\n    this.transformation.addLocalHook('beforeTransformStart', function () {\n      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['beforeModifyTransformStart'].concat(args));\n    });\n    this.transformation.addLocalHook('afterTransformStart', function () {\n      for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['afterModifyTransformStart'].concat(args));\n    });\n    this.transformation.addLocalHook('beforeTransformEnd', function () {\n      for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['beforeModifyTransformEnd'].concat(args));\n    });\n    this.transformation.addLocalHook('afterTransformEnd', function () {\n      for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        args[_key4] = arguments[_key4];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['afterModifyTransformEnd'].concat(args));\n    });\n    this.transformation.addLocalHook('insertRowRequire', function () {\n      for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n        args[_key5] = arguments[_key5];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['insertRowRequire'].concat(args));\n    });\n    this.transformation.addLocalHook('insertColRequire', function () {\n      for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n        args[_key6] = arguments[_key6];\n      }\n\n      return _this.runLocalHooks.apply(_this, ['insertColRequire'].concat(args));\n    });\n  }\n\n  /**\n   * Get data layer for current selection.\n   *\n   * @return {SelectionRange}\n   */\n\n\n  _createClass(Selection, [{\n    key: 'getSelectedRange',\n    value: function getSelectedRange() {\n      return this.selectedRange;\n    }\n\n    /**\n     * Indicate that selection process began. It sets internaly `.inProgress` property to `true`.\n     */\n\n  }, {\n    key: 'begin',\n    value: function begin() {\n      this.inProgress = true;\n    }\n\n    /**\n     * Indicate that selection process finished. It sets internaly `.inProgress` property to `false`.\n     */\n\n  }, {\n    key: 'finish',\n    value: function finish() {\n      this.runLocalHooks('afterSelectionFinished', Array.from(this.selectedRange));\n      this.inProgress = false;\n    }\n\n    /**\n     * Check if the process of selecting the cell/cells is in progress.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isInProgress',\n    value: function isInProgress() {\n      return this.inProgress;\n    }\n\n    /**\n     * Starts selection range on given coordinate object.\n     *\n     * @param {CellCoords} coords Visual coords.\n     * @param {Boolean} [multipleSelection] If `true`, selection will be worked in 'multiple' mode. This option works\n     *                                      only when 'selectionMode' is set as 'multiple'. If the argument is not defined\n     *                                      the default trigger will be used (isPressedCtrlKey() helper).\n     * @param {Boolean} [fragment=false] If `true`, the selection will be treated as a partial selection where the\n     *                                   `setRangeEnd` method won't be called on every `setRangeStart` call.\n     */\n\n  }, {\n    key: 'setRangeStart',\n    value: function setRangeStart(coords, multipleSelection) {\n      var fragment = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      var isMultipleMode = this.settings.selectionMode === 'multiple';\n      var isMultipleSelection = (0, _mixed.isUndefined)(multipleSelection) ? (0, _keyStateObserver.isPressedCtrlKey)() : multipleSelection;\n      var isRowNegative = coords.row < 0;\n      var isColumnNegative = coords.col < 0;\n      var selectedByCorner = isRowNegative && isColumnNegative;\n\n      if (isRowNegative) {\n        coords.row = 0;\n      }\n      if (isColumnNegative) {\n        coords.col = 0;\n      }\n\n      this.selectedByCorner = selectedByCorner;\n      this.runLocalHooks('beforeSetRangeStart' + (fragment ? 'Only' : ''), coords);\n\n      if (!isMultipleMode || isMultipleMode && !isMultipleSelection && (0, _mixed.isUndefined)(multipleSelection)) {\n        this.selectedRange.clear();\n      }\n\n      this.selectedRange.add(coords);\n\n      if (this.getLayerLevel() === 0) {\n        this.selectedByRowHeader.clear();\n        this.selectedByColumnHeader.clear();\n      }\n\n      if (!selectedByCorner && isColumnNegative) {\n        this.selectedByRowHeader.add(this.getLayerLevel());\n      }\n      if (!selectedByCorner && isRowNegative) {\n        this.selectedByColumnHeader.add(this.getLayerLevel());\n      }\n\n      if (!fragment) {\n        this.setRangeEnd(coords);\n      }\n    }\n\n    /**\n     * Starts selection range on given coordinate object.\n     *\n     * @param {CellCoords} coords Visual coords.\n     * @param {Boolean} [multipleSelection] If `true`, selection will be worked in 'multiple' mode. This option works\n     *                                      only when 'selectionMode' is set as 'multiple'. If the argument is not defined\n     *                                      the default trigger will be used (isPressedCtrlKey() helper).\n     */\n\n  }, {\n    key: 'setRangeStartOnly',\n    value: function setRangeStartOnly(coords, multipleSelection) {\n      this.setRangeStart(coords, multipleSelection, true);\n    }\n\n    /**\n     * Ends selection range on given coordinate object.\n     *\n     * @param {CellCoords} coords Visual coords.\n     */\n\n  }, {\n    key: 'setRangeEnd',\n    value: function setRangeEnd(coords) {\n      if (this.selectedRange.isEmpty()) {\n        return;\n      }\n\n      this.runLocalHooks('beforeSetRangeEnd', coords);\n      this.begin();\n\n      var cellRange = this.selectedRange.current();\n\n      if (this.settings.selectionMode !== 'single') {\n        cellRange.setTo(new _src.CellCoords(coords.row, coords.col));\n      }\n\n      // Set up current selection.\n      this.highlight.getCell().clear();\n\n      if (this.highlight.isEnabledFor(_highlight.CELL_TYPE)) {\n        this.highlight.getCell().add(this.selectedRange.current().highlight);\n      }\n\n      var layerLevel = this.getLayerLevel();\n\n      // If the next layer level is lower than previous then clear all area and header highlights. This is the\n      // indication that the new selection is performing.\n      if (layerLevel < this.highlight.layerLevel) {\n        (0, _array.arrayEach)(this.highlight.getAreas(), function (highlight) {\n          return void highlight.clear();\n        });\n        (0, _array.arrayEach)(this.highlight.getHeaders(), function (highlight) {\n          return void highlight.clear();\n        });\n        (0, _array.arrayEach)(this.highlight.getActiveHeaders(), function (highlight) {\n          return void highlight.clear();\n        });\n      }\n\n      this.highlight.useLayerLevel(layerLevel);\n\n      var areaHighlight = this.highlight.createOrGetArea();\n      var headerHighlight = this.highlight.createOrGetHeader();\n      var activeHeaderHighlight = this.highlight.createOrGetActiveHeader();\n\n      areaHighlight.clear();\n      headerHighlight.clear();\n      activeHeaderHighlight.clear();\n\n      if (this.highlight.isEnabledFor(_highlight.AREA_TYPE) && (this.isMultiple() || layerLevel >= 1)) {\n        areaHighlight.add(cellRange.from).add(cellRange.to);\n\n        if (layerLevel === 1) {\n          // For single cell selection in the same layer, we do not create area selection to prevent blue background.\n          // When non-consecutive selection is performed we have to add that missing area selection to the previous layer\n          // based on previous coordinates. It only occurs when the previous selection wasn't select multiple cells.\n          this.highlight.useLayerLevel(layerLevel - 1).createOrGetArea().add(this.selectedRange.previous().from);\n\n          this.highlight.useLayerLevel(layerLevel);\n        }\n      }\n\n      if (this.highlight.isEnabledFor(_highlight.HEADER_TYPE)) {\n        if (this.settings.selectionMode === 'single') {\n          headerHighlight.add(cellRange.highlight);\n        } else {\n          headerHighlight.add(cellRange.from).add(cellRange.to);\n        }\n      }\n\n      if (this.isSelectedByRowHeader()) {\n        var isRowSelected = this.tableProps.countCols() === cellRange.getWidth();\n\n        // Make sure that the whole row is selected (in case where selectionMode is set to 'single')\n        if (isRowSelected) {\n          activeHeaderHighlight.add(new _src.CellCoords(cellRange.from.row, -1)).add(new _src.CellCoords(cellRange.to.row, -1));\n        }\n      }\n\n      if (this.isSelectedByColumnHeader()) {\n        var isColumnSelected = this.tableProps.countRows() === cellRange.getHeight();\n\n        // Make sure that the whole column is selected (in case where selectionMode is set to 'single')\n        if (isColumnSelected) {\n          activeHeaderHighlight.add(new _src.CellCoords(-1, cellRange.from.col)).add(new _src.CellCoords(-1, cellRange.to.col));\n        }\n      }\n\n      this.runLocalHooks('afterSetRangeEnd', coords);\n    }\n\n    /**\n     * Returns information if we have a multiselection. This method check multiselection only on the latest layer of\n     * the selection.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isMultiple',\n    value: function isMultiple() {\n      var isMultipleListener = (0, _object.createObjectPropListener)(!this.selectedRange.current().isSingle());\n\n      this.runLocalHooks('afterIsMultipleSelection', isMultipleListener);\n\n      return isMultipleListener.value;\n    }\n\n    /**\n     * Selects cell relative to the current cell (if possible).\n     *\n     * @param {Number} rowDelta Rows number to move, value can be passed as negative number.\n     * @param {Number} colDelta Columns number to move, value can be passed as negative number.\n     * @param {Boolean} force If `true` the new rows/columns will be created if necessary. Otherwise, row/column will\n     *                        be created according to `minSpareRows/minSpareCols` settings of Handsontable.\n     */\n\n  }, {\n    key: 'transformStart',\n    value: function transformStart(rowDelta, colDelta, force) {\n      this.setRangeStart(this.transformation.transformStart(rowDelta, colDelta, force));\n    }\n\n    /**\n     * Sets selection end cell relative to the current selection end cell (if possible).\n     *\n     * @param {Number} rowDelta Rows number to move, value can be passed as negative number.\n     * @param {Number} colDelta Columns number to move, value can be passed as negative number.\n     */\n\n  }, {\n    key: 'transformEnd',\n    value: function transformEnd(rowDelta, colDelta) {\n      this.setRangeEnd(this.transformation.transformEnd(rowDelta, colDelta));\n    }\n\n    /**\n     * Returns currently used layer level.\n     *\n     * @return {Number} Returns layer level starting from 0. If no selection was added to the table -1 is returned.\n     */\n\n  }, {\n    key: 'getLayerLevel',\n    value: function getLayerLevel() {\n      return this.selectedRange.size() - 1;\n    }\n\n    /**\n     * Returns `true` if currently there is a selection on the screen, `false` otherwise.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSelected',\n    value: function isSelected() {\n      return !this.selectedRange.isEmpty();\n    }\n\n    /**\n     * Returns `true` if the selection was applied by clicking to the row header. If the `layerLevel`\n     * argument is passed then only that layer will be checked. Otherwise, it checks if any row header\n     * was clicked on any selection layer level.\n     *\n     * @param {Number} [layerLevel=this.getLayerLevel()] Selection layer level to check.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSelectedByRowHeader',\n    value: function isSelectedByRowHeader() {\n      var layerLevel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getLayerLevel();\n\n      return layerLevel === -1 ? this.selectedByRowHeader.size > 0 : this.selectedByRowHeader.has(layerLevel);\n    }\n\n    /**\n     * Returns `true` if the selection was applied by clicking to the column header. If the `layerLevel`\n     * argument is passed then only that layer will be checked. Otherwise, it checks if any column header\n     * was clicked on any selection layer level.\n     *\n     * @param {Number} [layerLevel=this.getLayerLevel()] Selection layer level to check.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSelectedByColumnHeader',\n    value: function isSelectedByColumnHeader() {\n      var layerLevel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getLayerLevel();\n\n      return layerLevel === -1 ? this.selectedByColumnHeader.size > 0 : this.selectedByColumnHeader.has(layerLevel);\n    }\n\n    /**\n     * Returns `true` if the selection was applied by clicking on the row or column header on any layer level.\n     *\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSelectedByAnyHeader',\n    value: function isSelectedByAnyHeader() {\n      return this.isSelectedByRowHeader(-1) || this.isSelectedByColumnHeader(-1);\n    }\n\n    /**\n     * Returns `true` if the selection was applied by clicking on the left-top corner overlay.\n     *\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isSelectedByCorner',\n    value: function isSelectedByCorner() {\n      return this.selectedByCorner;\n    }\n\n    /**\n     * Returns `true` if coords is within selection coords. This method iterates through all selection layers to check if\n     * the coords object is within selection range.\n     *\n     * @param {CellCoords} coords The CellCoords instance with defined visual coordinates.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'inInSelection',\n    value: function inInSelection(coords) {\n      return this.selectedRange.includes(coords);\n    }\n\n    /**\n     * Returns `true` if the cell corner should be visible.\n     *\n     * @private\n     * @return {Boolean} `true` if the corner element has to be visible, `false` otherwise.\n     */\n\n  }, {\n    key: 'isCellCornerVisible',\n    value: function isCellCornerVisible() {\n      return this.settings.fillHandle && !this.tableProps.isEditorOpened() && !this.isMultiple();\n    }\n\n    /**\n     * Returns `true` if the area corner should be visible.\n     *\n     * @param {Number} layerLevel The layer level.\n     * @return {Boolean} `true` if the corner element has to be visible, `false` otherwise.\n     */\n\n  }, {\n    key: 'isAreaCornerVisible',\n    value: function isAreaCornerVisible(layerLevel) {\n      if (Number.isInteger(layerLevel) && layerLevel !== this.getLayerLevel()) {\n        return false;\n      }\n\n      return this.settings.fillHandle && !this.tableProps.isEditorOpened() && this.isMultiple();\n    }\n\n    /**\n     * Clear the selection by resetting the collected ranges and highlights.\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.selectedRange.clear();\n      this.highlight.clear();\n    }\n\n    /**\n     * Deselects all selected cells.\n     */\n\n  }, {\n    key: 'deselect',\n    value: function deselect() {\n      if (!this.isSelected()) {\n        return;\n      }\n\n      this.inProgress = false;\n      this.clear();\n      this.runLocalHooks('afterDeselect');\n    }\n\n    /**\n     * Select all cells.\n     */\n\n  }, {\n    key: 'selectAll',\n    value: function selectAll() {\n      this.clear();\n      this.setRangeStart(new _src.CellCoords(-1, -1));\n      this.selectedByRowHeader.add(this.getLayerLevel());\n      this.selectedByColumnHeader.add(this.getLayerLevel());\n      this.setRangeEnd(new _src.CellCoords(this.tableProps.countRows() - 1, this.tableProps.countCols() - 1));\n    }\n\n    /**\n     * Make multiple, non-contiguous selection specified by `row` and `column` values or a range of cells\n     * finishing at `endRow`, `endColumn`. The method supports two input formats, first as an array of arrays such\n     * as `[[rowStart, columnStart, rowEnd, columnEnd]]` and second format as an array of CellRange objects.\n     * If the passed ranges have another format the exception will be thrown.\n     *\n     * @param {Array[]|CellRange[]} selectionRanges The coordinates which define what the cells should be selected.\n     * @return {Boolean} Returns `true` if selection was successful, `false` otherwise.\n     */\n\n  }, {\n    key: 'selectCells',\n    value: function selectCells(selectionRanges) {\n      var _this2 = this;\n\n      var selectionType = (0, _utils.detectSelectionType)(selectionRanges);\n\n      if (selectionType === _utils.SELECTION_TYPE_EMPTY) {\n        return false;\n      } else if (selectionType === _utils.SELECTION_TYPE_UNRECOGNIZED) {\n        throw new Error((0, _templateLiteralTag.toSingleLine)(_templateObject));\n      }\n\n      var selectionSchemaNormalizer = (0, _utils.normalizeSelectionFactory)(selectionType, {\n        propToCol: function propToCol(prop) {\n          return _this2.tableProps.propToCol(prop);\n        },\n        keepDirection: true\n      });\n      var countRows = this.tableProps.countRows();\n      var countCols = this.tableProps.countCols();\n\n      // Check if every layer of the coordinates are valid.\n      var isValid = !selectionRanges.some(function (selection) {\n        var _selectionSchemaNorma = selectionSchemaNormalizer(selection),\n            _selectionSchemaNorma2 = _slicedToArray(_selectionSchemaNorma, 4),\n            rowStart = _selectionSchemaNorma2[0],\n            columnStart = _selectionSchemaNorma2[1],\n            rowEnd = _selectionSchemaNorma2[2],\n            columnEnd = _selectionSchemaNorma2[3];\n\n        var _isValid = (0, _utils.isValidCoord)(rowStart, countRows) && (0, _utils.isValidCoord)(columnStart, countCols) && (0, _utils.isValidCoord)(rowEnd, countRows) && (0, _utils.isValidCoord)(columnEnd, countCols);\n\n        return !_isValid;\n      });\n\n      if (isValid) {\n        this.clear();\n\n        (0, _array.arrayEach)(selectionRanges, function (selection) {\n          var _selectionSchemaNorma3 = selectionSchemaNormalizer(selection),\n              _selectionSchemaNorma4 = _slicedToArray(_selectionSchemaNorma3, 4),\n              rowStart = _selectionSchemaNorma4[0],\n              columnStart = _selectionSchemaNorma4[1],\n              rowEnd = _selectionSchemaNorma4[2],\n              columnEnd = _selectionSchemaNorma4[3];\n\n          _this2.setRangeStartOnly(new _src.CellCoords(rowStart, columnStart), false);\n          _this2.setRangeEnd(new _src.CellCoords(rowEnd, columnEnd));\n          _this2.finish();\n        });\n      }\n\n      return isValid;\n    }\n\n    /**\n     * Select column specified by `startColumn` visual index or column property or a range of columns finishing at `endColumn`.\n     *\n     * @param {Number|String} startColumn Visual column index or column property from which the selection starts.\n     * @param {Number|String} [endColumn] Visual column index or column property from to the selection finishes.\n     * @returns {Boolean} Returns `true` if selection was successful, `false` otherwise.\n     */\n\n  }, {\n    key: 'selectColumns',\n    value: function selectColumns(startColumn) {\n      var endColumn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startColumn;\n\n      startColumn = typeof startColumn === 'string' ? this.tableProps.propToCol(startColumn) : startColumn;\n      endColumn = typeof endColumn === 'string' ? this.tableProps.propToCol(endColumn) : endColumn;\n\n      var countCols = this.tableProps.countCols();\n      var isValid = (0, _utils.isValidCoord)(startColumn, countCols) && (0, _utils.isValidCoord)(endColumn, countCols);\n\n      if (isValid) {\n        this.setRangeStartOnly(new _src.CellCoords(-1, startColumn));\n        this.setRangeEnd(new _src.CellCoords(this.tableProps.countRows() - 1, endColumn));\n        this.finish();\n      }\n\n      return isValid;\n    }\n\n    /**\n     * Select row specified by `startRow` visual index or a range of rows finishing at `endRow`.\n     *\n     * @param {Number} startRow Visual row index from which the selection starts.\n     * @param {Number} [endRow] Visual row index from to the selection finishes.\n     * @returns {Boolean} Returns `true` if selection was successful, `false` otherwise.\n     */\n\n  }, {\n    key: 'selectRows',\n    value: function selectRows(startRow) {\n      var endRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startRow;\n\n      var countRows = this.tableProps.countRows();\n      var isValid = (0, _utils.isValidCoord)(startRow, countRows) && (0, _utils.isValidCoord)(endRow, countRows);\n\n      if (isValid) {\n        this.setRangeStartOnly(new _src.CellCoords(startRow, -1));\n        this.setRangeEnd(new _src.CellCoords(endRow, this.tableProps.countCols() - 1));\n        this.finish();\n      }\n\n      return isValid;\n    }\n  }]);\n\n  return Selection;\n}();\n\n(0, _object.mixin)(Selection, _localHooks2.default);\n\nexports.default = Selection;\n\n/***/ }),\n/* 280 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _src = __webpack_require__(4);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * The SelectionRange class is a simple CellRanges collection designed for easy manipulation of the multiple\n * consecutive and non-consecutive selections.\n *\n * @class SelectionRange\n * @util\n */\nvar SelectionRange = function () {\n  function SelectionRange() {\n    _classCallCheck(this, SelectionRange);\n\n    /**\n     * List of all CellRanges added to the class instance.\n     *\n     * @type {CellRange[]}\n     */\n    this.ranges = [];\n  }\n\n  /**\n   * Check if selected range is empty.\n   *\n   * @return {Boolean}\n   */\n\n\n  _createClass(SelectionRange, [{\n    key: 'isEmpty',\n    value: function isEmpty() {\n      return this.size() === 0;\n    }\n\n    /**\n     * Set coordinates to the class instance. It clears all previously added coordinates and push `coords`\n     * to the collection.\n     *\n     * @param {CellCoords} coords The CellCoords instance with defined visual coordinates.\n     * @returns {SelectionRange}\n     */\n\n  }, {\n    key: 'set',\n    value: function set(coords) {\n      this.clear();\n      this.ranges.push(new _src.CellRange(coords));\n\n      return this;\n    }\n\n    /**\n     * Add coordinates to the class instance. The new coordinates are added to the end of the range collection.\n     *\n     * @param {CellCoords} coords The CellCoords instance with defined visual coordinates.\n     * @returns {SelectionRange}\n     */\n\n  }, {\n    key: 'add',\n    value: function add(coords) {\n      this.ranges.push(new _src.CellRange(coords));\n\n      return this;\n    }\n\n    /**\n     * Get last added coordinates from ranges, it returns a CellRange instance.\n     *\n     * @return {CellRange|undefined}\n     */\n\n  }, {\n    key: 'current',\n    value: function current() {\n      return this.peekByIndex(0);\n    }\n\n    /**\n     * Get previously added coordinates from ranges, it returns a CellRange instance.\n     *\n     * @return {CellRange|undefined}\n     */\n\n  }, {\n    key: 'previous',\n    value: function previous() {\n      return this.peekByIndex(-1);\n    }\n\n    /**\n     * Returns `true` if coords is within selection coords. This method iterates through all selection layers to check if\n     * the coords object is within selection range.\n     *\n     * @param {CellCoords} coords The CellCoords instance with defined visual coordinates.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'includes',\n    value: function includes(coords) {\n      return this.ranges.some(function (cellRange) {\n        return cellRange.includes(coords);\n      });\n    }\n\n    /**\n     * Clear collection.\n     *\n     * @return {SelectionRange}\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      this.ranges.length = 0;\n\n      return this;\n    }\n\n    /**\n     * Get count of added all coordinates added to the selection.\n     *\n     * @return {Number}\n     */\n\n  }, {\n    key: 'size',\n    value: function size() {\n      return this.ranges.length;\n    }\n\n    /**\n     * Peek the coordinates based on the offset where that coordinate resides in the collection.\n     *\n     * @param {Number} [offset=0] An offset where the coordinate will be retrieved from.\n     * @return {CellRange|undefined}\n     */\n\n  }, {\n    key: 'peekByIndex',\n    value: function peekByIndex() {\n      var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n      var rangeIndex = this.size() + offset - 1;\n      var cellRange = void 0;\n\n      if (rangeIndex >= 0) {\n        cellRange = this.ranges[rangeIndex];\n      }\n\n      return cellRange;\n    }\n  }, {\n    key: Symbol.iterator,\n    value: function value() {\n      return this.ranges[Symbol.iterator]();\n    }\n  }]);\n\n  return SelectionRange;\n}();\n\nexports.default = SelectionRange;\n\n/***/ }),\n/* 281 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _src = __webpack_require__(4);\n\nvar _object = __webpack_require__(2);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * The Transformation class implements algorithms for transforming coordinates based on current settings\n * passed to the Handsontable.\n *\n * Transformation is always applied relative to the current selection.\n *\n * @class Transformation\n * @util\n */\nvar Transformation = function () {\n  function Transformation(range, options) {\n    _classCallCheck(this, Transformation);\n\n    /**\n     * Instance of the SelectionRange, holder for coordinates applied to the table.\n     *\n     * @type {SelectionRange}\n     */\n    this.range = range;\n    /**\n     * Additional options which define the state of the settings which can infer transformation.\n     *\n     * @type {Object}\n     */\n    this.options = options;\n  }\n\n  /**\n   * Selects cell relative to current cell (if possible).\n   *\n   * @param {Number} rowDelta Rows number to move, value can be passed as negative number.\n   * @param {Number} colDelta Columns number to move, value can be passed as negative number.\n   * @param {Boolean} force If `true` the new rows/columns will be created if necessary. Otherwise, row/column will\n   *                        be created according to `minSpareRows/minSpareCols` settings of Handsontable.\n   * @returns {CellCoords}\n   */\n\n\n  _createClass(Transformation, [{\n    key: 'transformStart',\n    value: function transformStart(rowDelta, colDelta, force) {\n      var delta = new _src.CellCoords(rowDelta, colDelta);\n\n      this.runLocalHooks('beforeTransformStart', delta);\n\n      var totalRows = this.options.countRows();\n      var totalCols = this.options.countCols();\n      var fixedRowsBottom = this.options.fixedRowsBottom();\n      var minSpareRows = this.options.minSpareRows();\n      var minSpareCols = this.options.minSpareCols();\n      var autoWrapRow = this.options.autoWrapRow();\n      var autoWrapCol = this.options.autoWrapCol();\n      var highlightCoords = this.range.current().highlight;\n\n      if (highlightCoords.row + rowDelta > totalRows - 1) {\n        if (force && minSpareRows > 0 && !(fixedRowsBottom && highlightCoords.row >= totalRows - fixedRowsBottom - 1)) {\n          this.runLocalHooks('insertRowRequire', totalRows);\n          totalRows = this.options.countRows();\n        } else if (autoWrapCol) {\n          delta.row = 1 - totalRows;\n          delta.col = highlightCoords.col + delta.col == totalCols - 1 ? 1 - totalCols : 1;\n        }\n      } else if (autoWrapCol && highlightCoords.row + delta.row < 0 && highlightCoords.col + delta.col >= 0) {\n        delta.row = totalRows - 1;\n        delta.col = highlightCoords.col + delta.col == 0 ? totalCols - 1 : -1;\n      }\n\n      if (highlightCoords.col + delta.col > totalCols - 1) {\n        if (force && minSpareCols > 0) {\n          this.runLocalHooks('insertColRequire', totalRows);\n          totalCols = this.options.countCols();\n        } else if (autoWrapRow) {\n          delta.row = highlightCoords.row + delta.row == totalRows - 1 ? 1 - totalRows : 1;\n          delta.col = 1 - totalCols;\n        }\n      } else if (autoWrapRow && highlightCoords.col + delta.col < 0 && highlightCoords.row + delta.row >= 0) {\n        delta.row = highlightCoords.row + delta.row == 0 ? totalRows - 1 : -1;\n        delta.col = totalCols - 1;\n      }\n\n      var coords = new _src.CellCoords(highlightCoords.row + delta.row, highlightCoords.col + delta.col);\n      var rowTransformDir = 0;\n      var colTransformDir = 0;\n\n      if (coords.row < 0) {\n        rowTransformDir = -1;\n        coords.row = 0;\n      } else if (coords.row > 0 && coords.row >= totalRows) {\n        rowTransformDir = 1;\n        coords.row = totalRows - 1;\n      }\n\n      if (coords.col < 0) {\n        colTransformDir = -1;\n        coords.col = 0;\n      } else if (coords.col > 0 && coords.col >= totalCols) {\n        colTransformDir = 1;\n        coords.col = totalCols - 1;\n      }\n      this.runLocalHooks('afterTransformStart', coords, rowTransformDir, colTransformDir);\n\n      return coords;\n    }\n\n    /**\n     * Sets selection end cell relative to current selection end cell (if possible).\n     *\n     * @param {Number} rowDelta Rows number to move, value can be passed as negative number.\n     * @param {Number} colDelta Columns number to move, value can be passed as negative number.\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'transformEnd',\n    value: function transformEnd(rowDelta, colDelta) {\n      var delta = new _src.CellCoords(rowDelta, colDelta);\n\n      this.runLocalHooks('beforeTransformEnd', delta);\n\n      var totalRows = this.options.countRows();\n      var totalCols = this.options.countCols();\n      var cellRange = this.range.current();\n      var coords = new _src.CellCoords(cellRange.to.row + delta.row, cellRange.to.col + delta.col);\n      var rowTransformDir = 0;\n      var colTransformDir = 0;\n\n      if (coords.row < 0) {\n        rowTransformDir = -1;\n        coords.row = 0;\n      } else if (coords.row > 0 && coords.row >= totalRows) {\n        rowTransformDir = 1;\n        coords.row = totalRows - 1;\n      }\n\n      if (coords.col < 0) {\n        colTransformDir = -1;\n        coords.col = 0;\n      } else if (coords.col > 0 && coords.col >= totalCols) {\n        colTransformDir = 1;\n        coords.col = totalCols - 1;\n      }\n      this.runLocalHooks('afterTransformEnd', coords, rowTransformDir, colTransformDir);\n\n      return coords;\n    }\n  }]);\n\n  return Transformation;\n}();\n\n(0, _object.mixin)(Transformation, _localHooks2.default);\n\nexports.default = Transformation;\n\n/***/ }),\n/* 282 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = jQueryWrapper;\nfunction jQueryWrapper(Handsontable) {\n  var jQuery = typeof window === 'undefined' ? false : window.jQuery;\n\n  if (!jQuery) {\n    return;\n  }\n\n  jQuery.fn.handsontable = function (action) {\n    var $this = this.first(); // Use only first element from list\n    var instance = $this.data('handsontable');\n\n    // Init case\n    if (typeof action !== 'string') {\n      var userSettings = action || {};\n\n      if (instance) {\n        instance.updateSettings(userSettings);\n      } else {\n        instance = new Handsontable.Core($this[0], userSettings);\n        $this.data('handsontable', instance);\n        instance.init();\n      }\n\n      return $this;\n    }\n\n    // Action case\n    var args = [];\n    var output = void 0;\n\n    if (arguments.length > 1) {\n      for (var i = 1, ilen = arguments.length; i < ilen; i++) {\n        args.push(arguments[i]);\n      }\n    }\n\n    if (instance) {\n      if (typeof instance[action] !== 'undefined') {\n        output = instance[action].apply(instance, args);\n\n        if (action === 'destroy') {\n          $this.removeData();\n        }\n      } else {\n        throw new Error('Handsontable do not provide action: ' + action);\n      }\n    }\n\n    return output;\n  };\n};\n\n/***/ }),\n/* 283 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.Base = exports.UndoRedo = exports.TouchScroll = exports.Search = exports.PersistentState = exports.ObserveChanges = exports.MultipleSelectionHandles = exports.MergeCells = exports.ManualRowResize = exports.ManualRowMove = exports.ManualColumnResize = exports.ManualColumnMove = exports.ManualColumnFreeze = exports.DragToScroll = exports.CustomBorders = exports.CopyPaste = exports.ContextMenu = exports.Comments = exports.ColumnSorting = exports.AutoRowSize = exports.AutoFill = exports.AutoColumnSize = undefined;\n\nvar _persistentState = __webpack_require__(284);\n\nvar _persistentState2 = _interopRequireDefault(_persistentState);\n\nvar _autoColumnSize = __webpack_require__(286);\n\nvar _autoColumnSize2 = _interopRequireDefault(_autoColumnSize);\n\nvar _autofill = __webpack_require__(287);\n\nvar _autofill2 = _interopRequireDefault(_autofill);\n\nvar _autoRowSize = __webpack_require__(289);\n\nvar _autoRowSize2 = _interopRequireDefault(_autoRowSize);\n\nvar _columnSorting = __webpack_require__(290);\n\nvar _columnSorting2 = _interopRequireDefault(_columnSorting);\n\nvar _comments = __webpack_require__(293);\n\nvar _comments2 = _interopRequireDefault(_comments);\n\nvar _contextMenu = __webpack_require__(297);\n\nvar _contextMenu2 = _interopRequireDefault(_contextMenu);\n\nvar _copyPaste = __webpack_require__(314);\n\nvar _copyPaste2 = _interopRequireDefault(_copyPaste);\n\nvar _customBorders = __webpack_require__(321);\n\nvar _customBorders2 = _interopRequireDefault(_customBorders);\n\nvar _dragToScroll = __webpack_require__(327);\n\nvar _dragToScroll2 = _interopRequireDefault(_dragToScroll);\n\nvar _manualColumnFreeze = __webpack_require__(328);\n\nvar _manualColumnFreeze2 = _interopRequireDefault(_manualColumnFreeze);\n\nvar _manualColumnMove = __webpack_require__(332);\n\nvar _manualColumnMove2 = _interopRequireDefault(_manualColumnMove);\n\nvar _manualColumnResize = __webpack_require__(337);\n\nvar _manualColumnResize2 = _interopRequireDefault(_manualColumnResize);\n\nvar _manualRowMove = __webpack_require__(338);\n\nvar _manualRowMove2 = _interopRequireDefault(_manualRowMove);\n\nvar _manualRowResize = __webpack_require__(343);\n\nvar _manualRowResize2 = _interopRequireDefault(_manualRowResize);\n\nvar _mergeCells = __webpack_require__(344);\n\nvar _mergeCells2 = _interopRequireDefault(_mergeCells);\n\nvar _multipleSelectionHandles = __webpack_require__(350);\n\nvar _multipleSelectionHandles2 = _interopRequireDefault(_multipleSelectionHandles);\n\nvar _observeChanges = __webpack_require__(351);\n\nvar _observeChanges2 = _interopRequireDefault(_observeChanges);\n\nvar _search = __webpack_require__(354);\n\nvar _search2 = _interopRequireDefault(_search);\n\nvar _touchScroll = __webpack_require__(355);\n\nvar _touchScroll2 = _interopRequireDefault(_touchScroll);\n\nvar _undoRedo = __webpack_require__(356);\n\nvar _undoRedo2 = _interopRequireDefault(_undoRedo);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.AutoColumnSize = _autoColumnSize2.default;\nexports.AutoFill = _autofill2.default;\nexports.AutoRowSize = _autoRowSize2.default;\nexports.ColumnSorting = _columnSorting2.default;\nexports.Comments = _comments2.default;\nexports.ContextMenu = _contextMenu2.default;\nexports.CopyPaste = _copyPaste2.default;\nexports.CustomBorders = _customBorders2.default;\nexports.DragToScroll = _dragToScroll2.default;\nexports.ManualColumnFreeze = _manualColumnFreeze2.default;\nexports.ManualColumnMove = _manualColumnMove2.default;\nexports.ManualColumnResize = _manualColumnResize2.default;\nexports.ManualRowMove = _manualRowMove2.default;\nexports.ManualRowResize = _manualRowResize2.default;\nexports.MergeCells = _mergeCells2.default;\nexports.MultipleSelectionHandles = _multipleSelectionHandles2.default;\nexports.ObserveChanges = _observeChanges2.default;\nexports.PersistentState = _persistentState2.default;\nexports.Search = _search2.default;\nexports.TouchScroll = _touchScroll2.default;\nexports.UndoRedo = _undoRedo2.default;\nexports.Base = _base2.default;\n\n/***/ }),\n/* 284 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _storage = __webpack_require__(285);\n\nvar _storage2 = _interopRequireDefault(_storage);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('persistentStateSave');\n_pluginHooks2.default.getSingleton().register('persistentStateLoad');\n_pluginHooks2.default.getSingleton().register('persistentStateReset');\n\n/**\n * Save the state of column sorting, column positions and column sizes in local storage\n * to preserve table state between page reloads.\n *\n * In order to enable data storage mechanism, persistentState option must be set to true.\n *\n * When persistentState is enabled it exposes 3 hooks:\n *\n * persistentStateSave (key: String, value: Mixed) -\n * Saves value under given key in browser local storage.\n *\n * persistentStateLoad (key: String, saveTo: Object) -\n * Loads value, saved under given key, form browser local storage.\n * The loaded value will be saved in saveTo.value.\n *\n * persistentStateReset (key: String) -\n * Clears the value saved under key.\n * If no key is given, all values associated with table will be cleared.\n *\n * @plugin persistentState\n */\n\nvar PersistentState = function (_BasePlugin) {\n  _inherits(PersistentState, _BasePlugin);\n\n  function PersistentState(hotInstance) {\n    _classCallCheck(this, PersistentState);\n\n    /**\n     * Instance of {@link Storage}.\n     *\n     * @type {Storage}\n     */\n    var _this = _possibleConstructorReturn(this, (PersistentState.__proto__ || Object.getPrototypeOf(PersistentState)).call(this, hotInstance));\n\n    _this.storage = void 0;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(PersistentState, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().persistentState;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      if (!this.storage) {\n        this.storage = new _storage2.default(this.hot.rootElement.id);\n      }\n\n      this.addHook('persistentStateSave', function (key, value) {\n        return _this2.saveValue(key, value);\n      });\n      this.addHook('persistentStateLoad', function (key, saveTo) {\n        return _this2.loadValue(key, saveTo);\n      });\n      this.addHook('persistentStateReset', function () {\n        return _this2.resetValue();\n      });\n\n      _get(PersistentState.prototype.__proto__ || Object.getPrototypeOf(PersistentState.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.storage = void 0;\n\n      _get(PersistentState.prototype.__proto__ || Object.getPrototypeOf(PersistentState.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(PersistentState.prototype.__proto__ || Object.getPrototypeOf(PersistentState.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Load value from localStorage.\n     *\n     * @param {String} key Key string.\n     * @param {Object} saveTo Saved value from browser local storage.\n     */\n\n  }, {\n    key: 'loadValue',\n    value: function loadValue(key, saveTo) {\n      saveTo.value = this.storage.loadValue(key);\n    }\n\n    /**\n     * Save data to localStorage.\n     *\n     * @param {String} key Key string.\n     * @param {Mixed} value Value to save.\n     */\n\n  }, {\n    key: 'saveValue',\n    value: function saveValue(key, value) {\n      this.storage.saveValue(key, value);\n    }\n\n    /**\n     * Reset given data or all data from localStorage.\n     *\n     * @param {String} key [optional] Key string.\n     */\n\n  }, {\n    key: 'resetValue',\n    value: function resetValue(key) {\n      if (typeof key === 'undefined') {\n        this.storage.resetAll();\n      } else {\n        this.storage.reset(key);\n      }\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(PersistentState.prototype.__proto__ || Object.getPrototypeOf(PersistentState.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return PersistentState;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('persistentState', PersistentState);\n\nexports.default = PersistentState;\n\n/***/ }),\n/* 285 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _array = __webpack_require__(1);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Storage\n * @plugin PersistentState\n */\nvar Storage = function () {\n  function Storage(prefix) {\n    _classCallCheck(this, Storage);\n\n    /**\n     * Prefix for key (id element).\n     *\n     * @type {String}\n     */\n    this.prefix = prefix;\n\n    /**\n     * Saved keys.\n     *\n     * @type {Array}\n     */\n    this.savedKeys = [];\n    this.loadSavedKeys();\n  }\n\n  /**\n   * Save data to localStorage.\n   *\n   * @param {String} key Key string.\n   * @param {Mixed} value Value to save.\n   */\n\n\n  _createClass(Storage, [{\n    key: 'saveValue',\n    value: function saveValue(key, value) {\n      window.localStorage.setItem(this.prefix + '_' + key, JSON.stringify(value));\n\n      if (this.savedKeys.indexOf(key) === -1) {\n        this.savedKeys.push(key);\n        this.saveSavedKeys();\n      }\n    }\n\n    /**\n     * Load data from localStorage.\n     *\n     * @param {String} key Key string.\n     * @param {Object} defaultValue Object containing the loaded data.\n     *\n     * @returns {}\n     */\n\n  }, {\n    key: 'loadValue',\n    value: function loadValue(key, defaultValue) {\n      key = typeof key === 'undefined' ? defaultValue : key;\n\n      var value = window.localStorage.getItem(this.prefix + '_' + key);\n\n      return value === null ? void 0 : JSON.parse(value);\n    }\n\n    /**\n     * Reset given data from localStorage.\n     *\n     * @param {String} key Key string.\n     */\n\n  }, {\n    key: 'reset',\n    value: function reset(key) {\n      window.localStorage.removeItem(this.prefix + '_' + key);\n    }\n\n    /**\n     * Reset all data from localStorage.\n     *\n     */\n\n  }, {\n    key: 'resetAll',\n    value: function resetAll() {\n      var _this = this;\n\n      (0, _array.arrayEach)(this.savedKeys, function (value, index) {\n        window.localStorage.removeItem(_this.prefix + '_' + _this.savedKeys[index]);\n      });\n\n      this.clearSavedKeys();\n    }\n\n    /**\n     * Load and save all keys from localStorage.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'loadSavedKeys',\n    value: function loadSavedKeys() {\n      var keysJSON = window.localStorage.getItem(this.prefix + '__persistentStateKeys');\n      var keys = typeof keysJSON === 'string' ? JSON.parse(keysJSON) : void 0;\n\n      this.savedKeys = keys ? keys : [];\n    }\n  }, {\n    key: 'saveSavedKeys',\n\n\n    /**\n     * Save saved key in localStorage.\n     *\n     * @private\n     */\n    value: function saveSavedKeys() {\n      window.localStorage.setItem(this.prefix + '__persistentStateKeys', JSON.stringify(this.savedKeys));\n    }\n  }, {\n    key: 'clearSavedKeys',\n\n\n    /**\n     * Clear saved key from localStorage.\n     *\n     * @private\n     */\n    value: function clearSavedKeys() {\n      this.savedKeys.length = 0;\n      this.saveSavedKeys();\n    }\n  }]);\n\n  return Storage;\n}();\n\nexports.default = Storage;\n\n/***/ }),\n/* 286 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _array = __webpack_require__(1);\n\nvar _feature = __webpack_require__(40);\n\nvar _element = __webpack_require__(0);\n\nvar _ghostTable = __webpack_require__(92);\n\nvar _ghostTable2 = _interopRequireDefault(_ghostTable);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nvar _samplesGenerator = __webpack_require__(200);\n\nvar _samplesGenerator2 = _interopRequireDefault(_samplesGenerator);\n\nvar _string = __webpack_require__(36);\n\nvar _src = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar privatePool = new WeakMap();\n\n/**\n * @plugin AutoColumnSize\n *\n * @description\n * This plugin allows to set column widths based on their widest cells.\n *\n * By default, the plugin is declared as `undefined`, which makes it enabled (same as if it was declared as `true`).\n * Enabling this plugin may decrease the overall table performance, as it needs to calculate the widths of all cells to\n * resize the columns accordingly.\n * If you experience problems with the performance, try turning this feature off and declaring the column widths manually.\n *\n * Column width calculations are divided into sync and async part. Each of this parts has their own advantages and\n * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous operations don't\n * block the browser UI.\n *\n * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value to a config object:\n * ```js\n * ...\n * // as a number (300 columns in sync, rest async)\n * autoColumnSize: {syncLimit: 300},\n * ...\n *\n * ...\n * // as a string (percent)\n * autoColumnSize: {syncLimit: '40%'},\n * ...\n * ```\n *\n * To configure this plugin see {@link Options#autoColumnSize}.\n *\n * @example\n * ```js\n * ...\n * var hot = new Handsontable(document.getElementById('example'), {\n *   date: getData(),\n *   autoColumnSize: true\n * });\n * // Access to plugin instance:\n * var plugin = hot.getPlugin('autoColumnSize');\n *\n * plugin.getColumnWidth(4);\n *\n * if (plugin.isEnabled()) {\n *   // code...\n * }\n * ...\n * ```\n */\n\nvar AutoColumnSize = function (_BasePlugin) {\n  _inherits(AutoColumnSize, _BasePlugin);\n\n  _createClass(AutoColumnSize, null, [{\n    key: 'CALCULATION_STEP',\n    get: function get() {\n      return 50;\n    }\n  }, {\n    key: 'SYNC_CALCULATION_LIMIT',\n    get: function get() {\n      return 50;\n    }\n  }]);\n\n  function AutoColumnSize(hotInstance) {\n    _classCallCheck(this, AutoColumnSize);\n\n    var _this = _possibleConstructorReturn(this, (AutoColumnSize.__proto__ || Object.getPrototypeOf(AutoColumnSize)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      /**\n       * Cached column header names. It is used to diff current column headers with previous state and detect which\n       * columns width should be updated.\n       *\n       * @private\n       * @type {Array}\n       */\n      cachedColumnHeaders: []\n    });\n    /**\n     * Cached columns widths.\n     *\n     * @type {Array}\n     */\n    _this.widths = [];\n    /**\n     * Instance of {@link GhostTable} for rows and columns size calculations.\n     *\n     * @type {GhostTable}\n     */\n    _this.ghostTable = new _ghostTable2.default(_this.hot);\n    /**\n     * Instance of {@link SamplesGenerator} for generating samples necessary for columns width calculations.\n     *\n     * @type {SamplesGenerator}\n     */\n    _this.samplesGenerator = new _samplesGenerator2.default(function (row, col) {\n      return _this.hot.getCellMeta(row, col).spanned ? '' : _this.hot.getDataAtCell(row, col);\n    });\n    /**\n     * `true` only if the first calculation was performed\n     *\n     * @type {Boolean}\n     */\n    _this.firstCalculation = true;\n    /**\n     * `true` if the size calculation is in progress.\n     *\n     * @type {Boolean}\n     */\n    _this.inProgress = false;\n\n    // moved to constructor to allow auto-sizing the columns when the plugin is disabled\n    _this.addHook('beforeColumnResize', function (col, size, isDblClick) {\n      return _this.onBeforeColumnResize(col, size, isDblClick);\n    });\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(AutoColumnSize, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().autoColumnSize !== false && !this.hot.getSettings().colWidths;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      var setting = this.hot.getSettings().autoColumnSize;\n\n      if (setting && setting.useHeaders != null) {\n        this.ghostTable.setSetting('useHeaders', setting.useHeaders);\n      }\n\n      this.addHook('afterLoadData', function () {\n        return _this2.onAfterLoadData();\n      });\n      this.addHook('beforeChange', function (changes) {\n        return _this2.onBeforeChange(changes);\n      });\n\n      this.addHook('beforeRender', function (force) {\n        return _this2.onBeforeRender(force);\n      });\n      this.addHook('modifyColWidth', function (width, col) {\n        return _this2.getColumnWidth(col, width);\n      });\n      this.addHook('afterInit', function () {\n        return _this2.onAfterInit();\n      });\n      _get(AutoColumnSize.prototype.__proto__ || Object.getPrototypeOf(AutoColumnSize.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Update plugin state.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      var changedColumns = this.findColumnsWhereHeaderWasChanged();\n\n      if (changedColumns.length) {\n        this.clearCache(changedColumns);\n      }\n      _get(AutoColumnSize.prototype.__proto__ || Object.getPrototypeOf(AutoColumnSize.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(AutoColumnSize.prototype.__proto__ || Object.getPrototypeOf(AutoColumnSize.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Calculate a columns width.\n     *\n     * @param {Number|Object} colRange Column range object.\n     * @param {Number|Object} rowRange Row range object.\n     * @param {Boolean} [force=false] If `true` force calculate width even when value was cached earlier.\n     */\n\n  }, {\n    key: 'calculateColumnsWidth',\n    value: function calculateColumnsWidth() {\n      var colRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countCols() - 1 };\n\n      var _this3 = this;\n\n      var rowRange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { from: 0, to: this.hot.countRows() - 1 };\n      var force = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      if (typeof colRange === 'number') {\n        colRange = { from: colRange, to: colRange };\n      }\n      if (typeof rowRange === 'number') {\n        rowRange = { from: rowRange, to: rowRange };\n      }\n\n      (0, _number.rangeEach)(colRange.from, colRange.to, function (col) {\n        if (force || _this3.widths[col] === void 0 && !_this3.hot._getColWidthFromSettings(col)) {\n          var samples = _this3.samplesGenerator.generateColumnSamples(col, rowRange);\n\n          samples.forEach(function (sample, col) {\n            return _this3.ghostTable.addColumn(col, sample);\n          });\n        }\n      });\n\n      if (this.ghostTable.columns.length) {\n        this.ghostTable.getWidths(function (col, width) {\n          _this3.widths[col] = width;\n        });\n        this.ghostTable.clean();\n      }\n    }\n\n    /**\n     * Calculate all columns width.\n     *\n     * @param {Object|Number} rowRange Row range object.\n     */\n\n  }, {\n    key: 'calculateAllColumnsWidth',\n    value: function calculateAllColumnsWidth() {\n      var _this4 = this;\n\n      var rowRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countRows() - 1 };\n\n      var current = 0;\n      var length = this.hot.countCols() - 1;\n      var timer = null;\n\n      this.inProgress = true;\n\n      var loop = function loop() {\n        // When hot was destroyed after calculating finished cancel frame\n        if (!_this4.hot) {\n          (0, _feature.cancelAnimationFrame)(timer);\n          _this4.inProgress = false;\n\n          return;\n        }\n\n        _this4.calculateColumnsWidth({\n          from: current,\n          to: Math.min(current + AutoColumnSize.CALCULATION_STEP, length)\n        }, rowRange);\n\n        current = current + AutoColumnSize.CALCULATION_STEP + 1;\n\n        if (current < length) {\n          timer = (0, _feature.requestAnimationFrame)(loop);\n        } else {\n          (0, _feature.cancelAnimationFrame)(timer);\n          _this4.inProgress = false;\n\n          // @TODO Should call once per render cycle, currently fired separately in different plugins\n          _this4.hot.view.wt.wtOverlays.adjustElementsSize(true);\n          // tmp\n          if (_this4.hot.view.wt.wtOverlays.leftOverlay.needFullRender) {\n            _this4.hot.view.wt.wtOverlays.leftOverlay.clone.draw();\n          }\n        }\n      };\n      // sync\n      if (this.firstCalculation && this.getSyncCalculationLimit()) {\n        this.calculateColumnsWidth({ from: 0, to: this.getSyncCalculationLimit() }, rowRange);\n        this.firstCalculation = false;\n        current = this.getSyncCalculationLimit() + 1;\n      }\n      // async\n      if (current < length) {\n        loop();\n      } else {\n        this.inProgress = false;\n      }\n    }\n\n    /**\n     * Set the sampling options.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'setSamplingOptions',\n    value: function setSamplingOptions() {\n      var setting = this.hot.getSettings().autoColumnSize;\n      var samplingRatio = setting && (0, _object.hasOwnProperty)(setting, 'samplingRatio') ? this.hot.getSettings().autoColumnSize.samplingRatio : void 0;\n      var allowSampleDuplicates = setting && (0, _object.hasOwnProperty)(setting, 'allowSampleDuplicates') ? this.hot.getSettings().autoColumnSize.allowSampleDuplicates : void 0;\n\n      if (samplingRatio && !isNaN(samplingRatio)) {\n        this.samplesGenerator.setSampleCount(parseInt(samplingRatio, 10));\n      }\n\n      if (allowSampleDuplicates) {\n        this.samplesGenerator.setAllowDuplicates(allowSampleDuplicates);\n      }\n    }\n\n    /**\n     * Recalculate all columns width (overwrite cache values).\n     */\n\n  }, {\n    key: 'recalculateAllColumnsWidth',\n    value: function recalculateAllColumnsWidth() {\n      if (this.hot.view && (0, _element.isVisible)(this.hot.view.wt.wtTable.TABLE)) {\n        this.clearCache();\n        this.calculateAllColumnsWidth();\n      }\n    }\n\n    /**\n     * Get value which tells how many columns should be calculated synchronously. Rest of the columns will be calculated asynchronously.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getSyncCalculationLimit',\n    value: function getSyncCalculationLimit() {\n      /* eslint-disable no-bitwise */\n      var limit = AutoColumnSize.SYNC_CALCULATION_LIMIT;\n      var colsLimit = this.hot.countCols() - 1;\n\n      if ((0, _object.isObject)(this.hot.getSettings().autoColumnSize)) {\n        limit = this.hot.getSettings().autoColumnSize.syncLimit;\n\n        if ((0, _string.isPercentValue)(limit)) {\n          limit = (0, _number.valueAccordingPercent)(colsLimit, limit);\n        } else {\n          // Force to Number\n          limit >>= 0;\n        }\n      }\n\n      return Math.min(limit, colsLimit);\n    }\n\n    /**\n     * Get the calculated column width.\n     *\n     * @param {Number} col Column index.\n     * @param {Number} [defaultWidth] Default column width. It will be picked up if no calculated width found.\n     * @param {Boolean} [keepMinimum=true] If `true` then returned value won't be smaller then 50 (default column width).\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getColumnWidth',\n    value: function getColumnWidth(col) {\n      var defaultWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : void 0;\n      var keepMinimum = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n      var width = defaultWidth;\n\n      if (width === void 0) {\n        width = this.widths[col];\n\n        if (keepMinimum && typeof width === 'number') {\n          width = Math.max(width, _src.ViewportColumnsCalculator.DEFAULT_WIDTH);\n        }\n      }\n\n      return width;\n    }\n\n    /**\n     * Get the first visible column.\n     *\n     * @returns {Number} Returns column index or -1 if table is not rendered.\n     */\n\n  }, {\n    key: 'getFirstVisibleColumn',\n    value: function getFirstVisibleColumn() {\n      var wot = this.hot.view.wt;\n\n      if (wot.wtViewport.columnsVisibleCalculator) {\n        return wot.wtTable.getFirstVisibleColumn();\n      }\n      if (wot.wtViewport.columnsRenderCalculator) {\n        return wot.wtTable.getFirstRenderedColumn();\n      }\n\n      return -1;\n    }\n\n    /**\n     * Get the last visible column.\n     *\n     * @returns {Number} Returns column index or -1 if table is not rendered.\n     */\n\n  }, {\n    key: 'getLastVisibleColumn',\n    value: function getLastVisibleColumn() {\n      var wot = this.hot.view.wt;\n\n      if (wot.wtViewport.columnsVisibleCalculator) {\n        return wot.wtTable.getLastVisibleColumn();\n      }\n      if (wot.wtViewport.columnsRenderCalculator) {\n        return wot.wtTable.getLastRenderedColumn();\n      }\n\n      return -1;\n    }\n\n    /**\n     * Collects all columns which titles has been changed in comparison to the previous state.\n     *\n     * @returns {Array} It returns an array of physical column indexes.\n     */\n\n  }, {\n    key: 'findColumnsWhereHeaderWasChanged',\n    value: function findColumnsWhereHeaderWasChanged() {\n      var columnHeaders = this.hot.getColHeader();\n\n      var _privatePool$get = privatePool.get(this),\n          cachedColumnHeaders = _privatePool$get.cachedColumnHeaders;\n\n      var changedColumns = (0, _array.arrayReduce)(columnHeaders, function (acc, columnTitle, physicalColumn) {\n        var cachedColumnsLength = cachedColumnHeaders.length;\n\n        if (cachedColumnsLength - 1 < physicalColumn || cachedColumnHeaders[physicalColumn] !== columnTitle) {\n          acc.push(physicalColumn);\n        }\n        if (cachedColumnsLength - 1 < physicalColumn) {\n          cachedColumnHeaders.push(columnTitle);\n        } else {\n          cachedColumnHeaders[physicalColumn] = columnTitle;\n        }\n\n        return acc;\n      }, []);\n\n      return changedColumns;\n    }\n\n    /**\n     * Clear cache of calculated column widths. If you want to clear only selected columns pass an array with their indexes.\n     * Otherwise whole cache will be cleared.\n     *\n     * @param {Array} [columns=[]] List of column indexes (physical indexes) to clear.\n     */\n\n  }, {\n    key: 'clearCache',\n    value: function clearCache() {\n      var _this5 = this;\n\n      var columns = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n      if (columns.length) {\n        (0, _array.arrayEach)(columns, function (physicalIndex) {\n          _this5.widths[physicalIndex] = void 0;\n        });\n      } else {\n        this.widths.length = 0;\n      }\n    }\n\n    /**\n     * Check if all widths were calculated. If not then return `true` (need recalculate).\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNeedRecalculate',\n    value: function isNeedRecalculate() {\n      return !!(0, _array.arrayFilter)(this.widths, function (item) {\n        return item === void 0;\n      }).length;\n    }\n\n    /**\n     * On before render listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onBeforeRender',\n    value: function onBeforeRender() {\n      var force = this.hot.renderCall;\n      var rowsCount = this.hot.countRows();\n\n      // Keep last column widths unchanged for situation when all rows was deleted or trimmed (pro #6)\n      if (!rowsCount) {\n        return;\n      }\n\n      this.calculateColumnsWidth({ from: this.getFirstVisibleColumn(), to: this.getLastVisibleColumn() }, void 0, force);\n\n      if (this.isNeedRecalculate() && !this.inProgress) {\n        this.calculateAllColumnsWidth();\n      }\n    }\n\n    /**\n     * On after load data listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData() {\n      var _this6 = this;\n\n      if (this.hot.view) {\n        this.recalculateAllColumnsWidth();\n      } else {\n        // first load - initialization\n        setTimeout(function () {\n          if (_this6.hot) {\n            _this6.recalculateAllColumnsWidth();\n          }\n        }, 0);\n      }\n    }\n\n    /**\n     * On before change listener.\n     *\n     * @private\n     * @param {Array} changes\n     */\n\n  }, {\n    key: 'onBeforeChange',\n    value: function onBeforeChange(changes) {\n      var _this7 = this;\n\n      var changedColumns = (0, _array.arrayMap)(changes, function (_ref) {\n        var _ref2 = _slicedToArray(_ref, 2),\n            row = _ref2[0],\n            column = _ref2[1];\n\n        return _this7.hot.propToCol(column);\n      });\n\n      this.clearCache(changedColumns);\n    }\n\n    /**\n     * On before column resize listener.\n     *\n     * @private\n     * @param {Number} col\n     * @param {Number} size\n     * @param {Boolean} isDblClick\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onBeforeColumnResize',\n    value: function onBeforeColumnResize(col, size, isDblClick) {\n      if (isDblClick) {\n        this.calculateColumnsWidth(col, void 0, true);\n        size = this.getColumnWidth(col, void 0, false);\n      }\n\n      return size;\n    }\n\n    /**\n     * On after Handsontable init fill plugin with all necessary values.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      privatePool.get(this).cachedColumnHeaders = this.hot.getColHeader();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.ghostTable.clean();\n      _get(AutoColumnSize.prototype.__proto__ || Object.getPrototypeOf(AutoColumnSize.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return AutoColumnSize;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('autoColumnSize', AutoColumnSize);\n\nexports.default = AutoColumnSize;\n\n/***/ }),\n/* 287 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _element = __webpack_require__(0);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nvar _src = __webpack_require__(4);\n\nvar _utils = __webpack_require__(288);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('modifyAutofillRange');\n_pluginHooks2.default.getSingleton().register('beforeAutofill');\n\nvar INSERT_ROW_ALTER_ACTION_NAME = 'insert_row';\nvar INTERVAL_FOR_ADDING_ROW = 200;\n\n/**\n * This plugin provides \"drag-down\" and \"copy-down\" functionalities, both operated\n * using the small square in the right bottom of the cell selection.\n *\n * \"Drag-down\" expands the value of the selected cells to the neighbouring\n * cells when you drag the small square in the corner.\n *\n * \"Copy-down\" copies the value of the selection to all empty cells\n * below when you double click the small square.\n *\n * @class Autofill\n * @plugin Autofill\n */\n\nvar Autofill = function (_BasePlugin) {\n  _inherits(Autofill, _BasePlugin);\n\n  function Autofill(hotInstance) {\n    _classCallCheck(this, Autofill);\n\n    /**\n     * Event manager\n     *\n     * @type {EventManager}\n     */\n    var _this = _possibleConstructorReturn(this, (Autofill.__proto__ || Object.getPrototypeOf(Autofill)).call(this, hotInstance));\n\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Specifies if adding new row started.\n     *\n     * @type {Boolean}\n     */\n    _this.addingStarted = false;\n    /**\n     * Specifies if there was mouse down on the cell corner.\n     *\n     * @type {Boolean}\n     */\n    _this.mouseDownOnCellCorner = false;\n    /**\n     * Specifies if mouse was dragged outside Handsontable.\n     *\n     * @type {Boolean}\n     */\n    _this.mouseDragOutside = false;\n    /**\n     * Specifies how many cell levels were dragged using the handle.\n     *\n     * @type {Boolean}\n     */\n    _this.handleDraggedCells = 0;\n    /**\n     * Specifies allowed directions of drag.\n     *\n     * @type {Array}\n     */\n    _this.directions = [];\n    /**\n     * Specifies if can insert new rows if needed.\n     *\n     * @type {Boolean}\n     */\n    _this.autoInsertRow = false;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(Autofill, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().fillHandle;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.mapSettings();\n      this.registerEvents();\n\n      this.addHook('afterOnCellCornerMouseDown', function (event) {\n        return _this2.onAfterCellCornerMouseDown(event);\n      });\n      this.addHook('afterOnCellCornerDblClick', function (event) {\n        return _this2.onCellCornerDblClick(event);\n      });\n      this.addHook('beforeOnCellMouseOver', function (event, coords, TD) {\n        return _this2.onBeforeCellMouseOver(coords);\n      });\n\n      _get(Autofill.prototype.__proto__ || Object.getPrototypeOf(Autofill.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Update plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n      _get(Autofill.prototype.__proto__ || Object.getPrototypeOf(Autofill.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.clearMappedSettings();\n      _get(Autofill.prototype.__proto__ || Object.getPrototypeOf(Autofill.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Get selection data\n     *\n     * @private\n     * @returns {Array} Array with the data.\n     */\n\n  }, {\n    key: 'getSelectionData',\n    value: function getSelectionData() {\n      var selRange = {\n        from: this.hot.getSelectedRangeLast().from,\n        to: this.hot.getSelectedRangeLast().to\n      };\n\n      return this.hot.getData(selRange.from.row, selRange.from.col, selRange.to.row, selRange.to.col);\n    }\n\n    /**\n     * Try to apply fill values to the area in fill border, omitting the selection border.\n     *\n     * @private\n     * @returns {Boolean} reports if fill was applied.\n     */\n\n  }, {\n    key: 'fillIn',\n    value: function fillIn() {\n      if (this.hot.selection.highlight.getFill().isEmpty()) {\n        return false;\n      }\n\n      var cornersOfSelectionAndDragAreas = this.hot.selection.highlight.getFill().getCorners();\n\n      this.resetSelectionOfDraggedArea();\n\n      var cornersOfSelectedCells = this.getCornersOfSelectedCells();\n      cornersOfSelectionAndDragAreas = this.hot.runHooks('modifyAutofillRange', cornersOfSelectionAndDragAreas, cornersOfSelectedCells);\n\n      var _getDragDirectionAndR = (0, _utils.getDragDirectionAndRange)(cornersOfSelectedCells, cornersOfSelectionAndDragAreas),\n          directionOfDrag = _getDragDirectionAndR.directionOfDrag,\n          startOfDragCoords = _getDragDirectionAndR.startOfDragCoords,\n          endOfDragCoords = _getDragDirectionAndR.endOfDragCoords;\n\n      if (startOfDragCoords && startOfDragCoords.row > -1 && startOfDragCoords.col > -1) {\n        var selectionData = this.getSelectionData();\n\n        this.hot.runHooks('beforeAutofill', startOfDragCoords, endOfDragCoords, selectionData);\n\n        var deltas = (0, _utils.getDeltas)(startOfDragCoords, endOfDragCoords, selectionData, directionOfDrag);\n        var fillData = selectionData;\n\n        if (['up', 'left'].indexOf(directionOfDrag) > -1) {\n          fillData = [];\n\n          var dragLength = null;\n          var fillOffset = null;\n\n          if (directionOfDrag === 'up') {\n            dragLength = endOfDragCoords.row - startOfDragCoords.row + 1;\n            fillOffset = dragLength % selectionData.length;\n\n            for (var i = 0; i < dragLength; i++) {\n              fillData.push(selectionData[(i + (selectionData.length - fillOffset)) % selectionData.length]);\n            }\n          } else {\n            dragLength = endOfDragCoords.col - startOfDragCoords.col + 1;\n            fillOffset = dragLength % selectionData[0].length;\n\n            for (var _i = 0; _i < selectionData.length; _i++) {\n              fillData.push([]);\n              for (var j = 0; j < dragLength; j++) {\n                fillData[_i].push(selectionData[_i][(j + (selectionData[_i].length - fillOffset)) % selectionData[_i].length]);\n              }\n            }\n          }\n        }\n\n        this.hot.populateFromArray(startOfDragCoords.row, startOfDragCoords.col, fillData, endOfDragCoords.row, endOfDragCoords.col, this.pluginName + '.fill', null, directionOfDrag, deltas);\n\n        this.setSelection(cornersOfSelectionAndDragAreas);\n      } else {\n        // reset to avoid some range bug\n        this.hot._refreshBorders();\n      }\n\n      return true;\n    }\n\n    /**\n     * Reduce the selection area if the handle was dragged outside of the table or on headers.\n     *\n     * @private\n     * @param {CellCoords} coords indexes of selection corners.\n     * @returns {CellCoords}\n     */\n\n  }, {\n    key: 'reduceSelectionAreaIfNeeded',\n    value: function reduceSelectionAreaIfNeeded(coords) {\n      if (coords.row < 0) {\n        coords.row = 0;\n      }\n\n      if (coords.col < 0) {\n        coords.col = 0;\n      }\n      return coords;\n    }\n\n    /**\n     * Get the coordinates of the drag & drop borders.\n     *\n     * @private\n     * @param {CellCoords} coordsOfSelection `CellCoords` coord object.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getCoordsOfDragAndDropBorders',\n    value: function getCoordsOfDragAndDropBorders(coordsOfSelection) {\n      var topLeftCorner = this.hot.getSelectedRangeLast().getTopLeftCorner();\n      var bottomRightCorner = this.hot.getSelectedRangeLast().getBottomRightCorner();\n      var coords = void 0;\n\n      if (this.directions.includes(_utils.DIRECTIONS.vertical) && (bottomRightCorner.row < coordsOfSelection.row || topLeftCorner.row > coordsOfSelection.row)) {\n        coords = new _src.CellCoords(coordsOfSelection.row, bottomRightCorner.col);\n      } else if (this.directions.includes(_utils.DIRECTIONS.horizontal)) {\n        coords = new _src.CellCoords(bottomRightCorner.row, coordsOfSelection.col);\n      } else {\n        // wrong direction\n        return;\n      }\n\n      return this.reduceSelectionAreaIfNeeded(coords);\n    }\n\n    /**\n     * Show the fill border.\n     *\n     * @private\n     * @param {CellCoords} coordsOfSelection `CellCoords` coord object.\n     */\n\n  }, {\n    key: 'showBorder',\n    value: function showBorder(coordsOfSelection) {\n      var coordsOfDragAndDropBorders = this.getCoordsOfDragAndDropBorders(coordsOfSelection);\n\n      if (coordsOfDragAndDropBorders) {\n        this.redrawBorders(coordsOfDragAndDropBorders);\n      }\n    }\n\n    /**\n     * Add new row\n     *\n     * @private\n     */\n\n  }, {\n    key: 'addRow',\n    value: function addRow() {\n      var _this3 = this;\n\n      this.hot._registerTimeout(setTimeout(function () {\n        _this3.hot.alter(INSERT_ROW_ALTER_ACTION_NAME, void 0, 1, _this3.pluginName + '.fill');\n\n        _this3.addingStarted = false;\n      }, INTERVAL_FOR_ADDING_ROW));\n    }\n\n    /**\n     * Add new rows if they are needed to continue auto-filling values.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'addNewRowIfNeeded',\n    value: function addNewRowIfNeeded() {\n      if (this.hot.selection.highlight.getFill().cellRange && this.addingStarted === false && this.autoInsertRow) {\n        var cornersOfSelectedCells = this.hot.getSelectedLast();\n        var cornersOfSelectedDragArea = this.hot.selection.highlight.getFill().getCorners();\n        var nrOfTableRows = this.hot.countRows();\n\n        if (cornersOfSelectedCells[2] < nrOfTableRows - 1 && cornersOfSelectedDragArea[2] === nrOfTableRows - 1) {\n          this.addingStarted = true;\n\n          this.addRow();\n        }\n      }\n    }\n\n    /**\n     * Get corners of selected cells.\n     *\n     * @private\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getCornersOfSelectedCells',\n    value: function getCornersOfSelectedCells() {\n      if (this.hot.selection.isMultiple()) {\n        return this.hot.selection.highlight.createOrGetArea().getCorners();\n      }\n      return this.hot.selection.highlight.getCell().getCorners();\n    }\n\n    /**\n     * Get index of last adjacent filled in row\n     *\n     * @private\n     * @param {Array} cornersOfSelectedCells indexes of selection corners.\n     * @returns {Number} gives number greater than or equal to zero when selection adjacent can be applied.\n     * or -1 when selection adjacent can't be applied\n     */\n\n  }, {\n    key: 'getIndexOfLastAdjacentFilledInRow',\n    value: function getIndexOfLastAdjacentFilledInRow(cornersOfSelectedCells) {\n      var data = this.hot.getData();\n      var nrOfTableRows = this.hot.countRows();\n      var lastFilledInRowIndex = void 0;\n\n      for (var rowIndex = cornersOfSelectedCells[2] + 1; rowIndex < nrOfTableRows; rowIndex++) {\n        for (var columnIndex = cornersOfSelectedCells[1]; columnIndex <= cornersOfSelectedCells[3]; columnIndex++) {\n          var dataInCell = data[rowIndex][columnIndex];\n\n          if (dataInCell) {\n            return -1;\n          }\n        }\n\n        var dataInNextLeftCell = data[rowIndex][cornersOfSelectedCells[1] - 1];\n        var dataInNextRightCell = data[rowIndex][cornersOfSelectedCells[3] + 1];\n\n        if (!!dataInNextLeftCell || !!dataInNextRightCell) {\n          lastFilledInRowIndex = rowIndex;\n        }\n      }\n      return lastFilledInRowIndex;\n    }\n\n    /**\n     * Add a selection from the start area to the specific row index.\n     *\n     * @private\n     * @param {Array} selectStartArea selection area from which we start to create more comprehensive selection.\n     * @param {Number} rowIndex\n     */\n\n  }, {\n    key: 'addSelectionFromStartAreaToSpecificRowIndex',\n    value: function addSelectionFromStartAreaToSpecificRowIndex(selectStartArea, rowIndex) {\n      this.hot.selection.highlight.getFill().clear().add(new _src.CellCoords(selectStartArea[0], selectStartArea[1])).add(new _src.CellCoords(rowIndex, selectStartArea[3]));\n    }\n\n    /**\n     * Set selection based on passed corners.\n     *\n     * @private\n     * @param {Array} cornersOfArea\n     */\n\n  }, {\n    key: 'setSelection',\n    value: function setSelection(cornersOfArea) {\n      var _hot;\n\n      (_hot = this.hot).selectCell.apply(_hot, _toConsumableArray(cornersOfArea).concat([false, false]));\n    }\n\n    /**\n     * Try to select cells down to the last row in the left column and then returns if selection was applied.\n     *\n     * @private\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'selectAdjacent',\n    value: function selectAdjacent() {\n      var cornersOfSelectedCells = this.getCornersOfSelectedCells();\n      var lastFilledInRowIndex = this.getIndexOfLastAdjacentFilledInRow(cornersOfSelectedCells);\n\n      if (lastFilledInRowIndex === -1) {\n        return false;\n      }\n      this.addSelectionFromStartAreaToSpecificRowIndex(cornersOfSelectedCells, lastFilledInRowIndex);\n\n      return true;\n    }\n\n    /**\n     * Reset selection of dragged area.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'resetSelectionOfDraggedArea',\n    value: function resetSelectionOfDraggedArea() {\n      this.handleDraggedCells = 0;\n\n      this.hot.selection.highlight.getFill().clear();\n    }\n\n    /**\n     * Redraw borders.\n     *\n     * @private\n     * @param {CellCoords} coords `CellCoords` coord object.\n     */\n\n  }, {\n    key: 'redrawBorders',\n    value: function redrawBorders(coords) {\n      this.hot.selection.highlight.getFill().clear().add(this.hot.getSelectedRangeLast().from).add(this.hot.getSelectedRangeLast().to).add(coords);\n\n      this.hot.view.render();\n    }\n\n    /**\n     * Get if mouse was dragged outside.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'getIfMouseWasDraggedOutside',\n    value: function getIfMouseWasDraggedOutside(event) {\n      var tableBottom = (0, _element.offset)(this.hot.table).top - (window.pageYOffset || document.documentElement.scrollTop) + (0, _element.outerHeight)(this.hot.table);\n      var tableRight = (0, _element.offset)(this.hot.table).left - (window.pageXOffset || document.documentElement.scrollLeft) + (0, _element.outerWidth)(this.hot.table);\n\n      return event.clientY > tableBottom && event.clientX <= tableRight;\n    }\n\n    /**\n     * Bind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this4 = this;\n\n      this.eventManager.addEventListener(document.documentElement, 'mouseup', function () {\n        return _this4.onMouseUp();\n      });\n      this.eventManager.addEventListener(document.documentElement, 'mousemove', function (event) {\n        return _this4.onMouseMove(event);\n      });\n    }\n\n    /**\n     * On cell corner double click callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onCellCornerDblClick',\n    value: function onCellCornerDblClick() {\n      var selectionApplied = this.selectAdjacent();\n\n      if (selectionApplied) {\n        this.fillIn();\n      }\n    }\n\n    /**\n     * On after cell corner mouse down listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterCellCornerMouseDown',\n    value: function onAfterCellCornerMouseDown() {\n      this.handleDraggedCells = 1;\n      this.mouseDownOnCellCorner = true;\n    }\n\n    /**\n     * On before cell mouse over listener.\n     *\n     * @private\n     * @param {CellCoords} coords `CellCoords` coord object.\n     */\n\n  }, {\n    key: 'onBeforeCellMouseOver',\n    value: function onBeforeCellMouseOver(coords) {\n      if (this.mouseDownOnCellCorner && !this.hot.view.isMouseDown() && this.handleDraggedCells) {\n        this.handleDraggedCells++;\n\n        this.showBorder(coords);\n        this.addNewRowIfNeeded();\n      }\n    }\n\n    /**\n     * On mouse up listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      if (this.handleDraggedCells) {\n        if (this.handleDraggedCells > 1) {\n          this.fillIn();\n        }\n\n        this.handleDraggedCells = 0;\n        this.mouseDownOnCellCorner = false;\n      }\n    }\n\n    /**\n     * On mouse move listener.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var mouseWasDraggedOutside = this.getIfMouseWasDraggedOutside(event);\n\n      if (this.addingStarted === false && this.handleDraggedCells > 0 && mouseWasDraggedOutside) {\n        this.mouseDragOutside = true;\n        this.addingStarted = true;\n      } else {\n        this.mouseDragOutside = false;\n      }\n\n      if (this.mouseDragOutside && this.autoInsertRow) {\n        this.addRow();\n      }\n    }\n\n    /**\n     * Clear mapped settings.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'clearMappedSettings',\n    value: function clearMappedSettings() {\n      this.directions.length = 0;\n      this.autoInsertRow = false;\n    }\n\n    /**\n     * Map settings.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'mapSettings',\n    value: function mapSettings() {\n      var mappedSettings = (0, _utils.getMappedFillHandleSetting)(this.hot.getSettings().fillHandle);\n      this.directions = mappedSettings.directions;\n      this.autoInsertRow = mappedSettings.autoInsertRow;\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(Autofill.prototype.__proto__ || Object.getPrototypeOf(Autofill.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return Autofill;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('autofill', Autofill);\n\nexports.default = Autofill;\n\n/***/ }),\n/* 288 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.DIRECTIONS = undefined;\nexports.getDeltas = getDeltas;\nexports.getDragDirectionAndRange = getDragDirectionAndRange;\nexports.getMappedFillHandleSetting = getMappedFillHandleSetting;\n\nvar _object = __webpack_require__(2);\n\nvar _mixed = __webpack_require__(16);\n\nvar _src = __webpack_require__(4);\n\nvar DIRECTIONS = exports.DIRECTIONS = {\n  horizontal: 'horizontal',\n  vertical: 'vertical'\n};\n\n/**\n * Get deltas array.\n *\n * @param {CellCoords} start\n * @param {CellCoords} end\n * @param {Array} data\n * @param {String} direction\n * @returns {Array}\n */\nfunction getDeltas(start, end, data, direction) {\n  var rowsLength = data.length;\n  var columnsLength = data ? data[0].length : 0;\n  var deltas = [];\n  var diffRow = end.row - start.row;\n  var diffCol = end.col - start.col;\n\n  if (['down', 'up'].indexOf(direction) !== -1) {\n    var arr = [];\n\n    for (var col = 0; col <= diffCol; col++) {\n      var startValue = parseInt(data[0][col], 10);\n      var endValue = parseInt(data[rowsLength - 1][col], 10);\n      var delta = (direction === 'down' ? endValue - startValue : startValue - endValue) / (rowsLength - 1) || 0;\n\n      arr.push(delta);\n    }\n\n    deltas.push(arr);\n  }\n\n  if (['right', 'left'].indexOf(direction) !== -1) {\n    for (var row = 0; row <= diffRow; row++) {\n      var _startValue = parseInt(data[row][0], 10);\n      var _endValue = parseInt(data[row][columnsLength - 1], 10);\n      var _delta = (direction === 'right' ? _endValue - _startValue : _startValue - _endValue) / (columnsLength - 1) || 0;\n\n      deltas.push([_delta]);\n    }\n  }\n\n  return deltas;\n}\n\n/**\n * Get direction between positions and cords of selections difference (drag area)\n *\n * @param {Array} startSelection\n * @param {Array} endSelection\n * @returns {{direction: String, start: CellCoords, end: CellCoords}}\n */\nfunction getDragDirectionAndRange(startSelection, endSelection) {\n  var startOfDragCoords = void 0,\n      endOfDragCoords = void 0,\n      directionOfDrag = void 0;\n\n  if (endSelection[0] === startSelection[0] && endSelection[1] < startSelection[1]) {\n    directionOfDrag = 'left';\n\n    startOfDragCoords = new _src.CellCoords(endSelection[0], endSelection[1]);\n    endOfDragCoords = new _src.CellCoords(endSelection[2], startSelection[1] - 1);\n  } else if (endSelection[2] === startSelection[2] && endSelection[0] === startSelection[0] && endSelection[3] > startSelection[3]) {\n    directionOfDrag = 'right';\n\n    startOfDragCoords = new _src.CellCoords(endSelection[0], startSelection[3] + 1);\n    endOfDragCoords = new _src.CellCoords(endSelection[2], endSelection[3]);\n  } else if (endSelection[0] < startSelection[0] && endSelection[1] === startSelection[1]) {\n    directionOfDrag = 'up';\n\n    startOfDragCoords = new _src.CellCoords(endSelection[0], endSelection[1]);\n    endOfDragCoords = new _src.CellCoords(startSelection[0] - 1, endSelection[3]);\n  } else if (endSelection[2] > startSelection[2] && endSelection[1] === startSelection[1]) {\n    directionOfDrag = 'down';\n\n    startOfDragCoords = new _src.CellCoords(startSelection[2] + 1, endSelection[1]);\n    endOfDragCoords = new _src.CellCoords(endSelection[2], endSelection[3]);\n  }\n\n  return {\n    directionOfDrag: directionOfDrag,\n    startOfDragCoords: startOfDragCoords,\n    endOfDragCoords: endOfDragCoords\n  };\n}\n\n/**\n * Get mapped FillHandle setting containing information about\n * allowed FillHandle directions and if allowed is automatic insertion of rows on drag\n *\n * @param {Boolean|Object} fillHandle property of Handsontable settings\n * @returns {{directions: Array, autoInsertRow: Boolean}} object allowing access to information\n * about FillHandle in more useful way\n */\nfunction getMappedFillHandleSetting(fillHandle) {\n  var mappedSettings = {};\n\n  if (fillHandle === true) {\n    mappedSettings.directions = Object.keys(DIRECTIONS);\n    mappedSettings.autoInsertRow = true;\n  } else if ((0, _object.isObject)(fillHandle)) {\n    if ((0, _mixed.isDefined)(fillHandle.autoInsertRow)) {\n\n      // autoInsertRow for horizontal direction will be always false\n\n      if (fillHandle.direction === DIRECTIONS.horizontal) {\n        mappedSettings.autoInsertRow = false;\n      } else {\n        mappedSettings.autoInsertRow = fillHandle.autoInsertRow;\n      }\n    } else {\n      mappedSettings.autoInsertRow = false;\n    }\n\n    if ((0, _mixed.isDefined)(fillHandle.direction)) {\n      mappedSettings.directions = [fillHandle.direction];\n    } else {\n      mappedSettings.directions = Object.keys(DIRECTIONS);\n    }\n  } else if (typeof fillHandle === 'string') {\n    mappedSettings.directions = [fillHandle];\n    mappedSettings.autoInsertRow = true;\n  } else {\n    mappedSettings.directions = [];\n    mappedSettings.autoInsertRow = false;\n  }\n\n  return mappedSettings;\n}\n\n/***/ }),\n/* 289 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _array = __webpack_require__(1);\n\nvar _feature = __webpack_require__(40);\n\nvar _element = __webpack_require__(0);\n\nvar _ghostTable = __webpack_require__(92);\n\nvar _ghostTable2 = _interopRequireDefault(_ghostTable);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nvar _samplesGenerator = __webpack_require__(200);\n\nvar _samplesGenerator2 = _interopRequireDefault(_samplesGenerator);\n\nvar _string = __webpack_require__(36);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @plugin AutoRowSize\n *\n * @description\n * This plugin allows to set row heights based on their highest cells.\n *\n * By default, the plugin is declared as `undefined`, which makes it disabled (same as if it was declared as `false`).\n * Enabling this plugin may decrease the overall table performance, as it needs to calculate the heights of all cells to\n * resize the rows accordingly.\n * If you experience problems with the performance, try turning this feature off and declaring the row heights manually.\n *\n * Row height calculations are divided into sync and async part. Each of this parts has their own advantages and\n * disadvantages. Synchronous calculations are faster but they block the browser UI, while the slower asynchronous operations don't\n * block the browser UI.\n *\n * To configure the sync/async distribution, you can pass an absolute value (number of columns) or a percentage value to a config object:\n * ```js\n * ...\n * // as a number (300 columns in sync, rest async)\n * autoRowSize: {syncLimit: 300},\n * ...\n *\n * ...\n * // as a string (percent)\n * autoRowSize: {syncLimit: '40%'},\n * ...\n * ```\n *\n * You can also use the `allowSampleDuplicates` option to allow sampling duplicate values when calculating the row height. Note, that this might have\n * a negative impact on performance.\n *\n * To configure this plugin see {@link Options#autoRowSize}.\n *\n * @example\n *\n * ```js\n * ...\n * var hot = new Handsontable(document.getElementById('example'), {\n *   date: getData(),\n *   autoRowSize: true\n * });\n * // Access to plugin instance:\n * var plugin = hot.getPlugin('autoRowSize');\n *\n * plugin.getRowHeight(4);\n *\n * if (plugin.isEnabled()) {\n *   // code...\n * }\n * ...\n * ```\n */\nvar AutoRowSize = function (_BasePlugin) {\n  _inherits(AutoRowSize, _BasePlugin);\n\n  _createClass(AutoRowSize, null, [{\n    key: 'CALCULATION_STEP',\n    get: function get() {\n      return 50;\n    }\n  }, {\n    key: 'SYNC_CALCULATION_LIMIT',\n    get: function get() {\n      return 500;\n    }\n  }]);\n\n  function AutoRowSize(hotInstance) {\n    _classCallCheck(this, AutoRowSize);\n\n    /**\n     * Cached rows heights.\n     *\n     * @type {Array}\n     */\n    var _this = _possibleConstructorReturn(this, (AutoRowSize.__proto__ || Object.getPrototypeOf(AutoRowSize)).call(this, hotInstance));\n\n    _this.heights = [];\n    /**\n     * Instance of {@link GhostTable} for rows and columns size calculations.\n     *\n     * @type {GhostTable}\n     */\n    _this.ghostTable = new _ghostTable2.default(_this.hot);\n    /**\n     * Instance of {@link SamplesGenerator} for generating samples necessary for rows height calculations.\n     *\n     * @type {SamplesGenerator}\n     */\n    _this.samplesGenerator = new _samplesGenerator2.default(function (row, col) {\n      if (row >= 0) {\n        return _this.hot.getDataAtCell(row, col);\n      } else if (row === -1) {\n        return _this.hot.getColHeader(col);\n      }\n      return null;\n    });\n    /**\n     * `true` if only the first calculation was performed.\n     *\n     * @type {Boolean}\n     */\n    _this.firstCalculation = true;\n    /**\n     * `true` if the size calculation is in progress.\n     *\n     * @type {Boolean}\n     */\n    _this.inProgress = false;\n\n    // moved to constructor to allow auto-sizing the rows when the plugin is disabled\n    _this.addHook('beforeRowResize', function (row, size, isDblClick) {\n      return _this.onBeforeRowResize(row, size, isDblClick);\n    });\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(AutoRowSize, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().autoRowSize === true || (0, _object.isObject)(this.hot.getSettings().autoRowSize);\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.setSamplingOptions();\n\n      this.addHook('afterLoadData', function () {\n        return _this2.onAfterLoadData();\n      });\n      this.addHook('beforeChange', function (changes) {\n        return _this2.onBeforeChange(changes);\n      });\n      this.addHook('beforeColumnMove', function () {\n        return _this2.recalculateAllRowsHeight();\n      });\n      this.addHook('beforeColumnResize', function () {\n        return _this2.recalculateAllRowsHeight();\n      });\n      this.addHook('beforeColumnSort', function () {\n        return _this2.clearCache();\n      });\n      this.addHook('beforeRender', function (force) {\n        return _this2.onBeforeRender(force);\n      });\n      this.addHook('beforeRowMove', function (rowStart, rowEnd) {\n        return _this2.onBeforeRowMove(rowStart, rowEnd);\n      });\n      this.addHook('modifyRowHeight', function (height, row) {\n        return _this2.getRowHeight(row, height);\n      });\n      this.addHook('modifyColumnHeaderHeight', function () {\n        return _this2.getColumnHeaderHeight();\n      });\n      _get(AutoRowSize.prototype.__proto__ || Object.getPrototypeOf(AutoRowSize.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(AutoRowSize.prototype.__proto__ || Object.getPrototypeOf(AutoRowSize.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Calculate a given rows height.\n     *\n     * @param {Number|Object} rowRange Row range object.\n     * @param {Number|Object} colRange Column range object.\n     * @param {Boolean} [force=false] If `true` force calculate height even when value was cached earlier.\n     */\n\n  }, {\n    key: 'calculateRowsHeight',\n    value: function calculateRowsHeight() {\n      var rowRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countRows() - 1 };\n\n      var _this3 = this;\n\n      var colRange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { from: 0, to: this.hot.countCols() - 1 };\n      var force = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      if (typeof rowRange === 'number') {\n        rowRange = { from: rowRange, to: rowRange };\n      }\n      if (typeof colRange === 'number') {\n        colRange = { from: colRange, to: colRange };\n      }\n\n      if (this.hot.getColHeader(0) !== null) {\n        var samples = this.samplesGenerator.generateRowSamples(-1, colRange);\n\n        this.ghostTable.addColumnHeadersRow(samples.get(-1));\n      }\n\n      (0, _number.rangeEach)(rowRange.from, rowRange.to, function (row) {\n        // For rows we must calculate row height even when user had set height value manually.\n        // We can shrink column but cannot shrink rows!\n        if (force || _this3.heights[row] === void 0) {\n          var _samples = _this3.samplesGenerator.generateRowSamples(row, colRange);\n\n          _samples.forEach(function (sample, row) {\n            _this3.ghostTable.addRow(row, sample);\n          });\n        }\n      });\n      if (this.ghostTable.rows.length) {\n        this.ghostTable.getHeights(function (row, height) {\n          _this3.heights[row] = height;\n        });\n        this.ghostTable.clean();\n      }\n    }\n\n    /**\n     * Calculate the height of all the rows.\n     *\n     * @param {Object|Number} colRange Column range object.\n     */\n\n  }, {\n    key: 'calculateAllRowsHeight',\n    value: function calculateAllRowsHeight() {\n      var _this4 = this;\n\n      var colRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { from: 0, to: this.hot.countCols() - 1 };\n\n      var current = 0;\n      var length = this.hot.countRows() - 1;\n      var timer = null;\n\n      this.inProgress = true;\n\n      var loop = function loop() {\n        // When hot was destroyed after calculating finished cancel frame\n        if (!_this4.hot) {\n          (0, _feature.cancelAnimationFrame)(timer);\n          _this4.inProgress = false;\n\n          return;\n        }\n        _this4.calculateRowsHeight({ from: current, to: Math.min(current + AutoRowSize.CALCULATION_STEP, length) }, colRange);\n        current = current + AutoRowSize.CALCULATION_STEP + 1;\n\n        if (current < length) {\n          timer = (0, _feature.requestAnimationFrame)(loop);\n        } else {\n          (0, _feature.cancelAnimationFrame)(timer);\n          _this4.inProgress = false;\n\n          // @TODO Should call once per render cycle, currently fired separately in different plugins\n          _this4.hot.view.wt.wtOverlays.adjustElementsSize(true);\n          // tmp\n          if (_this4.hot.view.wt.wtOverlays.leftOverlay.needFullRender) {\n            _this4.hot.view.wt.wtOverlays.leftOverlay.clone.draw();\n          }\n        }\n      };\n      // sync\n      if (this.firstCalculation && this.getSyncCalculationLimit()) {\n        this.calculateRowsHeight({ from: 0, to: this.getSyncCalculationLimit() }, colRange);\n        this.firstCalculation = false;\n        current = this.getSyncCalculationLimit() + 1;\n      }\n      // async\n      if (current < length) {\n        loop();\n      } else {\n        this.inProgress = false;\n        this.hot.view.wt.wtOverlays.adjustElementsSize(false);\n      }\n    }\n\n    /**\n     * Set the sampling options.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'setSamplingOptions',\n    value: function setSamplingOptions() {\n      var setting = this.hot.getSettings().autoRowSize;\n      var samplingRatio = setting && (0, _object.hasOwnProperty)(setting, 'samplingRatio') ? this.hot.getSettings().autoRowSize.samplingRatio : void 0;\n      var allowSampleDuplicates = setting && (0, _object.hasOwnProperty)(setting, 'allowSampleDuplicates') ? this.hot.getSettings().autoRowSize.allowSampleDuplicates : void 0;\n\n      if (samplingRatio && !isNaN(samplingRatio)) {\n        this.samplesGenerator.setSampleCount(parseInt(samplingRatio, 10));\n      }\n\n      if (allowSampleDuplicates) {\n        this.samplesGenerator.setAllowDuplicates(allowSampleDuplicates);\n      }\n    }\n\n    /**\n     * Recalculate all rows height (overwrite cache values).\n     */\n\n  }, {\n    key: 'recalculateAllRowsHeight',\n    value: function recalculateAllRowsHeight() {\n      if ((0, _element.isVisible)(this.hot.view.wt.wtTable.TABLE)) {\n        this.clearCache();\n        this.calculateAllRowsHeight();\n      }\n    }\n\n    /**\n     * Get value which tells how much rows will be calculated synchronously. Rest rows will be calculated asynchronously.\n     *\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getSyncCalculationLimit',\n    value: function getSyncCalculationLimit() {\n      /* eslint-disable no-bitwise */\n      var limit = AutoRowSize.SYNC_CALCULATION_LIMIT;\n      var rowsLimit = this.hot.countRows() - 1;\n\n      if ((0, _object.isObject)(this.hot.getSettings().autoRowSize)) {\n        limit = this.hot.getSettings().autoRowSize.syncLimit;\n\n        if ((0, _string.isPercentValue)(limit)) {\n          limit = (0, _number.valueAccordingPercent)(rowsLimit, limit);\n        } else {\n          // Force to Number\n          limit >>= 0;\n        }\n      }\n\n      return Math.min(limit, rowsLimit);\n    }\n\n    /**\n     * Get the calculated row height.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} [defaultHeight] Default row height. It will be pick up if no calculated height found.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getRowHeight',\n    value: function getRowHeight(row) {\n      var defaultHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : void 0;\n\n      var height = defaultHeight;\n\n      if (this.heights[row] !== void 0 && this.heights[row] > (defaultHeight || 0)) {\n        height = this.heights[row];\n      }\n\n      return height;\n    }\n\n    /**\n     * Get the calculated column header height.\n     *\n     * @returns {Number|undefined}\n     */\n\n  }, {\n    key: 'getColumnHeaderHeight',\n    value: function getColumnHeaderHeight() {\n      return this.heights[-1];\n    }\n\n    /**\n     * Get the first visible row.\n     *\n     * @returns {Number} Returns row index or -1 if table is not rendered.\n     */\n\n  }, {\n    key: 'getFirstVisibleRow',\n    value: function getFirstVisibleRow() {\n      var wot = this.hot.view.wt;\n\n      if (wot.wtViewport.rowsVisibleCalculator) {\n        return wot.wtTable.getFirstVisibleRow();\n      }\n      if (wot.wtViewport.rowsRenderCalculator) {\n        return wot.wtTable.getFirstRenderedRow();\n      }\n\n      return -1;\n    }\n\n    /**\n     * Get the last visible row.\n     *\n     * @returns {Number} Returns row index or -1 if table is not rendered.\n     */\n\n  }, {\n    key: 'getLastVisibleRow',\n    value: function getLastVisibleRow() {\n      var wot = this.hot.view.wt;\n\n      if (wot.wtViewport.rowsVisibleCalculator) {\n        return wot.wtTable.getLastVisibleRow();\n      }\n      if (wot.wtViewport.rowsRenderCalculator) {\n        return wot.wtTable.getLastRenderedRow();\n      }\n\n      return -1;\n    }\n\n    /**\n     * Clear cached heights.\n     */\n\n  }, {\n    key: 'clearCache',\n    value: function clearCache() {\n      this.heights.length = 0;\n      this.heights[-1] = void 0;\n    }\n\n    /**\n     * Clear cache by range.\n     *\n     * @param {Object|Number} range Row range object.\n     */\n\n  }, {\n    key: 'clearCacheByRange',\n    value: function clearCacheByRange(range) {\n      var _this5 = this;\n\n      if (typeof range === 'number') {\n        range = { from: range, to: range };\n      }\n      (0, _number.rangeEach)(Math.min(range.from, range.to), Math.max(range.from, range.to), function (row) {\n        _this5.heights[row] = void 0;\n      });\n    }\n\n    /**\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isNeedRecalculate',\n    value: function isNeedRecalculate() {\n      return !!(0, _array.arrayFilter)(this.heights, function (item) {\n        return item === void 0;\n      }).length;\n    }\n\n    /**\n     * On before render listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onBeforeRender',\n    value: function onBeforeRender() {\n      var force = this.hot.renderCall;\n      this.calculateRowsHeight({ from: this.getFirstVisibleRow(), to: this.getLastVisibleRow() }, void 0, force);\n\n      var fixedRowsBottom = this.hot.getSettings().fixedRowsBottom;\n\n      // Calculate rows height synchronously for bottom overlay\n      if (fixedRowsBottom) {\n        var totalRows = this.hot.countRows() - 1;\n        this.calculateRowsHeight({ from: totalRows - fixedRowsBottom, to: totalRows });\n      }\n\n      if (this.isNeedRecalculate() && !this.inProgress) {\n        this.calculateAllRowsHeight();\n      }\n    }\n\n    /**\n     * On before row move listener.\n     *\n     * @private\n     * @param {Number} from Row index where was grabbed.\n     * @param {Number} to Destination row index.\n     */\n\n  }, {\n    key: 'onBeforeRowMove',\n    value: function onBeforeRowMove(from, to) {\n      this.clearCacheByRange({ from: from, to: to });\n      this.calculateAllRowsHeight();\n    }\n\n    /**\n     * On before row resize listener.\n     *\n     * @private\n     * @param {Number} row\n     * @param {Number} size\n     * @param {Boolean} isDblClick\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onBeforeRowResize',\n    value: function onBeforeRowResize(row, size, isDblClick) {\n      if (isDblClick) {\n        this.calculateRowsHeight(row, void 0, true);\n        size = this.getRowHeight(row);\n      }\n\n      return size;\n    }\n\n    /**\n     * On after load data listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData() {\n      var _this6 = this;\n\n      if (this.hot.view) {\n        this.recalculateAllRowsHeight();\n      } else {\n        // first load - initialization\n        setTimeout(function () {\n          if (_this6.hot) {\n            _this6.recalculateAllRowsHeight();\n          }\n        }, 0);\n      }\n    }\n\n    /**\n     * On before change listener.\n     *\n     * @private\n     * @param {Array} changes\n     */\n\n  }, {\n    key: 'onBeforeChange',\n    value: function onBeforeChange(changes) {\n      var range = null;\n\n      if (changes.length === 1) {\n        range = changes[0][0];\n      } else if (changes.length > 1) {\n        range = {\n          from: changes[0][0],\n          to: changes[changes.length - 1][0]\n        };\n      }\n      if (range !== null) {\n        this.clearCacheByRange(range);\n      }\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.ghostTable.clean();\n      _get(AutoRowSize.prototype.__proto__ || Object.getPrototypeOf(AutoRowSize.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return AutoRowSize;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('autoRowSize', AutoRowSize);\n\nexports.default = AutoRowSize;\n\n/***/ }),\n/* 290 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _moment = __webpack_require__(55);\n\nvar _moment2 = _interopRequireDefault(_moment);\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _mixed = __webpack_require__(16);\n\nvar _object = __webpack_require__(2);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _mergeSort = __webpack_require__(291);\n\nvar _mergeSort2 = _interopRequireDefault(_mergeSort);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('beforeColumnSort');\n_pluginHooks2.default.getSingleton().register('afterColumnSort');\n\n// TODO: Implement mixin arrayMapper to ColumnSorting plugin.\n\n/**\n * @plugin ColumnSorting\n *\n * @description\n * This plugin sorts the view by a column (but does not sort the data source!).\n * To enable the plugin, set the `columnSorting` property to either:\n * * a boolean value (`true`/`false`),\n * * an object defining the initial sorting order (see the example below).\n *\n * @example\n * ```js\n * ...\n * // as boolean\n * columnSorting: true\n * ...\n * // as a object with initial order (sort ascending column at index 2)\n * columnSorting: {\n *  column: 2,\n *  sortOrder: true, // true = ascending, false = descending, undefined = original order\n *  sortEmptyCells: true // true = the table sorts empty cells, false = the table moves all empty cells to the end of the table\n * }\n * ...\n * ```\n * @dependencies ObserveChanges\n */\n\nvar ColumnSorting = function (_BasePlugin) {\n  _inherits(ColumnSorting, _BasePlugin);\n\n  function ColumnSorting(hotInstance) {\n    _classCallCheck(this, ColumnSorting);\n\n    var _this2 = _possibleConstructorReturn(this, (ColumnSorting.__proto__ || Object.getPrototypeOf(ColumnSorting)).call(this, hotInstance));\n\n    _this2.sortIndicators = [];\n    _this2.lastSortedColumn = null;\n    _this2.sortEmptyCells = false;\n    return _this2;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ColumnSorting, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().columnSorting;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this3 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.setPluginOptions();\n\n      var _this = this;\n      this.hot.sortIndex = [];\n\n      this.hot.sort = function () {\n        var args = Array.prototype.slice.call(arguments);\n\n        return _this.sortByColumn.apply(_this, _toConsumableArray(args));\n      };\n\n      if (typeof this.hot.getSettings().observeChanges === 'undefined') {\n        this.enableObserveChangesPlugin();\n      }\n\n      this.addHook('afterTrimRow', function (row) {\n        return _this3.sort();\n      });\n      this.addHook('afterUntrimRow', function (row) {\n        return _this3.sort();\n      });\n      this.addHook('modifyRow', function (row) {\n        return _this3.translateRow(row);\n      });\n      this.addHook('unmodifyRow', function (row) {\n        return _this3.untranslateRow(row);\n      });\n      this.addHook('afterUpdateSettings', function () {\n        return _this3.onAfterUpdateSettings();\n      });\n      this.addHook('afterGetColHeader', function (col, TH) {\n        return _this3.getColHeader(col, TH);\n      });\n      this.addHook('afterOnCellMouseDown', function (event, target) {\n        return _this3.onAfterOnCellMouseDown(event, target);\n      });\n      this.addHook('afterCreateRow', function () {\n        _this.afterCreateRow.apply(_this, arguments);\n      });\n      this.addHook('afterRemoveRow', function () {\n        _this.afterRemoveRow.apply(_this, arguments);\n      });\n      this.addHook('afterInit', function () {\n        return _this3.sortBySettings();\n      });\n      this.addHook('afterLoadData', function () {\n        _this3.hot.sortIndex = [];\n\n        if (_this3.hot.view) {\n          _this3.sortBySettings();\n        }\n      });\n      if (this.hot.view) {\n        this.sortBySettings();\n      }\n      _get(ColumnSorting.prototype.__proto__ || Object.getPrototypeOf(ColumnSorting.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.hot.sort = void 0;\n      _get(ColumnSorting.prototype.__proto__ || Object.getPrototypeOf(ColumnSorting.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * afterUpdateSettings callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterUpdateSettings',\n    value: function onAfterUpdateSettings() {\n      this.sortBySettings();\n    }\n  }, {\n    key: 'sortBySettings',\n    value: function sortBySettings() {\n      var sortingSettings = this.hot.getSettings().columnSorting;\n      var loadedSortingState = this.loadSortingState();\n      var sortingColumn = void 0;\n      var sortingOrder = void 0;\n\n      if (typeof loadedSortingState === 'undefined') {\n        sortingColumn = sortingSettings.column;\n        sortingOrder = sortingSettings.sortOrder;\n      } else {\n        sortingColumn = loadedSortingState.sortColumn;\n        sortingOrder = loadedSortingState.sortOrder;\n      }\n      if (typeof sortingColumn === 'number') {\n        this.lastSortedColumn = sortingColumn;\n        this.sortByColumn(sortingColumn, sortingOrder);\n      }\n    }\n\n    /**\n     * Set sorted column and order info\n     *\n     * @param {number} col Sorted visual column index.\n     * @param {boolean|undefined} order Sorting order (`true` for ascending, `false` for descending).\n     */\n\n  }, {\n    key: 'setSortingColumn',\n    value: function setSortingColumn(col, order) {\n      if (typeof col == 'undefined') {\n        this.hot.sortColumn = void 0;\n        this.hot.sortOrder = void 0;\n\n        return;\n      } else if (this.hot.sortColumn === col && typeof order == 'undefined') {\n        if (this.hot.sortOrder === false) {\n          this.hot.sortOrder = void 0;\n        } else {\n          this.hot.sortOrder = !this.hot.sortOrder;\n        }\n      } else {\n        this.hot.sortOrder = typeof order === 'undefined' ? true : order;\n      }\n\n      this.hot.sortColumn = col;\n    }\n  }, {\n    key: 'sortByColumn',\n    value: function sortByColumn(col, order) {\n      this.setSortingColumn(col, order);\n\n      if (typeof this.hot.sortColumn == 'undefined') {\n        return;\n      }\n\n      var allowSorting = this.hot.runHooks('beforeColumnSort', this.hot.sortColumn, this.hot.sortOrder);\n\n      if (allowSorting !== false) {\n        this.sort();\n      }\n      this.updateOrderClass();\n      this.updateSortIndicator();\n\n      this.hot.runHooks('afterColumnSort', this.hot.sortColumn, this.hot.sortOrder);\n\n      this.hot.render();\n      this.saveSortingState();\n    }\n\n    /**\n     * Save the sorting state\n     */\n\n  }, {\n    key: 'saveSortingState',\n    value: function saveSortingState() {\n      var sortingState = {};\n\n      if (typeof this.hot.sortColumn != 'undefined') {\n        sortingState.sortColumn = this.hot.sortColumn;\n      }\n\n      if (typeof this.hot.sortOrder != 'undefined') {\n        sortingState.sortOrder = this.hot.sortOrder;\n      }\n\n      if ((0, _object.hasOwnProperty)(sortingState, 'sortColumn') || (0, _object.hasOwnProperty)(sortingState, 'sortOrder')) {\n        this.hot.runHooks('persistentStateSave', 'columnSorting', sortingState);\n      }\n    }\n\n    /**\n     * Load the sorting state.\n     *\n     * @returns {*} Previously saved sorting state.\n     */\n\n  }, {\n    key: 'loadSortingState',\n    value: function loadSortingState() {\n      var storedState = {};\n      this.hot.runHooks('persistentStateLoad', 'columnSorting', storedState);\n\n      return storedState.value;\n    }\n\n    /**\n     * Update sorting class name state.\n     */\n\n  }, {\n    key: 'updateOrderClass',\n    value: function updateOrderClass() {\n      var orderClass = void 0;\n\n      if (this.hot.sortOrder === true) {\n        orderClass = 'ascending';\n      } else if (this.hot.sortOrder === false) {\n        orderClass = 'descending';\n      }\n      this.sortOrderClass = orderClass;\n    }\n  }, {\n    key: 'enableObserveChangesPlugin',\n    value: function enableObserveChangesPlugin() {\n      var _this = this;\n\n      this.hot._registerTimeout(setTimeout(function () {\n        _this.hot.updateSettings({\n          observeChanges: true\n        });\n      }, 0));\n    }\n\n    /**\n     * Default sorting algorithm.\n     *\n     * @param {Boolean} sortOrder Sorting order - `true` for ascending, `false` for descending.\n     * @param {Object} columnMeta Column meta object.\n     * @returns {Function} The comparing function.\n     */\n\n  }, {\n    key: 'defaultSort',\n    value: function defaultSort(sortOrder, columnMeta) {\n      return function (a, b) {\n        if (typeof a[1] == 'string') {\n          a[1] = a[1].toLowerCase();\n        }\n        if (typeof b[1] == 'string') {\n          b[1] = b[1].toLowerCase();\n        }\n\n        if (a[1] === b[1]) {\n          return 0;\n        }\n\n        if ((0, _mixed.isEmpty)(a[1])) {\n          if ((0, _mixed.isEmpty)(b[1])) {\n            return 0;\n          }\n\n          if (columnMeta.columnSorting.sortEmptyCells) {\n            return sortOrder ? -1 : 1;\n          }\n\n          return 1;\n        }\n        if ((0, _mixed.isEmpty)(b[1])) {\n          if ((0, _mixed.isEmpty)(a[1])) {\n            return 0;\n          }\n\n          if (columnMeta.columnSorting.sortEmptyCells) {\n            return sortOrder ? 1 : -1;\n          }\n\n          return -1;\n        }\n\n        if (isNaN(a[1]) && !isNaN(b[1])) {\n          return sortOrder ? 1 : -1;\n        } else if (!isNaN(a[1]) && isNaN(b[1])) {\n          return sortOrder ? -1 : 1;\n        } else if (!(isNaN(a[1]) || isNaN(b[1]))) {\n          a[1] = parseFloat(a[1]);\n          b[1] = parseFloat(b[1]);\n        }\n        if (a[1] < b[1]) {\n          return sortOrder ? -1 : 1;\n        }\n        if (a[1] > b[1]) {\n          return sortOrder ? 1 : -1;\n        }\n\n        return 0;\n      };\n    }\n\n    /**\n     * Date sorting algorithm\n     * @param {Boolean} sortOrder Sorting order (`true` for ascending, `false` for descending).\n     * @param {Object} columnMeta Column meta object.\n     * @returns {Function} The compare function.\n     */\n\n  }, {\n    key: 'dateSort',\n    value: function dateSort(sortOrder, columnMeta) {\n      return function (a, b) {\n        if (a[1] === b[1]) {\n          return 0;\n        }\n\n        if ((0, _mixed.isEmpty)(a[1])) {\n          if ((0, _mixed.isEmpty)(b[1])) {\n            return 0;\n          }\n\n          if (columnMeta.columnSorting.sortEmptyCells) {\n            return sortOrder ? -1 : 1;\n          }\n\n          return 1;\n        }\n\n        if ((0, _mixed.isEmpty)(b[1])) {\n          if ((0, _mixed.isEmpty)(a[1])) {\n            return 0;\n          }\n\n          if (columnMeta.columnSorting.sortEmptyCells) {\n            return sortOrder ? 1 : -1;\n          }\n\n          return -1;\n        }\n\n        var aDate = (0, _moment2.default)(a[1], columnMeta.dateFormat);\n        var bDate = (0, _moment2.default)(b[1], columnMeta.dateFormat);\n\n        if (!aDate.isValid()) {\n          return 1;\n        }\n        if (!bDate.isValid()) {\n          return -1;\n        }\n\n        if (bDate.isAfter(aDate)) {\n          return sortOrder ? -1 : 1;\n        }\n        if (bDate.isBefore(aDate)) {\n          return sortOrder ? 1 : -1;\n        }\n\n        return 0;\n      };\n    }\n\n    /**\n     * Numeric sorting algorithm.\n     *\n     * @param {Boolean} sortOrder Sorting order (`true` for ascending, `false` for descending).\n     * @param {Object} columnMeta Column meta object.\n     * @returns {Function} The compare function.\n     */\n\n  }, {\n    key: 'numericSort',\n    value: function numericSort(sortOrder, columnMeta) {\n      return function (a, b) {\n        var parsedA = parseFloat(a[1]);\n        var parsedB = parseFloat(b[1]);\n\n        // Watch out when changing this part of code!\n        // Check below returns 0 (as expected) when comparing empty string, null, undefined\n        if (parsedA === parsedB || isNaN(parsedA) && isNaN(parsedB)) {\n          return 0;\n        }\n\n        if (columnMeta.columnSorting.sortEmptyCells) {\n          if ((0, _mixed.isEmpty)(a[1])) {\n            return sortOrder ? -1 : 1;\n          }\n\n          if ((0, _mixed.isEmpty)(b[1])) {\n            return sortOrder ? 1 : -1;\n          }\n        }\n\n        if (isNaN(parsedA)) {\n          return 1;\n        }\n\n        if (isNaN(parsedB)) {\n          return -1;\n        }\n\n        if (parsedA < parsedB) {\n          return sortOrder ? -1 : 1;\n        } else if (parsedA > parsedB) {\n          return sortOrder ? 1 : -1;\n        }\n\n        return 0;\n      };\n    }\n\n    /**\n     * Perform the sorting.\n     */\n\n  }, {\n    key: 'sort',\n    value: function sort() {\n      if (typeof this.hot.sortOrder == 'undefined') {\n        this.hot.sortIndex.length = 0;\n\n        return;\n      }\n\n      var colMeta = this.hot.getCellMeta(0, this.hot.sortColumn);\n      var emptyRows = this.hot.countEmptyRows();\n      var sortFunction = void 0;\n      var nrOfRows = void 0;\n\n      this.hot.sortingEnabled = false; // this is required by translateRow plugin hook\n      this.hot.sortIndex.length = 0;\n\n      if (typeof colMeta.columnSorting.sortEmptyCells === 'undefined') {\n        colMeta.columnSorting = { sortEmptyCells: this.sortEmptyCells };\n      }\n\n      if (this.hot.getSettings().maxRows === Number.POSITIVE_INFINITY) {\n        nrOfRows = this.hot.countRows() - this.hot.getSettings().minSpareRows;\n      } else {\n        nrOfRows = this.hot.countRows() - emptyRows;\n      }\n\n      for (var i = 0, ilen = nrOfRows; i < ilen; i++) {\n        this.hot.sortIndex.push([i, this.hot.getDataAtCell(i, this.hot.sortColumn)]);\n      }\n\n      if (colMeta.sortFunction) {\n        sortFunction = colMeta.sortFunction;\n      } else {\n        switch (colMeta.type) {\n          case 'date':\n            sortFunction = this.dateSort;\n            break;\n          case 'numeric':\n            sortFunction = this.numericSort;\n            break;\n          default:\n            sortFunction = this.defaultSort;\n        }\n      }\n\n      (0, _mergeSort2.default)(this.hot.sortIndex, sortFunction(this.hot.sortOrder, colMeta));\n\n      // Append spareRows\n      for (var _i = this.hot.sortIndex.length; _i < this.hot.countRows(); _i++) {\n        this.hot.sortIndex.push([_i, this.hot.getDataAtCell(_i, this.hot.sortColumn)]);\n      }\n\n      this.hot.sortingEnabled = true; // this is required by translateRow plugin hook\n    }\n\n    /**\n     * Update indicator states.\n     */\n\n  }, {\n    key: 'updateSortIndicator',\n    value: function updateSortIndicator() {\n      if (typeof this.hot.sortOrder == 'undefined') {\n        return;\n      }\n      var colMeta = this.hot.getCellMeta(0, this.hot.sortColumn);\n\n      this.sortIndicators[this.hot.sortColumn] = colMeta.sortIndicator;\n    }\n\n    /**\n     * `modifyRow` hook callback. Translates physical row index to the sorted row index.\n     *\n     * @param {Number} row Row index.\n     * @returns {Number} Sorted row index.\n     */\n\n  }, {\n    key: 'translateRow',\n    value: function translateRow(row) {\n      if (this.hot.sortingEnabled && typeof this.hot.sortOrder !== 'undefined' && this.hot.sortIndex && this.hot.sortIndex.length && this.hot.sortIndex[row]) {\n        return this.hot.sortIndex[row][0];\n      }\n\n      return row;\n    }\n\n    /**\n     * Translates sorted row index to physical row index.\n     *\n     * @param {Number} row Sorted (visual) row index.\n     * @returns {number} Physical row index.\n     */\n\n  }, {\n    key: 'untranslateRow',\n    value: function untranslateRow(row) {\n      if (this.hot.sortingEnabled && this.hot.sortIndex && this.hot.sortIndex.length) {\n        for (var i = 0; i < this.hot.sortIndex.length; i++) {\n          if (this.hot.sortIndex[i][0] == row) {\n            return i;\n          }\n        }\n      }\n    }\n\n    /**\n     * `afterGetColHeader` callback. Adds column sorting css classes to clickable headers.\n     *\n     * @private\n     * @param {Number} col Visual column index.\n     * @param {Element} TH TH HTML element.\n     */\n\n  }, {\n    key: 'getColHeader',\n    value: function getColHeader(col, TH) {\n      if (col < 0 || !TH.parentNode) {\n        return false;\n      }\n\n      var headerLink = TH.querySelector('.colHeader');\n      var colspan = TH.getAttribute('colspan');\n      var TRs = TH.parentNode.parentNode.childNodes;\n      var headerLevel = Array.prototype.indexOf.call(TRs, TH.parentNode);\n      headerLevel -= TRs.length;\n\n      if (!headerLink) {\n        return;\n      }\n\n      if (this.hot.getSettings().columnSorting && col >= 0 && headerLevel === -1) {\n        (0, _element.addClass)(headerLink, 'columnSorting');\n      }\n      (0, _element.removeClass)(headerLink, 'descending');\n      (0, _element.removeClass)(headerLink, 'ascending');\n\n      if (this.sortIndicators[col]) {\n        if (col === this.hot.sortColumn) {\n          if (this.sortOrderClass === 'ascending') {\n            (0, _element.addClass)(headerLink, 'ascending');\n          } else if (this.sortOrderClass === 'descending') {\n            (0, _element.addClass)(headerLink, 'descending');\n          }\n        }\n      }\n    }\n\n    /**\n     * Check if any column is in a sorted state.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSorted',\n    value: function isSorted() {\n      return typeof this.hot.sortColumn != 'undefined';\n    }\n\n    /**\n     * `afterCreateRow` callback. Updates the sorting state after a row have been created.\n     *\n     * @private\n     * @param {Number} index Visual row index.\n     * @param {Number} amount\n     */\n\n  }, {\n    key: 'afterCreateRow',\n    value: function afterCreateRow(index, amount) {\n      if (!this.isSorted()) {\n        return;\n      }\n\n      for (var i = 0; i < this.hot.sortIndex.length; i++) {\n        if (this.hot.sortIndex[i][0] >= index) {\n          this.hot.sortIndex[i][0] += amount;\n        }\n      }\n\n      for (var _i2 = 0; _i2 < amount; _i2++) {\n        this.hot.sortIndex.splice(index + _i2, 0, [index + _i2, this.hot.getSourceData()[index + _i2][this.hot.sortColumn + this.hot.colOffset()]]);\n      }\n\n      this.saveSortingState();\n    }\n\n    /**\n     * `afterRemoveRow` hook callback.\n     *\n     * @private\n     * @param {Number} index Visual row index.\n     * @param {Number} amount\n     */\n\n  }, {\n    key: 'afterRemoveRow',\n    value: function afterRemoveRow(index, amount) {\n      if (!this.isSorted()) {\n        return;\n      }\n      var removedRows = this.hot.sortIndex.splice(index, amount);\n\n      removedRows = (0, _array.arrayMap)(removedRows, function (row) {\n        return row[0];\n      });\n\n      function countRowShift(logicalRow) {\n        // Todo: compare perf between reduce vs sort->each->brake\n        return (0, _array.arrayReduce)(removedRows, function (count, removedLogicalRow) {\n          if (logicalRow > removedLogicalRow) {\n            count++;\n          }\n\n          return count;\n        }, 0);\n      }\n\n      this.hot.sortIndex = (0, _array.arrayMap)(this.hot.sortIndex, function (logicalRow, physicalRow) {\n        var rowShift = countRowShift(logicalRow[0]);\n\n        if (rowShift) {\n          logicalRow[0] -= rowShift;\n        }\n\n        return logicalRow;\n      });\n\n      this.saveSortingState();\n    }\n\n    /**\n     * Set options by passed settings\n     *\n     * @private\n     */\n\n  }, {\n    key: 'setPluginOptions',\n    value: function setPluginOptions() {\n      var columnSorting = this.hot.getSettings().columnSorting;\n\n      if ((typeof columnSorting === 'undefined' ? 'undefined' : _typeof(columnSorting)) === 'object') {\n        this.sortEmptyCells = columnSorting.sortEmptyCells || false;\n      } else {\n        this.sortEmptyCells = false;\n      }\n    }\n\n    /**\n     * `onAfterOnCellMouseDown` hook callback.\n     *\n     * @private\n     * @param {Event} event Event which are provided by hook.\n     * @param {CellCoords} coords Visual coords of the selected cell.\n     */\n\n  }, {\n    key: 'onAfterOnCellMouseDown',\n    value: function onAfterOnCellMouseDown(event, coords) {\n      if (coords.row > -1) {\n        return;\n      }\n\n      if ((0, _element.hasClass)(event.realTarget, 'columnSorting')) {\n        // reset order state on every new column header click\n        if (coords.col !== this.lastSortedColumn) {\n          this.hot.sortOrder = true;\n        }\n\n        this.lastSortedColumn = coords.col;\n\n        this.sortByColumn(coords.col);\n      }\n    }\n  }]);\n\n  return ColumnSorting;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('columnSorting', ColumnSorting);\n\nexports.default = ColumnSorting;\n\n/***/ }),\n/* 291 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = mergeSort;\nexports.merge = merge;\n\nvar _linkedList = __webpack_require__(292);\n\nvar _linkedList2 = _interopRequireDefault(_linkedList);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Refactored implementation of mergeSort (part of javascript-algorithms project) by Github users:\n * mgechev, AndriiHeonia and lekkas (part of javascript-algorithms project - all project contributors\n * at repository website)\n *\n * Link to repository: https://github.com/mgechev/javascript-algorithms\n */\n\n/**\n * Specifies a function that defines the sort order. The array is sorted according to each\n * character's Unicode code point value, according to the string conversion of each element.\n *\n * @param a {*} first compared element.\n * @param b {*} second compared element.\n * @returns {Number}\n */\nvar defaultCompareFunction = function defaultCompareFunction(a, b) {\n  // sort lexically\n\n  var firstValue = a.toString();\n  var secondValue = b.toString();\n\n  if (firstValue === secondValue) {\n    return 0;\n  } else if (firstValue < secondValue) {\n    return -1;\n  }\n  return 1;\n};\n\n/**\n * Mergesort method which is recursively called for sorting the input array.\n *\n * @param {Array} array The array which should be sorted.\n * @param {Function} compareFunction Compares two items in an array. If compareFunction is not supplied,\n * elements are sorted by converting them to strings and comparing strings in Unicode code point order.\n * @param {Number} startIndex Left side of the subarray.\n * @param {Number} endIndex Right side of the subarray.\n * @returns {Array} Array with sorted subarray.\n */\nfunction mergeSort(array) {\n  var compareFunction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultCompareFunction;\n  var startIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n  var endIndex = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : array.length;\n\n  if (Math.abs(endIndex - startIndex) <= 1) {\n    return [];\n  }\n\n  var middleIndex = Math.ceil((startIndex + endIndex) / 2);\n\n  mergeSort(array, compareFunction, startIndex, middleIndex);\n  mergeSort(array, compareFunction, middleIndex, endIndex);\n\n  return merge(array, compareFunction, startIndex, middleIndex, endIndex);\n}\n\n/**\n * Devides and sort merges two subarrays of given array\n *\n * @param {Array} array The array which subarrays should be sorted.\n * @param {Number} startIndex The start of the first subarray.\n *   This subarray is with end middle - 1.\n * @param {Number} middleIndex The start of the second array.\n * @param {Number} endIndex end - 1 is the end of the second array.\n * @returns {Array} The array with sorted subarray.\n */\nfunction merge(array, compareFunction, startIndex, middleIndex, endIndex) {\n  var leftElements = new _linkedList2.default();\n  var rightElements = new _linkedList2.default();\n  var leftSize = middleIndex - startIndex;\n  var rightSize = endIndex - middleIndex;\n  var maxSize = Math.max(leftSize, rightSize);\n  var size = endIndex - startIndex;\n\n  for (var _i = 0; _i < maxSize; _i += 1) {\n    if (_i < leftSize) {\n      leftElements.push(array[startIndex + _i]);\n    }\n\n    if (_i < rightSize) {\n      rightElements.push(array[middleIndex + _i]);\n    }\n  }\n\n  var i = 0;\n\n  while (i < size) {\n    if (leftElements.first && rightElements.first) {\n      if (compareFunction(leftElements.first.data, rightElements.first.data) > 0) {\n        array[startIndex + i] = rightElements.shift().data;\n      } else {\n        array[startIndex + i] = leftElements.shift().data;\n      }\n    } else if (leftElements.first) {\n\n      array[startIndex + i] = leftElements.shift().data;\n    } else {\n\n      array[startIndex + i] = rightElements.shift().data;\n    }\n\n    i += 1;\n  }\n\n  return array;\n};\n\n/***/ }),\n/* 292 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Refactored implementation of LinkedList (part of javascript-algorithms project) by Github users:\n * mgechev, AndriiHeonia, Microfed and Jakeh (part of javascript-algorithms project - all project contributors\n * at repository website)\n *\n * Link to repository: https://github.com/mgechev/javascript-algorithms\n */\n\n/**\n * Linked list node.\n *\n * @class NodeStructure\n * @util\n */\nvar NodeStructure = function NodeStructure(data) {\n  _classCallCheck(this, NodeStructure);\n\n  /**\n   * Data of the node.\n   * @member {Object}\n   */\n  this.data = data;\n  /**\n   * Next node.\n   * @member {NodeStructure}\n   */\n  this.next = null;\n  /**\n   * Previous node.\n   * @member {NodeStructure}\n   */\n  this.prev = null;\n};\n\n/**\n * Linked list.\n *\n * @class LinkedList\n * @util\n */\n\n\nvar LinkedList = function () {\n  function LinkedList() {\n    _classCallCheck(this, LinkedList);\n\n    this.first = null;\n    this.last = null;\n  }\n\n  /**\n   * Add data to the end of linked list.\n   *\n   * @param {Object} data Data which should be added.\n   */\n\n\n  _createClass(LinkedList, [{\n    key: \"push\",\n    value: function push(data) {\n      var node = new NodeStructure(data);\n\n      if (this.first === null) {\n        this.first = node;\n        this.last = node;\n      } else {\n        var temp = this.last;\n\n        this.last = node;\n        node.prev = temp;\n        temp.next = node;\n      }\n    }\n\n    /**\n     * Add data to the beginning of linked list.\n     *\n     * @param {Object} data Data which should be added.\n     */\n\n  }, {\n    key: \"unshift\",\n    value: function unshift(data) {\n      var node = new NodeStructure(data);\n\n      if (this.first === null) {\n        this.first = node;\n        this.last = node;\n      } else {\n        var temp = this.first;\n\n        this.first = node;\n        node.next = temp;\n        temp.prev = node;\n      }\n    }\n\n    /**\n     * In order traversal of the linked list.\n     *\n     * @param {Function} callback Callback which should be executed on each node.\n     */\n\n  }, {\n    key: \"inorder\",\n    value: function inorder(callback) {\n      var temp = this.first;\n\n      while (temp) {\n        callback(temp);\n        temp = temp.next;\n      }\n    }\n\n    /**\n     * Remove data from the linked list.\n     *\n     * @param {Object} data Data which should be removed.\n     * @returns {Boolean} Returns true if data has been removed.\n     */\n\n  }, {\n    key: \"remove\",\n    value: function remove(data) {\n      if (this.first === null) {\n        return false;\n      }\n\n      var temp = this.first;\n      var next = void 0;\n      var prev = void 0;\n\n      while (temp) {\n        if (temp.data === data) {\n          next = temp.next;\n          prev = temp.prev;\n\n          if (next) {\n            next.prev = prev;\n          }\n\n          if (prev) {\n            prev.next = next;\n          }\n\n          if (temp === this.first) {\n            this.first = next;\n          }\n\n          if (temp === this.last) {\n            this.last = prev;\n          }\n\n          return true;\n        }\n\n        temp = temp.next;\n      }\n\n      return false;\n    }\n\n    /**\n     * Check if linked list contains cycle.\n     *\n     * @returns {Boolean} Returns true if linked list contains cycle.\n     */\n\n  }, {\n    key: \"hasCycle\",\n    value: function hasCycle() {\n      var fast = this.first;\n      var slow = this.first;\n\n      while (true) {\n        if (fast === null) {\n          return false;\n        }\n\n        fast = fast.next;\n\n        if (fast === null) {\n          return false;\n        }\n\n        fast = fast.next;\n        slow = slow.next;\n\n        if (fast === slow) {\n          return true;\n        }\n      }\n    }\n  }, {\n    key: \"pop\",\n\n\n    /**\n     * Return last node from the linked list.\n     *\n     * @returns {NodeStructure} Last node.\n     */\n    value: function pop() {\n      if (this.last === null) {\n        return null;\n      }\n\n      var temp = this.last;\n      this.last = this.last.prev;\n\n      return temp;\n    }\n  }, {\n    key: \"shift\",\n\n\n    /**\n     * Return first node from the linked list.\n     *\n     * @returns {NodeStructure} First node.\n     */\n    value: function shift() {\n      if (this.first === null) {\n        return null;\n      }\n\n      var temp = this.first;\n      this.first = this.first.next;\n\n      return temp;\n    }\n  }, {\n    key: \"recursiveReverse\",\n\n\n    /**\n     * Reverses the linked list recursively\n     */\n    value: function recursiveReverse() {\n      function inverse(current, next) {\n        if (!next) {\n          return;\n        }\n        inverse(next, next.next);\n        next.next = current;\n      }\n\n      if (!this.first) {\n        return;\n      }\n\n      inverse(this.first, this.first.next);\n\n      this.first.next = null;\n      var temp = this.first;\n      this.first = this.last;\n      this.last = temp;\n    }\n  }, {\n    key: \"reverse\",\n\n\n    /**\n     * Reverses the linked list iteratively\n     */\n    value: function reverse() {\n      if (!this.first || !this.first.next) {\n        return;\n      }\n\n      var current = this.first.next;\n      var prev = this.first;\n      var temp = void 0;\n\n      while (current) {\n        temp = current.next;\n        current.next = prev;\n        prev.prev = current;\n        prev = current;\n        current = temp;\n      }\n\n      this.first.next = null;\n      this.last.prev = null;\n      temp = this.first;\n      this.first = prev;\n      this.last = temp;\n    }\n  }]);\n\n  return LinkedList;\n}();\n\n;\n\nexports.NodeStructure = NodeStructure;\nexports.default = LinkedList;\n\n/***/ }),\n/* 293 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _element = __webpack_require__(0);\n\nvar _object = __webpack_require__(2);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _src = __webpack_require__(4);\n\nvar _plugins = __webpack_require__(8);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _commentEditor = __webpack_require__(294);\n\nvar _commentEditor2 = _interopRequireDefault(_commentEditor);\n\nvar _utils = __webpack_require__(19);\n\nvar _displaySwitch = __webpack_require__(295);\n\nvar _displaySwitch2 = _interopRequireDefault(_displaySwitch);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\n__webpack_require__(296);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar privatePool = new WeakMap();\nvar META_COMMENT = 'comment';\nvar META_COMMENT_VALUE = 'value';\nvar META_STYLE = 'style';\nvar META_READONLY = 'readOnly';\n\n/**\n * @plugin Comments\n *\n * @description\n * This plugin allows setting and managing cell comments by either an option in the context menu or with the use of the API.\n *\n * To enable the plugin, you'll need to set the comments property of the config object to `true`:\n * ```js\n * ...\n * comments: true\n * ...\n * ```\n *\n * or object with extra predefined plugin config:\n *\n * ```js\n * ...\n * comments: {\n *   displayDelay: 1000\n * }\n * ...\n * ```\n *\n * To add comments at the table initialization, define the `comment` property in the `cell` config array as in an example below.\n *\n * @example\n *\n * ```js\n * ...\n * var hot = new Handsontable(document.getElementById('example'), {\n *   date: getData(),\n *   comments: true,\n *   cell: [\n *     {row: 1, col: 1, comment: {value: 'Foo'}},\n *     {row: 2, col: 2, comment: {value: 'Bar'}}\n *   ]\n * });\n *\n * // Access to the Comments plugin instance:\n * var commentsPlugin = hot.getPlugin('comments');\n *\n * // Manage comments programmatically:\n * commentsPlugin.setCommentAtCell(1, 6, 'Comment contents');\n * commentsPlugin.showAtCell(1, 6);\n * commentsPlugin.removeCommentAtCell(1, 6);\n *\n * // You can also set range once and use proper methods:\n * commentsPlugin.setRange({row: 1, col: 6});\n * commentsPlugin.setComment('Comment contents');\n * commentsPlugin.show();\n * commentsPlugin.removeComment();\n * ...\n * ```\n */\n\nvar Comments = function (_BasePlugin) {\n  _inherits(Comments, _BasePlugin);\n\n  function Comments(hotInstance) {\n    _classCallCheck(this, Comments);\n\n    /**\n     * Instance of {@link CommentEditor}.\n     *\n     * @type {CommentEditor}\n     */\n    var _this = _possibleConstructorReturn(this, (Comments.__proto__ || Object.getPrototypeOf(Comments)).call(this, hotInstance));\n\n    _this.editor = null;\n    /**\n     * Instance of {@link DisplaySwitch}.\n     *\n     * @type {DisplaySwitch}\n     */\n    _this.displaySwitch = null;\n    /**\n     * Instance of {@link EventManager}.\n     *\n     * @private\n     * @type {EventManager}\n     */\n    _this.eventManager = null;\n    /**\n     * Current cell range.\n     *\n     * @type {Object}\n     */\n    _this.range = {};\n    /**\n     * @private\n     * @type {Boolean}\n     */\n    _this.mouseDown = false;\n    /**\n     * @private\n     * @type {Boolean}\n     */\n    _this.contextMenuEvent = false;\n    /**\n     * @private\n     * @type {*}\n     */\n    _this.timer = null;\n\n    privatePool.set(_this, {\n      tempEditorDimensions: {},\n      cellBelowCursor: null\n    });\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(Comments, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().comments;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      if (!this.editor) {\n        this.editor = new _commentEditor2.default();\n      }\n\n      if (!this.eventManager) {\n        this.eventManager = new _eventManager2.default(this);\n      }\n\n      if (!this.displaySwitch) {\n        this.displaySwitch = new _displaySwitch2.default(this.getDisplayDelaySetting());\n      }\n\n      this.addHook('afterContextMenuDefaultOptions', function (options) {\n        return _this2.addToContextMenu(options);\n      });\n      this.addHook('afterRenderer', function (TD, row, col, prop, value, cellProperties) {\n        return _this2.onAfterRenderer(TD, cellProperties);\n      });\n      this.addHook('afterScrollHorizontally', function () {\n        return _this2.hide();\n      });\n      this.addHook('afterScrollVertically', function () {\n        return _this2.hide();\n      });\n      this.addHook('afterBeginEditing', function (args) {\n        return _this2.onAfterBeginEditing(args);\n      });\n\n      this.displaySwitch.addLocalHook('hide', function () {\n        return _this2.hide();\n      });\n      this.displaySwitch.addLocalHook('show', function (row, col) {\n        return _this2.showAtCell(row, col);\n      });\n\n      this.registerListeners();\n\n      _get(Comments.prototype.__proto__ || Object.getPrototypeOf(Comments.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Update plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n      _get(Comments.prototype.__proto__ || Object.getPrototypeOf(Comments.prototype), 'updatePlugin', this).call(this);\n\n      this.displaySwitch.updateDelay(this.getDisplayDelaySetting());\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(Comments.prototype.__proto__ || Object.getPrototypeOf(Comments.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Register all necessary DOM listeners.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerListeners',\n    value: function registerListeners() {\n      var _this3 = this;\n\n      this.eventManager.addEventListener(document, 'mouseover', function (event) {\n        return _this3.onMouseOver(event);\n      });\n      this.eventManager.addEventListener(document, 'mousedown', function (event) {\n        return _this3.onMouseDown(event);\n      });\n      this.eventManager.addEventListener(document, 'mouseup', function (event) {\n        return _this3.onMouseUp(event);\n      });\n      this.eventManager.addEventListener(this.editor.getInputElement(), 'blur', function (event) {\n        return _this3.onEditorBlur(event);\n      });\n      this.eventManager.addEventListener(this.editor.getInputElement(), 'mousedown', function (event) {\n        return _this3.onEditorMouseDown(event);\n      });\n      this.eventManager.addEventListener(this.editor.getInputElement(), 'mouseup', function (event) {\n        return _this3.onEditorMouseUp(event);\n      });\n    }\n\n    /**\n     * Set current cell range to be able to use general methods like {@link Comments#setComment},\n     * {@link Comments#removeComment}, {@link Comments#show}.\n     *\n     * @param {Object} range Object with `from` and `to` properties, each with `row` and `col` properties.\n     */\n\n  }, {\n    key: 'setRange',\n    value: function setRange(range) {\n      this.range = range;\n    }\n\n    /**\n     * Clear the currently selected cell.\n     */\n\n  }, {\n    key: 'clearRange',\n    value: function clearRange() {\n      this.range = {};\n    }\n\n    /**\n     * Check if the event target is a cell containing a comment.\n     *\n     * @param {Event} event DOM event\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'targetIsCellWithComment',\n    value: function targetIsCellWithComment(event) {\n      var closestCell = (0, _element.closest)(event.target, 'TD', 'TBODY');\n\n      return !!(closestCell && (0, _element.hasClass)(closestCell, 'htCommentCell') && (0, _element.closest)(closestCell, [this.hot.rootElement]));\n    }\n\n    /**\n     * Check if the event target is a comment textarea.\n     *\n     * @param {Event} event DOM event.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'targetIsCommentTextArea',\n    value: function targetIsCommentTextArea(event) {\n      return this.editor.getInputElement() === event.target;\n    }\n\n    /**\n     * Set a comment for a cell according to the previously set range (see {@link Comments#setRange}).\n     *\n     * @param {String} value Comment contents.\n     */\n\n  }, {\n    key: 'setComment',\n    value: function setComment(value) {\n      if (!this.range.from) {\n        throw new Error('Before using this method, first set cell range (hot.getPlugin(\"comment\").setRange())');\n      }\n      var editorValue = this.editor.getValue();\n      var comment = '';\n\n      if (value != null) {\n        comment = value;\n      } else if (editorValue != null) {\n        comment = editorValue;\n      }\n\n      var row = this.range.from.row;\n      var col = this.range.from.col;\n\n      this.updateCommentMeta(row, col, _defineProperty({}, META_COMMENT_VALUE, comment));\n      this.hot.render();\n    }\n\n    /**\n     * Set a comment for a cell.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {String} value Comment contents.\n     */\n\n  }, {\n    key: 'setCommentAtCell',\n    value: function setCommentAtCell(row, col, value) {\n      this.setRange({\n        from: new _src.CellCoords(row, col)\n      });\n      this.setComment(value);\n    }\n\n    /**\n     * Remove a comment from a cell according to previously set range (see {@link Comments#setRange}).\n     *\n     * @param {Boolean} [forceRender = true] If set to `true`, the table will be re-rendered at the end of the operation.\n     */\n\n  }, {\n    key: 'removeComment',\n    value: function removeComment() {\n      var forceRender = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n      if (!this.range.from) {\n        throw new Error('Before using this method, first set cell range (hot.getPlugin(\"comment\").setRange())');\n      }\n\n      this.hot.setCellMeta(this.range.from.row, this.range.from.col, META_COMMENT, void 0);\n\n      if (forceRender) {\n        this.hot.render();\n      }\n\n      this.hide();\n    }\n\n    /**\n     * Remove comment from a cell.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {Boolean} [forceRender = true] If `true`, the table will be re-rendered at the end of the operation.\n     */\n\n  }, {\n    key: 'removeCommentAtCell',\n    value: function removeCommentAtCell(row, col) {\n      var forceRender = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n      this.setRange({\n        from: new _src.CellCoords(row, col)\n      });\n      this.removeComment(forceRender);\n    }\n\n    /**\n     * Get comment from a cell at the predefined range.\n     */\n\n  }, {\n    key: 'getComment',\n    value: function getComment() {\n      var row = this.range.from.row;\n      var column = this.range.from.col;\n\n      return this.getCommentMeta(row, column, META_COMMENT_VALUE);\n    }\n\n    /**\n     * Get comment from a cell at the provided coordinates.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'getCommentAtCell',\n    value: function getCommentAtCell(row, column) {\n      return this.getCommentMeta(row, column, META_COMMENT_VALUE);\n    }\n\n    /**\n     * Show the comment editor accordingly to the previously set range (see {@link Comments#setRange}).\n     *\n     * @returns {Boolean} Returns `true` if comment editor was shown.\n     */\n\n  }, {\n    key: 'show',\n    value: function show() {\n      if (!this.range.from) {\n        throw new Error('Before using this method, first set cell range (hot.getPlugin(\"comment\").setRange())');\n      }\n      var meta = this.hot.getCellMeta(this.range.from.row, this.range.from.col);\n\n      this.refreshEditor(true);\n      this.editor.setValue(meta[META_COMMENT] ? meta[META_COMMENT][META_COMMENT_VALUE] : null || '');\n\n      if (this.editor.hidden) {\n        this.editor.show();\n      }\n\n      return true;\n    }\n\n    /**\n     * Show comment editor according to cell coordinates.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @returns {Boolean} Returns `true` if comment editor was shown.\n     */\n\n  }, {\n    key: 'showAtCell',\n    value: function showAtCell(row, col) {\n      this.setRange({\n        from: new _src.CellCoords(row, col)\n      });\n\n      return this.show();\n    }\n\n    /**\n     * Hide the comment editor.\n     */\n\n  }, {\n    key: 'hide',\n    value: function hide() {\n      if (!this.editor.hidden) {\n        this.editor.hide();\n      }\n    }\n\n    /**\n     * Refresh comment editor position and styling.\n     *\n     * @param {Boolean} [force=false] If `true` then recalculation will be forced.\n     */\n\n  }, {\n    key: 'refreshEditor',\n    value: function refreshEditor() {\n      var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (!force && (!this.range.from || !this.editor.isVisible())) {\n        return;\n      }\n      var scrollableElement = (0, _element.getScrollableElement)(this.hot.view.wt.wtTable.TABLE);\n      var TD = this.hot.view.wt.wtTable.getCell(this.range.from);\n      var row = this.range.from.row;\n      var column = this.range.from.col;\n      var cellOffset = (0, _element.offset)(TD);\n      var lastColWidth = this.hot.view.wt.wtTable.getStretchedColumnWidth(column);\n      var cellTopOffset = cellOffset.top < 0 ? 0 : cellOffset.top;\n      var cellLeftOffset = cellOffset.left;\n\n      if (this.hot.view.wt.wtViewport.hasVerticalScroll() && scrollableElement !== window) {\n        cellTopOffset -= this.hot.view.wt.wtOverlays.topOverlay.getScrollPosition();\n      }\n\n      if (this.hot.view.wt.wtViewport.hasHorizontalScroll() && scrollableElement !== window) {\n        cellLeftOffset -= this.hot.view.wt.wtOverlays.leftOverlay.getScrollPosition();\n      }\n\n      var x = cellLeftOffset + lastColWidth;\n      var y = cellTopOffset;\n\n      var commentStyle = this.getCommentMeta(row, column, META_STYLE);\n      var readOnly = this.getCommentMeta(row, column, META_READONLY);\n\n      if (commentStyle) {\n        this.editor.setSize(commentStyle.width, commentStyle.height);\n      } else {\n        this.editor.resetSize();\n      }\n\n      this.editor.setReadOnlyState(readOnly);\n\n      this.editor.setPosition(x, y);\n    }\n\n    /**\n     * Check if there is a comment for selected range.\n     *\n     * @private\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'checkSelectionCommentsConsistency',\n    value: function checkSelectionCommentsConsistency() {\n      var selected = this.hot.getSelectedRangeLast();\n\n      if (!selected) {\n        return false;\n      }\n      var hasComment = false;\n      var cell = selected.from; // IN EXCEL THERE IS COMMENT ONLY FOR TOP LEFT CELL IN SELECTION\n\n      if (this.getCommentMeta(cell.row, cell.col, META_COMMENT_VALUE)) {\n        hasComment = true;\n      }\n\n      return hasComment;\n    }\n\n    /**\n     * Set or update the comment-related cell meta.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} column Visual column index.\n     * @param {Object} metaObject Object defining all the comment-related meta information.\n     */\n\n  }, {\n    key: 'updateCommentMeta',\n    value: function updateCommentMeta(row, column, metaObject) {\n      var oldComment = this.hot.getCellMeta(row, column)[META_COMMENT];\n      var newComment = void 0;\n\n      if (oldComment) {\n        newComment = (0, _object.deepClone)(oldComment);\n        (0, _object.deepExtend)(newComment, metaObject);\n      } else {\n        newComment = metaObject;\n      }\n\n      this.hot.setCellMeta(row, column, META_COMMENT, newComment);\n    }\n\n    /**\n     * Get the comment related meta information.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} column Visual column index.\n     * @param {String} property Cell meta property.\n     * @returns {Mixed}\n     */\n\n  }, {\n    key: 'getCommentMeta',\n    value: function getCommentMeta(row, column, property) {\n      var cellMeta = this.hot.getCellMeta(row, column);\n\n      if (!cellMeta[META_COMMENT]) {\n        return void 0;\n      }\n\n      return cellMeta[META_COMMENT][property];\n    }\n\n    /**\n     * `mousedown` event callback.\n     *\n     * @private\n     * @param {MouseEvent} event The `mousedown` event.\n     */\n\n  }, {\n    key: 'onMouseDown',\n    value: function onMouseDown(event) {\n      this.mouseDown = true;\n\n      if (!this.hot.view || !this.hot.view.wt) {\n        return;\n      }\n\n      if (!this.contextMenuEvent && !this.targetIsCommentTextArea(event)) {\n        var eventCell = (0, _element.closest)(event.target, 'TD', 'TBODY');\n        var coordinates = null;\n\n        if (eventCell) {\n          coordinates = this.hot.view.wt.wtTable.getCoords(eventCell);\n        }\n\n        if (!eventCell || this.range.from && coordinates && (this.range.from.row !== coordinates.row || this.range.from.col !== coordinates.col)) {\n          this.hide();\n        }\n      }\n      this.contextMenuEvent = false;\n    }\n\n    /**\n     * `mouseover` event callback.\n     *\n     * @private\n     * @param {MouseEvent} event The `mouseover` event.\n     */\n\n  }, {\n    key: 'onMouseOver',\n    value: function onMouseOver(event) {\n      var priv = privatePool.get(this);\n\n      priv.cellBelowCursor = document.elementFromPoint(event.clientX, event.clientY);\n\n      if (this.mouseDown || this.editor.isFocused() || (0, _element.hasClass)(event.target, 'wtBorder') || priv.cellBelowCursor !== event.target || !this.editor) {\n        return;\n      }\n\n      if (this.targetIsCellWithComment(event)) {\n        var coordinates = this.hot.view.wt.wtTable.getCoords(event.target);\n        var range = {\n          from: new _src.CellCoords(coordinates.row, coordinates.col)\n        };\n\n        this.displaySwitch.show(range);\n      } else if ((0, _element.isChildOf)(event.target, document) && !this.targetIsCommentTextArea(event)) {\n        this.displaySwitch.hide();\n      }\n    }\n\n    /**\n     * `mouseup` event callback.\n     *\n     * @private\n     * @param {MouseEvent} event The `mouseup` event.\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp(event) {\n      this.mouseDown = false;\n    }\n\n    /** *\n     * The `afterRenderer` hook callback..\n     *\n     * @private\n     * @param {HTMLTableCellElement} TD The rendered `TD` element.\n     * @param {Object} cellProperties The rendered cell's property object.\n     */\n\n  }, {\n    key: 'onAfterRenderer',\n    value: function onAfterRenderer(TD, cellProperties) {\n      if (cellProperties[META_COMMENT] && cellProperties[META_COMMENT][META_COMMENT_VALUE]) {\n        (0, _element.addClass)(TD, cellProperties.commentedCellClassName);\n      }\n    }\n\n    /**\n     * `blur` event callback for the comment editor.\n     *\n     * @private\n     * @param {Event} event The `blur` event.\n     */\n\n  }, {\n    key: 'onEditorBlur',\n    value: function onEditorBlur(event) {\n      this.setComment();\n    }\n\n    /**\n     * `mousedown` hook. Along with `onEditorMouseUp` used to simulate the textarea resizing event.\n     *\n     * @private\n     * @param {MouseEvent} event The `mousedown` event.\n     */\n\n  }, {\n    key: 'onEditorMouseDown',\n    value: function onEditorMouseDown(event) {\n      var priv = privatePool.get(this);\n\n      priv.tempEditorDimensions = {\n        width: (0, _element.outerWidth)(event.target),\n        height: (0, _element.outerHeight)(event.target)\n      };\n    }\n\n    /**\n     * `mouseup` hook. Along with `onEditorMouseDown` used to simulate the textarea resizing event.\n     *\n     * @private\n     * @param {MouseEvent} event The `mouseup` event.\n     */\n\n  }, {\n    key: 'onEditorMouseUp',\n    value: function onEditorMouseUp(event) {\n      var priv = privatePool.get(this);\n      var currentWidth = (0, _element.outerWidth)(event.target);\n      var currentHeight = (0, _element.outerHeight)(event.target);\n\n      if (currentWidth !== priv.tempEditorDimensions.width + 1 || currentHeight !== priv.tempEditorDimensions.height + 2) {\n        this.updateCommentMeta(this.range.from.row, this.range.from.col, _defineProperty({}, META_STYLE, {\n          width: currentWidth,\n          height: currentHeight\n        }));\n      }\n    }\n\n    /**\n     * Context Menu's \"Add comment\" callback. Results in showing the comment editor.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onContextMenuAddComment',\n    value: function onContextMenuAddComment() {\n      var _this4 = this;\n\n      this.displaySwitch.cancelHiding();\n      var coords = this.hot.getSelectedRangeLast();\n\n      this.contextMenuEvent = true;\n      this.setRange({\n        from: coords.from\n      });\n      this.show();\n      setTimeout(function () {\n        if (_this4.hot) {\n          _this4.hot.deselectCell();\n          _this4.editor.focus();\n        }\n      }, 10);\n    }\n\n    /**\n     * Context Menu's \"remove comment\" callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onContextMenuRemoveComment',\n    value: function onContextMenuRemoveComment() {\n      this.contextMenuEvent = true;\n\n      var _hot$getSelectedRange = this.hot.getSelectedRangeLast(),\n          from = _hot$getSelectedRange.from,\n          to = _hot$getSelectedRange.to;\n\n      for (var i = from.row; i <= to.row; i++) {\n        for (var j = from.col; j <= to.col; j++) {\n          this.removeCommentAtCell(i, j, false);\n        }\n      }\n\n      this.hot.render();\n    }\n\n    /**\n     * Context Menu's \"make comment read-only\" callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onContextMenuMakeReadOnly',\n    value: function onContextMenuMakeReadOnly() {\n      this.contextMenuEvent = true;\n\n      var _hot$getSelectedRange2 = this.hot.getSelectedRangeLast(),\n          from = _hot$getSelectedRange2.from,\n          to = _hot$getSelectedRange2.to;\n\n      for (var i = from.row; i <= to.row; i++) {\n        for (var j = from.col; j <= to.col; j++) {\n          var currentState = !!this.getCommentMeta(i, j, META_READONLY);\n\n          this.updateCommentMeta(i, j, _defineProperty({}, META_READONLY, !currentState));\n        }\n      }\n    }\n\n    /**\n     * Add Comments plugin options to the Context Menu.\n     *\n     * @private\n     * @param {Object} defaultOptions\n     */\n\n  }, {\n    key: 'addToContextMenu',\n    value: function addToContextMenu(defaultOptions) {\n      var _this5 = this;\n\n      defaultOptions.items.push({\n        name: '---------'\n      }, {\n        key: 'commentsAddEdit',\n        name: function name() {\n          if (_this5.checkSelectionCommentsConsistency()) {\n            return _this5.hot.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_EDIT_COMMENT);\n          }\n\n          return _this5.hot.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ADD_COMMENT);\n        },\n        callback: function callback() {\n          return _this5.onContextMenuAddComment();\n        },\n        disabled: function disabled() {\n          return !(this.getSelectedLast() && !this.selection.isSelectedByCorner());\n        }\n      }, {\n        key: 'commentsRemove',\n        name: function name() {\n          return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_COMMENT);\n        },\n\n        callback: function callback() {\n          return _this5.onContextMenuRemoveComment();\n        },\n        disabled: function disabled() {\n          return _this5.hot.selection.isSelectedByCorner();\n        }\n      }, {\n        key: 'commentsReadOnly',\n        name: function name() {\n          var _this6 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT);\n          var hasProperty = (0, _utils.checkSelectionConsistency)(this.getSelectedRangeLast(), function (row, col) {\n            var readOnlyProperty = _this6.getCellMeta(row, col)[META_COMMENT];\n            if (readOnlyProperty) {\n              readOnlyProperty = readOnlyProperty[META_READONLY];\n            }\n\n            if (readOnlyProperty) {\n              return true;\n            }\n          });\n\n          if (hasProperty) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n\n        callback: function callback() {\n          return _this5.onContextMenuMakeReadOnly();\n        },\n        disabled: function disabled() {\n          return _this5.hot.selection.isSelectedByCorner() || !_this5.checkSelectionCommentsConsistency();\n        }\n      });\n    }\n\n    /**\n     * Get `displayDelay` setting of comment plugin.\n     *\n     * @returns {Number|undefined}\n     */\n\n  }, {\n    key: 'getDisplayDelaySetting',\n    value: function getDisplayDelaySetting() {\n      var commentSetting = this.hot.getSettings().comments;\n\n      if ((0, _object.isObject)(commentSetting)) {\n        return commentSetting.displayDelay;\n      }\n\n      return void 0;\n    }\n\n    /**\n     * `afterBeginEditing` hook callback.\n     *\n     * @private\n     * @param {Number} row Visual row index of the currently edited cell.\n     * @param {Number} column Visual column index of the currently edited cell.\n     */\n\n  }, {\n    key: 'onAfterBeginEditing',\n    value: function onAfterBeginEditing(row, column) {\n      this.hide();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.editor) {\n        this.editor.destroy();\n      }\n\n      if (this.displaySwitch) {\n        this.displaySwitch.destroy();\n      }\n\n      _get(Comments.prototype.__proto__ || Object.getPrototypeOf(Comments.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return Comments;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('comments', Comments);\n\nexports.default = Comments;\n\n/***/ }),\n/* 294 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Comment editor for the Comments plugin.\n *\n * @class CommentEditor\n * @plugin Comments\n */\nvar CommentEditor = function () {\n  _createClass(CommentEditor, null, [{\n    key: 'CLASS_EDITOR_CONTAINER',\n    get: function get() {\n      return 'htCommentsContainer';\n    }\n  }, {\n    key: 'CLASS_EDITOR',\n    get: function get() {\n      return 'htComments';\n    }\n  }, {\n    key: 'CLASS_INPUT',\n    get: function get() {\n      return 'htCommentTextArea';\n    }\n  }, {\n    key: 'CLASS_CELL',\n    get: function get() {\n      return 'htCommentCell';\n    }\n  }]);\n\n  function CommentEditor() {\n    _classCallCheck(this, CommentEditor);\n\n    this.editor = this.createEditor();\n    this.editorStyle = this.editor.style;\n\n    this.hidden = true;\n\n    this.hide();\n  }\n\n  /**\n   * Set position of the comments editor according to the  provided x and y coordinates.\n   *\n   * @param {Number} x X position (in pixels).\n   * @param {Number} y Y position (in pixels).\n   */\n\n\n  _createClass(CommentEditor, [{\n    key: 'setPosition',\n    value: function setPosition(x, y) {\n      this.editorStyle.left = x + 'px';\n      this.editorStyle.top = y + 'px';\n    }\n\n    /**\n     * Set the editor size according to the provided arguments.\n     *\n     * @param {Number} width Width in pixels.\n     * @param {Number} height Height in pixels.\n     */\n\n  }, {\n    key: 'setSize',\n    value: function setSize(width, height) {\n      if (width && height) {\n        var input = this.getInputElement();\n\n        input.style.width = width + 'px';\n        input.style.height = height + 'px';\n      }\n    }\n\n    /**\n     * Reset the editor size to its initial state.\n     */\n\n  }, {\n    key: 'resetSize',\n    value: function resetSize() {\n      var input = this.getInputElement();\n\n      input.style.width = '';\n      input.style.height = '';\n    }\n\n    /**\n     * Set the read-only state for the comments editor.\n     *\n     * @param {Boolean} state The new read only state.\n     */\n\n  }, {\n    key: 'setReadOnlyState',\n    value: function setReadOnlyState(state) {\n      var input = this.getInputElement();\n\n      input.readOnly = state;\n    }\n\n    /**\n     * Show the comments editor.\n     */\n\n  }, {\n    key: 'show',\n    value: function show() {\n      this.editorStyle.display = 'block';\n      this.hidden = false;\n    }\n\n    /**\n     * Hide the comments editor.\n     */\n\n  }, {\n    key: 'hide',\n    value: function hide() {\n      this.editorStyle.display = 'none';\n      this.hidden = true;\n    }\n\n    /**\n     * Checks if the editor is visible.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isVisible',\n    value: function isVisible() {\n      return this.editorStyle.display === 'block';\n    }\n\n    /**\n     * Set the comment value.\n     *\n     * @param {String} [value] The value to use.\n     */\n\n  }, {\n    key: 'setValue',\n    value: function setValue() {\n      var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      value = value || '';\n      this.getInputElement().value = value;\n    }\n\n    /**\n     * Get the comment value.\n     *\n     * @returns {String}\n     */\n\n  }, {\n    key: 'getValue',\n    value: function getValue() {\n      return this.getInputElement().value;\n    }\n\n    /**\n     * Checks if the comment input element is focused.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isFocused',\n    value: function isFocused() {\n      return document.activeElement === this.getInputElement();\n    }\n\n    /**\n     * Focus the comments input element.\n     */\n\n  }, {\n    key: 'focus',\n    value: function focus() {\n      this.getInputElement().focus();\n    }\n\n    /**\n     * Create the `textarea` to be used as a comments editor.\n     *\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createEditor',\n    value: function createEditor() {\n      var container = document.querySelector('.' + CommentEditor.CLASS_EDITOR_CONTAINER);\n      var editor = void 0;\n      var textArea = void 0;\n\n      if (!container) {\n        container = document.createElement('div');\n        (0, _element.addClass)(container, CommentEditor.CLASS_EDITOR_CONTAINER);\n        document.body.appendChild(container);\n      }\n      editor = document.createElement('div');\n      (0, _element.addClass)(editor, CommentEditor.CLASS_EDITOR);\n\n      textArea = document.createElement('textarea');\n      (0, _element.addClass)(textArea, CommentEditor.CLASS_INPUT);\n\n      editor.appendChild(textArea);\n      container.appendChild(editor);\n\n      return editor;\n    }\n\n    /**\n     * Get the input element.\n     *\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'getInputElement',\n    value: function getInputElement() {\n      return this.editor.querySelector('.' + CommentEditor.CLASS_INPUT);\n    }\n\n    /**\n     * Destroy the comments editor.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.editor.parentNode.removeChild(this.editor);\n      this.editor = null;\n      this.editorStyle = null;\n    }\n  }]);\n\n  return CommentEditor;\n}();\n\nexports.default = CommentEditor;\n\n/***/ }),\n/* 295 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _function = __webpack_require__(42);\n\nvar _object = __webpack_require__(2);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DEFAULT_DISPLAY_DELAY = 250;\nvar DEFAULT_HIDE_DELAY = 250;\n\n/**\n * Display switch for the Comments plugin. Manages the time of delayed displaying / hiding comments.\n *\n * @class DisplaySwitch\n * @plugin Comments\n */\n\nvar DisplaySwitch = function () {\n  function DisplaySwitch(displayDelay) {\n    _classCallCheck(this, DisplaySwitch);\n\n    /**\n     * Flag to determine if comment can be showed or hidden. State `true` mean that last performed action\n     * was an attempt to show comment element. State `false` mean that it was attempt to hide comment element.\n     *\n     * @type {Boolean}\n     */\n    this.wasLastActionShow = true;\n    /**\n     * Show comment after predefined delay. It keeps reference to immutable `debounce` function.\n     *\n     * @type {Function}\n     */\n    this.showDebounced = null;\n    /**\n     * Reference to timer, run by `setTimeout`, which is hiding comment\n     *\n     * @type {Number}\n     */\n    this.hidingTimer = null;\n\n    this.updateDelay(displayDelay);\n  }\n\n  /**\n   * Responsible for hiding comment after proper delay.\n   */\n\n\n  _createClass(DisplaySwitch, [{\n    key: 'hide',\n    value: function hide() {\n      var _this = this;\n\n      this.wasLastActionShow = false;\n\n      this.hidingTimer = setTimeout(function () {\n        if (_this.wasLastActionShow === false) {\n          _this.runLocalHooks('hide');\n        }\n      }, DEFAULT_HIDE_DELAY);\n    }\n\n    /**\n     * Responsible for showing comment after proper delay.\n     *\n     * @param {Object} range Coordinates of selected cell.\n     */\n\n  }, {\n    key: 'show',\n    value: function show(range) {\n      this.wasLastActionShow = true;\n      this.showDebounced(range);\n    }\n  }, {\n    key: 'cancelHiding',\n\n\n    /**\n     * Cancel hiding comment.\n     */\n    value: function cancelHiding() {\n      this.wasLastActionShow = true;\n\n      clearTimeout(this.hidingTimer);\n      this.hidingTimer = null;\n    }\n\n    /**\n     * Update the switch settings.\n     *\n     * @param {Number} displayDelay Delay of showing the comments (in milliseconds).\n     */\n\n  }, {\n    key: 'updateDelay',\n    value: function updateDelay() {\n      var _this2 = this;\n\n      var displayDelay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_DISPLAY_DELAY;\n\n      this.showDebounced = (0, _function.debounce)(function (range) {\n        if (_this2.wasLastActionShow) {\n          _this2.runLocalHooks('show', range.from.row, range.from.col);\n        }\n      }, displayDelay);\n    }\n\n    /**\n     * Destroy the switcher.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.clearLocalHooks();\n    }\n  }]);\n\n  return DisplaySwitch;\n}();\n\n(0, _object.mixin)(DisplaySwitch, _localHooks2.default);\n\nexports.default = DisplaySwitch;\n\n/***/ }),\n/* 296 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 297 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _commandExecutor = __webpack_require__(298);\n\nvar _commandExecutor2 = _interopRequireDefault(_commandExecutor);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _itemsFactory = __webpack_require__(299);\n\nvar _itemsFactory2 = _interopRequireDefault(_itemsFactory);\n\nvar _menu = __webpack_require__(311);\n\nvar _menu2 = _interopRequireDefault(_menu);\n\nvar _plugins = __webpack_require__(8);\n\nvar _event = __webpack_require__(12);\n\nvar _element = __webpack_require__(0);\n\nvar _predefinedItems = __webpack_require__(94);\n\n__webpack_require__(313);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('afterContextMenuDefaultOptions');\n_pluginHooks2.default.getSingleton().register('beforeContextMenuShow');\n_pluginHooks2.default.getSingleton().register('afterContextMenuShow');\n_pluginHooks2.default.getSingleton().register('afterContextMenuHide');\n_pluginHooks2.default.getSingleton().register('afterContextMenuExecute');\n\n/**\n * @description\n * This plugin creates the Handsontable Context Menu. It allows to create a new row or\n * column at any place in the grid among [other features](http://docs.handsontable.com/demo-context-menu.html).\n * Possible values:\n * * `true` (to enable default options),\n * * `false` (to disable completely)\n *\n * or array of any available strings:\n * * `[\"row_above\", \"row_below\", \"col_left\", \"col_right\",\n * \"remove_row\", \"remove_col\", \"---------\", \"undo\", \"redo\"]`.\n *\n * See [the context menu demo](http://docs.handsontable.com/demo-context-menu.html) for examples.\n *\n * @example\n * ```js\n * ...\n * // as a boolean\n * contextMenu: true\n * ...\n * // as a array\n * contextMenu: ['row_above', 'row_below', '---------', 'undo', 'redo']\n * ...\n * ```\n *\n * @plugin ContextMenu\n */\n\nvar ContextMenu = function (_BasePlugin) {\n  _inherits(ContextMenu, _BasePlugin);\n\n  _createClass(ContextMenu, null, [{\n    key: 'DEFAULT_ITEMS',\n\n    /**\n     * Default menu items order when `contextMenu` is enabled by `true`.\n     *\n     * @returns {Array}\n     */\n    get: function get() {\n      return [_predefinedItems.ROW_ABOVE, _predefinedItems.ROW_BELOW, _predefinedItems.SEPARATOR, _predefinedItems.COLUMN_LEFT, _predefinedItems.COLUMN_RIGHT, _predefinedItems.SEPARATOR, _predefinedItems.REMOVE_ROW, _predefinedItems.REMOVE_COLUMN, _predefinedItems.SEPARATOR, _predefinedItems.UNDO, _predefinedItems.REDO, _predefinedItems.SEPARATOR, _predefinedItems.READ_ONLY, _predefinedItems.SEPARATOR, _predefinedItems.ALIGNMENT];\n    }\n  }]);\n\n  function ContextMenu(hotInstance) {\n    _classCallCheck(this, ContextMenu);\n\n    /**\n     * Instance of {@link EventManager}.\n     *\n     * @type {EventManager}\n     */\n    var _this = _possibleConstructorReturn(this, (ContextMenu.__proto__ || Object.getPrototypeOf(ContextMenu)).call(this, hotInstance));\n\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Instance of {@link CommandExecutor}.\n     *\n     * @type {CommandExecutor}\n     */\n    _this.commandExecutor = new _commandExecutor2.default(_this.hot);\n    /**\n     * Instance of {@link ItemsFactory}.\n     *\n     * @type {ItemsFactory}\n     */\n    _this.itemsFactory = null;\n    /**\n     * Instance of {@link Menu}.\n     *\n     * @type {Menu}\n     */\n    _this.menu = null;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ContextMenu, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().contextMenu;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n      this.itemsFactory = new _itemsFactory2.default(this.hot, ContextMenu.DEFAULT_ITEMS);\n\n      var settings = this.hot.getSettings().contextMenu;\n      var predefinedItems = {\n        items: this.itemsFactory.getItems(settings)\n      };\n      this.registerEvents();\n\n      if (typeof settings.callback === 'function') {\n        this.commandExecutor.setCommonCallback(settings.callback);\n      }\n      _get(ContextMenu.prototype.__proto__ || Object.getPrototypeOf(ContextMenu.prototype), 'enablePlugin', this).call(this);\n\n      var delayedInitialization = function delayedInitialization() {\n        if (!_this2.hot) {\n          return;\n        }\n\n        _this2.hot.runHooks('afterContextMenuDefaultOptions', predefinedItems);\n\n        _this2.itemsFactory.setPredefinedItems(predefinedItems.items);\n        var menuItems = _this2.itemsFactory.getItems(settings);\n\n        _this2.menu = new _menu2.default(_this2.hot, {\n          className: 'htContextMenu',\n          keepInViewport: true\n        });\n        _this2.hot.runHooks('beforeContextMenuSetItems', menuItems);\n\n        _this2.menu.setMenuItems(menuItems);\n\n        _this2.menu.addLocalHook('beforeOpen', function () {\n          return _this2.onMenuBeforeOpen();\n        });\n        _this2.menu.addLocalHook('afterOpen', function () {\n          return _this2.onMenuAfterOpen();\n        });\n        _this2.menu.addLocalHook('afterClose', function () {\n          return _this2.onMenuAfterClose();\n        });\n        _this2.menu.addLocalHook('executeCommand', function () {\n          for (var _len = arguments.length, params = Array(_len), _key = 0; _key < _len; _key++) {\n            params[_key] = arguments[_key];\n          }\n\n          return _this2.executeCommand.apply(_this2, params);\n        });\n\n        // Register all commands. Predefined and added by user or by plugins\n        (0, _array.arrayEach)(menuItems, function (command) {\n          return _this2.commandExecutor.registerCommand(command.key, command);\n        });\n      };\n\n      this.callOnPluginsReady(function () {\n        if (_this2.isPluginsReady) {\n          setTimeout(delayedInitialization, 0);\n        } else {\n          delayedInitialization();\n        }\n      });\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(ContextMenu.prototype.__proto__ || Object.getPrototypeOf(ContextMenu.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.close();\n\n      if (this.menu) {\n        this.menu.destroy();\n        this.menu = null;\n      }\n      _get(ContextMenu.prototype.__proto__ || Object.getPrototypeOf(ContextMenu.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Register dom listeners.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this3 = this;\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'contextmenu', function (event) {\n        return _this3.onContextMenu(event);\n      });\n    }\n\n    /**\n     * Open menu and re-position it based on dom event object.\n     *\n     * @param {Event} event The event object.\n     */\n\n  }, {\n    key: 'open',\n    value: function open(event) {\n      if (!this.menu) {\n        return;\n      }\n      this.menu.open();\n      this.menu.setPosition({\n        top: parseInt((0, _event.pageY)(event), 10) - (0, _element.getWindowScrollTop)(),\n        left: parseInt((0, _event.pageX)(event), 10) - (0, _element.getWindowScrollLeft)()\n      });\n\n      // ContextMenu is not detected HotTableEnv correctly because is injected outside hot-table\n      this.menu.hotMenu.isHotTableEnv = this.hot.isHotTableEnv;\n      // Handsontable.eventManager.isHotTableEnv = this.hot.isHotTableEnv;\n    }\n\n    /**\n     * Close menu.\n     */\n\n  }, {\n    key: 'close',\n    value: function close() {\n      if (!this.menu) {\n        return;\n      }\n      this.menu.close();\n    }\n\n    /**\n     * Execute context menu command.\n     *\n     * You can execute all predefined commands:\n     *  * `'row_above'` - Insert row above\n     *  * `'row_below'` - Insert row below\n     *  * `'col_left'` - Insert column left\n     *  * `'col_right'` - Insert column right\n     *  * `'clear_column'` - Clear selected column\n     *  * `'remove_row'` - Remove row\n     *  * `'remove_col'` - Remove column\n     *  * `'undo'` - Undo last action\n     *  * `'redo'` - Redo last action\n     *  * `'make_read_only'` - Make cell read only\n     *  * `'alignment:left'` - Alignment to the left\n     *  * `'alignment:top'` - Alignment to the top\n     *  * `'alignment:right'` - Alignment to the right\n     *  * `'alignment:bottom'` - Alignment to the bottom\n     *  * `'alignment:middle'` - Alignment to the middle\n     *  * `'alignment:center'` - Alignment to the center (justify)\n     *\n     * Or you can execute command registered in settings where `key` is your command name.\n     *\n     * @param {String} commandName\n     * @param {*} params\n     */\n\n  }, {\n    key: 'executeCommand',\n    value: function executeCommand() {\n      for (var _len2 = arguments.length, params = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        params[_key2] = arguments[_key2];\n      }\n\n      this.commandExecutor.execute.apply(this.commandExecutor, params);\n    }\n\n    /**\n     * On context menu listener.\n     *\n     * @private\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onContextMenu',\n    value: function onContextMenu(event) {\n      var settings = this.hot.getSettings();\n      var showRowHeaders = settings.rowHeaders;\n      var showColHeaders = settings.colHeaders;\n\n      function isValidElement(element) {\n        return element.nodeName === 'TD' || element.parentNode.nodeName === 'TD';\n      }\n      // if event is from hot-table we must get web component element not element inside him\n      var element = event.realTarget;\n      this.close();\n\n      if ((0, _element.hasClass)(element, 'handsontableInput')) {\n        return;\n      }\n\n      event.preventDefault();\n      (0, _event.stopPropagation)(event);\n\n      if (!(showRowHeaders || showColHeaders)) {\n        if (!isValidElement(element) && !((0, _element.hasClass)(element, 'current') && (0, _element.hasClass)(element, 'wtBorder'))) {\n          return;\n        }\n      }\n\n      this.open(event);\n    }\n\n    /**\n     * On menu before open listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMenuBeforeOpen',\n    value: function onMenuBeforeOpen() {\n      this.hot.runHooks('beforeContextMenuShow', this);\n    }\n\n    /**\n     * On menu after open listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMenuAfterOpen',\n    value: function onMenuAfterOpen() {\n      this.hot.runHooks('afterContextMenuShow', this);\n    }\n\n    /**\n     * On menu after close listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMenuAfterClose',\n    value: function onMenuAfterClose() {\n      this.hot.listen();\n      this.hot.runHooks('afterContextMenuHide', this);\n    }\n\n    /**\n     * Destroy instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.close();\n\n      if (this.menu) {\n        this.menu.destroy();\n      }\n      _get(ContextMenu.prototype.__proto__ || Object.getPrototypeOf(ContextMenu.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return ContextMenu;\n}(_base2.default);\n\nContextMenu.SEPARATOR = {\n  name: _predefinedItems.SEPARATOR\n};\n\n(0, _plugins.registerPlugin)('contextMenu', ContextMenu);\n\nexports.default = ContextMenu;\n\n/***/ }),\n/* 298 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Command executor for ContextMenu.\n *\n * @class CommandExecutor\n * @plugin ContextMenu\n */\nvar CommandExecutor = function () {\n  function CommandExecutor(hotInstance) {\n    _classCallCheck(this, CommandExecutor);\n\n    this.hot = hotInstance;\n    this.commands = {};\n    this.commonCallback = null;\n  }\n\n  /**\n   * Register command.\n   *\n   * @param {String} name Command name.\n   * @param {Object} commandDescriptor Command descriptor object with properties like `key` (command id),\n   *                                   `callback` (task to execute), `name` (command name), `disabled` (command availability).\n   */\n\n\n  _createClass(CommandExecutor, [{\n    key: 'registerCommand',\n    value: function registerCommand(name, commandDescriptor) {\n      this.commands[name] = commandDescriptor;\n    }\n\n    /**\n     * Set common callback which will be trigger on every executed command.\n     *\n     * @param {Function} callback Function which will be fired on every command execute.\n     */\n\n  }, {\n    key: 'setCommonCallback',\n    value: function setCommonCallback(callback) {\n      this.commonCallback = callback;\n    }\n\n    /**\n     * Execute command by its name.\n     *\n     * @param {String} commandName Command id.\n     * @param {*} params Arguments passed to command task.\n     */\n\n  }, {\n    key: 'execute',\n    value: function execute(commandName) {\n      var _this = this;\n\n      for (var _len = arguments.length, params = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        params[_key - 1] = arguments[_key];\n      }\n\n      var commandSplit = commandName.split(':');\n      commandName = commandSplit[0];\n\n      var subCommandName = commandSplit.length === 2 ? commandSplit[1] : null;\n      var command = this.commands[commandName];\n\n      if (!command) {\n        throw new Error('Menu command \\'' + commandName + '\\' not exists.');\n      }\n      if (subCommandName && command.submenu) {\n        command = findSubCommand(subCommandName, command.submenu.items);\n      }\n      if (command.disabled === true) {\n        return;\n      }\n      if (typeof command.disabled == 'function' && command.disabled.call(this.hot) === true) {\n        return;\n      }\n      if ((0, _object.hasOwnProperty)(command, 'submenu')) {\n        return;\n      }\n      var callbacks = [];\n\n      if (typeof command.callback === 'function') {\n        callbacks.push(command.callback);\n      }\n      if (typeof this.commonCallback === 'function') {\n        callbacks.push(this.commonCallback);\n      }\n      params.unshift(commandSplit.join(':'));\n      (0, _array.arrayEach)(callbacks, function (callback) {\n        return callback.apply(_this.hot, params);\n      });\n    }\n  }]);\n\n  return CommandExecutor;\n}();\n\nfunction findSubCommand(subCommandName, subCommands) {\n  var command = void 0;\n\n  (0, _array.arrayEach)(subCommands, function (cmd) {\n    var cmds = cmd.key ? cmd.key.split(':') : null;\n\n    if (Array.isArray(cmds) && cmds[1] === subCommandName) {\n      command = cmd;\n\n      return false;\n    }\n  });\n\n  return command;\n}\n\nexports.default = CommandExecutor;\n\n/***/ }),\n/* 299 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _array = __webpack_require__(1);\n\nvar _predefinedItems = __webpack_require__(94);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Predefined items class factory for menu items.\n *\n * @class ItemsFactory\n * @plugin ContextMenu\n */\nvar ItemsFactory = function () {\n  function ItemsFactory(hotInstance) {\n    var orderPattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n    _classCallCheck(this, ItemsFactory);\n\n    this.hot = hotInstance;\n    this.predefinedItems = (0, _predefinedItems.predefinedItems)();\n    this.defaultOrderPattern = orderPattern;\n  }\n\n  /**\n   * Set predefined items.\n   *\n   * @param {Array} predefinedItems Array of predefined items.\n   */\n\n\n  _createClass(ItemsFactory, [{\n    key: 'setPredefinedItems',\n    value: function setPredefinedItems(predefinedItems) {\n      var _this = this;\n\n      var items = {};\n\n      this.defaultOrderPattern.length = 0;\n\n      (0, _object.objectEach)(predefinedItems, function (value, key) {\n        var menuItemKey = '';\n\n        if (value.name === _predefinedItems.SEPARATOR) {\n          items[_predefinedItems.SEPARATOR] = value;\n          menuItemKey = _predefinedItems.SEPARATOR;\n\n          // Menu item added as a property to array\n        } else if (isNaN(parseInt(key, 10))) {\n          value.key = value.key === void 0 ? key : value.key;\n          items[key] = value;\n          menuItemKey = value.key;\n        } else {\n          items[value.key] = value;\n          menuItemKey = value.key;\n        }\n        _this.defaultOrderPattern.push(menuItemKey);\n      });\n      this.predefinedItems = items;\n    }\n\n    /**\n     * Get all menu items based on pattern.\n     *\n     * @param {Array|Object|Boolean} pattern Pattern which you can define by displaying menu items order. If `true` default\n     *                                       pattern will be used.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'getItems',\n    value: function getItems() {\n      var pattern = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      return _getItems(pattern, this.defaultOrderPattern, this.predefinedItems);\n    }\n  }]);\n\n  return ItemsFactory;\n}();\n\nfunction _getItems() {\n  var pattern = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n  var defaultPattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n  var items = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n  var result = [];\n\n  if (pattern && pattern.items) {\n    pattern = pattern.items;\n  } else if (!Array.isArray(pattern)) {\n    pattern = defaultPattern;\n  }\n  if ((0, _object.isObject)(pattern)) {\n    (0, _object.objectEach)(pattern, function (value, key) {\n      var item = items[typeof value === 'string' ? value : key];\n\n      if (!item) {\n        item = value;\n      }\n      if ((0, _object.isObject)(value)) {\n        (0, _object.extend)(item, value);\n      } else if (typeof item === 'string') {\n        item = { name: item };\n      }\n      if (item.key === void 0) {\n        item.key = key;\n      }\n      result.push(item);\n    });\n  } else {\n    (0, _array.arrayEach)(pattern, function (name, key) {\n      var item = items[name];\n\n      // Item deleted from settings `allowInsertRow: false` etc.\n      if (!item && _predefinedItems.ITEMS.indexOf(name) >= 0) {\n        return;\n      }\n      if (!item) {\n        item = { name: name, key: '' + key };\n      }\n      if ((0, _object.isObject)(name)) {\n        (0, _object.extend)(item, name);\n      }\n      if (item.key === void 0) {\n        item.key = key;\n      }\n      result.push(item);\n    });\n  }\n\n  return result;\n}\n\nexports.default = ItemsFactory;\n\n/***/ }),\n/* 300 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = alignmentItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _separator = __webpack_require__(93);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'alignment';\n\nfunction alignmentItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT);\n    },\n    disabled: function disabled() {\n      return !(this.getSelectedRange() && !this.selection.isSelectedByCorner());\n    },\n\n    submenu: {\n      items: [{\n        key: KEY + ':left',\n        name: function name() {\n          var _this = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htLeft') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this2 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this2.getCellMeta(row, col).className;\n          });\n          var type = 'horizontal';\n          var alignment = 'htLeft';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this2.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this2.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':center',\n        name: function name() {\n          var _this3 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this3.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htCenter') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback(key, selection) {\n          var _this4 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this4.getCellMeta(row, col).className;\n          });\n          var type = 'horizontal';\n          var alignment = 'htCenter';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this4.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this4.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':right',\n        name: function name() {\n          var _this5 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this5.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htRight') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this6 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this6.getCellMeta(row, col).className;\n          });\n          var type = 'horizontal';\n          var alignment = 'htRight';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this6.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this6.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':justify',\n        name: function name() {\n          var _this7 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this7.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htJustify') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this8 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this8.getCellMeta(row, col).className;\n          });\n          var type = 'horizontal';\n          var alignment = 'htJustify';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this8.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this8.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        name: _separator.KEY\n      }, {\n        key: KEY + ':top',\n        name: function name() {\n          var _this9 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this9.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htTop') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n          return label;\n        },\n        callback: function callback() {\n          var _this10 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this10.getCellMeta(row, col).className;\n          });\n          var type = 'vertical';\n          var alignment = 'htTop';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this10.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this10.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':middle',\n        name: function name() {\n          var _this11 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this11.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htMiddle') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this12 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this12.getCellMeta(row, col).className;\n          });\n          var type = 'vertical';\n          var alignment = 'htMiddle';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this12.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this12.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }, {\n        key: KEY + ':bottom',\n        name: function name() {\n          var _this13 = this;\n\n          var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM);\n          var hasClass = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n            var className = _this13.getCellMeta(row, col).className;\n\n            if (className && className.indexOf('htBottom') !== -1) {\n              return true;\n            }\n          });\n\n          if (hasClass) {\n            label = (0, _utils.markLabelAsSelected)(label);\n          }\n\n          return label;\n        },\n        callback: function callback() {\n          var _this14 = this;\n\n          var selectedRange = this.getSelectedRange();\n          var stateBefore = (0, _utils.getAlignmentClasses)(selectedRange, function (row, col) {\n            return _this14.getCellMeta(row, col).className;\n          });\n          var type = 'vertical';\n          var alignment = 'htBottom';\n\n          this.runHooks('beforeCellAlignment', stateBefore, selectedRange, type, alignment);\n          (0, _utils.align)(selectedRange, type, alignment, function (row, col) {\n            return _this14.getCellMeta(row, col);\n          }, function (row, col, key, value) {\n            return _this14.setCellMeta(row, col, key, value);\n          });\n          this.render();\n        },\n\n        disabled: false\n      }]\n    }\n  };\n}\n\n/***/ }),\n/* 301 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = clearColumnItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'clear_column';\n\nfunction clearColumnItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_CLEAR_COLUMN);\n    },\n    callback: function callback(key, selection) {\n      var column = selection[0].start.col;\n\n      if (this.countRows()) {\n        this.populateFromArray(0, column, [[null]], Math.max(selection[0].start.row, selection[0].end.row), column, 'ContextMenu.clearColumn');\n      }\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n\n      var _selected$ = _slicedToArray(selected[0], 4),\n          startRow = _selected$[0],\n          startColumn = _selected$[1],\n          endRow = _selected$[2],\n          endColumn = _selected$[3];\n\n      var entireRowSelection = [startRow, 0, endRow, this.countCols() - 1];\n      var rowSelected = entireRowSelection.join(',') === selected.join(',');\n\n      return startColumn < 0 || this.countCols() >= this.getSettings().maxCols || rowSelected;\n    }\n  };\n}\n\n/***/ }),\n/* 302 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = columnLeftItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'col_left';\n\nfunction columnLeftItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_INSERT_LEFT);\n    },\n    callback: function callback(key, normalizedSelection) {\n      var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)];\n\n      this.alter('insert_col', latestSelection.start.col, 1, 'ContextMenu.columnLeft');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n      if (!this.isColumnModificationAllowed()) {\n        return true;\n      }\n\n      var _selected$ = _slicedToArray(selected[0], 4),\n          startRow = _selected$[0],\n          startColumn = _selected$[1],\n          endRow = _selected$[2],\n          endColumn = _selected$[3];\n\n      var entireRowSelection = [startRow, 0, endRow, this.countCols() - 1];\n      var rowSelected = entireRowSelection.join(',') === selected.join(',');\n      var onlyOneColumn = this.countCols() === 1;\n\n      return startColumn < 0 || this.countCols() >= this.getSettings().maxCols || !onlyOneColumn && rowSelected;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowInsertColumn;\n    }\n  };\n}\n\n/***/ }),\n/* 303 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = columnRightItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'col_right';\n\nfunction columnRightItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_INSERT_RIGHT);\n    },\n    callback: function callback(key, normalizedSelection) {\n      var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)];\n\n      this.alter('insert_col', latestSelection.end.col + 1, 1, 'ContextMenu.columnRight');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n      if (!this.isColumnModificationAllowed()) {\n        return true;\n      }\n\n      var _selected$ = _slicedToArray(selected[0], 4),\n          startRow = _selected$[0],\n          startColumn = _selected$[1],\n          endRow = _selected$[2],\n          endColumn = _selected$[3];\n\n      var entireRowSelection = [startRow, 0, endRow, this.countCols() - 1];\n      var rowSelected = entireRowSelection.join(',') === selected.join(',');\n      var onlyOneColumn = this.countCols() === 1;\n\n      return startColumn < 0 || this.countCols() >= this.getSettings().maxCols || !onlyOneColumn && rowSelected;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowInsertColumn;\n    }\n  };\n}\n\n/***/ }),\n/* 304 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = readOnlyItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _array = __webpack_require__(1);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'make_read_only';\n\nfunction readOnlyItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      var _this = this;\n\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_READ_ONLY);\n      var atLeastOneReadOnly = (0, _utils.checkSelectionConsistency)(this.getSelectedRange(), function (row, col) {\n        return _this.getCellMeta(row, col).readOnly;\n      });\n\n      if (atLeastOneReadOnly) {\n        label = (0, _utils.markLabelAsSelected)(label);\n      }\n\n      return label;\n    },\n    callback: function callback() {\n      var _this2 = this;\n\n      var ranges = this.getSelectedRange();\n      var atLeastOneReadOnly = (0, _utils.checkSelectionConsistency)(ranges, function (row, col) {\n        return _this2.getCellMeta(row, col).readOnly;\n      });\n\n      (0, _array.arrayEach)(ranges, function (range) {\n        range.forAll(function (row, col) {\n          _this2.setCellMeta(row, col, 'readOnly', !atLeastOneReadOnly);\n        });\n      });\n\n      this.render();\n    },\n    disabled: function disabled() {\n      return !(this.getSelectedRange() && !this.selection.isSelectedByCorner());\n    }\n  };\n}\n\n/***/ }),\n/* 305 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = redoItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'redo';\n\nfunction redoItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REDO);\n    },\n    callback: function callback() {\n      this.redo();\n    },\n    disabled: function disabled() {\n      return this.undoRedo && !this.undoRedo.isRedoAvailable();\n    }\n  };\n}\n\n/***/ }),\n/* 306 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = removeColumnItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _array = __webpack_require__(1);\n\nvar _utils2 = __webpack_require__(91);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'remove_col';\n\nfunction removeColumnItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      var selection = this.getSelected();\n      var pluralForm = 0;\n\n      if (selection) {\n        if (selection.length > 1) {\n          pluralForm = 1;\n        } else {\n          var _selection$ = _slicedToArray(selection[0], 4),\n              fromColumn = _selection$[1],\n              toColumn = _selection$[3];\n\n          if (fromColumn - toColumn !== 0) {\n            pluralForm = 1;\n          }\n        }\n      }\n\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, pluralForm);\n    },\n    callback: function callback() {\n      this.alter('remove_col', (0, _utils2.transformSelectionToColumnDistance)(this.getSelected()), null, 'ContextMenu.removeColumn');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n      var totalColumns = this.countCols();\n\n      if (!selected) {\n        return true;\n      }\n\n      return this.selection.isSelectedByRowHeader() || this.selection.isSelectedByCorner() || !this.isColumnModificationAllowed() || !totalColumns;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowRemoveColumn;\n    }\n  };\n}\n\n/***/ }),\n/* 307 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = removeRowItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _array = __webpack_require__(1);\n\nvar _utils2 = __webpack_require__(91);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'remove_row';\n\nfunction removeRowItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      var selection = this.getSelected();\n      var pluralForm = 0;\n\n      if (selection) {\n        if (selection.length > 1) {\n          pluralForm = 1;\n        } else {\n          var _selection$ = _slicedToArray(selection[0], 3),\n              fromRow = _selection$[0],\n              toRow = _selection$[2];\n\n          if (fromRow - toRow !== 0) {\n            pluralForm = 1;\n          }\n        }\n      }\n\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_ROW, pluralForm);\n    },\n    callback: function callback() {\n      this.alter('remove_row', (0, _utils2.transformSelectionToRowDistance)(this.getSelected()), null, 'ContextMenu.removeRow');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n      var totalRows = this.countRows();\n\n      if (!selected) {\n        return true;\n      }\n\n      return this.selection.isSelectedByColumnHeader() || this.selection.isSelectedByCorner() || !totalRows;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowRemoveRow;\n    }\n  };\n}\n\n/***/ }),\n/* 308 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = rowAboveItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'row_above';\n\nfunction rowAboveItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ROW_ABOVE);\n    },\n    callback: function callback(key, normalizedSelection) {\n      var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)];\n\n      this.alter('insert_row', latestSelection.start.row, 1, 'ContextMenu.rowAbove');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n\n      return this.selection.isSelectedByColumnHeader() || this.countRows() >= this.getSettings().maxRows;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowInsertRow;\n    }\n  };\n}\n\n/***/ }),\n/* 309 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = rowBelowItem;\n\nvar _utils = __webpack_require__(19);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'row_below';\n\nfunction rowBelowItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_ROW_BELOW);\n    },\n    callback: function callback(key, normalizedSelection) {\n      var latestSelection = normalizedSelection[Math.max(normalizedSelection.length - 1, 0)];\n\n      this.alter('insert_row', latestSelection.end.row + 1, 1, 'ContextMenu.rowBelow');\n    },\n    disabled: function disabled() {\n      var selected = (0, _utils.getValidSelection)(this);\n\n      if (!selected) {\n        return true;\n      }\n\n      return this.selection.isSelectedByColumnHeader() || this.countRows() >= this.getSettings().maxRows;\n    },\n    hidden: function hidden() {\n      return !this.getSettings().allowInsertRow;\n    }\n  };\n}\n\n/***/ }),\n/* 310 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.KEY = undefined;\nexports.default = undoItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar KEY = exports.KEY = 'undo';\n\nfunction undoItem() {\n  return {\n    key: KEY,\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_UNDO);\n    },\n    callback: function callback() {\n      this.undo();\n    },\n    disabled: function disabled() {\n      return this.undoRedo && !this.undoRedo.isUndoAvailable();\n    }\n  };\n}\n\n/***/ }),\n/* 311 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _core = __webpack_require__(88);\n\nvar _core2 = _interopRequireDefault(_core);\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _cursor = __webpack_require__(312);\n\nvar _cursor2 = _interopRequireDefault(_cursor);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _object = __webpack_require__(2);\n\nvar _mixed = __webpack_require__(16);\n\nvar _function = __webpack_require__(42);\n\nvar _utils = __webpack_require__(19);\n\nvar _unicode = __webpack_require__(21);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nvar _predefinedItems = __webpack_require__(94);\n\nvar _event = __webpack_require__(12);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar MIN_WIDTH = 215;\n\n/**\n * @class Menu\n * @plugin ContextMenu\n */\n\nvar Menu = function () {\n  function Menu(hotInstance, options) {\n    _classCallCheck(this, Menu);\n\n    this.hot = hotInstance;\n    this.options = options || {\n      parent: null,\n      name: null,\n      className: '',\n      keepInViewport: true,\n      standalone: false,\n      minWidth: MIN_WIDTH\n    };\n    this.eventManager = new _eventManager2.default(this);\n    this.container = this.createContainer(this.options.name);\n    this.hotMenu = null;\n    this.hotSubMenus = {};\n    this.parentMenu = this.options.parent || null;\n    this.menuItems = null;\n    this.origOutsideClickDeselects = null;\n    this.keyEvent = false;\n\n    this.offset = {\n      above: 0,\n      below: 0,\n      left: 0,\n      right: 0\n    };\n    this._afterScrollCallback = null;\n\n    this.registerEvents();\n  }\n\n  /**\n   * Register event listeners.\n   *\n   * @private\n   */\n\n\n  _createClass(Menu, [{\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this = this;\n\n      this.eventManager.addEventListener(document.documentElement, 'mousedown', function (event) {\n        return _this.onDocumentMouseDown(event);\n      });\n    }\n\n    /**\n     * Set array of objects which defines menu items.\n     *\n     * @param {Array} menuItems Menu items to display.\n     */\n\n  }, {\n    key: 'setMenuItems',\n    value: function setMenuItems(menuItems) {\n      this.menuItems = menuItems;\n    }\n\n    /**\n     * Set offset menu position for specified area (`above`, `below`, `left` or `right`).\n     *\n     * @param {String} area Specified area name (`above`, `below`, `left` or `right`).\n     * @param {Number} offset Offset value.\n     */\n\n  }, {\n    key: 'setOffset',\n    value: function setOffset(area) {\n      var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n      this.offset[area] = offset;\n    }\n\n    /**\n     * Check if menu is using as sub-menu.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isSubMenu',\n    value: function isSubMenu() {\n      return this.parentMenu !== null;\n    }\n\n    /**\n     * Open menu.\n     *\n     * @fires Hooks#beforeContextMenuShow\n     * @fires Hooks#afterContextMenuShow\n     */\n\n  }, {\n    key: 'open',\n    value: function open() {\n      var _this2 = this;\n\n      this.runLocalHooks('beforeOpen');\n\n      this.container.removeAttribute('style');\n      this.container.style.display = 'block';\n\n      var delayedOpenSubMenu = (0, _function.debounce)(function (row) {\n        return _this2.openSubMenu(row);\n      }, 300);\n      var minWidthOfMenu = this.options.minWidth || MIN_WIDTH;\n\n      var filteredItems = (0, _array.arrayFilter)(this.menuItems, function (item) {\n        return (0, _utils.isItemHidden)(item, _this2.hot);\n      });\n\n      filteredItems = (0, _utils.filterSeparators)(filteredItems, _predefinedItems.SEPARATOR);\n\n      var settings = {\n        data: filteredItems,\n        colHeaders: false,\n        autoColumnSize: true,\n        modifyColWidth: function modifyColWidth(width) {\n          if ((0, _mixed.isDefined)(width) && width < minWidthOfMenu) {\n            return minWidthOfMenu;\n          }\n\n          return width;\n        },\n\n        autoRowSize: false,\n        readOnly: true,\n        copyPaste: false,\n        columns: [{\n          data: 'name',\n          renderer: function renderer(hot, TD, row, col, prop, value) {\n            return _this2.menuItemRenderer(hot, TD, row, col, prop, value);\n          }\n        }],\n        renderAllRows: true,\n        fragmentSelection: 'cell',\n        disableVisualSelection: 'area',\n        beforeKeyDown: function beforeKeyDown(event) {\n          return _this2.onBeforeKeyDown(event);\n        },\n        afterOnCellMouseOver: function afterOnCellMouseOver(event, coords, TD) {\n          if (_this2.isAllSubMenusClosed()) {\n            delayedOpenSubMenu(coords.row);\n          } else {\n            _this2.openSubMenu(coords.row);\n          }\n        },\n        rowHeights: function rowHeights(row) {\n          return filteredItems[row].name === _predefinedItems.SEPARATOR ? 1 : 23;\n        }\n      };\n      this.origOutsideClickDeselects = this.hot.getSettings().outsideClickDeselects;\n      this.hot.getSettings().outsideClickDeselects = false;\n      this.hotMenu = new _core2.default(this.container, settings);\n      this.hotMenu.addHook('afterInit', function () {\n        return _this2.onAfterInit();\n      });\n      this.hotMenu.addHook('afterSelection', function () {\n        return _this2.onAfterSelection.apply(_this2, arguments);\n      });\n      this.hotMenu.init();\n      this.hotMenu.listen();\n      this.blockMainTableCallbacks();\n      this.runLocalHooks('afterOpen');\n    }\n\n    /**\n     * Close menu.\n     *\n     * @param {Boolean} [closeParent=false] if `true` try to close parent menu if exists.\n     */\n\n  }, {\n    key: 'close',\n    value: function close() {\n      var closeParent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (!this.isOpened()) {\n        return;\n      }\n      if (closeParent && this.parentMenu) {\n        this.parentMenu.close();\n      } else {\n        this.closeAllSubMenus();\n        this.container.style.display = 'none';\n        this.releaseMainTableCallbacks();\n        this.hotMenu.destroy();\n        this.hotMenu = null;\n        this.hot.getSettings().outsideClickDeselects = this.origOutsideClickDeselects;\n        this.runLocalHooks('afterClose');\n\n        if (this.parentMenu) {\n          this.parentMenu.hotMenu.listen();\n        }\n      }\n    }\n\n    /**\n     * Open sub menu at the provided row index.\n     *\n     * @param {Number} row Row index.\n     * @returns {Menu|Boolean} Returns created menu or `false` if no one menu was created.\n     */\n\n  }, {\n    key: 'openSubMenu',\n    value: function openSubMenu(row) {\n      if (!this.hotMenu) {\n        return false;\n      }\n      var cell = this.hotMenu.getCell(row, 0);\n\n      this.closeAllSubMenus();\n\n      if (!cell || !(0, _utils.hasSubMenu)(cell)) {\n        return false;\n      }\n      var dataItem = this.hotMenu.getSourceDataAtRow(row);\n      var subMenu = new Menu(this.hot, {\n        parent: this,\n        name: dataItem.name,\n        className: this.options.className,\n        keepInViewport: true\n      });\n      subMenu.setMenuItems(dataItem.submenu.items);\n      subMenu.open();\n      subMenu.setPosition(cell.getBoundingClientRect());\n      this.hotSubMenus[dataItem.key] = subMenu;\n\n      return subMenu;\n    }\n\n    /**\n     * Close sub menu at row index.\n     *\n     * @param {Number} row Row index.\n     */\n\n  }, {\n    key: 'closeSubMenu',\n    value: function closeSubMenu(row) {\n      var dataItem = this.hotMenu.getSourceDataAtRow(row);\n      var menus = this.hotSubMenus[dataItem.key];\n\n      if (menus) {\n        menus.destroy();\n        delete this.hotSubMenus[dataItem.key];\n      }\n    }\n\n    /**\n     * Close all opened sub menus.\n     */\n\n  }, {\n    key: 'closeAllSubMenus',\n    value: function closeAllSubMenus() {\n      var _this3 = this;\n\n      (0, _array.arrayEach)(this.hotMenu.getData(), function (value, row) {\n        return _this3.closeSubMenu(row);\n      });\n    }\n\n    /**\n     * Checks if all created and opened sub menus are closed.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isAllSubMenusClosed',\n    value: function isAllSubMenusClosed() {\n      return Object.keys(this.hotSubMenus).length === 0;\n    }\n\n    /**\n     * Destroy instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.clearLocalHooks();\n      this.close();\n      this.parentMenu = null;\n      this.eventManager.destroy();\n    }\n\n    /**\n     * Checks if menu was opened.\n     *\n     * @returns {Boolean} Returns `true` if menu was opened.\n     */\n\n  }, {\n    key: 'isOpened',\n    value: function isOpened() {\n      return this.hotMenu !== null;\n    }\n\n    /**\n     * Execute menu command.\n     *\n     * @param {Event} [event]\n     */\n\n  }, {\n    key: 'executeCommand',\n    value: function executeCommand(event) {\n      if (!this.isOpened() || !this.hotMenu.getSelectedLast()) {\n        return;\n      }\n      var selectedItem = this.hotMenu.getSourceDataAtRow(this.hotMenu.getSelectedLast()[0]);\n\n      this.runLocalHooks('select', selectedItem, event);\n\n      if (selectedItem.isCommand === false || selectedItem.name === _predefinedItems.SEPARATOR) {\n        return;\n      }\n      var selRanges = this.hot.getSelectedRange();\n      var normalizedSelection = selRanges ? (0, _utils.normalizeSelection)(selRanges) : [];\n      var autoClose = true;\n\n      // Don't close context menu if item is disabled or it has submenu\n      if (selectedItem.disabled === true || typeof selectedItem.disabled === 'function' && selectedItem.disabled.call(this.hot) === true || selectedItem.submenu) {\n        autoClose = false;\n      }\n\n      this.runLocalHooks('executeCommand', selectedItem.key, normalizedSelection, event);\n\n      if (this.isSubMenu()) {\n        this.parentMenu.runLocalHooks('executeCommand', selectedItem.key, normalizedSelection, event);\n      }\n\n      if (autoClose) {\n        this.close(true);\n      }\n    }\n\n    /**\n     * Set menu position based on dom event or based on literal object.\n     *\n     * @param {Event|Object} coords Event or literal Object with coordinates.\n     */\n\n  }, {\n    key: 'setPosition',\n    value: function setPosition(coords) {\n      var cursor = new _cursor2.default(coords);\n\n      if (this.options.keepInViewport) {\n        if (cursor.fitsBelow(this.container)) {\n          this.setPositionBelowCursor(cursor);\n        } else if (cursor.fitsAbove(this.container)) {\n          this.setPositionAboveCursor(cursor);\n        } else {\n          this.setPositionBelowCursor(cursor);\n        }\n        if (cursor.fitsOnRight(this.container)) {\n          this.setPositionOnRightOfCursor(cursor);\n        } else {\n          this.setPositionOnLeftOfCursor(cursor);\n        }\n      } else {\n        this.setPositionBelowCursor(cursor);\n        this.setPositionOnRightOfCursor(cursor);\n      }\n    }\n\n    /**\n     * Set menu position above cursor object.\n     *\n     * @param {Cursor} cursor `Cursor` object.\n     */\n\n  }, {\n    key: 'setPositionAboveCursor',\n    value: function setPositionAboveCursor(cursor) {\n      var top = this.offset.above + cursor.top - this.container.offsetHeight;\n\n      if (this.isSubMenu()) {\n        top = cursor.top + cursor.cellHeight - this.container.offsetHeight + 3;\n      }\n      this.container.style.top = top + 'px';\n    }\n\n    /**\n     * Set menu position below cursor object.\n     *\n     * @param {Cursor} cursor `Cursor` object.\n     */\n\n  }, {\n    key: 'setPositionBelowCursor',\n    value: function setPositionBelowCursor(cursor) {\n      var top = this.offset.below + cursor.top;\n\n      if (this.isSubMenu()) {\n        top = cursor.top - 1;\n      }\n      this.container.style.top = top + 'px';\n    }\n\n    /**\n     * Set menu position on the right of cursor object.\n     *\n     * @param {Cursor} cursor `Cursor` object.\n     */\n\n  }, {\n    key: 'setPositionOnRightOfCursor',\n    value: function setPositionOnRightOfCursor(cursor) {\n      var left = void 0;\n\n      if (this.isSubMenu()) {\n        left = 1 + cursor.left + cursor.cellWidth;\n      } else {\n        left = this.offset.right + 1 + cursor.left;\n      }\n\n      this.container.style.left = left + 'px';\n    }\n\n    /**\n     * Set menu position on the left of cursor object.\n     *\n     * @param {Cursor} cursor `Cursor` object.\n     */\n\n  }, {\n    key: 'setPositionOnLeftOfCursor',\n    value: function setPositionOnLeftOfCursor(cursor) {\n      var left = this.offset.left + cursor.left - this.container.offsetWidth + (0, _element.getScrollbarWidth)() + 4;\n\n      this.container.style.left = left + 'px';\n    }\n\n    /**\n     * Select first cell in opened menu.\n     */\n\n  }, {\n    key: 'selectFirstCell',\n    value: function selectFirstCell() {\n      var cell = this.hotMenu.getCell(0, 0);\n\n      if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {\n        this.selectNextCell(0, 0);\n      } else {\n        this.hotMenu.selectCell(0, 0);\n      }\n    }\n\n    /**\n     * Select last cell in opened menu.\n     */\n\n  }, {\n    key: 'selectLastCell',\n    value: function selectLastCell() {\n      var lastRow = this.hotMenu.countRows() - 1;\n      var cell = this.hotMenu.getCell(lastRow, 0);\n\n      if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {\n        this.selectPrevCell(lastRow, 0);\n      } else {\n        this.hotMenu.selectCell(lastRow, 0);\n      }\n    }\n\n    /**\n     * Select next cell in opened menu.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} col Column index.\n     */\n\n  }, {\n    key: 'selectNextCell',\n    value: function selectNextCell(row, col) {\n      var nextRow = row + 1;\n      var cell = nextRow < this.hotMenu.countRows() ? this.hotMenu.getCell(nextRow, col) : null;\n\n      if (!cell) {\n        return;\n      }\n      if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {\n        this.selectNextCell(nextRow, col);\n      } else {\n        this.hotMenu.selectCell(nextRow, col);\n      }\n    }\n\n    /**\n     * Select previous cell in opened menu.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} col Column index.\n     */\n\n  }, {\n    key: 'selectPrevCell',\n    value: function selectPrevCell(row, col) {\n      var prevRow = row - 1;\n      var cell = prevRow >= 0 ? this.hotMenu.getCell(prevRow, col) : null;\n\n      if (!cell) {\n        return;\n      }\n      if ((0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {\n        this.selectPrevCell(prevRow, col);\n      } else {\n        this.hotMenu.selectCell(prevRow, col);\n      }\n    }\n\n    /**\n     * Menu item renderer.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'menuItemRenderer',\n    value: function menuItemRenderer(hot, TD, row, col, prop, value) {\n      var _this4 = this;\n\n      var item = hot.getSourceDataAtRow(row);\n      var wrapper = document.createElement('div');\n\n      var isSubMenu = function isSubMenu(item) {\n        return (0, _object.hasOwnProperty)(item, 'submenu');\n      };\n      var itemIsSeparator = function itemIsSeparator(item) {\n        return new RegExp(_predefinedItems.SEPARATOR, 'i').test(item.name);\n      };\n      var itemIsDisabled = function itemIsDisabled(item) {\n        return item.disabled === true || typeof item.disabled == 'function' && item.disabled.call(_this4.hot) === true;\n      };\n      var itemIsSelectionDisabled = function itemIsSelectionDisabled(item) {\n        return item.disableSelection;\n      };\n\n      if (typeof value === 'function') {\n        value = value.call(this.hot);\n      }\n      (0, _element.empty)(TD);\n      (0, _element.addClass)(wrapper, 'htItemWrapper');\n      TD.appendChild(wrapper);\n\n      if (itemIsSeparator(item)) {\n        (0, _element.addClass)(TD, 'htSeparator');\n      } else if (typeof item.renderer === 'function') {\n        (0, _element.addClass)(TD, 'htCustomMenuRenderer');\n        TD.appendChild(item.renderer(hot, wrapper, row, col, prop, value));\n      } else {\n        (0, _element.fastInnerHTML)(wrapper, value);\n      }\n      if (itemIsDisabled(item)) {\n        (0, _element.addClass)(TD, 'htDisabled');\n        this.eventManager.addEventListener(TD, 'mouseenter', function () {\n          return hot.deselectCell();\n        });\n      } else if (itemIsSelectionDisabled(item)) {\n        (0, _element.addClass)(TD, 'htSelectionDisabled');\n        this.eventManager.addEventListener(TD, 'mouseenter', function () {\n          return hot.deselectCell();\n        });\n      } else if (isSubMenu(item)) {\n        (0, _element.addClass)(TD, 'htSubmenu');\n\n        if (itemIsSelectionDisabled(item)) {\n          this.eventManager.addEventListener(TD, 'mouseenter', function () {\n            return hot.deselectCell();\n          });\n        } else {\n          this.eventManager.addEventListener(TD, 'mouseenter', function () {\n            return hot.selectCell(row, col, void 0, void 0, false, false);\n          });\n        }\n      } else {\n        (0, _element.removeClass)(TD, 'htSubmenu');\n        (0, _element.removeClass)(TD, 'htDisabled');\n\n        if (itemIsSelectionDisabled(item)) {\n          this.eventManager.addEventListener(TD, 'mouseenter', function () {\n            return hot.deselectCell();\n          });\n        } else {\n          this.eventManager.addEventListener(TD, 'mouseenter', function () {\n            return hot.selectCell(row, col, void 0, void 0, false, false);\n          });\n        }\n      }\n    }\n\n    /**\n     * Create container/wrapper for handsontable.\n     *\n     * @private\n     * @param {String} [name] Class name.\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'createContainer',\n    value: function createContainer() {\n      var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      var container = void 0;\n\n      if (name) {\n        if ((0, _function.isFunction)(name)) {\n          name = name.call(this.hot);\n\n          if (name === null || (0, _mixed.isUndefined)(name)) {\n            name = '';\n          } else {\n            name = name.toString();\n          }\n        }\n\n        name = name.replace(/[^A-z0-9]/g, '_');\n        name = this.options.className + 'Sub_' + name;\n\n        container = document.querySelector('.' + this.options.className + '.' + name);\n      } else {\n        container = document.querySelector('.' + this.options.className);\n      }\n\n      if (!container) {\n        container = document.createElement('div');\n\n        (0, _element.addClass)(container, 'htMenu ' + this.options.className);\n\n        if (name) {\n          (0, _element.addClass)(container, name);\n        }\n        document.getElementsByTagName('body')[0].appendChild(container);\n      }\n\n      return container;\n    }\n\n    /**\n     * @private\n     */\n\n  }, {\n    key: 'blockMainTableCallbacks',\n    value: function blockMainTableCallbacks() {\n      this._afterScrollCallback = function () {};\n      this.hot.addHook('afterScrollVertically', this._afterScrollCallback);\n      this.hot.addHook('afterScrollHorizontally', this._afterScrollCallback);\n    }\n\n    /**\n     * @private\n     */\n\n  }, {\n    key: 'releaseMainTableCallbacks',\n    value: function releaseMainTableCallbacks() {\n      if (this._afterScrollCallback) {\n        this.hot.removeHook('afterScrollVertically', this._afterScrollCallback);\n        this.hot.removeHook('afterScrollHorizontally', this._afterScrollCallback);\n        this._afterScrollCallback = null;\n      }\n    }\n\n    /**\n     * On before key down listener.\n     *\n     * @private\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onBeforeKeyDown',\n    value: function onBeforeKeyDown(event) {\n      var selection = this.hotMenu.getSelectedLast();\n      var stopEvent = false;\n      this.keyEvent = true;\n\n      switch (event.keyCode) {\n        case _unicode.KEY_CODES.ESCAPE:\n          this.close();\n          stopEvent = true;\n          break;\n\n        case _unicode.KEY_CODES.ENTER:\n          if (selection) {\n            if (this.hotMenu.getSourceDataAtRow(selection[0]).submenu) {\n              stopEvent = true;\n            } else {\n              this.executeCommand(event);\n              this.close(true);\n            }\n          }\n          break;\n\n        case _unicode.KEY_CODES.ARROW_DOWN:\n          if (selection) {\n            this.selectNextCell(selection[0], selection[1]);\n          } else {\n            this.selectFirstCell();\n          }\n          stopEvent = true;\n          break;\n\n        case _unicode.KEY_CODES.ARROW_UP:\n          if (selection) {\n            this.selectPrevCell(selection[0], selection[1]);\n          } else {\n            this.selectLastCell();\n          }\n          stopEvent = true;\n          break;\n\n        case _unicode.KEY_CODES.ARROW_RIGHT:\n          if (selection) {\n            var menu = this.openSubMenu(selection[0]);\n\n            if (menu) {\n              menu.selectFirstCell();\n            }\n          }\n          stopEvent = true;\n\n          break;\n\n        case _unicode.KEY_CODES.ARROW_LEFT:\n          if (selection && this.isSubMenu()) {\n            this.close();\n\n            if (this.parentMenu) {\n              this.parentMenu.hotMenu.listen();\n            }\n            stopEvent = true;\n          }\n          break;\n        default:\n          break;\n      }\n      if (stopEvent) {\n        event.preventDefault();\n        (0, _event.stopImmediatePropagation)(event);\n      }\n\n      this.keyEvent = false;\n    }\n\n    /**\n     * On after init listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      var data = this.hotMenu.getSettings().data;\n      var hiderStyle = this.hotMenu.view.wt.wtTable.hider.style;\n      var holderStyle = this.hotMenu.view.wt.wtTable.holder.style;\n      var currentHiderWidth = parseInt(hiderStyle.width, 10);\n\n      var realHeight = (0, _array.arrayReduce)(data, function (accumulator, value) {\n        return accumulator + (value.name === _predefinedItems.SEPARATOR ? 1 : 26);\n      }, 0);\n\n      holderStyle.width = currentHiderWidth + 22 + 'px';\n      holderStyle.height = realHeight + 4 + 'px';\n      hiderStyle.height = holderStyle.height;\n    }\n\n    /**\n     * On after selection listener.\n     *\n     * @param {Number} r Selection start row index.\n     * @param {Number} c Selection start column index.\n     * @param {Number} r2 Selection end row index.\n     * @param {Number} c2 Selection end column index.\n     * @param {Object} preventScrolling Object with `value` property where its value change will be observed.\n     * @param {Number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n     */\n\n  }, {\n    key: 'onAfterSelection',\n    value: function onAfterSelection(r, c, r2, c2, preventScrolling) {\n      if (this.keyEvent === false) {\n        preventScrolling.value = true;\n      }\n    }\n\n    /**\n     * Document mouse down listener.\n     *\n     * @private\n     * @param {Event} event\n     */\n\n  }, {\n    key: 'onDocumentMouseDown',\n    value: function onDocumentMouseDown(event) {\n      if (!this.isOpened()) {\n        return;\n      }\n      if (this.container && (0, _element.isChildOf)(event.target, this.container)) {\n        this.executeCommand(event);\n      }\n      // Close menu when clicked element is not belongs to menu itself\n      if (this.options.standalone && this.hotMenu && !(0, _element.isChildOf)(event.target, this.hotMenu.rootElement)) {\n        this.close(true);\n\n        // Automatically close menu when clicked element is not belongs to menu or submenu (not necessarily to itself)\n      } else if ((this.isAllSubMenusClosed() || this.isSubMenu()) && !(0, _element.isChildOf)(event.target, '.htMenu') && (0, _element.isChildOf)(event.target, document)) {\n        this.close(true);\n      }\n    }\n  }]);\n\n  return Menu;\n}();\n\n(0, _object.mixin)(Menu, _localHooks2.default);\n\nexports.default = Menu;\n\n/***/ }),\n/* 312 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _element = __webpack_require__(0);\n\nvar _event = __webpack_require__(12);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Helper class for checking if element will fit at the desired side of cursor.\n *\n * @class Cursor\n * @plugin ContextMenu\n */\nvar Cursor = function () {\n  function Cursor(object) {\n    _classCallCheck(this, Cursor);\n\n    var windowScrollTop = (0, _element.getWindowScrollTop)();\n    var windowScrollLeft = (0, _element.getWindowScrollLeft)();\n    var top = void 0,\n        topRelative = void 0;\n    var left = void 0,\n        leftRelative = void 0;\n    var cellHeight = void 0,\n        cellWidth = void 0;\n\n    this.type = this.getSourceType(object);\n\n    if (this.type === 'literal') {\n      top = parseInt(object.top, 10);\n      left = parseInt(object.left, 10);\n      cellHeight = object.height || 0;\n      cellWidth = object.width || 0;\n      topRelative = top;\n      leftRelative = left;\n      top += windowScrollTop;\n      left += windowScrollLeft;\n    } else if (this.type === 'event') {\n      top = parseInt((0, _event.pageY)(object), 10);\n      left = parseInt((0, _event.pageX)(object), 10);\n      cellHeight = object.target.clientHeight;\n      cellWidth = object.target.clientWidth;\n      topRelative = top - windowScrollTop;\n      leftRelative = left - windowScrollLeft;\n    }\n\n    this.top = top;\n    this.topRelative = topRelative;\n    this.left = left;\n    this.leftRelative = leftRelative;\n    this.scrollTop = windowScrollTop;\n    this.scrollLeft = windowScrollLeft;\n    this.cellHeight = cellHeight;\n    this.cellWidth = cellWidth;\n  }\n\n  /**\n   * Get source type name.\n   *\n   * @param {*} object Event or Object with coordinates.\n   * @returns {String} Returns one of this values: `'literal'`, `'event'`.\n   */\n\n\n  _createClass(Cursor, [{\n    key: 'getSourceType',\n    value: function getSourceType(object) {\n      var type = 'literal';\n\n      if (object instanceof Event) {\n        type = 'event';\n      }\n\n      return type;\n    }\n\n    /**\n     * Checks if element can be placed above the cursor.\n     *\n     * @param {HTMLElement} element Element to check if it's size will fit above the cursor.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'fitsAbove',\n    value: function fitsAbove(element) {\n      return this.topRelative >= element.offsetHeight;\n    }\n\n    /**\n     * Checks if element can be placed below the cursor.\n     *\n     * @param {HTMLElement} element Element to check if it's size will fit below the cursor.\n     * @param {Number} [viewportHeight] The viewport height.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'fitsBelow',\n    value: function fitsBelow(element) {\n      var viewportHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window.innerHeight;\n\n      return this.topRelative + element.offsetHeight <= viewportHeight;\n    }\n\n    /**\n     * Checks if element can be placed on the right of the cursor.\n     *\n     * @param {HTMLElement} element Element to check if it's size will fit on the right of the cursor.\n     * @param {Number} [viewportWidth] The viewport width.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'fitsOnRight',\n    value: function fitsOnRight(element) {\n      var viewportWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window.innerWidth;\n\n      return this.leftRelative + this.cellWidth + element.offsetWidth <= viewportWidth;\n    }\n\n    /**\n     * Checks if element can be placed on the left on the cursor.\n     *\n     * @param {HTMLElement} element Element to check if it's size will fit on the left of the cursor.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'fitsOnLeft',\n    value: function fitsOnLeft(element) {\n      return this.leftRelative >= element.offsetWidth;\n    }\n  }]);\n\n  return Cursor;\n}();\n\nexports.default = Cursor;\n\n/***/ }),\n/* 313 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 314 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _SheetClip = __webpack_require__(191);\n\nvar _SheetClip2 = _interopRequireDefault(_SheetClip);\n\nvar _src = __webpack_require__(4);\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nvar _textarea = __webpack_require__(315);\n\nvar _textarea2 = _interopRequireDefault(_textarea);\n\nvar _copy = __webpack_require__(316);\n\nvar _copy2 = _interopRequireDefault(_copy);\n\nvar _cut = __webpack_require__(317);\n\nvar _cut2 = _interopRequireDefault(_cut);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _pasteEvent = __webpack_require__(318);\n\nvar _pasteEvent2 = _interopRequireDefault(_pasteEvent);\n\n__webpack_require__(320);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('afterCopyLimit');\n_pluginHooks2.default.getSingleton().register('modifyCopyableRange');\n_pluginHooks2.default.getSingleton().register('beforeCut');\n_pluginHooks2.default.getSingleton().register('afterCut');\n_pluginHooks2.default.getSingleton().register('beforePaste');\n_pluginHooks2.default.getSingleton().register('afterPaste');\n_pluginHooks2.default.getSingleton().register('beforeCopy');\n_pluginHooks2.default.getSingleton().register('afterCopy');\n\nvar ROWS_LIMIT = 1000;\nvar COLUMNS_LIMIT = 1000;\nvar privatePool = new WeakMap();\n\n/**\n * @description\n * This plugin enables the copy/paste functionality in the Handsontable.\n *\n * @example\n * ```js\n * ...\n * copyPaste: true,\n * ...\n * ```\n * @class CopyPaste\n * @plugin CopyPaste\n */\n\nvar CopyPaste = function (_BasePlugin) {\n  _inherits(CopyPaste, _BasePlugin);\n\n  function CopyPaste(hotInstance) {\n    _classCallCheck(this, CopyPaste);\n\n    /**\n     * Event manager\n     *\n     * @type {EventManager}\n     */\n    var _this = _possibleConstructorReturn(this, (CopyPaste.__proto__ || Object.getPrototypeOf(CopyPaste)).call(this, hotInstance));\n\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Maximum number of columns than can be copied to clipboard using <kbd>CTRL</kbd> + <kbd>C</kbd>.\n     *\n     * @private\n     * @type {Number}\n     * @default 1000\n     */\n    _this.columnsLimit = COLUMNS_LIMIT;\n    /**\n     * Ranges of the cells coordinates, which should be used to copy/cut/paste actions.\n     *\n     * @private\n     * @type {Array}\n     */\n    _this.copyableRanges = [];\n    /**\n     * Defines paste (<kbd>CTRL</kbd> + <kbd>V</kbd>) behavior.\n     * * Default value `\"overwrite\"` will paste clipboard value over current selection.\n     * * When set to `\"shift_down\"`, clipboard data will be pasted in place of current selection, while all selected cells are moved down.\n     * * When set to `\"shift_right\"`, clipboard data will be pasted in place of current selection, while all selected cells are moved right.\n     *\n     * @private\n     * @type {String}\n     * @default 'overwrite'\n     */\n    _this.pasteMode = 'overwrite';\n    /**\n     * Maximum number of rows than can be copied to clipboard using <kbd>CTRL</kbd> + <kbd>C</kbd>.\n     *\n     * @private\n     * @type {Number}\n     * @default 1000\n     */\n    _this.rowsLimit = ROWS_LIMIT;\n    /**\n     * The `textarea` element which is necessary to process copying, cutting off and pasting.\n     *\n     * @private\n     * @type {HTMLElement}\n     * @default undefined\n     */\n    _this.textarea = void 0;\n\n    privatePool.set(_this, {\n      isTriggeredByCopy: false,\n      isTriggeredByCut: false,\n      isBeginEditing: false,\n      isFragmentSelectionEnabled: false\n    });\n    return _this;\n  }\n\n  /**\n   * Check if plugin is enabled.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(CopyPaste, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().copyPaste;\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n      var settings = this.hot.getSettings();\n      var priv = privatePool.get(this);\n\n      this.textarea = _textarea2.default.getSingleton();\n      priv.isFragmentSelectionEnabled = settings.fragmentSelection;\n\n      if (_typeof(settings.copyPaste) === 'object') {\n        this.pasteMode = settings.copyPaste.pasteMode || this.pasteMode;\n        this.rowsLimit = settings.copyPaste.rowsLimit || this.rowsLimit;\n        this.columnsLimit = settings.copyPaste.columnsLimit || this.columnsLimit;\n      }\n\n      this.addHook('afterContextMenuDefaultOptions', function (options) {\n        return _this2.onAfterContextMenuDefaultOptions(options);\n      });\n      this.addHook('afterSelectionEnd', function () {\n        return _this2.onAfterSelectionEnd();\n      });\n\n      this.registerEvents();\n\n      _get(CopyPaste.prototype.__proto__ || Object.getPrototypeOf(CopyPaste.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(CopyPaste.prototype.__proto__ || Object.getPrototypeOf(CopyPaste.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      if (this.textarea) {\n        this.textarea.destroy();\n      }\n\n      _get(CopyPaste.prototype.__proto__ || Object.getPrototypeOf(CopyPaste.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Prepares copyable text from the cells selection in the invisible textarea.\n     *\n     * @function setCopyable\n     * @memberof CopyPaste#\n     */\n\n  }, {\n    key: 'setCopyableText',\n    value: function setCopyableText() {\n      var selRange = this.hot.getSelectedRangeLast();\n\n      if (!selRange) {\n        return;\n      }\n      var topLeft = selRange.getTopLeftCorner();\n      var bottomRight = selRange.getBottomRightCorner();\n      var startRow = topLeft.row;\n      var startCol = topLeft.col;\n      var endRow = bottomRight.row;\n      var endCol = bottomRight.col;\n      var finalEndRow = Math.min(endRow, startRow + this.rowsLimit - 1);\n      var finalEndCol = Math.min(endCol, startCol + this.columnsLimit - 1);\n\n      this.copyableRanges.length = 0;\n\n      this.copyableRanges.push({\n        startRow: startRow,\n        startCol: startCol,\n        endRow: finalEndRow,\n        endCol: finalEndCol\n      });\n\n      this.copyableRanges = this.hot.runHooks('modifyCopyableRange', this.copyableRanges);\n\n      if (endRow !== finalEndRow || endCol !== finalEndCol) {\n        this.hot.runHooks('afterCopyLimit', endRow - startRow + 1, endCol - startCol + 1, this.rowsLimit, this.columnsLimit);\n      }\n    }\n\n    /**\n     * Create copyable text releated to range objects.\n     *\n     * @since 0.19.0\n     * @param {Array} ranges Array of Objects with properties `startRow`, `endRow`, `startCol` and `endCol`.\n     * @returns {String} Returns string which will be copied into clipboard.\n     */\n\n  }, {\n    key: 'getRangedCopyableData',\n    value: function getRangedCopyableData(ranges) {\n      var _this3 = this;\n\n      var dataSet = [];\n      var copyableRows = [];\n      var copyableColumns = [];\n\n      // Count all copyable rows and columns\n      (0, _array.arrayEach)(ranges, function (range) {\n        (0, _number.rangeEach)(range.startRow, range.endRow, function (row) {\n          if (copyableRows.indexOf(row) === -1) {\n            copyableRows.push(row);\n          }\n        });\n        (0, _number.rangeEach)(range.startCol, range.endCol, function (column) {\n          if (copyableColumns.indexOf(column) === -1) {\n            copyableColumns.push(column);\n          }\n        });\n      });\n      // Concat all rows and columns data defined in ranges into one copyable string\n      (0, _array.arrayEach)(copyableRows, function (row) {\n        var rowSet = [];\n\n        (0, _array.arrayEach)(copyableColumns, function (column) {\n          rowSet.push(_this3.hot.getCopyableData(row, column));\n        });\n\n        dataSet.push(rowSet);\n      });\n\n      return _SheetClip2.default.stringify(dataSet);\n    }\n\n    /**\n     * Create copyable text releated to range objects.\n     *\n     * @since 0.31.1\n     * @param {Array} ranges Array of Objects with properties `startRow`, `startCol`, `endRow` and `endCol`.\n     * @returns {Array} Returns array of arrays which will be copied into clipboard.\n     */\n\n  }, {\n    key: 'getRangedData',\n    value: function getRangedData(ranges) {\n      var _this4 = this;\n\n      var dataSet = [];\n      var copyableRows = [];\n      var copyableColumns = [];\n\n      // Count all copyable rows and columns\n      (0, _array.arrayEach)(ranges, function (range) {\n        (0, _number.rangeEach)(range.startRow, range.endRow, function (row) {\n          if (copyableRows.indexOf(row) === -1) {\n            copyableRows.push(row);\n          }\n        });\n        (0, _number.rangeEach)(range.startCol, range.endCol, function (column) {\n          if (copyableColumns.indexOf(column) === -1) {\n            copyableColumns.push(column);\n          }\n        });\n      });\n      // Concat all rows and columns data defined in ranges into one copyable string\n      (0, _array.arrayEach)(copyableRows, function (row) {\n        var rowSet = [];\n\n        (0, _array.arrayEach)(copyableColumns, function (column) {\n          rowSet.push(_this4.hot.getCopyableData(row, column));\n        });\n\n        dataSet.push(rowSet);\n      });\n\n      return dataSet;\n    }\n\n    /**\n     * Copy action.\n     */\n\n  }, {\n    key: 'copy',\n    value: function copy() {\n      var priv = privatePool.get(this);\n\n      priv.isTriggeredByCopy = true;\n\n      this.textarea.select();\n      document.execCommand('copy');\n    }\n\n    /**\n     * Cut action.\n     */\n\n  }, {\n    key: 'cut',\n    value: function cut() {\n      var priv = privatePool.get(this);\n\n      priv.isTriggeredByCut = true;\n\n      this.textarea.select();\n      document.execCommand('cut');\n    }\n\n    /**\n     * Simulated paste action.\n     *\n     * @param {String} [value=''] New value, which should be `pasted`.\n     */\n\n  }, {\n    key: 'paste',\n    value: function paste() {\n      var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      var pasteData = new _pasteEvent2.default();\n      pasteData.clipboardData.setData('text/plain', value);\n\n      this.onPaste(pasteData);\n    }\n\n    /**\n     * Register event listeners.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this5 = this;\n\n      this.eventManager.addEventListener(this.textarea.element, 'paste', function (event) {\n        return _this5.onPaste(event);\n      });\n      this.eventManager.addEventListener(this.textarea.element, 'cut', function (event) {\n        return _this5.onCut(event);\n      });\n      this.eventManager.addEventListener(this.textarea.element, 'copy', function (event) {\n        return _this5.onCopy(event);\n      });\n    }\n\n    /**\n     * `copy` event callback on textarea element.\n     *\n     * @param {Event} event ClipboardEvent.\n     * @private\n     */\n\n  }, {\n    key: 'onCopy',\n    value: function onCopy(event) {\n      var priv = privatePool.get(this);\n\n      if (!this.hot.isListening() && !priv.isTriggeredByCopy) {\n        return;\n      }\n\n      this.setCopyableText();\n      priv.isTriggeredByCopy = false;\n\n      var rangedData = this.getRangedData(this.copyableRanges);\n      var allowCopying = !!this.hot.runHooks('beforeCopy', rangedData, this.copyableRanges);\n      var value = '';\n\n      if (allowCopying) {\n        value = _SheetClip2.default.stringify(rangedData);\n\n        if (event && event.clipboardData) {\n          event.clipboardData.setData('text/plain', value);\n        } else if (typeof ClipboardEvent === 'undefined') {\n          window.clipboardData.setData('Text', value);\n        }\n\n        this.hot.runHooks('afterCopy', rangedData, this.copyableRanges);\n      }\n\n      event.preventDefault();\n    }\n\n    /**\n     * `cut` event callback on textarea element.\n     *\n     * @param {Event} event ClipboardEvent.\n     * @private\n     */\n\n  }, {\n    key: 'onCut',\n    value: function onCut(event) {\n      var priv = privatePool.get(this);\n\n      if (!this.hot.isListening() && !priv.isTriggeredByCut) {\n        return;\n      }\n\n      this.setCopyableText();\n      priv.isTriggeredByCut = false;\n\n      var rangedData = this.getRangedData(this.copyableRanges);\n      var allowCuttingOut = !!this.hot.runHooks('beforeCut', rangedData, this.copyableRanges);\n      var value = void 0;\n\n      if (allowCuttingOut) {\n        value = _SheetClip2.default.stringify(rangedData);\n\n        if (event && event.clipboardData) {\n          event.clipboardData.setData('text/plain', value);\n        } else if (typeof ClipboardEvent === 'undefined') {\n          window.clipboardData.setData('Text', value);\n        }\n\n        this.hot.emptySelectedCells();\n        this.hot.runHooks('afterCut', rangedData, this.copyableRanges);\n      }\n\n      event.preventDefault();\n    }\n\n    /**\n     * `paste` event callback on textarea element.\n     *\n     * @param {Event} event ClipboardEvent or pseudo ClipboardEvent, if paste was called manually.\n     * @private\n     */\n\n  }, {\n    key: 'onPaste',\n    value: function onPaste(event) {\n      var _this6 = this;\n\n      if (!this.hot.isListening()) {\n        return;\n      }\n      if (event && event.preventDefault) {\n        event.preventDefault();\n      }\n\n      var inputArray = void 0;\n\n      if (event && typeof event.clipboardData !== 'undefined') {\n        this.textarea.setValue(event.clipboardData.getData('text/plain'));\n      } else if (typeof ClipboardEvent === 'undefined' && typeof window.clipboardData !== 'undefined') {\n        this.textarea.setValue(window.clipboardData.getData('Text'));\n      }\n\n      inputArray = _SheetClip2.default.parse(this.textarea.getValue());\n      this.textarea.setValue(' ');\n\n      if (inputArray.length === 0) {\n        return;\n      }\n\n      var allowPasting = !!this.hot.runHooks('beforePaste', inputArray, this.copyableRanges);\n\n      if (!allowPasting) {\n        return;\n      }\n\n      var selected = this.hot.getSelectedLast();\n      var coordsFrom = new _src.CellCoords(selected[0], selected[1]);\n      var coordsTo = new _src.CellCoords(selected[2], selected[3]);\n      var cellRange = new _src.CellRange(coordsFrom, coordsFrom, coordsTo);\n      var topLeftCorner = cellRange.getTopLeftCorner();\n      var bottomRightCorner = cellRange.getBottomRightCorner();\n      var areaStart = topLeftCorner;\n      var areaEnd = new _src.CellCoords(Math.max(bottomRightCorner.row, inputArray.length - 1 + topLeftCorner.row), Math.max(bottomRightCorner.col, inputArray[0].length - 1 + topLeftCorner.col));\n\n      var isSelRowAreaCoverInputValue = coordsTo.row - coordsFrom.row >= inputArray.length - 1;\n      var isSelColAreaCoverInputValue = coordsTo.col - coordsFrom.col >= inputArray[0].length - 1;\n\n      this.hot.addHookOnce('afterChange', function (changes) {\n        var changesLength = changes ? changes.length : 0;\n\n        if (changesLength) {\n          var offset = { row: 0, col: 0 };\n          var highestColumnIndex = -1;\n\n          (0, _array.arrayEach)(changes, function (change, index) {\n            var nextChange = changesLength > index + 1 ? changes[index + 1] : null;\n\n            if (nextChange) {\n              if (!isSelRowAreaCoverInputValue) {\n                offset.row += Math.max(nextChange[0] - change[0] - 1, 0);\n              }\n              if (!isSelColAreaCoverInputValue && change[1] > highestColumnIndex) {\n                highestColumnIndex = change[1];\n                offset.col += Math.max(nextChange[1] - change[1] - 1, 0);\n              }\n            }\n          });\n          _this6.hot.selectCell(areaStart.row, areaStart.col, areaEnd.row + offset.row, areaEnd.col + offset.col);\n        }\n      });\n\n      this.hot.populateFromArray(areaStart.row, areaStart.col, inputArray, areaEnd.row, areaEnd.col, 'CopyPaste.paste', this.pasteMode);\n      this.hot.runHooks('afterPaste', inputArray, this.copyableRanges);\n    }\n\n    /**\n     * Add copy, cut and paste options to the Context Menu.\n     *\n     * @private\n     * @param {Object} options Contains default added options of the Context Menu.\n     */\n\n  }, {\n    key: 'onAfterContextMenuDefaultOptions',\n    value: function onAfterContextMenuDefaultOptions(options) {\n      options.items.push({\n        name: '---------'\n      }, (0, _copy2.default)(this), (0, _cut2.default)(this));\n    }\n\n    /**\n     * We have to keep focus on textarea element, to make possible use of the browser tools (copy, cut, paste).\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterSelectionEnd',\n    value: function onAfterSelectionEnd() {\n      var priv = privatePool.get(this);\n      var editor = this.hot.getActiveEditor();\n\n      if (editor && typeof editor.isOpened !== 'undefined' && editor.isOpened()) {\n        return;\n      }\n      if (priv.isFragmentSelectionEnabled && !this.textarea.isActive() && (0, _element.getSelectionText)()) {\n        return;\n      }\n\n      this.setCopyableText();\n      this.textarea.select();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.textarea) {\n        this.textarea.destroy();\n      }\n\n      _get(CopyPaste.prototype.__proto__ || Object.getPrototypeOf(CopyPaste.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return CopyPaste;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('CopyPaste', CopyPaste);\n\nexports.default = CopyPaste;\n\n/***/ }),\n/* 315 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class Textarea\n *\n * @plugin CopyPaste\n */\nvar Textarea = function () {\n  _createClass(Textarea, null, [{\n    key: 'getSingleton',\n    value: function getSingleton() {\n      globalSingleton.append();\n\n      return globalSingleton;\n    }\n  }]);\n\n  function Textarea() {\n    _classCallCheck(this, Textarea);\n\n    /**\n     * Main textarea element.\n     *\n     * @type {HTMLElement}\n     */\n    this.element = void 0;\n    /**\n     * Store information about append to the document.body.\n     *\n     * @type {Boolean}\n     */\n    this.isAppended = false;\n    /**\n     * Reference counter.\n     *\n     * @type {Number}\n     */\n    this.refCounter = 0;\n  }\n\n  /**\n   * Apends textarea element to the `body`\n   */\n\n\n  _createClass(Textarea, [{\n    key: 'append',\n    value: function append() {\n      if (this.hasBeenDestroyed()) {\n        this.create();\n      }\n\n      this.refCounter++;\n\n      if (!this.isAppended && document.body) {\n        if (document.body) {\n          this.isAppended = true;\n          document.body.appendChild(this.element);\n        }\n      }\n    }\n\n    /**\n     * Prepares textarea element with proper attributes.\n     */\n\n  }, {\n    key: 'create',\n    value: function create() {\n      this.element = document.createElement('textarea');\n      this.element.id = 'HandsontableCopyPaste';\n      this.element.className = 'copyPaste';\n      this.element.tabIndex = -1;\n      this.element.autocomplete = 'off';\n      this.element.wrap = 'hard';\n      this.element.value = ' ';\n    }\n\n    /**\n     * Deselects textarea element if is active.\n     */\n\n  }, {\n    key: 'deselect',\n    value: function deselect() {\n      if (this.element === document.activeElement) {\n        document.activeElement.blur();\n      }\n    }\n\n    /**\n     * Destroy instance\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.refCounter--;\n      this.refCounter = this.refCounter < 0 ? 0 : this.refCounter;\n\n      if (this.hasBeenDestroyed() && this.element && this.element.parentNode) {\n        this.element.parentNode.removeChild(this.element);\n        this.element = null;\n        this.isAppended = false;\n      }\n    }\n\n    /**\n     * Getter for the element.\n     *\n     * @returns {String}\n     */\n\n  }, {\n    key: 'getValue',\n    value: function getValue() {\n      return this.element.value;\n    }\n\n    /**\n     * Check if instance has been destroyed\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'hasBeenDestroyed',\n    value: function hasBeenDestroyed() {\n      return this.refCounter < 1;\n    }\n\n    /**\n     * Check if the element is an active element in frame.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isActive',\n    value: function isActive() {\n      return this.element === document.activeElement;\n    }\n\n    /**\n     * Sets focus on the element and select content.\n     */\n\n  }, {\n    key: 'select',\n    value: function select() {\n      this.element.focus();\n      this.element.select();\n    }\n\n    /**\n     * Setter for the element.\n     *\n     * @param {String} data Value which should be insert into the element.\n     */\n\n  }, {\n    key: 'setValue',\n    value: function setValue(data) {\n      this.element.value = data;\n    }\n  }]);\n\n  return Textarea;\n}();\n\nvar globalSingleton = new Textarea();\n\nexports.default = Textarea;\n\n/***/ }),\n/* 316 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = copyItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction copyItem(copyPastePlugin) {\n  return {\n    key: 'copy',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_COPY);\n    },\n    callback: function callback() {\n      copyPastePlugin.copy();\n    },\n    disabled: function disabled() {\n      var selected = this.getSelected();\n\n      if (!selected || selected.length > 1) {\n        return true;\n      }\n\n      return false;\n    },\n\n    hidden: false\n  };\n}\n\n/***/ }),\n/* 317 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = cutItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction cutItem(copyPastePlugin) {\n  return {\n    key: 'cut',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_CUT);\n    },\n    callback: function callback() {\n      copyPastePlugin.cut();\n    },\n    disabled: function disabled() {\n      var selected = this.getSelected();\n\n      if (!selected || selected.length > 1) {\n        return true;\n      }\n\n      return false;\n    },\n\n    hidden: false\n  };\n}\n\n/***/ }),\n/* 318 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _clipboardData = __webpack_require__(319);\n\nvar _clipboardData2 = _interopRequireDefault(_clipboardData);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar PasteEvent = function PasteEvent() {\n  _classCallCheck(this, PasteEvent);\n\n  this.clipboardData = new _clipboardData2.default();\n};\n\nexports.default = PasteEvent;\n\n/***/ }),\n/* 319 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ClipboardData = function () {\n  function ClipboardData() {\n    _classCallCheck(this, ClipboardData);\n\n    this.data = {};\n  }\n\n  _createClass(ClipboardData, [{\n    key: \"setData\",\n    value: function setData(type, value) {\n      this.data[type] = value;\n    }\n  }, {\n    key: \"getData\",\n    value: function getData(type) {\n      return this.data[type] || void 0;\n    }\n  }]);\n\n  return ClipboardData;\n}();\n\nexports.default = ClipboardData;\n\n/***/ }),\n/* 320 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 321 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _src = __webpack_require__(4);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _bottom = __webpack_require__(322);\n\nvar _bottom2 = _interopRequireDefault(_bottom);\n\nvar _left = __webpack_require__(323);\n\nvar _left2 = _interopRequireDefault(_left);\n\nvar _noBorders = __webpack_require__(324);\n\nvar _noBorders2 = _interopRequireDefault(_noBorders);\n\nvar _right = __webpack_require__(325);\n\nvar _right2 = _interopRequireDefault(_right);\n\nvar _top = __webpack_require__(326);\n\nvar _top2 = _interopRequireDefault(_top);\n\nvar _utils = __webpack_require__(47);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @plugin CustomBorders\n *\n * @description\n * This plugin enables an option to apply custom borders through the context menu (configurable with context menu key `borders`).\n *\n * To initialize Handsontable with predefined custom borders, provide cell coordinates and border styles in a form of an array.\n *\n * See [Custom Borders](http://docs.handsontable.com/demo-custom-borders.html) demo for more examples.\n *\n * @example\n * ```js\n * ...\n * customBorders: [\n *   {\n *    range: {\n *      from: {\n *        row: 1,\n *        col: 1\n *      },\n *      to: {\n *        row: 3,\n *        col: 4\n *      },\n *    },\n *    left: {},\n *    right: {},\n *    top: {},\n *    bottom: {},\n *   },\n * ],\n * ...\n *\n * // or\n * ...\n * customBorders: [\n *   { row: 2,\n *     col: 2,\n *     left: {\n *       width: 2,\n *       color: 'red',\n *     },\n *     right: {\n *       width: 1,\n *       color: 'green',\n *     },\n *     top: '',\n *     bottom: '',\n *   }.\n * ],\n * ...\n * ```\n * @private\n * @class CustomBorders\n */\nvar CustomBorders = function (_BasePlugin) {\n  _inherits(CustomBorders, _BasePlugin);\n\n  function CustomBorders(hotInstance) {\n    _classCallCheck(this, CustomBorders);\n\n    /**\n     * Saved borders settings.\n     *\n     * @type {Array}\n     */\n    var _this = _possibleConstructorReturn(this, (CustomBorders.__proto__ || Object.getPrototypeOf(CustomBorders)).call(this, hotInstance));\n\n    _this.savedBorderSettings = void 0;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(CustomBorders, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().customBorders;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('afterContextMenuDefaultOptions', function (options) {\n        return _this2.onAfterContextMenuDefaultOptions(options);\n      });\n      this.addHook('afterInit', function () {\n        return _this2.onAfterInit();\n      });\n\n      _get(CustomBorders.prototype.__proto__ || Object.getPrototypeOf(CustomBorders.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.clearBorders();\n\n      _get(CustomBorders.prototype.__proto__ || Object.getPrototypeOf(CustomBorders.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      this.changeBorderSettings();\n\n      _get(CustomBorders.prototype.__proto__ || Object.getPrototypeOf(CustomBorders.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Get index of border from the settings.\n     *\n     * @param {String} className Class name as string.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getSettingIndex',\n    value: function getSettingIndex(className) {\n      var index = -1;\n\n      (0, _array.arrayEach)(this.hot.selection.highlight.borders, function (selection, i) {\n        if (selection.settings.className === className) {\n          index = i;\n\n          return false;\n        }\n      });\n\n      return index;\n    }\n\n    /**\n     * Insert WalkontableSelection instance into Walkontable settings.\n     *\n     * @param {Object} border Object with `row` and `col`, `left`, `right`, `top` and `bottom`, `className` and `border` ({Object} with `color`, `width` and `cornerVisible` property) properties.\n     */\n\n  }, {\n    key: 'insertBorderIntoSettings',\n    value: function insertBorderIntoSettings(border) {\n      var coordinates = {\n        row: border.row,\n        col: border.col\n      };\n      var selection = new _src.Selection(border, new _src.CellRange(coordinates, coordinates, coordinates));\n      var index = this.getSettingIndex(border.className);\n\n      if (index >= 0) {\n        this.hot.selection.highlight.borders[index] = selection;\n      } else {\n        this.hot.selection.highlight.borders.push(selection);\n      }\n    }\n\n    /**\n     * Prepare borders from setting (single cell).\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {Object} borderObj Object with `row` and `col`, `left`, `right`, `top` and `bottom` properties.\n     */\n\n  }, {\n    key: 'prepareBorderFromCustomAdded',\n    value: function prepareBorderFromCustomAdded(row, col, borderObj) {\n      var border = (0, _utils.createEmptyBorders)(row, col);\n\n      border = (0, _utils.extendDefaultBorder)(border, borderObj);\n      this.hot.setCellMeta(row, col, 'borders', border);\n\n      this.insertBorderIntoSettings(border);\n    }\n\n    /** *\n     * Prepare borders from setting (object).\n     *\n     * @param {Object} rowObj Object with `range`, `left`, `right`, `top` and `bottom` properties.\n     */\n\n  }, {\n    key: 'prepareBorderFromCustomAddedRange',\n    value: function prepareBorderFromCustomAddedRange(rowObj) {\n      var _this3 = this;\n\n      var range = rowObj.range;\n\n      (0, _number.rangeEach)(range.from.row, range.to.row, function (rowIndex) {\n        (0, _number.rangeEach)(range.from.col, range.to.col, function (colIndex) {\n          var border = (0, _utils.createEmptyBorders)(rowIndex, colIndex);\n          var add = 0;\n\n          if (rowIndex === range.from.row) {\n            add += 1;\n\n            if ((0, _object.hasOwnProperty)(rowObj, 'top')) {\n              border.top = rowObj.top;\n            }\n          }\n\n          if (rowIndex === range.to.row) {\n            add += 1;\n\n            if ((0, _object.hasOwnProperty)(rowObj, 'bottom')) {\n              border.bottom = rowObj.bottom;\n            }\n          }\n\n          if (colIndex === range.from.col) {\n            add += 1;\n\n            if ((0, _object.hasOwnProperty)(rowObj, 'left')) {\n              border.left = rowObj.left;\n            }\n          }\n\n          if (colIndex === range.to.col) {\n            add += 1;\n\n            if ((0, _object.hasOwnProperty)(rowObj, 'right')) {\n              border.right = rowObj.right;\n            }\n          }\n\n          if (add > 0) {\n            _this3.hot.setCellMeta(rowIndex, colIndex, 'borders', border);\n            _this3.insertBorderIntoSettings(border);\n          }\n        });\n      });\n    }\n\n    /**\n     * Remove borders divs from DOM.\n     *\n     * @param {String} borderClassName Border class name as string.\n     */\n\n  }, {\n    key: 'removeBordersFromDom',\n    value: function removeBordersFromDom(borderClassName) {\n      var borders = this.hot.rootElement.querySelectorAll('.' + borderClassName + ':not(td)');\n\n      (0, _number.rangeEach)(0, borders.length - 1, function (index) {\n        var parent = borders[index].parentNode;\n\n        if (parent.parentNode) {\n          parent.parentNode.removeChild(parent);\n        }\n      });\n    }\n\n    /**\n     * Remove border (triggered from context menu).\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     */\n\n  }, {\n    key: 'removeAllBorders',\n    value: function removeAllBorders(row, col) {\n      var borderClassName = (0, _utils.createClassName)(row, col);\n\n      this.removeBordersFromDom(borderClassName);\n      this.hot.removeCellMeta(row, col, 'borders');\n    }\n\n    /**\n     * Set borders for each cell re. to border position.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {String} place Coordinate where add/remove border - `top`, `bottom`, `left`, `right` and `noBorders`.\n     * @param {Boolean} remove True when remove borders, and false when add borders.\n     */\n\n  }, {\n    key: 'setBorder',\n    value: function setBorder(row, col, place, remove) {\n      var bordersMeta = this.hot.getCellMeta(row, col).borders;\n\n      if (!bordersMeta || bordersMeta.border === void 0) {\n        bordersMeta = (0, _utils.createEmptyBorders)(row, col);\n      }\n\n      if (remove) {\n        bordersMeta[place] = (0, _utils.createSingleEmptyBorder)();\n      } else {\n        bordersMeta[place] = (0, _utils.createDefaultCustomBorder)();\n      }\n\n      this.hot.setCellMeta(row, col, 'borders', bordersMeta);\n\n      var borderClassName = (0, _utils.createClassName)(row, col);\n      this.removeBordersFromDom(borderClassName);\n      this.insertBorderIntoSettings(bordersMeta);\n\n      this.hot.render();\n    }\n\n    /**\n     * Prepare borders based on cell and border position.\n     *\n     * @param {Object} selected\n     * @param {String} place Coordinate where add/remove border - `top`, `bottom`, `left`, `right` and `noBorders`.\n     * @param {Boolean} remove True when remove borders, and false when add borders.\n     */\n\n  }, {\n    key: 'prepareBorder',\n    value: function prepareBorder(selected, place, remove) {\n      var _this4 = this;\n\n      (0, _array.arrayEach)(selected, function (_ref) {\n        var start = _ref.start,\n            end = _ref.end;\n\n        if (start.row === end.row && start.col === end.col) {\n          if (place === 'noBorders') {\n            _this4.removeAllBorders(start.row, start.col);\n          } else {\n            _this4.setBorder(start.row, start.col, place, remove);\n          }\n        } else {\n          switch (place) {\n            case 'noBorders':\n              (0, _number.rangeEach)(start.col, end.col, function (colIndex) {\n                (0, _number.rangeEach)(start.row, end.row, function (rowIndex) {\n                  _this4.removeAllBorders(rowIndex, colIndex);\n                });\n              });\n              break;\n\n            case 'top':\n              (0, _number.rangeEach)(start.col, end.col, function (topCol) {\n                _this4.setBorder(start.row, topCol, place, remove);\n              });\n              break;\n\n            case 'right':\n              (0, _number.rangeEach)(start.row, end.row, function (rowRight) {\n                _this4.setBorder(rowRight, end.col, place, remove);\n              });\n              break;\n\n            case 'bottom':\n              (0, _number.rangeEach)(start.col, end.col, function (bottomCol) {\n                _this4.setBorder(end.row, bottomCol, place, remove);\n              });\n              break;\n\n            case 'left':\n              (0, _number.rangeEach)(start.row, end.row, function (rowLeft) {\n                _this4.setBorder(rowLeft, start.col, place, remove);\n              });\n              break;\n            default:\n              break;\n          }\n        }\n      });\n    }\n\n    /**\n     * Create borders from settings.\n     *\n     * @private\n     * @param {Array} customBorders Object with `row` and `col`, `left`, `right`, `top` and `bottom` properties.\n     */\n\n  }, {\n    key: 'createCustomBorders',\n    value: function createCustomBorders(customBorders) {\n      var _this5 = this;\n\n      (0, _number.rangeEach)(0, customBorders.length - 1, function (index) {\n        if (customBorders[index].range) {\n          _this5.prepareBorderFromCustomAddedRange(customBorders[index]);\n        } else {\n          _this5.prepareBorderFromCustomAdded(customBorders[index].row, customBorders[index].col, customBorders[index]);\n        }\n      });\n\n      this.hot.render();\n      this.hot.view.wt.draw(true);\n    }\n\n    /**\n     * Add border options to context menu.\n     *\n     * @private\n     * @param {Object} defaultOptions Context menu items.\n     */\n\n  }, {\n    key: 'onAfterContextMenuDefaultOptions',\n    value: function onAfterContextMenuDefaultOptions(defaultOptions) {\n      if (!this.hot.getSettings().customBorders) {\n        return;\n      }\n\n      defaultOptions.items.push({\n        name: '---------'\n      }, {\n        key: 'borders',\n        name: function name() {\n          return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS);\n        },\n        disabled: function disabled() {\n          return this.selection.isSelectedByCorner();\n        },\n\n        submenu: {\n          items: [(0, _top2.default)(this), (0, _right2.default)(this), (0, _bottom2.default)(this), (0, _left2.default)(this), (0, _noBorders2.default)(this)]\n        }\n      });\n    }\n\n    /**\n      * Clear borders.\n      *\n      * @private\n      */\n\n  }, {\n    key: 'clearBorders',\n    value: function clearBorders() {\n      var _this6 = this;\n\n      var bordersFromTable = this.hot.rootElement.querySelectorAll('td[class^=\"border\"]');\n\n      (0, _number.rangeEach)(0, bordersFromTable.length - 1, function (index) {\n        _this6.removeBordersFromDom(bordersFromTable[index].className);\n      });\n    }\n\n    /**\n     * Change borders from settings.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'changeBorderSettings',\n    value: function changeBorderSettings() {\n      var customBorders = this.hot.getSettings().customBorders;\n\n      if (customBorders) {\n        if (Array.isArray(customBorders)) {\n          this.savedBorderSettings = customBorders;\n          this.createCustomBorders(customBorders);\n        } else if (customBorders !== void 0) {\n          var borders = this.savedBorderSettings ? this.savedBorderSettings : customBorders;\n\n          this.createCustomBorders(borders);\n        }\n      }\n    }\n\n    /**\n     * `afterInit` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      this.changeBorderSettings();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(CustomBorders.prototype.__proto__ || Object.getPrototypeOf(CustomBorders.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return CustomBorders;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('customBorders', CustomBorders);\n\nexports.default = CustomBorders;\n\n/***/ }),\n/* 322 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = bottom;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(47);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction bottom(customBordersPlugin) {\n  return {\n    key: 'borders:bottom',\n    name: function name() {\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM);\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'bottom');\n      if (hasBorder) {\n        label = (0, _utils.markSelected)(label);\n      }\n      return label;\n    },\n    callback: function callback(key, selected) {\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'bottom');\n      customBordersPlugin.prepareBorder(selected, 'bottom', hasBorder);\n    }\n  };\n}\n\n/***/ }),\n/* 323 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = left;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(47);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction left(customBordersPlugin) {\n  return {\n    key: 'borders:left',\n    name: function name() {\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_LEFT);\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'left');\n      if (hasBorder) {\n        label = (0, _utils.markSelected)(label);\n      }\n\n      return label;\n    },\n    callback: function callback(key, selected) {\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'left');\n      customBordersPlugin.prepareBorder(selected, 'left', hasBorder);\n    }\n  };\n}\n\n/***/ }),\n/* 324 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = noBorders;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(47);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction noBorders(customBordersPlugin) {\n  return {\n    key: 'borders:no_borders',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_BORDERS);\n    },\n    callback: function callback(key, selected) {\n      customBordersPlugin.prepareBorder(selected, 'noBorders');\n    },\n    disabled: function disabled() {\n      return !(0, _utils.checkSelectionBorders)(this);\n    }\n  };\n}\n\n/***/ }),\n/* 325 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = right;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(47);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction right(customBordersPlugin) {\n  return {\n    key: 'borders:right',\n    name: function name() {\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_RIGHT);\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'right');\n      if (hasBorder) {\n        label = (0, _utils.markSelected)(label);\n      }\n      return label;\n    },\n    callback: function callback(key, selected) {\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'right');\n      customBordersPlugin.prepareBorder(selected, 'right', hasBorder);\n    }\n  };\n}\n\n/***/ }),\n/* 326 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = top;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _utils = __webpack_require__(47);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction top(customBordersPlugin) {\n  return {\n    key: 'borders:top',\n    name: function name() {\n      var label = this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS_TOP);\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'top');\n      if (hasBorder) {\n        label = (0, _utils.markSelected)(label);\n      }\n\n      return label;\n    },\n    callback: function callback(key, selected) {\n      var hasBorder = (0, _utils.checkSelectionBorders)(this, 'top');\n      customBordersPlugin.prepareBorder(selected, 'top', hasBorder);\n    }\n  };\n}\n\n/***/ }),\n/* 327 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @description\n * Plugin used to scroll Handsontable by selecting a cell and dragging outside of the visible viewport.\n *\n *\n * @class DragToScroll\n * @plugin DragToScroll\n */\nvar DragToScroll = function (_BasePlugin) {\n  _inherits(DragToScroll, _BasePlugin);\n\n  function DragToScroll(hotInstance) {\n    _classCallCheck(this, DragToScroll);\n\n    /**\n     * Instance of {@link EventManager}.\n     *\n     * @type {EventManager}\n     */\n    var _this = _possibleConstructorReturn(this, (DragToScroll.__proto__ || Object.getPrototypeOf(DragToScroll)).call(this, hotInstance));\n\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * DOMRect - size of an element and its position relative to the viewport,\n     * e.g. {bottom: 449, height: 441, left: 8, right: 814, top: 8, width: 806, x: 8, y:8}.\n     *\n     * @type {Object}\n     */\n    _this.boundaries = null;\n    /**\n     * Callback function.\n     *\n     * @type {Function}\n     */\n    _this.callback = null;\n    /**\n     * Flag indicates mouseDown/mouseUp.\n     *\n     * @type {Boolean}\n     */\n    _this.listening = false;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(DragToScroll, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().dragToScroll;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('afterOnCellMouseDown', function () {\n        return _this2.setupListening();\n      });\n      this.addHook('afterOnCellCornerMouseDown', function () {\n        return _this2.setupListening();\n      });\n\n      this.registerEvents();\n\n      _get(DragToScroll.prototype.__proto__ || Object.getPrototypeOf(DragToScroll.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(DragToScroll.prototype.__proto__ || Object.getPrototypeOf(DragToScroll.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.unregisterEvents();\n\n      _get(DragToScroll.prototype.__proto__ || Object.getPrototypeOf(DragToScroll.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Sets the value of the visible element.\n     *\n     * @param boundaries {Object} compatible with getBoundingClientRect\n     */\n\n  }, {\n    key: 'setBoundaries',\n    value: function setBoundaries(boundaries) {\n      this.boundaries = boundaries;\n    }\n\n    /**\n     * Change callback function.\n     *\n     * @param callback {Function}\n     */\n\n  }, {\n    key: 'setCallback',\n    value: function setCallback(callback) {\n      this.callback = callback;\n    }\n\n    /**\n     * Check if mouse position (x, y) is outside of the viewport.\n     *\n     * @param {Number} x\n     * @param {Number} y\n     */\n\n  }, {\n    key: 'check',\n    value: function check(x, y) {\n      var diffX = 0;\n      var diffY = 0;\n\n      if (y < this.boundaries.top) {\n        // y is less than top\n        diffY = y - this.boundaries.top;\n      } else if (y > this.boundaries.bottom) {\n        // y is more than bottom\n        diffY = y - this.boundaries.bottom;\n      }\n\n      if (x < this.boundaries.left) {\n        // x is less than left\n        diffX = x - this.boundaries.left;\n      } else if (x > this.boundaries.right) {\n        // x is more than right\n        diffX = x - this.boundaries.right;\n      }\n\n      this.callback(diffX, diffY);\n    }\n\n    /**\n     * Register dom listeners.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this3 = this;\n\n      this.eventManager.addEventListener(document, 'mouseup', function () {\n        return _this3.onMouseUp();\n      });\n      this.eventManager.addEventListener(document, 'mousemove', function (event) {\n        return _this3.onMouseMove(event);\n      });\n    }\n\n    /**\n     * Unbind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'unregisterEvents',\n    value: function unregisterEvents() {\n      this.eventManager.clear();\n    }\n\n    /**\n     * On after on cell/cellCorner mouse down listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'setupListening',\n    value: function setupListening() {\n      var scrollHandler = this.hot.view.wt.wtTable.holder; // native scroll\n\n      if (scrollHandler === window) {\n        // not much we can do currently\n        return;\n      }\n\n      this.setBoundaries(scrollHandler.getBoundingClientRect());\n      this.setCallback(function (scrollX, scrollY) {\n        if (scrollX < 0) {\n          scrollHandler.scrollLeft -= 50;\n        } else if (scrollX > 0) {\n          scrollHandler.scrollLeft += 50;\n        }\n\n        if (scrollY < 0) {\n          scrollHandler.scrollTop -= 20;\n        } else if (scrollY > 0) {\n          scrollHandler.scrollTop += 20;\n        }\n      });\n\n      this.listening = true;\n    }\n\n    /**\n     * 'mouseMove' event callback.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      if (this.listening) {\n        this.check(event.clientX, event.clientY);\n      }\n    }\n\n    /**\n     * `onMouseUp` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      this.listening = false;\n    }\n\n    /**\n     * Destroy instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(DragToScroll.prototype.__proto__ || Object.getPrototypeOf(DragToScroll.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return DragToScroll;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('dragToScroll', DragToScroll);\n\nexports.default = DragToScroll;\n\n/***/ }),\n/* 328 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _array = __webpack_require__(1);\n\nvar _freezeColumn = __webpack_require__(329);\n\nvar _freezeColumn2 = _interopRequireDefault(_freezeColumn);\n\nvar _unfreezeColumn = __webpack_require__(330);\n\nvar _unfreezeColumn2 = _interopRequireDefault(_unfreezeColumn);\n\n__webpack_require__(331);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar privatePool = new WeakMap();\n/**\n * This plugin allows to manually \"freeze\" and \"unfreeze\" a column using an entry in the Context Menu.\n * You can turn it on by setting a `manualColumnFreeze` property to `true`.\n *\n * @plugin ManualColumnFreeze\n * @dependencies ManualColumnMove\n */\n\nvar ManualColumnFreeze = function (_BasePlugin) {\n  _inherits(ManualColumnFreeze, _BasePlugin);\n\n  function ManualColumnFreeze(hotInstance) {\n    _classCallCheck(this, ManualColumnFreeze);\n\n    var _this = _possibleConstructorReturn(this, (ManualColumnFreeze.__proto__ || Object.getPrototypeOf(ManualColumnFreeze)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      moveByFreeze: false,\n      afterFirstUse: false\n    });\n    /**\n     * Original column positions\n     *\n     * @type {Array}\n     */\n    _this.frozenColumnsBasePositions = [];\n    /**\n     * Reference to the `ManualColumnMove` plugin.\n     */\n    _this.manualColumnMovePlugin = void 0;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualColumnFreeze, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().manualColumnFreeze;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('afterContextMenuDefaultOptions', function (options) {\n        return _this2.addContextMenuEntry(options);\n      });\n      this.addHook('afterInit', function () {\n        return _this2.onAfterInit();\n      });\n      this.addHook('beforeColumnMove', function (rows, target) {\n        return _this2.onBeforeColumnMove(rows, target);\n      });\n\n      _get(ManualColumnFreeze.prototype.__proto__ || Object.getPrototypeOf(ManualColumnFreeze.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      var priv = privatePool.get(this);\n\n      priv.afterFirstUse = false;\n      priv.moveByFreeze = false;\n\n      _get(ManualColumnFreeze.prototype.__proto__ || Object.getPrototypeOf(ManualColumnFreeze.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(ManualColumnFreeze.prototype.__proto__ || Object.getPrototypeOf(ManualColumnFreeze.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Freeze the given column (add it to fixed columns).\n     *\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'freezeColumn',\n    value: function freezeColumn(column) {\n      var priv = privatePool.get(this);\n      var settings = this.hot.getSettings();\n\n      if (!priv.afterFirstUse) {\n        priv.afterFirstUse = true;\n      }\n\n      if (settings.fixedColumnsLeft === this.hot.countCols() || column <= settings.fixedColumnsLeft - 1) {\n        return; // already fixed\n      }\n\n      priv.moveByFreeze = true;\n\n      if (column !== this.getMovePlugin().columnsMapper.getValueByIndex(column)) {\n        this.frozenColumnsBasePositions[settings.fixedColumnsLeft] = column;\n      }\n\n      this.getMovePlugin().moveColumn(column, settings.fixedColumnsLeft++);\n    }\n\n    /**\n     * Unfreeze the given column (remove it from fixed columns and bring to it's previous position).\n     *\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'unfreezeColumn',\n    value: function unfreezeColumn(column) {\n      var priv = privatePool.get(this);\n      var settings = this.hot.getSettings();\n\n      if (!priv.afterFirstUse) {\n        priv.afterFirstUse = true;\n      }\n\n      if (settings.fixedColumnsLeft <= 0 || column > settings.fixedColumnsLeft - 1) {\n        return; // not fixed\n      }\n\n      var returnCol = this.getBestColumnReturnPosition(column);\n\n      priv.moveByFreeze = true;\n      settings.fixedColumnsLeft--;\n\n      this.getMovePlugin().moveColumn(column, returnCol + 1);\n    }\n\n    /**\n     * Get the reference to the ManualColumnMove plugin.\n     *\n     * @private\n     * @returns {Object}\n     */\n\n  }, {\n    key: 'getMovePlugin',\n    value: function getMovePlugin() {\n      if (!this.manualColumnMovePlugin) {\n        this.manualColumnMovePlugin = this.hot.getPlugin('manualColumnMove');\n      }\n\n      return this.manualColumnMovePlugin;\n    }\n\n    /**\n     * Estimates the most fitting return position for unfrozen column.\n     *\n     * @private\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'getBestColumnReturnPosition',\n    value: function getBestColumnReturnPosition(column) {\n      var movePlugin = this.getMovePlugin();\n      var settings = this.hot.getSettings();\n      var i = settings.fixedColumnsLeft;\n      var j = movePlugin.columnsMapper.getValueByIndex(i);\n      var initialCol = void 0;\n\n      if (this.frozenColumnsBasePositions[column] === null || this.frozenColumnsBasePositions[column] === void 0) {\n        initialCol = movePlugin.columnsMapper.getValueByIndex(column);\n\n        while (j !== null && j <= initialCol) {\n          i++;\n          j = movePlugin.columnsMapper.getValueByIndex(i);\n        }\n      } else {\n        initialCol = this.frozenColumnsBasePositions[column];\n        this.frozenColumnsBasePositions[column] = void 0;\n\n        while (j !== null && j <= initialCol) {\n          i++;\n          j = movePlugin.columnsMapper.getValueByIndex(i);\n        }\n        i = j;\n      }\n\n      return i - 1;\n    }\n    /**\n     * Add the manualColumnFreeze context menu entries.\n     *\n     * @private\n     * @param {Object} options Context menu options.\n     */\n\n  }, {\n    key: 'addContextMenuEntry',\n    value: function addContextMenuEntry(options) {\n      options.items.push({ name: '---------' }, (0, _freezeColumn2.default)(this), (0, _unfreezeColumn2.default)(this));\n    }\n\n    /**\n     * Enabling `manualColumnMove` plugin on `afterInit` hook.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      if (!this.getMovePlugin().isEnabled()) {\n        this.getMovePlugin().enablePlugin();\n      }\n    }\n\n    /**\n     * Prevent moving the rows from/to fixed area.\n     *\n     * @private\n     * @param {Array} rows\n     * @param {Number} target\n     */\n\n  }, {\n    key: 'onBeforeColumnMove',\n    value: function onBeforeColumnMove(rows, target) {\n      var priv = privatePool.get(this);\n\n      if (priv.afterFirstUse && !priv.moveByFreeze) {\n        var frozenLen = this.hot.getSettings().fixedColumnsLeft;\n        var disallowMoving = target < frozenLen;\n\n        if (!disallowMoving) {\n          (0, _array.arrayEach)(rows, function (value, index, array) {\n            if (value < frozenLen) {\n              disallowMoving = true;\n              return false;\n            }\n          });\n        }\n\n        if (disallowMoving) {\n          return false;\n        }\n      }\n\n      if (priv.moveByFreeze) {\n        priv.moveByFreeze = false;\n      }\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(ManualColumnFreeze.prototype.__proto__ || Object.getPrototypeOf(ManualColumnFreeze.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return ManualColumnFreeze;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('manualColumnFreeze', ManualColumnFreeze);\n\nexports.default = ManualColumnFreeze;\n\n/***/ }),\n/* 329 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = freezeColumnItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction freezeColumnItem(manualColumnFreezePlugin) {\n  return {\n    key: 'freeze_column',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_FREEZE_COLUMN);\n    },\n    callback: function callback(key, selected) {\n      var _selected = _slicedToArray(selected, 1),\n          selectedColumn = _selected[0].start.col;\n\n      manualColumnFreezePlugin.freezeColumn(selectedColumn);\n\n      this.render();\n      this.view.wt.wtOverlays.adjustElementsSize(true);\n    },\n    hidden: function hidden() {\n      var selection = this.getSelectedRange();\n      var hide = false;\n\n      if (selection === void 0) {\n        hide = true;\n      } else if (selection.length > 1) {\n        hide = true;\n      } else if (selection[0].from.col !== selection[0].to.col || selection[0].from.col <= this.getSettings().fixedColumnsLeft - 1) {\n        hide = true;\n      }\n\n      return hide;\n    }\n  };\n}\n\n/***/ }),\n/* 330 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.default = unfreezeColumnItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction unfreezeColumnItem(manualColumnFreezePlugin) {\n  return {\n    key: 'unfreeze_column',\n    name: function name() {\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN);\n    },\n    callback: function callback(key, selected) {\n      var _selected = _slicedToArray(selected, 1),\n          selectedColumn = _selected[0].start.col;\n\n      manualColumnFreezePlugin.unfreezeColumn(selectedColumn);\n\n      this.render();\n      this.view.wt.wtOverlays.adjustElementsSize(true);\n    },\n    hidden: function hidden() {\n      var selection = this.getSelectedRange();\n      var hide = false;\n\n      if (selection === void 0) {\n        hide = true;\n      } else if (selection.length > 1) {\n        hide = true;\n      } else if (selection[0].from.col !== selection[0].to.col || selection[0].from.col >= this.getSettings().fixedColumnsLeft) {\n        hide = true;\n      }\n\n      return hide;\n    }\n  };\n}\n\n/***/ }),\n/* 331 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 332 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _element = __webpack_require__(0);\n\nvar _number = __webpack_require__(5);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nvar _columnsMapper = __webpack_require__(333);\n\nvar _columnsMapper2 = _interopRequireDefault(_columnsMapper);\n\nvar _backlight = __webpack_require__(334);\n\nvar _backlight2 = _interopRequireDefault(_backlight);\n\nvar _guideline = __webpack_require__(335);\n\nvar _guideline2 = _interopRequireDefault(_guideline);\n\nvar _src = __webpack_require__(4);\n\n__webpack_require__(336);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('beforeColumnMove');\n_pluginHooks2.default.getSingleton().register('afterColumnMove');\n_pluginHooks2.default.getSingleton().register('unmodifyCol');\n\nvar privatePool = new WeakMap();\nvar CSS_PLUGIN = 'ht__manualColumnMove';\nvar CSS_SHOW_UI = 'show-ui';\nvar CSS_ON_MOVING = 'on-moving--columns';\nvar CSS_AFTER_SELECTION = 'after-selection--columns';\n\n/**\n * @plugin ManualColumnMove\n *\n * @description\n * This plugin allows to change columns order.\n *\n * API:\n * - moveColumn - move single column to the new position.\n * - moveColumns - move many columns (as an array of indexes) to the new position.\n *\n * If you want apply visual changes, you have to call manually the render() method on the instance of Handsontable.\n *\n * UI components:\n * - backlight - highlight of selected columns.\n * - guideline - line which shows where rows has been moved.\n *\n * @class ManualColumnMove\n * @plugin ManualColumnMove\n */\n\nvar ManualColumnMove = function (_BasePlugin) {\n  _inherits(ManualColumnMove, _BasePlugin);\n\n  function ManualColumnMove(hotInstance) {\n    _classCallCheck(this, ManualColumnMove);\n\n    /**\n     * Set up WeakMap of plugin to sharing private parameters;\n     */\n    var _this = _possibleConstructorReturn(this, (ManualColumnMove.__proto__ || Object.getPrototypeOf(ManualColumnMove)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      columnsToMove: [],\n      countCols: 0,\n      fixedColumns: 0,\n      pressed: void 0,\n      disallowMoving: void 0,\n      target: {\n        eventPageX: void 0,\n        coords: void 0,\n        TD: void 0,\n        col: void 0\n      }\n    });\n\n    /**\n     * List of last removed row indexes.\n     *\n     * @type {Array}\n     */\n    _this.removedColumns = [];\n    /**\n     * Object containing visual row indexes mapped to data source indexes.\n     *\n     * @type {RowsMapper}\n     */\n    _this.columnsMapper = new _columnsMapper2.default(_this);\n    /**\n     * Event Manager object.\n     *\n     * @type {Object}\n     */\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Backlight UI object.\n     *\n     * @type {Object}\n     */\n    _this.backlight = new _backlight2.default(hotInstance);\n    /**\n     * Guideline UI object.\n     *\n     * @type {Object}\n     */\n    _this.guideline = new _guideline2.default(hotInstance);\n    return _this;\n  }\n\n  /**\n   * Check if plugin is enabled.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualColumnMove, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().manualColumnMove;\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('beforeOnCellMouseDown', function (event, coords, TD, blockCalculations) {\n        return _this2.onBeforeOnCellMouseDown(event, coords, TD, blockCalculations);\n      });\n      this.addHook('beforeOnCellMouseOver', function (event, coords, TD, blockCalculations) {\n        return _this2.onBeforeOnCellMouseOver(event, coords, TD, blockCalculations);\n      });\n      this.addHook('afterScrollVertically', function () {\n        return _this2.onAfterScrollVertically();\n      });\n      this.addHook('modifyCol', function (row, source) {\n        return _this2.onModifyCol(row, source);\n      });\n      this.addHook('beforeRemoveCol', function (index, amount) {\n        return _this2.onBeforeRemoveCol(index, amount);\n      });\n      this.addHook('afterRemoveCol', function () {\n        return _this2.onAfterRemoveCol();\n      });\n      this.addHook('afterCreateCol', function (index, amount) {\n        return _this2.onAfterCreateCol(index, amount);\n      });\n      this.addHook('afterLoadData', function () {\n        return _this2.onAfterLoadData();\n      });\n      this.addHook('unmodifyCol', function (column) {\n        return _this2.onUnmodifyCol(column);\n      });\n\n      this.registerEvents();\n\n      // TODO: move adding plugin classname to BasePlugin.\n      (0, _element.addClass)(this.hot.rootElement, CSS_PLUGIN);\n\n      _get(ManualColumnMove.prototype.__proto__ || Object.getPrototypeOf(ManualColumnMove.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      this.onAfterPluginsInitialized();\n\n      _get(ManualColumnMove.prototype.__proto__ || Object.getPrototypeOf(ManualColumnMove.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      var pluginSettings = this.hot.getSettings().manualColumnMove;\n\n      if (Array.isArray(pluginSettings)) {\n        this.columnsMapper.clearMap();\n      }\n\n      (0, _element.removeClass)(this.hot.rootElement, CSS_PLUGIN);\n\n      this.unregisterEvents();\n      this.backlight.destroy();\n      this.guideline.destroy();\n\n      _get(ManualColumnMove.prototype.__proto__ || Object.getPrototypeOf(ManualColumnMove.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Move a single column.\n     *\n     * @param {Number} column Visual column index to be moved.\n     * @param {Number} target Visual column index being a target for the moved column.\n     */\n\n  }, {\n    key: 'moveColumn',\n    value: function moveColumn(column, target) {\n      this.moveColumns([column], target);\n    }\n\n    /**\n     * Move multiple columns.\n     *\n     * @param {Array} columns Array of visual column indexes to be moved.\n     * @param {Number} target Visual column index being a target for the moved columns.\n     */\n\n  }, {\n    key: 'moveColumns',\n    value: function moveColumns(columns, target) {\n      var _this3 = this;\n\n      var visualColumns = [].concat(_toConsumableArray(columns));\n      var priv = privatePool.get(this);\n      var beforeColumnHook = this.hot.runHooks('beforeColumnMove', visualColumns, target);\n\n      priv.disallowMoving = !beforeColumnHook;\n\n      if (beforeColumnHook !== false) {\n        // first we need to rewrite an visual indexes to physical for save reference after move\n        (0, _array.arrayEach)(columns, function (column, index, array) {\n          array[index] = _this3.columnsMapper.getValueByIndex(column);\n        });\n\n        // next, when we have got an physical indexes, we can move columns\n        (0, _array.arrayEach)(columns, function (column, index) {\n          var actualPosition = _this3.columnsMapper.getIndexByValue(column);\n\n          if (actualPosition !== target) {\n            _this3.columnsMapper.moveColumn(actualPosition, target + index);\n          }\n        });\n\n        // after moving we have to clear columnsMapper from null entries\n        this.columnsMapper.clearNull();\n      }\n\n      this.hot.runHooks('afterColumnMove', visualColumns, target);\n    }\n\n    /**\n     * Correct the cell selection after the move action. Fired only when action was made with a mouse.\n     * That means that changing the column order using the API won't correct the selection.\n     *\n     * @private\n     * @param {Number} startColumn Visual column index for the start of the selection.\n     * @param {Number} endColumn Visual column index for the end of the selection.\n     */\n\n  }, {\n    key: 'changeSelection',\n    value: function changeSelection(startColumn, endColumn) {\n      this.hot.selectColumns(startColumn, endColumn);\n    }\n\n    /**\n     * Get the sum of the widths of columns in the provided range.\n     *\n     * @private\n     * @param {Number} from Visual column index.\n     * @param {Number} to Visual column index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getColumnsWidth',\n    value: function getColumnsWidth(from, to) {\n      var width = 0;\n\n      for (var i = from; i < to; i++) {\n        var columnWidth = 0;\n\n        if (i < 0) {\n          columnWidth = this.hot.view.wt.wtViewport.getRowHeaderWidth() || 0;\n        } else {\n          columnWidth = this.hot.view.wt.wtTable.getStretchedColumnWidth(i) || 0;\n        }\n\n        width += columnWidth;\n      }\n\n      return width;\n    }\n\n    /**\n     * Load initial settings when persistent state is saved or when plugin was initialized as an array.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'initialSettings',\n    value: function initialSettings() {\n      var pluginSettings = this.hot.getSettings().manualColumnMove;\n\n      if (Array.isArray(pluginSettings)) {\n        this.moveColumns(pluginSettings, 0);\n      } else if (pluginSettings !== void 0) {\n        this.persistentStateLoad();\n      }\n    }\n\n    /**\n     * Check if the provided column is in the fixedColumnsLeft section.\n     *\n     * @private\n     * @param {Number} column Visual column index to check.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isFixedColumnsLeft',\n    value: function isFixedColumnsLeft(column) {\n      return column < this.hot.getSettings().fixedColumnsLeft;\n    }\n\n    /**\n     * Save the manual column positions to the persistent state.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'persistentStateSave',\n    value: function persistentStateSave() {\n      this.hot.runHooks('persistentStateSave', 'manualColumnMove', this.columnsMapper._arrayMap);\n    }\n\n    /**\n     * Load the manual column positions from the persistent state.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'persistentStateLoad',\n    value: function persistentStateLoad() {\n      var storedState = {};\n\n      this.hot.runHooks('persistentStateLoad', 'manualColumnMove', storedState);\n\n      if (storedState.value) {\n        this.columnsMapper._arrayMap = storedState.value;\n      }\n    }\n\n    /**\n     * Prepare array of indexes based on actual selection.\n     *\n     * @private\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'prepareColumnsToMoving',\n    value: function prepareColumnsToMoving(start, end) {\n      var selectedColumns = [];\n\n      (0, _number.rangeEach)(start, end, function (i) {\n        selectedColumns.push(i);\n      });\n\n      return selectedColumns;\n    }\n\n    /**\n     * Update the UI visual position.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'refreshPositions',\n    value: function refreshPositions() {\n      var priv = privatePool.get(this);\n      var firstVisible = this.hot.view.wt.wtTable.getFirstVisibleColumn();\n      var lastVisible = this.hot.view.wt.wtTable.getLastVisibleColumn();\n      var wtTable = this.hot.view.wt.wtTable;\n      var scrollableElement = this.hot.view.wt.wtOverlays.scrollableElement;\n      var scrollLeft = typeof scrollableElement.scrollX === 'number' ? scrollableElement.scrollX : scrollableElement.scrollLeft;\n      var tdOffsetLeft = this.hot.view.THEAD.offsetLeft + this.getColumnsWidth(0, priv.coordsColumn);\n      var mouseOffsetLeft = priv.target.eventPageX - (priv.rootElementOffset - (scrollableElement.scrollX === void 0 ? scrollLeft : 0));\n      var hiderWidth = wtTable.hider.offsetWidth;\n      var tbodyOffsetLeft = wtTable.TBODY.offsetLeft;\n      var backlightElemMarginLeft = this.backlight.getOffset().left;\n      var backlightElemWidth = this.backlight.getSize().width;\n      var rowHeaderWidth = 0;\n\n      if (priv.rootElementOffset + wtTable.holder.offsetWidth + scrollLeft < priv.target.eventPageX) {\n        if (priv.coordsColumn < priv.countCols) {\n          priv.coordsColumn++;\n        }\n      }\n\n      if (priv.hasRowHeaders) {\n        rowHeaderWidth = this.hot.view.wt.wtOverlays.leftOverlay.clone.wtTable.getColumnHeader(-1).offsetWidth;\n      }\n      if (this.isFixedColumnsLeft(priv.coordsColumn)) {\n        tdOffsetLeft += scrollLeft;\n      }\n      tdOffsetLeft += rowHeaderWidth;\n\n      if (priv.coordsColumn < 0) {\n        // if hover on rowHeader\n        if (priv.fixedColumns > 0) {\n          priv.target.col = 0;\n        } else {\n          priv.target.col = firstVisible > 0 ? firstVisible - 1 : firstVisible;\n        }\n      } else if (priv.target.TD.offsetWidth / 2 + tdOffsetLeft <= mouseOffsetLeft) {\n        var newCoordsCol = priv.coordsColumn >= priv.countCols ? priv.countCols - 1 : priv.coordsColumn;\n        // if hover on right part of TD\n        priv.target.col = newCoordsCol + 1;\n        // unfortunately first column is bigger than rest\n        tdOffsetLeft += priv.target.TD.offsetWidth;\n\n        if (priv.target.col > lastVisible) {\n          this.hot.scrollViewportTo(void 0, lastVisible + 1, void 0, true);\n        }\n      } else {\n        // elsewhere on table\n        priv.target.col = priv.coordsColumn;\n\n        if (priv.target.col <= firstVisible && priv.target.col >= priv.fixedColumns) {\n          this.hot.scrollViewportTo(void 0, firstVisible - 1);\n        }\n      }\n\n      if (priv.target.col <= firstVisible && priv.target.col >= priv.fixedColumns) {\n        this.hot.scrollViewportTo(void 0, firstVisible - 1);\n      }\n\n      var backlightLeft = mouseOffsetLeft;\n      var guidelineLeft = tdOffsetLeft;\n\n      if (mouseOffsetLeft + backlightElemWidth + backlightElemMarginLeft >= hiderWidth) {\n        // prevent display backlight on the right side of the table\n        backlightLeft = hiderWidth - backlightElemWidth - backlightElemMarginLeft;\n      } else if (mouseOffsetLeft + backlightElemMarginLeft < tbodyOffsetLeft + rowHeaderWidth) {\n        // prevent display backlight on the left side of the table\n        backlightLeft = tbodyOffsetLeft + rowHeaderWidth + Math.abs(backlightElemMarginLeft);\n      }\n\n      if (tdOffsetLeft >= hiderWidth - 1) {\n        // prevent display guideline outside the table\n        guidelineLeft = hiderWidth - 1;\n      } else if (guidelineLeft === 0) {\n        // guideline has got `margin-left: -1px` as default\n        guidelineLeft = 1;\n      } else if (scrollableElement.scrollX !== void 0 && priv.coordsColumn < priv.fixedColumns) {\n        guidelineLeft -= priv.rootElementOffset <= scrollableElement.scrollX ? priv.rootElementOffset : 0;\n      }\n\n      this.backlight.setPosition(null, backlightLeft);\n      this.guideline.setPosition(null, guidelineLeft);\n    }\n\n    /**\n     * This method checks arrayMap from columnsMapper and updates the columnsMapper if it's necessary.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'updateColumnsMapper',\n    value: function updateColumnsMapper() {\n      var countCols = this.hot.countSourceCols();\n      var columnsMapperLen = this.columnsMapper._arrayMap.length;\n\n      if (columnsMapperLen === 0) {\n        this.columnsMapper.createMap(countCols || this.hot.getSettings().startCols);\n      } else if (columnsMapperLen < countCols) {\n        var diff = countCols - columnsMapperLen;\n\n        this.columnsMapper.insertItems(columnsMapperLen, diff);\n      } else if (columnsMapperLen > countCols) {\n        var maxIndex = countCols - 1;\n        var columnsToRemove = [];\n\n        (0, _array.arrayEach)(this.columnsMapper._arrayMap, function (value, index) {\n          if (value > maxIndex) {\n            columnsToRemove.push(index);\n          }\n        });\n\n        this.columnsMapper.removeItems(columnsToRemove);\n      }\n    }\n\n    /**\n     * Bind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this4 = this;\n\n      this.eventManager.addEventListener(document.documentElement, 'mousemove', function (event) {\n        return _this4.onMouseMove(event);\n      });\n      this.eventManager.addEventListener(document.documentElement, 'mouseup', function () {\n        return _this4.onMouseUp();\n      });\n    }\n\n    /**\n     * Unbind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'unregisterEvents',\n    value: function unregisterEvents() {\n      this.eventManager.clear();\n    }\n\n    /**\n     * Change the behavior of selection / dragging.\n     *\n     * @private\n     * @param {MouseEvent} event `mousedown` event properties.\n     * @param {CellCoords} coords Visual cell coordinates where was fired event.\n     * @param {HTMLElement} TD Cell represented as HTMLElement.\n     * @param {Object} blockCalculations Object which contains information about blockCalculation for row, column or cells.\n     */\n\n  }, {\n    key: 'onBeforeOnCellMouseDown',\n    value: function onBeforeOnCellMouseDown(event, coords, TD, blockCalculations) {\n      var wtTable = this.hot.view.wt.wtTable;\n      var isHeaderSelection = this.hot.selection.isSelectedByColumnHeader();\n      var selection = this.hot.getSelectedRangeLast();\n      var priv = privatePool.get(this);\n      var isSortingElement = event.realTarget.className.indexOf('columnSorting') > -1;\n\n      if (!selection || !isHeaderSelection || priv.pressed || event.button !== 0 || isSortingElement) {\n        priv.pressed = false;\n        priv.columnsToMove.length = 0;\n        (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI]);\n        return;\n      }\n\n      var guidelineIsNotReady = this.guideline.isBuilt() && !this.guideline.isAppended();\n      var backlightIsNotReady = this.backlight.isBuilt() && !this.backlight.isAppended();\n\n      if (guidelineIsNotReady && backlightIsNotReady) {\n        this.guideline.appendTo(wtTable.hider);\n        this.backlight.appendTo(wtTable.hider);\n      }\n\n      var from = selection.from,\n          to = selection.to;\n\n      var start = Math.min(from.col, to.col);\n      var end = Math.max(from.col, to.col);\n\n      if (coords.row < 0 && coords.col >= start && coords.col <= end) {\n        blockCalculations.column = true;\n        priv.pressed = true;\n        priv.target.eventPageX = event.pageX;\n        priv.coordsColumn = coords.col;\n        priv.target.TD = TD;\n        priv.target.col = coords.col;\n        priv.columnsToMove = this.prepareColumnsToMoving(start, end);\n        priv.hasRowHeaders = !!this.hot.getSettings().rowHeaders;\n        priv.countCols = this.hot.countCols();\n        priv.fixedColumns = this.hot.getSettings().fixedColumnsLeft;\n        priv.rootElementOffset = (0, _element.offset)(this.hot.rootElement).left;\n\n        var countColumnsFrom = priv.hasRowHeaders ? -1 : 0;\n        var topPos = wtTable.holder.scrollTop + wtTable.getColumnHeaderHeight(0) + 1;\n        var fixedColumns = coords.col < priv.fixedColumns;\n        var scrollableElement = this.hot.view.wt.wtOverlays.scrollableElement;\n        var wrapperIsWindow = scrollableElement.scrollX ? scrollableElement.scrollX - priv.rootElementOffset : 0;\n\n        var mouseOffset = event.layerX - (fixedColumns ? wrapperIsWindow : 0);\n        var leftOffset = Math.abs(this.getColumnsWidth(start, coords.col) + mouseOffset);\n\n        this.backlight.setPosition(topPos, this.getColumnsWidth(countColumnsFrom, start) + leftOffset);\n        this.backlight.setSize(this.getColumnsWidth(start, end + 1), wtTable.hider.offsetHeight - topPos);\n        this.backlight.setOffset(null, leftOffset * -1);\n\n        (0, _element.addClass)(this.hot.rootElement, CSS_ON_MOVING);\n      } else {\n        (0, _element.removeClass)(this.hot.rootElement, CSS_AFTER_SELECTION);\n        priv.pressed = false;\n        priv.columnsToMove.length = 0;\n      }\n    }\n\n    /**\n     * 'mouseMove' event callback. Fired when pointer move on document.documentElement.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var priv = privatePool.get(this);\n\n      if (!priv.pressed) {\n        return;\n      }\n\n      // callback for browser which doesn't supports CSS pointer-event: none\n      if (event.realTarget === this.backlight.element) {\n        var width = this.backlight.getSize().width;\n        this.backlight.setSize(0);\n\n        setTimeout(function () {\n          this.backlight.setPosition(width);\n        });\n      }\n\n      priv.target.eventPageX = event.pageX;\n      this.refreshPositions();\n    }\n\n    /**\n     * 'beforeOnCellMouseOver' hook callback. Fired when pointer was over cell.\n     *\n     * @private\n     * @param {MouseEvent} event `mouseover` event properties.\n     * @param {CellCoords} coords Visual cell coordinates where was fired event.\n     * @param {HTMLElement} TD Cell represented as HTMLElement.\n     * @param {Object} blockCalculations Object which contains information about blockCalculation for row, column or cells.\n     */\n\n  }, {\n    key: 'onBeforeOnCellMouseOver',\n    value: function onBeforeOnCellMouseOver(event, coords, TD, blockCalculations) {\n      var selectedRange = this.hot.getSelectedRangeLast();\n      var priv = privatePool.get(this);\n\n      if (!selectedRange || !priv.pressed) {\n        return;\n      }\n\n      if (priv.columnsToMove.indexOf(coords.col) > -1) {\n        (0, _element.removeClass)(this.hot.rootElement, CSS_SHOW_UI);\n      } else {\n        (0, _element.addClass)(this.hot.rootElement, CSS_SHOW_UI);\n      }\n\n      blockCalculations.row = true;\n      blockCalculations.column = true;\n      blockCalculations.cell = true;\n      priv.coordsColumn = coords.col;\n      priv.target.TD = TD;\n    }\n\n    /**\n     * `onMouseUp` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      var priv = privatePool.get(this);\n\n      priv.coordsColumn = void 0;\n      priv.pressed = false;\n      priv.backlightWidth = 0;\n\n      (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI, CSS_AFTER_SELECTION]);\n\n      if (this.hot.selection.isSelectedByColumnHeader()) {\n        (0, _element.addClass)(this.hot.rootElement, CSS_AFTER_SELECTION);\n      }\n      if (priv.columnsToMove.length < 1 || priv.target.col === void 0 || priv.columnsToMove.indexOf(priv.target.col) > -1) {\n        return;\n      }\n\n      this.moveColumns(priv.columnsToMove, priv.target.col);\n      this.persistentStateSave();\n      this.hot.render();\n      this.hot.view.wt.wtOverlays.adjustElementsSize(true);\n\n      if (!priv.disallowMoving) {\n        var selectionStart = this.columnsMapper.getIndexByValue(priv.columnsToMove[0]);\n        var selectionEnd = this.columnsMapper.getIndexByValue(priv.columnsToMove[priv.columnsToMove.length - 1]);\n        this.changeSelection(selectionStart, selectionEnd);\n      }\n\n      priv.columnsToMove.length = 0;\n    }\n\n    /**\n     * `afterScrollHorizontally` hook callback. Fired the table was scrolled horizontally.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterScrollVertically',\n    value: function onAfterScrollVertically() {\n      var wtTable = this.hot.view.wt.wtTable;\n      var headerHeight = wtTable.getColumnHeaderHeight(0) + 1;\n      var scrollTop = wtTable.holder.scrollTop;\n      var posTop = headerHeight + scrollTop;\n\n      this.backlight.setPosition(posTop);\n      this.backlight.setSize(null, wtTable.hider.offsetHeight - posTop);\n    }\n\n    /**\n     * `afterCreateCol` hook callback.\n     *\n     * @private\n     * @param {Number} index Visual index of the created column.\n     * @param {Number} amount Amount of created columns.\n     */\n\n  }, {\n    key: 'onAfterCreateCol',\n    value: function onAfterCreateCol(index, amount) {\n      this.columnsMapper.shiftItems(index, amount);\n    }\n\n    /**\n     * On before remove column listener.\n     *\n     * @private\n     * @param {Number} index Visual column index.\n     * @param {Number} amount Defines how many columns removed.\n     */\n\n  }, {\n    key: 'onBeforeRemoveCol',\n    value: function onBeforeRemoveCol(index, amount) {\n      var _this5 = this;\n\n      this.removedColumns.length = 0;\n\n      if (index !== false) {\n        // Collect physical row index.\n        (0, _number.rangeEach)(index, index + amount - 1, function (removedIndex) {\n          _this5.removedColumns.push(_this5.hot.runHooks('modifyCol', removedIndex, _this5.pluginName));\n        });\n      }\n    }\n\n    /**\n     * `afterRemoveCol` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterRemoveCol',\n    value: function onAfterRemoveCol() {\n      this.columnsMapper.unshiftItems(this.removedColumns);\n    }\n\n    /**\n     * `afterLoadData` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData() {\n      this.updateColumnsMapper();\n    }\n\n    /**\n     * 'modifyRow' hook callback.\n     *\n     * @private\n     * @param {Number} column Visual column index.\n     * @returns {Number} Physical column index.\n     */\n\n  }, {\n    key: 'onModifyCol',\n    value: function onModifyCol(column, source) {\n      if (source !== this.pluginName) {\n        // ugly fix for try to insert new, needed columns after pasting data\n        var columnInMapper = this.columnsMapper.getValueByIndex(column);\n        column = columnInMapper === null ? column : columnInMapper;\n      }\n\n      return column;\n    }\n\n    /**\n     * 'unmodifyCol' hook callback.\n     *\n     * @private\n     * @param {Number} column Physical column index.\n     * @returns {Number} Visual column index.\n     */\n\n  }, {\n    key: 'onUnmodifyCol',\n    value: function onUnmodifyCol(column) {\n      var indexInMapper = this.columnsMapper.getIndexByValue(column);\n\n      return indexInMapper === null ? column : indexInMapper;\n    }\n\n    /**\n     * `afterPluginsInitialized` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterPluginsInitialized',\n    value: function onAfterPluginsInitialized() {\n      this.updateColumnsMapper();\n      this.initialSettings();\n      this.backlight.build();\n      this.guideline.build();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.backlight.destroy();\n      this.guideline.destroy();\n\n      _get(ManualColumnMove.prototype.__proto__ || Object.getPrototypeOf(ManualColumnMove.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return ManualColumnMove;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('ManualColumnMove', ManualColumnMove);\n\nexports.default = ManualColumnMove;\n\n/***/ }),\n/* 333 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _arrayMapper = __webpack_require__(201);\n\nvar _arrayMapper2 = _interopRequireDefault(_arrayMapper);\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class ColumnsMapper\n * @plugin ManualColumnMove\n */\nvar ColumnsMapper = function () {\n  function ColumnsMapper(manualColumnMove) {\n    _classCallCheck(this, ColumnsMapper);\n\n    /**\n     * Instance of ManualColumnMove plugin.\n     *\n     * @type {ManualColumnMove}\n     */\n    this.manualColumnMove = manualColumnMove;\n  }\n\n  /**\n   * Reset current map array and create new one.\n   *\n   * @param {Number} [length] Custom generated map length.\n   */\n\n\n  _createClass(ColumnsMapper, [{\n    key: 'createMap',\n    value: function createMap(length) {\n      var _this = this;\n\n      var originLength = length === void 0 ? this._arrayMap.length : length;\n\n      this._arrayMap.length = 0;\n\n      (0, _number.rangeEach)(originLength - 1, function (itemIndex) {\n        _this._arrayMap[itemIndex] = itemIndex;\n      });\n    }\n\n    /**\n     * Destroy class.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this._arrayMap = null;\n    }\n\n    /**\n     * Moving elements in columnsMapper.\n     *\n     * @param {Number} from Column index to move.\n     * @param {Number} to Target index.\n     */\n\n  }, {\n    key: 'moveColumn',\n    value: function moveColumn(from, to) {\n      var indexToMove = this._arrayMap[from];\n      this._arrayMap[from] = null;\n      this._arrayMap.splice(to, 0, indexToMove);\n    }\n\n    /**\n     * Clearing arrayMap from `null` entries.\n     */\n\n  }, {\n    key: 'clearNull',\n    value: function clearNull() {\n      this._arrayMap = (0, _array.arrayFilter)(this._arrayMap, function (i) {\n        return i !== null;\n      });\n    }\n  }]);\n\n  return ColumnsMapper;\n}();\n\n(0, _object.mixin)(ColumnsMapper, _arrayMapper2.default);\n\nexports.default = ColumnsMapper;\n\n/***/ }),\n/* 334 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(202);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CSS_CLASSNAME = 'ht__manualColumnMove--backlight';\n\n/**\n * @class BacklightUI\n * @util\n */\n\nvar BacklightUI = function (_BaseUI) {\n  _inherits(BacklightUI, _BaseUI);\n\n  function BacklightUI() {\n    _classCallCheck(this, BacklightUI);\n\n    return _possibleConstructorReturn(this, (BacklightUI.__proto__ || Object.getPrototypeOf(BacklightUI)).apply(this, arguments));\n  }\n\n  _createClass(BacklightUI, [{\n    key: 'build',\n\n    /**\n     * Custom className on build process.\n     */\n    value: function build() {\n      _get(BacklightUI.prototype.__proto__ || Object.getPrototypeOf(BacklightUI.prototype), 'build', this).call(this);\n\n      (0, _element.addClass)(this._element, CSS_CLASSNAME);\n    }\n  }]);\n\n  return BacklightUI;\n}(_base2.default);\n\nexports.default = BacklightUI;\n\n/***/ }),\n/* 335 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(202);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CSS_CLASSNAME = 'ht__manualColumnMove--guideline';\n\n/**\n * @class GuidelineUI\n * @util\n */\n\nvar GuidelineUI = function (_BaseUI) {\n  _inherits(GuidelineUI, _BaseUI);\n\n  function GuidelineUI() {\n    _classCallCheck(this, GuidelineUI);\n\n    return _possibleConstructorReturn(this, (GuidelineUI.__proto__ || Object.getPrototypeOf(GuidelineUI)).apply(this, arguments));\n  }\n\n  _createClass(GuidelineUI, [{\n    key: 'build',\n\n    /**\n     * Custom className on build process.\n     */\n    value: function build() {\n      _get(GuidelineUI.prototype.__proto__ || Object.getPrototypeOf(GuidelineUI.prototype), 'build', this).call(this);\n\n      (0, _element.addClass)(this._element, CSS_CLASSNAME);\n    }\n  }]);\n\n  return GuidelineUI;\n}(_base2.default);\n\nexports.default = GuidelineUI;\n\n/***/ }),\n/* 336 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 337 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _event = __webpack_require__(12);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// Developer note! Whenever you make a change in this file, make an analogous change in manualRowResize.js\n\n/**\n * @description\n * ManualColumnResize Plugin.\n *\n * Has 2 UI components:\n * - handle - the draggable element that sets the desired width of the column.\n * - guide - the helper guide that shows the desired width as a vertical guide.\n *\n * @plugin ManualColumnResize\n */\nvar ManualColumnResize = function (_BasePlugin) {\n  _inherits(ManualColumnResize, _BasePlugin);\n\n  function ManualColumnResize(hotInstance) {\n    _classCallCheck(this, ManualColumnResize);\n\n    var _this = _possibleConstructorReturn(this, (ManualColumnResize.__proto__ || Object.getPrototypeOf(ManualColumnResize)).call(this, hotInstance));\n\n    _this.currentTH = null;\n    _this.currentCol = null;\n    _this.selectedCols = [];\n    _this.currentWidth = null;\n    _this.newSize = null;\n    _this.startY = null;\n    _this.startWidth = null;\n    _this.startOffset = null;\n    _this.handle = document.createElement('DIV');\n    _this.guide = document.createElement('DIV');\n    _this.eventManager = new _eventManager2.default(_this);\n    _this.pressed = null;\n    _this.dblclick = 0;\n    _this.autoresizeTimeout = null;\n    _this.manualColumnWidths = [];\n\n    (0, _element.addClass)(_this.handle, 'manualColumnResizer');\n    (0, _element.addClass)(_this.guide, 'manualColumnResizerGuide');\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualColumnResize, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().manualColumnResize;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.manualColumnWidths = [];\n      var initialColumnWidth = this.hot.getSettings().manualColumnResize;\n      var loadedManualColumnWidths = this.loadManualColumnWidths();\n\n      this.addHook('modifyColWidth', function (width, col) {\n        return _this2.onModifyColWidth(width, col);\n      });\n      this.addHook('beforeStretchingColumnWidth', function (stretchedWidth, column) {\n        return _this2.onBeforeStretchingColumnWidth(stretchedWidth, column);\n      });\n      this.addHook('beforeColumnResize', function (currentColumn, newSize, isDoubleClick) {\n        return _this2.onBeforeColumnResize(currentColumn, newSize, isDoubleClick);\n      });\n\n      if (typeof loadedManualColumnWidths != 'undefined') {\n        this.manualColumnWidths = loadedManualColumnWidths;\n      } else if (Array.isArray(initialColumnWidth)) {\n        this.manualColumnWidths = initialColumnWidth;\n      } else {\n        this.manualColumnWidths = [];\n      }\n\n      // Handsontable.hooks.register('beforeColumnResize');\n      // Handsontable.hooks.register('afterColumnResize');\n\n      this.bindEvents();\n\n      _get(ManualColumnResize.prototype.__proto__ || Object.getPrototypeOf(ManualColumnResize.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      var initialColumnWidth = this.hot.getSettings().manualColumnResize;\n\n      if (Array.isArray(initialColumnWidth)) {\n        this.manualColumnWidths = initialColumnWidth;\n      } else if (!initialColumnWidth) {\n        this.manualColumnWidths = [];\n      }\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(ManualColumnResize.prototype.__proto__ || Object.getPrototypeOf(ManualColumnResize.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Save the current sizes using the persistentState plugin.\n     */\n\n  }, {\n    key: 'saveManualColumnWidths',\n    value: function saveManualColumnWidths() {\n      this.hot.runHooks('persistentStateSave', 'manualColumnWidths', this.manualColumnWidths);\n    }\n\n    /**\n     * Load the previously saved sizes using the persistentState plugin.\n     *\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'loadManualColumnWidths',\n    value: function loadManualColumnWidths() {\n      var storedState = {};\n\n      this.hot.runHooks('persistentStateLoad', 'manualColumnWidths', storedState);\n\n      return storedState.value;\n    }\n\n    /**\n     * Set the resize handle position.\n     *\n     * @param {HTMLCellElement} TH TH HTML element.\n     */\n\n  }, {\n    key: 'setupHandlePosition',\n    value: function setupHandlePosition(TH) {\n      var _this3 = this;\n\n      if (!TH.parentNode) {\n        return false;\n      }\n\n      this.currentTH = TH;\n\n      var col = this.hot.view.wt.wtTable.getCoords(TH).col; // getCoords returns CellCoords\n      var headerHeight = (0, _element.outerHeight)(this.currentTH);\n\n      if (col >= 0) {\n        // if not col header\n        var box = this.currentTH.getBoundingClientRect();\n\n        this.currentCol = col;\n        this.selectedCols = [];\n\n        if (this.hot.selection.isSelected() && this.hot.selection.isSelectedByColumnHeader()) {\n          var _hot$getSelectedRange = this.hot.getSelectedRangeLast(),\n              from = _hot$getSelectedRange.from,\n              to = _hot$getSelectedRange.to;\n\n          var start = from.col;\n          var end = to.col;\n\n          if (start >= end) {\n            start = to.col;\n            end = from.col;\n          }\n\n          if (this.currentCol >= start && this.currentCol <= end) {\n            (0, _number.rangeEach)(start, end, function (i) {\n              return _this3.selectedCols.push(i);\n            });\n          } else {\n            this.selectedCols.push(this.currentCol);\n          }\n        } else {\n          this.selectedCols.push(this.currentCol);\n        }\n\n        this.startOffset = box.left - 6;\n        this.startWidth = parseInt(box.width, 10);\n        this.handle.style.top = box.top + 'px';\n        this.handle.style.left = this.startOffset + this.startWidth + 'px';\n        this.handle.style.height = headerHeight + 'px';\n        this.hot.rootElement.appendChild(this.handle);\n      }\n    }\n\n    /**\n     * Refresh the resize handle position.\n     */\n\n  }, {\n    key: 'refreshHandlePosition',\n    value: function refreshHandlePosition() {\n      this.handle.style.left = this.startOffset + this.currentWidth + 'px';\n    }\n\n    /**\n     * Set the resize guide position.\n     */\n\n  }, {\n    key: 'setupGuidePosition',\n    value: function setupGuidePosition() {\n      var handleHeight = parseInt((0, _element.outerHeight)(this.handle), 10);\n      var handleBottomPosition = parseInt(this.handle.style.top, 10) + handleHeight;\n      var maximumVisibleElementHeight = parseInt(this.hot.view.maximumVisibleElementHeight(0), 10);\n\n      (0, _element.addClass)(this.handle, 'active');\n      (0, _element.addClass)(this.guide, 'active');\n\n      this.guide.style.top = handleBottomPosition + 'px';\n      this.guide.style.left = this.handle.style.left;\n      this.guide.style.height = maximumVisibleElementHeight - handleHeight + 'px';\n      this.hot.rootElement.appendChild(this.guide);\n    }\n\n    /**\n     * Refresh the resize guide position.\n     */\n\n  }, {\n    key: 'refreshGuidePosition',\n    value: function refreshGuidePosition() {\n      this.guide.style.left = this.handle.style.left;\n    }\n\n    /**\n     * Hide both the resize handle and resize guide.\n     */\n\n  }, {\n    key: 'hideHandleAndGuide',\n    value: function hideHandleAndGuide() {\n      (0, _element.removeClass)(this.handle, 'active');\n      (0, _element.removeClass)(this.guide, 'active');\n    }\n\n    /**\n     * Check if provided element is considered a column header.\n     *\n     * @param {HTMLElement} element HTML element.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'checkIfColumnHeader',\n    value: function checkIfColumnHeader(element) {\n      if (element != this.hot.rootElement) {\n        var parent = element.parentNode;\n\n        if (parent.tagName === 'THEAD') {\n          return true;\n        }\n\n        return this.checkIfColumnHeader(parent);\n      }\n\n      return false;\n    }\n\n    /**\n     * Get the TH element from the provided element.\n     *\n     * @param {HTMLElement} element HTML element.\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'getTHFromTargetElement',\n    value: function getTHFromTargetElement(element) {\n      if (element.tagName != 'TABLE') {\n        if (element.tagName == 'TH') {\n          return element;\n        }\n        return this.getTHFromTargetElement(element.parentNode);\n      }\n\n      return null;\n    }\n\n    /**\n     * 'mouseover' event callback - set the handle position.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseOver',\n    value: function onMouseOver(event) {\n      if (this.checkIfColumnHeader(event.target)) {\n        var th = this.getTHFromTargetElement(event.target);\n\n        if (!th) {\n          return;\n        }\n\n        var colspan = th.getAttribute('colspan');\n\n        if (th && (colspan === null || colspan === 1)) {\n          if (!this.pressed) {\n            this.setupHandlePosition(th);\n          }\n        }\n      }\n    }\n\n    /**\n     * Auto-size row after doubleclick - callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'afterMouseDownTimeout',\n    value: function afterMouseDownTimeout() {\n      var _this4 = this;\n\n      var render = function render() {\n        _this4.hot.forceFullRender = true;\n        _this4.hot.view.render(); // updates all\n        _this4.hot.view.wt.wtOverlays.adjustElementsSize(true);\n      };\n      var resize = function resize(selectedCol, forceRender) {\n        var hookNewSize = _this4.hot.runHooks('beforeColumnResize', selectedCol, _this4.newSize, true);\n\n        if (hookNewSize !== void 0) {\n          _this4.newSize = hookNewSize;\n        }\n\n        if (_this4.hot.getSettings().stretchH === 'all') {\n          _this4.clearManualSize(selectedCol);\n        } else {\n          _this4.setManualSize(selectedCol, _this4.newSize); // double click sets by auto row size plugin\n        }\n\n        if (forceRender) {\n          render();\n        }\n\n        _this4.saveManualColumnWidths();\n\n        _this4.hot.runHooks('afterColumnResize', selectedCol, _this4.newSize, true);\n      };\n\n      if (this.dblclick >= 2) {\n        var selectedColsLength = this.selectedCols.length;\n\n        if (selectedColsLength > 1) {\n          (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n            resize(selectedCol);\n          });\n          render();\n        } else {\n          (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n            resize(selectedCol, true);\n          });\n        }\n      }\n      this.dblclick = 0;\n      this.autoresizeTimeout = null;\n    }\n\n    /**\n     * 'mousedown' event callback.\n     *\n     * @private\n     * @param {MouseEvent} e\n     */\n\n  }, {\n    key: 'onMouseDown',\n    value: function onMouseDown(event) {\n      var _this5 = this;\n\n      if ((0, _element.hasClass)(event.target, 'manualColumnResizer')) {\n        this.setupGuidePosition();\n        this.pressed = this.hot;\n\n        if (this.autoresizeTimeout === null) {\n          this.autoresizeTimeout = setTimeout(function () {\n            return _this5.afterMouseDownTimeout();\n          }, 500);\n\n          this.hot._registerTimeout(this.autoresizeTimeout);\n        }\n        this.dblclick++;\n\n        this.startX = (0, _event.pageX)(event);\n        this.newSize = this.startWidth;\n      }\n    }\n\n    /**\n     * 'mousemove' event callback - refresh the handle and guide positions, cache the new column width.\n     *\n     * @private\n     * @param {MouseEvent} e\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var _this6 = this;\n\n      if (this.pressed) {\n        this.currentWidth = this.startWidth + ((0, _event.pageX)(event) - this.startX);\n\n        (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n          _this6.newSize = _this6.setManualSize(selectedCol, _this6.currentWidth);\n        });\n\n        this.refreshHandlePosition();\n        this.refreshGuidePosition();\n      }\n    }\n\n    /**\n     * 'mouseup' event callback - apply the column resizing.\n     *\n     * @private\n     * @param {MouseEvent} e\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp(event) {\n      var _this7 = this;\n\n      var render = function render() {\n        _this7.hot.forceFullRender = true;\n        _this7.hot.view.render(); // updates all\n        _this7.hot.view.wt.wtOverlays.adjustElementsSize(true);\n      };\n      var resize = function resize(selectedCol, forceRender) {\n        _this7.hot.runHooks('beforeColumnResize', selectedCol, _this7.newSize);\n\n        if (forceRender) {\n          render();\n        }\n\n        _this7.saveManualColumnWidths();\n\n        _this7.hot.runHooks('afterColumnResize', selectedCol, _this7.newSize);\n      };\n\n      if (this.pressed) {\n        this.hideHandleAndGuide();\n        this.pressed = false;\n\n        if (this.newSize != this.startWidth) {\n          var selectedColsLength = this.selectedCols.length;\n\n          if (selectedColsLength > 1) {\n            (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n              resize(selectedCol);\n            });\n            render();\n          } else {\n            (0, _array.arrayEach)(this.selectedCols, function (selectedCol) {\n              resize(selectedCol, true);\n            });\n          }\n        }\n\n        this.setupHandlePosition(this.currentTH);\n      }\n    }\n\n    /**\n     * Bind the mouse events.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'bindEvents',\n    value: function bindEvents() {\n      var _this8 = this;\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'mouseover', function (e) {\n        return _this8.onMouseOver(e);\n      });\n      this.eventManager.addEventListener(this.hot.rootElement, 'mousedown', function (e) {\n        return _this8.onMouseDown(e);\n      });\n      this.eventManager.addEventListener(window, 'mousemove', function (e) {\n        return _this8.onMouseMove(e);\n      });\n      this.eventManager.addEventListener(window, 'mouseup', function (e) {\n        return _this8.onMouseUp(e);\n      });\n    }\n\n    /**\n     * Cache the current column width.\n     *\n     * @param {Number} column Visual column index.\n     * @param {Number} width Column width.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'setManualSize',\n    value: function setManualSize(column, width) {\n      width = Math.max(width, 20);\n\n      /**\n       *  We need to run col through modifyCol hook, in case the order of displayed columns is different than the order\n       *  in data source. For instance, this order can be modified by manualColumnMove plugin.\n       */\n      column = this.hot.runHooks('modifyCol', column);\n\n      this.manualColumnWidths[column] = width;\n\n      return width;\n    }\n\n    /**\n     * Clear cache for the current column index.\n     *\n     * @param {Number} column Visual column index.\n     */\n\n  }, {\n    key: 'clearManualSize',\n    value: function clearManualSize(column) {\n      column = this.hot.runHooks('modifyCol', column);\n\n      this.manualColumnWidths[column] = void 0;\n    }\n\n    /**\n     * Modify the provided column width, based on the plugin settings\n     *\n     * @private\n     * @param {Number} width Column width.\n     * @param {Number} column Visual column index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onModifyColWidth',\n    value: function onModifyColWidth(width, column) {\n      if (this.enabled) {\n        column = this.hot.runHooks('modifyCol', column);\n\n        if (this.hot.getSettings().manualColumnResize && this.manualColumnWidths[column]) {\n          return this.manualColumnWidths[column];\n        }\n      }\n\n      return width;\n    }\n\n    /**\n     * Modify the provided column stretched width. This hook decides if specified column should be stretched or not.\n     *\n     * @private\n     * @param {Number} stretchedWidth Stretched width.\n     * @param {Number} column Physical column index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onBeforeStretchingColumnWidth',\n    value: function onBeforeStretchingColumnWidth(stretchedWidth, column) {\n      var width = this.manualColumnWidths[column];\n\n      if (width === void 0) {\n        width = stretchedWidth;\n      }\n\n      return width;\n    }\n\n    /**\n     * `beforeColumnResize` hook callback.\n     *\n     * @private\n     * @param {Number} currentColumn Index of the resized column.\n     * @param {Number} newSize Calculated new column width.\n     * @param {Boolean} isDoubleClick Flag that determines whether there was a double-click.\n     */\n\n  }, {\n    key: 'onBeforeColumnResize',\n    value: function onBeforeColumnResize() {\n      // clear the header height cache information\n      this.hot.view.wt.wtViewport.hasOversizedColumnHeadersMarked = {};\n    }\n  }]);\n\n  return ManualColumnResize;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('manualColumnResize', ManualColumnResize);\n\nexports.default = ManualColumnResize;\n\n/***/ }),\n/* 338 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _element = __webpack_require__(0);\n\nvar _number = __webpack_require__(5);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nvar _rowsMapper = __webpack_require__(339);\n\nvar _rowsMapper2 = _interopRequireDefault(_rowsMapper);\n\nvar _backlight = __webpack_require__(340);\n\nvar _backlight2 = _interopRequireDefault(_backlight);\n\nvar _guideline = __webpack_require__(341);\n\nvar _guideline2 = _interopRequireDefault(_guideline);\n\nvar _src = __webpack_require__(4);\n\n__webpack_require__(342);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('beforeRowMove');\n_pluginHooks2.default.getSingleton().register('afterRowMove');\n_pluginHooks2.default.getSingleton().register('unmodifyRow');\n\nvar privatePool = new WeakMap();\nvar CSS_PLUGIN = 'ht__manualRowMove';\nvar CSS_SHOW_UI = 'show-ui';\nvar CSS_ON_MOVING = 'on-moving--rows';\nvar CSS_AFTER_SELECTION = 'after-selection--rows';\n\n/**\n * @plugin ManualRowMove\n *\n * @description\n * This plugin allows to change rows order.\n *\n * API:\n * - moveRow - move single row to the new position.\n * - moveRows - move many rows (as an array of indexes) to the new position.\n *\n * If you want apply visual changes, you have to call manually the render() method on the instance of handsontable.\n *\n * UI components:\n * - backlight - highlight of selected rows.\n * - guideline - line which shows where rows has been moved.\n *\n * @class ManualRowMove\n * @plugin ManualRowMove\n */\n\nvar ManualRowMove = function (_BasePlugin) {\n  _inherits(ManualRowMove, _BasePlugin);\n\n  function ManualRowMove(hotInstance) {\n    _classCallCheck(this, ManualRowMove);\n\n    /**\n     * Set up WeakMap of plugin to sharing private parameters;\n     */\n    var _this = _possibleConstructorReturn(this, (ManualRowMove.__proto__ || Object.getPrototypeOf(ManualRowMove)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      rowsToMove: [],\n      pressed: void 0,\n      disallowMoving: void 0,\n      target: {\n        eventPageY: void 0,\n        coords: void 0,\n        TD: void 0,\n        row: void 0\n      }\n    });\n\n    /**\n     * List of last removed row indexes.\n     *\n     * @type {Array}\n     */\n    _this.removedRows = [];\n    /**\n     * Object containing visual row indexes mapped to data source indexes.\n     *\n     * @type {RowsMapper}\n     */\n    _this.rowsMapper = new _rowsMapper2.default(_this);\n    /**\n     * Event Manager object.\n     *\n     * @type {Object}\n     */\n    _this.eventManager = new _eventManager2.default(_this);\n    /**\n     * Backlight UI object.\n     *\n     * @type {Object}\n     */\n    _this.backlight = new _backlight2.default(hotInstance);\n    /**\n     * Guideline UI object.\n     *\n     * @type {Object}\n     */\n    _this.guideline = new _guideline2.default(hotInstance);\n    return _this;\n  }\n\n  /**\n   * Check if plugin is enabled.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualRowMove, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().manualRowMove;\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('beforeOnCellMouseDown', function (event, coords, TD, blockCalculations) {\n        return _this2.onBeforeOnCellMouseDown(event, coords, TD, blockCalculations);\n      });\n      this.addHook('beforeOnCellMouseOver', function (event, coords, TD, blockCalculations) {\n        return _this2.onBeforeOnCellMouseOver(event, coords, TD, blockCalculations);\n      });\n      this.addHook('afterScrollHorizontally', function () {\n        return _this2.onAfterScrollHorizontally();\n      });\n      this.addHook('modifyRow', function (row, source) {\n        return _this2.onModifyRow(row, source);\n      });\n      this.addHook('beforeRemoveRow', function (index, amount) {\n        return _this2.onBeforeRemoveRow(index, amount);\n      });\n      this.addHook('afterRemoveRow', function () {\n        return _this2.onAfterRemoveRow();\n      });\n      this.addHook('afterCreateRow', function (index, amount) {\n        return _this2.onAfterCreateRow(index, amount);\n      });\n      this.addHook('afterLoadData', function () {\n        return _this2.onAfterLoadData();\n      });\n      this.addHook('beforeColumnSort', function (column, order) {\n        return _this2.onBeforeColumnSort(column, order);\n      });\n      this.addHook('unmodifyRow', function (row) {\n        return _this2.onUnmodifyRow(row);\n      });\n\n      this.registerEvents();\n\n      // TODO: move adding plugin classname to BasePlugin.\n      (0, _element.addClass)(this.hot.rootElement, CSS_PLUGIN);\n\n      _get(ManualRowMove.prototype.__proto__ || Object.getPrototypeOf(ManualRowMove.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      this.onAfterPluginsInitialized();\n\n      _get(ManualRowMove.prototype.__proto__ || Object.getPrototypeOf(ManualRowMove.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      var pluginSettings = this.hot.getSettings().manualRowMove;\n\n      if (Array.isArray(pluginSettings)) {\n        this.rowsMapper.clearMap();\n      }\n\n      (0, _element.removeClass)(this.hot.rootElement, CSS_PLUGIN);\n\n      this.unregisterEvents();\n      this.backlight.destroy();\n      this.guideline.destroy();\n\n      _get(ManualRowMove.prototype.__proto__ || Object.getPrototypeOf(ManualRowMove.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Move a single row.\n     *\n     * @param {Number} row Visual row index to be moved.\n     * @param {Number} target Visual row index being a target for the moved row.\n     */\n\n  }, {\n    key: 'moveRow',\n    value: function moveRow(row, target) {\n      this.moveRows([row], target);\n    }\n\n    /**\n     * Move multiple rows.\n     *\n     * @param {Array} rows Array of visual row indexes to be moved.\n     * @param {Number} target Visual row index being a target for the moved rows.\n     */\n\n  }, {\n    key: 'moveRows',\n    value: function moveRows(rows, target) {\n      var _this3 = this;\n\n      var visualRows = [].concat(_toConsumableArray(rows));\n      var priv = privatePool.get(this);\n      var beforeMoveHook = this.hot.runHooks('beforeRowMove', visualRows, target);\n\n      priv.disallowMoving = beforeMoveHook === false;\n\n      if (!priv.disallowMoving) {\n        // first we need to rewrite an visual indexes to physical for save reference after move\n        (0, _array.arrayEach)(rows, function (row, index, array) {\n          array[index] = _this3.rowsMapper.getValueByIndex(row);\n        });\n\n        // next, when we have got an physical indexes, we can move rows\n        (0, _array.arrayEach)(rows, function (row, index) {\n          var actualPosition = _this3.rowsMapper.getIndexByValue(row);\n\n          if (actualPosition !== target) {\n            _this3.rowsMapper.moveRow(actualPosition, target + index);\n          }\n        });\n\n        // after moving we have to clear rowsMapper from null entries\n        this.rowsMapper.clearNull();\n      }\n\n      this.hot.runHooks('afterRowMove', visualRows, target);\n    }\n\n    /**\n     * Correct the cell selection after the move action. Fired only when action was made with a mouse.\n     * That means that changing the row order using the API won't correct the selection.\n     *\n     * @private\n     * @param {Number} startRow Visual row index for the start of the selection.\n     * @param {Number} endRow Visual row index for the end of the selection.\n     */\n\n  }, {\n    key: 'changeSelection',\n    value: function changeSelection(startRow, endRow) {\n      this.hot.selectRows(startRow, endRow);\n    }\n\n    /**\n     * Get the sum of the heights of rows in the provided range.\n     *\n     * @private\n     * @param {Number} from Visual row index.\n     * @param {Number} to Visual row index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'getRowsHeight',\n    value: function getRowsHeight(from, to) {\n      var height = 0;\n\n      for (var i = from; i < to; i++) {\n        var rowHeight = this.hot.view.wt.wtTable.getRowHeight(i) || 23;\n\n        height += rowHeight;\n      }\n\n      return height;\n    }\n\n    /**\n     * Load initial settings when persistent state is saved or when plugin was initialized as an array.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'initialSettings',\n    value: function initialSettings() {\n      var pluginSettings = this.hot.getSettings().manualRowMove;\n\n      if (Array.isArray(pluginSettings)) {\n        this.moveRows(pluginSettings, 0);\n      } else if (pluginSettings !== void 0) {\n        var persistentState = this.persistentStateLoad();\n\n        if (persistentState.length) {\n          this.moveRows(persistentState, 0);\n        }\n      }\n    }\n\n    /**\n     * Check if the provided row is in the fixedRowsTop section.\n     *\n     * @private\n     * @param {Number} row Visual row index to check.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isFixedRowTop',\n    value: function isFixedRowTop(row) {\n      return row < this.hot.getSettings().fixedRowsTop;\n    }\n\n    /**\n     * Check if the provided row is in the fixedRowsBottom section.\n     *\n     * @private\n     * @param {Number} row Visual row index to check.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isFixedRowBottom',\n    value: function isFixedRowBottom(row) {\n      return row > this.hot.getSettings().fixedRowsBottom;\n    }\n\n    /**\n     * Save the manual row positions to the persistent state.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'persistentStateSave',\n    value: function persistentStateSave() {\n      this.hot.runHooks('persistentStateSave', 'manualRowMove', this.rowsMapper._arrayMap);\n    }\n\n    /**\n     * Load the manual row positions from the persistent state.\n     *\n     * @private\n     * @returns {Array} Stored state.\n     */\n\n  }, {\n    key: 'persistentStateLoad',\n    value: function persistentStateLoad() {\n      var storedState = {};\n\n      this.hot.runHooks('persistentStateLoad', 'manualRowMove', storedState);\n\n      return storedState.value ? storedState.value : [];\n    }\n\n    /**\n     * Prepare array of indexes based on actual selection.\n     *\n     * @private\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'prepareRowsToMoving',\n    value: function prepareRowsToMoving() {\n      var selection = this.hot.getSelectedRangeLast();\n      var selectedRows = [];\n\n      if (!selection) {\n        return selectedRows;\n      }\n\n      var from = selection.from,\n          to = selection.to;\n\n      var start = Math.min(from.row, to.row);\n      var end = Math.max(from.row, to.row);\n\n      (0, _number.rangeEach)(start, end, function (i) {\n        selectedRows.push(i);\n      });\n\n      return selectedRows;\n    }\n\n    /**\n     * Update the UI visual position.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'refreshPositions',\n    value: function refreshPositions() {\n      var priv = privatePool.get(this);\n      var coords = priv.target.coords;\n      var firstVisible = this.hot.view.wt.wtTable.getFirstVisibleRow();\n      var lastVisible = this.hot.view.wt.wtTable.getLastVisibleRow();\n      var fixedRows = this.hot.getSettings().fixedRowsTop;\n      var countRows = this.hot.countRows();\n\n      if (coords.row < fixedRows && firstVisible > 0) {\n        this.hot.scrollViewportTo(firstVisible - 1);\n      }\n      if (coords.row >= lastVisible && lastVisible < countRows) {\n        this.hot.scrollViewportTo(lastVisible + 1, undefined, true);\n      }\n\n      var wtTable = this.hot.view.wt.wtTable;\n      var TD = priv.target.TD;\n      var rootElementOffset = (0, _element.offset)(this.hot.rootElement);\n      var tdOffsetTop = this.hot.view.THEAD.offsetHeight + this.getRowsHeight(0, coords.row);\n      var mouseOffsetTop = priv.target.eventPageY - rootElementOffset.top + wtTable.holder.scrollTop;\n      var hiderHeight = wtTable.hider.offsetHeight;\n      var tbodyOffsetTop = wtTable.TBODY.offsetTop;\n      var backlightElemMarginTop = this.backlight.getOffset().top;\n      var backlightElemHeight = this.backlight.getSize().height;\n\n      if (this.isFixedRowTop(coords.row)) {\n        tdOffsetTop += wtTable.holder.scrollTop;\n      }\n\n      // todo: fixedRowsBottom\n      // if (this.isFixedRowBottom(coords.row)) {\n      //\n      // }\n\n      if (coords.row < 0) {\n        // if hover on colHeader\n        priv.target.row = firstVisible > 0 ? firstVisible - 1 : firstVisible;\n      } else if (TD.offsetHeight / 2 + tdOffsetTop <= mouseOffsetTop) {\n        // if hover on lower part of TD\n        priv.target.row = coords.row + 1;\n        // unfortunately first row is bigger than rest\n        tdOffsetTop += coords.row === 0 ? TD.offsetHeight - 1 : TD.offsetHeight;\n      } else {\n        // elsewhere on table\n        priv.target.row = coords.row;\n      }\n\n      var backlightTop = mouseOffsetTop;\n      var guidelineTop = tdOffsetTop;\n\n      if (mouseOffsetTop + backlightElemHeight + backlightElemMarginTop >= hiderHeight) {\n        // prevent display backlight below table\n        backlightTop = hiderHeight - backlightElemHeight - backlightElemMarginTop;\n      } else if (mouseOffsetTop + backlightElemMarginTop < tbodyOffsetTop) {\n        // prevent display above below table\n        backlightTop = tbodyOffsetTop + Math.abs(backlightElemMarginTop);\n      }\n\n      if (tdOffsetTop >= hiderHeight - 1) {\n        // prevent display guideline below table\n        guidelineTop = hiderHeight - 1;\n      }\n\n      var topOverlayHeight = 0;\n      if (this.hot.view.wt.wtOverlays.topOverlay) {\n        topOverlayHeight = this.hot.view.wt.wtOverlays.topOverlay.clone.wtTable.TABLE.offsetHeight;\n      }\n\n      if (coords.row >= fixedRows && guidelineTop - wtTable.holder.scrollTop < topOverlayHeight) {\n        this.hot.scrollViewportTo(coords.row);\n      }\n\n      this.backlight.setPosition(backlightTop);\n      this.guideline.setPosition(guidelineTop);\n    }\n\n    /**\n     * This method checks arrayMap from rowsMapper and updates the rowsMapper if it's necessary.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'updateRowsMapper',\n    value: function updateRowsMapper() {\n      var countRows = this.hot.countSourceRows();\n      var rowsMapperLen = this.rowsMapper._arrayMap.length;\n\n      if (rowsMapperLen === 0) {\n        this.rowsMapper.createMap(countRows || this.hot.getSettings().startRows);\n      } else if (rowsMapperLen < countRows) {\n        var diff = countRows - rowsMapperLen;\n\n        this.rowsMapper.insertItems(rowsMapperLen, diff);\n      } else if (rowsMapperLen > countRows) {\n        var maxIndex = countRows - 1;\n        var rowsToRemove = [];\n\n        (0, _array.arrayEach)(this.rowsMapper._arrayMap, function (value, index) {\n          if (value > maxIndex) {\n            rowsToRemove.push(index);\n          }\n        });\n\n        this.rowsMapper.removeItems(rowsToRemove);\n      }\n    }\n\n    /**\n     * Bind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this4 = this;\n\n      this.eventManager.addEventListener(document.documentElement, 'mousemove', function (event) {\n        return _this4.onMouseMove(event);\n      });\n      this.eventManager.addEventListener(document.documentElement, 'mouseup', function () {\n        return _this4.onMouseUp();\n      });\n    }\n\n    /**\n     * Unbind the events used by the plugin.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'unregisterEvents',\n    value: function unregisterEvents() {\n      this.eventManager.clear();\n    }\n\n    /**\n     * `beforeColumnSort` hook callback. If user uses the sorting, manual row moving is disabled.\n     *\n     * @private\n     * @param {Number} column Column index where soring is present\n     * @param {*} order State of sorting. ASC/DESC/None\n     */\n\n  }, {\n    key: 'onBeforeColumnSort',\n    value: function onBeforeColumnSort(column, order) {\n      var priv = privatePool.get(this);\n\n      priv.disallowMoving = order !== void 0;\n    }\n\n    /**\n     * Change the behavior of selection / dragging.\n     *\n     * @private\n     * @param {MouseEvent} event\n     * @param {CellCoords} coords Visual coordinates.\n     * @param {HTMLElement} TD\n     * @param {Object} blockCalculations\n     */\n\n  }, {\n    key: 'onBeforeOnCellMouseDown',\n    value: function onBeforeOnCellMouseDown(event, coords, TD, blockCalculations) {\n      var wtTable = this.hot.view.wt.wtTable;\n      var isHeaderSelection = this.hot.selection.isSelectedByRowHeader();\n      var selection = this.hot.getSelectedRangeLast();\n      var priv = privatePool.get(this);\n\n      if (!selection || !isHeaderSelection || priv.pressed || event.button !== 0) {\n        priv.pressed = false;\n        priv.rowsToMove.length = 0;\n        (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI]);\n        return;\n      }\n\n      var guidelineIsNotReady = this.guideline.isBuilt() && !this.guideline.isAppended();\n      var backlightIsNotReady = this.backlight.isBuilt() && !this.backlight.isAppended();\n\n      if (guidelineIsNotReady && backlightIsNotReady) {\n        this.guideline.appendTo(wtTable.hider);\n        this.backlight.appendTo(wtTable.hider);\n      }\n\n      var from = selection.from,\n          to = selection.to;\n\n      var start = Math.min(from.row, to.row);\n      var end = Math.max(from.row, to.row);\n\n      if (coords.col < 0 && coords.row >= start && coords.row <= end) {\n        blockCalculations.row = true;\n        priv.pressed = true;\n        priv.target.eventPageY = event.pageY;\n        priv.target.coords = coords;\n        priv.target.TD = TD;\n        priv.rowsToMove = this.prepareRowsToMoving();\n\n        var leftPos = wtTable.holder.scrollLeft + this.hot.view.wt.wtViewport.getRowHeaderWidth();\n\n        this.backlight.setPosition(null, leftPos);\n        this.backlight.setSize(wtTable.hider.offsetWidth - leftPos, this.getRowsHeight(start, end + 1));\n        this.backlight.setOffset((this.getRowsHeight(start, coords.row) + event.layerY) * -1, null);\n\n        (0, _element.addClass)(this.hot.rootElement, CSS_ON_MOVING);\n\n        this.refreshPositions();\n      } else {\n        (0, _element.removeClass)(this.hot.rootElement, CSS_AFTER_SELECTION);\n        priv.pressed = false;\n        priv.rowsToMove.length = 0;\n      }\n    }\n\n    /**\n     * 'mouseMove' event callback. Fired when pointer move on document.documentElement.\n     *\n     * @private\n     * @param {MouseEvent} event `mousemove` event properties.\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var priv = privatePool.get(this);\n\n      if (!priv.pressed) {\n        return;\n      }\n\n      // callback for browser which doesn't supports CSS pointer-event: none\n      if (event.realTarget === this.backlight.element) {\n        var height = this.backlight.getSize().height;\n        this.backlight.setSize(null, 0);\n\n        setTimeout(function () {\n          this.backlight.setPosition(null, height);\n        });\n      }\n\n      priv.target.eventPageY = event.pageY;\n      this.refreshPositions();\n    }\n\n    /**\n     * 'beforeOnCellMouseOver' hook callback. Fired when pointer was over cell.\n     *\n     * @private\n     * @param {MouseEvent} event `mouseover` event properties.\n     * @param {CellCoords} coords Visual cell coordinates where was fired event.\n     * @param {HTMLElement} TD Cell represented as HTMLElement.\n     * @param {Object} blockCalculations Object which contains information about blockCalculation for row, column or cells.\n     */\n\n  }, {\n    key: 'onBeforeOnCellMouseOver',\n    value: function onBeforeOnCellMouseOver(event, coords, TD, blockCalculations) {\n      var selectedRange = this.hot.getSelectedRangeLast();\n      var priv = privatePool.get(this);\n\n      if (!selectedRange || !priv.pressed) {\n        return;\n      }\n\n      if (priv.rowsToMove.indexOf(coords.row) > -1) {\n        (0, _element.removeClass)(this.hot.rootElement, CSS_SHOW_UI);\n      } else {\n        (0, _element.addClass)(this.hot.rootElement, CSS_SHOW_UI);\n      }\n\n      blockCalculations.row = true;\n      blockCalculations.column = true;\n      blockCalculations.cell = true;\n      priv.target.coords = coords;\n      priv.target.TD = TD;\n    }\n\n    /**\n     * `onMouseUp` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp() {\n      var priv = privatePool.get(this);\n      var target = priv.target.row;\n      var rowsLen = priv.rowsToMove.length;\n\n      priv.pressed = false;\n      priv.backlightHeight = 0;\n\n      (0, _element.removeClass)(this.hot.rootElement, [CSS_ON_MOVING, CSS_SHOW_UI, CSS_AFTER_SELECTION]);\n\n      if (this.hot.selection.isSelectedByRowHeader()) {\n        (0, _element.addClass)(this.hot.rootElement, CSS_AFTER_SELECTION);\n      }\n\n      if (rowsLen < 1 || target === void 0 || priv.rowsToMove.indexOf(target) > -1 || priv.rowsToMove[rowsLen - 1] === target - 1) {\n        return;\n      }\n\n      this.moveRows(priv.rowsToMove, target);\n\n      this.persistentStateSave();\n      this.hot.render();\n\n      if (!priv.disallowMoving) {\n        var selectionStart = this.rowsMapper.getIndexByValue(priv.rowsToMove[0]);\n        var selectionEnd = this.rowsMapper.getIndexByValue(priv.rowsToMove[rowsLen - 1]);\n        this.changeSelection(selectionStart, selectionEnd);\n      }\n\n      priv.rowsToMove.length = 0;\n    }\n\n    /**\n     * `afterScrollHorizontally` hook callback. Fired the table was scrolled horizontally.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterScrollHorizontally',\n    value: function onAfterScrollHorizontally() {\n      var wtTable = this.hot.view.wt.wtTable;\n      var headerWidth = this.hot.view.wt.wtViewport.getRowHeaderWidth();\n      var scrollLeft = wtTable.holder.scrollLeft;\n      var posLeft = headerWidth + scrollLeft;\n\n      this.backlight.setPosition(null, posLeft);\n      this.backlight.setSize(wtTable.hider.offsetWidth - posLeft);\n    }\n\n    /**\n     * `afterCreateRow` hook callback.\n     *\n     * @private\n     * @param {Number} index Visual index of the created row.\n     * @param {Number} amount Amount of created rows.\n     */\n\n  }, {\n    key: 'onAfterCreateRow',\n    value: function onAfterCreateRow(index, amount) {\n      this.rowsMapper.shiftItems(index, amount);\n    }\n\n    /**\n     * On before remove row listener.\n     *\n     * @private\n     * @param {Number} index Visual row index.\n     * @param {Number} amount Defines how many rows removed.\n     */\n\n  }, {\n    key: 'onBeforeRemoveRow',\n    value: function onBeforeRemoveRow(index, amount) {\n      var _this5 = this;\n\n      this.removedRows.length = 0;\n\n      if (index !== false) {\n        // Collect physical row index.\n        (0, _number.rangeEach)(index, index + amount - 1, function (removedIndex) {\n          _this5.removedRows.push(_this5.hot.runHooks('modifyRow', removedIndex, _this5.pluginName));\n        });\n      }\n    }\n\n    /**\n     * `afterRemoveRow` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterRemoveRow',\n    value: function onAfterRemoveRow() {\n      this.rowsMapper.unshiftItems(this.removedRows);\n    }\n\n    /**\n     * `afterLoadData` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData() {\n      this.updateRowsMapper();\n    }\n\n    /**\n     * 'modifyRow' hook callback.\n     *\n     * @private\n     * @param {Number} row Visual Row index.\n     * @returns {Number} Physical row index.\n     */\n\n  }, {\n    key: 'onModifyRow',\n    value: function onModifyRow(row, source) {\n      if (source !== this.pluginName) {\n        var rowInMapper = this.rowsMapper.getValueByIndex(row);\n        row = rowInMapper === null ? row : rowInMapper;\n      }\n\n      return row;\n    }\n\n    /**\n     * 'unmodifyRow' hook callback.\n     *\n     * @private\n     * @param {Number} row Physical row index.\n     * @returns {Number} Visual row index.\n     */\n\n  }, {\n    key: 'onUnmodifyRow',\n    value: function onUnmodifyRow(row) {\n      var indexInMapper = this.rowsMapper.getIndexByValue(row);\n\n      return indexInMapper === null ? row : indexInMapper;\n    }\n\n    /**\n     * `afterPluginsInitialized` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterPluginsInitialized',\n    value: function onAfterPluginsInitialized() {\n      this.updateRowsMapper();\n      this.initialSettings();\n      this.backlight.build();\n      this.guideline.build();\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this.backlight.destroy();\n      this.guideline.destroy();\n\n      _get(ManualRowMove.prototype.__proto__ || Object.getPrototypeOf(ManualRowMove.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return ManualRowMove;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('ManualRowMove', ManualRowMove);\n\nexports.default = ManualRowMove;\n\n/***/ }),\n/* 339 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _arrayMapper = __webpack_require__(201);\n\nvar _arrayMapper2 = _interopRequireDefault(_arrayMapper);\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class RowsMapper\n * @plugin ManualRowMove\n */\nvar RowsMapper = function () {\n  function RowsMapper(manualRowMove) {\n    _classCallCheck(this, RowsMapper);\n\n    /**\n     * Instance of ManualRowMove plugin.\n     *\n     * @type {ManualRowMove}\n     */\n    this.manualRowMove = manualRowMove;\n  }\n\n  /**\n   * Reset current map array and create new one.\n   *\n   * @param {Number} [length] Custom generated map length.\n   */\n\n\n  _createClass(RowsMapper, [{\n    key: 'createMap',\n    value: function createMap(length) {\n      var _this = this;\n\n      var originLength = length === void 0 ? this._arrayMap.length : length;\n\n      this._arrayMap.length = 0;\n\n      (0, _number.rangeEach)(originLength - 1, function (itemIndex) {\n        _this._arrayMap[itemIndex] = itemIndex;\n      });\n    }\n\n    /**\n     * Destroy class.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this._arrayMap = null;\n    }\n\n    /**\n     *\n     * Moving elements in rowsMapper.\n     * @param {Number} from Row index to move.\n     * @param {Number} to Target index.\n     */\n\n  }, {\n    key: 'moveRow',\n    value: function moveRow(from, to) {\n      var indexToMove = this._arrayMap[from];\n      this._arrayMap[from] = null;\n      this._arrayMap.splice(to, 0, indexToMove);\n    }\n\n    /**\n     * Clearing arrayMap from `null` entries.\n     */\n\n  }, {\n    key: 'clearNull',\n    value: function clearNull() {\n      this._arrayMap = (0, _array.arrayFilter)(this._arrayMap, function (i) {\n        return i !== null;\n      });\n    }\n  }]);\n\n  return RowsMapper;\n}();\n\n(0, _object.mixin)(RowsMapper, _arrayMapper2.default);\n\nexports.default = RowsMapper;\n\n/***/ }),\n/* 340 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(203);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CSS_CLASSNAME = 'ht__manualRowMove--backlight';\n\n/**\n * @class BacklightUI\n * @util\n */\n\nvar BacklightUI = function (_BaseUI) {\n  _inherits(BacklightUI, _BaseUI);\n\n  function BacklightUI() {\n    _classCallCheck(this, BacklightUI);\n\n    return _possibleConstructorReturn(this, (BacklightUI.__proto__ || Object.getPrototypeOf(BacklightUI)).apply(this, arguments));\n  }\n\n  _createClass(BacklightUI, [{\n    key: 'build',\n\n    /**\n     * Custom className on build process.\n     */\n    value: function build() {\n      _get(BacklightUI.prototype.__proto__ || Object.getPrototypeOf(BacklightUI.prototype), 'build', this).call(this);\n\n      (0, _element.addClass)(this._element, CSS_CLASSNAME);\n    }\n  }]);\n\n  return BacklightUI;\n}(_base2.default);\n\nexports.default = BacklightUI;\n\n/***/ }),\n/* 341 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(203);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CSS_CLASSNAME = 'ht__manualRowMove--guideline';\n\n/**\n * @class GuidelineUI\n * @util\n */\n\nvar GuidelineUI = function (_BaseUI) {\n  _inherits(GuidelineUI, _BaseUI);\n\n  function GuidelineUI() {\n    _classCallCheck(this, GuidelineUI);\n\n    return _possibleConstructorReturn(this, (GuidelineUI.__proto__ || Object.getPrototypeOf(GuidelineUI)).apply(this, arguments));\n  }\n\n  _createClass(GuidelineUI, [{\n    key: 'build',\n\n    /**\n     * Custom className on build process.\n     */\n    value: function build() {\n      _get(GuidelineUI.prototype.__proto__ || Object.getPrototypeOf(GuidelineUI.prototype), 'build', this).call(this);\n\n      (0, _element.addClass)(this._element, CSS_CLASSNAME);\n    }\n  }]);\n\n  return GuidelineUI;\n}(_base2.default);\n\nexports.default = GuidelineUI;\n\n/***/ }),\n/* 342 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 343 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _element = __webpack_require__(0);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _event = __webpack_require__(12);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// Developer note! Whenever you make a change in this file, make an analogous change in manualRowResize.js\n\n/**\n * @description\n * ManualRowResize Plugin.\n *\n * Has 2 UI components:\n * - handle - the draggable element that sets the desired height of the row.\n * - guide - the helper guide that shows the desired height as a horizontal guide.\n *\n * @plugin ManualRowResize\n */\nvar ManualRowResize = function (_BasePlugin) {\n  _inherits(ManualRowResize, _BasePlugin);\n\n  function ManualRowResize(hotInstance) {\n    _classCallCheck(this, ManualRowResize);\n\n    var _this = _possibleConstructorReturn(this, (ManualRowResize.__proto__ || Object.getPrototypeOf(ManualRowResize)).call(this, hotInstance));\n\n    _this.currentTH = null;\n    _this.currentRow = null;\n    _this.selectedRows = [];\n    _this.currentHeight = null;\n    _this.newSize = null;\n    _this.startY = null;\n    _this.startHeight = null;\n    _this.startOffset = null;\n    _this.handle = document.createElement('DIV');\n    _this.guide = document.createElement('DIV');\n    _this.eventManager = new _eventManager2.default(_this);\n    _this.pressed = null;\n    _this.dblclick = 0;\n    _this.autoresizeTimeout = null;\n    _this.manualRowHeights = [];\n\n    (0, _element.addClass)(_this.handle, 'manualRowResizer');\n    (0, _element.addClass)(_this.guide, 'manualRowResizerGuide');\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ManualRowResize, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().manualRowResize;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.manualRowHeights = [];\n\n      var initialRowHeights = this.hot.getSettings().manualRowResize;\n      var loadedManualRowHeights = this.loadManualRowHeights();\n\n      if (typeof loadedManualRowHeights != 'undefined') {\n        this.manualRowHeights = loadedManualRowHeights;\n      } else if (Array.isArray(initialRowHeights)) {\n        this.manualRowHeights = initialRowHeights;\n      } else {\n        this.manualRowHeights = [];\n      }\n\n      this.addHook('modifyRowHeight', function (height, row) {\n        return _this2.onModifyRowHeight(height, row);\n      });\n\n      // Handsontable.hooks.register('beforeRowResize');\n      // Handsontable.hooks.register('afterRowResize');\n\n      this.bindEvents();\n\n      _get(ManualRowResize.prototype.__proto__ || Object.getPrototypeOf(ManualRowResize.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      var initialRowHeights = this.hot.getSettings().manualRowResize;\n\n      if (Array.isArray(initialRowHeights)) {\n        this.manualRowHeights = initialRowHeights;\n      } else if (!initialRowHeights) {\n        this.manualRowHeights = [];\n      }\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(ManualRowResize.prototype.__proto__ || Object.getPrototypeOf(ManualRowResize.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Save the current sizes using the persistentState plugin.\n     */\n\n  }, {\n    key: 'saveManualRowHeights',\n    value: function saveManualRowHeights() {\n      this.hot.runHooks('persistentStateSave', 'manualRowHeights', this.manualRowHeights);\n    }\n\n    /**\n     * Load the previously saved sizes using the persistentState plugin.\n     *\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'loadManualRowHeights',\n    value: function loadManualRowHeights() {\n      var storedState = {};\n\n      this.hot.runHooks('persistentStateLoad', 'manualRowHeights', storedState);\n\n      return storedState.value;\n    }\n\n    /**\n     * Set the resize handle position.\n     *\n     * @param {HTMLCellElement} TH TH HTML element.\n     */\n\n  }, {\n    key: 'setupHandlePosition',\n    value: function setupHandlePosition(TH) {\n      var _this3 = this;\n\n      this.currentTH = TH;\n      var row = this.hot.view.wt.wtTable.getCoords(TH).row; // getCoords returns CellCoords\n      var headerWidth = (0, _element.outerWidth)(this.currentTH);\n\n      if (row >= 0) {\n        // if not col header\n        var box = this.currentTH.getBoundingClientRect();\n\n        this.currentRow = row;\n        this.selectedRows = [];\n\n        if (this.hot.selection.isSelected() && this.hot.selection.isSelectedByRowHeader()) {\n          var _hot$getSelectedRange = this.hot.getSelectedRangeLast(),\n              from = _hot$getSelectedRange.from,\n              to = _hot$getSelectedRange.to;\n\n          var start = from.row;\n          var end = to.row;\n\n          if (start >= end) {\n            start = to.row;\n            end = from.row;\n          }\n\n          if (this.currentRow >= start && this.currentRow <= end) {\n            (0, _number.rangeEach)(start, end, function (i) {\n              return _this3.selectedRows.push(i);\n            });\n          } else {\n            this.selectedRows.push(this.currentRow);\n          }\n        } else {\n          this.selectedRows.push(this.currentRow);\n        }\n\n        this.startOffset = box.top - 6;\n        this.startHeight = parseInt(box.height, 10);\n        this.handle.style.left = box.left + 'px';\n        this.handle.style.top = this.startOffset + this.startHeight + 'px';\n        this.handle.style.width = headerWidth + 'px';\n        this.hot.rootElement.appendChild(this.handle);\n      }\n    }\n\n    /**\n     * Refresh the resize handle position.\n     */\n\n  }, {\n    key: 'refreshHandlePosition',\n    value: function refreshHandlePosition() {\n      this.handle.style.top = this.startOffset + this.currentHeight + 'px';\n    }\n\n    /**\n     * Set the resize guide position.\n     */\n\n  }, {\n    key: 'setupGuidePosition',\n    value: function setupGuidePosition() {\n      var handleWidth = parseInt((0, _element.outerWidth)(this.handle), 10);\n      var handleRightPosition = parseInt(this.handle.style.left, 10) + handleWidth;\n      var maximumVisibleElementWidth = parseInt(this.hot.view.maximumVisibleElementWidth(0), 10);\n      (0, _element.addClass)(this.handle, 'active');\n      (0, _element.addClass)(this.guide, 'active');\n\n      this.guide.style.top = this.handle.style.top;\n      this.guide.style.left = handleRightPosition + 'px';\n      this.guide.style.width = maximumVisibleElementWidth - handleWidth + 'px';\n      this.hot.rootElement.appendChild(this.guide);\n    }\n\n    /**\n     * Refresh the resize guide position.\n     */\n\n  }, {\n    key: 'refreshGuidePosition',\n    value: function refreshGuidePosition() {\n      this.guide.style.top = this.handle.style.top;\n    }\n\n    /**\n     * Hide both the resize handle and resize guide.\n     */\n\n  }, {\n    key: 'hideHandleAndGuide',\n    value: function hideHandleAndGuide() {\n      (0, _element.removeClass)(this.handle, 'active');\n      (0, _element.removeClass)(this.guide, 'active');\n    }\n\n    /**\n     * Check if provided element is considered as a row header.\n     *\n     * @param {HTMLElement} element HTML element.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'checkIfRowHeader',\n    value: function checkIfRowHeader(element) {\n      if (element != this.hot.rootElement) {\n        var parent = element.parentNode;\n\n        if (parent.tagName === 'TBODY') {\n          return true;\n        }\n\n        return this.checkIfRowHeader(parent);\n      }\n\n      return false;\n    }\n\n    /**\n     * Get the TH element from the provided element.\n     *\n     * @param {HTMLElement} element HTML element.\n     * @returns {HTMLElement}\n     */\n\n  }, {\n    key: 'getTHFromTargetElement',\n    value: function getTHFromTargetElement(element) {\n      if (element.tagName != 'TABLE') {\n        if (element.tagName == 'TH') {\n          return element;\n        }\n        return this.getTHFromTargetElement(element.parentNode);\n      }\n\n      return null;\n    }\n\n    /**\n     * 'mouseover' event callback - set the handle position.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseOver',\n    value: function onMouseOver(event) {\n      if (this.checkIfRowHeader(event.target)) {\n        var th = this.getTHFromTargetElement(event.target);\n\n        if (th) {\n          if (!this.pressed) {\n            this.setupHandlePosition(th);\n          }\n        }\n      }\n    }\n\n    /**\n     * Auto-size row after doubleclick - callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'afterMouseDownTimeout',\n    value: function afterMouseDownTimeout() {\n      var _this4 = this;\n\n      var render = function render() {\n        _this4.hot.forceFullRender = true;\n        _this4.hot.view.render(); // updates all\n        _this4.hot.view.wt.wtOverlays.adjustElementsSize(true);\n      };\n      var resize = function resize(selectedRow, forceRender) {\n        var hookNewSize = _this4.hot.runHooks('beforeRowResize', selectedRow, _this4.newSize, true);\n\n        if (hookNewSize !== void 0) {\n          _this4.newSize = hookNewSize;\n        }\n\n        _this4.setManualSize(selectedRow, _this4.newSize); // double click sets auto row size\n\n        if (forceRender) {\n          render();\n        }\n\n        _this4.hot.runHooks('afterRowResize', selectedRow, _this4.newSize, true);\n      };\n\n      if (this.dblclick >= 2) {\n        var selectedRowsLength = this.selectedRows.length;\n\n        if (selectedRowsLength > 1) {\n          (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n            resize(selectedRow);\n          });\n          render();\n        } else {\n          (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n            resize(selectedRow, true);\n          });\n        }\n      }\n      this.dblclick = 0;\n      this.autoresizeTimeout = null;\n    }\n\n    /**\n     * 'mousedown' event callback.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseDown',\n    value: function onMouseDown(event) {\n      var _this5 = this;\n\n      if ((0, _element.hasClass)(event.target, 'manualRowResizer')) {\n        this.setupGuidePosition();\n        this.pressed = this.hot;\n\n        if (this.autoresizeTimeout == null) {\n          this.autoresizeTimeout = setTimeout(function () {\n            return _this5.afterMouseDownTimeout();\n          }, 500);\n\n          this.hot._registerTimeout(this.autoresizeTimeout);\n        }\n        this.dblclick++;\n\n        this.startY = (0, _event.pageY)(event);\n        this.newSize = this.startHeight;\n      }\n    }\n\n    /**\n     * 'mousemove' event callback - refresh the handle and guide positions, cache the new row height.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseMove',\n    value: function onMouseMove(event) {\n      var _this6 = this;\n\n      if (this.pressed) {\n        this.currentHeight = this.startHeight + ((0, _event.pageY)(event) - this.startY);\n\n        (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n          _this6.newSize = _this6.setManualSize(selectedRow, _this6.currentHeight);\n        });\n\n        this.refreshHandlePosition();\n        this.refreshGuidePosition();\n      }\n    }\n\n    /**\n     * 'mouseup' event callback - apply the row resizing.\n     *\n     * @private\n     * @param {MouseEvent} event\n     */\n\n  }, {\n    key: 'onMouseUp',\n    value: function onMouseUp(event) {\n      var _this7 = this;\n\n      var render = function render() {\n        _this7.hot.forceFullRender = true;\n        _this7.hot.view.render(); // updates all\n        _this7.hot.view.wt.wtOverlays.adjustElementsSize(true);\n      };\n      var runHooks = function runHooks(selectedRow, forceRender) {\n        _this7.hot.runHooks('beforeRowResize', selectedRow, _this7.newSize);\n\n        if (forceRender) {\n          render();\n        }\n\n        _this7.saveManualRowHeights();\n\n        _this7.hot.runHooks('afterRowResize', selectedRow, _this7.newSize);\n      };\n      if (this.pressed) {\n        this.hideHandleAndGuide();\n        this.pressed = false;\n\n        if (this.newSize != this.startHeight) {\n          var selectedRowsLength = this.selectedRows.length;\n\n          if (selectedRowsLength > 1) {\n            (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n              runHooks(selectedRow);\n            });\n            render();\n          } else {\n            (0, _array.arrayEach)(this.selectedRows, function (selectedRow) {\n              runHooks(selectedRow, true);\n            });\n          }\n        }\n\n        this.setupHandlePosition(this.currentTH);\n      }\n    }\n\n    /**\n     * Bind the mouse events.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'bindEvents',\n    value: function bindEvents() {\n      var _this8 = this;\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'mouseover', function (e) {\n        return _this8.onMouseOver(e);\n      });\n      this.eventManager.addEventListener(this.hot.rootElement, 'mousedown', function (e) {\n        return _this8.onMouseDown(e);\n      });\n      this.eventManager.addEventListener(window, 'mousemove', function (e) {\n        return _this8.onMouseMove(e);\n      });\n      this.eventManager.addEventListener(window, 'mouseup', function (e) {\n        return _this8.onMouseUp(e);\n      });\n    }\n\n    /**\n     * Cache the current row height.\n     *\n     * @param {Number} row Visual row index.\n     * @param {Number} height Row height.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'setManualSize',\n    value: function setManualSize(row, height) {\n      row = this.hot.runHooks('modifyRow', row);\n      this.manualRowHeights[row] = height;\n\n      return height;\n    }\n\n    /**\n     * Modify the provided row height, based on the plugin settings.\n     *\n     * @private\n     * @param {Number} height Row height.\n     * @param {Number} row Visual row index.\n     * @returns {Number}\n     */\n\n  }, {\n    key: 'onModifyRowHeight',\n    value: function onModifyRowHeight(height, row) {\n      if (this.enabled) {\n        var autoRowSizePlugin = this.hot.getPlugin('autoRowSize');\n        var autoRowHeightResult = autoRowSizePlugin ? autoRowSizePlugin.heights[row] : null;\n\n        row = this.hot.runHooks('modifyRow', row);\n\n        var manualRowHeight = this.manualRowHeights[row];\n\n        if (manualRowHeight !== void 0 && (manualRowHeight === autoRowHeightResult || manualRowHeight > (height || 0))) {\n          return manualRowHeight;\n        }\n      }\n\n      return height;\n    }\n  }]);\n\n  return ManualRowResize;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('manualRowResize', ManualRowResize);\n\nexports.default = ManualRowResize;\n\n/***/ }),\n/* 344 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _plugins = __webpack_require__(8);\n\nvar _event = __webpack_require__(12);\n\nvar _src = __webpack_require__(4);\n\nvar _cellsCollection = __webpack_require__(345);\n\nvar _cellsCollection2 = _interopRequireDefault(_cellsCollection);\n\nvar _cellCoords = __webpack_require__(95);\n\nvar _cellCoords2 = _interopRequireDefault(_cellCoords);\n\nvar _autofill = __webpack_require__(346);\n\nvar _autofill2 = _interopRequireDefault(_autofill);\n\nvar _selection = __webpack_require__(347);\n\nvar _selection2 = _interopRequireDefault(_selection);\n\nvar _toggleMerge = __webpack_require__(348);\n\nvar _toggleMerge2 = _interopRequireDefault(_toggleMerge);\n\nvar _array = __webpack_require__(1);\n\nvar _object = __webpack_require__(2);\n\nvar _console = __webpack_require__(56);\n\nvar _number = __webpack_require__(5);\n\nvar _utils = __webpack_require__(204);\n\n__webpack_require__(349);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n_pluginHooks2.default.getSingleton().register('beforeMergeCells');\n_pluginHooks2.default.getSingleton().register('afterMergeCells');\n_pluginHooks2.default.getSingleton().register('beforeUnmergeCells');\n_pluginHooks2.default.getSingleton().register('afterUnmergeCells');\n\nvar privatePool = new WeakMap();\n\n/**\n * @plugin MergeCells\n *\n * @description Plugin, which allows merging cells in the table (using the initial configuration, API or context menu).\n *\n * @example\n *\n * ```js\n * ...\n * let hot = new Handsontable(document.getElementById('example'), {\n *  data: getData(),\n *  mergeCells: [\n *    {row: 0, col: 3, rowspan: 3, colspan: 3},\n *    {row: 2, col: 6, rowspan: 2, colspan: 2},\n *    {row: 4, col: 8, rowspan: 3, colspan: 3}\n *  ],\n * ...\n * ```\n */\n\nvar MergeCells = function (_BasePlugin) {\n  _inherits(MergeCells, _BasePlugin);\n\n  function MergeCells(hotInstance) {\n    _classCallCheck(this, MergeCells);\n\n    var _this = _possibleConstructorReturn(this, (MergeCells.__proto__ || Object.getPrototypeOf(MergeCells)).call(this, hotInstance));\n\n    privatePool.set(_this, {\n      lastDesiredCoords: null\n    });\n\n    /**\n     * A container for all the merged cells.\n     *\n     * @type {MergedCellsCollection}\n     */\n    _this.mergedCellsCollection = null;\n    /**\n     * Instance of the class responsible for all the autofill-related calculations.\n     *\n     * @private\n     * @type {AutofillCalculations}\n     */\n    _this.autofillCalculations = null;\n    /**\n     * Instance of the class responsible for the selection-related calculations.\n     *\n     * @private\n     * @type {SelectionCalculations}\n     */\n    _this.selectionCalculations = null;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(MergeCells, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return !!this.hot.getSettings().mergeCells;\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.mergedCellsCollection = new _cellsCollection2.default(this);\n      this.autofillCalculations = new _autofill2.default(this);\n      this.selectionCalculations = new _selection2.default(this);\n\n      this.addHook('afterInit', function () {\n        return _this2.onAfterInit.apply(_this2, arguments);\n      });\n      this.addHook('beforeKeyDown', function () {\n        return _this2.onBeforeKeyDown.apply(_this2, arguments);\n      });\n      this.addHook('modifyTransformStart', function () {\n        return _this2.onModifyTransformStart.apply(_this2, arguments);\n      });\n      this.addHook('afterModifyTransformStart', function () {\n        return _this2.onAfterModifyTransformStart.apply(_this2, arguments);\n      });\n      this.addHook('modifyTransformEnd', function () {\n        return _this2.onModifyTransformEnd.apply(_this2, arguments);\n      });\n      this.addHook('modifyGetCellCoords', function () {\n        return _this2.onModifyGetCellCoords.apply(_this2, arguments);\n      });\n      this.addHook('beforeSetRangeEnd', function () {\n        return _this2.onBeforeSetRangeEnd.apply(_this2, arguments);\n      });\n      this.addHook('afterIsMultipleSelection', function () {\n        return _this2.onAfterIsMultipleSelection.apply(_this2, arguments);\n      });\n      this.addHook('afterRenderer', function () {\n        return _this2.onAfterRenderer.apply(_this2, arguments);\n      });\n      this.addHook('afterContextMenuDefaultOptions', function () {\n        return _this2.addMergeActionsToContextMenu.apply(_this2, arguments);\n      });\n      this.addHook('afterGetCellMeta', function () {\n        return _this2.onAfterGetCellMeta.apply(_this2, arguments);\n      });\n      this.addHook('afterViewportRowCalculatorOverride', function () {\n        return _this2.onAfterViewportRowCalculatorOverride.apply(_this2, arguments);\n      });\n      this.addHook('afterViewportColumnCalculatorOverride', function () {\n        return _this2.onAfterViewportColumnCalculatorOverride.apply(_this2, arguments);\n      });\n      this.addHook('modifyAutofillRange', function () {\n        return _this2.onModifyAutofillRange.apply(_this2, arguments);\n      });\n      this.addHook('afterCreateCol', function () {\n        return _this2.onAfterCreateCol.apply(_this2, arguments);\n      });\n      this.addHook('afterRemoveCol', function () {\n        return _this2.onAfterRemoveCol.apply(_this2, arguments);\n      });\n      this.addHook('afterCreateRow', function () {\n        return _this2.onAfterCreateRow.apply(_this2, arguments);\n      });\n      this.addHook('afterRemoveRow', function () {\n        return _this2.onAfterRemoveRow.apply(_this2, arguments);\n      });\n      this.addHook('afterChange', function () {\n        return _this2.onAfterChange.apply(_this2, arguments);\n      });\n      this.addHook('beforeDrawBorders', function () {\n        return _this2.onBeforeDrawAreaBorders.apply(_this2, arguments);\n      });\n      this.addHook('afterDrawSelection', function () {\n        return _this2.onAfterDrawSelection.apply(_this2, arguments);\n      });\n      this.addHook('beforeRemoveCellClassNames', function () {\n        return _this2.onBeforeRemoveCellClassNames.apply(_this2, arguments);\n      });\n\n      _get(MergeCells.prototype.__proto__ || Object.getPrototypeOf(MergeCells.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable the plugin.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      this.clearCollections();\n      this.hot.render();\n      _get(MergeCells.prototype.__proto__ || Object.getPrototypeOf(MergeCells.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Update the plugin (after using the `updateSettings` method)\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      var settings = this.hot.getSettings().mergeCells;\n\n      this.clearCollections();\n      this.disablePlugin();\n      this.enablePlugin();\n\n      this.generateFromSettings(settings);\n\n      _get(MergeCells.prototype.__proto__ || Object.getPrototypeOf(MergeCells.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Validate a single setting object, represented by a single merged cell information object.\n     *\n     * @private\n     * @param {Object} setting An object with `row`, `col`, `rowspan` and `colspan` properties.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'validateSetting',\n    value: function validateSetting(setting) {\n      var valid = true;\n\n      if (!setting) {\n        return false;\n      }\n\n      if (_cellCoords2.default.containsNegativeValues(setting)) {\n        (0, _console.warn)(_cellCoords2.default.NEGATIVE_VALUES_WARNING(setting));\n\n        valid = false;\n      } else if (_cellCoords2.default.isOutOfBounds(setting, this.hot.countRows(), this.hot.countCols())) {\n        (0, _console.warn)(_cellCoords2.default.IS_OUT_OF_BOUNDS_WARNING(setting));\n\n        valid = false;\n      } else if (_cellCoords2.default.isSingleCell(setting)) {\n        (0, _console.warn)(_cellCoords2.default.IS_SINGLE_CELL(setting));\n\n        valid = false;\n      } else if (_cellCoords2.default.containsZeroSpan(setting)) {\n        (0, _console.warn)(_cellCoords2.default.ZERO_SPAN_WARNING(setting));\n\n        valid = false;\n      }\n\n      return valid;\n    }\n\n    /**\n     * Generate the merged cells from the settings provided to the plugin.\n     *\n     * @private\n     * @param {Array|Boolean} settings The settings provided to the plugin.\n     */\n\n  }, {\n    key: 'generateFromSettings',\n    value: function generateFromSettings(settings) {\n      var _this3 = this;\n\n      if (Array.isArray(settings)) {\n        var _hot;\n\n        var populationArgumentsList = [];\n\n        (0, _array.arrayEach)(settings, function (setting) {\n          if (!_this3.validateSetting(setting)) {\n            return;\n          }\n\n          var highlight = new _src.CellCoords(setting.row, setting.col);\n          var rangeEnd = new _src.CellCoords(setting.row + setting.rowspan - 1, setting.col + setting.colspan - 1);\n          var mergeRange = new _src.CellRange(highlight, highlight, rangeEnd);\n\n          populationArgumentsList.push(_this3.mergeRange(mergeRange, true, true));\n        });\n\n        // remove 'empty' setting objects, caused by improper merge range declarations\n        populationArgumentsList = populationArgumentsList.filter(function (value) {\n          return value !== true;\n        });\n\n        var bulkPopulationData = this.getBulkCollectionData(populationArgumentsList);\n\n        (_hot = this.hot).populateFromArray.apply(_hot, _toConsumableArray(bulkPopulationData));\n      }\n    }\n\n    /**\n     * Generates a bulk set of all the data to be populated to fill the data \"under\" the added merged cells.\n     *\n     * @private\n     * @param {Array} populationArgumentsList Array in a form of `[row, column, dataUnderCollection]`.\n     * @return {Array} Array in a form of `[row, column, dataOfAllCollections]`.\n     */\n\n  }, {\n    key: 'getBulkCollectionData',\n    value: function getBulkCollectionData(populationArgumentsList) {\n      var _hot2;\n\n      var populationDataRange = this.getBulkCollectionDataRange(populationArgumentsList);\n      var dataAtRange = (_hot2 = this.hot).getData.apply(_hot2, _toConsumableArray(populationDataRange));\n      var newDataAtRange = dataAtRange.splice(0);\n\n      (0, _array.arrayEach)(populationArgumentsList, function (mergedCellArguments) {\n        var _mergedCellArguments = _slicedToArray(mergedCellArguments, 3),\n            mergedCellRowIndex = _mergedCellArguments[0],\n            mergedCellColumnIndex = _mergedCellArguments[1],\n            mergedCellData = _mergedCellArguments[2];\n\n        (0, _array.arrayEach)(mergedCellData, function (mergedCellRow, rowIndex) {\n          (0, _array.arrayEach)(mergedCellRow, function (mergedCellElement, columnIndex) {\n            newDataAtRange[mergedCellRowIndex - populationDataRange[0] + rowIndex][mergedCellColumnIndex - populationDataRange[1] + columnIndex] = mergedCellElement;\n          });\n        });\n      });\n\n      return [populationDataRange[0], populationDataRange[1], newDataAtRange];\n    }\n\n    /**\n     * Get the range of combined data ranges provided in a form of an array of arrays ([row, column, dataUnderCollection])\n     *\n     * @private\n     * @param {Array} populationArgumentsList Array containing argument lists for the `populateFromArray` method - row, column and data for population.\n     * @return {Array[]} Start and end coordinates of the merged cell range. (in a form of [rowIndex, columnIndex])\n     */\n\n  }, {\n    key: 'getBulkCollectionDataRange',\n    value: function getBulkCollectionDataRange(populationArgumentsList) {\n      var start = [0, 0];\n      var end = [0, 0];\n      var mergedCellRow = null;\n      var mergedCellColumn = null;\n      var mergedCellData = null;\n\n      (0, _array.arrayEach)(populationArgumentsList, function (mergedCellArguments) {\n        mergedCellRow = mergedCellArguments[0];\n        mergedCellColumn = mergedCellArguments[1];\n        mergedCellData = mergedCellArguments[2];\n\n        start[0] = Math.min(mergedCellRow, start[0]);\n        start[1] = Math.min(mergedCellColumn, start[1]);\n        end[0] = Math.max(mergedCellRow + mergedCellData.length - 1, end[0]);\n        end[1] = Math.max(mergedCellColumn + mergedCellData[0].length - 1, end[1]);\n      });\n\n      return [].concat(start, end);\n    }\n\n    /**\n     * Clear the merged cells from the merged cell container.\n     */\n\n  }, {\n    key: 'clearCollections',\n    value: function clearCollections() {\n      this.mergedCellsCollection.clear();\n    }\n\n    /**\n     * Returns `true` if a range is mergeable.\n     *\n     * @private\n     * @param {Object} newMergedCellInfo Merged cell information object to test.\n     * @param {Boolean} [auto=false] `true` if triggered at initialization.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'canMergeRange',\n    value: function canMergeRange(newMergedCellInfo) {\n      var auto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      return auto ? true : this.validateSetting(newMergedCellInfo);\n    }\n\n    /**\n     * Merge or unmerge, based on last selected range.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'toggleMergeOnSelection',\n    value: function toggleMergeOnSelection() {\n      var currentRange = this.hot.getSelectedRangeLast();\n\n      if (!currentRange) {\n        return;\n      }\n\n      currentRange.setDirection('NW-SE');\n\n      var from = currentRange.from,\n          to = currentRange.to;\n\n\n      this.toggleMerge(currentRange);\n      this.hot.selectCell(from.row, from.col, to.row, to.col, false);\n    }\n\n    /**\n     * Merge the selection provided as a cell range.\n     *\n     * @param {CellRange} [cellRange] Selection cell range.\n     */\n\n  }, {\n    key: 'mergeSelection',\n    value: function mergeSelection() {\n      var cellRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.hot.getSelectedRangeLast();\n\n      if (!cellRange) {\n        return;\n      }\n\n      cellRange.setDirection('NW-SE');\n\n      var from = cellRange.from,\n          to = cellRange.to;\n\n\n      this.unmergeRange(cellRange, true);\n      this.mergeRange(cellRange);\n      this.hot.selectCell(from.row, from.col, to.row, to.col, false);\n    }\n\n    /**\n     * Unmerge the selection provided as a cell range.\n     *\n     * @param {CellRange} [cellRange] Selection cell range.\n     */\n\n  }, {\n    key: 'unmergeSelection',\n    value: function unmergeSelection() {\n      var cellRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.hot.getSelectedRangeLast();\n\n      if (!cellRange) {\n        return;\n      }\n\n      var from = cellRange.from,\n          to = cellRange.to;\n\n\n      this.unmergeRange(cellRange, true);\n      this.hot.selectCell(from.row, from.col, to.row, to.col, false);\n    }\n\n    /**\n     * Merge cells in the provided cell range.\n     *\n     * @private\n     * @param {CellRange} cellRange Cell range to merge.\n     * @param {Boolean} [auto=false] `true` if is called automatically, e.g. at initialization.\n     * @param {Boolean} [preventPopulation=false] `true`, if the method should not run `populateFromArray` at the end, but rather return its arguments.\n     * @returns {Array|Boolean} Returns an array of [row, column, dataUnderCollection] if preventPopulation is set to true. If the the merging process went successful, it returns `true`, otherwise - `false`.\n     * @fires Hooks#beforeMergeCells\n     * @fires Hooks#afterMergeCells\n     */\n\n  }, {\n    key: 'mergeRange',\n    value: function mergeRange(cellRange) {\n      var _this4 = this;\n\n      var auto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n      var preventPopulation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      var topLeft = cellRange.getTopLeftCorner();\n      var bottomRight = cellRange.getBottomRightCorner();\n      var mergeParent = {\n        row: topLeft.row,\n        col: topLeft.col,\n        rowspan: bottomRight.row - topLeft.row + 1,\n        colspan: bottomRight.col - topLeft.col + 1\n      };\n      var clearedData = [];\n      var populationInfo = null;\n\n      if (!this.canMergeRange(mergeParent, auto)) {\n        return false;\n      }\n\n      this.hot.runHooks('beforeMergeCells', cellRange, auto);\n\n      (0, _number.rangeEach)(0, mergeParent.rowspan - 1, function (i) {\n        (0, _number.rangeEach)(0, mergeParent.colspan - 1, function (j) {\n          var clearedValue = null;\n\n          if (!clearedData[i]) {\n            clearedData[i] = [];\n          }\n\n          if (i === 0 && j === 0) {\n            clearedValue = _this4.hot.getDataAtCell(mergeParent.row, mergeParent.col);\n          } else {\n            _this4.hot.setCellMeta(mergeParent.row + i, mergeParent.col + j, 'hidden', true);\n          }\n\n          clearedData[i][j] = clearedValue;\n        });\n      });\n\n      this.hot.setCellMeta(mergeParent.row, mergeParent.col, 'spanned', true);\n\n      var mergedCellAdded = this.mergedCellsCollection.add(mergeParent);\n\n      if (mergedCellAdded) {\n        if (preventPopulation) {\n          populationInfo = [mergeParent.row, mergeParent.col, clearedData];\n        } else {\n          this.hot.populateFromArray(mergeParent.row, mergeParent.col, clearedData, void 0, void 0, this.pluginName);\n        }\n\n        this.hot.runHooks('afterMergeCells', cellRange, mergeParent, auto);\n\n        return populationInfo;\n      }\n\n      return true;\n    }\n\n    /**\n     * Unmerge the selection provided as a cell range. If no cell range is provided, it uses the current selection.\n     *\n     * @private\n     * @param {CellRange} cellRange Selection cell range.\n     * @param {Boolean} [auto=false] `true` if called automatically by the plugin.\n     */\n\n  }, {\n    key: 'unmergeRange',\n    value: function unmergeRange(cellRange) {\n      var _this5 = this;\n\n      var auto = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      var mergedCells = this.mergedCellsCollection.getWithinRange(cellRange);\n\n      if (!mergedCells) {\n        return;\n      }\n\n      this.hot.runHooks('beforeUnmergeCells', cellRange, auto);\n\n      (0, _array.arrayEach)(mergedCells, function (currentCollection) {\n        _this5.mergedCellsCollection.remove(currentCollection.row, currentCollection.col);\n\n        (0, _number.rangeEach)(0, currentCollection.rowspan - 1, function (i) {\n          (0, _number.rangeEach)(0, currentCollection.colspan - 1, function (j) {\n            _this5.hot.removeCellMeta(currentCollection.row + i, currentCollection.col + j, 'hidden');\n          });\n        });\n\n        _this5.hot.removeCellMeta(currentCollection.row, currentCollection.col, 'spanned');\n      });\n\n      this.hot.render();\n      this.hot.runHooks('afterUnmergeCells', cellRange, auto);\n    }\n\n    /**\n     * Merge or unmerge, based on the cell range provided as `cellRange`.\n     *\n     * @private\n     * @param {CellRange} cellRange The cell range to merge or unmerged.\n     */\n\n  }, {\n    key: 'toggleMerge',\n    value: function toggleMerge(cellRange) {\n      var mergedCell = this.mergedCellsCollection.get(cellRange.from.row, cellRange.from.col);\n      var mergedCellCoversWholeRange = mergedCell.row === cellRange.from.row && mergedCell.col === cellRange.from.col && mergedCell.row + mergedCell.rowspan - 1 === cellRange.to.row && mergedCell.col + mergedCell.colspan - 1 === cellRange.to.col;\n\n      if (mergedCellCoversWholeRange) {\n        this.unmergeRange(cellRange);\n      } else {\n        this.mergeSelection(cellRange);\n      }\n    }\n\n    /**\n     * Merge the specified range.\n     *\n     * @param {Number} startRow Start row of the merged cell.\n     * @param {Number} startColumn Start column of the merged cell.\n     * @param {Number} endRow End row of the merged cell.\n     * @param {Number} endColumn End column of the merged cell.\n     */\n\n  }, {\n    key: 'merge',\n    value: function merge(startRow, startColumn, endRow, endColumn) {\n      var start = new _src.CellCoords(startRow, startColumn);\n      var end = new _src.CellCoords(endRow, endColumn);\n\n      this.mergeRange(new _src.CellRange(start, start, end));\n    }\n\n    /**\n     * Unmerge the merged cell in the provided range.\n     *\n     * @param {Number} startRow Start row of the merged cell.\n     * @param {Number} startColumn Start column of the merged cell.\n     * @param {Number} endRow End row of the merged cell.\n     * @param {Number} endColumn End column of the merged cell.\n     */\n\n  }, {\n    key: 'unmerge',\n    value: function unmerge(startRow, startColumn, endRow, endColumn) {\n      var start = new _src.CellCoords(startRow, startColumn);\n      var end = new _src.CellCoords(endRow, endColumn);\n\n      this.unmergeRange(new _src.CellRange(start, start, end));\n    }\n\n    /**\n     * `afterInit` hook callback.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterInit',\n    value: function onAfterInit() {\n      this.generateFromSettings(this.hot.getSettings().mergeCells);\n      this.hot.render();\n    }\n\n    /**\n     * `beforeKeyDown` hook callback.\n     *\n     * @private\n     * @param {KeyboardEvent} event The `keydown` event object.\n     */\n\n  }, {\n    key: 'onBeforeKeyDown',\n    value: function onBeforeKeyDown(event) {\n      var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey;\n\n      if (ctrlDown && event.keyCode === 77) {\n        // CTRL + M\n        this.toggleMerge(this.hot.getSelectedRangeLast());\n\n        this.hot.render();\n        (0, _event.stopImmediatePropagation)(event);\n      }\n    }\n\n    /**\n     * Modify the information on whether the current selection contains multiple cells. The `afterIsMultipleSelection` hook callback.\n     *\n     * @private\n     * @param {Boolean} isMultiple\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'onAfterIsMultipleSelection',\n    value: function onAfterIsMultipleSelection(isMultiple) {\n      if (isMultiple) {\n        var mergedCells = this.mergedCellsCollection.mergedCells;\n        var selectionRange = this.hot.getSelectedRangeLast();\n\n        for (var group = 0; group < mergedCells.length; group += 1) {\n          if (selectionRange.highlight.row === mergedCells[group].row && selectionRange.highlight.col === mergedCells[group].col && selectionRange.to.row === mergedCells[group].row + mergedCells[group].rowspan - 1 && selectionRange.to.col === mergedCells[group].col + mergedCells[group].colspan - 1) {\n            return false;\n          }\n        }\n      }\n\n      return isMultiple;\n    }\n\n    /**\n     * `modifyTransformStart` hook callback.\n     *\n     * @private\n     * @param {Object} delta The transformation delta.\n     */\n\n  }, {\n    key: 'onModifyTransformStart',\n    value: function onModifyTransformStart(delta) {\n      var priv = privatePool.get(this);\n      var currentlySelectedRange = this.hot.getSelectedRangeLast();\n      var newDelta = {\n        row: delta.row,\n        col: delta.col\n      };\n      var nextPosition = null;\n      var currentPosition = new _src.CellCoords(currentlySelectedRange.highlight.row, currentlySelectedRange.highlight.col);\n      var mergedParent = this.mergedCellsCollection.get(currentPosition.row, currentPosition.col);\n\n      if (!priv.lastDesiredCoords) {\n        priv.lastDesiredCoords = new _src.CellCoords(null, null);\n      }\n\n      if (mergedParent) {\n        // only merge selected\n        var mergeTopLeft = new _src.CellCoords(mergedParent.row, mergedParent.col);\n        var mergeBottomRight = new _src.CellCoords(mergedParent.row + mergedParent.rowspan - 1, mergedParent.col + mergedParent.colspan - 1);\n        var mergeRange = new _src.CellRange(mergeTopLeft, mergeTopLeft, mergeBottomRight);\n\n        if (!mergeRange.includes(priv.lastDesiredCoords)) {\n          priv.lastDesiredCoords = new _src.CellCoords(null, null); // reset outdated version of lastDesiredCoords\n        }\n\n        newDelta.row = priv.lastDesiredCoords.row ? priv.lastDesiredCoords.row - currentPosition.row : newDelta.row;\n        newDelta.col = priv.lastDesiredCoords.col ? priv.lastDesiredCoords.col - currentPosition.col : newDelta.col;\n\n        if (delta.row > 0) {\n          // moving down\n          newDelta.row = mergedParent.row + mergedParent.rowspan - 1 - currentPosition.row + delta.row;\n        } else if (delta.row < 0) {\n          // moving up\n          newDelta.row = currentPosition.row - mergedParent.row + delta.row;\n        }\n\n        if (delta.col > 0) {\n          // moving right\n          newDelta.col = mergedParent.col + mergedParent.colspan - 1 - currentPosition.col + delta.col;\n        } else if (delta.col < 0) {\n          // moving left\n          newDelta.col = currentPosition.col - mergedParent.col + delta.col;\n        }\n      }\n\n      nextPosition = new _src.CellCoords(currentlySelectedRange.highlight.row + newDelta.row, currentlySelectedRange.highlight.col + newDelta.col);\n\n      var nextParentIsMerged = this.mergedCellsCollection.get(nextPosition.row, nextPosition.col);\n\n      if (nextParentIsMerged) {\n        // skipping the invisible cells in the merge range\n        priv.lastDesiredCoords = nextPosition;\n        newDelta = {\n          row: nextParentIsMerged.row - currentPosition.row,\n          col: nextParentIsMerged.col - currentPosition.col\n        };\n      }\n\n      if (newDelta.row !== 0) {\n        delta.row = newDelta.row;\n      }\n      if (newDelta.col !== 0) {\n        delta.col = newDelta.col;\n      }\n    }\n\n    /**\n     * `modifyTransformEnd` hook callback. Needed to handle \"jumping over\" merged merged cells, while selecting.\n     *\n     * @private\n     * @param {Object} delta The transformation delta.\n     */\n\n  }, {\n    key: 'onModifyTransformEnd',\n    value: function onModifyTransformEnd(delta) {\n      var _this6 = this;\n\n      var currentSelectionRange = this.hot.getSelectedRangeLast();\n      var newDelta = (0, _object.clone)(delta);\n      var newSelectionRange = this.selectionCalculations.getUpdatedSelectionRange(currentSelectionRange, delta);\n      var tempDelta = (0, _object.clone)(newDelta);\n\n      var mergedCellsWithinRange = this.mergedCellsCollection.getWithinRange(newSelectionRange, true);\n\n      do {\n        tempDelta = (0, _object.clone)(newDelta);\n        this.selectionCalculations.getUpdatedSelectionRange(currentSelectionRange, newDelta);\n\n        (0, _array.arrayEach)(mergedCellsWithinRange, function (mergedCell) {\n          _this6.selectionCalculations.snapDelta(newDelta, currentSelectionRange, mergedCell);\n        });\n      } while (newDelta.row !== tempDelta.row || newDelta.col !== tempDelta.col);\n\n      delta.row = newDelta.row;\n      delta.col = newDelta.col;\n    }\n\n    /**\n     * `modifyGetCellCoords` hook callback. Swaps the `getCell` coords with the merged parent coords.\n     *\n     * @private\n     * @param {Number} row Row index.\n     * @param {Number} column Column index.\n     * @returns {Array}\n     */\n\n  }, {\n    key: 'onModifyGetCellCoords',\n    value: function onModifyGetCellCoords(row, column) {\n      var mergeParent = this.mergedCellsCollection.get(row, column);\n\n      return mergeParent ? [mergeParent.row, mergeParent.col, mergeParent.row + mergeParent.rowspan - 1, mergeParent.col + mergeParent.colspan - 1] : void 0;\n    }\n\n    /**\n     * `afterContextMenuDefaultOptions` hook callback.\n     *\n     * @private\n     * @param {Object} defaultOptions The default context menu options.\n     */\n\n  }, {\n    key: 'addMergeActionsToContextMenu',\n    value: function addMergeActionsToContextMenu(defaultOptions) {\n      defaultOptions.items.push({\n        name: '---------'\n      }, (0, _toggleMerge2.default)(this));\n    }\n\n    /**\n     * `afterRenderer` hook callback.\n     *\n     * @private\n     * @param {HTMLElement} TD The cell to be modified.\n     * @param {Number} row Row index.\n     * @param {Number} col Column index.\n     */\n\n  }, {\n    key: 'onAfterRenderer',\n    value: function onAfterRenderer(TD, row, col) {\n      var mergedCell = this.mergedCellsCollection.get(row, col);\n\n      (0, _utils.applySpanProperties)(TD, mergedCell, row, col);\n    }\n\n    /**\n     * `beforeSetRangeEnd` hook callback.\n     * While selecting cells with keyboard or mouse, make sure that rectangular area is expanded to the extent of the merged cell\n     *\n     * @private\n     * @param {Object} coords Cell coords.\n     */\n\n  }, {\n    key: 'onBeforeSetRangeEnd',\n    value: function onBeforeSetRangeEnd(coords) {\n      var selRange = this.hot.getSelectedRangeLast();\n      selRange.highlight = new _src.CellCoords(selRange.highlight.row, selRange.highlight.col); // clone in case we will modify its reference\n      selRange.to = coords;\n      var rangeExpanded = false;\n\n      if (selRange.from.row === 0 && selRange.to.row === this.hot.countRows() - 1 || selRange.from.col === 0 && selRange.to.col === this.hot.countCols() - 1) {\n        return;\n      }\n\n      do {\n        rangeExpanded = false;\n\n        for (var i = 0; i < this.mergedCellsCollection.mergedCells.length; i += 1) {\n          var cellInfo = this.mergedCellsCollection.mergedCells[i];\n          var mergedCellRange = cellInfo.getRange();\n\n          if (selRange.expandByRange(mergedCellRange)) {\n            coords.row = selRange.to.row;\n            coords.col = selRange.to.col;\n\n            rangeExpanded = true;\n          }\n        }\n      } while (rangeExpanded);\n    }\n\n    /**\n     * The `afterGetCellMeta` hook callback.\n     *\n     * @private\n     * @param {Number} row Row index.\n     * @param {Number} col Column index.\n     * @param {Object} cellProperties The cell properties object.\n     */\n\n  }, {\n    key: 'onAfterGetCellMeta',\n    value: function onAfterGetCellMeta(row, col, cellProperties) {\n      var mergeParent = this.mergedCellsCollection.get(row, col);\n\n      if (mergeParent && (mergeParent.row !== row || mergeParent.col !== col)) {\n        cellProperties.copyable = false;\n      }\n    }\n\n    /**\n     * `afterViewportRowCalculatorOverride` hook callback.\n     *\n     * @private\n     * @param {Object} calc The row calculator object.\n     */\n\n  }, {\n    key: 'onAfterViewportRowCalculatorOverride',\n    value: function onAfterViewportRowCalculatorOverride(calc) {\n      var _this7 = this;\n\n      var colCount = this.hot.countCols();\n      var mergeParent = void 0;\n\n      (0, _number.rangeEach)(0, colCount - 1, function (c) {\n        mergeParent = _this7.mergedCellsCollection.get(calc.startRow, c);\n        if (mergeParent) {\n          if (mergeParent.row < calc.startRow) {\n            calc.startRow = mergeParent.row;\n            return _this7.onAfterViewportRowCalculatorOverride.call(_this7, calc); // recursively search upwards\n          }\n        }\n\n        mergeParent = _this7.mergedCellsCollection.get(calc.endRow, c);\n\n        if (mergeParent) {\n          var mergeEnd = mergeParent.row + mergeParent.rowspan - 1;\n          if (mergeEnd > calc.endRow) {\n            calc.endRow = mergeEnd;\n            return _this7.onAfterViewportRowCalculatorOverride.call(_this7, calc); // recursively search upwards\n          }\n        }\n\n        return true;\n      });\n    }\n\n    /**\n     * `afterViewportColumnCalculatorOverride` hook callback.\n     *\n     * @private\n     * @param {Object} calc The column calculator object.\n     */\n\n  }, {\n    key: 'onAfterViewportColumnCalculatorOverride',\n    value: function onAfterViewportColumnCalculatorOverride(calc) {\n      var _this8 = this;\n\n      var rowCount = this.hot.countRows();\n      var mergeParent = void 0;\n\n      (0, _number.rangeEach)(0, rowCount - 1, function (r) {\n        mergeParent = _this8.mergedCellsCollection.get(r, calc.startColumn);\n\n        if (mergeParent && mergeParent.col < calc.startColumn) {\n          calc.startColumn = mergeParent.col;\n          return _this8.onAfterViewportColumnCalculatorOverride.call(_this8, calc); // recursively search upwards\n        }\n\n        mergeParent = _this8.mergedCellsCollection.get(r, calc.endColumn);\n\n        if (mergeParent) {\n          var mergeEnd = mergeParent.col + mergeParent.colspan - 1;\n          if (mergeEnd > calc.endColumn) {\n            calc.endColumn = mergeEnd;\n            return _this8.onAfterViewportColumnCalculatorOverride.call(_this8, calc); // recursively search upwards\n          }\n        }\n\n        return true;\n      });\n    }\n\n    /**\n     * The `modifyAutofillRange` hook callback.\n     *\n     * @private\n     * @param {Array} drag The drag area coordinates.\n     * @param {Array} select The selection information.\n     * @return {Array} The new drag area.\n     */\n\n  }, {\n    key: 'onModifyAutofillRange',\n    value: function onModifyAutofillRange(drag, select) {\n      this.autofillCalculations.correctSelectionAreaSize(select);\n      var dragDirection = this.autofillCalculations.getDirection(select, drag);\n\n      if (this.autofillCalculations.dragAreaOverlapsCollections(select, drag, dragDirection)) {\n        drag = select;\n        return drag;\n      }\n\n      var mergedCellsWithinSelectionArea = this.mergedCellsCollection.getWithinRange({\n        from: { row: select[0], col: select[1] },\n        to: { row: select[2], col: select[3] }\n      });\n\n      if (!mergedCellsWithinSelectionArea) {\n        return drag;\n      }\n\n      drag = this.autofillCalculations.snapDragArea(select, drag, dragDirection, mergedCellsWithinSelectionArea);\n\n      return drag;\n    }\n\n    /**\n     * `afterCreateCol` hook callback.\n     *\n     * @private\n     * @param {Number} column Column index.\n     * @param {Number} count Number of created columns.\n     */\n\n  }, {\n    key: 'onAfterCreateCol',\n    value: function onAfterCreateCol(column, count) {\n      this.mergedCellsCollection.shiftCollections('right', column, count);\n    }\n\n    /**\n     * `afterRemoveCol` hook callback.\n     *\n     * @private\n     * @param {Number} column Column index.\n     * @param {Number} count Number of removed columns.\n     */\n\n  }, {\n    key: 'onAfterRemoveCol',\n    value: function onAfterRemoveCol(column, count) {\n      this.mergedCellsCollection.shiftCollections('left', column, count);\n    }\n\n    /**\n     * `afterCreateRow` hook callback.\n     *\n     * @private\n     * @param {Number} row Row index.\n     * @param {Number} count Number of created rows.\n     * @param {String} source Source of change.\n     */\n\n  }, {\n    key: 'onAfterCreateRow',\n    value: function onAfterCreateRow(row, count, source) {\n      if (source === 'auto') {\n        return;\n      }\n\n      this.mergedCellsCollection.shiftCollections('down', row, count);\n    }\n\n    /**\n     * `afterRemoveRow` hook callback.\n     *\n     * @private\n     * @param {Number} row Row index.\n     * @param {Number} count Number of removed rows.\n     */\n\n  }, {\n    key: 'onAfterRemoveRow',\n    value: function onAfterRemoveRow(row, count) {\n      this.mergedCellsCollection.shiftCollections('up', row, count);\n    }\n\n    /**\n     * `afterChange` hook callback. Used to propagate merged cells after using Autofill.\n     *\n     * @private\n     * @param {Array} changes The changes array.\n     * @param {String} source Determines the source of the change.\n     */\n\n  }, {\n    key: 'onAfterChange',\n    value: function onAfterChange(changes, source) {\n      if (source !== 'Autofill.fill') {\n        return;\n      }\n\n      this.autofillCalculations.recreateAfterDataPopulation(changes);\n    }\n\n    /**\n     * `beforeDrawAreaBorders` hook callback.\n     *\n     * @private\n     * @param {Array} corners Coordinates of the area corners.\n     * @param {String} className Class name for the area.\n     */\n\n  }, {\n    key: 'onBeforeDrawAreaBorders',\n    value: function onBeforeDrawAreaBorders(corners, className) {\n      if (className && className === 'area') {\n        var selectedRange = this.hot.getSelectedRangeLast();\n        var mergedCellsWithinRange = this.mergedCellsCollection.getWithinRange(selectedRange);\n\n        (0, _array.arrayEach)(mergedCellsWithinRange, function (mergedCell) {\n          if (selectedRange.getBottomRightCorner().row === mergedCell.getLastRow() && selectedRange.getBottomRightCorner().col === mergedCell.getLastColumn()) {\n            corners[2] = mergedCell.row;\n            corners[3] = mergedCell.col;\n          }\n        });\n      }\n    }\n\n    /**\n     * `afterModifyTransformStart` hook callback. Fixes a problem with navigating through merged cells at the edges of the table\n     * with the ENTER/SHIFT+ENTER/TAB/SHIFT+TAB keys.\n     *\n     * @private\n     * @param {CellCoords} coords Coordinates of the to-be-selected cell.\n     * @param {Number} rowTransformDir Row transformation direction (negative value = up, 0 = none, positive value = down)\n     * @param {Number} colTransformDir Column transformation direction (negative value = up, 0 = none, positive value = down)\n     */\n\n  }, {\n    key: 'onAfterModifyTransformStart',\n    value: function onAfterModifyTransformStart(coords, rowTransformDir, colTransformDir) {\n      if (!this.enabled) {\n        return;\n      }\n\n      var mergedCellAtCoords = this.mergedCellsCollection.get(coords.row, coords.col);\n\n      if (!mergedCellAtCoords) {\n        return;\n      }\n\n      var goingDown = rowTransformDir > 0;\n      var goingUp = rowTransformDir < 0;\n      var goingLeft = colTransformDir < 0;\n      var goingRight = colTransformDir > 0;\n      var mergedCellOnBottomEdge = mergedCellAtCoords.row + mergedCellAtCoords.rowspan - 1 === this.hot.countRows() - 1;\n      var mergedCellOnTopEdge = mergedCellAtCoords.row === 0;\n      var mergedCellOnRightEdge = mergedCellAtCoords.col + mergedCellAtCoords.colspan - 1 === this.hot.countCols() - 1;\n      var mergedCellOnLeftEdge = mergedCellAtCoords.col === 0;\n\n      if (goingDown && mergedCellOnBottomEdge || goingUp && mergedCellOnTopEdge || goingRight && mergedCellOnRightEdge || goingLeft && mergedCellOnLeftEdge) {\n        coords.row = mergedCellAtCoords.row;\n        coords.col = mergedCellAtCoords.col;\n      }\n    }\n\n    /**\n     * `afterDrawSelection` hook callback. Used to add the additional class name for the entirely-selected merged cells.\n     *\n     * @private\n     * @param {Number} currentRow Row index of the currently processed cell.\n     * @param {Number} currentColumn Column index of the currently cell.\n     * @param {Array} cornersOfSelection Array of the current selection in a form of `[startRow, startColumn, endRow, endColumn]`.\n     * @param {Number|undefined} layerLevel Number indicating which layer of selection is currently processed.\n     * @returns {String|undefined} A `String`, which will act as an additional `className` to be added to the currently processed cell.\n     */\n\n  }, {\n    key: 'onAfterDrawSelection',\n    value: function onAfterDrawSelection(currentRow, currentColumn, cornersOfSelection, layerLevel) {\n      return this.selectionCalculations.getSelectedMergedCellClassName(currentRow, currentColumn, cornersOfSelection, layerLevel);\n    }\n\n    /**\n     * `beforeRemoveCellClassNames` hook callback. Used to remove additional class name from all cells in the table.\n     *\n     * @private\n     * @returns {String[]} An `Array` of `String`s. Each of these strings will act like class names to be removed from all the cells in the table.\n     */\n\n  }, {\n    key: 'onBeforeRemoveCellClassNames',\n    value: function onBeforeRemoveCellClassNames() {\n      return this.selectionCalculations.getSelectedMergedCellClassNameToRemove();\n    }\n  }]);\n\n  return MergeCells;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('mergeCells', MergeCells);\n\nexports.default = MergeCells;\n\n/***/ }),\n/* 345 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['The merged cell declared at [', ', ', '] overlaps with the other declared merged \\n      cell. The overlapping merged cell was not added to the table, please fix your setup.'], ['The merged cell declared at [', ', ', '] overlaps with the other declared merged \\n      cell. The overlapping merged cell was not added to the table, please fix your setup.']);\n\nvar _cellCoords = __webpack_require__(95);\n\nvar _cellCoords2 = _interopRequireDefault(_cellCoords);\n\nvar _index = __webpack_require__(4);\n\nvar _number = __webpack_require__(5);\n\nvar _console = __webpack_require__(56);\n\nvar _array = __webpack_require__(1);\n\nvar _utils = __webpack_require__(204);\n\nvar _templateLiteralTag = __webpack_require__(41);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Defines a container object for the merged cells.\n *\n * @class MergedCellsCollection\n * @plugin MergeCells\n */\nvar MergedCellsCollection = function () {\n  function MergedCellsCollection(plugin) {\n    _classCallCheck(this, MergedCellsCollection);\n\n    /**\n     * Reference to the Merge Cells plugin.\n     *\n     * @type {MergeCells}\n     */\n    this.plugin = plugin;\n    /**\n     * Array of merged cells.\n     *\n     * @type {Array}\n     */\n    this.mergedCells = [];\n    /**\n     * The Handsontable instance.\n     *\n     * @type {Handsontable}\n     */\n    this.hot = plugin.hot;\n  }\n\n  /**\n   * Get a warning message for when the declared merged cell data overlaps already existing merged cells.\n   *\n   * @param {Object} newMergedCell Object containg information about the merged cells that was about to be added.\n   * @return {String}\n   */\n\n\n  _createClass(MergedCellsCollection, [{\n    key: 'get',\n\n\n    /**\n     * Get a merged cell from the container, based on the provided arguments. You can provide either the \"starting coordinates\"\n     * of a merged cell, or any coordinates from the body of the merged cell.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} column Column index.\n     * @returns {MergedCellCoords|Boolean} Returns a wanted merged cell on success and `false` on failure.\n     */\n    value: function get(row, column) {\n      var mergedCells = this.mergedCells;\n      var result = false;\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        if (mergedCell.row <= row && mergedCell.row + mergedCell.rowspan - 1 >= row && mergedCell.col <= column && mergedCell.col + mergedCell.colspan - 1 >= column) {\n          result = mergedCell;\n          return false;\n        }\n\n        return true;\n      });\n\n      return result;\n    }\n\n    /**\n     * Get a merged cell containing the provided range.\n     *\n     * @param {CellRange|Object} range The range to search merged cells for.\n     * @return {MergedCellCoords|Boolean}\n     */\n\n  }, {\n    key: 'getByRange',\n    value: function getByRange(range) {\n      var mergedCells = this.mergedCells;\n      var result = false;\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        if (mergedCell.row <= range.from.row && mergedCell.row + mergedCell.rowspan - 1 >= range.to.row && mergedCell.col <= range.from.col && mergedCell.col + mergedCell.colspan - 1 >= range.to.col) {\n          result = mergedCell;\n          return result;\n        }\n\n        return true;\n      });\n\n      return result;\n    }\n\n    /**\n     * Get a merged cell contained in the provided range.\n     *\n     * @param {CellRange|Object} range The range to search merged cells in.\n     * @param [countPartials=false] If set to `true`, all the merged cells overlapping the range will be taken into calculation.\n     * @return {Array|Boolean} Array of found merged cells of `false` if none were found.\n     */\n\n  }, {\n    key: 'getWithinRange',\n    value: function getWithinRange(range) {\n      var countPartials = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      var mergedCells = this.mergedCells;\n      var foundMergedCells = [];\n\n      if (!range.includesRange) {\n        var from = new _index.CellCoords(range.from.row, range.from.col);\n        var to = new _index.CellCoords(range.to.row, range.to.col);\n        range = new _index.CellRange(from, from, to);\n      }\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        var mergedCellTopLeft = new _index.CellCoords(mergedCell.row, mergedCell.col);\n        var mergedCellBottomRight = new _index.CellCoords(mergedCell.row + mergedCell.rowspan - 1, mergedCell.col + mergedCell.colspan - 1);\n        var mergedCellRange = new _index.CellRange(mergedCellTopLeft, mergedCellTopLeft, mergedCellBottomRight);\n\n        if (countPartials) {\n          if (range.overlaps(mergedCellRange)) {\n            foundMergedCells.push(mergedCell);\n          }\n        } else if (range.includesRange(mergedCellRange)) {\n          foundMergedCells.push(mergedCell);\n        }\n      });\n\n      return foundMergedCells.length ? foundMergedCells : false;\n    }\n\n    /**\n     * Add a merged cell to the container.\n     *\n     * @param {Object} mergedCellInfo The merged cell information object. Has to contain `row`, `col`, `colspan` and `rowspan` properties.\n     * @return {MergedCellCoords|Boolean} Returns the new merged cell on success and `false` on failure.\n     */\n\n  }, {\n    key: 'add',\n    value: function add(mergedCellInfo) {\n      var mergedCells = this.mergedCells;\n      var row = mergedCellInfo.row;\n      var column = mergedCellInfo.col;\n      var rowspan = mergedCellInfo.rowspan;\n      var colspan = mergedCellInfo.colspan;\n      var newMergedCell = new _cellCoords2.default(row, column, rowspan, colspan);\n      var alreadyExists = this.get(row, column);\n      var isOverlapping = this.isOverlapping(newMergedCell);\n\n      if (!alreadyExists && !isOverlapping) {\n        if (this.hot) {\n          newMergedCell.normalize(this.hot);\n        }\n\n        mergedCells.push(newMergedCell);\n\n        return newMergedCell;\n      }\n\n      (0, _console.warn)(MergedCellsCollection.IS_OVERLAPPING_WARNING(newMergedCell));\n\n      return false;\n    }\n\n    /**\n     * Remove a merged cell from the container. You can provide either the \"starting coordinates\"\n     * of a merged cell, or any coordinates from the body of the merged cell.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} column Column index.\n     * @return {MergedCellCoords|Boolean} Returns the removed merged cell on success and `false` on failure.\n     */\n\n  }, {\n    key: 'remove',\n    value: function remove(row, column) {\n      var mergedCells = this.mergedCells;\n      var wantedCollection = this.get(row, column);\n      var wantedCollectionIndex = wantedCollection ? this.mergedCells.indexOf(wantedCollection) : null;\n\n      if (wantedCollection && wantedCollectionIndex !== false) {\n        mergedCells.splice(wantedCollectionIndex, 1);\n        return wantedCollection;\n      }\n\n      return false;\n    }\n\n    /**\n     * Clear all the merged cells.\n     */\n\n  }, {\n    key: 'clear',\n    value: function clear() {\n      var _this = this;\n\n      var mergedCells = this.mergedCells;\n      var mergedCellParentsToClear = [];\n      var hiddenCollectionElements = [];\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        mergedCellParentsToClear.push([_this.hot.getCell(mergedCell.row, mergedCell.col), _this.get(mergedCell.row, mergedCell.col), mergedCell.row, mergedCell.col]);\n      });\n\n      this.mergedCells.length = 0;\n\n      (0, _array.arrayEach)(mergedCellParentsToClear, function (mergedCell, i) {\n        (0, _number.rangeEach)(0, mergedCell.rowspan - 1, function (j) {\n          (0, _number.rangeEach)(0, mergedCell.colspan - 1, function (k) {\n            if (k !== 0 || j !== 0) {\n              hiddenCollectionElements.push([_this.hot.getCell(mergedCell.row + j, mergedCell.col + k), null, null, null]);\n            }\n          });\n        });\n\n        mergedCellParentsToClear[i][1] = null;\n      });\n\n      (0, _array.arrayEach)(mergedCellParentsToClear, function (mergedCellParents) {\n        _utils.applySpanProperties.apply(undefined, _toConsumableArray(mergedCellParents));\n      });\n\n      (0, _array.arrayEach)(hiddenCollectionElements, function (hiddenCollectionElement) {\n        _utils.applySpanProperties.apply(undefined, _toConsumableArray(hiddenCollectionElement));\n      });\n    }\n\n    /**\n     * Check if the provided merged cell overlaps with the others in the container.\n     *\n     * @param {MergedCellCoords} mergedCell The merged cell to check against all others in the container.\n     * @return {Boolean} `true` if the provided merged cell overlaps with the others, `false` otherwise.\n     */\n\n  }, {\n    key: 'isOverlapping',\n    value: function isOverlapping(mergedCell) {\n      var mergedCellRange = new _index.CellRange(null, new _index.CellCoords(mergedCell.row, mergedCell.col), new _index.CellCoords(mergedCell.row + mergedCell.rowspan - 1, mergedCell.col + mergedCell.colspan - 1));\n      var result = false;\n\n      (0, _array.arrayEach)(this.mergedCells, function (col) {\n        var currentRange = new _index.CellRange(null, new _index.CellCoords(col.row, col.col), new _index.CellCoords(col.row + col.rowspan - 1, col.col + col.colspan - 1));\n\n        if (currentRange.overlaps(mergedCellRange)) {\n          result = true;\n          return false;\n        }\n\n        return true;\n      });\n\n      return result;\n    }\n\n    /**\n     * Check whether the provided row/col coordinates direct to a merged parent.\n     *\n     * @param {Number} row Row index.\n     * @param {Number} column Column index.\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isMergedParent',\n    value: function isMergedParent(row, column) {\n      var mergedCells = this.mergedCells;\n      var result = false;\n\n      (0, _array.arrayEach)(mergedCells, function (mergedCell) {\n        if (mergedCell.row === row && mergedCell.col === column) {\n          result = true;\n          return false;\n        }\n\n        return true;\n      });\n\n      return result;\n    }\n\n    /**\n     * Shift the merged cell in the direction and by an offset defined in the arguments.\n     *\n     * @param {String} direction `right`, `left`, `up` or `down`.\n     * @param {Number} index Index where the change, which caused the shifting took place.\n     * @param {Number} count Number of rows/columns added/removed in the preceding action.\n     */\n\n  }, {\n    key: 'shiftCollections',\n    value: function shiftCollections(direction, index, count) {\n      var _this2 = this;\n\n      var shiftVector = [0, 0];\n\n      switch (direction) {\n        case 'right':\n          shiftVector[0] += count;\n          break;\n\n        case 'left':\n          shiftVector[0] -= count;\n          break;\n\n        case 'down':\n          shiftVector[1] += count;\n          break;\n\n        case 'up':\n          shiftVector[1] -= count;\n          break;\n\n        default:\n      }\n\n      (0, _array.arrayEach)(this.mergedCells, function (currentMerge) {\n        currentMerge.shift(shiftVector, index);\n      });\n\n      (0, _number.rangeEachReverse)(this.mergedCells.length - 1, 0, function (i) {\n        var currentMerge = _this2.mergedCells[i];\n\n        if (currentMerge && currentMerge.removed) {\n          _this2.mergedCells.splice(_this2.mergedCells.indexOf(currentMerge), 1);\n        }\n      });\n    }\n  }], [{\n    key: 'IS_OVERLAPPING_WARNING',\n    value: function IS_OVERLAPPING_WARNING(newMergedCell) {\n      return (0, _templateLiteralTag.toSingleLine)(_templateObject, newMergedCell.row, newMergedCell.col);\n    }\n  }]);\n\n  return MergedCellsCollection;\n}();\n\nexports.default = MergedCellsCollection;\n\n/***/ }),\n/* 346 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _object = __webpack_require__(2);\n\nvar _src = __webpack_require__(4);\n\nvar _array = __webpack_require__(1);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Class responsible for all of the Autofill-related operations on merged cells.\n *\n * @class AutofillCalculations\n * @plugin MergeCells\n * @util\n */\nvar AutofillCalculations = function () {\n  function AutofillCalculations(plugin) {\n    _classCallCheck(this, AutofillCalculations);\n\n    /**\n     * Reference to the Merge Cells plugin.\n     *\n     * @type {MergeCells}\n     */\n    this.plugin = plugin;\n    /**\n     * Reference to the MergedCellsCollection class instance.\n     *\n     * @type {MergedCellsCollection}\n     */\n    this.mergedCellsCollection = this.plugin.mergedCellsCollection;\n    /**\n     * Cache of the currently processed autofill data.\n     *\n     * @private\n     * @type {Object}\n     */\n    this.currentFillData = null;\n  }\n\n  /**\n   * Correct the provided selection area, so it's not selecting only a part of a merged cell.\n   *\n   * @param {Array} selectionArea\n   */\n\n\n  _createClass(AutofillCalculations, [{\n    key: 'correctSelectionAreaSize',\n    value: function correctSelectionAreaSize(selectionArea) {\n      if (selectionArea[0] === selectionArea[2] && selectionArea[1] === selectionArea[3]) {\n        var mergedCell = this.mergedCellsCollection.get(selectionArea[0], selectionArea[1]);\n\n        if (mergedCell) {\n          selectionArea[2] = selectionArea[0] + mergedCell.rowspan - 1;\n          selectionArea[3] = selectionArea[1] + mergedCell.colspan - 1;\n        }\n      }\n    }\n\n    /**\n     * Get the direction of the autofill process.\n     *\n     * @param {Array} selectionArea The selection area.\n     * @param {Array} finalArea The final area (base + drag).\n     * @return {String} `up`, `down`, `left` or `right`.\n     */\n\n  }, {\n    key: 'getDirection',\n    value: function getDirection(selectionArea, finalArea) {\n      var direction = null;\n\n      if (finalArea[0] === selectionArea[0] && finalArea[1] === selectionArea[1] && finalArea[3] === selectionArea[3]) {\n        direction = 'down';\n      } else if (finalArea[2] === selectionArea[2] && finalArea[1] === selectionArea[1] && finalArea[3] === selectionArea[3]) {\n        direction = 'up';\n      } else if (finalArea[1] === selectionArea[1] && finalArea[2] === selectionArea[2]) {\n        direction = 'right';\n      } else {\n        direction = 'left';\n      }\n\n      return direction;\n    }\n\n    /**\n     * Snap the drag area to the farthest merged cell, so it won't clip any of the merged cells.\n     *\n     * @param {Array} baseArea The base selected area.\n     * @param {Array} dragArea The drag area.\n     * @param {String} dragDirection The autofill drag direction.\n     * @param {Array} foundMergedCells MergeCellCoords found in the base selection area.\n     * @return {Array} The new drag area\n     */\n\n  }, {\n    key: 'snapDragArea',\n    value: function snapDragArea(baseArea, dragArea, dragDirection, foundMergedCells) {\n      var newDragArea = dragArea.slice(0);\n      var fillSize = this.getAutofillSize(baseArea, dragArea, dragDirection);\n\n      var _baseArea = _slicedToArray(baseArea, 4),\n          baseAreaStartRow = _baseArea[0],\n          baseAreaStartColumn = _baseArea[1],\n          baseAreaEndRow = _baseArea[2],\n          baseAreaEndColumn = _baseArea[3];\n\n      var verticalDirection = ['up', 'down'].indexOf(dragDirection) > -1;\n      var fullCycle = verticalDirection ? baseAreaEndRow - baseAreaStartRow + 1 : baseAreaEndColumn - baseAreaStartColumn + 1;\n      var fulls = Math.floor(fillSize / fullCycle) * fullCycle;\n      var partials = fillSize - fulls;\n      var farthestCollection = this.getFarthestCollection(baseArea, dragArea, dragDirection, foundMergedCells);\n\n      if (farthestCollection) {\n        if (dragDirection === 'down') {\n          var fill = farthestCollection.row + farthestCollection.rowspan - baseAreaStartRow - partials;\n          var newLimit = newDragArea[2] + fill;\n\n          if (newLimit >= this.plugin.hot.countRows()) {\n            newDragArea[2] -= partials;\n          } else {\n            newDragArea[2] += partials ? fill : 0;\n          }\n        } else if (dragDirection === 'right') {\n          var _fill = farthestCollection.col + farthestCollection.colspan - baseAreaStartColumn - partials;\n          var _newLimit = newDragArea[3] + _fill;\n\n          if (_newLimit >= this.plugin.hot.countCols()) {\n            newDragArea[3] -= partials;\n          } else {\n            newDragArea[3] += partials ? _fill : 0;\n          }\n        } else if (dragDirection === 'up') {\n          var _fill2 = baseAreaEndRow - partials - farthestCollection.row + 1;\n          var _newLimit2 = newDragArea[0] + _fill2;\n\n          if (_newLimit2 < 0) {\n            newDragArea[0] += partials;\n          } else {\n            newDragArea[0] -= partials ? _fill2 : 0;\n          }\n        } else if (dragDirection === 'left') {\n          var _fill3 = baseAreaEndColumn - partials - farthestCollection.col + 1;\n          var _newLimit3 = newDragArea[1] + _fill3;\n\n          if (_newLimit3 < 0) {\n            newDragArea[1] += partials;\n          } else {\n            newDragArea[1] -= partials ? _fill3 : 0;\n          }\n        }\n      }\n\n      this.updateCurrentFillCache({\n        baseArea: baseArea,\n        dragDirection: dragDirection,\n        foundMergedCells: foundMergedCells,\n        fillSize: fillSize,\n        dragArea: newDragArea,\n        cycleLength: fullCycle\n      });\n\n      return newDragArea;\n    }\n\n    /**\n     * Update the current fill cache with the provided object.\n     *\n     * @private\n     * @param {Object} updateObject\n     */\n\n  }, {\n    key: 'updateCurrentFillCache',\n    value: function updateCurrentFillCache(updateObject) {\n      if (!this.currentFillData) {\n        this.currentFillData = {};\n      }\n\n      (0, _object.extend)(this.currentFillData, updateObject);\n    }\n\n    /**\n     * Get the \"length\" of the drag area.\n     *\n     * @private\n     * @param {Array} baseArea The base selection area.\n     * @param {Array} dragArea The drag area (containing the base area).\n     * @param {String} direction The drag direction.\n     * @return {Number|null} The \"length\" (height or width, depending on the direction) of the drag.\n     */\n\n  }, {\n    key: 'getAutofillSize',\n    value: function getAutofillSize(baseArea, dragArea, direction) {\n      var _baseArea2 = _slicedToArray(baseArea, 4),\n          baseAreaStartRow = _baseArea2[0],\n          baseAreaStartColumn = _baseArea2[1],\n          baseAreaEndRow = _baseArea2[2],\n          baseAreaEndColumn = _baseArea2[3];\n\n      var _dragArea = _slicedToArray(dragArea, 4),\n          dragAreaStartRow = _dragArea[0],\n          dragAreaStartColumn = _dragArea[1],\n          dragAreaEndRow = _dragArea[2],\n          dragAreaEndColumn = _dragArea[3];\n\n      switch (direction) {\n        case 'up':\n          return baseAreaStartRow - dragAreaStartRow;\n        case 'down':\n          return dragAreaEndRow - baseAreaEndRow;\n        case 'left':\n          return baseAreaStartColumn - dragAreaStartColumn;\n        case 'right':\n          return dragAreaEndColumn - baseAreaEndColumn;\n        default:\n          return null;\n      }\n    }\n\n    /**\n     * Trim the default drag area (containing the selection area) to the drag-only area.\n     *\n     * @private\n     * @param {Array} baseArea The base selection area.\n     * @param {Array} dragArea The base selection area extended by the drag area.\n     * @param {String} direction Drag direction.\n     * @return {Array|null} Array representing the drag area coordinates.\n     */\n\n  }, {\n    key: 'getDragArea',\n    value: function getDragArea(baseArea, dragArea, direction) {\n      var _baseArea3 = _slicedToArray(baseArea, 4),\n          baseAreaStartRow = _baseArea3[0],\n          baseAreaStartColumn = _baseArea3[1],\n          baseAreaEndRow = _baseArea3[2],\n          baseAreaEndColumn = _baseArea3[3];\n\n      var _dragArea2 = _slicedToArray(dragArea, 4),\n          dragAreaStartRow = _dragArea2[0],\n          dragAreaStartColumn = _dragArea2[1],\n          dragAreaEndRow = _dragArea2[2],\n          dragAreaEndColumn = _dragArea2[3];\n\n      switch (direction) {\n        case 'up':\n          return [dragAreaStartRow, dragAreaStartColumn, baseAreaStartRow - 1, baseAreaEndColumn];\n        case 'down':\n          return [baseAreaEndRow + 1, baseAreaStartColumn, dragAreaEndRow, baseAreaEndColumn];\n        case 'left':\n          return [dragAreaStartRow, dragAreaStartColumn, baseAreaEndRow, baseAreaStartColumn - 1];\n        case 'right':\n          return [baseAreaStartRow, baseAreaEndColumn + 1, dragAreaEndRow, dragAreaEndColumn];\n        default:\n          return null;\n      }\n    }\n\n    /**\n     * Get the to-be-farthest merged cell in the newly filled area.\n     *\n     * @private\n     * @param {Array} baseArea The base selection area.\n     * @param {Array} dragArea The drag area (containing the base area).\n     * @param {String} direction The drag direction.\n     * @param {Array} mergedCellArray Array of the merged cells found in the base area.\n     * @return {MergedCellCoords|null}\n     */\n\n  }, {\n    key: 'getFarthestCollection',\n    value: function getFarthestCollection(baseArea, dragArea, direction, mergedCellArray) {\n      var _baseArea4 = _slicedToArray(baseArea, 4),\n          baseAreaStartRow = _baseArea4[0],\n          baseAreaStartColumn = _baseArea4[1],\n          baseAreaEndRow = _baseArea4[2],\n          baseAreaEndColumn = _baseArea4[3];\n\n      var verticalDirection = ['up', 'down'].indexOf(direction) > -1;\n      var baseEnd = verticalDirection ? baseAreaEndRow : baseAreaEndColumn;\n      var baseStart = verticalDirection ? baseAreaStartRow : baseAreaStartColumn;\n      var fillSize = this.getAutofillSize(baseArea, dragArea, direction);\n      var fullCycle = verticalDirection ? baseAreaEndRow - baseAreaStartRow + 1 : baseAreaEndColumn - baseAreaStartColumn + 1;\n      var fulls = Math.floor(fillSize / fullCycle) * fullCycle;\n      var partials = fillSize - fulls;\n      var inclusionFunctionName = null;\n      var farthestCollection = null;\n      var endOfDragRecreationIndex = null;\n\n      switch (direction) {\n        case 'up':\n          inclusionFunctionName = 'includesVertically';\n          endOfDragRecreationIndex = baseEnd - partials + 1;\n          break;\n\n        case 'left':\n          inclusionFunctionName = 'includesHorizontally';\n          endOfDragRecreationIndex = baseEnd - partials + 1;\n          break;\n\n        case 'down':\n          inclusionFunctionName = 'includesVertically';\n          endOfDragRecreationIndex = baseStart + partials - 1;\n          break;\n\n        case 'right':\n          inclusionFunctionName = 'includesHorizontally';\n          endOfDragRecreationIndex = baseStart + partials - 1;\n          break;\n\n        default:\n      }\n\n      (0, _array.arrayEach)(mergedCellArray, function (currentCollection) {\n        if (currentCollection[inclusionFunctionName](endOfDragRecreationIndex) && currentCollection.isFarther(farthestCollection, direction)) {\n          farthestCollection = currentCollection;\n        }\n      });\n\n      return farthestCollection;\n    }\n\n    /**\n     * Recreate the merged cells after the autofill process.\n     *\n     * @param {Array} changes Changes made.\n     */\n\n  }, {\n    key: 'recreateAfterDataPopulation',\n    value: function recreateAfterDataPopulation(changes) {\n      if (!this.currentFillData) {\n        return;\n      }\n\n      var fillRange = this.getRangeFromChanges(changes);\n      var foundMergedCells = this.currentFillData.foundMergedCells;\n      var dragDirection = this.currentFillData.dragDirection;\n      var inBounds = function inBounds(current, offset) {\n        switch (dragDirection) {\n          case 'up':\n            return current.row - offset >= fillRange.from.row;\n          case 'down':\n            return current.row + current.rowspan - 1 + offset <= fillRange.to.row;\n          case 'left':\n            return current.col - offset >= fillRange.from.column;\n          case 'right':\n            return current.col + current.colspan - 1 + offset <= fillRange.to.column;\n          default:\n            return null;\n        }\n      };\n      var fillOffset = 0;\n      var current = null;\n      var multiplier = 1;\n\n      do {\n        for (var j = 0; j < foundMergedCells.length; j += 1) {\n          current = foundMergedCells[j];\n\n          fillOffset = multiplier * this.currentFillData.cycleLength;\n\n          if (inBounds(current, fillOffset)) {\n            switch (dragDirection) {\n              case 'up':\n                this.plugin.mergedCellsCollection.add({\n                  row: current.row - fillOffset,\n                  rowspan: current.rowspan,\n                  col: current.col,\n                  colspan: current.colspan\n                });\n                break;\n\n              case 'down':\n                this.plugin.mergedCellsCollection.add({\n                  row: current.row + fillOffset,\n                  rowspan: current.rowspan,\n                  col: current.col,\n                  colspan: current.colspan\n                });\n                break;\n\n              case 'left':\n                this.plugin.mergedCellsCollection.add({\n                  row: current.row,\n                  rowspan: current.rowspan,\n                  col: current.col - fillOffset,\n                  colspan: current.colspan\n                });\n                break;\n\n              case 'right':\n                this.plugin.mergedCellsCollection.add({\n                  row: current.row,\n                  rowspan: current.rowspan,\n                  col: current.col + fillOffset,\n                  colspan: current.colspan\n                });\n                break;\n\n              default:\n            }\n          }\n\n          if (j === foundMergedCells.length - 1) {\n            multiplier += 1;\n          }\n        }\n      } while (inBounds(current, fillOffset));\n\n      this.currentFillData = null;\n      this.plugin.hot.render();\n    }\n\n    /**\n     * Get the drag range from the changes made.\n     *\n     * @private\n     * @param {Array} changes The changes made.\n     * @returns {Object} Object with `from` and `to` properties, both containing `row` and `column` keys.\n     */\n\n  }, {\n    key: 'getRangeFromChanges',\n    value: function getRangeFromChanges(changes) {\n      var rows = { min: null, max: null };\n      var columns = { min: null, max: null };\n\n      (0, _array.arrayEach)(changes, function (change) {\n        if (rows.min === null || change[0] < rows.min) {\n          rows.min = change[0];\n        }\n\n        if (rows.max === null || change[0] > rows.max) {\n          rows.max = change[0];\n        }\n\n        if (columns.min === null || change[1] < columns.min) {\n          columns.min = change[1];\n        }\n\n        if (columns.max === null || change[1] > columns.max) {\n          columns.max = change[1];\n        }\n      });\n\n      return {\n        from: {\n          row: rows.min,\n          column: columns.min\n        },\n        to: {\n          row: rows.max,\n          column: columns.max\n        }\n      };\n    }\n\n    /**\n     * Check if the drag area contains any merged cells.\n     *\n     * @param {Array} baseArea The base selection area.\n     * @param {Array} fullArea The base area extended by the drag area.\n     * @param {String} direction Drag direction.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'dragAreaOverlapsCollections',\n    value: function dragAreaOverlapsCollections(baseArea, fullArea, direction) {\n      var dragArea = this.getDragArea(baseArea, fullArea, direction);\n\n      var _dragArea3 = _slicedToArray(dragArea, 4),\n          dragAreaStartRow = _dragArea3[0],\n          dragAreaStartColumn = _dragArea3[1],\n          dragAreaEndRow = _dragArea3[2],\n          dragAreaEndColumn = _dragArea3[3];\n\n      var topLeft = new _src.CellCoords(dragAreaStartRow, dragAreaStartColumn);\n      var bottomRight = new _src.CellCoords(dragAreaEndRow, dragAreaEndColumn);\n      var dragRange = new _src.CellRange(topLeft, topLeft, bottomRight);\n\n      return !!this.mergedCellsCollection.getWithinRange(dragRange, true);\n    }\n  }]);\n\n  return AutofillCalculations;\n}();\n\nexports.default = AutofillCalculations;\n\n/***/ }),\n/* 347 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _src = __webpack_require__(4);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Class responsible for all of the Selection-related operations on merged cells.\n *\n * @class SelectionCalculations\n * @plugin MergeCells\n * @util\n */\nvar SelectionCalculations = function () {\n  function SelectionCalculations(plugin) {\n    _classCallCheck(this, SelectionCalculations);\n\n    /**\n     * Reference to the Merge Cells plugin.\n     *\n     * @type {MergeCells}\n     */\n    this.plugin = plugin;\n    /**\n     * Class name used for fully selected merged cells.\n     *\n     * @type {String}\n     */\n    this.fullySelectedMergedCellClassName = 'fullySelectedMergedCell';\n  }\n\n  /**\n   * \"Snap\" the delta value according to defined merged cells. (In other words, compensate the rowspan -\n   * e.g. going up with `delta.row = -1` over a merged cell with `rowspan = 3`, `delta.row` should change to `-3`.)\n   *\n   * @param {Object} delta The delta object containing `row` and `col` properties.\n   * @param {CellRange} selectionRange The selection range.\n   * @param {Object} mergedCell A merged cell object.\n   */\n\n\n  _createClass(SelectionCalculations, [{\n    key: 'snapDelta',\n    value: function snapDelta(delta, selectionRange, mergedCell) {\n      var cellCoords = selectionRange.to;\n      var newRow = cellCoords.row + delta.row;\n      var newColumn = cellCoords.col + delta.col;\n\n      if (delta.row) {\n        this.jumpOverMergedCell(delta, mergedCell, newRow);\n      } else if (delta.col) {\n        this.jumpOverMergedCell(delta, mergedCell, newColumn);\n      }\n    }\n\n    /**\n     * \"Jump\" over the merged cell (compensate for the indexes within the merged cell to get past it)\n     *\n     * @private\n     * @param {Object} delta The delta object.\n     * @param {MergedCellCoords} mergedCell The merge cell object.\n     * @param {Number} newIndex New row/column index, created with the delta.\n     */\n\n  }, {\n    key: 'jumpOverMergedCell',\n    value: function jumpOverMergedCell(delta, mergedCell, newIndex) {\n      var flatDelta = delta.row || delta.col;\n      var includesIndex = null;\n      var firstIndex = null;\n      var lastIndex = null;\n\n      if (delta.row) {\n        includesIndex = mergedCell.includesVertically(newIndex);\n        firstIndex = mergedCell.row;\n        lastIndex = mergedCell.getLastRow();\n      } else if (delta.col) {\n        includesIndex = mergedCell.includesHorizontally(newIndex);\n        firstIndex = mergedCell.col;\n        lastIndex = mergedCell.getLastColumn();\n      }\n\n      if (flatDelta === 0) {\n        return;\n      } else if (flatDelta > 0) {\n        if (includesIndex && newIndex !== firstIndex) {\n          flatDelta += lastIndex - newIndex + 1;\n        }\n      } else if (includesIndex && newIndex !== lastIndex) {\n        flatDelta -= newIndex - firstIndex + 1;\n      }\n\n      if (delta.row) {\n        delta.row = flatDelta;\n      } else if (delta.col) {\n        delta.col = flatDelta;\n      }\n    }\n\n    /**\n     * Get a selection range with `to` property incremented by the provided delta.\n     *\n     * @param {CellRange} oldSelectionRange The base selection range.\n     * @param {Object} delta The delta object with `row` and `col` properties.\n     * @returns {CellRange} A new `CellRange` object.\n     */\n\n  }, {\n    key: 'getUpdatedSelectionRange',\n    value: function getUpdatedSelectionRange(oldSelectionRange, delta) {\n      return new _src.CellRange(oldSelectionRange.highlight, oldSelectionRange.from, new _src.CellCoords(oldSelectionRange.to.row + delta.row, oldSelectionRange.to.col + delta.col));\n    }\n\n    /**\n     * Generate an additional class name for the entirely-selected merged cells.\n     *\n     * @param {Number} currentRow Row index of the currently processed cell.\n     * @param {Number} currentColumn Column index of the currently cell.\n     * @param {Array} cornersOfSelection Array of the current selection in a form of `[startRow, startColumn, endRow, endColumn]`.\n     * @param {Number|undefined} layerLevel Number indicating which layer of selection is currently processed.\n     * @returns {String|undefined} A `String`, which will act as an additional `className` to be added to the currently processed cell.\n     */\n\n  }, {\n    key: 'getSelectedMergedCellClassName',\n    value: function getSelectedMergedCellClassName(currentRow, currentColumn, cornersOfSelection, layerLevel) {\n      var _cornersOfSelection = _slicedToArray(cornersOfSelection, 4),\n          startRow = _cornersOfSelection[0],\n          startColumn = _cornersOfSelection[1],\n          endRow = _cornersOfSelection[2],\n          endColumn = _cornersOfSelection[3];\n\n      if (layerLevel === void 0) {\n        return;\n      }\n\n      if (currentRow >= startRow && currentRow <= endRow && currentColumn >= startColumn && currentColumn <= endColumn) {\n\n        var isMergedCellParent = this.plugin.mergedCellsCollection.isMergedParent(currentRow, currentColumn);\n\n        if (!isMergedCellParent) {\n          return;\n        }\n\n        var mergedCell = this.plugin.mergedCellsCollection.get(currentRow, currentColumn);\n\n        if (!mergedCell) {\n          return;\n        }\n\n        if (mergedCell.row + mergedCell.rowspan - 1 <= endRow && mergedCell.col + mergedCell.colspan - 1 <= endColumn) {\n          return this.fullySelectedMergedCellClassName + '-' + layerLevel;\n        } else if (this.plugin.selectionCalculations.isMergeCellFullySelected(mergedCell, this.plugin.hot.getSelectedRange())) {\n          return this.fullySelectedMergedCellClassName + '-multiple';\n        }\n      }\n    }\n\n    /**\n     * Check if the provided merged cell is fully selected (by one or many layers of selection)\n     *\n     * @param {MergedCellCoords} mergedCell The merged cell to be processed.\n     * @param {CellRange[]} selectionRangesArray Array of selection ranges.\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isMergeCellFullySelected',\n    value: function isMergeCellFullySelected(mergedCell, selectionRangesArray) {\n      var mergedCellIndividualCoords = [];\n\n      if (!selectionRangesArray || !mergedCell) {\n        return false;\n      }\n\n      for (var r = 0; r < mergedCell.rowspan; r += 1) {\n        for (var c = 0; c < mergedCell.colspan; c += 1) {\n          mergedCellIndividualCoords.push(new _src.CellCoords(mergedCell.row + r, mergedCell.col + c));\n        }\n      }\n\n      for (var i = 0; i < mergedCellIndividualCoords.length; i += 1) {\n        var insideSelections = [];\n\n        for (var s = 0; s < selectionRangesArray.length; s += 1) {\n          insideSelections[s] = selectionRangesArray[s].includes(mergedCellIndividualCoords[i]);\n        }\n\n        if (!insideSelections.includes(true)) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n\n    /**\n     * Generate an array of the entirely-selected merged cells' class names.\n     *\n     * @returns {String[]} An `Array` of `String`s. Each of these strings will act like class names to be removed from all the cells in the table.\n     */\n\n  }, {\n    key: 'getSelectedMergedCellClassNameToRemove',\n    value: function getSelectedMergedCellClassNameToRemove() {\n      var classNames = [];\n\n      for (var i = 0; i <= 7; i += 1) {\n        classNames.push(this.fullySelectedMergedCellClassName + '-' + i);\n      }\n\n      classNames.push(this.fullySelectedMergedCellClassName + '-multiple');\n\n      return classNames;\n    }\n  }]);\n\n  return SelectionCalculations;\n}();\n\nexports.default = SelectionCalculations;\n\n/***/ }),\n/* 348 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = toggleMergeItem;\n\nvar _constants = __webpack_require__(7);\n\nvar C = _interopRequireWildcard(_constants);\n\nvar _cellCoords = __webpack_require__(95);\n\nvar _cellCoords2 = _interopRequireDefault(_cellCoords);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction toggleMergeItem(plugin) {\n  return {\n    key: 'mergeCells',\n    name: function name() {\n      var sel = this.getSelectedLast();\n\n      if (sel) {\n        var info = plugin.mergedCellsCollection.get(sel[0], sel[1]);\n\n        if (info.row === sel[0] && info.col === sel[1] && info.row + info.rowspan - 1 === sel[2] && info.col + info.colspan - 1 === sel[3]) {\n          return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_UNMERGE_CELLS);\n        }\n      }\n\n      return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_MERGE_CELLS);\n    },\n    callback: function callback() {\n      plugin.toggleMergeOnSelection();\n    },\n    disabled: function disabled() {\n      var sel = this.getSelectedLast();\n\n      if (!sel) {\n        return true;\n      }\n\n      var isSingleCell = _cellCoords2.default.isSingleCell({\n        row: sel[0],\n        col: sel[1],\n        rowspan: sel[2] - sel[0] + 1,\n        colspan: sel[3] - sel[1] + 1\n      });\n\n      return isSingleCell || this.selection.isSelectedByCorner();\n    },\n\n    hidden: false\n  };\n}\n\n/***/ }),\n/* 349 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 350 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _element = __webpack_require__(0);\n\nvar _browser = __webpack_require__(27);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _eventManager = __webpack_require__(6);\n\nvar _eventManager2 = _interopRequireDefault(_eventManager);\n\nvar _plugins = __webpack_require__(8);\n\nvar _src = __webpack_require__(4);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @plugin MultipleSelectionHandles\n */\nvar MultipleSelectionHandles = function (_BasePlugin) {\n  _inherits(MultipleSelectionHandles, _BasePlugin);\n\n  /**\n   * @param {Object} hotInstance\n   */\n  function MultipleSelectionHandles(hotInstance) {\n    _classCallCheck(this, MultipleSelectionHandles);\n\n    /**\n     * @type {Array}\n     */\n    var _this2 = _possibleConstructorReturn(this, (MultipleSelectionHandles.__proto__ || Object.getPrototypeOf(MultipleSelectionHandles)).call(this, hotInstance));\n\n    _this2.dragged = [];\n    /**\n     * Instance of EventManager.\n     *\n     * @type {EventManager}\n     */\n    _this2.eventManager = null;\n    /**\n     * @type {null}\n     */\n    _this2.lastSetCell = null;\n    return _this2;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(MultipleSelectionHandles, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return (0, _browser.isMobileBrowser)();\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      if (this.enabled) {\n        return;\n      }\n      if (!this.eventManager) {\n        this.eventManager = new _eventManager2.default(this);\n      }\n      this.registerListeners();\n      _get(MultipleSelectionHandles.prototype.__proto__ || Object.getPrototypeOf(MultipleSelectionHandles.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Bind the touch events\n     * @private\n     */\n\n  }, {\n    key: 'registerListeners',\n    value: function registerListeners() {\n      var _this = this;\n\n      function removeFromDragged(query) {\n\n        if (_this.dragged.length === 1) {\n          // clear array\n          _this.dragged.splice(0, _this.dragged.length);\n\n          return true;\n        }\n\n        var entryPosition = _this.dragged.indexOf(query);\n\n        if (entryPosition == -1) {\n          return false;\n        } else if (entryPosition === 0) {\n          _this.dragged = _this.dragged.slice(0, 1);\n        } else if (entryPosition == 1) {\n          _this.dragged = _this.dragged.slice(-1);\n        }\n      }\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'touchstart', function (event) {\n        var selectedRange = void 0;\n\n        if ((0, _element.hasClass)(event.target, 'topLeftSelectionHandle-HitArea')) {\n          selectedRange = _this.hot.getSelectedRangeLast();\n\n          _this.dragged.push('topLeft');\n\n          _this.touchStartRange = {\n            width: selectedRange.getWidth(),\n            height: selectedRange.getHeight(),\n            direction: selectedRange.getDirection()\n          };\n\n          event.preventDefault();\n          return false;\n        } else if ((0, _element.hasClass)(event.target, 'bottomRightSelectionHandle-HitArea')) {\n          selectedRange = _this.hot.getSelectedRangeLast();\n\n          _this.dragged.push('bottomRight');\n\n          _this.touchStartRange = {\n            width: selectedRange.getWidth(),\n            height: selectedRange.getHeight(),\n            direction: selectedRange.getDirection()\n          };\n\n          event.preventDefault();\n          return false;\n        }\n      });\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'touchend', function (event) {\n        if ((0, _element.hasClass)(event.target, 'topLeftSelectionHandle-HitArea')) {\n          removeFromDragged.call(_this, 'topLeft');\n\n          _this.touchStartRange = void 0;\n\n          event.preventDefault();\n          return false;\n        } else if ((0, _element.hasClass)(event.target, 'bottomRightSelectionHandle-HitArea')) {\n          removeFromDragged.call(_this, 'bottomRight');\n\n          _this.touchStartRange = void 0;\n\n          event.preventDefault();\n          return false;\n        }\n      });\n\n      this.eventManager.addEventListener(this.hot.rootElement, 'touchmove', function (event) {\n        var scrollTop = (0, _element.getWindowScrollTop)(),\n            scrollLeft = (0, _element.getWindowScrollLeft)(),\n            endTarget = void 0,\n            targetCoords = void 0,\n            selectedRange = void 0,\n            rangeWidth = void 0,\n            rangeHeight = void 0,\n            rangeDirection = void 0,\n            newRangeCoords = void 0;\n\n        if (_this.dragged.length === 0) {\n          return;\n        }\n\n        endTarget = document.elementFromPoint(event.touches[0].screenX - scrollLeft, event.touches[0].screenY - scrollTop);\n\n        if (!endTarget || endTarget === _this.lastSetCell) {\n          return;\n        }\n\n        if (endTarget.nodeName == 'TD' || endTarget.nodeName == 'TH') {\n          targetCoords = _this.hot.getCoords(endTarget);\n\n          if (targetCoords.col == -1) {\n            targetCoords.col = 0;\n          }\n\n          selectedRange = _this.hot.getSelectedRangeLast();\n          rangeWidth = selectedRange.getWidth();\n          rangeHeight = selectedRange.getHeight();\n          rangeDirection = selectedRange.getDirection();\n\n          if (rangeWidth == 1 && rangeHeight == 1) {\n            _this.hot.selection.setRangeEnd(targetCoords);\n          }\n\n          newRangeCoords = _this.getCurrentRangeCoords(selectedRange, targetCoords, _this.touchStartRange.direction, rangeDirection, _this.dragged[0]);\n\n          if (newRangeCoords.start !== null) {\n            _this.hot.selection.setRangeStart(newRangeCoords.start);\n          }\n\n          _this.hot.selection.setRangeEnd(newRangeCoords.end);\n\n          _this.lastSetCell = endTarget;\n        }\n\n        event.preventDefault();\n      });\n    }\n  }, {\n    key: 'getCurrentRangeCoords',\n    value: function getCurrentRangeCoords(selectedRange, currentTouch, touchStartDirection, currentDirection, draggedHandle) {\n      var topLeftCorner = selectedRange.getTopLeftCorner(),\n          bottomRightCorner = selectedRange.getBottomRightCorner(),\n          bottomLeftCorner = selectedRange.getBottomLeftCorner(),\n          topRightCorner = selectedRange.getTopRightCorner();\n\n      var newCoords = {\n        start: null,\n        end: null\n      };\n\n      switch (touchStartDirection) {\n        case 'NE-SW':\n          switch (currentDirection) {\n            case 'NE-SW':\n            case 'NW-SE':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: new _src.CellCoords(currentTouch.row, selectedRange.highlight.col),\n                  end: new _src.CellCoords(bottomLeftCorner.row, currentTouch.col)\n                };\n              } else {\n                newCoords = {\n                  start: new _src.CellCoords(selectedRange.highlight.row, currentTouch.col),\n                  end: new _src.CellCoords(currentTouch.row, topLeftCorner.col)\n                };\n              }\n              break;\n            case 'SE-NW':\n              if (draggedHandle == 'bottomRight') {\n                newCoords = {\n                  start: new _src.CellCoords(bottomRightCorner.row, currentTouch.col),\n                  end: new _src.CellCoords(currentTouch.row, topLeftCorner.col)\n                };\n              }\n              break;\n            default:\n              break;\n          }\n          break;\n        case 'NW-SE':\n          switch (currentDirection) {\n            case 'NE-SW':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: currentTouch,\n                  end: bottomLeftCorner\n                };\n              } else {\n                newCoords.end = currentTouch;\n              }\n              break;\n            case 'NW-SE':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: currentTouch,\n                  end: bottomRightCorner\n                };\n              } else {\n                newCoords.end = currentTouch;\n              }\n              break;\n            case 'SE-NW':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: currentTouch,\n                  end: topLeftCorner\n                };\n              } else {\n                newCoords.end = currentTouch;\n              }\n              break;\n            case 'SW-NE':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: currentTouch,\n                  end: topRightCorner\n                };\n              } else {\n                newCoords.end = currentTouch;\n              }\n              break;\n            default:\n              break;\n          }\n          break;\n        case 'SW-NE':\n          switch (currentDirection) {\n            case 'NW-SE':\n              if (draggedHandle == 'bottomRight') {\n                newCoords = {\n                  start: new _src.CellCoords(currentTouch.row, topLeftCorner.col),\n                  end: new _src.CellCoords(bottomLeftCorner.row, currentTouch.col)\n                };\n              } else {\n                newCoords = {\n                  start: new _src.CellCoords(topLeftCorner.row, currentTouch.col),\n                  end: new _src.CellCoords(currentTouch.row, bottomRightCorner.col)\n                };\n              }\n              break;\n            // case 'NE-SW':\n            //\n            //  break;\n            case 'SW-NE':\n              if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: new _src.CellCoords(selectedRange.highlight.row, currentTouch.col),\n                  end: new _src.CellCoords(currentTouch.row, bottomRightCorner.col)\n                };\n              } else {\n                newCoords = {\n                  start: new _src.CellCoords(currentTouch.row, topLeftCorner.col),\n                  end: new _src.CellCoords(topLeftCorner.row, currentTouch.col)\n                };\n              }\n              break;\n            case 'SE-NW':\n              if (draggedHandle == 'bottomRight') {\n                newCoords = {\n                  start: new _src.CellCoords(currentTouch.row, topRightCorner.col),\n                  end: new _src.CellCoords(topLeftCorner.row, currentTouch.col)\n                };\n              } else if (draggedHandle == 'topLeft') {\n                newCoords = {\n                  start: bottomLeftCorner,\n                  end: currentTouch\n                };\n              }\n              break;\n            default:\n              break;\n          }\n          break;\n        case 'SE-NW':\n          switch (currentDirection) {\n            case 'NW-SE':\n            case 'NE-SW':\n            case 'SW-NE':\n              if (draggedHandle == 'topLeft') {\n                newCoords.end = currentTouch;\n              }\n              break;\n            case 'SE-NW':\n              if (draggedHandle == 'topLeft') {\n                newCoords.end = currentTouch;\n              } else {\n                newCoords = {\n                  start: currentTouch,\n                  end: topLeftCorner\n                };\n              }\n              break;\n            default:\n              break;\n          }\n          break;\n        default:\n          break;\n      }\n\n      return newCoords;\n    }\n\n    /**\n     * Check if user is currently dragging the handle.\n     *\n     * @returns {boolean} Dragging state\n     */\n\n  }, {\n    key: 'isDragged',\n    value: function isDragged() {\n      return this.dragged.length > 0;\n    }\n  }]);\n\n  return MultipleSelectionHandles;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('multipleSelectionHandles', MultipleSelectionHandles);\n\nexports.default = MultipleSelectionHandles;\n\n/***/ }),\n/* 351 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _jsonPatchDuplex = __webpack_require__(205);\n\nvar _jsonPatchDuplex2 = _interopRequireDefault(_jsonPatchDuplex);\n\nvar _dataObserver = __webpack_require__(352);\n\nvar _dataObserver2 = _interopRequireDefault(_dataObserver);\n\nvar _array = __webpack_require__(1);\n\nvar _plugins = __webpack_require__(8);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// Handsontable.hooks.register('afterChangesObserved');\n\n/**\n * @plugin ObserveChanges\n *\n * @description\n * This plugin allows to observe data source changes.\n *\n * By default, the plugin is declared as `undefined`, which makes it disabled.\n * Enabling this plugin switches the table into one-way data binding where changes are applied into the data source (outside from the table)\n * will be automatically reflected in the table.\n *\n * ```js\n * ...\n * // as a boolean\n * observeChanges: true,\n * ...\n * ```\n *\n * To configure this plugin see {@link Options#observeChanges}.\n */\nvar ObserveChanges = function (_BasePlugin) {\n  _inherits(ObserveChanges, _BasePlugin);\n\n  function ObserveChanges(hotInstance) {\n    _classCallCheck(this, ObserveChanges);\n\n    /**\n     * Instance of {@link DataObserver}.\n     *\n     * @type {DataObserver}\n     */\n    var _this = _possibleConstructorReturn(this, (ObserveChanges.__proto__ || Object.getPrototypeOf(ObserveChanges)).call(this, hotInstance));\n\n    _this.observer = null;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(ObserveChanges, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().observeChanges;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n      if (!this.observer) {\n        this.observer = new _dataObserver2.default(this.hot.getSourceData());\n        this._exposePublicApi();\n      }\n\n      this.observer.addLocalHook('change', function (patches) {\n        return _this2.onDataChange(patches);\n      });\n      this.addHook('afterCreateRow', function () {\n        return _this2.onAfterTableAlter();\n      });\n      this.addHook('afterRemoveRow', function () {\n        return _this2.onAfterTableAlter();\n      });\n      this.addHook('afterCreateCol', function () {\n        return _this2.onAfterTableAlter();\n      });\n      this.addHook('afterRemoveCol', function () {\n        return _this2.onAfterTableAlter();\n      });\n      this.addHook('afterChange', function (changes, source) {\n        return _this2.onAfterTableAlter(source);\n      });\n      this.addHook('afterLoadData', function (firstRun) {\n        return _this2.onAfterLoadData(firstRun);\n      });\n\n      _get(ObserveChanges.prototype.__proto__ || Object.getPrototypeOf(ObserveChanges.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      if (this.observer) {\n        this.observer.destroy();\n        this.observer = null;\n        this._deletePublicApi();\n      }\n\n      _get(ObserveChanges.prototype.__proto__ || Object.getPrototypeOf(ObserveChanges.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Data change observer.\n     *\n     * @private\n     * @param {Array} patches An array of objects which every item defines coordinates where data was changed.\n     */\n\n  }, {\n    key: 'onDataChange',\n    value: function onDataChange(patches) {\n      var _this3 = this;\n\n      if (!this.observer.isPaused()) {\n        var sourceName = this.pluginName + '.change';\n        var actions = {\n          add: function add(patch) {\n            if (isNaN(patch.col)) {\n              _this3.hot.runHooks('afterCreateRow', patch.row, 1, sourceName);\n            } else {\n              _this3.hot.runHooks('afterCreateCol', patch.col, 1, sourceName);\n            }\n          },\n          remove: function remove(patch) {\n            if (isNaN(patch.col)) {\n              _this3.hot.runHooks('afterRemoveRow', patch.row, 1, sourceName);\n            } else {\n              _this3.hot.runHooks('afterRemoveCol', patch.col, 1, sourceName);\n            }\n          },\n          replace: function replace(patch) {\n            _this3.hot.runHooks('afterChange', [[patch.row, patch.col, null, patch.value]], sourceName);\n          }\n        };\n\n        (0, _array.arrayEach)(patches, function (patch) {\n          if (actions[patch.op]) {\n            actions[patch.op](patch);\n          }\n        });\n        this.hot.render();\n      }\n\n      this.hot.runHooks('afterChangesObserved');\n    }\n\n    /**\n     * On after table alter listener. Prevents infinity loop between internal and external data changing.\n     *\n     * @private\n     * @param source\n     */\n\n  }, {\n    key: 'onAfterTableAlter',\n    value: function onAfterTableAlter(source) {\n      var _this4 = this;\n\n      if (source !== 'loadData') {\n        this.observer.pause();\n        this.hot.addHookOnce('afterChangesObserved', function () {\n          return _this4.observer.resume();\n        });\n      }\n    }\n\n    /**\n     * On after load data listener.\n     *\n     * @private\n     * @param {Boolean} firstRun `true` if event was fired first time.\n     */\n\n  }, {\n    key: 'onAfterLoadData',\n    value: function onAfterLoadData(firstRun) {\n      if (!firstRun) {\n        this.observer.setObservedData(this.hot.getSourceData());\n      }\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      if (this.observer) {\n        this.observer.destroy();\n        this._deletePublicApi();\n      }\n      _get(ObserveChanges.prototype.__proto__ || Object.getPrototypeOf(ObserveChanges.prototype), 'destroy', this).call(this);\n    }\n\n    /**\n     * Expose plugins methods to the core.\n     *\n     * @private\n     */\n\n  }, {\n    key: '_exposePublicApi',\n    value: function _exposePublicApi() {\n      var _this5 = this;\n\n      var hot = this.hot;\n\n      hot.pauseObservingChanges = function () {\n        return _this5.observer.pause();\n      };\n      hot.resumeObservingChanges = function () {\n        return _this5.observer.resume();\n      };\n      hot.isPausedObservingChanges = function () {\n        return _this5.observer.isPaused();\n      };\n    }\n\n    /**\n     * Delete all previously exposed methods.\n     *\n     * @private\n     */\n\n  }, {\n    key: '_deletePublicApi',\n    value: function _deletePublicApi() {\n      var hot = this.hot;\n\n      delete hot.pauseObservingChanges;\n      delete hot.resumeObservingChanges;\n      delete hot.isPausedObservingChanges;\n    }\n  }]);\n\n  return ObserveChanges;\n}(_base2.default);\n\nexports.default = ObserveChanges;\n\n\n(0, _plugins.registerPlugin)('observeChanges', ObserveChanges);\n\n/***/ }),\n/* 352 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _jsonPatchDuplex = __webpack_require__(205);\n\nvar _jsonPatchDuplex2 = _interopRequireDefault(_jsonPatchDuplex);\n\nvar _localHooks = __webpack_require__(58);\n\nvar _localHooks2 = _interopRequireDefault(_localHooks);\n\nvar _object = __webpack_require__(2);\n\nvar _utils = __webpack_require__(353);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class DataObserver\n * @plugin ObserveChanges\n */\nvar DataObserver = function () {\n  function DataObserver(observedData) {\n    _classCallCheck(this, DataObserver);\n\n    /**\n     * Observed source data.\n     *\n     * @type {Array}\n     */\n    this.observedData = null;\n    /**\n     * JsonPatch observer.\n     *\n     * @type {Object}\n     */\n    this.observer = null;\n    /**\n     * Flag which determines if observer is paused or not. Paused observer doesn't emit `change` hooks.\n     *\n     * @type {Boolean}\n     * @default false\n     */\n    this.paused = false;\n\n    this.setObservedData(observedData);\n  }\n\n  /**\n   * Set data to observe.\n   *\n   * @param {*} observedData\n   */\n\n\n  _createClass(DataObserver, [{\n    key: 'setObservedData',\n    value: function setObservedData(observedData) {\n      var _this = this;\n\n      if (this.observer) {\n        _jsonPatchDuplex2.default.unobserve(this.observedData, this.observer);\n      }\n      this.observedData = observedData;\n      this.observer = _jsonPatchDuplex2.default.observe(this.observedData, function (patches) {\n        return _this.onChange(patches);\n      });\n    }\n\n    /**\n     * Check if observer was paused.\n     *\n     * @returns {Boolean}\n     */\n\n  }, {\n    key: 'isPaused',\n    value: function isPaused() {\n      return this.paused;\n    }\n\n    /**\n     * Pause observer (stop emitting all detected changes).\n     */\n\n  }, {\n    key: 'pause',\n    value: function pause() {\n      this.paused = true;\n    }\n\n    /**\n     * Resume observer (emit all detected changes).\n     */\n\n  }, {\n    key: 'resume',\n    value: function resume() {\n      this.paused = false;\n    }\n\n    /**\n     * JsonPatch on change listener.\n     *\n     * @private\n     * @param {Array} patches An array of object passed from jsonpatch.\n     */\n\n  }, {\n    key: 'onChange',\n    value: function onChange(patches) {\n      this.runLocalHooks('change', (0, _utils.cleanPatches)(patches));\n    }\n\n    /**\n     * Destroy observer instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _jsonPatchDuplex2.default.unobserve(this.observedData, this.observer);\n      this.observedData = null;\n      this.observer = null;\n    }\n  }]);\n\n  return DataObserver;\n}();\n\n(0, _object.mixin)(DataObserver, _localHooks2.default);\n\nexports.default = DataObserver;\n\n/***/ }),\n/* 353 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nexports.cleanPatches = cleanPatches;\nexports.parsePath = parsePath;\n\nvar _array = __webpack_require__(1);\n\n/**\n * Clean and extend patches from jsonpatch observer.\n *\n * @param {Array} patches\n * @returns {Array}\n */\nfunction cleanPatches(patches) {\n  var newOrRemovedColumns = [];\n\n  /**\n   * If observeChanges uses native Object.observe method, then it produces patches for length property. Filter them.\n   * If path can't be parsed. Filter it.\n   */\n  patches = (0, _array.arrayFilter)(patches, function (patch) {\n    if (/[/]length/ig.test(patch.path)) {\n      return false;\n    }\n    if (!parsePath(patch.path)) {\n      return false;\n    }\n\n    return true;\n  });\n  /**\n   * Extend patches with changed cells coords\n   */\n  patches = (0, _array.arrayMap)(patches, function (patch) {\n    var coords = parsePath(patch.path);\n\n    patch.row = coords.row;\n    patch.col = coords.col;\n\n    return patch;\n  });\n  /**\n   * Removing or adding column will produce one patch for each table row.\n   * Leaves only one patch for each column add/remove operation.\n   */\n  patches = (0, _array.arrayFilter)(patches, function (patch) {\n    if (['add', 'remove'].indexOf(patch.op) !== -1 && !isNaN(patch.col)) {\n      if (newOrRemovedColumns.indexOf(patch.col) !== -1) {\n        return false;\n      }\n      newOrRemovedColumns.push(patch.col);\n    }\n\n    return true;\n  });\n  newOrRemovedColumns.length = 0;\n\n  return patches;\n}\n\n/**\n * Extract coordinates from path where data was changed.\n *\n * @param {String} path Path describing where data was changed.\n * @returns {Object|null} Returns an object with `row` and `col` properties or `null` if path doesn't have necessary information.\n */\nfunction parsePath(path) {\n  var match = path.match(/^\\/(\\d+)\\/?(.*)?$/);\n\n  if (!match) {\n    return null;\n  }\n\n  var _match = _slicedToArray(match, 3),\n      row = _match[1],\n      column = _match[2];\n\n  return {\n    row: parseInt(row, 10),\n    col: /^\\d*$/.test(column) ? parseInt(column, 10) : column\n  };\n}\n\n/***/ }),\n/* 354 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _object = __webpack_require__(2);\n\nvar _number = __webpack_require__(5);\n\nvar _mixed = __webpack_require__(16);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar DEFAULT_SEARCH_RESULT_CLASS = 'htSearchResult';\n\nvar DEFAULT_CALLBACK = function DEFAULT_CALLBACK(instance, row, col, data, testResult) {\n  instance.getCellMeta(row, col).isSearchResult = testResult;\n};\n\nvar DEFAULT_QUERY_METHOD = function DEFAULT_QUERY_METHOD(query, value) {\n  if ((0, _mixed.isUndefined)(query) || query === null || !query.toLowerCase || query.length === 0) {\n    return false;\n  }\n  if ((0, _mixed.isUndefined)(value) || value === null) {\n    return false;\n  }\n\n  return value.toString().toLowerCase().indexOf(query.toLowerCase()) !== -1;\n};\n\n/**\n * @plugin Search\n *\n * @example\n *\n * ```js\n * ...\n *  // as boolean\n *  search: true\n *\n *  // as a object with one or more options\n *  search: {\n *    callback: myNewCallbackFunction,\n *    queryMethod: myNewQueryMethod,\n *    searchResultClass: 'customClass'\n *  }\n *\n * // Access to search plugin instance:\n * var searchPlugin = hot.getPlugin('search');\n *\n * // Set callback programmatically:\n * searchPlugin.setCallback(myNewCallbackFunction);\n * // Set query method programmatically:\n * searchPlugin.setQueryMethod(myNewQueryMethod);\n * // Set search result cells class programmatically:\n * searchPlugin.setSearchResultClass(customClass);\n * ...\n * ```\n */\n\nvar Search = function (_BasePlugin) {\n  _inherits(Search, _BasePlugin);\n\n  function Search(hotInstance) {\n    _classCallCheck(this, Search);\n\n    /**\n     * Function called during querying for each cell from the {@link DataMap}.\n     *\n     * @type {Function}\n     */\n    var _this = _possibleConstructorReturn(this, (Search.__proto__ || Object.getPrototypeOf(Search)).call(this, hotInstance));\n\n    _this.callback = DEFAULT_CALLBACK;\n    /**\n     * Query function is responsible for determining whether a query matches the value stored in a cell.\n     *\n     * @type {Function}\n     */\n    _this.queryMethod = DEFAULT_QUERY_METHOD;\n    /**\n     * Class name added to each cell that belongs to the searched query.\n     *\n     * @type {String}\n     */\n    _this.searchResultClass = DEFAULT_SEARCH_RESULT_CLASS;\n    return _this;\n  }\n\n  /**\n   * Check if the plugin is enabled in the Handsontable settings.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(Search, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return this.hot.getSettings().search;\n    }\n\n    /**\n     * Enable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      var searchSettings = this.hot.getSettings().search;\n      this.updatePluginSettings(searchSettings);\n\n      this.addHook('beforeRenderer', function () {\n        return _this2.onBeforeRenderer.apply(_this2, arguments);\n      });\n\n      _get(Search.prototype.__proto__ || Object.getPrototypeOf(Search.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      var _this3 = this;\n\n      var beforeRendererCallback = function beforeRendererCallback() {\n        return _this3.onBeforeRenderer.apply(_this3, arguments);\n      };\n\n      this.hot.addHook('beforeRenderer', beforeRendererCallback);\n      this.hot.addHookOnce('afterRender', function () {\n        _this3.hot.removeHook('beforeRenderer', beforeRendererCallback);\n      });\n\n      _get(Search.prototype.__proto__ || Object.getPrototypeOf(Search.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.disablePlugin();\n      this.enablePlugin();\n\n      _get(Search.prototype.__proto__ || Object.getPrototypeOf(Search.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Query method - used inside search input listener.\n     *\n     * @param {String} queryStr Searched value.\n     * @param {Function} [callback] Callback function performed on cells with values which matches to the searched query.\n     * @param {Function} [queryMethod] Query function responsible for determining whether a query matches the value stored in a cell.\n     *\n     * @returns {Array} Return array of objects with `row`, `col`, `data` properties or empty array.\n     */\n\n  }, {\n    key: 'query',\n    value: function query(queryStr) {\n      var _this4 = this;\n\n      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getCallback();\n      var queryMethod = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.getQueryMethod();\n\n      var rowCount = this.hot.countRows();\n      var colCount = this.hot.countCols();\n      var queryResult = [];\n      var instance = this.hot;\n\n      (0, _number.rangeEach)(0, rowCount - 1, function (rowIndex) {\n        (0, _number.rangeEach)(0, colCount - 1, function (colIndex) {\n          var cellData = _this4.hot.getDataAtCell(rowIndex, colIndex);\n          var cellProperties = _this4.hot.getCellMeta(rowIndex, colIndex);\n          var cellCallback = cellProperties.search.callback || callback;\n          var cellQueryMethod = cellProperties.search.queryMethod || queryMethod;\n          var testResult = cellQueryMethod(queryStr, cellData);\n\n          if (testResult) {\n            var singleResult = {\n              row: rowIndex,\n              col: colIndex,\n              data: cellData\n            };\n\n            queryResult.push(singleResult);\n          }\n\n          if (cellCallback) {\n            cellCallback(instance, rowIndex, colIndex, cellData, testResult);\n          }\n        });\n      });\n\n      return queryResult;\n    }\n  }, {\n    key: 'getCallback',\n\n\n    /**\n     * Get callback function.\n     *\n     * @returns {Function} Return the callback function.\n     */\n    value: function getCallback() {\n      return this.callback;\n    }\n\n    /**\n     * Set callback function.\n     *\n     * @param {Function} newCallback\n     */\n\n  }, {\n    key: 'setCallback',\n    value: function setCallback(newCallback) {\n      this.callback = newCallback;\n    }\n\n    /**\n     * Get queryMethod function.\n     *\n     * @returns {Function} Return the query method.\n     */\n\n  }, {\n    key: 'getQueryMethod',\n    value: function getQueryMethod() {\n      return this.queryMethod;\n    }\n\n    /**\n     * Set queryMethod function.\n     *\n     * @param {Function} newQueryMethod\n     */\n\n  }, {\n    key: 'setQueryMethod',\n    value: function setQueryMethod(newQueryMethod) {\n      this.queryMethod = newQueryMethod;\n    }\n\n    /**\n     * Get search result cells class.\n     *\n     * @returns {Function} Return the cell class.\n     */\n\n  }, {\n    key: 'getSearchResultClass',\n    value: function getSearchResultClass() {\n      return this.searchResultClass;\n    }\n\n    /**\n     * Set search result cells class.\n     *\n     * @param {String} newElementClass\n     */\n\n  }, {\n    key: 'setSearchResultClass',\n    value: function setSearchResultClass(newElementClass) {\n      this.searchResultClass = newElementClass;\n    }\n\n    /**\n     * Updates the settings of the plugin.\n     *\n     * @param {Object} searchSettings The plugin settings, taken from Handsontable configuration.\n     * @private\n     */\n\n  }, {\n    key: 'updatePluginSettings',\n    value: function updatePluginSettings(searchSettings) {\n      if ((0, _object.isObject)(searchSettings)) {\n        if (searchSettings.searchResultClass) {\n          this.setSearchResultClass(searchSettings.searchResultClass);\n        }\n\n        if (searchSettings.queryMethod) {\n          this.setQueryMethod(searchSettings.queryMethod);\n        }\n\n        if (searchSettings.callback) {\n          this.setCallback(searchSettings.callback);\n        }\n      }\n    }\n\n    /** *\n     * The `beforeRenderer` hook callback.\n     *\n     * @private\n     * @param {HTMLTableCellElement} TD The rendered `TD` element.\n     * @param {Number} row Visual row index.\n     * @param {Number} col Visual column index.\n     * @param {String | Number} prop Column property name or a column index, if datasource is an array of arrays.\n     * @param {String} value Value of the rendered cell.\n     * @param {Object} cellProperties Object containing the cell's properties.\n     */\n\n  }, {\n    key: 'onBeforeRenderer',\n    value: function onBeforeRenderer(TD, row, col, prop, value, cellProperties) {\n      // TODO: #4972\n      var className = cellProperties.className || [];\n      var classArray = [];\n\n      if (typeof className === 'string') {\n        classArray = className.split(' ');\n      } else {\n        var _classArray;\n\n        (_classArray = classArray).push.apply(_classArray, _toConsumableArray(className));\n      }\n\n      if (this.isEnabled() && cellProperties.isSearchResult) {\n        if (!classArray.includes(this.searchResultClass)) {\n          classArray.push('' + this.searchResultClass);\n        }\n      } else if (classArray.includes(this.searchResultClass)) {\n        classArray.splice(classArray.indexOf(this.searchResultClass), 1);\n      }\n\n      cellProperties.className = classArray.join(' ');\n    }\n\n    /**\n     * Destroy plugin instance.\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      _get(Search.prototype.__proto__ || Object.getPrototypeOf(Search.prototype), 'destroy', this).call(this);\n    }\n  }]);\n\n  return Search;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('search', Search);\n\nexports.default = Search;\n\n/***/ }),\n/* 355 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _element = __webpack_require__(0);\n\nvar _array = __webpack_require__(1);\n\nvar _base = __webpack_require__(10);\n\nvar _base2 = _interopRequireDefault(_base);\n\nvar _plugins = __webpack_require__(8);\n\nvar _feature = __webpack_require__(40);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * @private\n * @plugin TouchScroll\n * @class TouchScroll\n */\nvar TouchScroll = function (_BasePlugin) {\n  _inherits(TouchScroll, _BasePlugin);\n\n  function TouchScroll(hotInstance) {\n    _classCallCheck(this, TouchScroll);\n\n    /**\n     * Collection of scrollbars to update.\n     *\n     * @type {Array}\n     */\n    var _this = _possibleConstructorReturn(this, (TouchScroll.__proto__ || Object.getPrototypeOf(TouchScroll)).call(this, hotInstance));\n\n    _this.scrollbars = [];\n    /**\n     * Collection of overlays to update.\n     *\n     * @type {Array}\n     */\n    _this.clones = [];\n    /**\n     * Flag which determines if collection of overlays should be refilled on every table render.\n     *\n     * @type {Boolean}\n     * @default false\n     */\n    _this.lockedCollection = false;\n    /**\n     * Flag which determines if walkontable should freeze overlays while scrolling.\n     *\n     * @type {Boolean}\n     * @default false\n     */\n    _this.freezeOverlays = false;\n    return _this;\n  }\n\n  /**\n   * Check if plugin is enabled.\n   *\n   * @returns {Boolean}\n   */\n\n\n  _createClass(TouchScroll, [{\n    key: 'isEnabled',\n    value: function isEnabled() {\n      return (0, _feature.isTouchSupported)();\n    }\n\n    /**\n     * Enable the plugin.\n     */\n\n  }, {\n    key: 'enablePlugin',\n    value: function enablePlugin() {\n      var _this2 = this;\n\n      if (this.enabled) {\n        return;\n      }\n\n      this.addHook('afterRender', function () {\n        return _this2.onAfterRender();\n      });\n      this.registerEvents();\n\n      _get(TouchScroll.prototype.__proto__ || Object.getPrototypeOf(TouchScroll.prototype), 'enablePlugin', this).call(this);\n    }\n\n    /**\n     * Updates the plugin to use the latest options you have specified.\n     */\n\n  }, {\n    key: 'updatePlugin',\n    value: function updatePlugin() {\n      this.lockedCollection = false;\n\n      _get(TouchScroll.prototype.__proto__ || Object.getPrototypeOf(TouchScroll.prototype), 'updatePlugin', this).call(this);\n    }\n\n    /**\n     * Disable plugin for this Handsontable instance.\n     */\n\n  }, {\n    key: 'disablePlugin',\n    value: function disablePlugin() {\n      _get(TouchScroll.prototype.__proto__ || Object.getPrototypeOf(TouchScroll.prototype), 'disablePlugin', this).call(this);\n    }\n\n    /**\n     * Register all necessary events.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'registerEvents',\n    value: function registerEvents() {\n      var _this3 = this;\n\n      this.addHook('beforeTouchScroll', function () {\n        return _this3.onBeforeTouchScroll();\n      });\n      this.addHook('afterMomentumScroll', function () {\n        return _this3.onAfterMomentumScroll();\n      });\n    }\n\n    /**\n     * After render listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterRender',\n    value: function onAfterRender() {\n      if (this.lockedCollection) {\n        return;\n      }\n\n      var _hot$view$wt$wtOverla = this.hot.view.wt.wtOverlays,\n          topOverlay = _hot$view$wt$wtOverla.topOverlay,\n          bottomOverlay = _hot$view$wt$wtOverla.bottomOverlay,\n          leftOverlay = _hot$view$wt$wtOverla.leftOverlay,\n          topLeftCornerOverlay = _hot$view$wt$wtOverla.topLeftCornerOverlay,\n          bottomLeftCornerOverlay = _hot$view$wt$wtOverla.bottomLeftCornerOverlay;\n\n\n      this.lockedCollection = true;\n      this.scrollbars.length = 0;\n      this.scrollbars.push(topOverlay);\n\n      if (bottomOverlay.clone) {\n        this.scrollbars.push(bottomOverlay);\n      }\n      this.scrollbars.push(leftOverlay);\n\n      if (topLeftCornerOverlay) {\n        this.scrollbars.push(topLeftCornerOverlay);\n      }\n      if (bottomLeftCornerOverlay && bottomLeftCornerOverlay.clone) {\n        this.scrollbars.push(bottomLeftCornerOverlay);\n      }\n\n      this.clones.length = 0;\n\n      if (topOverlay.needFullRender) {\n        this.clones.push(topOverlay.clone.wtTable.holder.parentNode);\n      }\n      if (bottomOverlay.needFullRender) {\n        this.clones.push(bottomOverlay.clone.wtTable.holder.parentNode);\n      }\n      if (leftOverlay.needFullRender) {\n        this.clones.push(leftOverlay.clone.wtTable.holder.parentNode);\n      }\n      if (topLeftCornerOverlay) {\n        this.clones.push(topLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      }\n      if (bottomLeftCornerOverlay && bottomLeftCornerOverlay.clone) {\n        this.clones.push(bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);\n      }\n    }\n\n    /**\n     * Touch scroll listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onBeforeTouchScroll',\n    value: function onBeforeTouchScroll() {\n      this.freezeOverlays = true;\n\n      (0, _array.arrayEach)(this.clones, function (clone) {\n        (0, _element.addClass)(clone, 'hide-tween');\n      });\n    }\n\n    /**\n     * After momentum scroll listener.\n     *\n     * @private\n     */\n\n  }, {\n    key: 'onAfterMomentumScroll',\n    value: function onAfterMomentumScroll() {\n      var _this4 = this;\n\n      this.freezeOverlays = false;\n\n      (0, _array.arrayEach)(this.clones, function (clone) {\n        (0, _element.removeClass)(clone, 'hide-tween');\n        (0, _element.addClass)(clone, 'show-tween');\n      });\n\n      setTimeout(function () {\n        (0, _array.arrayEach)(_this4.clones, function (clone) {\n          (0, _element.removeClass)(clone, 'show-tween');\n        });\n      }, 400);\n\n      (0, _array.arrayEach)(this.scrollbars, function (scrollbar) {\n        scrollbar.refresh();\n        scrollbar.resetFixedPosition();\n      });\n\n      this.hot.view.wt.wtOverlays.syncScrollWithMaster();\n    }\n  }]);\n\n  return TouchScroll;\n}(_base2.default);\n\n(0, _plugins.registerPlugin)('touchScroll', TouchScroll);\n\nexports.default = TouchScroll;\n\n/***/ }),\n/* 356 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _pluginHooks = __webpack_require__(15);\n\nvar _pluginHooks2 = _interopRequireDefault(_pluginHooks);\n\nvar _array = __webpack_require__(1);\n\nvar _number = __webpack_require__(5);\n\nvar _object = __webpack_require__(2);\n\nvar _event = __webpack_require__(12);\n\nvar _src = __webpack_require__(4);\n\nvar _utils = __webpack_require__(19);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /**\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * Handsontable UndoRedo class\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                */\n\n\n/**\n * @description\n * Handsontable UndoRedo plugin. It allows to undo and redo certain actions done in the table.\n * Please note, that not all actions are currently undo-able.\n *\n * @example\n * ```js\n * ...\n * undo: true\n * ...\n * ```\n * @class UndoRedo\n * @plugin UndoRedo\n */\nfunction UndoRedo(instance) {\n  var plugin = this;\n  this.instance = instance;\n  this.doneActions = [];\n  this.undoneActions = [];\n  this.ignoreNewActions = false;\n\n  instance.addHook('afterChange', function (changes, source) {\n    if (changes && source !== 'UndoRedo.undo' && source !== 'UndoRedo.redo' && source !== 'MergeCells') {\n      plugin.done(new UndoRedo.ChangeAction(changes));\n    }\n  });\n\n  instance.addHook('afterCreateRow', function (index, amount, source) {\n    if (source === 'UndoRedo.undo' || source === 'UndoRedo.undo' || source === 'auto') {\n      return;\n    }\n\n    var action = new UndoRedo.CreateRowAction(index, amount);\n    plugin.done(action);\n  });\n\n  instance.addHook('beforeRemoveRow', function (index, amount, logicRows, source) {\n    if (source === 'UndoRedo.undo' || source === 'UndoRedo.redo' || source === 'auto') {\n      return;\n    }\n\n    var originalData = plugin.instance.getSourceDataArray();\n\n    index = (originalData.length + index) % originalData.length;\n\n    var removedData = (0, _object.deepClone)(originalData.slice(index, index + amount));\n\n    plugin.done(new UndoRedo.RemoveRowAction(index, removedData));\n  });\n\n  instance.addHook('afterCreateCol', function (index, amount, source) {\n    if (source === 'UndoRedo.undo' || source === 'UndoRedo.redo' || source === 'auto') {\n      return;\n    }\n\n    plugin.done(new UndoRedo.CreateColumnAction(index, amount));\n  });\n\n  instance.addHook('beforeRemoveCol', function (index, amount, logicColumns, source) {\n    if (source === 'UndoRedo.undo' || source === 'UndoRedo.redo' || source === 'auto') {\n      return;\n    }\n\n    var originalData = plugin.instance.getSourceDataArray();\n\n    index = (plugin.instance.countCols() + index) % plugin.instance.countCols();\n\n    var removedData = [];\n    var headers = [];\n    var indexes = [];\n\n    (0, _number.rangeEach)(originalData.length - 1, function (i) {\n      var column = [];\n      var origRow = originalData[i];\n\n      (0, _number.rangeEach)(index, index + (amount - 1), function (j) {\n        column.push(origRow[instance.runHooks('modifyCol', j)]);\n      });\n      removedData.push(column);\n    });\n\n    (0, _number.rangeEach)(amount - 1, function (i) {\n      indexes.push(instance.runHooks('modifyCol', index + i));\n    });\n\n    if (Array.isArray(instance.getSettings().colHeaders)) {\n      (0, _number.rangeEach)(amount - 1, function (i) {\n        headers.push(instance.getSettings().colHeaders[instance.runHooks('modifyCol', index + i)] || null);\n      });\n    }\n\n    var manualColumnMovePlugin = plugin.instance.getPlugin('manualColumnMove');\n\n    var columnsMap = manualColumnMovePlugin.isEnabled() ? manualColumnMovePlugin.columnsMapper.__arrayMap : [];\n    var action = new UndoRedo.RemoveColumnAction(index, indexes, removedData, headers, columnsMap);\n\n    plugin.done(action);\n  });\n\n  instance.addHook('beforeCellAlignment', function (stateBefore, range, type, alignment) {\n    var action = new UndoRedo.CellAlignmentAction(stateBefore, range, type, alignment);\n    plugin.done(action);\n  });\n\n  instance.addHook('beforeFilter', function (conditionsStack) {\n    plugin.done(new UndoRedo.FiltersAction(conditionsStack));\n  });\n\n  instance.addHook('beforeRowMove', function (movedRows, target) {\n    if (movedRows === false) {\n      return;\n    }\n\n    plugin.done(new UndoRedo.RowMoveAction(movedRows, target));\n  });\n\n  instance.addHook('beforeMergeCells', function (cellRange, auto) {\n    if (auto) {\n      return;\n    }\n\n    plugin.done(new UndoRedo.MergeCellsAction(instance, cellRange));\n  });\n\n  instance.addHook('afterUnmergeCells', function (cellRange, auto) {\n    if (auto) {\n      return;\n    }\n\n    plugin.done(new UndoRedo.UnmergeCellsAction(instance, cellRange));\n  });\n}\n\nUndoRedo.prototype.done = function (action) {\n  if (!this.ignoreNewActions) {\n    this.doneActions.push(action);\n    this.undoneActions.length = 0;\n  }\n};\n\n/**\n * Undo last edit.\n *\n * @function undo\n * @memberof UndoRedo#\n */\nUndoRedo.prototype.undo = function () {\n  if (this.isUndoAvailable()) {\n    var action = this.doneActions.pop();\n    var actionClone = (0, _object.deepClone)(action);\n    var instance = this.instance;\n\n    var continueAction = instance.runHooks('beforeUndo', actionClone);\n\n    if (continueAction === false) {\n      return;\n    }\n\n    this.ignoreNewActions = true;\n    var that = this;\n    action.undo(this.instance, function () {\n      that.ignoreNewActions = false;\n      that.undoneActions.push(action);\n    });\n\n    instance.runHooks('afterUndo', actionClone);\n  }\n};\n\n/**\n * Redo edit (used to reverse an undo).\n *\n * @function redo\n * @memberof UndoRedo#\n */\nUndoRedo.prototype.redo = function () {\n  if (this.isRedoAvailable()) {\n    var action = this.undoneActions.pop();\n    var actionClone = (0, _object.deepClone)(action);\n    var instance = this.instance;\n\n    var continueAction = instance.runHooks('beforeRedo', actionClone);\n\n    if (continueAction === false) {\n      return;\n    }\n\n    this.ignoreNewActions = true;\n    var that = this;\n    action.redo(this.instance, function () {\n      that.ignoreNewActions = false;\n      that.doneActions.push(action);\n    });\n\n    instance.runHooks('afterRedo', actionClone);\n  }\n};\n\n/**\n * Check if undo action is available.\n *\n * @function isUndoAvailable\n * @memberof UndoRedo#\n * @return {Boolean} Return `true` if undo can be performed, `false` otherwise\n */\nUndoRedo.prototype.isUndoAvailable = function () {\n  return this.doneActions.length > 0;\n};\n\n/**\n * Check if redo action is available.\n *\n * @function isRedoAvailable\n * @memberof UndoRedo#\n * @return {Boolean} Return `true` if redo can be performed, `false` otherwise.\n */\nUndoRedo.prototype.isRedoAvailable = function () {\n  return this.undoneActions.length > 0;\n};\n\n/**\n * Clears undo history.\n *\n * @function clear\n * @memberof UndoRedo#\n */\nUndoRedo.prototype.clear = function () {\n  this.doneActions.length = 0;\n  this.undoneActions.length = 0;\n};\n\nUndoRedo.Action = function () {};\nUndoRedo.Action.prototype.undo = function () {};\nUndoRedo.Action.prototype.redo = function () {};\n\n/**\n * Change action.\n */\nUndoRedo.ChangeAction = function (changes) {\n  this.changes = changes;\n  this.actionType = 'change';\n};\n(0, _object.inherit)(UndoRedo.ChangeAction, UndoRedo.Action);\n\nUndoRedo.ChangeAction.prototype.undo = function (instance, undoneCallback) {\n  var data = (0, _object.deepClone)(this.changes),\n      emptyRowsAtTheEnd = instance.countEmptyRows(true),\n      emptyColsAtTheEnd = instance.countEmptyCols(true);\n\n  for (var i = 0, len = data.length; i < len; i++) {\n    data[i].splice(3, 1);\n  }\n\n  instance.addHookOnce('afterChange', undoneCallback);\n\n  instance.setDataAtRowProp(data, null, null, 'UndoRedo.undo');\n\n  for (var _i = 0, _len = data.length; _i < _len; _i++) {\n    if (instance.getSettings().minSpareRows && data[_i][0] + 1 + instance.getSettings().minSpareRows === instance.countRows() && emptyRowsAtTheEnd === instance.getSettings().minSpareRows) {\n\n      instance.alter('remove_row', parseInt(data[_i][0] + 1, 10), instance.getSettings().minSpareRows);\n      instance.undoRedo.doneActions.pop();\n    }\n\n    if (instance.getSettings().minSpareCols && data[_i][1] + 1 + instance.getSettings().minSpareCols === instance.countCols() && emptyColsAtTheEnd === instance.getSettings().minSpareCols) {\n\n      instance.alter('remove_col', parseInt(data[_i][1] + 1, 10), instance.getSettings().minSpareCols);\n      instance.undoRedo.doneActions.pop();\n    }\n  }\n};\nUndoRedo.ChangeAction.prototype.redo = function (instance, onFinishCallback) {\n  var data = (0, _object.deepClone)(this.changes);\n\n  for (var i = 0, len = data.length; i < len; i++) {\n    data[i].splice(2, 1);\n  }\n\n  instance.addHookOnce('afterChange', onFinishCallback);\n  instance.setDataAtRowProp(data, null, null, 'UndoRedo.redo');\n};\n\n/**\n * Create row action.\n */\nUndoRedo.CreateRowAction = function (index, amount) {\n  this.index = index;\n  this.amount = amount;\n  this.actionType = 'insert_row';\n};\n(0, _object.inherit)(UndoRedo.CreateRowAction, UndoRedo.Action);\n\nUndoRedo.CreateRowAction.prototype.undo = function (instance, undoneCallback) {\n  var rowCount = instance.countRows(),\n      minSpareRows = instance.getSettings().minSpareRows;\n\n  if (this.index >= rowCount && this.index - minSpareRows < rowCount) {\n    this.index -= minSpareRows; // work around the situation where the needed row was removed due to an 'undo' of a made change\n  }\n\n  instance.addHookOnce('afterRemoveRow', undoneCallback);\n  instance.alter('remove_row', this.index, this.amount, 'UndoRedo.undo');\n};\nUndoRedo.CreateRowAction.prototype.redo = function (instance, redoneCallback) {\n  instance.addHookOnce('afterCreateRow', redoneCallback);\n  instance.alter('insert_row', this.index, this.amount, 'UndoRedo.redo');\n};\n\n/**\n * Remove row action.\n */\nUndoRedo.RemoveRowAction = function (index, data) {\n  this.index = index;\n  this.data = data;\n  this.actionType = 'remove_row';\n};\n(0, _object.inherit)(UndoRedo.RemoveRowAction, UndoRedo.Action);\n\nUndoRedo.RemoveRowAction.prototype.undo = function (instance, undoneCallback) {\n  instance.alter('insert_row', this.index, this.data.length, 'UndoRedo.undo');\n  instance.addHookOnce('afterRender', undoneCallback);\n  instance.populateFromArray(this.index, 0, this.data, void 0, void 0, 'UndoRedo.undo');\n};\nUndoRedo.RemoveRowAction.prototype.redo = function (instance, redoneCallback) {\n  instance.addHookOnce('afterRemoveRow', redoneCallback);\n  instance.alter('remove_row', this.index, this.data.length, 'UndoRedo.redo');\n};\n\n/**\n * Create column action.\n */\nUndoRedo.CreateColumnAction = function (index, amount) {\n  this.index = index;\n  this.amount = amount;\n  this.actionType = 'insert_col';\n};\n(0, _object.inherit)(UndoRedo.CreateColumnAction, UndoRedo.Action);\n\nUndoRedo.CreateColumnAction.prototype.undo = function (instance, undoneCallback) {\n  instance.addHookOnce('afterRemoveCol', undoneCallback);\n  instance.alter('remove_col', this.index, this.amount, 'UndoRedo.undo');\n};\nUndoRedo.CreateColumnAction.prototype.redo = function (instance, redoneCallback) {\n  instance.addHookOnce('afterCreateCol', redoneCallback);\n  instance.alter('insert_col', this.index, this.amount, 'UndoRedo.redo');\n};\n\n/**\n * Remove column action.\n */\nUndoRedo.RemoveColumnAction = function (index, indexes, data, headers, columnPositions) {\n  this.index = index;\n  this.indexes = indexes;\n  this.data = data;\n  this.amount = this.data[0].length;\n  this.headers = headers;\n  this.columnPositions = columnPositions.slice(0);\n  this.actionType = 'remove_col';\n};\n(0, _object.inherit)(UndoRedo.RemoveColumnAction, UndoRedo.Action);\n\nUndoRedo.RemoveColumnAction.prototype.undo = function (instance, undoneCallback) {\n  var _this = this;\n\n  var row = void 0;\n  var ascendingIndexes = this.indexes.slice(0).sort();\n  var sortByIndexes = function sortByIndexes(elem, j, arr) {\n    return arr[_this.indexes.indexOf(ascendingIndexes[j])];\n  };\n\n  var sortedData = [];\n  (0, _number.rangeEach)(this.data.length - 1, function (i) {\n    sortedData[i] = (0, _array.arrayMap)(_this.data[i], sortByIndexes);\n  });\n\n  var sortedHeaders = [];\n  sortedHeaders = (0, _array.arrayMap)(this.headers, sortByIndexes);\n\n  var changes = [];\n\n  // TODO: Temporary hook for undo/redo mess\n  instance.runHooks('beforeCreateCol', this.indexes[0], this.indexes.length, 'UndoRedo.undo');\n\n  (0, _number.rangeEach)(this.data.length - 1, function (i) {\n    row = instance.getSourceDataAtRow(i);\n\n    (0, _number.rangeEach)(ascendingIndexes.length - 1, function (j) {\n      row.splice(ascendingIndexes[j], 0, sortedData[i][j]);\n      changes.push([i, ascendingIndexes[j], null, sortedData[i][j]]);\n    });\n  });\n\n  // TODO: Temporary hook for undo/redo mess\n  if (instance.getPlugin('formulas')) {\n    instance.getPlugin('formulas').onAfterSetDataAtCell(changes);\n  }\n\n  if (typeof this.headers !== 'undefined') {\n    (0, _number.rangeEach)(sortedHeaders.length - 1, function (j) {\n      instance.getSettings().colHeaders.splice(ascendingIndexes[j], 0, sortedHeaders[j]);\n    });\n  }\n\n  if (instance.getPlugin('manualColumnMove')) {\n    instance.getPlugin('manualColumnMove').columnsMapper.__arrayMap = this.columnPositions;\n  }\n\n  instance.addHookOnce('afterRender', undoneCallback);\n\n  // TODO: Temporary hook for undo/redo mess\n  instance.runHooks('afterCreateCol', this.indexes[0], this.indexes.length, 'UndoRedo.undo');\n\n  if (instance.getPlugin('formulas')) {\n    instance.getPlugin('formulas').recalculateFull();\n  }\n\n  instance.render();\n};\n\nUndoRedo.RemoveColumnAction.prototype.redo = function (instance, redoneCallback) {\n  instance.addHookOnce('afterRemoveCol', redoneCallback);\n  instance.alter('remove_col', this.index, this.amount, 'UndoRedo.redo');\n};\n\n/**\n * Cell alignment action.\n */\nUndoRedo.CellAlignmentAction = function (stateBefore, range, type, alignment) {\n  this.stateBefore = stateBefore;\n  this.range = range;\n  this.type = type;\n  this.alignment = alignment;\n};\nUndoRedo.CellAlignmentAction.prototype.undo = function (instance, undoneCallback) {\n  var _this2 = this;\n\n  (0, _array.arrayEach)(this.range, function (_ref) {\n    var from = _ref.from,\n        to = _ref.to;\n\n    for (var row = from.row; row <= to.row; row += 1) {\n      for (var col = from.col; col <= to.col; col += 1) {\n        instance.setCellMeta(row, col, 'className', _this2.stateBefore[row][col] || ' htLeft');\n      }\n    }\n  });\n\n  instance.addHookOnce('afterRender', undoneCallback);\n  instance.render();\n};\nUndoRedo.CellAlignmentAction.prototype.redo = function (instance, undoneCallback) {\n  (0, _utils.align)(this.range, this.type, this.alignment, function (row, col) {\n    return instance.getCellMeta(row, col);\n  }, function (row, col, key, value) {\n    return instance.setCellMeta(row, col, key, value);\n  });\n\n  instance.addHookOnce('afterRender', undoneCallback);\n  instance.render();\n};\n\n/**\n * Filters action.\n */\nUndoRedo.FiltersAction = function (conditionsStack) {\n  this.conditionsStack = conditionsStack;\n  this.actionType = 'filter';\n};\n(0, _object.inherit)(UndoRedo.FiltersAction, UndoRedo.Action);\n\nUndoRedo.FiltersAction.prototype.undo = function (instance, undoneCallback) {\n  var filters = instance.getPlugin('filters');\n\n  instance.addHookOnce('afterRender', undoneCallback);\n\n  filters.conditionCollection.importAllConditions(this.conditionsStack.slice(0, this.conditionsStack.length - 1));\n  filters.filter();\n};\nUndoRedo.FiltersAction.prototype.redo = function (instance, redoneCallback) {\n  var filters = instance.getPlugin('filters');\n\n  instance.addHookOnce('afterRender', redoneCallback);\n\n  filters.conditionCollection.importAllConditions(this.conditionsStack);\n  filters.filter();\n};\n\n/**\n * Merge Cells action.\n * @util\n */\n\nvar MergeCellsAction = function (_UndoRedo$Action) {\n  _inherits(MergeCellsAction, _UndoRedo$Action);\n\n  function MergeCellsAction(instance, cellRange) {\n    _classCallCheck(this, MergeCellsAction);\n\n    var _this3 = _possibleConstructorReturn(this, (MergeCellsAction.__proto__ || Object.getPrototypeOf(MergeCellsAction)).call(this));\n\n    _this3.cellRange = cellRange;\n    _this3.rangeData = instance.getData(cellRange.from.row, cellRange.from.col, cellRange.to.row, cellRange.to.col);\n    return _this3;\n  }\n\n  _createClass(MergeCellsAction, [{\n    key: 'undo',\n    value: function undo(instance, undoneCallback) {\n      var mergeCellsPlugin = instance.getPlugin('mergeCells');\n      instance.addHookOnce('afterRender', undoneCallback);\n\n      mergeCellsPlugin.unmergeRange(this.cellRange, true);\n      instance.populateFromArray(this.cellRange.from.row, this.cellRange.from.col, this.rangeData, void 0, void 0, 'MergeCells');\n    }\n  }, {\n    key: 'redo',\n    value: function redo(instance, redoneCallback) {\n      var mergeCellsPlugin = instance.getPlugin('mergeCells');\n      instance.addHookOnce('afterRender', redoneCallback);\n\n      mergeCellsPlugin.mergeRange(this.cellRange);\n    }\n  }]);\n\n  return MergeCellsAction;\n}(UndoRedo.Action);\n\nUndoRedo.MergeCellsAction = MergeCellsAction;\n\n/**\n * Unmerge Cells action.\n * @util\n */\n\nvar UnmergeCellsAction = function (_UndoRedo$Action2) {\n  _inherits(UnmergeCellsAction, _UndoRedo$Action2);\n\n  function UnmergeCellsAction(instance, cellRange) {\n    _classCallCheck(this, UnmergeCellsAction);\n\n    var _this4 = _possibleConstructorReturn(this, (UnmergeCellsAction.__proto__ || Object.getPrototypeOf(UnmergeCellsAction)).call(this));\n\n    _this4.cellRange = cellRange;\n    return _this4;\n  }\n\n  _createClass(UnmergeCellsAction, [{\n    key: 'undo',\n    value: function undo(instance, undoneCallback) {\n      var mergeCellsPlugin = instance.getPlugin('mergeCells');\n      instance.addHookOnce('afterRender', undoneCallback);\n\n      mergeCellsPlugin.mergeRange(this.cellRange, true);\n    }\n  }, {\n    key: 'redo',\n    value: function redo(instance, redoneCallback) {\n      var mergeCellsPlugin = instance.getPlugin('mergeCells');\n      instance.addHookOnce('afterRender', redoneCallback);\n\n      mergeCellsPlugin.unmergeRange(this.cellRange, true);\n      instance.render();\n    }\n  }]);\n\n  return UnmergeCellsAction;\n}(UndoRedo.Action);\n\nUndoRedo.UnmergeCellsAction = UnmergeCellsAction;\n\n/**\n * ManualRowMove action.\n * @TODO: removeRow undo should works on logical index\n */\nUndoRedo.RowMoveAction = function (movedRows, target) {\n  this.rows = movedRows.slice();\n  this.target = target;\n};\n(0, _object.inherit)(UndoRedo.RowMoveAction, UndoRedo.Action);\n\nUndoRedo.RowMoveAction.prototype.undo = function (instance, undoneCallback) {\n  var manualRowMove = instance.getPlugin('manualRowMove');\n\n  instance.addHookOnce('afterRender', undoneCallback);\n\n  var mod = this.rows[0] < this.target ? -1 * this.rows.length : 0;\n  var newTarget = this.rows[0] > this.target ? this.rows[0] + this.rows.length : this.rows[0];\n  var newRows = [];\n  var rowsLen = this.rows.length + mod;\n\n  for (var i = mod; i < rowsLen; i += 1) {\n    newRows.push(this.target + i);\n  }\n\n  manualRowMove.moveRows(newRows.slice(), newTarget);\n  instance.render();\n\n  instance.selectCell(this.rows[0], 0, this.rows[this.rows.length - 1], instance.countCols() - 1, false, false);\n};\nUndoRedo.RowMoveAction.prototype.redo = function (instance, redoneCallback) {\n  var manualRowMove = instance.getPlugin('manualRowMove');\n\n  instance.addHookOnce('afterRender', redoneCallback);\n  manualRowMove.moveRows(this.rows.slice(), this.target);\n  instance.render();\n  var startSelection = this.rows[0] < this.target ? this.target - this.rows.length : this.target;\n\n  instance.selectCell(startSelection, 0, startSelection + this.rows.length - 1, instance.countCols() - 1, false, false);\n};\n\nfunction init() {\n  var instance = this;\n  var pluginEnabled = typeof instance.getSettings().undo == 'undefined' || instance.getSettings().undo;\n\n  if (pluginEnabled) {\n    if (!instance.undoRedo) {\n      /**\n       * Instance of Handsontable.UndoRedo Plugin {@link Handsontable.UndoRedo}\n       *\n       * @alias undoRedo\n       * @memberof! Handsontable.Core#\n       * @type {UndoRedo}\n       */\n      instance.undoRedo = new UndoRedo(instance);\n\n      exposeUndoRedoMethods(instance);\n\n      instance.addHook('beforeKeyDown', onBeforeKeyDown);\n      instance.addHook('afterChange', onAfterChange);\n    }\n  } else if (instance.undoRedo) {\n    delete instance.undoRedo;\n\n    removeExposedUndoRedoMethods(instance);\n\n    instance.removeHook('beforeKeyDown', onBeforeKeyDown);\n    instance.removeHook('afterChange', onAfterChange);\n  }\n}\n\nfunction onBeforeKeyDown(event) {\n  var instance = this;\n\n  var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey;\n\n  if (ctrlDown) {\n    if (event.keyCode === 89 || event.shiftKey && event.keyCode === 90) {\n      // CTRL + Y or CTRL + SHIFT + Z\n      instance.undoRedo.redo();\n      (0, _event.stopImmediatePropagation)(event);\n    } else if (event.keyCode === 90) {\n      // CTRL + Z\n      instance.undoRedo.undo();\n      (0, _event.stopImmediatePropagation)(event);\n    }\n  }\n}\n\nfunction onAfterChange(changes, source) {\n  var instance = this;\n  if (source === 'loadData') {\n    return instance.undoRedo.clear();\n  }\n}\n\nfunction exposeUndoRedoMethods(instance) {\n  /**\n   * {@link UndoRedo#undo}\n   * @alias undo\n   * @memberof! Handsontable.Core#\n   */\n  instance.undo = function () {\n    return instance.undoRedo.undo();\n  };\n\n  /**\n   * {@link UndoRedo#redo}\n   * @alias redo\n   * @memberof! Handsontable.Core#\n   */\n  instance.redo = function () {\n    return instance.undoRedo.redo();\n  };\n\n  /**\n   * {@link UndoRedo#isUndoAvailable}\n   * @alias isUndoAvailable\n   * @memberof! Handsontable.Core#\n   */\n  instance.isUndoAvailable = function () {\n    return instance.undoRedo.isUndoAvailable();\n  };\n\n  /**\n   * {@link UndoRedo#isRedoAvailable}\n   * @alias isRedoAvailable\n   * @memberof! Handsontable.Core#\n   */\n  instance.isRedoAvailable = function () {\n    return instance.undoRedo.isRedoAvailable();\n  };\n\n  /**\n   * {@link UndoRedo#clear}\n   * @alias clearUndo\n   * @memberof! Handsontable.Core#\n   */\n  instance.clearUndo = function () {\n    return instance.undoRedo.clear();\n  };\n}\n\nfunction removeExposedUndoRedoMethods(instance) {\n  delete instance.undo;\n  delete instance.redo;\n  delete instance.isUndoAvailable;\n  delete instance.isRedoAvailable;\n  delete instance.clearUndo;\n}\n\nvar hook = _pluginHooks2.default.getSingleton();\n\nhook.add('afterInit', init);\nhook.add('afterUpdateSettings', init);\n\nhook.register('beforeUndo');\nhook.register('afterUndo');\nhook.register('beforeRedo');\nhook.register('afterRedo');\n\nexports.default = UndoRedo;\n\n/***/ })\n/******/ ])[\"default\"];\n});\n//# sourceMappingURL=handsontable.js.map"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/dist/languages/all.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 8);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Switzerland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-CH'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Grösser als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Grösser gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Ausserhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Germany language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-DE'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Größer als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Größer gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Außerhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 15, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for English - United States language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'en-US'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Insert row above'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Insert row below'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Insert column left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Insert column right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Remove row', 'Remove rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Remove column', 'Remove columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Undo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Redo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Read only'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Clear column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alignment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Center'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justify'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Middle'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Freeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Unfreeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Borders'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Remove border(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Add comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edit comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Delete comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Read-only comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Merge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Unmerge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copy'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Cut'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Insert child row'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Detach from parent'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Hide column', 'Hide columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Show column', 'Show columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Hide row', 'Hide rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Show row', 'Show rows']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'None'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Is empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Is not empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Is equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Is not equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Begins with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Ends with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contains'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Does not contain'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Greater than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Greater than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Less than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Less than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Is between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Is not between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'After'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Before'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Today'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Tomorrow'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Yesterday'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Blank cells'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filter by condition'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filter by value'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'And'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Or'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Select all'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Clear'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancel'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Search'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Value'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Second value'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: hand-dot\n                                                                                                                                                                                                                   * Last updated: Jan 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Japanese - Japan language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ja-JP'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, '行を上に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, '行を下に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, '列を左に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, '列を右に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['行を削除', '行を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['列を削除', '列を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, '元に戻す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'やり直し'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, '読み取り専用'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, '列をクリア'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, '配置'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, '左揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, '中央揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, '右揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, '両端揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, '上揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, '中央揃え(垂直)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, '下揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, '列を固定'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, '列の固定を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, '枠線'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, '上'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, '右'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, '下'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, '左'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, '枠線を削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'コメントを追加'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'コメントを編集'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'コメントを削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, '読み取り専用コメント'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'セルを結合'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'セルの結合を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'コピー'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, '切り取り'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, '子の行を挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, '親の行と切り離す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['列を非表示', '列を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['列を表示', '列を表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['行を非表示', '行を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['行を表示', '行を表示']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'なし'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, '空白'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, '空白ではない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, '次と等しい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, '次と等しくない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, '次で始まる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, '次で終わる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, '次を含む'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, '次を含まない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, '次より大きい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, '以上'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, '次より小さい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, '以下'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, '次の間にある'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, '次の間にない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, '次より後の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, '次より前の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, '今日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, '明日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, '昨日'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, '空白のセル'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, '条件でフィルタ'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, '値でフィルタ'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'かつ'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'もしくは'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'すべて選択'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'クリア'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'キャンセル'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, '検索'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, '値'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, '値2'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 17, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Polish - Poland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pl-PL'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Wstaw wiersz powyżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Wstaw wiersz poniżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Wstaw kolumnę z lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Wstaw kolumnę z prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Usuń wiersz', 'Usuń wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Usuń kolumnę', 'Usuń kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Cofnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Ponów'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Wyczyść kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Wyrównanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Do lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Do środka'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Do prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Wyjustuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Do góry'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Wyśrodkuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Do dołu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Zablokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Odblokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Obramowanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Krawędź górna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Krawędź prawa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Krawędź dolna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Krawędź lewa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Usuń obramowanie(a)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Dodaj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edytuj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Usuń komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Komentarz tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Scal komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Rozdziel komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopiuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Wytnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Wstaw wiersz podrzędny'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Odłącz od nadrzędnego'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ukryj kolumnę', 'Ukryj kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Pokaż kolumnę', 'Pokaż kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ukryj wiersz', 'Ukryj wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Pokaż wiersz', 'Pokaż wiersze']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Brak'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Komórka jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Komórka nie jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Jest równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Jest różne od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Tekst zaczyna się od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Tekst kończy się na'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Tekst zawiera fragment'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Tekst nie zawiera fragmentu'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Większe niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Większe lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Mniejsze niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Mniejsze lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Nie jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Data późniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Data wcześniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Dzisiaj'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Jutro'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Wczoraj'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Puste miejsca'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtruj wg warunku'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtruj wg wartości'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Oraz'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Lub'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Zaznacz wszystko'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Wyczyść'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Anuluj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Szukaj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wartość'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Druga wartość'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Júlio C. Zuppa\n                                                                                                                                                                                                                   * Last updated: Jan 12, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Portuguese - Brazil language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pt-BR'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Inserir linha acima'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Inserir linha abaixo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Inserir coluna esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Inserir coluna direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Excluir linha', 'Excluir linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Excluir coluna', 'Excluir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Desfazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Refazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Limpar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alinhamento'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Centralizado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justificado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Meio'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Congelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Descongelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Bordas'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Excluir bordas(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Incluir comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Editar comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Remover comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Comentário somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Mesclar células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Desfazer mesclagem de células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copiar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Recortar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Inserir linha filha'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Desanexar da linha pai'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ocultar coluna', 'Ocultar colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Exibir coluna', 'Exibir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ocultar linha', 'Ocultar linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Exibir linha', 'Exibir linhas']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Nenhum'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'É vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Não é vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'É igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'É diferente de'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Começa com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Termina com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Não contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Maior que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Menor que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Não está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Depois'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Antes'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Hoje'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Amanhã'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Ontem'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Células vazias'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtrar por condição'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtrar por valor'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'E'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Ou'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Selecionar tudo'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Limpar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancelar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Localizar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Valor'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Segundo valor'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Alexey Rogachev\n                                                                                                                                                                                                                   * Last updated: Feb 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Russian - Russia language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ru-RU'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Вставить строку выше'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Вставить строку ниже'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Вставить столбец слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Вставить столбец справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Удалить строку', 'Удалить строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Удалить столбец', 'Удалить столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Отменить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Повторить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Очистить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Выравнивание'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'По левому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'По правому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'По ширине'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'По верхнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'По нижнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Закрепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Открепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Границы'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Сверху'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Снизу'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Удалить границу(ы)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Добавить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Редактировать комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Удалить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Комментарий только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Объединить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Разделить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Копировать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Вырезать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Вставить дочернюю строку'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Отделить от родителя'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Скрыть столбец', 'Скрыть столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Показать столбец', 'Показать столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Скрыть строку', 'Скрыть строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Показать строку', 'Показать строки']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Отсутствует'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Не пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Не равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Начинается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Заканчивается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Не содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Больше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Больше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Меньше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Меньше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Не между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'После'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'До'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Сегодня'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Завтра'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Вчера'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Пустые ячейки'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Фильтр по условию'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Фильтр по значению'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'И'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Или'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Выбрать все'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Убрать'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Отмена'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Поиск'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Значение'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Второе значение'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.ruRU = exports.ptBR = exports.plPL = exports.jaJP = exports.enUS = exports.deDE = exports.deCH = undefined;\n\nvar _deCH = __webpack_require__(1);\n\nvar _deCH2 = _interopRequireDefault(_deCH);\n\nvar _deDE = __webpack_require__(2);\n\nvar _deDE2 = _interopRequireDefault(_deDE);\n\nvar _enUS = __webpack_require__(3);\n\nvar _enUS2 = _interopRequireDefault(_enUS);\n\nvar _jaJP = __webpack_require__(4);\n\nvar _jaJP2 = _interopRequireDefault(_jaJP);\n\nvar _plPL = __webpack_require__(5);\n\nvar _plPL2 = _interopRequireDefault(_plPL);\n\nvar _ptBR = __webpack_require__(6);\n\nvar _ptBR2 = _interopRequireDefault(_ptBR);\n\nvar _ruRU = __webpack_require__(7);\n\nvar _ruRU2 = _interopRequireDefault(_ruRU);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.deCH = _deCH2.default;\nexports.deDE = _deDE2.default;\nexports.enUS = _enUS2.default;\nexports.jaJP = _jaJP2.default;\nexports.plPL = _plPL2.default;\nexports.ptBR = _ptBR2.default;\nexports.ruRU = _ruRU2.default; /* eslint-disable import/prefer-default-export */\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/dist/languages/de-CH.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 1);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Switzerland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-CH'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Grösser als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Grösser gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Ausserhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/dist/languages/de-DE.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 2);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */,\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Germany language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-DE'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Größer als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Größer gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Außerhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/dist/languages/en-US.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 3);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */,\n/* 2 */,\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 15, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for English - United States language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'en-US'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Insert row above'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Insert row below'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Insert column left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Insert column right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Remove row', 'Remove rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Remove column', 'Remove columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Undo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Redo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Read only'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Clear column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alignment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Center'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justify'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Middle'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Freeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Unfreeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Borders'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Remove border(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Add comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edit comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Delete comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Read-only comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Merge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Unmerge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copy'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Cut'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Insert child row'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Detach from parent'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Hide column', 'Hide columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Show column', 'Show columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Hide row', 'Hide rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Show row', 'Show rows']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'None'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Is empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Is not empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Is equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Is not equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Begins with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Ends with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contains'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Does not contain'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Greater than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Greater than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Less than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Less than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Is between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Is not between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'After'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Before'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Today'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Tomorrow'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Yesterday'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Blank cells'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filter by condition'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filter by value'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'And'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Or'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Select all'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Clear'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancel'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Search'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Value'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Second value'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/dist/languages/ja-JP.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 4);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */,\n/* 2 */,\n/* 3 */,\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: hand-dot\n                                                                                                                                                                                                                   * Last updated: Jan 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Japanese - Japan language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ja-JP'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, '行を上に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, '行を下に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, '列を左に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, '列を右に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['行を削除', '行を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['列を削除', '列を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, '元に戻す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'やり直し'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, '読み取り専用'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, '列をクリア'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, '配置'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, '左揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, '中央揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, '右揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, '両端揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, '上揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, '中央揃え(垂直)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, '下揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, '列を固定'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, '列の固定を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, '枠線'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, '上'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, '右'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, '下'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, '左'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, '枠線を削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'コメントを追加'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'コメントを編集'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'コメントを削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, '読み取り専用コメント'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'セルを結合'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'セルの結合を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'コピー'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, '切り取り'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, '子の行を挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, '親の行と切り離す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['列を非表示', '列を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['列を表示', '列を表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['行を非表示', '行を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['行を表示', '行を表示']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'なし'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, '空白'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, '空白ではない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, '次と等しい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, '次と等しくない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, '次で始まる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, '次で終わる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, '次を含む'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, '次を含まない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, '次より大きい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, '以上'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, '次より小さい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, '以下'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, '次の間にある'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, '次の間にない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, '次より後の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, '次より前の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, '今日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, '明日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, '昨日'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, '空白のセル'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, '条件でフィルタ'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, '値でフィルタ'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'かつ'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'もしくは'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'すべて選択'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'クリア'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'キャンセル'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, '検索'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, '値'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, '値2'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/dist/languages/pl-PL.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 5);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n\n/***/ 5:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 17, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Polish - Poland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pl-PL'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Wstaw wiersz powyżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Wstaw wiersz poniżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Wstaw kolumnę z lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Wstaw kolumnę z prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Usuń wiersz', 'Usuń wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Usuń kolumnę', 'Usuń kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Cofnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Ponów'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Wyczyść kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Wyrównanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Do lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Do środka'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Do prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Wyjustuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Do góry'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Wyśrodkuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Do dołu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Zablokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Odblokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Obramowanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Krawędź górna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Krawędź prawa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Krawędź dolna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Krawędź lewa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Usuń obramowanie(a)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Dodaj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edytuj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Usuń komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Komentarz tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Scal komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Rozdziel komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopiuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Wytnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Wstaw wiersz podrzędny'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Odłącz od nadrzędnego'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ukryj kolumnę', 'Ukryj kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Pokaż kolumnę', 'Pokaż kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ukryj wiersz', 'Ukryj wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Pokaż wiersz', 'Pokaż wiersze']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Brak'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Komórka jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Komórka nie jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Jest równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Jest różne od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Tekst zaczyna się od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Tekst kończy się na'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Tekst zawiera fragment'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Tekst nie zawiera fragmentu'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Większe niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Większe lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Mniejsze niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Mniejsze lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Nie jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Data późniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Data wcześniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Dzisiaj'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Jutro'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Wczoraj'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Puste miejsca'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtruj wg warunku'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtruj wg wartości'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Oraz'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Lub'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Zaznacz wszystko'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Wyczyść'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Anuluj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Szukaj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wartość'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Druga wartość'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n\n/******/ })[\"___\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/dist/languages/pt-BR.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 6);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n\n/***/ 6:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Júlio C. Zuppa\n                                                                                                                                                                                                                   * Last updated: Jan 12, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Portuguese - Brazil language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pt-BR'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Inserir linha acima'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Inserir linha abaixo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Inserir coluna esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Inserir coluna direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Excluir linha', 'Excluir linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Excluir coluna', 'Excluir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Desfazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Refazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Limpar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alinhamento'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Centralizado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justificado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Meio'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Congelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Descongelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Bordas'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Excluir bordas(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Incluir comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Editar comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Remover comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Comentário somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Mesclar células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Desfazer mesclagem de células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copiar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Recortar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Inserir linha filha'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Desanexar da linha pai'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ocultar coluna', 'Ocultar colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Exibir coluna', 'Exibir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ocultar linha', 'Ocultar linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Exibir linha', 'Exibir linhas']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Nenhum'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'É vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Não é vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'É igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'É diferente de'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Começa com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Termina com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Não contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Maior que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Menor que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Não está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Depois'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Antes'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Hoje'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Amanhã'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Ontem'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Células vazias'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtrar por condição'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtrar por valor'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'E'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Ou'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Selecionar tudo'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Limpar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancelar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Localizar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Valor'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Segundo valor'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n\n/******/ })[\"___\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/dist/languages/ru-RU.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 7);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n\n/***/ 7:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Alexey Rogachev\n                                                                                                                                                                                                                   * Last updated: Feb 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Russian - Russia language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ru-RU'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Вставить строку выше'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Вставить строку ниже'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Вставить столбец слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Вставить столбец справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Удалить строку', 'Удалить строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Удалить столбец', 'Удалить столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Отменить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Повторить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Очистить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Выравнивание'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'По левому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'По правому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'По ширине'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'По верхнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'По нижнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Закрепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Открепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Границы'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Сверху'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Снизу'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Удалить границу(ы)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Добавить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Редактировать комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Удалить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Комментарий только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Объединить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Разделить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Копировать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Вырезать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Вставить дочернюю строку'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Отделить от родителя'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Скрыть столбец', 'Скрыть столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Показать столбец', 'Показать столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Скрыть строку', 'Скрыть строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Показать строку', 'Показать строки']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Отсутствует'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Не пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Не равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Начинается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Заканчивается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Не содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Больше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Больше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Меньше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Меньше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Не между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'После'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'До'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Сегодня'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Завтра'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Вчера'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Пустые ячейки'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Фильтр по условию'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Фильтр по значению'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'И'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Или'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Выбрать все'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Убрать'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Отмена'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Поиск'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Значение'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Второе значение'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n\n/******/ })[\"___\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/dist/pikaday/LICENSE",
    "content": "Copyright (c) 2014 David Bushell BSD & MIT license\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 David Bushell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\nThe BSD License\n\nCopyright (c) 2014 David Bushell\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. 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.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT HOLDER 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."
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/dist/pikaday/pikaday.css",
    "content": "@charset \"UTF-8\";\n\n/*!\n * Pikaday\n * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/\n */\n\n.pika-single {\n    z-index: 9999;\n    display: block;\n    position: relative;\n    color: #333;\n    background: #fff;\n    border: 1px solid #ccc;\n    border-bottom-color: #bbb;\n    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\n/*\nclear child float (pika-lendar), using the famous micro clearfix hack\nhttp://nicolasgallagher.com/micro-clearfix-hack/\n*/\n.pika-single:before,\n.pika-single:after {\n    content: \" \";\n    display: table;\n}\n.pika-single:after { clear: both }\n.pika-single { *zoom: 1 }\n\n.pika-single.is-hidden {\n    display: none;\n}\n\n.pika-single.is-bound {\n    position: absolute;\n    box-shadow: 0 5px 15px -5px rgba(0,0,0,.5);\n}\n\n.pika-lendar {\n    float: left;\n    width: 240px;\n    margin: 8px;\n}\n\n.pika-title {\n    position: relative;\n    text-align: center;\n}\n\n.pika-label {\n    display: inline-block;\n    *display: inline;\n    position: relative;\n    z-index: 9999;\n    overflow: hidden;\n    margin: 0;\n    padding: 5px 3px;\n    font-size: 14px;\n    line-height: 20px;\n    font-weight: bold;\n    background-color: #fff;\n}\n.pika-title select {\n    cursor: pointer;\n    position: absolute;\n    z-index: 9998;\n    margin: 0;\n    left: 0;\n    top: 5px;\n    filter: alpha(opacity=0);\n    opacity: 0;\n}\n\n.pika-prev,\n.pika-next {\n    display: block;\n    cursor: pointer;\n    position: relative;\n    outline: none;\n    border: 0;\n    padding: 0;\n    width: 20px;\n    height: 30px;\n    /* hide text using text-indent trick, using width value (it's enough) */\n    text-indent: 20px;\n    white-space: nowrap;\n    overflow: hidden;\n    background-color: transparent;\n    background-position: center center;\n    background-repeat: no-repeat;\n    background-size: 75% 75%;\n    opacity: .5;\n    *position: absolute;\n    *top: 0;\n}\n\n.pika-prev:hover,\n.pika-next:hover {\n    opacity: 1;\n}\n\n.pika-prev,\n.is-rtl .pika-next {\n    float: left;\n    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==');\n    *left: 0;\n}\n\n.pika-next,\n.is-rtl .pika-prev {\n    float: right;\n    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=');\n    *right: 0;\n}\n\n.pika-prev.is-disabled,\n.pika-next.is-disabled {\n    cursor: default;\n    opacity: .2;\n}\n\n.pika-select {\n    display: inline-block;\n    *display: inline;\n}\n\n.pika-table {\n    width: 100%;\n    border-collapse: collapse;\n    border-spacing: 0;\n    border: 0;\n}\n\n.pika-table th,\n.pika-table td {\n    width: 14.285714285714286%;\n    padding: 0;\n}\n\n.pika-table th {\n    color: #999;\n    font-size: 12px;\n    line-height: 25px;\n    font-weight: bold;\n    text-align: center;\n}\n\n.pika-button {\n    cursor: pointer;\n    display: block;\n    box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    outline: none;\n    border: 0;\n    margin: 0;\n    width: 100%;\n    padding: 5px;\n    color: #666;\n    font-size: 12px;\n    line-height: 15px;\n    text-align: right;\n    background: #f5f5f5;\n}\n\n.pika-week {\n    font-size: 11px;\n    color: #999;\n}\n\n.is-today .pika-button {\n    color: #33aaff;\n    font-weight: bold;\n}\n\n.is-selected .pika-button {\n    color: #fff;\n    font-weight: bold;\n    background: #33aaff;\n    box-shadow: inset 0 1px 3px #178fe5;\n    border-radius: 3px;\n}\n\n.is-inrange .pika-button {\n    background: #D5E9F7;\n}\n\n.is-startrange .pika-button {\n    color: #fff;\n    background: #6CB31D;\n    box-shadow: none;\n    border-radius: 3px;\n}\n\n.is-endrange .pika-button {\n    color: #fff;\n    background: #33aaff;\n    box-shadow: none;\n    border-radius: 3px;\n}\n\n.is-disabled .pika-button,\n.is-outside-current-month .pika-button {\n    pointer-events: none;\n    cursor: default;\n    color: #999;\n    opacity: .3;\n}\n\n.pika-button:hover {\n    color: #fff;\n    background: #ff8000;\n    box-shadow: none;\n    border-radius: 3px;\n}\n\n/* styling for abbr */\n.pika-table abbr {\n    border-bottom: none;\n    cursor: help;\n}\n\n"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/dist/pikaday/pikaday.js",
    "content": "/*!\n * Pikaday\n *\n * Copyright © 2014 David Bushell | BSD & MIT license | https://github.com/dbushell/Pikaday\n */\n\n(function (root, factory)\n{\n    'use strict';\n\n    var moment;\n    if (typeof exports === 'object') {\n        // CommonJS module\n        // Load moment.js as an optional dependency\n        try { moment = require('moment'); } catch (e) {}\n        module.exports = factory(moment);\n    } else if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(function (req)\n        {\n            // Load moment.js as an optional dependency\n            var id = 'moment';\n            try { moment = req(id); } catch (e) {}\n            return factory(moment);\n        });\n    } else {\n        root.Pikaday = factory(root.moment);\n    }\n}(this, function (moment)\n{\n    'use strict';\n\n    /**\n     * feature detection and helper functions\n     */\n    var hasMoment = typeof moment === 'function',\n\n    hasEventListeners = !!window.addEventListener,\n\n    document = window.document,\n\n    sto = window.setTimeout,\n\n    addEvent = function(el, e, callback, capture)\n    {\n        if (hasEventListeners) {\n            el.addEventListener(e, callback, !!capture);\n        } else {\n            el.attachEvent('on' + e, callback);\n        }\n    },\n\n    removeEvent = function(el, e, callback, capture)\n    {\n        if (hasEventListeners) {\n            el.removeEventListener(e, callback, !!capture);\n        } else {\n            el.detachEvent('on' + e, callback);\n        }\n    },\n\n    fireEvent = function(el, eventName, data)\n    {\n        var ev;\n\n        if (document.createEvent) {\n            ev = document.createEvent('HTMLEvents');\n            ev.initEvent(eventName, true, false);\n            ev = extend(ev, data);\n            el.dispatchEvent(ev);\n        } else if (document.createEventObject) {\n            ev = document.createEventObject();\n            ev = extend(ev, data);\n            el.fireEvent('on' + eventName, ev);\n        }\n    },\n\n    trim = function(str)\n    {\n        return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g,'');\n    },\n\n    hasClass = function(el, cn)\n    {\n        return (' ' + el.className + ' ').indexOf(' ' + cn + ' ') !== -1;\n    },\n\n    addClass = function(el, cn)\n    {\n        if (!hasClass(el, cn)) {\n            el.className = (el.className === '') ? cn : el.className + ' ' + cn;\n        }\n    },\n\n    removeClass = function(el, cn)\n    {\n        el.className = trim((' ' + el.className + ' ').replace(' ' + cn + ' ', ' '));\n    },\n\n    isArray = function(obj)\n    {\n        return (/Array/).test(Object.prototype.toString.call(obj));\n    },\n\n    isDate = function(obj)\n    {\n        return (/Date/).test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime());\n    },\n\n    isWeekend = function(date)\n    {\n        var day = date.getDay();\n        return day === 0 || day === 6;\n    },\n\n    isLeapYear = function(year)\n    {\n        // solution by Matti Virkkunen: http://stackoverflow.com/a/4881951\n        return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;\n    },\n\n    getDaysInMonth = function(year, month)\n    {\n        return [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n    },\n\n    setToStartOfDay = function(date)\n    {\n        if (isDate(date)) date.setHours(0,0,0,0);\n    },\n\n    compareDates = function(a,b)\n    {\n        // weak date comparison (use setToStartOfDay(date) to ensure correct result)\n        return a.getTime() === b.getTime();\n    },\n\n    extend = function(to, from, overwrite)\n    {\n        var prop, hasProp;\n        for (prop in from) {\n            hasProp = to[prop] !== undefined;\n            if (hasProp && typeof from[prop] === 'object' && from[prop] !== null && from[prop].nodeName === undefined) {\n                if (isDate(from[prop])) {\n                    if (overwrite) {\n                        to[prop] = new Date(from[prop].getTime());\n                    }\n                }\n                else if (isArray(from[prop])) {\n                    if (overwrite) {\n                        to[prop] = from[prop].slice(0);\n                    }\n                } else {\n                    to[prop] = extend({}, from[prop], overwrite);\n                }\n            } else if (overwrite || !hasProp) {\n                to[prop] = from[prop];\n            }\n        }\n        return to;\n    },\n\n    adjustCalendar = function(calendar) {\n        if (calendar.month < 0) {\n            calendar.year -= Math.ceil(Math.abs(calendar.month)/12);\n            calendar.month += 12;\n        }\n        if (calendar.month > 11) {\n            calendar.year += Math.floor(Math.abs(calendar.month)/12);\n            calendar.month -= 12;\n        }\n        return calendar;\n    },\n\n    /**\n     * defaults and localisation\n     */\n    defaults = {\n\n        // bind the picker to a form field\n        field: null,\n\n        // automatically show/hide the picker on `field` focus (default `true` if `field` is set)\n        bound: undefined,\n\n        // position of the datepicker, relative to the field (default to bottom & left)\n        // ('bottom' & 'left' keywords are not used, 'top' & 'right' are modifier on the bottom/left position)\n        position: 'bottom left',\n\n        // automatically fit in the viewport even if it means repositioning from the position option\n        reposition: true,\n\n        // the default output format for `.toString()` and `field` value\n        format: 'YYYY-MM-DD',\n\n        // the initial date to view when first opened\n        defaultDate: null,\n\n        // make the `defaultDate` the initial selected value\n        setDefaultDate: false,\n\n        // first day of week (0: Sunday, 1: Monday etc)\n        firstDay: 0,\n\n        // the default flag for moment's strict date parsing\n        formatStrict: false,\n\n        // the minimum/earliest date that can be selected\n        minDate: null,\n        // the maximum/latest date that can be selected\n        maxDate: null,\n\n        // number of years either side, or array of upper/lower range\n        yearRange: 10,\n\n        // show week numbers at head of row\n        showWeekNumber: false,\n\n        // used internally (don't config outside)\n        minYear: 0,\n        maxYear: 9999,\n        minMonth: undefined,\n        maxMonth: undefined,\n\n        startRange: null,\n        endRange: null,\n\n        isRTL: false,\n\n        // Additional text to append to the year in the calendar title\n        yearSuffix: '',\n\n        // Render the month after year in the calendar title\n        showMonthAfterYear: false,\n\n        // Render days of the calendar grid that fall in the next or previous month\n        showDaysInNextAndPreviousMonths: false,\n\n        // how many months are visible\n        numberOfMonths: 1,\n\n        // when numberOfMonths is used, this will help you to choose where the main calendar will be (default `left`, can be set to `right`)\n        // only used for the first display or when a selected date is not visible\n        mainCalendar: 'left',\n\n        // Specify a DOM element to render the calendar in\n        container: undefined,\n\n        // internationalization\n        i18n: {\n            previousMonth : 'Previous Month',\n            nextMonth     : 'Next Month',\n            months        : ['January','February','March','April','May','June','July','August','September','October','November','December'],\n            weekdays      : ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],\n            weekdaysShort : ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']\n        },\n\n        // Theme Classname\n        theme: null,\n\n        // callback function\n        onSelect: null,\n        onOpen: null,\n        onClose: null,\n        onDraw: null\n    },\n\n\n    /**\n     * templating functions to abstract HTML rendering\n     */\n    renderDayName = function(opts, day, abbr)\n    {\n        day += opts.firstDay;\n        while (day >= 7) {\n            day -= 7;\n        }\n        return abbr ? opts.i18n.weekdaysShort[day] : opts.i18n.weekdays[day];\n    },\n\n    renderDay = function(opts)\n    {\n        var arr = [];\n        var ariaSelected = 'false';\n        if (opts.isEmpty) {\n            if (opts.showDaysInNextAndPreviousMonths) {\n                arr.push('is-outside-current-month');\n            } else {\n                return '<td class=\"is-empty\"></td>';\n            }\n        }\n        if (opts.isDisabled) {\n            arr.push('is-disabled');\n        }\n        if (opts.isToday) {\n            arr.push('is-today');\n        }\n        if (opts.isSelected) {\n            arr.push('is-selected');\n            ariaSelected = 'true';\n        }\n        if (opts.isInRange) {\n            arr.push('is-inrange');\n        }\n        if (opts.isStartRange) {\n            arr.push('is-startrange');\n        }\n        if (opts.isEndRange) {\n            arr.push('is-endrange');\n        }\n        return '<td data-day=\"' + opts.day + '\" class=\"' + arr.join(' ') + '\" aria-selected=\"' + ariaSelected + '\">' +\n                 '<button class=\"pika-button pika-day\" type=\"button\" ' +\n                    'data-pika-year=\"' + opts.year + '\" data-pika-month=\"' + opts.month + '\" data-pika-day=\"' + opts.day + '\">' +\n                        opts.day +\n                 '</button>' +\n               '</td>';\n    },\n\n    renderWeek = function (d, m, y) {\n        // Lifted from http://javascript.about.com/library/blweekyear.htm, lightly modified.\n        var onejan = new Date(y, 0, 1),\n            weekNum = Math.ceil((((new Date(y, m, d) - onejan) / 86400000) + onejan.getDay()+1)/7);\n        return '<td class=\"pika-week\">' + weekNum + '</td>';\n    },\n\n    renderRow = function(days, isRTL)\n    {\n        return '<tr>' + (isRTL ? days.reverse() : days).join('') + '</tr>';\n    },\n\n    renderBody = function(rows)\n    {\n        return '<tbody>' + rows.join('') + '</tbody>';\n    },\n\n    renderHead = function(opts)\n    {\n        var i, arr = [];\n        if (opts.showWeekNumber) {\n            arr.push('<th></th>');\n        }\n        for (i = 0; i < 7; i++) {\n            arr.push('<th scope=\"col\"><abbr title=\"' + renderDayName(opts, i) + '\">' + renderDayName(opts, i, true) + '</abbr></th>');\n        }\n        return '<thead><tr>' + (opts.isRTL ? arr.reverse() : arr).join('') + '</tr></thead>';\n    },\n\n    renderTitle = function(instance, c, year, month, refYear, randId)\n    {\n        var i, j, arr,\n            opts = instance._o,\n            isMinYear = year === opts.minYear,\n            isMaxYear = year === opts.maxYear,\n            html = '<div id=\"' + randId + '\" class=\"pika-title\" role=\"heading\" aria-live=\"assertive\">',\n            monthHtml,\n            yearHtml,\n            prev = true,\n            next = true;\n\n        for (arr = [], i = 0; i < 12; i++) {\n            arr.push('<option value=\"' + (year === refYear ? i - c : 12 + i - c) + '\"' +\n                (i === month ? ' selected=\"selected\"': '') +\n                ((isMinYear && i < opts.minMonth) || (isMaxYear && i > opts.maxMonth) ? 'disabled=\"disabled\"' : '') + '>' +\n                opts.i18n.months[i] + '</option>');\n        }\n\n        monthHtml = '<div class=\"pika-label\">' + opts.i18n.months[month] + '<select class=\"pika-select pika-select-month\" tabindex=\"-1\">' + arr.join('') + '</select></div>';\n\n        if (isArray(opts.yearRange)) {\n            i = opts.yearRange[0];\n            j = opts.yearRange[1] + 1;\n        } else {\n            i = year - opts.yearRange;\n            j = 1 + year + opts.yearRange;\n        }\n\n        for (arr = []; i < j && i <= opts.maxYear; i++) {\n            if (i >= opts.minYear) {\n                arr.push('<option value=\"' + i + '\"' + (i === year ? ' selected=\"selected\"': '') + '>' + (i) + '</option>');\n            }\n        }\n        yearHtml = '<div class=\"pika-label\">' + year + opts.yearSuffix + '<select class=\"pika-select pika-select-year\" tabindex=\"-1\">' + arr.join('') + '</select></div>';\n\n        if (opts.showMonthAfterYear) {\n            html += yearHtml + monthHtml;\n        } else {\n            html += monthHtml + yearHtml;\n        }\n\n        if (isMinYear && (month === 0 || opts.minMonth >= month)) {\n            prev = false;\n        }\n\n        if (isMaxYear && (month === 11 || opts.maxMonth <= month)) {\n            next = false;\n        }\n\n        if (c === 0) {\n            html += '<button class=\"pika-prev' + (prev ? '' : ' is-disabled') + '\" type=\"button\">' + opts.i18n.previousMonth + '</button>';\n        }\n        if (c === (instance._o.numberOfMonths - 1) ) {\n            html += '<button class=\"pika-next' + (next ? '' : ' is-disabled') + '\" type=\"button\">' + opts.i18n.nextMonth + '</button>';\n        }\n\n        return html += '</div>';\n    },\n\n    renderTable = function(opts, data, randId)\n    {\n        return '<table cellpadding=\"0\" cellspacing=\"0\" class=\"pika-table\" role=\"grid\" aria-labelledby=\"' + randId + '\">' + renderHead(opts) + renderBody(data) + '</table>';\n    },\n\n\n    /**\n     * Pikaday constructor\n     */\n    Pikaday = function(options)\n    {\n        var self = this,\n            opts = self.config(options);\n\n        self._onMouseDown = function(e)\n        {\n            if (!self._v) {\n                return;\n            }\n            e = e || window.event;\n            var target = e.target || e.srcElement;\n            if (!target) {\n                return;\n            }\n\n            if (!hasClass(target, 'is-disabled')) {\n                if (hasClass(target, 'pika-button') && !hasClass(target, 'is-empty') && !hasClass(target.parentNode, 'is-disabled')) {\n                    self.setDate(new Date(target.getAttribute('data-pika-year'), target.getAttribute('data-pika-month'), target.getAttribute('data-pika-day')));\n                    if (opts.bound) {\n                        sto(function() {\n                            self.hide();\n                            if (opts.field) {\n                                opts.field.blur();\n                            }\n                        }, 100);\n                    }\n                }\n                else if (hasClass(target, 'pika-prev')) {\n                    self.prevMonth();\n                }\n                else if (hasClass(target, 'pika-next')) {\n                    self.nextMonth();\n                }\n            }\n            if (!hasClass(target, 'pika-select')) {\n                // if this is touch event prevent mouse events emulation\n                if (e.preventDefault) {\n                    e.preventDefault();\n                } else {\n                    e.returnValue = false;\n                    return false;\n                }\n            } else {\n                self._c = true;\n            }\n        };\n\n        self._onChange = function(e)\n        {\n            e = e || window.event;\n            var target = e.target || e.srcElement;\n            if (!target) {\n                return;\n            }\n            if (hasClass(target, 'pika-select-month')) {\n                self.gotoMonth(target.value);\n            }\n            else if (hasClass(target, 'pika-select-year')) {\n                self.gotoYear(target.value);\n            }\n        };\n\n        self._onKeyChange = function(e)\n        {\n            e = e || window.event;\n\n            if (self.isVisible()) {\n\n                switch(e.keyCode){\n                    case 13:\n                    case 27:\n                        opts.field.blur();\n                        break;\n                    case 37:\n                        e.preventDefault();\n                        self.adjustDate('subtract', 1);\n                        break;\n                    case 38:\n                        self.adjustDate('subtract', 7);\n                        break;\n                    case 39:\n                        self.adjustDate('add', 1);\n                        break;\n                    case 40:\n                        self.adjustDate('add', 7);\n                        break;\n                }\n            }\n        };\n\n        self._onInputChange = function(e)\n        {\n            var date;\n\n            if (e.firedBy === self) {\n                return;\n            }\n            if (hasMoment) {\n                date = moment(opts.field.value, opts.format, opts.formatStrict);\n                date = (date && date.isValid()) ? date.toDate() : null;\n            }\n            else {\n                date = new Date(Date.parse(opts.field.value));\n            }\n            if (isDate(date)) {\n              self.setDate(date);\n            }\n            if (!self._v) {\n                self.show();\n            }\n        };\n\n        self._onInputFocus = function()\n        {\n            self.show();\n        };\n\n        self._onInputClick = function()\n        {\n            self.show();\n        };\n\n        self._onInputBlur = function()\n        {\n            // IE allows pika div to gain focus; catch blur the input field\n            var pEl = document.activeElement;\n            do {\n                if (hasClass(pEl, 'pika-single')) {\n                    return;\n                }\n            }\n            while ((pEl = pEl.parentNode));\n\n            if (!self._c) {\n                self._b = sto(function() {\n                    self.hide();\n                }, 50);\n            }\n            self._c = false;\n        };\n\n        self._onClick = function(e)\n        {\n            e = e || window.event;\n            var target = e.target || e.srcElement,\n                pEl = target;\n            if (!target) {\n                return;\n            }\n            if (!hasEventListeners && hasClass(target, 'pika-select')) {\n                if (!target.onchange) {\n                    target.setAttribute('onchange', 'return;');\n                    addEvent(target, 'change', self._onChange);\n                }\n            }\n            do {\n                if (hasClass(pEl, 'pika-single') || pEl === opts.trigger) {\n                    return;\n                }\n            }\n            while ((pEl = pEl.parentNode));\n            if (self._v && target !== opts.trigger && pEl !== opts.trigger) {\n                self.hide();\n            }\n        };\n\n        self.el = document.createElement('div');\n        self.el.className = 'pika-single' + (opts.isRTL ? ' is-rtl' : '') + (opts.theme ? ' ' + opts.theme : '');\n\n        addEvent(self.el, 'mousedown', self._onMouseDown, true);\n        addEvent(self.el, 'touchend', self._onMouseDown, true);\n        addEvent(self.el, 'change', self._onChange);\n        addEvent(document, 'keydown', self._onKeyChange);\n\n        if (opts.field) {\n            if (opts.container) {\n                opts.container.appendChild(self.el);\n            } else if (opts.bound) {\n                document.body.appendChild(self.el);\n            } else {\n                opts.field.parentNode.insertBefore(self.el, opts.field.nextSibling);\n            }\n            addEvent(opts.field, 'change', self._onInputChange);\n\n            if (!opts.defaultDate) {\n                if (hasMoment && opts.field.value) {\n                    opts.defaultDate = moment(opts.field.value, opts.format).toDate();\n                } else {\n                    opts.defaultDate = new Date(Date.parse(opts.field.value));\n                }\n                opts.setDefaultDate = true;\n            }\n        }\n\n        var defDate = opts.defaultDate;\n\n        if (isDate(defDate)) {\n            if (opts.setDefaultDate) {\n                self.setDate(defDate, true);\n            } else {\n                self.gotoDate(defDate);\n            }\n        } else {\n            self.gotoDate(new Date());\n        }\n\n        if (opts.bound) {\n            this.hide();\n            self.el.className += ' is-bound';\n            addEvent(opts.trigger, 'click', self._onInputClick);\n            addEvent(opts.trigger, 'focus', self._onInputFocus);\n            addEvent(opts.trigger, 'blur', self._onInputBlur);\n        } else {\n            this.show();\n        }\n    };\n\n\n    /**\n     * public Pikaday API\n     */\n    Pikaday.prototype = {\n\n\n        /**\n         * configure functionality\n         */\n        config: function(options)\n        {\n            if (!this._o) {\n                this._o = extend({}, defaults, true);\n            }\n\n            var opts = extend(this._o, options, true);\n\n            opts.isRTL = !!opts.isRTL;\n\n            opts.field = (opts.field && opts.field.nodeName) ? opts.field : null;\n\n            opts.theme = (typeof opts.theme) === 'string' && opts.theme ? opts.theme : null;\n\n            opts.bound = !!(opts.bound !== undefined ? opts.field && opts.bound : opts.field);\n\n            opts.trigger = (opts.trigger && opts.trigger.nodeName) ? opts.trigger : opts.field;\n\n            opts.disableWeekends = !!opts.disableWeekends;\n\n            opts.disableDayFn = (typeof opts.disableDayFn) === 'function' ? opts.disableDayFn : null;\n\n            var nom = parseInt(opts.numberOfMonths, 10) || 1;\n            opts.numberOfMonths = nom > 4 ? 4 : nom;\n\n            if (!isDate(opts.minDate)) {\n                opts.minDate = false;\n            }\n            if (!isDate(opts.maxDate)) {\n                opts.maxDate = false;\n            }\n            if ((opts.minDate && opts.maxDate) && opts.maxDate < opts.minDate) {\n                opts.maxDate = opts.minDate = false;\n            }\n            if (opts.minDate) {\n                this.setMinDate(opts.minDate);\n            }\n            if (opts.maxDate) {\n                this.setMaxDate(opts.maxDate);\n            }\n\n            if (isArray(opts.yearRange)) {\n                var fallback = new Date().getFullYear() - 10;\n                opts.yearRange[0] = parseInt(opts.yearRange[0], 10) || fallback;\n                opts.yearRange[1] = parseInt(opts.yearRange[1], 10) || fallback;\n            } else {\n                opts.yearRange = Math.abs(parseInt(opts.yearRange, 10)) || defaults.yearRange;\n                if (opts.yearRange > 100) {\n                    opts.yearRange = 100;\n                }\n            }\n\n            return opts;\n        },\n\n        /**\n         * return a formatted string of the current selection (using Moment.js if available)\n         */\n        toString: function(format)\n        {\n            return !isDate(this._d) ? '' : hasMoment ? moment(this._d).format(format || this._o.format) : this._d.toDateString();\n        },\n\n        /**\n         * return a Moment.js object of the current selection (if available)\n         */\n        getMoment: function()\n        {\n            return hasMoment ? moment(this._d) : null;\n        },\n\n        /**\n         * set the current selection from a Moment.js object (if available)\n         */\n        setMoment: function(date, preventOnSelect)\n        {\n            if (hasMoment && moment.isMoment(date)) {\n                this.setDate(date.toDate(), preventOnSelect);\n            }\n        },\n\n        /**\n         * return a Date object of the current selection with fallback for the current date\n         */\n        getDate: function()\n        {\n            return isDate(this._d) ? new Date(this._d.getTime()) : new Date();\n        },\n\n        /**\n         * set the current selection\n         */\n        setDate: function(date, preventOnSelect)\n        {\n            if (!date) {\n                this._d = null;\n\n                if (this._o.field) {\n                    this._o.field.value = '';\n                    fireEvent(this._o.field, 'change', { firedBy: this });\n                }\n\n                return this.draw();\n            }\n            if (typeof date === 'string') {\n                date = new Date(Date.parse(date));\n            }\n            if (!isDate(date)) {\n                return;\n            }\n\n            var min = this._o.minDate,\n                max = this._o.maxDate;\n\n            if (isDate(min) && date < min) {\n                date = min;\n            } else if (isDate(max) && date > max) {\n                date = max;\n            }\n\n            this._d = new Date(date.getTime());\n            setToStartOfDay(this._d);\n            this.gotoDate(this._d);\n\n            if (this._o.field) {\n                this._o.field.value = this.toString();\n                fireEvent(this._o.field, 'change', { firedBy: this });\n            }\n            if (!preventOnSelect && typeof this._o.onSelect === 'function') {\n                this._o.onSelect.call(this, this.getDate());\n            }\n        },\n\n        /**\n         * change view to a specific date\n         */\n        gotoDate: function(date)\n        {\n            var newCalendar = true;\n\n            if (!isDate(date)) {\n                return;\n            }\n\n            if (this.calendars) {\n                var firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1),\n                    lastVisibleDate = new Date(this.calendars[this.calendars.length-1].year, this.calendars[this.calendars.length-1].month, 1),\n                    visibleDate = date.getTime();\n                // get the end of the month\n                lastVisibleDate.setMonth(lastVisibleDate.getMonth()+1);\n                lastVisibleDate.setDate(lastVisibleDate.getDate()-1);\n                newCalendar = (visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate);\n            }\n\n            if (newCalendar) {\n                this.calendars = [{\n                    month: date.getMonth(),\n                    year: date.getFullYear()\n                }];\n                if (this._o.mainCalendar === 'right') {\n                    this.calendars[0].month += 1 - this._o.numberOfMonths;\n                }\n            }\n\n            this.adjustCalendars();\n        },\n\n        adjustDate: function(sign, days) {\n\n            var day = this.getDate();\n            var difference = parseInt(days)*24*60*60*1000;\n\n            var newDay;\n\n            if (sign === 'add') {\n                newDay = new Date(day.valueOf() + difference);\n            } else if (sign === 'subtract') {\n                newDay = new Date(day.valueOf() - difference);\n            }\n\n            if (hasMoment) {\n                if (sign === 'add') {\n                    newDay = moment(day).add(days, \"days\").toDate();\n                } else if (sign === 'subtract') {\n                    newDay = moment(day).subtract(days, \"days\").toDate();\n                }\n            }\n\n            this.setDate(newDay);\n        },\n\n        adjustCalendars: function() {\n            this.calendars[0] = adjustCalendar(this.calendars[0]);\n            for (var c = 1; c < this._o.numberOfMonths; c++) {\n                this.calendars[c] = adjustCalendar({\n                    month: this.calendars[0].month + c,\n                    year: this.calendars[0].year\n                });\n            }\n            this.draw();\n        },\n\n        gotoToday: function()\n        {\n            this.gotoDate(new Date());\n        },\n\n        /**\n         * change view to a specific month (zero-index, e.g. 0: January)\n         */\n        gotoMonth: function(month)\n        {\n            if (!isNaN(month)) {\n                this.calendars[0].month = parseInt(month, 10);\n                this.adjustCalendars();\n            }\n        },\n\n        nextMonth: function()\n        {\n            this.calendars[0].month++;\n            this.adjustCalendars();\n        },\n\n        prevMonth: function()\n        {\n            this.calendars[0].month--;\n            this.adjustCalendars();\n        },\n\n        /**\n         * change view to a specific full year (e.g. \"2012\")\n         */\n        gotoYear: function(year)\n        {\n            if (!isNaN(year)) {\n                this.calendars[0].year = parseInt(year, 10);\n                this.adjustCalendars();\n            }\n        },\n\n        /**\n         * change the minDate\n         */\n        setMinDate: function(value)\n        {\n            if(value instanceof Date) {\n                setToStartOfDay(value);\n                this._o.minDate = value;\n                this._o.minYear  = value.getFullYear();\n                this._o.minMonth = value.getMonth();\n            } else {\n                this._o.minDate = defaults.minDate;\n                this._o.minYear  = defaults.minYear;\n                this._o.minMonth = defaults.minMonth;\n                this._o.startRange = defaults.startRange;\n            }\n\n            this.draw();\n        },\n\n        /**\n         * change the maxDate\n         */\n        setMaxDate: function(value)\n        {\n            if(value instanceof Date) {\n                setToStartOfDay(value);\n                this._o.maxDate = value;\n                this._o.maxYear = value.getFullYear();\n                this._o.maxMonth = value.getMonth();\n            } else {\n                this._o.maxDate = defaults.maxDate;\n                this._o.maxYear = defaults.maxYear;\n                this._o.maxMonth = defaults.maxMonth;\n                this._o.endRange = defaults.endRange;\n            }\n\n            this.draw();\n        },\n\n        setStartRange: function(value)\n        {\n            this._o.startRange = value;\n        },\n\n        setEndRange: function(value)\n        {\n            this._o.endRange = value;\n        },\n\n        /**\n         * refresh the HTML\n         */\n        draw: function(force)\n        {\n            if (!this._v && !force) {\n                return;\n            }\n            var opts = this._o,\n                minYear = opts.minYear,\n                maxYear = opts.maxYear,\n                minMonth = opts.minMonth,\n                maxMonth = opts.maxMonth,\n                html = '',\n                randId;\n\n            if (this._y <= minYear) {\n                this._y = minYear;\n                if (!isNaN(minMonth) && this._m < minMonth) {\n                    this._m = minMonth;\n                }\n            }\n            if (this._y >= maxYear) {\n                this._y = maxYear;\n                if (!isNaN(maxMonth) && this._m > maxMonth) {\n                    this._m = maxMonth;\n                }\n            }\n\n            randId = 'pika-title-' + Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 2);\n\n            for (var c = 0; c < opts.numberOfMonths; c++) {\n                html += '<div class=\"pika-lendar\">' + renderTitle(this, c, this.calendars[c].year, this.calendars[c].month, this.calendars[0].year, randId) + this.render(this.calendars[c].year, this.calendars[c].month, randId) + '</div>';\n            }\n\n            this.el.innerHTML = html;\n\n            if (opts.bound) {\n                if(opts.field.type !== 'hidden') {\n                    sto(function() {\n                        opts.trigger.focus();\n                    }, 1);\n                }\n            }\n\n            if (typeof this._o.onDraw === 'function') {\n                this._o.onDraw(this);\n            }\n            \n            if (opts.bound) {\n                // let the screen reader user know to use arrow keys\n                opts.field.setAttribute('aria-label', 'Use the arrow keys to pick a date');\n            }\n        },\n\n        adjustPosition: function()\n        {\n            var field, pEl, width, height, viewportWidth, viewportHeight, scrollTop, left, top, clientRect;\n\n            if (this._o.container) return;\n\n            this.el.style.position = 'absolute';\n\n            field = this._o.trigger;\n            pEl = field;\n            width = this.el.offsetWidth;\n            height = this.el.offsetHeight;\n            viewportWidth = window.innerWidth || document.documentElement.clientWidth;\n            viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n            scrollTop = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;\n\n            if (typeof field.getBoundingClientRect === 'function') {\n                clientRect = field.getBoundingClientRect();\n                left = clientRect.left + window.pageXOffset;\n                top = clientRect.bottom + window.pageYOffset;\n            } else {\n                left = pEl.offsetLeft;\n                top  = pEl.offsetTop + pEl.offsetHeight;\n                while((pEl = pEl.offsetParent)) {\n                    left += pEl.offsetLeft;\n                    top  += pEl.offsetTop;\n                }\n            }\n\n            // default position is bottom & left\n            if ((this._o.reposition && left + width > viewportWidth) ||\n                (\n                    this._o.position.indexOf('right') > -1 &&\n                    left - width + field.offsetWidth > 0\n                )\n            ) {\n                left = left - width + field.offsetWidth;\n            }\n            if ((this._o.reposition && top + height > viewportHeight + scrollTop) ||\n                (\n                    this._o.position.indexOf('top') > -1 &&\n                    top - height - field.offsetHeight > 0\n                )\n            ) {\n                top = top - height - field.offsetHeight;\n            }\n\n            this.el.style.left = left + 'px';\n            this.el.style.top = top + 'px';\n        },\n\n        /**\n         * render HTML for a particular month\n         */\n        render: function(year, month, randId)\n        {\n            var opts   = this._o,\n                now    = new Date(),\n                days   = getDaysInMonth(year, month),\n                before = new Date(year, month, 1).getDay(),\n                data   = [],\n                row    = [];\n            setToStartOfDay(now);\n            if (opts.firstDay > 0) {\n                before -= opts.firstDay;\n                if (before < 0) {\n                    before += 7;\n                }\n            }\n            var previousMonth = month === 0 ? 11 : month - 1,\n                nextMonth = month === 11 ? 0 : month + 1,\n                yearOfPreviousMonth = month === 0 ? year - 1 : year,\n                yearOfNextMonth = month === 11 ? year + 1 : year,\n                daysInPreviousMonth = getDaysInMonth(yearOfPreviousMonth, previousMonth);\n            var cells = days + before,\n                after = cells;\n            while(after > 7) {\n                after -= 7;\n            }\n            cells += 7 - after;\n            for (var i = 0, r = 0; i < cells; i++)\n            {\n                var day = new Date(year, month, 1 + (i - before)),\n                    isSelected = isDate(this._d) ? compareDates(day, this._d) : false,\n                    isToday = compareDates(day, now),\n                    isEmpty = i < before || i >= (days + before),\n                    dayNumber = 1 + (i - before),\n                    monthNumber = month,\n                    yearNumber = year,\n                    isStartRange = opts.startRange && compareDates(opts.startRange, day),\n                    isEndRange = opts.endRange && compareDates(opts.endRange, day),\n                    isInRange = opts.startRange && opts.endRange && opts.startRange < day && day < opts.endRange,\n                    isDisabled = (opts.minDate && day < opts.minDate) ||\n                                 (opts.maxDate && day > opts.maxDate) ||\n                                 (opts.disableWeekends && isWeekend(day)) ||\n                                 (opts.disableDayFn && opts.disableDayFn(day));\n\n                if (isEmpty) {\n                    if (i < before) {\n                        dayNumber = daysInPreviousMonth + dayNumber;\n                        monthNumber = previousMonth;\n                        yearNumber = yearOfPreviousMonth;\n                    } else {\n                        dayNumber = dayNumber - days;\n                        monthNumber = nextMonth;\n                        yearNumber = yearOfNextMonth;\n                    }\n                }\n\n                var dayConfig = {\n                        day: dayNumber,\n                        month: monthNumber,\n                        year: yearNumber,\n                        isSelected: isSelected,\n                        isToday: isToday,\n                        isDisabled: isDisabled,\n                        isEmpty: isEmpty,\n                        isStartRange: isStartRange,\n                        isEndRange: isEndRange,\n                        isInRange: isInRange,\n                        showDaysInNextAndPreviousMonths: opts.showDaysInNextAndPreviousMonths\n                    };\n\n                row.push(renderDay(dayConfig));\n\n                if (++r === 7) {\n                    if (opts.showWeekNumber) {\n                        row.unshift(renderWeek(i - before, month, year));\n                    }\n                    data.push(renderRow(row, opts.isRTL));\n                    row = [];\n                    r = 0;\n                }\n            }\n            return renderTable(opts, data, randId);\n        },\n\n        isVisible: function()\n        {\n            return this._v;\n        },\n\n        show: function()\n        {\n            if (!this.isVisible()) {\n                removeClass(this.el, 'is-hidden');\n                this._v = true;\n                this.draw();\n                if (this._o.bound) {\n                    addEvent(document, 'click', this._onClick);\n                    this.adjustPosition();\n                }\n                if (typeof this._o.onOpen === 'function') {\n                    this._o.onOpen.call(this);\n                }\n            }\n        },\n\n        hide: function()\n        {\n            var v = this._v;\n            if (v !== false) {\n                if (this._o.bound) {\n                    removeEvent(document, 'click', this._onClick);\n                }\n                this.el.style.position = 'static'; // reset\n                this.el.style.left = 'auto';\n                this.el.style.top = 'auto';\n                addClass(this.el, 'is-hidden');\n                this._v = false;\n                if (v !== undefined && typeof this._o.onClose === 'function') {\n                    this._o.onClose.call(this);\n                }\n            }\n        },\n\n        /**\n         * GAME OVER\n         */\n        destroy: function()\n        {\n            this.hide();\n            removeEvent(this.el, 'mousedown', this._onMouseDown, true);\n            removeEvent(this.el, 'touchend', this._onMouseDown, true);\n            removeEvent(this.el, 'change', this._onChange);\n            if (this._o.field) {\n                removeEvent(this._o.field, 'change', this._onInputChange);\n                if (this._o.bound) {\n                    removeEvent(this._o.trigger, 'click', this._onInputClick);\n                    removeEvent(this._o.trigger, 'focus', this._onInputFocus);\n                    removeEvent(this._o.trigger, 'blur', this._onInputBlur);\n                }\n            }\n            if (this.el.parentNode) {\n                this.el.parentNode.removeChild(this.el);\n            }\n        }\n\n    };\n\n    return Pikaday;\n\n}));\n"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/languages/all.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 8);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Switzerland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-CH'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Grösser als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Grösser gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Ausserhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Germany language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-DE'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Größer als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Größer gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Außerhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 15, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for English - United States language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'en-US'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Insert row above'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Insert row below'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Insert column left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Insert column right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Remove row', 'Remove rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Remove column', 'Remove columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Undo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Redo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Read only'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Clear column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alignment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Center'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justify'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Middle'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Freeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Unfreeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Borders'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Remove border(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Add comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edit comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Delete comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Read-only comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Merge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Unmerge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copy'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Cut'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Insert child row'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Detach from parent'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Hide column', 'Hide columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Show column', 'Show columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Hide row', 'Hide rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Show row', 'Show rows']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'None'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Is empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Is not empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Is equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Is not equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Begins with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Ends with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contains'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Does not contain'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Greater than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Greater than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Less than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Less than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Is between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Is not between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'After'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Before'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Today'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Tomorrow'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Yesterday'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Blank cells'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filter by condition'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filter by value'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'And'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Or'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Select all'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Clear'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancel'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Search'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Value'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Second value'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: hand-dot\n                                                                                                                                                                                                                   * Last updated: Jan 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Japanese - Japan language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ja-JP'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, '行を上に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, '行を下に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, '列を左に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, '列を右に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['行を削除', '行を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['列を削除', '列を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, '元に戻す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'やり直し'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, '読み取り専用'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, '列をクリア'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, '配置'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, '左揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, '中央揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, '右揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, '両端揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, '上揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, '中央揃え(垂直)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, '下揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, '列を固定'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, '列の固定を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, '枠線'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, '上'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, '右'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, '下'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, '左'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, '枠線を削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'コメントを追加'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'コメントを編集'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'コメントを削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, '読み取り専用コメント'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'セルを結合'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'セルの結合を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'コピー'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, '切り取り'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, '子の行を挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, '親の行と切り離す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['列を非表示', '列を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['列を表示', '列を表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['行を非表示', '行を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['行を表示', '行を表示']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'なし'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, '空白'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, '空白ではない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, '次と等しい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, '次と等しくない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, '次で始まる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, '次で終わる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, '次を含む'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, '次を含まない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, '次より大きい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, '以上'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, '次より小さい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, '以下'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, '次の間にある'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, '次の間にない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, '次より後の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, '次より前の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, '今日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, '明日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, '昨日'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, '空白のセル'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, '条件でフィルタ'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, '値でフィルタ'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'かつ'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'もしくは'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'すべて選択'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'クリア'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'キャンセル'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, '検索'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, '値'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, '値2'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 17, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Polish - Poland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pl-PL'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Wstaw wiersz powyżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Wstaw wiersz poniżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Wstaw kolumnę z lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Wstaw kolumnę z prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Usuń wiersz', 'Usuń wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Usuń kolumnę', 'Usuń kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Cofnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Ponów'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Wyczyść kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Wyrównanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Do lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Do środka'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Do prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Wyjustuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Do góry'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Wyśrodkuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Do dołu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Zablokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Odblokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Obramowanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Krawędź górna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Krawędź prawa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Krawędź dolna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Krawędź lewa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Usuń obramowanie(a)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Dodaj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edytuj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Usuń komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Komentarz tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Scal komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Rozdziel komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopiuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Wytnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Wstaw wiersz podrzędny'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Odłącz od nadrzędnego'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ukryj kolumnę', 'Ukryj kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Pokaż kolumnę', 'Pokaż kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ukryj wiersz', 'Ukryj wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Pokaż wiersz', 'Pokaż wiersze']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Brak'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Komórka jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Komórka nie jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Jest równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Jest różne od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Tekst zaczyna się od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Tekst kończy się na'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Tekst zawiera fragment'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Tekst nie zawiera fragmentu'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Większe niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Większe lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Mniejsze niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Mniejsze lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Nie jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Data późniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Data wcześniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Dzisiaj'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Jutro'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Wczoraj'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Puste miejsca'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtruj wg warunku'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtruj wg wartości'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Oraz'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Lub'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Zaznacz wszystko'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Wyczyść'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Anuluj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Szukaj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wartość'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Druga wartość'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Júlio C. Zuppa\n                                                                                                                                                                                                                   * Last updated: Jan 12, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Portuguese - Brazil language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pt-BR'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Inserir linha acima'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Inserir linha abaixo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Inserir coluna esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Inserir coluna direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Excluir linha', 'Excluir linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Excluir coluna', 'Excluir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Desfazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Refazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Limpar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alinhamento'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Centralizado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justificado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Meio'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Congelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Descongelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Bordas'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Excluir bordas(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Incluir comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Editar comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Remover comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Comentário somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Mesclar células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Desfazer mesclagem de células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copiar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Recortar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Inserir linha filha'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Desanexar da linha pai'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ocultar coluna', 'Ocultar colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Exibir coluna', 'Exibir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ocultar linha', 'Ocultar linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Exibir linha', 'Exibir linhas']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Nenhum'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'É vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Não é vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'É igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'É diferente de'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Começa com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Termina com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Não contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Maior que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Menor que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Não está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Depois'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Antes'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Hoje'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Amanhã'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Ontem'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Células vazias'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtrar por condição'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtrar por valor'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'E'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Ou'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Selecionar tudo'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Limpar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancelar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Localizar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Valor'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Segundo valor'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Alexey Rogachev\n                                                                                                                                                                                                                   * Last updated: Feb 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Russian - Russia language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ru-RU'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Вставить строку выше'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Вставить строку ниже'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Вставить столбец слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Вставить столбец справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Удалить строку', 'Удалить строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Удалить столбец', 'Удалить столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Отменить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Повторить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Очистить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Выравнивание'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'По левому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'По правому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'По ширине'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'По верхнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'По нижнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Закрепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Открепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Границы'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Сверху'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Снизу'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Удалить границу(ы)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Добавить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Редактировать комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Удалить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Комментарий только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Объединить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Разделить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Копировать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Вырезать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Вставить дочернюю строку'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Отделить от родителя'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Скрыть столбец', 'Скрыть столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Показать столбец', 'Показать столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Скрыть строку', 'Скрыть строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Показать строку', 'Показать строки']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Отсутствует'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Не пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Не равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Начинается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Заканчивается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Не содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Больше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Больше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Меньше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Меньше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Не между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'После'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'До'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Сегодня'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Завтра'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Вчера'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Пустые ячейки'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Фильтр по условию'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Фильтр по значению'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'И'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Или'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Выбрать все'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Убрать'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Отмена'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Поиск'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Значение'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Второе значение'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.ruRU = exports.ptBR = exports.plPL = exports.jaJP = exports.enUS = exports.deDE = exports.deCH = undefined;\n\nvar _deCH = __webpack_require__(1);\n\nvar _deCH2 = _interopRequireDefault(_deCH);\n\nvar _deDE = __webpack_require__(2);\n\nvar _deDE2 = _interopRequireDefault(_deDE);\n\nvar _enUS = __webpack_require__(3);\n\nvar _enUS2 = _interopRequireDefault(_enUS);\n\nvar _jaJP = __webpack_require__(4);\n\nvar _jaJP2 = _interopRequireDefault(_jaJP);\n\nvar _plPL = __webpack_require__(5);\n\nvar _plPL2 = _interopRequireDefault(_plPL);\n\nvar _ptBR = __webpack_require__(6);\n\nvar _ptBR2 = _interopRequireDefault(_ptBR);\n\nvar _ruRU = __webpack_require__(7);\n\nvar _ruRU2 = _interopRequireDefault(_ruRU);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.deCH = _deCH2.default;\nexports.deDE = _deDE2.default;\nexports.enUS = _enUS2.default;\nexports.jaJP = _jaJP2.default;\nexports.plPL = _plPL2.default;\nexports.ptBR = _ptBR2.default;\nexports.ruRU = _ruRU2.default; /* eslint-disable import/prefer-default-export */\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/languages/de-CH.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 1);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Switzerland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-CH'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Grösser als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Grösser gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Ausserhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/languages/de-DE.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 2);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */,\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Germany language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-DE'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Größer als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Größer gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Außerhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/languages/en-US.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 3);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */,\n/* 2 */,\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 15, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for English - United States language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'en-US'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Insert row above'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Insert row below'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Insert column left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Insert column right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Remove row', 'Remove rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Remove column', 'Remove columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Undo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Redo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Read only'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Clear column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alignment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Center'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justify'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Middle'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Freeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Unfreeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Borders'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Remove border(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Add comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edit comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Delete comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Read-only comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Merge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Unmerge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copy'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Cut'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Insert child row'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Detach from parent'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Hide column', 'Hide columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Show column', 'Show columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Hide row', 'Hide rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Show row', 'Show rows']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'None'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Is empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Is not empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Is equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Is not equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Begins with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Ends with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contains'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Does not contain'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Greater than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Greater than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Less than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Less than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Is between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Is not between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'After'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Before'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Today'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Tomorrow'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Yesterday'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Blank cells'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filter by condition'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filter by value'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'And'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Or'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Select all'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Clear'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancel'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Search'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Value'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Second value'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/languages/index.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 8);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Switzerland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-CH'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Grösser als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Grösser gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Ausserhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Stefan Salzl\n                                                                                                                                                                                                                   * Last updated: Jan 08, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for German - Germany language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'de-DE'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Zeile einfügen oberhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Zeile einfügen unterhalb'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Spalte einfügen links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Spalte einfügen rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Zeile löschen', 'Zeilen löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Spalte löschen', 'Spalten löschen']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Rückgangig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Wiederholen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Nur Lesezugriff'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Spalteninhalt löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Ausrichtung'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Linksbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Zentriert'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Rechtsbündig'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Blocksatz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Mitte'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Spalte fixieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Spaltenfixierung aufheben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Oben'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Rechts'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Unten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Links'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Kein Rahmen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Kommentar hinzufügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Kommentar bearbeiten'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Kommentar löschen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Schreibschutz Kommentar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Zellen verbinden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Zellen teilen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopieren'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Ausschneiden'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Nachfolgerzeile einfügen'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Von Vorgängerzeile abkoppeln'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Spalte ausblenden', 'Spalten ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Spalte einblenden', 'Spalten einblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Zeile ausblenden', 'Zeilen ausblenden']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Zeile einblenden', 'Zeilen einblenden']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Kein Filter'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Ist leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Ist nicht leer'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Ist gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Ist ungleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Beginnt mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Endet mit'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Enthält'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Enthält nicht'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Größer als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Größer gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Kleiner als'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Kleiner gleich'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Zwischen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Außerhalb'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Nach'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Vor'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Heute'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Morgen'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Gestern'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Leere Zellen'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Per Bedingung filtern'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Nach Zahlen filtern'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Und'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Oder'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Alles auswählen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Auswahl aufheben'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Abbrechen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Suchen'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wert'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Alternativwert'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 15, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for English - United States language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'en-US'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Insert row above'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Insert row below'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Insert column left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Insert column right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Remove row', 'Remove rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Remove column', 'Remove columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Undo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Redo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Read only'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Clear column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alignment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Center'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justify'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Middle'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Freeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Unfreeze column'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Borders'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Top'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Right'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Bottom'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Left'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Remove border(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Add comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edit comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Delete comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Read-only comment'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Merge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Unmerge cells'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copy'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Cut'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Insert child row'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Detach from parent'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Hide column', 'Hide columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Show column', 'Show columns']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Hide row', 'Hide rows']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Show row', 'Show rows']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'None'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Is empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Is not empty'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Is equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Is not equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Begins with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Ends with'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contains'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Does not contain'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Greater than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Greater than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Less than'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Less than or equal to'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Is between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Is not between'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'After'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Before'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Today'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Tomorrow'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Yesterday'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Blank cells'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filter by condition'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filter by value'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'And'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Or'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Select all'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Clear'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancel'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Search'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Value'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Second value'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: hand-dot\n                                                                                                                                                                                                                   * Last updated: Jan 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Japanese - Japan language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ja-JP'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, '行を上に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, '行を下に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, '列を左に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, '列を右に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['行を削除', '行を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['列を削除', '列を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, '元に戻す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'やり直し'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, '読み取り専用'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, '列をクリア'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, '配置'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, '左揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, '中央揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, '右揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, '両端揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, '上揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, '中央揃え(垂直)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, '下揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, '列を固定'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, '列の固定を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, '枠線'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, '上'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, '右'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, '下'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, '左'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, '枠線を削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'コメントを追加'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'コメントを編集'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'コメントを削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, '読み取り専用コメント'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'セルを結合'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'セルの結合を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'コピー'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, '切り取り'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, '子の行を挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, '親の行と切り離す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['列を非表示', '列を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['列を表示', '列を表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['行を非表示', '行を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['行を表示', '行を表示']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'なし'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, '空白'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, '空白ではない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, '次と等しい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, '次と等しくない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, '次で始まる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, '次で終わる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, '次を含む'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, '次を含まない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, '次より大きい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, '以上'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, '次より小さい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, '以下'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, '次の間にある'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, '次の間にない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, '次より後の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, '次より前の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, '今日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, '明日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, '昨日'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, '空白のセル'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, '条件でフィルタ'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, '値でフィルタ'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'かつ'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'もしくは'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'すべて選択'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'クリア'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'キャンセル'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, '検索'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, '値'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, '値2'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 17, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Polish - Poland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pl-PL'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Wstaw wiersz powyżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Wstaw wiersz poniżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Wstaw kolumnę z lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Wstaw kolumnę z prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Usuń wiersz', 'Usuń wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Usuń kolumnę', 'Usuń kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Cofnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Ponów'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Wyczyść kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Wyrównanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Do lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Do środka'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Do prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Wyjustuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Do góry'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Wyśrodkuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Do dołu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Zablokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Odblokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Obramowanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Krawędź górna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Krawędź prawa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Krawędź dolna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Krawędź lewa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Usuń obramowanie(a)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Dodaj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edytuj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Usuń komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Komentarz tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Scal komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Rozdziel komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopiuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Wytnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Wstaw wiersz podrzędny'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Odłącz od nadrzędnego'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ukryj kolumnę', 'Ukryj kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Pokaż kolumnę', 'Pokaż kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ukryj wiersz', 'Ukryj wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Pokaż wiersz', 'Pokaż wiersze']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Brak'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Komórka jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Komórka nie jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Jest równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Jest różne od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Tekst zaczyna się od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Tekst kończy się na'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Tekst zawiera fragment'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Tekst nie zawiera fragmentu'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Większe niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Większe lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Mniejsze niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Mniejsze lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Nie jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Data późniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Data wcześniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Dzisiaj'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Jutro'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Wczoraj'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Puste miejsca'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtruj wg warunku'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtruj wg wartości'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Oraz'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Lub'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Zaznacz wszystko'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Wyczyść'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Anuluj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Szukaj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wartość'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Druga wartość'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Júlio C. Zuppa\n                                                                                                                                                                                                                   * Last updated: Jan 12, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Portuguese - Brazil language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pt-BR'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Inserir linha acima'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Inserir linha abaixo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Inserir coluna esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Inserir coluna direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Excluir linha', 'Excluir linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Excluir coluna', 'Excluir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Desfazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Refazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Limpar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alinhamento'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Centralizado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justificado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Meio'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Congelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Descongelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Bordas'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Excluir bordas(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Incluir comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Editar comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Remover comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Comentário somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Mesclar células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Desfazer mesclagem de células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copiar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Recortar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Inserir linha filha'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Desanexar da linha pai'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ocultar coluna', 'Ocultar colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Exibir coluna', 'Exibir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ocultar linha', 'Ocultar linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Exibir linha', 'Exibir linhas']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Nenhum'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'É vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Não é vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'É igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'É diferente de'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Começa com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Termina com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Não contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Maior que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Menor que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Não está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Depois'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Antes'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Hoje'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Amanhã'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Ontem'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Células vazias'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtrar por condição'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtrar por valor'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'E'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Ou'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Selecionar tudo'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Limpar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancelar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Localizar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Valor'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Segundo valor'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Alexey Rogachev\n                                                                                                                                                                                                                   * Last updated: Feb 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Russian - Russia language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ru-RU'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Вставить строку выше'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Вставить строку ниже'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Вставить столбец слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Вставить столбец справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Удалить строку', 'Удалить строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Удалить столбец', 'Удалить столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Отменить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Повторить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Очистить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Выравнивание'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'По левому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'По правому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'По ширине'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'По верхнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'По нижнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Закрепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Открепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Границы'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Сверху'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Снизу'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Удалить границу(ы)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Добавить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Редактировать комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Удалить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Комментарий только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Объединить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Разделить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Копировать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Вырезать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Вставить дочернюю строку'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Отделить от родителя'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Скрыть столбец', 'Скрыть столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Показать столбец', 'Показать столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Скрыть строку', 'Скрыть строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Показать строку', 'Показать строки']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Отсутствует'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Не пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Не равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Начинается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Заканчивается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Не содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Больше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Больше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Меньше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Меньше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Не между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'После'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'До'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Сегодня'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Завтра'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Вчера'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Пустые ячейки'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Фильтр по условию'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Фильтр по значению'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'И'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Или'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Выбрать все'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Убрать'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Отмена'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Поиск'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Значение'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Второе значение'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.ruRU = exports.ptBR = exports.plPL = exports.jaJP = exports.enUS = exports.deDE = exports.deCH = undefined;\n\nvar _deCH = __webpack_require__(1);\n\nvar _deCH2 = _interopRequireDefault(_deCH);\n\nvar _deDE = __webpack_require__(2);\n\nvar _deDE2 = _interopRequireDefault(_deDE);\n\nvar _enUS = __webpack_require__(3);\n\nvar _enUS2 = _interopRequireDefault(_enUS);\n\nvar _jaJP = __webpack_require__(4);\n\nvar _jaJP2 = _interopRequireDefault(_jaJP);\n\nvar _plPL = __webpack_require__(5);\n\nvar _plPL2 = _interopRequireDefault(_plPL);\n\nvar _ptBR = __webpack_require__(6);\n\nvar _ptBR2 = _interopRequireDefault(_ptBR);\n\nvar _ruRU = __webpack_require__(7);\n\nvar _ruRU2 = _interopRequireDefault(_ruRU);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.deCH = _deCH2.default;\nexports.deDE = _deDE2.default;\nexports.enUS = _enUS2.default;\nexports.jaJP = _jaJP2.default;\nexports.plPL = _plPL2.default;\nexports.ptBR = _ptBR2.default;\nexports.ruRU = _ruRU2.default; /* eslint-disable import/prefer-default-export */\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/languages/ja-JP.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 4);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */,\n/* 2 */,\n/* 3 */,\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: hand-dot\n                                                                                                                                                                                                                   * Last updated: Jan 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Japanese - Japan language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ja-JP'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, '行を上に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, '行を下に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, '列を左に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, '列を右に挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['行を削除', '行を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['列を削除', '列を削除']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, '元に戻す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'やり直し'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, '読み取り専用'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, '列をクリア'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, '配置'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, '左揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, '中央揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, '右揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, '両端揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, '上揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, '中央揃え(垂直)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, '下揃え'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, '列を固定'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, '列の固定を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, '枠線'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, '上'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, '右'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, '下'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, '左'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, '枠線を削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'コメントを追加'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'コメントを編集'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'コメントを削除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, '読み取り専用コメント'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'セルを結合'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'セルの結合を解除'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'コピー'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, '切り取り'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, '子の行を挿入'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, '親の行と切り離す'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['列を非表示', '列を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['列を表示', '列を表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['行を非表示', '行を非表示']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['行を表示', '行を表示']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'なし'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, '空白'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, '空白ではない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, '次と等しい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, '次と等しくない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, '次で始まる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, '次で終わる'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, '次を含む'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, '次を含まない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, '次より大きい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, '以上'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, '次より小さい'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, '以下'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, '次の間にある'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, '次の間にない'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, '次より後の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, '次より前の日付'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, '今日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, '明日'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, '昨日'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, '空白のセル'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, '条件でフィルタ'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, '値でフィルタ'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'かつ'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'もしくは'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'すべて選択'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'クリア'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'キャンセル'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, '検索'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, '値'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, '値2'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n/******/ ])[\"___\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/languages/pl-PL.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 5);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n\n/***/ 5:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Handsoncode\n                                                                                                                                                                                                                   * Last updated: Nov 17, 2017\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Polish - Poland language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pl-PL'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Wstaw wiersz powyżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Wstaw wiersz poniżej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Wstaw kolumnę z lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Wstaw kolumnę z prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Usuń wiersz', 'Usuń wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Usuń kolumnę', 'Usuń kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Cofnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Ponów'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Wyczyść kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Wyrównanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Do lewej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Do środka'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Do prawej'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Wyjustuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Do góry'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Wyśrodkuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Do dołu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Zablokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Odblokuj kolumnę'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Obramowanie'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Krawędź górna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Krawędź prawa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Krawędź dolna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Krawędź lewa'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Usuń obramowanie(a)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Dodaj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Edytuj komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Usuń komentarz'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Komentarz tylko do odczytu'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Scal komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Rozdziel komórki'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Kopiuj'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Wytnij'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Wstaw wiersz podrzędny'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Odłącz od nadrzędnego'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ukryj kolumnę', 'Ukryj kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Pokaż kolumnę', 'Pokaż kolumny']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ukryj wiersz', 'Ukryj wiersze']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Pokaż wiersz', 'Pokaż wiersze']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Brak'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Komórka jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Komórka nie jest pusta'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Jest równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Jest różne od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Tekst zaczyna się od'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Tekst kończy się na'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Tekst zawiera fragment'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Tekst nie zawiera fragmentu'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Większe niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Większe lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Mniejsze niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Mniejsze lub równe'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Nie jest pomiędzy'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Data późniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Data wcześniejsza niż'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Dzisiaj'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Jutro'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Wczoraj'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Puste miejsca'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtruj wg warunku'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtruj wg wartości'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'Oraz'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Lub'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Zaznacz wszystko'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Wyczyść'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Anuluj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Szukaj'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Wartość'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Druga wartość'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n\n/******/ })[\"___\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/languages/pt-BR.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 6);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n\n/***/ 6:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Júlio C. Zuppa\n                                                                                                                                                                                                                   * Last updated: Jan 12, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Portuguese - Brazil language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'pt-BR'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Inserir linha acima'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Inserir linha abaixo'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Inserir coluna esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Inserir coluna direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Excluir linha', 'Excluir linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Excluir coluna', 'Excluir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Desfazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Refazer'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Limpar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Alinhamento'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'Centralizado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'Justificado'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'Meio'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Congelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Descongelar coluna'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Bordas'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Superior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Direita'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Inferior'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Esquerda'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Excluir bordas(s)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Incluir comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Editar comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Remover comentário'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Comentário somente leitura'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Mesclar células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Desfazer mesclagem de células'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Copiar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Recortar'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Inserir linha filha'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Desanexar da linha pai'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Ocultar coluna', 'Ocultar colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Exibir coluna', 'Exibir colunas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Ocultar linha', 'Ocultar linhas']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Exibir linha', 'Exibir linhas']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Nenhum'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'É vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Não é vazio'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'É igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'É diferente de'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Começa com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Termina com'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Não contém'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Maior que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Menor que'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Maior ou igual a'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Não está entre'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'Depois'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'Antes'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Hoje'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Amanhã'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Ontem'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Células vazias'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Filtrar por condição'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Filtrar por valor'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'E'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Ou'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Selecionar tudo'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Limpar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Cancelar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Localizar'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Valor'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Segundo valor'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n\n/******/ })[\"___\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/handsontable/languages/ru-RU.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"../../handsontable\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"../../handsontable\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"../../handsontable\")) : factory(root[\"Handsontable\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 7);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n\n/***/ 7:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _dictionary;\n\nvar _handsontable = __webpack_require__(0);\n\nvar _handsontable2 = _interopRequireDefault(_handsontable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**\n                                                                                                                                                                                                                   * @preserve\n                                                                                                                                                                                                                   * Authors: Alexey Rogachev\n                                                                                                                                                                                                                   * Last updated: Feb 28, 2018\n                                                                                                                                                                                                                   *\n                                                                                                                                                                                                                   * Description: Definition file for Russian - Russia language-country.\n                                                                                                                                                                                                                   */\n\n\nvar C = _handsontable2.default.languages.dictionaryKeys;\n\nvar dictionary = (_dictionary = {\n  languageCode: 'ru-RU'\n}, _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_ABOVE, 'Вставить строку выше'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ROW_BELOW, 'Вставить строку ниже'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_LEFT, 'Вставить столбец слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_INSERT_RIGHT, 'Вставить столбец справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_ROW, ['Удалить строку', 'Удалить строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, ['Удалить столбец', 'Удалить столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNDO, 'Отменить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REDO, 'Повторить'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY, 'Только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CLEAR_COLUMN, 'Очистить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT, 'Выравнивание'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT, 'По левому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT, 'По правому краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY, 'По ширине'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_TOP, 'По верхнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE, 'По центру'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM, 'По нижнему краю'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_FREEZE_COLUMN, 'Закрепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN, 'Открепить столбец'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS, 'Границы'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_TOP, 'Сверху'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_RIGHT, 'Справа'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_BOTTOM, 'Снизу'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_BORDERS_LEFT, 'Слева'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_BORDERS, 'Удалить границу(ы)'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_ADD_COMMENT, 'Добавить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_EDIT_COMMENT, 'Редактировать комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_REMOVE_COMMENT, 'Удалить комментарий'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT, 'Комментарий только для чтения'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_MERGE_CELLS, 'Объединить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_UNMERGE_CELLS, 'Разделить ячейки'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_COPY, 'Копировать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_CUT, 'Вырезать'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD, 'Вставить дочернюю строку'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD, 'Отделить от родителя'), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_COLUMN, ['Скрыть столбец', 'Скрыть столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_COLUMN, ['Показать столбец', 'Показать столбцы']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_HIDE_ROW, ['Скрыть строку', 'Скрыть строки']), _defineProperty(_dictionary, C.CONTEXTMENU_ITEMS_SHOW_ROW, ['Показать строку', 'Показать строки']), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NONE, 'Отсутствует'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EMPTY, 'Пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EMPTY, 'Не пусто'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_EQUAL, 'Равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_EQUAL, 'Не равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEGINS_WITH, 'Начинается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_ENDS_WITH, 'Заканчивается на'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_CONTAINS, 'Содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_CONTAIN, 'Не содержит'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN, 'Больше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL, 'Больше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN, 'Меньше чем'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL, 'Меньше или равно'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BETWEEN, 'Между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_NOT_BETWEEN, 'Не между'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_AFTER, 'После'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_BEFORE, 'До'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TODAY, 'Сегодня'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_TOMORROW, 'Завтра'), _defineProperty(_dictionary, C.FILTERS_CONDITIONS_YESTERDAY, 'Вчера'), _defineProperty(_dictionary, C.FILTERS_VALUES_BLANK_CELLS, 'Пустые ячейки'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_CONDITION, 'Фильтр по условию'), _defineProperty(_dictionary, C.FILTERS_DIVS_FILTER_BY_VALUE, 'Фильтр по значению'), _defineProperty(_dictionary, C.FILTERS_LABELS_CONJUNCTION, 'И'), _defineProperty(_dictionary, C.FILTERS_LABELS_DISJUNCTION, 'Или'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_SELECT_ALL, 'Выбрать все'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CLEAR, 'Убрать'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_OK, 'OK'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_CANCEL, 'Отмена'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SEARCH, 'Поиск'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_VALUE, 'Значение'), _defineProperty(_dictionary, C.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE, 'Второе значение'), _dictionary);\n\n_handsontable2.default.languages.registerLanguageDictionary(dictionary);\n\nexports.default = dictionary;\n\n/***/ })\n\n/******/ })[\"___\"];\n});"
  },
  {
    "path": "pages/include/SheetJS/del/js/dropsheet.js",
    "content": "/* dropsheet.js (C) 2014-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n\nvar DropSheet = function DropSheet(opts) {\n\tif(!opts) opts = {};\n\tvar nullfunc = function(){};\n\tif(!opts.errors) opts.errors = {};\n\tif(!opts.errors.badfile) opts.errors.badfile = nullfunc;\n\tif(!opts.errors.pending) opts.errors.pending = nullfunc;\n\tif(!opts.errors.failed) opts.errors.failed = nullfunc;\n\tif(!opts.errors.large) opts.errors.large = nullfunc;\n\tif(!opts.on) opts.on = {};\n\tif(!opts.on.workstart) opts.on.workstart = nullfunc;\n\tif(!opts.on.workend) opts.on.workend = nullfunc;\n\tif(!opts.on.sheet) opts.on.sheet = nullfunc;\n\tif(!opts.on.wb) opts.on.wb = nullfunc;\n\n\tvar rABS = typeof FileReader !== 'undefined' && FileReader.prototype && FileReader.prototype.readAsBinaryString;\n\tvar useworker = typeof Worker !== 'undefined';\n\tvar pending = false;\n\tfunction fixdata(data) {\n\t\tvar o = \"\", l = 0, w = 10240;\n\t\tfor(; l<data.byteLength/w; ++l)\n\t\t\to+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));\n\t\to+=String.fromCharCode.apply(null, new Uint8Array(data.slice(o.length)));\n\t\treturn o;\n\t}\n\n\tfunction sheetjsw(data, cb, readtype) {\n\t\tpending = true;\n\t\topts.on.workstart();\n\t\tvar scripts = document.getElementsByTagName('script');\n\t\tvar dropsheetPath;\n\t\tfor (var i = 0; i < scripts.length; i++) {\n\t\t\tif (scripts[i].src.indexOf('dropsheet') != -1) {\n\t\t\t\tdropsheetPath = scripts[i].src.split('dropsheet.js')[0];\n\t\t\t}\n\t\t}\n\t\tvar worker = new Worker(dropsheetPath + 'sheetjsw.js');\n\t\tworker.onmessage = function(e) {\n\t\t\tswitch(e.data.t) {\n\t\t\t\tcase 'ready': break;\n\t\t\t\tcase 'e': pending = false; console.error(e.data.d); break;\n\t\t\t\tcase 'xlsx':\n\t\t\t\t\tpending = false;\n\t\t\t\t\topts.on.workend();\n\t\t\t\t\tcb(JSON.parse(e.data.d)); break;\n\t\t\t}\n\t\t};\n\t\tworker.postMessage({d:data,b:readtype,t:'xlsx'});\n\t}\n\n\tvar last_wb;\n\n\tfunction to_json(workbook) {\n\t\tif(useworker && workbook.SSF) XLSX.SSF.load_table(workbook.SSF);\n\t\tvar result = {};\n\t\tworkbook.SheetNames.forEach(function(sheetName) {\n\t\t\tvar roa = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName], {header:1});\n\t\t\tif(roa.length > 0) result[sheetName] = roa;\n\t\t});\n\t\treturn result;\n\t}\n\n\tfunction choose_sheet(sheetidx) { process_wb(last_wb, sheetidx); }\n\n\tfunction process_wb(wb, sheetidx) {\n\t\tlast_wb = wb;\n\t\topts.on.wb(wb, sheetidx);\n\t\tvar sheet = wb.SheetNames[sheetidx||0];\n\t\tvar json = to_json(wb)[sheet];\n\t\topts.on.sheet(json, wb.SheetNames, choose_sheet);\n\t}\n\n\tfunction handleDrop(e) {\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t\tif(pending) return opts.errors.pending();\n\t\tvar files = e.dataTransfer.files;\n\t\tvar i,f;\n\t\tfor (i = 0, f = files[i]; i != files.length; ++i) {\n\t\t\tvar reader = new FileReader();\n\t\t\tvar name = f.name;\n\t\t\treader.onload = function(e) {\n\t\t\t\tvar data = e.target.result;\n\t\t\t\tvar wb, arr;\n\t\t\t\tvar readtype = {type: rABS ? 'binary' : 'base64' };\n\t\t\t\tif(!rABS) {\n\t\t\t\t\tarr = fixdata(data);\n\t\t\t\t\tdata = btoa(arr);\n\t\t\t\t}\n\t\t\t\tfunction doit() {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif(useworker) { sheetjsw(data, process_wb, readtype); return; }\n\t\t\t\t\t\twb = XLSX.read(data, readtype);\n\t\t\t\t\t\tprocess_wb(wb);\n\t\t\t\t\t} catch(e) { console.log(e); opts.errors.failed(e); }\n\t\t\t\t}\n\n\t\t\t\tif(e.target.result.length > 1e6) opts.errors.large(e.target.result.length, function(e) { if(e) doit(); });\n\t\t\t\telse { doit(); }\n\t\t\t};\n\t\t\tif(rABS) reader.readAsBinaryString(f);\n\t\t\telse reader.readAsArrayBuffer(f);\n\t\t}\n\t}\n\n\tfunction handleDragover(e) {\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t\te.dataTransfer.dropEffect = 'copy';\n\t}\n\n\tif(opts.drop.addEventListener) {\n\t\topts.drop.addEventListener('dragenter', handleDragover, false);\n\t\topts.drop.addEventListener('dragover', handleDragover, false);\n\t\topts.drop.addEventListener('drop', handleDrop, false);\n\t}\n\n};\n"
  },
  {
    "path": "pages/include/SheetJS/del/js/main.js",
    "content": "/** drop target **/\nvar _target = document.getElementById('drop');\n\n/** Spinner **/\nvar spinner;\n\nvar _workstart = function() { spinner = new Spinner().spin(_target); }\nvar _workend = function() { spinner.stop(); }\n\n/** Alerts **/\nvar _badfile = function() {\n  alertify.alert('This file does not appear to be a valid Excel file.  If we made a mistake, please send this file to <a href=\"mailto:dev@sheetjs.com?subject=I+broke+your+stuff\">dev@sheetjs.com</a> so we can take a look.', function(){});\n};\n\nvar _pending = function() {\n  alertify.alert('Please wait until the current file is processed.', function(){});\n};\n\nvar _large = function(len, cb) {\n  alertify.confirm(\"This file is \" + len + \" bytes and may take a few moments.  Your browser may lock up during this process.  Shall we play?\", cb);\n};\n\nvar _failed = function(e) {\n  console.log(e, e.stack);\n  alertify.alert('We unfortunately dropped the ball here.  We noticed some issues with the grid recently, so please test the file using the <a href=\"/js-xlsx/\">raw parser</a>.  If there are issues with the file processor, please send this file to <a href=\"mailto:dev@sheetjs.com?subject=I+broke+your+stuff\">dev@sheetjs.com</a> so we can make things right.', function(){});\n};\n\n/** Handsontable magic **/\nvar boldRenderer = function (instance, td, row, col, prop, value, cellProperties) {\n  Handsontable.TextCell.renderer.apply(this, arguments);\n  $(td).css({'font-weight': 'bold'});\n};\n\nvar $container, $parent, $window, availableWidth, availableHeight;\nvar calculateSize = function () {\n  var offset = $container.offset();\n  availableWidth = Math.max($window.width() - 250,600);\n  availableHeight = Math.max($window.height() - 250, 400);\n};\n\n$(document).ready(function() {\n  $container = $(\"#hot\"); $parent = $container.parent();\n  $window = $(window);\n  $window.on('resize', calculateSize);\n});\n\n/* make the buttons for the sheets */\nvar make_buttons = function(sheetnames, cb) {\n  var $buttons = $('#buttons');\n  $buttons.html(\"\");\n  sheetnames.forEach(function(s,idx) {\n    var button= $('<button/>').attr({ type:'button', name:'btn' +idx, text:s });\n    button.append('<h3>' + s + '</h3>');\n    button.click(function() { cb(idx); });\n    $buttons.append(button);\n    $buttons.append('<br/>');\n  });\n};\n\nvar _onsheet = function(json, sheetnames, select_sheet_cb) {\n  //$('#footnote').hide();\n\n  make_buttons(sheetnames, select_sheet_cb);\n  calculateSize();\n\n  /* add header row for table */\n  if(!json) json = [];\n\tjson.forEach(function(r) { \n    if(json[0].length < r.length) json[0].length = r.length; \n  });\n  calculateSize();\n  /* showtime! */\n  $(\"#hot\").handsontable({\n    data: json,\n    startRows: 5,\n    startCols: 3,\n    stretchH: 'all',\n    rowHeaders: true,\n    colHeaders: true,\n    width: function () { return availableWidth; },\n    height: function () { return availableHeight; },\n    stretchH: 'all'\n  });\n};\n\n/** Drop it like it's hot **/\nDropSheet({\n  drop: _target,\n  on: {\n    workstart: _workstart,\n    workend: _workend,\n    sheet: _onsheet,\n    foo: 'bar'\n  },\n  errors: {\n    badfile: _badfile,\n    pending: _pending,\n    failed: _failed,\n    large: _large,\n    foo: 'bar'\n  }\n})\n"
  },
  {
    "path": "pages/include/SheetJS/del/js/sheetjsw.js",
    "content": "importScripts('xlsx.full.min.js');\npostMessage({t:'ready'});\nonmessage = function(evt) {\n  var v;\n  try { v = XLSX.read(evt.data.d, evt.data.b); }\n  catch(e) { postMessage({t:\"e\",d:e.stack}); }\n  postMessage({t:evt.data.t, d:JSON.stringify(v)});\n}\n"
  },
  {
    "path": "pages/include/SheetJS/del/js/shim.js",
    "content": "// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys\nif (!Object.keys) {\n  Object.keys = (function () {\n    var hasOwnProperty = Object.prototype.hasOwnProperty,\n        hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),\n        dontEnums = [\n          'toString',\n          'toLocaleString',\n          'valueOf',\n          'hasOwnProperty',\n          'isPrototypeOf',\n          'propertyIsEnumerable',\n          'constructor'\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    return function (obj) {\n      if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');\n\n      var result = [];\n\n      for (var prop in obj) {\n        if (hasOwnProperty.call(obj, prop)) result.push(prop);\n      }\n\n      if (hasDontEnumBug) {\n        for (var i=0; i < dontEnumsLength; i++) {\n          if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);\n        }\n      }\n      return result;\n    };\n  })();\n}\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter\nif (!Array.prototype.filter)\n{\n  Array.prototype.filter = function(fun /*, thisp */)\n  {\n    \"use strict\";\n\n    if (this == null)\n      throw new TypeError();\n\n    var t = Object(this);\n    var len = t.length >>> 0;\n    if (typeof fun != \"function\")\n      throw new TypeError();\n\n    var res = [];\n    var thisp = arguments[1];\n    for (var i = 0; i < len; i++)\n    {\n      if (i in t)\n      {\n        var val = t[i]; // in case fun mutates this\n        if (fun.call(thisp, val, i, t))\n          res.push(val);\n      }\n    }\n\n    return res;\n  };\n}\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim\nif (!String.prototype.trim) {\n  String.prototype.trim = function () {\n    return this.replace(/^\\s+|\\s+$/g, '');\n  };\n}\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach\nif (!Array.prototype.forEach)\n{\n  Array.prototype.forEach = function(fun /*, thisArg */)\n  {\n    \"use strict\";\n\n    if (this === void 0 || this === null)\n      throw new TypeError();\n\n    var t = Object(this);\n    var len = t.length >>> 0;\n    if (typeof fun !== \"function\")\n      throw new TypeError();\n\n    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n    for (var i = 0; i < len; i++)\n    {\n      if (i in t)\n        fun.call(thisArg, t[i], i, t);\n    }\n  };\n}\n\n// Production steps of ECMA-262, Edition 5, 15.4.4.19\n// Reference: http://es5.github.com/#x15.4.4.19\nif (!Array.prototype.map) {\n  Array.prototype.map = function(callback, thisArg) {\n\n    var T, A, k;\n\n    if (this == null) {\n      throw new TypeError(\" this is null or not defined\");\n    }\n\n    // 1. Let O be the result of calling ToObject passing the |this| value as the argument.\n    var O = Object(this);\n\n    // 2. Let lenValue be the result of calling the Get internal method of O with the argument \"length\".\n    // 3. Let len be ToUint32(lenValue).\n    var len = O.length >>> 0;\n\n    // 4. If IsCallable(callback) is false, throw a TypeError exception.\n    // See: http://es5.github.com/#x9.11\n    if (typeof callback !== \"function\") {\n      throw new TypeError(callback + \" is not a function\");\n    }\n\n    // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.\n    if (thisArg) {\n      T = thisArg;\n    }\n\n    // 6. Let A be a new array created as if by the expression new Array(len) where Array is\n    // the standard built-in constructor with that name and len is the value of len.\n    A = new Array(len);\n\n    // 7. Let k be 0\n    k = 0;\n\n    // 8. Repeat, while k < len\n    while(k < len) {\n\n      var kValue, mappedValue;\n\n      // a. Let Pk be ToString(k).\n      //   This is implicit for LHS operands of the in operator\n      // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.\n      //   This step can be combined with c\n      // c. If kPresent is true, then\n      if (k in O) {\n\n        // i. Let kValue be the result of calling the Get internal method of O with argument Pk.\n        kValue = O[ k ];\n\n        // ii. Let mappedValue be the result of calling the Call internal method of callback\n        // with T as the this value and argument list containing kValue, k, and O.\n        mappedValue = callback.call(T, kValue, k, O);\n\n        // iii. Call the DefineOwnProperty internal method of A with arguments\n        // Pk, Property Descriptor {Value: mappedValue, : true, Enumerable: true, Configurable: true},\n        // and false.\n\n        // In browsers that support Object.defineProperty, use the following:\n        // Object.defineProperty(A, Pk, { value: mappedValue, writable: true, enumerable: true, configurable: true });\n\n        // For best browser support, use the following:\n        A[ k ] = mappedValue;\n      }\n      // d. Increase k by 1.\n      k++;\n    }\n\n    // 9. return A\n    return A;\n  };\n}\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf\nif (!Array.prototype.indexOf) {\n  Array.prototype.indexOf = function (searchElement, fromIndex) {\n    if ( this === undefined || this === null ) {\n      throw new TypeError( '\"this\" is null or not defined' );\n    }\n\n    var length = this.length >>> 0; // Hack to convert object.length to a UInt32\n\n    fromIndex = +fromIndex || 0;\n\n    if (Math.abs(fromIndex) === Infinity) {\n      fromIndex = 0;\n    }\n\n    if (fromIndex < 0) {\n      fromIndex += length;\n      if (fromIndex < 0) {\n        fromIndex = 0;\n      }\n    }\n\n    for (;fromIndex < length; fromIndex++) {\n      if (this[fromIndex] === searchElement) {\n        return fromIndex;\n      }\n    }\n\n    return -1;\n  };\n}\n// Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray\n\nif (! Array.isArray) {\n    Array.isArray = function(obj) {\n        return Object.prototype.toString.call(obj) === \"[object Array]\";\n    };\n}\n\n// https://github.com/ttaubert/node-arraybuffer-slice\n// (c) 2013 Tim Taubert <tim@timtaubert.de>\n// arraybuffer-slice may be freely distributed under the MIT license.\n\n\"use strict\";\n\nif (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) {\n  ArrayBuffer.prototype.slice = function (begin, end) {\n    begin = (begin|0) || 0;\n    var num = this.byteLength;\n    end = end === (void 0) ? num : (end|0);\n\n    // Handle negative values.\n    if (begin < 0) begin += num;\n    if (end < 0) end += num;\n\n    if (num === 0 || begin >= num || begin >= end) {\n      return new ArrayBuffer(0);\n    }\n\n    var length = Math.min(num - begin, end - begin);\n    var target = new ArrayBuffer(length);\n    var targetArray = new Uint8Array(target);\n    targetArray.set(new Uint8Array(this, begin, length));\n    return target;\n  };\n}\n\n// https://github.com/davidchambers/Base64.js\n// (C) 2015 David Chambers\n// Base64.js may be freely distributed under the Apache 2.0 License.\n;(function () {\n\n  var object =\n    typeof exports != 'undefined' ? exports :\n    typeof self != 'undefined' ? self : // #8: web workers\n    $.global; // #31: ExtendScript\n\n  var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\n  function InvalidCharacterError(message) {\n    this.message = message;\n  }\n  InvalidCharacterError.prototype = new Error;\n  InvalidCharacterError.prototype.name = 'InvalidCharacterError';\n\n  // encoder\n  // [https://gist.github.com/999166] by [https://github.com/nignag]\n  object.btoa || (\n  object.btoa = function (input) {\n    var str = String(input);\n    for (\n      // initialize result and counter\n      var block, charCode, idx = 0, map = chars, output = '';\n      // if the next str index does not exist:\n      //   change the mapping table to \"=\"\n      //   check if d has no fractional digits\n      str.charAt(idx | 0) || (map = '=', idx % 1);\n      // \"8 - idx % 1 * 8\" generates the sequence 2, 4, 6, 8\n      output += map.charAt(63 & block >> 8 - idx % 1 * 8)\n    ) {\n      charCode = str.charCodeAt(idx += 3/4);\n      if (charCode > 0xFF) {\n        throw new InvalidCharacterError(\"'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.\");\n      }\n      block = block << 8 | charCode;\n    }\n    return output;\n  });\n\n  // decoder\n  // [https://gist.github.com/1020396] by [https://github.com/atk]\n  object.atob || (\n  object.atob = function (input) {\n    var str = String(input).replace(/[=]+$/, ''); // #31: ExtendScript bad parse of /=\n    if (str.length % 4 == 1) {\n      throw new InvalidCharacterError(\"'atob' failed: The string to be decoded is not correctly encoded.\");\n    }\n    for (\n      // initialize result and counters\n      var bc = 0, bs, buffer, idx = 0, output = '';\n      // get next character\n      buffer = str.charAt(idx++);\n      // character found in table? initialize bit storage and add its ascii value;\n      ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,\n        // and if not first of each 4 characters,\n        // convert the first 8 bits to one ascii character\n        bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0\n    ) {\n      // try to find character in table (0-63, not found => -1)\n      buffer = chars.indexOf(buffer);\n    }\n    return output;\n  });\n}());\n\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString\nif (!Date.prototype.toISOString) {\n  (function() {\n\n    function pad(number) {\n      if (number < 10) {\n        return '0' + number;\n      }\n      return number;\n    }\n\n    Date.prototype.toISOString = function() {\n      return this.getUTCFullYear() +\n        '-' + pad(this.getUTCMonth() + 1) +\n        '-' + pad(this.getUTCDate()) +\n        'T' + pad(this.getUTCHours()) +\n        ':' + pad(this.getUTCMinutes()) +\n        ':' + pad(this.getUTCSeconds()) +\n        '.' + (this.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) +\n        'Z';\n    };\n\n  }());\n}\n\n"
  },
  {
    "path": "pages/include/SheetJS/del/js/xhr-hack.js",
    "content": "var IEBinaryToArray_ByteStr_Script =\n   \"<!-- IEBinaryToArray_ByteStr -->\\r\\n\"+\n   \"<script type='text/vbscript'>\\r\\n\"+\n   \"Function IEBinaryToArray_ByteStr(Binary) : IEBinaryToArray_ByteStr = CStr(Binary) : End Function\\r\\n\"+\n   \"Function IEBinaryToArray_ByteStr_Last(Binary)\\r\\n\"+\n   \"   Dim lastIndex\\r\\n\"+\n   \"   lastIndex = LenB(Binary)\\r\\n\"+\n   \"   if lastIndex mod 2 Then\\r\\n\"+\n   \"       IEBinaryToArray_ByteStr_Last = Chr( AscB( MidB( Binary, lastIndex, 1 ) ) )\\r\\n\"+\n   \"   Else\\r\\n\"+\n   \"       IEBinaryToArray_ByteStr_Last = \"+'\"\"'+\"\\r\\n\"+\n   \"   End If\\r\\n\"+\n   \"End Function\\r\\n\"+\n   \"</script>\\r\\n\";\n\ndocument.write(IEBinaryToArray_ByteStr_Script);\n\n"
  },
  {
    "path": "pages/include/SheetJS/index.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <title>SheetJS Live Grid Demo</title>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n        <link rel=\"icon\" type=\"image/png\" href=\"assets/img/logo.png\" />\n        <link rel=\"stylesheet\" href=\"assets/css/sheetjs.css\">\n    </head>\n    <body>\n        <script src=\"assets/vendor/alertify.js\"></script>\n        <script src=\"assets/vendor/jquery.min.js\"></script>\n        <script src=\"assets/vendor/jquery.handsontable.full.js\"></script>\n\n        <link rel=\"stylesheet\" media=\"screen\" href=\"assets/vendor/jquery.handsontable.full.css\">\n        <link rel=\"stylesheet\" media=\"screen\" href=\"assets/vendor/samples.css\">\n        <link rel=\"stylesheet\" media=\"screen\" href=\"assets/vendor/alertify.css\">\n\n        <div id=\"body\">\n            <div id=\"left\">\n            <div id=\"drop\">Drop a file here</div>\n            <h3> Choose a worksheet:</h3>\n            <div id=\"buttons\"></div>\n        </div>\n        <div id=\"right\">\n            <div id=\"header\">\n                <pre id=\"out\"></pre>\n                <h2>SheetJS In-Browser Live Grid Demo</h2>\n            </div>\n            <div id=\"hot\" style=\"overflow: scroll\" class=\"handsontable\"></div>\n        </div>\n\n        <script src=\"assets/js/shim.js\"></script>\n        <script src=\"assets/js/xlsx.full.min.js\"></script>\n        <script src=\"assets/js/dropsheet.js\"></script>\n        <script src=\"assets/js/main.js\"></script>\n\n        <script src=\"assets/vendor/spin.js\"></script>\n    </body>\n</html>\n"
  },
  {
    "path": "pages/include/docx/jszip-utils.js",
    "content": "/*!\n\nJSZipUtils - A collection of cross-browser utilities to go along with JSZip.\n<http://stuk.github.io/jszip-utils>\n\n(c) 2014 Stuart Knightley, David Duponchel\nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip-utils/master/LICENSE.markdown.\n\n*/\n!function(e){\"object\"==typeof exports?module.exports=e():\"function\"==typeof define&&define.amd?define(e):\"undefined\"!=typeof window?window.JSZipUtils=e():\"undefined\"!=typeof global?global.JSZipUtils=e():\"undefined\"!=typeof self&&(self.JSZipUtils=e())}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error(\"Cannot find module '\"+o+\"'\")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n'use strict';\n\nvar JSZipUtils = {};\n// just use the responseText with xhr1, response with xhr2.\n// The transformation doesn't throw away high-order byte (with responseText)\n// because JSZip handles that case. If not used with JSZip, you may need to\n// do it, see https://developer.mozilla.org/En/Using_XMLHttpRequest#Handling_binary_data\nJSZipUtils._getBinaryFromXHR = function (xhr) {\n    // for xhr.responseText, the 0xFF mask is applied by JSZip\n    return xhr.response || xhr.responseText;\n};\n\n// taken from jQuery\nfunction createStandardXHR() {\n    try {\n        return new window.XMLHttpRequest();\n    } catch( e ) {}\n}\n\nfunction createActiveXHR() {\n    try {\n        return new window.ActiveXObject(\"Microsoft.XMLHTTP\");\n    } catch( e ) {}\n}\n\n// Create the request object\nvar createXHR = window.ActiveXObject ?\n    /* Microsoft failed to properly\n     * implement the XMLHttpRequest in IE7 (can't request local files),\n     * so we use the ActiveXObject when it is available\n     * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n     * we need a fallback.\n     */\n    function() {\n    return createStandardXHR() || createActiveXHR();\n} :\n    // For all other browsers, use the standard XMLHttpRequest object\n    createStandardXHR;\n\n\n\nJSZipUtils.getBinaryContent = function(path, callback) {\n    /*\n     * Here is the tricky part : getting the data.\n     * In firefox/chrome/opera/... setting the mimeType to 'text/plain; charset=x-user-defined'\n     * is enough, the result is in the standard xhr.responseText.\n     * cf https://developer.mozilla.org/En/XMLHttpRequest/Using_XMLHttpRequest#Receiving_binary_data_in_older_browsers\n     * In IE <= 9, we must use (the IE only) attribute responseBody\n     * (for binary data, its content is different from responseText).\n     * In IE 10, the 'charset=x-user-defined' trick doesn't work, only the\n     * responseType will work :\n     * http://msdn.microsoft.com/en-us/library/ie/hh673569%28v=vs.85%29.aspx#Binary_Object_upload_and_download\n     *\n     * I'd like to use jQuery to avoid this XHR madness, but it doesn't support\n     * the responseType attribute : http://bugs.jquery.com/ticket/11461\n     */\n    try {\n\n        var xhr = createXHR();\n\n        xhr.open('GET', path, true);\n\n        // recent browsers\n        if (\"responseType\" in xhr) {\n            xhr.responseType = \"arraybuffer\";\n        }\n\n        // older browser\n        if(xhr.overrideMimeType) {\n            xhr.overrideMimeType(\"text/plain; charset=x-user-defined\");\n        }\n\n        xhr.onreadystatechange = function(evt) {\n            var file, err;\n            // use `xhr` and not `this`... thanks IE\n            if (xhr.readyState === 4) {\n                if (xhr.status === 200 || xhr.status === 0) {\n                    file = null;\n                    err = null;\n                    try {\n                        file = JSZipUtils._getBinaryFromXHR(xhr);\n                    } catch(e) {\n                        err = new Error(e);\n                    }\n                    callback(err, file);\n                } else {\n                    callback(new Error(\"Ajax error for \" + path + \" : \" + this.status + \" \" + this.statusText), null);\n                }\n            }\n        };\n\n        xhr.send();\n\n    } catch (e) {\n        callback(new Error(e), null);\n    }\n};\n\n// export\nmodule.exports = JSZipUtils;\n\n// enforcing Stuk's coding style\n// vim: set shiftwidth=4 softtabstop=4:\n\n},{}]},{},[1])\n(1)\n});\n;"
  },
  {
    "path": "pages/include/docx/mammoth.browser.js",
    "content": "// Module: base64-js@1.2.0\n// License: MIT\n//\n// Module: bluebird@3.4.7\n// License: MIT\n//\n// Module: buffer-shims@1.0.0\n// License: MIT\n//\n// Module: buffer@4.9.1\n// License: MIT\n//\n// Module: core-util-is@1.0.2\n// License: MIT\n//\n// Module: events@1.1.1\n// License: MIT\n//\n// Module: ieee754@1.1.8\n// License: BSD-3-Clause\n//\n// Module: inherits@2.0.1\n// License: ISC\n//\n// Module: inherits@2.0.3\n// License: ISC\n//\n// Module: isarray@1.0.0\n// License: MIT\n//\n// Module: jszip@2.5.0\n// License: MIT or GPLv3\n//\n// Module: lop@0.4.0\n// License: BSD\n//\n// Module: mammoth@1.4.7\n// License: BSD-2-Clause\n//\n// Module: option@0.2.3\n// License: BSD\n//\n// Module: pako@0.2.9\n// License: MIT\n//\n// Module: path-browserify@0.0.0\n// License: MIT\n//\n// Module: process-nextick-args@1.0.7\n// License: MIT\n//\n// Module: process@0.11.9\n// License: MIT\n//\n// Module: readable-stream@2.2.6\n// License: MIT\n//\n// Module: sax@1.1.6\n// License: ISC\n//\n// Module: stream-browserify@2.0.1\n// License: MIT\n//\n// Module: string_decoder@0.10.31\n// License: MIT\n//\n// Module: underscore@1.4.4\n// License: MIT\n//\n// Module: underscore@1.8.3\n// License: MIT\n//\n// Module: util-deprecate@1.0.2\n// License: MIT\n//\n// Module: util@0.10.3\n// License: MIT\n//\n// Module: xmlbuilder@10.0.0\n// License: MIT\n//\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.mammoth = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\nvar promises = require(\"../../lib/promises\");\n\nexports.Files = Files;\n\n\nfunction Files() {\n    function read(uri) {\n        return promises.reject(new Error(\"could not open external image: '\" + uri + \"'\\ncannot open linked files from a web browser\"));\n    }\n    \n    return {\n        read: read\n    };\n}\n\n},{\"../../lib/promises\":23}],2:[function(require,module,exports){\nvar promises = require(\"../lib/promises\");\nvar zipfile = require(\"../lib/zipfile\");\n\nexports.openZip = openZip;\n\nfunction openZip(options) {\n    if (options.arrayBuffer) {\n        return promises.resolve(zipfile.openArrayBuffer(options.arrayBuffer));\n    } else {\n        return promises.reject(new Error(\"Could not find file in options\"));\n    }\n}\n\n},{\"../lib/promises\":23,\"../lib/zipfile\":38}],3:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar promises = require(\"./promises\");\nvar documents = require(\"./documents\");\nvar htmlPaths = require(\"./styles/html-paths\");\nvar results = require(\"./results\");\nvar images = require(\"./images\");\nvar Html = require(\"./html\");\nvar writers = require(\"./writers\");\n\nexports.DocumentConverter = DocumentConverter;\n\n\nfunction DocumentConverter(options) {\n    return {\n        convertToHtml: function(element) {\n            var comments = _.indexBy(\n                element.type === documents.types.document ? element.comments : [],\n                \"commentId\"\n            );\n            var conversion = new DocumentConversion(options, comments);\n            return conversion.convertToHtml(element);\n        }\n    };\n}\n\nfunction DocumentConversion(options, comments) {\n    var noteNumber = 1;\n    \n    var noteReferences = [];\n    \n    var referencedComments = [];\n    \n    options = _.extend({ignoreEmptyParagraphs: true}, options);\n    var idPrefix = options.idPrefix === undefined ? \"\" : options.idPrefix;\n    var ignoreEmptyParagraphs = options.ignoreEmptyParagraphs;\n    \n    var defaultParagraphStyle = htmlPaths.topLevelElement(\"p\");\n    \n    var styleMap = options.styleMap || [];\n    \n    function convertToHtml(document) {\n        var messages = [];\n        \n        var html = elementToHtml(document, messages, {});\n        \n        var deferredNodes = [];\n        walkHtml(html, function(node) {\n            if (node.type === \"deferred\") {\n                deferredNodes.push(node);\n            }\n        });\n        var deferredValues = {};\n        return promises.mapSeries(deferredNodes, function(deferred) {\n            return deferred.value().then(function(value) {\n                deferredValues[deferred.id] = value;\n            });\n        }).then(function() {\n            function replaceDeferred(nodes) {\n                return flatMap(nodes, function(node) {\n                    if (node.type === \"deferred\") {\n                        return deferredValues[node.id];\n                    } else if (node.children) {\n                        return [\n                            _.extend({}, node, {\n                                children: replaceDeferred(node.children)\n                            })\n                        ];\n                    } else {\n                        return [node];\n                    }\n                });\n            }\n            var writer = writers.writer({\n                prettyPrint: options.prettyPrint,\n                outputFormat: options.outputFormat\n            });\n            Html.write(writer, Html.simplify(replaceDeferred(html)));\n            return new results.Result(writer.asString(), messages);\n        });\n    }\n    \n    function convertElements(elements, messages, options) {\n        return flatMap(elements, function(element) {\n            return elementToHtml(element, messages, options);\n        });\n    }\n\n    function elementToHtml(element, messages, options) {\n        if (!options) {\n            throw new Error(\"options not set\");\n        }\n        var handler = elementConverters[element.type];\n        if (handler) {\n            return handler(element, messages, options);\n        } else {\n            return [];\n        }\n    }\n    \n    function convertParagraph(element, messages, options) {\n        return htmlPathForParagraph(element, messages).wrap(function() {\n            var content = convertElements(element.children, messages, options);\n            if (ignoreEmptyParagraphs) {\n                return content;\n            } else {\n                return [Html.forceWrite].concat(content);\n            }\n        });\n    }\n    \n    function htmlPathForParagraph(element, messages) {\n        var style = findStyle(element);\n        \n        if (style) {\n            return style.to;\n        } else {\n            if (element.styleId) {\n                messages.push(unrecognisedStyleWarning(\"paragraph\", element));\n            }\n            return defaultParagraphStyle;\n        }\n    }\n    \n    function convertRun(run, messages, options) {\n        var nodes = function() {\n            return convertElements(run.children, messages, options);\n        };\n        var paths = [];\n        if (run.isSmallCaps) {\n            paths.push(findHtmlPathForRunProperty(\"smallCaps\"));\n        }\n        if (run.isStrikethrough) {\n            paths.push(findHtmlPathForRunProperty(\"strikethrough\", \"s\"));\n        }\n        if (run.isUnderline) {\n            paths.push(findHtmlPathForRunProperty(\"underline\"));\n        }\n        if (run.verticalAlignment === documents.verticalAlignment.subscript) {\n            paths.push(htmlPaths.element(\"sub\", {}, {fresh: false}));\n        }\n        if (run.verticalAlignment === documents.verticalAlignment.superscript) {\n            paths.push(htmlPaths.element(\"sup\", {}, {fresh: false}));\n        }\n        if (run.isItalic) {\n            paths.push(findHtmlPathForRunProperty(\"italic\", \"em\"));\n        }\n        if (run.isBold) {\n            paths.push(findHtmlPathForRunProperty(\"bold\", \"strong\"));\n        }\n        var stylePath = htmlPaths.empty;\n        var style = findStyle(run);\n        if (style) {\n            stylePath = style.to;\n        } else if (run.styleId) {\n            messages.push(unrecognisedStyleWarning(\"run\", run));\n        }\n        paths.push(stylePath);\n            \n        paths.forEach(function(path) {\n            nodes = path.wrap.bind(path, nodes);\n        });\n        \n        return nodes();\n    }\n    \n    function findHtmlPathForRunProperty(elementType, defaultTagName) {\n        var path = findHtmlPath({type: elementType});\n        if (path) {\n            return path;\n        } else if (defaultTagName) {\n            return htmlPaths.element(defaultTagName, {}, {fresh: false});\n        } else {\n            return htmlPaths.empty;\n        }\n    }\n    \n    function findHtmlPath(element, defaultPath) {\n        var style = findStyle(element);\n        return style ? style.to : defaultPath;\n    }\n    \n    function findStyle(element) {\n        for (var i = 0; i < styleMap.length; i++) {\n            if (styleMap[i].from.matches(element)) {\n                return styleMap[i];\n            }\n        }\n    }\n    \n    function recoveringConvertImage(convertImage) {\n        return function(image, messages) {\n            return promises.attempt(function() {\n                return convertImage(image, messages);\n            }).caught(function(error) {\n                messages.push(results.error(error));\n                return [];\n            });\n        };\n    }\n\n    function noteHtmlId(note) {\n        return referentHtmlId(note.noteType, note.noteId);\n    }\n    \n    function noteRefHtmlId(note) {\n        return referenceHtmlId(note.noteType, note.noteId);\n    }\n    \n    function referentHtmlId(referenceType, referenceId) {\n        return htmlId(referenceType + \"-\" + referenceId);\n    }\n    \n    function referenceHtmlId(referenceType, referenceId) {\n        return htmlId(referenceType + \"-ref-\" + referenceId);\n    }\n    \n    function htmlId(suffix) {\n        return idPrefix + suffix;\n    }\n    \n    var defaultTablePath = htmlPaths.elements([\n        htmlPaths.element(\"table\", {}, {fresh: true})\n    ]);\n\n    function convertTable(element, messages, options) {\n        return findHtmlPath(element, defaultTablePath).wrap(function() {\n            return convertTableChildren(element, messages, options);\n        });\n    }\n\n    function convertTableChildren(element, messages, options) {\n        var bodyIndex = _.findIndex(element.children, function(child) {\n            return !child.type === documents.types.tableRow || !child.isHeader;\n        });\n        if (bodyIndex === -1) {\n            bodyIndex = element.children.length;\n        }\n        var children;\n        if (bodyIndex === 0) {\n            children = convertElements(\n                element.children,\n                messages,\n                _.extend({}, options, {isTableHeader: false})\n            );\n        } else {\n            var headRows = convertElements(\n                element.children.slice(0, bodyIndex),\n                messages,\n                _.extend({}, options, {isTableHeader: true})\n            );\n            var bodyRows = convertElements(\n                element.children.slice(bodyIndex),\n                messages,\n                _.extend({}, options, {isTableHeader: false})\n            );\n            children = [\n                Html.freshElement(\"thead\", {}, headRows),\n                Html.freshElement(\"tbody\", {}, bodyRows)\n            ];\n        }\n        return [Html.forceWrite].concat(children);\n    }\n    \n    function convertTableRow(element, messages, options) {\n        return wrapChildrenInFreshElement(element, \"tr\", messages, options);\n    }\n    \n    function convertTableCell(element, messages, options) {\n        var tagName = options.isTableHeader ? \"th\" : \"td\";\n        var children = convertElements(element.children, messages, options);\n        var attributes = {};\n        if (element.colSpan !== 1) {\n            attributes.colspan = element.colSpan.toString();\n        }\n        if (element.rowSpan !== 1) {\n            attributes.rowspan = element.rowSpan.toString();\n        }\n            \n        return [\n            Html.freshElement(tagName, attributes, [Html.forceWrite].concat(children))\n        ];\n    }\n    \n    function convertCommentReference(reference, messages, options) {\n        return findHtmlPath(reference, htmlPaths.ignore).wrap(function() {\n            var comment = comments[reference.commentId];\n            var count = referencedComments.length + 1;\n            var label = \"[\" + commentAuthorLabel(comment) + count + \"]\";\n            referencedComments.push({label: label, comment: comment});\n            // TODO: remove duplication with note references\n            return [\n                Html.freshElement(\"a\", {\n                    href: \"#\" + referentHtmlId(\"comment\", reference.commentId),\n                    id: referenceHtmlId(\"comment\", reference.commentId)\n                }, [Html.text(label)])\n            ];\n        });\n    }\n    \n    function convertComment(referencedComment, messages, options) {\n        // TODO: remove duplication with note references\n        \n        var label = referencedComment.label;\n        var comment = referencedComment.comment;\n        var body = convertElements(comment.body, messages, options).concat([\n            Html.nonFreshElement(\"p\", {}, [\n                Html.text(\" \"),\n                Html.freshElement(\"a\", {\"href\": \"#\" + referenceHtmlId(\"comment\", comment.commentId)}, [\n                    Html.text(\"↑\")\n                ])\n            ])\n        ]);\n        \n        return [\n            Html.freshElement(\n                \"dt\",\n                {\"id\": referentHtmlId(\"comment\", comment.commentId)},\n                [Html.text(\"Comment \" + label)]\n            ),\n            Html.freshElement(\"dd\", {}, body)\n        ];\n    }\n    \n    function convertBreak(element, messages, options) {\n        return htmlPathForBreak(element).wrap(function() {\n            return [];\n        });\n    }\n    \n    function htmlPathForBreak(element) {\n        var style = findStyle(element);\n        if (style) {\n            return style.to;\n        } else if (element.breakType === \"line\") {\n            return htmlPaths.topLevelElement(\"br\");\n        } else {\n            return htmlPaths.empty;\n        }\n    }\n    \n    function wrapChildrenInFreshElement(element, wrapElementName, messages, options) {\n        var children = convertElements(element.children, messages, options);\n        return [\n            Html.freshElement(wrapElementName, {}, [Html.forceWrite].concat(children))\n        ];\n    }\n\n    var elementConverters = {\n        \"document\": function(document, messages, options) {\n            var children = convertElements(document.children, messages, options);\n            var notes = noteReferences.map(function(noteReference) {\n                return document.notes.resolve(noteReference);\n            });\n            var notesNodes = convertElements(notes, messages, options);\n            return children.concat([\n                Html.freshElement(\"ol\", {}, notesNodes),\n                Html.freshElement(\"dl\", {}, flatMap(referencedComments, function(referencedComment) {\n                    return convertComment(referencedComment, messages, options);\n                }))\n            ]);\n        },\n        \"paragraph\": convertParagraph,\n        \"run\": convertRun,\n        \"text\": function(element, messages, options) {\n            return [Html.text(element.value)];\n        },\n        \"tab\": function(element, messages, options) {\n            return [Html.text(\"\\t\")];\n        },\n        \"hyperlink\": function(element, messages, options) {\n            var href = element.anchor ? \"#\" + htmlId(element.anchor) : element.href;\n            var attributes = {href: href};\n            if (element.targetFrame != null) {\n                attributes.target = element.targetFrame;\n            }\n\n            var children = convertElements(element.children, messages, options);\n            return [Html.freshElement(\"a\", attributes, children)];\n        },\n        \"bookmarkStart\": function(element, messages, options) {\n            var anchor = Html.freshElement(\"a\", {\n                id: htmlId(element.name)\n            }, [Html.forceWrite]);\n            return [anchor];\n        },\n        \"noteReference\": function(element, messages, options) {\n            noteReferences.push(element);\n            var anchor = Html.freshElement(\"a\", {\n                href: \"#\" + noteHtmlId(element),\n                id: noteRefHtmlId(element)\n            }, [Html.text(\"[\" + (noteNumber++) + \"]\")]);\n            \n            return [Html.freshElement(\"sup\", {}, [anchor])];\n        },\n        \"note\": function(element, messages, options) {\n            var children = convertElements(element.body, messages, options);\n            var backLink = Html.elementWithTag(htmlPaths.element(\"p\", {}, {fresh: false}), [\n                Html.text(\" \"),\n                Html.freshElement(\"a\", {href: \"#\" + noteRefHtmlId(element)}, [Html.text(\"↑\")])\n            ]);\n            var body = children.concat([backLink]);\n            \n            return Html.freshElement(\"li\", {id: noteHtmlId(element)}, body);\n        },\n        \"commentReference\": convertCommentReference,\n        \"comment\": convertComment,\n        \"image\": deferredConversion(recoveringConvertImage(options.convertImage || images.dataUri)),\n        \"table\": convertTable,\n        \"tableRow\": convertTableRow,\n        \"tableCell\": convertTableCell,\n        \"break\": convertBreak\n    };\n    return {\n        convertToHtml: convertToHtml\n    };\n}\n\nvar deferredId = 1;\n\nfunction deferredConversion(func) {\n    return function(element, messages, options) {\n        return [\n            {\n                type: \"deferred\",\n                id: deferredId++,\n                value: function() {\n                    return func(element, messages, options);\n                }\n            }\n        ];\n    };\n}\n\nfunction unrecognisedStyleWarning(type, element) {\n    return results.warning(\n        \"Unrecognised \" + type + \" style: '\" + element.styleName + \"'\" +\n        \" (Style ID: \" + element.styleId + \")\"\n    );\n}\n\nfunction flatMap(values, func) {\n    return _.flatten(values.map(func), true);\n}\n\nfunction walkHtml(nodes, callback) {\n    nodes.forEach(function(node) {\n        callback(node);\n        if (node.children) {\n            walkHtml(node.children, callback);\n        }\n    });\n}\n\nvar commentAuthorLabel = exports.commentAuthorLabel = function commentAuthorLabel(comment) {\n    return comment.authorInitials || \"\";\n};\n\n},{\"./documents\":4,\"./html\":18,\"./images\":20,\"./promises\":23,\"./results\":24,\"./styles/html-paths\":27,\"./writers\":32,\"underscore\":153}],4:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar types = exports.types = {\n    document: \"document\",\n    paragraph: \"paragraph\",\n    run: \"run\",\n    text: \"text\",\n    tab: \"tab\",\n    hyperlink: \"hyperlink\",\n    noteReference: \"noteReference\",\n    image: \"image\",\n    note: \"note\",\n    commentReference: \"commentReference\",\n    comment: \"comment\",\n    table: \"table\",\n    tableRow: \"tableRow\",\n    tableCell: \"tableCell\",\n    \"break\": \"break\",\n    bookmarkStart: \"bookmarkStart\"\n};\n\nfunction Document(children, options) {\n    options = options || {};\n    return {\n        type: types.document,\n        children: children,\n        notes: options.notes || new Notes({}),\n        comments: options.comments || []\n    };\n}\n\nfunction Paragraph(children, properties) {\n    properties = properties || {};\n    var indent = properties.indent || {};\n    return {\n        type: types.paragraph,\n        children: children,\n        styleId: properties.styleId || null,\n        styleName: properties.styleName || null,\n        numbering: properties.numbering || null,\n        alignment: properties.alignment || null,\n        indent: {\n            start: indent.start || null,\n            end: indent.end || null,\n            firstLine: indent.firstLine || null,\n            hanging: indent.hanging || null\n        }\n    };\n}\n\nfunction Run(children, properties) {\n    properties = properties || {};\n    return {\n        type: types.run,\n        children: children,\n        styleId: properties.styleId || null,\n        styleName: properties.styleName || null,\n        isBold: properties.isBold,\n        isUnderline: properties.isUnderline,\n        isItalic: properties.isItalic,\n        isStrikethrough: properties.isStrikethrough,\n        isSmallCaps: properties.isSmallCaps,\n        verticalAlignment: properties.verticalAlignment || verticalAlignment.baseline,\n        font: properties.font || null\n    };\n}\n\nvar verticalAlignment = {\n    baseline: \"baseline\",\n    superscript: \"superscript\",\n    subscript: \"subscript\"\n};\n\nfunction Text(value) {\n    return {\n        type: types.text,\n        value: value\n    };\n}\n\nfunction Tab() {\n    return {\n        type: types.tab\n    };\n}\n\nfunction Hyperlink(children, options) {\n    return {\n        type: types.hyperlink,\n        children: children,\n        href: options.href,\n        anchor: options.anchor,\n        targetFrame: options.targetFrame\n    };\n}\n\nfunction NoteReference(options) {\n    return {\n        type: types.noteReference,\n        noteType: options.noteType,\n        noteId: options.noteId\n    };\n}\n\nfunction Notes(notes) {\n    this._notes = _.indexBy(notes, function(note) {\n        return noteKey(note.noteType, note.noteId);\n    });\n}\n\nNotes.prototype.resolve = function(reference) {\n    return this.findNoteByKey(noteKey(reference.noteType, reference.noteId));\n};\n\nNotes.prototype.findNoteByKey = function(key) {\n    return this._notes[key] || null;\n};\n\nfunction Note(options) {\n    return {\n        type: types.note,\n        noteType: options.noteType,\n        noteId: options.noteId,\n        body: options.body\n    };\n}\n\nfunction commentReference(options) {\n    return {\n        type: types.commentReference,\n        commentId: options.commentId\n    };\n}\n\nfunction comment(options) {\n    return {\n        type: types.comment,\n        commentId: options.commentId,\n        body: options.body,\n        authorName: options.authorName,\n        authorInitials: options.authorInitials\n    };\n}\n\nfunction noteKey(noteType, id) {\n    return noteType + \"-\" + id;\n}\n\nfunction Image(options) {\n    return {\n        type: types.image,\n        read: options.readImage,\n        altText: options.altText,\n        contentType: options.contentType\n    };\n}\n\nfunction Table(children, properties) {\n    properties = properties || {};\n    return {\n        type: types.table,\n        children: children,\n        styleId: properties.styleId || null,\n        styleName: properties.styleName || null\n    };\n}\n\nfunction TableRow(children, options) {\n    options = options || {};\n    return {\n        type: types.tableRow,\n        children: children,\n        isHeader: options.isHeader || false\n    };\n}\n\nfunction TableCell(children, options) {\n    options = options || {};\n    return {\n        type: types.tableCell,\n        children: children,\n        colSpan: options.colSpan == null ? 1 : options.colSpan,\n        rowSpan: options.rowSpan == null ? 1 : options.rowSpan\n    };\n}\n\nfunction Break(breakType) {\n    return {\n        type: types[\"break\"],\n        breakType: breakType\n    };\n}\n\nfunction BookmarkStart(options) {\n    return {\n        type: types.bookmarkStart,\n        name: options.name\n    };\n}\n\nexports.document = exports.Document = Document;\nexports.paragraph = exports.Paragraph = Paragraph;\nexports.run = exports.Run = Run;\nexports.Text = Text;\nexports.tab = exports.Tab = Tab;\nexports.Hyperlink = Hyperlink;\nexports.noteReference = exports.NoteReference = NoteReference;\nexports.Notes = Notes;\nexports.Note = Note;\nexports.commentReference = commentReference;\nexports.comment = comment;\nexports.Image = Image;\nexports.Table = Table;\nexports.TableRow = TableRow;\nexports.TableCell = TableCell;\nexports.lineBreak = Break(\"line\");\nexports.pageBreak = Break(\"page\");\nexports.columnBreak = Break(\"column\");\nexports.BookmarkStart = BookmarkStart;\n\nexports.verticalAlignment = verticalAlignment;\n\n},{\"underscore\":153}],5:[function(require,module,exports){\nexports.createBodyReader = createBodyReader;\nexports._readNumberingProperties = readNumberingProperties;\n\nvar _ = require(\"underscore\");\n\nvar documents = require(\"../documents\");\nvar Result = require(\"../results\").Result;\nvar warning = require(\"../results\").warning;\nvar uris = require(\"./uris\");\n\nfunction createBodyReader(options) {\n    return {\n        readXmlElement: function(element) {\n            return new BodyReader(options).readXmlElement(element);\n        },\n        readXmlElements: function(elements) {\n            return new BodyReader(options).readXmlElements(elements);\n        }\n    };\n}\n\nfunction BodyReader(options) {\n    var complexFieldStack = [];\n    var currentInstrText = [];\n    var relationships = options.relationships;\n    var contentTypes = options.contentTypes;\n    var docxFile = options.docxFile;\n    var files = options.files;\n    var numbering = options.numbering;\n    var styles = options.styles;\n\n    function readXmlElements(elements) {\n        var results = elements.map(readXmlElement);\n        return combineResults(results);\n    }\n\n    function readXmlElement(element) {\n        if (element.type === \"element\") {\n            var handler = xmlElementReaders[element.name];\n            if (handler) {\n                return handler(element);\n            } else if (!Object.prototype.hasOwnProperty.call(ignoreElements, element.name)) {\n                var message = warning(\"An unrecognised element was ignored: \" + element.name);\n                return emptyResultWithMessages([message]);\n            }\n        }\n        return emptyResult();\n    }\n    \n    function readParagraphIndent(element) {\n        return {\n            start: element.attributes[\"w:start\"] || element.attributes[\"w:left\"],\n            end: element.attributes[\"w:end\"] || element.attributes[\"w:right\"],\n            firstLine: element.attributes[\"w:firstLine\"],\n            hanging: element.attributes[\"w:hanging\"]\n        };\n    }\n    \n    function readRunProperties(element) {\n        return readRunStyle(element).map(function(style) {\n            return {\n                type: \"runProperties\",\n                styleId: style.styleId,\n                styleName: style.name,\n                verticalAlignment: element.firstOrEmpty(\"w:vertAlign\").attributes[\"w:val\"],\n                font: element.firstOrEmpty(\"w:rFonts\").attributes[\"w:ascii\"],\n                isBold: readBooleanElement(element.first(\"w:b\")),\n                isUnderline: readBooleanElement(element.first(\"w:u\")),\n                isItalic: readBooleanElement(element.first(\"w:i\")),\n                isStrikethrough: readBooleanElement(element.first(\"w:strike\")),\n                isSmallCaps: readBooleanElement(element.first(\"w:smallCaps\"))\n            };\n        });\n    }\n    \n    function readBooleanElement(element) {\n        if (element) {\n            var value = element.attributes[\"w:val\"];\n            return value !== \"false\" && value !== \"0\";\n        } else {\n            return false;\n        }\n    }\n    \n    function readParagraphStyle(element) {\n        return readStyle(element, \"w:pStyle\", \"Paragraph\", styles.findParagraphStyleById);\n    }\n    \n    function readRunStyle(element) {\n        return readStyle(element, \"w:rStyle\", \"Run\", styles.findCharacterStyleById);\n    }\n    \n    function readTableStyle(element) {\n        return readStyle(element, \"w:tblStyle\", \"Table\", styles.findTableStyleById);\n    }\n    \n    function readStyle(element, styleTagName, styleType, findStyleById) {\n        var messages = [];\n        var styleElement = element.first(styleTagName);\n        var styleId = null;\n        var name = null;\n        if (styleElement) {\n            styleId = styleElement.attributes[\"w:val\"];\n            if (styleId) {\n                var style = findStyleById(styleId);\n                if (style) {\n                    name = style.name;\n                } else {\n                    messages.push(undefinedStyleWarning(styleType, styleId));\n                }\n            }\n        }\n        return elementResultWithMessages({styleId: styleId, name: name}, messages);\n    }\n    \n    var unknownComplexField = {type: \"unknown\"};\n    \n    function readFldChar(element) {\n        var type = element.attributes[\"w:fldCharType\"];\n        if (type === \"begin\") {\n            complexFieldStack.push(unknownComplexField);\n            currentInstrText = [];\n        } else if (type === \"end\") {\n            complexFieldStack.pop();\n        } else if (type === \"separate\") {\n            var href = parseHyperlinkFieldCode(currentInstrText.join(''));\n            var complexField = href === null ? unknownComplexField : {type: \"hyperlink\", href: href};\n            complexFieldStack.pop();\n            complexFieldStack.push(complexField);\n        }\n        return emptyResult();\n    }\n    \n    function currentHyperlinkHref() {\n        var topHyperlink = _.last(complexFieldStack.filter(function(complexField) {\n            return complexField.type === \"hyperlink\";\n        }));\n        return topHyperlink ? topHyperlink.href : null;\n    }\n\n    function parseHyperlinkFieldCode(code) {\n        var result = /\\s*HYPERLINK \"(.*)\"/.exec(code);\n        if (result) {\n            return result[1];\n        } else {\n            return null;\n        }\n    }\n    \n    function readInstrText(element) {\n        currentInstrText.push(element.text());\n        return emptyResult();\n    }\n    \n    function noteReferenceReader(noteType) {\n        return function(element) {\n            var noteId = element.attributes[\"w:id\"];\n            return elementResult(new documents.NoteReference({\n                noteType: noteType,\n                noteId: noteId\n            }));\n        };\n    }\n    \n    function readCommentReference(element) {\n        return elementResult(documents.commentReference({\n            commentId: element.attributes[\"w:id\"]\n        }));\n    }\n    \n    function readChildElements(element) {\n        return readXmlElements(element.children);\n    }\n    \n    var xmlElementReaders = {\n        \"w:p\": function(element) {\n            return readXmlElements(element.children)\n                .map(function(children) {\n                    var properties = _.find(children, isParagraphProperties);\n                    return new documents.Paragraph(\n                        children.filter(negate(isParagraphProperties)),\n                        properties\n                    );\n                })\n                .insertExtra();\n        },\n        \"w:pPr\": function(element) {\n            return readParagraphStyle(element).map(function(style) {\n                return {\n                    type: \"paragraphProperties\",\n                    styleId: style.styleId,\n                    styleName: style.name,\n                    alignment: element.firstOrEmpty(\"w:jc\").attributes[\"w:val\"],\n                    numbering: readNumberingProperties(element.firstOrEmpty(\"w:numPr\"), numbering),\n                    indent: readParagraphIndent(element.firstOrEmpty(\"w:ind\"))\n                };\n            });\n        },\n        \"w:r\": function(element) {\n            return readXmlElements(element.children)\n                .map(function(children) {\n                    var properties = _.find(children, isRunProperties);\n                    children = children.filter(negate(isRunProperties));\n\n                    var hyperlinkHref = currentHyperlinkHref();\n                    if (hyperlinkHref !== null) {\n                        children = [new documents.Hyperlink(children, {href: hyperlinkHref})];\n                    }\n\n                    return new documents.Run(children, properties);\n                });\n        },\n        \"w:rPr\": readRunProperties,\n        \"w:fldChar\": readFldChar,\n        \"w:instrText\": readInstrText,\n        \"w:t\": function(element) {\n            return elementResult(new documents.Text(element.text()));\n        },\n        \"w:tab\": function(element) {\n            return elementResult(new documents.Tab());\n        },\n        \"w:noBreakHyphen\": function() {\n            return elementResult(new documents.Text(\"\\u2011\"));\n        },\n        \"w:hyperlink\": function(element) {\n            var relationshipId = element.attributes[\"r:id\"];\n            var anchor = element.attributes[\"w:anchor\"];\n            return readXmlElements(element.children).map(function(children) {\n                function create(options) {\n                    var targetFrame = element.attributes[\"w:tgtFrame\"] || null;\n                    \n                    return new documents.Hyperlink(\n                        children,\n                        _.extend({targetFrame: targetFrame}, options)\n                    );\n                }\n                \n                if (relationshipId) {\n                    var href = relationships.findTargetByRelationshipId(relationshipId);\n                    if (anchor) {\n                        href = uris.replaceFragment(href, anchor);\n                    }\n                    return create({href: href});\n                } else if (anchor) {\n                    return create({anchor: anchor});\n                } else {\n                    return children;\n                }\n            });\n        },\n        \"w:tbl\": readTable,\n        \"w:tr\": readTableRow,\n        \"w:tc\": readTableCell,\n        \"w:footnoteReference\": noteReferenceReader(\"footnote\"),\n        \"w:endnoteReference\": noteReferenceReader(\"endnote\"),\n        \"w:commentReference\": readCommentReference,\n        \"w:br\": function(element) {\n            var breakType = element.attributes[\"w:type\"];\n            if (breakType == null || breakType === \"textWrapping\") {\n                return elementResult(documents.lineBreak);\n            } else if (breakType === \"page\") {\n                return elementResult(documents.pageBreak);\n            } else if (breakType === \"column\") {\n                return elementResult(documents.columnBreak);\n            } else {\n                return emptyResultWithMessages([warning(\"Unsupported break type: \" + breakType)]);\n            }\n        },\n        \"w:bookmarkStart\": function(element){\n            var name = element.attributes[\"w:name\"];\n            if (name === \"_GoBack\") {\n                return emptyResult();\n            } else {\n                return elementResult(new documents.BookmarkStart({name: name}));\n            }\n        },\n        \n        \"mc:AlternateContent\": function(element) {\n            return readChildElements(element.first(\"mc:Fallback\"));\n        },\n        \n        \"w:sdt\": function(element) {\n            return readXmlElements(element.firstOrEmpty(\"w:sdtContent\").children);\n        },\n\n        \"w:ins\": readChildElements,\n        \"w:object\": readChildElements,\n        \"w:smartTag\": readChildElements,\n        \"w:drawing\": readChildElements,\n        \"w:pict\": function(element) {\n            return readChildElements(element).toExtra();\n        },\n        \"v:roundrect\": readChildElements,\n        \"v:shape\": readChildElements,\n        \"v:textbox\": readChildElements,\n        \"w:txbxContent\": readChildElements,\n        \"wp:inline\": readDrawingElement,\n        \"wp:anchor\": readDrawingElement,\n        \"v:imagedata\": readImageData,\n        \"v:group\": readChildElements,\n        \"v:rect\": readChildElements\n    };\n    \n    return {\n        readXmlElement: readXmlElement,\n        readXmlElements: readXmlElements\n    };\n\n    \n    function readTable(element) {\n        var propertiesResult = readTableProperties(element.firstOrEmpty(\"w:tblPr\"));\n        return readXmlElements(element.children)\n            .flatMap(calculateRowSpans)\n            .flatMap(function(children) {\n                return propertiesResult.map(function(properties) {\n                    return documents.Table(children, properties);\n                });\n            });\n    }\n    \n    function readTableProperties(element) {\n        return readTableStyle(element).map(function(style) {\n            return {\n                styleId: style.styleId,\n                styleName: style.name\n            };\n        });\n    }\n    \n    function readTableRow(element) {\n        var properties = element.firstOrEmpty(\"w:trPr\");\n        var isHeader = !!properties.first(\"w:tblHeader\");\n        return readXmlElements(element.children).map(function(children) {\n            return documents.TableRow(children, {isHeader: isHeader});\n        });\n    }\n    \n    function readTableCell(element) {\n        return readXmlElements(element.children).map(function(children) {\n            var properties = element.firstOrEmpty(\"w:tcPr\");\n            \n            var gridSpan = properties.firstOrEmpty(\"w:gridSpan\").attributes[\"w:val\"];\n            var colSpan = gridSpan ? parseInt(gridSpan, 10) : 1;\n            \n            var cell = documents.TableCell(children, {colSpan: colSpan});\n            cell._vMerge = readVMerge(properties);\n            return cell;\n        });\n    }\n    \n    function readVMerge(properties) {\n        var element = properties.first(\"w:vMerge\");\n        if (element) {\n            var val = element.attributes[\"w:val\"];\n            return val === \"continue\" || !val;\n        } else {\n            return null;\n        }\n    }\n    \n    function calculateRowSpans(rows) {\n        var unexpectedNonRows = _.any(rows, function(row) {\n            return row.type !== documents.types.tableRow;\n        });\n        if (unexpectedNonRows) {\n            return elementResultWithMessages(rows, [warning(\n                \"unexpected non-row element in table, cell merging may be incorrect\"\n            )]);\n        }\n        var unexpectedNonCells = _.any(rows, function(row) {\n            return _.any(row.children, function(cell) {\n                return cell.type !== documents.types.tableCell;\n            });\n        });\n        if (unexpectedNonCells) {\n            return elementResultWithMessages(rows, [warning(\n                \"unexpected non-cell element in table row, cell merging may be incorrect\"\n            )]);\n        }\n        \n        var columns = {};\n        \n        rows.forEach(function(row) {\n            var cellIndex = 0;\n            row.children.forEach(function(cell) {\n                if (cell._vMerge && columns[cellIndex]) {\n                    columns[cellIndex].rowSpan++;\n                } else {\n                    columns[cellIndex] = cell;\n                    cell._vMerge = false;\n                }\n                cellIndex += cell.colSpan;\n            });\n        });\n        \n        rows.forEach(function(row) {\n            row.children = row.children.filter(function(cell) {\n                return !cell._vMerge;\n            });\n            row.children.forEach(function(cell) {\n                delete cell._vMerge;\n            });\n        });\n        \n        return elementResult(rows);\n    }\n\n    function readDrawingElement(element) {\n        var blips = element\n            .getElementsByTagName(\"a:graphic\")\n            .getElementsByTagName(\"a:graphicData\")\n            .getElementsByTagName(\"pic:pic\")\n            .getElementsByTagName(\"pic:blipFill\")\n            .getElementsByTagName(\"a:blip\");\n        \n        return combineResults(blips.map(readBlip.bind(null, element)));\n    }\n    \n    function readBlip(element, blip) {\n        var properties = element.first(\"wp:docPr\").attributes;\n        var altText = isBlank(properties.descr) ? properties.title : properties.descr;\n        return readImage(findBlipImageFile(blip), altText);\n    }\n    \n    function isBlank(value) {\n        return value == null || /^\\s*$/.test(value);\n    }\n    \n    function findBlipImageFile(blip) {\n        var embedRelationshipId = blip.attributes[\"r:embed\"];\n        var linkRelationshipId = blip.attributes[\"r:link\"];\n        if (embedRelationshipId) {\n            return findEmbeddedImageFile(embedRelationshipId);\n        } else {\n            var imagePath = relationships.findTargetByRelationshipId(linkRelationshipId);\n            return {\n                path: imagePath,\n                read: files.read.bind(files, imagePath)\n            };\n        }\n    }\n    \n    function readImageData(element) {\n        var relationshipId = element.attributes['r:id'];\n        \n        if (relationshipId) {\n            return readImage(\n                findEmbeddedImageFile(relationshipId),\n                element.attributes[\"o:title\"]);\n        } else {\n            return emptyResultWithMessages([warning(\"A v:imagedata element without a relationship ID was ignored\")]);\n        }\n    }\n    \n    function findEmbeddedImageFile(relationshipId) {\n        var path = uris.uriToZipEntryName(\"word\", relationships.findTargetByRelationshipId(relationshipId));\n        return {\n            path: path,\n            read: docxFile.read.bind(docxFile, path)\n        };\n    }\n    \n    function readImage(imageFile, altText) {\n        var contentType = contentTypes.findContentType(imageFile.path);\n        \n        var image = documents.Image({\n            readImage: imageFile.read,\n            altText: altText,\n            contentType: contentType\n        });\n        var warnings = supportedImageTypes[contentType] ?\n            [] : warning(\"Image of type \" + contentType + \" is unlikely to display in web browsers\");\n        return elementResultWithMessages(image, warnings);\n    }\n    \n    function undefinedStyleWarning(type, styleId) {\n        return warning(\n            type + \" style with ID \" + styleId + \" was referenced but not defined in the document\");\n    }\n}\n\n\nfunction readNumberingProperties(element, numbering) {\n    var level = element.firstOrEmpty(\"w:ilvl\").attributes[\"w:val\"];\n    var numId = element.firstOrEmpty(\"w:numId\").attributes[\"w:val\"];\n    if (level === undefined || numId === undefined) {\n        return null;\n    } else {\n        return numbering.findLevel(numId, level);\n    }\n}\n    \nvar supportedImageTypes = {\n    \"image/png\": true,\n    \"image/gif\": true,\n    \"image/jpeg\": true,\n    \"image/svg+xml\": true,\n    \"image/tiff\": true\n};\n\nvar ignoreElements = {\n    \"office-word:wrap\": true,\n    \"v:shadow\": true,\n    \"v:shapetype\": true,\n    \"w:annotationRef\": true,\n    \"w:bookmarkEnd\": true,\n    \"w:sectPr\": true,\n    \"w:proofErr\": true,\n    \"w:lastRenderedPageBreak\": true,\n    \"w:commentRangeStart\": true,\n    \"w:commentRangeEnd\": true,\n    \"w:del\": true,\n    \"w:footnoteRef\": true,\n    \"w:endnoteRef\": true,\n    \"w:tblPr\": true,\n    \"w:tblGrid\": true,\n    \"w:trPr\": true,\n    \"w:tcPr\": true\n};\n\nfunction isParagraphProperties(element) {\n    return element.type === \"paragraphProperties\";\n}\n\nfunction isRunProperties(element) {\n    return element.type === \"runProperties\";\n}\n\nfunction negate(predicate) {\n    return function(value) {\n        return !predicate(value);\n    };\n}\n\n\nfunction emptyResultWithMessages(messages) {\n    return new ReadResult(null, null, messages);\n}\n\nfunction emptyResult() {\n    return new ReadResult(null);\n}\n\nfunction elementResult(element) {\n    return new ReadResult(element);\n}\n\nfunction elementResultWithMessages(element, messages) {\n    return new ReadResult(element, null, messages);\n}\n\nfunction ReadResult(element, extra, messages) {\n    this.value = element || [];\n    this.extra = extra;\n    this._result = new Result({\n        element: this.value,\n        extra: extra\n    }, messages);\n    this.messages = this._result.messages;\n}\n\nReadResult.prototype.toExtra = function() {\n    return new ReadResult(null, joinElements(this.extra, this.value), this.messages);\n};\n\nReadResult.prototype.insertExtra = function() {\n    var extra = this.extra;\n    if (extra && extra.length) {\n        return new ReadResult(joinElements(this.value, extra), null, this.messages);\n    } else {\n        return this;\n    }\n};\n\nReadResult.prototype.map = function(func) {\n    var result = this._result.map(function(value) {\n        return func(value.element);\n    });\n    return new ReadResult(result.value, this.extra, result.messages);\n};\n\nReadResult.prototype.flatMap = function(func) {\n    var result = this._result.flatMap(function(value) {\n        return func(value.element)._result;\n    });\n    return new ReadResult(result.value.element, joinElements(this.extra, result.value.extra), result.messages);\n};\n\nfunction combineResults(results) {\n    var result = Result.combine(_.pluck(results, \"_result\"));\n    return new ReadResult(\n        _.flatten(_.pluck(result.value, \"element\")),\n        _.filter(_.flatten(_.pluck(result.value, \"extra\")), identity),\n        result.messages\n    );\n}\n\nfunction joinElements(first, second) {\n    return _.flatten([first, second]);\n}\n\nfunction identity(value) {\n    return value;\n}\n\n},{\"../documents\":4,\"../results\":24,\"./uris\":16,\"underscore\":153}],6:[function(require,module,exports){\nvar documents = require(\"../documents\");\nvar Result = require(\"../results\").Result;\n\nfunction createCommentsReader(bodyReader) {\n    function readCommentsXml(element) {\n        return Result.combine(element.getElementsByTagName(\"w:comment\")\n            .map(readCommentElement));\n    }\n\n    function readCommentElement(element) {\n        var id = element.attributes[\"w:id\"];\n\n        function readOptionalAttribute(name) {\n            return (element.attributes[name] || \"\").trim() || null;\n        }\n\n        return bodyReader.readXmlElements(element.children)\n            .map(function(body) {\n                return documents.comment({\n                    commentId: id,\n                    body: body,\n                    authorName: readOptionalAttribute(\"w:author\"),\n                    authorInitials: readOptionalAttribute(\"w:initials\")\n                });\n            });\n    }\n    \n    return readCommentsXml;\n}\n\nexports.createCommentsReader = createCommentsReader;\n\n},{\"../documents\":4,\"../results\":24}],7:[function(require,module,exports){\nexports.readContentTypesFromXml = readContentTypesFromXml;\n\nvar fallbackContentTypes = {\n    \"png\": \"png\",\n    \"gif\": \"gif\",\n    \"jpeg\": \"jpeg\",\n    \"jpg\": \"jpeg\",\n    \"tif\": \"tiff\",\n    \"tiff\": \"tiff\",\n    \"bmp\": \"bmp\"\n};\n\nexports.defaultContentTypes = contentTypes({}, {});\n\n\nfunction readContentTypesFromXml(element) {\n    var extensionDefaults = {};\n    var overrides = {};\n    \n    element.children.forEach(function(child) {\n        if (child.name === \"content-types:Default\") {\n            extensionDefaults[child.attributes.Extension] = child.attributes.ContentType;\n        }\n        if (child.name === \"content-types:Override\") {\n            var name = child.attributes.PartName;\n            if (name.charAt(0) === \"/\") {\n                name = name.substring(1);\n            }\n            overrides[name] = child.attributes.ContentType;\n        }\n    });\n    return contentTypes(overrides, extensionDefaults);\n}\n\nfunction contentTypes(overrides, extensionDefaults) {\n    return {\n        findContentType: function(path) {\n            var overrideContentType = overrides[path];\n            if (overrideContentType) {\n                return overrideContentType;\n            } else {\n                var pathParts = path.split(\".\");\n                var extension = pathParts[pathParts.length - 1];\n                if (extensionDefaults.hasOwnProperty(extension)) {\n                    return extensionDefaults[extension];\n                } else {\n                    var fallback = fallbackContentTypes[extension.toLowerCase()];\n                    if (fallback) {\n                        return \"image/\" + fallback;\n                    } else {\n                        return null;\n                    }\n                }\n            }\n        }\n    };\n    \n}\n\n},{}],8:[function(require,module,exports){\nexports.DocumentXmlReader = DocumentXmlReader;\n\nvar documents = require(\"../documents\");\nvar Result = require(\"../results\").Result;\n\n\nfunction DocumentXmlReader(options) {\n    var bodyReader = options.bodyReader;\n    \n    function convertXmlToDocument(element) {\n        var body = element.first(\"w:body\");\n        \n        var result = bodyReader.readXmlElements(body.children)\n            .map(function(children) {\n                return new documents.Document(children, {\n                    notes: options.notes,\n                    comments: options.comments\n                });\n            });\n        return new Result(result.value, result.messages);\n    }\n    \n    return {\n        convertXmlToDocument: convertXmlToDocument\n    };\n}\n\n},{\"../documents\":4,\"../results\":24}],9:[function(require,module,exports){\nexports.read = read;\nexports._findPartPaths = findPartPaths;\n\nvar path = require(\"path\");\n\nvar promises = require(\"../promises\");\nvar documents = require(\"../documents\");\nvar Result = require(\"../results\").Result;\nvar zipfile = require(\"../zipfile\");\n\nvar readXmlFromZipFile = require(\"./office-xml-reader\").readXmlFromZipFile;\nvar createBodyReader = require(\"./body-reader\").createBodyReader;\nvar DocumentXmlReader = require(\"./document-xml-reader\").DocumentXmlReader;\nvar relationshipsReader = require(\"./relationships-reader\");\nvar contentTypesReader = require(\"./content-types-reader\");\nvar numberingXml = require(\"./numbering-xml\");\nvar stylesReader = require(\"./styles-reader\");\nvar notesReader = require(\"./notes-reader\");\nvar commentsReader = require(\"./comments-reader\");\nvar Files = require(\"./files\").Files;\n\n\nfunction read(docxFile, input) {\n    input = input || {};\n    \n    return promises.props({\n        contentTypes: readContentTypesFromZipFile(docxFile),\n        partPaths: findPartPaths(docxFile),\n        docxFile: docxFile,\n        files: new Files(input.path ? path.dirname(input.path) : null)\n    }).also(function(result) {\n        return {\n            numbering: readNumberingFromZipFile(docxFile, result.partPaths.numbering),\n            styles: readStylesFromZipFile(docxFile, result.partPaths.styles)\n        };\n    }).also(function(result) {\n        return {\n            footnotes: readXmlFileWithBody(result.partPaths.footnotes, result, function(bodyReader, xml) {\n                if (xml) {\n                    return notesReader.createFootnotesReader(bodyReader)(xml);\n                } else {\n                    return new Result([]);\n                }\n            }),\n            endnotes: readXmlFileWithBody(result.partPaths.endnotes, result, function(bodyReader, xml) {\n                if (xml) {\n                    return notesReader.createEndnotesReader(bodyReader)(xml);\n                } else {\n                    return new Result([]);\n                }\n            }),\n            comments: readXmlFileWithBody(result.partPaths.comments, result, function(bodyReader, xml) {\n                if (xml) {\n                    return commentsReader.createCommentsReader(bodyReader)(xml);\n                } else {\n                    return new Result([]);\n                }\n            })\n        };\n    }).also(function(result) {\n        return {\n            notes: result.footnotes.flatMap(function(footnotes) {\n                return result.endnotes.map(function(endnotes) {\n                    return new documents.Notes(footnotes.concat(endnotes));\n                });\n            })\n        };\n    }).then(function(result) {\n        return readXmlFileWithBody(result.partPaths.mainDocument, result, function(bodyReader, xml) {\n            return result.notes.flatMap(function(notes) {\n                return result.comments.flatMap(function(comments) {\n                    var reader = new DocumentXmlReader({\n                        bodyReader: bodyReader,\n                        notes: notes,\n                        comments: comments\n                    });\n                    return reader.convertXmlToDocument(xml);\n                });\n            });\n        });\n    });\n}\n\nfunction findPartPaths(docxFile) {\n    return readPackageRelationships(docxFile).then(function(packageRelationships) {\n        var mainDocumentPath = findPartPath({\n            docxFile: docxFile,\n            relationships: packageRelationships,\n            relationshipType: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n            basePath: \"\",\n            fallbackPath: \"word/document.xml\"\n        });\n        \n        if (!docxFile.exists(mainDocumentPath)) {\n            throw new Error(\"Could not find main document part. Are you sure this is a valid .docx file?\");\n        }\n        \n        return xmlFileReader({\n            filename: relationshipsFilename(mainDocumentPath),\n            readElement: relationshipsReader.readRelationships,\n            defaultValue: relationshipsReader.defaultValue\n        })(docxFile).then(function(documentRelationships) {\n            function findPartRelatedToMainDocument(name) {\n                return findPartPath({\n                    docxFile: docxFile,\n                    relationships: documentRelationships,\n                    relationshipType: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/\" + name,\n                    basePath: zipfile.splitPath(mainDocumentPath).dirname,\n                    fallbackPath: \"word/\" + name + \".xml\"\n                });\n            }\n        \n            return {\n                mainDocument: mainDocumentPath,\n                comments: findPartRelatedToMainDocument(\"comments\"),\n                endnotes: findPartRelatedToMainDocument(\"endnotes\"),\n                footnotes: findPartRelatedToMainDocument(\"footnotes\"),\n                numbering: findPartRelatedToMainDocument(\"numbering\"),\n                styles: findPartRelatedToMainDocument(\"styles\")\n            };\n        });\n    });\n}\n\nfunction findPartPath(options) {\n    var docxFile = options.docxFile;\n    var relationships = options.relationships;\n    var relationshipType = options.relationshipType;\n    var basePath = options.basePath;\n    var fallbackPath = options.fallbackPath;\n    \n    var targets = relationships.findTargetsByType(relationshipType);\n    var normalisedTargets = targets.map(function(target) {\n        return stripPrefix(zipfile.joinPath(basePath, target), \"/\");\n    });\n    var validTargets = normalisedTargets.filter(function(target) {\n        return docxFile.exists(target);\n    });\n    if (validTargets.length === 0) {\n        return fallbackPath;\n    } else {\n        return validTargets[0];\n    }\n}\n\nfunction stripPrefix(value, prefix) {\n    if (value.substring(0, prefix.length) === prefix) {\n        return value.substring(prefix.length);\n    } else {\n        return value;\n    }\n}\n\nfunction xmlFileReader(options) {\n    return function(zipFile) {\n        return readXmlFromZipFile(zipFile, options.filename)\n            .then(function(element) {\n                return element ? options.readElement(element) : options.defaultValue;\n            });\n    };\n}\n\nfunction readXmlFileWithBody(filename, options, func) {\n    var readRelationshipsFromZipFile = xmlFileReader({\n        filename: relationshipsFilename(filename),\n        readElement: relationshipsReader.readRelationships,\n        defaultValue: relationshipsReader.defaultValue\n    });\n    \n    return readRelationshipsFromZipFile(options.docxFile).then(function(relationships) {\n        var bodyReader = new createBodyReader({\n            relationships: relationships,\n            contentTypes: options.contentTypes,\n            docxFile: options.docxFile,\n            numbering: options.numbering,\n            styles: options.styles,\n            files: options.files\n        });\n        return readXmlFromZipFile(options.docxFile, filename)\n            .then(function(xml) {\n                return func(bodyReader, xml);\n            });\n    });\n}\n\nfunction relationshipsFilename(filename) {\n    var split = zipfile.splitPath(filename);\n    return zipfile.joinPath(split.dirname, \"_rels\", split.basename + \".rels\");\n}\n\nvar readContentTypesFromZipFile = xmlFileReader({\n    filename: \"[Content_Types].xml\",\n    readElement: contentTypesReader.readContentTypesFromXml,\n    defaultValue: contentTypesReader.defaultContentTypes\n});\n\nfunction readNumberingFromZipFile(zipFile, path) {\n    return xmlFileReader({\n        filename: path,\n        readElement: numberingXml.readNumberingXml,\n        defaultValue: numberingXml.defaultNumbering\n    })(zipFile);\n}\n\nfunction readStylesFromZipFile(zipFile, path) {\n    return xmlFileReader({\n        filename: path,\n        readElement: stylesReader.readStylesXml,\n        defaultValue: stylesReader.defaultStyles\n    })(zipFile);\n}\n\nvar readPackageRelationships = xmlFileReader({\n    filename: \"_rels/.rels\",\n    readElement: relationshipsReader.readRelationships,\n    defaultValue: relationshipsReader.defaultValue\n});\n\n},{\"../documents\":4,\"../promises\":23,\"../results\":24,\"../zipfile\":38,\"./body-reader\":5,\"./comments-reader\":6,\"./content-types-reader\":7,\"./document-xml-reader\":8,\"./files\":1,\"./notes-reader\":10,\"./numbering-xml\":11,\"./office-xml-reader\":12,\"./relationships-reader\":13,\"./styles-reader\":15,\"path\":136}],10:[function(require,module,exports){\nvar documents = require(\"../documents\");\nvar Result = require(\"../results\").Result;\n\nexports.createFootnotesReader = createReader.bind(this, \"footnote\");\nexports.createEndnotesReader = createReader.bind(this, \"endnote\");\n\nfunction createReader(noteType, bodyReader) {\n    function readNotesXml(element) {\n        return Result.combine(element.getElementsByTagName(\"w:\" + noteType)\n            .filter(isFootnoteElement)\n            .map(readFootnoteElement));\n    }\n\n    function isFootnoteElement(element) {\n        var type = element.attributes[\"w:type\"];\n        return type !== \"continuationSeparator\" && type !== \"separator\";\n    }\n\n    function readFootnoteElement(footnoteElement) {\n        var id = footnoteElement.attributes[\"w:id\"];\n        return bodyReader.readXmlElements(footnoteElement.children)\n            .map(function(body) {\n                return documents.Note({noteType: noteType, noteId: id, body: body});\n            });\n    }\n    \n    return readNotesXml;\n}\n\n},{\"../documents\":4,\"../results\":24}],11:[function(require,module,exports){\nexports.readNumberingXml = readNumberingXml;\nexports.Numbering = Numbering;\nexports.defaultNumbering = new Numbering({});\n\nfunction Numbering(nums) {\n    return {\n        findLevel: function(numId, level) {\n            var num = nums[numId];\n            if (num) {\n                return num[level];\n            } else {\n                return null;\n            }\n        }\n    };\n}\n\nfunction readNumberingXml(root) {\n    var abstractNums = readAbstractNums(root);\n    var nums = readNums(root, abstractNums);\n    return new Numbering(nums);\n}\n\nfunction readAbstractNums(root) {\n    var abstractNums = {};\n    root.getElementsByTagName(\"w:abstractNum\").forEach(function(element) {\n        var id = element.attributes[\"w:abstractNumId\"];\n        abstractNums[id] = readAbstractNum(element);\n    });\n    return abstractNums;\n}\n\nfunction readAbstractNum(element) {\n    var levels = {};\n    element.getElementsByTagName(\"w:lvl\").forEach(function(levelElement) {\n        var levelIndex = levelElement.attributes[\"w:ilvl\"];\n        var numFmt = levelElement.first(\"w:numFmt\").attributes[\"w:val\"];\n        levels[levelIndex] = {\n            isOrdered: numFmt !== \"bullet\",\n            level: levelIndex\n        };\n    });\n    return levels;\n}\n\nfunction readNums(root, abstractNums) {\n    var nums = {};\n    root.getElementsByTagName(\"w:num\").forEach(function(element) {\n        var id = element.attributes[\"w:numId\"];\n        var abstractNumId = element.first(\"w:abstractNumId\").attributes[\"w:val\"];\n        nums[id] = abstractNums[abstractNumId];\n    });\n    return nums;\n}\n\n},{}],12:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar promises = require(\"../promises\");\nvar xml = require(\"../xml\");\n\n\nexports.read = read;\nexports.readXmlFromZipFile = readXmlFromZipFile;\n\nvar xmlNamespaceMap = {\n    \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\": \"w\",\n    \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\": \"r\",\n    \"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\": \"wp\",\n    \"http://schemas.openxmlformats.org/drawingml/2006/main\": \"a\",\n    \"http://schemas.openxmlformats.org/drawingml/2006/picture\": \"pic\",\n    \"http://schemas.openxmlformats.org/package/2006/content-types\": \"content-types\",\n    \"urn:schemas-microsoft-com:vml\": \"v\",\n    \"http://schemas.openxmlformats.org/markup-compatibility/2006\": \"mc\",\n    \"urn:schemas-microsoft-com:office:word\": \"office-word\"\n};\n\n\nfunction read(xmlString) {\n    return xml.readString(xmlString, xmlNamespaceMap)\n        .then(function(document) {\n            return collapseAlternateContent(document)[0];\n        });\n}\n\n\nfunction readXmlFromZipFile(docxFile, path) {\n    if (docxFile.exists(path)) {\n        return docxFile.read(path, \"utf-8\")\n            .then(stripUtf8Bom)\n            .then(read);\n    } else {\n        return promises.resolve(null);\n    }\n}\n\n\nfunction stripUtf8Bom(xmlString) {\n    return xmlString.replace(/^\\uFEFF/g, '');\n}\n\n\nfunction collapseAlternateContent(node) {\n    if (node.type === \"element\") {\n        if (node.name === \"mc:AlternateContent\") {\n            return node.first(\"mc:Fallback\").children;\n        } else {\n            node.children = _.flatten(node.children.map(collapseAlternateContent, true));\n            return [node];\n        }\n    } else {\n        return [node];\n    }\n}\n\n},{\"../promises\":23,\"../xml\":34,\"underscore\":153}],13:[function(require,module,exports){\nexports.readRelationships = readRelationships;\nexports.defaultValue = new Relationships([]);\nexports.Relationships = Relationships;\n\n\nfunction readRelationships(element) {\n    var relationships = [];\n    element.children.forEach(function(child) {\n        if (child.name === \"{http://schemas.openxmlformats.org/package/2006/relationships}Relationship\") {\n            var relationship = {\n                relationshipId: child.attributes.Id,\n                target: child.attributes.Target,\n                type: child.attributes.Type\n            };\n            relationships.push(relationship);\n        }\n    });\n    return new Relationships(relationships);\n}\n\nfunction Relationships(relationships) {\n    var targetsByRelationshipId = {};\n    relationships.forEach(function(relationship) {\n        targetsByRelationshipId[relationship.relationshipId] = relationship.target;\n    });\n    \n    var targetsByType = {};\n    relationships.forEach(function(relationship) {\n        if (!targetsByType[relationship.type]) {\n            targetsByType[relationship.type] = [];\n        }\n        targetsByType[relationship.type].push(relationship.target);\n    });\n            \n    return {\n        findTargetByRelationshipId: function(relationshipId) {\n            return targetsByRelationshipId[relationshipId];\n        },\n        findTargetsByType: function(type) {\n            return targetsByType[type] || [];\n        }\n    };\n}\n\n},{}],14:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar promises = require(\"../promises\");\nvar xml = require(\"../xml\");\n\nexports.writeStyleMap = writeStyleMap;\nexports.readStyleMap = readStyleMap;\n\n\nvar schema = \"http://schemas.zwobble.org/mammoth/style-map\";\nvar styleMapPath = \"mammoth/style-map\";\nvar styleMapAbsolutePath = \"/\" + styleMapPath;\n\nfunction writeStyleMap(docxFile, styleMap) {\n    docxFile.write(styleMapPath, styleMap);\n    return updateRelationships(docxFile).then(function() {\n        return updateContentTypes(docxFile);\n    });\n}\n\nfunction updateRelationships(docxFile) {\n    var path = \"word/_rels/document.xml.rels\";\n    var relationshipsUri = \"http://schemas.openxmlformats.org/package/2006/relationships\";\n    var relationshipElementName = \"{\" + relationshipsUri + \"}Relationship\";\n    return docxFile.read(path, \"utf8\")\n        .then(xml.readString)\n        .then(function(relationshipsContainer) {\n            var relationships = relationshipsContainer.children;\n            addOrUpdateElement(relationships, relationshipElementName, \"Id\", {\n                \"Id\": \"rMammothStyleMap\",\n                \"Type\": schema,\n                \"Target\": styleMapAbsolutePath\n            });\n            \n            var namespaces = {\"\": relationshipsUri};\n            return docxFile.write(path, xml.writeString(relationshipsContainer, namespaces));\n        });\n}\n\nfunction updateContentTypes(docxFile) {\n    var path = \"[Content_Types].xml\";\n    var contentTypesUri = \"http://schemas.openxmlformats.org/package/2006/content-types\";\n    var overrideName = \"{\" + contentTypesUri + \"}Override\";\n    return docxFile.read(path, \"utf8\")\n        .then(xml.readString)\n        .then(function(typesElement) {\n            var children = typesElement.children;\n            addOrUpdateElement(children, overrideName, \"PartName\", {\n                \"PartName\": styleMapAbsolutePath,\n                \"ContentType\": \"text/prs.mammoth.style-map\"\n            });\n            var namespaces = {\"\": contentTypesUri};\n            return docxFile.write(path, xml.writeString(typesElement, namespaces));\n        });\n}\n\nfunction addOrUpdateElement(elements, name, identifyingAttribute, attributes) {\n    var existingElement = _.find(elements, function(element) {\n        return element.name === name &&\n            element.attributes[identifyingAttribute] === attributes[identifyingAttribute];\n    });\n    if (existingElement) {\n        existingElement.attributes = attributes;\n    } else {\n        elements.push(xml.element(name, attributes));\n    }\n}\n\nfunction readStyleMap(docxFile) {\n    if (docxFile.exists(styleMapPath)) {\n        return docxFile.read(styleMapPath, \"utf8\");\n    } else {\n        return promises.resolve(null);\n    }\n}\n\n},{\"../promises\":23,\"../xml\":34,\"underscore\":153}],15:[function(require,module,exports){\nexports.readStylesXml = readStylesXml;\nexports.Styles = Styles;\nexports.defaultStyles = new Styles({}, {});\n\nfunction Styles(paragraphStyles, characterStyles, tableStyles) {\n    return {\n        findParagraphStyleById: function(styleId) {\n            return paragraphStyles[styleId];\n        },\n        findCharacterStyleById: function(styleId) {\n            return characterStyles[styleId];\n        },\n        findTableStyleById: function(styleId) {\n            return tableStyles[styleId];\n        }\n    };\n}\n\nStyles.EMPTY = new Styles({}, {}, {});\n\nfunction readStylesXml(root) {\n    var paragraphStyles = {};\n    var characterStyles = {};\n    var tableStyles = {};\n    \n    var styles = {\n        \"paragraph\": paragraphStyles,\n        \"character\": characterStyles,\n        \"table\": tableStyles\n    };\n    \n    root.getElementsByTagName(\"w:style\").forEach(function(styleElement) {\n        var style = readStyleElement(styleElement);\n        var styleSet = styles[style.type];\n        if (styleSet) {\n            styleSet[style.styleId] = style;\n        }\n    });\n    \n    return new Styles(paragraphStyles, characterStyles, tableStyles);\n}\n\nfunction readStyleElement(styleElement) {\n    var type = styleElement.attributes[\"w:type\"];\n    var styleId = styleElement.attributes[\"w:styleId\"];\n    var name = styleName(styleElement);\n    return {type: type, styleId: styleId, name: name};\n}\n\nfunction styleName(styleElement) {\n    var nameElement = styleElement.first(\"w:name\");\n    return nameElement ? nameElement.attributes[\"w:val\"] : null;\n}\n\n},{}],16:[function(require,module,exports){\nexports.uriToZipEntryName = uriToZipEntryName;\nexports.replaceFragment = replaceFragment;\n\nfunction uriToZipEntryName(base, uri) {\n    if (uri.charAt(0) === \"/\") {\n        return uri.substr(1);\n    } else {\n        // In general, we should check first and second for trailing and leading slashes,\n        // but in our specific case this seems to be sufficient\n        return base + \"/\" + uri;\n    }\n}\n\n\nfunction replaceFragment(uri, fragment) {\n    var hashIndex = uri.indexOf(\"#\");\n    if (hashIndex !== -1) {\n        uri = uri.substring(0, hashIndex);\n    }\n    return uri + \"#\" + fragment;\n}\n\n},{}],17:[function(require,module,exports){\nvar htmlPaths = require(\"../styles/html-paths\");\n\n\nfunction nonFreshElement(tagName, attributes, children) {\n    return elementWithTag(\n        htmlPaths.element(tagName, attributes, {fresh: false}),\n        children);\n}\n\nfunction freshElement(tagName, attributes, children) {\n    var tag = htmlPaths.element(tagName, attributes, {fresh: true});\n    return elementWithTag(tag, children);\n}\n\nfunction elementWithTag(tag, children) {\n    return {\n        type: \"element\",\n        tag: tag,\n        children: children || []\n    };\n}\n\nfunction text(value) {\n    return {\n        type: \"text\",\n        value: value\n    };\n}\n\nvar forceWrite = {\n    type: \"forceWrite\"\n};\n\nexports.freshElement = freshElement;\nexports.nonFreshElement = nonFreshElement;\nexports.elementWithTag = elementWithTag;\nexports.text = text;\nexports.forceWrite = forceWrite;\n\nvar voidTagNames = {\n    \"br\": true,\n    \"hr\": true,\n    \"img\": true\n};\n\nfunction isVoidElement(node) {\n    return (node.children.length === 0) && voidTagNames[node.tag.tagName];\n}\n\nexports.isVoidElement = isVoidElement;\n\n},{\"../styles/html-paths\":27}],18:[function(require,module,exports){\nvar ast = require(\"./ast\");\n\nexports.freshElement = ast.freshElement;\nexports.nonFreshElement = ast.nonFreshElement;\nexports.elementWithTag = ast.elementWithTag;\nexports.text = ast.text;\nexports.forceWrite = ast.forceWrite;\n\nexports.simplify = require(\"./simplify\");\n\nfunction write(writer, nodes) {\n    nodes.forEach(function(node) {\n        writeNode(writer, node);\n    });\n}\n\nfunction writeNode(writer, node) {\n    toStrings[node.type](writer, node);\n}\n\nvar toStrings = {\n    element: generateElementString,\n    text: generateTextString,\n    forceWrite: function() { }\n};\n\nfunction generateElementString(writer, node) {\n    if (ast.isVoidElement(node)) {\n        writer.selfClosing(node.tag.tagName, node.tag.attributes);\n    } else {\n        writer.open(node.tag.tagName, node.tag.attributes);\n        write(writer, node.children);\n        writer.close(node.tag.tagName);\n    }\n}\n\nfunction generateTextString(writer, node) {\n    writer.text(node.value);\n}\n\nexports.write = write;\n\n},{\"./ast\":17,\"./simplify\":19}],19:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar ast = require(\"./ast\");\n\nfunction simplify(nodes) {\n    return collapse(removeEmpty(nodes));\n}\n\nfunction collapse(nodes) {\n    var children = [];\n    \n    nodes.map(collapseNode).forEach(function(child) {\n        appendChild(children, child);\n    });\n    return children;\n}\n\nfunction collapseNode(node) {\n    return collapsers[node.type](node);\n}\n\nvar collapsers = {\n    element: collapseElement,\n    text: identity,\n    forceWrite: identity\n};\n\nfunction collapseElement(node) {\n    return ast.elementWithTag(node.tag, collapse(node.children));\n}\n\nfunction identity(value) {\n    return value;\n}\n\nfunction appendChild(children, child) {\n    var lastChild = children[children.length - 1];\n    if (child.type === \"element\" && !child.tag.fresh && lastChild && lastChild.type === \"element\" && child.tag.matchesElement(lastChild.tag)) {\n        if (child.tag.separator) {\n            appendChild(lastChild.children, ast.text(child.tag.separator));\n        }\n        child.children.forEach(function(grandChild) {\n            // Mutation is fine since simplifying elements create a copy of the children.\n            appendChild(lastChild.children, grandChild);\n        });\n    } else {\n        children.push(child);\n    }\n}\n\nfunction removeEmpty(nodes) {\n    return flatMap(nodes, function(node) {\n        return emptiers[node.type](node);\n    });\n}\n\nfunction flatMap(values, func) {\n    return _.flatten(_.map(values, func), true);\n}\n\nvar emptiers = {\n    element: elementEmptier,\n    text: textEmptier,\n    forceWrite: neverEmpty\n};\n\nfunction neverEmpty(node) {\n    return [node];\n}\n\nfunction elementEmptier(element) {\n    var children = removeEmpty(element.children);\n    if (children.length === 0 && !ast.isVoidElement(element)) {\n        return [];\n    } else {\n        return [ast.elementWithTag(element.tag, children)];\n    }\n}\n\nfunction textEmptier(node) {\n    if (node.value.length === 0) {\n        return [];\n    } else {\n        return [node];\n    }\n}\n\nmodule.exports = simplify;\n\n},{\"./ast\":17,\"underscore\":153}],20:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar promises = require(\"./promises\");\nvar Html = require(\"./html\");\n\nexports.imgElement = imgElement;\n\nfunction imgElement(func) {\n    return function(element, messages) {\n        return promises.when(func(element)).then(function(result) {\n            var attributes = _.clone(result);\n            if (element.altText) {\n                attributes.alt = element.altText;\n            }\n            return [Html.freshElement(\"img\", attributes)];\n        });\n    };\n}\n\n// Undocumented, but retained for backwards-compatibility with 0.3.x\nexports.inline = exports.imgElement;\n\nexports.dataUri = imgElement(function(element) {\n    return element.read(\"base64\").then(function(imageBuffer) {\n        return {\n            src: \"data:\" + element.contentType + \";base64,\" + imageBuffer\n        };\n    });\n});\n\n},{\"./html\":18,\"./promises\":23,\"underscore\":153}],21:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar docxReader = require(\"./docx/docx-reader\");\nvar docxStyleMap = require(\"./docx/style-map\");\nvar DocumentConverter = require(\"./document-to-html\").DocumentConverter;\nvar readStyle = require(\"./style-reader\").readStyle;\nvar readOptions = require(\"./options-reader\").readOptions;\nvar unzip = require(\"./unzip\");\nvar Result = require(\"./results\").Result;\n\nexports.convertToHtml = convertToHtml;\nexports.convertToMarkdown = convertToMarkdown;\nexports.convert = convert;\nexports.extractRawText = extractRawText;\nexports.images = require(\"./images\");\nexports.transforms = require(\"./transforms\");\nexports.underline = require(\"./underline\");\nexports.embedStyleMap = embedStyleMap;\nexports.readEmbeddedStyleMap = readEmbeddedStyleMap;\n\nfunction convertToHtml(input, options) {\n    return convert(input, options);\n}\n\nfunction convertToMarkdown(input, options) {\n    var markdownOptions = Object.create(options || {});\n    markdownOptions.outputFormat = \"markdown\";\n    return convert(input, markdownOptions);\n}\n\nfunction convert(input, options) {\n    options = readOptions(options);\n    \n    return unzip.openZip(input)\n        .tap(function(docxFile) {\n            return docxStyleMap.readStyleMap(docxFile).then(function(styleMap) {\n                options.embeddedStyleMap = styleMap;\n            });\n        })\n        .then(function(docxFile) {\n            return docxReader.read(docxFile, input)\n                .then(function(documentResult) {\n                    return documentResult.map(options.transformDocument);\n                })\n                .then(function(documentResult) {\n                    return convertDocumentToHtml(documentResult, options);\n                });\n        });\n}\n\nfunction readEmbeddedStyleMap(input) {\n    return unzip.openZip(input)\n        .then(docxStyleMap.readStyleMap);\n}\n\nfunction convertDocumentToHtml(documentResult, options) {\n    var styleMapResult = parseStyleMap(options.readStyleMap());\n    var parsedOptions = _.extend({}, options, {\n        styleMap: styleMapResult.value\n    });\n    var documentConverter = new DocumentConverter(parsedOptions);\n    \n    return documentResult.flatMapThen(function(document) {\n        return styleMapResult.flatMapThen(function(styleMap) {\n            return documentConverter.convertToHtml(document);\n        });\n    });\n}\n\nfunction parseStyleMap(styleMap) {\n    return Result.combine((styleMap || []).map(readStyle))\n        .map(function(styleMap) {\n            return styleMap.filter(function(styleMapping) {\n                return !!styleMapping;\n            });\n        });\n}\n\n\nfunction extractRawText(input) {\n    return unzip.openZip(input)\n        .then(docxReader.read)\n        .then(function(documentResult) {\n            return documentResult.map(convertElementToRawText);\n        });\n}\n\nfunction convertElementToRawText(element) {\n    if (element.type === \"text\") {\n        return element.value;\n    } else {\n        var tail = element.type === \"paragraph\" ? \"\\n\\n\" : \"\";\n        return (element.children || []).map(convertElementToRawText).join(\"\") + tail;\n    }\n}\n\nfunction embedStyleMap(input, styleMap) {\n    return unzip.openZip(input)\n        .tap(function(docxFile) {\n            return docxStyleMap.writeStyleMap(docxFile, styleMap);\n        })\n        .then(function(docxFile) {\n            return {\n                toBuffer: docxFile.toBuffer\n            };\n        });\n}\n\nexports.styleMapping = function() {\n    throw new Error('Use a raw string instead of mammoth.styleMapping e.g. \"p[style-name=\\'Title\\'] => h1\" instead of mammoth.styleMapping(\"p[style-name=\\'Title\\'] => h1\")');\n};\n\n},{\"./document-to-html\":3,\"./docx/docx-reader\":9,\"./docx/style-map\":14,\"./images\":20,\"./options-reader\":22,\"./results\":24,\"./style-reader\":25,\"./transforms\":29,\"./underline\":30,\"./unzip\":2,\"underscore\":153}],22:[function(require,module,exports){\nexports.readOptions = readOptions;\n\n\nvar _ = require(\"underscore\");\n\nvar defaultStyleMap = exports._defaultStyleMap = [\n    \"p.Heading1 => h1:fresh\",\n    \"p.Heading2 => h2:fresh\",\n    \"p.Heading3 => h3:fresh\",\n    \"p.Heading4 => h4:fresh\",\n    \"p.Heading5 => h5:fresh\",\n    \"p.Heading6 => h6:fresh\",\n    \"p[style-name='Heading 1'] => h1:fresh\",\n    \"p[style-name='Heading 2'] => h2:fresh\",\n    \"p[style-name='Heading 3'] => h3:fresh\",\n    \"p[style-name='Heading 4'] => h4:fresh\",\n    \"p[style-name='Heading 5'] => h5:fresh\",\n    \"p[style-name='Heading 6'] => h6:fresh\",\n    \"p[style-name='heading 1'] => h1:fresh\",\n    \"p[style-name='heading 2'] => h2:fresh\",\n    \"p[style-name='heading 3'] => h3:fresh\",\n    \"p[style-name='heading 4'] => h4:fresh\",\n    \"p[style-name='heading 5'] => h5:fresh\",\n    \"p[style-name='heading 6'] => h6:fresh\",\n    \n    \"r[style-name='Strong'] => strong\",\n    \n    \"p[style-name='footnote text'] => p:fresh\",\n    \"r[style-name='footnote reference'] =>\",\n    \"p[style-name='endnote text'] => p:fresh\",\n    \"r[style-name='endnote reference'] =>\",\n    \"p[style-name='annotation text'] => p:fresh\",\n    \"r[style-name='annotation reference'] =>\",\n    \n    // LibreOffice\n    \"p[style-name='Footnote'] => p:fresh\",\n    \"r[style-name='Footnote anchor'] =>\",\n    \"p[style-name='Endnote'] => p:fresh\",\n    \"r[style-name='Endnote anchor'] =>\",\n    \n    \"p:unordered-list(1) => ul > li:fresh\",\n    \"p:unordered-list(2) => ul|ol > li > ul > li:fresh\",\n    \"p:unordered-list(3) => ul|ol > li > ul|ol > li > ul > li:fresh\",\n    \"p:unordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh\",\n    \"p:unordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh\",\n    \"p:ordered-list(1) => ol > li:fresh\",\n    \"p:ordered-list(2) => ul|ol > li > ol > li:fresh\",\n    \"p:ordered-list(3) => ul|ol > li > ul|ol > li > ol > li:fresh\",\n    \"p:ordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh\",\n    \"p:ordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh\",\n    \n    \"r[style-name='Hyperlink'] =>\",\n    \n    \"p[style-name='Normal'] => p:fresh\"\n];\n\nvar standardOptions = exports._standardOptions = {\n    transformDocument: identity,\n    includeDefaultStyleMap: true,\n    includeEmbeddedStyleMap: true\n};\n\nfunction readOptions(options) {\n    options = options || {};\n    return _.extend({}, standardOptions, options, {\n        customStyleMap: readStyleMap(options.styleMap),\n        readStyleMap: function() {\n            var styleMap = this.customStyleMap;\n            if (this.includeEmbeddedStyleMap) {\n                styleMap = styleMap.concat(readStyleMap(this.embeddedStyleMap));\n            }\n            if (this.includeDefaultStyleMap) {\n                styleMap = styleMap.concat(defaultStyleMap);\n            }\n            return styleMap;\n        }\n    });\n}\n\nfunction readStyleMap(styleMap) {\n    if (!styleMap) {\n        return [];\n    } else if (_.isString(styleMap)) {\n        return styleMap.split(\"\\n\")\n            .map(function(line) {\n                return line.trim();\n            })\n            .filter(function(line) {\n                return line !== \"\" && line.charAt(0) !== \"#\";\n            });\n    } else {\n        return styleMap;\n    }\n}\n\nfunction identity(value) {\n    return value;\n}\n\n},{\"underscore\":153}],23:[function(require,module,exports){\nvar _ = require(\"underscore\");\nvar bluebird = require(\"bluebird/js/release/promise\")();\n\nexports.defer = defer;\nexports.when = bluebird.resolve;\nexports.resolve = bluebird.resolve;\nexports.all = bluebird.all;\nexports.props = bluebird.props;\nexports.reject = bluebird.reject;\nexports.promisify = bluebird.promisify;\nexports.mapSeries = bluebird.mapSeries;\nexports.attempt = bluebird.attempt;\n\nexports.nfcall = function(func) {\n    var args = Array.prototype.slice.call(arguments, 1);\n    var promisedFunc = bluebird.promisify(func);\n    return promisedFunc.apply(null, args);\n};\n\nbluebird.prototype.fail = bluebird.prototype.caught;\n\nbluebird.prototype.also = function(func) {\n    return this.then(function(value) {\n        var returnValue = _.extend({}, value, func(value));\n        return bluebird.props(returnValue);\n    });\n};\n\nfunction defer() {\n    var resolve;\n    var reject;\n    var promise = new bluebird.Promise(function(resolveArg, rejectArg) {\n        resolve = resolveArg;\n        reject = rejectArg;\n    });\n\n    return {\n        resolve: resolve,\n        reject: reject,\n        promise: promise\n    };\n}\n\n},{\"bluebird/js/release/promise\":60,\"underscore\":153}],24:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\n\nexports.Result = Result;\nexports.success = success;\nexports.warning = warning;\nexports.error = error;\n\n\nfunction Result(value, messages) {\n    this.value = value;\n    this.messages = messages || [];\n}\n\nResult.prototype.map = function(func) {\n    return new Result(func(this.value), this.messages);\n};\n\nResult.prototype.flatMap = function(func) {\n    var funcResult = func(this.value);\n    return new Result(funcResult.value, combineMessages([this, funcResult]));\n};\n\nResult.prototype.flatMapThen = function(func) {\n    var that = this;\n    return func(this.value).then(function(otherResult) {\n        return new Result(otherResult.value, combineMessages([that, otherResult]));\n    });\n};\n\nResult.combine = function(results) {\n    var values = _.flatten(_.pluck(results, \"value\"));\n    var messages = combineMessages(results);\n    return new Result(values, messages);\n};\n\nfunction success(value) {\n    return new Result(value, []);\n}\n\nfunction warning(message) {\n    return {\n        type: \"warning\",\n        message: message\n    };\n}\n\nfunction error(exception) {\n    return {\n        type: \"error\",\n        message: exception.message,\n        error: exception\n    };\n}\n\nfunction combineMessages(results) {\n    var messages = [];\n    _.flatten(_.pluck(results, \"messages\"), true).forEach(function(message) {\n        if (!containsMessage(messages, message)) {\n            messages.push(message);\n        }\n    });\n    return messages;\n}\n\nfunction containsMessage(messages, message) {\n    return _.find(messages, isSameMessage.bind(null, message)) !== undefined;\n}\n\nfunction isSameMessage(first, second) {\n    return first.type === second.type && first.message === second.message;\n}\n\n},{\"underscore\":153}],25:[function(require,module,exports){\nvar _ = require(\"underscore\");\nvar lop = require(\"lop\");\n\nvar documentMatchers = require(\"./styles/document-matchers\");\nvar htmlPaths = require(\"./styles/html-paths\");\nvar tokenise = require(\"./styles/parser/tokeniser\").tokenise;\nvar results = require(\"./results\");\n\nexports.readHtmlPath = readHtmlPath;\nexports.readDocumentMatcher = readDocumentMatcher;\nexports.readStyle = readStyle;\n\n\nfunction readStyle(string) {\n    return parseString(styleRule, string);\n}\n\nfunction createStyleRule() {\n    return lop.rules.sequence(\n        lop.rules.sequence.capture(documentMatcherRule()),\n        lop.rules.tokenOfType(\"whitespace\"),\n        lop.rules.tokenOfType(\"arrow\"),\n        lop.rules.sequence.capture(lop.rules.optional(lop.rules.sequence(\n            lop.rules.tokenOfType(\"whitespace\"),\n            lop.rules.sequence.capture(htmlPathRule())\n        ).head())),\n        lop.rules.tokenOfType(\"end\")\n    ).map(function(documentMatcher, htmlPath) {\n        return {\n            from: documentMatcher,\n            to: htmlPath.valueOrElse(htmlPaths.empty)\n        };\n    });\n}\n\nfunction readDocumentMatcher(string) {\n    return parseString(documentMatcherRule(), string);\n}\n\nfunction documentMatcherRule() {\n    var sequence = lop.rules.sequence;\n    \n    var identifierToConstant = function(identifier, constant) {\n        return lop.rules.then(\n            lop.rules.token(\"identifier\", identifier),\n            function() {\n                return constant;\n            }\n        );\n    };\n    \n    var paragraphRule = identifierToConstant(\"p\", documentMatchers.paragraph);\n    var runRule = identifierToConstant(\"r\", documentMatchers.run);\n    \n    var elementTypeRule = lop.rules.firstOf(\"p or r or table\",\n        paragraphRule,\n        runRule\n    );\n    \n    var styleIdRule = lop.rules.then(\n        classRule,\n        function(styleId) {\n            return {styleId: styleId};\n        }\n    );\n\n    var styleNameMatcherRule = lop.rules.firstOf(\"style name matcher\",\n        lop.rules.then(\n            lop.rules.sequence(\n                lop.rules.tokenOfType(\"equals\"),\n                lop.rules.sequence.cut(),\n                lop.rules.sequence.capture(stringRule)\n            ).head(),\n            function(styleName) {\n                return {styleName: documentMatchers.equalTo(styleName)};\n            }\n        ),\n        lop.rules.then(\n            lop.rules.sequence(\n                lop.rules.tokenOfType(\"startsWith\"),\n                lop.rules.sequence.cut(),\n                lop.rules.sequence.capture(stringRule)\n            ).head(),\n            function(styleName) {\n                return {styleName: documentMatchers.startsWith(styleName)};\n            }\n        )\n    );\n    \n    var styleNameRule = lop.rules.sequence(\n        lop.rules.tokenOfType(\"open-square-bracket\"),\n        lop.rules.sequence.cut(),\n        lop.rules.token(\"identifier\", \"style-name\"),\n        lop.rules.sequence.capture(styleNameMatcherRule),\n        lop.rules.tokenOfType(\"close-square-bracket\")\n    ).head();\n\n    \n    var listTypeRule = lop.rules.firstOf(\"list type\",\n        identifierToConstant(\"ordered-list\", {isOrdered: true}),\n        identifierToConstant(\"unordered-list\", {isOrdered: false})\n    );\n    var listRule = sequence(\n        lop.rules.tokenOfType(\"colon\"),\n        sequence.capture(listTypeRule),\n        sequence.cut(),\n        lop.rules.tokenOfType(\"open-paren\"),\n        sequence.capture(integerRule),\n        lop.rules.tokenOfType(\"close-paren\")\n    ).map(function(listType, levelNumber) {\n        return {\n            list: {\n                isOrdered: listType.isOrdered,\n                levelIndex: levelNumber - 1\n            }\n        };\n    });\n\n    function createMatcherSuffixesRule(rules) {\n        var matcherSuffix = lop.rules.firstOf.apply(\n            lop.rules.firstOf,\n            [\"matcher suffix\"].concat(rules)\n        );\n        var matcherSuffixes = lop.rules.zeroOrMore(matcherSuffix);\n        return lop.rules.then(matcherSuffixes, function(suffixes) {\n            var matcherOptions = {};\n            suffixes.forEach(function(suffix) {\n                _.extend(matcherOptions, suffix);\n            });\n            return matcherOptions;\n        });\n    }\n    \n    var paragraphOrRun = sequence(\n        sequence.capture(elementTypeRule),\n        sequence.capture(createMatcherSuffixesRule([\n            styleIdRule,\n            styleNameRule,\n            listRule\n        ]))\n    ).map(function(createMatcher, matcherOptions) {\n        return createMatcher(matcherOptions);\n    });\n    \n    var table = sequence(\n        lop.rules.token(\"identifier\", \"table\"),\n        sequence.capture(createMatcherSuffixesRule([\n            styleIdRule,\n            styleNameRule\n        ]))\n    ).map(function(options) {\n        return documentMatchers.table(options);\n    });\n\n    var bold = identifierToConstant(\"b\", documentMatchers.bold);\n    var italic = identifierToConstant(\"i\", documentMatchers.italic);\n    var underline = identifierToConstant(\"u\", documentMatchers.underline);\n    var strikethrough = identifierToConstant(\"strike\", documentMatchers.strikethrough);\n    var smallCaps = identifierToConstant(\"small-caps\", documentMatchers.smallCaps);\n    var commentReference = identifierToConstant(\"comment-reference\", documentMatchers.commentReference);\n    \n    var breakMatcher = sequence(\n        lop.rules.token(\"identifier\", \"br\"),\n        sequence.cut(),\n        lop.rules.tokenOfType(\"open-square-bracket\"),\n        lop.rules.token(\"identifier\", \"type\"),\n        lop.rules.tokenOfType(\"equals\"),\n        sequence.capture(stringRule),\n        lop.rules.tokenOfType(\"close-square-bracket\")\n    ).map(function(breakType) {\n        switch (breakType) {\n        case \"line\":\n            return documentMatchers.lineBreak;\n        case \"page\":\n            return documentMatchers.pageBreak;\n        case \"column\":\n            return documentMatchers.columnBreak;\n        default:\n            // TODO: handle unknown document matchers\n        }\n    });\n\n    return lop.rules.firstOf(\"element type\",\n        paragraphOrRun,\n        table,\n        bold,\n        italic,\n        underline,\n        strikethrough,\n        smallCaps,\n        commentReference,\n        breakMatcher\n    );\n}\n\nfunction readHtmlPath(string) {\n    return parseString(htmlPathRule(), string);\n}\n\nfunction htmlPathRule() {\n    var capture = lop.rules.sequence.capture;\n    var whitespaceRule = lop.rules.tokenOfType(\"whitespace\");\n    var freshRule = lop.rules.then(\n        lop.rules.optional(lop.rules.sequence(\n            lop.rules.tokenOfType(\"colon\"),\n            lop.rules.token(\"identifier\", \"fresh\")\n        )),\n        function(option) {\n            return option.map(function() {\n                return true;\n            }).valueOrElse(false);\n        }\n    );\n    \n    var separatorRule = lop.rules.then(\n        lop.rules.optional(lop.rules.sequence(\n            lop.rules.tokenOfType(\"colon\"),\n            lop.rules.token(\"identifier\", \"separator\"),\n            lop.rules.tokenOfType(\"open-paren\"),\n            capture(stringRule),\n            lop.rules.tokenOfType(\"close-paren\")\n        ).head()),\n        function(option) {\n            return option.valueOrElse(\"\");\n        }\n    );\n\n    var tagNamesRule = lop.rules.oneOrMoreWithSeparator(\n        identifierRule,\n        lop.rules.tokenOfType(\"choice\")\n    );\n    \n    var styleElementRule = lop.rules.sequence(\n        capture(tagNamesRule),\n        capture(lop.rules.zeroOrMore(classRule)),\n        capture(freshRule),\n        capture(separatorRule)\n    ).map(function(tagName, classNames, fresh, separator) {\n        var attributes = {};\n        var options = {};\n        if (classNames.length > 0) {\n            attributes[\"class\"] = classNames.join(\" \");\n        }\n        if (fresh) {\n            options.fresh = true;\n        }\n        if (separator) {\n            options.separator = separator;\n        }\n        return htmlPaths.element(tagName, attributes, options);\n    });\n    \n    return lop.rules.firstOf(\"html path\",\n        lop.rules.then(lop.rules.tokenOfType(\"bang\"), function() {\n            return htmlPaths.ignore;\n        }),\n        lop.rules.then(\n            lop.rules.zeroOrMoreWithSeparator(\n                styleElementRule,\n                lop.rules.sequence(\n                    whitespaceRule,\n                    lop.rules.tokenOfType(\"gt\"),\n                    whitespaceRule\n                )\n            ),\n            htmlPaths.elements\n        )\n    );\n}\n    \nvar identifierRule = lop.rules.then(\n    lop.rules.tokenOfType(\"identifier\"),\n    decodeEscapeSequences\n);\nvar integerRule = lop.rules.tokenOfType(\"integer\");\n\nvar stringRule = lop.rules.then(\n    lop.rules.tokenOfType(\"string\"),\n    decodeEscapeSequences\n);\n\nvar escapeSequences = {\n    \"n\": \"\\n\",\n    \"r\": \"\\r\",\n    \"t\": \"\\t\"\n};\n\nfunction decodeEscapeSequences(value) {\n    return value.replace(/\\\\(.)/g, function(match, code) {\n        return escapeSequences[code] || code;\n    });\n}\n\nvar classRule = lop.rules.sequence(\n    lop.rules.tokenOfType(\"dot\"),\n    lop.rules.sequence.cut(),\n    lop.rules.sequence.capture(identifierRule)\n).head();\n\nfunction parseString(rule, string) {\n    var tokens = tokenise(string);\n    var parser = lop.Parser();\n    var parseResult = parser.parseTokens(rule, tokens);\n    if (parseResult.isSuccess()) {\n        return results.success(parseResult.value());\n    } else {\n        return new results.Result(null, [results.warning(describeFailure(string, parseResult))]);\n    }\n}\n\nfunction describeFailure(input, parseResult) {\n    return \"Did not understand this style mapping, so ignored it: \" + input + \"\\n\" +\n        parseResult.errors().map(describeError).join(\"\\n\");\n}\n\nfunction describeError(error) {\n    return \"Error was at character number \" + error.characterNumber() + \": \" +\n        \"Expected \" + error.expected + \" but got \" + error.actual;\n}\n\nvar styleRule = createStyleRule();\n\n},{\"./results\":24,\"./styles/document-matchers\":26,\"./styles/html-paths\":27,\"./styles/parser/tokeniser\":28,\"lop\":107,\"underscore\":153}],26:[function(require,module,exports){\nexports.paragraph = paragraph;\nexports.run = run;\nexports.table = table;\nexports.bold = new Matcher(\"bold\");\nexports.italic = new Matcher(\"italic\");\nexports.underline = new Matcher(\"underline\");\nexports.strikethrough = new Matcher(\"strikethrough\");\nexports.smallCaps = new Matcher(\"smallCaps\");\nexports.commentReference = new Matcher(\"commentReference\");\nexports.lineBreak = new Matcher(\"break\", {breakType: \"line\"});\nexports.pageBreak = new Matcher(\"break\", {breakType: \"page\"});\nexports.columnBreak = new Matcher(\"break\", {breakType: \"column\"});\nexports.equalTo = equalTo;\nexports.startsWith = startsWith;\n\n\nfunction paragraph(options) {\n    return new Matcher(\"paragraph\", options);\n}\n\nfunction run(options) {\n    return new Matcher(\"run\", options);\n}\n\nfunction table(options) {\n    return new Matcher(\"table\", options);\n}\n\nfunction Matcher(elementType, options) {\n    options = options || {};\n    this._elementType = elementType;\n    this._styleId = options.styleId;\n    this._styleName = options.styleName;\n    if (options.list) {\n        this._listIndex = options.list.levelIndex;\n        this._listIsOrdered = options.list.isOrdered;\n    }\n}\n\nMatcher.prototype.matches = function(element) {\n    return element.type === this._elementType &&\n        (this._styleId === undefined || element.styleId === this._styleId) &&\n        (this._styleName === undefined || (element.styleName && this._styleName.operator(this._styleName.operand, element.styleName))) &&\n        (this._listIndex === undefined || isList(element, this._listIndex, this._listIsOrdered)) &&\n        (this._breakType === undefined || this._breakType === element.breakType);\n};\n\nfunction isList(element, levelIndex, isOrdered) {\n    return element.numbering &&\n        element.numbering.level == levelIndex &&\n        element.numbering.isOrdered == isOrdered;\n}\n\nfunction equalTo(value) {\n    return {\n        operator: operatorEqualTo,\n        operand: value\n    };\n}\n\nfunction startsWith(value) {\n    return {\n        operator: operatorStartsWith,\n        operand: value\n    };\n}\n\nfunction operatorEqualTo(first, second) {\n    return first.toUpperCase() === second.toUpperCase();\n}\n\nfunction operatorStartsWith(first, second) {\n    return second.toUpperCase().indexOf(first.toUpperCase()) === 0;\n}\n\n},{}],27:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nvar html = require(\"../html\");\n\nexports.topLevelElement = topLevelElement;\nexports.elements = elements;\nexports.element = element;\n\nfunction topLevelElement(tagName, attributes) {\n    return elements([element(tagName, attributes, {fresh: true})]);\n}\n\nfunction elements(elementStyles) {\n    return new HtmlPath(elementStyles.map(function(elementStyle) {\n        if (_.isString(elementStyle)) {\n            return element(elementStyle);\n        } else {\n            return elementStyle;\n        }\n    }));\n}\n\nfunction HtmlPath(elements) {\n    this._elements = elements;\n}\n\nHtmlPath.prototype.wrap = function wrap(children) {\n    var result = children();\n    for (var index = this._elements.length - 1; index >= 0; index--) {\n        result = this._elements[index].wrapNodes(result);\n    }\n    return result;\n};\n\nfunction element(tagName, attributes, options) {\n    options = options || {};\n    return new Element(tagName, attributes, options);\n}\n\nfunction Element(tagName, attributes, options) {\n    var tagNames = {};\n    if (_.isArray(tagName)) {\n        tagName.forEach(function(tagName) {\n            tagNames[tagName] = true;\n        });\n        tagName = tagName[0];\n    } else {\n        tagNames[tagName] = true;\n    }\n    \n    this.tagName = tagName;\n    this.tagNames = tagNames;\n    this.attributes = attributes || {};\n    this.fresh = options.fresh;\n    this.separator = options.separator;\n}\n\nElement.prototype.matchesElement = function(element) {\n    return this.tagNames[element.tagName] && _.isEqual(this.attributes || {}, element.attributes || {});\n};\n\nElement.prototype.wrap = function wrap(generateNodes) {\n    return this.wrapNodes(generateNodes());\n};\n\nElement.prototype.wrapNodes = function wrapNodes(nodes) {\n    return [html.elementWithTag(this, nodes)];\n};\n\nexports.empty = elements([]);\nexports.ignore = {\n    wrap: function() {\n        return [];\n    }\n};\n\n},{\"../html\":18,\"underscore\":153}],28:[function(require,module,exports){\nvar lop = require(\"lop\");\nvar RegexTokeniser = lop.RegexTokeniser;\n\nexports.tokenise = tokenise;\n\nvar stringPrefix = \"'((?:\\\\\\\\.|[^'])*)\";\n\nfunction tokenise(string) {\n    var identifierCharacter = \"(?:[a-zA-Z\\\\-_]|\\\\\\\\.)\";\n    var tokeniser = new RegexTokeniser([\n        {name: \"identifier\", regex: new RegExp(\"(\" + identifierCharacter + \"(?:\" + identifierCharacter + \"|[0-9])*)\")},\n        {name: \"dot\", regex: /\\./},\n        {name: \"colon\", regex: /:/},\n        {name: \"gt\", regex: />/},\n        {name: \"whitespace\", regex: /\\s+/},\n        {name: \"arrow\", regex: /=>/},\n        {name: \"equals\", regex: /=/},\n        {name: \"startsWith\", regex: /\\^=/},\n        {name: \"open-paren\", regex: /\\(/},\n        {name: \"close-paren\", regex: /\\)/},\n        {name: \"open-square-bracket\", regex: /\\[/},\n        {name: \"close-square-bracket\", regex: /\\]/},\n        {name: \"string\", regex: new RegExp(stringPrefix + \"'\")},\n        {name: \"unterminated-string\", regex: new RegExp(stringPrefix)},\n        {name: \"integer\", regex: /([0-9]+)/},\n        {name: \"choice\", regex: /\\|/},\n        {name: \"bang\", regex: /(!)/}\n    ]);\n    return tokeniser.tokenise(string);\n}\n\n},{\"lop\":107}],29:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\nexports.paragraph = paragraph;\nexports.run = run;\nexports._elements = elements;\nexports.getDescendantsOfType = getDescendantsOfType;\nexports.getDescendants = getDescendants;\n\nfunction paragraph(transform) {\n    return elementsOfType(\"paragraph\", transform);\n}\n\nfunction run(transform) {\n    return elementsOfType(\"run\", transform);\n}\n\nfunction elementsOfType(elementType, transform) {\n    return elements(function(element) {\n        if (element.type === elementType) {\n            return transform(element);\n        } else {\n            return element;\n        }\n    });\n}\n\nfunction elements(transform) {\n    return function transformElement(element) {\n        if (element.children) {\n            var children = _.map(element.children, transformElement);\n            element = _.extend(element, {children: children});\n        }\n        return transform(element);\n    };\n}\n\n\nfunction getDescendantsOfType(element, type) {\n    return getDescendants(element).filter(function(descendant) {\n        return descendant.type === type;\n    });\n}\n\nfunction getDescendants(element) {\n    var descendants = [];\n\n    visitDescendants(element, function(descendant) {\n        descendants.push(descendant);\n    });\n\n    return descendants;\n}\n\nfunction visitDescendants(element, visit) {\n    if (element.children) {\n        element.children.forEach(function(child) {\n            visitDescendants(child, visit);\n            visit(child);\n        });\n    }\n}\n\n},{\"underscore\":153}],30:[function(require,module,exports){\nvar htmlPaths = require(\"./styles/html-paths\");\nvar Html = require(\"./html\");\n\n\nexports.element = element;\n\nfunction element(name) {\n    return function(html) {\n        return Html.elementWithTag(htmlPaths.element(name), [html]);\n    };\n}\n\n},{\"./html\":18,\"./styles/html-paths\":27}],31:[function(require,module,exports){\nvar util = require(\"util\");\nvar _ = require(\"underscore\");\n\nexports.writer = writer;\n\nfunction writer(options) {\n    options = options || {};\n    if (options.prettyPrint) {\n        return prettyWriter();\n    } else {\n        return simpleWriter();\n    }\n}\n\n\nvar indentedElements = {\n    div: true,\n    p: true,\n    ul: true,\n    li: true\n};\n\n\nfunction prettyWriter() {\n    var indentationLevel = 0;\n    var indentation = \"  \";\n    var stack = [];\n    var start = true;\n    var inText = false;\n    \n    var writer = simpleWriter();\n    \n    function open(tagName, attributes) {\n        if (indentedElements[tagName]) {\n            indent();\n        }\n        stack.push(tagName);\n        writer.open(tagName, attributes);\n        if (indentedElements[tagName]) {\n            indentationLevel++;\n        }\n        start = false;\n    }\n    \n    function close(tagName) {\n        if (indentedElements[tagName]) {\n            indentationLevel--;\n            indent();\n        }\n        stack.pop();\n        writer.close(tagName);\n    }\n    \n    function text(value) {\n        startText();\n        var text = isInPre() ? value : value.replace(\"\\n\", \"\\n\" + indentation);\n        writer.text(text);\n    }\n    \n    function selfClosing(tagName, attributes) {\n        indent();\n        writer.selfClosing(tagName, attributes);\n    }\n    \n    function insideIndentedElement() {\n        return stack.length === 0 || indentedElements[stack[stack.length - 1]];\n    }\n    \n    function startText() {\n        if (!inText) {\n            indent();\n            inText = true;\n        }\n    }\n    \n    function indent() {\n        inText = false;\n        if (!start && insideIndentedElement() && !isInPre()) {\n            writer._append(\"\\n\");\n            for (var i = 0; i < indentationLevel; i++) {\n                writer._append(indentation);\n            }\n        }\n    }\n    \n    function isInPre() {\n        return _.some(stack, function(tagName) {\n            return tagName === \"pre\";\n        });\n    }\n    \n    return {\n        asString: writer.asString,\n        open: open,\n        close: close,\n        text: text,\n        selfClosing: selfClosing\n    };\n}\n\n\nfunction simpleWriter() {\n    var fragments = [];\n    \n    function open(tagName, attributes) {\n        var attributeString = generateAttributeString(attributes);\n        fragments.push(util.format(\"<%s%s>\", tagName, attributeString));\n    }\n    \n    function close(tagName) {\n        fragments.push(util.format(\"</%s>\", tagName));\n    }\n    \n    function selfClosing(tagName, attributes) {\n        var attributeString = generateAttributeString(attributes);\n        fragments.push(util.format(\"<%s%s />\", tagName, attributeString));\n    }\n    \n    function generateAttributeString(attributes) {\n        return _.map(attributes, function(value, key) {\n            return util.format(' %s=\"%s\"', key, escapeHtmlAttribute(value));\n        }).join(\"\");\n    }\n    \n    function text(value) {\n        fragments.push(escapeHtmlText(value));\n    }\n    \n    function append(html) {\n        fragments.push(html);\n    }\n    \n    function asString() {\n        return fragments.join(\"\");\n    }\n    \n    return {\n        asString: asString,\n        open: open,\n        close: close,\n        text: text,\n        selfClosing: selfClosing,\n        _append: append\n    };\n}\n\nfunction escapeHtmlText(value) {\n    return value\n        .replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;');\n}\n\nfunction escapeHtmlAttribute(value) {\n    return value\n        .replace(/&/g, '&amp;')\n        .replace(/\"/g, '&quot;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;');\n}\n\n},{\"underscore\":153,\"util\":157}],32:[function(require,module,exports){\nvar htmlWriter = require(\"./html-writer\");\nvar markdownWriter = require(\"./markdown-writer\");\n\nexports.writer = writer;\n\n\nfunction writer(options) {\n    options = options || {};\n    if (options.outputFormat === \"markdown\") {\n        return markdownWriter.writer();\n    } else {\n        return htmlWriter.writer(options);\n    }\n}\n\n},{\"./html-writer\":31,\"./markdown-writer\":33}],33:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\n\nfunction symmetricMarkdownElement(end) {\n    return markdownElement(end, end);\n}\n\nfunction markdownElement(start, end) {\n    return function() {\n        return {start: start, end: end};\n    };\n}\n\nfunction markdownLink(attributes) {\n    var href = attributes.href || \"\";\n    if (href) {\n        return {\n            start: \"[\",\n            end: \"](\" + href + \")\",\n            anchorPosition: \"before\"\n        };\n    } else {\n        return {};\n    }\n}\n\nfunction markdownImage(attributes) {\n    var src = attributes.src || \"\";\n    var altText = attributes.alt || \"\";\n    if (src || altText) {\n        return {start: \"![\" + altText + \"](\" + src + \")\"};\n    } else {\n        return {};\n    }\n}\n\nfunction markdownList(options) {\n    return function(attributes, list) {\n        return {\n            start: list ? \"\\n\" : \"\",\n            end: list ? \"\" : \"\\n\",\n            list: {\n                isOrdered: options.isOrdered,\n                indent: list ? list.indent + 1 : 0,\n                count: 0\n            }\n        };\n    };\n}\n\nfunction markdownListItem(attributes, list, listItem) {\n    list = list || {indent: 0, isOrdered: false, count: 0};\n    list.count++;\n    listItem.hasClosed = false;\n    \n    var bullet = list.isOrdered ? list.count + \".\" : \"-\";\n    var start = repeatString(\"\\t\", list.indent) + bullet + \" \";\n        \n    return {\n        start: start,\n        end: function() {\n            if (!listItem.hasClosed) {\n                listItem.hasClosed = true;\n                return \"\\n\";\n            }\n        }\n    };\n}\n\nvar htmlToMarkdown = {\n    \"p\": markdownElement(\"\", \"\\n\\n\"),\n    \"br\": markdownElement(\"\", \"  \\n\"),\n    \"ul\": markdownList({isOrdered: false}),\n    \"ol\": markdownList({isOrdered: true}),\n    \"li\": markdownListItem,\n    \"strong\": symmetricMarkdownElement(\"__\"),\n    \"em\": symmetricMarkdownElement(\"*\"),\n    \"a\": markdownLink,\n    \"img\": markdownImage\n};\n\n(function() {\n    for (var i = 1; i <= 6; i++) {\n        htmlToMarkdown[\"h\" + i] = markdownElement(repeatString(\"#\", i) + \" \", \"\\n\\n\");\n    }\n})();\n\nfunction repeatString(value, count) {\n    return new Array(count + 1).join(value);\n}\n\nfunction markdownWriter() {\n    var fragments = [];\n    var elementStack = [];\n    var list = null;\n    var listItem = {};\n    \n    function open(tagName, attributes) {\n        attributes = attributes || {};\n        \n        var createElement = htmlToMarkdown[tagName] || function() {\n            return {};\n        };\n        var element = createElement(attributes, list, listItem);\n        elementStack.push({end: element.end, list: list});\n        \n        if (element.list) {\n            list = element.list;\n        }\n        \n        var anchorBeforeStart = element.anchorPosition === \"before\";\n        if (anchorBeforeStart) {\n            writeAnchor(attributes);\n        }\n\n        fragments.push(element.start || \"\");\n        if (!anchorBeforeStart) {\n            writeAnchor(attributes);\n        }\n    }\n    \n    function writeAnchor(attributes) {\n        if (attributes.id) {\n            fragments.push('<a id=\"' + attributes.id + '\"></a>');\n        }\n    }\n    \n    function close(tagName) {\n        var element = elementStack.pop();\n        list = element.list;\n        var end = _.isFunction(element.end) ? element.end() : element.end;\n        fragments.push(end || \"\");\n    }\n    \n    function selfClosing(tagName, attributes) {\n        open(tagName, attributes);\n        close(tagName);\n    }\n    \n    function text(value) {\n        fragments.push(escapeMarkdown(value));\n    }\n    \n    function asString() {\n        return fragments.join(\"\");\n    }\n\n    return {\n        asString: asString,\n        open: open,\n        close: close,\n        text: text,\n        selfClosing: selfClosing\n    };\n}\n\nexports.writer = markdownWriter;\n\nfunction escapeMarkdown(value) {\n    return value\n        .replace(/\\\\/g, '\\\\\\\\')\n        .replace(/([\\`\\*_\\{\\}\\[\\]\\(\\)\\#\\+\\-\\.\\!])/g, '\\\\$1');\n}\n\n},{\"underscore\":153}],34:[function(require,module,exports){\nvar nodes = require(\"./nodes\");\n\nexports.Element = nodes.Element;\nexports.element = nodes.element;\nexports.text = nodes.text;\nexports.readString = require(\"./reader\").readString;\nexports.writeString = require(\"./writer\").writeString;\n\n},{\"./nodes\":35,\"./reader\":36,\"./writer\":37}],35:[function(require,module,exports){\nvar _ = require(\"underscore\");\n\n\nexports.Element = Element;\nexports.element = function(name, attributes, children) {\n    return new Element(name, attributes, children);\n};\nexports.text = function(value) {\n    return {\n        type: \"text\",\n        value: value\n    };\n};\n\n\nvar emptyElement = {\n    first: function() {\n        return null;\n    },\n    firstOrEmpty: function() {\n        return emptyElement;\n    },\n    attributes: {}\n};\n\nfunction Element(name, attributes, children) {\n    this.type = \"element\";\n    this.name = name;\n    this.attributes = attributes || {};\n    this.children = children || [];\n}\n\nElement.prototype.first = function(name) {\n    return _.find(this.children, function(child) {\n        return child.name === name;\n    });\n};\n\nElement.prototype.firstOrEmpty = function(name) {\n    return this.first(name) || emptyElement;\n};\n\nElement.prototype.getElementsByTagName = function(name) {\n    var elements = _.filter(this.children, function(child) {\n        return child.name === name;\n    });\n    return toElementList(elements);\n};\n\nElement.prototype.text = function() {\n    if (this.children.length === 0) {\n        return \"\";\n    } else if (this.children.length !== 1 || this.children[0].type !== \"text\") {\n        throw new Error(\"Not implemented\");\n    }\n    return this.children[0].value;\n};\n\nvar elementListPrototype = {\n    getElementsByTagName: function(name) {\n        return toElementList(_.flatten(this.map(function(element) {\n            return element.getElementsByTagName(name);\n        }, true)));\n    }\n};\n\nfunction toElementList(array) {\n    return _.extend(array, elementListPrototype);\n}\n\n},{\"underscore\":153}],36:[function(require,module,exports){\nvar promises = require(\"../promises\");\nvar sax = require(\"sax\");\nvar _ = require(\"underscore\");\n\nvar nodes = require(\"./nodes\");\nvar Element = nodes.Element;\n\nexports.readString = readString;\n\nfunction readString(xmlString, namespaceMap) {\n    namespaceMap = namespaceMap || {};\n    \n    var finished = false;\n    var parser = sax.parser(true, {xmlns: true, position: false});\n    \n    var rootElement = {children: []};\n    var currentElement = rootElement;\n    var stack = [];\n    \n    var deferred = promises.defer();\n    \n    parser.onopentag = function(node) {\n        var attributes = mapObject(node.attributes, function(attribute) {\n            return attribute.value;\n        }, mapName);\n        \n        var element = new Element(mapName(node), attributes);\n        currentElement.children.push(element);\n        stack.push(currentElement);\n        currentElement = element;\n    };\n    \n    function mapName(node) {\n        if (node.uri) {\n            var mappedPrefix = namespaceMap[node.uri];\n            var prefix;\n            if (mappedPrefix) {\n                prefix = mappedPrefix + \":\";\n            } else {\n                prefix = \"{\" + node.uri + \"}\";\n            }\n            return prefix + node.local;\n        } else {\n            return node.local;\n        }\n    }\n    \n    parser.onclosetag = function(node) {\n        currentElement = stack.pop();\n    };\n    \n    parser.ontext = function(text) {\n        if (currentElement !== rootElement) {\n            currentElement.children.push(nodes.text(text));\n        }\n    };\n    \n    parser.onend = function() {\n        if (!finished) {\n            finished = true;\n            deferred.resolve(rootElement.children[0]);\n        }\n    };\n    \n    parser.onerror = function(error) {\n        if (!finished) {\n            finished = true;\n            deferred.reject(error);\n        }\n    };\n    \n    parser.write(xmlString).close();\n    \n    return deferred.promise;\n}\n\nfunction mapObject(input, valueFunc, keyFunc) {\n    return _.reduce(input, function(result, value, key) {\n        var mappedKey = keyFunc(value, key, input);\n        result[mappedKey] = valueFunc(value, key, input);\n        return result;\n    }, {});\n}\n\n},{\"../promises\":23,\"./nodes\":35,\"sax\":150,\"underscore\":153}],37:[function(require,module,exports){\nvar _ = require(\"underscore\");\nvar xmlbuilder = require(\"xmlbuilder\");\n\n\nexports.writeString = writeString;\n\n\nfunction writeString(root, namespaces) {\n    var uriToPrefix = _.invert(namespaces);\n    \n    var nodeWriters = {\n        element: writeElement,\n        text: writeTextNode\n    };\n\n    function writeNode(builder, node) {\n        return nodeWriters[node.type](builder, node);\n    }\n\n    function writeElement(builder, element) {\n        var elementBuilder = builder.element(mapElementName(element.name), element.attributes);\n        element.children.forEach(function(child) {\n            writeNode(elementBuilder, child);\n        });\n    }\n    \n    function mapElementName(name) {\n        var longFormMatch = /^\\{(.*)\\}(.*)$/.exec(name);\n        if (longFormMatch) {\n            var prefix = uriToPrefix[longFormMatch[1]];\n            return prefix + (prefix === \"\" ? \"\" : \":\") + longFormMatch[2];\n        } else {\n            return name;\n        }\n    }\n    \n    function writeDocument(root) {\n        var builder = xmlbuilder\n            .create(mapElementName(root.name), {\n                version: '1.0',\n                encoding: 'UTF-8',\n                standalone: true\n            });\n        \n        _.forEach(namespaces, function(uri, prefix) {\n            var key = \"xmlns\" + (prefix === \"\" ? \"\" : \":\" + prefix);\n            builder.attribute(key, uri);\n        });\n        \n        root.children.forEach(function(child) {\n            writeNode(builder, child);\n        });\n        return builder.end();\n    }\n\n    return writeDocument(root);\n}\n\nfunction writeTextNode(builder, node) {\n    builder.text(node.value);\n}\n\n},{\"underscore\":153,\"xmlbuilder\":179}],38:[function(require,module,exports){\n(function (Buffer){\nvar JSZip = require(\"jszip\");\n\nvar promises = require(\"./promises\");\n\nexports.openArrayBuffer = openArrayBuffer;\nexports.splitPath = splitPath;\nexports.joinPath = joinPath;\n\nfunction openArrayBuffer(arrayBuffer) {\n    var zipFile = new JSZip(arrayBuffer);\n    function exists(name) {\n        return zipFile.file(name) !== null;\n    }\n    \n    function read(name, encoding) {\n        var array = zipFile.file(name).asUint8Array();\n        var buffer = new Buffer(array);\n        if (encoding) {\n            return promises.when(buffer.toString(encoding));\n        } else {\n            return promises.when(buffer);\n        }\n    }\n    \n    function write(name, contents) {\n        zipFile.file(name, contents);\n    }\n    \n    function toBuffer() {\n        return zipFile.generate({type: \"nodebuffer\"});\n    }\n    \n    return {\n        exists: exists,\n        read: read,\n        write: write,\n        toBuffer: toBuffer\n    };\n}\n\nfunction splitPath(path) {\n    var lastIndex = path.lastIndexOf(\"/\");\n    if (lastIndex === -1) {\n        return {dirname: \"\", basename: path};\n    } else {\n        return {\n            dirname: path.substring(0, lastIndex),\n            basename: path.substring(lastIndex + 1)\n        };\n    }\n}\n\nfunction joinPath() {\n    var nonEmptyPaths = Array.prototype.filter.call(arguments, function(path) {\n        return path;\n    });\n    \n    var relevantPaths = [];\n    \n    nonEmptyPaths.forEach(function(path) {\n        if (/^\\//.test(path)) {\n            relevantPaths = [path];\n        } else {\n            relevantPaths.push(path);\n        }\n    });\n    \n    return relevantPaths.join(\"/\");\n}\n\n}).call(this,require(\"buffer\").Buffer)\n},{\"./promises\":23,\"buffer\":77,\"jszip\":92}],39:[function(require,module,exports){\n'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction placeHoldersCount (b64) {\n  var len = b64.length\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // the number of equal signs (place holders)\n  // if there are two placeholders, than the two characters before it\n  // represent one byte\n  // if there is only one, then the three characters before it represent 2 bytes\n  // this is just a cheap hack to not do indexOf twice\n  return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0\n}\n\nfunction byteLength (b64) {\n  // base64 is 4/3 + up to two characters of the original data\n  return b64.length * 3 / 4 - placeHoldersCount(b64)\n}\n\nfunction toByteArray (b64) {\n  var i, j, l, tmp, placeHolders, arr\n  var len = b64.length\n  placeHolders = placeHoldersCount(b64)\n\n  arr = new Arr(len * 3 / 4 - placeHolders)\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  l = placeHolders > 0 ? len - 4 : len\n\n  var L = 0\n\n  for (i = 0, j = 0; i < l; i += 4, j += 3) {\n    tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]\n    arr[L++] = (tmp >> 16) & 0xFF\n    arr[L++] = (tmp >> 8) & 0xFF\n    arr[L++] = tmp & 0xFF\n  }\n\n  if (placeHolders === 2) {\n    tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[L++] = tmp & 0xFF\n  } else if (placeHolders === 1) {\n    tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[L++] = (tmp >> 8) & 0xFF\n    arr[L++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var output = ''\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    output += lookup[tmp >> 2]\n    output += lookup[(tmp << 4) & 0x3F]\n    output += '=='\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + (uint8[len - 1])\n    output += lookup[tmp >> 10]\n    output += lookup[(tmp >> 4) & 0x3F]\n    output += lookup[(tmp << 2) & 0x3F]\n    output += '='\n  }\n\n  parts.push(output)\n\n  return parts.join('')\n}\n\n},{}],40:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nvar SomePromiseArray = Promise._SomePromiseArray;\nfunction any(promises) {\n    var ret = new SomePromiseArray(promises);\n    var promise = ret.promise();\n    ret.setHowMany(1);\n    ret.setUnwrap();\n    ret.init();\n    return promise;\n}\n\nPromise.any = function (promises) {\n    return any(promises);\n};\n\nPromise.prototype.any = function () {\n    return any(this);\n};\n\n};\n\n},{}],41:[function(require,module,exports){\n(function (process){\n\"use strict\";\nvar firstLineError;\ntry {throw new Error(); } catch (e) {firstLineError = e;}\nvar schedule = require(\"./schedule\");\nvar Queue = require(\"./queue\");\nvar util = require(\"./util\");\n\nfunction Async() {\n    this._customScheduler = false;\n    this._isTickUsed = false;\n    this._lateQueue = new Queue(16);\n    this._normalQueue = new Queue(16);\n    this._haveDrainedQueues = false;\n    this._trampolineEnabled = true;\n    var self = this;\n    this.drainQueues = function () {\n        self._drainQueues();\n    };\n    this._schedule = schedule;\n}\n\nAsync.prototype.setScheduler = function(fn) {\n    var prev = this._schedule;\n    this._schedule = fn;\n    this._customScheduler = true;\n    return prev;\n};\n\nAsync.prototype.hasCustomScheduler = function() {\n    return this._customScheduler;\n};\n\nAsync.prototype.enableTrampoline = function() {\n    this._trampolineEnabled = true;\n};\n\nAsync.prototype.disableTrampolineIfNecessary = function() {\n    if (util.hasDevTools) {\n        this._trampolineEnabled = false;\n    }\n};\n\nAsync.prototype.haveItemsQueued = function () {\n    return this._isTickUsed || this._haveDrainedQueues;\n};\n\n\nAsync.prototype.fatalError = function(e, isNode) {\n    if (isNode) {\n        process.stderr.write(\"Fatal \" + (e instanceof Error ? e.stack : e) +\n            \"\\n\");\n        process.exit(2);\n    } else {\n        this.throwLater(e);\n    }\n};\n\nAsync.prototype.throwLater = function(fn, arg) {\n    if (arguments.length === 1) {\n        arg = fn;\n        fn = function () { throw arg; };\n    }\n    if (typeof setTimeout !== \"undefined\") {\n        setTimeout(function() {\n            fn(arg);\n        }, 0);\n    } else try {\n        this._schedule(function() {\n            fn(arg);\n        });\n    } catch (e) {\n        throw new Error(\"No async scheduler available\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n};\n\nfunction AsyncInvokeLater(fn, receiver, arg) {\n    this._lateQueue.push(fn, receiver, arg);\n    this._queueTick();\n}\n\nfunction AsyncInvoke(fn, receiver, arg) {\n    this._normalQueue.push(fn, receiver, arg);\n    this._queueTick();\n}\n\nfunction AsyncSettlePromises(promise) {\n    this._normalQueue._pushOne(promise);\n    this._queueTick();\n}\n\nif (!util.hasDevTools) {\n    Async.prototype.invokeLater = AsyncInvokeLater;\n    Async.prototype.invoke = AsyncInvoke;\n    Async.prototype.settlePromises = AsyncSettlePromises;\n} else {\n    Async.prototype.invokeLater = function (fn, receiver, arg) {\n        if (this._trampolineEnabled) {\n            AsyncInvokeLater.call(this, fn, receiver, arg);\n        } else {\n            this._schedule(function() {\n                setTimeout(function() {\n                    fn.call(receiver, arg);\n                }, 100);\n            });\n        }\n    };\n\n    Async.prototype.invoke = function (fn, receiver, arg) {\n        if (this._trampolineEnabled) {\n            AsyncInvoke.call(this, fn, receiver, arg);\n        } else {\n            this._schedule(function() {\n                fn.call(receiver, arg);\n            });\n        }\n    };\n\n    Async.prototype.settlePromises = function(promise) {\n        if (this._trampolineEnabled) {\n            AsyncSettlePromises.call(this, promise);\n        } else {\n            this._schedule(function() {\n                promise._settlePromises();\n            });\n        }\n    };\n}\n\nAsync.prototype._drainQueue = function(queue) {\n    while (queue.length() > 0) {\n        var fn = queue.shift();\n        if (typeof fn !== \"function\") {\n            fn._settlePromises();\n            continue;\n        }\n        var receiver = queue.shift();\n        var arg = queue.shift();\n        fn.call(receiver, arg);\n    }\n};\n\nAsync.prototype._drainQueues = function () {\n    this._drainQueue(this._normalQueue);\n    this._reset();\n    this._haveDrainedQueues = true;\n    this._drainQueue(this._lateQueue);\n};\n\nAsync.prototype._queueTick = function () {\n    if (!this._isTickUsed) {\n        this._isTickUsed = true;\n        this._schedule(this.drainQueues);\n    }\n};\n\nAsync.prototype._reset = function () {\n    this._isTickUsed = false;\n};\n\nmodule.exports = Async;\nmodule.exports.firstLineError = firstLineError;\n\n}).call(this,require('_process'))\n},{\"./queue\":64,\"./schedule\":67,\"./util\":74,\"_process\":138}],42:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) {\nvar calledBind = false;\nvar rejectThis = function(_, e) {\n    this._reject(e);\n};\n\nvar targetRejected = function(e, context) {\n    context.promiseRejectionQueued = true;\n    context.bindingPromise._then(rejectThis, rejectThis, null, this, e);\n};\n\nvar bindingResolved = function(thisArg, context) {\n    if (((this._bitField & 50397184) === 0)) {\n        this._resolveCallback(context.target);\n    }\n};\n\nvar bindingRejected = function(e, context) {\n    if (!context.promiseRejectionQueued) this._reject(e);\n};\n\nPromise.prototype.bind = function (thisArg) {\n    if (!calledBind) {\n        calledBind = true;\n        Promise.prototype._propagateFrom = debug.propagateFromFunction();\n        Promise.prototype._boundValue = debug.boundValueFunction();\n    }\n    var maybePromise = tryConvertToPromise(thisArg);\n    var ret = new Promise(INTERNAL);\n    ret._propagateFrom(this, 1);\n    var target = this._target();\n    ret._setBoundTo(maybePromise);\n    if (maybePromise instanceof Promise) {\n        var context = {\n            promiseRejectionQueued: false,\n            promise: ret,\n            target: target,\n            bindingPromise: maybePromise\n        };\n        target._then(INTERNAL, targetRejected, undefined, ret, context);\n        maybePromise._then(\n            bindingResolved, bindingRejected, undefined, ret, context);\n        ret._setOnCancel(maybePromise);\n    } else {\n        ret._resolveCallback(target);\n    }\n    return ret;\n};\n\nPromise.prototype._setBoundTo = function (obj) {\n    if (obj !== undefined) {\n        this._bitField = this._bitField | 2097152;\n        this._boundTo = obj;\n    } else {\n        this._bitField = this._bitField & (~2097152);\n    }\n};\n\nPromise.prototype._isBound = function () {\n    return (this._bitField & 2097152) === 2097152;\n};\n\nPromise.bind = function (thisArg, value) {\n    return Promise.resolve(value).bind(thisArg);\n};\n};\n\n},{}],43:[function(require,module,exports){\n\"use strict\";\nvar cr = Object.create;\nif (cr) {\n    var callerCache = cr(null);\n    var getterCache = cr(null);\n    callerCache[\" size\"] = getterCache[\" size\"] = 0;\n}\n\nmodule.exports = function(Promise) {\nvar util = require(\"./util\");\nvar canEvaluate = util.canEvaluate;\nvar isIdentifier = util.isIdentifier;\n\nvar getMethodCaller;\nvar getGetter;\nif (!false) {\nvar makeMethodCaller = function (methodName) {\n    return new Function(\"ensureMethod\", \"                                    \\n\\\n        return function(obj) {                                               \\n\\\n            'use strict'                                                     \\n\\\n            var len = this.length;                                           \\n\\\n            ensureMethod(obj, 'methodName');                                 \\n\\\n            switch(len) {                                                    \\n\\\n                case 1: return obj.methodName(this[0]);                      \\n\\\n                case 2: return obj.methodName(this[0], this[1]);             \\n\\\n                case 3: return obj.methodName(this[0], this[1], this[2]);    \\n\\\n                case 0: return obj.methodName();                             \\n\\\n                default:                                                     \\n\\\n                    return obj.methodName.apply(obj, this);                  \\n\\\n            }                                                                \\n\\\n        };                                                                   \\n\\\n        \".replace(/methodName/g, methodName))(ensureMethod);\n};\n\nvar makeGetter = function (propertyName) {\n    return new Function(\"obj\", \"                                             \\n\\\n        'use strict';                                                        \\n\\\n        return obj.propertyName;                                             \\n\\\n        \".replace(\"propertyName\", propertyName));\n};\n\nvar getCompiled = function(name, compiler, cache) {\n    var ret = cache[name];\n    if (typeof ret !== \"function\") {\n        if (!isIdentifier(name)) {\n            return null;\n        }\n        ret = compiler(name);\n        cache[name] = ret;\n        cache[\" size\"]++;\n        if (cache[\" size\"] > 512) {\n            var keys = Object.keys(cache);\n            for (var i = 0; i < 256; ++i) delete cache[keys[i]];\n            cache[\" size\"] = keys.length - 256;\n        }\n    }\n    return ret;\n};\n\ngetMethodCaller = function(name) {\n    return getCompiled(name, makeMethodCaller, callerCache);\n};\n\ngetGetter = function(name) {\n    return getCompiled(name, makeGetter, getterCache);\n};\n}\n\nfunction ensureMethod(obj, methodName) {\n    var fn;\n    if (obj != null) fn = obj[methodName];\n    if (typeof fn !== \"function\") {\n        var message = \"Object \" + util.classString(obj) + \" has no method '\" +\n            util.toString(methodName) + \"'\";\n        throw new Promise.TypeError(message);\n    }\n    return fn;\n}\n\nfunction caller(obj) {\n    var methodName = this.pop();\n    var fn = ensureMethod(obj, methodName);\n    return fn.apply(obj, this);\n}\nPromise.prototype.call = function (methodName) {\n    var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};\n    if (!false) {\n        if (canEvaluate) {\n            var maybeCaller = getMethodCaller(methodName);\n            if (maybeCaller !== null) {\n                return this._then(\n                    maybeCaller, undefined, undefined, args, undefined);\n            }\n        }\n    }\n    args.push(methodName);\n    return this._then(caller, undefined, undefined, args, undefined);\n};\n\nfunction namedGetter(obj) {\n    return obj[this];\n}\nfunction indexedGetter(obj) {\n    var index = +this;\n    if (index < 0) index = Math.max(0, index + obj.length);\n    return obj[index];\n}\nPromise.prototype.get = function (propertyName) {\n    var isIndex = (typeof propertyName === \"number\");\n    var getter;\n    if (!isIndex) {\n        if (canEvaluate) {\n            var maybeGetter = getGetter(propertyName);\n            getter = maybeGetter !== null ? maybeGetter : namedGetter;\n        } else {\n            getter = namedGetter;\n        }\n    } else {\n        getter = indexedGetter;\n    }\n    return this._then(getter, undefined, undefined, propertyName, undefined);\n};\n};\n\n},{\"./util\":74}],44:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, PromiseArray, apiRejection, debug) {\nvar util = require(\"./util\");\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\nvar async = Promise._async;\n\nPromise.prototype[\"break\"] = Promise.prototype.cancel = function() {\n    if (!debug.cancellation()) return this._warn(\"cancellation is disabled\");\n\n    var promise = this;\n    var child = promise;\n    while (promise._isCancellable()) {\n        if (!promise._cancelBy(child)) {\n            if (child._isFollowing()) {\n                child._followee().cancel();\n            } else {\n                child._cancelBranched();\n            }\n            break;\n        }\n\n        var parent = promise._cancellationParent;\n        if (parent == null || !parent._isCancellable()) {\n            if (promise._isFollowing()) {\n                promise._followee().cancel();\n            } else {\n                promise._cancelBranched();\n            }\n            break;\n        } else {\n            if (promise._isFollowing()) promise._followee().cancel();\n            promise._setWillBeCancelled();\n            child = promise;\n            promise = parent;\n        }\n    }\n};\n\nPromise.prototype._branchHasCancelled = function() {\n    this._branchesRemainingToCancel--;\n};\n\nPromise.prototype._enoughBranchesHaveCancelled = function() {\n    return this._branchesRemainingToCancel === undefined ||\n           this._branchesRemainingToCancel <= 0;\n};\n\nPromise.prototype._cancelBy = function(canceller) {\n    if (canceller === this) {\n        this._branchesRemainingToCancel = 0;\n        this._invokeOnCancel();\n        return true;\n    } else {\n        this._branchHasCancelled();\n        if (this._enoughBranchesHaveCancelled()) {\n            this._invokeOnCancel();\n            return true;\n        }\n    }\n    return false;\n};\n\nPromise.prototype._cancelBranched = function() {\n    if (this._enoughBranchesHaveCancelled()) {\n        this._cancel();\n    }\n};\n\nPromise.prototype._cancel = function() {\n    if (!this._isCancellable()) return;\n    this._setCancelled();\n    async.invoke(this._cancelPromises, this, undefined);\n};\n\nPromise.prototype._cancelPromises = function() {\n    if (this._length() > 0) this._settlePromises();\n};\n\nPromise.prototype._unsetOnCancel = function() {\n    this._onCancelField = undefined;\n};\n\nPromise.prototype._isCancellable = function() {\n    return this.isPending() && !this._isCancelled();\n};\n\nPromise.prototype.isCancellable = function() {\n    return this.isPending() && !this.isCancelled();\n};\n\nPromise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) {\n    if (util.isArray(onCancelCallback)) {\n        for (var i = 0; i < onCancelCallback.length; ++i) {\n            this._doInvokeOnCancel(onCancelCallback[i], internalOnly);\n        }\n    } else if (onCancelCallback !== undefined) {\n        if (typeof onCancelCallback === \"function\") {\n            if (!internalOnly) {\n                var e = tryCatch(onCancelCallback).call(this._boundValue());\n                if (e === errorObj) {\n                    this._attachExtraTrace(e.e);\n                    async.throwLater(e.e);\n                }\n            }\n        } else {\n            onCancelCallback._resultCancelled(this);\n        }\n    }\n};\n\nPromise.prototype._invokeOnCancel = function() {\n    var onCancelCallback = this._onCancel();\n    this._unsetOnCancel();\n    async.invoke(this._doInvokeOnCancel, this, onCancelCallback);\n};\n\nPromise.prototype._invokeInternalOnCancel = function() {\n    if (this._isCancellable()) {\n        this._doInvokeOnCancel(this._onCancel(), true);\n        this._unsetOnCancel();\n    }\n};\n\nPromise.prototype._resultCancelled = function() {\n    this.cancel();\n};\n\n};\n\n},{\"./util\":74}],45:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(NEXT_FILTER) {\nvar util = require(\"./util\");\nvar getKeys = require(\"./es5\").keys;\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\n\nfunction catchFilter(instances, cb, promise) {\n    return function(e) {\n        var boundTo = promise._boundValue();\n        predicateLoop: for (var i = 0; i < instances.length; ++i) {\n            var item = instances[i];\n\n            if (item === Error ||\n                (item != null && item.prototype instanceof Error)) {\n                if (e instanceof item) {\n                    return tryCatch(cb).call(boundTo, e);\n                }\n            } else if (typeof item === \"function\") {\n                var matchesPredicate = tryCatch(item).call(boundTo, e);\n                if (matchesPredicate === errorObj) {\n                    return matchesPredicate;\n                } else if (matchesPredicate) {\n                    return tryCatch(cb).call(boundTo, e);\n                }\n            } else if (util.isObject(e)) {\n                var keys = getKeys(item);\n                for (var j = 0; j < keys.length; ++j) {\n                    var key = keys[j];\n                    if (item[key] != e[key]) {\n                        continue predicateLoop;\n                    }\n                }\n                return tryCatch(cb).call(boundTo, e);\n            }\n        }\n        return NEXT_FILTER;\n    };\n}\n\nreturn catchFilter;\n};\n\n},{\"./es5\":51,\"./util\":74}],46:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nvar longStackTraces = false;\nvar contextStack = [];\n\nPromise.prototype._promiseCreated = function() {};\nPromise.prototype._pushContext = function() {};\nPromise.prototype._popContext = function() {return null;};\nPromise._peekContext = Promise.prototype._peekContext = function() {};\n\nfunction Context() {\n    this._trace = new Context.CapturedTrace(peekContext());\n}\nContext.prototype._pushContext = function () {\n    if (this._trace !== undefined) {\n        this._trace._promiseCreated = null;\n        contextStack.push(this._trace);\n    }\n};\n\nContext.prototype._popContext = function () {\n    if (this._trace !== undefined) {\n        var trace = contextStack.pop();\n        var ret = trace._promiseCreated;\n        trace._promiseCreated = null;\n        return ret;\n    }\n    return null;\n};\n\nfunction createContext() {\n    if (longStackTraces) return new Context();\n}\n\nfunction peekContext() {\n    var lastIndex = contextStack.length - 1;\n    if (lastIndex >= 0) {\n        return contextStack[lastIndex];\n    }\n    return undefined;\n}\nContext.CapturedTrace = null;\nContext.create = createContext;\nContext.deactivateLongStackTraces = function() {};\nContext.activateLongStackTraces = function() {\n    var Promise_pushContext = Promise.prototype._pushContext;\n    var Promise_popContext = Promise.prototype._popContext;\n    var Promise_PeekContext = Promise._peekContext;\n    var Promise_peekContext = Promise.prototype._peekContext;\n    var Promise_promiseCreated = Promise.prototype._promiseCreated;\n    Context.deactivateLongStackTraces = function() {\n        Promise.prototype._pushContext = Promise_pushContext;\n        Promise.prototype._popContext = Promise_popContext;\n        Promise._peekContext = Promise_PeekContext;\n        Promise.prototype._peekContext = Promise_peekContext;\n        Promise.prototype._promiseCreated = Promise_promiseCreated;\n        longStackTraces = false;\n    };\n    longStackTraces = true;\n    Promise.prototype._pushContext = Context.prototype._pushContext;\n    Promise.prototype._popContext = Context.prototype._popContext;\n    Promise._peekContext = Promise.prototype._peekContext = peekContext;\n    Promise.prototype._promiseCreated = function() {\n        var ctx = this._peekContext();\n        if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this;\n    };\n};\nreturn Context;\n};\n\n},{}],47:[function(require,module,exports){\n(function (process){\n\"use strict\";\nmodule.exports = function(Promise, Context) {\nvar getDomain = Promise._getDomain;\nvar async = Promise._async;\nvar Warning = require(\"./errors\").Warning;\nvar util = require(\"./util\");\nvar canAttachTrace = util.canAttachTrace;\nvar unhandledRejectionHandled;\nvar possiblyUnhandledRejection;\nvar bluebirdFramePattern =\n    /[\\\\\\/]bluebird[\\\\\\/]js[\\\\\\/](release|debug|instrumented)/;\nvar nodeFramePattern = /\\((?:timers\\.js):\\d+:\\d+\\)/;\nvar parseLinePattern = /[\\/<\\(](.+?):(\\d+):(\\d+)\\)?\\s*$/;\nvar stackFramePattern = null;\nvar formatStack = null;\nvar indentStackFrames = false;\nvar printWarning;\nvar debugging = !!(util.env(\"BLUEBIRD_DEBUG\") != 0 &&\n                        (false ||\n                         util.env(\"BLUEBIRD_DEBUG\") ||\n                         util.env(\"NODE_ENV\") === \"development\"));\n\nvar warnings = !!(util.env(\"BLUEBIRD_WARNINGS\") != 0 &&\n    (debugging || util.env(\"BLUEBIRD_WARNINGS\")));\n\nvar longStackTraces = !!(util.env(\"BLUEBIRD_LONG_STACK_TRACES\") != 0 &&\n    (debugging || util.env(\"BLUEBIRD_LONG_STACK_TRACES\")));\n\nvar wForgottenReturn = util.env(\"BLUEBIRD_W_FORGOTTEN_RETURN\") != 0 &&\n    (warnings || !!util.env(\"BLUEBIRD_W_FORGOTTEN_RETURN\"));\n\nPromise.prototype.suppressUnhandledRejections = function() {\n    var target = this._target();\n    target._bitField = ((target._bitField & (~1048576)) |\n                      524288);\n};\n\nPromise.prototype._ensurePossibleRejectionHandled = function () {\n    if ((this._bitField & 524288) !== 0) return;\n    this._setRejectionIsUnhandled();\n    async.invokeLater(this._notifyUnhandledRejection, this, undefined);\n};\n\nPromise.prototype._notifyUnhandledRejectionIsHandled = function () {\n    fireRejectionEvent(\"rejectionHandled\",\n                                  unhandledRejectionHandled, undefined, this);\n};\n\nPromise.prototype._setReturnedNonUndefined = function() {\n    this._bitField = this._bitField | 268435456;\n};\n\nPromise.prototype._returnedNonUndefined = function() {\n    return (this._bitField & 268435456) !== 0;\n};\n\nPromise.prototype._notifyUnhandledRejection = function () {\n    if (this._isRejectionUnhandled()) {\n        var reason = this._settledValue();\n        this._setUnhandledRejectionIsNotified();\n        fireRejectionEvent(\"unhandledRejection\",\n                                      possiblyUnhandledRejection, reason, this);\n    }\n};\n\nPromise.prototype._setUnhandledRejectionIsNotified = function () {\n    this._bitField = this._bitField | 262144;\n};\n\nPromise.prototype._unsetUnhandledRejectionIsNotified = function () {\n    this._bitField = this._bitField & (~262144);\n};\n\nPromise.prototype._isUnhandledRejectionNotified = function () {\n    return (this._bitField & 262144) > 0;\n};\n\nPromise.prototype._setRejectionIsUnhandled = function () {\n    this._bitField = this._bitField | 1048576;\n};\n\nPromise.prototype._unsetRejectionIsUnhandled = function () {\n    this._bitField = this._bitField & (~1048576);\n    if (this._isUnhandledRejectionNotified()) {\n        this._unsetUnhandledRejectionIsNotified();\n        this._notifyUnhandledRejectionIsHandled();\n    }\n};\n\nPromise.prototype._isRejectionUnhandled = function () {\n    return (this._bitField & 1048576) > 0;\n};\n\nPromise.prototype._warn = function(message, shouldUseOwnTrace, promise) {\n    return warn(message, shouldUseOwnTrace, promise || this);\n};\n\nPromise.onPossiblyUnhandledRejection = function (fn) {\n    var domain = getDomain();\n    possiblyUnhandledRejection =\n        typeof fn === \"function\" ? (domain === null ?\n                                            fn : util.domainBind(domain, fn))\n                                 : undefined;\n};\n\nPromise.onUnhandledRejectionHandled = function (fn) {\n    var domain = getDomain();\n    unhandledRejectionHandled =\n        typeof fn === \"function\" ? (domain === null ?\n                                            fn : util.domainBind(domain, fn))\n                                 : undefined;\n};\n\nvar disableLongStackTraces = function() {};\nPromise.longStackTraces = function () {\n    if (async.haveItemsQueued() && !config.longStackTraces) {\n        throw new Error(\"cannot enable long stack traces after promises have been created\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    if (!config.longStackTraces && longStackTracesIsSupported()) {\n        var Promise_captureStackTrace = Promise.prototype._captureStackTrace;\n        var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace;\n        config.longStackTraces = true;\n        disableLongStackTraces = function() {\n            if (async.haveItemsQueued() && !config.longStackTraces) {\n                throw new Error(\"cannot enable long stack traces after promises have been created\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n            }\n            Promise.prototype._captureStackTrace = Promise_captureStackTrace;\n            Promise.prototype._attachExtraTrace = Promise_attachExtraTrace;\n            Context.deactivateLongStackTraces();\n            async.enableTrampoline();\n            config.longStackTraces = false;\n        };\n        Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace;\n        Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace;\n        Context.activateLongStackTraces();\n        async.disableTrampolineIfNecessary();\n    }\n};\n\nPromise.hasLongStackTraces = function () {\n    return config.longStackTraces && longStackTracesIsSupported();\n};\n\nvar fireDomEvent = (function() {\n    try {\n        if (typeof CustomEvent === \"function\") {\n            var event = new CustomEvent(\"CustomEvent\");\n            util.global.dispatchEvent(event);\n            return function(name, event) {\n                var domEvent = new CustomEvent(name.toLowerCase(), {\n                    detail: event,\n                    cancelable: true\n                });\n                return !util.global.dispatchEvent(domEvent);\n            };\n        } else if (typeof Event === \"function\") {\n            var event = new Event(\"CustomEvent\");\n            util.global.dispatchEvent(event);\n            return function(name, event) {\n                var domEvent = new Event(name.toLowerCase(), {\n                    cancelable: true\n                });\n                domEvent.detail = event;\n                return !util.global.dispatchEvent(domEvent);\n            };\n        } else {\n            var event = document.createEvent(\"CustomEvent\");\n            event.initCustomEvent(\"testingtheevent\", false, true, {});\n            util.global.dispatchEvent(event);\n            return function(name, event) {\n                var domEvent = document.createEvent(\"CustomEvent\");\n                domEvent.initCustomEvent(name.toLowerCase(), false, true,\n                    event);\n                return !util.global.dispatchEvent(domEvent);\n            };\n        }\n    } catch (e) {}\n    return function() {\n        return false;\n    };\n})();\n\nvar fireGlobalEvent = (function() {\n    if (util.isNode) {\n        return function() {\n            return process.emit.apply(process, arguments);\n        };\n    } else {\n        if (!util.global) {\n            return function() {\n                return false;\n            };\n        }\n        return function(name) {\n            var methodName = \"on\" + name.toLowerCase();\n            var method = util.global[methodName];\n            if (!method) return false;\n            method.apply(util.global, [].slice.call(arguments, 1));\n            return true;\n        };\n    }\n})();\n\nfunction generatePromiseLifecycleEventObject(name, promise) {\n    return {promise: promise};\n}\n\nvar eventToObjectGenerator = {\n    promiseCreated: generatePromiseLifecycleEventObject,\n    promiseFulfilled: generatePromiseLifecycleEventObject,\n    promiseRejected: generatePromiseLifecycleEventObject,\n    promiseResolved: generatePromiseLifecycleEventObject,\n    promiseCancelled: generatePromiseLifecycleEventObject,\n    promiseChained: function(name, promise, child) {\n        return {promise: promise, child: child};\n    },\n    warning: function(name, warning) {\n        return {warning: warning};\n    },\n    unhandledRejection: function (name, reason, promise) {\n        return {reason: reason, promise: promise};\n    },\n    rejectionHandled: generatePromiseLifecycleEventObject\n};\n\nvar activeFireEvent = function (name) {\n    var globalEventFired = false;\n    try {\n        globalEventFired = fireGlobalEvent.apply(null, arguments);\n    } catch (e) {\n        async.throwLater(e);\n        globalEventFired = true;\n    }\n\n    var domEventFired = false;\n    try {\n        domEventFired = fireDomEvent(name,\n                    eventToObjectGenerator[name].apply(null, arguments));\n    } catch (e) {\n        async.throwLater(e);\n        domEventFired = true;\n    }\n\n    return domEventFired || globalEventFired;\n};\n\nPromise.config = function(opts) {\n    opts = Object(opts);\n    if (\"longStackTraces\" in opts) {\n        if (opts.longStackTraces) {\n            Promise.longStackTraces();\n        } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {\n            disableLongStackTraces();\n        }\n    }\n    if (\"warnings\" in opts) {\n        var warningsOption = opts.warnings;\n        config.warnings = !!warningsOption;\n        wForgottenReturn = config.warnings;\n\n        if (util.isObject(warningsOption)) {\n            if (\"wForgottenReturn\" in warningsOption) {\n                wForgottenReturn = !!warningsOption.wForgottenReturn;\n            }\n        }\n    }\n    if (\"cancellation\" in opts && opts.cancellation && !config.cancellation) {\n        if (async.haveItemsQueued()) {\n            throw new Error(\n                \"cannot enable cancellation after promises are in use\");\n        }\n        Promise.prototype._clearCancellationData =\n            cancellationClearCancellationData;\n        Promise.prototype._propagateFrom = cancellationPropagateFrom;\n        Promise.prototype._onCancel = cancellationOnCancel;\n        Promise.prototype._setOnCancel = cancellationSetOnCancel;\n        Promise.prototype._attachCancellationCallback =\n            cancellationAttachCancellationCallback;\n        Promise.prototype._execute = cancellationExecute;\n        propagateFromFunction = cancellationPropagateFrom;\n        config.cancellation = true;\n    }\n    if (\"monitoring\" in opts) {\n        if (opts.monitoring && !config.monitoring) {\n            config.monitoring = true;\n            Promise.prototype._fireEvent = activeFireEvent;\n        } else if (!opts.monitoring && config.monitoring) {\n            config.monitoring = false;\n            Promise.prototype._fireEvent = defaultFireEvent;\n        }\n    }\n    return Promise;\n};\n\nfunction defaultFireEvent() { return false; }\n\nPromise.prototype._fireEvent = defaultFireEvent;\nPromise.prototype._execute = function(executor, resolve, reject) {\n    try {\n        executor(resolve, reject);\n    } catch (e) {\n        return e;\n    }\n};\nPromise.prototype._onCancel = function () {};\nPromise.prototype._setOnCancel = function (handler) { ; };\nPromise.prototype._attachCancellationCallback = function(onCancel) {\n    ;\n};\nPromise.prototype._captureStackTrace = function () {};\nPromise.prototype._attachExtraTrace = function () {};\nPromise.prototype._clearCancellationData = function() {};\nPromise.prototype._propagateFrom = function (parent, flags) {\n    ;\n    ;\n};\n\nfunction cancellationExecute(executor, resolve, reject) {\n    var promise = this;\n    try {\n        executor(resolve, reject, function(onCancel) {\n            if (typeof onCancel !== \"function\") {\n                throw new TypeError(\"onCancel must be a function, got: \" +\n                                    util.toString(onCancel));\n            }\n            promise._attachCancellationCallback(onCancel);\n        });\n    } catch (e) {\n        return e;\n    }\n}\n\nfunction cancellationAttachCancellationCallback(onCancel) {\n    if (!this._isCancellable()) return this;\n\n    var previousOnCancel = this._onCancel();\n    if (previousOnCancel !== undefined) {\n        if (util.isArray(previousOnCancel)) {\n            previousOnCancel.push(onCancel);\n        } else {\n            this._setOnCancel([previousOnCancel, onCancel]);\n        }\n    } else {\n        this._setOnCancel(onCancel);\n    }\n}\n\nfunction cancellationOnCancel() {\n    return this._onCancelField;\n}\n\nfunction cancellationSetOnCancel(onCancel) {\n    this._onCancelField = onCancel;\n}\n\nfunction cancellationClearCancellationData() {\n    this._cancellationParent = undefined;\n    this._onCancelField = undefined;\n}\n\nfunction cancellationPropagateFrom(parent, flags) {\n    if ((flags & 1) !== 0) {\n        this._cancellationParent = parent;\n        var branchesRemainingToCancel = parent._branchesRemainingToCancel;\n        if (branchesRemainingToCancel === undefined) {\n            branchesRemainingToCancel = 0;\n        }\n        parent._branchesRemainingToCancel = branchesRemainingToCancel + 1;\n    }\n    if ((flags & 2) !== 0 && parent._isBound()) {\n        this._setBoundTo(parent._boundTo);\n    }\n}\n\nfunction bindingPropagateFrom(parent, flags) {\n    if ((flags & 2) !== 0 && parent._isBound()) {\n        this._setBoundTo(parent._boundTo);\n    }\n}\nvar propagateFromFunction = bindingPropagateFrom;\n\nfunction boundValueFunction() {\n    var ret = this._boundTo;\n    if (ret !== undefined) {\n        if (ret instanceof Promise) {\n            if (ret.isFulfilled()) {\n                return ret.value();\n            } else {\n                return undefined;\n            }\n        }\n    }\n    return ret;\n}\n\nfunction longStackTracesCaptureStackTrace() {\n    this._trace = new CapturedTrace(this._peekContext());\n}\n\nfunction longStackTracesAttachExtraTrace(error, ignoreSelf) {\n    if (canAttachTrace(error)) {\n        var trace = this._trace;\n        if (trace !== undefined) {\n            if (ignoreSelf) trace = trace._parent;\n        }\n        if (trace !== undefined) {\n            trace.attachExtraTrace(error);\n        } else if (!error.__stackCleaned__) {\n            var parsed = parseStackAndMessage(error);\n            util.notEnumerableProp(error, \"stack\",\n                parsed.message + \"\\n\" + parsed.stack.join(\"\\n\"));\n            util.notEnumerableProp(error, \"__stackCleaned__\", true);\n        }\n    }\n}\n\nfunction checkForgottenReturns(returnValue, promiseCreated, name, promise,\n                               parent) {\n    if (returnValue === undefined && promiseCreated !== null &&\n        wForgottenReturn) {\n        if (parent !== undefined && parent._returnedNonUndefined()) return;\n        if ((promise._bitField & 65535) === 0) return;\n\n        if (name) name = name + \" \";\n        var handlerLine = \"\";\n        var creatorLine = \"\";\n        if (promiseCreated._trace) {\n            var traceLines = promiseCreated._trace.stack.split(\"\\n\");\n            var stack = cleanStack(traceLines);\n            for (var i = stack.length - 1; i >= 0; --i) {\n                var line = stack[i];\n                if (!nodeFramePattern.test(line)) {\n                    var lineMatches = line.match(parseLinePattern);\n                    if (lineMatches) {\n                        handlerLine  = \"at \" + lineMatches[1] +\n                            \":\" + lineMatches[2] + \":\" + lineMatches[3] + \" \";\n                    }\n                    break;\n                }\n            }\n\n            if (stack.length > 0) {\n                var firstUserLine = stack[0];\n                for (var i = 0; i < traceLines.length; ++i) {\n\n                    if (traceLines[i] === firstUserLine) {\n                        if (i > 0) {\n                            creatorLine = \"\\n\" + traceLines[i - 1];\n                        }\n                        break;\n                    }\n                }\n\n            }\n        }\n        var msg = \"a promise was created in a \" + name +\n            \"handler \" + handlerLine + \"but was not returned from it, \" +\n            \"see http://goo.gl/rRqMUw\" +\n            creatorLine;\n        promise._warn(msg, true, promiseCreated);\n    }\n}\n\nfunction deprecated(name, replacement) {\n    var message = name +\n        \" is deprecated and will be removed in a future version.\";\n    if (replacement) message += \" Use \" + replacement + \" instead.\";\n    return warn(message);\n}\n\nfunction warn(message, shouldUseOwnTrace, promise) {\n    if (!config.warnings) return;\n    var warning = new Warning(message);\n    var ctx;\n    if (shouldUseOwnTrace) {\n        promise._attachExtraTrace(warning);\n    } else if (config.longStackTraces && (ctx = Promise._peekContext())) {\n        ctx.attachExtraTrace(warning);\n    } else {\n        var parsed = parseStackAndMessage(warning);\n        warning.stack = parsed.message + \"\\n\" + parsed.stack.join(\"\\n\");\n    }\n\n    if (!activeFireEvent(\"warning\", warning)) {\n        formatAndLogError(warning, \"\", true);\n    }\n}\n\nfunction reconstructStack(message, stacks) {\n    for (var i = 0; i < stacks.length - 1; ++i) {\n        stacks[i].push(\"From previous event:\");\n        stacks[i] = stacks[i].join(\"\\n\");\n    }\n    if (i < stacks.length) {\n        stacks[i] = stacks[i].join(\"\\n\");\n    }\n    return message + \"\\n\" + stacks.join(\"\\n\");\n}\n\nfunction removeDuplicateOrEmptyJumps(stacks) {\n    for (var i = 0; i < stacks.length; ++i) {\n        if (stacks[i].length === 0 ||\n            ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {\n            stacks.splice(i, 1);\n            i--;\n        }\n    }\n}\n\nfunction removeCommonRoots(stacks) {\n    var current = stacks[0];\n    for (var i = 1; i < stacks.length; ++i) {\n        var prev = stacks[i];\n        var currentLastIndex = current.length - 1;\n        var currentLastLine = current[currentLastIndex];\n        var commonRootMeetPoint = -1;\n\n        for (var j = prev.length - 1; j >= 0; --j) {\n            if (prev[j] === currentLastLine) {\n                commonRootMeetPoint = j;\n                break;\n            }\n        }\n\n        for (var j = commonRootMeetPoint; j >= 0; --j) {\n            var line = prev[j];\n            if (current[currentLastIndex] === line) {\n                current.pop();\n                currentLastIndex--;\n            } else {\n                break;\n            }\n        }\n        current = prev;\n    }\n}\n\nfunction cleanStack(stack) {\n    var ret = [];\n    for (var i = 0; i < stack.length; ++i) {\n        var line = stack[i];\n        var isTraceLine = \"    (No stack trace)\" === line ||\n            stackFramePattern.test(line);\n        var isInternalFrame = isTraceLine && shouldIgnore(line);\n        if (isTraceLine && !isInternalFrame) {\n            if (indentStackFrames && line.charAt(0) !== \" \") {\n                line = \"    \" + line;\n            }\n            ret.push(line);\n        }\n    }\n    return ret;\n}\n\nfunction stackFramesAsArray(error) {\n    var stack = error.stack.replace(/\\s+$/g, \"\").split(\"\\n\");\n    for (var i = 0; i < stack.length; ++i) {\n        var line = stack[i];\n        if (\"    (No stack trace)\" === line || stackFramePattern.test(line)) {\n            break;\n        }\n    }\n    if (i > 0 && error.name != \"SyntaxError\") {\n        stack = stack.slice(i);\n    }\n    return stack;\n}\n\nfunction parseStackAndMessage(error) {\n    var stack = error.stack;\n    var message = error.toString();\n    stack = typeof stack === \"string\" && stack.length > 0\n                ? stackFramesAsArray(error) : [\"    (No stack trace)\"];\n    return {\n        message: message,\n        stack: error.name == \"SyntaxError\" ? stack : cleanStack(stack)\n    };\n}\n\nfunction formatAndLogError(error, title, isSoft) {\n    if (typeof console !== \"undefined\") {\n        var message;\n        if (util.isObject(error)) {\n            var stack = error.stack;\n            message = title + formatStack(stack, error);\n        } else {\n            message = title + String(error);\n        }\n        if (typeof printWarning === \"function\") {\n            printWarning(message, isSoft);\n        } else if (typeof console.log === \"function\" ||\n            typeof console.log === \"object\") {\n            console.log(message);\n        }\n    }\n}\n\nfunction fireRejectionEvent(name, localHandler, reason, promise) {\n    var localEventFired = false;\n    try {\n        if (typeof localHandler === \"function\") {\n            localEventFired = true;\n            if (name === \"rejectionHandled\") {\n                localHandler(promise);\n            } else {\n                localHandler(reason, promise);\n            }\n        }\n    } catch (e) {\n        async.throwLater(e);\n    }\n\n    if (name === \"unhandledRejection\") {\n        if (!activeFireEvent(name, reason, promise) && !localEventFired) {\n            formatAndLogError(reason, \"Unhandled rejection \");\n        }\n    } else {\n        activeFireEvent(name, promise);\n    }\n}\n\nfunction formatNonError(obj) {\n    var str;\n    if (typeof obj === \"function\") {\n        str = \"[function \" +\n            (obj.name || \"anonymous\") +\n            \"]\";\n    } else {\n        str = obj && typeof obj.toString === \"function\"\n            ? obj.toString() : util.toString(obj);\n        var ruselessToString = /\\[object [a-zA-Z0-9$_]+\\]/;\n        if (ruselessToString.test(str)) {\n            try {\n                var newStr = JSON.stringify(obj);\n                str = newStr;\n            }\n            catch(e) {\n\n            }\n        }\n        if (str.length === 0) {\n            str = \"(empty array)\";\n        }\n    }\n    return (\"(<\" + snip(str) + \">, no stack trace)\");\n}\n\nfunction snip(str) {\n    var maxChars = 41;\n    if (str.length < maxChars) {\n        return str;\n    }\n    return str.substr(0, maxChars - 3) + \"...\";\n}\n\nfunction longStackTracesIsSupported() {\n    return typeof captureStackTrace === \"function\";\n}\n\nvar shouldIgnore = function() { return false; };\nvar parseLineInfoRegex = /[\\/<\\(]([^:\\/]+):(\\d+):(?:\\d+)\\)?\\s*$/;\nfunction parseLineInfo(line) {\n    var matches = line.match(parseLineInfoRegex);\n    if (matches) {\n        return {\n            fileName: matches[1],\n            line: parseInt(matches[2], 10)\n        };\n    }\n}\n\nfunction setBounds(firstLineError, lastLineError) {\n    if (!longStackTracesIsSupported()) return;\n    var firstStackLines = firstLineError.stack.split(\"\\n\");\n    var lastStackLines = lastLineError.stack.split(\"\\n\");\n    var firstIndex = -1;\n    var lastIndex = -1;\n    var firstFileName;\n    var lastFileName;\n    for (var i = 0; i < firstStackLines.length; ++i) {\n        var result = parseLineInfo(firstStackLines[i]);\n        if (result) {\n            firstFileName = result.fileName;\n            firstIndex = result.line;\n            break;\n        }\n    }\n    for (var i = 0; i < lastStackLines.length; ++i) {\n        var result = parseLineInfo(lastStackLines[i]);\n        if (result) {\n            lastFileName = result.fileName;\n            lastIndex = result.line;\n            break;\n        }\n    }\n    if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||\n        firstFileName !== lastFileName || firstIndex >= lastIndex) {\n        return;\n    }\n\n    shouldIgnore = function(line) {\n        if (bluebirdFramePattern.test(line)) return true;\n        var info = parseLineInfo(line);\n        if (info) {\n            if (info.fileName === firstFileName &&\n                (firstIndex <= info.line && info.line <= lastIndex)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\n\nfunction CapturedTrace(parent) {\n    this._parent = parent;\n    this._promisesCreated = 0;\n    var length = this._length = 1 + (parent === undefined ? 0 : parent._length);\n    captureStackTrace(this, CapturedTrace);\n    if (length > 32) this.uncycle();\n}\nutil.inherits(CapturedTrace, Error);\nContext.CapturedTrace = CapturedTrace;\n\nCapturedTrace.prototype.uncycle = function() {\n    var length = this._length;\n    if (length < 2) return;\n    var nodes = [];\n    var stackToIndex = {};\n\n    for (var i = 0, node = this; node !== undefined; ++i) {\n        nodes.push(node);\n        node = node._parent;\n    }\n    length = this._length = i;\n    for (var i = length - 1; i >= 0; --i) {\n        var stack = nodes[i].stack;\n        if (stackToIndex[stack] === undefined) {\n            stackToIndex[stack] = i;\n        }\n    }\n    for (var i = 0; i < length; ++i) {\n        var currentStack = nodes[i].stack;\n        var index = stackToIndex[currentStack];\n        if (index !== undefined && index !== i) {\n            if (index > 0) {\n                nodes[index - 1]._parent = undefined;\n                nodes[index - 1]._length = 1;\n            }\n            nodes[i]._parent = undefined;\n            nodes[i]._length = 1;\n            var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;\n\n            if (index < length - 1) {\n                cycleEdgeNode._parent = nodes[index + 1];\n                cycleEdgeNode._parent.uncycle();\n                cycleEdgeNode._length =\n                    cycleEdgeNode._parent._length + 1;\n            } else {\n                cycleEdgeNode._parent = undefined;\n                cycleEdgeNode._length = 1;\n            }\n            var currentChildLength = cycleEdgeNode._length + 1;\n            for (var j = i - 2; j >= 0; --j) {\n                nodes[j]._length = currentChildLength;\n                currentChildLength++;\n            }\n            return;\n        }\n    }\n};\n\nCapturedTrace.prototype.attachExtraTrace = function(error) {\n    if (error.__stackCleaned__) return;\n    this.uncycle();\n    var parsed = parseStackAndMessage(error);\n    var message = parsed.message;\n    var stacks = [parsed.stack];\n\n    var trace = this;\n    while (trace !== undefined) {\n        stacks.push(cleanStack(trace.stack.split(\"\\n\")));\n        trace = trace._parent;\n    }\n    removeCommonRoots(stacks);\n    removeDuplicateOrEmptyJumps(stacks);\n    util.notEnumerableProp(error, \"stack\", reconstructStack(message, stacks));\n    util.notEnumerableProp(error, \"__stackCleaned__\", true);\n};\n\nvar captureStackTrace = (function stackDetection() {\n    var v8stackFramePattern = /^\\s*at\\s*/;\n    var v8stackFormatter = function(stack, error) {\n        if (typeof stack === \"string\") return stack;\n\n        if (error.name !== undefined &&\n            error.message !== undefined) {\n            return error.toString();\n        }\n        return formatNonError(error);\n    };\n\n    if (typeof Error.stackTraceLimit === \"number\" &&\n        typeof Error.captureStackTrace === \"function\") {\n        Error.stackTraceLimit += 6;\n        stackFramePattern = v8stackFramePattern;\n        formatStack = v8stackFormatter;\n        var captureStackTrace = Error.captureStackTrace;\n\n        shouldIgnore = function(line) {\n            return bluebirdFramePattern.test(line);\n        };\n        return function(receiver, ignoreUntil) {\n            Error.stackTraceLimit += 6;\n            captureStackTrace(receiver, ignoreUntil);\n            Error.stackTraceLimit -= 6;\n        };\n    }\n    var err = new Error();\n\n    if (typeof err.stack === \"string\" &&\n        err.stack.split(\"\\n\")[0].indexOf(\"stackDetection@\") >= 0) {\n        stackFramePattern = /@/;\n        formatStack = v8stackFormatter;\n        indentStackFrames = true;\n        return function captureStackTrace(o) {\n            o.stack = new Error().stack;\n        };\n    }\n\n    var hasStackAfterThrow;\n    try { throw new Error(); }\n    catch(e) {\n        hasStackAfterThrow = (\"stack\" in e);\n    }\n    if (!(\"stack\" in err) && hasStackAfterThrow &&\n        typeof Error.stackTraceLimit === \"number\") {\n        stackFramePattern = v8stackFramePattern;\n        formatStack = v8stackFormatter;\n        return function captureStackTrace(o) {\n            Error.stackTraceLimit += 6;\n            try { throw new Error(); }\n            catch(e) { o.stack = e.stack; }\n            Error.stackTraceLimit -= 6;\n        };\n    }\n\n    formatStack = function(stack, error) {\n        if (typeof stack === \"string\") return stack;\n\n        if ((typeof error === \"object\" ||\n            typeof error === \"function\") &&\n            error.name !== undefined &&\n            error.message !== undefined) {\n            return error.toString();\n        }\n        return formatNonError(error);\n    };\n\n    return null;\n\n})([]);\n\nif (typeof console !== \"undefined\" && typeof console.warn !== \"undefined\") {\n    printWarning = function (message) {\n        console.warn(message);\n    };\n    if (util.isNode && process.stderr.isTTY) {\n        printWarning = function(message, isSoft) {\n            var color = isSoft ? \"\\u001b[33m\" : \"\\u001b[31m\";\n            console.warn(color + message + \"\\u001b[0m\\n\");\n        };\n    } else if (!util.isNode && typeof (new Error().stack) === \"string\") {\n        printWarning = function(message, isSoft) {\n            console.warn(\"%c\" + message,\n                        isSoft ? \"color: darkorange\" : \"color: red\");\n        };\n    }\n}\n\nvar config = {\n    warnings: warnings,\n    longStackTraces: false,\n    cancellation: false,\n    monitoring: false\n};\n\nif (longStackTraces) Promise.longStackTraces();\n\nreturn {\n    longStackTraces: function() {\n        return config.longStackTraces;\n    },\n    warnings: function() {\n        return config.warnings;\n    },\n    cancellation: function() {\n        return config.cancellation;\n    },\n    monitoring: function() {\n        return config.monitoring;\n    },\n    propagateFromFunction: function() {\n        return propagateFromFunction;\n    },\n    boundValueFunction: function() {\n        return boundValueFunction;\n    },\n    checkForgottenReturns: checkForgottenReturns,\n    setBounds: setBounds,\n    warn: warn,\n    deprecated: deprecated,\n    CapturedTrace: CapturedTrace,\n    fireDomEvent: fireDomEvent,\n    fireGlobalEvent: fireGlobalEvent\n};\n};\n\n}).call(this,require('_process'))\n},{\"./errors\":50,\"./util\":74,\"_process\":138}],48:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nfunction returner() {\n    return this.value;\n}\nfunction thrower() {\n    throw this.reason;\n}\n\nPromise.prototype[\"return\"] =\nPromise.prototype.thenReturn = function (value) {\n    if (value instanceof Promise) value.suppressUnhandledRejections();\n    return this._then(\n        returner, undefined, undefined, {value: value}, undefined);\n};\n\nPromise.prototype[\"throw\"] =\nPromise.prototype.thenThrow = function (reason) {\n    return this._then(\n        thrower, undefined, undefined, {reason: reason}, undefined);\n};\n\nPromise.prototype.catchThrow = function (reason) {\n    if (arguments.length <= 1) {\n        return this._then(\n            undefined, thrower, undefined, {reason: reason}, undefined);\n    } else {\n        var _reason = arguments[1];\n        var handler = function() {throw _reason;};\n        return this.caught(reason, handler);\n    }\n};\n\nPromise.prototype.catchReturn = function (value) {\n    if (arguments.length <= 1) {\n        if (value instanceof Promise) value.suppressUnhandledRejections();\n        return this._then(\n            undefined, returner, undefined, {value: value}, undefined);\n    } else {\n        var _value = arguments[1];\n        if (_value instanceof Promise) _value.suppressUnhandledRejections();\n        var handler = function() {return _value;};\n        return this.caught(value, handler);\n    }\n};\n};\n\n},{}],49:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar PromiseReduce = Promise.reduce;\nvar PromiseAll = Promise.all;\n\nfunction promiseAllThis() {\n    return PromiseAll(this);\n}\n\nfunction PromiseMapSeries(promises, fn) {\n    return PromiseReduce(promises, fn, INTERNAL, INTERNAL);\n}\n\nPromise.prototype.each = function (fn) {\n    return PromiseReduce(this, fn, INTERNAL, 0)\n              ._then(promiseAllThis, undefined, undefined, this, undefined);\n};\n\nPromise.prototype.mapSeries = function (fn) {\n    return PromiseReduce(this, fn, INTERNAL, INTERNAL);\n};\n\nPromise.each = function (promises, fn) {\n    return PromiseReduce(promises, fn, INTERNAL, 0)\n              ._then(promiseAllThis, undefined, undefined, promises, undefined);\n};\n\nPromise.mapSeries = PromiseMapSeries;\n};\n\n\n},{}],50:[function(require,module,exports){\n\"use strict\";\nvar es5 = require(\"./es5\");\nvar Objectfreeze = es5.freeze;\nvar util = require(\"./util\");\nvar inherits = util.inherits;\nvar notEnumerableProp = util.notEnumerableProp;\n\nfunction subError(nameProperty, defaultMessage) {\n    function SubError(message) {\n        if (!(this instanceof SubError)) return new SubError(message);\n        notEnumerableProp(this, \"message\",\n            typeof message === \"string\" ? message : defaultMessage);\n        notEnumerableProp(this, \"name\", nameProperty);\n        if (Error.captureStackTrace) {\n            Error.captureStackTrace(this, this.constructor);\n        } else {\n            Error.call(this);\n        }\n    }\n    inherits(SubError, Error);\n    return SubError;\n}\n\nvar _TypeError, _RangeError;\nvar Warning = subError(\"Warning\", \"warning\");\nvar CancellationError = subError(\"CancellationError\", \"cancellation error\");\nvar TimeoutError = subError(\"TimeoutError\", \"timeout error\");\nvar AggregateError = subError(\"AggregateError\", \"aggregate error\");\ntry {\n    _TypeError = TypeError;\n    _RangeError = RangeError;\n} catch(e) {\n    _TypeError = subError(\"TypeError\", \"type error\");\n    _RangeError = subError(\"RangeError\", \"range error\");\n}\n\nvar methods = (\"join pop push shift unshift slice filter forEach some \" +\n    \"every map indexOf lastIndexOf reduce reduceRight sort reverse\").split(\" \");\n\nfor (var i = 0; i < methods.length; ++i) {\n    if (typeof Array.prototype[methods[i]] === \"function\") {\n        AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];\n    }\n}\n\nes5.defineProperty(AggregateError.prototype, \"length\", {\n    value: 0,\n    configurable: false,\n    writable: true,\n    enumerable: true\n});\nAggregateError.prototype[\"isOperational\"] = true;\nvar level = 0;\nAggregateError.prototype.toString = function() {\n    var indent = Array(level * 4 + 1).join(\" \");\n    var ret = \"\\n\" + indent + \"AggregateError of:\" + \"\\n\";\n    level++;\n    indent = Array(level * 4 + 1).join(\" \");\n    for (var i = 0; i < this.length; ++i) {\n        var str = this[i] === this ? \"[Circular AggregateError]\" : this[i] + \"\";\n        var lines = str.split(\"\\n\");\n        for (var j = 0; j < lines.length; ++j) {\n            lines[j] = indent + lines[j];\n        }\n        str = lines.join(\"\\n\");\n        ret += str + \"\\n\";\n    }\n    level--;\n    return ret;\n};\n\nfunction OperationalError(message) {\n    if (!(this instanceof OperationalError))\n        return new OperationalError(message);\n    notEnumerableProp(this, \"name\", \"OperationalError\");\n    notEnumerableProp(this, \"message\", message);\n    this.cause = message;\n    this[\"isOperational\"] = true;\n\n    if (message instanceof Error) {\n        notEnumerableProp(this, \"message\", message.message);\n        notEnumerableProp(this, \"stack\", message.stack);\n    } else if (Error.captureStackTrace) {\n        Error.captureStackTrace(this, this.constructor);\n    }\n\n}\ninherits(OperationalError, Error);\n\nvar errorTypes = Error[\"__BluebirdErrorTypes__\"];\nif (!errorTypes) {\n    errorTypes = Objectfreeze({\n        CancellationError: CancellationError,\n        TimeoutError: TimeoutError,\n        OperationalError: OperationalError,\n        RejectionError: OperationalError,\n        AggregateError: AggregateError\n    });\n    es5.defineProperty(Error, \"__BluebirdErrorTypes__\", {\n        value: errorTypes,\n        writable: false,\n        enumerable: false,\n        configurable: false\n    });\n}\n\nmodule.exports = {\n    Error: Error,\n    TypeError: _TypeError,\n    RangeError: _RangeError,\n    CancellationError: errorTypes.CancellationError,\n    OperationalError: errorTypes.OperationalError,\n    TimeoutError: errorTypes.TimeoutError,\n    AggregateError: errorTypes.AggregateError,\n    Warning: Warning\n};\n\n},{\"./es5\":51,\"./util\":74}],51:[function(require,module,exports){\nvar isES5 = (function(){\n    \"use strict\";\n    return this === undefined;\n})();\n\nif (isES5) {\n    module.exports = {\n        freeze: Object.freeze,\n        defineProperty: Object.defineProperty,\n        getDescriptor: Object.getOwnPropertyDescriptor,\n        keys: Object.keys,\n        names: Object.getOwnPropertyNames,\n        getPrototypeOf: Object.getPrototypeOf,\n        isArray: Array.isArray,\n        isES5: isES5,\n        propertyIsWritable: function(obj, prop) {\n            var descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n            return !!(!descriptor || descriptor.writable || descriptor.set);\n        }\n    };\n} else {\n    var has = {}.hasOwnProperty;\n    var str = {}.toString;\n    var proto = {}.constructor.prototype;\n\n    var ObjectKeys = function (o) {\n        var ret = [];\n        for (var key in o) {\n            if (has.call(o, key)) {\n                ret.push(key);\n            }\n        }\n        return ret;\n    };\n\n    var ObjectGetDescriptor = function(o, key) {\n        return {value: o[key]};\n    };\n\n    var ObjectDefineProperty = function (o, key, desc) {\n        o[key] = desc.value;\n        return o;\n    };\n\n    var ObjectFreeze = function (obj) {\n        return obj;\n    };\n\n    var ObjectGetPrototypeOf = function (obj) {\n        try {\n            return Object(obj).constructor.prototype;\n        }\n        catch (e) {\n            return proto;\n        }\n    };\n\n    var ArrayIsArray = function (obj) {\n        try {\n            return str.call(obj) === \"[object Array]\";\n        }\n        catch(e) {\n            return false;\n        }\n    };\n\n    module.exports = {\n        isArray: ArrayIsArray,\n        keys: ObjectKeys,\n        names: ObjectKeys,\n        defineProperty: ObjectDefineProperty,\n        getDescriptor: ObjectGetDescriptor,\n        freeze: ObjectFreeze,\n        getPrototypeOf: ObjectGetPrototypeOf,\n        isES5: isES5,\n        propertyIsWritable: function() {\n            return true;\n        }\n    };\n}\n\n},{}],52:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar PromiseMap = Promise.map;\n\nPromise.prototype.filter = function (fn, options) {\n    return PromiseMap(this, fn, options, INTERNAL);\n};\n\nPromise.filter = function (promises, fn, options) {\n    return PromiseMap(promises, fn, options, INTERNAL);\n};\n};\n\n},{}],53:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, tryConvertToPromise) {\nvar util = require(\"./util\");\nvar CancellationError = Promise.CancellationError;\nvar errorObj = util.errorObj;\n\nfunction PassThroughHandlerContext(promise, type, handler) {\n    this.promise = promise;\n    this.type = type;\n    this.handler = handler;\n    this.called = false;\n    this.cancelPromise = null;\n}\n\nPassThroughHandlerContext.prototype.isFinallyHandler = function() {\n    return this.type === 0;\n};\n\nfunction FinallyHandlerCancelReaction(finallyHandler) {\n    this.finallyHandler = finallyHandler;\n}\n\nFinallyHandlerCancelReaction.prototype._resultCancelled = function() {\n    checkCancel(this.finallyHandler);\n};\n\nfunction checkCancel(ctx, reason) {\n    if (ctx.cancelPromise != null) {\n        if (arguments.length > 1) {\n            ctx.cancelPromise._reject(reason);\n        } else {\n            ctx.cancelPromise._cancel();\n        }\n        ctx.cancelPromise = null;\n        return true;\n    }\n    return false;\n}\n\nfunction succeed() {\n    return finallyHandler.call(this, this.promise._target()._settledValue());\n}\nfunction fail(reason) {\n    if (checkCancel(this, reason)) return;\n    errorObj.e = reason;\n    return errorObj;\n}\nfunction finallyHandler(reasonOrValue) {\n    var promise = this.promise;\n    var handler = this.handler;\n\n    if (!this.called) {\n        this.called = true;\n        var ret = this.isFinallyHandler()\n            ? handler.call(promise._boundValue())\n            : handler.call(promise._boundValue(), reasonOrValue);\n        if (ret !== undefined) {\n            promise._setReturnedNonUndefined();\n            var maybePromise = tryConvertToPromise(ret, promise);\n            if (maybePromise instanceof Promise) {\n                if (this.cancelPromise != null) {\n                    if (maybePromise._isCancelled()) {\n                        var reason =\n                            new CancellationError(\"late cancellation observer\");\n                        promise._attachExtraTrace(reason);\n                        errorObj.e = reason;\n                        return errorObj;\n                    } else if (maybePromise.isPending()) {\n                        maybePromise._attachCancellationCallback(\n                            new FinallyHandlerCancelReaction(this));\n                    }\n                }\n                return maybePromise._then(\n                    succeed, fail, undefined, this, undefined);\n            }\n        }\n    }\n\n    if (promise.isRejected()) {\n        checkCancel(this);\n        errorObj.e = reasonOrValue;\n        return errorObj;\n    } else {\n        checkCancel(this);\n        return reasonOrValue;\n    }\n}\n\nPromise.prototype._passThrough = function(handler, type, success, fail) {\n    if (typeof handler !== \"function\") return this.then();\n    return this._then(success,\n                      fail,\n                      undefined,\n                      new PassThroughHandlerContext(this, type, handler),\n                      undefined);\n};\n\nPromise.prototype.lastly =\nPromise.prototype[\"finally\"] = function (handler) {\n    return this._passThrough(handler,\n                             0,\n                             finallyHandler,\n                             finallyHandler);\n};\n\nPromise.prototype.tap = function (handler) {\n    return this._passThrough(handler, 1, finallyHandler);\n};\n\nreturn PassThroughHandlerContext;\n};\n\n},{\"./util\":74}],54:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise,\n                          apiRejection,\n                          INTERNAL,\n                          tryConvertToPromise,\n                          Proxyable,\n                          debug) {\nvar errors = require(\"./errors\");\nvar TypeError = errors.TypeError;\nvar util = require(\"./util\");\nvar errorObj = util.errorObj;\nvar tryCatch = util.tryCatch;\nvar yieldHandlers = [];\n\nfunction promiseFromYieldHandler(value, yieldHandlers, traceParent) {\n    for (var i = 0; i < yieldHandlers.length; ++i) {\n        traceParent._pushContext();\n        var result = tryCatch(yieldHandlers[i])(value);\n        traceParent._popContext();\n        if (result === errorObj) {\n            traceParent._pushContext();\n            var ret = Promise.reject(errorObj.e);\n            traceParent._popContext();\n            return ret;\n        }\n        var maybePromise = tryConvertToPromise(result, traceParent);\n        if (maybePromise instanceof Promise) return maybePromise;\n    }\n    return null;\n}\n\nfunction PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {\n    if (debug.cancellation()) {\n        var internal = new Promise(INTERNAL);\n        var _finallyPromise = this._finallyPromise = new Promise(INTERNAL);\n        this._promise = internal.lastly(function() {\n            return _finallyPromise;\n        });\n        internal._captureStackTrace();\n        internal._setOnCancel(this);\n    } else {\n        var promise = this._promise = new Promise(INTERNAL);\n        promise._captureStackTrace();\n    }\n    this._stack = stack;\n    this._generatorFunction = generatorFunction;\n    this._receiver = receiver;\n    this._generator = undefined;\n    this._yieldHandlers = typeof yieldHandler === \"function\"\n        ? [yieldHandler].concat(yieldHandlers)\n        : yieldHandlers;\n    this._yieldedPromise = null;\n    this._cancellationPhase = false;\n}\nutil.inherits(PromiseSpawn, Proxyable);\n\nPromiseSpawn.prototype._isResolved = function() {\n    return this._promise === null;\n};\n\nPromiseSpawn.prototype._cleanup = function() {\n    this._promise = this._generator = null;\n    if (debug.cancellation() && this._finallyPromise !== null) {\n        this._finallyPromise._fulfill();\n        this._finallyPromise = null;\n    }\n};\n\nPromiseSpawn.prototype._promiseCancelled = function() {\n    if (this._isResolved()) return;\n    var implementsReturn = typeof this._generator[\"return\"] !== \"undefined\";\n\n    var result;\n    if (!implementsReturn) {\n        var reason = new Promise.CancellationError(\n            \"generator .return() sentinel\");\n        Promise.coroutine.returnSentinel = reason;\n        this._promise._attachExtraTrace(reason);\n        this._promise._pushContext();\n        result = tryCatch(this._generator[\"throw\"]).call(this._generator,\n                                                         reason);\n        this._promise._popContext();\n    } else {\n        this._promise._pushContext();\n        result = tryCatch(this._generator[\"return\"]).call(this._generator,\n                                                          undefined);\n        this._promise._popContext();\n    }\n    this._cancellationPhase = true;\n    this._yieldedPromise = null;\n    this._continue(result);\n};\n\nPromiseSpawn.prototype._promiseFulfilled = function(value) {\n    this._yieldedPromise = null;\n    this._promise._pushContext();\n    var result = tryCatch(this._generator.next).call(this._generator, value);\n    this._promise._popContext();\n    this._continue(result);\n};\n\nPromiseSpawn.prototype._promiseRejected = function(reason) {\n    this._yieldedPromise = null;\n    this._promise._attachExtraTrace(reason);\n    this._promise._pushContext();\n    var result = tryCatch(this._generator[\"throw\"])\n        .call(this._generator, reason);\n    this._promise._popContext();\n    this._continue(result);\n};\n\nPromiseSpawn.prototype._resultCancelled = function() {\n    if (this._yieldedPromise instanceof Promise) {\n        var promise = this._yieldedPromise;\n        this._yieldedPromise = null;\n        promise.cancel();\n    }\n};\n\nPromiseSpawn.prototype.promise = function () {\n    return this._promise;\n};\n\nPromiseSpawn.prototype._run = function () {\n    this._generator = this._generatorFunction.call(this._receiver);\n    this._receiver =\n        this._generatorFunction = undefined;\n    this._promiseFulfilled(undefined);\n};\n\nPromiseSpawn.prototype._continue = function (result) {\n    var promise = this._promise;\n    if (result === errorObj) {\n        this._cleanup();\n        if (this._cancellationPhase) {\n            return promise.cancel();\n        } else {\n            return promise._rejectCallback(result.e, false);\n        }\n    }\n\n    var value = result.value;\n    if (result.done === true) {\n        this._cleanup();\n        if (this._cancellationPhase) {\n            return promise.cancel();\n        } else {\n            return promise._resolveCallback(value);\n        }\n    } else {\n        var maybePromise = tryConvertToPromise(value, this._promise);\n        if (!(maybePromise instanceof Promise)) {\n            maybePromise =\n                promiseFromYieldHandler(maybePromise,\n                                        this._yieldHandlers,\n                                        this._promise);\n            if (maybePromise === null) {\n                this._promiseRejected(\n                    new TypeError(\n                        \"A value %s was yielded that could not be treated as a promise\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\\u000a\".replace(\"%s\", value) +\n                        \"From coroutine:\\u000a\" +\n                        this._stack.split(\"\\n\").slice(1, -7).join(\"\\n\")\n                    )\n                );\n                return;\n            }\n        }\n        maybePromise = maybePromise._target();\n        var bitField = maybePromise._bitField;\n        ;\n        if (((bitField & 50397184) === 0)) {\n            this._yieldedPromise = maybePromise;\n            maybePromise._proxy(this, null);\n        } else if (((bitField & 33554432) !== 0)) {\n            Promise._async.invoke(\n                this._promiseFulfilled, this, maybePromise._value()\n            );\n        } else if (((bitField & 16777216) !== 0)) {\n            Promise._async.invoke(\n                this._promiseRejected, this, maybePromise._reason()\n            );\n        } else {\n            this._promiseCancelled();\n        }\n    }\n};\n\nPromise.coroutine = function (generatorFunction, options) {\n    if (typeof generatorFunction !== \"function\") {\n        throw new TypeError(\"generatorFunction must be a function\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    var yieldHandler = Object(options).yieldHandler;\n    var PromiseSpawn$ = PromiseSpawn;\n    var stack = new Error().stack;\n    return function () {\n        var generator = generatorFunction.apply(this, arguments);\n        var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler,\n                                      stack);\n        var ret = spawn.promise();\n        spawn._generator = generator;\n        spawn._promiseFulfilled(undefined);\n        return ret;\n    };\n};\n\nPromise.coroutine.addYieldHandler = function(fn) {\n    if (typeof fn !== \"function\") {\n        throw new TypeError(\"expecting a function but got \" + util.classString(fn));\n    }\n    yieldHandlers.push(fn);\n};\n\nPromise.spawn = function (generatorFunction) {\n    debug.deprecated(\"Promise.spawn()\", \"Promise.coroutine()\");\n    if (typeof generatorFunction !== \"function\") {\n        return apiRejection(\"generatorFunction must be a function\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    var spawn = new PromiseSpawn(generatorFunction, this);\n    var ret = spawn.promise();\n    spawn._run(Promise.spawn);\n    return ret;\n};\n};\n\n},{\"./errors\":50,\"./util\":74}],55:[function(require,module,exports){\n\"use strict\";\nmodule.exports =\nfunction(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async,\n         getDomain) {\nvar util = require(\"./util\");\nvar canEvaluate = util.canEvaluate;\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\nvar reject;\n\nif (!false) {\nif (canEvaluate) {\n    var thenCallback = function(i) {\n        return new Function(\"value\", \"holder\", \"                             \\n\\\n            'use strict';                                                    \\n\\\n            holder.pIndex = value;                                           \\n\\\n            holder.checkFulfillment(this);                                   \\n\\\n            \".replace(/Index/g, i));\n    };\n\n    var promiseSetter = function(i) {\n        return new Function(\"promise\", \"holder\", \"                           \\n\\\n            'use strict';                                                    \\n\\\n            holder.pIndex = promise;                                         \\n\\\n            \".replace(/Index/g, i));\n    };\n\n    var generateHolderClass = function(total) {\n        var props = new Array(total);\n        for (var i = 0; i < props.length; ++i) {\n            props[i] = \"this.p\" + (i+1);\n        }\n        var assignment = props.join(\" = \") + \" = null;\";\n        var cancellationCode= \"var promise;\\n\" + props.map(function(prop) {\n            return \"                                                         \\n\\\n                promise = \" + prop + \";                                      \\n\\\n                if (promise instanceof Promise) {                            \\n\\\n                    promise.cancel();                                        \\n\\\n                }                                                            \\n\\\n            \";\n        }).join(\"\\n\");\n        var passedArguments = props.join(\", \");\n        var name = \"Holder$\" + total;\n\n\n        var code = \"return function(tryCatch, errorObj, Promise, async) {    \\n\\\n            'use strict';                                                    \\n\\\n            function [TheName](fn) {                                         \\n\\\n                [TheProperties]                                              \\n\\\n                this.fn = fn;                                                \\n\\\n                this.asyncNeeded = true;                                     \\n\\\n                this.now = 0;                                                \\n\\\n            }                                                                \\n\\\n                                                                             \\n\\\n            [TheName].prototype._callFunction = function(promise) {          \\n\\\n                promise._pushContext();                                      \\n\\\n                var ret = tryCatch(this.fn)([ThePassedArguments]);           \\n\\\n                promise._popContext();                                       \\n\\\n                if (ret === errorObj) {                                      \\n\\\n                    promise._rejectCallback(ret.e, false);                   \\n\\\n                } else {                                                     \\n\\\n                    promise._resolveCallback(ret);                           \\n\\\n                }                                                            \\n\\\n            };                                                               \\n\\\n                                                                             \\n\\\n            [TheName].prototype.checkFulfillment = function(promise) {       \\n\\\n                var now = ++this.now;                                        \\n\\\n                if (now === [TheTotal]) {                                    \\n\\\n                    if (this.asyncNeeded) {                                  \\n\\\n                        async.invoke(this._callFunction, this, promise);     \\n\\\n                    } else {                                                 \\n\\\n                        this._callFunction(promise);                         \\n\\\n                    }                                                        \\n\\\n                                                                             \\n\\\n                }                                                            \\n\\\n            };                                                               \\n\\\n                                                                             \\n\\\n            [TheName].prototype._resultCancelled = function() {              \\n\\\n                [CancellationCode]                                           \\n\\\n            };                                                               \\n\\\n                                                                             \\n\\\n            return [TheName];                                                \\n\\\n        }(tryCatch, errorObj, Promise, async);                               \\n\\\n        \";\n\n        code = code.replace(/\\[TheName\\]/g, name)\n            .replace(/\\[TheTotal\\]/g, total)\n            .replace(/\\[ThePassedArguments\\]/g, passedArguments)\n            .replace(/\\[TheProperties\\]/g, assignment)\n            .replace(/\\[CancellationCode\\]/g, cancellationCode);\n\n        return new Function(\"tryCatch\", \"errorObj\", \"Promise\", \"async\", code)\n                           (tryCatch, errorObj, Promise, async);\n    };\n\n    var holderClasses = [];\n    var thenCallbacks = [];\n    var promiseSetters = [];\n\n    for (var i = 0; i < 8; ++i) {\n        holderClasses.push(generateHolderClass(i + 1));\n        thenCallbacks.push(thenCallback(i + 1));\n        promiseSetters.push(promiseSetter(i + 1));\n    }\n\n    reject = function (reason) {\n        this._reject(reason);\n    };\n}}\n\nPromise.join = function () {\n    var last = arguments.length - 1;\n    var fn;\n    if (last > 0 && typeof arguments[last] === \"function\") {\n        fn = arguments[last];\n        if (!false) {\n            if (last <= 8 && canEvaluate) {\n                var ret = new Promise(INTERNAL);\n                ret._captureStackTrace();\n                var HolderClass = holderClasses[last - 1];\n                var holder = new HolderClass(fn);\n                var callbacks = thenCallbacks;\n\n                for (var i = 0; i < last; ++i) {\n                    var maybePromise = tryConvertToPromise(arguments[i], ret);\n                    if (maybePromise instanceof Promise) {\n                        maybePromise = maybePromise._target();\n                        var bitField = maybePromise._bitField;\n                        ;\n                        if (((bitField & 50397184) === 0)) {\n                            maybePromise._then(callbacks[i], reject,\n                                               undefined, ret, holder);\n                            promiseSetters[i](maybePromise, holder);\n                            holder.asyncNeeded = false;\n                        } else if (((bitField & 33554432) !== 0)) {\n                            callbacks[i].call(ret,\n                                              maybePromise._value(), holder);\n                        } else if (((bitField & 16777216) !== 0)) {\n                            ret._reject(maybePromise._reason());\n                        } else {\n                            ret._cancel();\n                        }\n                    } else {\n                        callbacks[i].call(ret, maybePromise, holder);\n                    }\n                }\n\n                if (!ret._isFateSealed()) {\n                    if (holder.asyncNeeded) {\n                        var domain = getDomain();\n                        if (domain !== null) {\n                            holder.fn = util.domainBind(domain, holder.fn);\n                        }\n                    }\n                    ret._setAsyncGuaranteed();\n                    ret._setOnCancel(holder);\n                }\n                return ret;\n            }\n        }\n    }\n    var $_len = arguments.length;var args = new Array($_len); for(var $_i = 0; $_i < $_len; ++$_i) {args[$_i] = arguments[$_i];};\n    if (fn) args.pop();\n    var ret = new PromiseArray(args).promise();\n    return fn !== undefined ? ret.spread(fn) : ret;\n};\n\n};\n\n},{\"./util\":74}],56:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise,\n                          PromiseArray,\n                          apiRejection,\n                          tryConvertToPromise,\n                          INTERNAL,\n                          debug) {\nvar getDomain = Promise._getDomain;\nvar util = require(\"./util\");\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\nvar async = Promise._async;\n\nfunction MappingPromiseArray(promises, fn, limit, _filter) {\n    this.constructor$(promises);\n    this._promise._captureStackTrace();\n    var domain = getDomain();\n    this._callback = domain === null ? fn : util.domainBind(domain, fn);\n    this._preservedValues = _filter === INTERNAL\n        ? new Array(this.length())\n        : null;\n    this._limit = limit;\n    this._inFlight = 0;\n    this._queue = [];\n    async.invoke(this._asyncInit, this, undefined);\n}\nutil.inherits(MappingPromiseArray, PromiseArray);\n\nMappingPromiseArray.prototype._asyncInit = function() {\n    this._init$(undefined, -2);\n};\n\nMappingPromiseArray.prototype._init = function () {};\n\nMappingPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    var values = this._values;\n    var length = this.length();\n    var preservedValues = this._preservedValues;\n    var limit = this._limit;\n\n    if (index < 0) {\n        index = (index * -1) - 1;\n        values[index] = value;\n        if (limit >= 1) {\n            this._inFlight--;\n            this._drainQueue();\n            if (this._isResolved()) return true;\n        }\n    } else {\n        if (limit >= 1 && this._inFlight >= limit) {\n            values[index] = value;\n            this._queue.push(index);\n            return false;\n        }\n        if (preservedValues !== null) preservedValues[index] = value;\n\n        var promise = this._promise;\n        var callback = this._callback;\n        var receiver = promise._boundValue();\n        promise._pushContext();\n        var ret = tryCatch(callback).call(receiver, value, index, length);\n        var promiseCreated = promise._popContext();\n        debug.checkForgottenReturns(\n            ret,\n            promiseCreated,\n            preservedValues !== null ? \"Promise.filter\" : \"Promise.map\",\n            promise\n        );\n        if (ret === errorObj) {\n            this._reject(ret.e);\n            return true;\n        }\n\n        var maybePromise = tryConvertToPromise(ret, this._promise);\n        if (maybePromise instanceof Promise) {\n            maybePromise = maybePromise._target();\n            var bitField = maybePromise._bitField;\n            ;\n            if (((bitField & 50397184) === 0)) {\n                if (limit >= 1) this._inFlight++;\n                values[index] = maybePromise;\n                maybePromise._proxy(this, (index + 1) * -1);\n                return false;\n            } else if (((bitField & 33554432) !== 0)) {\n                ret = maybePromise._value();\n            } else if (((bitField & 16777216) !== 0)) {\n                this._reject(maybePromise._reason());\n                return true;\n            } else {\n                this._cancel();\n                return true;\n            }\n        }\n        values[index] = ret;\n    }\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= length) {\n        if (preservedValues !== null) {\n            this._filter(values, preservedValues);\n        } else {\n            this._resolve(values);\n        }\n        return true;\n    }\n    return false;\n};\n\nMappingPromiseArray.prototype._drainQueue = function () {\n    var queue = this._queue;\n    var limit = this._limit;\n    var values = this._values;\n    while (queue.length > 0 && this._inFlight < limit) {\n        if (this._isResolved()) return;\n        var index = queue.pop();\n        this._promiseFulfilled(values[index], index);\n    }\n};\n\nMappingPromiseArray.prototype._filter = function (booleans, values) {\n    var len = values.length;\n    var ret = new Array(len);\n    var j = 0;\n    for (var i = 0; i < len; ++i) {\n        if (booleans[i]) ret[j++] = values[i];\n    }\n    ret.length = j;\n    this._resolve(ret);\n};\n\nMappingPromiseArray.prototype.preservedValues = function () {\n    return this._preservedValues;\n};\n\nfunction map(promises, fn, options, _filter) {\n    if (typeof fn !== \"function\") {\n        return apiRejection(\"expecting a function but got \" + util.classString(fn));\n    }\n\n    var limit = 0;\n    if (options !== undefined) {\n        if (typeof options === \"object\" && options !== null) {\n            if (typeof options.concurrency !== \"number\") {\n                return Promise.reject(\n                    new TypeError(\"'concurrency' must be a number but it is \" +\n                                    util.classString(options.concurrency)));\n            }\n            limit = options.concurrency;\n        } else {\n            return Promise.reject(new TypeError(\n                            \"options argument must be an object but it is \" +\n                             util.classString(options)));\n        }\n    }\n    limit = typeof limit === \"number\" &&\n        isFinite(limit) && limit >= 1 ? limit : 0;\n    return new MappingPromiseArray(promises, fn, limit, _filter).promise();\n}\n\nPromise.prototype.map = function (fn, options) {\n    return map(this, fn, options, null);\n};\n\nPromise.map = function (promises, fn, options, _filter) {\n    return map(promises, fn, options, _filter);\n};\n\n\n};\n\n},{\"./util\":74}],57:[function(require,module,exports){\n\"use strict\";\nmodule.exports =\nfunction(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) {\nvar util = require(\"./util\");\nvar tryCatch = util.tryCatch;\n\nPromise.method = function (fn) {\n    if (typeof fn !== \"function\") {\n        throw new Promise.TypeError(\"expecting a function but got \" + util.classString(fn));\n    }\n    return function () {\n        var ret = new Promise(INTERNAL);\n        ret._captureStackTrace();\n        ret._pushContext();\n        var value = tryCatch(fn).apply(this, arguments);\n        var promiseCreated = ret._popContext();\n        debug.checkForgottenReturns(\n            value, promiseCreated, \"Promise.method\", ret);\n        ret._resolveFromSyncValue(value);\n        return ret;\n    };\n};\n\nPromise.attempt = Promise[\"try\"] = function (fn) {\n    if (typeof fn !== \"function\") {\n        return apiRejection(\"expecting a function but got \" + util.classString(fn));\n    }\n    var ret = new Promise(INTERNAL);\n    ret._captureStackTrace();\n    ret._pushContext();\n    var value;\n    if (arguments.length > 1) {\n        debug.deprecated(\"calling Promise.try with more than 1 argument\");\n        var arg = arguments[1];\n        var ctx = arguments[2];\n        value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg)\n                                  : tryCatch(fn).call(ctx, arg);\n    } else {\n        value = tryCatch(fn)();\n    }\n    var promiseCreated = ret._popContext();\n    debug.checkForgottenReturns(\n        value, promiseCreated, \"Promise.try\", ret);\n    ret._resolveFromSyncValue(value);\n    return ret;\n};\n\nPromise.prototype._resolveFromSyncValue = function (value) {\n    if (value === util.errorObj) {\n        this._rejectCallback(value.e, false);\n    } else {\n        this._resolveCallback(value, true);\n    }\n};\n};\n\n},{\"./util\":74}],58:[function(require,module,exports){\n\"use strict\";\nvar util = require(\"./util\");\nvar maybeWrapAsError = util.maybeWrapAsError;\nvar errors = require(\"./errors\");\nvar OperationalError = errors.OperationalError;\nvar es5 = require(\"./es5\");\n\nfunction isUntypedError(obj) {\n    return obj instanceof Error &&\n        es5.getPrototypeOf(obj) === Error.prototype;\n}\n\nvar rErrorKey = /^(?:name|message|stack|cause)$/;\nfunction wrapAsOperationalError(obj) {\n    var ret;\n    if (isUntypedError(obj)) {\n        ret = new OperationalError(obj);\n        ret.name = obj.name;\n        ret.message = obj.message;\n        ret.stack = obj.stack;\n        var keys = es5.keys(obj);\n        for (var i = 0; i < keys.length; ++i) {\n            var key = keys[i];\n            if (!rErrorKey.test(key)) {\n                ret[key] = obj[key];\n            }\n        }\n        return ret;\n    }\n    util.markAsOriginatingFromRejection(obj);\n    return obj;\n}\n\nfunction nodebackForPromise(promise, multiArgs) {\n    return function(err, value) {\n        if (promise === null) return;\n        if (err) {\n            var wrapped = wrapAsOperationalError(maybeWrapAsError(err));\n            promise._attachExtraTrace(wrapped);\n            promise._reject(wrapped);\n        } else if (!multiArgs) {\n            promise._fulfill(value);\n        } else {\n            var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};\n            promise._fulfill(args);\n        }\n        promise = null;\n    };\n}\n\nmodule.exports = nodebackForPromise;\n\n},{\"./errors\":50,\"./es5\":51,\"./util\":74}],59:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nvar util = require(\"./util\");\nvar async = Promise._async;\nvar tryCatch = util.tryCatch;\nvar errorObj = util.errorObj;\n\nfunction spreadAdapter(val, nodeback) {\n    var promise = this;\n    if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback);\n    var ret =\n        tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val));\n    if (ret === errorObj) {\n        async.throwLater(ret.e);\n    }\n}\n\nfunction successAdapter(val, nodeback) {\n    var promise = this;\n    var receiver = promise._boundValue();\n    var ret = val === undefined\n        ? tryCatch(nodeback).call(receiver, null)\n        : tryCatch(nodeback).call(receiver, null, val);\n    if (ret === errorObj) {\n        async.throwLater(ret.e);\n    }\n}\nfunction errorAdapter(reason, nodeback) {\n    var promise = this;\n    if (!reason) {\n        var newReason = new Error(reason + \"\");\n        newReason.cause = reason;\n        reason = newReason;\n    }\n    var ret = tryCatch(nodeback).call(promise._boundValue(), reason);\n    if (ret === errorObj) {\n        async.throwLater(ret.e);\n    }\n}\n\nPromise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback,\n                                                                     options) {\n    if (typeof nodeback == \"function\") {\n        var adapter = successAdapter;\n        if (options !== undefined && Object(options).spread) {\n            adapter = spreadAdapter;\n        }\n        this._then(\n            adapter,\n            errorAdapter,\n            undefined,\n            this,\n            nodeback\n        );\n    }\n    return this;\n};\n};\n\n},{\"./util\":74}],60:[function(require,module,exports){\n(function (process){\n\"use strict\";\nmodule.exports = function() {\nvar makeSelfResolutionError = function () {\n    return new TypeError(\"circular promise resolution chain\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n};\nvar reflectHandler = function() {\n    return new Promise.PromiseInspection(this._target());\n};\nvar apiRejection = function(msg) {\n    return Promise.reject(new TypeError(msg));\n};\nfunction Proxyable() {}\nvar UNDEFINED_BINDING = {};\nvar util = require(\"./util\");\n\nvar getDomain;\nif (util.isNode) {\n    getDomain = function() {\n        var ret = process.domain;\n        if (ret === undefined) ret = null;\n        return ret;\n    };\n} else {\n    getDomain = function() {\n        return null;\n    };\n}\nutil.notEnumerableProp(Promise, \"_getDomain\", getDomain);\n\nvar es5 = require(\"./es5\");\nvar Async = require(\"./async\");\nvar async = new Async();\nes5.defineProperty(Promise, \"_async\", {value: async});\nvar errors = require(\"./errors\");\nvar TypeError = Promise.TypeError = errors.TypeError;\nPromise.RangeError = errors.RangeError;\nvar CancellationError = Promise.CancellationError = errors.CancellationError;\nPromise.TimeoutError = errors.TimeoutError;\nPromise.OperationalError = errors.OperationalError;\nPromise.RejectionError = errors.OperationalError;\nPromise.AggregateError = errors.AggregateError;\nvar INTERNAL = function(){};\nvar APPLY = {};\nvar NEXT_FILTER = {};\nvar tryConvertToPromise = require(\"./thenables\")(Promise, INTERNAL);\nvar PromiseArray =\n    require(\"./promise_array\")(Promise, INTERNAL,\n                               tryConvertToPromise, apiRejection, Proxyable);\nvar Context = require(\"./context\")(Promise);\n /*jshint unused:false*/\nvar createContext = Context.create;\nvar debug = require(\"./debuggability\")(Promise, Context);\nvar CapturedTrace = debug.CapturedTrace;\nvar PassThroughHandlerContext =\n    require(\"./finally\")(Promise, tryConvertToPromise);\nvar catchFilter = require(\"./catch_filter\")(NEXT_FILTER);\nvar nodebackForPromise = require(\"./nodeback\");\nvar errorObj = util.errorObj;\nvar tryCatch = util.tryCatch;\nfunction check(self, executor) {\n    if (typeof executor !== \"function\") {\n        throw new TypeError(\"expecting a function but got \" + util.classString(executor));\n    }\n    if (self.constructor !== Promise) {\n        throw new TypeError(\"the promise constructor cannot be invoked directly\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n}\n\nfunction Promise(executor) {\n    this._bitField = 0;\n    this._fulfillmentHandler0 = undefined;\n    this._rejectionHandler0 = undefined;\n    this._promise0 = undefined;\n    this._receiver0 = undefined;\n    if (executor !== INTERNAL) {\n        check(this, executor);\n        this._resolveFromExecutor(executor);\n    }\n    this._promiseCreated();\n    this._fireEvent(\"promiseCreated\", this);\n}\n\nPromise.prototype.toString = function () {\n    return \"[object Promise]\";\n};\n\nPromise.prototype.caught = Promise.prototype[\"catch\"] = function (fn) {\n    var len = arguments.length;\n    if (len > 1) {\n        var catchInstances = new Array(len - 1),\n            j = 0, i;\n        for (i = 0; i < len - 1; ++i) {\n            var item = arguments[i];\n            if (util.isObject(item)) {\n                catchInstances[j++] = item;\n            } else {\n                return apiRejection(\"expecting an object but got \" +\n                    \"A catch statement predicate \" + util.classString(item));\n            }\n        }\n        catchInstances.length = j;\n        fn = arguments[i];\n        return this.then(undefined, catchFilter(catchInstances, fn, this));\n    }\n    return this.then(undefined, fn);\n};\n\nPromise.prototype.reflect = function () {\n    return this._then(reflectHandler,\n        reflectHandler, undefined, this, undefined);\n};\n\nPromise.prototype.then = function (didFulfill, didReject) {\n    if (debug.warnings() && arguments.length > 0 &&\n        typeof didFulfill !== \"function\" &&\n        typeof didReject !== \"function\") {\n        var msg = \".then() only accepts functions but was passed: \" +\n                util.classString(didFulfill);\n        if (arguments.length > 1) {\n            msg += \", \" + util.classString(didReject);\n        }\n        this._warn(msg);\n    }\n    return this._then(didFulfill, didReject, undefined, undefined, undefined);\n};\n\nPromise.prototype.done = function (didFulfill, didReject) {\n    var promise =\n        this._then(didFulfill, didReject, undefined, undefined, undefined);\n    promise._setIsFinal();\n};\n\nPromise.prototype.spread = function (fn) {\n    if (typeof fn !== \"function\") {\n        return apiRejection(\"expecting a function but got \" + util.classString(fn));\n    }\n    return this.all()._then(fn, undefined, undefined, APPLY, undefined);\n};\n\nPromise.prototype.toJSON = function () {\n    var ret = {\n        isFulfilled: false,\n        isRejected: false,\n        fulfillmentValue: undefined,\n        rejectionReason: undefined\n    };\n    if (this.isFulfilled()) {\n        ret.fulfillmentValue = this.value();\n        ret.isFulfilled = true;\n    } else if (this.isRejected()) {\n        ret.rejectionReason = this.reason();\n        ret.isRejected = true;\n    }\n    return ret;\n};\n\nPromise.prototype.all = function () {\n    if (arguments.length > 0) {\n        this._warn(\".all() was passed arguments but it does not take any\");\n    }\n    return new PromiseArray(this).promise();\n};\n\nPromise.prototype.error = function (fn) {\n    return this.caught(util.originatesFromRejection, fn);\n};\n\nPromise.getNewLibraryCopy = module.exports;\n\nPromise.is = function (val) {\n    return val instanceof Promise;\n};\n\nPromise.fromNode = Promise.fromCallback = function(fn) {\n    var ret = new Promise(INTERNAL);\n    ret._captureStackTrace();\n    var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs\n                                         : false;\n    var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs));\n    if (result === errorObj) {\n        ret._rejectCallback(result.e, true);\n    }\n    if (!ret._isFateSealed()) ret._setAsyncGuaranteed();\n    return ret;\n};\n\nPromise.all = function (promises) {\n    return new PromiseArray(promises).promise();\n};\n\nPromise.cast = function (obj) {\n    var ret = tryConvertToPromise(obj);\n    if (!(ret instanceof Promise)) {\n        ret = new Promise(INTERNAL);\n        ret._captureStackTrace();\n        ret._setFulfilled();\n        ret._rejectionHandler0 = obj;\n    }\n    return ret;\n};\n\nPromise.resolve = Promise.fulfilled = Promise.cast;\n\nPromise.reject = Promise.rejected = function (reason) {\n    var ret = new Promise(INTERNAL);\n    ret._captureStackTrace();\n    ret._rejectCallback(reason, true);\n    return ret;\n};\n\nPromise.setScheduler = function(fn) {\n    if (typeof fn !== \"function\") {\n        throw new TypeError(\"expecting a function but got \" + util.classString(fn));\n    }\n    return async.setScheduler(fn);\n};\n\nPromise.prototype._then = function (\n    didFulfill,\n    didReject,\n    _,    receiver,\n    internalData\n) {\n    var haveInternalData = internalData !== undefined;\n    var promise = haveInternalData ? internalData : new Promise(INTERNAL);\n    var target = this._target();\n    var bitField = target._bitField;\n\n    if (!haveInternalData) {\n        promise._propagateFrom(this, 3);\n        promise._captureStackTrace();\n        if (receiver === undefined &&\n            ((this._bitField & 2097152) !== 0)) {\n            if (!((bitField & 50397184) === 0)) {\n                receiver = this._boundValue();\n            } else {\n                receiver = target === this ? undefined : this._boundTo;\n            }\n        }\n        this._fireEvent(\"promiseChained\", this, promise);\n    }\n\n    var domain = getDomain();\n    if (!((bitField & 50397184) === 0)) {\n        var handler, value, settler = target._settlePromiseCtx;\n        if (((bitField & 33554432) !== 0)) {\n            value = target._rejectionHandler0;\n            handler = didFulfill;\n        } else if (((bitField & 16777216) !== 0)) {\n            value = target._fulfillmentHandler0;\n            handler = didReject;\n            target._unsetRejectionIsUnhandled();\n        } else {\n            settler = target._settlePromiseLateCancellationObserver;\n            value = new CancellationError(\"late cancellation observer\");\n            target._attachExtraTrace(value);\n            handler = didReject;\n        }\n\n        async.invoke(settler, target, {\n            handler: domain === null ? handler\n                : (typeof handler === \"function\" &&\n                    util.domainBind(domain, handler)),\n            promise: promise,\n            receiver: receiver,\n            value: value\n        });\n    } else {\n        target._addCallbacks(didFulfill, didReject, promise, receiver, domain);\n    }\n\n    return promise;\n};\n\nPromise.prototype._length = function () {\n    return this._bitField & 65535;\n};\n\nPromise.prototype._isFateSealed = function () {\n    return (this._bitField & 117506048) !== 0;\n};\n\nPromise.prototype._isFollowing = function () {\n    return (this._bitField & 67108864) === 67108864;\n};\n\nPromise.prototype._setLength = function (len) {\n    this._bitField = (this._bitField & -65536) |\n        (len & 65535);\n};\n\nPromise.prototype._setFulfilled = function () {\n    this._bitField = this._bitField | 33554432;\n    this._fireEvent(\"promiseFulfilled\", this);\n};\n\nPromise.prototype._setRejected = function () {\n    this._bitField = this._bitField | 16777216;\n    this._fireEvent(\"promiseRejected\", this);\n};\n\nPromise.prototype._setFollowing = function () {\n    this._bitField = this._bitField | 67108864;\n    this._fireEvent(\"promiseResolved\", this);\n};\n\nPromise.prototype._setIsFinal = function () {\n    this._bitField = this._bitField | 4194304;\n};\n\nPromise.prototype._isFinal = function () {\n    return (this._bitField & 4194304) > 0;\n};\n\nPromise.prototype._unsetCancelled = function() {\n    this._bitField = this._bitField & (~65536);\n};\n\nPromise.prototype._setCancelled = function() {\n    this._bitField = this._bitField | 65536;\n    this._fireEvent(\"promiseCancelled\", this);\n};\n\nPromise.prototype._setWillBeCancelled = function() {\n    this._bitField = this._bitField | 8388608;\n};\n\nPromise.prototype._setAsyncGuaranteed = function() {\n    if (async.hasCustomScheduler()) return;\n    this._bitField = this._bitField | 134217728;\n};\n\nPromise.prototype._receiverAt = function (index) {\n    var ret = index === 0 ? this._receiver0 : this[\n            index * 4 - 4 + 3];\n    if (ret === UNDEFINED_BINDING) {\n        return undefined;\n    } else if (ret === undefined && this._isBound()) {\n        return this._boundValue();\n    }\n    return ret;\n};\n\nPromise.prototype._promiseAt = function (index) {\n    return this[\n            index * 4 - 4 + 2];\n};\n\nPromise.prototype._fulfillmentHandlerAt = function (index) {\n    return this[\n            index * 4 - 4 + 0];\n};\n\nPromise.prototype._rejectionHandlerAt = function (index) {\n    return this[\n            index * 4 - 4 + 1];\n};\n\nPromise.prototype._boundValue = function() {};\n\nPromise.prototype._migrateCallback0 = function (follower) {\n    var bitField = follower._bitField;\n    var fulfill = follower._fulfillmentHandler0;\n    var reject = follower._rejectionHandler0;\n    var promise = follower._promise0;\n    var receiver = follower._receiverAt(0);\n    if (receiver === undefined) receiver = UNDEFINED_BINDING;\n    this._addCallbacks(fulfill, reject, promise, receiver, null);\n};\n\nPromise.prototype._migrateCallbackAt = function (follower, index) {\n    var fulfill = follower._fulfillmentHandlerAt(index);\n    var reject = follower._rejectionHandlerAt(index);\n    var promise = follower._promiseAt(index);\n    var receiver = follower._receiverAt(index);\n    if (receiver === undefined) receiver = UNDEFINED_BINDING;\n    this._addCallbacks(fulfill, reject, promise, receiver, null);\n};\n\nPromise.prototype._addCallbacks = function (\n    fulfill,\n    reject,\n    promise,\n    receiver,\n    domain\n) {\n    var index = this._length();\n\n    if (index >= 65535 - 4) {\n        index = 0;\n        this._setLength(0);\n    }\n\n    if (index === 0) {\n        this._promise0 = promise;\n        this._receiver0 = receiver;\n        if (typeof fulfill === \"function\") {\n            this._fulfillmentHandler0 =\n                domain === null ? fulfill : util.domainBind(domain, fulfill);\n        }\n        if (typeof reject === \"function\") {\n            this._rejectionHandler0 =\n                domain === null ? reject : util.domainBind(domain, reject);\n        }\n    } else {\n        var base = index * 4 - 4;\n        this[base + 2] = promise;\n        this[base + 3] = receiver;\n        if (typeof fulfill === \"function\") {\n            this[base + 0] =\n                domain === null ? fulfill : util.domainBind(domain, fulfill);\n        }\n        if (typeof reject === \"function\") {\n            this[base + 1] =\n                domain === null ? reject : util.domainBind(domain, reject);\n        }\n    }\n    this._setLength(index + 1);\n    return index;\n};\n\nPromise.prototype._proxy = function (proxyable, arg) {\n    this._addCallbacks(undefined, undefined, arg, proxyable, null);\n};\n\nPromise.prototype._resolveCallback = function(value, shouldBind) {\n    if (((this._bitField & 117506048) !== 0)) return;\n    if (value === this)\n        return this._rejectCallback(makeSelfResolutionError(), false);\n    var maybePromise = tryConvertToPromise(value, this);\n    if (!(maybePromise instanceof Promise)) return this._fulfill(value);\n\n    if (shouldBind) this._propagateFrom(maybePromise, 2);\n\n    var promise = maybePromise._target();\n\n    if (promise === this) {\n        this._reject(makeSelfResolutionError());\n        return;\n    }\n\n    var bitField = promise._bitField;\n    if (((bitField & 50397184) === 0)) {\n        var len = this._length();\n        if (len > 0) promise._migrateCallback0(this);\n        for (var i = 1; i < len; ++i) {\n            promise._migrateCallbackAt(this, i);\n        }\n        this._setFollowing();\n        this._setLength(0);\n        this._setFollowee(promise);\n    } else if (((bitField & 33554432) !== 0)) {\n        this._fulfill(promise._value());\n    } else if (((bitField & 16777216) !== 0)) {\n        this._reject(promise._reason());\n    } else {\n        var reason = new CancellationError(\"late cancellation observer\");\n        promise._attachExtraTrace(reason);\n        this._reject(reason);\n    }\n};\n\nPromise.prototype._rejectCallback =\nfunction(reason, synchronous, ignoreNonErrorWarnings) {\n    var trace = util.ensureErrorObject(reason);\n    var hasStack = trace === reason;\n    if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) {\n        var message = \"a promise was rejected with a non-error: \" +\n            util.classString(reason);\n        this._warn(message, true);\n    }\n    this._attachExtraTrace(trace, synchronous ? hasStack : false);\n    this._reject(reason);\n};\n\nPromise.prototype._resolveFromExecutor = function (executor) {\n    var promise = this;\n    this._captureStackTrace();\n    this._pushContext();\n    var synchronous = true;\n    var r = this._execute(executor, function(value) {\n        promise._resolveCallback(value);\n    }, function (reason) {\n        promise._rejectCallback(reason, synchronous);\n    });\n    synchronous = false;\n    this._popContext();\n\n    if (r !== undefined) {\n        promise._rejectCallback(r, true);\n    }\n};\n\nPromise.prototype._settlePromiseFromHandler = function (\n    handler, receiver, value, promise\n) {\n    var bitField = promise._bitField;\n    if (((bitField & 65536) !== 0)) return;\n    promise._pushContext();\n    var x;\n    if (receiver === APPLY) {\n        if (!value || typeof value.length !== \"number\") {\n            x = errorObj;\n            x.e = new TypeError(\"cannot .spread() a non-array: \" +\n                                    util.classString(value));\n        } else {\n            x = tryCatch(handler).apply(this._boundValue(), value);\n        }\n    } else {\n        x = tryCatch(handler).call(receiver, value);\n    }\n    var promiseCreated = promise._popContext();\n    bitField = promise._bitField;\n    if (((bitField & 65536) !== 0)) return;\n\n    if (x === NEXT_FILTER) {\n        promise._reject(value);\n    } else if (x === errorObj) {\n        promise._rejectCallback(x.e, false);\n    } else {\n        debug.checkForgottenReturns(x, promiseCreated, \"\",  promise, this);\n        promise._resolveCallback(x);\n    }\n};\n\nPromise.prototype._target = function() {\n    var ret = this;\n    while (ret._isFollowing()) ret = ret._followee();\n    return ret;\n};\n\nPromise.prototype._followee = function() {\n    return this._rejectionHandler0;\n};\n\nPromise.prototype._setFollowee = function(promise) {\n    this._rejectionHandler0 = promise;\n};\n\nPromise.prototype._settlePromise = function(promise, handler, receiver, value) {\n    var isPromise = promise instanceof Promise;\n    var bitField = this._bitField;\n    var asyncGuaranteed = ((bitField & 134217728) !== 0);\n    if (((bitField & 65536) !== 0)) {\n        if (isPromise) promise._invokeInternalOnCancel();\n\n        if (receiver instanceof PassThroughHandlerContext &&\n            receiver.isFinallyHandler()) {\n            receiver.cancelPromise = promise;\n            if (tryCatch(handler).call(receiver, value) === errorObj) {\n                promise._reject(errorObj.e);\n            }\n        } else if (handler === reflectHandler) {\n            promise._fulfill(reflectHandler.call(receiver));\n        } else if (receiver instanceof Proxyable) {\n            receiver._promiseCancelled(promise);\n        } else if (isPromise || promise instanceof PromiseArray) {\n            promise._cancel();\n        } else {\n            receiver.cancel();\n        }\n    } else if (typeof handler === \"function\") {\n        if (!isPromise) {\n            handler.call(receiver, value, promise);\n        } else {\n            if (asyncGuaranteed) promise._setAsyncGuaranteed();\n            this._settlePromiseFromHandler(handler, receiver, value, promise);\n        }\n    } else if (receiver instanceof Proxyable) {\n        if (!receiver._isResolved()) {\n            if (((bitField & 33554432) !== 0)) {\n                receiver._promiseFulfilled(value, promise);\n            } else {\n                receiver._promiseRejected(value, promise);\n            }\n        }\n    } else if (isPromise) {\n        if (asyncGuaranteed) promise._setAsyncGuaranteed();\n        if (((bitField & 33554432) !== 0)) {\n            promise._fulfill(value);\n        } else {\n            promise._reject(value);\n        }\n    }\n};\n\nPromise.prototype._settlePromiseLateCancellationObserver = function(ctx) {\n    var handler = ctx.handler;\n    var promise = ctx.promise;\n    var receiver = ctx.receiver;\n    var value = ctx.value;\n    if (typeof handler === \"function\") {\n        if (!(promise instanceof Promise)) {\n            handler.call(receiver, value, promise);\n        } else {\n            this._settlePromiseFromHandler(handler, receiver, value, promise);\n        }\n    } else if (promise instanceof Promise) {\n        promise._reject(value);\n    }\n};\n\nPromise.prototype._settlePromiseCtx = function(ctx) {\n    this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value);\n};\n\nPromise.prototype._settlePromise0 = function(handler, value, bitField) {\n    var promise = this._promise0;\n    var receiver = this._receiverAt(0);\n    this._promise0 = undefined;\n    this._receiver0 = undefined;\n    this._settlePromise(promise, handler, receiver, value);\n};\n\nPromise.prototype._clearCallbackDataAtIndex = function(index) {\n    var base = index * 4 - 4;\n    this[base + 2] =\n    this[base + 3] =\n    this[base + 0] =\n    this[base + 1] = undefined;\n};\n\nPromise.prototype._fulfill = function (value) {\n    var bitField = this._bitField;\n    if (((bitField & 117506048) >>> 16)) return;\n    if (value === this) {\n        var err = makeSelfResolutionError();\n        this._attachExtraTrace(err);\n        return this._reject(err);\n    }\n    this._setFulfilled();\n    this._rejectionHandler0 = value;\n\n    if ((bitField & 65535) > 0) {\n        if (((bitField & 134217728) !== 0)) {\n            this._settlePromises();\n        } else {\n            async.settlePromises(this);\n        }\n    }\n};\n\nPromise.prototype._reject = function (reason) {\n    var bitField = this._bitField;\n    if (((bitField & 117506048) >>> 16)) return;\n    this._setRejected();\n    this._fulfillmentHandler0 = reason;\n\n    if (this._isFinal()) {\n        return async.fatalError(reason, util.isNode);\n    }\n\n    if ((bitField & 65535) > 0) {\n        async.settlePromises(this);\n    } else {\n        this._ensurePossibleRejectionHandled();\n    }\n};\n\nPromise.prototype._fulfillPromises = function (len, value) {\n    for (var i = 1; i < len; i++) {\n        var handler = this._fulfillmentHandlerAt(i);\n        var promise = this._promiseAt(i);\n        var receiver = this._receiverAt(i);\n        this._clearCallbackDataAtIndex(i);\n        this._settlePromise(promise, handler, receiver, value);\n    }\n};\n\nPromise.prototype._rejectPromises = function (len, reason) {\n    for (var i = 1; i < len; i++) {\n        var handler = this._rejectionHandlerAt(i);\n        var promise = this._promiseAt(i);\n        var receiver = this._receiverAt(i);\n        this._clearCallbackDataAtIndex(i);\n        this._settlePromise(promise, handler, receiver, reason);\n    }\n};\n\nPromise.prototype._settlePromises = function () {\n    var bitField = this._bitField;\n    var len = (bitField & 65535);\n\n    if (len > 0) {\n        if (((bitField & 16842752) !== 0)) {\n            var reason = this._fulfillmentHandler0;\n            this._settlePromise0(this._rejectionHandler0, reason, bitField);\n            this._rejectPromises(len, reason);\n        } else {\n            var value = this._rejectionHandler0;\n            this._settlePromise0(this._fulfillmentHandler0, value, bitField);\n            this._fulfillPromises(len, value);\n        }\n        this._setLength(0);\n    }\n    this._clearCancellationData();\n};\n\nPromise.prototype._settledValue = function() {\n    var bitField = this._bitField;\n    if (((bitField & 33554432) !== 0)) {\n        return this._rejectionHandler0;\n    } else if (((bitField & 16777216) !== 0)) {\n        return this._fulfillmentHandler0;\n    }\n};\n\nfunction deferResolve(v) {this.promise._resolveCallback(v);}\nfunction deferReject(v) {this.promise._rejectCallback(v, false);}\n\nPromise.defer = Promise.pending = function() {\n    debug.deprecated(\"Promise.defer\", \"new Promise\");\n    var promise = new Promise(INTERNAL);\n    return {\n        promise: promise,\n        resolve: deferResolve,\n        reject: deferReject\n    };\n};\n\nutil.notEnumerableProp(Promise,\n                       \"_makeSelfResolutionError\",\n                       makeSelfResolutionError);\n\nrequire(\"./method\")(Promise, INTERNAL, tryConvertToPromise, apiRejection,\n    debug);\nrequire(\"./bind\")(Promise, INTERNAL, tryConvertToPromise, debug);\nrequire(\"./cancel\")(Promise, PromiseArray, apiRejection, debug);\nrequire(\"./direct_resolve\")(Promise);\nrequire(\"./synchronous_inspection\")(Promise);\nrequire(\"./join\")(\n    Promise, PromiseArray, tryConvertToPromise, INTERNAL, async, getDomain);\nPromise.Promise = Promise;\nPromise.version = \"3.4.7\";\nrequire('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);\nrequire('./call_get.js')(Promise);\nrequire('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug);\nrequire('./timers.js')(Promise, INTERNAL, debug);\nrequire('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug);\nrequire('./nodeify.js')(Promise);\nrequire('./promisify.js')(Promise, INTERNAL);\nrequire('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);\nrequire('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);\nrequire('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);\nrequire('./settle.js')(Promise, PromiseArray, debug);\nrequire('./some.js')(Promise, PromiseArray, apiRejection);\nrequire('./filter.js')(Promise, INTERNAL);\nrequire('./each.js')(Promise, INTERNAL);\nrequire('./any.js')(Promise);\n                                                         \n    util.toFastProperties(Promise);                                          \n    util.toFastProperties(Promise.prototype);                                \n    function fillTypes(value) {                                              \n        var p = new Promise(INTERNAL);                                       \n        p._fulfillmentHandler0 = value;                                      \n        p._rejectionHandler0 = value;                                        \n        p._promise0 = value;                                                 \n        p._receiver0 = value;                                                \n    }                                                                        \n    // Complete slack tracking, opt out of field-type tracking and           \n    // stabilize map                                                         \n    fillTypes({a: 1});                                                       \n    fillTypes({b: 2});                                                       \n    fillTypes({c: 3});                                                       \n    fillTypes(1);                                                            \n    fillTypes(function(){});                                                 \n    fillTypes(undefined);                                                    \n    fillTypes(false);                                                        \n    fillTypes(new Promise(INTERNAL));                                        \n    debug.setBounds(Async.firstLineError, util.lastLineError);               \n    return Promise;                                                          \n\n};\n\n}).call(this,require('_process'))\n},{\"./any.js\":40,\"./async\":41,\"./bind\":42,\"./call_get.js\":43,\"./cancel\":44,\"./catch_filter\":45,\"./context\":46,\"./debuggability\":47,\"./direct_resolve\":48,\"./each.js\":49,\"./errors\":50,\"./es5\":51,\"./filter.js\":52,\"./finally\":53,\"./generators.js\":54,\"./join\":55,\"./map.js\":56,\"./method\":57,\"./nodeback\":58,\"./nodeify.js\":59,\"./promise_array\":61,\"./promisify.js\":62,\"./props.js\":63,\"./race.js\":65,\"./reduce.js\":66,\"./settle.js\":68,\"./some.js\":69,\"./synchronous_inspection\":70,\"./thenables\":71,\"./timers.js\":72,\"./using.js\":73,\"./util\":74,\"_process\":138}],61:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL, tryConvertToPromise,\n    apiRejection, Proxyable) {\nvar util = require(\"./util\");\nvar isArray = util.isArray;\n\nfunction toResolutionValue(val) {\n    switch(val) {\n    case -2: return [];\n    case -3: return {};\n    }\n}\n\nfunction PromiseArray(values) {\n    var promise = this._promise = new Promise(INTERNAL);\n    if (values instanceof Promise) {\n        promise._propagateFrom(values, 3);\n    }\n    promise._setOnCancel(this);\n    this._values = values;\n    this._length = 0;\n    this._totalResolved = 0;\n    this._init(undefined, -2);\n}\nutil.inherits(PromiseArray, Proxyable);\n\nPromiseArray.prototype.length = function () {\n    return this._length;\n};\n\nPromiseArray.prototype.promise = function () {\n    return this._promise;\n};\n\nPromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {\n    var values = tryConvertToPromise(this._values, this._promise);\n    if (values instanceof Promise) {\n        values = values._target();\n        var bitField = values._bitField;\n        ;\n        this._values = values;\n\n        if (((bitField & 50397184) === 0)) {\n            this._promise._setAsyncGuaranteed();\n            return values._then(\n                init,\n                this._reject,\n                undefined,\n                this,\n                resolveValueIfEmpty\n           );\n        } else if (((bitField & 33554432) !== 0)) {\n            values = values._value();\n        } else if (((bitField & 16777216) !== 0)) {\n            return this._reject(values._reason());\n        } else {\n            return this._cancel();\n        }\n    }\n    values = util.asArray(values);\n    if (values === null) {\n        var err = apiRejection(\n            \"expecting an array or an iterable object but got \" + util.classString(values)).reason();\n        this._promise._rejectCallback(err, false);\n        return;\n    }\n\n    if (values.length === 0) {\n        if (resolveValueIfEmpty === -5) {\n            this._resolveEmptyArray();\n        }\n        else {\n            this._resolve(toResolutionValue(resolveValueIfEmpty));\n        }\n        return;\n    }\n    this._iterate(values);\n};\n\nPromiseArray.prototype._iterate = function(values) {\n    var len = this.getActualLength(values.length);\n    this._length = len;\n    this._values = this.shouldCopyValues() ? new Array(len) : this._values;\n    var result = this._promise;\n    var isResolved = false;\n    var bitField = null;\n    for (var i = 0; i < len; ++i) {\n        var maybePromise = tryConvertToPromise(values[i], result);\n\n        if (maybePromise instanceof Promise) {\n            maybePromise = maybePromise._target();\n            bitField = maybePromise._bitField;\n        } else {\n            bitField = null;\n        }\n\n        if (isResolved) {\n            if (bitField !== null) {\n                maybePromise.suppressUnhandledRejections();\n            }\n        } else if (bitField !== null) {\n            if (((bitField & 50397184) === 0)) {\n                maybePromise._proxy(this, i);\n                this._values[i] = maybePromise;\n            } else if (((bitField & 33554432) !== 0)) {\n                isResolved = this._promiseFulfilled(maybePromise._value(), i);\n            } else if (((bitField & 16777216) !== 0)) {\n                isResolved = this._promiseRejected(maybePromise._reason(), i);\n            } else {\n                isResolved = this._promiseCancelled(i);\n            }\n        } else {\n            isResolved = this._promiseFulfilled(maybePromise, i);\n        }\n    }\n    if (!isResolved) result._setAsyncGuaranteed();\n};\n\nPromiseArray.prototype._isResolved = function () {\n    return this._values === null;\n};\n\nPromiseArray.prototype._resolve = function (value) {\n    this._values = null;\n    this._promise._fulfill(value);\n};\n\nPromiseArray.prototype._cancel = function() {\n    if (this._isResolved() || !this._promise._isCancellable()) return;\n    this._values = null;\n    this._promise._cancel();\n};\n\nPromiseArray.prototype._reject = function (reason) {\n    this._values = null;\n    this._promise._rejectCallback(reason, false);\n};\n\nPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    this._values[index] = value;\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= this._length) {\n        this._resolve(this._values);\n        return true;\n    }\n    return false;\n};\n\nPromiseArray.prototype._promiseCancelled = function() {\n    this._cancel();\n    return true;\n};\n\nPromiseArray.prototype._promiseRejected = function (reason) {\n    this._totalResolved++;\n    this._reject(reason);\n    return true;\n};\n\nPromiseArray.prototype._resultCancelled = function() {\n    if (this._isResolved()) return;\n    var values = this._values;\n    this._cancel();\n    if (values instanceof Promise) {\n        values.cancel();\n    } else {\n        for (var i = 0; i < values.length; ++i) {\n            if (values[i] instanceof Promise) {\n                values[i].cancel();\n            }\n        }\n    }\n};\n\nPromiseArray.prototype.shouldCopyValues = function () {\n    return true;\n};\n\nPromiseArray.prototype.getActualLength = function (len) {\n    return len;\n};\n\nreturn PromiseArray;\n};\n\n},{\"./util\":74}],62:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar THIS = {};\nvar util = require(\"./util\");\nvar nodebackForPromise = require(\"./nodeback\");\nvar withAppended = util.withAppended;\nvar maybeWrapAsError = util.maybeWrapAsError;\nvar canEvaluate = util.canEvaluate;\nvar TypeError = require(\"./errors\").TypeError;\nvar defaultSuffix = \"Async\";\nvar defaultPromisified = {__isPromisified__: true};\nvar noCopyProps = [\n    \"arity\",    \"length\",\n    \"name\",\n    \"arguments\",\n    \"caller\",\n    \"callee\",\n    \"prototype\",\n    \"__isPromisified__\"\n];\nvar noCopyPropsPattern = new RegExp(\"^(?:\" + noCopyProps.join(\"|\") + \")$\");\n\nvar defaultFilter = function(name) {\n    return util.isIdentifier(name) &&\n        name.charAt(0) !== \"_\" &&\n        name !== \"constructor\";\n};\n\nfunction propsFilter(key) {\n    return !noCopyPropsPattern.test(key);\n}\n\nfunction isPromisified(fn) {\n    try {\n        return fn.__isPromisified__ === true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n\nfunction hasPromisified(obj, key, suffix) {\n    var val = util.getDataPropertyOrDefault(obj, key + suffix,\n                                            defaultPromisified);\n    return val ? isPromisified(val) : false;\n}\nfunction checkValid(ret, suffix, suffixRegexp) {\n    for (var i = 0; i < ret.length; i += 2) {\n        var key = ret[i];\n        if (suffixRegexp.test(key)) {\n            var keyWithoutAsyncSuffix = key.replace(suffixRegexp, \"\");\n            for (var j = 0; j < ret.length; j += 2) {\n                if (ret[j] === keyWithoutAsyncSuffix) {\n                    throw new TypeError(\"Cannot promisify an API that has normal methods with '%s'-suffix\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\"\n                        .replace(\"%s\", suffix));\n                }\n            }\n        }\n    }\n}\n\nfunction promisifiableMethods(obj, suffix, suffixRegexp, filter) {\n    var keys = util.inheritedDataKeys(obj);\n    var ret = [];\n    for (var i = 0; i < keys.length; ++i) {\n        var key = keys[i];\n        var value = obj[key];\n        var passesDefaultFilter = filter === defaultFilter\n            ? true : defaultFilter(key, value, obj);\n        if (typeof value === \"function\" &&\n            !isPromisified(value) &&\n            !hasPromisified(obj, key, suffix) &&\n            filter(key, value, obj, passesDefaultFilter)) {\n            ret.push(key, value);\n        }\n    }\n    checkValid(ret, suffix, suffixRegexp);\n    return ret;\n}\n\nvar escapeIdentRegex = function(str) {\n    return str.replace(/([$])/, \"\\\\$\");\n};\n\nvar makeNodePromisifiedEval;\nif (!false) {\nvar switchCaseArgumentOrder = function(likelyArgumentCount) {\n    var ret = [likelyArgumentCount];\n    var min = Math.max(0, likelyArgumentCount - 1 - 3);\n    for(var i = likelyArgumentCount - 1; i >= min; --i) {\n        ret.push(i);\n    }\n    for(var i = likelyArgumentCount + 1; i <= 3; ++i) {\n        ret.push(i);\n    }\n    return ret;\n};\n\nvar argumentSequence = function(argumentCount) {\n    return util.filledRange(argumentCount, \"_arg\", \"\");\n};\n\nvar parameterDeclaration = function(parameterCount) {\n    return util.filledRange(\n        Math.max(parameterCount, 3), \"_arg\", \"\");\n};\n\nvar parameterCount = function(fn) {\n    if (typeof fn.length === \"number\") {\n        return Math.max(Math.min(fn.length, 1023 + 1), 0);\n    }\n    return 0;\n};\n\nmakeNodePromisifiedEval =\nfunction(callback, receiver, originalName, fn, _, multiArgs) {\n    var newParameterCount = Math.max(0, parameterCount(fn) - 1);\n    var argumentOrder = switchCaseArgumentOrder(newParameterCount);\n    var shouldProxyThis = typeof callback === \"string\" || receiver === THIS;\n\n    function generateCallForArgumentCount(count) {\n        var args = argumentSequence(count).join(\", \");\n        var comma = count > 0 ? \", \" : \"\";\n        var ret;\n        if (shouldProxyThis) {\n            ret = \"ret = callback.call(this, {{args}}, nodeback); break;\\n\";\n        } else {\n            ret = receiver === undefined\n                ? \"ret = callback({{args}}, nodeback); break;\\n\"\n                : \"ret = callback.call(receiver, {{args}}, nodeback); break;\\n\";\n        }\n        return ret.replace(\"{{args}}\", args).replace(\", \", comma);\n    }\n\n    function generateArgumentSwitchCase() {\n        var ret = \"\";\n        for (var i = 0; i < argumentOrder.length; ++i) {\n            ret += \"case \" + argumentOrder[i] +\":\" +\n                generateCallForArgumentCount(argumentOrder[i]);\n        }\n\n        ret += \"                                                             \\n\\\n        default:                                                             \\n\\\n            var args = new Array(len + 1);                                   \\n\\\n            var i = 0;                                                       \\n\\\n            for (var i = 0; i < len; ++i) {                                  \\n\\\n               args[i] = arguments[i];                                       \\n\\\n            }                                                                \\n\\\n            args[i] = nodeback;                                              \\n\\\n            [CodeForCall]                                                    \\n\\\n            break;                                                           \\n\\\n        \".replace(\"[CodeForCall]\", (shouldProxyThis\n                                ? \"ret = callback.apply(this, args);\\n\"\n                                : \"ret = callback.apply(receiver, args);\\n\"));\n        return ret;\n    }\n\n    var getFunctionCode = typeof callback === \"string\"\n                                ? (\"this != null ? this['\"+callback+\"'] : fn\")\n                                : \"fn\";\n    var body = \"'use strict';                                                \\n\\\n        var ret = function (Parameters) {                                    \\n\\\n            'use strict';                                                    \\n\\\n            var len = arguments.length;                                      \\n\\\n            var promise = new Promise(INTERNAL);                             \\n\\\n            promise._captureStackTrace();                                    \\n\\\n            var nodeback = nodebackForPromise(promise, \" + multiArgs + \");   \\n\\\n            var ret;                                                         \\n\\\n            var callback = tryCatch([GetFunctionCode]);                      \\n\\\n            switch(len) {                                                    \\n\\\n                [CodeForSwitchCase]                                          \\n\\\n            }                                                                \\n\\\n            if (ret === errorObj) {                                          \\n\\\n                promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\\n\\\n            }                                                                \\n\\\n            if (!promise._isFateSealed()) promise._setAsyncGuaranteed();     \\n\\\n            return promise;                                                  \\n\\\n        };                                                                   \\n\\\n        notEnumerableProp(ret, '__isPromisified__', true);                   \\n\\\n        return ret;                                                          \\n\\\n    \".replace(\"[CodeForSwitchCase]\", generateArgumentSwitchCase())\n        .replace(\"[GetFunctionCode]\", getFunctionCode);\n    body = body.replace(\"Parameters\", parameterDeclaration(newParameterCount));\n    return new Function(\"Promise\",\n                        \"fn\",\n                        \"receiver\",\n                        \"withAppended\",\n                        \"maybeWrapAsError\",\n                        \"nodebackForPromise\",\n                        \"tryCatch\",\n                        \"errorObj\",\n                        \"notEnumerableProp\",\n                        \"INTERNAL\",\n                        body)(\n                    Promise,\n                    fn,\n                    receiver,\n                    withAppended,\n                    maybeWrapAsError,\n                    nodebackForPromise,\n                    util.tryCatch,\n                    util.errorObj,\n                    util.notEnumerableProp,\n                    INTERNAL);\n};\n}\n\nfunction makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) {\n    var defaultThis = (function() {return this;})();\n    var method = callback;\n    if (typeof method === \"string\") {\n        callback = fn;\n    }\n    function promisified() {\n        var _receiver = receiver;\n        if (receiver === THIS) _receiver = this;\n        var promise = new Promise(INTERNAL);\n        promise._captureStackTrace();\n        var cb = typeof method === \"string\" && this !== defaultThis\n            ? this[method] : callback;\n        var fn = nodebackForPromise(promise, multiArgs);\n        try {\n            cb.apply(_receiver, withAppended(arguments, fn));\n        } catch(e) {\n            promise._rejectCallback(maybeWrapAsError(e), true, true);\n        }\n        if (!promise._isFateSealed()) promise._setAsyncGuaranteed();\n        return promise;\n    }\n    util.notEnumerableProp(promisified, \"__isPromisified__\", true);\n    return promisified;\n}\n\nvar makeNodePromisified = canEvaluate\n    ? makeNodePromisifiedEval\n    : makeNodePromisifiedClosure;\n\nfunction promisifyAll(obj, suffix, filter, promisifier, multiArgs) {\n    var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + \"$\");\n    var methods =\n        promisifiableMethods(obj, suffix, suffixRegexp, filter);\n\n    for (var i = 0, len = methods.length; i < len; i+= 2) {\n        var key = methods[i];\n        var fn = methods[i+1];\n        var promisifiedKey = key + suffix;\n        if (promisifier === makeNodePromisified) {\n            obj[promisifiedKey] =\n                makeNodePromisified(key, THIS, key, fn, suffix, multiArgs);\n        } else {\n            var promisified = promisifier(fn, function() {\n                return makeNodePromisified(key, THIS, key,\n                                           fn, suffix, multiArgs);\n            });\n            util.notEnumerableProp(promisified, \"__isPromisified__\", true);\n            obj[promisifiedKey] = promisified;\n        }\n    }\n    util.toFastProperties(obj);\n    return obj;\n}\n\nfunction promisify(callback, receiver, multiArgs) {\n    return makeNodePromisified(callback, receiver, undefined,\n                                callback, null, multiArgs);\n}\n\nPromise.promisify = function (fn, options) {\n    if (typeof fn !== \"function\") {\n        throw new TypeError(\"expecting a function but got \" + util.classString(fn));\n    }\n    if (isPromisified(fn)) {\n        return fn;\n    }\n    options = Object(options);\n    var receiver = options.context === undefined ? THIS : options.context;\n    var multiArgs = !!options.multiArgs;\n    var ret = promisify(fn, receiver, multiArgs);\n    util.copyDescriptors(fn, ret, propsFilter);\n    return ret;\n};\n\nPromise.promisifyAll = function (target, options) {\n    if (typeof target !== \"function\" && typeof target !== \"object\") {\n        throw new TypeError(\"the target of promisifyAll must be an object or a function\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    options = Object(options);\n    var multiArgs = !!options.multiArgs;\n    var suffix = options.suffix;\n    if (typeof suffix !== \"string\") suffix = defaultSuffix;\n    var filter = options.filter;\n    if (typeof filter !== \"function\") filter = defaultFilter;\n    var promisifier = options.promisifier;\n    if (typeof promisifier !== \"function\") promisifier = makeNodePromisified;\n\n    if (!util.isIdentifier(suffix)) {\n        throw new RangeError(\"suffix must be a valid identifier\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n\n    var keys = util.inheritedDataKeys(target);\n    for (var i = 0; i < keys.length; ++i) {\n        var value = target[keys[i]];\n        if (keys[i] !== \"constructor\" &&\n            util.isClass(value)) {\n            promisifyAll(value.prototype, suffix, filter, promisifier,\n                multiArgs);\n            promisifyAll(value, suffix, filter, promisifier, multiArgs);\n        }\n    }\n\n    return promisifyAll(target, suffix, filter, promisifier, multiArgs);\n};\n};\n\n\n},{\"./errors\":50,\"./nodeback\":58,\"./util\":74}],63:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(\n    Promise, PromiseArray, tryConvertToPromise, apiRejection) {\nvar util = require(\"./util\");\nvar isObject = util.isObject;\nvar es5 = require(\"./es5\");\nvar Es6Map;\nif (typeof Map === \"function\") Es6Map = Map;\n\nvar mapToEntries = (function() {\n    var index = 0;\n    var size = 0;\n\n    function extractEntry(value, key) {\n        this[index] = value;\n        this[index + size] = key;\n        index++;\n    }\n\n    return function mapToEntries(map) {\n        size = map.size;\n        index = 0;\n        var ret = new Array(map.size * 2);\n        map.forEach(extractEntry, ret);\n        return ret;\n    };\n})();\n\nvar entriesToMap = function(entries) {\n    var ret = new Es6Map();\n    var length = entries.length / 2 | 0;\n    for (var i = 0; i < length; ++i) {\n        var key = entries[length + i];\n        var value = entries[i];\n        ret.set(key, value);\n    }\n    return ret;\n};\n\nfunction PropertiesPromiseArray(obj) {\n    var isMap = false;\n    var entries;\n    if (Es6Map !== undefined && obj instanceof Es6Map) {\n        entries = mapToEntries(obj);\n        isMap = true;\n    } else {\n        var keys = es5.keys(obj);\n        var len = keys.length;\n        entries = new Array(len * 2);\n        for (var i = 0; i < len; ++i) {\n            var key = keys[i];\n            entries[i] = obj[key];\n            entries[i + len] = key;\n        }\n    }\n    this.constructor$(entries);\n    this._isMap = isMap;\n    this._init$(undefined, -3);\n}\nutil.inherits(PropertiesPromiseArray, PromiseArray);\n\nPropertiesPromiseArray.prototype._init = function () {};\n\nPropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    this._values[index] = value;\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= this._length) {\n        var val;\n        if (this._isMap) {\n            val = entriesToMap(this._values);\n        } else {\n            val = {};\n            var keyOffset = this.length();\n            for (var i = 0, len = this.length(); i < len; ++i) {\n                val[this._values[i + keyOffset]] = this._values[i];\n            }\n        }\n        this._resolve(val);\n        return true;\n    }\n    return false;\n};\n\nPropertiesPromiseArray.prototype.shouldCopyValues = function () {\n    return false;\n};\n\nPropertiesPromiseArray.prototype.getActualLength = function (len) {\n    return len >> 1;\n};\n\nfunction props(promises) {\n    var ret;\n    var castValue = tryConvertToPromise(promises);\n\n    if (!isObject(castValue)) {\n        return apiRejection(\"cannot await properties of a non-object\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    } else if (castValue instanceof Promise) {\n        ret = castValue._then(\n            Promise.props, undefined, undefined, undefined, undefined);\n    } else {\n        ret = new PropertiesPromiseArray(castValue).promise();\n    }\n\n    if (castValue instanceof Promise) {\n        ret._propagateFrom(castValue, 2);\n    }\n    return ret;\n}\n\nPromise.prototype.props = function () {\n    return props(this);\n};\n\nPromise.props = function (promises) {\n    return props(promises);\n};\n};\n\n},{\"./es5\":51,\"./util\":74}],64:[function(require,module,exports){\n\"use strict\";\nfunction arrayMove(src, srcIndex, dst, dstIndex, len) {\n    for (var j = 0; j < len; ++j) {\n        dst[j + dstIndex] = src[j + srcIndex];\n        src[j + srcIndex] = void 0;\n    }\n}\n\nfunction Queue(capacity) {\n    this._capacity = capacity;\n    this._length = 0;\n    this._front = 0;\n}\n\nQueue.prototype._willBeOverCapacity = function (size) {\n    return this._capacity < size;\n};\n\nQueue.prototype._pushOne = function (arg) {\n    var length = this.length();\n    this._checkCapacity(length + 1);\n    var i = (this._front + length) & (this._capacity - 1);\n    this[i] = arg;\n    this._length = length + 1;\n};\n\nQueue.prototype.push = function (fn, receiver, arg) {\n    var length = this.length() + 3;\n    if (this._willBeOverCapacity(length)) {\n        this._pushOne(fn);\n        this._pushOne(receiver);\n        this._pushOne(arg);\n        return;\n    }\n    var j = this._front + length - 3;\n    this._checkCapacity(length);\n    var wrapMask = this._capacity - 1;\n    this[(j + 0) & wrapMask] = fn;\n    this[(j + 1) & wrapMask] = receiver;\n    this[(j + 2) & wrapMask] = arg;\n    this._length = length;\n};\n\nQueue.prototype.shift = function () {\n    var front = this._front,\n        ret = this[front];\n\n    this[front] = undefined;\n    this._front = (front + 1) & (this._capacity - 1);\n    this._length--;\n    return ret;\n};\n\nQueue.prototype.length = function () {\n    return this._length;\n};\n\nQueue.prototype._checkCapacity = function (size) {\n    if (this._capacity < size) {\n        this._resizeTo(this._capacity << 1);\n    }\n};\n\nQueue.prototype._resizeTo = function (capacity) {\n    var oldCapacity = this._capacity;\n    this._capacity = capacity;\n    var front = this._front;\n    var length = this._length;\n    var moveItemsCount = (front + length) & (oldCapacity - 1);\n    arrayMove(this, 0, this, oldCapacity, moveItemsCount);\n};\n\nmodule.exports = Queue;\n\n},{}],65:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(\n    Promise, INTERNAL, tryConvertToPromise, apiRejection) {\nvar util = require(\"./util\");\n\nvar raceLater = function (promise) {\n    return promise.then(function(array) {\n        return race(array, promise);\n    });\n};\n\nfunction race(promises, parent) {\n    var maybePromise = tryConvertToPromise(promises);\n\n    if (maybePromise instanceof Promise) {\n        return raceLater(maybePromise);\n    } else {\n        promises = util.asArray(promises);\n        if (promises === null)\n            return apiRejection(\"expecting an array or an iterable object but got \" + util.classString(promises));\n    }\n\n    var ret = new Promise(INTERNAL);\n    if (parent !== undefined) {\n        ret._propagateFrom(parent, 3);\n    }\n    var fulfill = ret._fulfill;\n    var reject = ret._reject;\n    for (var i = 0, len = promises.length; i < len; ++i) {\n        var val = promises[i];\n\n        if (val === undefined && !(i in promises)) {\n            continue;\n        }\n\n        Promise.cast(val)._then(fulfill, reject, undefined, ret, null);\n    }\n    return ret;\n}\n\nPromise.race = function (promises) {\n    return race(promises, undefined);\n};\n\nPromise.prototype.race = function () {\n    return race(this, undefined);\n};\n\n};\n\n},{\"./util\":74}],66:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise,\n                          PromiseArray,\n                          apiRejection,\n                          tryConvertToPromise,\n                          INTERNAL,\n                          debug) {\nvar getDomain = Promise._getDomain;\nvar util = require(\"./util\");\nvar tryCatch = util.tryCatch;\n\nfunction ReductionPromiseArray(promises, fn, initialValue, _each) {\n    this.constructor$(promises);\n    var domain = getDomain();\n    this._fn = domain === null ? fn : util.domainBind(domain, fn);\n    if (initialValue !== undefined) {\n        initialValue = Promise.resolve(initialValue);\n        initialValue._attachCancellationCallback(this);\n    }\n    this._initialValue = initialValue;\n    this._currentCancellable = null;\n    if(_each === INTERNAL) {\n        this._eachValues = Array(this._length);\n    } else if (_each === 0) {\n        this._eachValues = null;\n    } else {\n        this._eachValues = undefined;\n    }\n    this._promise._captureStackTrace();\n    this._init$(undefined, -5);\n}\nutil.inherits(ReductionPromiseArray, PromiseArray);\n\nReductionPromiseArray.prototype._gotAccum = function(accum) {\n    if (this._eachValues !== undefined && \n        this._eachValues !== null && \n        accum !== INTERNAL) {\n        this._eachValues.push(accum);\n    }\n};\n\nReductionPromiseArray.prototype._eachComplete = function(value) {\n    if (this._eachValues !== null) {\n        this._eachValues.push(value);\n    }\n    return this._eachValues;\n};\n\nReductionPromiseArray.prototype._init = function() {};\n\nReductionPromiseArray.prototype._resolveEmptyArray = function() {\n    this._resolve(this._eachValues !== undefined ? this._eachValues\n                                                 : this._initialValue);\n};\n\nReductionPromiseArray.prototype.shouldCopyValues = function () {\n    return false;\n};\n\nReductionPromiseArray.prototype._resolve = function(value) {\n    this._promise._resolveCallback(value);\n    this._values = null;\n};\n\nReductionPromiseArray.prototype._resultCancelled = function(sender) {\n    if (sender === this._initialValue) return this._cancel();\n    if (this._isResolved()) return;\n    this._resultCancelled$();\n    if (this._currentCancellable instanceof Promise) {\n        this._currentCancellable.cancel();\n    }\n    if (this._initialValue instanceof Promise) {\n        this._initialValue.cancel();\n    }\n};\n\nReductionPromiseArray.prototype._iterate = function (values) {\n    this._values = values;\n    var value;\n    var i;\n    var length = values.length;\n    if (this._initialValue !== undefined) {\n        value = this._initialValue;\n        i = 0;\n    } else {\n        value = Promise.resolve(values[0]);\n        i = 1;\n    }\n\n    this._currentCancellable = value;\n\n    if (!value.isRejected()) {\n        for (; i < length; ++i) {\n            var ctx = {\n                accum: null,\n                value: values[i],\n                index: i,\n                length: length,\n                array: this\n            };\n            value = value._then(gotAccum, undefined, undefined, ctx, undefined);\n        }\n    }\n\n    if (this._eachValues !== undefined) {\n        value = value\n            ._then(this._eachComplete, undefined, undefined, this, undefined);\n    }\n    value._then(completed, completed, undefined, value, this);\n};\n\nPromise.prototype.reduce = function (fn, initialValue) {\n    return reduce(this, fn, initialValue, null);\n};\n\nPromise.reduce = function (promises, fn, initialValue, _each) {\n    return reduce(promises, fn, initialValue, _each);\n};\n\nfunction completed(valueOrReason, array) {\n    if (this.isFulfilled()) {\n        array._resolve(valueOrReason);\n    } else {\n        array._reject(valueOrReason);\n    }\n}\n\nfunction reduce(promises, fn, initialValue, _each) {\n    if (typeof fn !== \"function\") {\n        return apiRejection(\"expecting a function but got \" + util.classString(fn));\n    }\n    var array = new ReductionPromiseArray(promises, fn, initialValue, _each);\n    return array.promise();\n}\n\nfunction gotAccum(accum) {\n    this.accum = accum;\n    this.array._gotAccum(accum);\n    var value = tryConvertToPromise(this.value, this.array._promise);\n    if (value instanceof Promise) {\n        this.array._currentCancellable = value;\n        return value._then(gotValue, undefined, undefined, this, undefined);\n    } else {\n        return gotValue.call(this, value);\n    }\n}\n\nfunction gotValue(value) {\n    var array = this.array;\n    var promise = array._promise;\n    var fn = tryCatch(array._fn);\n    promise._pushContext();\n    var ret;\n    if (array._eachValues !== undefined) {\n        ret = fn.call(promise._boundValue(), value, this.index, this.length);\n    } else {\n        ret = fn.call(promise._boundValue(),\n                              this.accum, value, this.index, this.length);\n    }\n    if (ret instanceof Promise) {\n        array._currentCancellable = ret;\n    }\n    var promiseCreated = promise._popContext();\n    debug.checkForgottenReturns(\n        ret,\n        promiseCreated,\n        array._eachValues !== undefined ? \"Promise.each\" : \"Promise.reduce\",\n        promise\n    );\n    return ret;\n}\n};\n\n},{\"./util\":74}],67:[function(require,module,exports){\n(function (process,global){\n\"use strict\";\nvar util = require(\"./util\");\nvar schedule;\nvar noAsyncScheduler = function() {\n    throw new Error(\"No async scheduler available\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n};\nvar NativePromise = util.getNativePromise();\nif (util.isNode && typeof MutationObserver === \"undefined\") {\n    var GlobalSetImmediate = global.setImmediate;\n    var ProcessNextTick = process.nextTick;\n    schedule = util.isRecentNode\n                ? function(fn) { GlobalSetImmediate.call(global, fn); }\n                : function(fn) { ProcessNextTick.call(process, fn); };\n} else if (typeof NativePromise === \"function\" &&\n           typeof NativePromise.resolve === \"function\") {\n    var nativePromise = NativePromise.resolve();\n    schedule = function(fn) {\n        nativePromise.then(fn);\n    };\n} else if ((typeof MutationObserver !== \"undefined\") &&\n          !(typeof window !== \"undefined\" &&\n            window.navigator &&\n            (window.navigator.standalone || window.cordova))) {\n    schedule = (function() {\n        var div = document.createElement(\"div\");\n        var opts = {attributes: true};\n        var toggleScheduled = false;\n        var div2 = document.createElement(\"div\");\n        var o2 = new MutationObserver(function() {\n            div.classList.toggle(\"foo\");\n            toggleScheduled = false;\n        });\n        o2.observe(div2, opts);\n\n        var scheduleToggle = function() {\n            if (toggleScheduled) return;\n                toggleScheduled = true;\n                div2.classList.toggle(\"foo\");\n            };\n\n            return function schedule(fn) {\n            var o = new MutationObserver(function() {\n                o.disconnect();\n                fn();\n            });\n            o.observe(div, opts);\n            scheduleToggle();\n        };\n    })();\n} else if (typeof setImmediate !== \"undefined\") {\n    schedule = function (fn) {\n        setImmediate(fn);\n    };\n} else if (typeof setTimeout !== \"undefined\") {\n    schedule = function (fn) {\n        setTimeout(fn, 0);\n    };\n} else {\n    schedule = noAsyncScheduler;\n}\nmodule.exports = schedule;\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./util\":74,\"_process\":138}],68:[function(require,module,exports){\n\"use strict\";\nmodule.exports =\n    function(Promise, PromiseArray, debug) {\nvar PromiseInspection = Promise.PromiseInspection;\nvar util = require(\"./util\");\n\nfunction SettledPromiseArray(values) {\n    this.constructor$(values);\n}\nutil.inherits(SettledPromiseArray, PromiseArray);\n\nSettledPromiseArray.prototype._promiseResolved = function (index, inspection) {\n    this._values[index] = inspection;\n    var totalResolved = ++this._totalResolved;\n    if (totalResolved >= this._length) {\n        this._resolve(this._values);\n        return true;\n    }\n    return false;\n};\n\nSettledPromiseArray.prototype._promiseFulfilled = function (value, index) {\n    var ret = new PromiseInspection();\n    ret._bitField = 33554432;\n    ret._settledValueField = value;\n    return this._promiseResolved(index, ret);\n};\nSettledPromiseArray.prototype._promiseRejected = function (reason, index) {\n    var ret = new PromiseInspection();\n    ret._bitField = 16777216;\n    ret._settledValueField = reason;\n    return this._promiseResolved(index, ret);\n};\n\nPromise.settle = function (promises) {\n    debug.deprecated(\".settle()\", \".reflect()\");\n    return new SettledPromiseArray(promises).promise();\n};\n\nPromise.prototype.settle = function () {\n    return Promise.settle(this);\n};\n};\n\n},{\"./util\":74}],69:[function(require,module,exports){\n\"use strict\";\nmodule.exports =\nfunction(Promise, PromiseArray, apiRejection) {\nvar util = require(\"./util\");\nvar RangeError = require(\"./errors\").RangeError;\nvar AggregateError = require(\"./errors\").AggregateError;\nvar isArray = util.isArray;\nvar CANCELLATION = {};\n\n\nfunction SomePromiseArray(values) {\n    this.constructor$(values);\n    this._howMany = 0;\n    this._unwrap = false;\n    this._initialized = false;\n}\nutil.inherits(SomePromiseArray, PromiseArray);\n\nSomePromiseArray.prototype._init = function () {\n    if (!this._initialized) {\n        return;\n    }\n    if (this._howMany === 0) {\n        this._resolve([]);\n        return;\n    }\n    this._init$(undefined, -5);\n    var isArrayResolved = isArray(this._values);\n    if (!this._isResolved() &&\n        isArrayResolved &&\n        this._howMany > this._canPossiblyFulfill()) {\n        this._reject(this._getRangeError(this.length()));\n    }\n};\n\nSomePromiseArray.prototype.init = function () {\n    this._initialized = true;\n    this._init();\n};\n\nSomePromiseArray.prototype.setUnwrap = function () {\n    this._unwrap = true;\n};\n\nSomePromiseArray.prototype.howMany = function () {\n    return this._howMany;\n};\n\nSomePromiseArray.prototype.setHowMany = function (count) {\n    this._howMany = count;\n};\n\nSomePromiseArray.prototype._promiseFulfilled = function (value) {\n    this._addFulfilled(value);\n    if (this._fulfilled() === this.howMany()) {\n        this._values.length = this.howMany();\n        if (this.howMany() === 1 && this._unwrap) {\n            this._resolve(this._values[0]);\n        } else {\n            this._resolve(this._values);\n        }\n        return true;\n    }\n    return false;\n\n};\nSomePromiseArray.prototype._promiseRejected = function (reason) {\n    this._addRejected(reason);\n    return this._checkOutcome();\n};\n\nSomePromiseArray.prototype._promiseCancelled = function () {\n    if (this._values instanceof Promise || this._values == null) {\n        return this._cancel();\n    }\n    this._addRejected(CANCELLATION);\n    return this._checkOutcome();\n};\n\nSomePromiseArray.prototype._checkOutcome = function() {\n    if (this.howMany() > this._canPossiblyFulfill()) {\n        var e = new AggregateError();\n        for (var i = this.length(); i < this._values.length; ++i) {\n            if (this._values[i] !== CANCELLATION) {\n                e.push(this._values[i]);\n            }\n        }\n        if (e.length > 0) {\n            this._reject(e);\n        } else {\n            this._cancel();\n        }\n        return true;\n    }\n    return false;\n};\n\nSomePromiseArray.prototype._fulfilled = function () {\n    return this._totalResolved;\n};\n\nSomePromiseArray.prototype._rejected = function () {\n    return this._values.length - this.length();\n};\n\nSomePromiseArray.prototype._addRejected = function (reason) {\n    this._values.push(reason);\n};\n\nSomePromiseArray.prototype._addFulfilled = function (value) {\n    this._values[this._totalResolved++] = value;\n};\n\nSomePromiseArray.prototype._canPossiblyFulfill = function () {\n    return this.length() - this._rejected();\n};\n\nSomePromiseArray.prototype._getRangeError = function (count) {\n    var message = \"Input array must contain at least \" +\n            this._howMany + \" items but contains only \" + count + \" items\";\n    return new RangeError(message);\n};\n\nSomePromiseArray.prototype._resolveEmptyArray = function () {\n    this._reject(this._getRangeError(0));\n};\n\nfunction some(promises, howMany) {\n    if ((howMany | 0) !== howMany || howMany < 0) {\n        return apiRejection(\"expecting a positive integer\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    var ret = new SomePromiseArray(promises);\n    var promise = ret.promise();\n    ret.setHowMany(howMany);\n    ret.init();\n    return promise;\n}\n\nPromise.some = function (promises, howMany) {\n    return some(promises, howMany);\n};\n\nPromise.prototype.some = function (howMany) {\n    return some(this, howMany);\n};\n\nPromise._SomePromiseArray = SomePromiseArray;\n};\n\n},{\"./errors\":50,\"./util\":74}],70:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise) {\nfunction PromiseInspection(promise) {\n    if (promise !== undefined) {\n        promise = promise._target();\n        this._bitField = promise._bitField;\n        this._settledValueField = promise._isFateSealed()\n            ? promise._settledValue() : undefined;\n    }\n    else {\n        this._bitField = 0;\n        this._settledValueField = undefined;\n    }\n}\n\nPromiseInspection.prototype._settledValue = function() {\n    return this._settledValueField;\n};\n\nvar value = PromiseInspection.prototype.value = function () {\n    if (!this.isFulfilled()) {\n        throw new TypeError(\"cannot get fulfillment value of a non-fulfilled promise\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    return this._settledValue();\n};\n\nvar reason = PromiseInspection.prototype.error =\nPromiseInspection.prototype.reason = function () {\n    if (!this.isRejected()) {\n        throw new TypeError(\"cannot get rejection reason of a non-rejected promise\\u000a\\u000a    See http://goo.gl/MqrFmX\\u000a\");\n    }\n    return this._settledValue();\n};\n\nvar isFulfilled = PromiseInspection.prototype.isFulfilled = function() {\n    return (this._bitField & 33554432) !== 0;\n};\n\nvar isRejected = PromiseInspection.prototype.isRejected = function () {\n    return (this._bitField & 16777216) !== 0;\n};\n\nvar isPending = PromiseInspection.prototype.isPending = function () {\n    return (this._bitField & 50397184) === 0;\n};\n\nvar isResolved = PromiseInspection.prototype.isResolved = function () {\n    return (this._bitField & 50331648) !== 0;\n};\n\nPromiseInspection.prototype.isCancelled = function() {\n    return (this._bitField & 8454144) !== 0;\n};\n\nPromise.prototype.__isCancelled = function() {\n    return (this._bitField & 65536) === 65536;\n};\n\nPromise.prototype._isCancelled = function() {\n    return this._target().__isCancelled();\n};\n\nPromise.prototype.isCancelled = function() {\n    return (this._target()._bitField & 8454144) !== 0;\n};\n\nPromise.prototype.isPending = function() {\n    return isPending.call(this._target());\n};\n\nPromise.prototype.isRejected = function() {\n    return isRejected.call(this._target());\n};\n\nPromise.prototype.isFulfilled = function() {\n    return isFulfilled.call(this._target());\n};\n\nPromise.prototype.isResolved = function() {\n    return isResolved.call(this._target());\n};\n\nPromise.prototype.value = function() {\n    return value.call(this._target());\n};\n\nPromise.prototype.reason = function() {\n    var target = this._target();\n    target._unsetRejectionIsUnhandled();\n    return reason.call(target);\n};\n\nPromise.prototype._value = function() {\n    return this._settledValue();\n};\n\nPromise.prototype._reason = function() {\n    this._unsetRejectionIsUnhandled();\n    return this._settledValue();\n};\n\nPromise.PromiseInspection = PromiseInspection;\n};\n\n},{}],71:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL) {\nvar util = require(\"./util\");\nvar errorObj = util.errorObj;\nvar isObject = util.isObject;\n\nfunction tryConvertToPromise(obj, context) {\n    if (isObject(obj)) {\n        if (obj instanceof Promise) return obj;\n        var then = getThen(obj);\n        if (then === errorObj) {\n            if (context) context._pushContext();\n            var ret = Promise.reject(then.e);\n            if (context) context._popContext();\n            return ret;\n        } else if (typeof then === \"function\") {\n            if (isAnyBluebirdPromise(obj)) {\n                var ret = new Promise(INTERNAL);\n                obj._then(\n                    ret._fulfill,\n                    ret._reject,\n                    undefined,\n                    ret,\n                    null\n                );\n                return ret;\n            }\n            return doThenable(obj, then, context);\n        }\n    }\n    return obj;\n}\n\nfunction doGetThen(obj) {\n    return obj.then;\n}\n\nfunction getThen(obj) {\n    try {\n        return doGetThen(obj);\n    } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n    }\n}\n\nvar hasProp = {}.hasOwnProperty;\nfunction isAnyBluebirdPromise(obj) {\n    try {\n        return hasProp.call(obj, \"_promise0\");\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction doThenable(x, then, context) {\n    var promise = new Promise(INTERNAL);\n    var ret = promise;\n    if (context) context._pushContext();\n    promise._captureStackTrace();\n    if (context) context._popContext();\n    var synchronous = true;\n    var result = util.tryCatch(then).call(x, resolve, reject);\n    synchronous = false;\n\n    if (promise && result === errorObj) {\n        promise._rejectCallback(result.e, true, true);\n        promise = null;\n    }\n\n    function resolve(value) {\n        if (!promise) return;\n        promise._resolveCallback(value);\n        promise = null;\n    }\n\n    function reject(reason) {\n        if (!promise) return;\n        promise._rejectCallback(reason, synchronous, true);\n        promise = null;\n    }\n    return ret;\n}\n\nreturn tryConvertToPromise;\n};\n\n},{\"./util\":74}],72:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function(Promise, INTERNAL, debug) {\nvar util = require(\"./util\");\nvar TimeoutError = Promise.TimeoutError;\n\nfunction HandleWrapper(handle)  {\n    this.handle = handle;\n}\n\nHandleWrapper.prototype._resultCancelled = function() {\n    clearTimeout(this.handle);\n};\n\nvar afterValue = function(value) { return delay(+this).thenReturn(value); };\nvar delay = Promise.delay = function (ms, value) {\n    var ret;\n    var handle;\n    if (value !== undefined) {\n        ret = Promise.resolve(value)\n                ._then(afterValue, null, null, ms, undefined);\n        if (debug.cancellation() && value instanceof Promise) {\n            ret._setOnCancel(value);\n        }\n    } else {\n        ret = new Promise(INTERNAL);\n        handle = setTimeout(function() { ret._fulfill(); }, +ms);\n        if (debug.cancellation()) {\n            ret._setOnCancel(new HandleWrapper(handle));\n        }\n        ret._captureStackTrace();\n    }\n    ret._setAsyncGuaranteed();\n    return ret;\n};\n\nPromise.prototype.delay = function (ms) {\n    return delay(ms, this);\n};\n\nvar afterTimeout = function (promise, message, parent) {\n    var err;\n    if (typeof message !== \"string\") {\n        if (message instanceof Error) {\n            err = message;\n        } else {\n            err = new TimeoutError(\"operation timed out\");\n        }\n    } else {\n        err = new TimeoutError(message);\n    }\n    util.markAsOriginatingFromRejection(err);\n    promise._attachExtraTrace(err);\n    promise._reject(err);\n\n    if (parent != null) {\n        parent.cancel();\n    }\n};\n\nfunction successClear(value) {\n    clearTimeout(this.handle);\n    return value;\n}\n\nfunction failureClear(reason) {\n    clearTimeout(this.handle);\n    throw reason;\n}\n\nPromise.prototype.timeout = function (ms, message) {\n    ms = +ms;\n    var ret, parent;\n\n    var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() {\n        if (ret.isPending()) {\n            afterTimeout(ret, message, parent);\n        }\n    }, ms));\n\n    if (debug.cancellation()) {\n        parent = this.then();\n        ret = parent._then(successClear, failureClear,\n                            undefined, handleWrapper, undefined);\n        ret._setOnCancel(handleWrapper);\n    } else {\n        ret = this._then(successClear, failureClear,\n                            undefined, handleWrapper, undefined);\n    }\n\n    return ret;\n};\n\n};\n\n},{\"./util\":74}],73:[function(require,module,exports){\n\"use strict\";\nmodule.exports = function (Promise, apiRejection, tryConvertToPromise,\n    createContext, INTERNAL, debug) {\n    var util = require(\"./util\");\n    var TypeError = require(\"./errors\").TypeError;\n    var inherits = require(\"./util\").inherits;\n    var errorObj = util.errorObj;\n    var tryCatch = util.tryCatch;\n    var NULL = {};\n\n    function thrower(e) {\n        setTimeout(function(){throw e;}, 0);\n    }\n\n    function castPreservingDisposable(thenable) {\n        var maybePromise = tryConvertToPromise(thenable);\n        if (maybePromise !== thenable &&\n            typeof thenable._isDisposable === \"function\" &&\n            typeof thenable._getDisposer === \"function\" &&\n            thenable._isDisposable()) {\n            maybePromise._setDisposable(thenable._getDisposer());\n        }\n        return maybePromise;\n    }\n    function dispose(resources, inspection) {\n        var i = 0;\n        var len = resources.length;\n        var ret = new Promise(INTERNAL);\n        function iterator() {\n            if (i >= len) return ret._fulfill();\n            var maybePromise = castPreservingDisposable(resources[i++]);\n            if (maybePromise instanceof Promise &&\n                maybePromise._isDisposable()) {\n                try {\n                    maybePromise = tryConvertToPromise(\n                        maybePromise._getDisposer().tryDispose(inspection),\n                        resources.promise);\n                } catch (e) {\n                    return thrower(e);\n                }\n                if (maybePromise instanceof Promise) {\n                    return maybePromise._then(iterator, thrower,\n                                              null, null, null);\n                }\n            }\n            iterator();\n        }\n        iterator();\n        return ret;\n    }\n\n    function Disposer(data, promise, context) {\n        this._data = data;\n        this._promise = promise;\n        this._context = context;\n    }\n\n    Disposer.prototype.data = function () {\n        return this._data;\n    };\n\n    Disposer.prototype.promise = function () {\n        return this._promise;\n    };\n\n    Disposer.prototype.resource = function () {\n        if (this.promise().isFulfilled()) {\n            return this.promise().value();\n        }\n        return NULL;\n    };\n\n    Disposer.prototype.tryDispose = function(inspection) {\n        var resource = this.resource();\n        var context = this._context;\n        if (context !== undefined) context._pushContext();\n        var ret = resource !== NULL\n            ? this.doDispose(resource, inspection) : null;\n        if (context !== undefined) context._popContext();\n        this._promise._unsetDisposable();\n        this._data = null;\n        return ret;\n    };\n\n    Disposer.isDisposer = function (d) {\n        return (d != null &&\n                typeof d.resource === \"function\" &&\n                typeof d.tryDispose === \"function\");\n    };\n\n    function FunctionDisposer(fn, promise, context) {\n        this.constructor$(fn, promise, context);\n    }\n    inherits(FunctionDisposer, Disposer);\n\n    FunctionDisposer.prototype.doDispose = function (resource, inspection) {\n        var fn = this.data();\n        return fn.call(resource, resource, inspection);\n    };\n\n    function maybeUnwrapDisposer(value) {\n        if (Disposer.isDisposer(value)) {\n            this.resources[this.index]._setDisposable(value);\n            return value.promise();\n        }\n        return value;\n    }\n\n    function ResourceList(length) {\n        this.length = length;\n        this.promise = null;\n        this[length-1] = null;\n    }\n\n    ResourceList.prototype._resultCancelled = function() {\n        var len = this.length;\n        for (var i = 0; i < len; ++i) {\n            var item = this[i];\n            if (item instanceof Promise) {\n                item.cancel();\n            }\n        }\n    };\n\n    Promise.using = function () {\n        var len = arguments.length;\n        if (len < 2) return apiRejection(\n                        \"you must pass at least 2 arguments to Promise.using\");\n        var fn = arguments[len - 1];\n        if (typeof fn !== \"function\") {\n            return apiRejection(\"expecting a function but got \" + util.classString(fn));\n        }\n        var input;\n        var spreadArgs = true;\n        if (len === 2 && Array.isArray(arguments[0])) {\n            input = arguments[0];\n            len = input.length;\n            spreadArgs = false;\n        } else {\n            input = arguments;\n            len--;\n        }\n        var resources = new ResourceList(len);\n        for (var i = 0; i < len; ++i) {\n            var resource = input[i];\n            if (Disposer.isDisposer(resource)) {\n                var disposer = resource;\n                resource = resource.promise();\n                resource._setDisposable(disposer);\n            } else {\n                var maybePromise = tryConvertToPromise(resource);\n                if (maybePromise instanceof Promise) {\n                    resource =\n                        maybePromise._then(maybeUnwrapDisposer, null, null, {\n                            resources: resources,\n                            index: i\n                    }, undefined);\n                }\n            }\n            resources[i] = resource;\n        }\n\n        var reflectedResources = new Array(resources.length);\n        for (var i = 0; i < reflectedResources.length; ++i) {\n            reflectedResources[i] = Promise.resolve(resources[i]).reflect();\n        }\n\n        var resultPromise = Promise.all(reflectedResources)\n            .then(function(inspections) {\n                for (var i = 0; i < inspections.length; ++i) {\n                    var inspection = inspections[i];\n                    if (inspection.isRejected()) {\n                        errorObj.e = inspection.error();\n                        return errorObj;\n                    } else if (!inspection.isFulfilled()) {\n                        resultPromise.cancel();\n                        return;\n                    }\n                    inspections[i] = inspection.value();\n                }\n                promise._pushContext();\n\n                fn = tryCatch(fn);\n                var ret = spreadArgs\n                    ? fn.apply(undefined, inspections) : fn(inspections);\n                var promiseCreated = promise._popContext();\n                debug.checkForgottenReturns(\n                    ret, promiseCreated, \"Promise.using\", promise);\n                return ret;\n            });\n\n        var promise = resultPromise.lastly(function() {\n            var inspection = new Promise.PromiseInspection(resultPromise);\n            return dispose(resources, inspection);\n        });\n        resources.promise = promise;\n        promise._setOnCancel(resources);\n        return promise;\n    };\n\n    Promise.prototype._setDisposable = function (disposer) {\n        this._bitField = this._bitField | 131072;\n        this._disposer = disposer;\n    };\n\n    Promise.prototype._isDisposable = function () {\n        return (this._bitField & 131072) > 0;\n    };\n\n    Promise.prototype._getDisposer = function () {\n        return this._disposer;\n    };\n\n    Promise.prototype._unsetDisposable = function () {\n        this._bitField = this._bitField & (~131072);\n        this._disposer = undefined;\n    };\n\n    Promise.prototype.disposer = function (fn) {\n        if (typeof fn === \"function\") {\n            return new FunctionDisposer(fn, this, createContext());\n        }\n        throw new TypeError();\n    };\n\n};\n\n},{\"./errors\":50,\"./util\":74}],74:[function(require,module,exports){\n(function (process,global){\n\"use strict\";\nvar es5 = require(\"./es5\");\nvar canEvaluate = typeof navigator == \"undefined\";\n\nvar errorObj = {e: {}};\nvar tryCatchTarget;\nvar globalObject = typeof self !== \"undefined\" ? self :\n    typeof window !== \"undefined\" ? window :\n    typeof global !== \"undefined\" ? global :\n    this !== undefined ? this : null;\n\nfunction tryCatcher() {\n    try {\n        var target = tryCatchTarget;\n        tryCatchTarget = null;\n        return target.apply(this, arguments);\n    } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n    }\n}\nfunction tryCatch(fn) {\n    tryCatchTarget = fn;\n    return tryCatcher;\n}\n\nvar inherits = function(Child, Parent) {\n    var hasProp = {}.hasOwnProperty;\n\n    function T() {\n        this.constructor = Child;\n        this.constructor$ = Parent;\n        for (var propertyName in Parent.prototype) {\n            if (hasProp.call(Parent.prototype, propertyName) &&\n                propertyName.charAt(propertyName.length-1) !== \"$\"\n           ) {\n                this[propertyName + \"$\"] = Parent.prototype[propertyName];\n            }\n        }\n    }\n    T.prototype = Parent.prototype;\n    Child.prototype = new T();\n    return Child.prototype;\n};\n\n\nfunction isPrimitive(val) {\n    return val == null || val === true || val === false ||\n        typeof val === \"string\" || typeof val === \"number\";\n\n}\n\nfunction isObject(value) {\n    return typeof value === \"function\" ||\n           typeof value === \"object\" && value !== null;\n}\n\nfunction maybeWrapAsError(maybeError) {\n    if (!isPrimitive(maybeError)) return maybeError;\n\n    return new Error(safeToString(maybeError));\n}\n\nfunction withAppended(target, appendee) {\n    var len = target.length;\n    var ret = new Array(len + 1);\n    var i;\n    for (i = 0; i < len; ++i) {\n        ret[i] = target[i];\n    }\n    ret[i] = appendee;\n    return ret;\n}\n\nfunction getDataPropertyOrDefault(obj, key, defaultValue) {\n    if (es5.isES5) {\n        var desc = Object.getOwnPropertyDescriptor(obj, key);\n\n        if (desc != null) {\n            return desc.get == null && desc.set == null\n                    ? desc.value\n                    : defaultValue;\n        }\n    } else {\n        return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;\n    }\n}\n\nfunction notEnumerableProp(obj, name, value) {\n    if (isPrimitive(obj)) return obj;\n    var descriptor = {\n        value: value,\n        configurable: true,\n        enumerable: false,\n        writable: true\n    };\n    es5.defineProperty(obj, name, descriptor);\n    return obj;\n}\n\nfunction thrower(r) {\n    throw r;\n}\n\nvar inheritedDataKeys = (function() {\n    var excludedPrototypes = [\n        Array.prototype,\n        Object.prototype,\n        Function.prototype\n    ];\n\n    var isExcludedProto = function(val) {\n        for (var i = 0; i < excludedPrototypes.length; ++i) {\n            if (excludedPrototypes[i] === val) {\n                return true;\n            }\n        }\n        return false;\n    };\n\n    if (es5.isES5) {\n        var getKeys = Object.getOwnPropertyNames;\n        return function(obj) {\n            var ret = [];\n            var visitedKeys = Object.create(null);\n            while (obj != null && !isExcludedProto(obj)) {\n                var keys;\n                try {\n                    keys = getKeys(obj);\n                } catch (e) {\n                    return ret;\n                }\n                for (var i = 0; i < keys.length; ++i) {\n                    var key = keys[i];\n                    if (visitedKeys[key]) continue;\n                    visitedKeys[key] = true;\n                    var desc = Object.getOwnPropertyDescriptor(obj, key);\n                    if (desc != null && desc.get == null && desc.set == null) {\n                        ret.push(key);\n                    }\n                }\n                obj = es5.getPrototypeOf(obj);\n            }\n            return ret;\n        };\n    } else {\n        var hasProp = {}.hasOwnProperty;\n        return function(obj) {\n            if (isExcludedProto(obj)) return [];\n            var ret = [];\n\n            /*jshint forin:false */\n            enumeration: for (var key in obj) {\n                if (hasProp.call(obj, key)) {\n                    ret.push(key);\n                } else {\n                    for (var i = 0; i < excludedPrototypes.length; ++i) {\n                        if (hasProp.call(excludedPrototypes[i], key)) {\n                            continue enumeration;\n                        }\n                    }\n                    ret.push(key);\n                }\n            }\n            return ret;\n        };\n    }\n\n})();\n\nvar thisAssignmentPattern = /this\\s*\\.\\s*\\S+\\s*=/;\nfunction isClass(fn) {\n    try {\n        if (typeof fn === \"function\") {\n            var keys = es5.names(fn.prototype);\n\n            var hasMethods = es5.isES5 && keys.length > 1;\n            var hasMethodsOtherThanConstructor = keys.length > 0 &&\n                !(keys.length === 1 && keys[0] === \"constructor\");\n            var hasThisAssignmentAndStaticMethods =\n                thisAssignmentPattern.test(fn + \"\") && es5.names(fn).length > 0;\n\n            if (hasMethods || hasMethodsOtherThanConstructor ||\n                hasThisAssignmentAndStaticMethods) {\n                return true;\n            }\n        }\n        return false;\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction toFastProperties(obj) {\n    /*jshint -W027,-W055,-W031*/\n    function FakeConstructor() {}\n    FakeConstructor.prototype = obj;\n    var l = 8;\n    while (l--) new FakeConstructor();\n    return obj;\n    eval(obj);\n}\n\nvar rident = /^[a-z$_][a-z$_0-9]*$/i;\nfunction isIdentifier(str) {\n    return rident.test(str);\n}\n\nfunction filledRange(count, prefix, suffix) {\n    var ret = new Array(count);\n    for(var i = 0; i < count; ++i) {\n        ret[i] = prefix + i + suffix;\n    }\n    return ret;\n}\n\nfunction safeToString(obj) {\n    try {\n        return obj + \"\";\n    } catch (e) {\n        return \"[no string representation]\";\n    }\n}\n\nfunction isError(obj) {\n    return obj !== null &&\n           typeof obj === \"object\" &&\n           typeof obj.message === \"string\" &&\n           typeof obj.name === \"string\";\n}\n\nfunction markAsOriginatingFromRejection(e) {\n    try {\n        notEnumerableProp(e, \"isOperational\", true);\n    }\n    catch(ignore) {}\n}\n\nfunction originatesFromRejection(e) {\n    if (e == null) return false;\n    return ((e instanceof Error[\"__BluebirdErrorTypes__\"].OperationalError) ||\n        e[\"isOperational\"] === true);\n}\n\nfunction canAttachTrace(obj) {\n    return isError(obj) && es5.propertyIsWritable(obj, \"stack\");\n}\n\nvar ensureErrorObject = (function() {\n    if (!(\"stack\" in new Error())) {\n        return function(value) {\n            if (canAttachTrace(value)) return value;\n            try {throw new Error(safeToString(value));}\n            catch(err) {return err;}\n        };\n    } else {\n        return function(value) {\n            if (canAttachTrace(value)) return value;\n            return new Error(safeToString(value));\n        };\n    }\n})();\n\nfunction classString(obj) {\n    return {}.toString.call(obj);\n}\n\nfunction copyDescriptors(from, to, filter) {\n    var keys = es5.names(from);\n    for (var i = 0; i < keys.length; ++i) {\n        var key = keys[i];\n        if (filter(key)) {\n            try {\n                es5.defineProperty(to, key, es5.getDescriptor(from, key));\n            } catch (ignore) {}\n        }\n    }\n}\n\nvar asArray = function(v) {\n    if (es5.isArray(v)) {\n        return v;\n    }\n    return null;\n};\n\nif (typeof Symbol !== \"undefined\" && Symbol.iterator) {\n    var ArrayFrom = typeof Array.from === \"function\" ? function(v) {\n        return Array.from(v);\n    } : function(v) {\n        var ret = [];\n        var it = v[Symbol.iterator]();\n        var itResult;\n        while (!((itResult = it.next()).done)) {\n            ret.push(itResult.value);\n        }\n        return ret;\n    };\n\n    asArray = function(v) {\n        if (es5.isArray(v)) {\n            return v;\n        } else if (v != null && typeof v[Symbol.iterator] === \"function\") {\n            return ArrayFrom(v);\n        }\n        return null;\n    };\n}\n\nvar isNode = typeof process !== \"undefined\" &&\n        classString(process).toLowerCase() === \"[object process]\";\n\nvar hasEnvVariables = typeof process !== \"undefined\" &&\n    typeof process.env !== \"undefined\";\n\nfunction env(key) {\n    return hasEnvVariables ? process.env[key] : undefined;\n}\n\nfunction getNativePromise() {\n    if (typeof Promise === \"function\") {\n        try {\n            var promise = new Promise(function(){});\n            if ({}.toString.call(promise) === \"[object Promise]\") {\n                return Promise;\n            }\n        } catch (e) {}\n    }\n}\n\nfunction domainBind(self, cb) {\n    return self.bind(cb);\n}\n\nvar ret = {\n    isClass: isClass,\n    isIdentifier: isIdentifier,\n    inheritedDataKeys: inheritedDataKeys,\n    getDataPropertyOrDefault: getDataPropertyOrDefault,\n    thrower: thrower,\n    isArray: es5.isArray,\n    asArray: asArray,\n    notEnumerableProp: notEnumerableProp,\n    isPrimitive: isPrimitive,\n    isObject: isObject,\n    isError: isError,\n    canEvaluate: canEvaluate,\n    errorObj: errorObj,\n    tryCatch: tryCatch,\n    inherits: inherits,\n    withAppended: withAppended,\n    maybeWrapAsError: maybeWrapAsError,\n    toFastProperties: toFastProperties,\n    filledRange: filledRange,\n    toString: safeToString,\n    canAttachTrace: canAttachTrace,\n    ensureErrorObject: ensureErrorObject,\n    originatesFromRejection: originatesFromRejection,\n    markAsOriginatingFromRejection: markAsOriginatingFromRejection,\n    classString: classString,\n    copyDescriptors: copyDescriptors,\n    hasDevTools: typeof chrome !== \"undefined\" && chrome &&\n                 typeof chrome.loadTimes === \"function\",\n    isNode: isNode,\n    hasEnvVariables: hasEnvVariables,\n    env: env,\n    global: globalObject,\n    getNativePromise: getNativePromise,\n    domainBind: domainBind\n};\nret.isRecentNode = ret.isNode && (function() {\n    var version = process.versions.node.split(\".\").map(Number);\n    return (version[0] === 0 && version[1] > 10) || (version[0] > 0);\n})();\n\nif (ret.isNode) ret.toFastProperties(process);\n\ntry {throw new Error(); } catch (e) {ret.lastLineError = e;}\nmodule.exports = ret;\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./es5\":51,\"_process\":138}],75:[function(require,module,exports){\n\n},{}],76:[function(require,module,exports){\n(function (global){\n'use strict';\n\nvar buffer = require('buffer');\nvar Buffer = buffer.Buffer;\nvar SlowBuffer = buffer.SlowBuffer;\nvar MAX_LEN = buffer.kMaxLength || 2147483647;\nexports.alloc = function alloc(size, fill, encoding) {\n  if (typeof Buffer.alloc === 'function') {\n    return Buffer.alloc(size, fill, encoding);\n  }\n  if (typeof encoding === 'number') {\n    throw new TypeError('encoding must not be number');\n  }\n  if (typeof size !== 'number') {\n    throw new TypeError('size must be a number');\n  }\n  if (size > MAX_LEN) {\n    throw new RangeError('size is too large');\n  }\n  var enc = encoding;\n  var _fill = fill;\n  if (_fill === undefined) {\n    enc = undefined;\n    _fill = 0;\n  }\n  var buf = new Buffer(size);\n  if (typeof _fill === 'string') {\n    var fillBuf = new Buffer(_fill, enc);\n    var flen = fillBuf.length;\n    var i = -1;\n    while (++i < size) {\n      buf[i] = fillBuf[i % flen];\n    }\n  } else {\n    buf.fill(_fill);\n  }\n  return buf;\n}\nexports.allocUnsafe = function allocUnsafe(size) {\n  if (typeof Buffer.allocUnsafe === 'function') {\n    return Buffer.allocUnsafe(size);\n  }\n  if (typeof size !== 'number') {\n    throw new TypeError('size must be a number');\n  }\n  if (size > MAX_LEN) {\n    throw new RangeError('size is too large');\n  }\n  return new Buffer(size);\n}\nexports.from = function from(value, encodingOrOffset, length) {\n  if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) {\n    return Buffer.from(value, encodingOrOffset, length);\n  }\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number');\n  }\n  if (typeof value === 'string') {\n    return new Buffer(value, encodingOrOffset);\n  }\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    var offset = encodingOrOffset;\n    if (arguments.length === 1) {\n      return new Buffer(value);\n    }\n    if (typeof offset === 'undefined') {\n      offset = 0;\n    }\n    var len = length;\n    if (typeof len === 'undefined') {\n      len = value.byteLength - offset;\n    }\n    if (offset >= value.byteLength) {\n      throw new RangeError('\\'offset\\' is out of bounds');\n    }\n    if (len > value.byteLength - offset) {\n      throw new RangeError('\\'length\\' is out of bounds');\n    }\n    return new Buffer(value.slice(offset, offset + len));\n  }\n  if (Buffer.isBuffer(value)) {\n    var out = new Buffer(value.length);\n    value.copy(out, 0, 0, value.length);\n    return out;\n  }\n  if (value) {\n    if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) {\n      return new Buffer(value);\n    }\n    if (value.type === 'Buffer' && Array.isArray(value.data)) {\n      return new Buffer(value.data);\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.');\n}\nexports.allocUnsafeSlow = function allocUnsafeSlow(size) {\n  if (typeof Buffer.allocUnsafeSlow === 'function') {\n    return Buffer.allocUnsafeSlow(size);\n  }\n  if (typeof size !== 'number') {\n    throw new TypeError('size must be a number');\n  }\n  if (size >= MAX_LEN) {\n    throw new RangeError('size is too large');\n  }\n  return new SlowBuffer(size);\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"buffer\":77}],77:[function(require,module,exports){\n(function (global){\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *     incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n  ? global.TYPED_ARRAY_SUPPORT\n  : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n    return arr.foo() === 42 && // typed array instances can be augmented\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n}\n\nfunction kMaxLength () {\n  return Buffer.TYPED_ARRAY_SUPPORT\n    ? 0x7fffffff\n    : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n  if (kMaxLength() < length) {\n    throw new RangeError('Invalid typed array length')\n  }\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = new Uint8Array(length)\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    if (that === null) {\n      that = new Buffer(length)\n    }\n    that.length = length\n  }\n\n  return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n    return new Buffer(arg, encodingOrOffset, length)\n  }\n\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new Error(\n        'If encoding is specified then the first argument must be a string'\n      )\n    }\n    return allocUnsafe(this, arg)\n  }\n  return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n  arr.__proto__ = Buffer.prototype\n  return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    return fromArrayBuffer(that, value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(that, value, encodingOrOffset)\n  }\n\n  return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n  Buffer.prototype.__proto__ = Uint8Array.prototype\n  Buffer.__proto__ = Uint8Array\n  if (typeof Symbol !== 'undefined' && Symbol.species &&\n      Buffer[Symbol.species] === Buffer) {\n    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n    Object.defineProperty(Buffer, Symbol.species, {\n      value: null,\n      configurable: true\n    })\n  }\n}\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  } else if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n}\n\nfunction alloc (that, size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(that, size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(that, size).fill(fill, encoding)\n      : createBuffer(that, size).fill(fill)\n  }\n  return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n  assertSize(size)\n  that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < size; ++i) {\n      that[i] = 0\n    }\n  }\n  return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  var length = byteLength(string, encoding) | 0\n  that = createBuffer(that, length)\n\n  var actual = that.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    that = that.slice(0, actual)\n  }\n\n  return that\n}\n\nfunction fromArrayLike (that, array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  that = createBuffer(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n  array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\\'offset\\' is out of bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\\'length\\' is out of bounds')\n  }\n\n  if (byteOffset === undefined && length === undefined) {\n    array = new Uint8Array(array)\n  } else if (length === undefined) {\n    array = new Uint8Array(array, byteOffset)\n  } else {\n    array = new Uint8Array(array, byteOffset, length)\n  }\n\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = array\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that = fromArrayLike(that, array)\n  }\n  return that\n}\n\nfunction fromObject (that, obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    that = createBuffer(that, len)\n\n    if (that.length === 0) {\n      return that\n    }\n\n    obj.copy(that, 0, 0, len)\n    return that\n  }\n\n  if (obj) {\n    if ((typeof ArrayBuffer !== 'undefined' &&\n        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n      if (typeof obj.length !== 'number' || isnan(obj.length)) {\n        return createBuffer(that, 0)\n      }\n      return fromArrayLike(that, obj)\n    }\n\n    if (obj.type === 'Buffer' && isArray(obj.data)) {\n      return fromArrayLike(that, obj.data)\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < kMaxLength()` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= kMaxLength()) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + kMaxLength().toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n      (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    string = '' + string\n  }\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n      case undefined:\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length | 0\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError('Argument must be a Buffer')\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset  // Coerce to Number.\n  if (isNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (Buffer.TYPED_ARRAY_SUPPORT &&\n        typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (isNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset | 0\n    if (isFinite(length)) {\n      length = length | 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  // legacy write(string, encoding, offset, length) - remove in v0.13\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    newBuf = this.subarray(start, end)\n    newBuf.__proto__ = Buffer.prototype\n  } else {\n    var sliceLen = end - start\n    newBuf = new Buffer(sliceLen, undefined)\n    for (var i = 0; i < sliceLen; ++i) {\n      newBuf[i] = this[i + start]\n    }\n  }\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n      (littleEndian ? i : 1 - i) * 8\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffffffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset + 3] = (value >>> 24)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 1] = (value >>> 8)\n    this[offset] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 3] = (value >>> 24)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n    // ascending copy from start\n    for (i = 0; i < len; ++i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, start + len),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if (code < 256) {\n        val = code\n      }\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : utf8ToBytes(new Buffer(val, encoding).toString())\n    var len = bytes.length\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\nfunction isnan (val) {\n  return val !== val // eslint-disable-line no-self-compare\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"base64-js\":39,\"ieee754\":80,\"isarray\":83}],78:[function(require,module,exports){\n(function (Buffer){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\n\nfunction isArray(arg) {\n  if (Array.isArray) {\n    return Array.isArray(arg);\n  }\n  return objectToString(arg) === '[object Array]';\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null ||\n         typeof arg === 'boolean' ||\n         typeof arg === 'number' ||\n         typeof arg === 'string' ||\n         typeof arg === 'symbol' ||  // ES6 symbol\n         typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = Buffer.isBuffer;\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n\n}).call(this,{\"isBuffer\":require(\"../../is-buffer/index.js\")})\n},{\"../../is-buffer/index.js\":82}],79:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n\n  // If there is no 'error' event listener then throw.\n  if (type === 'error') {\n    if (!this._events.error ||\n        (isObject(this._events.error) && !this._events.error.length)) {\n      er = arguments[1];\n      if (er instanceof Error) {\n        throw er; // Unhandled 'error' event\n      } else {\n        // At least give some kind of context to the user\n        var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n        err.context = er;\n        throw err;\n      }\n    }\n  }\n\n  handler = this._events[type];\n\n  if (isUndefined(handler))\n    return false;\n\n  if (isFunction(handler)) {\n    switch (arguments.length) {\n      // fast cases\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      // slower\n      default:\n        args = Array.prototype.slice.call(arguments, 1);\n        handler.apply(this, args);\n    }\n  } else if (isObject(handler)) {\n    args = Array.prototype.slice.call(arguments, 1);\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n\n  // To avoid recursion in the case that type === \"newListener\"! Before\n  // adding it to the listeners, first emit \"newListener\".\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    // Optimize the case of one listener. Don't need the extra array object.\n    this._events[type] = listener;\n  else if (isObject(this._events[type]))\n    // If we've already got an array, just append.\n    this._events[type].push(listener);\n  else\n    // Adding the second element, need to change to array.\n    this._events[type] = [this._events[type], listener];\n\n  // Check for listener leak\n  if (isObject(this._events[type]) && !this._events[type].warned) {\n    if (!isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n      console.error('(node) warning: possible EventEmitter memory ' +\n                    'leak detected. %d listeners added. ' +\n                    'Use emitter.setMaxListeners() to increase limit.',\n                    this._events[type].length);\n      if (typeof console.trace === 'function') {\n        // not supported in IE 10\n        console.trace();\n      }\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n\n  // not listening for removeListener, no need to emit\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n\n  // emit removeListener for all listeners on all events\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else if (listeners) {\n    // LIFO order\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n  if (this._events) {\n    var evlistener = this._events[type];\n\n    if (isFunction(evlistener))\n      return 1;\n    else if (evlistener)\n      return evlistener.length;\n  }\n  return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n\n},{}],80:[function(require,module,exports){\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = nBytes * 8 - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = nBytes * 8 - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = (value * c - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n\n},{}],81:[function(require,module,exports){\nif (typeof Object.create === 'function') {\n  // implementation from standard node.js 'util' module\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  };\n} else {\n  // old school shim for old browsers\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    var TempCtor = function () {}\n    TempCtor.prototype = superCtor.prototype\n    ctor.prototype = new TempCtor()\n    ctor.prototype.constructor = ctor\n  }\n}\n\n},{}],82:[function(require,module,exports){\n/*!\n * Determine if an object is a Buffer\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\n\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nmodule.exports = function (obj) {\n  return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n}\n\nfunction isBuffer (obj) {\n  return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n  return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n}\n\n},{}],83:[function(require,module,exports){\nvar toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n\n},{}],84:[function(require,module,exports){\n'use strict';\n// private property\nvar _keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\n\n// public method for encoding\nexports.encode = function(input, utf8) {\n    var output = \"\";\n    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;\n    var i = 0;\n\n    while (i < input.length) {\n\n        chr1 = input.charCodeAt(i++);\n        chr2 = input.charCodeAt(i++);\n        chr3 = input.charCodeAt(i++);\n\n        enc1 = chr1 >> 2;\n        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n        enc4 = chr3 & 63;\n\n        if (isNaN(chr2)) {\n            enc3 = enc4 = 64;\n        }\n        else if (isNaN(chr3)) {\n            enc4 = 64;\n        }\n\n        output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);\n\n    }\n\n    return output;\n};\n\n// public method for decoding\nexports.decode = function(input, utf8) {\n    var output = \"\";\n    var chr1, chr2, chr3;\n    var enc1, enc2, enc3, enc4;\n    var i = 0;\n\n    input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\n    while (i < input.length) {\n\n        enc1 = _keyStr.indexOf(input.charAt(i++));\n        enc2 = _keyStr.indexOf(input.charAt(i++));\n        enc3 = _keyStr.indexOf(input.charAt(i++));\n        enc4 = _keyStr.indexOf(input.charAt(i++));\n\n        chr1 = (enc1 << 2) | (enc2 >> 4);\n        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n        chr3 = ((enc3 & 3) << 6) | enc4;\n\n        output = output + String.fromCharCode(chr1);\n\n        if (enc3 != 64) {\n            output = output + String.fromCharCode(chr2);\n        }\n        if (enc4 != 64) {\n            output = output + String.fromCharCode(chr3);\n        }\n\n    }\n\n    return output;\n\n};\n\n},{}],85:[function(require,module,exports){\n'use strict';\nfunction CompressedObject() {\n    this.compressedSize = 0;\n    this.uncompressedSize = 0;\n    this.crc32 = 0;\n    this.compressionMethod = null;\n    this.compressedContent = null;\n}\n\nCompressedObject.prototype = {\n    /**\n     * Return the decompressed content in an unspecified format.\n     * The format will depend on the decompressor.\n     * @return {Object} the decompressed content.\n     */\n    getContent: function() {\n        return null; // see implementation\n    },\n    /**\n     * Return the compressed content in an unspecified format.\n     * The format will depend on the compressed conten source.\n     * @return {Object} the compressed content.\n     */\n    getCompressedContent: function() {\n        return null; // see implementation\n    }\n};\nmodule.exports = CompressedObject;\n\n},{}],86:[function(require,module,exports){\n'use strict';\nexports.STORE = {\n    magic: \"\\x00\\x00\",\n    compress: function(content, compressionOptions) {\n        return content; // no compression\n    },\n    uncompress: function(content) {\n        return content; // no compression\n    },\n    compressInputType: null,\n    uncompressInputType: null\n};\nexports.DEFLATE = require('./flate');\n\n},{\"./flate\":91}],87:[function(require,module,exports){\n'use strict';\n\nvar utils = require('./utils');\n\nvar table = [\n    0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,\n    0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,\n    0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,\n    0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,\n    0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,\n    0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,\n    0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,\n    0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,\n    0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,\n    0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,\n    0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,\n    0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,\n    0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,\n    0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,\n    0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,\n    0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,\n    0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,\n    0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,\n    0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,\n    0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,\n    0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,\n    0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,\n    0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,\n    0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,\n    0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,\n    0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,\n    0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,\n    0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,\n    0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,\n    0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,\n    0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,\n    0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,\n    0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,\n    0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,\n    0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,\n    0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,\n    0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,\n    0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,\n    0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,\n    0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,\n    0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,\n    0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,\n    0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,\n    0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,\n    0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,\n    0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,\n    0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,\n    0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,\n    0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,\n    0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,\n    0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,\n    0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,\n    0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,\n    0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,\n    0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,\n    0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,\n    0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,\n    0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,\n    0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,\n    0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,\n    0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,\n    0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,\n    0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,\n    0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D\n];\n\n/**\n *\n *  Javascript crc32\n *  http://www.webtoolkit.info/\n *\n */\nmodule.exports = function crc32(input, crc) {\n    if (typeof input === \"undefined\" || !input.length) {\n        return 0;\n    }\n\n    var isArray = utils.getTypeOf(input) !== \"string\";\n\n    if (typeof(crc) == \"undefined\") {\n        crc = 0;\n    }\n    var x = 0;\n    var y = 0;\n    var b = 0;\n\n    crc = crc ^ (-1);\n    for (var i = 0, iTop = input.length; i < iTop; i++) {\n        b = isArray ? input[i] : input.charCodeAt(i);\n        y = (crc ^ b) & 0xFF;\n        x = table[y];\n        crc = (crc >>> 8) ^ x;\n    }\n\n    return crc ^ (-1);\n};\n// vim: set shiftwidth=4 softtabstop=4:\n\n},{\"./utils\":104}],88:[function(require,module,exports){\n'use strict';\nvar utils = require('./utils');\n\nfunction DataReader(data) {\n    this.data = null; // type : see implementation\n    this.length = 0;\n    this.index = 0;\n}\nDataReader.prototype = {\n    /**\n     * Check that the offset will not go too far.\n     * @param {string} offset the additional offset to check.\n     * @throws {Error} an Error if the offset is out of bounds.\n     */\n    checkOffset: function(offset) {\n        this.checkIndex(this.index + offset);\n    },\n    /**\n     * Check that the specifed index will not be too far.\n     * @param {string} newIndex the index to check.\n     * @throws {Error} an Error if the index is out of bounds.\n     */\n    checkIndex: function(newIndex) {\n        if (this.length < newIndex || newIndex < 0) {\n            throw new Error(\"End of data reached (data length = \" + this.length + \", asked index = \" + (newIndex) + \"). Corrupted zip ?\");\n        }\n    },\n    /**\n     * Change the index.\n     * @param {number} newIndex The new index.\n     * @throws {Error} if the new index is out of the data.\n     */\n    setIndex: function(newIndex) {\n        this.checkIndex(newIndex);\n        this.index = newIndex;\n    },\n    /**\n     * Skip the next n bytes.\n     * @param {number} n the number of bytes to skip.\n     * @throws {Error} if the new index is out of the data.\n     */\n    skip: function(n) {\n        this.setIndex(this.index + n);\n    },\n    /**\n     * Get the byte at the specified index.\n     * @param {number} i the index to use.\n     * @return {number} a byte.\n     */\n    byteAt: function(i) {\n        // see implementations\n    },\n    /**\n     * Get the next number with a given byte size.\n     * @param {number} size the number of bytes to read.\n     * @return {number} the corresponding number.\n     */\n    readInt: function(size) {\n        var result = 0,\n            i;\n        this.checkOffset(size);\n        for (i = this.index + size - 1; i >= this.index; i--) {\n            result = (result << 8) + this.byteAt(i);\n        }\n        this.index += size;\n        return result;\n    },\n    /**\n     * Get the next string with a given byte size.\n     * @param {number} size the number of bytes to read.\n     * @return {string} the corresponding string.\n     */\n    readString: function(size) {\n        return utils.transformTo(\"string\", this.readData(size));\n    },\n    /**\n     * Get raw data without conversion, <size> bytes.\n     * @param {number} size the number of bytes to read.\n     * @return {Object} the raw data, implementation specific.\n     */\n    readData: function(size) {\n        // see implementations\n    },\n    /**\n     * Find the last occurence of a zip signature (4 bytes).\n     * @param {string} sig the signature to find.\n     * @return {number} the index of the last occurence, -1 if not found.\n     */\n    lastIndexOfSignature: function(sig) {\n        // see implementations\n    },\n    /**\n     * Get the next date.\n     * @return {Date} the date.\n     */\n    readDate: function() {\n        var dostime = this.readInt(4);\n        return new Date(\n        ((dostime >> 25) & 0x7f) + 1980, // year\n        ((dostime >> 21) & 0x0f) - 1, // month\n        (dostime >> 16) & 0x1f, // day\n        (dostime >> 11) & 0x1f, // hour\n        (dostime >> 5) & 0x3f, // minute\n        (dostime & 0x1f) << 1); // second\n    }\n};\nmodule.exports = DataReader;\n\n},{\"./utils\":104}],89:[function(require,module,exports){\n'use strict';\nexports.base64 = false;\nexports.binary = false;\nexports.dir = false;\nexports.createFolders = false;\nexports.date = null;\nexports.compression = null;\nexports.compressionOptions = null;\nexports.comment = null;\nexports.unixPermissions = null;\nexports.dosPermissions = null;\n\n},{}],90:[function(require,module,exports){\n'use strict';\nvar utils = require('./utils');\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.string2binary = function(str) {\n    return utils.string2binary(str);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.string2Uint8Array = function(str) {\n    return utils.transformTo(\"uint8array\", str);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.uint8Array2String = function(array) {\n    return utils.transformTo(\"string\", array);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.string2Blob = function(str) {\n    var buffer = utils.transformTo(\"arraybuffer\", str);\n    return utils.arrayBuffer2Blob(buffer);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.arrayBuffer2Blob = function(buffer) {\n    return utils.arrayBuffer2Blob(buffer);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.transformTo = function(outputType, input) {\n    return utils.transformTo(outputType, input);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.getTypeOf = function(input) {\n    return utils.getTypeOf(input);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.checkSupport = function(type) {\n    return utils.checkSupport(type);\n};\n\n/**\n * @deprecated\n * This value will be removed in a future version without replacement.\n */\nexports.MAX_VALUE_16BITS = utils.MAX_VALUE_16BITS;\n\n/**\n * @deprecated\n * This value will be removed in a future version without replacement.\n */\nexports.MAX_VALUE_32BITS = utils.MAX_VALUE_32BITS;\n\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.pretty = function(str) {\n    return utils.pretty(str);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.findCompression = function(compressionMethod) {\n    return utils.findCompression(compressionMethod);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.isRegExp = function (object) {\n    return utils.isRegExp(object);\n};\n\n\n},{\"./utils\":104}],91:[function(require,module,exports){\n'use strict';\nvar USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined');\n\nvar pako = require(\"pako\");\nexports.uncompressInputType = USE_TYPEDARRAY ? \"uint8array\" : \"array\";\nexports.compressInputType = USE_TYPEDARRAY ? \"uint8array\" : \"array\";\n\nexports.magic = \"\\x08\\x00\";\nexports.compress = function(input, compressionOptions) {\n    return pako.deflateRaw(input, {\n        level : compressionOptions.level || -1 // default compression\n    });\n};\nexports.uncompress =  function(input) {\n    return pako.inflateRaw(input);\n};\n\n},{\"pako\":120}],92:[function(require,module,exports){\n'use strict';\n\nvar base64 = require('./base64');\n\n/**\nUsage:\n   zip = new JSZip();\n   zip.file(\"hello.txt\", \"Hello, World!\").file(\"tempfile\", \"nothing\");\n   zip.folder(\"images\").file(\"smile.gif\", base64Data, {base64: true});\n   zip.file(\"Xmas.txt\", \"Ho ho ho !\", {date : new Date(\"December 25, 2007 00:00:01\")});\n   zip.remove(\"tempfile\");\n\n   base64zip = zip.generate();\n\n**/\n\n/**\n * Representation a of zip file in js\n * @constructor\n * @param {String=|ArrayBuffer=|Uint8Array=} data the data to load, if any (optional).\n * @param {Object=} options the options for creating this objects (optional).\n */\nfunction JSZip(data, options) {\n    // if this constructor is used without `new`, it adds `new` before itself:\n    if(!(this instanceof JSZip)) return new JSZip(data, options);\n\n    // object containing the files :\n    // {\n    //   \"folder/\" : {...},\n    //   \"folder/data.txt\" : {...}\n    // }\n    this.files = {};\n\n    this.comment = null;\n\n    // Where we are in the hierarchy\n    this.root = \"\";\n    if (data) {\n        this.load(data, options);\n    }\n    this.clone = function() {\n        var newObj = new JSZip();\n        for (var i in this) {\n            if (typeof this[i] !== \"function\") {\n                newObj[i] = this[i];\n            }\n        }\n        return newObj;\n    };\n}\nJSZip.prototype = require('./object');\nJSZip.prototype.load = require('./load');\nJSZip.support = require('./support');\nJSZip.defaults = require('./defaults');\n\n/**\n * @deprecated\n * This namespace will be removed in a future version without replacement.\n */\nJSZip.utils = require('./deprecatedPublicUtils');\n\nJSZip.base64 = {\n    /**\n     * @deprecated\n     * This method will be removed in a future version without replacement.\n     */\n    encode : function(input) {\n        return base64.encode(input);\n    },\n    /**\n     * @deprecated\n     * This method will be removed in a future version without replacement.\n     */\n    decode : function(input) {\n        return base64.decode(input);\n    }\n};\nJSZip.compressions = require('./compressions');\nmodule.exports = JSZip;\n\n},{\"./base64\":84,\"./compressions\":86,\"./defaults\":89,\"./deprecatedPublicUtils\":90,\"./load\":93,\"./object\":96,\"./support\":100}],93:[function(require,module,exports){\n'use strict';\nvar base64 = require('./base64');\nvar ZipEntries = require('./zipEntries');\nmodule.exports = function(data, options) {\n    var files, zipEntries, i, input;\n    options = options || {};\n    if (options.base64) {\n        data = base64.decode(data);\n    }\n\n    zipEntries = new ZipEntries(data, options);\n    files = zipEntries.files;\n    for (i = 0; i < files.length; i++) {\n        input = files[i];\n        this.file(input.fileName, input.decompressed, {\n            binary: true,\n            optimizedBinaryString: true,\n            date: input.date,\n            dir: input.dir,\n            comment : input.fileComment.length ? input.fileComment : null,\n            unixPermissions : input.unixPermissions,\n            dosPermissions : input.dosPermissions,\n            createFolders: options.createFolders\n        });\n    }\n    if (zipEntries.zipComment.length) {\n        this.comment = zipEntries.zipComment;\n    }\n\n    return this;\n};\n\n},{\"./base64\":84,\"./zipEntries\":105}],94:[function(require,module,exports){\n(function (Buffer){\n'use strict';\nmodule.exports = function(data, encoding){\n    return new Buffer(data, encoding);\n};\nmodule.exports.test = function(b){\n    return Buffer.isBuffer(b);\n};\n\n}).call(this,require(\"buffer\").Buffer)\n},{\"buffer\":77}],95:[function(require,module,exports){\n'use strict';\nvar Uint8ArrayReader = require('./uint8ArrayReader');\n\nfunction NodeBufferReader(data) {\n    this.data = data;\n    this.length = this.data.length;\n    this.index = 0;\n}\nNodeBufferReader.prototype = new Uint8ArrayReader();\n\n/**\n * @see DataReader.readData\n */\nNodeBufferReader.prototype.readData = function(size) {\n    this.checkOffset(size);\n    var result = this.data.slice(this.index, this.index + size);\n    this.index += size;\n    return result;\n};\nmodule.exports = NodeBufferReader;\n\n},{\"./uint8ArrayReader\":101}],96:[function(require,module,exports){\n'use strict';\nvar support = require('./support');\nvar utils = require('./utils');\nvar crc32 = require('./crc32');\nvar signature = require('./signature');\nvar defaults = require('./defaults');\nvar base64 = require('./base64');\nvar compressions = require('./compressions');\nvar CompressedObject = require('./compressedObject');\nvar nodeBuffer = require('./nodeBuffer');\nvar utf8 = require('./utf8');\nvar StringWriter = require('./stringWriter');\nvar Uint8ArrayWriter = require('./uint8ArrayWriter');\n\n/**\n * Returns the raw data of a ZipObject, decompress the content if necessary.\n * @param {ZipObject} file the file to use.\n * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.\n */\nvar getRawData = function(file) {\n    if (file._data instanceof CompressedObject) {\n        file._data = file._data.getContent();\n        file.options.binary = true;\n        file.options.base64 = false;\n\n        if (utils.getTypeOf(file._data) === \"uint8array\") {\n            var copy = file._data;\n            // when reading an arraybuffer, the CompressedObject mechanism will keep it and subarray() a Uint8Array.\n            // if we request a file in the same format, we might get the same Uint8Array or its ArrayBuffer (the original zip file).\n            file._data = new Uint8Array(copy.length);\n            // with an empty Uint8Array, Opera fails with a \"Offset larger than array size\"\n            if (copy.length !== 0) {\n                file._data.set(copy, 0);\n            }\n        }\n    }\n    return file._data;\n};\n\n/**\n * Returns the data of a ZipObject in a binary form. If the content is an unicode string, encode it.\n * @param {ZipObject} file the file to use.\n * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.\n */\nvar getBinaryData = function(file) {\n    var result = getRawData(file),\n        type = utils.getTypeOf(result);\n    if (type === \"string\") {\n        if (!file.options.binary) {\n            // unicode text !\n            // unicode string => binary string is a painful process, check if we can avoid it.\n            if (support.nodebuffer) {\n                return nodeBuffer(result, \"utf-8\");\n            }\n        }\n        return file.asBinary();\n    }\n    return result;\n};\n\n/**\n * Transform this._data into a string.\n * @param {function} filter a function String -> String, applied if not null on the result.\n * @return {String} the string representing this._data.\n */\nvar dataToString = function(asUTF8) {\n    var result = getRawData(this);\n    if (result === null || typeof result === \"undefined\") {\n        return \"\";\n    }\n    // if the data is a base64 string, we decode it before checking the encoding !\n    if (this.options.base64) {\n        result = base64.decode(result);\n    }\n    if (asUTF8 && this.options.binary) {\n        // JSZip.prototype.utf8decode supports arrays as input\n        // skip to array => string step, utf8decode will do it.\n        result = out.utf8decode(result);\n    }\n    else {\n        // no utf8 transformation, do the array => string step.\n        result = utils.transformTo(\"string\", result);\n    }\n\n    if (!asUTF8 && !this.options.binary) {\n        result = utils.transformTo(\"string\", out.utf8encode(result));\n    }\n    return result;\n};\n/**\n * A simple object representing a file in the zip file.\n * @constructor\n * @param {string} name the name of the file\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data\n * @param {Object} options the options of the file\n */\nvar ZipObject = function(name, data, options) {\n    this.name = name;\n    this.dir = options.dir;\n    this.date = options.date;\n    this.comment = options.comment;\n    this.unixPermissions = options.unixPermissions;\n    this.dosPermissions = options.dosPermissions;\n\n    this._data = data;\n    this.options = options;\n\n    /*\n     * This object contains initial values for dir and date.\n     * With them, we can check if the user changed the deprecated metadata in\n     * `ZipObject#options` or not.\n     */\n    this._initialMetadata = {\n      dir : options.dir,\n      date : options.date\n    };\n};\n\nZipObject.prototype = {\n    /**\n     * Return the content as UTF8 string.\n     * @return {string} the UTF8 string.\n     */\n    asText: function() {\n        return dataToString.call(this, true);\n    },\n    /**\n     * Returns the binary content.\n     * @return {string} the content as binary.\n     */\n    asBinary: function() {\n        return dataToString.call(this, false);\n    },\n    /**\n     * Returns the content as a nodejs Buffer.\n     * @return {Buffer} the content as a Buffer.\n     */\n    asNodeBuffer: function() {\n        var result = getBinaryData(this);\n        return utils.transformTo(\"nodebuffer\", result);\n    },\n    /**\n     * Returns the content as an Uint8Array.\n     * @return {Uint8Array} the content as an Uint8Array.\n     */\n    asUint8Array: function() {\n        var result = getBinaryData(this);\n        return utils.transformTo(\"uint8array\", result);\n    },\n    /**\n     * Returns the content as an ArrayBuffer.\n     * @return {ArrayBuffer} the content as an ArrayBufer.\n     */\n    asArrayBuffer: function() {\n        return this.asUint8Array().buffer;\n    }\n};\n\n/**\n * Transform an integer into a string in hexadecimal.\n * @private\n * @param {number} dec the number to convert.\n * @param {number} bytes the number of bytes to generate.\n * @returns {string} the result.\n */\nvar decToHex = function(dec, bytes) {\n    var hex = \"\",\n        i;\n    for (i = 0; i < bytes; i++) {\n        hex += String.fromCharCode(dec & 0xff);\n        dec = dec >>> 8;\n    }\n    return hex;\n};\n\n/**\n * Merge the objects passed as parameters into a new one.\n * @private\n * @param {...Object} var_args All objects to merge.\n * @return {Object} a new object with the data of the others.\n */\nvar extend = function() {\n    var result = {}, i, attr;\n    for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers\n        for (attr in arguments[i]) {\n            if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === \"undefined\") {\n                result[attr] = arguments[i][attr];\n            }\n        }\n    }\n    return result;\n};\n\n/**\n * Transforms the (incomplete) options from the user into the complete\n * set of options to create a file.\n * @private\n * @param {Object} o the options from the user.\n * @return {Object} the complete set of options.\n */\nvar prepareFileAttrs = function(o) {\n    o = o || {};\n    if (o.base64 === true && (o.binary === null || o.binary === undefined)) {\n        o.binary = true;\n    }\n    o = extend(o, defaults);\n    o.date = o.date || new Date();\n    if (o.compression !== null) o.compression = o.compression.toUpperCase();\n\n    return o;\n};\n\n/**\n * Add a file in the current folder.\n * @private\n * @param {string} name the name of the file\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file\n * @param {Object} o the options of the file\n * @return {Object} the new file.\n */\nvar fileAdd = function(name, data, o) {\n    // be sure sub folders exist\n    var dataType = utils.getTypeOf(data),\n        parent;\n\n    o = prepareFileAttrs(o);\n\n    if (typeof o.unixPermissions === \"string\") {\n        o.unixPermissions = parseInt(o.unixPermissions, 8);\n    }\n\n    // UNX_IFDIR  0040000 see zipinfo.c\n    if (o.unixPermissions && (o.unixPermissions & 0x4000)) {\n        o.dir = true;\n    }\n    // Bit 4    Directory\n    if (o.dosPermissions && (o.dosPermissions & 0x0010)) {\n        o.dir = true;\n    }\n\n    if (o.dir) {\n        name = forceTrailingSlash(name);\n    }\n\n    if (o.createFolders && (parent = parentFolder(name))) {\n        folderAdd.call(this, parent, true);\n    }\n\n    if (o.dir || data === null || typeof data === \"undefined\") {\n        o.base64 = false;\n        o.binary = false;\n        data = null;\n        dataType = null;\n    }\n    else if (dataType === \"string\") {\n        if (o.binary && !o.base64) {\n            // optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask\n            if (o.optimizedBinaryString !== true) {\n                // this is a string, not in a base64 format.\n                // Be sure that this is a correct \"binary string\"\n                data = utils.string2binary(data);\n            }\n        }\n    }\n    else { // arraybuffer, uint8array, ...\n        o.base64 = false;\n        o.binary = true;\n\n        if (!dataType && !(data instanceof CompressedObject)) {\n            throw new Error(\"The data of '\" + name + \"' is in an unsupported format !\");\n        }\n\n        // special case : it's way easier to work with Uint8Array than with ArrayBuffer\n        if (dataType === \"arraybuffer\") {\n            data = utils.transformTo(\"uint8array\", data);\n        }\n    }\n\n    var object = new ZipObject(name, data, o);\n    this.files[name] = object;\n    return object;\n};\n\n/**\n * Find the parent folder of the path.\n * @private\n * @param {string} path the path to use\n * @return {string} the parent folder, or \"\"\n */\nvar parentFolder = function (path) {\n    if (path.slice(-1) == '/') {\n        path = path.substring(0, path.length - 1);\n    }\n    var lastSlash = path.lastIndexOf('/');\n    return (lastSlash > 0) ? path.substring(0, lastSlash) : \"\";\n};\n\n\n/**\n * Returns the path with a slash at the end.\n * @private\n * @param {String} path the path to check.\n * @return {String} the path with a trailing slash.\n */\nvar forceTrailingSlash = function(path) {\n    // Check the name ends with a /\n    if (path.slice(-1) != \"/\") {\n        path += \"/\"; // IE doesn't like substr(-1)\n    }\n    return path;\n};\n/**\n * Add a (sub) folder in the current folder.\n * @private\n * @param {string} name the folder's name\n * @param {boolean=} [createFolders] If true, automatically create sub\n *  folders. Defaults to false.\n * @return {Object} the new folder.\n */\nvar folderAdd = function(name, createFolders) {\n    createFolders = (typeof createFolders !== 'undefined') ? createFolders : false;\n\n    name = forceTrailingSlash(name);\n\n    // Does this folder already exist?\n    if (!this.files[name]) {\n        fileAdd.call(this, name, null, {\n            dir: true,\n            createFolders: createFolders\n        });\n    }\n    return this.files[name];\n};\n\n/**\n * Generate a JSZip.CompressedObject for a given zipOject.\n * @param {ZipObject} file the object to read.\n * @param {JSZip.compression} compression the compression to use.\n * @param {Object} compressionOptions the options to use when compressing.\n * @return {JSZip.CompressedObject} the compressed result.\n */\nvar generateCompressedObjectFrom = function(file, compression, compressionOptions) {\n    var result = new CompressedObject(),\n        content;\n\n    // the data has not been decompressed, we might reuse things !\n    if (file._data instanceof CompressedObject) {\n        result.uncompressedSize = file._data.uncompressedSize;\n        result.crc32 = file._data.crc32;\n\n        if (result.uncompressedSize === 0 || file.dir) {\n            compression = compressions['STORE'];\n            result.compressedContent = \"\";\n            result.crc32 = 0;\n        }\n        else if (file._data.compressionMethod === compression.magic) {\n            result.compressedContent = file._data.getCompressedContent();\n        }\n        else {\n            content = file._data.getContent();\n            // need to decompress / recompress\n            result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions);\n        }\n    }\n    else {\n        // have uncompressed data\n        content = getBinaryData(file);\n        if (!content || content.length === 0 || file.dir) {\n            compression = compressions['STORE'];\n            content = \"\";\n        }\n        result.uncompressedSize = content.length;\n        result.crc32 = crc32(content);\n        result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions);\n    }\n\n    result.compressedSize = result.compressedContent.length;\n    result.compressionMethod = compression.magic;\n\n    return result;\n};\n\n\n\n\n/**\n * Generate the UNIX part of the external file attributes.\n * @param {Object} unixPermissions the unix permissions or null.\n * @param {Boolean} isDir true if the entry is a directory, false otherwise.\n * @return {Number} a 32 bit integer.\n *\n * adapted from http://unix.stackexchange.com/questions/14705/the-zip-formats-external-file-attribute :\n *\n * TTTTsstrwxrwxrwx0000000000ADVSHR\n * ^^^^____________________________ file type, see zipinfo.c (UNX_*)\n *     ^^^_________________________ setuid, setgid, sticky\n *        ^^^^^^^^^________________ permissions\n *                 ^^^^^^^^^^______ not used ?\n *                           ^^^^^^ DOS attribute bits : Archive, Directory, Volume label, System file, Hidden, Read only\n */\nvar generateUnixExternalFileAttr = function (unixPermissions, isDir) {\n\n    var result = unixPermissions;\n    if (!unixPermissions) {\n        // I can't use octal values in strict mode, hence the hexa.\n        //  040775 => 0x41fd\n        // 0100664 => 0x81b4\n        result = isDir ? 0x41fd : 0x81b4;\n    }\n\n    return (result & 0xFFFF) << 16;\n};\n\n/**\n * Generate the DOS part of the external file attributes.\n * @param {Object} dosPermissions the dos permissions or null.\n * @param {Boolean} isDir true if the entry is a directory, false otherwise.\n * @return {Number} a 32 bit integer.\n *\n * Bit 0     Read-Only\n * Bit 1     Hidden\n * Bit 2     System\n * Bit 3     Volume Label\n * Bit 4     Directory\n * Bit 5     Archive\n */\nvar generateDosExternalFileAttr = function (dosPermissions, isDir) {\n\n    // the dir flag is already set for compatibility\n\n    return (dosPermissions || 0)  & 0x3F;\n};\n\n/**\n * Generate the various parts used in the construction of the final zip file.\n * @param {string} name the file name.\n * @param {ZipObject} file the file content.\n * @param {JSZip.CompressedObject} compressedObject the compressed object.\n * @param {number} offset the current offset from the start of the zip file.\n * @param {String} platform let's pretend we are this platform (change platform dependents fields)\n * @return {object} the zip parts.\n */\nvar generateZipParts = function(name, file, compressedObject, offset, platform) {\n    var data = compressedObject.compressedContent,\n        utfEncodedFileName = utils.transformTo(\"string\", utf8.utf8encode(file.name)),\n        comment = file.comment || \"\",\n        utfEncodedComment = utils.transformTo(\"string\", utf8.utf8encode(comment)),\n        useUTF8ForFileName = utfEncodedFileName.length !== file.name.length,\n        useUTF8ForComment = utfEncodedComment.length !== comment.length,\n        o = file.options,\n        dosTime,\n        dosDate,\n        extraFields = \"\",\n        unicodePathExtraField = \"\",\n        unicodeCommentExtraField = \"\",\n        dir, date;\n\n\n    // handle the deprecated options.dir\n    if (file._initialMetadata.dir !== file.dir) {\n        dir = file.dir;\n    } else {\n        dir = o.dir;\n    }\n\n    // handle the deprecated options.date\n    if(file._initialMetadata.date !== file.date) {\n        date = file.date;\n    } else {\n        date = o.date;\n    }\n\n    var extFileAttr = 0;\n    var versionMadeBy = 0;\n    if (dir) {\n        // dos or unix, we set the dos dir flag\n        extFileAttr |= 0x00010;\n    }\n    if(platform === \"UNIX\") {\n        versionMadeBy = 0x031E; // UNIX, version 3.0\n        extFileAttr |= generateUnixExternalFileAttr(file.unixPermissions, dir);\n    } else { // DOS or other, fallback to DOS\n        versionMadeBy = 0x0014; // DOS, version 2.0\n        extFileAttr |= generateDosExternalFileAttr(file.dosPermissions, dir);\n    }\n\n    // date\n    // @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html\n    // @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html\n    // @see http://www.delorie.com/djgpp/doc/rbinter/it/66/16.html\n\n    dosTime = date.getHours();\n    dosTime = dosTime << 6;\n    dosTime = dosTime | date.getMinutes();\n    dosTime = dosTime << 5;\n    dosTime = dosTime | date.getSeconds() / 2;\n\n    dosDate = date.getFullYear() - 1980;\n    dosDate = dosDate << 4;\n    dosDate = dosDate | (date.getMonth() + 1);\n    dosDate = dosDate << 5;\n    dosDate = dosDate | date.getDate();\n\n    if (useUTF8ForFileName) {\n        // set the unicode path extra field. unzip needs at least one extra\n        // field to correctly handle unicode path, so using the path is as good\n        // as any other information. This could improve the situation with\n        // other archive managers too.\n        // This field is usually used without the utf8 flag, with a non\n        // unicode path in the header (winrar, winzip). This helps (a bit)\n        // with the messy Windows' default compressed folders feature but\n        // breaks on p7zip which doesn't seek the unicode path extra field.\n        // So for now, UTF-8 everywhere !\n        unicodePathExtraField =\n            // Version\n            decToHex(1, 1) +\n            // NameCRC32\n            decToHex(crc32(utfEncodedFileName), 4) +\n            // UnicodeName\n            utfEncodedFileName;\n\n        extraFields +=\n            // Info-ZIP Unicode Path Extra Field\n            \"\\x75\\x70\" +\n            // size\n            decToHex(unicodePathExtraField.length, 2) +\n            // content\n            unicodePathExtraField;\n    }\n\n    if(useUTF8ForComment) {\n\n        unicodeCommentExtraField =\n            // Version\n            decToHex(1, 1) +\n            // CommentCRC32\n            decToHex(this.crc32(utfEncodedComment), 4) +\n            // UnicodeName\n            utfEncodedComment;\n\n        extraFields +=\n            // Info-ZIP Unicode Path Extra Field\n            \"\\x75\\x63\" +\n            // size\n            decToHex(unicodeCommentExtraField.length, 2) +\n            // content\n            unicodeCommentExtraField;\n    }\n\n    var header = \"\";\n\n    // version needed to extract\n    header += \"\\x0A\\x00\";\n    // general purpose bit flag\n    // set bit 11 if utf8\n    header += (useUTF8ForFileName || useUTF8ForComment) ? \"\\x00\\x08\" : \"\\x00\\x00\";\n    // compression method\n    header += compressedObject.compressionMethod;\n    // last mod file time\n    header += decToHex(dosTime, 2);\n    // last mod file date\n    header += decToHex(dosDate, 2);\n    // crc-32\n    header += decToHex(compressedObject.crc32, 4);\n    // compressed size\n    header += decToHex(compressedObject.compressedSize, 4);\n    // uncompressed size\n    header += decToHex(compressedObject.uncompressedSize, 4);\n    // file name length\n    header += decToHex(utfEncodedFileName.length, 2);\n    // extra field length\n    header += decToHex(extraFields.length, 2);\n\n\n    var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName + extraFields;\n\n    var dirRecord = signature.CENTRAL_FILE_HEADER +\n    // version made by (00: DOS)\n    decToHex(versionMadeBy, 2) +\n    // file header (common to file and central directory)\n    header +\n    // file comment length\n    decToHex(utfEncodedComment.length, 2) +\n    // disk number start\n    \"\\x00\\x00\" +\n    // internal file attributes TODO\n    \"\\x00\\x00\" +\n    // external file attributes\n    decToHex(extFileAttr, 4) +\n    // relative offset of local header\n    decToHex(offset, 4) +\n    // file name\n    utfEncodedFileName +\n    // extra field\n    extraFields +\n    // file comment\n    utfEncodedComment;\n\n    return {\n        fileRecord: fileRecord,\n        dirRecord: dirRecord,\n        compressedObject: compressedObject\n    };\n};\n\n\n// return the actual prototype of JSZip\nvar out = {\n    /**\n     * Read an existing zip and merge the data in the current JSZip object.\n     * The implementation is in jszip-load.js, don't forget to include it.\n     * @param {String|ArrayBuffer|Uint8Array|Buffer} stream  The stream to load\n     * @param {Object} options Options for loading the stream.\n     *  options.base64 : is the stream in base64 ? default : false\n     * @return {JSZip} the current JSZip object\n     */\n    load: function(stream, options) {\n        throw new Error(\"Load method is not defined. Is the file jszip-load.js included ?\");\n    },\n\n    /**\n     * Filter nested files/folders with the specified function.\n     * @param {Function} search the predicate to use :\n     * function (relativePath, file) {...}\n     * It takes 2 arguments : the relative path and the file.\n     * @return {Array} An array of matching elements.\n     */\n    filter: function(search) {\n        var result = [],\n            filename, relativePath, file, fileClone;\n        for (filename in this.files) {\n            if (!this.files.hasOwnProperty(filename)) {\n                continue;\n            }\n            file = this.files[filename];\n            // return a new object, don't let the user mess with our internal objects :)\n            fileClone = new ZipObject(file.name, file._data, extend(file.options));\n            relativePath = filename.slice(this.root.length, filename.length);\n            if (filename.slice(0, this.root.length) === this.root && // the file is in the current root\n            search(relativePath, fileClone)) { // and the file matches the function\n                result.push(fileClone);\n            }\n        }\n        return result;\n    },\n\n    /**\n     * Add a file to the zip file, or search a file.\n     * @param   {string|RegExp} name The name of the file to add (if data is defined),\n     * the name of the file to find (if no data) or a regex to match files.\n     * @param   {String|ArrayBuffer|Uint8Array|Buffer} data  The file data, either raw or base64 encoded\n     * @param   {Object} o     File options\n     * @return  {JSZip|Object|Array} this JSZip object (when adding a file),\n     * a file (when searching by string) or an array of files (when searching by regex).\n     */\n    file: function(name, data, o) {\n        if (arguments.length === 1) {\n            if (utils.isRegExp(name)) {\n                var regexp = name;\n                return this.filter(function(relativePath, file) {\n                    return !file.dir && regexp.test(relativePath);\n                });\n            }\n            else { // text\n                return this.filter(function(relativePath, file) {\n                    return !file.dir && relativePath === name;\n                })[0] || null;\n            }\n        }\n        else { // more than one argument : we have data !\n            name = this.root + name;\n            fileAdd.call(this, name, data, o);\n        }\n        return this;\n    },\n\n    /**\n     * Add a directory to the zip file, or search.\n     * @param   {String|RegExp} arg The name of the directory to add, or a regex to search folders.\n     * @return  {JSZip} an object with the new directory as the root, or an array containing matching folders.\n     */\n    folder: function(arg) {\n        if (!arg) {\n            return this;\n        }\n\n        if (utils.isRegExp(arg)) {\n            return this.filter(function(relativePath, file) {\n                return file.dir && arg.test(relativePath);\n            });\n        }\n\n        // else, name is a new folder\n        var name = this.root + arg;\n        var newFolder = folderAdd.call(this, name);\n\n        // Allow chaining by returning a new object with this folder as the root\n        var ret = this.clone();\n        ret.root = newFolder.name;\n        return ret;\n    },\n\n    /**\n     * Delete a file, or a directory and all sub-files, from the zip\n     * @param {string} name the name of the file to delete\n     * @return {JSZip} this JSZip object\n     */\n    remove: function(name) {\n        name = this.root + name;\n        var file = this.files[name];\n        if (!file) {\n            // Look for any folders\n            if (name.slice(-1) != \"/\") {\n                name += \"/\";\n            }\n            file = this.files[name];\n        }\n\n        if (file && !file.dir) {\n            // file\n            delete this.files[name];\n        } else {\n            // maybe a folder, delete recursively\n            var kids = this.filter(function(relativePath, file) {\n                return file.name.slice(0, name.length) === name;\n            });\n            for (var i = 0; i < kids.length; i++) {\n                delete this.files[kids[i].name];\n            }\n        }\n\n        return this;\n    },\n\n    /**\n     * Generate the complete zip file\n     * @param {Object} options the options to generate the zip file :\n     * - base64, (deprecated, use type instead) true to generate base64.\n     * - compression, \"STORE\" by default.\n     * - type, \"base64\" by default. Values are : string, base64, uint8array, arraybuffer, blob.\n     * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file\n     */\n    generate: function(options) {\n        options = extend(options || {}, {\n            base64: true,\n            compression: \"STORE\",\n            compressionOptions : null,\n            type: \"base64\",\n            platform: \"DOS\",\n            comment: null,\n            mimeType: 'application/zip'\n        });\n\n        utils.checkSupport(options.type);\n\n        // accept nodejs `process.platform`\n        if(\n          options.platform === 'darwin' ||\n          options.platform === 'freebsd' ||\n          options.platform === 'linux' ||\n          options.platform === 'sunos'\n        ) {\n          options.platform = \"UNIX\";\n        }\n        if (options.platform === 'win32') {\n          options.platform = \"DOS\";\n        }\n\n        var zipData = [],\n            localDirLength = 0,\n            centralDirLength = 0,\n            writer, i,\n            utfEncodedComment = utils.transformTo(\"string\", this.utf8encode(options.comment || this.comment || \"\"));\n\n        // first, generate all the zip parts.\n        for (var name in this.files) {\n            if (!this.files.hasOwnProperty(name)) {\n                continue;\n            }\n            var file = this.files[name];\n\n            var compressionName = file.options.compression || options.compression.toUpperCase();\n            var compression = compressions[compressionName];\n            if (!compression) {\n                throw new Error(compressionName + \" is not a valid compression method !\");\n            }\n            var compressionOptions = file.options.compressionOptions || options.compressionOptions || {};\n\n            var compressedObject = generateCompressedObjectFrom.call(this, file, compression, compressionOptions);\n\n            var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength, options.platform);\n            localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize;\n            centralDirLength += zipPart.dirRecord.length;\n            zipData.push(zipPart);\n        }\n\n        var dirEnd = \"\";\n\n        // end of central dir signature\n        dirEnd = signature.CENTRAL_DIRECTORY_END +\n        // number of this disk\n        \"\\x00\\x00\" +\n        // number of the disk with the start of the central directory\n        \"\\x00\\x00\" +\n        // total number of entries in the central directory on this disk\n        decToHex(zipData.length, 2) +\n        // total number of entries in the central directory\n        decToHex(zipData.length, 2) +\n        // size of the central directory   4 bytes\n        decToHex(centralDirLength, 4) +\n        // offset of start of central directory with respect to the starting disk number\n        decToHex(localDirLength, 4) +\n        // .ZIP file comment length\n        decToHex(utfEncodedComment.length, 2) +\n        // .ZIP file comment\n        utfEncodedComment;\n\n\n        // we have all the parts (and the total length)\n        // time to create a writer !\n        var typeName = options.type.toLowerCase();\n        if(typeName===\"uint8array\"||typeName===\"arraybuffer\"||typeName===\"blob\"||typeName===\"nodebuffer\") {\n            writer = new Uint8ArrayWriter(localDirLength + centralDirLength + dirEnd.length);\n        }else{\n            writer = new StringWriter(localDirLength + centralDirLength + dirEnd.length);\n        }\n\n        for (i = 0; i < zipData.length; i++) {\n            writer.append(zipData[i].fileRecord);\n            writer.append(zipData[i].compressedObject.compressedContent);\n        }\n        for (i = 0; i < zipData.length; i++) {\n            writer.append(zipData[i].dirRecord);\n        }\n\n        writer.append(dirEnd);\n\n        var zip = writer.finalize();\n\n\n\n        switch(options.type.toLowerCase()) {\n            // case \"zip is an Uint8Array\"\n            case \"uint8array\" :\n            case \"arraybuffer\" :\n            case \"nodebuffer\" :\n               return utils.transformTo(options.type.toLowerCase(), zip);\n            case \"blob\" :\n               return utils.arrayBuffer2Blob(utils.transformTo(\"arraybuffer\", zip), options.mimeType);\n            // case \"zip is a string\"\n            case \"base64\" :\n               return (options.base64) ? base64.encode(zip) : zip;\n            default : // case \"string\" :\n               return zip;\n         }\n\n    },\n\n    /**\n     * @deprecated\n     * This method will be removed in a future version without replacement.\n     */\n    crc32: function (input, crc) {\n        return crc32(input, crc);\n    },\n\n    /**\n     * @deprecated\n     * This method will be removed in a future version without replacement.\n     */\n    utf8encode: function (string) {\n        return utils.transformTo(\"string\", utf8.utf8encode(string));\n    },\n\n    /**\n     * @deprecated\n     * This method will be removed in a future version without replacement.\n     */\n    utf8decode: function (input) {\n        return utf8.utf8decode(input);\n    }\n};\nmodule.exports = out;\n\n},{\"./base64\":84,\"./compressedObject\":85,\"./compressions\":86,\"./crc32\":87,\"./defaults\":89,\"./nodeBuffer\":94,\"./signature\":97,\"./stringWriter\":99,\"./support\":100,\"./uint8ArrayWriter\":102,\"./utf8\":103,\"./utils\":104}],97:[function(require,module,exports){\n'use strict';\nexports.LOCAL_FILE_HEADER = \"PK\\x03\\x04\";\nexports.CENTRAL_FILE_HEADER = \"PK\\x01\\x02\";\nexports.CENTRAL_DIRECTORY_END = \"PK\\x05\\x06\";\nexports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = \"PK\\x06\\x07\";\nexports.ZIP64_CENTRAL_DIRECTORY_END = \"PK\\x06\\x06\";\nexports.DATA_DESCRIPTOR = \"PK\\x07\\x08\";\n\n},{}],98:[function(require,module,exports){\n'use strict';\nvar DataReader = require('./dataReader');\nvar utils = require('./utils');\n\nfunction StringReader(data, optimizedBinaryString) {\n    this.data = data;\n    if (!optimizedBinaryString) {\n        this.data = utils.string2binary(this.data);\n    }\n    this.length = this.data.length;\n    this.index = 0;\n}\nStringReader.prototype = new DataReader();\n/**\n * @see DataReader.byteAt\n */\nStringReader.prototype.byteAt = function(i) {\n    return this.data.charCodeAt(i);\n};\n/**\n * @see DataReader.lastIndexOfSignature\n */\nStringReader.prototype.lastIndexOfSignature = function(sig) {\n    return this.data.lastIndexOf(sig);\n};\n/**\n * @see DataReader.readData\n */\nStringReader.prototype.readData = function(size) {\n    this.checkOffset(size);\n    // this will work because the constructor applied the \"& 0xff\" mask.\n    var result = this.data.slice(this.index, this.index + size);\n    this.index += size;\n    return result;\n};\nmodule.exports = StringReader;\n\n},{\"./dataReader\":88,\"./utils\":104}],99:[function(require,module,exports){\n'use strict';\n\nvar utils = require('./utils');\n\n/**\n * An object to write any content to a string.\n * @constructor\n */\nvar StringWriter = function() {\n    this.data = [];\n};\nStringWriter.prototype = {\n    /**\n     * Append any content to the current string.\n     * @param {Object} input the content to add.\n     */\n    append: function(input) {\n        input = utils.transformTo(\"string\", input);\n        this.data.push(input);\n    },\n    /**\n     * Finalize the construction an return the result.\n     * @return {string} the generated string.\n     */\n    finalize: function() {\n        return this.data.join(\"\");\n    }\n};\n\nmodule.exports = StringWriter;\n\n},{\"./utils\":104}],100:[function(require,module,exports){\n(function (Buffer){\n'use strict';\nexports.base64 = true;\nexports.array = true;\nexports.string = true;\nexports.arraybuffer = typeof ArrayBuffer !== \"undefined\" && typeof Uint8Array !== \"undefined\";\n// contains true if JSZip can read/generate nodejs Buffer, false otherwise.\n// Browserify will provide a Buffer implementation for browsers, which is\n// an augmented Uint8Array (i.e., can be used as either Buffer or U8).\nexports.nodebuffer = typeof Buffer !== \"undefined\";\n// contains true if JSZip can read/generate Uint8Array, false otherwise.\nexports.uint8array = typeof Uint8Array !== \"undefined\";\n\nif (typeof ArrayBuffer === \"undefined\") {\n    exports.blob = false;\n}\nelse {\n    var buffer = new ArrayBuffer(0);\n    try {\n        exports.blob = new Blob([buffer], {\n            type: \"application/zip\"\n        }).size === 0;\n    }\n    catch (e) {\n        try {\n            var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\n            var builder = new Builder();\n            builder.append(buffer);\n            exports.blob = builder.getBlob('application/zip').size === 0;\n        }\n        catch (e) {\n            exports.blob = false;\n        }\n    }\n}\n\n}).call(this,require(\"buffer\").Buffer)\n},{\"buffer\":77}],101:[function(require,module,exports){\n'use strict';\nvar DataReader = require('./dataReader');\n\nfunction Uint8ArrayReader(data) {\n    if (data) {\n        this.data = data;\n        this.length = this.data.length;\n        this.index = 0;\n    }\n}\nUint8ArrayReader.prototype = new DataReader();\n/**\n * @see DataReader.byteAt\n */\nUint8ArrayReader.prototype.byteAt = function(i) {\n    return this.data[i];\n};\n/**\n * @see DataReader.lastIndexOfSignature\n */\nUint8ArrayReader.prototype.lastIndexOfSignature = function(sig) {\n    var sig0 = sig.charCodeAt(0),\n        sig1 = sig.charCodeAt(1),\n        sig2 = sig.charCodeAt(2),\n        sig3 = sig.charCodeAt(3);\n    for (var i = this.length - 4; i >= 0; --i) {\n        if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) {\n            return i;\n        }\n    }\n\n    return -1;\n};\n/**\n * @see DataReader.readData\n */\nUint8ArrayReader.prototype.readData = function(size) {\n    this.checkOffset(size);\n    if(size === 0) {\n        // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of [].\n        return new Uint8Array(0);\n    }\n    var result = this.data.subarray(this.index, this.index + size);\n    this.index += size;\n    return result;\n};\nmodule.exports = Uint8ArrayReader;\n\n},{\"./dataReader\":88}],102:[function(require,module,exports){\n'use strict';\n\nvar utils = require('./utils');\n\n/**\n * An object to write any content to an Uint8Array.\n * @constructor\n * @param {number} length The length of the array.\n */\nvar Uint8ArrayWriter = function(length) {\n    this.data = new Uint8Array(length);\n    this.index = 0;\n};\nUint8ArrayWriter.prototype = {\n    /**\n     * Append any content to the current array.\n     * @param {Object} input the content to add.\n     */\n    append: function(input) {\n        if (input.length !== 0) {\n            // with an empty Uint8Array, Opera fails with a \"Offset larger than array size\"\n            input = utils.transformTo(\"uint8array\", input);\n            this.data.set(input, this.index);\n            this.index += input.length;\n        }\n    },\n    /**\n     * Finalize the construction an return the result.\n     * @return {Uint8Array} the generated array.\n     */\n    finalize: function() {\n        return this.data;\n    }\n};\n\nmodule.exports = Uint8ArrayWriter;\n\n},{\"./utils\":104}],103:[function(require,module,exports){\n'use strict';\n\nvar utils = require('./utils');\nvar support = require('./support');\nvar nodeBuffer = require('./nodeBuffer');\n\n/**\n * The following functions come from pako, from pako/lib/utils/strings\n * released under the MIT license, see pako https://github.com/nodeca/pako/\n */\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nvar _utf8len = new Array(256);\nfor (var i=0; i<256; i++) {\n  _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);\n}\n_utf8len[254]=_utf8len[254]=1; // Invalid sequence start\n\n// convert string to array (typed, when possible)\nvar string2buf = function (str) {\n    var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n    // count binary size\n    for (m_pos = 0; m_pos < str_len; m_pos++) {\n        c = str.charCodeAt(m_pos);\n        if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {\n            c2 = str.charCodeAt(m_pos+1);\n            if ((c2 & 0xfc00) === 0xdc00) {\n                c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n                m_pos++;\n            }\n        }\n        buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n    }\n\n    // allocate buffer\n    if (support.uint8array) {\n        buf = new Uint8Array(buf_len);\n    } else {\n        buf = new Array(buf_len);\n    }\n\n    // convert\n    for (i=0, m_pos = 0; i < buf_len; m_pos++) {\n        c = str.charCodeAt(m_pos);\n        if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {\n            c2 = str.charCodeAt(m_pos+1);\n            if ((c2 & 0xfc00) === 0xdc00) {\n                c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n                m_pos++;\n            }\n        }\n        if (c < 0x80) {\n            /* one byte */\n            buf[i++] = c;\n        } else if (c < 0x800) {\n            /* two bytes */\n            buf[i++] = 0xC0 | (c >>> 6);\n            buf[i++] = 0x80 | (c & 0x3f);\n        } else if (c < 0x10000) {\n            /* three bytes */\n            buf[i++] = 0xE0 | (c >>> 12);\n            buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n            buf[i++] = 0x80 | (c & 0x3f);\n        } else {\n            /* four bytes */\n            buf[i++] = 0xf0 | (c >>> 18);\n            buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n            buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n            buf[i++] = 0x80 | (c & 0x3f);\n        }\n    }\n\n    return buf;\n};\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max   - length limit (mandatory);\nvar utf8border = function(buf, max) {\n    var pos;\n\n    max = max || buf.length;\n    if (max > buf.length) { max = buf.length; }\n\n    // go back from last position, until start of sequence found\n    pos = max-1;\n    while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n    // Fuckup - very small and broken sequence,\n    // return max, because we should return something anyway.\n    if (pos < 0) { return max; }\n\n    // If we came to start of buffer - that means vuffer is too small,\n    // return max too.\n    if (pos === 0) { return max; }\n\n    return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\n// convert array to string\nvar buf2string = function (buf) {\n    var str, i, out, c, c_len;\n    var len = buf.length;\n\n    // Reserve max possible length (2 words per char)\n    // NB: by unknown reasons, Array is significantly faster for\n    //     String.fromCharCode.apply than Uint16Array.\n    var utf16buf = new Array(len*2);\n\n    for (out=0, i=0; i<len;) {\n        c = buf[i++];\n        // quick process ascii\n        if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n        c_len = _utf8len[c];\n        // skip 5 & 6 byte codes\n        if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }\n\n        // apply mask on first byte\n        c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n        // join the rest\n        while (c_len > 1 && i < len) {\n            c = (c << 6) | (buf[i++] & 0x3f);\n            c_len--;\n        }\n\n        // terminated by end of string?\n        if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n        if (c < 0x10000) {\n            utf16buf[out++] = c;\n        } else {\n            c -= 0x10000;\n            utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n            utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n        }\n    }\n\n    // shrinkBuf(utf16buf, out)\n    if (utf16buf.length !== out) {\n        if(utf16buf.subarray) {\n            utf16buf = utf16buf.subarray(0, out);\n        } else {\n            utf16buf.length = out;\n        }\n    }\n\n    // return String.fromCharCode.apply(null, utf16buf);\n    return utils.applyFromCharCode(utf16buf);\n};\n\n\n// That's all for the pako functions.\n\n\n/**\n * Transform a javascript string into an array (typed if possible) of bytes,\n * UTF-8 encoded.\n * @param {String} str the string to encode\n * @return {Array|Uint8Array|Buffer} the UTF-8 encoded string.\n */\nexports.utf8encode = function utf8encode(str) {\n    if (support.nodebuffer) {\n        return nodeBuffer(str, \"utf-8\");\n    }\n\n    return string2buf(str);\n};\n\n\n/**\n * Transform a bytes array (or a representation) representing an UTF-8 encoded\n * string into a javascript string.\n * @param {Array|Uint8Array|Buffer} buf the data de decode\n * @return {String} the decoded string.\n */\nexports.utf8decode = function utf8decode(buf) {\n    if (support.nodebuffer) {\n        return utils.transformTo(\"nodebuffer\", buf).toString(\"utf-8\");\n    }\n\n    buf = utils.transformTo(support.uint8array ? \"uint8array\" : \"array\", buf);\n\n    // return buf2string(buf);\n    // Chrome prefers to work with \"small\" chunks of data\n    // for the method buf2string.\n    // Firefox and Chrome has their own shortcut, IE doesn't seem to really care.\n    var result = [], k = 0, len = buf.length, chunk = 65536;\n    while (k < len) {\n        var nextBoundary = utf8border(buf, Math.min(k + chunk, len));\n        if (support.uint8array) {\n            result.push(buf2string(buf.subarray(k, nextBoundary)));\n        } else {\n            result.push(buf2string(buf.slice(k, nextBoundary)));\n        }\n        k = nextBoundary;\n    }\n    return result.join(\"\");\n\n};\n// vim: set shiftwidth=4 softtabstop=4:\n\n},{\"./nodeBuffer\":94,\"./support\":100,\"./utils\":104}],104:[function(require,module,exports){\n'use strict';\nvar support = require('./support');\nvar compressions = require('./compressions');\nvar nodeBuffer = require('./nodeBuffer');\n/**\n * Convert a string to a \"binary string\" : a string containing only char codes between 0 and 255.\n * @param {string} str the string to transform.\n * @return {String} the binary string.\n */\nexports.string2binary = function(str) {\n    var result = \"\";\n    for (var i = 0; i < str.length; i++) {\n        result += String.fromCharCode(str.charCodeAt(i) & 0xff);\n    }\n    return result;\n};\nexports.arrayBuffer2Blob = function(buffer, mimeType) {\n    exports.checkSupport(\"blob\");\n\tmimeType = mimeType || 'application/zip';\n\n    try {\n        // Blob constructor\n        return new Blob([buffer], {\n            type: mimeType\n        });\n    }\n    catch (e) {\n\n        try {\n            // deprecated, browser only, old way\n            var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\n            var builder = new Builder();\n            builder.append(buffer);\n            return builder.getBlob(mimeType);\n        }\n        catch (e) {\n\n            // well, fuck ?!\n            throw new Error(\"Bug : can't construct the Blob.\");\n        }\n    }\n\n\n};\n/**\n * The identity function.\n * @param {Object} input the input.\n * @return {Object} the same input.\n */\nfunction identity(input) {\n    return input;\n}\n\n/**\n * Fill in an array with a string.\n * @param {String} str the string to use.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated).\n * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array.\n */\nfunction stringToArrayLike(str, array) {\n    for (var i = 0; i < str.length; ++i) {\n        array[i] = str.charCodeAt(i) & 0xFF;\n    }\n    return array;\n}\n\n/**\n * Transform an array-like object to a string.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.\n * @return {String} the result.\n */\nfunction arrayLikeToString(array) {\n    // Performances notes :\n    // --------------------\n    // String.fromCharCode.apply(null, array) is the fastest, see\n    // see http://jsperf.com/converting-a-uint8array-to-a-string/2\n    // but the stack is limited (and we can get huge arrays !).\n    //\n    // result += String.fromCharCode(array[i]); generate too many strings !\n    //\n    // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2\n    var chunk = 65536;\n    var result = [],\n        len = array.length,\n        type = exports.getTypeOf(array),\n        k = 0,\n        canUseApply = true;\n      try {\n         switch(type) {\n            case \"uint8array\":\n               String.fromCharCode.apply(null, new Uint8Array(0));\n               break;\n            case \"nodebuffer\":\n               String.fromCharCode.apply(null, nodeBuffer(0));\n               break;\n         }\n      } catch(e) {\n         canUseApply = false;\n      }\n\n      // no apply : slow and painful algorithm\n      // default browser on android 4.*\n      if (!canUseApply) {\n         var resultStr = \"\";\n         for(var i = 0; i < array.length;i++) {\n            resultStr += String.fromCharCode(array[i]);\n         }\n    return resultStr;\n    }\n    while (k < len && chunk > 1) {\n        try {\n            if (type === \"array\" || type === \"nodebuffer\") {\n                result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len))));\n            }\n            else {\n                result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len))));\n            }\n            k += chunk;\n        }\n        catch (e) {\n            chunk = Math.floor(chunk / 2);\n        }\n    }\n    return result.join(\"\");\n}\n\nexports.applyFromCharCode = arrayLikeToString;\n\n\n/**\n * Copy the data from an array-like to an other array-like.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated.\n * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array.\n */\nfunction arrayLikeToArrayLike(arrayFrom, arrayTo) {\n    for (var i = 0; i < arrayFrom.length; i++) {\n        arrayTo[i] = arrayFrom[i];\n    }\n    return arrayTo;\n}\n\n// a matrix containing functions to transform everything into everything.\nvar transform = {};\n\n// string to ?\ntransform[\"string\"] = {\n    \"string\": identity,\n    \"array\": function(input) {\n        return stringToArrayLike(input, new Array(input.length));\n    },\n    \"arraybuffer\": function(input) {\n        return transform[\"string\"][\"uint8array\"](input).buffer;\n    },\n    \"uint8array\": function(input) {\n        return stringToArrayLike(input, new Uint8Array(input.length));\n    },\n    \"nodebuffer\": function(input) {\n        return stringToArrayLike(input, nodeBuffer(input.length));\n    }\n};\n\n// array to ?\ntransform[\"array\"] = {\n    \"string\": arrayLikeToString,\n    \"array\": identity,\n    \"arraybuffer\": function(input) {\n        return (new Uint8Array(input)).buffer;\n    },\n    \"uint8array\": function(input) {\n        return new Uint8Array(input);\n    },\n    \"nodebuffer\": function(input) {\n        return nodeBuffer(input);\n    }\n};\n\n// arraybuffer to ?\ntransform[\"arraybuffer\"] = {\n    \"string\": function(input) {\n        return arrayLikeToString(new Uint8Array(input));\n    },\n    \"array\": function(input) {\n        return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));\n    },\n    \"arraybuffer\": identity,\n    \"uint8array\": function(input) {\n        return new Uint8Array(input);\n    },\n    \"nodebuffer\": function(input) {\n        return nodeBuffer(new Uint8Array(input));\n    }\n};\n\n// uint8array to ?\ntransform[\"uint8array\"] = {\n    \"string\": arrayLikeToString,\n    \"array\": function(input) {\n        return arrayLikeToArrayLike(input, new Array(input.length));\n    },\n    \"arraybuffer\": function(input) {\n        return input.buffer;\n    },\n    \"uint8array\": identity,\n    \"nodebuffer\": function(input) {\n        return nodeBuffer(input);\n    }\n};\n\n// nodebuffer to ?\ntransform[\"nodebuffer\"] = {\n    \"string\": arrayLikeToString,\n    \"array\": function(input) {\n        return arrayLikeToArrayLike(input, new Array(input.length));\n    },\n    \"arraybuffer\": function(input) {\n        return transform[\"nodebuffer\"][\"uint8array\"](input).buffer;\n    },\n    \"uint8array\": function(input) {\n        return arrayLikeToArrayLike(input, new Uint8Array(input.length));\n    },\n    \"nodebuffer\": identity\n};\n\n/**\n * Transform an input into any type.\n * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer.\n * If no output type is specified, the unmodified input will be returned.\n * @param {String} outputType the output type.\n * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert.\n * @throws {Error} an Error if the browser doesn't support the requested output type.\n */\nexports.transformTo = function(outputType, input) {\n    if (!input) {\n        // undefined, null, etc\n        // an empty string won't harm.\n        input = \"\";\n    }\n    if (!outputType) {\n        return input;\n    }\n    exports.checkSupport(outputType);\n    var inputType = exports.getTypeOf(input);\n    var result = transform[inputType][outputType](input);\n    return result;\n};\n\n/**\n * Return the type of the input.\n * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer.\n * @param {Object} input the input to identify.\n * @return {String} the (lowercase) type of the input.\n */\nexports.getTypeOf = function(input) {\n    if (typeof input === \"string\") {\n        return \"string\";\n    }\n    if (Object.prototype.toString.call(input) === \"[object Array]\") {\n        return \"array\";\n    }\n    if (support.nodebuffer && nodeBuffer.test(input)) {\n        return \"nodebuffer\";\n    }\n    if (support.uint8array && input instanceof Uint8Array) {\n        return \"uint8array\";\n    }\n    if (support.arraybuffer && input instanceof ArrayBuffer) {\n        return \"arraybuffer\";\n    }\n};\n\n/**\n * Throw an exception if the type is not supported.\n * @param {String} type the type to check.\n * @throws {Error} an Error if the browser doesn't support the requested type.\n */\nexports.checkSupport = function(type) {\n    var supported = support[type.toLowerCase()];\n    if (!supported) {\n        throw new Error(type + \" is not supported by this browser\");\n    }\n};\nexports.MAX_VALUE_16BITS = 65535;\nexports.MAX_VALUE_32BITS = -1; // well, \"\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\" is parsed as -1\n\n/**\n * Prettify a string read as binary.\n * @param {string} str the string to prettify.\n * @return {string} a pretty string.\n */\nexports.pretty = function(str) {\n    var res = '',\n        code, i;\n    for (i = 0; i < (str || \"\").length; i++) {\n        code = str.charCodeAt(i);\n        res += '\\\\x' + (code < 16 ? \"0\" : \"\") + code.toString(16).toUpperCase();\n    }\n    return res;\n};\n\n/**\n * Find a compression registered in JSZip.\n * @param {string} compressionMethod the method magic to find.\n * @return {Object|null} the JSZip compression object, null if none found.\n */\nexports.findCompression = function(compressionMethod) {\n    for (var method in compressions) {\n        if (!compressions.hasOwnProperty(method)) {\n            continue;\n        }\n        if (compressions[method].magic === compressionMethod) {\n            return compressions[method];\n        }\n    }\n    return null;\n};\n/**\n* Cross-window, cross-Node-context regular expression detection\n* @param  {Object}  object Anything\n* @return {Boolean}        true if the object is a regular expression,\n* false otherwise\n*/\nexports.isRegExp = function (object) {\n    return Object.prototype.toString.call(object) === \"[object RegExp]\";\n};\n\n\n},{\"./compressions\":86,\"./nodeBuffer\":94,\"./support\":100}],105:[function(require,module,exports){\n'use strict';\nvar StringReader = require('./stringReader');\nvar NodeBufferReader = require('./nodeBufferReader');\nvar Uint8ArrayReader = require('./uint8ArrayReader');\nvar utils = require('./utils');\nvar sig = require('./signature');\nvar ZipEntry = require('./zipEntry');\nvar support = require('./support');\nvar jszipProto = require('./object');\n//  class ZipEntries {{{\n/**\n * All the entries in the zip file.\n * @constructor\n * @param {String|ArrayBuffer|Uint8Array} data the binary stream to load.\n * @param {Object} loadOptions Options for loading the stream.\n */\nfunction ZipEntries(data, loadOptions) {\n    this.files = [];\n    this.loadOptions = loadOptions;\n    if (data) {\n        this.load(data);\n    }\n}\nZipEntries.prototype = {\n    /**\n     * Check that the reader is on the speficied signature.\n     * @param {string} expectedSignature the expected signature.\n     * @throws {Error} if it is an other signature.\n     */\n    checkSignature: function(expectedSignature) {\n        var signature = this.reader.readString(4);\n        if (signature !== expectedSignature) {\n            throw new Error(\"Corrupted zip or bug : unexpected signature \" + \"(\" + utils.pretty(signature) + \", expected \" + utils.pretty(expectedSignature) + \")\");\n        }\n    },\n    /**\n     * Read the end of the central directory.\n     */\n    readBlockEndOfCentral: function() {\n        this.diskNumber = this.reader.readInt(2);\n        this.diskWithCentralDirStart = this.reader.readInt(2);\n        this.centralDirRecordsOnThisDisk = this.reader.readInt(2);\n        this.centralDirRecords = this.reader.readInt(2);\n        this.centralDirSize = this.reader.readInt(4);\n        this.centralDirOffset = this.reader.readInt(4);\n\n        this.zipCommentLength = this.reader.readInt(2);\n        // warning : the encoding depends of the system locale\n        // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded.\n        // On a windows machine, this field is encoded with the localized windows code page.\n        this.zipComment = this.reader.readString(this.zipCommentLength);\n        // To get consistent behavior with the generation part, we will assume that\n        // this is utf8 encoded.\n        this.zipComment = jszipProto.utf8decode(this.zipComment);\n    },\n    /**\n     * Read the end of the Zip 64 central directory.\n     * Not merged with the method readEndOfCentral :\n     * The end of central can coexist with its Zip64 brother,\n     * I don't want to read the wrong number of bytes !\n     */\n    readBlockZip64EndOfCentral: function() {\n        this.zip64EndOfCentralSize = this.reader.readInt(8);\n        this.versionMadeBy = this.reader.readString(2);\n        this.versionNeeded = this.reader.readInt(2);\n        this.diskNumber = this.reader.readInt(4);\n        this.diskWithCentralDirStart = this.reader.readInt(4);\n        this.centralDirRecordsOnThisDisk = this.reader.readInt(8);\n        this.centralDirRecords = this.reader.readInt(8);\n        this.centralDirSize = this.reader.readInt(8);\n        this.centralDirOffset = this.reader.readInt(8);\n\n        this.zip64ExtensibleData = {};\n        var extraDataSize = this.zip64EndOfCentralSize - 44,\n            index = 0,\n            extraFieldId,\n            extraFieldLength,\n            extraFieldValue;\n        while (index < extraDataSize) {\n            extraFieldId = this.reader.readInt(2);\n            extraFieldLength = this.reader.readInt(4);\n            extraFieldValue = this.reader.readString(extraFieldLength);\n            this.zip64ExtensibleData[extraFieldId] = {\n                id: extraFieldId,\n                length: extraFieldLength,\n                value: extraFieldValue\n            };\n        }\n    },\n    /**\n     * Read the end of the Zip 64 central directory locator.\n     */\n    readBlockZip64EndOfCentralLocator: function() {\n        this.diskWithZip64CentralDirStart = this.reader.readInt(4);\n        this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8);\n        this.disksCount = this.reader.readInt(4);\n        if (this.disksCount > 1) {\n            throw new Error(\"Multi-volumes zip are not supported\");\n        }\n    },\n    /**\n     * Read the local files, based on the offset read in the central part.\n     */\n    readLocalFiles: function() {\n        var i, file;\n        for (i = 0; i < this.files.length; i++) {\n            file = this.files[i];\n            this.reader.setIndex(file.localHeaderOffset);\n            this.checkSignature(sig.LOCAL_FILE_HEADER);\n            file.readLocalPart(this.reader);\n            file.handleUTF8();\n            file.processAttributes();\n        }\n    },\n    /**\n     * Read the central directory.\n     */\n    readCentralDir: function() {\n        var file;\n\n        this.reader.setIndex(this.centralDirOffset);\n        while (this.reader.readString(4) === sig.CENTRAL_FILE_HEADER) {\n            file = new ZipEntry({\n                zip64: this.zip64\n            }, this.loadOptions);\n            file.readCentralPart(this.reader);\n            this.files.push(file);\n        }\n    },\n    /**\n     * Read the end of central directory.\n     */\n    readEndOfCentral: function() {\n        var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END);\n        if (offset === -1) {\n            // Check if the content is a truncated zip or complete garbage.\n            // A \"LOCAL_FILE_HEADER\" is not required at the beginning (auto\n            // extractible zip for example) but it can give a good hint.\n            // If an ajax request was used without responseType, we will also\n            // get unreadable data.\n            var isGarbage = true;\n            try {\n                this.reader.setIndex(0);\n                this.checkSignature(sig.LOCAL_FILE_HEADER);\n                isGarbage = false;\n            } catch (e) {}\n\n            if (isGarbage) {\n                throw new Error(\"Can't find end of central directory : is this a zip file ? \" +\n                                \"If it is, see http://stuk.github.io/jszip/documentation/howto/read_zip.html\");\n            } else {\n                throw new Error(\"Corrupted zip : can't find end of central directory\");\n            }\n        }\n        this.reader.setIndex(offset);\n        this.checkSignature(sig.CENTRAL_DIRECTORY_END);\n        this.readBlockEndOfCentral();\n\n\n        /* extract from the zip spec :\n            4)  If one of the fields in the end of central directory\n                record is too small to hold required data, the field\n                should be set to -1 (0xFFFF or 0xFFFFFFFF) and the\n                ZIP64 format record should be created.\n            5)  The end of central directory record and the\n                Zip64 end of central directory locator record must\n                reside on the same disk when splitting or spanning\n                an archive.\n         */\n        if (this.diskNumber === utils.MAX_VALUE_16BITS || this.diskWithCentralDirStart === utils.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === utils.MAX_VALUE_16BITS || this.centralDirRecords === utils.MAX_VALUE_16BITS || this.centralDirSize === utils.MAX_VALUE_32BITS || this.centralDirOffset === utils.MAX_VALUE_32BITS) {\n            this.zip64 = true;\n\n            /*\n            Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from\n            the zip file can fit into a 32bits integer. This cannot be solved : Javascript represents\n            all numbers as 64-bit double precision IEEE 754 floating point numbers.\n            So, we have 53bits for integers and bitwise operations treat everything as 32bits.\n            see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators\n            and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5\n            */\n\n            // should look for a zip64 EOCD locator\n            offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);\n            if (offset === -1) {\n                throw new Error(\"Corrupted zip : can't find the ZIP64 end of central directory locator\");\n            }\n            this.reader.setIndex(offset);\n            this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);\n            this.readBlockZip64EndOfCentralLocator();\n\n            // now the zip64 EOCD record\n            this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);\n            this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END);\n            this.readBlockZip64EndOfCentral();\n        }\n    },\n    prepareReader: function(data) {\n        var type = utils.getTypeOf(data);\n        if (type === \"string\" && !support.uint8array) {\n            this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString);\n        }\n        else if (type === \"nodebuffer\") {\n            this.reader = new NodeBufferReader(data);\n        }\n        else {\n            this.reader = new Uint8ArrayReader(utils.transformTo(\"uint8array\", data));\n        }\n    },\n    /**\n     * Read a zip file and create ZipEntries.\n     * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file.\n     */\n    load: function(data) {\n        this.prepareReader(data);\n        this.readEndOfCentral();\n        this.readCentralDir();\n        this.readLocalFiles();\n    }\n};\n// }}} end of ZipEntries\nmodule.exports = ZipEntries;\n\n},{\"./nodeBufferReader\":95,\"./object\":96,\"./signature\":97,\"./stringReader\":98,\"./support\":100,\"./uint8ArrayReader\":101,\"./utils\":104,\"./zipEntry\":106}],106:[function(require,module,exports){\n'use strict';\nvar StringReader = require('./stringReader');\nvar utils = require('./utils');\nvar CompressedObject = require('./compressedObject');\nvar jszipProto = require('./object');\n\nvar MADE_BY_DOS = 0x00;\nvar MADE_BY_UNIX = 0x03;\n\n// class ZipEntry {{{\n/**\n * An entry in the zip file.\n * @constructor\n * @param {Object} options Options of the current file.\n * @param {Object} loadOptions Options for loading the stream.\n */\nfunction ZipEntry(options, loadOptions) {\n    this.options = options;\n    this.loadOptions = loadOptions;\n}\nZipEntry.prototype = {\n    /**\n     * say if the file is encrypted.\n     * @return {boolean} true if the file is encrypted, false otherwise.\n     */\n    isEncrypted: function() {\n        // bit 1 is set\n        return (this.bitFlag & 0x0001) === 0x0001;\n    },\n    /**\n     * say if the file has utf-8 filename/comment.\n     * @return {boolean} true if the filename/comment is in utf-8, false otherwise.\n     */\n    useUTF8: function() {\n        // bit 11 is set\n        return (this.bitFlag & 0x0800) === 0x0800;\n    },\n    /**\n     * Prepare the function used to generate the compressed content from this ZipFile.\n     * @param {DataReader} reader the reader to use.\n     * @param {number} from the offset from where we should read the data.\n     * @param {number} length the length of the data to read.\n     * @return {Function} the callback to get the compressed content (the type depends of the DataReader class).\n     */\n    prepareCompressedContent: function(reader, from, length) {\n        return function() {\n            var previousIndex = reader.index;\n            reader.setIndex(from);\n            var compressedFileData = reader.readData(length);\n            reader.setIndex(previousIndex);\n\n            return compressedFileData;\n        };\n    },\n    /**\n     * Prepare the function used to generate the uncompressed content from this ZipFile.\n     * @param {DataReader} reader the reader to use.\n     * @param {number} from the offset from where we should read the data.\n     * @param {number} length the length of the data to read.\n     * @param {JSZip.compression} compression the compression used on this file.\n     * @param {number} uncompressedSize the uncompressed size to expect.\n     * @return {Function} the callback to get the uncompressed content (the type depends of the DataReader class).\n     */\n    prepareContent: function(reader, from, length, compression, uncompressedSize) {\n        return function() {\n\n            var compressedFileData = utils.transformTo(compression.uncompressInputType, this.getCompressedContent());\n            var uncompressedFileData = compression.uncompress(compressedFileData);\n\n            if (uncompressedFileData.length !== uncompressedSize) {\n                throw new Error(\"Bug : uncompressed data size mismatch\");\n            }\n\n            return uncompressedFileData;\n        };\n    },\n    /**\n     * Read the local part of a zip file and add the info in this object.\n     * @param {DataReader} reader the reader to use.\n     */\n    readLocalPart: function(reader) {\n        var compression, localExtraFieldsLength;\n\n        // we already know everything from the central dir !\n        // If the central dir data are false, we are doomed.\n        // On the bright side, the local part is scary  : zip64, data descriptors, both, etc.\n        // The less data we get here, the more reliable this should be.\n        // Let's skip the whole header and dash to the data !\n        reader.skip(22);\n        // in some zip created on windows, the filename stored in the central dir contains \\ instead of /.\n        // Strangely, the filename here is OK.\n        // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes\n        // or APPNOTE#4.4.17.1, \"All slashes MUST be forward slashes '/'\") but there are a lot of bad zip generators...\n        // Search \"unzip mismatching \"local\" filename continuing with \"central\" filename version\" on\n        // the internet.\n        //\n        // I think I see the logic here : the central directory is used to display\n        // content and the local directory is used to extract the files. Mixing / and \\\n        // may be used to display \\ to windows users and use / when extracting the files.\n        // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394\n        this.fileNameLength = reader.readInt(2);\n        localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir\n        this.fileName = reader.readString(this.fileNameLength);\n        reader.skip(localExtraFieldsLength);\n\n        if (this.compressedSize == -1 || this.uncompressedSize == -1) {\n            throw new Error(\"Bug or corrupted zip : didn't get enough informations from the central directory \" + \"(compressedSize == -1 || uncompressedSize == -1)\");\n        }\n\n        compression = utils.findCompression(this.compressionMethod);\n        if (compression === null) { // no compression found\n            throw new Error(\"Corrupted zip : compression \" + utils.pretty(this.compressionMethod) + \" unknown (inner file : \" + this.fileName + \")\");\n        }\n        this.decompressed = new CompressedObject();\n        this.decompressed.compressedSize = this.compressedSize;\n        this.decompressed.uncompressedSize = this.uncompressedSize;\n        this.decompressed.crc32 = this.crc32;\n        this.decompressed.compressionMethod = this.compressionMethod;\n        this.decompressed.getCompressedContent = this.prepareCompressedContent(reader, reader.index, this.compressedSize, compression);\n        this.decompressed.getContent = this.prepareContent(reader, reader.index, this.compressedSize, compression, this.uncompressedSize);\n\n        // we need to compute the crc32...\n        if (this.loadOptions.checkCRC32) {\n            this.decompressed = utils.transformTo(\"string\", this.decompressed.getContent());\n            if (jszipProto.crc32(this.decompressed) !== this.crc32) {\n                throw new Error(\"Corrupted zip : CRC32 mismatch\");\n            }\n        }\n    },\n\n    /**\n     * Read the central part of a zip file and add the info in this object.\n     * @param {DataReader} reader the reader to use.\n     */\n    readCentralPart: function(reader) {\n        this.versionMadeBy = reader.readInt(2);\n        this.versionNeeded = reader.readInt(2);\n        this.bitFlag = reader.readInt(2);\n        this.compressionMethod = reader.readString(2);\n        this.date = reader.readDate();\n        this.crc32 = reader.readInt(4);\n        this.compressedSize = reader.readInt(4);\n        this.uncompressedSize = reader.readInt(4);\n        this.fileNameLength = reader.readInt(2);\n        this.extraFieldsLength = reader.readInt(2);\n        this.fileCommentLength = reader.readInt(2);\n        this.diskNumberStart = reader.readInt(2);\n        this.internalFileAttributes = reader.readInt(2);\n        this.externalFileAttributes = reader.readInt(4);\n        this.localHeaderOffset = reader.readInt(4);\n\n        if (this.isEncrypted()) {\n            throw new Error(\"Encrypted zip are not supported\");\n        }\n\n        this.fileName = reader.readString(this.fileNameLength);\n        this.readExtraFields(reader);\n        this.parseZIP64ExtraField(reader);\n        this.fileComment = reader.readString(this.fileCommentLength);\n    },\n\n    /**\n     * Parse the external file attributes and get the unix/dos permissions.\n     */\n    processAttributes: function () {\n        this.unixPermissions = null;\n        this.dosPermissions = null;\n        var madeBy = this.versionMadeBy >> 8;\n\n        // Check if we have the DOS directory flag set.\n        // We look for it in the DOS and UNIX permissions\n        // but some unknown platform could set it as a compatibility flag.\n        this.dir = this.externalFileAttributes & 0x0010 ? true : false;\n\n        if(madeBy === MADE_BY_DOS) {\n            // first 6 bits (0 to 5)\n            this.dosPermissions = this.externalFileAttributes & 0x3F;\n        }\n\n        if(madeBy === MADE_BY_UNIX) {\n            this.unixPermissions = (this.externalFileAttributes >> 16) & 0xFFFF;\n            // the octal permissions are in (this.unixPermissions & 0x01FF).toString(8);\n        }\n\n        // fail safe : if the name ends with a / it probably means a folder\n        if (!this.dir && this.fileName.slice(-1) === '/') {\n            this.dir = true;\n        }\n    },\n\n    /**\n     * Parse the ZIP64 extra field and merge the info in the current ZipEntry.\n     * @param {DataReader} reader the reader to use.\n     */\n    parseZIP64ExtraField: function(reader) {\n\n        if (!this.extraFields[0x0001]) {\n            return;\n        }\n\n        // should be something, preparing the extra reader\n        var extraReader = new StringReader(this.extraFields[0x0001].value);\n\n        // I really hope that these 64bits integer can fit in 32 bits integer, because js\n        // won't let us have more.\n        if (this.uncompressedSize === utils.MAX_VALUE_32BITS) {\n            this.uncompressedSize = extraReader.readInt(8);\n        }\n        if (this.compressedSize === utils.MAX_VALUE_32BITS) {\n            this.compressedSize = extraReader.readInt(8);\n        }\n        if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) {\n            this.localHeaderOffset = extraReader.readInt(8);\n        }\n        if (this.diskNumberStart === utils.MAX_VALUE_32BITS) {\n            this.diskNumberStart = extraReader.readInt(4);\n        }\n    },\n    /**\n     * Read the central part of a zip file and add the info in this object.\n     * @param {DataReader} reader the reader to use.\n     */\n    readExtraFields: function(reader) {\n        var start = reader.index,\n            extraFieldId,\n            extraFieldLength,\n            extraFieldValue;\n\n        this.extraFields = this.extraFields || {};\n\n        while (reader.index < start + this.extraFieldsLength) {\n            extraFieldId = reader.readInt(2);\n            extraFieldLength = reader.readInt(2);\n            extraFieldValue = reader.readString(extraFieldLength);\n\n            this.extraFields[extraFieldId] = {\n                id: extraFieldId,\n                length: extraFieldLength,\n                value: extraFieldValue\n            };\n        }\n    },\n    /**\n     * Apply an UTF8 transformation if needed.\n     */\n    handleUTF8: function() {\n        if (this.useUTF8()) {\n            this.fileName = jszipProto.utf8decode(this.fileName);\n            this.fileComment = jszipProto.utf8decode(this.fileComment);\n        } else {\n            var upath = this.findExtraFieldUnicodePath();\n            if (upath !== null) {\n                this.fileName = upath;\n            }\n            var ucomment = this.findExtraFieldUnicodeComment();\n            if (ucomment !== null) {\n                this.fileComment = ucomment;\n            }\n        }\n    },\n\n    /**\n     * Find the unicode path declared in the extra field, if any.\n     * @return {String} the unicode path, null otherwise.\n     */\n    findExtraFieldUnicodePath: function() {\n        var upathField = this.extraFields[0x7075];\n        if (upathField) {\n            var extraReader = new StringReader(upathField.value);\n\n            // wrong version\n            if (extraReader.readInt(1) !== 1) {\n                return null;\n            }\n\n            // the crc of the filename changed, this field is out of date.\n            if (jszipProto.crc32(this.fileName) !== extraReader.readInt(4)) {\n                return null;\n            }\n\n            return jszipProto.utf8decode(extraReader.readString(upathField.length - 5));\n        }\n        return null;\n    },\n\n    /**\n     * Find the unicode comment declared in the extra field, if any.\n     * @return {String} the unicode comment, null otherwise.\n     */\n    findExtraFieldUnicodeComment: function() {\n        var ucommentField = this.extraFields[0x6375];\n        if (ucommentField) {\n            var extraReader = new StringReader(ucommentField.value);\n\n            // wrong version\n            if (extraReader.readInt(1) !== 1) {\n                return null;\n            }\n\n            // the crc of the comment changed, this field is out of date.\n            if (jszipProto.crc32(this.fileComment) !== extraReader.readInt(4)) {\n                return null;\n            }\n\n            return jszipProto.utf8decode(extraReader.readString(ucommentField.length - 5));\n        }\n        return null;\n    }\n};\nmodule.exports = ZipEntry;\n\n},{\"./compressedObject\":85,\"./object\":96,\"./stringReader\":98,\"./utils\":104}],107:[function(require,module,exports){\nexports.Parser = require(\"./lib/parser\").Parser;\nexports.rules = require(\"./lib/rules\");\nexports.errors = require(\"./lib/errors\");\nexports.results = require(\"./lib/parsing-results\");\nexports.StringSource = require(\"./lib/StringSource\");\nexports.Token = require(\"./lib/Token\");\nexports.bottomUp = require(\"./lib/bottom-up\");\nexports.RegexTokeniser = require(\"./lib/regex-tokeniser\").RegexTokeniser;\n\nexports.rule = function(ruleBuilder) {\n    var rule;\n    return function(input) {\n        if (!rule) {\n            rule = ruleBuilder();\n        }\n        return rule(input);\n    };\n};\n\n},{\"./lib/StringSource\":108,\"./lib/Token\":109,\"./lib/bottom-up\":111,\"./lib/errors\":112,\"./lib/parser\":114,\"./lib/parsing-results\":115,\"./lib/regex-tokeniser\":116,\"./lib/rules\":117}],108:[function(require,module,exports){\nvar util = require(\"util\");\n\nvar StringSource = module.exports = function(string, description) {\n    var self = {\n        asString: function() {\n            return string;\n        },\n        range: function(startIndex, endIndex) {\n            return new StringSourceRange(string, description, startIndex, endIndex);\n        }\n    };\n    return self;\n};\n\nvar StringSourceRange = function(string, description, startIndex, endIndex) {\n    this._string = string;\n    this._description = description;\n    this._startIndex = startIndex;\n    this._endIndex = endIndex;\n};\n\nStringSourceRange.prototype.to = function(otherRange) {\n    // TODO: Assert that tokens are the same across both iterators\n    return new StringSourceRange(this._string, this._description, this._startIndex, otherRange._endIndex);\n};\n\nStringSourceRange.prototype.describe = function() {\n    var position = this._position();\n    var description = this._description ? this._description + \"\\n\" : \"\";\n    return util.format(\"%sLine number: %s\\nCharacter number: %s\",\n        description, position.lineNumber, position.characterNumber);\n};\n\nStringSourceRange.prototype.lineNumber = function() {\n    return this._position().lineNumber;\n};\n\nStringSourceRange.prototype.characterNumber = function() {\n    return this._position().characterNumber;\n};\n\nStringSourceRange.prototype._position = function() {\n    var self = this;\n    var index = 0;\n    var nextNewLine = function() {\n        return self._string.indexOf(\"\\n\", index);\n    };\n    \n    var lineNumber = 1;\n    while (nextNewLine() !== -1 && nextNewLine() < this._startIndex) {\n        index = nextNewLine() + 1;\n        lineNumber += 1;\n    }\n    var characterNumber = this._startIndex - index + 1;\n    return {lineNumber: lineNumber, characterNumber: characterNumber};\n};\n\n},{\"util\":157}],109:[function(require,module,exports){\nmodule.exports = function(name, value, source) {\n    this.name = name;\n    this.value = value;\n    if (source) {\n        this.source = source;\n    }\n};\n\n},{}],110:[function(require,module,exports){\nvar TokenIterator = module.exports = function(tokens, startIndex) {\n    this._tokens = tokens;\n    this._startIndex = startIndex || 0;\n};\n\nTokenIterator.prototype.head = function() {\n    return this._tokens[this._startIndex];\n};\n\nTokenIterator.prototype.tail = function(startIndex) {\n    return new TokenIterator(this._tokens, this._startIndex + 1);\n};\n\nTokenIterator.prototype.toArray = function() {\n    return this._tokens.slice(this._startIndex);\n};\n\nTokenIterator.prototype.end = function() {\n    return this._tokens[this._tokens.length - 1];\n};\n\n// TODO: doesn't need to be a method, can be a separate function,\n// which simplifies implementation of the TokenIterator interface\nTokenIterator.prototype.to = function(end) {\n    var start = this.head().source;\n    var endToken = end.head() || end.end();\n    return start.to(endToken.source);\n};\n\n},{}],111:[function(require,module,exports){\nvar rules = require(\"./rules\");\nvar results = require(\"./parsing-results\");\n\nexports.parser = function(name, prefixRules, infixRuleBuilders) {\n    var self = {\n        rule: rule,\n        leftAssociative: leftAssociative,\n        rightAssociative: rightAssociative\n    };\n    \n    var infixRules = new InfixRules(infixRuleBuilders.map(createInfixRule));\n    var prefixRule = rules.firstOf(name, prefixRules);\n    \n    function createInfixRule(infixRuleBuilder) {\n        return {\n            name: infixRuleBuilder.name,\n            rule: lazyRule(infixRuleBuilder.ruleBuilder.bind(null, self))\n        };\n    }\n    \n    function rule() {\n        return createRule(infixRules);\n    }\n    \n    function leftAssociative(name) {\n        return createRule(infixRules.untilExclusive(name));\n    }\n    \n    function rightAssociative(name) {\n        return createRule(infixRules.untilInclusive(name));\n    }\n    \n    function createRule(infixRules) {\n        return apply.bind(null, infixRules);\n    }\n    \n    function apply(infixRules, tokens) {\n        var leftResult = prefixRule(tokens);\n        if (leftResult.isSuccess()) {\n            return infixRules.apply(leftResult);\n        } else {\n            return leftResult;\n        }\n    }\n    \n    return self;\n};\n\nfunction InfixRules(infixRules) {\n    function untilExclusive(name) {\n        return new InfixRules(infixRules.slice(0, ruleNames().indexOf(name)));\n    }\n    \n    function untilInclusive(name) {\n        return new InfixRules(infixRules.slice(0, ruleNames().indexOf(name) + 1));\n    }\n    \n    function ruleNames() {\n        return infixRules.map(function(rule) {\n            return rule.name;\n        });\n    }\n    \n    function apply(leftResult) {\n        var currentResult;\n        var source;\n        while (true) {\n            currentResult = applyToTokens(leftResult.remaining());\n            if (currentResult.isSuccess()) {\n                source = leftResult.source().to(currentResult.source());\n                leftResult = results.success(\n                    currentResult.value()(leftResult.value(), source),\n                    currentResult.remaining(),\n                    source\n                )\n            } else if (currentResult.isFailure()) {\n                return leftResult;\n            } else {\n                return currentResult;\n            }\n        }\n    }\n    \n    function applyToTokens(tokens) {\n        return rules.firstOf(\"infix\", infixRules.map(function(infix) {\n            return infix.rule;\n        }))(tokens);\n    }\n    \n    return {\n        apply: apply,\n        untilExclusive: untilExclusive,\n        untilInclusive: untilInclusive\n    }\n}\n\nexports.infix = function(name, ruleBuilder) {\n    function map(func) {\n        return exports.infix(name, function(parser) {\n            var rule = ruleBuilder(parser);\n            return function(tokens) {\n                var result = rule(tokens);\n                return result.map(function(right) {\n                    return function(left, source) {\n                        return func(left, right, source);\n                    };\n                });\n            };\n        });\n    }\n    \n    return {\n        name: name,\n        ruleBuilder: ruleBuilder,\n        map: map\n    };\n}\n\n// TODO: move into a sensible place and remove duplication\nvar lazyRule = function(ruleBuilder) {\n    var rule;\n    return function(input) {\n        if (!rule) {\n            rule = ruleBuilder();\n        }\n        return rule(input);\n    };\n};\n\n},{\"./parsing-results\":115,\"./rules\":117}],112:[function(require,module,exports){\nexports.error = function(options) {\n    return new Error(options);\n};\n\nvar Error = function(options) {\n    this.expected = options.expected;\n    this.actual = options.actual;\n    this._location = options.location;\n};\n\nError.prototype.describe = function() {\n    var locationDescription = this._location ? this._location.describe() + \":\\n\" : \"\";\n    return locationDescription + \"Expected \" + this.expected + \"\\nbut got \" + this.actual;\n};\n\nError.prototype.lineNumber = function() {\n    return this._location.lineNumber();\n};\n\nError.prototype.characterNumber = function() {\n    return this._location.characterNumber();\n};\n\n},{}],113:[function(require,module,exports){\nvar fromArray = exports.fromArray = function(array) {\n    var index = 0;\n    var hasNext = function() {\n        return index < array.length;\n    };\n    return new LazyIterator({\n        hasNext: hasNext,\n        next: function() {\n            if (!hasNext()) {\n                throw new Error(\"No more elements\");\n            } else {\n                return array[index++];\n            }\n        }\n    });\n};\n\nvar LazyIterator = function(iterator) {\n    this._iterator = iterator;\n};\n\nLazyIterator.prototype.map = function(func) {\n    var iterator = this._iterator;\n    return new LazyIterator({\n        hasNext: function() {\n            return iterator.hasNext();\n        },\n        next: function() {\n            return func(iterator.next());\n        }\n    });\n};\n\nLazyIterator.prototype.filter = function(condition) {\n    var iterator = this._iterator;\n    \n    var moved = false;\n    var hasNext = false;\n    var next;\n    var moveIfNecessary = function() {\n        if (moved) {\n            return;\n        }\n        moved = true;\n        hasNext = false;\n        while (iterator.hasNext() && !hasNext) {\n            next = iterator.next();\n            hasNext = condition(next);\n        }\n    };\n    \n    return new LazyIterator({\n        hasNext: function() {\n            moveIfNecessary();\n            return hasNext;\n        },\n        next: function() {\n            moveIfNecessary();\n            var toReturn = next;\n            moved = false;\n            return toReturn;\n        }\n    });\n};\n\nLazyIterator.prototype.first = function() {\n    var iterator = this._iterator;\n    if (this._iterator.hasNext()) {\n        return iterator.next();\n    } else {\n        return null;\n    }\n};\n\nLazyIterator.prototype.toArray = function() {\n    var result = [];\n    while (this._iterator.hasNext()) {\n        result.push(this._iterator.next());\n    }\n    return result;\n};\n\n},{}],114:[function(require,module,exports){\nvar TokenIterator = require(\"./TokenIterator\");\n\nexports.Parser = function(options) {\n    var parseTokens = function(parser, tokens) {\n        return parser(new TokenIterator(tokens));\n    };\n    \n    return {\n        parseTokens: parseTokens\n    };\n};\n\n},{\"./TokenIterator\":110}],115:[function(require,module,exports){\nmodule.exports = {\n    failure: function(errors, remaining) {\n        if (errors.length < 1) {\n            throw new Error(\"Failure must have errors\");\n        }\n        return new Result({\n            status: \"failure\",\n            remaining: remaining,\n            errors: errors\n        });\n    },\n    error: function(errors, remaining) {\n        if (errors.length < 1) {\n            throw new Error(\"Failure must have errors\");\n        }\n        return new Result({\n            status: \"error\",\n            remaining: remaining,\n            errors: errors\n        });\n    },\n    success: function(value, remaining, source) {\n        return new Result({\n            status: \"success\",\n            value: value,\n            source: source,\n            remaining: remaining,\n            errors: []\n        });\n    },\n    cut: function(remaining) {\n        return new Result({\n            status: \"cut\",\n            remaining: remaining,\n            errors: []\n        });\n    }\n};\n\nvar Result = function(options) {\n    this._value = options.value;\n    this._status = options.status;\n    this._hasValue = options.value !== undefined;\n    this._remaining = options.remaining;\n    this._source = options.source;\n    this._errors = options.errors;\n};\n\nResult.prototype.map = function(func) {\n    if (this._hasValue) {\n        return new Result({\n            value: func(this._value, this._source),\n            status: this._status,\n            remaining: this._remaining,\n            source: this._source,\n            errors: this._errors\n        });\n    } else {\n        return this;\n    }\n};\n\nResult.prototype.changeRemaining = function(remaining) {\n    return new Result({\n        value: this._value,\n        status: this._status,\n        remaining: remaining,\n        source: this._source,\n        errors: this._errors\n    });\n};\n\nResult.prototype.isSuccess = function() {\n    return this._status === \"success\" || this._status === \"cut\";\n};\n\nResult.prototype.isFailure = function() {\n    return this._status === \"failure\";\n};\n\nResult.prototype.isError = function() {\n    return this._status === \"error\";\n};\n\nResult.prototype.isCut = function() {\n    return this._status === \"cut\";\n};\n\nResult.prototype.value = function() {\n    return this._value;\n};\n\nResult.prototype.remaining = function() {\n    return this._remaining;\n};\n\nResult.prototype.source = function() {\n    return this._source;\n};\n\nResult.prototype.errors = function() {\n    return this._errors;\n};\n\n},{}],116:[function(require,module,exports){\nvar Token = require(\"./Token\");\nvar StringSource = require(\"./StringSource\");\n\nexports.RegexTokeniser = RegexTokeniser;\n\nfunction RegexTokeniser(rules) {\n    rules = rules.map(function(rule) {\n        return {\n            name: rule.name,\n            regex: new RegExp(rule.regex.source, \"g\")\n        };\n    });\n    \n    function tokenise(input, description) {\n        var source = new StringSource(input, description);\n        var index = 0;\n        var tokens = [];\n    \n        while (index < input.length) {\n            var result = readNextToken(input, index, source);\n            index = result.endIndex;\n            tokens.push(result.token);\n        }\n        \n        tokens.push(endToken(input, source));\n        return tokens;\n    }\n\n    function readNextToken(string, startIndex, source) {\n        for (var i = 0; i < rules.length; i++) {\n            var regex = rules[i].regex;\n            regex.lastIndex = startIndex;\n            var result = regex.exec(string);\n            \n            if (result) {\n                var endIndex = startIndex + result[0].length;\n                if (result.index === startIndex && endIndex > startIndex) {\n                    var value = result[1];\n                    var token = new Token(\n                        rules[i].name,\n                        value,\n                        source.range(startIndex, endIndex)\n                    );\n                    return {token: token, endIndex: endIndex};\n                }\n            }\n        }\n        var endIndex = startIndex + 1;\n        var token = new Token(\n            \"unrecognisedCharacter\",\n            string.substring(startIndex, endIndex),\n            source.range(startIndex, endIndex)\n        );\n        return {token: token, endIndex: endIndex};\n    }\n    \n    function endToken(input, source) {\n        return new Token(\n            \"end\",\n            null,\n            source.range(input.length, input.length)\n        );\n    }\n    \n    return {\n        tokenise: tokenise\n    }\n}\n\n\n\n},{\"./StringSource\":108,\"./Token\":109}],117:[function(require,module,exports){\nvar _ = require(\"underscore\");\nvar options = require(\"option\");\nvar results = require(\"./parsing-results\");\nvar errors = require(\"./errors\");\nvar lazyIterators = require(\"./lazy-iterators\");\n\nexports.token = function(tokenType, value) {\n    var matchValue = value !== undefined;\n    return function(input) {\n        var token = input.head();\n        if (token && token.name === tokenType && (!matchValue || token.value === value)) {\n            return results.success(token.value, input.tail(), token.source);\n        } else {\n            var expected = describeToken({name: tokenType, value: value});\n            return describeTokenMismatch(input, expected);\n        }\n    };\n};\n\nexports.tokenOfType = function(tokenType) {\n    return exports.token(tokenType);\n};\n\nexports.firstOf = function(name, parsers) {\n    if (!_.isArray(parsers)) {\n        parsers = Array.prototype.slice.call(arguments, 1);\n    }\n    return function(input) {\n        return lazyIterators\n            .fromArray(parsers)\n            .map(function(parser) {\n                return parser(input);\n            })\n            .filter(function(result) {\n                return result.isSuccess() || result.isError();\n            })\n            .first() || describeTokenMismatch(input, name);\n    };\n};\n\nexports.then = function(parser, func) {\n    return function(input) {\n        var result = parser(input);\n        if (!result.map) {\n            console.log(result);\n        }\n        return result.map(func);\n    };\n};\n\nexports.sequence = function() {\n    var parsers = Array.prototype.slice.call(arguments, 0);\n    var rule = function(input) {\n        var result = _.foldl(parsers, function(memo, parser) {\n            var result = memo.result;\n            var hasCut = memo.hasCut;\n            if (!result.isSuccess()) {\n                return {result: result, hasCut: hasCut};\n            }\n            var subResult = parser(result.remaining());\n            if (subResult.isCut()) {\n                return {result: result, hasCut: true};\n            } else if (subResult.isSuccess()) {\n                var values;\n                if (parser.isCaptured) {\n                    values = result.value().withValue(parser, subResult.value());\n                } else {\n                    values = result.value();\n                }\n                var remaining = subResult.remaining();\n                var source = input.to(remaining);\n                return {\n                    result: results.success(values, remaining, source),\n                    hasCut: hasCut\n                };\n            } else if (hasCut) {\n                return {result: results.error(subResult.errors(), subResult.remaining()), hasCut: hasCut};\n            } else {\n                return {result: subResult, hasCut: hasCut};\n            }\n        }, {result: results.success(new SequenceValues(), input), hasCut: false}).result;\n        var source = input.to(result.remaining());\n        return result.map(function(values) {\n            return values.withValue(exports.sequence.source, source);\n        });\n    };\n    rule.head = function() {\n        var firstCapture = _.find(parsers, isCapturedRule);\n        return exports.then(\n            rule,\n            exports.sequence.extract(firstCapture)\n        );\n    };\n    rule.map = function(func) {\n        return exports.then(\n            rule,\n            function(result) {\n                return func.apply(this, result.toArray());\n            }\n        );\n    };\n    \n    function isCapturedRule(subRule) {\n        return subRule.isCaptured;\n    }\n    \n    return rule;\n};\n\nvar SequenceValues = function(values, valuesArray) {\n    this._values = values || {};\n    this._valuesArray = valuesArray || [];\n};\n\nSequenceValues.prototype.withValue = function(rule, value) {\n    if (rule.captureName && rule.captureName in this._values) {\n        throw new Error(\"Cannot add second value for capture \\\"\" + rule.captureName + \"\\\"\");\n    } else {\n        var newValues = _.clone(this._values);\n        newValues[rule.captureName] = value;\n        var newValuesArray = this._valuesArray.concat([value]);\n        return new SequenceValues(newValues, newValuesArray);\n    }\n};\n\nSequenceValues.prototype.get = function(rule) {\n    if (rule.captureName in this._values) {\n        return this._values[rule.captureName];\n    } else {\n        throw new Error(\"No value for capture \\\"\" + rule.captureName + \"\\\"\");\n    }\n};\n\nSequenceValues.prototype.toArray = function() {\n    return this._valuesArray;\n};\n\nexports.sequence.capture = function(rule, name) {\n    var captureRule = function() {\n        return rule.apply(this, arguments);\n    };\n    captureRule.captureName = name;\n    captureRule.isCaptured = true;\n    return captureRule;\n};\n\nexports.sequence.extract = function(rule) {\n    return function(result) {\n        return result.get(rule);\n    };\n};\n\nexports.sequence.applyValues = function(func) {\n    // TODO: check captureName doesn't conflict with source or other captures\n    var rules = Array.prototype.slice.call(arguments, 1);\n    return function(result) {\n        var values = rules.map(function(rule) {\n            return result.get(rule);\n        });\n        return func.apply(this, values);\n    };\n};\n\nexports.sequence.source = {\n    captureName: \"☃source☃\"\n};\n\nexports.sequence.cut = function() {\n    return function(input) {\n        return results.cut(input);\n    };\n};\n\nexports.optional = function(rule) {\n    return function(input) {\n        var result = rule(input);\n        if (result.isSuccess()) {\n            return result.map(options.some);\n        } else if (result.isFailure()) {\n            return results.success(options.none, input);\n        } else {\n            return result;\n        }\n    };\n};\n\nexports.zeroOrMoreWithSeparator = function(rule, separator) {\n    return repeatedWithSeparator(rule, separator, false);\n};\n\nexports.oneOrMoreWithSeparator = function(rule, separator) {\n    return repeatedWithSeparator(rule, separator, true);\n};\n\nvar zeroOrMore = exports.zeroOrMore = function(rule) {\n    return function(input) {\n        var values = [];\n        var result;\n        while ((result = rule(input)) && result.isSuccess()) {\n            input = result.remaining();\n            values.push(result.value());\n        }\n        if (result.isError()) {\n            return result;\n        } else {\n            return results.success(values, input);\n        }\n    };\n};\n\nexports.oneOrMore = function(rule) {\n    return exports.oneOrMoreWithSeparator(rule, noOpRule);\n};\n\nfunction noOpRule(input) {\n    return results.success(null, input);\n}\n\nvar repeatedWithSeparator = function(rule, separator, isOneOrMore) {\n    return function(input) {\n        var result = rule(input);\n        if (result.isSuccess()) {\n            var mainRule = exports.sequence.capture(rule, \"main\");\n            var remainingRule = zeroOrMore(exports.then(\n                exports.sequence(separator, mainRule),\n                exports.sequence.extract(mainRule)\n            ));\n            var remainingResult = remainingRule(result.remaining());\n            return results.success([result.value()].concat(remainingResult.value()), remainingResult.remaining());\n        } else if (isOneOrMore || result.isError()) {\n            return result;\n        } else {\n            return results.success([], input);\n        }\n    };\n};\n\nexports.leftAssociative = function(leftRule, rightRule, func) {\n    var rights;\n    if (func) {\n        rights = [{func: func, rule: rightRule}];\n    } else {\n        rights = rightRule;\n    }\n    rights = rights.map(function(right) {\n        return exports.then(right.rule, function(rightValue) {\n            return function(leftValue, source) {\n                return right.func(leftValue, rightValue, source);\n            };\n        });\n    });\n    var repeatedRule = exports.firstOf.apply(null, [\"rules\"].concat(rights));\n    \n    return function(input) {\n        var start = input;\n        var leftResult = leftRule(input);\n        if (!leftResult.isSuccess()) {\n            return leftResult;\n        }\n        var repeatedResult = repeatedRule(leftResult.remaining());\n        while (repeatedResult.isSuccess()) {\n            var remaining = repeatedResult.remaining();\n            var source = start.to(repeatedResult.remaining());\n            var right = repeatedResult.value();\n            leftResult = results.success(\n                right(leftResult.value(), source),\n                remaining,\n                source\n            );\n            repeatedResult = repeatedRule(leftResult.remaining());\n        }\n        if (repeatedResult.isError()) {\n            return repeatedResult;\n        }\n        return leftResult;\n    };\n};\n\nexports.leftAssociative.firstOf = function() {\n    return Array.prototype.slice.call(arguments, 0);\n};\n\nexports.nonConsuming = function(rule) {\n    return function(input) {\n        return rule(input).changeRemaining(input);\n    };\n};\n\nvar describeToken = function(token) {\n    if (token.value) {\n        return token.name + \" \\\"\" + token.value + \"\\\"\";\n    } else {\n        return token.name;\n    }\n};\n\nfunction describeTokenMismatch(input, expected) {\n    var error;\n    var token = input.head();\n    if (token) {\n        error = errors.error({\n            expected: expected,\n            actual: describeToken(token),\n            location: token.source\n        });\n    } else {\n        error = errors.error({\n            expected: expected,\n            actual: \"end of tokens\"\n        });\n    }\n    return results.failure([error], input);\n}\n\n},{\"./errors\":112,\"./lazy-iterators\":113,\"./parsing-results\":115,\"option\":119,\"underscore\":118}],118:[function(require,module,exports){\n//     Underscore.js 1.4.4\n//     http://underscorejs.org\n//     (c) 2009-2013 Jeremy Ashkenas, DocumentCloud Inc.\n//     Underscore may be freely distributed under the MIT license.\n\n(function() {\n\n  // Baseline setup\n  // --------------\n\n  // Establish the root object, `window` in the browser, or `global` on the server.\n  var root = this;\n\n  // Save the previous value of the `_` variable.\n  var previousUnderscore = root._;\n\n  // Establish the object that gets returned to break out of a loop iteration.\n  var breaker = {};\n\n  // Save bytes in the minified (but not gzipped) version:\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n  // Create quick reference variables for speed access to core prototypes.\n  var push             = ArrayProto.push,\n      slice            = ArrayProto.slice,\n      concat           = ArrayProto.concat,\n      toString         = ObjProto.toString,\n      hasOwnProperty   = ObjProto.hasOwnProperty;\n\n  // All **ECMAScript 5** native function implementations that we hope to use\n  // are declared here.\n  var\n    nativeForEach      = ArrayProto.forEach,\n    nativeMap          = ArrayProto.map,\n    nativeReduce       = ArrayProto.reduce,\n    nativeReduceRight  = ArrayProto.reduceRight,\n    nativeFilter       = ArrayProto.filter,\n    nativeEvery        = ArrayProto.every,\n    nativeSome         = ArrayProto.some,\n    nativeIndexOf      = ArrayProto.indexOf,\n    nativeLastIndexOf  = ArrayProto.lastIndexOf,\n    nativeIsArray      = Array.isArray,\n    nativeKeys         = Object.keys,\n    nativeBind         = FuncProto.bind;\n\n  // Create a safe reference to the Underscore object for use below.\n  var _ = function(obj) {\n    if (obj instanceof _) return obj;\n    if (!(this instanceof _)) return new _(obj);\n    this._wrapped = obj;\n  };\n\n  // Export the Underscore object for **Node.js**, with\n  // backwards-compatibility for the old `require()` API. If we're in\n  // the browser, add `_` as a global object via a string identifier,\n  // for Closure Compiler \"advanced\" mode.\n  if (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports) {\n      exports = module.exports = _;\n    }\n    exports._ = _;\n  } else {\n    root._ = _;\n  }\n\n  // Current version.\n  _.VERSION = '1.4.4';\n\n  // Collection Functions\n  // --------------------\n\n  // The cornerstone, an `each` implementation, aka `forEach`.\n  // Handles objects with the built-in `forEach`, arrays, and raw objects.\n  // Delegates to **ECMAScript 5**'s native `forEach` if available.\n  var each = _.each = _.forEach = function(obj, iterator, context) {\n    if (obj == null) return;\n    if (nativeForEach && obj.forEach === nativeForEach) {\n      obj.forEach(iterator, context);\n    } else if (obj.length === +obj.length) {\n      for (var i = 0, l = obj.length; i < l; i++) {\n        if (iterator.call(context, obj[i], i, obj) === breaker) return;\n      }\n    } else {\n      for (var key in obj) {\n        if (_.has(obj, key)) {\n          if (iterator.call(context, obj[key], key, obj) === breaker) return;\n        }\n      }\n    }\n  };\n\n  // Return the results of applying the iterator to each element.\n  // Delegates to **ECMAScript 5**'s native `map` if available.\n  _.map = _.collect = function(obj, iterator, context) {\n    var results = [];\n    if (obj == null) return results;\n    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);\n    each(obj, function(value, index, list) {\n      results[results.length] = iterator.call(context, value, index, list);\n    });\n    return results;\n  };\n\n  var reduceError = 'Reduce of empty array with no initial value';\n\n  // **Reduce** builds up a single result from a list of values, aka `inject`,\n  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.\n  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {\n    var initial = arguments.length > 2;\n    if (obj == null) obj = [];\n    if (nativeReduce && obj.reduce === nativeReduce) {\n      if (context) iterator = _.bind(iterator, context);\n      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);\n    }\n    each(obj, function(value, index, list) {\n      if (!initial) {\n        memo = value;\n        initial = true;\n      } else {\n        memo = iterator.call(context, memo, value, index, list);\n      }\n    });\n    if (!initial) throw new TypeError(reduceError);\n    return memo;\n  };\n\n  // The right-associative version of reduce, also known as `foldr`.\n  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.\n  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {\n    var initial = arguments.length > 2;\n    if (obj == null) obj = [];\n    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {\n      if (context) iterator = _.bind(iterator, context);\n      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);\n    }\n    var length = obj.length;\n    if (length !== +length) {\n      var keys = _.keys(obj);\n      length = keys.length;\n    }\n    each(obj, function(value, index, list) {\n      index = keys ? keys[--length] : --length;\n      if (!initial) {\n        memo = obj[index];\n        initial = true;\n      } else {\n        memo = iterator.call(context, memo, obj[index], index, list);\n      }\n    });\n    if (!initial) throw new TypeError(reduceError);\n    return memo;\n  };\n\n  // Return the first value which passes a truth test. Aliased as `detect`.\n  _.find = _.detect = function(obj, iterator, context) {\n    var result;\n    any(obj, function(value, index, list) {\n      if (iterator.call(context, value, index, list)) {\n        result = value;\n        return true;\n      }\n    });\n    return result;\n  };\n\n  // Return all the elements that pass a truth test.\n  // Delegates to **ECMAScript 5**'s native `filter` if available.\n  // Aliased as `select`.\n  _.filter = _.select = function(obj, iterator, context) {\n    var results = [];\n    if (obj == null) return results;\n    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);\n    each(obj, function(value, index, list) {\n      if (iterator.call(context, value, index, list)) results[results.length] = value;\n    });\n    return results;\n  };\n\n  // Return all the elements for which a truth test fails.\n  _.reject = function(obj, iterator, context) {\n    return _.filter(obj, function(value, index, list) {\n      return !iterator.call(context, value, index, list);\n    }, context);\n  };\n\n  // Determine whether all of the elements match a truth test.\n  // Delegates to **ECMAScript 5**'s native `every` if available.\n  // Aliased as `all`.\n  _.every = _.all = function(obj, iterator, context) {\n    iterator || (iterator = _.identity);\n    var result = true;\n    if (obj == null) return result;\n    if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);\n    each(obj, function(value, index, list) {\n      if (!(result = result && iterator.call(context, value, index, list))) return breaker;\n    });\n    return !!result;\n  };\n\n  // Determine if at least one element in the object matches a truth test.\n  // Delegates to **ECMAScript 5**'s native `some` if available.\n  // Aliased as `any`.\n  var any = _.some = _.any = function(obj, iterator, context) {\n    iterator || (iterator = _.identity);\n    var result = false;\n    if (obj == null) return result;\n    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);\n    each(obj, function(value, index, list) {\n      if (result || (result = iterator.call(context, value, index, list))) return breaker;\n    });\n    return !!result;\n  };\n\n  // Determine if the array or object contains a given value (using `===`).\n  // Aliased as `include`.\n  _.contains = _.include = function(obj, target) {\n    if (obj == null) return false;\n    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;\n    return any(obj, function(value) {\n      return value === target;\n    });\n  };\n\n  // Invoke a method (with arguments) on every item in a collection.\n  _.invoke = function(obj, method) {\n    var args = slice.call(arguments, 2);\n    var isFunc = _.isFunction(method);\n    return _.map(obj, function(value) {\n      return (isFunc ? method : value[method]).apply(value, args);\n    });\n  };\n\n  // Convenience version of a common use case of `map`: fetching a property.\n  _.pluck = function(obj, key) {\n    return _.map(obj, function(value){ return value[key]; });\n  };\n\n  // Convenience version of a common use case of `filter`: selecting only objects\n  // containing specific `key:value` pairs.\n  _.where = function(obj, attrs, first) {\n    if (_.isEmpty(attrs)) return first ? null : [];\n    return _[first ? 'find' : 'filter'](obj, function(value) {\n      for (var key in attrs) {\n        if (attrs[key] !== value[key]) return false;\n      }\n      return true;\n    });\n  };\n\n  // Convenience version of a common use case of `find`: getting the first object\n  // containing specific `key:value` pairs.\n  _.findWhere = function(obj, attrs) {\n    return _.where(obj, attrs, true);\n  };\n\n  // Return the maximum element or (element-based computation).\n  // Can't optimize arrays of integers longer than 65,535 elements.\n  // See: https://bugs.webkit.org/show_bug.cgi?id=80797\n  _.max = function(obj, iterator, context) {\n    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {\n      return Math.max.apply(Math, obj);\n    }\n    if (!iterator && _.isEmpty(obj)) return -Infinity;\n    var result = {computed : -Infinity, value: -Infinity};\n    each(obj, function(value, index, list) {\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\n      computed >= result.computed && (result = {value : value, computed : computed});\n    });\n    return result.value;\n  };\n\n  // Return the minimum element (or element-based computation).\n  _.min = function(obj, iterator, context) {\n    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {\n      return Math.min.apply(Math, obj);\n    }\n    if (!iterator && _.isEmpty(obj)) return Infinity;\n    var result = {computed : Infinity, value: Infinity};\n    each(obj, function(value, index, list) {\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\n      computed < result.computed && (result = {value : value, computed : computed});\n    });\n    return result.value;\n  };\n\n  // Shuffle an array.\n  _.shuffle = function(obj) {\n    var rand;\n    var index = 0;\n    var shuffled = [];\n    each(obj, function(value) {\n      rand = _.random(index++);\n      shuffled[index - 1] = shuffled[rand];\n      shuffled[rand] = value;\n    });\n    return shuffled;\n  };\n\n  // An internal function to generate lookup iterators.\n  var lookupIterator = function(value) {\n    return _.isFunction(value) ? value : function(obj){ return obj[value]; };\n  };\n\n  // Sort the object's values by a criterion produced by an iterator.\n  _.sortBy = function(obj, value, context) {\n    var iterator = lookupIterator(value);\n    return _.pluck(_.map(obj, function(value, index, list) {\n      return {\n        value : value,\n        index : index,\n        criteria : iterator.call(context, value, index, list)\n      };\n    }).sort(function(left, right) {\n      var a = left.criteria;\n      var b = right.criteria;\n      if (a !== b) {\n        if (a > b || a === void 0) return 1;\n        if (a < b || b === void 0) return -1;\n      }\n      return left.index < right.index ? -1 : 1;\n    }), 'value');\n  };\n\n  // An internal function used for aggregate \"group by\" operations.\n  var group = function(obj, value, context, behavior) {\n    var result = {};\n    var iterator = lookupIterator(value || _.identity);\n    each(obj, function(value, index) {\n      var key = iterator.call(context, value, index, obj);\n      behavior(result, key, value);\n    });\n    return result;\n  };\n\n  // Groups the object's values by a criterion. Pass either a string attribute\n  // to group by, or a function that returns the criterion.\n  _.groupBy = function(obj, value, context) {\n    return group(obj, value, context, function(result, key, value) {\n      (_.has(result, key) ? result[key] : (result[key] = [])).push(value);\n    });\n  };\n\n  // Counts instances of an object that group by a certain criterion. Pass\n  // either a string attribute to count by, or a function that returns the\n  // criterion.\n  _.countBy = function(obj, value, context) {\n    return group(obj, value, context, function(result, key) {\n      if (!_.has(result, key)) result[key] = 0;\n      result[key]++;\n    });\n  };\n\n  // Use a comparator function to figure out the smallest index at which\n  // an object should be inserted so as to maintain order. Uses binary search.\n  _.sortedIndex = function(array, obj, iterator, context) {\n    iterator = iterator == null ? _.identity : lookupIterator(iterator);\n    var value = iterator.call(context, obj);\n    var low = 0, high = array.length;\n    while (low < high) {\n      var mid = (low + high) >>> 1;\n      iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;\n    }\n    return low;\n  };\n\n  // Safely convert anything iterable into a real, live array.\n  _.toArray = function(obj) {\n    if (!obj) return [];\n    if (_.isArray(obj)) return slice.call(obj);\n    if (obj.length === +obj.length) return _.map(obj, _.identity);\n    return _.values(obj);\n  };\n\n  // Return the number of elements in an object.\n  _.size = function(obj) {\n    if (obj == null) return 0;\n    return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;\n  };\n\n  // Array Functions\n  // ---------------\n\n  // Get the first element of an array. Passing **n** will return the first N\n  // values in the array. Aliased as `head` and `take`. The **guard** check\n  // allows it to work with `_.map`.\n  _.first = _.head = _.take = function(array, n, guard) {\n    if (array == null) return void 0;\n    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];\n  };\n\n  // Returns everything but the last entry of the array. Especially useful on\n  // the arguments object. Passing **n** will return all the values in\n  // the array, excluding the last N. The **guard** check allows it to work with\n  // `_.map`.\n  _.initial = function(array, n, guard) {\n    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));\n  };\n\n  // Get the last element of an array. Passing **n** will return the last N\n  // values in the array. The **guard** check allows it to work with `_.map`.\n  _.last = function(array, n, guard) {\n    if (array == null) return void 0;\n    if ((n != null) && !guard) {\n      return slice.call(array, Math.max(array.length - n, 0));\n    } else {\n      return array[array.length - 1];\n    }\n  };\n\n  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.\n  // Especially useful on the arguments object. Passing an **n** will return\n  // the rest N values in the array. The **guard**\n  // check allows it to work with `_.map`.\n  _.rest = _.tail = _.drop = function(array, n, guard) {\n    return slice.call(array, (n == null) || guard ? 1 : n);\n  };\n\n  // Trim out all falsy values from an array.\n  _.compact = function(array) {\n    return _.filter(array, _.identity);\n  };\n\n  // Internal implementation of a recursive `flatten` function.\n  var flatten = function(input, shallow, output) {\n    each(input, function(value) {\n      if (_.isArray(value)) {\n        shallow ? push.apply(output, value) : flatten(value, shallow, output);\n      } else {\n        output.push(value);\n      }\n    });\n    return output;\n  };\n\n  // Return a completely flattened version of an array.\n  _.flatten = function(array, shallow) {\n    return flatten(array, shallow, []);\n  };\n\n  // Return a version of the array that does not contain the specified value(s).\n  _.without = function(array) {\n    return _.difference(array, slice.call(arguments, 1));\n  };\n\n  // Produce a duplicate-free version of the array. If the array has already\n  // been sorted, you have the option of using a faster algorithm.\n  // Aliased as `unique`.\n  _.uniq = _.unique = function(array, isSorted, iterator, context) {\n    if (_.isFunction(isSorted)) {\n      context = iterator;\n      iterator = isSorted;\n      isSorted = false;\n    }\n    var initial = iterator ? _.map(array, iterator, context) : array;\n    var results = [];\n    var seen = [];\n    each(initial, function(value, index) {\n      if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {\n        seen.push(value);\n        results.push(array[index]);\n      }\n    });\n    return results;\n  };\n\n  // Produce an array that contains the union: each distinct element from all of\n  // the passed-in arrays.\n  _.union = function() {\n    return _.uniq(concat.apply(ArrayProto, arguments));\n  };\n\n  // Produce an array that contains every item shared between all the\n  // passed-in arrays.\n  _.intersection = function(array) {\n    var rest = slice.call(arguments, 1);\n    return _.filter(_.uniq(array), function(item) {\n      return _.every(rest, function(other) {\n        return _.indexOf(other, item) >= 0;\n      });\n    });\n  };\n\n  // Take the difference between one array and a number of other arrays.\n  // Only the elements present in just the first array will remain.\n  _.difference = function(array) {\n    var rest = concat.apply(ArrayProto, slice.call(arguments, 1));\n    return _.filter(array, function(value){ return !_.contains(rest, value); });\n  };\n\n  // Zip together multiple lists into a single array -- elements that share\n  // an index go together.\n  _.zip = function() {\n    var args = slice.call(arguments);\n    var length = _.max(_.pluck(args, 'length'));\n    var results = new Array(length);\n    for (var i = 0; i < length; i++) {\n      results[i] = _.pluck(args, \"\" + i);\n    }\n    return results;\n  };\n\n  // Converts lists into objects. Pass either a single array of `[key, value]`\n  // pairs, or two parallel arrays of the same length -- one of keys, and one of\n  // the corresponding values.\n  _.object = function(list, values) {\n    if (list == null) return {};\n    var result = {};\n    for (var i = 0, l = list.length; i < l; i++) {\n      if (values) {\n        result[list[i]] = values[i];\n      } else {\n        result[list[i][0]] = list[i][1];\n      }\n    }\n    return result;\n  };\n\n  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),\n  // we need this function. Return the position of the first occurrence of an\n  // item in an array, or -1 if the item is not included in the array.\n  // Delegates to **ECMAScript 5**'s native `indexOf` if available.\n  // If the array is large and already in sort order, pass `true`\n  // for **isSorted** to use binary search.\n  _.indexOf = function(array, item, isSorted) {\n    if (array == null) return -1;\n    var i = 0, l = array.length;\n    if (isSorted) {\n      if (typeof isSorted == 'number') {\n        i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);\n      } else {\n        i = _.sortedIndex(array, item);\n        return array[i] === item ? i : -1;\n      }\n    }\n    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);\n    for (; i < l; i++) if (array[i] === item) return i;\n    return -1;\n  };\n\n  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.\n  _.lastIndexOf = function(array, item, from) {\n    if (array == null) return -1;\n    var hasIndex = from != null;\n    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {\n      return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);\n    }\n    var i = (hasIndex ? from : array.length);\n    while (i--) if (array[i] === item) return i;\n    return -1;\n  };\n\n  // Generate an integer Array containing an arithmetic progression. A port of\n  // the native Python `range()` function. See\n  // [the Python documentation](http://docs.python.org/library/functions.html#range).\n  _.range = function(start, stop, step) {\n    if (arguments.length <= 1) {\n      stop = start || 0;\n      start = 0;\n    }\n    step = arguments[2] || 1;\n\n    var len = Math.max(Math.ceil((stop - start) / step), 0);\n    var idx = 0;\n    var range = new Array(len);\n\n    while(idx < len) {\n      range[idx++] = start;\n      start += step;\n    }\n\n    return range;\n  };\n\n  // Function (ahem) Functions\n  // ------------------\n\n  // Create a function bound to a given object (assigning `this`, and arguments,\n  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n  // available.\n  _.bind = function(func, context) {\n    if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n    var args = slice.call(arguments, 2);\n    return function() {\n      return func.apply(context, args.concat(slice.call(arguments)));\n    };\n  };\n\n  // Partially apply a function by creating a version that has had some of its\n  // arguments pre-filled, without changing its dynamic `this` context.\n  _.partial = function(func) {\n    var args = slice.call(arguments, 1);\n    return function() {\n      return func.apply(this, args.concat(slice.call(arguments)));\n    };\n  };\n\n  // Bind all of an object's methods to that object. Useful for ensuring that\n  // all callbacks defined on an object belong to it.\n  _.bindAll = function(obj) {\n    var funcs = slice.call(arguments, 1);\n    if (funcs.length === 0) funcs = _.functions(obj);\n    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });\n    return obj;\n  };\n\n  // Memoize an expensive function by storing its results.\n  _.memoize = function(func, hasher) {\n    var memo = {};\n    hasher || (hasher = _.identity);\n    return function() {\n      var key = hasher.apply(this, arguments);\n      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));\n    };\n  };\n\n  // Delays a function for the given number of milliseconds, and then calls\n  // it with the arguments supplied.\n  _.delay = function(func, wait) {\n    var args = slice.call(arguments, 2);\n    return setTimeout(function(){ return func.apply(null, args); }, wait);\n  };\n\n  // Defers a function, scheduling it to run after the current call stack has\n  // cleared.\n  _.defer = function(func) {\n    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));\n  };\n\n  // Returns a function, that, when invoked, will only be triggered at most once\n  // during a given window of time.\n  _.throttle = function(func, wait) {\n    var context, args, timeout, result;\n    var previous = 0;\n    var later = function() {\n      previous = new Date;\n      timeout = null;\n      result = func.apply(context, args);\n    };\n    return function() {\n      var now = new Date;\n      var remaining = wait - (now - previous);\n      context = this;\n      args = arguments;\n      if (remaining <= 0) {\n        clearTimeout(timeout);\n        timeout = null;\n        previous = now;\n        result = func.apply(context, args);\n      } else if (!timeout) {\n        timeout = setTimeout(later, remaining);\n      }\n      return result;\n    };\n  };\n\n  // Returns a function, that, as long as it continues to be invoked, will not\n  // be triggered. The function will be called after it stops being called for\n  // N milliseconds. If `immediate` is passed, trigger the function on the\n  // leading edge, instead of the trailing.\n  _.debounce = function(func, wait, immediate) {\n    var timeout, result;\n    return function() {\n      var context = this, args = arguments;\n      var later = function() {\n        timeout = null;\n        if (!immediate) result = func.apply(context, args);\n      };\n      var callNow = immediate && !timeout;\n      clearTimeout(timeout);\n      timeout = setTimeout(later, wait);\n      if (callNow) result = func.apply(context, args);\n      return result;\n    };\n  };\n\n  // Returns a function that will be executed at most one time, no matter how\n  // often you call it. Useful for lazy initialization.\n  _.once = function(func) {\n    var ran = false, memo;\n    return function() {\n      if (ran) return memo;\n      ran = true;\n      memo = func.apply(this, arguments);\n      func = null;\n      return memo;\n    };\n  };\n\n  // Returns the first function passed as an argument to the second,\n  // allowing you to adjust arguments, run code before and after, and\n  // conditionally execute the original function.\n  _.wrap = function(func, wrapper) {\n    return function() {\n      var args = [func];\n      push.apply(args, arguments);\n      return wrapper.apply(this, args);\n    };\n  };\n\n  // Returns a function that is the composition of a list of functions, each\n  // consuming the return value of the function that follows.\n  _.compose = function() {\n    var funcs = arguments;\n    return function() {\n      var args = arguments;\n      for (var i = funcs.length - 1; i >= 0; i--) {\n        args = [funcs[i].apply(this, args)];\n      }\n      return args[0];\n    };\n  };\n\n  // Returns a function that will only be executed after being called N times.\n  _.after = function(times, func) {\n    if (times <= 0) return func();\n    return function() {\n      if (--times < 1) {\n        return func.apply(this, arguments);\n      }\n    };\n  };\n\n  // Object Functions\n  // ----------------\n\n  // Retrieve the names of an object's properties.\n  // Delegates to **ECMAScript 5**'s native `Object.keys`\n  _.keys = nativeKeys || function(obj) {\n    if (obj !== Object(obj)) throw new TypeError('Invalid object');\n    var keys = [];\n    for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;\n    return keys;\n  };\n\n  // Retrieve the values of an object's properties.\n  _.values = function(obj) {\n    var values = [];\n    for (var key in obj) if (_.has(obj, key)) values.push(obj[key]);\n    return values;\n  };\n\n  // Convert an object into a list of `[key, value]` pairs.\n  _.pairs = function(obj) {\n    var pairs = [];\n    for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]);\n    return pairs;\n  };\n\n  // Invert the keys and values of an object. The values must be serializable.\n  _.invert = function(obj) {\n    var result = {};\n    for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key;\n    return result;\n  };\n\n  // Return a sorted list of the function names available on the object.\n  // Aliased as `methods`\n  _.functions = _.methods = function(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (_.isFunction(obj[key])) names.push(key);\n    }\n    return names.sort();\n  };\n\n  // Extend a given object with all the properties in passed-in object(s).\n  _.extend = function(obj) {\n    each(slice.call(arguments, 1), function(source) {\n      if (source) {\n        for (var prop in source) {\n          obj[prop] = source[prop];\n        }\n      }\n    });\n    return obj;\n  };\n\n  // Return a copy of the object only containing the whitelisted properties.\n  _.pick = function(obj) {\n    var copy = {};\n    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));\n    each(keys, function(key) {\n      if (key in obj) copy[key] = obj[key];\n    });\n    return copy;\n  };\n\n   // Return a copy of the object without the blacklisted properties.\n  _.omit = function(obj) {\n    var copy = {};\n    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));\n    for (var key in obj) {\n      if (!_.contains(keys, key)) copy[key] = obj[key];\n    }\n    return copy;\n  };\n\n  // Fill in a given object with default properties.\n  _.defaults = function(obj) {\n    each(slice.call(arguments, 1), function(source) {\n      if (source) {\n        for (var prop in source) {\n          if (obj[prop] == null) obj[prop] = source[prop];\n        }\n      }\n    });\n    return obj;\n  };\n\n  // Create a (shallow-cloned) duplicate of an object.\n  _.clone = function(obj) {\n    if (!_.isObject(obj)) return obj;\n    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n  };\n\n  // Invokes interceptor with the obj, and then returns obj.\n  // The primary purpose of this method is to \"tap into\" a method chain, in\n  // order to perform operations on intermediate results within the chain.\n  _.tap = function(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  };\n\n  // Internal recursive comparison function for `isEqual`.\n  var eq = function(a, b, aStack, bStack) {\n    // Identical objects are equal. `0 === -0`, but they aren't identical.\n    // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.\n    if (a === b) return a !== 0 || 1 / a == 1 / b;\n    // A strict comparison is necessary because `null == undefined`.\n    if (a == null || b == null) return a === b;\n    // Unwrap any wrapped objects.\n    if (a instanceof _) a = a._wrapped;\n    if (b instanceof _) b = b._wrapped;\n    // Compare `[[Class]]` names.\n    var className = toString.call(a);\n    if (className != toString.call(b)) return false;\n    switch (className) {\n      // Strings, numbers, dates, and booleans are compared by value.\n      case '[object String]':\n        // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n        // equivalent to `new String(\"5\")`.\n        return a == String(b);\n      case '[object Number]':\n        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for\n        // other numeric values.\n        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);\n      case '[object Date]':\n      case '[object Boolean]':\n        // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n        // millisecond representations. Note that invalid dates with millisecond representations\n        // of `NaN` are not equivalent.\n        return +a == +b;\n      // RegExps are compared by their source patterns and flags.\n      case '[object RegExp]':\n        return a.source == b.source &&\n               a.global == b.global &&\n               a.multiline == b.multiline &&\n               a.ignoreCase == b.ignoreCase;\n    }\n    if (typeof a != 'object' || typeof b != 'object') return false;\n    // Assume equality for cyclic structures. The algorithm for detecting cyclic\n    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n    var length = aStack.length;\n    while (length--) {\n      // Linear search. Performance is inversely proportional to the number of\n      // unique nested structures.\n      if (aStack[length] == a) return bStack[length] == b;\n    }\n    // Add the first object to the stack of traversed objects.\n    aStack.push(a);\n    bStack.push(b);\n    var size = 0, result = true;\n    // Recursively compare objects and arrays.\n    if (className == '[object Array]') {\n      // Compare array lengths to determine if a deep comparison is necessary.\n      size = a.length;\n      result = size == b.length;\n      if (result) {\n        // Deep compare the contents, ignoring non-numeric properties.\n        while (size--) {\n          if (!(result = eq(a[size], b[size], aStack, bStack))) break;\n        }\n      }\n    } else {\n      // Objects with different constructors are not equivalent, but `Object`s\n      // from different frames are.\n      var aCtor = a.constructor, bCtor = b.constructor;\n      if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&\n                               _.isFunction(bCtor) && (bCtor instanceof bCtor))) {\n        return false;\n      }\n      // Deep compare objects.\n      for (var key in a) {\n        if (_.has(a, key)) {\n          // Count the expected number of properties.\n          size++;\n          // Deep compare each member.\n          if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;\n        }\n      }\n      // Ensure that both objects contain the same number of properties.\n      if (result) {\n        for (key in b) {\n          if (_.has(b, key) && !(size--)) break;\n        }\n        result = !size;\n      }\n    }\n    // Remove the first object from the stack of traversed objects.\n    aStack.pop();\n    bStack.pop();\n    return result;\n  };\n\n  // Perform a deep comparison to check if two objects are equal.\n  _.isEqual = function(a, b) {\n    return eq(a, b, [], []);\n  };\n\n  // Is a given array, string, or object empty?\n  // An \"empty\" object has no enumerable own-properties.\n  _.isEmpty = function(obj) {\n    if (obj == null) return true;\n    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;\n    for (var key in obj) if (_.has(obj, key)) return false;\n    return true;\n  };\n\n  // Is a given value a DOM element?\n  _.isElement = function(obj) {\n    return !!(obj && obj.nodeType === 1);\n  };\n\n  // Is a given value an array?\n  // Delegates to ECMA5's native Array.isArray\n  _.isArray = nativeIsArray || function(obj) {\n    return toString.call(obj) == '[object Array]';\n  };\n\n  // Is a given variable an object?\n  _.isObject = function(obj) {\n    return obj === Object(obj);\n  };\n\n  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.\n  each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {\n    _['is' + name] = function(obj) {\n      return toString.call(obj) == '[object ' + name + ']';\n    };\n  });\n\n  // Define a fallback version of the method in browsers (ahem, IE), where\n  // there isn't any inspectable \"Arguments\" type.\n  if (!_.isArguments(arguments)) {\n    _.isArguments = function(obj) {\n      return !!(obj && _.has(obj, 'callee'));\n    };\n  }\n\n  // Optimize `isFunction` if appropriate.\n  if (typeof (/./) !== 'function') {\n    _.isFunction = function(obj) {\n      return typeof obj === 'function';\n    };\n  }\n\n  // Is a given object a finite number?\n  _.isFinite = function(obj) {\n    return isFinite(obj) && !isNaN(parseFloat(obj));\n  };\n\n  // Is the given value `NaN`? (NaN is the only number which does not equal itself).\n  _.isNaN = function(obj) {\n    return _.isNumber(obj) && obj != +obj;\n  };\n\n  // Is a given value a boolean?\n  _.isBoolean = function(obj) {\n    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';\n  };\n\n  // Is a given value equal to null?\n  _.isNull = function(obj) {\n    return obj === null;\n  };\n\n  // Is a given variable undefined?\n  _.isUndefined = function(obj) {\n    return obj === void 0;\n  };\n\n  // Shortcut function for checking if an object has a given property directly\n  // on itself (in other words, not on a prototype).\n  _.has = function(obj, key) {\n    return hasOwnProperty.call(obj, key);\n  };\n\n  // Utility Functions\n  // -----------------\n\n  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\n  // previous owner. Returns a reference to the Underscore object.\n  _.noConflict = function() {\n    root._ = previousUnderscore;\n    return this;\n  };\n\n  // Keep the identity function around for default iterators.\n  _.identity = function(value) {\n    return value;\n  };\n\n  // Run a function **n** times.\n  _.times = function(n, iterator, context) {\n    var accum = Array(n);\n    for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);\n    return accum;\n  };\n\n  // Return a random integer between min and max (inclusive).\n  _.random = function(min, max) {\n    if (max == null) {\n      max = min;\n      min = 0;\n    }\n    return min + Math.floor(Math.random() * (max - min + 1));\n  };\n\n  // List of HTML entities for escaping.\n  var entityMap = {\n    escape: {\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      \"'\": '&#x27;',\n      '/': '&#x2F;'\n    }\n  };\n  entityMap.unescape = _.invert(entityMap.escape);\n\n  // Regexes containing the keys and values listed immediately above.\n  var entityRegexes = {\n    escape:   new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),\n    unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')\n  };\n\n  // Functions for escaping and unescaping strings to/from HTML interpolation.\n  _.each(['escape', 'unescape'], function(method) {\n    _[method] = function(string) {\n      if (string == null) return '';\n      return ('' + string).replace(entityRegexes[method], function(match) {\n        return entityMap[method][match];\n      });\n    };\n  });\n\n  // If the value of the named property is a function then invoke it;\n  // otherwise, return it.\n  _.result = function(object, property) {\n    if (object == null) return null;\n    var value = object[property];\n    return _.isFunction(value) ? value.call(object) : value;\n  };\n\n  // Add your own custom functions to the Underscore object.\n  _.mixin = function(obj) {\n    each(_.functions(obj), function(name){\n      var func = _[name] = obj[name];\n      _.prototype[name] = function() {\n        var args = [this._wrapped];\n        push.apply(args, arguments);\n        return result.call(this, func.apply(_, args));\n      };\n    });\n  };\n\n  // Generate a unique integer id (unique within the entire client session).\n  // Useful for temporary DOM ids.\n  var idCounter = 0;\n  _.uniqueId = function(prefix) {\n    var id = ++idCounter + '';\n    return prefix ? prefix + id : id;\n  };\n\n  // By default, Underscore uses ERB-style template delimiters, change the\n  // following template settings to use alternative delimiters.\n  _.templateSettings = {\n    evaluate    : /<%([\\s\\S]+?)%>/g,\n    interpolate : /<%=([\\s\\S]+?)%>/g,\n    escape      : /<%-([\\s\\S]+?)%>/g\n  };\n\n  // When customizing `templateSettings`, if you don't want to define an\n  // interpolation, evaluation or escaping regex, we need one that is\n  // guaranteed not to match.\n  var noMatch = /(.)^/;\n\n  // Certain characters need to be escaped so that they can be put into a\n  // string literal.\n  var escapes = {\n    \"'\":      \"'\",\n    '\\\\':     '\\\\',\n    '\\r':     'r',\n    '\\n':     'n',\n    '\\t':     't',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  var escaper = /\\\\|'|\\r|\\n|\\t|\\u2028|\\u2029/g;\n\n  // JavaScript micro-templating, similar to John Resig's implementation.\n  // Underscore templating handles arbitrary delimiters, preserves whitespace,\n  // and correctly escapes quotes within interpolated code.\n  _.template = function(text, data, settings) {\n    var render;\n    settings = _.defaults({}, settings, _.templateSettings);\n\n    // Combine delimiters into one regular expression via alternation.\n    var matcher = new RegExp([\n      (settings.escape || noMatch).source,\n      (settings.interpolate || noMatch).source,\n      (settings.evaluate || noMatch).source\n    ].join('|') + '|$', 'g');\n\n    // Compile the template source, escaping string literals appropriately.\n    var index = 0;\n    var source = \"__p+='\";\n    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n      source += text.slice(index, offset)\n        .replace(escaper, function(match) { return '\\\\' + escapes[match]; });\n\n      if (escape) {\n        source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n      }\n      if (interpolate) {\n        source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n      }\n      if (evaluate) {\n        source += \"';\\n\" + evaluate + \"\\n__p+='\";\n      }\n      index = offset + match.length;\n      return match;\n    });\n    source += \"';\\n\";\n\n    // If a variable is not specified, place data values in local scope.\n    if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n    source = \"var __t,__p='',__j=Array.prototype.join,\" +\n      \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n      source + \"return __p;\\n\";\n\n    try {\n      render = new Function(settings.variable || 'obj', '_', source);\n    } catch (e) {\n      e.source = source;\n      throw e;\n    }\n\n    if (data) return render(data, _);\n    var template = function(data) {\n      return render.call(this, data, _);\n    };\n\n    // Provide the compiled function source as a convenience for precompilation.\n    template.source = 'function(' + (settings.variable || 'obj') + '){\\n' + source + '}';\n\n    return template;\n  };\n\n  // Add a \"chain\" function, which will delegate to the wrapper.\n  _.chain = function(obj) {\n    return _(obj).chain();\n  };\n\n  // OOP\n  // ---------------\n  // If Underscore is called as a function, it returns a wrapped object that\n  // can be used OO-style. This wrapper holds altered versions of all the\n  // underscore functions. Wrapped objects may be chained.\n\n  // Helper function to continue chaining intermediate results.\n  var result = function(obj) {\n    return this._chain ? _(obj).chain() : obj;\n  };\n\n  // Add all of the Underscore functions to the wrapper object.\n  _.mixin(_);\n\n  // Add all mutator Array functions to the wrapper.\n  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      var obj = this._wrapped;\n      method.apply(obj, arguments);\n      if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];\n      return result.call(this, obj);\n    };\n  });\n\n  // Add all accessor Array functions to the wrapper.\n  each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      return result.call(this, method.apply(this._wrapped, arguments));\n    };\n  });\n\n  _.extend(_.prototype, {\n\n    // Start chaining a wrapped Underscore object.\n    chain: function() {\n      this._chain = true;\n      return this;\n    },\n\n    // Extracts the result from a wrapped and chained object.\n    value: function() {\n      return this._wrapped;\n    }\n\n  });\n\n}).call(this);\n\n},{}],119:[function(require,module,exports){\nexports.none = Object.create({\n    value: function() {\n        throw new Error('Called value on none');\n    },\n    isNone: function() {\n        return true;\n    },\n    isSome: function() {\n        return false;\n    },\n    map: function() {\n        return exports.none;\n    },\n    flatMap: function() {\n        return exports.none;\n    },\n    toArray: function() {\n        return [];\n    },\n    orElse: callOrReturn,\n    valueOrElse: callOrReturn\n});\n\nfunction callOrReturn(value) {\n    if (typeof(value) == \"function\") {\n        return value();\n    } else {\n        return value;\n    }\n}\n\nexports.some = function(value) {\n    return new Some(value);\n};\n\nvar Some = function(value) {\n    this._value = value;\n};\n\nSome.prototype.value = function() {\n    return this._value;\n};\n\nSome.prototype.isNone = function() {\n    return false;\n};\n\nSome.prototype.isSome = function() {\n    return true;\n};\n\nSome.prototype.map = function(func) {\n    return new Some(func(this._value));\n};\n\nSome.prototype.flatMap = function(func) {\n    return func(this._value);\n};\n\nSome.prototype.toArray = function() {\n    return [this._value];\n};\n\nSome.prototype.orElse = function(value) {\n    return this;\n};\n\nSome.prototype.valueOrElse = function(value) {\n    return this._value;\n};\n\nexports.isOption = function(value) {\n    return value === exports.none || value instanceof Some;\n};\n\nexports.fromNullable = function(value) {\n    if (value == null) {\n        return exports.none;\n    }\n    return new Some(value);\n}\n\n},{}],120:[function(require,module,exports){\n// Top level file is just a mixin of submodules & constants\n'use strict';\n\nvar assign    = require('./lib/utils/common').assign;\n\nvar deflate   = require('./lib/deflate');\nvar inflate   = require('./lib/inflate');\nvar constants = require('./lib/zlib/constants');\n\nvar pako = {};\n\nassign(pako, deflate, inflate, constants);\n\nmodule.exports = pako;\n\n},{\"./lib/deflate\":121,\"./lib/inflate\":122,\"./lib/utils/common\":123,\"./lib/zlib/constants\":126}],121:[function(require,module,exports){\n'use strict';\n\n\nvar zlib_deflate = require('./zlib/deflate');\nvar utils        = require('./utils/common');\nvar strings      = require('./utils/strings');\nvar msg          = require('./zlib/messages');\nvar ZStream      = require('./zlib/zstream');\n\nvar toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nvar Z_NO_FLUSH      = 0;\nvar Z_FINISH        = 4;\n\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\nvar Z_SYNC_FLUSH    = 2;\n\nvar Z_DEFAULT_COMPRESSION = -1;\n\nvar Z_DEFAULT_STRATEGY    = 0;\n\nvar Z_DEFLATED  = 8;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overriden.\n **/\n\n/**\n * Deflate.result -> Uint8Array|Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param)  or if you\n * push a chunk with explicit flush (call [[Deflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n *    (each char code [0..255])\n * - `header` (Object) - custom header for gzip\n *   - `text` (Boolean) - true if compressed data believed to be text\n *   - `time` (Number) - modification time, unix timestamp\n *   - `os` (Number) - operation system code\n *   - `extra` (Array) - array of bytes with extra data (max 65536)\n *   - `name` (String) - file name (binary string)\n *   - `comment` (String) - comment (binary string)\n *   - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true);  // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate(options) {\n  if (!(this instanceof Deflate)) return new Deflate(options);\n\n  this.options = utils.assign({\n    level: Z_DEFAULT_COMPRESSION,\n    method: Z_DEFLATED,\n    chunkSize: 16384,\n    windowBits: 15,\n    memLevel: 8,\n    strategy: Z_DEFAULT_STRATEGY,\n    to: ''\n  }, options || {});\n\n  var opt = this.options;\n\n  if (opt.raw && (opt.windowBits > 0)) {\n    opt.windowBits = -opt.windowBits;\n  }\n\n  else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n    opt.windowBits += 16;\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm = new ZStream();\n  this.strm.avail_out = 0;\n\n  var status = zlib_deflate.deflateInit2(\n    this.strm,\n    opt.level,\n    opt.method,\n    opt.windowBits,\n    opt.memLevel,\n    opt.strategy\n  );\n\n  if (status !== Z_OK) {\n    throw new Error(msg[status]);\n  }\n\n  if (opt.header) {\n    zlib_deflate.deflateSetHeader(this.strm, opt.header);\n  }\n\n  if (opt.dictionary) {\n    var dict;\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      // If we need to compress text, change encoding to utf8.\n      dict = strings.string2buf(opt.dictionary);\n    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n      dict = new Uint8Array(opt.dictionary);\n    } else {\n      dict = opt.dictionary;\n    }\n\n    status = zlib_deflate.deflateSetDictionary(this.strm, dict);\n\n    if (status !== Z_OK) {\n      throw new Error(msg[status]);\n    }\n\n    this._dict_set = true;\n  }\n}\n\n/**\n * Deflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be\n *   converted to utf8 byte sequence.\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the compression context.\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * array format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nDeflate.prototype.push = function (data, mode) {\n  var strm = this.strm;\n  var chunkSize = this.options.chunkSize;\n  var status, _mode;\n\n  if (this.ended) { return false; }\n\n  _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // If we need to compress text, change encoding to utf8.\n    strm.input = strings.string2buf(data);\n  } else if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  do {\n    if (strm.avail_out === 0) {\n      strm.output = new utils.Buf8(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n    status = zlib_deflate.deflate(strm, _mode);    /* no bad return value */\n\n    if (status !== Z_STREAM_END && status !== Z_OK) {\n      this.onEnd(status);\n      this.ended = true;\n      return false;\n    }\n    if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) {\n      if (this.options.to === 'string') {\n        this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));\n      } else {\n        this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n      }\n    }\n  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);\n\n  // Finalize on the last chunk.\n  if (_mode === Z_FINISH) {\n    status = zlib_deflate.deflateEnd(this.strm);\n    this.onEnd(status);\n    this.ended = true;\n    return status === Z_OK;\n  }\n\n  // callback interim results if Z_SYNC_FLUSH.\n  if (_mode === Z_SYNC_FLUSH) {\n    this.onEnd(Z_OK);\n    strm.avail_out = 0;\n    return true;\n  }\n\n  return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): ouput data. Type of array depends\n *   on js engine support. When string output requested, each chunk\n *   will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === Z_OK) {\n    if (this.options.to === 'string') {\n      this.result = this.chunks.join('');\n    } else {\n      this.result = utils.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n *    (each char code [0..255])\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , data = Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate(input, options) {\n  var deflator = new Deflate(options);\n\n  deflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (deflator.err) { throw deflator.msg; }\n\n  return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw(input, options) {\n  options = options || {};\n  options.raw = true;\n  return deflate(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip(input, options) {\n  options = options || {};\n  options.gzip = true;\n  return deflate(input, options);\n}\n\n\nexports.Deflate = Deflate;\nexports.deflate = deflate;\nexports.deflateRaw = deflateRaw;\nexports.gzip = gzip;\n\n},{\"./utils/common\":123,\"./utils/strings\":124,\"./zlib/deflate\":128,\"./zlib/messages\":133,\"./zlib/zstream\":135}],122:[function(require,module,exports){\n'use strict';\n\n\nvar zlib_inflate = require('./zlib/inflate');\nvar utils        = require('./utils/common');\nvar strings      = require('./utils/strings');\nvar c            = require('./zlib/constants');\nvar msg          = require('./zlib/messages');\nvar ZStream      = require('./zlib/zstream');\nvar GZheader     = require('./zlib/gzheader');\n\nvar toString = Object.prototype.toString;\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overriden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you\n * push a chunk with explicit flush (call [[Inflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true);  // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate(options) {\n  if (!(this instanceof Inflate)) return new Inflate(options);\n\n  this.options = utils.assign({\n    chunkSize: 16384,\n    windowBits: 0,\n    to: ''\n  }, options || {});\n\n  var opt = this.options;\n\n  // Force window size for `raw` data, if not set directly,\n  // because we have no header for autodetect.\n  if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n    opt.windowBits = -opt.windowBits;\n    if (opt.windowBits === 0) { opt.windowBits = -15; }\n  }\n\n  // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n  if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n      !(options && options.windowBits)) {\n    opt.windowBits += 32;\n  }\n\n  // Gzip header has no info about windows size, we can do autodetect only\n  // for deflate. So, if window size not set, force it to max when gzip possible\n  if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n    // bit 3 (16) -> gzipped data\n    // bit 4 (32) -> autodetect gzip/deflate\n    if ((opt.windowBits & 15) === 0) {\n      opt.windowBits |= 15;\n    }\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm   = new ZStream();\n  this.strm.avail_out = 0;\n\n  var status  = zlib_inflate.inflateInit2(\n    this.strm,\n    opt.windowBits\n  );\n\n  if (status !== c.Z_OK) {\n    throw new Error(msg[status]);\n  }\n\n  this.header = new GZheader();\n\n  zlib_inflate.inflateGetHeader(this.strm, this.header);\n}\n\n/**\n * Inflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the decompression context.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nInflate.prototype.push = function (data, mode) {\n  var strm = this.strm;\n  var chunkSize = this.options.chunkSize;\n  var dictionary = this.options.dictionary;\n  var status, _mode;\n  var next_out_utf8, tail, utf8str;\n  var dict;\n\n  // Flag to properly process Z_BUF_ERROR on testing inflate call\n  // when we check that all output data was flushed.\n  var allowBufError = false;\n\n  if (this.ended) { return false; }\n  _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // Only binary strings can be decompressed on practice\n    strm.input = strings.binstring2buf(data);\n  } else if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  do {\n    if (strm.avail_out === 0) {\n      strm.output = new utils.Buf8(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n\n    status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);    /* no bad return value */\n\n    if (status === c.Z_NEED_DICT && dictionary) {\n      // Convert data if needed\n      if (typeof dictionary === 'string') {\n        dict = strings.string2buf(dictionary);\n      } else if (toString.call(dictionary) === '[object ArrayBuffer]') {\n        dict = new Uint8Array(dictionary);\n      } else {\n        dict = dictionary;\n      }\n\n      status = zlib_inflate.inflateSetDictionary(this.strm, dict);\n\n    }\n\n    if (status === c.Z_BUF_ERROR && allowBufError === true) {\n      status = c.Z_OK;\n      allowBufError = false;\n    }\n\n    if (status !== c.Z_STREAM_END && status !== c.Z_OK) {\n      this.onEnd(status);\n      this.ended = true;\n      return false;\n    }\n\n    if (strm.next_out) {\n      if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) {\n\n        if (this.options.to === 'string') {\n\n          next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n          tail = strm.next_out - next_out_utf8;\n          utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n          // move tail\n          strm.next_out = tail;\n          strm.avail_out = chunkSize - tail;\n          if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }\n\n          this.onData(utf8str);\n\n        } else {\n          this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n        }\n      }\n    }\n\n    // When no more input data, we should check that internal inflate buffers\n    // are flushed. The only way to do it when avail_out = 0 - run one more\n    // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.\n    // Here we set flag to process this error properly.\n    //\n    // NOTE. Deflate does not return error in this case and does not needs such\n    // logic.\n    if (strm.avail_in === 0 && strm.avail_out === 0) {\n      allowBufError = true;\n    }\n\n  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END);\n\n  if (status === c.Z_STREAM_END) {\n    _mode = c.Z_FINISH;\n  }\n\n  // Finalize on the last chunk.\n  if (_mode === c.Z_FINISH) {\n    status = zlib_inflate.inflateEnd(this.strm);\n    this.onEnd(status);\n    this.ended = true;\n    return status === c.Z_OK;\n  }\n\n  // callback interim results if Z_SYNC_FLUSH.\n  if (_mode === c.Z_SYNC_FLUSH) {\n    this.onEnd(c.Z_OK);\n    strm.avail_out = 0;\n    return true;\n  }\n\n  return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): ouput data. Type of array depends\n *   on js engine support. When string output requested, each chunk\n *   will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === c.Z_OK) {\n    if (this.options.to === 'string') {\n      // Glue & convert here, until we teach pako to send\n      // utf8 alligned strings to onData\n      this.result = this.chunks.join('');\n    } else {\n      this.result = utils.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , input = pako.deflate([1,2,3,4,5,6,7,8,9])\n *   , output;\n *\n * try {\n *   output = pako.inflate(input);\n * } catch (err)\n *   console.log(err);\n * }\n * ```\n **/\nfunction inflate(input, options) {\n  var inflator = new Inflate(options);\n\n  inflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (inflator.err) { throw inflator.msg; }\n\n  return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw(input, options) {\n  options = options || {};\n  options.raw = true;\n  return inflate(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nexports.Inflate = Inflate;\nexports.inflate = inflate;\nexports.inflateRaw = inflateRaw;\nexports.ungzip  = inflate;\n\n},{\"./utils/common\":123,\"./utils/strings\":124,\"./zlib/constants\":126,\"./zlib/gzheader\":129,\"./zlib/inflate\":131,\"./zlib/messages\":133,\"./zlib/zstream\":135}],123:[function(require,module,exports){\n'use strict';\n\n\nvar TYPED_OK =  (typeof Uint8Array !== 'undefined') &&\n                (typeof Uint16Array !== 'undefined') &&\n                (typeof Int32Array !== 'undefined');\n\n\nexports.assign = function (obj /*from1, from2, from3, ...*/) {\n  var sources = Array.prototype.slice.call(arguments, 1);\n  while (sources.length) {\n    var source = sources.shift();\n    if (!source) { continue; }\n\n    if (typeof source !== 'object') {\n      throw new TypeError(source + 'must be non-object');\n    }\n\n    for (var p in source) {\n      if (source.hasOwnProperty(p)) {\n        obj[p] = source[p];\n      }\n    }\n  }\n\n  return obj;\n};\n\n\n// reduce buffer size, avoiding mem copy\nexports.shrinkBuf = function (buf, size) {\n  if (buf.length === size) { return buf; }\n  if (buf.subarray) { return buf.subarray(0, size); }\n  buf.length = size;\n  return buf;\n};\n\n\nvar fnTyped = {\n  arraySet: function (dest, src, src_offs, len, dest_offs) {\n    if (src.subarray && dest.subarray) {\n      dest.set(src.subarray(src_offs, src_offs + len), dest_offs);\n      return;\n    }\n    // Fallback to ordinary array\n    for (var i = 0; i < len; i++) {\n      dest[dest_offs + i] = src[src_offs + i];\n    }\n  },\n  // Join array of chunks to single array.\n  flattenChunks: function (chunks) {\n    var i, l, len, pos, chunk, result;\n\n    // calculate data length\n    len = 0;\n    for (i = 0, l = chunks.length; i < l; i++) {\n      len += chunks[i].length;\n    }\n\n    // join chunks\n    result = new Uint8Array(len);\n    pos = 0;\n    for (i = 0, l = chunks.length; i < l; i++) {\n      chunk = chunks[i];\n      result.set(chunk, pos);\n      pos += chunk.length;\n    }\n\n    return result;\n  }\n};\n\nvar fnUntyped = {\n  arraySet: function (dest, src, src_offs, len, dest_offs) {\n    for (var i = 0; i < len; i++) {\n      dest[dest_offs + i] = src[src_offs + i];\n    }\n  },\n  // Join array of chunks to single array.\n  flattenChunks: function (chunks) {\n    return [].concat.apply([], chunks);\n  }\n};\n\n\n// Enable/Disable typed arrays use, for testing\n//\nexports.setTyped = function (on) {\n  if (on) {\n    exports.Buf8  = Uint8Array;\n    exports.Buf16 = Uint16Array;\n    exports.Buf32 = Int32Array;\n    exports.assign(exports, fnTyped);\n  } else {\n    exports.Buf8  = Array;\n    exports.Buf16 = Array;\n    exports.Buf32 = Array;\n    exports.assign(exports, fnUntyped);\n  }\n};\n\nexports.setTyped(TYPED_OK);\n\n},{}],124:[function(require,module,exports){\n// String encode/decode helpers\n'use strict';\n\n\nvar utils = require('./common');\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safary\n//\nvar STR_APPLY_OK = true;\nvar STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; }\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nvar _utf8len = new utils.Buf8(256);\nfor (var q = 0; q < 256; q++) {\n  _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nexports.string2buf = function (str) {\n  var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n  // count binary size\n  for (m_pos = 0; m_pos < str_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n  }\n\n  // allocate buffer\n  buf = new utils.Buf8(buf_len);\n\n  // convert\n  for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    if (c < 0x80) {\n      /* one byte */\n      buf[i++] = c;\n    } else if (c < 0x800) {\n      /* two bytes */\n      buf[i++] = 0xC0 | (c >>> 6);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else if (c < 0x10000) {\n      /* three bytes */\n      buf[i++] = 0xE0 | (c >>> 12);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else {\n      /* four bytes */\n      buf[i++] = 0xf0 | (c >>> 18);\n      buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    }\n  }\n\n  return buf;\n};\n\n// Helper (used in 2 places)\nfunction buf2binstring(buf, len) {\n  // use fallback for big arrays to avoid stack overflow\n  if (len < 65537) {\n    if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {\n      return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));\n    }\n  }\n\n  var result = '';\n  for (var i = 0; i < len; i++) {\n    result += String.fromCharCode(buf[i]);\n  }\n  return result;\n}\n\n\n// Convert byte array to binary string\nexports.buf2binstring = function (buf) {\n  return buf2binstring(buf, buf.length);\n};\n\n\n// Convert binary string (typed, when possible)\nexports.binstring2buf = function (str) {\n  var buf = new utils.Buf8(str.length);\n  for (var i = 0, len = buf.length; i < len; i++) {\n    buf[i] = str.charCodeAt(i);\n  }\n  return buf;\n};\n\n\n// convert array to string\nexports.buf2string = function (buf, max) {\n  var i, out, c, c_len;\n  var len = max || buf.length;\n\n  // Reserve max possible length (2 words per char)\n  // NB: by unknown reasons, Array is significantly faster for\n  //     String.fromCharCode.apply than Uint16Array.\n  var utf16buf = new Array(len * 2);\n\n  for (out = 0, i = 0; i < len;) {\n    c = buf[i++];\n    // quick process ascii\n    if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n    c_len = _utf8len[c];\n    // skip 5 & 6 byte codes\n    if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n    // apply mask on first byte\n    c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n    // join the rest\n    while (c_len > 1 && i < len) {\n      c = (c << 6) | (buf[i++] & 0x3f);\n      c_len--;\n    }\n\n    // terminated by end of string?\n    if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n    if (c < 0x10000) {\n      utf16buf[out++] = c;\n    } else {\n      c -= 0x10000;\n      utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n      utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n    }\n  }\n\n  return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max   - length limit (mandatory);\nexports.utf8border = function (buf, max) {\n  var pos;\n\n  max = max || buf.length;\n  if (max > buf.length) { max = buf.length; }\n\n  // go back from last position, until start of sequence found\n  pos = max - 1;\n  while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n  // Fuckup - very small and broken sequence,\n  // return max, because we should return something anyway.\n  if (pos < 0) { return max; }\n\n  // If we came to start of buffer - that means vuffer is too small,\n  // return max too.\n  if (pos === 0) { return max; }\n\n  return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\n},{\"./common\":123}],125:[function(require,module,exports){\n'use strict';\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It doesn't worth to make additional optimizationa as in original.\n// Small size is preferable.\n\nfunction adler32(adler, buf, len, pos) {\n  var s1 = (adler & 0xffff) |0,\n      s2 = ((adler >>> 16) & 0xffff) |0,\n      n = 0;\n\n  while (len !== 0) {\n    // Set limit ~ twice less than 5552, to keep\n    // s2 in 31-bits, because we force signed ints.\n    // in other case %= will fail.\n    n = len > 2000 ? 2000 : len;\n    len -= n;\n\n    do {\n      s1 = (s1 + buf[pos++]) |0;\n      s2 = (s2 + s1) |0;\n    } while (--n);\n\n    s1 %= 65521;\n    s2 %= 65521;\n  }\n\n  return (s1 | (s2 << 16)) |0;\n}\n\n\nmodule.exports = adler32;\n\n},{}],126:[function(require,module,exports){\n'use strict';\n\n\nmodule.exports = {\n\n  /* Allowed flush values; see deflate() and inflate() below for details */\n  Z_NO_FLUSH:         0,\n  Z_PARTIAL_FLUSH:    1,\n  Z_SYNC_FLUSH:       2,\n  Z_FULL_FLUSH:       3,\n  Z_FINISH:           4,\n  Z_BLOCK:            5,\n  Z_TREES:            6,\n\n  /* Return codes for the compression/decompression functions. Negative values\n  * are errors, positive values are used for special but normal events.\n  */\n  Z_OK:               0,\n  Z_STREAM_END:       1,\n  Z_NEED_DICT:        2,\n  Z_ERRNO:           -1,\n  Z_STREAM_ERROR:    -2,\n  Z_DATA_ERROR:      -3,\n  //Z_MEM_ERROR:     -4,\n  Z_BUF_ERROR:       -5,\n  //Z_VERSION_ERROR: -6,\n\n  /* compression levels */\n  Z_NO_COMPRESSION:         0,\n  Z_BEST_SPEED:             1,\n  Z_BEST_COMPRESSION:       9,\n  Z_DEFAULT_COMPRESSION:   -1,\n\n\n  Z_FILTERED:               1,\n  Z_HUFFMAN_ONLY:           2,\n  Z_RLE:                    3,\n  Z_FIXED:                  4,\n  Z_DEFAULT_STRATEGY:       0,\n\n  /* Possible values of the data_type field (though see inflate()) */\n  Z_BINARY:                 0,\n  Z_TEXT:                   1,\n  //Z_ASCII:                1, // = Z_TEXT (deprecated)\n  Z_UNKNOWN:                2,\n\n  /* The deflate compression method */\n  Z_DEFLATED:               8\n  //Z_NULL:                 null // Use -1 or null inline, depending on var type\n};\n\n},{}],127:[function(require,module,exports){\n'use strict';\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n\n// Use ordinary array, since untyped makes no boost here\nfunction makeTable() {\n  var c, table = [];\n\n  for (var n = 0; n < 256; n++) {\n    c = n;\n    for (var k = 0; k < 8; k++) {\n      c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n    }\n    table[n] = c;\n  }\n\n  return table;\n}\n\n// Create table on load. Just 255 signed longs. Not a problem.\nvar crcTable = makeTable();\n\n\nfunction crc32(crc, buf, len, pos) {\n  var t = crcTable,\n      end = pos + len;\n\n  crc ^= -1;\n\n  for (var i = pos; i < end; i++) {\n    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n  }\n\n  return (crc ^ (-1)); // >>> 0;\n}\n\n\nmodule.exports = crc32;\n\n},{}],128:[function(require,module,exports){\n'use strict';\n\nvar utils   = require('../utils/common');\nvar trees   = require('./trees');\nvar adler32 = require('./adler32');\nvar crc32   = require('./crc32');\nvar msg     = require('./messages');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\nvar Z_NO_FLUSH      = 0;\nvar Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH    = 2;\nvar Z_FULL_FLUSH    = 3;\nvar Z_FINISH        = 4;\nvar Z_BLOCK         = 5;\n//var Z_TREES         = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\n//var Z_NEED_DICT     = 2;\n//var Z_ERRNO         = -1;\nvar Z_STREAM_ERROR  = -2;\nvar Z_DATA_ERROR    = -3;\n//var Z_MEM_ERROR     = -4;\nvar Z_BUF_ERROR     = -5;\n//var Z_VERSION_ERROR = -6;\n\n\n/* compression levels */\n//var Z_NO_COMPRESSION      = 0;\n//var Z_BEST_SPEED          = 1;\n//var Z_BEST_COMPRESSION    = 9;\nvar Z_DEFAULT_COMPRESSION = -1;\n\n\nvar Z_FILTERED            = 1;\nvar Z_HUFFMAN_ONLY        = 2;\nvar Z_RLE                 = 3;\nvar Z_FIXED               = 4;\nvar Z_DEFAULT_STRATEGY    = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\n//var Z_BINARY              = 0;\n//var Z_TEXT                = 1;\n//var Z_ASCII               = 1; // = Z_TEXT\nvar Z_UNKNOWN             = 2;\n\n\n/* The deflate compression method */\nvar Z_DEFLATED  = 8;\n\n/*============================================================================*/\n\n\nvar MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_MEM_LEVEL = 8;\n\n\nvar LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nvar LITERALS      = 256;\n/* number of literal bytes 0..255 */\nvar L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nvar D_CODES       = 30;\n/* number of distance codes */\nvar BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\nvar HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\nvar MAX_BITS  = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\nvar MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nvar PRESET_DICT = 0x20;\n\nvar INIT_STATE = 42;\nvar EXTRA_STATE = 69;\nvar NAME_STATE = 73;\nvar COMMENT_STATE = 91;\nvar HCRC_STATE = 103;\nvar BUSY_STATE = 113;\nvar FINISH_STATE = 666;\n\nvar BS_NEED_MORE      = 1; /* block not completed, need more input or more output */\nvar BS_BLOCK_DONE     = 2; /* block flush performed */\nvar BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nvar BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */\n\nvar OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nfunction err(strm, errorCode) {\n  strm.msg = msg[errorCode];\n  return errorCode;\n}\n\nfunction rank(f) {\n  return ((f) << 1) - ((f) > 4 ? 9 : 0);\n}\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nfunction flush_pending(strm) {\n  var s = strm.state;\n\n  //_tr_flush_bits(s);\n  var len = s.pending;\n  if (len > strm.avail_out) {\n    len = strm.avail_out;\n  }\n  if (len === 0) { return; }\n\n  utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);\n  strm.next_out += len;\n  s.pending_out += len;\n  strm.total_out += len;\n  strm.avail_out -= len;\n  s.pending -= len;\n  if (s.pending === 0) {\n    s.pending_out = 0;\n  }\n}\n\n\nfunction flush_block_only(s, last) {\n  trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n  s.block_start = s.strstart;\n  flush_pending(s.strm);\n}\n\n\nfunction put_byte(s, b) {\n  s.pending_buf[s.pending++] = b;\n}\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nfunction putShortMSB(s, b) {\n//  put_byte(s, (Byte)(b >> 8));\n//  put_byte(s, (Byte)(b & 0xff));\n  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n  s.pending_buf[s.pending++] = b & 0xff;\n}\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read.  All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nfunction read_buf(strm, buf, start, size) {\n  var len = strm.avail_in;\n\n  if (len > size) { len = size; }\n  if (len === 0) { return 0; }\n\n  strm.avail_in -= len;\n\n  // zmemcpy(buf, strm->next_in, len);\n  utils.arraySet(buf, strm.input, strm.next_in, len, start);\n  if (strm.state.wrap === 1) {\n    strm.adler = adler32(strm.adler, buf, len, start);\n  }\n\n  else if (strm.state.wrap === 2) {\n    strm.adler = crc32(strm.adler, buf, len, start);\n  }\n\n  strm.next_in += len;\n  strm.total_in += len;\n\n  return len;\n}\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nfunction longest_match(s, cur_match) {\n  var chain_length = s.max_chain_length;      /* max hash chain length */\n  var scan = s.strstart; /* current string */\n  var match;                       /* matched string */\n  var len;                           /* length of current match */\n  var best_len = s.prev_length;              /* best match length so far */\n  var nice_match = s.nice_match;             /* stop if match long enough */\n  var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n  var _win = s.window; // shortcut\n\n  var wmask = s.w_mask;\n  var prev  = s.prev;\n\n  /* Stop when cur_match becomes <= limit. To simplify the code,\n   * we prevent matches with the string of window index 0.\n   */\n\n  var strend = s.strstart + MAX_MATCH;\n  var scan_end1  = _win[scan + best_len - 1];\n  var scan_end   = _win[scan + best_len];\n\n  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n   * It is easy to get rid of this optimization if necessary.\n   */\n  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n  /* Do not waste too much time if we already have a good match: */\n  if (s.prev_length >= s.good_match) {\n    chain_length >>= 2;\n  }\n  /* Do not look for matches beyond the end of the input. This is necessary\n   * to make deflate deterministic.\n   */\n  if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n  do {\n    // Assert(cur_match < s->strstart, \"no future\");\n    match = cur_match;\n\n    /* Skip to next match if the match length cannot increase\n     * or if the match length is less than 2.  Note that the checks below\n     * for insufficient lookahead only occur occasionally for performance\n     * reasons.  Therefore uninitialized memory will be accessed, and\n     * conditional jumps will be made that depend on those values.\n     * However the length of the match is limited to the lookahead, so\n     * the output of deflate is not affected by the uninitialized values.\n     */\n\n    if (_win[match + best_len]     !== scan_end  ||\n        _win[match + best_len - 1] !== scan_end1 ||\n        _win[match]                !== _win[scan] ||\n        _win[++match]              !== _win[scan + 1]) {\n      continue;\n    }\n\n    /* The check at best_len-1 can be removed because it will be made\n     * again later. (This heuristic is not always a win.)\n     * It is not necessary to compare scan[2] and match[2] since they\n     * are always equal when the other bytes match, given that\n     * the hash keys are equal and that HASH_BITS >= 8.\n     */\n    scan += 2;\n    match++;\n    // Assert(*scan == *match, \"match[2]?\");\n\n    /* We check for insufficient lookahead only every 8th comparison;\n     * the 256th check will be made at strstart+258.\n     */\n    do {\n      /*jshint noempty:false*/\n    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             scan < strend);\n\n    // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n    len = MAX_MATCH - (strend - scan);\n    scan = strend - MAX_MATCH;\n\n    if (len > best_len) {\n      s.match_start = cur_match;\n      best_len = len;\n      if (len >= nice_match) {\n        break;\n      }\n      scan_end1  = _win[scan + best_len - 1];\n      scan_end   = _win[scan + best_len];\n    }\n  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n  if (best_len <= s.lookahead) {\n    return best_len;\n  }\n  return s.lookahead;\n}\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n *    At least one byte has been read, or avail_in == 0; reads are\n *    performed for at least two bytes (required for the zip translate_eol\n *    option -- not supported here).\n */\nfunction fill_window(s) {\n  var _w_size = s.w_size;\n  var p, n, m, more, str;\n\n  //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n  do {\n    more = s.window_size - s.lookahead - s.strstart;\n\n    // JS ints have 32 bit, block below not needed\n    /* Deal with !@#$% 64K limit: */\n    //if (sizeof(int) <= 2) {\n    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n    //        more = wsize;\n    //\n    //  } else if (more == (unsigned)(-1)) {\n    //        /* Very unlikely, but possible on 16 bit machine if\n    //         * strstart == 0 && lookahead == 1 (input done a byte at time)\n    //         */\n    //        more--;\n    //    }\n    //}\n\n\n    /* If the window is almost full and there is insufficient lookahead,\n     * move the upper half to the lower one to make room in the upper half.\n     */\n    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n      utils.arraySet(s.window, s.window, _w_size, _w_size, 0);\n      s.match_start -= _w_size;\n      s.strstart -= _w_size;\n      /* we now have strstart >= MAX_DIST */\n      s.block_start -= _w_size;\n\n      /* Slide the hash table (could be avoided with 32 bit values\n       at the expense of memory usage). We slide even when level == 0\n       to keep the hash table consistent if we switch back to level > 0\n       later. (Using level 0 permanently is not an optimal usage of\n       zlib, so we don't care about this pathological case.)\n       */\n\n      n = s.hash_size;\n      p = n;\n      do {\n        m = s.head[--p];\n        s.head[p] = (m >= _w_size ? m - _w_size : 0);\n      } while (--n);\n\n      n = _w_size;\n      p = n;\n      do {\n        m = s.prev[--p];\n        s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n        /* If n is not on any hash chain, prev[n] is garbage but\n         * its value will never be used.\n         */\n      } while (--n);\n\n      more += _w_size;\n    }\n    if (s.strm.avail_in === 0) {\n      break;\n    }\n\n    /* If there was no sliding:\n     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n     *    more == window_size - lookahead - strstart\n     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n     * => more >= window_size - 2*WSIZE + 2\n     * In the BIG_MEM or MMAP case (not yet supported),\n     *   window_size == input_size + MIN_LOOKAHEAD  &&\n     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n     * Otherwise, window_size == 2*WSIZE so more >= 2.\n     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n     */\n    //Assert(more >= 2, \"more < 2\");\n    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n    s.lookahead += n;\n\n    /* Initialize the hash value now that we have some input: */\n    if (s.lookahead + s.insert >= MIN_MATCH) {\n      str = s.strstart - s.insert;\n      s.ins_h = s.window[str];\n\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;\n//#if MIN_MATCH != 3\n//        Call update_hash() MIN_MATCH-3 more times\n//#endif\n      while (s.insert) {\n        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n        s.prev[str & s.w_mask] = s.head[s.ins_h];\n        s.head[s.ins_h] = str;\n        str++;\n        s.insert--;\n        if (s.lookahead + s.insert < MIN_MATCH) {\n          break;\n        }\n      }\n    }\n    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n     * but this is not important since only literal bytes will be emitted.\n     */\n\n  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n  /* If the WIN_INIT bytes after the end of the current data have never been\n   * written, then zero those bytes in order to avoid memory check reports of\n   * the use of uninitialized (or uninitialised as Julian writes) bytes by\n   * the longest match routines.  Update the high water mark for the next\n   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match\n   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n   */\n//  if (s.high_water < s.window_size) {\n//    var curr = s.strstart + s.lookahead;\n//    var init = 0;\n//\n//    if (s.high_water < curr) {\n//      /* Previous high water mark below current data -- zero WIN_INIT\n//       * bytes or up to end of window, whichever is less.\n//       */\n//      init = s.window_size - curr;\n//      if (init > WIN_INIT)\n//        init = WIN_INIT;\n//      zmemzero(s->window + curr, (unsigned)init);\n//      s->high_water = curr + init;\n//    }\n//    else if (s->high_water < (ulg)curr + WIN_INIT) {\n//      /* High water mark at or above current data, but below current data\n//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n//       * to end of window, whichever is less.\n//       */\n//      init = (ulg)curr + WIN_INIT - s->high_water;\n//      if (init > s->window_size - s->high_water)\n//        init = s->window_size - s->high_water;\n//      zmemzero(s->window + s->high_water, (unsigned)init);\n//      s->high_water += init;\n//    }\n//  }\n//\n//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n//    \"not enough room for search\");\n}\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nfunction deflate_stored(s, flush) {\n  /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n   * to pending_buf_size, and each stored block has a 5 byte header:\n   */\n  var max_block_size = 0xffff;\n\n  if (max_block_size > s.pending_buf_size - 5) {\n    max_block_size = s.pending_buf_size - 5;\n  }\n\n  /* Copy as much as possible from input to output: */\n  for (;;) {\n    /* Fill the window as much as possible: */\n    if (s.lookahead <= 1) {\n\n      //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n      //  s->block_start >= (long)s->w_size, \"slide too late\");\n//      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n//        s.block_start >= s.w_size)) {\n//        throw  new Error(\"slide too late\");\n//      }\n\n      fill_window(s);\n      if (s.lookahead === 0 && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n\n      if (s.lookahead === 0) {\n        break;\n      }\n      /* flush the current block */\n    }\n    //Assert(s->block_start >= 0L, \"block gone\");\n//    if (s.block_start < 0) throw new Error(\"block gone\");\n\n    s.strstart += s.lookahead;\n    s.lookahead = 0;\n\n    /* Emit a stored block if pending_buf will be full: */\n    var max_start = s.block_start + max_block_size;\n\n    if (s.strstart === 0 || s.strstart >= max_start) {\n      /* strstart == 0 is possible when wraparound on 16-bit machine */\n      s.lookahead = s.strstart - max_start;\n      s.strstart = max_start;\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n\n\n    }\n    /* Flush if we may have to slide, otherwise block_start may become\n     * negative and the data will be gone:\n     */\n    if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n\n  s.insert = 0;\n\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n\n  if (s.strstart > s.block_start) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_NEED_MORE;\n}\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nfunction deflate_fast(s, flush) {\n  var hash_head;        /* head of the hash chain */\n  var bflush;           /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) {\n        break; /* flush the current block */\n      }\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     * At this point we have always match_length < MIN_MATCH\n     */\n    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n    }\n    if (s.match_length >= MIN_MATCH) {\n      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n      /*** _tr_tally_dist(s, s.strstart - s.match_start,\n                     s.match_length - MIN_MATCH, bflush); ***/\n      bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n\n      /* Insert new strings in the hash table only if the match length\n       * is not too large. This saves time but degrades compression.\n       */\n      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n        s.match_length--; /* string at strstart already in table */\n        do {\n          s.strstart++;\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n          /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n           * always MIN_MATCH bytes ahead.\n           */\n        } while (--s.match_length !== 0);\n        s.strstart++;\n      } else\n      {\n        s.strstart += s.match_length;\n        s.match_length = 0;\n        s.ins_h = s.window[s.strstart];\n        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;\n\n//#if MIN_MATCH != 3\n//                Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n         * matter since it will be recomputed at next deflate call.\n         */\n      }\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nfunction deflate_slow(s, flush) {\n  var hash_head;          /* head of hash chain */\n  var bflush;              /* set if current block must be flushed */\n\n  var max_insert;\n\n  /* Process the input block. */\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     */\n    s.prev_length = s.match_length;\n    s.prev_match = s.match_start;\n    s.match_length = MIN_MATCH - 1;\n\n    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n        s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n\n      if (s.match_length <= 5 &&\n         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n        /* If prev_match is also MIN_MATCH, match_start is garbage\n         * but we will ignore the current match anyway.\n         */\n        s.match_length = MIN_MATCH - 1;\n      }\n    }\n    /* If there was a match at the previous step and the current\n     * match is not better, output the previous match:\n     */\n    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n      max_insert = s.strstart + s.lookahead - MIN_MATCH;\n      /* Do not insert strings in hash table beyond this. */\n\n      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n                     s.prev_length - MIN_MATCH, bflush);***/\n      bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n      /* Insert in hash table all strings up to the end of the match.\n       * strstart-1 and strstart are already inserted. If there is not\n       * enough lookahead, the last two strings are not inserted in\n       * the hash table.\n       */\n      s.lookahead -= s.prev_length - 1;\n      s.prev_length -= 2;\n      do {\n        if (++s.strstart <= max_insert) {\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n        }\n      } while (--s.prev_length !== 0);\n      s.match_available = 0;\n      s.match_length = MIN_MATCH - 1;\n      s.strstart++;\n\n      if (bflush) {\n        /*** FLUSH_BLOCK(s, 0); ***/\n        flush_block_only(s, false);\n        if (s.strm.avail_out === 0) {\n          return BS_NEED_MORE;\n        }\n        /***/\n      }\n\n    } else if (s.match_available) {\n      /* If there was no match at the previous position, output a\n       * single literal. If there was a match but the current match\n       * is longer, truncate the previous match to a single literal.\n       */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n      if (bflush) {\n        /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n        flush_block_only(s, false);\n        /***/\n      }\n      s.strstart++;\n      s.lookahead--;\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n    } else {\n      /* There is no previous match to compare with, wait for\n       * the next step to decide.\n       */\n      s.match_available = 1;\n      s.strstart++;\n      s.lookahead--;\n    }\n  }\n  //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n  if (s.match_available) {\n    //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n    bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n    s.match_available = 0;\n  }\n  s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_BLOCK_DONE;\n}\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one.  Do not maintain a hash table.  (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nfunction deflate_rle(s, flush) {\n  var bflush;            /* set if current block must be flushed */\n  var prev;              /* byte at distance one to match */\n  var scan, strend;      /* scan goes up to strend for length of run */\n\n  var _win = s.window;\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the longest run, plus one for the unrolled loop.\n     */\n    if (s.lookahead <= MAX_MATCH) {\n      fill_window(s);\n      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* See how many times the previous byte repeats */\n    s.match_length = 0;\n    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n      scan = s.strstart - 1;\n      prev = _win[scan];\n      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n        strend = s.strstart + MAX_MATCH;\n        do {\n          /*jshint noempty:false*/\n        } while (prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 scan < strend);\n        s.match_length = MAX_MATCH - (strend - scan);\n        if (s.match_length > s.lookahead) {\n          s.match_length = s.lookahead;\n        }\n      }\n      //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n    }\n\n    /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n    if (s.match_length >= MIN_MATCH) {\n      //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n      bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n      s.strstart += s.match_length;\n      s.match_length = 0;\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nfunction deflate_huff(s, flush) {\n  var bflush;             /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we have a literal to write. */\n    if (s.lookahead === 0) {\n      fill_window(s);\n      if (s.lookahead === 0) {\n        if (flush === Z_NO_FLUSH) {\n          return BS_NEED_MORE;\n        }\n        break;      /* flush the current block */\n      }\n    }\n\n    /* Output a literal byte */\n    s.match_length = 0;\n    //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n    bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n    s.lookahead--;\n    s.strstart++;\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n  this.good_length = good_length;\n  this.max_lazy = max_lazy;\n  this.nice_length = nice_length;\n  this.max_chain = max_chain;\n  this.func = func;\n}\n\nvar configuration_table;\n\nconfiguration_table = [\n  /*      good lazy nice chain */\n  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */\n  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */\n  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */\n  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */\n\n  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */\n  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */\n  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */\n  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */\n  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */\n  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nfunction lm_init(s) {\n  s.window_size = 2 * s.w_size;\n\n  /*** CLEAR_HASH(s); ***/\n  zero(s.head); // Fill with NIL (= 0);\n\n  /* Set the default configuration parameters:\n   */\n  s.max_lazy_match = configuration_table[s.level].max_lazy;\n  s.good_match = configuration_table[s.level].good_length;\n  s.nice_match = configuration_table[s.level].nice_length;\n  s.max_chain_length = configuration_table[s.level].max_chain;\n\n  s.strstart = 0;\n  s.block_start = 0;\n  s.lookahead = 0;\n  s.insert = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  s.ins_h = 0;\n}\n\n\nfunction DeflateState() {\n  this.strm = null;            /* pointer back to this zlib stream */\n  this.status = 0;            /* as the name implies */\n  this.pending_buf = null;      /* output still pending */\n  this.pending_buf_size = 0;  /* size of pending_buf */\n  this.pending_out = 0;       /* next pending byte to output to the stream */\n  this.pending = 0;           /* nb of bytes in the pending buffer */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.gzhead = null;         /* gzip header information to write */\n  this.gzindex = 0;           /* where in extra, name, or comment */\n  this.method = Z_DEFLATED; /* can only be DEFLATED */\n  this.last_flush = -1;   /* value of flush param for previous deflate call */\n\n  this.w_size = 0;  /* LZ77 window size (32K by default) */\n  this.w_bits = 0;  /* log2(w_size)  (8..16) */\n  this.w_mask = 0;  /* w_size - 1 */\n\n  this.window = null;\n  /* Sliding window. Input bytes are read into the second half of the window,\n   * and move to the first half later to keep a dictionary of at least wSize\n   * bytes. With this organization, matches are limited to a distance of\n   * wSize-MAX_MATCH bytes, but this ensures that IO is always\n   * performed with a length multiple of the block size.\n   */\n\n  this.window_size = 0;\n  /* Actual size of window: 2*wSize, except when the user input buffer\n   * is directly used as sliding window.\n   */\n\n  this.prev = null;\n  /* Link to older string with same hash index. To limit the size of this\n   * array to 64K, this link is maintained only for the last 32K strings.\n   * An index in this array is thus a window index modulo 32K.\n   */\n\n  this.head = null;   /* Heads of the hash chains or NIL. */\n\n  this.ins_h = 0;       /* hash index of string to be inserted */\n  this.hash_size = 0;   /* number of elements in hash table */\n  this.hash_bits = 0;   /* log2(hash_size) */\n  this.hash_mask = 0;   /* hash_size-1 */\n\n  this.hash_shift = 0;\n  /* Number of bits by which ins_h must be shifted at each input\n   * step. It must be such that after MIN_MATCH steps, the oldest\n   * byte no longer takes part in the hash key, that is:\n   *   hash_shift * MIN_MATCH >= hash_bits\n   */\n\n  this.block_start = 0;\n  /* Window position at the beginning of the current output block. Gets\n   * negative when the window is moved backwards.\n   */\n\n  this.match_length = 0;      /* length of best match */\n  this.prev_match = 0;        /* previous match */\n  this.match_available = 0;   /* set if previous match exists */\n  this.strstart = 0;          /* start of string to insert */\n  this.match_start = 0;       /* start of matching string */\n  this.lookahead = 0;         /* number of valid bytes ahead in window */\n\n  this.prev_length = 0;\n  /* Length of the best match at previous step. Matches not greater than this\n   * are discarded. This is used in the lazy match evaluation.\n   */\n\n  this.max_chain_length = 0;\n  /* To speed up deflation, hash chains are never searched beyond this\n   * length.  A higher limit improves compression ratio but degrades the\n   * speed.\n   */\n\n  this.max_lazy_match = 0;\n  /* Attempt to find a better match only when the current match is strictly\n   * smaller than this value. This mechanism is used only for compression\n   * levels >= 4.\n   */\n  // That's alias to max_lazy_match, don't use directly\n  //this.max_insert_length = 0;\n  /* Insert new strings in the hash table only if the match length is not\n   * greater than this length. This saves time but degrades compression.\n   * max_insert_length is used only for compression levels <= 3.\n   */\n\n  this.level = 0;     /* compression level (1..9) */\n  this.strategy = 0;  /* favor or force Huffman coding*/\n\n  this.good_match = 0;\n  /* Use a faster search when the previous match is longer than this */\n\n  this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n              /* used by trees.c: */\n\n  /* Didn't use ct_data typedef below to suppress compiler warning */\n\n  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */\n  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */\n\n  // Use flat array of DOUBLE size, with interleaved fata,\n  // because JS does not support effective\n  this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);\n  this.dyn_dtree  = new utils.Buf16((2 * D_CODES + 1) * 2);\n  this.bl_tree    = new utils.Buf16((2 * BL_CODES + 1) * 2);\n  zero(this.dyn_ltree);\n  zero(this.dyn_dtree);\n  zero(this.bl_tree);\n\n  this.l_desc   = null;         /* desc. for literal tree */\n  this.d_desc   = null;         /* desc. for distance tree */\n  this.bl_desc  = null;         /* desc. for bit length tree */\n\n  //ush bl_count[MAX_BITS+1];\n  this.bl_count = new utils.Buf16(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */\n  this.heap = new utils.Buf16(2 * L_CODES + 1);  /* heap used to build the Huffman trees */\n  zero(this.heap);\n\n  this.heap_len = 0;               /* number of elements in the heap */\n  this.heap_max = 0;               /* element of largest frequency */\n  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n   * The same heap array is used to build all trees.\n   */\n\n  this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n  zero(this.depth);\n  /* Depth of each subtree used as tie breaker for trees of equal frequency\n   */\n\n  this.l_buf = 0;          /* buffer index for literals or lengths */\n\n  this.lit_bufsize = 0;\n  /* Size of match buffer for literals/lengths.  There are 4 reasons for\n   * limiting lit_bufsize to 64K:\n   *   - frequencies can be kept in 16 bit counters\n   *   - if compression is not successful for the first block, all input\n   *     data is still in the window so we can still emit a stored block even\n   *     when input comes from standard input.  (This can also be done for\n   *     all blocks if lit_bufsize is not greater than 32K.)\n   *   - if compression is not successful for a file smaller than 64K, we can\n   *     even emit a stored file instead of a stored block (saving 5 bytes).\n   *     This is applicable only for zip (not gzip or zlib).\n   *   - creating new Huffman trees less frequently may not provide fast\n   *     adaptation to changes in the input data statistics. (Take for\n   *     example a binary file with poorly compressible code followed by\n   *     a highly compressible string table.) Smaller buffer sizes give\n   *     fast adaptation but have of course the overhead of transmitting\n   *     trees more frequently.\n   *   - I can't count above 4\n   */\n\n  this.last_lit = 0;      /* running index in l_buf */\n\n  this.d_buf = 0;\n  /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n   * the same number of elements. To use different lengths, an extra flag\n   * array would be necessary.\n   */\n\n  this.opt_len = 0;       /* bit length of current block with optimal trees */\n  this.static_len = 0;    /* bit length of current block with static trees */\n  this.matches = 0;       /* number of string matches in current block */\n  this.insert = 0;        /* bytes at end of window left to insert */\n\n\n  this.bi_buf = 0;\n  /* Output buffer. bits are inserted starting at the bottom (least\n   * significant bits).\n   */\n  this.bi_valid = 0;\n  /* Number of valid bits in bi_buf.  All bits above the last valid bit\n   * are always zero.\n   */\n\n  // Used for window memory init. We safely ignore it for JS. That makes\n  // sense only for pointers and memory check tools.\n  //this.high_water = 0;\n  /* High water mark offset in window for initialized bytes -- bytes above\n   * this are set to zero in order to avoid memory check warnings when\n   * longest match routines access bytes past the input.  This is then\n   * updated to the new high water mark.\n   */\n}\n\n\nfunction deflateResetKeep(strm) {\n  var s;\n\n  if (!strm || !strm.state) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n  strm.total_in = strm.total_out = 0;\n  strm.data_type = Z_UNKNOWN;\n\n  s = strm.state;\n  s.pending = 0;\n  s.pending_out = 0;\n\n  if (s.wrap < 0) {\n    s.wrap = -s.wrap;\n    /* was made negative by deflate(..., Z_FINISH); */\n  }\n  s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n  strm.adler = (s.wrap === 2) ?\n    0  // crc32(0, Z_NULL, 0)\n  :\n    1; // adler32(0, Z_NULL, 0)\n  s.last_flush = Z_NO_FLUSH;\n  trees._tr_init(s);\n  return Z_OK;\n}\n\n\nfunction deflateReset(strm) {\n  var ret = deflateResetKeep(strm);\n  if (ret === Z_OK) {\n    lm_init(strm.state);\n  }\n  return ret;\n}\n\n\nfunction deflateSetHeader(strm, head) {\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }\n  strm.state.gzhead = head;\n  return Z_OK;\n}\n\n\nfunction deflateInit2(strm, level, method, windowBits, memLevel, strategy) {\n  if (!strm) { // === Z_NULL\n    return Z_STREAM_ERROR;\n  }\n  var wrap = 1;\n\n  if (level === Z_DEFAULT_COMPRESSION) {\n    level = 6;\n  }\n\n  if (windowBits < 0) { /* suppress zlib wrapper */\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n\n  else if (windowBits > 15) {\n    wrap = 2;           /* write gzip wrapper instead */\n    windowBits -= 16;\n  }\n\n\n  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||\n    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n    strategy < 0 || strategy > Z_FIXED) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n\n  if (windowBits === 8) {\n    windowBits = 9;\n  }\n  /* until 256-byte window bug fixed */\n\n  var s = new DeflateState();\n\n  strm.state = s;\n  s.strm = strm;\n\n  s.wrap = wrap;\n  s.gzhead = null;\n  s.w_bits = windowBits;\n  s.w_size = 1 << s.w_bits;\n  s.w_mask = s.w_size - 1;\n\n  s.hash_bits = memLevel + 7;\n  s.hash_size = 1 << s.hash_bits;\n  s.hash_mask = s.hash_size - 1;\n  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n  s.window = new utils.Buf8(s.w_size * 2);\n  s.head = new utils.Buf16(s.hash_size);\n  s.prev = new utils.Buf16(s.w_size);\n\n  // Don't need mem init magic for JS.\n  //s.high_water = 0;  /* nothing written to s->window yet */\n\n  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n  s.pending_buf_size = s.lit_bufsize * 4;\n\n  //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n  //s->pending_buf = (uchf *) overlay;\n  s.pending_buf = new utils.Buf8(s.pending_buf_size);\n\n  // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n  //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n  s.d_buf = 1 * s.lit_bufsize;\n\n  //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n  s.l_buf = (1 + 2) * s.lit_bufsize;\n\n  s.level = level;\n  s.strategy = strategy;\n  s.method = method;\n\n  return deflateReset(strm);\n}\n\nfunction deflateInit(strm, level) {\n  return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);\n}\n\n\nfunction deflate(strm, flush) {\n  var old_flush, s;\n  var beg, val; // for gzip header write only\n\n  if (!strm || !strm.state ||\n    flush > Z_BLOCK || flush < 0) {\n    return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;\n  }\n\n  s = strm.state;\n\n  if (!strm.output ||\n      (!strm.input && strm.avail_in !== 0) ||\n      (s.status === FINISH_STATE && flush !== Z_FINISH)) {\n    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);\n  }\n\n  s.strm = strm; /* just in case */\n  old_flush = s.last_flush;\n  s.last_flush = flush;\n\n  /* Write the header */\n  if (s.status === INIT_STATE) {\n\n    if (s.wrap === 2) { // GZIP header\n      strm.adler = 0;  //crc32(0L, Z_NULL, 0);\n      put_byte(s, 31);\n      put_byte(s, 139);\n      put_byte(s, 8);\n      if (!s.gzhead) { // s->gzhead == Z_NULL\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, s.level === 9 ? 2 :\n                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                     4 : 0));\n        put_byte(s, OS_CODE);\n        s.status = BUSY_STATE;\n      }\n      else {\n        put_byte(s, (s.gzhead.text ? 1 : 0) +\n                    (s.gzhead.hcrc ? 2 : 0) +\n                    (!s.gzhead.extra ? 0 : 4) +\n                    (!s.gzhead.name ? 0 : 8) +\n                    (!s.gzhead.comment ? 0 : 16)\n                );\n        put_byte(s, s.gzhead.time & 0xff);\n        put_byte(s, (s.gzhead.time >> 8) & 0xff);\n        put_byte(s, (s.gzhead.time >> 16) & 0xff);\n        put_byte(s, (s.gzhead.time >> 24) & 0xff);\n        put_byte(s, s.level === 9 ? 2 :\n                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                     4 : 0));\n        put_byte(s, s.gzhead.os & 0xff);\n        if (s.gzhead.extra && s.gzhead.extra.length) {\n          put_byte(s, s.gzhead.extra.length & 0xff);\n          put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n        }\n        if (s.gzhead.hcrc) {\n          strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);\n        }\n        s.gzindex = 0;\n        s.status = EXTRA_STATE;\n      }\n    }\n    else // DEFLATE header\n    {\n      var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;\n      var level_flags = -1;\n\n      if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n        level_flags = 0;\n      } else if (s.level < 6) {\n        level_flags = 1;\n      } else if (s.level === 6) {\n        level_flags = 2;\n      } else {\n        level_flags = 3;\n      }\n      header |= (level_flags << 6);\n      if (s.strstart !== 0) { header |= PRESET_DICT; }\n      header += 31 - (header % 31);\n\n      s.status = BUSY_STATE;\n      putShortMSB(s, header);\n\n      /* Save the adler32 of the preset dictionary: */\n      if (s.strstart !== 0) {\n        putShortMSB(s, strm.adler >>> 16);\n        putShortMSB(s, strm.adler & 0xffff);\n      }\n      strm.adler = 1; // adler32(0L, Z_NULL, 0);\n    }\n  }\n\n//#ifdef GZIP\n  if (s.status === EXTRA_STATE) {\n    if (s.gzhead.extra/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n\n      while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            break;\n          }\n        }\n        put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n        s.gzindex++;\n      }\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (s.gzindex === s.gzhead.extra.length) {\n        s.gzindex = 0;\n        s.status = NAME_STATE;\n      }\n    }\n    else {\n      s.status = NAME_STATE;\n    }\n  }\n  if (s.status === NAME_STATE) {\n    if (s.gzhead.name/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n      //int val;\n\n      do {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            val = 1;\n            break;\n          }\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.name.length) {\n          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (val === 0) {\n        s.gzindex = 0;\n        s.status = COMMENT_STATE;\n      }\n    }\n    else {\n      s.status = COMMENT_STATE;\n    }\n  }\n  if (s.status === COMMENT_STATE) {\n    if (s.gzhead.comment/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n      //int val;\n\n      do {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            val = 1;\n            break;\n          }\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.comment.length) {\n          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (val === 0) {\n        s.status = HCRC_STATE;\n      }\n    }\n    else {\n      s.status = HCRC_STATE;\n    }\n  }\n  if (s.status === HCRC_STATE) {\n    if (s.gzhead.hcrc) {\n      if (s.pending + 2 > s.pending_buf_size) {\n        flush_pending(strm);\n      }\n      if (s.pending + 2 <= s.pending_buf_size) {\n        put_byte(s, strm.adler & 0xff);\n        put_byte(s, (strm.adler >> 8) & 0xff);\n        strm.adler = 0; //crc32(0L, Z_NULL, 0);\n        s.status = BUSY_STATE;\n      }\n    }\n    else {\n      s.status = BUSY_STATE;\n    }\n  }\n//#endif\n\n  /* Flush as much pending output as possible */\n  if (s.pending !== 0) {\n    flush_pending(strm);\n    if (strm.avail_out === 0) {\n      /* Since avail_out is 0, deflate will be called again with\n       * more output space, but possibly with both pending and\n       * avail_in equal to zero. There won't be anything to do,\n       * but this is not an error situation so make sure we\n       * return OK instead of BUF_ERROR at next call of deflate:\n       */\n      s.last_flush = -1;\n      return Z_OK;\n    }\n\n    /* Make sure there is something to do and avoid duplicate consecutive\n     * flushes. For repeated and useless calls with Z_FINISH, we keep\n     * returning Z_STREAM_END instead of Z_BUF_ERROR.\n     */\n  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n    flush !== Z_FINISH) {\n    return err(strm, Z_BUF_ERROR);\n  }\n\n  /* User must not provide more input after the first FINISH: */\n  if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n    return err(strm, Z_BUF_ERROR);\n  }\n\n  /* Start a new block or continue the current one.\n   */\n  if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n    (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {\n    var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n      (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n        configuration_table[s.level].func(s, flush));\n\n    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n      s.status = FINISH_STATE;\n    }\n    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n      if (strm.avail_out === 0) {\n        s.last_flush = -1;\n        /* avoid BUF_ERROR next call, see above */\n      }\n      return Z_OK;\n      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n       * of deflate should use the same flush parameter to make sure\n       * that the flush is complete. So we don't have to output an\n       * empty block here, this will be done at next call. This also\n       * ensures that for a very small output buffer, we emit at most\n       * one empty block.\n       */\n    }\n    if (bstate === BS_BLOCK_DONE) {\n      if (flush === Z_PARTIAL_FLUSH) {\n        trees._tr_align(s);\n      }\n      else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\n\n        trees._tr_stored_block(s, 0, 0, false);\n        /* For a full flush, this empty block will be recognized\n         * as a special marker by inflate_sync().\n         */\n        if (flush === Z_FULL_FLUSH) {\n          /*** CLEAR_HASH(s); ***/             /* forget history */\n          zero(s.head); // Fill with NIL (= 0);\n\n          if (s.lookahead === 0) {\n            s.strstart = 0;\n            s.block_start = 0;\n            s.insert = 0;\n          }\n        }\n      }\n      flush_pending(strm);\n      if (strm.avail_out === 0) {\n        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n        return Z_OK;\n      }\n    }\n  }\n  //Assert(strm->avail_out > 0, \"bug2\");\n  //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n  if (flush !== Z_FINISH) { return Z_OK; }\n  if (s.wrap <= 0) { return Z_STREAM_END; }\n\n  /* Write the trailer */\n  if (s.wrap === 2) {\n    put_byte(s, strm.adler & 0xff);\n    put_byte(s, (strm.adler >> 8) & 0xff);\n    put_byte(s, (strm.adler >> 16) & 0xff);\n    put_byte(s, (strm.adler >> 24) & 0xff);\n    put_byte(s, strm.total_in & 0xff);\n    put_byte(s, (strm.total_in >> 8) & 0xff);\n    put_byte(s, (strm.total_in >> 16) & 0xff);\n    put_byte(s, (strm.total_in >> 24) & 0xff);\n  }\n  else\n  {\n    putShortMSB(s, strm.adler >>> 16);\n    putShortMSB(s, strm.adler & 0xffff);\n  }\n\n  flush_pending(strm);\n  /* If avail_out is zero, the application will call deflate again\n   * to flush the rest.\n   */\n  if (s.wrap > 0) { s.wrap = -s.wrap; }\n  /* write the trailer only once! */\n  return s.pending !== 0 ? Z_OK : Z_STREAM_END;\n}\n\nfunction deflateEnd(strm) {\n  var status;\n\n  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  status = strm.state.status;\n  if (status !== INIT_STATE &&\n    status !== EXTRA_STATE &&\n    status !== NAME_STATE &&\n    status !== COMMENT_STATE &&\n    status !== HCRC_STATE &&\n    status !== BUSY_STATE &&\n    status !== FINISH_STATE\n  ) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n  strm.state = null;\n\n  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;\n}\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nfunction deflateSetDictionary(strm, dictionary) {\n  var dictLength = dictionary.length;\n\n  var s;\n  var str, n;\n  var wrap;\n  var avail;\n  var next;\n  var input;\n  var tmpDict;\n\n  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  s = strm.state;\n  wrap = s.wrap;\n\n  if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n    return Z_STREAM_ERROR;\n  }\n\n  /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n  if (wrap === 1) {\n    /* adler32(strm->adler, dictionary, dictLength); */\n    strm.adler = adler32(strm.adler, dictionary, dictLength, 0);\n  }\n\n  s.wrap = 0;   /* avoid computing Adler-32 in read_buf */\n\n  /* if dictionary would fill window, just replace the history */\n  if (dictLength >= s.w_size) {\n    if (wrap === 0) {            /* already empty otherwise */\n      /*** CLEAR_HASH(s); ***/\n      zero(s.head); // Fill with NIL (= 0);\n      s.strstart = 0;\n      s.block_start = 0;\n      s.insert = 0;\n    }\n    /* use the tail */\n    // dictionary = dictionary.slice(dictLength - s.w_size);\n    tmpDict = new utils.Buf8(s.w_size);\n    utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);\n    dictionary = tmpDict;\n    dictLength = s.w_size;\n  }\n  /* insert dictionary into window and hash */\n  avail = strm.avail_in;\n  next = strm.next_in;\n  input = strm.input;\n  strm.avail_in = dictLength;\n  strm.next_in = 0;\n  strm.input = dictionary;\n  fill_window(s);\n  while (s.lookahead >= MIN_MATCH) {\n    str = s.strstart;\n    n = s.lookahead - (MIN_MATCH - 1);\n    do {\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n      s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n      s.head[s.ins_h] = str;\n      str++;\n    } while (--n);\n    s.strstart = str;\n    s.lookahead = MIN_MATCH - 1;\n    fill_window(s);\n  }\n  s.strstart += s.lookahead;\n  s.block_start = s.strstart;\n  s.insert = s.lookahead;\n  s.lookahead = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  strm.next_in = next;\n  strm.input = input;\n  strm.avail_in = avail;\n  s.wrap = wrap;\n  return Z_OK;\n}\n\n\nexports.deflateInit = deflateInit;\nexports.deflateInit2 = deflateInit2;\nexports.deflateReset = deflateReset;\nexports.deflateResetKeep = deflateResetKeep;\nexports.deflateSetHeader = deflateSetHeader;\nexports.deflate = deflate;\nexports.deflateEnd = deflateEnd;\nexports.deflateSetDictionary = deflateSetDictionary;\nexports.deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nexports.deflateBound = deflateBound;\nexports.deflateCopy = deflateCopy;\nexports.deflateParams = deflateParams;\nexports.deflatePending = deflatePending;\nexports.deflatePrime = deflatePrime;\nexports.deflateTune = deflateTune;\n*/\n\n},{\"../utils/common\":123,\"./adler32\":125,\"./crc32\":127,\"./messages\":133,\"./trees\":134}],129:[function(require,module,exports){\n'use strict';\n\n\nfunction GZheader() {\n  /* true if compressed data believed to be text */\n  this.text       = 0;\n  /* modification time */\n  this.time       = 0;\n  /* extra flags (not used when writing a gzip file) */\n  this.xflags     = 0;\n  /* operating system */\n  this.os         = 0;\n  /* pointer to extra field or Z_NULL if none */\n  this.extra      = null;\n  /* extra field length (valid if extra != Z_NULL) */\n  this.extra_len  = 0; // Actually, we don't need it in JS,\n                       // but leave for few code modifications\n\n  //\n  // Setup limits is not necessary because in js we should not preallocate memory\n  // for inflate use constant limit in 65536 bytes\n  //\n\n  /* space at extra (only when reading header) */\n  // this.extra_max  = 0;\n  /* pointer to zero-terminated file name or Z_NULL */\n  this.name       = '';\n  /* space at name (only when reading header) */\n  // this.name_max   = 0;\n  /* pointer to zero-terminated comment or Z_NULL */\n  this.comment    = '';\n  /* space at comment (only when reading header) */\n  // this.comm_max   = 0;\n  /* true if there was or will be a header crc */\n  this.hcrc       = 0;\n  /* true when done reading gzip header (not used when writing a gzip file) */\n  this.done       = false;\n}\n\nmodule.exports = GZheader;\n\n},{}],130:[function(require,module,exports){\n'use strict';\n\n// See state defs from inflate.js\nvar BAD = 30;       /* got a data error -- remain here until reset */\nvar TYPE = 12;      /* i: waiting for type bits, including last-flag bit */\n\n/*\n   Decode literal, length, and distance codes and write out the resulting\n   literal and match bytes until either not enough input or output is\n   available, an end-of-block is encountered, or a data error is encountered.\n   When large enough input and output buffers are supplied to inflate(), for\n   example, a 16K input buffer and a 64K output buffer, more than 95% of the\n   inflate execution time is spent in this routine.\n\n   Entry assumptions:\n\n        state.mode === LEN\n        strm.avail_in >= 6\n        strm.avail_out >= 258\n        start >= strm.avail_out\n        state.bits < 8\n\n   On return, state.mode is one of:\n\n        LEN -- ran out of enough output space or enough available input\n        TYPE -- reached end of block code, inflate() to interpret next block\n        BAD -- error in block data\n\n   Notes:\n\n    - The maximum input bits used by a length/distance pair is 15 bits for the\n      length code, 5 bits for the length extra, 15 bits for the distance code,\n      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.\n      Therefore if strm.avail_in >= 6, then there is enough input to avoid\n      checking for available input while decoding.\n\n    - The maximum bytes that a single length/distance pair can output is 258\n      bytes, which is the maximum length that can be coded.  inflate_fast()\n      requires strm.avail_out >= 258 for each loop to avoid checking for\n      output space.\n */\nmodule.exports = function inflate_fast(strm, start) {\n  var state;\n  var _in;                    /* local strm.input */\n  var last;                   /* have enough input while in < last */\n  var _out;                   /* local strm.output */\n  var beg;                    /* inflate()'s initial strm.output */\n  var end;                    /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n  var dmax;                   /* maximum distance from zlib header */\n//#endif\n  var wsize;                  /* window size or zero if not using window */\n  var whave;                  /* valid bytes in the window */\n  var wnext;                  /* window write index */\n  // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n  var s_window;               /* allocated sliding window, if wsize != 0 */\n  var hold;                   /* local strm.hold */\n  var bits;                   /* local strm.bits */\n  var lcode;                  /* local strm.lencode */\n  var dcode;                  /* local strm.distcode */\n  var lmask;                  /* mask for first level of length codes */\n  var dmask;                  /* mask for first level of distance codes */\n  var here;                   /* retrieved table entry */\n  var op;                     /* code bits, operation, extra bits, or */\n                              /*  window position, window bytes to copy */\n  var len;                    /* match length, unused bytes */\n  var dist;                   /* match distance */\n  var from;                   /* where to copy match from */\n  var from_source;\n\n\n  var input, output; // JS specific, because we have no pointers\n\n  /* copy state to local variables */\n  state = strm.state;\n  //here = state.here;\n  _in = strm.next_in;\n  input = strm.input;\n  last = _in + (strm.avail_in - 5);\n  _out = strm.next_out;\n  output = strm.output;\n  beg = _out - (start - strm.avail_out);\n  end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n  dmax = state.dmax;\n//#endif\n  wsize = state.wsize;\n  whave = state.whave;\n  wnext = state.wnext;\n  s_window = state.window;\n  hold = state.hold;\n  bits = state.bits;\n  lcode = state.lencode;\n  dcode = state.distcode;\n  lmask = (1 << state.lenbits) - 1;\n  dmask = (1 << state.distbits) - 1;\n\n\n  /* decode literals and length/distances until end-of-block or not enough\n     input data or output space */\n\n  top:\n  do {\n    if (bits < 15) {\n      hold += input[_in++] << bits;\n      bits += 8;\n      hold += input[_in++] << bits;\n      bits += 8;\n    }\n\n    here = lcode[hold & lmask];\n\n    dolen:\n    for (;;) { // Goto emulation\n      op = here >>> 24/*here.bits*/;\n      hold >>>= op;\n      bits -= op;\n      op = (here >>> 16) & 0xff/*here.op*/;\n      if (op === 0) {                          /* literal */\n        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n        //        \"inflate:         literal '%c'\\n\" :\n        //        \"inflate:         literal 0x%02x\\n\", here.val));\n        output[_out++] = here & 0xffff/*here.val*/;\n      }\n      else if (op & 16) {                     /* length base */\n        len = here & 0xffff/*here.val*/;\n        op &= 15;                           /* number of extra bits */\n        if (op) {\n          if (bits < op) {\n            hold += input[_in++] << bits;\n            bits += 8;\n          }\n          len += hold & ((1 << op) - 1);\n          hold >>>= op;\n          bits -= op;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", len));\n        if (bits < 15) {\n          hold += input[_in++] << bits;\n          bits += 8;\n          hold += input[_in++] << bits;\n          bits += 8;\n        }\n        here = dcode[hold & dmask];\n\n        dodist:\n        for (;;) { // goto emulation\n          op = here >>> 24/*here.bits*/;\n          hold >>>= op;\n          bits -= op;\n          op = (here >>> 16) & 0xff/*here.op*/;\n\n          if (op & 16) {                      /* distance base */\n            dist = here & 0xffff/*here.val*/;\n            op &= 15;                       /* number of extra bits */\n            if (bits < op) {\n              hold += input[_in++] << bits;\n              bits += 8;\n              if (bits < op) {\n                hold += input[_in++] << bits;\n                bits += 8;\n              }\n            }\n            dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n            if (dist > dmax) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD;\n              break top;\n            }\n//#endif\n            hold >>>= op;\n            bits -= op;\n            //Tracevv((stderr, \"inflate:         distance %u\\n\", dist));\n            op = _out - beg;                /* max distance in output */\n            if (dist > op) {                /* see if copy from window */\n              op = dist - op;               /* distance back in window */\n              if (op > whave) {\n                if (state.sane) {\n                  strm.msg = 'invalid distance too far back';\n                  state.mode = BAD;\n                  break top;\n                }\n\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//                if (len <= op - whave) {\n//                  do {\n//                    output[_out++] = 0;\n//                  } while (--len);\n//                  continue top;\n//                }\n//                len -= op - whave;\n//                do {\n//                  output[_out++] = 0;\n//                } while (--op > whave);\n//                if (op === 0) {\n//                  from = _out - dist;\n//                  do {\n//                    output[_out++] = output[from++];\n//                  } while (--len);\n//                  continue top;\n//                }\n//#endif\n              }\n              from = 0; // window index\n              from_source = s_window;\n              if (wnext === 0) {           /* very common case */\n                from += wsize - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              else if (wnext < op) {      /* wrap around window */\n                from += wsize + wnext - op;\n                op -= wnext;\n                if (op < len) {         /* some from end of window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = 0;\n                  if (wnext < len) {  /* some from start of window */\n                    op = wnext;\n                    len -= op;\n                    do {\n                      output[_out++] = s_window[from++];\n                    } while (--op);\n                    from = _out - dist;      /* rest from output */\n                    from_source = output;\n                  }\n                }\n              }\n              else {                      /* contiguous in window */\n                from += wnext - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              while (len > 2) {\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                len -= 3;\n              }\n              if (len) {\n                output[_out++] = from_source[from++];\n                if (len > 1) {\n                  output[_out++] = from_source[from++];\n                }\n              }\n            }\n            else {\n              from = _out - dist;          /* copy direct from output */\n              do {                        /* minimum length is three */\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                len -= 3;\n              } while (len > 2);\n              if (len) {\n                output[_out++] = output[from++];\n                if (len > 1) {\n                  output[_out++] = output[from++];\n                }\n              }\n            }\n          }\n          else if ((op & 64) === 0) {          /* 2nd level distance code */\n            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n            continue dodist;\n          }\n          else {\n            strm.msg = 'invalid distance code';\n            state.mode = BAD;\n            break top;\n          }\n\n          break; // need to emulate goto via \"continue\"\n        }\n      }\n      else if ((op & 64) === 0) {              /* 2nd level length code */\n        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n        continue dolen;\n      }\n      else if (op & 32) {                     /* end-of-block */\n        //Tracevv((stderr, \"inflate:         end of block\\n\"));\n        state.mode = TYPE;\n        break top;\n      }\n      else {\n        strm.msg = 'invalid literal/length code';\n        state.mode = BAD;\n        break top;\n      }\n\n      break; // need to emulate goto via \"continue\"\n    }\n  } while (_in < last && _out < end);\n\n  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n  len = bits >> 3;\n  _in -= len;\n  bits -= len << 3;\n  hold &= (1 << bits) - 1;\n\n  /* update state and return */\n  strm.next_in = _in;\n  strm.next_out = _out;\n  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n  state.hold = hold;\n  state.bits = bits;\n  return;\n};\n\n},{}],131:[function(require,module,exports){\n'use strict';\n\n\nvar utils         = require('../utils/common');\nvar adler32       = require('./adler32');\nvar crc32         = require('./crc32');\nvar inflate_fast  = require('./inffast');\nvar inflate_table = require('./inftrees');\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\n//var Z_NO_FLUSH      = 0;\n//var Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH    = 2;\n//var Z_FULL_FLUSH    = 3;\nvar Z_FINISH        = 4;\nvar Z_BLOCK         = 5;\nvar Z_TREES         = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\nvar Z_NEED_DICT     = 2;\n//var Z_ERRNO         = -1;\nvar Z_STREAM_ERROR  = -2;\nvar Z_DATA_ERROR    = -3;\nvar Z_MEM_ERROR     = -4;\nvar Z_BUF_ERROR     = -5;\n//var Z_VERSION_ERROR = -6;\n\n/* The deflate compression method */\nvar Z_DEFLATED  = 8;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nvar    HEAD = 1;       /* i: waiting for magic header */\nvar    FLAGS = 2;      /* i: waiting for method and flags (gzip) */\nvar    TIME = 3;       /* i: waiting for modification time (gzip) */\nvar    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */\nvar    EXLEN = 5;      /* i: waiting for extra length (gzip) */\nvar    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */\nvar    NAME = 7;       /* i: waiting for end of file name (gzip) */\nvar    COMMENT = 8;    /* i: waiting for end of comment (gzip) */\nvar    HCRC = 9;       /* i: waiting for header crc (gzip) */\nvar    DICTID = 10;    /* i: waiting for dictionary check value */\nvar    DICT = 11;      /* waiting for inflateSetDictionary() call */\nvar        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */\nvar        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */\nvar        STORED = 14;    /* i: waiting for stored size (length and complement) */\nvar        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */\nvar        COPY = 16;      /* i/o: waiting for input or output to copy stored block */\nvar        TABLE = 17;     /* i: waiting for dynamic block table lengths */\nvar        LENLENS = 18;   /* i: waiting for code length code lengths */\nvar        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */\nvar            LEN_ = 20;      /* i: same as LEN below, but only first time in */\nvar            LEN = 21;       /* i: waiting for length/lit/eob code */\nvar            LENEXT = 22;    /* i: waiting for length extra bits */\nvar            DIST = 23;      /* i: waiting for distance code */\nvar            DISTEXT = 24;   /* i: waiting for distance extra bits */\nvar            MATCH = 25;     /* o: waiting for output space to copy string */\nvar            LIT = 26;       /* o: waiting for output space to write literal */\nvar    CHECK = 27;     /* i: waiting for 32-bit check value */\nvar    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */\nvar    DONE = 29;      /* finished check, done -- remain here until reset */\nvar    BAD = 30;       /* got a data error -- remain here until reset */\nvar    MEM = 31;       /* got an inflate() memory error -- remain here until reset */\nvar    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_WBITS = MAX_WBITS;\n\n\nfunction zswap32(q) {\n  return  (((q >>> 24) & 0xff) +\n          ((q >>> 8) & 0xff00) +\n          ((q & 0xff00) << 8) +\n          ((q & 0xff) << 24));\n}\n\n\nfunction InflateState() {\n  this.mode = 0;             /* current inflate mode */\n  this.last = false;          /* true if processing last block */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.havedict = false;      /* true if dictionary provided */\n  this.flags = 0;             /* gzip header method and flags (0 if zlib) */\n  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */\n  this.check = 0;             /* protected copy of check value */\n  this.total = 0;             /* protected copy of output count */\n  // TODO: may be {}\n  this.head = null;           /* where to save gzip header information */\n\n  /* sliding window */\n  this.wbits = 0;             /* log base 2 of requested window size */\n  this.wsize = 0;             /* window size or zero if not using window */\n  this.whave = 0;             /* valid bytes in the window */\n  this.wnext = 0;             /* window write index */\n  this.window = null;         /* allocated sliding window, if needed */\n\n  /* bit accumulator */\n  this.hold = 0;              /* input bit accumulator */\n  this.bits = 0;              /* number of bits in \"in\" */\n\n  /* for string and stored block copying */\n  this.length = 0;            /* literal or length of data to copy */\n  this.offset = 0;            /* distance back to copy string from */\n\n  /* for table and code decoding */\n  this.extra = 0;             /* extra bits needed */\n\n  /* fixed and dynamic code tables */\n  this.lencode = null;          /* starting table for length/literal codes */\n  this.distcode = null;         /* starting table for distance codes */\n  this.lenbits = 0;           /* index bits for lencode */\n  this.distbits = 0;          /* index bits for distcode */\n\n  /* dynamic table building */\n  this.ncode = 0;             /* number of code length code lengths */\n  this.nlen = 0;              /* number of length code lengths */\n  this.ndist = 0;             /* number of distance code lengths */\n  this.have = 0;              /* number of code lengths in lens[] */\n  this.next = null;              /* next available space in codes[] */\n\n  this.lens = new utils.Buf16(320); /* temporary storage for code lengths */\n  this.work = new utils.Buf16(288); /* work area for code table building */\n\n  /*\n   because we don't have pointers in js, we use lencode and distcode directly\n   as buffers so we don't need codes\n  */\n  //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */\n  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */\n  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */\n  this.sane = 0;                   /* if false, allow invalid distance too far */\n  this.back = 0;                   /* bits back of last unprocessed length/lit */\n  this.was = 0;                    /* initial length of match */\n}\n\nfunction inflateResetKeep(strm) {\n  var state;\n\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  strm.total_in = strm.total_out = state.total = 0;\n  strm.msg = ''; /*Z_NULL*/\n  if (state.wrap) {       /* to support ill-conceived Java test suite */\n    strm.adler = state.wrap & 1;\n  }\n  state.mode = HEAD;\n  state.last = 0;\n  state.havedict = 0;\n  state.dmax = 32768;\n  state.head = null/*Z_NULL*/;\n  state.hold = 0;\n  state.bits = 0;\n  //state.lencode = state.distcode = state.next = state.codes;\n  state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);\n  state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);\n\n  state.sane = 1;\n  state.back = -1;\n  //Tracev((stderr, \"inflate: reset\\n\"));\n  return Z_OK;\n}\n\nfunction inflateReset(strm) {\n  var state;\n\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  state.wsize = 0;\n  state.whave = 0;\n  state.wnext = 0;\n  return inflateResetKeep(strm);\n\n}\n\nfunction inflateReset2(strm, windowBits) {\n  var wrap;\n  var state;\n\n  /* get the state */\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n\n  /* extract wrap request from windowBits parameter */\n  if (windowBits < 0) {\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n  else {\n    wrap = (windowBits >> 4) + 1;\n    if (windowBits < 48) {\n      windowBits &= 15;\n    }\n  }\n\n  /* set number of window bits, free window if different */\n  if (windowBits && (windowBits < 8 || windowBits > 15)) {\n    return Z_STREAM_ERROR;\n  }\n  if (state.window !== null && state.wbits !== windowBits) {\n    state.window = null;\n  }\n\n  /* update state and reset the rest of it */\n  state.wrap = wrap;\n  state.wbits = windowBits;\n  return inflateReset(strm);\n}\n\nfunction inflateInit2(strm, windowBits) {\n  var ret;\n  var state;\n\n  if (!strm) { return Z_STREAM_ERROR; }\n  //strm.msg = Z_NULL;                 /* in case we return an error */\n\n  state = new InflateState();\n\n  //if (state === Z_NULL) return Z_MEM_ERROR;\n  //Tracev((stderr, \"inflate: allocated\\n\"));\n  strm.state = state;\n  state.window = null/*Z_NULL*/;\n  ret = inflateReset2(strm, windowBits);\n  if (ret !== Z_OK) {\n    strm.state = null/*Z_NULL*/;\n  }\n  return ret;\n}\n\nfunction inflateInit(strm) {\n  return inflateInit2(strm, DEF_WBITS);\n}\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding.  Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter.  This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time.  However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nvar virgin = true;\n\nvar lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\nfunction fixedtables(state) {\n  /* build fixed huffman tables if first call (may not be thread safe) */\n  if (virgin) {\n    var sym;\n\n    lenfix = new utils.Buf32(512);\n    distfix = new utils.Buf32(32);\n\n    /* literal/length table */\n    sym = 0;\n    while (sym < 144) { state.lens[sym++] = 8; }\n    while (sym < 256) { state.lens[sym++] = 9; }\n    while (sym < 280) { state.lens[sym++] = 7; }\n    while (sym < 288) { state.lens[sym++] = 8; }\n\n    inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });\n\n    /* distance table */\n    sym = 0;\n    while (sym < 32) { state.lens[sym++] = 5; }\n\n    inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });\n\n    /* do this just once */\n    virgin = false;\n  }\n\n  state.lencode = lenfix;\n  state.lenbits = 9;\n  state.distcode = distfix;\n  state.distbits = 5;\n}\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning.  If window does not exist yet, create it.  This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nfunction updatewindow(strm, src, end, copy) {\n  var dist;\n  var state = strm.state;\n\n  /* if it hasn't been done already, allocate space for the window */\n  if (state.window === null) {\n    state.wsize = 1 << state.wbits;\n    state.wnext = 0;\n    state.whave = 0;\n\n    state.window = new utils.Buf8(state.wsize);\n  }\n\n  /* copy state->wsize or less output bytes into the circular window */\n  if (copy >= state.wsize) {\n    utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);\n    state.wnext = 0;\n    state.whave = state.wsize;\n  }\n  else {\n    dist = state.wsize - state.wnext;\n    if (dist > copy) {\n      dist = copy;\n    }\n    //zmemcpy(state->window + state->wnext, end - copy, dist);\n    utils.arraySet(state.window, src, end - copy, dist, state.wnext);\n    copy -= dist;\n    if (copy) {\n      //zmemcpy(state->window, end - copy, copy);\n      utils.arraySet(state.window, src, end - copy, copy, 0);\n      state.wnext = copy;\n      state.whave = state.wsize;\n    }\n    else {\n      state.wnext += dist;\n      if (state.wnext === state.wsize) { state.wnext = 0; }\n      if (state.whave < state.wsize) { state.whave += dist; }\n    }\n  }\n  return 0;\n}\n\nfunction inflate(strm, flush) {\n  var state;\n  var input, output;          // input/output buffers\n  var next;                   /* next input INDEX */\n  var put;                    /* next output INDEX */\n  var have, left;             /* available input and output */\n  var hold;                   /* bit buffer */\n  var bits;                   /* bits in bit buffer */\n  var _in, _out;              /* save starting available input and output */\n  var copy;                   /* number of stored or match bytes to copy */\n  var from;                   /* where to copy match bytes from */\n  var from_source;\n  var here = 0;               /* current decoding table entry */\n  var here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n  //var last;                   /* parent table entry */\n  var last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n  var len;                    /* length to copy for repeats, bits to drop */\n  var ret;                    /* return code */\n  var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */\n  var opts;\n\n  var n; // temporary var for NEED_BITS\n\n  var order = /* permutation of code lengths */\n    [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];\n\n\n  if (!strm || !strm.state || !strm.output ||\n      (!strm.input && strm.avail_in !== 0)) {\n    return Z_STREAM_ERROR;\n  }\n\n  state = strm.state;\n  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */\n\n\n  //--- LOAD() ---\n  put = strm.next_out;\n  output = strm.output;\n  left = strm.avail_out;\n  next = strm.next_in;\n  input = strm.input;\n  have = strm.avail_in;\n  hold = state.hold;\n  bits = state.bits;\n  //---\n\n  _in = have;\n  _out = left;\n  ret = Z_OK;\n\n  inf_leave: // goto emulation\n  for (;;) {\n    switch (state.mode) {\n    case HEAD:\n      if (state.wrap === 0) {\n        state.mode = TYPEDO;\n        break;\n      }\n      //=== NEEDBITS(16);\n      while (bits < 16) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */\n        state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n        //=== CRC2(state.check, hold);\n        hbuf[0] = hold & 0xff;\n        hbuf[1] = (hold >>> 8) & 0xff;\n        state.check = crc32(state.check, hbuf, 2, 0);\n        //===//\n\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = FLAGS;\n        break;\n      }\n      state.flags = 0;           /* expect zlib header */\n      if (state.head) {\n        state.head.done = false;\n      }\n      if (!(state.wrap & 1) ||   /* check if zlib header allowed */\n        (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n        strm.msg = 'incorrect header check';\n        state.mode = BAD;\n        break;\n      }\n      if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n        strm.msg = 'unknown compression method';\n        state.mode = BAD;\n        break;\n      }\n      //--- DROPBITS(4) ---//\n      hold >>>= 4;\n      bits -= 4;\n      //---//\n      len = (hold & 0x0f)/*BITS(4)*/ + 8;\n      if (state.wbits === 0) {\n        state.wbits = len;\n      }\n      else if (len > state.wbits) {\n        strm.msg = 'invalid window size';\n        state.mode = BAD;\n        break;\n      }\n      state.dmax = 1 << len;\n      //Tracev((stderr, \"inflate:   zlib header ok\\n\"));\n      strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n      state.mode = hold & 0x200 ? DICTID : TYPE;\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      break;\n    case FLAGS:\n      //=== NEEDBITS(16); */\n      while (bits < 16) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      state.flags = hold;\n      if ((state.flags & 0xff) !== Z_DEFLATED) {\n        strm.msg = 'unknown compression method';\n        state.mode = BAD;\n        break;\n      }\n      if (state.flags & 0xe000) {\n        strm.msg = 'unknown header flags set';\n        state.mode = BAD;\n        break;\n      }\n      if (state.head) {\n        state.head.text = ((hold >> 8) & 1);\n      }\n      if (state.flags & 0x0200) {\n        //=== CRC2(state.check, hold);\n        hbuf[0] = hold & 0xff;\n        hbuf[1] = (hold >>> 8) & 0xff;\n        state.check = crc32(state.check, hbuf, 2, 0);\n        //===//\n      }\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = TIME;\n      /* falls through */\n    case TIME:\n      //=== NEEDBITS(32); */\n      while (bits < 32) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      if (state.head) {\n        state.head.time = hold;\n      }\n      if (state.flags & 0x0200) {\n        //=== CRC4(state.check, hold)\n        hbuf[0] = hold & 0xff;\n        hbuf[1] = (hold >>> 8) & 0xff;\n        hbuf[2] = (hold >>> 16) & 0xff;\n        hbuf[3] = (hold >>> 24) & 0xff;\n        state.check = crc32(state.check, hbuf, 4, 0);\n        //===\n      }\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = OS;\n      /* falls through */\n    case OS:\n      //=== NEEDBITS(16); */\n      while (bits < 16) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      if (state.head) {\n        state.head.xflags = (hold & 0xff);\n        state.head.os = (hold >> 8);\n      }\n      if (state.flags & 0x0200) {\n        //=== CRC2(state.check, hold);\n        hbuf[0] = hold & 0xff;\n        hbuf[1] = (hold >>> 8) & 0xff;\n        state.check = crc32(state.check, hbuf, 2, 0);\n        //===//\n      }\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = EXLEN;\n      /* falls through */\n    case EXLEN:\n      if (state.flags & 0x0400) {\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.length = hold;\n        if (state.head) {\n          state.head.extra_len = hold;\n        }\n        if (state.flags & 0x0200) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n      }\n      else if (state.head) {\n        state.head.extra = null/*Z_NULL*/;\n      }\n      state.mode = EXTRA;\n      /* falls through */\n    case EXTRA:\n      if (state.flags & 0x0400) {\n        copy = state.length;\n        if (copy > have) { copy = have; }\n        if (copy) {\n          if (state.head) {\n            len = state.head.extra_len - state.length;\n            if (!state.head.extra) {\n              // Use untyped array for more conveniend processing later\n              state.head.extra = new Array(state.head.extra_len);\n            }\n            utils.arraySet(\n              state.head.extra,\n              input,\n              next,\n              // extra field is limited to 65536 bytes\n              // - no need for additional size check\n              copy,\n              /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n              len\n            );\n            //zmemcpy(state.head.extra + len, next,\n            //        len + copy > state.head.extra_max ?\n            //        state.head.extra_max - len : copy);\n          }\n          if (state.flags & 0x0200) {\n            state.check = crc32(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          state.length -= copy;\n        }\n        if (state.length) { break inf_leave; }\n      }\n      state.length = 0;\n      state.mode = NAME;\n      /* falls through */\n    case NAME:\n      if (state.flags & 0x0800) {\n        if (have === 0) { break inf_leave; }\n        copy = 0;\n        do {\n          // TODO: 2 or 1 bytes?\n          len = input[next + copy++];\n          /* use constant limit because in js we should not preallocate memory */\n          if (state.head && len &&\n              (state.length < 65536 /*state.head.name_max*/)) {\n            state.head.name += String.fromCharCode(len);\n          }\n        } while (len && copy < have);\n\n        if (state.flags & 0x0200) {\n          state.check = crc32(state.check, input, copy, next);\n        }\n        have -= copy;\n        next += copy;\n        if (len) { break inf_leave; }\n      }\n      else if (state.head) {\n        state.head.name = null;\n      }\n      state.length = 0;\n      state.mode = COMMENT;\n      /* falls through */\n    case COMMENT:\n      if (state.flags & 0x1000) {\n        if (have === 0) { break inf_leave; }\n        copy = 0;\n        do {\n          len = input[next + copy++];\n          /* use constant limit because in js we should not preallocate memory */\n          if (state.head && len &&\n              (state.length < 65536 /*state.head.comm_max*/)) {\n            state.head.comment += String.fromCharCode(len);\n          }\n        } while (len && copy < have);\n        if (state.flags & 0x0200) {\n          state.check = crc32(state.check, input, copy, next);\n        }\n        have -= copy;\n        next += copy;\n        if (len) { break inf_leave; }\n      }\n      else if (state.head) {\n        state.head.comment = null;\n      }\n      state.mode = HCRC;\n      /* falls through */\n    case HCRC:\n      if (state.flags & 0x0200) {\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (hold !== (state.check & 0xffff)) {\n          strm.msg = 'header crc mismatch';\n          state.mode = BAD;\n          break;\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n      }\n      if (state.head) {\n        state.head.hcrc = ((state.flags >> 9) & 1);\n        state.head.done = true;\n      }\n      strm.adler = state.check = 0;\n      state.mode = TYPE;\n      break;\n    case DICTID:\n      //=== NEEDBITS(32); */\n      while (bits < 32) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      strm.adler = state.check = zswap32(hold);\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = DICT;\n      /* falls through */\n    case DICT:\n      if (state.havedict === 0) {\n        //--- RESTORE() ---\n        strm.next_out = put;\n        strm.avail_out = left;\n        strm.next_in = next;\n        strm.avail_in = have;\n        state.hold = hold;\n        state.bits = bits;\n        //---\n        return Z_NEED_DICT;\n      }\n      strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n      state.mode = TYPE;\n      /* falls through */\n    case TYPE:\n      if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n      /* falls through */\n    case TYPEDO:\n      if (state.last) {\n        //--- BYTEBITS() ---//\n        hold >>>= bits & 7;\n        bits -= bits & 7;\n        //---//\n        state.mode = CHECK;\n        break;\n      }\n      //=== NEEDBITS(3); */\n      while (bits < 3) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      state.last = (hold & 0x01)/*BITS(1)*/;\n      //--- DROPBITS(1) ---//\n      hold >>>= 1;\n      bits -= 1;\n      //---//\n\n      switch ((hold & 0x03)/*BITS(2)*/) {\n      case 0:                             /* stored block */\n        //Tracev((stderr, \"inflate:     stored block%s\\n\",\n        //        state.last ? \" (last)\" : \"\"));\n        state.mode = STORED;\n        break;\n      case 1:                             /* fixed block */\n        fixedtables(state);\n        //Tracev((stderr, \"inflate:     fixed codes block%s\\n\",\n        //        state.last ? \" (last)\" : \"\"));\n        state.mode = LEN_;             /* decode codes */\n        if (flush === Z_TREES) {\n          //--- DROPBITS(2) ---//\n          hold >>>= 2;\n          bits -= 2;\n          //---//\n          break inf_leave;\n        }\n        break;\n      case 2:                             /* dynamic block */\n        //Tracev((stderr, \"inflate:     dynamic codes block%s\\n\",\n        //        state.last ? \" (last)\" : \"\"));\n        state.mode = TABLE;\n        break;\n      case 3:\n        strm.msg = 'invalid block type';\n        state.mode = BAD;\n      }\n      //--- DROPBITS(2) ---//\n      hold >>>= 2;\n      bits -= 2;\n      //---//\n      break;\n    case STORED:\n      //--- BYTEBITS() ---// /* go to byte boundary */\n      hold >>>= bits & 7;\n      bits -= bits & 7;\n      //---//\n      //=== NEEDBITS(32); */\n      while (bits < 32) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n        strm.msg = 'invalid stored block lengths';\n        state.mode = BAD;\n        break;\n      }\n      state.length = hold & 0xffff;\n      //Tracev((stderr, \"inflate:       stored length %u\\n\",\n      //        state.length));\n      //=== INITBITS();\n      hold = 0;\n      bits = 0;\n      //===//\n      state.mode = COPY_;\n      if (flush === Z_TREES) { break inf_leave; }\n      /* falls through */\n    case COPY_:\n      state.mode = COPY;\n      /* falls through */\n    case COPY:\n      copy = state.length;\n      if (copy) {\n        if (copy > have) { copy = have; }\n        if (copy > left) { copy = left; }\n        if (copy === 0) { break inf_leave; }\n        //--- zmemcpy(put, next, copy); ---\n        utils.arraySet(output, input, next, copy, put);\n        //---//\n        have -= copy;\n        next += copy;\n        left -= copy;\n        put += copy;\n        state.length -= copy;\n        break;\n      }\n      //Tracev((stderr, \"inflate:       stored end\\n\"));\n      state.mode = TYPE;\n      break;\n    case TABLE:\n      //=== NEEDBITS(14); */\n      while (bits < 14) {\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n      }\n      //===//\n      state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n      //--- DROPBITS(5) ---//\n      hold >>>= 5;\n      bits -= 5;\n      //---//\n      state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n      //--- DROPBITS(5) ---//\n      hold >>>= 5;\n      bits -= 5;\n      //---//\n      state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n      //--- DROPBITS(4) ---//\n      hold >>>= 4;\n      bits -= 4;\n      //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n      if (state.nlen > 286 || state.ndist > 30) {\n        strm.msg = 'too many length or distance symbols';\n        state.mode = BAD;\n        break;\n      }\n//#endif\n      //Tracev((stderr, \"inflate:       table sizes ok\\n\"));\n      state.have = 0;\n      state.mode = LENLENS;\n      /* falls through */\n    case LENLENS:\n      while (state.have < state.ncode) {\n        //=== NEEDBITS(3);\n        while (bits < 3) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n        //--- DROPBITS(3) ---//\n        hold >>>= 3;\n        bits -= 3;\n        //---//\n      }\n      while (state.have < 19) {\n        state.lens[order[state.have++]] = 0;\n      }\n      // We have separate tables & no pointers. 2 commented lines below not needed.\n      //state.next = state.codes;\n      //state.lencode = state.next;\n      // Switch to use dynamic table\n      state.lencode = state.lendyn;\n      state.lenbits = 7;\n\n      opts = { bits: state.lenbits };\n      ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n      state.lenbits = opts.bits;\n\n      if (ret) {\n        strm.msg = 'invalid code lengths set';\n        state.mode = BAD;\n        break;\n      }\n      //Tracev((stderr, \"inflate:       code lengths ok\\n\"));\n      state.have = 0;\n      state.mode = CODELENS;\n      /* falls through */\n    case CODELENS:\n      while (state.have < state.nlen + state.ndist) {\n        for (;;) {\n          here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if (here_val < 16) {\n          //--- DROPBITS(here.bits) ---//\n          hold >>>= here_bits;\n          bits -= here_bits;\n          //---//\n          state.lens[state.have++] = here_val;\n        }\n        else {\n          if (here_val === 16) {\n            //=== NEEDBITS(here.bits + 2);\n            n = here_bits + 2;\n            while (bits < n) {\n              if (have === 0) { break inf_leave; }\n              have--;\n              hold += input[next++] << bits;\n              bits += 8;\n            }\n            //===//\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            if (state.have === 0) {\n              strm.msg = 'invalid bit length repeat';\n              state.mode = BAD;\n              break;\n            }\n            len = state.lens[state.have - 1];\n            copy = 3 + (hold & 0x03);//BITS(2);\n            //--- DROPBITS(2) ---//\n            hold >>>= 2;\n            bits -= 2;\n            //---//\n          }\n          else if (here_val === 17) {\n            //=== NEEDBITS(here.bits + 3);\n            n = here_bits + 3;\n            while (bits < n) {\n              if (have === 0) { break inf_leave; }\n              have--;\n              hold += input[next++] << bits;\n              bits += 8;\n            }\n            //===//\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            len = 0;\n            copy = 3 + (hold & 0x07);//BITS(3);\n            //--- DROPBITS(3) ---//\n            hold >>>= 3;\n            bits -= 3;\n            //---//\n          }\n          else {\n            //=== NEEDBITS(here.bits + 7);\n            n = here_bits + 7;\n            while (bits < n) {\n              if (have === 0) { break inf_leave; }\n              have--;\n              hold += input[next++] << bits;\n              bits += 8;\n            }\n            //===//\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            len = 0;\n            copy = 11 + (hold & 0x7f);//BITS(7);\n            //--- DROPBITS(7) ---//\n            hold >>>= 7;\n            bits -= 7;\n            //---//\n          }\n          if (state.have + copy > state.nlen + state.ndist) {\n            strm.msg = 'invalid bit length repeat';\n            state.mode = BAD;\n            break;\n          }\n          while (copy--) {\n            state.lens[state.have++] = len;\n          }\n        }\n      }\n\n      /* handle error breaks in while */\n      if (state.mode === BAD) { break; }\n\n      /* check for end-of-block code (better have one) */\n      if (state.lens[256] === 0) {\n        strm.msg = 'invalid code -- missing end-of-block';\n        state.mode = BAD;\n        break;\n      }\n\n      /* build code tables -- note: do not change the lenbits or distbits\n         values here (9 and 6) without reading the comments in inftrees.h\n         concerning the ENOUGH constants, which depend on those values */\n      state.lenbits = 9;\n\n      opts = { bits: state.lenbits };\n      ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n      // We have separate tables & no pointers. 2 commented lines below not needed.\n      // state.next_index = opts.table_index;\n      state.lenbits = opts.bits;\n      // state.lencode = state.next;\n\n      if (ret) {\n        strm.msg = 'invalid literal/lengths set';\n        state.mode = BAD;\n        break;\n      }\n\n      state.distbits = 6;\n      //state.distcode.copy(state.codes);\n      // Switch to use dynamic table\n      state.distcode = state.distdyn;\n      opts = { bits: state.distbits };\n      ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n      // We have separate tables & no pointers. 2 commented lines below not needed.\n      // state.next_index = opts.table_index;\n      state.distbits = opts.bits;\n      // state.distcode = state.next;\n\n      if (ret) {\n        strm.msg = 'invalid distances set';\n        state.mode = BAD;\n        break;\n      }\n      //Tracev((stderr, 'inflate:       codes ok\\n'));\n      state.mode = LEN_;\n      if (flush === Z_TREES) { break inf_leave; }\n      /* falls through */\n    case LEN_:\n      state.mode = LEN;\n      /* falls through */\n    case LEN:\n      if (have >= 6 && left >= 258) {\n        //--- RESTORE() ---\n        strm.next_out = put;\n        strm.avail_out = left;\n        strm.next_in = next;\n        strm.avail_in = have;\n        state.hold = hold;\n        state.bits = bits;\n        //---\n        inflate_fast(strm, _out);\n        //--- LOAD() ---\n        put = strm.next_out;\n        output = strm.output;\n        left = strm.avail_out;\n        next = strm.next_in;\n        input = strm.input;\n        have = strm.avail_in;\n        hold = state.hold;\n        bits = state.bits;\n        //---\n\n        if (state.mode === TYPE) {\n          state.back = -1;\n        }\n        break;\n      }\n      state.back = 0;\n      for (;;) {\n        here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/\n        here_bits = here >>> 24;\n        here_op = (here >>> 16) & 0xff;\n        here_val = here & 0xffff;\n\n        if (here_bits <= bits) { break; }\n        //--- PULLBYTE() ---//\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n        //---//\n      }\n      if (here_op && (here_op & 0xf0) === 0) {\n        last_bits = here_bits;\n        last_op = here_op;\n        last_val = here_val;\n        for (;;) {\n          here = state.lencode[last_val +\n                  ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((last_bits + here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        //--- DROPBITS(last.bits) ---//\n        hold >>>= last_bits;\n        bits -= last_bits;\n        //---//\n        state.back += last_bits;\n      }\n      //--- DROPBITS(here.bits) ---//\n      hold >>>= here_bits;\n      bits -= here_bits;\n      //---//\n      state.back += here_bits;\n      state.length = here_val;\n      if (here_op === 0) {\n        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n        //        \"inflate:         literal '%c'\\n\" :\n        //        \"inflate:         literal 0x%02x\\n\", here.val));\n        state.mode = LIT;\n        break;\n      }\n      if (here_op & 32) {\n        //Tracevv((stderr, \"inflate:         end of block\\n\"));\n        state.back = -1;\n        state.mode = TYPE;\n        break;\n      }\n      if (here_op & 64) {\n        strm.msg = 'invalid literal/length code';\n        state.mode = BAD;\n        break;\n      }\n      state.extra = here_op & 15;\n      state.mode = LENEXT;\n      /* falls through */\n    case LENEXT:\n      if (state.extra) {\n        //=== NEEDBITS(state.extra);\n        n = state.extra;\n        while (bits < n) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n        //--- DROPBITS(state.extra) ---//\n        hold >>>= state.extra;\n        bits -= state.extra;\n        //---//\n        state.back += state.extra;\n      }\n      //Tracevv((stderr, \"inflate:         length %u\\n\", state.length));\n      state.was = state.length;\n      state.mode = DIST;\n      /* falls through */\n    case DIST:\n      for (;;) {\n        here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n        here_bits = here >>> 24;\n        here_op = (here >>> 16) & 0xff;\n        here_val = here & 0xffff;\n\n        if ((here_bits) <= bits) { break; }\n        //--- PULLBYTE() ---//\n        if (have === 0) { break inf_leave; }\n        have--;\n        hold += input[next++] << bits;\n        bits += 8;\n        //---//\n      }\n      if ((here_op & 0xf0) === 0) {\n        last_bits = here_bits;\n        last_op = here_op;\n        last_val = here_val;\n        for (;;) {\n          here = state.distcode[last_val +\n                  ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((last_bits + here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        //--- DROPBITS(last.bits) ---//\n        hold >>>= last_bits;\n        bits -= last_bits;\n        //---//\n        state.back += last_bits;\n      }\n      //--- DROPBITS(here.bits) ---//\n      hold >>>= here_bits;\n      bits -= here_bits;\n      //---//\n      state.back += here_bits;\n      if (here_op & 64) {\n        strm.msg = 'invalid distance code';\n        state.mode = BAD;\n        break;\n      }\n      state.offset = here_val;\n      state.extra = (here_op) & 15;\n      state.mode = DISTEXT;\n      /* falls through */\n    case DISTEXT:\n      if (state.extra) {\n        //=== NEEDBITS(state.extra);\n        n = state.extra;\n        while (bits < n) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n        //--- DROPBITS(state.extra) ---//\n        hold >>>= state.extra;\n        bits -= state.extra;\n        //---//\n        state.back += state.extra;\n      }\n//#ifdef INFLATE_STRICT\n      if (state.offset > state.dmax) {\n        strm.msg = 'invalid distance too far back';\n        state.mode = BAD;\n        break;\n      }\n//#endif\n      //Tracevv((stderr, \"inflate:         distance %u\\n\", state.offset));\n      state.mode = MATCH;\n      /* falls through */\n    case MATCH:\n      if (left === 0) { break inf_leave; }\n      copy = _out - left;\n      if (state.offset > copy) {         /* copy from window */\n        copy = state.offset - copy;\n        if (copy > state.whave) {\n          if (state.sane) {\n            strm.msg = 'invalid distance too far back';\n            state.mode = BAD;\n            break;\n          }\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//          Trace((stderr, \"inflate.c too far\\n\"));\n//          copy -= state.whave;\n//          if (copy > state.length) { copy = state.length; }\n//          if (copy > left) { copy = left; }\n//          left -= copy;\n//          state.length -= copy;\n//          do {\n//            output[put++] = 0;\n//          } while (--copy);\n//          if (state.length === 0) { state.mode = LEN; }\n//          break;\n//#endif\n        }\n        if (copy > state.wnext) {\n          copy -= state.wnext;\n          from = state.wsize - copy;\n        }\n        else {\n          from = state.wnext - copy;\n        }\n        if (copy > state.length) { copy = state.length; }\n        from_source = state.window;\n      }\n      else {                              /* copy from output */\n        from_source = output;\n        from = put - state.offset;\n        copy = state.length;\n      }\n      if (copy > left) { copy = left; }\n      left -= copy;\n      state.length -= copy;\n      do {\n        output[put++] = from_source[from++];\n      } while (--copy);\n      if (state.length === 0) { state.mode = LEN; }\n      break;\n    case LIT:\n      if (left === 0) { break inf_leave; }\n      output[put++] = state.length;\n      left--;\n      state.mode = LEN;\n      break;\n    case CHECK:\n      if (state.wrap) {\n        //=== NEEDBITS(32);\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          // Use '|' insdead of '+' to make sure that result is signed\n          hold |= input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        _out -= left;\n        strm.total_out += _out;\n        state.total += _out;\n        if (_out) {\n          strm.adler = state.check =\n              /*UPDATE(state.check, put - _out, _out);*/\n              (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));\n\n        }\n        _out = left;\n        // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n        if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n          strm.msg = 'incorrect data check';\n          state.mode = BAD;\n          break;\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        //Tracev((stderr, \"inflate:   check matches trailer\\n\"));\n      }\n      state.mode = LENGTH;\n      /* falls through */\n    case LENGTH:\n      if (state.wrap && state.flags) {\n        //=== NEEDBITS(32);\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (hold !== (state.total & 0xffffffff)) {\n          strm.msg = 'incorrect length check';\n          state.mode = BAD;\n          break;\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        //Tracev((stderr, \"inflate:   length matches trailer\\n\"));\n      }\n      state.mode = DONE;\n      /* falls through */\n    case DONE:\n      ret = Z_STREAM_END;\n      break inf_leave;\n    case BAD:\n      ret = Z_DATA_ERROR;\n      break inf_leave;\n    case MEM:\n      return Z_MEM_ERROR;\n    case SYNC:\n      /* falls through */\n    default:\n      return Z_STREAM_ERROR;\n    }\n  }\n\n  // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n  /*\n     Return from inflate(), updating the total counts and the check value.\n     If there was no progress during the inflate() call, return a buffer\n     error.  Call updatewindow() to create and/or update the window state.\n     Note: a memory error from inflate() is non-recoverable.\n   */\n\n  //--- RESTORE() ---\n  strm.next_out = put;\n  strm.avail_out = left;\n  strm.next_in = next;\n  strm.avail_in = have;\n  state.hold = hold;\n  state.bits = bits;\n  //---\n\n  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n                      (state.mode < CHECK || flush !== Z_FINISH))) {\n    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {\n      state.mode = MEM;\n      return Z_MEM_ERROR;\n    }\n  }\n  _in -= strm.avail_in;\n  _out -= strm.avail_out;\n  strm.total_in += _in;\n  strm.total_out += _out;\n  state.total += _out;\n  if (state.wrap && _out) {\n    strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n      (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));\n  }\n  strm.data_type = state.bits + (state.last ? 64 : 0) +\n                    (state.mode === TYPE ? 128 : 0) +\n                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n  if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {\n    ret = Z_BUF_ERROR;\n  }\n  return ret;\n}\n\nfunction inflateEnd(strm) {\n\n  if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  var state = strm.state;\n  if (state.window) {\n    state.window = null;\n  }\n  strm.state = null;\n  return Z_OK;\n}\n\nfunction inflateGetHeader(strm, head) {\n  var state;\n\n  /* check state */\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }\n\n  /* save header structure */\n  state.head = head;\n  head.done = false;\n  return Z_OK;\n}\n\nfunction inflateSetDictionary(strm, dictionary) {\n  var dictLength = dictionary.length;\n\n  var state;\n  var dictid;\n  var ret;\n\n  /* check state */\n  if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }\n  state = strm.state;\n\n  if (state.wrap !== 0 && state.mode !== DICT) {\n    return Z_STREAM_ERROR;\n  }\n\n  /* check for correct dictionary identifier */\n  if (state.mode === DICT) {\n    dictid = 1; /* adler32(0, null, 0)*/\n    /* dictid = adler32(dictid, dictionary, dictLength); */\n    dictid = adler32(dictid, dictionary, dictLength, 0);\n    if (dictid !== state.check) {\n      return Z_DATA_ERROR;\n    }\n  }\n  /* copy dictionary to window using updatewindow(), which will amend the\n   existing dictionary if appropriate */\n  ret = updatewindow(strm, dictionary, dictLength, dictLength);\n  if (ret) {\n    state.mode = MEM;\n    return Z_MEM_ERROR;\n  }\n  state.havedict = 1;\n  // Tracev((stderr, \"inflate:   dictionary set\\n\"));\n  return Z_OK;\n}\n\nexports.inflateReset = inflateReset;\nexports.inflateReset2 = inflateReset2;\nexports.inflateResetKeep = inflateResetKeep;\nexports.inflateInit = inflateInit;\nexports.inflateInit2 = inflateInit2;\nexports.inflate = inflate;\nexports.inflateEnd = inflateEnd;\nexports.inflateGetHeader = inflateGetHeader;\nexports.inflateSetDictionary = inflateSetDictionary;\nexports.inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nexports.inflateCopy = inflateCopy;\nexports.inflateGetDictionary = inflateGetDictionary;\nexports.inflateMark = inflateMark;\nexports.inflatePrime = inflatePrime;\nexports.inflateSync = inflateSync;\nexports.inflateSyncPoint = inflateSyncPoint;\nexports.inflateUndermine = inflateUndermine;\n*/\n\n},{\"../utils/common\":123,\"./adler32\":125,\"./crc32\":127,\"./inffast\":130,\"./inftrees\":132}],132:[function(require,module,exports){\n'use strict';\n\n\nvar utils = require('../utils/common');\n\nvar MAXBITS = 15;\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\nvar lbase = [ /* Length codes 257..285 base */\n  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n];\n\nvar lext = [ /* Length codes 257..285 extra */\n  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n];\n\nvar dbase = [ /* Distance codes 0..29 base */\n  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n  8193, 12289, 16385, 24577, 0, 0\n];\n\nvar dext = [ /* Distance codes 0..29 extra */\n  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n  28, 28, 29, 29, 64, 64\n];\n\nmodule.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)\n{\n  var bits = opts.bits;\n      //here = opts.here; /* table entry for duplication */\n\n  var len = 0;               /* a code's length in bits */\n  var sym = 0;               /* index of code symbols */\n  var min = 0, max = 0;          /* minimum and maximum code lengths */\n  var root = 0;              /* number of index bits for root table */\n  var curr = 0;              /* number of index bits for current table */\n  var drop = 0;              /* code bits to drop for sub-table */\n  var left = 0;                   /* number of prefix codes available */\n  var used = 0;              /* code entries in table used */\n  var huff = 0;              /* Huffman code */\n  var incr;              /* for incrementing code, index */\n  var fill;              /* index for replicating entries */\n  var low;               /* low bits for current root entry */\n  var mask;              /* mask for low root bits */\n  var next;             /* next available space in table */\n  var base = null;     /* base value table to use */\n  var base_index = 0;\n//  var shoextra;    /* extra bits table to use */\n  var end;                    /* use base and extra for symbol > end */\n  var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */\n  var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */\n  var extra = null;\n  var extra_index = 0;\n\n  var here_bits, here_op, here_val;\n\n  /*\n   Process a set of code lengths to create a canonical Huffman code.  The\n   code lengths are lens[0..codes-1].  Each length corresponds to the\n   symbols 0..codes-1.  The Huffman code is generated by first sorting the\n   symbols by length from short to long, and retaining the symbol order\n   for codes with equal lengths.  Then the code starts with all zero bits\n   for the first code of the shortest length, and the codes are integer\n   increments for the same length, and zeros are appended as the length\n   increases.  For the deflate format, these bits are stored backwards\n   from their more natural integer increment ordering, and so when the\n   decoding tables are built in the large loop below, the integer codes\n   are incremented backwards.\n\n   This routine assumes, but does not check, that all of the entries in\n   lens[] are in the range 0..MAXBITS.  The caller must assure this.\n   1..MAXBITS is interpreted as that code length.  zero means that that\n   symbol does not occur in this code.\n\n   The codes are sorted by computing a count of codes for each length,\n   creating from that a table of starting indices for each length in the\n   sorted table, and then entering the symbols in order in the sorted\n   table.  The sorted table is work[], with that space being provided by\n   the caller.\n\n   The length counts are used for other purposes as well, i.e. finding\n   the minimum and maximum length codes, determining if there are any\n   codes at all, checking for a valid set of lengths, and looking ahead\n   at length counts to determine sub-table sizes when building the\n   decoding tables.\n   */\n\n  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n  for (len = 0; len <= MAXBITS; len++) {\n    count[len] = 0;\n  }\n  for (sym = 0; sym < codes; sym++) {\n    count[lens[lens_index + sym]]++;\n  }\n\n  /* bound code lengths, force root to be within code lengths */\n  root = bits;\n  for (max = MAXBITS; max >= 1; max--) {\n    if (count[max] !== 0) { break; }\n  }\n  if (root > max) {\n    root = max;\n  }\n  if (max === 0) {                     /* no symbols to code at all */\n    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */\n    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;\n    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n    //table.op[opts.table_index] = 64;\n    //table.bits[opts.table_index] = 1;\n    //table.val[opts.table_index++] = 0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n    opts.bits = 1;\n    return 0;     /* no symbols, but wait for decoding to report error */\n  }\n  for (min = 1; min < max; min++) {\n    if (count[min] !== 0) { break; }\n  }\n  if (root < min) {\n    root = min;\n  }\n\n  /* check for an over-subscribed or incomplete set of lengths */\n  left = 1;\n  for (len = 1; len <= MAXBITS; len++) {\n    left <<= 1;\n    left -= count[len];\n    if (left < 0) {\n      return -1;\n    }        /* over-subscribed */\n  }\n  if (left > 0 && (type === CODES || max !== 1)) {\n    return -1;                      /* incomplete set */\n  }\n\n  /* generate offsets into symbol table for each length for sorting */\n  offs[1] = 0;\n  for (len = 1; len < MAXBITS; len++) {\n    offs[len + 1] = offs[len] + count[len];\n  }\n\n  /* sort symbols by length, by symbol order within each length */\n  for (sym = 0; sym < codes; sym++) {\n    if (lens[lens_index + sym] !== 0) {\n      work[offs[lens[lens_index + sym]]++] = sym;\n    }\n  }\n\n  /*\n   Create and fill in decoding tables.  In this loop, the table being\n   filled is at next and has curr index bits.  The code being used is huff\n   with length len.  That code is converted to an index by dropping drop\n   bits off of the bottom.  For codes where len is less than drop + curr,\n   those top drop + curr - len bits are incremented through all values to\n   fill the table with replicated entries.\n\n   root is the number of index bits for the root table.  When len exceeds\n   root, sub-tables are created pointed to by the root entry with an index\n   of the low root bits of huff.  This is saved in low to check for when a\n   new sub-table should be started.  drop is zero when the root table is\n   being filled, and drop is root when sub-tables are being filled.\n\n   When a new sub-table is needed, it is necessary to look ahead in the\n   code lengths to determine what size sub-table is needed.  The length\n   counts are used for this, and so count[] is decremented as codes are\n   entered in the tables.\n\n   used keeps track of how many table entries have been allocated from the\n   provided *table space.  It is checked for LENS and DIST tables against\n   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n   the initial root table size constants.  See the comments in inftrees.h\n   for more information.\n\n   sym increments through all symbols, and the loop terminates when\n   all codes of length max, i.e. all codes, have been processed.  This\n   routine permits incomplete codes, so another loop after this one fills\n   in the rest of the decoding tables with invalid code markers.\n   */\n\n  /* set up for code type */\n  // poor man optimization - use if-else instead of switch,\n  // to avoid deopts in old v8\n  if (type === CODES) {\n    base = extra = work;    /* dummy value--not used */\n    end = 19;\n\n  } else if (type === LENS) {\n    base = lbase;\n    base_index -= 257;\n    extra = lext;\n    extra_index -= 257;\n    end = 256;\n\n  } else {                    /* DISTS */\n    base = dbase;\n    extra = dext;\n    end = -1;\n  }\n\n  /* initialize opts for loop */\n  huff = 0;                   /* starting code */\n  sym = 0;                    /* starting code symbol */\n  len = min;                  /* starting code length */\n  next = table_index;              /* current table to fill in */\n  curr = root;                /* current table index bits */\n  drop = 0;                   /* current bits to drop from code for index */\n  low = -1;                   /* trigger new sub-table when len > root */\n  used = 1 << root;          /* use root table entries */\n  mask = used - 1;            /* mask for comparing low */\n\n  /* check available table space */\n  if ((type === LENS && used > ENOUGH_LENS) ||\n    (type === DISTS && used > ENOUGH_DISTS)) {\n    return 1;\n  }\n\n  var i = 0;\n  /* process all codes and make table entries */\n  for (;;) {\n    i++;\n    /* create table entry */\n    here_bits = len - drop;\n    if (work[sym] < end) {\n      here_op = 0;\n      here_val = work[sym];\n    }\n    else if (work[sym] > end) {\n      here_op = extra[extra_index + work[sym]];\n      here_val = base[base_index + work[sym]];\n    }\n    else {\n      here_op = 32 + 64;         /* end of block */\n      here_val = 0;\n    }\n\n    /* replicate for those indices with low len bits equal to huff */\n    incr = 1 << (len - drop);\n    fill = 1 << curr;\n    min = fill;                 /* save offset to next table */\n    do {\n      fill -= incr;\n      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n    } while (fill !== 0);\n\n    /* backwards increment the len-bit code huff */\n    incr = 1 << (len - 1);\n    while (huff & incr) {\n      incr >>= 1;\n    }\n    if (incr !== 0) {\n      huff &= incr - 1;\n      huff += incr;\n    } else {\n      huff = 0;\n    }\n\n    /* go to next symbol, update count, len */\n    sym++;\n    if (--count[len] === 0) {\n      if (len === max) { break; }\n      len = lens[lens_index + work[sym]];\n    }\n\n    /* create new sub-table if needed */\n    if (len > root && (huff & mask) !== low) {\n      /* if first time, transition to sub-tables */\n      if (drop === 0) {\n        drop = root;\n      }\n\n      /* increment past last table */\n      next += min;            /* here min is 1 << curr */\n\n      /* determine length of next table */\n      curr = len - drop;\n      left = 1 << curr;\n      while (curr + drop < max) {\n        left -= count[curr + drop];\n        if (left <= 0) { break; }\n        curr++;\n        left <<= 1;\n      }\n\n      /* check for enough space */\n      used += 1 << curr;\n      if ((type === LENS && used > ENOUGH_LENS) ||\n        (type === DISTS && used > ENOUGH_DISTS)) {\n        return 1;\n      }\n\n      /* point entry in root table to sub-table */\n      low = huff & mask;\n      /*table.op[low] = curr;\n      table.bits[low] = root;\n      table.val[low] = next - opts.table_index;*/\n      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n    }\n  }\n\n  /* fill in remaining table entry if code is incomplete (guaranteed to have\n   at most one remaining entry, since if the code is incomplete, the\n   maximum code length that was allowed to get this far is one bit) */\n  if (huff !== 0) {\n    //table.op[next + huff] = 64;            /* invalid code marker */\n    //table.bits[next + huff] = len - drop;\n    //table.val[next + huff] = 0;\n    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n  }\n\n  /* set return parameters */\n  //opts.table_index += used;\n  opts.bits = root;\n  return 0;\n};\n\n},{\"../utils/common\":123}],133:[function(require,module,exports){\n'use strict';\n\nmodule.exports = {\n  2:      'need dictionary',     /* Z_NEED_DICT       2  */\n  1:      'stream end',          /* Z_STREAM_END      1  */\n  0:      '',                    /* Z_OK              0  */\n  '-1':   'file error',          /* Z_ERRNO         (-1) */\n  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */\n  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */\n  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */\n  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */\n  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n},{}],134:[function(require,module,exports){\n'use strict';\n\n\nvar utils = require('../utils/common');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//var Z_FILTERED          = 1;\n//var Z_HUFFMAN_ONLY      = 2;\n//var Z_RLE               = 3;\nvar Z_FIXED               = 4;\n//var Z_DEFAULT_STRATEGY  = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nvar Z_BINARY              = 0;\nvar Z_TEXT                = 1;\n//var Z_ASCII             = 1; // = Z_TEXT\nvar Z_UNKNOWN             = 2;\n\n/*============================================================================*/\n\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nvar STORED_BLOCK = 0;\nvar STATIC_TREES = 1;\nvar DYN_TREES    = 2;\n/* The three kinds of block type */\n\nvar MIN_MATCH    = 3;\nvar MAX_MATCH    = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nvar LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nvar LITERALS      = 256;\n/* number of literal bytes 0..255 */\n\nvar L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nvar D_CODES       = 30;\n/* number of distance codes */\n\nvar BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\n\nvar HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\n\nvar MAX_BITS      = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar Buf_size      = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nvar MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nvar END_BLOCK   = 256;\n/* end of block literal code */\n\nvar REP_3_6     = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nvar REPZ_3_10   = 17;\n/* repeat a zero length 3-10 times  (3 bits of repeat count) */\n\nvar REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times  (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nvar extra_lbits =   /* extra bits for each length code */\n  [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];\n\nvar extra_dbits =   /* extra bits for each distance code */\n  [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];\n\nvar extra_blbits =  /* extra bits for each bit length code */\n  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];\n\nvar bl_order =\n  [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nvar DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1\nvar static_ltree  = new Array((L_CODES + 2) * 2);\nzero(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nvar static_dtree  = new Array(D_CODES * 2);\nzero(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nvar _dist_code    = new Array(DIST_CODE_LEN);\nzero(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nvar _length_code  = new Array(MAX_MATCH - MIN_MATCH + 1);\nzero(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nvar base_length   = new Array(LENGTH_CODES);\nzero(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nvar base_dist     = new Array(D_CODES);\nzero(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n  this.static_tree  = static_tree;  /* static tree or NULL */\n  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */\n  this.extra_base   = extra_base;   /* base index for extra_bits */\n  this.elems        = elems;        /* max number of elements in the tree */\n  this.max_length   = max_length;   /* max bit length for the codes */\n\n  // show if `static_tree` has data or dummy - needed for monomorphic objects\n  this.has_stree    = static_tree && static_tree.length;\n}\n\n\nvar static_l_desc;\nvar static_d_desc;\nvar static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n  this.dyn_tree = dyn_tree;     /* the dynamic tree */\n  this.max_code = 0;            /* largest code with non zero frequency */\n  this.stat_desc = stat_desc;   /* the corresponding static tree */\n}\n\n\n\nfunction d_code(dist) {\n  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n}\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nfunction put_short(s, w) {\n//    put_byte(s, (uch)((w) & 0xff));\n//    put_byte(s, (uch)((ush)(w) >> 8));\n  s.pending_buf[s.pending++] = (w) & 0xff;\n  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n}\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nfunction send_bits(s, value, length) {\n  if (s.bi_valid > (Buf_size - length)) {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    put_short(s, s.bi_buf);\n    s.bi_buf = value >> (Buf_size - s.bi_valid);\n    s.bi_valid += length - Buf_size;\n  } else {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    s.bi_valid += length;\n  }\n}\n\n\nfunction send_code(s, c, tree) {\n  send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n}\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nfunction bi_reverse(code, len) {\n  var res = 0;\n  do {\n    res |= code & 1;\n    code >>>= 1;\n    res <<= 1;\n  } while (--len > 0);\n  return res >>> 1;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nfunction bi_flush(s) {\n  if (s.bi_valid === 16) {\n    put_short(s, s.bi_buf);\n    s.bi_buf = 0;\n    s.bi_valid = 0;\n\n  } else if (s.bi_valid >= 8) {\n    s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n    s.bi_buf >>= 8;\n    s.bi_valid -= 8;\n  }\n}\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n *    above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n *     array bl_count contains the frequencies for each bit length.\n *     The length opt_len is updated; static_len is also updated if stree is\n *     not null.\n */\nfunction gen_bitlen(s, desc)\n//    deflate_state *s;\n//    tree_desc *desc;    /* the tree descriptor */\n{\n  var tree            = desc.dyn_tree;\n  var max_code        = desc.max_code;\n  var stree           = desc.stat_desc.static_tree;\n  var has_stree       = desc.stat_desc.has_stree;\n  var extra           = desc.stat_desc.extra_bits;\n  var base            = desc.stat_desc.extra_base;\n  var max_length      = desc.stat_desc.max_length;\n  var h;              /* heap index */\n  var n, m;           /* iterate over the tree elements */\n  var bits;           /* bit length */\n  var xbits;          /* extra bits */\n  var f;              /* frequency */\n  var overflow = 0;   /* number of elements with bit length too large */\n\n  for (bits = 0; bits <= MAX_BITS; bits++) {\n    s.bl_count[bits] = 0;\n  }\n\n  /* In a first pass, compute the optimal bit lengths (which may\n   * overflow in the case of the bit length tree).\n   */\n  tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n  for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {\n    n = s.heap[h];\n    bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n    if (bits > max_length) {\n      bits = max_length;\n      overflow++;\n    }\n    tree[n * 2 + 1]/*.Len*/ = bits;\n    /* We overwrite tree[n].Dad which is no longer needed */\n\n    if (n > max_code) { continue; } /* not a leaf node */\n\n    s.bl_count[bits]++;\n    xbits = 0;\n    if (n >= base) {\n      xbits = extra[n - base];\n    }\n    f = tree[n * 2]/*.Freq*/;\n    s.opt_len += f * (bits + xbits);\n    if (has_stree) {\n      s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n    }\n  }\n  if (overflow === 0) { return; }\n\n  // Trace((stderr,\"\\nbit length overflow\\n\"));\n  /* This happens for example on obj2 and pic of the Calgary corpus */\n\n  /* Find the first bit length which could increase: */\n  do {\n    bits = max_length - 1;\n    while (s.bl_count[bits] === 0) { bits--; }\n    s.bl_count[bits]--;      /* move one leaf down the tree */\n    s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n    s.bl_count[max_length]--;\n    /* The brother of the overflow item also moves one step up,\n     * but this does not affect bl_count[max_length]\n     */\n    overflow -= 2;\n  } while (overflow > 0);\n\n  /* Now recompute all bit lengths, scanning in increasing frequency.\n   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n   * lengths instead of fixing only the wrong ones. This idea is taken\n   * from 'ar' written by Haruhiko Okumura.)\n   */\n  for (bits = max_length; bits !== 0; bits--) {\n    n = s.bl_count[bits];\n    while (n !== 0) {\n      m = s.heap[--h];\n      if (m > max_code) { continue; }\n      if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n        // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n        s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n        tree[m * 2 + 1]/*.Len*/ = bits;\n      }\n      n--;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n *     zero code length.\n */\nfunction gen_codes(tree, max_code, bl_count)\n//    ct_data *tree;             /* the tree to decorate */\n//    int max_code;              /* largest code with non zero frequency */\n//    ushf *bl_count;            /* number of codes at each bit length */\n{\n  var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */\n  var code = 0;              /* running code value */\n  var bits;                  /* bit index */\n  var n;                     /* code index */\n\n  /* The distribution counts are first used to generate the code values\n   * without bit reversal.\n   */\n  for (bits = 1; bits <= MAX_BITS; bits++) {\n    next_code[bits] = code = (code + bl_count[bits - 1]) << 1;\n  }\n  /* Check that the bit counts in bl_count are consistent. The last code\n   * must be all ones.\n   */\n  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n  //        \"inconsistent bit counts\");\n  //Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n  for (n = 0;  n <= max_code; n++) {\n    var len = tree[n * 2 + 1]/*.Len*/;\n    if (len === 0) { continue; }\n    /* Now reverse the bits */\n    tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);\n\n    //Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n  }\n}\n\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nfunction tr_static_init() {\n  var n;        /* iterates over tree elements */\n  var bits;     /* bit counter */\n  var length;   /* length value */\n  var code;     /* code value */\n  var dist;     /* distance index */\n  var bl_count = new Array(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  // do check in _tr_init()\n  //if (static_init_done) return;\n\n  /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n  static_l_desc.static_tree = static_ltree;\n  static_l_desc.extra_bits = extra_lbits;\n  static_d_desc.static_tree = static_dtree;\n  static_d_desc.extra_bits = extra_dbits;\n  static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n  /* Initialize the mapping length (0..255) -> length code (0..28) */\n  length = 0;\n  for (code = 0; code < LENGTH_CODES - 1; code++) {\n    base_length[code] = length;\n    for (n = 0; n < (1 << extra_lbits[code]); n++) {\n      _length_code[length++] = code;\n    }\n  }\n  //Assert (length == 256, \"tr_static_init: length != 256\");\n  /* Note that the length 255 (match length 258) can be represented\n   * in two different ways: code 284 + 5 bits or code 285, so we\n   * overwrite length_code[255] to use the best encoding:\n   */\n  _length_code[length - 1] = code;\n\n  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n  dist = 0;\n  for (code = 0; code < 16; code++) {\n    base_dist[code] = dist;\n    for (n = 0; n < (1 << extra_dbits[code]); n++) {\n      _dist_code[dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: dist != 256\");\n  dist >>= 7; /* from now on, all distances are divided by 128 */\n  for (; code < D_CODES; code++) {\n    base_dist[code] = dist << 7;\n    for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n      _dist_code[256 + dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n  /* Construct the codes of the static literal tree */\n  for (bits = 0; bits <= MAX_BITS; bits++) {\n    bl_count[bits] = 0;\n  }\n\n  n = 0;\n  while (n <= 143) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  while (n <= 255) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 9;\n    n++;\n    bl_count[9]++;\n  }\n  while (n <= 279) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 7;\n    n++;\n    bl_count[7]++;\n  }\n  while (n <= 287) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  /* Codes 286 and 287 do not exist, but we must include them in the\n   * tree construction to get a canonical Huffman tree (longest code\n   * all ones)\n   */\n  gen_codes(static_ltree, L_CODES + 1, bl_count);\n\n  /* The static distance tree is trivial: */\n  for (n = 0; n < D_CODES; n++) {\n    static_dtree[n * 2 + 1]/*.Len*/ = 5;\n    static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n  }\n\n  // Now data ready and we can init static trees\n  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);\n  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);\n  static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);\n\n  //static_init_done = true;\n}\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nfunction init_block(s) {\n  var n; /* iterates over tree elements */\n\n  /* Initialize the trees. */\n  for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n  s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n  s.opt_len = s.static_len = 0;\n  s.last_lit = s.matches = 0;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nfunction bi_windup(s)\n{\n  if (s.bi_valid > 8) {\n    put_short(s, s.bi_buf);\n  } else if (s.bi_valid > 0) {\n    //put_byte(s, (Byte)s->bi_buf);\n    s.pending_buf[s.pending++] = s.bi_buf;\n  }\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n}\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nfunction copy_block(s, buf, len, header)\n//DeflateState *s;\n//charf    *buf;    /* the input data */\n//unsigned len;     /* its length */\n//int      header;  /* true if block header must be written */\n{\n  bi_windup(s);        /* align on byte boundary */\n\n  if (header) {\n    put_short(s, len);\n    put_short(s, ~len);\n  }\n//  while (len--) {\n//    put_byte(s, *buf++);\n//  }\n  utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);\n  s.pending += len;\n}\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nfunction smaller(tree, n, m, depth) {\n  var _n2 = n * 2;\n  var _m2 = m * 2;\n  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n}\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nfunction pqdownheap(s, tree, k)\n//    deflate_state *s;\n//    ct_data *tree;  /* the tree to restore */\n//    int k;               /* node to move down */\n{\n  var v = s.heap[k];\n  var j = k << 1;  /* left son of k */\n  while (j <= s.heap_len) {\n    /* Set j to the smallest of the two sons: */\n    if (j < s.heap_len &&\n      smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n      j++;\n    }\n    /* Exit if v is smaller than both sons */\n    if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n    /* Exchange v with the smallest son */\n    s.heap[k] = s.heap[j];\n    k = j;\n\n    /* And continue down the tree, setting j to the left son of k */\n    j <<= 1;\n  }\n  s.heap[k] = v;\n}\n\n\n// inlined manually\n// var SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nfunction compress_block(s, ltree, dtree)\n//    deflate_state *s;\n//    const ct_data *ltree; /* literal tree */\n//    const ct_data *dtree; /* distance tree */\n{\n  var dist;           /* distance of matched string */\n  var lc;             /* match length or unmatched char (if dist == 0) */\n  var lx = 0;         /* running index in l_buf */\n  var code;           /* the code to send */\n  var extra;          /* number of extra bits to send */\n\n  if (s.last_lit !== 0) {\n    do {\n      dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);\n      lc = s.pending_buf[s.l_buf + lx];\n      lx++;\n\n      if (dist === 0) {\n        send_code(s, lc, ltree); /* send a literal byte */\n        //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n      } else {\n        /* Here, lc is the match length - MIN_MATCH */\n        code = _length_code[lc];\n        send_code(s, code + LITERALS + 1, ltree); /* send the length code */\n        extra = extra_lbits[code];\n        if (extra !== 0) {\n          lc -= base_length[code];\n          send_bits(s, lc, extra);       /* send the extra length bits */\n        }\n        dist--; /* dist is now the match distance - 1 */\n        code = d_code(dist);\n        //Assert (code < D_CODES, \"bad d_code\");\n\n        send_code(s, code, dtree);       /* send the distance code */\n        extra = extra_dbits[code];\n        if (extra !== 0) {\n          dist -= base_dist[code];\n          send_bits(s, dist, extra);   /* send the extra distance bits */\n        }\n      } /* literal or match pair ? */\n\n      /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n      //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n      //       \"pendingBuf overflow\");\n\n    } while (lx < s.last_lit);\n  }\n\n  send_code(s, END_BLOCK, ltree);\n}\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n *     and corresponding code. The length opt_len is updated; static_len is\n *     also updated if stree is not null. The field max_code is set.\n */\nfunction build_tree(s, desc)\n//    deflate_state *s;\n//    tree_desc *desc; /* the tree descriptor */\n{\n  var tree     = desc.dyn_tree;\n  var stree    = desc.stat_desc.static_tree;\n  var has_stree = desc.stat_desc.has_stree;\n  var elems    = desc.stat_desc.elems;\n  var n, m;          /* iterate over heap elements */\n  var max_code = -1; /* largest code with non zero frequency */\n  var node;          /* new node being created */\n\n  /* Construct the initial heap, with least frequent element in\n   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n   * heap[0] is not used.\n   */\n  s.heap_len = 0;\n  s.heap_max = HEAP_SIZE;\n\n  for (n = 0; n < elems; n++) {\n    if (tree[n * 2]/*.Freq*/ !== 0) {\n      s.heap[++s.heap_len] = max_code = n;\n      s.depth[n] = 0;\n\n    } else {\n      tree[n * 2 + 1]/*.Len*/ = 0;\n    }\n  }\n\n  /* The pkzip format requires that at least one distance code exists,\n   * and that at least one bit should be sent even if there is only one\n   * possible code. So to avoid special checks later on we force at least\n   * two codes of non zero frequency.\n   */\n  while (s.heap_len < 2) {\n    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n    tree[node * 2]/*.Freq*/ = 1;\n    s.depth[node] = 0;\n    s.opt_len--;\n\n    if (has_stree) {\n      s.static_len -= stree[node * 2 + 1]/*.Len*/;\n    }\n    /* node is 0 or 1 so it does not have extra bits */\n  }\n  desc.max_code = max_code;\n\n  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n   * establish sub-heaps of increasing lengths:\n   */\n  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n  /* Construct the Huffman tree by repeatedly combining the least two\n   * frequent nodes.\n   */\n  node = elems;              /* next internal node of the tree */\n  do {\n    //pqremove(s, tree, n);  /* n = node of least frequency */\n    /*** pqremove ***/\n    n = s.heap[1/*SMALLEST*/];\n    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n    /***/\n\n    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n    s.heap[--s.heap_max] = m;\n\n    /* Create a new node father of n and m */\n    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n    tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n    /* and insert the new node in the heap */\n    s.heap[1/*SMALLEST*/] = node++;\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n\n  } while (s.heap_len >= 2);\n\n  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n  /* At this point, the fields freq and dad are set. We can now\n   * generate the bit lengths.\n   */\n  gen_bitlen(s, desc);\n\n  /* The field len is now set, we can generate the bit codes */\n  gen_codes(tree, max_code, s.bl_count);\n}\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nfunction scan_tree(s, tree, max_code)\n//    deflate_state *s;\n//    ct_data *tree;   /* the tree to be scanned */\n//    int max_code;    /* and its largest code of non zero frequency */\n{\n  var n;                     /* iterates over all tree elements */\n  var prevlen = -1;          /* last emitted length */\n  var curlen;                /* length of current code */\n\n  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  var count = 0;             /* repeat count of the current code */\n  var max_count = 7;         /* max repeat count */\n  var min_count = 4;         /* min repeat count */\n\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n  tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n    } else if (curlen !== 0) {\n\n      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n      s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n    } else if (count <= 10) {\n      s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n    } else {\n      s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n    }\n\n    count = 0;\n    prevlen = curlen;\n\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nfunction send_tree(s, tree, max_code)\n//    deflate_state *s;\n//    ct_data *tree; /* the tree to be scanned */\n//    int max_code;       /* and its largest code of non zero frequency */\n{\n  var n;                     /* iterates over all tree elements */\n  var prevlen = -1;          /* last emitted length */\n  var curlen;                /* length of current code */\n\n  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  var count = 0;             /* repeat count of the current code */\n  var max_count = 7;         /* max repeat count */\n  var min_count = 4;         /* min repeat count */\n\n  /* tree[max_code+1].Len = -1; */  /* guard already set */\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n    } else if (curlen !== 0) {\n      if (curlen !== prevlen) {\n        send_code(s, curlen, s.bl_tree);\n        count--;\n      }\n      //Assert(count >= 3 && count <= 6, \" 3_6?\");\n      send_code(s, REP_3_6, s.bl_tree);\n      send_bits(s, count - 3, 2);\n\n    } else if (count <= 10) {\n      send_code(s, REPZ_3_10, s.bl_tree);\n      send_bits(s, count - 3, 3);\n\n    } else {\n      send_code(s, REPZ_11_138, s.bl_tree);\n      send_bits(s, count - 11, 7);\n    }\n\n    count = 0;\n    prevlen = curlen;\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nfunction build_bl_tree(s) {\n  var max_blindex;  /* index of last bit length code of non zero freq */\n\n  /* Determine the bit length frequencies for literal and distance trees */\n  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n  /* Build the bit length tree: */\n  build_tree(s, s.bl_desc);\n  /* opt_len now includes the length of the tree representations, except\n   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n   */\n\n  /* Determine the number of bit length codes to send. The pkzip format\n   * requires that at least 4 bit length codes be sent. (appnote.txt says\n   * 3 but the actual value used is 4.)\n   */\n  for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {\n    if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n      break;\n    }\n  }\n  /* Update opt_len to include the bit length tree and counts */\n  s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n  //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n  //        s->opt_len, s->static_len));\n\n  return max_blindex;\n}\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nfunction send_all_trees(s, lcodes, dcodes, blcodes)\n//    deflate_state *s;\n//    int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n  var rank;                    /* index in bl_order */\n\n  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n  //        \"too many codes\");\n  //Tracev((stderr, \"\\nbl counts: \"));\n  send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n  send_bits(s, dcodes - 1,   5);\n  send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */\n  for (rank = 0; rank < blcodes; rank++) {\n    //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n    send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n  }\n  //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n  //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n  //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n}\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n *    a) There are no non-portable control characters belonging to the\n *       \"black list\" (0..6, 14..25, 28..31).\n *    b) There is at least one printable character belonging to the\n *       \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n *   \"gray list\" that is ignored in this detection algorithm:\n *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nfunction detect_data_type(s) {\n  /* black_mask is the bit mask of black-listed bytes\n   * set bits 0..6, 14..25, and 28..31\n   * 0xf3ffc07f = binary 11110011111111111100000001111111\n   */\n  var black_mask = 0xf3ffc07f;\n  var n;\n\n  /* Check for non-textual (\"black-listed\") bytes. */\n  for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n    if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n      return Z_BINARY;\n    }\n  }\n\n  /* Check for textual (\"white-listed\") bytes. */\n  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n    return Z_TEXT;\n  }\n  for (n = 32; n < LITERALS; n++) {\n    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n      return Z_TEXT;\n    }\n  }\n\n  /* There are no \"black-listed\" or \"white-listed\" bytes:\n   * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n   */\n  return Z_BINARY;\n}\n\n\nvar static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nfunction _tr_init(s)\n{\n\n  if (!static_init_done) {\n    tr_static_init();\n    static_init_done = true;\n  }\n\n  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);\n  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);\n  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n\n  /* Initialize the first block of the first file: */\n  init_block(s);\n}\n\n\n/* ===========================================================================\n * Send a stored block\n */\nfunction _tr_stored_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf;       /* input block */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n{\n  send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */\n  copy_block(s, buf, stored_len, true); /* with header */\n}\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nfunction _tr_align(s) {\n  send_bits(s, STATIC_TREES << 1, 3);\n  send_code(s, END_BLOCK, static_ltree);\n  bi_flush(s);\n}\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nfunction _tr_flush_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf;       /* input block, or NULL if too old */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n{\n  var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */\n  var max_blindex = 0;        /* index of last bit length code of non zero freq */\n\n  /* Build the Huffman trees unless a stored block is forced */\n  if (s.level > 0) {\n\n    /* Check if the file is binary or text */\n    if (s.strm.data_type === Z_UNKNOWN) {\n      s.strm.data_type = detect_data_type(s);\n    }\n\n    /* Construct the literal and distance trees */\n    build_tree(s, s.l_desc);\n    // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n\n    build_tree(s, s.d_desc);\n    // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n    /* At this point, opt_len and static_len are the total bit lengths of\n     * the compressed block data, excluding the tree representations.\n     */\n\n    /* Build the bit length tree for the above two trees, and get the index\n     * in bl_order of the last bit length code to send.\n     */\n    max_blindex = build_bl_tree(s);\n\n    /* Determine the best encoding. Compute the block lengths in bytes. */\n    opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n    static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n    // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n    //        s->last_lit));\n\n    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n  } else {\n    // Assert(buf != (char*)0, \"lost buf\");\n    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n  }\n\n  if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n    /* 4: two words for the lengths */\n\n    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n     * Otherwise we can't have processed more than WSIZE input bytes since\n     * the last block flush, because compression would have been\n     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n     * transform a block into a stored block.\n     */\n    _tr_stored_block(s, buf, stored_len, last);\n\n  } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {\n\n    send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n    compress_block(s, static_ltree, static_dtree);\n\n  } else {\n    send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n    send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n    compress_block(s, s.dyn_ltree, s.dyn_dtree);\n  }\n  // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n  /* The above check is made mod 2^32, for files larger than 512 MB\n   * and uLong implemented on 32 bits.\n   */\n  init_block(s);\n\n  if (last) {\n    bi_windup(s);\n  }\n  // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n  //       s->compressed_len-7*last));\n}\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nfunction _tr_tally(s, dist, lc)\n//    deflate_state *s;\n//    unsigned dist;  /* distance of matched string */\n//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n  //var out_length, in_length, dcode;\n\n  s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;\n  s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n  s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n  s.last_lit++;\n\n  if (dist === 0) {\n    /* lc is the unmatched char */\n    s.dyn_ltree[lc * 2]/*.Freq*/++;\n  } else {\n    s.matches++;\n    /* Here, lc is the match length - MIN_MATCH */\n    dist--;             /* dist = match distance - 1 */\n    //Assert((ush)dist < (ush)MAX_DIST(s) &&\n    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n    //       (ush)d_code(dist) < (ush)D_CODES,  \"_tr_tally: bad match\");\n\n    s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;\n    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n  }\n\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n//  /* Try to guess if it is profitable to stop the current block here */\n//  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n//    /* Compute an upper bound for the compressed length */\n//    out_length = s.last_lit*8;\n//    in_length = s.strstart - s.block_start;\n//\n//    for (dcode = 0; dcode < D_CODES; dcode++) {\n//      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n//    }\n//    out_length >>>= 3;\n//    //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n//    //       s->last_lit, in_length, out_length,\n//    //       100L - out_length*100L/in_length));\n//    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n//      return true;\n//    }\n//  }\n//#endif\n\n  return (s.last_lit === s.lit_bufsize - 1);\n  /* We avoid equality with lit_bufsize because of wraparound at 64K\n   * on 16 bit machines and because stored blocks are restricted to\n   * 64K-1 bytes.\n   */\n}\n\nexports._tr_init  = _tr_init;\nexports._tr_stored_block = _tr_stored_block;\nexports._tr_flush_block  = _tr_flush_block;\nexports._tr_tally = _tr_tally;\nexports._tr_align = _tr_align;\n\n},{\"../utils/common\":123}],135:[function(require,module,exports){\n'use strict';\n\n\nfunction ZStream() {\n  /* next input byte */\n  this.input = null; // JS specific, because we have no pointers\n  this.next_in = 0;\n  /* number of bytes available at input */\n  this.avail_in = 0;\n  /* total number of input bytes read so far */\n  this.total_in = 0;\n  /* next output byte should be put there */\n  this.output = null; // JS specific, because we have no pointers\n  this.next_out = 0;\n  /* remaining free space at output */\n  this.avail_out = 0;\n  /* total number of bytes output so far */\n  this.total_out = 0;\n  /* last error message, NULL if no error */\n  this.msg = ''/*Z_NULL*/;\n  /* not visible by applications */\n  this.state = null;\n  /* best guess about the data type: binary or text */\n  this.data_type = 2/*Z_UNKNOWN*/;\n  /* adler32 value of the uncompressed data */\n  this.adler = 0;\n}\n\nmodule.exports = ZStream;\n\n},{}],136:[function(require,module,exports){\n(function (process){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n  // if the path tries to go above the root, `up` ends up > 0\n  var up = 0;\n  for (var i = parts.length - 1; i >= 0; i--) {\n    var last = parts[i];\n    if (last === '.') {\n      parts.splice(i, 1);\n    } else if (last === '..') {\n      parts.splice(i, 1);\n      up++;\n    } else if (up) {\n      parts.splice(i, 1);\n      up--;\n    }\n  }\n\n  // if the path is allowed to go above the root, restore leading ..s\n  if (allowAboveRoot) {\n    for (; up--; up) {\n      parts.unshift('..');\n    }\n  }\n\n  return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n    /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar splitPath = function(filename) {\n  return splitPathRe.exec(filename).slice(1);\n};\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n  var resolvedPath = '',\n      resolvedAbsolute = false;\n\n  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n    var path = (i >= 0) ? arguments[i] : process.cwd();\n\n    // Skip empty and invalid entries\n    if (typeof path !== 'string') {\n      throw new TypeError('Arguments to path.resolve must be strings');\n    } else if (!path) {\n      continue;\n    }\n\n    resolvedPath = path + '/' + resolvedPath;\n    resolvedAbsolute = path.charAt(0) === '/';\n  }\n\n  // At this point the path should be resolved to a full absolute path, but\n  // handle relative paths to be safe (might happen when process.cwd() fails)\n\n  // Normalize the path\n  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n    return !!p;\n  }), !resolvedAbsolute).join('/');\n\n  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n  var isAbsolute = exports.isAbsolute(path),\n      trailingSlash = substr(path, -1) === '/';\n\n  // Normalize the path\n  path = normalizeArray(filter(path.split('/'), function(p) {\n    return !!p;\n  }), !isAbsolute).join('/');\n\n  if (!path && !isAbsolute) {\n    path = '.';\n  }\n  if (path && trailingSlash) {\n    path += '/';\n  }\n\n  return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n  return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n  var paths = Array.prototype.slice.call(arguments, 0);\n  return exports.normalize(filter(paths, function(p, index) {\n    if (typeof p !== 'string') {\n      throw new TypeError('Arguments to path.join must be strings');\n    }\n    return p;\n  }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n  from = exports.resolve(from).substr(1);\n  to = exports.resolve(to).substr(1);\n\n  function trim(arr) {\n    var start = 0;\n    for (; start < arr.length; start++) {\n      if (arr[start] !== '') break;\n    }\n\n    var end = arr.length - 1;\n    for (; end >= 0; end--) {\n      if (arr[end] !== '') break;\n    }\n\n    if (start > end) return [];\n    return arr.slice(start, end - start + 1);\n  }\n\n  var fromParts = trim(from.split('/'));\n  var toParts = trim(to.split('/'));\n\n  var length = Math.min(fromParts.length, toParts.length);\n  var samePartsLength = length;\n  for (var i = 0; i < length; i++) {\n    if (fromParts[i] !== toParts[i]) {\n      samePartsLength = i;\n      break;\n    }\n  }\n\n  var outputParts = [];\n  for (var i = samePartsLength; i < fromParts.length; i++) {\n    outputParts.push('..');\n  }\n\n  outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n  return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function(path) {\n  var result = splitPath(path),\n      root = result[0],\n      dir = result[1];\n\n  if (!root && !dir) {\n    // No dirname whatsoever\n    return '.';\n  }\n\n  if (dir) {\n    // It has a dirname, strip trailing slash\n    dir = dir.substr(0, dir.length - 1);\n  }\n\n  return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n  var f = splitPath(path)[2];\n  // TODO: make this comparison case-insensitive on windows?\n  if (ext && f.substr(-1 * ext.length) === ext) {\n    f = f.substr(0, f.length - ext.length);\n  }\n  return f;\n};\n\n\nexports.extname = function(path) {\n  return splitPath(path)[3];\n};\n\nfunction filter (xs, f) {\n    if (xs.filter) return xs.filter(f);\n    var res = [];\n    for (var i = 0; i < xs.length; i++) {\n        if (f(xs[i], i, xs)) res.push(xs[i]);\n    }\n    return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n    ? function (str, start, len) { return str.substr(start, len) }\n    : function (str, start, len) {\n        if (start < 0) start = str.length + start;\n        return str.substr(start, len);\n    }\n;\n\n}).call(this,require('_process'))\n},{\"_process\":138}],137:[function(require,module,exports){\n(function (process){\n'use strict';\n\nif (!process.version ||\n    process.version.indexOf('v0.') === 0 ||\n    process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {\n  module.exports = nextTick;\n} else {\n  module.exports = process.nextTick;\n}\n\nfunction nextTick(fn, arg1, arg2, arg3) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('\"callback\" argument must be a function');\n  }\n  var len = arguments.length;\n  var args, i;\n  switch (len) {\n  case 0:\n  case 1:\n    return process.nextTick(fn);\n  case 2:\n    return process.nextTick(function afterTickOne() {\n      fn.call(null, arg1);\n    });\n  case 3:\n    return process.nextTick(function afterTickTwo() {\n      fn.call(null, arg1, arg2);\n    });\n  case 4:\n    return process.nextTick(function afterTickThree() {\n      fn.call(null, arg1, arg2, arg3);\n    });\n  default:\n    args = new Array(len - 1);\n    i = 0;\n    while (i < args.length) {\n      args[i++] = arguments[i];\n    }\n    return process.nextTick(function afterTick() {\n      fn.apply(null, args);\n    });\n  }\n}\n\n}).call(this,require('_process'))\n},{\"_process\":138}],138:[function(require,module,exports){\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],139:[function(require,module,exports){\nmodule.exports = require(\"./lib/_stream_duplex.js\")\n\n},{\"./lib/_stream_duplex.js\":140}],140:[function(require,module,exports){\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n\n'use strict';\n\n/*<replacement>*/\n\nvar objectKeys = Object.keys || function (obj) {\n  var keys = [];\n  for (var key in obj) {\n    keys.push(key);\n  }return keys;\n};\n/*</replacement>*/\n\nmodule.exports = Duplex;\n\n/*<replacement>*/\nvar processNextTick = require('process-nextick-args');\n/*</replacement>*/\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nvar Readable = require('./_stream_readable');\nvar Writable = require('./_stream_writable');\n\nutil.inherits(Duplex, Readable);\n\nvar keys = objectKeys(Writable.prototype);\nfor (var v = 0; v < keys.length; v++) {\n  var method = keys[v];\n  if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n}\n\nfunction Duplex(options) {\n  if (!(this instanceof Duplex)) return new Duplex(options);\n\n  Readable.call(this, options);\n  Writable.call(this, options);\n\n  if (options && options.readable === false) this.readable = false;\n\n  if (options && options.writable === false) this.writable = false;\n\n  this.allowHalfOpen = true;\n  if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;\n\n  this.once('end', onend);\n}\n\n// the no-half-open enforcer\nfunction onend() {\n  // if we allow half-open state, or if the writable side ended,\n  // then we're ok.\n  if (this.allowHalfOpen || this._writableState.ended) return;\n\n  // no more data can be written.\n  // But allow more writes to happen in this tick.\n  processNextTick(onEndNT, this);\n}\n\nfunction onEndNT(self) {\n  self.end();\n}\n\nfunction forEach(xs, f) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    f(xs[i], i);\n  }\n}\n},{\"./_stream_readable\":142,\"./_stream_writable\":144,\"core-util-is\":78,\"inherits\":81,\"process-nextick-args\":137}],141:[function(require,module,exports){\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n\n'use strict';\n\nmodule.exports = PassThrough;\n\nvar Transform = require('./_stream_transform');\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nutil.inherits(PassThrough, Transform);\n\nfunction PassThrough(options) {\n  if (!(this instanceof PassThrough)) return new PassThrough(options);\n\n  Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n  cb(null, chunk);\n};\n},{\"./_stream_transform\":143,\"core-util-is\":78,\"inherits\":81}],142:[function(require,module,exports){\n(function (process){\n'use strict';\n\nmodule.exports = Readable;\n\n/*<replacement>*/\nvar processNextTick = require('process-nextick-args');\n/*</replacement>*/\n\n/*<replacement>*/\nvar isArray = require('isarray');\n/*</replacement>*/\n\n/*<replacement>*/\nvar Duplex;\n/*</replacement>*/\n\nReadable.ReadableState = ReadableState;\n\n/*<replacement>*/\nvar EE = require('events').EventEmitter;\n\nvar EElistenerCount = function (emitter, type) {\n  return emitter.listeners(type).length;\n};\n/*</replacement>*/\n\n/*<replacement>*/\nvar Stream;\n(function () {\n  try {\n    Stream = require('st' + 'ream');\n  } catch (_) {} finally {\n    if (!Stream) Stream = require('events').EventEmitter;\n  }\n})();\n/*</replacement>*/\n\nvar Buffer = require('buffer').Buffer;\n/*<replacement>*/\nvar bufferShim = require('buffer-shims');\n/*</replacement>*/\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\n/*<replacement>*/\nvar debugUtil = require('util');\nvar debug = void 0;\nif (debugUtil && debugUtil.debuglog) {\n  debug = debugUtil.debuglog('stream');\n} else {\n  debug = function () {};\n}\n/*</replacement>*/\n\nvar BufferList = require('./internal/streams/BufferList');\nvar StringDecoder;\n\nutil.inherits(Readable, Stream);\n\nfunction prependListener(emitter, event, fn) {\n  // Sadly this is not cacheable as some libraries bundle their own\n  // event emitter implementation with them.\n  if (typeof emitter.prependListener === 'function') {\n    return emitter.prependListener(event, fn);\n  } else {\n    // This is a hack to make sure that our error handler is attached before any\n    // userland ones.  NEVER DO THIS. This is here only because this code needs\n    // to continue to work with older versions of Node.js that do not include\n    // the prependListener() method. The goal is to eventually remove this hack.\n    if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];\n  }\n}\n\nfunction ReadableState(options, stream) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  options = options || {};\n\n  // object stream flag. Used to make read(n) ignore n and to\n  // make all the buffer merging and length checks go away\n  this.objectMode = !!options.objectMode;\n\n  if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode;\n\n  // the point at which it stops calling _read() to fill the buffer\n  // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n  var hwm = options.highWaterMark;\n  var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n  this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;\n\n  // cast to ints.\n  this.highWaterMark = ~~this.highWaterMark;\n\n  // A linked list is used to store data chunks instead of an array because the\n  // linked list can remove elements from the beginning faster than\n  // array.shift()\n  this.buffer = new BufferList();\n  this.length = 0;\n  this.pipes = null;\n  this.pipesCount = 0;\n  this.flowing = null;\n  this.ended = false;\n  this.endEmitted = false;\n  this.reading = false;\n\n  // a flag to be able to tell if the onwrite cb is called immediately,\n  // or on a later tick.  We set this to true at first, because any\n  // actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first write call.\n  this.sync = true;\n\n  // whenever we return null, then we set a flag to say\n  // that we're awaiting a 'readable' event emission.\n  this.needReadable = false;\n  this.emittedReadable = false;\n  this.readableListening = false;\n  this.resumeScheduled = false;\n\n  // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n  this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n  // when piping, we only care about 'readable' events that happen\n  // after read()ing all the bytes and not getting any pushback.\n  this.ranOut = false;\n\n  // the number of writers that are awaiting a drain event in .pipe()s\n  this.awaitDrain = 0;\n\n  // if true, a maybeReadMore has been scheduled\n  this.readingMore = false;\n\n  this.decoder = null;\n  this.encoding = null;\n  if (options.encoding) {\n    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n    this.decoder = new StringDecoder(options.encoding);\n    this.encoding = options.encoding;\n  }\n}\n\nfunction Readable(options) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  if (!(this instanceof Readable)) return new Readable(options);\n\n  this._readableState = new ReadableState(options, this);\n\n  // legacy\n  this.readable = true;\n\n  if (options && typeof options.read === 'function') this._read = options.read;\n\n  Stream.call(this);\n}\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function (chunk, encoding) {\n  var state = this._readableState;\n\n  if (!state.objectMode && typeof chunk === 'string') {\n    encoding = encoding || state.defaultEncoding;\n    if (encoding !== state.encoding) {\n      chunk = bufferShim.from(chunk, encoding);\n      encoding = '';\n    }\n  }\n\n  return readableAddChunk(this, state, chunk, encoding, false);\n};\n\n// Unshift should *always* be something directly out of read()\nReadable.prototype.unshift = function (chunk) {\n  var state = this._readableState;\n  return readableAddChunk(this, state, chunk, '', true);\n};\n\nReadable.prototype.isPaused = function () {\n  return this._readableState.flowing === false;\n};\n\nfunction readableAddChunk(stream, state, chunk, encoding, addToFront) {\n  var er = chunkInvalid(state, chunk);\n  if (er) {\n    stream.emit('error', er);\n  } else if (chunk === null) {\n    state.reading = false;\n    onEofChunk(stream, state);\n  } else if (state.objectMode || chunk && chunk.length > 0) {\n    if (state.ended && !addToFront) {\n      var e = new Error('stream.push() after EOF');\n      stream.emit('error', e);\n    } else if (state.endEmitted && addToFront) {\n      var _e = new Error('stream.unshift() after end event');\n      stream.emit('error', _e);\n    } else {\n      var skipAdd;\n      if (state.decoder && !addToFront && !encoding) {\n        chunk = state.decoder.write(chunk);\n        skipAdd = !state.objectMode && chunk.length === 0;\n      }\n\n      if (!addToFront) state.reading = false;\n\n      // Don't add to the buffer if we've decoded to an empty string chunk and\n      // we're not in object mode\n      if (!skipAdd) {\n        // if we want the data now, just emit it.\n        if (state.flowing && state.length === 0 && !state.sync) {\n          stream.emit('data', chunk);\n          stream.read(0);\n        } else {\n          // update the buffer info.\n          state.length += state.objectMode ? 1 : chunk.length;\n          if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n\n          if (state.needReadable) emitReadable(stream);\n        }\n      }\n\n      maybeReadMore(stream, state);\n    }\n  } else if (!addToFront) {\n    state.reading = false;\n  }\n\n  return needMoreData(state);\n}\n\n// if it's past the high water mark, we can push in some more.\n// Also, if we have no data yet, we can stand some\n// more bytes.  This is to work around cases where hwm=0,\n// such as the repl.  Also, if the push() triggered a\n// readable event, and the user called read(largeNumber) such that\n// needReadable was set, then we ought to push more, so that another\n// 'readable' event will be triggered.\nfunction needMoreData(state) {\n  return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);\n}\n\n// backwards compatibility.\nReadable.prototype.setEncoding = function (enc) {\n  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n  this._readableState.decoder = new StringDecoder(enc);\n  this._readableState.encoding = enc;\n  return this;\n};\n\n// Don't raise the hwm > 8MB\nvar MAX_HWM = 0x800000;\nfunction computeNewHighWaterMark(n) {\n  if (n >= MAX_HWM) {\n    n = MAX_HWM;\n  } else {\n    // Get the next highest power of 2 to prevent increasing hwm excessively in\n    // tiny amounts\n    n--;\n    n |= n >>> 1;\n    n |= n >>> 2;\n    n |= n >>> 4;\n    n |= n >>> 8;\n    n |= n >>> 16;\n    n++;\n  }\n  return n;\n}\n\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction howMuchToRead(n, state) {\n  if (n <= 0 || state.length === 0 && state.ended) return 0;\n  if (state.objectMode) return 1;\n  if (n !== n) {\n    // Only flow one buffer at a time\n    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n  }\n  // If we're asking for more than the current hwm, then raise the hwm.\n  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n  if (n <= state.length) return n;\n  // Don't have enough\n  if (!state.ended) {\n    state.needReadable = true;\n    return 0;\n  }\n  return state.length;\n}\n\n// you can override either this method, or the async _read(n) below.\nReadable.prototype.read = function (n) {\n  debug('read', n);\n  n = parseInt(n, 10);\n  var state = this._readableState;\n  var nOrig = n;\n\n  if (n !== 0) state.emittedReadable = false;\n\n  // if we're doing read(0) to trigger a readable event, but we\n  // already have a bunch of data in the buffer, then just trigger\n  // the 'readable' event and move on.\n  if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {\n    debug('read: emitReadable', state.length, state.ended);\n    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n    return null;\n  }\n\n  n = howMuchToRead(n, state);\n\n  // if we've ended, and we're now clear, then finish it up.\n  if (n === 0 && state.ended) {\n    if (state.length === 0) endReadable(this);\n    return null;\n  }\n\n  // All the actual chunk generation logic needs to be\n  // *below* the call to _read.  The reason is that in certain\n  // synthetic stream cases, such as passthrough streams, _read\n  // may be a completely synchronous operation which may change\n  // the state of the read buffer, providing enough data when\n  // before there was *not* enough.\n  //\n  // So, the steps are:\n  // 1. Figure out what the state of things will be after we do\n  // a read from the buffer.\n  //\n  // 2. If that resulting state will trigger a _read, then call _read.\n  // Note that this may be asynchronous, or synchronous.  Yes, it is\n  // deeply ugly to write APIs this way, but that still doesn't mean\n  // that the Readable class should behave improperly, as streams are\n  // designed to be sync/async agnostic.\n  // Take note if the _read call is sync or async (ie, if the read call\n  // has returned yet), so that we know whether or not it's safe to emit\n  // 'readable' etc.\n  //\n  // 3. Actually pull the requested chunks out of the buffer and return.\n\n  // if we need a readable event, then we need to do some reading.\n  var doRead = state.needReadable;\n  debug('need readable', doRead);\n\n  // if we currently have less than the highWaterMark, then also read some\n  if (state.length === 0 || state.length - n < state.highWaterMark) {\n    doRead = true;\n    debug('length less than watermark', doRead);\n  }\n\n  // however, if we've ended, then there's no point, and if we're already\n  // reading, then it's unnecessary.\n  if (state.ended || state.reading) {\n    doRead = false;\n    debug('reading or ended', doRead);\n  } else if (doRead) {\n    debug('do read');\n    state.reading = true;\n    state.sync = true;\n    // if the length is currently zero, then we *need* a readable event.\n    if (state.length === 0) state.needReadable = true;\n    // call internal read method\n    this._read(state.highWaterMark);\n    state.sync = false;\n    // If _read pushed data synchronously, then `reading` will be false,\n    // and we need to re-evaluate how much data we can return to the user.\n    if (!state.reading) n = howMuchToRead(nOrig, state);\n  }\n\n  var ret;\n  if (n > 0) ret = fromList(n, state);else ret = null;\n\n  if (ret === null) {\n    state.needReadable = true;\n    n = 0;\n  } else {\n    state.length -= n;\n  }\n\n  if (state.length === 0) {\n    // If we have nothing in the buffer, then we want to know\n    // as soon as we *do* get something into the buffer.\n    if (!state.ended) state.needReadable = true;\n\n    // If we tried to read() past the EOF, then emit end on the next tick.\n    if (nOrig !== n && state.ended) endReadable(this);\n  }\n\n  if (ret !== null) this.emit('data', ret);\n\n  return ret;\n};\n\nfunction chunkInvalid(state, chunk) {\n  var er = null;\n  if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) {\n    er = new TypeError('Invalid non-string/buffer chunk');\n  }\n  return er;\n}\n\nfunction onEofChunk(stream, state) {\n  if (state.ended) return;\n  if (state.decoder) {\n    var chunk = state.decoder.end();\n    if (chunk && chunk.length) {\n      state.buffer.push(chunk);\n      state.length += state.objectMode ? 1 : chunk.length;\n    }\n  }\n  state.ended = true;\n\n  // emit 'readable' now to make sure it gets picked up.\n  emitReadable(stream);\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow.  This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n  var state = stream._readableState;\n  state.needReadable = false;\n  if (!state.emittedReadable) {\n    debug('emitReadable', state.flowing);\n    state.emittedReadable = true;\n    if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream);\n  }\n}\n\nfunction emitReadable_(stream) {\n  debug('emit readable');\n  stream.emit('readable');\n  flow(stream);\n}\n\n// at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data.  that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n  if (!state.readingMore) {\n    state.readingMore = true;\n    processNextTick(maybeReadMore_, stream, state);\n  }\n}\n\nfunction maybeReadMore_(stream, state) {\n  var len = state.length;\n  while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {\n    debug('maybeReadMore read 0');\n    stream.read(0);\n    if (len === state.length)\n      // didn't get any data, stop spinning.\n      break;else len = state.length;\n  }\n  state.readingMore = false;\n}\n\n// abstract method.  to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function (n) {\n  this.emit('error', new Error('_read() is not implemented'));\n};\n\nReadable.prototype.pipe = function (dest, pipeOpts) {\n  var src = this;\n  var state = this._readableState;\n\n  switch (state.pipesCount) {\n    case 0:\n      state.pipes = dest;\n      break;\n    case 1:\n      state.pipes = [state.pipes, dest];\n      break;\n    default:\n      state.pipes.push(dest);\n      break;\n  }\n  state.pipesCount += 1;\n  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n\n  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;\n\n  var endFn = doEnd ? onend : cleanup;\n  if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn);\n\n  dest.on('unpipe', onunpipe);\n  function onunpipe(readable) {\n    debug('onunpipe');\n    if (readable === src) {\n      cleanup();\n    }\n  }\n\n  function onend() {\n    debug('onend');\n    dest.end();\n  }\n\n  // when the dest drains, it reduces the awaitDrain counter\n  // on the source.  This would be more elegant with a .once()\n  // handler in flow(), but adding and removing repeatedly is\n  // too slow.\n  var ondrain = pipeOnDrain(src);\n  dest.on('drain', ondrain);\n\n  var cleanedUp = false;\n  function cleanup() {\n    debug('cleanup');\n    // cleanup event handlers once the pipe is broken\n    dest.removeListener('close', onclose);\n    dest.removeListener('finish', onfinish);\n    dest.removeListener('drain', ondrain);\n    dest.removeListener('error', onerror);\n    dest.removeListener('unpipe', onunpipe);\n    src.removeListener('end', onend);\n    src.removeListener('end', cleanup);\n    src.removeListener('data', ondata);\n\n    cleanedUp = true;\n\n    // if the reader is waiting for a drain event from this\n    // specific writer, then it would cause it to never start\n    // flowing again.\n    // So, if this is awaiting a drain, then we just call it now.\n    // If we don't know, then assume that we are waiting for one.\n    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n  }\n\n  // If the user pushes more data while we're writing to dest then we'll end up\n  // in ondata again. However, we only want to increase awaitDrain once because\n  // dest will only emit one 'drain' event for the multiple writes.\n  // => Introduce a guard on increasing awaitDrain.\n  var increasedAwaitDrain = false;\n  src.on('data', ondata);\n  function ondata(chunk) {\n    debug('ondata');\n    increasedAwaitDrain = false;\n    var ret = dest.write(chunk);\n    if (false === ret && !increasedAwaitDrain) {\n      // If the user unpiped during `dest.write()`, it is possible\n      // to get stuck in a permanently paused state if that write\n      // also returned false.\n      // => Check whether `dest` is still a piping destination.\n      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n        debug('false write response, pause', src._readableState.awaitDrain);\n        src._readableState.awaitDrain++;\n        increasedAwaitDrain = true;\n      }\n      src.pause();\n    }\n  }\n\n  // if the dest has an error, then stop piping into it.\n  // however, don't suppress the throwing behavior for this.\n  function onerror(er) {\n    debug('onerror', er);\n    unpipe();\n    dest.removeListener('error', onerror);\n    if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);\n  }\n\n  // Make sure our error handler is attached before userland ones.\n  prependListener(dest, 'error', onerror);\n\n  // Both close and finish should trigger unpipe, but only once.\n  function onclose() {\n    dest.removeListener('finish', onfinish);\n    unpipe();\n  }\n  dest.once('close', onclose);\n  function onfinish() {\n    debug('onfinish');\n    dest.removeListener('close', onclose);\n    unpipe();\n  }\n  dest.once('finish', onfinish);\n\n  function unpipe() {\n    debug('unpipe');\n    src.unpipe(dest);\n  }\n\n  // tell the dest that it's being piped to\n  dest.emit('pipe', src);\n\n  // start the flow if it hasn't been started already.\n  if (!state.flowing) {\n    debug('pipe resume');\n    src.resume();\n  }\n\n  return dest;\n};\n\nfunction pipeOnDrain(src) {\n  return function () {\n    var state = src._readableState;\n    debug('pipeOnDrain', state.awaitDrain);\n    if (state.awaitDrain) state.awaitDrain--;\n    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {\n      state.flowing = true;\n      flow(src);\n    }\n  };\n}\n\nReadable.prototype.unpipe = function (dest) {\n  var state = this._readableState;\n\n  // if we're not piping anywhere, then do nothing.\n  if (state.pipesCount === 0) return this;\n\n  // just one destination.  most common case.\n  if (state.pipesCount === 1) {\n    // passed in one, but it's not the right one.\n    if (dest && dest !== state.pipes) return this;\n\n    if (!dest) dest = state.pipes;\n\n    // got a match.\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n    if (dest) dest.emit('unpipe', this);\n    return this;\n  }\n\n  // slow case. multiple pipe destinations.\n\n  if (!dest) {\n    // remove all.\n    var dests = state.pipes;\n    var len = state.pipesCount;\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n\n    for (var i = 0; i < len; i++) {\n      dests[i].emit('unpipe', this);\n    }return this;\n  }\n\n  // try to find the right one.\n  var index = indexOf(state.pipes, dest);\n  if (index === -1) return this;\n\n  state.pipes.splice(index, 1);\n  state.pipesCount -= 1;\n  if (state.pipesCount === 1) state.pipes = state.pipes[0];\n\n  dest.emit('unpipe', this);\n\n  return this;\n};\n\n// set up data events if they are asked for\n// Ensure readable listeners eventually get something\nReadable.prototype.on = function (ev, fn) {\n  var res = Stream.prototype.on.call(this, ev, fn);\n\n  if (ev === 'data') {\n    // Start flowing on next tick if stream isn't explicitly paused\n    if (this._readableState.flowing !== false) this.resume();\n  } else if (ev === 'readable') {\n    var state = this._readableState;\n    if (!state.endEmitted && !state.readableListening) {\n      state.readableListening = state.needReadable = true;\n      state.emittedReadable = false;\n      if (!state.reading) {\n        processNextTick(nReadingNextTick, this);\n      } else if (state.length) {\n        emitReadable(this, state);\n      }\n    }\n  }\n\n  return res;\n};\nReadable.prototype.addListener = Readable.prototype.on;\n\nfunction nReadingNextTick(self) {\n  debug('readable nexttick read 0');\n  self.read(0);\n}\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function () {\n  var state = this._readableState;\n  if (!state.flowing) {\n    debug('resume');\n    state.flowing = true;\n    resume(this, state);\n  }\n  return this;\n};\n\nfunction resume(stream, state) {\n  if (!state.resumeScheduled) {\n    state.resumeScheduled = true;\n    processNextTick(resume_, stream, state);\n  }\n}\n\nfunction resume_(stream, state) {\n  if (!state.reading) {\n    debug('resume read 0');\n    stream.read(0);\n  }\n\n  state.resumeScheduled = false;\n  state.awaitDrain = 0;\n  stream.emit('resume');\n  flow(stream);\n  if (state.flowing && !state.reading) stream.read(0);\n}\n\nReadable.prototype.pause = function () {\n  debug('call pause flowing=%j', this._readableState.flowing);\n  if (false !== this._readableState.flowing) {\n    debug('pause');\n    this._readableState.flowing = false;\n    this.emit('pause');\n  }\n  return this;\n};\n\nfunction flow(stream) {\n  var state = stream._readableState;\n  debug('flow', state.flowing);\n  while (state.flowing && stream.read() !== null) {}\n}\n\n// wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function (stream) {\n  var state = this._readableState;\n  var paused = false;\n\n  var self = this;\n  stream.on('end', function () {\n    debug('wrapped end');\n    if (state.decoder && !state.ended) {\n      var chunk = state.decoder.end();\n      if (chunk && chunk.length) self.push(chunk);\n    }\n\n    self.push(null);\n  });\n\n  stream.on('data', function (chunk) {\n    debug('wrapped data');\n    if (state.decoder) chunk = state.decoder.write(chunk);\n\n    // don't skip over falsy values in objectMode\n    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n\n    var ret = self.push(chunk);\n    if (!ret) {\n      paused = true;\n      stream.pause();\n    }\n  });\n\n  // proxy all the other methods.\n  // important when wrapping filters and duplexes.\n  for (var i in stream) {\n    if (this[i] === undefined && typeof stream[i] === 'function') {\n      this[i] = function (method) {\n        return function () {\n          return stream[method].apply(stream, arguments);\n        };\n      }(i);\n    }\n  }\n\n  // proxy certain important events.\n  var events = ['error', 'close', 'destroy', 'pause', 'resume'];\n  forEach(events, function (ev) {\n    stream.on(ev, self.emit.bind(self, ev));\n  });\n\n  // when we try to consume some more bytes, simply unpause the\n  // underlying stream.\n  self._read = function (n) {\n    debug('wrapped _read', n);\n    if (paused) {\n      paused = false;\n      stream.resume();\n    }\n  };\n\n  return self;\n};\n\n// exposed for testing purposes only.\nReadable._fromList = fromList;\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromList(n, state) {\n  // nothing buffered\n  if (state.length === 0) return null;\n\n  var ret;\n  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n    // read it all, truncate the list\n    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);\n    state.buffer.clear();\n  } else {\n    // read part of list\n    ret = fromListPartial(n, state.buffer, state.decoder);\n  }\n\n  return ret;\n}\n\n// Extracts only enough buffered data to satisfy the amount requested.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromListPartial(n, list, hasStrings) {\n  var ret;\n  if (n < list.head.data.length) {\n    // slice is the same for buffers and strings\n    ret = list.head.data.slice(0, n);\n    list.head.data = list.head.data.slice(n);\n  } else if (n === list.head.data.length) {\n    // first chunk is a perfect match\n    ret = list.shift();\n  } else {\n    // result spans more than one buffer\n    ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);\n  }\n  return ret;\n}\n\n// Copies a specified amount of characters from the list of buffered data\n// chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBufferString(n, list) {\n  var p = list.head;\n  var c = 1;\n  var ret = p.data;\n  n -= ret.length;\n  while (p = p.next) {\n    var str = p.data;\n    var nb = n > str.length ? str.length : n;\n    if (nb === str.length) ret += str;else ret += str.slice(0, n);\n    n -= nb;\n    if (n === 0) {\n      if (nb === str.length) {\n        ++c;\n        if (p.next) list.head = p.next;else list.head = list.tail = null;\n      } else {\n        list.head = p;\n        p.data = str.slice(nb);\n      }\n      break;\n    }\n    ++c;\n  }\n  list.length -= c;\n  return ret;\n}\n\n// Copies a specified amount of bytes from the list of buffered data chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBuffer(n, list) {\n  var ret = bufferShim.allocUnsafe(n);\n  var p = list.head;\n  var c = 1;\n  p.data.copy(ret);\n  n -= p.data.length;\n  while (p = p.next) {\n    var buf = p.data;\n    var nb = n > buf.length ? buf.length : n;\n    buf.copy(ret, ret.length - n, 0, nb);\n    n -= nb;\n    if (n === 0) {\n      if (nb === buf.length) {\n        ++c;\n        if (p.next) list.head = p.next;else list.head = list.tail = null;\n      } else {\n        list.head = p;\n        p.data = buf.slice(nb);\n      }\n      break;\n    }\n    ++c;\n  }\n  list.length -= c;\n  return ret;\n}\n\nfunction endReadable(stream) {\n  var state = stream._readableState;\n\n  // If we get here before consuming all the bytes, then that is a\n  // bug in node.  Should never happen.\n  if (state.length > 0) throw new Error('\"endReadable()\" called on non-empty stream');\n\n  if (!state.endEmitted) {\n    state.ended = true;\n    processNextTick(endReadableNT, state, stream);\n  }\n}\n\nfunction endReadableNT(state, stream) {\n  // Check that we didn't get one last unshift.\n  if (!state.endEmitted && state.length === 0) {\n    state.endEmitted = true;\n    stream.readable = false;\n    stream.emit('end');\n  }\n}\n\nfunction forEach(xs, f) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    f(xs[i], i);\n  }\n}\n\nfunction indexOf(xs, x) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    if (xs[i] === x) return i;\n  }\n  return -1;\n}\n}).call(this,require('_process'))\n},{\"./_stream_duplex\":140,\"./internal/streams/BufferList\":145,\"_process\":138,\"buffer\":77,\"buffer-shims\":76,\"core-util-is\":78,\"events\":79,\"inherits\":81,\"isarray\":83,\"process-nextick-args\":137,\"string_decoder/\":152,\"util\":75}],143:[function(require,module,exports){\n// a transform stream is a readable/writable stream where you do\n// something with the data.  Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored.  (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation.  For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes.  When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up.  When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer.  When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks.  If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk.  However,\n// a pathological inflate type of transform can cause excessive buffering\n// here.  For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output.  In this case, you could write a very small\n// amount of input, and end up with a very large amount of output.  In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform.  A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n\n'use strict';\n\nmodule.exports = Transform;\n\nvar Duplex = require('./_stream_duplex');\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nutil.inherits(Transform, Duplex);\n\nfunction TransformState(stream) {\n  this.afterTransform = function (er, data) {\n    return afterTransform(stream, er, data);\n  };\n\n  this.needTransform = false;\n  this.transforming = false;\n  this.writecb = null;\n  this.writechunk = null;\n  this.writeencoding = null;\n}\n\nfunction afterTransform(stream, er, data) {\n  var ts = stream._transformState;\n  ts.transforming = false;\n\n  var cb = ts.writecb;\n\n  if (!cb) return stream.emit('error', new Error('no writecb in Transform class'));\n\n  ts.writechunk = null;\n  ts.writecb = null;\n\n  if (data !== null && data !== undefined) stream.push(data);\n\n  cb(er);\n\n  var rs = stream._readableState;\n  rs.reading = false;\n  if (rs.needReadable || rs.length < rs.highWaterMark) {\n    stream._read(rs.highWaterMark);\n  }\n}\n\nfunction Transform(options) {\n  if (!(this instanceof Transform)) return new Transform(options);\n\n  Duplex.call(this, options);\n\n  this._transformState = new TransformState(this);\n\n  var stream = this;\n\n  // start out asking for a readable event once data is transformed.\n  this._readableState.needReadable = true;\n\n  // we have implemented the _read method, and done the other things\n  // that Readable wants before the first _read call, so unset the\n  // sync guard flag.\n  this._readableState.sync = false;\n\n  if (options) {\n    if (typeof options.transform === 'function') this._transform = options.transform;\n\n    if (typeof options.flush === 'function') this._flush = options.flush;\n  }\n\n  // When the writable side finishes, then flush out anything remaining.\n  this.once('prefinish', function () {\n    if (typeof this._flush === 'function') this._flush(function (er, data) {\n      done(stream, er, data);\n    });else done(stream);\n  });\n}\n\nTransform.prototype.push = function (chunk, encoding) {\n  this._transformState.needTransform = false;\n  return Duplex.prototype.push.call(this, chunk, encoding);\n};\n\n// This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side.  You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk.  If you pass\n// an error, then that'll put the hurt on the whole operation.  If you\n// never call cb(), then you'll never get another chunk.\nTransform.prototype._transform = function (chunk, encoding, cb) {\n  throw new Error('_transform() is not implemented');\n};\n\nTransform.prototype._write = function (chunk, encoding, cb) {\n  var ts = this._transformState;\n  ts.writecb = cb;\n  ts.writechunk = chunk;\n  ts.writeencoding = encoding;\n  if (!ts.transforming) {\n    var rs = this._readableState;\n    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n  }\n};\n\n// Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\nTransform.prototype._read = function (n) {\n  var ts = this._transformState;\n\n  if (ts.writechunk !== null && ts.writecb && !ts.transforming) {\n    ts.transforming = true;\n    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n  } else {\n    // mark that we need a transform, so that any data that comes in\n    // will get processed, now that we've asked for it.\n    ts.needTransform = true;\n  }\n};\n\nfunction done(stream, er, data) {\n  if (er) return stream.emit('error', er);\n\n  if (data !== null && data !== undefined) stream.push(data);\n\n  // if there's nothing in the write buffer, then that means\n  // that nothing more will ever be provided\n  var ws = stream._writableState;\n  var ts = stream._transformState;\n\n  if (ws.length) throw new Error('Calling transform done when ws.length != 0');\n\n  if (ts.transforming) throw new Error('Calling transform done when still transforming');\n\n  return stream.push(null);\n}\n},{\"./_stream_duplex\":140,\"core-util-is\":78,\"inherits\":81}],144:[function(require,module,exports){\n(function (process){\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n\n'use strict';\n\nmodule.exports = Writable;\n\n/*<replacement>*/\nvar processNextTick = require('process-nextick-args');\n/*</replacement>*/\n\n/*<replacement>*/\nvar asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick;\n/*</replacement>*/\n\n/*<replacement>*/\nvar Duplex;\n/*</replacement>*/\n\nWritable.WritableState = WritableState;\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\n/*<replacement>*/\nvar internalUtil = {\n  deprecate: require('util-deprecate')\n};\n/*</replacement>*/\n\n/*<replacement>*/\nvar Stream;\n(function () {\n  try {\n    Stream = require('st' + 'ream');\n  } catch (_) {} finally {\n    if (!Stream) Stream = require('events').EventEmitter;\n  }\n})();\n/*</replacement>*/\n\nvar Buffer = require('buffer').Buffer;\n/*<replacement>*/\nvar bufferShim = require('buffer-shims');\n/*</replacement>*/\n\nutil.inherits(Writable, Stream);\n\nfunction nop() {}\n\nfunction WriteReq(chunk, encoding, cb) {\n  this.chunk = chunk;\n  this.encoding = encoding;\n  this.callback = cb;\n  this.next = null;\n}\n\nfunction WritableState(options, stream) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  options = options || {};\n\n  // object stream flag to indicate whether or not this stream\n  // contains buffers or objects.\n  this.objectMode = !!options.objectMode;\n\n  if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode;\n\n  // the point at which write() starts returning false\n  // Note: 0 is a valid value, means that we always return false if\n  // the entire buffer is not flushed immediately on write()\n  var hwm = options.highWaterMark;\n  var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n  this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;\n\n  // cast to ints.\n  this.highWaterMark = ~~this.highWaterMark;\n\n  // drain event flag.\n  this.needDrain = false;\n  // at the start of calling end()\n  this.ending = false;\n  // when end() has been called, and returned\n  this.ended = false;\n  // when 'finish' is emitted\n  this.finished = false;\n\n  // should we decode strings into buffers before passing to _write?\n  // this is here so that some node-core streams can optimize string\n  // handling at a lower level.\n  var noDecode = options.decodeStrings === false;\n  this.decodeStrings = !noDecode;\n\n  // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n  this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n  // not an actual buffer we keep track of, but a measurement\n  // of how much we're waiting to get pushed to some underlying\n  // socket or file.\n  this.length = 0;\n\n  // a flag to see when we're in the middle of a write.\n  this.writing = false;\n\n  // when true all writes will be buffered until .uncork() call\n  this.corked = 0;\n\n  // a flag to be able to tell if the onwrite cb is called immediately,\n  // or on a later tick.  We set this to true at first, because any\n  // actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first write call.\n  this.sync = true;\n\n  // a flag to know if we're processing previously buffered items, which\n  // may call the _write() callback in the same tick, so that we don't\n  // end up in an overlapped onwrite situation.\n  this.bufferProcessing = false;\n\n  // the callback that's passed to _write(chunk,cb)\n  this.onwrite = function (er) {\n    onwrite(stream, er);\n  };\n\n  // the callback that the user supplies to write(chunk,encoding,cb)\n  this.writecb = null;\n\n  // the amount that is being written when _write is called.\n  this.writelen = 0;\n\n  this.bufferedRequest = null;\n  this.lastBufferedRequest = null;\n\n  // number of pending user-supplied write callbacks\n  // this must be 0 before 'finish' can be emitted\n  this.pendingcb = 0;\n\n  // emit prefinish if the only thing we're waiting for is _write cbs\n  // This is relevant for synchronous Transform streams\n  this.prefinished = false;\n\n  // True if the error was already emitted and should not be thrown again\n  this.errorEmitted = false;\n\n  // count buffered requests\n  this.bufferedRequestCount = 0;\n\n  // allocate the first CorkedRequest, there is always\n  // one allocated and free to use, and we maintain at most two\n  this.corkedRequestsFree = new CorkedRequest(this);\n}\n\nWritableState.prototype.getBuffer = function getBuffer() {\n  var current = this.bufferedRequest;\n  var out = [];\n  while (current) {\n    out.push(current);\n    current = current.next;\n  }\n  return out;\n};\n\n(function () {\n  try {\n    Object.defineProperty(WritableState.prototype, 'buffer', {\n      get: internalUtil.deprecate(function () {\n        return this.getBuffer();\n      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.')\n    });\n  } catch (_) {}\n})();\n\n// Test _writableState for inheritance to account for Duplex streams,\n// whose prototype chain only points to Readable.\nvar realHasInstance;\nif (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {\n  realHasInstance = Function.prototype[Symbol.hasInstance];\n  Object.defineProperty(Writable, Symbol.hasInstance, {\n    value: function (object) {\n      if (realHasInstance.call(this, object)) return true;\n\n      return object && object._writableState instanceof WritableState;\n    }\n  });\n} else {\n  realHasInstance = function (object) {\n    return object instanceof this;\n  };\n}\n\nfunction Writable(options) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  // Writable ctor is applied to Duplexes, too.\n  // `realHasInstance` is necessary because using plain `instanceof`\n  // would return false, as no `_writableState` property is attached.\n\n  // Trying to use the custom `instanceof` for Writable here will also break the\n  // Node.js LazyTransform implementation, which has a non-trivial getter for\n  // `_writableState` that would lead to infinite recursion.\n  if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {\n    return new Writable(options);\n  }\n\n  this._writableState = new WritableState(options, this);\n\n  // legacy.\n  this.writable = true;\n\n  if (options) {\n    if (typeof options.write === 'function') this._write = options.write;\n\n    if (typeof options.writev === 'function') this._writev = options.writev;\n  }\n\n  Stream.call(this);\n}\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function () {\n  this.emit('error', new Error('Cannot pipe, not readable'));\n};\n\nfunction writeAfterEnd(stream, cb) {\n  var er = new Error('write after end');\n  // TODO: defer error events consistently everywhere, not just the cb\n  stream.emit('error', er);\n  processNextTick(cb, er);\n}\n\n// Checks that a user-supplied chunk is valid, especially for the particular\n// mode the stream is in. Currently this means that `null` is never accepted\n// and undefined/non-string values are only allowed in object mode.\nfunction validChunk(stream, state, chunk, cb) {\n  var valid = true;\n  var er = false;\n\n  if (chunk === null) {\n    er = new TypeError('May not write null values to stream');\n  } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n    er = new TypeError('Invalid non-string/buffer chunk');\n  }\n  if (er) {\n    stream.emit('error', er);\n    processNextTick(cb, er);\n    valid = false;\n  }\n  return valid;\n}\n\nWritable.prototype.write = function (chunk, encoding, cb) {\n  var state = this._writableState;\n  var ret = false;\n  var isBuf = Buffer.isBuffer(chunk);\n\n  if (typeof encoding === 'function') {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n\n  if (typeof cb !== 'function') cb = nop;\n\n  if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {\n    state.pendingcb++;\n    ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);\n  }\n\n  return ret;\n};\n\nWritable.prototype.cork = function () {\n  var state = this._writableState;\n\n  state.corked++;\n};\n\nWritable.prototype.uncork = function () {\n  var state = this._writableState;\n\n  if (state.corked) {\n    state.corked--;\n\n    if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n  }\n};\n\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n  // node::ParseEncoding() requires lower case.\n  if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);\n  this._writableState.defaultEncoding = encoding;\n  return this;\n};\n\nfunction decodeChunk(state, chunk, encoding) {\n  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n    chunk = bufferShim.from(chunk, encoding);\n  }\n  return chunk;\n}\n\n// if we're already writing something, then just put this\n// in the queue, and wait our turn.  Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {\n  if (!isBuf) {\n    chunk = decodeChunk(state, chunk, encoding);\n    if (Buffer.isBuffer(chunk)) encoding = 'buffer';\n  }\n  var len = state.objectMode ? 1 : chunk.length;\n\n  state.length += len;\n\n  var ret = state.length < state.highWaterMark;\n  // we must ensure that previous needDrain will not be reset to false.\n  if (!ret) state.needDrain = true;\n\n  if (state.writing || state.corked) {\n    var last = state.lastBufferedRequest;\n    state.lastBufferedRequest = new WriteReq(chunk, encoding, cb);\n    if (last) {\n      last.next = state.lastBufferedRequest;\n    } else {\n      state.bufferedRequest = state.lastBufferedRequest;\n    }\n    state.bufferedRequestCount += 1;\n  } else {\n    doWrite(stream, state, false, len, chunk, encoding, cb);\n  }\n\n  return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n  state.writelen = len;\n  state.writecb = cb;\n  state.writing = true;\n  state.sync = true;\n  if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n  state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n  --state.pendingcb;\n  if (sync) processNextTick(cb, er);else cb(er);\n\n  stream._writableState.errorEmitted = true;\n  stream.emit('error', er);\n}\n\nfunction onwriteStateUpdate(state) {\n  state.writing = false;\n  state.writecb = null;\n  state.length -= state.writelen;\n  state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n  var state = stream._writableState;\n  var sync = state.sync;\n  var cb = state.writecb;\n\n  onwriteStateUpdate(state);\n\n  if (er) onwriteError(stream, state, sync, er, cb);else {\n    // Check if we're actually ready to finish, but don't emit yet\n    var finished = needFinish(state);\n\n    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n      clearBuffer(stream, state);\n    }\n\n    if (sync) {\n      /*<replacement>*/\n      asyncWrite(afterWrite, stream, state, finished, cb);\n      /*</replacement>*/\n    } else {\n      afterWrite(stream, state, finished, cb);\n    }\n  }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n  if (!finished) onwriteDrain(stream, state);\n  state.pendingcb--;\n  cb();\n  finishMaybe(stream, state);\n}\n\n// Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\nfunction onwriteDrain(stream, state) {\n  if (state.length === 0 && state.needDrain) {\n    state.needDrain = false;\n    stream.emit('drain');\n  }\n}\n\n// if there's something in the buffer waiting, then process it\nfunction clearBuffer(stream, state) {\n  state.bufferProcessing = true;\n  var entry = state.bufferedRequest;\n\n  if (stream._writev && entry && entry.next) {\n    // Fast case, write everything using _writev()\n    var l = state.bufferedRequestCount;\n    var buffer = new Array(l);\n    var holder = state.corkedRequestsFree;\n    holder.entry = entry;\n\n    var count = 0;\n    while (entry) {\n      buffer[count] = entry;\n      entry = entry.next;\n      count += 1;\n    }\n\n    doWrite(stream, state, true, state.length, buffer, '', holder.finish);\n\n    // doWrite is almost always async, defer these to save a bit of time\n    // as the hot path ends with doWrite\n    state.pendingcb++;\n    state.lastBufferedRequest = null;\n    if (holder.next) {\n      state.corkedRequestsFree = holder.next;\n      holder.next = null;\n    } else {\n      state.corkedRequestsFree = new CorkedRequest(state);\n    }\n  } else {\n    // Slow case, write chunks one-by-one\n    while (entry) {\n      var chunk = entry.chunk;\n      var encoding = entry.encoding;\n      var cb = entry.callback;\n      var len = state.objectMode ? 1 : chunk.length;\n\n      doWrite(stream, state, false, len, chunk, encoding, cb);\n      entry = entry.next;\n      // if we didn't call the onwrite immediately, then\n      // it means that we need to wait until it does.\n      // also, that means that the chunk and cb are currently\n      // being processed, so move the buffer counter past them.\n      if (state.writing) {\n        break;\n      }\n    }\n\n    if (entry === null) state.lastBufferedRequest = null;\n  }\n\n  state.bufferedRequestCount = 0;\n  state.bufferedRequest = entry;\n  state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function (chunk, encoding, cb) {\n  cb(new Error('_write() is not implemented'));\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function (chunk, encoding, cb) {\n  var state = this._writableState;\n\n  if (typeof chunk === 'function') {\n    cb = chunk;\n    chunk = null;\n    encoding = null;\n  } else if (typeof encoding === 'function') {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);\n\n  // .end() fully uncorks\n  if (state.corked) {\n    state.corked = 1;\n    this.uncork();\n  }\n\n  // ignore unnecessary end() calls.\n  if (!state.ending && !state.finished) endWritable(this, state, cb);\n};\n\nfunction needFinish(state) {\n  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\n\nfunction prefinish(stream, state) {\n  if (!state.prefinished) {\n    state.prefinished = true;\n    stream.emit('prefinish');\n  }\n}\n\nfunction finishMaybe(stream, state) {\n  var need = needFinish(state);\n  if (need) {\n    if (state.pendingcb === 0) {\n      prefinish(stream, state);\n      state.finished = true;\n      stream.emit('finish');\n    } else {\n      prefinish(stream, state);\n    }\n  }\n  return need;\n}\n\nfunction endWritable(stream, state, cb) {\n  state.ending = true;\n  finishMaybe(stream, state);\n  if (cb) {\n    if (state.finished) processNextTick(cb);else stream.once('finish', cb);\n  }\n  state.ended = true;\n  stream.writable = false;\n}\n\n// It seems a linked list but it is not\n// there will be only 2 of these for each stream\nfunction CorkedRequest(state) {\n  var _this = this;\n\n  this.next = null;\n  this.entry = null;\n  this.finish = function (err) {\n    var entry = _this.entry;\n    _this.entry = null;\n    while (entry) {\n      var cb = entry.callback;\n      state.pendingcb--;\n      cb(err);\n      entry = entry.next;\n    }\n    if (state.corkedRequestsFree) {\n      state.corkedRequestsFree.next = _this;\n    } else {\n      state.corkedRequestsFree = _this;\n    }\n  };\n}\n}).call(this,require('_process'))\n},{\"./_stream_duplex\":140,\"_process\":138,\"buffer\":77,\"buffer-shims\":76,\"core-util-is\":78,\"events\":79,\"inherits\":81,\"process-nextick-args\":137,\"util-deprecate\":154}],145:[function(require,module,exports){\n'use strict';\n\nvar Buffer = require('buffer').Buffer;\n/*<replacement>*/\nvar bufferShim = require('buffer-shims');\n/*</replacement>*/\n\nmodule.exports = BufferList;\n\nfunction BufferList() {\n  this.head = null;\n  this.tail = null;\n  this.length = 0;\n}\n\nBufferList.prototype.push = function (v) {\n  var entry = { data: v, next: null };\n  if (this.length > 0) this.tail.next = entry;else this.head = entry;\n  this.tail = entry;\n  ++this.length;\n};\n\nBufferList.prototype.unshift = function (v) {\n  var entry = { data: v, next: this.head };\n  if (this.length === 0) this.tail = entry;\n  this.head = entry;\n  ++this.length;\n};\n\nBufferList.prototype.shift = function () {\n  if (this.length === 0) return;\n  var ret = this.head.data;\n  if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n  --this.length;\n  return ret;\n};\n\nBufferList.prototype.clear = function () {\n  this.head = this.tail = null;\n  this.length = 0;\n};\n\nBufferList.prototype.join = function (s) {\n  if (this.length === 0) return '';\n  var p = this.head;\n  var ret = '' + p.data;\n  while (p = p.next) {\n    ret += s + p.data;\n  }return ret;\n};\n\nBufferList.prototype.concat = function (n) {\n  if (this.length === 0) return bufferShim.alloc(0);\n  if (this.length === 1) return this.head.data;\n  var ret = bufferShim.allocUnsafe(n >>> 0);\n  var p = this.head;\n  var i = 0;\n  while (p) {\n    p.data.copy(ret, i);\n    i += p.data.length;\n    p = p.next;\n  }\n  return ret;\n};\n},{\"buffer\":77,\"buffer-shims\":76}],146:[function(require,module,exports){\nmodule.exports = require(\"./lib/_stream_passthrough.js\")\n\n},{\"./lib/_stream_passthrough.js\":141}],147:[function(require,module,exports){\n(function (process){\nvar Stream = (function (){\n  try {\n    return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify\n  } catch(_){}\n}());\nexports = module.exports = require('./lib/_stream_readable.js');\nexports.Stream = Stream || exports;\nexports.Readable = exports;\nexports.Writable = require('./lib/_stream_writable.js');\nexports.Duplex = require('./lib/_stream_duplex.js');\nexports.Transform = require('./lib/_stream_transform.js');\nexports.PassThrough = require('./lib/_stream_passthrough.js');\n\nif (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) {\n  module.exports = Stream;\n}\n\n}).call(this,require('_process'))\n},{\"./lib/_stream_duplex.js\":140,\"./lib/_stream_passthrough.js\":141,\"./lib/_stream_readable.js\":142,\"./lib/_stream_transform.js\":143,\"./lib/_stream_writable.js\":144,\"_process\":138}],148:[function(require,module,exports){\nmodule.exports = require(\"./lib/_stream_transform.js\")\n\n},{\"./lib/_stream_transform.js\":143}],149:[function(require,module,exports){\nmodule.exports = require(\"./lib/_stream_writable.js\")\n\n},{\"./lib/_stream_writable.js\":144}],150:[function(require,module,exports){\n(function (Buffer){\n;(function (sax) { // wrapper for non-node envs\n  sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }\n  sax.SAXParser = SAXParser\n  sax.SAXStream = SAXStream\n  sax.createStream = createStream\n\n  // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.\n  // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),\n  // since that's the earliest that a buffer overrun could occur.  This way, checks are\n  // as rare as required, but as often as necessary to ensure never crossing this bound.\n  // Furthermore, buffers are only tested at most once per write(), so passing a very\n  // large string into write() might have undesirable effects, but this is manageable by\n  // the caller, so it is assumed to be safe.  Thus, a call to write() may, in the extreme\n  // edge case, result in creating at most one complete copy of the string passed in.\n  // Set to Infinity to have unlimited buffers.\n  sax.MAX_BUFFER_LENGTH = 64 * 1024\n\n  var buffers = [\n    'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',\n    'procInstName', 'procInstBody', 'entity', 'attribName',\n    'attribValue', 'cdata', 'script'\n  ]\n\n  sax.EVENTS = [\n    'text',\n    'processinginstruction',\n    'sgmldeclaration',\n    'doctype',\n    'comment',\n    'attribute',\n    'opentag',\n    'closetag',\n    'opencdata',\n    'cdata',\n    'closecdata',\n    'error',\n    'end',\n    'ready',\n    'script',\n    'opennamespace',\n    'closenamespace'\n  ]\n\n  function SAXParser (strict, opt) {\n    if (!(this instanceof SAXParser)) {\n      return new SAXParser(strict, opt)\n    }\n\n    var parser = this\n    clearBuffers(parser)\n    parser.q = parser.c = ''\n    parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH\n    parser.opt = opt || {}\n    parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags\n    parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'\n    parser.tags = []\n    parser.closed = parser.closedRoot = parser.sawRoot = false\n    parser.tag = parser.error = null\n    parser.strict = !!strict\n    parser.noscript = !!(strict || parser.opt.noscript)\n    parser.state = S.BEGIN\n    parser.strictEntities = parser.opt.strictEntities\n    parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)\n    parser.attribList = []\n\n    // namespaces form a prototype chain.\n    // it always points at the current tag,\n    // which protos to its parent tag.\n    if (parser.opt.xmlns) {\n      parser.ns = Object.create(rootNS)\n    }\n\n    // mostly just for error reporting\n    parser.trackPosition = parser.opt.position !== false\n    if (parser.trackPosition) {\n      parser.position = parser.line = parser.column = 0\n    }\n    emit(parser, 'onready')\n  }\n\n  if (!Object.create) {\n    Object.create = function (o) {\n      function F () {}\n      F.prototype = o\n      var newf = new F()\n      return newf\n    }\n  }\n\n  if (!Object.keys) {\n    Object.keys = function (o) {\n      var a = []\n      for (var i in o) if (o.hasOwnProperty(i)) a.push(i)\n      return a\n    }\n  }\n\n  function checkBufferLength (parser) {\n    var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)\n    var maxActual = 0\n    for (var i = 0, l = buffers.length; i < l; i++) {\n      var len = parser[buffers[i]].length\n      if (len > maxAllowed) {\n        // Text/cdata nodes can get big, and since they're buffered,\n        // we can get here under normal conditions.\n        // Avoid issues by emitting the text node now,\n        // so at least it won't get any bigger.\n        switch (buffers[i]) {\n          case 'textNode':\n            closeText(parser)\n            break\n\n          case 'cdata':\n            emitNode(parser, 'oncdata', parser.cdata)\n            parser.cdata = ''\n            break\n\n          case 'script':\n            emitNode(parser, 'onscript', parser.script)\n            parser.script = ''\n            break\n\n          default:\n            error(parser, 'Max buffer length exceeded: ' + buffers[i])\n        }\n      }\n      maxActual = Math.max(maxActual, len)\n    }\n    // schedule the next check for the earliest possible buffer overrun.\n    var m = sax.MAX_BUFFER_LENGTH - maxActual\n    parser.bufferCheckPosition = m + parser.position\n  }\n\n  function clearBuffers (parser) {\n    for (var i = 0, l = buffers.length; i < l; i++) {\n      parser[buffers[i]] = ''\n    }\n  }\n\n  function flushBuffers (parser) {\n    closeText(parser)\n    if (parser.cdata !== '') {\n      emitNode(parser, 'oncdata', parser.cdata)\n      parser.cdata = ''\n    }\n    if (parser.script !== '') {\n      emitNode(parser, 'onscript', parser.script)\n      parser.script = ''\n    }\n  }\n\n  SAXParser.prototype = {\n    end: function () { end(this) },\n    write: write,\n    resume: function () { this.error = null; return this },\n    close: function () { return this.write(null) },\n    flush: function () { flushBuffers(this) }\n  }\n\n  var Stream\n  try {\n    Stream = require('stream').Stream\n  } catch (ex) {\n    Stream = function () {}\n  }\n\n  var streamWraps = sax.EVENTS.filter(function (ev) {\n    return ev !== 'error' && ev !== 'end'\n  })\n\n  function createStream (strict, opt) {\n    return new SAXStream(strict, opt)\n  }\n\n  function SAXStream (strict, opt) {\n    if (!(this instanceof SAXStream)) {\n      return new SAXStream(strict, opt)\n    }\n\n    Stream.apply(this)\n\n    this._parser = new SAXParser(strict, opt)\n    this.writable = true\n    this.readable = true\n\n    var me = this\n\n    this._parser.onend = function () {\n      me.emit('end')\n    }\n\n    this._parser.onerror = function (er) {\n      me.emit('error', er)\n\n      // if didn't throw, then means error was handled.\n      // go ahead and clear error, so we can write again.\n      me._parser.error = null\n    }\n\n    this._decoder = null\n\n    streamWraps.forEach(function (ev) {\n      Object.defineProperty(me, 'on' + ev, {\n        get: function () {\n          return me._parser['on' + ev]\n        },\n        set: function (h) {\n          if (!h) {\n            me.removeAllListeners(ev)\n            me._parser['on' + ev] = h\n            return h\n          }\n          me.on(ev, h)\n        },\n        enumerable: true,\n        configurable: false\n      })\n    })\n  }\n\n  SAXStream.prototype = Object.create(Stream.prototype, {\n    constructor: {\n      value: SAXStream\n    }\n  })\n\n  SAXStream.prototype.write = function (data) {\n    if (typeof Buffer === 'function' &&\n      typeof Buffer.isBuffer === 'function' &&\n      Buffer.isBuffer(data)) {\n      if (!this._decoder) {\n        var SD = require('string_decoder').StringDecoder\n        this._decoder = new SD('utf8')\n      }\n      data = this._decoder.write(data)\n    }\n\n    this._parser.write(data.toString())\n    this.emit('data', data)\n    return true\n  }\n\n  SAXStream.prototype.end = function (chunk) {\n    if (chunk && chunk.length) {\n      this.write(chunk)\n    }\n    this._parser.end()\n    return true\n  }\n\n  SAXStream.prototype.on = function (ev, handler) {\n    var me = this\n    if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {\n      me._parser['on' + ev] = function () {\n        var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)\n        args.splice(0, 0, ev)\n        me.emit.apply(me, args)\n      }\n    }\n\n    return Stream.prototype.on.call(me, ev, handler)\n  }\n\n  // character classes and tokens\n  var whitespace = '\\r\\n\\t '\n\n  // this really needs to be replaced with character classes.\n  // XML allows all manner of ridiculous numbers and digits.\n  var number = '0124356789'\n  var letter = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'\n\n  // (Letter | \"_\" | \":\")\n  var quote = '\\'\"'\n  var attribEnd = whitespace + '>'\n  var CDATA = '[CDATA['\n  var DOCTYPE = 'DOCTYPE'\n  var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'\n  var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'\n  var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }\n\n  // turn all the string character sets into character class objects.\n  whitespace = charClass(whitespace)\n  number = charClass(number)\n  letter = charClass(letter)\n\n  // http://www.w3.org/TR/REC-xml/#NT-NameStartChar\n  // This implementation works on strings, a single character at a time\n  // as such, it cannot ever support astral-plane characters (10000-EFFFF)\n  // without a significant breaking change to either this  parser, or the\n  // JavaScript language.  Implementation of an emoji-capable xml parser\n  // is left as an exercise for the reader.\n  var nameStart = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n\n  var nameBody = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040\\.\\d-]/\n\n  var entityStart = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n  var entityBody = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040\\.\\d-]/\n\n  quote = charClass(quote)\n  attribEnd = charClass(attribEnd)\n\n  function charClass (str) {\n    return str.split('').reduce(function (s, c) {\n      s[c] = true\n      return s\n    }, {})\n  }\n\n  function isRegExp (c) {\n    return Object.prototype.toString.call(c) === '[object RegExp]'\n  }\n\n  function is (charclass, c) {\n    return isRegExp(charclass) ? !!c.match(charclass) : charclass[c]\n  }\n\n  function not (charclass, c) {\n    return !is(charclass, c)\n  }\n\n  var S = 0\n  sax.STATE = {\n    BEGIN: S++, // leading byte order mark or whitespace\n    BEGIN_WHITESPACE: S++, // leading whitespace\n    TEXT: S++, // general stuff\n    TEXT_ENTITY: S++, // &amp and such.\n    OPEN_WAKA: S++, // <\n    SGML_DECL: S++, // <!BLARG\n    SGML_DECL_QUOTED: S++, // <!BLARG foo \"bar\n    DOCTYPE: S++, // <!DOCTYPE\n    DOCTYPE_QUOTED: S++, // <!DOCTYPE \"//blah\n    DOCTYPE_DTD: S++, // <!DOCTYPE \"//blah\" [ ...\n    DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE \"//blah\" [ \"foo\n    COMMENT_STARTING: S++, // <!-\n    COMMENT: S++, // <!--\n    COMMENT_ENDING: S++, // <!-- blah -\n    COMMENT_ENDED: S++, // <!-- blah --\n    CDATA: S++, // <![CDATA[ something\n    CDATA_ENDING: S++, // ]\n    CDATA_ENDING_2: S++, // ]]\n    PROC_INST: S++, // <?hi\n    PROC_INST_BODY: S++, // <?hi there\n    PROC_INST_ENDING: S++, // <?hi \"there\" ?\n    OPEN_TAG: S++, // <strong\n    OPEN_TAG_SLASH: S++, // <strong /\n    ATTRIB: S++, // <a\n    ATTRIB_NAME: S++, // <a foo\n    ATTRIB_NAME_SAW_WHITE: S++, // <a foo _\n    ATTRIB_VALUE: S++, // <a foo=\n    ATTRIB_VALUE_QUOTED: S++, // <a foo=\"bar\n    ATTRIB_VALUE_CLOSED: S++, // <a foo=\"bar\"\n    ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar\n    ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar=\"&quot;\"\n    ATTRIB_VALUE_ENTITY_U: S++, // <foo bar=&quot\n    CLOSE_TAG: S++, // </a\n    CLOSE_TAG_SAW_WHITE: S++, // </a   >\n    SCRIPT: S++, // <script> ...\n    SCRIPT_ENDING: S++ // <script> ... <\n  }\n\n  sax.XML_ENTITIES = {\n    'amp': '&',\n    'gt': '>',\n    'lt': '<',\n    'quot': '\"',\n    'apos': \"'\"\n  }\n\n  sax.ENTITIES = {\n    'amp': '&',\n    'gt': '>',\n    'lt': '<',\n    'quot': '\"',\n    'apos': \"'\",\n    'AElig': 198,\n    'Aacute': 193,\n    'Acirc': 194,\n    'Agrave': 192,\n    'Aring': 197,\n    'Atilde': 195,\n    'Auml': 196,\n    'Ccedil': 199,\n    'ETH': 208,\n    'Eacute': 201,\n    'Ecirc': 202,\n    'Egrave': 200,\n    'Euml': 203,\n    'Iacute': 205,\n    'Icirc': 206,\n    'Igrave': 204,\n    'Iuml': 207,\n    'Ntilde': 209,\n    'Oacute': 211,\n    'Ocirc': 212,\n    'Ograve': 210,\n    'Oslash': 216,\n    'Otilde': 213,\n    'Ouml': 214,\n    'THORN': 222,\n    'Uacute': 218,\n    'Ucirc': 219,\n    'Ugrave': 217,\n    'Uuml': 220,\n    'Yacute': 221,\n    'aacute': 225,\n    'acirc': 226,\n    'aelig': 230,\n    'agrave': 224,\n    'aring': 229,\n    'atilde': 227,\n    'auml': 228,\n    'ccedil': 231,\n    'eacute': 233,\n    'ecirc': 234,\n    'egrave': 232,\n    'eth': 240,\n    'euml': 235,\n    'iacute': 237,\n    'icirc': 238,\n    'igrave': 236,\n    'iuml': 239,\n    'ntilde': 241,\n    'oacute': 243,\n    'ocirc': 244,\n    'ograve': 242,\n    'oslash': 248,\n    'otilde': 245,\n    'ouml': 246,\n    'szlig': 223,\n    'thorn': 254,\n    'uacute': 250,\n    'ucirc': 251,\n    'ugrave': 249,\n    'uuml': 252,\n    'yacute': 253,\n    'yuml': 255,\n    'copy': 169,\n    'reg': 174,\n    'nbsp': 160,\n    'iexcl': 161,\n    'cent': 162,\n    'pound': 163,\n    'curren': 164,\n    'yen': 165,\n    'brvbar': 166,\n    'sect': 167,\n    'uml': 168,\n    'ordf': 170,\n    'laquo': 171,\n    'not': 172,\n    'shy': 173,\n    'macr': 175,\n    'deg': 176,\n    'plusmn': 177,\n    'sup1': 185,\n    'sup2': 178,\n    'sup3': 179,\n    'acute': 180,\n    'micro': 181,\n    'para': 182,\n    'middot': 183,\n    'cedil': 184,\n    'ordm': 186,\n    'raquo': 187,\n    'frac14': 188,\n    'frac12': 189,\n    'frac34': 190,\n    'iquest': 191,\n    'times': 215,\n    'divide': 247,\n    'OElig': 338,\n    'oelig': 339,\n    'Scaron': 352,\n    'scaron': 353,\n    'Yuml': 376,\n    'fnof': 402,\n    'circ': 710,\n    'tilde': 732,\n    'Alpha': 913,\n    'Beta': 914,\n    'Gamma': 915,\n    'Delta': 916,\n    'Epsilon': 917,\n    'Zeta': 918,\n    'Eta': 919,\n    'Theta': 920,\n    'Iota': 921,\n    'Kappa': 922,\n    'Lambda': 923,\n    'Mu': 924,\n    'Nu': 925,\n    'Xi': 926,\n    'Omicron': 927,\n    'Pi': 928,\n    'Rho': 929,\n    'Sigma': 931,\n    'Tau': 932,\n    'Upsilon': 933,\n    'Phi': 934,\n    'Chi': 935,\n    'Psi': 936,\n    'Omega': 937,\n    'alpha': 945,\n    'beta': 946,\n    'gamma': 947,\n    'delta': 948,\n    'epsilon': 949,\n    'zeta': 950,\n    'eta': 951,\n    'theta': 952,\n    'iota': 953,\n    'kappa': 954,\n    'lambda': 955,\n    'mu': 956,\n    'nu': 957,\n    'xi': 958,\n    'omicron': 959,\n    'pi': 960,\n    'rho': 961,\n    'sigmaf': 962,\n    'sigma': 963,\n    'tau': 964,\n    'upsilon': 965,\n    'phi': 966,\n    'chi': 967,\n    'psi': 968,\n    'omega': 969,\n    'thetasym': 977,\n    'upsih': 978,\n    'piv': 982,\n    'ensp': 8194,\n    'emsp': 8195,\n    'thinsp': 8201,\n    'zwnj': 8204,\n    'zwj': 8205,\n    'lrm': 8206,\n    'rlm': 8207,\n    'ndash': 8211,\n    'mdash': 8212,\n    'lsquo': 8216,\n    'rsquo': 8217,\n    'sbquo': 8218,\n    'ldquo': 8220,\n    'rdquo': 8221,\n    'bdquo': 8222,\n    'dagger': 8224,\n    'Dagger': 8225,\n    'bull': 8226,\n    'hellip': 8230,\n    'permil': 8240,\n    'prime': 8242,\n    'Prime': 8243,\n    'lsaquo': 8249,\n    'rsaquo': 8250,\n    'oline': 8254,\n    'frasl': 8260,\n    'euro': 8364,\n    'image': 8465,\n    'weierp': 8472,\n    'real': 8476,\n    'trade': 8482,\n    'alefsym': 8501,\n    'larr': 8592,\n    'uarr': 8593,\n    'rarr': 8594,\n    'darr': 8595,\n    'harr': 8596,\n    'crarr': 8629,\n    'lArr': 8656,\n    'uArr': 8657,\n    'rArr': 8658,\n    'dArr': 8659,\n    'hArr': 8660,\n    'forall': 8704,\n    'part': 8706,\n    'exist': 8707,\n    'empty': 8709,\n    'nabla': 8711,\n    'isin': 8712,\n    'notin': 8713,\n    'ni': 8715,\n    'prod': 8719,\n    'sum': 8721,\n    'minus': 8722,\n    'lowast': 8727,\n    'radic': 8730,\n    'prop': 8733,\n    'infin': 8734,\n    'ang': 8736,\n    'and': 8743,\n    'or': 8744,\n    'cap': 8745,\n    'cup': 8746,\n    'int': 8747,\n    'there4': 8756,\n    'sim': 8764,\n    'cong': 8773,\n    'asymp': 8776,\n    'ne': 8800,\n    'equiv': 8801,\n    'le': 8804,\n    'ge': 8805,\n    'sub': 8834,\n    'sup': 8835,\n    'nsub': 8836,\n    'sube': 8838,\n    'supe': 8839,\n    'oplus': 8853,\n    'otimes': 8855,\n    'perp': 8869,\n    'sdot': 8901,\n    'lceil': 8968,\n    'rceil': 8969,\n    'lfloor': 8970,\n    'rfloor': 8971,\n    'lang': 9001,\n    'rang': 9002,\n    'loz': 9674,\n    'spades': 9824,\n    'clubs': 9827,\n    'hearts': 9829,\n    'diams': 9830\n  }\n\n  Object.keys(sax.ENTITIES).forEach(function (key) {\n    var e = sax.ENTITIES[key]\n    var s = typeof e === 'number' ? String.fromCharCode(e) : e\n    sax.ENTITIES[key] = s\n  })\n\n  for (var s in sax.STATE) {\n    sax.STATE[sax.STATE[s]] = s\n  }\n\n  // shorthand\n  S = sax.STATE\n\n  function emit (parser, event, data) {\n    parser[event] && parser[event](data)\n  }\n\n  function emitNode (parser, nodeType, data) {\n    if (parser.textNode) closeText(parser)\n    emit(parser, nodeType, data)\n  }\n\n  function closeText (parser) {\n    parser.textNode = textopts(parser.opt, parser.textNode)\n    if (parser.textNode) emit(parser, 'ontext', parser.textNode)\n    parser.textNode = ''\n  }\n\n  function textopts (opt, text) {\n    if (opt.trim) text = text.trim()\n    if (opt.normalize) text = text.replace(/\\s+/g, ' ')\n    return text\n  }\n\n  function error (parser, er) {\n    closeText(parser)\n    if (parser.trackPosition) {\n      er += '\\nLine: ' + parser.line +\n        '\\nColumn: ' + parser.column +\n        '\\nChar: ' + parser.c\n    }\n    er = new Error(er)\n    parser.error = er\n    emit(parser, 'onerror', er)\n    return parser\n  }\n\n  function end (parser) {\n    if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')\n    if ((parser.state !== S.BEGIN) &&\n      (parser.state !== S.BEGIN_WHITESPACE) &&\n      (parser.state !== S.TEXT)) {\n      error(parser, 'Unexpected end')\n    }\n    closeText(parser)\n    parser.c = ''\n    parser.closed = true\n    emit(parser, 'onend')\n    SAXParser.call(parser, parser.strict, parser.opt)\n    return parser\n  }\n\n  function strictFail (parser, message) {\n    if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {\n      throw new Error('bad call to strictFail')\n    }\n    if (parser.strict) {\n      error(parser, message)\n    }\n  }\n\n  function newTag (parser) {\n    if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()\n    var parent = parser.tags[parser.tags.length - 1] || parser\n    var tag = parser.tag = { name: parser.tagName, attributes: {} }\n\n    // will be overridden if tag contails an xmlns=\"foo\" or xmlns:foo=\"bar\"\n    if (parser.opt.xmlns) {\n      tag.ns = parent.ns\n    }\n    parser.attribList.length = 0\n  }\n\n  function qname (name, attribute) {\n    var i = name.indexOf(':')\n    var qualName = i < 0 ? [ '', name ] : name.split(':')\n    var prefix = qualName[0]\n    var local = qualName[1]\n\n    // <x \"xmlns\"=\"http://foo\">\n    if (attribute && name === 'xmlns') {\n      prefix = 'xmlns'\n      local = ''\n    }\n\n    return { prefix: prefix, local: local }\n  }\n\n  function attrib (parser) {\n    if (!parser.strict) {\n      parser.attribName = parser.attribName[parser.looseCase]()\n    }\n\n    if (parser.attribList.indexOf(parser.attribName) !== -1 ||\n      parser.tag.attributes.hasOwnProperty(parser.attribName)) {\n      parser.attribName = parser.attribValue = ''\n      return\n    }\n\n    if (parser.opt.xmlns) {\n      var qn = qname(parser.attribName, true)\n      var prefix = qn.prefix\n      var local = qn.local\n\n      if (prefix === 'xmlns') {\n        // namespace binding attribute. push the binding into scope\n        if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {\n          strictFail(parser,\n            'xml: prefix must be bound to ' + XML_NAMESPACE + '\\n' +\n            'Actual: ' + parser.attribValue)\n        } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {\n          strictFail(parser,\n            'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\\n' +\n            'Actual: ' + parser.attribValue)\n        } else {\n          var tag = parser.tag\n          var parent = parser.tags[parser.tags.length - 1] || parser\n          if (tag.ns === parent.ns) {\n            tag.ns = Object.create(parent.ns)\n          }\n          tag.ns[local] = parser.attribValue\n        }\n      }\n\n      // defer onattribute events until all attributes have been seen\n      // so any new bindings can take effect. preserve attribute order\n      // so deferred events can be emitted in document order\n      parser.attribList.push([parser.attribName, parser.attribValue])\n    } else {\n      // in non-xmlns mode, we can emit the event right away\n      parser.tag.attributes[parser.attribName] = parser.attribValue\n      emitNode(parser, 'onattribute', {\n        name: parser.attribName,\n        value: parser.attribValue\n      })\n    }\n\n    parser.attribName = parser.attribValue = ''\n  }\n\n  function openTag (parser, selfClosing) {\n    if (parser.opt.xmlns) {\n      // emit namespace binding events\n      var tag = parser.tag\n\n      // add namespace info to tag\n      var qn = qname(parser.tagName)\n      tag.prefix = qn.prefix\n      tag.local = qn.local\n      tag.uri = tag.ns[qn.prefix] || ''\n\n      if (tag.prefix && !tag.uri) {\n        strictFail(parser, 'Unbound namespace prefix: ' +\n          JSON.stringify(parser.tagName))\n        tag.uri = qn.prefix\n      }\n\n      var parent = parser.tags[parser.tags.length - 1] || parser\n      if (tag.ns && parent.ns !== tag.ns) {\n        Object.keys(tag.ns).forEach(function (p) {\n          emitNode(parser, 'onopennamespace', {\n            prefix: p,\n            uri: tag.ns[p]\n          })\n        })\n      }\n\n      // handle deferred onattribute events\n      // Note: do not apply default ns to attributes:\n      //   http://www.w3.org/TR/REC-xml-names/#defaulting\n      for (var i = 0, l = parser.attribList.length; i < l; i++) {\n        var nv = parser.attribList[i]\n        var name = nv[0]\n        var value = nv[1]\n        var qualName = qname(name, true)\n        var prefix = qualName.prefix\n        var local = qualName.local\n        var uri = prefix === '' ? '' : (tag.ns[prefix] || '')\n        var a = {\n          name: name,\n          value: value,\n          prefix: prefix,\n          local: local,\n          uri: uri\n        }\n\n        // if there's any attributes with an undefined namespace,\n        // then fail on them now.\n        if (prefix && prefix !== 'xmlns' && !uri) {\n          strictFail(parser, 'Unbound namespace prefix: ' +\n            JSON.stringify(prefix))\n          a.uri = prefix\n        }\n        parser.tag.attributes[name] = a\n        emitNode(parser, 'onattribute', a)\n      }\n      parser.attribList.length = 0\n    }\n\n    parser.tag.isSelfClosing = !!selfClosing\n\n    // process the tag\n    parser.sawRoot = true\n    parser.tags.push(parser.tag)\n    emitNode(parser, 'onopentag', parser.tag)\n    if (!selfClosing) {\n      // special case for <script> in non-strict mode.\n      if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {\n        parser.state = S.SCRIPT\n      } else {\n        parser.state = S.TEXT\n      }\n      parser.tag = null\n      parser.tagName = ''\n    }\n    parser.attribName = parser.attribValue = ''\n    parser.attribList.length = 0\n  }\n\n  function closeTag (parser) {\n    if (!parser.tagName) {\n      strictFail(parser, 'Weird empty close tag.')\n      parser.textNode += '</>'\n      parser.state = S.TEXT\n      return\n    }\n\n    if (parser.script) {\n      if (parser.tagName !== 'script') {\n        parser.script += '</' + parser.tagName + '>'\n        parser.tagName = ''\n        parser.state = S.SCRIPT\n        return\n      }\n      emitNode(parser, 'onscript', parser.script)\n      parser.script = ''\n    }\n\n    // first make sure that the closing tag actually exists.\n    // <a><b></c></b></a> will close everything, otherwise.\n    var t = parser.tags.length\n    var tagName = parser.tagName\n    if (!parser.strict) {\n      tagName = tagName[parser.looseCase]()\n    }\n    var closeTo = tagName\n    while (t--) {\n      var close = parser.tags[t]\n      if (close.name !== closeTo) {\n        // fail the first time in strict mode\n        strictFail(parser, 'Unexpected close tag')\n      } else {\n        break\n      }\n    }\n\n    // didn't find it.  we already failed for strict, so just abort.\n    if (t < 0) {\n      strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)\n      parser.textNode += '</' + parser.tagName + '>'\n      parser.state = S.TEXT\n      return\n    }\n    parser.tagName = tagName\n    var s = parser.tags.length\n    while (s-- > t) {\n      var tag = parser.tag = parser.tags.pop()\n      parser.tagName = parser.tag.name\n      emitNode(parser, 'onclosetag', parser.tagName)\n\n      var x = {}\n      for (var i in tag.ns) {\n        x[i] = tag.ns[i]\n      }\n\n      var parent = parser.tags[parser.tags.length - 1] || parser\n      if (parser.opt.xmlns && tag.ns !== parent.ns) {\n        // remove namespace bindings introduced by tag\n        Object.keys(tag.ns).forEach(function (p) {\n          var n = tag.ns[p]\n          emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })\n        })\n      }\n    }\n    if (t === 0) parser.closedRoot = true\n    parser.tagName = parser.attribValue = parser.attribName = ''\n    parser.attribList.length = 0\n    parser.state = S.TEXT\n  }\n\n  function parseEntity (parser) {\n    var entity = parser.entity\n    var entityLC = entity.toLowerCase()\n    var num\n    var numStr = ''\n\n    if (parser.ENTITIES[entity]) {\n      return parser.ENTITIES[entity]\n    }\n    if (parser.ENTITIES[entityLC]) {\n      return parser.ENTITIES[entityLC]\n    }\n    entity = entityLC\n    if (entity.charAt(0) === '#') {\n      if (entity.charAt(1) === 'x') {\n        entity = entity.slice(2)\n        num = parseInt(entity, 16)\n        numStr = num.toString(16)\n      } else {\n        entity = entity.slice(1)\n        num = parseInt(entity, 10)\n        numStr = num.toString(10)\n      }\n    }\n    entity = entity.replace(/^0+/, '')\n    if (numStr.toLowerCase() !== entity) {\n      strictFail(parser, 'Invalid character entity')\n      return '&' + parser.entity + ';'\n    }\n\n    return String.fromCodePoint(num)\n  }\n\n  function beginWhiteSpace (parser, c) {\n    if (c === '<') {\n      parser.state = S.OPEN_WAKA\n      parser.startTagPosition = parser.position\n    } else if (not(whitespace, c)) {\n      // have to process this as a text node.\n      // weird, but happens.\n      strictFail(parser, 'Non-whitespace before first tag.')\n      parser.textNode = c\n      parser.state = S.TEXT\n    }\n  }\n\n  function charAt (chunk, i) {\n    var result = ''\n    if (i < chunk.length) {\n      result = chunk.charAt(i)\n    }\n    return result\n  }\n\n  function write (chunk) {\n    var parser = this\n    if (this.error) {\n      throw this.error\n    }\n    if (parser.closed) {\n      return error(parser,\n        'Cannot write after close. Assign an onready handler.')\n    }\n    if (chunk === null) {\n      return end(parser)\n    }\n    if (typeof chunk === 'object') {\n      chunk = chunk.toString()\n    }\n    var i = 0\n    var c = ''\n    while (true) {\n      c = charAt(chunk, i++)\n      parser.c = c\n      if (!c) {\n        break\n      }\n      if (parser.trackPosition) {\n        parser.position++\n        if (c === '\\n') {\n          parser.line++\n          parser.column = 0\n        } else {\n          parser.column++\n        }\n      }\n      switch (parser.state) {\n        case S.BEGIN:\n          parser.state = S.BEGIN_WHITESPACE\n          if (c === '\\uFEFF') {\n            continue\n          }\n          beginWhiteSpace(parser, c)\n          continue\n\n        case S.BEGIN_WHITESPACE:\n          beginWhiteSpace(parser, c)\n          continue\n\n        case S.TEXT:\n          if (parser.sawRoot && !parser.closedRoot) {\n            var starti = i - 1\n            while (c && c !== '<' && c !== '&') {\n              c = charAt(chunk, i++)\n              if (c && parser.trackPosition) {\n                parser.position++\n                if (c === '\\n') {\n                  parser.line++\n                  parser.column = 0\n                } else {\n                  parser.column++\n                }\n              }\n            }\n            parser.textNode += chunk.substring(starti, i - 1)\n          }\n          if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {\n            parser.state = S.OPEN_WAKA\n            parser.startTagPosition = parser.position\n          } else {\n            if (not(whitespace, c) && (!parser.sawRoot || parser.closedRoot)) {\n              strictFail(parser, 'Text data outside of root node.')\n            }\n            if (c === '&') {\n              parser.state = S.TEXT_ENTITY\n            } else {\n              parser.textNode += c\n            }\n          }\n          continue\n\n        case S.SCRIPT:\n          // only non-strict\n          if (c === '<') {\n            parser.state = S.SCRIPT_ENDING\n          } else {\n            parser.script += c\n          }\n          continue\n\n        case S.SCRIPT_ENDING:\n          if (c === '/') {\n            parser.state = S.CLOSE_TAG\n          } else {\n            parser.script += '<' + c\n            parser.state = S.SCRIPT\n          }\n          continue\n\n        case S.OPEN_WAKA:\n          // either a /, ?, !, or text is coming next.\n          if (c === '!') {\n            parser.state = S.SGML_DECL\n            parser.sgmlDecl = ''\n          } else if (is(whitespace, c)) {\n            // wait for it...\n          } else if (is(nameStart, c)) {\n            parser.state = S.OPEN_TAG\n            parser.tagName = c\n          } else if (c === '/') {\n            parser.state = S.CLOSE_TAG\n            parser.tagName = ''\n          } else if (c === '?') {\n            parser.state = S.PROC_INST\n            parser.procInstName = parser.procInstBody = ''\n          } else {\n            strictFail(parser, 'Unencoded <')\n            // if there was some whitespace, then add that in.\n            if (parser.startTagPosition + 1 < parser.position) {\n              var pad = parser.position - parser.startTagPosition\n              c = new Array(pad).join(' ') + c\n            }\n            parser.textNode += '<' + c\n            parser.state = S.TEXT\n          }\n          continue\n\n        case S.SGML_DECL:\n          if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {\n            emitNode(parser, 'onopencdata')\n            parser.state = S.CDATA\n            parser.sgmlDecl = ''\n            parser.cdata = ''\n          } else if (parser.sgmlDecl + c === '--') {\n            parser.state = S.COMMENT\n            parser.comment = ''\n            parser.sgmlDecl = ''\n          } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {\n            parser.state = S.DOCTYPE\n            if (parser.doctype || parser.sawRoot) {\n              strictFail(parser,\n                'Inappropriately located doctype declaration')\n            }\n            parser.doctype = ''\n            parser.sgmlDecl = ''\n          } else if (c === '>') {\n            emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)\n            parser.sgmlDecl = ''\n            parser.state = S.TEXT\n          } else if (is(quote, c)) {\n            parser.state = S.SGML_DECL_QUOTED\n            parser.sgmlDecl += c\n          } else {\n            parser.sgmlDecl += c\n          }\n          continue\n\n        case S.SGML_DECL_QUOTED:\n          if (c === parser.q) {\n            parser.state = S.SGML_DECL\n            parser.q = ''\n          }\n          parser.sgmlDecl += c\n          continue\n\n        case S.DOCTYPE:\n          if (c === '>') {\n            parser.state = S.TEXT\n            emitNode(parser, 'ondoctype', parser.doctype)\n            parser.doctype = true // just remember that we saw it.\n          } else {\n            parser.doctype += c\n            if (c === '[') {\n              parser.state = S.DOCTYPE_DTD\n            } else if (is(quote, c)) {\n              parser.state = S.DOCTYPE_QUOTED\n              parser.q = c\n            }\n          }\n          continue\n\n        case S.DOCTYPE_QUOTED:\n          parser.doctype += c\n          if (c === parser.q) {\n            parser.q = ''\n            parser.state = S.DOCTYPE\n          }\n          continue\n\n        case S.DOCTYPE_DTD:\n          parser.doctype += c\n          if (c === ']') {\n            parser.state = S.DOCTYPE\n          } else if (is(quote, c)) {\n            parser.state = S.DOCTYPE_DTD_QUOTED\n            parser.q = c\n          }\n          continue\n\n        case S.DOCTYPE_DTD_QUOTED:\n          parser.doctype += c\n          if (c === parser.q) {\n            parser.state = S.DOCTYPE_DTD\n            parser.q = ''\n          }\n          continue\n\n        case S.COMMENT:\n          if (c === '-') {\n            parser.state = S.COMMENT_ENDING\n          } else {\n            parser.comment += c\n          }\n          continue\n\n        case S.COMMENT_ENDING:\n          if (c === '-') {\n            parser.state = S.COMMENT_ENDED\n            parser.comment = textopts(parser.opt, parser.comment)\n            if (parser.comment) {\n              emitNode(parser, 'oncomment', parser.comment)\n            }\n            parser.comment = ''\n          } else {\n            parser.comment += '-' + c\n            parser.state = S.COMMENT\n          }\n          continue\n\n        case S.COMMENT_ENDED:\n          if (c !== '>') {\n            strictFail(parser, 'Malformed comment')\n            // allow <!-- blah -- bloo --> in non-strict mode,\n            // which is a comment of \" blah -- bloo \"\n            parser.comment += '--' + c\n            parser.state = S.COMMENT\n          } else {\n            parser.state = S.TEXT\n          }\n          continue\n\n        case S.CDATA:\n          if (c === ']') {\n            parser.state = S.CDATA_ENDING\n          } else {\n            parser.cdata += c\n          }\n          continue\n\n        case S.CDATA_ENDING:\n          if (c === ']') {\n            parser.state = S.CDATA_ENDING_2\n          } else {\n            parser.cdata += ']' + c\n            parser.state = S.CDATA\n          }\n          continue\n\n        case S.CDATA_ENDING_2:\n          if (c === '>') {\n            if (parser.cdata) {\n              emitNode(parser, 'oncdata', parser.cdata)\n            }\n            emitNode(parser, 'onclosecdata')\n            parser.cdata = ''\n            parser.state = S.TEXT\n          } else if (c === ']') {\n            parser.cdata += ']'\n          } else {\n            parser.cdata += ']]' + c\n            parser.state = S.CDATA\n          }\n          continue\n\n        case S.PROC_INST:\n          if (c === '?') {\n            parser.state = S.PROC_INST_ENDING\n          } else if (is(whitespace, c)) {\n            parser.state = S.PROC_INST_BODY\n          } else {\n            parser.procInstName += c\n          }\n          continue\n\n        case S.PROC_INST_BODY:\n          if (!parser.procInstBody && is(whitespace, c)) {\n            continue\n          } else if (c === '?') {\n            parser.state = S.PROC_INST_ENDING\n          } else {\n            parser.procInstBody += c\n          }\n          continue\n\n        case S.PROC_INST_ENDING:\n          if (c === '>') {\n            emitNode(parser, 'onprocessinginstruction', {\n              name: parser.procInstName,\n              body: parser.procInstBody\n            })\n            parser.procInstName = parser.procInstBody = ''\n            parser.state = S.TEXT\n          } else {\n            parser.procInstBody += '?' + c\n            parser.state = S.PROC_INST_BODY\n          }\n          continue\n\n        case S.OPEN_TAG:\n          if (is(nameBody, c)) {\n            parser.tagName += c\n          } else {\n            newTag(parser)\n            if (c === '>') {\n              openTag(parser)\n            } else if (c === '/') {\n              parser.state = S.OPEN_TAG_SLASH\n            } else {\n              if (not(whitespace, c)) {\n                strictFail(parser, 'Invalid character in tag name')\n              }\n              parser.state = S.ATTRIB\n            }\n          }\n          continue\n\n        case S.OPEN_TAG_SLASH:\n          if (c === '>') {\n            openTag(parser, true)\n            closeTag(parser)\n          } else {\n            strictFail(parser, 'Forward-slash in opening tag not followed by >')\n            parser.state = S.ATTRIB\n          }\n          continue\n\n        case S.ATTRIB:\n          // haven't read the attribute name yet.\n          if (is(whitespace, c)) {\n            continue\n          } else if (c === '>') {\n            openTag(parser)\n          } else if (c === '/') {\n            parser.state = S.OPEN_TAG_SLASH\n          } else if (is(nameStart, c)) {\n            parser.attribName = c\n            parser.attribValue = ''\n            parser.state = S.ATTRIB_NAME\n          } else {\n            strictFail(parser, 'Invalid attribute name')\n          }\n          continue\n\n        case S.ATTRIB_NAME:\n          if (c === '=') {\n            parser.state = S.ATTRIB_VALUE\n          } else if (c === '>') {\n            strictFail(parser, 'Attribute without value')\n            parser.attribValue = parser.attribName\n            attrib(parser)\n            openTag(parser)\n          } else if (is(whitespace, c)) {\n            parser.state = S.ATTRIB_NAME_SAW_WHITE\n          } else if (is(nameBody, c)) {\n            parser.attribName += c\n          } else {\n            strictFail(parser, 'Invalid attribute name')\n          }\n          continue\n\n        case S.ATTRIB_NAME_SAW_WHITE:\n          if (c === '=') {\n            parser.state = S.ATTRIB_VALUE\n          } else if (is(whitespace, c)) {\n            continue\n          } else {\n            strictFail(parser, 'Attribute without value')\n            parser.tag.attributes[parser.attribName] = ''\n            parser.attribValue = ''\n            emitNode(parser, 'onattribute', {\n              name: parser.attribName,\n              value: ''\n            })\n            parser.attribName = ''\n            if (c === '>') {\n              openTag(parser)\n            } else if (is(nameStart, c)) {\n              parser.attribName = c\n              parser.state = S.ATTRIB_NAME\n            } else {\n              strictFail(parser, 'Invalid attribute name')\n              parser.state = S.ATTRIB\n            }\n          }\n          continue\n\n        case S.ATTRIB_VALUE:\n          if (is(whitespace, c)) {\n            continue\n          } else if (is(quote, c)) {\n            parser.q = c\n            parser.state = S.ATTRIB_VALUE_QUOTED\n          } else {\n            strictFail(parser, 'Unquoted attribute value')\n            parser.state = S.ATTRIB_VALUE_UNQUOTED\n            parser.attribValue = c\n          }\n          continue\n\n        case S.ATTRIB_VALUE_QUOTED:\n          if (c !== parser.q) {\n            if (c === '&') {\n              parser.state = S.ATTRIB_VALUE_ENTITY_Q\n            } else {\n              parser.attribValue += c\n            }\n            continue\n          }\n          attrib(parser)\n          parser.q = ''\n          parser.state = S.ATTRIB_VALUE_CLOSED\n          continue\n\n        case S.ATTRIB_VALUE_CLOSED:\n          if (is(whitespace, c)) {\n            parser.state = S.ATTRIB\n          } else if (c === '>') {\n            openTag(parser)\n          } else if (c === '/') {\n            parser.state = S.OPEN_TAG_SLASH\n          } else if (is(nameStart, c)) {\n            strictFail(parser, 'No whitespace between attributes')\n            parser.attribName = c\n            parser.attribValue = ''\n            parser.state = S.ATTRIB_NAME\n          } else {\n            strictFail(parser, 'Invalid attribute name')\n          }\n          continue\n\n        case S.ATTRIB_VALUE_UNQUOTED:\n          if (not(attribEnd, c)) {\n            if (c === '&') {\n              parser.state = S.ATTRIB_VALUE_ENTITY_U\n            } else {\n              parser.attribValue += c\n            }\n            continue\n          }\n          attrib(parser)\n          if (c === '>') {\n            openTag(parser)\n          } else {\n            parser.state = S.ATTRIB\n          }\n          continue\n\n        case S.CLOSE_TAG:\n          if (!parser.tagName) {\n            if (is(whitespace, c)) {\n              continue\n            } else if (not(nameStart, c)) {\n              if (parser.script) {\n                parser.script += '</' + c\n                parser.state = S.SCRIPT\n              } else {\n                strictFail(parser, 'Invalid tagname in closing tag.')\n              }\n            } else {\n              parser.tagName = c\n            }\n          } else if (c === '>') {\n            closeTag(parser)\n          } else if (is(nameBody, c)) {\n            parser.tagName += c\n          } else if (parser.script) {\n            parser.script += '</' + parser.tagName\n            parser.tagName = ''\n            parser.state = S.SCRIPT\n          } else {\n            if (not(whitespace, c)) {\n              strictFail(parser, 'Invalid tagname in closing tag')\n            }\n            parser.state = S.CLOSE_TAG_SAW_WHITE\n          }\n          continue\n\n        case S.CLOSE_TAG_SAW_WHITE:\n          if (is(whitespace, c)) {\n            continue\n          }\n          if (c === '>') {\n            closeTag(parser)\n          } else {\n            strictFail(parser, 'Invalid characters in closing tag')\n          }\n          continue\n\n        case S.TEXT_ENTITY:\n        case S.ATTRIB_VALUE_ENTITY_Q:\n        case S.ATTRIB_VALUE_ENTITY_U:\n          var returnState\n          var buffer\n          switch (parser.state) {\n            case S.TEXT_ENTITY:\n              returnState = S.TEXT\n              buffer = 'textNode'\n              break\n\n            case S.ATTRIB_VALUE_ENTITY_Q:\n              returnState = S.ATTRIB_VALUE_QUOTED\n              buffer = 'attribValue'\n              break\n\n            case S.ATTRIB_VALUE_ENTITY_U:\n              returnState = S.ATTRIB_VALUE_UNQUOTED\n              buffer = 'attribValue'\n              break\n          }\n\n          if (c === ';') {\n            parser[buffer] += parseEntity(parser)\n            parser.entity = ''\n            parser.state = returnState\n          } else if (is(parser.entity.length ? entityBody : entityStart, c)) {\n            parser.entity += c\n          } else {\n            strictFail(parser, 'Invalid character in entity name')\n            parser[buffer] += '&' + parser.entity + c\n            parser.entity = ''\n            parser.state = returnState\n          }\n\n          continue\n\n        default:\n          throw new Error(parser, 'Unknown state: ' + parser.state)\n      }\n    } // while\n\n    if (parser.position >= parser.bufferCheckPosition) {\n      checkBufferLength(parser)\n    }\n    return parser\n  }\n\n  /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */\n  if (!String.fromCodePoint) {\n    (function () {\n      var stringFromCharCode = String.fromCharCode\n      var floor = Math.floor\n      var fromCodePoint = function () {\n        var MAX_SIZE = 0x4000\n        var codeUnits = []\n        var highSurrogate\n        var lowSurrogate\n        var index = -1\n        var length = arguments.length\n        if (!length) {\n          return ''\n        }\n        var result = ''\n        while (++index < length) {\n          var codePoint = Number(arguments[index])\n          if (\n            !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n            codePoint < 0 || // not a valid Unicode code point\n            codePoint > 0x10FFFF || // not a valid Unicode code point\n            floor(codePoint) !== codePoint // not an integer\n          ) {\n            throw RangeError('Invalid code point: ' + codePoint)\n          }\n          if (codePoint <= 0xFFFF) { // BMP code point\n            codeUnits.push(codePoint)\n          } else { // Astral code point; split in surrogate halves\n            // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n            codePoint -= 0x10000\n            highSurrogate = (codePoint >> 10) + 0xD800\n            lowSurrogate = (codePoint % 0x400) + 0xDC00\n            codeUnits.push(highSurrogate, lowSurrogate)\n          }\n          if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n            result += stringFromCharCode.apply(null, codeUnits)\n            codeUnits.length = 0\n          }\n        }\n        return result\n      }\n      if (Object.defineProperty) {\n        Object.defineProperty(String, 'fromCodePoint', {\n          value: fromCodePoint,\n          configurable: true,\n          writable: true\n        })\n      } else {\n        String.fromCodePoint = fromCodePoint\n      }\n    }())\n  }\n})(typeof exports === 'undefined' ? this.sax = {} : exports)\n\n}).call(this,require(\"buffer\").Buffer)\n},{\"buffer\":77,\"stream\":151,\"string_decoder\":152}],151:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = Stream;\n\nvar EE = require('events').EventEmitter;\nvar inherits = require('inherits');\n\ninherits(Stream, EE);\nStream.Readable = require('readable-stream/readable.js');\nStream.Writable = require('readable-stream/writable.js');\nStream.Duplex = require('readable-stream/duplex.js');\nStream.Transform = require('readable-stream/transform.js');\nStream.PassThrough = require('readable-stream/passthrough.js');\n\n// Backwards-compat with node 0.4.x\nStream.Stream = Stream;\n\n\n\n// old-style streams.  Note that the pipe method (the only relevant\n// part of this class) is overridden in the Readable class.\n\nfunction Stream() {\n  EE.call(this);\n}\n\nStream.prototype.pipe = function(dest, options) {\n  var source = this;\n\n  function ondata(chunk) {\n    if (dest.writable) {\n      if (false === dest.write(chunk) && source.pause) {\n        source.pause();\n      }\n    }\n  }\n\n  source.on('data', ondata);\n\n  function ondrain() {\n    if (source.readable && source.resume) {\n      source.resume();\n    }\n  }\n\n  dest.on('drain', ondrain);\n\n  // If the 'end' option is not supplied, dest.end() will be called when\n  // source gets the 'end' or 'close' events.  Only dest.end() once.\n  if (!dest._isStdio && (!options || options.end !== false)) {\n    source.on('end', onend);\n    source.on('close', onclose);\n  }\n\n  var didOnEnd = false;\n  function onend() {\n    if (didOnEnd) return;\n    didOnEnd = true;\n\n    dest.end();\n  }\n\n\n  function onclose() {\n    if (didOnEnd) return;\n    didOnEnd = true;\n\n    if (typeof dest.destroy === 'function') dest.destroy();\n  }\n\n  // don't leave dangling pipes when there are errors.\n  function onerror(er) {\n    cleanup();\n    if (EE.listenerCount(this, 'error') === 0) {\n      throw er; // Unhandled stream error in pipe.\n    }\n  }\n\n  source.on('error', onerror);\n  dest.on('error', onerror);\n\n  // remove all the event listeners that were added.\n  function cleanup() {\n    source.removeListener('data', ondata);\n    dest.removeListener('drain', ondrain);\n\n    source.removeListener('end', onend);\n    source.removeListener('close', onclose);\n\n    source.removeListener('error', onerror);\n    dest.removeListener('error', onerror);\n\n    source.removeListener('end', cleanup);\n    source.removeListener('close', cleanup);\n\n    dest.removeListener('close', cleanup);\n  }\n\n  source.on('end', cleanup);\n  source.on('close', cleanup);\n\n  dest.on('close', cleanup);\n\n  dest.emit('pipe', source);\n\n  // Allow for unix-like usage: A.pipe(B).pipe(C)\n  return dest;\n};\n\n},{\"events\":79,\"inherits\":81,\"readable-stream/duplex.js\":139,\"readable-stream/passthrough.js\":146,\"readable-stream/readable.js\":147,\"readable-stream/transform.js\":148,\"readable-stream/writable.js\":149}],152:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar Buffer = require('buffer').Buffer;\n\nvar isBufferEncoding = Buffer.isEncoding\n  || function(encoding) {\n       switch (encoding && encoding.toLowerCase()) {\n         case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;\n         default: return false;\n       }\n     }\n\n\nfunction assertEncoding(encoding) {\n  if (encoding && !isBufferEncoding(encoding)) {\n    throw new Error('Unknown encoding: ' + encoding);\n  }\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters. CESU-8 is handled as part of the UTF-8 encoding.\n//\n// @TODO Handling all encodings inside a single object makes it very difficult\n// to reason about this code, so it should be split up in the future.\n// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code\n// points as used by CESU-8.\nvar StringDecoder = exports.StringDecoder = function(encoding) {\n  this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');\n  assertEncoding(encoding);\n  switch (this.encoding) {\n    case 'utf8':\n      // CESU-8 represents each of Surrogate Pair by 3-bytes\n      this.surrogateSize = 3;\n      break;\n    case 'ucs2':\n    case 'utf16le':\n      // UTF-16 represents each of Surrogate Pair by 2-bytes\n      this.surrogateSize = 2;\n      this.detectIncompleteChar = utf16DetectIncompleteChar;\n      break;\n    case 'base64':\n      // Base-64 stores 3 bytes in 4 chars, and pads the remainder.\n      this.surrogateSize = 3;\n      this.detectIncompleteChar = base64DetectIncompleteChar;\n      break;\n    default:\n      this.write = passThroughWrite;\n      return;\n  }\n\n  // Enough space to store all bytes of a single character. UTF-8 needs 4\n  // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).\n  this.charBuffer = new Buffer(6);\n  // Number of bytes received for the current incomplete multi-byte character.\n  this.charReceived = 0;\n  // Number of bytes expected for the current incomplete multi-byte character.\n  this.charLength = 0;\n};\n\n\n// write decodes the given buffer and returns it as JS string that is\n// guaranteed to not contain any partial multi-byte characters. Any partial\n// character found at the end of the buffer is buffered up, and will be\n// returned when calling write again with the remaining bytes.\n//\n// Note: Converting a Buffer containing an orphan surrogate to a String\n// currently works, but converting a String to a Buffer (via `new Buffer`, or\n// Buffer#write) will replace incomplete surrogates with the unicode\n// replacement character. See https://codereview.chromium.org/121173009/ .\nStringDecoder.prototype.write = function(buffer) {\n  var charStr = '';\n  // if our last write ended with an incomplete multibyte character\n  while (this.charLength) {\n    // determine how many remaining bytes this buffer has to offer for this char\n    var available = (buffer.length >= this.charLength - this.charReceived) ?\n        this.charLength - this.charReceived :\n        buffer.length;\n\n    // add the new bytes to the char buffer\n    buffer.copy(this.charBuffer, this.charReceived, 0, available);\n    this.charReceived += available;\n\n    if (this.charReceived < this.charLength) {\n      // still not enough chars in this buffer? wait for more ...\n      return '';\n    }\n\n    // remove bytes belonging to the current character from the buffer\n    buffer = buffer.slice(available, buffer.length);\n\n    // get the character that was split\n    charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);\n\n    // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character\n    var charCode = charStr.charCodeAt(charStr.length - 1);\n    if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n      this.charLength += this.surrogateSize;\n      charStr = '';\n      continue;\n    }\n    this.charReceived = this.charLength = 0;\n\n    // if there are no more bytes in this buffer, just emit our char\n    if (buffer.length === 0) {\n      return charStr;\n    }\n    break;\n  }\n\n  // determine and set charLength / charReceived\n  this.detectIncompleteChar(buffer);\n\n  var end = buffer.length;\n  if (this.charLength) {\n    // buffer the incomplete character bytes we got\n    buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);\n    end -= this.charReceived;\n  }\n\n  charStr += buffer.toString(this.encoding, 0, end);\n\n  var end = charStr.length - 1;\n  var charCode = charStr.charCodeAt(end);\n  // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character\n  if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n    var size = this.surrogateSize;\n    this.charLength += size;\n    this.charReceived += size;\n    this.charBuffer.copy(this.charBuffer, size, 0, size);\n    buffer.copy(this.charBuffer, 0, 0, size);\n    return charStr.substring(0, end);\n  }\n\n  // or just emit the charStr\n  return charStr;\n};\n\n// detectIncompleteChar determines if there is an incomplete UTF-8 character at\n// the end of the given buffer. If so, it sets this.charLength to the byte\n// length that character, and sets this.charReceived to the number of bytes\n// that are available for this character.\nStringDecoder.prototype.detectIncompleteChar = function(buffer) {\n  // determine how many bytes we have to check at the end of this buffer\n  var i = (buffer.length >= 3) ? 3 : buffer.length;\n\n  // Figure out if one of the last i bytes of our buffer announces an\n  // incomplete char.\n  for (; i > 0; i--) {\n    var c = buffer[buffer.length - i];\n\n    // See http://en.wikipedia.org/wiki/UTF-8#Description\n\n    // 110XXXXX\n    if (i == 1 && c >> 5 == 0x06) {\n      this.charLength = 2;\n      break;\n    }\n\n    // 1110XXXX\n    if (i <= 2 && c >> 4 == 0x0E) {\n      this.charLength = 3;\n      break;\n    }\n\n    // 11110XXX\n    if (i <= 3 && c >> 3 == 0x1E) {\n      this.charLength = 4;\n      break;\n    }\n  }\n  this.charReceived = i;\n};\n\nStringDecoder.prototype.end = function(buffer) {\n  var res = '';\n  if (buffer && buffer.length)\n    res = this.write(buffer);\n\n  if (this.charReceived) {\n    var cr = this.charReceived;\n    var buf = this.charBuffer;\n    var enc = this.encoding;\n    res += buf.slice(0, cr).toString(enc);\n  }\n\n  return res;\n};\n\nfunction passThroughWrite(buffer) {\n  return buffer.toString(this.encoding);\n}\n\nfunction utf16DetectIncompleteChar(buffer) {\n  this.charReceived = buffer.length % 2;\n  this.charLength = this.charReceived ? 2 : 0;\n}\n\nfunction base64DetectIncompleteChar(buffer) {\n  this.charReceived = buffer.length % 3;\n  this.charLength = this.charReceived ? 3 : 0;\n}\n\n},{\"buffer\":77}],153:[function(require,module,exports){\n//     Underscore.js 1.8.3\n//     http://underscorejs.org\n//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Underscore may be freely distributed under the MIT license.\n\n(function() {\n\n  // Baseline setup\n  // --------------\n\n  // Establish the root object, `window` in the browser, or `exports` on the server.\n  var root = this;\n\n  // Save the previous value of the `_` variable.\n  var previousUnderscore = root._;\n\n  // Save bytes in the minified (but not gzipped) version:\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n  // Create quick reference variables for speed access to core prototypes.\n  var\n    push             = ArrayProto.push,\n    slice            = ArrayProto.slice,\n    toString         = ObjProto.toString,\n    hasOwnProperty   = ObjProto.hasOwnProperty;\n\n  // All **ECMAScript 5** native function implementations that we hope to use\n  // are declared here.\n  var\n    nativeIsArray      = Array.isArray,\n    nativeKeys         = Object.keys,\n    nativeBind         = FuncProto.bind,\n    nativeCreate       = Object.create;\n\n  // Naked function reference for surrogate-prototype-swapping.\n  var Ctor = function(){};\n\n  // Create a safe reference to the Underscore object for use below.\n  var _ = function(obj) {\n    if (obj instanceof _) return obj;\n    if (!(this instanceof _)) return new _(obj);\n    this._wrapped = obj;\n  };\n\n  // Export the Underscore object for **Node.js**, with\n  // backwards-compatibility for the old `require()` API. If we're in\n  // the browser, add `_` as a global object.\n  if (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports) {\n      exports = module.exports = _;\n    }\n    exports._ = _;\n  } else {\n    root._ = _;\n  }\n\n  // Current version.\n  _.VERSION = '1.8.3';\n\n  // Internal function that returns an efficient (for current engines) version\n  // of the passed-in callback, to be repeatedly applied in other Underscore\n  // functions.\n  var optimizeCb = function(func, context, argCount) {\n    if (context === void 0) return func;\n    switch (argCount == null ? 3 : argCount) {\n      case 1: return function(value) {\n        return func.call(context, value);\n      };\n      case 2: return function(value, other) {\n        return func.call(context, value, other);\n      };\n      case 3: return function(value, index, collection) {\n        return func.call(context, value, index, collection);\n      };\n      case 4: return function(accumulator, value, index, collection) {\n        return func.call(context, accumulator, value, index, collection);\n      };\n    }\n    return function() {\n      return func.apply(context, arguments);\n    };\n  };\n\n  // A mostly-internal function to generate callbacks that can be applied\n  // to each element in a collection, returning the desired result — either\n  // identity, an arbitrary callback, a property matcher, or a property accessor.\n  var cb = function(value, context, argCount) {\n    if (value == null) return _.identity;\n    if (_.isFunction(value)) return optimizeCb(value, context, argCount);\n    if (_.isObject(value)) return _.matcher(value);\n    return _.property(value);\n  };\n  _.iteratee = function(value, context) {\n    return cb(value, context, Infinity);\n  };\n\n  // An internal function for creating assigner functions.\n  var createAssigner = function(keysFunc, undefinedOnly) {\n    return function(obj) {\n      var length = arguments.length;\n      if (length < 2 || obj == null) return obj;\n      for (var index = 1; index < length; index++) {\n        var source = arguments[index],\n            keys = keysFunc(source),\n            l = keys.length;\n        for (var i = 0; i < l; i++) {\n          var key = keys[i];\n          if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];\n        }\n      }\n      return obj;\n    };\n  };\n\n  // An internal function for creating a new object that inherits from another.\n  var baseCreate = function(prototype) {\n    if (!_.isObject(prototype)) return {};\n    if (nativeCreate) return nativeCreate(prototype);\n    Ctor.prototype = prototype;\n    var result = new Ctor;\n    Ctor.prototype = null;\n    return result;\n  };\n\n  var property = function(key) {\n    return function(obj) {\n      return obj == null ? void 0 : obj[key];\n    };\n  };\n\n  // Helper for collection methods to determine whether a collection\n  // should be iterated as an array or as an object\n  // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\n  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\n  var getLength = property('length');\n  var isArrayLike = function(collection) {\n    var length = getLength(collection);\n    return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n  };\n\n  // Collection Functions\n  // --------------------\n\n  // The cornerstone, an `each` implementation, aka `forEach`.\n  // Handles raw objects in addition to array-likes. Treats all\n  // sparse array-likes as if they were dense.\n  _.each = _.forEach = function(obj, iteratee, context) {\n    iteratee = optimizeCb(iteratee, context);\n    var i, length;\n    if (isArrayLike(obj)) {\n      for (i = 0, length = obj.length; i < length; i++) {\n        iteratee(obj[i], i, obj);\n      }\n    } else {\n      var keys = _.keys(obj);\n      for (i = 0, length = keys.length; i < length; i++) {\n        iteratee(obj[keys[i]], keys[i], obj);\n      }\n    }\n    return obj;\n  };\n\n  // Return the results of applying the iteratee to each element.\n  _.map = _.collect = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length,\n        results = Array(length);\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      results[index] = iteratee(obj[currentKey], currentKey, obj);\n    }\n    return results;\n  };\n\n  // Create a reducing function iterating left or right.\n  function createReduce(dir) {\n    // Optimized iterator function as using arguments.length\n    // in the main function will deoptimize the, see #1991.\n    function iterator(obj, iteratee, memo, keys, index, length) {\n      for (; index >= 0 && index < length; index += dir) {\n        var currentKey = keys ? keys[index] : index;\n        memo = iteratee(memo, obj[currentKey], currentKey, obj);\n      }\n      return memo;\n    }\n\n    return function(obj, iteratee, memo, context) {\n      iteratee = optimizeCb(iteratee, context, 4);\n      var keys = !isArrayLike(obj) && _.keys(obj),\n          length = (keys || obj).length,\n          index = dir > 0 ? 0 : length - 1;\n      // Determine the initial value if none is provided.\n      if (arguments.length < 3) {\n        memo = obj[keys ? keys[index] : index];\n        index += dir;\n      }\n      return iterator(obj, iteratee, memo, keys, index, length);\n    };\n  }\n\n  // **Reduce** builds up a single result from a list of values, aka `inject`,\n  // or `foldl`.\n  _.reduce = _.foldl = _.inject = createReduce(1);\n\n  // The right-associative version of reduce, also known as `foldr`.\n  _.reduceRight = _.foldr = createReduce(-1);\n\n  // Return the first value which passes a truth test. Aliased as `detect`.\n  _.find = _.detect = function(obj, predicate, context) {\n    var key;\n    if (isArrayLike(obj)) {\n      key = _.findIndex(obj, predicate, context);\n    } else {\n      key = _.findKey(obj, predicate, context);\n    }\n    if (key !== void 0 && key !== -1) return obj[key];\n  };\n\n  // Return all the elements that pass a truth test.\n  // Aliased as `select`.\n  _.filter = _.select = function(obj, predicate, context) {\n    var results = [];\n    predicate = cb(predicate, context);\n    _.each(obj, function(value, index, list) {\n      if (predicate(value, index, list)) results.push(value);\n    });\n    return results;\n  };\n\n  // Return all the elements for which a truth test fails.\n  _.reject = function(obj, predicate, context) {\n    return _.filter(obj, _.negate(cb(predicate)), context);\n  };\n\n  // Determine whether all of the elements match a truth test.\n  // Aliased as `all`.\n  _.every = _.all = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length;\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      if (!predicate(obj[currentKey], currentKey, obj)) return false;\n    }\n    return true;\n  };\n\n  // Determine if at least one element in the object matches a truth test.\n  // Aliased as `any`.\n  _.some = _.any = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = !isArrayLike(obj) && _.keys(obj),\n        length = (keys || obj).length;\n    for (var index = 0; index < length; index++) {\n      var currentKey = keys ? keys[index] : index;\n      if (predicate(obj[currentKey], currentKey, obj)) return true;\n    }\n    return false;\n  };\n\n  // Determine if the array or object contains a given item (using `===`).\n  // Aliased as `includes` and `include`.\n  _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {\n    if (!isArrayLike(obj)) obj = _.values(obj);\n    if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n    return _.indexOf(obj, item, fromIndex) >= 0;\n  };\n\n  // Invoke a method (with arguments) on every item in a collection.\n  _.invoke = function(obj, method) {\n    var args = slice.call(arguments, 2);\n    var isFunc = _.isFunction(method);\n    return _.map(obj, function(value) {\n      var func = isFunc ? method : value[method];\n      return func == null ? func : func.apply(value, args);\n    });\n  };\n\n  // Convenience version of a common use case of `map`: fetching a property.\n  _.pluck = function(obj, key) {\n    return _.map(obj, _.property(key));\n  };\n\n  // Convenience version of a common use case of `filter`: selecting only objects\n  // containing specific `key:value` pairs.\n  _.where = function(obj, attrs) {\n    return _.filter(obj, _.matcher(attrs));\n  };\n\n  // Convenience version of a common use case of `find`: getting the first object\n  // containing specific `key:value` pairs.\n  _.findWhere = function(obj, attrs) {\n    return _.find(obj, _.matcher(attrs));\n  };\n\n  // Return the maximum element (or element-based computation).\n  _.max = function(obj, iteratee, context) {\n    var result = -Infinity, lastComputed = -Infinity,\n        value, computed;\n    if (iteratee == null && obj != null) {\n      obj = isArrayLike(obj) ? obj : _.values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value > result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index, list) {\n        computed = iteratee(value, index, list);\n        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {\n          result = value;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  };\n\n  // Return the minimum element (or element-based computation).\n  _.min = function(obj, iteratee, context) {\n    var result = Infinity, lastComputed = Infinity,\n        value, computed;\n    if (iteratee == null && obj != null) {\n      obj = isArrayLike(obj) ? obj : _.values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value < result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index, list) {\n        computed = iteratee(value, index, list);\n        if (computed < lastComputed || computed === Infinity && result === Infinity) {\n          result = value;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  };\n\n  // Shuffle a collection, using the modern version of the\n  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n  _.shuffle = function(obj) {\n    var set = isArrayLike(obj) ? obj : _.values(obj);\n    var length = set.length;\n    var shuffled = Array(length);\n    for (var index = 0, rand; index < length; index++) {\n      rand = _.random(0, index);\n      if (rand !== index) shuffled[index] = shuffled[rand];\n      shuffled[rand] = set[index];\n    }\n    return shuffled;\n  };\n\n  // Sample **n** random values from a collection.\n  // If **n** is not specified, returns a single random element.\n  // The internal `guard` argument allows it to work with `map`.\n  _.sample = function(obj, n, guard) {\n    if (n == null || guard) {\n      if (!isArrayLike(obj)) obj = _.values(obj);\n      return obj[_.random(obj.length - 1)];\n    }\n    return _.shuffle(obj).slice(0, Math.max(0, n));\n  };\n\n  // Sort the object's values by a criterion produced by an iteratee.\n  _.sortBy = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    return _.pluck(_.map(obj, function(value, index, list) {\n      return {\n        value: value,\n        index: index,\n        criteria: iteratee(value, index, list)\n      };\n    }).sort(function(left, right) {\n      var a = left.criteria;\n      var b = right.criteria;\n      if (a !== b) {\n        if (a > b || a === void 0) return 1;\n        if (a < b || b === void 0) return -1;\n      }\n      return left.index - right.index;\n    }), 'value');\n  };\n\n  // An internal function used for aggregate \"group by\" operations.\n  var group = function(behavior) {\n    return function(obj, iteratee, context) {\n      var result = {};\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index) {\n        var key = iteratee(value, index, obj);\n        behavior(result, value, key);\n      });\n      return result;\n    };\n  };\n\n  // Groups the object's values by a criterion. Pass either a string attribute\n  // to group by, or a function that returns the criterion.\n  _.groupBy = group(function(result, value, key) {\n    if (_.has(result, key)) result[key].push(value); else result[key] = [value];\n  });\n\n  // Indexes the object's values by a criterion, similar to `groupBy`, but for\n  // when you know that your index values will be unique.\n  _.indexBy = group(function(result, value, key) {\n    result[key] = value;\n  });\n\n  // Counts instances of an object that group by a certain criterion. Pass\n  // either a string attribute to count by, or a function that returns the\n  // criterion.\n  _.countBy = group(function(result, value, key) {\n    if (_.has(result, key)) result[key]++; else result[key] = 1;\n  });\n\n  // Safely create a real, live array from anything iterable.\n  _.toArray = function(obj) {\n    if (!obj) return [];\n    if (_.isArray(obj)) return slice.call(obj);\n    if (isArrayLike(obj)) return _.map(obj, _.identity);\n    return _.values(obj);\n  };\n\n  // Return the number of elements in an object.\n  _.size = function(obj) {\n    if (obj == null) return 0;\n    return isArrayLike(obj) ? obj.length : _.keys(obj).length;\n  };\n\n  // Split a collection into two arrays: one whose elements all satisfy the given\n  // predicate, and one whose elements all do not satisfy the predicate.\n  _.partition = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var pass = [], fail = [];\n    _.each(obj, function(value, key, obj) {\n      (predicate(value, key, obj) ? pass : fail).push(value);\n    });\n    return [pass, fail];\n  };\n\n  // Array Functions\n  // ---------------\n\n  // Get the first element of an array. Passing **n** will return the first N\n  // values in the array. Aliased as `head` and `take`. The **guard** check\n  // allows it to work with `_.map`.\n  _.first = _.head = _.take = function(array, n, guard) {\n    if (array == null) return void 0;\n    if (n == null || guard) return array[0];\n    return _.initial(array, array.length - n);\n  };\n\n  // Returns everything but the last entry of the array. Especially useful on\n  // the arguments object. Passing **n** will return all the values in\n  // the array, excluding the last N.\n  _.initial = function(array, n, guard) {\n    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n  };\n\n  // Get the last element of an array. Passing **n** will return the last N\n  // values in the array.\n  _.last = function(array, n, guard) {\n    if (array == null) return void 0;\n    if (n == null || guard) return array[array.length - 1];\n    return _.rest(array, Math.max(0, array.length - n));\n  };\n\n  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.\n  // Especially useful on the arguments object. Passing an **n** will return\n  // the rest N values in the array.\n  _.rest = _.tail = _.drop = function(array, n, guard) {\n    return slice.call(array, n == null || guard ? 1 : n);\n  };\n\n  // Trim out all falsy values from an array.\n  _.compact = function(array) {\n    return _.filter(array, _.identity);\n  };\n\n  // Internal implementation of a recursive `flatten` function.\n  var flatten = function(input, shallow, strict, startIndex) {\n    var output = [], idx = 0;\n    for (var i = startIndex || 0, length = getLength(input); i < length; i++) {\n      var value = input[i];\n      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {\n        //flatten current level of array or arguments object\n        if (!shallow) value = flatten(value, shallow, strict);\n        var j = 0, len = value.length;\n        output.length += len;\n        while (j < len) {\n          output[idx++] = value[j++];\n        }\n      } else if (!strict) {\n        output[idx++] = value;\n      }\n    }\n    return output;\n  };\n\n  // Flatten out an array, either recursively (by default), or just one level.\n  _.flatten = function(array, shallow) {\n    return flatten(array, shallow, false);\n  };\n\n  // Return a version of the array that does not contain the specified value(s).\n  _.without = function(array) {\n    return _.difference(array, slice.call(arguments, 1));\n  };\n\n  // Produce a duplicate-free version of the array. If the array has already\n  // been sorted, you have the option of using a faster algorithm.\n  // Aliased as `unique`.\n  _.uniq = _.unique = function(array, isSorted, iteratee, context) {\n    if (!_.isBoolean(isSorted)) {\n      context = iteratee;\n      iteratee = isSorted;\n      isSorted = false;\n    }\n    if (iteratee != null) iteratee = cb(iteratee, context);\n    var result = [];\n    var seen = [];\n    for (var i = 0, length = getLength(array); i < length; i++) {\n      var value = array[i],\n          computed = iteratee ? iteratee(value, i, array) : value;\n      if (isSorted) {\n        if (!i || seen !== computed) result.push(value);\n        seen = computed;\n      } else if (iteratee) {\n        if (!_.contains(seen, computed)) {\n          seen.push(computed);\n          result.push(value);\n        }\n      } else if (!_.contains(result, value)) {\n        result.push(value);\n      }\n    }\n    return result;\n  };\n\n  // Produce an array that contains the union: each distinct element from all of\n  // the passed-in arrays.\n  _.union = function() {\n    return _.uniq(flatten(arguments, true, true));\n  };\n\n  // Produce an array that contains every item shared between all the\n  // passed-in arrays.\n  _.intersection = function(array) {\n    var result = [];\n    var argsLength = arguments.length;\n    for (var i = 0, length = getLength(array); i < length; i++) {\n      var item = array[i];\n      if (_.contains(result, item)) continue;\n      for (var j = 1; j < argsLength; j++) {\n        if (!_.contains(arguments[j], item)) break;\n      }\n      if (j === argsLength) result.push(item);\n    }\n    return result;\n  };\n\n  // Take the difference between one array and a number of other arrays.\n  // Only the elements present in just the first array will remain.\n  _.difference = function(array) {\n    var rest = flatten(arguments, true, true, 1);\n    return _.filter(array, function(value){\n      return !_.contains(rest, value);\n    });\n  };\n\n  // Zip together multiple lists into a single array -- elements that share\n  // an index go together.\n  _.zip = function() {\n    return _.unzip(arguments);\n  };\n\n  // Complement of _.zip. Unzip accepts an array of arrays and groups\n  // each array's elements on shared indices\n  _.unzip = function(array) {\n    var length = array && _.max(array, getLength).length || 0;\n    var result = Array(length);\n\n    for (var index = 0; index < length; index++) {\n      result[index] = _.pluck(array, index);\n    }\n    return result;\n  };\n\n  // Converts lists into objects. Pass either a single array of `[key, value]`\n  // pairs, or two parallel arrays of the same length -- one of keys, and one of\n  // the corresponding values.\n  _.object = function(list, values) {\n    var result = {};\n    for (var i = 0, length = getLength(list); i < length; i++) {\n      if (values) {\n        result[list[i]] = values[i];\n      } else {\n        result[list[i][0]] = list[i][1];\n      }\n    }\n    return result;\n  };\n\n  // Generator function to create the findIndex and findLastIndex functions\n  function createPredicateIndexFinder(dir) {\n    return function(array, predicate, context) {\n      predicate = cb(predicate, context);\n      var length = getLength(array);\n      var index = dir > 0 ? 0 : length - 1;\n      for (; index >= 0 && index < length; index += dir) {\n        if (predicate(array[index], index, array)) return index;\n      }\n      return -1;\n    };\n  }\n\n  // Returns the first index on an array-like that passes a predicate test\n  _.findIndex = createPredicateIndexFinder(1);\n  _.findLastIndex = createPredicateIndexFinder(-1);\n\n  // Use a comparator function to figure out the smallest index at which\n  // an object should be inserted so as to maintain order. Uses binary search.\n  _.sortedIndex = function(array, obj, iteratee, context) {\n    iteratee = cb(iteratee, context, 1);\n    var value = iteratee(obj);\n    var low = 0, high = getLength(array);\n    while (low < high) {\n      var mid = Math.floor((low + high) / 2);\n      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n    }\n    return low;\n  };\n\n  // Generator function to create the indexOf and lastIndexOf functions\n  function createIndexFinder(dir, predicateFind, sortedIndex) {\n    return function(array, item, idx) {\n      var i = 0, length = getLength(array);\n      if (typeof idx == 'number') {\n        if (dir > 0) {\n            i = idx >= 0 ? idx : Math.max(idx + length, i);\n        } else {\n            length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n        }\n      } else if (sortedIndex && idx && length) {\n        idx = sortedIndex(array, item);\n        return array[idx] === item ? idx : -1;\n      }\n      if (item !== item) {\n        idx = predicateFind(slice.call(array, i, length), _.isNaN);\n        return idx >= 0 ? idx + i : -1;\n      }\n      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n        if (array[idx] === item) return idx;\n      }\n      return -1;\n    };\n  }\n\n  // Return the position of the first occurrence of an item in an array,\n  // or -1 if the item is not included in the array.\n  // If the array is large and already in sort order, pass `true`\n  // for **isSorted** to use binary search.\n  _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);\n  _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);\n\n  // Generate an integer Array containing an arithmetic progression. A port of\n  // the native Python `range()` function. See\n  // [the Python documentation](http://docs.python.org/library/functions.html#range).\n  _.range = function(start, stop, step) {\n    if (stop == null) {\n      stop = start || 0;\n      start = 0;\n    }\n    step = step || 1;\n\n    var length = Math.max(Math.ceil((stop - start) / step), 0);\n    var range = Array(length);\n\n    for (var idx = 0; idx < length; idx++, start += step) {\n      range[idx] = start;\n    }\n\n    return range;\n  };\n\n  // Function (ahem) Functions\n  // ------------------\n\n  // Determines whether to execute a function as a constructor\n  // or a normal function with the provided arguments\n  var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {\n    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n    var self = baseCreate(sourceFunc.prototype);\n    var result = sourceFunc.apply(self, args);\n    if (_.isObject(result)) return result;\n    return self;\n  };\n\n  // Create a function bound to a given object (assigning `this`, and arguments,\n  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n  // available.\n  _.bind = function(func, context) {\n    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');\n    var args = slice.call(arguments, 2);\n    var bound = function() {\n      return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));\n    };\n    return bound;\n  };\n\n  // Partially apply a function by creating a version that has had some of its\n  // arguments pre-filled, without changing its dynamic `this` context. _ acts\n  // as a placeholder, allowing any combination of arguments to be pre-filled.\n  _.partial = function(func) {\n    var boundArgs = slice.call(arguments, 1);\n    var bound = function() {\n      var position = 0, length = boundArgs.length;\n      var args = Array(length);\n      for (var i = 0; i < length; i++) {\n        args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];\n      }\n      while (position < arguments.length) args.push(arguments[position++]);\n      return executeBound(func, bound, this, this, args);\n    };\n    return bound;\n  };\n\n  // Bind a number of an object's methods to that object. Remaining arguments\n  // are the method names to be bound. Useful for ensuring that all callbacks\n  // defined on an object belong to it.\n  _.bindAll = function(obj) {\n    var i, length = arguments.length, key;\n    if (length <= 1) throw new Error('bindAll must be passed function names');\n    for (i = 1; i < length; i++) {\n      key = arguments[i];\n      obj[key] = _.bind(obj[key], obj);\n    }\n    return obj;\n  };\n\n  // Memoize an expensive function by storing its results.\n  _.memoize = function(func, hasher) {\n    var memoize = function(key) {\n      var cache = memoize.cache;\n      var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);\n      return cache[address];\n    };\n    memoize.cache = {};\n    return memoize;\n  };\n\n  // Delays a function for the given number of milliseconds, and then calls\n  // it with the arguments supplied.\n  _.delay = function(func, wait) {\n    var args = slice.call(arguments, 2);\n    return setTimeout(function(){\n      return func.apply(null, args);\n    }, wait);\n  };\n\n  // Defers a function, scheduling it to run after the current call stack has\n  // cleared.\n  _.defer = _.partial(_.delay, _, 1);\n\n  // Returns a function, that, when invoked, will only be triggered at most once\n  // during a given window of time. Normally, the throttled function will run\n  // as much as it can, without ever going more than once per `wait` duration;\n  // but if you'd like to disable the execution on the leading edge, pass\n  // `{leading: false}`. To disable execution on the trailing edge, ditto.\n  _.throttle = function(func, wait, options) {\n    var context, args, result;\n    var timeout = null;\n    var previous = 0;\n    if (!options) options = {};\n    var later = function() {\n      previous = options.leading === false ? 0 : _.now();\n      timeout = null;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    };\n    return function() {\n      var now = _.now();\n      if (!previous && options.leading === false) previous = now;\n      var remaining = wait - (now - previous);\n      context = this;\n      args = arguments;\n      if (remaining <= 0 || remaining > wait) {\n        if (timeout) {\n          clearTimeout(timeout);\n          timeout = null;\n        }\n        previous = now;\n        result = func.apply(context, args);\n        if (!timeout) context = args = null;\n      } else if (!timeout && options.trailing !== false) {\n        timeout = setTimeout(later, remaining);\n      }\n      return result;\n    };\n  };\n\n  // Returns a function, that, as long as it continues to be invoked, will not\n  // be triggered. The function will be called after it stops being called for\n  // N milliseconds. If `immediate` is passed, trigger the function on the\n  // leading edge, instead of the trailing.\n  _.debounce = function(func, wait, immediate) {\n    var timeout, args, context, timestamp, result;\n\n    var later = function() {\n      var last = _.now() - timestamp;\n\n      if (last < wait && last >= 0) {\n        timeout = setTimeout(later, wait - last);\n      } else {\n        timeout = null;\n        if (!immediate) {\n          result = func.apply(context, args);\n          if (!timeout) context = args = null;\n        }\n      }\n    };\n\n    return function() {\n      context = this;\n      args = arguments;\n      timestamp = _.now();\n      var callNow = immediate && !timeout;\n      if (!timeout) timeout = setTimeout(later, wait);\n      if (callNow) {\n        result = func.apply(context, args);\n        context = args = null;\n      }\n\n      return result;\n    };\n  };\n\n  // Returns the first function passed as an argument to the second,\n  // allowing you to adjust arguments, run code before and after, and\n  // conditionally execute the original function.\n  _.wrap = function(func, wrapper) {\n    return _.partial(wrapper, func);\n  };\n\n  // Returns a negated version of the passed-in predicate.\n  _.negate = function(predicate) {\n    return function() {\n      return !predicate.apply(this, arguments);\n    };\n  };\n\n  // Returns a function that is the composition of a list of functions, each\n  // consuming the return value of the function that follows.\n  _.compose = function() {\n    var args = arguments;\n    var start = args.length - 1;\n    return function() {\n      var i = start;\n      var result = args[start].apply(this, arguments);\n      while (i--) result = args[i].call(this, result);\n      return result;\n    };\n  };\n\n  // Returns a function that will only be executed on and after the Nth call.\n  _.after = function(times, func) {\n    return function() {\n      if (--times < 1) {\n        return func.apply(this, arguments);\n      }\n    };\n  };\n\n  // Returns a function that will only be executed up to (but not including) the Nth call.\n  _.before = function(times, func) {\n    var memo;\n    return function() {\n      if (--times > 0) {\n        memo = func.apply(this, arguments);\n      }\n      if (times <= 1) func = null;\n      return memo;\n    };\n  };\n\n  // Returns a function that will be executed at most one time, no matter how\n  // often you call it. Useful for lazy initialization.\n  _.once = _.partial(_.before, 2);\n\n  // Object Functions\n  // ----------------\n\n  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\n  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\n  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n                      'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\n  function collectNonEnumProps(obj, keys) {\n    var nonEnumIdx = nonEnumerableProps.length;\n    var constructor = obj.constructor;\n    var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;\n\n    // Constructor is a special case.\n    var prop = 'constructor';\n    if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);\n\n    while (nonEnumIdx--) {\n      prop = nonEnumerableProps[nonEnumIdx];\n      if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {\n        keys.push(prop);\n      }\n    }\n  }\n\n  // Retrieve the names of an object's own properties.\n  // Delegates to **ECMAScript 5**'s native `Object.keys`\n  _.keys = function(obj) {\n    if (!_.isObject(obj)) return [];\n    if (nativeKeys) return nativeKeys(obj);\n    var keys = [];\n    for (var key in obj) if (_.has(obj, key)) keys.push(key);\n    // Ahem, IE < 9.\n    if (hasEnumBug) collectNonEnumProps(obj, keys);\n    return keys;\n  };\n\n  // Retrieve all the property names of an object.\n  _.allKeys = function(obj) {\n    if (!_.isObject(obj)) return [];\n    var keys = [];\n    for (var key in obj) keys.push(key);\n    // Ahem, IE < 9.\n    if (hasEnumBug) collectNonEnumProps(obj, keys);\n    return keys;\n  };\n\n  // Retrieve the values of an object's properties.\n  _.values = function(obj) {\n    var keys = _.keys(obj);\n    var length = keys.length;\n    var values = Array(length);\n    for (var i = 0; i < length; i++) {\n      values[i] = obj[keys[i]];\n    }\n    return values;\n  };\n\n  // Returns the results of applying the iteratee to each element of the object\n  // In contrast to _.map it returns an object\n  _.mapObject = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    var keys =  _.keys(obj),\n          length = keys.length,\n          results = {},\n          currentKey;\n      for (var index = 0; index < length; index++) {\n        currentKey = keys[index];\n        results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n      }\n      return results;\n  };\n\n  // Convert an object into a list of `[key, value]` pairs.\n  _.pairs = function(obj) {\n    var keys = _.keys(obj);\n    var length = keys.length;\n    var pairs = Array(length);\n    for (var i = 0; i < length; i++) {\n      pairs[i] = [keys[i], obj[keys[i]]];\n    }\n    return pairs;\n  };\n\n  // Invert the keys and values of an object. The values must be serializable.\n  _.invert = function(obj) {\n    var result = {};\n    var keys = _.keys(obj);\n    for (var i = 0, length = keys.length; i < length; i++) {\n      result[obj[keys[i]]] = keys[i];\n    }\n    return result;\n  };\n\n  // Return a sorted list of the function names available on the object.\n  // Aliased as `methods`\n  _.functions = _.methods = function(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (_.isFunction(obj[key])) names.push(key);\n    }\n    return names.sort();\n  };\n\n  // Extend a given object with all the properties in passed-in object(s).\n  _.extend = createAssigner(_.allKeys);\n\n  // Assigns a given object with all the own properties in the passed-in object(s)\n  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\n  _.extendOwn = _.assign = createAssigner(_.keys);\n\n  // Returns the first key on an object that passes a predicate test\n  _.findKey = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var keys = _.keys(obj), key;\n    for (var i = 0, length = keys.length; i < length; i++) {\n      key = keys[i];\n      if (predicate(obj[key], key, obj)) return key;\n    }\n  };\n\n  // Return a copy of the object only containing the whitelisted properties.\n  _.pick = function(object, oiteratee, context) {\n    var result = {}, obj = object, iteratee, keys;\n    if (obj == null) return result;\n    if (_.isFunction(oiteratee)) {\n      keys = _.allKeys(obj);\n      iteratee = optimizeCb(oiteratee, context);\n    } else {\n      keys = flatten(arguments, false, false, 1);\n      iteratee = function(value, key, obj) { return key in obj; };\n      obj = Object(obj);\n    }\n    for (var i = 0, length = keys.length; i < length; i++) {\n      var key = keys[i];\n      var value = obj[key];\n      if (iteratee(value, key, obj)) result[key] = value;\n    }\n    return result;\n  };\n\n   // Return a copy of the object without the blacklisted properties.\n  _.omit = function(obj, iteratee, context) {\n    if (_.isFunction(iteratee)) {\n      iteratee = _.negate(iteratee);\n    } else {\n      var keys = _.map(flatten(arguments, false, false, 1), String);\n      iteratee = function(value, key) {\n        return !_.contains(keys, key);\n      };\n    }\n    return _.pick(obj, iteratee, context);\n  };\n\n  // Fill in a given object with default properties.\n  _.defaults = createAssigner(_.allKeys, true);\n\n  // Creates an object that inherits from the given prototype object.\n  // If additional properties are provided then they will be added to the\n  // created object.\n  _.create = function(prototype, props) {\n    var result = baseCreate(prototype);\n    if (props) _.extendOwn(result, props);\n    return result;\n  };\n\n  // Create a (shallow-cloned) duplicate of an object.\n  _.clone = function(obj) {\n    if (!_.isObject(obj)) return obj;\n    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n  };\n\n  // Invokes interceptor with the obj, and then returns obj.\n  // The primary purpose of this method is to \"tap into\" a method chain, in\n  // order to perform operations on intermediate results within the chain.\n  _.tap = function(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  };\n\n  // Returns whether an object has a given set of `key:value` pairs.\n  _.isMatch = function(object, attrs) {\n    var keys = _.keys(attrs), length = keys.length;\n    if (object == null) return !length;\n    var obj = Object(object);\n    for (var i = 0; i < length; i++) {\n      var key = keys[i];\n      if (attrs[key] !== obj[key] || !(key in obj)) return false;\n    }\n    return true;\n  };\n\n\n  // Internal recursive comparison function for `isEqual`.\n  var eq = function(a, b, aStack, bStack) {\n    // Identical objects are equal. `0 === -0`, but they aren't identical.\n    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).\n    if (a === b) return a !== 0 || 1 / a === 1 / b;\n    // A strict comparison is necessary because `null == undefined`.\n    if (a == null || b == null) return a === b;\n    // Unwrap any wrapped objects.\n    if (a instanceof _) a = a._wrapped;\n    if (b instanceof _) b = b._wrapped;\n    // Compare `[[Class]]` names.\n    var className = toString.call(a);\n    if (className !== toString.call(b)) return false;\n    switch (className) {\n      // Strings, numbers, regular expressions, dates, and booleans are compared by value.\n      case '[object RegExp]':\n      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n      case '[object String]':\n        // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n        // equivalent to `new String(\"5\")`.\n        return '' + a === '' + b;\n      case '[object Number]':\n        // `NaN`s are equivalent, but non-reflexive.\n        // Object(NaN) is equivalent to NaN\n        if (+a !== +a) return +b !== +b;\n        // An `egal` comparison is performed for other numeric values.\n        return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n      case '[object Date]':\n      case '[object Boolean]':\n        // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n        // millisecond representations. Note that invalid dates with millisecond representations\n        // of `NaN` are not equivalent.\n        return +a === +b;\n    }\n\n    var areArrays = className === '[object Array]';\n    if (!areArrays) {\n      if (typeof a != 'object' || typeof b != 'object') return false;\n\n      // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n      // from different frames are.\n      var aCtor = a.constructor, bCtor = b.constructor;\n      if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&\n                               _.isFunction(bCtor) && bCtor instanceof bCtor)\n                          && ('constructor' in a && 'constructor' in b)) {\n        return false;\n      }\n    }\n    // Assume equality for cyclic structures. The algorithm for detecting cyclic\n    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n    // Initializing stack of traversed objects.\n    // It's done here since we only need them for objects and arrays comparison.\n    aStack = aStack || [];\n    bStack = bStack || [];\n    var length = aStack.length;\n    while (length--) {\n      // Linear search. Performance is inversely proportional to the number of\n      // unique nested structures.\n      if (aStack[length] === a) return bStack[length] === b;\n    }\n\n    // Add the first object to the stack of traversed objects.\n    aStack.push(a);\n    bStack.push(b);\n\n    // Recursively compare objects and arrays.\n    if (areArrays) {\n      // Compare array lengths to determine if a deep comparison is necessary.\n      length = a.length;\n      if (length !== b.length) return false;\n      // Deep compare the contents, ignoring non-numeric properties.\n      while (length--) {\n        if (!eq(a[length], b[length], aStack, bStack)) return false;\n      }\n    } else {\n      // Deep compare objects.\n      var keys = _.keys(a), key;\n      length = keys.length;\n      // Ensure that both objects contain the same number of properties before comparing deep equality.\n      if (_.keys(b).length !== length) return false;\n      while (length--) {\n        // Deep compare each member\n        key = keys[length];\n        if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n      }\n    }\n    // Remove the first object from the stack of traversed objects.\n    aStack.pop();\n    bStack.pop();\n    return true;\n  };\n\n  // Perform a deep comparison to check if two objects are equal.\n  _.isEqual = function(a, b) {\n    return eq(a, b);\n  };\n\n  // Is a given array, string, or object empty?\n  // An \"empty\" object has no enumerable own-properties.\n  _.isEmpty = function(obj) {\n    if (obj == null) return true;\n    if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;\n    return _.keys(obj).length === 0;\n  };\n\n  // Is a given value a DOM element?\n  _.isElement = function(obj) {\n    return !!(obj && obj.nodeType === 1);\n  };\n\n  // Is a given value an array?\n  // Delegates to ECMA5's native Array.isArray\n  _.isArray = nativeIsArray || function(obj) {\n    return toString.call(obj) === '[object Array]';\n  };\n\n  // Is a given variable an object?\n  _.isObject = function(obj) {\n    var type = typeof obj;\n    return type === 'function' || type === 'object' && !!obj;\n  };\n\n  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.\n  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {\n    _['is' + name] = function(obj) {\n      return toString.call(obj) === '[object ' + name + ']';\n    };\n  });\n\n  // Define a fallback version of the method in browsers (ahem, IE < 9), where\n  // there isn't any inspectable \"Arguments\" type.\n  if (!_.isArguments(arguments)) {\n    _.isArguments = function(obj) {\n      return _.has(obj, 'callee');\n    };\n  }\n\n  // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,\n  // IE 11 (#1621), and in Safari 8 (#1929).\n  if (typeof /./ != 'function' && typeof Int8Array != 'object') {\n    _.isFunction = function(obj) {\n      return typeof obj == 'function' || false;\n    };\n  }\n\n  // Is a given object a finite number?\n  _.isFinite = function(obj) {\n    return isFinite(obj) && !isNaN(parseFloat(obj));\n  };\n\n  // Is the given value `NaN`? (NaN is the only number which does not equal itself).\n  _.isNaN = function(obj) {\n    return _.isNumber(obj) && obj !== +obj;\n  };\n\n  // Is a given value a boolean?\n  _.isBoolean = function(obj) {\n    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n  };\n\n  // Is a given value equal to null?\n  _.isNull = function(obj) {\n    return obj === null;\n  };\n\n  // Is a given variable undefined?\n  _.isUndefined = function(obj) {\n    return obj === void 0;\n  };\n\n  // Shortcut function for checking if an object has a given property directly\n  // on itself (in other words, not on a prototype).\n  _.has = function(obj, key) {\n    return obj != null && hasOwnProperty.call(obj, key);\n  };\n\n  // Utility Functions\n  // -----------------\n\n  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\n  // previous owner. Returns a reference to the Underscore object.\n  _.noConflict = function() {\n    root._ = previousUnderscore;\n    return this;\n  };\n\n  // Keep the identity function around for default iteratees.\n  _.identity = function(value) {\n    return value;\n  };\n\n  // Predicate-generating functions. Often useful outside of Underscore.\n  _.constant = function(value) {\n    return function() {\n      return value;\n    };\n  };\n\n  _.noop = function(){};\n\n  _.property = property;\n\n  // Generates a function for a given object that returns a given property.\n  _.propertyOf = function(obj) {\n    return obj == null ? function(){} : function(key) {\n      return obj[key];\n    };\n  };\n\n  // Returns a predicate for checking whether an object has a given set of\n  // `key:value` pairs.\n  _.matcher = _.matches = function(attrs) {\n    attrs = _.extendOwn({}, attrs);\n    return function(obj) {\n      return _.isMatch(obj, attrs);\n    };\n  };\n\n  // Run a function **n** times.\n  _.times = function(n, iteratee, context) {\n    var accum = Array(Math.max(0, n));\n    iteratee = optimizeCb(iteratee, context, 1);\n    for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n    return accum;\n  };\n\n  // Return a random integer between min and max (inclusive).\n  _.random = function(min, max) {\n    if (max == null) {\n      max = min;\n      min = 0;\n    }\n    return min + Math.floor(Math.random() * (max - min + 1));\n  };\n\n  // A (possibly faster) way to get the current timestamp as an integer.\n  _.now = Date.now || function() {\n    return new Date().getTime();\n  };\n\n   // List of HTML entities for escaping.\n  var escapeMap = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#x27;',\n    '`': '&#x60;'\n  };\n  var unescapeMap = _.invert(escapeMap);\n\n  // Functions for escaping and unescaping strings to/from HTML interpolation.\n  var createEscaper = function(map) {\n    var escaper = function(match) {\n      return map[match];\n    };\n    // Regexes for identifying a key that needs to be escaped\n    var source = '(?:' + _.keys(map).join('|') + ')';\n    var testRegexp = RegExp(source);\n    var replaceRegexp = RegExp(source, 'g');\n    return function(string) {\n      string = string == null ? '' : '' + string;\n      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n    };\n  };\n  _.escape = createEscaper(escapeMap);\n  _.unescape = createEscaper(unescapeMap);\n\n  // If the value of the named `property` is a function then invoke it with the\n  // `object` as context; otherwise, return it.\n  _.result = function(object, property, fallback) {\n    var value = object == null ? void 0 : object[property];\n    if (value === void 0) {\n      value = fallback;\n    }\n    return _.isFunction(value) ? value.call(object) : value;\n  };\n\n  // Generate a unique integer id (unique within the entire client session).\n  // Useful for temporary DOM ids.\n  var idCounter = 0;\n  _.uniqueId = function(prefix) {\n    var id = ++idCounter + '';\n    return prefix ? prefix + id : id;\n  };\n\n  // By default, Underscore uses ERB-style template delimiters, change the\n  // following template settings to use alternative delimiters.\n  _.templateSettings = {\n    evaluate    : /<%([\\s\\S]+?)%>/g,\n    interpolate : /<%=([\\s\\S]+?)%>/g,\n    escape      : /<%-([\\s\\S]+?)%>/g\n  };\n\n  // When customizing `templateSettings`, if you don't want to define an\n  // interpolation, evaluation or escaping regex, we need one that is\n  // guaranteed not to match.\n  var noMatch = /(.)^/;\n\n  // Certain characters need to be escaped so that they can be put into a\n  // string literal.\n  var escapes = {\n    \"'\":      \"'\",\n    '\\\\':     '\\\\',\n    '\\r':     'r',\n    '\\n':     'n',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  var escaper = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\n  var escapeChar = function(match) {\n    return '\\\\' + escapes[match];\n  };\n\n  // JavaScript micro-templating, similar to John Resig's implementation.\n  // Underscore templating handles arbitrary delimiters, preserves whitespace,\n  // and correctly escapes quotes within interpolated code.\n  // NB: `oldSettings` only exists for backwards compatibility.\n  _.template = function(text, settings, oldSettings) {\n    if (!settings && oldSettings) settings = oldSettings;\n    settings = _.defaults({}, settings, _.templateSettings);\n\n    // Combine delimiters into one regular expression via alternation.\n    var matcher = RegExp([\n      (settings.escape || noMatch).source,\n      (settings.interpolate || noMatch).source,\n      (settings.evaluate || noMatch).source\n    ].join('|') + '|$', 'g');\n\n    // Compile the template source, escaping string literals appropriately.\n    var index = 0;\n    var source = \"__p+='\";\n    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n      source += text.slice(index, offset).replace(escaper, escapeChar);\n      index = offset + match.length;\n\n      if (escape) {\n        source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n      } else if (interpolate) {\n        source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n      } else if (evaluate) {\n        source += \"';\\n\" + evaluate + \"\\n__p+='\";\n      }\n\n      // Adobe VMs need the match returned to produce the correct offest.\n      return match;\n    });\n    source += \"';\\n\";\n\n    // If a variable is not specified, place data values in local scope.\n    if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n    source = \"var __t,__p='',__j=Array.prototype.join,\" +\n      \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n      source + 'return __p;\\n';\n\n    try {\n      var render = new Function(settings.variable || 'obj', '_', source);\n    } catch (e) {\n      e.source = source;\n      throw e;\n    }\n\n    var template = function(data) {\n      return render.call(this, data, _);\n    };\n\n    // Provide the compiled source as a convenience for precompilation.\n    var argument = settings.variable || 'obj';\n    template.source = 'function(' + argument + '){\\n' + source + '}';\n\n    return template;\n  };\n\n  // Add a \"chain\" function. Start chaining a wrapped Underscore object.\n  _.chain = function(obj) {\n    var instance = _(obj);\n    instance._chain = true;\n    return instance;\n  };\n\n  // OOP\n  // ---------------\n  // If Underscore is called as a function, it returns a wrapped object that\n  // can be used OO-style. This wrapper holds altered versions of all the\n  // underscore functions. Wrapped objects may be chained.\n\n  // Helper function to continue chaining intermediate results.\n  var result = function(instance, obj) {\n    return instance._chain ? _(obj).chain() : obj;\n  };\n\n  // Add your own custom functions to the Underscore object.\n  _.mixin = function(obj) {\n    _.each(_.functions(obj), function(name) {\n      var func = _[name] = obj[name];\n      _.prototype[name] = function() {\n        var args = [this._wrapped];\n        push.apply(args, arguments);\n        return result(this, func.apply(_, args));\n      };\n    });\n  };\n\n  // Add all of the Underscore functions to the wrapper object.\n  _.mixin(_);\n\n  // Add all mutator Array functions to the wrapper.\n  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      var obj = this._wrapped;\n      method.apply(obj, arguments);\n      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];\n      return result(this, obj);\n    };\n  });\n\n  // Add all accessor Array functions to the wrapper.\n  _.each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      return result(this, method.apply(this._wrapped, arguments));\n    };\n  });\n\n  // Extracts the result from a wrapped and chained object.\n  _.prototype.value = function() {\n    return this._wrapped;\n  };\n\n  // Provide unwrapping proxy for some methods used in engine operations\n  // such as arithmetic and JSON stringification.\n  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;\n\n  _.prototype.toString = function() {\n    return '' + this._wrapped;\n  };\n\n  // AMD registration happens at the end for compatibility with AMD loaders\n  // that may not enforce next-turn semantics on modules. Even though general\n  // practice for AMD registration is to be anonymous, underscore registers\n  // as a named module because, like jQuery, it is a base library that is\n  // popular enough to be bundled in a third party lib, but not be part of\n  // an AMD load request. Those cases could generate an error when an\n  // anonymous define() is called outside of a loader request.\n  if (typeof define === 'function' && define.amd) {\n    define('underscore', [], function() {\n      return _;\n    });\n  }\n}.call(this));\n\n},{}],154:[function(require,module,exports){\n(function (global){\n\n/**\n * Module exports.\n */\n\nmodule.exports = deprecate;\n\n/**\n * Mark that a method should not be used.\n * Returns a modified function which warns once by default.\n *\n * If `localStorage.noDeprecation = true` is set, then it is a no-op.\n *\n * If `localStorage.throwDeprecation = true` is set, then deprecated functions\n * will throw an Error when invoked.\n *\n * If `localStorage.traceDeprecation = true` is set, then deprecated functions\n * will invoke `console.trace()` instead of `console.error()`.\n *\n * @param {Function} fn - the function to deprecate\n * @param {String} msg - the string to print to the console when `fn` is invoked\n * @returns {Function} a new \"deprecated\" version of `fn`\n * @api public\n */\n\nfunction deprecate (fn, msg) {\n  if (config('noDeprecation')) {\n    return fn;\n  }\n\n  var warned = false;\n  function deprecated() {\n    if (!warned) {\n      if (config('throwDeprecation')) {\n        throw new Error(msg);\n      } else if (config('traceDeprecation')) {\n        console.trace(msg);\n      } else {\n        console.warn(msg);\n      }\n      warned = true;\n    }\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n}\n\n/**\n * Checks `localStorage` for boolean values for the given `name`.\n *\n * @param {String} name\n * @returns {Boolean}\n * @api private\n */\n\nfunction config (name) {\n  // accessing global.localStorage can trigger a DOMException in sandboxed iframes\n  try {\n    if (!global.localStorage) return false;\n  } catch (_) {\n    return false;\n  }\n  var val = global.localStorage[name];\n  if (null == val) return false;\n  return String(val).toLowerCase() === 'true';\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],155:[function(require,module,exports){\narguments[4][81][0].apply(exports,arguments)\n},{\"dup\":81}],156:[function(require,module,exports){\nmodule.exports = function isBuffer(arg) {\n  return arg && typeof arg === 'object'\n    && typeof arg.copy === 'function'\n    && typeof arg.fill === 'function'\n    && typeof arg.readUInt8 === 'function';\n}\n},{}],157:[function(require,module,exports){\n(function (process,global){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n  if (!isString(f)) {\n    var objects = [];\n    for (var i = 0; i < arguments.length; i++) {\n      objects.push(inspect(arguments[i]));\n    }\n    return objects.join(' ');\n  }\n\n  var i = 1;\n  var args = arguments;\n  var len = args.length;\n  var str = String(f).replace(formatRegExp, function(x) {\n    if (x === '%%') return '%';\n    if (i >= len) return x;\n    switch (x) {\n      case '%s': return String(args[i++]);\n      case '%d': return Number(args[i++]);\n      case '%j':\n        try {\n          return JSON.stringify(args[i++]);\n        } catch (_) {\n          return '[Circular]';\n        }\n      default:\n        return x;\n    }\n  });\n  for (var x = args[i]; i < len; x = args[++i]) {\n    if (isNull(x) || !isObject(x)) {\n      str += ' ' + x;\n    } else {\n      str += ' ' + inspect(x);\n    }\n  }\n  return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n  // Allow for deprecating things in the process of starting up.\n  if (isUndefined(global.process)) {\n    return function() {\n      return exports.deprecate(fn, msg).apply(this, arguments);\n    };\n  }\n\n  if (process.noDeprecation === true) {\n    return fn;\n  }\n\n  var warned = false;\n  function deprecated() {\n    if (!warned) {\n      if (process.throwDeprecation) {\n        throw new Error(msg);\n      } else if (process.traceDeprecation) {\n        console.trace(msg);\n      } else {\n        console.error(msg);\n      }\n      warned = true;\n    }\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n  if (isUndefined(debugEnviron))\n    debugEnviron = process.env.NODE_DEBUG || '';\n  set = set.toUpperCase();\n  if (!debugs[set]) {\n    if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n      var pid = process.pid;\n      debugs[set] = function() {\n        var msg = exports.format.apply(exports, arguments);\n        console.error('%s %d: %s', set, pid, msg);\n      };\n    } else {\n      debugs[set] = function() {};\n    }\n  }\n  return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n  // default options\n  var ctx = {\n    seen: [],\n    stylize: stylizeNoColor\n  };\n  // legacy...\n  if (arguments.length >= 3) ctx.depth = arguments[2];\n  if (arguments.length >= 4) ctx.colors = arguments[3];\n  if (isBoolean(opts)) {\n    // legacy...\n    ctx.showHidden = opts;\n  } else if (opts) {\n    // got an \"options\" object\n    exports._extend(ctx, opts);\n  }\n  // set default options\n  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n  if (isUndefined(ctx.depth)) ctx.depth = 2;\n  if (isUndefined(ctx.colors)) ctx.colors = false;\n  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n  if (ctx.colors) ctx.stylize = stylizeWithColor;\n  return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n  'bold' : [1, 22],\n  'italic' : [3, 23],\n  'underline' : [4, 24],\n  'inverse' : [7, 27],\n  'white' : [37, 39],\n  'grey' : [90, 39],\n  'black' : [30, 39],\n  'blue' : [34, 39],\n  'cyan' : [36, 39],\n  'green' : [32, 39],\n  'magenta' : [35, 39],\n  'red' : [31, 39],\n  'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n  'special': 'cyan',\n  'number': 'yellow',\n  'boolean': 'yellow',\n  'undefined': 'grey',\n  'null': 'bold',\n  'string': 'green',\n  'date': 'magenta',\n  // \"name\": intentionally not styling\n  'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n  var style = inspect.styles[styleType];\n\n  if (style) {\n    return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n           '\\u001b[' + inspect.colors[style][1] + 'm';\n  } else {\n    return str;\n  }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n  return str;\n}\n\n\nfunction arrayToHash(array) {\n  var hash = {};\n\n  array.forEach(function(val, idx) {\n    hash[val] = true;\n  });\n\n  return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n  // Provide a hook for user-specified inspect functions.\n  // Check that value is an object with an inspect function on it\n  if (ctx.customInspect &&\n      value &&\n      isFunction(value.inspect) &&\n      // Filter out the util module, it's inspect function is special\n      value.inspect !== exports.inspect &&\n      // Also filter out any prototype objects using the circular check.\n      !(value.constructor && value.constructor.prototype === value)) {\n    var ret = value.inspect(recurseTimes, ctx);\n    if (!isString(ret)) {\n      ret = formatValue(ctx, ret, recurseTimes);\n    }\n    return ret;\n  }\n\n  // Primitive types cannot have properties\n  var primitive = formatPrimitive(ctx, value);\n  if (primitive) {\n    return primitive;\n  }\n\n  // Look up the keys of the object.\n  var keys = Object.keys(value);\n  var visibleKeys = arrayToHash(keys);\n\n  if (ctx.showHidden) {\n    keys = Object.getOwnPropertyNames(value);\n  }\n\n  // IE doesn't make error fields non-enumerable\n  // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n  if (isError(value)\n      && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n    return formatError(value);\n  }\n\n  // Some type of object without properties can be shortcutted.\n  if (keys.length === 0) {\n    if (isFunction(value)) {\n      var name = value.name ? ': ' + value.name : '';\n      return ctx.stylize('[Function' + name + ']', 'special');\n    }\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    }\n    if (isDate(value)) {\n      return ctx.stylize(Date.prototype.toString.call(value), 'date');\n    }\n    if (isError(value)) {\n      return formatError(value);\n    }\n  }\n\n  var base = '', array = false, braces = ['{', '}'];\n\n  // Make Array say that they are Array\n  if (isArray(value)) {\n    array = true;\n    braces = ['[', ']'];\n  }\n\n  // Make functions say that they are functions\n  if (isFunction(value)) {\n    var n = value.name ? ': ' + value.name : '';\n    base = ' [Function' + n + ']';\n  }\n\n  // Make RegExps say that they are RegExps\n  if (isRegExp(value)) {\n    base = ' ' + RegExp.prototype.toString.call(value);\n  }\n\n  // Make dates with properties first say the date\n  if (isDate(value)) {\n    base = ' ' + Date.prototype.toUTCString.call(value);\n  }\n\n  // Make error with message first say the error\n  if (isError(value)) {\n    base = ' ' + formatError(value);\n  }\n\n  if (keys.length === 0 && (!array || value.length == 0)) {\n    return braces[0] + base + braces[1];\n  }\n\n  if (recurseTimes < 0) {\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    } else {\n      return ctx.stylize('[Object]', 'special');\n    }\n  }\n\n  ctx.seen.push(value);\n\n  var output;\n  if (array) {\n    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n  } else {\n    output = keys.map(function(key) {\n      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n    });\n  }\n\n  ctx.seen.pop();\n\n  return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n  if (isUndefined(value))\n    return ctx.stylize('undefined', 'undefined');\n  if (isString(value)) {\n    var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n                                             .replace(/'/g, \"\\\\'\")\n                                             .replace(/\\\\\"/g, '\"') + '\\'';\n    return ctx.stylize(simple, 'string');\n  }\n  if (isNumber(value))\n    return ctx.stylize('' + value, 'number');\n  if (isBoolean(value))\n    return ctx.stylize('' + value, 'boolean');\n  // For some reason typeof null is \"object\", so special case here.\n  if (isNull(value))\n    return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n  return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n  var output = [];\n  for (var i = 0, l = value.length; i < l; ++i) {\n    if (hasOwnProperty(value, String(i))) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          String(i), true));\n    } else {\n      output.push('');\n    }\n  }\n  keys.forEach(function(key) {\n    if (!key.match(/^\\d+$/)) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          key, true));\n    }\n  });\n  return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n  var name, str, desc;\n  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n  if (desc.get) {\n    if (desc.set) {\n      str = ctx.stylize('[Getter/Setter]', 'special');\n    } else {\n      str = ctx.stylize('[Getter]', 'special');\n    }\n  } else {\n    if (desc.set) {\n      str = ctx.stylize('[Setter]', 'special');\n    }\n  }\n  if (!hasOwnProperty(visibleKeys, key)) {\n    name = '[' + key + ']';\n  }\n  if (!str) {\n    if (ctx.seen.indexOf(desc.value) < 0) {\n      if (isNull(recurseTimes)) {\n        str = formatValue(ctx, desc.value, null);\n      } else {\n        str = formatValue(ctx, desc.value, recurseTimes - 1);\n      }\n      if (str.indexOf('\\n') > -1) {\n        if (array) {\n          str = str.split('\\n').map(function(line) {\n            return '  ' + line;\n          }).join('\\n').substr(2);\n        } else {\n          str = '\\n' + str.split('\\n').map(function(line) {\n            return '   ' + line;\n          }).join('\\n');\n        }\n      }\n    } else {\n      str = ctx.stylize('[Circular]', 'special');\n    }\n  }\n  if (isUndefined(name)) {\n    if (array && key.match(/^\\d+$/)) {\n      return str;\n    }\n    name = JSON.stringify('' + key);\n    if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n      name = name.substr(1, name.length - 2);\n      name = ctx.stylize(name, 'name');\n    } else {\n      name = name.replace(/'/g, \"\\\\'\")\n                 .replace(/\\\\\"/g, '\"')\n                 .replace(/(^\"|\"$)/g, \"'\");\n      name = ctx.stylize(name, 'string');\n    }\n  }\n\n  return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n  var numLinesEst = 0;\n  var length = output.reduce(function(prev, cur) {\n    numLinesEst++;\n    if (cur.indexOf('\\n') >= 0) numLinesEst++;\n    return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n  }, 0);\n\n  if (length > 60) {\n    return braces[0] +\n           (base === '' ? '' : base + '\\n ') +\n           ' ' +\n           output.join(',\\n  ') +\n           ' ' +\n           braces[1];\n  }\n\n  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n  return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return isObject(e) &&\n      (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null ||\n         typeof arg === 'boolean' ||\n         typeof arg === 'number' ||\n         typeof arg === 'string' ||\n         typeof arg === 'symbol' ||  // ES6 symbol\n         typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n  return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n              'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n  var d = new Date();\n  var time = [pad(d.getHours()),\n              pad(d.getMinutes()),\n              pad(d.getSeconds())].join(':');\n  return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n *     prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n  // Don't do anything if add isn't an object\n  if (!add || !isObject(add)) return origin;\n\n  var keys = Object.keys(add);\n  var i = keys.length;\n  while (i--) {\n    origin[keys[i]] = add[keys[i]];\n  }\n  return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./support/isBuffer\":156,\"_process\":138,\"inherits\":155}],158:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var assign, getValue, isArray, isEmpty, isFunction, isObject, isPlainObject,\n    slice = [].slice,\n    hasProp = {}.hasOwnProperty;\n\n  assign = function() {\n    var i, key, len, source, sources, target;\n    target = arguments[0], sources = 2 <= arguments.length ? slice.call(arguments, 1) : [];\n    if (isFunction(Object.assign)) {\n      Object.assign.apply(null, arguments);\n    } else {\n      for (i = 0, len = sources.length; i < len; i++) {\n        source = sources[i];\n        if (source != null) {\n          for (key in source) {\n            if (!hasProp.call(source, key)) continue;\n            target[key] = source[key];\n          }\n        }\n      }\n    }\n    return target;\n  };\n\n  isFunction = function(val) {\n    return !!val && Object.prototype.toString.call(val) === '[object Function]';\n  };\n\n  isObject = function(val) {\n    var ref;\n    return !!val && ((ref = typeof val) === 'function' || ref === 'object');\n  };\n\n  isArray = function(val) {\n    if (isFunction(Array.isArray)) {\n      return Array.isArray(val);\n    } else {\n      return Object.prototype.toString.call(val) === '[object Array]';\n    }\n  };\n\n  isEmpty = function(val) {\n    var key;\n    if (isArray(val)) {\n      return !val.length;\n    } else {\n      for (key in val) {\n        if (!hasProp.call(val, key)) continue;\n        return false;\n      }\n      return true;\n    }\n  };\n\n  isPlainObject = function(val) {\n    var ctor, proto;\n    return isObject(val) && (proto = Object.getPrototypeOf(val)) && (ctor = proto.constructor) && (typeof ctor === 'function') && (ctor instanceof ctor) && (Function.prototype.toString.call(ctor) === Function.prototype.toString.call(Object));\n  };\n\n  getValue = function(obj) {\n    if (isFunction(obj.valueOf)) {\n      return obj.valueOf();\n    } else {\n      return obj;\n    }\n  };\n\n  module.exports.assign = assign;\n\n  module.exports.isFunction = isFunction;\n\n  module.exports.isObject = isObject;\n\n  module.exports.isArray = isArray;\n\n  module.exports.isEmpty = isEmpty;\n\n  module.exports.isPlainObject = isPlainObject;\n\n  module.exports.getValue = getValue;\n\n}).call(this);\n\n},{}],159:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLAttribute;\n\n  module.exports = XMLAttribute = (function() {\n    function XMLAttribute(parent, name, value) {\n      this.options = parent.options;\n      this.stringify = parent.stringify;\n      this.parent = parent;\n      if (name == null) {\n        throw new Error(\"Missing attribute name. \" + this.debugInfo(name));\n      }\n      if (value == null) {\n        throw new Error(\"Missing attribute value. \" + this.debugInfo(name));\n      }\n      this.name = this.stringify.attName(name);\n      this.value = this.stringify.attValue(value);\n    }\n\n    XMLAttribute.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLAttribute.prototype.toString = function(options) {\n      return this.options.writer.set(options).attribute(this);\n    };\n\n    XMLAttribute.prototype.debugInfo = function(name) {\n      var ref, ref1;\n      name = name || this.name;\n      if ((name == null) && !((ref = this.parent) != null ? ref.name : void 0)) {\n        return \"\";\n      } else if (name == null) {\n        return \"parent: <\" + this.parent.name + \">\";\n      } else if (!((ref1 = this.parent) != null ? ref1.name : void 0)) {\n        return \"attribute: {\" + name + \"}\";\n      } else {\n        return \"attribute: {\" + name + \"}, parent: <\" + this.parent.name + \">\";\n      }\n    };\n\n    return XMLAttribute;\n\n  })();\n\n}).call(this);\n\n},{}],160:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLCData, XMLNode,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLCData = (function(superClass) {\n    extend(XMLCData, superClass);\n\n    function XMLCData(parent, text) {\n      XMLCData.__super__.constructor.call(this, parent);\n      if (text == null) {\n        throw new Error(\"Missing CDATA text. \" + this.debugInfo());\n      }\n      this.text = this.stringify.cdata(text);\n    }\n\n    XMLCData.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLCData.prototype.toString = function(options) {\n      return this.options.writer.set(options).cdata(this);\n    };\n\n    return XMLCData;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],161:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLComment, XMLNode,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLComment = (function(superClass) {\n    extend(XMLComment, superClass);\n\n    function XMLComment(parent, text) {\n      XMLComment.__super__.constructor.call(this, parent);\n      if (text == null) {\n        throw new Error(\"Missing comment text. \" + this.debugInfo());\n      }\n      this.text = this.stringify.comment(text);\n    }\n\n    XMLComment.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLComment.prototype.toString = function(options) {\n      return this.options.writer.set(options).comment(this);\n    };\n\n    return XMLComment;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],162:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDTDAttList, XMLNode,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLDTDAttList = (function(superClass) {\n    extend(XMLDTDAttList, superClass);\n\n    function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) {\n      XMLDTDAttList.__super__.constructor.call(this, parent);\n      if (elementName == null) {\n        throw new Error(\"Missing DTD element name. \" + this.debugInfo());\n      }\n      if (attributeName == null) {\n        throw new Error(\"Missing DTD attribute name. \" + this.debugInfo(elementName));\n      }\n      if (!attributeType) {\n        throw new Error(\"Missing DTD attribute type. \" + this.debugInfo(elementName));\n      }\n      if (!defaultValueType) {\n        throw new Error(\"Missing DTD attribute default. \" + this.debugInfo(elementName));\n      }\n      if (defaultValueType.indexOf('#') !== 0) {\n        defaultValueType = '#' + defaultValueType;\n      }\n      if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) {\n        throw new Error(\"Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT. \" + this.debugInfo(elementName));\n      }\n      if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) {\n        throw new Error(\"Default value only applies to #FIXED or #DEFAULT. \" + this.debugInfo(elementName));\n      }\n      this.elementName = this.stringify.eleName(elementName);\n      this.attributeName = this.stringify.attName(attributeName);\n      this.attributeType = this.stringify.dtdAttType(attributeType);\n      this.defaultValue = this.stringify.dtdAttDefault(defaultValue);\n      this.defaultValueType = defaultValueType;\n    }\n\n    XMLDTDAttList.prototype.toString = function(options) {\n      return this.options.writer.set(options).dtdAttList(this);\n    };\n\n    return XMLDTDAttList;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],163:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDTDElement, XMLNode,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLDTDElement = (function(superClass) {\n    extend(XMLDTDElement, superClass);\n\n    function XMLDTDElement(parent, name, value) {\n      XMLDTDElement.__super__.constructor.call(this, parent);\n      if (name == null) {\n        throw new Error(\"Missing DTD element name. \" + this.debugInfo());\n      }\n      if (!value) {\n        value = '(#PCDATA)';\n      }\n      if (Array.isArray(value)) {\n        value = '(' + value.join(',') + ')';\n      }\n      this.name = this.stringify.eleName(name);\n      this.value = this.stringify.dtdElementValue(value);\n    }\n\n    XMLDTDElement.prototype.toString = function(options) {\n      return this.options.writer.set(options).dtdElement(this);\n    };\n\n    return XMLDTDElement;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],164:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDTDEntity, XMLNode, isObject,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  isObject = require('./Utility').isObject;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLDTDEntity = (function(superClass) {\n    extend(XMLDTDEntity, superClass);\n\n    function XMLDTDEntity(parent, pe, name, value) {\n      XMLDTDEntity.__super__.constructor.call(this, parent);\n      if (name == null) {\n        throw new Error(\"Missing DTD entity name. \" + this.debugInfo(name));\n      }\n      if (value == null) {\n        throw new Error(\"Missing DTD entity value. \" + this.debugInfo(name));\n      }\n      this.pe = !!pe;\n      this.name = this.stringify.eleName(name);\n      if (!isObject(value)) {\n        this.value = this.stringify.dtdEntityValue(value);\n      } else {\n        if (!value.pubID && !value.sysID) {\n          throw new Error(\"Public and/or system identifiers are required for an external entity. \" + this.debugInfo(name));\n        }\n        if (value.pubID && !value.sysID) {\n          throw new Error(\"System identifier is required for a public external entity. \" + this.debugInfo(name));\n        }\n        if (value.pubID != null) {\n          this.pubID = this.stringify.dtdPubID(value.pubID);\n        }\n        if (value.sysID != null) {\n          this.sysID = this.stringify.dtdSysID(value.sysID);\n        }\n        if (value.nData != null) {\n          this.nData = this.stringify.dtdNData(value.nData);\n        }\n        if (this.pe && this.nData) {\n          throw new Error(\"Notation declaration is not allowed in a parameter entity. \" + this.debugInfo(name));\n        }\n      }\n    }\n\n    XMLDTDEntity.prototype.toString = function(options) {\n      return this.options.writer.set(options).dtdEntity(this);\n    };\n\n    return XMLDTDEntity;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLNode\":171}],165:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDTDNotation, XMLNode,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLDTDNotation = (function(superClass) {\n    extend(XMLDTDNotation, superClass);\n\n    function XMLDTDNotation(parent, name, value) {\n      XMLDTDNotation.__super__.constructor.call(this, parent);\n      if (name == null) {\n        throw new Error(\"Missing DTD notation name. \" + this.debugInfo(name));\n      }\n      if (!value.pubID && !value.sysID) {\n        throw new Error(\"Public or system identifiers are required for an external entity. \" + this.debugInfo(name));\n      }\n      this.name = this.stringify.eleName(name);\n      if (value.pubID != null) {\n        this.pubID = this.stringify.dtdPubID(value.pubID);\n      }\n      if (value.sysID != null) {\n        this.sysID = this.stringify.dtdSysID(value.sysID);\n      }\n    }\n\n    XMLDTDNotation.prototype.toString = function(options) {\n      return this.options.writer.set(options).dtdNotation(this);\n    };\n\n    return XMLDTDNotation;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],166:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDeclaration, XMLNode, isObject,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  isObject = require('./Utility').isObject;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLDeclaration = (function(superClass) {\n    extend(XMLDeclaration, superClass);\n\n    function XMLDeclaration(parent, version, encoding, standalone) {\n      var ref;\n      XMLDeclaration.__super__.constructor.call(this, parent);\n      if (isObject(version)) {\n        ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone;\n      }\n      if (!version) {\n        version = '1.0';\n      }\n      this.version = this.stringify.xmlVersion(version);\n      if (encoding != null) {\n        this.encoding = this.stringify.xmlEncoding(encoding);\n      }\n      if (standalone != null) {\n        this.standalone = this.stringify.xmlStandalone(standalone);\n      }\n    }\n\n    XMLDeclaration.prototype.toString = function(options) {\n      return this.options.writer.set(options).declaration(this);\n    };\n\n    return XMLDeclaration;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLNode\":171}],167:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLNode, isObject,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  isObject = require('./Utility').isObject;\n\n  XMLNode = require('./XMLNode');\n\n  XMLDTDAttList = require('./XMLDTDAttList');\n\n  XMLDTDEntity = require('./XMLDTDEntity');\n\n  XMLDTDElement = require('./XMLDTDElement');\n\n  XMLDTDNotation = require('./XMLDTDNotation');\n\n  module.exports = XMLDocType = (function(superClass) {\n    extend(XMLDocType, superClass);\n\n    function XMLDocType(parent, pubID, sysID) {\n      var ref, ref1;\n      XMLDocType.__super__.constructor.call(this, parent);\n      this.name = \"!DOCTYPE\";\n      this.documentObject = parent;\n      if (isObject(pubID)) {\n        ref = pubID, pubID = ref.pubID, sysID = ref.sysID;\n      }\n      if (sysID == null) {\n        ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1];\n      }\n      if (pubID != null) {\n        this.pubID = this.stringify.dtdPubID(pubID);\n      }\n      if (sysID != null) {\n        this.sysID = this.stringify.dtdSysID(sysID);\n      }\n    }\n\n    XMLDocType.prototype.element = function(name, value) {\n      var child;\n      child = new XMLDTDElement(this, name, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {\n      var child;\n      child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLDocType.prototype.entity = function(name, value) {\n      var child;\n      child = new XMLDTDEntity(this, false, name, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLDocType.prototype.pEntity = function(name, value) {\n      var child;\n      child = new XMLDTDEntity(this, true, name, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLDocType.prototype.notation = function(name, value) {\n      var child;\n      child = new XMLDTDNotation(this, name, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLDocType.prototype.toString = function(options) {\n      return this.options.writer.set(options).docType(this);\n    };\n\n    XMLDocType.prototype.ele = function(name, value) {\n      return this.element(name, value);\n    };\n\n    XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {\n      return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue);\n    };\n\n    XMLDocType.prototype.ent = function(name, value) {\n      return this.entity(name, value);\n    };\n\n    XMLDocType.prototype.pent = function(name, value) {\n      return this.pEntity(name, value);\n    };\n\n    XMLDocType.prototype.not = function(name, value) {\n      return this.notation(name, value);\n    };\n\n    XMLDocType.prototype.up = function() {\n      return this.root() || this.documentObject;\n    };\n\n    return XMLDocType;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLDTDAttList\":162,\"./XMLDTDElement\":163,\"./XMLDTDEntity\":164,\"./XMLDTDNotation\":165,\"./XMLNode\":171}],168:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDocument, XMLNode, XMLStringWriter, XMLStringifier, isPlainObject,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  isPlainObject = require('./Utility').isPlainObject;\n\n  XMLNode = require('./XMLNode');\n\n  XMLStringifier = require('./XMLStringifier');\n\n  XMLStringWriter = require('./XMLStringWriter');\n\n  module.exports = XMLDocument = (function(superClass) {\n    extend(XMLDocument, superClass);\n\n    function XMLDocument(options) {\n      XMLDocument.__super__.constructor.call(this, null);\n      this.name = \"?xml\";\n      options || (options = {});\n      if (!options.writer) {\n        options.writer = new XMLStringWriter();\n      }\n      this.options = options;\n      this.stringify = new XMLStringifier(options);\n      this.isDocument = true;\n    }\n\n    XMLDocument.prototype.end = function(writer) {\n      var writerOptions;\n      if (!writer) {\n        writer = this.options.writer;\n      } else if (isPlainObject(writer)) {\n        writerOptions = writer;\n        writer = this.options.writer.set(writerOptions);\n      }\n      return writer.document(this);\n    };\n\n    XMLDocument.prototype.toString = function(options) {\n      return this.options.writer.set(options).document(this);\n    };\n\n    return XMLDocument;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLNode\":171,\"./XMLStringWriter\":175,\"./XMLStringifier\":176}],169:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLAttribute, XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLDocumentCB, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLStringifier, XMLText, getValue, isFunction, isObject, isPlainObject, ref,\n    hasProp = {}.hasOwnProperty;\n\n  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isPlainObject = ref.isPlainObject, getValue = ref.getValue;\n\n  XMLElement = require('./XMLElement');\n\n  XMLCData = require('./XMLCData');\n\n  XMLComment = require('./XMLComment');\n\n  XMLRaw = require('./XMLRaw');\n\n  XMLText = require('./XMLText');\n\n  XMLProcessingInstruction = require('./XMLProcessingInstruction');\n\n  XMLDeclaration = require('./XMLDeclaration');\n\n  XMLDocType = require('./XMLDocType');\n\n  XMLDTDAttList = require('./XMLDTDAttList');\n\n  XMLDTDEntity = require('./XMLDTDEntity');\n\n  XMLDTDElement = require('./XMLDTDElement');\n\n  XMLDTDNotation = require('./XMLDTDNotation');\n\n  XMLAttribute = require('./XMLAttribute');\n\n  XMLStringifier = require('./XMLStringifier');\n\n  XMLStringWriter = require('./XMLStringWriter');\n\n  module.exports = XMLDocumentCB = (function() {\n    function XMLDocumentCB(options, onData, onEnd) {\n      var writerOptions;\n      this.name = \"?xml\";\n      options || (options = {});\n      if (!options.writer) {\n        options.writer = new XMLStringWriter(options);\n      } else if (isPlainObject(options.writer)) {\n        writerOptions = options.writer;\n        options.writer = new XMLStringWriter(writerOptions);\n      }\n      this.options = options;\n      this.writer = options.writer;\n      this.stringify = new XMLStringifier(options);\n      this.onDataCallback = onData || function() {};\n      this.onEndCallback = onEnd || function() {};\n      this.currentNode = null;\n      this.currentLevel = -1;\n      this.openTags = {};\n      this.documentStarted = false;\n      this.documentCompleted = false;\n      this.root = null;\n    }\n\n    XMLDocumentCB.prototype.node = function(name, attributes, text) {\n      var ref1;\n      if (name == null) {\n        throw new Error(\"Missing node name.\");\n      }\n      if (this.root && this.currentLevel === -1) {\n        throw new Error(\"Document can only have one root node. \" + this.debugInfo(name));\n      }\n      this.openCurrent();\n      name = getValue(name);\n      if (attributes == null) {\n        attributes = {};\n      }\n      attributes = getValue(attributes);\n      if (!isObject(attributes)) {\n        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];\n      }\n      this.currentNode = new XMLElement(this, name, attributes);\n      this.currentNode.children = false;\n      this.currentLevel++;\n      this.openTags[this.currentLevel] = this.currentNode;\n      if (text != null) {\n        this.text(text);\n      }\n      return this;\n    };\n\n    XMLDocumentCB.prototype.element = function(name, attributes, text) {\n      if (this.currentNode && this.currentNode instanceof XMLDocType) {\n        return this.dtdElement.apply(this, arguments);\n      } else {\n        return this.node(name, attributes, text);\n      }\n    };\n\n    XMLDocumentCB.prototype.attribute = function(name, value) {\n      var attName, attValue;\n      if (!this.currentNode || this.currentNode.children) {\n        throw new Error(\"att() can only be used immediately after an ele() call in callback mode. \" + this.debugInfo(name));\n      }\n      if (name != null) {\n        name = getValue(name);\n      }\n      if (isObject(name)) {\n        for (attName in name) {\n          if (!hasProp.call(name, attName)) continue;\n          attValue = name[attName];\n          this.attribute(attName, attValue);\n        }\n      } else {\n        if (isFunction(value)) {\n          value = value.apply();\n        }\n        if (!this.options.skipNullAttributes || (value != null)) {\n          this.currentNode.attributes[name] = new XMLAttribute(this, name, value);\n        }\n      }\n      return this;\n    };\n\n    XMLDocumentCB.prototype.text = function(value) {\n      var node;\n      this.openCurrent();\n      node = new XMLText(this, value);\n      this.onData(this.writer.text(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.cdata = function(value) {\n      var node;\n      this.openCurrent();\n      node = new XMLCData(this, value);\n      this.onData(this.writer.cdata(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.comment = function(value) {\n      var node;\n      this.openCurrent();\n      node = new XMLComment(this, value);\n      this.onData(this.writer.comment(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.raw = function(value) {\n      var node;\n      this.openCurrent();\n      node = new XMLRaw(this, value);\n      this.onData(this.writer.raw(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.instruction = function(target, value) {\n      var i, insTarget, insValue, len, node;\n      this.openCurrent();\n      if (target != null) {\n        target = getValue(target);\n      }\n      if (value != null) {\n        value = getValue(value);\n      }\n      if (Array.isArray(target)) {\n        for (i = 0, len = target.length; i < len; i++) {\n          insTarget = target[i];\n          this.instruction(insTarget);\n        }\n      } else if (isObject(target)) {\n        for (insTarget in target) {\n          if (!hasProp.call(target, insTarget)) continue;\n          insValue = target[insTarget];\n          this.instruction(insTarget, insValue);\n        }\n      } else {\n        if (isFunction(value)) {\n          value = value.apply();\n        }\n        node = new XMLProcessingInstruction(this, target, value);\n        this.onData(this.writer.processingInstruction(node, this.currentLevel + 1), this.currentLevel + 1);\n      }\n      return this;\n    };\n\n    XMLDocumentCB.prototype.declaration = function(version, encoding, standalone) {\n      var node;\n      this.openCurrent();\n      if (this.documentStarted) {\n        throw new Error(\"declaration() must be the first node.\");\n      }\n      node = new XMLDeclaration(this, version, encoding, standalone);\n      this.onData(this.writer.declaration(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.doctype = function(root, pubID, sysID) {\n      this.openCurrent();\n      if (root == null) {\n        throw new Error(\"Missing root node name.\");\n      }\n      if (this.root) {\n        throw new Error(\"dtd() must come before the root node.\");\n      }\n      this.currentNode = new XMLDocType(this, pubID, sysID);\n      this.currentNode.rootNodeName = root;\n      this.currentNode.children = false;\n      this.currentLevel++;\n      this.openTags[this.currentLevel] = this.currentNode;\n      return this;\n    };\n\n    XMLDocumentCB.prototype.dtdElement = function(name, value) {\n      var node;\n      this.openCurrent();\n      node = new XMLDTDElement(this, name, value);\n      this.onData(this.writer.dtdElement(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {\n      var node;\n      this.openCurrent();\n      node = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);\n      this.onData(this.writer.dtdAttList(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.entity = function(name, value) {\n      var node;\n      this.openCurrent();\n      node = new XMLDTDEntity(this, false, name, value);\n      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.pEntity = function(name, value) {\n      var node;\n      this.openCurrent();\n      node = new XMLDTDEntity(this, true, name, value);\n      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.notation = function(name, value) {\n      var node;\n      this.openCurrent();\n      node = new XMLDTDNotation(this, name, value);\n      this.onData(this.writer.dtdNotation(node, this.currentLevel + 1), this.currentLevel + 1);\n      return this;\n    };\n\n    XMLDocumentCB.prototype.up = function() {\n      if (this.currentLevel < 0) {\n        throw new Error(\"The document node has no parent.\");\n      }\n      if (this.currentNode) {\n        if (this.currentNode.children) {\n          this.closeNode(this.currentNode);\n        } else {\n          this.openNode(this.currentNode);\n        }\n        this.currentNode = null;\n      } else {\n        this.closeNode(this.openTags[this.currentLevel]);\n      }\n      delete this.openTags[this.currentLevel];\n      this.currentLevel--;\n      return this;\n    };\n\n    XMLDocumentCB.prototype.end = function() {\n      while (this.currentLevel >= 0) {\n        this.up();\n      }\n      return this.onEnd();\n    };\n\n    XMLDocumentCB.prototype.openCurrent = function() {\n      if (this.currentNode) {\n        this.currentNode.children = true;\n        return this.openNode(this.currentNode);\n      }\n    };\n\n    XMLDocumentCB.prototype.openNode = function(node) {\n      if (!node.isOpen) {\n        if (!this.root && this.currentLevel === 0 && node instanceof XMLElement) {\n          this.root = node;\n        }\n        this.onData(this.writer.openNode(node, this.currentLevel), this.currentLevel);\n        return node.isOpen = true;\n      }\n    };\n\n    XMLDocumentCB.prototype.closeNode = function(node) {\n      if (!node.isClosed) {\n        this.onData(this.writer.closeNode(node, this.currentLevel), this.currentLevel);\n        return node.isClosed = true;\n      }\n    };\n\n    XMLDocumentCB.prototype.onData = function(chunk, level) {\n      this.documentStarted = true;\n      return this.onDataCallback(chunk, level + 1);\n    };\n\n    XMLDocumentCB.prototype.onEnd = function() {\n      this.documentCompleted = true;\n      return this.onEndCallback();\n    };\n\n    XMLDocumentCB.prototype.debugInfo = function(name) {\n      if (name == null) {\n        return \"\";\n      } else {\n        return \"node: <\" + name + \">\";\n      }\n    };\n\n    XMLDocumentCB.prototype.ele = function() {\n      return this.element.apply(this, arguments);\n    };\n\n    XMLDocumentCB.prototype.nod = function(name, attributes, text) {\n      return this.node(name, attributes, text);\n    };\n\n    XMLDocumentCB.prototype.txt = function(value) {\n      return this.text(value);\n    };\n\n    XMLDocumentCB.prototype.dat = function(value) {\n      return this.cdata(value);\n    };\n\n    XMLDocumentCB.prototype.com = function(value) {\n      return this.comment(value);\n    };\n\n    XMLDocumentCB.prototype.ins = function(target, value) {\n      return this.instruction(target, value);\n    };\n\n    XMLDocumentCB.prototype.dec = function(version, encoding, standalone) {\n      return this.declaration(version, encoding, standalone);\n    };\n\n    XMLDocumentCB.prototype.dtd = function(root, pubID, sysID) {\n      return this.doctype(root, pubID, sysID);\n    };\n\n    XMLDocumentCB.prototype.e = function(name, attributes, text) {\n      return this.element(name, attributes, text);\n    };\n\n    XMLDocumentCB.prototype.n = function(name, attributes, text) {\n      return this.node(name, attributes, text);\n    };\n\n    XMLDocumentCB.prototype.t = function(value) {\n      return this.text(value);\n    };\n\n    XMLDocumentCB.prototype.d = function(value) {\n      return this.cdata(value);\n    };\n\n    XMLDocumentCB.prototype.c = function(value) {\n      return this.comment(value);\n    };\n\n    XMLDocumentCB.prototype.r = function(value) {\n      return this.raw(value);\n    };\n\n    XMLDocumentCB.prototype.i = function(target, value) {\n      return this.instruction(target, value);\n    };\n\n    XMLDocumentCB.prototype.att = function() {\n      if (this.currentNode && this.currentNode instanceof XMLDocType) {\n        return this.attList.apply(this, arguments);\n      } else {\n        return this.attribute.apply(this, arguments);\n      }\n    };\n\n    XMLDocumentCB.prototype.a = function() {\n      if (this.currentNode && this.currentNode instanceof XMLDocType) {\n        return this.attList.apply(this, arguments);\n      } else {\n        return this.attribute.apply(this, arguments);\n      }\n    };\n\n    XMLDocumentCB.prototype.ent = function(name, value) {\n      return this.entity(name, value);\n    };\n\n    XMLDocumentCB.prototype.pent = function(name, value) {\n      return this.pEntity(name, value);\n    };\n\n    XMLDocumentCB.prototype.not = function(name, value) {\n      return this.notation(name, value);\n    };\n\n    return XMLDocumentCB;\n\n  })();\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLAttribute\":159,\"./XMLCData\":160,\"./XMLComment\":161,\"./XMLDTDAttList\":162,\"./XMLDTDElement\":163,\"./XMLDTDEntity\":164,\"./XMLDTDNotation\":165,\"./XMLDeclaration\":166,\"./XMLDocType\":167,\"./XMLElement\":170,\"./XMLProcessingInstruction\":172,\"./XMLRaw\":173,\"./XMLStringWriter\":175,\"./XMLStringifier\":176,\"./XMLText\":177}],170:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLAttribute, XMLElement, XMLNode, getValue, isFunction, isObject, ref,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, getValue = ref.getValue;\n\n  XMLNode = require('./XMLNode');\n\n  XMLAttribute = require('./XMLAttribute');\n\n  module.exports = XMLElement = (function(superClass) {\n    extend(XMLElement, superClass);\n\n    function XMLElement(parent, name, attributes) {\n      XMLElement.__super__.constructor.call(this, parent);\n      if (name == null) {\n        throw new Error(\"Missing element name. \" + this.debugInfo());\n      }\n      this.name = this.stringify.eleName(name);\n      this.attributes = {};\n      if (attributes != null) {\n        this.attribute(attributes);\n      }\n      if (parent.isDocument) {\n        this.isRoot = true;\n        this.documentObject = parent;\n        parent.rootObject = this;\n      }\n    }\n\n    XMLElement.prototype.clone = function() {\n      var att, attName, clonedSelf, ref1;\n      clonedSelf = Object.create(this);\n      if (clonedSelf.isRoot) {\n        clonedSelf.documentObject = null;\n      }\n      clonedSelf.attributes = {};\n      ref1 = this.attributes;\n      for (attName in ref1) {\n        if (!hasProp.call(ref1, attName)) continue;\n        att = ref1[attName];\n        clonedSelf.attributes[attName] = att.clone();\n      }\n      clonedSelf.children = [];\n      this.children.forEach(function(child) {\n        var clonedChild;\n        clonedChild = child.clone();\n        clonedChild.parent = clonedSelf;\n        return clonedSelf.children.push(clonedChild);\n      });\n      return clonedSelf;\n    };\n\n    XMLElement.prototype.attribute = function(name, value) {\n      var attName, attValue;\n      if (name != null) {\n        name = getValue(name);\n      }\n      if (isObject(name)) {\n        for (attName in name) {\n          if (!hasProp.call(name, attName)) continue;\n          attValue = name[attName];\n          this.attribute(attName, attValue);\n        }\n      } else {\n        if (isFunction(value)) {\n          value = value.apply();\n        }\n        if (!this.options.skipNullAttributes || (value != null)) {\n          this.attributes[name] = new XMLAttribute(this, name, value);\n        }\n      }\n      return this;\n    };\n\n    XMLElement.prototype.removeAttribute = function(name) {\n      var attName, i, len;\n      if (name == null) {\n        throw new Error(\"Missing attribute name. \" + this.debugInfo());\n      }\n      name = getValue(name);\n      if (Array.isArray(name)) {\n        for (i = 0, len = name.length; i < len; i++) {\n          attName = name[i];\n          delete this.attributes[attName];\n        }\n      } else {\n        delete this.attributes[name];\n      }\n      return this;\n    };\n\n    XMLElement.prototype.toString = function(options) {\n      return this.options.writer.set(options).element(this);\n    };\n\n    XMLElement.prototype.att = function(name, value) {\n      return this.attribute(name, value);\n    };\n\n    XMLElement.prototype.a = function(name, value) {\n      return this.attribute(name, value);\n    };\n\n    return XMLElement;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLAttribute\":159,\"./XMLNode\":171}],171:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLProcessingInstruction, XMLRaw, XMLText, getValue, isEmpty, isFunction, isObject, ref,\n    hasProp = {}.hasOwnProperty;\n\n  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isEmpty = ref.isEmpty, getValue = ref.getValue;\n\n  XMLElement = null;\n\n  XMLCData = null;\n\n  XMLComment = null;\n\n  XMLDeclaration = null;\n\n  XMLDocType = null;\n\n  XMLRaw = null;\n\n  XMLText = null;\n\n  XMLProcessingInstruction = null;\n\n  module.exports = XMLNode = (function() {\n    function XMLNode(parent) {\n      this.parent = parent;\n      if (this.parent) {\n        this.options = this.parent.options;\n        this.stringify = this.parent.stringify;\n      }\n      this.children = [];\n      if (!XMLElement) {\n        XMLElement = require('./XMLElement');\n        XMLCData = require('./XMLCData');\n        XMLComment = require('./XMLComment');\n        XMLDeclaration = require('./XMLDeclaration');\n        XMLDocType = require('./XMLDocType');\n        XMLRaw = require('./XMLRaw');\n        XMLText = require('./XMLText');\n        XMLProcessingInstruction = require('./XMLProcessingInstruction');\n      }\n    }\n\n    XMLNode.prototype.element = function(name, attributes, text) {\n      var childNode, item, j, k, key, lastChild, len, len1, ref1, val;\n      lastChild = null;\n      if (attributes == null) {\n        attributes = {};\n      }\n      attributes = getValue(attributes);\n      if (!isObject(attributes)) {\n        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];\n      }\n      if (name != null) {\n        name = getValue(name);\n      }\n      if (Array.isArray(name)) {\n        for (j = 0, len = name.length; j < len; j++) {\n          item = name[j];\n          lastChild = this.element(item);\n        }\n      } else if (isFunction(name)) {\n        lastChild = this.element(name.apply());\n      } else if (isObject(name)) {\n        for (key in name) {\n          if (!hasProp.call(name, key)) continue;\n          val = name[key];\n          if (isFunction(val)) {\n            val = val.apply();\n          }\n          if ((isObject(val)) && (isEmpty(val))) {\n            val = null;\n          }\n          if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) {\n            lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val);\n          } else if (!this.options.separateArrayItems && Array.isArray(val)) {\n            for (k = 0, len1 = val.length; k < len1; k++) {\n              item = val[k];\n              childNode = {};\n              childNode[key] = item;\n              lastChild = this.element(childNode);\n            }\n          } else if (isObject(val)) {\n            lastChild = this.element(key);\n            lastChild.element(val);\n          } else {\n            lastChild = this.element(key, val);\n          }\n        }\n      } else {\n        if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) {\n          lastChild = this.text(text);\n        } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) {\n          lastChild = this.cdata(text);\n        } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) {\n          lastChild = this.comment(text);\n        } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) {\n          lastChild = this.raw(text);\n        } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && name.indexOf(this.stringify.convertPIKey) === 0) {\n          lastChild = this.instruction(name.substr(this.stringify.convertPIKey.length), text);\n        } else {\n          lastChild = this.node(name, attributes, text);\n        }\n      }\n      if (lastChild == null) {\n        throw new Error(\"Could not create any elements with: \" + name + \". \" + this.debugInfo());\n      }\n      return lastChild;\n    };\n\n    XMLNode.prototype.insertBefore = function(name, attributes, text) {\n      var child, i, removed;\n      if (this.isRoot) {\n        throw new Error(\"Cannot insert elements at root level. \" + this.debugInfo(name));\n      }\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i);\n      child = this.parent.element(name, attributes, text);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return child;\n    };\n\n    XMLNode.prototype.insertAfter = function(name, attributes, text) {\n      var child, i, removed;\n      if (this.isRoot) {\n        throw new Error(\"Cannot insert elements at root level. \" + this.debugInfo(name));\n      }\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i + 1);\n      child = this.parent.element(name, attributes, text);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return child;\n    };\n\n    XMLNode.prototype.remove = function() {\n      var i, ref1;\n      if (this.isRoot) {\n        throw new Error(\"Cannot remove the root element. \" + this.debugInfo());\n      }\n      i = this.parent.children.indexOf(this);\n      [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref1 = [])), ref1;\n      return this.parent;\n    };\n\n    XMLNode.prototype.node = function(name, attributes, text) {\n      var child, ref1;\n      if (name != null) {\n        name = getValue(name);\n      }\n      attributes || (attributes = {});\n      attributes = getValue(attributes);\n      if (!isObject(attributes)) {\n        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];\n      }\n      child = new XMLElement(this, name, attributes);\n      if (text != null) {\n        child.text(text);\n      }\n      this.children.push(child);\n      return child;\n    };\n\n    XMLNode.prototype.text = function(value) {\n      var child;\n      child = new XMLText(this, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLNode.prototype.cdata = function(value) {\n      var child;\n      child = new XMLCData(this, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLNode.prototype.comment = function(value) {\n      var child;\n      child = new XMLComment(this, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLNode.prototype.commentBefore = function(value) {\n      var child, i, removed;\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i);\n      child = this.parent.comment(value);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return this;\n    };\n\n    XMLNode.prototype.commentAfter = function(value) {\n      var child, i, removed;\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i + 1);\n      child = this.parent.comment(value);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return this;\n    };\n\n    XMLNode.prototype.raw = function(value) {\n      var child;\n      child = new XMLRaw(this, value);\n      this.children.push(child);\n      return this;\n    };\n\n    XMLNode.prototype.instruction = function(target, value) {\n      var insTarget, insValue, instruction, j, len;\n      if (target != null) {\n        target = getValue(target);\n      }\n      if (value != null) {\n        value = getValue(value);\n      }\n      if (Array.isArray(target)) {\n        for (j = 0, len = target.length; j < len; j++) {\n          insTarget = target[j];\n          this.instruction(insTarget);\n        }\n      } else if (isObject(target)) {\n        for (insTarget in target) {\n          if (!hasProp.call(target, insTarget)) continue;\n          insValue = target[insTarget];\n          this.instruction(insTarget, insValue);\n        }\n      } else {\n        if (isFunction(value)) {\n          value = value.apply();\n        }\n        instruction = new XMLProcessingInstruction(this, target, value);\n        this.children.push(instruction);\n      }\n      return this;\n    };\n\n    XMLNode.prototype.instructionBefore = function(target, value) {\n      var child, i, removed;\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i);\n      child = this.parent.instruction(target, value);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return this;\n    };\n\n    XMLNode.prototype.instructionAfter = function(target, value) {\n      var child, i, removed;\n      i = this.parent.children.indexOf(this);\n      removed = this.parent.children.splice(i + 1);\n      child = this.parent.instruction(target, value);\n      Array.prototype.push.apply(this.parent.children, removed);\n      return this;\n    };\n\n    XMLNode.prototype.declaration = function(version, encoding, standalone) {\n      var doc, xmldec;\n      doc = this.document();\n      xmldec = new XMLDeclaration(doc, version, encoding, standalone);\n      if (doc.children[0] instanceof XMLDeclaration) {\n        doc.children[0] = xmldec;\n      } else {\n        doc.children.unshift(xmldec);\n      }\n      return doc.root() || doc;\n    };\n\n    XMLNode.prototype.doctype = function(pubID, sysID) {\n      var child, doc, doctype, i, j, k, len, len1, ref1, ref2;\n      doc = this.document();\n      doctype = new XMLDocType(doc, pubID, sysID);\n      ref1 = doc.children;\n      for (i = j = 0, len = ref1.length; j < len; i = ++j) {\n        child = ref1[i];\n        if (child instanceof XMLDocType) {\n          doc.children[i] = doctype;\n          return doctype;\n        }\n      }\n      ref2 = doc.children;\n      for (i = k = 0, len1 = ref2.length; k < len1; i = ++k) {\n        child = ref2[i];\n        if (child.isRoot) {\n          doc.children.splice(i, 0, doctype);\n          return doctype;\n        }\n      }\n      doc.children.push(doctype);\n      return doctype;\n    };\n\n    XMLNode.prototype.up = function() {\n      if (this.isRoot) {\n        throw new Error(\"The root node has no parent. Use doc() if you need to get the document object.\");\n      }\n      return this.parent;\n    };\n\n    XMLNode.prototype.root = function() {\n      var node;\n      node = this;\n      while (node) {\n        if (node.isDocument) {\n          return node.rootObject;\n        } else if (node.isRoot) {\n          return node;\n        } else {\n          node = node.parent;\n        }\n      }\n    };\n\n    XMLNode.prototype.document = function() {\n      var node;\n      node = this;\n      while (node) {\n        if (node.isDocument) {\n          return node;\n        } else {\n          node = node.parent;\n        }\n      }\n    };\n\n    XMLNode.prototype.end = function(options) {\n      return this.document().end(options);\n    };\n\n    XMLNode.prototype.prev = function() {\n      var i;\n      i = this.parent.children.indexOf(this);\n      if (i < 1) {\n        throw new Error(\"Already at the first node. \" + this.debugInfo());\n      }\n      return this.parent.children[i - 1];\n    };\n\n    XMLNode.prototype.next = function() {\n      var i;\n      i = this.parent.children.indexOf(this);\n      if (i === -1 || i === this.parent.children.length - 1) {\n        throw new Error(\"Already at the last node. \" + this.debugInfo());\n      }\n      return this.parent.children[i + 1];\n    };\n\n    XMLNode.prototype.importDocument = function(doc) {\n      var clonedRoot;\n      clonedRoot = doc.root().clone();\n      clonedRoot.parent = this;\n      clonedRoot.isRoot = false;\n      this.children.push(clonedRoot);\n      return this;\n    };\n\n    XMLNode.prototype.debugInfo = function(name) {\n      var ref1, ref2;\n      name = name || this.name;\n      if ((name == null) && !((ref1 = this.parent) != null ? ref1.name : void 0)) {\n        return \"\";\n      } else if (name == null) {\n        return \"parent: <\" + this.parent.name + \">\";\n      } else if (!((ref2 = this.parent) != null ? ref2.name : void 0)) {\n        return \"node: <\" + name + \">\";\n      } else {\n        return \"node: <\" + name + \">, parent: <\" + this.parent.name + \">\";\n      }\n    };\n\n    XMLNode.prototype.ele = function(name, attributes, text) {\n      return this.element(name, attributes, text);\n    };\n\n    XMLNode.prototype.nod = function(name, attributes, text) {\n      return this.node(name, attributes, text);\n    };\n\n    XMLNode.prototype.txt = function(value) {\n      return this.text(value);\n    };\n\n    XMLNode.prototype.dat = function(value) {\n      return this.cdata(value);\n    };\n\n    XMLNode.prototype.com = function(value) {\n      return this.comment(value);\n    };\n\n    XMLNode.prototype.ins = function(target, value) {\n      return this.instruction(target, value);\n    };\n\n    XMLNode.prototype.doc = function() {\n      return this.document();\n    };\n\n    XMLNode.prototype.dec = function(version, encoding, standalone) {\n      return this.declaration(version, encoding, standalone);\n    };\n\n    XMLNode.prototype.dtd = function(pubID, sysID) {\n      return this.doctype(pubID, sysID);\n    };\n\n    XMLNode.prototype.e = function(name, attributes, text) {\n      return this.element(name, attributes, text);\n    };\n\n    XMLNode.prototype.n = function(name, attributes, text) {\n      return this.node(name, attributes, text);\n    };\n\n    XMLNode.prototype.t = function(value) {\n      return this.text(value);\n    };\n\n    XMLNode.prototype.d = function(value) {\n      return this.cdata(value);\n    };\n\n    XMLNode.prototype.c = function(value) {\n      return this.comment(value);\n    };\n\n    XMLNode.prototype.r = function(value) {\n      return this.raw(value);\n    };\n\n    XMLNode.prototype.i = function(target, value) {\n      return this.instruction(target, value);\n    };\n\n    XMLNode.prototype.u = function() {\n      return this.up();\n    };\n\n    XMLNode.prototype.importXMLBuilder = function(doc) {\n      return this.importDocument(doc);\n    };\n\n    return XMLNode;\n\n  })();\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLCData\":160,\"./XMLComment\":161,\"./XMLDeclaration\":166,\"./XMLDocType\":167,\"./XMLElement\":170,\"./XMLProcessingInstruction\":172,\"./XMLRaw\":173,\"./XMLText\":177}],172:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLNode, XMLProcessingInstruction,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLProcessingInstruction = (function(superClass) {\n    extend(XMLProcessingInstruction, superClass);\n\n    function XMLProcessingInstruction(parent, target, value) {\n      XMLProcessingInstruction.__super__.constructor.call(this, parent);\n      if (target == null) {\n        throw new Error(\"Missing instruction target. \" + this.debugInfo());\n      }\n      this.target = this.stringify.insTarget(target);\n      if (value) {\n        this.value = this.stringify.insValue(value);\n      }\n    }\n\n    XMLProcessingInstruction.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLProcessingInstruction.prototype.toString = function(options) {\n      return this.options.writer.set(options).processingInstruction(this);\n    };\n\n    return XMLProcessingInstruction;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],173:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLNode, XMLRaw,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLRaw = (function(superClass) {\n    extend(XMLRaw, superClass);\n\n    function XMLRaw(parent, text) {\n      XMLRaw.__super__.constructor.call(this, parent);\n      if (text == null) {\n        throw new Error(\"Missing raw text. \" + this.debugInfo());\n      }\n      this.value = this.stringify.raw(text);\n    }\n\n    XMLRaw.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLRaw.prototype.toString = function(options) {\n      return this.options.writer.set(options).raw(this);\n    };\n\n    return XMLRaw;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],174:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStreamWriter, XMLText, XMLWriterBase,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLDeclaration = require('./XMLDeclaration');\n\n  XMLDocType = require('./XMLDocType');\n\n  XMLCData = require('./XMLCData');\n\n  XMLComment = require('./XMLComment');\n\n  XMLElement = require('./XMLElement');\n\n  XMLRaw = require('./XMLRaw');\n\n  XMLText = require('./XMLText');\n\n  XMLProcessingInstruction = require('./XMLProcessingInstruction');\n\n  XMLDTDAttList = require('./XMLDTDAttList');\n\n  XMLDTDElement = require('./XMLDTDElement');\n\n  XMLDTDEntity = require('./XMLDTDEntity');\n\n  XMLDTDNotation = require('./XMLDTDNotation');\n\n  XMLWriterBase = require('./XMLWriterBase');\n\n  module.exports = XMLStreamWriter = (function(superClass) {\n    extend(XMLStreamWriter, superClass);\n\n    function XMLStreamWriter(stream, options) {\n      XMLStreamWriter.__super__.constructor.call(this, options);\n      this.stream = stream;\n    }\n\n    XMLStreamWriter.prototype.document = function(doc) {\n      var child, i, j, len, len1, ref, ref1, results;\n      ref = doc.children;\n      for (i = 0, len = ref.length; i < len; i++) {\n        child = ref[i];\n        child.isLastRootNode = false;\n      }\n      doc.children[doc.children.length - 1].isLastRootNode = true;\n      ref1 = doc.children;\n      results = [];\n      for (j = 0, len1 = ref1.length; j < len1; j++) {\n        child = ref1[j];\n        switch (false) {\n          case !(child instanceof XMLDeclaration):\n            results.push(this.declaration(child));\n            break;\n          case !(child instanceof XMLDocType):\n            results.push(this.docType(child));\n            break;\n          case !(child instanceof XMLComment):\n            results.push(this.comment(child));\n            break;\n          case !(child instanceof XMLProcessingInstruction):\n            results.push(this.processingInstruction(child));\n            break;\n          default:\n            results.push(this.element(child));\n        }\n      }\n      return results;\n    };\n\n    XMLStreamWriter.prototype.attribute = function(att) {\n      return this.stream.write(' ' + att.name + '=\"' + att.value + '\"');\n    };\n\n    XMLStreamWriter.prototype.cdata = function(node, level) {\n      return this.stream.write(this.space(level) + '<![CDATA[' + node.text + ']]>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.comment = function(node, level) {\n      return this.stream.write(this.space(level) + '<!-- ' + node.text + ' -->' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.declaration = function(node, level) {\n      this.stream.write(this.space(level));\n      this.stream.write('<?xml version=\"' + node.version + '\"');\n      if (node.encoding != null) {\n        this.stream.write(' encoding=\"' + node.encoding + '\"');\n      }\n      if (node.standalone != null) {\n        this.stream.write(' standalone=\"' + node.standalone + '\"');\n      }\n      this.stream.write(this.spacebeforeslash + '?>');\n      return this.stream.write(this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.docType = function(node, level) {\n      var child, i, len, ref;\n      level || (level = 0);\n      this.stream.write(this.space(level));\n      this.stream.write('<!DOCTYPE ' + node.root().name);\n      if (node.pubID && node.sysID) {\n        this.stream.write(' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"');\n      } else if (node.sysID) {\n        this.stream.write(' SYSTEM \"' + node.sysID + '\"');\n      }\n      if (node.children.length > 0) {\n        this.stream.write(' [');\n        this.stream.write(this.endline(node));\n        ref = node.children;\n        for (i = 0, len = ref.length; i < len; i++) {\n          child = ref[i];\n          switch (false) {\n            case !(child instanceof XMLDTDAttList):\n              this.dtdAttList(child, level + 1);\n              break;\n            case !(child instanceof XMLDTDElement):\n              this.dtdElement(child, level + 1);\n              break;\n            case !(child instanceof XMLDTDEntity):\n              this.dtdEntity(child, level + 1);\n              break;\n            case !(child instanceof XMLDTDNotation):\n              this.dtdNotation(child, level + 1);\n              break;\n            case !(child instanceof XMLCData):\n              this.cdata(child, level + 1);\n              break;\n            case !(child instanceof XMLComment):\n              this.comment(child, level + 1);\n              break;\n            case !(child instanceof XMLProcessingInstruction):\n              this.processingInstruction(child, level + 1);\n              break;\n            default:\n              throw new Error(\"Unknown DTD node type: \" + child.constructor.name);\n          }\n        }\n        this.stream.write(']');\n      }\n      this.stream.write(this.spacebeforeslash + '>');\n      return this.stream.write(this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.element = function(node, level) {\n      var att, child, i, len, name, ref, ref1, space;\n      level || (level = 0);\n      space = this.space(level);\n      this.stream.write(space + '<' + node.name);\n      ref = node.attributes;\n      for (name in ref) {\n        if (!hasProp.call(ref, name)) continue;\n        att = ref[name];\n        this.attribute(att);\n      }\n      if (node.children.length === 0 || node.children.every(function(e) {\n        return e.value === '';\n      })) {\n        if (this.allowEmpty) {\n          this.stream.write('></' + node.name + '>');\n        } else {\n          this.stream.write(this.spacebeforeslash + '/>');\n        }\n      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {\n        this.stream.write('>');\n        this.stream.write(node.children[0].value);\n        this.stream.write('</' + node.name + '>');\n      } else {\n        this.stream.write('>' + this.newline);\n        ref1 = node.children;\n        for (i = 0, len = ref1.length; i < len; i++) {\n          child = ref1[i];\n          switch (false) {\n            case !(child instanceof XMLCData):\n              this.cdata(child, level + 1);\n              break;\n            case !(child instanceof XMLComment):\n              this.comment(child, level + 1);\n              break;\n            case !(child instanceof XMLElement):\n              this.element(child, level + 1);\n              break;\n            case !(child instanceof XMLRaw):\n              this.raw(child, level + 1);\n              break;\n            case !(child instanceof XMLText):\n              this.text(child, level + 1);\n              break;\n            case !(child instanceof XMLProcessingInstruction):\n              this.processingInstruction(child, level + 1);\n              break;\n            default:\n              throw new Error(\"Unknown XML node type: \" + child.constructor.name);\n          }\n        }\n        this.stream.write(space + '</' + node.name + '>');\n      }\n      return this.stream.write(this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.processingInstruction = function(node, level) {\n      this.stream.write(this.space(level) + '<?' + node.target);\n      if (node.value) {\n        this.stream.write(' ' + node.value);\n      }\n      return this.stream.write(this.spacebeforeslash + '?>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.raw = function(node, level) {\n      return this.stream.write(this.space(level) + node.value + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.text = function(node, level) {\n      return this.stream.write(this.space(level) + node.value + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.dtdAttList = function(node, level) {\n      this.stream.write(this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType);\n      if (node.defaultValueType !== '#DEFAULT') {\n        this.stream.write(' ' + node.defaultValueType);\n      }\n      if (node.defaultValue) {\n        this.stream.write(' \"' + node.defaultValue + '\"');\n      }\n      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.dtdElement = function(node, level) {\n      this.stream.write(this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value);\n      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.dtdEntity = function(node, level) {\n      this.stream.write(this.space(level) + '<!ENTITY');\n      if (node.pe) {\n        this.stream.write(' %');\n      }\n      this.stream.write(' ' + node.name);\n      if (node.value) {\n        this.stream.write(' \"' + node.value + '\"');\n      } else {\n        if (node.pubID && node.sysID) {\n          this.stream.write(' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"');\n        } else if (node.sysID) {\n          this.stream.write(' SYSTEM \"' + node.sysID + '\"');\n        }\n        if (node.nData) {\n          this.stream.write(' NDATA ' + node.nData);\n        }\n      }\n      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.dtdNotation = function(node, level) {\n      this.stream.write(this.space(level) + '<!NOTATION ' + node.name);\n      if (node.pubID && node.sysID) {\n        this.stream.write(' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"');\n      } else if (node.pubID) {\n        this.stream.write(' PUBLIC \"' + node.pubID + '\"');\n      } else if (node.sysID) {\n        this.stream.write(' SYSTEM \"' + node.sysID + '\"');\n      }\n      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));\n    };\n\n    XMLStreamWriter.prototype.endline = function(node) {\n      if (!node.isLastRootNode) {\n        return this.newline;\n      } else {\n        return '';\n      }\n    };\n\n    return XMLStreamWriter;\n\n  })(XMLWriterBase);\n\n}).call(this);\n\n},{\"./XMLCData\":160,\"./XMLComment\":161,\"./XMLDTDAttList\":162,\"./XMLDTDElement\":163,\"./XMLDTDEntity\":164,\"./XMLDTDNotation\":165,\"./XMLDeclaration\":166,\"./XMLDocType\":167,\"./XMLElement\":170,\"./XMLProcessingInstruction\":172,\"./XMLRaw\":173,\"./XMLText\":177,\"./XMLWriterBase\":178}],175:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLText, XMLWriterBase,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLDeclaration = require('./XMLDeclaration');\n\n  XMLDocType = require('./XMLDocType');\n\n  XMLCData = require('./XMLCData');\n\n  XMLComment = require('./XMLComment');\n\n  XMLElement = require('./XMLElement');\n\n  XMLRaw = require('./XMLRaw');\n\n  XMLText = require('./XMLText');\n\n  XMLProcessingInstruction = require('./XMLProcessingInstruction');\n\n  XMLDTDAttList = require('./XMLDTDAttList');\n\n  XMLDTDElement = require('./XMLDTDElement');\n\n  XMLDTDEntity = require('./XMLDTDEntity');\n\n  XMLDTDNotation = require('./XMLDTDNotation');\n\n  XMLWriterBase = require('./XMLWriterBase');\n\n  module.exports = XMLStringWriter = (function(superClass) {\n    extend(XMLStringWriter, superClass);\n\n    function XMLStringWriter(options) {\n      XMLStringWriter.__super__.constructor.call(this, options);\n    }\n\n    XMLStringWriter.prototype.document = function(doc) {\n      var child, i, len, r, ref;\n      this.textispresent = false;\n      r = '';\n      ref = doc.children;\n      for (i = 0, len = ref.length; i < len; i++) {\n        child = ref[i];\n        r += (function() {\n          switch (false) {\n            case !(child instanceof XMLDeclaration):\n              return this.declaration(child);\n            case !(child instanceof XMLDocType):\n              return this.docType(child);\n            case !(child instanceof XMLComment):\n              return this.comment(child);\n            case !(child instanceof XMLProcessingInstruction):\n              return this.processingInstruction(child);\n            default:\n              return this.element(child, 0);\n          }\n        }).call(this);\n      }\n      if (this.pretty && r.slice(-this.newline.length) === this.newline) {\n        r = r.slice(0, -this.newline.length);\n      }\n      return r;\n    };\n\n    XMLStringWriter.prototype.attribute = function(att) {\n      return ' ' + att.name + '=\"' + att.value + '\"';\n    };\n\n    XMLStringWriter.prototype.cdata = function(node, level) {\n      return this.space(level) + '<![CDATA[' + node.text + ']]>' + this.newline;\n    };\n\n    XMLStringWriter.prototype.comment = function(node, level) {\n      return this.space(level) + '<!-- ' + node.text + ' -->' + this.newline;\n    };\n\n    XMLStringWriter.prototype.declaration = function(node, level) {\n      var r;\n      r = this.space(level);\n      r += '<?xml version=\"' + node.version + '\"';\n      if (node.encoding != null) {\n        r += ' encoding=\"' + node.encoding + '\"';\n      }\n      if (node.standalone != null) {\n        r += ' standalone=\"' + node.standalone + '\"';\n      }\n      r += this.spacebeforeslash + '?>';\n      r += this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.docType = function(node, level) {\n      var child, i, len, r, ref;\n      level || (level = 0);\n      r = this.space(level);\n      r += '<!DOCTYPE ' + node.root().name;\n      if (node.pubID && node.sysID) {\n        r += ' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"';\n      } else if (node.sysID) {\n        r += ' SYSTEM \"' + node.sysID + '\"';\n      }\n      if (node.children.length > 0) {\n        r += ' [';\n        r += this.newline;\n        ref = node.children;\n        for (i = 0, len = ref.length; i < len; i++) {\n          child = ref[i];\n          r += (function() {\n            switch (false) {\n              case !(child instanceof XMLDTDAttList):\n                return this.dtdAttList(child, level + 1);\n              case !(child instanceof XMLDTDElement):\n                return this.dtdElement(child, level + 1);\n              case !(child instanceof XMLDTDEntity):\n                return this.dtdEntity(child, level + 1);\n              case !(child instanceof XMLDTDNotation):\n                return this.dtdNotation(child, level + 1);\n              case !(child instanceof XMLCData):\n                return this.cdata(child, level + 1);\n              case !(child instanceof XMLComment):\n                return this.comment(child, level + 1);\n              case !(child instanceof XMLProcessingInstruction):\n                return this.processingInstruction(child, level + 1);\n              default:\n                throw new Error(\"Unknown DTD node type: \" + child.constructor.name);\n            }\n          }).call(this);\n        }\n        r += ']';\n      }\n      r += this.spacebeforeslash + '>';\n      r += this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.element = function(node, level) {\n      var att, child, i, j, len, len1, name, r, ref, ref1, ref2, space, textispresentwasset;\n      level || (level = 0);\n      textispresentwasset = false;\n      if (this.textispresent) {\n        this.newline = '';\n        this.pretty = false;\n      } else {\n        this.newline = this.newlinedefault;\n        this.pretty = this.prettydefault;\n      }\n      space = this.space(level);\n      r = '';\n      r += space + '<' + node.name;\n      ref = node.attributes;\n      for (name in ref) {\n        if (!hasProp.call(ref, name)) continue;\n        att = ref[name];\n        r += this.attribute(att);\n      }\n      if (node.children.length === 0 || node.children.every(function(e) {\n        return e.value === '';\n      })) {\n        if (this.allowEmpty) {\n          r += '></' + node.name + '>' + this.newline;\n        } else {\n          r += this.spacebeforeslash + '/>' + this.newline;\n        }\n      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {\n        r += '>';\n        r += node.children[0].value;\n        r += '</' + node.name + '>' + this.newline;\n      } else {\n        if (this.dontprettytextnodes) {\n          ref1 = node.children;\n          for (i = 0, len = ref1.length; i < len; i++) {\n            child = ref1[i];\n            if (child.value != null) {\n              this.textispresent++;\n              textispresentwasset = true;\n              break;\n            }\n          }\n        }\n        if (this.textispresent) {\n          this.newline = '';\n          this.pretty = false;\n          space = this.space(level);\n        }\n        r += '>' + this.newline;\n        ref2 = node.children;\n        for (j = 0, len1 = ref2.length; j < len1; j++) {\n          child = ref2[j];\n          r += (function() {\n            switch (false) {\n              case !(child instanceof XMLCData):\n                return this.cdata(child, level + 1);\n              case !(child instanceof XMLComment):\n                return this.comment(child, level + 1);\n              case !(child instanceof XMLElement):\n                return this.element(child, level + 1);\n              case !(child instanceof XMLRaw):\n                return this.raw(child, level + 1);\n              case !(child instanceof XMLText):\n                return this.text(child, level + 1);\n              case !(child instanceof XMLProcessingInstruction):\n                return this.processingInstruction(child, level + 1);\n              default:\n                throw new Error(\"Unknown XML node type: \" + child.constructor.name);\n            }\n          }).call(this);\n        }\n        if (textispresentwasset) {\n          this.textispresent--;\n        }\n        if (!this.textispresent) {\n          this.newline = this.newlinedefault;\n          this.pretty = this.prettydefault;\n        }\n        r += space + '</' + node.name + '>' + this.newline;\n      }\n      return r;\n    };\n\n    XMLStringWriter.prototype.processingInstruction = function(node, level) {\n      var r;\n      r = this.space(level) + '<?' + node.target;\n      if (node.value) {\n        r += ' ' + node.value;\n      }\n      r += this.spacebeforeslash + '?>' + this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.raw = function(node, level) {\n      return this.space(level) + node.value + this.newline;\n    };\n\n    XMLStringWriter.prototype.text = function(node, level) {\n      return this.space(level) + node.value + this.newline;\n    };\n\n    XMLStringWriter.prototype.dtdAttList = function(node, level) {\n      var r;\n      r = this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType;\n      if (node.defaultValueType !== '#DEFAULT') {\n        r += ' ' + node.defaultValueType;\n      }\n      if (node.defaultValue) {\n        r += ' \"' + node.defaultValue + '\"';\n      }\n      r += this.spacebeforeslash + '>' + this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.dtdElement = function(node, level) {\n      return this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value + this.spacebeforeslash + '>' + this.newline;\n    };\n\n    XMLStringWriter.prototype.dtdEntity = function(node, level) {\n      var r;\n      r = this.space(level) + '<!ENTITY';\n      if (node.pe) {\n        r += ' %';\n      }\n      r += ' ' + node.name;\n      if (node.value) {\n        r += ' \"' + node.value + '\"';\n      } else {\n        if (node.pubID && node.sysID) {\n          r += ' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"';\n        } else if (node.sysID) {\n          r += ' SYSTEM \"' + node.sysID + '\"';\n        }\n        if (node.nData) {\n          r += ' NDATA ' + node.nData;\n        }\n      }\n      r += this.spacebeforeslash + '>' + this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.dtdNotation = function(node, level) {\n      var r;\n      r = this.space(level) + '<!NOTATION ' + node.name;\n      if (node.pubID && node.sysID) {\n        r += ' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"';\n      } else if (node.pubID) {\n        r += ' PUBLIC \"' + node.pubID + '\"';\n      } else if (node.sysID) {\n        r += ' SYSTEM \"' + node.sysID + '\"';\n      }\n      r += this.spacebeforeslash + '>' + this.newline;\n      return r;\n    };\n\n    XMLStringWriter.prototype.openNode = function(node, level) {\n      var att, name, r, ref;\n      level || (level = 0);\n      if (node instanceof XMLElement) {\n        r = this.space(level) + '<' + node.name;\n        ref = node.attributes;\n        for (name in ref) {\n          if (!hasProp.call(ref, name)) continue;\n          att = ref[name];\n          r += this.attribute(att);\n        }\n        r += (node.children ? '>' : '/>') + this.newline;\n        return r;\n      } else {\n        r = this.space(level) + '<!DOCTYPE ' + node.rootNodeName;\n        if (node.pubID && node.sysID) {\n          r += ' PUBLIC \"' + node.pubID + '\" \"' + node.sysID + '\"';\n        } else if (node.sysID) {\n          r += ' SYSTEM \"' + node.sysID + '\"';\n        }\n        r += (node.children ? ' [' : '>') + this.newline;\n        return r;\n      }\n    };\n\n    XMLStringWriter.prototype.closeNode = function(node, level) {\n      level || (level = 0);\n      switch (false) {\n        case !(node instanceof XMLElement):\n          return this.space(level) + '</' + node.name + '>' + this.newline;\n        case !(node instanceof XMLDocType):\n          return this.space(level) + ']>' + this.newline;\n      }\n    };\n\n    return XMLStringWriter;\n\n  })(XMLWriterBase);\n\n}).call(this);\n\n},{\"./XMLCData\":160,\"./XMLComment\":161,\"./XMLDTDAttList\":162,\"./XMLDTDElement\":163,\"./XMLDTDEntity\":164,\"./XMLDTDNotation\":165,\"./XMLDeclaration\":166,\"./XMLDocType\":167,\"./XMLElement\":170,\"./XMLProcessingInstruction\":172,\"./XMLRaw\":173,\"./XMLText\":177,\"./XMLWriterBase\":178}],176:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLStringifier,\n    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n    hasProp = {}.hasOwnProperty;\n\n  module.exports = XMLStringifier = (function() {\n    function XMLStringifier(options) {\n      this.assertLegalChar = bind(this.assertLegalChar, this);\n      var key, ref, value;\n      options || (options = {});\n      this.noDoubleEncoding = options.noDoubleEncoding;\n      ref = options.stringify || {};\n      for (key in ref) {\n        if (!hasProp.call(ref, key)) continue;\n        value = ref[key];\n        this[key] = value;\n      }\n    }\n\n    XMLStringifier.prototype.eleName = function(val) {\n      val = '' + val || '';\n      return this.assertLegalChar(val);\n    };\n\n    XMLStringifier.prototype.eleText = function(val) {\n      val = '' + val || '';\n      return this.assertLegalChar(this.elEscape(val));\n    };\n\n    XMLStringifier.prototype.cdata = function(val) {\n      val = '' + val || '';\n      val = val.replace(']]>', ']]]]><![CDATA[>');\n      return this.assertLegalChar(val);\n    };\n\n    XMLStringifier.prototype.comment = function(val) {\n      val = '' + val || '';\n      if (val.match(/--/)) {\n        throw new Error(\"Comment text cannot contain double-hypen: \" + val);\n      }\n      return this.assertLegalChar(val);\n    };\n\n    XMLStringifier.prototype.raw = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.attName = function(val) {\n      return val = '' + val || '';\n    };\n\n    XMLStringifier.prototype.attValue = function(val) {\n      val = '' + val || '';\n      return this.attEscape(val);\n    };\n\n    XMLStringifier.prototype.insTarget = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.insValue = function(val) {\n      val = '' + val || '';\n      if (val.match(/\\?>/)) {\n        throw new Error(\"Invalid processing instruction value: \" + val);\n      }\n      return val;\n    };\n\n    XMLStringifier.prototype.xmlVersion = function(val) {\n      val = '' + val || '';\n      if (!val.match(/1\\.[0-9]+/)) {\n        throw new Error(\"Invalid version number: \" + val);\n      }\n      return val;\n    };\n\n    XMLStringifier.prototype.xmlEncoding = function(val) {\n      val = '' + val || '';\n      if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-])*$/)) {\n        throw new Error(\"Invalid encoding: \" + val);\n      }\n      return val;\n    };\n\n    XMLStringifier.prototype.xmlStandalone = function(val) {\n      if (val) {\n        return \"yes\";\n      } else {\n        return \"no\";\n      }\n    };\n\n    XMLStringifier.prototype.dtdPubID = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.dtdSysID = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.dtdElementValue = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.dtdAttType = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.dtdAttDefault = function(val) {\n      if (val != null) {\n        return '' + val || '';\n      } else {\n        return val;\n      }\n    };\n\n    XMLStringifier.prototype.dtdEntityValue = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.dtdNData = function(val) {\n      return '' + val || '';\n    };\n\n    XMLStringifier.prototype.convertAttKey = '@';\n\n    XMLStringifier.prototype.convertPIKey = '?';\n\n    XMLStringifier.prototype.convertTextKey = '#text';\n\n    XMLStringifier.prototype.convertCDataKey = '#cdata';\n\n    XMLStringifier.prototype.convertCommentKey = '#comment';\n\n    XMLStringifier.prototype.convertRawKey = '#raw';\n\n    XMLStringifier.prototype.assertLegalChar = function(str) {\n      var res;\n      res = str.match(/[\\0\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/);\n      if (res) {\n        throw new Error(\"Invalid character in string: \" + str + \" at index \" + res.index);\n      }\n      return str;\n    };\n\n    XMLStringifier.prototype.elEscape = function(str) {\n      var ampregex;\n      ampregex = this.noDoubleEncoding ? /(?!&\\S+;)&/g : /&/g;\n      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\\r/g, '&#xD;');\n    };\n\n    XMLStringifier.prototype.attEscape = function(str) {\n      var ampregex;\n      ampregex = this.noDoubleEncoding ? /(?!&\\S+;)&/g : /&/g;\n      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/\"/g, '&quot;').replace(/\\t/g, '&#x9;').replace(/\\n/g, '&#xA;').replace(/\\r/g, '&#xD;');\n    };\n\n    return XMLStringifier;\n\n  })();\n\n}).call(this);\n\n},{}],177:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLNode, XMLText,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  XMLNode = require('./XMLNode');\n\n  module.exports = XMLText = (function(superClass) {\n    extend(XMLText, superClass);\n\n    function XMLText(parent, text) {\n      XMLText.__super__.constructor.call(this, parent);\n      if (text == null) {\n        throw new Error(\"Missing element text. \" + this.debugInfo());\n      }\n      this.value = this.stringify.eleText(text);\n    }\n\n    XMLText.prototype.clone = function() {\n      return Object.create(this);\n    };\n\n    XMLText.prototype.toString = function(options) {\n      return this.options.writer.set(options).text(this);\n    };\n\n    return XMLText;\n\n  })(XMLNode);\n\n}).call(this);\n\n},{\"./XMLNode\":171}],178:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLWriterBase,\n    hasProp = {}.hasOwnProperty;\n\n  module.exports = XMLWriterBase = (function() {\n    function XMLWriterBase(options) {\n      var key, ref, ref1, ref2, ref3, ref4, ref5, ref6, value;\n      options || (options = {});\n      this.pretty = options.pretty || false;\n      this.allowEmpty = (ref = options.allowEmpty) != null ? ref : false;\n      if (this.pretty) {\n        this.indent = (ref1 = options.indent) != null ? ref1 : '  ';\n        this.newline = (ref2 = options.newline) != null ? ref2 : '\\n';\n        this.offset = (ref3 = options.offset) != null ? ref3 : 0;\n        this.dontprettytextnodes = (ref4 = options.dontprettytextnodes) != null ? ref4 : 0;\n      } else {\n        this.indent = '';\n        this.newline = '';\n        this.offset = 0;\n        this.dontprettytextnodes = 0;\n      }\n      this.spacebeforeslash = (ref5 = options.spacebeforeslash) != null ? ref5 : '';\n      if (this.spacebeforeslash === true) {\n        this.spacebeforeslash = ' ';\n      }\n      this.newlinedefault = this.newline;\n      this.prettydefault = this.pretty;\n      ref6 = options.writer || {};\n      for (key in ref6) {\n        if (!hasProp.call(ref6, key)) continue;\n        value = ref6[key];\n        this[key] = value;\n      }\n    }\n\n    XMLWriterBase.prototype.set = function(options) {\n      var key, ref, value;\n      options || (options = {});\n      if (\"pretty\" in options) {\n        this.pretty = options.pretty;\n      }\n      if (\"allowEmpty\" in options) {\n        this.allowEmpty = options.allowEmpty;\n      }\n      if (this.pretty) {\n        this.indent = \"indent\" in options ? options.indent : '  ';\n        this.newline = \"newline\" in options ? options.newline : '\\n';\n        this.offset = \"offset\" in options ? options.offset : 0;\n        this.dontprettytextnodes = \"dontprettytextnodes\" in options ? options.dontprettytextnodes : 0;\n      } else {\n        this.indent = '';\n        this.newline = '';\n        this.offset = 0;\n        this.dontprettytextnodes = 0;\n      }\n      this.spacebeforeslash = \"spacebeforeslash\" in options ? options.spacebeforeslash : '';\n      if (this.spacebeforeslash === true) {\n        this.spacebeforeslash = ' ';\n      }\n      this.newlinedefault = this.newline;\n      this.prettydefault = this.pretty;\n      ref = options.writer || {};\n      for (key in ref) {\n        if (!hasProp.call(ref, key)) continue;\n        value = ref[key];\n        this[key] = value;\n      }\n      return this;\n    };\n\n    XMLWriterBase.prototype.space = function(level) {\n      var indent;\n      if (this.pretty) {\n        indent = (level || 0) + this.offset + 1;\n        if (indent > 0) {\n          return new Array(indent).join(this.indent);\n        } else {\n          return '';\n        }\n      } else {\n        return '';\n      }\n    };\n\n    return XMLWriterBase;\n\n  })();\n\n}).call(this);\n\n},{}],179:[function(require,module,exports){\n// Generated by CoffeeScript 1.12.7\n(function() {\n  var XMLDocument, XMLDocumentCB, XMLStreamWriter, XMLStringWriter, assign, isFunction, ref;\n\n  ref = require('./Utility'), assign = ref.assign, isFunction = ref.isFunction;\n\n  XMLDocument = require('./XMLDocument');\n\n  XMLDocumentCB = require('./XMLDocumentCB');\n\n  XMLStringWriter = require('./XMLStringWriter');\n\n  XMLStreamWriter = require('./XMLStreamWriter');\n\n  module.exports.create = function(name, xmldec, doctype, options) {\n    var doc, root;\n    if (name == null) {\n      throw new Error(\"Root element needs a name.\");\n    }\n    options = assign({}, xmldec, doctype, options);\n    doc = new XMLDocument(options);\n    root = doc.element(name);\n    if (!options.headless) {\n      doc.declaration(options);\n      if ((options.pubID != null) || (options.sysID != null)) {\n        doc.doctype(options);\n      }\n    }\n    return root;\n  };\n\n  module.exports.begin = function(options, onData, onEnd) {\n    var ref1;\n    if (isFunction(options)) {\n      ref1 = [options, onData], onData = ref1[0], onEnd = ref1[1];\n      options = {};\n    }\n    if (onData) {\n      return new XMLDocumentCB(options, onData, onEnd);\n    } else {\n      return new XMLDocument(options);\n    }\n  };\n\n  module.exports.stringWriter = function(options) {\n    return new XMLStringWriter(options);\n  };\n\n  module.exports.streamWriter = function(stream, options) {\n    return new XMLStreamWriter(stream, options);\n  };\n\n}).call(this);\n\n},{\"./Utility\":158,\"./XMLDocument\":168,\"./XMLDocumentCB\":169,\"./XMLStreamWriter\":174,\"./XMLStringWriter\":175}]},{},[21])(21)\n});"
  },
  {
    "path": "pages/include/jquery_ui/AUTHORS.txt",
    "content": "Authors ordered by first contribution\nA list of current team members is available at http://jqueryui.com/about\n\nPaul Bakaus <paul.bakaus@gmail.com>\nRichard Worth <rdworth@gmail.com>\nYehuda Katz <wycats@gmail.com>\nSean Catchpole <sean@sunsean.com>\nJohn Resig <jeresig@gmail.com>\nTane Piper <piper.tane@gmail.com>\nDmitri Gaskin <dmitrig01@gmail.com>\nKlaus Hartl <klaus.hartl@gmail.com>\nStefan Petre <stefan.petre@gmail.com>\nGilles van den Hoven <gilles@webunity.nl>\nMicheil Bryan Smith <micheil@brandedcode.com>\nJörn Zaefferer <joern.zaefferer@gmail.com>\nMarc Grabanski <m@marcgrabanski.com>\nKeith Wood <kbwood@iinet.com.au>\nBrandon Aaron <brandon.aaron@gmail.com>\nScott González <scott.gonzalez@gmail.com>\nEduardo Lundgren <eduardolundgren@gmail.com>\nAaron Eisenberger <aaronchi@gmail.com>\nJoan Piedra <theneojp@gmail.com>\nBruno Basto <b.basto@gmail.com>\nRemy Sharp <remy@leftlogic.com>\nBohdan Ganicky <bohdan.ganicky@gmail.com>\nDavid Bolter <david.bolter@gmail.com>\nChi Cheng <cloudream@gmail.com>\nCa-Phun Ung <pazu2k@gmail.com>\nAriel Flesler <aflesler@gmail.com>\nMaggie Wachs <maggie@filamentgroup.com>\nScott Jehl <scottjehl@gmail.com>\nTodd Parker <todd@filamentgroup.com>\nAndrew Powell <andrew@shellscape.org>\nBrant Burnett <btburnett3@gmail.com>\nDouglas Neiner <doug@dougneiner.com>\nPaul Irish <paul.irish@gmail.com>\nRalph Whitbeck <ralph.whitbeck@gmail.com>\nThibault Duplessis <thibault.duplessis@gmail.com>\nDominique Vincent <dominique.vincent@toitl.com>\nJack Hsu <jack.hsu@gmail.com>\nAdam Sontag <ajpiano@ajpiano.com>\nCarl Fürstenberg <carl@excito.com>\nKevin Dalman <development@allpro.net>\nAlberto Fernández Capel <afcapel@gmail.com>\nJacek Jędrzejewski (http://jacek.jedrzejewski.name)\nTing Kuei <ting@kuei.com>\nSamuel Cormier-Iijima <sam@chide.it>\nJon Palmer <jonspalmer@gmail.com>\nBen Hollis <bhollis@amazon.com>\nJustin MacCarthy <Justin@Rubystars.biz>\nEyal Kobrigo <kobrigo@hotmail.com>\nTiago Freire <tiago.freire@gmail.com>\nDiego Tres <diegotres@gmail.com>\nHolger Rüprich <holger@rueprich.de>\nZiling Zhao <zilingzhao@gmail.com>\nMike Alsup <malsup@gmail.com>\nRobson Braga Araujo <robsonbraga@gmail.com>\nPierre-Henri Ausseil <ph.ausseil@gmail.com>\nChristopher McCulloh <cmcculloh@gmail.com>\nAndrew Newcomb <ext.github@preceptsoftware.co.uk>\nLim Chee Aun <cheeaun@gmail.com>\nJorge Barreiro <yortx.barry@gmail.com>\nDaniel Steigerwald <daniel@steigerwald.cz>\nJohn Firebaugh <john_firebaugh@bigfix.com>\nJohn Enters <github@darkdark.net>\nAndrey Kapitcyn <ru.m157y@gmail.com>\nDmitry Petrov <dpetroff@gmail.com>\nEric Hynds <eric@hynds.net>\nChairat Sunthornwiphat <pipo@sixhead.com>\nJosh Varner <josh.varner@gmail.com>\nStéphane Raimbault <stephane.raimbault@gmail.com>\nJay Merrifield <fracmak@gmail.com>\nJ. Ryan Stinnett <jryans@gmail.com>\nPeter Heiberg <peter@heiberg.se>\nAlex Dovenmuehle <adovenmuehle@gmail.com>\nJamie Gegerson <git@jamiegegerson.com>\nRaymond Schwartz <skeetergraphics@gmail.com>\nPhillip Barnes <philbar@gmail.com>\nKyle Wilkinson <kai@wikyd.org>\nKhaled AlHourani <me@khaledalhourani.com>\nMarian Rudzynski <mr@impaled.org>\nJean-Francois Remy <jeff@melix.org>\nDoug Blood <dougblood@gmail.com>\nFilippo Cavallarin <filippo.cavallarin@codseq.it>\nHeiko Henning <heiko@thehennings.ch>\nAliaksandr Rahalevich <saksmlz@gmail.com>\nMario Visic <mario@mariovisic.com>\nXavi Ramirez <xavi.rmz@gmail.com>\nMax Schnur <max.schnur@gmail.com>\nSaji Nediyanchath <saji89@gmail.com>\nCorey Frang <gnarf37@gmail.com>\nAaron Peterson <aaronp123@yahoo.com>\nIvan Peters <ivan@ivanpeters.com>\nMohamed Cherif Bouchelaghem <cherifbouchelaghem@yahoo.fr>\nMarcos Sousa <falecomigo@marcossousa.com>\nMichael DellaNoce <mdellanoce@mailtrust.com>\nGeorge Marshall <echosx@gmail.com>\nTobias Brunner <tobias@strongswan.org>\nMartin Solli <msolli@gmail.com>\nDavid Petersen <public@petersendidit.com>\nDan Heberden <danheberden@gmail.com>\nWilliam Kevin Manire <williamkmanire@gmail.com>\nGilmore Davidson <gilmoreorless@gmail.com>\nMichael Wu <michaelmwu@gmail.com>\nAdam Parod <mystic414@gmail.com>\nGuillaume Gautreau <guillaume+github@ghusse.com>\nMarcel Toele <EleotleCram@gmail.com>\nDan Streetman <ddstreet@ieee.org>\nMatt Hoskins <matt@nipltd.com>\nGiovanni Giacobbi <giovanni@giacobbi.net>\nKyle Florence <kyle.florence@gmail.com>\nPavol Hluchý <lopo@losys.sk>\nHans Hillen <hans.hillen@gmail.com>\nMark Johnson <virgofx@live.com>\nTrey Hunner <treyhunner@gmail.com>\nShane Whittet <whittet@gmail.com>\nEdward A Faulkner <ef@alum.mit.edu>\nAdam Baratz <adam@adambaratz.com>\nKato Kazuyoshi <kato.kazuyoshi@gmail.com>\nEike Send <eike.send@gmail.com>\nKris Borchers <kris.borchers@gmail.com>\nEddie Monge <eddie@eddiemonge.com>\nIsrael Tsadok <itsadok@gmail.com>\nCarson McDonald <carson@ioncannon.net>\nJason Davies <jason@jasondavies.com>\nGarrison Locke <gplocke@gmail.com>\nDavid Murdoch <david@davidmurdoch.com>\nBenjamin Scott Boyle <benjamins.boyle@gmail.com>\nJesse Baird <jebaird@gmail.com>\nJonathan Vingiano <jvingiano@gmail.com>\nDylan Just <dev@ephox.com>\nHiroshi Tomita <tomykaira@gmail.com>\nGlenn Goodrich <glenn.goodrich@gmail.com>\nTarafder Ashek-E-Elahi <mail.ashek@gmail.com>\nRyan Neufeld <ryan@neufeldmail.com>\nMarc Neuwirth <marc.neuwirth@gmail.com>\nPhilip Graham <philip.robert.graham@gmail.com>\nBenjamin Sterling <benjamin.sterling@kenzomedia.com>\nWesley Walser <waw325@gmail.com>\nKouhei Sutou <kou@clear-code.com>\nKarl Kirch <karlkrch@gmail.com>\nChris Kelly <ckdake@ckdake.com>\nJason Oster <jay@kodewerx.org>\nFelix Nagel <info@felixnagel.com>\nAlexander Polomoshnov <alex.polomoshnov@gmail.com>\nDavid Leal <dgleal@gmail.com>\nIgor Milla <igor.fsp.milla@gmail.com>\nDave Methvin <dave.methvin@gmail.com>\nFlorian Gutmann <f.gutmann@chronimo.com>\nMarwan Al Jubeh <marwan.aljubeh@gmail.com>\nMilan Broum <midlis@googlemail.com>\nSebastian Sauer <info@dynpages.de>\nGaëtan Muller <m.gaetan89@gmail.com>\nMichel Weimerskirch <michel@weimerskirch.net>\nWilliam Griffiths <william@ycymro.com>\nStojce Slavkovski <stojce@gmail.com>\nDavid Soms <david.soms@gmail.com>\nDavid De Sloovere <david.desloovere@outlook.com>\nMichael P. Jung <michael.jung@terreon.de>\nShannon Pekary <spekary@gmail.com>\nDan Wellman <danwellman@hotmail.com>\nMatthew Edward Hutton <meh@corefiling.co.uk>\nJames Khoury <james@jameskhoury.com>\nRob Loach <robloach@gmail.com>\nAlberto Monteiro <betimbrasil@gmail.com>\nAlex Rhea <alex.rhea@gmail.com>\nKrzysztof Rosiński <rozwell69@gmail.com>\nRyan Olton <oltonr@gmail.com>\nGenie <386@mail.com>\nRick Waldron <waldron.rick@gmail.com>\nIan Simpson <spoonlikesham@gmail.com>\nLev Kitsis <spam4lev@gmail.com>\nTJ VanToll <tj.vantoll@gmail.com>\nJustin Domnitz <jdomnitz@gmail.com>\nDouglas Cerna <douglascerna@yahoo.com>\nBert ter Heide <bertjh@hotmail.com>\nJasvir Nagra <jasvir@gmail.com>\nYuriy Khabarov <13real008@gmail.com>\nHarri Kilpiö <harri.kilpio@gmail.com>\nLado Lomidze <lado.lomidze@gmail.com>\nAmir E. Aharoni <amir.aharoni@mail.huji.ac.il>\nSimon Sattes <simon.sattes@gmail.com>\nJo Liss <joliss42@gmail.com>\nGuntupalli Karunakar <karunakarg@yahoo.com>\nShahyar Ghobadpour <shahyar@gmail.com>\nLukasz Lipinski <uzza17@gmail.com>\nTimo Tijhof <krinklemail@gmail.com>\nJason Moon <jmoon@socialcast.com>\nMartin Frost <martinf55@hotmail.com>\nEneko Illarramendi <eneko@illarra.com>\nEungJun Yi <semtlenori@gmail.com>\nCourtland Allen <courtlandallen@gmail.com>\nViktar Varvanovich <non4eg@gmail.com>\nDanny Trunk <dtrunk90@gmail.com>\nPavel Stetina <pavel.stetina@nangu.tv>\nMichael Stay <metaweta@gmail.com>\nSteven Roussey <sroussey@gmail.com>\nMichael Hollis <hollis21@gmail.com>\nLee Rowlands <lee.rowlands@previousnext.com.au>\nTimmy Willison <timmywillisn@gmail.com>\nKarl Swedberg <kswedberg@gmail.com>\nBaoju Yuan <the_guy_1987@hotmail.com>\nMaciej Mroziński <maciej.k.mrozinski@gmail.com>\nLuis Dalmolin <luis.nh@gmail.com>\nMark Aaron Shirley <maspwr@gmail.com>\nMartin Hoch <martin@fidion.de>\nJiayi Yang <tr870829@gmail.com>\nPhilipp Benjamin Köppchen <xgxtpbk@gws.ms>\nSindre Sorhus <sindresorhus@gmail.com>\nBernhard Sirlinger <bernhard.sirlinger@tele2.de>\nJared A. Scheel <jared@jaredscheel.com>\nRafael Xavier de Souza <rxaviers@gmail.com>\nJohn Chen <zhang.z.chen@intel.com>\nRobert Beuligmann <robertbeuligmann@gmail.com>\nDale Kocian <dale.kocian@gmail.com>\nMike Sherov <mike.sherov@gmail.com>\nAndrew Couch <andy@couchand.com>\nMarc-Andre Lafortune <github@marc-andre.ca>\nNate Eagle <nate.eagle@teamaol.com>\nDavid Souther <davidsouther@gmail.com>\nMathias Stenbom <mathias@stenbom.com>\nSergey Kartashov <ebishkek@yandex.ru>\nAvinash R <nashpapa@gmail.com>\nEthan Romba <ethanromba@gmail.com>\nCory Gackenheimer <cory.gack@gmail.com>\nJuan Pablo Kaniefsky <jpkaniefsky@gmail.com>\nRoman Salnikov <bardt.dz@gmail.com>\nAnika Henke <anika@selfthinker.org>\nSamuel Bovée <samycookie2000@yahoo.fr>\nFabrício Matté <ult_combo@hotmail.com>\nViktor Kojouharov <vkojouharov@gmail.com>\nPawel Maruszczyk (http://hrabstwo.net)\nPavel Selitskas <p.selitskas@gmail.com>\nBjørn Johansen <post@bjornjohansen.no>\nMatthieu Penant <thieum22@hotmail.com>\nDominic Barnes <dominic@dbarnes.info>\nDavid Sullivan <david.sullivan@gmail.com>\nThomas Jaggi <thomas@responsive.ch>\nVahid Sohrabloo <vahid4134@gmail.com>\nTravis Carden <travis.carden@gmail.com>\nBruno M. Custódio <bruno@brunomcustodio.com>\nNathanael Silverman <nathanael.silverman@gmail.com>\nChristian Wenz <christian@wenz.org>\nSteve Urmston <steve@urm.st>\nZaven Muradyan <megalivoithos@gmail.com>\nWoody Gilk <shadowhand@deviantart.com>\nZbigniew Motyka <zbigniew.motyka@gmail.com>\nSuhail Alkowaileet <xsoh.k7@gmail.com>\nToshi MARUYAMA <marutosijp2@yahoo.co.jp>\nDavid Hansen <hansede@gmail.com>\nBrian Grinstead <briangrinstead@gmail.com>\nChristian Klammer <christian314159@gmail.com>\nSteven Luscher <jquerycla@steveluscher.com>\nGan Eng Chin <engchin.gan@gmail.com>\nGabriel Schulhof <gabriel.schulhof@intel.com>\nAlexander Schmitz <arschmitz@gmail.com>\nVilhjálmur Skúlason <vis@dmm.is>\nSiebrand Mazeland <siebrand@kitano.nl>\nMohsen Ekhtiari <mohsenekhtiari@yahoo.com>\nPere Orga <gotrunks@gmail.com>\nJasper de Groot <mail@ugomobi.com>\nStephane Deschamps <stephane.deschamps@gmail.com>\nJyoti Deka <dekajp@gmail.com>\nAndrei Picus <office.nightcrawler@gmail.com>\nOndrej Novy <novy@ondrej.org>\nJacob McCutcheon <jacob.mccutcheon@gmail.com>\nMonika Piotrowicz <monika.piotrowicz@gmail.com>\nImants Horsts <imants.horsts@inbox.lv>\nEric Dahl <eric.c.dahl@gmail.com>\nDave Stein <dave@behance.com>\nDylan Barrell <dylan@barrell.com>\nDaniel DeGroff <djdegroff@gmail.com>\nMichael Wiencek <mwtuea@gmail.com>\nThomas Meyer <meyertee@gmail.com>\nRuslan Yakhyaev <ruslan@ruslan.io>\nBrian J. Dowling <bjd-dev@simplicity.net>\nBen Higgins <ben@extrahop.com>\nYermo Lamers <yml@yml.com>\nPatrick Stapleton <github@gdi2290.com>\nTrisha Crowley <trisha.crowley@gmail.com>\nUsman Akeju <akeju00+github@gmail.com>\nRodrigo Menezes <rod333@gmail.com>\nJacques Perrault <jacques_perrault@us.ibm.com>\nFrederik Elvhage <frederik.elvhage@googlemail.com>\nWill Holley <willholley@gmail.com>\nUri Gilad <antishok@gmail.com>\nRichard Gibson <richard.gibson@gmail.com>\nSimen Bekkhus <sbekkhus91@gmail.com>\nChen Eshchar <eshcharc@gmail.com>\nBruno Pérel <brunoperel@gmail.com>\nMohammed Alshehri <m@dralshehri.com>\nLisa Seacat DeLuca <ldeluca@us.ibm.com>\nAnne-Gaelle Colom <coloma@westminster.ac.uk>\nAdam Foster <slimfoster@gmail.com>\nLuke Page <luke.a.page@gmail.com>\nDaniel Owens <daniel@matchstickmixup.com>\nMichael Orchard <morchard@scottlogic.co.uk>\nMarcus Warren <marcus@envoke.com>\nNils Heuermann <nils@world-of-scripts.de>\nMarco Ziech <marco@ziech.net>\nPatricia Juarez <patrixd@gmail.com>\nBen Mosher <me@benmosher.com>\nAblay Keldibek <atomio.ak@gmail.com>\nThomas Applencourt <thomas.applencourt@irsamc.ups-tlse.fr>\nJiabao Wu <jiabao.foss@gmail.com>\nEric Lee Carraway <github@ericcarraway.com>\nVictor Homyakov <vkhomyackov@gmail.com>\nMyeongjin Lee <aranet100@gmail.com>\nLiran Sharir <lsharir@gmail.com>\nWeston Ruter <weston@xwp.co>\nMani Mishra <manimishra902@gmail.com>\nHannah Methvin <hannahmethvin@gmail.com>\nLeonardo Balter <leonardo.balter@gmail.com>\nBenjamin Albert <benjamin_a5@yahoo.com>\nMichał Gołębiowski <m.goleb@gmail.com>\nAlyosha Pushak <alyosha.pushak@gmail.com>\nFahad Ahmad <fahadahmad41@hotmail.com>\nMatt Brundage <github@mattbrundage.com>\nFrancesc Baeta <francesc.baeta@gmail.com>\nPiotr Baran <piotros@wp.pl>\nMukul Hase <mukulhase@gmail.com>\nKonstantin Dinev <kdinev@mail.bw.edu>\nRand Scullard <rand@randscullard.com>\nDan Strohl <dan@wjcg.net>\nMaksim Ryzhikov <rv.maksim@gmail.com>\nAmine HADDAD <haddad@allegorie.tv>\nAmanpreet Singh <apsdehal@gmail.com>\nAlexey Balchunas <bleshik@gmail.com>\nPeter Kehl <peter.kehl@gmail.com>\nPeter Dave Hello <hsu@peterdavehello.org>\nJohannes Schäfer <johnschaefer@gmx.de>\nVille Skyttä <ville.skytta@iki.fi>\nRyan Oriecuia <ryan.oriecuia@visioncritical.com>\n"
  },
  {
    "path": "pages/include/jquery_ui/jquery-ui.css",
    "content": "/*! jQuery UI - v1.12.1 - 2016-09-14\n* http://jqueryui.com\n* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css\n* To view and modify this theme, visit http://jqueryui.com/themeroller/?bgShadowXPos=&bgOverlayXPos=&bgErrorXPos=&bgHighlightXPos=&bgContentXPos=&bgHeaderXPos=&bgActiveXPos=&bgHoverXPos=&bgDefaultXPos=&bgShadowYPos=&bgOverlayYPos=&bgErrorYPos=&bgHighlightYPos=&bgContentYPos=&bgHeaderYPos=&bgActiveYPos=&bgHoverYPos=&bgDefaultYPos=&bgShadowRepeat=&bgOverlayRepeat=&bgErrorRepeat=&bgHighlightRepeat=&bgContentRepeat=&bgHeaderRepeat=&bgActiveRepeat=&bgHoverRepeat=&bgDefaultRepeat=&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&bgImgUrlShadow=&bgImgUrlOverlay=&bgImgUrlHover=&bgImgUrlHighlight=&bgImgUrlHeader=&bgImgUrlError=&bgImgUrlDefault=&bgImgUrlContent=&bgImgUrlActive=&opacityFilterShadow=Alpha(Opacity%3D30)&opacityFilterOverlay=Alpha(Opacity%3D30)&opacityShadowPerc=30&opacityOverlayPerc=30&iconColorHover=%23555555&iconColorHighlight=%23777620&iconColorHeader=%23444444&iconColorError=%23cc0000&iconColorDefault=%23777777&iconColorContent=%23444444&iconColorActive=%23ffffff&bgImgOpacityShadow=0&bgImgOpacityOverlay=0&bgImgOpacityError=95&bgImgOpacityHighlight=55&bgImgOpacityContent=75&bgImgOpacityHeader=75&bgImgOpacityActive=65&bgImgOpacityHover=75&bgImgOpacityDefault=75&bgTextureShadow=flat&bgTextureOverlay=flat&bgTextureError=flat&bgTextureHighlight=flat&bgTextureContent=flat&bgTextureHeader=flat&bgTextureActive=flat&bgTextureHover=flat&bgTextureDefault=flat&cornerRadius=3px&fwDefault=normal&ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&cornerRadiusShadow=8px&thicknessShadow=5px&offsetLeftShadow=0px&offsetTopShadow=0px&opacityShadow=.3&bgColorShadow=%23666666&opacityOverlay=.3&bgColorOverlay=%23aaaaaa&fcError=%235f3f3f&borderColorError=%23f1a899&bgColorError=%23fddfdf&fcHighlight=%23777620&borderColorHighlight=%23dad55e&bgColorHighlight=%23fffa90&fcContent=%23333333&borderColorContent=%23dddddd&bgColorContent=%23ffffff&fcHeader=%23333333&borderColorHeader=%23dddddd&bgColorHeader=%23e9e9e9&fcActive=%23ffffff&borderColorActive=%23003eff&bgColorActive=%23007fff&fcHover=%232b2b2b&borderColorHover=%23cccccc&bgColorHover=%23ededed&fcDefault=%23454545&borderColorDefault=%23c5c5c5&bgColorDefault=%23f6f6f6\n* Copyright jQuery Foundation and other contributors; Licensed MIT */\n\n/* Layout helpers\n----------------------------------*/\n.ui-helper-hidden {\n\tdisplay: none;\n}\n.ui-helper-hidden-accessible {\n\tborder: 0;\n\tclip: rect(0 0 0 0);\n\theight: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\twidth: 1px;\n}\n.ui-helper-reset {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\toutline: 0;\n\tline-height: 1.3;\n\ttext-decoration: none;\n\tfont-size: 100%;\n\tlist-style: none;\n}\n.ui-helper-clearfix:before,\n.ui-helper-clearfix:after {\n\tcontent: \"\";\n\tdisplay: table;\n\tborder-collapse: collapse;\n}\n.ui-helper-clearfix:after {\n\tclear: both;\n}\n.ui-helper-zfix {\n\twidth: 100%;\n\theight: 100%;\n\ttop: 0;\n\tleft: 0;\n\tposition: absolute;\n\topacity: 0;\n\tfilter:Alpha(Opacity=0); /* support: IE8 */\n}\n\n.ui-front {\n\tz-index: 100;\n}\n\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-disabled {\n\tcursor: default !important;\n\tpointer-events: none;\n}\n\n\n/* Icons\n----------------------------------*/\n.ui-icon {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tmargin-top: -.25em;\n\tposition: relative;\n\ttext-indent: -99999px;\n\toverflow: hidden;\n\tbackground-repeat: no-repeat;\n}\n\n.ui-widget-icon-block {\n\tleft: 50%;\n\tmargin-left: -8px;\n\tdisplay: block;\n}\n\n/* Misc visuals\n----------------------------------*/\n\n/* Overlays */\n.ui-widget-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n}\n.ui-accordion .ui-accordion-header {\n\tdisplay: block;\n\tcursor: pointer;\n\tposition: relative;\n\tmargin: 2px 0 0 0;\n\tpadding: .5em .5em .5em .7em;\n\tfont-size: 100%;\n}\n.ui-accordion .ui-accordion-content {\n\tpadding: 1em 2.2em;\n\tborder-top: 0;\n\toverflow: auto;\n}\n.ui-autocomplete {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tcursor: default;\n}\n.ui-menu {\n\tlist-style: none;\n\tpadding: 0;\n\tmargin: 0;\n\tdisplay: block;\n\toutline: 0;\n}\n.ui-menu .ui-menu {\n\tposition: absolute;\n}\n.ui-menu .ui-menu-item {\n\tmargin: 0;\n\tcursor: pointer;\n\t/* support: IE10, see #8844 */\n\tlist-style-image: url(\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\");\n}\n.ui-menu .ui-menu-item-wrapper {\n\tposition: relative;\n\tpadding: 3px 1em 3px .4em;\n}\n.ui-menu .ui-menu-divider {\n\tmargin: 5px 0;\n\theight: 0;\n\tfont-size: 0;\n\tline-height: 0;\n\tborder-width: 1px 0 0 0;\n}\n.ui-menu .ui-state-focus,\n.ui-menu .ui-state-active {\n\tmargin: -1px;\n}\n\n/* icon support */\n.ui-menu-icons {\n\tposition: relative;\n}\n.ui-menu-icons .ui-menu-item-wrapper {\n\tpadding-left: 2em;\n}\n\n/* left-aligned */\n.ui-menu .ui-icon {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: .2em;\n\tmargin: auto 0;\n}\n\n/* right-aligned */\n.ui-menu .ui-menu-icon {\n\tleft: auto;\n\tright: 0;\n}\n.ui-button {\n\tpadding: .4em 1em;\n\tdisplay: inline-block;\n\tposition: relative;\n\tline-height: normal;\n\tmargin-right: .1em;\n\tcursor: pointer;\n\tvertical-align: middle;\n\ttext-align: center;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\n\t/* Support: IE <= 11 */\n\toverflow: visible;\n}\n\n.ui-button,\n.ui-button:link,\n.ui-button:visited,\n.ui-button:hover,\n.ui-button:active {\n\ttext-decoration: none;\n}\n\n/* to make room for the icon, a width needs to be set here */\n.ui-button-icon-only {\n\twidth: 2em;\n\tbox-sizing: border-box;\n\ttext-indent: -9999px;\n\twhite-space: nowrap;\n}\n\n/* no icon support for input elements */\ninput.ui-button.ui-button-icon-only {\n\ttext-indent: 0;\n}\n\n/* button icon element(s) */\n.ui-button-icon-only .ui-icon {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\tmargin-top: -8px;\n\tmargin-left: -8px;\n}\n\n.ui-button.ui-icon-notext .ui-icon {\n\tpadding: 0;\n\twidth: 2.1em;\n\theight: 2.1em;\n\ttext-indent: -9999px;\n\twhite-space: nowrap;\n\n}\n\ninput.ui-button.ui-icon-notext .ui-icon {\n\twidth: auto;\n\theight: auto;\n\ttext-indent: 0;\n\twhite-space: normal;\n\tpadding: .4em 1em;\n}\n\n/* workarounds */\n/* Support: Firefox 5 - 40 */\ninput.ui-button::-moz-focus-inner,\nbutton.ui-button::-moz-focus-inner {\n\tborder: 0;\n\tpadding: 0;\n}\n.ui-controlgroup {\n\tvertical-align: middle;\n\tdisplay: inline-block;\n}\n.ui-controlgroup > .ui-controlgroup-item {\n\tfloat: left;\n\tmargin-left: 0;\n\tmargin-right: 0;\n}\n.ui-controlgroup > .ui-controlgroup-item:focus,\n.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {\n\tz-index: 9999;\n}\n.ui-controlgroup-vertical > .ui-controlgroup-item {\n\tdisplay: block;\n\tfloat: none;\n\twidth: 100%;\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n\ttext-align: left;\n}\n.ui-controlgroup-vertical .ui-controlgroup-item {\n\tbox-sizing: border-box;\n}\n.ui-controlgroup .ui-controlgroup-label {\n\tpadding: .4em 1em;\n}\n.ui-controlgroup .ui-controlgroup-label span {\n\tfont-size: 80%;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {\n\tborder-left: none;\n}\n.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {\n\tborder-top: none;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {\n\tborder-right: none;\n}\n.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {\n\tborder-bottom: none;\n}\n\n/* Spinner specific style fixes */\n.ui-controlgroup-vertical .ui-spinner-input {\n\n\t/* Support: IE8 only, Android < 4.4 only */\n\twidth: 75%;\n\twidth: calc( 100% - 2.4em );\n}\n.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {\n\tborder-top-style: solid;\n}\n\n.ui-checkboxradio-label .ui-icon-background {\n\tbox-shadow: inset 1px 1px 1px #ccc;\n\tborder-radius: .12em;\n\tborder: none;\n}\n.ui-checkboxradio-radio-label .ui-icon-background {\n\twidth: 16px;\n\theight: 16px;\n\tborder-radius: 1em;\n\toverflow: visible;\n\tborder: none;\n}\n.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,\n.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {\n\tbackground-image: none;\n\twidth: 8px;\n\theight: 8px;\n\tborder-width: 4px;\n\tborder-style: solid;\n}\n.ui-checkboxradio-disabled {\n\tpointer-events: none;\n}\n.ui-datepicker {\n\twidth: 17em;\n\tpadding: .2em .2em 0;\n\tdisplay: none;\n}\n.ui-datepicker .ui-datepicker-header {\n\tposition: relative;\n\tpadding: .2em 0;\n}\n.ui-datepicker .ui-datepicker-prev,\n.ui-datepicker .ui-datepicker-next {\n\tposition: absolute;\n\ttop: 2px;\n\twidth: 1.8em;\n\theight: 1.8em;\n}\n.ui-datepicker .ui-datepicker-prev-hover,\n.ui-datepicker .ui-datepicker-next-hover {\n\ttop: 1px;\n}\n.ui-datepicker .ui-datepicker-prev {\n\tleft: 2px;\n}\n.ui-datepicker .ui-datepicker-next {\n\tright: 2px;\n}\n.ui-datepicker .ui-datepicker-prev-hover {\n\tleft: 1px;\n}\n.ui-datepicker .ui-datepicker-next-hover {\n\tright: 1px;\n}\n.ui-datepicker .ui-datepicker-prev span,\n.ui-datepicker .ui-datepicker-next span {\n\tdisplay: block;\n\tposition: absolute;\n\tleft: 50%;\n\tmargin-left: -8px;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n.ui-datepicker .ui-datepicker-title {\n\tmargin: 0 2.3em;\n\tline-height: 1.8em;\n\ttext-align: center;\n}\n.ui-datepicker .ui-datepicker-title select {\n\tfont-size: 1em;\n\tmargin: 1px 0;\n}\n.ui-datepicker select.ui-datepicker-month,\n.ui-datepicker select.ui-datepicker-year {\n\twidth: 45%;\n}\n.ui-datepicker table {\n\twidth: 100%;\n\tfont-size: .9em;\n\tborder-collapse: collapse;\n\tmargin: 0 0 .4em;\n}\n.ui-datepicker th {\n\tpadding: .7em .3em;\n\ttext-align: center;\n\tfont-weight: bold;\n\tborder: 0;\n}\n.ui-datepicker td {\n\tborder: 0;\n\tpadding: 1px;\n}\n.ui-datepicker td span,\n.ui-datepicker td a {\n\tdisplay: block;\n\tpadding: .2em;\n\ttext-align: right;\n\ttext-decoration: none;\n}\n.ui-datepicker .ui-datepicker-buttonpane {\n\tbackground-image: none;\n\tmargin: .7em 0 0 0;\n\tpadding: 0 .2em;\n\tborder-left: 0;\n\tborder-right: 0;\n\tborder-bottom: 0;\n}\n.ui-datepicker .ui-datepicker-buttonpane button {\n\tfloat: right;\n\tmargin: .5em .2em .4em;\n\tcursor: pointer;\n\tpadding: .2em .6em .3em .6em;\n\twidth: auto;\n\toverflow: visible;\n}\n.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {\n\tfloat: left;\n}\n\n/* with multiple calendars */\n.ui-datepicker.ui-datepicker-multi {\n\twidth: auto;\n}\n.ui-datepicker-multi .ui-datepicker-group {\n\tfloat: left;\n}\n.ui-datepicker-multi .ui-datepicker-group table {\n\twidth: 95%;\n\tmargin: 0 auto .4em;\n}\n.ui-datepicker-multi-2 .ui-datepicker-group {\n\twidth: 50%;\n}\n.ui-datepicker-multi-3 .ui-datepicker-group {\n\twidth: 33.3%;\n}\n.ui-datepicker-multi-4 .ui-datepicker-group {\n\twidth: 25%;\n}\n.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-left-width: 0;\n}\n.ui-datepicker-multi .ui-datepicker-buttonpane {\n\tclear: left;\n}\n.ui-datepicker-row-break {\n\tclear: both;\n\twidth: 100%;\n\tfont-size: 0;\n}\n\n/* RTL support */\n.ui-datepicker-rtl {\n\tdirection: rtl;\n}\n.ui-datepicker-rtl .ui-datepicker-prev {\n\tright: 2px;\n\tleft: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-next {\n\tleft: 2px;\n\tright: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-prev:hover {\n\tright: 1px;\n\tleft: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-next:hover {\n\tleft: 1px;\n\tright: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane {\n\tclear: right;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane button {\n\tfloat: left;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,\n.ui-datepicker-rtl .ui-datepicker-group {\n\tfloat: right;\n}\n.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-right-width: 0;\n\tborder-left-width: 1px;\n}\n\n/* Icons */\n.ui-datepicker .ui-icon {\n\tdisplay: block;\n\ttext-indent: -99999px;\n\toverflow: hidden;\n\tbackground-repeat: no-repeat;\n\tleft: .5em;\n\ttop: .3em;\n}\n.ui-dialog {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tpadding: .2em;\n\toutline: 0;\n}\n.ui-dialog .ui-dialog-titlebar {\n\tpadding: .4em 1em;\n\tposition: relative;\n}\n.ui-dialog .ui-dialog-title {\n\tfloat: left;\n\tmargin: .1em 0;\n\twhite-space: nowrap;\n\twidth: 90%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n.ui-dialog .ui-dialog-titlebar-close {\n\tposition: absolute;\n\tright: .3em;\n\ttop: 50%;\n\twidth: 20px;\n\tmargin: -10px 0 0 0;\n\tpadding: 1px;\n\theight: 20px;\n}\n.ui-dialog .ui-dialog-content {\n\tposition: relative;\n\tborder: 0;\n\tpadding: .5em 1em;\n\tbackground: none;\n\toverflow: auto;\n}\n.ui-dialog .ui-dialog-buttonpane {\n\ttext-align: left;\n\tborder-width: 1px 0 0 0;\n\tbackground-image: none;\n\tmargin-top: .5em;\n\tpadding: .3em 1em .5em .4em;\n}\n.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {\n\tfloat: right;\n}\n.ui-dialog .ui-dialog-buttonpane button {\n\tmargin: .5em .4em .5em 0;\n\tcursor: pointer;\n}\n.ui-dialog .ui-resizable-n {\n\theight: 2px;\n\ttop: 0;\n}\n.ui-dialog .ui-resizable-e {\n\twidth: 2px;\n\tright: 0;\n}\n.ui-dialog .ui-resizable-s {\n\theight: 2px;\n\tbottom: 0;\n}\n.ui-dialog .ui-resizable-w {\n\twidth: 2px;\n\tleft: 0;\n}\n.ui-dialog .ui-resizable-se,\n.ui-dialog .ui-resizable-sw,\n.ui-dialog .ui-resizable-ne,\n.ui-dialog .ui-resizable-nw {\n\twidth: 7px;\n\theight: 7px;\n}\n.ui-dialog .ui-resizable-se {\n\tright: 0;\n\tbottom: 0;\n}\n.ui-dialog .ui-resizable-sw {\n\tleft: 0;\n\tbottom: 0;\n}\n.ui-dialog .ui-resizable-ne {\n\tright: 0;\n\ttop: 0;\n}\n.ui-dialog .ui-resizable-nw {\n\tleft: 0;\n\ttop: 0;\n}\n.ui-draggable .ui-dialog-titlebar {\n\tcursor: move;\n}\n.ui-draggable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-resizable {\n\tposition: relative;\n}\n.ui-resizable-handle {\n\tposition: absolute;\n\tfont-size: 0.1px;\n\tdisplay: block;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-resizable-disabled .ui-resizable-handle,\n.ui-resizable-autohide .ui-resizable-handle {\n\tdisplay: none;\n}\n.ui-resizable-n {\n\tcursor: n-resize;\n\theight: 7px;\n\twidth: 100%;\n\ttop: -5px;\n\tleft: 0;\n}\n.ui-resizable-s {\n\tcursor: s-resize;\n\theight: 7px;\n\twidth: 100%;\n\tbottom: -5px;\n\tleft: 0;\n}\n.ui-resizable-e {\n\tcursor: e-resize;\n\twidth: 7px;\n\tright: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n.ui-resizable-w {\n\tcursor: w-resize;\n\twidth: 7px;\n\tleft: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n.ui-resizable-se {\n\tcursor: se-resize;\n\twidth: 12px;\n\theight: 12px;\n\tright: 1px;\n\tbottom: 1px;\n}\n.ui-resizable-sw {\n\tcursor: sw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\tbottom: -5px;\n}\n.ui-resizable-nw {\n\tcursor: nw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\ttop: -5px;\n}\n.ui-resizable-ne {\n\tcursor: ne-resize;\n\twidth: 9px;\n\theight: 9px;\n\tright: -5px;\n\ttop: -5px;\n}\n.ui-progressbar {\n\theight: 2em;\n\ttext-align: left;\n\toverflow: hidden;\n}\n.ui-progressbar .ui-progressbar-value {\n\tmargin: -1px;\n\theight: 100%;\n}\n.ui-progressbar .ui-progressbar-overlay {\n\tbackground: url(\"data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==\");\n\theight: 100%;\n\tfilter: alpha(opacity=25); /* support: IE8 */\n\topacity: 0.25;\n}\n.ui-progressbar-indeterminate .ui-progressbar-value {\n\tbackground-image: none;\n}\n.ui-selectable {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-selectable-helper {\n\tposition: absolute;\n\tz-index: 100;\n\tborder: 1px dotted black;\n}\n.ui-selectmenu-menu {\n\tpadding: 0;\n\tmargin: 0;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tdisplay: none;\n}\n.ui-selectmenu-menu .ui-menu {\n\toverflow: auto;\n\toverflow-x: hidden;\n\tpadding-bottom: 1px;\n}\n.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {\n\tfont-size: 1em;\n\tfont-weight: bold;\n\tline-height: 1.5;\n\tpadding: 2px 0.4em;\n\tmargin: 0.5em 0 0 0;\n\theight: auto;\n\tborder: 0;\n}\n.ui-selectmenu-open {\n\tdisplay: block;\n}\n.ui-selectmenu-text {\n\tdisplay: block;\n\tmargin-right: 20px;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n.ui-selectmenu-button.ui-button {\n\ttext-align: left;\n\twhite-space: nowrap;\n\twidth: 14em;\n}\n.ui-selectmenu-icon.ui-icon {\n\tfloat: right;\n\tmargin-top: 0;\n}\n.ui-slider {\n\tposition: relative;\n\ttext-align: left;\n}\n.ui-slider .ui-slider-handle {\n\tposition: absolute;\n\tz-index: 2;\n\twidth: 1.2em;\n\theight: 1.2em;\n\tcursor: default;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-slider .ui-slider-range {\n\tposition: absolute;\n\tz-index: 1;\n\tfont-size: .7em;\n\tdisplay: block;\n\tborder: 0;\n\tbackground-position: 0 0;\n}\n\n/* support: IE8 - See #6727 */\n.ui-slider.ui-state-disabled .ui-slider-handle,\n.ui-slider.ui-state-disabled .ui-slider-range {\n\tfilter: inherit;\n}\n\n.ui-slider-horizontal {\n\theight: .8em;\n}\n.ui-slider-horizontal .ui-slider-handle {\n\ttop: -.3em;\n\tmargin-left: -.6em;\n}\n.ui-slider-horizontal .ui-slider-range {\n\ttop: 0;\n\theight: 100%;\n}\n.ui-slider-horizontal .ui-slider-range-min {\n\tleft: 0;\n}\n.ui-slider-horizontal .ui-slider-range-max {\n\tright: 0;\n}\n\n.ui-slider-vertical {\n\twidth: .8em;\n\theight: 100px;\n}\n.ui-slider-vertical .ui-slider-handle {\n\tleft: -.3em;\n\tmargin-left: 0;\n\tmargin-bottom: -.6em;\n}\n.ui-slider-vertical .ui-slider-range {\n\tleft: 0;\n\twidth: 100%;\n}\n.ui-slider-vertical .ui-slider-range-min {\n\tbottom: 0;\n}\n.ui-slider-vertical .ui-slider-range-max {\n\ttop: 0;\n}\n.ui-sortable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-spinner {\n\tposition: relative;\n\tdisplay: inline-block;\n\toverflow: hidden;\n\tpadding: 0;\n\tvertical-align: middle;\n}\n.ui-spinner-input {\n\tborder: none;\n\tbackground: none;\n\tcolor: inherit;\n\tpadding: .222em 0;\n\tmargin: .2em 0;\n\tvertical-align: middle;\n\tmargin-left: .4em;\n\tmargin-right: 2em;\n}\n.ui-spinner-button {\n\twidth: 1.6em;\n\theight: 50%;\n\tfont-size: .5em;\n\tpadding: 0;\n\tmargin: 0;\n\ttext-align: center;\n\tposition: absolute;\n\tcursor: default;\n\tdisplay: block;\n\toverflow: hidden;\n\tright: 0;\n}\n/* more specificity required here to override default borders */\n.ui-spinner a.ui-spinner-button {\n\tborder-top-style: none;\n\tborder-bottom-style: none;\n\tborder-right-style: none;\n}\n.ui-spinner-up {\n\ttop: 0;\n}\n.ui-spinner-down {\n\tbottom: 0;\n}\n.ui-tabs {\n\tposition: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as \"fixed\") */\n\tpadding: .2em;\n}\n.ui-tabs .ui-tabs-nav {\n\tmargin: 0;\n\tpadding: .2em .2em 0;\n}\n.ui-tabs .ui-tabs-nav li {\n\tlist-style: none;\n\tfloat: left;\n\tposition: relative;\n\ttop: 0;\n\tmargin: 1px .2em 0 0;\n\tborder-bottom-width: 0;\n\tpadding: 0;\n\twhite-space: nowrap;\n}\n.ui-tabs .ui-tabs-nav .ui-tabs-anchor {\n\tfloat: left;\n\tpadding: .5em 1em;\n\ttext-decoration: none;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-active {\n\tmargin-bottom: -1px;\n\tpadding-bottom: 1px;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,\n.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,\n.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {\n\tcursor: text;\n}\n.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {\n\tcursor: pointer;\n}\n.ui-tabs .ui-tabs-panel {\n\tdisplay: block;\n\tborder-width: 0;\n\tpadding: 1em 1.4em;\n\tbackground: none;\n}\n.ui-tooltip {\n\tpadding: 8px;\n\tposition: absolute;\n\tz-index: 9999;\n\tmax-width: 300px;\n}\nbody .ui-tooltip {\n\tborder-width: 2px;\n}\n\n/* Component containers\n----------------------------------*/\n.ui-widget {\n\tfont-family: Arial,Helvetica,sans-serif;\n\tfont-size: 1em;\n}\n.ui-widget .ui-widget {\n\tfont-size: 1em;\n}\n.ui-widget input,\n.ui-widget select,\n.ui-widget textarea,\n.ui-widget button {\n\tfont-family: Arial,Helvetica,sans-serif;\n\tfont-size: 1em;\n}\n.ui-widget.ui-widget-content {\n\tborder: 1px solid #c5c5c5;\n}\n.ui-widget-content {\n\tborder: 1px solid #dddddd;\n\tbackground: #ffffff;\n\tcolor: #333333;\n}\n.ui-widget-content a {\n\tcolor: #333333;\n}\n.ui-widget-header {\n\tborder: 1px solid #dddddd;\n\tbackground: #e9e9e9;\n\tcolor: #333333;\n\tfont-weight: bold;\n}\n.ui-widget-header a {\n\tcolor: #333333;\n}\n\n/* Interaction states\n----------------------------------*/\n.ui-state-default,\n.ui-widget-content .ui-state-default,\n.ui-widget-header .ui-state-default,\n.ui-button,\n\n/* We use html here because we need a greater specificity to make sure disabled\nworks properly when clicked or hovered */\nhtml .ui-button.ui-state-disabled:hover,\nhtml .ui-button.ui-state-disabled:active {\n\tborder: 1px solid #c5c5c5;\n\tbackground: #f6f6f6;\n\tfont-weight: normal;\n\tcolor: #454545;\n}\n.ui-state-default a,\n.ui-state-default a:link,\n.ui-state-default a:visited,\na.ui-button,\na:link.ui-button,\na:visited.ui-button,\n.ui-button {\n\tcolor: #454545;\n\ttext-decoration: none;\n}\n.ui-state-hover,\n.ui-widget-content .ui-state-hover,\n.ui-widget-header .ui-state-hover,\n.ui-state-focus,\n.ui-widget-content .ui-state-focus,\n.ui-widget-header .ui-state-focus,\n.ui-button:hover,\n.ui-button:focus {\n\tborder: 1px solid #cccccc;\n\tbackground: #ededed;\n\tfont-weight: normal;\n\tcolor: #2b2b2b;\n}\n.ui-state-hover a,\n.ui-state-hover a:hover,\n.ui-state-hover a:link,\n.ui-state-hover a:visited,\n.ui-state-focus a,\n.ui-state-focus a:hover,\n.ui-state-focus a:link,\n.ui-state-focus a:visited,\na.ui-button:hover,\na.ui-button:focus {\n\tcolor: #2b2b2b;\n\ttext-decoration: none;\n}\n\n.ui-visual-focus {\n\tbox-shadow: 0 0 3px 1px rgb(94, 158, 214);\n}\n.ui-state-active,\n.ui-widget-content .ui-state-active,\n.ui-widget-header .ui-state-active,\na.ui-button:active,\n.ui-button:active,\n.ui-button.ui-state-active:hover {\n\tborder: 1px solid #003eff;\n\tbackground: #007fff;\n\tfont-weight: normal;\n\tcolor: #ffffff;\n}\n.ui-icon-background,\n.ui-state-active .ui-icon-background {\n\tborder: #003eff;\n\tbackground-color: #ffffff;\n}\n.ui-state-active a,\n.ui-state-active a:link,\n.ui-state-active a:visited {\n\tcolor: #ffffff;\n\ttext-decoration: none;\n}\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-highlight,\n.ui-widget-content .ui-state-highlight,\n.ui-widget-header .ui-state-highlight {\n\tborder: 1px solid #dad55e;\n\tbackground: #fffa90;\n\tcolor: #777620;\n}\n.ui-state-checked {\n\tborder: 1px solid #dad55e;\n\tbackground: #fffa90;\n}\n.ui-state-highlight a,\n.ui-widget-content .ui-state-highlight a,\n.ui-widget-header .ui-state-highlight a {\n\tcolor: #777620;\n}\n.ui-state-error,\n.ui-widget-content .ui-state-error,\n.ui-widget-header .ui-state-error {\n\tborder: 1px solid #f1a899;\n\tbackground: #fddfdf;\n\tcolor: #5f3f3f;\n}\n.ui-state-error a,\n.ui-widget-content .ui-state-error a,\n.ui-widget-header .ui-state-error a {\n\tcolor: #5f3f3f;\n}\n.ui-state-error-text,\n.ui-widget-content .ui-state-error-text,\n.ui-widget-header .ui-state-error-text {\n\tcolor: #5f3f3f;\n}\n.ui-priority-primary,\n.ui-widget-content .ui-priority-primary,\n.ui-widget-header .ui-priority-primary {\n\tfont-weight: bold;\n}\n.ui-priority-secondary,\n.ui-widget-content .ui-priority-secondary,\n.ui-widget-header .ui-priority-secondary {\n\topacity: .7;\n\tfilter:Alpha(Opacity=70); /* support: IE8 */\n\tfont-weight: normal;\n}\n.ui-state-disabled,\n.ui-widget-content .ui-state-disabled,\n.ui-widget-header .ui-state-disabled {\n\topacity: .35;\n\tfilter:Alpha(Opacity=35); /* support: IE8 */\n\tbackground-image: none;\n}\n.ui-state-disabled .ui-icon {\n\tfilter:Alpha(Opacity=35); /* support: IE8 - See #6059 */\n}\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon {\n\twidth: 16px;\n\theight: 16px;\n}\n.ui-icon,\n.ui-widget-content .ui-icon {\n\tbackground-image: url(\"images/ui-icons_444444_256x240.png\");\n}\n.ui-widget-header .ui-icon {\n\tbackground-image: url(\"images/ui-icons_444444_256x240.png\");\n}\n.ui-state-hover .ui-icon,\n.ui-state-focus .ui-icon,\n.ui-button:hover .ui-icon,\n.ui-button:focus .ui-icon {\n\tbackground-image: url(\"images/ui-icons_555555_256x240.png\");\n}\n.ui-state-active .ui-icon,\n.ui-button:active .ui-icon {\n\tbackground-image: url(\"images/ui-icons_ffffff_256x240.png\");\n}\n.ui-state-highlight .ui-icon,\n.ui-button .ui-state-highlight.ui-icon {\n\tbackground-image: url(\"images/ui-icons_777620_256x240.png\");\n}\n.ui-state-error .ui-icon,\n.ui-state-error-text .ui-icon {\n\tbackground-image: url(\"images/ui-icons_cc0000_256x240.png\");\n}\n.ui-button .ui-icon {\n\tbackground-image: url(\"images/ui-icons_777777_256x240.png\");\n}\n\n/* positioning */\n.ui-icon-blank { background-position: 16px 16px; }\n.ui-icon-caret-1-n { background-position: 0 0; }\n.ui-icon-caret-1-ne { background-position: -16px 0; }\n.ui-icon-caret-1-e { background-position: -32px 0; }\n.ui-icon-caret-1-se { background-position: -48px 0; }\n.ui-icon-caret-1-s { background-position: -65px 0; }\n.ui-icon-caret-1-sw { background-position: -80px 0; }\n.ui-icon-caret-1-w { background-position: -96px 0; }\n.ui-icon-caret-1-nw { background-position: -112px 0; }\n.ui-icon-caret-2-n-s { background-position: -128px 0; }\n.ui-icon-caret-2-e-w { background-position: -144px 0; }\n.ui-icon-triangle-1-n { background-position: 0 -16px; }\n.ui-icon-triangle-1-ne { background-position: -16px -16px; }\n.ui-icon-triangle-1-e { background-position: -32px -16px; }\n.ui-icon-triangle-1-se { background-position: -48px -16px; }\n.ui-icon-triangle-1-s { background-position: -65px -16px; }\n.ui-icon-triangle-1-sw { background-position: -80px -16px; }\n.ui-icon-triangle-1-w { background-position: -96px -16px; }\n.ui-icon-triangle-1-nw { background-position: -112px -16px; }\n.ui-icon-triangle-2-n-s { background-position: -128px -16px; }\n.ui-icon-triangle-2-e-w { background-position: -144px -16px; }\n.ui-icon-arrow-1-n { background-position: 0 -32px; }\n.ui-icon-arrow-1-ne { background-position: -16px -32px; }\n.ui-icon-arrow-1-e { background-position: -32px -32px; }\n.ui-icon-arrow-1-se { background-position: -48px -32px; }\n.ui-icon-arrow-1-s { background-position: -65px -32px; }\n.ui-icon-arrow-1-sw { background-position: -80px -32px; }\n.ui-icon-arrow-1-w { background-position: -96px -32px; }\n.ui-icon-arrow-1-nw { background-position: -112px -32px; }\n.ui-icon-arrow-2-n-s { background-position: -128px -32px; }\n.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }\n.ui-icon-arrow-2-e-w { background-position: -160px -32px; }\n.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }\n.ui-icon-arrowstop-1-n { background-position: -192px -32px; }\n.ui-icon-arrowstop-1-e { background-position: -208px -32px; }\n.ui-icon-arrowstop-1-s { background-position: -224px -32px; }\n.ui-icon-arrowstop-1-w { background-position: -240px -32px; }\n.ui-icon-arrowthick-1-n { background-position: 1px -48px; }\n.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }\n.ui-icon-arrowthick-1-e { background-position: -32px -48px; }\n.ui-icon-arrowthick-1-se { background-position: -48px -48px; }\n.ui-icon-arrowthick-1-s { background-position: -64px -48px; }\n.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }\n.ui-icon-arrowthick-1-w { background-position: -96px -48px; }\n.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }\n.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }\n.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }\n.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }\n.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }\n.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }\n.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }\n.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }\n.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }\n.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }\n.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }\n.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }\n.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }\n.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }\n.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }\n.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }\n.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }\n.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }\n.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }\n.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }\n.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }\n.ui-icon-arrow-4 { background-position: 0 -80px; }\n.ui-icon-arrow-4-diag { background-position: -16px -80px; }\n.ui-icon-extlink { background-position: -32px -80px; }\n.ui-icon-newwin { background-position: -48px -80px; }\n.ui-icon-refresh { background-position: -64px -80px; }\n.ui-icon-shuffle { background-position: -80px -80px; }\n.ui-icon-transfer-e-w { background-position: -96px -80px; }\n.ui-icon-transferthick-e-w { background-position: -112px -80px; }\n.ui-icon-folder-collapsed { background-position: 0 -96px; }\n.ui-icon-folder-open { background-position: -16px -96px; }\n.ui-icon-document { background-position: -32px -96px; }\n.ui-icon-document-b { background-position: -48px -96px; }\n.ui-icon-note { background-position: -64px -96px; }\n.ui-icon-mail-closed { background-position: -80px -96px; }\n.ui-icon-mail-open { background-position: -96px -96px; }\n.ui-icon-suitcase { background-position: -112px -96px; }\n.ui-icon-comment { background-position: -128px -96px; }\n.ui-icon-person { background-position: -144px -96px; }\n.ui-icon-print { background-position: -160px -96px; }\n.ui-icon-trash { background-position: -176px -96px; }\n.ui-icon-locked { background-position: -192px -96px; }\n.ui-icon-unlocked { background-position: -208px -96px; }\n.ui-icon-bookmark { background-position: -224px -96px; }\n.ui-icon-tag { background-position: -240px -96px; }\n.ui-icon-home { background-position: 0 -112px; }\n.ui-icon-flag { background-position: -16px -112px; }\n.ui-icon-calendar { background-position: -32px -112px; }\n.ui-icon-cart { background-position: -48px -112px; }\n.ui-icon-pencil { background-position: -64px -112px; }\n.ui-icon-clock { background-position: -80px -112px; }\n.ui-icon-disk { background-position: -96px -112px; }\n.ui-icon-calculator { background-position: -112px -112px; }\n.ui-icon-zoomin { background-position: -128px -112px; }\n.ui-icon-zoomout { background-position: -144px -112px; }\n.ui-icon-search { background-position: -160px -112px; }\n.ui-icon-wrench { background-position: -176px -112px; }\n.ui-icon-gear { background-position: -192px -112px; }\n.ui-icon-heart { background-position: -208px -112px; }\n.ui-icon-star { background-position: -224px -112px; }\n.ui-icon-link { background-position: -240px -112px; }\n.ui-icon-cancel { background-position: 0 -128px; }\n.ui-icon-plus { background-position: -16px -128px; }\n.ui-icon-plusthick { background-position: -32px -128px; }\n.ui-icon-minus { background-position: -48px -128px; }\n.ui-icon-minusthick { background-position: -64px -128px; }\n.ui-icon-close { background-position: -80px -128px; }\n.ui-icon-closethick { background-position: -96px -128px; }\n.ui-icon-key { background-position: -112px -128px; }\n.ui-icon-lightbulb { background-position: -128px -128px; }\n.ui-icon-scissors { background-position: -144px -128px; }\n.ui-icon-clipboard { background-position: -160px -128px; }\n.ui-icon-copy { background-position: -176px -128px; }\n.ui-icon-contact { background-position: -192px -128px; }\n.ui-icon-image { background-position: -208px -128px; }\n.ui-icon-video { background-position: -224px -128px; }\n.ui-icon-script { background-position: -240px -128px; }\n.ui-icon-alert { background-position: 0 -144px; }\n.ui-icon-info { background-position: -16px -144px; }\n.ui-icon-notice { background-position: -32px -144px; }\n.ui-icon-help { background-position: -48px -144px; }\n.ui-icon-check { background-position: -64px -144px; }\n.ui-icon-bullet { background-position: -80px -144px; }\n.ui-icon-radio-on { background-position: -96px -144px; }\n.ui-icon-radio-off { background-position: -112px -144px; }\n.ui-icon-pin-w { background-position: -128px -144px; }\n.ui-icon-pin-s { background-position: -144px -144px; }\n.ui-icon-play { background-position: 0 -160px; }\n.ui-icon-pause { background-position: -16px -160px; }\n.ui-icon-seek-next { background-position: -32px -160px; }\n.ui-icon-seek-prev { background-position: -48px -160px; }\n.ui-icon-seek-end { background-position: -64px -160px; }\n.ui-icon-seek-start { background-position: -80px -160px; }\n/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */\n.ui-icon-seek-first { background-position: -80px -160px; }\n.ui-icon-stop { background-position: -96px -160px; }\n.ui-icon-eject { background-position: -112px -160px; }\n.ui-icon-volume-off { background-position: -128px -160px; }\n.ui-icon-volume-on { background-position: -144px -160px; }\n.ui-icon-power { background-position: 0 -176px; }\n.ui-icon-signal-diag { background-position: -16px -176px; }\n.ui-icon-signal { background-position: -32px -176px; }\n.ui-icon-battery-0 { background-position: -48px -176px; }\n.ui-icon-battery-1 { background-position: -64px -176px; }\n.ui-icon-battery-2 { background-position: -80px -176px; }\n.ui-icon-battery-3 { background-position: -96px -176px; }\n.ui-icon-circle-plus { background-position: 0 -192px; }\n.ui-icon-circle-minus { background-position: -16px -192px; }\n.ui-icon-circle-close { background-position: -32px -192px; }\n.ui-icon-circle-triangle-e { background-position: -48px -192px; }\n.ui-icon-circle-triangle-s { background-position: -64px -192px; }\n.ui-icon-circle-triangle-w { background-position: -80px -192px; }\n.ui-icon-circle-triangle-n { background-position: -96px -192px; }\n.ui-icon-circle-arrow-e { background-position: -112px -192px; }\n.ui-icon-circle-arrow-s { background-position: -128px -192px; }\n.ui-icon-circle-arrow-w { background-position: -144px -192px; }\n.ui-icon-circle-arrow-n { background-position: -160px -192px; }\n.ui-icon-circle-zoomin { background-position: -176px -192px; }\n.ui-icon-circle-zoomout { background-position: -192px -192px; }\n.ui-icon-circle-check { background-position: -208px -192px; }\n.ui-icon-circlesmall-plus { background-position: 0 -208px; }\n.ui-icon-circlesmall-minus { background-position: -16px -208px; }\n.ui-icon-circlesmall-close { background-position: -32px -208px; }\n.ui-icon-squaresmall-plus { background-position: -48px -208px; }\n.ui-icon-squaresmall-minus { background-position: -64px -208px; }\n.ui-icon-squaresmall-close { background-position: -80px -208px; }\n.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }\n.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }\n.ui-icon-grip-solid-vertical { background-position: -32px -224px; }\n.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }\n.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }\n.ui-icon-grip-diagonal-se { background-position: -80px -224px; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Corner radius */\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-left,\n.ui-corner-tl {\n\tborder-top-left-radius: 3px;\n}\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-right,\n.ui-corner-tr {\n\tborder-top-right-radius: 3px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-left,\n.ui-corner-bl {\n\tborder-bottom-left-radius: 3px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-right,\n.ui-corner-br {\n\tborder-bottom-right-radius: 3px;\n}\n\n/* Overlays */\n.ui-widget-overlay {\n\tbackground: #aaaaaa;\n\topacity: .003;\n\tfilter: Alpha(Opacity=.3); /* support: IE8 */\n}\n.ui-widget-shadow {\n\t-webkit-box-shadow: 0px 0px 5px #666666;\n\tbox-shadow: 0px 0px 5px #666666;\n}\n"
  },
  {
    "path": "pages/include/jquery_ui/jquery-ui.js",
    "content": "/*! jQuery UI - v1.12.1 - 2018-03-25\n* http://jqueryui.com\n* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/selectmenu.js, widgets/slider.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js\n* Copyright jQuery Foundation and other contributors; Licensed MIT */\n\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([ \"jquery\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n$.ui = $.ui || {};\n\nvar version = $.ui.version = \"1.12.1\";\n\n\n/*!\n * jQuery UI Widget 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Widget\n//>>group: Core\n//>>description: Provides a factory for creating stateful widgets with a common API.\n//>>docs: http://api.jqueryui.com/jQuery.widget/\n//>>demos: http://jqueryui.com/widget/\n\n\n\nvar widgetUuid = 0;\nvar widgetSlice = Array.prototype.slice;\n\n$.cleanData = ( function( orig ) {\n\treturn function( elems ) {\n\t\tvar events, elem, i;\n\t\tfor ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\ttry {\n\n\t\t\t\t// Only trigger remove when necessary to save time\n\t\t\t\tevents = $._data( elem, \"events\" );\n\t\t\t\tif ( events && events.remove ) {\n\t\t\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t\t\t}\n\n\t\t\t// Http://bugs.jquery.com/ticket/8235\n\t\t\t} catch ( e ) {}\n\t\t}\n\t\torig( elems );\n\t};\n} )( $.cleanData );\n\n$.widget = function( name, base, prototype ) {\n\tvar existingConstructor, constructor, basePrototype;\n\n\t// ProxiedPrototype allows the provided prototype to remain unmodified\n\t// so that it can be used as a mixin for multiple widgets (#8876)\n\tvar proxiedPrototype = {};\n\n\tvar namespace = name.split( \".\" )[ 0 ];\n\tname = name.split( \".\" )[ 1 ];\n\tvar fullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\tif ( $.isArray( prototype ) ) {\n\t\tprototype = $.extend.apply( null, [ {} ].concat( prototype ) );\n\t}\n\n\t// Create selector for plugin\n\t$.expr[ \":\" ][ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\n\t\t// Allow instantiation without \"new\" keyword\n\t\tif ( !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t// Allow instantiation without initializing for simple inheritance\n\t\t// must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\n\t// Extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\n\t\t// Copy the object used to create the prototype in case we need to\n\t\t// redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\n\t\t// Track widgets that inherit from this widget in case this widget is\n\t\t// redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t} );\n\n\tbasePrototype = new base();\n\n\t// We need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( !$.isFunction( value ) ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = ( function() {\n\t\t\tfunction _super() {\n\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t}\n\n\t\t\tfunction _superApply( args ) {\n\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t}\n\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super;\n\t\t\t\tvar __superApply = this._superApply;\n\t\t\t\tvar returnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t} )();\n\t} );\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\n\t\t// TODO: remove support for widgetEventPrefix\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\n\t\t// don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t} );\n\n\t// If this widget is being redefined then we need to find all widgets that\n\t// are inheriting from it and redefine all of them so that they inherit from\n\t// the new version of this widget. We're essentially trying to replace one\n\t// level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t// Redefine the child widget using the same prototype that was\n\t\t\t// originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor,\n\t\t\t\tchild._proto );\n\t\t} );\n\n\t\t// Remove the list of existing child constructors from the old constructor\n\t\t// so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n\n\treturn constructor;\n};\n\n$.widget.extend = function( target ) {\n\tvar input = widgetSlice.call( arguments, 1 );\n\tvar inputIndex = 0;\n\tvar inputLength = input.length;\n\tvar key;\n\tvar value;\n\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\n\n\t\t\t\t// Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\n\t\t\t\t// Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\";\n\t\tvar args = widgetSlice.call( arguments, 1 );\n\t\tvar returnValue = this;\n\n\t\tif ( isMethodCall ) {\n\n\t\t\t// If this is an empty collection, we need to have the instance method\n\t\t\t// return undefined instead of the jQuery instance\n\t\t\tif ( !this.length && options === \"instance\" ) {\n\t\t\t\treturnValue = undefined;\n\t\t\t} else {\n\t\t\t\tthis.each( function() {\n\t\t\t\t\tvar methodValue;\n\t\t\t\t\tvar instance = $.data( this, fullName );\n\n\t\t\t\t\tif ( options === \"instance\" ) {\n\t\t\t\t\t\treturnValue = instance;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !instance ) {\n\t\t\t\t\t\treturn $.error( \"cannot call methods on \" + name +\n\t\t\t\t\t\t\t\" prior to initialization; \" +\n\t\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name +\n\t\t\t\t\t\t\t\" widget instance\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\n\t\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\t\tmethodValue;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// Allow multiple hashes to be passed on init\n\t\t\tif ( args.length ) {\n\t\t\t\toptions = $.widget.extend.apply( null, [ options ].concat( args ) );\n\t\t\t}\n\n\t\t\tthis.each( function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} );\n\t\t\t\t\tif ( instance._init ) {\n\t\t\t\t\t\tinstance._init();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( /* options, element */ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"<div>\",\n\n\toptions: {\n\t\tclasses: {},\n\t\tdisabled: false,\n\n\t\t// Callbacks\n\t\tcreate: null\n\t},\n\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = widgetUuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\t\tthis.classesElementLookup = {};\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t\tthis.document = $( element.style ?\n\n\t\t\t\t// Element within the document\n\t\t\t\telement.ownerDocument :\n\n\t\t\t\t// Element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );\n\t\t}\n\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis._create();\n\n\t\tif ( this.options.disabled ) {\n\t\t\tthis._setOptionDisabled( this.options.disabled );\n\t\t}\n\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\n\t_getCreateOptions: function() {\n\t\treturn {};\n\t},\n\n\t_getCreateEventData: $.noop,\n\n\t_create: $.noop,\n\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tvar that = this;\n\n\t\tthis._destroy();\n\t\t$.each( this.classesElementLookup, function( key, value ) {\n\t\t\tthat._removeClass( value, key );\n\t\t} );\n\n\t\t// We can probably remove the unbind calls in 2.0\n\t\t// all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeData( this.widgetFullName );\n\t\tthis.widget()\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" );\n\n\t\t// Clean up events and states\n\t\tthis.bindings.off( this.eventNamespace );\n\t},\n\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key;\n\t\tvar parts;\n\t\tvar curOption;\n\t\tvar i;\n\n\t\tif ( arguments.length === 0 ) {\n\n\t\t\t// Don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\n\t\t\t// Handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"classes\" ) {\n\t\t\tthis._setOptionClasses( value );\n\t\t}\n\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._setOptionDisabled( value );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOptionClasses: function( value ) {\n\t\tvar classKey, elements, currentElements;\n\n\t\tfor ( classKey in value ) {\n\t\t\tcurrentElements = this.classesElementLookup[ classKey ];\n\t\t\tif ( value[ classKey ] === this.options.classes[ classKey ] ||\n\t\t\t\t\t!currentElements ||\n\t\t\t\t\t!currentElements.length ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// We are doing this to create a new jQuery object because the _removeClass() call\n\t\t\t// on the next line is going to destroy the reference to the current elements being\n\t\t\t// tracked. We need to save a copy of this collection so that we can add the new classes\n\t\t\t// below.\n\t\t\telements = $( currentElements.get() );\n\t\t\tthis._removeClass( currentElements, classKey );\n\n\t\t\t// We don't use _addClass() here, because that uses this.options.classes\n\t\t\t// for generating the string of classes. We want to use the value passed in from\n\t\t\t// _setOption(), this is the new value of the classes option which was passed to\n\t\t\t// _setOption(). We pass this value directly to _classes().\n\t\t\telements.addClass( this._classes( {\n\t\t\t\telement: elements,\n\t\t\t\tkeys: classKey,\n\t\t\t\tclasses: value,\n\t\t\t\tadd: true\n\t\t\t} ) );\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._toggleClass( this.widget(), this.widgetFullName + \"-disabled\", null, !!value );\n\n\t\t// If the widget is becoming disabled, then nothing is interactive\n\t\tif ( value ) {\n\t\t\tthis._removeClass( this.hoverable, null, \"ui-state-hover\" );\n\t\t\tthis._removeClass( this.focusable, null, \"ui-state-focus\" );\n\t\t}\n\t},\n\n\tenable: function() {\n\t\treturn this._setOptions( { disabled: false } );\n\t},\n\n\tdisable: function() {\n\t\treturn this._setOptions( { disabled: true } );\n\t},\n\n\t_classes: function( options ) {\n\t\tvar full = [];\n\t\tvar that = this;\n\n\t\toptions = $.extend( {\n\t\t\telement: this.element,\n\t\t\tclasses: this.options.classes || {}\n\t\t}, options );\n\n\t\tfunction processClassString( classes, checkOption ) {\n\t\t\tvar current, i;\n\t\t\tfor ( i = 0; i < classes.length; i++ ) {\n\t\t\t\tcurrent = that.classesElementLookup[ classes[ i ] ] || $();\n\t\t\t\tif ( options.add ) {\n\t\t\t\t\tcurrent = $( $.unique( current.get().concat( options.element.get() ) ) );\n\t\t\t\t} else {\n\t\t\t\t\tcurrent = $( current.not( options.element ).get() );\n\t\t\t\t}\n\t\t\t\tthat.classesElementLookup[ classes[ i ] ] = current;\n\t\t\t\tfull.push( classes[ i ] );\n\t\t\t\tif ( checkOption && options.classes[ classes[ i ] ] ) {\n\t\t\t\t\tfull.push( options.classes[ classes[ i ] ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._on( options.element, {\n\t\t\t\"remove\": \"_untrackClassesElement\"\n\t\t} );\n\n\t\tif ( options.keys ) {\n\t\t\tprocessClassString( options.keys.match( /\\S+/g ) || [], true );\n\t\t}\n\t\tif ( options.extra ) {\n\t\t\tprocessClassString( options.extra.match( /\\S+/g ) || [] );\n\t\t}\n\n\t\treturn full.join( \" \" );\n\t},\n\n\t_untrackClassesElement: function( event ) {\n\t\tvar that = this;\n\t\t$.each( that.classesElementLookup, function( key, value ) {\n\t\t\tif ( $.inArray( event.target, value ) !== -1 ) {\n\t\t\t\tthat.classesElementLookup[ key ] = $( value.not( event.target ).get() );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_removeClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, false );\n\t},\n\n\t_addClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, true );\n\t},\n\n\t_toggleClass: function( element, keys, extra, add ) {\n\t\tadd = ( typeof add === \"boolean\" ) ? add : extra;\n\t\tvar shift = ( typeof element === \"string\" || element === null ),\n\t\t\toptions = {\n\t\t\t\textra: shift ? keys : extra,\n\t\t\t\tkeys: shift ? element : keys,\n\t\t\t\telement: shift ? this.element : element,\n\t\t\t\tadd: add\n\t\t\t};\n\t\toptions.element.toggleClass( this._classes( options ), add );\n\t\treturn this;\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement;\n\t\tvar instance = this;\n\n\t\t// No suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t// No element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\n\t\t\t\t// Allow widgets to customize the disabled handling\n\t\t\t\t// - disabled as an array instead of boolean\n\t\t\t\t// - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t// Copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( /^([\\w:-]*)\\s*(.*)$/ );\n\t\t\tvar eventName = match[ 1 ] + instance.eventNamespace;\n\t\t\tvar selector = match[ 2 ];\n\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.on( eventName, selector, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.on( eventName, handlerProxy );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = ( eventName || \"\" ).split( \" \" ).join( this.eventNamespace + \" \" ) +\n\t\t\tthis.eventNamespace;\n\t\telement.off( eventName ).off( eventName );\n\n\t\t// Clear the stack to avoid memory leaks (#10056)\n\t\tthis.bindings = $( this.bindings.not( element ).get() );\n\t\tthis.focusable = $( this.focusable.not( element ).get() );\n\t\tthis.hoverable = $( this.hoverable.not( element ).get() );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig;\n\t\tvar callback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\n\t\t// The original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// Copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( $.isFunction( callback ) &&\n\t\t\tcallback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\n\t\tvar hasOptions;\n\t\tvar effectName = !options ?\n\t\t\tmethod :\n\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\tdefaultEffect :\n\t\t\t\toptions.effect || defaultEffect;\n\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t}\n\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue( function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t} );\n\t\t}\n\t};\n} );\n\nvar widget = $.widget;\n\n\n/*!\n * jQuery UI Position 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/position/\n */\n\n//>>label: Position\n//>>group: Core\n//>>description: Positions elements relative to other elements.\n//>>docs: http://api.jqueryui.com/position/\n//>>demos: http://jqueryui.com/position/\n\n\n( function() {\nvar cachedScrollbarWidth,\n\tmax = Math.max,\n\tabs = Math.abs,\n\trhorizontal = /left|center|right/,\n\trvertical = /top|center|bottom/,\n\troffset = /[\\+\\-]\\d+(\\.[\\d]+)?%?/,\n\trposition = /^\\w+/,\n\trpercent = /%$/,\n\t_position = $.fn.position;\n\nfunction getOffsets( offsets, width, height ) {\n\treturn [\n\t\tparseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),\n\t\tparseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )\n\t];\n}\n\nfunction parseCss( element, property ) {\n\treturn parseInt( $.css( element, property ), 10 ) || 0;\n}\n\nfunction getDimensions( elem ) {\n\tvar raw = elem[ 0 ];\n\tif ( raw.nodeType === 9 ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: 0, left: 0 }\n\t\t};\n\t}\n\tif ( $.isWindow( raw ) ) {\n\t\treturn {\n\t\t\twidth: elem.width(),\n\t\t\theight: elem.height(),\n\t\t\toffset: { top: elem.scrollTop(), left: elem.scrollLeft() }\n\t\t};\n\t}\n\tif ( raw.preventDefault ) {\n\t\treturn {\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\toffset: { top: raw.pageY, left: raw.pageX }\n\t\t};\n\t}\n\treturn {\n\t\twidth: elem.outerWidth(),\n\t\theight: elem.outerHeight(),\n\t\toffset: elem.offset()\n\t};\n}\n\n$.position = {\n\tscrollbarWidth: function() {\n\t\tif ( cachedScrollbarWidth !== undefined ) {\n\t\t\treturn cachedScrollbarWidth;\n\t\t}\n\t\tvar w1, w2,\n\t\t\tdiv = $( \"<div \" +\n\t\t\t\t\"style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'>\" +\n\t\t\t\t\"<div style='height:100px;width:auto;'></div></div>\" ),\n\t\t\tinnerDiv = div.children()[ 0 ];\n\n\t\t$( \"body\" ).append( div );\n\t\tw1 = innerDiv.offsetWidth;\n\t\tdiv.css( \"overflow\", \"scroll\" );\n\n\t\tw2 = innerDiv.offsetWidth;\n\n\t\tif ( w1 === w2 ) {\n\t\t\tw2 = div[ 0 ].clientWidth;\n\t\t}\n\n\t\tdiv.remove();\n\n\t\treturn ( cachedScrollbarWidth = w1 - w2 );\n\t},\n\tgetScrollInfo: function( within ) {\n\t\tvar overflowX = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-x\" ),\n\t\t\toverflowY = within.isWindow || within.isDocument ? \"\" :\n\t\t\t\twithin.element.css( \"overflow-y\" ),\n\t\t\thasOverflowX = overflowX === \"scroll\" ||\n\t\t\t\t( overflowX === \"auto\" && within.width < within.element[ 0 ].scrollWidth ),\n\t\t\thasOverflowY = overflowY === \"scroll\" ||\n\t\t\t\t( overflowY === \"auto\" && within.height < within.element[ 0 ].scrollHeight );\n\t\treturn {\n\t\t\twidth: hasOverflowY ? $.position.scrollbarWidth() : 0,\n\t\t\theight: hasOverflowX ? $.position.scrollbarWidth() : 0\n\t\t};\n\t},\n\tgetWithinInfo: function( element ) {\n\t\tvar withinElement = $( element || window ),\n\t\t\tisWindow = $.isWindow( withinElement[ 0 ] ),\n\t\t\tisDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,\n\t\t\thasOffset = !isWindow && !isDocument;\n\t\treturn {\n\t\t\telement: withinElement,\n\t\t\tisWindow: isWindow,\n\t\t\tisDocument: isDocument,\n\t\t\toffset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },\n\t\t\tscrollLeft: withinElement.scrollLeft(),\n\t\t\tscrollTop: withinElement.scrollTop(),\n\t\t\twidth: withinElement.outerWidth(),\n\t\t\theight: withinElement.outerHeight()\n\t\t};\n\t}\n};\n\n$.fn.position = function( options ) {\n\tif ( !options || !options.of ) {\n\t\treturn _position.apply( this, arguments );\n\t}\n\n\t// Make a copy, we don't want to modify arguments\n\toptions = $.extend( {}, options );\n\n\tvar atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,\n\t\ttarget = $( options.of ),\n\t\twithin = $.position.getWithinInfo( options.within ),\n\t\tscrollInfo = $.position.getScrollInfo( within ),\n\t\tcollision = ( options.collision || \"flip\" ).split( \" \" ),\n\t\toffsets = {};\n\n\tdimensions = getDimensions( target );\n\tif ( target[ 0 ].preventDefault ) {\n\n\t\t// Force left top to allow flipping\n\t\toptions.at = \"left top\";\n\t}\n\ttargetWidth = dimensions.width;\n\ttargetHeight = dimensions.height;\n\ttargetOffset = dimensions.offset;\n\n\t// Clone to reuse original targetOffset later\n\tbasePosition = $.extend( {}, targetOffset );\n\n\t// Force my and at to have valid horizontal and vertical positions\n\t// if a value is missing or invalid, it will be converted to center\n\t$.each( [ \"my\", \"at\" ], function() {\n\t\tvar pos = ( options[ this ] || \"\" ).split( \" \" ),\n\t\t\thorizontalOffset,\n\t\t\tverticalOffset;\n\n\t\tif ( pos.length === 1 ) {\n\t\t\tpos = rhorizontal.test( pos[ 0 ] ) ?\n\t\t\t\tpos.concat( [ \"center\" ] ) :\n\t\t\t\trvertical.test( pos[ 0 ] ) ?\n\t\t\t\t\t[ \"center\" ].concat( pos ) :\n\t\t\t\t\t[ \"center\", \"center\" ];\n\t\t}\n\t\tpos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : \"center\";\n\t\tpos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : \"center\";\n\n\t\t// Calculate offsets\n\t\thorizontalOffset = roffset.exec( pos[ 0 ] );\n\t\tverticalOffset = roffset.exec( pos[ 1 ] );\n\t\toffsets[ this ] = [\n\t\t\thorizontalOffset ? horizontalOffset[ 0 ] : 0,\n\t\t\tverticalOffset ? verticalOffset[ 0 ] : 0\n\t\t];\n\n\t\t// Reduce to just the positions without the offsets\n\t\toptions[ this ] = [\n\t\t\trposition.exec( pos[ 0 ] )[ 0 ],\n\t\t\trposition.exec( pos[ 1 ] )[ 0 ]\n\t\t];\n\t} );\n\n\t// Normalize collision option\n\tif ( collision.length === 1 ) {\n\t\tcollision[ 1 ] = collision[ 0 ];\n\t}\n\n\tif ( options.at[ 0 ] === \"right\" ) {\n\t\tbasePosition.left += targetWidth;\n\t} else if ( options.at[ 0 ] === \"center\" ) {\n\t\tbasePosition.left += targetWidth / 2;\n\t}\n\n\tif ( options.at[ 1 ] === \"bottom\" ) {\n\t\tbasePosition.top += targetHeight;\n\t} else if ( options.at[ 1 ] === \"center\" ) {\n\t\tbasePosition.top += targetHeight / 2;\n\t}\n\n\tatOffset = getOffsets( offsets.at, targetWidth, targetHeight );\n\tbasePosition.left += atOffset[ 0 ];\n\tbasePosition.top += atOffset[ 1 ];\n\n\treturn this.each( function() {\n\t\tvar collisionPosition, using,\n\t\t\telem = $( this ),\n\t\t\telemWidth = elem.outerWidth(),\n\t\t\telemHeight = elem.outerHeight(),\n\t\t\tmarginLeft = parseCss( this, \"marginLeft\" ),\n\t\t\tmarginTop = parseCss( this, \"marginTop\" ),\n\t\t\tcollisionWidth = elemWidth + marginLeft + parseCss( this, \"marginRight\" ) +\n\t\t\t\tscrollInfo.width,\n\t\t\tcollisionHeight = elemHeight + marginTop + parseCss( this, \"marginBottom\" ) +\n\t\t\t\tscrollInfo.height,\n\t\t\tposition = $.extend( {}, basePosition ),\n\t\t\tmyOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );\n\n\t\tif ( options.my[ 0 ] === \"right\" ) {\n\t\t\tposition.left -= elemWidth;\n\t\t} else if ( options.my[ 0 ] === \"center\" ) {\n\t\t\tposition.left -= elemWidth / 2;\n\t\t}\n\n\t\tif ( options.my[ 1 ] === \"bottom\" ) {\n\t\t\tposition.top -= elemHeight;\n\t\t} else if ( options.my[ 1 ] === \"center\" ) {\n\t\t\tposition.top -= elemHeight / 2;\n\t\t}\n\n\t\tposition.left += myOffset[ 0 ];\n\t\tposition.top += myOffset[ 1 ];\n\n\t\tcollisionPosition = {\n\t\t\tmarginLeft: marginLeft,\n\t\t\tmarginTop: marginTop\n\t\t};\n\n\t\t$.each( [ \"left\", \"top\" ], function( i, dir ) {\n\t\t\tif ( $.ui.position[ collision[ i ] ] ) {\n\t\t\t\t$.ui.position[ collision[ i ] ][ dir ]( position, {\n\t\t\t\t\ttargetWidth: targetWidth,\n\t\t\t\t\ttargetHeight: targetHeight,\n\t\t\t\t\telemWidth: elemWidth,\n\t\t\t\t\telemHeight: elemHeight,\n\t\t\t\t\tcollisionPosition: collisionPosition,\n\t\t\t\t\tcollisionWidth: collisionWidth,\n\t\t\t\t\tcollisionHeight: collisionHeight,\n\t\t\t\t\toffset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],\n\t\t\t\t\tmy: options.my,\n\t\t\t\t\tat: options.at,\n\t\t\t\t\twithin: within,\n\t\t\t\t\telem: elem\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\tif ( options.using ) {\n\n\t\t\t// Adds feedback as second argument to using callback, if present\n\t\t\tusing = function( props ) {\n\t\t\t\tvar left = targetOffset.left - position.left,\n\t\t\t\t\tright = left + targetWidth - elemWidth,\n\t\t\t\t\ttop = targetOffset.top - position.top,\n\t\t\t\t\tbottom = top + targetHeight - elemHeight,\n\t\t\t\t\tfeedback = {\n\t\t\t\t\t\ttarget: {\n\t\t\t\t\t\t\telement: target,\n\t\t\t\t\t\t\tleft: targetOffset.left,\n\t\t\t\t\t\t\ttop: targetOffset.top,\n\t\t\t\t\t\t\twidth: targetWidth,\n\t\t\t\t\t\t\theight: targetHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\telement: {\n\t\t\t\t\t\t\telement: elem,\n\t\t\t\t\t\t\tleft: position.left,\n\t\t\t\t\t\t\ttop: position.top,\n\t\t\t\t\t\t\twidth: elemWidth,\n\t\t\t\t\t\t\theight: elemHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\thorizontal: right < 0 ? \"left\" : left > 0 ? \"right\" : \"center\",\n\t\t\t\t\t\tvertical: bottom < 0 ? \"top\" : top > 0 ? \"bottom\" : \"middle\"\n\t\t\t\t\t};\n\t\t\t\tif ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {\n\t\t\t\t\tfeedback.horizontal = \"center\";\n\t\t\t\t}\n\t\t\t\tif ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {\n\t\t\t\t\tfeedback.vertical = \"middle\";\n\t\t\t\t}\n\t\t\t\tif ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {\n\t\t\t\t\tfeedback.important = \"horizontal\";\n\t\t\t\t} else {\n\t\t\t\t\tfeedback.important = \"vertical\";\n\t\t\t\t}\n\t\t\t\toptions.using.call( this, props, feedback );\n\t\t\t};\n\t\t}\n\n\t\telem.offset( $.extend( position, { using: using } ) );\n\t} );\n};\n\n$.ui.position = {\n\tfit: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\touterWidth = within.width,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = withinOffset - collisionPosLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,\n\t\t\t\tnewOverRight;\n\n\t\t\t// Element is wider than within\n\t\t\tif ( data.collisionWidth > outerWidth ) {\n\n\t\t\t\t// Element is initially over the left side of within\n\t\t\t\tif ( overLeft > 0 && overRight <= 0 ) {\n\t\t\t\t\tnewOverRight = position.left + overLeft + data.collisionWidth - outerWidth -\n\t\t\t\t\t\twithinOffset;\n\t\t\t\t\tposition.left += overLeft - newOverRight;\n\n\t\t\t\t// Element is initially over right side of within\n\t\t\t\t} else if ( overRight > 0 && overLeft <= 0 ) {\n\t\t\t\t\tposition.left = withinOffset;\n\n\t\t\t\t// Element is initially over both left and right sides of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overLeft > overRight ) {\n\t\t\t\t\t\tposition.left = withinOffset + outerWidth - data.collisionWidth;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.left = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Too far left -> align with left edge\n\t\t\t} else if ( overLeft > 0 ) {\n\t\t\t\tposition.left += overLeft;\n\n\t\t\t// Too far right -> align with right edge\n\t\t\t} else if ( overRight > 0 ) {\n\t\t\t\tposition.left -= overRight;\n\n\t\t\t// Adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.left = max( position.left - collisionPosLeft, position.left );\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\touterHeight = data.within.height,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = withinOffset - collisionPosTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,\n\t\t\t\tnewOverBottom;\n\n\t\t\t// Element is taller than within\n\t\t\tif ( data.collisionHeight > outerHeight ) {\n\n\t\t\t\t// Element is initially over the top of within\n\t\t\t\tif ( overTop > 0 && overBottom <= 0 ) {\n\t\t\t\t\tnewOverBottom = position.top + overTop + data.collisionHeight - outerHeight -\n\t\t\t\t\t\twithinOffset;\n\t\t\t\t\tposition.top += overTop - newOverBottom;\n\n\t\t\t\t// Element is initially over bottom of within\n\t\t\t\t} else if ( overBottom > 0 && overTop <= 0 ) {\n\t\t\t\t\tposition.top = withinOffset;\n\n\t\t\t\t// Element is initially over both top and bottom of within\n\t\t\t\t} else {\n\t\t\t\t\tif ( overTop > overBottom ) {\n\t\t\t\t\t\tposition.top = withinOffset + outerHeight - data.collisionHeight;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition.top = withinOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Too far up -> align with top\n\t\t\t} else if ( overTop > 0 ) {\n\t\t\t\tposition.top += overTop;\n\n\t\t\t// Too far down -> align with bottom edge\n\t\t\t} else if ( overBottom > 0 ) {\n\t\t\t\tposition.top -= overBottom;\n\n\t\t\t// Adjust based on position and margin\n\t\t\t} else {\n\t\t\t\tposition.top = max( position.top - collisionPosTop, position.top );\n\t\t\t}\n\t\t}\n\t},\n\tflip: {\n\t\tleft: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.left + within.scrollLeft,\n\t\t\t\touterWidth = within.width,\n\t\t\t\toffsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\n\t\t\t\toverLeft = collisionPosLeft - offsetLeft,\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,\n\t\t\t\tmyOffset = data.my[ 0 ] === \"left\" ?\n\t\t\t\t\t-data.elemWidth :\n\t\t\t\t\tdata.my[ 0 ] === \"right\" ?\n\t\t\t\t\t\tdata.elemWidth :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 0 ] === \"left\" ?\n\t\t\t\t\tdata.targetWidth :\n\t\t\t\t\tdata.at[ 0 ] === \"right\" ?\n\t\t\t\t\t\t-data.targetWidth :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 0 ],\n\t\t\t\tnewOverRight,\n\t\t\t\tnewOverLeft;\n\n\t\t\tif ( overLeft < 0 ) {\n\t\t\t\tnewOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -\n\t\t\t\t\touterWidth - withinOffset;\n\t\t\t\tif ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t} else if ( overRight > 0 ) {\n\t\t\t\tnewOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +\n\t\t\t\t\tatOffset + offset - offsetLeft;\n\t\t\t\tif ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttop: function( position, data ) {\n\t\t\tvar within = data.within,\n\t\t\t\twithinOffset = within.offset.top + within.scrollTop,\n\t\t\t\touterHeight = within.height,\n\t\t\t\toffsetTop = within.isWindow ? within.scrollTop : within.offset.top,\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\n\t\t\t\toverTop = collisionPosTop - offsetTop,\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,\n\t\t\t\ttop = data.my[ 1 ] === \"top\",\n\t\t\t\tmyOffset = top ?\n\t\t\t\t\t-data.elemHeight :\n\t\t\t\t\tdata.my[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\tdata.elemHeight :\n\t\t\t\t\t\t0,\n\t\t\t\tatOffset = data.at[ 1 ] === \"top\" ?\n\t\t\t\t\tdata.targetHeight :\n\t\t\t\t\tdata.at[ 1 ] === \"bottom\" ?\n\t\t\t\t\t\t-data.targetHeight :\n\t\t\t\t\t\t0,\n\t\t\t\toffset = -2 * data.offset[ 1 ],\n\t\t\t\tnewOverTop,\n\t\t\t\tnewOverBottom;\n\t\t\tif ( overTop < 0 ) {\n\t\t\t\tnewOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -\n\t\t\t\t\touterHeight - withinOffset;\n\t\t\t\tif ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t} else if ( overBottom > 0 ) {\n\t\t\t\tnewOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +\n\t\t\t\t\toffset - offsetTop;\n\t\t\t\tif ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tflipfit: {\n\t\tleft: function() {\n\t\t\t$.ui.position.flip.left.apply( this, arguments );\n\t\t\t$.ui.position.fit.left.apply( this, arguments );\n\t\t},\n\t\ttop: function() {\n\t\t\t$.ui.position.flip.top.apply( this, arguments );\n\t\t\t$.ui.position.fit.top.apply( this, arguments );\n\t\t}\n\t}\n};\n\n} )();\n\nvar position = $.ui.position;\n\n\n/*!\n * jQuery UI :data 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: :data Selector\n//>>group: Core\n//>>description: Selects elements which have data stored under the specified key.\n//>>docs: http://api.jqueryui.com/data-selector/\n\n\nvar data = $.extend( $.expr[ \":\" ], {\n\tdata: $.expr.createPseudo ?\n\t\t$.expr.createPseudo( function( dataName ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn !!$.data( elem, dataName );\n\t\t\t};\n\t\t} ) :\n\n\t\t// Support: jQuery <1.8\n\t\tfunction( elem, i, match ) {\n\t\t\treturn !!$.data( elem, match[ 3 ] );\n\t\t}\n} );\n\n/*!\n * jQuery UI Disable Selection 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: disableSelection\n//>>group: Core\n//>>description: Disable selection of text content within the set of matched elements.\n//>>docs: http://api.jqueryui.com/disableSelection/\n\n// This file is deprecated\n\n\nvar disableSelection = $.fn.extend( {\n\tdisableSelection: ( function() {\n\t\tvar eventType = \"onselectstart\" in document.createElement( \"div\" ) ?\n\t\t\t\"selectstart\" :\n\t\t\t\"mousedown\";\n\n\t\treturn function() {\n\t\t\treturn this.on( eventType + \".ui-disableSelection\", function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t} );\n\t\t};\n\t} )(),\n\n\tenableSelection: function() {\n\t\treturn this.off( \".ui-disableSelection\" );\n\t}\n} );\n\n\n/*!\n * jQuery UI Focusable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: :focusable Selector\n//>>group: Core\n//>>description: Selects elements which can be focused.\n//>>docs: http://api.jqueryui.com/focusable-selector/\n\n\n\n// Selectors\n$.ui.focusable = function( element, hasTabindex ) {\n\tvar map, mapName, img, focusableIfVisible, fieldset,\n\t\tnodeName = element.nodeName.toLowerCase();\n\n\tif ( \"area\" === nodeName ) {\n\t\tmap = element.parentNode;\n\t\tmapName = map.name;\n\t\tif ( !element.href || !mapName || map.nodeName.toLowerCase() !== \"map\" ) {\n\t\t\treturn false;\n\t\t}\n\t\timg = $( \"img[usemap='#\" + mapName + \"']\" );\n\t\treturn img.length > 0 && img.is( \":visible\" );\n\t}\n\n\tif ( /^(input|select|textarea|button|object)$/.test( nodeName ) ) {\n\t\tfocusableIfVisible = !element.disabled;\n\n\t\tif ( focusableIfVisible ) {\n\n\t\t\t// Form controls within a disabled fieldset are disabled.\n\t\t\t// However, controls within the fieldset's legend do not get disabled.\n\t\t\t// Since controls generally aren't placed inside legends, we skip\n\t\t\t// this portion of the check.\n\t\t\tfieldset = $( element ).closest( \"fieldset\" )[ 0 ];\n\t\t\tif ( fieldset ) {\n\t\t\t\tfocusableIfVisible = !fieldset.disabled;\n\t\t\t}\n\t\t}\n\t} else if ( \"a\" === nodeName ) {\n\t\tfocusableIfVisible = element.href || hasTabindex;\n\t} else {\n\t\tfocusableIfVisible = hasTabindex;\n\t}\n\n\treturn focusableIfVisible && $( element ).is( \":visible\" ) && visible( $( element ) );\n};\n\n// Support: IE 8 only\n// IE 8 doesn't resolve inherit to visible/hidden for computed values\nfunction visible( element ) {\n\tvar visibility = element.css( \"visibility\" );\n\twhile ( visibility === \"inherit\" ) {\n\t\telement = element.parent();\n\t\tvisibility = element.css( \"visibility\" );\n\t}\n\treturn visibility !== \"hidden\";\n}\n\n$.extend( $.expr[ \":\" ], {\n\tfocusable: function( element ) {\n\t\treturn $.ui.focusable( element, $.attr( element, \"tabindex\" ) != null );\n\t}\n} );\n\nvar focusable = $.ui.focusable;\n\n\n\n\n// Support: IE8 Only\n// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop\n// with a string, so we need to find the proper form.\nvar form = $.fn.form = function() {\n\treturn typeof this[ 0 ].form === \"string\" ? this.closest( \"form\" ) : $( this[ 0 ].form );\n};\n\n\n/*!\n * jQuery UI Form Reset Mixin 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Form Reset Mixin\n//>>group: Core\n//>>description: Refresh input widgets when their form is reset\n//>>docs: http://api.jqueryui.com/form-reset-mixin/\n\n\n\nvar formResetMixin = $.ui.formResetMixin = {\n\t_formResetHandler: function() {\n\t\tvar form = $( this );\n\n\t\t// Wait for the form reset to actually happen before refreshing\n\t\tsetTimeout( function() {\n\t\t\tvar instances = form.data( \"ui-form-reset-instances\" );\n\t\t\t$.each( instances, function() {\n\t\t\t\tthis.refresh();\n\t\t\t} );\n\t\t} );\n\t},\n\n\t_bindFormResetHandler: function() {\n\t\tthis.form = this.element.form();\n\t\tif ( !this.form.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar instances = this.form.data( \"ui-form-reset-instances\" ) || [];\n\t\tif ( !instances.length ) {\n\n\t\t\t// We don't use _on() here because we use a single event handler per form\n\t\t\tthis.form.on( \"reset.ui-form-reset\", this._formResetHandler );\n\t\t}\n\t\tinstances.push( this );\n\t\tthis.form.data( \"ui-form-reset-instances\", instances );\n\t},\n\n\t_unbindFormResetHandler: function() {\n\t\tif ( !this.form.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar instances = this.form.data( \"ui-form-reset-instances\" );\n\t\tinstances.splice( $.inArray( this, instances ), 1 );\n\t\tif ( instances.length ) {\n\t\t\tthis.form.data( \"ui-form-reset-instances\", instances );\n\t\t} else {\n\t\t\tthis.form\n\t\t\t\t.removeData( \"ui-form-reset-instances\" )\n\t\t\t\t.off( \"reset.ui-form-reset\" );\n\t\t}\n\t}\n};\n\n\n/*!\n * jQuery UI Support for jQuery core 1.7.x 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n */\n\n//>>label: jQuery 1.7 Support\n//>>group: Core\n//>>description: Support version 1.7.x of jQuery core\n\n\n\n// Support: jQuery 1.7 only\n// Not a great way to check versions, but since we only support 1.7+ and only\n// need to detect <1.8, this is a simple check that should suffice. Checking\n// for \"1.7.\" would be a bit safer, but the version string is 1.7, not 1.7.0\n// and we'll never reach 1.70.0 (if we do, we certainly won't be supporting\n// 1.7 anymore). See #11197 for why we're not using feature detection.\nif ( $.fn.jquery.substring( 0, 3 ) === \"1.7\" ) {\n\n\t// Setters for .innerWidth(), .innerHeight(), .outerWidth(), .outerHeight()\n\t// Unlike jQuery Core 1.8+, these only support numeric values to set the\n\t// dimensions in pixels\n\t$.each( [ \"Width\", \"Height\" ], function( i, name ) {\n\t\tvar side = name === \"Width\" ? [ \"Left\", \"Right\" ] : [ \"Top\", \"Bottom\" ],\n\t\t\ttype = name.toLowerCase(),\n\t\t\torig = {\n\t\t\t\tinnerWidth: $.fn.innerWidth,\n\t\t\t\tinnerHeight: $.fn.innerHeight,\n\t\t\t\touterWidth: $.fn.outerWidth,\n\t\t\t\touterHeight: $.fn.outerHeight\n\t\t\t};\n\n\t\tfunction reduce( elem, size, border, margin ) {\n\t\t\t$.each( side, function() {\n\t\t\t\tsize -= parseFloat( $.css( elem, \"padding\" + this ) ) || 0;\n\t\t\t\tif ( border ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"border\" + this + \"Width\" ) ) || 0;\n\t\t\t\t}\n\t\t\t\tif ( margin ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"margin\" + this ) ) || 0;\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn size;\n\t\t}\n\n\t\t$.fn[ \"inner\" + name ] = function( size ) {\n\t\t\tif ( size === undefined ) {\n\t\t\t\treturn orig[ \"inner\" + name ].call( this );\n\t\t\t}\n\n\t\t\treturn this.each( function() {\n\t\t\t\t$( this ).css( type, reduce( this, size ) + \"px\" );\n\t\t\t} );\n\t\t};\n\n\t\t$.fn[ \"outer\" + name ] = function( size, margin ) {\n\t\t\tif ( typeof size !== \"number\" ) {\n\t\t\t\treturn orig[ \"outer\" + name ].call( this, size );\n\t\t\t}\n\n\t\t\treturn this.each( function() {\n\t\t\t\t$( this ).css( type, reduce( this, size, true, margin ) + \"px\" );\n\t\t\t} );\n\t\t};\n\t} );\n\n\t$.fn.addBack = function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t};\n}\n\n;\n/*!\n * jQuery UI Keycode 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Keycode\n//>>group: Core\n//>>description: Provide keycodes as keynames\n//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/\n\n\nvar keycode = $.ui.keyCode = {\n\tBACKSPACE: 8,\n\tCOMMA: 188,\n\tDELETE: 46,\n\tDOWN: 40,\n\tEND: 35,\n\tENTER: 13,\n\tESCAPE: 27,\n\tHOME: 36,\n\tLEFT: 37,\n\tPAGE_DOWN: 34,\n\tPAGE_UP: 33,\n\tPERIOD: 190,\n\tRIGHT: 39,\n\tSPACE: 32,\n\tTAB: 9,\n\tUP: 38\n};\n\n\n\n\n// Internal use only\nvar escapeSelector = $.ui.escapeSelector = ( function() {\n\tvar selectorEscape = /([!\"#$%&'()*+,./:;<=>?@[\\]^`{|}~])/g;\n\treturn function( selector ) {\n\t\treturn selector.replace( selectorEscape, \"\\\\$1\" );\n\t};\n} )();\n\n\n/*!\n * jQuery UI Labels 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: labels\n//>>group: Core\n//>>description: Find all the labels associated with a given input\n//>>docs: http://api.jqueryui.com/labels/\n\n\n\nvar labels = $.fn.labels = function() {\n\tvar ancestor, selector, id, labels, ancestors;\n\n\t// Check control.labels first\n\tif ( this[ 0 ].labels && this[ 0 ].labels.length ) {\n\t\treturn this.pushStack( this[ 0 ].labels );\n\t}\n\n\t// Support: IE <= 11, FF <= 37, Android <= 2.3 only\n\t// Above browsers do not support control.labels. Everything below is to support them\n\t// as well as document fragments. control.labels does not work on document fragments\n\tlabels = this.eq( 0 ).parents( \"label\" );\n\n\t// Look for the label based on the id\n\tid = this.attr( \"id\" );\n\tif ( id ) {\n\n\t\t// We don't search against the document in case the element\n\t\t// is disconnected from the DOM\n\t\tancestor = this.eq( 0 ).parents().last();\n\n\t\t// Get a full set of top level ancestors\n\t\tancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() );\n\n\t\t// Create a selector for the label based on the id\n\t\tselector = \"label[for='\" + $.ui.escapeSelector( id ) + \"']\";\n\n\t\tlabels = labels.add( ancestors.find( selector ).addBack( selector ) );\n\n\t}\n\n\t// Return whatever we have found for labels\n\treturn this.pushStack( labels );\n};\n\n\n/*!\n * jQuery UI Scroll Parent 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: scrollParent\n//>>group: Core\n//>>description: Get the closest ancestor element that is scrollable.\n//>>docs: http://api.jqueryui.com/scrollParent/\n\n\n\nvar scrollParent = $.fn.scrollParent = function( includeHidden ) {\n\tvar position = this.css( \"position\" ),\n\t\texcludeStaticParent = position === \"absolute\",\n\t\toverflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,\n\t\tscrollParent = this.parents().filter( function() {\n\t\t\tvar parent = $( this );\n\t\t\tif ( excludeStaticParent && parent.css( \"position\" ) === \"static\" ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn overflowRegex.test( parent.css( \"overflow\" ) + parent.css( \"overflow-y\" ) +\n\t\t\t\tparent.css( \"overflow-x\" ) );\n\t\t} ).eq( 0 );\n\n\treturn position === \"fixed\" || !scrollParent.length ?\n\t\t$( this[ 0 ].ownerDocument || document ) :\n\t\tscrollParent;\n};\n\n\n/*!\n * jQuery UI Tabbable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: :tabbable Selector\n//>>group: Core\n//>>description: Selects elements which can be tabbed to.\n//>>docs: http://api.jqueryui.com/tabbable-selector/\n\n\n\nvar tabbable = $.extend( $.expr[ \":\" ], {\n\ttabbable: function( element ) {\n\t\tvar tabIndex = $.attr( element, \"tabindex\" ),\n\t\t\thasTabindex = tabIndex != null;\n\t\treturn ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex );\n\t}\n} );\n\n\n/*!\n * jQuery UI Unique ID 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: uniqueId\n//>>group: Core\n//>>description: Functions to generate and remove uniqueId's\n//>>docs: http://api.jqueryui.com/uniqueId/\n\n\n\nvar uniqueId = $.fn.extend( {\n\tuniqueId: ( function() {\n\t\tvar uuid = 0;\n\n\t\treturn function() {\n\t\t\treturn this.each( function() {\n\t\t\t\tif ( !this.id ) {\n\t\t\t\t\tthis.id = \"ui-id-\" + ( ++uuid );\n\t\t\t\t}\n\t\t\t} );\n\t\t};\n\t} )(),\n\n\tremoveUniqueId: function() {\n\t\treturn this.each( function() {\n\t\t\tif ( /^ui-id-\\d+$/.test( this.id ) ) {\n\t\t\t\t$( this ).removeAttr( \"id\" );\n\t\t\t}\n\t\t} );\n\t}\n} );\n\n\n\n\n// This file is deprecated\nvar ie = $.ui.ie = !!/msie [\\w.]+/.exec( navigator.userAgent.toLowerCase() );\n\n/*!\n * jQuery UI Mouse 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Mouse\n//>>group: Widgets\n//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.\n//>>docs: http://api.jqueryui.com/mouse/\n\n\n\nvar mouseHandled = false;\n$( document ).on( \"mouseup\", function() {\n\tmouseHandled = false;\n} );\n\nvar widgetsMouse = $.widget( \"ui.mouse\", {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tcancel: \"input, textarea, button, select, option\",\n\t\tdistance: 1,\n\t\tdelay: 0\n\t},\n\t_mouseInit: function() {\n\t\tvar that = this;\n\n\t\tthis.element\n\t\t\t.on( \"mousedown.\" + this.widgetName, function( event ) {\n\t\t\t\treturn that._mouseDown( event );\n\t\t\t} )\n\t\t\t.on( \"click.\" + this.widgetName, function( event ) {\n\t\t\t\tif ( true === $.data( event.target, that.widgetName + \".preventClickEvent\" ) ) {\n\t\t\t\t\t$.removeData( event.target, that.widgetName + \".preventClickEvent\" );\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\n\t\tthis.started = false;\n\t},\n\n\t// TODO: make sure destroying one instance of mouse doesn't mess with\n\t// other instances of mouse\n\t_mouseDestroy: function() {\n\t\tthis.element.off( \".\" + this.widgetName );\n\t\tif ( this._mouseMoveDelegate ) {\n\t\t\tthis.document\n\t\t\t\t.off( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t\t.off( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\t\t}\n\t},\n\n\t_mouseDown: function( event ) {\n\n\t\t// don't let more than one widget handle mouseStart\n\t\tif ( mouseHandled ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._mouseMoved = false;\n\n\t\t// We may have missed mouseup (out of window)\n\t\t( this._mouseStarted && this._mouseUp( event ) );\n\n\t\tthis._mouseDownEvent = event;\n\n\t\tvar that = this,\n\t\t\tbtnIsLeft = ( event.which === 1 ),\n\n\t\t\t// event.target.nodeName works around a bug in IE 8 with\n\t\t\t// disabled inputs (#7620)\n\t\t\telIsCancel = ( typeof this.options.cancel === \"string\" && event.target.nodeName ?\n\t\t\t\t$( event.target ).closest( this.options.cancel ).length : false );\n\t\tif ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.mouseDelayMet = !this.options.delay;\n\t\tif ( !this.mouseDelayMet ) {\n\t\t\tthis._mouseDelayTimer = setTimeout( function() {\n\t\t\t\tthat.mouseDelayMet = true;\n\t\t\t}, this.options.delay );\n\t\t}\n\n\t\tif ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {\n\t\t\tthis._mouseStarted = ( this._mouseStart( event ) !== false );\n\t\t\tif ( !this._mouseStarted ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Click event may never have fired (Gecko & Opera)\n\t\tif ( true === $.data( event.target, this.widgetName + \".preventClickEvent\" ) ) {\n\t\t\t$.removeData( event.target, this.widgetName + \".preventClickEvent\" );\n\t\t}\n\n\t\t// These delegates are required to keep context\n\t\tthis._mouseMoveDelegate = function( event ) {\n\t\t\treturn that._mouseMove( event );\n\t\t};\n\t\tthis._mouseUpDelegate = function( event ) {\n\t\t\treturn that._mouseUp( event );\n\t\t};\n\n\t\tthis.document\n\t\t\t.on( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t.on( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\n\t\tevent.preventDefault();\n\n\t\tmouseHandled = true;\n\t\treturn true;\n\t},\n\n\t_mouseMove: function( event ) {\n\n\t\t// Only check for mouseups outside the document if you've moved inside the document\n\t\t// at least once. This prevents the firing of mouseup in the case of IE<9, which will\n\t\t// fire a mousemove event if content is placed under the cursor. See #7778\n\t\t// Support: IE <9\n\t\tif ( this._mouseMoved ) {\n\n\t\t\t// IE mouseup check - mouseup happened when mouse was out of window\n\t\t\tif ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&\n\t\t\t\t\t!event.button ) {\n\t\t\t\treturn this._mouseUp( event );\n\n\t\t\t// Iframe mouseup check - mouseup occurred in another document\n\t\t\t} else if ( !event.which ) {\n\n\t\t\t\t// Support: Safari <=8 - 9\n\t\t\t\t// Safari sets which to 0 if you press any of the following keys\n\t\t\t\t// during a drag (#14461)\n\t\t\t\tif ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||\n\t\t\t\t\t\tevent.originalEvent.metaKey || event.originalEvent.shiftKey ) {\n\t\t\t\t\tthis.ignoreMissingWhich = true;\n\t\t\t\t} else if ( !this.ignoreMissingWhich ) {\n\t\t\t\t\treturn this._mouseUp( event );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( event.which || event.button ) {\n\t\t\tthis._mouseMoved = true;\n\t\t}\n\n\t\tif ( this._mouseStarted ) {\n\t\t\tthis._mouseDrag( event );\n\t\t\treturn event.preventDefault();\n\t\t}\n\n\t\tif ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {\n\t\t\tthis._mouseStarted =\n\t\t\t\t( this._mouseStart( this._mouseDownEvent, event ) !== false );\n\t\t\t( this._mouseStarted ? this._mouseDrag( event ) : this._mouseUp( event ) );\n\t\t}\n\n\t\treturn !this._mouseStarted;\n\t},\n\n\t_mouseUp: function( event ) {\n\t\tthis.document\n\t\t\t.off( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t.off( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\n\t\tif ( this._mouseStarted ) {\n\t\t\tthis._mouseStarted = false;\n\n\t\t\tif ( event.target === this._mouseDownEvent.target ) {\n\t\t\t\t$.data( event.target, this.widgetName + \".preventClickEvent\", true );\n\t\t\t}\n\n\t\t\tthis._mouseStop( event );\n\t\t}\n\n\t\tif ( this._mouseDelayTimer ) {\n\t\t\tclearTimeout( this._mouseDelayTimer );\n\t\t\tdelete this._mouseDelayTimer;\n\t\t}\n\n\t\tthis.ignoreMissingWhich = false;\n\t\tmouseHandled = false;\n\t\tevent.preventDefault();\n\t},\n\n\t_mouseDistanceMet: function( event ) {\n\t\treturn ( Math.max(\n\t\t\t\tMath.abs( this._mouseDownEvent.pageX - event.pageX ),\n\t\t\t\tMath.abs( this._mouseDownEvent.pageY - event.pageY )\n\t\t\t) >= this.options.distance\n\t\t);\n\t},\n\n\t_mouseDelayMet: function( /* event */ ) {\n\t\treturn this.mouseDelayMet;\n\t},\n\n\t// These are placeholder methods, to be overriden by extending plugin\n\t_mouseStart: function( /* event */ ) {},\n\t_mouseDrag: function( /* event */ ) {},\n\t_mouseStop: function( /* event */ ) {},\n\t_mouseCapture: function( /* event */ ) { return true; }\n} );\n\n\n\n\n// $.ui.plugin is deprecated. Use $.widget() extensions instead.\nvar plugin = $.ui.plugin = {\n\tadd: function( module, option, set ) {\n\t\tvar i,\n\t\t\tproto = $.ui[ module ].prototype;\n\t\tfor ( i in set ) {\n\t\t\tproto.plugins[ i ] = proto.plugins[ i ] || [];\n\t\t\tproto.plugins[ i ].push( [ option, set[ i ] ] );\n\t\t}\n\t},\n\tcall: function( instance, name, args, allowDisconnected ) {\n\t\tvar i,\n\t\t\tset = instance.plugins[ name ];\n\n\t\tif ( !set ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||\n\t\t\t\tinstance.element[ 0 ].parentNode.nodeType === 11 ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( i = 0; i < set.length; i++ ) {\n\t\t\tif ( instance.options[ set[ i ][ 0 ] ] ) {\n\t\t\t\tset[ i ][ 1 ].apply( instance.element, args );\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nvar safeActiveElement = $.ui.safeActiveElement = function( document ) {\n\tvar activeElement;\n\n\t// Support: IE 9 only\n\t// IE9 throws an \"Unspecified error\" accessing document.activeElement from an <iframe>\n\ttry {\n\t\tactiveElement = document.activeElement;\n\t} catch ( error ) {\n\t\tactiveElement = document.body;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE may return null instead of an element\n\t// Interestingly, this only seems to occur when NOT in an iframe\n\tif ( !activeElement ) {\n\t\tactiveElement = document.body;\n\t}\n\n\t// Support: IE 11 only\n\t// IE11 returns a seemingly empty object in some cases when accessing\n\t// document.activeElement from an <iframe>\n\tif ( !activeElement.nodeName ) {\n\t\tactiveElement = document.body;\n\t}\n\n\treturn activeElement;\n};\n\n\n\nvar safeBlur = $.ui.safeBlur = function( element ) {\n\n\t// Support: IE9 - 10 only\n\t// If the <body> is blurred, IE will switch windows, see #9420\n\tif ( element && element.nodeName.toLowerCase() !== \"body\" ) {\n\t\t$( element ).trigger( \"blur\" );\n\t}\n};\n\n\n/*!\n * jQuery UI Draggable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Draggable\n//>>group: Interactions\n//>>description: Enables dragging functionality for any element.\n//>>docs: http://api.jqueryui.com/draggable/\n//>>demos: http://jqueryui.com/draggable/\n//>>css.structure: ../../themes/base/draggable.css\n\n\n\n$.widget( \"ui.draggable\", $.ui.mouse, {\n\tversion: \"1.12.1\",\n\twidgetEventPrefix: \"drag\",\n\toptions: {\n\t\taddClasses: true,\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectToSortable: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\tiframeFix: false,\n\t\topacity: false,\n\t\trefreshPositions: false,\n\t\trevert: false,\n\t\trevertDuration: 500,\n\t\tscope: \"default\",\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tsnap: false,\n\t\tsnapMode: \"both\",\n\t\tsnapTolerance: 20,\n\t\tstack: false,\n\t\tzIndex: false,\n\n\t\t// Callbacks\n\t\tdrag: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\t_create: function() {\n\n\t\tif ( this.options.helper === \"original\" ) {\n\t\t\tthis._setPositionRelative();\n\t\t}\n\t\tif ( this.options.addClasses ) {\n\t\t\tthis._addClass( \"ui-draggable\" );\n\t\t}\n\t\tthis._setHandleClassName();\n\n\t\tthis._mouseInit();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\t\tif ( key === \"handle\" ) {\n\t\t\tthis._removeHandleClassName();\n\t\t\tthis._setHandleClassName();\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tif ( ( this.helper || this.element ).is( \".ui-draggable-dragging\" ) ) {\n\t\t\tthis.destroyOnClear = true;\n\t\t\treturn;\n\t\t}\n\t\tthis._removeHandleClassName();\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseCapture: function( event ) {\n\t\tvar o = this.options;\n\n\t\t// Among others, prevent a drag on a resizable-handle\n\t\tif ( this.helper || o.disabled ||\n\t\t\t\t$( event.target ).closest( \".ui-resizable-handle\" ).length > 0 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t//Quit if we're not on a valid handle\n\t\tthis.handle = this._getHandle( event );\n\t\tif ( !this.handle ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis._blurActiveElement( event );\n\n\t\tthis._blockFrames( o.iframeFix === true ? \"iframe\" : o.iframeFix );\n\n\t\treturn true;\n\n\t},\n\n\t_blockFrames: function( selector ) {\n\t\tthis.iframeBlocks = this.document.find( selector ).map( function() {\n\t\t\tvar iframe = $( this );\n\n\t\t\treturn $( \"<div>\" )\n\t\t\t\t.css( \"position\", \"absolute\" )\n\t\t\t\t.appendTo( iframe.parent() )\n\t\t\t\t.outerWidth( iframe.outerWidth() )\n\t\t\t\t.outerHeight( iframe.outerHeight() )\n\t\t\t\t.offset( iframe.offset() )[ 0 ];\n\t\t} );\n\t},\n\n\t_unblockFrames: function() {\n\t\tif ( this.iframeBlocks ) {\n\t\t\tthis.iframeBlocks.remove();\n\t\t\tdelete this.iframeBlocks;\n\t\t}\n\t},\n\n\t_blurActiveElement: function( event ) {\n\t\tvar activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),\n\t\t\ttarget = $( event.target );\n\n\t\t// Don't blur if the event occurred on an element that is within\n\t\t// the currently focused element\n\t\t// See #10527, #12472\n\t\tif ( target.closest( activeElement ).length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Blur any element that currently has focus, see #4261\n\t\t$.ui.safeBlur( activeElement );\n\t},\n\n\t_mouseStart: function( event ) {\n\n\t\tvar o = this.options;\n\n\t\t//Create and append the visible helper\n\t\tthis.helper = this._createHelper( event );\n\n\t\tthis._addClass( this.helper, \"ui-draggable-dragging\" );\n\n\t\t//Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t//If ddmanager is used for droppables, set the global draggable\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\t/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */\n\n\t\t//Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t//Store the helper's css position\n\t\tthis.cssPosition = this.helper.css( \"position\" );\n\t\tthis.scrollParent = this.helper.scrollParent( true );\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tthis.hasFixedAncestor = this.helper.parents().filter( function() {\n\t\t\t\treturn $( this ).css( \"position\" ) === \"fixed\";\n\t\t\t} ).length > 0;\n\n\t\t//The element's absolute position on the page minus margins\n\t\tthis.positionAbs = this.element.offset();\n\t\tthis._refreshOffsets( event );\n\n\t\t//Generate the original position\n\t\tthis.originalPosition = this.position = this._generatePosition( event, false );\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\t( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );\n\n\t\t//Set a containment if given in the options\n\t\tthis._setContainment();\n\n\t\t//Trigger event + callbacks\n\t\tif ( this._trigger( \"start\", event ) === false ) {\n\t\t\tthis._clear();\n\t\t\treturn false;\n\t\t}\n\n\t\t//Recache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t//Prepare the droppable offsets\n\t\tif ( $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t}\n\n\t\t// Execute the drag once - this causes the helper not to be visible before getting its\n\t\t// correct position\n\t\tthis._mouseDrag( event, true );\n\n\t\t// If the ddmanager is used for droppables, inform the manager that dragging has started\n\t\t// (see #5003)\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.dragStart( this, event );\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t_refreshOffsets: function( event ) {\n\t\tthis.offset = {\n\t\t\ttop: this.positionAbs.top - this.margins.top,\n\t\t\tleft: this.positionAbs.left - this.margins.left,\n\t\t\tscroll: false,\n\t\t\tparent: this._getParentOffset(),\n\t\t\trelative: this._getRelativeOffset()\n\t\t};\n\n\t\tthis.offset.click = {\n\t\t\tleft: event.pageX - this.offset.left,\n\t\t\ttop: event.pageY - this.offset.top\n\t\t};\n\t},\n\n\t_mouseDrag: function( event, noPropagation ) {\n\n\t\t// reset any necessary cached properties (see #5009)\n\t\tif ( this.hasFixedAncestor ) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition( event, true );\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\t//Call plugins and callbacks and use the resulting position if something is returned\n\t\tif ( !noPropagation ) {\n\t\t\tvar ui = this._uiHash();\n\t\t\tif ( this._trigger( \"drag\", event, ui ) === false ) {\n\t\t\t\tthis._mouseUp( new $.Event( \"mouseup\", event ) );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.position = ui.position;\n\t\t}\n\n\t\tthis.helper[ 0 ].style.left = this.position.left + \"px\";\n\t\tthis.helper[ 0 ].style.top = this.position.top + \"px\";\n\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.drag( this, event );\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function( event ) {\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tvar that = this,\n\t\t\tdropped = false;\n\t\tif ( $.ui.ddmanager && !this.options.dropBehaviour ) {\n\t\t\tdropped = $.ui.ddmanager.drop( this, event );\n\t\t}\n\n\t\t//if a drop comes from outside (a sortable)\n\t\tif ( this.dropped ) {\n\t\t\tdropped = this.dropped;\n\t\t\tthis.dropped = false;\n\t\t}\n\n\t\tif ( ( this.options.revert === \"invalid\" && !dropped ) ||\n\t\t\t\t( this.options.revert === \"valid\" && dropped ) ||\n\t\t\t\tthis.options.revert === true || ( $.isFunction( this.options.revert ) &&\n\t\t\t\tthis.options.revert.call( this.element, dropped ) )\n\t\t) {\n\t\t\t$( this.helper ).animate(\n\t\t\t\tthis.originalPosition,\n\t\t\t\tparseInt( this.options.revertDuration, 10 ),\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( that._trigger( \"stop\", event ) !== false ) {\n\t\t\t\t\t\tthat._clear();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tif ( this._trigger( \"stop\", event ) !== false ) {\n\t\t\t\tthis._clear();\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseUp: function( event ) {\n\t\tthis._unblockFrames();\n\n\t\t// If the ddmanager is used for droppables, inform the manager that dragging has stopped\n\t\t// (see #5003)\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.dragStop( this, event );\n\t\t}\n\n\t\t// Only need to focus if the event occurred on the draggable itself, see #10527\n\t\tif ( this.handleElement.is( event.target ) ) {\n\n\t\t\t// The interaction is over; whether or not the click resulted in a drag,\n\t\t\t// focus the element\n\t\t\tthis.element.trigger( \"focus\" );\n\t\t}\n\n\t\treturn $.ui.mouse.prototype._mouseUp.call( this, event );\n\t},\n\n\tcancel: function() {\n\n\t\tif ( this.helper.is( \".ui-draggable-dragging\" ) ) {\n\t\t\tthis._mouseUp( new $.Event( \"mouseup\", { target: this.element[ 0 ] } ) );\n\t\t} else {\n\t\t\tthis._clear();\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t_getHandle: function( event ) {\n\t\treturn this.options.handle ?\n\t\t\t!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :\n\t\t\ttrue;\n\t},\n\n\t_setHandleClassName: function() {\n\t\tthis.handleElement = this.options.handle ?\n\t\t\tthis.element.find( this.options.handle ) : this.element;\n\t\tthis._addClass( this.handleElement, \"ui-draggable-handle\" );\n\t},\n\n\t_removeHandleClassName: function() {\n\t\tthis._removeClass( this.handleElement, \"ui-draggable-handle\" );\n\t},\n\n\t_createHelper: function( event ) {\n\n\t\tvar o = this.options,\n\t\t\thelperIsFunction = $.isFunction( o.helper ),\n\t\t\thelper = helperIsFunction ?\n\t\t\t\t$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :\n\t\t\t\t( o.helper === \"clone\" ?\n\t\t\t\t\tthis.element.clone().removeAttr( \"id\" ) :\n\t\t\t\t\tthis.element );\n\n\t\tif ( !helper.parents( \"body\" ).length ) {\n\t\t\thelper.appendTo( ( o.appendTo === \"parent\" ?\n\t\t\t\tthis.element[ 0 ].parentNode :\n\t\t\t\to.appendTo ) );\n\t\t}\n\n\t\t// Http://bugs.jqueryui.com/ticket/9446\n\t\t// a helper function can return the original element\n\t\t// which wouldn't have been set to relative in _create\n\t\tif ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {\n\t\t\tthis._setPositionRelative();\n\t\t}\n\n\t\tif ( helper[ 0 ] !== this.element[ 0 ] &&\n\t\t\t\t!( /(fixed|absolute)/ ).test( helper.css( \"position\" ) ) ) {\n\t\t\thelper.css( \"position\", \"absolute\" );\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_setPositionRelative: function() {\n\t\tif ( !( /^(?:r|a|f)/ ).test( this.element.css( \"position\" ) ) ) {\n\t\t\tthis.element[ 0 ].style.position = \"relative\";\n\t\t}\n\t},\n\n\t_adjustOffsetFromHelper: function( obj ) {\n\t\tif ( typeof obj === \"string\" ) {\n\t\t\tobj = obj.split( \" \" );\n\t\t}\n\t\tif ( $.isArray( obj ) ) {\n\t\t\tobj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };\n\t\t}\n\t\tif ( \"left\" in obj ) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif ( \"right\" in obj ) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif ( \"top\" in obj ) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif ( \"bottom\" in obj ) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_isRootNode: function( element ) {\n\t\treturn ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t//Get the offsetParent and cache its position\n\t\tvar po = this.offsetParent.offset(),\n\t\t\tdocument = this.document[ 0 ];\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the\n\t\t// following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the\n\t\t// next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't\n\t\t// the document, which means that the scroll is included in the initial calculation of the\n\t\t// offset of the parent, and never recalculated upon drag\n\t\tif ( this.cssPosition === \"absolute\" && this.scrollParent[ 0 ] !== document &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\tif ( this._isRootNode( this.offsetParent[ 0 ] ) ) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + ( parseInt( this.offsetParent.css( \"borderTopWidth\" ), 10 ) || 0 ),\n\t\t\tleft: po.left + ( parseInt( this.offsetParent.css( \"borderLeftWidth\" ), 10 ) || 0 )\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\t\tif ( this.cssPosition !== \"relative\" ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\tvar p = this.element.position(),\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );\n\n\t\treturn {\n\t\t\ttop: p.top - ( parseInt( this.helper.css( \"top\" ), 10 ) || 0 ) +\n\t\t\t\t( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),\n\t\t\tleft: p.left - ( parseInt( this.helper.css( \"left\" ), 10 ) || 0 ) +\n\t\t\t\t( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )\n\t\t};\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: ( parseInt( this.element.css( \"marginLeft\" ), 10 ) || 0 ),\n\t\t\ttop: ( parseInt( this.element.css( \"marginTop\" ), 10 ) || 0 ),\n\t\t\tright: ( parseInt( this.element.css( \"marginRight\" ), 10 ) || 0 ),\n\t\t\tbottom: ( parseInt( this.element.css( \"marginBottom\" ), 10 ) || 0 )\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar isUserScrollable, c, ce,\n\t\t\to = this.options,\n\t\t\tdocument = this.document[ 0 ];\n\n\t\tthis.relativeContainer = null;\n\n\t\tif ( !o.containment ) {\n\t\t\tthis.containment = null;\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"window\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\t$( window ).scrollLeft() + $( window ).width() -\n\t\t\t\t\tthis.helperProportions.width - this.margins.left,\n\t\t\t\t$( window ).scrollTop() +\n\t\t\t\t\t( $( window ).height() || document.body.parentNode.scrollHeight ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"document\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t$( document ).width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t( $( document ).height() || document.body.parentNode.scrollHeight ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment.constructor === Array ) {\n\t\t\tthis.containment = o.containment;\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"parent\" ) {\n\t\t\to.containment = this.helper[ 0 ].parentNode;\n\t\t}\n\n\t\tc = $( o.containment );\n\t\tce = c[ 0 ];\n\n\t\tif ( !ce ) {\n\t\t\treturn;\n\t\t}\n\n\t\tisUserScrollable = /(scroll|auto)/.test( c.css( \"overflow\" ) );\n\n\t\tthis.containment = [\n\t\t\t( parseInt( c.css( \"borderLeftWidth\" ), 10 ) || 0 ) +\n\t\t\t\t( parseInt( c.css( \"paddingLeft\" ), 10 ) || 0 ),\n\t\t\t( parseInt( c.css( \"borderTopWidth\" ), 10 ) || 0 ) +\n\t\t\t\t( parseInt( c.css( \"paddingTop\" ), 10 ) || 0 ),\n\t\t\t( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -\n\t\t\t\t( parseInt( c.css( \"borderRightWidth\" ), 10 ) || 0 ) -\n\t\t\t\t( parseInt( c.css( \"paddingRight\" ), 10 ) || 0 ) -\n\t\t\t\tthis.helperProportions.width -\n\t\t\t\tthis.margins.left -\n\t\t\t\tthis.margins.right,\n\t\t\t( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -\n\t\t\t\t( parseInt( c.css( \"borderBottomWidth\" ), 10 ) || 0 ) -\n\t\t\t\t( parseInt( c.css( \"paddingBottom\" ), 10 ) || 0 ) -\n\t\t\t\tthis.helperProportions.height -\n\t\t\t\tthis.margins.top -\n\t\t\t\tthis.margins.bottom\n\t\t];\n\t\tthis.relativeContainer = c;\n\t},\n\n\t_convertPositionTo: function( d, pos ) {\n\n\t\tif ( !pos ) {\n\t\t\tpos = this.position;\n\t\t}\n\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.top\t+\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top * mod -\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.offset.scroll.top :\n\t\t\t\t\t( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.left +\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left * mod\t-\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.offset.scroll.left :\n\t\t\t\t\t( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function( event, constrainPosition ) {\n\n\t\tvar containment, co, top, left,\n\t\t\to = this.options,\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY;\n\n\t\t// Cache the scroll\n\t\tif ( !scrollIsRootNode || !this.offset.scroll ) {\n\t\t\tthis.offset.scroll = {\n\t\t\t\ttop: this.scrollParent.scrollTop(),\n\t\t\t\tleft: this.scrollParent.scrollLeft()\n\t\t\t};\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\t// If we are not dragging yet, we won't check for options\n\t\tif ( constrainPosition ) {\n\t\t\tif ( this.containment ) {\n\t\t\t\tif ( this.relativeContainer ) {\n\t\t\t\t\tco = this.relativeContainer.offset();\n\t\t\t\t\tcontainment = [\n\t\t\t\t\t\tthis.containment[ 0 ] + co.left,\n\t\t\t\t\t\tthis.containment[ 1 ] + co.top,\n\t\t\t\t\t\tthis.containment[ 2 ] + co.left,\n\t\t\t\t\t\tthis.containment[ 3 ] + co.top\n\t\t\t\t\t];\n\t\t\t\t} else {\n\t\t\t\t\tcontainment = this.containment;\n\t\t\t\t}\n\n\t\t\t\tif ( event.pageX - this.offset.click.left < containment[ 0 ] ) {\n\t\t\t\t\tpageX = containment[ 0 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top < containment[ 1 ] ) {\n\t\t\t\t\tpageY = containment[ 1 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif ( event.pageX - this.offset.click.left > containment[ 2 ] ) {\n\t\t\t\t\tpageX = containment[ 2 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top > containment[ 3 ] ) {\n\t\t\t\t\tpageY = containment[ 3 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( o.grid ) {\n\n\t\t\t\t//Check for grid elements set to 0 to prevent divide by 0 error causing invalid\n\t\t\t\t// argument errors in IE (see ticket #6950)\n\t\t\t\ttop = o.grid[ 1 ] ? this.originalPageY + Math.round( ( pageY -\n\t\t\t\t\tthis.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY;\n\t\t\t\tpageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] ||\n\t\t\t\t\ttop - this.offset.click.top > containment[ 3 ] ) ?\n\t\t\t\t\t\ttop :\n\t\t\t\t\t\t( ( top - this.offset.click.top >= containment[ 1 ] ) ?\n\t\t\t\t\t\t\ttop - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top;\n\n\t\t\t\tleft = o.grid[ 0 ] ? this.originalPageX +\n\t\t\t\t\tMath.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] :\n\t\t\t\t\tthis.originalPageX;\n\t\t\t\tpageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] ||\n\t\t\t\t\tleft - this.offset.click.left > containment[ 2 ] ) ?\n\t\t\t\t\t\tleft :\n\t\t\t\t\t\t( ( left - this.offset.click.left >= containment[ 0 ] ) ?\n\t\t\t\t\t\t\tleft - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left;\n\t\t\t}\n\n\t\t\tif ( o.axis === \"y\" ) {\n\t\t\t\tpageX = this.originalPageX;\n\t\t\t}\n\n\t\t\tif ( o.axis === \"x\" ) {\n\t\t\t\tpageY = this.originalPageY;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageY -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.top -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top +\n\t\t\t\t( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.offset.scroll.top :\n\t\t\t\t\t( scrollIsRootNode ? 0 : this.offset.scroll.top ) )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageX -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.left -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left +\n\t\t\t\t( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.offset.scroll.left :\n\t\t\t\t\t( scrollIsRootNode ? 0 : this.offset.scroll.left ) )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_clear: function() {\n\t\tthis._removeClass( this.helper, \"ui-draggable-dragging\" );\n\t\tif ( this.helper[ 0 ] !== this.element[ 0 ] && !this.cancelHelperRemoval ) {\n\t\t\tthis.helper.remove();\n\t\t}\n\t\tthis.helper = null;\n\t\tthis.cancelHelperRemoval = false;\n\t\tif ( this.destroyOnClear ) {\n\t\t\tthis.destroy();\n\t\t}\n\t},\n\n\t// From now on bulk stuff - mainly helpers\n\n\t_trigger: function( type, event, ui ) {\n\t\tui = ui || this._uiHash();\n\t\t$.ui.plugin.call( this, type, [ event, ui, this ], true );\n\n\t\t// Absolute position and offset (see #6884 ) have to be recalculated after plugins\n\t\tif ( /^(drag|start|stop)/.test( type ) ) {\n\t\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\t\t\tui.offset = this.positionAbs;\n\t\t}\n\t\treturn $.Widget.prototype._trigger.call( this, type, event, ui );\n\t},\n\n\tplugins: {},\n\n\t_uiHash: function() {\n\t\treturn {\n\t\t\thelper: this.helper,\n\t\t\tposition: this.position,\n\t\t\toriginalPosition: this.originalPosition,\n\t\t\toffset: this.positionAbs\n\t\t};\n\t}\n\n} );\n\n$.ui.plugin.add( \"draggable\", \"connectToSortable\", {\n\tstart: function( event, ui, draggable ) {\n\t\tvar uiSortable = $.extend( {}, ui, {\n\t\t\titem: draggable.element\n\t\t} );\n\n\t\tdraggable.sortables = [];\n\t\t$( draggable.options.connectToSortable ).each( function() {\n\t\t\tvar sortable = $( this ).sortable( \"instance\" );\n\n\t\t\tif ( sortable && !sortable.options.disabled ) {\n\t\t\t\tdraggable.sortables.push( sortable );\n\n\t\t\t\t// RefreshPositions is called at drag start to refresh the containerCache\n\t\t\t\t// which is used in drag. This ensures it's initialized and synchronized\n\t\t\t\t// with any changes that might have happened on the page since initialization.\n\t\t\t\tsortable.refreshPositions();\n\t\t\t\tsortable._trigger( \"activate\", event, uiSortable );\n\t\t\t}\n\t\t} );\n\t},\n\tstop: function( event, ui, draggable ) {\n\t\tvar uiSortable = $.extend( {}, ui, {\n\t\t\titem: draggable.element\n\t\t} );\n\n\t\tdraggable.cancelHelperRemoval = false;\n\n\t\t$.each( draggable.sortables, function() {\n\t\t\tvar sortable = this;\n\n\t\t\tif ( sortable.isOver ) {\n\t\t\t\tsortable.isOver = 0;\n\n\t\t\t\t// Allow this sortable to handle removing the helper\n\t\t\t\tdraggable.cancelHelperRemoval = true;\n\t\t\t\tsortable.cancelHelperRemoval = false;\n\n\t\t\t\t// Use _storedCSS To restore properties in the sortable,\n\t\t\t\t// as this also handles revert (#9675) since the draggable\n\t\t\t\t// may have modified them in unexpected ways (#8809)\n\t\t\t\tsortable._storedCSS = {\n\t\t\t\t\tposition: sortable.placeholder.css( \"position\" ),\n\t\t\t\t\ttop: sortable.placeholder.css( \"top\" ),\n\t\t\t\t\tleft: sortable.placeholder.css( \"left\" )\n\t\t\t\t};\n\n\t\t\t\tsortable._mouseStop( event );\n\n\t\t\t\t// Once drag has ended, the sortable should return to using\n\t\t\t\t// its original helper, not the shared helper from draggable\n\t\t\t\tsortable.options.helper = sortable.options._helper;\n\t\t\t} else {\n\n\t\t\t\t// Prevent this Sortable from removing the helper.\n\t\t\t\t// However, don't set the draggable to remove the helper\n\t\t\t\t// either as another connected Sortable may yet handle the removal.\n\t\t\t\tsortable.cancelHelperRemoval = true;\n\n\t\t\t\tsortable._trigger( \"deactivate\", event, uiSortable );\n\t\t\t}\n\t\t} );\n\t},\n\tdrag: function( event, ui, draggable ) {\n\t\t$.each( draggable.sortables, function() {\n\t\t\tvar innermostIntersecting = false,\n\t\t\t\tsortable = this;\n\n\t\t\t// Copy over variables that sortable's _intersectsWith uses\n\t\t\tsortable.positionAbs = draggable.positionAbs;\n\t\t\tsortable.helperProportions = draggable.helperProportions;\n\t\t\tsortable.offset.click = draggable.offset.click;\n\n\t\t\tif ( sortable._intersectsWith( sortable.containerCache ) ) {\n\t\t\t\tinnermostIntersecting = true;\n\n\t\t\t\t$.each( draggable.sortables, function() {\n\n\t\t\t\t\t// Copy over variables that sortable's _intersectsWith uses\n\t\t\t\t\tthis.positionAbs = draggable.positionAbs;\n\t\t\t\t\tthis.helperProportions = draggable.helperProportions;\n\t\t\t\t\tthis.offset.click = draggable.offset.click;\n\n\t\t\t\t\tif ( this !== sortable &&\n\t\t\t\t\t\t\tthis._intersectsWith( this.containerCache ) &&\n\t\t\t\t\t\t\t$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {\n\t\t\t\t\t\tinnermostIntersecting = false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn innermostIntersecting;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tif ( innermostIntersecting ) {\n\n\t\t\t\t// If it intersects, we use a little isOver variable and set it once,\n\t\t\t\t// so that the move-in stuff gets fired only once.\n\t\t\t\tif ( !sortable.isOver ) {\n\t\t\t\t\tsortable.isOver = 1;\n\n\t\t\t\t\t// Store draggable's parent in case we need to reappend to it later.\n\t\t\t\t\tdraggable._parent = ui.helper.parent();\n\n\t\t\t\t\tsortable.currentItem = ui.helper\n\t\t\t\t\t\t.appendTo( sortable.element )\n\t\t\t\t\t\t.data( \"ui-sortable-item\", true );\n\n\t\t\t\t\t// Store helper option to later restore it\n\t\t\t\t\tsortable.options._helper = sortable.options.helper;\n\n\t\t\t\t\tsortable.options.helper = function() {\n\t\t\t\t\t\treturn ui.helper[ 0 ];\n\t\t\t\t\t};\n\n\t\t\t\t\t// Fire the start events of the sortable with our passed browser event,\n\t\t\t\t\t// and our own helper (so it doesn't create a new one)\n\t\t\t\t\tevent.target = sortable.currentItem[ 0 ];\n\t\t\t\t\tsortable._mouseCapture( event, true );\n\t\t\t\t\tsortable._mouseStart( event, true, true );\n\n\t\t\t\t\t// Because the browser event is way off the new appended portlet,\n\t\t\t\t\t// modify necessary variables to reflect the changes\n\t\t\t\t\tsortable.offset.click.top = draggable.offset.click.top;\n\t\t\t\t\tsortable.offset.click.left = draggable.offset.click.left;\n\t\t\t\t\tsortable.offset.parent.left -= draggable.offset.parent.left -\n\t\t\t\t\t\tsortable.offset.parent.left;\n\t\t\t\t\tsortable.offset.parent.top -= draggable.offset.parent.top -\n\t\t\t\t\t\tsortable.offset.parent.top;\n\n\t\t\t\t\tdraggable._trigger( \"toSortable\", event );\n\n\t\t\t\t\t// Inform draggable that the helper is in a valid drop zone,\n\t\t\t\t\t// used solely in the revert option to handle \"valid/invalid\".\n\t\t\t\t\tdraggable.dropped = sortable.element;\n\n\t\t\t\t\t// Need to refreshPositions of all sortables in the case that\n\t\t\t\t\t// adding to one sortable changes the location of the other sortables (#9675)\n\t\t\t\t\t$.each( draggable.sortables, function() {\n\t\t\t\t\t\tthis.refreshPositions();\n\t\t\t\t\t} );\n\n\t\t\t\t\t// Hack so receive/update callbacks work (mostly)\n\t\t\t\t\tdraggable.currentItem = draggable.element;\n\t\t\t\t\tsortable.fromOutside = draggable;\n\t\t\t\t}\n\n\t\t\t\tif ( sortable.currentItem ) {\n\t\t\t\t\tsortable._mouseDrag( event );\n\n\t\t\t\t\t// Copy the sortable's position because the draggable's can potentially reflect\n\t\t\t\t\t// a relative position, while sortable is always absolute, which the dragged\n\t\t\t\t\t// element has now become. (#8809)\n\t\t\t\t\tui.position = sortable.position;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// If it doesn't intersect with the sortable, and it intersected before,\n\t\t\t\t// we fake the drag stop of the sortable, but make sure it doesn't remove\n\t\t\t\t// the helper by using cancelHelperRemoval.\n\t\t\t\tif ( sortable.isOver ) {\n\n\t\t\t\t\tsortable.isOver = 0;\n\t\t\t\t\tsortable.cancelHelperRemoval = true;\n\n\t\t\t\t\t// Calling sortable's mouseStop would trigger a revert,\n\t\t\t\t\t// so revert must be temporarily false until after mouseStop is called.\n\t\t\t\t\tsortable.options._revert = sortable.options.revert;\n\t\t\t\t\tsortable.options.revert = false;\n\n\t\t\t\t\tsortable._trigger( \"out\", event, sortable._uiHash( sortable ) );\n\t\t\t\t\tsortable._mouseStop( event, true );\n\n\t\t\t\t\t// Restore sortable behaviors that were modfied\n\t\t\t\t\t// when the draggable entered the sortable area (#9481)\n\t\t\t\t\tsortable.options.revert = sortable.options._revert;\n\t\t\t\t\tsortable.options.helper = sortable.options._helper;\n\n\t\t\t\t\tif ( sortable.placeholder ) {\n\t\t\t\t\t\tsortable.placeholder.remove();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Restore and recalculate the draggable's offset considering the sortable\n\t\t\t\t\t// may have modified them in unexpected ways. (#8809, #10669)\n\t\t\t\t\tui.helper.appendTo( draggable._parent );\n\t\t\t\t\tdraggable._refreshOffsets( event );\n\t\t\t\t\tui.position = draggable._generatePosition( event, true );\n\n\t\t\t\t\tdraggable._trigger( \"fromSortable\", event );\n\n\t\t\t\t\t// Inform draggable that the helper is no longer in a valid drop zone\n\t\t\t\t\tdraggable.dropped = false;\n\n\t\t\t\t\t// Need to refreshPositions of all sortables just in case removing\n\t\t\t\t\t// from one sortable changes the location of other sortables (#9675)\n\t\t\t\t\t$.each( draggable.sortables, function() {\n\t\t\t\t\t\tthis.refreshPositions();\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"cursor\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( \"body\" ),\n\t\t\to = instance.options;\n\n\t\tif ( t.css( \"cursor\" ) ) {\n\t\t\to._cursor = t.css( \"cursor\" );\n\t\t}\n\t\tt.css( \"cursor\", o.cursor );\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\t\tif ( o._cursor ) {\n\t\t\t$( \"body\" ).css( \"cursor\", o._cursor );\n\t\t}\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"opacity\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( ui.helper ),\n\t\t\to = instance.options;\n\t\tif ( t.css( \"opacity\" ) ) {\n\t\t\to._opacity = t.css( \"opacity\" );\n\t\t}\n\t\tt.css( \"opacity\", o.opacity );\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\t\tif ( o._opacity ) {\n\t\t\t$( ui.helper ).css( \"opacity\", o._opacity );\n\t\t}\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"scroll\", {\n\tstart: function( event, ui, i ) {\n\t\tif ( !i.scrollParentNotHidden ) {\n\t\t\ti.scrollParentNotHidden = i.helper.scrollParent( false );\n\t\t}\n\n\t\tif ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&\n\t\t\t\ti.scrollParentNotHidden[ 0 ].tagName !== \"HTML\" ) {\n\t\t\ti.overflowOffset = i.scrollParentNotHidden.offset();\n\t\t}\n\t},\n\tdrag: function( event, ui, i  ) {\n\n\t\tvar o = i.options,\n\t\t\tscrolled = false,\n\t\t\tscrollParent = i.scrollParentNotHidden[ 0 ],\n\t\t\tdocument = i.document[ 0 ];\n\n\t\tif ( scrollParent !== document && scrollParent.tagName !== \"HTML\" ) {\n\t\t\tif ( !o.axis || o.axis !== \"x\" ) {\n\t\t\t\tif ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !o.axis || o.axis !== \"y\" ) {\n\t\t\t\tif ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( !o.axis || o.axis !== \"x\" ) {\n\t\t\t\tif ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed );\n\t\t\t\t} else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !o.axis || o.axis !== \"y\" ) {\n\t\t\t\tif ( event.pageX - $( document ).scrollLeft() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = $( document ).scrollLeft(\n\t\t\t\t\t\t$( document ).scrollLeft() - o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t} else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = $( document ).scrollLeft(\n\t\t\t\t\t\t$( document ).scrollLeft() + o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( i, event );\n\t\t}\n\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"snap\", {\n\tstart: function( event, ui, i ) {\n\n\t\tvar o = i.options;\n\n\t\ti.snapElements = [];\n\n\t\t$( o.snap.constructor !== String ? ( o.snap.items || \":data(ui-draggable)\" ) : o.snap )\n\t\t\t.each( function() {\n\t\t\t\tvar $t = $( this ),\n\t\t\t\t\t$o = $t.offset();\n\t\t\t\tif ( this !== i.element[ 0 ] ) {\n\t\t\t\t\ti.snapElements.push( {\n\t\t\t\t\t\titem: this,\n\t\t\t\t\t\twidth: $t.outerWidth(), height: $t.outerHeight(),\n\t\t\t\t\t\ttop: $o.top, left: $o.left\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\n\t},\n\tdrag: function( event, ui, inst ) {\n\n\t\tvar ts, bs, ls, rs, l, r, t, b, i, first,\n\t\t\to = inst.options,\n\t\t\td = o.snapTolerance,\n\t\t\tx1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,\n\t\t\ty1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;\n\n\t\tfor ( i = inst.snapElements.length - 1; i >= 0; i-- ) {\n\n\t\t\tl = inst.snapElements[ i ].left - inst.margins.left;\n\t\t\tr = l + inst.snapElements[ i ].width;\n\t\t\tt = inst.snapElements[ i ].top - inst.margins.top;\n\t\t\tb = t + inst.snapElements[ i ].height;\n\n\t\t\tif ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d ||\n\t\t\t\t\t!$.contains( inst.snapElements[ i ].item.ownerDocument,\n\t\t\t\t\tinst.snapElements[ i ].item ) ) {\n\t\t\t\tif ( inst.snapElements[ i ].snapping ) {\n\t\t\t\t\t( inst.options.snap.release &&\n\t\t\t\t\t\tinst.options.snap.release.call(\n\t\t\t\t\t\t\tinst.element,\n\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t$.extend( inst._uiHash(), { snapItem: inst.snapElements[ i ].item } )\n\t\t\t\t\t\t) );\n\t\t\t\t}\n\t\t\t\tinst.snapElements[ i ].snapping = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( o.snapMode !== \"inner\" ) {\n\t\t\t\tts = Math.abs( t - y2 ) <= d;\n\t\t\t\tbs = Math.abs( b - y1 ) <= d;\n\t\t\t\tls = Math.abs( l - x2 ) <= d;\n\t\t\t\trs = Math.abs( r - x1 ) <= d;\n\t\t\t\tif ( ts ) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: t - inst.helperProportions.height,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t} ).top;\n\t\t\t\t}\n\t\t\t\tif ( bs ) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: b,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t} ).top;\n\t\t\t\t}\n\t\t\t\tif ( ls ) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: l - inst.helperProportions.width\n\t\t\t\t\t} ).left;\n\t\t\t\t}\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: r\n\t\t\t\t\t} ).left;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfirst = ( ts || bs || ls || rs );\n\n\t\t\tif ( o.snapMode !== \"outer\" ) {\n\t\t\t\tts = Math.abs( t - y1 ) <= d;\n\t\t\t\tbs = Math.abs( b - y2 ) <= d;\n\t\t\t\tls = Math.abs( l - x1 ) <= d;\n\t\t\t\trs = Math.abs( r - x2 ) <= d;\n\t\t\t\tif ( ts ) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: t,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t} ).top;\n\t\t\t\t}\n\t\t\t\tif ( bs ) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: b - inst.helperProportions.height,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t} ).top;\n\t\t\t\t}\n\t\t\t\tif ( ls ) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: l\n\t\t\t\t\t} ).left;\n\t\t\t\t}\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: r - inst.helperProportions.width\n\t\t\t\t\t} ).left;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !inst.snapElements[ i ].snapping && ( ts || bs || ls || rs || first ) ) {\n\t\t\t\t( inst.options.snap.snap &&\n\t\t\t\t\tinst.options.snap.snap.call(\n\t\t\t\t\t\tinst.element,\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\t$.extend( inst._uiHash(), {\n\t\t\t\t\t\t\tsnapItem: inst.snapElements[ i ].item\n\t\t\t\t\t\t} ) ) );\n\t\t\t}\n\t\t\tinst.snapElements[ i ].snapping = ( ts || bs || ls || rs || first );\n\n\t\t}\n\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"stack\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar min,\n\t\t\to = instance.options,\n\t\t\tgroup = $.makeArray( $( o.stack ) ).sort( function( a, b ) {\n\t\t\t\treturn ( parseInt( $( a ).css( \"zIndex\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( b ).css( \"zIndex\" ), 10 ) || 0 );\n\t\t\t} );\n\n\t\tif ( !group.length ) { return; }\n\n\t\tmin = parseInt( $( group[ 0 ] ).css( \"zIndex\" ), 10 ) || 0;\n\t\t$( group ).each( function( i ) {\n\t\t\t$( this ).css( \"zIndex\", min + i );\n\t\t} );\n\t\tthis.css( \"zIndex\", ( min + group.length ) );\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"zIndex\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( ui.helper ),\n\t\t\to = instance.options;\n\n\t\tif ( t.css( \"zIndex\" ) ) {\n\t\t\to._zIndex = t.css( \"zIndex\" );\n\t\t}\n\t\tt.css( \"zIndex\", o.zIndex );\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\n\t\tif ( o._zIndex ) {\n\t\t\t$( ui.helper ).css( \"zIndex\", o._zIndex );\n\t\t}\n\t}\n} );\n\nvar widgetsDraggable = $.ui.draggable;\n\n\n/*!\n * jQuery UI Droppable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Droppable\n//>>group: Interactions\n//>>description: Enables drop targets for draggable elements.\n//>>docs: http://api.jqueryui.com/droppable/\n//>>demos: http://jqueryui.com/droppable/\n\n\n\n$.widget( \"ui.droppable\", {\n\tversion: \"1.12.1\",\n\twidgetEventPrefix: \"drop\",\n\toptions: {\n\t\taccept: \"*\",\n\t\taddClasses: true,\n\t\tgreedy: false,\n\t\tscope: \"default\",\n\t\ttolerance: \"intersect\",\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tdeactivate: null,\n\t\tdrop: null,\n\t\tout: null,\n\t\tover: null\n\t},\n\t_create: function() {\n\n\t\tvar proportions,\n\t\t\to = this.options,\n\t\t\taccept = o.accept;\n\n\t\tthis.isover = false;\n\t\tthis.isout = true;\n\n\t\tthis.accept = $.isFunction( accept ) ? accept : function( d ) {\n\t\t\treturn d.is( accept );\n\t\t};\n\n\t\tthis.proportions = function( /* valueToWrite */ ) {\n\t\t\tif ( arguments.length ) {\n\n\t\t\t\t// Store the droppable's proportions\n\t\t\t\tproportions = arguments[ 0 ];\n\t\t\t} else {\n\n\t\t\t\t// Retrieve or derive the droppable's proportions\n\t\t\t\treturn proportions ?\n\t\t\t\t\tproportions :\n\t\t\t\t\tproportions = {\n\t\t\t\t\t\twidth: this.element[ 0 ].offsetWidth,\n\t\t\t\t\t\theight: this.element[ 0 ].offsetHeight\n\t\t\t\t\t};\n\t\t\t}\n\t\t};\n\n\t\tthis._addToManager( o.scope );\n\n\t\to.addClasses && this._addClass( \"ui-droppable\" );\n\n\t},\n\n\t_addToManager: function( scope ) {\n\n\t\t// Add the reference and positions to the manager\n\t\t$.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];\n\t\t$.ui.ddmanager.droppables[ scope ].push( this );\n\t},\n\n\t_splice: function( drop ) {\n\t\tvar i = 0;\n\t\tfor ( ; i < drop.length; i++ ) {\n\t\t\tif ( drop[ i ] === this ) {\n\t\t\t\tdrop.splice( i, 1 );\n\t\t\t}\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tvar drop = $.ui.ddmanager.droppables[ this.options.scope ];\n\n\t\tthis._splice( drop );\n\t},\n\n\t_setOption: function( key, value ) {\n\n\t\tif ( key === \"accept\" ) {\n\t\t\tthis.accept = $.isFunction( value ) ? value : function( d ) {\n\t\t\t\treturn d.is( value );\n\t\t\t};\n\t\t} else if ( key === \"scope\" ) {\n\t\t\tvar drop = $.ui.ddmanager.droppables[ this.options.scope ];\n\n\t\t\tthis._splice( drop );\n\t\t\tthis._addToManager( value );\n\t\t}\n\n\t\tthis._super( key, value );\n\t},\n\n\t_activate: function( event ) {\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\tthis._addActiveClass();\n\t\tif ( draggable ) {\n\t\t\tthis._trigger( \"activate\", event, this.ui( draggable ) );\n\t\t}\n\t},\n\n\t_deactivate: function( event ) {\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\tthis._removeActiveClass();\n\t\tif ( draggable ) {\n\t\t\tthis._trigger( \"deactivate\", event, this.ui( draggable ) );\n\t\t}\n\t},\n\n\t_over: function( event ) {\n\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\t// Bail if draggable and droppable are same element\n\t\tif ( !draggable || ( draggable.currentItem ||\n\t\t\t\tdraggable.element )[ 0 ] === this.element[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||\n\t\t\t\tdraggable.element ) ) ) {\n\t\t\tthis._addHoverClass();\n\t\t\tthis._trigger( \"over\", event, this.ui( draggable ) );\n\t\t}\n\n\t},\n\n\t_out: function( event ) {\n\n\t\tvar draggable = $.ui.ddmanager.current;\n\n\t\t// Bail if draggable and droppable are same element\n\t\tif ( !draggable || ( draggable.currentItem ||\n\t\t\t\tdraggable.element )[ 0 ] === this.element[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||\n\t\t\t\tdraggable.element ) ) ) {\n\t\t\tthis._removeHoverClass();\n\t\t\tthis._trigger( \"out\", event, this.ui( draggable ) );\n\t\t}\n\n\t},\n\n\t_drop: function( event, custom ) {\n\n\t\tvar draggable = custom || $.ui.ddmanager.current,\n\t\t\tchildrenIntersection = false;\n\n\t\t// Bail if draggable and droppable are same element\n\t\tif ( !draggable || ( draggable.currentItem ||\n\t\t\t\tdraggable.element )[ 0 ] === this.element[ 0 ] ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.element\n\t\t\t.find( \":data(ui-droppable)\" )\n\t\t\t.not( \".ui-draggable-dragging\" )\n\t\t\t.each( function() {\n\t\t\t\tvar inst = $( this ).droppable( \"instance\" );\n\t\t\t\tif (\n\t\t\t\t\tinst.options.greedy &&\n\t\t\t\t\t!inst.options.disabled &&\n\t\t\t\t\tinst.options.scope === draggable.options.scope &&\n\t\t\t\t\tinst.accept.call(\n\t\t\t\t\t\tinst.element[ 0 ], ( draggable.currentItem || draggable.element )\n\t\t\t\t\t) &&\n\t\t\t\t\tintersect(\n\t\t\t\t\t\tdraggable,\n\t\t\t\t\t\t$.extend( inst, { offset: inst.element.offset() } ),\n\t\t\t\t\t\tinst.options.tolerance, event\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tchildrenIntersection = true;\n\t\t\t\t\treturn false; }\n\t\t\t} );\n\t\tif ( childrenIntersection ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( this.accept.call( this.element[ 0 ],\n\t\t\t\t( draggable.currentItem || draggable.element ) ) ) {\n\t\t\tthis._removeActiveClass();\n\t\t\tthis._removeHoverClass();\n\n\t\t\tthis._trigger( \"drop\", event, this.ui( draggable ) );\n\t\t\treturn this.element;\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tui: function( c ) {\n\t\treturn {\n\t\t\tdraggable: ( c.currentItem || c.element ),\n\t\t\thelper: c.helper,\n\t\t\tposition: c.position,\n\t\t\toffset: c.positionAbs\n\t\t};\n\t},\n\n\t// Extension points just to make backcompat sane and avoid duplicating logic\n\t// TODO: Remove in 1.13 along with call to it below\n\t_addHoverClass: function() {\n\t\tthis._addClass( \"ui-droppable-hover\" );\n\t},\n\n\t_removeHoverClass: function() {\n\t\tthis._removeClass( \"ui-droppable-hover\" );\n\t},\n\n\t_addActiveClass: function() {\n\t\tthis._addClass( \"ui-droppable-active\" );\n\t},\n\n\t_removeActiveClass: function() {\n\t\tthis._removeClass( \"ui-droppable-active\" );\n\t}\n} );\n\nvar intersect = $.ui.intersect = ( function() {\n\tfunction isOverAxis( x, reference, size ) {\n\t\treturn ( x >= reference ) && ( x < ( reference + size ) );\n\t}\n\n\treturn function( draggable, droppable, toleranceMode, event ) {\n\n\t\tif ( !droppable.offset ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar x1 = ( draggable.positionAbs ||\n\t\t\t\tdraggable.position.absolute ).left + draggable.margins.left,\n\t\t\ty1 = ( draggable.positionAbs ||\n\t\t\t\tdraggable.position.absolute ).top + draggable.margins.top,\n\t\t\tx2 = x1 + draggable.helperProportions.width,\n\t\t\ty2 = y1 + draggable.helperProportions.height,\n\t\t\tl = droppable.offset.left,\n\t\t\tt = droppable.offset.top,\n\t\t\tr = l + droppable.proportions().width,\n\t\t\tb = t + droppable.proportions().height;\n\n\t\tswitch ( toleranceMode ) {\n\t\tcase \"fit\":\n\t\t\treturn ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );\n\t\tcase \"intersect\":\n\t\t\treturn ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half\n\t\t\t\tx2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half\n\t\t\t\tt < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half\n\t\t\t\ty2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half\n\t\tcase \"pointer\":\n\t\t\treturn isOverAxis( event.pageY, t, droppable.proportions().height ) &&\n\t\t\t\tisOverAxis( event.pageX, l, droppable.proportions().width );\n\t\tcase \"touch\":\n\t\t\treturn (\n\t\t\t\t( y1 >= t && y1 <= b ) || // Top edge touching\n\t\t\t\t( y2 >= t && y2 <= b ) || // Bottom edge touching\n\t\t\t\t( y1 < t && y2 > b ) // Surrounded vertically\n\t\t\t) && (\n\t\t\t\t( x1 >= l && x1 <= r ) || // Left edge touching\n\t\t\t\t( x2 >= l && x2 <= r ) || // Right edge touching\n\t\t\t\t( x1 < l && x2 > r ) // Surrounded horizontally\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t};\n} )();\n\n/*\n\tThis manager tracks offsets of draggables and droppables\n*/\n$.ui.ddmanager = {\n\tcurrent: null,\n\tdroppables: { \"default\": [] },\n\tprepareOffsets: function( t, event ) {\n\n\t\tvar i, j,\n\t\t\tm = $.ui.ddmanager.droppables[ t.options.scope ] || [],\n\t\t\ttype = event ? event.type : null, // workaround for #2317\n\t\t\tlist = ( t.currentItem || t.element ).find( \":data(ui-droppable)\" ).addBack();\n\n\t\tdroppablesLoop: for ( i = 0; i < m.length; i++ ) {\n\n\t\t\t// No disabled and non-accepted\n\t\t\tif ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ],\n\t\t\t\t\t( t.currentItem || t.element ) ) ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Filter out elements in the current dragged item\n\t\t\tfor ( j = 0; j < list.length; j++ ) {\n\t\t\t\tif ( list[ j ] === m[ i ].element[ 0 ] ) {\n\t\t\t\t\tm[ i ].proportions().height = 0;\n\t\t\t\t\tcontinue droppablesLoop;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tm[ i ].visible = m[ i ].element.css( \"display\" ) !== \"none\";\n\t\t\tif ( !m[ i ].visible ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Activate the droppable if used directly from draggables\n\t\t\tif ( type === \"mousedown\" ) {\n\t\t\t\tm[ i ]._activate.call( m[ i ], event );\n\t\t\t}\n\n\t\t\tm[ i ].offset = m[ i ].element.offset();\n\t\t\tm[ i ].proportions( {\n\t\t\t\twidth: m[ i ].element[ 0 ].offsetWidth,\n\t\t\t\theight: m[ i ].element[ 0 ].offsetHeight\n\t\t\t} );\n\n\t\t}\n\n\t},\n\tdrop: function( draggable, event ) {\n\n\t\tvar dropped = false;\n\n\t\t// Create a copy of the droppables in case the list changes during the drop (#9116)\n\t\t$.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {\n\n\t\t\tif ( !this.options ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( !this.options.disabled && this.visible &&\n\t\t\t\t\tintersect( draggable, this, this.options.tolerance, event ) ) {\n\t\t\t\tdropped = this._drop.call( this, event ) || dropped;\n\t\t\t}\n\n\t\t\tif ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ],\n\t\t\t\t\t( draggable.currentItem || draggable.element ) ) ) {\n\t\t\t\tthis.isout = true;\n\t\t\t\tthis.isover = false;\n\t\t\t\tthis._deactivate.call( this, event );\n\t\t\t}\n\n\t\t} );\n\t\treturn dropped;\n\n\t},\n\tdragStart: function( draggable, event ) {\n\n\t\t// Listen for scrolling so that if the dragging causes scrolling the position of the\n\t\t// droppables can be recalculated (see #5003)\n\t\tdraggable.element.parentsUntil( \"body\" ).on( \"scroll.droppable\", function() {\n\t\t\tif ( !draggable.options.refreshPositions ) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\n\t\t\t}\n\t\t} );\n\t},\n\tdrag: function( draggable, event ) {\n\n\t\t// If you have a highly dynamic page, you might try this option. It renders positions\n\t\t// every time you move the mouse.\n\t\tif ( draggable.options.refreshPositions ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\n\t\t}\n\n\t\t// Run through all droppables and check their positions based on specific tolerance options\n\t\t$.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {\n\n\t\t\tif ( this.options.disabled || this.greedyChild || !this.visible ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar parentInstance, scope, parent,\n\t\t\t\tintersects = intersect( draggable, this, this.options.tolerance, event ),\n\t\t\t\tc = !intersects && this.isover ?\n\t\t\t\t\t\"isout\" :\n\t\t\t\t\t( intersects && !this.isover ? \"isover\" : null );\n\t\t\tif ( !c ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.options.greedy ) {\n\n\t\t\t\t// find droppable parents with same scope\n\t\t\t\tscope = this.options.scope;\n\t\t\t\tparent = this.element.parents( \":data(ui-droppable)\" ).filter( function() {\n\t\t\t\t\treturn $( this ).droppable( \"instance\" ).options.scope === scope;\n\t\t\t\t} );\n\n\t\t\t\tif ( parent.length ) {\n\t\t\t\t\tparentInstance = $( parent[ 0 ] ).droppable( \"instance\" );\n\t\t\t\t\tparentInstance.greedyChild = ( c === \"isover\" );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// We just moved into a greedy child\n\t\t\tif ( parentInstance && c === \"isover\" ) {\n\t\t\t\tparentInstance.isover = false;\n\t\t\t\tparentInstance.isout = true;\n\t\t\t\tparentInstance._out.call( parentInstance, event );\n\t\t\t}\n\n\t\t\tthis[ c ] = true;\n\t\t\tthis[ c === \"isout\" ? \"isover\" : \"isout\" ] = false;\n\t\t\tthis[ c === \"isover\" ? \"_over\" : \"_out\" ].call( this, event );\n\n\t\t\t// We just moved out of a greedy child\n\t\t\tif ( parentInstance && c === \"isout\" ) {\n\t\t\t\tparentInstance.isout = false;\n\t\t\t\tparentInstance.isover = true;\n\t\t\t\tparentInstance._over.call( parentInstance, event );\n\t\t\t}\n\t\t} );\n\n\t},\n\tdragStop: function( draggable, event ) {\n\t\tdraggable.element.parentsUntil( \"body\" ).off( \"scroll.droppable\" );\n\n\t\t// Call prepareOffsets one final time since IE does not fire return scroll events when\n\t\t// overflow was caused by drag (see #5003)\n\t\tif ( !draggable.options.refreshPositions ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\n\t\t}\n\t}\n};\n\n// DEPRECATED\n// TODO: switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for activeClass and hoverClass options\n\t$.widget( \"ui.droppable\", $.ui.droppable, {\n\t\toptions: {\n\t\t\thoverClass: false,\n\t\t\tactiveClass: false\n\t\t},\n\t\t_addActiveClass: function() {\n\t\t\tthis._super();\n\t\t\tif ( this.options.activeClass ) {\n\t\t\t\tthis.element.addClass( this.options.activeClass );\n\t\t\t}\n\t\t},\n\t\t_removeActiveClass: function() {\n\t\t\tthis._super();\n\t\t\tif ( this.options.activeClass ) {\n\t\t\t\tthis.element.removeClass( this.options.activeClass );\n\t\t\t}\n\t\t},\n\t\t_addHoverClass: function() {\n\t\t\tthis._super();\n\t\t\tif ( this.options.hoverClass ) {\n\t\t\t\tthis.element.addClass( this.options.hoverClass );\n\t\t\t}\n\t\t},\n\t\t_removeHoverClass: function() {\n\t\t\tthis._super();\n\t\t\tif ( this.options.hoverClass ) {\n\t\t\t\tthis.element.removeClass( this.options.hoverClass );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nvar widgetsDroppable = $.ui.droppable;\n\n\n/*!\n * jQuery UI Resizable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Resizable\n//>>group: Interactions\n//>>description: Enables resize functionality for any element.\n//>>docs: http://api.jqueryui.com/resizable/\n//>>demos: http://jqueryui.com/resizable/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/resizable.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.resizable\", $.ui.mouse, {\n\tversion: \"1.12.1\",\n\twidgetEventPrefix: \"resize\",\n\toptions: {\n\t\talsoResize: false,\n\t\tanimate: false,\n\t\tanimateDuration: \"slow\",\n\t\tanimateEasing: \"swing\",\n\t\taspectRatio: false,\n\t\tautoHide: false,\n\t\tclasses: {\n\t\t\t\"ui-resizable-se\": \"ui-icon ui-icon-gripsmall-diagonal-se\"\n\t\t},\n\t\tcontainment: false,\n\t\tghost: false,\n\t\tgrid: false,\n\t\thandles: \"e,s,se\",\n\t\thelper: false,\n\t\tmaxHeight: null,\n\t\tmaxWidth: null,\n\t\tminHeight: 10,\n\t\tminWidth: 10,\n\n\t\t// See #7960\n\t\tzIndex: 90,\n\n\t\t// Callbacks\n\t\tresize: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t_num: function( value ) {\n\t\treturn parseFloat( value ) || 0;\n\t},\n\n\t_isNumber: function( value ) {\n\t\treturn !isNaN( parseFloat( value ) );\n\t},\n\n\t_hasScroll: function( el, a ) {\n\n\t\tif ( $( el ).css( \"overflow\" ) === \"hidden\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar scroll = ( a && a === \"left\" ) ? \"scrollLeft\" : \"scrollTop\",\n\t\t\thas = false;\n\n\t\tif ( el[ scroll ] > 0 ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// TODO: determine which cases actually cause this to happen\n\t\t// if the element doesn't have the scroll set, see if it's possible to\n\t\t// set the scroll\n\t\tel[ scroll ] = 1;\n\t\thas = ( el[ scroll ] > 0 );\n\t\tel[ scroll ] = 0;\n\t\treturn has;\n\t},\n\n\t_create: function() {\n\n\t\tvar margins,\n\t\t\to = this.options,\n\t\t\tthat = this;\n\t\tthis._addClass( \"ui-resizable\" );\n\n\t\t$.extend( this, {\n\t\t\t_aspectRatio: !!( o.aspectRatio ),\n\t\t\taspectRatio: o.aspectRatio,\n\t\t\toriginalElement: this.element,\n\t\t\t_proportionallyResizeElements: [],\n\t\t\t_helper: o.helper || o.ghost || o.animate ? o.helper || \"ui-resizable-helper\" : null\n\t\t} );\n\n\t\t// Wrap the element if it cannot hold child nodes\n\t\tif ( this.element[ 0 ].nodeName.match( /^(canvas|textarea|input|select|button|img)$/i ) ) {\n\n\t\t\tthis.element.wrap(\n\t\t\t\t$( \"<div class='ui-wrapper' style='overflow: hidden;'></div>\" ).css( {\n\t\t\t\t\tposition: this.element.css( \"position\" ),\n\t\t\t\t\twidth: this.element.outerWidth(),\n\t\t\t\t\theight: this.element.outerHeight(),\n\t\t\t\t\ttop: this.element.css( \"top\" ),\n\t\t\t\t\tleft: this.element.css( \"left\" )\n\t\t\t\t} )\n\t\t\t);\n\n\t\t\tthis.element = this.element.parent().data(\n\t\t\t\t\"ui-resizable\", this.element.resizable( \"instance\" )\n\t\t\t);\n\n\t\t\tthis.elementIsWrapper = true;\n\n\t\t\tmargins = {\n\t\t\t\tmarginTop: this.originalElement.css( \"marginTop\" ),\n\t\t\t\tmarginRight: this.originalElement.css( \"marginRight\" ),\n\t\t\t\tmarginBottom: this.originalElement.css( \"marginBottom\" ),\n\t\t\t\tmarginLeft: this.originalElement.css( \"marginLeft\" )\n\t\t\t};\n\n\t\t\tthis.element.css( margins );\n\t\t\tthis.originalElement.css( \"margin\", 0 );\n\n\t\t\t// support: Safari\n\t\t\t// Prevent Safari textarea resize\n\t\t\tthis.originalResizeStyle = this.originalElement.css( \"resize\" );\n\t\t\tthis.originalElement.css( \"resize\", \"none\" );\n\n\t\t\tthis._proportionallyResizeElements.push( this.originalElement.css( {\n\t\t\t\tposition: \"static\",\n\t\t\t\tzoom: 1,\n\t\t\t\tdisplay: \"block\"\n\t\t\t} ) );\n\n\t\t\t// Support: IE9\n\t\t\t// avoid IE jump (hard set the margin)\n\t\t\tthis.originalElement.css( margins );\n\n\t\t\tthis._proportionallyResize();\n\t\t}\n\n\t\tthis._setupHandles();\n\n\t\tif ( o.autoHide ) {\n\t\t\t$( this.element )\n\t\t\t\t.on( \"mouseenter\", function() {\n\t\t\t\t\tif ( o.disabled ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthat._removeClass( \"ui-resizable-autohide\" );\n\t\t\t\t\tthat._handles.show();\n\t\t\t\t} )\n\t\t\t\t.on( \"mouseleave\", function() {\n\t\t\t\t\tif ( o.disabled ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif ( !that.resizing ) {\n\t\t\t\t\t\tthat._addClass( \"ui-resizable-autohide\" );\n\t\t\t\t\t\tthat._handles.hide();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}\n\n\t\tthis._mouseInit();\n\t},\n\n\t_destroy: function() {\n\n\t\tthis._mouseDestroy();\n\n\t\tvar wrapper,\n\t\t\t_destroy = function( exp ) {\n\t\t\t\t$( exp )\n\t\t\t\t\t.removeData( \"resizable\" )\n\t\t\t\t\t.removeData( \"ui-resizable\" )\n\t\t\t\t\t.off( \".resizable\" )\n\t\t\t\t\t.find( \".ui-resizable-handle\" )\n\t\t\t\t\t\t.remove();\n\t\t\t};\n\n\t\t// TODO: Unwrap at same DOM position\n\t\tif ( this.elementIsWrapper ) {\n\t\t\t_destroy( this.element );\n\t\t\twrapper = this.element;\n\t\t\tthis.originalElement.css( {\n\t\t\t\tposition: wrapper.css( \"position\" ),\n\t\t\t\twidth: wrapper.outerWidth(),\n\t\t\t\theight: wrapper.outerHeight(),\n\t\t\t\ttop: wrapper.css( \"top\" ),\n\t\t\t\tleft: wrapper.css( \"left\" )\n\t\t\t} ).insertAfter( wrapper );\n\t\t\twrapper.remove();\n\t\t}\n\n\t\tthis.originalElement.css( \"resize\", this.originalResizeStyle );\n\t\t_destroy( this.originalElement );\n\n\t\treturn this;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\n\t\tswitch ( key ) {\n\t\tcase \"handles\":\n\t\t\tthis._removeHandles();\n\t\t\tthis._setupHandles();\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t},\n\n\t_setupHandles: function() {\n\t\tvar o = this.options, handle, i, n, hname, axis, that = this;\n\t\tthis.handles = o.handles ||\n\t\t\t( !$( \".ui-resizable-handle\", this.element ).length ?\n\t\t\t\t\"e,s,se\" : {\n\t\t\t\t\tn: \".ui-resizable-n\",\n\t\t\t\t\te: \".ui-resizable-e\",\n\t\t\t\t\ts: \".ui-resizable-s\",\n\t\t\t\t\tw: \".ui-resizable-w\",\n\t\t\t\t\tse: \".ui-resizable-se\",\n\t\t\t\t\tsw: \".ui-resizable-sw\",\n\t\t\t\t\tne: \".ui-resizable-ne\",\n\t\t\t\t\tnw: \".ui-resizable-nw\"\n\t\t\t\t} );\n\n\t\tthis._handles = $();\n\t\tif ( this.handles.constructor === String ) {\n\n\t\t\tif ( this.handles === \"all\" ) {\n\t\t\t\tthis.handles = \"n,e,s,w,se,sw,ne,nw\";\n\t\t\t}\n\n\t\t\tn = this.handles.split( \",\" );\n\t\t\tthis.handles = {};\n\n\t\t\tfor ( i = 0; i < n.length; i++ ) {\n\n\t\t\t\thandle = $.trim( n[ i ] );\n\t\t\t\thname = \"ui-resizable-\" + handle;\n\t\t\t\taxis = $( \"<div>\" );\n\t\t\t\tthis._addClass( axis, \"ui-resizable-handle \" + hname );\n\n\t\t\t\taxis.css( { zIndex: o.zIndex } );\n\n\t\t\t\tthis.handles[ handle ] = \".ui-resizable-\" + handle;\n\t\t\t\tthis.element.append( axis );\n\t\t\t}\n\n\t\t}\n\n\t\tthis._renderAxis = function( target ) {\n\n\t\t\tvar i, axis, padPos, padWrapper;\n\n\t\t\ttarget = target || this.element;\n\n\t\t\tfor ( i in this.handles ) {\n\n\t\t\t\tif ( this.handles[ i ].constructor === String ) {\n\t\t\t\t\tthis.handles[ i ] = this.element.children( this.handles[ i ] ).first().show();\n\t\t\t\t} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {\n\t\t\t\t\tthis.handles[ i ] = $( this.handles[ i ] );\n\t\t\t\t\tthis._on( this.handles[ i ], { \"mousedown\": that._mouseDown } );\n\t\t\t\t}\n\n\t\t\t\tif ( this.elementIsWrapper &&\n\t\t\t\t\t\tthis.originalElement[ 0 ]\n\t\t\t\t\t\t\t.nodeName\n\t\t\t\t\t\t\t.match( /^(textarea|input|select|button)$/i ) ) {\n\t\t\t\t\taxis = $( this.handles[ i ], this.element );\n\n\t\t\t\t\tpadWrapper = /sw|ne|nw|se|n|s/.test( i ) ?\n\t\t\t\t\t\taxis.outerHeight() :\n\t\t\t\t\t\taxis.outerWidth();\n\n\t\t\t\t\tpadPos = [ \"padding\",\n\t\t\t\t\t\t/ne|nw|n/.test( i ) ? \"Top\" :\n\t\t\t\t\t\t/se|sw|s/.test( i ) ? \"Bottom\" :\n\t\t\t\t\t\t/^e$/.test( i ) ? \"Right\" : \"Left\" ].join( \"\" );\n\n\t\t\t\t\ttarget.css( padPos, padWrapper );\n\n\t\t\t\t\tthis._proportionallyResize();\n\t\t\t\t}\n\n\t\t\t\tthis._handles = this._handles.add( this.handles[ i ] );\n\t\t\t}\n\t\t};\n\n\t\t// TODO: make renderAxis a prototype function\n\t\tthis._renderAxis( this.element );\n\n\t\tthis._handles = this._handles.add( this.element.find( \".ui-resizable-handle\" ) );\n\t\tthis._handles.disableSelection();\n\n\t\tthis._handles.on( \"mouseover\", function() {\n\t\t\tif ( !that.resizing ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\taxis = this.className.match( /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i );\n\t\t\t\t}\n\t\t\t\tthat.axis = axis && axis[ 1 ] ? axis[ 1 ] : \"se\";\n\t\t\t}\n\t\t} );\n\n\t\tif ( o.autoHide ) {\n\t\t\tthis._handles.hide();\n\t\t\tthis._addClass( \"ui-resizable-autohide\" );\n\t\t}\n\t},\n\n\t_removeHandles: function() {\n\t\tthis._handles.remove();\n\t},\n\n\t_mouseCapture: function( event ) {\n\t\tvar i, handle,\n\t\t\tcapture = false;\n\n\t\tfor ( i in this.handles ) {\n\t\t\thandle = $( this.handles[ i ] )[ 0 ];\n\t\t\tif ( handle === event.target || $.contains( handle, event.target ) ) {\n\t\t\t\tcapture = true;\n\t\t\t}\n\t\t}\n\n\t\treturn !this.options.disabled && capture;\n\t},\n\n\t_mouseStart: function( event ) {\n\n\t\tvar curleft, curtop, cursor,\n\t\t\to = this.options,\n\t\t\tel = this.element;\n\n\t\tthis.resizing = true;\n\n\t\tthis._renderProxy();\n\n\t\tcurleft = this._num( this.helper.css( \"left\" ) );\n\t\tcurtop = this._num( this.helper.css( \"top\" ) );\n\n\t\tif ( o.containment ) {\n\t\t\tcurleft += $( o.containment ).scrollLeft() || 0;\n\t\t\tcurtop += $( o.containment ).scrollTop() || 0;\n\t\t}\n\n\t\tthis.offset = this.helper.offset();\n\t\tthis.position = { left: curleft, top: curtop };\n\n\t\tthis.size = this._helper ? {\n\t\t\t\twidth: this.helper.width(),\n\t\t\t\theight: this.helper.height()\n\t\t\t} : {\n\t\t\t\twidth: el.width(),\n\t\t\t\theight: el.height()\n\t\t\t};\n\n\t\tthis.originalSize = this._helper ? {\n\t\t\t\twidth: el.outerWidth(),\n\t\t\t\theight: el.outerHeight()\n\t\t\t} : {\n\t\t\t\twidth: el.width(),\n\t\t\t\theight: el.height()\n\t\t\t};\n\n\t\tthis.sizeDiff = {\n\t\t\twidth: el.outerWidth() - el.width(),\n\t\t\theight: el.outerHeight() - el.height()\n\t\t};\n\n\t\tthis.originalPosition = { left: curleft, top: curtop };\n\t\tthis.originalMousePosition = { left: event.pageX, top: event.pageY };\n\n\t\tthis.aspectRatio = ( typeof o.aspectRatio === \"number\" ) ?\n\t\t\to.aspectRatio :\n\t\t\t( ( this.originalSize.width / this.originalSize.height ) || 1 );\n\n\t\tcursor = $( \".ui-resizable-\" + this.axis ).css( \"cursor\" );\n\t\t$( \"body\" ).css( \"cursor\", cursor === \"auto\" ? this.axis + \"-resize\" : cursor );\n\n\t\tthis._addClass( \"ui-resizable-resizing\" );\n\t\tthis._propagate( \"start\", event );\n\t\treturn true;\n\t},\n\n\t_mouseDrag: function( event ) {\n\n\t\tvar data, props,\n\t\t\tsmp = this.originalMousePosition,\n\t\t\ta = this.axis,\n\t\t\tdx = ( event.pageX - smp.left ) || 0,\n\t\t\tdy = ( event.pageY - smp.top ) || 0,\n\t\t\ttrigger = this._change[ a ];\n\n\t\tthis._updatePrevProperties();\n\n\t\tif ( !trigger ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tdata = trigger.apply( this, [ event, dx, dy ] );\n\n\t\tthis._updateVirtualBoundaries( event.shiftKey );\n\t\tif ( this._aspectRatio || event.shiftKey ) {\n\t\t\tdata = this._updateRatio( data, event );\n\t\t}\n\n\t\tdata = this._respectSize( data, event );\n\n\t\tthis._updateCache( data );\n\n\t\tthis._propagate( \"resize\", event );\n\n\t\tprops = this._applyChanges();\n\n\t\tif ( !this._helper && this._proportionallyResizeElements.length ) {\n\t\t\tthis._proportionallyResize();\n\t\t}\n\n\t\tif ( !$.isEmptyObject( props ) ) {\n\t\t\tthis._updatePrevProperties();\n\t\t\tthis._trigger( \"resize\", event, this.ui() );\n\t\t\tthis._applyChanges();\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function( event ) {\n\n\t\tthis.resizing = false;\n\t\tvar pr, ista, soffseth, soffsetw, s, left, top,\n\t\t\to = this.options, that = this;\n\n\t\tif ( this._helper ) {\n\n\t\t\tpr = this._proportionallyResizeElements;\n\t\t\tista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName );\n\t\t\tsoffseth = ista && this._hasScroll( pr[ 0 ], \"left\" ) ? 0 : that.sizeDiff.height;\n\t\t\tsoffsetw = ista ? 0 : that.sizeDiff.width;\n\n\t\t\ts = {\n\t\t\t\twidth: ( that.helper.width()  - soffsetw ),\n\t\t\t\theight: ( that.helper.height() - soffseth )\n\t\t\t};\n\t\t\tleft = ( parseFloat( that.element.css( \"left\" ) ) +\n\t\t\t\t( that.position.left - that.originalPosition.left ) ) || null;\n\t\t\ttop = ( parseFloat( that.element.css( \"top\" ) ) +\n\t\t\t\t( that.position.top - that.originalPosition.top ) ) || null;\n\n\t\t\tif ( !o.animate ) {\n\t\t\t\tthis.element.css( $.extend( s, { top: top, left: left } ) );\n\t\t\t}\n\n\t\t\tthat.helper.height( that.size.height );\n\t\t\tthat.helper.width( that.size.width );\n\n\t\t\tif ( this._helper && !o.animate ) {\n\t\t\t\tthis._proportionallyResize();\n\t\t\t}\n\t\t}\n\n\t\t$( \"body\" ).css( \"cursor\", \"auto\" );\n\n\t\tthis._removeClass( \"ui-resizable-resizing\" );\n\n\t\tthis._propagate( \"stop\", event );\n\n\t\tif ( this._helper ) {\n\t\t\tthis.helper.remove();\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\t_updatePrevProperties: function() {\n\t\tthis.prevPosition = {\n\t\t\ttop: this.position.top,\n\t\t\tleft: this.position.left\n\t\t};\n\t\tthis.prevSize = {\n\t\t\twidth: this.size.width,\n\t\t\theight: this.size.height\n\t\t};\n\t},\n\n\t_applyChanges: function() {\n\t\tvar props = {};\n\n\t\tif ( this.position.top !== this.prevPosition.top ) {\n\t\t\tprops.top = this.position.top + \"px\";\n\t\t}\n\t\tif ( this.position.left !== this.prevPosition.left ) {\n\t\t\tprops.left = this.position.left + \"px\";\n\t\t}\n\t\tif ( this.size.width !== this.prevSize.width ) {\n\t\t\tprops.width = this.size.width + \"px\";\n\t\t}\n\t\tif ( this.size.height !== this.prevSize.height ) {\n\t\t\tprops.height = this.size.height + \"px\";\n\t\t}\n\n\t\tthis.helper.css( props );\n\n\t\treturn props;\n\t},\n\n\t_updateVirtualBoundaries: function( forceAspectRatio ) {\n\t\tvar pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,\n\t\t\to = this.options;\n\n\t\tb = {\n\t\t\tminWidth: this._isNumber( o.minWidth ) ? o.minWidth : 0,\n\t\t\tmaxWidth: this._isNumber( o.maxWidth ) ? o.maxWidth : Infinity,\n\t\t\tminHeight: this._isNumber( o.minHeight ) ? o.minHeight : 0,\n\t\t\tmaxHeight: this._isNumber( o.maxHeight ) ? o.maxHeight : Infinity\n\t\t};\n\n\t\tif ( this._aspectRatio || forceAspectRatio ) {\n\t\t\tpMinWidth = b.minHeight * this.aspectRatio;\n\t\t\tpMinHeight = b.minWidth / this.aspectRatio;\n\t\t\tpMaxWidth = b.maxHeight * this.aspectRatio;\n\t\t\tpMaxHeight = b.maxWidth / this.aspectRatio;\n\n\t\t\tif ( pMinWidth > b.minWidth ) {\n\t\t\t\tb.minWidth = pMinWidth;\n\t\t\t}\n\t\t\tif ( pMinHeight > b.minHeight ) {\n\t\t\t\tb.minHeight = pMinHeight;\n\t\t\t}\n\t\t\tif ( pMaxWidth < b.maxWidth ) {\n\t\t\t\tb.maxWidth = pMaxWidth;\n\t\t\t}\n\t\t\tif ( pMaxHeight < b.maxHeight ) {\n\t\t\t\tb.maxHeight = pMaxHeight;\n\t\t\t}\n\t\t}\n\t\tthis._vBoundaries = b;\n\t},\n\n\t_updateCache: function( data ) {\n\t\tthis.offset = this.helper.offset();\n\t\tif ( this._isNumber( data.left ) ) {\n\t\t\tthis.position.left = data.left;\n\t\t}\n\t\tif ( this._isNumber( data.top ) ) {\n\t\t\tthis.position.top = data.top;\n\t\t}\n\t\tif ( this._isNumber( data.height ) ) {\n\t\t\tthis.size.height = data.height;\n\t\t}\n\t\tif ( this._isNumber( data.width ) ) {\n\t\t\tthis.size.width = data.width;\n\t\t}\n\t},\n\n\t_updateRatio: function( data ) {\n\n\t\tvar cpos = this.position,\n\t\t\tcsize = this.size,\n\t\t\ta = this.axis;\n\n\t\tif ( this._isNumber( data.height ) ) {\n\t\t\tdata.width = ( data.height * this.aspectRatio );\n\t\t} else if ( this._isNumber( data.width ) ) {\n\t\t\tdata.height = ( data.width / this.aspectRatio );\n\t\t}\n\n\t\tif ( a === \"sw\" ) {\n\t\t\tdata.left = cpos.left + ( csize.width - data.width );\n\t\t\tdata.top = null;\n\t\t}\n\t\tif ( a === \"nw\" ) {\n\t\t\tdata.top = cpos.top + ( csize.height - data.height );\n\t\t\tdata.left = cpos.left + ( csize.width - data.width );\n\t\t}\n\n\t\treturn data;\n\t},\n\n\t_respectSize: function( data ) {\n\n\t\tvar o = this._vBoundaries,\n\t\t\ta = this.axis,\n\t\t\tismaxw = this._isNumber( data.width ) && o.maxWidth && ( o.maxWidth < data.width ),\n\t\t\tismaxh = this._isNumber( data.height ) && o.maxHeight && ( o.maxHeight < data.height ),\n\t\t\tisminw = this._isNumber( data.width ) && o.minWidth && ( o.minWidth > data.width ),\n\t\t\tisminh = this._isNumber( data.height ) && o.minHeight && ( o.minHeight > data.height ),\n\t\t\tdw = this.originalPosition.left + this.originalSize.width,\n\t\t\tdh = this.originalPosition.top + this.originalSize.height,\n\t\t\tcw = /sw|nw|w/.test( a ), ch = /nw|ne|n/.test( a );\n\t\tif ( isminw ) {\n\t\t\tdata.width = o.minWidth;\n\t\t}\n\t\tif ( isminh ) {\n\t\t\tdata.height = o.minHeight;\n\t\t}\n\t\tif ( ismaxw ) {\n\t\t\tdata.width = o.maxWidth;\n\t\t}\n\t\tif ( ismaxh ) {\n\t\t\tdata.height = o.maxHeight;\n\t\t}\n\n\t\tif ( isminw && cw ) {\n\t\t\tdata.left = dw - o.minWidth;\n\t\t}\n\t\tif ( ismaxw && cw ) {\n\t\t\tdata.left = dw - o.maxWidth;\n\t\t}\n\t\tif ( isminh && ch ) {\n\t\t\tdata.top = dh - o.minHeight;\n\t\t}\n\t\tif ( ismaxh && ch ) {\n\t\t\tdata.top = dh - o.maxHeight;\n\t\t}\n\n\t\t// Fixing jump error on top/left - bug #2330\n\t\tif ( !data.width && !data.height && !data.left && data.top ) {\n\t\t\tdata.top = null;\n\t\t} else if ( !data.width && !data.height && !data.top && data.left ) {\n\t\t\tdata.left = null;\n\t\t}\n\n\t\treturn data;\n\t},\n\n\t_getPaddingPlusBorderDimensions: function( element ) {\n\t\tvar i = 0,\n\t\t\twidths = [],\n\t\t\tborders = [\n\t\t\t\telement.css( \"borderTopWidth\" ),\n\t\t\t\telement.css( \"borderRightWidth\" ),\n\t\t\t\telement.css( \"borderBottomWidth\" ),\n\t\t\t\telement.css( \"borderLeftWidth\" )\n\t\t\t],\n\t\t\tpaddings = [\n\t\t\t\telement.css( \"paddingTop\" ),\n\t\t\t\telement.css( \"paddingRight\" ),\n\t\t\t\telement.css( \"paddingBottom\" ),\n\t\t\t\telement.css( \"paddingLeft\" )\n\t\t\t];\n\n\t\tfor ( ; i < 4; i++ ) {\n\t\t\twidths[ i ] = ( parseFloat( borders[ i ] ) || 0 );\n\t\t\twidths[ i ] += ( parseFloat( paddings[ i ] ) || 0 );\n\t\t}\n\n\t\treturn {\n\t\t\theight: widths[ 0 ] + widths[ 2 ],\n\t\t\twidth: widths[ 1 ] + widths[ 3 ]\n\t\t};\n\t},\n\n\t_proportionallyResize: function() {\n\n\t\tif ( !this._proportionallyResizeElements.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar prel,\n\t\t\ti = 0,\n\t\t\telement = this.helper || this.element;\n\n\t\tfor ( ; i < this._proportionallyResizeElements.length; i++ ) {\n\n\t\t\tprel = this._proportionallyResizeElements[ i ];\n\n\t\t\t// TODO: Seems like a bug to cache this.outerDimensions\n\t\t\t// considering that we are in a loop.\n\t\t\tif ( !this.outerDimensions ) {\n\t\t\t\tthis.outerDimensions = this._getPaddingPlusBorderDimensions( prel );\n\t\t\t}\n\n\t\t\tprel.css( {\n\t\t\t\theight: ( element.height() - this.outerDimensions.height ) || 0,\n\t\t\t\twidth: ( element.width() - this.outerDimensions.width ) || 0\n\t\t\t} );\n\n\t\t}\n\n\t},\n\n\t_renderProxy: function() {\n\n\t\tvar el = this.element, o = this.options;\n\t\tthis.elementOffset = el.offset();\n\n\t\tif ( this._helper ) {\n\n\t\t\tthis.helper = this.helper || $( \"<div style='overflow:hidden;'></div>\" );\n\n\t\t\tthis._addClass( this.helper, this._helper );\n\t\t\tthis.helper.css( {\n\t\t\t\twidth: this.element.outerWidth(),\n\t\t\t\theight: this.element.outerHeight(),\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: this.elementOffset.left + \"px\",\n\t\t\t\ttop: this.elementOffset.top + \"px\",\n\t\t\t\tzIndex: ++o.zIndex //TODO: Don't modify option\n\t\t\t} );\n\n\t\t\tthis.helper\n\t\t\t\t.appendTo( \"body\" )\n\t\t\t\t.disableSelection();\n\n\t\t} else {\n\t\t\tthis.helper = this.element;\n\t\t}\n\n\t},\n\n\t_change: {\n\t\te: function( event, dx ) {\n\t\t\treturn { width: this.originalSize.width + dx };\n\t\t},\n\t\tw: function( event, dx ) {\n\t\t\tvar cs = this.originalSize, sp = this.originalPosition;\n\t\t\treturn { left: sp.left + dx, width: cs.width - dx };\n\t\t},\n\t\tn: function( event, dx, dy ) {\n\t\t\tvar cs = this.originalSize, sp = this.originalPosition;\n\t\t\treturn { top: sp.top + dy, height: cs.height - dy };\n\t\t},\n\t\ts: function( event, dx, dy ) {\n\t\t\treturn { height: this.originalSize.height + dy };\n\t\t},\n\t\tse: function( event, dx, dy ) {\n\t\t\treturn $.extend( this._change.s.apply( this, arguments ),\n\t\t\t\tthis._change.e.apply( this, [ event, dx, dy ] ) );\n\t\t},\n\t\tsw: function( event, dx, dy ) {\n\t\t\treturn $.extend( this._change.s.apply( this, arguments ),\n\t\t\t\tthis._change.w.apply( this, [ event, dx, dy ] ) );\n\t\t},\n\t\tne: function( event, dx, dy ) {\n\t\t\treturn $.extend( this._change.n.apply( this, arguments ),\n\t\t\t\tthis._change.e.apply( this, [ event, dx, dy ] ) );\n\t\t},\n\t\tnw: function( event, dx, dy ) {\n\t\t\treturn $.extend( this._change.n.apply( this, arguments ),\n\t\t\t\tthis._change.w.apply( this, [ event, dx, dy ] ) );\n\t\t}\n\t},\n\n\t_propagate: function( n, event ) {\n\t\t$.ui.plugin.call( this, n, [ event, this.ui() ] );\n\t\t( n !== \"resize\" && this._trigger( n, event, this.ui() ) );\n\t},\n\n\tplugins: {},\n\n\tui: function() {\n\t\treturn {\n\t\t\toriginalElement: this.originalElement,\n\t\t\telement: this.element,\n\t\t\thelper: this.helper,\n\t\t\tposition: this.position,\n\t\t\tsize: this.size,\n\t\t\toriginalSize: this.originalSize,\n\t\t\toriginalPosition: this.originalPosition\n\t\t};\n\t}\n\n} );\n\n/*\n * Resizable Extensions\n */\n\n$.ui.plugin.add( \"resizable\", \"animate\", {\n\n\tstop: function( event ) {\n\t\tvar that = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tpr = that._proportionallyResizeElements,\n\t\t\tista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName ),\n\t\t\tsoffseth = ista && that._hasScroll( pr[ 0 ], \"left\" ) ? 0 : that.sizeDiff.height,\n\t\t\tsoffsetw = ista ? 0 : that.sizeDiff.width,\n\t\t\tstyle = {\n\t\t\t\twidth: ( that.size.width - soffsetw ),\n\t\t\t\theight: ( that.size.height - soffseth )\n\t\t\t},\n\t\t\tleft = ( parseFloat( that.element.css( \"left\" ) ) +\n\t\t\t\t( that.position.left - that.originalPosition.left ) ) || null,\n\t\t\ttop = ( parseFloat( that.element.css( \"top\" ) ) +\n\t\t\t\t( that.position.top - that.originalPosition.top ) ) || null;\n\n\t\tthat.element.animate(\n\t\t\t$.extend( style, top && left ? { top: top, left: left } : {} ), {\n\t\t\t\tduration: o.animateDuration,\n\t\t\t\teasing: o.animateEasing,\n\t\t\t\tstep: function() {\n\n\t\t\t\t\tvar data = {\n\t\t\t\t\t\twidth: parseFloat( that.element.css( \"width\" ) ),\n\t\t\t\t\t\theight: parseFloat( that.element.css( \"height\" ) ),\n\t\t\t\t\t\ttop: parseFloat( that.element.css( \"top\" ) ),\n\t\t\t\t\t\tleft: parseFloat( that.element.css( \"left\" ) )\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( pr && pr.length ) {\n\t\t\t\t\t\t$( pr[ 0 ] ).css( { width: data.width, height: data.height } );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Propagating resize, and updating values for each animation step\n\t\t\t\t\tthat._updateCache( data );\n\t\t\t\t\tthat._propagate( \"resize\", event );\n\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n} );\n\n$.ui.plugin.add( \"resizable\", \"containment\", {\n\n\tstart: function() {\n\t\tvar element, p, co, ch, cw, width, height,\n\t\t\tthat = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tel = that.element,\n\t\t\toc = o.containment,\n\t\t\tce = ( oc instanceof $ ) ?\n\t\t\t\toc.get( 0 ) :\n\t\t\t\t( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;\n\n\t\tif ( !ce ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthat.containerElement = $( ce );\n\n\t\tif ( /document/.test( oc ) || oc === document ) {\n\t\t\tthat.containerOffset = {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0\n\t\t\t};\n\t\t\tthat.containerPosition = {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0\n\t\t\t};\n\n\t\t\tthat.parentData = {\n\t\t\t\telement: $( document ),\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0,\n\t\t\t\twidth: $( document ).width(),\n\t\t\t\theight: $( document ).height() || document.body.parentNode.scrollHeight\n\t\t\t};\n\t\t} else {\n\t\t\telement = $( ce );\n\t\t\tp = [];\n\t\t\t$( [ \"Top\", \"Right\", \"Left\", \"Bottom\" ] ).each( function( i, name ) {\n\t\t\t\tp[ i ] = that._num( element.css( \"padding\" + name ) );\n\t\t\t} );\n\n\t\t\tthat.containerOffset = element.offset();\n\t\t\tthat.containerPosition = element.position();\n\t\t\tthat.containerSize = {\n\t\t\t\theight: ( element.innerHeight() - p[ 3 ] ),\n\t\t\t\twidth: ( element.innerWidth() - p[ 1 ] )\n\t\t\t};\n\n\t\t\tco = that.containerOffset;\n\t\t\tch = that.containerSize.height;\n\t\t\tcw = that.containerSize.width;\n\t\t\twidth = ( that._hasScroll ( ce, \"left\" ) ? ce.scrollWidth : cw );\n\t\t\theight = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;\n\n\t\t\tthat.parentData = {\n\t\t\t\telement: ce,\n\t\t\t\tleft: co.left,\n\t\t\t\ttop: co.top,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\t\t}\n\t},\n\n\tresize: function( event ) {\n\t\tvar woset, hoset, isParent, isOffsetRelative,\n\t\t\tthat = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tco = that.containerOffset,\n\t\t\tcp = that.position,\n\t\t\tpRatio = that._aspectRatio || event.shiftKey,\n\t\t\tcop = {\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0\n\t\t\t},\n\t\t\tce = that.containerElement,\n\t\t\tcontinueResize = true;\n\n\t\tif ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( \"position\" ) ) ) {\n\t\t\tcop = co;\n\t\t}\n\n\t\tif ( cp.left < ( that._helper ? co.left : 0 ) ) {\n\t\t\tthat.size.width = that.size.width +\n\t\t\t\t( that._helper ?\n\t\t\t\t\t( that.position.left - co.left ) :\n\t\t\t\t\t( that.position.left - cop.left ) );\n\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.height = that.size.width / that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t\tthat.position.left = o.helper ? co.left : 0;\n\t\t}\n\n\t\tif ( cp.top < ( that._helper ? co.top : 0 ) ) {\n\t\t\tthat.size.height = that.size.height +\n\t\t\t\t( that._helper ?\n\t\t\t\t\t( that.position.top - co.top ) :\n\t\t\t\t\tthat.position.top );\n\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.width = that.size.height * that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t\tthat.position.top = that._helper ? co.top : 0;\n\t\t}\n\n\t\tisParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );\n\t\tisOffsetRelative = /relative|absolute/.test( that.containerElement.css( \"position\" ) );\n\n\t\tif ( isParent && isOffsetRelative ) {\n\t\t\tthat.offset.left = that.parentData.left + that.position.left;\n\t\t\tthat.offset.top = that.parentData.top + that.position.top;\n\t\t} else {\n\t\t\tthat.offset.left = that.element.offset().left;\n\t\t\tthat.offset.top = that.element.offset().top;\n\t\t}\n\n\t\twoset = Math.abs( that.sizeDiff.width +\n\t\t\t( that._helper ?\n\t\t\t\tthat.offset.left - cop.left :\n\t\t\t\t( that.offset.left - co.left ) ) );\n\n\t\thoset = Math.abs( that.sizeDiff.height +\n\t\t\t( that._helper ?\n\t\t\t\tthat.offset.top - cop.top :\n\t\t\t\t( that.offset.top - co.top ) ) );\n\n\t\tif ( woset + that.size.width >= that.parentData.width ) {\n\t\t\tthat.size.width = that.parentData.width - woset;\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.height = that.size.width / that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t}\n\n\t\tif ( hoset + that.size.height >= that.parentData.height ) {\n\t\t\tthat.size.height = that.parentData.height - hoset;\n\t\t\tif ( pRatio ) {\n\t\t\t\tthat.size.width = that.size.height * that.aspectRatio;\n\t\t\t\tcontinueResize = false;\n\t\t\t}\n\t\t}\n\n\t\tif ( !continueResize ) {\n\t\t\tthat.position.left = that.prevPosition.left;\n\t\t\tthat.position.top = that.prevPosition.top;\n\t\t\tthat.size.width = that.prevSize.width;\n\t\t\tthat.size.height = that.prevSize.height;\n\t\t}\n\t},\n\n\tstop: function() {\n\t\tvar that = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tco = that.containerOffset,\n\t\t\tcop = that.containerPosition,\n\t\t\tce = that.containerElement,\n\t\t\thelper = $( that.helper ),\n\t\t\tho = helper.offset(),\n\t\t\tw = helper.outerWidth() - that.sizeDiff.width,\n\t\t\th = helper.outerHeight() - that.sizeDiff.height;\n\n\t\tif ( that._helper && !o.animate && ( /relative/ ).test( ce.css( \"position\" ) ) ) {\n\t\t\t$( this ).css( {\n\t\t\t\tleft: ho.left - cop.left - co.left,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t} );\n\t\t}\n\n\t\tif ( that._helper && !o.animate && ( /static/ ).test( ce.css( \"position\" ) ) ) {\n\t\t\t$( this ).css( {\n\t\t\t\tleft: ho.left - cop.left - co.left,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t} );\n\t\t}\n\t}\n} );\n\n$.ui.plugin.add( \"resizable\", \"alsoResize\", {\n\n\tstart: function() {\n\t\tvar that = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options;\n\n\t\t$( o.alsoResize ).each( function() {\n\t\t\tvar el = $( this );\n\t\t\tel.data( \"ui-resizable-alsoresize\", {\n\t\t\t\twidth: parseFloat( el.width() ), height: parseFloat( el.height() ),\n\t\t\t\tleft: parseFloat( el.css( \"left\" ) ), top: parseFloat( el.css( \"top\" ) )\n\t\t\t} );\n\t\t} );\n\t},\n\n\tresize: function( event, ui ) {\n\t\tvar that = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tos = that.originalSize,\n\t\t\top = that.originalPosition,\n\t\t\tdelta = {\n\t\t\t\theight: ( that.size.height - os.height ) || 0,\n\t\t\t\twidth: ( that.size.width - os.width ) || 0,\n\t\t\t\ttop: ( that.position.top - op.top ) || 0,\n\t\t\t\tleft: ( that.position.left - op.left ) || 0\n\t\t\t};\n\n\t\t\t$( o.alsoResize ).each( function() {\n\t\t\t\tvar el = $( this ), start = $( this ).data( \"ui-resizable-alsoresize\" ), style = {},\n\t\t\t\t\tcss = el.parents( ui.originalElement[ 0 ] ).length ?\n\t\t\t\t\t\t\t[ \"width\", \"height\" ] :\n\t\t\t\t\t\t\t[ \"width\", \"height\", \"top\", \"left\" ];\n\n\t\t\t\t$.each( css, function( i, prop ) {\n\t\t\t\t\tvar sum = ( start[ prop ] || 0 ) + ( delta[ prop ] || 0 );\n\t\t\t\t\tif ( sum && sum >= 0 ) {\n\t\t\t\t\t\tstyle[ prop ] = sum || null;\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tel.css( style );\n\t\t\t} );\n\t},\n\n\tstop: function() {\n\t\t$( this ).removeData( \"ui-resizable-alsoresize\" );\n\t}\n} );\n\n$.ui.plugin.add( \"resizable\", \"ghost\", {\n\n\tstart: function() {\n\n\t\tvar that = $( this ).resizable( \"instance\" ), cs = that.size;\n\n\t\tthat.ghost = that.originalElement.clone();\n\t\tthat.ghost.css( {\n\t\t\topacity: 0.25,\n\t\t\tdisplay: \"block\",\n\t\t\tposition: \"relative\",\n\t\t\theight: cs.height,\n\t\t\twidth: cs.width,\n\t\t\tmargin: 0,\n\t\t\tleft: 0,\n\t\t\ttop: 0\n\t\t} );\n\n\t\tthat._addClass( that.ghost, \"ui-resizable-ghost\" );\n\n\t\t// DEPRECATED\n\t\t// TODO: remove after 1.12\n\t\tif ( $.uiBackCompat !== false && typeof that.options.ghost === \"string\" ) {\n\n\t\t\t// Ghost option\n\t\t\tthat.ghost.addClass( this.options.ghost );\n\t\t}\n\n\t\tthat.ghost.appendTo( that.helper );\n\n\t},\n\n\tresize: function() {\n\t\tvar that = $( this ).resizable( \"instance\" );\n\t\tif ( that.ghost ) {\n\t\t\tthat.ghost.css( {\n\t\t\t\tposition: \"relative\",\n\t\t\t\theight: that.size.height,\n\t\t\t\twidth: that.size.width\n\t\t\t} );\n\t\t}\n\t},\n\n\tstop: function() {\n\t\tvar that = $( this ).resizable( \"instance\" );\n\t\tif ( that.ghost && that.helper ) {\n\t\t\tthat.helper.get( 0 ).removeChild( that.ghost.get( 0 ) );\n\t\t}\n\t}\n\n} );\n\n$.ui.plugin.add( \"resizable\", \"grid\", {\n\n\tresize: function() {\n\t\tvar outerDimensions,\n\t\t\tthat = $( this ).resizable( \"instance\" ),\n\t\t\to = that.options,\n\t\t\tcs = that.size,\n\t\t\tos = that.originalSize,\n\t\t\top = that.originalPosition,\n\t\t\ta = that.axis,\n\t\t\tgrid = typeof o.grid === \"number\" ? [ o.grid, o.grid ] : o.grid,\n\t\t\tgridX = ( grid[ 0 ] || 1 ),\n\t\t\tgridY = ( grid[ 1 ] || 1 ),\n\t\t\tox = Math.round( ( cs.width - os.width ) / gridX ) * gridX,\n\t\t\toy = Math.round( ( cs.height - os.height ) / gridY ) * gridY,\n\t\t\tnewWidth = os.width + ox,\n\t\t\tnewHeight = os.height + oy,\n\t\t\tisMaxWidth = o.maxWidth && ( o.maxWidth < newWidth ),\n\t\t\tisMaxHeight = o.maxHeight && ( o.maxHeight < newHeight ),\n\t\t\tisMinWidth = o.minWidth && ( o.minWidth > newWidth ),\n\t\t\tisMinHeight = o.minHeight && ( o.minHeight > newHeight );\n\n\t\to.grid = grid;\n\n\t\tif ( isMinWidth ) {\n\t\t\tnewWidth += gridX;\n\t\t}\n\t\tif ( isMinHeight ) {\n\t\t\tnewHeight += gridY;\n\t\t}\n\t\tif ( isMaxWidth ) {\n\t\t\tnewWidth -= gridX;\n\t\t}\n\t\tif ( isMaxHeight ) {\n\t\t\tnewHeight -= gridY;\n\t\t}\n\n\t\tif ( /^(se|s|e)$/.test( a ) ) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t} else if ( /^(ne)$/.test( a ) ) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t\tthat.position.top = op.top - oy;\n\t\t} else if ( /^(sw)$/.test( a ) ) {\n\t\t\tthat.size.width = newWidth;\n\t\t\tthat.size.height = newHeight;\n\t\t\tthat.position.left = op.left - ox;\n\t\t} else {\n\t\t\tif ( newHeight - gridY <= 0 || newWidth - gridX <= 0 ) {\n\t\t\t\touterDimensions = that._getPaddingPlusBorderDimensions( this );\n\t\t\t}\n\n\t\t\tif ( newHeight - gridY > 0 ) {\n\t\t\t\tthat.size.height = newHeight;\n\t\t\t\tthat.position.top = op.top - oy;\n\t\t\t} else {\n\t\t\t\tnewHeight = gridY - outerDimensions.height;\n\t\t\t\tthat.size.height = newHeight;\n\t\t\t\tthat.position.top = op.top + os.height - newHeight;\n\t\t\t}\n\t\t\tif ( newWidth - gridX > 0 ) {\n\t\t\t\tthat.size.width = newWidth;\n\t\t\t\tthat.position.left = op.left - ox;\n\t\t\t} else {\n\t\t\t\tnewWidth = gridX - outerDimensions.width;\n\t\t\t\tthat.size.width = newWidth;\n\t\t\t\tthat.position.left = op.left + os.width - newWidth;\n\t\t\t}\n\t\t}\n\t}\n\n} );\n\nvar widgetsResizable = $.ui.resizable;\n\n\n/*!\n * jQuery UI Selectable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Selectable\n//>>group: Interactions\n//>>description: Allows groups of elements to be selected with the mouse.\n//>>docs: http://api.jqueryui.com/selectable/\n//>>demos: http://jqueryui.com/selectable/\n//>>css.structure: ../../themes/base/selectable.css\n\n\n\nvar widgetsSelectable = $.widget( \"ui.selectable\", $.ui.mouse, {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tappendTo: \"body\",\n\t\tautoRefresh: true,\n\t\tdistance: 0,\n\t\tfilter: \"*\",\n\t\ttolerance: \"touch\",\n\n\t\t// Callbacks\n\t\tselected: null,\n\t\tselecting: null,\n\t\tstart: null,\n\t\tstop: null,\n\t\tunselected: null,\n\t\tunselecting: null\n\t},\n\t_create: function() {\n\t\tvar that = this;\n\n\t\tthis._addClass( \"ui-selectable\" );\n\n\t\tthis.dragged = false;\n\n\t\t// Cache selectee children based on filter\n\t\tthis.refresh = function() {\n\t\t\tthat.elementPos = $( that.element[ 0 ] ).offset();\n\t\t\tthat.selectees = $( that.options.filter, that.element[ 0 ] );\n\t\t\tthat._addClass( that.selectees, \"ui-selectee\" );\n\t\t\tthat.selectees.each( function() {\n\t\t\t\tvar $this = $( this ),\n\t\t\t\t\tselecteeOffset = $this.offset(),\n\t\t\t\t\tpos = {\n\t\t\t\t\t\tleft: selecteeOffset.left - that.elementPos.left,\n\t\t\t\t\t\ttop: selecteeOffset.top - that.elementPos.top\n\t\t\t\t\t};\n\t\t\t\t$.data( this, \"selectable-item\", {\n\t\t\t\t\telement: this,\n\t\t\t\t\t$element: $this,\n\t\t\t\t\tleft: pos.left,\n\t\t\t\t\ttop: pos.top,\n\t\t\t\t\tright: pos.left + $this.outerWidth(),\n\t\t\t\t\tbottom: pos.top + $this.outerHeight(),\n\t\t\t\t\tstartselected: false,\n\t\t\t\t\tselected: $this.hasClass( \"ui-selected\" ),\n\t\t\t\t\tselecting: $this.hasClass( \"ui-selecting\" ),\n\t\t\t\t\tunselecting: $this.hasClass( \"ui-unselecting\" )\n\t\t\t\t} );\n\t\t\t} );\n\t\t};\n\t\tthis.refresh();\n\n\t\tthis._mouseInit();\n\n\t\tthis.helper = $( \"<div>\" );\n\t\tthis._addClass( this.helper, \"ui-selectable-helper\" );\n\t},\n\n\t_destroy: function() {\n\t\tthis.selectees.removeData( \"selectable-item\" );\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseStart: function( event ) {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tthis.opos = [ event.pageX, event.pageY ];\n\t\tthis.elementPos = $( this.element[ 0 ] ).offset();\n\n\t\tif ( this.options.disabled ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.selectees = $( options.filter, this.element[ 0 ] );\n\n\t\tthis._trigger( \"start\", event );\n\n\t\t$( options.appendTo ).append( this.helper );\n\n\t\t// position helper (lasso)\n\t\tthis.helper.css( {\n\t\t\t\"left\": event.pageX,\n\t\t\t\"top\": event.pageY,\n\t\t\t\"width\": 0,\n\t\t\t\"height\": 0\n\t\t} );\n\n\t\tif ( options.autoRefresh ) {\n\t\t\tthis.refresh();\n\t\t}\n\n\t\tthis.selectees.filter( \".ui-selected\" ).each( function() {\n\t\t\tvar selectee = $.data( this, \"selectable-item\" );\n\t\t\tselectee.startselected = true;\n\t\t\tif ( !event.metaKey && !event.ctrlKey ) {\n\t\t\t\tthat._removeClass( selectee.$element, \"ui-selected\" );\n\t\t\t\tselectee.selected = false;\n\t\t\t\tthat._addClass( selectee.$element, \"ui-unselecting\" );\n\t\t\t\tselectee.unselecting = true;\n\n\t\t\t\t// selectable UNSELECTING callback\n\t\t\t\tthat._trigger( \"unselecting\", event, {\n\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\t$( event.target ).parents().addBack().each( function() {\n\t\t\tvar doSelect,\n\t\t\t\tselectee = $.data( this, \"selectable-item\" );\n\t\t\tif ( selectee ) {\n\t\t\t\tdoSelect = ( !event.metaKey && !event.ctrlKey ) ||\n\t\t\t\t\t!selectee.$element.hasClass( \"ui-selected\" );\n\t\t\t\tthat._removeClass( selectee.$element, doSelect ? \"ui-unselecting\" : \"ui-selected\" )\n\t\t\t\t\t._addClass( selectee.$element, doSelect ? \"ui-selecting\" : \"ui-unselecting\" );\n\t\t\t\tselectee.unselecting = !doSelect;\n\t\t\t\tselectee.selecting = doSelect;\n\t\t\t\tselectee.selected = doSelect;\n\n\t\t\t\t// selectable (UN)SELECTING callback\n\t\t\t\tif ( doSelect ) {\n\t\t\t\t\tthat._trigger( \"selecting\", event, {\n\t\t\t\t\t\tselecting: selectee.element\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\tthat._trigger( \"unselecting\", event, {\n\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} );\n\n\t},\n\n\t_mouseDrag: function( event ) {\n\n\t\tthis.dragged = true;\n\n\t\tif ( this.options.disabled ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar tmp,\n\t\t\tthat = this,\n\t\t\toptions = this.options,\n\t\t\tx1 = this.opos[ 0 ],\n\t\t\ty1 = this.opos[ 1 ],\n\t\t\tx2 = event.pageX,\n\t\t\ty2 = event.pageY;\n\n\t\tif ( x1 > x2 ) { tmp = x2; x2 = x1; x1 = tmp; }\n\t\tif ( y1 > y2 ) { tmp = y2; y2 = y1; y1 = tmp; }\n\t\tthis.helper.css( { left: x1, top: y1, width: x2 - x1, height: y2 - y1 } );\n\n\t\tthis.selectees.each( function() {\n\t\t\tvar selectee = $.data( this, \"selectable-item\" ),\n\t\t\t\thit = false,\n\t\t\t\toffset = {};\n\n\t\t\t//prevent helper from being selected if appendTo: selectable\n\t\t\tif ( !selectee || selectee.element === that.element[ 0 ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\toffset.left   = selectee.left   + that.elementPos.left;\n\t\t\toffset.right  = selectee.right  + that.elementPos.left;\n\t\t\toffset.top    = selectee.top    + that.elementPos.top;\n\t\t\toffset.bottom = selectee.bottom + that.elementPos.top;\n\n\t\t\tif ( options.tolerance === \"touch\" ) {\n\t\t\t\thit = ( !( offset.left > x2 || offset.right < x1 || offset.top > y2 ||\n                    offset.bottom < y1 ) );\n\t\t\t} else if ( options.tolerance === \"fit\" ) {\n\t\t\t\thit = ( offset.left > x1 && offset.right < x2 && offset.top > y1 &&\n                    offset.bottom < y2 );\n\t\t\t}\n\n\t\t\tif ( hit ) {\n\n\t\t\t\t// SELECT\n\t\t\t\tif ( selectee.selected ) {\n\t\t\t\t\tthat._removeClass( selectee.$element, \"ui-selected\" );\n\t\t\t\t\tselectee.selected = false;\n\t\t\t\t}\n\t\t\t\tif ( selectee.unselecting ) {\n\t\t\t\t\tthat._removeClass( selectee.$element, \"ui-unselecting\" );\n\t\t\t\t\tselectee.unselecting = false;\n\t\t\t\t}\n\t\t\t\tif ( !selectee.selecting ) {\n\t\t\t\t\tthat._addClass( selectee.$element, \"ui-selecting\" );\n\t\t\t\t\tselectee.selecting = true;\n\n\t\t\t\t\t// selectable SELECTING callback\n\t\t\t\t\tthat._trigger( \"selecting\", event, {\n\t\t\t\t\t\tselecting: selectee.element\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// UNSELECT\n\t\t\t\tif ( selectee.selecting ) {\n\t\t\t\t\tif ( ( event.metaKey || event.ctrlKey ) && selectee.startselected ) {\n\t\t\t\t\t\tthat._removeClass( selectee.$element, \"ui-selecting\" );\n\t\t\t\t\t\tselectee.selecting = false;\n\t\t\t\t\t\tthat._addClass( selectee.$element, \"ui-selected\" );\n\t\t\t\t\t\tselectee.selected = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthat._removeClass( selectee.$element, \"ui-selecting\" );\n\t\t\t\t\t\tselectee.selecting = false;\n\t\t\t\t\t\tif ( selectee.startselected ) {\n\t\t\t\t\t\t\tthat._addClass( selectee.$element, \"ui-unselecting\" );\n\t\t\t\t\t\t\tselectee.unselecting = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// selectable UNSELECTING callback\n\t\t\t\t\t\tthat._trigger( \"unselecting\", event, {\n\t\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( selectee.selected ) {\n\t\t\t\t\tif ( !event.metaKey && !event.ctrlKey && !selectee.startselected ) {\n\t\t\t\t\t\tthat._removeClass( selectee.$element, \"ui-selected\" );\n\t\t\t\t\t\tselectee.selected = false;\n\n\t\t\t\t\t\tthat._addClass( selectee.$element, \"ui-unselecting\" );\n\t\t\t\t\t\tselectee.unselecting = true;\n\n\t\t\t\t\t\t// selectable UNSELECTING callback\n\t\t\t\t\t\tthat._trigger( \"unselecting\", event, {\n\t\t\t\t\t\t\tunselecting: selectee.element\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function( event ) {\n\t\tvar that = this;\n\n\t\tthis.dragged = false;\n\n\t\t$( \".ui-unselecting\", this.element[ 0 ] ).each( function() {\n\t\t\tvar selectee = $.data( this, \"selectable-item\" );\n\t\t\tthat._removeClass( selectee.$element, \"ui-unselecting\" );\n\t\t\tselectee.unselecting = false;\n\t\t\tselectee.startselected = false;\n\t\t\tthat._trigger( \"unselected\", event, {\n\t\t\t\tunselected: selectee.element\n\t\t\t} );\n\t\t} );\n\t\t$( \".ui-selecting\", this.element[ 0 ] ).each( function() {\n\t\t\tvar selectee = $.data( this, \"selectable-item\" );\n\t\t\tthat._removeClass( selectee.$element, \"ui-selecting\" )\n\t\t\t\t._addClass( selectee.$element, \"ui-selected\" );\n\t\t\tselectee.selecting = false;\n\t\t\tselectee.selected = true;\n\t\t\tselectee.startselected = true;\n\t\t\tthat._trigger( \"selected\", event, {\n\t\t\t\tselected: selectee.element\n\t\t\t} );\n\t\t} );\n\t\tthis._trigger( \"stop\", event );\n\n\t\tthis.helper.remove();\n\n\t\treturn false;\n\t}\n\n} );\n\n\n/*!\n * jQuery UI Sortable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Sortable\n//>>group: Interactions\n//>>description: Enables items in a list to be sorted using the mouse.\n//>>docs: http://api.jqueryui.com/sortable/\n//>>demos: http://jqueryui.com/sortable/\n//>>css.structure: ../../themes/base/sortable.css\n\n\n\nvar widgetsSortable = $.widget( \"ui.sortable\", $.ui.mouse, {\n\tversion: \"1.12.1\",\n\twidgetEventPrefix: \"sort\",\n\tready: false,\n\toptions: {\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectWith: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tdropOnEmpty: true,\n\t\tforcePlaceholderSize: false,\n\t\tforceHelperSize: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\titems: \"> *\",\n\t\topacity: false,\n\t\tplaceholder: false,\n\t\trevert: false,\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tscope: \"default\",\n\t\ttolerance: \"intersect\",\n\t\tzIndex: 1000,\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tbeforeStop: null,\n\t\tchange: null,\n\t\tdeactivate: null,\n\t\tout: null,\n\t\tover: null,\n\t\treceive: null,\n\t\tremove: null,\n\t\tsort: null,\n\t\tstart: null,\n\t\tstop: null,\n\t\tupdate: null\n\t},\n\n\t_isOverAxis: function( x, reference, size ) {\n\t\treturn ( x >= reference ) && ( x < ( reference + size ) );\n\t},\n\n\t_isFloating: function( item ) {\n\t\treturn ( /left|right/ ).test( item.css( \"float\" ) ) ||\n\t\t\t( /inline|table-cell/ ).test( item.css( \"display\" ) );\n\t},\n\n\t_create: function() {\n\t\tthis.containerCache = {};\n\t\tthis._addClass( \"ui-sortable\" );\n\n\t\t//Get the items\n\t\tthis.refresh();\n\n\t\t//Let's determine the parent's offset\n\t\tthis.offset = this.element.offset();\n\n\t\t//Initialize mouse events for interaction\n\t\tthis._mouseInit();\n\n\t\tthis._setHandleClassName();\n\n\t\t//We're ready to go\n\t\tthis.ready = true;\n\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"handle\" ) {\n\t\t\tthis._setHandleClassName();\n\t\t}\n\t},\n\n\t_setHandleClassName: function() {\n\t\tvar that = this;\n\t\tthis._removeClass( this.element.find( \".ui-sortable-handle\" ), \"ui-sortable-handle\" );\n\t\t$.each( this.items, function() {\n\t\t\tthat._addClass(\n\t\t\t\tthis.instance.options.handle ?\n\t\t\t\t\tthis.item.find( this.instance.options.handle ) :\n\t\t\t\t\tthis.item,\n\t\t\t\t\"ui-sortable-handle\"\n\t\t\t);\n\t\t} );\n\t},\n\n\t_destroy: function() {\n\t\tthis._mouseDestroy();\n\n\t\tfor ( var i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\tthis.items[ i ].item.removeData( this.widgetName + \"-item\" );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_mouseCapture: function( event, overrideHandle ) {\n\t\tvar currentItem = null,\n\t\t\tvalidHandle = false,\n\t\t\tthat = this;\n\n\t\tif ( this.reverting ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( this.options.disabled || this.options.type === \"static\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t//We have to refresh the items data once first\n\t\tthis._refreshItems( event );\n\n\t\t//Find out if the clicked node (or one of its parents) is a actual item in this.items\n\t\t$( event.target ).parents().each( function() {\n\t\t\tif ( $.data( this, that.widgetName + \"-item\" ) === that ) {\n\t\t\t\tcurrentItem = $( this );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} );\n\t\tif ( $.data( event.target, that.widgetName + \"-item\" ) === that ) {\n\t\t\tcurrentItem = $( event.target );\n\t\t}\n\n\t\tif ( !currentItem ) {\n\t\t\treturn false;\n\t\t}\n\t\tif ( this.options.handle && !overrideHandle ) {\n\t\t\t$( this.options.handle, currentItem ).find( \"*\" ).addBack().each( function() {\n\t\t\t\tif ( this === event.target ) {\n\t\t\t\t\tvalidHandle = true;\n\t\t\t\t}\n\t\t\t} );\n\t\t\tif ( !validHandle ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis.currentItem = currentItem;\n\t\tthis._removeCurrentsFromItems();\n\t\treturn true;\n\n\t},\n\n\t_mouseStart: function( event, overrideHandle, noActivation ) {\n\n\t\tvar i, body,\n\t\t\to = this.options;\n\n\t\tthis.currentContainer = this;\n\n\t\t//We only need to call refreshPositions, because the refreshItems call has been moved to\n\t\t// mouseCapture\n\t\tthis.refreshPositions();\n\n\t\t//Create and append the visible helper\n\t\tthis.helper = this._createHelper( event );\n\n\t\t//Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */\n\n\t\t//Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t//Get the next scrolling parent\n\t\tthis.scrollParent = this.helper.scrollParent();\n\n\t\t//The element's absolute position on the page minus margins\n\t\tthis.offset = this.currentItem.offset();\n\t\tthis.offset = {\n\t\t\ttop: this.offset.top - this.margins.top,\n\t\t\tleft: this.offset.left - this.margins.left\n\t\t};\n\n\t\t$.extend( this.offset, {\n\t\t\tclick: { //Where the click happened, relative to the element\n\t\t\t\tleft: event.pageX - this.offset.left,\n\t\t\t\ttop: event.pageY - this.offset.top\n\t\t\t},\n\t\t\tparent: this._getParentOffset(),\n\n\t\t\t// This is a relative to absolute position minus the actual position calculation -\n\t\t\t// only used for relative positioned helper\n\t\t\trelative: this._getRelativeOffset()\n\t\t} );\n\n\t\t// Only after we got the offset, we can change the helper's position to absolute\n\t\t// TODO: Still need to figure out a way to make relative sorting possible\n\t\tthis.helper.css( \"position\", \"absolute\" );\n\t\tthis.cssPosition = this.helper.css( \"position\" );\n\n\t\t//Generate the original position\n\t\tthis.originalPosition = this._generatePosition( event );\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\t( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );\n\n\t\t//Cache the former DOM position\n\t\tthis.domPosition = {\n\t\t\tprev: this.currentItem.prev()[ 0 ],\n\t\t\tparent: this.currentItem.parent()[ 0 ]\n\t\t};\n\n\t\t// If the helper is not the original, hide the original so it's not playing any role during\n\t\t// the drag, won't cause anything bad this way\n\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\tthis.currentItem.hide();\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthis._createPlaceholder();\n\n\t\t//Set a containment if given in the options\n\t\tif ( o.containment ) {\n\t\t\tthis._setContainment();\n\t\t}\n\n\t\tif ( o.cursor && o.cursor !== \"auto\" ) { // cursor option\n\t\t\tbody = this.document.find( \"body\" );\n\n\t\t\t// Support: IE\n\t\t\tthis.storedCursor = body.css( \"cursor\" );\n\t\t\tbody.css( \"cursor\", o.cursor );\n\n\t\t\tthis.storedStylesheet =\n\t\t\t\t$( \"<style>*{ cursor: \" + o.cursor + \" !important; }</style>\" ).appendTo( body );\n\t\t}\n\n\t\tif ( o.opacity ) { // opacity option\n\t\t\tif ( this.helper.css( \"opacity\" ) ) {\n\t\t\t\tthis._storedOpacity = this.helper.css( \"opacity\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"opacity\", o.opacity );\n\t\t}\n\n\t\tif ( o.zIndex ) { // zIndex option\n\t\t\tif ( this.helper.css( \"zIndex\" ) ) {\n\t\t\t\tthis._storedZIndex = this.helper.css( \"zIndex\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"zIndex\", o.zIndex );\n\t\t}\n\n\t\t//Prepare scrolling\n\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\t\t\tthis.overflowOffset = this.scrollParent.offset();\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"start\", event, this._uiHash() );\n\n\t\t//Recache the helper size\n\t\tif ( !this._preserveHelperProportions ) {\n\t\t\tthis._cacheHelperProportions();\n\t\t}\n\n\t\t//Post \"activate\" events to possible containers\n\t\tif ( !noActivation ) {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"activate\", event, this._uiHash( this ) );\n\t\t\t}\n\t\t}\n\n\t\t//Prepare possible droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\tif ( $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\tthis._addClass( this.helper, \"ui-sortable-helper\" );\n\n\t\t// Execute the drag once - this causes the helper not to be visiblebefore getting its\n\t\t// correct position\n\t\tthis._mouseDrag( event );\n\t\treturn true;\n\n\t},\n\n\t_mouseDrag: function( event ) {\n\t\tvar i, item, itemElement, intersection,\n\t\t\to = this.options,\n\t\t\tscrolled = false;\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition( event );\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\tif ( !this.lastPositionAbs ) {\n\t\t\tthis.lastPositionAbs = this.positionAbs;\n\t\t}\n\n\t\t//Do scrolling\n\t\tif ( this.options.scroll ) {\n\t\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\n\t\t\t\tif ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -\n\t\t\t\t\t\tevent.pageY < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t\tif ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -\n\t\t\t\t\t\tevent.pageX < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );\n\t\t\t\t} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );\n\t\t\t\t}\n\n\t\t\t\tif ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\t\tthis.document.scrollLeft() - o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\t\tthis.document.scrollLeft() + o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t\t}\n\t\t}\n\n\t\t//Regenerate the absolute position used for position checks\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\t//Set the helper position\n\t\tif ( !this.options.axis || this.options.axis !== \"y\" ) {\n\t\t\tthis.helper[ 0 ].style.left = this.position.left + \"px\";\n\t\t}\n\t\tif ( !this.options.axis || this.options.axis !== \"x\" ) {\n\t\t\tthis.helper[ 0 ].style.top = this.position.top + \"px\";\n\t\t}\n\n\t\t//Rearrange\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\n\t\t\t//Cache variables and intersection, continue if no intersection\n\t\t\titem = this.items[ i ];\n\t\t\titemElement = item.item[ 0 ];\n\t\t\tintersection = this._intersectsWithPointer( item );\n\t\t\tif ( !intersection ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Only put the placeholder inside the current Container, skip all\n\t\t\t// items from other containers. This works because when moving\n\t\t\t// an item from one container to another the\n\t\t\t// currentContainer is switched before the placeholder is moved.\n\t\t\t//\n\t\t\t// Without this, moving items in \"sub-sortables\" can cause\n\t\t\t// the placeholder to jitter between the outer and inner container.\n\t\t\tif ( item.instance !== this.currentContainer ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Cannot intersect with itself\n\t\t\t// no useless actions that have been done before\n\t\t\t// no action if the item moved is the parent of the item checked\n\t\t\tif ( itemElement !== this.currentItem[ 0 ] &&\n\t\t\t\tthis.placeholder[ intersection === 1 ? \"next\" : \"prev\" ]()[ 0 ] !== itemElement &&\n\t\t\t\t!$.contains( this.placeholder[ 0 ], itemElement ) &&\n\t\t\t\t( this.options.type === \"semi-dynamic\" ?\n\t\t\t\t\t!$.contains( this.element[ 0 ], itemElement ) :\n\t\t\t\t\ttrue\n\t\t\t\t)\n\t\t\t) {\n\n\t\t\t\tthis.direction = intersection === 1 ? \"down\" : \"up\";\n\n\t\t\t\tif ( this.options.tolerance === \"pointer\" || this._intersectsWithSides( item ) ) {\n\t\t\t\t\tthis._rearrange( event, item );\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tthis._contactContainers( event );\n\n\t\t//Interconnect with droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.drag( this, event );\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"sort\", event, this._uiHash() );\n\n\t\tthis.lastPositionAbs = this.positionAbs;\n\t\treturn false;\n\n\t},\n\n\t_mouseStop: function( event, noPropagation ) {\n\n\t\tif ( !event ) {\n\t\t\treturn;\n\t\t}\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tif ( $.ui.ddmanager && !this.options.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.drop( this, event );\n\t\t}\n\n\t\tif ( this.options.revert ) {\n\t\t\tvar that = this,\n\t\t\t\tcur = this.placeholder.offset(),\n\t\t\t\taxis = this.options.axis,\n\t\t\t\tanimation = {};\n\n\t\t\tif ( !axis || axis === \"x\" ) {\n\t\t\t\tanimation.left = cur.left - this.offset.parent.left - this.margins.left +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollLeft\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tif ( !axis || axis === \"y\" ) {\n\t\t\t\tanimation.top = cur.top - this.offset.parent.top - this.margins.top +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollTop\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tthis.reverting = true;\n\t\t\t$( this.helper ).animate(\n\t\t\t\tanimation,\n\t\t\t\tparseInt( this.options.revert, 10 ) || 500,\n\t\t\t\tfunction() {\n\t\t\t\t\tthat._clear( event );\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tthis._clear( event, noPropagation );\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tcancel: function() {\n\n\t\tif ( this.dragging ) {\n\n\t\t\tthis._mouseUp( new $.Event( \"mouseup\", { target: null } ) );\n\n\t\t\tif ( this.options.helper === \"original\" ) {\n\t\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t\t} else {\n\t\t\t\tthis.currentItem.show();\n\t\t\t}\n\n\t\t\t//Post deactivating events to containers\n\t\t\tfor ( var i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"deactivate\", null, this._uiHash( this ) );\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", null, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.placeholder ) {\n\n\t\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t\t// it unbinds ALL events from the original node!\n\t\t\tif ( this.placeholder[ 0 ].parentNode ) {\n\t\t\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\t\t\t}\n\t\t\tif ( this.options.helper !== \"original\" && this.helper &&\n\t\t\t\t\tthis.helper[ 0 ].parentNode ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\n\t\t\t$.extend( this, {\n\t\t\t\thelper: null,\n\t\t\t\tdragging: false,\n\t\t\t\treverting: false,\n\t\t\t\t_noFinalSort: null\n\t\t\t} );\n\n\t\t\tif ( this.domPosition.prev ) {\n\t\t\t\t$( this.domPosition.prev ).after( this.currentItem );\n\t\t\t} else {\n\t\t\t\t$( this.domPosition.parent ).prepend( this.currentItem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tserialize: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tstr = [];\n\t\to = o || {};\n\n\t\t$( items ).each( function() {\n\t\t\tvar res = ( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" )\n\t\t\t\t.match( o.expression || ( /(.+)[\\-=_](.+)/ ) );\n\t\t\tif ( res ) {\n\t\t\t\tstr.push(\n\t\t\t\t\t( o.key || res[ 1 ] + \"[]\" ) +\n\t\t\t\t\t\"=\" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );\n\t\t\t}\n\t\t} );\n\n\t\tif ( !str.length && o.key ) {\n\t\t\tstr.push( o.key + \"=\" );\n\t\t}\n\n\t\treturn str.join( \"&\" );\n\n\t},\n\n\ttoArray: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tret = [];\n\n\t\to = o || {};\n\n\t\titems.each( function() {\n\t\t\tret.push( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" );\n\t\t} );\n\t\treturn ret;\n\n\t},\n\n\t/* Be careful with the following core functions */\n\t_intersectsWith: function( item ) {\n\n\t\tvar x1 = this.positionAbs.left,\n\t\t\tx2 = x1 + this.helperProportions.width,\n\t\t\ty1 = this.positionAbs.top,\n\t\t\ty2 = y1 + this.helperProportions.height,\n\t\t\tl = item.left,\n\t\t\tr = l + item.width,\n\t\t\tt = item.top,\n\t\t\tb = t + item.height,\n\t\t\tdyClick = this.offset.click.top,\n\t\t\tdxClick = this.offset.click.left,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) || ( ( y1 + dyClick ) > t &&\n\t\t\t\t( y1 + dyClick ) < b ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) || ( ( x1 + dxClick ) > l &&\n\t\t\t\t( x1 + dxClick ) < r ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( this.options.tolerance === \"pointer\" ||\n\t\t\tthis.options.forcePointerForContainers ||\n\t\t\t( this.options.tolerance !== \"pointer\" &&\n\t\t\t\tthis.helperProportions[ this.floating ? \"width\" : \"height\" ] >\n\t\t\t\titem[ this.floating ? \"width\" : \"height\" ] )\n\t\t) {\n\t\t\treturn isOverElement;\n\t\t} else {\n\n\t\t\treturn ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half\n\t\t\t\tx2 - ( this.helperProportions.width / 2 ) < r && // Left Half\n\t\t\t\tt < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half\n\t\t\t\ty2 - ( this.helperProportions.height / 2 ) < b ); // Top Half\n\n\t\t}\n\t},\n\n\t_intersectsWithPointer: function( item ) {\n\t\tvar verticalDirection, horizontalDirection,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.top + this.offset.click.top, item.top, item.height ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.left + this.offset.click.left, item.left, item.width ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( !isOverElement ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tverticalDirection = this._getDragVerticalDirection();\n\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\treturn this.floating ?\n\t\t\t( ( horizontalDirection === \"right\" || verticalDirection === \"down\" ) ? 2 : 1 )\n\t\t\t: ( verticalDirection && ( verticalDirection === \"down\" ? 2 : 1 ) );\n\n\t},\n\n\t_intersectsWithSides: function( item ) {\n\n\t\tvar isOverBottomHalf = this._isOverAxis( this.positionAbs.top +\n\t\t\t\tthis.offset.click.top, item.top + ( item.height / 2 ), item.height ),\n\t\t\tisOverRightHalf = this._isOverAxis( this.positionAbs.left +\n\t\t\t\tthis.offset.click.left, item.left + ( item.width / 2 ), item.width ),\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif ( this.floating && horizontalDirection ) {\n\t\t\treturn ( ( horizontalDirection === \"right\" && isOverRightHalf ) ||\n\t\t\t\t( horizontalDirection === \"left\" && !isOverRightHalf ) );\n\t\t} else {\n\t\t\treturn verticalDirection && ( ( verticalDirection === \"down\" && isOverBottomHalf ) ||\n\t\t\t\t( verticalDirection === \"up\" && !isOverBottomHalf ) );\n\t\t}\n\n\t},\n\n\t_getDragVerticalDirection: function() {\n\t\tvar delta = this.positionAbs.top - this.lastPositionAbs.top;\n\t\treturn delta !== 0 && ( delta > 0 ? \"down\" : \"up\" );\n\t},\n\n\t_getDragHorizontalDirection: function() {\n\t\tvar delta = this.positionAbs.left - this.lastPositionAbs.left;\n\t\treturn delta !== 0 && ( delta > 0 ? \"right\" : \"left\" );\n\t},\n\n\trefresh: function( event ) {\n\t\tthis._refreshItems( event );\n\t\tthis._setHandleClassName();\n\t\tthis.refreshPositions();\n\t\treturn this;\n\t},\n\n\t_connectWith: function() {\n\t\tvar options = this.options;\n\t\treturn options.connectWith.constructor === String ?\n\t\t\t[ options.connectWith ] :\n\t\t\toptions.connectWith;\n\t},\n\n\t_getItemsAsjQuery: function( connected ) {\n\n\t\tvar i, j, cur, inst,\n\t\t\titems = [],\n\t\t\tqueries = [],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif ( connectWith && connected ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ $.isFunction( inst.options.items ) ?\n\t\t\t\t\t\t\tinst.options.items.call( inst.element ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-placeholder\" ), inst ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tqueries.push( [ $.isFunction( this.options.items ) ?\n\t\t\tthis.options.items\n\t\t\t\t.call( this.element, null, { options: this.options, item: this.currentItem } ) :\n\t\t\t$( this.options.items, this.element )\n\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t.not( \".ui-sortable-placeholder\" ), this ] );\n\n\t\tfunction addItems() {\n\t\t\titems.push( this );\n\t\t}\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\tqueries[ i ][ 0 ].each( addItems );\n\t\t}\n\n\t\treturn $( items );\n\n\t},\n\n\t_removeCurrentsFromItems: function() {\n\n\t\tvar list = this.currentItem.find( \":data(\" + this.widgetName + \"-item)\" );\n\n\t\tthis.items = $.grep( this.items, function( item ) {\n\t\t\tfor ( var j = 0; j < list.length; j++ ) {\n\t\t\t\tif ( list[ j ] === item.item[ 0 ] ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} );\n\n\t},\n\n\t_refreshItems: function( event ) {\n\n\t\tthis.items = [];\n\t\tthis.containers = [ this ];\n\n\t\tvar i, j, cur, inst, targetData, _queries, item, queriesLength,\n\t\t\titems = this.items,\n\t\t\tqueries = [ [ $.isFunction( this.options.items ) ?\n\t\t\t\tthis.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t$( this.options.items, this.element ), this ] ],\n\t\t\tconnectWith = this._connectWith();\n\n\t\t//Shouldn't be run the first time through due to massive slow-down\n\t\tif ( connectWith && this.ready ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ $.isFunction( inst.options.items ) ?\n\t\t\t\t\t\t\tinst.options.items\n\t\t\t\t\t\t\t\t.call( inst.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element ), inst ] );\n\t\t\t\t\t\tthis.containers.push( inst );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\ttargetData = queries[ i ][ 1 ];\n\t\t\t_queries = queries[ i ][ 0 ];\n\n\t\t\tfor ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {\n\t\t\t\titem = $( _queries[ j ] );\n\n\t\t\t\t// Data for target checking (mouse manager)\n\t\t\t\titem.data( this.widgetName + \"-item\", targetData );\n\n\t\t\t\titems.push( {\n\t\t\t\t\titem: item,\n\t\t\t\t\tinstance: targetData,\n\t\t\t\t\twidth: 0, height: 0,\n\t\t\t\t\tleft: 0, top: 0\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t},\n\n\trefreshPositions: function( fast ) {\n\n\t\t// Determine whether items are being displayed horizontally\n\t\tthis.floating = this.items.length ?\n\t\t\tthis.options.axis === \"x\" || this._isFloating( this.items[ 0 ].item ) :\n\t\t\tfalse;\n\n\t\t//This has to be redone because due to the item being moved out/into the offsetParent,\n\t\t// the offsetParent's position will change\n\t\tif ( this.offsetParent && this.helper ) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\tvar i, item, t, p;\n\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\titem = this.items[ i ];\n\n\t\t\t//We ignore calculating positions of all connected containers when we're not over them\n\t\t\tif ( item.instance !== this.currentContainer && this.currentContainer &&\n\t\t\t\t\titem.item[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tt = this.options.toleranceElement ?\n\t\t\t\t$( this.options.toleranceElement, item.item ) :\n\t\t\t\titem.item;\n\n\t\t\tif ( !fast ) {\n\t\t\t\titem.width = t.outerWidth();\n\t\t\t\titem.height = t.outerHeight();\n\t\t\t}\n\n\t\t\tp = t.offset();\n\t\t\titem.left = p.left;\n\t\t\titem.top = p.top;\n\t\t}\n\n\t\tif ( this.options.custom && this.options.custom.refreshContainers ) {\n\t\t\tthis.options.custom.refreshContainers.call( this );\n\t\t} else {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tp = this.containers[ i ].element.offset();\n\t\t\t\tthis.containers[ i ].containerCache.left = p.left;\n\t\t\t\tthis.containers[ i ].containerCache.top = p.top;\n\t\t\t\tthis.containers[ i ].containerCache.width =\n\t\t\t\t\tthis.containers[ i ].element.outerWidth();\n\t\t\t\tthis.containers[ i ].containerCache.height =\n\t\t\t\t\tthis.containers[ i ].element.outerHeight();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_createPlaceholder: function( that ) {\n\t\tthat = that || this;\n\t\tvar className,\n\t\t\to = that.options;\n\n\t\tif ( !o.placeholder || o.placeholder.constructor === String ) {\n\t\t\tclassName = o.placeholder;\n\t\t\to.placeholder = {\n\t\t\t\telement: function() {\n\n\t\t\t\t\tvar nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(),\n\t\t\t\t\t\telement = $( \"<\" + nodeName + \">\", that.document[ 0 ] );\n\n\t\t\t\t\t\tthat._addClass( element, \"ui-sortable-placeholder\",\n\t\t\t\t\t\t\t\tclassName || that.currentItem[ 0 ].className )\n\t\t\t\t\t\t\t._removeClass( element, \"ui-sortable-helper\" );\n\n\t\t\t\t\tif ( nodeName === \"tbody\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder(\n\t\t\t\t\t\t\tthat.currentItem.find( \"tr\" ).eq( 0 ),\n\t\t\t\t\t\t\t$( \"<tr>\", that.document[ 0 ] ).appendTo( element )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if ( nodeName === \"tr\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder( that.currentItem, element );\n\t\t\t\t\t} else if ( nodeName === \"img\" ) {\n\t\t\t\t\t\telement.attr( \"src\", that.currentItem.attr( \"src\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !className ) {\n\t\t\t\t\t\telement.css( \"visibility\", \"hidden\" );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\t\t\t\tupdate: function( container, p ) {\n\n\t\t\t\t\t// 1. If a className is set as 'placeholder option, we don't force sizes -\n\t\t\t\t\t// the class is responsible for that\n\t\t\t\t\t// 2. The option 'forcePlaceholderSize can be enabled to force it even if a\n\t\t\t\t\t// class name is specified\n\t\t\t\t\tif ( className && !o.forcePlaceholderSize ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t//If the element doesn't have a actual height by itself (without styles coming\n\t\t\t\t\t// from a stylesheet), it receives the inline height from the dragged item\n\t\t\t\t\tif ( !p.height() ) {\n\t\t\t\t\t\tp.height(\n\t\t\t\t\t\t\tthat.currentItem.innerHeight() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingTop\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingBottom\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t\tif ( !p.width() ) {\n\t\t\t\t\t\tp.width(\n\t\t\t\t\t\t\tthat.currentItem.innerWidth() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingLeft\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingRight\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthat.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );\n\n\t\t//Append it after the actual current item\n\t\tthat.currentItem.after( that.placeholder );\n\n\t\t//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)\n\t\to.placeholder.update( that, that.placeholder );\n\n\t},\n\n\t_createTrPlaceholder: function( sourceTr, targetTr ) {\n\t\tvar that = this;\n\n\t\tsourceTr.children().each( function() {\n\t\t\t$( \"<td>&#160;</td>\", that.document[ 0 ] )\n\t\t\t\t.attr( \"colspan\", $( this ).attr( \"colspan\" ) || 1 )\n\t\t\t\t.appendTo( targetTr );\n\t\t} );\n\t},\n\n\t_contactContainers: function( event ) {\n\t\tvar i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,\n\t\t\tfloating, axis,\n\t\t\tinnermostContainer = null,\n\t\t\tinnermostIndex = null;\n\n\t\t// Get innermost container that intersects with item\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\n\t\t\t// Never consider a container that's located within the item itself\n\t\t\tif ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( this._intersectsWith( this.containers[ i ].containerCache ) ) {\n\n\t\t\t\t// If we've already found a container and it's more \"inner\" than this, then continue\n\t\t\t\tif ( innermostContainer &&\n\t\t\t\t\t\t$.contains(\n\t\t\t\t\t\t\tthis.containers[ i ].element[ 0 ],\n\t\t\t\t\t\t\tinnermostContainer.element[ 0 ] ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tinnermostContainer = this.containers[ i ];\n\t\t\t\tinnermostIndex = i;\n\n\t\t\t} else {\n\n\t\t\t\t// container doesn't intersect. trigger \"out\" event if necessary\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", event, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t// If no intersecting containers found, return\n\t\tif ( !innermostContainer ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Move the item into the container if it's not there already\n\t\tif ( this.containers.length === 1 ) {\n\t\t\tif ( !this.containers[ innermostIndex ].containerCache.over ) {\n\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t\t}\n\t\t} else {\n\n\t\t\t// When entering a new container, we will find the item with the least distance and\n\t\t\t// append our item near it\n\t\t\tdist = 10000;\n\t\t\titemWithLeastDistance = null;\n\t\t\tfloating = innermostContainer.floating || this._isFloating( this.currentItem );\n\t\t\tposProperty = floating ? \"left\" : \"top\";\n\t\t\tsizeProperty = floating ? \"width\" : \"height\";\n\t\t\taxis = floating ? \"pageX\" : \"pageY\";\n\n\t\t\tfor ( j = this.items.length - 1; j >= 0; j-- ) {\n\t\t\t\tif ( !$.contains(\n\t\t\t\t\t\tthis.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcur = this.items[ j ].item.offset()[ posProperty ];\n\t\t\t\tnearBottom = false;\n\t\t\t\tif ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {\n\t\t\t\t\tnearBottom = true;\n\t\t\t\t}\n\n\t\t\t\tif ( Math.abs( event[ axis ] - cur ) < dist ) {\n\t\t\t\t\tdist = Math.abs( event[ axis ] - cur );\n\t\t\t\t\titemWithLeastDistance = this.items[ j ];\n\t\t\t\t\tthis.direction = nearBottom ? \"up\" : \"down\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Check if dropOnEmpty is enabled\n\t\t\tif ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.currentContainer === this.containers[ innermostIndex ] ) {\n\t\t\t\tif ( !this.currentContainer.containerCache.over ) {\n\t\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash() );\n\t\t\t\t\tthis.currentContainer.containerCache.over = 1;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\titemWithLeastDistance ?\n\t\t\t\tthis._rearrange( event, itemWithLeastDistance, null, true ) :\n\t\t\t\tthis._rearrange( event, null, this.containers[ innermostIndex ].element, true );\n\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"change\", event, this._uiHash( this ) );\n\t\t\tthis.currentContainer = this.containers[ innermostIndex ];\n\n\t\t\t//Update the placeholder\n\t\t\tthis.options.placeholder.update( this.currentContainer, this.placeholder );\n\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t}\n\n\t},\n\n\t_createHelper: function( event ) {\n\n\t\tvar o = this.options,\n\t\t\thelper = $.isFunction( o.helper ) ?\n\t\t\t\t$( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :\n\t\t\t\t( o.helper === \"clone\" ? this.currentItem.clone() : this.currentItem );\n\n\t\t//Add the helper to the DOM if that didn't happen already\n\t\tif ( !helper.parents( \"body\" ).length ) {\n\t\t\t$( o.appendTo !== \"parent\" ?\n\t\t\t\to.appendTo :\n\t\t\t\tthis.currentItem[ 0 ].parentNode )[ 0 ].appendChild( helper[ 0 ] );\n\t\t}\n\n\t\tif ( helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tthis._storedCSS = {\n\t\t\t\twidth: this.currentItem[ 0 ].style.width,\n\t\t\t\theight: this.currentItem[ 0 ].style.height,\n\t\t\t\tposition: this.currentItem.css( \"position\" ),\n\t\t\t\ttop: this.currentItem.css( \"top\" ),\n\t\t\t\tleft: this.currentItem.css( \"left\" )\n\t\t\t};\n\t\t}\n\n\t\tif ( !helper[ 0 ].style.width || o.forceHelperSize ) {\n\t\t\thelper.width( this.currentItem.width() );\n\t\t}\n\t\tif ( !helper[ 0 ].style.height || o.forceHelperSize ) {\n\t\t\thelper.height( this.currentItem.height() );\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_adjustOffsetFromHelper: function( obj ) {\n\t\tif ( typeof obj === \"string\" ) {\n\t\t\tobj = obj.split( \" \" );\n\t\t}\n\t\tif ( $.isArray( obj ) ) {\n\t\t\tobj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };\n\t\t}\n\t\tif ( \"left\" in obj ) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif ( \"right\" in obj ) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif ( \"top\" in obj ) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif ( \"bottom\" in obj ) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t//Get the offsetParent and cache its position\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tvar po = this.offsetParent.offset();\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the\n\t\t// following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the\n\t\t// next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't\n\t\t// the document, which means that the scroll is included in the initial calculation of the\n\t\t// offset of the parent, and never recalculated upon drag\n\t\tif ( this.cssPosition === \"absolute\" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\t// This needs to be actually done for all browsers, since pageX/pageY includes this\n\t\t// information with an ugly IE fix\n\t\tif ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||\n\t\t\t\t( this.offsetParent[ 0 ].tagName &&\n\t\t\t\tthis.offsetParent[ 0 ].tagName.toLowerCase() === \"html\" && $.ui.ie ) ) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + ( parseInt( this.offsetParent.css( \"borderTopWidth\" ), 10 ) || 0 ),\n\t\t\tleft: po.left + ( parseInt( this.offsetParent.css( \"borderLeftWidth\" ), 10 ) || 0 )\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\n\t\tif ( this.cssPosition === \"relative\" ) {\n\t\t\tvar p = this.currentItem.position();\n\t\t\treturn {\n\t\t\t\ttop: p.top - ( parseInt( this.helper.css( \"top\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollTop(),\n\t\t\t\tleft: p.left - ( parseInt( this.helper.css( \"left\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollLeft()\n\t\t\t};\n\t\t} else {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: ( parseInt( this.currentItem.css( \"marginLeft\" ), 10 ) || 0 ),\n\t\t\ttop: ( parseInt( this.currentItem.css( \"marginTop\" ), 10 ) || 0 )\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar ce, co, over,\n\t\t\to = this.options;\n\t\tif ( o.containment === \"parent\" ) {\n\t\t\to.containment = this.helper[ 0 ].parentNode;\n\t\t}\n\t\tif ( o.containment === \"document\" || o.containment === \"window\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t0 - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t0 - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\to.containment === \"document\" ?\n\t\t\t\t\tthis.document.width() :\n\t\t\t\t\tthis.window.width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t( o.containment === \"document\" ?\n\t\t\t\t\t( this.document.height() || document.body.parentNode.scrollHeight ) :\n\t\t\t\t\tthis.window.height() || this.document[ 0 ].body.parentNode.scrollHeight\n\t\t\t\t) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t\tif ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {\n\t\t\tce = $( o.containment )[ 0 ];\n\t\t\tco = $( o.containment ).offset();\n\t\t\tover = ( $( ce ).css( \"overflow\" ) !== \"hidden\" );\n\n\t\t\tthis.containment = [\n\t\t\t\tco.left + ( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingLeft\" ), 10 ) || 0 ) - this.margins.left,\n\t\t\t\tco.top + ( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingTop\" ), 10 ) || 0 ) - this.margins.top,\n\t\t\t\tco.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingRight\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.width - this.margins.left,\n\t\t\t\tco.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingBottom\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t},\n\n\t_convertPositionTo: function( d, pos ) {\n\n\t\tif ( !pos ) {\n\t\t\tpos = this.position;\n\t\t}\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.top\t+\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top * mod -\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.left +\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left * mod\t-\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :\n\t\t\t\t\tscroll.scrollLeft() ) * mod )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function( event ) {\n\n\t\tvar top, left,\n\t\t\to = this.options,\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\t// This is another very weird special case that only happens for relative elements:\n\t\t// 1. If the css position is relative\n\t\t// 2. and the scroll parent is the document or similar to the offset parent\n\t\t// we have to refresh the relative offset during the scroll so there are no jumps\n\t\tif ( this.cssPosition === \"relative\" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {\n\t\t\tthis.offset.relative = this._getRelativeOffset();\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\tif ( this.originalPosition ) { //If we are not dragging yet, we won't check for options\n\n\t\t\tif ( this.containment ) {\n\t\t\t\tif ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {\n\t\t\t\t\tpageX = this.containment[ 0 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {\n\t\t\t\t\tpageY = this.containment[ 1 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {\n\t\t\t\t\tpageX = this.containment[ 2 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {\n\t\t\t\t\tpageY = this.containment[ 3 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( o.grid ) {\n\t\t\t\ttop = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /\n\t\t\t\t\to.grid[ 1 ] ) * o.grid[ 1 ];\n\t\t\t\tpageY = this.containment ?\n\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] &&\n\t\t\t\t\t\ttop - this.offset.click.top <= this.containment[ 3 ] ) ?\n\t\t\t\t\t\t\ttop :\n\t\t\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?\n\t\t\t\t\t\t\t\ttop - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :\n\t\t\t\t\t\t\t\ttop;\n\n\t\t\t\tleft = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /\n\t\t\t\t\to.grid[ 0 ] ) * o.grid[ 0 ];\n\t\t\t\tpageX = this.containment ?\n\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] &&\n\t\t\t\t\t\tleft - this.offset.click.left <= this.containment[ 2 ] ) ?\n\t\t\t\t\t\t\tleft :\n\t\t\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?\n\t\t\t\t\t\t\t\tleft - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :\n\t\t\t\t\t\t\t\tleft;\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageY -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.top -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageX -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.left -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() :\n\t\t\t\t\tscrollIsRootNode ? 0 : scroll.scrollLeft() ) )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_rearrange: function( event, i, a, hardRefresh ) {\n\n\t\ta ? a[ 0 ].appendChild( this.placeholder[ 0 ] ) :\n\t\t\ti.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],\n\t\t\t\t( this.direction === \"down\" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );\n\n\t\t//Various things done here to improve the performance:\n\t\t// 1. we create a setTimeout, that calls refreshPositions\n\t\t// 2. on the instance, we have a counter variable, that get's higher after every append\n\t\t// 3. on the local scope, we copy the counter variable, and check in the timeout,\n\t\t// if it's still the same\n\t\t// 4. this lets only the last addition to the timeout stack through\n\t\tthis.counter = this.counter ? ++this.counter : 1;\n\t\tvar counter = this.counter;\n\n\t\tthis._delay( function() {\n\t\t\tif ( counter === this.counter ) {\n\n\t\t\t\t//Precompute after each DOM insertion, NOT on mousemove\n\t\t\t\tthis.refreshPositions( !hardRefresh );\n\t\t\t}\n\t\t} );\n\n\t},\n\n\t_clear: function( event, noPropagation ) {\n\n\t\tthis.reverting = false;\n\n\t\t// We delay all events that have to be triggered to after the point where the placeholder\n\t\t// has been removed and everything else normalized again\n\t\tvar i,\n\t\t\tdelayedTriggers = [];\n\n\t\t// We first have to update the dom position of the actual currentItem\n\t\t// Note: don't do it if the current item is already removed (by a user), or it gets\n\t\t// reappended (see #4088)\n\t\tif ( !this._noFinalSort && this.currentItem.parent().length ) {\n\t\t\tthis.placeholder.before( this.currentItem );\n\t\t}\n\t\tthis._noFinalSort = null;\n\n\t\tif ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tfor ( i in this._storedCSS ) {\n\t\t\t\tif ( this._storedCSS[ i ] === \"auto\" || this._storedCSS[ i ] === \"static\" ) {\n\t\t\t\t\tthis._storedCSS[ i ] = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t} else {\n\t\t\tthis.currentItem.show();\n\t\t}\n\n\t\tif ( this.fromOutside && !noPropagation ) {\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"receive\", event, this._uiHash( this.fromOutside ) );\n\t\t\t} );\n\t\t}\n\t\tif ( ( this.fromOutside ||\n\t\t\t\tthis.domPosition.prev !==\n\t\t\t\tthis.currentItem.prev().not( \".ui-sortable-helper\" )[ 0 ] ||\n\t\t\t\tthis.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {\n\n\t\t\t// Trigger update callback if the DOM position has changed\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"update\", event, this._uiHash() );\n\t\t\t} );\n\t\t}\n\n\t\t// Check if the items Container has Changed and trigger appropriate\n\t\t// events.\n\t\tif ( this !== this.currentContainer ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\t\tthis._trigger( \"remove\", event, this._uiHash() );\n\t\t\t\t} );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"receive\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"update\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tfunction delayEvent( type, instance, container ) {\n\t\t\treturn function( event ) {\n\t\t\t\tcontainer._trigger( type, event, instance._uiHash( instance ) );\n\t\t\t};\n\t\t}\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"deactivate\", this, this.containers[ i ] ) );\n\t\t\t}\n\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"out\", this, this.containers[ i ] ) );\n\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t}\n\t\t}\n\n\t\t//Do what was originally in plugins\n\t\tif ( this.storedCursor ) {\n\t\t\tthis.document.find( \"body\" ).css( \"cursor\", this.storedCursor );\n\t\t\tthis.storedStylesheet.remove();\n\t\t}\n\t\tif ( this._storedOpacity ) {\n\t\t\tthis.helper.css( \"opacity\", this._storedOpacity );\n\t\t}\n\t\tif ( this._storedZIndex ) {\n\t\t\tthis.helper.css( \"zIndex\", this._storedZIndex === \"auto\" ? \"\" : this._storedZIndex );\n\t\t}\n\n\t\tthis.dragging = false;\n\n\t\tif ( !noPropagation ) {\n\t\t\tthis._trigger( \"beforeStop\", event, this._uiHash() );\n\t\t}\n\n\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t// it unbinds ALL events from the original node!\n\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\n\t\tif ( !this.cancelHelperRemoval ) {\n\t\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\t\t\tthis.helper = null;\n\t\t}\n\n\t\tif ( !noPropagation ) {\n\t\t\tfor ( i = 0; i < delayedTriggers.length; i++ ) {\n\n\t\t\t\t// Trigger all delayed events\n\t\t\t\tdelayedTriggers[ i ].call( this, event );\n\t\t\t}\n\t\t\tthis._trigger( \"stop\", event, this._uiHash() );\n\t\t}\n\n\t\tthis.fromOutside = false;\n\t\treturn !this.cancelHelperRemoval;\n\n\t},\n\n\t_trigger: function() {\n\t\tif ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {\n\t\t\tthis.cancel();\n\t\t}\n\t},\n\n\t_uiHash: function( _inst ) {\n\t\tvar inst = _inst || this;\n\t\treturn {\n\t\t\thelper: inst.helper,\n\t\t\tplaceholder: inst.placeholder || $( [] ),\n\t\t\tposition: inst.position,\n\t\t\toriginalPosition: inst.originalPosition,\n\t\t\toffset: inst.positionAbs,\n\t\t\titem: inst.currentItem,\n\t\t\tsender: _inst ? _inst.element : null\n\t\t};\n\t}\n\n} );\n\n\n/*!\n * jQuery UI Accordion 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Accordion\n//>>group: Widgets\n// jscs:disable maximumLineLength\n//>>description: Displays collapsible content panels for presenting information in a limited amount of space.\n// jscs:enable maximumLineLength\n//>>docs: http://api.jqueryui.com/accordion/\n//>>demos: http://jqueryui.com/accordion/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/accordion.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\nvar widgetsAccordion = $.widget( \"ui.accordion\", {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tactive: 0,\n\t\tanimate: {},\n\t\tclasses: {\n\t\t\t\"ui-accordion-header\": \"ui-corner-top\",\n\t\t\t\"ui-accordion-header-collapsed\": \"ui-corner-all\",\n\t\t\t\"ui-accordion-content\": \"ui-corner-bottom\"\n\t\t},\n\t\tcollapsible: false,\n\t\tevent: \"click\",\n\t\theader: \"> li > :first-child, > :not(li):even\",\n\t\theightStyle: \"auto\",\n\t\ticons: {\n\t\t\tactiveHeader: \"ui-icon-triangle-1-s\",\n\t\t\theader: \"ui-icon-triangle-1-e\"\n\t\t},\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tbeforeActivate: null\n\t},\n\n\thideProps: {\n\t\tborderTopWidth: \"hide\",\n\t\tborderBottomWidth: \"hide\",\n\t\tpaddingTop: \"hide\",\n\t\tpaddingBottom: \"hide\",\n\t\theight: \"hide\"\n\t},\n\n\tshowProps: {\n\t\tborderTopWidth: \"show\",\n\t\tborderBottomWidth: \"show\",\n\t\tpaddingTop: \"show\",\n\t\tpaddingBottom: \"show\",\n\t\theight: \"show\"\n\t},\n\n\t_create: function() {\n\t\tvar options = this.options;\n\n\t\tthis.prevShow = this.prevHide = $();\n\t\tthis._addClass( \"ui-accordion\", \"ui-widget ui-helper-reset\" );\n\t\tthis.element.attr( \"role\", \"tablist\" );\n\n\t\t// Don't allow collapsible: false and active: false / null\n\t\tif ( !options.collapsible && ( options.active === false || options.active == null ) ) {\n\t\t\toptions.active = 0;\n\t\t}\n\n\t\tthis._processPanels();\n\n\t\t// handle negative values\n\t\tif ( options.active < 0 ) {\n\t\t\toptions.active += this.headers.length;\n\t\t}\n\t\tthis._refresh();\n\t},\n\n\t_getCreateEventData: function() {\n\t\treturn {\n\t\t\theader: this.active,\n\t\t\tpanel: !this.active.length ? $() : this.active.next()\n\t\t};\n\t},\n\n\t_createIcons: function() {\n\t\tvar icon, children,\n\t\t\ticons = this.options.icons;\n\n\t\tif ( icons ) {\n\t\t\ticon = $( \"<span>\" );\n\t\t\tthis._addClass( icon, \"ui-accordion-header-icon\", \"ui-icon \" + icons.header );\n\t\t\ticon.prependTo( this.headers );\n\t\t\tchildren = this.active.children( \".ui-accordion-header-icon\" );\n\t\t\tthis._removeClass( children, icons.header )\n\t\t\t\t._addClass( children, null, icons.activeHeader )\n\t\t\t\t._addClass( this.headers, \"ui-accordion-icons\" );\n\t\t}\n\t},\n\n\t_destroyIcons: function() {\n\t\tthis._removeClass( this.headers, \"ui-accordion-icons\" );\n\t\tthis.headers.children( \".ui-accordion-header-icon\" ).remove();\n\t},\n\n\t_destroy: function() {\n\t\tvar contents;\n\n\t\t// Clean up main element\n\t\tthis.element.removeAttr( \"role\" );\n\n\t\t// Clean up headers\n\t\tthis.headers\n\t\t\t.removeAttr( \"role aria-expanded aria-selected aria-controls tabIndex\" )\n\t\t\t.removeUniqueId();\n\n\t\tthis._destroyIcons();\n\n\t\t// Clean up content panels\n\t\tcontents = this.headers.next()\n\t\t\t.css( \"display\", \"\" )\n\t\t\t.removeAttr( \"role aria-hidden aria-labelledby\" )\n\t\t\t.removeUniqueId();\n\n\t\tif ( this.options.heightStyle !== \"content\" ) {\n\t\t\tcontents.css( \"height\", \"\" );\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"active\" ) {\n\n\t\t\t// _activate() will handle invalid values and update this.options\n\t\t\tthis._activate( value );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"event\" ) {\n\t\t\tif ( this.options.event ) {\n\t\t\t\tthis._off( this.headers, this.options.event );\n\t\t\t}\n\t\t\tthis._setupEvents( value );\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\t// Setting collapsible: false while collapsed; open first panel\n\t\tif ( key === \"collapsible\" && !value && this.options.active === false ) {\n\t\t\tthis._activate( 0 );\n\t\t}\n\n\t\tif ( key === \"icons\" ) {\n\t\t\tthis._destroyIcons();\n\t\t\tif ( value ) {\n\t\t\t\tthis._createIcons();\n\t\t\t}\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis.element.attr( \"aria-disabled\", value );\n\n\t\t// Support: IE8 Only\n\t\t// #5332 / #6059 - opacity doesn't cascade to positioned elements in IE\n\t\t// so we need to add the disabled class to the headers and panels\n\t\tthis._toggleClass( null, \"ui-state-disabled\", !!value );\n\t\tthis._toggleClass( this.headers.add( this.headers.next() ), null, \"ui-state-disabled\",\n\t\t\t!!value );\n\t},\n\n\t_keydown: function( event ) {\n\t\tif ( event.altKey || event.ctrlKey ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar keyCode = $.ui.keyCode,\n\t\t\tlength = this.headers.length,\n\t\t\tcurrentIndex = this.headers.index( event.target ),\n\t\t\ttoFocus = false;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase keyCode.RIGHT:\n\t\tcase keyCode.DOWN:\n\t\t\ttoFocus = this.headers[ ( currentIndex + 1 ) % length ];\n\t\t\tbreak;\n\t\tcase keyCode.LEFT:\n\t\tcase keyCode.UP:\n\t\t\ttoFocus = this.headers[ ( currentIndex - 1 + length ) % length ];\n\t\t\tbreak;\n\t\tcase keyCode.SPACE:\n\t\tcase keyCode.ENTER:\n\t\t\tthis._eventHandler( event );\n\t\t\tbreak;\n\t\tcase keyCode.HOME:\n\t\t\ttoFocus = this.headers[ 0 ];\n\t\t\tbreak;\n\t\tcase keyCode.END:\n\t\t\ttoFocus = this.headers[ length - 1 ];\n\t\t\tbreak;\n\t\t}\n\n\t\tif ( toFocus ) {\n\t\t\t$( event.target ).attr( \"tabIndex\", -1 );\n\t\t\t$( toFocus ).attr( \"tabIndex\", 0 );\n\t\t\t$( toFocus ).trigger( \"focus\" );\n\t\t\tevent.preventDefault();\n\t\t}\n\t},\n\n\t_panelKeyDown: function( event ) {\n\t\tif ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {\n\t\t\t$( event.currentTarget ).prev().trigger( \"focus\" );\n\t\t}\n\t},\n\n\trefresh: function() {\n\t\tvar options = this.options;\n\t\tthis._processPanels();\n\n\t\t// Was collapsed or no panel\n\t\tif ( ( options.active === false && options.collapsible === true ) ||\n\t\t\t\t!this.headers.length ) {\n\t\t\toptions.active = false;\n\t\t\tthis.active = $();\n\n\t\t// active false only when collapsible is true\n\t\t} else if ( options.active === false ) {\n\t\t\tthis._activate( 0 );\n\n\t\t// was active, but active panel is gone\n\t\t} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {\n\n\t\t\t// all remaining panel are disabled\n\t\t\tif ( this.headers.length === this.headers.find( \".ui-state-disabled\" ).length ) {\n\t\t\t\toptions.active = false;\n\t\t\t\tthis.active = $();\n\n\t\t\t// activate previous panel\n\t\t\t} else {\n\t\t\t\tthis._activate( Math.max( 0, options.active - 1 ) );\n\t\t\t}\n\n\t\t// was active, active panel still exists\n\t\t} else {\n\n\t\t\t// make sure active index is correct\n\t\t\toptions.active = this.headers.index( this.active );\n\t\t}\n\n\t\tthis._destroyIcons();\n\n\t\tthis._refresh();\n\t},\n\n\t_processPanels: function() {\n\t\tvar prevHeaders = this.headers,\n\t\t\tprevPanels = this.panels;\n\n\t\tthis.headers = this.element.find( this.options.header );\n\t\tthis._addClass( this.headers, \"ui-accordion-header ui-accordion-header-collapsed\",\n\t\t\t\"ui-state-default\" );\n\n\t\tthis.panels = this.headers.next().filter( \":not(.ui-accordion-content-active)\" ).hide();\n\t\tthis._addClass( this.panels, \"ui-accordion-content\", \"ui-helper-reset ui-widget-content\" );\n\n\t\t// Avoid memory leaks (#10056)\n\t\tif ( prevPanels ) {\n\t\t\tthis._off( prevHeaders.not( this.headers ) );\n\t\t\tthis._off( prevPanels.not( this.panels ) );\n\t\t}\n\t},\n\n\t_refresh: function() {\n\t\tvar maxHeight,\n\t\t\toptions = this.options,\n\t\t\theightStyle = options.heightStyle,\n\t\t\tparent = this.element.parent();\n\n\t\tthis.active = this._findActive( options.active );\n\t\tthis._addClass( this.active, \"ui-accordion-header-active\", \"ui-state-active\" )\n\t\t\t._removeClass( this.active, \"ui-accordion-header-collapsed\" );\n\t\tthis._addClass( this.active.next(), \"ui-accordion-content-active\" );\n\t\tthis.active.next().show();\n\n\t\tthis.headers\n\t\t\t.attr( \"role\", \"tab\" )\n\t\t\t.each( function() {\n\t\t\t\tvar header = $( this ),\n\t\t\t\t\theaderId = header.uniqueId().attr( \"id\" ),\n\t\t\t\t\tpanel = header.next(),\n\t\t\t\t\tpanelId = panel.uniqueId().attr( \"id\" );\n\t\t\t\theader.attr( \"aria-controls\", panelId );\n\t\t\t\tpanel.attr( \"aria-labelledby\", headerId );\n\t\t\t} )\n\t\t\t.next()\n\t\t\t\t.attr( \"role\", \"tabpanel\" );\n\n\t\tthis.headers\n\t\t\t.not( this.active )\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-selected\": \"false\",\n\t\t\t\t\t\"aria-expanded\": \"false\",\n\t\t\t\t\ttabIndex: -1\n\t\t\t\t} )\n\t\t\t\t.next()\n\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t\t\t} )\n\t\t\t\t\t.hide();\n\n\t\t// Make sure at least one header is in the tab order\n\t\tif ( !this.active.length ) {\n\t\t\tthis.headers.eq( 0 ).attr( \"tabIndex\", 0 );\n\t\t} else {\n\t\t\tthis.active.attr( {\n\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\ttabIndex: 0\n\t\t\t} )\n\t\t\t\t.next()\n\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t\t\t} );\n\t\t}\n\n\t\tthis._createIcons();\n\n\t\tthis._setupEvents( options.event );\n\n\t\tif ( heightStyle === \"fill\" ) {\n\t\t\tmaxHeight = parent.height();\n\t\t\tthis.element.siblings( \":visible\" ).each( function() {\n\t\t\t\tvar elem = $( this ),\n\t\t\t\t\tposition = elem.css( \"position\" );\n\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.headers.each( function() {\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.headers.next()\n\t\t\t\t.each( function() {\n\t\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\n\t\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\n\t\t\t\t} )\n\t\t\t\t.css( \"overflow\", \"auto\" );\n\t\t} else if ( heightStyle === \"auto\" ) {\n\t\t\tmaxHeight = 0;\n\t\t\tthis.headers.next()\n\t\t\t\t.each( function() {\n\t\t\t\t\tvar isVisible = $( this ).is( \":visible\" );\n\t\t\t\t\tif ( !isVisible ) {\n\t\t\t\t\t\t$( this ).show();\n\t\t\t\t\t}\n\t\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).css( \"height\", \"\" ).height() );\n\t\t\t\t\tif ( !isVisible ) {\n\t\t\t\t\t\t$( this ).hide();\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t\t.height( maxHeight );\n\t\t}\n\t},\n\n\t_activate: function( index ) {\n\t\tvar active = this._findActive( index )[ 0 ];\n\n\t\t// Trying to activate the already active panel\n\t\tif ( active === this.active[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Trying to collapse, simulate a click on the currently active header\n\t\tactive = active || this.active[ 0 ];\n\n\t\tthis._eventHandler( {\n\t\t\ttarget: active,\n\t\t\tcurrentTarget: active,\n\t\t\tpreventDefault: $.noop\n\t\t} );\n\t},\n\n\t_findActive: function( selector ) {\n\t\treturn typeof selector === \"number\" ? this.headers.eq( selector ) : $();\n\t},\n\n\t_setupEvents: function( event ) {\n\t\tvar events = {\n\t\t\tkeydown: \"_keydown\"\n\t\t};\n\t\tif ( event ) {\n\t\t\t$.each( event.split( \" \" ), function( index, eventName ) {\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\n\t\t\t} );\n\t\t}\n\n\t\tthis._off( this.headers.add( this.headers.next() ) );\n\t\tthis._on( this.headers, events );\n\t\tthis._on( this.headers.next(), { keydown: \"_panelKeyDown\" } );\n\t\tthis._hoverable( this.headers );\n\t\tthis._focusable( this.headers );\n\t},\n\n\t_eventHandler: function( event ) {\n\t\tvar activeChildren, clickedChildren,\n\t\t\toptions = this.options,\n\t\t\tactive = this.active,\n\t\t\tclicked = $( event.currentTarget ),\n\t\t\tclickedIsActive = clicked[ 0 ] === active[ 0 ],\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\n\t\t\ttoShow = collapsing ? $() : clicked.next(),\n\t\t\ttoHide = active.next(),\n\t\t\teventData = {\n\t\t\t\toldHeader: active,\n\t\t\t\toldPanel: toHide,\n\t\t\t\tnewHeader: collapsing ? $() : clicked,\n\t\t\t\tnewPanel: toShow\n\t\t\t};\n\n\t\tevent.preventDefault();\n\n\t\tif (\n\n\t\t\t\t// click on active header, but not collapsible\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\n\n\t\t\t\t// allow canceling activation\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\toptions.active = collapsing ? false : this.headers.index( clicked );\n\n\t\t// When the call to ._toggle() comes after the class changes\n\t\t// it causes a very odd bug in IE 8 (see #6720)\n\t\tthis.active = clickedIsActive ? $() : clicked;\n\t\tthis._toggle( eventData );\n\n\t\t// Switch classes\n\t\t// corner classes on the previously active header stay after the animation\n\t\tthis._removeClass( active, \"ui-accordion-header-active\", \"ui-state-active\" );\n\t\tif ( options.icons ) {\n\t\t\tactiveChildren = active.children( \".ui-accordion-header-icon\" );\n\t\t\tthis._removeClass( activeChildren, null, options.icons.activeHeader )\n\t\t\t\t._addClass( activeChildren, null, options.icons.header );\n\t\t}\n\n\t\tif ( !clickedIsActive ) {\n\t\t\tthis._removeClass( clicked, \"ui-accordion-header-collapsed\" )\n\t\t\t\t._addClass( clicked, \"ui-accordion-header-active\", \"ui-state-active\" );\n\t\t\tif ( options.icons ) {\n\t\t\t\tclickedChildren = clicked.children( \".ui-accordion-header-icon\" );\n\t\t\t\tthis._removeClass( clickedChildren, null, options.icons.header )\n\t\t\t\t\t._addClass( clickedChildren, null, options.icons.activeHeader );\n\t\t\t}\n\n\t\t\tthis._addClass( clicked.next(), \"ui-accordion-content-active\" );\n\t\t}\n\t},\n\n\t_toggle: function( data ) {\n\t\tvar toShow = data.newPanel,\n\t\t\ttoHide = this.prevShow.length ? this.prevShow : data.oldPanel;\n\n\t\t// Handle activating a panel during the animation for another activation\n\t\tthis.prevShow.add( this.prevHide ).stop( true, true );\n\t\tthis.prevShow = toShow;\n\t\tthis.prevHide = toHide;\n\n\t\tif ( this.options.animate ) {\n\t\t\tthis._animate( toShow, toHide, data );\n\t\t} else {\n\t\t\ttoHide.hide();\n\t\t\ttoShow.show();\n\t\t\tthis._toggleComplete( data );\n\t\t}\n\n\t\ttoHide.attr( {\n\t\t\t\"aria-hidden\": \"true\"\n\t\t} );\n\t\ttoHide.prev().attr( {\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\"\n\t\t} );\n\n\t\t// if we're switching panels, remove the old header from the tab order\n\t\t// if we're opening from collapsed state, remove the previous header from the tab order\n\t\t// if we're collapsing, then keep the collapsing header in the tab order\n\t\tif ( toShow.length && toHide.length ) {\n\t\t\ttoHide.prev().attr( {\n\t\t\t\t\"tabIndex\": -1,\n\t\t\t\t\"aria-expanded\": \"false\"\n\t\t\t} );\n\t\t} else if ( toShow.length ) {\n\t\t\tthis.headers.filter( function() {\n\t\t\t\treturn parseInt( $( this ).attr( \"tabIndex\" ), 10 ) === 0;\n\t\t\t} )\n\t\t\t\t.attr( \"tabIndex\", -1 );\n\t\t}\n\n\t\ttoShow\n\t\t\t.attr( \"aria-hidden\", \"false\" )\n\t\t\t.prev()\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t} );\n\t},\n\n\t_animate: function( toShow, toHide, data ) {\n\t\tvar total, easing, duration,\n\t\t\tthat = this,\n\t\t\tadjust = 0,\n\t\t\tboxSizing = toShow.css( \"box-sizing\" ),\n\t\t\tdown = toShow.length &&\n\t\t\t\t( !toHide.length || ( toShow.index() < toHide.index() ) ),\n\t\t\tanimate = this.options.animate || {},\n\t\t\toptions = down && animate.down || animate,\n\t\t\tcomplete = function() {\n\t\t\t\tthat._toggleComplete( data );\n\t\t\t};\n\n\t\tif ( typeof options === \"number\" ) {\n\t\t\tduration = options;\n\t\t}\n\t\tif ( typeof options === \"string\" ) {\n\t\t\teasing = options;\n\t\t}\n\n\t\t// fall back from options to animation in case of partial down settings\n\t\teasing = easing || options.easing || animate.easing;\n\t\tduration = duration || options.duration || animate.duration;\n\n\t\tif ( !toHide.length ) {\n\t\t\treturn toShow.animate( this.showProps, duration, easing, complete );\n\t\t}\n\t\tif ( !toShow.length ) {\n\t\t\treturn toHide.animate( this.hideProps, duration, easing, complete );\n\t\t}\n\n\t\ttotal = toShow.show().outerHeight();\n\t\ttoHide.animate( this.hideProps, {\n\t\t\tduration: duration,\n\t\t\teasing: easing,\n\t\t\tstep: function( now, fx ) {\n\t\t\t\tfx.now = Math.round( now );\n\t\t\t}\n\t\t} );\n\t\ttoShow\n\t\t\t.hide()\n\t\t\t.animate( this.showProps, {\n\t\t\t\tduration: duration,\n\t\t\t\teasing: easing,\n\t\t\t\tcomplete: complete,\n\t\t\t\tstep: function( now, fx ) {\n\t\t\t\t\tfx.now = Math.round( now );\n\t\t\t\t\tif ( fx.prop !== \"height\" ) {\n\t\t\t\t\t\tif ( boxSizing === \"content-box\" ) {\n\t\t\t\t\t\t\tadjust += fx.now;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( that.options.heightStyle !== \"content\" ) {\n\t\t\t\t\t\tfx.now = Math.round( total - toHide.outerHeight() - adjust );\n\t\t\t\t\t\tadjust = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t},\n\n\t_toggleComplete: function( data ) {\n\t\tvar toHide = data.oldPanel,\n\t\t\tprev = toHide.prev();\n\n\t\tthis._removeClass( toHide, \"ui-accordion-content-active\" );\n\t\tthis._removeClass( prev, \"ui-accordion-header-active\" )\n\t\t\t._addClass( prev, \"ui-accordion-header-collapsed\" );\n\n\t\t// Work around for rendering bug in IE (#5421)\n\t\tif ( toHide.length ) {\n\t\t\ttoHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;\n\t\t}\n\t\tthis._trigger( \"activate\", null, data );\n\t}\n} );\n\n\n/*!\n * jQuery UI Menu 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Menu\n//>>group: Widgets\n//>>description: Creates nestable menus.\n//>>docs: http://api.jqueryui.com/menu/\n//>>demos: http://jqueryui.com/menu/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/menu.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\nvar widgetsMenu = $.widget( \"ui.menu\", {\n\tversion: \"1.12.1\",\n\tdefaultElement: \"<ul>\",\n\tdelay: 300,\n\toptions: {\n\t\ticons: {\n\t\t\tsubmenu: \"ui-icon-caret-1-e\"\n\t\t},\n\t\titems: \"> *\",\n\t\tmenus: \"ul\",\n\t\tposition: {\n\t\t\tmy: \"left top\",\n\t\t\tat: \"right top\"\n\t\t},\n\t\trole: \"menu\",\n\n\t\t// Callbacks\n\t\tblur: null,\n\t\tfocus: null,\n\t\tselect: null\n\t},\n\n\t_create: function() {\n\t\tthis.activeMenu = this.element;\n\n\t\t// Flag used to prevent firing of the click handler\n\t\t// as the event bubbles up through nested menus\n\t\tthis.mouseHandled = false;\n\t\tthis.element\n\t\t\t.uniqueId()\n\t\t\t.attr( {\n\t\t\t\trole: this.options.role,\n\t\t\t\ttabIndex: 0\n\t\t\t} );\n\n\t\tthis._addClass( \"ui-menu\", \"ui-widget ui-widget-content\" );\n\t\tthis._on( {\n\n\t\t\t// Prevent focus from sticking to links inside menu after clicking\n\t\t\t// them (focus should always stay on UL during navigation).\n\t\t\t\"mousedown .ui-menu-item\": function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t},\n\t\t\t\"click .ui-menu-item\": function( event ) {\n\t\t\t\tvar target = $( event.target );\n\t\t\t\tvar active = $( $.ui.safeActiveElement( this.document[ 0 ] ) );\n\t\t\t\tif ( !this.mouseHandled && target.not( \".ui-state-disabled\" ).length ) {\n\t\t\t\t\tthis.select( event );\n\n\t\t\t\t\t// Only set the mouseHandled flag if the event will bubble, see #9469.\n\t\t\t\t\tif ( !event.isPropagationStopped() ) {\n\t\t\t\t\t\tthis.mouseHandled = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Open submenu on click\n\t\t\t\t\tif ( target.has( \".ui-menu\" ).length ) {\n\t\t\t\t\t\tthis.expand( event );\n\t\t\t\t\t} else if ( !this.element.is( \":focus\" ) &&\n\t\t\t\t\t\t\tactive.closest( \".ui-menu\" ).length ) {\n\n\t\t\t\t\t\t// Redirect focus to the menu\n\t\t\t\t\t\tthis.element.trigger( \"focus\", [ true ] );\n\n\t\t\t\t\t\t// If the active item is on the top level, let it stay active.\n\t\t\t\t\t\t// Otherwise, blur the active item since it is no longer visible.\n\t\t\t\t\t\tif ( this.active && this.active.parents( \".ui-menu\" ).length === 1 ) {\n\t\t\t\t\t\t\tclearTimeout( this.timer );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"mouseenter .ui-menu-item\": function( event ) {\n\n\t\t\t\t// Ignore mouse events while typeahead is active, see #10458.\n\t\t\t\t// Prevents focusing the wrong item when typeahead causes a scroll while the mouse\n\t\t\t\t// is over an item in the menu\n\t\t\t\tif ( this.previousFilter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar actualTarget = $( event.target ).closest( \".ui-menu-item\" ),\n\t\t\t\t\ttarget = $( event.currentTarget );\n\n\t\t\t\t// Ignore bubbled events on parent items, see #11641\n\t\t\t\tif ( actualTarget[ 0 ] !== target[ 0 ] ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Remove ui-state-active class from siblings of the newly focused menu item\n\t\t\t\t// to avoid a jump caused by adjacent elements both having a class with a border\n\t\t\t\tthis._removeClass( target.siblings().children( \".ui-state-active\" ),\n\t\t\t\t\tnull, \"ui-state-active\" );\n\t\t\t\tthis.focus( event, target );\n\t\t\t},\n\t\t\tmouseleave: \"collapseAll\",\n\t\t\t\"mouseleave .ui-menu\": \"collapseAll\",\n\t\t\tfocus: function( event, keepActiveItem ) {\n\n\t\t\t\t// If there's already an active item, keep it active\n\t\t\t\t// If not, activate the first item\n\t\t\t\tvar item = this.active || this.element.find( this.options.items ).eq( 0 );\n\n\t\t\t\tif ( !keepActiveItem ) {\n\t\t\t\t\tthis.focus( event, item );\n\t\t\t\t}\n\t\t\t},\n\t\t\tblur: function( event ) {\n\t\t\t\tthis._delay( function() {\n\t\t\t\t\tvar notContained = !$.contains(\n\t\t\t\t\t\tthis.element[ 0 ],\n\t\t\t\t\t\t$.ui.safeActiveElement( this.document[ 0 ] )\n\t\t\t\t\t);\n\t\t\t\t\tif ( notContained ) {\n\t\t\t\t\t\tthis.collapseAll( event );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t},\n\t\t\tkeydown: \"_keydown\"\n\t\t} );\n\n\t\tthis.refresh();\n\n\t\t// Clicks outside of a menu collapse any open menus\n\t\tthis._on( this.document, {\n\t\t\tclick: function( event ) {\n\t\t\t\tif ( this._closeOnDocumentClick( event ) ) {\n\t\t\t\t\tthis.collapseAll( event );\n\t\t\t\t}\n\n\t\t\t\t// Reset the mouseHandled flag\n\t\t\t\tthis.mouseHandled = false;\n\t\t\t}\n\t\t} );\n\t},\n\n\t_destroy: function() {\n\t\tvar items = this.element.find( \".ui-menu-item\" )\n\t\t\t\t.removeAttr( \"role aria-disabled\" ),\n\t\t\tsubmenus = items.children( \".ui-menu-item-wrapper\" )\n\t\t\t\t.removeUniqueId()\n\t\t\t\t.removeAttr( \"tabIndex role aria-haspopup\" );\n\n\t\t// Destroy (sub)menus\n\t\tthis.element\n\t\t\t.removeAttr( \"aria-activedescendant\" )\n\t\t\t.find( \".ui-menu\" ).addBack()\n\t\t\t\t.removeAttr( \"role aria-labelledby aria-expanded aria-hidden aria-disabled \" +\n\t\t\t\t\t\"tabIndex\" )\n\t\t\t\t.removeUniqueId()\n\t\t\t\t.show();\n\n\t\tsubmenus.children().each( function() {\n\t\t\tvar elem = $( this );\n\t\t\tif ( elem.data( \"ui-menu-submenu-caret\" ) ) {\n\t\t\t\telem.remove();\n\t\t\t}\n\t\t} );\n\t},\n\n\t_keydown: function( event ) {\n\t\tvar match, prev, character, skip,\n\t\t\tpreventDefault = true;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\tthis.previousPage( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\tthis.nextPage( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.HOME:\n\t\t\tthis._move( \"first\", \"first\", event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.END:\n\t\t\tthis._move( \"last\", \"last\", event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.UP:\n\t\t\tthis.previous( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.DOWN:\n\t\t\tthis.next( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.LEFT:\n\t\t\tthis.collapse( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.RIGHT:\n\t\t\tif ( this.active && !this.active.is( \".ui-state-disabled\" ) ) {\n\t\t\t\tthis.expand( event );\n\t\t\t}\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.ENTER:\n\t\tcase $.ui.keyCode.SPACE:\n\t\t\tthis._activate( event );\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.ESCAPE:\n\t\t\tthis.collapse( event );\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tpreventDefault = false;\n\t\t\tprev = this.previousFilter || \"\";\n\t\t\tskip = false;\n\n\t\t\t// Support number pad values\n\t\t\tcharacter = event.keyCode >= 96 && event.keyCode <= 105 ?\n\t\t\t\t( event.keyCode - 96 ).toString() : String.fromCharCode( event.keyCode );\n\n\t\t\tclearTimeout( this.filterTimer );\n\n\t\t\tif ( character === prev ) {\n\t\t\t\tskip = true;\n\t\t\t} else {\n\t\t\t\tcharacter = prev + character;\n\t\t\t}\n\n\t\t\tmatch = this._filterMenuItems( character );\n\t\t\tmatch = skip && match.index( this.active.next() ) !== -1 ?\n\t\t\t\tthis.active.nextAll( \".ui-menu-item\" ) :\n\t\t\t\tmatch;\n\n\t\t\t// If no matches on the current filter, reset to the last character pressed\n\t\t\t// to move down the menu to the first item that starts with that character\n\t\t\tif ( !match.length ) {\n\t\t\t\tcharacter = String.fromCharCode( event.keyCode );\n\t\t\t\tmatch = this._filterMenuItems( character );\n\t\t\t}\n\n\t\t\tif ( match.length ) {\n\t\t\t\tthis.focus( event, match );\n\t\t\t\tthis.previousFilter = character;\n\t\t\t\tthis.filterTimer = this._delay( function() {\n\t\t\t\t\tdelete this.previousFilter;\n\t\t\t\t}, 1000 );\n\t\t\t} else {\n\t\t\t\tdelete this.previousFilter;\n\t\t\t}\n\t\t}\n\n\t\tif ( preventDefault ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t},\n\n\t_activate: function( event ) {\n\t\tif ( this.active && !this.active.is( \".ui-state-disabled\" ) ) {\n\t\t\tif ( this.active.children( \"[aria-haspopup='true']\" ).length ) {\n\t\t\t\tthis.expand( event );\n\t\t\t} else {\n\t\t\t\tthis.select( event );\n\t\t\t}\n\t\t}\n\t},\n\n\trefresh: function() {\n\t\tvar menus, items, newSubmenus, newItems, newWrappers,\n\t\t\tthat = this,\n\t\t\ticon = this.options.icons.submenu,\n\t\t\tsubmenus = this.element.find( this.options.menus );\n\n\t\tthis._toggleClass( \"ui-menu-icons\", null, !!this.element.find( \".ui-icon\" ).length );\n\n\t\t// Initialize nested menus\n\t\tnewSubmenus = submenus.filter( \":not(.ui-menu)\" )\n\t\t\t.hide()\n\t\t\t.attr( {\n\t\t\t\trole: this.options.role,\n\t\t\t\t\"aria-hidden\": \"true\",\n\t\t\t\t\"aria-expanded\": \"false\"\n\t\t\t} )\n\t\t\t.each( function() {\n\t\t\t\tvar menu = $( this ),\n\t\t\t\t\titem = menu.prev(),\n\t\t\t\t\tsubmenuCaret = $( \"<span>\" ).data( \"ui-menu-submenu-caret\", true );\n\n\t\t\t\tthat._addClass( submenuCaret, \"ui-menu-icon\", \"ui-icon \" + icon );\n\t\t\t\titem\n\t\t\t\t\t.attr( \"aria-haspopup\", \"true\" )\n\t\t\t\t\t.prepend( submenuCaret );\n\t\t\t\tmenu.attr( \"aria-labelledby\", item.attr( \"id\" ) );\n\t\t\t} );\n\n\t\tthis._addClass( newSubmenus, \"ui-menu\", \"ui-widget ui-widget-content ui-front\" );\n\n\t\tmenus = submenus.add( this.element );\n\t\titems = menus.find( this.options.items );\n\n\t\t// Initialize menu-items containing spaces and/or dashes only as dividers\n\t\titems.not( \".ui-menu-item\" ).each( function() {\n\t\t\tvar item = $( this );\n\t\t\tif ( that._isDivider( item ) ) {\n\t\t\t\tthat._addClass( item, \"ui-menu-divider\", \"ui-widget-content\" );\n\t\t\t}\n\t\t} );\n\n\t\t// Don't refresh list items that are already adapted\n\t\tnewItems = items.not( \".ui-menu-item, .ui-menu-divider\" );\n\t\tnewWrappers = newItems.children()\n\t\t\t.not( \".ui-menu\" )\n\t\t\t\t.uniqueId()\n\t\t\t\t.attr( {\n\t\t\t\t\ttabIndex: -1,\n\t\t\t\t\trole: this._itemRole()\n\t\t\t\t} );\n\t\tthis._addClass( newItems, \"ui-menu-item\" )\n\t\t\t._addClass( newWrappers, \"ui-menu-item-wrapper\" );\n\n\t\t// Add aria-disabled attribute to any disabled menu item\n\t\titems.filter( \".ui-state-disabled\" ).attr( \"aria-disabled\", \"true\" );\n\n\t\t// If the active item has been removed, blur the menu\n\t\tif ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {\n\t\t\tthis.blur();\n\t\t}\n\t},\n\n\t_itemRole: function() {\n\t\treturn {\n\t\t\tmenu: \"menuitem\",\n\t\t\tlistbox: \"option\"\n\t\t}[ this.options.role ];\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"icons\" ) {\n\t\t\tvar icons = this.element.find( \".ui-menu-icon\" );\n\t\t\tthis._removeClass( icons, null, this.options.icons.submenu )\n\t\t\t\t._addClass( icons, null, value.submenu );\n\t\t}\n\t\tthis._super( key, value );\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis.element.attr( \"aria-disabled\", String( value ) );\n\t\tthis._toggleClass( null, \"ui-state-disabled\", !!value );\n\t},\n\n\tfocus: function( event, item ) {\n\t\tvar nested, focused, activeParent;\n\t\tthis.blur( event, event && event.type === \"focus\" );\n\n\t\tthis._scrollIntoView( item );\n\n\t\tthis.active = item.first();\n\n\t\tfocused = this.active.children( \".ui-menu-item-wrapper\" );\n\t\tthis._addClass( focused, null, \"ui-state-active\" );\n\n\t\t// Only update aria-activedescendant if there's a role\n\t\t// otherwise we assume focus is managed elsewhere\n\t\tif ( this.options.role ) {\n\t\t\tthis.element.attr( \"aria-activedescendant\", focused.attr( \"id\" ) );\n\t\t}\n\n\t\t// Highlight active parent menu item, if any\n\t\tactiveParent = this.active\n\t\t\t.parent()\n\t\t\t\t.closest( \".ui-menu-item\" )\n\t\t\t\t\t.children( \".ui-menu-item-wrapper\" );\n\t\tthis._addClass( activeParent, null, \"ui-state-active\" );\n\n\t\tif ( event && event.type === \"keydown\" ) {\n\t\t\tthis._close();\n\t\t} else {\n\t\t\tthis.timer = this._delay( function() {\n\t\t\t\tthis._close();\n\t\t\t}, this.delay );\n\t\t}\n\n\t\tnested = item.children( \".ui-menu\" );\n\t\tif ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {\n\t\t\tthis._startOpening( nested );\n\t\t}\n\t\tthis.activeMenu = item.parent();\n\n\t\tthis._trigger( \"focus\", event, { item: item } );\n\t},\n\n\t_scrollIntoView: function( item ) {\n\t\tvar borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;\n\t\tif ( this._hasScroll() ) {\n\t\t\tborderTop = parseFloat( $.css( this.activeMenu[ 0 ], \"borderTopWidth\" ) ) || 0;\n\t\t\tpaddingTop = parseFloat( $.css( this.activeMenu[ 0 ], \"paddingTop\" ) ) || 0;\n\t\t\toffset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;\n\t\t\tscroll = this.activeMenu.scrollTop();\n\t\t\telementHeight = this.activeMenu.height();\n\t\t\titemHeight = item.outerHeight();\n\n\t\t\tif ( offset < 0 ) {\n\t\t\t\tthis.activeMenu.scrollTop( scroll + offset );\n\t\t\t} else if ( offset + itemHeight > elementHeight ) {\n\t\t\t\tthis.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );\n\t\t\t}\n\t\t}\n\t},\n\n\tblur: function( event, fromFocus ) {\n\t\tif ( !fromFocus ) {\n\t\t\tclearTimeout( this.timer );\n\t\t}\n\n\t\tif ( !this.active ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._removeClass( this.active.children( \".ui-menu-item-wrapper\" ),\n\t\t\tnull, \"ui-state-active\" );\n\n\t\tthis._trigger( \"blur\", event, { item: this.active } );\n\t\tthis.active = null;\n\t},\n\n\t_startOpening: function( submenu ) {\n\t\tclearTimeout( this.timer );\n\n\t\t// Don't open if already open fixes a Firefox bug that caused a .5 pixel\n\t\t// shift in the submenu position when mousing over the caret icon\n\t\tif ( submenu.attr( \"aria-hidden\" ) !== \"true\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.timer = this._delay( function() {\n\t\t\tthis._close();\n\t\t\tthis._open( submenu );\n\t\t}, this.delay );\n\t},\n\n\t_open: function( submenu ) {\n\t\tvar position = $.extend( {\n\t\t\tof: this.active\n\t\t}, this.options.position );\n\n\t\tclearTimeout( this.timer );\n\t\tthis.element.find( \".ui-menu\" ).not( submenu.parents( \".ui-menu\" ) )\n\t\t\t.hide()\n\t\t\t.attr( \"aria-hidden\", \"true\" );\n\n\t\tsubmenu\n\t\t\t.show()\n\t\t\t.removeAttr( \"aria-hidden\" )\n\t\t\t.attr( \"aria-expanded\", \"true\" )\n\t\t\t.position( position );\n\t},\n\n\tcollapseAll: function( event, all ) {\n\t\tclearTimeout( this.timer );\n\t\tthis.timer = this._delay( function() {\n\n\t\t\t// If we were passed an event, look for the submenu that contains the event\n\t\t\tvar currentMenu = all ? this.element :\n\t\t\t\t$( event && event.target ).closest( this.element.find( \".ui-menu\" ) );\n\n\t\t\t// If we found no valid submenu ancestor, use the main menu to close all\n\t\t\t// sub menus anyway\n\t\t\tif ( !currentMenu.length ) {\n\t\t\t\tcurrentMenu = this.element;\n\t\t\t}\n\n\t\t\tthis._close( currentMenu );\n\n\t\t\tthis.blur( event );\n\n\t\t\t// Work around active item staying active after menu is blurred\n\t\t\tthis._removeClass( currentMenu.find( \".ui-state-active\" ), null, \"ui-state-active\" );\n\n\t\t\tthis.activeMenu = currentMenu;\n\t\t}, this.delay );\n\t},\n\n\t// With no arguments, closes the currently active menu - if nothing is active\n\t// it closes all menus.  If passed an argument, it will search for menus BELOW\n\t_close: function( startMenu ) {\n\t\tif ( !startMenu ) {\n\t\t\tstartMenu = this.active ? this.active.parent() : this.element;\n\t\t}\n\n\t\tstartMenu.find( \".ui-menu\" )\n\t\t\t.hide()\n\t\t\t.attr( \"aria-hidden\", \"true\" )\n\t\t\t.attr( \"aria-expanded\", \"false\" );\n\t},\n\n\t_closeOnDocumentClick: function( event ) {\n\t\treturn !$( event.target ).closest( \".ui-menu\" ).length;\n\t},\n\n\t_isDivider: function( item ) {\n\n\t\t// Match hyphen, em dash, en dash\n\t\treturn !/[^\\-\\u2014\\u2013\\s]/.test( item.text() );\n\t},\n\n\tcollapse: function( event ) {\n\t\tvar newItem = this.active &&\n\t\t\tthis.active.parent().closest( \".ui-menu-item\", this.element );\n\t\tif ( newItem && newItem.length ) {\n\t\t\tthis._close();\n\t\t\tthis.focus( event, newItem );\n\t\t}\n\t},\n\n\texpand: function( event ) {\n\t\tvar newItem = this.active &&\n\t\t\tthis.active\n\t\t\t\t.children( \".ui-menu \" )\n\t\t\t\t\t.find( this.options.items )\n\t\t\t\t\t\t.first();\n\n\t\tif ( newItem && newItem.length ) {\n\t\t\tthis._open( newItem.parent() );\n\n\t\t\t// Delay so Firefox will not hide activedescendant change in expanding submenu from AT\n\t\t\tthis._delay( function() {\n\t\t\t\tthis.focus( event, newItem );\n\t\t\t} );\n\t\t}\n\t},\n\n\tnext: function( event ) {\n\t\tthis._move( \"next\", \"first\", event );\n\t},\n\n\tprevious: function( event ) {\n\t\tthis._move( \"prev\", \"last\", event );\n\t},\n\n\tisFirstItem: function() {\n\t\treturn this.active && !this.active.prevAll( \".ui-menu-item\" ).length;\n\t},\n\n\tisLastItem: function() {\n\t\treturn this.active && !this.active.nextAll( \".ui-menu-item\" ).length;\n\t},\n\n\t_move: function( direction, filter, event ) {\n\t\tvar next;\n\t\tif ( this.active ) {\n\t\t\tif ( direction === \"first\" || direction === \"last\" ) {\n\t\t\t\tnext = this.active\n\t\t\t\t\t[ direction === \"first\" ? \"prevAll\" : \"nextAll\" ]( \".ui-menu-item\" )\n\t\t\t\t\t.eq( -1 );\n\t\t\t} else {\n\t\t\t\tnext = this.active\n\t\t\t\t\t[ direction + \"All\" ]( \".ui-menu-item\" )\n\t\t\t\t\t.eq( 0 );\n\t\t\t}\n\t\t}\n\t\tif ( !next || !next.length || !this.active ) {\n\t\t\tnext = this.activeMenu.find( this.options.items )[ filter ]();\n\t\t}\n\n\t\tthis.focus( event, next );\n\t},\n\n\tnextPage: function( event ) {\n\t\tvar item, base, height;\n\n\t\tif ( !this.active ) {\n\t\t\tthis.next( event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.isLastItem() ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( this._hasScroll() ) {\n\t\t\tbase = this.active.offset().top;\n\t\t\theight = this.element.height();\n\t\t\tthis.active.nextAll( \".ui-menu-item\" ).each( function() {\n\t\t\t\titem = $( this );\n\t\t\t\treturn item.offset().top - base - height < 0;\n\t\t\t} );\n\n\t\t\tthis.focus( event, item );\n\t\t} else {\n\t\t\tthis.focus( event, this.activeMenu.find( this.options.items )\n\t\t\t\t[ !this.active ? \"first\" : \"last\" ]() );\n\t\t}\n\t},\n\n\tpreviousPage: function( event ) {\n\t\tvar item, base, height;\n\t\tif ( !this.active ) {\n\t\t\tthis.next( event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.isFirstItem() ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( this._hasScroll() ) {\n\t\t\tbase = this.active.offset().top;\n\t\t\theight = this.element.height();\n\t\t\tthis.active.prevAll( \".ui-menu-item\" ).each( function() {\n\t\t\t\titem = $( this );\n\t\t\t\treturn item.offset().top - base + height > 0;\n\t\t\t} );\n\n\t\t\tthis.focus( event, item );\n\t\t} else {\n\t\t\tthis.focus( event, this.activeMenu.find( this.options.items ).first() );\n\t\t}\n\t},\n\n\t_hasScroll: function() {\n\t\treturn this.element.outerHeight() < this.element.prop( \"scrollHeight\" );\n\t},\n\n\tselect: function( event ) {\n\n\t\t// TODO: It should never be possible to not have an active item at this\n\t\t// point, but the tests don't trigger mouseenter before click.\n\t\tthis.active = this.active || $( event.target ).closest( \".ui-menu-item\" );\n\t\tvar ui = { item: this.active };\n\t\tif ( !this.active.has( \".ui-menu\" ).length ) {\n\t\t\tthis.collapseAll( event, true );\n\t\t}\n\t\tthis._trigger( \"select\", event, ui );\n\t},\n\n\t_filterMenuItems: function( character ) {\n\t\tvar escapedCharacter = character.replace( /[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\" ),\n\t\t\tregex = new RegExp( \"^\" + escapedCharacter, \"i\" );\n\n\t\treturn this.activeMenu\n\t\t\t.find( this.options.items )\n\n\t\t\t\t// Only match on items, not dividers or other content (#10571)\n\t\t\t\t.filter( \".ui-menu-item\" )\n\t\t\t\t\t.filter( function() {\n\t\t\t\t\t\treturn regex.test(\n\t\t\t\t\t\t\t$.trim( $( this ).children( \".ui-menu-item-wrapper\" ).text() ) );\n\t\t\t\t\t} );\n\t}\n} );\n\n\n/*!\n * jQuery UI Autocomplete 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Autocomplete\n//>>group: Widgets\n//>>description: Lists suggested words as the user is typing.\n//>>docs: http://api.jqueryui.com/autocomplete/\n//>>demos: http://jqueryui.com/autocomplete/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/autocomplete.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.autocomplete\", {\n\tversion: \"1.12.1\",\n\tdefaultElement: \"<input>\",\n\toptions: {\n\t\tappendTo: null,\n\t\tautoFocus: false,\n\t\tdelay: 300,\n\t\tminLength: 1,\n\t\tposition: {\n\t\t\tmy: \"left top\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"none\"\n\t\t},\n\t\tsource: null,\n\n\t\t// Callbacks\n\t\tchange: null,\n\t\tclose: null,\n\t\tfocus: null,\n\t\topen: null,\n\t\tresponse: null,\n\t\tsearch: null,\n\t\tselect: null\n\t},\n\n\trequestIndex: 0,\n\tpending: 0,\n\n\t_create: function() {\n\n\t\t// Some browsers only repeat keydown events, not keypress events,\n\t\t// so we use the suppressKeyPress flag to determine if we've already\n\t\t// handled the keydown event. #7269\n\t\t// Unfortunately the code for & in keypress is the same as the up arrow,\n\t\t// so we use the suppressKeyPressRepeat flag to avoid handling keypress\n\t\t// events when we know the keydown event was used to modify the\n\t\t// search term. #7799\n\t\tvar suppressKeyPress, suppressKeyPressRepeat, suppressInput,\n\t\t\tnodeName = this.element[ 0 ].nodeName.toLowerCase(),\n\t\t\tisTextarea = nodeName === \"textarea\",\n\t\t\tisInput = nodeName === \"input\";\n\n\t\t// Textareas are always multi-line\n\t\t// Inputs are always single-line, even if inside a contentEditable element\n\t\t// IE also treats inputs as contentEditable\n\t\t// All other element types are determined by whether or not they're contentEditable\n\t\tthis.isMultiLine = isTextarea || !isInput && this._isContentEditable( this.element );\n\n\t\tthis.valueMethod = this.element[ isTextarea || isInput ? \"val\" : \"text\" ];\n\t\tthis.isNewMenu = true;\n\n\t\tthis._addClass( \"ui-autocomplete-input\" );\n\t\tthis.element.attr( \"autocomplete\", \"off\" );\n\n\t\tthis._on( this.element, {\n\t\t\tkeydown: function( event ) {\n\t\t\t\tif ( this.element.prop( \"readOnly\" ) ) {\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tsuppressInput = true;\n\t\t\t\t\tsuppressKeyPressRepeat = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsuppressKeyPress = false;\n\t\t\t\tsuppressInput = false;\n\t\t\t\tsuppressKeyPressRepeat = false;\n\t\t\t\tvar keyCode = $.ui.keyCode;\n\t\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase keyCode.PAGE_UP:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._move( \"previousPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.PAGE_DOWN:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._move( \"nextPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.UP:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._keyEvent( \"previous\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.DOWN:\n\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\tthis._keyEvent( \"next\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.ENTER:\n\n\t\t\t\t\t// when menu is open and has focus\n\t\t\t\t\tif ( this.menu.active ) {\n\n\t\t\t\t\t\t// #6055 - Opera still allows the keypress to occur\n\t\t\t\t\t\t// which causes forms to submit\n\t\t\t\t\t\tsuppressKeyPress = true;\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tthis.menu.select( event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.TAB:\n\t\t\t\t\tif ( this.menu.active ) {\n\t\t\t\t\t\tthis.menu.select( event );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.ESCAPE:\n\t\t\t\t\tif ( this.menu.element.is( \":visible\" ) ) {\n\t\t\t\t\t\tif ( !this.isMultiLine ) {\n\t\t\t\t\t\t\tthis._value( this.term );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.close( event );\n\n\t\t\t\t\t\t// Different browsers have different default behavior for escape\n\t\t\t\t\t\t// Single press can mean undo or clear\n\t\t\t\t\t\t// Double press in IE means clear the whole form\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tsuppressKeyPressRepeat = true;\n\n\t\t\t\t\t// search timeout should be triggered before the input value is changed\n\t\t\t\t\tthis._searchTimeout( event );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tkeypress: function( event ) {\n\t\t\t\tif ( suppressKeyPress ) {\n\t\t\t\t\tsuppressKeyPress = false;\n\t\t\t\t\tif ( !this.isMultiLine || this.menu.element.is( \":visible\" ) ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( suppressKeyPressRepeat ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Replicate some key handlers to allow them to repeat in Firefox and Opera\n\t\t\t\tvar keyCode = $.ui.keyCode;\n\t\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase keyCode.PAGE_UP:\n\t\t\t\t\tthis._move( \"previousPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.PAGE_DOWN:\n\t\t\t\t\tthis._move( \"nextPage\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.UP:\n\t\t\t\t\tthis._keyEvent( \"previous\", event );\n\t\t\t\t\tbreak;\n\t\t\t\tcase keyCode.DOWN:\n\t\t\t\t\tthis._keyEvent( \"next\", event );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\tinput: function( event ) {\n\t\t\t\tif ( suppressInput ) {\n\t\t\t\t\tsuppressInput = false;\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis._searchTimeout( event );\n\t\t\t},\n\t\t\tfocus: function() {\n\t\t\t\tthis.selectedItem = null;\n\t\t\t\tthis.previous = this._value();\n\t\t\t},\n\t\t\tblur: function( event ) {\n\t\t\t\tif ( this.cancelBlur ) {\n\t\t\t\t\tdelete this.cancelBlur;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tclearTimeout( this.searching );\n\t\t\t\tthis.close( event );\n\t\t\t\tthis._change( event );\n\t\t\t}\n\t\t} );\n\n\t\tthis._initSource();\n\t\tthis.menu = $( \"<ul>\" )\n\t\t\t.appendTo( this._appendTo() )\n\t\t\t.menu( {\n\n\t\t\t\t// disable ARIA support, the live region takes care of that\n\t\t\t\trole: null\n\t\t\t} )\n\t\t\t.hide()\n\t\t\t.menu( \"instance\" );\n\n\t\tthis._addClass( this.menu.element, \"ui-autocomplete\", \"ui-front\" );\n\t\tthis._on( this.menu.element, {\n\t\t\tmousedown: function( event ) {\n\n\t\t\t\t// prevent moving focus out of the text field\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t// IE doesn't prevent moving focus even with event.preventDefault()\n\t\t\t\t// so we set a flag to know when we should ignore the blur event\n\t\t\t\tthis.cancelBlur = true;\n\t\t\t\tthis._delay( function() {\n\t\t\t\t\tdelete this.cancelBlur;\n\n\t\t\t\t\t// Support: IE 8 only\n\t\t\t\t\t// Right clicking a menu item or selecting text from the menu items will\n\t\t\t\t\t// result in focus moving out of the input. However, we've already received\n\t\t\t\t\t// and ignored the blur event because of the cancelBlur flag set above. So\n\t\t\t\t\t// we restore focus to ensure that the menu closes properly based on the user's\n\t\t\t\t\t// next actions.\n\t\t\t\t\tif ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {\n\t\t\t\t\t\tthis.element.trigger( \"focus\" );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t},\n\t\t\tmenufocus: function( event, ui ) {\n\t\t\t\tvar label, item;\n\n\t\t\t\t// support: Firefox\n\t\t\t\t// Prevent accidental activation of menu items in Firefox (#7024 #9118)\n\t\t\t\tif ( this.isNewMenu ) {\n\t\t\t\t\tthis.isNewMenu = false;\n\t\t\t\t\tif ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {\n\t\t\t\t\t\tthis.menu.blur();\n\n\t\t\t\t\t\tthis.document.one( \"mousemove\", function() {\n\t\t\t\t\t\t\t$( event.target ).trigger( event.originalEvent );\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\titem = ui.item.data( \"ui-autocomplete-item\" );\n\t\t\t\tif ( false !== this._trigger( \"focus\", event, { item: item } ) ) {\n\n\t\t\t\t\t// use value to match what will end up in the input, if it was a key event\n\t\t\t\t\tif ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {\n\t\t\t\t\t\tthis._value( item.value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Announce the value in the liveRegion\n\t\t\t\tlabel = ui.item.attr( \"aria-label\" ) || item.value;\n\t\t\t\tif ( label && $.trim( label ).length ) {\n\t\t\t\t\tthis.liveRegion.children().hide();\n\t\t\t\t\t$( \"<div>\" ).text( label ).appendTo( this.liveRegion );\n\t\t\t\t}\n\t\t\t},\n\t\t\tmenuselect: function( event, ui ) {\n\t\t\t\tvar item = ui.item.data( \"ui-autocomplete-item\" ),\n\t\t\t\t\tprevious = this.previous;\n\n\t\t\t\t// Only trigger when focus was lost (click on menu)\n\t\t\t\tif ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {\n\t\t\t\t\tthis.element.trigger( \"focus\" );\n\t\t\t\t\tthis.previous = previous;\n\n\t\t\t\t\t// #6109 - IE triggers two focus events and the second\n\t\t\t\t\t// is asynchronous, so we need to reset the previous\n\t\t\t\t\t// term synchronously and asynchronously :-(\n\t\t\t\t\tthis._delay( function() {\n\t\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t\tthis.selectedItem = item;\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\tif ( false !== this._trigger( \"select\", event, { item: item } ) ) {\n\t\t\t\t\tthis._value( item.value );\n\t\t\t\t}\n\n\t\t\t\t// reset the term after the select event\n\t\t\t\t// this allows custom select handling to work properly\n\t\t\t\tthis.term = this._value();\n\n\t\t\t\tthis.close( event );\n\t\t\t\tthis.selectedItem = item;\n\t\t\t}\n\t\t} );\n\n\t\tthis.liveRegion = $( \"<div>\", {\n\t\t\trole: \"status\",\n\t\t\t\"aria-live\": \"assertive\",\n\t\t\t\"aria-relevant\": \"additions\"\n\t\t} )\n\t\t\t.appendTo( this.document[ 0 ].body );\n\n\t\tthis._addClass( this.liveRegion, null, \"ui-helper-hidden-accessible\" );\n\n\t\t// Turning off autocomplete prevents the browser from remembering the\n\t\t// value when navigating through history, so we re-enable autocomplete\n\t\t// if the page is unloaded before the widget is destroyed. #7790\n\t\tthis._on( this.window, {\n\t\t\tbeforeunload: function() {\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_destroy: function() {\n\t\tclearTimeout( this.searching );\n\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\tthis.menu.element.remove();\n\t\tthis.liveRegion.remove();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\t\tif ( key === \"source\" ) {\n\t\t\tthis._initSource();\n\t\t}\n\t\tif ( key === \"appendTo\" ) {\n\t\t\tthis.menu.element.appendTo( this._appendTo() );\n\t\t}\n\t\tif ( key === \"disabled\" && value && this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\t},\n\n\t_isEventTargetInWidget: function( event ) {\n\t\tvar menuElement = this.menu.element[ 0 ];\n\n\t\treturn event.target === this.element[ 0 ] ||\n\t\t\tevent.target === menuElement ||\n\t\t\t$.contains( menuElement, event.target );\n\t},\n\n\t_closeOnClickOutside: function( event ) {\n\t\tif ( !this._isEventTargetInWidget( event ) ) {\n\t\t\tthis.close();\n\t\t}\n\t},\n\n\t_appendTo: function() {\n\t\tvar element = this.options.appendTo;\n\n\t\tif ( element ) {\n\t\t\telement = element.jquery || element.nodeType ?\n\t\t\t\t$( element ) :\n\t\t\t\tthis.document.find( element ).eq( 0 );\n\t\t}\n\n\t\tif ( !element || !element[ 0 ] ) {\n\t\t\telement = this.element.closest( \".ui-front, dialog\" );\n\t\t}\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[ 0 ].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_initSource: function() {\n\t\tvar array, url,\n\t\t\tthat = this;\n\t\tif ( $.isArray( this.options.source ) ) {\n\t\t\tarray = this.options.source;\n\t\t\tthis.source = function( request, response ) {\n\t\t\t\tresponse( $.ui.autocomplete.filter( array, request.term ) );\n\t\t\t};\n\t\t} else if ( typeof this.options.source === \"string\" ) {\n\t\t\turl = this.options.source;\n\t\t\tthis.source = function( request, response ) {\n\t\t\t\tif ( that.xhr ) {\n\t\t\t\t\tthat.xhr.abort();\n\t\t\t\t}\n\t\t\t\tthat.xhr = $.ajax( {\n\t\t\t\t\turl: url,\n\t\t\t\t\tdata: request,\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\tsuccess: function( data ) {\n\t\t\t\t\t\tresponse( data );\n\t\t\t\t\t},\n\t\t\t\t\terror: function() {\n\t\t\t\t\t\tresponse( [] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t};\n\t\t} else {\n\t\t\tthis.source = this.options.source;\n\t\t}\n\t},\n\n\t_searchTimeout: function( event ) {\n\t\tclearTimeout( this.searching );\n\t\tthis.searching = this._delay( function() {\n\n\t\t\t// Search if the value has changed, or if the user retypes the same value (see #7434)\n\t\t\tvar equalValues = this.term === this._value(),\n\t\t\t\tmenuVisible = this.menu.element.is( \":visible\" ),\n\t\t\t\tmodifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;\n\n\t\t\tif ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {\n\t\t\t\tthis.selectedItem = null;\n\t\t\t\tthis.search( null, event );\n\t\t\t}\n\t\t}, this.options.delay );\n\t},\n\n\tsearch: function( value, event ) {\n\t\tvalue = value != null ? value : this._value();\n\n\t\t// Always save the actual value, not the one passed as an argument\n\t\tthis.term = this._value();\n\n\t\tif ( value.length < this.options.minLength ) {\n\t\t\treturn this.close( event );\n\t\t}\n\n\t\tif ( this._trigger( \"search\", event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this._search( value );\n\t},\n\n\t_search: function( value ) {\n\t\tthis.pending++;\n\t\tthis._addClass( \"ui-autocomplete-loading\" );\n\t\tthis.cancelSearch = false;\n\n\t\tthis.source( { term: value }, this._response() );\n\t},\n\n\t_response: function() {\n\t\tvar index = ++this.requestIndex;\n\n\t\treturn $.proxy( function( content ) {\n\t\t\tif ( index === this.requestIndex ) {\n\t\t\t\tthis.__response( content );\n\t\t\t}\n\n\t\t\tthis.pending--;\n\t\t\tif ( !this.pending ) {\n\t\t\t\tthis._removeClass( \"ui-autocomplete-loading\" );\n\t\t\t}\n\t\t}, this );\n\t},\n\n\t__response: function( content ) {\n\t\tif ( content ) {\n\t\t\tcontent = this._normalize( content );\n\t\t}\n\t\tthis._trigger( \"response\", null, { content: content } );\n\t\tif ( !this.options.disabled && content && content.length && !this.cancelSearch ) {\n\t\t\tthis._suggest( content );\n\t\t\tthis._trigger( \"open\" );\n\t\t} else {\n\n\t\t\t// use ._close() instead of .close() so we don't cancel future searches\n\t\t\tthis._close();\n\t\t}\n\t},\n\n\tclose: function( event ) {\n\t\tthis.cancelSearch = true;\n\t\tthis._close( event );\n\t},\n\n\t_close: function( event ) {\n\n\t\t// Remove the handler that closes the menu on outside clicks\n\t\tthis._off( this.document, \"mousedown\" );\n\n\t\tif ( this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis.menu.element.hide();\n\t\t\tthis.menu.blur();\n\t\t\tthis.isNewMenu = true;\n\t\t\tthis._trigger( \"close\", event );\n\t\t}\n\t},\n\n\t_change: function( event ) {\n\t\tif ( this.previous !== this._value() ) {\n\t\t\tthis._trigger( \"change\", event, { item: this.selectedItem } );\n\t\t}\n\t},\n\n\t_normalize: function( items ) {\n\n\t\t// assume all items have the right format when the first item is complete\n\t\tif ( items.length && items[ 0 ].label && items[ 0 ].value ) {\n\t\t\treturn items;\n\t\t}\n\t\treturn $.map( items, function( item ) {\n\t\t\tif ( typeof item === \"string\" ) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: item,\n\t\t\t\t\tvalue: item\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn $.extend( {}, item, {\n\t\t\t\tlabel: item.label || item.value,\n\t\t\t\tvalue: item.value || item.label\n\t\t\t} );\n\t\t} );\n\t},\n\n\t_suggest: function( items ) {\n\t\tvar ul = this.menu.element.empty();\n\t\tthis._renderMenu( ul, items );\n\t\tthis.isNewMenu = true;\n\t\tthis.menu.refresh();\n\n\t\t// Size and position menu\n\t\tul.show();\n\t\tthis._resizeMenu();\n\t\tul.position( $.extend( {\n\t\t\tof: this.element\n\t\t}, this.options.position ) );\n\n\t\tif ( this.options.autoFocus ) {\n\t\t\tthis.menu.next();\n\t\t}\n\n\t\t// Listen for interactions outside of the widget (#6642)\n\t\tthis._on( this.document, {\n\t\t\tmousedown: \"_closeOnClickOutside\"\n\t\t} );\n\t},\n\n\t_resizeMenu: function() {\n\t\tvar ul = this.menu.element;\n\t\tul.outerWidth( Math.max(\n\n\t\t\t// Firefox wraps long text (possibly a rounding bug)\n\t\t\t// so we add 1px to avoid the wrapping (#7513)\n\t\t\tul.width( \"\" ).outerWidth() + 1,\n\t\t\tthis.element.outerWidth()\n\t\t) );\n\t},\n\n\t_renderMenu: function( ul, items ) {\n\t\tvar that = this;\n\t\t$.each( items, function( index, item ) {\n\t\t\tthat._renderItemData( ul, item );\n\t\t} );\n\t},\n\n\t_renderItemData: function( ul, item ) {\n\t\treturn this._renderItem( ul, item ).data( \"ui-autocomplete-item\", item );\n\t},\n\n\t_renderItem: function( ul, item ) {\n\t\treturn $( \"<li>\" )\n\t\t\t.append( $( \"<div>\" ).text( item.label ) )\n\t\t\t.appendTo( ul );\n\t},\n\n\t_move: function( direction, event ) {\n\t\tif ( !this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis.search( null, event );\n\t\t\treturn;\n\t\t}\n\t\tif ( this.menu.isFirstItem() && /^previous/.test( direction ) ||\n\t\t\t\tthis.menu.isLastItem() && /^next/.test( direction ) ) {\n\n\t\t\tif ( !this.isMultiLine ) {\n\t\t\t\tthis._value( this.term );\n\t\t\t}\n\n\t\t\tthis.menu.blur();\n\t\t\treturn;\n\t\t}\n\t\tthis.menu[ direction ]( event );\n\t},\n\n\twidget: function() {\n\t\treturn this.menu.element;\n\t},\n\n\t_value: function() {\n\t\treturn this.valueMethod.apply( this.element, arguments );\n\t},\n\n\t_keyEvent: function( keyEvent, event ) {\n\t\tif ( !this.isMultiLine || this.menu.element.is( \":visible\" ) ) {\n\t\t\tthis._move( keyEvent, event );\n\n\t\t\t// Prevents moving cursor to beginning/end of the text field in some browsers\n\t\t\tevent.preventDefault();\n\t\t}\n\t},\n\n\t// Support: Chrome <=50\n\t// We should be able to just use this.element.prop( \"isContentEditable\" )\n\t// but hidden elements always report false in Chrome.\n\t// https://code.google.com/p/chromium/issues/detail?id=313082\n\t_isContentEditable: function( element ) {\n\t\tif ( !element.length ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar editable = element.prop( \"contentEditable\" );\n\n\t\tif ( editable === \"inherit\" ) {\n\t\t  return this._isContentEditable( element.parent() );\n\t\t}\n\n\t\treturn editable === \"true\";\n\t}\n} );\n\n$.extend( $.ui.autocomplete, {\n\tescapeRegex: function( value ) {\n\t\treturn value.replace( /[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\" );\n\t},\n\tfilter: function( array, term ) {\n\t\tvar matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), \"i\" );\n\t\treturn $.grep( array, function( value ) {\n\t\t\treturn matcher.test( value.label || value.value || value );\n\t\t} );\n\t}\n} );\n\n// Live region extension, adding a `messages` option\n// NOTE: This is an experimental API. We are still investigating\n// a full solution for string manipulation and internationalization.\n$.widget( \"ui.autocomplete\", $.ui.autocomplete, {\n\toptions: {\n\t\tmessages: {\n\t\t\tnoResults: \"No search results.\",\n\t\t\tresults: function( amount ) {\n\t\t\t\treturn amount + ( amount > 1 ? \" results are\" : \" result is\" ) +\n\t\t\t\t\t\" available, use up and down arrow keys to navigate.\";\n\t\t\t}\n\t\t}\n\t},\n\n\t__response: function( content ) {\n\t\tvar message;\n\t\tthis._superApply( arguments );\n\t\tif ( this.options.disabled || this.cancelSearch ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( content && content.length ) {\n\t\t\tmessage = this.options.messages.results( content.length );\n\t\t} else {\n\t\t\tmessage = this.options.messages.noResults;\n\t\t}\n\t\tthis.liveRegion.children().hide();\n\t\t$( \"<div>\" ).text( message ).appendTo( this.liveRegion );\n\t}\n} );\n\nvar widgetsAutocomplete = $.ui.autocomplete;\n\n\n/*!\n * jQuery UI Controlgroup 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Controlgroup\n//>>group: Widgets\n//>>description: Visually groups form control widgets\n//>>docs: http://api.jqueryui.com/controlgroup/\n//>>demos: http://jqueryui.com/controlgroup/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/controlgroup.css\n//>>css.theme: ../../themes/base/theme.css\n\n\nvar controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g;\n\nvar widgetsControlgroup = $.widget( \"ui.controlgroup\", {\n\tversion: \"1.12.1\",\n\tdefaultElement: \"<div>\",\n\toptions: {\n\t\tdirection: \"horizontal\",\n\t\tdisabled: null,\n\t\tonlyVisible: true,\n\t\titems: {\n\t\t\t\"button\": \"input[type=button], input[type=submit], input[type=reset], button, a\",\n\t\t\t\"controlgroupLabel\": \".ui-controlgroup-label\",\n\t\t\t\"checkboxradio\": \"input[type='checkbox'], input[type='radio']\",\n\t\t\t\"selectmenu\": \"select\",\n\t\t\t\"spinner\": \".ui-spinner-input\"\n\t\t}\n\t},\n\n\t_create: function() {\n\t\tthis._enhance();\n\t},\n\n\t// To support the enhanced option in jQuery Mobile, we isolate DOM manipulation\n\t_enhance: function() {\n\t\tthis.element.attr( \"role\", \"toolbar\" );\n\t\tthis.refresh();\n\t},\n\n\t_destroy: function() {\n\t\tthis._callChildMethod( \"destroy\" );\n\t\tthis.childWidgets.removeData( \"ui-controlgroup-data\" );\n\t\tthis.element.removeAttr( \"role\" );\n\t\tif ( this.options.items.controlgroupLabel ) {\n\t\t\tthis.element\n\t\t\t\t.find( this.options.items.controlgroupLabel )\n\t\t\t\t.find( \".ui-controlgroup-label-contents\" )\n\t\t\t\t.contents().unwrap();\n\t\t}\n\t},\n\n\t_initWidgets: function() {\n\t\tvar that = this,\n\t\t\tchildWidgets = [];\n\n\t\t// First we iterate over each of the items options\n\t\t$.each( this.options.items, function( widget, selector ) {\n\t\t\tvar labels;\n\t\t\tvar options = {};\n\n\t\t\t// Make sure the widget has a selector set\n\t\t\tif ( !selector ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( widget === \"controlgroupLabel\" ) {\n\t\t\t\tlabels = that.element.find( selector );\n\t\t\t\tlabels.each( function() {\n\t\t\t\t\tvar element = $( this );\n\n\t\t\t\t\tif ( element.children( \".ui-controlgroup-label-contents\" ).length ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telement.contents()\n\t\t\t\t\t\t.wrapAll( \"<span class='ui-controlgroup-label-contents'></span>\" );\n\t\t\t\t} );\n\t\t\t\tthat._addClass( labels, null, \"ui-widget ui-widget-content ui-state-default\" );\n\t\t\t\tchildWidgets = childWidgets.concat( labels.get() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Make sure the widget actually exists\n\t\t\tif ( !$.fn[ widget ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// We assume everything is in the middle to start because we can't determine\n\t\t\t// first / last elements until all enhancments are done.\n\t\t\tif ( that[ \"_\" + widget + \"Options\" ] ) {\n\t\t\t\toptions = that[ \"_\" + widget + \"Options\" ]( \"middle\" );\n\t\t\t} else {\n\t\t\t\toptions = { classes: {} };\n\t\t\t}\n\n\t\t\t// Find instances of this widget inside controlgroup and init them\n\t\t\tthat.element\n\t\t\t\t.find( selector )\n\t\t\t\t.each( function() {\n\t\t\t\t\tvar element = $( this );\n\t\t\t\t\tvar instance = element[ widget ]( \"instance\" );\n\n\t\t\t\t\t// We need to clone the default options for this type of widget to avoid\n\t\t\t\t\t// polluting the variable options which has a wider scope than a single widget.\n\t\t\t\t\tvar instanceOptions = $.widget.extend( {}, options );\n\n\t\t\t\t\t// If the button is the child of a spinner ignore it\n\t\t\t\t\t// TODO: Find a more generic solution\n\t\t\t\t\tif ( widget === \"button\" && element.parent( \".ui-spinner\" ).length ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Create the widget if it doesn't exist\n\t\t\t\t\tif ( !instance ) {\n\t\t\t\t\t\tinstance = element[ widget ]()[ widget ]( \"instance\" );\n\t\t\t\t\t}\n\t\t\t\t\tif ( instance ) {\n\t\t\t\t\t\tinstanceOptions.classes =\n\t\t\t\t\t\t\tthat._resolveClassesValues( instanceOptions.classes, instance );\n\t\t\t\t\t}\n\t\t\t\t\telement[ widget ]( instanceOptions );\n\n\t\t\t\t\t// Store an instance of the controlgroup to be able to reference\n\t\t\t\t\t// from the outermost element for changing options and refresh\n\t\t\t\t\tvar widgetElement = element[ widget ]( \"widget\" );\n\t\t\t\t\t$.data( widgetElement[ 0 ], \"ui-controlgroup-data\",\n\t\t\t\t\t\tinstance ? instance : element[ widget ]( \"instance\" ) );\n\n\t\t\t\t\tchildWidgets.push( widgetElement[ 0 ] );\n\t\t\t\t} );\n\t\t} );\n\n\t\tthis.childWidgets = $( $.unique( childWidgets ) );\n\t\tthis._addClass( this.childWidgets, \"ui-controlgroup-item\" );\n\t},\n\n\t_callChildMethod: function( method ) {\n\t\tthis.childWidgets.each( function() {\n\t\t\tvar element = $( this ),\n\t\t\t\tdata = element.data( \"ui-controlgroup-data\" );\n\t\t\tif ( data && data[ method ] ) {\n\t\t\t\tdata[ method ]();\n\t\t\t}\n\t\t} );\n\t},\n\n\t_updateCornerClass: function( element, position ) {\n\t\tvar remove = \"ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all\";\n\t\tvar add = this._buildSimpleOptions( position, \"label\" ).classes.label;\n\n\t\tthis._removeClass( element, null, remove );\n\t\tthis._addClass( element, null, add );\n\t},\n\n\t_buildSimpleOptions: function( position, key ) {\n\t\tvar direction = this.options.direction === \"vertical\";\n\t\tvar result = {\n\t\t\tclasses: {}\n\t\t};\n\t\tresult.classes[ key ] = {\n\t\t\t\"middle\": \"\",\n\t\t\t\"first\": \"ui-corner-\" + ( direction ? \"top\" : \"left\" ),\n\t\t\t\"last\": \"ui-corner-\" + ( direction ? \"bottom\" : \"right\" ),\n\t\t\t\"only\": \"ui-corner-all\"\n\t\t}[ position ];\n\n\t\treturn result;\n\t},\n\n\t_spinnerOptions: function( position ) {\n\t\tvar options = this._buildSimpleOptions( position, \"ui-spinner\" );\n\n\t\toptions.classes[ \"ui-spinner-up\" ] = \"\";\n\t\toptions.classes[ \"ui-spinner-down\" ] = \"\";\n\n\t\treturn options;\n\t},\n\n\t_buttonOptions: function( position ) {\n\t\treturn this._buildSimpleOptions( position, \"ui-button\" );\n\t},\n\n\t_checkboxradioOptions: function( position ) {\n\t\treturn this._buildSimpleOptions( position, \"ui-checkboxradio-label\" );\n\t},\n\n\t_selectmenuOptions: function( position ) {\n\t\tvar direction = this.options.direction === \"vertical\";\n\t\treturn {\n\t\t\twidth: direction ? \"auto\" : false,\n\t\t\tclasses: {\n\t\t\t\tmiddle: {\n\t\t\t\t\t\"ui-selectmenu-button-open\": \"\",\n\t\t\t\t\t\"ui-selectmenu-button-closed\": \"\"\n\t\t\t\t},\n\t\t\t\tfirst: {\n\t\t\t\t\t\"ui-selectmenu-button-open\": \"ui-corner-\" + ( direction ? \"top\" : \"tl\" ),\n\t\t\t\t\t\"ui-selectmenu-button-closed\": \"ui-corner-\" + ( direction ? \"top\" : \"left\" )\n\t\t\t\t},\n\t\t\t\tlast: {\n\t\t\t\t\t\"ui-selectmenu-button-open\": direction ? \"\" : \"ui-corner-tr\",\n\t\t\t\t\t\"ui-selectmenu-button-closed\": \"ui-corner-\" + ( direction ? \"bottom\" : \"right\" )\n\t\t\t\t},\n\t\t\t\tonly: {\n\t\t\t\t\t\"ui-selectmenu-button-open\": \"ui-corner-top\",\n\t\t\t\t\t\"ui-selectmenu-button-closed\": \"ui-corner-all\"\n\t\t\t\t}\n\n\t\t\t}[ position ]\n\t\t};\n\t},\n\n\t_resolveClassesValues: function( classes, instance ) {\n\t\tvar result = {};\n\t\t$.each( classes, function( key ) {\n\t\t\tvar current = instance.options.classes[ key ] || \"\";\n\t\t\tcurrent = $.trim( current.replace( controlgroupCornerRegex, \"\" ) );\n\t\t\tresult[ key ] = ( current + \" \" + classes[ key ] ).replace( /\\s+/g, \" \" );\n\t\t} );\n\t\treturn result;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"direction\" ) {\n\t\t\tthis._removeClass( \"ui-controlgroup-\" + this.options.direction );\n\t\t}\n\n\t\tthis._super( key, value );\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._callChildMethod( value ? \"disable\" : \"enable\" );\n\t\t\treturn;\n\t\t}\n\n\t\tthis.refresh();\n\t},\n\n\trefresh: function() {\n\t\tvar children,\n\t\t\tthat = this;\n\n\t\tthis._addClass( \"ui-controlgroup ui-controlgroup-\" + this.options.direction );\n\n\t\tif ( this.options.direction === \"horizontal\" ) {\n\t\t\tthis._addClass( null, \"ui-helper-clearfix\" );\n\t\t}\n\t\tthis._initWidgets();\n\n\t\tchildren = this.childWidgets;\n\n\t\t// We filter here because we need to track all childWidgets not just the visible ones\n\t\tif ( this.options.onlyVisible ) {\n\t\t\tchildren = children.filter( \":visible\" );\n\t\t}\n\n\t\tif ( children.length ) {\n\n\t\t\t// We do this last because we need to make sure all enhancment is done\n\t\t\t// before determining first and last\n\t\t\t$.each( [ \"first\", \"last\" ], function( index, value ) {\n\t\t\t\tvar instance = children[ value ]().data( \"ui-controlgroup-data\" );\n\n\t\t\t\tif ( instance && that[ \"_\" + instance.widgetName + \"Options\" ] ) {\n\t\t\t\t\tvar options = that[ \"_\" + instance.widgetName + \"Options\" ](\n\t\t\t\t\t\tchildren.length === 1 ? \"only\" : value\n\t\t\t\t\t);\n\t\t\t\t\toptions.classes = that._resolveClassesValues( options.classes, instance );\n\t\t\t\t\tinstance.element[ instance.widgetName ]( options );\n\t\t\t\t} else {\n\t\t\t\t\tthat._updateCornerClass( children[ value ](), value );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Finally call the refresh method on each of the child widgets.\n\t\t\tthis._callChildMethod( \"refresh\" );\n\t\t}\n\t}\n} );\n\n/*!\n * jQuery UI Checkboxradio 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Checkboxradio\n//>>group: Widgets\n//>>description: Enhances a form with multiple themeable checkboxes or radio buttons.\n//>>docs: http://api.jqueryui.com/checkboxradio/\n//>>demos: http://jqueryui.com/checkboxradio/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/button.css\n//>>css.structure: ../../themes/base/checkboxradio.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.checkboxradio\", [ $.ui.formResetMixin, {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tdisabled: null,\n\t\tlabel: null,\n\t\ticon: true,\n\t\tclasses: {\n\t\t\t\"ui-checkboxradio-label\": \"ui-corner-all\",\n\t\t\t\"ui-checkboxradio-icon\": \"ui-corner-all\"\n\t\t}\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar disabled, labels;\n\t\tvar that = this;\n\t\tvar options = this._super() || {};\n\n\t\t// We read the type here, because it makes more sense to throw a element type error first,\n\t\t// rather then the error for lack of a label. Often if its the wrong type, it\n\t\t// won't have a label (e.g. calling on a div, btn, etc)\n\t\tthis._readType();\n\n\t\tlabels = this.element.labels();\n\n\t\t// If there are multiple labels, use the last one\n\t\tthis.label = $( labels[ labels.length - 1 ] );\n\t\tif ( !this.label.length ) {\n\t\t\t$.error( \"No label found for checkboxradio widget\" );\n\t\t}\n\n\t\tthis.originalLabel = \"\";\n\n\t\t// We need to get the label text but this may also need to make sure it does not contain the\n\t\t// input itself.\n\t\tthis.label.contents().not( this.element[ 0 ] ).each( function() {\n\n\t\t\t// The label contents could be text, html, or a mix. We concat each element to get a\n\t\t\t// string representation of the label, without the input as part of it.\n\t\t\tthat.originalLabel += this.nodeType === 3 ? $( this ).text() : this.outerHTML;\n\t\t} );\n\n\t\t// Set the label option if we found label text\n\t\tif ( this.originalLabel ) {\n\t\t\toptions.label = this.originalLabel;\n\t\t}\n\n\t\tdisabled = this.element[ 0 ].disabled;\n\t\tif ( disabled != null ) {\n\t\t\toptions.disabled = disabled;\n\t\t}\n\t\treturn options;\n\t},\n\n\t_create: function() {\n\t\tvar checked = this.element[ 0 ].checked;\n\n\t\tthis._bindFormResetHandler();\n\n\t\tif ( this.options.disabled == null ) {\n\t\t\tthis.options.disabled = this.element[ 0 ].disabled;\n\t\t}\n\n\t\tthis._setOption( \"disabled\", this.options.disabled );\n\t\tthis._addClass( \"ui-checkboxradio\", \"ui-helper-hidden-accessible\" );\n\t\tthis._addClass( this.label, \"ui-checkboxradio-label\", \"ui-button ui-widget\" );\n\n\t\tif ( this.type === \"radio\" ) {\n\t\t\tthis._addClass( this.label, \"ui-checkboxradio-radio-label\" );\n\t\t}\n\n\t\tif ( this.options.label && this.options.label !== this.originalLabel ) {\n\t\t\tthis._updateLabel();\n\t\t} else if ( this.originalLabel ) {\n\t\t\tthis.options.label = this.originalLabel;\n\t\t}\n\n\t\tthis._enhance();\n\n\t\tif ( checked ) {\n\t\t\tthis._addClass( this.label, \"ui-checkboxradio-checked\", \"ui-state-active\" );\n\t\t\tif ( this.icon ) {\n\t\t\t\tthis._addClass( this.icon, null, \"ui-state-hover\" );\n\t\t\t}\n\t\t}\n\n\t\tthis._on( {\n\t\t\tchange: \"_toggleClasses\",\n\t\t\tfocus: function() {\n\t\t\t\tthis._addClass( this.label, null, \"ui-state-focus ui-visual-focus\" );\n\t\t\t},\n\t\t\tblur: function() {\n\t\t\t\tthis._removeClass( this.label, null, \"ui-state-focus ui-visual-focus\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_readType: function() {\n\t\tvar nodeName = this.element[ 0 ].nodeName.toLowerCase();\n\t\tthis.type = this.element[ 0 ].type;\n\t\tif ( nodeName !== \"input\" || !/radio|checkbox/.test( this.type ) ) {\n\t\t\t$.error( \"Can't create checkboxradio on element.nodeName=\" + nodeName +\n\t\t\t\t\" and element.type=\" + this.type );\n\t\t}\n\t},\n\n\t// Support jQuery Mobile enhanced option\n\t_enhance: function() {\n\t\tthis._updateIcon( this.element[ 0 ].checked );\n\t},\n\n\twidget: function() {\n\t\treturn this.label;\n\t},\n\n\t_getRadioGroup: function() {\n\t\tvar group;\n\t\tvar name = this.element[ 0 ].name;\n\t\tvar nameSelector = \"input[name='\" + $.ui.escapeSelector( name ) + \"']\";\n\n\t\tif ( !name ) {\n\t\t\treturn $( [] );\n\t\t}\n\n\t\tif ( this.form.length ) {\n\t\t\tgroup = $( this.form[ 0 ].elements ).filter( nameSelector );\n\t\t} else {\n\n\t\t\t// Not inside a form, check all inputs that also are not inside a form\n\t\t\tgroup = $( nameSelector ).filter( function() {\n\t\t\t\treturn $( this ).form().length === 0;\n\t\t\t} );\n\t\t}\n\n\t\treturn group.not( this.element );\n\t},\n\n\t_toggleClasses: function() {\n\t\tvar checked = this.element[ 0 ].checked;\n\t\tthis._toggleClass( this.label, \"ui-checkboxradio-checked\", \"ui-state-active\", checked );\n\n\t\tif ( this.options.icon && this.type === \"checkbox\" ) {\n\t\t\tthis._toggleClass( this.icon, null, \"ui-icon-check ui-state-checked\", checked )\n\t\t\t\t._toggleClass( this.icon, null, \"ui-icon-blank\", !checked );\n\t\t}\n\n\t\tif ( this.type === \"radio\" ) {\n\t\t\tthis._getRadioGroup()\n\t\t\t\t.each( function() {\n\t\t\t\t\tvar instance = $( this ).checkboxradio( \"instance\" );\n\n\t\t\t\t\tif ( instance ) {\n\t\t\t\t\t\tinstance._removeClass( instance.label,\n\t\t\t\t\t\t\t\"ui-checkboxradio-checked\", \"ui-state-active\" );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tthis._unbindFormResetHandler();\n\n\t\tif ( this.icon ) {\n\t\t\tthis.icon.remove();\n\t\t\tthis.iconSpace.remove();\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\n\t\t// We don't allow the value to be set to nothing\n\t\tif ( key === \"label\" && !value ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._toggleClass( this.label, null, \"ui-state-disabled\", value );\n\t\t\tthis.element[ 0 ].disabled = value;\n\n\t\t\t// Don't refresh when setting disabled\n\t\t\treturn;\n\t\t}\n\t\tthis.refresh();\n\t},\n\n\t_updateIcon: function( checked ) {\n\t\tvar toAdd = \"ui-icon ui-icon-background \";\n\n\t\tif ( this.options.icon ) {\n\t\t\tif ( !this.icon ) {\n\t\t\t\tthis.icon = $( \"<span>\" );\n\t\t\t\tthis.iconSpace = $( \"<span> </span>\" );\n\t\t\t\tthis._addClass( this.iconSpace, \"ui-checkboxradio-icon-space\" );\n\t\t\t}\n\n\t\t\tif ( this.type === \"checkbox\" ) {\n\t\t\t\ttoAdd += checked ? \"ui-icon-check ui-state-checked\" : \"ui-icon-blank\";\n\t\t\t\tthis._removeClass( this.icon, null, checked ? \"ui-icon-blank\" : \"ui-icon-check\" );\n\t\t\t} else {\n\t\t\t\ttoAdd += \"ui-icon-blank\";\n\t\t\t}\n\t\t\tthis._addClass( this.icon, \"ui-checkboxradio-icon\", toAdd );\n\t\t\tif ( !checked ) {\n\t\t\t\tthis._removeClass( this.icon, null, \"ui-icon-check ui-state-checked\" );\n\t\t\t}\n\t\t\tthis.icon.prependTo( this.label ).after( this.iconSpace );\n\t\t} else if ( this.icon !== undefined ) {\n\t\t\tthis.icon.remove();\n\t\t\tthis.iconSpace.remove();\n\t\t\tdelete this.icon;\n\t\t}\n\t},\n\n\t_updateLabel: function() {\n\n\t\t// Remove the contents of the label ( minus the icon, icon space, and input )\n\t\tvar contents = this.label.contents().not( this.element[ 0 ] );\n\t\tif ( this.icon ) {\n\t\t\tcontents = contents.not( this.icon[ 0 ] );\n\t\t}\n\t\tif ( this.iconSpace ) {\n\t\t\tcontents = contents.not( this.iconSpace[ 0 ] );\n\t\t}\n\t\tcontents.remove();\n\n\t\tthis.label.append( this.options.label );\n\t},\n\n\trefresh: function() {\n\t\tvar checked = this.element[ 0 ].checked,\n\t\t\tisDisabled = this.element[ 0 ].disabled;\n\n\t\tthis._updateIcon( checked );\n\t\tthis._toggleClass( this.label, \"ui-checkboxradio-checked\", \"ui-state-active\", checked );\n\t\tif ( this.options.label !== null ) {\n\t\t\tthis._updateLabel();\n\t\t}\n\n\t\tif ( isDisabled !== this.options.disabled ) {\n\t\t\tthis._setOptions( { \"disabled\": isDisabled } );\n\t\t}\n\t}\n\n} ] );\n\nvar widgetsCheckboxradio = $.ui.checkboxradio;\n\n\n/*!\n * jQuery UI Button 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Button\n//>>group: Widgets\n//>>description: Enhances a form with themeable buttons.\n//>>docs: http://api.jqueryui.com/button/\n//>>demos: http://jqueryui.com/button/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/button.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.button\", {\n\tversion: \"1.12.1\",\n\tdefaultElement: \"<button>\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-button\": \"ui-corner-all\"\n\t\t},\n\t\tdisabled: null,\n\t\ticon: null,\n\t\ticonPosition: \"beginning\",\n\t\tlabel: null,\n\t\tshowLabel: true\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar disabled,\n\n\t\t\t// This is to support cases like in jQuery Mobile where the base widget does have\n\t\t\t// an implementation of _getCreateOptions\n\t\t\toptions = this._super() || {};\n\n\t\tthis.isInput = this.element.is( \"input\" );\n\n\t\tdisabled = this.element[ 0 ].disabled;\n\t\tif ( disabled != null ) {\n\t\t\toptions.disabled = disabled;\n\t\t}\n\n\t\tthis.originalLabel = this.isInput ? this.element.val() : this.element.html();\n\t\tif ( this.originalLabel ) {\n\t\t\toptions.label = this.originalLabel;\n\t\t}\n\n\t\treturn options;\n\t},\n\n\t_create: function() {\n\t\tif ( !this.option.showLabel & !this.options.icon ) {\n\t\t\tthis.options.showLabel = true;\n\t\t}\n\n\t\t// We have to check the option again here even though we did in _getCreateOptions,\n\t\t// because null may have been passed on init which would override what was set in\n\t\t// _getCreateOptions\n\t\tif ( this.options.disabled == null ) {\n\t\t\tthis.options.disabled = this.element[ 0 ].disabled || false;\n\t\t}\n\n\t\tthis.hasTitle = !!this.element.attr( \"title\" );\n\n\t\t// Check to see if the label needs to be set or if its already correct\n\t\tif ( this.options.label && this.options.label !== this.originalLabel ) {\n\t\t\tif ( this.isInput ) {\n\t\t\t\tthis.element.val( this.options.label );\n\t\t\t} else {\n\t\t\t\tthis.element.html( this.options.label );\n\t\t\t}\n\t\t}\n\t\tthis._addClass( \"ui-button\", \"ui-widget\" );\n\t\tthis._setOption( \"disabled\", this.options.disabled );\n\t\tthis._enhance();\n\n\t\tif ( this.element.is( \"a\" ) ) {\n\t\t\tthis._on( {\n\t\t\t\t\"keyup\": function( event ) {\n\t\t\t\t\tif ( event.keyCode === $.ui.keyCode.SPACE ) {\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Support: PhantomJS <= 1.9, IE 8 Only\n\t\t\t\t\t\t// If a native click is available use it so we actually cause navigation\n\t\t\t\t\t\t// otherwise just trigger a click event\n\t\t\t\t\t\tif ( this.element[ 0 ].click ) {\n\t\t\t\t\t\t\tthis.element[ 0 ].click();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.element.trigger( \"click\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t},\n\n\t_enhance: function() {\n\t\tif ( !this.element.is( \"button\" ) ) {\n\t\t\tthis.element.attr( \"role\", \"button\" );\n\t\t}\n\n\t\tif ( this.options.icon ) {\n\t\t\tthis._updateIcon( \"icon\", this.options.icon );\n\t\t\tthis._updateTooltip();\n\t\t}\n\t},\n\n\t_updateTooltip: function() {\n\t\tthis.title = this.element.attr( \"title\" );\n\n\t\tif ( !this.options.showLabel && !this.title ) {\n\t\t\tthis.element.attr( \"title\", this.options.label );\n\t\t}\n\t},\n\n\t_updateIcon: function( option, value ) {\n\t\tvar icon = option !== \"iconPosition\",\n\t\t\tposition = icon ? this.options.iconPosition : value,\n\t\t\tdisplayBlock = position === \"top\" || position === \"bottom\";\n\n\t\t// Create icon\n\t\tif ( !this.icon ) {\n\t\t\tthis.icon = $( \"<span>\" );\n\n\t\t\tthis._addClass( this.icon, \"ui-button-icon\", \"ui-icon\" );\n\n\t\t\tif ( !this.options.showLabel ) {\n\t\t\t\tthis._addClass( \"ui-button-icon-only\" );\n\t\t\t}\n\t\t} else if ( icon ) {\n\n\t\t\t// If we are updating the icon remove the old icon class\n\t\t\tthis._removeClass( this.icon, null, this.options.icon );\n\t\t}\n\n\t\t// If we are updating the icon add the new icon class\n\t\tif ( icon ) {\n\t\t\tthis._addClass( this.icon, null, value );\n\t\t}\n\n\t\tthis._attachIcon( position );\n\n\t\t// If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove\n\t\t// the iconSpace if there is one.\n\t\tif ( displayBlock ) {\n\t\t\tthis._addClass( this.icon, null, \"ui-widget-icon-block\" );\n\t\t\tif ( this.iconSpace ) {\n\t\t\t\tthis.iconSpace.remove();\n\t\t\t}\n\t\t} else {\n\n\t\t\t// Position is beginning or end so remove the ui-widget-icon-block class and add the\n\t\t\t// space if it does not exist\n\t\t\tif ( !this.iconSpace ) {\n\t\t\t\tthis.iconSpace = $( \"<span> </span>\" );\n\t\t\t\tthis._addClass( this.iconSpace, \"ui-button-icon-space\" );\n\t\t\t}\n\t\t\tthis._removeClass( this.icon, null, \"ui-wiget-icon-block\" );\n\t\t\tthis._attachIconSpace( position );\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tthis.element.removeAttr( \"role\" );\n\n\t\tif ( this.icon ) {\n\t\t\tthis.icon.remove();\n\t\t}\n\t\tif ( this.iconSpace ) {\n\t\t\tthis.iconSpace.remove();\n\t\t}\n\t\tif ( !this.hasTitle ) {\n\t\t\tthis.element.removeAttr( \"title\" );\n\t\t}\n\t},\n\n\t_attachIconSpace: function( iconPosition ) {\n\t\tthis.icon[ /^(?:end|bottom)/.test( iconPosition ) ? \"before\" : \"after\" ]( this.iconSpace );\n\t},\n\n\t_attachIcon: function( iconPosition ) {\n\t\tthis.element[ /^(?:end|bottom)/.test( iconPosition ) ? \"append\" : \"prepend\" ]( this.icon );\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar newShowLabel = options.showLabel === undefined ?\n\t\t\t\tthis.options.showLabel :\n\t\t\t\toptions.showLabel,\n\t\t\tnewIcon = options.icon === undefined ? this.options.icon : options.icon;\n\n\t\tif ( !newShowLabel && !newIcon ) {\n\t\t\toptions.showLabel = true;\n\t\t}\n\t\tthis._super( options );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"icon\" ) {\n\t\t\tif ( value ) {\n\t\t\t\tthis._updateIcon( key, value );\n\t\t\t} else if ( this.icon ) {\n\t\t\t\tthis.icon.remove();\n\t\t\t\tif ( this.iconSpace ) {\n\t\t\t\t\tthis.iconSpace.remove();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"iconPosition\" ) {\n\t\t\tthis._updateIcon( key, value );\n\t\t}\n\n\t\t// Make sure we can't end up with a button that has neither text nor icon\n\t\tif ( key === \"showLabel\" ) {\n\t\t\t\tthis._toggleClass( \"ui-button-icon-only\", null, !value );\n\t\t\t\tthis._updateTooltip();\n\t\t}\n\n\t\tif ( key === \"label\" ) {\n\t\t\tif ( this.isInput ) {\n\t\t\t\tthis.element.val( value );\n\t\t\t} else {\n\n\t\t\t\t// If there is an icon, append it, else nothing then append the value\n\t\t\t\t// this avoids removal of the icon when setting label text\n\t\t\t\tthis.element.html( value );\n\t\t\t\tif ( this.icon ) {\n\t\t\t\t\tthis._attachIcon( this.options.iconPosition );\n\t\t\t\t\tthis._attachIconSpace( this.options.iconPosition );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._toggleClass( null, \"ui-state-disabled\", value );\n\t\t\tthis.element[ 0 ].disabled = value;\n\t\t\tif ( value ) {\n\t\t\t\tthis.element.blur();\n\t\t\t}\n\t\t}\n\t},\n\n\trefresh: function() {\n\n\t\t// Make sure to only check disabled if its an element that supports this otherwise\n\t\t// check for the disabled class to determine state\n\t\tvar isDisabled = this.element.is( \"input, button\" ) ?\n\t\t\tthis.element[ 0 ].disabled : this.element.hasClass( \"ui-button-disabled\" );\n\n\t\tif ( isDisabled !== this.options.disabled ) {\n\t\t\tthis._setOptions( { disabled: isDisabled } );\n\t\t}\n\n\t\tthis._updateTooltip();\n\t}\n} );\n\n// DEPRECATED\nif ( $.uiBackCompat !== false ) {\n\n\t// Text and Icons options\n\t$.widget( \"ui.button\", $.ui.button, {\n\t\toptions: {\n\t\t\ttext: true,\n\t\t\ticons: {\n\t\t\t\tprimary: null,\n\t\t\t\tsecondary: null\n\t\t\t}\n\t\t},\n\n\t\t_create: function() {\n\t\t\tif ( this.options.showLabel && !this.options.text ) {\n\t\t\t\tthis.options.showLabel = this.options.text;\n\t\t\t}\n\t\t\tif ( !this.options.showLabel && this.options.text ) {\n\t\t\t\tthis.options.text = this.options.showLabel;\n\t\t\t}\n\t\t\tif ( !this.options.icon && ( this.options.icons.primary ||\n\t\t\t\t\tthis.options.icons.secondary ) ) {\n\t\t\t\tif ( this.options.icons.primary ) {\n\t\t\t\t\tthis.options.icon = this.options.icons.primary;\n\t\t\t\t} else {\n\t\t\t\t\tthis.options.icon = this.options.icons.secondary;\n\t\t\t\t\tthis.options.iconPosition = \"end\";\n\t\t\t\t}\n\t\t\t} else if ( this.options.icon ) {\n\t\t\t\tthis.options.icons.primary = this.options.icon;\n\t\t\t}\n\t\t\tthis._super();\n\t\t},\n\n\t\t_setOption: function( key, value ) {\n\t\t\tif ( key === \"text\" ) {\n\t\t\t\tthis._super( \"showLabel\", value );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( key === \"showLabel\" ) {\n\t\t\t\tthis.options.text = value;\n\t\t\t}\n\t\t\tif ( key === \"icon\" ) {\n\t\t\t\tthis.options.icons.primary = value;\n\t\t\t}\n\t\t\tif ( key === \"icons\" ) {\n\t\t\t\tif ( value.primary ) {\n\t\t\t\t\tthis._super( \"icon\", value.primary );\n\t\t\t\t\tthis._super( \"iconPosition\", \"beginning\" );\n\t\t\t\t} else if ( value.secondary ) {\n\t\t\t\t\tthis._super( \"icon\", value.secondary );\n\t\t\t\t\tthis._super( \"iconPosition\", \"end\" );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._superApply( arguments );\n\t\t}\n\t} );\n\n\t$.fn.button = ( function( orig ) {\n\t\treturn function() {\n\t\t\tif ( !this.length || ( this.length && this[ 0 ].tagName !== \"INPUT\" ) ||\n\t\t\t\t\t( this.length && this[ 0 ].tagName === \"INPUT\" && (\n\t\t\t\t\t\tthis.attr( \"type\" ) !== \"checkbox\" && this.attr( \"type\" ) !== \"radio\"\n\t\t\t\t\t) ) ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t}\n\t\t\tif ( !$.ui.checkboxradio ) {\n\t\t\t\t$.error( \"Checkboxradio widget missing\" );\n\t\t\t}\n\t\t\tif ( arguments.length === 0 ) {\n\t\t\t\treturn this.checkboxradio( {\n\t\t\t\t\t\"icon\": false\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn this.checkboxradio.apply( this, arguments );\n\t\t};\n\t} )( $.fn.button );\n\n\t$.fn.buttonset = function() {\n\t\tif ( !$.ui.controlgroup ) {\n\t\t\t$.error( \"Controlgroup widget missing\" );\n\t\t}\n\t\tif ( arguments[ 0 ] === \"option\" && arguments[ 1 ] === \"items\" && arguments[ 2 ] ) {\n\t\t\treturn this.controlgroup.apply( this,\n\t\t\t\t[ arguments[ 0 ], \"items.button\", arguments[ 2 ] ] );\n\t\t}\n\t\tif ( arguments[ 0 ] === \"option\" && arguments[ 1 ] === \"items\" ) {\n\t\t\treturn this.controlgroup.apply( this, [ arguments[ 0 ], \"items.button\" ] );\n\t\t}\n\t\tif ( typeof arguments[ 0 ] === \"object\" && arguments[ 0 ].items ) {\n\t\t\targuments[ 0 ].items = {\n\t\t\t\tbutton: arguments[ 0 ].items\n\t\t\t};\n\t\t}\n\t\treturn this.controlgroup.apply( this, arguments );\n\t};\n}\n\nvar widgetsButton = $.ui.button;\n\n\n// jscs:disable maximumLineLength\n/* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */\n/*!\n * jQuery UI Datepicker 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Datepicker\n//>>group: Widgets\n//>>description: Displays a calendar from an input or inline for selecting dates.\n//>>docs: http://api.jqueryui.com/datepicker/\n//>>demos: http://jqueryui.com/datepicker/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/datepicker.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.extend( $.ui, { datepicker: { version: \"1.12.1\" } } );\n\nvar datepicker_instActive;\n\nfunction datepicker_getZindex( elem ) {\n\tvar position, value;\n\twhile ( elem.length && elem[ 0 ] !== document ) {\n\n\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t// This makes behavior of this function consistent across browsers\n\t\t// WebKit always returns auto if the element is positioned\n\t\tposition = elem.css( \"position\" );\n\t\tif ( position === \"absolute\" || position === \"relative\" || position === \"fixed\" ) {\n\n\t\t\t// IE returns 0 when zIndex is not specified\n\t\t\t// other browsers return a string\n\t\t\t// we ignore the case of nested elements with an explicit value of 0\n\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\n\t\t\tvalue = parseInt( elem.css( \"zIndex\" ), 10 );\n\t\t\tif ( !isNaN( value ) && value !== 0 ) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t\telem = elem.parent();\n\t}\n\n\treturn 0;\n}\n/* Date picker manager.\n   Use the singleton instance of this class, $.datepicker, to interact with the date picker.\n   Settings for (groups of) date pickers are maintained in an instance object,\n   allowing multiple different settings on the same page. */\n\nfunction Datepicker() {\n\tthis._curInst = null; // The current instance in use\n\tthis._keyEvent = false; // If the last event was a key event\n\tthis._disabledInputs = []; // List of date picker inputs that have been disabled\n\tthis._datepickerShowing = false; // True if the popup picker is showing , false if not\n\tthis._inDialog = false; // True if showing within a \"dialog\", false if not\n\tthis._mainDivId = \"ui-datepicker-div\"; // The ID of the main datepicker division\n\tthis._inlineClass = \"ui-datepicker-inline\"; // The name of the inline marker class\n\tthis._appendClass = \"ui-datepicker-append\"; // The name of the append marker class\n\tthis._triggerClass = \"ui-datepicker-trigger\"; // The name of the trigger marker class\n\tthis._dialogClass = \"ui-datepicker-dialog\"; // The name of the dialog marker class\n\tthis._disableClass = \"ui-datepicker-disabled\"; // The name of the disabled covering marker class\n\tthis._unselectableClass = \"ui-datepicker-unselectable\"; // The name of the unselectable cell marker class\n\tthis._currentClass = \"ui-datepicker-current-day\"; // The name of the current day marker class\n\tthis._dayOverClass = \"ui-datepicker-days-cell-over\"; // The name of the day hover marker class\n\tthis.regional = []; // Available regional settings, indexed by language code\n\tthis.regional[ \"\" ] = { // Default regional settings\n\t\tcloseText: \"Done\", // Display text for close link\n\t\tprevText: \"Prev\", // Display text for previous month link\n\t\tnextText: \"Next\", // Display text for next month link\n\t\tcurrentText: \"Today\", // Display text for current month link\n\t\tmonthNames: [ \"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\n\t\t\t\"July\",\"August\",\"September\",\"October\",\"November\",\"December\" ], // Names of months for drop-down and formatting\n\t\tmonthNamesShort: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ], // For formatting\n\t\tdayNames: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ], // For formatting\n\t\tdayNamesShort: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ], // For formatting\n\t\tdayNamesMin: [ \"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\" ], // Column headings for days starting at Sunday\n\t\tweekHeader: \"Wk\", // Column header for week of the year\n\t\tdateFormat: \"mm/dd/yy\", // See format options on parseDate\n\t\tfirstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...\n\t\tisRTL: false, // True if right-to-left language, false if left-to-right\n\t\tshowMonthAfterYear: false, // True if the year select precedes month, false for month then year\n\t\tyearSuffix: \"\" // Additional text to append to the year in the month headers\n\t};\n\tthis._defaults = { // Global defaults for all the date picker instances\n\t\tshowOn: \"focus\", // \"focus\" for popup on focus,\n\t\t\t// \"button\" for trigger button, or \"both\" for either\n\t\tshowAnim: \"fadeIn\", // Name of jQuery animation for popup\n\t\tshowOptions: {}, // Options for enhanced animations\n\t\tdefaultDate: null, // Used when field is blank: actual date,\n\t\t\t// +/-number for offset from today, null for today\n\t\tappendText: \"\", // Display text following the input box, e.g. showing the format\n\t\tbuttonText: \"...\", // Text for trigger button\n\t\tbuttonImage: \"\", // URL for trigger button image\n\t\tbuttonImageOnly: false, // True if the image appears alone, false if it appears on a button\n\t\thideIfNoPrevNext: false, // True to hide next/previous month links\n\t\t\t// if not applicable, false to just disable them\n\t\tnavigationAsDateFormat: false, // True if date formatting applied to prev/today/next links\n\t\tgotoCurrent: false, // True if today link goes back to current selection instead\n\t\tchangeMonth: false, // True if month can be selected directly, false if only prev/next\n\t\tchangeYear: false, // True if year can be selected directly, false if only prev/next\n\t\tyearRange: \"c-10:c+10\", // Range of years to display in drop-down,\n\t\t\t// either relative to today's year (-nn:+nn), relative to currently displayed year\n\t\t\t// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)\n\t\tshowOtherMonths: false, // True to show dates in other months, false to leave blank\n\t\tselectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable\n\t\tshowWeek: false, // True to show week of the year, false to not show it\n\t\tcalculateWeek: this.iso8601Week, // How to calculate the week of the year,\n\t\t\t// takes a Date and returns the number of the week for it\n\t\tshortYearCutoff: \"+10\", // Short year values < this are in the current century,\n\t\t\t// > this are in the previous century,\n\t\t\t// string value starting with \"+\" for current year + value\n\t\tminDate: null, // The earliest selectable date, or null for no limit\n\t\tmaxDate: null, // The latest selectable date, or null for no limit\n\t\tduration: \"fast\", // Duration of display/closure\n\t\tbeforeShowDay: null, // Function that takes a date and returns an array with\n\t\t\t// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or \"\",\n\t\t\t// [2] = cell title (optional), e.g. $.datepicker.noWeekends\n\t\tbeforeShow: null, // Function that takes an input field and\n\t\t\t// returns a set of custom settings for the date picker\n\t\tonSelect: null, // Define a callback function when a date is selected\n\t\tonChangeMonthYear: null, // Define a callback function when the month or year is changed\n\t\tonClose: null, // Define a callback function when the datepicker is closed\n\t\tnumberOfMonths: 1, // Number of months to show at a time\n\t\tshowCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)\n\t\tstepMonths: 1, // Number of months to step back/forward\n\t\tstepBigMonths: 12, // Number of months to step back/forward for the big links\n\t\taltField: \"\", // Selector for an alternate field to store selected dates into\n\t\taltFormat: \"\", // The date format to use for the alternate field\n\t\tconstrainInput: true, // The input is constrained by the current date format\n\t\tshowButtonPanel: false, // True to show button panel, false to not show it\n\t\tautoSize: false, // True to size the input for the date format, false to leave as is\n\t\tdisabled: false // The initial disabled state\n\t};\n\t$.extend( this._defaults, this.regional[ \"\" ] );\n\tthis.regional.en = $.extend( true, {}, this.regional[ \"\" ] );\n\tthis.regional[ \"en-US\" ] = $.extend( true, {}, this.regional.en );\n\tthis.dpDiv = datepicker_bindHover( $( \"<div id='\" + this._mainDivId + \"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\" ) );\n}\n\n$.extend( Datepicker.prototype, {\n\t/* Class name added to elements to indicate already configured with a date picker. */\n\tmarkerClassName: \"hasDatepicker\",\n\n\t//Keep track of the maximum number of rows displayed (see #7043)\n\tmaxRows: 4,\n\n\t// TODO rename to \"widget\" when switching to widget factory\n\t_widgetDatepicker: function() {\n\t\treturn this.dpDiv;\n\t},\n\n\t/* Override the default settings for all instances of the date picker.\n\t * @param  settings  object - the new settings to use as defaults (anonymous object)\n\t * @return the manager object\n\t */\n\tsetDefaults: function( settings ) {\n\t\tdatepicker_extendRemove( this._defaults, settings || {} );\n\t\treturn this;\n\t},\n\n\t/* Attach the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t * @param  settings  object - the new settings to use for this date picker instance (anonymous)\n\t */\n\t_attachDatepicker: function( target, settings ) {\n\t\tvar nodeName, inline, inst;\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tinline = ( nodeName === \"div\" || nodeName === \"span\" );\n\t\tif ( !target.id ) {\n\t\t\tthis.uuid += 1;\n\t\t\ttarget.id = \"dp\" + this.uuid;\n\t\t}\n\t\tinst = this._newInst( $( target ), inline );\n\t\tinst.settings = $.extend( {}, settings || {} );\n\t\tif ( nodeName === \"input\" ) {\n\t\t\tthis._connectDatepicker( target, inst );\n\t\t} else if ( inline ) {\n\t\t\tthis._inlineDatepicker( target, inst );\n\t\t}\n\t},\n\n\t/* Create a new instance object. */\n\t_newInst: function( target, inline ) {\n\t\tvar id = target[ 0 ].id.replace( /([^A-Za-z0-9_\\-])/g, \"\\\\\\\\$1\" ); // escape jQuery meta chars\n\t\treturn { id: id, input: target, // associated target\n\t\t\tselectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection\n\t\t\tdrawMonth: 0, drawYear: 0, // month being drawn\n\t\t\tinline: inline, // is datepicker inline or not\n\t\t\tdpDiv: ( !inline ? this.dpDiv : // presentation div\n\t\t\tdatepicker_bindHover( $( \"<div class='\" + this._inlineClass + \" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\" ) ) ) };\n\t},\n\n\t/* Attach the date picker to an input field. */\n\t_connectDatepicker: function( target, inst ) {\n\t\tvar input = $( target );\n\t\tinst.append = $( [] );\n\t\tinst.trigger = $( [] );\n\t\tif ( input.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\t\tthis._attachments( input, inst );\n\t\tinput.addClass( this.markerClassName ).on( \"keydown\", this._doKeyDown ).\n\t\t\ton( \"keypress\", this._doKeyPress ).on( \"keyup\", this._doKeyUp );\n\t\tthis._autoSize( inst );\n\t\t$.data( target, \"datepicker\", inst );\n\n\t\t//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)\n\t\tif ( inst.settings.disabled ) {\n\t\t\tthis._disableDatepicker( target );\n\t\t}\n\t},\n\n\t/* Make attachments based on settings. */\n\t_attachments: function( input, inst ) {\n\t\tvar showOn, buttonText, buttonImage,\n\t\t\tappendText = this._get( inst, \"appendText\" ),\n\t\t\tisRTL = this._get( inst, \"isRTL\" );\n\n\t\tif ( inst.append ) {\n\t\t\tinst.append.remove();\n\t\t}\n\t\tif ( appendText ) {\n\t\t\tinst.append = $( \"<span class='\" + this._appendClass + \"'>\" + appendText + \"</span>\" );\n\t\t\tinput[ isRTL ? \"before\" : \"after\" ]( inst.append );\n\t\t}\n\n\t\tinput.off( \"focus\", this._showDatepicker );\n\n\t\tif ( inst.trigger ) {\n\t\t\tinst.trigger.remove();\n\t\t}\n\n\t\tshowOn = this._get( inst, \"showOn\" );\n\t\tif ( showOn === \"focus\" || showOn === \"both\" ) { // pop-up date picker when in the marked field\n\t\t\tinput.on( \"focus\", this._showDatepicker );\n\t\t}\n\t\tif ( showOn === \"button\" || showOn === \"both\" ) { // pop-up date picker when button clicked\n\t\t\tbuttonText = this._get( inst, \"buttonText\" );\n\t\t\tbuttonImage = this._get( inst, \"buttonImage\" );\n\t\t\tinst.trigger = $( this._get( inst, \"buttonImageOnly\" ) ?\n\t\t\t\t$( \"<img/>\" ).addClass( this._triggerClass ).\n\t\t\t\t\tattr( { src: buttonImage, alt: buttonText, title: buttonText } ) :\n\t\t\t\t$( \"<button type='button'></button>\" ).addClass( this._triggerClass ).\n\t\t\t\t\thtml( !buttonImage ? buttonText : $( \"<img/>\" ).attr(\n\t\t\t\t\t{ src:buttonImage, alt:buttonText, title:buttonText } ) ) );\n\t\t\tinput[ isRTL ? \"before\" : \"after\" ]( inst.trigger );\n\t\t\tinst.trigger.on( \"click\", function() {\n\t\t\t\tif ( $.datepicker._datepickerShowing && $.datepicker._lastInput === input[ 0 ] ) {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t} else if ( $.datepicker._datepickerShowing && $.datepicker._lastInput !== input[ 0 ] ) {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t$.datepicker._showDatepicker( input[ 0 ] );\n\t\t\t\t} else {\n\t\t\t\t\t$.datepicker._showDatepicker( input[ 0 ] );\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t} );\n\t\t}\n\t},\n\n\t/* Apply the maximum length for the date format. */\n\t_autoSize: function( inst ) {\n\t\tif ( this._get( inst, \"autoSize\" ) && !inst.inline ) {\n\t\t\tvar findMax, max, maxI, i,\n\t\t\t\tdate = new Date( 2009, 12 - 1, 20 ), // Ensure double digits\n\t\t\t\tdateFormat = this._get( inst, \"dateFormat\" );\n\n\t\t\tif ( dateFormat.match( /[DM]/ ) ) {\n\t\t\t\tfindMax = function( names ) {\n\t\t\t\t\tmax = 0;\n\t\t\t\t\tmaxI = 0;\n\t\t\t\t\tfor ( i = 0; i < names.length; i++ ) {\n\t\t\t\t\t\tif ( names[ i ].length > max ) {\n\t\t\t\t\t\t\tmax = names[ i ].length;\n\t\t\t\t\t\t\tmaxI = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn maxI;\n\t\t\t\t};\n\t\t\t\tdate.setMonth( findMax( this._get( inst, ( dateFormat.match( /MM/ ) ?\n\t\t\t\t\t\"monthNames\" : \"monthNamesShort\" ) ) ) );\n\t\t\t\tdate.setDate( findMax( this._get( inst, ( dateFormat.match( /DD/ ) ?\n\t\t\t\t\t\"dayNames\" : \"dayNamesShort\" ) ) ) + 20 - date.getDay() );\n\t\t\t}\n\t\t\tinst.input.attr( \"size\", this._formatDate( inst, date ).length );\n\t\t}\n\t},\n\n\t/* Attach an inline date picker to a div. */\n\t_inlineDatepicker: function( target, inst ) {\n\t\tvar divSpan = $( target );\n\t\tif ( divSpan.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\t\tdivSpan.addClass( this.markerClassName ).append( inst.dpDiv );\n\t\t$.data( target, \"datepicker\", inst );\n\t\tthis._setDate( inst, this._getDefaultDate( inst ), true );\n\t\tthis._updateDatepicker( inst );\n\t\tthis._updateAlternate( inst );\n\n\t\t//If disabled option is true, disable the datepicker before showing it (see ticket #5665)\n\t\tif ( inst.settings.disabled ) {\n\t\t\tthis._disableDatepicker( target );\n\t\t}\n\n\t\t// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements\n\t\t// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height\n\t\tinst.dpDiv.css( \"display\", \"block\" );\n\t},\n\n\t/* Pop-up the date picker in a \"dialog\" box.\n\t * @param  input element - ignored\n\t * @param  date\tstring or Date - the initial date to display\n\t * @param  onSelect  function - the function to call when a date is selected\n\t * @param  settings  object - update the dialog date picker instance's settings (anonymous object)\n\t * @param  pos int[2] - coordinates for the dialog's position within the screen or\n\t *\t\t\t\t\tevent - with x/y coordinates or\n\t *\t\t\t\t\tleave empty for default (screen centre)\n\t * @return the manager object\n\t */\n\t_dialogDatepicker: function( input, date, onSelect, settings, pos ) {\n\t\tvar id, browserWidth, browserHeight, scrollX, scrollY,\n\t\t\tinst = this._dialogInst; // internal instance\n\n\t\tif ( !inst ) {\n\t\t\tthis.uuid += 1;\n\t\t\tid = \"dp\" + this.uuid;\n\t\t\tthis._dialogInput = $( \"<input type='text' id='\" + id +\n\t\t\t\t\"' style='position: absolute; top: -100px; width: 0px;'/>\" );\n\t\t\tthis._dialogInput.on( \"keydown\", this._doKeyDown );\n\t\t\t$( \"body\" ).append( this._dialogInput );\n\t\t\tinst = this._dialogInst = this._newInst( this._dialogInput, false );\n\t\t\tinst.settings = {};\n\t\t\t$.data( this._dialogInput[ 0 ], \"datepicker\", inst );\n\t\t}\n\t\tdatepicker_extendRemove( inst.settings, settings || {} );\n\t\tdate = ( date && date.constructor === Date ? this._formatDate( inst, date ) : date );\n\t\tthis._dialogInput.val( date );\n\n\t\tthis._pos = ( pos ? ( pos.length ? pos : [ pos.pageX, pos.pageY ] ) : null );\n\t\tif ( !this._pos ) {\n\t\t\tbrowserWidth = document.documentElement.clientWidth;\n\t\t\tbrowserHeight = document.documentElement.clientHeight;\n\t\t\tscrollX = document.documentElement.scrollLeft || document.body.scrollLeft;\n\t\t\tscrollY = document.documentElement.scrollTop || document.body.scrollTop;\n\t\t\tthis._pos = // should use actual width/height below\n\t\t\t\t[ ( browserWidth / 2 ) - 100 + scrollX, ( browserHeight / 2 ) - 150 + scrollY ];\n\t\t}\n\n\t\t// Move input on screen for focus, but hidden behind dialog\n\t\tthis._dialogInput.css( \"left\", ( this._pos[ 0 ] + 20 ) + \"px\" ).css( \"top\", this._pos[ 1 ] + \"px\" );\n\t\tinst.settings.onSelect = onSelect;\n\t\tthis._inDialog = true;\n\t\tthis.dpDiv.addClass( this._dialogClass );\n\t\tthis._showDatepicker( this._dialogInput[ 0 ] );\n\t\tif ( $.blockUI ) {\n\t\t\t$.blockUI( this.dpDiv );\n\t\t}\n\t\t$.data( this._dialogInput[ 0 ], \"datepicker\", inst );\n\t\treturn this;\n\t},\n\n\t/* Detach a datepicker from its control.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_destroyDatepicker: function( target ) {\n\t\tvar nodeName,\n\t\t\t$target = $( target ),\n\t\t\tinst = $.data( target, \"datepicker\" );\n\n\t\tif ( !$target.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\t$.removeData( target, \"datepicker\" );\n\t\tif ( nodeName === \"input\" ) {\n\t\t\tinst.append.remove();\n\t\t\tinst.trigger.remove();\n\t\t\t$target.removeClass( this.markerClassName ).\n\t\t\t\toff( \"focus\", this._showDatepicker ).\n\t\t\t\toff( \"keydown\", this._doKeyDown ).\n\t\t\t\toff( \"keypress\", this._doKeyPress ).\n\t\t\t\toff( \"keyup\", this._doKeyUp );\n\t\t} else if ( nodeName === \"div\" || nodeName === \"span\" ) {\n\t\t\t$target.removeClass( this.markerClassName ).empty();\n\t\t}\n\n\t\tif ( datepicker_instActive === inst ) {\n\t\t\tdatepicker_instActive = null;\n\t\t}\n\t},\n\n\t/* Enable the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_enableDatepicker: function( target ) {\n\t\tvar nodeName, inline,\n\t\t\t$target = $( target ),\n\t\t\tinst = $.data( target, \"datepicker\" );\n\n\t\tif ( !$target.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tif ( nodeName === \"input\" ) {\n\t\t\ttarget.disabled = false;\n\t\t\tinst.trigger.filter( \"button\" ).\n\t\t\t\teach( function() { this.disabled = false; } ).end().\n\t\t\t\tfilter( \"img\" ).css( { opacity: \"1.0\", cursor: \"\" } );\n\t\t} else if ( nodeName === \"div\" || nodeName === \"span\" ) {\n\t\t\tinline = $target.children( \".\" + this._inlineClass );\n\t\t\tinline.children().removeClass( \"ui-state-disabled\" );\n\t\t\tinline.find( \"select.ui-datepicker-month, select.ui-datepicker-year\" ).\n\t\t\t\tprop( \"disabled\", false );\n\t\t}\n\t\tthis._disabledInputs = $.map( this._disabledInputs,\n\t\t\tfunction( value ) { return ( value === target ? null : value ); } ); // delete entry\n\t},\n\n\t/* Disable the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_disableDatepicker: function( target ) {\n\t\tvar nodeName, inline,\n\t\t\t$target = $( target ),\n\t\t\tinst = $.data( target, \"datepicker\" );\n\n\t\tif ( !$target.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tif ( nodeName === \"input\" ) {\n\t\t\ttarget.disabled = true;\n\t\t\tinst.trigger.filter( \"button\" ).\n\t\t\t\teach( function() { this.disabled = true; } ).end().\n\t\t\t\tfilter( \"img\" ).css( { opacity: \"0.5\", cursor: \"default\" } );\n\t\t} else if ( nodeName === \"div\" || nodeName === \"span\" ) {\n\t\t\tinline = $target.children( \".\" + this._inlineClass );\n\t\t\tinline.children().addClass( \"ui-state-disabled\" );\n\t\t\tinline.find( \"select.ui-datepicker-month, select.ui-datepicker-year\" ).\n\t\t\t\tprop( \"disabled\", true );\n\t\t}\n\t\tthis._disabledInputs = $.map( this._disabledInputs,\n\t\t\tfunction( value ) { return ( value === target ? null : value ); } ); // delete entry\n\t\tthis._disabledInputs[ this._disabledInputs.length ] = target;\n\t},\n\n\t/* Is the first field in a jQuery collection disabled as a datepicker?\n\t * @param  target\telement - the target input field or division or span\n\t * @return boolean - true if disabled, false if enabled\n\t */\n\t_isDisabledDatepicker: function( target ) {\n\t\tif ( !target ) {\n\t\t\treturn false;\n\t\t}\n\t\tfor ( var i = 0; i < this._disabledInputs.length; i++ ) {\n\t\t\tif ( this._disabledInputs[ i ] === target ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\t/* Retrieve the instance data for the target control.\n\t * @param  target  element - the target input field or division or span\n\t * @return  object - the associated instance data\n\t * @throws  error if a jQuery problem getting data\n\t */\n\t_getInst: function( target ) {\n\t\ttry {\n\t\t\treturn $.data( target, \"datepicker\" );\n\t\t}\n\t\tcatch ( err ) {\n\t\t\tthrow \"Missing instance data for this datepicker\";\n\t\t}\n\t},\n\n\t/* Update or retrieve the settings for a date picker attached to an input field or division.\n\t * @param  target  element - the target input field or division or span\n\t * @param  name\tobject - the new settings to update or\n\t *\t\t\t\tstring - the name of the setting to change or retrieve,\n\t *\t\t\t\twhen retrieving also \"all\" for all instance settings or\n\t *\t\t\t\t\"defaults\" for all global defaults\n\t * @param  value   any - the new value for the setting\n\t *\t\t\t\t(omit if above is an object or to retrieve a value)\n\t */\n\t_optionDatepicker: function( target, name, value ) {\n\t\tvar settings, date, minDate, maxDate,\n\t\t\tinst = this._getInst( target );\n\n\t\tif ( arguments.length === 2 && typeof name === \"string\" ) {\n\t\t\treturn ( name === \"defaults\" ? $.extend( {}, $.datepicker._defaults ) :\n\t\t\t\t( inst ? ( name === \"all\" ? $.extend( {}, inst.settings ) :\n\t\t\t\tthis._get( inst, name ) ) : null ) );\n\t\t}\n\n\t\tsettings = name || {};\n\t\tif ( typeof name === \"string\" ) {\n\t\t\tsettings = {};\n\t\t\tsettings[ name ] = value;\n\t\t}\n\n\t\tif ( inst ) {\n\t\t\tif ( this._curInst === inst ) {\n\t\t\t\tthis._hideDatepicker();\n\t\t\t}\n\n\t\t\tdate = this._getDateDatepicker( target, true );\n\t\t\tminDate = this._getMinMaxDate( inst, \"min\" );\n\t\t\tmaxDate = this._getMinMaxDate( inst, \"max\" );\n\t\t\tdatepicker_extendRemove( inst.settings, settings );\n\n\t\t\t// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided\n\t\t\tif ( minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined ) {\n\t\t\t\tinst.settings.minDate = this._formatDate( inst, minDate );\n\t\t\t}\n\t\t\tif ( maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined ) {\n\t\t\t\tinst.settings.maxDate = this._formatDate( inst, maxDate );\n\t\t\t}\n\t\t\tif ( \"disabled\" in settings ) {\n\t\t\t\tif ( settings.disabled ) {\n\t\t\t\t\tthis._disableDatepicker( target );\n\t\t\t\t} else {\n\t\t\t\t\tthis._enableDatepicker( target );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._attachments( $( target ), inst );\n\t\t\tthis._autoSize( inst );\n\t\t\tthis._setDate( inst, date );\n\t\t\tthis._updateAlternate( inst );\n\t\t\tthis._updateDatepicker( inst );\n\t\t}\n\t},\n\n\t// Change method deprecated\n\t_changeDatepicker: function( target, name, value ) {\n\t\tthis._optionDatepicker( target, name, value );\n\t},\n\n\t/* Redraw the date picker attached to an input field or division.\n\t * @param  target  element - the target input field or division or span\n\t */\n\t_refreshDatepicker: function( target ) {\n\t\tvar inst = this._getInst( target );\n\t\tif ( inst ) {\n\t\t\tthis._updateDatepicker( inst );\n\t\t}\n\t},\n\n\t/* Set the dates for a jQuery selection.\n\t * @param  target element - the target input field or division or span\n\t * @param  date\tDate - the new date\n\t */\n\t_setDateDatepicker: function( target, date ) {\n\t\tvar inst = this._getInst( target );\n\t\tif ( inst ) {\n\t\t\tthis._setDate( inst, date );\n\t\t\tthis._updateDatepicker( inst );\n\t\t\tthis._updateAlternate( inst );\n\t\t}\n\t},\n\n\t/* Get the date(s) for the first entry in a jQuery selection.\n\t * @param  target element - the target input field or division or span\n\t * @param  noDefault boolean - true if no default date is to be used\n\t * @return Date - the current date\n\t */\n\t_getDateDatepicker: function( target, noDefault ) {\n\t\tvar inst = this._getInst( target );\n\t\tif ( inst && !inst.inline ) {\n\t\t\tthis._setDateFromField( inst, noDefault );\n\t\t}\n\t\treturn ( inst ? this._getDate( inst ) : null );\n\t},\n\n\t/* Handle keystrokes. */\n\t_doKeyDown: function( event ) {\n\t\tvar onSelect, dateStr, sel,\n\t\t\tinst = $.datepicker._getInst( event.target ),\n\t\t\thandled = true,\n\t\t\tisRTL = inst.dpDiv.is( \".ui-datepicker-rtl\" );\n\n\t\tinst._keyEvent = true;\n\t\tif ( $.datepicker._datepickerShowing ) {\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase 9: $.datepicker._hideDatepicker();\n\t\t\t\t\t\thandled = false;\n\t\t\t\t\t\tbreak; // hide on tab out\n\t\t\t\tcase 13: sel = $( \"td.\" + $.datepicker._dayOverClass + \":not(.\" +\n\t\t\t\t\t\t\t\t\t$.datepicker._currentClass + \")\", inst.dpDiv );\n\t\t\t\t\t\tif ( sel[ 0 ] ) {\n\t\t\t\t\t\t\t$.datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonSelect = $.datepicker._get( inst, \"onSelect\" );\n\t\t\t\t\t\tif ( onSelect ) {\n\t\t\t\t\t\t\tdateStr = $.datepicker._formatDate( inst );\n\n\t\t\t\t\t\t\t// Trigger custom callback\n\t\t\t\t\t\t\tonSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn false; // don't submit the form\n\t\t\t\tcase 27: $.datepicker._hideDatepicker();\n\t\t\t\t\t\tbreak; // hide on escape\n\t\t\t\tcase 33: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?\n\t\t\t\t\t\t\t-$.datepicker._get( inst, \"stepBigMonths\" ) :\n\t\t\t\t\t\t\t-$.datepicker._get( inst, \"stepMonths\" ) ), \"M\" );\n\t\t\t\t\t\tbreak; // previous month/year on page up/+ ctrl\n\t\t\t\tcase 34: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?\n\t\t\t\t\t\t\t+$.datepicker._get( inst, \"stepBigMonths\" ) :\n\t\t\t\t\t\t\t+$.datepicker._get( inst, \"stepMonths\" ) ), \"M\" );\n\t\t\t\t\t\tbreak; // next month/year on page down/+ ctrl\n\t\t\t\tcase 35: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._clearDate( event.target );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // clear on ctrl or command +end\n\t\t\t\tcase 36: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._gotoToday( event.target );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // current on ctrl or command +home\n\t\t\t\tcase 37: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, ( isRTL ? +1 : -1 ), \"D\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\n\t\t\t\t\t\t// -1 day on ctrl or command +left\n\t\t\t\t\t\tif ( event.originalEvent.altKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, ( event.ctrlKey ?\n\t\t\t\t\t\t\t\t-$.datepicker._get( inst, \"stepBigMonths\" ) :\n\t\t\t\t\t\t\t\t-$.datepicker._get( inst, \"stepMonths\" ) ), \"M\" );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// next month/year on alt +left on Mac\n\t\t\t\t\t\tbreak;\n\t\t\t\tcase 38: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, -7, \"D\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // -1 week on ctrl or command +up\n\t\t\t\tcase 39: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, ( isRTL ? -1 : +1 ), \"D\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\n\t\t\t\t\t\t// +1 day on ctrl or command +right\n\t\t\t\t\t\tif ( event.originalEvent.altKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, ( event.ctrlKey ?\n\t\t\t\t\t\t\t\t+$.datepicker._get( inst, \"stepBigMonths\" ) :\n\t\t\t\t\t\t\t\t+$.datepicker._get( inst, \"stepMonths\" ) ), \"M\" );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// next month/year on alt +right\n\t\t\t\t\t\tbreak;\n\t\t\t\tcase 40: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, +7, \"D\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // +1 week on ctrl or command +down\n\t\t\t\tdefault: handled = false;\n\t\t\t}\n\t\t} else if ( event.keyCode === 36 && event.ctrlKey ) { // display the date picker on ctrl+home\n\t\t\t$.datepicker._showDatepicker( this );\n\t\t} else {\n\t\t\thandled = false;\n\t\t}\n\n\t\tif ( handled ) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t},\n\n\t/* Filter entered characters - based on date format. */\n\t_doKeyPress: function( event ) {\n\t\tvar chars, chr,\n\t\t\tinst = $.datepicker._getInst( event.target );\n\n\t\tif ( $.datepicker._get( inst, \"constrainInput\" ) ) {\n\t\t\tchars = $.datepicker._possibleChars( $.datepicker._get( inst, \"dateFormat\" ) );\n\t\t\tchr = String.fromCharCode( event.charCode == null ? event.keyCode : event.charCode );\n\t\t\treturn event.ctrlKey || event.metaKey || ( chr < \" \" || !chars || chars.indexOf( chr ) > -1 );\n\t\t}\n\t},\n\n\t/* Synchronise manual entry and field/alternate field. */\n\t_doKeyUp: function( event ) {\n\t\tvar date,\n\t\t\tinst = $.datepicker._getInst( event.target );\n\n\t\tif ( inst.input.val() !== inst.lastVal ) {\n\t\t\ttry {\n\t\t\t\tdate = $.datepicker.parseDate( $.datepicker._get( inst, \"dateFormat\" ),\n\t\t\t\t\t( inst.input ? inst.input.val() : null ),\n\t\t\t\t\t$.datepicker._getFormatConfig( inst ) );\n\n\t\t\t\tif ( date ) { // only if valid\n\t\t\t\t\t$.datepicker._setDateFromField( inst );\n\t\t\t\t\t$.datepicker._updateAlternate( inst );\n\t\t\t\t\t$.datepicker._updateDatepicker( inst );\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch ( err ) {\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t},\n\n\t/* Pop-up the date picker for a given input field.\n\t * If false returned from beforeShow event handler do not show.\n\t * @param  input  element - the input field attached to the date picker or\n\t *\t\t\t\t\tevent - if triggered by focus\n\t */\n\t_showDatepicker: function( input ) {\n\t\tinput = input.target || input;\n\t\tif ( input.nodeName.toLowerCase() !== \"input\" ) { // find from button/image trigger\n\t\t\tinput = $( \"input\", input.parentNode )[ 0 ];\n\t\t}\n\n\t\tif ( $.datepicker._isDisabledDatepicker( input ) || $.datepicker._lastInput === input ) { // already here\n\t\t\treturn;\n\t\t}\n\n\t\tvar inst, beforeShow, beforeShowSettings, isFixed,\n\t\t\toffset, showAnim, duration;\n\n\t\tinst = $.datepicker._getInst( input );\n\t\tif ( $.datepicker._curInst && $.datepicker._curInst !== inst ) {\n\t\t\t$.datepicker._curInst.dpDiv.stop( true, true );\n\t\t\tif ( inst && $.datepicker._datepickerShowing ) {\n\t\t\t\t$.datepicker._hideDatepicker( $.datepicker._curInst.input[ 0 ] );\n\t\t\t}\n\t\t}\n\n\t\tbeforeShow = $.datepicker._get( inst, \"beforeShow\" );\n\t\tbeforeShowSettings = beforeShow ? beforeShow.apply( input, [ input, inst ] ) : {};\n\t\tif ( beforeShowSettings === false ) {\n\t\t\treturn;\n\t\t}\n\t\tdatepicker_extendRemove( inst.settings, beforeShowSettings );\n\n\t\tinst.lastVal = null;\n\t\t$.datepicker._lastInput = input;\n\t\t$.datepicker._setDateFromField( inst );\n\n\t\tif ( $.datepicker._inDialog ) { // hide cursor\n\t\t\tinput.value = \"\";\n\t\t}\n\t\tif ( !$.datepicker._pos ) { // position below input\n\t\t\t$.datepicker._pos = $.datepicker._findPos( input );\n\t\t\t$.datepicker._pos[ 1 ] += input.offsetHeight; // add the height\n\t\t}\n\n\t\tisFixed = false;\n\t\t$( input ).parents().each( function() {\n\t\t\tisFixed |= $( this ).css( \"position\" ) === \"fixed\";\n\t\t\treturn !isFixed;\n\t\t} );\n\n\t\toffset = { left: $.datepicker._pos[ 0 ], top: $.datepicker._pos[ 1 ] };\n\t\t$.datepicker._pos = null;\n\n\t\t//to avoid flashes on Firefox\n\t\tinst.dpDiv.empty();\n\n\t\t// determine sizing offscreen\n\t\tinst.dpDiv.css( { position: \"absolute\", display: \"block\", top: \"-1000px\" } );\n\t\t$.datepicker._updateDatepicker( inst );\n\n\t\t// fix width for dynamic number of date pickers\n\t\t// and adjust position before showing\n\t\toffset = $.datepicker._checkOffset( inst, offset, isFixed );\n\t\tinst.dpDiv.css( { position: ( $.datepicker._inDialog && $.blockUI ?\n\t\t\t\"static\" : ( isFixed ? \"fixed\" : \"absolute\" ) ), display: \"none\",\n\t\t\tleft: offset.left + \"px\", top: offset.top + \"px\" } );\n\n\t\tif ( !inst.inline ) {\n\t\t\tshowAnim = $.datepicker._get( inst, \"showAnim\" );\n\t\t\tduration = $.datepicker._get( inst, \"duration\" );\n\t\t\tinst.dpDiv.css( \"z-index\", datepicker_getZindex( $( input ) ) + 1 );\n\t\t\t$.datepicker._datepickerShowing = true;\n\n\t\t\tif ( $.effects && $.effects.effect[ showAnim ] ) {\n\t\t\t\tinst.dpDiv.show( showAnim, $.datepicker._get( inst, \"showOptions\" ), duration );\n\t\t\t} else {\n\t\t\t\tinst.dpDiv[ showAnim || \"show\" ]( showAnim ? duration : null );\n\t\t\t}\n\n\t\t\tif ( $.datepicker._shouldFocusInput( inst ) ) {\n\t\t\t\tinst.input.trigger( \"focus\" );\n\t\t\t}\n\n\t\t\t$.datepicker._curInst = inst;\n\t\t}\n\t},\n\n\t/* Generate the date picker content. */\n\t_updateDatepicker: function( inst ) {\n\t\tthis.maxRows = 4; //Reset the max number of rows being displayed (see #7043)\n\t\tdatepicker_instActive = inst; // for delegate hover events\n\t\tinst.dpDiv.empty().append( this._generateHTML( inst ) );\n\t\tthis._attachHandlers( inst );\n\n\t\tvar origyearshtml,\n\t\t\tnumMonths = this._getNumberOfMonths( inst ),\n\t\t\tcols = numMonths[ 1 ],\n\t\t\twidth = 17,\n\t\t\tactiveCell = inst.dpDiv.find( \".\" + this._dayOverClass + \" a\" );\n\n\t\tif ( activeCell.length > 0 ) {\n\t\t\tdatepicker_handleMouseover.apply( activeCell.get( 0 ) );\n\t\t}\n\n\t\tinst.dpDiv.removeClass( \"ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4\" ).width( \"\" );\n\t\tif ( cols > 1 ) {\n\t\t\tinst.dpDiv.addClass( \"ui-datepicker-multi-\" + cols ).css( \"width\", ( width * cols ) + \"em\" );\n\t\t}\n\t\tinst.dpDiv[ ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ? \"add\" : \"remove\" ) +\n\t\t\t\"Class\" ]( \"ui-datepicker-multi\" );\n\t\tinst.dpDiv[ ( this._get( inst, \"isRTL\" ) ? \"add\" : \"remove\" ) +\n\t\t\t\"Class\" ]( \"ui-datepicker-rtl\" );\n\n\t\tif ( inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {\n\t\t\tinst.input.trigger( \"focus\" );\n\t\t}\n\n\t\t// Deffered render of the years select (to avoid flashes on Firefox)\n\t\tif ( inst.yearshtml ) {\n\t\t\torigyearshtml = inst.yearshtml;\n\t\t\tsetTimeout( function() {\n\n\t\t\t\t//assure that inst.yearshtml didn't change.\n\t\t\t\tif ( origyearshtml === inst.yearshtml && inst.yearshtml ) {\n\t\t\t\t\tinst.dpDiv.find( \"select.ui-datepicker-year:first\" ).replaceWith( inst.yearshtml );\n\t\t\t\t}\n\t\t\t\torigyearshtml = inst.yearshtml = null;\n\t\t\t}, 0 );\n\t\t}\n\t},\n\n\t// #6694 - don't focus the input if it's already focused\n\t// this breaks the change event in IE\n\t// Support: IE and jQuery <1.9\n\t_shouldFocusInput: function( inst ) {\n\t\treturn inst.input && inst.input.is( \":visible\" ) && !inst.input.is( \":disabled\" ) && !inst.input.is( \":focus\" );\n\t},\n\n\t/* Check positioning to remain on screen. */\n\t_checkOffset: function( inst, offset, isFixed ) {\n\t\tvar dpWidth = inst.dpDiv.outerWidth(),\n\t\t\tdpHeight = inst.dpDiv.outerHeight(),\n\t\t\tinputWidth = inst.input ? inst.input.outerWidth() : 0,\n\t\t\tinputHeight = inst.input ? inst.input.outerHeight() : 0,\n\t\t\tviewWidth = document.documentElement.clientWidth + ( isFixed ? 0 : $( document ).scrollLeft() ),\n\t\t\tviewHeight = document.documentElement.clientHeight + ( isFixed ? 0 : $( document ).scrollTop() );\n\n\t\toffset.left -= ( this._get( inst, \"isRTL\" ) ? ( dpWidth - inputWidth ) : 0 );\n\t\toffset.left -= ( isFixed && offset.left === inst.input.offset().left ) ? $( document ).scrollLeft() : 0;\n\t\toffset.top -= ( isFixed && offset.top === ( inst.input.offset().top + inputHeight ) ) ? $( document ).scrollTop() : 0;\n\n\t\t// Now check if datepicker is showing outside window viewport - move to a better place if so.\n\t\toffset.left -= Math.min( offset.left, ( offset.left + dpWidth > viewWidth && viewWidth > dpWidth ) ?\n\t\t\tMath.abs( offset.left + dpWidth - viewWidth ) : 0 );\n\t\toffset.top -= Math.min( offset.top, ( offset.top + dpHeight > viewHeight && viewHeight > dpHeight ) ?\n\t\t\tMath.abs( dpHeight + inputHeight ) : 0 );\n\n\t\treturn offset;\n\t},\n\n\t/* Find an object's position on the screen. */\n\t_findPos: function( obj ) {\n\t\tvar position,\n\t\t\tinst = this._getInst( obj ),\n\t\t\tisRTL = this._get( inst, \"isRTL\" );\n\n\t\twhile ( obj && ( obj.type === \"hidden\" || obj.nodeType !== 1 || $.expr.filters.hidden( obj ) ) ) {\n\t\t\tobj = obj[ isRTL ? \"previousSibling\" : \"nextSibling\" ];\n\t\t}\n\n\t\tposition = $( obj ).offset();\n\t\treturn [ position.left, position.top ];\n\t},\n\n\t/* Hide the date picker from view.\n\t * @param  input  element - the input field attached to the date picker\n\t */\n\t_hideDatepicker: function( input ) {\n\t\tvar showAnim, duration, postProcess, onClose,\n\t\t\tinst = this._curInst;\n\n\t\tif ( !inst || ( input && inst !== $.data( input, \"datepicker\" ) ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this._datepickerShowing ) {\n\t\t\tshowAnim = this._get( inst, \"showAnim\" );\n\t\t\tduration = this._get( inst, \"duration\" );\n\t\t\tpostProcess = function() {\n\t\t\t\t$.datepicker._tidyDialog( inst );\n\t\t\t};\n\n\t\t\t// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed\n\t\t\tif ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {\n\t\t\t\tinst.dpDiv.hide( showAnim, $.datepicker._get( inst, \"showOptions\" ), duration, postProcess );\n\t\t\t} else {\n\t\t\t\tinst.dpDiv[ ( showAnim === \"slideDown\" ? \"slideUp\" :\n\t\t\t\t\t( showAnim === \"fadeIn\" ? \"fadeOut\" : \"hide\" ) ) ]( ( showAnim ? duration : null ), postProcess );\n\t\t\t}\n\n\t\t\tif ( !showAnim ) {\n\t\t\t\tpostProcess();\n\t\t\t}\n\t\t\tthis._datepickerShowing = false;\n\n\t\t\tonClose = this._get( inst, \"onClose\" );\n\t\t\tif ( onClose ) {\n\t\t\t\tonClose.apply( ( inst.input ? inst.input[ 0 ] : null ), [ ( inst.input ? inst.input.val() : \"\" ), inst ] );\n\t\t\t}\n\n\t\t\tthis._lastInput = null;\n\t\t\tif ( this._inDialog ) {\n\t\t\t\tthis._dialogInput.css( { position: \"absolute\", left: \"0\", top: \"-100px\" } );\n\t\t\t\tif ( $.blockUI ) {\n\t\t\t\t\t$.unblockUI();\n\t\t\t\t\t$( \"body\" ).append( this.dpDiv );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._inDialog = false;\n\t\t}\n\t},\n\n\t/* Tidy up after a dialog display. */\n\t_tidyDialog: function( inst ) {\n\t\tinst.dpDiv.removeClass( this._dialogClass ).off( \".ui-datepicker-calendar\" );\n\t},\n\n\t/* Close date picker if clicked elsewhere. */\n\t_checkExternalClick: function( event ) {\n\t\tif ( !$.datepicker._curInst ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar $target = $( event.target ),\n\t\t\tinst = $.datepicker._getInst( $target[ 0 ] );\n\n\t\tif ( ( ( $target[ 0 ].id !== $.datepicker._mainDivId &&\n\t\t\t\t$target.parents( \"#\" + $.datepicker._mainDivId ).length === 0 &&\n\t\t\t\t!$target.hasClass( $.datepicker.markerClassName ) &&\n\t\t\t\t!$target.closest( \".\" + $.datepicker._triggerClass ).length &&\n\t\t\t\t$.datepicker._datepickerShowing && !( $.datepicker._inDialog && $.blockUI ) ) ) ||\n\t\t\t( $target.hasClass( $.datepicker.markerClassName ) && $.datepicker._curInst !== inst ) ) {\n\t\t\t\t$.datepicker._hideDatepicker();\n\t\t}\n\t},\n\n\t/* Adjust one of the date sub-fields. */\n\t_adjustDate: function( id, offset, period ) {\n\t\tvar target = $( id ),\n\t\t\tinst = this._getInst( target[ 0 ] );\n\n\t\tif ( this._isDisabledDatepicker( target[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\t\tthis._adjustInstDate( inst, offset +\n\t\t\t( period === \"M\" ? this._get( inst, \"showCurrentAtPos\" ) : 0 ), // undo positioning\n\t\t\tperiod );\n\t\tthis._updateDatepicker( inst );\n\t},\n\n\t/* Action for current link. */\n\t_gotoToday: function( id ) {\n\t\tvar date,\n\t\t\ttarget = $( id ),\n\t\t\tinst = this._getInst( target[ 0 ] );\n\n\t\tif ( this._get( inst, \"gotoCurrent\" ) && inst.currentDay ) {\n\t\t\tinst.selectedDay = inst.currentDay;\n\t\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth;\n\t\t\tinst.drawYear = inst.selectedYear = inst.currentYear;\n\t\t} else {\n\t\t\tdate = new Date();\n\t\t\tinst.selectedDay = date.getDate();\n\t\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\t}\n\t\tthis._notifyChange( inst );\n\t\tthis._adjustDate( target );\n\t},\n\n\t/* Action for selecting a new month/year. */\n\t_selectMonthYear: function( id, select, period ) {\n\t\tvar target = $( id ),\n\t\t\tinst = this._getInst( target[ 0 ] );\n\n\t\tinst[ \"selected\" + ( period === \"M\" ? \"Month\" : \"Year\" ) ] =\n\t\tinst[ \"draw\" + ( period === \"M\" ? \"Month\" : \"Year\" ) ] =\n\t\t\tparseInt( select.options[ select.selectedIndex ].value, 10 );\n\n\t\tthis._notifyChange( inst );\n\t\tthis._adjustDate( target );\n\t},\n\n\t/* Action for selecting a day. */\n\t_selectDay: function( id, month, year, td ) {\n\t\tvar inst,\n\t\t\ttarget = $( id );\n\n\t\tif ( $( td ).hasClass( this._unselectableClass ) || this._isDisabledDatepicker( target[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tinst = this._getInst( target[ 0 ] );\n\t\tinst.selectedDay = inst.currentDay = $( \"a\", td ).html();\n\t\tinst.selectedMonth = inst.currentMonth = month;\n\t\tinst.selectedYear = inst.currentYear = year;\n\t\tthis._selectDate( id, this._formatDate( inst,\n\t\t\tinst.currentDay, inst.currentMonth, inst.currentYear ) );\n\t},\n\n\t/* Erase the input field and hide the date picker. */\n\t_clearDate: function( id ) {\n\t\tvar target = $( id );\n\t\tthis._selectDate( target, \"\" );\n\t},\n\n\t/* Update the input field with the selected date. */\n\t_selectDate: function( id, dateStr ) {\n\t\tvar onSelect,\n\t\t\ttarget = $( id ),\n\t\t\tinst = this._getInst( target[ 0 ] );\n\n\t\tdateStr = ( dateStr != null ? dateStr : this._formatDate( inst ) );\n\t\tif ( inst.input ) {\n\t\t\tinst.input.val( dateStr );\n\t\t}\n\t\tthis._updateAlternate( inst );\n\n\t\tonSelect = this._get( inst, \"onSelect\" );\n\t\tif ( onSelect ) {\n\t\t\tonSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );  // trigger custom callback\n\t\t} else if ( inst.input ) {\n\t\t\tinst.input.trigger( \"change\" ); // fire the change event\n\t\t}\n\n\t\tif ( inst.inline ) {\n\t\t\tthis._updateDatepicker( inst );\n\t\t} else {\n\t\t\tthis._hideDatepicker();\n\t\t\tthis._lastInput = inst.input[ 0 ];\n\t\t\tif ( typeof( inst.input[ 0 ] ) !== \"object\" ) {\n\t\t\t\tinst.input.trigger( \"focus\" ); // restore focus\n\t\t\t}\n\t\t\tthis._lastInput = null;\n\t\t}\n\t},\n\n\t/* Update any alternate field to synchronise with the main field. */\n\t_updateAlternate: function( inst ) {\n\t\tvar altFormat, date, dateStr,\n\t\t\taltField = this._get( inst, \"altField\" );\n\n\t\tif ( altField ) { // update alternate field too\n\t\t\taltFormat = this._get( inst, \"altFormat\" ) || this._get( inst, \"dateFormat\" );\n\t\t\tdate = this._getDate( inst );\n\t\t\tdateStr = this.formatDate( altFormat, date, this._getFormatConfig( inst ) );\n\t\t\t$( altField ).val( dateStr );\n\t\t}\n\t},\n\n\t/* Set as beforeShowDay function to prevent selection of weekends.\n\t * @param  date  Date - the date to customise\n\t * @return [boolean, string] - is this date selectable?, what is its CSS class?\n\t */\n\tnoWeekends: function( date ) {\n\t\tvar day = date.getDay();\n\t\treturn [ ( day > 0 && day < 6 ), \"\" ];\n\t},\n\n\t/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.\n\t * @param  date  Date - the date to get the week for\n\t * @return  number - the number of the week within the year that contains this date\n\t */\n\tiso8601Week: function( date ) {\n\t\tvar time,\n\t\t\tcheckDate = new Date( date.getTime() );\n\n\t\t// Find Thursday of this week starting on Monday\n\t\tcheckDate.setDate( checkDate.getDate() + 4 - ( checkDate.getDay() || 7 ) );\n\n\t\ttime = checkDate.getTime();\n\t\tcheckDate.setMonth( 0 ); // Compare with Jan 1\n\t\tcheckDate.setDate( 1 );\n\t\treturn Math.floor( Math.round( ( time - checkDate ) / 86400000 ) / 7 ) + 1;\n\t},\n\n\t/* Parse a string value into a date object.\n\t * See formatDate below for the possible formats.\n\t *\n\t * @param  format string - the expected format of the date\n\t * @param  value string - the date in the above format\n\t * @param  settings Object - attributes include:\n\t *\t\t\t\t\tshortYearCutoff  number - the cutoff year for determining the century (optional)\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n\t * @return  Date - the extracted date value or null if value is blank\n\t */\n\tparseDate: function( format, value, settings ) {\n\t\tif ( format == null || value == null ) {\n\t\t\tthrow \"Invalid arguments\";\n\t\t}\n\n\t\tvalue = ( typeof value === \"object\" ? value.toString() : value + \"\" );\n\t\tif ( value === \"\" ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar iFormat, dim, extra,\n\t\t\tiValue = 0,\n\t\t\tshortYearCutoffTemp = ( settings ? settings.shortYearCutoff : null ) || this._defaults.shortYearCutoff,\n\t\t\tshortYearCutoff = ( typeof shortYearCutoffTemp !== \"string\" ? shortYearCutoffTemp :\n\t\t\t\tnew Date().getFullYear() % 100 + parseInt( shortYearCutoffTemp, 10 ) ),\n\t\t\tdayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,\n\t\t\tdayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,\n\t\t\tmonthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,\n\t\t\tmonthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,\n\t\t\tyear = -1,\n\t\t\tmonth = -1,\n\t\t\tday = -1,\n\t\t\tdoy = -1,\n\t\t\tliteral = false,\n\t\t\tdate,\n\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function( match ) {\n\t\t\t\tvar matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );\n\t\t\t\tif ( matches ) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t},\n\n\t\t\t// Extract a number from the string value\n\t\t\tgetNumber = function( match ) {\n\t\t\t\tvar isDoubled = lookAhead( match ),\n\t\t\t\t\tsize = ( match === \"@\" ? 14 : ( match === \"!\" ? 20 :\n\t\t\t\t\t( match === \"y\" && isDoubled ? 4 : ( match === \"o\" ? 3 : 2 ) ) ) ),\n\t\t\t\t\tminSize = ( match === \"y\" ? size : 1 ),\n\t\t\t\t\tdigits = new RegExp( \"^\\\\d{\" + minSize + \",\" + size + \"}\" ),\n\t\t\t\t\tnum = value.substring( iValue ).match( digits );\n\t\t\t\tif ( !num ) {\n\t\t\t\t\tthrow \"Missing number at position \" + iValue;\n\t\t\t\t}\n\t\t\t\tiValue += num[ 0 ].length;\n\t\t\t\treturn parseInt( num[ 0 ], 10 );\n\t\t\t},\n\n\t\t\t// Extract a name from the string value and convert to an index\n\t\t\tgetName = function( match, shortNames, longNames ) {\n\t\t\t\tvar index = -1,\n\t\t\t\t\tnames = $.map( lookAhead( match ) ? longNames : shortNames, function( v, k ) {\n\t\t\t\t\t\treturn [ [ k, v ] ];\n\t\t\t\t\t} ).sort( function( a, b ) {\n\t\t\t\t\t\treturn -( a[ 1 ].length - b[ 1 ].length );\n\t\t\t\t\t} );\n\n\t\t\t\t$.each( names, function( i, pair ) {\n\t\t\t\t\tvar name = pair[ 1 ];\n\t\t\t\t\tif ( value.substr( iValue, name.length ).toLowerCase() === name.toLowerCase() ) {\n\t\t\t\t\t\tindex = pair[ 0 ];\n\t\t\t\t\t\tiValue += name.length;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tif ( index !== -1 ) {\n\t\t\t\t\treturn index + 1;\n\t\t\t\t} else {\n\t\t\t\t\tthrow \"Unknown name at position \" + iValue;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Confirm that a literal character matches the string value\n\t\t\tcheckLiteral = function() {\n\t\t\t\tif ( value.charAt( iValue ) !== format.charAt( iFormat ) ) {\n\t\t\t\t\tthrow \"Unexpected literal at position \" + iValue;\n\t\t\t\t}\n\t\t\t\tiValue++;\n\t\t\t};\n\n\t\tfor ( iFormat = 0; iFormat < format.length; iFormat++ ) {\n\t\t\tif ( literal ) {\n\t\t\t\tif ( format.charAt( iFormat ) === \"'\" && !lookAhead( \"'\" ) ) {\n\t\t\t\t\tliteral = false;\n\t\t\t\t} else {\n\t\t\t\t\tcheckLiteral();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch ( format.charAt( iFormat ) ) {\n\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\tday = getNumber( \"d\" );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\tgetName( \"D\", dayNamesShort, dayNames );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"o\":\n\t\t\t\t\t\tdoy = getNumber( \"o\" );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\tmonth = getNumber( \"m\" );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\tmonth = getName( \"M\", monthNamesShort, monthNames );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\tyear = getNumber( \"y\" );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"@\":\n\t\t\t\t\t\tdate = new Date( getNumber( \"@\" ) );\n\t\t\t\t\t\tyear = date.getFullYear();\n\t\t\t\t\t\tmonth = date.getMonth() + 1;\n\t\t\t\t\t\tday = date.getDate();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"!\":\n\t\t\t\t\t\tdate = new Date( ( getNumber( \"!\" ) - this._ticksTo1970 ) / 10000 );\n\t\t\t\t\t\tyear = date.getFullYear();\n\t\t\t\t\t\tmonth = date.getMonth() + 1;\n\t\t\t\t\t\tday = date.getDate();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\tif ( lookAhead( \"'\" ) ) {\n\t\t\t\t\t\t\tcheckLiteral();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcheckLiteral();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( iValue < value.length ) {\n\t\t\textra = value.substr( iValue );\n\t\t\tif ( !/^\\s+/.test( extra ) ) {\n\t\t\t\tthrow \"Extra/unparsed characters found in date: \" + extra;\n\t\t\t}\n\t\t}\n\n\t\tif ( year === -1 ) {\n\t\t\tyear = new Date().getFullYear();\n\t\t} else if ( year < 100 ) {\n\t\t\tyear += new Date().getFullYear() - new Date().getFullYear() % 100 +\n\t\t\t\t( year <= shortYearCutoff ? 0 : -100 );\n\t\t}\n\n\t\tif ( doy > -1 ) {\n\t\t\tmonth = 1;\n\t\t\tday = doy;\n\t\t\tdo {\n\t\t\t\tdim = this._getDaysInMonth( year, month - 1 );\n\t\t\t\tif ( day <= dim ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tmonth++;\n\t\t\t\tday -= dim;\n\t\t\t} while ( true );\n\t\t}\n\n\t\tdate = this._daylightSavingAdjust( new Date( year, month - 1, day ) );\n\t\tif ( date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day ) {\n\t\t\tthrow \"Invalid date\"; // E.g. 31/02/00\n\t\t}\n\t\treturn date;\n\t},\n\n\t/* Standard date formats. */\n\tATOM: \"yy-mm-dd\", // RFC 3339 (ISO 8601)\n\tCOOKIE: \"D, dd M yy\",\n\tISO_8601: \"yy-mm-dd\",\n\tRFC_822: \"D, d M y\",\n\tRFC_850: \"DD, dd-M-y\",\n\tRFC_1036: \"D, d M y\",\n\tRFC_1123: \"D, d M yy\",\n\tRFC_2822: \"D, d M yy\",\n\tRSS: \"D, d M y\", // RFC 822\n\tTICKS: \"!\",\n\tTIMESTAMP: \"@\",\n\tW3C: \"yy-mm-dd\", // ISO 8601\n\n\t_ticksTo1970: ( ( ( 1970 - 1 ) * 365 + Math.floor( 1970 / 4 ) - Math.floor( 1970 / 100 ) +\n\t\tMath.floor( 1970 / 400 ) ) * 24 * 60 * 60 * 10000000 ),\n\n\t/* Format a date object into a string value.\n\t * The format can be combinations of the following:\n\t * d  - day of month (no leading zero)\n\t * dd - day of month (two digit)\n\t * o  - day of year (no leading zeros)\n\t * oo - day of year (three digit)\n\t * D  - day name short\n\t * DD - day name long\n\t * m  - month of year (no leading zero)\n\t * mm - month of year (two digit)\n\t * M  - month name short\n\t * MM - month name long\n\t * y  - year (two digit)\n\t * yy - year (four digit)\n\t * @ - Unix timestamp (ms since 01/01/1970)\n\t * ! - Windows ticks (100ns since 01/01/0001)\n\t * \"...\" - literal text\n\t * '' - single quote\n\t *\n\t * @param  format string - the desired format of the date\n\t * @param  date Date - the date value to format\n\t * @param  settings Object - attributes include:\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n\t * @return  string - the date in the above format\n\t */\n\tformatDate: function( format, date, settings ) {\n\t\tif ( !date ) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tvar iFormat,\n\t\t\tdayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,\n\t\t\tdayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,\n\t\t\tmonthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,\n\t\t\tmonthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,\n\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function( match ) {\n\t\t\t\tvar matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );\n\t\t\t\tif ( matches ) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t},\n\n\t\t\t// Format a number, with leading zero if necessary\n\t\t\tformatNumber = function( match, value, len ) {\n\t\t\t\tvar num = \"\" + value;\n\t\t\t\tif ( lookAhead( match ) ) {\n\t\t\t\t\twhile ( num.length < len ) {\n\t\t\t\t\t\tnum = \"0\" + num;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn num;\n\t\t\t},\n\n\t\t\t// Format a name, short or long as requested\n\t\t\tformatName = function( match, value, shortNames, longNames ) {\n\t\t\t\treturn ( lookAhead( match ) ? longNames[ value ] : shortNames[ value ] );\n\t\t\t},\n\t\t\toutput = \"\",\n\t\t\tliteral = false;\n\n\t\tif ( date ) {\n\t\t\tfor ( iFormat = 0; iFormat < format.length; iFormat++ ) {\n\t\t\t\tif ( literal ) {\n\t\t\t\t\tif ( format.charAt( iFormat ) === \"'\" && !lookAhead( \"'\" ) ) {\n\t\t\t\t\t\tliteral = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += format.charAt( iFormat );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tswitch ( format.charAt( iFormat ) ) {\n\t\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\t\toutput += formatNumber( \"d\", date.getDate(), 2 );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\t\toutput += formatName( \"D\", date.getDay(), dayNamesShort, dayNames );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"o\":\n\t\t\t\t\t\t\toutput += formatNumber( \"o\",\n\t\t\t\t\t\t\t\tMath.round( ( new Date( date.getFullYear(), date.getMonth(), date.getDate() ).getTime() - new Date( date.getFullYear(), 0, 0 ).getTime() ) / 86400000 ), 3 );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\t\toutput += formatNumber( \"m\", date.getMonth() + 1, 2 );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\t\toutput += formatName( \"M\", date.getMonth(), monthNamesShort, monthNames );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\t\toutput += ( lookAhead( \"y\" ) ? date.getFullYear() :\n\t\t\t\t\t\t\t\t( date.getFullYear() % 100 < 10 ? \"0\" : \"\" ) + date.getFullYear() % 100 );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"@\":\n\t\t\t\t\t\t\toutput += date.getTime();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"!\":\n\t\t\t\t\t\t\toutput += date.getTime() * 10000 + this._ticksTo1970;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\t\tif ( lookAhead( \"'\" ) ) {\n\t\t\t\t\t\t\t\toutput += \"'\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\toutput += format.charAt( iFormat );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t},\n\n\t/* Extract all possible characters from the date format. */\n\t_possibleChars: function( format ) {\n\t\tvar iFormat,\n\t\t\tchars = \"\",\n\t\t\tliteral = false,\n\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function( match ) {\n\t\t\t\tvar matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );\n\t\t\t\tif ( matches ) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t};\n\n\t\tfor ( iFormat = 0; iFormat < format.length; iFormat++ ) {\n\t\t\tif ( literal ) {\n\t\t\t\tif ( format.charAt( iFormat ) === \"'\" && !lookAhead( \"'\" ) ) {\n\t\t\t\t\tliteral = false;\n\t\t\t\t} else {\n\t\t\t\t\tchars += format.charAt( iFormat );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch ( format.charAt( iFormat ) ) {\n\t\t\t\t\tcase \"d\": case \"m\": case \"y\": case \"@\":\n\t\t\t\t\t\tchars += \"0123456789\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"D\": case \"M\":\n\t\t\t\t\t\treturn null; // Accept anything\n\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\tif ( lookAhead( \"'\" ) ) {\n\t\t\t\t\t\t\tchars += \"'\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tchars += format.charAt( iFormat );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn chars;\n\t},\n\n\t/* Get a setting value, defaulting if necessary. */\n\t_get: function( inst, name ) {\n\t\treturn inst.settings[ name ] !== undefined ?\n\t\t\tinst.settings[ name ] : this._defaults[ name ];\n\t},\n\n\t/* Parse existing date and initialise date picker. */\n\t_setDateFromField: function( inst, noDefault ) {\n\t\tif ( inst.input.val() === inst.lastVal ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar dateFormat = this._get( inst, \"dateFormat\" ),\n\t\t\tdates = inst.lastVal = inst.input ? inst.input.val() : null,\n\t\t\tdefaultDate = this._getDefaultDate( inst ),\n\t\t\tdate = defaultDate,\n\t\t\tsettings = this._getFormatConfig( inst );\n\n\t\ttry {\n\t\t\tdate = this.parseDate( dateFormat, dates, settings ) || defaultDate;\n\t\t} catch ( event ) {\n\t\t\tdates = ( noDefault ? \"\" : dates );\n\t\t}\n\t\tinst.selectedDay = date.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\tinst.currentDay = ( dates ? date.getDate() : 0 );\n\t\tinst.currentMonth = ( dates ? date.getMonth() : 0 );\n\t\tinst.currentYear = ( dates ? date.getFullYear() : 0 );\n\t\tthis._adjustInstDate( inst );\n\t},\n\n\t/* Retrieve the default date shown on opening. */\n\t_getDefaultDate: function( inst ) {\n\t\treturn this._restrictMinMax( inst,\n\t\t\tthis._determineDate( inst, this._get( inst, \"defaultDate\" ), new Date() ) );\n\t},\n\n\t/* A date may be specified as an exact value or a relative one. */\n\t_determineDate: function( inst, date, defaultDate ) {\n\t\tvar offsetNumeric = function( offset ) {\n\t\t\t\tvar date = new Date();\n\t\t\t\tdate.setDate( date.getDate() + offset );\n\t\t\t\treturn date;\n\t\t\t},\n\t\t\toffsetString = function( offset ) {\n\t\t\t\ttry {\n\t\t\t\t\treturn $.datepicker.parseDate( $.datepicker._get( inst, \"dateFormat\" ),\n\t\t\t\t\t\toffset, $.datepicker._getFormatConfig( inst ) );\n\t\t\t\t}\n\t\t\t\tcatch ( e ) {\n\n\t\t\t\t\t// Ignore\n\t\t\t\t}\n\n\t\t\t\tvar date = ( offset.toLowerCase().match( /^c/ ) ?\n\t\t\t\t\t$.datepicker._getDate( inst ) : null ) || new Date(),\n\t\t\t\t\tyear = date.getFullYear(),\n\t\t\t\t\tmonth = date.getMonth(),\n\t\t\t\t\tday = date.getDate(),\n\t\t\t\t\tpattern = /([+\\-]?[0-9]+)\\s*(d|D|w|W|m|M|y|Y)?/g,\n\t\t\t\t\tmatches = pattern.exec( offset );\n\n\t\t\t\twhile ( matches ) {\n\t\t\t\t\tswitch ( matches[ 2 ] || \"d\" ) {\n\t\t\t\t\t\tcase \"d\" : case \"D\" :\n\t\t\t\t\t\t\tday += parseInt( matches[ 1 ], 10 ); break;\n\t\t\t\t\t\tcase \"w\" : case \"W\" :\n\t\t\t\t\t\t\tday += parseInt( matches[ 1 ], 10 ) * 7; break;\n\t\t\t\t\t\tcase \"m\" : case \"M\" :\n\t\t\t\t\t\t\tmonth += parseInt( matches[ 1 ], 10 );\n\t\t\t\t\t\t\tday = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"y\": case \"Y\" :\n\t\t\t\t\t\t\tyear += parseInt( matches[ 1 ], 10 );\n\t\t\t\t\t\t\tday = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tmatches = pattern.exec( offset );\n\t\t\t\t}\n\t\t\t\treturn new Date( year, month, day );\n\t\t\t},\n\t\t\tnewDate = ( date == null || date === \"\" ? defaultDate : ( typeof date === \"string\" ? offsetString( date ) :\n\t\t\t\t( typeof date === \"number\" ? ( isNaN( date ) ? defaultDate : offsetNumeric( date ) ) : new Date( date.getTime() ) ) ) );\n\n\t\tnewDate = ( newDate && newDate.toString() === \"Invalid Date\" ? defaultDate : newDate );\n\t\tif ( newDate ) {\n\t\t\tnewDate.setHours( 0 );\n\t\t\tnewDate.setMinutes( 0 );\n\t\t\tnewDate.setSeconds( 0 );\n\t\t\tnewDate.setMilliseconds( 0 );\n\t\t}\n\t\treturn this._daylightSavingAdjust( newDate );\n\t},\n\n\t/* Handle switch to/from daylight saving.\n\t * Hours may be non-zero on daylight saving cut-over:\n\t * > 12 when midnight changeover, but then cannot generate\n\t * midnight datetime, so jump to 1AM, otherwise reset.\n\t * @param  date  (Date) the date to check\n\t * @return  (Date) the corrected date\n\t */\n\t_daylightSavingAdjust: function( date ) {\n\t\tif ( !date ) {\n\t\t\treturn null;\n\t\t}\n\t\tdate.setHours( date.getHours() > 12 ? date.getHours() + 2 : 0 );\n\t\treturn date;\n\t},\n\n\t/* Set the date(s) directly. */\n\t_setDate: function( inst, date, noChange ) {\n\t\tvar clear = !date,\n\t\t\torigMonth = inst.selectedMonth,\n\t\t\torigYear = inst.selectedYear,\n\t\t\tnewDate = this._restrictMinMax( inst, this._determineDate( inst, date, new Date() ) );\n\n\t\tinst.selectedDay = inst.currentDay = newDate.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();\n\t\tinst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();\n\t\tif ( ( origMonth !== inst.selectedMonth || origYear !== inst.selectedYear ) && !noChange ) {\n\t\t\tthis._notifyChange( inst );\n\t\t}\n\t\tthis._adjustInstDate( inst );\n\t\tif ( inst.input ) {\n\t\t\tinst.input.val( clear ? \"\" : this._formatDate( inst ) );\n\t\t}\n\t},\n\n\t/* Retrieve the date(s) directly. */\n\t_getDate: function( inst ) {\n\t\tvar startDate = ( !inst.currentYear || ( inst.input && inst.input.val() === \"\" ) ? null :\n\t\t\tthis._daylightSavingAdjust( new Date(\n\t\t\tinst.currentYear, inst.currentMonth, inst.currentDay ) ) );\n\t\t\treturn startDate;\n\t},\n\n\t/* Attach the onxxx handlers.  These are declared statically so\n\t * they work with static code transformers like Caja.\n\t */\n\t_attachHandlers: function( inst ) {\n\t\tvar stepMonths = this._get( inst, \"stepMonths\" ),\n\t\t\tid = \"#\" + inst.id.replace( /\\\\\\\\/g, \"\\\\\" );\n\t\tinst.dpDiv.find( \"[data-handler]\" ).map( function() {\n\t\t\tvar handler = {\n\t\t\t\tprev: function() {\n\t\t\t\t\t$.datepicker._adjustDate( id, -stepMonths, \"M\" );\n\t\t\t\t},\n\t\t\t\tnext: function() {\n\t\t\t\t\t$.datepicker._adjustDate( id, +stepMonths, \"M\" );\n\t\t\t\t},\n\t\t\t\thide: function() {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t},\n\t\t\t\ttoday: function() {\n\t\t\t\t\t$.datepicker._gotoToday( id );\n\t\t\t\t},\n\t\t\t\tselectDay: function() {\n\t\t\t\t\t$.datepicker._selectDay( id, +this.getAttribute( \"data-month\" ), +this.getAttribute( \"data-year\" ), this );\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\tselectMonth: function() {\n\t\t\t\t\t$.datepicker._selectMonthYear( id, this, \"M\" );\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\tselectYear: function() {\n\t\t\t\t\t$.datepicker._selectMonthYear( id, this, \"Y\" );\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t};\n\t\t\t$( this ).on( this.getAttribute( \"data-event\" ), handler[ this.getAttribute( \"data-handler\" ) ] );\n\t\t} );\n\t},\n\n\t/* Generate the HTML for the current state of the date picker. */\n\t_generateHTML: function( inst ) {\n\t\tvar maxDraw, prevText, prev, nextText, next, currentText, gotoDate,\n\t\t\tcontrols, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,\n\t\t\tmonthNames, monthNamesShort, beforeShowDay, showOtherMonths,\n\t\t\tselectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,\n\t\t\tcornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,\n\t\t\tprintDate, dRow, tbody, daySettings, otherMonth, unselectable,\n\t\t\ttempDate = new Date(),\n\t\t\ttoday = this._daylightSavingAdjust(\n\t\t\t\tnew Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) ), // clear time\n\t\t\tisRTL = this._get( inst, \"isRTL\" ),\n\t\t\tshowButtonPanel = this._get( inst, \"showButtonPanel\" ),\n\t\t\thideIfNoPrevNext = this._get( inst, \"hideIfNoPrevNext\" ),\n\t\t\tnavigationAsDateFormat = this._get( inst, \"navigationAsDateFormat\" ),\n\t\t\tnumMonths = this._getNumberOfMonths( inst ),\n\t\t\tshowCurrentAtPos = this._get( inst, \"showCurrentAtPos\" ),\n\t\t\tstepMonths = this._get( inst, \"stepMonths\" ),\n\t\t\tisMultiMonth = ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ),\n\t\t\tcurrentDate = this._daylightSavingAdjust( ( !inst.currentDay ? new Date( 9999, 9, 9 ) :\n\t\t\t\tnew Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) ),\n\t\t\tminDate = this._getMinMaxDate( inst, \"min\" ),\n\t\t\tmaxDate = this._getMinMaxDate( inst, \"max\" ),\n\t\t\tdrawMonth = inst.drawMonth - showCurrentAtPos,\n\t\t\tdrawYear = inst.drawYear;\n\n\t\tif ( drawMonth < 0 ) {\n\t\t\tdrawMonth += 12;\n\t\t\tdrawYear--;\n\t\t}\n\t\tif ( maxDate ) {\n\t\t\tmaxDraw = this._daylightSavingAdjust( new Date( maxDate.getFullYear(),\n\t\t\t\tmaxDate.getMonth() - ( numMonths[ 0 ] * numMonths[ 1 ] ) + 1, maxDate.getDate() ) );\n\t\t\tmaxDraw = ( minDate && maxDraw < minDate ? minDate : maxDraw );\n\t\t\twhile ( this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 ) ) > maxDraw ) {\n\t\t\t\tdrawMonth--;\n\t\t\t\tif ( drawMonth < 0 ) {\n\t\t\t\t\tdrawMonth = 11;\n\t\t\t\t\tdrawYear--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tinst.drawMonth = drawMonth;\n\t\tinst.drawYear = drawYear;\n\n\t\tprevText = this._get( inst, \"prevText\" );\n\t\tprevText = ( !navigationAsDateFormat ? prevText : this.formatDate( prevText,\n\t\t\tthis._daylightSavingAdjust( new Date( drawYear, drawMonth - stepMonths, 1 ) ),\n\t\t\tthis._getFormatConfig( inst ) ) );\n\n\t\tprev = ( this._canAdjustMonth( inst, -1, drawYear, drawMonth ) ?\n\t\t\t\"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'\" +\n\t\t\t\" title='\" + prevText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"e\" : \"w\" ) + \"'>\" + prevText + \"</span></a>\" :\n\t\t\t( hideIfNoPrevNext ? \"\" : \"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='\" + prevText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"e\" : \"w\" ) + \"'>\" + prevText + \"</span></a>\" ) );\n\n\t\tnextText = this._get( inst, \"nextText\" );\n\t\tnextText = ( !navigationAsDateFormat ? nextText : this.formatDate( nextText,\n\t\t\tthis._daylightSavingAdjust( new Date( drawYear, drawMonth + stepMonths, 1 ) ),\n\t\t\tthis._getFormatConfig( inst ) ) );\n\n\t\tnext = ( this._canAdjustMonth( inst, +1, drawYear, drawMonth ) ?\n\t\t\t\"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'\" +\n\t\t\t\" title='\" + nextText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"w\" : \"e\" ) + \"'>\" + nextText + \"</span></a>\" :\n\t\t\t( hideIfNoPrevNext ? \"\" : \"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='\" + nextText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"w\" : \"e\" ) + \"'>\" + nextText + \"</span></a>\" ) );\n\n\t\tcurrentText = this._get( inst, \"currentText\" );\n\t\tgotoDate = ( this._get( inst, \"gotoCurrent\" ) && inst.currentDay ? currentDate : today );\n\t\tcurrentText = ( !navigationAsDateFormat ? currentText :\n\t\t\tthis.formatDate( currentText, gotoDate, this._getFormatConfig( inst ) ) );\n\n\t\tcontrols = ( !inst.inline ? \"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>\" +\n\t\t\tthis._get( inst, \"closeText\" ) + \"</button>\" : \"\" );\n\n\t\tbuttonPanel = ( showButtonPanel ) ? \"<div class='ui-datepicker-buttonpane ui-widget-content'>\" + ( isRTL ? controls : \"\" ) +\n\t\t\t( this._isInRange( inst, gotoDate ) ? \"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'\" +\n\t\t\t\">\" + currentText + \"</button>\" : \"\" ) + ( isRTL ? \"\" : controls ) + \"</div>\" : \"\";\n\n\t\tfirstDay = parseInt( this._get( inst, \"firstDay\" ), 10 );\n\t\tfirstDay = ( isNaN( firstDay ) ? 0 : firstDay );\n\n\t\tshowWeek = this._get( inst, \"showWeek\" );\n\t\tdayNames = this._get( inst, \"dayNames\" );\n\t\tdayNamesMin = this._get( inst, \"dayNamesMin\" );\n\t\tmonthNames = this._get( inst, \"monthNames\" );\n\t\tmonthNamesShort = this._get( inst, \"monthNamesShort\" );\n\t\tbeforeShowDay = this._get( inst, \"beforeShowDay\" );\n\t\tshowOtherMonths = this._get( inst, \"showOtherMonths\" );\n\t\tselectOtherMonths = this._get( inst, \"selectOtherMonths\" );\n\t\tdefaultDate = this._getDefaultDate( inst );\n\t\thtml = \"\";\n\n\t\tfor ( row = 0; row < numMonths[ 0 ]; row++ ) {\n\t\t\tgroup = \"\";\n\t\t\tthis.maxRows = 4;\n\t\t\tfor ( col = 0; col < numMonths[ 1 ]; col++ ) {\n\t\t\t\tselectedDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, inst.selectedDay ) );\n\t\t\t\tcornerClass = \" ui-corner-all\";\n\t\t\t\tcalender = \"\";\n\t\t\t\tif ( isMultiMonth ) {\n\t\t\t\t\tcalender += \"<div class='ui-datepicker-group\";\n\t\t\t\t\tif ( numMonths[ 1 ] > 1 ) {\n\t\t\t\t\t\tswitch ( col ) {\n\t\t\t\t\t\t\tcase 0: calender += \" ui-datepicker-group-first\";\n\t\t\t\t\t\t\t\tcornerClass = \" ui-corner-\" + ( isRTL ? \"right\" : \"left\" ); break;\n\t\t\t\t\t\t\tcase numMonths[ 1 ] - 1: calender += \" ui-datepicker-group-last\";\n\t\t\t\t\t\t\t\tcornerClass = \" ui-corner-\" + ( isRTL ? \"left\" : \"right\" ); break;\n\t\t\t\t\t\t\tdefault: calender += \" ui-datepicker-group-middle\"; cornerClass = \"\"; break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcalender += \"'>\";\n\t\t\t\t}\n\t\t\t\tcalender += \"<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix\" + cornerClass + \"'>\" +\n\t\t\t\t\t( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? next : prev ) : \"\" ) +\n\t\t\t\t\t( /all|right/.test( cornerClass ) && row === 0 ? ( isRTL ? prev : next ) : \"\" ) +\n\t\t\t\t\tthis._generateMonthYearHeader( inst, drawMonth, drawYear, minDate, maxDate,\n\t\t\t\t\trow > 0 || col > 0, monthNames, monthNamesShort ) + // draw month headers\n\t\t\t\t\t\"</div><table class='ui-datepicker-calendar'><thead>\" +\n\t\t\t\t\t\"<tr>\";\n\t\t\t\tthead = ( showWeek ? \"<th class='ui-datepicker-week-col'>\" + this._get( inst, \"weekHeader\" ) + \"</th>\" : \"\" );\n\t\t\t\tfor ( dow = 0; dow < 7; dow++ ) { // days of the week\n\t\t\t\t\tday = ( dow + firstDay ) % 7;\n\t\t\t\t\tthead += \"<th scope='col'\" + ( ( dow + firstDay + 6 ) % 7 >= 5 ? \" class='ui-datepicker-week-end'\" : \"\" ) + \">\" +\n\t\t\t\t\t\t\"<span title='\" + dayNames[ day ] + \"'>\" + dayNamesMin[ day ] + \"</span></th>\";\n\t\t\t\t}\n\t\t\t\tcalender += thead + \"</tr></thead><tbody>\";\n\t\t\t\tdaysInMonth = this._getDaysInMonth( drawYear, drawMonth );\n\t\t\t\tif ( drawYear === inst.selectedYear && drawMonth === inst.selectedMonth ) {\n\t\t\t\t\tinst.selectedDay = Math.min( inst.selectedDay, daysInMonth );\n\t\t\t\t}\n\t\t\t\tleadDays = ( this._getFirstDayOfMonth( drawYear, drawMonth ) - firstDay + 7 ) % 7;\n\t\t\t\tcurRows = Math.ceil( ( leadDays + daysInMonth ) / 7 ); // calculate the number of rows to generate\n\t\t\t\tnumRows = ( isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows ); //If multiple months, use the higher number of rows (see #7043)\n\t\t\t\tthis.maxRows = numRows;\n\t\t\t\tprintDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 - leadDays ) );\n\t\t\t\tfor ( dRow = 0; dRow < numRows; dRow++ ) { // create date picker rows\n\t\t\t\t\tcalender += \"<tr>\";\n\t\t\t\t\ttbody = ( !showWeek ? \"\" : \"<td class='ui-datepicker-week-col'>\" +\n\t\t\t\t\t\tthis._get( inst, \"calculateWeek\" )( printDate ) + \"</td>\" );\n\t\t\t\t\tfor ( dow = 0; dow < 7; dow++ ) { // create date picker days\n\t\t\t\t\t\tdaySettings = ( beforeShowDay ?\n\t\t\t\t\t\t\tbeforeShowDay.apply( ( inst.input ? inst.input[ 0 ] : null ), [ printDate ] ) : [ true, \"\" ] );\n\t\t\t\t\t\totherMonth = ( printDate.getMonth() !== drawMonth );\n\t\t\t\t\t\tunselectable = ( otherMonth && !selectOtherMonths ) || !daySettings[ 0 ] ||\n\t\t\t\t\t\t\t( minDate && printDate < minDate ) || ( maxDate && printDate > maxDate );\n\t\t\t\t\t\ttbody += \"<td class='\" +\n\t\t\t\t\t\t\t( ( dow + firstDay + 6 ) % 7 >= 5 ? \" ui-datepicker-week-end\" : \"\" ) + // highlight weekends\n\t\t\t\t\t\t\t( otherMonth ? \" ui-datepicker-other-month\" : \"\" ) + // highlight days from other months\n\t\t\t\t\t\t\t( ( printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent ) || // user pressed key\n\t\t\t\t\t\t\t( defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime() ) ?\n\n\t\t\t\t\t\t\t// or defaultDate is current printedDate and defaultDate is selectedDate\n\t\t\t\t\t\t\t\" \" + this._dayOverClass : \"\" ) + // highlight selected day\n\t\t\t\t\t\t\t( unselectable ? \" \" + this._unselectableClass + \" ui-state-disabled\" : \"\" ) +  // highlight unselectable days\n\t\t\t\t\t\t\t( otherMonth && !showOtherMonths ? \"\" : \" \" + daySettings[ 1 ] + // highlight custom dates\n\t\t\t\t\t\t\t( printDate.getTime() === currentDate.getTime() ? \" \" + this._currentClass : \"\" ) + // highlight selected day\n\t\t\t\t\t\t\t( printDate.getTime() === today.getTime() ? \" ui-datepicker-today\" : \"\" ) ) + \"'\" + // highlight today (if different)\n\t\t\t\t\t\t\t( ( !otherMonth || showOtherMonths ) && daySettings[ 2 ] ? \" title='\" + daySettings[ 2 ].replace( /'/g, \"&#39;\" ) + \"'\" : \"\" ) + // cell title\n\t\t\t\t\t\t\t( unselectable ? \"\" : \" data-handler='selectDay' data-event='click' data-month='\" + printDate.getMonth() + \"' data-year='\" + printDate.getFullYear() + \"'\" ) + \">\" + // actions\n\t\t\t\t\t\t\t( otherMonth && !showOtherMonths ? \"&#xa0;\" : // display for other months\n\t\t\t\t\t\t\t( unselectable ? \"<span class='ui-state-default'>\" + printDate.getDate() + \"</span>\" : \"<a class='ui-state-default\" +\n\t\t\t\t\t\t\t( printDate.getTime() === today.getTime() ? \" ui-state-highlight\" : \"\" ) +\n\t\t\t\t\t\t\t( printDate.getTime() === currentDate.getTime() ? \" ui-state-active\" : \"\" ) + // highlight selected day\n\t\t\t\t\t\t\t( otherMonth ? \" ui-priority-secondary\" : \"\" ) + // distinguish dates from other months\n\t\t\t\t\t\t\t\"' href='#'>\" + printDate.getDate() + \"</a>\" ) ) + \"</td>\"; // display selectable date\n\t\t\t\t\t\tprintDate.setDate( printDate.getDate() + 1 );\n\t\t\t\t\t\tprintDate = this._daylightSavingAdjust( printDate );\n\t\t\t\t\t}\n\t\t\t\t\tcalender += tbody + \"</tr>\";\n\t\t\t\t}\n\t\t\t\tdrawMonth++;\n\t\t\t\tif ( drawMonth > 11 ) {\n\t\t\t\t\tdrawMonth = 0;\n\t\t\t\t\tdrawYear++;\n\t\t\t\t}\n\t\t\t\tcalender += \"</tbody></table>\" + ( isMultiMonth ? \"</div>\" +\n\t\t\t\t\t\t\t( ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ) ? \"<div class='ui-datepicker-row-break'></div>\" : \"\" ) : \"\" );\n\t\t\t\tgroup += calender;\n\t\t\t}\n\t\t\thtml += group;\n\t\t}\n\t\thtml += buttonPanel;\n\t\tinst._keyEvent = false;\n\t\treturn html;\n\t},\n\n\t/* Generate the month and year header. */\n\t_generateMonthYearHeader: function( inst, drawMonth, drawYear, minDate, maxDate,\n\t\t\tsecondary, monthNames, monthNamesShort ) {\n\n\t\tvar inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,\n\t\t\tchangeMonth = this._get( inst, \"changeMonth\" ),\n\t\t\tchangeYear = this._get( inst, \"changeYear\" ),\n\t\t\tshowMonthAfterYear = this._get( inst, \"showMonthAfterYear\" ),\n\t\t\thtml = \"<div class='ui-datepicker-title'>\",\n\t\t\tmonthHtml = \"\";\n\n\t\t// Month selection\n\t\tif ( secondary || !changeMonth ) {\n\t\t\tmonthHtml += \"<span class='ui-datepicker-month'>\" + monthNames[ drawMonth ] + \"</span>\";\n\t\t} else {\n\t\t\tinMinYear = ( minDate && minDate.getFullYear() === drawYear );\n\t\t\tinMaxYear = ( maxDate && maxDate.getFullYear() === drawYear );\n\t\t\tmonthHtml += \"<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>\";\n\t\t\tfor ( month = 0; month < 12; month++ ) {\n\t\t\t\tif ( ( !inMinYear || month >= minDate.getMonth() ) && ( !inMaxYear || month <= maxDate.getMonth() ) ) {\n\t\t\t\t\tmonthHtml += \"<option value='\" + month + \"'\" +\n\t\t\t\t\t\t( month === drawMonth ? \" selected='selected'\" : \"\" ) +\n\t\t\t\t\t\t\">\" + monthNamesShort[ month ] + \"</option>\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tmonthHtml += \"</select>\";\n\t\t}\n\n\t\tif ( !showMonthAfterYear ) {\n\t\t\thtml += monthHtml + ( secondary || !( changeMonth && changeYear ) ? \"&#xa0;\" : \"\" );\n\t\t}\n\n\t\t// Year selection\n\t\tif ( !inst.yearshtml ) {\n\t\t\tinst.yearshtml = \"\";\n\t\t\tif ( secondary || !changeYear ) {\n\t\t\t\thtml += \"<span class='ui-datepicker-year'>\" + drawYear + \"</span>\";\n\t\t\t} else {\n\n\t\t\t\t// determine range of years to display\n\t\t\t\tyears = this._get( inst, \"yearRange\" ).split( \":\" );\n\t\t\t\tthisYear = new Date().getFullYear();\n\t\t\t\tdetermineYear = function( value ) {\n\t\t\t\t\tvar year = ( value.match( /c[+\\-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) :\n\t\t\t\t\t\t( value.match( /[+\\-].*/ ) ? thisYear + parseInt( value, 10 ) :\n\t\t\t\t\t\tparseInt( value, 10 ) ) );\n\t\t\t\t\treturn ( isNaN( year ) ? thisYear : year );\n\t\t\t\t};\n\t\t\t\tyear = determineYear( years[ 0 ] );\n\t\t\t\tendYear = Math.max( year, determineYear( years[ 1 ] || \"\" ) );\n\t\t\t\tyear = ( minDate ? Math.max( year, minDate.getFullYear() ) : year );\n\t\t\t\tendYear = ( maxDate ? Math.min( endYear, maxDate.getFullYear() ) : endYear );\n\t\t\t\tinst.yearshtml += \"<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>\";\n\t\t\t\tfor ( ; year <= endYear; year++ ) {\n\t\t\t\t\tinst.yearshtml += \"<option value='\" + year + \"'\" +\n\t\t\t\t\t\t( year === drawYear ? \" selected='selected'\" : \"\" ) +\n\t\t\t\t\t\t\">\" + year + \"</option>\";\n\t\t\t\t}\n\t\t\t\tinst.yearshtml += \"</select>\";\n\n\t\t\t\thtml += inst.yearshtml;\n\t\t\t\tinst.yearshtml = null;\n\t\t\t}\n\t\t}\n\n\t\thtml += this._get( inst, \"yearSuffix\" );\n\t\tif ( showMonthAfterYear ) {\n\t\t\thtml += ( secondary || !( changeMonth && changeYear ) ? \"&#xa0;\" : \"\" ) + monthHtml;\n\t\t}\n\t\thtml += \"</div>\"; // Close datepicker_header\n\t\treturn html;\n\t},\n\n\t/* Adjust one of the date sub-fields. */\n\t_adjustInstDate: function( inst, offset, period ) {\n\t\tvar year = inst.selectedYear + ( period === \"Y\" ? offset : 0 ),\n\t\t\tmonth = inst.selectedMonth + ( period === \"M\" ? offset : 0 ),\n\t\t\tday = Math.min( inst.selectedDay, this._getDaysInMonth( year, month ) ) + ( period === \"D\" ? offset : 0 ),\n\t\t\tdate = this._restrictMinMax( inst, this._daylightSavingAdjust( new Date( year, month, day ) ) );\n\n\t\tinst.selectedDay = date.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\tif ( period === \"M\" || period === \"Y\" ) {\n\t\t\tthis._notifyChange( inst );\n\t\t}\n\t},\n\n\t/* Ensure a date is within any min/max bounds. */\n\t_restrictMinMax: function( inst, date ) {\n\t\tvar minDate = this._getMinMaxDate( inst, \"min\" ),\n\t\t\tmaxDate = this._getMinMaxDate( inst, \"max\" ),\n\t\t\tnewDate = ( minDate && date < minDate ? minDate : date );\n\t\treturn ( maxDate && newDate > maxDate ? maxDate : newDate );\n\t},\n\n\t/* Notify change of month/year. */\n\t_notifyChange: function( inst ) {\n\t\tvar onChange = this._get( inst, \"onChangeMonthYear\" );\n\t\tif ( onChange ) {\n\t\t\tonChange.apply( ( inst.input ? inst.input[ 0 ] : null ),\n\t\t\t\t[ inst.selectedYear, inst.selectedMonth + 1, inst ] );\n\t\t}\n\t},\n\n\t/* Determine the number of months to show. */\n\t_getNumberOfMonths: function( inst ) {\n\t\tvar numMonths = this._get( inst, \"numberOfMonths\" );\n\t\treturn ( numMonths == null ? [ 1, 1 ] : ( typeof numMonths === \"number\" ? [ 1, numMonths ] : numMonths ) );\n\t},\n\n\t/* Determine the current maximum date - ensure no time components are set. */\n\t_getMinMaxDate: function( inst, minMax ) {\n\t\treturn this._determineDate( inst, this._get( inst, minMax + \"Date\" ), null );\n\t},\n\n\t/* Find the number of days in a given month. */\n\t_getDaysInMonth: function( year, month ) {\n\t\treturn 32 - this._daylightSavingAdjust( new Date( year, month, 32 ) ).getDate();\n\t},\n\n\t/* Find the day of the week of the first of a month. */\n\t_getFirstDayOfMonth: function( year, month ) {\n\t\treturn new Date( year, month, 1 ).getDay();\n\t},\n\n\t/* Determines if we should allow a \"next/prev\" month display change. */\n\t_canAdjustMonth: function( inst, offset, curYear, curMonth ) {\n\t\tvar numMonths = this._getNumberOfMonths( inst ),\n\t\t\tdate = this._daylightSavingAdjust( new Date( curYear,\n\t\t\tcurMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) );\n\n\t\tif ( offset < 0 ) {\n\t\t\tdate.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) );\n\t\t}\n\t\treturn this._isInRange( inst, date );\n\t},\n\n\t/* Is the given date in the accepted range? */\n\t_isInRange: function( inst, date ) {\n\t\tvar yearSplit, currentYear,\n\t\t\tminDate = this._getMinMaxDate( inst, \"min\" ),\n\t\t\tmaxDate = this._getMinMaxDate( inst, \"max\" ),\n\t\t\tminYear = null,\n\t\t\tmaxYear = null,\n\t\t\tyears = this._get( inst, \"yearRange\" );\n\t\t\tif ( years ) {\n\t\t\t\tyearSplit = years.split( \":\" );\n\t\t\t\tcurrentYear = new Date().getFullYear();\n\t\t\t\tminYear = parseInt( yearSplit[ 0 ], 10 );\n\t\t\t\tmaxYear = parseInt( yearSplit[ 1 ], 10 );\n\t\t\t\tif ( yearSplit[ 0 ].match( /[+\\-].*/ ) ) {\n\t\t\t\t\tminYear += currentYear;\n\t\t\t\t}\n\t\t\t\tif ( yearSplit[ 1 ].match( /[+\\-].*/ ) ) {\n\t\t\t\t\tmaxYear += currentYear;\n\t\t\t\t}\n\t\t\t}\n\n\t\treturn ( ( !minDate || date.getTime() >= minDate.getTime() ) &&\n\t\t\t( !maxDate || date.getTime() <= maxDate.getTime() ) &&\n\t\t\t( !minYear || date.getFullYear() >= minYear ) &&\n\t\t\t( !maxYear || date.getFullYear() <= maxYear ) );\n\t},\n\n\t/* Provide the configuration settings for formatting/parsing. */\n\t_getFormatConfig: function( inst ) {\n\t\tvar shortYearCutoff = this._get( inst, \"shortYearCutoff\" );\n\t\tshortYearCutoff = ( typeof shortYearCutoff !== \"string\" ? shortYearCutoff :\n\t\t\tnew Date().getFullYear() % 100 + parseInt( shortYearCutoff, 10 ) );\n\t\treturn { shortYearCutoff: shortYearCutoff,\n\t\t\tdayNamesShort: this._get( inst, \"dayNamesShort\" ), dayNames: this._get( inst, \"dayNames\" ),\n\t\t\tmonthNamesShort: this._get( inst, \"monthNamesShort\" ), monthNames: this._get( inst, \"monthNames\" ) };\n\t},\n\n\t/* Format the given date for display. */\n\t_formatDate: function( inst, day, month, year ) {\n\t\tif ( !day ) {\n\t\t\tinst.currentDay = inst.selectedDay;\n\t\t\tinst.currentMonth = inst.selectedMonth;\n\t\t\tinst.currentYear = inst.selectedYear;\n\t\t}\n\t\tvar date = ( day ? ( typeof day === \"object\" ? day :\n\t\t\tthis._daylightSavingAdjust( new Date( year, month, day ) ) ) :\n\t\t\tthis._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) );\n\t\treturn this.formatDate( this._get( inst, \"dateFormat\" ), date, this._getFormatConfig( inst ) );\n\t}\n} );\n\n/*\n * Bind hover events for datepicker elements.\n * Done via delegate so the binding only occurs once in the lifetime of the parent div.\n * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.\n */\nfunction datepicker_bindHover( dpDiv ) {\n\tvar selector = \"button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a\";\n\treturn dpDiv.on( \"mouseout\", selector, function() {\n\t\t\t$( this ).removeClass( \"ui-state-hover\" );\n\t\t\tif ( this.className.indexOf( \"ui-datepicker-prev\" ) !== -1 ) {\n\t\t\t\t$( this ).removeClass( \"ui-datepicker-prev-hover\" );\n\t\t\t}\n\t\t\tif ( this.className.indexOf( \"ui-datepicker-next\" ) !== -1 ) {\n\t\t\t\t$( this ).removeClass( \"ui-datepicker-next-hover\" );\n\t\t\t}\n\t\t} )\n\t\t.on( \"mouseover\", selector, datepicker_handleMouseover );\n}\n\nfunction datepicker_handleMouseover() {\n\tif ( !$.datepicker._isDisabledDatepicker( datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[ 0 ] : datepicker_instActive.input[ 0 ] ) ) {\n\t\t$( this ).parents( \".ui-datepicker-calendar\" ).find( \"a\" ).removeClass( \"ui-state-hover\" );\n\t\t$( this ).addClass( \"ui-state-hover\" );\n\t\tif ( this.className.indexOf( \"ui-datepicker-prev\" ) !== -1 ) {\n\t\t\t$( this ).addClass( \"ui-datepicker-prev-hover\" );\n\t\t}\n\t\tif ( this.className.indexOf( \"ui-datepicker-next\" ) !== -1 ) {\n\t\t\t$( this ).addClass( \"ui-datepicker-next-hover\" );\n\t\t}\n\t}\n}\n\n/* jQuery extend now ignores nulls! */\nfunction datepicker_extendRemove( target, props ) {\n\t$.extend( target, props );\n\tfor ( var name in props ) {\n\t\tif ( props[ name ] == null ) {\n\t\t\ttarget[ name ] = props[ name ];\n\t\t}\n\t}\n\treturn target;\n}\n\n/* Invoke the datepicker functionality.\n   @param  options  string - a command, optionally followed by additional parameters or\n\t\t\t\t\tObject - settings for attaching new datepicker functionality\n   @return  jQuery object */\n$.fn.datepicker = function( options ) {\n\n\t/* Verify an empty collection wasn't passed - Fixes #6976 */\n\tif ( !this.length ) {\n\t\treturn this;\n\t}\n\n\t/* Initialise the date picker. */\n\tif ( !$.datepicker.initialized ) {\n\t\t$( document ).on( \"mousedown\", $.datepicker._checkExternalClick );\n\t\t$.datepicker.initialized = true;\n\t}\n\n\t/* Append datepicker main container to body if not exist. */\n\tif ( $( \"#\" + $.datepicker._mainDivId ).length === 0 ) {\n\t\t$( \"body\" ).append( $.datepicker.dpDiv );\n\t}\n\n\tvar otherArgs = Array.prototype.slice.call( arguments, 1 );\n\tif ( typeof options === \"string\" && ( options === \"isDisabled\" || options === \"getDate\" || options === \"widget\" ) ) {\n\t\treturn $.datepicker[ \"_\" + options + \"Datepicker\" ].\n\t\t\tapply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );\n\t}\n\tif ( options === \"option\" && arguments.length === 2 && typeof arguments[ 1 ] === \"string\" ) {\n\t\treturn $.datepicker[ \"_\" + options + \"Datepicker\" ].\n\t\t\tapply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );\n\t}\n\treturn this.each( function() {\n\t\ttypeof options === \"string\" ?\n\t\t\t$.datepicker[ \"_\" + options + \"Datepicker\" ].\n\t\t\t\tapply( $.datepicker, [ this ].concat( otherArgs ) ) :\n\t\t\t$.datepicker._attachDatepicker( this, options );\n\t} );\n};\n\n$.datepicker = new Datepicker(); // singleton instance\n$.datepicker.initialized = false;\n$.datepicker.uuid = new Date().getTime();\n$.datepicker.version = \"1.12.1\";\n\nvar widgetsDatepicker = $.datepicker;\n\n\n/*!\n * jQuery UI Dialog 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Dialog\n//>>group: Widgets\n//>>description: Displays customizable dialog windows.\n//>>docs: http://api.jqueryui.com/dialog/\n//>>demos: http://jqueryui.com/dialog/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/dialog.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.dialog\", {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tappendTo: \"body\",\n\t\tautoOpen: true,\n\t\tbuttons: [],\n\t\tclasses: {\n\t\t\t\"ui-dialog\": \"ui-corner-all\",\n\t\t\t\"ui-dialog-titlebar\": \"ui-corner-all\"\n\t\t},\n\t\tcloseOnEscape: true,\n\t\tcloseText: \"Close\",\n\t\tdraggable: true,\n\t\thide: null,\n\t\theight: \"auto\",\n\t\tmaxHeight: null,\n\t\tmaxWidth: null,\n\t\tminHeight: 150,\n\t\tminWidth: 150,\n\t\tmodal: false,\n\t\tposition: {\n\t\t\tmy: \"center\",\n\t\t\tat: \"center\",\n\t\t\tof: window,\n\t\t\tcollision: \"fit\",\n\n\t\t\t// Ensure the titlebar is always visible\n\t\t\tusing: function( pos ) {\n\t\t\t\tvar topOffset = $( this ).css( pos ).offset().top;\n\t\t\t\tif ( topOffset < 0 ) {\n\t\t\t\t\t$( this ).css( \"top\", pos.top - topOffset );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tresizable: true,\n\t\tshow: null,\n\t\ttitle: null,\n\t\twidth: 300,\n\n\t\t// Callbacks\n\t\tbeforeClose: null,\n\t\tclose: null,\n\t\tdrag: null,\n\t\tdragStart: null,\n\t\tdragStop: null,\n\t\tfocus: null,\n\t\topen: null,\n\t\tresize: null,\n\t\tresizeStart: null,\n\t\tresizeStop: null\n\t},\n\n\tsizeRelatedOptions: {\n\t\tbuttons: true,\n\t\theight: true,\n\t\tmaxHeight: true,\n\t\tmaxWidth: true,\n\t\tminHeight: true,\n\t\tminWidth: true,\n\t\twidth: true\n\t},\n\n\tresizableRelatedOptions: {\n\t\tmaxHeight: true,\n\t\tmaxWidth: true,\n\t\tminHeight: true,\n\t\tminWidth: true\n\t},\n\n\t_create: function() {\n\t\tthis.originalCss = {\n\t\t\tdisplay: this.element[ 0 ].style.display,\n\t\t\twidth: this.element[ 0 ].style.width,\n\t\t\tminHeight: this.element[ 0 ].style.minHeight,\n\t\t\tmaxHeight: this.element[ 0 ].style.maxHeight,\n\t\t\theight: this.element[ 0 ].style.height\n\t\t};\n\t\tthis.originalPosition = {\n\t\t\tparent: this.element.parent(),\n\t\t\tindex: this.element.parent().children().index( this.element )\n\t\t};\n\t\tthis.originalTitle = this.element.attr( \"title\" );\n\t\tif ( this.options.title == null && this.originalTitle != null ) {\n\t\t\tthis.options.title = this.originalTitle;\n\t\t}\n\n\t\t// Dialogs can't be disabled\n\t\tif ( this.options.disabled ) {\n\t\t\tthis.options.disabled = false;\n\t\t}\n\n\t\tthis._createWrapper();\n\n\t\tthis.element\n\t\t\t.show()\n\t\t\t.removeAttr( \"title\" )\n\t\t\t.appendTo( this.uiDialog );\n\n\t\tthis._addClass( \"ui-dialog-content\", \"ui-widget-content\" );\n\n\t\tthis._createTitlebar();\n\t\tthis._createButtonPane();\n\n\t\tif ( this.options.draggable && $.fn.draggable ) {\n\t\t\tthis._makeDraggable();\n\t\t}\n\t\tif ( this.options.resizable && $.fn.resizable ) {\n\t\t\tthis._makeResizable();\n\t\t}\n\n\t\tthis._isOpen = false;\n\n\t\tthis._trackFocus();\n\t},\n\n\t_init: function() {\n\t\tif ( this.options.autoOpen ) {\n\t\t\tthis.open();\n\t\t}\n\t},\n\n\t_appendTo: function() {\n\t\tvar element = this.options.appendTo;\n\t\tif ( element && ( element.jquery || element.nodeType ) ) {\n\t\t\treturn $( element );\n\t\t}\n\t\treturn this.document.find( element || \"body\" ).eq( 0 );\n\t},\n\n\t_destroy: function() {\n\t\tvar next,\n\t\t\toriginalPosition = this.originalPosition;\n\n\t\tthis._untrackInstance();\n\t\tthis._destroyOverlay();\n\n\t\tthis.element\n\t\t\t.removeUniqueId()\n\t\t\t.css( this.originalCss )\n\n\t\t\t// Without detaching first, the following becomes really slow\n\t\t\t.detach();\n\n\t\tthis.uiDialog.remove();\n\n\t\tif ( this.originalTitle ) {\n\t\t\tthis.element.attr( \"title\", this.originalTitle );\n\t\t}\n\n\t\tnext = originalPosition.parent.children().eq( originalPosition.index );\n\n\t\t// Don't try to place the dialog next to itself (#8613)\n\t\tif ( next.length && next[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tnext.before( this.element );\n\t\t} else {\n\t\t\toriginalPosition.parent.append( this.element );\n\t\t}\n\t},\n\n\twidget: function() {\n\t\treturn this.uiDialog;\n\t},\n\n\tdisable: $.noop,\n\tenable: $.noop,\n\n\tclose: function( event ) {\n\t\tvar that = this;\n\n\t\tif ( !this._isOpen || this._trigger( \"beforeClose\", event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isOpen = false;\n\t\tthis._focusedElement = null;\n\t\tthis._destroyOverlay();\n\t\tthis._untrackInstance();\n\n\t\tif ( !this.opener.filter( \":focusable\" ).trigger( \"focus\" ).length ) {\n\n\t\t\t// Hiding a focused element doesn't trigger blur in WebKit\n\t\t\t// so in case we have nothing to focus on, explicitly blur the active element\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=47182\n\t\t\t$.ui.safeBlur( $.ui.safeActiveElement( this.document[ 0 ] ) );\n\t\t}\n\n\t\tthis._hide( this.uiDialog, this.options.hide, function() {\n\t\t\tthat._trigger( \"close\", event );\n\t\t} );\n\t},\n\n\tisOpen: function() {\n\t\treturn this._isOpen;\n\t},\n\n\tmoveToTop: function() {\n\t\tthis._moveToTop();\n\t},\n\n\t_moveToTop: function( event, silent ) {\n\t\tvar moved = false,\n\t\t\tzIndices = this.uiDialog.siblings( \".ui-front:visible\" ).map( function() {\n\t\t\t\treturn +$( this ).css( \"z-index\" );\n\t\t\t} ).get(),\n\t\t\tzIndexMax = Math.max.apply( null, zIndices );\n\n\t\tif ( zIndexMax >= +this.uiDialog.css( \"z-index\" ) ) {\n\t\t\tthis.uiDialog.css( \"z-index\", zIndexMax + 1 );\n\t\t\tmoved = true;\n\t\t}\n\n\t\tif ( moved && !silent ) {\n\t\t\tthis._trigger( \"focus\", event );\n\t\t}\n\t\treturn moved;\n\t},\n\n\topen: function() {\n\t\tvar that = this;\n\t\tif ( this._isOpen ) {\n\t\t\tif ( this._moveToTop() ) {\n\t\t\t\tthis._focusTabbable();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isOpen = true;\n\t\tthis.opener = $( $.ui.safeActiveElement( this.document[ 0 ] ) );\n\n\t\tthis._size();\n\t\tthis._position();\n\t\tthis._createOverlay();\n\t\tthis._moveToTop( null, true );\n\n\t\t// Ensure the overlay is moved to the top with the dialog, but only when\n\t\t// opening. The overlay shouldn't move after the dialog is open so that\n\t\t// modeless dialogs opened after the modal dialog stack properly.\n\t\tif ( this.overlay ) {\n\t\t\tthis.overlay.css( \"z-index\", this.uiDialog.css( \"z-index\" ) - 1 );\n\t\t}\n\n\t\tthis._show( this.uiDialog, this.options.show, function() {\n\t\t\tthat._focusTabbable();\n\t\t\tthat._trigger( \"focus\" );\n\t\t} );\n\n\t\t// Track the dialog immediately upon openening in case a focus event\n\t\t// somehow occurs outside of the dialog before an element inside the\n\t\t// dialog is focused (#10152)\n\t\tthis._makeFocusTarget();\n\n\t\tthis._trigger( \"open\" );\n\t},\n\n\t_focusTabbable: function() {\n\n\t\t// Set focus to the first match:\n\t\t// 1. An element that was focused previously\n\t\t// 2. First element inside the dialog matching [autofocus]\n\t\t// 3. Tabbable element inside the content element\n\t\t// 4. Tabbable element inside the buttonpane\n\t\t// 5. The close button\n\t\t// 6. The dialog itself\n\t\tvar hasFocus = this._focusedElement;\n\t\tif ( !hasFocus ) {\n\t\t\thasFocus = this.element.find( \"[autofocus]\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.element.find( \":tabbable\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialogButtonPane.find( \":tabbable\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialogTitlebarClose.filter( \":tabbable\" );\n\t\t}\n\t\tif ( !hasFocus.length ) {\n\t\t\thasFocus = this.uiDialog;\n\t\t}\n\t\thasFocus.eq( 0 ).trigger( \"focus\" );\n\t},\n\n\t_keepFocus: function( event ) {\n\t\tfunction checkFocus() {\n\t\t\tvar activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),\n\t\t\t\tisActive = this.uiDialog[ 0 ] === activeElement ||\n\t\t\t\t\t$.contains( this.uiDialog[ 0 ], activeElement );\n\t\t\tif ( !isActive ) {\n\t\t\t\tthis._focusTabbable();\n\t\t\t}\n\t\t}\n\t\tevent.preventDefault();\n\t\tcheckFocus.call( this );\n\n\t\t// support: IE\n\t\t// IE <= 8 doesn't prevent moving focus even with event.preventDefault()\n\t\t// so we check again later\n\t\tthis._delay( checkFocus );\n\t},\n\n\t_createWrapper: function() {\n\t\tthis.uiDialog = $( \"<div>\" )\n\t\t\t.hide()\n\t\t\t.attr( {\n\n\t\t\t\t// Setting tabIndex makes the div focusable\n\t\t\t\ttabIndex: -1,\n\t\t\t\trole: \"dialog\"\n\t\t\t} )\n\t\t\t.appendTo( this._appendTo() );\n\n\t\tthis._addClass( this.uiDialog, \"ui-dialog\", \"ui-widget ui-widget-content ui-front\" );\n\t\tthis._on( this.uiDialog, {\n\t\t\tkeydown: function( event ) {\n\t\t\t\tif ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&\n\t\t\t\t\t\tevent.keyCode === $.ui.keyCode.ESCAPE ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tthis.close( event );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Prevent tabbing out of dialogs\n\t\t\t\tif ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar tabbables = this.uiDialog.find( \":tabbable\" ),\n\t\t\t\t\tfirst = tabbables.filter( \":first\" ),\n\t\t\t\t\tlast = tabbables.filter( \":last\" );\n\n\t\t\t\tif ( ( event.target === last[ 0 ] || event.target === this.uiDialog[ 0 ] ) &&\n\t\t\t\t\t\t!event.shiftKey ) {\n\t\t\t\t\tthis._delay( function() {\n\t\t\t\t\t\tfirst.trigger( \"focus\" );\n\t\t\t\t\t} );\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t} else if ( ( event.target === first[ 0 ] ||\n\t\t\t\t\t\tevent.target === this.uiDialog[ 0 ] ) && event.shiftKey ) {\n\t\t\t\t\tthis._delay( function() {\n\t\t\t\t\t\tlast.trigger( \"focus\" );\n\t\t\t\t\t} );\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t},\n\t\t\tmousedown: function( event ) {\n\t\t\t\tif ( this._moveToTop( event ) ) {\n\t\t\t\t\tthis._focusTabbable();\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// We assume that any existing aria-describedby attribute means\n\t\t// that the dialog content is marked up properly\n\t\t// otherwise we brute force the content as the description\n\t\tif ( !this.element.find( \"[aria-describedby]\" ).length ) {\n\t\t\tthis.uiDialog.attr( {\n\t\t\t\t\"aria-describedby\": this.element.uniqueId().attr( \"id\" )\n\t\t\t} );\n\t\t}\n\t},\n\n\t_createTitlebar: function() {\n\t\tvar uiDialogTitle;\n\n\t\tthis.uiDialogTitlebar = $( \"<div>\" );\n\t\tthis._addClass( this.uiDialogTitlebar,\n\t\t\t\"ui-dialog-titlebar\", \"ui-widget-header ui-helper-clearfix\" );\n\t\tthis._on( this.uiDialogTitlebar, {\n\t\t\tmousedown: function( event ) {\n\n\t\t\t\t// Don't prevent click on close button (#8838)\n\t\t\t\t// Focusing a dialog that is partially scrolled out of view\n\t\t\t\t// causes the browser to scroll it into view, preventing the click event\n\t\t\t\tif ( !$( event.target ).closest( \".ui-dialog-titlebar-close\" ) ) {\n\n\t\t\t\t\t// Dialog isn't getting focus when dragging (#8063)\n\t\t\t\t\tthis.uiDialog.trigger( \"focus\" );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Support: IE\n\t\t// Use type=\"button\" to prevent enter keypresses in textboxes from closing the\n\t\t// dialog in IE (#9312)\n\t\tthis.uiDialogTitlebarClose = $( \"<button type='button'></button>\" )\n\t\t\t.button( {\n\t\t\t\tlabel: $( \"<a>\" ).text( this.options.closeText ).html(),\n\t\t\t\ticon: \"ui-icon-closethick\",\n\t\t\t\tshowLabel: false\n\t\t\t} )\n\t\t\t.appendTo( this.uiDialogTitlebar );\n\n\t\tthis._addClass( this.uiDialogTitlebarClose, \"ui-dialog-titlebar-close\" );\n\t\tthis._on( this.uiDialogTitlebarClose, {\n\t\t\tclick: function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.close( event );\n\t\t\t}\n\t\t} );\n\n\t\tuiDialogTitle = $( \"<span>\" ).uniqueId().prependTo( this.uiDialogTitlebar );\n\t\tthis._addClass( uiDialogTitle, \"ui-dialog-title\" );\n\t\tthis._title( uiDialogTitle );\n\n\t\tthis.uiDialogTitlebar.prependTo( this.uiDialog );\n\n\t\tthis.uiDialog.attr( {\n\t\t\t\"aria-labelledby\": uiDialogTitle.attr( \"id\" )\n\t\t} );\n\t},\n\n\t_title: function( title ) {\n\t\tif ( this.options.title ) {\n\t\t\ttitle.text( this.options.title );\n\t\t} else {\n\t\t\ttitle.html( \"&#160;\" );\n\t\t}\n\t},\n\n\t_createButtonPane: function() {\n\t\tthis.uiDialogButtonPane = $( \"<div>\" );\n\t\tthis._addClass( this.uiDialogButtonPane, \"ui-dialog-buttonpane\",\n\t\t\t\"ui-widget-content ui-helper-clearfix\" );\n\n\t\tthis.uiButtonSet = $( \"<div>\" )\n\t\t\t.appendTo( this.uiDialogButtonPane );\n\t\tthis._addClass( this.uiButtonSet, \"ui-dialog-buttonset\" );\n\n\t\tthis._createButtons();\n\t},\n\n\t_createButtons: function() {\n\t\tvar that = this,\n\t\t\tbuttons = this.options.buttons;\n\n\t\t// If we already have a button pane, remove it\n\t\tthis.uiDialogButtonPane.remove();\n\t\tthis.uiButtonSet.empty();\n\n\t\tif ( $.isEmptyObject( buttons ) || ( $.isArray( buttons ) && !buttons.length ) ) {\n\t\t\tthis._removeClass( this.uiDialog, \"ui-dialog-buttons\" );\n\t\t\treturn;\n\t\t}\n\n\t\t$.each( buttons, function( name, props ) {\n\t\t\tvar click, buttonOptions;\n\t\t\tprops = $.isFunction( props ) ?\n\t\t\t\t{ click: props, text: name } :\n\t\t\t\tprops;\n\n\t\t\t// Default to a non-submitting button\n\t\t\tprops = $.extend( { type: \"button\" }, props );\n\n\t\t\t// Change the context for the click callback to be the main element\n\t\t\tclick = props.click;\n\t\t\tbuttonOptions = {\n\t\t\t\ticon: props.icon,\n\t\t\t\ticonPosition: props.iconPosition,\n\t\t\t\tshowLabel: props.showLabel,\n\n\t\t\t\t// Deprecated options\n\t\t\t\ticons: props.icons,\n\t\t\t\ttext: props.text\n\t\t\t};\n\n\t\t\tdelete props.click;\n\t\t\tdelete props.icon;\n\t\t\tdelete props.iconPosition;\n\t\t\tdelete props.showLabel;\n\n\t\t\t// Deprecated options\n\t\t\tdelete props.icons;\n\t\t\tif ( typeof props.text === \"boolean\" ) {\n\t\t\t\tdelete props.text;\n\t\t\t}\n\n\t\t\t$( \"<button></button>\", props )\n\t\t\t\t.button( buttonOptions )\n\t\t\t\t.appendTo( that.uiButtonSet )\n\t\t\t\t.on( \"click\", function() {\n\t\t\t\t\tclick.apply( that.element[ 0 ], arguments );\n\t\t\t\t} );\n\t\t} );\n\t\tthis._addClass( this.uiDialog, \"ui-dialog-buttons\" );\n\t\tthis.uiDialogButtonPane.appendTo( this.uiDialog );\n\t},\n\n\t_makeDraggable: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tfunction filteredUi( ui ) {\n\t\t\treturn {\n\t\t\t\tposition: ui.position,\n\t\t\t\toffset: ui.offset\n\t\t\t};\n\t\t}\n\n\t\tthis.uiDialog.draggable( {\n\t\t\tcancel: \".ui-dialog-content, .ui-dialog-titlebar-close\",\n\t\t\thandle: \".ui-dialog-titlebar\",\n\t\t\tcontainment: \"document\",\n\t\t\tstart: function( event, ui ) {\n\t\t\t\tthat._addClass( $( this ), \"ui-dialog-dragging\" );\n\t\t\t\tthat._blockFrames();\n\t\t\t\tthat._trigger( \"dragStart\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tdrag: function( event, ui ) {\n\t\t\t\tthat._trigger( \"drag\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tstop: function( event, ui ) {\n\t\t\t\tvar left = ui.offset.left - that.document.scrollLeft(),\n\t\t\t\t\ttop = ui.offset.top - that.document.scrollTop();\n\n\t\t\t\toptions.position = {\n\t\t\t\t\tmy: \"left top\",\n\t\t\t\t\tat: \"left\" + ( left >= 0 ? \"+\" : \"\" ) + left + \" \" +\n\t\t\t\t\t\t\"top\" + ( top >= 0 ? \"+\" : \"\" ) + top,\n\t\t\t\t\tof: that.window\n\t\t\t\t};\n\t\t\t\tthat._removeClass( $( this ), \"ui-dialog-dragging\" );\n\t\t\t\tthat._unblockFrames();\n\t\t\t\tthat._trigger( \"dragStop\", event, filteredUi( ui ) );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_makeResizable: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options,\n\t\t\thandles = options.resizable,\n\n\t\t\t// .ui-resizable has position: relative defined in the stylesheet\n\t\t\t// but dialogs have to use absolute or fixed positioning\n\t\t\tposition = this.uiDialog.css( \"position\" ),\n\t\t\tresizeHandles = typeof handles === \"string\" ?\n\t\t\t\thandles :\n\t\t\t\t\"n,e,s,w,se,sw,ne,nw\";\n\n\t\tfunction filteredUi( ui ) {\n\t\t\treturn {\n\t\t\t\toriginalPosition: ui.originalPosition,\n\t\t\t\toriginalSize: ui.originalSize,\n\t\t\t\tposition: ui.position,\n\t\t\t\tsize: ui.size\n\t\t\t};\n\t\t}\n\n\t\tthis.uiDialog.resizable( {\n\t\t\tcancel: \".ui-dialog-content\",\n\t\t\tcontainment: \"document\",\n\t\t\talsoResize: this.element,\n\t\t\tmaxWidth: options.maxWidth,\n\t\t\tmaxHeight: options.maxHeight,\n\t\t\tminWidth: options.minWidth,\n\t\t\tminHeight: this._minHeight(),\n\t\t\thandles: resizeHandles,\n\t\t\tstart: function( event, ui ) {\n\t\t\t\tthat._addClass( $( this ), \"ui-dialog-resizing\" );\n\t\t\t\tthat._blockFrames();\n\t\t\t\tthat._trigger( \"resizeStart\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tresize: function( event, ui ) {\n\t\t\t\tthat._trigger( \"resize\", event, filteredUi( ui ) );\n\t\t\t},\n\t\t\tstop: function( event, ui ) {\n\t\t\t\tvar offset = that.uiDialog.offset(),\n\t\t\t\t\tleft = offset.left - that.document.scrollLeft(),\n\t\t\t\t\ttop = offset.top - that.document.scrollTop();\n\n\t\t\t\toptions.height = that.uiDialog.height();\n\t\t\t\toptions.width = that.uiDialog.width();\n\t\t\t\toptions.position = {\n\t\t\t\t\tmy: \"left top\",\n\t\t\t\t\tat: \"left\" + ( left >= 0 ? \"+\" : \"\" ) + left + \" \" +\n\t\t\t\t\t\t\"top\" + ( top >= 0 ? \"+\" : \"\" ) + top,\n\t\t\t\t\tof: that.window\n\t\t\t\t};\n\t\t\t\tthat._removeClass( $( this ), \"ui-dialog-resizing\" );\n\t\t\t\tthat._unblockFrames();\n\t\t\t\tthat._trigger( \"resizeStop\", event, filteredUi( ui ) );\n\t\t\t}\n\t\t} )\n\t\t\t.css( \"position\", position );\n\t},\n\n\t_trackFocus: function() {\n\t\tthis._on( this.widget(), {\n\t\t\tfocusin: function( event ) {\n\t\t\t\tthis._makeFocusTarget();\n\t\t\t\tthis._focusedElement = $( event.target );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_makeFocusTarget: function() {\n\t\tthis._untrackInstance();\n\t\tthis._trackingInstances().unshift( this );\n\t},\n\n\t_untrackInstance: function() {\n\t\tvar instances = this._trackingInstances(),\n\t\t\texists = $.inArray( this, instances );\n\t\tif ( exists !== -1 ) {\n\t\t\tinstances.splice( exists, 1 );\n\t\t}\n\t},\n\n\t_trackingInstances: function() {\n\t\tvar instances = this.document.data( \"ui-dialog-instances\" );\n\t\tif ( !instances ) {\n\t\t\tinstances = [];\n\t\t\tthis.document.data( \"ui-dialog-instances\", instances );\n\t\t}\n\t\treturn instances;\n\t},\n\n\t_minHeight: function() {\n\t\tvar options = this.options;\n\n\t\treturn options.height === \"auto\" ?\n\t\t\toptions.minHeight :\n\t\t\tMath.min( options.minHeight, options.height );\n\t},\n\n\t_position: function() {\n\n\t\t// Need to show the dialog to get the actual offset in the position plugin\n\t\tvar isVisible = this.uiDialog.is( \":visible\" );\n\t\tif ( !isVisible ) {\n\t\t\tthis.uiDialog.show();\n\t\t}\n\t\tthis.uiDialog.position( this.options.position );\n\t\tif ( !isVisible ) {\n\t\t\tthis.uiDialog.hide();\n\t\t}\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar that = this,\n\t\t\tresize = false,\n\t\t\tresizableOptions = {};\n\n\t\t$.each( options, function( key, value ) {\n\t\t\tthat._setOption( key, value );\n\n\t\t\tif ( key in that.sizeRelatedOptions ) {\n\t\t\t\tresize = true;\n\t\t\t}\n\t\t\tif ( key in that.resizableRelatedOptions ) {\n\t\t\t\tresizableOptions[ key ] = value;\n\t\t\t}\n\t\t} );\n\n\t\tif ( resize ) {\n\t\t\tthis._size();\n\t\t\tthis._position();\n\t\t}\n\t\tif ( this.uiDialog.is( \":data(ui-resizable)\" ) ) {\n\t\t\tthis.uiDialog.resizable( \"option\", resizableOptions );\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar isDraggable, isResizable,\n\t\t\tuiDialog = this.uiDialog;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"appendTo\" ) {\n\t\t\tthis.uiDialog.appendTo( this._appendTo() );\n\t\t}\n\n\t\tif ( key === \"buttons\" ) {\n\t\t\tthis._createButtons();\n\t\t}\n\n\t\tif ( key === \"closeText\" ) {\n\t\t\tthis.uiDialogTitlebarClose.button( {\n\n\t\t\t\t// Ensure that we always pass a string\n\t\t\t\tlabel: $( \"<a>\" ).text( \"\" + this.options.closeText ).html()\n\t\t\t} );\n\t\t}\n\n\t\tif ( key === \"draggable\" ) {\n\t\t\tisDraggable = uiDialog.is( \":data(ui-draggable)\" );\n\t\t\tif ( isDraggable && !value ) {\n\t\t\t\tuiDialog.draggable( \"destroy\" );\n\t\t\t}\n\n\t\t\tif ( !isDraggable && value ) {\n\t\t\t\tthis._makeDraggable();\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"position\" ) {\n\t\t\tthis._position();\n\t\t}\n\n\t\tif ( key === \"resizable\" ) {\n\n\t\t\t// currently resizable, becoming non-resizable\n\t\t\tisResizable = uiDialog.is( \":data(ui-resizable)\" );\n\t\t\tif ( isResizable && !value ) {\n\t\t\t\tuiDialog.resizable( \"destroy\" );\n\t\t\t}\n\n\t\t\t// Currently resizable, changing handles\n\t\t\tif ( isResizable && typeof value === \"string\" ) {\n\t\t\t\tuiDialog.resizable( \"option\", \"handles\", value );\n\t\t\t}\n\n\t\t\t// Currently non-resizable, becoming resizable\n\t\t\tif ( !isResizable && value !== false ) {\n\t\t\t\tthis._makeResizable();\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"title\" ) {\n\t\t\tthis._title( this.uiDialogTitlebar.find( \".ui-dialog-title\" ) );\n\t\t}\n\t},\n\n\t_size: function() {\n\n\t\t// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content\n\t\t// divs will both have width and height set, so we need to reset them\n\t\tvar nonContentHeight, minContentHeight, maxContentHeight,\n\t\t\toptions = this.options;\n\n\t\t// Reset content sizing\n\t\tthis.element.show().css( {\n\t\t\twidth: \"auto\",\n\t\t\tminHeight: 0,\n\t\t\tmaxHeight: \"none\",\n\t\t\theight: 0\n\t\t} );\n\n\t\tif ( options.minWidth > options.width ) {\n\t\t\toptions.width = options.minWidth;\n\t\t}\n\n\t\t// Reset wrapper sizing\n\t\t// determine the height of all the non-content elements\n\t\tnonContentHeight = this.uiDialog.css( {\n\t\t\theight: \"auto\",\n\t\t\twidth: options.width\n\t\t} )\n\t\t\t.outerHeight();\n\t\tminContentHeight = Math.max( 0, options.minHeight - nonContentHeight );\n\t\tmaxContentHeight = typeof options.maxHeight === \"number\" ?\n\t\t\tMath.max( 0, options.maxHeight - nonContentHeight ) :\n\t\t\t\"none\";\n\n\t\tif ( options.height === \"auto\" ) {\n\t\t\tthis.element.css( {\n\t\t\t\tminHeight: minContentHeight,\n\t\t\t\tmaxHeight: maxContentHeight,\n\t\t\t\theight: \"auto\"\n\t\t\t} );\n\t\t} else {\n\t\t\tthis.element.height( Math.max( 0, options.height - nonContentHeight ) );\n\t\t}\n\n\t\tif ( this.uiDialog.is( \":data(ui-resizable)\" ) ) {\n\t\t\tthis.uiDialog.resizable( \"option\", \"minHeight\", this._minHeight() );\n\t\t}\n\t},\n\n\t_blockFrames: function() {\n\t\tthis.iframeBlocks = this.document.find( \"iframe\" ).map( function() {\n\t\t\tvar iframe = $( this );\n\n\t\t\treturn $( \"<div>\" )\n\t\t\t\t.css( {\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\twidth: iframe.outerWidth(),\n\t\t\t\t\theight: iframe.outerHeight()\n\t\t\t\t} )\n\t\t\t\t.appendTo( iframe.parent() )\n\t\t\t\t.offset( iframe.offset() )[ 0 ];\n\t\t} );\n\t},\n\n\t_unblockFrames: function() {\n\t\tif ( this.iframeBlocks ) {\n\t\t\tthis.iframeBlocks.remove();\n\t\t\tdelete this.iframeBlocks;\n\t\t}\n\t},\n\n\t_allowInteraction: function( event ) {\n\t\tif ( $( event.target ).closest( \".ui-dialog\" ).length ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// TODO: Remove hack when datepicker implements\n\t\t// the .ui-front logic (#8989)\n\t\treturn !!$( event.target ).closest( \".ui-datepicker\" ).length;\n\t},\n\n\t_createOverlay: function() {\n\t\tif ( !this.options.modal ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// We use a delay in case the overlay is created from an\n\t\t// event that we're going to be cancelling (#2804)\n\t\tvar isOpening = true;\n\t\tthis._delay( function() {\n\t\t\tisOpening = false;\n\t\t} );\n\n\t\tif ( !this.document.data( \"ui-dialog-overlays\" ) ) {\n\n\t\t\t// Prevent use of anchors and inputs\n\t\t\t// Using _on() for an event handler shared across many instances is\n\t\t\t// safe because the dialogs stack and must be closed in reverse order\n\t\t\tthis._on( this.document, {\n\t\t\t\tfocusin: function( event ) {\n\t\t\t\t\tif ( isOpening ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !this._allowInteraction( event ) ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tthis._trackingInstances()[ 0 ]._focusTabbable();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tthis.overlay = $( \"<div>\" )\n\t\t\t.appendTo( this._appendTo() );\n\n\t\tthis._addClass( this.overlay, null, \"ui-widget-overlay ui-front\" );\n\t\tthis._on( this.overlay, {\n\t\t\tmousedown: \"_keepFocus\"\n\t\t} );\n\t\tthis.document.data( \"ui-dialog-overlays\",\n\t\t\t( this.document.data( \"ui-dialog-overlays\" ) || 0 ) + 1 );\n\t},\n\n\t_destroyOverlay: function() {\n\t\tif ( !this.options.modal ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.overlay ) {\n\t\t\tvar overlays = this.document.data( \"ui-dialog-overlays\" ) - 1;\n\n\t\t\tif ( !overlays ) {\n\t\t\t\tthis._off( this.document, \"focusin\" );\n\t\t\t\tthis.document.removeData( \"ui-dialog-overlays\" );\n\t\t\t} else {\n\t\t\t\tthis.document.data( \"ui-dialog-overlays\", overlays );\n\t\t\t}\n\n\t\t\tthis.overlay.remove();\n\t\t\tthis.overlay = null;\n\t\t}\n\t}\n} );\n\n// DEPRECATED\n// TODO: switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for dialogClass option\n\t$.widget( \"ui.dialog\", $.ui.dialog, {\n\t\toptions: {\n\t\t\tdialogClass: \"\"\n\t\t},\n\t\t_createWrapper: function() {\n\t\t\tthis._super();\n\t\t\tthis.uiDialog.addClass( this.options.dialogClass );\n\t\t},\n\t\t_setOption: function( key, value ) {\n\t\t\tif ( key === \"dialogClass\" ) {\n\t\t\t\tthis.uiDialog\n\t\t\t\t\t.removeClass( this.options.dialogClass )\n\t\t\t\t\t.addClass( value );\n\t\t\t}\n\t\t\tthis._superApply( arguments );\n\t\t}\n\t} );\n}\n\nvar widgetsDialog = $.ui.dialog;\n\n\n/*!\n * jQuery UI Progressbar 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Progressbar\n//>>group: Widgets\n// jscs:disable maximumLineLength\n//>>description: Displays a status indicator for loading state, standard percentage, and other progress indicators.\n// jscs:enable maximumLineLength\n//>>docs: http://api.jqueryui.com/progressbar/\n//>>demos: http://jqueryui.com/progressbar/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/progressbar.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\nvar widgetsProgressbar = $.widget( \"ui.progressbar\", {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-progressbar\": \"ui-corner-all\",\n\t\t\t\"ui-progressbar-value\": \"ui-corner-left\",\n\t\t\t\"ui-progressbar-complete\": \"ui-corner-right\"\n\t\t},\n\t\tmax: 100,\n\t\tvalue: 0,\n\n\t\tchange: null,\n\t\tcomplete: null\n\t},\n\n\tmin: 0,\n\n\t_create: function() {\n\n\t\t// Constrain initial value\n\t\tthis.oldValue = this.options.value = this._constrainedValue();\n\n\t\tthis.element.attr( {\n\n\t\t\t// Only set static values; aria-valuenow and aria-valuemax are\n\t\t\t// set inside _refreshValue()\n\t\t\trole: \"progressbar\",\n\t\t\t\"aria-valuemin\": this.min\n\t\t} );\n\t\tthis._addClass( \"ui-progressbar\", \"ui-widget ui-widget-content\" );\n\n\t\tthis.valueDiv = $( \"<div>\" ).appendTo( this.element );\n\t\tthis._addClass( this.valueDiv, \"ui-progressbar-value\", \"ui-widget-header\" );\n\t\tthis._refreshValue();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element.removeAttr( \"role aria-valuemin aria-valuemax aria-valuenow\" );\n\n\t\tthis.valueDiv.remove();\n\t},\n\n\tvalue: function( newValue ) {\n\t\tif ( newValue === undefined ) {\n\t\t\treturn this.options.value;\n\t\t}\n\n\t\tthis.options.value = this._constrainedValue( newValue );\n\t\tthis._refreshValue();\n\t},\n\n\t_constrainedValue: function( newValue ) {\n\t\tif ( newValue === undefined ) {\n\t\t\tnewValue = this.options.value;\n\t\t}\n\n\t\tthis.indeterminate = newValue === false;\n\n\t\t// Sanitize value\n\t\tif ( typeof newValue !== \"number\" ) {\n\t\t\tnewValue = 0;\n\t\t}\n\n\t\treturn this.indeterminate ? false :\n\t\t\tMath.min( this.options.max, Math.max( this.min, newValue ) );\n\t},\n\n\t_setOptions: function( options ) {\n\n\t\t// Ensure \"value\" option is set after other values (like max)\n\t\tvar value = options.value;\n\t\tdelete options.value;\n\n\t\tthis._super( options );\n\n\t\tthis.options.value = this._constrainedValue( value );\n\t\tthis._refreshValue();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"max\" ) {\n\n\t\t\t// Don't allow a max less than min\n\t\t\tvalue = Math.max( this.min, value );\n\t\t}\n\t\tthis._super( key, value );\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis.element.attr( \"aria-disabled\", value );\n\t\tthis._toggleClass( null, \"ui-state-disabled\", !!value );\n\t},\n\n\t_percentage: function() {\n\t\treturn this.indeterminate ?\n\t\t\t100 :\n\t\t\t100 * ( this.options.value - this.min ) / ( this.options.max - this.min );\n\t},\n\n\t_refreshValue: function() {\n\t\tvar value = this.options.value,\n\t\t\tpercentage = this._percentage();\n\n\t\tthis.valueDiv\n\t\t\t.toggle( this.indeterminate || value > this.min )\n\t\t\t.width( percentage.toFixed( 0 ) + \"%\" );\n\n\t\tthis\n\t\t\t._toggleClass( this.valueDiv, \"ui-progressbar-complete\", null,\n\t\t\t\tvalue === this.options.max )\n\t\t\t._toggleClass( \"ui-progressbar-indeterminate\", null, this.indeterminate );\n\n\t\tif ( this.indeterminate ) {\n\t\t\tthis.element.removeAttr( \"aria-valuenow\" );\n\t\t\tif ( !this.overlayDiv ) {\n\t\t\t\tthis.overlayDiv = $( \"<div>\" ).appendTo( this.valueDiv );\n\t\t\t\tthis._addClass( this.overlayDiv, \"ui-progressbar-overlay\" );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.element.attr( {\n\t\t\t\t\"aria-valuemax\": this.options.max,\n\t\t\t\t\"aria-valuenow\": value\n\t\t\t} );\n\t\t\tif ( this.overlayDiv ) {\n\t\t\t\tthis.overlayDiv.remove();\n\t\t\t\tthis.overlayDiv = null;\n\t\t\t}\n\t\t}\n\n\t\tif ( this.oldValue !== value ) {\n\t\t\tthis.oldValue = value;\n\t\t\tthis._trigger( \"change\" );\n\t\t}\n\t\tif ( value === this.options.max ) {\n\t\t\tthis._trigger( \"complete\" );\n\t\t}\n\t}\n} );\n\n\n/*!\n * jQuery UI Selectmenu 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Selectmenu\n//>>group: Widgets\n// jscs:disable maximumLineLength\n//>>description: Duplicates and extends the functionality of a native HTML select element, allowing it to be customizable in behavior and appearance far beyond the limitations of a native select.\n// jscs:enable maximumLineLength\n//>>docs: http://api.jqueryui.com/selectmenu/\n//>>demos: http://jqueryui.com/selectmenu/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/selectmenu.css, ../../themes/base/button.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\nvar widgetsSelectmenu = $.widget( \"ui.selectmenu\", [ $.ui.formResetMixin, {\n\tversion: \"1.12.1\",\n\tdefaultElement: \"<select>\",\n\toptions: {\n\t\tappendTo: null,\n\t\tclasses: {\n\t\t\t\"ui-selectmenu-button-open\": \"ui-corner-top\",\n\t\t\t\"ui-selectmenu-button-closed\": \"ui-corner-all\"\n\t\t},\n\t\tdisabled: null,\n\t\ticons: {\n\t\t\tbutton: \"ui-icon-triangle-1-s\"\n\t\t},\n\t\tposition: {\n\t\t\tmy: \"left top\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"none\"\n\t\t},\n\t\twidth: false,\n\n\t\t// Callbacks\n\t\tchange: null,\n\t\tclose: null,\n\t\tfocus: null,\n\t\topen: null,\n\t\tselect: null\n\t},\n\n\t_create: function() {\n\t\tvar selectmenuId = this.element.uniqueId().attr( \"id\" );\n\t\tthis.ids = {\n\t\t\telement: selectmenuId,\n\t\t\tbutton: selectmenuId + \"-button\",\n\t\t\tmenu: selectmenuId + \"-menu\"\n\t\t};\n\n\t\tthis._drawButton();\n\t\tthis._drawMenu();\n\t\tthis._bindFormResetHandler();\n\n\t\tthis._rendered = false;\n\t\tthis.menuItems = $();\n\t},\n\n\t_drawButton: function() {\n\t\tvar icon,\n\t\t\tthat = this,\n\t\t\titem = this._parseOption(\n\t\t\t\tthis.element.find( \"option:selected\" ),\n\t\t\t\tthis.element[ 0 ].selectedIndex\n\t\t\t);\n\n\t\t// Associate existing label with the new button\n\t\tthis.labels = this.element.labels().attr( \"for\", this.ids.button );\n\t\tthis._on( this.labels, {\n\t\t\tclick: function( event ) {\n\t\t\t\tthis.button.focus();\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t} );\n\n\t\t// Hide original select element\n\t\tthis.element.hide();\n\n\t\t// Create button\n\t\tthis.button = $( \"<span>\", {\n\t\t\ttabindex: this.options.disabled ? -1 : 0,\n\t\t\tid: this.ids.button,\n\t\t\trole: \"combobox\",\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\t\"aria-autocomplete\": \"list\",\n\t\t\t\"aria-owns\": this.ids.menu,\n\t\t\t\"aria-haspopup\": \"true\",\n\t\t\ttitle: this.element.attr( \"title\" )\n\t\t} )\n\t\t\t.insertAfter( this.element );\n\n\t\tthis._addClass( this.button, \"ui-selectmenu-button ui-selectmenu-button-closed\",\n\t\t\t\"ui-button ui-widget\" );\n\n\t\ticon = $( \"<span>\" ).appendTo( this.button );\n\t\tthis._addClass( icon, \"ui-selectmenu-icon\", \"ui-icon \" + this.options.icons.button );\n\t\tthis.buttonItem = this._renderButtonItem( item )\n\t\t\t.appendTo( this.button );\n\n\t\tif ( this.options.width !== false ) {\n\t\t\tthis._resizeButton();\n\t\t}\n\n\t\tthis._on( this.button, this._buttonEvents );\n\t\tthis.button.one( \"focusin\", function() {\n\n\t\t\t// Delay rendering the menu items until the button receives focus.\n\t\t\t// The menu may have already been rendered via a programmatic open.\n\t\t\tif ( !that._rendered ) {\n\t\t\t\tthat._refreshMenu();\n\t\t\t}\n\t\t} );\n\t},\n\n\t_drawMenu: function() {\n\t\tvar that = this;\n\n\t\t// Create menu\n\t\tthis.menu = $( \"<ul>\", {\n\t\t\t\"aria-hidden\": \"true\",\n\t\t\t\"aria-labelledby\": this.ids.button,\n\t\t\tid: this.ids.menu\n\t\t} );\n\n\t\t// Wrap menu\n\t\tthis.menuWrap = $( \"<div>\" ).append( this.menu );\n\t\tthis._addClass( this.menuWrap, \"ui-selectmenu-menu\", \"ui-front\" );\n\t\tthis.menuWrap.appendTo( this._appendTo() );\n\n\t\t// Initialize menu widget\n\t\tthis.menuInstance = this.menu\n\t\t\t.menu( {\n\t\t\t\tclasses: {\n\t\t\t\t\t\"ui-menu\": \"ui-corner-bottom\"\n\t\t\t\t},\n\t\t\t\trole: \"listbox\",\n\t\t\t\tselect: function( event, ui ) {\n\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t// Support: IE8\n\t\t\t\t\t// If the item was selected via a click, the text selection\n\t\t\t\t\t// will be destroyed in IE\n\t\t\t\t\tthat._setSelection();\n\n\t\t\t\t\tthat._select( ui.item.data( \"ui-selectmenu-item\" ), event );\n\t\t\t\t},\n\t\t\t\tfocus: function( event, ui ) {\n\t\t\t\t\tvar item = ui.item.data( \"ui-selectmenu-item\" );\n\n\t\t\t\t\t// Prevent inital focus from firing and check if its a newly focused item\n\t\t\t\t\tif ( that.focusIndex != null && item.index !== that.focusIndex ) {\n\t\t\t\t\t\tthat._trigger( \"focus\", event, { item: item } );\n\t\t\t\t\t\tif ( !that.isOpen ) {\n\t\t\t\t\t\t\tthat._select( item, event );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthat.focusIndex = item.index;\n\n\t\t\t\t\tthat.button.attr( \"aria-activedescendant\",\n\t\t\t\t\t\tthat.menuItems.eq( item.index ).attr( \"id\" ) );\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.menu( \"instance\" );\n\n\t\t// Don't close the menu on mouseleave\n\t\tthis.menuInstance._off( this.menu, \"mouseleave\" );\n\n\t\t// Cancel the menu's collapseAll on document click\n\t\tthis.menuInstance._closeOnDocumentClick = function() {\n\t\t\treturn false;\n\t\t};\n\n\t\t// Selects often contain empty items, but never contain dividers\n\t\tthis.menuInstance._isDivider = function() {\n\t\t\treturn false;\n\t\t};\n\t},\n\n\trefresh: function() {\n\t\tthis._refreshMenu();\n\t\tthis.buttonItem.replaceWith(\n\t\t\tthis.buttonItem = this._renderButtonItem(\n\n\t\t\t\t// Fall back to an empty object in case there are no options\n\t\t\t\tthis._getSelectedItem().data( \"ui-selectmenu-item\" ) || {}\n\t\t\t)\n\t\t);\n\t\tif ( this.options.width === null ) {\n\t\t\tthis._resizeButton();\n\t\t}\n\t},\n\n\t_refreshMenu: function() {\n\t\tvar item,\n\t\t\toptions = this.element.find( \"option\" );\n\n\t\tthis.menu.empty();\n\n\t\tthis._parseOptions( options );\n\t\tthis._renderMenu( this.menu, this.items );\n\n\t\tthis.menuInstance.refresh();\n\t\tthis.menuItems = this.menu.find( \"li\" )\n\t\t\t.not( \".ui-selectmenu-optgroup\" )\n\t\t\t\t.find( \".ui-menu-item-wrapper\" );\n\n\t\tthis._rendered = true;\n\n\t\tif ( !options.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\titem = this._getSelectedItem();\n\n\t\t// Update the menu to have the correct item focused\n\t\tthis.menuInstance.focus( null, item );\n\t\tthis._setAria( item.data( \"ui-selectmenu-item\" ) );\n\n\t\t// Set disabled state\n\t\tthis._setOption( \"disabled\", this.element.prop( \"disabled\" ) );\n\t},\n\n\topen: function( event ) {\n\t\tif ( this.options.disabled ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If this is the first time the menu is being opened, render the items\n\t\tif ( !this._rendered ) {\n\t\t\tthis._refreshMenu();\n\t\t} else {\n\n\t\t\t// Menu clears focus on close, reset focus to selected item\n\t\t\tthis._removeClass( this.menu.find( \".ui-state-active\" ), null, \"ui-state-active\" );\n\t\t\tthis.menuInstance.focus( null, this._getSelectedItem() );\n\t\t}\n\n\t\t// If there are no options, don't open the menu\n\t\tif ( !this.menuItems.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isOpen = true;\n\t\tthis._toggleAttr();\n\t\tthis._resizeMenu();\n\t\tthis._position();\n\n\t\tthis._on( this.document, this._documentClick );\n\n\t\tthis._trigger( \"open\", event );\n\t},\n\n\t_position: function() {\n\t\tthis.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );\n\t},\n\n\tclose: function( event ) {\n\t\tif ( !this.isOpen ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isOpen = false;\n\t\tthis._toggleAttr();\n\n\t\tthis.range = null;\n\t\tthis._off( this.document );\n\n\t\tthis._trigger( \"close\", event );\n\t},\n\n\twidget: function() {\n\t\treturn this.button;\n\t},\n\n\tmenuWidget: function() {\n\t\treturn this.menu;\n\t},\n\n\t_renderButtonItem: function( item ) {\n\t\tvar buttonItem = $( \"<span>\" );\n\n\t\tthis._setText( buttonItem, item.label );\n\t\tthis._addClass( buttonItem, \"ui-selectmenu-text\" );\n\n\t\treturn buttonItem;\n\t},\n\n\t_renderMenu: function( ul, items ) {\n\t\tvar that = this,\n\t\t\tcurrentOptgroup = \"\";\n\n\t\t$.each( items, function( index, item ) {\n\t\t\tvar li;\n\n\t\t\tif ( item.optgroup !== currentOptgroup ) {\n\t\t\t\tli = $( \"<li>\", {\n\t\t\t\t\ttext: item.optgroup\n\t\t\t\t} );\n\t\t\t\tthat._addClass( li, \"ui-selectmenu-optgroup\", \"ui-menu-divider\" +\n\t\t\t\t\t( item.element.parent( \"optgroup\" ).prop( \"disabled\" ) ?\n\t\t\t\t\t\t\" ui-state-disabled\" :\n\t\t\t\t\t\t\"\" ) );\n\n\t\t\t\tli.appendTo( ul );\n\n\t\t\t\tcurrentOptgroup = item.optgroup;\n\t\t\t}\n\n\t\t\tthat._renderItemData( ul, item );\n\t\t} );\n\t},\n\n\t_renderItemData: function( ul, item ) {\n\t\treturn this._renderItem( ul, item ).data( \"ui-selectmenu-item\", item );\n\t},\n\n\t_renderItem: function( ul, item ) {\n\t\tvar li = $( \"<li>\" ),\n\t\t\twrapper = $( \"<div>\", {\n\t\t\t\ttitle: item.element.attr( \"title\" )\n\t\t\t} );\n\n\t\tif ( item.disabled ) {\n\t\t\tthis._addClass( li, null, \"ui-state-disabled\" );\n\t\t}\n\t\tthis._setText( wrapper, item.label );\n\n\t\treturn li.append( wrapper ).appendTo( ul );\n\t},\n\n\t_setText: function( element, value ) {\n\t\tif ( value ) {\n\t\t\telement.text( value );\n\t\t} else {\n\t\t\telement.html( \"&#160;\" );\n\t\t}\n\t},\n\n\t_move: function( direction, event ) {\n\t\tvar item, next,\n\t\t\tfilter = \".ui-menu-item\";\n\n\t\tif ( this.isOpen ) {\n\t\t\titem = this.menuItems.eq( this.focusIndex ).parent( \"li\" );\n\t\t} else {\n\t\t\titem = this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( \"li\" );\n\t\t\tfilter += \":not(.ui-state-disabled)\";\n\t\t}\n\n\t\tif ( direction === \"first\" || direction === \"last\" ) {\n\t\t\tnext = item[ direction === \"first\" ? \"prevAll\" : \"nextAll\" ]( filter ).eq( -1 );\n\t\t} else {\n\t\t\tnext = item[ direction + \"All\" ]( filter ).eq( 0 );\n\t\t}\n\n\t\tif ( next.length ) {\n\t\t\tthis.menuInstance.focus( event, next );\n\t\t}\n\t},\n\n\t_getSelectedItem: function() {\n\t\treturn this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( \"li\" );\n\t},\n\n\t_toggle: function( event ) {\n\t\tthis[ this.isOpen ? \"close\" : \"open\" ]( event );\n\t},\n\n\t_setSelection: function() {\n\t\tvar selection;\n\n\t\tif ( !this.range ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( window.getSelection ) {\n\t\t\tselection = window.getSelection();\n\t\t\tselection.removeAllRanges();\n\t\t\tselection.addRange( this.range );\n\n\t\t// Support: IE8\n\t\t} else {\n\t\t\tthis.range.select();\n\t\t}\n\n\t\t// Support: IE\n\t\t// Setting the text selection kills the button focus in IE, but\n\t\t// restoring the focus doesn't kill the selection.\n\t\tthis.button.focus();\n\t},\n\n\t_documentClick: {\n\t\tmousedown: function( event ) {\n\t\t\tif ( !this.isOpen ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( !$( event.target ).closest( \".ui-selectmenu-menu, #\" +\n\t\t\t\t\t$.ui.escapeSelector( this.ids.button ) ).length ) {\n\t\t\t\tthis.close( event );\n\t\t\t}\n\t\t}\n\t},\n\n\t_buttonEvents: {\n\n\t\t// Prevent text selection from being reset when interacting with the selectmenu (#10144)\n\t\tmousedown: function() {\n\t\t\tvar selection;\n\n\t\t\tif ( window.getSelection ) {\n\t\t\t\tselection = window.getSelection();\n\t\t\t\tif ( selection.rangeCount ) {\n\t\t\t\t\tthis.range = selection.getRangeAt( 0 );\n\t\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t} else {\n\t\t\t\tthis.range = document.selection.createRange();\n\t\t\t}\n\t\t},\n\n\t\tclick: function( event ) {\n\t\t\tthis._setSelection();\n\t\t\tthis._toggle( event );\n\t\t},\n\n\t\tkeydown: function( event ) {\n\t\t\tvar preventDefault = true;\n\t\t\tswitch ( event.keyCode ) {\n\t\t\tcase $.ui.keyCode.TAB:\n\t\t\tcase $.ui.keyCode.ESCAPE:\n\t\t\t\tthis.close( event );\n\t\t\t\tpreventDefault = false;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.ENTER:\n\t\t\t\tif ( this.isOpen ) {\n\t\t\t\t\tthis._selectFocusedItem( event );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\tif ( event.altKey ) {\n\t\t\t\t\tthis._toggle( event );\n\t\t\t\t} else {\n\t\t\t\t\tthis._move( \"prev\", event );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tif ( event.altKey ) {\n\t\t\t\t\tthis._toggle( event );\n\t\t\t\t} else {\n\t\t\t\t\tthis._move( \"next\", event );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.SPACE:\n\t\t\t\tif ( this.isOpen ) {\n\t\t\t\t\tthis._selectFocusedItem( event );\n\t\t\t\t} else {\n\t\t\t\t\tthis._toggle( event );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\tthis._move( \"prev\", event );\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\tthis._move( \"next\", event );\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.HOME:\n\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\tthis._move( \"first\", event );\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.END:\n\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\tthis._move( \"last\", event );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.menu.trigger( event );\n\t\t\t\tpreventDefault = false;\n\t\t\t}\n\n\t\t\tif ( preventDefault ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t},\n\n\t_selectFocusedItem: function( event ) {\n\t\tvar item = this.menuItems.eq( this.focusIndex ).parent( \"li\" );\n\t\tif ( !item.hasClass( \"ui-state-disabled\" ) ) {\n\t\t\tthis._select( item.data( \"ui-selectmenu-item\" ), event );\n\t\t}\n\t},\n\n\t_select: function( item, event ) {\n\t\tvar oldIndex = this.element[ 0 ].selectedIndex;\n\n\t\t// Change native select element\n\t\tthis.element[ 0 ].selectedIndex = item.index;\n\t\tthis.buttonItem.replaceWith( this.buttonItem = this._renderButtonItem( item ) );\n\t\tthis._setAria( item );\n\t\tthis._trigger( \"select\", event, { item: item } );\n\n\t\tif ( item.index !== oldIndex ) {\n\t\t\tthis._trigger( \"change\", event, { item: item } );\n\t\t}\n\n\t\tthis.close( event );\n\t},\n\n\t_setAria: function( item ) {\n\t\tvar id = this.menuItems.eq( item.index ).attr( \"id\" );\n\n\t\tthis.button.attr( {\n\t\t\t\"aria-labelledby\": id,\n\t\t\t\"aria-activedescendant\": id\n\t\t} );\n\t\tthis.menu.attr( \"aria-activedescendant\", id );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"icons\" ) {\n\t\t\tvar icon = this.button.find( \"span.ui-icon\" );\n\t\t\tthis._removeClass( icon, null, this.options.icons.button )\n\t\t\t\t._addClass( icon, null, value.button );\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"appendTo\" ) {\n\t\t\tthis.menuWrap.appendTo( this._appendTo() );\n\t\t}\n\n\t\tif ( key === \"width\" ) {\n\t\t\tthis._resizeButton();\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis.menuInstance.option( \"disabled\", value );\n\t\tthis.button.attr( \"aria-disabled\", value );\n\t\tthis._toggleClass( this.button, null, \"ui-state-disabled\", value );\n\n\t\tthis.element.prop( \"disabled\", value );\n\t\tif ( value ) {\n\t\t\tthis.button.attr( \"tabindex\", -1 );\n\t\t\tthis.close();\n\t\t} else {\n\t\t\tthis.button.attr( \"tabindex\", 0 );\n\t\t}\n\t},\n\n\t_appendTo: function() {\n\t\tvar element = this.options.appendTo;\n\n\t\tif ( element ) {\n\t\t\telement = element.jquery || element.nodeType ?\n\t\t\t\t$( element ) :\n\t\t\t\tthis.document.find( element ).eq( 0 );\n\t\t}\n\n\t\tif ( !element || !element[ 0 ] ) {\n\t\t\telement = this.element.closest( \".ui-front, dialog\" );\n\t\t}\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[ 0 ].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_toggleAttr: function() {\n\t\tthis.button.attr( \"aria-expanded\", this.isOpen );\n\n\t\t// We can't use two _toggleClass() calls here, because we need to make sure\n\t\t// we always remove classes first and add them second, otherwise if both classes have the\n\t\t// same theme class, it will be removed after we add it.\n\t\tthis._removeClass( this.button, \"ui-selectmenu-button-\" +\n\t\t\t( this.isOpen ? \"closed\" : \"open\" ) )\n\t\t\t._addClass( this.button, \"ui-selectmenu-button-\" +\n\t\t\t\t( this.isOpen ? \"open\" : \"closed\" ) )\n\t\t\t._toggleClass( this.menuWrap, \"ui-selectmenu-open\", null, this.isOpen );\n\n\t\tthis.menu.attr( \"aria-hidden\", !this.isOpen );\n\t},\n\n\t_resizeButton: function() {\n\t\tvar width = this.options.width;\n\n\t\t// For `width: false`, just remove inline style and stop\n\t\tif ( width === false ) {\n\t\t\tthis.button.css( \"width\", \"\" );\n\t\t\treturn;\n\t\t}\n\n\t\t// For `width: null`, match the width of the original element\n\t\tif ( width === null ) {\n\t\t\twidth = this.element.show().outerWidth();\n\t\t\tthis.element.hide();\n\t\t}\n\n\t\tthis.button.outerWidth( width );\n\t},\n\n\t_resizeMenu: function() {\n\t\tthis.menu.outerWidth( Math.max(\n\t\t\tthis.button.outerWidth(),\n\n\t\t\t// Support: IE10\n\t\t\t// IE10 wraps long text (possibly a rounding bug)\n\t\t\t// so we add 1px to avoid the wrapping\n\t\t\tthis.menu.width( \"\" ).outerWidth() + 1\n\t\t) );\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar options = this._super();\n\n\t\toptions.disabled = this.element.prop( \"disabled\" );\n\n\t\treturn options;\n\t},\n\n\t_parseOptions: function( options ) {\n\t\tvar that = this,\n\t\t\tdata = [];\n\t\toptions.each( function( index, item ) {\n\t\t\tdata.push( that._parseOption( $( item ), index ) );\n\t\t} );\n\t\tthis.items = data;\n\t},\n\n\t_parseOption: function( option, index ) {\n\t\tvar optgroup = option.parent( \"optgroup\" );\n\n\t\treturn {\n\t\t\telement: option,\n\t\t\tindex: index,\n\t\t\tvalue: option.val(),\n\t\t\tlabel: option.text(),\n\t\t\toptgroup: optgroup.attr( \"label\" ) || \"\",\n\t\t\tdisabled: optgroup.prop( \"disabled\" ) || option.prop( \"disabled\" )\n\t\t};\n\t},\n\n\t_destroy: function() {\n\t\tthis._unbindFormResetHandler();\n\t\tthis.menuWrap.remove();\n\t\tthis.button.remove();\n\t\tthis.element.show();\n\t\tthis.element.removeUniqueId();\n\t\tthis.labels.attr( \"for\", this.ids.element );\n\t}\n} ] );\n\n\n/*!\n * jQuery UI Slider 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Slider\n//>>group: Widgets\n//>>description: Displays a flexible slider with ranges and accessibility via keyboard.\n//>>docs: http://api.jqueryui.com/slider/\n//>>demos: http://jqueryui.com/slider/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/slider.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\nvar widgetsSlider = $.widget( \"ui.slider\", $.ui.mouse, {\n\tversion: \"1.12.1\",\n\twidgetEventPrefix: \"slide\",\n\n\toptions: {\n\t\tanimate: false,\n\t\tclasses: {\n\t\t\t\"ui-slider\": \"ui-corner-all\",\n\t\t\t\"ui-slider-handle\": \"ui-corner-all\",\n\n\t\t\t// Note: ui-widget-header isn't the most fittingly semantic framework class for this\n\t\t\t// element, but worked best visually with a variety of themes\n\t\t\t\"ui-slider-range\": \"ui-corner-all ui-widget-header\"\n\t\t},\n\t\tdistance: 0,\n\t\tmax: 100,\n\t\tmin: 0,\n\t\torientation: \"horizontal\",\n\t\trange: false,\n\t\tstep: 1,\n\t\tvalue: 0,\n\t\tvalues: null,\n\n\t\t// Callbacks\n\t\tchange: null,\n\t\tslide: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t// Number of pages in a slider\n\t// (how many times can you page up/down to go through the whole range)\n\tnumPages: 5,\n\n\t_create: function() {\n\t\tthis._keySliding = false;\n\t\tthis._mouseSliding = false;\n\t\tthis._animateOff = true;\n\t\tthis._handleIndex = null;\n\t\tthis._detectOrientation();\n\t\tthis._mouseInit();\n\t\tthis._calculateNewMax();\n\n\t\tthis._addClass( \"ui-slider ui-slider-\" + this.orientation,\n\t\t\t\"ui-widget ui-widget-content\" );\n\n\t\tthis._refresh();\n\n\t\tthis._animateOff = false;\n\t},\n\n\t_refresh: function() {\n\t\tthis._createRange();\n\t\tthis._createHandles();\n\t\tthis._setupEvents();\n\t\tthis._refreshValue();\n\t},\n\n\t_createHandles: function() {\n\t\tvar i, handleCount,\n\t\t\toptions = this.options,\n\t\t\texistingHandles = this.element.find( \".ui-slider-handle\" ),\n\t\t\thandle = \"<span tabindex='0'></span>\",\n\t\t\thandles = [];\n\n\t\thandleCount = ( options.values && options.values.length ) || 1;\n\n\t\tif ( existingHandles.length > handleCount ) {\n\t\t\texistingHandles.slice( handleCount ).remove();\n\t\t\texistingHandles = existingHandles.slice( 0, handleCount );\n\t\t}\n\n\t\tfor ( i = existingHandles.length; i < handleCount; i++ ) {\n\t\t\thandles.push( handle );\n\t\t}\n\n\t\tthis.handles = existingHandles.add( $( handles.join( \"\" ) ).appendTo( this.element ) );\n\n\t\tthis._addClass( this.handles, \"ui-slider-handle\", \"ui-state-default\" );\n\n\t\tthis.handle = this.handles.eq( 0 );\n\n\t\tthis.handles.each( function( i ) {\n\t\t\t$( this )\n\t\t\t\t.data( \"ui-slider-handle-index\", i )\n\t\t\t\t.attr( \"tabIndex\", 0 );\n\t\t} );\n\t},\n\n\t_createRange: function() {\n\t\tvar options = this.options;\n\n\t\tif ( options.range ) {\n\t\t\tif ( options.range === true ) {\n\t\t\t\tif ( !options.values ) {\n\t\t\t\t\toptions.values = [ this._valueMin(), this._valueMin() ];\n\t\t\t\t} else if ( options.values.length && options.values.length !== 2 ) {\n\t\t\t\t\toptions.values = [ options.values[ 0 ], options.values[ 0 ] ];\n\t\t\t\t} else if ( $.isArray( options.values ) ) {\n\t\t\t\t\toptions.values = options.values.slice( 0 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !this.range || !this.range.length ) {\n\t\t\t\tthis.range = $( \"<div>\" )\n\t\t\t\t\t.appendTo( this.element );\n\n\t\t\t\tthis._addClass( this.range, \"ui-slider-range\" );\n\t\t\t} else {\n\t\t\t\tthis._removeClass( this.range, \"ui-slider-range-min ui-slider-range-max\" );\n\n\t\t\t\t// Handle range switching from true to min/max\n\t\t\t\tthis.range.css( {\n\t\t\t\t\t\"left\": \"\",\n\t\t\t\t\t\"bottom\": \"\"\n\t\t\t\t} );\n\t\t\t}\n\t\t\tif ( options.range === \"min\" || options.range === \"max\" ) {\n\t\t\t\tthis._addClass( this.range, \"ui-slider-range-\" + options.range );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( this.range ) {\n\t\t\t\tthis.range.remove();\n\t\t\t}\n\t\t\tthis.range = null;\n\t\t}\n\t},\n\n\t_setupEvents: function() {\n\t\tthis._off( this.handles );\n\t\tthis._on( this.handles, this._handleEvents );\n\t\tthis._hoverable( this.handles );\n\t\tthis._focusable( this.handles );\n\t},\n\n\t_destroy: function() {\n\t\tthis.handles.remove();\n\t\tif ( this.range ) {\n\t\t\tthis.range.remove();\n\t\t}\n\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseCapture: function( event ) {\n\t\tvar position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,\n\t\t\tthat = this,\n\t\t\to = this.options;\n\n\t\tif ( o.disabled ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.elementSize = {\n\t\t\twidth: this.element.outerWidth(),\n\t\t\theight: this.element.outerHeight()\n\t\t};\n\t\tthis.elementOffset = this.element.offset();\n\n\t\tposition = { x: event.pageX, y: event.pageY };\n\t\tnormValue = this._normValueFromMouse( position );\n\t\tdistance = this._valueMax() - this._valueMin() + 1;\n\t\tthis.handles.each( function( i ) {\n\t\t\tvar thisDistance = Math.abs( normValue - that.values( i ) );\n\t\t\tif ( ( distance > thisDistance ) ||\n\t\t\t\t( distance === thisDistance &&\n\t\t\t\t\t( i === that._lastChangedValue || that.values( i ) === o.min ) ) ) {\n\t\t\t\tdistance = thisDistance;\n\t\t\t\tclosestHandle = $( this );\n\t\t\t\tindex = i;\n\t\t\t}\n\t\t} );\n\n\t\tallowed = this._start( event, index );\n\t\tif ( allowed === false ) {\n\t\t\treturn false;\n\t\t}\n\t\tthis._mouseSliding = true;\n\n\t\tthis._handleIndex = index;\n\n\t\tthis._addClass( closestHandle, null, \"ui-state-active\" );\n\t\tclosestHandle.trigger( \"focus\" );\n\n\t\toffset = closestHandle.offset();\n\t\tmouseOverHandle = !$( event.target ).parents().addBack().is( \".ui-slider-handle\" );\n\t\tthis._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {\n\t\t\tleft: event.pageX - offset.left - ( closestHandle.width() / 2 ),\n\t\t\ttop: event.pageY - offset.top -\n\t\t\t\t( closestHandle.height() / 2 ) -\n\t\t\t\t( parseInt( closestHandle.css( \"borderTopWidth\" ), 10 ) || 0 ) -\n\t\t\t\t( parseInt( closestHandle.css( \"borderBottomWidth\" ), 10 ) || 0 ) +\n\t\t\t\t( parseInt( closestHandle.css( \"marginTop\" ), 10 ) || 0 )\n\t\t};\n\n\t\tif ( !this.handles.hasClass( \"ui-state-hover\" ) ) {\n\t\t\tthis._slide( event, index, normValue );\n\t\t}\n\t\tthis._animateOff = true;\n\t\treturn true;\n\t},\n\n\t_mouseStart: function() {\n\t\treturn true;\n\t},\n\n\t_mouseDrag: function( event ) {\n\t\tvar position = { x: event.pageX, y: event.pageY },\n\t\t\tnormValue = this._normValueFromMouse( position );\n\n\t\tthis._slide( event, this._handleIndex, normValue );\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function( event ) {\n\t\tthis._removeClass( this.handles, null, \"ui-state-active\" );\n\t\tthis._mouseSliding = false;\n\n\t\tthis._stop( event, this._handleIndex );\n\t\tthis._change( event, this._handleIndex );\n\n\t\tthis._handleIndex = null;\n\t\tthis._clickOffset = null;\n\t\tthis._animateOff = false;\n\n\t\treturn false;\n\t},\n\n\t_detectOrientation: function() {\n\t\tthis.orientation = ( this.options.orientation === \"vertical\" ) ? \"vertical\" : \"horizontal\";\n\t},\n\n\t_normValueFromMouse: function( position ) {\n\t\tvar pixelTotal,\n\t\t\tpixelMouse,\n\t\t\tpercentMouse,\n\t\t\tvalueTotal,\n\t\t\tvalueMouse;\n\n\t\tif ( this.orientation === \"horizontal\" ) {\n\t\t\tpixelTotal = this.elementSize.width;\n\t\t\tpixelMouse = position.x - this.elementOffset.left -\n\t\t\t\t( this._clickOffset ? this._clickOffset.left : 0 );\n\t\t} else {\n\t\t\tpixelTotal = this.elementSize.height;\n\t\t\tpixelMouse = position.y - this.elementOffset.top -\n\t\t\t\t( this._clickOffset ? this._clickOffset.top : 0 );\n\t\t}\n\n\t\tpercentMouse = ( pixelMouse / pixelTotal );\n\t\tif ( percentMouse > 1 ) {\n\t\t\tpercentMouse = 1;\n\t\t}\n\t\tif ( percentMouse < 0 ) {\n\t\t\tpercentMouse = 0;\n\t\t}\n\t\tif ( this.orientation === \"vertical\" ) {\n\t\t\tpercentMouse = 1 - percentMouse;\n\t\t}\n\n\t\tvalueTotal = this._valueMax() - this._valueMin();\n\t\tvalueMouse = this._valueMin() + percentMouse * valueTotal;\n\n\t\treturn this._trimAlignValue( valueMouse );\n\t},\n\n\t_uiHash: function( index, value, values ) {\n\t\tvar uiHash = {\n\t\t\thandle: this.handles[ index ],\n\t\t\thandleIndex: index,\n\t\t\tvalue: value !== undefined ? value : this.value()\n\t\t};\n\n\t\tif ( this._hasMultipleValues() ) {\n\t\t\tuiHash.value = value !== undefined ? value : this.values( index );\n\t\t\tuiHash.values = values || this.values();\n\t\t}\n\n\t\treturn uiHash;\n\t},\n\n\t_hasMultipleValues: function() {\n\t\treturn this.options.values && this.options.values.length;\n\t},\n\n\t_start: function( event, index ) {\n\t\treturn this._trigger( \"start\", event, this._uiHash( index ) );\n\t},\n\n\t_slide: function( event, index, newVal ) {\n\t\tvar allowed, otherVal,\n\t\t\tcurrentValue = this.value(),\n\t\t\tnewValues = this.values();\n\n\t\tif ( this._hasMultipleValues() ) {\n\t\t\totherVal = this.values( index ? 0 : 1 );\n\t\t\tcurrentValue = this.values( index );\n\n\t\t\tif ( this.options.values.length === 2 && this.options.range === true ) {\n\t\t\t\tnewVal =  index === 0 ? Math.min( otherVal, newVal ) : Math.max( otherVal, newVal );\n\t\t\t}\n\n\t\t\tnewValues[ index ] = newVal;\n\t\t}\n\n\t\tif ( newVal === currentValue ) {\n\t\t\treturn;\n\t\t}\n\n\t\tallowed = this._trigger( \"slide\", event, this._uiHash( index, newVal, newValues ) );\n\n\t\t// A slide can be canceled by returning false from the slide callback\n\t\tif ( allowed === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this._hasMultipleValues() ) {\n\t\t\tthis.values( index, newVal );\n\t\t} else {\n\t\t\tthis.value( newVal );\n\t\t}\n\t},\n\n\t_stop: function( event, index ) {\n\t\tthis._trigger( \"stop\", event, this._uiHash( index ) );\n\t},\n\n\t_change: function( event, index ) {\n\t\tif ( !this._keySliding && !this._mouseSliding ) {\n\n\t\t\t//store the last changed value index for reference when handles overlap\n\t\t\tthis._lastChangedValue = index;\n\t\t\tthis._trigger( \"change\", event, this._uiHash( index ) );\n\t\t}\n\t},\n\n\tvalue: function( newValue ) {\n\t\tif ( arguments.length ) {\n\t\t\tthis.options.value = this._trimAlignValue( newValue );\n\t\t\tthis._refreshValue();\n\t\t\tthis._change( null, 0 );\n\t\t\treturn;\n\t\t}\n\n\t\treturn this._value();\n\t},\n\n\tvalues: function( index, newValue ) {\n\t\tvar vals,\n\t\t\tnewValues,\n\t\t\ti;\n\n\t\tif ( arguments.length > 1 ) {\n\t\t\tthis.options.values[ index ] = this._trimAlignValue( newValue );\n\t\t\tthis._refreshValue();\n\t\t\tthis._change( null, index );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( arguments.length ) {\n\t\t\tif ( $.isArray( arguments[ 0 ] ) ) {\n\t\t\t\tvals = this.options.values;\n\t\t\t\tnewValues = arguments[ 0 ];\n\t\t\t\tfor ( i = 0; i < vals.length; i += 1 ) {\n\t\t\t\t\tvals[ i ] = this._trimAlignValue( newValues[ i ] );\n\t\t\t\t\tthis._change( null, i );\n\t\t\t\t}\n\t\t\t\tthis._refreshValue();\n\t\t\t} else {\n\t\t\t\tif ( this._hasMultipleValues() ) {\n\t\t\t\t\treturn this._values( index );\n\t\t\t\t} else {\n\t\t\t\t\treturn this.value();\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn this._values();\n\t\t}\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar i,\n\t\t\tvalsLength = 0;\n\n\t\tif ( key === \"range\" && this.options.range === true ) {\n\t\t\tif ( value === \"min\" ) {\n\t\t\t\tthis.options.value = this._values( 0 );\n\t\t\t\tthis.options.values = null;\n\t\t\t} else if ( value === \"max\" ) {\n\t\t\t\tthis.options.value = this._values( this.options.values.length - 1 );\n\t\t\t\tthis.options.values = null;\n\t\t\t}\n\t\t}\n\n\t\tif ( $.isArray( this.options.values ) ) {\n\t\t\tvalsLength = this.options.values.length;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tswitch ( key ) {\n\t\t\tcase \"orientation\":\n\t\t\t\tthis._detectOrientation();\n\t\t\t\tthis._removeClass( \"ui-slider-horizontal ui-slider-vertical\" )\n\t\t\t\t\t._addClass( \"ui-slider-\" + this.orientation );\n\t\t\t\tthis._refreshValue();\n\t\t\t\tif ( this.options.range ) {\n\t\t\t\t\tthis._refreshRange( value );\n\t\t\t\t}\n\n\t\t\t\t// Reset positioning from previous orientation\n\t\t\t\tthis.handles.css( value === \"horizontal\" ? \"bottom\" : \"left\", \"\" );\n\t\t\t\tbreak;\n\t\t\tcase \"value\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refreshValue();\n\t\t\t\tthis._change( null, 0 );\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"values\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refreshValue();\n\n\t\t\t\t// Start from the last handle to prevent unreachable handles (#9046)\n\t\t\t\tfor ( i = valsLength - 1; i >= 0; i-- ) {\n\t\t\t\t\tthis._change( null, i );\n\t\t\t\t}\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"step\":\n\t\t\tcase \"min\":\n\t\t\tcase \"max\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._calculateNewMax();\n\t\t\t\tthis._refreshValue();\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t\tcase \"range\":\n\t\t\t\tthis._animateOff = true;\n\t\t\t\tthis._refresh();\n\t\t\t\tthis._animateOff = false;\n\t\t\t\tbreak;\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis._toggleClass( null, \"ui-state-disabled\", !!value );\n\t},\n\n\t//internal value getter\n\t// _value() returns value trimmed by min and max, aligned by step\n\t_value: function() {\n\t\tvar val = this.options.value;\n\t\tval = this._trimAlignValue( val );\n\n\t\treturn val;\n\t},\n\n\t//internal values getter\n\t// _values() returns array of values trimmed by min and max, aligned by step\n\t// _values( index ) returns single value trimmed by min and max, aligned by step\n\t_values: function( index ) {\n\t\tvar val,\n\t\t\tvals,\n\t\t\ti;\n\n\t\tif ( arguments.length ) {\n\t\t\tval = this.options.values[ index ];\n\t\t\tval = this._trimAlignValue( val );\n\n\t\t\treturn val;\n\t\t} else if ( this._hasMultipleValues() ) {\n\n\t\t\t// .slice() creates a copy of the array\n\t\t\t// this copy gets trimmed by min and max and then returned\n\t\t\tvals = this.options.values.slice();\n\t\t\tfor ( i = 0; i < vals.length; i += 1 ) {\n\t\t\t\tvals[ i ] = this._trimAlignValue( vals[ i ] );\n\t\t\t}\n\n\t\t\treturn vals;\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t},\n\n\t// Returns the step-aligned value that val is closest to, between (inclusive) min and max\n\t_trimAlignValue: function( val ) {\n\t\tif ( val <= this._valueMin() ) {\n\t\t\treturn this._valueMin();\n\t\t}\n\t\tif ( val >= this._valueMax() ) {\n\t\t\treturn this._valueMax();\n\t\t}\n\t\tvar step = ( this.options.step > 0 ) ? this.options.step : 1,\n\t\t\tvalModStep = ( val - this._valueMin() ) % step,\n\t\t\talignValue = val - valModStep;\n\n\t\tif ( Math.abs( valModStep ) * 2 >= step ) {\n\t\t\talignValue += ( valModStep > 0 ) ? step : ( -step );\n\t\t}\n\n\t\t// Since JavaScript has problems with large floats, round\n\t\t// the final value to 5 digits after the decimal point (see #4124)\n\t\treturn parseFloat( alignValue.toFixed( 5 ) );\n\t},\n\n\t_calculateNewMax: function() {\n\t\tvar max = this.options.max,\n\t\t\tmin = this._valueMin(),\n\t\t\tstep = this.options.step,\n\t\t\taboveMin = Math.round( ( max - min ) / step ) * step;\n\t\tmax = aboveMin + min;\n\t\tif ( max > this.options.max ) {\n\n\t\t\t//If max is not divisible by step, rounding off may increase its value\n\t\t\tmax -= step;\n\t\t}\n\t\tthis.max = parseFloat( max.toFixed( this._precision() ) );\n\t},\n\n\t_precision: function() {\n\t\tvar precision = this._precisionOf( this.options.step );\n\t\tif ( this.options.min !== null ) {\n\t\t\tprecision = Math.max( precision, this._precisionOf( this.options.min ) );\n\t\t}\n\t\treturn precision;\n\t},\n\n\t_precisionOf: function( num ) {\n\t\tvar str = num.toString(),\n\t\t\tdecimal = str.indexOf( \".\" );\n\t\treturn decimal === -1 ? 0 : str.length - decimal - 1;\n\t},\n\n\t_valueMin: function() {\n\t\treturn this.options.min;\n\t},\n\n\t_valueMax: function() {\n\t\treturn this.max;\n\t},\n\n\t_refreshRange: function( orientation ) {\n\t\tif ( orientation === \"vertical\" ) {\n\t\t\tthis.range.css( { \"width\": \"\", \"left\": \"\" } );\n\t\t}\n\t\tif ( orientation === \"horizontal\" ) {\n\t\t\tthis.range.css( { \"height\": \"\", \"bottom\": \"\" } );\n\t\t}\n\t},\n\n\t_refreshValue: function() {\n\t\tvar lastValPercent, valPercent, value, valueMin, valueMax,\n\t\t\toRange = this.options.range,\n\t\t\to = this.options,\n\t\t\tthat = this,\n\t\t\tanimate = ( !this._animateOff ) ? o.animate : false,\n\t\t\t_set = {};\n\n\t\tif ( this._hasMultipleValues() ) {\n\t\t\tthis.handles.each( function( i ) {\n\t\t\t\tvalPercent = ( that.values( i ) - that._valueMin() ) / ( that._valueMax() -\n\t\t\t\t\tthat._valueMin() ) * 100;\n\t\t\t\t_set[ that.orientation === \"horizontal\" ? \"left\" : \"bottom\" ] = valPercent + \"%\";\n\t\t\t\t$( this ).stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( _set, o.animate );\n\t\t\t\tif ( that.options.range === true ) {\n\t\t\t\t\tif ( that.orientation === \"horizontal\" ) {\n\t\t\t\t\t\tif ( i === 0 ) {\n\t\t\t\t\t\t\tthat.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\t\t\t\tleft: valPercent + \"%\"\n\t\t\t\t\t\t\t}, o.animate );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( i === 1 ) {\n\t\t\t\t\t\t\tthat.range[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\t\t\t\twidth: ( valPercent - lastValPercent ) + \"%\"\n\t\t\t\t\t\t\t}, {\n\t\t\t\t\t\t\t\tqueue: false,\n\t\t\t\t\t\t\t\tduration: o.animate\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( i === 0 ) {\n\t\t\t\t\t\t\tthat.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\t\t\t\tbottom: ( valPercent ) + \"%\"\n\t\t\t\t\t\t\t}, o.animate );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( i === 1 ) {\n\t\t\t\t\t\t\tthat.range[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\t\t\t\theight: ( valPercent - lastValPercent ) + \"%\"\n\t\t\t\t\t\t\t}, {\n\t\t\t\t\t\t\t\tqueue: false,\n\t\t\t\t\t\t\t\tduration: o.animate\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlastValPercent = valPercent;\n\t\t\t} );\n\t\t} else {\n\t\t\tvalue = this.value();\n\t\t\tvalueMin = this._valueMin();\n\t\t\tvalueMax = this._valueMax();\n\t\t\tvalPercent = ( valueMax !== valueMin ) ?\n\t\t\t\t\t( value - valueMin ) / ( valueMax - valueMin ) * 100 :\n\t\t\t\t\t0;\n\t\t\t_set[ this.orientation === \"horizontal\" ? \"left\" : \"bottom\" ] = valPercent + \"%\";\n\t\t\tthis.handle.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( _set, o.animate );\n\n\t\t\tif ( oRange === \"min\" && this.orientation === \"horizontal\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\twidth: valPercent + \"%\"\n\t\t\t\t}, o.animate );\n\t\t\t}\n\t\t\tif ( oRange === \"max\" && this.orientation === \"horizontal\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\twidth: ( 100 - valPercent ) + \"%\"\n\t\t\t\t}, o.animate );\n\t\t\t}\n\t\t\tif ( oRange === \"min\" && this.orientation === \"vertical\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\theight: valPercent + \"%\"\n\t\t\t\t}, o.animate );\n\t\t\t}\n\t\t\tif ( oRange === \"max\" && this.orientation === \"vertical\" ) {\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( {\n\t\t\t\t\theight: ( 100 - valPercent ) + \"%\"\n\t\t\t\t}, o.animate );\n\t\t\t}\n\t\t}\n\t},\n\n\t_handleEvents: {\n\t\tkeydown: function( event ) {\n\t\t\tvar allowed, curVal, newVal, step,\n\t\t\t\tindex = $( event.target ).data( \"ui-slider-handle-index\" );\n\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\tcase $.ui.keyCode.END:\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tif ( !this._keySliding ) {\n\t\t\t\t\t\tthis._keySliding = true;\n\t\t\t\t\t\tthis._addClass( $( event.target ), null, \"ui-state-active\" );\n\t\t\t\t\t\tallowed = this._start( event, index );\n\t\t\t\t\t\tif ( allowed === false ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tstep = this.options.step;\n\t\t\tif ( this._hasMultipleValues() ) {\n\t\t\t\tcurVal = newVal = this.values( index );\n\t\t\t} else {\n\t\t\t\tcurVal = newVal = this.value();\n\t\t\t}\n\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\t\tnewVal = this._valueMin();\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.END:\n\t\t\t\t\tnewVal = this._valueMax();\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\n\t\t\t\t\tnewVal = this._trimAlignValue(\n\t\t\t\t\t\tcurVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\n\t\t\t\t\tnewVal = this._trimAlignValue(\n\t\t\t\t\t\tcurVal - ( ( this._valueMax() - this._valueMin() ) / this.numPages ) );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.UP:\n\t\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\t\t\tif ( curVal === this._valueMax() ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal + step );\n\t\t\t\t\tbreak;\n\t\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\t\tif ( curVal === this._valueMin() ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal - step );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis._slide( event, index, newVal );\n\t\t},\n\t\tkeyup: function( event ) {\n\t\t\tvar index = $( event.target ).data( \"ui-slider-handle-index\" );\n\n\t\t\tif ( this._keySliding ) {\n\t\t\t\tthis._keySliding = false;\n\t\t\t\tthis._stop( event, index );\n\t\t\t\tthis._change( event, index );\n\t\t\t\tthis._removeClass( $( event.target ), null, \"ui-state-active\" );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n\n/*!\n * jQuery UI Spinner 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Spinner\n//>>group: Widgets\n//>>description: Displays buttons to easily input numbers via the keyboard or mouse.\n//>>docs: http://api.jqueryui.com/spinner/\n//>>demos: http://jqueryui.com/spinner/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/spinner.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\nfunction spinnerModifer( fn ) {\n\treturn function() {\n\t\tvar previous = this.element.val();\n\t\tfn.apply( this, arguments );\n\t\tthis._refresh();\n\t\tif ( previous !== this.element.val() ) {\n\t\t\tthis._trigger( \"change\" );\n\t\t}\n\t};\n}\n\n$.widget( \"ui.spinner\", {\n\tversion: \"1.12.1\",\n\tdefaultElement: \"<input>\",\n\twidgetEventPrefix: \"spin\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-spinner\": \"ui-corner-all\",\n\t\t\t\"ui-spinner-down\": \"ui-corner-br\",\n\t\t\t\"ui-spinner-up\": \"ui-corner-tr\"\n\t\t},\n\t\tculture: null,\n\t\ticons: {\n\t\t\tdown: \"ui-icon-triangle-1-s\",\n\t\t\tup: \"ui-icon-triangle-1-n\"\n\t\t},\n\t\tincremental: true,\n\t\tmax: null,\n\t\tmin: null,\n\t\tnumberFormat: null,\n\t\tpage: 10,\n\t\tstep: 1,\n\n\t\tchange: null,\n\t\tspin: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t_create: function() {\n\n\t\t// handle string values that need to be parsed\n\t\tthis._setOption( \"max\", this.options.max );\n\t\tthis._setOption( \"min\", this.options.min );\n\t\tthis._setOption( \"step\", this.options.step );\n\n\t\t// Only format if there is a value, prevents the field from being marked\n\t\t// as invalid in Firefox, see #9573.\n\t\tif ( this.value() !== \"\" ) {\n\n\t\t\t// Format the value, but don't constrain.\n\t\t\tthis._value( this.element.val(), true );\n\t\t}\n\n\t\tthis._draw();\n\t\tthis._on( this._events );\n\t\tthis._refresh();\n\n\t\t// Turning off autocomplete prevents the browser from remembering the\n\t\t// value when navigating through history, so we re-enable autocomplete\n\t\t// if the page is unloaded before the widget is destroyed. #7790\n\t\tthis._on( this.window, {\n\t\t\tbeforeunload: function() {\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar options = this._super();\n\t\tvar element = this.element;\n\n\t\t$.each( [ \"min\", \"max\", \"step\" ], function( i, option ) {\n\t\t\tvar value = element.attr( option );\n\t\t\tif ( value != null && value.length ) {\n\t\t\t\toptions[ option ] = value;\n\t\t\t}\n\t\t} );\n\n\t\treturn options;\n\t},\n\n\t_events: {\n\t\tkeydown: function( event ) {\n\t\t\tif ( this._start( event ) && this._keydown( event ) ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t},\n\t\tkeyup: \"_stop\",\n\t\tfocus: function() {\n\t\t\tthis.previous = this.element.val();\n\t\t},\n\t\tblur: function( event ) {\n\t\t\tif ( this.cancelBlur ) {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._stop();\n\t\t\tthis._refresh();\n\t\t\tif ( this.previous !== this.element.val() ) {\n\t\t\t\tthis._trigger( \"change\", event );\n\t\t\t}\n\t\t},\n\t\tmousewheel: function( event, delta ) {\n\t\t\tif ( !delta ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( !this.spinning && !this._start( event ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis._spin( ( delta > 0 ? 1 : -1 ) * this.options.step, event );\n\t\t\tclearTimeout( this.mousewheelTimer );\n\t\t\tthis.mousewheelTimer = this._delay( function() {\n\t\t\t\tif ( this.spinning ) {\n\t\t\t\t\tthis._stop( event );\n\t\t\t\t}\n\t\t\t}, 100 );\n\t\t\tevent.preventDefault();\n\t\t},\n\t\t\"mousedown .ui-spinner-button\": function( event ) {\n\t\t\tvar previous;\n\n\t\t\t// We never want the buttons to have focus; whenever the user is\n\t\t\t// interacting with the spinner, the focus should be on the input.\n\t\t\t// If the input is focused then this.previous is properly set from\n\t\t\t// when the input first received focus. If the input is not focused\n\t\t\t// then we need to set this.previous based on the value before spinning.\n\t\t\tprevious = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] ) ?\n\t\t\t\tthis.previous : this.element.val();\n\t\t\tfunction checkFocus() {\n\t\t\t\tvar isActive = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] );\n\t\t\t\tif ( !isActive ) {\n\t\t\t\t\tthis.element.trigger( \"focus\" );\n\t\t\t\t\tthis.previous = previous;\n\n\t\t\t\t\t// support: IE\n\t\t\t\t\t// IE sets focus asynchronously, so we need to check if focus\n\t\t\t\t\t// moved off of the input because the user clicked on the button.\n\t\t\t\t\tthis._delay( function() {\n\t\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Ensure focus is on (or stays on) the text field\n\t\t\tevent.preventDefault();\n\t\t\tcheckFocus.call( this );\n\n\t\t\t// Support: IE\n\t\t\t// IE doesn't prevent moving focus even with event.preventDefault()\n\t\t\t// so we set a flag to know when we should ignore the blur event\n\t\t\t// and check (again) if focus moved off of the input.\n\t\t\tthis.cancelBlur = true;\n\t\t\tthis._delay( function() {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\tcheckFocus.call( this );\n\t\t\t} );\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._repeat( null, $( event.currentTarget )\n\t\t\t\t.hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\t\t\"mouseup .ui-spinner-button\": \"_stop\",\n\t\t\"mouseenter .ui-spinner-button\": function( event ) {\n\n\t\t\t// button will add ui-state-active if mouse was down while mouseleave and kept down\n\t\t\tif ( !$( event.currentTarget ).hasClass( \"ui-state-active\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis._repeat( null, $( event.currentTarget )\n\t\t\t\t.hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\n\t\t// TODO: do we really want to consider this a stop?\n\t\t// shouldn't we just stop the repeater and wait until mouseup before\n\t\t// we trigger the stop event?\n\t\t\"mouseleave .ui-spinner-button\": \"_stop\"\n\t},\n\n\t// Support mobile enhanced option and make backcompat more sane\n\t_enhance: function() {\n\t\tthis.uiSpinner = this.element\n\t\t\t.attr( \"autocomplete\", \"off\" )\n\t\t\t.wrap( \"<span>\" )\n\t\t\t.parent()\n\n\t\t\t\t// Add buttons\n\t\t\t\t.append(\n\t\t\t\t\t\"<a></a><a></a>\"\n\t\t\t\t);\n\t},\n\n\t_draw: function() {\n\t\tthis._enhance();\n\n\t\tthis._addClass( this.uiSpinner, \"ui-spinner\", \"ui-widget ui-widget-content\" );\n\t\tthis._addClass( \"ui-spinner-input\" );\n\n\t\tthis.element.attr( \"role\", \"spinbutton\" );\n\n\t\t// Button bindings\n\t\tthis.buttons = this.uiSpinner.children( \"a\" )\n\t\t\t.attr( \"tabIndex\", -1 )\n\t\t\t.attr( \"aria-hidden\", true )\n\t\t\t.button( {\n\t\t\t\tclasses: {\n\t\t\t\t\t\"ui-button\": \"\"\n\t\t\t\t}\n\t\t\t} );\n\n\t\t// TODO: Right now button does not support classes this is already updated in button PR\n\t\tthis._removeClass( this.buttons, \"ui-corner-all\" );\n\n\t\tthis._addClass( this.buttons.first(), \"ui-spinner-button ui-spinner-up\" );\n\t\tthis._addClass( this.buttons.last(), \"ui-spinner-button ui-spinner-down\" );\n\t\tthis.buttons.first().button( {\n\t\t\t\"icon\": this.options.icons.up,\n\t\t\t\"showLabel\": false\n\t\t} );\n\t\tthis.buttons.last().button( {\n\t\t\t\"icon\": this.options.icons.down,\n\t\t\t\"showLabel\": false\n\t\t} );\n\n\t\t// IE 6 doesn't understand height: 50% for the buttons\n\t\t// unless the wrapper has an explicit height\n\t\tif ( this.buttons.height() > Math.ceil( this.uiSpinner.height() * 0.5 ) &&\n\t\t\t\tthis.uiSpinner.height() > 0 ) {\n\t\t\tthis.uiSpinner.height( this.uiSpinner.height() );\n\t\t}\n\t},\n\n\t_keydown: function( event ) {\n\t\tvar options = this.options,\n\t\t\tkeyCode = $.ui.keyCode;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase keyCode.UP:\n\t\t\tthis._repeat( null, 1, event );\n\t\t\treturn true;\n\t\tcase keyCode.DOWN:\n\t\t\tthis._repeat( null, -1, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_UP:\n\t\t\tthis._repeat( null, options.page, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_DOWN:\n\t\t\tthis._repeat( null, -options.page, event );\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_start: function( event ) {\n\t\tif ( !this.spinning && this._trigger( \"start\", event ) === false ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\t\tthis.spinning = true;\n\t\treturn true;\n\t},\n\n\t_repeat: function( i, steps, event ) {\n\t\ti = i || 500;\n\n\t\tclearTimeout( this.timer );\n\t\tthis.timer = this._delay( function() {\n\t\t\tthis._repeat( 40, steps, event );\n\t\t}, i );\n\n\t\tthis._spin( steps * this.options.step, event );\n\t},\n\n\t_spin: function( step, event ) {\n\t\tvar value = this.value() || 0;\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\n\t\tvalue = this._adjustValue( value + step * this._increment( this.counter ) );\n\n\t\tif ( !this.spinning || this._trigger( \"spin\", event, { value: value } ) !== false ) {\n\t\t\tthis._value( value );\n\t\t\tthis.counter++;\n\t\t}\n\t},\n\n\t_increment: function( i ) {\n\t\tvar incremental = this.options.incremental;\n\n\t\tif ( incremental ) {\n\t\t\treturn $.isFunction( incremental ) ?\n\t\t\t\tincremental( i ) :\n\t\t\t\tMath.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );\n\t\t}\n\n\t\treturn 1;\n\t},\n\n\t_precision: function() {\n\t\tvar precision = this._precisionOf( this.options.step );\n\t\tif ( this.options.min !== null ) {\n\t\t\tprecision = Math.max( precision, this._precisionOf( this.options.min ) );\n\t\t}\n\t\treturn precision;\n\t},\n\n\t_precisionOf: function( num ) {\n\t\tvar str = num.toString(),\n\t\t\tdecimal = str.indexOf( \".\" );\n\t\treturn decimal === -1 ? 0 : str.length - decimal - 1;\n\t},\n\n\t_adjustValue: function( value ) {\n\t\tvar base, aboveMin,\n\t\t\toptions = this.options;\n\n\t\t// Make sure we're at a valid step\n\t\t// - find out where we are relative to the base (min or 0)\n\t\tbase = options.min !== null ? options.min : 0;\n\t\taboveMin = value - base;\n\n\t\t// - round to the nearest step\n\t\taboveMin = Math.round( aboveMin / options.step ) * options.step;\n\n\t\t// - rounding is based on 0, so adjust back to our base\n\t\tvalue = base + aboveMin;\n\n\t\t// Fix precision from bad JS floating point math\n\t\tvalue = parseFloat( value.toFixed( this._precision() ) );\n\n\t\t// Clamp the value\n\t\tif ( options.max !== null && value > options.max ) {\n\t\t\treturn options.max;\n\t\t}\n\t\tif ( options.min !== null && value < options.min ) {\n\t\t\treturn options.min;\n\t\t}\n\n\t\treturn value;\n\t},\n\n\t_stop: function( event ) {\n\t\tif ( !this.spinning ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( this.timer );\n\t\tclearTimeout( this.mousewheelTimer );\n\t\tthis.counter = 0;\n\t\tthis.spinning = false;\n\t\tthis._trigger( \"stop\", event );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar prevValue, first, last;\n\n\t\tif ( key === \"culture\" || key === \"numberFormat\" ) {\n\t\t\tprevValue = this._parse( this.element.val() );\n\t\t\tthis.options[ key ] = value;\n\t\t\tthis.element.val( this._format( prevValue ) );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"max\" || key === \"min\" || key === \"step\" ) {\n\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\tvalue = this._parse( value );\n\t\t\t}\n\t\t}\n\t\tif ( key === \"icons\" ) {\n\t\t\tfirst = this.buttons.first().find( \".ui-icon\" );\n\t\t\tthis._removeClass( first, null, this.options.icons.up );\n\t\t\tthis._addClass( first, null, value.up );\n\t\t\tlast = this.buttons.last().find( \".ui-icon\" );\n\t\t\tthis._removeClass( last, null, this.options.icons.down );\n\t\t\tthis._addClass( last, null, value.down );\n\t\t}\n\n\t\tthis._super( key, value );\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis._toggleClass( this.uiSpinner, null, \"ui-state-disabled\", !!value );\n\t\tthis.element.prop( \"disabled\", !!value );\n\t\tthis.buttons.button( value ? \"disable\" : \"enable\" );\n\t},\n\n\t_setOptions: spinnerModifer( function( options ) {\n\t\tthis._super( options );\n\t} ),\n\n\t_parse: function( val ) {\n\t\tif ( typeof val === \"string\" && val !== \"\" ) {\n\t\t\tval = window.Globalize && this.options.numberFormat ?\n\t\t\t\tGlobalize.parseFloat( val, 10, this.options.culture ) : +val;\n\t\t}\n\t\treturn val === \"\" || isNaN( val ) ? null : val;\n\t},\n\n\t_format: function( value ) {\n\t\tif ( value === \"\" ) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn window.Globalize && this.options.numberFormat ?\n\t\t\tGlobalize.format( value, this.options.numberFormat, this.options.culture ) :\n\t\t\tvalue;\n\t},\n\n\t_refresh: function() {\n\t\tthis.element.attr( {\n\t\t\t\"aria-valuemin\": this.options.min,\n\t\t\t\"aria-valuemax\": this.options.max,\n\n\t\t\t// TODO: what should we do with values that can't be parsed?\n\t\t\t\"aria-valuenow\": this._parse( this.element.val() )\n\t\t} );\n\t},\n\n\tisValid: function() {\n\t\tvar value = this.value();\n\n\t\t// Null is invalid\n\t\tif ( value === null ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If value gets adjusted, it's invalid\n\t\treturn value === this._adjustValue( value );\n\t},\n\n\t// Update the value without triggering change\n\t_value: function( value, allowAny ) {\n\t\tvar parsed;\n\t\tif ( value !== \"\" ) {\n\t\t\tparsed = this._parse( value );\n\t\t\tif ( parsed !== null ) {\n\t\t\t\tif ( !allowAny ) {\n\t\t\t\t\tparsed = this._adjustValue( parsed );\n\t\t\t\t}\n\t\t\t\tvalue = this._format( parsed );\n\t\t\t}\n\t\t}\n\t\tthis.element.val( value );\n\t\tthis._refresh();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.prop( \"disabled\", false )\n\t\t\t.removeAttr( \"autocomplete role aria-valuemin aria-valuemax aria-valuenow\" );\n\n\t\tthis.uiSpinner.replaceWith( this.element );\n\t},\n\n\tstepUp: spinnerModifer( function( steps ) {\n\t\tthis._stepUp( steps );\n\t} ),\n\t_stepUp: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( ( steps || 1 ) * this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tstepDown: spinnerModifer( function( steps ) {\n\t\tthis._stepDown( steps );\n\t} ),\n\t_stepDown: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( ( steps || 1 ) * -this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tpageUp: spinnerModifer( function( pages ) {\n\t\tthis._stepUp( ( pages || 1 ) * this.options.page );\n\t} ),\n\n\tpageDown: spinnerModifer( function( pages ) {\n\t\tthis._stepDown( ( pages || 1 ) * this.options.page );\n\t} ),\n\n\tvalue: function( newVal ) {\n\t\tif ( !arguments.length ) {\n\t\t\treturn this._parse( this.element.val() );\n\t\t}\n\t\tspinnerModifer( this._value ).call( this, newVal );\n\t},\n\n\twidget: function() {\n\t\treturn this.uiSpinner;\n\t}\n} );\n\n// DEPRECATED\n// TODO: switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for spinner html extension points\n\t$.widget( \"ui.spinner\", $.ui.spinner, {\n\t\t_enhance: function() {\n\t\t\tthis.uiSpinner = this.element\n\t\t\t\t.attr( \"autocomplete\", \"off\" )\n\t\t\t\t.wrap( this._uiSpinnerHtml() )\n\t\t\t\t.parent()\n\n\t\t\t\t\t// Add buttons\n\t\t\t\t\t.append( this._buttonHtml() );\n\t\t},\n\t\t_uiSpinnerHtml: function() {\n\t\t\treturn \"<span>\";\n\t\t},\n\n\t\t_buttonHtml: function() {\n\t\t\treturn \"<a></a><a></a>\";\n\t\t}\n\t} );\n}\n\nvar widgetsSpinner = $.ui.spinner;\n\n\n/*!\n * jQuery UI Tabs 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Tabs\n//>>group: Widgets\n//>>description: Transforms a set of container elements into a tab structure.\n//>>docs: http://api.jqueryui.com/tabs/\n//>>demos: http://jqueryui.com/tabs/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/tabs.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.tabs\", {\n\tversion: \"1.12.1\",\n\tdelay: 300,\n\toptions: {\n\t\tactive: null,\n\t\tclasses: {\n\t\t\t\"ui-tabs\": \"ui-corner-all\",\n\t\t\t\"ui-tabs-nav\": \"ui-corner-all\",\n\t\t\t\"ui-tabs-panel\": \"ui-corner-bottom\",\n\t\t\t\"ui-tabs-tab\": \"ui-corner-top\"\n\t\t},\n\t\tcollapsible: false,\n\t\tevent: \"click\",\n\t\theightStyle: \"content\",\n\t\thide: null,\n\t\tshow: null,\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tbeforeActivate: null,\n\t\tbeforeLoad: null,\n\t\tload: null\n\t},\n\n\t_isLocal: ( function() {\n\t\tvar rhash = /#.*$/;\n\n\t\treturn function( anchor ) {\n\t\t\tvar anchorUrl, locationUrl;\n\n\t\t\tanchorUrl = anchor.href.replace( rhash, \"\" );\n\t\t\tlocationUrl = location.href.replace( rhash, \"\" );\n\n\t\t\t// Decoding may throw an error if the URL isn't UTF-8 (#9518)\n\t\t\ttry {\n\t\t\t\tanchorUrl = decodeURIComponent( anchorUrl );\n\t\t\t} catch ( error ) {}\n\t\t\ttry {\n\t\t\t\tlocationUrl = decodeURIComponent( locationUrl );\n\t\t\t} catch ( error ) {}\n\n\t\t\treturn anchor.hash.length > 1 && anchorUrl === locationUrl;\n\t\t};\n\t} )(),\n\n\t_create: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tthis.running = false;\n\n\t\tthis._addClass( \"ui-tabs\", \"ui-widget ui-widget-content\" );\n\t\tthis._toggleClass( \"ui-tabs-collapsible\", null, options.collapsible );\n\n\t\tthis._processTabs();\n\t\toptions.active = this._initialActive();\n\n\t\t// Take disabling tabs via class attribute from HTML\n\t\t// into account and update option properly.\n\t\tif ( $.isArray( options.disabled ) ) {\n\t\t\toptions.disabled = $.unique( options.disabled.concat(\n\t\t\t\t$.map( this.tabs.filter( \".ui-state-disabled\" ), function( li ) {\n\t\t\t\t\treturn that.tabs.index( li );\n\t\t\t\t} )\n\t\t\t) ).sort();\n\t\t}\n\n\t\t// Check for length avoids error when initializing empty list\n\t\tif ( this.options.active !== false && this.anchors.length ) {\n\t\t\tthis.active = this._findActive( options.active );\n\t\t} else {\n\t\t\tthis.active = $();\n\t\t}\n\n\t\tthis._refresh();\n\n\t\tif ( this.active.length ) {\n\t\t\tthis.load( options.active );\n\t\t}\n\t},\n\n\t_initialActive: function() {\n\t\tvar active = this.options.active,\n\t\t\tcollapsible = this.options.collapsible,\n\t\t\tlocationHash = location.hash.substring( 1 );\n\n\t\tif ( active === null ) {\n\n\t\t\t// check the fragment identifier in the URL\n\t\t\tif ( locationHash ) {\n\t\t\t\tthis.tabs.each( function( i, tab ) {\n\t\t\t\t\tif ( $( tab ).attr( \"aria-controls\" ) === locationHash ) {\n\t\t\t\t\t\tactive = i;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// Check for a tab marked active via a class\n\t\t\tif ( active === null ) {\n\t\t\t\tactive = this.tabs.index( this.tabs.filter( \".ui-tabs-active\" ) );\n\t\t\t}\n\n\t\t\t// No active tab, set to false\n\t\t\tif ( active === null || active === -1 ) {\n\t\t\t\tactive = this.tabs.length ? 0 : false;\n\t\t\t}\n\t\t}\n\n\t\t// Handle numbers: negative, out of range\n\t\tif ( active !== false ) {\n\t\t\tactive = this.tabs.index( this.tabs.eq( active ) );\n\t\t\tif ( active === -1 ) {\n\t\t\t\tactive = collapsible ? false : 0;\n\t\t\t}\n\t\t}\n\n\t\t// Don't allow collapsible: false and active: false\n\t\tif ( !collapsible && active === false && this.anchors.length ) {\n\t\t\tactive = 0;\n\t\t}\n\n\t\treturn active;\n\t},\n\n\t_getCreateEventData: function() {\n\t\treturn {\n\t\t\ttab: this.active,\n\t\t\tpanel: !this.active.length ? $() : this._getPanelForTab( this.active )\n\t\t};\n\t},\n\n\t_tabKeydown: function( event ) {\n\t\tvar focusedTab = $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( \"li\" ),\n\t\t\tselectedIndex = this.tabs.index( focusedTab ),\n\t\t\tgoingForward = true;\n\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase $.ui.keyCode.RIGHT:\n\t\tcase $.ui.keyCode.DOWN:\n\t\t\tselectedIndex++;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.UP:\n\t\tcase $.ui.keyCode.LEFT:\n\t\t\tgoingForward = false;\n\t\t\tselectedIndex--;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.END:\n\t\t\tselectedIndex = this.anchors.length - 1;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.HOME:\n\t\t\tselectedIndex = 0;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.SPACE:\n\n\t\t\t// Activate only, no collapsing\n\t\t\tevent.preventDefault();\n\t\t\tclearTimeout( this.activating );\n\t\t\tthis._activate( selectedIndex );\n\t\t\treturn;\n\t\tcase $.ui.keyCode.ENTER:\n\n\t\t\t// Toggle (cancel delayed activation, allow collapsing)\n\t\t\tevent.preventDefault();\n\t\t\tclearTimeout( this.activating );\n\n\t\t\t// Determine if we should collapse or activate\n\t\t\tthis._activate( selectedIndex === this.options.active ? false : selectedIndex );\n\t\t\treturn;\n\t\tdefault:\n\t\t\treturn;\n\t\t}\n\n\t\t// Focus the appropriate tab, based on which key was pressed\n\t\tevent.preventDefault();\n\t\tclearTimeout( this.activating );\n\t\tselectedIndex = this._focusNextTab( selectedIndex, goingForward );\n\n\t\t// Navigating with control/command key will prevent automatic activation\n\t\tif ( !event.ctrlKey && !event.metaKey ) {\n\n\t\t\t// Update aria-selected immediately so that AT think the tab is already selected.\n\t\t\t// Otherwise AT may confuse the user by stating that they need to activate the tab,\n\t\t\t// but the tab will already be activated by the time the announcement finishes.\n\t\t\tfocusedTab.attr( \"aria-selected\", \"false\" );\n\t\t\tthis.tabs.eq( selectedIndex ).attr( \"aria-selected\", \"true\" );\n\n\t\t\tthis.activating = this._delay( function() {\n\t\t\t\tthis.option( \"active\", selectedIndex );\n\t\t\t}, this.delay );\n\t\t}\n\t},\n\n\t_panelKeydown: function( event ) {\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+up moves focus to the current tab\n\t\tif ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.active.trigger( \"focus\" );\n\t\t}\n\t},\n\n\t// Alt+page up/down moves focus to the previous/next tab (and activates)\n\t_handlePageNav: function( event ) {\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active - 1, false ) );\n\t\t\treturn true;\n\t\t}\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active + 1, true ) );\n\t\t\treturn true;\n\t\t}\n\t},\n\n\t_findNextTab: function( index, goingForward ) {\n\t\tvar lastTabIndex = this.tabs.length - 1;\n\n\t\tfunction constrain() {\n\t\t\tif ( index > lastTabIndex ) {\n\t\t\t\tindex = 0;\n\t\t\t}\n\t\t\tif ( index < 0 ) {\n\t\t\t\tindex = lastTabIndex;\n\t\t\t}\n\t\t\treturn index;\n\t\t}\n\n\t\twhile ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {\n\t\t\tindex = goingForward ? index + 1 : index - 1;\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_focusNextTab: function( index, goingForward ) {\n\t\tindex = this._findNextTab( index, goingForward );\n\t\tthis.tabs.eq( index ).trigger( \"focus\" );\n\t\treturn index;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"active\" ) {\n\n\t\t\t// _activate() will handle invalid values and update this.options\n\t\t\tthis._activate( value );\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"collapsible\" ) {\n\t\t\tthis._toggleClass( \"ui-tabs-collapsible\", null, value );\n\n\t\t\t// Setting collapsible: false while collapsed; open first panel\n\t\t\tif ( !value && this.options.active === false ) {\n\t\t\t\tthis._activate( 0 );\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"event\" ) {\n\t\t\tthis._setupEvents( value );\n\t\t}\n\n\t\tif ( key === \"heightStyle\" ) {\n\t\t\tthis._setupHeightStyle( value );\n\t\t}\n\t},\n\n\t_sanitizeSelector: function( hash ) {\n\t\treturn hash ? hash.replace( /[!\"$%&'()*+,.\\/:;<=>?@\\[\\]\\^`{|}~]/g, \"\\\\$&\" ) : \"\";\n\t},\n\n\trefresh: function() {\n\t\tvar options = this.options,\n\t\t\tlis = this.tablist.children( \":has(a[href])\" );\n\n\t\t// Get disabled tabs from class attribute from HTML\n\t\t// this will get converted to a boolean if needed in _refresh()\n\t\toptions.disabled = $.map( lis.filter( \".ui-state-disabled\" ), function( tab ) {\n\t\t\treturn lis.index( tab );\n\t\t} );\n\n\t\tthis._processTabs();\n\n\t\t// Was collapsed or no tabs\n\t\tif ( options.active === false || !this.anchors.length ) {\n\t\t\toptions.active = false;\n\t\t\tthis.active = $();\n\n\t\t// was active, but active tab is gone\n\t\t} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {\n\n\t\t\t// all remaining tabs are disabled\n\t\t\tif ( this.tabs.length === options.disabled.length ) {\n\t\t\t\toptions.active = false;\n\t\t\t\tthis.active = $();\n\n\t\t\t// activate previous tab\n\t\t\t} else {\n\t\t\t\tthis._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );\n\t\t\t}\n\n\t\t// was active, active tab still exists\n\t\t} else {\n\n\t\t\t// make sure active index is correct\n\t\t\toptions.active = this.tabs.index( this.active );\n\t\t}\n\n\t\tthis._refresh();\n\t},\n\n\t_refresh: function() {\n\t\tthis._setOptionDisabled( this.options.disabled );\n\t\tthis._setupEvents( this.options.event );\n\t\tthis._setupHeightStyle( this.options.heightStyle );\n\n\t\tthis.tabs.not( this.active ).attr( {\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\ttabIndex: -1\n\t\t} );\n\t\tthis.panels.not( this._getPanelForTab( this.active ) )\n\t\t\t.hide()\n\t\t\t.attr( {\n\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t} );\n\n\t\t// Make sure one tab is in the tab order\n\t\tif ( !this.active.length ) {\n\t\t\tthis.tabs.eq( 0 ).attr( \"tabIndex\", 0 );\n\t\t} else {\n\t\t\tthis.active\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t} );\n\t\t\tthis._addClass( this.active, \"ui-tabs-active\", \"ui-state-active\" );\n\t\t\tthis._getPanelForTab( this.active )\n\t\t\t\t.show()\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t_processTabs: function() {\n\t\tvar that = this,\n\t\t\tprevTabs = this.tabs,\n\t\t\tprevAnchors = this.anchors,\n\t\t\tprevPanels = this.panels;\n\n\t\tthis.tablist = this._getList().attr( \"role\", \"tablist\" );\n\t\tthis._addClass( this.tablist, \"ui-tabs-nav\",\n\t\t\t\"ui-helper-reset ui-helper-clearfix ui-widget-header\" );\n\n\t\t// Prevent users from focusing disabled tabs via click\n\t\tthis.tablist\n\t\t\t.on( \"mousedown\" + this.eventNamespace, \"> li\", function( event ) {\n\t\t\t\tif ( $( this ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t} )\n\n\t\t\t// Support: IE <9\n\t\t\t// Preventing the default action in mousedown doesn't prevent IE\n\t\t\t// from focusing the element, so if the anchor gets focused, blur.\n\t\t\t// We don't have to worry about focusing the previously focused\n\t\t\t// element since clicking on a non-focusable element should focus\n\t\t\t// the body anyway.\n\t\t\t.on( \"focus\" + this.eventNamespace, \".ui-tabs-anchor\", function() {\n\t\t\t\tif ( $( this ).closest( \"li\" ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t}\n\t\t\t} );\n\n\t\tthis.tabs = this.tablist.find( \"> li:has(a[href])\" )\n\t\t\t.attr( {\n\t\t\t\trole: \"tab\",\n\t\t\t\ttabIndex: -1\n\t\t\t} );\n\t\tthis._addClass( this.tabs, \"ui-tabs-tab\", \"ui-state-default\" );\n\n\t\tthis.anchors = this.tabs.map( function() {\n\t\t\treturn $( \"a\", this )[ 0 ];\n\t\t} )\n\t\t\t.attr( {\n\t\t\t\trole: \"presentation\",\n\t\t\t\ttabIndex: -1\n\t\t\t} );\n\t\tthis._addClass( this.anchors, \"ui-tabs-anchor\" );\n\n\t\tthis.panels = $();\n\n\t\tthis.anchors.each( function( i, anchor ) {\n\t\t\tvar selector, panel, panelId,\n\t\t\t\tanchorId = $( anchor ).uniqueId().attr( \"id\" ),\n\t\t\t\ttab = $( anchor ).closest( \"li\" ),\n\t\t\t\toriginalAriaControls = tab.attr( \"aria-controls\" );\n\n\t\t\t// Inline tab\n\t\t\tif ( that._isLocal( anchor ) ) {\n\t\t\t\tselector = anchor.hash;\n\t\t\t\tpanelId = selector.substring( 1 );\n\t\t\t\tpanel = that.element.find( that._sanitizeSelector( selector ) );\n\n\t\t\t// remote tab\n\t\t\t} else {\n\n\t\t\t\t// If the tab doesn't already have aria-controls,\n\t\t\t\t// generate an id by using a throw-away element\n\t\t\t\tpanelId = tab.attr( \"aria-controls\" ) || $( {} ).uniqueId()[ 0 ].id;\n\t\t\t\tselector = \"#\" + panelId;\n\t\t\t\tpanel = that.element.find( selector );\n\t\t\t\tif ( !panel.length ) {\n\t\t\t\t\tpanel = that._createPanel( panelId );\n\t\t\t\t\tpanel.insertAfter( that.panels[ i - 1 ] || that.tablist );\n\t\t\t\t}\n\t\t\t\tpanel.attr( \"aria-live\", \"polite\" );\n\t\t\t}\n\n\t\t\tif ( panel.length ) {\n\t\t\t\tthat.panels = that.panels.add( panel );\n\t\t\t}\n\t\t\tif ( originalAriaControls ) {\n\t\t\t\ttab.data( \"ui-tabs-aria-controls\", originalAriaControls );\n\t\t\t}\n\t\t\ttab.attr( {\n\t\t\t\t\"aria-controls\": panelId,\n\t\t\t\t\"aria-labelledby\": anchorId\n\t\t\t} );\n\t\t\tpanel.attr( \"aria-labelledby\", anchorId );\n\t\t} );\n\n\t\tthis.panels.attr( \"role\", \"tabpanel\" );\n\t\tthis._addClass( this.panels, \"ui-tabs-panel\", \"ui-widget-content\" );\n\n\t\t// Avoid memory leaks (#10056)\n\t\tif ( prevTabs ) {\n\t\t\tthis._off( prevTabs.not( this.tabs ) );\n\t\t\tthis._off( prevAnchors.not( this.anchors ) );\n\t\t\tthis._off( prevPanels.not( this.panels ) );\n\t\t}\n\t},\n\n\t// Allow overriding how to find the list for rare usage scenarios (#7715)\n\t_getList: function() {\n\t\treturn this.tablist || this.element.find( \"ol, ul\" ).eq( 0 );\n\t},\n\n\t_createPanel: function( id ) {\n\t\treturn $( \"<div>\" )\n\t\t\t.attr( \"id\", id )\n\t\t\t.data( \"ui-tabs-destroy\", true );\n\t},\n\n\t_setOptionDisabled: function( disabled ) {\n\t\tvar currentItem, li, i;\n\n\t\tif ( $.isArray( disabled ) ) {\n\t\t\tif ( !disabled.length ) {\n\t\t\t\tdisabled = false;\n\t\t\t} else if ( disabled.length === this.anchors.length ) {\n\t\t\t\tdisabled = true;\n\t\t\t}\n\t\t}\n\n\t\t// Disable tabs\n\t\tfor ( i = 0; ( li = this.tabs[ i ] ); i++ ) {\n\t\t\tcurrentItem = $( li );\n\t\t\tif ( disabled === true || $.inArray( i, disabled ) !== -1 ) {\n\t\t\t\tcurrentItem.attr( \"aria-disabled\", \"true\" );\n\t\t\t\tthis._addClass( currentItem, null, \"ui-state-disabled\" );\n\t\t\t} else {\n\t\t\t\tcurrentItem.removeAttr( \"aria-disabled\" );\n\t\t\t\tthis._removeClass( currentItem, null, \"ui-state-disabled\" );\n\t\t\t}\n\t\t}\n\n\t\tthis.options.disabled = disabled;\n\n\t\tthis._toggleClass( this.widget(), this.widgetFullName + \"-disabled\", null,\n\t\t\tdisabled === true );\n\t},\n\n\t_setupEvents: function( event ) {\n\t\tvar events = {};\n\t\tif ( event ) {\n\t\t\t$.each( event.split( \" \" ), function( index, eventName ) {\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\n\t\t\t} );\n\t\t}\n\n\t\tthis._off( this.anchors.add( this.tabs ).add( this.panels ) );\n\n\t\t// Always prevent the default action, even when disabled\n\t\tthis._on( true, this.anchors, {\n\t\t\tclick: function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t} );\n\t\tthis._on( this.anchors, events );\n\t\tthis._on( this.tabs, { keydown: \"_tabKeydown\" } );\n\t\tthis._on( this.panels, { keydown: \"_panelKeydown\" } );\n\n\t\tthis._focusable( this.tabs );\n\t\tthis._hoverable( this.tabs );\n\t},\n\n\t_setupHeightStyle: function( heightStyle ) {\n\t\tvar maxHeight,\n\t\t\tparent = this.element.parent();\n\n\t\tif ( heightStyle === \"fill\" ) {\n\t\t\tmaxHeight = parent.height();\n\t\t\tmaxHeight -= this.element.outerHeight() - this.element.height();\n\n\t\t\tthis.element.siblings( \":visible\" ).each( function() {\n\t\t\t\tvar elem = $( this ),\n\t\t\t\t\tposition = elem.css( \"position\" );\n\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.element.children().not( this.panels ).each( function() {\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.panels.each( function() {\n\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\n\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\n\t\t\t} )\n\t\t\t\t.css( \"overflow\", \"auto\" );\n\t\t} else if ( heightStyle === \"auto\" ) {\n\t\t\tmaxHeight = 0;\n\t\t\tthis.panels.each( function() {\n\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).height( \"\" ).height() );\n\t\t\t} ).height( maxHeight );\n\t\t}\n\t},\n\n\t_eventHandler: function( event ) {\n\t\tvar options = this.options,\n\t\t\tactive = this.active,\n\t\t\tanchor = $( event.currentTarget ),\n\t\t\ttab = anchor.closest( \"li\" ),\n\t\t\tclickedIsActive = tab[ 0 ] === active[ 0 ],\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\n\t\t\ttoShow = collapsing ? $() : this._getPanelForTab( tab ),\n\t\t\ttoHide = !active.length ? $() : this._getPanelForTab( active ),\n\t\t\teventData = {\n\t\t\t\toldTab: active,\n\t\t\t\toldPanel: toHide,\n\t\t\t\tnewTab: collapsing ? $() : tab,\n\t\t\t\tnewPanel: toShow\n\t\t\t};\n\n\t\tevent.preventDefault();\n\n\t\tif ( tab.hasClass( \"ui-state-disabled\" ) ||\n\n\t\t\t\t// tab is already loading\n\t\t\t\ttab.hasClass( \"ui-tabs-loading\" ) ||\n\n\t\t\t\t// can't switch durning an animation\n\t\t\t\tthis.running ||\n\n\t\t\t\t// click on active header, but not collapsible\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\n\n\t\t\t\t// allow canceling activation\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\toptions.active = collapsing ? false : this.tabs.index( tab );\n\n\t\tthis.active = clickedIsActive ? $() : tab;\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tif ( !toHide.length && !toShow.length ) {\n\t\t\t$.error( \"jQuery UI Tabs: Mismatching fragment identifier.\" );\n\t\t}\n\n\t\tif ( toShow.length ) {\n\t\t\tthis.load( this.tabs.index( tab ), event );\n\t\t}\n\t\tthis._toggle( event, eventData );\n\t},\n\n\t// Handles show/hide for selecting tabs\n\t_toggle: function( event, eventData ) {\n\t\tvar that = this,\n\t\t\ttoShow = eventData.newPanel,\n\t\t\ttoHide = eventData.oldPanel;\n\n\t\tthis.running = true;\n\n\t\tfunction complete() {\n\t\t\tthat.running = false;\n\t\t\tthat._trigger( \"activate\", event, eventData );\n\t\t}\n\n\t\tfunction show() {\n\t\t\tthat._addClass( eventData.newTab.closest( \"li\" ), \"ui-tabs-active\", \"ui-state-active\" );\n\n\t\t\tif ( toShow.length && that.options.show ) {\n\t\t\t\tthat._show( toShow, that.options.show, complete );\n\t\t\t} else {\n\t\t\t\ttoShow.show();\n\t\t\t\tcomplete();\n\t\t\t}\n\t\t}\n\n\t\t// Start out by hiding, then showing, then completing\n\t\tif ( toHide.length && this.options.hide ) {\n\t\t\tthis._hide( toHide, this.options.hide, function() {\n\t\t\t\tthat._removeClass( eventData.oldTab.closest( \"li\" ),\n\t\t\t\t\t\"ui-tabs-active\", \"ui-state-active\" );\n\t\t\t\tshow();\n\t\t\t} );\n\t\t} else {\n\t\t\tthis._removeClass( eventData.oldTab.closest( \"li\" ),\n\t\t\t\t\"ui-tabs-active\", \"ui-state-active\" );\n\t\t\ttoHide.hide();\n\t\t\tshow();\n\t\t}\n\n\t\ttoHide.attr( \"aria-hidden\", \"true\" );\n\t\teventData.oldTab.attr( {\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\"\n\t\t} );\n\n\t\t// If we're switching tabs, remove the old tab from the tab order.\n\t\t// If we're opening from collapsed state, remove the previous tab from the tab order.\n\t\t// If we're collapsing, then keep the collapsing tab in the tab order.\n\t\tif ( toShow.length && toHide.length ) {\n\t\t\teventData.oldTab.attr( \"tabIndex\", -1 );\n\t\t} else if ( toShow.length ) {\n\t\t\tthis.tabs.filter( function() {\n\t\t\t\treturn $( this ).attr( \"tabIndex\" ) === 0;\n\t\t\t} )\n\t\t\t\t.attr( \"tabIndex\", -1 );\n\t\t}\n\n\t\ttoShow.attr( \"aria-hidden\", \"false\" );\n\t\teventData.newTab.attr( {\n\t\t\t\"aria-selected\": \"true\",\n\t\t\t\"aria-expanded\": \"true\",\n\t\t\ttabIndex: 0\n\t\t} );\n\t},\n\n\t_activate: function( index ) {\n\t\tvar anchor,\n\t\t\tactive = this._findActive( index );\n\n\t\t// Trying to activate the already active panel\n\t\tif ( active[ 0 ] === this.active[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Trying to collapse, simulate a click on the current active header\n\t\tif ( !active.length ) {\n\t\t\tactive = this.active;\n\t\t}\n\n\t\tanchor = active.find( \".ui-tabs-anchor\" )[ 0 ];\n\t\tthis._eventHandler( {\n\t\t\ttarget: anchor,\n\t\t\tcurrentTarget: anchor,\n\t\t\tpreventDefault: $.noop\n\t\t} );\n\t},\n\n\t_findActive: function( index ) {\n\t\treturn index === false ? $() : this.tabs.eq( index );\n\t},\n\n\t_getIndex: function( index ) {\n\n\t\t// meta-function to give users option to provide a href string instead of a numerical index.\n\t\tif ( typeof index === \"string\" ) {\n\t\t\tindex = this.anchors.index( this.anchors.filter( \"[href$='\" +\n\t\t\t\t$.ui.escapeSelector( index ) + \"']\" ) );\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_destroy: function() {\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tthis.tablist\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.off( this.eventNamespace );\n\n\t\tthis.anchors\n\t\t\t.removeAttr( \"role tabIndex\" )\n\t\t\t.removeUniqueId();\n\n\t\tthis.tabs.add( this.panels ).each( function() {\n\t\t\tif ( $.data( this, \"ui-tabs-destroy\" ) ) {\n\t\t\t\t$( this ).remove();\n\t\t\t} else {\n\t\t\t\t$( this ).removeAttr( \"role tabIndex \" +\n\t\t\t\t\t\"aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded\" );\n\t\t\t}\n\t\t} );\n\n\t\tthis.tabs.each( function() {\n\t\t\tvar li = $( this ),\n\t\t\t\tprev = li.data( \"ui-tabs-aria-controls\" );\n\t\t\tif ( prev ) {\n\t\t\t\tli\n\t\t\t\t\t.attr( \"aria-controls\", prev )\n\t\t\t\t\t.removeData( \"ui-tabs-aria-controls\" );\n\t\t\t} else {\n\t\t\t\tli.removeAttr( \"aria-controls\" );\n\t\t\t}\n\t\t} );\n\n\t\tthis.panels.show();\n\n\t\tif ( this.options.heightStyle !== \"content\" ) {\n\t\t\tthis.panels.css( \"height\", \"\" );\n\t\t}\n\t},\n\n\tenable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = false;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.map( disabled, function( num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tdisabled = $.map( this.tabs, function( li, num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\tthis._setOptionDisabled( disabled );\n\t},\n\n\tdisable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === true ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = true;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.inArray( index, disabled ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.merge( [ index ], disabled ).sort();\n\t\t\t} else {\n\t\t\t\tdisabled = [ index ];\n\t\t\t}\n\t\t}\n\t\tthis._setOptionDisabled( disabled );\n\t},\n\n\tload: function( index, event ) {\n\t\tindex = this._getIndex( index );\n\t\tvar that = this,\n\t\t\ttab = this.tabs.eq( index ),\n\t\t\tanchor = tab.find( \".ui-tabs-anchor\" ),\n\t\t\tpanel = this._getPanelForTab( tab ),\n\t\t\teventData = {\n\t\t\t\ttab: tab,\n\t\t\t\tpanel: panel\n\t\t\t},\n\t\t\tcomplete = function( jqXHR, status ) {\n\t\t\t\tif ( status === \"abort\" ) {\n\t\t\t\t\tthat.panels.stop( false, true );\n\t\t\t\t}\n\n\t\t\t\tthat._removeClass( tab, \"ui-tabs-loading\" );\n\t\t\t\tpanel.removeAttr( \"aria-busy\" );\n\n\t\t\t\tif ( jqXHR === that.xhr ) {\n\t\t\t\t\tdelete that.xhr;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Not remote\n\t\tif ( this._isLocal( anchor[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );\n\n\t\t// Support: jQuery <1.8\n\t\t// jQuery <1.8 returns false if the request is canceled in beforeSend,\n\t\t// but as of 1.8, $.ajax() always returns a jqXHR object.\n\t\tif ( this.xhr && this.xhr.statusText !== \"canceled\" ) {\n\t\t\tthis._addClass( tab, \"ui-tabs-loading\" );\n\t\t\tpanel.attr( \"aria-busy\", \"true\" );\n\n\t\t\tthis.xhr\n\t\t\t\t.done( function( response, status, jqXHR ) {\n\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\tpanel.html( response );\n\t\t\t\t\t\tthat._trigger( \"load\", event, eventData );\n\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t} )\n\t\t\t\t.fail( function( jqXHR, status ) {\n\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t_ajaxSettings: function( anchor, event, eventData ) {\n\t\tvar that = this;\n\t\treturn {\n\n\t\t\t// Support: IE <11 only\n\t\t\t// Strip any hash that exists to prevent errors with the Ajax request\n\t\t\turl: anchor.attr( \"href\" ).replace( /#.*$/, \"\" ),\n\t\t\tbeforeSend: function( jqXHR, settings ) {\n\t\t\t\treturn that._trigger( \"beforeLoad\", event,\n\t\t\t\t\t$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );\n\t\t\t}\n\t\t};\n\t},\n\n\t_getPanelForTab: function( tab ) {\n\t\tvar id = $( tab ).attr( \"aria-controls\" );\n\t\treturn this.element.find( this._sanitizeSelector( \"#\" + id ) );\n\t}\n} );\n\n// DEPRECATED\n// TODO: Switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for ui-tab class (now ui-tabs-tab)\n\t$.widget( \"ui.tabs\", $.ui.tabs, {\n\t\t_processTabs: function() {\n\t\t\tthis._superApply( arguments );\n\t\t\tthis._addClass( this.tabs, \"ui-tab\" );\n\t\t}\n\t} );\n}\n\nvar widgetsTabs = $.ui.tabs;\n\n\n/*!\n * jQuery UI Tooltip 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Tooltip\n//>>group: Widgets\n//>>description: Shows additional information for any element on hover or focus.\n//>>docs: http://api.jqueryui.com/tooltip/\n//>>demos: http://jqueryui.com/tooltip/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/tooltip.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.tooltip\", {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-tooltip\": \"ui-corner-all ui-widget-shadow\"\n\t\t},\n\t\tcontent: function() {\n\n\t\t\t// support: IE<9, Opera in jQuery <1.7\n\t\t\t// .text() can't accept undefined, so coerce to a string\n\t\t\tvar title = $( this ).attr( \"title\" ) || \"\";\n\n\t\t\t// Escape title, since we're going from an attribute to raw HTML\n\t\t\treturn $( \"<a>\" ).text( title ).html();\n\t\t},\n\t\thide: true,\n\n\t\t// Disabled elements have inconsistent behavior across browsers (#8661)\n\t\titems: \"[title]:not([disabled])\",\n\t\tposition: {\n\t\t\tmy: \"left top+15\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"flipfit flip\"\n\t\t},\n\t\tshow: true,\n\t\ttrack: false,\n\n\t\t// Callbacks\n\t\tclose: null,\n\t\topen: null\n\t},\n\n\t_addDescribedBy: function( elem, id ) {\n\t\tvar describedby = ( elem.attr( \"aria-describedby\" ) || \"\" ).split( /\\s+/ );\n\t\tdescribedby.push( id );\n\t\telem\n\t\t\t.data( \"ui-tooltip-id\", id )\n\t\t\t.attr( \"aria-describedby\", $.trim( describedby.join( \" \" ) ) );\n\t},\n\n\t_removeDescribedBy: function( elem ) {\n\t\tvar id = elem.data( \"ui-tooltip-id\" ),\n\t\t\tdescribedby = ( elem.attr( \"aria-describedby\" ) || \"\" ).split( /\\s+/ ),\n\t\t\tindex = $.inArray( id, describedby );\n\n\t\tif ( index !== -1 ) {\n\t\t\tdescribedby.splice( index, 1 );\n\t\t}\n\n\t\telem.removeData( \"ui-tooltip-id\" );\n\t\tdescribedby = $.trim( describedby.join( \" \" ) );\n\t\tif ( describedby ) {\n\t\t\telem.attr( \"aria-describedby\", describedby );\n\t\t} else {\n\t\t\telem.removeAttr( \"aria-describedby\" );\n\t\t}\n\t},\n\n\t_create: function() {\n\t\tthis._on( {\n\t\t\tmouseover: \"open\",\n\t\t\tfocusin: \"open\"\n\t\t} );\n\n\t\t// IDs of generated tooltips, needed for destroy\n\t\tthis.tooltips = {};\n\n\t\t// IDs of parent tooltips where we removed the title attribute\n\t\tthis.parents = {};\n\n\t\t// Append the aria-live region so tooltips announce correctly\n\t\tthis.liveRegion = $( \"<div>\" )\n\t\t\t.attr( {\n\t\t\t\trole: \"log\",\n\t\t\t\t\"aria-live\": \"assertive\",\n\t\t\t\t\"aria-relevant\": \"additions\"\n\t\t\t} )\n\t\t\t.appendTo( this.document[ 0 ].body );\n\t\tthis._addClass( this.liveRegion, null, \"ui-helper-hidden-accessible\" );\n\n\t\tthis.disabledTitles = $( [] );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar that = this;\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"content\" ) {\n\t\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\t\tthat._updateContent( tooltipData.element );\n\t\t\t} );\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis[ value ? \"_disable\" : \"_enable\" ]();\n\t},\n\n\t_disable: function() {\n\t\tvar that = this;\n\n\t\t// Close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\tvar event = $.Event( \"blur\" );\n\t\t\tevent.target = event.currentTarget = tooltipData.element[ 0 ];\n\t\t\tthat.close( event, true );\n\t\t} );\n\n\t\t// Remove title attributes to prevent native tooltips\n\t\tthis.disabledTitles = this.disabledTitles.add(\n\t\t\tthis.element.find( this.options.items ).addBack()\n\t\t\t\t.filter( function() {\n\t\t\t\t\tvar element = $( this );\n\t\t\t\t\tif ( element.is( \"[title]\" ) ) {\n\t\t\t\t\t\treturn element\n\t\t\t\t\t\t\t.data( \"ui-tooltip-title\", element.attr( \"title\" ) )\n\t\t\t\t\t\t\t.removeAttr( \"title\" );\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t);\n\t},\n\n\t_enable: function() {\n\n\t\t// restore title attributes\n\t\tthis.disabledTitles.each( function() {\n\t\t\tvar element = $( this );\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t}\n\t\t} );\n\t\tthis.disabledTitles = $( [] );\n\t},\n\n\topen: function( event ) {\n\t\tvar that = this,\n\t\t\ttarget = $( event ? event.target : this.element )\n\n\t\t\t\t// we need closest here due to mouseover bubbling,\n\t\t\t\t// but always pointing at the same event target\n\t\t\t\t.closest( this.options.items );\n\n\t\t// No element to show a tooltip for or the tooltip is already open\n\t\tif ( !target.length || target.data( \"ui-tooltip-id\" ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( target.attr( \"title\" ) ) {\n\t\t\ttarget.data( \"ui-tooltip-title\", target.attr( \"title\" ) );\n\t\t}\n\n\t\ttarget.data( \"ui-tooltip-open\", true );\n\n\t\t// Kill parent tooltips, custom or native, for hover\n\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\ttarget.parents().each( function() {\n\t\t\t\tvar parent = $( this ),\n\t\t\t\t\tblurEvent;\n\t\t\t\tif ( parent.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\tblurEvent = $.Event( \"blur\" );\n\t\t\t\t\tblurEvent.target = blurEvent.currentTarget = this;\n\t\t\t\t\tthat.close( blurEvent, true );\n\t\t\t\t}\n\t\t\t\tif ( parent.attr( \"title\" ) ) {\n\t\t\t\t\tparent.uniqueId();\n\t\t\t\t\tthat.parents[ this.id ] = {\n\t\t\t\t\t\telement: this,\n\t\t\t\t\t\ttitle: parent.attr( \"title\" )\n\t\t\t\t\t};\n\t\t\t\t\tparent.attr( \"title\", \"\" );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tthis._registerCloseHandlers( event, target );\n\t\tthis._updateContent( target, event );\n\t},\n\n\t_updateContent: function( target, event ) {\n\t\tvar content,\n\t\t\tcontentOption = this.options.content,\n\t\t\tthat = this,\n\t\t\teventType = event ? event.type : null;\n\n\t\tif ( typeof contentOption === \"string\" || contentOption.nodeType ||\n\t\t\t\tcontentOption.jquery ) {\n\t\t\treturn this._open( event, target, contentOption );\n\t\t}\n\n\t\tcontent = contentOption.call( target[ 0 ], function( response ) {\n\n\t\t\t// IE may instantly serve a cached response for ajax requests\n\t\t\t// delay this call to _open so the other call to _open runs first\n\t\t\tthat._delay( function() {\n\n\t\t\t\t// Ignore async response if tooltip was closed already\n\t\t\t\tif ( !target.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// JQuery creates a special event for focusin when it doesn't\n\t\t\t\t// exist natively. To improve performance, the native event\n\t\t\t\t// object is reused and the type is changed. Therefore, we can't\n\t\t\t\t// rely on the type being correct after the event finished\n\t\t\t\t// bubbling, so we set it back to the previous value. (#8740)\n\t\t\t\tif ( event ) {\n\t\t\t\t\tevent.type = eventType;\n\t\t\t\t}\n\t\t\t\tthis._open( event, target, response );\n\t\t\t} );\n\t\t} );\n\t\tif ( content ) {\n\t\t\tthis._open( event, target, content );\n\t\t}\n\t},\n\n\t_open: function( event, target, content ) {\n\t\tvar tooltipData, tooltip, delayedShow, a11yContent,\n\t\t\tpositionOption = $.extend( {}, this.options.position );\n\n\t\tif ( !content ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Content can be updated multiple times. If the tooltip already\n\t\t// exists, then just update the content and bail.\n\t\ttooltipData = this._find( target );\n\t\tif ( tooltipData ) {\n\t\t\ttooltipData.tooltip.find( \".ui-tooltip-content\" ).html( content );\n\t\t\treturn;\n\t\t}\n\n\t\t// If we have a title, clear it to prevent the native tooltip\n\t\t// we have to check first to avoid defining a title if none exists\n\t\t// (we don't want to cause an element to start matching [title])\n\t\t//\n\t\t// We use removeAttr only for key events, to allow IE to export the correct\n\t\t// accessible attributes. For mouse events, set to empty string to avoid\n\t\t// native tooltip showing up (happens only when removing inside mouseover).\n\t\tif ( target.is( \"[title]\" ) ) {\n\t\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\t\ttarget.attr( \"title\", \"\" );\n\t\t\t} else {\n\t\t\t\ttarget.removeAttr( \"title\" );\n\t\t\t}\n\t\t}\n\n\t\ttooltipData = this._tooltip( target );\n\t\ttooltip = tooltipData.tooltip;\n\t\tthis._addDescribedBy( target, tooltip.attr( \"id\" ) );\n\t\ttooltip.find( \".ui-tooltip-content\" ).html( content );\n\n\t\t// Support: Voiceover on OS X, JAWS on IE <= 9\n\t\t// JAWS announces deletions even when aria-relevant=\"additions\"\n\t\t// Voiceover will sometimes re-read the entire log region's contents from the beginning\n\t\tthis.liveRegion.children().hide();\n\t\ta11yContent = $( \"<div>\" ).html( tooltip.find( \".ui-tooltip-content\" ).html() );\n\t\ta11yContent.removeAttr( \"name\" ).find( \"[name]\" ).removeAttr( \"name\" );\n\t\ta11yContent.removeAttr( \"id\" ).find( \"[id]\" ).removeAttr( \"id\" );\n\t\ta11yContent.appendTo( this.liveRegion );\n\n\t\tfunction position( event ) {\n\t\t\tpositionOption.of = event;\n\t\t\tif ( tooltip.is( \":hidden\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttooltip.position( positionOption );\n\t\t}\n\t\tif ( this.options.track && event && /^mouse/.test( event.type ) ) {\n\t\t\tthis._on( this.document, {\n\t\t\t\tmousemove: position\n\t\t\t} );\n\n\t\t\t// trigger once to override element-relative positioning\n\t\t\tposition( event );\n\t\t} else {\n\t\t\ttooltip.position( $.extend( {\n\t\t\t\tof: target\n\t\t\t}, this.options.position ) );\n\t\t}\n\n\t\ttooltip.hide();\n\n\t\tthis._show( tooltip, this.options.show );\n\n\t\t// Handle tracking tooltips that are shown with a delay (#8644). As soon\n\t\t// as the tooltip is visible, position the tooltip using the most recent\n\t\t// event.\n\t\t// Adds the check to add the timers only when both delay and track options are set (#14682)\n\t\tif ( this.options.track && this.options.show && this.options.show.delay ) {\n\t\t\tdelayedShow = this.delayedShow = setInterval( function() {\n\t\t\t\tif ( tooltip.is( \":visible\" ) ) {\n\t\t\t\t\tposition( positionOption.of );\n\t\t\t\t\tclearInterval( delayedShow );\n\t\t\t\t}\n\t\t\t}, $.fx.interval );\n\t\t}\n\n\t\tthis._trigger( \"open\", event, { tooltip: tooltip } );\n\t},\n\n\t_registerCloseHandlers: function( event, target ) {\n\t\tvar events = {\n\t\t\tkeyup: function( event ) {\n\t\t\t\tif ( event.keyCode === $.ui.keyCode.ESCAPE ) {\n\t\t\t\t\tvar fakeEvent = $.Event( event );\n\t\t\t\t\tfakeEvent.currentTarget = target[ 0 ];\n\t\t\t\t\tthis.close( fakeEvent, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Only bind remove handler for delegated targets. Non-delegated\n\t\t// tooltips will handle this in destroy.\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tevents.remove = function() {\n\t\t\t\tthis._removeTooltip( this._find( target ).tooltip );\n\t\t\t};\n\t\t}\n\n\t\tif ( !event || event.type === \"mouseover\" ) {\n\t\t\tevents.mouseleave = \"close\";\n\t\t}\n\t\tif ( !event || event.type === \"focusin\" ) {\n\t\t\tevents.focusout = \"close\";\n\t\t}\n\t\tthis._on( true, target, events );\n\t},\n\n\tclose: function( event ) {\n\t\tvar tooltip,\n\t\t\tthat = this,\n\t\t\ttarget = $( event ? event.currentTarget : this.element ),\n\t\t\ttooltipData = this._find( target );\n\n\t\t// The tooltip may already be closed\n\t\tif ( !tooltipData ) {\n\n\t\t\t// We set ui-tooltip-open immediately upon open (in open()), but only set the\n\t\t\t// additional data once there's actually content to show (in _open()). So even if the\n\t\t\t// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in\n\t\t\t// the period between open() and _open().\n\t\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\t\treturn;\n\t\t}\n\n\t\ttooltip = tooltipData.tooltip;\n\n\t\t// Disabling closes the tooltip, so we need to track when we're closing\n\t\t// to avoid an infinite loop in case the tooltip becomes disabled on close\n\t\tif ( tooltipData.closing ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear the interval for delayed tracking tooltips\n\t\tclearInterval( this.delayedShow );\n\n\t\t// Only set title if we had one before (see comment in _open())\n\t\t// If the title attribute has changed since open(), don't restore\n\t\tif ( target.data( \"ui-tooltip-title\" ) && !target.attr( \"title\" ) ) {\n\t\t\ttarget.attr( \"title\", target.data( \"ui-tooltip-title\" ) );\n\t\t}\n\n\t\tthis._removeDescribedBy( target );\n\n\t\ttooltipData.hiding = true;\n\t\ttooltip.stop( true );\n\t\tthis._hide( tooltip, this.options.hide, function() {\n\t\t\tthat._removeTooltip( $( this ) );\n\t\t} );\n\n\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\tthis._off( target, \"mouseleave focusout keyup\" );\n\n\t\t// Remove 'remove' binding only on delegated targets\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tthis._off( target, \"remove\" );\n\t\t}\n\t\tthis._off( this.document, \"mousemove\" );\n\n\t\tif ( event && event.type === \"mouseleave\" ) {\n\t\t\t$.each( this.parents, function( id, parent ) {\n\t\t\t\t$( parent.element ).attr( \"title\", parent.title );\n\t\t\t\tdelete that.parents[ id ];\n\t\t\t} );\n\t\t}\n\n\t\ttooltipData.closing = true;\n\t\tthis._trigger( \"close\", event, { tooltip: tooltip } );\n\t\tif ( !tooltipData.hiding ) {\n\t\t\ttooltipData.closing = false;\n\t\t}\n\t},\n\n\t_tooltip: function( element ) {\n\t\tvar tooltip = $( \"<div>\" ).attr( \"role\", \"tooltip\" ),\n\t\t\tcontent = $( \"<div>\" ).appendTo( tooltip ),\n\t\t\tid = tooltip.uniqueId().attr( \"id\" );\n\n\t\tthis._addClass( content, \"ui-tooltip-content\" );\n\t\tthis._addClass( tooltip, \"ui-tooltip\", \"ui-widget ui-widget-content\" );\n\n\t\ttooltip.appendTo( this._appendTo( element ) );\n\n\t\treturn this.tooltips[ id ] = {\n\t\t\telement: element,\n\t\t\ttooltip: tooltip\n\t\t};\n\t},\n\n\t_find: function( target ) {\n\t\tvar id = target.data( \"ui-tooltip-id\" );\n\t\treturn id ? this.tooltips[ id ] : null;\n\t},\n\n\t_removeTooltip: function( tooltip ) {\n\t\ttooltip.remove();\n\t\tdelete this.tooltips[ tooltip.attr( \"id\" ) ];\n\t},\n\n\t_appendTo: function( target ) {\n\t\tvar element = target.closest( \".ui-front, dialog\" );\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[ 0 ].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_destroy: function() {\n\t\tvar that = this;\n\n\t\t// Close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\n\t\t\t// Delegate to close method to handle common cleanup\n\t\t\tvar event = $.Event( \"blur\" ),\n\t\t\t\telement = tooltipData.element;\n\t\t\tevent.target = event.currentTarget = element[ 0 ];\n\t\t\tthat.close( event, true );\n\n\t\t\t// Remove immediately; destroying an open tooltip doesn't use the\n\t\t\t// hide animation\n\t\t\t$( \"#\" + id ).remove();\n\n\t\t\t// Restore the title\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\n\t\t\t\t// If the title attribute has changed since open(), don't restore\n\t\t\t\tif ( !element.attr( \"title\" ) ) {\n\t\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t\t}\n\t\t\t\telement.removeData( \"ui-tooltip-title\" );\n\t\t\t}\n\t\t} );\n\t\tthis.liveRegion.remove();\n\t}\n} );\n\n// DEPRECATED\n// TODO: Switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for tooltipClass option\n\t$.widget( \"ui.tooltip\", $.ui.tooltip, {\n\t\toptions: {\n\t\t\ttooltipClass: null\n\t\t},\n\t\t_tooltip: function() {\n\t\t\tvar tooltipData = this._superApply( arguments );\n\t\t\tif ( this.options.tooltipClass ) {\n\t\t\t\ttooltipData.tooltip.addClass( this.options.tooltipClass );\n\t\t\t}\n\t\t\treturn tooltipData;\n\t\t}\n\t} );\n}\n\nvar widgetsTooltip = $.ui.tooltip;\n\n\n/*!\n * jQuery UI Effects 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Effects Core\n//>>group: Effects\n// jscs:disable maximumLineLength\n//>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects.\n// jscs:enable maximumLineLength\n//>>docs: http://api.jqueryui.com/category/effects-core/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar dataSpace = \"ui-effects-\",\n\tdataSpaceStyle = \"ui-effects-style\",\n\tdataSpaceAnimated = \"ui-effects-animated\",\n\n\t// Create a local jQuery because jQuery Color relies on it and the\n\t// global may not exist with AMD and a custom build (#10199)\n\tjQuery = $;\n\n$.effects = {\n\teffect: {}\n};\n\n/*!\n * jQuery Color Animations v2.1.2\n * https://github.com/jquery/jquery-color\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * Date: Wed Jan 16 08:47:09 2013 -0600\n */\n( function( jQuery, undefined ) {\n\n\tvar stepHooks = \"backgroundColor borderBottomColor borderLeftColor borderRightColor \" +\n\t\t\"borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor\",\n\n\t// Plusequals test for += 100 -= 100\n\trplusequals = /^([\\-+])=\\s*(\\d+\\.?\\d*)/,\n\n\t// A set of RE's that can match strings and generate color tuples.\n\tstringParsers = [ {\n\t\t\tre: /rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ],\n\t\t\t\t\texecResult[ 2 ],\n\t\t\t\t\texecResult[ 3 ],\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\tre: /rgba?\\(\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ] * 2.55,\n\t\t\t\t\texecResult[ 2 ] * 2.55,\n\t\t\t\t\texecResult[ 3 ] * 2.55,\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\n\t\t\t// This regex ignores A-F because it's compared against an already lowercased string\n\t\t\tre: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\tparseInt( execResult[ 1 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 2 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 3 ], 16 )\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\n\t\t\t// This regex ignores A-F because it's compared against an already lowercased string\n\t\t\tre: /#([a-f0-9])([a-f0-9])([a-f0-9])/,\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\tparseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),\n\t\t\t\t\tparseInt( execResult[ 3 ] + execResult[ 3 ], 16 )\n\t\t\t\t];\n\t\t\t}\n\t\t}, {\n\t\t\tre: /hsla?\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\n\t\t\tspace: \"hsla\",\n\t\t\tparse: function( execResult ) {\n\t\t\t\treturn [\n\t\t\t\t\texecResult[ 1 ],\n\t\t\t\t\texecResult[ 2 ] / 100,\n\t\t\t\t\texecResult[ 3 ] / 100,\n\t\t\t\t\texecResult[ 4 ]\n\t\t\t\t];\n\t\t\t}\n\t\t} ],\n\n\t// JQuery.Color( )\n\tcolor = jQuery.Color = function( color, green, blue, alpha ) {\n\t\treturn new jQuery.Color.fn.parse( color, green, blue, alpha );\n\t},\n\tspaces = {\n\t\trgba: {\n\t\t\tprops: {\n\t\t\t\tred: {\n\t\t\t\t\tidx: 0,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t},\n\t\t\t\tgreen: {\n\t\t\t\t\tidx: 1,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t},\n\t\t\t\tblue: {\n\t\t\t\t\tidx: 2,\n\t\t\t\t\ttype: \"byte\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\thsla: {\n\t\t\tprops: {\n\t\t\t\thue: {\n\t\t\t\t\tidx: 0,\n\t\t\t\t\ttype: \"degrees\"\n\t\t\t\t},\n\t\t\t\tsaturation: {\n\t\t\t\t\tidx: 1,\n\t\t\t\t\ttype: \"percent\"\n\t\t\t\t},\n\t\t\t\tlightness: {\n\t\t\t\t\tidx: 2,\n\t\t\t\t\ttype: \"percent\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tpropTypes = {\n\t\t\"byte\": {\n\t\t\tfloor: true,\n\t\t\tmax: 255\n\t\t},\n\t\t\"percent\": {\n\t\t\tmax: 1\n\t\t},\n\t\t\"degrees\": {\n\t\t\tmod: 360,\n\t\t\tfloor: true\n\t\t}\n\t},\n\tsupport = color.support = {},\n\n\t// Element for support tests\n\tsupportElem = jQuery( \"<p>\" )[ 0 ],\n\n\t// Colors = jQuery.Color.names\n\tcolors,\n\n\t// Local aliases of functions called often\n\teach = jQuery.each;\n\n// Determine rgba support immediately\nsupportElem.style.cssText = \"background-color:rgba(1,1,1,.5)\";\nsupport.rgba = supportElem.style.backgroundColor.indexOf( \"rgba\" ) > -1;\n\n// Define cache name and alpha properties\n// for rgba and hsla spaces\neach( spaces, function( spaceName, space ) {\n\tspace.cache = \"_\" + spaceName;\n\tspace.props.alpha = {\n\t\tidx: 3,\n\t\ttype: \"percent\",\n\t\tdef: 1\n\t};\n} );\n\nfunction clamp( value, prop, allowEmpty ) {\n\tvar type = propTypes[ prop.type ] || {};\n\n\tif ( value == null ) {\n\t\treturn ( allowEmpty || !prop.def ) ? null : prop.def;\n\t}\n\n\t// ~~ is an short way of doing floor for positive numbers\n\tvalue = type.floor ? ~~value : parseFloat( value );\n\n\t// IE will pass in empty strings as value for alpha,\n\t// which will hit this case\n\tif ( isNaN( value ) ) {\n\t\treturn prop.def;\n\t}\n\n\tif ( type.mod ) {\n\n\t\t// We add mod before modding to make sure that negatives values\n\t\t// get converted properly: -10 -> 350\n\t\treturn ( value + type.mod ) % type.mod;\n\t}\n\n\t// For now all property types without mod have min and max\n\treturn 0 > value ? 0 : type.max < value ? type.max : value;\n}\n\nfunction stringParse( string ) {\n\tvar inst = color(),\n\t\trgba = inst._rgba = [];\n\n\tstring = string.toLowerCase();\n\n\teach( stringParsers, function( i, parser ) {\n\t\tvar parsed,\n\t\t\tmatch = parser.re.exec( string ),\n\t\t\tvalues = match && parser.parse( match ),\n\t\t\tspaceName = parser.space || \"rgba\";\n\n\t\tif ( values ) {\n\t\t\tparsed = inst[ spaceName ]( values );\n\n\t\t\t// If this was an rgba parse the assignment might happen twice\n\t\t\t// oh well....\n\t\t\tinst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];\n\t\t\trgba = inst._rgba = parsed._rgba;\n\n\t\t\t// Exit each( stringParsers ) here because we matched\n\t\t\treturn false;\n\t\t}\n\t} );\n\n\t// Found a stringParser that handled it\n\tif ( rgba.length ) {\n\n\t\t// If this came from a parsed string, force \"transparent\" when alpha is 0\n\t\t// chrome, (and maybe others) return \"transparent\" as rgba(0,0,0,0)\n\t\tif ( rgba.join() === \"0,0,0,0\" ) {\n\t\t\tjQuery.extend( rgba, colors.transparent );\n\t\t}\n\t\treturn inst;\n\t}\n\n\t// Named colors\n\treturn colors[ string ];\n}\n\ncolor.fn = jQuery.extend( color.prototype, {\n\tparse: function( red, green, blue, alpha ) {\n\t\tif ( red === undefined ) {\n\t\t\tthis._rgba = [ null, null, null, null ];\n\t\t\treturn this;\n\t\t}\n\t\tif ( red.jquery || red.nodeType ) {\n\t\t\tred = jQuery( red ).css( green );\n\t\t\tgreen = undefined;\n\t\t}\n\n\t\tvar inst = this,\n\t\t\ttype = jQuery.type( red ),\n\t\t\trgba = this._rgba = [];\n\n\t\t// More than 1 argument specified - assume ( red, green, blue, alpha )\n\t\tif ( green !== undefined ) {\n\t\t\tred = [ red, green, blue, alpha ];\n\t\t\ttype = \"array\";\n\t\t}\n\n\t\tif ( type === \"string\" ) {\n\t\t\treturn this.parse( stringParse( red ) || colors._default );\n\t\t}\n\n\t\tif ( type === \"array\" ) {\n\t\t\teach( spaces.rgba.props, function( key, prop ) {\n\t\t\t\trgba[ prop.idx ] = clamp( red[ prop.idx ], prop );\n\t\t\t} );\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( type === \"object\" ) {\n\t\t\tif ( red instanceof color ) {\n\t\t\t\teach( spaces, function( spaceName, space ) {\n\t\t\t\t\tif ( red[ space.cache ] ) {\n\t\t\t\t\t\tinst[ space.cache ] = red[ space.cache ].slice();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\teach( spaces, function( spaceName, space ) {\n\t\t\t\t\tvar cache = space.cache;\n\t\t\t\t\teach( space.props, function( key, prop ) {\n\n\t\t\t\t\t\t// If the cache doesn't exist, and we know how to convert\n\t\t\t\t\t\tif ( !inst[ cache ] && space.to ) {\n\n\t\t\t\t\t\t\t// If the value was null, we don't need to copy it\n\t\t\t\t\t\t\t// if the key was alpha, we don't need to copy it either\n\t\t\t\t\t\t\tif ( key === \"alpha\" || red[ key ] == null ) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tinst[ cache ] = space.to( inst._rgba );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// This is the only case where we allow nulls for ALL properties.\n\t\t\t\t\t\t// call clamp with alwaysAllowEmpty\n\t\t\t\t\t\tinst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );\n\t\t\t\t\t} );\n\n\t\t\t\t\t// Everything defined but alpha?\n\t\t\t\t\tif ( inst[ cache ] &&\n\t\t\t\t\t\t\tjQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {\n\n\t\t\t\t\t\t// Use the default of 1\n\t\t\t\t\t\tinst[ cache ][ 3 ] = 1;\n\t\t\t\t\t\tif ( space.from ) {\n\t\t\t\t\t\t\tinst._rgba = space.from( inst[ cache ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t},\n\tis: function( compare ) {\n\t\tvar is = color( compare ),\n\t\t\tsame = true,\n\t\t\tinst = this;\n\n\t\teach( spaces, function( _, space ) {\n\t\t\tvar localCache,\n\t\t\t\tisCache = is[ space.cache ];\n\t\t\tif ( isCache ) {\n\t\t\t\tlocalCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];\n\t\t\t\teach( space.props, function( _, prop ) {\n\t\t\t\t\tif ( isCache[ prop.idx ] != null ) {\n\t\t\t\t\t\tsame = ( isCache[ prop.idx ] === localCache[ prop.idx ] );\n\t\t\t\t\t\treturn same;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn same;\n\t\t} );\n\t\treturn same;\n\t},\n\t_space: function() {\n\t\tvar used = [],\n\t\t\tinst = this;\n\t\teach( spaces, function( spaceName, space ) {\n\t\t\tif ( inst[ space.cache ] ) {\n\t\t\t\tused.push( spaceName );\n\t\t\t}\n\t\t} );\n\t\treturn used.pop();\n\t},\n\ttransition: function( other, distance ) {\n\t\tvar end = color( other ),\n\t\t\tspaceName = end._space(),\n\t\t\tspace = spaces[ spaceName ],\n\t\t\tstartColor = this.alpha() === 0 ? color( \"transparent\" ) : this,\n\t\t\tstart = startColor[ space.cache ] || space.to( startColor._rgba ),\n\t\t\tresult = start.slice();\n\n\t\tend = end[ space.cache ];\n\t\teach( space.props, function( key, prop ) {\n\t\t\tvar index = prop.idx,\n\t\t\t\tstartValue = start[ index ],\n\t\t\t\tendValue = end[ index ],\n\t\t\t\ttype = propTypes[ prop.type ] || {};\n\n\t\t\t// If null, don't override start value\n\t\t\tif ( endValue === null ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If null - use end\n\t\t\tif ( startValue === null ) {\n\t\t\t\tresult[ index ] = endValue;\n\t\t\t} else {\n\t\t\t\tif ( type.mod ) {\n\t\t\t\t\tif ( endValue - startValue > type.mod / 2 ) {\n\t\t\t\t\t\tstartValue += type.mod;\n\t\t\t\t\t} else if ( startValue - endValue > type.mod / 2 ) {\n\t\t\t\t\t\tstartValue -= type.mod;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );\n\t\t\t}\n\t\t} );\n\t\treturn this[ spaceName ]( result );\n\t},\n\tblend: function( opaque ) {\n\n\t\t// If we are already opaque - return ourself\n\t\tif ( this._rgba[ 3 ] === 1 ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tvar rgb = this._rgba.slice(),\n\t\t\ta = rgb.pop(),\n\t\t\tblend = color( opaque )._rgba;\n\n\t\treturn color( jQuery.map( rgb, function( v, i ) {\n\t\t\treturn ( 1 - a ) * blend[ i ] + a * v;\n\t\t} ) );\n\t},\n\ttoRgbaString: function() {\n\t\tvar prefix = \"rgba(\",\n\t\t\trgba = jQuery.map( this._rgba, function( v, i ) {\n\t\t\t\treturn v == null ? ( i > 2 ? 1 : 0 ) : v;\n\t\t\t} );\n\n\t\tif ( rgba[ 3 ] === 1 ) {\n\t\t\trgba.pop();\n\t\t\tprefix = \"rgb(\";\n\t\t}\n\n\t\treturn prefix + rgba.join() + \")\";\n\t},\n\ttoHslaString: function() {\n\t\tvar prefix = \"hsla(\",\n\t\t\thsla = jQuery.map( this.hsla(), function( v, i ) {\n\t\t\t\tif ( v == null ) {\n\t\t\t\t\tv = i > 2 ? 1 : 0;\n\t\t\t\t}\n\n\t\t\t\t// Catch 1 and 2\n\t\t\t\tif ( i && i < 3 ) {\n\t\t\t\t\tv = Math.round( v * 100 ) + \"%\";\n\t\t\t\t}\n\t\t\t\treturn v;\n\t\t\t} );\n\n\t\tif ( hsla[ 3 ] === 1 ) {\n\t\t\thsla.pop();\n\t\t\tprefix = \"hsl(\";\n\t\t}\n\t\treturn prefix + hsla.join() + \")\";\n\t},\n\ttoHexString: function( includeAlpha ) {\n\t\tvar rgba = this._rgba.slice(),\n\t\t\talpha = rgba.pop();\n\n\t\tif ( includeAlpha ) {\n\t\t\trgba.push( ~~( alpha * 255 ) );\n\t\t}\n\n\t\treturn \"#\" + jQuery.map( rgba, function( v ) {\n\n\t\t\t// Default to 0 when nulls exist\n\t\t\tv = ( v || 0 ).toString( 16 );\n\t\t\treturn v.length === 1 ? \"0\" + v : v;\n\t\t} ).join( \"\" );\n\t},\n\ttoString: function() {\n\t\treturn this._rgba[ 3 ] === 0 ? \"transparent\" : this.toRgbaString();\n\t}\n} );\ncolor.fn.parse.prototype = color.fn;\n\n// Hsla conversions adapted from:\n// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021\n\nfunction hue2rgb( p, q, h ) {\n\th = ( h + 1 ) % 1;\n\tif ( h * 6 < 1 ) {\n\t\treturn p + ( q - p ) * h * 6;\n\t}\n\tif ( h * 2 < 1 ) {\n\t\treturn q;\n\t}\n\tif ( h * 3 < 2 ) {\n\t\treturn p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;\n\t}\n\treturn p;\n}\n\nspaces.hsla.to = function( rgba ) {\n\tif ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {\n\t\treturn [ null, null, null, rgba[ 3 ] ];\n\t}\n\tvar r = rgba[ 0 ] / 255,\n\t\tg = rgba[ 1 ] / 255,\n\t\tb = rgba[ 2 ] / 255,\n\t\ta = rgba[ 3 ],\n\t\tmax = Math.max( r, g, b ),\n\t\tmin = Math.min( r, g, b ),\n\t\tdiff = max - min,\n\t\tadd = max + min,\n\t\tl = add * 0.5,\n\t\th, s;\n\n\tif ( min === max ) {\n\t\th = 0;\n\t} else if ( r === max ) {\n\t\th = ( 60 * ( g - b ) / diff ) + 360;\n\t} else if ( g === max ) {\n\t\th = ( 60 * ( b - r ) / diff ) + 120;\n\t} else {\n\t\th = ( 60 * ( r - g ) / diff ) + 240;\n\t}\n\n\t// Chroma (diff) == 0 means greyscale which, by definition, saturation = 0%\n\t// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)\n\tif ( diff === 0 ) {\n\t\ts = 0;\n\t} else if ( l <= 0.5 ) {\n\t\ts = diff / add;\n\t} else {\n\t\ts = diff / ( 2 - add );\n\t}\n\treturn [ Math.round( h ) % 360, s, l, a == null ? 1 : a ];\n};\n\nspaces.hsla.from = function( hsla ) {\n\tif ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {\n\t\treturn [ null, null, null, hsla[ 3 ] ];\n\t}\n\tvar h = hsla[ 0 ] / 360,\n\t\ts = hsla[ 1 ],\n\t\tl = hsla[ 2 ],\n\t\ta = hsla[ 3 ],\n\t\tq = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,\n\t\tp = 2 * l - q;\n\n\treturn [\n\t\tMath.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),\n\t\tMath.round( hue2rgb( p, q, h ) * 255 ),\n\t\tMath.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),\n\t\ta\n\t];\n};\n\neach( spaces, function( spaceName, space ) {\n\tvar props = space.props,\n\t\tcache = space.cache,\n\t\tto = space.to,\n\t\tfrom = space.from;\n\n\t// Makes rgba() and hsla()\n\tcolor.fn[ spaceName ] = function( value ) {\n\n\t\t// Generate a cache for this space if it doesn't exist\n\t\tif ( to && !this[ cache ] ) {\n\t\t\tthis[ cache ] = to( this._rgba );\n\t\t}\n\t\tif ( value === undefined ) {\n\t\t\treturn this[ cache ].slice();\n\t\t}\n\n\t\tvar ret,\n\t\t\ttype = jQuery.type( value ),\n\t\t\tarr = ( type === \"array\" || type === \"object\" ) ? value : arguments,\n\t\t\tlocal = this[ cache ].slice();\n\n\t\teach( props, function( key, prop ) {\n\t\t\tvar val = arr[ type === \"object\" ? key : prop.idx ];\n\t\t\tif ( val == null ) {\n\t\t\t\tval = local[ prop.idx ];\n\t\t\t}\n\t\t\tlocal[ prop.idx ] = clamp( val, prop );\n\t\t} );\n\n\t\tif ( from ) {\n\t\t\tret = color( from( local ) );\n\t\t\tret[ cache ] = local;\n\t\t\treturn ret;\n\t\t} else {\n\t\t\treturn color( local );\n\t\t}\n\t};\n\n\t// Makes red() green() blue() alpha() hue() saturation() lightness()\n\teach( props, function( key, prop ) {\n\n\t\t// Alpha is included in more than one space\n\t\tif ( color.fn[ key ] ) {\n\t\t\treturn;\n\t\t}\n\t\tcolor.fn[ key ] = function( value ) {\n\t\t\tvar vtype = jQuery.type( value ),\n\t\t\t\tfn = ( key === \"alpha\" ? ( this._hsla ? \"hsla\" : \"rgba\" ) : spaceName ),\n\t\t\t\tlocal = this[ fn ](),\n\t\t\t\tcur = local[ prop.idx ],\n\t\t\t\tmatch;\n\n\t\t\tif ( vtype === \"undefined\" ) {\n\t\t\t\treturn cur;\n\t\t\t}\n\n\t\t\tif ( vtype === \"function\" ) {\n\t\t\t\tvalue = value.call( this, cur );\n\t\t\t\tvtype = jQuery.type( value );\n\t\t\t}\n\t\t\tif ( value == null && prop.empty ) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tif ( vtype === \"string\" ) {\n\t\t\t\tmatch = rplusequals.exec( value );\n\t\t\t\tif ( match ) {\n\t\t\t\t\tvalue = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === \"+\" ? 1 : -1 );\n\t\t\t\t}\n\t\t\t}\n\t\t\tlocal[ prop.idx ] = value;\n\t\t\treturn this[ fn ]( local );\n\t\t};\n\t} );\n} );\n\n// Add cssHook and .fx.step function for each named hook.\n// accept a space separated string of properties\ncolor.hook = function( hook ) {\n\tvar hooks = hook.split( \" \" );\n\teach( hooks, function( i, hook ) {\n\t\tjQuery.cssHooks[ hook ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar parsed, curElem,\n\t\t\t\t\tbackgroundColor = \"\";\n\n\t\t\t\tif ( value !== \"transparent\" && ( jQuery.type( value ) !== \"string\" ||\n\t\t\t\t\t\t( parsed = stringParse( value ) ) ) ) {\n\t\t\t\t\tvalue = color( parsed || value );\n\t\t\t\t\tif ( !support.rgba && value._rgba[ 3 ] !== 1 ) {\n\t\t\t\t\t\tcurElem = hook === \"backgroundColor\" ? elem.parentNode : elem;\n\t\t\t\t\t\twhile (\n\t\t\t\t\t\t\t( backgroundColor === \"\" || backgroundColor === \"transparent\" ) &&\n\t\t\t\t\t\t\tcurElem && curElem.style\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tbackgroundColor = jQuery.css( curElem, \"backgroundColor\" );\n\t\t\t\t\t\t\t\tcurElem = curElem.parentNode;\n\t\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvalue = value.blend( backgroundColor && backgroundColor !== \"transparent\" ?\n\t\t\t\t\t\t\tbackgroundColor :\n\t\t\t\t\t\t\t\"_default\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tvalue = value.toRgbaString();\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\telem.style[ hook ] = value;\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// Wrapped to prevent IE from throwing errors on \"invalid\" values like\n\t\t\t\t\t// 'auto' or 'inherit'\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tjQuery.fx.step[ hook ] = function( fx ) {\n\t\t\tif ( !fx.colorInit ) {\n\t\t\t\tfx.start = color( fx.elem, hook );\n\t\t\t\tfx.end = color( fx.end );\n\t\t\t\tfx.colorInit = true;\n\t\t\t}\n\t\t\tjQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );\n\t\t};\n\t} );\n\n};\n\ncolor.hook( stepHooks );\n\njQuery.cssHooks.borderColor = {\n\texpand: function( value ) {\n\t\tvar expanded = {};\n\n\t\teach( [ \"Top\", \"Right\", \"Bottom\", \"Left\" ], function( i, part ) {\n\t\t\texpanded[ \"border\" + part + \"Color\" ] = value;\n\t\t} );\n\t\treturn expanded;\n\t}\n};\n\n// Basic color names only.\n// Usage of any of the other color names requires adding yourself or including\n// jquery.color.svg-names.js.\ncolors = jQuery.Color.names = {\n\n\t// 4.1. Basic color keywords\n\taqua: \"#00ffff\",\n\tblack: \"#000000\",\n\tblue: \"#0000ff\",\n\tfuchsia: \"#ff00ff\",\n\tgray: \"#808080\",\n\tgreen: \"#008000\",\n\tlime: \"#00ff00\",\n\tmaroon: \"#800000\",\n\tnavy: \"#000080\",\n\tolive: \"#808000\",\n\tpurple: \"#800080\",\n\tred: \"#ff0000\",\n\tsilver: \"#c0c0c0\",\n\tteal: \"#008080\",\n\twhite: \"#ffffff\",\n\tyellow: \"#ffff00\",\n\n\t// 4.2.3. \"transparent\" color keyword\n\ttransparent: [ null, null, null, 0 ],\n\n\t_default: \"#ffffff\"\n};\n\n} )( jQuery );\n\n/******************************************************************************/\n/****************************** CLASS ANIMATIONS ******************************/\n/******************************************************************************/\n( function() {\n\nvar classAnimationActions = [ \"add\", \"remove\", \"toggle\" ],\n\tshorthandStyles = {\n\t\tborder: 1,\n\t\tborderBottom: 1,\n\t\tborderColor: 1,\n\t\tborderLeft: 1,\n\t\tborderRight: 1,\n\t\tborderTop: 1,\n\t\tborderWidth: 1,\n\t\tmargin: 1,\n\t\tpadding: 1\n\t};\n\n$.each(\n\t[ \"borderLeftStyle\", \"borderRightStyle\", \"borderBottomStyle\", \"borderTopStyle\" ],\n\tfunction( _, prop ) {\n\t\t$.fx.step[ prop ] = function( fx ) {\n\t\t\tif ( fx.end !== \"none\" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {\n\t\t\t\tjQuery.style( fx.elem, prop, fx.end );\n\t\t\t\tfx.setAttr = true;\n\t\t\t}\n\t\t};\n\t}\n);\n\nfunction getElementStyles( elem ) {\n\tvar key, len,\n\t\tstyle = elem.ownerDocument.defaultView ?\n\t\t\telem.ownerDocument.defaultView.getComputedStyle( elem, null ) :\n\t\t\telem.currentStyle,\n\t\tstyles = {};\n\n\tif ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {\n\t\tlen = style.length;\n\t\twhile ( len-- ) {\n\t\t\tkey = style[ len ];\n\t\t\tif ( typeof style[ key ] === \"string\" ) {\n\t\t\t\tstyles[ $.camelCase( key ) ] = style[ key ];\n\t\t\t}\n\t\t}\n\n\t// Support: Opera, IE <9\n\t} else {\n\t\tfor ( key in style ) {\n\t\t\tif ( typeof style[ key ] === \"string\" ) {\n\t\t\t\tstyles[ key ] = style[ key ];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn styles;\n}\n\nfunction styleDifference( oldStyle, newStyle ) {\n\tvar diff = {},\n\t\tname, value;\n\n\tfor ( name in newStyle ) {\n\t\tvalue = newStyle[ name ];\n\t\tif ( oldStyle[ name ] !== value ) {\n\t\t\tif ( !shorthandStyles[ name ] ) {\n\t\t\t\tif ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {\n\t\t\t\t\tdiff[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn diff;\n}\n\n// Support: jQuery <1.8\nif ( !$.fn.addBack ) {\n\t$.fn.addBack = function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t};\n}\n\n$.effects.animateClass = function( value, duration, easing, callback ) {\n\tvar o = $.speed( duration, easing, callback );\n\n\treturn this.queue( function() {\n\t\tvar animated = $( this ),\n\t\t\tbaseClass = animated.attr( \"class\" ) || \"\",\n\t\t\tapplyClassChange,\n\t\t\tallAnimations = o.children ? animated.find( \"*\" ).addBack() : animated;\n\n\t\t// Map the animated objects to store the original styles.\n\t\tallAnimations = allAnimations.map( function() {\n\t\t\tvar el = $( this );\n\t\t\treturn {\n\t\t\t\tel: el,\n\t\t\t\tstart: getElementStyles( this )\n\t\t\t};\n\t\t} );\n\n\t\t// Apply class change\n\t\tapplyClassChange = function() {\n\t\t\t$.each( classAnimationActions, function( i, action ) {\n\t\t\t\tif ( value[ action ] ) {\n\t\t\t\t\tanimated[ action + \"Class\" ]( value[ action ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t};\n\t\tapplyClassChange();\n\n\t\t// Map all animated objects again - calculate new styles and diff\n\t\tallAnimations = allAnimations.map( function() {\n\t\t\tthis.end = getElementStyles( this.el[ 0 ] );\n\t\t\tthis.diff = styleDifference( this.start, this.end );\n\t\t\treturn this;\n\t\t} );\n\n\t\t// Apply original class\n\t\tanimated.attr( \"class\", baseClass );\n\n\t\t// Map all animated objects again - this time collecting a promise\n\t\tallAnimations = allAnimations.map( function() {\n\t\t\tvar styleInfo = this,\n\t\t\t\tdfd = $.Deferred(),\n\t\t\t\topts = $.extend( {}, o, {\n\t\t\t\t\tqueue: false,\n\t\t\t\t\tcomplete: function() {\n\t\t\t\t\t\tdfd.resolve( styleInfo );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\tthis.el.animate( this.diff, opts );\n\t\t\treturn dfd.promise();\n\t\t} );\n\n\t\t// Once all animations have completed:\n\t\t$.when.apply( $, allAnimations.get() ).done( function() {\n\n\t\t\t// Set the final class\n\t\t\tapplyClassChange();\n\n\t\t\t// For each animated element,\n\t\t\t// clear all css properties that were animated\n\t\t\t$.each( arguments, function() {\n\t\t\t\tvar el = this.el;\n\t\t\t\t$.each( this.diff, function( key ) {\n\t\t\t\t\tel.css( key, \"\" );\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\t// This is guarnteed to be there if you use jQuery.speed()\n\t\t\t// it also handles dequeuing the next anim...\n\t\t\to.complete.call( animated[ 0 ] );\n\t\t} );\n\t} );\n};\n\n$.fn.extend( {\n\taddClass: ( function( orig ) {\n\t\treturn function( classNames, speed, easing, callback ) {\n\t\t\treturn speed ?\n\t\t\t\t$.effects.animateClass.call( this,\n\t\t\t\t\t{ add: classNames }, speed, easing, callback ) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t} )( $.fn.addClass ),\n\n\tremoveClass: ( function( orig ) {\n\t\treturn function( classNames, speed, easing, callback ) {\n\t\t\treturn arguments.length > 1 ?\n\t\t\t\t$.effects.animateClass.call( this,\n\t\t\t\t\t{ remove: classNames }, speed, easing, callback ) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t} )( $.fn.removeClass ),\n\n\ttoggleClass: ( function( orig ) {\n\t\treturn function( classNames, force, speed, easing, callback ) {\n\t\t\tif ( typeof force === \"boolean\" || force === undefined ) {\n\t\t\t\tif ( !speed ) {\n\n\t\t\t\t\t// Without speed parameter\n\t\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t\t} else {\n\t\t\t\t\treturn $.effects.animateClass.call( this,\n\t\t\t\t\t\t( force ? { add: classNames } : { remove: classNames } ),\n\t\t\t\t\t\tspeed, easing, callback );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Without force parameter\n\t\t\t\treturn $.effects.animateClass.call( this,\n\t\t\t\t\t{ toggle: classNames }, force, speed, easing );\n\t\t\t}\n\t\t};\n\t} )( $.fn.toggleClass ),\n\n\tswitchClass: function( remove, add, speed, easing, callback ) {\n\t\treturn $.effects.animateClass.call( this, {\n\t\t\tadd: add,\n\t\t\tremove: remove\n\t\t}, speed, easing, callback );\n\t}\n} );\n\n} )();\n\n/******************************************************************************/\n/*********************************** EFFECTS **********************************/\n/******************************************************************************/\n\n( function() {\n\nif ( $.expr && $.expr.filters && $.expr.filters.animated ) {\n\t$.expr.filters.animated = ( function( orig ) {\n\t\treturn function( elem ) {\n\t\t\treturn !!$( elem ).data( dataSpaceAnimated ) || orig( elem );\n\t\t};\n\t} )( $.expr.filters.animated );\n}\n\nif ( $.uiBackCompat !== false ) {\n\t$.extend( $.effects, {\n\n\t\t// Saves a set of properties in a data storage\n\t\tsave: function( element, set ) {\n\t\t\tvar i = 0, length = set.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( set[ i ] !== null ) {\n\t\t\t\t\telement.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Restores a set of previously saved properties from a data storage\n\t\trestore: function( element, set ) {\n\t\t\tvar val, i = 0, length = set.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( set[ i ] !== null ) {\n\t\t\t\t\tval = element.data( dataSpace + set[ i ] );\n\t\t\t\t\telement.css( set[ i ], val );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tsetMode: function( el, mode ) {\n\t\t\tif ( mode === \"toggle\" ) {\n\t\t\t\tmode = el.is( \":hidden\" ) ? \"show\" : \"hide\";\n\t\t\t}\n\t\t\treturn mode;\n\t\t},\n\n\t\t// Wraps the element around a wrapper that copies position properties\n\t\tcreateWrapper: function( element ) {\n\n\t\t\t// If the element is already wrapped, return it\n\t\t\tif ( element.parent().is( \".ui-effects-wrapper\" ) ) {\n\t\t\t\treturn element.parent();\n\t\t\t}\n\n\t\t\t// Wrap the element\n\t\t\tvar props = {\n\t\t\t\t\twidth: element.outerWidth( true ),\n\t\t\t\t\theight: element.outerHeight( true ),\n\t\t\t\t\t\"float\": element.css( \"float\" )\n\t\t\t\t},\n\t\t\t\twrapper = $( \"<div></div>\" )\n\t\t\t\t\t.addClass( \"ui-effects-wrapper\" )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\tfontSize: \"100%\",\n\t\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\tpadding: 0\n\t\t\t\t\t} ),\n\n\t\t\t\t// Store the size in case width/height are defined in % - Fixes #5245\n\t\t\t\tsize = {\n\t\t\t\t\twidth: element.width(),\n\t\t\t\t\theight: element.height()\n\t\t\t\t},\n\t\t\t\tactive = document.activeElement;\n\n\t\t\t// Support: Firefox\n\t\t\t// Firefox incorrectly exposes anonymous content\n\t\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=561664\n\t\t\ttry {\n\t\t\t\tactive.id;\n\t\t\t} catch ( e ) {\n\t\t\t\tactive = document.body;\n\t\t\t}\n\n\t\t\telement.wrap( wrapper );\n\n\t\t\t// Fixes #7595 - Elements lose focus when wrapped.\n\t\t\tif ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n\t\t\t\t$( active ).trigger( \"focus\" );\n\t\t\t}\n\n\t\t\t// Hotfix for jQuery 1.4 since some change in wrap() seems to actually\n\t\t\t// lose the reference to the wrapped element\n\t\t\twrapper = element.parent();\n\n\t\t\t// Transfer positioning properties to the wrapper\n\t\t\tif ( element.css( \"position\" ) === \"static\" ) {\n\t\t\t\twrapper.css( { position: \"relative\" } );\n\t\t\t\telement.css( { position: \"relative\" } );\n\t\t\t} else {\n\t\t\t\t$.extend( props, {\n\t\t\t\t\tposition: element.css( \"position\" ),\n\t\t\t\t\tzIndex: element.css( \"z-index\" )\n\t\t\t\t} );\n\t\t\t\t$.each( [ \"top\", \"left\", \"bottom\", \"right\" ], function( i, pos ) {\n\t\t\t\t\tprops[ pos ] = element.css( pos );\n\t\t\t\t\tif ( isNaN( parseInt( props[ pos ], 10 ) ) ) {\n\t\t\t\t\t\tprops[ pos ] = \"auto\";\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\telement.css( {\n\t\t\t\t\tposition: \"relative\",\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: \"auto\",\n\t\t\t\t\tbottom: \"auto\"\n\t\t\t\t} );\n\t\t\t}\n\t\t\telement.css( size );\n\n\t\t\treturn wrapper.css( props ).show();\n\t\t},\n\n\t\tremoveWrapper: function( element ) {\n\t\t\tvar active = document.activeElement;\n\n\t\t\tif ( element.parent().is( \".ui-effects-wrapper\" ) ) {\n\t\t\t\telement.parent().replaceWith( element );\n\n\t\t\t\t// Fixes #7595 - Elements lose focus when wrapped.\n\t\t\t\tif ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n\t\t\t\t\t$( active ).trigger( \"focus\" );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn element;\n\t\t}\n\t} );\n}\n\n$.extend( $.effects, {\n\tversion: \"1.12.1\",\n\n\tdefine: function( name, mode, effect ) {\n\t\tif ( !effect ) {\n\t\t\teffect = mode;\n\t\t\tmode = \"effect\";\n\t\t}\n\n\t\t$.effects.effect[ name ] = effect;\n\t\t$.effects.effect[ name ].mode = mode;\n\n\t\treturn effect;\n\t},\n\n\tscaledDimensions: function( element, percent, direction ) {\n\t\tif ( percent === 0 ) {\n\t\t\treturn {\n\t\t\t\theight: 0,\n\t\t\t\twidth: 0,\n\t\t\t\touterHeight: 0,\n\t\t\t\touterWidth: 0\n\t\t\t};\n\t\t}\n\n\t\tvar x = direction !== \"horizontal\" ? ( ( percent || 100 ) / 100 ) : 1,\n\t\t\ty = direction !== \"vertical\" ? ( ( percent || 100 ) / 100 ) : 1;\n\n\t\treturn {\n\t\t\theight: element.height() * y,\n\t\t\twidth: element.width() * x,\n\t\t\touterHeight: element.outerHeight() * y,\n\t\t\touterWidth: element.outerWidth() * x\n\t\t};\n\n\t},\n\n\tclipToBox: function( animation ) {\n\t\treturn {\n\t\t\twidth: animation.clip.right - animation.clip.left,\n\t\t\theight: animation.clip.bottom - animation.clip.top,\n\t\t\tleft: animation.clip.left,\n\t\t\ttop: animation.clip.top\n\t\t};\n\t},\n\n\t// Injects recently queued functions to be first in line (after \"inprogress\")\n\tunshift: function( element, queueLength, count ) {\n\t\tvar queue = element.queue();\n\n\t\tif ( queueLength > 1 ) {\n\t\t\tqueue.splice.apply( queue,\n\t\t\t\t[ 1, 0 ].concat( queue.splice( queueLength, count ) ) );\n\t\t}\n\t\telement.dequeue();\n\t},\n\n\tsaveStyle: function( element ) {\n\t\telement.data( dataSpaceStyle, element[ 0 ].style.cssText );\n\t},\n\n\trestoreStyle: function( element ) {\n\t\telement[ 0 ].style.cssText = element.data( dataSpaceStyle ) || \"\";\n\t\telement.removeData( dataSpaceStyle );\n\t},\n\n\tmode: function( element, mode ) {\n\t\tvar hidden = element.is( \":hidden\" );\n\n\t\tif ( mode === \"toggle\" ) {\n\t\t\tmode = hidden ? \"show\" : \"hide\";\n\t\t}\n\t\tif ( hidden ? mode === \"hide\" : mode === \"show\" ) {\n\t\t\tmode = \"none\";\n\t\t}\n\t\treturn mode;\n\t},\n\n\t// Translates a [top,left] array into a baseline value\n\tgetBaseline: function( origin, original ) {\n\t\tvar y, x;\n\n\t\tswitch ( origin[ 0 ] ) {\n\t\tcase \"top\":\n\t\t\ty = 0;\n\t\t\tbreak;\n\t\tcase \"middle\":\n\t\t\ty = 0.5;\n\t\t\tbreak;\n\t\tcase \"bottom\":\n\t\t\ty = 1;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\ty = origin[ 0 ] / original.height;\n\t\t}\n\n\t\tswitch ( origin[ 1 ] ) {\n\t\tcase \"left\":\n\t\t\tx = 0;\n\t\t\tbreak;\n\t\tcase \"center\":\n\t\t\tx = 0.5;\n\t\t\tbreak;\n\t\tcase \"right\":\n\t\t\tx = 1;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tx = origin[ 1 ] / original.width;\n\t\t}\n\n\t\treturn {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t},\n\n\t// Creates a placeholder element so that the original element can be made absolute\n\tcreatePlaceholder: function( element ) {\n\t\tvar placeholder,\n\t\t\tcssPosition = element.css( \"position\" ),\n\t\t\tposition = element.position();\n\n\t\t// Lock in margins first to account for form elements, which\n\t\t// will change margin if you explicitly set height\n\t\t// see: http://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380\n\t\t// Support: Safari\n\t\telement.css( {\n\t\t\tmarginTop: element.css( \"marginTop\" ),\n\t\t\tmarginBottom: element.css( \"marginBottom\" ),\n\t\t\tmarginLeft: element.css( \"marginLeft\" ),\n\t\t\tmarginRight: element.css( \"marginRight\" )\n\t\t} )\n\t\t.outerWidth( element.outerWidth() )\n\t\t.outerHeight( element.outerHeight() );\n\n\t\tif ( /^(static|relative)/.test( cssPosition ) ) {\n\t\t\tcssPosition = \"absolute\";\n\n\t\t\tplaceholder = $( \"<\" + element[ 0 ].nodeName + \">\" ).insertAfter( element ).css( {\n\n\t\t\t\t// Convert inline to inline block to account for inline elements\n\t\t\t\t// that turn to inline block based on content (like img)\n\t\t\t\tdisplay: /^(inline|ruby)/.test( element.css( \"display\" ) ) ?\n\t\t\t\t\t\"inline-block\" :\n\t\t\t\t\t\"block\",\n\t\t\t\tvisibility: \"hidden\",\n\n\t\t\t\t// Margins need to be set to account for margin collapse\n\t\t\t\tmarginTop: element.css( \"marginTop\" ),\n\t\t\t\tmarginBottom: element.css( \"marginBottom\" ),\n\t\t\t\tmarginLeft: element.css( \"marginLeft\" ),\n\t\t\t\tmarginRight: element.css( \"marginRight\" ),\n\t\t\t\t\"float\": element.css( \"float\" )\n\t\t\t} )\n\t\t\t.outerWidth( element.outerWidth() )\n\t\t\t.outerHeight( element.outerHeight() )\n\t\t\t.addClass( \"ui-effects-placeholder\" );\n\n\t\t\telement.data( dataSpace + \"placeholder\", placeholder );\n\t\t}\n\n\t\telement.css( {\n\t\t\tposition: cssPosition,\n\t\t\tleft: position.left,\n\t\t\ttop: position.top\n\t\t} );\n\n\t\treturn placeholder;\n\t},\n\n\tremovePlaceholder: function( element ) {\n\t\tvar dataKey = dataSpace + \"placeholder\",\n\t\t\t\tplaceholder = element.data( dataKey );\n\n\t\tif ( placeholder ) {\n\t\t\tplaceholder.remove();\n\t\t\telement.removeData( dataKey );\n\t\t}\n\t},\n\n\t// Removes a placeholder if it exists and restores\n\t// properties that were modified during placeholder creation\n\tcleanUp: function( element ) {\n\t\t$.effects.restoreStyle( element );\n\t\t$.effects.removePlaceholder( element );\n\t},\n\n\tsetTransition: function( element, list, factor, value ) {\n\t\tvalue = value || {};\n\t\t$.each( list, function( i, x ) {\n\t\t\tvar unit = element.cssUnit( x );\n\t\t\tif ( unit[ 0 ] > 0 ) {\n\t\t\t\tvalue[ x ] = unit[ 0 ] * factor + unit[ 1 ];\n\t\t\t}\n\t\t} );\n\t\treturn value;\n\t}\n} );\n\n// Return an effect options object for the given parameters:\nfunction _normalizeArguments( effect, options, speed, callback ) {\n\n\t// Allow passing all options as the first parameter\n\tif ( $.isPlainObject( effect ) ) {\n\t\toptions = effect;\n\t\teffect = effect.effect;\n\t}\n\n\t// Convert to an object\n\teffect = { effect: effect };\n\n\t// Catch (effect, null, ...)\n\tif ( options == null ) {\n\t\toptions = {};\n\t}\n\n\t// Catch (effect, callback)\n\tif ( $.isFunction( options ) ) {\n\t\tcallback = options;\n\t\tspeed = null;\n\t\toptions = {};\n\t}\n\n\t// Catch (effect, speed, ?)\n\tif ( typeof options === \"number\" || $.fx.speeds[ options ] ) {\n\t\tcallback = speed;\n\t\tspeed = options;\n\t\toptions = {};\n\t}\n\n\t// Catch (effect, options, callback)\n\tif ( $.isFunction( speed ) ) {\n\t\tcallback = speed;\n\t\tspeed = null;\n\t}\n\n\t// Add options to effect\n\tif ( options ) {\n\t\t$.extend( effect, options );\n\t}\n\n\tspeed = speed || options.duration;\n\teffect.duration = $.fx.off ? 0 :\n\t\ttypeof speed === \"number\" ? speed :\n\t\tspeed in $.fx.speeds ? $.fx.speeds[ speed ] :\n\t\t$.fx.speeds._default;\n\n\teffect.complete = callback || options.complete;\n\n\treturn effect;\n}\n\nfunction standardAnimationOption( option ) {\n\n\t// Valid standard speeds (nothing, number, named speed)\n\tif ( !option || typeof option === \"number\" || $.fx.speeds[ option ] ) {\n\t\treturn true;\n\t}\n\n\t// Invalid strings - treat as \"normal\" speed\n\tif ( typeof option === \"string\" && !$.effects.effect[ option ] ) {\n\t\treturn true;\n\t}\n\n\t// Complete callback\n\tif ( $.isFunction( option ) ) {\n\t\treturn true;\n\t}\n\n\t// Options hash (but not naming an effect)\n\tif ( typeof option === \"object\" && !option.effect ) {\n\t\treturn true;\n\t}\n\n\t// Didn't match any standard API\n\treturn false;\n}\n\n$.fn.extend( {\n\teffect: function( /* effect, options, speed, callback */ ) {\n\t\tvar args = _normalizeArguments.apply( this, arguments ),\n\t\t\teffectMethod = $.effects.effect[ args.effect ],\n\t\t\tdefaultMode = effectMethod.mode,\n\t\t\tqueue = args.queue,\n\t\t\tqueueName = queue || \"fx\",\n\t\t\tcomplete = args.complete,\n\t\t\tmode = args.mode,\n\t\t\tmodes = [],\n\t\t\tprefilter = function( next ) {\n\t\t\t\tvar el = $( this ),\n\t\t\t\t\tnormalizedMode = $.effects.mode( el, mode ) || defaultMode;\n\n\t\t\t\t// Sentinel for duck-punching the :animated psuedo-selector\n\t\t\t\tel.data( dataSpaceAnimated, true );\n\n\t\t\t\t// Save effect mode for later use,\n\t\t\t\t// we can't just call $.effects.mode again later,\n\t\t\t\t// as the .show() below destroys the initial state\n\t\t\t\tmodes.push( normalizedMode );\n\n\t\t\t\t// See $.uiBackCompat inside of run() for removal of defaultMode in 1.13\n\t\t\t\tif ( defaultMode && ( normalizedMode === \"show\" ||\n\t\t\t\t\t\t( normalizedMode === defaultMode && normalizedMode === \"hide\" ) ) ) {\n\t\t\t\t\tel.show();\n\t\t\t\t}\n\n\t\t\t\tif ( !defaultMode || normalizedMode !== \"none\" ) {\n\t\t\t\t\t$.effects.saveStyle( el );\n\t\t\t\t}\n\n\t\t\t\tif ( $.isFunction( next ) ) {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( $.fx.off || !effectMethod ) {\n\n\t\t\t// Delegate to the original method (e.g., .show()) if possible\n\t\t\tif ( mode ) {\n\t\t\t\treturn this[ mode ]( args.duration, complete );\n\t\t\t} else {\n\t\t\t\treturn this.each( function() {\n\t\t\t\t\tif ( complete ) {\n\t\t\t\t\t\tcomplete.call( this );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\tfunction run( next ) {\n\t\t\tvar elem = $( this );\n\n\t\t\tfunction cleanup() {\n\t\t\t\telem.removeData( dataSpaceAnimated );\n\n\t\t\t\t$.effects.cleanUp( elem );\n\n\t\t\t\tif ( args.mode === \"hide\" ) {\n\t\t\t\t\telem.hide();\n\t\t\t\t}\n\n\t\t\t\tdone();\n\t\t\t}\n\n\t\t\tfunction done() {\n\t\t\t\tif ( $.isFunction( complete ) ) {\n\t\t\t\t\tcomplete.call( elem[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\tif ( $.isFunction( next ) ) {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override mode option on a per element basis,\n\t\t\t// as toggle can be either show or hide depending on element state\n\t\t\targs.mode = modes.shift();\n\n\t\t\tif ( $.uiBackCompat !== false && !defaultMode ) {\n\t\t\t\tif ( elem.is( \":hidden\" ) ? mode === \"hide\" : mode === \"show\" ) {\n\n\t\t\t\t\t// Call the core method to track \"olddisplay\" properly\n\t\t\t\t\telem[ mode ]();\n\t\t\t\t\tdone();\n\t\t\t\t} else {\n\t\t\t\t\teffectMethod.call( elem[ 0 ], args, done );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( args.mode === \"none\" ) {\n\n\t\t\t\t\t// Call the core method to track \"olddisplay\" properly\n\t\t\t\t\telem[ mode ]();\n\t\t\t\t\tdone();\n\t\t\t\t} else {\n\t\t\t\t\teffectMethod.call( elem[ 0 ], args, cleanup );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Run prefilter on all elements first to ensure that\n\t\t// any showing or hiding happens before placeholder creation,\n\t\t// which ensures that any layout changes are correctly captured.\n\t\treturn queue === false ?\n\t\t\tthis.each( prefilter ).each( run ) :\n\t\t\tthis.queue( queueName, prefilter ).queue( queueName, run );\n\t},\n\n\tshow: ( function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"show\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t} )( $.fn.show ),\n\n\thide: ( function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"hide\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t} )( $.fn.hide ),\n\n\ttoggle: ( function( orig ) {\n\t\treturn function( option ) {\n\t\t\tif ( standardAnimationOption( option ) || typeof option === \"boolean\" ) {\n\t\t\t\treturn orig.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\n\t\t\t\targs.mode = \"toggle\";\n\t\t\t\treturn this.effect.call( this, args );\n\t\t\t}\n\t\t};\n\t} )( $.fn.toggle ),\n\n\tcssUnit: function( key ) {\n\t\tvar style = this.css( key ),\n\t\t\tval = [];\n\n\t\t$.each( [ \"em\", \"px\", \"%\", \"pt\" ], function( i, unit ) {\n\t\t\tif ( style.indexOf( unit ) > 0 ) {\n\t\t\t\tval = [ parseFloat( style ), unit ];\n\t\t\t}\n\t\t} );\n\t\treturn val;\n\t},\n\n\tcssClip: function( clipObj ) {\n\t\tif ( clipObj ) {\n\t\t\treturn this.css( \"clip\", \"rect(\" + clipObj.top + \"px \" + clipObj.right + \"px \" +\n\t\t\t\tclipObj.bottom + \"px \" + clipObj.left + \"px)\" );\n\t\t}\n\t\treturn parseClip( this.css( \"clip\" ), this );\n\t},\n\n\ttransfer: function( options, done ) {\n\t\tvar element = $( this ),\n\t\t\ttarget = $( options.to ),\n\t\t\ttargetFixed = target.css( \"position\" ) === \"fixed\",\n\t\t\tbody = $( \"body\" ),\n\t\t\tfixTop = targetFixed ? body.scrollTop() : 0,\n\t\t\tfixLeft = targetFixed ? body.scrollLeft() : 0,\n\t\t\tendPosition = target.offset(),\n\t\t\tanimation = {\n\t\t\t\ttop: endPosition.top - fixTop,\n\t\t\t\tleft: endPosition.left - fixLeft,\n\t\t\t\theight: target.innerHeight(),\n\t\t\t\twidth: target.innerWidth()\n\t\t\t},\n\t\t\tstartPosition = element.offset(),\n\t\t\ttransfer = $( \"<div class='ui-effects-transfer'></div>\" )\n\t\t\t\t.appendTo( \"body\" )\n\t\t\t\t.addClass( options.className )\n\t\t\t\t.css( {\n\t\t\t\t\ttop: startPosition.top - fixTop,\n\t\t\t\t\tleft: startPosition.left - fixLeft,\n\t\t\t\t\theight: element.innerHeight(),\n\t\t\t\t\twidth: element.innerWidth(),\n\t\t\t\t\tposition: targetFixed ? \"fixed\" : \"absolute\"\n\t\t\t\t} )\n\t\t\t\t.animate( animation, options.duration, options.easing, function() {\n\t\t\t\t\ttransfer.remove();\n\t\t\t\t\tif ( $.isFunction( done ) ) {\n\t\t\t\t\t\tdone();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t}\n} );\n\nfunction parseClip( str, element ) {\n\t\tvar outerWidth = element.outerWidth(),\n\t\t\touterHeight = element.outerHeight(),\n\t\t\tclipRegex = /^rect\\((-?\\d*\\.?\\d*px|-?\\d+%|auto),?\\s*(-?\\d*\\.?\\d*px|-?\\d+%|auto),?\\s*(-?\\d*\\.?\\d*px|-?\\d+%|auto),?\\s*(-?\\d*\\.?\\d*px|-?\\d+%|auto)\\)$/,\n\t\t\tvalues = clipRegex.exec( str ) || [ \"\", 0, outerWidth, outerHeight, 0 ];\n\n\t\treturn {\n\t\t\ttop: parseFloat( values[ 1 ] ) || 0,\n\t\t\tright: values[ 2 ] === \"auto\" ? outerWidth : parseFloat( values[ 2 ] ),\n\t\t\tbottom: values[ 3 ] === \"auto\" ? outerHeight : parseFloat( values[ 3 ] ),\n\t\t\tleft: parseFloat( values[ 4 ] ) || 0\n\t\t};\n}\n\n$.fx.step.clip = function( fx ) {\n\tif ( !fx.clipInit ) {\n\t\tfx.start = $( fx.elem ).cssClip();\n\t\tif ( typeof fx.end === \"string\" ) {\n\t\t\tfx.end = parseClip( fx.end, fx.elem );\n\t\t}\n\t\tfx.clipInit = true;\n\t}\n\n\t$( fx.elem ).cssClip( {\n\t\ttop: fx.pos * ( fx.end.top - fx.start.top ) + fx.start.top,\n\t\tright: fx.pos * ( fx.end.right - fx.start.right ) + fx.start.right,\n\t\tbottom: fx.pos * ( fx.end.bottom - fx.start.bottom ) + fx.start.bottom,\n\t\tleft: fx.pos * ( fx.end.left - fx.start.left ) + fx.start.left\n\t} );\n};\n\n} )();\n\n/******************************************************************************/\n/*********************************** EASING ***********************************/\n/******************************************************************************/\n\n( function() {\n\n// Based on easing equations from Robert Penner (http://www.robertpenner.com/easing)\n\nvar baseEasings = {};\n\n$.each( [ \"Quad\", \"Cubic\", \"Quart\", \"Quint\", \"Expo\" ], function( i, name ) {\n\tbaseEasings[ name ] = function( p ) {\n\t\treturn Math.pow( p, i + 2 );\n\t};\n} );\n\n$.extend( baseEasings, {\n\tSine: function( p ) {\n\t\treturn 1 - Math.cos( p * Math.PI / 2 );\n\t},\n\tCirc: function( p ) {\n\t\treturn 1 - Math.sqrt( 1 - p * p );\n\t},\n\tElastic: function( p ) {\n\t\treturn p === 0 || p === 1 ? p :\n\t\t\t-Math.pow( 2, 8 * ( p - 1 ) ) * Math.sin( ( ( p - 1 ) * 80 - 7.5 ) * Math.PI / 15 );\n\t},\n\tBack: function( p ) {\n\t\treturn p * p * ( 3 * p - 2 );\n\t},\n\tBounce: function( p ) {\n\t\tvar pow2,\n\t\t\tbounce = 4;\n\n\t\twhile ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}\n\t\treturn 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );\n\t}\n} );\n\n$.each( baseEasings, function( name, easeIn ) {\n\t$.easing[ \"easeIn\" + name ] = easeIn;\n\t$.easing[ \"easeOut\" + name ] = function( p ) {\n\t\treturn 1 - easeIn( 1 - p );\n\t};\n\t$.easing[ \"easeInOut\" + name ] = function( p ) {\n\t\treturn p < 0.5 ?\n\t\t\teaseIn( p * 2 ) / 2 :\n\t\t\t1 - easeIn( p * -2 + 2 ) / 2;\n\t};\n} );\n\n} )();\n\nvar effect = $.effects;\n\n\n/*!\n * jQuery UI Effects Blind 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Blind Effect\n//>>group: Effects\n//>>description: Blinds the element.\n//>>docs: http://api.jqueryui.com/blind-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectBlind = $.effects.define( \"blind\", \"hide\", function( options, done ) {\n\tvar map = {\n\t\t\tup: [ \"bottom\", \"top\" ],\n\t\t\tvertical: [ \"bottom\", \"top\" ],\n\t\t\tdown: [ \"top\", \"bottom\" ],\n\t\t\tleft: [ \"right\", \"left\" ],\n\t\t\thorizontal: [ \"right\", \"left\" ],\n\t\t\tright: [ \"left\", \"right\" ]\n\t\t},\n\t\telement = $( this ),\n\t\tdirection = options.direction || \"up\",\n\t\tstart = element.cssClip(),\n\t\tanimate = { clip: $.extend( {}, start ) },\n\t\tplaceholder = $.effects.createPlaceholder( element );\n\n\tanimate.clip[ map[ direction ][ 0 ] ] = animate.clip[ map[ direction ][ 1 ] ];\n\n\tif ( options.mode === \"show\" ) {\n\t\telement.cssClip( animate.clip );\n\t\tif ( placeholder ) {\n\t\t\tplaceholder.css( $.effects.clipToBox( animate ) );\n\t\t}\n\n\t\tanimate.clip = start;\n\t}\n\n\tif ( placeholder ) {\n\t\tplaceholder.animate( $.effects.clipToBox( animate ), options.duration, options.easing );\n\t}\n\n\telement.animate( animate, {\n\t\tqueue: false,\n\t\tduration: options.duration,\n\t\teasing: options.easing,\n\t\tcomplete: done\n\t} );\n} );\n\n\n/*!\n * jQuery UI Effects Bounce 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Bounce Effect\n//>>group: Effects\n//>>description: Bounces an element horizontally or vertically n times.\n//>>docs: http://api.jqueryui.com/bounce-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectBounce = $.effects.define( \"bounce\", function( options, done ) {\n\tvar upAnim, downAnim, refValue,\n\t\telement = $( this ),\n\n\t\t// Defaults:\n\t\tmode = options.mode,\n\t\thide = mode === \"hide\",\n\t\tshow = mode === \"show\",\n\t\tdirection = options.direction || \"up\",\n\t\tdistance = options.distance,\n\t\ttimes = options.times || 5,\n\n\t\t// Number of internal animations\n\t\tanims = times * 2 + ( show || hide ? 1 : 0 ),\n\t\tspeed = options.duration / anims,\n\t\teasing = options.easing,\n\n\t\t// Utility:\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tmotion = ( direction === \"up\" || direction === \"left\" ),\n\t\ti = 0,\n\n\t\tqueuelen = element.queue().length;\n\n\t$.effects.createPlaceholder( element );\n\n\trefValue = element.css( ref );\n\n\t// Default distance for the BIGGEST bounce is the outer Distance / 3\n\tif ( !distance ) {\n\t\tdistance = element[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]() / 3;\n\t}\n\n\tif ( show ) {\n\t\tdownAnim = { opacity: 1 };\n\t\tdownAnim[ ref ] = refValue;\n\n\t\t// If we are showing, force opacity 0 and set the initial position\n\t\t// then do the \"first\" animation\n\t\telement\n\t\t\t.css( \"opacity\", 0 )\n\t\t\t.css( ref, motion ? -distance * 2 : distance * 2 )\n\t\t\t.animate( downAnim, speed, easing );\n\t}\n\n\t// Start at the smallest distance if we are hiding\n\tif ( hide ) {\n\t\tdistance = distance / Math.pow( 2, times - 1 );\n\t}\n\n\tdownAnim = {};\n\tdownAnim[ ref ] = refValue;\n\n\t// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here\n\tfor ( ; i < times; i++ ) {\n\t\tupAnim = {};\n\t\tupAnim[ ref ] = ( motion ? \"-=\" : \"+=\" ) + distance;\n\n\t\telement\n\t\t\t.animate( upAnim, speed, easing )\n\t\t\t.animate( downAnim, speed, easing );\n\n\t\tdistance = hide ? distance * 2 : distance / 2;\n\t}\n\n\t// Last Bounce when Hiding\n\tif ( hide ) {\n\t\tupAnim = { opacity: 0 };\n\t\tupAnim[ ref ] = ( motion ? \"-=\" : \"+=\" ) + distance;\n\n\t\telement.animate( upAnim, speed, easing );\n\t}\n\n\telement.queue( done );\n\n\t$.effects.unshift( element, queuelen, anims + 1 );\n} );\n\n\n/*!\n * jQuery UI Effects Clip 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Clip Effect\n//>>group: Effects\n//>>description: Clips the element on and off like an old TV.\n//>>docs: http://api.jqueryui.com/clip-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectClip = $.effects.define( \"clip\", \"hide\", function( options, done ) {\n\tvar start,\n\t\tanimate = {},\n\t\telement = $( this ),\n\t\tdirection = options.direction || \"vertical\",\n\t\tboth = direction === \"both\",\n\t\thorizontal = both || direction === \"horizontal\",\n\t\tvertical = both || direction === \"vertical\";\n\n\tstart = element.cssClip();\n\tanimate.clip = {\n\t\ttop: vertical ? ( start.bottom - start.top ) / 2 : start.top,\n\t\tright: horizontal ? ( start.right - start.left ) / 2 : start.right,\n\t\tbottom: vertical ? ( start.bottom - start.top ) / 2 : start.bottom,\n\t\tleft: horizontal ? ( start.right - start.left ) / 2 : start.left\n\t};\n\n\t$.effects.createPlaceholder( element );\n\n\tif ( options.mode === \"show\" ) {\n\t\telement.cssClip( animate.clip );\n\t\tanimate.clip = start;\n\t}\n\n\telement.animate( animate, {\n\t\tqueue: false,\n\t\tduration: options.duration,\n\t\teasing: options.easing,\n\t\tcomplete: done\n\t} );\n\n} );\n\n\n/*!\n * jQuery UI Effects Drop 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Drop Effect\n//>>group: Effects\n//>>description: Moves an element in one direction and hides it at the same time.\n//>>docs: http://api.jqueryui.com/drop-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectDrop = $.effects.define( \"drop\", \"hide\", function( options, done ) {\n\n\tvar distance,\n\t\telement = $( this ),\n\t\tmode = options.mode,\n\t\tshow = mode === \"show\",\n\t\tdirection = options.direction || \"left\",\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tmotion = ( direction === \"up\" || direction === \"left\" ) ? \"-=\" : \"+=\",\n\t\toppositeMotion = ( motion === \"+=\" ) ? \"-=\" : \"+=\",\n\t\tanimation = {\n\t\t\topacity: 0\n\t\t};\n\n\t$.effects.createPlaceholder( element );\n\n\tdistance = options.distance ||\n\t\telement[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]( true ) / 2;\n\n\tanimation[ ref ] = motion + distance;\n\n\tif ( show ) {\n\t\telement.css( animation );\n\n\t\tanimation[ ref ] = oppositeMotion + distance;\n\t\tanimation.opacity = 1;\n\t}\n\n\t// Animate\n\telement.animate( animation, {\n\t\tqueue: false,\n\t\tduration: options.duration,\n\t\teasing: options.easing,\n\t\tcomplete: done\n\t} );\n} );\n\n\n/*!\n * jQuery UI Effects Explode 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Explode Effect\n//>>group: Effects\n// jscs:disable maximumLineLength\n//>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness.\n// jscs:enable maximumLineLength\n//>>docs: http://api.jqueryui.com/explode-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectExplode = $.effects.define( \"explode\", \"hide\", function( options, done ) {\n\n\tvar i, j, left, top, mx, my,\n\t\trows = options.pieces ? Math.round( Math.sqrt( options.pieces ) ) : 3,\n\t\tcells = rows,\n\t\telement = $( this ),\n\t\tmode = options.mode,\n\t\tshow = mode === \"show\",\n\n\t\t// Show and then visibility:hidden the element before calculating offset\n\t\toffset = element.show().css( \"visibility\", \"hidden\" ).offset(),\n\n\t\t// Width and height of a piece\n\t\twidth = Math.ceil( element.outerWidth() / cells ),\n\t\theight = Math.ceil( element.outerHeight() / rows ),\n\t\tpieces = [];\n\n\t// Children animate complete:\n\tfunction childComplete() {\n\t\tpieces.push( this );\n\t\tif ( pieces.length === rows * cells ) {\n\t\t\tanimComplete();\n\t\t}\n\t}\n\n\t// Clone the element for each row and cell.\n\tfor ( i = 0; i < rows; i++ ) { // ===>\n\t\ttop = offset.top + i * height;\n\t\tmy = i - ( rows - 1 ) / 2;\n\n\t\tfor ( j = 0; j < cells; j++ ) { // |||\n\t\t\tleft = offset.left + j * width;\n\t\t\tmx = j - ( cells - 1 ) / 2;\n\n\t\t\t// Create a clone of the now hidden main element that will be absolute positioned\n\t\t\t// within a wrapper div off the -left and -top equal to size of our pieces\n\t\t\telement\n\t\t\t\t.clone()\n\t\t\t\t.appendTo( \"body\" )\n\t\t\t\t.wrap( \"<div></div>\" )\n\t\t\t\t.css( {\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\tvisibility: \"visible\",\n\t\t\t\t\tleft: -j * width,\n\t\t\t\t\ttop: -i * height\n\t\t\t\t} )\n\n\t\t\t\t// Select the wrapper - make it overflow: hidden and absolute positioned based on\n\t\t\t\t// where the original was located +left and +top equal to the size of pieces\n\t\t\t\t.parent()\n\t\t\t\t\t.addClass( \"ui-effects-explode\" )\n\t\t\t\t\t.css( {\n\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\twidth: width,\n\t\t\t\t\t\theight: height,\n\t\t\t\t\t\tleft: left + ( show ? mx * width : 0 ),\n\t\t\t\t\t\ttop: top + ( show ? my * height : 0 ),\n\t\t\t\t\t\topacity: show ? 0 : 1\n\t\t\t\t\t} )\n\t\t\t\t\t.animate( {\n\t\t\t\t\t\tleft: left + ( show ? 0 : mx * width ),\n\t\t\t\t\t\ttop: top + ( show ? 0 : my * height ),\n\t\t\t\t\t\topacity: show ? 1 : 0\n\t\t\t\t\t}, options.duration || 500, options.easing, childComplete );\n\t\t}\n\t}\n\n\tfunction animComplete() {\n\t\telement.css( {\n\t\t\tvisibility: \"visible\"\n\t\t} );\n\t\t$( pieces ).remove();\n\t\tdone();\n\t}\n} );\n\n\n/*!\n * jQuery UI Effects Fade 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Fade Effect\n//>>group: Effects\n//>>description: Fades the element.\n//>>docs: http://api.jqueryui.com/fade-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectFade = $.effects.define( \"fade\", \"toggle\", function( options, done ) {\n\tvar show = options.mode === \"show\";\n\n\t$( this )\n\t\t.css( \"opacity\", show ? 0 : 1 )\n\t\t.animate( {\n\t\t\topacity: show ? 1 : 0\n\t\t}, {\n\t\t\tqueue: false,\n\t\t\tduration: options.duration,\n\t\t\teasing: options.easing,\n\t\t\tcomplete: done\n\t\t} );\n} );\n\n\n/*!\n * jQuery UI Effects Fold 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Fold Effect\n//>>group: Effects\n//>>description: Folds an element first horizontally and then vertically.\n//>>docs: http://api.jqueryui.com/fold-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectFold = $.effects.define( \"fold\", \"hide\", function( options, done ) {\n\n\t// Create element\n\tvar element = $( this ),\n\t\tmode = options.mode,\n\t\tshow = mode === \"show\",\n\t\thide = mode === \"hide\",\n\t\tsize = options.size || 15,\n\t\tpercent = /([0-9]+)%/.exec( size ),\n\t\thorizFirst = !!options.horizFirst,\n\t\tref = horizFirst ? [ \"right\", \"bottom\" ] : [ \"bottom\", \"right\" ],\n\t\tduration = options.duration / 2,\n\n\t\tplaceholder = $.effects.createPlaceholder( element ),\n\n\t\tstart = element.cssClip(),\n\t\tanimation1 = { clip: $.extend( {}, start ) },\n\t\tanimation2 = { clip: $.extend( {}, start ) },\n\n\t\tdistance = [ start[ ref[ 0 ] ], start[ ref[ 1 ] ] ],\n\n\t\tqueuelen = element.queue().length;\n\n\tif ( percent ) {\n\t\tsize = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];\n\t}\n\tanimation1.clip[ ref[ 0 ] ] = size;\n\tanimation2.clip[ ref[ 0 ] ] = size;\n\tanimation2.clip[ ref[ 1 ] ] = 0;\n\n\tif ( show ) {\n\t\telement.cssClip( animation2.clip );\n\t\tif ( placeholder ) {\n\t\t\tplaceholder.css( $.effects.clipToBox( animation2 ) );\n\t\t}\n\n\t\tanimation2.clip = start;\n\t}\n\n\t// Animate\n\telement\n\t\t.queue( function( next ) {\n\t\t\tif ( placeholder ) {\n\t\t\t\tplaceholder\n\t\t\t\t\t.animate( $.effects.clipToBox( animation1 ), duration, options.easing )\n\t\t\t\t\t.animate( $.effects.clipToBox( animation2 ), duration, options.easing );\n\t\t\t}\n\n\t\t\tnext();\n\t\t} )\n\t\t.animate( animation1, duration, options.easing )\n\t\t.animate( animation2, duration, options.easing )\n\t\t.queue( done );\n\n\t$.effects.unshift( element, queuelen, 4 );\n} );\n\n\n/*!\n * jQuery UI Effects Highlight 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Highlight Effect\n//>>group: Effects\n//>>description: Highlights the background of an element in a defined color for a custom duration.\n//>>docs: http://api.jqueryui.com/highlight-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectHighlight = $.effects.define( \"highlight\", \"show\", function( options, done ) {\n\tvar element = $( this ),\n\t\tanimation = {\n\t\t\tbackgroundColor: element.css( \"backgroundColor\" )\n\t\t};\n\n\tif ( options.mode === \"hide\" ) {\n\t\tanimation.opacity = 0;\n\t}\n\n\t$.effects.saveStyle( element );\n\n\telement\n\t\t.css( {\n\t\t\tbackgroundImage: \"none\",\n\t\t\tbackgroundColor: options.color || \"#ffff99\"\n\t\t} )\n\t\t.animate( animation, {\n\t\t\tqueue: false,\n\t\t\tduration: options.duration,\n\t\t\teasing: options.easing,\n\t\t\tcomplete: done\n\t\t} );\n} );\n\n\n/*!\n * jQuery UI Effects Size 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Size Effect\n//>>group: Effects\n//>>description: Resize an element to a specified width and height.\n//>>docs: http://api.jqueryui.com/size-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectSize = $.effects.define( \"size\", function( options, done ) {\n\n\t// Create element\n\tvar baseline, factor, temp,\n\t\telement = $( this ),\n\n\t\t// Copy for children\n\t\tcProps = [ \"fontSize\" ],\n\t\tvProps = [ \"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\" ],\n\t\thProps = [ \"borderLeftWidth\", \"borderRightWidth\", \"paddingLeft\", \"paddingRight\" ],\n\n\t\t// Set options\n\t\tmode = options.mode,\n\t\trestore = mode !== \"effect\",\n\t\tscale = options.scale || \"both\",\n\t\torigin = options.origin || [ \"middle\", \"center\" ],\n\t\tposition = element.css( \"position\" ),\n\t\tpos = element.position(),\n\t\toriginal = $.effects.scaledDimensions( element ),\n\t\tfrom = options.from || original,\n\t\tto = options.to || $.effects.scaledDimensions( element, 0 );\n\n\t$.effects.createPlaceholder( element );\n\n\tif ( mode === \"show\" ) {\n\t\ttemp = from;\n\t\tfrom = to;\n\t\tto = temp;\n\t}\n\n\t// Set scaling factor\n\tfactor = {\n\t\tfrom: {\n\t\t\ty: from.height / original.height,\n\t\t\tx: from.width / original.width\n\t\t},\n\t\tto: {\n\t\t\ty: to.height / original.height,\n\t\t\tx: to.width / original.width\n\t\t}\n\t};\n\n\t// Scale the css box\n\tif ( scale === \"box\" || scale === \"both\" ) {\n\n\t\t// Vertical props scaling\n\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\tfrom = $.effects.setTransition( element, vProps, factor.from.y, from );\n\t\t\tto = $.effects.setTransition( element, vProps, factor.to.y, to );\n\t\t}\n\n\t\t// Horizontal props scaling\n\t\tif ( factor.from.x !== factor.to.x ) {\n\t\t\tfrom = $.effects.setTransition( element, hProps, factor.from.x, from );\n\t\t\tto = $.effects.setTransition( element, hProps, factor.to.x, to );\n\t\t}\n\t}\n\n\t// Scale the content\n\tif ( scale === \"content\" || scale === \"both\" ) {\n\n\t\t// Vertical props scaling\n\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\tfrom = $.effects.setTransition( element, cProps, factor.from.y, from );\n\t\t\tto = $.effects.setTransition( element, cProps, factor.to.y, to );\n\t\t}\n\t}\n\n\t// Adjust the position properties based on the provided origin points\n\tif ( origin ) {\n\t\tbaseline = $.effects.getBaseline( origin, original );\n\t\tfrom.top = ( original.outerHeight - from.outerHeight ) * baseline.y + pos.top;\n\t\tfrom.left = ( original.outerWidth - from.outerWidth ) * baseline.x + pos.left;\n\t\tto.top = ( original.outerHeight - to.outerHeight ) * baseline.y + pos.top;\n\t\tto.left = ( original.outerWidth - to.outerWidth ) * baseline.x + pos.left;\n\t}\n\telement.css( from );\n\n\t// Animate the children if desired\n\tif ( scale === \"content\" || scale === \"both\" ) {\n\n\t\tvProps = vProps.concat( [ \"marginTop\", \"marginBottom\" ] ).concat( cProps );\n\t\thProps = hProps.concat( [ \"marginLeft\", \"marginRight\" ] );\n\n\t\t// Only animate children with width attributes specified\n\t\t// TODO: is this right? should we include anything with css width specified as well\n\t\telement.find( \"*[width]\" ).each( function() {\n\t\t\tvar child = $( this ),\n\t\t\t\tchildOriginal = $.effects.scaledDimensions( child ),\n\t\t\t\tchildFrom = {\n\t\t\t\t\theight: childOriginal.height * factor.from.y,\n\t\t\t\t\twidth: childOriginal.width * factor.from.x,\n\t\t\t\t\touterHeight: childOriginal.outerHeight * factor.from.y,\n\t\t\t\t\touterWidth: childOriginal.outerWidth * factor.from.x\n\t\t\t\t},\n\t\t\t\tchildTo = {\n\t\t\t\t\theight: childOriginal.height * factor.to.y,\n\t\t\t\t\twidth: childOriginal.width * factor.to.x,\n\t\t\t\t\touterHeight: childOriginal.height * factor.to.y,\n\t\t\t\t\touterWidth: childOriginal.width * factor.to.x\n\t\t\t\t};\n\n\t\t\t// Vertical props scaling\n\t\t\tif ( factor.from.y !== factor.to.y ) {\n\t\t\t\tchildFrom = $.effects.setTransition( child, vProps, factor.from.y, childFrom );\n\t\t\t\tchildTo = $.effects.setTransition( child, vProps, factor.to.y, childTo );\n\t\t\t}\n\n\t\t\t// Horizontal props scaling\n\t\t\tif ( factor.from.x !== factor.to.x ) {\n\t\t\t\tchildFrom = $.effects.setTransition( child, hProps, factor.from.x, childFrom );\n\t\t\t\tchildTo = $.effects.setTransition( child, hProps, factor.to.x, childTo );\n\t\t\t}\n\n\t\t\tif ( restore ) {\n\t\t\t\t$.effects.saveStyle( child );\n\t\t\t}\n\n\t\t\t// Animate children\n\t\t\tchild.css( childFrom );\n\t\t\tchild.animate( childTo, options.duration, options.easing, function() {\n\n\t\t\t\t// Restore children\n\t\t\t\tif ( restore ) {\n\t\t\t\t\t$.effects.restoreStyle( child );\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Animate\n\telement.animate( to, {\n\t\tqueue: false,\n\t\tduration: options.duration,\n\t\teasing: options.easing,\n\t\tcomplete: function() {\n\n\t\t\tvar offset = element.offset();\n\n\t\t\tif ( to.opacity === 0 ) {\n\t\t\t\telement.css( \"opacity\", from.opacity );\n\t\t\t}\n\n\t\t\tif ( !restore ) {\n\t\t\t\telement\n\t\t\t\t\t.css( \"position\", position === \"static\" ? \"relative\" : position )\n\t\t\t\t\t.offset( offset );\n\n\t\t\t\t// Need to save style here so that automatic style restoration\n\t\t\t\t// doesn't restore to the original styles from before the animation.\n\t\t\t\t$.effects.saveStyle( element );\n\t\t\t}\n\n\t\t\tdone();\n\t\t}\n\t} );\n\n} );\n\n\n/*!\n * jQuery UI Effects Scale 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Scale Effect\n//>>group: Effects\n//>>description: Grows or shrinks an element and its content.\n//>>docs: http://api.jqueryui.com/scale-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectScale = $.effects.define( \"scale\", function( options, done ) {\n\n\t// Create element\n\tvar el = $( this ),\n\t\tmode = options.mode,\n\t\tpercent = parseInt( options.percent, 10 ) ||\n\t\t\t( parseInt( options.percent, 10 ) === 0 ? 0 : ( mode !== \"effect\" ? 0 : 100 ) ),\n\n\t\tnewOptions = $.extend( true, {\n\t\t\tfrom: $.effects.scaledDimensions( el ),\n\t\t\tto: $.effects.scaledDimensions( el, percent, options.direction || \"both\" ),\n\t\t\torigin: options.origin || [ \"middle\", \"center\" ]\n\t\t}, options );\n\n\t// Fade option to support puff\n\tif ( options.fade ) {\n\t\tnewOptions.from.opacity = 1;\n\t\tnewOptions.to.opacity = 0;\n\t}\n\n\t$.effects.effect.size.call( this, newOptions, done );\n} );\n\n\n/*!\n * jQuery UI Effects Puff 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Puff Effect\n//>>group: Effects\n//>>description: Creates a puff effect by scaling the element up and hiding it at the same time.\n//>>docs: http://api.jqueryui.com/puff-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectPuff = $.effects.define( \"puff\", \"hide\", function( options, done ) {\n\tvar newOptions = $.extend( true, {}, options, {\n\t\tfade: true,\n\t\tpercent: parseInt( options.percent, 10 ) || 150\n\t} );\n\n\t$.effects.effect.scale.call( this, newOptions, done );\n} );\n\n\n/*!\n * jQuery UI Effects Pulsate 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Pulsate Effect\n//>>group: Effects\n//>>description: Pulsates an element n times by changing the opacity to zero and back.\n//>>docs: http://api.jqueryui.com/pulsate-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectPulsate = $.effects.define( \"pulsate\", \"show\", function( options, done ) {\n\tvar element = $( this ),\n\t\tmode = options.mode,\n\t\tshow = mode === \"show\",\n\t\thide = mode === \"hide\",\n\t\tshowhide = show || hide,\n\n\t\t// Showing or hiding leaves off the \"last\" animation\n\t\tanims = ( ( options.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),\n\t\tduration = options.duration / anims,\n\t\tanimateTo = 0,\n\t\ti = 1,\n\t\tqueuelen = element.queue().length;\n\n\tif ( show || !element.is( \":visible\" ) ) {\n\t\telement.css( \"opacity\", 0 ).show();\n\t\tanimateTo = 1;\n\t}\n\n\t// Anims - 1 opacity \"toggles\"\n\tfor ( ; i < anims; i++ ) {\n\t\telement.animate( { opacity: animateTo }, duration, options.easing );\n\t\tanimateTo = 1 - animateTo;\n\t}\n\n\telement.animate( { opacity: animateTo }, duration, options.easing );\n\n\telement.queue( done );\n\n\t$.effects.unshift( element, queuelen, anims + 1 );\n} );\n\n\n/*!\n * jQuery UI Effects Shake 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Shake Effect\n//>>group: Effects\n//>>description: Shakes an element horizontally or vertically n times.\n//>>docs: http://api.jqueryui.com/shake-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectShake = $.effects.define( \"shake\", function( options, done ) {\n\n\tvar i = 1,\n\t\telement = $( this ),\n\t\tdirection = options.direction || \"left\",\n\t\tdistance = options.distance || 20,\n\t\ttimes = options.times || 3,\n\t\tanims = times * 2 + 1,\n\t\tspeed = Math.round( options.duration / anims ),\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tpositiveMotion = ( direction === \"up\" || direction === \"left\" ),\n\t\tanimation = {},\n\t\tanimation1 = {},\n\t\tanimation2 = {},\n\n\t\tqueuelen = element.queue().length;\n\n\t$.effects.createPlaceholder( element );\n\n\t// Animation\n\tanimation[ ref ] = ( positiveMotion ? \"-=\" : \"+=\" ) + distance;\n\tanimation1[ ref ] = ( positiveMotion ? \"+=\" : \"-=\" ) + distance * 2;\n\tanimation2[ ref ] = ( positiveMotion ? \"-=\" : \"+=\" ) + distance * 2;\n\n\t// Animate\n\telement.animate( animation, speed, options.easing );\n\n\t// Shakes\n\tfor ( ; i < times; i++ ) {\n\t\telement\n\t\t\t.animate( animation1, speed, options.easing )\n\t\t\t.animate( animation2, speed, options.easing );\n\t}\n\n\telement\n\t\t.animate( animation1, speed, options.easing )\n\t\t.animate( animation, speed / 2, options.easing )\n\t\t.queue( done );\n\n\t$.effects.unshift( element, queuelen, anims + 1 );\n} );\n\n\n/*!\n * jQuery UI Effects Slide 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Slide Effect\n//>>group: Effects\n//>>description: Slides an element in and out of the viewport.\n//>>docs: http://api.jqueryui.com/slide-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effectsEffectSlide = $.effects.define( \"slide\", \"show\", function( options, done ) {\n\tvar startClip, startRef,\n\t\telement = $( this ),\n\t\tmap = {\n\t\t\tup: [ \"bottom\", \"top\" ],\n\t\t\tdown: [ \"top\", \"bottom\" ],\n\t\t\tleft: [ \"right\", \"left\" ],\n\t\t\tright: [ \"left\", \"right\" ]\n\t\t},\n\t\tmode = options.mode,\n\t\tdirection = options.direction || \"left\",\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\n\t\tpositiveMotion = ( direction === \"up\" || direction === \"left\" ),\n\t\tdistance = options.distance ||\n\t\t\telement[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]( true ),\n\t\tanimation = {};\n\n\t$.effects.createPlaceholder( element );\n\n\tstartClip = element.cssClip();\n\tstartRef = element.position()[ ref ];\n\n\t// Define hide animation\n\tanimation[ ref ] = ( positiveMotion ? -1 : 1 ) * distance + startRef;\n\tanimation.clip = element.cssClip();\n\tanimation.clip[ map[ direction ][ 1 ] ] = animation.clip[ map[ direction ][ 0 ] ];\n\n\t// Reverse the animation if we're showing\n\tif ( mode === \"show\" ) {\n\t\telement.cssClip( animation.clip );\n\t\telement.css( ref, animation[ ref ] );\n\t\tanimation.clip = startClip;\n\t\tanimation[ ref ] = startRef;\n\t}\n\n\t// Actually animate\n\telement.animate( animation, {\n\t\tqueue: false,\n\t\tduration: options.duration,\n\t\teasing: options.easing,\n\t\tcomplete: done\n\t} );\n} );\n\n\n/*!\n * jQuery UI Effects Transfer 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Transfer Effect\n//>>group: Effects\n//>>description: Displays a transfer effect from one element to another.\n//>>docs: http://api.jqueryui.com/transfer-effect/\n//>>demos: http://jqueryui.com/effect/\n\n\n\nvar effect;\nif ( $.uiBackCompat !== false ) {\n\teffect = $.effects.define( \"transfer\", function( options, done ) {\n\t\t$( this ).transfer( options, done );\n\t} );\n}\nvar effectsEffectTransfer = effect;\n\n\n\n\n}));"
  },
  {
    "path": "pages/include/jquery_ui/themes/start/jquery-ui.css",
    "content": "/*! jQuery UI - v1.12.1 - 2016-09-14\n* http://jqueryui.com\n* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css\n* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=2191c0&bgTextureHeader=gloss_wave&bgImgOpacityHeader=75&borderColorHeader=4297d7&fcHeader=eaf5f7&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=0078ae&bgColorDefault=0078ae&bgTextureDefault=glass&bgImgOpacityDefault=45&borderColorDefault=77d5f7&fcDefault=ffffff&iconColorDefault=e0fdff&bgColorHover=79c9ec&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=448dae&fcHover=026890&iconColorHover=056b93&bgColorActive=6eac2c&bgTextureActive=gloss_wave&bgImgOpacityActive=50&borderColorActive=acdd4a&fcActive=ffffff&iconColorActive=f5e175&bgColorHighlight=f8da4e&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcd113&fcHighlight=915608&iconColorHighlight=f7a50d&bgColorError=e14f1c&bgTextureError=gloss_wave&bgImgOpacityError=45&borderColorError=cd0a0a&fcError=ffffff&iconColorError=fcd113&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=75&opacityOverlay=30&bgColorShadow=999999&bgTextureShadow=flat&bgImgOpacityShadow=55&opacityShadow=45&thicknessShadow=0px&offsetTopShadow=5px&offsetLeftShadow=5px&cornerRadiusShadow=5px\n* Copyright jQuery Foundation and other contributors; Licensed MIT */\n\n/* Layout helpers\n----------------------------------*/\n.ui-helper-hidden {\n\tdisplay: none;\n}\n.ui-helper-hidden-accessible {\n\tborder: 0;\n\tclip: rect(0 0 0 0);\n\theight: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\twidth: 1px;\n}\n.ui-helper-reset {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\toutline: 0;\n\tline-height: 1.3;\n\ttext-decoration: none;\n\tfont-size: 100%;\n\tlist-style: none;\n}\n.ui-helper-clearfix:before,\n.ui-helper-clearfix:after {\n\tcontent: \"\";\n\tdisplay: table;\n\tborder-collapse: collapse;\n}\n.ui-helper-clearfix:after {\n\tclear: both;\n}\n.ui-helper-zfix {\n\twidth: 100%;\n\theight: 100%;\n\ttop: 0;\n\tleft: 0;\n\tposition: absolute;\n\topacity: 0;\n\tfilter:Alpha(Opacity=0); /* support: IE8 */\n}\n\n.ui-front {\n\tz-index: 100;\n}\n\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-disabled {\n\tcursor: default !important;\n\tpointer-events: none;\n}\n\n\n/* Icons\n----------------------------------*/\n.ui-icon {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tmargin-top: -.25em;\n\tposition: relative;\n\ttext-indent: -99999px;\n\toverflow: hidden;\n\tbackground-repeat: no-repeat;\n}\n\n.ui-widget-icon-block {\n\tleft: 50%;\n\tmargin-left: -8px;\n\tdisplay: block;\n}\n\n/* Misc visuals\n----------------------------------*/\n\n/* Overlays */\n.ui-widget-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n}\n.ui-accordion .ui-accordion-header {\n\tdisplay: block;\n\tcursor: pointer;\n\tposition: relative;\n\tmargin: 2px 0 0 0;\n\tpadding: .5em .5em .5em .7em;\n\tfont-size: 100%;\n}\n.ui-accordion .ui-accordion-content {\n\tpadding: 1em 2.2em;\n\tborder-top: 0;\n\toverflow: auto;\n}\n.ui-autocomplete {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tcursor: default;\n}\n.ui-menu {\n\tlist-style: none;\n\tpadding: 0;\n\tmargin: 0;\n\tdisplay: block;\n\toutline: 0;\n}\n.ui-menu .ui-menu {\n\tposition: absolute;\n}\n.ui-menu .ui-menu-item {\n\tmargin: 0;\n\tcursor: pointer;\n\t/* support: IE10, see #8844 */\n\tlist-style-image: url(\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\");\n}\n.ui-menu .ui-menu-item-wrapper {\n\tposition: relative;\n\tpadding: 3px 1em 3px .4em;\n}\n.ui-menu .ui-menu-divider {\n\tmargin: 5px 0;\n\theight: 0;\n\tfont-size: 0;\n\tline-height: 0;\n\tborder-width: 1px 0 0 0;\n}\n.ui-menu .ui-state-focus,\n.ui-menu .ui-state-active {\n\tmargin: -1px;\n}\n\n/* icon support */\n.ui-menu-icons {\n\tposition: relative;\n}\n.ui-menu-icons .ui-menu-item-wrapper {\n\tpadding-left: 2em;\n}\n\n/* left-aligned */\n.ui-menu .ui-icon {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: .2em;\n\tmargin: auto 0;\n}\n\n/* right-aligned */\n.ui-menu .ui-menu-icon {\n\tleft: auto;\n\tright: 0;\n}\n.ui-button {\n\tpadding: .4em 1em;\n\tdisplay: inline-block;\n\tposition: relative;\n\tline-height: normal;\n\tmargin-right: .1em;\n\tcursor: pointer;\n\tvertical-align: middle;\n\ttext-align: center;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\n\t/* Support: IE <= 11 */\n\toverflow: visible;\n}\n\n.ui-button,\n.ui-button:link,\n.ui-button:visited,\n.ui-button:hover,\n.ui-button:active {\n\ttext-decoration: none;\n}\n\n/* to make room for the icon, a width needs to be set here */\n.ui-button-icon-only {\n\twidth: 2em;\n\tbox-sizing: border-box;\n\ttext-indent: -9999px;\n\twhite-space: nowrap;\n}\n\n/* no icon support for input elements */\ninput.ui-button.ui-button-icon-only {\n\ttext-indent: 0;\n}\n\n/* button icon element(s) */\n.ui-button-icon-only .ui-icon {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\tmargin-top: -8px;\n\tmargin-left: -8px;\n}\n\n.ui-button.ui-icon-notext .ui-icon {\n\tpadding: 0;\n\twidth: 2.1em;\n\theight: 2.1em;\n\ttext-indent: -9999px;\n\twhite-space: nowrap;\n\n}\n\ninput.ui-button.ui-icon-notext .ui-icon {\n\twidth: auto;\n\theight: auto;\n\ttext-indent: 0;\n\twhite-space: normal;\n\tpadding: .4em 1em;\n}\n\n/* workarounds */\n/* Support: Firefox 5 - 40 */\ninput.ui-button::-moz-focus-inner,\nbutton.ui-button::-moz-focus-inner {\n\tborder: 0;\n\tpadding: 0;\n}\n.ui-controlgroup {\n\tvertical-align: middle;\n\tdisplay: inline-block;\n}\n.ui-controlgroup > .ui-controlgroup-item {\n\tfloat: left;\n\tmargin-left: 0;\n\tmargin-right: 0;\n}\n.ui-controlgroup > .ui-controlgroup-item:focus,\n.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {\n\tz-index: 9999;\n}\n.ui-controlgroup-vertical > .ui-controlgroup-item {\n\tdisplay: block;\n\tfloat: none;\n\twidth: 100%;\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n\ttext-align: left;\n}\n.ui-controlgroup-vertical .ui-controlgroup-item {\n\tbox-sizing: border-box;\n}\n.ui-controlgroup .ui-controlgroup-label {\n\tpadding: .4em 1em;\n}\n.ui-controlgroup .ui-controlgroup-label span {\n\tfont-size: 80%;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {\n\tborder-left: none;\n}\n.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {\n\tborder-top: none;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {\n\tborder-right: none;\n}\n.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {\n\tborder-bottom: none;\n}\n\n/* Spinner specific style fixes */\n.ui-controlgroup-vertical .ui-spinner-input {\n\n\t/* Support: IE8 only, Android < 4.4 only */\n\twidth: 75%;\n\twidth: calc( 100% - 2.4em );\n}\n.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {\n\tborder-top-style: solid;\n}\n\n.ui-checkboxradio-label .ui-icon-background {\n\tbox-shadow: inset 1px 1px 1px #ccc;\n\tborder-radius: .12em;\n\tborder: none;\n}\n.ui-checkboxradio-radio-label .ui-icon-background {\n\twidth: 16px;\n\theight: 16px;\n\tborder-radius: 1em;\n\toverflow: visible;\n\tborder: none;\n}\n.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,\n.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {\n\tbackground-image: none;\n\twidth: 8px;\n\theight: 8px;\n\tborder-width: 4px;\n\tborder-style: solid;\n}\n.ui-checkboxradio-disabled {\n\tpointer-events: none;\n}\n.ui-datepicker {\n\twidth: 17em;\n\tpadding: .2em .2em 0;\n\tdisplay: none;\n}\n.ui-datepicker .ui-datepicker-header {\n\tposition: relative;\n\tpadding: .2em 0;\n}\n.ui-datepicker .ui-datepicker-prev,\n.ui-datepicker .ui-datepicker-next {\n\tposition: absolute;\n\ttop: 2px;\n\twidth: 1.8em;\n\theight: 1.8em;\n}\n.ui-datepicker .ui-datepicker-prev-hover,\n.ui-datepicker .ui-datepicker-next-hover {\n\ttop: 1px;\n}\n.ui-datepicker .ui-datepicker-prev {\n\tleft: 2px;\n}\n.ui-datepicker .ui-datepicker-next {\n\tright: 2px;\n}\n.ui-datepicker .ui-datepicker-prev-hover {\n\tleft: 1px;\n}\n.ui-datepicker .ui-datepicker-next-hover {\n\tright: 1px;\n}\n.ui-datepicker .ui-datepicker-prev span,\n.ui-datepicker .ui-datepicker-next span {\n\tdisplay: block;\n\tposition: absolute;\n\tleft: 50%;\n\tmargin-left: -8px;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n.ui-datepicker .ui-datepicker-title {\n\tmargin: 0 2.3em;\n\tline-height: 1.8em;\n\ttext-align: center;\n}\n.ui-datepicker .ui-datepicker-title select {\n\tfont-size: 1em;\n\tmargin: 1px 0;\n}\n.ui-datepicker select.ui-datepicker-month,\n.ui-datepicker select.ui-datepicker-year {\n\twidth: 45%;\n}\n.ui-datepicker table {\n\twidth: 100%;\n\tfont-size: .9em;\n\tborder-collapse: collapse;\n\tmargin: 0 0 .4em;\n}\n.ui-datepicker th {\n\tpadding: .7em .3em;\n\ttext-align: center;\n\tfont-weight: bold;\n\tborder: 0;\n}\n.ui-datepicker td {\n\tborder: 0;\n\tpadding: 1px;\n}\n.ui-datepicker td span,\n.ui-datepicker td a {\n\tdisplay: block;\n\tpadding: .2em;\n\ttext-align: right;\n\ttext-decoration: none;\n}\n.ui-datepicker .ui-datepicker-buttonpane {\n\tbackground-image: none;\n\tmargin: .7em 0 0 0;\n\tpadding: 0 .2em;\n\tborder-left: 0;\n\tborder-right: 0;\n\tborder-bottom: 0;\n}\n.ui-datepicker .ui-datepicker-buttonpane button {\n\tfloat: right;\n\tmargin: .5em .2em .4em;\n\tcursor: pointer;\n\tpadding: .2em .6em .3em .6em;\n\twidth: auto;\n\toverflow: visible;\n}\n.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {\n\tfloat: left;\n}\n\n/* with multiple calendars */\n.ui-datepicker.ui-datepicker-multi {\n\twidth: auto;\n}\n.ui-datepicker-multi .ui-datepicker-group {\n\tfloat: left;\n}\n.ui-datepicker-multi .ui-datepicker-group table {\n\twidth: 95%;\n\tmargin: 0 auto .4em;\n}\n.ui-datepicker-multi-2 .ui-datepicker-group {\n\twidth: 50%;\n}\n.ui-datepicker-multi-3 .ui-datepicker-group {\n\twidth: 33.3%;\n}\n.ui-datepicker-multi-4 .ui-datepicker-group {\n\twidth: 25%;\n}\n.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-left-width: 0;\n}\n.ui-datepicker-multi .ui-datepicker-buttonpane {\n\tclear: left;\n}\n.ui-datepicker-row-break {\n\tclear: both;\n\twidth: 100%;\n\tfont-size: 0;\n}\n\n/* RTL support */\n.ui-datepicker-rtl {\n\tdirection: rtl;\n}\n.ui-datepicker-rtl .ui-datepicker-prev {\n\tright: 2px;\n\tleft: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-next {\n\tleft: 2px;\n\tright: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-prev:hover {\n\tright: 1px;\n\tleft: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-next:hover {\n\tleft: 1px;\n\tright: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane {\n\tclear: right;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane button {\n\tfloat: left;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,\n.ui-datepicker-rtl .ui-datepicker-group {\n\tfloat: right;\n}\n.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-right-width: 0;\n\tborder-left-width: 1px;\n}\n\n/* Icons */\n.ui-datepicker .ui-icon {\n\tdisplay: block;\n\ttext-indent: -99999px;\n\toverflow: hidden;\n\tbackground-repeat: no-repeat;\n\tleft: .5em;\n\ttop: .3em;\n}\n.ui-dialog {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tpadding: .2em;\n\toutline: 0;\n}\n.ui-dialog .ui-dialog-titlebar {\n\tpadding: .4em 1em;\n\tposition: relative;\n}\n.ui-dialog .ui-dialog-title {\n\tfloat: left;\n\tmargin: .1em 0;\n\twhite-space: nowrap;\n\twidth: 90%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n.ui-dialog .ui-dialog-titlebar-close {\n\tposition: absolute;\n\tright: .3em;\n\ttop: 50%;\n\twidth: 20px;\n\tmargin: -10px 0 0 0;\n\tpadding: 1px;\n\theight: 20px;\n}\n.ui-dialog .ui-dialog-content {\n\tposition: relative;\n\tborder: 0;\n\tpadding: .5em 1em;\n\tbackground: none;\n\toverflow: auto;\n}\n.ui-dialog .ui-dialog-buttonpane {\n\ttext-align: left;\n\tborder-width: 1px 0 0 0;\n\tbackground-image: none;\n\tmargin-top: .5em;\n\tpadding: .3em 1em .5em .4em;\n}\n.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {\n\tfloat: right;\n}\n.ui-dialog .ui-dialog-buttonpane button {\n\tmargin: .5em .4em .5em 0;\n\tcursor: pointer;\n}\n.ui-dialog .ui-resizable-n {\n\theight: 2px;\n\ttop: 0;\n}\n.ui-dialog .ui-resizable-e {\n\twidth: 2px;\n\tright: 0;\n}\n.ui-dialog .ui-resizable-s {\n\theight: 2px;\n\tbottom: 0;\n}\n.ui-dialog .ui-resizable-w {\n\twidth: 2px;\n\tleft: 0;\n}\n.ui-dialog .ui-resizable-se,\n.ui-dialog .ui-resizable-sw,\n.ui-dialog .ui-resizable-ne,\n.ui-dialog .ui-resizable-nw {\n\twidth: 7px;\n\theight: 7px;\n}\n.ui-dialog .ui-resizable-se {\n\tright: 0;\n\tbottom: 0;\n}\n.ui-dialog .ui-resizable-sw {\n\tleft: 0;\n\tbottom: 0;\n}\n.ui-dialog .ui-resizable-ne {\n\tright: 0;\n\ttop: 0;\n}\n.ui-dialog .ui-resizable-nw {\n\tleft: 0;\n\ttop: 0;\n}\n.ui-draggable .ui-dialog-titlebar {\n\tcursor: move;\n}\n.ui-draggable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-resizable {\n\tposition: relative;\n}\n.ui-resizable-handle {\n\tposition: absolute;\n\tfont-size: 0.1px;\n\tdisplay: block;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-resizable-disabled .ui-resizable-handle,\n.ui-resizable-autohide .ui-resizable-handle {\n\tdisplay: none;\n}\n.ui-resizable-n {\n\tcursor: n-resize;\n\theight: 7px;\n\twidth: 100%;\n\ttop: -5px;\n\tleft: 0;\n}\n.ui-resizable-s {\n\tcursor: s-resize;\n\theight: 7px;\n\twidth: 100%;\n\tbottom: -5px;\n\tleft: 0;\n}\n.ui-resizable-e {\n\tcursor: e-resize;\n\twidth: 7px;\n\tright: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n.ui-resizable-w {\n\tcursor: w-resize;\n\twidth: 7px;\n\tleft: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n.ui-resizable-se {\n\tcursor: se-resize;\n\twidth: 12px;\n\theight: 12px;\n\tright: 1px;\n\tbottom: 1px;\n}\n.ui-resizable-sw {\n\tcursor: sw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\tbottom: -5px;\n}\n.ui-resizable-nw {\n\tcursor: nw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\ttop: -5px;\n}\n.ui-resizable-ne {\n\tcursor: ne-resize;\n\twidth: 9px;\n\theight: 9px;\n\tright: -5px;\n\ttop: -5px;\n}\n.ui-progressbar {\n\theight: 2em;\n\ttext-align: left;\n\toverflow: hidden;\n}\n.ui-progressbar .ui-progressbar-value {\n\tmargin: -1px;\n\theight: 100%;\n}\n.ui-progressbar .ui-progressbar-overlay {\n\tbackground: url(\"data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==\");\n\theight: 100%;\n\tfilter: alpha(opacity=25); /* support: IE8 */\n\topacity: 0.25;\n}\n.ui-progressbar-indeterminate .ui-progressbar-value {\n\tbackground-image: none;\n}\n.ui-selectable {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-selectable-helper {\n\tposition: absolute;\n\tz-index: 100;\n\tborder: 1px dotted black;\n}\n.ui-selectmenu-menu {\n\tpadding: 0;\n\tmargin: 0;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tdisplay: none;\n}\n.ui-selectmenu-menu .ui-menu {\n\toverflow: auto;\n\toverflow-x: hidden;\n\tpadding-bottom: 1px;\n}\n.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {\n\tfont-size: 1em;\n\tfont-weight: bold;\n\tline-height: 1.5;\n\tpadding: 2px 0.4em;\n\tmargin: 0.5em 0 0 0;\n\theight: auto;\n\tborder: 0;\n}\n.ui-selectmenu-open {\n\tdisplay: block;\n}\n.ui-selectmenu-text {\n\tdisplay: block;\n\tmargin-right: 20px;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n.ui-selectmenu-button.ui-button {\n\ttext-align: left;\n\twhite-space: nowrap;\n\twidth: 14em;\n}\n.ui-selectmenu-icon.ui-icon {\n\tfloat: right;\n\tmargin-top: 0;\n}\n.ui-slider {\n\tposition: relative;\n\ttext-align: left;\n}\n.ui-slider .ui-slider-handle {\n\tposition: absolute;\n\tz-index: 2;\n\twidth: 1.2em;\n\theight: 1.2em;\n\tcursor: default;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-slider .ui-slider-range {\n\tposition: absolute;\n\tz-index: 1;\n\tfont-size: .7em;\n\tdisplay: block;\n\tborder: 0;\n\tbackground-position: 0 0;\n}\n\n/* support: IE8 - See #6727 */\n.ui-slider.ui-state-disabled .ui-slider-handle,\n.ui-slider.ui-state-disabled .ui-slider-range {\n\tfilter: inherit;\n}\n\n.ui-slider-horizontal {\n\theight: .8em;\n}\n.ui-slider-horizontal .ui-slider-handle {\n\ttop: -.3em;\n\tmargin-left: -.6em;\n}\n.ui-slider-horizontal .ui-slider-range {\n\ttop: 0;\n\theight: 100%;\n}\n.ui-slider-horizontal .ui-slider-range-min {\n\tleft: 0;\n}\n.ui-slider-horizontal .ui-slider-range-max {\n\tright: 0;\n}\n\n.ui-slider-vertical {\n\twidth: .8em;\n\theight: 100px;\n}\n.ui-slider-vertical .ui-slider-handle {\n\tleft: -.3em;\n\tmargin-left: 0;\n\tmargin-bottom: -.6em;\n}\n.ui-slider-vertical .ui-slider-range {\n\tleft: 0;\n\twidth: 100%;\n}\n.ui-slider-vertical .ui-slider-range-min {\n\tbottom: 0;\n}\n.ui-slider-vertical .ui-slider-range-max {\n\ttop: 0;\n}\n.ui-sortable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-spinner {\n\tposition: relative;\n\tdisplay: inline-block;\n\toverflow: hidden;\n\tpadding: 0;\n\tvertical-align: middle;\n}\n.ui-spinner-input {\n\tborder: none;\n\tbackground: none;\n\tcolor: inherit;\n\tpadding: .222em 0;\n\tmargin: .2em 0;\n\tvertical-align: middle;\n\tmargin-left: .4em;\n\tmargin-right: 2em;\n}\n.ui-spinner-button {\n\twidth: 1.6em;\n\theight: 50%;\n\tfont-size: .5em;\n\tpadding: 0;\n\tmargin: 0;\n\ttext-align: center;\n\tposition: absolute;\n\tcursor: default;\n\tdisplay: block;\n\toverflow: hidden;\n\tright: 0;\n}\n/* more specificity required here to override default borders */\n.ui-spinner a.ui-spinner-button {\n\tborder-top-style: none;\n\tborder-bottom-style: none;\n\tborder-right-style: none;\n}\n.ui-spinner-up {\n\ttop: 0;\n}\n.ui-spinner-down {\n\tbottom: 0;\n}\n.ui-tabs {\n\tposition: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as \"fixed\") */\n\tpadding: .2em;\n}\n.ui-tabs .ui-tabs-nav {\n\tmargin: 0;\n\tpadding: .2em .2em 0;\n}\n.ui-tabs .ui-tabs-nav li {\n\tlist-style: none;\n\tfloat: left;\n\tposition: relative;\n\ttop: 0;\n\tmargin: 1px .2em 0 0;\n\tborder-bottom-width: 0;\n\tpadding: 0;\n\twhite-space: nowrap;\n}\n.ui-tabs .ui-tabs-nav .ui-tabs-anchor {\n\tfloat: left;\n\tpadding: .5em 1em;\n\ttext-decoration: none;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-active {\n\tmargin-bottom: -1px;\n\tpadding-bottom: 1px;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,\n.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,\n.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {\n\tcursor: text;\n}\n.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {\n\tcursor: pointer;\n}\n.ui-tabs .ui-tabs-panel {\n\tdisplay: block;\n\tborder-width: 0;\n\tpadding: 1em 1.4em;\n\tbackground: none;\n}\n.ui-tooltip {\n\tpadding: 8px;\n\tposition: absolute;\n\tz-index: 9999;\n\tmax-width: 300px;\n}\nbody .ui-tooltip {\n\tborder-width: 2px;\n}\n/* Component containers\n----------------------------------*/\n.ui-widget {\n\tfont-family: Verdana,Arial,sans-serif;\n\tfont-size: 1.1em;\n}\n.ui-widget .ui-widget {\n\tfont-size: 1em;\n}\n.ui-widget input,\n.ui-widget select,\n.ui-widget textarea,\n.ui-widget button {\n\tfont-family: Verdana,Arial,sans-serif;\n\tfont-size: 1em;\n}\n.ui-widget.ui-widget-content {\n\tborder: 1px solid #77d5f7;\n}\n.ui-widget-content {\n\tborder: 1px solid #a6c9e2;\n\tbackground: #fcfdfd url(\"images/ui-bg_inset-hard_100_fcfdfd_1x100.png\") 50% bottom repeat-x;\n\tcolor: #222222;\n}\n.ui-widget-content a {\n\tcolor: #222222;\n}\n.ui-widget-header {\n\tborder: 1px solid #4297d7;\n\tbackground: #2191c0 url(\"images/ui-bg_gloss-wave_75_2191c0_500x100.png\") 50% 50% repeat-x;\n\tcolor: #eaf5f7;\n\tfont-weight: bold;\n}\n.ui-widget-header a {\n\tcolor: #eaf5f7;\n}\n\n/* Interaction states\n----------------------------------*/\n.ui-state-default,\n.ui-widget-content .ui-state-default,\n.ui-widget-header .ui-state-default,\n.ui-button,\n\n/* We use html here because we need a greater specificity to make sure disabled\nworks properly when clicked or hovered */\nhtml .ui-button.ui-state-disabled:hover,\nhtml .ui-button.ui-state-disabled:active {\n\tborder: 1px solid #77d5f7;\n\tbackground: #0078ae url(\"images/ui-bg_glass_45_0078ae_1x400.png\") 50% 50% repeat-x;\n\tfont-weight: normal;\n\tcolor: #ffffff;\n}\n.ui-state-default a,\n.ui-state-default a:link,\n.ui-state-default a:visited,\na.ui-button,\na:link.ui-button,\na:visited.ui-button,\n.ui-button {\n\tcolor: #ffffff;\n\ttext-decoration: none;\n}\n.ui-state-hover,\n.ui-widget-content .ui-state-hover,\n.ui-widget-header .ui-state-hover,\n.ui-state-focus,\n.ui-widget-content .ui-state-focus,\n.ui-widget-header .ui-state-focus,\n.ui-button:hover,\n.ui-button:focus {\n\tborder: 1px solid #448dae;\n\tbackground: #79c9ec url(\"images/ui-bg_glass_75_79c9ec_1x400.png\") 50% 50% repeat-x;\n\tfont-weight: normal;\n\tcolor: #026890;\n}\n.ui-state-hover a,\n.ui-state-hover a:hover,\n.ui-state-hover a:link,\n.ui-state-hover a:visited,\n.ui-state-focus a,\n.ui-state-focus a:hover,\n.ui-state-focus a:link,\n.ui-state-focus a:visited,\na.ui-button:hover,\na.ui-button:focus {\n\tcolor: #026890;\n\ttext-decoration: none;\n}\n\n.ui-visual-focus {\n\tbox-shadow: 0 0 3px 1px rgb(94, 158, 214);\n}\n.ui-state-active,\n.ui-widget-content .ui-state-active,\n.ui-widget-header .ui-state-active,\na.ui-button:active,\n.ui-button:active,\n.ui-button.ui-state-active:hover {\n\tborder: 1px solid #acdd4a;\n\tbackground: #6eac2c url(\"images/ui-bg_gloss-wave_50_6eac2c_500x100.png\") 50% 50% repeat-x;\n\tfont-weight: normal;\n\tcolor: #ffffff;\n}\n.ui-icon-background,\n.ui-state-active .ui-icon-background {\n\tborder: #acdd4a;\n\tbackground-color: #ffffff;\n}\n.ui-state-active a,\n.ui-state-active a:link,\n.ui-state-active a:visited {\n\tcolor: #ffffff;\n\ttext-decoration: none;\n}\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-highlight,\n.ui-widget-content .ui-state-highlight,\n.ui-widget-header .ui-state-highlight {\n\tborder: 1px solid #fcd113;\n\tbackground: #f8da4e url(\"images/ui-bg_glass_55_f8da4e_1x400.png\") 50% 50% repeat-x;\n\tcolor: #915608;\n}\n.ui-state-checked {\n\tborder: 1px solid #fcd113;\n\tbackground: #f8da4e;\n}\n.ui-state-highlight a,\n.ui-widget-content .ui-state-highlight a,\n.ui-widget-header .ui-state-highlight a {\n\tcolor: #915608;\n}\n.ui-state-error,\n.ui-widget-content .ui-state-error,\n.ui-widget-header .ui-state-error {\n\tborder: 1px solid #cd0a0a;\n\tbackground: #e14f1c url(\"images/ui-bg_gloss-wave_45_e14f1c_500x100.png\") 50% top repeat-x;\n\tcolor: #ffffff;\n}\n.ui-state-error a,\n.ui-widget-content .ui-state-error a,\n.ui-widget-header .ui-state-error a {\n\tcolor: #ffffff;\n}\n.ui-state-error-text,\n.ui-widget-content .ui-state-error-text,\n.ui-widget-header .ui-state-error-text {\n\tcolor: #ffffff;\n}\n.ui-priority-primary,\n.ui-widget-content .ui-priority-primary,\n.ui-widget-header .ui-priority-primary {\n\tfont-weight: bold;\n}\n.ui-priority-secondary,\n.ui-widget-content .ui-priority-secondary,\n.ui-widget-header .ui-priority-secondary {\n\topacity: .7;\n\tfilter:Alpha(Opacity=70); /* support: IE8 */\n\tfont-weight: normal;\n}\n.ui-state-disabled,\n.ui-widget-content .ui-state-disabled,\n.ui-widget-header .ui-state-disabled {\n\topacity: .35;\n\tfilter:Alpha(Opacity=35); /* support: IE8 */\n\tbackground-image: none;\n}\n.ui-state-disabled .ui-icon {\n\tfilter:Alpha(Opacity=35); /* support: IE8 - See #6059 */\n}\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon {\n\twidth: 16px;\n\theight: 16px;\n}\n.ui-icon,\n.ui-widget-content .ui-icon {\n\tbackground-image: url(\"images/ui-icons_0078ae_256x240.png\");\n}\n.ui-widget-header .ui-icon {\n\tbackground-image: url(\"images/ui-icons_d8e7f3_256x240.png\");\n}\n.ui-state-hover .ui-icon,\n.ui-state-focus .ui-icon,\n.ui-button:hover .ui-icon,\n.ui-button:focus .ui-icon {\n\tbackground-image: url(\"images/ui-icons_056b93_256x240.png\");\n}\n.ui-state-active .ui-icon,\n.ui-button:active .ui-icon {\n\tbackground-image: url(\"images/ui-icons_f5e175_256x240.png\");\n}\n.ui-state-highlight .ui-icon,\n.ui-button .ui-state-highlight.ui-icon {\n\tbackground-image: url(\"images/ui-icons_f7a50d_256x240.png\");\n}\n.ui-state-error .ui-icon,\n.ui-state-error-text .ui-icon {\n\tbackground-image: url(\"images/ui-icons_fcd113_256x240.png\");\n}\n.ui-button .ui-icon {\n\tbackground-image: url(\"images/ui-icons_e0fdff_256x240.png\");\n}\n\n/* positioning */\n.ui-icon-blank { background-position: 16px 16px; }\n.ui-icon-caret-1-n { background-position: 0 0; }\n.ui-icon-caret-1-ne { background-position: -16px 0; }\n.ui-icon-caret-1-e { background-position: -32px 0; }\n.ui-icon-caret-1-se { background-position: -48px 0; }\n.ui-icon-caret-1-s { background-position: -65px 0; }\n.ui-icon-caret-1-sw { background-position: -80px 0; }\n.ui-icon-caret-1-w { background-position: -96px 0; }\n.ui-icon-caret-1-nw { background-position: -112px 0; }\n.ui-icon-caret-2-n-s { background-position: -128px 0; }\n.ui-icon-caret-2-e-w { background-position: -144px 0; }\n.ui-icon-triangle-1-n { background-position: 0 -16px; }\n.ui-icon-triangle-1-ne { background-position: -16px -16px; }\n.ui-icon-triangle-1-e { background-position: -32px -16px; }\n.ui-icon-triangle-1-se { background-position: -48px -16px; }\n.ui-icon-triangle-1-s { background-position: -65px -16px; }\n.ui-icon-triangle-1-sw { background-position: -80px -16px; }\n.ui-icon-triangle-1-w { background-position: -96px -16px; }\n.ui-icon-triangle-1-nw { background-position: -112px -16px; }\n.ui-icon-triangle-2-n-s { background-position: -128px -16px; }\n.ui-icon-triangle-2-e-w { background-position: -144px -16px; }\n.ui-icon-arrow-1-n { background-position: 0 -32px; }\n.ui-icon-arrow-1-ne { background-position: -16px -32px; }\n.ui-icon-arrow-1-e { background-position: -32px -32px; }\n.ui-icon-arrow-1-se { background-position: -48px -32px; }\n.ui-icon-arrow-1-s { background-position: -65px -32px; }\n.ui-icon-arrow-1-sw { background-position: -80px -32px; }\n.ui-icon-arrow-1-w { background-position: -96px -32px; }\n.ui-icon-arrow-1-nw { background-position: -112px -32px; }\n.ui-icon-arrow-2-n-s { background-position: -128px -32px; }\n.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }\n.ui-icon-arrow-2-e-w { background-position: -160px -32px; }\n.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }\n.ui-icon-arrowstop-1-n { background-position: -192px -32px; }\n.ui-icon-arrowstop-1-e { background-position: -208px -32px; }\n.ui-icon-arrowstop-1-s { background-position: -224px -32px; }\n.ui-icon-arrowstop-1-w { background-position: -240px -32px; }\n.ui-icon-arrowthick-1-n { background-position: 1px -48px; }\n.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }\n.ui-icon-arrowthick-1-e { background-position: -32px -48px; }\n.ui-icon-arrowthick-1-se { background-position: -48px -48px; }\n.ui-icon-arrowthick-1-s { background-position: -64px -48px; }\n.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }\n.ui-icon-arrowthick-1-w { background-position: -96px -48px; }\n.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }\n.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }\n.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }\n.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }\n.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }\n.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }\n.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }\n.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }\n.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }\n.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }\n.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }\n.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }\n.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }\n.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }\n.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }\n.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }\n.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }\n.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }\n.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }\n.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }\n.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }\n.ui-icon-arrow-4 { background-position: 0 -80px; }\n.ui-icon-arrow-4-diag { background-position: -16px -80px; }\n.ui-icon-extlink { background-position: -32px -80px; }\n.ui-icon-newwin { background-position: -48px -80px; }\n.ui-icon-refresh { background-position: -64px -80px; }\n.ui-icon-shuffle { background-position: -80px -80px; }\n.ui-icon-transfer-e-w { background-position: -96px -80px; }\n.ui-icon-transferthick-e-w { background-position: -112px -80px; }\n.ui-icon-folder-collapsed { background-position: 0 -96px; }\n.ui-icon-folder-open { background-position: -16px -96px; }\n.ui-icon-document { background-position: -32px -96px; }\n.ui-icon-document-b { background-position: -48px -96px; }\n.ui-icon-note { background-position: -64px -96px; }\n.ui-icon-mail-closed { background-position: -80px -96px; }\n.ui-icon-mail-open { background-position: -96px -96px; }\n.ui-icon-suitcase { background-position: -112px -96px; }\n.ui-icon-comment { background-position: -128px -96px; }\n.ui-icon-person { background-position: -144px -96px; }\n.ui-icon-print { background-position: -160px -96px; }\n.ui-icon-trash { background-position: -176px -96px; }\n.ui-icon-locked { background-position: -192px -96px; }\n.ui-icon-unlocked { background-position: -208px -96px; }\n.ui-icon-bookmark { background-position: -224px -96px; }\n.ui-icon-tag { background-position: -240px -96px; }\n.ui-icon-home { background-position: 0 -112px; }\n.ui-icon-flag { background-position: -16px -112px; }\n.ui-icon-calendar { background-position: -32px -112px; }\n.ui-icon-cart { background-position: -48px -112px; }\n.ui-icon-pencil { background-position: -64px -112px; }\n.ui-icon-clock { background-position: -80px -112px; }\n.ui-icon-disk { background-position: -96px -112px; }\n.ui-icon-calculator { background-position: -112px -112px; }\n.ui-icon-zoomin { background-position: -128px -112px; }\n.ui-icon-zoomout { background-position: -144px -112px; }\n.ui-icon-search { background-position: -160px -112px; }\n.ui-icon-wrench { background-position: -176px -112px; }\n.ui-icon-gear { background-position: -192px -112px; }\n.ui-icon-heart { background-position: -208px -112px; }\n.ui-icon-star { background-position: -224px -112px; }\n.ui-icon-link { background-position: -240px -112px; }\n.ui-icon-cancel { background-position: 0 -128px; }\n.ui-icon-plus { background-position: -16px -128px; }\n.ui-icon-plusthick { background-position: -32px -128px; }\n.ui-icon-minus { background-position: -48px -128px; }\n.ui-icon-minusthick { background-position: -64px -128px; }\n.ui-icon-close { background-position: -80px -128px; }\n.ui-icon-closethick { background-position: -96px -128px; }\n.ui-icon-key { background-position: -112px -128px; }\n.ui-icon-lightbulb { background-position: -128px -128px; }\n.ui-icon-scissors { background-position: -144px -128px; }\n.ui-icon-clipboard { background-position: -160px -128px; }\n.ui-icon-copy { background-position: -176px -128px; }\n.ui-icon-contact { background-position: -192px -128px; }\n.ui-icon-image { background-position: -208px -128px; }\n.ui-icon-video { background-position: -224px -128px; }\n.ui-icon-script { background-position: -240px -128px; }\n.ui-icon-alert { background-position: 0 -144px; }\n.ui-icon-info { background-position: -16px -144px; }\n.ui-icon-notice { background-position: -32px -144px; }\n.ui-icon-help { background-position: -48px -144px; }\n.ui-icon-check { background-position: -64px -144px; }\n.ui-icon-bullet { background-position: -80px -144px; }\n.ui-icon-radio-on { background-position: -96px -144px; }\n.ui-icon-radio-off { background-position: -112px -144px; }\n.ui-icon-pin-w { background-position: -128px -144px; }\n.ui-icon-pin-s { background-position: -144px -144px; }\n.ui-icon-play { background-position: 0 -160px; }\n.ui-icon-pause { background-position: -16px -160px; }\n.ui-icon-seek-next { background-position: -32px -160px; }\n.ui-icon-seek-prev { background-position: -48px -160px; }\n.ui-icon-seek-end { background-position: -64px -160px; }\n.ui-icon-seek-start { background-position: -80px -160px; }\n/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */\n.ui-icon-seek-first { background-position: -80px -160px; }\n.ui-icon-stop { background-position: -96px -160px; }\n.ui-icon-eject { background-position: -112px -160px; }\n.ui-icon-volume-off { background-position: -128px -160px; }\n.ui-icon-volume-on { background-position: -144px -160px; }\n.ui-icon-power { background-position: 0 -176px; }\n.ui-icon-signal-diag { background-position: -16px -176px; }\n.ui-icon-signal { background-position: -32px -176px; }\n.ui-icon-battery-0 { background-position: -48px -176px; }\n.ui-icon-battery-1 { background-position: -64px -176px; }\n.ui-icon-battery-2 { background-position: -80px -176px; }\n.ui-icon-battery-3 { background-position: -96px -176px; }\n.ui-icon-circle-plus { background-position: 0 -192px; }\n.ui-icon-circle-minus { background-position: -16px -192px; }\n.ui-icon-circle-close { background-position: -32px -192px; }\n.ui-icon-circle-triangle-e { background-position: -48px -192px; }\n.ui-icon-circle-triangle-s { background-position: -64px -192px; }\n.ui-icon-circle-triangle-w { background-position: -80px -192px; }\n.ui-icon-circle-triangle-n { background-position: -96px -192px; }\n.ui-icon-circle-arrow-e { background-position: -112px -192px; }\n.ui-icon-circle-arrow-s { background-position: -128px -192px; }\n.ui-icon-circle-arrow-w { background-position: -144px -192px; }\n.ui-icon-circle-arrow-n { background-position: -160px -192px; }\n.ui-icon-circle-zoomin { background-position: -176px -192px; }\n.ui-icon-circle-zoomout { background-position: -192px -192px; }\n.ui-icon-circle-check { background-position: -208px -192px; }\n.ui-icon-circlesmall-plus { background-position: 0 -208px; }\n.ui-icon-circlesmall-minus { background-position: -16px -208px; }\n.ui-icon-circlesmall-close { background-position: -32px -208px; }\n.ui-icon-squaresmall-plus { background-position: -48px -208px; }\n.ui-icon-squaresmall-minus { background-position: -64px -208px; }\n.ui-icon-squaresmall-close { background-position: -80px -208px; }\n.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }\n.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }\n.ui-icon-grip-solid-vertical { background-position: -32px -224px; }\n.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }\n.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }\n.ui-icon-grip-diagonal-se { background-position: -80px -224px; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Corner radius */\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-left,\n.ui-corner-tl {\n\tborder-top-left-radius: 5px;\n}\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-right,\n.ui-corner-tr {\n\tborder-top-right-radius: 5px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-left,\n.ui-corner-bl {\n\tborder-bottom-left-radius: 5px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-right,\n.ui-corner-br {\n\tborder-bottom-right-radius: 5px;\n}\n\n/* Overlays */\n.ui-widget-overlay {\n\tbackground: #aaaaaa;\n\topacity: .3;\n\tfilter: Alpha(Opacity=30); /* support: IE8 */\n}\n.ui-widget-shadow {\n\t-webkit-box-shadow: 5px 5px 0px #999999;\n\tbox-shadow: 5px 5px 0px #999999;\n}\n"
  },
  {
    "path": "pages/include/jquery_ui/themes/start/theme.css",
    "content": "/*!\n * jQuery UI CSS Framework 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/theming/\n *\n * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=2191c0&bgTextureHeader=gloss_wave&bgImgOpacityHeader=75&borderColorHeader=4297d7&fcHeader=eaf5f7&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=0078ae&bgColorDefault=0078ae&bgTextureDefault=glass&bgImgOpacityDefault=45&borderColorDefault=77d5f7&fcDefault=ffffff&iconColorDefault=e0fdff&bgColorHover=79c9ec&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=448dae&fcHover=026890&iconColorHover=056b93&bgColorActive=6eac2c&bgTextureActive=gloss_wave&bgImgOpacityActive=50&borderColorActive=acdd4a&fcActive=ffffff&iconColorActive=f5e175&bgColorHighlight=f8da4e&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcd113&fcHighlight=915608&iconColorHighlight=f7a50d&bgColorError=e14f1c&bgTextureError=gloss_wave&bgImgOpacityError=45&borderColorError=cd0a0a&fcError=ffffff&iconColorError=fcd113&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=75&opacityOverlay=30&bgColorShadow=999999&bgTextureShadow=flat&bgImgOpacityShadow=55&opacityShadow=45&thicknessShadow=0px&offsetTopShadow=5px&offsetLeftShadow=5px&cornerRadiusShadow=5px\n */\n\n\n/* Component containers\n----------------------------------*/\n.ui-widget {\n\tfont-family: Verdana,Arial,sans-serif;\n\tfont-size: 1.1em;\n}\n.ui-widget .ui-widget {\n\tfont-size: 1em;\n}\n.ui-widget input,\n.ui-widget select,\n.ui-widget textarea,\n.ui-widget button {\n\tfont-family: Verdana,Arial,sans-serif;\n\tfont-size: 1em;\n}\n.ui-widget.ui-widget-content {\n\tborder: 1px solid #77d5f7;\n}\n.ui-widget-content {\n\tborder: 1px solid #a6c9e2;\n\tbackground: #fcfdfd url(\"images/ui-bg_inset-hard_100_fcfdfd_1x100.png\") 50% bottom repeat-x;\n\tcolor: #222222;\n}\n.ui-widget-content a {\n\tcolor: #222222;\n}\n.ui-widget-header {\n\tborder: 1px solid #4297d7;\n\tbackground: #2191c0 url(\"images/ui-bg_gloss-wave_75_2191c0_500x100.png\") 50% 50% repeat-x;\n\tcolor: #eaf5f7;\n\tfont-weight: bold;\n}\n.ui-widget-header a {\n\tcolor: #eaf5f7;\n}\n\n/* Interaction states\n----------------------------------*/\n.ui-state-default,\n.ui-widget-content .ui-state-default,\n.ui-widget-header .ui-state-default,\n.ui-button,\n\n/* We use html here because we need a greater specificity to make sure disabled\nworks properly when clicked or hovered */\nhtml .ui-button.ui-state-disabled:hover,\nhtml .ui-button.ui-state-disabled:active {\n\tborder: 1px solid #77d5f7;\n\tbackground: #0078ae url(\"images/ui-bg_glass_45_0078ae_1x400.png\") 50% 50% repeat-x;\n\tfont-weight: normal;\n\tcolor: #ffffff;\n}\n.ui-state-default a,\n.ui-state-default a:link,\n.ui-state-default a:visited,\na.ui-button,\na:link.ui-button,\na:visited.ui-button,\n.ui-button {\n\tcolor: #ffffff;\n\ttext-decoration: none;\n}\n.ui-state-hover,\n.ui-widget-content .ui-state-hover,\n.ui-widget-header .ui-state-hover,\n.ui-state-focus,\n.ui-widget-content .ui-state-focus,\n.ui-widget-header .ui-state-focus,\n.ui-button:hover,\n.ui-button:focus {\n\tborder: 1px solid #448dae;\n\tbackground: #79c9ec url(\"images/ui-bg_glass_75_79c9ec_1x400.png\") 50% 50% repeat-x;\n\tfont-weight: normal;\n\tcolor: #026890;\n}\n.ui-state-hover a,\n.ui-state-hover a:hover,\n.ui-state-hover a:link,\n.ui-state-hover a:visited,\n.ui-state-focus a,\n.ui-state-focus a:hover,\n.ui-state-focus a:link,\n.ui-state-focus a:visited,\na.ui-button:hover,\na.ui-button:focus {\n\tcolor: #026890;\n\ttext-decoration: none;\n}\n\n.ui-visual-focus {\n\tbox-shadow: 0 0 3px 1px rgb(94, 158, 214);\n}\n.ui-state-active,\n.ui-widget-content .ui-state-active,\n.ui-widget-header .ui-state-active,\na.ui-button:active,\n.ui-button:active,\n.ui-button.ui-state-active:hover {\n\tborder: 1px solid #acdd4a;\n\tbackground: #6eac2c url(\"images/ui-bg_gloss-wave_50_6eac2c_500x100.png\") 50% 50% repeat-x;\n\tfont-weight: normal;\n\tcolor: #ffffff;\n}\n.ui-icon-background,\n.ui-state-active .ui-icon-background {\n\tborder: #acdd4a;\n\tbackground-color: #ffffff;\n}\n.ui-state-active a,\n.ui-state-active a:link,\n.ui-state-active a:visited {\n\tcolor: #ffffff;\n\ttext-decoration: none;\n}\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-highlight,\n.ui-widget-content .ui-state-highlight,\n.ui-widget-header .ui-state-highlight {\n\tborder: 1px solid #fcd113;\n\tbackground: #f8da4e url(\"images/ui-bg_glass_55_f8da4e_1x400.png\") 50% 50% repeat-x;\n\tcolor: #915608;\n}\n.ui-state-checked {\n\tborder: 1px solid #fcd113;\n\tbackground: #f8da4e;\n}\n.ui-state-highlight a,\n.ui-widget-content .ui-state-highlight a,\n.ui-widget-header .ui-state-highlight a {\n\tcolor: #915608;\n}\n.ui-state-error,\n.ui-widget-content .ui-state-error,\n.ui-widget-header .ui-state-error {\n\tborder: 1px solid #cd0a0a;\n\tbackground: #e14f1c url(\"images/ui-bg_gloss-wave_45_e14f1c_500x100.png\") 50% top repeat-x;\n\tcolor: #ffffff;\n}\n.ui-state-error a,\n.ui-widget-content .ui-state-error a,\n.ui-widget-header .ui-state-error a {\n\tcolor: #ffffff;\n}\n.ui-state-error-text,\n.ui-widget-content .ui-state-error-text,\n.ui-widget-header .ui-state-error-text {\n\tcolor: #ffffff;\n}\n.ui-priority-primary,\n.ui-widget-content .ui-priority-primary,\n.ui-widget-header .ui-priority-primary {\n\tfont-weight: bold;\n}\n.ui-priority-secondary,\n.ui-widget-content .ui-priority-secondary,\n.ui-widget-header .ui-priority-secondary {\n\topacity: .7;\n\tfilter:Alpha(Opacity=70); /* support: IE8 */\n\tfont-weight: normal;\n}\n.ui-state-disabled,\n.ui-widget-content .ui-state-disabled,\n.ui-widget-header .ui-state-disabled {\n\topacity: .35;\n\tfilter:Alpha(Opacity=35); /* support: IE8 */\n\tbackground-image: none;\n}\n.ui-state-disabled .ui-icon {\n\tfilter:Alpha(Opacity=35); /* support: IE8 - See #6059 */\n}\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon {\n\twidth: 16px;\n\theight: 16px;\n}\n.ui-icon,\n.ui-widget-content .ui-icon {\n\tbackground-image: url(\"images/ui-icons_0078ae_256x240.png\");\n}\n.ui-widget-header .ui-icon {\n\tbackground-image: url(\"images/ui-icons_d8e7f3_256x240.png\");\n}\n.ui-state-hover .ui-icon,\n.ui-state-focus .ui-icon,\n.ui-button:hover .ui-icon,\n.ui-button:focus .ui-icon {\n\tbackground-image: url(\"images/ui-icons_056b93_256x240.png\");\n}\n.ui-state-active .ui-icon,\n.ui-button:active .ui-icon {\n\tbackground-image: url(\"images/ui-icons_f5e175_256x240.png\");\n}\n.ui-state-highlight .ui-icon,\n.ui-button .ui-state-highlight.ui-icon {\n\tbackground-image: url(\"images/ui-icons_f7a50d_256x240.png\");\n}\n.ui-state-error .ui-icon,\n.ui-state-error-text .ui-icon {\n\tbackground-image: url(\"images/ui-icons_fcd113_256x240.png\");\n}\n.ui-button .ui-icon {\n\tbackground-image: url(\"images/ui-icons_e0fdff_256x240.png\");\n}\n\n/* positioning */\n.ui-icon-blank { background-position: 16px 16px; }\n.ui-icon-caret-1-n { background-position: 0 0; }\n.ui-icon-caret-1-ne { background-position: -16px 0; }\n.ui-icon-caret-1-e { background-position: -32px 0; }\n.ui-icon-caret-1-se { background-position: -48px 0; }\n.ui-icon-caret-1-s { background-position: -65px 0; }\n.ui-icon-caret-1-sw { background-position: -80px 0; }\n.ui-icon-caret-1-w { background-position: -96px 0; }\n.ui-icon-caret-1-nw { background-position: -112px 0; }\n.ui-icon-caret-2-n-s { background-position: -128px 0; }\n.ui-icon-caret-2-e-w { background-position: -144px 0; }\n.ui-icon-triangle-1-n { background-position: 0 -16px; }\n.ui-icon-triangle-1-ne { background-position: -16px -16px; }\n.ui-icon-triangle-1-e { background-position: -32px -16px; }\n.ui-icon-triangle-1-se { background-position: -48px -16px; }\n.ui-icon-triangle-1-s { background-position: -65px -16px; }\n.ui-icon-triangle-1-sw { background-position: -80px -16px; }\n.ui-icon-triangle-1-w { background-position: -96px -16px; }\n.ui-icon-triangle-1-nw { background-position: -112px -16px; }\n.ui-icon-triangle-2-n-s { background-position: -128px -16px; }\n.ui-icon-triangle-2-e-w { background-position: -144px -16px; }\n.ui-icon-arrow-1-n { background-position: 0 -32px; }\n.ui-icon-arrow-1-ne { background-position: -16px -32px; }\n.ui-icon-arrow-1-e { background-position: -32px -32px; }\n.ui-icon-arrow-1-se { background-position: -48px -32px; }\n.ui-icon-arrow-1-s { background-position: -65px -32px; }\n.ui-icon-arrow-1-sw { background-position: -80px -32px; }\n.ui-icon-arrow-1-w { background-position: -96px -32px; }\n.ui-icon-arrow-1-nw { background-position: -112px -32px; }\n.ui-icon-arrow-2-n-s { background-position: -128px -32px; }\n.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }\n.ui-icon-arrow-2-e-w { background-position: -160px -32px; }\n.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }\n.ui-icon-arrowstop-1-n { background-position: -192px -32px; }\n.ui-icon-arrowstop-1-e { background-position: -208px -32px; }\n.ui-icon-arrowstop-1-s { background-position: -224px -32px; }\n.ui-icon-arrowstop-1-w { background-position: -240px -32px; }\n.ui-icon-arrowthick-1-n { background-position: 1px -48px; }\n.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }\n.ui-icon-arrowthick-1-e { background-position: -32px -48px; }\n.ui-icon-arrowthick-1-se { background-position: -48px -48px; }\n.ui-icon-arrowthick-1-s { background-position: -64px -48px; }\n.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }\n.ui-icon-arrowthick-1-w { background-position: -96px -48px; }\n.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }\n.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }\n.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }\n.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }\n.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }\n.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }\n.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }\n.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }\n.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }\n.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }\n.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }\n.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }\n.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }\n.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }\n.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }\n.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }\n.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }\n.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }\n.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }\n.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }\n.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }\n.ui-icon-arrow-4 { background-position: 0 -80px; }\n.ui-icon-arrow-4-diag { background-position: -16px -80px; }\n.ui-icon-extlink { background-position: -32px -80px; }\n.ui-icon-newwin { background-position: -48px -80px; }\n.ui-icon-refresh { background-position: -64px -80px; }\n.ui-icon-shuffle { background-position: -80px -80px; }\n.ui-icon-transfer-e-w { background-position: -96px -80px; }\n.ui-icon-transferthick-e-w { background-position: -112px -80px; }\n.ui-icon-folder-collapsed { background-position: 0 -96px; }\n.ui-icon-folder-open { background-position: -16px -96px; }\n.ui-icon-document { background-position: -32px -96px; }\n.ui-icon-document-b { background-position: -48px -96px; }\n.ui-icon-note { background-position: -64px -96px; }\n.ui-icon-mail-closed { background-position: -80px -96px; }\n.ui-icon-mail-open { background-position: -96px -96px; }\n.ui-icon-suitcase { background-position: -112px -96px; }\n.ui-icon-comment { background-position: -128px -96px; }\n.ui-icon-person { background-position: -144px -96px; }\n.ui-icon-print { background-position: -160px -96px; }\n.ui-icon-trash { background-position: -176px -96px; }\n.ui-icon-locked { background-position: -192px -96px; }\n.ui-icon-unlocked { background-position: -208px -96px; }\n.ui-icon-bookmark { background-position: -224px -96px; }\n.ui-icon-tag { background-position: -240px -96px; }\n.ui-icon-home { background-position: 0 -112px; }\n.ui-icon-flag { background-position: -16px -112px; }\n.ui-icon-calendar { background-position: -32px -112px; }\n.ui-icon-cart { background-position: -48px -112px; }\n.ui-icon-pencil { background-position: -64px -112px; }\n.ui-icon-clock { background-position: -80px -112px; }\n.ui-icon-disk { background-position: -96px -112px; }\n.ui-icon-calculator { background-position: -112px -112px; }\n.ui-icon-zoomin { background-position: -128px -112px; }\n.ui-icon-zoomout { background-position: -144px -112px; }\n.ui-icon-search { background-position: -160px -112px; }\n.ui-icon-wrench { background-position: -176px -112px; }\n.ui-icon-gear { background-position: -192px -112px; }\n.ui-icon-heart { background-position: -208px -112px; }\n.ui-icon-star { background-position: -224px -112px; }\n.ui-icon-link { background-position: -240px -112px; }\n.ui-icon-cancel { background-position: 0 -128px; }\n.ui-icon-plus { background-position: -16px -128px; }\n.ui-icon-plusthick { background-position: -32px -128px; }\n.ui-icon-minus { background-position: -48px -128px; }\n.ui-icon-minusthick { background-position: -64px -128px; }\n.ui-icon-close { background-position: -80px -128px; }\n.ui-icon-closethick { background-position: -96px -128px; }\n.ui-icon-key { background-position: -112px -128px; }\n.ui-icon-lightbulb { background-position: -128px -128px; }\n.ui-icon-scissors { background-position: -144px -128px; }\n.ui-icon-clipboard { background-position: -160px -128px; }\n.ui-icon-copy { background-position: -176px -128px; }\n.ui-icon-contact { background-position: -192px -128px; }\n.ui-icon-image { background-position: -208px -128px; }\n.ui-icon-video { background-position: -224px -128px; }\n.ui-icon-script { background-position: -240px -128px; }\n.ui-icon-alert { background-position: 0 -144px; }\n.ui-icon-info { background-position: -16px -144px; }\n.ui-icon-notice { background-position: -32px -144px; }\n.ui-icon-help { background-position: -48px -144px; }\n.ui-icon-check { background-position: -64px -144px; }\n.ui-icon-bullet { background-position: -80px -144px; }\n.ui-icon-radio-on { background-position: -96px -144px; }\n.ui-icon-radio-off { background-position: -112px -144px; }\n.ui-icon-pin-w { background-position: -128px -144px; }\n.ui-icon-pin-s { background-position: -144px -144px; }\n.ui-icon-play { background-position: 0 -160px; }\n.ui-icon-pause { background-position: -16px -160px; }\n.ui-icon-seek-next { background-position: -32px -160px; }\n.ui-icon-seek-prev { background-position: -48px -160px; }\n.ui-icon-seek-end { background-position: -64px -160px; }\n.ui-icon-seek-start { background-position: -80px -160px; }\n/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */\n.ui-icon-seek-first { background-position: -80px -160px; }\n.ui-icon-stop { background-position: -96px -160px; }\n.ui-icon-eject { background-position: -112px -160px; }\n.ui-icon-volume-off { background-position: -128px -160px; }\n.ui-icon-volume-on { background-position: -144px -160px; }\n.ui-icon-power { background-position: 0 -176px; }\n.ui-icon-signal-diag { background-position: -16px -176px; }\n.ui-icon-signal { background-position: -32px -176px; }\n.ui-icon-battery-0 { background-position: -48px -176px; }\n.ui-icon-battery-1 { background-position: -64px -176px; }\n.ui-icon-battery-2 { background-position: -80px -176px; }\n.ui-icon-battery-3 { background-position: -96px -176px; }\n.ui-icon-circle-plus { background-position: 0 -192px; }\n.ui-icon-circle-minus { background-position: -16px -192px; }\n.ui-icon-circle-close { background-position: -32px -192px; }\n.ui-icon-circle-triangle-e { background-position: -48px -192px; }\n.ui-icon-circle-triangle-s { background-position: -64px -192px; }\n.ui-icon-circle-triangle-w { background-position: -80px -192px; }\n.ui-icon-circle-triangle-n { background-position: -96px -192px; }\n.ui-icon-circle-arrow-e { background-position: -112px -192px; }\n.ui-icon-circle-arrow-s { background-position: -128px -192px; }\n.ui-icon-circle-arrow-w { background-position: -144px -192px; }\n.ui-icon-circle-arrow-n { background-position: -160px -192px; }\n.ui-icon-circle-zoomin { background-position: -176px -192px; }\n.ui-icon-circle-zoomout { background-position: -192px -192px; }\n.ui-icon-circle-check { background-position: -208px -192px; }\n.ui-icon-circlesmall-plus { background-position: 0 -208px; }\n.ui-icon-circlesmall-minus { background-position: -16px -208px; }\n.ui-icon-circlesmall-close { background-position: -32px -208px; }\n.ui-icon-squaresmall-plus { background-position: -48px -208px; }\n.ui-icon-squaresmall-minus { background-position: -64px -208px; }\n.ui-icon-squaresmall-close { background-position: -80px -208px; }\n.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }\n.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }\n.ui-icon-grip-solid-vertical { background-position: -32px -224px; }\n.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }\n.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }\n.ui-icon-grip-diagonal-se { background-position: -80px -224px; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Corner radius */\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-left,\n.ui-corner-tl {\n\tborder-top-left-radius: 5px;\n}\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-right,\n.ui-corner-tr {\n\tborder-top-right-radius: 5px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-left,\n.ui-corner-bl {\n\tborder-bottom-left-radius: 5px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-right,\n.ui-corner-br {\n\tborder-bottom-right-radius: 5px;\n}\n\n/* Overlays */\n.ui-widget-overlay {\n\tbackground: #aaaaaa;\n\topacity: .3;\n\tfilter: Alpha(Opacity=30); /* support: IE8 */\n}\n.ui-widget-shadow {\n\t-webkit-box-shadow: 5px 5px 0px #999999;\n\tbox-shadow: 5px 5px 0px #999999;\n}\n"
  },
  {
    "path": "pages/include/officeToHtml/officeToHtml.css",
    "content": "﻿.wbSheets_clas {\n  position: relative;\n  padding: 1em;\n  border: 1px solid #ccc;\n  border-radius: 5px;\n}\n.wbSheets_clas .ui-tabs-nav {\n  position: absolute;\n  left: 0.25em;\n  right: 0.25em;\n  bottom: 0.25em;\n  padding: 0em 0.2em 0.2em;\n}\n.wbSheets_clas .ui-tabs-nav li {\n  border-top: none;\n  border-bottom: 1px solid #ccc;\n  -moz-border-radius: 0px 0px 4px 4px;\n  -webkit-border-radius: 0px 0px 4px 4px;\n  border-radius: 0px 0px 4px 4px;\n}\n.wbSheets_clas .ui-tabs-nav li.ui-tabs-selected,\n.wbSheets_clas .ui-tabs-nav li.ui-state-active {\n  top: -1px;\n}\n.wbSheets_clas_ul {\n  text-align: center;\n  list-style: none;\n  margin: 200px 0 20px;\n  line-height: 35px;\n  height: 37px;\n  overflow: hidden;\n  font-size: 12px;\n  position: absolute;\n  left: 0.25em;\n  right: 0.25em;\n  bottom: 0.25em;\n  padding: 0em 0.2em 0.2em;\n  z-index: 1000;\n}\n\n.wbSheets_clas_ul li {\n  border: 1px solid #aaa;\n  background: #d1d1d1;\n  background: linear-gradient(top, #ececec 50%, #d1d1d1 100%);\n  display: inline-block;\n  position: relative;\n  z-index: 0;\n  border-bottom-left-radius: 6px;\n  border-bottom-right-radius: 6px;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4), inset 0 1px 0 #fff;\n  text-shadow: 0 1px #fff;\n  margin: 0 -5px;\n  padding: 0 30px;\n}\n\n.wbSheets_clas_ul a {\n  color: #555;\n  text-decoration: none;\n}\n\n.wbSheets_clas_ul li.selected {\n  background: #fff;\n  color: #333;\n  z-index: 2;\n  border-top-color: #fff;\n}\n\n.wbSheets_clas_ul:before {\n  position: absolute;\n  content: \"\";\n  width: 100%;\n  top: 0;\n  left: 0;\n  border-top: 1px solid #aaa;\n  z-index: 1;\n}\n\n.wbSheets_clas_ul li:before,\n.wbSheets_clas_ul li:after {\n  border: 1px solid #aaa;\n  position: absolute;\n  top: -1px;\n  width: 6px;\n  height: 6px;\n  content: \"\";\n}\n\n.wbSheets_clas_ul li:before {\n  left: -7px;\n  border-top-right-radius: 6px;\n  border-width: 1px 1px 0px 0px;\n  box-shadow: 2px 0px 0 #ececec;\n}\n\n.wbSheets_clas_ul li:after {\n  right: -7px;\n  border-top-left-radius: 6px;\n  border-width: 1px 0px 0px 1px;\n  box-shadow: -2px 0px 0 #ececec;\n}\n\n.wbSheets_clas_ul li.selected:before {\n  box-shadow: 2px 0px 0 #fff;\n}\n\n.wbSheets_clas_ul li.selected:after {\n  box-shadow: -2px 0px 0 #fff;\n}\n#wbSheets_search_warpper{\n  padding: 10px;\n}"
  },
  {
    "path": "pages/include/officeToHtml/officeToHtml.js",
    "content": "﻿/**\n * officeToHtml.js\n * Ver. : 1.2.1\n * last update: 15/02/2019\n * Author: meshesha , https://github.com/meshesha\n * LICENSE: MIT\n * url:https://officetohtml.js.org/\n */\n(function ($) {\n    $.event.special.destroyed = {\n        remove: function (o) {\n            if (o.handler) {\n                o.handler()\n            }\n        }\n    }\n    $.fn.officeToHtml = function (options) {\n        var $result = $(this);\n        var divId = $result.attr(\"id\");\n        var defaults = {\n            // These are the defaults.\n            url: \"\",\n            inputObjId: \"\",\n            pdfSetting: {\n                thumbnailViewBtn: true,\n                searchBtn: true,\n                nextPreviousBtn: true,\n                pageNumberTxt: true,\n                totalPagesLabel: true,\n                zoomBtns: true,\n                scaleSelector: true,\n                presantationModeBtn: true,\n                openFileBtn: true,\n                printBtn: true,\n                downloadBtn: true,\n                bookmarkBtn: true,\n                secondaryToolbarBtn: true,\n                firstPageBtn: true,\n                lastPageBtn: true,\n                pageRotateCwBtn: true,\n                pageRotateCcwBtn: true,\n                cursorSelectTextToolbarBtn: true,\n                cursorHandToolbarBtn: true,\n                setLang: \"\",\n                setLangFilesPath: \"\"\n            },\n            docxSetting: {\n                styleMap: null,\n                includeEmbeddedStyleMap: true,\n                includeDefaultStyleMap: true,\n                convertImage: null,\n                ignoreEmptyParagraphs: false,\n                idPrefix: \"\",\n                isRtl: \"auto\"\n            },\n            pptxSetting: {\n                slidesScale: \"\", //Change Slides scale by percent\n                slideMode: true /** true,false*/,\n                keyBoardShortCut: false /** true,false ,condition: slideMode: true*/,\n                mediaProcess: true /** true,false: if true then process video and audio files */,\n                jsZipV2: false,\n                slideModeConfig: {\n                    first: 1,\n                    nav: true /** true,false : show or not nav buttons*/,\n                    navTxtColor: \"black\" /** color */,\n                    keyBoardShortCut: true /** true,false ,condition: */,\n                    showSlideNum: true /** true,false */,\n                    showTotalSlideNum: true /** true,false */,\n                    autoSlide: 1 /** false or seconds , F8 to active ,keyBoardShortCut: true */,\n                    randomAutoSlide: false /** true,false ,autoSlide: > 1 */,\n                    loop: false /** true,false */,\n                    background: false /** false or color*/,\n                    transition:\n                        \"default\" /** transition type: \"slid\",\"fade\",\"default\",\"random\" , to show transition efects :transitionTime > 0.5 */,\n                    transitionTime: 1 /** transition time between slides in seconds */\n                }\n            },\n            sheetSetting: {\n                jqueryui: false,\n                activeHeaderClassName: \"\",\n                allowEmpty: true,\n                autoColumnSize: true,\n                autoRowSize: false,\n                columns: false,\n                columnSorting: true,\n                contextMenu: false,\n                copyable: true,\n                customBorders: false,\n                fixedColumnsLeft: 0,\n                fixedRowsTop: 0,\n                language: \"en-US\",\n                search: false,\n                selectionMode: \"single\",\n                sortIndicator: false,\n                readOnly: false,\n                startRows: 1,\n                startCols: 1,\n                rowHeaders: true,\n                colHeaders: true,\n                width: false,\n                height: false\n            },\n            imageSetting: {\n                frame: [\"100%\", \"100%\", false],\n                maxZoom: \"900%\",\n                zoomFactor: \"10%\",\n                mouse: true,\n                keyboard: true,\n                toolbar: true,\n                rotateToolbar: false\n            }\n        };\n        var settings = $.extend(true, {}, defaults, options);\n        //1.get file memeType\n        //2.load all js file needed to read the file\n        var file = settings.url;\n        var inputId = settings.inputObjId;\n        var fileObj = null;\n        //var pdfScale = settings.pdfScale;\n\n        $(\"#\" + divId).addClass(\"main_officejs_container\");\n\n        if (file != \"\") {\n            fileObj = {\n                Obj: file,\n                ext: file.split('.').pop().toLowerCase()\n            }\n            getContent(fileObj, divId, settings.pdfSetting, settings.docxSetting, settings.pptxSetting, settings.sheetSetting, settings.imageSetting);\n        }\n        if (inputId != \"\") {\n            //TODO\n            $(\"#\" + inputId).on(\"change\", function (e) {\n                //var inputFileObj = $(this)[0].files[0];\n                var inputFileObj = e.target.files[0];\n                if (inputFileObj !== undefined) {\n                    var fName = inputFileObj.name;\n                    fileBlob = URL.createObjectURL(inputFileObj);\n                    fileObj = {\n                        Obj: fileBlob,\n                        ext: fName.split('.').pop().toLowerCase()\n                    }\n                }\n                getContent(fileObj, divId, settings.pdfSetting, settings.docxSetting, settings.pptxSetting, settings.sheetSetting, settings.imageSetting);\n            });\n        }\n    }\n    function getContent(fObj, divId, pdfSet, docxSet, pptxSet, sheetSet, imgSet) {\n        var ext = fObj.ext;\n        var file = fObj.file;\n        switch (ext) {\n            case \"pdf\":\n                //handel pdf file (https://mozilla.github.io/pdf.js/) -- V\n                getPdfContent(fObj, divId, pdfSet);\n                break;\n            case \"docx\":\n                //handel docx (https://github.com/mwilliamson/mammoth.js) -- V\n                getDocxContent(fObj, divId, docxSet);\n                break;\n            case \"doc\":\n                //handel doc file () -- X\n                getDocContent(fObj, divId, docxSet);\n                break;\n            case \"pptx\":\n                //handel pptx file (https://meshesha.github.io/pptxjs/) -- V\n                getPptxContent(fObj, divId, pptxSet);\n                break;\n            case \"ppt\":\n                //handel ppt file () -- X\n                getPptContent(fObj, divId, pptxSet);\n                break;\n            case \"xlsx\":\n            case \"xls\":\n            case \"xlw\":\n            case \"xlsb\":\n            case \"xlsm\":\n            case \"csv\":\n            case \"dbf\":\n            case \"dif\":\n            case \"slk\":\n            case \"sylk\":\n            case \"prn\":\n            case \"ods\":\n            case \"fods\":\n                //handel sheet file (https://github.com/sheetjs/js-xlsx) -- V\n                getSheetContent(fObj, divId, sheetSet);\n                break;\n            case \"gif\":\n            case \"jpg\":\n            case \"jpeg\":\n            case \"bmp\":\n            case \"tiff\":\n            case \"tif\":\n            case \"png\":\n            case \"svg\":\n                //handel imge  -- V\n                getImgContent(fObj, divId, imgSet);\n                break;\n            default:\n                unknownMsg(divId);\n        }\n        return\n    }\n    /////////////////////////////////////////////////PDF//////////////////////////////////////////\n    function getPdfContent(fObj, divId, pdfSet) {\n        $(\"#\" + divId).html(\"\");\n        //console.log(pdfSet)\n        //bug to fix : add to <html> dir if not exists- TODO\n        //var htmldir = $(\"html\").attr(\"dir\");\n        //console.log(htmldir)\n        var thumbnailViewOpt = (pdfSet.thumbnailViewBtn) ? \"\" : \"hidden\",\n            searchOpt = (pdfSet.searchBtn) ? \"\" : \"hidden\",\n            nextPreviousOpt = (pdfSet.nextPreviousBtn) ? \"\" : \"hidden\",\n            pageNumberOpt = (pdfSet.pageNumberTxt) ? \"\" : \"hidden\",\n            totalPagesOpt = (pdfSet.totalPagesLabel) ? \"\" : \"hidden\",\n            zoomOpt = (pdfSet.zoomBtns) ? \"\" : \"hidden\",\n            scaleSelectOpt = (pdfSet.scaleSelector) ? \"\" : \"hidden\",\n            presentationModeOpt = (pdfSet.presantationModeBtn) ? \"\" : \"hidden\",\n            openFileOpt = (pdfSet.openFileBtn) ? \"\" : \"hidden\",\n            printOpt = (pdfSet.printBtn) ? \"\" : \"hidden\",\n            downloadOpt = (pdfSet.downloadBtn) ? \"\" : \"hidden\",\n            bookmarkOpt = (pdfSet.bookmarkBtn) ? \"\" : \"hidden\",\n            secondaryToolbarOpt = (pdfSet.secondaryToolbarBtn) ? \"\" : \"hidden\",\n            firstPageOpt = (pdfSet.firstPageBtn) ? \"\" : \"hidden\",\n            lastPageOpt = (pdfSet.lastPageBtn) ? \"\" : \"hidden\",\n            pageRotateCwOpt = (pdfSet.pageRotateCwBtn) ? \"\" : \"hidden\",\n            pageRotateCcwOpt = (pdfSet.pageRotateCcwBtn) ? \"\" : \"hidden\",\n            cursorSelectTextOpt = (pdfSet.cursorSelectTextToolbarBtn) ? \"\" : \"hidden\",\n            cursorHandOpt = (pdfSet.cursorHandToolbarBtn) ? \"\" : \"hidden\";\n        setLang = pdfSet.setLang;\n        setLangFilesPath = pdfSet.setLangFilesPath;\n        ////////////////////////////////////////////\n        $(\"<div></div>\", {\n            class: \"loadingInProgress\",\n            id: \"mainPdfWarrper\"\n        }).appendTo('div#' + divId);\n        ////////////////////////////////////////////\n        $(\"<div></div>\", {\n            id: \"outerContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress\");\n\n        $(\"<div></div>\", {\n            id: \"printContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress\");\n        ///////////////////////////////////////////////////////\n        $(\"<div></div>\", {\n            id: \"sidebarContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer\");\n\n        $(\"<div></div>\", {\n            id: \"mainContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer\");\n\n        $(\"<div></div>\", {\n            id: \"overlayContainer\",\n            class: \"hidden\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer\");\n        ///////////////////////////////////////////////////////\n        $(\"<div></div>\", {\n            id: \"toolbarSidebar\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer\");\n\n        $(\"<div></div>\", {\n            id: \"sidebarContent\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer\");\n        ///////////////////////////////////////////////////////\n        $(\"<div></div>\", {\n            class: \"splitToolbarButton toggled\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar\");\n        ///////////////////////////////////////////////////////\n        $(\"<button></button>\", {\n            id: \"viewThumbnail\",\n            class: \"toolbarButton toggled\",\n            title: \"Show Thumbnails\",\n            tabindex: \"2\",\n            \"data-l10n-id\": \"thumbs\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"thumbs_label\",\n            text: \"Thumbnails\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton #viewThumbnail\");\n\n\n        $(\"<button></button>\", {\n            id: \"viewOutline\",\n            class: \"toolbarButton\",\n            title: \"Show Document Outline (double-click to expand/collapse all items)\",\n            tabindex: \"3\",\n            \"data-l10n-id\": \"document_outline\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"document_outline_label\",\n            text: \"Document Outline\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton #viewOutline\");\n\n\n        $(\"<button></button>\", {\n            id: \"viewAttachments\",\n            class: \"toolbarButton\",\n            title: \"Show Attachments\",\n            tabindex: \"4\",\n            \"data-l10n-id\": \"attachments\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"attachments_label\",\n            text: \"Attachments\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #toolbarSidebar .splitToolbarButton #viewAttachments\");\n        ///////////////////////////////////////////////////////////////////////////////////////////\n        $(\"<div></div>\", {\n            id: \"thumbnailView\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #sidebarContent\");\n        $(\"<div></div>\", {\n            id: \"outlineView\",\n            class: \"hidden\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #sidebarContent\");\n        $(\"<div></div>\", {\n            id: \"attachmentsView\",\n            class: \"hidden\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #sidebarContainer #sidebarContent\");\n        ////////////////////////////////////////////////////////////////////////////////////////////////\n        $(\"<div></div>\", {\n            id: \"findbar\",\n            class: \"findbar hidden doorHanger\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\n        $(\"<div></div>\", {\n            id: \"findbarInputContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar\");\n\n        $(\"<input></input>\", {\n            id: \"findInput\",\n            class: \"toolbarField\",\n            title: \"Find\",\n            placeholder: \"Find in document…\",\n            tabindex: \"91\",\n            \"data-l10n-id\": \"find_input\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer\");\n        $(\"<div></div>\", {\n            class: \"splitToolbarButton\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer\");\n        $(\"<button></button>\", {\n            id: \"findPrevious\",\n            class: \"toolbarButton findPrevious\",\n            title: \"Find the previous occurrence of the phrase\",\n            tabindex: \"92\",\n            \"data-l10n-id\": \"find_previous\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer .splitToolbarButton\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"find_previous_label\",\n            text: \"Previous\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer .splitToolbarButton #findPrevious\");\n        $(\"<div></div>\", {\n            class: \"splitToolbarButtonSeparator\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer .splitToolbarButton\");\n        $(\"<button></button>\", {\n            id: \"findNext\",\n            class: \"toolbarButton findNext\",\n            title: \"Find the next occurrence of the phrase\",\n            tabindex: \"93\",\n            \"data-l10n-id\": \"find_next\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer .splitToolbarButton\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"find_next_label\",\n            text: \"Next\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarInputContainer .splitToolbarButton #findNext\");\n\n        $(\"<div></div>\", {\n            id: \"findbarOptionsContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar\");\n        $(\"<input></input>\", {\n            id: \"findHighlightAll\",\n            type: \"checkbox\",\n            class: \"toolbarField\",\n            tabindex: \"94\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarOptionsContainer\");\n        $(\"<label></label>\", {\n            for: \"findHighlightAll\",\n            class: \"toolbarLabel\",\n            \"data-l10n-id\": \"find_highlight\",\n            text: \"Highlight all\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarOptionsContainer\");\n        $(\"<input></input>\", {\n            id: \"findMatchCase\",\n            type: \"checkbox\",\n            class: \"toolbarField\",\n            tabindex: \"95\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarOptionsContainer\");\n        $(\"<label></label>\", {\n            for: \"findMatchCase\",\n            class: \"toolbarLabel\",\n            \"data-l10n-id\": \"find_match_case_label\",\n            text: \"Match case\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarOptionsContainer\");\n        $(\"<span></span>\", {\n            id: \"findResultsCount\",\n            class: \"toolbarLabel hidden\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarOptionsContainer\");\n\n\n        $(\"<div></div>\", {\n            id: \"findbarMessageContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar\");\n        $(\"<span></span>\", {\n            id: \"findMsg\",\n            class: \"toolbarLabel\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #findbar #findbarMessageContainer\");\n\n        $(\"<div></div>\", {\n            id: \"secondaryToolbar\",\n            class: \"secondaryToolbar hidden doorHangerRight\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\n        $(\"<div></div>\", {\n            id: \"secondaryToolbarButtonContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar\");\n        $(\"<button></button>\", {\n            id: \"secondaryPresentationMode\",\n            class: \"secondaryToolbarButton presentationMode visibleLargeView\",\n            title: \"Switch to Presentation Mode\",\n            tabindex: \"51\",\n            \"data-l10n-id\": \"presentation_mode\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"presentation_mode_label\",\n            text: \"Presentation Mode\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #secondaryPresentationMode\");\n\n        $(\"<button></button>\", {\n            id: \"secondaryOpenFile\",\n            class: \"secondaryToolbarButton openFile visibleLargeView\",\n            title: \"Open File\",\n            tabindex: \"52\",\n            \"data-l10n-id\": \"open_file\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"open_file_label\",\n            text: \"Open\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #secondaryOpenFile\");\n\n        $(\"<button></button>\", {\n            id: \"secondaryPrint\",\n            class: \"secondaryToolbarButton print visibleMediumView\",\n            title: \"Print\",\n            tabindex: \"53\",\n            \"data-l10n-id\": \"print\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"print_label\",\n            text: \"Print\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #secondaryPrint\");\n\n        $(\"<button></button>\", {\n            id: \"secondaryDownload\",\n            class: \"secondaryToolbarButton download visibleMediumView\",\n            title: \"Download\",\n            tabindex: \"54\",\n            \"data-l10n-id\": \"download\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"download_label\",\n            text: \"Download\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #secondaryDownload\");\n        $(\"<a></a>\", {\n            href: \"#\",\n            id: \"secondaryViewBookmark\",\n            class: \"secondaryToolbarButton bookmark visibleSmallView\",\n            title: \"Current view (copy or open in new window)\",\n            tabindex: \"55\",\n            \"data-l10n-id\": \"bookmark\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"bookmark_label\",\n            text: \"Current View\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #secondaryViewBookmark\");\n\n        $(\"<div></div>\", {\n            class: \"horizontalToolbarSeparator visibleLargeView\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<button></button>\", {\n            id: \"firstPage\",\n            class: \"secondaryToolbarButton firstPage \" + firstPageOpt,\n            title: \"Go to First Page\",\n            tabindex: \"56\",\n            \"data-l10n-id\": \"first_page\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"first_page_label\",\n            text: \"Go to First Page\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #firstPage\");\n\n        $(\"<button></button>\", {\n            id: \"lastPage\",\n            class: \"secondaryToolbarButton lastPage \" + lastPageOpt,\n            title: \"Go to Last Page\",\n            tabindex: \"57\",\n            \"data-l10n-id\": \"last_page\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"last_page_label\",\n            text: \"Go to Last Page\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #lastPage\");\n        $(\"<div></div>\", {\n            class: \"horizontalToolbarSeparator\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<button></button>\", {\n            id: \"pageRotateCw\",\n            class: \"secondaryToolbarButton rotateCw \" + pageRotateCwOpt,\n            title: \"Rotate Clockwise\",\n            tabindex: \"58\",\n            \"data-l10n-id\": \"page_rotate_cw\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"page_rotate_cw_label\",\n            text: \"Rotate Clockwise\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #pageRotateCw\");\n\n        $(\"<button></button>\", {\n            id: \"pageRotateCcw\",\n            class: \"secondaryToolbarButton rotateCcw \" + pageRotateCcwOpt,\n            title: \"Rotate Counterclockwise\",\n            tabindex: \"59\",\n            \"data-l10n-id\": \"page_rotate_ccw\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"page_rotate_ccw_label\",\n            text: \"Rotate Counterclockwise\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #pageRotateCcw\");\n\n        $(\"<div></div>\", {\n            class: \"horizontalToolbarSeparator\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n\n        $(\"<button></button>\", {\n            id: \"cursorSelectTool\",\n            class: \"secondaryToolbarButton selectTool toggled \" + cursorSelectTextOpt,\n            title: \"Enable Text Selection Tool\",\n            tabindex: \"60\",\n            \"data-l10n-id\": \"cursor_text_select_tool\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"cursor_text_select_tool_label\",\n            text: \"Text Selection Tool\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #cursorSelectTool\");\n\n        $(\"<button></button>\", {\n            id: \"cursorHandTool\",\n            class: \"secondaryToolbarButton handTool \" + cursorHandOpt,\n            title: \"Enable Hand Tool\",\n            tabindex: \"61\",\n            \"data-l10n-id\": \"cursor_hand_tool\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"cursor_hand_tool_label\",\n            text: \"Hand Tool\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #cursorHandTool\");\n\n        $(\"<div></div>\", {\n            class: \"horizontalToolbarSeparator hidden\"\n        }).appendTo(\"div#\" + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n\n        $(\"<button></button>\", {\n            id: \"pdfDocumentProperties\",\n            class: \"secondaryToolbarButton pdfDocumentProperties hidden\",\n            title: \"Document Properties…\",\n            tabindex: \"62\",\n            \"data-l10n-id\": \"document_properties\"\n        }).appendTo(\"div#\" + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"document_properties_label\",\n            text: \"Document Properties…\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #secondaryToolbar #secondaryToolbarButtonContainer #pdfDocumentProperties\");\n\n        $(\"<div></div>\", {\n            class: \"toolbar\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\n        $(\"<div></div>\", {\n            id: \"toolbarContainer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar\");\n        $(\"<div></div>\", {\n            id: \"toolbarViewer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer\");\n        $(\"<div></div>\", {\n            id: \"toolbarViewerLeft\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer\");\n        $(\"<button></button>\", {\n            id: \"sidebarToggle\",\n            class: \"toolbarButton \" + thumbnailViewOpt,\n            title: \"Toggle Sidebar\",\n            tabindex: \"11\",\n            \"data-l10n-id\": \"toggle_sidebar\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"toggle_sidebar_label\",\n            title: \"Toggle Sidebar\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft #sidebarToggle\");\n        $(\"<div></div>\", {\n            class: \"toolbarButtonSpacer\",\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\n        $(\"<button></button>\", {\n            id: \"viewFind\",\n            class: \"toolbarButton \" + searchOpt,\n            title: \"Find in Document\",\n            tabindex: \"12\",\n            \"data-l10n-id\": \"findbar\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"findbar_label\",\n            title: \"Find\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft #viewFind\");\n        $(\"<div></div>\", {\n            class: \"splitToolbarButton hiddenSmallView \" + nextPreviousOpt,\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\n        $(\"<button></button>\", {\n            class: \"toolbarButton pageUp\",\n            title: \"Previous Page\",\n            id: \"previous\",\n            tabindex: \"13\",\n            \"data-l10n-id\": \"previous\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft .hiddenSmallView\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"previous_label\",\n            text: \"Previous\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft .hiddenSmallView #previous\");\n        $(\"<div></div>\", {\n            class: \"splitToolbarButtonSeparator\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft .hiddenSmallView\");\n        $(\"<button></button>\", {\n            class: \"toolbarButton pageDown\",\n            title: \"Next Pagee\",\n            id: \"next\",\n            tabindex: \"14\",\n            \"data-l10n-id\": \"next\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft .hiddenSmallView\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"next_label\",\n            text: \"Next\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft .hiddenSmallView #next\");\n        $(\"<input></input>\", {\n            type: \"number\",\n            id: \"pageNumber\",\n            class: \"toolbarField pageNumber \" + pageNumberOpt,\n            title: \"Page\",\n            value: \"1\",\n            size: \"4\",\n            min: \"1\",\n            tabindex: \"15\",\n            \"data-l10n-id\": \"page\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\n        $(\"<span></span>\", {\n            id: \"numPages\",\n            class: \"toolbarLabel \" + totalPagesOpt\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerLeft\");\n\n        $(\"<div></div>\", {\n            id: \"toolbarViewerRight\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer\");\n        $(\"<button></button>\", {\n            id: \"presentationMode\",\n            class: \"toolbarButton presentationMode hiddenLargeView \" + presentationModeOpt,\n            title: \"Switch to Presentation Mode\",\n            tabindex: \"31\",\n            \"data-l10n-id\": \"presentation_mode\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"presentation_mode_label\",\n            text: \"Presentation Mode\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #presentationMode\");\n        $(\"<button></button>\", {\n            id: \"openFile\",\n            class: \"toolbarButton openFile hiddenLargeView \" + openFileOpt,\n            title: \"Open File\",\n            tabindex: \"32\",\n            \"data-l10n-id\": \"open_file\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"open_file_label\",\n            text: \"Open\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #openFile\");\n        $(\"<button></button>\", {\n            id: \"print\",\n            class: \"toolbarButton print hiddenMediumView \" + printOpt,\n            title: \"Print\",\n            tabindex: \"33\",\n            \"data-l10n-id\": \"print\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"print_label\",\n            text: \"Print\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #print\");\n        $(\"<button></button>\", {\n            id: \"download\",\n            class: \"toolbarButton download hiddenMediumView \" + downloadOpt,\n            title: \"Download\",\n            tabindex: \"34\",\n            \"data-l10n-id\": \"download\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"download_label\",\n            text: \"Download\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #download\");\n        $(\"<a></a>\", {\n            href: \"#\",\n            id: \"viewBookmark\",\n            class: \"toolbarButton bookmark hiddenSmallView \" + bookmarkOpt,\n            title: \"Current view (copy or open in new window)\",\n            tabindex: \"35\",\n            \"data-l10n-id\": \"bookmark\",\n            target: \"_blank\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"bookmark_label\",\n            text: \"Current View\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #viewBookmark\");\n        $(\"<div></div>\", {\n            class: \"verticalToolbarSeparator hiddenSmallView\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\n        $(\"<button></button>\", {\n            id: \"secondaryToolbarToggle\",\n            class: \"toolbarButton \" + secondaryToolbarOpt,\n            title: \"Tools\",\n            tabindex: \"35\",\n            \"data-l10n-id\": \"tools\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"tools_label\",\n            text: \"Tools\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerRight #secondaryToolbarToggle\");\n\n        $(\"<div></div>\", {\n            id: \"toolbarViewerMiddle\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer\");\n        $(\"<div></div>\", {\n            class: \"splitToolbarButton \" + zoomOpt\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle\");\n        $(\"<button></button>\", {\n            id: \"zoomOut\",\n            class: \"toolbarButton zoomOut\",\n            title: \"Zoom Out\",\n            tabindex: \"21\",\n            \"data-l10n-id\": \"zoom_out\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle .splitToolbarButton\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"zoom_out_label\",\n            text: \"Zoom Out\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle .splitToolbarButton #zoomOut\");\n        $(\"<div></div>\", {\n            class: \"splitToolbarButtonSeparator\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle .splitToolbarButton\");\n        $(\"<button></button>\", {\n            id: \"zoomIn\",\n            class: \"toolbarButton zoomIn\",\n            title: \"Zoom In\",\n            tabindex: \"22\",\n            \"data-l10n-id\": \"zoom_in\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle .splitToolbarButton\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"zoom_in_label\",\n            text: \"Zoom In\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle .splitToolbarButton #zoomIn\");\n\n        $(\"<span></span>\", {\n            id: \"scaleSelectContainer\",\n            class: \"dropdownToolbarButton\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle\");\n        $(\"<select></select>\", {\n            id: \"scaleSelect\",\n            title: \"Zoom\",\n            tabindex: \"23\",\n            \"data-l10n-id\": \"zoom\",\n            class: scaleSelectOpt\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer\");\n        $(\"<option></option>\", {\n            id: \"pageAutoOption\",\n            title: \"\",\n            value: \"auto\",\n            selected: \"selected\",\n            \"data-l10n-id\": \"page_scale_auto\",\n            text: \"Automatic Zoom\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            id: \"pageActualOption\",\n            title: \"\",\n            value: \"page-actual\",\n            \"data-l10n-id\": \"page_scale_actual\",\n            text: \"Actual Size\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            id: \"pageFitOption\",\n            title: \"\",\n            value: \"page-fit\",\n            \"data-l10n-id\": \"page_scale_fit\",\n            text: \"Page Fit\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            id: \"pageWidthOption\",\n            title: \"\",\n            value: \"page-width\",\n            \"data-l10n-id\": \"page_scale_width\",\n            text: \"Page Width\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            id: \"customScaleOption\",\n            title: \"\",\n            value: \"custom\",\n            disabled: \"disabled\",\n            hidden: \"true\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            title: \"\",\n            value: \"0.5\",\n            \"data-l10n-id\": \"page_scale_percent\",\n            \"data-l10n-args\": '{ \"scale\": 50 }',\n            text: \"50%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            title: \"\",\n            value: \"0.75\",\n            \"data-l10n-id\": \"page_scale_percent\",\n            \"data-l10n-args\": '{ \"scale\": 75 }',\n            text: \"75%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            title: \"\",\n            value: \"1\",\n            \"data-l10n-id\": \"page_scale_percent\",\n            \"data-l10n-args\": '{ \"scale\": 100 }',\n            text: \"100%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            title: \"\",\n            value: \"1.25\",\n            \"data-l10n-id\": \"page_scale_percent\",\n            \"data-l10n-args\": '{ \"scale\": 125 }',\n            text: \"125%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            title: \"\",\n            value: \"1.5\",\n            \"data-l10n-id\": \"page_scale_percent\",\n            \"data-l10n-args\": '{ \"scale\": 150 }',\n            text: \"150%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            title: \"\",\n            value: \"2\",\n            \"data-l10n-id\": \"page_scale_percent\",\n            \"data-l10n-args\": '{ \"scale\": 200 }',\n            text: \"200%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            title: \"\",\n            value: \"3\",\n            \"data-l10n-id\": \"page_scale_percent\",\n            \"data-l10n-args\": '{ \"scale\": 300 }',\n            text: \"300%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n        $(\"<option></option>\", {\n            title: \"\",\n            value: \"4\",\n            \"data-l10n-id\": \"page_scale_percent\",\n            \"data-l10n-args\": '{ \"scale\": 400 }',\n            text: \"400%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #toolbarViewer #toolbarViewerMiddle #scaleSelectContainer #scaleSelect\");\n\n        $(\"<div></div>\", {\n            id: \"loadingBar\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer\");\n        $(\"<div></div>\", {\n            class: \"progress\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #loadingBar\");\n        $(\"<div></div>\", {\n            class: \"glimmer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer .toolbar #toolbarContainer #loadingBar .progress\");\n\n        $(\"<menu></menu>\", {\n            id: \"viewerContextMenu\",\n            type: \"context\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\n        $(\"<menuitem></menuitem>\", {\n            id: \"contextFirstPage\",\n            label: \"First Page\",\n            \"data-l10n-id\": \"first_page\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #viewerContextMenu\");\n\n        $(\"<menuitem></menuitem>\", {\n            id: \"contextLastPage\",\n            label: \"Last Page\",\n            \"data-l10n-id\": \"last_page\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #viewerContextMenu\");\n        $(\"<menuitem></menuitem>\", {\n            id: \"contextPageRotateCw\",\n            label: \"Rotate Clockwise\",\n            \"data-l10n-id\": \"page_rotate_cw\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #viewerContextMenu\");\n        $(\"<menuitem></menuitem>\", {\n            id: \"contextPageRotateCcw\",\n            label: \"Rotate Counter-Clockwise\",\n            \"data-l10n-id\": \"page_rotate_ccw\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #viewerContextMenu\");\n\n        $(\"<div></div>\", {\n            id: \"viewerContainer\",\n            tabindex: \"0\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\n        $(\"<div></div>\", {\n            id: \"viewer\",\n            class: \"pdfViewer\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #viewerContainer\");\n\n        $(\"<div></div>\", {\n            id: \"errorWrapper\",\n            hidden: \"true\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer\");\n        $(\"<div></div>\", {\n            id: \"errorMessageLeft\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper\");\n        $(\"<span></span>\", {\n            id: \"errorMessage\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper #errorMessageLeft\");\n        $(\"<button></button>\", {\n            id: \"errorShowMore\",\n            \"data-l10n-id\": \"error_more_info\",\n            text: \"More Information\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper #errorMessageLeft\");\n        $(\"<button></button>\", {\n            id: \"errorShowLess\",\n            \"data-l10n-id\": \"error_less_info\",\n            text: \"Less Information\",\n            hidden: \"true\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper #errorMessageLeft\");\n\n        $(\"<div></div>\", {\n            id: \"errorMessageRight\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper\");\n        $(\"<button></button>\", {\n            id: \"errorClose\",\n            \"data-l10n-id\": \"error_close\",\n            text: \"Close\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper #errorMessageRight\");\n\n        $(\"<div></div>\", {\n            class: \"clearBoth\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper\");\n        $(\"<textarea></textarea>\", {\n            id: \"errorMoreInfo\",\n            hidden: 'true',\n            readonly: \"readonly\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #mainContainer #errorWrapper\");\n        $(\"<div></div>\", {\n            id: \"passwordOverlay\",\n            class: \"container hidden\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer\");\n        $(\"<div></div>\", {\n            class: \"dialog\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay\");\n        $(\"<div></div>\", {\n            class: \"row\",\n            id: \"firstRow\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog\");\n        $(\"<p></p>\", {\n            id: \"passwordText\",\n            \"data-l10n-id\": \"password_label\",\n            text: \"Enter the password to open this PDF file:\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog #firstRow\");\n        $(\"<div></div>\", {\n            class: \"row\",\n            id: \"midleRow\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog\");\n        $(\"<input/>\", {\n            type: \"password\",\n            id: \"password\",\n            class: \"toolbarField\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog #midleRow\");\n        $(\"<div></div>\", {\n            class: \"buttonRow\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog\");\n        $(\"<button></button>\", {\n            id: \"passwordCancel\",\n            class: \"overlayButton\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog .buttonRow\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"password_cancel\",\n            text: \"Cancel\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog .buttonRow #passwordCancel\");\n        $(\"<button></button>\", {\n            id: \"passwordSubmit\",\n            class: \"overlayButton\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog .buttonRow\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"password_ok\",\n            text: \"OK\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #passwordOverlay .dialog .buttonRow #passwordSubmit\");\n\n        $(\"<div></div>\", {\n            id: \"documentPropertiesOverlay\",\n            class: \"container hidden\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer\");\n\n        $(\"<div></div>\", {\n            id: \"printServiceOverlay\",\n            class: \"container hidden\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer\");\n        $(\"<div></div>\", {\n            class: \"dialog\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay\");\n        $(\"<div></div>\", {\n            class: \"row\",\n            id: \"printFirsRwo\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"print_progress_message\",\n            text: \"Preparing document for printing…\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog #printFirsRwo\");\n        $(\"<div></div>\", {\n            class: \"row\",\n            id: \"printSecondRwo\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog\");\n        $(\"<progress></progress>\", {\n            value: \"0\",\n            max: \"100\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog #printSecondRwo\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"print_progress_percent\",\n            \"data-l10n-args\": '{ \"progress\": 0 }',\n            class: \"relative-progress\",\n            text: \"0%\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog #printSecondRwo\");\n        $(\"<div></div>\", {\n            class: \"buttonRow\",\n            id: \"printThirdRwo\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog\");\n        $(\"<button></button>\", {\n            class: \"overlayButton\",\n            id: \"printCancel\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog #printThirdRwo\");\n        $(\"<span></span>\", {\n            \"data-l10n-id\": \"print_progress_close\",\n            text: \"Cancel\"\n        }).appendTo('div#' + divId + \" .loadingInProgress #outerContainer #overlayContainer #printServiceOverlay .dialog #printThirdRwo\");\n\n        var my_pdf_file = fObj.Obj;\n\n        var currentScriptPath = function () {\n            var dir = document.querySelector('script[src$=\"pdf.js\"]').getAttribute('src');\n            var name = dir.split('/').pop();\n            return dir.replace('/' + name, \"\");\n        };\n        function diff2(a, b) {\n            var i, la = a.length, lb = b.length, res = [];\n            if (!la) return b;\n            else if (!lb) return a;\n            for (i = 0; i < la; i++) {\n                if (b.indexOf(a[i]) === -1) res.push(a[i]);\n            }\n            for (i = 0; i < lb; i++) {\n                if (a.indexOf(b[i]) === -1) res.push(b[i]);\n            }\n            return res;\n        }\n        var full_path = location.href;\n        var pdfScriptPath = currentScriptPath();\n        if (pdfScriptPath.indexOf(full_path) > -1) {\n            var link_a_array = pdfScriptPath.split(\"/\");\n            var link_b_array = full_path.split(\"/\");\n            var link_diff = diff2(link_a_array, link_b_array).join(\"/\");\n            pdfScriptPath = link_diff;\n            /*\n            console.log(\n                \"\\nscript path: \", currentScriptPath(),\n                \"\\nfull path:\", full_path,\n                \"\\nlink_diff: \", link_diff,\n                \"\\nsetLangFilesPath: \", setLangFilesPath\n            );\n            */\n        }\n        setLangFilesPath = (setLangFilesPath != \"\") ? full_path + setLangFilesPath + \"/locale.properties\" : \"\";\n        $(\"<link>\", {\n            rel: \"resource\",\n            type: \"application/l10n\",\n            href: (setLangFilesPath != \"\") ? setLangFilesPath : pdfScriptPath + \"/locale/locale.properties\"\n        }).appendTo(\"#\" + divId);\n\n        $(\"#mainPdfWarrper\").bind('destroyed', function () {\n            //if exit from pdf viewer mode\n            //return orginal Warrper dir\n            var orgnlHtmldir = sessionStorage.getItem(\"o2h_orginal_html_dir\");\n            if (orgnlHtmldir !== undefined) {\n                $(\"#mainPdfWarrper\").attr(\"dir\", orgnlHtmldir);\n            }\n        });\n    /* Copyright 2017 Mozilla Foundation\n    *\n    * Licensed under the Apache License, Version 2.0 (the \"License\");\n    * you may not use this file except in compliance with the License.\n    * You may obtain a copy of the License at\n    *\n    *     http://www.apache.org/licenses/LICENSE-2.0\n    *\n    * Unless required by applicable law or agreed to in writing, software\n    * distributed under the License is distributed on an \"AS IS\" BASIS,\n    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    * See the License for the specific language governing permissions and\n    * limitations under the License.\n    */\n\n    /******/ (function (modules) { // webpackBootstrap\n    /******/ \t// The module cache\n    /******/ \tvar installedModules = {};\n    /******/\n    /******/ \t// The require function\n    /******/ \tfunction __webpack_require__(moduleId) {\n    /******/\n    /******/ \t\t// Check if module is in cache\n    /******/ \t\tif (installedModules[moduleId]) {\n    /******/ \t\t\treturn installedModules[moduleId].exports;\n                    /******/\n                }\n    /******/ \t\t// Create a new module (and put it into the cache)\n    /******/ \t\tvar module = installedModules[moduleId] = {\n    /******/ \t\t\ti: moduleId,\n    /******/ \t\t\tl: false,\n    /******/ \t\t\texports: {}\n                    /******/\n                };\n    /******/\n    /******/ \t\t// Execute the module function\n    /******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n    /******/\n    /******/ \t\t// Flag the module as loaded\n    /******/ \t\tmodule.l = true;\n    /******/\n    /******/ \t\t// Return the exports of the module\n    /******/ \t\treturn module.exports;\n                /******/\n            }\n    /******/\n    /******/\n    /******/ \t// expose the modules object (__webpack_modules__)\n    /******/ \t__webpack_require__.m = modules;\n    /******/\n    /******/ \t// expose the module cache\n    /******/ \t__webpack_require__.c = installedModules;\n    /******/\n    /******/ \t// identity function for calling harmony imports with the correct context\n    /******/ \t__webpack_require__.i = function (value) { return value; };\n    /******/\n    /******/ \t// define getter function for harmony exports\n    /******/ \t__webpack_require__.d = function (exports, name, getter) {\n    /******/ \t\tif (!__webpack_require__.o(exports, name)) {\n    /******/ \t\t\tObject.defineProperty(exports, name, {\n    /******/ \t\t\t\tconfigurable: false,\n    /******/ \t\t\t\tenumerable: true,\n    /******/ \t\t\t\tget: getter\n                /******/\n            });\n                    /******/\n                }\n                /******/\n            };\n    /******/\n    /******/ \t// getDefaultExport function for compatibility with non-harmony modules\n    /******/ \t__webpack_require__.n = function (module) {\n    /******/ \t\tvar getter = module && module.__esModule ?\n    /******/ \t\t\tfunction getDefault() { return module['default']; } :\n    /******/ \t\t\tfunction getModuleExports() { return module; };\n    /******/ \t\t__webpack_require__.d(getter, 'a', getter);\n    /******/ \t\treturn getter;\n                /******/\n            };\n    /******/\n    /******/ \t// Object.prototype.hasOwnProperty.call\n    /******/ \t__webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n    /******/\n    /******/ \t// __webpack_public_path__\n    /******/ \t__webpack_require__.p = \"\";\n    /******/\n    /******/ \t// Load entry module and return exports\n    /******/ \treturn __webpack_require__(__webpack_require__.s = 33);\n            /******/\n        })\n    /************************************************************************/\n    /******/([\n    /* 0 */\n    /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.localized = exports.animationStarted = exports.normalizeWheelEventDelta = exports.binarySearchFirstItem = exports.watchScroll = exports.scrollIntoView = exports.getOutputScale = exports.approximateFraction = exports.roundToDivide = exports.getVisibleElements = exports.parseQueryString = exports.noContextMenuHandler = exports.getPDFFileNameFromURL = exports.ProgressBar = exports.EventBus = exports.NullL10n = exports.mozL10n = exports.RendererType = exports.cloneObj = exports.VERTICAL_PADDING = exports.SCROLLBAR_PADDING = exports.MAX_AUTO_SCALE = exports.UNKNOWN_SCALE = exports.MAX_SCALE = exports.MIN_SCALE = exports.DEFAULT_SCALE = exports.DEFAULT_SCALE_VALUE = exports.CSS_UNITS = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var CSS_UNITS = 96.0 / 72.0;\n                var DEFAULT_SCALE_VALUE = 'auto';\n                var DEFAULT_SCALE = 1.0;\n                var MIN_SCALE = 0.25;\n                var MAX_SCALE = 10.0;\n                var UNKNOWN_SCALE = 0;\n                var MAX_AUTO_SCALE = 1.25;\n                var SCROLLBAR_PADDING = 40;\n                var VERTICAL_PADDING = 5;\n                var RendererType = {\n                    CANVAS: 'canvas',\n                    SVG: 'svg'\n                };\n                function formatL10nValue(text, args) {\n                    if (!args) {\n                        return text;\n                    }\n                    return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, function (all, name) {\n                        return name in args ? args[name] : '{{' + name + '}}';\n                    });\n                }\n                var NullL10n = {\n                    get: function get(property, args, fallback) {\n                        return Promise.resolve(formatL10nValue(fallback, args));\n                    },\n                    translate: function translate(element) {\n                        return Promise.resolve();\n                    }\n                };\n                _pdfjsLib.PDFJS.disableFullscreen = _pdfjsLib.PDFJS.disableFullscreen === undefined ? false : _pdfjsLib.PDFJS.disableFullscreen;\n                _pdfjsLib.PDFJS.useOnlyCssZoom = _pdfjsLib.PDFJS.useOnlyCssZoom === undefined ? false : _pdfjsLib.PDFJS.useOnlyCssZoom;\n                _pdfjsLib.PDFJS.maxCanvasPixels = _pdfjsLib.PDFJS.maxCanvasPixels === undefined ? 16777216 : _pdfjsLib.PDFJS.maxCanvasPixels;\n                _pdfjsLib.PDFJS.disableHistory = _pdfjsLib.PDFJS.disableHistory === undefined ? false : _pdfjsLib.PDFJS.disableHistory;\n                _pdfjsLib.PDFJS.disableTextLayer = _pdfjsLib.PDFJS.disableTextLayer === undefined ? false : _pdfjsLib.PDFJS.disableTextLayer;\n                _pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom = _pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom === undefined ? false : _pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom;\n                {\n                    //_pdfjsLib.PDFJS.locale = _pdfjsLib.PDFJS.locale === undefined && typeof navigator !== 'undefined' ? navigator.language : _pdfjsLib.PDFJS.locale;\n                    if (_pdfjsLib.PDFJS.locale === undefined && typeof navigator !== 'undefined') {\n                        if (setLang != \"\") {\n                            _pdfjsLib.PDFJS.locale = setLang;\n                        } else {\n                            _pdfjsLib.PDFJS.locale = navigator.language; //set lang here - TODO\n                        }\n                        //console.log(\"_pdfjsLib.PDFJS.locale (lang)= \" + _pdfjsLib.PDFJS.locale); \n                    }\n                }\n                function getOutputScale(ctx) {\n                    var devicePixelRatio = window.devicePixelRatio || 1;\n                    var backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;\n                    var pixelRatio = devicePixelRatio / backingStoreRatio;\n                    return {\n                        sx: pixelRatio,\n                        sy: pixelRatio,\n                        scaled: pixelRatio !== 1\n                    };\n                }\n                function scrollIntoView(element, spot) {\n                    var skipOverflowHiddenElements = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n                    var parent = element.offsetParent;\n                    if (!parent) {\n                        console.error('offsetParent is not set -- cannot scroll');\n                        return;\n                    }\n                    var offsetY = element.offsetTop + element.clientTop;\n                    var offsetX = element.offsetLeft + element.clientLeft;\n                    while (parent.clientHeight === parent.scrollHeight || skipOverflowHiddenElements && getComputedStyle(parent).overflow === 'hidden') {\n                        if (parent.dataset._scaleY) {\n                            offsetY /= parent.dataset._scaleY;\n                            offsetX /= parent.dataset._scaleX;\n                        }\n                        offsetY += parent.offsetTop;\n                        offsetX += parent.offsetLeft;\n                        parent = parent.offsetParent;\n                        if (!parent) {\n                            return;\n                        }\n                    }\n                    if (spot) {\n                        if (spot.top !== undefined) {\n                            offsetY += spot.top;\n                        }\n                        if (spot.left !== undefined) {\n                            offsetX += spot.left;\n                            parent.scrollLeft = offsetX;\n                        }\n                    }\n                    parent.scrollTop = offsetY;\n                }\n                function watchScroll(viewAreaElement, callback) {\n                    var debounceScroll = function debounceScroll(evt) {\n                        if (rAF) {\n                            return;\n                        }\n                        rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {\n                            rAF = null;\n                            var currentY = viewAreaElement.scrollTop;\n                            var lastY = state.lastY;\n                            if (currentY !== lastY) {\n                                state.down = currentY > lastY;\n                            }\n                            state.lastY = currentY;\n                            callback(state);\n                        });\n                    };\n                    var state = {\n                        down: true,\n                        lastY: viewAreaElement.scrollTop,\n                        _eventHandler: debounceScroll\n                    };\n                    var rAF = null;\n                    viewAreaElement.addEventListener('scroll', debounceScroll, true);\n                    return state;\n                }\n                function parseQueryString(query) {\n                    var parts = query.split('&');\n                    var params = Object.create(null);\n                    for (var i = 0, ii = parts.length; i < ii; ++i) {\n                        var param = parts[i].split('=');\n                        var key = param[0].toLowerCase();\n                        var value = param.length > 1 ? param[1] : null;\n                        params[decodeURIComponent(key)] = decodeURIComponent(value);\n                    }\n                    return params;\n                }\n                function binarySearchFirstItem(items, condition) {\n                    var minIndex = 0;\n                    var maxIndex = items.length - 1;\n                    if (items.length === 0 || !condition(items[maxIndex])) {\n                        return items.length;\n                    }\n                    if (condition(items[minIndex])) {\n                        return minIndex;\n                    }\n                    while (minIndex < maxIndex) {\n                        var currentIndex = minIndex + maxIndex >> 1;\n                        var currentItem = items[currentIndex];\n                        if (condition(currentItem)) {\n                            maxIndex = currentIndex;\n                        } else {\n                            minIndex = currentIndex + 1;\n                        }\n                    }\n                    return minIndex;\n                }\n                function approximateFraction(x) {\n                    if (Math.floor(x) === x) {\n                        return [x, 1];\n                    }\n                    var xinv = 1 / x;\n                    var limit = 8;\n                    if (xinv > limit) {\n                        return [1, limit];\n                    } else if (Math.floor(xinv) === xinv) {\n                        return [1, xinv];\n                    }\n                    var x_ = x > 1 ? xinv : x;\n                    var a = 0,\n                        b = 1,\n                        c = 1,\n                        d = 1;\n                    while (true) {\n                        var p = a + c,\n                            q = b + d;\n                        if (q > limit) {\n                            break;\n                        }\n                        if (x_ <= p / q) {\n                            c = p;\n                            d = q;\n                        } else {\n                            a = p;\n                            b = q;\n                        }\n                    }\n                    var result = void 0;\n                    if (x_ - a / b < c / d - x_) {\n                        result = x_ === x ? [a, b] : [b, a];\n                    } else {\n                        result = x_ === x ? [c, d] : [d, c];\n                    }\n                    return result;\n                }\n                function roundToDivide(x, div) {\n                    var r = x % div;\n                    return r === 0 ? x : Math.round(x - r + div);\n                }\n                function getVisibleElements(scrollEl, views) {\n                    var sortByVisibility = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n                    var top = scrollEl.scrollTop,\n                        bottom = top + scrollEl.clientHeight;\n                    var left = scrollEl.scrollLeft,\n                        right = left + scrollEl.clientWidth;\n                    function isElementBottomBelowViewTop(view) {\n                        var element = view.div;\n                        var elementBottom = element.offsetTop + element.clientTop + element.clientHeight;\n                        return elementBottom > top;\n                    }\n                    var visible = [],\n                        view = void 0,\n                        element = void 0;\n                    var currentHeight = void 0,\n                        viewHeight = void 0,\n                        hiddenHeight = void 0,\n                        percentHeight = void 0;\n                    var currentWidth = void 0,\n                        viewWidth = void 0;\n                    var firstVisibleElementInd = views.length === 0 ? 0 : binarySearchFirstItem(views, isElementBottomBelowViewTop);\n                    for (var i = firstVisibleElementInd, ii = views.length; i < ii; i++) {\n                        view = views[i];\n                        element = view.div;\n                        currentHeight = element.offsetTop + element.clientTop;\n                        viewHeight = element.clientHeight;\n                        if (currentHeight > bottom) {\n                            break;\n                        }\n                        currentWidth = element.offsetLeft + element.clientLeft;\n                        viewWidth = element.clientWidth;\n                        if (currentWidth + viewWidth < left || currentWidth > right) {\n                            continue;\n                        }\n                        hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, currentHeight + viewHeight - bottom);\n                        percentHeight = (viewHeight - hiddenHeight) * 100 / viewHeight | 0;\n                        visible.push({\n                            id: view.id,\n                            x: currentWidth,\n                            y: currentHeight,\n                            view: view,\n                            percent: percentHeight\n                        });\n                    }\n                    var first = visible[0];\n                    var last = visible[visible.length - 1];\n                    if (sortByVisibility) {\n                        visible.sort(function (a, b) {\n                            var pc = a.percent - b.percent;\n                            if (Math.abs(pc) > 0.001) {\n                                return -pc;\n                            }\n                            return a.id - b.id;\n                        });\n                    }\n                    return {\n                        first: first,\n                        last: last,\n                        views: visible\n                    };\n                }\n                function noContextMenuHandler(evt) {\n                    evt.preventDefault();\n                }\n                function isDataSchema(url) {\n                    var i = 0,\n                        ii = url.length;\n                    while (i < ii && url[i].trim() === '') {\n                        i++;\n                    }\n                    return url.substr(i, 5).toLowerCase() === 'data:';\n                }\n                function getPDFFileNameFromURL(url) {\n                    var defaultFilename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'document.pdf';\n\n                    if (isDataSchema(url)) {\n                        console.warn('getPDFFileNameFromURL: ' + 'ignoring \"data:\" URL for performance reasons.');\n                        return defaultFilename;\n                    }\n                    var reURI = /^(?:(?:[^:]+:)?\\/\\/[^\\/]+)?([^?#]*)(\\?[^#]*)?(#.*)?$/;\n                    var reFilename = /[^\\/?#=]+\\.pdf\\b(?!.*\\.pdf\\b)/i;\n                    var splitURI = reURI.exec(url);\n                    var suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]);\n                    if (suggestedFilename) {\n                        suggestedFilename = suggestedFilename[0];\n                        if (suggestedFilename.indexOf('%') !== -1) {\n                            try {\n                                suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0];\n                            } catch (ex) { }\n                        }\n                    }\n                    return suggestedFilename || defaultFilename;\n                }\n                function normalizeWheelEventDelta(evt) {\n                    var delta = Math.sqrt(evt.deltaX * evt.deltaX + evt.deltaY * evt.deltaY);\n                    var angle = Math.atan2(evt.deltaY, evt.deltaX);\n                    if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {\n                        delta = -delta;\n                    }\n                    var MOUSE_DOM_DELTA_PIXEL_MODE = 0;\n                    var MOUSE_DOM_DELTA_LINE_MODE = 1;\n                    var MOUSE_PIXELS_PER_LINE = 30;\n                    var MOUSE_LINES_PER_PAGE = 30;\n                    if (evt.deltaMode === MOUSE_DOM_DELTA_PIXEL_MODE) {\n                        delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;\n                    } else if (evt.deltaMode === MOUSE_DOM_DELTA_LINE_MODE) {\n                        delta /= MOUSE_LINES_PER_PAGE;\n                    }\n                    return delta;\n                }\n                function cloneObj(obj) {\n                    var result = Object.create(null);\n                    for (var i in obj) {\n                        if (Object.prototype.hasOwnProperty.call(obj, i)) {\n                            result[i] = obj[i];\n                        }\n                    }\n                    return result;\n                }\n                var animationStarted = new Promise(function (resolve) {\n                    window.requestAnimationFrame(resolve);\n                });\n                var mozL10n = void 0;\n                var localized = Promise.resolve();\n\n                var EventBus = function () {\n                    function EventBus() {\n                        _classCallCheck(this, EventBus);\n\n                        this._listeners = Object.create(null);\n                    }\n\n                    _createClass(EventBus, [{\n                        key: 'on',\n                        value: function on(eventName, listener) {\n                            var eventListeners = this._listeners[eventName];\n                            if (!eventListeners) {\n                                eventListeners = [];\n                                this._listeners[eventName] = eventListeners;\n                            }\n                            eventListeners.push(listener);\n                        }\n                    }, {\n                        key: 'off',\n                        value: function off(eventName, listener) {\n                            var eventListeners = this._listeners[eventName];\n                            var i = void 0;\n                            if (!eventListeners || (i = eventListeners.indexOf(listener)) < 0) {\n                                return;\n                            }\n                            eventListeners.splice(i, 1);\n                        }\n                    }, {\n                        key: 'dispatch',\n                        value: function dispatch(eventName) {\n                            var eventListeners = this._listeners[eventName];\n                            if (!eventListeners || eventListeners.length === 0) {\n                                return;\n                            }\n                            var args = Array.prototype.slice.call(arguments, 1);\n                            eventListeners.slice(0).forEach(function (listener) {\n                                listener.apply(null, args);\n                            });\n                        }\n                    }]);\n\n                    return EventBus;\n                }();\n\n                function clamp(v, min, max) {\n                    return Math.min(Math.max(v, min), max);\n                }\n\n                var ProgressBar = function () {\n                    function ProgressBar(id) {\n                        var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n                            height = _ref.height,\n                            width = _ref.width,\n                            units = _ref.units;\n\n                        _classCallCheck(this, ProgressBar);\n\n                        this.visible = true;\n                        this.div = document.querySelector(id + ' .progress');\n                        this.bar = this.div.parentNode;\n                        this.height = height || 100;\n                        this.width = width || 100;\n                        this.units = units || '%';\n                        this.div.style.height = this.height + this.units;\n                        this.percent = 0;\n                    }\n\n                    _createClass(ProgressBar, [{\n                        key: '_updateBar',\n                        value: function _updateBar() {\n                            if (this._indeterminate) {\n                                this.div.classList.add('indeterminate');\n                                this.div.style.width = this.width + this.units;\n                                return;\n                            }\n                            this.div.classList.remove('indeterminate');\n                            var progressSize = this.width * this._percent / 100;\n                            this.div.style.width = progressSize + this.units;\n                        }\n                    }, {\n                        key: 'setWidth',\n                        value: function setWidth(viewer) {\n                            if (!viewer) {\n                                return;\n                            }\n                            var container = viewer.parentNode;\n                            var scrollbarWidth = container.offsetWidth - viewer.offsetWidth;\n                            if (scrollbarWidth > 0) {\n                                this.bar.setAttribute('style', 'width: calc(100% - ' + scrollbarWidth + 'px);');\n                            }\n                        }\n                    }, {\n                        key: 'hide',\n                        value: function hide() {\n                            if (!this.visible) {\n                                return;\n                            }\n                            this.visible = false;\n                            this.bar.classList.add('hidden');\n                            document.body.classList.remove('loadingInProgress');\n                        }\n                    }, {\n                        key: 'show',\n                        value: function show() {\n                            if (this.visible) {\n                                return;\n                            }\n                            this.visible = true;\n                            document.body.classList.add('loadingInProgress');\n                            this.bar.classList.remove('hidden');\n                        }\n                    }, {\n                        key: 'percent',\n                        get: function get() {\n                            return this._percent;\n                        },\n                        set: function set(val) {\n                            this._indeterminate = isNaN(val);\n                            this._percent = clamp(val, 0, 100);\n                            this._updateBar();\n                        }\n                    }]);\n\n                    return ProgressBar;\n                }();\n\n                exports.CSS_UNITS = CSS_UNITS;\n                exports.DEFAULT_SCALE_VALUE = DEFAULT_SCALE_VALUE;\n                exports.DEFAULT_SCALE = DEFAULT_SCALE;\n                exports.MIN_SCALE = MIN_SCALE;\n                exports.MAX_SCALE = MAX_SCALE;\n                exports.UNKNOWN_SCALE = UNKNOWN_SCALE;\n                exports.MAX_AUTO_SCALE = MAX_AUTO_SCALE;\n                exports.SCROLLBAR_PADDING = SCROLLBAR_PADDING;\n                exports.VERTICAL_PADDING = VERTICAL_PADDING;\n                exports.cloneObj = cloneObj;\n                exports.RendererType = RendererType;\n                exports.mozL10n = mozL10n;\n                exports.NullL10n = NullL10n;\n                exports.EventBus = EventBus;\n                exports.ProgressBar = ProgressBar;\n                exports.getPDFFileNameFromURL = getPDFFileNameFromURL;\n                exports.noContextMenuHandler = noContextMenuHandler;\n                exports.parseQueryString = parseQueryString;\n                exports.getVisibleElements = getVisibleElements;\n                exports.roundToDivide = roundToDivide;\n                exports.approximateFraction = approximateFraction;\n                exports.getOutputScale = getOutputScale;\n                exports.scrollIntoView = scrollIntoView;\n                exports.watchScroll = watchScroll;\n                exports.binarySearchFirstItem = binarySearchFirstItem;\n                exports.normalizeWheelEventDelta = normalizeWheelEventDelta;\n                exports.animationStarted = animationStarted;\n                exports.localized = localized;\n\n                /***/\n            }),\n        /* 1 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                var pdfjsLib;\n                if (typeof window !== 'undefined' && window['pdfjs-dist/build/pdf']) {\n                    pdfjsLib = window['pdfjs-dist/build/pdf'];\n                } else {\n                    pdfjsLib = require('./' + link_diff + '/pdf/pdf.js');\n                }\n                module.exports = pdfjsLib;\n\n                /***/\n            }),\n        /* 2 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.getGlobalEventBus = exports.attachDOMEventsToEventBus = undefined;\n\n                var _ui_utils = __webpack_require__(0);\n\n                function attachDOMEventsToEventBus(eventBus) {\n                    eventBus.on('documentload', function () {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('documentload', true, true, {});\n                        window.dispatchEvent(event);\n                    });\n                    eventBus.on('pagerendered', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('pagerendered', true, true, {\n                            pageNumber: evt.pageNumber,\n                            cssTransform: evt.cssTransform\n                        });\n                        evt.source.div.dispatchEvent(event);\n                    });\n                    eventBus.on('textlayerrendered', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('textlayerrendered', true, true, { pageNumber: evt.pageNumber });\n                        evt.source.textLayerDiv.dispatchEvent(event);\n                    });\n                    eventBus.on('pagechange', function (evt) {\n                        var event = document.createEvent('UIEvents');\n                        event.initUIEvent('pagechange', true, true, window, 0);\n                        event.pageNumber = evt.pageNumber;\n                        evt.source.container.dispatchEvent(event);\n                    });\n                    eventBus.on('pagesinit', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('pagesinit', true, true, null);\n                        evt.source.container.dispatchEvent(event);\n                    });\n                    eventBus.on('pagesloaded', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('pagesloaded', true, true, { pagesCount: evt.pagesCount });\n                        evt.source.container.dispatchEvent(event);\n                    });\n                    eventBus.on('scalechange', function (evt) {\n                        var event = document.createEvent('UIEvents');\n                        event.initUIEvent('scalechange', true, true, window, 0);\n                        event.scale = evt.scale;\n                        event.presetValue = evt.presetValue;\n                        evt.source.container.dispatchEvent(event);\n                    });\n                    eventBus.on('updateviewarea', function (evt) {\n                        var event = document.createEvent('UIEvents');\n                        event.initUIEvent('updateviewarea', true, true, window, 0);\n                        event.location = evt.location;\n                        evt.source.container.dispatchEvent(event);\n                    });\n                    eventBus.on('find', function (evt) {\n                        if (evt.source === window) {\n                            return;\n                        }\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('find' + evt.type, true, true, {\n                            query: evt.query,\n                            phraseSearch: evt.phraseSearch,\n                            caseSensitive: evt.caseSensitive,\n                            highlightAll: evt.highlightAll,\n                            findPrevious: evt.findPrevious\n                        });\n                        window.dispatchEvent(event);\n                    });\n                    eventBus.on('attachmentsloaded', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('attachmentsloaded', true, true, { attachmentsCount: evt.attachmentsCount });\n                        evt.source.container.dispatchEvent(event);\n                    });\n                    eventBus.on('sidebarviewchanged', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('sidebarviewchanged', true, true, { view: evt.view });\n                        evt.source.outerContainer.dispatchEvent(event);\n                    });\n                    eventBus.on('pagemode', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('pagemode', true, true, { mode: evt.mode });\n                        evt.source.pdfViewer.container.dispatchEvent(event);\n                    });\n                    eventBus.on('namedaction', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('namedaction', true, true, { action: evt.action });\n                        evt.source.pdfViewer.container.dispatchEvent(event);\n                    });\n                    eventBus.on('presentationmodechanged', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('presentationmodechanged', true, true, {\n                            active: evt.active,\n                            switchInProgress: evt.switchInProgress\n                        });\n                        window.dispatchEvent(event);\n                    });\n                    eventBus.on('outlineloaded', function (evt) {\n                        var event = document.createEvent('CustomEvent');\n                        event.initCustomEvent('outlineloaded', true, true, { outlineCount: evt.outlineCount });\n                        evt.source.container.dispatchEvent(event);\n                    });\n                }\n                var globalEventBus = null;\n                function getGlobalEventBus() {\n                    if (globalEventBus) {\n                        return globalEventBus;\n                    }\n                    globalEventBus = new _ui_utils.EventBus();\n                    attachDOMEventsToEventBus(globalEventBus);\n                    return globalEventBus;\n                }\n                exports.attachDOMEventsToEventBus = attachDOMEventsToEventBus;\n                exports.getGlobalEventBus = getGlobalEventBus;\n\n                /***/\n            }),\n        /* 3 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var CLEANUP_TIMEOUT = 30000;\n                var RenderingStates = {\n                    INITIAL: 0,\n                    RUNNING: 1,\n                    PAUSED: 2,\n                    FINISHED: 3\n                };\n\n                var PDFRenderingQueue = function () {\n                    function PDFRenderingQueue() {\n                        _classCallCheck(this, PDFRenderingQueue);\n\n                        this.pdfViewer = null;\n                        this.pdfThumbnailViewer = null;\n                        this.onIdle = null;\n                        this.highestPriorityPage = null;\n                        this.idleTimeout = null;\n                        this.printing = false;\n                        this.isThumbnailViewEnabled = false;\n                    }\n\n                    _createClass(PDFRenderingQueue, [{\n                        key: \"setViewer\",\n                        value: function setViewer(pdfViewer) {\n                            this.pdfViewer = pdfViewer;\n                        }\n                    }, {\n                        key: \"setThumbnailViewer\",\n                        value: function setThumbnailViewer(pdfThumbnailViewer) {\n                            this.pdfThumbnailViewer = pdfThumbnailViewer;\n                        }\n                    }, {\n                        key: \"isHighestPriority\",\n                        value: function isHighestPriority(view) {\n                            return this.highestPriorityPage === view.renderingId;\n                        }\n                    }, {\n                        key: \"renderHighestPriority\",\n                        value: function renderHighestPriority(currentlyVisiblePages) {\n                            if (this.idleTimeout) {\n                                clearTimeout(this.idleTimeout);\n                                this.idleTimeout = null;\n                            }\n                            if (this.pdfViewer.forceRendering(currentlyVisiblePages)) {\n                                return;\n                            }\n                            if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) {\n                                if (this.pdfThumbnailViewer.forceRendering()) {\n                                    return;\n                                }\n                            }\n                            if (this.printing) {\n                                return;\n                            }\n                            if (this.onIdle) {\n                                this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);\n                            }\n                        }\n                    }, {\n                        key: \"getHighestPriority\",\n                        value: function getHighestPriority(visible, views, scrolledDown) {\n                            var visibleViews = visible.views;\n                            var numVisible = visibleViews.length;\n                            if (numVisible === 0) {\n                                return false;\n                            }\n                            for (var i = 0; i < numVisible; ++i) {\n                                var view = visibleViews[i].view;\n                                if (!this.isViewFinished(view)) {\n                                    return view;\n                                }\n                            }\n                            if (scrolledDown) {\n                                var nextPageIndex = visible.last.id;\n                                if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) {\n                                    return views[nextPageIndex];\n                                }\n                            } else {\n                                var previousPageIndex = visible.first.id - 2;\n                                if (views[previousPageIndex] && !this.isViewFinished(views[previousPageIndex])) {\n                                    return views[previousPageIndex];\n                                }\n                            }\n                            return null;\n                        }\n                    }, {\n                        key: \"isViewFinished\",\n                        value: function isViewFinished(view) {\n                            return view.renderingState === RenderingStates.FINISHED;\n                        }\n                    }, {\n                        key: \"renderView\",\n                        value: function renderView(view) {\n                            var _this = this;\n\n                            switch (view.renderingState) {\n                                case RenderingStates.FINISHED:\n                                    return false;\n                                case RenderingStates.PAUSED:\n                                    this.highestPriorityPage = view.renderingId;\n                                    view.resume();\n                                    break;\n                                case RenderingStates.RUNNING:\n                                    this.highestPriorityPage = view.renderingId;\n                                    break;\n                                case RenderingStates.INITIAL:\n                                    this.highestPriorityPage = view.renderingId;\n                                    var continueRendering = function continueRendering() {\n                                        _this.renderHighestPriority();\n                                    };\n                                    view.draw().then(continueRendering, continueRendering);\n                                    break;\n                            }\n                            return true;\n                        }\n                    }]);\n\n                    return PDFRenderingQueue;\n                }();\n\n                exports.RenderingStates = RenderingStates;\n                exports.PDFRenderingQueue = PDFRenderingQueue;\n\n                /***/\n            }),\n        /* 4 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFPrintServiceFactory = exports.DefaultExternalServices = exports.PDFViewerApplication = undefined;\n\n                var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                var _pdf_cursor_tools = __webpack_require__(6);\n\n                var _pdf_rendering_queue = __webpack_require__(3);\n\n                var _pdf_sidebar = __webpack_require__(24);\n\n                var _pdf_viewer = __webpack_require__(27);\n\n                var _dom_events = __webpack_require__(2);\n\n                var _overlay_manager = __webpack_require__(15);\n\n                var _password_prompt = __webpack_require__(16);\n\n                var _pdf_attachment_viewer = __webpack_require__(17);\n\n                var _pdf_document_properties = __webpack_require__(18);\n\n                var _pdf_find_bar = __webpack_require__(19);\n\n                var _pdf_find_controller = __webpack_require__(7);\n\n                var _pdf_history = __webpack_require__(20);\n\n                var _pdf_link_service = __webpack_require__(5);\n\n                var _pdf_outline_viewer = __webpack_require__(21);\n\n                var _pdf_presentation_mode = __webpack_require__(23);\n\n                var _pdf_thumbnail_viewer = __webpack_require__(26);\n\n                var _secondary_toolbar = __webpack_require__(29);\n\n                var _toolbar = __webpack_require__(31);\n\n                var _view_history = __webpack_require__(32);\n\n                var DEFAULT_SCALE_DELTA = 1.1;\n                var DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000;\n                function configure(PDFJS) {\n                    PDFJS.imageResourcesPath = \"./images/\";\n                    PDFJS.workerSrc = pdfScriptPath + \"/pdf.worker.js\";\n                    PDFJS.cMapUrl = pdfScriptPath + \"/cmaps/\";\n                    PDFJS.cMapPacked = true;\n                }\n                var DefaultExternalServices = {\n                    updateFindControlState: function updateFindControlState(data) { },\n                    initPassiveLoading: function initPassiveLoading(callbacks) { },\n                    fallback: function fallback(data, callback) { },\n                    reportTelemetry: function reportTelemetry(data) { },\n                    createDownloadManager: function createDownloadManager() {\n                        throw new Error('Not implemented: createDownloadManager');\n                    },\n                    createPreferences: function createPreferences() {\n                        throw new Error('Not implemented: createPreferences');\n                    },\n                    createL10n: function createL10n() {\n                        throw new Error('Not implemented: createL10n');\n                    },\n\n                    supportsIntegratedFind: false,\n                    supportsDocumentFonts: true,\n                    supportsDocumentColors: true,\n                    supportedMouseWheelZoomModifierKeys: {\n                        ctrlKey: true,\n                        metaKey: true\n                    }\n                };\n                var PDFViewerApplication = {\n                    initialBookmark: document.location.hash.substring(1),\n                    initialDestination: null,\n                    initialized: false,\n                    fellback: false,\n                    appConfig: null,\n                    pdfDocument: null,\n                    pdfLoadingTask: null,\n                    printService: null,\n                    pdfViewer: null,\n                    pdfThumbnailViewer: null,\n                    pdfRenderingQueue: null,\n                    pdfPresentationMode: null,\n                    pdfDocumentProperties: null,\n                    pdfLinkService: null,\n                    pdfHistory: null,\n                    pdfSidebar: null,\n                    pdfOutlineViewer: null,\n                    pdfAttachmentViewer: null,\n                    pdfCursorTools: null,\n                    store: null,\n                    downloadManager: null,\n                    overlayManager: null,\n                    preferences: null,\n                    toolbar: null,\n                    secondaryToolbar: null,\n                    eventBus: null,\n                    l10n: null,\n                    isInitialViewSet: false,\n                    downloadComplete: false,\n                    viewerPrefs: {\n                        sidebarViewOnLoad: _pdf_sidebar.SidebarView.NONE,\n                        pdfBugEnabled: false,\n                        showPreviousViewOnLoad: true,\n                        defaultZoomValue: '',\n                        disablePageMode: false,\n                        disablePageLabels: false,\n                        renderer: 'canvas',\n                        enhanceTextSelection: false,\n                        renderInteractiveForms: false,\n                        enablePrintAutoRotate: false\n                    },\n                    isViewerEmbedded: window.parent !== window,\n                    url: '',\n                    baseUrl: '',\n                    externalServices: DefaultExternalServices,\n                    _boundEvents: {},\n                    initialize: function initialize(appConfig) {\n                        var _this = this;\n\n                        this.preferences = this.externalServices.createPreferences();\n                        configure(_pdfjsLib.PDFJS);\n                        this.appConfig = appConfig;\n                        return this._readPreferences().then(function () {\n                            return _this._initializeL10n();\n                        }).then(function () {\n                            return _this._initializeViewerComponents();\n                        }).then(function () {\n                            _this.bindEvents();\n                            _this.bindWindowEvents();\n                            var appContainer = appConfig.appContainer || document.documentElement;\n                            _this.l10n.translate(appContainer).then(function () {\n                                _this.eventBus.dispatch('localized');\n                            });\n                            if (_this.isViewerEmbedded && !_pdfjsLib.PDFJS.isExternalLinkTargetSet()) {\n                                _pdfjsLib.PDFJS.externalLinkTarget = _pdfjsLib.PDFJS.LinkTarget.TOP;\n                            }\n                            _this.initialized = true;\n                        });\n                    },\n                    _readPreferences: function _readPreferences() {\n                        var preferences = this.preferences,\n                            viewerPrefs = this.viewerPrefs;\n\n                        return Promise.all([preferences.get('enableWebGL').then(function resolved(value) {\n                            _pdfjsLib.PDFJS.disableWebGL = !value;\n                        }), preferences.get('sidebarViewOnLoad').then(function resolved(value) {\n                            viewerPrefs['sidebarViewOnLoad'] = value;\n                        }), preferences.get('pdfBugEnabled').then(function resolved(value) {\n                            viewerPrefs['pdfBugEnabled'] = value;\n                        }), preferences.get('showPreviousViewOnLoad').then(function resolved(value) {\n                            viewerPrefs['showPreviousViewOnLoad'] = value;\n                        }), preferences.get('defaultZoomValue').then(function resolved(value) {\n                            viewerPrefs['defaultZoomValue'] = value;\n                        }), preferences.get('enhanceTextSelection').then(function resolved(value) {\n                            viewerPrefs['enhanceTextSelection'] = value;\n                        }), preferences.get('disableTextLayer').then(function resolved(value) {\n                            if (_pdfjsLib.PDFJS.disableTextLayer === true) {\n                                return;\n                            }\n                            _pdfjsLib.PDFJS.disableTextLayer = value;\n                        }), preferences.get('disableRange').then(function resolved(value) {\n                            if (_pdfjsLib.PDFJS.disableRange === true) {\n                                return;\n                            }\n                            _pdfjsLib.PDFJS.disableRange = value;\n                        }), preferences.get('disableStream').then(function resolved(value) {\n                            if (_pdfjsLib.PDFJS.disableStream === true) {\n                                return;\n                            }\n                            _pdfjsLib.PDFJS.disableStream = value;\n                        }), preferences.get('disableAutoFetch').then(function resolved(value) {\n                            _pdfjsLib.PDFJS.disableAutoFetch = value;\n                        }), preferences.get('disableFontFace').then(function resolved(value) {\n                            if (_pdfjsLib.PDFJS.disableFontFace === true) {\n                                return;\n                            }\n                            _pdfjsLib.PDFJS.disableFontFace = value;\n                        }), preferences.get('useOnlyCssZoom').then(function resolved(value) {\n                            _pdfjsLib.PDFJS.useOnlyCssZoom = value;\n                        }), preferences.get('externalLinkTarget').then(function resolved(value) {\n                            if (_pdfjsLib.PDFJS.isExternalLinkTargetSet()) {\n                                return;\n                            }\n                            _pdfjsLib.PDFJS.externalLinkTarget = value;\n                        }), preferences.get('renderer').then(function resolved(value) {\n                            viewerPrefs['renderer'] = value;\n                        }), preferences.get('renderInteractiveForms').then(function resolved(value) {\n                            viewerPrefs['renderInteractiveForms'] = value;\n                        }), preferences.get('disablePageMode').then(function resolved(value) {\n                            viewerPrefs['disablePageMode'] = value;\n                        }), preferences.get('disablePageLabels').then(function resolved(value) {\n                            viewerPrefs['disablePageLabels'] = value;\n                        }), preferences.get('enablePrintAutoRotate').then(function resolved(value) {\n                            viewerPrefs['enablePrintAutoRotate'] = value;\n                        })]).catch(function (reason) { });\n                    },\n                    _initializeL10n: function _initializeL10n() {\n                        if (this.viewerPrefs['pdfBugEnabled']) {\n                            var hash = document.location.hash.substring(1);\n                            var hashParams = (0, _ui_utils.parseQueryString)(hash);\n                            if ('locale' in hashParams) {\n                                _pdfjsLib.PDFJS.locale = hashParams['locale'];\n                            }\n                        }\n                        this.l10n = this.externalServices.createL10n();\n                        return this.l10n.getDirection().then(function (dir) {\n                            var orginalHtmlDir = $(\"#mainPdfWarrper\").attr(\"dir\");\n                            //console.log(\"orginal html dir: \" + orginalHtmlDir + \", new html dir: \" + dir)\n                            if (orginalHtmlDir !== undefined) {\n                                sessionStorage.setItem(\"o2h_orginal_html_dir\", orginalHtmlDir);\n                            } else {\n                                sessionStorage.setItem(\"o2h_orginal_html_dir\", \"\");\n                            }\n                            document.getElementById('mainPdfWarrper').dir = dir;\n                        });\n                    },\n                    _initializeViewerComponents: function _initializeViewerComponents() {\n                        var _this2 = this;\n\n                        var appConfig = this.appConfig;\n                        return new Promise(function (resolve, reject) {\n                            _this2.overlayManager = new _overlay_manager.OverlayManager();\n                            var eventBus = appConfig.eventBus || (0, _dom_events.getGlobalEventBus)();\n                            _this2.eventBus = eventBus;\n                            var pdfRenderingQueue = new _pdf_rendering_queue.PDFRenderingQueue();\n                            pdfRenderingQueue.onIdle = _this2.cleanup.bind(_this2);\n                            _this2.pdfRenderingQueue = pdfRenderingQueue;\n                            var pdfLinkService = new _pdf_link_service.PDFLinkService({ eventBus: eventBus });\n                            _this2.pdfLinkService = pdfLinkService;\n                            var downloadManager = _this2.externalServices.createDownloadManager();\n                            _this2.downloadManager = downloadManager;\n                            var container = appConfig.mainContainer;\n                            var viewer = appConfig.viewerContainer;\n                            _this2.pdfViewer = new _pdf_viewer.PDFViewer({\n                                container: container,\n                                viewer: viewer,\n                                eventBus: eventBus,\n                                renderingQueue: pdfRenderingQueue,\n                                linkService: pdfLinkService,\n                                downloadManager: downloadManager,\n                                renderer: _this2.viewerPrefs['renderer'],\n                                l10n: _this2.l10n,\n                                enhanceTextSelection: _this2.viewerPrefs['enhanceTextSelection'],\n                                renderInteractiveForms: _this2.viewerPrefs['renderInteractiveForms'],\n                                enablePrintAutoRotate: _this2.viewerPrefs['enablePrintAutoRotate']\n                            });\n                            pdfRenderingQueue.setViewer(_this2.pdfViewer);\n                            pdfLinkService.setViewer(_this2.pdfViewer);\n                            var thumbnailContainer = appConfig.sidebar.thumbnailView;\n                            _this2.pdfThumbnailViewer = new _pdf_thumbnail_viewer.PDFThumbnailViewer({\n                                container: thumbnailContainer,\n                                renderingQueue: pdfRenderingQueue,\n                                linkService: pdfLinkService,\n                                l10n: _this2.l10n\n                            });\n                            pdfRenderingQueue.setThumbnailViewer(_this2.pdfThumbnailViewer);\n                            _this2.pdfHistory = new _pdf_history.PDFHistory({\n                                linkService: pdfLinkService,\n                                eventBus: eventBus\n                            });\n                            pdfLinkService.setHistory(_this2.pdfHistory);\n                            _this2.findController = new _pdf_find_controller.PDFFindController({ pdfViewer: _this2.pdfViewer });\n                            _this2.findController.onUpdateResultsCount = function (matchCount) {\n                                if (_this2.supportsIntegratedFind) {\n                                    return;\n                                }\n                                _this2.findBar.updateResultsCount(matchCount);\n                            };\n                            _this2.findController.onUpdateState = function (state, previous, matchCount) {\n                                if (_this2.supportsIntegratedFind) {\n                                    _this2.externalServices.updateFindControlState({\n                                        result: state,\n                                        findPrevious: previous\n                                    });\n                                } else {\n                                    _this2.findBar.updateUIState(state, previous, matchCount);\n                                }\n                            };\n                            _this2.pdfViewer.setFindController(_this2.findController);\n                            var findBarConfig = Object.create(appConfig.findBar);\n                            findBarConfig.findController = _this2.findController;\n                            findBarConfig.eventBus = eventBus;\n                            _this2.findBar = new _pdf_find_bar.PDFFindBar(findBarConfig, _this2.l10n);\n                            _this2.pdfDocumentProperties = new _pdf_document_properties.PDFDocumentProperties(appConfig.pdfDocumentProperties, _this2.overlayManager, _this2.l10n);\n                            _this2.pdfCursorTools = new _pdf_cursor_tools.PDFCursorTools({\n                                container: container,\n                                eventBus: eventBus,\n                                preferences: _this2.preferences\n                            });\n                            _this2.toolbar = new _toolbar.Toolbar(appConfig.toolbar, container, eventBus, _this2.l10n);\n                            _this2.secondaryToolbar = new _secondary_toolbar.SecondaryToolbar(appConfig.secondaryToolbar, container, eventBus);\n                            if (_this2.supportsFullscreen) {\n                                _this2.pdfPresentationMode = new _pdf_presentation_mode.PDFPresentationMode({\n                                    container: container,\n                                    viewer: viewer,\n                                    pdfViewer: _this2.pdfViewer,\n                                    eventBus: eventBus,\n                                    contextMenuItems: appConfig.fullscreen\n                                });\n                            }\n                            _this2.passwordPrompt = new _password_prompt.PasswordPrompt(appConfig.passwordOverlay, _this2.overlayManager, _this2.l10n);\n                            _this2.pdfOutlineViewer = new _pdf_outline_viewer.PDFOutlineViewer({\n                                container: appConfig.sidebar.outlineView,\n                                eventBus: eventBus,\n                                linkService: pdfLinkService\n                            });\n                            _this2.pdfAttachmentViewer = new _pdf_attachment_viewer.PDFAttachmentViewer({\n                                container: appConfig.sidebar.attachmentsView,\n                                eventBus: eventBus,\n                                downloadManager: downloadManager\n                            });\n                            var sidebarConfig = Object.create(appConfig.sidebar);\n                            sidebarConfig.pdfViewer = _this2.pdfViewer;\n                            sidebarConfig.pdfThumbnailViewer = _this2.pdfThumbnailViewer;\n                            sidebarConfig.pdfOutlineViewer = _this2.pdfOutlineViewer;\n                            sidebarConfig.eventBus = eventBus;\n                            _this2.pdfSidebar = new _pdf_sidebar.PDFSidebar(sidebarConfig, _this2.l10n);\n                            _this2.pdfSidebar.onToggled = _this2.forceRendering.bind(_this2);\n                            resolve(undefined);\n                        });\n                    },\n                    run: function run(config) {\n                        this.initialize(config).then(webViewerInitialized);\n                    },\n                    zoomIn: function zoomIn(ticks) {\n                        var newScale = this.pdfViewer.currentScale;\n                        do {\n                            newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);\n                            newScale = Math.ceil(newScale * 10) / 10;\n                            newScale = Math.min(_ui_utils.MAX_SCALE, newScale);\n                        } while (--ticks > 0 && newScale < _ui_utils.MAX_SCALE);\n                        this.pdfViewer.currentScaleValue = newScale;\n                    },\n                    zoomOut: function zoomOut(ticks) {\n                        var newScale = this.pdfViewer.currentScale;\n                        do {\n                            newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);\n                            newScale = Math.floor(newScale * 10) / 10;\n                            newScale = Math.max(_ui_utils.MIN_SCALE, newScale);\n                        } while (--ticks > 0 && newScale > _ui_utils.MIN_SCALE);\n                        this.pdfViewer.currentScaleValue = newScale;\n                    },\n\n                    get pagesCount() {\n                        return this.pdfDocument ? this.pdfDocument.numPages : 0;\n                    },\n                    get pageRotation() {\n                        return this.pdfViewer.pagesRotation;\n                    },\n                    set page(val) {\n                        this.pdfViewer.currentPageNumber = val;\n                    },\n                    get page() {\n                        return this.pdfViewer.currentPageNumber;\n                    },\n                    get printing() {\n                        return !!this.printService;\n                    },\n                    get supportsPrinting() {\n                        return PDFPrintServiceFactory.instance.supportsPrinting;\n                    },\n                    get supportsFullscreen() {\n                        var support = void 0;\n                        var doc = document.documentElement;\n                        support = !!(doc.requestFullscreen || doc.mozRequestFullScreen || doc.webkitRequestFullScreen || doc.msRequestFullscreen);\n                        if (document.fullscreenEnabled === false || document.mozFullScreenEnabled === false || document.webkitFullscreenEnabled === false || document.msFullscreenEnabled === false) {\n                            support = false;\n                        }\n                        if (support && _pdfjsLib.PDFJS.disableFullscreen === true) {\n                            support = false;\n                        }\n                        return (0, _pdfjsLib.shadow)(this, 'supportsFullscreen', support);\n                    },\n                    get supportsIntegratedFind() {\n                        return this.externalServices.supportsIntegratedFind;\n                    },\n                    get supportsDocumentFonts() {\n                        return this.externalServices.supportsDocumentFonts;\n                    },\n                    get supportsDocumentColors() {\n                        return this.externalServices.supportsDocumentColors;\n                    },\n                    get loadingBar() {\n                        var bar = new _ui_utils.ProgressBar('#loadingBar');\n                        return (0, _pdfjsLib.shadow)(this, 'loadingBar', bar);\n                    },\n                    get supportedMouseWheelZoomModifierKeys() {\n                        return this.externalServices.supportedMouseWheelZoomModifierKeys;\n                    },\n                    initPassiveLoading: function initPassiveLoading() {\n                        throw new Error('Not implemented: initPassiveLoading');\n                    },\n                    setTitleUsingUrl: function setTitleUsingUrl(url) {\n                        this.url = url;\n                        this.baseUrl = url.split('#')[0];\n                        var title = (0, _ui_utils.getPDFFileNameFromURL)(url, '');\n                        if (!title) {\n                            try {\n                                title = decodeURIComponent((0, _pdfjsLib.getFilenameFromUrl)(url)) || url;\n                            } catch (ex) {\n                                title = url;\n                            }\n                        }\n                        this.setTitle(title);\n                    },\n                    setTitle: function setTitle(title) {\n                        if (this.isViewerEmbedded) {\n                            return;\n                        }\n                        document.title = title;\n                    },\n                    close: function close() {\n                        var errorWrapper = this.appConfig.errorWrapper.container;\n                        errorWrapper.setAttribute('hidden', 'true');\n                        if (!this.pdfLoadingTask) {\n                            return Promise.resolve();\n                        }\n                        var promise = this.pdfLoadingTask.destroy();\n                        this.pdfLoadingTask = null;\n                        if (this.pdfDocument) {\n                            this.pdfDocument = null;\n                            this.pdfThumbnailViewer.setDocument(null);\n                            this.pdfViewer.setDocument(null);\n                            this.pdfLinkService.setDocument(null, null);\n                            this.pdfDocumentProperties.setDocument(null, null);\n                        }\n                        this.store = null;\n                        this.isInitialViewSet = false;\n                        this.downloadComplete = false;\n                        this.pdfSidebar.reset();\n                        this.pdfOutlineViewer.reset();\n                        this.pdfAttachmentViewer.reset();\n                        this.findController.reset();\n                        this.findBar.reset();\n                        this.toolbar.reset();\n                        this.secondaryToolbar.reset();\n                        if (typeof PDFBug !== 'undefined') {\n                            PDFBug.cleanup();\n                        }\n                        return promise;\n                    },\n                    open: function open(file, args) {\n                        var _this3 = this;\n\n                        if (arguments.length > 2 || typeof args === 'number') {\n                            return Promise.reject(new Error('Call of open() with obsolete signature.'));\n                        }\n                        if (this.pdfLoadingTask) {\n                            return this.close().then(function () {\n                                _this3.preferences.reload();\n                                return _this3.open(file, args);\n                            });\n                        }\n                        var parameters = Object.create(null),\n                            scale = void 0;\n                        if (typeof file === 'string') {\n                            this.setTitleUsingUrl(file);\n                            parameters.url = file;\n                        } else if (file && 'byteLength' in file) {\n                            parameters.data = file;\n                        } else if (file.url && file.originalUrl) {\n                            this.setTitleUsingUrl(file.originalUrl);\n                            parameters.url = file.url;\n                        }\n                        if (args) {\n                            for (var prop in args) {\n                                parameters[prop] = args[prop];\n                            }\n                            if (args.scale) {\n                                scale = args.scale;\n                            }\n                            if (args.length) {\n                                this.pdfDocumentProperties.setFileSize(args.length);\n                            }\n                        }\n                        var loadingTask = (0, _pdfjsLib.getDocument)(parameters);\n                        this.pdfLoadingTask = loadingTask;\n                        loadingTask.onPassword = function (updateCallback, reason) {\n                            _this3.passwordPrompt.setUpdateCallback(updateCallback, reason);\n                            _this3.passwordPrompt.open();\n                        };\n                        loadingTask.onProgress = function (_ref) {\n                            var loaded = _ref.loaded,\n                                total = _ref.total;\n\n                            _this3.progress(loaded / total);\n                        };\n                        loadingTask.onUnsupportedFeature = this.fallback.bind(this);\n                        return loadingTask.promise.then(function (pdfDocument) {\n                            _this3.load(pdfDocument, scale);\n                        }, function (exception) {\n                            var message = exception && exception.message;\n                            var loadingErrorMessage = void 0;\n                            if (exception instanceof _pdfjsLib.InvalidPDFException) {\n                                loadingErrorMessage = _this3.l10n.get('invalid_file_error', null, 'Invalid or corrupted PDF file.');\n                            } else if (exception instanceof _pdfjsLib.MissingPDFException) {\n                                loadingErrorMessage = _this3.l10n.get('missing_file_error', null, 'Missing PDF file.');\n                            } else if (exception instanceof _pdfjsLib.UnexpectedResponseException) {\n                                loadingErrorMessage = _this3.l10n.get('unexpected_response_error', null, 'Unexpected server response.');\n                            } else {\n                                loadingErrorMessage = _this3.l10n.get('loading_error', null, 'An error occurred while loading the PDF.');\n                            }\n                            return loadingErrorMessage.then(function (msg) {\n                                _this3.error(msg, { message: message });\n                                throw new Error(msg);\n                            });\n                        });\n                    },\n                    download: function download() {\n                        var _this4 = this;\n\n                        function downloadByUrl() {\n                            downloadManager.downloadUrl(url, filename);\n                        }\n                        var url = this.baseUrl;\n                        var filename = (0, _ui_utils.getPDFFileNameFromURL)(this.url);\n                        var downloadManager = this.downloadManager;\n                        downloadManager.onerror = function (err) {\n                            _this4.error('PDF failed to download: ' + err);\n                        };\n                        if (!this.pdfDocument || !this.downloadComplete) {\n                            downloadByUrl();\n                            return;\n                        }\n                        this.pdfDocument.getData().then(function (data) {\n                            var blob = (0, _pdfjsLib.createBlob)(data, 'application/pdf');\n                            downloadManager.download(blob, url, filename);\n                        }).catch(downloadByUrl);\n                    },\n                    fallback: function fallback(featureId) { },\n                    error: function error(message, moreInfo) {\n                        var moreInfoText = [this.l10n.get('error_version_info', {\n                            version: _pdfjsLib.version || '?',\n                            build: _pdfjsLib.build || '?'\n                        }, 'PDF.js v{{version}} (build: {{build}})')];\n                        if (moreInfo) {\n                            moreInfoText.push(this.l10n.get('error_message', { message: moreInfo.message }, 'Message: {{message}}'));\n                            if (moreInfo.stack) {\n                                moreInfoText.push(this.l10n.get('error_stack', { stack: moreInfo.stack }, 'Stack: {{stack}}'));\n                            } else {\n                                if (moreInfo.filename) {\n                                    moreInfoText.push(this.l10n.get('error_file', { file: moreInfo.filename }, 'File: {{file}}'));\n                                }\n                                if (moreInfo.lineNumber) {\n                                    moreInfoText.push(this.l10n.get('error_line', { line: moreInfo.lineNumber }, 'Line: {{line}}'));\n                                }\n                            }\n                        }\n                        var errorWrapperConfig = this.appConfig.errorWrapper;\n                        var errorWrapper = errorWrapperConfig.container;\n                        errorWrapper.removeAttribute('hidden');\n                        var errorMessage = errorWrapperConfig.errorMessage;\n                        errorMessage.textContent = message;\n                        var closeButton = errorWrapperConfig.closeButton;\n                        closeButton.onclick = function () {\n                            errorWrapper.setAttribute('hidden', 'true');\n                        };\n                        var errorMoreInfo = errorWrapperConfig.errorMoreInfo;\n                        var moreInfoButton = errorWrapperConfig.moreInfoButton;\n                        var lessInfoButton = errorWrapperConfig.lessInfoButton;\n                        moreInfoButton.onclick = function () {\n                            errorMoreInfo.removeAttribute('hidden');\n                            moreInfoButton.setAttribute('hidden', 'true');\n                            lessInfoButton.removeAttribute('hidden');\n                            errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px';\n                        };\n                        lessInfoButton.onclick = function () {\n                            errorMoreInfo.setAttribute('hidden', 'true');\n                            moreInfoButton.removeAttribute('hidden');\n                            lessInfoButton.setAttribute('hidden', 'true');\n                        };\n                        moreInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler;\n                        lessInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler;\n                        closeButton.oncontextmenu = _ui_utils.noContextMenuHandler;\n                        moreInfoButton.removeAttribute('hidden');\n                        lessInfoButton.setAttribute('hidden', 'true');\n                        Promise.all(moreInfoText).then(function (parts) {\n                            errorMoreInfo.value = parts.join('\\n');\n                        });\n                    },\n                    progress: function progress(level) {\n                        var _this5 = this;\n\n                        if (this.downloadComplete) {\n                            return;\n                        }\n                        var percent = Math.round(level * 100);\n                        if (percent > this.loadingBar.percent || isNaN(percent)) {\n                            this.loadingBar.percent = percent;\n                            if (_pdfjsLib.PDFJS.disableAutoFetch && percent) {\n                                if (this.disableAutoFetchLoadingBarTimeout) {\n                                    clearTimeout(this.disableAutoFetchLoadingBarTimeout);\n                                    this.disableAutoFetchLoadingBarTimeout = null;\n                                }\n                                this.loadingBar.show();\n                                this.disableAutoFetchLoadingBarTimeout = setTimeout(function () {\n                                    _this5.loadingBar.hide();\n                                    _this5.disableAutoFetchLoadingBarTimeout = null;\n                                }, DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT);\n                            }\n                        }\n                    },\n                    load: function load(pdfDocument, scale) {\n                        var _this6 = this;\n\n                        scale = scale || _ui_utils.UNKNOWN_SCALE;\n                        this.pdfDocument = pdfDocument;\n                        pdfDocument.getDownloadInfo().then(function () {\n                            _this6.downloadComplete = true;\n                            _this6.loadingBar.hide();\n                            firstPagePromise.then(function () {\n                                _this6.eventBus.dispatch('documentload', { source: _this6 });\n                            });\n                        });\n                        var pageModePromise = pdfDocument.getPageMode().catch(function () { });\n                        this.toolbar.setPagesCount(pdfDocument.numPages, false);\n                        this.secondaryToolbar.setPagesCount(pdfDocument.numPages);\n                        var id = this.documentFingerprint = pdfDocument.fingerprint;\n                        var store = this.store = new _view_history.ViewHistory(id);\n                        var baseDocumentUrl = void 0;\n                        baseDocumentUrl = null;\n                        this.pdfLinkService.setDocument(pdfDocument, baseDocumentUrl);\n                        this.pdfDocumentProperties.setDocument(pdfDocument, this.url);\n                        var pdfViewer = this.pdfViewer;\n                        pdfViewer.setDocument(pdfDocument);\n                        var firstPagePromise = pdfViewer.firstPagePromise;\n                        var pagesPromise = pdfViewer.pagesPromise;\n                        var onePageRendered = pdfViewer.onePageRendered;\n                        var pdfThumbnailViewer = this.pdfThumbnailViewer;\n                        pdfThumbnailViewer.setDocument(pdfDocument);\n                        firstPagePromise.then(function (pdfPage) {\n                            _this6.loadingBar.setWidth(_this6.appConfig.viewerContainer);\n                            if (!_pdfjsLib.PDFJS.disableHistory && !_this6.isViewerEmbedded) {\n                                if (!_this6.viewerPrefs['showPreviousViewOnLoad']) {\n                                    _this6.pdfHistory.clearHistoryState();\n                                }\n                                _this6.pdfHistory.initialize(_this6.documentFingerprint);\n                                if (_this6.pdfHistory.initialDestination) {\n                                    _this6.initialDestination = _this6.pdfHistory.initialDestination;\n                                } else if (_this6.pdfHistory.initialBookmark) {\n                                    _this6.initialBookmark = _this6.pdfHistory.initialBookmark;\n                                }\n                            }\n                            var initialParams = {\n                                destination: _this6.initialDestination,\n                                bookmark: _this6.initialBookmark,\n                                hash: null\n                            };\n                            var storePromise = store.getMultiple({\n                                exists: false,\n                                page: '1',\n                                zoom: _ui_utils.DEFAULT_SCALE_VALUE,\n                                scrollLeft: '0',\n                                scrollTop: '0',\n                                sidebarView: _pdf_sidebar.SidebarView.NONE\n                            }).catch(function () { });\n                            Promise.all([storePromise, pageModePromise]).then(function (_ref2) {\n                                var _ref3 = _slicedToArray(_ref2, 2),\n                                    _ref3$ = _ref3[0],\n                                    values = _ref3$ === undefined ? {} : _ref3$,\n                                    pageMode = _ref3[1];\n\n                                var hash = _this6.viewerPrefs['defaultZoomValue'] ? 'zoom=' + _this6.viewerPrefs['defaultZoomValue'] : null;\n                                var sidebarView = _this6.viewerPrefs['sidebarViewOnLoad'];\n                                if (values.exists && _this6.viewerPrefs['showPreviousViewOnLoad']) {\n                                    hash = 'page=' + values.page + '&zoom=' + (_this6.viewerPrefs['defaultZoomValue'] || values.zoom) + ',' + values.scrollLeft + ',' + values.scrollTop;\n                                    sidebarView = sidebarView || values.sidebarView | 0;\n                                }\n                                if (pageMode && !_this6.viewerPrefs['disablePageMode']) {\n                                    sidebarView = sidebarView || apiPageModeToSidebarView(pageMode);\n                                }\n                                return {\n                                    hash: hash,\n                                    sidebarView: sidebarView\n                                };\n                            }).then(function (_ref4) {\n                                var hash = _ref4.hash,\n                                    sidebarView = _ref4.sidebarView;\n\n                                _this6.setInitialView(hash, {\n                                    sidebarView: sidebarView,\n                                    scale: scale\n                                });\n                                initialParams.hash = hash;\n                                if (!_this6.isViewerEmbedded) {\n                                    pdfViewer.focus();\n                                }\n                                return pagesPromise;\n                            }).then(function () {\n                                if (!initialParams.destination && !initialParams.bookmark && !initialParams.hash) {\n                                    return;\n                                }\n                                if (pdfViewer.hasEqualPageSizes) {\n                                    return;\n                                }\n                                _this6.initialDestination = initialParams.destination;\n                                _this6.initialBookmark = initialParams.bookmark;\n                                pdfViewer.currentScaleValue = pdfViewer.currentScaleValue;\n                                _this6.setInitialView(initialParams.hash);\n                            }).then(function () {\n                                pdfViewer.update();\n                            });\n                        });\n                        pdfDocument.getPageLabels().then(function (labels) {\n                            if (!labels || _this6.viewerPrefs['disablePageLabels']) {\n                                return;\n                            }\n                            var i = 0,\n                                numLabels = labels.length;\n                            if (numLabels !== _this6.pagesCount) {\n                                console.error('The number of Page Labels does not match ' + 'the number of pages in the document.');\n                                return;\n                            }\n                            while (i < numLabels && labels[i] === (i + 1).toString()) {\n                                i++;\n                            }\n                            if (i === numLabels) {\n                                return;\n                            }\n                            pdfViewer.setPageLabels(labels);\n                            pdfThumbnailViewer.setPageLabels(labels);\n                            _this6.toolbar.setPagesCount(pdfDocument.numPages, true);\n                            _this6.toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);\n                        });\n                        pagesPromise.then(function () {\n                            if (!_this6.supportsPrinting) {\n                                return;\n                            }\n                            pdfDocument.getJavaScript().then(function (javaScript) {\n                                if (javaScript.length) {\n                                    console.warn('Warning: JavaScript is not supported');\n                                    _this6.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.javaScript);\n                                }\n                                var regex = /\\bprint\\s*\\(/;\n                                for (var i = 0, ii = javaScript.length; i < ii; i++) {\n                                    var js = javaScript[i];\n                                    if (js && regex.test(js)) {\n                                        setTimeout(function () {\n                                            window.print();\n                                        });\n                                        return;\n                                    }\n                                }\n                            });\n                        });\n                        Promise.all([onePageRendered, _ui_utils.animationStarted]).then(function () {\n                            pdfDocument.getOutline().then(function (outline) {\n                                _this6.pdfOutlineViewer.render({ outline: outline });\n                            });\n                            pdfDocument.getAttachments().then(function (attachments) {\n                                _this6.pdfAttachmentViewer.render({ attachments: attachments });\n                            });\n                        });\n                        pdfDocument.getMetadata().then(function (_ref5) {\n                            var info = _ref5.info,\n                                metadata = _ref5.metadata;\n\n                            _this6.documentInfo = info;\n                            _this6.metadata = metadata;\n                            console.log('PDF ' + pdfDocument.fingerprint + ' [' + info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() + ' / ' + (info.Creator || '-').trim() + ']' + ' (PDF.js: ' + (_pdfjsLib.version || '-') + (!_pdfjsLib.PDFJS.disableWebGL ? ' [WebGL]' : '') + ')');\n                            var pdfTitle = void 0;\n                            if (metadata && metadata.has('dc:title')) {\n                                var title = metadata.get('dc:title');\n                                if (title !== 'Untitled') {\n                                    pdfTitle = title;\n                                }\n                            }\n                            if (!pdfTitle && info && info['Title']) {\n                                pdfTitle = info['Title'];\n                            }\n                            if (pdfTitle) {\n                                _this6.setTitle(pdfTitle + ' - ' + document.title);\n                            }\n                            if (info.IsAcroFormPresent) {\n                                console.warn('Warning: AcroForm/XFA is not supported');\n                                _this6.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.forms);\n                            }\n\n                        });\n                    },\n                    setInitialView: function setInitialView(storedHash) {\n                        var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                        var _options$scale = options.scale,\n                            scale = _options$scale === undefined ? 0 : _options$scale,\n                            _options$sidebarView = options.sidebarView,\n                            sidebarView = _options$sidebarView === undefined ? _pdf_sidebar.SidebarView.NONE : _options$sidebarView;\n\n                        this.isInitialViewSet = true;\n                        this.pdfSidebar.setInitialView(sidebarView);\n                        if (this.initialDestination) {\n                            this.pdfLinkService.navigateTo(this.initialDestination);\n                            this.initialDestination = null;\n                        } else if (this.initialBookmark) {\n                            this.pdfLinkService.setHash(this.initialBookmark);\n                            this.pdfHistory.push({ hash: this.initialBookmark }, true);\n                            this.initialBookmark = null;\n                        } else if (storedHash) {\n                            this.pdfLinkService.setHash(storedHash);\n                        } else if (scale) {\n                            this.pdfViewer.currentScaleValue = scale;\n                            this.page = 1;\n                        }\n                        this.toolbar.setPageNumber(this.pdfViewer.currentPageNumber, this.pdfViewer.currentPageLabel);\n                        this.secondaryToolbar.setPageNumber(this.pdfViewer.currentPageNumber);\n                        if (!this.pdfViewer.currentScaleValue) {\n                            this.pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;\n                        }\n                    },\n                    cleanup: function cleanup() {\n                        if (!this.pdfDocument) {\n                            return;\n                        }\n                        this.pdfViewer.cleanup();\n                        this.pdfThumbnailViewer.cleanup();\n                        if (this.pdfViewer.renderer !== _ui_utils.RendererType.SVG) {\n                            this.pdfDocument.cleanup();\n                        }\n                    },\n                    forceRendering: function forceRendering() {\n                        this.pdfRenderingQueue.printing = this.printing;\n                        this.pdfRenderingQueue.isThumbnailViewEnabled = this.pdfSidebar.isThumbnailViewVisible;\n                        this.pdfRenderingQueue.renderHighestPriority();\n                    },\n                    beforePrint: function beforePrint() {\n                        var _this7 = this;\n\n                        if (this.printService) {\n                            return;\n                        }\n                        if (!this.supportsPrinting) {\n                            this.l10n.get('printing_not_supported', null, 'Warning: Printing is not fully supported by ' + 'this browser.').then(function (printMessage) {\n                                _this7.error(printMessage);\n                            });\n                            return;\n                        }\n                        if (!this.pdfViewer.pageViewsReady) {\n                            this.l10n.get('printing_not_ready', null, 'Warning: The PDF is not fully loaded for printing.').then(function (notReadyMessage) {\n                                window.alert(notReadyMessage);\n                            });\n                            return;\n                        }\n                        var pagesOverview = this.pdfViewer.getPagesOverview();\n                        var printContainer = this.appConfig.printContainer;\n                        var printService = PDFPrintServiceFactory.instance.createPrintService(this.pdfDocument, pagesOverview, printContainer, this.l10n);\n                        this.printService = printService;\n                        this.forceRendering();\n                        printService.layout();\n                    },\n\n                    afterPrint: function pdfViewSetupAfterPrint() {\n                        if (this.printService) {\n                            this.printService.destroy();\n                            this.printService = null;\n                        }\n                        this.forceRendering();\n                    },\n                    rotatePages: function rotatePages(delta) {\n                        if (!this.pdfDocument) {\n                            return;\n                        }\n                        var pdfViewer = this.pdfViewer,\n                            pdfThumbnailViewer = this.pdfThumbnailViewer;\n\n                        var pageNumber = pdfViewer.currentPageNumber;\n                        var newRotation = (pdfViewer.pagesRotation + 360 + delta) % 360;\n                        pdfViewer.pagesRotation = newRotation;\n                        pdfThumbnailViewer.pagesRotation = newRotation;\n                        this.forceRendering();\n                        pdfViewer.currentPageNumber = pageNumber;\n                    },\n                    requestPresentationMode: function requestPresentationMode() {\n                        if (!this.pdfPresentationMode) {\n                            return;\n                        }\n                        this.pdfPresentationMode.request();\n                    },\n                    bindEvents: function bindEvents() {\n                        var eventBus = this.eventBus,\n                            _boundEvents = this._boundEvents;\n\n                        _boundEvents.beforePrint = this.beforePrint.bind(this);\n                        _boundEvents.afterPrint = this.afterPrint.bind(this);\n                        eventBus.on('resize', webViewerResize);\n                        eventBus.on('hashchange', webViewerHashchange);\n                        eventBus.on('beforeprint', _boundEvents.beforePrint);\n                        eventBus.on('afterprint', _boundEvents.afterPrint);\n                        eventBus.on('pagerendered', webViewerPageRendered);\n                        eventBus.on('textlayerrendered', webViewerTextLayerRendered);\n                        eventBus.on('updateviewarea', webViewerUpdateViewarea);\n                        eventBus.on('pagechanging', webViewerPageChanging);\n                        eventBus.on('scalechanging', webViewerScaleChanging);\n                        eventBus.on('sidebarviewchanged', webViewerSidebarViewChanged);\n                        eventBus.on('pagemode', webViewerPageMode);\n                        eventBus.on('namedaction', webViewerNamedAction);\n                        eventBus.on('presentationmodechanged', webViewerPresentationModeChanged);\n                        eventBus.on('presentationmode', webViewerPresentationMode);\n                        eventBus.on('openfile', webViewerOpenFile);\n                        eventBus.on('print', webViewerPrint);\n                        eventBus.on('download', webViewerDownload);\n                        eventBus.on('firstpage', webViewerFirstPage);\n                        eventBus.on('lastpage', webViewerLastPage);\n                        eventBus.on('nextpage', webViewerNextPage);\n                        eventBus.on('previouspage', webViewerPreviousPage);\n                        eventBus.on('zoomin', webViewerZoomIn);\n                        eventBus.on('zoomout', webViewerZoomOut);\n                        eventBus.on('pagenumberchanged', webViewerPageNumberChanged);\n                        eventBus.on('scalechanged', webViewerScaleChanged);\n                        eventBus.on('rotatecw', webViewerRotateCw);\n                        eventBus.on('rotateccw', webViewerRotateCcw);\n                        eventBus.on('documentproperties', webViewerDocumentProperties);\n                        eventBus.on('find', webViewerFind);\n                        eventBus.on('findfromurlhash', webViewerFindFromUrlHash);\n                        eventBus.on('fileinputchange', webViewerFileInputChange);\n                    },\n                    bindWindowEvents: function bindWindowEvents() {\n                        var eventBus = this.eventBus,\n                            _boundEvents = this._boundEvents;\n\n                        _boundEvents.windowResize = function () {\n                            eventBus.dispatch('resize');\n                        };\n                        _boundEvents.windowHashChange = function () {\n                            eventBus.dispatch('hashchange', { hash: document.location.hash.substring(1) });\n                        };\n                        _boundEvents.windowBeforePrint = function () {\n                            eventBus.dispatch('beforeprint');\n                        };\n                        _boundEvents.windowAfterPrint = function () {\n                            eventBus.dispatch('afterprint');\n                        };\n                        window.addEventListener('wheel', webViewerWheel);\n                        window.addEventListener('click', webViewerClick);\n                        window.addEventListener('keydown', webViewerKeyDown);\n                        window.addEventListener('resize', _boundEvents.windowResize);\n                        window.addEventListener('hashchange', _boundEvents.windowHashChange);\n                        window.addEventListener('beforeprint', _boundEvents.windowBeforePrint);\n                        window.addEventListener('afterprint', _boundEvents.windowAfterPrint);\n                        _boundEvents.windowChange = function (evt) {\n                            var files = evt.target.files;\n                            if (!files || files.length === 0) {\n                                return;\n                            }\n                            eventBus.dispatch('fileinputchange', { fileInput: evt.target });\n                        };\n                        window.addEventListener('change', _boundEvents.windowChange);\n                    },\n                    unbindEvents: function unbindEvents() {\n                        var eventBus = this.eventBus,\n                            _boundEvents = this._boundEvents;\n\n                        eventBus.off('resize', webViewerResize);\n                        eventBus.off('hashchange', webViewerHashchange);\n                        eventBus.off('beforeprint', _boundEvents.beforePrint);\n                        eventBus.off('afterprint', _boundEvents.afterPrint);\n                        eventBus.off('pagerendered', webViewerPageRendered);\n                        eventBus.off('textlayerrendered', webViewerTextLayerRendered);\n                        eventBus.off('updateviewarea', webViewerUpdateViewarea);\n                        eventBus.off('pagechanging', webViewerPageChanging);\n                        eventBus.off('scalechanging', webViewerScaleChanging);\n                        eventBus.off('sidebarviewchanged', webViewerSidebarViewChanged);\n                        eventBus.off('pagemode', webViewerPageMode);\n                        eventBus.off('namedaction', webViewerNamedAction);\n                        eventBus.off('presentationmodechanged', webViewerPresentationModeChanged);\n                        eventBus.off('presentationmode', webViewerPresentationMode);\n                        eventBus.off('openfile', webViewerOpenFile);\n                        eventBus.off('print', webViewerPrint);\n                        eventBus.off('download', webViewerDownload);\n                        eventBus.off('firstpage', webViewerFirstPage);\n                        eventBus.off('lastpage', webViewerLastPage);\n                        eventBus.off('nextpage', webViewerNextPage);\n                        eventBus.off('previouspage', webViewerPreviousPage);\n                        eventBus.off('zoomin', webViewerZoomIn);\n                        eventBus.off('zoomout', webViewerZoomOut);\n                        eventBus.off('pagenumberchanged', webViewerPageNumberChanged);\n                        eventBus.off('scalechanged', webViewerScaleChanged);\n                        eventBus.off('rotatecw', webViewerRotateCw);\n                        eventBus.off('rotateccw', webViewerRotateCcw);\n                        eventBus.off('documentproperties', webViewerDocumentProperties);\n                        eventBus.off('find', webViewerFind);\n                        eventBus.off('findfromurlhash', webViewerFindFromUrlHash);\n                        eventBus.off('fileinputchange', webViewerFileInputChange);\n                        _boundEvents.beforePrint = null;\n                        _boundEvents.afterPrint = null;\n                    },\n                    unbindWindowEvents: function unbindWindowEvents() {\n                        var _boundEvents = this._boundEvents;\n\n                        window.removeEventListener('wheel', webViewerWheel);\n                        window.removeEventListener('click', webViewerClick);\n                        window.removeEventListener('keydown', webViewerKeyDown);\n                        window.removeEventListener('resize', _boundEvents.windowResize);\n                        window.removeEventListener('hashchange', _boundEvents.windowHashChange);\n                        window.removeEventListener('beforeprint', _boundEvents.windowBeforePrint);\n                        window.removeEventListener('afterprint', _boundEvents.windowAfterPrint);\n                        window.removeEventListener('change', _boundEvents.windowChange);\n                        _boundEvents.windowChange = null;\n                        _boundEvents.windowResize = null;\n                        _boundEvents.windowHashChange = null;\n                        _boundEvents.windowBeforePrint = null;\n                        _boundEvents.windowAfterPrint = null;\n                    }\n                };\n                var validateFileURL = void 0;\n                {\n                    var HOSTED_VIEWER_ORIGINS = ['null', 'http://mozilla.github.io', 'https://mozilla.github.io'];\n                    validateFileURL = function validateFileURL(file) {\n                        if (file === undefined) {\n                            return;\n                        }\n                        try {\n                            var viewerOrigin = new URL(window.location.href).origin || 'null';\n                            if (HOSTED_VIEWER_ORIGINS.indexOf(viewerOrigin) >= 0) {\n                                return;\n                            }\n                            var fileOrigin = new URL(file, window.location.href).origin;\n                            if (fileOrigin !== viewerOrigin) {\n                                throw new Error('file origin does not match viewer\\'s');\n                            }\n                        } catch (ex) {\n                            var message = ex && ex.message;\n                            PDFViewerApplication.l10n.get('loading_error', null, 'An error occurred while loading the PDF.').then(function (loadingErrorMessage) {\n                                PDFViewerApplication.error(loadingErrorMessage, { message: message });\n                            });\n                            throw ex;\n                        }\n                    };\n                }\n                function loadAndEnablePDFBug(enabledTabs) {\n                    return new Promise(function (resolve, reject) {\n                        var appConfig = PDFViewerApplication.appConfig;\n                        var script = document.createElement('script');\n                        script.src = appConfig.debuggerScriptPath;\n                        script.onload = function () {\n                            PDFBug.enable(enabledTabs);\n                            PDFBug.init({\n                                PDFJS: _pdfjsLib.PDFJS,\n                                OPS: _pdfjsLib.OPS\n                            }, appConfig.mainContainer);\n                            resolve();\n                        };\n                        script.onerror = function () {\n                            reject(new Error('Cannot load debugger at ' + script.src));\n                        };\n                        (document.getElementsByTagName('head')[0] || document.body).appendChild(script);\n                    });\n                }\n                function webViewerInitialized() {\n                    var appConfig = PDFViewerApplication.appConfig;\n                    var file = void 0;\n                    var queryString = document.location.search.substring(1);\n                    var params = (0, _ui_utils.parseQueryString)(queryString);\n                    file = 'file' in params ? params.file : appConfig.defaultUrl;\n                    validateFileURL(file);\n                    var waitForBeforeOpening = [];\n                    var fileInput = document.createElement('input');\n                    fileInput.id = appConfig.openFileInputName;\n                    fileInput.className = 'fileInput';\n                    fileInput.setAttribute('type', 'file');\n                    fileInput.oncontextmenu = _ui_utils.noContextMenuHandler;\n                    document.body.appendChild(fileInput);\n                    if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {\n                        appConfig.toolbar.openFile.setAttribute('hidden', 'true');\n                        appConfig.secondaryToolbar.openFileButton.setAttribute('hidden', 'true');\n                    } else {\n                        fileInput.value = null;\n                    }\n                    if (PDFViewerApplication.viewerPrefs['pdfBugEnabled']) {\n                        var hash = document.location.hash.substring(1);\n                        var hashParams = (0, _ui_utils.parseQueryString)(hash);\n                        if ('disableworker' in hashParams) {\n                            pdfjsLib.PDFJS.disableWorker = hashParams['disableworker'] === 'true';\n                        }\n                        if ('disablerange' in hashParams) {\n                            _pdfjsLib.PDFJS.disableRange = hashParams['disablerange'] === 'true';\n                        }\n                        if ('disablestream' in hashParams) {\n                            _pdfjsLib.PDFJS.disableStream = hashParams['disablestream'] === 'true';\n                        }\n                        if ('disableautofetch' in hashParams) {\n                            _pdfjsLib.PDFJS.disableAutoFetch = hashParams['disableautofetch'] === 'true';\n                        }\n                        if ('disablefontface' in hashParams) {\n                            _pdfjsLib.PDFJS.disableFontFace = hashParams['disablefontface'] === 'true';\n                        }\n                        if ('disablehistory' in hashParams) {\n                            _pdfjsLib.PDFJS.disableHistory = hashParams['disablehistory'] === 'true';\n                        }\n                        if ('webgl' in hashParams) {\n                            _pdfjsLib.PDFJS.disableWebGL = hashParams['webgl'] !== 'true';\n                        }\n                        if ('useonlycsszoom' in hashParams) {\n                            _pdfjsLib.PDFJS.useOnlyCssZoom = hashParams['useonlycsszoom'] === 'true';\n                        }\n                        if ('verbosity' in hashParams) {\n                            _pdfjsLib.PDFJS.verbosity = hashParams['verbosity'] | 0;\n                        }\n                        if ('ignorecurrentpositiononzoom' in hashParams) {\n                            _pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom = hashParams['ignorecurrentpositiononzoom'] === 'true';\n                        }\n                        if ('textlayer' in hashParams) {\n                            switch (hashParams['textlayer']) {\n                                case 'off':\n                                    _pdfjsLib.PDFJS.disableTextLayer = true;\n                                    break;\n                                case 'visible':\n                                case 'shadow':\n                                case 'hover':\n                                    var viewer = appConfig.viewerContainer;\n                                    viewer.classList.add('textLayer-' + hashParams['textlayer']);\n                                    break;\n                            }\n                        }\n                        if ('pdfbug' in hashParams) {\n                            _pdfjsLib.PDFJS.pdfBug = true;\n                            var pdfBug = hashParams['pdfbug'];\n                            var enabled = pdfBug.split(',');\n                            waitForBeforeOpening.push(loadAndEnablePDFBug(enabled));\n                        }\n                    }\n                    if (!PDFViewerApplication.supportsPrinting) {\n                        appConfig.toolbar.print.classList.add('hidden');\n                        appConfig.secondaryToolbar.printButton.classList.add('hidden');\n                    }\n                    if (!PDFViewerApplication.supportsFullscreen) {\n                        appConfig.toolbar.presentationModeButton.classList.add('hidden');\n                        appConfig.secondaryToolbar.presentationModeButton.classList.add('hidden');\n                    }\n                    if (PDFViewerApplication.supportsIntegratedFind) {\n                        appConfig.toolbar.viewFind.classList.add('hidden');\n                    }\n                    appConfig.sidebar.mainContainer.addEventListener('transitionend', function (evt) {\n                        if (evt.target === this) {\n                            PDFViewerApplication.eventBus.dispatch('resize');\n                        }\n                    }, true);\n                    appConfig.sidebar.toggleButton.addEventListener('click', function () {\n                        PDFViewerApplication.pdfSidebar.toggle();\n                    });\n                    Promise.all(waitForBeforeOpening).then(function () {\n                        webViewerOpenFileViaURL(file);\n                    }).catch(function (reason) {\n                        PDFViewerApplication.l10n.get('loading_error', null, 'An error occurred while opening.').then(function (msg) {\n                            PDFViewerApplication.error(msg, reason);\n                        });\n                    });\n                }\n                var webViewerOpenFileViaURL = void 0;\n                {\n                    webViewerOpenFileViaURL = function webViewerOpenFileViaURL(file) {\n                        if (file && file.lastIndexOf('file:', 0) === 0) {\n                            PDFViewerApplication.setTitleUsingUrl(file);\n                            var xhr = new XMLHttpRequest();\n                            xhr.onload = function () {\n                                PDFViewerApplication.open(new Uint8Array(xhr.response));\n                            };\n                            try {\n                                xhr.open('GET', file);\n                                xhr.responseType = 'arraybuffer';\n                                xhr.send();\n                            } catch (ex) {\n                                PDFViewerApplication.l10n.get('loading_error', null, 'An error occurred while loading the PDF.').then(function (msg) {\n                                    PDFViewerApplication.error(msg, ex);\n                                });\n                            }\n                            return;\n                        }\n                        if (file) {\n                            PDFViewerApplication.open(file);\n                        }\n                    };\n                }\n                function webViewerPageRendered(evt) {\n                    var pageNumber = evt.pageNumber;\n                    var pageIndex = pageNumber - 1;\n                    var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex);\n                    if (pageNumber === PDFViewerApplication.page) {\n                        PDFViewerApplication.toolbar.updateLoadingIndicatorState(false);\n                    }\n                    if (!pageView) {\n                        return;\n                    }\n                    if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {\n                        var thumbnailView = PDFViewerApplication.pdfThumbnailViewer.getThumbnail(pageIndex);\n                        thumbnailView.setImage(pageView);\n                    }\n                    if (_pdfjsLib.PDFJS.pdfBug && Stats.enabled && pageView.stats) {\n                        Stats.add(pageNumber, pageView.stats);\n                    }\n                    if (pageView.error) {\n                        PDFViewerApplication.l10n.get('rendering_error', null, 'An error occurred while rendering the page.').then(function (msg) {\n                            PDFViewerApplication.error(msg, pageView.error);\n                        });\n                    }\n                }\n                function webViewerTextLayerRendered(evt) { }\n                function webViewerPageMode(evt) {\n                    var mode = evt.mode,\n                        view = void 0;\n                    switch (mode) {\n                        case 'thumbs':\n                            view = _pdf_sidebar.SidebarView.THUMBS;\n                            break;\n                        case 'bookmarks':\n                        case 'outline':\n                            view = _pdf_sidebar.SidebarView.OUTLINE;\n                            break;\n                        case 'attachments':\n                            view = _pdf_sidebar.SidebarView.ATTACHMENTS;\n                            break;\n                        case 'none':\n                            view = _pdf_sidebar.SidebarView.NONE;\n                            break;\n                        default:\n                            console.error('Invalid \"pagemode\" hash parameter: ' + mode);\n                            return;\n                    }\n                    PDFViewerApplication.pdfSidebar.switchView(view, true);\n                }\n                function webViewerNamedAction(evt) {\n                    var action = evt.action;\n                    switch (action) {\n                        case 'GoToPage':\n                            PDFViewerApplication.appConfig.toolbar.pageNumber.select();\n                            break;\n                        case 'Find':\n                            if (!PDFViewerApplication.supportsIntegratedFind) {\n                                PDFViewerApplication.findBar.toggle();\n                            }\n                            break;\n                    }\n                }\n                function webViewerPresentationModeChanged(evt) {\n                    var active = evt.active,\n                        switchInProgress = evt.switchInProgress;\n\n                    PDFViewerApplication.pdfViewer.presentationModeState = switchInProgress ? _pdf_viewer.PresentationModeState.CHANGING : active ? _pdf_viewer.PresentationModeState.FULLSCREEN : _pdf_viewer.PresentationModeState.NORMAL;\n                }\n                function webViewerSidebarViewChanged(evt) {\n                    PDFViewerApplication.pdfRenderingQueue.isThumbnailViewEnabled = PDFViewerApplication.pdfSidebar.isThumbnailViewVisible;\n                    var store = PDFViewerApplication.store;\n                    if (store && PDFViewerApplication.isInitialViewSet) {\n                        store.set('sidebarView', evt.view).catch(function () { });\n                    }\n                }\n                function webViewerUpdateViewarea(evt) {\n                    var location = evt.location,\n                        store = PDFViewerApplication.store;\n                    if (store && PDFViewerApplication.isInitialViewSet) {\n                        store.setMultiple({\n                            'exists': true,\n                            'page': location.pageNumber,\n                            'zoom': location.scale,\n                            'scrollLeft': location.left,\n                            'scrollTop': location.top\n                        }).catch(function () { });\n                    }\n                    var href = PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams);\n                    PDFViewerApplication.appConfig.toolbar.viewBookmark.href = href;\n                    PDFViewerApplication.appConfig.secondaryToolbar.viewBookmarkButton.href = href;\n                    PDFViewerApplication.pdfHistory.updateCurrentBookmark(location.pdfOpenParams, location.pageNumber);\n                    var currentPage = PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1);\n                    var loading = currentPage.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED;\n                    PDFViewerApplication.toolbar.updateLoadingIndicatorState(loading);\n                }\n                function webViewerResize() {\n                    var pdfDocument = PDFViewerApplication.pdfDocument,\n                        pdfViewer = PDFViewerApplication.pdfViewer;\n\n                    if (!pdfDocument) {\n                        return;\n                    }\n                    var currentScaleValue = pdfViewer.currentScaleValue;\n                    if (currentScaleValue === 'auto' || currentScaleValue === 'page-fit' || currentScaleValue === 'page-width') {\n                        pdfViewer.currentScaleValue = currentScaleValue;\n                    }\n                    pdfViewer.update();\n                }\n                function webViewerHashchange(evt) {\n                    if (PDFViewerApplication.pdfHistory.isHashChangeUnlocked) {\n                        var hash = evt.hash;\n                        if (!hash) {\n                            return;\n                        }\n                        if (!PDFViewerApplication.isInitialViewSet) {\n                            PDFViewerApplication.initialBookmark = hash;\n                        } else {\n                            PDFViewerApplication.pdfLinkService.setHash(hash);\n                        }\n                    }\n                }\n                var webViewerFileInputChange = void 0;\n                {\n                    webViewerFileInputChange = function webViewerFileInputChange(evt) {\n                        var file = evt.fileInput.files[0];\n                        if (!_pdfjsLib.PDFJS.disableCreateObjectURL && URL.createObjectURL) {\n                            PDFViewerApplication.open(URL.createObjectURL(file));\n                        } else {\n                            var fileReader = new FileReader();\n                            fileReader.onload = function webViewerChangeFileReaderOnload(evt) {\n                                var buffer = evt.target.result;\n                                PDFViewerApplication.open(new Uint8Array(buffer));\n                            };\n                            fileReader.readAsArrayBuffer(file);\n                        }\n                        PDFViewerApplication.setTitleUsingUrl(file.name);\n                        var appConfig = PDFViewerApplication.appConfig;\n                        appConfig.toolbar.viewBookmark.setAttribute('hidden', 'true');\n                        appConfig.secondaryToolbar.viewBookmarkButton.setAttribute('hidden', 'true');\n                        appConfig.toolbar.download.setAttribute('hidden', 'true');\n                        appConfig.secondaryToolbar.downloadButton.setAttribute('hidden', 'true');\n                    };\n                }\n                function webViewerPresentationMode() {\n                    PDFViewerApplication.requestPresentationMode();\n                }\n                function webViewerOpenFile() {\n                    var openFileInputName = PDFViewerApplication.appConfig.openFileInputName;\n                    document.getElementById(openFileInputName).click();\n                }\n                function webViewerPrint() {\n                    window.print();\n                }\n                function webViewerDownload() {\n                    PDFViewerApplication.download();\n                }\n                function webViewerFirstPage() {\n                    if (PDFViewerApplication.pdfDocument) {\n                        PDFViewerApplication.page = 1;\n                    }\n                }\n                function webViewerLastPage() {\n                    if (PDFViewerApplication.pdfDocument) {\n                        PDFViewerApplication.page = PDFViewerApplication.pagesCount;\n                    }\n                }\n                function webViewerNextPage() {\n                    PDFViewerApplication.page++;\n                }\n                function webViewerPreviousPage() {\n                    PDFViewerApplication.page--;\n                }\n                function webViewerZoomIn() {\n                    PDFViewerApplication.zoomIn();\n                }\n                function webViewerZoomOut() {\n                    PDFViewerApplication.zoomOut();\n                }\n                function webViewerPageNumberChanged(evt) {\n                    var pdfViewer = PDFViewerApplication.pdfViewer;\n                    pdfViewer.currentPageLabel = evt.value;\n                    if (evt.value !== pdfViewer.currentPageNumber.toString() && evt.value !== pdfViewer.currentPageLabel) {\n                        PDFViewerApplication.toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);\n                    }\n                }\n                function webViewerScaleChanged(evt) {\n                    PDFViewerApplication.pdfViewer.currentScaleValue = evt.value;\n                }\n                function webViewerRotateCw() {\n                    PDFViewerApplication.rotatePages(90);\n                }\n                function webViewerRotateCcw() {\n                    PDFViewerApplication.rotatePages(-90);\n                }\n                function webViewerDocumentProperties() {\n                    PDFViewerApplication.pdfDocumentProperties.open();\n                }\n                function webViewerFind(evt) {\n                    PDFViewerApplication.findController.executeCommand('find' + evt.type, {\n                        query: evt.query,\n                        phraseSearch: evt.phraseSearch,\n                        caseSensitive: evt.caseSensitive,\n                        highlightAll: evt.highlightAll,\n                        findPrevious: evt.findPrevious\n                    });\n                }\n                function webViewerFindFromUrlHash(evt) {\n                    PDFViewerApplication.findController.executeCommand('find', {\n                        query: evt.query,\n                        phraseSearch: evt.phraseSearch,\n                        caseSensitive: false,\n                        highlightAll: true,\n                        findPrevious: false\n                    });\n                }\n                function webViewerScaleChanging(evt) {\n                    PDFViewerApplication.toolbar.setPageScale(evt.presetValue, evt.scale);\n                    PDFViewerApplication.pdfViewer.update();\n                }\n                function webViewerPageChanging(evt) {\n                    var page = evt.pageNumber;\n                    PDFViewerApplication.toolbar.setPageNumber(page, evt.pageLabel || null);\n                    PDFViewerApplication.secondaryToolbar.setPageNumber(page);\n                    if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {\n                        PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(page);\n                    }\n                    if (_pdfjsLib.PDFJS.pdfBug && Stats.enabled) {\n                        var pageView = PDFViewerApplication.pdfViewer.getPageView(page - 1);\n                        if (pageView.stats) {\n                            Stats.add(page, pageView.stats);\n                        }\n                    }\n                }\n                var zoomDisabled = false,\n                    zoomDisabledTimeout = void 0;\n                function webViewerWheel(evt) {\n                    var pdfViewer = PDFViewerApplication.pdfViewer;\n                    if (pdfViewer.isInPresentationMode) {\n                        return;\n                    }\n                    if (evt.ctrlKey || evt.metaKey) {\n                        var support = PDFViewerApplication.supportedMouseWheelZoomModifierKeys;\n                        if (evt.ctrlKey && !support.ctrlKey || evt.metaKey && !support.metaKey) {\n                            return;\n                        }\n                        evt.preventDefault();\n                        if (zoomDisabled) {\n                            return;\n                        }\n                        var previousScale = pdfViewer.currentScale;\n                        var delta = (0, _ui_utils.normalizeWheelEventDelta)(evt);\n                        var MOUSE_WHEEL_DELTA_PER_PAGE_SCALE = 3.0;\n                        var ticks = delta * MOUSE_WHEEL_DELTA_PER_PAGE_SCALE;\n                        if (ticks < 0) {\n                            PDFViewerApplication.zoomOut(-ticks);\n                        } else {\n                            PDFViewerApplication.zoomIn(ticks);\n                        }\n                        var currentScale = pdfViewer.currentScale;\n                        if (previousScale !== currentScale) {\n                            var scaleCorrectionFactor = currentScale / previousScale - 1;\n                            var rect = pdfViewer.container.getBoundingClientRect();\n                            var dx = evt.clientX - rect.left;\n                            var dy = evt.clientY - rect.top;\n                            pdfViewer.container.scrollLeft += dx * scaleCorrectionFactor;\n                            pdfViewer.container.scrollTop += dy * scaleCorrectionFactor;\n                        }\n                    } else {\n                        zoomDisabled = true;\n                        clearTimeout(zoomDisabledTimeout);\n                        zoomDisabledTimeout = setTimeout(function () {\n                            zoomDisabled = false;\n                        }, 1000);\n                    }\n                }\n                function webViewerClick(evt) {\n                    if (!PDFViewerApplication.secondaryToolbar.isOpen) {\n                        return;\n                    }\n                    var appConfig = PDFViewerApplication.appConfig;\n                    if (PDFViewerApplication.pdfViewer.containsElement(evt.target) || appConfig.toolbar.container.contains(evt.target) && evt.target !== appConfig.secondaryToolbar.toggleButton) {\n                        PDFViewerApplication.secondaryToolbar.close();\n                    }\n                }\n                function webViewerKeyDown(evt) {\n                    if (PDFViewerApplication.overlayManager.active) {\n                        return;\n                    }\n                    var handled = false,\n                        ensureViewerFocused = false;\n                    var cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0);\n                    var pdfViewer = PDFViewerApplication.pdfViewer;\n                    var isViewerInPresentationMode = pdfViewer && pdfViewer.isInPresentationMode;\n                    if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {\n                        switch (evt.keyCode) {\n                            case 70:\n                                if (!PDFViewerApplication.supportsIntegratedFind) {\n                                    PDFViewerApplication.findBar.open();\n                                    handled = true;\n                                }\n                                break;\n                            case 71:\n                                if (!PDFViewerApplication.supportsIntegratedFind) {\n                                    var findState = PDFViewerApplication.findController.state;\n                                    if (findState) {\n                                        PDFViewerApplication.findController.executeCommand('findagain', {\n                                            query: findState.query,\n                                            phraseSearch: findState.phraseSearch,\n                                            caseSensitive: findState.caseSensitive,\n                                            highlightAll: findState.highlightAll,\n                                            findPrevious: cmd === 5 || cmd === 12\n                                        });\n                                    }\n                                    handled = true;\n                                }\n                                break;\n                            case 61:\n                            case 107:\n                            case 187:\n                            case 171:\n                                if (!isViewerInPresentationMode) {\n                                    PDFViewerApplication.zoomIn();\n                                }\n                                handled = true;\n                                break;\n                            case 173:\n                            case 109:\n                            case 189:\n                                if (!isViewerInPresentationMode) {\n                                    PDFViewerApplication.zoomOut();\n                                }\n                                handled = true;\n                                break;\n                            case 48:\n                            case 96:\n                                if (!isViewerInPresentationMode) {\n                                    setTimeout(function () {\n                                        pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;\n                                    });\n                                    handled = false;\n                                }\n                                break;\n                            case 38:\n                                if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {\n                                    PDFViewerApplication.page = 1;\n                                    handled = true;\n                                    ensureViewerFocused = true;\n                                }\n                                break;\n                            case 40:\n                                if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) {\n                                    PDFViewerApplication.page = PDFViewerApplication.pagesCount;\n                                    handled = true;\n                                    ensureViewerFocused = true;\n                                }\n                                break;\n                        }\n                    }\n                    if (cmd === 1 || cmd === 8) {\n                        switch (evt.keyCode) {\n                            case 83:\n                                PDFViewerApplication.download();\n                                handled = true;\n                                break;\n                        }\n                    }\n                    if (cmd === 3 || cmd === 10) {\n                        switch (evt.keyCode) {\n                            case 80:\n                                PDFViewerApplication.requestPresentationMode();\n                                handled = true;\n                                break;\n                            case 71:\n                                PDFViewerApplication.appConfig.toolbar.pageNumber.select();\n                                handled = true;\n                                break;\n                        }\n                    }\n                    if (handled) {\n                        if (ensureViewerFocused && !isViewerInPresentationMode) {\n                            pdfViewer.focus();\n                        }\n                        evt.preventDefault();\n                        return;\n                    }\n                    var curElement = document.activeElement || document.querySelector(':focus');\n                    var curElementTagName = curElement && curElement.tagName.toUpperCase();\n                    if (curElementTagName === 'INPUT' || curElementTagName === 'TEXTAREA' || curElementTagName === 'SELECT') {\n                        if (evt.keyCode !== 27) {\n                            return;\n                        }\n                    }\n                    if (cmd === 0) {\n                        switch (evt.keyCode) {\n                            case 38:\n                            case 33:\n                            case 8:\n                                if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') {\n                                    break;\n                                }\n                            case 37:\n                                if (pdfViewer.isHorizontalScrollbarEnabled) {\n                                    break;\n                                }\n                            case 75:\n                            case 80:\n                                if (PDFViewerApplication.page > 1) {\n                                    PDFViewerApplication.page--;\n                                }\n                                handled = true;\n                                break;\n                            case 27:\n                                if (PDFViewerApplication.secondaryToolbar.isOpen) {\n                                    PDFViewerApplication.secondaryToolbar.close();\n                                    handled = true;\n                                }\n                                if (!PDFViewerApplication.supportsIntegratedFind && PDFViewerApplication.findBar.opened) {\n                                    PDFViewerApplication.findBar.close();\n                                    handled = true;\n                                }\n                                break;\n                            case 40:\n                            case 34:\n                            case 32:\n                                if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') {\n                                    break;\n                                }\n                            case 39:\n                                if (pdfViewer.isHorizontalScrollbarEnabled) {\n                                    break;\n                                }\n                            case 74:\n                            case 78:\n                                if (PDFViewerApplication.page < PDFViewerApplication.pagesCount) {\n                                    PDFViewerApplication.page++;\n                                }\n                                handled = true;\n                                break;\n                            case 36:\n                                if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {\n                                    PDFViewerApplication.page = 1;\n                                    handled = true;\n                                    ensureViewerFocused = true;\n                                }\n                                break;\n                            case 35:\n                                if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) {\n                                    PDFViewerApplication.page = PDFViewerApplication.pagesCount;\n                                    handled = true;\n                                    ensureViewerFocused = true;\n                                }\n                                break;\n                            case 83:\n                                PDFViewerApplication.pdfCursorTools.switchTool(_pdf_cursor_tools.CursorTool.SELECT);\n                                break;\n                            case 72:\n                                PDFViewerApplication.pdfCursorTools.switchTool(_pdf_cursor_tools.CursorTool.HAND);\n                                break;\n                            case 82:\n                                PDFViewerApplication.rotatePages(90);\n                                break;\n                        }\n                    }\n                    if (cmd === 4) {\n                        switch (evt.keyCode) {\n                            case 32:\n                                if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') {\n                                    break;\n                                }\n                                if (PDFViewerApplication.page > 1) {\n                                    PDFViewerApplication.page--;\n                                }\n                                handled = true;\n                                break;\n                            case 82:\n                                PDFViewerApplication.rotatePages(-90);\n                                break;\n                        }\n                    }\n                    if (!handled && !isViewerInPresentationMode) {\n                        if (evt.keyCode >= 33 && evt.keyCode <= 40 || evt.keyCode === 32 && curElementTagName !== 'BUTTON') {\n                            ensureViewerFocused = true;\n                        }\n                    }\n                    if (cmd === 2) {\n                        switch (evt.keyCode) {\n                            case 37:\n                                if (isViewerInPresentationMode) {\n                                    PDFViewerApplication.pdfHistory.back();\n                                    handled = true;\n                                }\n                                break;\n                            case 39:\n                                if (isViewerInPresentationMode) {\n                                    PDFViewerApplication.pdfHistory.forward();\n                                    handled = true;\n                                }\n                                break;\n                        }\n                    }\n                    if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) {\n                        pdfViewer.focus();\n                    }\n                    if (handled) {\n                        evt.preventDefault();\n                    }\n                }\n                function apiPageModeToSidebarView(mode) {\n                    switch (mode) {\n                        case 'UseNone':\n                            return _pdf_sidebar.SidebarView.NONE;\n                        case 'UseThumbs':\n                            return _pdf_sidebar.SidebarView.THUMBS;\n                        case 'UseOutlines':\n                            return _pdf_sidebar.SidebarView.OUTLINE;\n                        case 'UseAttachments':\n                            return _pdf_sidebar.SidebarView.ATTACHMENTS;\n                        case 'UseOC':\n                    }\n                    return _pdf_sidebar.SidebarView.NONE;\n                }\n                var PDFPrintServiceFactory = {\n                    instance: {\n                        supportsPrinting: false,\n                        createPrintService: function createPrintService() {\n                            throw new Error('Not implemented: createPrintService');\n                        }\n                    }\n                };\n                exports.PDFViewerApplication = PDFViewerApplication;\n                exports.DefaultExternalServices = DefaultExternalServices;\n                exports.PDFPrintServiceFactory = PDFPrintServiceFactory;\n\n                /***/\n            }),\n        /* 5 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.SimpleLinkService = exports.PDFLinkService = undefined;\n\n                var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _dom_events = __webpack_require__(2);\n\n                var _ui_utils = __webpack_require__(0);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var PDFLinkService = function () {\n                    function PDFLinkService() {\n                        var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n                            eventBus = _ref.eventBus;\n\n                        _classCallCheck(this, PDFLinkService);\n\n                        this.eventBus = eventBus || (0, _dom_events.getGlobalEventBus)();\n                        this.baseUrl = null;\n                        this.pdfDocument = null;\n                        this.pdfViewer = null;\n                        this.pdfHistory = null;\n                        this._pagesRefCache = null;\n                    }\n\n                    _createClass(PDFLinkService, [{\n                        key: 'setDocument',\n                        value: function setDocument(pdfDocument, baseUrl) {\n                            this.baseUrl = baseUrl;\n                            this.pdfDocument = pdfDocument;\n                            this._pagesRefCache = Object.create(null);\n                        }\n                    }, {\n                        key: 'setViewer',\n                        value: function setViewer(pdfViewer) {\n                            this.pdfViewer = pdfViewer;\n                        }\n                    }, {\n                        key: 'setHistory',\n                        value: function setHistory(pdfHistory) {\n                            this.pdfHistory = pdfHistory;\n                        }\n                    }, {\n                        key: 'navigateTo',\n                        value: function navigateTo(dest) {\n                            var _this = this;\n\n                            var goToDestination = function goToDestination(_ref2) {\n                                var namedDest = _ref2.namedDest,\n                                    explicitDest = _ref2.explicitDest;\n\n                                var destRef = explicitDest[0],\n                                    pageNumber = void 0;\n                                if (destRef instanceof Object) {\n                                    pageNumber = _this._cachedPageNumber(destRef);\n                                    if (pageNumber === null) {\n                                        _this.pdfDocument.getPageIndex(destRef).then(function (pageIndex) {\n                                            _this.cachePageRef(pageIndex + 1, destRef);\n                                            goToDestination({\n                                                namedDest: namedDest,\n                                                explicitDest: explicitDest\n                                            });\n                                        }).catch(function () {\n                                            console.error('PDFLinkService.navigateTo: \"' + destRef + '\" is not ' + ('a valid page reference, for dest=\"' + dest + '\".'));\n                                        });\n                                        return;\n                                    }\n                                } else if ((destRef | 0) === destRef) {\n                                    pageNumber = destRef + 1;\n                                } else {\n                                    console.error('PDFLinkService.navigateTo: \"' + destRef + '\" is not ' + ('a valid destination reference, for dest=\"' + dest + '\".'));\n                                    return;\n                                }\n                                if (!pageNumber || pageNumber < 1 || pageNumber > _this.pagesCount) {\n                                    console.error('PDFLinkService.navigateTo: \"' + pageNumber + '\" is not ' + ('a valid page number, for dest=\"' + dest + '\".'));\n                                    return;\n                                }\n                                _this.pdfViewer.scrollPageIntoView({\n                                    pageNumber: pageNumber,\n                                    destArray: explicitDest\n                                });\n                                if (_this.pdfHistory) {\n                                    _this.pdfHistory.push({\n                                        dest: explicitDest,\n                                        hash: namedDest,\n                                        page: pageNumber\n                                    });\n                                }\n                            };\n                            new Promise(function (resolve, reject) {\n                                if (typeof dest === 'string') {\n                                    _this.pdfDocument.getDestination(dest).then(function (destArray) {\n                                        resolve({\n                                            namedDest: dest,\n                                            explicitDest: destArray\n                                        });\n                                    });\n                                    return;\n                                }\n                                resolve({\n                                    namedDest: '',\n                                    explicitDest: dest\n                                });\n                            }).then(function (data) {\n                                if (!(data.explicitDest instanceof Array)) {\n                                    console.error('PDFLinkService.navigateTo: \"' + data.explicitDest + '\" is' + (' not a valid destination array, for dest=\"' + dest + '\".'));\n                                    return;\n                                }\n                                goToDestination(data);\n                            });\n                        }\n                    }, {\n                        key: 'getDestinationHash',\n                        value: function getDestinationHash(dest) {\n                            if (typeof dest === 'string') {\n                                return this.getAnchorUrl('#' + escape(dest));\n                            }\n                            if (dest instanceof Array) {\n                                var str = JSON.stringify(dest);\n                                return this.getAnchorUrl('#' + escape(str));\n                            }\n                            return this.getAnchorUrl('');\n                        }\n                    }, {\n                        key: 'getAnchorUrl',\n                        value: function getAnchorUrl(anchor) {\n                            return (this.baseUrl || '') + anchor;\n                        }\n                    }, {\n                        key: 'setHash',\n                        value: function setHash(hash) {\n                            var pageNumber = void 0,\n                                dest = void 0;\n                            if (hash.indexOf('=') >= 0) {\n                                var params = (0, _ui_utils.parseQueryString)(hash);\n                                if ('search' in params) {\n                                    this.eventBus.dispatch('findfromurlhash', {\n                                        source: this,\n                                        query: params['search'].replace(/\"/g, ''),\n                                        phraseSearch: params['phrase'] === 'true'\n                                    });\n                                }\n                                if ('nameddest' in params) {\n                                    if (this.pdfHistory) {\n                                        this.pdfHistory.updateNextHashParam(params.nameddest);\n                                    }\n                                    this.navigateTo(params.nameddest);\n                                    return;\n                                }\n                                if ('page' in params) {\n                                    pageNumber = params.page | 0 || 1;\n                                }\n                                if ('zoom' in params) {\n                                    var zoomArgs = params.zoom.split(',');\n                                    var zoomArg = zoomArgs[0];\n                                    var zoomArgNumber = parseFloat(zoomArg);\n                                    if (zoomArg.indexOf('Fit') === -1) {\n                                        dest = [null, { name: 'XYZ' }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg];\n                                    } else {\n                                        if (zoomArg === 'Fit' || zoomArg === 'FitB') {\n                                            dest = [null, { name: zoomArg }];\n                                        } else if (zoomArg === 'FitH' || zoomArg === 'FitBH' || zoomArg === 'FitV' || zoomArg === 'FitBV') {\n                                            dest = [null, { name: zoomArg }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null];\n                                        } else if (zoomArg === 'FitR') {\n                                            if (zoomArgs.length !== 5) {\n                                                console.error('PDFLinkService.setHash: Not enough parameters for \"FitR\".');\n                                            } else {\n                                                dest = [null, { name: zoomArg }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0];\n                                            }\n                                        } else {\n                                            console.error('PDFLinkService.setHash: \"' + zoomArg + '\" is not ' + 'a valid zoom value.');\n                                        }\n                                    }\n                                }\n                                if (dest) {\n                                    this.pdfViewer.scrollPageIntoView({\n                                        pageNumber: pageNumber || this.page,\n                                        destArray: dest,\n                                        allowNegativeOffset: true\n                                    });\n                                } else if (pageNumber) {\n                                    this.page = pageNumber;\n                                }\n                                if ('pagemode' in params) {\n                                    this.eventBus.dispatch('pagemode', {\n                                        source: this,\n                                        mode: params.pagemode\n                                    });\n                                }\n                            } else {\n                                if (/^\\d+$/.test(hash) && hash <= this.pagesCount) {\n                                    console.warn('PDFLinkService_setHash: specifying a page number ' + 'directly after the hash symbol (#) is deprecated, ' + ('please use the \"#page=' + hash + '\" form instead.'));\n                                    this.page = hash | 0;\n                                }\n                                dest = unescape(hash);\n                                try {\n                                    dest = JSON.parse(dest);\n                                    if (!(dest instanceof Array)) {\n                                        dest = dest.toString();\n                                    }\n                                } catch (ex) { }\n                                if (typeof dest === 'string' || isValidExplicitDestination(dest)) {\n                                    if (this.pdfHistory) {\n                                        this.pdfHistory.updateNextHashParam(dest);\n                                    }\n                                    this.navigateTo(dest);\n                                    return;\n                                }\n                                console.error('PDFLinkService.setHash: \"' + unescape(hash) + '\" is not ' + 'a valid destination.');\n                            }\n                        }\n                    }, {\n                        key: 'executeNamedAction',\n                        value: function executeNamedAction(action) {\n                            switch (action) {\n                                case 'GoBack':\n                                    if (this.pdfHistory) {\n                                        this.pdfHistory.back();\n                                    }\n                                    break;\n                                case 'GoForward':\n                                    if (this.pdfHistory) {\n                                        this.pdfHistory.forward();\n                                    }\n                                    break;\n                                case 'NextPage':\n                                    if (this.page < this.pagesCount) {\n                                        this.page++;\n                                    }\n                                    break;\n                                case 'PrevPage':\n                                    if (this.page > 1) {\n                                        this.page--;\n                                    }\n                                    break;\n                                case 'LastPage':\n                                    this.page = this.pagesCount;\n                                    break;\n                                case 'FirstPage':\n                                    this.page = 1;\n                                    break;\n                                default:\n                                    break;\n                            }\n                            this.eventBus.dispatch('namedaction', {\n                                source: this,\n                                action: action\n                            });\n                        }\n                    }, {\n                        key: 'onFileAttachmentAnnotation',\n                        value: function onFileAttachmentAnnotation(_ref3) {\n                            var id = _ref3.id,\n                                filename = _ref3.filename,\n                                content = _ref3.content;\n\n                            this.eventBus.dispatch('fileattachmentannotation', {\n                                source: this,\n                                id: id,\n                                filename: filename,\n                                content: content\n                            });\n                        }\n                    }, {\n                        key: 'cachePageRef',\n                        value: function cachePageRef(pageNum, pageRef) {\n                            var refStr = pageRef.num + ' ' + pageRef.gen + ' R';\n                            this._pagesRefCache[refStr] = pageNum;\n                        }\n                    }, {\n                        key: '_cachedPageNumber',\n                        value: function _cachedPageNumber(pageRef) {\n                            var refStr = pageRef.num + ' ' + pageRef.gen + ' R';\n                            return this._pagesRefCache && this._pagesRefCache[refStr] || null;\n                        }\n                    }, {\n                        key: 'pagesCount',\n                        get: function get() {\n                            return this.pdfDocument ? this.pdfDocument.numPages : 0;\n                        }\n                    }, {\n                        key: 'page',\n                        get: function get() {\n                            return this.pdfViewer.currentPageNumber;\n                        },\n                        set: function set(value) {\n                            this.pdfViewer.currentPageNumber = value;\n                        }\n                    }]);\n\n                    return PDFLinkService;\n                }();\n\n                function isValidExplicitDestination(dest) {\n                    if (!(dest instanceof Array)) {\n                        return false;\n                    }\n                    var destLength = dest.length,\n                        allowNull = true;\n                    if (destLength < 2) {\n                        return false;\n                    }\n                    var page = dest[0];\n                    if (!((typeof page === 'undefined' ? 'undefined' : _typeof(page)) === 'object' && typeof page.num === 'number' && (page.num | 0) === page.num && typeof page.gen === 'number' && (page.gen | 0) === page.gen) && !(typeof page === 'number' && (page | 0) === page && page >= 0)) {\n                        return false;\n                    }\n                    var zoom = dest[1];\n                    if (!((typeof zoom === 'undefined' ? 'undefined' : _typeof(zoom)) === 'object' && typeof zoom.name === 'string')) {\n                        return false;\n                    }\n                    switch (zoom.name) {\n                        case 'XYZ':\n                            if (destLength !== 5) {\n                                return false;\n                            }\n                            break;\n                        case 'Fit':\n                        case 'FitB':\n                            return destLength === 2;\n                        case 'FitH':\n                        case 'FitBH':\n                        case 'FitV':\n                        case 'FitBV':\n                            if (destLength !== 3) {\n                                return false;\n                            }\n                            break;\n                        case 'FitR':\n                            if (destLength !== 6) {\n                                return false;\n                            }\n                            allowNull = false;\n                            break;\n                        default:\n                            return false;\n                    }\n                    for (var i = 2; i < destLength; i++) {\n                        var param = dest[i];\n                        if (!(typeof param === 'number' || allowNull && param === null)) {\n                            return false;\n                        }\n                    }\n                    return true;\n                }\n\n                var SimpleLinkService = function () {\n                    function SimpleLinkService() {\n                        _classCallCheck(this, SimpleLinkService);\n                    }\n\n                    _createClass(SimpleLinkService, [{\n                        key: 'navigateTo',\n                        value: function navigateTo(dest) { }\n                    }, {\n                        key: 'getDestinationHash',\n                        value: function getDestinationHash(dest) {\n                            return '#';\n                        }\n                    }, {\n                        key: 'getAnchorUrl',\n                        value: function getAnchorUrl(hash) {\n                            return '#';\n                        }\n                    }, {\n                        key: 'setHash',\n                        value: function setHash(hash) { }\n                    }, {\n                        key: 'executeNamedAction',\n                        value: function executeNamedAction(action) { }\n                    }, {\n                        key: 'onFileAttachmentAnnotation',\n                        value: function onFileAttachmentAnnotation(_ref4) {\n                            var id = _ref4.id,\n                                filename = _ref4.filename,\n                                content = _ref4.content;\n                        }\n                    }, {\n                        key: 'cachePageRef',\n                        value: function cachePageRef(pageNum, pageRef) { }\n                    }, {\n                        key: 'page',\n                        get: function get() {\n                            return 0;\n                        },\n                        set: function set(value) { }\n                    }]);\n\n                    return SimpleLinkService;\n                }();\n\n                exports.PDFLinkService = PDFLinkService;\n                exports.SimpleLinkService = SimpleLinkService;\n\n                /***/\n            }),\n        /* 6 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFCursorTools = exports.CursorTool = undefined;\n\n                var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _grab_to_pan = __webpack_require__(14);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var CursorTool = {\n                    SELECT: 0,\n                    HAND: 1,\n                    ZOOM: 2\n                };\n\n                var PDFCursorTools = function () {\n                    function PDFCursorTools(_ref) {\n                        var _this = this;\n\n                        var container = _ref.container,\n                            eventBus = _ref.eventBus,\n                            preferences = _ref.preferences;\n\n                        _classCallCheck(this, PDFCursorTools);\n\n                        this.container = container;\n                        this.eventBus = eventBus;\n                        this.active = CursorTool.SELECT;\n                        this.activeBeforePresentationMode = null;\n                        this.handTool = new _grab_to_pan.GrabToPan({ element: this.container });\n                        this._addEventListeners();\n                        Promise.all([preferences.get('cursorToolOnLoad'), preferences.get('enableHandToolOnLoad')]).then(function (_ref2) {\n                            var _ref3 = _slicedToArray(_ref2, 2),\n                                cursorToolPref = _ref3[0],\n                                handToolPref = _ref3[1];\n\n                            if (handToolPref === true) {\n                                preferences.set('enableHandToolOnLoad', false);\n                                if (cursorToolPref === CursorTool.SELECT) {\n                                    cursorToolPref = CursorTool.HAND;\n                                    preferences.set('cursorToolOnLoad', cursorToolPref).catch(function () { });\n                                }\n                            }\n                            _this.switchTool(cursorToolPref);\n                        }).catch(function () { });\n                    }\n\n                    _createClass(PDFCursorTools, [{\n                        key: 'switchTool',\n                        value: function switchTool(tool) {\n                            var _this2 = this;\n\n                            if (this.activeBeforePresentationMode !== null) {\n                                return;\n                            }\n                            if (tool === this.active) {\n                                return;\n                            }\n                            var disableActiveTool = function disableActiveTool() {\n                                switch (_this2.active) {\n                                    case CursorTool.SELECT:\n                                        break;\n                                    case CursorTool.HAND:\n                                        _this2.handTool.deactivate();\n                                        break;\n                                    case CursorTool.ZOOM:\n                                }\n                            };\n                            switch (tool) {\n                                case CursorTool.SELECT:\n                                    disableActiveTool();\n                                    break;\n                                case CursorTool.HAND:\n                                    disableActiveTool();\n                                    this.handTool.activate();\n                                    break;\n                                case CursorTool.ZOOM:\n                                default:\n                                    console.error('switchTool: \"' + tool + '\" is an unsupported value.');\n                                    return;\n                            }\n                            this.active = tool;\n                            this._dispatchEvent();\n                        }\n                    }, {\n                        key: '_dispatchEvent',\n                        value: function _dispatchEvent() {\n                            this.eventBus.dispatch('cursortoolchanged', {\n                                source: this,\n                                tool: this.active\n                            });\n                        }\n                    }, {\n                        key: '_addEventListeners',\n                        value: function _addEventListeners() {\n                            var _this3 = this;\n\n                            this.eventBus.on('switchcursortool', function (evt) {\n                                _this3.switchTool(evt.tool);\n                            });\n                            this.eventBus.on('presentationmodechanged', function (evt) {\n                                if (evt.switchInProgress) {\n                                    return;\n                                }\n                                var previouslyActive = void 0;\n                                if (evt.active) {\n                                    previouslyActive = _this3.active;\n                                    _this3.switchTool(CursorTool.SELECT);\n                                    _this3.activeBeforePresentationMode = previouslyActive;\n                                } else {\n                                    previouslyActive = _this3.activeBeforePresentationMode;\n                                    _this3.activeBeforePresentationMode = null;\n                                    _this3.switchTool(previouslyActive);\n                                }\n                            });\n                        }\n                    }, {\n                        key: 'activeTool',\n                        get: function get() {\n                            return this.active;\n                        }\n                    }]);\n\n                    return PDFCursorTools;\n                }();\n\n                exports.CursorTool = CursorTool;\n                exports.PDFCursorTools = PDFCursorTools;\n\n                /***/\n            }),\n        /* 7 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFFindController = exports.FindState = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                var _ui_utils = __webpack_require__(0);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var FindState = {\n                    FOUND: 0,\n                    NOT_FOUND: 1,\n                    WRAPPED: 2,\n                    PENDING: 3\n                };\n                var FIND_SCROLL_OFFSET_TOP = -50;\n                var FIND_SCROLL_OFFSET_LEFT = -400;\n                var FIND_TIMEOUT = 250;\n                var CHARACTERS_TO_NORMALIZE = {\n                    '\\u2018': '\\'',\n                    '\\u2019': '\\'',\n                    '\\u201A': '\\'',\n                    '\\u201B': '\\'',\n                    '\\u201C': '\"',\n                    '\\u201D': '\"',\n                    '\\u201E': '\"',\n                    '\\u201F': '\"',\n                    '\\xBC': '1/4',\n                    '\\xBD': '1/2',\n                    '\\xBE': '3/4'\n                };\n\n                var PDFFindController = function () {\n                    function PDFFindController(_ref) {\n                        var pdfViewer = _ref.pdfViewer;\n\n                        _classCallCheck(this, PDFFindController);\n\n                        this.pdfViewer = pdfViewer;\n                        this.onUpdateResultsCount = null;\n                        this.onUpdateState = null;\n                        this.reset();\n                        var replace = Object.keys(CHARACTERS_TO_NORMALIZE).join('');\n                        this.normalizationRegex = new RegExp('[' + replace + ']', 'g');\n                    }\n\n                    _createClass(PDFFindController, [{\n                        key: 'reset',\n                        value: function reset() {\n                            var _this = this;\n\n                            this.startedTextExtraction = false;\n                            this.extractTextPromises = [];\n                            this.pendingFindMatches = Object.create(null);\n                            this.active = false;\n                            this.pageContents = [];\n                            this.pageMatches = [];\n                            this.pageMatchesLength = null;\n                            this.matchCount = 0;\n                            this.selected = {\n                                pageIdx: -1,\n                                matchIdx: -1\n                            };\n                            this.offset = {\n                                pageIdx: null,\n                                matchIdx: null\n                            };\n                            this.pagesToSearch = null;\n                            this.resumePageIdx = null;\n                            this.state = null;\n                            this.dirtyMatch = false;\n                            this.findTimeout = null;\n                            this._firstPagePromise = new Promise(function (resolve) {\n                                _this.resolveFirstPage = resolve;\n                            });\n                        }\n                    }, {\n                        key: 'normalize',\n                        value: function normalize(text) {\n                            return text.replace(this.normalizationRegex, function (ch) {\n                                return CHARACTERS_TO_NORMALIZE[ch];\n                            });\n                        }\n                    }, {\n                        key: '_prepareMatches',\n                        value: function _prepareMatches(matchesWithLength, matches, matchesLength) {\n                            function isSubTerm(matchesWithLength, currentIndex) {\n                                var currentElem = matchesWithLength[currentIndex];\n                                var nextElem = matchesWithLength[currentIndex + 1];\n                                if (currentIndex < matchesWithLength.length - 1 && currentElem.match === nextElem.match) {\n                                    currentElem.skipped = true;\n                                    return true;\n                                }\n                                for (var i = currentIndex - 1; i >= 0; i--) {\n                                    var prevElem = matchesWithLength[i];\n                                    if (prevElem.skipped) {\n                                        continue;\n                                    }\n                                    if (prevElem.match + prevElem.matchLength < currentElem.match) {\n                                        break;\n                                    }\n                                    if (prevElem.match + prevElem.matchLength >= currentElem.match + currentElem.matchLength) {\n                                        currentElem.skipped = true;\n                                        return true;\n                                    }\n                                }\n                                return false;\n                            }\n                            matchesWithLength.sort(function (a, b) {\n                                return a.match === b.match ? a.matchLength - b.matchLength : a.match - b.match;\n                            });\n                            for (var i = 0, len = matchesWithLength.length; i < len; i++) {\n                                if (isSubTerm(matchesWithLength, i)) {\n                                    continue;\n                                }\n                                matches.push(matchesWithLength[i].match);\n                                matchesLength.push(matchesWithLength[i].matchLength);\n                            }\n                        }\n                    }, {\n                        key: 'calcFindPhraseMatch',\n                        value: function calcFindPhraseMatch(query, pageIndex, pageContent) {\n                            var matches = [];\n                            var queryLen = query.length;\n                            var matchIdx = -queryLen;\n                            while (true) {\n                                matchIdx = pageContent.indexOf(query, matchIdx + queryLen);\n                                if (matchIdx === -1) {\n                                    break;\n                                }\n                                matches.push(matchIdx);\n                            }\n                            this.pageMatches[pageIndex] = matches;\n                        }\n                    }, {\n                        key: 'calcFindWordMatch',\n                        value: function calcFindWordMatch(query, pageIndex, pageContent) {\n                            var matchesWithLength = [];\n                            var queryArray = query.match(/\\S+/g);\n                            for (var i = 0, len = queryArray.length; i < len; i++) {\n                                var subquery = queryArray[i];\n                                var subqueryLen = subquery.length;\n                                var matchIdx = -subqueryLen;\n                                while (true) {\n                                    matchIdx = pageContent.indexOf(subquery, matchIdx + subqueryLen);\n                                    if (matchIdx === -1) {\n                                        break;\n                                    }\n                                    matchesWithLength.push({\n                                        match: matchIdx,\n                                        matchLength: subqueryLen,\n                                        skipped: false\n                                    });\n                                }\n                            }\n                            if (!this.pageMatchesLength) {\n                                this.pageMatchesLength = [];\n                            }\n                            this.pageMatchesLength[pageIndex] = [];\n                            this.pageMatches[pageIndex] = [];\n                            this._prepareMatches(matchesWithLength, this.pageMatches[pageIndex], this.pageMatchesLength[pageIndex]);\n                        }\n                    }, {\n                        key: 'calcFindMatch',\n                        value: function calcFindMatch(pageIndex) {\n                            var pageContent = this.normalize(this.pageContents[pageIndex]);\n                            var query = this.normalize(this.state.query);\n                            var caseSensitive = this.state.caseSensitive;\n                            var phraseSearch = this.state.phraseSearch;\n                            var queryLen = query.length;\n                            if (queryLen === 0) {\n                                return;\n                            }\n                            if (!caseSensitive) {\n                                pageContent = pageContent.toLowerCase();\n                                query = query.toLowerCase();\n                            }\n                            if (phraseSearch) {\n                                this.calcFindPhraseMatch(query, pageIndex, pageContent);\n                            } else {\n                                this.calcFindWordMatch(query, pageIndex, pageContent);\n                            }\n                            this.updatePage(pageIndex);\n                            if (this.resumePageIdx === pageIndex) {\n                                this.resumePageIdx = null;\n                                this.nextPageMatch();\n                            }\n                            if (this.pageMatches[pageIndex].length > 0) {\n                                this.matchCount += this.pageMatches[pageIndex].length;\n                                this.updateUIResultsCount();\n                            }\n                        }\n                    }, {\n                        key: 'extractText',\n                        value: function extractText() {\n                            var _this2 = this;\n\n                            if (this.startedTextExtraction) {\n                                return;\n                            }\n                            this.startedTextExtraction = true;\n                            this.pageContents.length = 0;\n                            var promise = Promise.resolve();\n\n                            var _loop = function _loop(i, ii) {\n                                var extractTextCapability = (0, _pdfjsLib.createPromiseCapability)();\n                                _this2.extractTextPromises[i] = extractTextCapability.promise;\n                                promise = promise.then(function () {\n                                    return _this2.pdfViewer.getPageTextContent(i).then(function (textContent) {\n                                        var textItems = textContent.items;\n                                        var strBuf = [];\n                                        for (var j = 0, jj = textItems.length; j < jj; j++) {\n                                            strBuf.push(textItems[j].str);\n                                        }\n                                        _this2.pageContents[i] = strBuf.join('');\n                                        extractTextCapability.resolve(i);\n                                    }, function (reason) {\n                                        console.error('Unable to get page ' + (i + 1) + ' text content', reason);\n                                        _this2.pageContents[i] = '';\n                                        extractTextCapability.resolve(i);\n                                    });\n                                });\n                            };\n\n                            for (var i = 0, ii = this.pdfViewer.pagesCount; i < ii; i++) {\n                                _loop(i, ii);\n                            }\n                        }\n                    }, {\n                        key: 'executeCommand',\n                        value: function executeCommand(cmd, state) {\n                            var _this3 = this;\n\n                            if (this.state === null || cmd !== 'findagain') {\n                                this.dirtyMatch = true;\n                            }\n                            this.state = state;\n                            this.updateUIState(FindState.PENDING);\n                            this._firstPagePromise.then(function () {\n                                _this3.extractText();\n                                clearTimeout(_this3.findTimeout);\n                                if (cmd === 'find') {\n                                    _this3.findTimeout = setTimeout(_this3.nextMatch.bind(_this3), FIND_TIMEOUT);\n                                } else {\n                                    _this3.nextMatch();\n                                }\n                            });\n                        }\n                    }, {\n                        key: 'updatePage',\n                        value: function updatePage(index) {\n                            if (this.selected.pageIdx === index) {\n                                this.pdfViewer.currentPageNumber = index + 1;\n                            }\n                            var page = this.pdfViewer.getPageView(index);\n                            if (page.textLayer) {\n                                page.textLayer.updateMatches();\n                            }\n                        }\n                    }, {\n                        key: 'nextMatch',\n                        value: function nextMatch() {\n                            var _this4 = this;\n\n                            var previous = this.state.findPrevious;\n                            var currentPageIndex = this.pdfViewer.currentPageNumber - 1;\n                            var numPages = this.pdfViewer.pagesCount;\n                            this.active = true;\n                            if (this.dirtyMatch) {\n                                this.dirtyMatch = false;\n                                this.selected.pageIdx = this.selected.matchIdx = -1;\n                                this.offset.pageIdx = currentPageIndex;\n                                this.offset.matchIdx = null;\n                                this.hadMatch = false;\n                                this.resumePageIdx = null;\n                                this.pageMatches = [];\n                                this.matchCount = 0;\n                                this.pageMatchesLength = null;\n                                for (var i = 0; i < numPages; i++) {\n                                    this.updatePage(i);\n                                    if (!(i in this.pendingFindMatches)) {\n                                        this.pendingFindMatches[i] = true;\n                                        this.extractTextPromises[i].then(function (pageIdx) {\n                                            delete _this4.pendingFindMatches[pageIdx];\n                                            _this4.calcFindMatch(pageIdx);\n                                        });\n                                    }\n                                }\n                            }\n                            if (this.state.query === '') {\n                                this.updateUIState(FindState.FOUND);\n                                return;\n                            }\n                            if (this.resumePageIdx) {\n                                return;\n                            }\n                            var offset = this.offset;\n                            this.pagesToSearch = numPages;\n                            if (offset.matchIdx !== null) {\n                                var numPageMatches = this.pageMatches[offset.pageIdx].length;\n                                if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) {\n                                    this.hadMatch = true;\n                                    offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1;\n                                    this.updateMatch(true);\n                                    return;\n                                }\n                                this.advanceOffsetPage(previous);\n                            }\n                            this.nextPageMatch();\n                        }\n                    }, {\n                        key: 'matchesReady',\n                        value: function matchesReady(matches) {\n                            var offset = this.offset;\n                            var numMatches = matches.length;\n                            var previous = this.state.findPrevious;\n                            if (numMatches) {\n                                this.hadMatch = true;\n                                offset.matchIdx = previous ? numMatches - 1 : 0;\n                                this.updateMatch(true);\n                                return true;\n                            }\n                            this.advanceOffsetPage(previous);\n                            if (offset.wrapped) {\n                                offset.matchIdx = null;\n                                if (this.pagesToSearch < 0) {\n                                    this.updateMatch(false);\n                                    return true;\n                                }\n                            }\n                            return false;\n                        }\n                    }, {\n                        key: 'updateMatchPosition',\n                        value: function updateMatchPosition(pageIndex, matchIndex, elements, beginIdx) {\n                            if (this.selected.matchIdx === matchIndex && this.selected.pageIdx === pageIndex) {\n                                var spot = {\n                                    top: FIND_SCROLL_OFFSET_TOP,\n                                    left: FIND_SCROLL_OFFSET_LEFT\n                                };\n                                (0, _ui_utils.scrollIntoView)(elements[beginIdx], spot, true);\n                            }\n                        }\n                    }, {\n                        key: 'nextPageMatch',\n                        value: function nextPageMatch() {\n                            if (this.resumePageIdx !== null) {\n                                console.error('There can only be one pending page.');\n                            }\n                            var matches = null;\n                            do {\n                                var pageIdx = this.offset.pageIdx;\n                                matches = this.pageMatches[pageIdx];\n                                if (!matches) {\n                                    this.resumePageIdx = pageIdx;\n                                    break;\n                                }\n                            } while (!this.matchesReady(matches));\n                        }\n                    }, {\n                        key: 'advanceOffsetPage',\n                        value: function advanceOffsetPage(previous) {\n                            var offset = this.offset;\n                            var numPages = this.extractTextPromises.length;\n                            offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1;\n                            offset.matchIdx = null;\n                            this.pagesToSearch--;\n                            if (offset.pageIdx >= numPages || offset.pageIdx < 0) {\n                                offset.pageIdx = previous ? numPages - 1 : 0;\n                                offset.wrapped = true;\n                            }\n                        }\n                    }, {\n                        key: 'updateMatch',\n                        value: function updateMatch() {\n                            var found = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n                            var state = FindState.NOT_FOUND;\n                            var wrapped = this.offset.wrapped;\n                            this.offset.wrapped = false;\n                            if (found) {\n                                var previousPage = this.selected.pageIdx;\n                                this.selected.pageIdx = this.offset.pageIdx;\n                                this.selected.matchIdx = this.offset.matchIdx;\n                                state = wrapped ? FindState.WRAPPED : FindState.FOUND;\n                                if (previousPage !== -1 && previousPage !== this.selected.pageIdx) {\n                                    this.updatePage(previousPage);\n                                }\n                            }\n                            this.updateUIState(state, this.state.findPrevious);\n                            if (this.selected.pageIdx !== -1) {\n                                this.updatePage(this.selected.pageIdx);\n                            }\n                        }\n                    }, {\n                        key: 'updateUIResultsCount',\n                        value: function updateUIResultsCount() {\n                            if (this.onUpdateResultsCount) {\n                                this.onUpdateResultsCount(this.matchCount);\n                            }\n                        }\n                    }, {\n                        key: 'updateUIState',\n                        value: function updateUIState(state, previous) {\n                            if (this.onUpdateState) {\n                                this.onUpdateState(state, previous, this.matchCount);\n                            }\n                        }\n                    }]);\n\n                    return PDFFindController;\n                }();\n\n                exports.FindState = FindState;\n                exports.PDFFindController = PDFFindController;\n\n                /***/\n            }),\n        /* 8 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.GenericCom = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _app = __webpack_require__(4);\n\n                var _preferences = __webpack_require__(28);\n\n                var _download_manager = __webpack_require__(12);\n\n                var _genericl10n = __webpack_require__(13);\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n                function _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n                ;\n                var GenericCom = {};\n\n                var GenericPreferences = function (_BasePreferences) {\n                    _inherits(GenericPreferences, _BasePreferences);\n\n                    function GenericPreferences() {\n                        _classCallCheck(this, GenericPreferences);\n\n                        return _possibleConstructorReturn(this, (GenericPreferences.__proto__ || Object.getPrototypeOf(GenericPreferences)).apply(this, arguments));\n                    }\n\n                    _createClass(GenericPreferences, [{\n                        key: '_writeToStorage',\n                        value: function _writeToStorage(prefObj) {\n                            return new Promise(function (resolve) {\n                                localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));\n                                resolve();\n                            });\n                        }\n                    }, {\n                        key: '_readFromStorage',\n                        value: function _readFromStorage(prefObj) {\n                            return new Promise(function (resolve) {\n                                var readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences'));\n                                resolve(readPrefs);\n                            });\n                        }\n                    }]);\n\n                    return GenericPreferences;\n                }(_preferences.BasePreferences);\n\n                var GenericExternalServices = Object.create(_app.DefaultExternalServices);\n                GenericExternalServices.createDownloadManager = function () {\n                    return new _download_manager.DownloadManager();\n                };\n                GenericExternalServices.createPreferences = function () {\n                    return new GenericPreferences();\n                };\n                GenericExternalServices.createL10n = function () {\n                    return new _genericl10n.GenericL10n(_pdfjsLib.PDFJS.locale);\n                };\n                _app.PDFViewerApplication.externalServices = GenericExternalServices;\n                exports.GenericCom = GenericCom;\n\n                /***/\n            }),\n        /* 9 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFPrintService = undefined;\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _app = __webpack_require__(4);\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                var activeService = null;\n                var overlayManager = null;\n                function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size) {\n                    var scratchCanvas = activeService.scratchCanvas;\n                    var PRINT_RESOLUTION = 150;\n                    var PRINT_UNITS = PRINT_RESOLUTION / 72.0;\n                    scratchCanvas.width = Math.floor(size.width * PRINT_UNITS);\n                    scratchCanvas.height = Math.floor(size.height * PRINT_UNITS);\n                    var width = Math.floor(size.width * _ui_utils.CSS_UNITS) + 'px';\n                    var height = Math.floor(size.height * _ui_utils.CSS_UNITS) + 'px';\n                    var ctx = scratchCanvas.getContext('2d');\n                    ctx.save();\n                    ctx.fillStyle = 'rgb(255, 255, 255)';\n                    ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height);\n                    ctx.restore();\n                    return pdfDocument.getPage(pageNumber).then(function (pdfPage) {\n                        var renderContext = {\n                            canvasContext: ctx,\n                            transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0],\n                            viewport: pdfPage.getViewport(1, size.rotation),\n                            intent: 'print'\n                        };\n                        return pdfPage.render(renderContext).promise;\n                    }).then(function () {\n                        return {\n                            width: width,\n                            height: height\n                        };\n                    });\n                }\n                function PDFPrintService(pdfDocument, pagesOverview, printContainer, l10n) {\n                    this.pdfDocument = pdfDocument;\n                    this.pagesOverview = pagesOverview;\n                    this.printContainer = printContainer;\n                    this.l10n = l10n || _ui_utils.NullL10n;\n                    this.currentPage = -1;\n                    this.scratchCanvas = document.createElement('canvas');\n                }\n                PDFPrintService.prototype = {\n                    layout: function layout() {\n                        this.throwIfInactive();\n                        var body = document.querySelector('body');\n                        body.setAttribute('data-pdfjsprinting', true);\n                        var hasEqualPageSizes = this.pagesOverview.every(function (size) {\n                            return size.width === this.pagesOverview[0].width && size.height === this.pagesOverview[0].height;\n                        }, this);\n                        if (!hasEqualPageSizes) {\n                            console.warn('Not all pages have the same size. The printed ' + 'result may be incorrect!');\n                        }\n                        this.pageStyleSheet = document.createElement('style');\n                        var pageSize = this.pagesOverview[0];\n                        this.pageStyleSheet.textContent = '@supports ((size:A4) and (size:1pt 1pt)) {' + '@page { size: ' + pageSize.width + 'pt ' + pageSize.height + 'pt;}' + '}';\n                        body.appendChild(this.pageStyleSheet);\n                    },\n                    destroy: function destroy() {\n                        if (activeService !== this) {\n                            return;\n                        }\n                        this.printContainer.textContent = '';\n                        if (this.pageStyleSheet && this.pageStyleSheet.parentNode) {\n                            this.pageStyleSheet.parentNode.removeChild(this.pageStyleSheet);\n                            this.pageStyleSheet = null;\n                        }\n                        this.scratchCanvas.width = this.scratchCanvas.height = 0;\n                        this.scratchCanvas = null;\n                        activeService = null;\n                        ensureOverlay().then(function () {\n                            if (overlayManager.active !== 'printServiceOverlay') {\n                                return;\n                            }\n                            overlayManager.close('printServiceOverlay');\n                        });\n                    },\n                    renderPages: function renderPages() {\n                        var _this = this;\n\n                        var pageCount = this.pagesOverview.length;\n                        var renderNextPage = function renderNextPage(resolve, reject) {\n                            _this.throwIfInactive();\n                            if (++_this.currentPage >= pageCount) {\n                                renderProgress(pageCount, pageCount, _this.l10n);\n                                resolve();\n                                return;\n                            }\n                            var index = _this.currentPage;\n                            renderProgress(index, pageCount, _this.l10n);\n                            renderPage(_this, _this.pdfDocument, index + 1, _this.pagesOverview[index]).then(_this.useRenderedPage.bind(_this)).then(function () {\n                                renderNextPage(resolve, reject);\n                            }, reject);\n                        };\n                        return new Promise(renderNextPage);\n                    },\n                    useRenderedPage: function useRenderedPage(printItem) {\n                        this.throwIfInactive();\n                        var img = document.createElement('img');\n                        img.style.width = printItem.width;\n                        img.style.height = printItem.height;\n                        var scratchCanvas = this.scratchCanvas;\n                        if ('toBlob' in scratchCanvas && !_pdfjsLib.PDFJS.disableCreateObjectURL) {\n                            scratchCanvas.toBlob(function (blob) {\n                                img.src = URL.createObjectURL(blob);\n                            });\n                        } else {\n                            img.src = scratchCanvas.toDataURL();\n                        }\n                        var wrapper = document.createElement('div');\n                        wrapper.appendChild(img);\n                        this.printContainer.appendChild(wrapper);\n                        return new Promise(function (resolve, reject) {\n                            img.onload = resolve;\n                            img.onerror = reject;\n                        });\n                    },\n                    performPrint: function performPrint() {\n                        var _this2 = this;\n\n                        this.throwIfInactive();\n                        return new Promise(function (resolve) {\n                            setTimeout(function () {\n                                if (!_this2.active) {\n                                    resolve();\n                                    return;\n                                }\n                                print.call(window);\n                                setTimeout(resolve, 20);\n                            }, 0);\n                        });\n                    },\n\n                    get active() {\n                        return this === activeService;\n                    },\n                    throwIfInactive: function throwIfInactive() {\n                        if (!this.active) {\n                            throw new Error('This print request was cancelled or completed.');\n                        }\n                    }\n                };\n                var print = window.print;\n                window.print = function print() {\n                    if (activeService) {\n                        console.warn('Ignored window.print() because of a pending print job.');\n                        return;\n                    }\n                    ensureOverlay().then(function () {\n                        if (activeService) {\n                            overlayManager.open('printServiceOverlay');\n                        }\n                    });\n                    try {\n                        dispatchEvent('beforeprint');\n                    } finally {\n                        if (!activeService) {\n                            console.error('Expected print service to be initialized.');\n                            ensureOverlay().then(function () {\n                                if (overlayManager.active === 'printServiceOverlay') {\n                                    overlayManager.close('printServiceOverlay');\n                                }\n                            });\n                            return;\n                        }\n                        var activeServiceOnEntry = activeService;\n                        activeService.renderPages().then(function () {\n                            return activeServiceOnEntry.performPrint();\n                        }).catch(function () { }).then(function () {\n                            if (activeServiceOnEntry.active) {\n                                abort();\n                            }\n                        });\n                    }\n                };\n                function dispatchEvent(eventType) {\n                    var event = document.createEvent('CustomEvent');\n                    event.initCustomEvent(eventType, false, false, 'custom');\n                    window.dispatchEvent(event);\n                }\n                function abort() {\n                    if (activeService) {\n                        activeService.destroy();\n                        dispatchEvent('afterprint');\n                    }\n                }\n                function renderProgress(index, total, l10n) {\n                    var progressContainer = document.getElementById('printServiceOverlay');\n                    var progress = Math.round(100 * index / total);\n                    var progressBar = progressContainer.querySelector('progress');\n                    var progressPerc = progressContainer.querySelector('.relative-progress');\n                    progressBar.value = progress;\n                    l10n.get('print_progress_percent', { progress: progress }, progress + '%').then(function (msg) {\n                        progressPerc.textContent = msg;\n                    });\n                }\n                var hasAttachEvent = !!document.attachEvent;\n                window.addEventListener('keydown', function (event) {\n                    if (event.keyCode === 80 && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {\n                        window.print();\n                        if (hasAttachEvent) {\n                            return;\n                        }\n                        event.preventDefault();\n                        if (event.stopImmediatePropagation) {\n                            event.stopImmediatePropagation();\n                        } else {\n                            event.stopPropagation();\n                        }\n                        return;\n                    }\n                }, true);\n                if (hasAttachEvent) {\n                    document.attachEvent('onkeydown', function (event) {\n                        event = event || window.event;\n                        if (event.keyCode === 80 && event.ctrlKey) {\n                            event.keyCode = 0;\n                            return false;\n                        }\n                    });\n                }\n                if ('onbeforeprint' in window) {\n                    var stopPropagationIfNeeded = function stopPropagationIfNeeded(event) {\n                        if (event.detail !== 'custom' && event.stopImmediatePropagation) {\n                            event.stopImmediatePropagation();\n                        }\n                    };\n                    window.addEventListener('beforeprint', stopPropagationIfNeeded);\n                    window.addEventListener('afterprint', stopPropagationIfNeeded);\n                }\n                var overlayPromise;\n                function ensureOverlay() {\n                    if (!overlayPromise) {\n                        overlayManager = _app.PDFViewerApplication.overlayManager;\n                        if (!overlayManager) {\n                            throw new Error('The overlay manager has not yet been initialized.');\n                        }\n                        overlayPromise = overlayManager.register('printServiceOverlay', document.getElementById('printServiceOverlay'), abort, true);\n                        document.getElementById('printCancel').onclick = abort;\n                    }\n                    return overlayPromise;\n                }\n                _app.PDFPrintServiceFactory.instance = {\n                    supportsPrinting: true,\n                    createPrintService: function createPrintService(pdfDocument, pagesOverview, printContainer, l10n) {\n                        if (activeService) {\n                            throw new Error('The print service is created and active.');\n                        }\n                        activeService = new PDFPrintService(pdfDocument, pagesOverview, printContainer, l10n);\n                        return activeService;\n                    }\n                };\n                exports.PDFPrintService = PDFPrintService;\n\n                /***/\n            }),\n        /* 10 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                document.webL10n = function (window, document, undefined) {\n                    var gL10nData = {};\n                    var gTextData = '';\n                    var gTextProp = 'textContent';\n                    var gLanguage = '';\n                    var gMacros = {};\n                    var gReadyState = 'loading';\n                    var gAsyncResourceLoading = true;\n                    function getL10nResourceLinks() {\n                        return document.querySelectorAll('link[type=\"application/l10n\"]');\n                    }\n                    function getL10nDictionary() {\n                        var script = document.querySelector('script[type=\"application/l10n\"]');\n                        return script ? JSON.parse(script.innerHTML) : null;\n                    }\n                    function getTranslatableChildren(element) {\n                        return element ? element.querySelectorAll('*[data-l10n-id]') : [];\n                    }\n                    function getL10nAttributes(element) {\n                        if (!element) return {};\n                        var l10nId = element.getAttribute('data-l10n-id');\n                        var l10nArgs = element.getAttribute('data-l10n-args');\n                        var args = {};\n                        if (l10nArgs) {\n                            try {\n                                args = JSON.parse(l10nArgs);\n                            } catch (e) {\n                                console.warn('could not parse arguments for #' + l10nId);\n                            }\n                        }\n                        return {\n                            id: l10nId,\n                            args: args\n                        };\n                    }\n                    function fireL10nReadyEvent(lang) {\n                        var evtObject = document.createEvent('Event');\n                        evtObject.initEvent('localized', true, false);\n                        evtObject.language = lang;\n                        document.dispatchEvent(evtObject);\n                    }\n                    function xhrLoadText(url, onSuccess, onFailure) {\n                        onSuccess = onSuccess || function _onSuccess(data) { };\n                        onFailure = onFailure || function _onFailure() { };\n                        var xhr = new XMLHttpRequest();\n                        xhr.open('GET', url, gAsyncResourceLoading);\n                        if (xhr.overrideMimeType) {\n                            xhr.overrideMimeType('text/plain; charset=utf-8');\n                        }\n                        xhr.onreadystatechange = function () {\n                            if (xhr.readyState == 4) {\n                                if (xhr.status == 200 || xhr.status === 0) {\n                                    onSuccess(xhr.responseText);\n                                } else {\n                                    onFailure();\n                                }\n                            }\n                        };\n                        xhr.onerror = onFailure;\n                        xhr.ontimeout = onFailure;\n                        try {\n                            xhr.send(null);\n                        } catch (e) {\n                            onFailure();\n                        }\n                    }\n                    function parseResource(href, lang, successCallback, failureCallback) {\n                        var baseURL = href.replace(/[^\\/]*$/, '') || './';\n                        function evalString(text) {\n                            if (text.lastIndexOf('\\\\') < 0) return text;\n                            return text.replace(/\\\\\\\\/g, '\\\\').replace(/\\\\n/g, '\\n').replace(/\\\\r/g, '\\r').replace(/\\\\t/g, '\\t').replace(/\\\\b/g, '\\b').replace(/\\\\f/g, '\\f').replace(/\\\\{/g, '{').replace(/\\\\}/g, '}').replace(/\\\\\"/g, '\"').replace(/\\\\'/g, \"'\");\n                        }\n                        function parseProperties(text, parsedPropertiesCallback) {\n                            var dictionary = {};\n                            var reBlank = /^\\s*|\\s*$/;\n                            var reComment = /^\\s*#|^\\s*$/;\n                            var reSection = /^\\s*\\[(.*)\\]\\s*$/;\n                            var reImport = /^\\s*@import\\s+url\\((.*)\\)\\s*$/i;\n                            var reSplit = /^([^=\\s]*)\\s*=\\s*(.+)$/;\n                            function parseRawLines(rawText, extendedSyntax, parsedRawLinesCallback) {\n                                var entries = rawText.replace(reBlank, '').split(/[\\r\\n]+/);\n                                var currentLang = '*';\n                                var genericLang = lang.split('-', 1)[0];\n                                var skipLang = false;\n                                var match = '';\n                                function nextEntry() {\n                                    while (true) {\n                                        if (!entries.length) {\n                                            parsedRawLinesCallback();\n                                            return;\n                                        }\n                                        var line = entries.shift();\n                                        if (reComment.test(line)) continue;\n                                        if (extendedSyntax) {\n                                            match = reSection.exec(line);\n                                            if (match) {\n                                                currentLang = match[1].toLowerCase();\n                                                skipLang = currentLang !== '*' && currentLang !== lang && currentLang !== genericLang;\n                                                continue;\n                                            } else if (skipLang) {\n                                                continue;\n                                            }\n                                            match = reImport.exec(line);\n                                            if (match) {\n                                                loadImport(baseURL + match[1], nextEntry);\n                                                return;\n                                            }\n                                        }\n                                        var tmp = line.match(reSplit);\n                                        if (tmp && tmp.length == 3) {\n                                            dictionary[tmp[1]] = evalString(tmp[2]);\n                                        }\n                                    }\n                                }\n                                nextEntry();\n                            }\n                            function loadImport(url, callback) {\n                                xhrLoadText(url, function (content) {\n                                    parseRawLines(content, false, callback);\n                                }, function () {\n                                    console.warn(url + ' not found.');\n                                    callback();\n                                });\n                            }\n                            parseRawLines(text, true, function () {\n                                parsedPropertiesCallback(dictionary);\n                            });\n                        }\n                        xhrLoadText(href, function (response) {\n                            gTextData += response;\n                            parseProperties(response, function (data) {\n                                for (var key in data) {\n                                    var id,\n                                        prop,\n                                        index = key.lastIndexOf('.');\n                                    if (index > 0) {\n                                        id = key.substring(0, index);\n                                        prop = key.substr(index + 1);\n                                    } else {\n                                        id = key;\n                                        prop = gTextProp;\n                                    }\n                                    if (!gL10nData[id]) {\n                                        gL10nData[id] = {};\n                                    }\n                                    gL10nData[id][prop] = data[key];\n                                }\n                                if (successCallback) {\n                                    successCallback();\n                                }\n                            });\n                        }, failureCallback);\n                    }\n                    function loadLocale(lang, callback) {\n                        if (lang) {\n                            lang = lang.toLowerCase();\n                        }\n                        callback = callback || function _callback() { };\n                        clear();\n                        gLanguage = lang;\n                        var langLinks = getL10nResourceLinks();\n                        var langCount = langLinks.length;\n                        if (langCount === 0) {\n                            var dict = getL10nDictionary();\n                            if (dict && dict.locales && dict.default_locale) {\n                                console.log('using the embedded JSON directory, early way out');\n                                gL10nData = dict.locales[lang];\n                                if (!gL10nData) {\n                                    var defaultLocale = dict.default_locale.toLowerCase();\n                                    for (var anyCaseLang in dict.locales) {\n                                        anyCaseLang = anyCaseLang.toLowerCase();\n                                        if (anyCaseLang === lang) {\n                                            gL10nData = dict.locales[lang];\n                                            break;\n                                        } else if (anyCaseLang === defaultLocale) {\n                                            gL10nData = dict.locales[defaultLocale];\n                                        }\n                                    }\n                                }\n                                callback();\n                            } else {\n                                console.log('no resource to load, early way out');\n                            }\n                            fireL10nReadyEvent(lang);\n                            gReadyState = 'complete';\n                            return;\n                        }\n                        var onResourceLoaded = null;\n                        var gResourceCount = 0;\n                        onResourceLoaded = function onResourceLoaded() {\n                            gResourceCount++;\n                            if (gResourceCount >= langCount) {\n                                callback();\n                                fireL10nReadyEvent(lang);\n                                gReadyState = 'complete';\n                            }\n                        };\n                        function L10nResourceLink(link) {\n                            var href = link.href;\n                            this.load = function (lang, callback) {\n                                parseResource(href, lang, callback, function () {\n                                    console.warn(href + ' not found.');\n                                    console.warn('\"' + lang + '\" resource not found');\n                                    gLanguage = '';\n                                    callback();\n                                });\n                            };\n                        }\n                        for (var i = 0; i < langCount; i++) {\n                            var resource = new L10nResourceLink(langLinks[i]);\n                            resource.load(lang, onResourceLoaded);\n                        }\n                    }\n                    function clear() {\n                        gL10nData = {};\n                        gTextData = '';\n                        gLanguage = '';\n                    }\n                    function getPluralRules(lang) {\n                        var locales2rules = {\n                            'af': 3,\n                            'ak': 4,\n                            'am': 4,\n                            'ar': 1,\n                            'asa': 3,\n                            'az': 0,\n                            'be': 11,\n                            'bem': 3,\n                            'bez': 3,\n                            'bg': 3,\n                            'bh': 4,\n                            'bm': 0,\n                            'bn': 3,\n                            'bo': 0,\n                            'br': 20,\n                            'brx': 3,\n                            'bs': 11,\n                            'ca': 3,\n                            'cgg': 3,\n                            'chr': 3,\n                            'cs': 12,\n                            'cy': 17,\n                            'da': 3,\n                            'de': 3,\n                            'dv': 3,\n                            'dz': 0,\n                            'ee': 3,\n                            'el': 3,\n                            'en': 3,\n                            'eo': 3,\n                            'es': 3,\n                            'et': 3,\n                            'eu': 3,\n                            'fa': 0,\n                            'ff': 5,\n                            'fi': 3,\n                            'fil': 4,\n                            'fo': 3,\n                            'fr': 5,\n                            'fur': 3,\n                            'fy': 3,\n                            'ga': 8,\n                            'gd': 24,\n                            'gl': 3,\n                            'gsw': 3,\n                            'gu': 3,\n                            'guw': 4,\n                            'gv': 23,\n                            'ha': 3,\n                            'haw': 3,\n                            'he': 2,\n                            'hi': 4,\n                            'hr': 11,\n                            'hu': 0,\n                            'id': 0,\n                            'ig': 0,\n                            'ii': 0,\n                            'is': 3,\n                            'it': 3,\n                            'iu': 7,\n                            'ja': 0,\n                            'jmc': 3,\n                            'jv': 0,\n                            'ka': 0,\n                            'kab': 5,\n                            'kaj': 3,\n                            'kcg': 3,\n                            'kde': 0,\n                            'kea': 0,\n                            'kk': 3,\n                            'kl': 3,\n                            'km': 0,\n                            'kn': 0,\n                            'ko': 0,\n                            'ksb': 3,\n                            'ksh': 21,\n                            'ku': 3,\n                            'kw': 7,\n                            'lag': 18,\n                            'lb': 3,\n                            'lg': 3,\n                            'ln': 4,\n                            'lo': 0,\n                            'lt': 10,\n                            'lv': 6,\n                            'mas': 3,\n                            'mg': 4,\n                            'mk': 16,\n                            'ml': 3,\n                            'mn': 3,\n                            'mo': 9,\n                            'mr': 3,\n                            'ms': 0,\n                            'mt': 15,\n                            'my': 0,\n                            'nah': 3,\n                            'naq': 7,\n                            'nb': 3,\n                            'nd': 3,\n                            'ne': 3,\n                            'nl': 3,\n                            'nn': 3,\n                            'no': 3,\n                            'nr': 3,\n                            'nso': 4,\n                            'ny': 3,\n                            'nyn': 3,\n                            'om': 3,\n                            'or': 3,\n                            'pa': 3,\n                            'pap': 3,\n                            'pl': 13,\n                            'ps': 3,\n                            'pt': 3,\n                            'rm': 3,\n                            'ro': 9,\n                            'rof': 3,\n                            'ru': 11,\n                            'rwk': 3,\n                            'sah': 0,\n                            'saq': 3,\n                            'se': 7,\n                            'seh': 3,\n                            'ses': 0,\n                            'sg': 0,\n                            'sh': 11,\n                            'shi': 19,\n                            'sk': 12,\n                            'sl': 14,\n                            'sma': 7,\n                            'smi': 7,\n                            'smj': 7,\n                            'smn': 7,\n                            'sms': 7,\n                            'sn': 3,\n                            'so': 3,\n                            'sq': 3,\n                            'sr': 11,\n                            'ss': 3,\n                            'ssy': 3,\n                            'st': 3,\n                            'sv': 3,\n                            'sw': 3,\n                            'syr': 3,\n                            'ta': 3,\n                            'te': 3,\n                            'teo': 3,\n                            'th': 0,\n                            'ti': 4,\n                            'tig': 3,\n                            'tk': 3,\n                            'tl': 4,\n                            'tn': 3,\n                            'to': 0,\n                            'tr': 0,\n                            'ts': 3,\n                            'tzm': 22,\n                            'uk': 11,\n                            'ur': 3,\n                            've': 3,\n                            'vi': 0,\n                            'vun': 3,\n                            'wa': 4,\n                            'wae': 3,\n                            'wo': 0,\n                            'xh': 3,\n                            'xog': 3,\n                            'yo': 0,\n                            'zh': 0,\n                            'zu': 3\n                        };\n                        function isIn(n, list) {\n                            return list.indexOf(n) !== -1;\n                        }\n                        function isBetween(n, start, end) {\n                            return start <= n && n <= end;\n                        }\n                        var pluralRules = {\n                            '0': function _(n) {\n                                return 'other';\n                            },\n                            '1': function _(n) {\n                                if (isBetween(n % 100, 3, 10)) return 'few';\n                                if (n === 0) return 'zero';\n                                if (isBetween(n % 100, 11, 99)) return 'many';\n                                if (n == 2) return 'two';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '2': function _(n) {\n                                if (n !== 0 && n % 10 === 0) return 'many';\n                                if (n == 2) return 'two';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '3': function _(n) {\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '4': function _(n) {\n                                if (isBetween(n, 0, 1)) return 'one';\n                                return 'other';\n                            },\n                            '5': function _(n) {\n                                if (isBetween(n, 0, 2) && n != 2) return 'one';\n                                return 'other';\n                            },\n                            '6': function _(n) {\n                                if (n === 0) return 'zero';\n                                if (n % 10 == 1 && n % 100 != 11) return 'one';\n                                return 'other';\n                            },\n                            '7': function _(n) {\n                                if (n == 2) return 'two';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '8': function _(n) {\n                                if (isBetween(n, 3, 6)) return 'few';\n                                if (isBetween(n, 7, 10)) return 'many';\n                                if (n == 2) return 'two';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '9': function _(n) {\n                                if (n === 0 || n != 1 && isBetween(n % 100, 1, 19)) return 'few';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '10': function _(n) {\n                                if (isBetween(n % 10, 2, 9) && !isBetween(n % 100, 11, 19)) return 'few';\n                                if (n % 10 == 1 && !isBetween(n % 100, 11, 19)) return 'one';\n                                return 'other';\n                            },\n                            '11': function _(n) {\n                                if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few';\n                                if (n % 10 === 0 || isBetween(n % 10, 5, 9) || isBetween(n % 100, 11, 14)) return 'many';\n                                if (n % 10 == 1 && n % 100 != 11) return 'one';\n                                return 'other';\n                            },\n                            '12': function _(n) {\n                                if (isBetween(n, 2, 4)) return 'few';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '13': function _(n) {\n                                if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few';\n                                if (n != 1 && isBetween(n % 10, 0, 1) || isBetween(n % 10, 5, 9) || isBetween(n % 100, 12, 14)) return 'many';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '14': function _(n) {\n                                if (isBetween(n % 100, 3, 4)) return 'few';\n                                if (n % 100 == 2) return 'two';\n                                if (n % 100 == 1) return 'one';\n                                return 'other';\n                            },\n                            '15': function _(n) {\n                                if (n === 0 || isBetween(n % 100, 2, 10)) return 'few';\n                                if (isBetween(n % 100, 11, 19)) return 'many';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '16': function _(n) {\n                                if (n % 10 == 1 && n != 11) return 'one';\n                                return 'other';\n                            },\n                            '17': function _(n) {\n                                if (n == 3) return 'few';\n                                if (n === 0) return 'zero';\n                                if (n == 6) return 'many';\n                                if (n == 2) return 'two';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '18': function _(n) {\n                                if (n === 0) return 'zero';\n                                if (isBetween(n, 0, 2) && n !== 0 && n != 2) return 'one';\n                                return 'other';\n                            },\n                            '19': function _(n) {\n                                if (isBetween(n, 2, 10)) return 'few';\n                                if (isBetween(n, 0, 1)) return 'one';\n                                return 'other';\n                            },\n                            '20': function _(n) {\n                                if ((isBetween(n % 10, 3, 4) || n % 10 == 9) && !(isBetween(n % 100, 10, 19) || isBetween(n % 100, 70, 79) || isBetween(n % 100, 90, 99))) return 'few';\n                                if (n % 1000000 === 0 && n !== 0) return 'many';\n                                if (n % 10 == 2 && !isIn(n % 100, [12, 72, 92])) return 'two';\n                                if (n % 10 == 1 && !isIn(n % 100, [11, 71, 91])) return 'one';\n                                return 'other';\n                            },\n                            '21': function _(n) {\n                                if (n === 0) return 'zero';\n                                if (n == 1) return 'one';\n                                return 'other';\n                            },\n                            '22': function _(n) {\n                                if (isBetween(n, 0, 1) || isBetween(n, 11, 99)) return 'one';\n                                return 'other';\n                            },\n                            '23': function _(n) {\n                                if (isBetween(n % 10, 1, 2) || n % 20 === 0) return 'one';\n                                return 'other';\n                            },\n                            '24': function _(n) {\n                                if (isBetween(n, 3, 10) || isBetween(n, 13, 19)) return 'few';\n                                if (isIn(n, [2, 12])) return 'two';\n                                if (isIn(n, [1, 11])) return 'one';\n                                return 'other';\n                            }\n                        };\n                        var index = locales2rules[lang.replace(/-.*$/, '')];\n                        if (!(index in pluralRules)) {\n                            console.warn('plural form unknown for [' + lang + ']');\n                            return function () {\n                                return 'other';\n                            };\n                        }\n                        return pluralRules[index];\n                    }\n                    gMacros.plural = function (str, param, key, prop) {\n                        var n = parseFloat(param);\n                        if (isNaN(n)) return str;\n                        if (prop != gTextProp) return str;\n                        if (!gMacros._pluralRules) {\n                            gMacros._pluralRules = getPluralRules(gLanguage);\n                        }\n                        var index = '[' + gMacros._pluralRules(n) + ']';\n                        if (n === 0 && key + '[zero]' in gL10nData) {\n                            str = gL10nData[key + '[zero]'][prop];\n                        } else if (n == 1 && key + '[one]' in gL10nData) {\n                            str = gL10nData[key + '[one]'][prop];\n                        } else if (n == 2 && key + '[two]' in gL10nData) {\n                            str = gL10nData[key + '[two]'][prop];\n                        } else if (key + index in gL10nData) {\n                            str = gL10nData[key + index][prop];\n                        } else if (key + '[other]' in gL10nData) {\n                            str = gL10nData[key + '[other]'][prop];\n                        }\n                        return str;\n                    };\n                    function getL10nData(key, args, fallback) {\n                        var data = gL10nData[key];\n                        if (!data) {\n                            console.warn('#' + key + ' is undefined.');\n                            if (!fallback) {\n                                return null;\n                            }\n                            data = fallback;\n                        }\n                        var rv = {};\n                        for (var prop in data) {\n                            var str = data[prop];\n                            str = substIndexes(str, args, key, prop);\n                            str = substArguments(str, args, key);\n                            rv[prop] = str;\n                        }\n                        return rv;\n                    }\n                    function substIndexes(str, args, key, prop) {\n                        var reIndex = /\\{\\[\\s*([a-zA-Z]+)\\(([a-zA-Z]+)\\)\\s*\\]\\}/;\n                        var reMatch = reIndex.exec(str);\n                        if (!reMatch || !reMatch.length) return str;\n                        var macroName = reMatch[1];\n                        var paramName = reMatch[2];\n                        var param;\n                        if (args && paramName in args) {\n                            param = args[paramName];\n                        } else if (paramName in gL10nData) {\n                            param = gL10nData[paramName];\n                        }\n                        if (macroName in gMacros) {\n                            var macro = gMacros[macroName];\n                            str = macro(str, param, key, prop);\n                        }\n                        return str;\n                    }\n                    function substArguments(str, args, key) {\n                        var reArgs = /\\{\\{\\s*(.+?)\\s*\\}\\}/g;\n                        return str.replace(reArgs, function (matched_text, arg) {\n                            if (args && arg in args) {\n                                return args[arg];\n                            }\n                            if (arg in gL10nData) {\n                                return gL10nData[arg];\n                            }\n                            console.log('argument {{' + arg + '}} for #' + key + ' is undefined.');\n                            return matched_text;\n                        });\n                    }\n                    function translateElement(element) {\n                        var l10n = getL10nAttributes(element);\n                        if (!l10n.id) return;\n                        var data = getL10nData(l10n.id, l10n.args);\n                        if (!data) {\n                            console.warn('#' + l10n.id + ' is undefined.');\n                            return;\n                        }\n                        if (data[gTextProp]) {\n                            if (getChildElementCount(element) === 0) {\n                                element[gTextProp] = data[gTextProp];\n                            } else {\n                                var children = element.childNodes;\n                                var found = false;\n                                for (var i = 0, l = children.length; i < l; i++) {\n                                    if (children[i].nodeType === 3 && /\\S/.test(children[i].nodeValue)) {\n                                        if (found) {\n                                            children[i].nodeValue = '';\n                                        } else {\n                                            children[i].nodeValue = data[gTextProp];\n                                            found = true;\n                                        }\n                                    }\n                                }\n                                if (!found) {\n                                    var textNode = document.createTextNode(data[gTextProp]);\n                                    element.insertBefore(textNode, element.firstChild);\n                                }\n                            }\n                            delete data[gTextProp];\n                        }\n                        for (var k in data) {\n                            element[k] = data[k];\n                        }\n                    }\n                    function getChildElementCount(element) {\n                        if (element.children) {\n                            return element.children.length;\n                        }\n                        if (typeof element.childElementCount !== 'undefined') {\n                            return element.childElementCount;\n                        }\n                        var count = 0;\n                        for (var i = 0; i < element.childNodes.length; i++) {\n                            count += element.nodeType === 1 ? 1 : 0;\n                        }\n                        return count;\n                    }\n                    function translateFragment(element) {\n                        element = element || document.documentElement;\n                        var children = getTranslatableChildren(element);\n                        var elementCount = children.length;\n                        for (var i = 0; i < elementCount; i++) {\n                            translateElement(children[i]);\n                        }\n                        translateElement(element);\n                    }\n                    return {\n                        get: function get(key, args, fallbackString) {\n                            var index = key.lastIndexOf('.');\n                            var prop = gTextProp;\n                            if (index > 0) {\n                                prop = key.substr(index + 1);\n                                key = key.substring(0, index);\n                            }\n                            var fallback;\n                            if (fallbackString) {\n                                fallback = {};\n                                fallback[prop] = fallbackString;\n                            }\n                            var data = getL10nData(key, args, fallback);\n                            if (data && prop in data) {\n                                return data[prop];\n                            }\n                            return '{{' + key + '}}';\n                        },\n                        getData: function getData() {\n                            return gL10nData;\n                        },\n                        getText: function getText() {\n                            return gTextData;\n                        },\n                        getLanguage: function getLanguage() {\n                            return gLanguage;\n                        },\n                        setLanguage: function setLanguage(lang, callback) {\n                            loadLocale(lang, function () {\n                                if (callback) callback();\n                            });\n                        },\n                        getDirection: function getDirection() {\n                            var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];\n                            var shortCode = gLanguage.split('-', 1)[0];\n                            return rtlList.indexOf(shortCode) >= 0 ? 'rtl' : 'ltr';\n                        },\n                        translate: translateFragment,\n                        getReadyState: function getReadyState() {\n                            return gReadyState;\n                        },\n                        ready: function ready(callback) {\n                            if (!callback) {\n                                return;\n                            } else if (gReadyState == 'complete' || gReadyState == 'interactive') {\n                                window.setTimeout(function () {\n                                    callback();\n                                });\n                            } else if (document.addEventListener) {\n                                document.addEventListener('localized', function once() {\n                                    document.removeEventListener('localized', once);\n                                    callback();\n                                });\n                            }\n                        }\n                    };\n                }(window, document);\n\n                /***/\n            }),\n        /* 11 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.DefaultAnnotationLayerFactory = exports.AnnotationLayerBuilder = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdf_link_service = __webpack_require__(5);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var AnnotationLayerBuilder = function () {\n                    function AnnotationLayerBuilder(_ref) {\n                        var pageDiv = _ref.pageDiv,\n                            pdfPage = _ref.pdfPage,\n                            linkService = _ref.linkService,\n                            downloadManager = _ref.downloadManager,\n                            _ref$renderInteractiv = _ref.renderInteractiveForms,\n                            renderInteractiveForms = _ref$renderInteractiv === undefined ? false : _ref$renderInteractiv,\n                            _ref$l10n = _ref.l10n,\n                            l10n = _ref$l10n === undefined ? _ui_utils.NullL10n : _ref$l10n;\n\n                        _classCallCheck(this, AnnotationLayerBuilder);\n\n                        this.pageDiv = pageDiv;\n                        this.pdfPage = pdfPage;\n                        this.linkService = linkService;\n                        this.downloadManager = downloadManager;\n                        this.renderInteractiveForms = renderInteractiveForms;\n                        this.l10n = l10n;\n                        this.div = null;\n                    }\n\n                    _createClass(AnnotationLayerBuilder, [{\n                        key: 'render',\n                        value: function render(viewport) {\n                            var _this = this;\n\n                            var intent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'display';\n\n                            this.pdfPage.getAnnotations({ intent: intent }).then(function (annotations) {\n                                var parameters = {\n                                    viewport: viewport.clone({ dontFlip: true }),\n                                    div: _this.div,\n                                    annotations: annotations,\n                                    page: _this.pdfPage,\n                                    renderInteractiveForms: _this.renderInteractiveForms,\n                                    linkService: _this.linkService,\n                                    downloadManager: _this.downloadManager\n                                };\n                                if (_this.div) {\n                                    _pdfjsLib.AnnotationLayer.update(parameters);\n                                } else {\n                                    if (annotations.length === 0) {\n                                        return;\n                                    }\n                                    _this.div = document.createElement('div');\n                                    _this.div.className = 'annotationLayer';\n                                    _this.pageDiv.appendChild(_this.div);\n                                    parameters.div = _this.div;\n                                    _pdfjsLib.AnnotationLayer.render(parameters);\n                                    _this.l10n.translate(_this.div);\n                                }\n                            });\n                        }\n                    }, {\n                        key: 'hide',\n                        value: function hide() {\n                            if (!this.div) {\n                                return;\n                            }\n                            this.div.setAttribute('hidden', 'true');\n                        }\n                    }]);\n\n                    return AnnotationLayerBuilder;\n                }();\n\n                var DefaultAnnotationLayerFactory = function () {\n                    function DefaultAnnotationLayerFactory() {\n                        _classCallCheck(this, DefaultAnnotationLayerFactory);\n                    }\n\n                    _createClass(DefaultAnnotationLayerFactory, [{\n                        key: 'createAnnotationLayerBuilder',\n                        value: function createAnnotationLayerBuilder(pageDiv, pdfPage) {\n                            var renderInteractiveForms = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n                            var l10n = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _ui_utils.NullL10n;\n\n                            return new AnnotationLayerBuilder({\n                                pageDiv: pageDiv,\n                                pdfPage: pdfPage,\n                                renderInteractiveForms: renderInteractiveForms,\n                                linkService: new _pdf_link_service.SimpleLinkService(),\n                                l10n: l10n\n                            });\n                        }\n                    }]);\n\n                    return DefaultAnnotationLayerFactory;\n                }();\n\n                exports.AnnotationLayerBuilder = AnnotationLayerBuilder;\n                exports.DefaultAnnotationLayerFactory = DefaultAnnotationLayerFactory;\n\n                /***/\n            }),\n        /* 12 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.DownloadManager = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                ;\n                function _download(blobUrl, filename) {\n                    var a = document.createElement('a');\n                    if (a.click) {\n                        a.href = blobUrl;\n                        a.target = '_parent';\n                        if ('download' in a) {\n                            a.download = filename;\n                        }\n                        (document.body || document.documentElement).appendChild(a);\n                        a.click();\n                        a.parentNode.removeChild(a);\n                    } else {\n                        if (window.top === window && blobUrl.split('#')[0] === window.location.href.split('#')[0]) {\n                            var padCharacter = blobUrl.indexOf('?') === -1 ? '?' : '&';\n                            blobUrl = blobUrl.replace(/#|$/, padCharacter + '$&');\n                        }\n                        window.open(blobUrl, '_parent');\n                    }\n                }\n\n                var DownloadManager = function () {\n                    function DownloadManager() {\n                        _classCallCheck(this, DownloadManager);\n                    }\n\n                    _createClass(DownloadManager, [{\n                        key: 'downloadUrl',\n                        value: function downloadUrl(url, filename) {\n                            if (!(0, _pdfjsLib.createValidAbsoluteUrl)(url, 'http://example.com')) {\n                                return;\n                            }\n                            _download(url + '#pdfjs.action=download', filename);\n                        }\n                    }, {\n                        key: 'downloadData',\n                        value: function downloadData(data, filename, contentType) {\n                            if (navigator.msSaveBlob) {\n                                return navigator.msSaveBlob(new Blob([data], { type: contentType }), filename);\n                            }\n                            var blobUrl = (0, _pdfjsLib.createObjectURL)(data, contentType, _pdfjsLib.PDFJS.disableCreateObjectURL);\n                            _download(blobUrl, filename);\n                        }\n                    }, {\n                        key: 'download',\n                        value: function download(blob, url, filename) {\n                            if (navigator.msSaveBlob) {\n                                if (!navigator.msSaveBlob(blob, filename)) {\n                                    this.downloadUrl(url, filename);\n                                }\n                                return;\n                            }\n                            if (_pdfjsLib.PDFJS.disableCreateObjectURL) {\n                                this.downloadUrl(url, filename);\n                                return;\n                            }\n                            var blobUrl = URL.createObjectURL(blob);\n                            _download(blobUrl, filename);\n                        }\n                    }]);\n\n                    return DownloadManager;\n                }();\n\n                exports.DownloadManager = DownloadManager;\n\n                /***/\n            }),\n        /* 13 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.GenericL10n = undefined;\n\n                var _createClass = function () {\n                    function defineProperties(target, props) {\n                        for (var i = 0; i < props.length; i++) {\n                            var descriptor = props[i];\n                            descriptor.enumerable = descriptor.enumerable || false;\n                            descriptor.configurable = true;\n                            if (\"value\" in descriptor) descriptor.writable = true;\n                            Object.defineProperty(target, descriptor.key, descriptor);\n                        }\n                    }\n                    return function (Constructor, protoProps, staticProps) {\n                        if (protoProps) defineProperties(Constructor.prototype, protoProps);\n                        if (staticProps) defineProperties(Constructor, staticProps);\n                        return Constructor;\n                    };\n                }();\n\n                __webpack_require__(10);\n\n                function _classCallCheck(instance, Constructor) {\n                    if (!(instance instanceof Constructor)) {\n                        throw new TypeError(\"Cannot call a class as a function\");\n                    }\n                }\n\n                var webL10n = document.webL10n;\n\n                var GenericL10n = function () {\n                    function GenericL10n(lang) {\n                        _classCallCheck(this, GenericL10n);\n\n                        this._lang = lang;\n                        this._ready = new Promise(function (resolve, reject) {\n                            webL10n.setLanguage(lang, function () {\n                                resolve(webL10n);\n                            });\n                        });\n                    }\n\n                    _createClass(GenericL10n, [{\n                        key: 'getDirection',\n                        value: function getDirection() {\n                            return this._ready.then(function (l10n) {\n                                return l10n.getDirection();\n                            });\n                        }\n                    }, {\n                        key: 'get',\n                        value: function get(property, args, fallback) {\n                            return this._ready.then(function (l10n) {\n                                return l10n.get(property, args, fallback);\n                            });\n                        }\n                    }, {\n                        key: 'translate',\n                        value: function translate(element) {\n                            return this._ready.then(function (l10n) {\n                                return l10n.translate(element);\n                            });\n                        }\n                    }]);\n\n                    return GenericL10n;\n                }();\n\n                exports.GenericL10n = GenericL10n;\n\n                /***/\n            }),\n        /* 14 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                function GrabToPan(options) {\n                    this.element = options.element;\n                    this.document = options.element.ownerDocument;\n                    if (typeof options.ignoreTarget === 'function') {\n                        this.ignoreTarget = options.ignoreTarget;\n                    }\n                    this.onActiveChanged = options.onActiveChanged;\n                    this.activate = this.activate.bind(this);\n                    this.deactivate = this.deactivate.bind(this);\n                    this.toggle = this.toggle.bind(this);\n                    this._onmousedown = this._onmousedown.bind(this);\n                    this._onmousemove = this._onmousemove.bind(this);\n                    this._endPan = this._endPan.bind(this);\n                    var overlay = this.overlay = document.createElement('div');\n                    overlay.className = 'grab-to-pan-grabbing';\n                }\n                GrabToPan.prototype = {\n                    CSS_CLASS_GRAB: 'grab-to-pan-grab',\n                    activate: function GrabToPan_activate() {\n                        if (!this.active) {\n                            this.active = true;\n                            this.element.addEventListener('mousedown', this._onmousedown, true);\n                            this.element.classList.add(this.CSS_CLASS_GRAB);\n                            if (this.onActiveChanged) {\n                                this.onActiveChanged(true);\n                            }\n                        }\n                    },\n                    deactivate: function GrabToPan_deactivate() {\n                        if (this.active) {\n                            this.active = false;\n                            this.element.removeEventListener('mousedown', this._onmousedown, true);\n                            this._endPan();\n                            this.element.classList.remove(this.CSS_CLASS_GRAB);\n                            if (this.onActiveChanged) {\n                                this.onActiveChanged(false);\n                            }\n                        }\n                    },\n                    toggle: function GrabToPan_toggle() {\n                        if (this.active) {\n                            this.deactivate();\n                        } else {\n                            this.activate();\n                        }\n                    },\n                    ignoreTarget: function GrabToPan_ignoreTarget(node) {\n                        return node[matchesSelector]('a[href], a[href] *, input, textarea, button, button *, select, option');\n                    },\n                    _onmousedown: function GrabToPan__onmousedown(event) {\n                        if (event.button !== 0 || this.ignoreTarget(event.target)) {\n                            return;\n                        }\n                        if (event.originalTarget) {\n                            try {\n                                event.originalTarget.tagName;\n                            } catch (e) {\n                                return;\n                            }\n                        }\n                        this.scrollLeftStart = this.element.scrollLeft;\n                        this.scrollTopStart = this.element.scrollTop;\n                        this.clientXStart = event.clientX;\n                        this.clientYStart = event.clientY;\n                        this.document.addEventListener('mousemove', this._onmousemove, true);\n                        this.document.addEventListener('mouseup', this._endPan, true);\n                        this.element.addEventListener('scroll', this._endPan, true);\n                        event.preventDefault();\n                        event.stopPropagation();\n                        var focusedElement = document.activeElement;\n                        if (focusedElement && !focusedElement.contains(event.target)) {\n                            focusedElement.blur();\n                        }\n                    },\n                    _onmousemove: function GrabToPan__onmousemove(event) {\n                        this.element.removeEventListener('scroll', this._endPan, true);\n                        if (isLeftMouseReleased(event)) {\n                            this._endPan();\n                            return;\n                        }\n                        var xDiff = event.clientX - this.clientXStart;\n                        var yDiff = event.clientY - this.clientYStart;\n                        var scrollTop = this.scrollTopStart - yDiff;\n                        var scrollLeft = this.scrollLeftStart - xDiff;\n                        if (this.element.scrollTo) {\n                            this.element.scrollTo({\n                                top: scrollTop,\n                                left: scrollLeft,\n                                behavior: 'instant'\n                            });\n                        } else {\n                            this.element.scrollTop = scrollTop;\n                            this.element.scrollLeft = scrollLeft;\n                        }\n                        if (!this.overlay.parentNode) {\n                            document.body.appendChild(this.overlay);\n                        }\n                    },\n                    _endPan: function GrabToPan__endPan() {\n                        this.element.removeEventListener('scroll', this._endPan, true);\n                        this.document.removeEventListener('mousemove', this._onmousemove, true);\n                        this.document.removeEventListener('mouseup', this._endPan, true);\n                        this.overlay.remove();\n                    }\n                };\n                var matchesSelector;\n                ['webkitM', 'mozM', 'msM', 'oM', 'm'].some(function (prefix) {\n                    var name = prefix + 'atches';\n                    if (name in document.documentElement) {\n                        matchesSelector = name;\n                    }\n                    name += 'Selector';\n                    if (name in document.documentElement) {\n                        matchesSelector = name;\n                    }\n                    return matchesSelector;\n                });\n                var isNotIEorIsIE10plus = !document.documentMode || document.documentMode > 9;\n                var chrome = window.chrome;\n                var isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app);\n                var isSafari6plus = /Apple/.test(navigator.vendor) && /Version\\/([6-9]\\d*|[1-5]\\d+)/.test(navigator.userAgent);\n                function isLeftMouseReleased(event) {\n                    if ('buttons' in event && isNotIEorIsIE10plus) {\n                        return !(event.buttons & 1);\n                    }\n                    if (isChrome15OrOpera15plus || isSafari6plus) {\n                        return event.which === 0;\n                    }\n                }\n                exports.GrabToPan = GrabToPan;\n\n                /***/\n            }),\n        /* 15 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var OverlayManager = function () {\n                    function OverlayManager() {\n                        _classCallCheck(this, OverlayManager);\n\n                        this._overlays = {};\n                        this._active = null;\n                        this._keyDownBound = this._keyDown.bind(this);\n                    }\n\n                    _createClass(OverlayManager, [{\n                        key: 'register',\n                        value: function register(name, element) {\n                            var _this = this;\n\n                            var callerCloseMethod = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n                            var canForceClose = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n                            return new Promise(function (resolve) {\n                                var container = void 0;\n                                //console.log(\"name: \",name,\",element: \",element ,\",container: \",container);\n                                if (!name || !element || !(container = element.parentNode)) {\n                                    throw new Error('Not enough parameters.');\n                                } else if (_this._overlays[name]) {\n                                    throw new Error('The overlay is already registered.');\n                                }\n                                _this._overlays[name] = {\n                                    element: element,\n                                    container: container,\n                                    callerCloseMethod: callerCloseMethod,\n                                    canForceClose: canForceClose\n                                };\n                                resolve();\n                            });\n                        }\n                    }, {\n                        key: 'unregister',\n                        value: function unregister(name) {\n                            var _this2 = this;\n\n                            return new Promise(function (resolve) {\n                                if (!_this2._overlays[name]) {\n                                    throw new Error('The overlay does not exist.');\n                                } else if (_this2._active === name) {\n                                    throw new Error('The overlay cannot be removed while it is active.');\n                                }\n                                delete _this2._overlays[name];\n                                resolve();\n                            });\n                        }\n                    }, {\n                        key: 'open',\n                        value: function open(name) {\n                            var _this3 = this;\n\n                            return new Promise(function (resolve) {\n                                if (!_this3._overlays[name]) {\n                                    throw new Error('The overlay does not exist.');\n                                } else if (_this3._active) {\n                                    if (_this3._overlays[name].canForceClose) {\n                                        _this3._closeThroughCaller();\n                                    } else if (_this3._active === name) {\n                                        throw new Error('The overlay is already active.');\n                                    } else {\n                                        throw new Error('Another overlay is currently active.');\n                                    }\n                                }\n                                _this3._active = name;\n                                _this3._overlays[_this3._active].element.classList.remove('hidden');\n                                _this3._overlays[_this3._active].container.classList.remove('hidden');\n                                window.addEventListener('keydown', _this3._keyDownBound);\n                                resolve();\n                            });\n                        }\n                    }, {\n                        key: 'close',\n                        value: function close(name) {\n                            var _this4 = this;\n\n                            return new Promise(function (resolve) {\n                                if (!_this4._overlays[name]) {\n                                    throw new Error('The overlay does not exist.');\n                                } else if (!_this4._active) {\n                                    throw new Error('The overlay is currently not active.');\n                                } else if (_this4._active !== name) {\n                                    throw new Error('Another overlay is currently active.');\n                                }\n                                _this4._overlays[_this4._active].container.classList.add('hidden');\n                                _this4._overlays[_this4._active].element.classList.add('hidden');\n                                _this4._active = null;\n                                window.removeEventListener('keydown', _this4._keyDownBound);\n                                resolve();\n                            });\n                        }\n                    }, {\n                        key: '_keyDown',\n                        value: function _keyDown(evt) {\n                            if (this._active && evt.keyCode === 27) {\n                                this._closeThroughCaller();\n                                evt.preventDefault();\n                            }\n                        }\n                    }, {\n                        key: '_closeThroughCaller',\n                        value: function _closeThroughCaller() {\n                            if (this._overlays[this._active].callerCloseMethod) {\n                                this._overlays[this._active].callerCloseMethod();\n                            }\n                            if (this._active) {\n                                this.close(this._active);\n                            }\n                        }\n                    }, {\n                        key: 'active',\n                        get: function get() {\n                            return this._active;\n                        }\n                    }]);\n\n                    return OverlayManager;\n                }();\n\n                exports.OverlayManager = OverlayManager;\n\n                /***/\n            }),\n        /* 16 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PasswordPrompt = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var PasswordPrompt = function () {\n                    function PasswordPrompt(options, overlayManager) {\n                        var _this = this;\n\n                        var l10n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ui_utils.NullL10n;\n\n                        _classCallCheck(this, PasswordPrompt);\n\n                        this.overlayName = options.overlayName;\n                        this.container = options.container;\n                        this.label = options.label;\n                        this.input = options.input;\n                        this.submitButton = options.submitButton;\n                        this.cancelButton = options.cancelButton;\n                        this.overlayManager = overlayManager;\n                        this.l10n = l10n;\n                        this.updateCallback = null;\n                        this.reason = null;\n                        this.submitButton.addEventListener('click', this.verify.bind(this));\n                        this.cancelButton.addEventListener('click', this.close.bind(this));\n                        this.input.addEventListener('keydown', function (e) {\n                            if (e.keyCode === 13) {\n                                _this.verify();\n                            }\n                        });\n                        this.overlayManager.register(this.overlayName, this.container, this.close.bind(this), true);\n                    }\n\n                    _createClass(PasswordPrompt, [{\n                        key: 'open',\n                        value: function open() {\n                            var _this2 = this;\n\n                            this.overlayManager.open(this.overlayName).then(function () {\n                                _this2.input.focus();\n                                var promptString = void 0;\n                                if (_this2.reason === _pdfjsLib.PasswordResponses.INCORRECT_PASSWORD) {\n                                    promptString = _this2.l10n.get('password_invalid', null, 'Invalid password. Please try again.');\n                                } else {\n                                    promptString = _this2.l10n.get('password_label', null, 'Enter the password to open this PDF file.');\n                                }\n                                promptString.then(function (msg) {\n                                    _this2.label.textContent = msg;\n                                });\n                            });\n                        }\n                    }, {\n                        key: 'close',\n                        value: function close() {\n                            var _this3 = this;\n\n                            this.overlayManager.close(this.overlayName).then(function () {\n                                _this3.input.value = '';\n                            });\n                        }\n                    }, {\n                        key: 'verify',\n                        value: function verify() {\n                            var password = this.input.value;\n                            if (password && password.length > 0) {\n                                this.close();\n                                return this.updateCallback(password);\n                            }\n                        }\n                    }, {\n                        key: 'setUpdateCallback',\n                        value: function setUpdateCallback(updateCallback, reason) {\n                            this.updateCallback = updateCallback;\n                            this.reason = reason;\n                        }\n                    }]);\n\n                    return PasswordPrompt;\n                }();\n\n                exports.PasswordPrompt = PasswordPrompt;\n\n                /***/\n            }),\n        /* 17 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFAttachmentViewer = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var PDFAttachmentViewer = function () {\n                    function PDFAttachmentViewer(_ref) {\n                        var container = _ref.container,\n                            eventBus = _ref.eventBus,\n                            downloadManager = _ref.downloadManager;\n\n                        _classCallCheck(this, PDFAttachmentViewer);\n\n                        this.attachments = null;\n                        this.container = container;\n                        this.eventBus = eventBus;\n                        this.downloadManager = downloadManager;\n                        this._renderedCapability = (0, _pdfjsLib.createPromiseCapability)();\n                        this.eventBus.on('fileattachmentannotation', this._appendAttachment.bind(this));\n                    }\n\n                    _createClass(PDFAttachmentViewer, [{\n                        key: 'reset',\n                        value: function reset() {\n                            var keepRenderedCapability = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n                            this.attachments = null;\n                            this.container.textContent = '';\n                            if (!keepRenderedCapability) {\n                                this._renderedCapability = (0, _pdfjsLib.createPromiseCapability)();\n                            }\n                        }\n                    }, {\n                        key: '_dispatchEvent',\n                        value: function _dispatchEvent(attachmentsCount) {\n                            this.eventBus.dispatch('attachmentsloaded', {\n                                source: this,\n                                attachmentsCount: attachmentsCount\n                            });\n                            this._renderedCapability.resolve();\n                        }\n                    }, {\n                        key: '_bindPdfLink',\n                        value: function _bindPdfLink(button, content, filename) {\n                            if (_pdfjsLib.PDFJS.disableCreateObjectURL) {\n                                throw new Error('bindPdfLink: ' + 'Unsupported \"PDFJS.disableCreateObjectURL\" value.');\n                            }\n                            var blobUrl = void 0;\n                            button.onclick = function () {\n                                if (!blobUrl) {\n                                    blobUrl = (0, _pdfjsLib.createObjectURL)(content, 'application/pdf');\n                                }\n                                var viewerUrl = void 0;\n                                viewerUrl = '?file=' + encodeURIComponent(blobUrl + '#' + filename);\n                                window.open(viewerUrl);\n                                return false;\n                            };\n                        }\n                    }, {\n                        key: '_bindLink',\n                        value: function _bindLink(button, content, filename) {\n                            var _this = this;\n\n                            button.onclick = function () {\n                                _this.downloadManager.downloadData(content, filename, '');\n                                return false;\n                            };\n                        }\n                    }, {\n                        key: 'render',\n                        value: function render(_ref2) {\n                            var attachments = _ref2.attachments,\n                                _ref2$keepRenderedCap = _ref2.keepRenderedCapability,\n                                keepRenderedCapability = _ref2$keepRenderedCap === undefined ? false : _ref2$keepRenderedCap;\n\n                            var attachmentsCount = 0;\n                            if (this.attachments) {\n                                this.reset(keepRenderedCapability === true);\n                            }\n                            this.attachments = attachments || null;\n                            if (!attachments) {\n                                this._dispatchEvent(attachmentsCount);\n                                return;\n                            }\n                            var names = Object.keys(attachments).sort(function (a, b) {\n                                return a.toLowerCase().localeCompare(b.toLowerCase());\n                            });\n                            attachmentsCount = names.length;\n                            for (var i = 0; i < attachmentsCount; i++) {\n                                var item = attachments[names[i]];\n                                var filename = (0, _pdfjsLib.removeNullCharacters)((0, _pdfjsLib.getFilenameFromUrl)(item.filename));\n                                var div = document.createElement('div');\n                                div.className = 'attachmentsItem';\n                                var button = document.createElement('button');\n                                button.textContent = filename;\n                                if (/\\.pdf$/i.test(filename) && !_pdfjsLib.PDFJS.disableCreateObjectURL) {\n                                    this._bindPdfLink(button, item.content, filename);\n                                } else {\n                                    this._bindLink(button, item.content, filename);\n                                }\n                                div.appendChild(button);\n                                this.container.appendChild(div);\n                            }\n                            this._dispatchEvent(attachmentsCount);\n                        }\n                    }, {\n                        key: '_appendAttachment',\n                        value: function _appendAttachment(_ref3) {\n                            var _this2 = this;\n\n                            var id = _ref3.id,\n                                filename = _ref3.filename,\n                                content = _ref3.content;\n\n                            this._renderedCapability.promise.then(function () {\n                                var attachments = _this2.attachments;\n                                if (!attachments) {\n                                    attachments = Object.create(null);\n                                } else {\n                                    for (var name in attachments) {\n                                        if (id === name) {\n                                            return;\n                                        }\n                                    }\n                                }\n                                attachments[id] = {\n                                    filename: filename,\n                                    content: content\n                                };\n                                _this2.render({\n                                    attachments: attachments,\n                                    keepRenderedCapability: true\n                                });\n                            });\n                        }\n                    }]);\n\n                    return PDFAttachmentViewer;\n                }();\n\n                exports.PDFAttachmentViewer = PDFAttachmentViewer;\n\n                /***/\n            }),\n        /* 18 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFDocumentProperties = undefined;\n\n                var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var DEFAULT_FIELD_CONTENT = '-';\n\n                var PDFDocumentProperties = function () {\n                    function PDFDocumentProperties(_ref, overlayManager) {\n                        var overlayName = _ref.overlayName,\n                            fields = _ref.fields,\n                            container = _ref.container,\n                            closeButton = _ref.closeButton;\n                        var l10n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ui_utils.NullL10n;\n\n                        _classCallCheck(this, PDFDocumentProperties);\n\n                        this.overlayName = overlayName;\n                        this.fields = fields;\n                        this.container = container;\n                        this.overlayManager = overlayManager;\n                        this.l10n = l10n;\n                        this._reset();\n                        if (closeButton) {\n                            closeButton.addEventListener('click', this.close.bind(this));\n                        }\n                        this.overlayManager.register(this.overlayName, this.container, this.close.bind(this));\n                    }\n\n                    _createClass(PDFDocumentProperties, [{\n                        key: 'open',\n                        value: function open() {\n                            var _this = this;\n\n                            var freezeFieldData = function freezeFieldData(data) {\n                                Object.defineProperty(_this, 'fieldData', {\n                                    value: Object.freeze(data),\n                                    writable: false,\n                                    enumerable: true,\n                                    configurable: true\n                                });\n                            };\n                            Promise.all([this.overlayManager.open(this.overlayName), this._dataAvailableCapability.promise]).then(function () {\n                                if (_this.fieldData) {\n                                    _this._updateUI();\n                                    return;\n                                }\n                                _this.pdfDocument.getMetadata().then(function (_ref2) {\n                                    var info = _ref2.info,\n                                        metadata = _ref2.metadata;\n\n                                    return Promise.all([info, metadata, _this._parseFileSize(_this.maybeFileSize), _this._parseDate(info.CreationDate), _this._parseDate(info.ModDate)]);\n                                }).then(function (_ref3) {\n                                    var _ref4 = _slicedToArray(_ref3, 5),\n                                        info = _ref4[0],\n                                        metadata = _ref4[1],\n                                        fileSize = _ref4[2],\n                                        creationDate = _ref4[3],\n                                        modificationDate = _ref4[4];\n\n                                    freezeFieldData({\n                                        'fileName': (0, _ui_utils.getPDFFileNameFromURL)(_this.url),\n                                        'fileSize': fileSize,\n                                        'title': info.Title,\n                                        'author': info.Author,\n                                        'subject': info.Subject,\n                                        'keywords': info.Keywords,\n                                        'creationDate': creationDate,\n                                        'modificationDate': modificationDate,\n                                        'creator': info.Creator,\n                                        'producer': info.Producer,\n                                        'version': info.PDFFormatVersion,\n                                        'pageCount': _this.pdfDocument.numPages\n                                    });\n                                    _this._updateUI();\n                                    return _this.pdfDocument.getDownloadInfo();\n                                }).then(function (_ref5) {\n                                    var length = _ref5.length;\n\n                                    return _this._parseFileSize(length);\n                                }).then(function (fileSize) {\n                                    var data = (0, _ui_utils.cloneObj)(_this.fieldData);\n                                    data['fileSize'] = fileSize;\n                                    freezeFieldData(data);\n                                    _this._updateUI();\n                                });\n                            });\n                        }\n                    }, {\n                        key: 'close',\n                        value: function close() {\n                            this.overlayManager.close(this.overlayName);\n                        }\n                    }, {\n                        key: 'setDocument',\n                        value: function setDocument(pdfDocument, url) {\n                            if (this.pdfDocument) {\n                                this._reset();\n                                this._updateUI(true);\n                            }\n                            if (!pdfDocument) {\n                                return;\n                            }\n                            this.pdfDocument = pdfDocument;\n                            this.url = url;\n                            this._dataAvailableCapability.resolve();\n                        }\n                    }, {\n                        key: 'setFileSize',\n                        value: function setFileSize(fileSize) {\n                            if (typeof fileSize === 'number' && fileSize > 0) {\n                                this.maybeFileSize = fileSize;\n                            }\n                        }\n                    }, {\n                        key: '_reset',\n                        value: function _reset() {\n                            this.pdfDocument = null;\n                            this.url = null;\n                            this.maybeFileSize = 0;\n                            delete this.fieldData;\n                            this._dataAvailableCapability = (0, _pdfjsLib.createPromiseCapability)();\n                        }\n                    }, {\n                        key: '_updateUI',\n                        value: function _updateUI() {\n                            var reset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n                            //console.log(DEFAULT_FIELD_CONTENT);\n                            if (reset || !this.fieldData) {\n                                for (var id in this.fields) {\n                                    if (this.fields[id] !== null) {\n                                        this.fields[id].textContent = DEFAULT_FIELD_CONTENT;\n                                    }\n                                }\n                                return;\n                            }\n                            if (this.overlayManager.active !== this.overlayName) {\n                                return;\n                            }\n                            for (var _id in this.fields) {\n                                var content = this.fieldData[_id];\n                                if (this.fields[_id] !== null) {\n                                    this.fields[_id].textContent = content || content === 0 ? content : DEFAULT_FIELD_CONTENT;\n                                }\n                            }\n                        }\n                    }, {\n                        key: '_parseFileSize',\n                        value: function _parseFileSize() {\n                            var fileSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n                            var kb = fileSize / 1024;\n                            if (!kb) {\n                                return Promise.resolve(undefined);\n                            } else if (kb < 1024) {\n                                return this.l10n.get('document_properties_kb', {\n                                    size_kb: (+kb.toPrecision(3)).toLocaleString(),\n                                    size_b: fileSize.toLocaleString()\n                                }, '{{size_kb}} KB ({{size_b}} bytes)');\n                            }\n                            return this.l10n.get('document_properties_mb', {\n                                size_mb: (+(kb / 1024).toPrecision(3)).toLocaleString(),\n                                size_b: fileSize.toLocaleString()\n                            }, '{{size_mb}} MB ({{size_b}} bytes)');\n                        }\n                    }, {\n                        key: '_parseDate',\n                        value: function _parseDate(inputDate) {\n                            if (!inputDate) {\n                                return;\n                            }\n                            var dateToParse = inputDate;\n                            if (dateToParse.substring(0, 2) === 'D:') {\n                                dateToParse = dateToParse.substring(2);\n                            }\n                            var year = parseInt(dateToParse.substring(0, 4), 10);\n                            var month = parseInt(dateToParse.substring(4, 6), 10) - 1;\n                            var day = parseInt(dateToParse.substring(6, 8), 10);\n                            var hours = parseInt(dateToParse.substring(8, 10), 10);\n                            var minutes = parseInt(dateToParse.substring(10, 12), 10);\n                            var seconds = parseInt(dateToParse.substring(12, 14), 10);\n                            var utRel = dateToParse.substring(14, 15);\n                            var offsetHours = parseInt(dateToParse.substring(15, 17), 10);\n                            var offsetMinutes = parseInt(dateToParse.substring(18, 20), 10);\n                            if (utRel === '-') {\n                                hours += offsetHours;\n                                minutes += offsetMinutes;\n                            } else if (utRel === '+') {\n                                hours -= offsetHours;\n                                minutes -= offsetMinutes;\n                            }\n                            var date = new Date(Date.UTC(year, month, day, hours, minutes, seconds));\n                            var dateString = date.toLocaleDateString();\n                            var timeString = date.toLocaleTimeString();\n                            return this.l10n.get('document_properties_date_string', {\n                                date: dateString,\n                                time: timeString\n                            }, '{{date}}, {{time}}');\n                        }\n                    }]);\n\n                    return PDFDocumentProperties;\n                }();\n\n                exports.PDFDocumentProperties = PDFDocumentProperties;\n\n                /***/\n            }),\n        /* 19 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFFindBar = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdf_find_controller = __webpack_require__(7);\n\n                var _ui_utils = __webpack_require__(0);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var PDFFindBar = function () {\n                    function PDFFindBar(options) {\n                        var _this = this;\n\n                        var l10n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _ui_utils.NullL10n;\n\n                        _classCallCheck(this, PDFFindBar);\n\n                        this.opened = false;\n                        this.bar = options.bar || null;\n                        this.toggleButton = options.toggleButton || null;\n                        this.findField = options.findField || null;\n                        this.highlightAll = options.highlightAllCheckbox || null;\n                        this.caseSensitive = options.caseSensitiveCheckbox || null;\n                        this.findMsg = options.findMsg || null;\n                        this.findResultsCount = options.findResultsCount || null;\n                        this.findStatusIcon = options.findStatusIcon || null;\n                        this.findPreviousButton = options.findPreviousButton || null;\n                        this.findNextButton = options.findNextButton || null;\n                        this.findController = options.findController || null;\n                        this.eventBus = options.eventBus;\n                        this.l10n = l10n;\n                        if (this.findController === null) {\n                            throw new Error('PDFFindBar cannot be used without a ' + 'PDFFindController instance.');\n                        }\n                        this.toggleButton.addEventListener('click', function () {\n                            _this.toggle();\n                        });\n                        this.findField.addEventListener('input', function () {\n                            _this.dispatchEvent('');\n                        });\n                        this.bar.addEventListener('keydown', function (e) {\n                            switch (e.keyCode) {\n                                case 13:\n                                    if (e.target === _this.findField) {\n                                        _this.dispatchEvent('again', e.shiftKey);\n                                    }\n                                    break;\n                                case 27:\n                                    _this.close();\n                                    break;\n                            }\n                        });\n                        this.findPreviousButton.addEventListener('click', function () {\n                            _this.dispatchEvent('again', true);\n                        });\n                        this.findNextButton.addEventListener('click', function () {\n                            _this.dispatchEvent('again', false);\n                        });\n                        this.highlightAll.addEventListener('click', function () {\n                            _this.dispatchEvent('highlightallchange');\n                        });\n                        this.caseSensitive.addEventListener('click', function () {\n                            _this.dispatchEvent('casesensitivitychange');\n                        });\n                        this.eventBus.on('resize', this._adjustWidth.bind(this));\n                    }\n\n                    _createClass(PDFFindBar, [{\n                        key: 'reset',\n                        value: function reset() {\n                            this.updateUIState();\n                        }\n                    }, {\n                        key: 'dispatchEvent',\n                        value: function dispatchEvent(type, findPrev) {\n                            this.eventBus.dispatch('find', {\n                                source: this,\n                                type: type,\n                                query: this.findField.value,\n                                caseSensitive: this.caseSensitive.checked,\n                                phraseSearch: true,\n                                highlightAll: this.highlightAll.checked,\n                                findPrevious: findPrev\n                            });\n                        }\n                    }, {\n                        key: 'updateUIState',\n                        value: function updateUIState(state, previous, matchCount) {\n                            var _this2 = this;\n\n                            var notFound = false;\n                            var findMsg = '';\n                            var status = '';\n                            switch (state) {\n                                case _pdf_find_controller.FindState.FOUND:\n                                    break;\n                                case _pdf_find_controller.FindState.PENDING:\n                                    status = 'pending';\n                                    break;\n                                case _pdf_find_controller.FindState.NOT_FOUND:\n                                    findMsg = this.l10n.get('find_not_found', null, 'Phrase not found');\n                                    notFound = true;\n                                    break;\n                                case _pdf_find_controller.FindState.WRAPPED:\n                                    if (previous) {\n                                        findMsg = this.l10n.get('find_reached_top', null, 'Reached top of document, continued from bottom');\n                                    } else {\n                                        findMsg = this.l10n.get('find_reached_bottom', null, 'Reached end of document, continued from top');\n                                    }\n                                    break;\n                            }\n                            if (notFound) {\n                                this.findField.classList.add('notFound');\n                            } else {\n                                this.findField.classList.remove('notFound');\n                            }\n                            this.findField.setAttribute('data-status', status);\n                            Promise.resolve(findMsg).then(function (msg) {\n                                _this2.findMsg.textContent = msg;\n                                _this2._adjustWidth();\n                            });\n                            this.updateResultsCount(matchCount);\n                        }\n                    }, {\n                        key: 'updateResultsCount',\n                        value: function updateResultsCount(matchCount) {\n                            if (!this.findResultsCount) {\n                                return;\n                            }\n                            if (!matchCount) {\n                                this.findResultsCount.classList.add('hidden');\n                                this.findResultsCount.textContent = '';\n                            } else {\n                                this.findResultsCount.textContent = matchCount.toLocaleString();\n                                this.findResultsCount.classList.remove('hidden');\n                            }\n                            this._adjustWidth();\n                        }\n                    }, {\n                        key: 'open',\n                        value: function open() {\n                            if (!this.opened) {\n                                this.opened = true;\n                                this.toggleButton.classList.add('toggled');\n                                this.bar.classList.remove('hidden');\n                            }\n                            this.findField.select();\n                            this.findField.focus();\n                            this._adjustWidth();\n                        }\n                    }, {\n                        key: 'close',\n                        value: function close() {\n                            if (!this.opened) {\n                                return;\n                            }\n                            this.opened = false;\n                            this.toggleButton.classList.remove('toggled');\n                            this.bar.classList.add('hidden');\n                            this.findController.active = false;\n                        }\n                    }, {\n                        key: 'toggle',\n                        value: function toggle() {\n                            if (this.opened) {\n                                this.close();\n                            } else {\n                                this.open();\n                            }\n                        }\n                    }, {\n                        key: '_adjustWidth',\n                        value: function _adjustWidth() {\n                            if (!this.opened) {\n                                return;\n                            }\n                            this.bar.classList.remove('wrapContainers');\n                            var findbarHeight = this.bar.clientHeight;\n                            var inputContainerHeight = this.bar.firstElementChild.clientHeight;\n                            if (findbarHeight > inputContainerHeight) {\n                                this.bar.classList.add('wrapContainers');\n                            }\n                        }\n                    }]);\n\n                    return PDFFindBar;\n                }();\n\n                exports.PDFFindBar = PDFFindBar;\n\n                /***/\n            }),\n        /* 20 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFHistory = undefined;\n\n                var _dom_events = __webpack_require__(2);\n\n                function PDFHistory(options) {\n                    this.linkService = options.linkService;\n                    this.eventBus = options.eventBus || (0, _dom_events.getGlobalEventBus)();\n                    this.initialized = false;\n                    this.initialDestination = null;\n                    this.initialBookmark = null;\n                }\n                PDFHistory.prototype = {\n                    initialize: function pdfHistoryInitialize(fingerprint) {\n                        this.initialized = true;\n                        this.reInitialized = false;\n                        this.allowHashChange = true;\n                        this.historyUnlocked = true;\n                        this.isViewerInPresentationMode = false;\n                        this.previousHash = window.location.hash.substring(1);\n                        this.currentBookmark = '';\n                        this.currentPage = 0;\n                        this.updatePreviousBookmark = false;\n                        this.previousBookmark = '';\n                        this.previousPage = 0;\n                        this.nextHashParam = '';\n                        this.fingerprint = fingerprint;\n                        this.currentUid = this.uid = 0;\n                        this.current = {};\n                        var state = window.history.state;\n                        if (this._isStateObjectDefined(state)) {\n                            if (state.target.dest) {\n                                this.initialDestination = state.target.dest;\n                            } else {\n                                this.initialBookmark = state.target.hash;\n                            }\n                            this.currentUid = state.uid;\n                            this.uid = state.uid + 1;\n                            this.current = state.target;\n                        } else {\n                            if (state && state.fingerprint && this.fingerprint !== state.fingerprint) {\n                                this.reInitialized = true;\n                            }\n                            this._pushOrReplaceState({ fingerprint: this.fingerprint }, true);\n                        }\n                        var self = this;\n                        window.addEventListener('popstate', function pdfHistoryPopstate(evt) {\n                            if (!self.historyUnlocked) {\n                                return;\n                            }\n                            if (evt.state) {\n                                self._goTo(evt.state);\n                                return;\n                            }\n                            if (self.uid === 0) {\n                                var previousParams = self.previousHash && self.currentBookmark && self.previousHash !== self.currentBookmark ? {\n                                    hash: self.currentBookmark,\n                                    page: self.currentPage\n                                } : { page: 1 };\n                                replacePreviousHistoryState(previousParams, function () {\n                                    updateHistoryWithCurrentHash();\n                                });\n                            } else {\n                                updateHistoryWithCurrentHash();\n                            }\n                        });\n                        function updateHistoryWithCurrentHash() {\n                            self.previousHash = window.location.hash.slice(1);\n                            self._pushToHistory({ hash: self.previousHash }, false, true);\n                            self._updatePreviousBookmark();\n                        }\n                        function replacePreviousHistoryState(params, callback) {\n                            self.historyUnlocked = false;\n                            self.allowHashChange = false;\n                            window.addEventListener('popstate', rewriteHistoryAfterBack);\n                            history.back();\n                            function rewriteHistoryAfterBack() {\n                                window.removeEventListener('popstate', rewriteHistoryAfterBack);\n                                window.addEventListener('popstate', rewriteHistoryAfterForward);\n                                self._pushToHistory(params, false, true);\n                                history.forward();\n                            }\n                            function rewriteHistoryAfterForward() {\n                                window.removeEventListener('popstate', rewriteHistoryAfterForward);\n                                self.allowHashChange = true;\n                                self.historyUnlocked = true;\n                                callback();\n                            }\n                        }\n                        function pdfHistoryBeforeUnload() {\n                            var previousParams = self._getPreviousParams(null, true);\n                            if (previousParams) {\n                                var replacePrevious = !self.current.dest && self.current.hash !== self.previousHash;\n                                self._pushToHistory(previousParams, false, replacePrevious);\n                                self._updatePreviousBookmark();\n                            }\n                            window.removeEventListener('beforeunload', pdfHistoryBeforeUnload);\n                        }\n                        window.addEventListener('beforeunload', pdfHistoryBeforeUnload);\n                        window.addEventListener('pageshow', function pdfHistoryPageShow(evt) {\n                            window.addEventListener('beforeunload', pdfHistoryBeforeUnload);\n                        });\n                        self.eventBus.on('presentationmodechanged', function (e) {\n                            self.isViewerInPresentationMode = e.active;\n                        });\n                    },\n                    clearHistoryState: function pdfHistory_clearHistoryState() {\n                        this._pushOrReplaceState(null, true);\n                    },\n                    _isStateObjectDefined: function pdfHistory_isStateObjectDefined(state) {\n                        return state && state.uid >= 0 && state.fingerprint && this.fingerprint === state.fingerprint && state.target && state.target.hash ? true : false;\n                    },\n                    _pushOrReplaceState: function pdfHistory_pushOrReplaceState(stateObj, replace) {\n                        if (replace) {\n                            window.history.replaceState(stateObj, '', document.URL);\n                        } else {\n                            window.history.pushState(stateObj, '', document.URL);\n                        }\n                    },\n                    get isHashChangeUnlocked() {\n                        if (!this.initialized) {\n                            return true;\n                        }\n                        return this.allowHashChange;\n                    },\n                    _updatePreviousBookmark: function pdfHistory_updatePreviousBookmark() {\n                        if (this.updatePreviousBookmark && this.currentBookmark && this.currentPage) {\n                            this.previousBookmark = this.currentBookmark;\n                            this.previousPage = this.currentPage;\n                            this.updatePreviousBookmark = false;\n                        }\n                    },\n                    updateCurrentBookmark: function pdfHistoryUpdateCurrentBookmark(bookmark, pageNum) {\n                        if (this.initialized) {\n                            this.currentBookmark = bookmark.substring(1);\n                            this.currentPage = pageNum | 0;\n                            this._updatePreviousBookmark();\n                        }\n                    },\n                    updateNextHashParam: function pdfHistoryUpdateNextHashParam(param) {\n                        if (this.initialized) {\n                            this.nextHashParam = param;\n                        }\n                    },\n                    push: function pdfHistoryPush(params, isInitialBookmark) {\n                        if (!(this.initialized && this.historyUnlocked)) {\n                            return;\n                        }\n                        if (params.dest && !params.hash) {\n                            params.hash = this.current.hash && this.current.dest && this.current.dest === params.dest ? this.current.hash : this.linkService.getDestinationHash(params.dest).split('#')[1];\n                        }\n                        if (params.page) {\n                            params.page |= 0;\n                        }\n                        if (isInitialBookmark) {\n                            var target = window.history.state.target;\n                            if (!target) {\n                                this._pushToHistory(params, false);\n                                this.previousHash = window.location.hash.substring(1);\n                            }\n                            this.updatePreviousBookmark = this.nextHashParam ? false : true;\n                            if (target) {\n                                this._updatePreviousBookmark();\n                            }\n                            return;\n                        }\n                        if (this.nextHashParam) {\n                            if (this.nextHashParam === params.hash) {\n                                this.nextHashParam = null;\n                                this.updatePreviousBookmark = true;\n                                return;\n                            }\n                            this.nextHashParam = null;\n                        }\n                        if (params.hash) {\n                            if (this.current.hash) {\n                                if (this.current.hash !== params.hash) {\n                                    this._pushToHistory(params, true);\n                                } else {\n                                    if (!this.current.page && params.page) {\n                                        this._pushToHistory(params, false, true);\n                                    }\n                                    this.updatePreviousBookmark = true;\n                                }\n                            } else {\n                                this._pushToHistory(params, true);\n                            }\n                        } else if (this.current.page && params.page && this.current.page !== params.page) {\n                            this._pushToHistory(params, true);\n                        }\n                    },\n                    _getPreviousParams: function pdfHistory_getPreviousParams(onlyCheckPage, beforeUnload) {\n                        if (!(this.currentBookmark && this.currentPage)) {\n                            return null;\n                        } else if (this.updatePreviousBookmark) {\n                            this.updatePreviousBookmark = false;\n                        }\n                        if (this.uid > 0 && !(this.previousBookmark && this.previousPage)) {\n                            return null;\n                        }\n                        if (!this.current.dest && !onlyCheckPage || beforeUnload) {\n                            if (this.previousBookmark === this.currentBookmark) {\n                                return null;\n                            }\n                        } else if (this.current.page || onlyCheckPage) {\n                            if (this.previousPage === this.currentPage) {\n                                return null;\n                            }\n                        } else {\n                            return null;\n                        }\n                        var params = {\n                            hash: this.currentBookmark,\n                            page: this.currentPage\n                        };\n                        if (this.isViewerInPresentationMode) {\n                            params.hash = null;\n                        }\n                        return params;\n                    },\n                    _stateObj: function pdfHistory_stateObj(params) {\n                        return {\n                            fingerprint: this.fingerprint,\n                            uid: this.uid,\n                            target: params\n                        };\n                    },\n                    _pushToHistory: function pdfHistory_pushToHistory(params, addPrevious, overwrite) {\n                        if (!this.initialized) {\n                            return;\n                        }\n                        if (!params.hash && params.page) {\n                            params.hash = 'page=' + params.page;\n                        }\n                        if (addPrevious && !overwrite) {\n                            var previousParams = this._getPreviousParams();\n                            if (previousParams) {\n                                var replacePrevious = !this.current.dest && this.current.hash !== this.previousHash;\n                                this._pushToHistory(previousParams, false, replacePrevious);\n                            }\n                        }\n                        this._pushOrReplaceState(this._stateObj(params), overwrite || this.uid === 0);\n                        this.currentUid = this.uid++;\n                        this.current = params;\n                        this.updatePreviousBookmark = true;\n                    },\n                    _goTo: function pdfHistory_goTo(state) {\n                        if (!(this.initialized && this.historyUnlocked && this._isStateObjectDefined(state))) {\n                            return;\n                        }\n                        if (!this.reInitialized && state.uid < this.currentUid) {\n                            var previousParams = this._getPreviousParams(true);\n                            if (previousParams) {\n                                this._pushToHistory(this.current, false);\n                                this._pushToHistory(previousParams, false);\n                                this.currentUid = state.uid;\n                                window.history.back();\n                                return;\n                            }\n                        }\n                        this.historyUnlocked = false;\n                        if (state.target.dest) {\n                            this.linkService.navigateTo(state.target.dest);\n                        } else {\n                            this.linkService.setHash(state.target.hash);\n                        }\n                        this.currentUid = state.uid;\n                        if (state.uid > this.uid) {\n                            this.uid = state.uid;\n                        }\n                        this.current = state.target;\n                        this.updatePreviousBookmark = true;\n                        var currentHash = window.location.hash.substring(1);\n                        if (this.previousHash !== currentHash) {\n                            this.allowHashChange = false;\n                        }\n                        this.previousHash = currentHash;\n                        this.historyUnlocked = true;\n                    },\n                    back: function pdfHistoryBack() {\n                        this.go(-1);\n                    },\n                    forward: function pdfHistoryForward() {\n                        this.go(1);\n                    },\n                    go: function pdfHistoryGo(direction) {\n                        if (this.initialized && this.historyUnlocked) {\n                            var state = window.history.state;\n                            if (direction === -1 && state && state.uid > 0) {\n                                window.history.back();\n                            } else if (direction === 1 && state && state.uid < this.uid - 1) {\n                                window.history.forward();\n                            }\n                        }\n                    }\n                };\n                exports.PDFHistory = PDFHistory;\n\n                /***/\n            }),\n        /* 21 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFOutlineViewer = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var DEFAULT_TITLE = '\\u2013';\n\n                var PDFOutlineViewer = function () {\n                    function PDFOutlineViewer(_ref) {\n                        var container = _ref.container,\n                            linkService = _ref.linkService,\n                            eventBus = _ref.eventBus;\n\n                        _classCallCheck(this, PDFOutlineViewer);\n\n                        this.outline = null;\n                        this.lastToggleIsShow = true;\n                        this.container = container;\n                        this.linkService = linkService;\n                        this.eventBus = eventBus;\n                    }\n\n                    _createClass(PDFOutlineViewer, [{\n                        key: 'reset',\n                        value: function reset() {\n                            this.outline = null;\n                            this.lastToggleIsShow = true;\n                            this.container.textContent = '';\n                            this.container.classList.remove('outlineWithDeepNesting');\n                        }\n                    }, {\n                        key: '_dispatchEvent',\n                        value: function _dispatchEvent(outlineCount) {\n                            this.eventBus.dispatch('outlineloaded', {\n                                source: this,\n                                outlineCount: outlineCount\n                            });\n                        }\n                    }, {\n                        key: '_bindLink',\n                        value: function _bindLink(element, item) {\n                            var _this = this;\n\n                            if (item.url) {\n                                (0, _pdfjsLib.addLinkAttributes)(element, {\n                                    url: item.url,\n                                    target: item.newWindow ? _pdfjsLib.PDFJS.LinkTarget.BLANK : undefined\n                                });\n                                return;\n                            }\n                            var destination = item.dest;\n                            element.href = this.linkService.getDestinationHash(destination);\n                            element.onclick = function () {\n                                if (destination) {\n                                    _this.linkService.navigateTo(destination);\n                                }\n                                return false;\n                            };\n                        }\n                    }, {\n                        key: '_setStyles',\n                        value: function _setStyles(element, item) {\n                            var styleStr = '';\n                            if (item.bold) {\n                                styleStr += 'font-weight: bold;';\n                            }\n                            if (item.italic) {\n                                styleStr += 'font-style: italic;';\n                            }\n                            if (styleStr) {\n                                element.setAttribute('style', styleStr);\n                            }\n                        }\n                    }, {\n                        key: '_addToggleButton',\n                        value: function _addToggleButton(div) {\n                            var _this2 = this;\n\n                            var toggler = document.createElement('div');\n                            toggler.className = 'outlineItemToggler';\n                            toggler.onclick = function (evt) {\n                                evt.stopPropagation();\n                                toggler.classList.toggle('outlineItemsHidden');\n                                if (evt.shiftKey) {\n                                    var shouldShowAll = !toggler.classList.contains('outlineItemsHidden');\n                                    _this2._toggleOutlineItem(div, shouldShowAll);\n                                }\n                            };\n                            div.insertBefore(toggler, div.firstChild);\n                        }\n                    }, {\n                        key: '_toggleOutlineItem',\n                        value: function _toggleOutlineItem(root, show) {\n                            this.lastToggleIsShow = show;\n                            var togglers = root.querySelectorAll('.outlineItemToggler');\n                            for (var i = 0, ii = togglers.length; i < ii; ++i) {\n                                togglers[i].classList[show ? 'remove' : 'add']('outlineItemsHidden');\n                            }\n                        }\n                    }, {\n                        key: 'toggleOutlineTree',\n                        value: function toggleOutlineTree() {\n                            if (!this.outline) {\n                                return;\n                            }\n                            this._toggleOutlineItem(this.container, !this.lastToggleIsShow);\n                        }\n                    }, {\n                        key: 'render',\n                        value: function render(_ref2) {\n                            var outline = _ref2.outline;\n\n                            var outlineCount = 0;\n                            if (this.outline) {\n                                this.reset();\n                            }\n                            this.outline = outline || null;\n                            if (!outline) {\n                                this._dispatchEvent(outlineCount);\n                                return;\n                            }\n                            var fragment = document.createDocumentFragment();\n                            var queue = [{\n                                parent: fragment,\n                                items: this.outline\n                            }];\n                            var hasAnyNesting = false;\n                            while (queue.length > 0) {\n                                var levelData = queue.shift();\n                                for (var i = 0, len = levelData.items.length; i < len; i++) {\n                                    var item = levelData.items[i];\n                                    var div = document.createElement('div');\n                                    div.className = 'outlineItem';\n                                    var element = document.createElement('a');\n                                    this._bindLink(element, item);\n                                    this._setStyles(element, item);\n                                    element.textContent = (0, _pdfjsLib.removeNullCharacters)(item.title) || DEFAULT_TITLE;\n                                    div.appendChild(element);\n                                    if (item.items.length > 0) {\n                                        hasAnyNesting = true;\n                                        this._addToggleButton(div);\n                                        var itemsDiv = document.createElement('div');\n                                        itemsDiv.className = 'outlineItems';\n                                        div.appendChild(itemsDiv);\n                                        queue.push({\n                                            parent: itemsDiv,\n                                            items: item.items\n                                        });\n                                    }\n                                    levelData.parent.appendChild(div);\n                                    outlineCount++;\n                                }\n                            }\n                            if (hasAnyNesting) {\n                                this.container.classList.add('outlineWithDeepNesting');\n                            }\n                            this.container.appendChild(fragment);\n                            this._dispatchEvent(outlineCount);\n                        }\n                    }]);\n\n                    return PDFOutlineViewer;\n                }();\n\n                exports.PDFOutlineViewer = PDFOutlineViewer;\n\n                /***/\n            }),\n        /* 22 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFPageView = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                var _dom_events = __webpack_require__(2);\n\n                var _pdf_rendering_queue = __webpack_require__(3);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var PDFPageView = function () {\n                    function PDFPageView(options) {\n                        _classCallCheck(this, PDFPageView);\n\n                        var container = options.container;\n                        var defaultViewport = options.defaultViewport;\n                        this.id = options.id;\n                        this.renderingId = 'page' + this.id;\n                        this.pdfPage = null;\n                        this.pageLabel = null;\n                        this.rotation = 0;\n                        this.scale = options.scale || _ui_utils.DEFAULT_SCALE;\n                        this.viewport = defaultViewport;\n                        this.pdfPageRotate = defaultViewport.rotation;\n                        this.hasRestrictedScaling = false;\n                        this.enhanceTextSelection = options.enhanceTextSelection || false;\n                        this.renderInteractiveForms = options.renderInteractiveForms || false;\n                        this.eventBus = options.eventBus || (0, _dom_events.getGlobalEventBus)();\n                        this.renderingQueue = options.renderingQueue;\n                        this.textLayerFactory = options.textLayerFactory;\n                        this.annotationLayerFactory = options.annotationLayerFactory;\n                        this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;\n                        this.l10n = options.l10n || _ui_utils.NullL10n;\n                        this.paintTask = null;\n                        this.paintedViewportMap = new WeakMap();\n                        this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\n                        this.resume = null;\n                        this.error = null;\n                        this.onBeforeDraw = null;\n                        this.onAfterDraw = null;\n                        this.annotationLayer = null;\n                        this.textLayer = null;\n                        this.zoomLayer = null;\n                        var div = document.createElement('div');\n                        div.className = 'page';\n                        div.style.width = Math.floor(this.viewport.width) + 'px';\n                        div.style.height = Math.floor(this.viewport.height) + 'px';\n                        div.setAttribute('data-page-number', this.id);\n                        this.div = div;\n                        container.appendChild(div);\n                    }\n\n                    _createClass(PDFPageView, [{\n                        key: 'setPdfPage',\n                        value: function setPdfPage(pdfPage) {\n                            this.pdfPage = pdfPage;\n                            this.pdfPageRotate = pdfPage.rotate;\n                            var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n                            this.viewport = pdfPage.getViewport(this.scale * _ui_utils.CSS_UNITS, totalRotation);\n                            this.stats = pdfPage.stats;\n                            this.reset();\n                        }\n                    }, {\n                        key: 'destroy',\n                        value: function destroy() {\n                            this.reset();\n                            if (this.pdfPage) {\n                                this.pdfPage.cleanup();\n                                this.pdfPage = null;\n                            }\n                        }\n                    }, {\n                        key: '_resetZoomLayer',\n                        value: function _resetZoomLayer() {\n                            var removeFromDOM = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n                            if (!this.zoomLayer) {\n                                return;\n                            }\n                            var zoomLayerCanvas = this.zoomLayer.firstChild;\n                            this.paintedViewportMap.delete(zoomLayerCanvas);\n                            zoomLayerCanvas.width = 0;\n                            zoomLayerCanvas.height = 0;\n                            if (removeFromDOM) {\n                                this.zoomLayer.remove();\n                            }\n                            this.zoomLayer = null;\n                        }\n                    }, {\n                        key: 'reset',\n                        value: function reset() {\n                            var keepZoomLayer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n                            var keepAnnotations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n                            this.cancelRendering();\n                            var div = this.div;\n                            div.style.width = Math.floor(this.viewport.width) + 'px';\n                            div.style.height = Math.floor(this.viewport.height) + 'px';\n                            var childNodes = div.childNodes;\n                            var currentZoomLayerNode = keepZoomLayer && this.zoomLayer || null;\n                            var currentAnnotationNode = keepAnnotations && this.annotationLayer && this.annotationLayer.div || null;\n                            for (var i = childNodes.length - 1; i >= 0; i--) {\n                                var node = childNodes[i];\n                                if (currentZoomLayerNode === node || currentAnnotationNode === node) {\n                                    continue;\n                                }\n                                div.removeChild(node);\n                            }\n                            div.removeAttribute('data-loaded');\n                            if (currentAnnotationNode) {\n                                this.annotationLayer.hide();\n                            } else {\n                                this.annotationLayer = null;\n                            }\n                            if (!currentZoomLayerNode) {\n                                if (this.canvas) {\n                                    this.paintedViewportMap.delete(this.canvas);\n                                    this.canvas.width = 0;\n                                    this.canvas.height = 0;\n                                    delete this.canvas;\n                                }\n                                this._resetZoomLayer();\n                            }\n                            if (this.svg) {\n                                this.paintedViewportMap.delete(this.svg);\n                                delete this.svg;\n                            }\n                            this.loadingIconDiv = document.createElement('div');\n                            this.loadingIconDiv.className = 'loadingIcon';\n                            div.appendChild(this.loadingIconDiv);\n                        }\n                    }, {\n                        key: 'update',\n                        value: function update(scale, rotation) {\n                            this.scale = scale || this.scale;\n                            if (typeof rotation !== 'undefined') {\n                                this.rotation = rotation;\n                            }\n                            var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n                            this.viewport = this.viewport.clone({\n                                scale: this.scale * _ui_utils.CSS_UNITS,\n                                rotation: totalRotation\n                            });\n                            if (this.svg) {\n                                this.cssTransform(this.svg, true);\n                                this.eventBus.dispatch('pagerendered', {\n                                    source: this,\n                                    pageNumber: this.id,\n                                    cssTransform: true\n                                });\n                                return;\n                            }\n                            var isScalingRestricted = false;\n                            if (this.canvas && _pdfjsLib.PDFJS.maxCanvasPixels > 0) {\n                                var outputScale = this.outputScale;\n                                if ((Math.floor(this.viewport.width) * outputScale.sx | 0) * (Math.floor(this.viewport.height) * outputScale.sy | 0) > _pdfjsLib.PDFJS.maxCanvasPixels) {\n                                    isScalingRestricted = true;\n                                }\n                            }\n                            if (this.canvas) {\n                                if (_pdfjsLib.PDFJS.useOnlyCssZoom || this.hasRestrictedScaling && isScalingRestricted) {\n                                    this.cssTransform(this.canvas, true);\n                                    this.eventBus.dispatch('pagerendered', {\n                                        source: this,\n                                        pageNumber: this.id,\n                                        cssTransform: true\n                                    });\n                                    return;\n                                }\n                                if (!this.zoomLayer && !this.canvas.hasAttribute('hidden')) {\n                                    this.zoomLayer = this.canvas.parentNode;\n                                    this.zoomLayer.style.position = 'absolute';\n                                }\n                            }\n                            if (this.zoomLayer) {\n                                this.cssTransform(this.zoomLayer.firstChild);\n                            }\n                            this.reset(true, true);\n                        }\n                    }, {\n                        key: 'cancelRendering',\n                        value: function cancelRendering() {\n                            if (this.paintTask) {\n                                this.paintTask.cancel();\n                                this.paintTask = null;\n                            }\n                            this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\n                            this.resume = null;\n                            if (this.textLayer) {\n                                this.textLayer.cancel();\n                                this.textLayer = null;\n                            }\n                        }\n                    }, {\n                        key: 'cssTransform',\n                        value: function cssTransform(target) {\n                            var redrawAnnotations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n                            var width = this.viewport.width;\n                            var height = this.viewport.height;\n                            var div = this.div;\n                            target.style.width = target.parentNode.style.width = div.style.width = Math.floor(width) + 'px';\n                            target.style.height = target.parentNode.style.height = div.style.height = Math.floor(height) + 'px';\n                            var relativeRotation = this.viewport.rotation - this.paintedViewportMap.get(target).rotation;\n                            var absRotation = Math.abs(relativeRotation);\n                            var scaleX = 1,\n                                scaleY = 1;\n                            if (absRotation === 90 || absRotation === 270) {\n                                scaleX = height / width;\n                                scaleY = width / height;\n                            }\n                            var cssTransform = 'rotate(' + relativeRotation + 'deg) ' + 'scale(' + scaleX + ',' + scaleY + ')';\n                            _pdfjsLib.CustomStyle.setProp('transform', target, cssTransform);\n                            if (this.textLayer) {\n                                var textLayerViewport = this.textLayer.viewport;\n                                var textRelativeRotation = this.viewport.rotation - textLayerViewport.rotation;\n                                var textAbsRotation = Math.abs(textRelativeRotation);\n                                var scale = width / textLayerViewport.width;\n                                if (textAbsRotation === 90 || textAbsRotation === 270) {\n                                    scale = width / textLayerViewport.height;\n                                }\n                                var textLayerDiv = this.textLayer.textLayerDiv;\n                                var transX = void 0,\n                                    transY = void 0;\n                                switch (textAbsRotation) {\n                                    case 0:\n                                        transX = transY = 0;\n                                        break;\n                                    case 90:\n                                        transX = 0;\n                                        transY = '-' + textLayerDiv.style.height;\n                                        break;\n                                    case 180:\n                                        transX = '-' + textLayerDiv.style.width;\n                                        transY = '-' + textLayerDiv.style.height;\n                                        break;\n                                    case 270:\n                                        transX = '-' + textLayerDiv.style.width;\n                                        transY = 0;\n                                        break;\n                                    default:\n                                        console.error('Bad rotation value.');\n                                        break;\n                                }\n                                _pdfjsLib.CustomStyle.setProp('transform', textLayerDiv, 'rotate(' + textAbsRotation + 'deg) ' + 'scale(' + scale + ', ' + scale + ') ' + 'translate(' + transX + ', ' + transY + ')');\n                                _pdfjsLib.CustomStyle.setProp('transformOrigin', textLayerDiv, '0% 0%');\n                            }\n                            if (redrawAnnotations && this.annotationLayer) {\n                                this.annotationLayer.render(this.viewport, 'display');\n                            }\n                        }\n                    }, {\n                        key: 'getPagePoint',\n                        value: function getPagePoint(x, y) {\n                            return this.viewport.convertToPdfPoint(x, y);\n                        }\n                    }, {\n                        key: 'draw',\n                        value: function draw() {\n                            var _this = this;\n\n                            if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {\n                                console.error('Must be in new state before drawing');\n                                this.reset();\n                            }\n                            if (!this.pdfPage) {\n                                this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n                                return Promise.reject(new Error('Page is not loaded'));\n                            }\n                            this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\n                            var pdfPage = this.pdfPage;\n                            var div = this.div;\n                            var canvasWrapper = document.createElement('div');\n                            canvasWrapper.style.width = div.style.width;\n                            canvasWrapper.style.height = div.style.height;\n                            canvasWrapper.classList.add('canvasWrapper');\n                            if (this.annotationLayer && this.annotationLayer.div) {\n                                div.insertBefore(canvasWrapper, this.annotationLayer.div);\n                            } else {\n                                div.appendChild(canvasWrapper);\n                            }\n                            var textLayer = null;\n                            if (this.textLayerFactory) {\n                                var textLayerDiv = document.createElement('div');\n                                textLayerDiv.className = 'textLayer';\n                                textLayerDiv.style.width = canvasWrapper.style.width;\n                                textLayerDiv.style.height = canvasWrapper.style.height;\n                                if (this.annotationLayer && this.annotationLayer.div) {\n                                    div.insertBefore(textLayerDiv, this.annotationLayer.div);\n                                } else {\n                                    div.appendChild(textLayerDiv);\n                                }\n                                textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv, this.id - 1, this.viewport, this.enhanceTextSelection);\n                            }\n                            this.textLayer = textLayer;\n                            var renderContinueCallback = null;\n                            if (this.renderingQueue) {\n                                renderContinueCallback = function renderContinueCallback(cont) {\n                                    if (!_this.renderingQueue.isHighestPriority(_this)) {\n                                        _this.renderingState = _pdf_rendering_queue.RenderingStates.PAUSED;\n                                        _this.resume = function () {\n                                            _this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\n                                            cont();\n                                        };\n                                        return;\n                                    }\n                                    cont();\n                                };\n                            }\n                            var finishPaintTask = function finishPaintTask(error) {\n                                if (paintTask === _this.paintTask) {\n                                    _this.paintTask = null;\n                                }\n                                if (error === 'cancelled' || error instanceof _pdfjsLib.RenderingCancelledException) {\n                                    _this.error = null;\n                                    return Promise.resolve(undefined);\n                                }\n                                _this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n                                if (_this.loadingIconDiv) {\n                                    div.removeChild(_this.loadingIconDiv);\n                                    delete _this.loadingIconDiv;\n                                }\n                                _this._resetZoomLayer(true);\n                                _this.error = error;\n                                _this.stats = pdfPage.stats;\n                                if (_this.onAfterDraw) {\n                                    _this.onAfterDraw();\n                                }\n                                _this.eventBus.dispatch('pagerendered', {\n                                    source: _this,\n                                    pageNumber: _this.id,\n                                    cssTransform: false\n                                });\n                                if (error) {\n                                    return Promise.reject(error);\n                                }\n                                return Promise.resolve(undefined);\n                            };\n                            var paintTask = this.renderer === _ui_utils.RendererType.SVG ? this.paintOnSvg(canvasWrapper) : this.paintOnCanvas(canvasWrapper);\n                            paintTask.onRenderContinue = renderContinueCallback;\n                            this.paintTask = paintTask;\n                            var resultPromise = paintTask.promise.then(function () {\n                                return finishPaintTask(null).then(function () {\n                                    if (textLayer) {\n                                        var readableStream = pdfPage.streamTextContent({ normalizeWhitespace: true });\n                                        textLayer.setTextContentStream(readableStream);\n                                        textLayer.render();\n                                    }\n                                });\n                            }, function (reason) {\n                                return finishPaintTask(reason);\n                            });\n                            if (this.annotationLayerFactory) {\n                                if (!this.annotationLayer) {\n                                    this.annotationLayer = this.annotationLayerFactory.createAnnotationLayerBuilder(div, pdfPage, this.renderInteractiveForms, this.l10n);\n                                }\n                                this.annotationLayer.render(this.viewport, 'display');\n                            }\n                            div.setAttribute('data-loaded', true);\n                            if (this.onBeforeDraw) {\n                                this.onBeforeDraw();\n                            }\n                            return resultPromise;\n                        }\n                    }, {\n                        key: 'paintOnCanvas',\n                        value: function paintOnCanvas(canvasWrapper) {\n                            var renderCapability = (0, _pdfjsLib.createPromiseCapability)();\n                            var result = {\n                                promise: renderCapability.promise,\n                                onRenderContinue: function onRenderContinue(cont) {\n                                    cont();\n                                },\n                                cancel: function cancel() {\n                                    renderTask.cancel();\n                                }\n                            };\n                            var viewport = this.viewport;\n                            var canvas = document.createElement('canvas');\n                            canvas.id = this.renderingId;\n                            canvas.setAttribute('hidden', 'hidden');\n                            var isCanvasHidden = true;\n                            var showCanvas = function showCanvas() {\n                                if (isCanvasHidden) {\n                                    canvas.removeAttribute('hidden');\n                                    isCanvasHidden = false;\n                                }\n                            };\n                            canvasWrapper.appendChild(canvas);\n                            this.canvas = canvas;\n                            canvas.mozOpaque = true;\n                            var ctx = canvas.getContext('2d', { alpha: false });\n                            var outputScale = (0, _ui_utils.getOutputScale)(ctx);\n                            this.outputScale = outputScale;\n                            if (_pdfjsLib.PDFJS.useOnlyCssZoom) {\n                                var actualSizeViewport = viewport.clone({ scale: _ui_utils.CSS_UNITS });\n                                outputScale.sx *= actualSizeViewport.width / viewport.width;\n                                outputScale.sy *= actualSizeViewport.height / viewport.height;\n                                outputScale.scaled = true;\n                            }\n                            if (_pdfjsLib.PDFJS.maxCanvasPixels > 0) {\n                                var pixelsInViewport = viewport.width * viewport.height;\n                                var maxScale = Math.sqrt(_pdfjsLib.PDFJS.maxCanvasPixels / pixelsInViewport);\n                                if (outputScale.sx > maxScale || outputScale.sy > maxScale) {\n                                    outputScale.sx = maxScale;\n                                    outputScale.sy = maxScale;\n                                    outputScale.scaled = true;\n                                    this.hasRestrictedScaling = true;\n                                } else {\n                                    this.hasRestrictedScaling = false;\n                                }\n                            }\n                            var sfx = (0, _ui_utils.approximateFraction)(outputScale.sx);\n                            var sfy = (0, _ui_utils.approximateFraction)(outputScale.sy);\n                            canvas.width = (0, _ui_utils.roundToDivide)(viewport.width * outputScale.sx, sfx[0]);\n                            canvas.height = (0, _ui_utils.roundToDivide)(viewport.height * outputScale.sy, sfy[0]);\n                            canvas.style.width = (0, _ui_utils.roundToDivide)(viewport.width, sfx[1]) + 'px';\n                            canvas.style.height = (0, _ui_utils.roundToDivide)(viewport.height, sfy[1]) + 'px';\n                            this.paintedViewportMap.set(canvas, viewport);\n                            var transform = !outputScale.scaled ? null : [outputScale.sx, 0, 0, outputScale.sy, 0, 0];\n                            var renderContext = {\n                                canvasContext: ctx,\n                                transform: transform,\n                                viewport: this.viewport,\n                                renderInteractiveForms: this.renderInteractiveForms\n                            };\n                            var renderTask = this.pdfPage.render(renderContext);\n                            renderTask.onContinue = function (cont) {\n                                showCanvas();\n                                if (result.onRenderContinue) {\n                                    result.onRenderContinue(cont);\n                                } else {\n                                    cont();\n                                }\n                            };\n                            renderTask.promise.then(function () {\n                                showCanvas();\n                                renderCapability.resolve(undefined);\n                            }, function (error) {\n                                showCanvas();\n                                renderCapability.reject(error);\n                            });\n                            return result;\n                        }\n                    }, {\n                        key: 'paintOnSvg',\n                        value: function paintOnSvg(wrapper) {\n                            var _this2 = this;\n\n                            var cancelled = false;\n                            var ensureNotCancelled = function ensureNotCancelled() {\n                                if (cancelled) {\n                                    if (_pdfjsLib.PDFJS.pdfjsNext) {\n                                        throw new _pdfjsLib.RenderingCancelledException('Rendering cancelled, page ' + _this2.id, 'svg');\n                                    } else {\n                                        throw 'cancelled';\n                                    }\n                                }\n                            };\n                            var pdfPage = this.pdfPage;\n                            var actualSizeViewport = this.viewport.clone({ scale: _ui_utils.CSS_UNITS });\n                            var promise = pdfPage.getOperatorList().then(function (opList) {\n                                ensureNotCancelled();\n                                var svgGfx = new _pdfjsLib.SVGGraphics(pdfPage.commonObjs, pdfPage.objs);\n                                return svgGfx.getSVG(opList, actualSizeViewport).then(function (svg) {\n                                    ensureNotCancelled();\n                                    _this2.svg = svg;\n                                    _this2.paintedViewportMap.set(svg, actualSizeViewport);\n                                    svg.style.width = wrapper.style.width;\n                                    svg.style.height = wrapper.style.height;\n                                    _this2.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n                                    wrapper.appendChild(svg);\n                                });\n                            });\n                            return {\n                                promise: promise,\n                                onRenderContinue: function onRenderContinue(cont) {\n                                    cont();\n                                },\n                                cancel: function cancel() {\n                                    cancelled = true;\n                                }\n                            };\n                        }\n                    }, {\n                        key: 'setPageLabel',\n                        value: function setPageLabel(label) {\n                            this.pageLabel = typeof label === 'string' ? label : null;\n                            if (this.pageLabel !== null) {\n                                this.div.setAttribute('data-page-label', this.pageLabel);\n                            } else {\n                                this.div.removeAttribute('data-page-label');\n                            }\n                        }\n                    }, {\n                        key: 'width',\n                        get: function get() {\n                            return this.viewport.width;\n                        }\n                    }, {\n                        key: 'height',\n                        get: function get() {\n                            return this.viewport.height;\n                        }\n                    }]);\n\n                    return PDFPageView;\n                }();\n\n                exports.PDFPageView = PDFPageView;\n\n                /***/\n            }),\n        /* 23 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFPresentationMode = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1500;\n                var DELAY_BEFORE_HIDING_CONTROLS = 3000;\n                var ACTIVE_SELECTOR = 'pdfPresentationMode';\n                var CONTROLS_SELECTOR = 'pdfPresentationModeControls';\n                var MOUSE_SCROLL_COOLDOWN_TIME = 50;\n                var PAGE_SWITCH_THRESHOLD = 0.1;\n                var SWIPE_MIN_DISTANCE_THRESHOLD = 50;\n                var SWIPE_ANGLE_THRESHOLD = Math.PI / 6;\n\n                var PDFPresentationMode = function () {\n                    function PDFPresentationMode(_ref) {\n                        var _this = this;\n\n                        var container = _ref.container,\n                            _ref$viewer = _ref.viewer,\n                            viewer = _ref$viewer === undefined ? null : _ref$viewer,\n                            pdfViewer = _ref.pdfViewer,\n                            eventBus = _ref.eventBus,\n                            _ref$contextMenuItems = _ref.contextMenuItems,\n                            contextMenuItems = _ref$contextMenuItems === undefined ? null : _ref$contextMenuItems;\n\n                        _classCallCheck(this, PDFPresentationMode);\n\n                        this.container = container;\n                        this.viewer = viewer || container.firstElementChild;\n                        this.pdfViewer = pdfViewer;\n                        this.eventBus = eventBus;\n                        this.active = false;\n                        this.args = null;\n                        this.contextMenuOpen = false;\n                        this.mouseScrollTimeStamp = 0;\n                        this.mouseScrollDelta = 0;\n                        this.touchSwipeState = null;\n                        if (contextMenuItems) {\n                            contextMenuItems.contextFirstPage.addEventListener('click', function () {\n                                _this.contextMenuOpen = false;\n                                _this.eventBus.dispatch('firstpage');\n                            });\n                            contextMenuItems.contextLastPage.addEventListener('click', function () {\n                                _this.contextMenuOpen = false;\n                                _this.eventBus.dispatch('lastpage');\n                            });\n                            contextMenuItems.contextPageRotateCw.addEventListener('click', function () {\n                                _this.contextMenuOpen = false;\n                                _this.eventBus.dispatch('rotatecw');\n                            });\n                            contextMenuItems.contextPageRotateCcw.addEventListener('click', function () {\n                                _this.contextMenuOpen = false;\n                                _this.eventBus.dispatch('rotateccw');\n                            });\n                        }\n                    }\n\n                    _createClass(PDFPresentationMode, [{\n                        key: 'request',\n                        value: function request() {\n                            if (this.switchInProgress || this.active || !this.viewer.hasChildNodes()) {\n                                return false;\n                            }\n                            this._addFullscreenChangeListeners();\n                            this._setSwitchInProgress();\n                            this._notifyStateChange();\n                            if (this.container.requestFullscreen) {\n                                this.container.requestFullscreen();\n                            } else if (this.container.mozRequestFullScreen) {\n                                this.container.mozRequestFullScreen();\n                            } else if (this.container.webkitRequestFullscreen) {\n                                this.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);\n                            } else if (this.container.msRequestFullscreen) {\n                                this.container.msRequestFullscreen();\n                            } else {\n                                return false;\n                            }\n                            this.args = {\n                                page: this.pdfViewer.currentPageNumber,\n                                previousScale: this.pdfViewer.currentScaleValue\n                            };\n                            return true;\n                        }\n                    }, {\n                        key: '_mouseWheel',\n                        value: function _mouseWheel(evt) {\n                            if (!this.active) {\n                                return;\n                            }\n                            evt.preventDefault();\n                            var delta = (0, _ui_utils.normalizeWheelEventDelta)(evt);\n                            var currentTime = new Date().getTime();\n                            var storedTime = this.mouseScrollTimeStamp;\n                            if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) {\n                                return;\n                            }\n                            if (this.mouseScrollDelta > 0 && delta < 0 || this.mouseScrollDelta < 0 && delta > 0) {\n                                this._resetMouseScrollState();\n                            }\n                            this.mouseScrollDelta += delta;\n                            if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) {\n                                var totalDelta = this.mouseScrollDelta;\n                                this._resetMouseScrollState();\n                                var success = totalDelta > 0 ? this._goToPreviousPage() : this._goToNextPage();\n                                if (success) {\n                                    this.mouseScrollTimeStamp = currentTime;\n                                }\n                            }\n                        }\n                    }, {\n                        key: '_goToPreviousPage',\n                        value: function _goToPreviousPage() {\n                            var page = this.pdfViewer.currentPageNumber;\n                            if (page <= 1) {\n                                return false;\n                            }\n                            this.pdfViewer.currentPageNumber = page - 1;\n                            return true;\n                        }\n                    }, {\n                        key: '_goToNextPage',\n                        value: function _goToNextPage() {\n                            var page = this.pdfViewer.currentPageNumber;\n                            if (page >= this.pdfViewer.pagesCount) {\n                                return false;\n                            }\n                            this.pdfViewer.currentPageNumber = page + 1;\n                            return true;\n                        }\n                    }, {\n                        key: '_notifyStateChange',\n                        value: function _notifyStateChange() {\n                            this.eventBus.dispatch('presentationmodechanged', {\n                                source: this,\n                                active: this.active,\n                                switchInProgress: !!this.switchInProgress\n                            });\n                        }\n                    }, {\n                        key: '_setSwitchInProgress',\n                        value: function _setSwitchInProgress() {\n                            var _this2 = this;\n\n                            if (this.switchInProgress) {\n                                clearTimeout(this.switchInProgress);\n                            }\n                            this.switchInProgress = setTimeout(function () {\n                                _this2._removeFullscreenChangeListeners();\n                                delete _this2.switchInProgress;\n                                _this2._notifyStateChange();\n                            }, DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);\n                        }\n                    }, {\n                        key: '_resetSwitchInProgress',\n                        value: function _resetSwitchInProgress() {\n                            if (this.switchInProgress) {\n                                clearTimeout(this.switchInProgress);\n                                delete this.switchInProgress;\n                            }\n                        }\n                    }, {\n                        key: '_enter',\n                        value: function _enter() {\n                            var _this3 = this;\n\n                            this.active = true;\n                            this._resetSwitchInProgress();\n                            this._notifyStateChange();\n                            this.container.classList.add(ACTIVE_SELECTOR);\n                            setTimeout(function () {\n                                _this3.pdfViewer.currentPageNumber = _this3.args.page;\n                                _this3.pdfViewer.currentScaleValue = 'page-fit';\n                            }, 0);\n                            this._addWindowListeners();\n                            this._showControls();\n                            this.contextMenuOpen = false;\n                            this.container.setAttribute('contextmenu', 'viewerContextMenu');\n                            window.getSelection().removeAllRanges();\n                        }\n                    }, {\n                        key: '_exit',\n                        value: function _exit() {\n                            var _this4 = this;\n\n                            var page = this.pdfViewer.currentPageNumber;\n                            this.container.classList.remove(ACTIVE_SELECTOR);\n                            setTimeout(function () {\n                                _this4.active = false;\n                                _this4._removeFullscreenChangeListeners();\n                                _this4._notifyStateChange();\n                                _this4.pdfViewer.currentScaleValue = _this4.args.previousScale;\n                                _this4.pdfViewer.currentPageNumber = page;\n                                _this4.args = null;\n                            }, 0);\n                            this._removeWindowListeners();\n                            this._hideControls();\n                            this._resetMouseScrollState();\n                            this.container.removeAttribute('contextmenu');\n                            this.contextMenuOpen = false;\n                        }\n                    }, {\n                        key: '_mouseDown',\n                        value: function _mouseDown(evt) {\n                            if (this.contextMenuOpen) {\n                                this.contextMenuOpen = false;\n                                evt.preventDefault();\n                                return;\n                            }\n                            if (evt.button === 0) {\n                                var isInternalLink = evt.target.href && evt.target.classList.contains('internalLink');\n                                if (!isInternalLink) {\n                                    evt.preventDefault();\n                                    if (evt.shiftKey) {\n                                        this._goToPreviousPage();\n                                    } else {\n                                        this._goToNextPage();\n                                    }\n                                }\n                            }\n                        }\n                    }, {\n                        key: '_contextMenu',\n                        value: function _contextMenu() {\n                            this.contextMenuOpen = true;\n                        }\n                    }, {\n                        key: '_showControls',\n                        value: function _showControls() {\n                            var _this5 = this;\n\n                            if (this.controlsTimeout) {\n                                clearTimeout(this.controlsTimeout);\n                            } else {\n                                this.container.classList.add(CONTROLS_SELECTOR);\n                            }\n                            this.controlsTimeout = setTimeout(function () {\n                                _this5.container.classList.remove(CONTROLS_SELECTOR);\n                                delete _this5.controlsTimeout;\n                            }, DELAY_BEFORE_HIDING_CONTROLS);\n                        }\n                    }, {\n                        key: '_hideControls',\n                        value: function _hideControls() {\n                            if (!this.controlsTimeout) {\n                                return;\n                            }\n                            clearTimeout(this.controlsTimeout);\n                            this.container.classList.remove(CONTROLS_SELECTOR);\n                            delete this.controlsTimeout;\n                        }\n                    }, {\n                        key: '_resetMouseScrollState',\n                        value: function _resetMouseScrollState() {\n                            this.mouseScrollTimeStamp = 0;\n                            this.mouseScrollDelta = 0;\n                        }\n                    }, {\n                        key: '_touchSwipe',\n                        value: function _touchSwipe(evt) {\n                            if (!this.active) {\n                                return;\n                            }\n                            if (evt.touches.length > 1) {\n                                this.touchSwipeState = null;\n                                return;\n                            }\n                            switch (evt.type) {\n                                case 'touchstart':\n                                    this.touchSwipeState = {\n                                        startX: evt.touches[0].pageX,\n                                        startY: evt.touches[0].pageY,\n                                        endX: evt.touches[0].pageX,\n                                        endY: evt.touches[0].pageY\n                                    };\n                                    break;\n                                case 'touchmove':\n                                    if (this.touchSwipeState === null) {\n                                        return;\n                                    }\n                                    this.touchSwipeState.endX = evt.touches[0].pageX;\n                                    this.touchSwipeState.endY = evt.touches[0].pageY;\n                                    evt.preventDefault();\n                                    break;\n                                case 'touchend':\n                                    if (this.touchSwipeState === null) {\n                                        return;\n                                    }\n                                    var delta = 0;\n                                    var dx = this.touchSwipeState.endX - this.touchSwipeState.startX;\n                                    var dy = this.touchSwipeState.endY - this.touchSwipeState.startY;\n                                    var absAngle = Math.abs(Math.atan2(dy, dx));\n                                    if (Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD && (absAngle <= SWIPE_ANGLE_THRESHOLD || absAngle >= Math.PI - SWIPE_ANGLE_THRESHOLD)) {\n                                        delta = dx;\n                                    } else if (Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD && Math.abs(absAngle - Math.PI / 2) <= SWIPE_ANGLE_THRESHOLD) {\n                                        delta = dy;\n                                    }\n                                    if (delta > 0) {\n                                        this._goToPreviousPage();\n                                    } else if (delta < 0) {\n                                        this._goToNextPage();\n                                    }\n                                    break;\n                            }\n                        }\n                    }, {\n                        key: '_addWindowListeners',\n                        value: function _addWindowListeners() {\n                            this.showControlsBind = this._showControls.bind(this);\n                            this.mouseDownBind = this._mouseDown.bind(this);\n                            this.mouseWheelBind = this._mouseWheel.bind(this);\n                            this.resetMouseScrollStateBind = this._resetMouseScrollState.bind(this);\n                            this.contextMenuBind = this._contextMenu.bind(this);\n                            this.touchSwipeBind = this._touchSwipe.bind(this);\n                            window.addEventListener('mousemove', this.showControlsBind);\n                            window.addEventListener('mousedown', this.mouseDownBind);\n                            window.addEventListener('wheel', this.mouseWheelBind);\n                            window.addEventListener('keydown', this.resetMouseScrollStateBind);\n                            window.addEventListener('contextmenu', this.contextMenuBind);\n                            window.addEventListener('touchstart', this.touchSwipeBind);\n                            window.addEventListener('touchmove', this.touchSwipeBind);\n                            window.addEventListener('touchend', this.touchSwipeBind);\n                        }\n                    }, {\n                        key: '_removeWindowListeners',\n                        value: function _removeWindowListeners() {\n                            window.removeEventListener('mousemove', this.showControlsBind);\n                            window.removeEventListener('mousedown', this.mouseDownBind);\n                            window.removeEventListener('wheel', this.mouseWheelBind);\n                            window.removeEventListener('keydown', this.resetMouseScrollStateBind);\n                            window.removeEventListener('contextmenu', this.contextMenuBind);\n                            window.removeEventListener('touchstart', this.touchSwipeBind);\n                            window.removeEventListener('touchmove', this.touchSwipeBind);\n                            window.removeEventListener('touchend', this.touchSwipeBind);\n                            delete this.showControlsBind;\n                            delete this.mouseDownBind;\n                            delete this.mouseWheelBind;\n                            delete this.resetMouseScrollStateBind;\n                            delete this.contextMenuBind;\n                            delete this.touchSwipeBind;\n                        }\n                    }, {\n                        key: '_fullscreenChange',\n                        value: function _fullscreenChange() {\n                            if (this.isFullscreen) {\n                                this._enter();\n                            } else {\n                                this._exit();\n                            }\n                        }\n                    }, {\n                        key: '_addFullscreenChangeListeners',\n                        value: function _addFullscreenChangeListeners() {\n                            this.fullscreenChangeBind = this._fullscreenChange.bind(this);\n                            window.addEventListener('fullscreenchange', this.fullscreenChangeBind);\n                            window.addEventListener('mozfullscreenchange', this.fullscreenChangeBind);\n                            window.addEventListener('webkitfullscreenchange', this.fullscreenChangeBind);\n                            window.addEventListener('MSFullscreenChange', this.fullscreenChangeBind);\n                        }\n                    }, {\n                        key: '_removeFullscreenChangeListeners',\n                        value: function _removeFullscreenChangeListeners() {\n                            window.removeEventListener('fullscreenchange', this.fullscreenChangeBind);\n                            window.removeEventListener('mozfullscreenchange', this.fullscreenChangeBind);\n                            window.removeEventListener('webkitfullscreenchange', this.fullscreenChangeBind);\n                            window.removeEventListener('MSFullscreenChange', this.fullscreenChangeBind);\n                            delete this.fullscreenChangeBind;\n                        }\n                    }, {\n                        key: 'isFullscreen',\n                        get: function get() {\n                            return !!(document.fullscreenElement || document.mozFullScreen || document.webkitIsFullScreen || document.msFullscreenElement);\n                        }\n                    }]);\n\n                    return PDFPresentationMode;\n                }();\n\n                exports.PDFPresentationMode = PDFPresentationMode;\n\n                /***/\n            }),\n        /* 24 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFSidebar = exports.SidebarView = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdf_rendering_queue = __webpack_require__(3);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var UI_NOTIFICATION_CLASS = 'pdfSidebarNotification';\n                var SidebarView = {\n                    NONE: 0,\n                    THUMBS: 1,\n                    OUTLINE: 2,\n                    ATTACHMENTS: 3\n                };\n\n                var PDFSidebar = function () {\n                    function PDFSidebar(options) {\n                        var l10n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _ui_utils.NullL10n;\n\n                        _classCallCheck(this, PDFSidebar);\n\n                        this.isOpen = false;\n                        this.active = SidebarView.THUMBS;\n                        this.isInitialViewSet = false;\n                        this.onToggled = null;\n                        this.pdfViewer = options.pdfViewer;\n                        this.pdfThumbnailViewer = options.pdfThumbnailViewer;\n                        this.pdfOutlineViewer = options.pdfOutlineViewer;\n                        this.mainContainer = options.mainContainer;\n                        this.outerContainer = options.outerContainer;\n                        this.eventBus = options.eventBus;\n                        this.toggleButton = options.toggleButton;\n                        this.thumbnailButton = options.thumbnailButton;\n                        this.outlineButton = options.outlineButton;\n                        this.attachmentsButton = options.attachmentsButton;\n                        this.thumbnailView = options.thumbnailView;\n                        this.outlineView = options.outlineView;\n                        this.attachmentsView = options.attachmentsView;\n                        this.disableNotification = options.disableNotification || false;\n                        this.l10n = l10n;\n                        this._addEventListeners();\n                    }\n\n                    _createClass(PDFSidebar, [{\n                        key: 'reset',\n                        value: function reset() {\n                            this.isInitialViewSet = false;\n                            this._hideUINotification(null);\n                            this.switchView(SidebarView.THUMBS);\n                            this.outlineButton.disabled = false;\n                            this.attachmentsButton.disabled = false;\n                        }\n                    }, {\n                        key: 'setInitialView',\n                        value: function setInitialView(view) {\n                            if (this.isInitialViewSet) {\n                                return;\n                            }\n                            this.isInitialViewSet = true;\n                            if (this.isOpen && view === SidebarView.NONE) {\n                                this._dispatchEvent();\n                                return;\n                            }\n                            var isViewPreserved = view === this.visibleView;\n                            this.switchView(view, true);\n                            if (isViewPreserved) {\n                                this._dispatchEvent();\n                            }\n                        }\n                    }, {\n                        key: 'switchView',\n                        value: function switchView(view) {\n                            var forceOpen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n                            if (view === SidebarView.NONE) {\n                                this.close();\n                                return;\n                            }\n                            var isViewChanged = view !== this.active;\n                            var shouldForceRendering = false;\n                            switch (view) {\n                                case SidebarView.THUMBS:\n                                    this.thumbnailButton.classList.add('toggled');\n                                    this.outlineButton.classList.remove('toggled');\n                                    this.attachmentsButton.classList.remove('toggled');\n                                    this.thumbnailView.classList.remove('hidden');\n                                    this.outlineView.classList.add('hidden');\n                                    this.attachmentsView.classList.add('hidden');\n                                    if (this.isOpen && isViewChanged) {\n                                        this._updateThumbnailViewer();\n                                        shouldForceRendering = true;\n                                    }\n                                    break;\n                                case SidebarView.OUTLINE:\n                                    if (this.outlineButton.disabled) {\n                                        return;\n                                    }\n                                    this.thumbnailButton.classList.remove('toggled');\n                                    this.outlineButton.classList.add('toggled');\n                                    this.attachmentsButton.classList.remove('toggled');\n                                    this.thumbnailView.classList.add('hidden');\n                                    this.outlineView.classList.remove('hidden');\n                                    this.attachmentsView.classList.add('hidden');\n                                    break;\n                                case SidebarView.ATTACHMENTS:\n                                    if (this.attachmentsButton.disabled) {\n                                        return;\n                                    }\n                                    this.thumbnailButton.classList.remove('toggled');\n                                    this.outlineButton.classList.remove('toggled');\n                                    this.attachmentsButton.classList.add('toggled');\n                                    this.thumbnailView.classList.add('hidden');\n                                    this.outlineView.classList.add('hidden');\n                                    this.attachmentsView.classList.remove('hidden');\n                                    break;\n                                default:\n                                    console.error('PDFSidebar_switchView: \"' + view + '\" is an unsupported value.');\n                                    return;\n                            }\n                            this.active = view | 0;\n                            if (forceOpen && !this.isOpen) {\n                                this.open();\n                                return;\n                            }\n                            if (shouldForceRendering) {\n                                this._forceRendering();\n                            }\n                            if (isViewChanged) {\n                                this._dispatchEvent();\n                            }\n                            this._hideUINotification(this.active);\n                        }\n                    }, {\n                        key: 'open',\n                        value: function open() {\n                            if (this.isOpen) {\n                                return;\n                            }\n                            this.isOpen = true;\n                            this.toggleButton.classList.add('toggled');\n                            this.outerContainer.classList.add('sidebarMoving');\n                            this.outerContainer.classList.add('sidebarOpen');\n                            if (this.active === SidebarView.THUMBS) {\n                                this._updateThumbnailViewer();\n                            }\n                            this._forceRendering();\n                            this._dispatchEvent();\n                            this._hideUINotification(this.active);\n                        }\n                    }, {\n                        key: 'close',\n                        value: function close() {\n                            if (!this.isOpen) {\n                                return;\n                            }\n                            this.isOpen = false;\n                            this.toggleButton.classList.remove('toggled');\n                            this.outerContainer.classList.add('sidebarMoving');\n                            this.outerContainer.classList.remove('sidebarOpen');\n                            this._forceRendering();\n                            this._dispatchEvent();\n                        }\n                    }, {\n                        key: 'toggle',\n                        value: function toggle() {\n                            if (this.isOpen) {\n                                this.close();\n                            } else {\n                                this.open();\n                            }\n                        }\n                    }, {\n                        key: '_dispatchEvent',\n                        value: function _dispatchEvent() {\n                            this.eventBus.dispatch('sidebarviewchanged', {\n                                source: this,\n                                view: this.visibleView\n                            });\n                        }\n                    }, {\n                        key: '_forceRendering',\n                        value: function _forceRendering() {\n                            if (this.onToggled) {\n                                this.onToggled();\n                            } else {\n                                this.pdfViewer.forceRendering();\n                                this.pdfThumbnailViewer.forceRendering();\n                            }\n                        }\n                    }, {\n                        key: '_updateThumbnailViewer',\n                        value: function _updateThumbnailViewer() {\n                            var pdfViewer = this.pdfViewer,\n                                pdfThumbnailViewer = this.pdfThumbnailViewer;\n\n                            var pagesCount = pdfViewer.pagesCount;\n                            for (var pageIndex = 0; pageIndex < pagesCount; pageIndex++) {\n                                var pageView = pdfViewer.getPageView(pageIndex);\n                                if (pageView && pageView.renderingState === _pdf_rendering_queue.RenderingStates.FINISHED) {\n                                    var thumbnailView = pdfThumbnailViewer.getThumbnail(pageIndex);\n                                    thumbnailView.setImage(pageView);\n                                }\n                            }\n                            pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber);\n                        }\n                    }, {\n                        key: '_showUINotification',\n                        value: function _showUINotification(view) {\n                            var _this = this;\n\n                            if (this.disableNotification) {\n                                return;\n                            }\n                            this.l10n.get('toggle_sidebar_notification.title', null, 'Toggle Sidebar (document contains outline/attachments)').then(function (msg) {\n                                _this.toggleButton.title = msg;\n                            });\n                            if (!this.isOpen) {\n                                this.toggleButton.classList.add(UI_NOTIFICATION_CLASS);\n                            } else if (view === this.active) {\n                                return;\n                            }\n                            switch (view) {\n                                case SidebarView.OUTLINE:\n                                    this.outlineButton.classList.add(UI_NOTIFICATION_CLASS);\n                                    break;\n                                case SidebarView.ATTACHMENTS:\n                                    this.attachmentsButton.classList.add(UI_NOTIFICATION_CLASS);\n                                    break;\n                            }\n                        }\n                    }, {\n                        key: '_hideUINotification',\n                        value: function _hideUINotification(view) {\n                            var _this2 = this;\n\n                            if (this.disableNotification) {\n                                return;\n                            }\n                            var removeNotification = function removeNotification(view) {\n                                switch (view) {\n                                    case SidebarView.OUTLINE:\n                                        _this2.outlineButton.classList.remove(UI_NOTIFICATION_CLASS);\n                                        break;\n                                    case SidebarView.ATTACHMENTS:\n                                        _this2.attachmentsButton.classList.remove(UI_NOTIFICATION_CLASS);\n                                        break;\n                                }\n                            };\n                            if (!this.isOpen && view !== null) {\n                                return;\n                            }\n                            this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS);\n                            if (view !== null) {\n                                removeNotification(view);\n                                return;\n                            }\n                            for (view in SidebarView) {\n                                removeNotification(SidebarView[view]);\n                            }\n                            this.l10n.get('toggle_sidebar.title', null, 'Toggle Sidebar').then(function (msg) {\n                                _this2.toggleButton.title = msg;\n                            });\n                        }\n                    }, {\n                        key: '_addEventListeners',\n                        value: function _addEventListeners() {\n                            var _this3 = this;\n\n                            this.mainContainer.addEventListener('transitionend', function (evt) {\n                                if (evt.target === _this3.mainContainer) {\n                                    _this3.outerContainer.classList.remove('sidebarMoving');\n                                }\n                            });\n                            this.thumbnailButton.addEventListener('click', function () {\n                                _this3.switchView(SidebarView.THUMBS);\n                            });\n                            this.outlineButton.addEventListener('click', function () {\n                                _this3.switchView(SidebarView.OUTLINE);\n                            });\n                            this.outlineButton.addEventListener('dblclick', function () {\n                                _this3.pdfOutlineViewer.toggleOutlineTree();\n                            });\n                            this.attachmentsButton.addEventListener('click', function () {\n                                _this3.switchView(SidebarView.ATTACHMENTS);\n                            });\n                            this.eventBus.on('outlineloaded', function (evt) {\n                                var outlineCount = evt.outlineCount;\n                                _this3.outlineButton.disabled = !outlineCount;\n                                if (outlineCount) {\n                                    _this3._showUINotification(SidebarView.OUTLINE);\n                                } else if (_this3.active === SidebarView.OUTLINE) {\n                                    _this3.switchView(SidebarView.THUMBS);\n                                }\n                            });\n                            this.eventBus.on('attachmentsloaded', function (evt) {\n                                var attachmentsCount = evt.attachmentsCount;\n                                _this3.attachmentsButton.disabled = !attachmentsCount;\n                                if (attachmentsCount) {\n                                    _this3._showUINotification(SidebarView.ATTACHMENTS);\n                                } else if (_this3.active === SidebarView.ATTACHMENTS) {\n                                    _this3.switchView(SidebarView.THUMBS);\n                                }\n                            });\n                            this.eventBus.on('presentationmodechanged', function (evt) {\n                                if (!evt.active && !evt.switchInProgress && _this3.isThumbnailViewVisible) {\n                                    _this3._updateThumbnailViewer();\n                                }\n                            });\n                        }\n                    }, {\n                        key: 'visibleView',\n                        get: function get() {\n                            return this.isOpen ? this.active : SidebarView.NONE;\n                        }\n                    }, {\n                        key: 'isThumbnailViewVisible',\n                        get: function get() {\n                            return this.isOpen && this.active === SidebarView.THUMBS;\n                        }\n                    }, {\n                        key: 'isOutlineViewVisible',\n                        get: function get() {\n                            return this.isOpen && this.active === SidebarView.OUTLINE;\n                        }\n                    }, {\n                        key: 'isAttachmentsViewVisible',\n                        get: function get() {\n                            return this.isOpen && this.active === SidebarView.ATTACHMENTS;\n                        }\n                    }]);\n\n                    return PDFSidebar;\n                }();\n\n                exports.SidebarView = SidebarView;\n                exports.PDFSidebar = PDFSidebar;\n\n                /***/\n            }),\n        /* 25 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFThumbnailView = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdf_rendering_queue = __webpack_require__(3);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var MAX_NUM_SCALING_STEPS = 3;\n                var THUMBNAIL_CANVAS_BORDER_WIDTH = 1;\n                var THUMBNAIL_WIDTH = 98;\n                var TempImageFactory = function TempImageFactoryClosure() {\n                    var tempCanvasCache = null;\n                    return {\n                        getCanvas: function getCanvas(width, height) {\n                            var tempCanvas = tempCanvasCache;\n                            if (!tempCanvas) {\n                                tempCanvas = document.createElement('canvas');\n                                tempCanvasCache = tempCanvas;\n                            }\n                            tempCanvas.width = width;\n                            tempCanvas.height = height;\n                            tempCanvas.mozOpaque = true;\n                            var ctx = tempCanvas.getContext('2d', { alpha: false });\n                            ctx.save();\n                            ctx.fillStyle = 'rgb(255, 255, 255)';\n                            ctx.fillRect(0, 0, width, height);\n                            ctx.restore();\n                            return tempCanvas;\n                        },\n                        destroyCanvas: function destroyCanvas() {\n                            var tempCanvas = tempCanvasCache;\n                            if (tempCanvas) {\n                                tempCanvas.width = 0;\n                                tempCanvas.height = 0;\n                            }\n                            tempCanvasCache = null;\n                        }\n                    };\n                }();\n\n                var PDFThumbnailView = function () {\n                    function PDFThumbnailView(_ref) {\n                        var container = _ref.container,\n                            id = _ref.id,\n                            defaultViewport = _ref.defaultViewport,\n                            linkService = _ref.linkService,\n                            renderingQueue = _ref.renderingQueue,\n                            _ref$disableCanvasToI = _ref.disableCanvasToImageConversion,\n                            disableCanvasToImageConversion = _ref$disableCanvasToI === undefined ? false : _ref$disableCanvasToI,\n                            _ref$l10n = _ref.l10n,\n                            l10n = _ref$l10n === undefined ? _ui_utils.NullL10n : _ref$l10n;\n\n                        _classCallCheck(this, PDFThumbnailView);\n\n                        this.id = id;\n                        this.renderingId = 'thumbnail' + id;\n                        this.pageLabel = null;\n                        this.pdfPage = null;\n                        this.rotation = 0;\n                        this.viewport = defaultViewport;\n                        this.pdfPageRotate = defaultViewport.rotation;\n                        this.linkService = linkService;\n                        this.renderingQueue = renderingQueue;\n                        this.renderTask = null;\n                        this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\n                        this.resume = null;\n                        this.disableCanvasToImageConversion = disableCanvasToImageConversion;\n                        this.pageWidth = this.viewport.width;\n                        this.pageHeight = this.viewport.height;\n                        this.pageRatio = this.pageWidth / this.pageHeight;\n                        this.canvasWidth = THUMBNAIL_WIDTH;\n                        this.canvasHeight = this.canvasWidth / this.pageRatio | 0;\n                        this.scale = this.canvasWidth / this.pageWidth;\n                        this.l10n = l10n;\n                        var anchor = document.createElement('a');\n                        anchor.href = linkService.getAnchorUrl('#page=' + id);\n                        this.l10n.get('thumb_page_title', { page: id }, 'Page {{page}}').then(function (msg) {\n                            anchor.title = msg;\n                        });\n                        anchor.onclick = function () {\n                            linkService.page = id;\n                            return false;\n                        };\n                        this.anchor = anchor;\n                        var div = document.createElement('div');\n                        div.className = 'thumbnail';\n                        div.setAttribute('data-page-number', this.id);\n                        this.div = div;\n                        if (id === 1) {\n                            div.classList.add('selected');\n                        }\n                        var ring = document.createElement('div');\n                        ring.className = 'thumbnailSelectionRing';\n                        var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;\n                        ring.style.width = this.canvasWidth + borderAdjustment + 'px';\n                        ring.style.height = this.canvasHeight + borderAdjustment + 'px';\n                        this.ring = ring;\n                        div.appendChild(ring);\n                        anchor.appendChild(div);\n                        container.appendChild(anchor);\n                    }\n\n                    _createClass(PDFThumbnailView, [{\n                        key: 'setPdfPage',\n                        value: function setPdfPage(pdfPage) {\n                            this.pdfPage = pdfPage;\n                            this.pdfPageRotate = pdfPage.rotate;\n                            var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n                            this.viewport = pdfPage.getViewport(1, totalRotation);\n                            this.reset();\n                        }\n                    }, {\n                        key: 'reset',\n                        value: function reset() {\n                            this.cancelRendering();\n                            this.pageWidth = this.viewport.width;\n                            this.pageHeight = this.viewport.height;\n                            this.pageRatio = this.pageWidth / this.pageHeight;\n                            this.canvasHeight = this.canvasWidth / this.pageRatio | 0;\n                            this.scale = this.canvasWidth / this.pageWidth;\n                            this.div.removeAttribute('data-loaded');\n                            var ring = this.ring;\n                            var childNodes = ring.childNodes;\n                            for (var i = childNodes.length - 1; i >= 0; i--) {\n                                ring.removeChild(childNodes[i]);\n                            }\n                            var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;\n                            ring.style.width = this.canvasWidth + borderAdjustment + 'px';\n                            ring.style.height = this.canvasHeight + borderAdjustment + 'px';\n                            if (this.canvas) {\n                                this.canvas.width = 0;\n                                this.canvas.height = 0;\n                                delete this.canvas;\n                            }\n                            if (this.image) {\n                                this.image.removeAttribute('src');\n                                delete this.image;\n                            }\n                        }\n                    }, {\n                        key: 'update',\n                        value: function update(rotation) {\n                            if (typeof rotation !== 'undefined') {\n                                this.rotation = rotation;\n                            }\n                            var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n                            this.viewport = this.viewport.clone({\n                                scale: 1,\n                                rotation: totalRotation\n                            });\n                            this.reset();\n                        }\n                    }, {\n                        key: 'cancelRendering',\n                        value: function cancelRendering() {\n                            if (this.renderTask) {\n                                this.renderTask.cancel();\n                                this.renderTask = null;\n                            }\n                            this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\n                            this.resume = null;\n                        }\n                    }, {\n                        key: '_getPageDrawContext',\n                        value: function _getPageDrawContext() {\n                            var noCtxScale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n                            var canvas = document.createElement('canvas');\n                            this.canvas = canvas;\n                            canvas.mozOpaque = true;\n                            var ctx = canvas.getContext('2d', { alpha: false });\n                            var outputScale = (0, _ui_utils.getOutputScale)(ctx);\n                            canvas.width = this.canvasWidth * outputScale.sx | 0;\n                            canvas.height = this.canvasHeight * outputScale.sy | 0;\n                            canvas.style.width = this.canvasWidth + 'px';\n                            canvas.style.height = this.canvasHeight + 'px';\n                            if (!noCtxScale && outputScale.scaled) {\n                                ctx.scale(outputScale.sx, outputScale.sy);\n                            }\n                            return ctx;\n                        }\n                    }, {\n                        key: '_convertCanvasToImage',\n                        value: function _convertCanvasToImage() {\n                            var _this = this;\n\n                            if (!this.canvas) {\n                                return;\n                            }\n                            if (this.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {\n                                return;\n                            }\n                            var id = this.renderingId;\n                            var className = 'thumbnailImage';\n                            if (this.disableCanvasToImageConversion) {\n                                this.canvas.id = id;\n                                this.canvas.className = className;\n                                this.l10n.get('thumb_page_canvas', { page: this.pageId }, 'Thumbnail of Page {{page}}').then(function (msg) {\n                                    _this.canvas.setAttribute('aria-label', msg);\n                                });\n                                this.div.setAttribute('data-loaded', true);\n                                this.ring.appendChild(this.canvas);\n                                return;\n                            }\n                            var image = document.createElement('img');\n                            image.id = id;\n                            image.className = className;\n                            this.l10n.get('thumb_page_canvas', { page: this.pageId }, 'Thumbnail of Page {{page}}').then(function (msg) {\n                                image.setAttribute('aria-label', msg);\n                            });\n                            image.style.width = this.canvasWidth + 'px';\n                            image.style.height = this.canvasHeight + 'px';\n                            image.src = this.canvas.toDataURL();\n                            this.image = image;\n                            this.div.setAttribute('data-loaded', true);\n                            this.ring.appendChild(image);\n                            this.canvas.width = 0;\n                            this.canvas.height = 0;\n                            delete this.canvas;\n                        }\n                    }, {\n                        key: 'draw',\n                        value: function draw() {\n                            var _this2 = this;\n\n                            if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {\n                                console.error('Must be in new state before drawing');\n                                return Promise.resolve(undefined);\n                            }\n                            this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\n                            var renderCapability = (0, _pdfjsLib.createPromiseCapability)();\n                            var finishRenderTask = function finishRenderTask(error) {\n                                if (renderTask === _this2.renderTask) {\n                                    _this2.renderTask = null;\n                                }\n                                if (error === 'cancelled' || error instanceof _pdfjsLib.RenderingCancelledException) {\n                                    renderCapability.resolve(undefined);\n                                    return;\n                                }\n                                _this2.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n                                _this2._convertCanvasToImage();\n                                if (!error) {\n                                    renderCapability.resolve(undefined);\n                                } else {\n                                    renderCapability.reject(error);\n                                }\n                            };\n                            var ctx = this._getPageDrawContext();\n                            var drawViewport = this.viewport.clone({ scale: this.scale });\n                            var renderContinueCallback = function renderContinueCallback(cont) {\n                                if (!_this2.renderingQueue.isHighestPriority(_this2)) {\n                                    _this2.renderingState = _pdf_rendering_queue.RenderingStates.PAUSED;\n                                    _this2.resume = function () {\n                                        _this2.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\n                                        cont();\n                                    };\n                                    return;\n                                }\n                                cont();\n                            };\n                            var renderContext = {\n                                canvasContext: ctx,\n                                viewport: drawViewport\n                            };\n                            var renderTask = this.renderTask = this.pdfPage.render(renderContext);\n                            renderTask.onContinue = renderContinueCallback;\n                            renderTask.promise.then(function () {\n                                finishRenderTask(null);\n                            }, function (error) {\n                                finishRenderTask(error);\n                            });\n                            return renderCapability.promise;\n                        }\n                    }, {\n                        key: 'setImage',\n                        value: function setImage(pageView) {\n                            if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {\n                                return;\n                            }\n                            var img = pageView.canvas;\n                            if (!img) {\n                                return;\n                            }\n                            if (!this.pdfPage) {\n                                this.setPdfPage(pageView.pdfPage);\n                            }\n                            this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n                            var ctx = this._getPageDrawContext(true);\n                            var canvas = ctx.canvas;\n                            if (img.width <= 2 * canvas.width) {\n                                ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height);\n                                this._convertCanvasToImage();\n                                return;\n                            }\n                            var reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS;\n                            var reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS;\n                            var reducedImage = TempImageFactory.getCanvas(reducedWidth, reducedHeight);\n                            var reducedImageCtx = reducedImage.getContext('2d');\n                            while (reducedWidth > img.width || reducedHeight > img.height) {\n                                reducedWidth >>= 1;\n                                reducedHeight >>= 1;\n                            }\n                            reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, 0, 0, reducedWidth, reducedHeight);\n                            while (reducedWidth > 2 * canvas.width) {\n                                reducedImageCtx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, reducedWidth >> 1, reducedHeight >> 1);\n                                reducedWidth >>= 1;\n                                reducedHeight >>= 1;\n                            }\n                            ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, canvas.width, canvas.height);\n                            this._convertCanvasToImage();\n                        }\n                    }, {\n                        key: 'setPageLabel',\n                        value: function setPageLabel(label) {\n                            var _this3 = this;\n\n                            this.pageLabel = typeof label === 'string' ? label : null;\n                            this.l10n.get('thumb_page_title', { page: this.pageId }, 'Page {{page}}').then(function (msg) {\n                                _this3.anchor.title = msg;\n                            });\n                            if (this.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {\n                                return;\n                            }\n                            this.l10n.get('thumb_page_canvas', { page: this.pageId }, 'Thumbnail of Page {{page}}').then(function (ariaLabel) {\n                                if (_this3.image) {\n                                    _this3.image.setAttribute('aria-label', ariaLabel);\n                                } else if (_this3.disableCanvasToImageConversion && _this3.canvas) {\n                                    _this3.canvas.setAttribute('aria-label', ariaLabel);\n                                }\n                            });\n                        }\n                    }, {\n                        key: 'pageId',\n                        get: function get() {\n                            return this.pageLabel !== null ? this.pageLabel : this.id;\n                        }\n                    }], [{\n                        key: 'cleanup',\n                        value: function cleanup() {\n                            TempImageFactory.destroyCanvas();\n                        }\n                    }]);\n\n                    return PDFThumbnailView;\n                }();\n\n                exports.PDFThumbnailView = PDFThumbnailView;\n\n                /***/\n            }),\n        /* 26 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFThumbnailViewer = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdf_thumbnail_view = __webpack_require__(25);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var THUMBNAIL_SCROLL_MARGIN = -19;\n\n                var PDFThumbnailViewer = function () {\n                    function PDFThumbnailViewer(_ref) {\n                        var container = _ref.container,\n                            linkService = _ref.linkService,\n                            renderingQueue = _ref.renderingQueue,\n                            _ref$l10n = _ref.l10n,\n                            l10n = _ref$l10n === undefined ? _ui_utils.NullL10n : _ref$l10n;\n\n                        _classCallCheck(this, PDFThumbnailViewer);\n\n                        this.container = container;\n                        this.linkService = linkService;\n                        this.renderingQueue = renderingQueue;\n                        this.l10n = l10n;\n                        this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdated.bind(this));\n                        this._resetView();\n                    }\n\n                    _createClass(PDFThumbnailViewer, [{\n                        key: '_scrollUpdated',\n                        value: function _scrollUpdated() {\n                            this.renderingQueue.renderHighestPriority();\n                        }\n                    }, {\n                        key: 'getThumbnail',\n                        value: function getThumbnail(index) {\n                            return this._thumbnails[index];\n                        }\n                    }, {\n                        key: '_getVisibleThumbs',\n                        value: function _getVisibleThumbs() {\n                            return (0, _ui_utils.getVisibleElements)(this.container, this._thumbnails);\n                        }\n                    }, {\n                        key: 'scrollThumbnailIntoView',\n                        value: function scrollThumbnailIntoView(page) {\n                            var selected = document.querySelector('.thumbnail.selected');\n                            if (selected) {\n                                selected.classList.remove('selected');\n                            }\n                            var thumbnail = document.querySelector('div.thumbnail[data-page-number=\"' + page + '\"]');\n                            if (thumbnail) {\n                                thumbnail.classList.add('selected');\n                            }\n                            var visibleThumbs = this._getVisibleThumbs();\n                            var numVisibleThumbs = visibleThumbs.views.length;\n                            if (numVisibleThumbs > 0) {\n                                var first = visibleThumbs.first.id;\n                                var last = numVisibleThumbs > 1 ? visibleThumbs.last.id : first;\n                                if (page <= first || page >= last) {\n                                    (0, _ui_utils.scrollIntoView)(thumbnail, { top: THUMBNAIL_SCROLL_MARGIN });\n                                }\n                            }\n                        }\n                    }, {\n                        key: 'cleanup',\n                        value: function cleanup() {\n                            _pdf_thumbnail_view.PDFThumbnailView.cleanup();\n                        }\n                    }, {\n                        key: '_resetView',\n                        value: function _resetView() {\n                            this._thumbnails = [];\n                            this._pageLabels = null;\n                            this._pagesRotation = 0;\n                            this._pagesRequests = [];\n                            this.container.textContent = '';\n                        }\n                    }, {\n                        key: 'setDocument',\n                        value: function setDocument(pdfDocument) {\n                            var _this = this;\n\n                            if (this.pdfDocument) {\n                                this._cancelRendering();\n                                this._resetView();\n                            }\n                            this.pdfDocument = pdfDocument;\n                            if (!pdfDocument) {\n                                return;\n                            }\n                            pdfDocument.getPage(1).then(function (firstPage) {\n                                var pagesCount = pdfDocument.numPages;\n                                var viewport = firstPage.getViewport(1.0);\n                                for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n                                    var thumbnail = new _pdf_thumbnail_view.PDFThumbnailView({\n                                        container: _this.container,\n                                        id: pageNum,\n                                        defaultViewport: viewport.clone(),\n                                        linkService: _this.linkService,\n                                        renderingQueue: _this.renderingQueue,\n                                        disableCanvasToImageConversion: false,\n                                        l10n: _this.l10n\n                                    });\n                                    _this._thumbnails.push(thumbnail);\n                                }\n                            }).catch(function (reason) {\n                                console.error('Unable to initialize thumbnail viewer', reason);\n                            });\n                        }\n                    }, {\n                        key: '_cancelRendering',\n                        value: function _cancelRendering() {\n                            for (var i = 0, ii = this._thumbnails.length; i < ii; i++) {\n                                if (this._thumbnails[i]) {\n                                    this._thumbnails[i].cancelRendering();\n                                }\n                            }\n                        }\n                    }, {\n                        key: 'setPageLabels',\n                        value: function setPageLabels(labels) {\n                            if (!this.pdfDocument) {\n                                return;\n                            }\n                            if (!labels) {\n                                this._pageLabels = null;\n                            } else if (!(labels instanceof Array && this.pdfDocument.numPages === labels.length)) {\n                                this._pageLabels = null;\n                                console.error('PDFThumbnailViewer_setPageLabels: Invalid page labels.');\n                            } else {\n                                this._pageLabels = labels;\n                            }\n                            for (var i = 0, ii = this._thumbnails.length; i < ii; i++) {\n                                var label = this._pageLabels && this._pageLabels[i];\n                                this._thumbnails[i].setPageLabel(label);\n                            }\n                        }\n                    }, {\n                        key: '_ensurePdfPageLoaded',\n                        value: function _ensurePdfPageLoaded(thumbView) {\n                            var _this2 = this;\n\n                            if (thumbView.pdfPage) {\n                                return Promise.resolve(thumbView.pdfPage);\n                            }\n                            var pageNumber = thumbView.id;\n                            if (this._pagesRequests[pageNumber]) {\n                                return this._pagesRequests[pageNumber];\n                            }\n                            var promise = this.pdfDocument.getPage(pageNumber).then(function (pdfPage) {\n                                thumbView.setPdfPage(pdfPage);\n                                _this2._pagesRequests[pageNumber] = null;\n                                return pdfPage;\n                            }).catch(function (reason) {\n                                console.error('Unable to get page for thumb view', reason);\n                                _this2._pagesRequests[pageNumber] = null;\n                            });\n                            this._pagesRequests[pageNumber] = promise;\n                            return promise;\n                        }\n                    }, {\n                        key: 'forceRendering',\n                        value: function forceRendering() {\n                            var _this3 = this;\n\n                            var visibleThumbs = this._getVisibleThumbs();\n                            var thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this._thumbnails, this.scroll.down);\n                            if (thumbView) {\n                                this._ensurePdfPageLoaded(thumbView).then(function () {\n                                    _this3.renderingQueue.renderView(thumbView);\n                                });\n                                return true;\n                            }\n                            return false;\n                        }\n                    }, {\n                        key: 'pagesRotation',\n                        get: function get() {\n                            return this._pagesRotation;\n                        },\n                        set: function set(rotation) {\n                            if (!(typeof rotation === 'number' && rotation % 90 === 0)) {\n                                throw new Error('Invalid thumbnails rotation angle.');\n                            }\n                            if (!this.pdfDocument) {\n                                return;\n                            }\n                            this._pagesRotation = rotation;\n                            for (var i = 0, ii = this._thumbnails.length; i < ii; i++) {\n                                this._thumbnails[i].update(rotation);\n                            }\n                        }\n                    }]);\n\n                    return PDFThumbnailViewer;\n                }();\n\n                exports.PDFThumbnailViewer = PDFThumbnailViewer;\n\n                /***/\n            }),\n        /* 27 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.PDFViewer = exports.PresentationModeState = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                var _ui_utils = __webpack_require__(0);\n\n                var _pdf_rendering_queue = __webpack_require__(3);\n\n                var _annotation_layer_builder = __webpack_require__(11);\n\n                var _dom_events = __webpack_require__(2);\n\n                var _pdf_page_view = __webpack_require__(22);\n\n                var _pdf_link_service = __webpack_require__(5);\n\n                var _text_layer_builder = __webpack_require__(30);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var PresentationModeState = {\n                    UNKNOWN: 0,\n                    NORMAL: 1,\n                    CHANGING: 2,\n                    FULLSCREEN: 3\n                };\n                var DEFAULT_CACHE_SIZE = 10;\n                function PDFPageViewBuffer(size) {\n                    var data = [];\n                    this.push = function cachePush(view) {\n                        var i = data.indexOf(view);\n                        if (i >= 0) {\n                            data.splice(i, 1);\n                        }\n                        data.push(view);\n                        if (data.length > size) {\n                            data.shift().destroy();\n                        }\n                    };\n                    this.resize = function (newSize) {\n                        size = newSize;\n                        while (data.length > size) {\n                            data.shift().destroy();\n                        }\n                    };\n                }\n                function isSameScale(oldScale, newScale) {\n                    if (newScale === oldScale) {\n                        return true;\n                    }\n                    if (Math.abs(newScale - oldScale) < 1e-15) {\n                        return true;\n                    }\n                    return false;\n                }\n                function isPortraitOrientation(size) {\n                    return size.width <= size.height;\n                }\n\n                var PDFViewer = function () {\n                    function PDFViewer(options) {\n                        _classCallCheck(this, PDFViewer);\n\n                        this.container = options.container;\n                        this.viewer = options.viewer || options.container.firstElementChild;\n                        this.eventBus = options.eventBus || (0, _dom_events.getGlobalEventBus)();\n                        this.linkService = options.linkService || new _pdf_link_service.SimpleLinkService();\n                        this.downloadManager = options.downloadManager || null;\n                        this.removePageBorders = options.removePageBorders || false;\n                        this.enhanceTextSelection = options.enhanceTextSelection || false;\n                        this.renderInteractiveForms = options.renderInteractiveForms || false;\n                        this.enablePrintAutoRotate = options.enablePrintAutoRotate || false;\n                        this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;\n                        this.l10n = options.l10n || _ui_utils.NullL10n;\n                        this.defaultRenderingQueue = !options.renderingQueue;\n                        if (this.defaultRenderingQueue) {\n                            this.renderingQueue = new _pdf_rendering_queue.PDFRenderingQueue();\n                            this.renderingQueue.setViewer(this);\n                        } else {\n                            this.renderingQueue = options.renderingQueue;\n                        }\n                        this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdate.bind(this));\n                        this.presentationModeState = PresentationModeState.UNKNOWN;\n                        this._resetView();\n                        if (this.removePageBorders) {\n                            this.viewer.classList.add('removePageBorders');\n                        }\n                    }\n\n                    _createClass(PDFViewer, [{\n                        key: 'getPageView',\n                        value: function getPageView(index) {\n                            return this._pages[index];\n                        }\n                    }, {\n                        key: '_setCurrentPageNumber',\n                        value: function _setCurrentPageNumber(val) {\n                            var resetCurrentPageView = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n                            if (this._currentPageNumber === val) {\n                                if (resetCurrentPageView) {\n                                    this._resetCurrentPageView();\n                                }\n                                return;\n                            }\n                            if (!(0 < val && val <= this.pagesCount)) {\n                                console.error('PDFViewer._setCurrentPageNumber: \"' + val + '\" is out of bounds.');\n                                return;\n                            }\n                            var arg = {\n                                source: this,\n                                pageNumber: val,\n                                pageLabel: this._pageLabels && this._pageLabels[val - 1]\n                            };\n                            this._currentPageNumber = val;\n                            this.eventBus.dispatch('pagechanging', arg);\n                            this.eventBus.dispatch('pagechange', arg);\n                            if (resetCurrentPageView) {\n                                this._resetCurrentPageView();\n                            }\n                        }\n                    }, {\n                        key: 'setDocument',\n                        value: function setDocument(pdfDocument) {\n                            var _this = this;\n\n                            if (this.pdfDocument) {\n                                this._cancelRendering();\n                                this._resetView();\n                            }\n                            this.pdfDocument = pdfDocument;\n                            if (!pdfDocument) {\n                                return;\n                            }\n                            var pagesCount = pdfDocument.numPages;\n                            var pagesCapability = (0, _pdfjsLib.createPromiseCapability)();\n                            this.pagesPromise = pagesCapability.promise;\n                            pagesCapability.promise.then(function () {\n                                _this._pageViewsReady = true;\n                                _this.eventBus.dispatch('pagesloaded', {\n                                    source: _this,\n                                    pagesCount: pagesCount\n                                });\n                            });\n                            var isOnePageRenderedResolved = false;\n                            var onePageRenderedCapability = (0, _pdfjsLib.createPromiseCapability)();\n                            this.onePageRendered = onePageRenderedCapability.promise;\n                            var bindOnAfterAndBeforeDraw = function bindOnAfterAndBeforeDraw(pageView) {\n                                pageView.onBeforeDraw = function () {\n                                    _this._buffer.push(pageView);\n                                };\n                                pageView.onAfterDraw = function () {\n                                    if (!isOnePageRenderedResolved) {\n                                        isOnePageRenderedResolved = true;\n                                        onePageRenderedCapability.resolve();\n                                    }\n                                };\n                            };\n                            var firstPagePromise = pdfDocument.getPage(1);\n                            this.firstPagePromise = firstPagePromise;\n                            firstPagePromise.then(function (pdfPage) {\n                                var scale = _this.currentScale;\n                                var viewport = pdfPage.getViewport(scale * _ui_utils.CSS_UNITS);\n                                for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n                                    var textLayerFactory = null;\n                                    if (!_pdfjsLib.PDFJS.disableTextLayer) {\n                                        textLayerFactory = _this;\n                                    }\n                                    var pageView = new _pdf_page_view.PDFPageView({\n                                        container: _this.viewer,\n                                        eventBus: _this.eventBus,\n                                        id: pageNum,\n                                        scale: scale,\n                                        defaultViewport: viewport.clone(),\n                                        renderingQueue: _this.renderingQueue,\n                                        textLayerFactory: textLayerFactory,\n                                        annotationLayerFactory: _this,\n                                        enhanceTextSelection: _this.enhanceTextSelection,\n                                        renderInteractiveForms: _this.renderInteractiveForms,\n                                        renderer: _this.renderer,\n                                        l10n: _this.l10n\n                                    });\n                                    bindOnAfterAndBeforeDraw(pageView);\n                                    _this._pages.push(pageView);\n                                }\n                                onePageRenderedCapability.promise.then(function () {\n                                    if (_pdfjsLib.PDFJS.disableAutoFetch) {\n                                        pagesCapability.resolve();\n                                        return;\n                                    }\n                                    var getPagesLeft = pagesCount;\n\n                                    var _loop = function _loop(_pageNum) {\n                                        pdfDocument.getPage(_pageNum).then(function (pdfPage) {\n                                            var pageView = _this._pages[_pageNum - 1];\n                                            if (!pageView.pdfPage) {\n                                                pageView.setPdfPage(pdfPage);\n                                            }\n                                            _this.linkService.cachePageRef(_pageNum, pdfPage.ref);\n                                            if (--getPagesLeft === 0) {\n                                                pagesCapability.resolve();\n                                            }\n                                        }, function (reason) {\n                                            console.error('Unable to get page ' + _pageNum + ' to initialize viewer', reason);\n                                            if (--getPagesLeft === 0) {\n                                                pagesCapability.resolve();\n                                            }\n                                        });\n                                    };\n\n                                    for (var _pageNum = 1; _pageNum <= pagesCount; ++_pageNum) {\n                                        _loop(_pageNum);\n                                    }\n                                });\n                                _this.eventBus.dispatch('pagesinit', { source: _this });\n                                if (_this.defaultRenderingQueue) {\n                                    _this.update();\n                                }\n                                if (_this.findController) {\n                                    _this.findController.resolveFirstPage();\n                                }\n                            }).catch(function (reason) {\n                                console.error('Unable to initialize viewer', reason);\n                            });\n                        }\n                    }, {\n                        key: 'setPageLabels',\n                        value: function setPageLabels(labels) {\n                            if (!this.pdfDocument) {\n                                return;\n                            }\n                            if (!labels) {\n                                this._pageLabels = null;\n                            } else if (!(labels instanceof Array && this.pdfDocument.numPages === labels.length)) {\n                                this._pageLabels = null;\n                                console.error('PDFViewer.setPageLabels: Invalid page labels.');\n                            } else {\n                                this._pageLabels = labels;\n                            }\n                            for (var i = 0, ii = this._pages.length; i < ii; i++) {\n                                var pageView = this._pages[i];\n                                var label = this._pageLabels && this._pageLabels[i];\n                                pageView.setPageLabel(label);\n                            }\n                        }\n                    }, {\n                        key: '_resetView',\n                        value: function _resetView() {\n                            this._pages = [];\n                            this._currentPageNumber = 1;\n                            this._currentScale = _ui_utils.UNKNOWN_SCALE;\n                            this._currentScaleValue = null;\n                            this._pageLabels = null;\n                            this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE);\n                            this._location = null;\n                            this._pagesRotation = 0;\n                            this._pagesRequests = [];\n                            this._pageViewsReady = false;\n                            this.viewer.textContent = '';\n                        }\n                    }, {\n                        key: '_scrollUpdate',\n                        value: function _scrollUpdate() {\n                            if (this.pagesCount === 0) {\n                                return;\n                            }\n                            this.update();\n                        }\n                    }, {\n                        key: '_setScaleDispatchEvent',\n                        value: function _setScaleDispatchEvent(newScale, newValue) {\n                            var preset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n                            var arg = {\n                                source: this,\n                                scale: newScale,\n                                presetValue: preset ? newValue : undefined\n                            };\n                            this.eventBus.dispatch('scalechanging', arg);\n                            this.eventBus.dispatch('scalechange', arg);\n                        }\n                    }, {\n                        key: '_setScaleUpdatePages',\n                        value: function _setScaleUpdatePages(newScale, newValue) {\n                            var noScroll = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n                            var preset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n                            this._currentScaleValue = newValue.toString();\n                            if (isSameScale(this._currentScale, newScale)) {\n                                if (preset) {\n                                    this._setScaleDispatchEvent(newScale, newValue, true);\n                                }\n                                return;\n                            }\n                            for (var i = 0, ii = this._pages.length; i < ii; i++) {\n                                this._pages[i].update(newScale);\n                            }\n                            this._currentScale = newScale;\n                            if (!noScroll) {\n                                var page = this._currentPageNumber,\n                                    dest = void 0;\n                                if (this._location && !_pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom && !(this.isInPresentationMode || this.isChangingPresentationMode)) {\n                                    page = this._location.pageNumber;\n                                    dest = [null, { name: 'XYZ' }, this._location.left, this._location.top, null];\n                                }\n                                this.scrollPageIntoView({\n                                    pageNumber: page,\n                                    destArray: dest,\n                                    allowNegativeOffset: true\n                                });\n                            }\n                            this._setScaleDispatchEvent(newScale, newValue, preset);\n                            if (this.defaultRenderingQueue) {\n                                this.update();\n                            }\n                        }\n                    }, {\n                        key: '_setScale',\n                        value: function _setScale(value) {\n                            var noScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n                            var scale = parseFloat(value);\n                            if (scale > 0) {\n                                this._setScaleUpdatePages(scale, value, noScroll, false);\n                            } else {\n                                var currentPage = this._pages[this._currentPageNumber - 1];\n                                if (!currentPage) {\n                                    return;\n                                }\n                                var hPadding = this.isInPresentationMode || this.removePageBorders ? 0 : _ui_utils.SCROLLBAR_PADDING;\n                                var vPadding = this.isInPresentationMode || this.removePageBorders ? 0 : _ui_utils.VERTICAL_PADDING;\n                                var pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale;\n                                var pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale;\n                                switch (value) {\n                                    case 'page-actual':\n                                        scale = 1;\n                                        break;\n                                    case 'page-width':\n                                        scale = pageWidthScale;\n                                        break;\n                                    case 'page-height':\n                                        scale = pageHeightScale;\n                                        break;\n                                    case 'page-fit':\n                                        scale = Math.min(pageWidthScale, pageHeightScale);\n                                        break;\n                                    case 'auto':\n                                        var isLandscape = currentPage.width > currentPage.height;\n                                        var horizontalScale = isLandscape ? Math.min(pageHeightScale, pageWidthScale) : pageWidthScale;\n                                        scale = Math.min(_ui_utils.MAX_AUTO_SCALE, horizontalScale);\n                                        break;\n                                    default:\n                                        console.error('PDFViewer._setScale: \"' + value + '\" is an unknown zoom value.');\n                                        return;\n                                }\n                                this._setScaleUpdatePages(scale, value, noScroll, true);\n                            }\n                        }\n                    }, {\n                        key: '_resetCurrentPageView',\n                        value: function _resetCurrentPageView() {\n                            if (this.isInPresentationMode) {\n                                this._setScale(this._currentScaleValue, true);\n                            }\n                            var pageView = this._pages[this._currentPageNumber - 1];\n                            (0, _ui_utils.scrollIntoView)(pageView.div);\n                        }\n                    }, {\n                        key: 'scrollPageIntoView',\n                        value: function scrollPageIntoView(params) {\n                            if (!this.pdfDocument) {\n                                return;\n                            }\n                            if (arguments.length > 1 || typeof params === 'number') {\n                                console.warn('Call of scrollPageIntoView() with obsolete signature.');\n                                var paramObj = {};\n                                if (typeof params === 'number') {\n                                    paramObj.pageNumber = params;\n                                }\n                                if (arguments[1] instanceof Array) {\n                                    paramObj.destArray = arguments[1];\n                                }\n                                params = paramObj;\n                            }\n                            var pageNumber = params.pageNumber || 0;\n                            var dest = params.destArray || null;\n                            var allowNegativeOffset = params.allowNegativeOffset || false;\n                            if (this.isInPresentationMode || !dest) {\n                                this._setCurrentPageNumber(pageNumber, true);\n                                return;\n                            }\n                            var pageView = this._pages[pageNumber - 1];\n                            if (!pageView) {\n                                console.error('PDFViewer.scrollPageIntoView: Invalid \"pageNumber\" parameter.');\n                                return;\n                            }\n                            var x = 0,\n                                y = 0;\n                            var width = 0,\n                                height = 0,\n                                widthScale = void 0,\n                                heightScale = void 0;\n                            var changeOrientation = pageView.rotation % 180 === 0 ? false : true;\n                            var pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / _ui_utils.CSS_UNITS;\n                            var pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / _ui_utils.CSS_UNITS;\n                            var scale = 0;\n                            switch (dest[1].name) {\n                                case 'XYZ':\n                                    x = dest[2];\n                                    y = dest[3];\n                                    scale = dest[4];\n                                    x = x !== null ? x : 0;\n                                    y = y !== null ? y : pageHeight;\n                                    break;\n                                case 'Fit':\n                                case 'FitB':\n                                    scale = 'page-fit';\n                                    break;\n                                case 'FitH':\n                                case 'FitBH':\n                                    y = dest[2];\n                                    scale = 'page-width';\n                                    if (y === null && this._location) {\n                                        x = this._location.left;\n                                        y = this._location.top;\n                                    }\n                                    break;\n                                case 'FitV':\n                                case 'FitBV':\n                                    x = dest[2];\n                                    width = pageWidth;\n                                    height = pageHeight;\n                                    scale = 'page-height';\n                                    break;\n                                case 'FitR':\n                                    x = dest[2];\n                                    y = dest[3];\n                                    width = dest[4] - x;\n                                    height = dest[5] - y;\n                                    var hPadding = this.removePageBorders ? 0 : _ui_utils.SCROLLBAR_PADDING;\n                                    var vPadding = this.removePageBorders ? 0 : _ui_utils.VERTICAL_PADDING;\n                                    widthScale = (this.container.clientWidth - hPadding) / width / _ui_utils.CSS_UNITS;\n                                    heightScale = (this.container.clientHeight - vPadding) / height / _ui_utils.CSS_UNITS;\n                                    scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));\n                                    break;\n                                default:\n                                    console.error('PDFViewer.scrollPageIntoView: \"' + dest[1].name + '\" ' + 'is not a valid destination type.');\n                                    return;\n                            }\n                            if (scale && scale !== this._currentScale) {\n                                this.currentScaleValue = scale;\n                            } else if (this._currentScale === _ui_utils.UNKNOWN_SCALE) {\n                                this.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;\n                            }\n                            if (scale === 'page-fit' && !dest[4]) {\n                                (0, _ui_utils.scrollIntoView)(pageView.div);\n                                return;\n                            }\n                            var boundingRect = [pageView.viewport.convertToViewportPoint(x, y), pageView.viewport.convertToViewportPoint(x + width, y + height)];\n                            var left = Math.min(boundingRect[0][0], boundingRect[1][0]);\n                            var top = Math.min(boundingRect[0][1], boundingRect[1][1]);\n                            if (!allowNegativeOffset) {\n                                left = Math.max(left, 0);\n                                top = Math.max(top, 0);\n                            }\n                            (0, _ui_utils.scrollIntoView)(pageView.div, {\n                                left: left,\n                                top: top\n                            });\n                        }\n                    }, {\n                        key: '_updateLocation',\n                        value: function _updateLocation(firstPage) {\n                            var currentScale = this._currentScale;\n                            var currentScaleValue = this._currentScaleValue;\n                            var normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ? Math.round(currentScale * 10000) / 100 : currentScaleValue;\n                            var pageNumber = firstPage.id;\n                            var pdfOpenParams = '#page=' + pageNumber;\n                            pdfOpenParams += '&zoom=' + normalizedScaleValue;\n                            var currentPageView = this._pages[pageNumber - 1];\n                            var container = this.container;\n                            var topLeft = currentPageView.getPagePoint(container.scrollLeft - firstPage.x, container.scrollTop - firstPage.y);\n                            var intLeft = Math.round(topLeft[0]);\n                            var intTop = Math.round(topLeft[1]);\n                            pdfOpenParams += ',' + intLeft + ',' + intTop;\n                            this._location = {\n                                pageNumber: pageNumber,\n                                scale: normalizedScaleValue,\n                                top: intTop,\n                                left: intLeft,\n                                pdfOpenParams: pdfOpenParams\n                            };\n                        }\n                    }, {\n                        key: 'update',\n                        value: function update() {\n                            var visible = this._getVisiblePages();\n                            var visiblePages = visible.views;\n                            if (visiblePages.length === 0) {\n                                return;\n                            }\n                            var suggestedCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * visiblePages.length + 1);\n                            this._buffer.resize(suggestedCacheSize);\n                            this.renderingQueue.renderHighestPriority(visible);\n                            var currentId = this._currentPageNumber;\n                            var firstPage = visible.first;\n                            var stillFullyVisible = false;\n                            for (var i = 0, ii = visiblePages.length; i < ii; ++i) {\n                                var page = visiblePages[i];\n                                if (page.percent < 100) {\n                                    break;\n                                }\n                                if (page.id === currentId) {\n                                    stillFullyVisible = true;\n                                    break;\n                                }\n                            }\n                            if (!stillFullyVisible) {\n                                currentId = visiblePages[0].id;\n                            }\n                            if (!this.isInPresentationMode) {\n                                this._setCurrentPageNumber(currentId);\n                            }\n                            this._updateLocation(firstPage);\n                            this.eventBus.dispatch('updateviewarea', {\n                                source: this,\n                                location: this._location\n                            });\n                        }\n                    }, {\n                        key: 'containsElement',\n                        value: function containsElement(element) {\n                            return this.container.contains(element);\n                        }\n                    }, {\n                        key: 'focus',\n                        value: function focus() {\n                            this.container.focus();\n                        }\n                    }, {\n                        key: '_getVisiblePages',\n                        value: function _getVisiblePages() {\n                            if (!this.isInPresentationMode) {\n                                return (0, _ui_utils.getVisibleElements)(this.container, this._pages, true);\n                            }\n                            var visible = [];\n                            var currentPage = this._pages[this._currentPageNumber - 1];\n                            visible.push({\n                                id: currentPage.id,\n                                view: currentPage\n                            });\n                            return {\n                                first: currentPage,\n                                last: currentPage,\n                                views: visible\n                            };\n                        }\n                    }, {\n                        key: 'cleanup',\n                        value: function cleanup() {\n                            for (var i = 0, ii = this._pages.length; i < ii; i++) {\n                                if (this._pages[i] && this._pages[i].renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {\n                                    this._pages[i].reset();\n                                }\n                            }\n                        }\n                    }, {\n                        key: '_cancelRendering',\n                        value: function _cancelRendering() {\n                            for (var i = 0, ii = this._pages.length; i < ii; i++) {\n                                if (this._pages[i]) {\n                                    this._pages[i].cancelRendering();\n                                }\n                            }\n                        }\n                    }, {\n                        key: '_ensurePdfPageLoaded',\n                        value: function _ensurePdfPageLoaded(pageView) {\n                            var _this2 = this;\n\n                            if (pageView.pdfPage) {\n                                return Promise.resolve(pageView.pdfPage);\n                            }\n                            var pageNumber = pageView.id;\n                            if (this._pagesRequests[pageNumber]) {\n                                return this._pagesRequests[pageNumber];\n                            }\n                            var promise = this.pdfDocument.getPage(pageNumber).then(function (pdfPage) {\n                                if (!pageView.pdfPage) {\n                                    pageView.setPdfPage(pdfPage);\n                                }\n                                _this2._pagesRequests[pageNumber] = null;\n                                return pdfPage;\n                            }).catch(function (reason) {\n                                console.error('Unable to get page for page view', reason);\n                                _this2._pagesRequests[pageNumber] = null;\n                            });\n                            this._pagesRequests[pageNumber] = promise;\n                            return promise;\n                        }\n                    }, {\n                        key: 'forceRendering',\n                        value: function forceRendering(currentlyVisiblePages) {\n                            var _this3 = this;\n\n                            var visiblePages = currentlyVisiblePages || this._getVisiblePages();\n                            var pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, this.scroll.down);\n                            if (pageView) {\n                                this._ensurePdfPageLoaded(pageView).then(function () {\n                                    _this3.renderingQueue.renderView(pageView);\n                                });\n                                return true;\n                            }\n                            return false;\n                        }\n                    }, {\n                        key: 'getPageTextContent',\n                        value: function getPageTextContent(pageIndex) {\n                            return this.pdfDocument.getPage(pageIndex + 1).then(function (page) {\n                                return page.getTextContent({ normalizeWhitespace: true });\n                            });\n                        }\n                    }, {\n                        key: 'createTextLayerBuilder',\n                        value: function createTextLayerBuilder(textLayerDiv, pageIndex, viewport) {\n                            var enhanceTextSelection = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n                            return new _text_layer_builder.TextLayerBuilder({\n                                textLayerDiv: textLayerDiv,\n                                eventBus: this.eventBus,\n                                pageIndex: pageIndex,\n                                viewport: viewport,\n                                findController: this.isInPresentationMode ? null : this.findController,\n                                enhanceTextSelection: this.isInPresentationMode ? false : enhanceTextSelection\n                            });\n                        }\n                    }, {\n                        key: 'createAnnotationLayerBuilder',\n                        value: function createAnnotationLayerBuilder(pageDiv, pdfPage) {\n                            var renderInteractiveForms = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n                            var l10n = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _ui_utils.NullL10n;\n\n                            return new _annotation_layer_builder.AnnotationLayerBuilder({\n                                pageDiv: pageDiv,\n                                pdfPage: pdfPage,\n                                renderInteractiveForms: renderInteractiveForms,\n                                linkService: this.linkService,\n                                downloadManager: this.downloadManager,\n                                l10n: l10n\n                            });\n                        }\n                    }, {\n                        key: 'setFindController',\n                        value: function setFindController(findController) {\n                            this.findController = findController;\n                        }\n                    }, {\n                        key: 'getPagesOverview',\n                        value: function getPagesOverview() {\n                            var pagesOverview = this._pages.map(function (pageView) {\n                                var viewport = pageView.pdfPage.getViewport(1);\n                                return {\n                                    width: viewport.width,\n                                    height: viewport.height,\n                                    rotation: viewport.rotation\n                                };\n                            });\n                            if (!this.enablePrintAutoRotate) {\n                                return pagesOverview;\n                            }\n                            var isFirstPagePortrait = isPortraitOrientation(pagesOverview[0]);\n                            return pagesOverview.map(function (size) {\n                                if (isFirstPagePortrait === isPortraitOrientation(size)) {\n                                    return size;\n                                }\n                                return {\n                                    width: size.height,\n                                    height: size.width,\n                                    rotation: (size.rotation + 90) % 360\n                                };\n                            });\n                        }\n                    }, {\n                        key: 'pagesCount',\n                        get: function get() {\n                            return this._pages.length;\n                        }\n                    }, {\n                        key: 'pageViewsReady',\n                        get: function get() {\n                            return this._pageViewsReady;\n                        }\n                    }, {\n                        key: 'currentPageNumber',\n                        get: function get() {\n                            return this._currentPageNumber;\n                        },\n                        set: function set(val) {\n                            if ((val | 0) !== val) {\n                                throw new Error('Invalid page number.');\n                            }\n                            if (!this.pdfDocument) {\n                                return;\n                            }\n                            this._setCurrentPageNumber(val, true);\n                        }\n                    }, {\n                        key: 'currentPageLabel',\n                        get: function get() {\n                            return this._pageLabels && this._pageLabels[this._currentPageNumber - 1];\n                        },\n                        set: function set(val) {\n                            var pageNumber = val | 0;\n                            if (this._pageLabels) {\n                                var i = this._pageLabels.indexOf(val);\n                                if (i >= 0) {\n                                    pageNumber = i + 1;\n                                }\n                            }\n                            this.currentPageNumber = pageNumber;\n                        }\n                    }, {\n                        key: 'currentScale',\n                        get: function get() {\n                            return this._currentScale !== _ui_utils.UNKNOWN_SCALE ? this._currentScale : _ui_utils.DEFAULT_SCALE;\n                        },\n                        set: function set(val) {\n                            if (isNaN(val)) {\n                                throw new Error('Invalid numeric scale');\n                            }\n                            if (!this.pdfDocument) {\n                                return;\n                            }\n                            this._setScale(val, false);\n                        }\n                    }, {\n                        key: 'currentScaleValue',\n                        get: function get() {\n                            return this._currentScaleValue;\n                        },\n                        set: function set(val) {\n                            if (!this.pdfDocument) {\n                                return;\n                            }\n                            this._setScale(val, false);\n                        }\n                    }, {\n                        key: 'pagesRotation',\n                        get: function get() {\n                            return this._pagesRotation;\n                        },\n                        set: function set(rotation) {\n                            if (!(typeof rotation === 'number' && rotation % 90 === 0)) {\n                                throw new Error('Invalid pages rotation angle.');\n                            }\n                            if (!this.pdfDocument) {\n                                return;\n                            }\n                            this._pagesRotation = rotation;\n                            for (var i = 0, ii = this._pages.length; i < ii; i++) {\n                                var pageView = this._pages[i];\n                                pageView.update(pageView.scale, rotation);\n                            }\n                            this._setScale(this._currentScaleValue, true);\n                            if (this.defaultRenderingQueue) {\n                                this.update();\n                            }\n                        }\n                    }, {\n                        key: 'isInPresentationMode',\n                        get: function get() {\n                            return this.presentationModeState === PresentationModeState.FULLSCREEN;\n                        }\n                    }, {\n                        key: 'isChangingPresentationMode',\n                        get: function get() {\n                            return this.presentationModeState === PresentationModeState.CHANGING;\n                        }\n                    }, {\n                        key: 'isHorizontalScrollbarEnabled',\n                        get: function get() {\n                            return this.isInPresentationMode ? false : this.container.scrollWidth > this.container.clientWidth;\n                        }\n                    }, {\n                        key: 'hasEqualPageSizes',\n                        get: function get() {\n                            var firstPageView = this._pages[0];\n                            for (var i = 1, ii = this._pages.length; i < ii; ++i) {\n                                var pageView = this._pages[i];\n                                if (pageView.width !== firstPageView.width || pageView.height !== firstPageView.height) {\n                                    return false;\n                                }\n                            }\n                            return true;\n                        }\n                    }]);\n\n                    return PDFViewer;\n                }();\n\n                exports.PresentationModeState = PresentationModeState;\n                exports.PDFViewer = PDFViewer;\n\n                /***/\n            }),\n        /* 28 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.BasePreferences = undefined;\n\n                var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var defaultPreferences = null;\n                function getDefaultPreferences() {\n                    if (!defaultPreferences) {\n                        defaultPreferences = Promise.resolve({\n                            \"showPreviousViewOnLoad\": true,\n                            \"defaultZoomValue\": \"\",\n                            \"sidebarViewOnLoad\": 0,\n                            \"enableHandToolOnLoad\": false,\n                            \"cursorToolOnLoad\": 0,\n                            \"enableWebGL\": false,\n                            \"pdfBugEnabled\": false,\n                            \"disableRange\": false,\n                            \"disableStream\": false,\n                            \"disableAutoFetch\": false,\n                            \"disableFontFace\": false,\n                            \"disableTextLayer\": false,\n                            \"useOnlyCssZoom\": false,\n                            \"externalLinkTarget\": 0,\n                            \"enhanceTextSelection\": false,\n                            \"renderer\": \"canvas\",\n                            \"renderInteractiveForms\": false,\n                            \"enablePrintAutoRotate\": false,\n                            \"disablePageMode\": false,\n                            \"disablePageLabels\": false\n                        });\n                    }\n                    return defaultPreferences;\n                }\n\n                var BasePreferences = function () {\n                    function BasePreferences() {\n                        var _this = this;\n\n                        _classCallCheck(this, BasePreferences);\n\n                        if (this.constructor === BasePreferences) {\n                            throw new Error('Cannot initialize BasePreferences.');\n                        }\n                        this.prefs = null;\n                        this._initializedPromise = getDefaultPreferences().then(function (defaults) {\n                            Object.defineProperty(_this, 'defaults', {\n                                value: Object.freeze(defaults),\n                                writable: false,\n                                enumerable: true,\n                                configurable: false\n                            });\n                            _this.prefs = (0, _ui_utils.cloneObj)(defaults);\n                            return _this._readFromStorage(defaults);\n                        }).then(function (prefObj) {\n                            if (prefObj) {\n                                _this.prefs = prefObj;\n                            }\n                        });\n                    }\n\n                    _createClass(BasePreferences, [{\n                        key: \"_writeToStorage\",\n                        value: function _writeToStorage(prefObj) {\n                            return Promise.reject(new Error('Not implemented: _writeToStorage'));\n                        }\n                    }, {\n                        key: \"_readFromStorage\",\n                        value: function _readFromStorage(prefObj) {\n                            return Promise.reject(new Error('Not implemented: _readFromStorage'));\n                        }\n                    }, {\n                        key: \"reset\",\n                        value: function reset() {\n                            var _this2 = this;\n\n                            return this._initializedPromise.then(function () {\n                                _this2.prefs = (0, _ui_utils.cloneObj)(_this2.defaults);\n                                return _this2._writeToStorage(_this2.defaults);\n                            });\n                        }\n                    }, {\n                        key: \"reload\",\n                        value: function reload() {\n                            var _this3 = this;\n\n                            return this._initializedPromise.then(function () {\n                                return _this3._readFromStorage(_this3.defaults);\n                            }).then(function (prefObj) {\n                                if (prefObj) {\n                                    _this3.prefs = prefObj;\n                                }\n                            });\n                        }\n                    }, {\n                        key: \"set\",\n                        value: function set(name, value) {\n                            var _this4 = this;\n\n                            return this._initializedPromise.then(function () {\n                                if (_this4.defaults[name] === undefined) {\n                                    throw new Error(\"Set preference: \\\"\" + name + \"\\\" is undefined.\");\n                                } else if (value === undefined) {\n                                    throw new Error('Set preference: no value is specified.');\n                                }\n                                var valueType = typeof value === \"undefined\" ? \"undefined\" : _typeof(value);\n                                var defaultType = _typeof(_this4.defaults[name]);\n                                if (valueType !== defaultType) {\n                                    if (valueType === 'number' && defaultType === 'string') {\n                                        value = value.toString();\n                                    } else {\n                                        throw new Error(\"Set preference: \\\"\" + value + \"\\\" is a \" + valueType + \", \" + (\"expected a \" + defaultType + \".\"));\n                                    }\n                                } else {\n                                    if (valueType === 'number' && (value | 0) !== value) {\n                                        throw new Error(\"Set preference: \\\"\" + value + \"\\\" must be an integer.\");\n                                    }\n                                }\n                                _this4.prefs[name] = value;\n                                return _this4._writeToStorage(_this4.prefs);\n                            });\n                        }\n                    }, {\n                        key: \"get\",\n                        value: function get(name) {\n                            var _this5 = this;\n\n                            return this._initializedPromise.then(function () {\n                                var defaultValue = _this5.defaults[name];\n                                if (defaultValue === undefined) {\n                                    throw new Error(\"Get preference: \\\"\" + name + \"\\\" is undefined.\");\n                                } else {\n                                    var prefValue = _this5.prefs[name];\n                                    if (prefValue !== undefined) {\n                                        return prefValue;\n                                    }\n                                }\n                                return defaultValue;\n                            });\n                        }\n                    }]);\n\n                    return BasePreferences;\n                }();\n\n                exports.BasePreferences = BasePreferences;\n\n                /***/\n            }),\n        /* 29 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.SecondaryToolbar = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _pdf_cursor_tools = __webpack_require__(6);\n\n                var _ui_utils = __webpack_require__(0);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var SecondaryToolbar = function () {\n                    function SecondaryToolbar(options, mainContainer, eventBus) {\n                        _classCallCheck(this, SecondaryToolbar);\n\n                        this.toolbar = options.toolbar;\n                        this.toggleButton = options.toggleButton;\n                        this.toolbarButtonContainer = options.toolbarButtonContainer;\n                        this.buttons = [{\n                            element: options.presentationModeButton,\n                            eventName: 'presentationmode',\n                            close: true\n                        }, {\n                            element: options.openFileButton,\n                            eventName: 'openfile',\n                            close: true\n                        }, {\n                            element: options.printButton,\n                            eventName: 'print',\n                            close: true\n                        }, {\n                            element: options.downloadButton,\n                            eventName: 'download',\n                            close: true\n                        }, {\n                            element: options.viewBookmarkButton,\n                            eventName: null,\n                            close: true\n                        }, {\n                            element: options.firstPageButton,\n                            eventName: 'firstpage',\n                            close: true\n                        }, {\n                            element: options.lastPageButton,\n                            eventName: 'lastpage',\n                            close: true\n                        }, {\n                            element: options.pageRotateCwButton,\n                            eventName: 'rotatecw',\n                            close: false\n                        }, {\n                            element: options.pageRotateCcwButton,\n                            eventName: 'rotateccw',\n                            close: false\n                        }, {\n                            element: options.cursorSelectToolButton,\n                            eventName: 'switchcursortool',\n                            eventDetails: { tool: _pdf_cursor_tools.CursorTool.SELECT },\n                            close: true\n                        }, {\n                            element: options.cursorHandToolButton,\n                            eventName: 'switchcursortool',\n                            eventDetails: { tool: _pdf_cursor_tools.CursorTool.HAND },\n                            close: true\n                        }, {\n                            element: options.documentPropertiesButton,\n                            eventName: 'documentproperties',\n                            close: true\n                        }];\n                        this.items = {\n                            firstPage: options.firstPageButton,\n                            lastPage: options.lastPageButton,\n                            pageRotateCw: options.pageRotateCwButton,\n                            pageRotateCcw: options.pageRotateCcwButton\n                        };\n                        this.mainContainer = mainContainer;\n                        this.eventBus = eventBus;\n                        this.opened = false;\n                        this.containerHeight = null;\n                        this.previousContainerHeight = null;\n                        this.reset();\n                        this._bindClickListeners();\n                        this._bindCursorToolsListener(options);\n                        this.eventBus.on('resize', this._setMaxHeight.bind(this));\n                    }\n\n                    _createClass(SecondaryToolbar, [{\n                        key: 'setPageNumber',\n                        value: function setPageNumber(pageNumber) {\n                            this.pageNumber = pageNumber;\n                            this._updateUIState();\n                        }\n                    }, {\n                        key: 'setPagesCount',\n                        value: function setPagesCount(pagesCount) {\n                            this.pagesCount = pagesCount;\n                            this._updateUIState();\n                        }\n                    }, {\n                        key: 'reset',\n                        value: function reset() {\n                            this.pageNumber = 0;\n                            this.pagesCount = 0;\n                            this._updateUIState();\n                        }\n                    }, {\n                        key: '_updateUIState',\n                        value: function _updateUIState() {\n                            this.items.firstPage.disabled = this.pageNumber <= 1;\n                            this.items.lastPage.disabled = this.pageNumber >= this.pagesCount;\n                            this.items.pageRotateCw.disabled = this.pagesCount === 0;\n                            this.items.pageRotateCcw.disabled = this.pagesCount === 0;\n                        }\n                    }, {\n                        key: '_bindClickListeners',\n                        value: function _bindClickListeners() {\n                            var _this = this;\n\n                            this.toggleButton.addEventListener('click', this.toggle.bind(this));\n\n                            var _loop = function _loop(button) {\n                                var _buttons$button = _this.buttons[button],\n                                    element = _buttons$button.element,\n                                    eventName = _buttons$button.eventName,\n                                    close = _buttons$button.close,\n                                    eventDetails = _buttons$button.eventDetails;\n\n                                element.addEventListener('click', function (evt) {\n                                    if (eventName !== null) {\n                                        var details = { source: _this };\n                                        for (var property in eventDetails) {\n                                            details[property] = eventDetails[property];\n                                        }\n                                        _this.eventBus.dispatch(eventName, details);\n                                    }\n                                    if (close) {\n                                        _this.close();\n                                    }\n                                });\n                            };\n\n                            for (var button in this.buttons) {\n                                _loop(button);\n                            }\n                        }\n                    }, {\n                        key: '_bindCursorToolsListener',\n                        value: function _bindCursorToolsListener(buttons) {\n                            this.eventBus.on('cursortoolchanged', function (evt) {\n                                buttons.cursorSelectToolButton.classList.remove('toggled');\n                                buttons.cursorHandToolButton.classList.remove('toggled');\n                                switch (evt.tool) {\n                                    case _pdf_cursor_tools.CursorTool.SELECT:\n                                        buttons.cursorSelectToolButton.classList.add('toggled');\n                                        break;\n                                    case _pdf_cursor_tools.CursorTool.HAND:\n                                        buttons.cursorHandToolButton.classList.add('toggled');\n                                        break;\n                                }\n                            });\n                        }\n                    }, {\n                        key: 'open',\n                        value: function open() {\n                            if (this.opened) {\n                                return;\n                            }\n                            this.opened = true;\n                            this._setMaxHeight();\n                            this.toggleButton.classList.add('toggled');\n                            this.toolbar.classList.remove('hidden');\n                        }\n                    }, {\n                        key: 'close',\n                        value: function close() {\n                            if (!this.opened) {\n                                return;\n                            }\n                            this.opened = false;\n                            this.toolbar.classList.add('hidden');\n                            this.toggleButton.classList.remove('toggled');\n                        }\n                    }, {\n                        key: 'toggle',\n                        value: function toggle() {\n                            if (this.opened) {\n                                this.close();\n                            } else {\n                                this.open();\n                            }\n                        }\n                    }, {\n                        key: '_setMaxHeight',\n                        value: function _setMaxHeight() {\n                            if (!this.opened) {\n                                return;\n                            }\n                            this.containerHeight = this.mainContainer.clientHeight;\n                            if (this.containerHeight === this.previousContainerHeight) {\n                                return;\n                            }\n                            this.toolbarButtonContainer.setAttribute('style', 'max-height: ' + (this.containerHeight - _ui_utils.SCROLLBAR_PADDING) + 'px;');\n                            this.previousContainerHeight = this.containerHeight;\n                        }\n                    }, {\n                        key: 'isOpen',\n                        get: function get() {\n                            return this.opened;\n                        }\n                    }]);\n\n                    return SecondaryToolbar;\n                }();\n\n                exports.SecondaryToolbar = SecondaryToolbar;\n\n                /***/\n            }),\n        /* 30 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.DefaultTextLayerFactory = exports.TextLayerBuilder = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _dom_events = __webpack_require__(2);\n\n                var _pdfjsLib = __webpack_require__(1);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var EXPAND_DIVS_TIMEOUT = 300;\n\n                var TextLayerBuilder = function () {\n                    function TextLayerBuilder(_ref) {\n                        var textLayerDiv = _ref.textLayerDiv,\n                            eventBus = _ref.eventBus,\n                            pageIndex = _ref.pageIndex,\n                            viewport = _ref.viewport,\n                            _ref$findController = _ref.findController,\n                            findController = _ref$findController === undefined ? null : _ref$findController,\n                            _ref$enhanceTextSelec = _ref.enhanceTextSelection,\n                            enhanceTextSelection = _ref$enhanceTextSelec === undefined ? false : _ref$enhanceTextSelec;\n\n                        _classCallCheck(this, TextLayerBuilder);\n\n                        this.textLayerDiv = textLayerDiv;\n                        this.eventBus = eventBus || (0, _dom_events.getGlobalEventBus)();\n                        this.textContent = null;\n                        this.textContentItemsStr = [];\n                        this.textContentStream = null;\n                        this.renderingDone = false;\n                        this.pageIdx = pageIndex;\n                        this.pageNumber = this.pageIdx + 1;\n                        this.matches = [];\n                        this.viewport = viewport;\n                        this.textDivs = [];\n                        this.findController = findController;\n                        this.textLayerRenderTask = null;\n                        this.enhanceTextSelection = enhanceTextSelection;\n                        this._bindMouse();\n                    }\n\n                    _createClass(TextLayerBuilder, [{\n                        key: '_finishRendering',\n                        value: function _finishRendering() {\n                            this.renderingDone = true;\n                            if (!this.enhanceTextSelection) {\n                                var endOfContent = document.createElement('div');\n                                endOfContent.className = 'endOfContent';\n                                this.textLayerDiv.appendChild(endOfContent);\n                            }\n                            this.eventBus.dispatch('textlayerrendered', {\n                                source: this,\n                                pageNumber: this.pageNumber,\n                                numTextDivs: this.textDivs.length\n                            });\n                        }\n                    }, {\n                        key: 'render',\n                        value: function render() {\n                            var _this = this;\n\n                            var timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n                            if (!(this.textContent || this.textContentStream) || this.renderingDone) {\n                                return;\n                            }\n                            this.cancel();\n                            this.textDivs = [];\n                            var textLayerFrag = document.createDocumentFragment();\n                            this.textLayerRenderTask = (0, _pdfjsLib.renderTextLayer)({\n                                textContent: this.textContent,\n                                textContentStream: this.textContentStream,\n                                container: textLayerFrag,\n                                viewport: this.viewport,\n                                textDivs: this.textDivs,\n                                textContentItemsStr: this.textContentItemsStr,\n                                timeout: timeout,\n                                enhanceTextSelection: this.enhanceTextSelection\n                            });\n                            this.textLayerRenderTask.promise.then(function () {\n                                _this.textLayerDiv.appendChild(textLayerFrag);\n                                _this._finishRendering();\n                                _this.updateMatches();\n                            }, function (reason) { });\n                        }\n                    }, {\n                        key: 'cancel',\n                        value: function cancel() {\n                            if (this.textLayerRenderTask) {\n                                this.textLayerRenderTask.cancel();\n                                this.textLayerRenderTask = null;\n                            }\n                        }\n                    }, {\n                        key: 'setTextContentStream',\n                        value: function setTextContentStream(readableStream) {\n                            this.cancel();\n                            this.textContentStream = readableStream;\n                        }\n                    }, {\n                        key: 'setTextContent',\n                        value: function setTextContent(textContent) {\n                            this.cancel();\n                            this.textContent = textContent;\n                        }\n                    }, {\n                        key: 'convertMatches',\n                        value: function convertMatches(matches, matchesLength) {\n                            var i = 0;\n                            var iIndex = 0;\n                            var textContentItemsStr = this.textContentItemsStr;\n                            var end = textContentItemsStr.length - 1;\n                            var queryLen = this.findController === null ? 0 : this.findController.state.query.length;\n                            var ret = [];\n                            if (!matches) {\n                                return ret;\n                            }\n                            for (var m = 0, len = matches.length; m < len; m++) {\n                                var matchIdx = matches[m];\n                                while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) {\n                                    iIndex += textContentItemsStr[i].length;\n                                    i++;\n                                }\n                                if (i === textContentItemsStr.length) {\n                                    console.error('Could not find a matching mapping');\n                                }\n                                var match = {\n                                    begin: {\n                                        divIdx: i,\n                                        offset: matchIdx - iIndex\n                                    }\n                                };\n                                if (matchesLength) {\n                                    matchIdx += matchesLength[m];\n                                } else {\n                                    matchIdx += queryLen;\n                                }\n                                while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) {\n                                    iIndex += textContentItemsStr[i].length;\n                                    i++;\n                                }\n                                match.end = {\n                                    divIdx: i,\n                                    offset: matchIdx - iIndex\n                                };\n                                ret.push(match);\n                            }\n                            return ret;\n                        }\n                    }, {\n                        key: 'renderMatches',\n                        value: function renderMatches(matches) {\n                            if (matches.length === 0) {\n                                return;\n                            }\n                            var textContentItemsStr = this.textContentItemsStr;\n                            var textDivs = this.textDivs;\n                            var prevEnd = null;\n                            var pageIdx = this.pageIdx;\n                            var isSelectedPage = this.findController === null ? false : pageIdx === this.findController.selected.pageIdx;\n                            var selectedMatchIdx = this.findController === null ? -1 : this.findController.selected.matchIdx;\n                            var highlightAll = this.findController === null ? false : this.findController.state.highlightAll;\n                            var infinity = {\n                                divIdx: -1,\n                                offset: undefined\n                            };\n                            function beginText(begin, className) {\n                                var divIdx = begin.divIdx;\n                                textDivs[divIdx].textContent = '';\n                                appendTextToDiv(divIdx, 0, begin.offset, className);\n                            }\n                            function appendTextToDiv(divIdx, fromOffset, toOffset, className) {\n                                var div = textDivs[divIdx];\n                                var content = textContentItemsStr[divIdx].substring(fromOffset, toOffset);\n                                var node = document.createTextNode(content);\n                                if (className) {\n                                    var span = document.createElement('span');\n                                    span.className = className;\n                                    span.appendChild(node);\n                                    div.appendChild(span);\n                                    return;\n                                }\n                                div.appendChild(node);\n                            }\n                            var i0 = selectedMatchIdx,\n                                i1 = i0 + 1;\n                            if (highlightAll) {\n                                i0 = 0;\n                                i1 = matches.length;\n                            } else if (!isSelectedPage) {\n                                return;\n                            }\n                            for (var i = i0; i < i1; i++) {\n                                var match = matches[i];\n                                var begin = match.begin;\n                                var end = match.end;\n                                var isSelected = isSelectedPage && i === selectedMatchIdx;\n                                var highlightSuffix = isSelected ? ' selected' : '';\n                                if (this.findController) {\n                                    this.findController.updateMatchPosition(pageIdx, i, textDivs, begin.divIdx);\n                                }\n                                if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {\n                                    if (prevEnd !== null) {\n                                        appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n                                    }\n                                    beginText(begin);\n                                } else {\n                                    appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);\n                                }\n                                if (begin.divIdx === end.divIdx) {\n                                    appendTextToDiv(begin.divIdx, begin.offset, end.offset, 'highlight' + highlightSuffix);\n                                } else {\n                                    appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, 'highlight begin' + highlightSuffix);\n                                    for (var n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {\n                                        textDivs[n0].className = 'highlight middle' + highlightSuffix;\n                                    }\n                                    beginText(end, 'highlight end' + highlightSuffix);\n                                }\n                                prevEnd = end;\n                            }\n                            if (prevEnd) {\n                                appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n                            }\n                        }\n                    }, {\n                        key: 'updateMatches',\n                        value: function updateMatches() {\n                            if (!this.renderingDone) {\n                                return;\n                            }\n                            var matches = this.matches;\n                            var textDivs = this.textDivs;\n                            var textContentItemsStr = this.textContentItemsStr;\n                            var clearedUntilDivIdx = -1;\n                            for (var i = 0, len = matches.length; i < len; i++) {\n                                var match = matches[i];\n                                var begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);\n                                for (var n = begin, end = match.end.divIdx; n <= end; n++) {\n                                    var div = textDivs[n];\n                                    div.textContent = textContentItemsStr[n];\n                                    div.className = '';\n                                }\n                                clearedUntilDivIdx = match.end.divIdx + 1;\n                            }\n                            if (this.findController === null || !this.findController.active) {\n                                return;\n                            }\n                            var pageMatches = void 0,\n                                pageMatchesLength = void 0;\n                            if (this.findController !== null) {\n                                pageMatches = this.findController.pageMatches[this.pageIdx] || null;\n                                pageMatchesLength = this.findController.pageMatchesLength ? this.findController.pageMatchesLength[this.pageIdx] || null : null;\n                            }\n                            this.matches = this.convertMatches(pageMatches, pageMatchesLength);\n                            this.renderMatches(this.matches);\n                        }\n                    }, {\n                        key: '_bindMouse',\n                        value: function _bindMouse() {\n                            var _this2 = this;\n\n                            var div = this.textLayerDiv;\n                            var expandDivsTimer = null;\n                            div.addEventListener('mousedown', function (evt) {\n                                if (_this2.enhanceTextSelection && _this2.textLayerRenderTask) {\n                                    _this2.textLayerRenderTask.expandTextDivs(true);\n                                    if (expandDivsTimer) {\n                                        clearTimeout(expandDivsTimer);\n                                        expandDivsTimer = null;\n                                    }\n                                    return;\n                                }\n                                var end = div.querySelector('.endOfContent');\n                                if (!end) {\n                                    return;\n                                }\n                                var adjustTop = evt.target !== div;\n                                adjustTop = adjustTop && window.getComputedStyle(end).getPropertyValue('-moz-user-select') !== 'none';\n                                if (adjustTop) {\n                                    var divBounds = div.getBoundingClientRect();\n                                    var r = Math.max(0, (evt.pageY - divBounds.top) / divBounds.height);\n                                    end.style.top = (r * 100).toFixed(2) + '%';\n                                }\n                                end.classList.add('active');\n                            });\n                            div.addEventListener('mouseup', function () {\n                                if (_this2.enhanceTextSelection && _this2.textLayerRenderTask) {\n                                    expandDivsTimer = setTimeout(function () {\n                                        if (_this2.textLayerRenderTask) {\n                                            _this2.textLayerRenderTask.expandTextDivs(false);\n                                        }\n                                        expandDivsTimer = null;\n                                    }, EXPAND_DIVS_TIMEOUT);\n                                    return;\n                                }\n                                var end = div.querySelector('.endOfContent');\n                                if (!end) {\n                                    return;\n                                }\n                                end.style.top = '';\n                                end.classList.remove('active');\n                            });\n                        }\n                    }]);\n\n                    return TextLayerBuilder;\n                }();\n\n                var DefaultTextLayerFactory = function () {\n                    function DefaultTextLayerFactory() {\n                        _classCallCheck(this, DefaultTextLayerFactory);\n                    }\n\n                    _createClass(DefaultTextLayerFactory, [{\n                        key: 'createTextLayerBuilder',\n                        value: function createTextLayerBuilder(textLayerDiv, pageIndex, viewport) {\n                            var enhanceTextSelection = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n                            return new TextLayerBuilder({\n                                textLayerDiv: textLayerDiv,\n                                pageIndex: pageIndex,\n                                viewport: viewport,\n                                enhanceTextSelection: enhanceTextSelection\n                            });\n                        }\n                    }]);\n\n                    return DefaultTextLayerFactory;\n                }();\n\n                exports.TextLayerBuilder = TextLayerBuilder;\n                exports.DefaultTextLayerFactory = DefaultTextLayerFactory;\n\n                /***/\n            }),\n        /* 31 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n                exports.Toolbar = undefined;\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                var _ui_utils = __webpack_require__(0);\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var PAGE_NUMBER_LOADING_INDICATOR = 'visiblePageIsLoading';\n                var SCALE_SELECT_CONTAINER_PADDING = 8;\n                var SCALE_SELECT_PADDING = 22;\n\n                var Toolbar = function () {\n                    function Toolbar(options, mainContainer, eventBus) {\n                        var l10n = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _ui_utils.NullL10n;\n\n                        _classCallCheck(this, Toolbar);\n\n                        this.toolbar = options.container;\n                        this.mainContainer = mainContainer;\n                        this.eventBus = eventBus;\n                        this.l10n = l10n;\n                        this.items = options;\n                        this._wasLocalized = false;\n                        this.reset();\n                        this._bindListeners();\n                    }\n\n                    _createClass(Toolbar, [{\n                        key: 'setPageNumber',\n                        value: function setPageNumber(pageNumber, pageLabel) {\n                            this.pageNumber = pageNumber;\n                            this.pageLabel = pageLabel;\n                            this._updateUIState(false);\n                        }\n                    }, {\n                        key: 'setPagesCount',\n                        value: function setPagesCount(pagesCount, hasPageLabels) {\n                            this.pagesCount = pagesCount;\n                            this.hasPageLabels = hasPageLabels;\n                            this._updateUIState(true);\n                        }\n                    }, {\n                        key: 'setPageScale',\n                        value: function setPageScale(pageScaleValue, pageScale) {\n                            this.pageScaleValue = pageScaleValue;\n                            this.pageScale = pageScale;\n                            this._updateUIState(false);\n                        }\n                    }, {\n                        key: 'reset',\n                        value: function reset() {\n                            this.pageNumber = 0;\n                            this.pageLabel = null;\n                            this.hasPageLabels = false;\n                            this.pagesCount = 0;\n                            this.pageScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;\n                            this.pageScale = _ui_utils.DEFAULT_SCALE;\n                            this._updateUIState(true);\n                        }\n                    }, {\n                        key: '_bindListeners',\n                        value: function _bindListeners() {\n                            var _this = this;\n\n                            var eventBus = this.eventBus,\n                                items = this.items;\n\n                            var self = this;\n                            items.previous.addEventListener('click', function () {\n                                eventBus.dispatch('previouspage');\n                            });\n                            items.next.addEventListener('click', function () {\n                                eventBus.dispatch('nextpage');\n                            });\n                            items.zoomIn.addEventListener('click', function () {\n                                eventBus.dispatch('zoomin');\n                            });\n                            items.zoomOut.addEventListener('click', function () {\n                                eventBus.dispatch('zoomout');\n                            });\n                            items.pageNumber.addEventListener('click', function () {\n                                this.select();\n                            });\n                            items.pageNumber.addEventListener('change', function () {\n                                eventBus.dispatch('pagenumberchanged', {\n                                    source: self,\n                                    value: this.value\n                                });\n                            });\n                            items.scaleSelect.addEventListener('change', function () {\n                                if (this.value === 'custom') {\n                                    return;\n                                }\n                                eventBus.dispatch('scalechanged', {\n                                    source: self,\n                                    value: this.value\n                                });\n                            });\n                            items.presentationModeButton.addEventListener('click', function () {\n                                eventBus.dispatch('presentationmode');\n                            });\n                            items.openFile.addEventListener('click', function () {\n                                eventBus.dispatch('openfile');\n                            });\n                            items.print.addEventListener('click', function () {\n                                eventBus.dispatch('print');\n                            });\n                            items.download.addEventListener('click', function () {\n                                eventBus.dispatch('download');\n                            });\n                            items.scaleSelect.oncontextmenu = _ui_utils.noContextMenuHandler;\n                            eventBus.on('localized', function () {\n                                _this._localized();\n                            });\n                        }\n                    }, {\n                        key: '_localized',\n                        value: function _localized() {\n                            this._wasLocalized = true;\n                            this._adjustScaleWidth();\n                            this._updateUIState(true);\n                        }\n                    }, {\n                        key: '_updateUIState',\n                        value: function _updateUIState() {\n                            var resetNumPages = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n                            if (!this._wasLocalized) {\n                                return;\n                            }\n                            var pageNumber = this.pageNumber,\n                                pagesCount = this.pagesCount,\n                                items = this.items;\n\n                            var scaleValue = (this.pageScaleValue || this.pageScale).toString();\n                            var scale = this.pageScale;\n                            if (resetNumPages) {\n                                if (this.hasPageLabels) {\n                                    items.pageNumber.type = 'text';\n                                } else {\n                                    items.pageNumber.type = 'number';\n                                    this.l10n.get('of_pages', { pagesCount: pagesCount }, 'of {{pagesCount}}').then(function (msg) {\n                                        items.numPages.textContent = msg;\n                                    });\n                                }\n                                items.pageNumber.max = pagesCount;\n                            }\n                            if (this.hasPageLabels) {\n                                items.pageNumber.value = this.pageLabel;\n                                this.l10n.get('page_of_pages', {\n                                    pageNumber: pageNumber,\n                                    pagesCount: pagesCount\n                                }, '({{pageNumber}} of {{pagesCount}})').then(function (msg) {\n                                    items.numPages.textContent = msg;\n                                });\n                            } else {\n                                items.pageNumber.value = pageNumber;\n                            }\n                            items.previous.disabled = pageNumber <= 1;\n                            items.next.disabled = pageNumber >= pagesCount;\n                            items.zoomOut.disabled = scale <= _ui_utils.MIN_SCALE;\n                            items.zoomIn.disabled = scale >= _ui_utils.MAX_SCALE;\n                            var customScale = Math.round(scale * 10000) / 100;\n                            this.l10n.get('page_scale_percent', { scale: customScale }, '{{scale}}%').then(function (msg) {\n                                var options = items.scaleSelect.options;\n                                var predefinedValueFound = false;\n                                for (var i = 0, ii = options.length; i < ii; i++) {\n                                    var option = options[i];\n                                    if (option.value !== scaleValue) {\n                                        option.selected = false;\n                                        continue;\n                                    }\n                                    option.selected = true;\n                                    predefinedValueFound = true;\n                                }\n                                if (!predefinedValueFound) {\n                                    items.customScaleOption.textContent = msg;\n                                    items.customScaleOption.selected = true;\n                                }\n                            });\n                        }\n                    }, {\n                        key: 'updateLoadingIndicatorState',\n                        value: function updateLoadingIndicatorState() {\n                            var loading = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n                            var pageNumberInput = this.items.pageNumber;\n                            if (loading) {\n                                pageNumberInput.classList.add(PAGE_NUMBER_LOADING_INDICATOR);\n                            } else {\n                                pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR);\n                            }\n                        }\n                    }, {\n                        key: '_adjustScaleWidth',\n                        value: function _adjustScaleWidth() {\n                            var container = this.items.scaleSelectContainer;\n                            var select = this.items.scaleSelect;\n                            _ui_utils.animationStarted.then(function () {\n                                if (container.clientWidth === 0) {\n                                    container.setAttribute('style', 'display: inherit;');\n                                }\n                                if (container.clientWidth > 0) {\n                                    select.setAttribute('style', 'min-width: inherit;');\n                                    var width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING;\n                                    select.setAttribute('style', 'min-width: ' + (width + SCALE_SELECT_PADDING) + 'px;');\n                                    container.setAttribute('style', 'min-width: ' + width + 'px; ' + 'max-width: ' + width + 'px;');\n                                }\n                            });\n                        }\n                    }]);\n\n                    return Toolbar;\n                }();\n\n                exports.Toolbar = Toolbar;\n\n                /***/\n            }),\n        /* 32 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                Object.defineProperty(exports, \"__esModule\", {\n                    value: true\n                });\n\n                var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n                function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n                var DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20;\n\n                var ViewHistory = function () {\n                    function ViewHistory(fingerprint) {\n                        var _this = this;\n\n                        var cacheSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_VIEW_HISTORY_CACHE_SIZE;\n\n                        _classCallCheck(this, ViewHistory);\n\n                        this.fingerprint = fingerprint;\n                        this.cacheSize = cacheSize;\n                        this._initializedPromise = this._readFromStorage().then(function (databaseStr) {\n                            var database = JSON.parse(databaseStr || '{}');\n                            if (!('files' in database)) {\n                                database.files = [];\n                            }\n                            if (database.files.length >= _this.cacheSize) {\n                                database.files.shift();\n                            }\n                            var index = void 0;\n                            for (var i = 0, length = database.files.length; i < length; i++) {\n                                var branch = database.files[i];\n                                if (branch.fingerprint === _this.fingerprint) {\n                                    index = i;\n                                    break;\n                                }\n                            }\n                            if (typeof index !== 'number') {\n                                index = database.files.push({ fingerprint: _this.fingerprint }) - 1;\n                            }\n                            _this.file = database.files[index];\n                            _this.database = database;\n                        });\n                    }\n\n                    _createClass(ViewHistory, [{\n                        key: '_writeToStorage',\n                        value: function _writeToStorage() {\n                            var _this2 = this;\n\n                            return new Promise(function (resolve) {\n                                var databaseStr = JSON.stringify(_this2.database);\n                                localStorage.setItem('pdfjs.history', databaseStr);\n                                resolve();\n                            });\n                        }\n                    }, {\n                        key: '_readFromStorage',\n                        value: function _readFromStorage() {\n                            return new Promise(function (resolve) {\n                                var value = localStorage.getItem('pdfjs.history');\n                                if (!value) {\n                                    var databaseStr = localStorage.getItem('database');\n                                    if (databaseStr) {\n                                        try {\n                                            var database = JSON.parse(databaseStr);\n                                            if (typeof database.files[0].fingerprint === 'string') {\n                                                localStorage.setItem('pdfjs.history', databaseStr);\n                                                localStorage.removeItem('database');\n                                                value = databaseStr;\n                                            }\n                                        } catch (ex) { }\n                                    }\n                                }\n                                resolve(value);\n                            });\n                        }\n                    }, {\n                        key: 'set',\n                        value: function set(name, val) {\n                            var _this3 = this;\n\n                            return this._initializedPromise.then(function () {\n                                _this3.file[name] = val;\n                                return _this3._writeToStorage();\n                            });\n                        }\n                    }, {\n                        key: 'setMultiple',\n                        value: function setMultiple(properties) {\n                            var _this4 = this;\n\n                            return this._initializedPromise.then(function () {\n                                for (var name in properties) {\n                                    _this4.file[name] = properties[name];\n                                }\n                                return _this4._writeToStorage();\n                            });\n                        }\n                    }, {\n                        key: 'get',\n                        value: function get(name, defaultValue) {\n                            var _this5 = this;\n\n                            return this._initializedPromise.then(function () {\n                                var val = _this5.file[name];\n                                return val !== undefined ? val : defaultValue;\n                            });\n                        }\n                    }, {\n                        key: 'getMultiple',\n                        value: function getMultiple(properties) {\n                            var _this6 = this;\n\n                            return this._initializedPromise.then(function () {\n                                var values = Object.create(null);\n                                for (var name in properties) {\n                                    var val = _this6.file[name];\n                                    values[name] = val !== undefined ? val : properties[name];\n                                }\n                                return values;\n                            });\n                        }\n                    }]);\n\n                    return ViewHistory;\n                }();\n\n                exports.ViewHistory = ViewHistory;\n\n                /***/\n            }),\n        /* 33 */\n        /***/ (function (module, exports, __webpack_require__) {\n\n                \"use strict\";\n\n\n                var DEFAULT_URL = my_pdf_file;//'compressed.tracemonkey-pldi-09.pdf';\n                ;\n                var pdfjsWebApp = void 0;\n                {\n                    pdfjsWebApp = __webpack_require__(4);\n                }\n                ;\n                {\n                    __webpack_require__(8);\n                }\n                ;\n                {\n                    __webpack_require__(9);\n                }\n                function getViewerConfiguration() {\n                    return {\n                        appContainer: document.body,\n                        mainContainer: document.getElementById('viewerContainer'),\n                        viewerContainer: document.getElementById('viewer'),\n                        eventBus: null,\n                        toolbar: {\n                            container: document.getElementById('toolbarViewer'),\n                            numPages: document.getElementById('numPages'),\n                            pageNumber: document.getElementById('pageNumber'),\n                            scaleSelectContainer: document.getElementById('scaleSelectContainer'),\n                            scaleSelect: document.getElementById('scaleSelect'),\n                            customScaleOption: document.getElementById('customScaleOption'),\n                            previous: document.getElementById('previous'),\n                            next: document.getElementById('next'),\n                            zoomIn: document.getElementById('zoomIn'),\n                            zoomOut: document.getElementById('zoomOut'),\n                            viewFind: document.getElementById('viewFind'),\n                            openFile: document.getElementById('openFile'),\n                            print: document.getElementById('print'),\n                            presentationModeButton: document.getElementById('presentationMode'),\n                            download: document.getElementById('download'),\n                            viewBookmark: document.getElementById('viewBookmark')\n                        },\n                        secondaryToolbar: {\n                            toolbar: document.getElementById('secondaryToolbar'),\n                            toggleButton: document.getElementById('secondaryToolbarToggle'),\n                            toolbarButtonContainer: document.getElementById('secondaryToolbarButtonContainer'),\n                            presentationModeButton: document.getElementById('secondaryPresentationMode'),\n                            openFileButton: document.getElementById('secondaryOpenFile'),\n                            printButton: document.getElementById('secondaryPrint'),\n                            downloadButton: document.getElementById('secondaryDownload'),\n                            viewBookmarkButton: document.getElementById('secondaryViewBookmark'),\n                            firstPageButton: document.getElementById('firstPage'),\n                            lastPageButton: document.getElementById('lastPage'),\n                            pageRotateCwButton: document.getElementById('pageRotateCw'),\n                            pageRotateCcwButton: document.getElementById('pageRotateCcw'),\n                            cursorSelectToolButton: document.getElementById('cursorSelectTool'),\n                            cursorHandToolButton: document.getElementById('cursorHandTool'),\n                            documentPropertiesButton: document.getElementById('pdfDocumentProperties')\n                        },\n                        fullscreen: {\n                            contextFirstPage: document.getElementById('contextFirstPage'),\n                            contextLastPage: document.getElementById('contextLastPage'),\n                            contextPageRotateCw: document.getElementById('contextPageRotateCw'),\n                            contextPageRotateCcw: document.getElementById('contextPageRotateCcw')\n                        },\n                        sidebar: {\n                            mainContainer: document.getElementById('mainContainer'),\n                            outerContainer: document.getElementById('outerContainer'),\n                            toggleButton: document.getElementById('sidebarToggle'),\n                            thumbnailButton: document.getElementById('viewThumbnail'),\n                            outlineButton: document.getElementById('viewOutline'),\n                            attachmentsButton: document.getElementById('viewAttachments'),\n                            thumbnailView: document.getElementById('thumbnailView'),\n                            outlineView: document.getElementById('outlineView'),\n                            attachmentsView: document.getElementById('attachmentsView')\n                        },\n                        findBar: {\n                            bar: document.getElementById('findbar'),\n                            toggleButton: document.getElementById('viewFind'),\n                            findField: document.getElementById('findInput'),\n                            highlightAllCheckbox: document.getElementById('findHighlightAll'),\n                            caseSensitiveCheckbox: document.getElementById('findMatchCase'),\n                            findMsg: document.getElementById('findMsg'),\n                            findResultsCount: document.getElementById('findResultsCount'),\n                            findStatusIcon: document.getElementById('findStatusIcon'),\n                            findPreviousButton: document.getElementById('findPrevious'),\n                            findNextButton: document.getElementById('findNext')\n                        },\n                        passwordOverlay: {\n                            overlayName: 'passwordOverlay',\n                            container: document.getElementById('passwordOverlay'),\n                            label: document.getElementById('passwordText'),\n                            input: document.getElementById('password'),\n                            submitButton: document.getElementById('passwordSubmit'),\n                            cancelButton: document.getElementById('passwordCancel')\n                        },\n                        pdfDocumentProperties: {\n                            overlayName: 'documentPropertiesOverlay',\n                            container: document.getElementById('documentPropertiesOverlay'),\n                            closeButton: document.getElementById('documentPropertiesClose'),\n                            fields: {\n                                'fileName': document.getElementById('fileNameField'),\n                                'fileSize': document.getElementById('fileSizeField'),\n                                'title': document.getElementById('titleField'),\n                                'author': document.getElementById('authorField'),\n                                'subject': document.getElementById('subjectField'),\n                                'keywords': document.getElementById('keywordsField'),\n                                'creationDate': document.getElementById('creationDateField'),\n                                'modificationDate': document.getElementById('modificationDateField'),\n                                'creator': document.getElementById('creatorField'),\n                                'producer': document.getElementById('producerField'),\n                                'version': document.getElementById('versionField'),\n                                'pageCount': document.getElementById('pageCountField')\n                            }\n                        },\n                        errorWrapper: {\n                            container: document.getElementById('errorWrapper'),\n                            errorMessage: document.getElementById('errorMessage'),\n                            closeButton: document.getElementById('errorClose'),\n                            errorMoreInfo: document.getElementById('errorMoreInfo'),\n                            moreInfoButton: document.getElementById('errorShowMore'),\n                            lessInfoButton: document.getElementById('errorShowLess')\n                        },\n                        printContainer: document.getElementById('printContainer'),\n                        openFileInputName: 'fileInput',\n                        debuggerScriptPath: './debugger.js',\n                        defaultUrl: DEFAULT_URL\n                    };\n                }\n                function webViewerLoad() {\n                    var config = getViewerConfiguration();\n                    window.PDFViewerApplication = pdfjsWebApp.PDFViewerApplication;\n                    pdfjsWebApp.PDFViewerApplication.run(config);\n                }\n                if (document.readyState === 'interactive' || document.readyState === 'complete') {\n                    webViewerLoad();\n                } else {\n                    document.addEventListener('DOMContentLoaded', webViewerLoad, true);\n                }\n\n                /***/\n            })\n        /******/]);\n        //# sourceMappingURL=viewer.js.map\n\n        // open a file in the viewer\n        // The workerSrc property shall be specified.\n        //PDFJS.workerSrc = './Content/pdfViewer/pdf.worker.js';\n        /*\n        var file = fObj.Obj;\n\n        scale = 0.5||pdfSet.pdfScale;\n\n        PDFJS.disableWorker = true;\n        PDFJS.getDocument(file).then(function(pdfDoc){\n            for(var num = 1; num <= pdfDoc.numPages; num++){\n                pdfDoc.getPage(num).then(function(page){\n                    var viewport = page.getViewport(scale); //options.scale\n                    var canvas = document.createElement('canvas');\n                    var ctx = canvas.getContext('2d');\n                    var renderContext = {\n                    canvasContext: ctx,\n                    viewport: viewport\n                    };\n                    \n                    canvas.height = viewport.height;\n                    canvas.width = viewport.width;\n                    $(\"#\"+divId + \" #viewer\").append(canvas);\n                    \n                    page.render(renderContext);\n                });\n            }\n        });\n        */\n        return true;\n    }\n    /////////////////////////////////////////////////Docx//////////////////////////////////////////\n    function getDocxContent(fObj, divId, docxSet) {\n\n        $(\"#\" + divId).html(\"\");\n        var file = fObj.Obj;\n        var mammothOptions = {\n            styleMap: docxSet.styleMap,\n            includeEmbeddedStyleMap: docxSet.includeEmbeddedStyleMap,\n            includeDefaultStyleMap: docxSet.includeDefaultStyleMap,\n            convertImage: docxSet.convertImage,\n            ignoreEmptyParagraphs: docxSet.ignoreEmptyParagraphs,\n            idPrefix: docxSet.idPrefix,\n            isRtl: docxSet.isRtl\n        };\n        JSZipUtils.getBinaryContent(file, function (err, content) {\n            mammoth.convertToHtml({ arrayBuffer: content }, mammothOptions)\n                .then(displayResult)\n                .done();\n        });\n\n        function displayResult(result) {\n            var isRtl = mammothOptions.isRtl;\n            var rslt = result.value;\n            if (isRtl == \"auto\") {\n                var position = rslt.search(/[\\u0590-\\u05FF]/);\n                if (position >= 0) {\n                    $('#' + divId).attr(\"dir\", \"rtl\");\n                } else {\n                    $('#' + divId).attr(\"dir\", \"ltr\");\n                }\n            } else if (isRtl === true) {\n                $('#' + divId).attr(\"dir\", \"rtl\");\n            } else if (isRtl === false) {\n                $('#' + divId).attr(\"dir\", \"ltr\");\n            }\n            $('#' + divId).html(rslt);\n            if (result.messages != \"\") {\n                var messageHtml = result.messages.map(function (message) {\n                    return message.type + ': ' + message.message + \"\\n\";\n                }).join(\"\");\n\n                console.log(\"Docx viewer Messages: \\n\" + messageHtml + \"\\n\");\n            }\n\n        }\n        return true;\n    }\n    /////////////////////////////////////////////////doc//////////////////////////////////////////\n    function getDocContent(fObj, divId, docxSet) {\n\n        $(\"#\" + divId).html(\"\");\n        var file = fObj.Obj;\n\n        var ran5 = 10000 + Math.round(Math.floor() * 90000);\n        var subDiv = $('<div/>').attr({ class: 'doc_files', id: \"doc_file_\" + ran5, style: \"color:#9d9999;font-size:30pt\" });\n        $(\"#\" + divId).append(subDiv);\n        $(\"#doc_file_\" + ran5).html(\".doc file is not supported, convert it to .docx file\");\n        return\n    }\n    /////////////////////////////////////////////////pptx//////////////////////////////////////////\n    function getPptxContent(fObj, divId, pptxSet) {\n\n        $(\"#\" + divId).html(\"\");\n\n        //console.log(fObj,divId);\n        var file = fObj.Obj;\n        $(\"#\" + divId).pptxToHtml({\n            pptxFileUrl: file,\n            slidesScale: pptxSet.slidesScale, //Change Slides scale by percent\n            slideMode: pptxSet.slideMode, /** true,false*/\n            keyBoardShortCut: pptxSet.keyBoardShortCut,  /** true,false ,condition: slideMode: true XXXXX - need to remove - this is doublcated*/\n            mediaProcess: pptxSet.mediaProcess, /** true,false: if true then process video and audio files */\n            jsZipV2: pptxSet.jsZipV2,\n            slideModeConfig: {\n                first: pptxSet.slideModeConfig.first,\n                nav: pptxSet.slideModeConfig.nav, /** true,false : show or not nav buttons*/\n                navTxtColor: pptxSet.slideModeConfig.navTxtColor, /** color */\n                keyBoardShortCut: pptxSet.slideModeConfig.keyBoardShortCut, /** true,false ,condition: */\n                showSlideNum: pptxSet.slideModeConfig.showSlideNum, /** true,false */\n                showTotalSlideNum: pptxSet.slideModeConfig.showTotalSlideNum, /** true,false */\n                autoSlide: pptxSet.slideModeConfig.autoSlide, /** false or seconds , F8 to active ,keyBoardShortCut: true */\n                randomAutoSlide: pptxSet.slideModeConfig.randomAutoSlide, /** true,false ,autoSlide:true */\n                loop: pptxSet.slideModeConfig.loop,  /** true,false */\n                background: pptxSet.slideModeConfig.background, /** false or color*/\n                transition: pptxSet.slideModeConfig.transition, /** transition type: \"slid\",\"fade\",\"default\",\"random\" , to show transition efects :transitionTime > 0.5 */\n                transitionTime: pptxSet.slideModeConfig.transitionTime /** transition time between slides in seconds */\n            }\n        });\n        return true;\n    }\n    /////////////////////////////////////////////////ppt//////////////////////////////////////////\n    function getPptContent(fObj, divId, pptxSet) {\n\n        $(\"#\" + divId).html(\"\");\n        var file = fObj.Obj;\n\n        var ran5 = 10000 + Math.round(Math.floor() * 90000);\n        var subDiv = $('<div/>').attr({ class: 'ppt_files', id: \"ppt_file_\" + ran5, style: \"color:#9d9999;font-size:30pt\" });\n        $(\"#\" + divId).append(subDiv);\n        $(\"#ppt_file_\" + ran5).html(\".ppt file is not supported, convert it to .pptx file\");\n\n        return true;\n    }\n    /////////////////////////////////////////////////Sheet//////////////////////////////////////////\n    function getSheetContent(fObj, divId, sheetSet) {\n\n\n        if (jQuery.ui === undefined && sheetSet.jqueryui) {\n            console.log(\"You set jqueryui as true , but you not included jquery-ui.js and jquery-ui.css\");\n            sheetSet.jqueryui = false;\n        }\n        if (jQuery.ui && sheetSet.jqueryui) {\n            $(\".\" + divId + \"_clas\").tabs(\"destroy\");\n        }\n\n        var file = fObj.Obj;\n\n        var $container, availableWidth, availableHeight;\n\n        var hot, hot_ary = [];\n\n        $container = $(\"#\" + divId);\n        $container.addClass(divId + \"_clas\");\n        $container.addClass(\"wbSheets_clas\");\n\n        if (sheetSet.search) {\n            $(\"<div></div>\", {\n                id: \"wbSheets_search_warpper\"\n            }).appendTo('#' + divId);\n            $(\"<input/>\", {\n                id: \"wbSheets_search_field\",\n                type: \"text\",\n                placeholder: \"Search...\",\n                style: \"border-radius: 5px; width:20%;\"\n            }).appendTo('#' + divId + \" #wbSheets_search_warpper\");\n\n            $(\"<hr>\", {\n            }).appendTo('#' + divId);\n        }\n        //function process_wb(wb) {\n        //}\n        var url = file;\n\n        var req = new XMLHttpRequest();\n        req.open(\"GET\", url, true);\n        req.responseType = \"arraybuffer\";\n        req.onload = function (e) {\n            var data = new Uint8Array(req.response);\n            var wb = XLSX.read(data, { type: \"array\" });\n            var sheetNames = wb.SheetNames;\n            $container.append('<ul class=\"wbSheets_clas_ul\">');\n            var li_container = \"\";\n            sheetNames.forEach(function (sheetName, idx) {\n                var subDivId = 'wbSheets_' + idx;\n                var slcted = \"\";\n                if (!sheetSet.jqueryui && idx == 0) {\n                    slcted = \"selected\"\n                }\n                $(\"#\" + divId + \" ul\").append('<li class = \"' + slcted + '\"><a href=\"#' + subDivId + '\">' + sheetName + '</a></li>');\n            });\n            sheetNames.forEach(function (sheetName, idx) {\n                var subDivId = 'wbSheets_' + idx;\n                var json = XLSX.utils.sheet_to_json(wb.Sheets[sheetName], { header: 1 });\n                var dsply = \"\";\n                if (!sheetSet.jqueryui) {\n                    if (idx == 0) {\n                        dsply = \"display:block;\";\n                    } else {\n                        dsply = \"display:none;\";\n                    }\n                }\n                var subDiv = $('<div/>').attr({\n                    class: 'wbSheets',\n                    id: subDivId,\n                    style: dsply\n                });\n                $container.append(subDiv);\n                //availableWidth = Math.max(subDiv.width(),600);\n                //availableHeight = Math.max(subDiv.height(), 500);\n                availableWidth = $container.width() - 20;\n                availableHeight = $container.height() - ((sheetSet.search) ? 90 : 50);\n                /* add header row for table */\n                if (!json) json = [];\n                json.forEach(function (r) {\n                    //must \"...,{header:1}\"\n                    if (json[0].length < r.length) json[0].length = r.length;\n                });\n                //console.log(json)\n                var container = document.getElementById(subDivId);\n                hot = new Handsontable(container, {\n                    data: json,\n                    activeHeaderClassName: sheetSet.activeHeaderClassName,\n                    allowEmpty: sheetSet.allowEmpty,\n                    autoColumnSize: sheetSet.autoColumnSize,\n                    autoRowSize: sheetSet.autoRowSize,\n                    columns: sheetSet.columns,\n                    columnSorting: sheetSet.columnSorting,\n                    contextMenu: sheetSet.contextMenu,\n                    copyable: sheetSet.copyable,\n                    fixedColumnsLeft: sheetSet.fixedColumnsLeft,\n                    fixedRowsTop: sheetSet.fixedRowsTop,\n                    language: sheetSet.language,\n                    search: sheetSet.search,\n                    selectionMode: sheetSet.selectionMode,\n                    sortIndicator: sheetSet.sortIndicator,\n                    readOnly: sheetSet.readOnly,\n                    startRows: sheetSet.startRows,\n                    startCols: sheetSet.startCols,\n                    rowHeaders: sheetSet.rowHeaders,\n                    colHeaders: sheetSet.colHeaders,\n                    width: (!sheetSet.width) ? availableWidth : sheetSet.width,\n                    height: (!sheetSet.height) ? availableHeight : sheetSet.height\n                });\n                hot_ary.push(hot);\n            });\n\n            if (jQuery.ui && sheetSet.jqueryui) {\n                $(\".\" + divId + \"_clas\").tabs();\n            } else {\n                $(\".\" + divId + \"_clas li\").click(function (e) {\n                    e.preventDefault();\n                    $(\".\" + divId + \"_clas li\").removeClass(\"selected\");\n                    $(this).addClass(\"selected\");\n                    var hrf = $($(this)[0].firstChild).attr(\"href\").substr(1);\n                    $(\".\" + divId + \"_clas .wbSheets\").hide();\n                    $(\".\" + divId + \"_clas #\" + hrf).show();\n                });\n            }\n            if (sheetSet.search) {\n                var searchFiled = document.getElementById('wbSheets_search_field');\n                Handsontable.dom.addEvent(searchFiled, 'keyup', function (event) {\n                    var srch_txt = this.value;\n                    hot_ary.forEach(function (hot_val) {\n                        var search = hot_val.getPlugin('search');\n                        var queryResult = search.query(srch_txt);\n                        hot_val.render();\n                    })\n                });\n\n            }\n            //$(\".\"+divId+\"_clas\").tabs(\"refresh\");\n            /*\n            availableWidth = $container.width()-105;\n            availableHeight = $container.height()-70;\n           $(\".\"+divId+\"_clas .wbSheets .ht_master .wtHolder\").css({\n                width: availableWidth,\n                height:availableHeight\n           });\n           $(\".\"+divId+\"_clas .wbSheets .ht_master .wtHolder\").on(\"scroll\",function(){\n               \n                $(\".\"+divId+\"_clas .wbSheets .ht_master .wtHolder\").css({\n                    width: availableWidth,\n                    height:availableHeight\n                });\n           })\n           */\n        };\n        req.send();\n        return true;\n    }\n    /////////////////////////////////////////////////Images//////////////////////////////////////////\n    function getImgContent(fObj, divId, imgSet) {\n\n        $(\"#\" + divId).html(\"\");\n        var file = fObj.Obj;\n\n        var img_div = $(\"#\" + divId);\n        $(\"#\" + divId).verySimpleImageViewer({\n            imageSource: file,\n            frame: imgSet.frame,\n            maxZoom: imgSet.maxZoom,\n            zoomFactor: imgSet.zoomFactor,\n            mouse: imgSet.mouse,\n            keyboard: imgSet.keyboard,\n            toolbar: imgSet.toolbar,\n            rotateToolbar: imgSet.rotateToolbar\n        });\n        return true;\n    }\n    /////////////////////////////////////////////////Unknown file//////////////////////////////////////////\n    function unknownMsg(divId) {\n\n        $(\"#\" + divId).html(\"\");\n\n        var ran5 = 10000 + Math.round(Math.floor() * 90000);\n        var subDiv = $('<div/>').attr({ class: 'unknown_files', id: \"unknown_file_\" + ran5, style: \"color:#9d9999;font-size:30pt\" });\n        $(\"#\" + divId).append(subDiv);\n        $(\"#unknown_file_\" + ran5).html(\"The file is not supported!\");\n        return true;\n    }\n}(jQuery));"
  },
  {
    "path": "pages/include/pdf/debugger.js",
    "content": "/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'use strict';\n\nvar FontInspector = (function FontInspectorClosure() {\n  var fonts;\n  var active = false;\n  var fontAttribute = 'data-font-name';\n  function removeSelection() {\n    var divs = document.querySelectorAll('div[' + fontAttribute + ']');\n    for (var i = 0, ii = divs.length; i < ii; ++i) {\n      var div = divs[i];\n      div.className = '';\n    }\n  }\n  function resetSelection() {\n    var divs = document.querySelectorAll('div[' + fontAttribute + ']');\n    for (var i = 0, ii = divs.length; i < ii; ++i) {\n      var div = divs[i];\n      div.className = 'debuggerHideText';\n    }\n  }\n  function selectFont(fontName, show) {\n    var divs = document.querySelectorAll('div[' + fontAttribute + '=' +\n                                         fontName + ']');\n    for (var i = 0, ii = divs.length; i < ii; ++i) {\n      var div = divs[i];\n      div.className = show ? 'debuggerShowText' : 'debuggerHideText';\n    }\n  }\n  function textLayerClick(e) {\n    if (!e.target.dataset.fontName ||\n        e.target.tagName.toUpperCase() !== 'DIV') {\n      return;\n    }\n    var fontName = e.target.dataset.fontName;\n    var selects = document.getElementsByTagName('input');\n    for (var i = 0; i < selects.length; ++i) {\n      var select = selects[i];\n      if (select.dataset.fontName !== fontName) {\n        continue;\n      }\n      select.checked = !select.checked;\n      selectFont(fontName, select.checked);\n      select.scrollIntoView();\n    }\n  }\n  return {\n    // Properties/functions needed by PDFBug.\n    id: 'FontInspector',\n    name: 'Font Inspector',\n    panel: null,\n    manager: null,\n    init: function init(pdfjsLib) {\n      var panel = this.panel;\n      panel.setAttribute('style', 'padding: 5px;');\n      var tmp = document.createElement('button');\n      tmp.addEventListener('click', resetSelection);\n      tmp.textContent = 'Refresh';\n      panel.appendChild(tmp);\n\n      fonts = document.createElement('div');\n      panel.appendChild(fonts);\n    },\n    cleanup: function cleanup() {\n      fonts.textContent = '';\n    },\n    enabled: false,\n    get active() {\n      return active;\n    },\n    set active(value) {\n      active = value;\n      if (active) {\n        document.body.addEventListener('click', textLayerClick, true);\n        resetSelection();\n      } else {\n        document.body.removeEventListener('click', textLayerClick, true);\n        removeSelection();\n      }\n    },\n    // FontInspector specific functions.\n    fontAdded: function fontAdded(fontObj, url) {\n      function properties(obj, list) {\n        var moreInfo = document.createElement('table');\n        for (var i = 0; i < list.length; i++) {\n          var tr = document.createElement('tr');\n          var td1 = document.createElement('td');\n          td1.textContent = list[i];\n          tr.appendChild(td1);\n          var td2 = document.createElement('td');\n          td2.textContent = obj[list[i]].toString();\n          tr.appendChild(td2);\n          moreInfo.appendChild(tr);\n        }\n        return moreInfo;\n      }\n      var moreInfo = properties(fontObj, ['name', 'type']);\n      var fontName = fontObj.loadedName;\n      var font = document.createElement('div');\n      var name = document.createElement('span');\n      name.textContent = fontName;\n      var download = document.createElement('a');\n      if (url) {\n        url = /url\\(['\"]?([^\\)\"']+)/.exec(url);\n        download.href = url[1];\n      } else if (fontObj.data) {\n        url = URL.createObjectURL(new Blob([fontObj.data], {\n          type: fontObj.mimeType,\n        }));\n        download.href = url;\n      }\n      download.textContent = 'Download';\n      var logIt = document.createElement('a');\n      logIt.href = '';\n      logIt.textContent = 'Log';\n      logIt.addEventListener('click', function(event) {\n        event.preventDefault();\n        console.log(fontObj);\n      });\n      var select = document.createElement('input');\n      select.setAttribute('type', 'checkbox');\n      select.dataset.fontName = fontName;\n      select.addEventListener('click', (function(select, fontName) {\n        return (function() {\n           selectFont(fontName, select.checked);\n        });\n      })(select, fontName));\n      font.appendChild(select);\n      font.appendChild(name);\n      font.appendChild(document.createTextNode(' '));\n      font.appendChild(download);\n      font.appendChild(document.createTextNode(' '));\n      font.appendChild(logIt);\n      font.appendChild(moreInfo);\n      fonts.appendChild(font);\n      // Somewhat of a hack, should probably add a hook for when the text layer\n      // is done rendering.\n      setTimeout(() => {\n        if (this.active) {\n          resetSelection();\n        }\n      }, 2000);\n    },\n  };\n})();\n\nvar opMap;\n\n// Manages all the page steppers.\nvar StepperManager = (function StepperManagerClosure() {\n  var steppers = [];\n  var stepperDiv = null;\n  var stepperControls = null;\n  var stepperChooser = null;\n  var breakPoints = Object.create(null);\n  return {\n    // Properties/functions needed by PDFBug.\n    id: 'Stepper',\n    name: 'Stepper',\n    panel: null,\n    manager: null,\n    init: function init(pdfjsLib) {\n      var self = this;\n      this.panel.setAttribute('style', 'padding: 5px;');\n      stepperControls = document.createElement('div');\n      stepperChooser = document.createElement('select');\n      stepperChooser.addEventListener('change', function(event) {\n        self.selectStepper(this.value);\n      });\n      stepperControls.appendChild(stepperChooser);\n      stepperDiv = document.createElement('div');\n      this.panel.appendChild(stepperControls);\n      this.panel.appendChild(stepperDiv);\n      if (sessionStorage.getItem('pdfjsBreakPoints')) {\n        breakPoints = JSON.parse(sessionStorage.getItem('pdfjsBreakPoints'));\n      }\n\n      opMap = Object.create(null);\n      for (var key in pdfjsLib.OPS) {\n        opMap[pdfjsLib.OPS[key]] = key;\n      }\n    },\n    cleanup: function cleanup() {\n      stepperChooser.textContent = '';\n      stepperDiv.textContent = '';\n      steppers = [];\n    },\n    enabled: false,\n    active: false,\n    // Stepper specific functions.\n    create: function create(pageIndex) {\n      var debug = document.createElement('div');\n      debug.id = 'stepper' + pageIndex;\n      debug.setAttribute('hidden', true);\n      debug.className = 'stepper';\n      stepperDiv.appendChild(debug);\n      var b = document.createElement('option');\n      b.textContent = 'Page ' + (pageIndex + 1);\n      b.value = pageIndex;\n      stepperChooser.appendChild(b);\n      var initBreakPoints = breakPoints[pageIndex] || [];\n      var stepper = new Stepper(debug, pageIndex, initBreakPoints);\n      steppers.push(stepper);\n      if (steppers.length === 1) {\n        this.selectStepper(pageIndex, false);\n      }\n      return stepper;\n    },\n    selectStepper: function selectStepper(pageIndex, selectPanel) {\n      var i;\n      pageIndex = pageIndex | 0;\n      if (selectPanel) {\n        this.manager.selectPanel(this);\n      }\n      for (i = 0; i < steppers.length; ++i) {\n        var stepper = steppers[i];\n        if (stepper.pageIndex === pageIndex) {\n          stepper.panel.removeAttribute('hidden');\n        } else {\n          stepper.panel.setAttribute('hidden', true);\n        }\n      }\n      var options = stepperChooser.options;\n      for (i = 0; i < options.length; ++i) {\n        var option = options[i];\n        option.selected = (option.value | 0) === pageIndex;\n      }\n    },\n    saveBreakPoints: function saveBreakPoints(pageIndex, bps) {\n      breakPoints[pageIndex] = bps;\n      sessionStorage.setItem('pdfjsBreakPoints', JSON.stringify(breakPoints));\n    },\n  };\n})();\n\n// The stepper for each page's IRQueue.\nvar Stepper = (function StepperClosure() {\n  // Shorter way to create element and optionally set textContent.\n  function c(tag, textContent) {\n    var d = document.createElement(tag);\n    if (textContent) {\n      d.textContent = textContent;\n    }\n    return d;\n  }\n\n  function simplifyArgs(args) {\n    if (typeof args === 'string') {\n      var MAX_STRING_LENGTH = 75;\n      return args.length <= MAX_STRING_LENGTH ? args :\n        args.substr(0, MAX_STRING_LENGTH) + '...';\n    }\n    if (typeof args !== 'object' || args === null) {\n      return args;\n    }\n    if ('length' in args) { // array\n      var simpleArgs = [], i, ii;\n      var MAX_ITEMS = 10;\n      for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) {\n        simpleArgs.push(simplifyArgs(args[i]));\n      }\n      if (i < args.length) {\n        simpleArgs.push('...');\n      }\n      return simpleArgs;\n    }\n    var simpleObj = {};\n    for (var key in args) {\n      simpleObj[key] = simplifyArgs(args[key]);\n    }\n    return simpleObj;\n  }\n\n  function Stepper(panel, pageIndex, initialBreakPoints) {\n    this.panel = panel;\n    this.breakPoint = 0;\n    this.nextBreakPoint = null;\n    this.pageIndex = pageIndex;\n    this.breakPoints = initialBreakPoints;\n    this.currentIdx = -1;\n    this.operatorListIdx = 0;\n  }\n  Stepper.prototype = {\n    init: function init(operatorList) {\n      var panel = this.panel;\n      var content = c('div', 'c=continue, s=step');\n      var table = c('table');\n      content.appendChild(table);\n      table.cellSpacing = 0;\n      var headerRow = c('tr');\n      table.appendChild(headerRow);\n      headerRow.appendChild(c('th', 'Break'));\n      headerRow.appendChild(c('th', 'Idx'));\n      headerRow.appendChild(c('th', 'fn'));\n      headerRow.appendChild(c('th', 'args'));\n      panel.appendChild(content);\n      this.table = table;\n      this.updateOperatorList(operatorList);\n    },\n    updateOperatorList: function updateOperatorList(operatorList) {\n      var self = this;\n\n      function cboxOnClick() {\n        var x = +this.dataset.idx;\n        if (this.checked) {\n          self.breakPoints.push(x);\n        } else {\n          self.breakPoints.splice(self.breakPoints.indexOf(x), 1);\n        }\n        StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints);\n      }\n\n      var MAX_OPERATORS_COUNT = 15000;\n      if (this.operatorListIdx > MAX_OPERATORS_COUNT) {\n        return;\n      }\n\n      var chunk = document.createDocumentFragment();\n      var operatorsToDisplay = Math.min(MAX_OPERATORS_COUNT,\n                                        operatorList.fnArray.length);\n      for (var i = this.operatorListIdx; i < operatorsToDisplay; i++) {\n        var line = c('tr');\n        line.className = 'line';\n        line.dataset.idx = i;\n        chunk.appendChild(line);\n        var checked = this.breakPoints.indexOf(i) !== -1;\n        var args = operatorList.argsArray[i] || [];\n\n        var breakCell = c('td');\n        var cbox = c('input');\n        cbox.type = 'checkbox';\n        cbox.className = 'points';\n        cbox.checked = checked;\n        cbox.dataset.idx = i;\n        cbox.onclick = cboxOnClick;\n\n        breakCell.appendChild(cbox);\n        line.appendChild(breakCell);\n        line.appendChild(c('td', i.toString()));\n        var fn = opMap[operatorList.fnArray[i]];\n        var decArgs = args;\n        if (fn === 'showText') {\n          var glyphs = args[0];\n          var newArgs = [];\n          var str = [];\n          for (var j = 0; j < glyphs.length; j++) {\n            var glyph = glyphs[j];\n            if (typeof glyph === 'object' && glyph !== null) {\n              str.push(glyph.fontChar);\n            } else {\n              if (str.length > 0) {\n                newArgs.push(str.join(''));\n                str = [];\n              }\n              newArgs.push(glyph); // null or number\n            }\n          }\n          if (str.length > 0) {\n            newArgs.push(str.join(''));\n          }\n          decArgs = [newArgs];\n        }\n        line.appendChild(c('td', fn));\n        line.appendChild(c('td', JSON.stringify(simplifyArgs(decArgs))));\n      }\n      if (operatorsToDisplay < operatorList.fnArray.length) {\n        line = c('tr');\n        var lastCell = c('td', '...');\n        lastCell.colspan = 4;\n        chunk.appendChild(lastCell);\n      }\n      this.operatorListIdx = operatorList.fnArray.length;\n      this.table.appendChild(chunk);\n    },\n    getNextBreakPoint: function getNextBreakPoint() {\n      this.breakPoints.sort(function(a, b) {\n        return a - b;\n      });\n      for (var i = 0; i < this.breakPoints.length; i++) {\n        if (this.breakPoints[i] > this.currentIdx) {\n          return this.breakPoints[i];\n        }\n      }\n      return null;\n    },\n    breakIt: function breakIt(idx, callback) {\n      StepperManager.selectStepper(this.pageIndex, true);\n      var self = this;\n      var dom = document;\n      self.currentIdx = idx;\n      var listener = function(e) {\n        switch (e.keyCode) {\n          case 83: // step\n            dom.removeEventListener('keydown', listener);\n            self.nextBreakPoint = self.currentIdx + 1;\n            self.goTo(-1);\n            callback();\n            break;\n          case 67: // continue\n            dom.removeEventListener('keydown', listener);\n            var breakPoint = self.getNextBreakPoint();\n            self.nextBreakPoint = breakPoint;\n            self.goTo(-1);\n            callback();\n            break;\n        }\n      };\n      dom.addEventListener('keydown', listener);\n      self.goTo(idx);\n    },\n    goTo: function goTo(idx) {\n      var allRows = this.panel.getElementsByClassName('line');\n      for (var x = 0, xx = allRows.length; x < xx; ++x) {\n        var row = allRows[x];\n        if ((row.dataset.idx | 0) === idx) {\n          row.style.backgroundColor = 'rgb(251,250,207)';\n          row.scrollIntoView();\n        } else {\n          row.style.backgroundColor = null;\n        }\n      }\n    },\n  };\n  return Stepper;\n})();\n\nvar Stats = (function Stats() {\n  var stats = [];\n  function clear(node) {\n    while (node.hasChildNodes()) {\n      node.removeChild(node.lastChild);\n    }\n  }\n  function getStatIndex(pageNumber) {\n    for (var i = 0, ii = stats.length; i < ii; ++i) {\n      if (stats[i].pageNumber === pageNumber) {\n        return i;\n      }\n    }\n    return false;\n  }\n  return {\n    // Properties/functions needed by PDFBug.\n    id: 'Stats',\n    name: 'Stats',\n    panel: null,\n    manager: null,\n    init(pdfjsLib) {\n      this.panel.setAttribute('style', 'padding: 5px;');\n      pdfjsLib.PDFJS.enableStats = true;\n    },\n    enabled: false,\n    active: false,\n    // Stats specific functions.\n    add(pageNumber, stat) {\n      if (!stat) {\n        return;\n      }\n      var statsIndex = getStatIndex(pageNumber);\n      if (statsIndex !== false) {\n        var b = stats[statsIndex];\n        this.panel.removeChild(b.div);\n        stats.splice(statsIndex, 1);\n      }\n      var wrapper = document.createElement('div');\n      wrapper.className = 'stats';\n      var title = document.createElement('div');\n      title.className = 'title';\n      title.textContent = 'Page: ' + pageNumber;\n      var statsDiv = document.createElement('div');\n      statsDiv.textContent = stat.toString();\n      wrapper.appendChild(title);\n      wrapper.appendChild(statsDiv);\n      stats.push({ pageNumber, div: wrapper, });\n      stats.sort(function(a, b) {\n        return a.pageNumber - b.pageNumber;\n      });\n      clear(this.panel);\n      for (var i = 0, ii = stats.length; i < ii; ++i) {\n        this.panel.appendChild(stats[i].div);\n      }\n    },\n    cleanup() {\n      stats = [];\n      clear(this.panel);\n    },\n  };\n})();\n\n// Manages all the debugging tools.\nwindow.PDFBug = (function PDFBugClosure() {\n  var panelWidth = 300;\n  var buttons = [];\n  var activePanel = null;\n\n  return {\n    tools: [\n      FontInspector,\n      StepperManager,\n      Stats\n    ],\n    enable(ids) {\n      var all = false, tools = this.tools;\n      if (ids.length === 1 && ids[0] === 'all') {\n        all = true;\n      }\n      for (var i = 0; i < tools.length; ++i) {\n        var tool = tools[i];\n        if (all || ids.indexOf(tool.id) !== -1) {\n          tool.enabled = true;\n        }\n      }\n      if (!all) {\n        // Sort the tools by the order they are enabled.\n        tools.sort(function(a, b) {\n          var indexA = ids.indexOf(a.id);\n          indexA = indexA < 0 ? tools.length : indexA;\n          var indexB = ids.indexOf(b.id);\n          indexB = indexB < 0 ? tools.length : indexB;\n          return indexA - indexB;\n        });\n      }\n    },\n    init(pdfjsLib, container) {\n      /*\n       * Basic Layout:\n       * PDFBug\n       *  Controls\n       *  Panels\n       *    Panel\n       *    Panel\n       *    ...\n       */\n      var ui = document.createElement('div');\n      ui.id = 'PDFBug';\n\n      var controls = document.createElement('div');\n      controls.setAttribute('class', 'controls');\n      ui.appendChild(controls);\n\n      var panels = document.createElement('div');\n      panels.setAttribute('class', 'panels');\n      ui.appendChild(panels);\n\n      container.appendChild(ui);\n      container.style.right = panelWidth + 'px';\n\n      // Initialize all the debugging tools.\n      var tools = this.tools;\n      var self = this;\n      for (var i = 0; i < tools.length; ++i) {\n        var tool = tools[i];\n        var panel = document.createElement('div');\n        var panelButton = document.createElement('button');\n        panelButton.textContent = tool.name;\n        panelButton.addEventListener('click', (function(selected) {\n          return function(event) {\n            event.preventDefault();\n            self.selectPanel(selected);\n          };\n        })(i));\n        controls.appendChild(panelButton);\n        panels.appendChild(panel);\n        tool.panel = panel;\n        tool.manager = this;\n        if (tool.enabled) {\n          tool.init(pdfjsLib);\n        } else {\n          panel.textContent = tool.name + ' is disabled. To enable add ' +\n                              ' \"' + tool.id + '\" to the pdfBug parameter ' +\n                              'and refresh (separate multiple by commas).';\n        }\n        buttons.push(panelButton);\n      }\n      this.selectPanel(0);\n    },\n    cleanup() {\n      for (var i = 0, ii = this.tools.length; i < ii; i++) {\n        if (this.tools[i].enabled) {\n          this.tools[i].cleanup();\n        }\n      }\n    },\n    selectPanel(index) {\n      if (typeof index !== 'number') {\n        index = this.tools.indexOf(index);\n      }\n      if (index === activePanel) {\n        return;\n      }\n      activePanel = index;\n      var tools = this.tools;\n      for (var j = 0; j < tools.length; ++j) {\n        if (j === index) {\n          buttons[j].setAttribute('class', 'active');\n          tools[j].active = true;\n          tools[j].panel.removeAttribute('hidden');\n        } else {\n          buttons[j].setAttribute('class', '');\n          tools[j].active = false;\n          tools[j].panel.setAttribute('hidden', 'true');\n        }\n      }\n    },\n  };\n})();\n"
  },
  {
    "path": "pages/include/pdf/locale/ach/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pot buk mukato\nprevious_label=Mukato\nnext.title=Pot buk malubo\nnext_label=Malubo\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pot buk\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=pi {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} me {{pagesCount}})\n\nzoom_out.title=Jwik Matidi\nzoom_out_label=Jwik Matidi\nzoom_in.title=Kwot Madit\nzoom_in_label=Kwot Madit\nzoom.title=Kwoti\npresentation_mode.title=Lokke i kit me tyer\npresentation_mode_label=Kit me tyer\nopen_file.title=Yab Pwail\nopen_file_label=Yab\nprint.title=Go\nprint_label=Go\ndownload.title=Gam\ndownload_label=Gam\nbookmark.title=Neno ma kombedi (lok onyo yab i dirica manyen)\nbookmark_label=Neno ma kombedi\n\n# Secondary toolbar and context menu\ntools.title=Gintic\ntools_label=Gintic\nfirst_page.title=Cit i pot buk mukwongo\nfirst_page.label=Cit i pot buk mukwongo\nfirst_page_label=Cit i pot buk mukwongo\nlast_page.title=Cit i pot buk magiko\nlast_page.label=Cit i pot buk magiko\nlast_page_label=Cit i pot buk magiko\npage_rotate_cw.title=Wire i tung lacuc\npage_rotate_cw.label=Wire i tung lacuc\npage_rotate_cw_label=Wire i tung lacuc\npage_rotate_ccw.title=Wire i tung lacam\npage_rotate_ccw.label=Wire i tung lacam\npage_rotate_ccw_label=Wire i tung lacam\n\ncursor_hand_tool.title=Cak gitic me cing\n\n# Document properties dialog box\ndocument_properties.title=Jami me gin acoya…\ndocument_properties_label=Jami me gin acoya…\ndocument_properties_file_name=Nying pwail:\ndocument_properties_file_size=Dit pa pwail:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Wiye:\ndocument_properties_author=Ngat mucoyo:\ndocument_properties_subject=Subjek:\ndocument_properties_keywords=Lok mapire tek:\ndocument_properties_creation_date=Nino dwe me cwec:\ndocument_properties_modification_date=Nino dwe me yub:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Lacwec:\ndocument_properties_producer=Layub PDF:\ndocument_properties_version=Kit PDF:\ndocument_properties_page_count=Kwan me pot buk:\ndocument_properties_close=Lor\n\nprint_progress_message=Yubo coc me agoya…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Juki\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Lok gintic ma inget\ntoggle_sidebar_label=Lok gintic ma inget\ndocument_outline_label=Pek pa gin acoya\nattachments.title=Nyut twec\nattachments_label=Twec\nthumbs.title=Nyut cal\nthumbs_label=Cal\nfindbar.title=Nong iye gin acoya\nfindbar_label=Nong\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pot buk {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Cal me pot buk {{page}}\n\n# Find panel button title and messages\nfind_input.title=Nong\nfind_input.placeholder=Nong i dokumen…\nfind_previous.title=Nong timme pa lok mukato\nfind_previous_label=Mukato\nfind_next.title=Nong timme pa lok malubo\nfind_next_label=Malubo\nfind_highlight=Wer weng\nfind_match_case_label=Lok marwate\nfind_reached_top=Oo iwi gin acoya, omede ki i tere\nfind_reached_bottom=Oo i agiki me gin acoya, omede ki iwiye\nfind_not_found=Lok pe ononge\n\n# Error panel labels\nerror_more_info=Ngec Mukene\nerror_less_info=Ngec Manok\nerror_close=Lor\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Kwena: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Can kikore {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Pwail: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rek: {{line}}\nrendering_error=Bal otime i kare me nyuto pot buk.\n\n# Predefined zoom values\npage_scale_width=Lac me iye pot buk\npage_scale_fit=Porre me pot buk\npage_scale_auto=Kwot pire kene\npage_scale_actual=Dite kikome\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Bal\nloading_error=Bal otime kun cano PDF.\ninvalid_file_error=Pwail me PDF ma pe atir onyo obale woko.\nmissing_file_error=Pwail me PDF tye ka rem.\nunexpected_response_error=Lagam mape kigeno pa lapok tic.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Lok angea manok]\npassword_label=Ket mung me donyo me yabo pwail me PDF man.\npassword_invalid=Mung me donyo pe atir. Tim ber i tem doki.\npassword_ok=OK\npassword_cancel=Juki\n\nprinting_not_supported=Ciko: Layeny ma pe teno goyo liweng.\nprinting_not_ready=Ciko: PDF pe ocane weng me agoya.\nweb_fonts_disabled=Kijuko dit pa coc me kakube woko: pe romo tic ki dit pa coc me PDF ma kiketo i kine.\ndocument_colors_not_allowed=Pe ki yee ki gin acoya me PDF me tic ki rangi gi kengi: Kijuko woko “Yee pot buk me yero rangi mamegi kengi” ki i layeny.\n"
  },
  {
    "path": "pages/include/pdf/locale/af/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Vorige bladsy\nprevious_label=Vorige\nnext.title=Volgende bladsy\nnext_label=Volgende\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Bladsy\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=van {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} van {{pagesCount}})\n\nzoom_out.title=Zoem uit\nzoom_out_label=Zoem uit\nzoom_in.title=Zoem in\nzoom_in_label=Zoem in\nzoom.title=Zoem\npresentation_mode.title=Wissel na voorleggingsmodus\npresentation_mode_label=Voorleggingsmodus\nopen_file.title=Open lêer\nopen_file_label=Open\nprint.title=Druk\nprint_label=Druk\ndownload.title=Laai af\ndownload_label=Laai af\nbookmark.title=Huidige aansig (kopieer of open in nuwe venster)\nbookmark_label=Huidige aansig\n\n# Secondary toolbar and context menu\ntools.title=Nutsgoed\ntools_label=Nutsgoed\nfirst_page.title=Gaan na eerste bladsy\nfirst_page.label=Gaan na eerste bladsy\nfirst_page_label=Gaan na eerste bladsy\nlast_page.title=Gaan na laaste bladsy\nlast_page.label=Gaan na laaste bladsy\nlast_page_label=Gaan na laaste bladsy\npage_rotate_cw.title=Roteer kloksgewys\npage_rotate_cw.label=Roteer kloksgewys\npage_rotate_cw_label=Roteer kloksgewys\npage_rotate_ccw.title=Roteer anti-kloksgewys\npage_rotate_ccw.label=Roteer anti-kloksgewys\npage_rotate_ccw_label=Roteer anti-kloksgewys\n\ncursor_text_select_tool.title=Aktiveer gereedskap om teks te merk\ncursor_text_select_tool_label=Teksmerkgereedskap\ncursor_hand_tool.title=Aktiveer handjie\ncursor_hand_tool_label=Handjie\n\n# Document properties dialog box\ndocument_properties.title=Dokumenteienskappe…\ndocument_properties_label=Dokumenteienskappe…\ndocument_properties_file_name=Lêernaam:\ndocument_properties_file_size=Lêergrootte:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kG ({{size_b}} grepe)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MG ({{size_b}} grepe)\ndocument_properties_title=Titel:\ndocument_properties_author=Outeur:\ndocument_properties_subject=Onderwerp:\ndocument_properties_keywords=Sleutelwoorde:\ndocument_properties_creation_date=Skeppingsdatum:\ndocument_properties_modification_date=Wysigingsdatum:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Skepper:\ndocument_properties_producer=PDF-vervaardiger:\ndocument_properties_version=PDF-weergawe:\ndocument_properties_page_count=Aantal bladsye:\ndocument_properties_close=Sluit\n\nprint_progress_message=Berei tans dokument voor om te druk…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Kanselleer\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Sypaneel aan/af\ntoggle_sidebar_notification.title=Sypaneel aan/af (dokument bevat skema/aanhegsels)\ntoggle_sidebar_label=Sypaneel aan/af\ndocument_outline.title=Wys dokumentskema (dubbelklik om alle items oop/toe te vou)\ndocument_outline_label=Dokumentoorsig\nattachments.title=Wys aanhegsels\nattachments_label=Aanhegsels\nthumbs.title=Wys duimnaels\nthumbs_label=Duimnaels\nfindbar.title=Soek in dokument\nfindbar_label=Vind\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Bladsy {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Duimnael van bladsy {{page}}\n\n# Find panel button title and messages\nfind_input.title=Vind\nfind_input.placeholder=Soek in dokument…\nfind_previous.title=Vind die vorige voorkoms van die frase\nfind_previous_label=Vorige\nfind_next.title=Vind die volgende voorkoms van die frase\nfind_next_label=Volgende\nfind_highlight=Verlig almal\nfind_match_case_label=Kassensitief\nfind_reached_top=Bokant van dokument is bereik; gaan voort van onder af\nfind_reached_bottom=Einde van dokument is bereik; gaan voort van bo af\nfind_not_found=Frase nie gevind nie\n\n# Error panel labels\nerror_more_info=Meer inligting\nerror_less_info=Minder inligting\nerror_close=Sluit\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (ID: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Boodskap: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stapel: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Lêer: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Lyn: {{line}}\nrendering_error='n Fout het voorgekom toe die bladsy weergegee is.\n\n# Predefined zoom values\npage_scale_width=Bladsywydte\npage_scale_fit=Pas bladsy\npage_scale_auto=Outomatiese zoem\npage_scale_actual=Werklike grootte\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Fout\nloading_error='n Fout het voorgekom met die laai van die PDF.\ninvalid_file_error=Ongeldige of korrupte PDF-lêer.\nmissing_file_error=PDF-lêer is weg.\nunexpected_response_error=Onverwagse antwoord van bediener.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-annotasie]\npassword_label=Gee die wagwoord om dié PDF-lêer mee te open.\npassword_invalid=Ongeldige wagwoord. Probeer gerus weer.\npassword_ok=OK\npassword_cancel=Kanselleer\n\nprinting_not_supported=Waarskuwing: Dié blaaier ondersteun nie drukwerk ten volle nie.\nprinting_not_ready=Waarskuwing: Die PDF is nog nie volledig gelaai vir drukwerk nie.\nweb_fonts_disabled=Webfonte is gedeaktiveer: kan nie PDF-fonte wat ingebed is, gebruik nie.\ndocument_colors_not_allowed=PDF-dokumente word nie toegelaat om hul eie kleure te gebruik nie: “Laat bladsye toe om hul eie kleure te kies” is gedeaktiveer in die blaaier.\n"
  },
  {
    "path": "pages/include/pdf/locale/ak/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Krataafa baako a etwa mu\nprevious_label=Ekyiri-baako\nnext.title=Krataafa a edi so baako\nnext_label=Dea-ɛ-di-so-baako\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Zuum pue\nzoom_out_label=Zuum ba abɔnten\nzoom_in.title=Zuum kɔ mu\nzoom_in_label=Zuum kɔ mu\nzoom.title=Zuum\npresentation_mode.title=Sesa kɔ Yɛkyerɛ Tebea mu\npresentation_mode_label=Yɛkyerɛ Tebea\nopen_file.title=Bue Fael\nopen_file_label=Bue\nprint.title=Prente\nprint_label=Prente\ndownload.title=Twe\ndownload_label=Twe\nbookmark.title=Seisei nhwɛ (fa anaaso bue wɔ tokuro foforo mu)\nbookmark_label=Seisei nhwɛ\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Ti asɛm:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Sɔ anaaso dum saedbaa\ntoggle_sidebar_label=Sɔ anaaso dum saedbaa\ndocument_outline_label=Dɔkomɛnt bɔbea\nthumbs.title=Kyerɛ mfoniwaa\nthumbs_label=Mfoniwaa\nfindbar.title=Hu wɔ dɔkomɛnt no mu\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Krataafa {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Krataafa ne mfoniwaa {{page}}\n\n# Find panel button title and messages\nfind_previous.title=San hu fres wɔ ekyiri baako\nfind_previous_label=Ekyiri baako\nfind_next.title=San hu fres no wɔ enim baako\nfind_next_label=Ndiso\nfind_highlight=Hyɛ bibiara nso\nfind_match_case_label=Fa susu kaase\nfind_reached_top=Edu krataafa ne soro, atoa so efiri ase\nfind_reached_bottom=Edu krataafa n'ewiei, atoa so efiri soro\nfind_not_found=Ennhu fres\n\n# Error panel labels\nerror_more_info=Infɔmehyɛn bio a wɔka ho\nerror_less_info=Te infɔmehyɛn bio a wɔka ho so\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{vɛɛhyen}} (nsi: {{si}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Nkrato: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Staake: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fael: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Laen: {{line}}\nrendering_error=Mfomso bae wɔ bere a wɔ rekyerɛ krataafa no.\n\n# Predefined zoom values\npage_scale_width=Krataafa tɛtrɛtɛ\npage_scale_fit=Krataafa ehimtwa\npage_scale_auto=Zuum otomatik\npage_scale_actual=Kɛseyɛ ankasa\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Mfomso\nloading_error=Mfomso bae wɔ bere a wɔreloode PDF no.\ninvalid_file_error=PDF fael no nndi mu anaaso ho atɔ kyima.\nmissing_file_error=PDF fael no ayera.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Tɛkst-nyiano]\npassword_ok=OK\n\nprinting_not_supported=Kɔkɔbɔ: Brawsa yi nnhyɛ daa mma prent ho kwan.\nprinting_not_ready=Kɔkɔbɔ: Wɔnntwee PDF fael no nyinara mmbaee ama wo ɛ tumi aprente.\nweb_fonts_disabled=Ɔedum wɛb-mfɔnt: nntumi mmfa PDF mfɔnt a wɔhyɛ mu nndi dwuma.\ndocument_colors_not_allowed=Wɔmma ho kwan sɛ PDF adɔkomɛnt de wɔn ara wɔn ahosu bɛdi dwuma: wɔ adum 'Ma ho kwan ma nkrataafa mpaw wɔn ara wɔn ahosu' wɔ brawsa yi mu.\n"
  },
  {
    "path": "pages/include/pdf/locale/an/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pachina anterior\nprevious_label=Anterior\nnext.title=Pachina siguient\nnext_label=Siguient\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pachina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Achiquir\nzoom_out_label=Achiquir\nzoom_in.title=Agrandir\nzoom_in_label=Agrandir\nzoom.title=Grandaria\npresentation_mode.title=Cambear t'o modo de presentación\npresentation_mode_label=Modo de presentación\nopen_file.title=Ubrir o fichero\nopen_file_label=Ubrir\nprint.title=Imprentar\nprint_label=Imprentar\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar u ubrir en una nueva finestra)\nbookmark_label=Anvista actual\n\n# Secondary toolbar and context menu\ntools.title=Ferramientas\ntools_label=Ferramientas\nfirst_page.title=Ir ta la primer pachina\nfirst_page.label=Ir ta la primer pachina\nfirst_page_label=Ir ta la primer pachina\nlast_page.title=Ir ta la zaguer pachina\nlast_page.label=Ir ta la zaguera pachina\nlast_page_label=Ir ta la zaguer pachina\npage_rotate_cw.title=Chirar enta la dreita\npage_rotate_cw.label=Chirar enta la dreita\npage_rotate_cw_label=Chira enta la dreita\npage_rotate_ccw.title=Chirar enta la zurda\npage_rotate_ccw.label=Chirar en sentiu antihorario\npage_rotate_ccw_label=Chirar enta la zurda\n\n\n# Document properties dialog box\ndocument_properties.title=Propiedatz d'o documento...\ndocument_properties_label=Propiedatz d'o documento...\ndocument_properties_file_name=Nombre de fichero:\ndocument_properties_file_size=Grandaria d'o fichero:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titol:\ndocument_properties_author=Autor:\ndocument_properties_subject=Afer:\ndocument_properties_keywords=Parolas clau:\ndocument_properties_creation_date=Calendata de creyación:\ndocument_properties_modification_date=Calendata de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creyador:\ndocument_properties_producer=Creyador de PDF:\ndocument_properties_version=Versión de PDF:\ndocument_properties_page_count=Numero de pachinas:\ndocument_properties_close=Zarrar\n\nprint_progress_message=Se ye preparando la documentación pa imprentar…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Amostrar u amagar a barra lateral\ntoggle_sidebar_notification.title=Cambiar barra lateral (lo documento contiene esquema/adchuntos)\ntoggle_sidebar_label=Amostrar a barra lateral\ndocument_outline.title=Amostrar esquema d'o documento (fer doble clic pa expandir/compactar totz los items)\ndocument_outline_label=Esquema d'o documento\nattachments.title=Amostrar os adchuntos\nattachments_label=Adchuntos\nthumbs.title=Amostrar as miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Trobar en o documento\nfindbar_label=Trobar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pachina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura d'a pachina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Trobar\nfind_input.placeholder=Trobar en o documento…\nfind_previous.title=Trobar l'anterior coincidencia d'a frase\nfind_previous_label=Anterior\nfind_next.title=Trobar a siguient coincidencia d'a frase\nfind_next_label=Siguient\nfind_highlight=Resaltar-lo tot\nfind_match_case_label=Coincidencia de mayusclas/minusclas\nfind_reached_top=S'ha plegau a l'inicio d'o documento, se contina dende baixo\nfind_reached_bottom=S'ha plegau a la fin d'o documento, se contina dende alto\nfind_not_found=No s'ha trobau a frase\n\n# Error panel labels\nerror_more_info=Mas información\nerror_less_info=Menos información\nerror_close=Zarrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensache: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fichero: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linia: {{line}}\nrendering_error=Ha ocurriu una error en renderizar a pachina.\n\n# Predefined zoom values\npage_scale_width=Amplaria d'a pachina\npage_scale_fit=Achuste d'a pachina\npage_scale_auto=Grandaria automatica\npage_scale_actual=Grandaria actual\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=S'ha produciu una error en cargar o PDF.\ninvalid_file_error=O PDF no ye valido u ye estorbau.\nmissing_file_error=No i ha fichero PDF.\nunexpected_response_error=Respuesta a lo servicio inasperada.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotación {{type}}]\npassword_label=Introduzca a clau ta ubrir iste fichero PDF.\npassword_invalid=Clau invalida. Torna a intentar-lo.\npassword_ok=Acceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Pare cuenta: Iste navegador no maneya totalment as impresions.\nprinting_not_ready=Aviso: Encara no se ha cargau completament o PDF ta imprentar-lo.\nweb_fonts_disabled=As fuents web son desactivadas: no se puet incrustar fichers PDF.\ndocument_colors_not_allowed=Los documentos PDF no pueden fer servir las suyas propias colors: 'Permitir que as pachinas triguen as suyas propias colors' ye desactivau en o navegador.\n"
  },
  {
    "path": "pages/include/pdf/locale/ar/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=الصفحة السابقة\nprevious_label=السابقة\nnext.title=الصفحة التالية\nnext_label=التالية\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=صفحة\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=من {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} من {{pagesCount}})\n\nzoom_out.title=بعّد\nzoom_out_label=بعّد\nzoom_in.title=قرّب\nzoom_in_label=قرّب\nzoom.title=التقريب\npresentation_mode.title=انتقل لوضع العرض التقديمي\npresentation_mode_label=وضع العرض التقديمي\nopen_file.title=افتح ملفًا\nopen_file_label=افتح\nprint.title=اطبع\nprint_label=اطبع\ndownload.title=نزّل\ndownload_label=نزّل\nbookmark.title=المنظور الحالي (انسخ أو افتح في نافذة جديدة)\nbookmark_label=المنظور الحالي\n\n# Secondary toolbar and context menu\ntools.title=الأدوات\ntools_label=الأدوات\nfirst_page.title=اذهب إلى الصفحة الأولى\nfirst_page.label=اذهب إلى الصفحة الأولى\nfirst_page_label=اذهب إلى الصفحة الأولى\nlast_page.title=اذهب إلى الصفحة الأخيرة\nlast_page.label=اذهب إلى الصفحة الأخيرة\nlast_page_label=اذهب إلى الصفحة الأخيرة\npage_rotate_cw.title=أدر باتجاه عقارب الساعة\npage_rotate_cw.label=أدر باتجاه عقارب الساعة\npage_rotate_cw_label=أدر باتجاه عقارب الساعة\npage_rotate_ccw.title=أدر بعكس اتجاه عقارب الساعة\npage_rotate_ccw.label=أدر بعكس اتجاه عقارب الساعة\npage_rotate_ccw_label=أدر بعكس اتجاه عقارب الساعة\n\ncursor_text_select_tool.title=فعّل أداة اختيار النص\ncursor_text_select_tool_label=أداة اختيار النص\ncursor_hand_tool.title=فعّل أداة اليد\ncursor_hand_tool_label=أداة اليد\n\n# Document properties dialog box\ndocument_properties.title=خصائص المستند…\ndocument_properties_label=خصائص المستند…\ndocument_properties_file_name=اسم الملف:\ndocument_properties_file_size=حجم الملف:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} ك.بايت ({{size_b}} بايت)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} م.بايت ({{size_b}} بايت)\ndocument_properties_title=العنوان:\ndocument_properties_author=المؤلف:\ndocument_properties_subject=الموضوع:\ndocument_properties_keywords=الكلمات الأساسية:\ndocument_properties_creation_date=تاريخ الإنشاء:\ndocument_properties_modification_date=تاريخ التعديل:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}، {{time}}\ndocument_properties_creator=المنشئ:\ndocument_properties_producer=منتج PDF:\ndocument_properties_version=إصدارة PDF:\ndocument_properties_page_count=عدد الصفحات:\ndocument_properties_close=أغلق\n\nprint_progress_message=يُحضّر المستند للطباعة…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}٪\nprint_progress_close=ألغِ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=بدّل ظهور الشريط الجانبي\ntoggle_sidebar_notification.title=بدّل ظهور الشريط الجانبي (يحتوي المستند على مخطط أو مرفقات)\ntoggle_sidebar_label=بدّل ظهور الشريط الجانبي\ndocument_outline.title=اعرض فهرس المستند (نقر مزدوج لتمديد أو تقليص كل العناصر)\ndocument_outline_label=مخطط المستند\nattachments.title=اعرض المرفقات\nattachments_label=المُرفقات\nthumbs.title=اعرض مُصغرات\nthumbs_label=مُصغّرات\nfindbar.title=ابحث في المستند\nfindbar_label=ابحث\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=صفحة {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=مصغّرة صفحة {{page}}\n\n# Find panel button title and messages\nfind_input.title=ابحث\nfind_input.placeholder=ابحث في المستند…\nfind_previous.title=ابحث عن التّواجد السّابق للعبارة\nfind_previous_label=السابق\nfind_next.title=ابحث عن التّواجد التّالي للعبارة\nfind_next_label=التالي\nfind_highlight=أبرِز الكل\nfind_match_case_label=طابق حالة الأحرف\nfind_reached_top=تابعت من الأسفل بعدما وصلت إلى بداية المستند\nfind_reached_bottom=تابعت من الأعلى بعدما وصلت إلى نهاية المستند\nfind_not_found=لا وجود للعبارة\n\n# Error panel labels\nerror_more_info=معلومات أكثر\nerror_less_info=معلومات أقل\nerror_close=أغلق\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=‏PDF.js ن{{version}} ‏(بناء: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=الرسالة: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=الرصّة: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=الملف: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=السطر: {{line}}\nrendering_error=حدث خطأ أثناء عرض الصفحة.\n\n# Predefined zoom values\npage_scale_width=عرض الصفحة\npage_scale_fit=ملائمة الصفحة\npage_scale_auto=تقريب تلقائي\npage_scale_actual=الحجم الحقيقي\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}٪\n\n# Loading indicator messages\nloading_error_indicator=عطل\nloading_error=حدث عطل أثناء تحميل ملف PDF.\ninvalid_file_error=ملف PDF تالف أو غير صحيح.\nmissing_file_error=ملف PDF غير موجود.\nunexpected_response_error=استجابة خادوم غير متوقعة.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[تعليق {{type}}]\npassword_label=أدخل لكلمة السر لفتح هذا الملف.\npassword_invalid=كلمة سر خطأ. من فضلك أعد المحاولة.\npassword_ok=حسنا\npassword_cancel=ألغِ\n\nprinting_not_supported=تحذير: لا يدعم هذا المتصفح الطباعة بشكل كامل.\nprinting_not_ready=تحذير: ملف PDF لم يُحمّل كاملًا للطباعة.\nweb_fonts_disabled=خطوط الوب مُعطّلة: تعذّر استخدام خطوط PDF المُضمّنة.\ndocument_colors_not_allowed=ليس مسموحًا لملفات PDF باستخدام ألوانها الخاصة: خيار ”اسمح للصفحات باختيار ألوانها الخاصة“ ليس مُفعّلًا في المتصفح.\n"
  },
  {
    "path": "pages/include/pdf/locale/as/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=পূৰ্বৱৰ্তী পৃষ্ঠা\nprevious_label=পূৰ্বৱৰ্তী\nnext.title=পৰৱৰ্তী পৃষ্ঠা\nnext_label=পৰৱৰ্তী\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=জুম আউট\nzoom_out_label=জুম আউট\nzoom_in.title=জুম ইন\nzoom_in_label=জুম ইন\nzoom.title=জুম কৰক\npresentation_mode.title=উপস্থাপন অৱস্থালে যাওক\npresentation_mode_label=উপস্থাপন অৱস্থা\nopen_file.title=ফাইল খোলক\nopen_file_label=খোলক\nprint.title=প্ৰিন্ট কৰক\nprint_label=প্ৰিন্ট কৰক\ndownload.title=ডাউনল'ড কৰক\ndownload_label=ডাউনল'ড কৰক\nbookmark.title=বৰ্তমান দৃশ্য (কপি কৰক অথবা নতুন উইন্ডোত খোলক)\nbookmark_label=বৰ্তমান দৃশ্য\n\n# Secondary toolbar and context menu\ntools.title=সঁজুলিসমূহ\ntools_label=সঁজুলিসমূহ\nfirst_page.title=প্ৰথম পৃষ্ঠাত যাওক\nfirst_page.label=প্ৰথম পৃষ্ঠাত যাওক\nfirst_page_label=প্ৰথম পৃষ্ঠাত যাওক\nlast_page.title=সৰ্বশেষ পৃষ্ঠাত যাওক\nlast_page.label=সৰ্বশেষ পৃষ্ঠাত যাওক\nlast_page_label=সৰ্বশেষ পৃষ্ঠাত যাওক\npage_rotate_cw.title=ঘড়ীৰ দিশত ঘুৰাওক\npage_rotate_cw.label=ঘড়ীৰ দিশত ঘুৰাওক\npage_rotate_cw_label=ঘড়ীৰ দিশত ঘুৰাওক\npage_rotate_ccw.title=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক\npage_rotate_ccw.label=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক\npage_rotate_ccw_label=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক\n\n\n# Document properties dialog box\ndocument_properties.title=দস্তাবেজৰ বৈশিষ্ট্যসমূহ…\ndocument_properties_label=দস্তাবেজৰ বৈশিষ্ট্যসমূহ…\ndocument_properties_file_name=ফাইল নাম:\ndocument_properties_file_size=ফাইলৰ আকাৰ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=শীৰ্ষক:\ndocument_properties_author=লেখক:\ndocument_properties_subject=বিষয়:\ndocument_properties_keywords=কিৱাৰ্ডসমূহ:\ndocument_properties_creation_date=সৃষ্টিৰ তাৰিখ:\ndocument_properties_modification_date=পৰিবৰ্তনৰ তাৰিখ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=সৃষ্টিকৰ্তা:\ndocument_properties_producer=PDF উৎপাদক:\ndocument_properties_version=PDF সংস্কৰণ:\ndocument_properties_page_count=পৃষ্ঠাৰ গণনা:\ndocument_properties_close=বন্ধ কৰক\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=কাষবাৰ টগল কৰক\ntoggle_sidebar_label=কাষবাৰ টগল কৰক\ndocument_outline_label=দস্তাবেজ আউটলাইন\nattachments.title=এটাচমেন্টসমূহ দেখুৱাওক\nattachments_label=এটাচমেন্টসমূহ\nthumbs.title=থাম্বনেইলসমূহ দেখুৱাওক\nthumbs_label=থাম্বনেইলসমূহ\nfindbar.title=দস্তাবেজত সন্ধান কৰক\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=পৃষ্ঠা {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=পৃষ্ঠাৰ থাম্বনেইল {{page}}\n\n# Find panel button title and messages\nfind_previous.title=বাক্যাংশৰ পূৰ্বৱৰ্তী উপস্থিতি সন্ধান কৰক\nfind_previous_label=পূৰ্বৱৰ্তী\nfind_next.title=বাক্যাংশৰ পৰৱৰ্তী উপস্থিতি সন্ধান কৰক\nfind_next_label=পৰৱৰ্তী\nfind_highlight=সকলো উজ্জ্বল কৰক\nfind_match_case_label=ফলা মিলাওক\nfind_reached_top=তলৰ পৰা আৰম্ভ কৰি, দস্তাবেজৰ ওপৰলৈ অহা হৈছে\nfind_reached_bottom=ওপৰৰ পৰা আৰম্ভ কৰি, দস্তাবেজৰ তললৈ অহা হৈছে\nfind_not_found=বাক্যাংশ পোৱা নগল\n\n# Error panel labels\nerror_more_info=অধিক তথ্য\nerror_less_info=কম তথ্য\nerror_close=বন্ধ কৰক\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=বাৰ্তা: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=স্টেক: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ফাইল: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=শাৰী: {{line}}\nrendering_error=এই পৃষ্ঠা ৰেণ্ডাৰ কৰোতে এটা ত্ৰুটি দেখা দিলে।\n\n# Predefined zoom values\npage_scale_width=পৃষ্ঠাৰ প্ৰস্থ\npage_scale_fit=পৃষ্ঠা খাপ\npage_scale_auto=স্বচালিত জুম\npage_scale_actual=প্ৰকৃত আকাৰ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=ত্ৰুটি\nloading_error=PDF ল'ড কৰোতে এটা ত্ৰুটি দেখা দিলে।\ninvalid_file_error=অবৈধ অথবা ক্ষতিগ্ৰস্থ PDF file।\nmissing_file_error=সন্ধানহিন PDF ফাইল।\nunexpected_response_error=অপ্ৰত্যাশিত চাৰ্ভাৰ প্ৰতিক্ৰিয়া।\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} টোকা]\npassword_label=এই PDF ফাইল খোলিবলৈ পাছৱৰ্ড সুমুৱাওক।\npassword_invalid=অবৈধ পাছৱৰ্ড। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক।\npassword_ok=ঠিক আছে\n\nprinting_not_supported=সতৰ্কবাৰ্তা: প্ৰিন্টিং এই ব্ৰাউছাৰ দ্বাৰা সম্পূৰ্ণভাৱে সমৰ্থিত নহয়।\nprinting_not_ready=সতৰ্কবাৰ্তা: PDF প্ৰিন্টিংৰ বাবে সম্পূৰ্ণভাৱে ল'ডেড নহয়।\nweb_fonts_disabled=ৱেব ফন্টসমূহ অসামৰ্থবান কৰা আছে: অন্তৰ্ভুক্ত PDF ফন্টসমূহ ব্যৱহাৰ কৰিবলে অক্ষম।\ndocument_colors_not_allowed=PDF দস্তাবেজসমূহৰ সিহতৰ নিজস্ব ৰঙ ব্যৱহাৰ কৰাৰ অনুমতি নাই: ব্ৰাউছাৰত 'পৃষ্ঠাসমূহক সিহতৰ নিজস্ব ৰঙ নিৰ্বাচন কৰাৰ অনুমতি দিয়ক' অসামৰ্থবান কৰা আছে।\n"
  },
  {
    "path": "pages/include/pdf/locale/ast/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Páxina anterior\nprevious_label=Anterior\nnext.title=Páxina siguiente\nnext_label=Siguiente\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Páxina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Reducir\nzoom_out_label=Reducir\nzoom_in.title=Aumentar\nzoom_in_label=Aumentar\nzoom.title=Tamañu\npresentation_mode.title=\npresentation_mode_label=\nopen_file.title=Abrir ficheru\nopen_file_label=Abrir\nprint.title=Imprentar\nprint_label=Imprentar\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar o abrir nuna nueva ventana)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Ferramientes\ntools_label=Ferramientes\nfirst_page.title=Dir a la primer páxina\nfirst_page.label=Dir a la primer páxina\nfirst_page_label=Dir a la primer páxina\nlast_page.title=Dir a la postrer páxina\nlast_page.label=Dir a la cabera páxina\nlast_page_label=Dir a la postrer páxina\npage_rotate_cw.title=Xirar en sen horariu\npage_rotate_cw.label=\npage_rotate_cw_label=Xirar en sen horariu\npage_rotate_ccw.title=Xirar en sen antihorariu\npage_rotate_ccw.label=\npage_rotate_ccw_label=Xirar en sen antihorariu\n\n\n# Document properties dialog box\ndocument_properties.title=Propiedaes del documentu…\ndocument_properties_label=Propiedaes del documentu…\ndocument_properties_file_name=Nome de ficheru:\ndocument_properties_file_size=Tamañu de ficheru:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Títulu:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asuntu:\ndocument_properties_keywords=Pallabres clave:\ndocument_properties_creation_date=Data de creación:\ndocument_properties_modification_date=Data de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=Productor PDF:\ndocument_properties_version=Versión PDF:\ndocument_properties_page_count=Númberu de páxines:\ndocument_properties_close=Zarrar\n\nprint_progress_message=Tresnando documentu pa imprentar…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Encaboxar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Camudar barra llateral\ntoggle_sidebar_label=Camudar barra llateral\ndocument_outline.title=Amosar esquema del documentu (duble clic pa espander/contrayer tolos elementos)\ndocument_outline_label=Esquema del documentu\nattachments.title=Amosar axuntos\nattachments_label=Axuntos\nthumbs.title=Amosar miniatures\nthumbs_label=Miniatures\nfindbar.title=Guetar nel documentu\nfindbar_label=Guetar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Páxina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de la páxina {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Alcontrar l'anterior apaición de la fras\nfind_previous_label=Anterior\nfind_next.title=Alcontrar la siguiente apaición d'esta fras\nfind_next_label=Siguiente\nfind_highlight=Remarcar toos\nfind_match_case_label=Coincidencia de mayús./minús.\nfind_reached_top=Algamóse'l principiu del documentu, siguir dende'l final\nfind_reached_bottom=Algamóse'l final del documentu, siguir dende'l principiu\nfind_not_found=Frase non atopada\n\n# Error panel labels\nerror_more_info=Más información\nerror_less_info=Menos información\nerror_close=Zarrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaxe: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ficheru: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Llinia: {{line}}\nrendering_error=Hebo un fallu al renderizar la páxina.\n\n# Predefined zoom values\npage_scale_width=Anchor de la páxina\npage_scale_fit=Axuste de la páxina\npage_scale_auto=Tamañu automáticu\npage_scale_actual=Tamañu actual\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Fallu\nloading_error=Hebo un fallu al cargar el PDF.\ninvalid_file_error=Ficheru PDF inválidu o corruptu.\nmissing_file_error=Nun hai ficheru PDF.\nunexpected_response_error=Rempuesta inesperada del sirvidor.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotación {{type}}]\npassword_label=Introduz la contraseña p'abrir esti ficheru PDF\npassword_invalid=Contraseña non válida. Vuelvi a intentalo.\npassword_ok=Aceutar\npassword_cancel=Encaboxar\n\nprinting_not_supported=Alvertencia: La imprentación entá nun ta sofitada dafechu nesti restolador.\nprinting_not_ready=Avisu: Esti PDF nun se cargó completamente pa poder imprentase.\nweb_fonts_disabled=Les fontes web tán desactivaes: ye imposible usar les fontes PDF embebíes.\ndocument_colors_not_allowed=Los documentos PDF nun tienen permisu pa usar les sos colores: «Permitir que les páxines escueyan les sos colores» ta desactivao nel restolador.\n"
  },
  {
    "path": "pages/include/pdf/locale/az/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Əvvəlki səhifə\nprevious_label=Əvvəlkini tap\nnext.title=Növbəti səhifə\nnext_label=İrəli\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Səhifə\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=Uzaqlaş\nzoom_out_label=Uzaqlaş\nzoom_in.title=Yaxınlaş\nzoom_in_label=Yaxınlaş\nzoom.title=Yaxınlaşdırma\npresentation_mode.title=Təqdimat Rejiminə Keç\npresentation_mode_label=Təqdimat Rejimi\nopen_file.title=Fayl Aç\nopen_file_label=Aç\nprint.title=Yazdır\nprint_label=Yazdır\ndownload.title=Yüklə\ndownload_label=Yüklə\nbookmark.title=Hazırkı görünüş (köçür və ya yeni pəncərədə aç)\nbookmark_label=Hazırki görünüş\n\n# Secondary toolbar and context menu\ntools.title=Alətlər\ntools_label=Alətlər\nfirst_page.title=İlk Səhifəyə get\nfirst_page.label=İlk Səhifəyə get\nfirst_page_label=İlk Səhifəyə get\nlast_page.title=Son Səhifəyə get\nlast_page.label=Son Səhifəyə get\nlast_page_label=Son Səhifəyə get\npage_rotate_cw.title=Saat İstiqamətində Fırlat\npage_rotate_cw.label=Saat İstiqamətində Fırlat\npage_rotate_cw_label=Saat İstiqamətində Fırlat\npage_rotate_ccw.title=Saat İstiqamətinin Əksinə Fırlat\npage_rotate_ccw.label=Saat İstiqamətinin Əksinə Fırlat\npage_rotate_ccw_label=Saat İstiqamətinin Əksinə Fırlat\n\ncursor_text_select_tool.title=Yazı seçmə alətini aktivləşdir\ncursor_text_select_tool_label=Yazı seçmə aləti\ncursor_hand_tool.title=Əl alətini aktivləşdir\ncursor_hand_tool_label=Əl aləti\n\n# Document properties dialog box\ndocument_properties.title=Sənəd xüsusiyyətləri…\ndocument_properties_label=Sənəd xüsusiyyətləri…\ndocument_properties_file_name=Fayl adı:\ndocument_properties_file_size=Fayl ölçüsü:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bayt)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bayt)\ndocument_properties_title=Başlık:\ndocument_properties_author=Müəllif:\ndocument_properties_subject=Mövzu:\ndocument_properties_keywords=Açar sözlər:\ndocument_properties_creation_date=Yaradılış Tarixi :\ndocument_properties_modification_date=Dəyişdirilmə Tarixi :\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Yaradan:\ndocument_properties_producer=PDF yaradıcısı:\ndocument_properties_version=PDF versiyası:\ndocument_properties_page_count=Səhifə sayı:\ndocument_properties_close=Qapat\n\nprint_progress_message=Sənəd çap üçün hazırlanır…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Ləğv et\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Yan Paneli Aç/Bağla\ntoggle_sidebar_notification.title=Yan paneli çevir (sənəddə icmal/bağlama var)\ntoggle_sidebar_label=Yan Paneli Aç/Bağla\ndocument_outline.title=Sənədin eskizini göstər (bütün bəndləri açmaq/yığmaq üçün iki dəfə klikləyin)\ndocument_outline_label=Sənəd strukturu\nattachments.title=Bağlamaları göstər\nattachments_label=Bağlamalar\nthumbs.title=Kiçik şəkilləri göstər\nthumbs_label=Kiçik şəkillər\nfindbar.title=Sənəddə Tap\nfindbar_label=Tap\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Səhifə{{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} səhifəsinin kiçik vəziyyəti\n\n# Find panel button title and messages\nfind_input.title=Tap\nfind_input.placeholder=Sənəddə tap…\nfind_previous.title=Bir öncəki uyğun gələn sözü tapır\nfind_previous_label=Geri\nfind_next.title=Bir sonrakı uyğun gələn sözü tapır\nfind_next_label=İrəli\nfind_highlight=İşarələ\nfind_match_case_label=Böyük/kiçik hərfə həssaslıq\nfind_reached_top=Sənədin yuxarısına çatdı, aşağıdan davam edir\nfind_reached_bottom=Sənədin sonuna çatdı, yuxarıdan davam edir\nfind_not_found=Uyğunlaşma tapılmadı\n\n# Error panel labels\nerror_more_info=Daha çox məlumati\nerror_less_info=Daha az məlumat\nerror_close=Qapat\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (yığma: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=İsmarıc: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stek: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fayl: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Sətir: {{line}}\nrendering_error=Səhifə göstərilərkən səhv yarandı.\n\n# Predefined zoom values\npage_scale_width=Səhifə genişliyi\npage_scale_fit=Səhifəni sığdır\npage_scale_auto=Avtomatik yaxınlaşdır\npage_scale_actual=Hazırki Həcm\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Səhv\nloading_error=PDF yüklenərkən bir səhv yarandı.\ninvalid_file_error=Səhv və ya zədələnmiş olmuş PDF fayl.\nmissing_file_error=PDF fayl yoxdur.\nunexpected_response_error=Gözlənilməz server cavabı.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotasiyası]\npassword_label=Bu PDF faylı açmaq üçün şifrəni daxil edin.\npassword_invalid=Şifrə yanlışdır. Bir daha sınayın.\npassword_ok=Tamam\npassword_cancel=Ləğv et\n\nprinting_not_supported=Xəbərdarlıq: Çap bu səyyah tərəfindən tam olaraq dəstəklənmir.\nprinting_not_ready=Xəbərdarlıq: PDF çap üçün tam yüklənməyib.\nweb_fonts_disabled=Web Şriftlər söndürülüb: yerləşdirilmiş PDF şriftlərini istifadə etmək mümkün deyil.\ndocument_colors_not_allowed=PDF sənədlərə öz rənglərini işlətməyə icazə verilmir: “Səhifələrə öz rənglərini istifadə etməyə icazə ver”mə səyyahda söndürülüb.\n"
  },
  {
    "path": "pages/include/pdf/locale/be/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Папярэдняя старонка\nprevious_label=Папярэдняя\nnext.title=Наступная старонка\nnext_label=Наступная\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Старонка\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=з {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} з {{pagesCount}})\n\nzoom_out.title=Паменшыць\nzoom_out_label=Паменшыць\nzoom_in.title=Павялічыць\nzoom_in_label=Павялічыць\nzoom.title=Павялічэнне тэксту\npresentation_mode.title=Пераключыцца ў рэжым паказу\npresentation_mode_label=Рэжым паказу\nopen_file.title=Адкрыць файл\nopen_file_label=Адкрыць\nprint.title=Друкаваць\nprint_label=Друкаваць\ndownload.title=Сцягнуць\ndownload_label=Сцягнуць\nbookmark.title=Цяперашняя праява (скапіяваць або адчыніць у новым акне)\nbookmark_label=Цяперашняя праява\n\n# Secondary toolbar and context menu\ntools.title=Прылады\ntools_label=Прылады\nfirst_page.title=Перайсці на першую старонку\nfirst_page.label=Перайсці на першую старонку\nfirst_page_label=Перайсці на першую старонку\nlast_page.title=Перайсці на апошнюю старонку\nlast_page.label=Перайсці на апошнюю старонку\nlast_page_label=Перайсці на апошнюю старонку\npage_rotate_cw.title=Павярнуць па сонцу\npage_rotate_cw.label=Павярнуць па сонцу\npage_rotate_cw_label=Павярнуць па сонцу\npage_rotate_ccw.title=Павярнуць супраць сонца\npage_rotate_ccw.label=Павярнуць супраць сонца\npage_rotate_ccw_label=Павярнуць супраць сонца\n\ncursor_text_select_tool.title=Уключыць прыладу выбару тэксту\ncursor_text_select_tool_label=Прылада выбару тэксту\ncursor_hand_tool.title=Уключыць ручную прыладу\ncursor_hand_tool_label=Ручная прылада\n\n# Document properties dialog box\ndocument_properties.title=Уласцівасці дакумента…\ndocument_properties_label=Уласцівасці дакумента…\ndocument_properties_file_name=Назва файла:\ndocument_properties_file_size=Памер файла:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} байт)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} байт)\ndocument_properties_title=Загаловак:\ndocument_properties_author=Аўтар:\ndocument_properties_subject=Тэма:\ndocument_properties_keywords=Ключавыя словы:\ndocument_properties_creation_date=Дата стварэння:\ndocument_properties_modification_date=Дата змянення:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Стваральнік:\ndocument_properties_producer=Вырабнік PDF:\ndocument_properties_version=Версія PDF:\ndocument_properties_page_count=Колькасць старонак:\ndocument_properties_close=Закрыць\n\nprint_progress_message=Падрыхтоўка дакумента да друку…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Скасаваць\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Паказаць/схаваць бакавую панэль\ntoggle_sidebar_notification.title=Паказаць/схаваць бакавую панэль (дакумент мае змест/укладанні)\ntoggle_sidebar_label=Паказаць/схаваць бакавую панэль\ndocument_outline.title=Паказаць структуру дакумента (двайная пстрычка, каб разгарнуць /згарнуць усе элементы)\ndocument_outline_label=Структура дакумента\nattachments.title=Паказаць далучэнні\nattachments_label=Далучэнні\nthumbs.title=Паказ мініяцюр\nthumbs_label=Мініяцюры\nfindbar.title=Пошук у дакуменце\nfindbar_label=Знайсці\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Старонка {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Мініяцюра старонкі {{page}}\n\n# Find panel button title and messages\nfind_input.title=Шукаць\nfind_input.placeholder=Шукаць у дакуменце…\nfind_previous.title=Знайсці папярэдні выпадак выразу\nfind_previous_label=Папярэдні\nfind_next.title=Знайсці наступны выпадак выразу\nfind_next_label=Наступны\nfind_highlight=Падфарбаваць усе\nfind_match_case_label=Адрозніваць вялікія/малыя літары\nfind_reached_top=Дасягнуты пачатак дакумента, працяг з канца\nfind_reached_bottom=Дасягнуты канец дакумента, працяг з пачатку\nfind_not_found=Выраз не знойдзены\n\n# Error panel labels\nerror_more_info=Падрабязней\nerror_less_info=Сцісла\nerror_close=Закрыць\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js в{{version}} (зборка: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Паведамленне: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стос: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Радок: {{line}}\nrendering_error=Здарылася памылка падчас адлюстравання старонкі.\n\n# Predefined zoom values\npage_scale_width=Шырыня старонкі\npage_scale_fit=Уцісненне старонкі\npage_scale_auto=Аўтаматычнае павелічэнне\npage_scale_actual=Сапраўдны памер\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Памылка\nloading_error=Здарылася памылка падчас загрузкі PDF.\ninvalid_file_error=Няспраўны або пашкоджаны файл PDF.\nmissing_file_error=Адсутны файл PDF.\nunexpected_response_error=Нечаканы адказ сервера.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Увядзіце пароль, каб адкрыць гэты файл PDF.\npassword_invalid=Нядзейсны пароль. Паспрабуйце зноў.\npassword_ok=Добра\npassword_cancel=Скасаваць\n\nprinting_not_supported=Папярэджанне: друк не падтрымліваецца цалкам гэтым браўзерам.\nprinting_not_ready=Увага: PDF не сцягнуты цалкам для друкавання.\nweb_fonts_disabled=Шрыфты Сеціва забаронены: немагчыма ўжываць укладзеныя шрыфты PDF.\ndocument_colors_not_allowed=PDF-дакументам не дазволена выкарыстоўваць свае колеры: у браўзеры адключаны параметр \"Дазволіць вэб-сайтам выкарыстоўваць свае колеры\".\n"
  },
  {
    "path": "pages/include/pdf/locale/bg/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Предишна страница\nprevious_label=Предишна\nnext.title=Следваща страница\nnext_label=Следваща\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Страница\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=от {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} от {{pagesCount}})\n\nzoom_out.title=Намаляване\nzoom_out_label=Намаляване\nzoom_in.title=Увеличаване\nzoom_in_label=Увеличаване\nzoom.title=Мащабиране\npresentation_mode.title=Превключване към режим на представяне\npresentation_mode_label=Режим на представяне\nopen_file.title=Отваряне на файл\nopen_file_label=Отваряне\nprint.title=Отпечатване\nprint_label=Отпечатване\ndownload.title=Изтегляне\ndownload_label=Изтегляне\nbookmark.title=Текущ изглед (копиране или отваряне в нов прозорец)\nbookmark_label=Текущ изглед\n\n# Secondary toolbar and context menu\ntools.title=Инструменти\ntools_label=Инструменти\nfirst_page.title=Към първата страница\nfirst_page.label=Към първата страница\nfirst_page_label=Към първата страница\nlast_page.title=Към последната страница\nlast_page.label=Към последната страница\nlast_page_label=Към последната страница\npage_rotate_cw.title=Завъртане по часовниковата стрелка\npage_rotate_cw.label=Завъртане по часовниковата стрелка\npage_rotate_cw_label=Завъртане по часовниковата стрелка\npage_rotate_ccw.title=Завъртане обратно на часовниковата стрелка\npage_rotate_ccw.label=Завъртане обратно на часовниковата стрелка\npage_rotate_ccw_label=Завъртане обратно на часовниковата стрелка\n\ncursor_text_select_tool.title=Включване на инструмента за избор на текст\ncursor_text_select_tool_label=Инструмент за избор на текст\ncursor_hand_tool.title=Включване на инструмента ръка\ncursor_hand_tool_label=Инструмент ръка\n\n# Document properties dialog box\ndocument_properties.title=Свойства на документа…\ndocument_properties_label=Свойства на документа…\ndocument_properties_file_name=Име на файл:\ndocument_properties_file_size=Големина на файл:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} байта)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} байта)\ndocument_properties_title=Заглавие:\ndocument_properties_author=Автор:\ndocument_properties_subject=Тема:\ndocument_properties_keywords=Ключови думи:\ndocument_properties_creation_date=Дата на създаване:\ndocument_properties_modification_date=Дата на промяна:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Създател:\ndocument_properties_producer=PDF произведен от:\ndocument_properties_version=PDF версия:\ndocument_properties_page_count=Брой страници:\ndocument_properties_close=Затваряне\n\nprint_progress_message=Подготвяне на документа за отпечатване…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Отказ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Превключване на страничната лента\ntoggle_sidebar_notification.title=Превключване на страничната лента (документи със структура/прикачени файлове)\ntoggle_sidebar_label=Превключване на страничната лента\ndocument_outline.title=Показване на структурата на документа (двукратно щракване за свиване/разгъване на всичко)\ndocument_outline_label=Структура на документа\nattachments.title=Показване на притурките\nattachments_label=Притурки\nthumbs.title=Показване на миниатюрите\nthumbs_label=Миниатюри\nfindbar.title=Намиране в документа\nfindbar_label=Търсене\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Страница {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Миниатюра на страница {{page}}\n\n# Find panel button title and messages\nfind_input.title=Търсене\nfind_input.placeholder=Търсене в документа…\nfind_previous.title=Намиране на предишно съвпадение на фразата\nfind_previous_label=Предишна\nfind_next.title=Намиране на следващо съвпадение на фразата\nfind_next_label=Следваща\nfind_highlight=Открояване на всички\nfind_match_case_label=Чувствителност към регистъра\nfind_reached_top=Достигнато е началото на документа, продължаване от края\nfind_reached_bottom=Достигнат е краят на документа, продължаване от началото\nfind_not_found=Фразата не е намерена\n\n# Error panel labels\nerror_more_info=Повече информация\nerror_less_info=По-малко информация\nerror_close=Затваряне\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js версия {{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Съобщение: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стек: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Ред: {{line}}\nrendering_error=Грешка при изчертаване на страницата.\n\n# Predefined zoom values\npage_scale_width=Ширина на страницата\npage_scale_fit=Вместване в страницата\npage_scale_auto=Автоматично мащабиране\npage_scale_actual=Действителен размер\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Грешка\nloading_error=Получи се грешка при зареждане на PDF-а.\ninvalid_file_error=Невалиден или повреден PDF файл.\nmissing_file_error=Липсващ PDF файл.\nunexpected_response_error=Неочакван отговор от сървъра.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Анотация {{type}}]\npassword_label=Въведете парола за отваряне на този PDF файл.\npassword_invalid=Невалидна парола. Моля, опитайте отново.\npassword_ok=Добре\npassword_cancel=Отказ\n\nprinting_not_supported=Внимание: Този браузър няма пълна поддръжка на отпечатване.\nprinting_not_ready=Внимание: Този PDF файл не е напълно зареден за печат.\nweb_fonts_disabled=Уеб-шрифтовете са забранени: разрешаване на използването на вградените PDF шрифтове.\ndocument_colors_not_allowed=На PDF-документите не е разрешено да използват собствени цветове: „Разрешаване на страниците да избират собствени цветове“ е изключено в браузъра.\n"
  },
  {
    "path": "pages/include/pdf/locale/bn-BD/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=পূর্ববর্তী পৃষ্ঠা\nprevious_label=পূর্ববর্তী\nnext.title=পরবর্তী পৃষ্ঠা\nnext_label=পরবর্তী\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=পাতা\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} এর\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pagesCount}} এর {{pageNumber}})\n\nzoom_out.title=ছোট আকারে প্রদর্শন\nzoom_out_label=ছোট আকারে প্রদর্শন\nzoom_in.title=বড় আকারে প্রদর্শন\nzoom_in_label=বড় আকারে প্রদর্শন\nzoom.title=বড় আকারে প্রদর্শন\npresentation_mode.title=উপস্থাপনা মোডে স্যুইচ করুন\npresentation_mode_label=উপস্থাপনা মোড\nopen_file.title=ফাইল খুলুন\nopen_file_label=খুলুন\nprint.title=মুদ্রণ\nprint_label=মুদ্রণ\ndownload.title=ডাউনলোড\ndownload_label=ডাউনলোড\nbookmark.title=বর্তমান অবস্থা (অনুলিপি অথবা নতুন উইন্ডো তে খুলুন)\nbookmark_label=বর্তমান অবস্থা\n\n# Secondary toolbar and context menu\ntools.title=টুল\ntools_label=টুল\nfirst_page.title=প্রথম পাতায় যাও\nfirst_page.label=প্রথম পাতায় যাও\nfirst_page_label=প্রথম পাতায় যাও\nlast_page.title=শেষ পাতায় যাও\nlast_page.label=শেষ পাতায় যাও\nlast_page_label=শেষ পাতায় যাও\npage_rotate_cw.title=ঘড়ির কাঁটার দিকে ঘোরাও\npage_rotate_cw.label=ঘড়ির কাঁটার দিকে ঘোরাও\npage_rotate_cw_label=ঘড়ির কাঁটার দিকে ঘোরাও\npage_rotate_ccw.title=ঘড়ির কাঁটার বিপরীতে ঘোরাও\npage_rotate_ccw.label=ঘড়ির কাঁটার বিপরীতে ঘোরাও\npage_rotate_ccw_label=ঘড়ির কাঁটার বিপরীতে ঘোরাও\n\ncursor_hand_tool.title=হ্যান্ড টুল সক্রিয় করুন\n\n# Document properties dialog box\ndocument_properties.title=নথি বৈশিষ্ট্য…\ndocument_properties_label=নথি বৈশিষ্ট্য…\ndocument_properties_file_name=ফাইলের নাম:\ndocument_properties_file_size=ফাইলের আকার:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} কেবি ({{size_b}} বাইট)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} এমবি ({{size_b}} বাইট)\ndocument_properties_title=শিরোনাম:\ndocument_properties_author=লেখক:\ndocument_properties_subject=বিষয়:\ndocument_properties_keywords=কীওয়ার্ড:\ndocument_properties_creation_date=তৈরির তারিখ:\ndocument_properties_modification_date=পরিবর্তনের তারিখ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=প্রস্তুতকারক:\ndocument_properties_producer=পিডিএফ প্রস্তুতকারক:\ndocument_properties_version=পিডিএফ সংষ্করণ:\ndocument_properties_page_count=মোট পাতা:\ndocument_properties_close=বন্ধ\n\nprint_progress_message=মুদ্রণের জন্য নথি প্রস্তুত করা হচ্ছে…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=বাতিল\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=সাইডবার টগল করুন\ntoggle_sidebar_notification.title=সাইডবার টগল (নথিতে আউটলাইন/এটাচমেন্ট রয়েছে)\ntoggle_sidebar_label=সাইডবার টগল করুন\ndocument_outline.title=নথির আউটলাইন দেখাও (সব আইটেম প্রসারিত/সঙ্কুচিত করতে ডবল ক্লিক করুন)\ndocument_outline_label=নথির রূপরেখা\nattachments.title=সংযুক্তি দেখাও\nattachments_label=সংযুক্তি\nthumbs.title=থাম্বনেইল সমূহ প্রদর্শন করুন\nthumbs_label=থাম্বনেইল সমূহ\nfindbar.title=নথির মধ্যে খুঁজুন\nfindbar_label=খুঁজুন\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=পৃষ্ঠা {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} পৃষ্ঠার থাম্বনেইল\n\n# Find panel button title and messages\nfind_input.title=খুঁজুন\nfind_input.placeholder=নথির মধ্যে খুঁজুন…\nfind_previous.title=বাক্যাংশের পূর্ববর্তী উপস্থিতি অনুসন্ধান\nfind_previous_label=পূর্ববর্তী\nfind_next.title=বাক্যাংশের পরবর্তী উপস্থিতি অনুসন্ধান\nfind_next_label=পরবর্তী\nfind_highlight=সব হাইলাইট করা হবে\nfind_match_case_label=অক্ষরের ছাঁদ মেলানো\nfind_reached_top=পৃষ্ঠার শুরুতে পৌছে গেছে, নীচ থেকে আরম্ভ করা হয়েছে\nfind_reached_bottom=পৃষ্ঠার শেষে পৌছে গেছে, উপর থেকে আরম্ভ করা হয়েছে\nfind_not_found=বাক্যাংশ পাওয়া যায়নি\n\n# Error panel labels\nerror_more_info=আরও তথ্য\nerror_less_info=কম তথ্য\nerror_close=বন্ধ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=বার্তা: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=নথি: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=লাইন: {{line}}\nrendering_error=পৃষ্ঠা উপস্থাপনার সময় ত্রুটি দেখা দিয়েছে।\n\n# Predefined zoom values\npage_scale_width=পৃষ্ঠার প্রস্থ\npage_scale_fit=পৃষ্ঠা ফিট করুন\npage_scale_auto=স্বয়ংক্রিয় জুম\npage_scale_actual=প্রকৃত আকার\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=ত্রুটি\nloading_error=পিডিএফ লোড করার সময় ত্রুটি দেখা দিয়েছে।\ninvalid_file_error=অকার্যকর অথবা ক্ষতিগ্রস্ত পিডিএফ ফাইল।\nmissing_file_error=নিখোঁজ PDF ফাইল।\nunexpected_response_error=অপ্রত্যাশীত সার্ভার প্রতিক্রিয়া।\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} টীকা]\npassword_label=পিডিএফ ফাইলটি ওপেন করতে পাসওয়ার্ড দিন।\npassword_invalid=ভুল পাসওয়ার্ড। অনুগ্রহ করে আবার চেষ্টা করুন।\npassword_ok=ঠিক আছে\npassword_cancel=বাতিল\n\nprinting_not_supported=সতর্কতা: এই ব্রাউজারে মুদ্রণ সম্পূর্ণভাবে সমর্থিত নয়।\nprinting_not_ready=সতর্কীকরণ: পিডিএফটি মুদ্রণের জন্য সম্পূর্ণ লোড হয়নি।\nweb_fonts_disabled=ওয়েব ফন্ট নিষ্ক্রিয়: সংযুক্ত পিডিএফ ফন্ট ব্যবহার করা যাচ্ছে না।\ndocument_colors_not_allowed=পিডিএফ ডকুমেন্টকে তাদের নিজস্ব রঙ ব্যবহারে অনুমতি নেই: 'পাতা তাদের নিজেস্ব রঙ নির্বাচন করতে অনুমতি দিন' এই ব্রাউজারে নিষ্ক্রিয় রয়েছে।\n"
  },
  {
    "path": "pages/include/pdf/locale/bn-IN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=পূর্ববর্তী পৃষ্ঠা\nprevious_label=পূর্ববর্তী\nnext.title=পরবর্তী পৃষ্ঠা\nnext_label=পরবর্তী\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=পেজ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pagesCount}} এর {{pageNumber}})\n\nzoom_out.title=ছোট মাপে প্রদর্শন\nzoom_out_label=ছোট মাপে প্রদর্শন\nzoom_in.title=বড় মাপে প্রদর্শন\nzoom_in_label=বড় মাপে প্রদর্শন\nzoom.title=প্রদর্শনের মাপ\npresentation_mode.title=উপস্থাপনা মোড স্যুইচ করুন\npresentation_mode_label=উপস্থাপনা মোড\nopen_file.title=ফাইল খুলুন\nopen_file_label=খুলুন\nprint.title=প্রিন্ট করুন\nprint_label=প্রিন্ট করুন\ndownload.title=ডাউনলোড করুন\ndownload_label=ডাউনলোড করুন\nbookmark.title=বর্তমান প্রদর্শন (কপি করুন অথবা নতুন উইন্ডোতে খুলুন)\nbookmark_label=বর্তমান প্রদর্শন\n\n# Secondary toolbar and context menu\ntools.title=সরঞ্জাম\ntools_label=সরঞ্জাম\nfirst_page.title=প্রথম পৃষ্ঠায় চলুন\nfirst_page.label=প্রথম পৃষ্ঠায় চলুন\nfirst_page_label=প্রথম পৃষ্ঠায় চলুন\nlast_page.title=সর্বশেষ পৃষ্ঠায় চলুন\nlast_page.label=সর্বশেষ পৃষ্ঠায় চলুন\nlast_page_label=সর্বশেষ পৃষ্ঠায় চলুন\npage_rotate_cw.title=ডানদিকে ঘোরানো হবে\npage_rotate_cw.label=ডানদিকে ঘোরানো হবে\npage_rotate_cw_label=ডানদিকে ঘোরানো হবে\npage_rotate_ccw.title=বাঁদিকে ঘোরানো হবে\npage_rotate_ccw.label=বাঁদিকে ঘোরানো হবে\npage_rotate_ccw_label=বাঁদিকে ঘোরানো হবে\n\n\n# Document properties dialog box\ndocument_properties.title=নথির বৈশিষ্ট্য…\ndocument_properties_label=নথির বৈশিষ্ট্য…\ndocument_properties_file_name=ফাইলের নাম:\ndocument_properties_file_size=ফাইলের মাপ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} মেগাবাইট ({{size_b}} bytes)\ndocument_properties_title=শিরোনাম:\ndocument_properties_author=লেখক:\ndocument_properties_subject=বিষয়:\ndocument_properties_keywords=নির্দেশক শব্দ:\ndocument_properties_creation_date=নির্মাণের তারিখ:\ndocument_properties_modification_date=পরিবর্তনের তারিখ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=নির্মাতা:\ndocument_properties_producer=PDF নির্মাতা:\ndocument_properties_version=PDF সংস্করণ:\ndocument_properties_page_count=মোট পৃষ্ঠা:\ndocument_properties_close=বন্ধ করুন\n\nprint_progress_message=ডকুমেন্ট প্রিন্টিং-র জন্য তৈরি করা হচ্ছে...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=বাতিল\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=সাইডবার টগল করুন\ntoggle_sidebar_label=সাইডবার টগল করুন\ndocument_outline.title=ডকুমেন্ট আউটলাইন দেখান (দুবার ক্লিক করুন বাড়াতে//collapse সমস্ত আইটেম)\ndocument_outline_label=ডকুমেন্ট আউটলাইন\nattachments.title=সংযুক্তিসমূহ দেখান\nattachments_label=সংযুক্ত বস্তু\nthumbs.title=থাম্ব-নেইল প্রদর্শন\nthumbs_label=থাম্ব-নেইল প্রদর্শন\nfindbar.title=নথিতে খুঁজুন\nfindbar_label=অনুসন্ধান করুন\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=পৃষ্ঠা {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=পৃষ্ঠা {{page}}-র থাম্ব-নেইল\n\n# Find panel button title and messages\nfind_previous.title=চিহ্নিত পংক্তির পূর্ববর্তী উপস্থিতি অনুসন্ধান করুন\nfind_previous_label=পূর্ববর্তী\nfind_next.title=চিহ্নিত পংক্তির পরবর্তী উপস্থিতি অনুসন্ধান করুন\nfind_next_label=পরবর্তী\nfind_highlight=সমগ্র উজ্জ্বল করুন\nfind_match_case_label=হরফের ছাঁদ মেলানো হবে\nfind_reached_top=পৃষ্ঠার প্রারম্ভে পৌছে গেছে, নীচের অংশ থেকে আরম্ভ করা হবে\nfind_reached_bottom=পৃষ্ঠার অন্তিম প্রান্তে পৌছে গেছে, প্রথম অংশ থেকে আরম্ভ করা হবে\nfind_not_found=পংক্তি পাওয়া যায়নি\n\n# Error panel labels\nerror_more_info=অতিরিক্ত তথ্য\nerror_less_info=কম তথ্য\nerror_close=বন্ধ করুন\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=পৃষ্ঠা প্রদর্শনকালে একটি সমস্যা দেখা দিয়েছে।\n\n# Predefined zoom values\npage_scale_width=পৃষ্ঠার প্রস্থ অনুযায়ী\npage_scale_fit=পৃষ্ঠার মাপ অনুযায়ী\npage_scale_auto=স্বয়ংক্রিয় মাপ নির্ধারণ\npage_scale_actual=প্রকৃত মাপ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=ত্রুটি\nloading_error=PDF লোড করার সময় সমস্যা দেখা দিয়েছে।\ninvalid_file_error=অবৈধ বা ক্ষতিগ্রস্ত পিডিএফ ফাইল।\nmissing_file_error=অনুপস্থিত PDF ফাইল\nunexpected_response_error=সার্ভার থেকে অপ্রত্যাশিত সাড়া পাওয়া গেছে।\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=এই PDF ফাইল খোলার জন্য পাসওয়ার্ড দিন।\npassword_invalid=পাসওয়ার্ড সঠিক নয়। অনুগ্রহ করে পুনরায় প্রচেষ্টা করুন।\npassword_ok=OK\npassword_cancel=বাতিল করুন\n\nprinting_not_supported=সতর্কবার্তা: এই ব্রাউজার দ্বারা প্রিন্ট ব্যবস্থা সম্পূর্ণরূপে সমর্থিত নয়।\nprinting_not_ready=সতর্কবাণী: পিডিএফ সম্পূর্ণরূপে মুদ্রণের জন্য লোড করা হয় না.\nweb_fonts_disabled=ওয়েব ফন্ট নিষ্ক্রিয় করা হয়েছে: এমবেডেড পিডিএফ ফন্ট ব্যবহার করতে অক্ষম.\ndocument_colors_not_allowed=পিডিএফ নথি তাদের নিজস্ব রং ব্যবহার করার জন্য অনুমতিপ্রাপ্ত নয়: ব্রাউজারে নিষ্ক্রিয় করা হয়েছে য়েন  'পেজ তাদের নিজস্ব রং নির্বাচন করার অনুমতি প্রদান করা য়ায়।'\n"
  },
  {
    "path": "pages/include/pdf/locale/br/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pajenn a-raok\nprevious_label=A-raok\nnext.title=Pajenn war-lerc'h\nnext_label=War-lerc'h\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pajenn\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=eus {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} war {{pagesCount}})\n\nzoom_out.title=Zoum bihanaat\nzoom_out_label=Zoum bihanaat\nzoom_in.title=Zoum brasaat\nzoom_in_label=Zoum brasaat\nzoom.title=Zoum\npresentation_mode.title=Trec'haoliñ etrezek ar mod kinnigadenn\npresentation_mode_label=Mod kinnigadenn\nopen_file.title=Digeriñ ur restr\nopen_file_label=Digeriñ ur restr\nprint.title=Moullañ\nprint_label=Moullañ\ndownload.title=Pellgargañ\ndownload_label=Pellgargañ\nbookmark.title=Gwel bremanel (eilañ pe zigeriñ e-barzh ur prenestr nevez)\nbookmark_label=Gwel bremanel\n\n# Secondary toolbar and context menu\ntools.title=Ostilhoù\ntools_label=Ostilhoù\nfirst_page.title=Mont d'ar bajenn gentañ\nfirst_page.label=Mont d'ar bajenn gentañ\nfirst_page_label=Mont d'ar bajenn gentañ\nlast_page.title=Mont d'ar bajenn diwezhañ\nlast_page.label=Mont d'ar bajenn diwezhañ\nlast_page_label=Mont d'ar bajenn diwezhañ\npage_rotate_cw.title=C'hwelañ gant roud ar bizied\npage_rotate_cw.label=C'hwelañ gant roud ar bizied\npage_rotate_cw_label=C'hwelañ gant roud ar bizied\npage_rotate_ccw.title=C'hwelañ gant roud gin ar bizied\npage_rotate_ccw.label=C'hwelañ gant roud gin ar bizied\npage_rotate_ccw_label=C'hwelañ gant roud gin ar bizied\n\n\n# Document properties dialog box\ndocument_properties.title=Perzhioù an teul…\ndocument_properties_label=Perzhioù an teul…\ndocument_properties_file_name=Anv restr :\ndocument_properties_file_size=Ment ar restr :\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} Ke ({{size_b}} eizhbit)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} Me ({{size_b}} eizhbit)\ndocument_properties_title=Titl :\ndocument_properties_author=Aozer :\ndocument_properties_subject=Danvez :\ndocument_properties_keywords=Gerioù-alc'hwez :\ndocument_properties_creation_date=Deiziad krouiñ :\ndocument_properties_modification_date=Deiziad kemmañ :\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Krouer :\ndocument_properties_producer=Kenderc'her PDF :\ndocument_properties_version=Handelv PDF :\ndocument_properties_page_count=Niver a bajennoù :\ndocument_properties_close=Serriñ\n\nprint_progress_message=O prientiñ an teul evit moullañ...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Nullañ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Diskouez/kuzhat ar varrenn gostez\ntoggle_sidebar_notification.title=Trec'haoliñ ar verrenn-gostez (ur steuñv pe stagadennoù a zo en teul)\ntoggle_sidebar_label=Diskouez/kuzhat ar varrenn gostez\ndocument_outline.title=Diskouez steuñv an teul (daouglikit evit brasaat/bihanaat an holl elfennoù)\ndocument_outline_label=Sinedoù an teuliad\nattachments.title=Diskouez ar c'henstagadurioù\nattachments_label=Kenstagadurioù\nthumbs.title=Diskouez ar melvennoù\nthumbs_label=Melvennoù\nfindbar.title=Klask e-barzh an teuliad\nfindbar_label=Klask\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pajenn {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Melvenn ar bajenn {{page}}\n\n# Find panel button title and messages\nfind_input.title=Klask\nfind_input.placeholder=Klask e-barzh an teuliad\nfind_previous.title=Kavout an tamm frazenn kent o klotañ ganti\nfind_previous_label=Kent\nfind_next.title=Kavout an tamm frazenn war-lerc'h o klotañ ganti\nfind_next_label=War-lerc'h\nfind_highlight=Usskediñ pep tra\nfind_match_case_label=Teurel evezh ouzh ar pennlizherennoù\nfind_reached_top=Tizhet eo bet derou ar bajenn, kenderc'hel diouzh an diaz\nfind_reached_bottom=Tizhet eo bet dibenn ar bajenn, kenderc'hel diouzh ar c'hrec'h\nfind_not_found=N'haller ket kavout ar frazenn\n\n# Error panel labels\nerror_more_info=Muioc'h a ditouroù\nerror_less_info=Nebeutoc'h a ditouroù\nerror_close=Serriñ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js handelv {{version}} (kempunadur : {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Kemennadenn : {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Torn : {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Restr : {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linenn : {{line}}\nrendering_error=Degouezhet ez eus bet ur fazi e-pad skrammañ ar bajennad.\n\n# Predefined zoom values\npage_scale_width=Led ar bajenn\npage_scale_fit=Pajenn a-bezh\npage_scale_auto=Zoum emgefreek\npage_scale_actual=Ment wir\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Fazi\nloading_error=Degouezhet ez eus bet ur fazi e-pad kargañ ar PDF.\ninvalid_file_error=Restr PDF didalvoudek pe kontronet.\nmissing_file_error=Restr PDF o vankout.\nunexpected_response_error=Respont dic'hortoz a-berzh an dafariad\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Notennañ]\npassword_label=Enankit ar ger-tremen evit digeriñ ar restr PDF-mañ.\npassword_invalid=Ger-tremen didalvoudek. Klaskit en-dro mar plij.\npassword_ok=Mat eo\npassword_cancel=Nullañ\n\nprinting_not_supported=Kemenn : N'eo ket skoret penn-da-benn ar moullañ gant ar merdeer-mañ.\nprinting_not_ready=Kemenn : N'hall ket bezañ moullet ar restr PDF rak n'eo ket karget penn-da-benn.\nweb_fonts_disabled=Diweredekaet eo an nodrezhoù web : n'haller ket arverañ an nodrezhoù PDF enframmet.\ndocument_colors_not_allowed=N'eo ket aotreet an teuliadoù PDF da arverañ o livioù dezho : diweredekaet eo “Aotren ar pajennoù da zibab o livioù dezho” e-barzh ar merdeer.\n"
  },
  {
    "path": "pages/include/pdf/locale/bs/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Prethodna strana\nprevious_label=Prethodna\nnext.title=Sljedeća strna\nnext_label=Sljedeća\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Strana\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=od {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} od {{pagesCount}})\n\nzoom_out.title=Umanji\nzoom_out_label=Umanji\nzoom_in.title=Uvećaj\nzoom_in_label=Uvećaj\nzoom.title=Uvećanje\npresentation_mode.title=Prebaci se u prezentacijski režim\npresentation_mode_label=Prezentacijski režim\nopen_file.title=Otvori fajl\nopen_file_label=Otvori\nprint.title=Štampaj\nprint_label=Štampaj\ndownload.title=Preuzmi\ndownload_label=Preuzmi\nbookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru)\nbookmark_label=Trenutni prikaz\n\n# Secondary toolbar and context menu\ntools.title=Alati\ntools_label=Alati\nfirst_page.title=Idi na prvu stranu\nfirst_page.label=Idi na prvu stranu\nfirst_page_label=Idi na prvu stranu\nlast_page.title=Idi na zadnju stranu\nlast_page.label=Idi na zadnju stranu\nlast_page_label=Idi na zadnju stranu\npage_rotate_cw.title=Rotiraj u smjeru kazaljke na satu\npage_rotate_cw.label=Rotiraj u smjeru kazaljke na satu\npage_rotate_cw_label=Rotiraj u smjeru kazaljke na satu\npage_rotate_ccw.title=Rotiraj suprotno smjeru kazaljke na satu\npage_rotate_ccw.label=Rotiraj suprotno smjeru kazaljke na satu\npage_rotate_ccw_label=Rotiraj suprotno smjeru kazaljke na satu\n\n\n# Document properties dialog box\ndocument_properties.title=Svojstva dokumenta...\ndocument_properties_label=Svojstva dokumenta...\ndocument_properties_file_name=Naziv fajla:\ndocument_properties_file_size=Veličina fajla:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajta)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajta)\ndocument_properties_title=Naslov:\ndocument_properties_author=Autor:\ndocument_properties_subject=Predmet:\ndocument_properties_keywords=Ključne riječi:\ndocument_properties_creation_date=Datum kreiranja:\ndocument_properties_modification_date=Datum promjene:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Kreator:\ndocument_properties_producer=PDF stvaratelj:\ndocument_properties_version=PDF verzija:\ndocument_properties_page_count=Broj stranica:\ndocument_properties_close=Zatvori\n\nprint_progress_message=Pripremam dokument za štampu…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Otkaži\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Uključi/isključi bočnu traku\ntoggle_sidebar_notification.title=Uključi/isključi sidebar (dokument sadrži outline/priloge)\ntoggle_sidebar_label=Uključi/isključi bočnu traku\ndocument_outline.title=Prikaži outline dokumenta (dvoklik za skupljanje/širenje svih stavki)\ndocument_outline_label=Konture dokumenta\nattachments.title=Prikaži priloge\nattachments_label=Prilozi\nthumbs.title=Prikaži thumbnailove\nthumbs_label=Thumbnailovi\nfindbar.title=Pronađi u dokumentu\nfindbar_label=Pronađi\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strana {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail strane {{page}}\n\n# Find panel button title and messages\nfind_input.title=Pronađi\nfind_input.placeholder=Pronađi u dokumentu…\nfind_previous.title=Pronađi prethodno pojavljivanje fraze\nfind_previous_label=Prethodno\nfind_next.title=Pronađi sljedeće pojavljivanje fraze\nfind_next_label=Sljedeće\nfind_highlight=Označi sve\nfind_match_case_label=Osjetljivost na karaktere\nfind_reached_top=Dostigao sam vrh dokumenta, nastavljam sa dna\nfind_reached_bottom=Dostigao sam kraj dokumenta, nastavljam sa vrha\nfind_not_found=Fraza nije pronađena\n\n# Error panel labels\nerror_more_info=Više informacija\nerror_less_info=Manje informacija\nerror_close=Zatvori\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Poruka: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fajl: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linija: {{line}}\nrendering_error=Došlo je do greške prilikom renderiranja strane.\n\n# Predefined zoom values\npage_scale_width=Širina strane\npage_scale_fit=Uklopi stranu\npage_scale_auto=Automatsko uvećanje\npage_scale_actual=Stvarna veličina\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Greška\nloading_error=Došlo je do greške prilikom učitavanja PDF-a.\ninvalid_file_error=Neispravan ili oštećen PDF fajl.\nmissing_file_error=Nedostaje PDF fajl.\nunexpected_response_error=Neočekivani odgovor servera.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} pribilješka]\npassword_label=Upišite lozinku da biste otvorili ovaj PDF fajl.\npassword_invalid=Pogrešna lozinka. Pokušajte ponovo.\npassword_ok=OK\npassword_cancel=Otkaži\n\nprinting_not_supported=Upozorenje: Štampanje nije u potpunosti podržano u ovom browseru.\nprinting_not_ready=Upozorenje: PDF nije u potpunosti učitan za štampanje.\nweb_fonts_disabled=Web fontovi su onemogućeni: nemoguće koristiti ubačene PDF fontove.\ndocument_colors_not_allowed=PDF dokumentima nije dozvoljeno da koriste vlastite boje: 'Dozvoli stranicama da izaberu vlastite boje' je deaktivirano u browseru.\n"
  },
  {
    "path": "pages/include/pdf/locale/ca/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pàgina anterior\nprevious_label=Anterior\nnext.title=Pàgina següent\nnext_label=Següent\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pàgina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Allunya\nzoom_out_label=Allunya\nzoom_in.title=Apropa\nzoom_in_label=Apropa\nzoom.title=Escala\npresentation_mode.title=Canvia al mode de presentació\npresentation_mode_label=Mode de presentació\nopen_file.title=Obre el fitxer\nopen_file_label=Obre\nprint.title=Imprimeix\nprint_label=Imprimeix\ndownload.title=Baixa\ndownload_label=Baixa\nbookmark.title=Vista actual (copia o obre en una finestra nova)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Eines\ntools_label=Eines\nfirst_page.title=Vés a la primera pàgina\nfirst_page.label=Vés a la primera pàgina\nfirst_page_label=Vés a la primera pàgina\nlast_page.title=Vés a l'última pàgina\nlast_page.label=Vés a l'última pàgina\nlast_page_label=Vés a l'última pàgina\npage_rotate_cw.title=Gira cap a la dreta\npage_rotate_cw.label=Gira cap a la dreta\npage_rotate_cw_label=Gira cap a la dreta\npage_rotate_ccw.title=Gira cap a l'esquerra\npage_rotate_ccw.label=Gira cap a l'esquerra\npage_rotate_ccw_label=Gira cap a l'esquerra\n\ncursor_text_select_tool.title=Habilita l'eina de selecció de text\ncursor_text_select_tool_label=Eina de selecció de text\ncursor_hand_tool.title=Habilita l'eina de mà\ncursor_hand_tool_label=Eina de mà\n\n# Document properties dialog box\ndocument_properties.title=Propietats del document…\ndocument_properties_label=Propietats del document…\ndocument_properties_file_name=Nom del fitxer:\ndocument_properties_file_size=Mida del fitxer:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Títol:\ndocument_properties_author=Autor:\ndocument_properties_subject=Assumpte:\ndocument_properties_keywords=Paraules clau:\ndocument_properties_creation_date=Data de creació:\ndocument_properties_modification_date=Data de modificació:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=Generador de PDF:\ndocument_properties_version=Versió de PDF:\ndocument_properties_page_count=Nombre de pàgines:\ndocument_properties_close=Tanca\n\nprint_progress_message=S'està preparant la impressió del document…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancel·la\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Mostra/amaga la barra lateral\ntoggle_sidebar_notification.title=Mostra/amaga la barra lateral (el document conté un esquema o adjuncions)\ntoggle_sidebar_label=Mostra/amaga la barra lateral\ndocument_outline.title=Mostra l'esquema del document (doble clic per ampliar/reduir tots els elements)\ndocument_outline_label=Contorn del document\nattachments.title=Mostra les adjuncions\nattachments_label=Adjuncions\nthumbs.title=Mostra les miniatures\nthumbs_label=Miniatures\nfindbar.title=Cerca al document\nfindbar_label=Cerca\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pàgina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de la pàgina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Cerca\nfind_input.placeholder=Cerca al document…\nfind_previous.title=Cerca l'anterior coincidència de l'expressió\nfind_previous_label=Anterior\nfind_next.title=Cerca la següent coincidència de l'expressió\nfind_next_label=Següent\nfind_highlight=Ressalta-ho tot\nfind_match_case_label=Distingeix entre majúscules i minúscules\nfind_reached_top=S'ha arribat al principi del document, es continua pel final\nfind_reached_bottom=S'ha arribat al final del document, es continua pel principi\nfind_not_found=No s'ha trobat l'expressió\n\n# Error panel labels\nerror_more_info=Més informació\nerror_less_info=Menys informació\nerror_close=Tanca\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (muntatge: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Missatge: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fitxer: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Línia: {{line}}\nrendering_error=S'ha produït un error mentre es renderitzava la pàgina.\n\n# Predefined zoom values\npage_scale_width=Amplària de la pàgina\npage_scale_fit=Ajusta la pàgina\npage_scale_auto=Zoom automàtic\npage_scale_actual=Mida real\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=S'ha produït un error en carregar el PDF.\ninvalid_file_error=El fitxer PDF no és vàlid o està malmès.\nmissing_file_error=Falta el fitxer PDF.\nunexpected_response_error=Resposta inesperada del servidor.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotació {{type}}]\npassword_label=Introduïu la contrasenya per obrir aquest fitxer PDF.\npassword_invalid=La contrasenya no és vàlida. Torneu-ho a provar.\npassword_ok=D'acord\npassword_cancel=Cancel·la\n\nprinting_not_supported=Avís: la impressió no és plenament funcional en aquest navegador.\nprinting_not_ready=Atenció: el PDF no s'ha acabat de carregar per imprimir-lo.\nweb_fonts_disabled=Els tipus de lletra web estan desactivats: no es poden utilitzar els tipus de lletra incrustats al PDF.\ndocument_colors_not_allowed=Els documents PDF no poden usar els seus colors propis: «Permet a les pàgines triar els colors propis» es troba desactivat al navegador.\n"
  },
  {
    "path": "pages/include/pdf/locale/cs/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Přejde na předchozí stránku\nprevious_label=Předchozí\nnext.title=Přejde na následující stránku\nnext_label=Další\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Stránka\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=z {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} z {{pagesCount}})\n\nzoom_out.title=Zmenší velikost\nzoom_out_label=Zmenšit\nzoom_in.title=Zvětší velikost\nzoom_in_label=Zvětšit\nzoom.title=Nastaví velikost\npresentation_mode.title=Přepne do režimu prezentace\npresentation_mode_label=Režim prezentace\nopen_file.title=Otevře soubor\nopen_file_label=Otevřít\nprint.title=Vytiskne dokument\nprint_label=Tisk\ndownload.title=Stáhne dokument\ndownload_label=Stáhnout\nbookmark.title=Současný pohled (kopírovat nebo otevřít v novém okně)\nbookmark_label=Současný pohled\n\n# Secondary toolbar and context menu\ntools.title=Nástroje\ntools_label=Nástroje\nfirst_page.title=Přejde na první stránku\nfirst_page.label=Přejít na první stránku\nfirst_page_label=Přejít na první stránku\nlast_page.title=Přejde na poslední stránku\nlast_page.label=Přejít na poslední stránku\nlast_page_label=Přejít na poslední stránku\npage_rotate_cw.title=Otočí po směru hodin\npage_rotate_cw.label=Otočit po směru hodin\npage_rotate_cw_label=Otočit po směru hodin\npage_rotate_ccw.title=Otočí proti směru hodin\npage_rotate_ccw.label=Otočit proti směru hodin\npage_rotate_ccw_label=Otočit proti směru hodin\n\ncursor_text_select_tool.title=Povolí výběr textu\ncursor_text_select_tool_label=Výběr textu\ncursor_hand_tool.title=Povolí nástroj ručička\ncursor_hand_tool_label=Nástroj ručička\n\n# Document properties dialog box\ndocument_properties.title=Vlastnosti dokumentu…\ndocument_properties_label=Vlastnosti dokumentu…\ndocument_properties_file_name=Název souboru:\ndocument_properties_file_size=Velikost souboru:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajtů)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajtů)\ndocument_properties_title=Nadpis:\ndocument_properties_author=Autor:\ndocument_properties_subject=Předmět:\ndocument_properties_keywords=Klíčová slova:\ndocument_properties_creation_date=Datum vytvoření:\ndocument_properties_modification_date=Datum úpravy:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Vytvořil:\ndocument_properties_producer=Tvůrce PDF:\ndocument_properties_version=Verze PDF:\ndocument_properties_page_count=Počet stránek:\ndocument_properties_close=Zavřít\n\nprint_progress_message=Příprava dokumentu pro tisk…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}} %\nprint_progress_close=Zrušit\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Postranní lišta\ntoggle_sidebar_notification.title=Přepne postranní lištu (dokument obsahuje osnovu/přílohy)\ntoggle_sidebar_label=Postranní lišta\ndocument_outline.title=Zobrazí osnovu dokumentu (dvojité klepnutí rozbalí/sbalí všechny položky)\ndocument_outline_label=Osnova dokumentu\nattachments.title=Zobrazí přílohy\nattachments_label=Přílohy\nthumbs.title=Zobrazí náhledy\nthumbs_label=Náhledy\nfindbar.title=Najde v dokumentu\nfindbar_label=Najít\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strana {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Náhled strany {{page}}\n\n# Find panel button title and messages\nfind_input.title=Najít\nfind_input.placeholder=Najít v dokumentu…\nfind_previous.title=Najde předchozí výskyt hledaného textu\nfind_previous_label=Předchozí\nfind_next.title=Najde další výskyt hledaného textu\nfind_next_label=Další\nfind_highlight=Zvýraznit\nfind_match_case_label=Rozlišovat velikost\nfind_reached_top=Dosažen začátek dokumentu, pokračuje se od konce\nfind_reached_bottom=Dosažen konec dokumentu, pokračuje se od začátku\nfind_not_found=Hledaný text nenalezen\n\n# Error panel labels\nerror_more_info=Více informací\nerror_less_info=Méně informací\nerror_close=Zavřít\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (sestavení: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Zpráva: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Zásobník: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Soubor: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Řádek: {{line}}\nrendering_error=Při vykreslování stránky nastala chyba.\n\n# Predefined zoom values\npage_scale_width=Podle šířky\npage_scale_fit=Podle výšky\npage_scale_auto=Automatická velikost\npage_scale_actual=Skutečná velikost\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Chyba\nloading_error=Při nahrávání PDF nastala chyba.\ninvalid_file_error=Neplatný nebo chybný soubor PDF.\nmissing_file_error=Chybí soubor PDF.\nunexpected_response_error=Neočekávaná odpověď serveru.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotace typu {{type}}]\npassword_label=Pro otevření PDF souboru vložte heslo.\npassword_invalid=Neplatné heslo. Zkuste to znovu.\npassword_ok=OK\npassword_cancel=Zrušit\n\nprinting_not_supported=Upozornění: Tisk není v tomto prohlížeči plně podporován.\nprinting_not_ready=Upozornění: Dokument PDF není kompletně načten.\nweb_fonts_disabled=Webová písma jsou zakázána, proto není možné použít vložená písma PDF.\ndocument_colors_not_allowed=PDF dokumenty nemají povoleno používat vlastní barvy: volba 'Povolit stránkám používat vlastní barvy' je v prohlížeči deaktivována.\n"
  },
  {
    "path": "pages/include/pdf/locale/csb/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pòprzédnô strona\nprevious_label=Pòprzédnô\nnext.title=Nôslédnô strona\nnext_label=Nôslédnô\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=Strona:\npage_of=z {{pageCount}}\n\nzoom_out.title=Zmniészë\nzoom_out_label=Zmniészë\nzoom_in.title=Zwikszë\nzoom_in_label=Wiôlgòsc\nzoom.title=Wiôlgòsc\nprint.title=Drëkùjë\nprint_label=Drëkùjë\npresentation_mode.title=Przéńdzë w trib prezentacje \npresentation_mode_label=Trib prezentacje \nopen_file.title=Òtemkni lopk\nopen_file_label=Òtemkni\ndownload.title=Zladënk\ndownload_label=Zladënk\nbookmark.title=Spamiãtôj wëzdrzatk (kòpérëje, abò òtemkni w nowim òknnie)\nbookmark_label=Aktualny wëzdrzatk\n\nfind_label=Szëkôj:\nfind_previous.title=Biéj do pòprzédnégò wënikù szëkbë\nfind_previous_label=Pòprzédny\nfind_next.title=Biéj do nôslédnégò wënikù szëkbë\nfind_next_label=Nôslédny\nfind_highlight=Pòdszkrzëni wszëtczé\nfind_match_case_label=Rozeznôwôj miarã lëterów\nfind_not_found=Nie nalôzł tekstu\nfind_reached_bottom=Doszedł do kùńca dokùmentu, zaczinającë òd górë\nfind_reached_top=Doszedł do pòczątkù dokùmentu, zaczinającë òd dołù\n\ntoggle_sidebar.title=Pòsuwk wëbiérkù\ntoggle_sidebar_label=Pòsuwk wëbiérkù\n\noutline.title=Wëskrzëni òbcéch dokùmentu\noutline_label=Òbcéch dokùmentu\nthumbs.title=Wëskrzëni miniaturë\nthumbs_label=Miniaturë\nfindbar.title=Przeszëkôj dokùment\nfindbar_label=Nalezë\ntools_label=Nôrzãdła\nfirst_page.title=Biéj do pierszi stronë\nfirst_page.label=Biéj do pierszi stronë\nlast_page.label=Biéj do òstatny stronë\ninvalid_file_error=Lëchi ôrt, abò pòpsëti lopk PDF.\n\n\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strona {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura stronë {{page}}\n\n# Error panel labels\nerror_more_info=Wicy infòrmacje\nerror_less_info=Mni infòrmacje\nerror_close=Close\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n\n\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{wiadło}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stóg}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{lopk}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=Pòkôza sã fela przë renderowanim stronë.\n\n# Predefined zoom values\npage_scale_width=Szérzawa stronë\npage_scale_fit=Dopasëje stronã\npage_scale_auto=Aùtomatnô wiôlgòsc\npage_scale_actual=Naturalnô wiôlgòsc\n\n# Loading indicator messages\n# LOCALIZATION NOTE (error_line): \"{{[percent}}\" will be replaced with a percentage\nloading_error_indicator=Fela\nloading_error=Pòkôza sã fela przë wczëtiwanim PDFù.\n\n# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.\n# \"{{[type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\n\nrequest_password=PDF je zabezpieczony parolą:\nprinting_not_supported = Òstrzéga: przezérnik nie je do kùńca wspieróny przez drëkôrze \n\n# Context menu\npage_rotate_cw.label=Òbkrãcë w prawò\npage_rotate_ccw.label=Òbkrãcë w lewò\n\n\nlast_page.title=Biéj do pòprzédny stronë\nlast_page_label=Biéj do pòprzédny stronë\npage_rotate_cw.title=Òbkrãcë w prawò\npage_rotate_cw_label=Òbkrãcë w prawò\npage_rotate_ccw.title=Òbkrãcë w lewò\npage_rotate_ccw_label=Òbkrãcë w lewò\n\n\nweb_fonts_disabled=Sécowé czconczi są wëłączoné: włączë je, bë móc ùżiwac òsadzonëch czconków w lopkach PDF.\n\n\nmissing_file_error=Felëje lopka PDF.\nprinting_not_ready = Òstrzéga: lopk mùszi sã do kùńca wczëtac zanim gò mòże drëkòwac\n\ndocument_colors_disabled=Dokùmentë PDF nie mògą ù swòjich farwów: \\'Pòzwòlë stronóm wëbierac swòje farwë\\' je wëłączoné w przezérnikù.\ninvalid_password=Lëchô parola.\ntext_annotation_type.alt=[Adnotacjô {{type}}]\n\ntools.title=Tools\nfirst_page_label=Go to First Page\n\n\n"
  },
  {
    "path": "pages/include/pdf/locale/cy/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Tudalen Flaenorol\nprevious_label=Blaenorol\nnext.title=Tudalen Nesaf\nnext_label=Nesaf\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Tudalen\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=o {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} o {{pagesCount}})\n\nzoom_out.title=Chwyddo Allan\nzoom_out_label=Chwyddo Allan\nzoom_in.title=Chwyddo Mewn\nzoom_in_label=Chwyddo Mewn\nzoom.title=Chwyddo\npresentation_mode.title=Newid i'r Modd Cyflwyno\npresentation_mode_label=Modd Cyflwyno\nopen_file.title=Agor Ffeil\nopen_file_label=Agor\nprint.title=Argraffu\nprint_label=Argraffu\ndownload.title=Llwyth\ndownload_label=Llwytho i Lawr\nbookmark.title=Golwg cyfredol (copïo neu agor ffenestr newydd)\nbookmark_label=Golwg Gyfredol\n\n# Secondary toolbar and context menu\ntools.title=Offer\ntools_label=Offer\nfirst_page.title=Mynd i'r Dudalen Gyntaf\nfirst_page.label=Mynd i'r Dudalen Gyntaf\nfirst_page_label=Mynd i'r Dudalen Gyntaf\nlast_page.title=Mynd i'r Dudalen Olaf\nlast_page.label=Mynd i'r Dudalen Olaf\nlast_page_label=Mynd i'r Dudalen Olaf\npage_rotate_cw.title=Cylchdroi Clocwedd\npage_rotate_cw.label=Cylchdroi Clocwedd\npage_rotate_cw_label=Cylchdroi Clocwedd\npage_rotate_ccw.title=Cylchdroi Gwrthglocwedd\npage_rotate_ccw.label=Cylchdroi Gwrthglocwedd\npage_rotate_ccw_label=Cylchdroi Gwrthglocwedd\n\ncursor_text_select_tool.title=Galluogi Dewis Offeryn Testun\ncursor_text_select_tool_label=Offeryn Dewis Testun\ncursor_hand_tool.title=Galluogi Offeryn Llaw\ncursor_hand_tool_label=Offeryn Llaw\n\n# Document properties dialog box\ndocument_properties.title=Priodweddau Dogfen…\ndocument_properties_label=Priodweddau Dogfen…\ndocument_properties_file_name=Enw ffeil:\ndocument_properties_file_size=Maint ffeil:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} beit)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} beit)\ndocument_properties_title=Teitl:\ndocument_properties_author=Awdur:\ndocument_properties_subject=Pwnc:\ndocument_properties_keywords=Allweddair:\ndocument_properties_creation_date=Dyddiad Creu:\ndocument_properties_modification_date=Dyddiad Addasu:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Crewr:\ndocument_properties_producer=Cynhyrchydd PDF:\ndocument_properties_version=Fersiwn PDF:\ndocument_properties_page_count=Cyfrif Tudalen:\ndocument_properties_close=Cau\n\nprint_progress_message=Paratoi dogfen ar gyfer ei hargraffu…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Diddymu\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toglo'r Bar Ochr\ntoggle_sidebar_notification.title=Toglo'r Bar Ochr (mae'r ddogfen yn cynnwys outline/attachments)\ntoggle_sidebar_label=Toglo'r Bar Ochr\ndocument_outline.title=Dangos Amlinell Dogfen (clic dwbl i ymestyn/cau pob eitem)\ndocument_outline_label=Amlinelliad Dogfen\nattachments.title=Dangos Atodiadau\nattachments_label=Atodiadau\nthumbs.title=Dangos Lluniau Bach\nthumbs_label=Lluniau Bach\nfindbar.title=Canfod yn y Ddogfen\nfindbar_label=Canfod\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Tudalen {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Llun Bach Tudalen {{page}}\n\n# Find panel button title and messages\nfind_input.title=Canfod\nfind_input.placeholder=Canfod yn y ddogfen…\nfind_previous.title=Canfod enghraifft flaenorol o'r ymadrodd\nfind_previous_label=Blaenorol\nfind_next.title=Canfod enghraifft nesaf yr ymadrodd\nfind_next_label=Nesaf\nfind_highlight=Amlygu popeth\nfind_match_case_label=Cydweddu maint\nfind_reached_top=Wedi cyrraedd brig y dudalen, parhau o'r gwaelod\nfind_reached_bottom=Wedi cyrraedd diwedd y dudalen, parhau o'r brig\nfind_not_found=Heb ganfod ymadrodd\n\n# Error panel labels\nerror_more_info=Rhagor o Wybodaeth\nerror_less_info=Llai o wybodaeth\nerror_close=Cau\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Neges: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stac: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ffeil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Llinell: {{line}}\nrendering_error=Digwyddodd gwall wrth adeiladu'r dudalen.\n\n# Predefined zoom values\npage_scale_width=Lled Tudalen\npage_scale_fit=Ffit Tudalen\npage_scale_auto=Chwyddo Awtomatig\npage_scale_actual=Maint Gwirioneddol\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Gwall\nloading_error=Digwyddodd gwall wrth lwytho'r PDF.\ninvalid_file_error=Ffeil PDF annilys neu llwgr.\nmissing_file_error=Ffeil PDF coll.\nunexpected_response_error=Ymateb annisgwyl gan y gweinydd.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anodiad {{type}} ]\npassword_label=Rhowch gyfrinair i agor y PDF.\npassword_invalid=Cyfrinair annilys. Ceisiwch eto.\npassword_ok=Iawn\npassword_cancel=Diddymu\n\nprinting_not_supported=Rhybudd: Nid yw argraffu yn cael ei gynnal yn llawn gan y porwr.\nprinting_not_ready=Rhybudd: Nid yw'r PDF wedi ei lwytho'n llawn ar gyfer argraffu.\nweb_fonts_disabled=Ffontiau gwe wedi eu hanalluogi: methu defnyddio ffontiau PDF mewnblanedig.\ndocument_colors_not_allowed=Nid oes caniatâd i ddogfennau PDF i ddefnyddio eu lliwiau eu hunain: Mae “Caniatáu i dudalennau ddefnyddio eu lliwiau eu hunain” wedi ei atal yn y porwr.\n"
  },
  {
    "path": "pages/include/pdf/locale/da/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Forrige side\nprevious_label=Forrige\nnext.title=Næste side\nnext_label=Næste\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Side\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=af {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} af {{pagesCount}})\n\nzoom_out.title=Zoom ud\nzoom_out_label=Zoom ud\nzoom_in.title=Zoom ind\nzoom_in_label=Zoom ind\nzoom.title=Zoom\nprint.title=Udskriv\nprint_label=Udskriv\npresentation_mode.title=Skift til fuldskærmsvisning\npresentation_mode_label=Fuldskærmsvisning\nopen_file.title=Åbn fil\nopen_file_label=Åbn\ndownload.title=Hent\ndownload_label=Hent\nbookmark.title=Aktuel visning (kopier eller åbn i et nyt vindue)\nbookmark_label=Aktuel visning\n\n# Secondary toolbar and context menu\ntools.title=Funktioner\ntools_label=Funktioner\nfirst_page.title=Gå til første side\nfirst_page.label=Gå til første side\nfirst_page_label=Gå til første side\nlast_page.title=Gå til sidste side\nlast_page.label=Gå til sidste side\nlast_page_label=Gå til sidste side\npage_rotate_cw.title=Roter med uret\npage_rotate_cw.label=Roter med uret\npage_rotate_cw_label=Roter med uret\npage_rotate_ccw.title=Roter mod uret\npage_rotate_ccw.label=Roter mod uret\npage_rotate_ccw_label=Roter mod uret\n\ncursor_text_select_tool.title=Aktiver markeringsværktøj\ncursor_text_select_tool_label=Markeringsværktøj\ncursor_hand_tool.title=Aktiver håndværktøj\ncursor_hand_tool_label=Håndværktøj\n\n# Document properties dialog box\ndocument_properties.title=Dokumentegenskaber…\ndocument_properties_label=Dokumentegenskaber…\ndocument_properties_file_name=Filnavn:\ndocument_properties_file_size=Filstørrelse:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Forfatter:\ndocument_properties_subject=Emne:\ndocument_properties_keywords=Nøgleord:\ndocument_properties_creation_date=Oprettet:\ndocument_properties_modification_date=Redigeret:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Program:\ndocument_properties_producer=PDF-producent:\ndocument_properties_version=PDF-version:\ndocument_properties_page_count=Antal sider:\ndocument_properties_close=Luk\n\nprint_progress_message=Forbereder dokument til udskrivning…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Annuller\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Slå sidepanel til eller fra\ntoggle_sidebar_notification.title=Slå sidepanel til eller fra (dokumentet indeholder disposition/vedhæftede filer)\ntoggle_sidebar_label=Slå sidepanel til eller fra\ndocument_outline.title=Vis dokumentets disposition (dobbeltklik for at vise/skjule alle elementer)\ndocument_outline_label=Dokument-disposition\nattachments.title=Vis vedhæftede filer\nattachments_label=Vedhæftede filer\nthumbs.title=Vis miniaturer\nthumbs_label=Miniaturer\nfindbar.title=Find i dokument\nfindbar_label=Find\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Side {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniature af side {{page}}\n\n# Find panel button title and messages\nfind_input.title=Find\nfind_input.placeholder=Find i dokument…\nfind_previous.title=Find den forrige forekomst\nfind_previous_label=Forrige\nfind_next.title=Find den næste forekomst\nfind_next_label=Næste\nfind_highlight=Fremhæv alle\nfind_match_case_label=Forskel på store og små bogstaver\nfind_reached_top=Toppen af siden blev nået, fortsatte fra bunden\nfind_reached_bottom=Bunden af siden blev nået, fortsatte fra toppen\nfind_not_found=Der blev ikke fundet noget\n\n# Error panel labels\nerror_more_info=Mere information\nerror_less_info=Mindre information\nerror_close=Luk\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Fejlmeddelelse: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linje: {{line}}\nrendering_error=Der opstod en fejl ved generering af siden.\n\n# Predefined zoom values\npage_scale_width=Sidebredde\npage_scale_fit=Tilpas til side\npage_scale_auto=Automatisk zoom\npage_scale_actual=Faktisk størrelse\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Fejl\nloading_error=Der opstod en fejl ved indlæsning af PDF-filen.\ninvalid_file_error=PDF-filen er ugyldig eller ødelagt.\nmissing_file_error=Manglende PDF-fil.\nunexpected_response_error=Uventet svar fra serveren.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}kommentar]\npassword_label=Angiv adgangskode til at åbne denne PDF-fil.\npassword_invalid=Ugyldig adgangskode. Prøv igen.\npassword_ok=OK\npassword_cancel=Fortryd\n\nprinting_not_supported=Advarsel: Udskrivning er ikke fuldt understøttet af browseren.\nprinting_not_ready=Advarsel: PDF-filen er ikke fuldt indlæst til udskrivning.\nweb_fonts_disabled=Webskrifttyper er deaktiverede. De indlejrede skrifttyper i PDF-filen kan ikke anvendes.\ndocument_colors_not_allowed=PDF-dokumenter må ikke bruge deres egne farver: 'Tillad sider at vælge deres egne farver' er deaktiveret i browseren.\n"
  },
  {
    "path": "pages/include/pdf/locale/de/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Eine Seite zurück\nprevious_label=Zurück\nnext.title=Eine Seite vor\nnext_label=Vor\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Seite\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=von {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} von {{pagesCount}})\n\nzoom_out.title=Verkleinern\nzoom_out_label=Verkleinern\nzoom_in.title=Vergrößern\nzoom_in_label=Vergrößern\nzoom.title=Zoom\nprint.title=Drucken\nprint_label=Drucken\npresentation_mode.title=In Präsentationsmodus wechseln\npresentation_mode_label=Präsentationsmodus\nopen_file.title=Datei öffnen\nopen_file_label=Öffnen\ndownload.title=Dokument speichern\ndownload_label=Speichern\nbookmark.title=Aktuelle Ansicht (zum Kopieren oder Öffnen in einem neuen Fenster)\nbookmark_label=Aktuelle Ansicht\n\n# Secondary toolbar and context menu\ntools.title=Werkzeuge\ntools_label=Werkzeuge\nfirst_page.title=Erste Seite anzeigen\nfirst_page.label=Erste Seite anzeigen\nfirst_page_label=Erste Seite anzeigen\nlast_page.title=Letzte Seite anzeigen\nlast_page.label=Letzte Seite anzeigen\nlast_page_label=Letzte Seite anzeigen\npage_rotate_cw.title=Im Uhrzeigersinn drehen\npage_rotate_cw.label=Im Uhrzeigersinn drehen\npage_rotate_cw_label=Im Uhrzeigersinn drehen\npage_rotate_ccw.title=Gegen Uhrzeigersinn drehen\npage_rotate_ccw.label=Gegen Uhrzeigersinn drehen\npage_rotate_ccw_label=Gegen Uhrzeigersinn drehen\n\ncursor_text_select_tool.title=Textauswahl-Werkzeug aktivieren\ncursor_text_select_tool_label=Textauswahl-Werkzeug\ncursor_hand_tool.title=Hand-Werkzeug aktivieren\ncursor_hand_tool_label=Hand-Werkzeug\n\n# Document properties dialog box\ndocument_properties.title=Dokumenteigenschaften\ndocument_properties_label=Dokumenteigenschaften…\ndocument_properties_file_name=Dateiname:\ndocument_properties_file_size=Dateigröße:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} Bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} Bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Autor:\ndocument_properties_subject=Thema:\ndocument_properties_keywords=Stichwörter:\ndocument_properties_creation_date=Erstelldatum:\ndocument_properties_modification_date=Bearbeitungsdatum:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}} {{time}}\ndocument_properties_creator=Anwendung:\ndocument_properties_producer=PDF erstellt mit:\ndocument_properties_version=PDF-Version:\ndocument_properties_page_count=Seitenzahl:\ndocument_properties_close=Schließen\n\nprint_progress_message=Dokument wird für Drucken vorbereitet…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Abbrechen\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Sidebar umschalten\ntoggle_sidebar_notification.title=Sidebar umschalten (Dokument enthält Dokumentstruktur/Anhänge)\ntoggle_sidebar_label=Sidebar umschalten\ndocument_outline.title=Dokumentstruktur anzeigen (Doppelklicken, um alle Einträge aus- bzw. einzuklappen)\ndocument_outline_label=Dokumentstruktur\nattachments.title=Anhänge anzeigen\nattachments_label=Anhänge\nthumbs.title=Miniaturansichten anzeigen\nthumbs_label=Miniaturansichten\nfindbar.title=Dokument durchsuchen\nfindbar_label=Suchen\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Seite {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniaturansicht von Seite {{page}}\n\n# Find panel button title and messages\nfind_input.title=Suchen\nfind_input.placeholder=Im Dokument suchen…\nfind_previous.title=Vorheriges Vorkommen des Suchbegriffs finden\nfind_previous_label=Zurück\nfind_next.title=Nächstes Vorkommen des Suchbegriffs finden\nfind_next_label=Weiter\nfind_highlight=Alle hervorheben\nfind_match_case_label=Groß-/Kleinschreibung beachten\nfind_reached_top=Anfang des Dokuments erreicht, fahre am Ende fort\nfind_reached_bottom=Ende des Dokuments erreicht, fahre am Anfang fort\nfind_not_found=Suchbegriff nicht gefunden\n\n# Error panel labels\nerror_more_info=Mehr Informationen\nerror_less_info=Weniger Informationen\nerror_close=Schließen\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js Version {{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Nachricht: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Aufrufliste: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Datei: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Zeile: {{line}}\nrendering_error=Beim Darstellen der Seite trat ein Fehler auf.\n\n# Predefined zoom values\npage_scale_width=Seitenbreite\npage_scale_fit=Seitengröße\npage_scale_auto=Automatischer Zoom\npage_scale_actual=Originalgröße\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Fehler\nloading_error=Beim Laden der PDF-Datei trat ein Fehler auf.\ninvalid_file_error=Ungültige oder beschädigte PDF-Datei\nmissing_file_error=Fehlende PDF-Datei\nunexpected_response_error=Unerwartete Antwort des Servers\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anlage: {{type}}]\npassword_label=Geben Sie zum Öffnen der PDF-Datei deren Passwort ein.\npassword_invalid=Falsches Passwort. Bitte versuchen Sie es erneut.\npassword_ok=OK\npassword_cancel=Abbrechen\n\nprinting_not_supported=Warnung: Die Drucken-Funktion wird durch diesen Browser nicht vollständig unterstützt.\nprinting_not_ready=Warnung: Die PDF-Datei ist nicht vollständig geladen, dies ist für das Drucken aber empfohlen.\nweb_fonts_disabled=Web-Schriftarten sind deaktiviert: Eingebettete PDF-Schriftarten konnten nicht geladen werden.\ndocument_colors_not_allowed=PDF-Dokumenten ist es nicht erlaubt, ihre eigenen Farben zu verwenden: 'Seiten das Verwenden von eigenen Farben erlauben' ist im Browser deaktiviert.\n"
  },
  {
    "path": "pages/include/pdf/locale/el/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Προηγούμενη σελίδα\nprevious_label=Προηγούμενη\nnext.title=Επόμενη σελίδα\nnext_label=Επόμενη\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Σελίδα\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=από {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} από {{pagesCount}})\n\nzoom_out.title=Σμίκρυνση\nzoom_out_label=Σμίκρυνση\nzoom_in.title=Μεγέθυνση\nzoom_in_label=Μεγέθυνση\nzoom.title=Ζουμ\npresentation_mode.title=Εναλλαγή σε λειτουργία παρουσίασης\npresentation_mode_label=Λειτουργία παρουσίασης\nopen_file.title=Άνοιγμα αρχείου\nopen_file_label=Άνοιγμα\nprint.title=Εκτύπωση\nprint_label=Εκτύπωση\ndownload.title=Λήψη\ndownload_label=Λήψη\nbookmark.title=Τρέχουσα προβολή (αντιγραφή ή άνοιγμα σε νέο παράθυρο)\nbookmark_label=Τρέχουσα προβολή\n\n# Secondary toolbar and context menu\ntools.title=Εργαλεία\ntools_label=Εργαλεία\nfirst_page.title=Μετάβαση στην πρώτη σελίδα\nfirst_page.label=Μετάβαση στην πρώτη σελίδα\nfirst_page_label=Μετάβαση στην πρώτη σελίδα\nlast_page.title=Μετάβαση στην τελευταία σελίδα\nlast_page.label=Μετάβαση στην τελευταία σελίδα\nlast_page_label=Μετάβαση στην τελευταία σελίδα\npage_rotate_cw.title=Δεξιόστροφη περιστροφή\npage_rotate_cw.label=Δεξιόστροφη περιστροφή\npage_rotate_cw_label=Δεξιόστροφη περιστροφή\npage_rotate_ccw.title=Αριστερόστροφη περιστροφή\npage_rotate_ccw.label=Αριστερόστροφη περιστροφή\npage_rotate_ccw_label=Αριστερόστροφη περιστροφή\n\ncursor_text_select_tool.title=Ενεργοποίηση εργαλείου επιλογής κειμένου\ncursor_text_select_tool_label=Εργαλείο επιλογής κειμένου\ncursor_hand_tool.title=Ενεργοποίηση εργαλείου χεριού\ncursor_hand_tool_label=Εργαλείο χεριού\n\n# Document properties dialog box\ndocument_properties.title=Ιδιότητες εγγράφου…\ndocument_properties_label=Ιδιότητες εγγράφου…\ndocument_properties_file_name=Όνομα αρχείου:\ndocument_properties_file_size=Μέγεθος αρχείου:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Τίτλος:\ndocument_properties_author=Συγγραφέας:\ndocument_properties_subject=Θέμα:\ndocument_properties_keywords=Λέξεις κλειδιά:\ndocument_properties_creation_date=Ημερομηνία δημιουργίας:\ndocument_properties_modification_date=Ημερομηνία τροποποίησης:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Δημιουργός:\ndocument_properties_producer=Παραγωγός PDF:\ndocument_properties_version=Έκδοση PDF:\ndocument_properties_page_count=Αριθμός σελίδων:\ndocument_properties_close=Κλείσιμο\n\nprint_progress_message=Προετοιμασία του εγγράφου για εκτύπωση…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Άκυρο\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=(Απ)ενεργοποίηση πλευρικής στήλης\ntoggle_sidebar_notification.title=(Απ)ενεργοποίηση πλευρικής στήλης (το έγγραφο περιέχει περίγραμμα/συνημμένα)\ntoggle_sidebar_label=(Απ)ενεργοποίηση πλευρικής στήλης\ndocument_outline.title=Εμφάνιση διάρθρωσης εγγράφου (διπλό κλικ για ανάπτυξη/σύμπτυξη όλων των στοιχείων)\ndocument_outline_label=Διάρθρωση εγγράφου\nattachments.title=Προβολή συνημμένων\nattachments_label=Συνημμένα\nthumbs.title=Προβολή μικρογραφιών\nthumbs_label=Μικρογραφίες\nfindbar.title=Εύρεση στο έγγραφο\nfindbar_label=Εύρεση\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Σελίδα {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Μικρογραφία της σελίδας {{page}}\n\n# Find panel button title and messages\nfind_input.title=Εύρεση\nfind_input.placeholder=Εύρεση στο έγγραφο…\nfind_previous.title=Εύρεση της προηγούμενης εμφάνισης της φράσης\nfind_previous_label=Προηγούμενο\nfind_next.title=Εύρεση της επόμενης εμφάνισης της φράσης\nfind_next_label=Επόμενο\nfind_highlight=Επισήμανση όλων\nfind_match_case_label=Ταίριασμα χαρακτήρα\nfind_reached_top=Έλευση στην αρχή του εγγράφου, συνέχεια από το τέλος\nfind_reached_bottom=Έλευση στο τέλος του εγγράφου, συνέχεια από την αρχή\nfind_not_found=Η φράση δεν βρέθηκε\n\n# Error panel labels\nerror_more_info=Περισσότερες πληροφορίες\nerror_less_info=Λιγότερες πληροφορίες\nerror_close=Κλείσιμο\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Μήνυμα: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Στοίβα: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Αρχείο: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Γραμμή: {{line}}\nrendering_error=Προέκυψε σφάλμα κατά την ανάλυση της σελίδας.\n\n# Predefined zoom values\npage_scale_width=Πλάτος σελίδας\npage_scale_fit=Μέγεθος σελίδας\npage_scale_auto=Αυτόματο ζουμ\npage_scale_actual=Πραγματικό μέγεθος\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Σφάλμα\nloading_error=Προέκυψε ένα σφάλμα κατά τη φόρτωση του PDF.\ninvalid_file_error=Μη έγκυρο ή κατεστραμμένο αρχείο PDF.\nmissing_file_error=Λείπει αρχείο PDF.\nunexpected_response_error=Μη αναμενόμενη απόκριση από το διακομιστή.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Σχόλιο]\npassword_label=Εισαγωγή κωδικού για το άνοιγμα του PDF αρχείου.\npassword_invalid=Μη έγκυρος κωδικός. Προσπαθείστε ξανά.\npassword_ok=ΟΚ\npassword_cancel=Ακύρωση\n\nprinting_not_supported=Προειδοποίηση: Η εκτύπωση δεν υποστηρίζεται πλήρως από αυτόν τον περιηγητή.\nprinting_not_ready=Προειδοποίηση: Το PDF δεν φορτώθηκε πλήρως για εκτύπωση.\nweb_fonts_disabled=Οι γραμματοσειρές Web απενεργοποιημένες: αδυναμία χρήσης των ενσωματωμένων γραμματοσειρών PDF.\ndocument_colors_not_allowed=Στα PDF έγγραφα δεν επιτρέπεται να χρησιμοποιούν τα δικά τους χρώματα: Το “Να επιτρέπεται στις σελίδες να επιλέγουν τα δικά τους χρώματα” είναι απενεργοποιημένο στον περιηγητή.\n"
  },
  {
    "path": "pages/include/pdf/locale/en-GB/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Previous Page\nprevious_label=Previous\nnext.title=Next Page\nnext_label=Next\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Page\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=of {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=Zoom Out\nzoom_out_label=Zoom Out\nzoom_in.title=Zoom In\nzoom_in_label=Zoom In\nzoom.title=Zoom\npresentation_mode.title=Switch to Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Open File\nopen_file_label=Open\nprint.title=Print\nprint_label=Print\ndownload.title=Download\ndownload_label=Download\nbookmark.title=Current view (copy or open in new window)\nbookmark_label=Current View\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Go to First Page\nfirst_page.label=Go to First Page\nfirst_page_label=Go to First Page\nlast_page.title=Go to Last Page\nlast_page.label=Go to Last Page\nlast_page_label=Go to Last Page\npage_rotate_cw.title=Rotate Clockwise\npage_rotate_cw.label=Rotate Clockwise\npage_rotate_cw_label=Rotate Clockwise\npage_rotate_ccw.title=Rotate Anti-Clockwise\npage_rotate_ccw.label=Rotate Anti-Clockwise\npage_rotate_ccw_label=Rotate Anti-Clockwise\n\ncursor_text_select_tool.title=Enable Text Selection Tool\ncursor_text_select_tool_label=Text Selection Tool\ncursor_hand_tool.title=Enable Hand Tool\ncursor_hand_tool_label=Hand Tool\n\n# Document properties dialog box\ndocument_properties.title=Document Properties…\ndocument_properties_label=Document Properties…\ndocument_properties_file_name=File name:\ndocument_properties_file_size=File size:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Title:\ndocument_properties_author=Author:\ndocument_properties_subject=Subject:\ndocument_properties_keywords=Keywords:\ndocument_properties_creation_date=Creation Date:\ndocument_properties_modification_date=Modification Date:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creator:\ndocument_properties_producer=PDF Producer:\ndocument_properties_version=PDF Version:\ndocument_properties_page_count=Page Count:\ndocument_properties_close=Close\n\nprint_progress_message=Preparing document for printing…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancel\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggle Sidebar\ntoggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)\ntoggle_sidebar_label=Toggle Sidebar\ndocument_outline.title=Show Document Outline (double-click to expand/collapse all items)\ndocument_outline_label=Document Outline\nattachments.title=Show Attachments\nattachments_label=Attachments\nthumbs.title=Show Thumbnails\nthumbs_label=Thumbnails\nfindbar.title=Find in Document\nfindbar_label=Find\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail of Page {{page}}\n\n# Find panel button title and messages\nfind_input.title=Find\nfind_input.placeholder=Find in document…\nfind_previous.title=Find the previous occurrence of the phrase\nfind_previous_label=Previous\nfind_next.title=Find the next occurrence of the phrase\nfind_next_label=Next\nfind_highlight=Highlight all\nfind_match_case_label=Match case\nfind_reached_top=Reached top of document, continued from bottom\nfind_reached_bottom=Reached end of document, continued from top\nfind_not_found=Phrase not found\n\n# Error panel labels\nerror_more_info=More Information\nerror_less_info=Less Information\nerror_close=Close\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=An error occurred while rendering the page.\n\n# Predefined zoom values\npage_scale_width=Page Width\npage_scale_fit=Page Fit\npage_scale_auto=Automatic Zoom\npage_scale_actual=Actual Size\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=An error occurred while loading the PDF.\ninvalid_file_error=Invalid or corrupted PDF file.\nmissing_file_error=Missing PDF file.\nunexpected_response_error=Unexpected server response.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Enter the password to open this PDF file.\npassword_invalid=Invalid password. Please try again.\npassword_ok=OK\npassword_cancel=Cancel\n\nprinting_not_supported=Warning: Printing is not fully supported by this browser.\nprinting_not_ready=Warning: The PDF is not fully loaded for printing.\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\ndocument_colors_not_allowed=PDF documents are not allowed to use their own colours: “Allow pages to choose their own colours” is deactivated in the browser.\n"
  },
  {
    "path": "pages/include/pdf/locale/en-US/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Previous Page\nprevious_label=Previous\nnext.title=Next Page\nnext_label=Next\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Page\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=of {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=Zoom Out\nzoom_out_label=Zoom Out\nzoom_in.title=Zoom In\nzoom_in_label=Zoom In\nzoom.title=Zoom\npresentation_mode.title=Switch to Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Open File\nopen_file_label=Open\nprint.title=Print\nprint_label=Print\ndownload.title=Download\ndownload_label=Download\nbookmark.title=Current view (copy or open in new window)\nbookmark_label=Current View\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Go to First Page\nfirst_page.label=Go to First Page\nfirst_page_label=Go to First Page\nlast_page.title=Go to Last Page\nlast_page.label=Go to Last Page\nlast_page_label=Go to Last Page\npage_rotate_cw.title=Rotate Clockwise\npage_rotate_cw.label=Rotate Clockwise\npage_rotate_cw_label=Rotate Clockwise\npage_rotate_ccw.title=Rotate Counterclockwise\npage_rotate_ccw.label=Rotate Counterclockwise\npage_rotate_ccw_label=Rotate Counterclockwise\n\ncursor_text_select_tool.title=Enable Text Selection Tool\ncursor_text_select_tool_label=Text Selection Tool\ncursor_hand_tool.title=Enable Hand Tool\ncursor_hand_tool_label=Hand Tool\n\n# Document properties dialog box\ndocument_properties.title=Document Properties…\ndocument_properties_label=Document Properties…\ndocument_properties_file_name=File name:\ndocument_properties_file_size=File size:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Title:\ndocument_properties_author=Author:\ndocument_properties_subject=Subject:\ndocument_properties_keywords=Keywords:\ndocument_properties_creation_date=Creation Date:\ndocument_properties_modification_date=Modification Date:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creator:\ndocument_properties_producer=PDF Producer:\ndocument_properties_version=PDF Version:\ndocument_properties_page_count=Page Count:\ndocument_properties_close=Close\n\nprint_progress_message=Preparing document for printing…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancel\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggle Sidebar\ntoggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)\ntoggle_sidebar_label=Toggle Sidebar\ndocument_outline.title=Show Document Outline (double-click to expand/collapse all items)\ndocument_outline_label=Document Outline\nattachments.title=Show Attachments\nattachments_label=Attachments\nthumbs.title=Show Thumbnails\nthumbs_label=Thumbnails\nfindbar.title=Find in Document\nfindbar_label=Find\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail of Page {{page}}\n\n# Find panel button title and messages\nfind_input.title=Find\nfind_input.placeholder=Find in document…\nfind_previous.title=Find the previous occurrence of the phrase\nfind_previous_label=Previous\nfind_next.title=Find the next occurrence of the phrase\nfind_next_label=Next\nfind_highlight=Highlight all\nfind_match_case_label=Match case\nfind_reached_top=Reached top of document, continued from bottom\nfind_reached_bottom=Reached end of document, continued from top\nfind_not_found=Phrase not found\n\n# Error panel labels\nerror_more_info=More Information\nerror_less_info=Less Information\nerror_close=Close\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=An error occurred while rendering the page.\n\n# Predefined zoom values\npage_scale_width=Page Width\npage_scale_fit=Page Fit\npage_scale_auto=Automatic Zoom\npage_scale_actual=Actual Size\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=An error occurred while loading the PDF.\ninvalid_file_error=Invalid or corrupted PDF file.\nmissing_file_error=Missing PDF file.\nunexpected_response_error=Unexpected server response.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Enter the password to open this PDF file.\npassword_invalid=Invalid password. Please try again.\npassword_ok=OK\npassword_cancel=Cancel\n\nprinting_not_supported=Warning: Printing is not fully supported by this browser.\nprinting_not_ready=Warning: The PDF is not fully loaded for printing.\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\ndocument_colors_not_allowed=PDF documents are not allowed to use their own colors: “Allow pages to choose their own colors” is deactivated in the browser.\n"
  },
  {
    "path": "pages/include/pdf/locale/en-ZA/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Previous Page\nprevious_label=Previous\nnext.title=Next Page\nnext_label=Next\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=of {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Zoom Out\nzoom_out_label=Zoom Out\nzoom_in.title=Zoom In\nzoom_in_label=Zoom In\nzoom.title=Zoom\npresentation_mode.title=Switch to Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Open File\nopen_file_label=Open\nprint.title=Print\nprint_label=Print\ndownload.title=Download\ndownload_label=Download\nbookmark.title=Current view (copy or open in new window)\nbookmark_label=Current View\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Go to First Page\nfirst_page.label=Go to First Page\nfirst_page_label=Go to First Page\nlast_page.title=Go to Last Page\nlast_page.label=Go to Last Page\nlast_page_label=Go to Last Page\npage_rotate_cw.title=Rotate Clockwise\npage_rotate_cw.label=Rotate Clockwise\npage_rotate_cw_label=Rotate Clockwise\npage_rotate_ccw.title=Rotate Counterclockwise\npage_rotate_ccw.label=Rotate Counterclockwise\npage_rotate_ccw_label=Rotate Counterclockwise\n\n\n# Document properties dialog box\ndocument_properties.title=Document Properties…\ndocument_properties_label=Document Properties…\ndocument_properties_file_name=File name:\ndocument_properties_file_size=File size:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Title:\ndocument_properties_author=Author:\ndocument_properties_subject=Subject:\ndocument_properties_keywords=Keywords:\ndocument_properties_creation_date=Creation Date:\ndocument_properties_modification_date=Modification Date:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creator:\ndocument_properties_producer=PDF Producer:\ndocument_properties_version=PDF Version:\ndocument_properties_page_count=Page Count:\ndocument_properties_close=Close\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggle Sidebar\ntoggle_sidebar_label=Toggle Sidebar\ndocument_outline.title=Show Document Outline (double-click to expand/collapse all items)\ndocument_outline_label=Document Outline\nattachments.title=Show Attachments\nattachments_label=Attachments\nthumbs.title=Show Thumbnails\nthumbs_label=Thumbnails\nfindbar.title=Find in Document\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail of Page {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Find the previous occurrence of the phrase\nfind_previous_label=Previous\nfind_next.title=Find the next occurrence of the phrase\nfind_next_label=Next\nfind_highlight=Highlight all\nfind_match_case_label=Match case\nfind_reached_top=Reached top of document, continued from bottom\nfind_reached_bottom=Reached end of document, continued from top\nfind_not_found=Phrase not found\n\n# Error panel labels\nerror_more_info=More Information\nerror_less_info=Less Information\nerror_close=Close\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Line: {{line}}\nrendering_error=An error occurred while rendering the page.\n\n# Predefined zoom values\npage_scale_width=Page Width\npage_scale_fit=Page Fit\npage_scale_auto=Automatic Zoom\npage_scale_actual=Actual Size\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=An error occurred while loading the PDF.\ninvalid_file_error=Invalid or corrupted PDF file.\nmissing_file_error=Missing PDF file.\nunexpected_response_error=Unexpected server response.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Enter the password to open this PDF file.\npassword_invalid=Invalid password. Please try again.\npassword_ok=OK\n\nprinting_not_supported=Warning: Printing is not fully supported by this browser.\nprinting_not_ready=Warning: The PDF is not fully loaded for printing.\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\ndocument_colors_not_allowed=PDF documents are not allowed to use their own colours: “Allow pages to choose their own colours” is deactivated in the browser.\n"
  },
  {
    "path": "pages/include/pdf/locale/eo/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Antaŭa paĝo\nprevious_label=Malantaŭen\nnext.title=Venonta paĝo\nnext_label=Antaŭen\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Paĝo\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=el {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} el {{pagesCount}})\n\nzoom_out.title=Malpligrandigi\nzoom_out_label=Malpligrandigi\nzoom_in.title=Pligrandigi\nzoom_in_label=Pligrandigi\nzoom.title=Pligrandigilo\npresentation_mode.title=Iri al prezenta reĝimo\npresentation_mode_label=Prezenta reĝimo\nopen_file.title=Malfermi dosieron\nopen_file_label=Malfermi\nprint.title=Presi\nprint_label=Presi\ndownload.title=Elŝuti\ndownload_label=Elŝuti\nbookmark.title=Nuna vido (kopii aŭ malfermi en nova fenestro)\nbookmark_label=Nuna vido\n\n# Secondary toolbar and context menu\ntools.title=Iloj\ntools_label=Iloj\nfirst_page.title=Iri al la unua paĝo\nfirst_page.label=Iri al la unua paĝo\nfirst_page_label=Iri al la unua paĝo\nlast_page.title=Iri al la lasta paĝo\nlast_page.label=Iri al la lasta paĝo\nlast_page_label=Iri al la lasta paĝo\npage_rotate_cw.title=Rotaciigi dekstrume\npage_rotate_cw.label=Rotaciigi dekstrume\npage_rotate_cw_label=Rotaciigi dekstrume\npage_rotate_ccw.title=Rotaciigi maldekstrume\npage_rotate_ccw.label=Rotaciigi maldekstrume\npage_rotate_ccw_label=Rotaciigi maldekstrume\n\ncursor_text_select_tool.title=Aktivigi tekstan elektilon\ncursor_text_select_tool_label=Teksta elektilo\ncursor_hand_tool.title=Aktivigi ilon de mano\ncursor_hand_tool_label=Ilo de mano\n\n# Document properties dialog box\ndocument_properties.title=Atributoj de dokumento…\ndocument_properties_label=Atributoj de dokumento…\ndocument_properties_file_name=Nomo de dosiero:\ndocument_properties_file_size=Grado de dosiero:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KO ({{size_b}} oktetoj)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MO ({{size_b}} oktetoj)\ndocument_properties_title=Titolo:\ndocument_properties_author=Aŭtoro:\ndocument_properties_subject=Temo:\ndocument_properties_keywords=Ŝlosilvorto:\ndocument_properties_creation_date=Dato de kreado:\ndocument_properties_modification_date=Dato de modifo:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Kreinto:\ndocument_properties_producer=Produktinto de PDF:\ndocument_properties_version=Versio de PDF:\ndocument_properties_page_count=Nombro de paĝoj:\ndocument_properties_close=Fermi\n\nprint_progress_message=Preparo de dokumento por presi ĝin …\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Nuligi\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Montri/kaŝi flankan strion\ntoggle_sidebar_notification.title=Montri/kaŝi flankan strion (la dokumento enhavas konturon/aneksaĵojn)\ntoggle_sidebar_label=Montri/kaŝi flankan strion\ndocument_outline.title=Montri la konturon de dokumento (alklaku duoble por faldi/malfaldi ĉiujn elementojn)\ndocument_outline_label=Konturo de dokumento\nattachments.title=Montri kunsendaĵojn\nattachments_label=Kunsendaĵojn\nthumbs.title=Montri miniaturojn\nthumbs_label=Miniaturoj\nfindbar.title=Serĉi en dokumento\nfindbar_label=Serĉi\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Paĝo {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniaturo de paĝo {{page}}\n\n# Find panel button title and messages\nfind_input.title=Serĉi\nfind_input.placeholder=Serĉi en dokumento…\nfind_previous.title=Serĉi la antaŭan aperon de la frazo\nfind_previous_label=Malantaŭen\nfind_next.title=Serĉi la venontan aperon de la frazo\nfind_next_label=Antaŭen\nfind_highlight=Elstarigi ĉiujn\nfind_match_case_label=Distingi inter majuskloj kaj minuskloj\nfind_reached_top=Komenco de la dokumento atingita, daŭrigado ekde la fino\nfind_reached_bottom=Fino de la dokumento atingita, daŭrigado ekde la komenco\nfind_not_found=Frazo ne trovita\n\n# Error panel labels\nerror_more_info=Pli da informo\nerror_less_info=Mapli da informo\nerror_close=Fermi\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesaĝo: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stako: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Dosiero: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linio: {{line}}\nrendering_error=Okazis eraro dum la montrado de la paĝo.\n\n# Predefined zoom values\npage_scale_width=Larĝo de paĝo\npage_scale_fit=Adapti paĝon\npage_scale_auto=Aŭtomata skalo\npage_scale_actual=Reala gandeco\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Eraro\nloading_error=Okazis eraro dum la ŝargado de la PDF dosiero.\ninvalid_file_error=Nevalida aŭ difektita PDF dosiero.\nmissing_file_error=Mankas dosiero PDF.\nunexpected_response_error=Neatendita respondo de servilo.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Prinoto: {{type}}]\npassword_label=Tajpu pasvorton por malfermi tiun ĉi dosieron PDF.\npassword_invalid=Nevalida pasvorto. Bonvolu provi denove.\npassword_ok=Akcepti\npassword_cancel=Nuligi\n\nprinting_not_supported=Averto: tiu ĉi retumilo ne plene subtenas presadon.\nprinting_not_ready=Averto: La PDF dosiero ne estas plene ŝargita por presado.\nweb_fonts_disabled=Neaktivaj teksaĵaj tiparoj: ne elbas uzi enmetitajn tiparojn de PDF.\ndocument_colors_not_allowed=PDF dokumentoj ne rajtas uzi siajn proprajn kolorojn: 'Permesi al paĝoj uzi siajn proprajn kolorojn' ne estas aktiva en la retumilo.\n"
  },
  {
    "path": "pages/include/pdf/locale/es-AR/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Página siguiente\nnext_label=Siguiente\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Página\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=( {{pageNumber}} de {{pagesCount}} )\n\nzoom_out.title=Alejar\nzoom_out_label=Alejar\nzoom_in.title=Acercar\nzoom_in_label=Acercar\nzoom.title=Zoom\npresentation_mode.title=Cambiar a modo presentación\npresentation_mode_label=Modo presentación\nopen_file.title=Abrir archivo\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar o abrir en nueva ventana)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Herramientas\ntools_label=Herramientas\nfirst_page.title=Ir a primera página\nfirst_page.label=Ir a primera página\nfirst_page_label=Ir a primera página\nlast_page.title=Ir a última página\nlast_page.label=Ir a última página\nlast_page_label=Ir a última página\npage_rotate_cw.title=Rotar horario\npage_rotate_cw.label=Rotar horario\npage_rotate_cw_label=Rotar horario\npage_rotate_ccw.title=Rotar antihorario\npage_rotate_ccw.label=Rotar antihorario\npage_rotate_ccw_label=Rotar antihorario\n\ncursor_text_select_tool.title=Habilitar herramienta de selección de texto\ncursor_text_select_tool_label=Herramienta de selección de texto\ncursor_hand_tool.title=Habilitar herramienta mano\ncursor_hand_tool_label=Herramienta mano\n\n# Document properties dialog box\ndocument_properties.title=Propiedades del documento…\ndocument_properties_label=Propiedades del documento…\ndocument_properties_file_name=Nombre de archivo:\ndocument_properties_file_size=Tamaño de archovo:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asunto:\ndocument_properties_keywords=Palabras clave:\ndocument_properties_creation_date=Fecha de creación:\ndocument_properties_modification_date=Fecha de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=PDF Productor:\ndocument_properties_version=Versión de PDF:\ndocument_properties_page_count=Cantidad de páginas:\ndocument_properties_close=Cerrar\n\nprint_progress_message=Preparando documento para imprimir…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Alternar barra lateral\ntoggle_sidebar_notification.title=Intercambiar barra lateral (el documento contiene esquema/adjuntos)\ntoggle_sidebar_label=Alternar barra lateral\ndocument_outline.title=Mostrar esquema del documento (doble clic para expandir/colapsar todos los ítems)\ndocument_outline_label=Esquema del documento\nattachments.title=Mostrar adjuntos\nattachments_label=Adjuntos\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Buscar en documento\nfindbar_label=Buscar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de página {{page}}\n\n# Find panel button title and messages\nfind_input.title=Buscar\nfind_input.placeholder=Buscar en documento…\nfind_previous.title=Buscar la aparición anterior de la frase\nfind_previous_label=Anterior\nfind_next.title=Buscar la siguiente aparición de la frase\nfind_next_label=Siguiente\nfind_highlight=Resaltar todo\nfind_match_case_label=Coincidir mayúsculas\nfind_reached_top=Inicio de documento alcanzado, continuando desde abajo\nfind_reached_bottom=Fin de documento alcanzando, continuando desde arriba\nfind_not_found=Frase no encontrada\n\n# Error panel labels\nerror_more_info=Más información\nerror_less_info=Menos información\nerror_close=Cerrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaje: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Archivo: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Línea: {{line}}\nrendering_error=Ocurrió un error al dibujar la página.\n\n# Predefined zoom values\npage_scale_width=Ancho de página\npage_scale_fit=Ajustar página\npage_scale_auto=Zoom automático\npage_scale_actual=Tamaño real\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=Ocurrió un error al cargar el PDF.\ninvalid_file_error=Archivo PDF no válido o cocrrupto.\nmissing_file_error=Archivo PDF faltante.\nunexpected_response_error=Respuesta del servidor inesperada.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Anotación]\npassword_label=Ingrese la contraseña para abrir este archivo PDF\npassword_invalid=Contraseña inválida. Intente nuevamente.\npassword_ok=Aceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Advertencia: La impresión no está totalmente soportada por este navegador.\nprinting_not_ready=Advertencia: El PDF no está completamente cargado para impresión.\nweb_fonts_disabled=Tipografía web deshabilitada: no se pueden usar tipos incrustados en PDF.\ndocument_colors_not_allowed=Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las páginas elegir sus propios colores' está desactivado en el navegador.\n"
  },
  {
    "path": "pages/include/pdf/locale/es-CL/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Página siguiente\nnext_label=Siguiente\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Página\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Alejar\nzoom_out_label=Alejar\nzoom_in.title=Acercar\nzoom_in_label=Acercar\nzoom.title=Ampliación\npresentation_mode.title=Cambiar al modo de presentación\npresentation_mode_label=Modo de presentación\nopen_file.title=Abrir archivo\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar o abrir en nueva ventana)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Herramientas\ntools_label=Herramientas\nfirst_page.title=Ir a la primera página\nfirst_page.label=Ir a la primera página\nfirst_page_label=Ir a la primera página\nlast_page.title=Ir a la última página\nlast_page.label=Ir a la última página\nlast_page_label=Ir a la última página\npage_rotate_cw.title=Girar a la derecha\npage_rotate_cw.label=Girar a la derecha\npage_rotate_cw_label=Girar a la derecha\npage_rotate_ccw.title=Girar a la izquierda\npage_rotate_ccw.label=Girar a la izquierda\npage_rotate_ccw_label=Girar a la izquierda\n\ncursor_text_select_tool.title=Activar la herramienta de selección de texto\ncursor_text_select_tool_label=Herramienta de selección de texto\ncursor_hand_tool.title=Activar la herramienta de mano\ncursor_hand_tool_label=Herramienta de mano\n\n# Document properties dialog box\ndocument_properties.title=Propiedades del documento…\ndocument_properties_label=Propiedades del documento…\ndocument_properties_file_name=Nombre de archivo:\ndocument_properties_file_size=Tamaño del archivo:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asunto:\ndocument_properties_keywords=Palabras clave:\ndocument_properties_creation_date=Fecha de creación:\ndocument_properties_modification_date=Fecha de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=Productor del PDF:\ndocument_properties_version=Versión de PDF:\ndocument_properties_page_count=Cantidad de páginas:\ndocument_properties_close=Cerrar\n\nprint_progress_message=Preparando documento para impresión…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Barra lateral\ntoggle_sidebar_notification.title=Cambiar barra lateral (índice de contenidos del documento/adjuntos)\ntoggle_sidebar_label=Mostrar u ocultar la barra lateral\ndocument_outline.title=Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos)\ndocument_outline_label=Esquema del documento\nattachments.title=Mostrar adjuntos\nattachments_label=Adjuntos\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Buscar en el documento\nfindbar_label=Buscar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de la página {{page}}\n\n# Find panel button title and messages\nfind_input.title=Encontrar\nfind_input.placeholder=Encontrar en el documento…\nfind_previous.title=Buscar la aparición anterior de la frase\nfind_previous_label=Previo\nfind_next.title=Buscar la siguiente aparición de la frase\nfind_next_label=Siguiente\nfind_highlight=Destacar todos\nfind_match_case_label=Coincidir mayús./minús.\nfind_reached_top=Se alcanzó el inicio del documento, continuando desde el final\nfind_reached_bottom=Se alcanzó el final del documento, continuando desde el inicio\nfind_not_found=Frase no encontrada\n\n# Error panel labels\nerror_more_info=Más información\nerror_less_info=Menos información\nerror_close=Cerrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (compilación: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaje: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Archivo: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Línea: {{line}}\nrendering_error=Ha ocurrido un error al renderizar la página.\n\n# Predefined zoom values\npage_scale_width=Ancho de página\npage_scale_fit=Ajuste de página\npage_scale_auto=Aumento automático\npage_scale_actual=Tamaño actual\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=Ha ocurrido un error al cargar el PDF.\ninvalid_file_error=Archivo PDF inválido o corrupto.\nmissing_file_error=Falta el archivo PDF.\nunexpected_response_error=Respuesta del servidor inesperada.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Anotación]\npassword_label=Ingrese la contraseña para abrir este archivo PDF.\npassword_invalid=Contraseña inválida. Por favor, vuelve a intentarlo.\npassword_ok=Aceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Advertencia: Imprimir no está soportado completamente por este navegador.\nprinting_not_ready=Advertencia: El PDF no está completamente cargado para ser impreso.\nweb_fonts_disabled=Las tipografías web están desactivadas: imposible usar las fuentes PDF embebidas.\ndocument_colors_not_allowed=Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las páginas elegir sus propios colores' está desactivado en el navegador.\n"
  },
  {
    "path": "pages/include/pdf/locale/es-ES/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nprevious.title = Página anterior\nprevious_label = Anterior\nnext.title = Página siguiente\nnext_label = Siguiente\npage.title = Página\nof_pages = de {{pagesCount}}\npage_of_pages = ({{pageNumber}} de {{pagesCount}})\nzoom_out.title = Reducir\nzoom_out_label = Reducir\nzoom_in.title = Aumentar\nzoom_in_label = Aumentar\nzoom.title = Tamaño\npresentation_mode.title = Cambiar al modo presentación\npresentation_mode_label = Modo presentación\nopen_file.title = Abrir archivo\nopen_file_label = Abrir\nprint.title = Imprimir\nprint_label = Imprimir\ndownload.title = Descargar\ndownload_label = Descargar\nbookmark.title = Vista actual (copiar o abrir en una nueva ventana)\nbookmark_label = Vista actual\ntools.title = Herramientas\ntools_label = Herramientas\nfirst_page.title = Ir a la primera página\nfirst_page.label = Ir a la primera página\nfirst_page_label = Ir a la primera página\nlast_page.title = Ir a la última página\nlast_page.label = Ir a la última página\nlast_page_label = Ir a la última página\npage_rotate_cw.title = Rotar en sentido horario\npage_rotate_cw.label = Rotar en sentido horario\npage_rotate_cw_label = Rotar en sentido horario\npage_rotate_ccw.title = Rotar en sentido antihorario\npage_rotate_ccw.label = Rotar en sentido antihorario\npage_rotate_ccw_label = Rotar en sentido antihorario\ncursor_text_select_tool.title = Activar herramienta de selección de texto\ncursor_text_select_tool_label = Herramienta de selección de texto\ncursor_hand_tool.title = Activar herramienta de mano\ncursor_hand_tool_label = Herramienta de mano\ndocument_properties.title = Propiedades del documento…\ndocument_properties_label = Propiedades del documento…\ndocument_properties_file_name = Nombre de archivo:\ndocument_properties_file_size = Tamaño de archivo:\ndocument_properties_kb = {{size_kb}} KB ({{size_b}} bytes)\ndocument_properties_mb = {{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title = Título:\ndocument_properties_author = Autor:\ndocument_properties_subject = Asunto:\ndocument_properties_keywords = Palabras clave:\ndocument_properties_creation_date = Fecha de creación:\ndocument_properties_modification_date = Fecha de modificación:\ndocument_properties_date_string = {{date}}, {{time}}\ndocument_properties_creator = Creador:\ndocument_properties_producer = Productor PDF:\ndocument_properties_version = Versión PDF:\ndocument_properties_page_count = Número de páginas:\ndocument_properties_close = Cerrar\nprint_progress_message = Preparando documento para impresión…\nprint_progress_percent = {{progress}}%\nprint_progress_close = Cancelar\ntoggle_sidebar.title = Cambiar barra lateral\ntoggle_sidebar_notification.title = Alternar panel lateral (el documento contiene un esquema o adjuntos)\ntoggle_sidebar_label = Cambiar barra lateral\ndocument_outline.title = Mostrar resumen del documento (doble clic para expandir/contraer todos los elementos)\ndocument_outline_label = Resumen de documento\nattachments.title = Mostrar adjuntos\nattachments_label = Adjuntos\nthumbs.title = Mostrar miniaturas\nthumbs_label = Miniaturas\nfindbar.title = Buscar en el documento\nfindbar_label = Buscar\nthumb_page_title = Página {{page}}\nthumb_page_canvas = Miniatura de la página {{page}}\nfind_input.title = Buscar\nfind_input.placeholder = Buscar en el documento…\nfind_previous.title = Encontrar la anterior aparición de la frase\nfind_previous_label = Anterior\nfind_next.title = Encontrar la siguiente aparición de esta frase\nfind_next_label = Siguiente\nfind_highlight = Resaltar todos\nfind_match_case_label = Coincidencia de mayús./minús.\nfind_reached_top = Se alcanzó el inicio del documento, se continúa desde el final\nfind_reached_bottom = Se alcanzó el final del documento, se continúa desde el inicio\nfind_not_found = Frase no encontrada\nerror_more_info = Más información\nerror_less_info = Menos información\nerror_close = Cerrar\nerror_version_info = PDF.js v{{version}} (build: {{build}})\nerror_message = Mensaje: {{message}}\nerror_stack = Pila: {{stack}}\nerror_file = Archivo: {{file}}\nerror_line = Línea: {{line}}\nrendering_error = Ocurrió un error al renderizar la página.\npage_scale_width = Anchura de la página\npage_scale_fit = Ajuste de la página\npage_scale_auto = Tamaño automático\npage_scale_actual = Tamaño real\npage_scale_percent = {{scale}}%\nloading_error_indicator = Error\nloading_error = Ocurrió un error al cargar el PDF.\ninvalid_file_error = Fichero PDF no válido o corrupto.\nmissing_file_error = No hay fichero PDF.\nunexpected_response_error = Respuesta inesperada del servidor.\ntext_annotation_type.alt = [Anotación {{type}}]\npassword_label = Introduzca la contraseña para abrir este archivo PDF.\npassword_invalid = Contraseña no válida. Vuelva a intentarlo.\npassword_ok = Aceptar\npassword_cancel = Cancelar\nprinting_not_supported = Advertencia: Imprimir no está totalmente soportado por este navegador.\nprinting_not_ready = Advertencia: Este PDF no se ha cargado completamente para poder imprimirse.\nweb_fonts_disabled = Las tipografías web están desactivadas: es imposible usar las tipografías PDF embebidas.\ndocument_colors_not_allowed = Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las páginas elegir sus propios colores' está desactivado en el navegador.\n"
  },
  {
    "path": "pages/include/pdf/locale/es-MX/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Página siguiente\nnext_label=Siguiente\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Página\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Reducir\nzoom_out_label=Reducir\nzoom_in.title=Aumentar\nzoom_in_label=Aumentar\nzoom.title=Zoom\npresentation_mode.title=Cambiar al modo presentación\npresentation_mode_label=Modo presentación\nopen_file.title=Abrir archivo\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar o abrir en una nueva ventana)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Herramientas\ntools_label=Herramientas\nfirst_page.title=Ir a la primera página\nfirst_page.label=Ir a la primera página\nfirst_page_label=Ir a la primera página\nlast_page.title=Ir a la última página\nlast_page.label=Ir a la última página\nlast_page_label=Ir a la última página\npage_rotate_cw.title=Girar a la derecha\npage_rotate_cw.label=Girar a la derecha\npage_rotate_cw_label=Girar a la derecha\npage_rotate_ccw.title=Girar a la izquierda\npage_rotate_ccw.label=Girar a la izquierda\npage_rotate_ccw_label=Girar a la izquierda\n\ncursor_text_select_tool.title=Activar la herramienta de selección de texto\ncursor_text_select_tool_label=Herramienta de selección de texto\ncursor_hand_tool.title=Activar la herramienta de mano\ncursor_hand_tool_label=Herramienta de mano\n\n# Document properties dialog box\ndocument_properties.title=Propiedades del documento…\ndocument_properties_label=Propiedades del documento…\ndocument_properties_file_name=Nombre del archivo:\ndocument_properties_file_size=Tamaño del archivo:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asunto:\ndocument_properties_keywords=Palabras claves:\ndocument_properties_creation_date=Fecha de creación:\ndocument_properties_modification_date=Fecha de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creador:\ndocument_properties_producer=Productor PDF:\ndocument_properties_version=Versión PDF:\ndocument_properties_page_count=Número de páginas:\ndocument_properties_close=Cerrar\n\nprint_progress_message=Preparando documento para impresión…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Cambiar barra lateral\ntoggle_sidebar_notification.title=Cambiar barra lateral (índice de contenidos del documento/adjuntos)\ntoggle_sidebar_label=Cambiar barra lateral\ndocument_outline.title=Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos)\ndocument_outline_label=Esquema del documento\nattachments.title=Mostrar adjuntos\nattachments_label=Adjuntos\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Buscar en el documento\nfindbar_label=Buscar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura de la página {{page}}\n\n# Find panel button title and messages\nfind_input.title=Buscar\nfind_input.placeholder=Buscar en el documento…\nfind_previous.title=Ir a la anterior frase encontrada\nfind_previous_label=Anterior\nfind_next.title=Ir a la siguiente frase encontrada\nfind_next_label=Siguiente\nfind_highlight=Resaltar todo\nfind_match_case_label=Coincidir con mayúsculas y minúsculas\nfind_reached_top=Se alcanzó el inicio del documento, se buscará al final\nfind_reached_bottom=Se alcanzó el final del documento, se buscará al inicio\nfind_not_found=No se encontró la frase\n\n# Error panel labels\nerror_more_info=Más información\nerror_less_info=Menos información\nerror_close=Cerrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaje: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Archivo: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Línea: {{line}}\nrendering_error=Un error ocurrió al renderizar la página.\n\n# Predefined zoom values\npage_scale_width=Ancho de página\npage_scale_fit=Ajustar página\npage_scale_auto=Zoom automático\npage_scale_actual=Tamaño real\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=Un error ocurrió al cargar el PDF.\ninvalid_file_error=Archivo PDF invalido o dañado.\nmissing_file_error=Archivo PDF no encontrado.\nunexpected_response_error=Respuesta inesperada del servidor.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} anotación]\npassword_label=Ingresa la contraseña para abrir este archivo PDF.\npassword_invalid=Contraseña inválida. Por favor intenta de nuevo.\npassword_ok=Aceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Advertencia: La impresión no esta completamente soportada por este navegador.\nprinting_not_ready=Advertencia: El PDF no cargo completamente para impresión.\nweb_fonts_disabled=Las fuentes web están desactivadas: es imposible usar las fuentes PDF embebidas.\ndocument_colors_not_allowed=Los documentos PDF no tienen permiso de usar sus propios colores: 'Permitir que las páginas elijan sus propios colores' esta desactivada en el navegador.\n"
  },
  {
    "path": "pages/include/pdf/locale/et/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Eelmine lehekülg\nprevious_label=Eelmine\nnext.title=Järgmine lehekülg\nnext_label=Järgmine\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Leht\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}}/{{pagesCount}})\n\nzoom_out.title=Vähenda\nzoom_out_label=Vähenda\nzoom_in.title=Suurenda\nzoom_in_label=Suurenda\nzoom.title=Suurendamine\npresentation_mode.title=Lülitu esitlusrežiimi\npresentation_mode_label=Esitlusrežiim\nopen_file.title=Ava fail\nopen_file_label=Ava\nprint.title=Prindi\nprint_label=Prindi\ndownload.title=Laadi alla\ndownload_label=Laadi alla\nbookmark.title=Praegune vaade (kopeeri või ava uues aknas)\nbookmark_label=Praegune vaade\n\n# Secondary toolbar and context menu\ntools.title=Tööriistad\ntools_label=Tööriistad\nfirst_page.title=Mine esimesele leheküljele\nfirst_page.label=Mine esimesele leheküljele\nfirst_page_label=Mine esimesele leheküljele\nlast_page.title=Mine viimasele leheküljele\nlast_page.label=Mine viimasele leheküljele\nlast_page_label=Mine viimasele leheküljele\npage_rotate_cw.title=Pööra päripäeva\npage_rotate_cw.label=Pööra päripäeva\npage_rotate_cw_label=Pööra päripäeva\npage_rotate_ccw.title=Pööra vastupäeva\npage_rotate_ccw.label=Pööra vastupäeva\npage_rotate_ccw_label=Pööra vastupäeva\n\n\n# Document properties dialog box\ndocument_properties.title=Dokumendi omadused…\ndocument_properties_label=Dokumendi omadused…\ndocument_properties_file_name=Faili nimi:\ndocument_properties_file_size=Faili suurus:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KiB ({{size_b}} baiti)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MiB ({{size_b}} baiti)\ndocument_properties_title=Pealkiri:\ndocument_properties_author=Autor:\ndocument_properties_subject=Teema:\ndocument_properties_keywords=Märksõnad:\ndocument_properties_creation_date=Loodud:\ndocument_properties_modification_date=Muudetud:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}} {{time}}\ndocument_properties_creator=Looja:\ndocument_properties_producer=Generaator:\ndocument_properties_version=Generaatori versioon:\ndocument_properties_page_count=Lehekülgi:\ndocument_properties_close=Sulge\n\nprint_progress_message=Dokumendi ettevalmistamine printimiseks…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Loobu\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Näita külgriba\ntoggle_sidebar_notification.title=Näita külgriba (dokument sisaldab sisukorda/manuseid)\ntoggle_sidebar_label=Näita külgriba\ndocument_outline.title=Näita sisukorda (kõigi punktide laiendamiseks/ahendamiseks topeltklõpsa)\ndocument_outline_label=Näita sisukorda\nattachments.title=Näita manuseid\nattachments_label=Manused\nthumbs.title=Näita pisipilte\nthumbs_label=Pisipildid\nfindbar.title=Otsi dokumendist\nfindbar_label=Otsi\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}}. lehekülg\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}. lehekülje pisipilt\n\n# Find panel button title and messages\nfind_input.title=Otsi\nfind_input.placeholder=Otsi dokumendist…\nfind_previous.title=Otsi fraasi eelmine esinemiskoht\nfind_previous_label=Eelmine\nfind_next.title=Otsi fraasi järgmine esinemiskoht\nfind_next_label=Järgmine\nfind_highlight=Too kõik esile\nfind_match_case_label=Tõstutundlik\nfind_reached_top=Jõuti dokumendi algusesse, jätkati lõpust\nfind_reached_bottom=Jõuti dokumendi lõppu, jätkati algusest\nfind_not_found=Fraasi ei leitud\n\n# Error panel labels\nerror_more_info=Rohkem teavet\nerror_less_info=Vähem teavet\nerror_close=Sulge\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Teade: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fail: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rida: {{line}}\nrendering_error=Lehe renderdamisel esines viga.\n\n# Predefined zoom values\npage_scale_width=Mahuta laiusele\npage_scale_fit=Mahuta leheküljele\npage_scale_auto=Automaatne suurendamine\npage_scale_actual=Tegelik suurus\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Viga\nloading_error=PDFi laadimisel esines viga.\ninvalid_file_error=Vigane või rikutud PDF-fail.\nmissing_file_error=PDF-fail puudub.\nunexpected_response_error=Ootamatu vastus serverilt.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=PDF-faili avamiseks sisesta parool.\npassword_invalid=Vigane parool. Palun proovi uuesti.\npassword_ok=Sobib\npassword_cancel=Loobu\n\nprinting_not_supported=Hoiatus: printimine pole selle brauseri poolt täielikult toetatud.\nprinting_not_ready=Hoiatus: PDF pole printimiseks täielikult laaditud.\nweb_fonts_disabled=Veebifondid on keelatud: PDFiga kaasatud fonte pole võimalik kasutada.\ndocument_colors_not_allowed=PDF-dokumentidel pole oma värvide kasutamine lubatud: “Veebilehtedel on lubatud kasutada oma värve” on brauseris deaktiveeritud.\n"
  },
  {
    "path": "pages/include/pdf/locale/eu/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Aurreko orria\nprevious_label=Aurrekoa\nnext.title=Hurrengo orria\nnext_label=Hurrengoa\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Orria\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages={{pagesCount}}/{{pageNumber}}\n\nzoom_out.title=Urrundu zooma\nzoom_out_label=Urrundu zooma\nzoom_in.title=Gerturatu zooma\nzoom_in_label=Gerturatu zooma\nzoom.title=Zooma\npresentation_mode.title=Aldatu aurkezpen modura\npresentation_mode_label=Arkezpen modua\nopen_file.title=Ireki fitxategia\nopen_file_label=Ireki\nprint.title=Inprimatu\nprint_label=Inprimatu\ndownload.title=Deskargatu\ndownload_label=Deskargatu\nbookmark.title=Uneko ikuspegia (kopiatu edo ireki leiho berrian)\nbookmark_label=Uneko ikuspegia\n\n# Secondary toolbar and context menu\ntools.title=Tresnak\ntools_label=Tresnak\nfirst_page.title=Joan lehen orrira\nfirst_page.label=Joan lehen orrira\nfirst_page_label=Joan lehen orrira\nlast_page.title=Joan azken orrira\nlast_page.label=Joan azken orrira\nlast_page_label=Joan azken orrira\npage_rotate_cw.title=Biratu erlojuaren norantzan\npage_rotate_cw.label=Biratu erlojuaren norantzan\npage_rotate_cw_label=Biratu erlojuaren norantzan\npage_rotate_ccw.title=Biratu erlojuaren aurkako norantzan\npage_rotate_ccw.label=Biratu erlojuaren aurkako norantzan\npage_rotate_ccw_label=Biratu erlojuaren aurkako norantzan\n\ncursor_text_select_tool.title=Gaitu testuaren hautapen tresna\ncursor_text_select_tool_label=Testuaren hautapen tresna\ncursor_hand_tool.title=Gaitu eskuaren tresna\ncursor_hand_tool_label=Eskuaren tresna\n\n# Document properties dialog box\ndocument_properties.title=Dokumentuaren propietateak…\ndocument_properties_label=Dokumentuaren propietateak…\ndocument_properties_file_name=Fitxategi-izena:\ndocument_properties_file_size=Fitxategiaren tamaina:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} byte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title=Izenburua:\ndocument_properties_author=Egilea:\ndocument_properties_subject=Gaia:\ndocument_properties_keywords=Gako-hitzak:\ndocument_properties_creation_date=Sortze-data:\ndocument_properties_modification_date=Aldatze-data:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Sortzailea:\ndocument_properties_producer=PDFaren ekoizlea:\ndocument_properties_version=PDF bertsioa:\ndocument_properties_page_count=Orrialde kopurua:\ndocument_properties_close=Itxi\n\nprint_progress_message=Dokumentua inprimatzeko prestatzen…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent=%{{progress}}\nprint_progress_close=Utzi\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Txandakatu alboko barra\ntoggle_sidebar_notification.title=Txandakatu alboko barra (dokumentuak eskema/eranskinak ditu)\ntoggle_sidebar_label=Txandakatu alboko barra\ndocument_outline.title=Erakutsi dokumentuaren eskema (klik bikoitza elementu guztiak zabaltzeko/tolesteko)\ndocument_outline_label=Dokumentuaren eskema\nattachments.title=Erakutsi eranskinak\nattachments_label=Eranskinak\nthumbs.title=Erakutsi koadro txikiak\nthumbs_label=Koadro txikiak\nfindbar.title=Bilatu dokumentuan\nfindbar_label=Bilatu\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}}. orria\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}. orriaren koadro txikia\n\n# Find panel button title and messages\nfind_input.title=Bilatu\nfind_input.placeholder=Bilatu dokumentuan…\nfind_previous.title=Bilatu esaldiaren aurreko parekatzea\nfind_previous_label=Aurrekoa\nfind_next.title=Bilatu esaldiaren hurrengo parekatzea\nfind_next_label=Hurrengoa\nfind_highlight=Nabarmendu guztia\nfind_match_case_label=Bat etorri maiuskulekin/minuskulekin\nfind_reached_top=Dokumentuaren hasierara heldu da, bukaeratik jarraitzen\nfind_reached_bottom=Dokumentuaren bukaerara heldu da, hasieratik jarraitzen\nfind_not_found=Esaldia ez da aurkitu\n\n# Error panel labels\nerror_more_info=Informazio gehiago\nerror_less_info=Informazio gutxiago\nerror_close=Itxi\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (eraikuntza: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mezua: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fitxategia: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Lerroa: {{line}}\nrendering_error=Errorea gertatu da orria errendatzean.\n\n# Predefined zoom values\npage_scale_width=Orriaren zabalera\npage_scale_fit=Doitu orrira\npage_scale_auto=Zoom automatikoa\npage_scale_actual=Benetako tamaina\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent=%{{scale}}\n\n# Loading indicator messages\nloading_error_indicator=Errorea\nloading_error=Errorea gertatu da PDFa kargatzean.\ninvalid_file_error=PDF fitxategi baliogabe edo hondatua.\nmissing_file_error=PDF fitxategia falta da.\nunexpected_response_error=Espero gabeko zerbitzariaren erantzuna.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} ohartarazpena]\npassword_label=Idatzi PDF fitxategi hau irekitzeko pasahitza.\npassword_invalid=Pasahitz baliogabea. Saiatu berriro mesedez.\npassword_ok=Ados\npassword_cancel=Utzi\n\nprinting_not_supported=Abisua: inprimatzeko euskarria ez da erabatekoa nabigatzaile honetan.\nprinting_not_ready=Abisua: PDFa ez dago erabat kargatuta inprimatzeko.\nweb_fonts_disabled=Webeko letra-tipoak desgaituta daude: ezin dira kapsulatutako PDF letra-tipoak erabili.\ndocument_colors_not_allowed=PDF dokumentuek ez dute beraien koloreak erabiltzeko baimenik: 'Baimendu orriak beraien letra-tipoak aukeratzea' desaktibatuta dago nabigatzailean.\n"
  },
  {
    "path": "pages/include/pdf/locale/fa/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=صفحهٔ قبلی\nprevious_label=قبلی\nnext.title=صفحهٔ بعدی\nnext_label=بعدی\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=صفحه\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=از {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}}از {{pagesCount}})\n\nzoom_out.title=کوچک‌نمایی\nzoom_out_label=کوچک‌نمایی\nzoom_in.title=بزرگ‌نمایی\nzoom_in_label=بزرگ‌نمایی\nzoom.title=زوم\npresentation_mode.title=تغییر به حالت ارائه\npresentation_mode_label=حالت ارائه\nopen_file.title=باز کردن پرونده\nopen_file_label=باز کردن\nprint.title=چاپ\nprint_label=چاپ\ndownload.title=بارگیری\ndownload_label=بارگیری\nbookmark.title=نمای فعلی (رونوشت و یا نشان دادن در پنجره جدید)\nbookmark_label=نمای فعلی\n\n# Secondary toolbar and context menu\ntools.title=ابزارها\ntools_label=ابزارها\nfirst_page.title=برو به اولین صفحه\nfirst_page.label=برو یه اولین صفحه\nfirst_page_label=برو به اولین صفحه\nlast_page.title=برو به آخرین صفحه\nlast_page.label=برو به آخرین صفحه\nlast_page_label=برو به آخرین صفحه\npage_rotate_cw.title=چرخش ساعتگرد\npage_rotate_cw.label=چرخش ساعتگرد\npage_rotate_cw_label=چرخش ساعتگرد\npage_rotate_ccw.title=چرخش پاد ساعتگرد\npage_rotate_ccw.label=چرخش پاد ساعتگرد\npage_rotate_ccw_label=چرخش پاد ساعتگرد\n\ncursor_text_select_tool.title=فعال کردن ابزارِ انتخابِ متن\ncursor_text_select_tool_label=ابزارِ انتخابِ متن\ncursor_hand_tool.title=فعال کردن ابزارِ دست\ncursor_hand_tool_label=ابزار دست\n\n# Document properties dialog box\ndocument_properties.title=خصوصیات سند...\ndocument_properties_label=خصوصیات سند...\ndocument_properties_file_name=نام فایل:\ndocument_properties_file_size=حجم پرونده:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} کیلوبایت ({{size_b}} بایت)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} مگابایت ({{size_b}} بایت)\ndocument_properties_title=عنوان:\ndocument_properties_author=نویسنده:\ndocument_properties_subject=موضوع:\ndocument_properties_keywords=کلیدواژه‌ها:\ndocument_properties_creation_date=تاریخ ایجاد:\ndocument_properties_modification_date=تاریخ ویرایش:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}، {{time}}\ndocument_properties_creator=ایجاد کننده:\ndocument_properties_producer=ایجاد کننده PDF:\ndocument_properties_version=نسخه PDF:\ndocument_properties_page_count=تعداد صفحات:\ndocument_properties_close=بستن\n\nprint_progress_message=آماده سازی مدارک برای چاپ کردن…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=لغو\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=باز و بسته کردن نوار کناری\ntoggle_sidebar_notification.title=تغییر وضعیت نوار کناری (سند حاوی طرح/پیوست است)\ntoggle_sidebar_label=تغییرحالت نوارکناری\ndocument_outline.title=نمایش رئوس مطالب مدارک(برای بازشدن/جمع شدن همه موارد دوبار کلیک کنید)\ndocument_outline_label=طرح نوشتار\nattachments.title=نمایش پیوست‌ها\nattachments_label=پیوست‌ها\nthumbs.title=نمایش تصاویر بندانگشتی\nthumbs_label=تصاویر بندانگشتی\nfindbar.title=جستجو در سند\nfindbar_label=پیدا کردن\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=صفحه {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=تصویر بند‌ انگشتی صفحه {{page}}\n\n# Find panel button title and messages\nfind_input.title=پیدا کردن\nfind_input.placeholder=پیدا کردن در سند…\nfind_previous.title=پیدا کردن رخداد قبلی عبارت\nfind_previous_label=قبلی\nfind_next.title=پیدا کردن رخداد بعدی عبارت\nfind_next_label=بعدی\nfind_highlight=برجسته و هایلایت کردن همه موارد\nfind_match_case_label=تطبیق کوچکی و بزرگی حروف\nfind_reached_top=به بالای صفحه رسیدیم، از پایین ادامه می‌دهیم\nfind_reached_bottom=به آخر صفحه رسیدیم، از بالا ادامه می‌دهیم\nfind_not_found=عبارت پیدا نشد\n\n# Error panel labels\nerror_more_info=اطلاعات بیشتر\nerror_less_info=اطلاعات کمتر\nerror_close=بستن\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=‏PDF.js ورژن{{version}} ‏(ساخت: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=پیام: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=توده: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=پرونده: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=سطر: {{line}}\nrendering_error=هنگام بارگیری صفحه خطایی رخ داد.\n\n# Predefined zoom values\npage_scale_width=عرض صفحه\npage_scale_fit=اندازه کردن صفحه\npage_scale_auto=بزرگنمایی خودکار\npage_scale_actual=اندازه واقعی‌\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=خطا\nloading_error=هنگام بارگیری پرونده PDF خطایی رخ داد.\ninvalid_file_error=پرونده PDF نامعتبر یامعیوب می‌باشد.\nmissing_file_error=پرونده PDF یافت نشد.\nunexpected_response_error=پاسخ پیش بینی نشده سرور\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=جهت باز کردن پرونده PDF گذرواژه را وارد نمائید.\npassword_invalid=گذرواژه نامعتبر. لطفا مجددا تلاش کنید.\npassword_ok=تأیید\npassword_cancel=لغو\n\nprinting_not_supported=هشدار: قابلیت چاپ به‌طور کامل در این مرورگر پشتیبانی نمی‌شود.\nprinting_not_ready=اخطار: پرونده PDF بطور کامل بارگیری نشده و امکان چاپ وجود ندارد.\nweb_fonts_disabled=فونت های تحت وب غیر فعال شده اند: امکان استفاده از نمایش دهنده داخلی PDF وجود ندارد.\ndocument_colors_not_allowed=فایلهای PDF اجازه ندارند تا از رنگ‌های خود استفاده کنند: گزینه «به صفحات اجازه بده تا از رنگ‌های خود استفاده کنند» در مرورگر غیر فعال است.\n"
  },
  {
    "path": "pages/include/pdf/locale/ff/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Hello Ɓennungo\nprevious_label=Ɓennuɗo\nnext.title=Hello faango\nnext_label=Yeeso\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Hello\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=e nder {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=Lonngo Woɗɗa\nzoom_out_label=Lonngo Woɗɗa\nzoom_in.title=Lonngo Ara\nzoom_in_label=Lonngo Ara\nzoom.title=Lonngo\npresentation_mode.title=Faytu to  Presentation Mode\npresentation_mode_label=Presentation Mode\nopen_file.title=Uddit Fiilde\nopen_file_label=Uddit\nprint.title=Winndito\nprint_label=Winndito\ndownload.title=Aawto\ndownload_label=Aawto\nbookmark.title=Jiytol gonangol (natto walla uddit e henorde)\nbookmark_label=Jiytol Gonangol\n\n# Secondary toolbar and context menu\ntools.title=Kuutorɗe\ntools_label=Kuutorɗe\nfirst_page.title=Yah to hello adanngo\nfirst_page.label=Yah to hello adanngo\nfirst_page_label=Yah to hello adanngo\nlast_page.title=Yah to hello wattindiingo\nlast_page.label=Yah to hello wattindiingo\nlast_page_label=Yah to hello wattindiingo\npage_rotate_cw.title=Yiiltu Faya Ñaamo\npage_rotate_cw.label=Yiiltu Faya Ñaamo\npage_rotate_cw_label=Yiiltu Faya Ñaamo\npage_rotate_ccw.title=Yiiltu Faya Nano\npage_rotate_ccw.label=Yiiltu Faya Nano\npage_rotate_ccw_label=Yiiltu Faya Nano\n\ncursor_text_select_tool.title=Gollin kaɓirgel cuɓirgel binndi\ncursor_text_select_tool_label=Kaɓirgel cuɓirgel binndi\ncursor_hand_tool.title=Hurmin kuutorgal junngo\ncursor_hand_tool_label=Kaɓirgel junngo\n\n# Document properties dialog box\ndocument_properties.title=Keeroraaɗi Winndannde…\ndocument_properties_label=Keeroraaɗi Winndannde…\ndocument_properties_file_name=Innde fiilde:\ndocument_properties_file_size=Ɓetol fiilde:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bite)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bite)\ndocument_properties_title=Tiitoonde:\ndocument_properties_author=Binnduɗo:\ndocument_properties_subject=Toɓɓere:\ndocument_properties_keywords=Kelmekele jiytirɗe:\ndocument_properties_creation_date=Ñalnde Sosaa:\ndocument_properties_modification_date=Ñalnde Waylaa:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Cosɗo:\ndocument_properties_producer=Paggiiɗo PDF:\ndocument_properties_version=Yamre PDF:\ndocument_properties_page_count=Limoore Kelle:\ndocument_properties_close=Uddu\n\nprint_progress_message=Nana heboo winnditaade fiilannde…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Haaytu\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toggilo Palal Sawndo\ntoggle_sidebar_notification.title=Palal sawndo (dokimaa oo ina waɗi taarngo/cinnde)\ntoggle_sidebar_label=Toggilo Palal Sawndo\ndocument_outline.title=Hollu Ƴiyal Fiilannde (dobdobo ngam wertude/taggude teme fof)\ndocument_outline_label=Toɓɓe Fiilannde\nattachments.title=Hollu Ɗisanɗe\nattachments_label=Ɗisanɗe\nthumbs.title=Hollu Dooɓe\nthumbs_label=Dooɓe\nfindbar.title=Yiylo e fiilannde\nfindbar_label=Yiytu\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Hello {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Dooɓre Hello {{page}}\n\n# Find panel button title and messages\nfind_input.title=Yiytu\nfind_input.placeholder=Yiylo nder dokimaa\nfind_previous.title=Yiylo cilol ɓennugol konngol ngol\nfind_previous_label=Ɓennuɗo\nfind_next.title=Yiylo cilol garowol konngol ngol\nfind_next_label=Yeeso\nfind_highlight=Jalbin fof\nfind_match_case_label=Jaaɓnu darnde\nfind_reached_top=Heɓii fuɗɗorde fiilannde, jokku faya les\nfind_reached_bottom=Heɓii hoore fiilannde, jokku faya les\nfind_not_found=Konngi njiyataa\n\n# Error panel labels\nerror_more_info=Ɓeydu Humpito\nerror_less_info=Ustu Humpito\nerror_close=Uddu\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Ɓatakuure: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fiilde: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Gorol: {{line}}\nrendering_error=Juumre waɗii tuma nde yoŋkittoo hello.\n\n# Predefined zoom values\npage_scale_width=Njaajeendi Hello\npage_scale_fit=Keƴeendi Hello\npage_scale_auto=Loongorde Jaajol\npage_scale_actual=Ɓetol Jaati\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Juumre\nloading_error=Juumre waɗii tuma nde loowata PDF oo.\ninvalid_file_error=Fiilde PDF moƴƴaani walla jiibii.\nmissing_file_error=Fiilde PDF ena ŋakki.\nunexpected_response_error=Jaabtol sarworde tijjinooka.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Siiftannde]\npassword_label=Naatu finnde ngam uddite ndee fiilde PDF.\npassword_invalid=Finnde moƴƴaani. Tiiɗno eto kadi.\npassword_ok=OK\npassword_cancel=Haaytu\n\nprinting_not_supported=Reentino: Winnditagol tammbitaaka no feewi e ndee wanngorde.\nprinting_not_ready=Reentino: PDF oo loowaaki haa timmi ngam winnditagol.\nweb_fonts_disabled=Ponte geese ko daaƴaaɗe: horiima huutoraade ponte PDF coomtoraaɗe.\ndocument_colors_not_allowed=Piilanɗe PDF njamiraaka yoo kuutoro goobuuji mum'en keeriiɗi: 'Yamir kello yoo kuutoro goobuuki keeriiɗi' koko daaƴaa e wanngorde ndee.\n"
  },
  {
    "path": "pages/include/pdf/locale/fi/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Edellinen sivu\nprevious_label=Edellinen\nnext.title=Seuraava sivu\nnext_label=Seuraava\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Sivu\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=Loitonna\nzoom_out_label=Loitonna\nzoom_in.title=Lähennä\nzoom_in_label=Lähennä\nzoom.title=Suurennus\npresentation_mode.title=Siirry esitystilaan\npresentation_mode_label=Esitystila\nopen_file.title=Avaa tiedosto\nopen_file_label=Avaa\nprint.title=Tulosta\nprint_label=Tulosta\ndownload.title=Lataa\ndownload_label=Lataa\nbookmark.title=Avoin ikkuna (kopioi tai avaa uuteen ikkunaan)\nbookmark_label=Avoin ikkuna\n\n# Secondary toolbar and context menu\ntools.title=Tools\ntools_label=Tools\nfirst_page.title=Siirry ensimmäiselle sivulle\nfirst_page.label=Siirry ensimmäiselle sivulle\nfirst_page_label=Siirry ensimmäiselle sivulle\nlast_page.title=Siirry viimeiselle sivulle\nlast_page.label=Siirry viimeiselle sivulle\nlast_page_label=Siirry viimeiselle sivulle\npage_rotate_cw.title=Kierrä oikealle\npage_rotate_cw.label=Kierrä oikealle\npage_rotate_cw_label=Kierrä oikealle\npage_rotate_ccw.title=Kierrä vasemmalle\npage_rotate_ccw.label=Kierrä vasemmalle\npage_rotate_ccw_label=Kierrä vasemmalle\n\ncursor_text_select_tool.title=Käytä tekstinvalintatyökalua\ncursor_text_select_tool_label=Tekstinvalintatyökalu\ncursor_hand_tool.title=Käytä käsityökalua\ncursor_hand_tool_label=Käsityökalu\n\n# Document properties dialog box\ndocument_properties.title=Dokumentin ominaisuudet…\ndocument_properties_label=Dokumentin ominaisuudet…\ndocument_properties_file_name=Tiedostonimi:\ndocument_properties_file_size=Tiedoston koko:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kt ({{size_b}} tavua)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} Mt ({{size_b}} tavua)\ndocument_properties_title=Otsikko:\ndocument_properties_author=Tekijä:\ndocument_properties_subject=Aihe:\ndocument_properties_keywords=Avainsanat:\ndocument_properties_creation_date=Luomispäivämäärä:\ndocument_properties_modification_date=Muokkauspäivämäärä:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Luoja:\ndocument_properties_producer=PDF-tuottaja:\ndocument_properties_version=PDF-versio:\ndocument_properties_page_count=Sivujen määrä:\ndocument_properties_close=Sulje\n\nprint_progress_message=Valmistellaan dokumenttia tulostamista varten…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}} %\nprint_progress_close=Peruuta\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Näytä/piilota sivupaneeli\ntoggle_sidebar_notification.title=Näytä/piilota sivupaneeli (dokumentissa on sisällys tai liitteitä)\ntoggle_sidebar_label=Näytä/piilota sivupaneeli\ndocument_outline.title=Näytä dokumentin sisällys (laajenna tai kutista kohdat kaksoisnapsauttamalla)\ndocument_outline_label=Dokumentin sisällys\nattachments.title=Näytä liitteet\nattachments_label=Liitteet\nthumbs.title=Näytä pienoiskuvat\nthumbs_label=Pienoiskuvat\nfindbar.title=Etsi dokumentista\nfindbar_label=Etsi\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Sivu {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Pienoiskuva sivusta {{page}}\n\n# Find panel button title and messages\nfind_input.title=Etsi\nfind_input.placeholder=Etsi dokumentista…\nfind_previous.title=Etsi hakusanan edellinen osuma\nfind_previous_label=Edellinen\nfind_next.title=Etsi hakusanan seuraava osuma\nfind_next_label=Seuraava\nfind_highlight=Korosta kaikki\nfind_match_case_label=Huomioi kirjainkoko\nfind_reached_top=Päästiin dokumentin alkuun, jatketaan lopusta\nfind_reached_bottom=Päästiin dokumentin loppuun, continued from top\nfind_not_found=Hakusanaa ei löytynyt\n\n# Error panel labels\nerror_more_info=Lisätietoja\nerror_less_info=Lisätietoja\nerror_close=Sulje\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (kooste: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Virheilmoitus: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pino: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Tiedosto: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rivi: {{line}}\nrendering_error=Tapahtui virhe piirrettäessä sivua.\n\n# Predefined zoom values\npage_scale_width=Sivun leveys\npage_scale_fit=Koko sivu\npage_scale_auto=Automaattinen suurennus\npage_scale_actual=Todellinen koko\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}} %\n\n# Loading indicator messages\nloading_error_indicator=Virhe\nloading_error=Tapahtui virhe ladattaessa PDF-tiedostoa.\ninvalid_file_error=Virheellinen tai vioittunut PDF-tiedosto.\nmissing_file_error=Puuttuva PDF-tiedosto.\nunexpected_response_error=Odottamaton vastaus palvelimelta.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=Kirjoita PDF-tiedoston salasana.\npassword_invalid=Virheellinen salasana. Yritä uudestaan.\npassword_ok=OK\npassword_cancel=Peruuta\n\nprinting_not_supported=Varoitus: Selain ei tue kaikkia tulostustapoja.\nprinting_not_ready=Varoitus: PDF-tiedosto ei ole vielä latautunut kokonaan, eikä sitä voi vielä tulostaa.\nweb_fonts_disabled=Verkkosivujen omat kirjasinlajit on estetty: ei voida käyttää upotettuja PDF-kirjasinlajeja.\ndocument_colors_not_allowed=PDF-dokumenttien ei ole sallittua käyttää omia värejään: Asetusta ”Sivut saavat käyttää omia värejään oletusten sijaan” ei ole valittu selaimen asetuksissa.\n"
  },
  {
    "path": "pages/include/pdf/locale/fr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Page précédente\nprevious_label=Précédent\nnext.title=Page suivante\nnext_label=Suivant\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Page\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=sur {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} sur {{pagesCount}})\n\nzoom_out.title=Zoom arrière\nzoom_out_label=Zoom arrière\nzoom_in.title=Zoom avant\nzoom_in_label=Zoom avant\nzoom.title=Zoom\npresentation_mode.title=Basculer en mode présentation\npresentation_mode_label=Mode présentation\nopen_file.title=Ouvrir le fichier\nopen_file_label=Ouvrir le fichier\nprint.title=Imprimer\nprint_label=Imprimer\ndownload.title=Télécharger\ndownload_label=Télécharger\nbookmark.title=Affichage courant (copier ou ouvrir dans une nouvelle fenêtre)\nbookmark_label=Affichage actuel\n\n# Secondary toolbar and context menu\ntools.title=Outils\ntools_label=Outils\nfirst_page.title=Aller à la première page\nfirst_page.label=Aller à la première page\nfirst_page_label=Aller à la première page\nlast_page.title=Aller à la dernière page\nlast_page.label=Aller à la dernière page\nlast_page_label=Aller à la dernière page\npage_rotate_cw.title=Rotation horaire\npage_rotate_cw.label=Rotation horaire\npage_rotate_cw_label=Rotation horaire\npage_rotate_ccw.title=Rotation anti-horaire\npage_rotate_ccw.label=Rotation anti-horaire\npage_rotate_ccw_label=Rotation anti-horaire\n\ncursor_text_select_tool.title=Activer l’outil de sélection de texte\ncursor_text_select_tool_label=Outil de sélection de texte\ncursor_hand_tool.title=Activer l’outil main\ncursor_hand_tool_label=Outil main\n\n# Document properties dialog box\ndocument_properties.title=Propriétés du document…\ndocument_properties_label=Propriétés du document…\ndocument_properties_file_name=Nom du fichier :\ndocument_properties_file_size=Taille du fichier :\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} Ko ({{size_b}} octets)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} Mo ({{size_b}} octets)\ndocument_properties_title=Titre :\ndocument_properties_author=Auteur :\ndocument_properties_subject=Sujet :\ndocument_properties_keywords=Mots-clés :\ndocument_properties_creation_date=Date de création :\ndocument_properties_modification_date=Modifié le :\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}} à {{time}}\ndocument_properties_creator=Créé par :\ndocument_properties_producer=Outil de conversion PDF :\ndocument_properties_version=Version PDF :\ndocument_properties_page_count=Nombre de pages :\ndocument_properties_close=Fermer\n\nprint_progress_message=Préparation du document pour l’impression…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}} %\nprint_progress_close=Annuler\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Afficher/Masquer le panneau latéral\ntoggle_sidebar_notification.title=Afficher/Masquer le panneau latéral (le document contient des signets/pièces jointes)\ntoggle_sidebar_label=Afficher/Masquer le panneau latéral\ndocument_outline.title=Afficher les signets du document (double-cliquer pour développer/réduire tous les éléments)\ndocument_outline_label=Signets du document\nattachments.title=Afficher les pièces jointes\nattachments_label=Pièces jointes\nthumbs.title=Afficher les vignettes\nthumbs_label=Vignettes\nfindbar.title=Rechercher dans le document\nfindbar_label=Rechercher\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Page {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Vignette de la page {{page}}\n\n# Find panel button title and messages\nfind_input.title=Rechercher\nfind_input.placeholder=Rechercher dans le document…\nfind_previous.title=Trouver l’occurrence précédente de la phrase\nfind_previous_label=Précédent\nfind_next.title=Trouver la prochaine occurrence de la phrase\nfind_next_label=Suivant\nfind_highlight=Tout surligner\nfind_match_case_label=Respecter la casse\nfind_reached_top=Haut de la page atteint, poursuite depuis la fin\nfind_reached_bottom=Bas de la page atteint, poursuite au début\nfind_not_found=Phrase introuvable\n\n# Error panel labels\nerror_more_info=Plus d’informations\nerror_less_info=Moins d’informations\nerror_close=Fermer\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (identifiant de compilation : {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Message : {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pile : {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fichier : {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Ligne : {{line}}\nrendering_error=Une erreur s’est produite lors de l’affichage de la page.\n\n# Predefined zoom values\npage_scale_width=Pleine largeur\npage_scale_fit=Page entière\npage_scale_auto=Zoom automatique\npage_scale_actual=Taille réelle\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}} %\n\n# Loading indicator messages\nloading_error_indicator=Erreur\nloading_error=Une erreur s’est produite lors du chargement du fichier PDF.\ninvalid_file_error=Fichier PDF invalide ou corrompu.\nmissing_file_error=Fichier PDF manquant.\nunexpected_response_error=Réponse inattendue du serveur.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Annotation {{type}}]\npassword_label=Veuillez saisir le mot de passe pour ouvrir ce fichier PDF.\npassword_invalid=Mot de passe incorrect. Veuillez réessayer.\npassword_ok=OK\npassword_cancel=Annuler\n\nprinting_not_supported=Attention : l’impression n’est pas totalement prise en charge par ce navigateur.\nprinting_not_ready=Attention : le PDF n’est pas entièrement chargé pour pouvoir l’imprimer.\nweb_fonts_disabled=Les polices web sont désactivées : impossible d’utiliser les polices intégrées au PDF.\ndocument_colors_not_allowed=Les documents PDF ne peuvent pas utiliser leurs propres couleurs : « Autoriser les pages web à utiliser leurs propres couleurs » est désactivé dans le navigateur.\n"
  },
  {
    "path": "pages/include/pdf/locale/fy-NL/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Foarige side\nprevious_label=Foarige\nnext.title=Folgjende side\nnext_label=Folgjende\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Side\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=fa {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} fan {{pagesCount}})\n\nzoom_out.title=Utzoome\nzoom_out_label=Utzoome\nzoom_in.title=Ynzoome\nzoom_in_label=Ynzoome\nzoom.title=Zoome\npresentation_mode.title=Wikselje nei presintaasjemodus\npresentation_mode_label=Presintaasjemodus\nopen_file.title=Bestân iepenje\nopen_file_label=Iepenje\nprint.title=Ofdrukke\nprint_label=Ofdrukke\ndownload.title=Downloade\ndownload_label=Downloade\nbookmark.title=Aktuele finster (kopiearje of iepenje yn nij finster)\nbookmark_label=Aktuele finster\n\n# Secondary toolbar and context menu\ntools.title=Ark\ntools_label=Ark\nfirst_page.title=Gean nei earste side\nfirst_page.label=Nei earste side gean\nfirst_page_label=Gean nei earste side\nlast_page.title=Gean nei lêste side\nlast_page.label=Nei lêste side gean\nlast_page_label=Gean nei lêste side\npage_rotate_cw.title=Rjochtsom draaie\npage_rotate_cw.label=Rjochtsom draaie\npage_rotate_cw_label=Rjochtsom draaie\npage_rotate_ccw.title=Loftsom draaie\npage_rotate_ccw.label=Loftsom draaie\npage_rotate_ccw_label=Loftsom draaie\n\ncursor_text_select_tool.title=Tekstseleksjehelpmiddel ynskeakelje\ncursor_text_select_tool_label=Tekstseleksjehelpmiddel\ncursor_hand_tool.title=Hânhelpmiddel ynskeakelje\ncursor_hand_tool_label=Hânhelpmiddel\n\n# Document properties dialog box\ndocument_properties.title=Dokuminteigenskippen…\ndocument_properties_label=Dokuminteigenskippen…\ndocument_properties_file_name=Bestânsnamme:\ndocument_properties_file_size=Bestânsgrutte:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Auteur:\ndocument_properties_subject=Underwerp:\ndocument_properties_keywords=Kaaiwurden:\ndocument_properties_creation_date=Oanmaakdatum:\ndocument_properties_modification_date=Bewurkingsdatum:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Makker:\ndocument_properties_producer=PDF-makker:\ndocument_properties_version=PDF-ferzje:\ndocument_properties_page_count=Siden:\ndocument_properties_close=Slute\n\nprint_progress_message=Dokumint tariede oar ôfdrukken…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Annulearje\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Sidebalke yn-/útskeakelje\ntoggle_sidebar_notification.title=Sidebalke yn-/útskeakelje (dokumint befettet outline/bylagen)\ntoggle_sidebar_label=Sidebalke yn-/útskeakelje\ndocument_outline.title=Dokumintoersjoch toane (dûbelklik om alle items út/yn te klappen)\ndocument_outline_label=Dokumintoersjoch\nattachments.title=Bylagen toane\nattachments_label=Bylagen\nthumbs.title=Foarbylden toane\nthumbs_label=Foarbylden\nfindbar.title=Sykje yn dokumint\nfindbar_label=Sykje\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Side {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Foarbyld fan side {{page}}\n\n# Find panel button title and messages\nfind_input.title=Sykje\nfind_input.placeholder=Sykje yn dokumint…\nfind_previous.title=It foarige foarkommen fan de tekst sykje\nfind_previous_label=Foarige\nfind_next.title=It folgjende foarkommen fan de tekst sykje\nfind_next_label=Folgjende\nfind_highlight=Alles markearje\nfind_match_case_label=Haadlettergefoelich\nfind_reached_top=Boppekant fan dokumint berikt, trochgien fan ûnder ôf\nfind_reached_bottom=Ein fan dokumint berikt, trochgien fan boppe ôf\nfind_not_found=Tekst net fûn\n\n# Error panel labels\nerror_more_info=Mear ynformaasje\nerror_less_info=Minder ynformaasje\nerror_close=Slute\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js f{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Berjocht: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Bestân: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rigel: {{line}}\nrendering_error=Der is in flater bard by it renderjen fan de side.\n\n# Predefined zoom values\npage_scale_width=Sidebreedte\npage_scale_fit=Hiele side\npage_scale_auto=Automatysk zoome\npage_scale_actual=Werklike grutte\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Flater\nloading_error=Der is in flater bard by it laden fan de PDF.\ninvalid_file_error=Ynfalide of korruptearre PDF-bestân.\nmissing_file_error=PDF-bestân ûntbrekt.\nunexpected_response_error=Unferwacht serverantwurd.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-annotaasje]\npassword_label=Jou it wachtwurd om dit PDF-bestân te iepenjen.\npassword_invalid=Ferkeard wachtwurd. Probearje opnij.\npassword_ok=OK\npassword_cancel=Annulearje\n\nprinting_not_supported=Warning: Printen is net folslein stipe troch dizze browser.\nprinting_not_ready=Warning: PDF is net folslein laden om ôf te drukken.\nweb_fonts_disabled=Weblettertypen binne útskeakele: gebrûk fan ynsluten PDF-lettertypen is net mooglik.\ndocument_colors_not_allowed=PDF-dokuminten meie harren eigen kleuren net brûke: ‘Siden tastean om harren eigen kleuren te kiezen’ is útskeakele yn de browser.\n"
  },
  {
    "path": "pages/include/pdf/locale/ga-IE/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=An Leathanach Roimhe Seo\nprevious_label=Roimhe Seo\nnext.title=An Chéad Leathanach Eile\nnext_label=Ar Aghaidh\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Leathanach\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=as {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} as {{pagesCount}})\n\nzoom_out.title=Súmáil Amach\nzoom_out_label=Súmáil Amach\nzoom_in.title=Súmáil Isteach\nzoom_in_label=Súmáil Isteach\nzoom.title=Súmáil\npresentation_mode.title=Úsáid an Mód Láithreoireachta\npresentation_mode_label=Mód Láithreoireachta\nopen_file.title=Oscail Comhad\nopen_file_label=Oscail\nprint.title=Priontáil\nprint_label=Priontáil\ndownload.title=Íoslódáil\ndownload_label=Íoslódáil\nbookmark.title=An t-amharc reatha (cóipeáil nó oscail i bhfuinneog nua)\nbookmark_label=An tAmharc Reatha\n\n# Secondary toolbar and context menu\ntools.title=Uirlisí\ntools_label=Uirlisí\nfirst_page.title=Go dtí an chéad leathanach\nfirst_page.label=Go dtí an chéad leathanach\nfirst_page_label=Go dtí an chéad leathanach\nlast_page.title=Go dtí an leathanach deiridh\nlast_page.label=Go dtí an leathanach deiridh\nlast_page_label=Go dtí an leathanach deiridh\npage_rotate_cw.title=Rothlaigh ar deiseal\npage_rotate_cw.label=Rothlaigh ar deiseal\npage_rotate_cw_label=Rothlaigh ar deiseal\npage_rotate_ccw.title=Rothlaigh ar tuathal\npage_rotate_ccw.label=Rothlaigh ar tuathal\npage_rotate_ccw_label=Rothlaigh ar tuathal\n\ncursor_text_select_tool.title=Cumasaigh an Uirlis Roghnaithe Téacs\ncursor_text_select_tool_label=Uirlis Roghnaithe Téacs\ncursor_hand_tool.title=Cumasaigh an Uirlis Láimhe\ncursor_hand_tool_label=Uirlis Láimhe\n\n# Document properties dialog box\ndocument_properties.title=Airíonna na Cáipéise…\ndocument_properties_label=Airíonna na Cáipéise…\ndocument_properties_file_name=Ainm an chomhaid:\ndocument_properties_file_size=Méid an chomhaid:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kB ({{size_b}} beart)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} beart)\ndocument_properties_title=Teideal:\ndocument_properties_author=Údar:\ndocument_properties_subject=Ábhar:\ndocument_properties_keywords=Eochairfhocail:\ndocument_properties_creation_date=Dáta Cruthaithe:\ndocument_properties_modification_date=Dáta Athraithe:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Cruthaitheoir:\ndocument_properties_producer=Cruthaitheoir an PDF:\ndocument_properties_version=Leagan PDF:\ndocument_properties_page_count=Líon Leathanach:\ndocument_properties_close=Dún\n\nprint_progress_message=Cáipéis á hullmhú le priontáil…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cealaigh\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Scoránaigh an Barra Taoibh\ntoggle_sidebar_notification.title=Scoránaigh an Barra Taoibh (achoimre/iatáin sa cháipéis)\ntoggle_sidebar_label=Scoránaigh an Barra Taoibh\ndocument_outline.title=Taispeáin Imlíne na Cáipéise (déchliceáil chun chuile rud a leathnú nó a laghdú)\ndocument_outline_label=Creatlach na Cáipéise\nattachments.title=Taispeáin Iatáin\nattachments_label=Iatáin\nthumbs.title=Taispeáin Mionsamhlacha\nthumbs_label=Mionsamhlacha\nfindbar.title=Aimsigh sa Cháipéis\nfindbar_label=Aimsigh\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Leathanach {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Mionsamhail Leathanaigh {{page}}\n\n# Find panel button title and messages\nfind_input.title=Aimsigh\nfind_input.placeholder=Aimsigh sa cháipéis…\nfind_previous.title=Aimsigh an sampla roimhe seo den nath seo\nfind_previous_label=Roimhe seo\nfind_next.title=Aimsigh an chéad sampla eile den nath sin\nfind_next_label=Ar aghaidh\nfind_highlight=Aibhsigh uile\nfind_match_case_label=Cásíogair\nfind_reached_top=Ag barr na cáipéise, ag leanúint ón mbun\nfind_reached_bottom=Ag bun na cáipéise, ag leanúint ón mbarr\nfind_not_found=Frása gan aimsiú\n\n# Error panel labels\nerror_more_info=Tuilleadh Eolais\nerror_less_info=Níos Lú Eolais\nerror_close=Dún\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Teachtaireacht: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Cruach: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Comhad: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Líne: {{line}}\nrendering_error=Tharla earráid agus an leathanach á leagan amach.\n\n# Predefined zoom values\npage_scale_width=Leithead Leathanaigh\npage_scale_fit=Laghdaigh go dtí an Leathanach\npage_scale_auto=Súmáil Uathoibríoch\npage_scale_actual=Fíormhéid\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Earráid\nloading_error=Tharla earráid agus an cháipéis PDF á lódáil.\ninvalid_file_error=Comhad neamhbhailí nó truaillithe PDF.\nmissing_file_error=Comhad PDF ar iarraidh.\nunexpected_response_error=Freagra ón bhfreastalaí nach rabhthas ag súil leis.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anótáil {{type}}]\npassword_label=Cuir an focal faire isteach chun an comhad PDF seo a oscailt.\npassword_invalid=Focal faire mícheart. Déan iarracht eile.\npassword_ok=OK\npassword_cancel=Cealaigh\n\nprinting_not_supported=Rabhadh: Ní thacaíonn an brabhsálaí le priontáil go hiomlán.\nprinting_not_ready=Rabhadh: Ní féidir an PDF a phriontáil go dtí go mbeidh an cháipéis iomlán lódáilte.\nweb_fonts_disabled=Tá clófhoirne Gréasáin díchumasaithe: ní féidir clófhoirne leabaithe PDF a úsáid.\ndocument_colors_not_allowed=Níl cead ag cáipéisí PDF a ndathanna féin a roghnú: tá “Tabhair cead do leathanaigh a ndathanna féin a roghnú” díchumasaithe sa mbrabhsálaí.\n"
  },
  {
    "path": "pages/include/pdf/locale/gd/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=An duilleag roimhe\nprevious_label=Air ais\nnext.title=An ath-dhuilleag\nnext_label=Air adhart\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Duilleag\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=à {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} à {{pagesCount}})\n\nzoom_out.title=Sùm a-mach\nzoom_out_label=Sùm a-mach\nzoom_in.title=Sùm a-steach\nzoom_in_label=Sùm a-steach\nzoom.title=Sùm\npresentation_mode.title=Gearr leum dhan mhodh taisbeanaidh\npresentation_mode_label=Am modh taisbeanaidh\nopen_file.title=Fosgail faidhle\nopen_file_label=Fosgail\nprint.title=Clò-bhuail\nprint_label=Clò-bhuail\ndownload.title=Luchdaich a-nuas\ndownload_label=Luchdaich a-nuas\nbookmark.title=An sealladh làithreach (dèan lethbhreac no fosgail e ann an uinneag ùr)\nbookmark_label=An sealladh làithreach\n\n# Secondary toolbar and context menu\ntools.title=Innealan\ntools_label=Innealan\nfirst_page.title=Rach gun chiad duilleag\nfirst_page.label=Rach gun chiad duilleag\nfirst_page_label=Rach gun chiad duilleag\nlast_page.title=Rach gun duilleag mu dheireadh\nlast_page.label=Rach gun duilleag mu dheireadh\nlast_page_label=Rach gun duilleag mu dheireadh\npage_rotate_cw.title=Cuairtich gu deiseil\npage_rotate_cw.label=Cuairtich gu deiseil\npage_rotate_cw_label=Cuairtich gu deiseil\npage_rotate_ccw.title=Cuairtich gu tuathail\npage_rotate_ccw.label=Cuairtich gu tuathail\npage_rotate_ccw_label=Cuairtich gu tuathail\n\ncursor_text_select_tool.title=Cuir an comas inneal taghadh an teacsa\ncursor_text_select_tool_label=Inneal taghadh an teacsa\ncursor_hand_tool.title=Cuir inneal na làimhe an comas\ncursor_hand_tool_label=Inneal na làimhe\n\n# Document properties dialog box\ndocument_properties.title=Roghainnean na sgrìobhainne…\ndocument_properties_label=Roghainnean na sgrìobhainne…\ndocument_properties_file_name=Ainm an fhaidhle:\ndocument_properties_file_size=Meud an fhaidhle:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Tiotal:\ndocument_properties_author=Ùghdar:\ndocument_properties_subject=Cuspair:\ndocument_properties_keywords=Faclan-luirg:\ndocument_properties_creation_date=Latha a chruthachaidh:\ndocument_properties_modification_date=Latha atharrachaidh:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Cruthadair:\ndocument_properties_producer=Saothraiche a' PDF:\ndocument_properties_version=Tionndadh a' PDF:\ndocument_properties_page_count=Àireamh de dhuilleagan:\ndocument_properties_close=Dùin\n\nprint_progress_message=Ag ullachadh na sgrìobhainn airson clò-bhualadh…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Sguir dheth\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Toglaich am bàr-taoibh\ntoggle_sidebar_notification.title=Toglaich am bàr-taoibh (tha oir-loidhne/ceanglachain aig an sgrìobhainn)\ntoggle_sidebar_label=Toglaich am bàr-taoibh\ndocument_outline.title=Seall oir-loidhne na sgrìobhainn (dèan briogadh dùbailte airson a h-uile nì a leudachadh/a cho-theannadh)\ndocument_outline_label=Oir-loidhne na sgrìobhainne\nattachments.title=Seall na ceanglachain\nattachments_label=Ceanglachain\nthumbs.title=Seall na dealbhagan\nthumbs_label=Dealbhagan\nfindbar.title=Lorg san sgrìobhainn\nfindbar_label=Lorg\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Duilleag a {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Dealbhag duilleag a {{page}}\n\n# Find panel button title and messages\nfind_input.title=Lorg\nfind_input.placeholder=Lorg san sgrìobhainn...\nfind_previous.title=Lorg làthair roimhe na h-abairt seo\nfind_previous_label=Air ais\nfind_next.title=Lorg ath-làthair na h-abairt seo\nfind_next_label=Air adhart\nfind_highlight=Soillsich a h-uile\nfind_match_case_label=Aire do litrichean mòra is beaga\nfind_reached_top=Ràinig sinn barr na duilleige, a' leantainn air adhart o bhonn na duilleige\nfind_reached_bottom=Ràinig sinn bonn na duilleige, a' leantainn air adhart o bharr na duilleige\nfind_not_found=Cha deach an abairt a lorg\n\n# Error panel labels\nerror_more_info=Barrachd fiosrachaidh\nerror_less_info=Nas lugha de dh'fhiosrachadh\nerror_close=Dùin\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Teachdaireachd: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stac: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Faidhle: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Loidhne: {{line}}\nrendering_error=Thachair mearachd rè reandaradh na duilleige.\n\n# Predefined zoom values\npage_scale_width=Leud na duilleige\npage_scale_fit=Freagair ri meud na duilleige\npage_scale_auto=Sùm fèin-obrachail\npage_scale_actual=Am fìor-mheud\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Mearachd\nloading_error=Thachair mearachd rè luchdadh a' PDF.\ninvalid_file_error=Faidhle PDF a tha mì-dhligheach no coirbte.\nmissing_file_error=Faidhle PDF a tha a dhìth.\nunexpected_response_error=Freagairt on fhrithealaiche ris nach robh dùil.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Nòtachadh {{type}}]\npassword_label=Cuir a-steach am facal-faire gus am faidhle PDF seo fhosgladh.\npassword_invalid=Tha am facal-faire cearr. Nach fheuch thu ris a-rithist?\npassword_ok=Ceart ma-tha\npassword_cancel=Sguir dheth\n\nprinting_not_supported=Rabhadh: Chan eil am brabhsair seo a' cur làn-taic ri clò-bhualadh.\nprinting_not_ready=Rabhadh: Cha deach am PDF a luchdadh gu tur airson clò-bhualadh.\nweb_fonts_disabled=Tha cruthan-clò lìn à comas: Chan urrainn dhuinn cruthan-clò PDF leabaichte a chleachdadh.\ndocument_colors_not_allowed=Chan fhaod sgrìobhainnean PDF na dathan aca fhèin a chleachdadh: Tha “Leig le duilleagan na dathan aca fhèin a chleachdadh” à comas sa bhrabhsair.\n"
  },
  {
    "path": "pages/include/pdf/locale/gl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Páxina anterior\nprevious_label=Anterior\nnext.title=Seguinte páxina\nnext_label=Seguinte\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Reducir\nzoom_out_label=Reducir\nzoom_in.title=Ampliar\nzoom_in_label=Ampliar\nzoom.title=Zoom\npresentation_mode.title=Cambiar ao modo presentación\npresentation_mode_label=Modo presentación\nopen_file.title=Abrir ficheiro\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Descargar\ndownload_label=Descargar\nbookmark.title=Vista actual (copiar ou abrir nunha nova xanela)\nbookmark_label=Vista actual\n\n# Secondary toolbar and context menu\ntools.title=Ferramentas\ntools_label=Ferramentas\nfirst_page.title=Ir á primeira páxina\nfirst_page.label=Ir á primeira páxina\nfirst_page_label=Ir á primeira páxina\nlast_page.title=Ir á última páxina\nlast_page.label=Ir á última páxina\nlast_page_label=Ir á última páxina\npage_rotate_cw.title=Rotar no sentido das agullas do reloxo\npage_rotate_cw.label=Rotar no sentido das agullas do reloxo\npage_rotate_cw_label=Rotar no sentido das agullas do reloxo\npage_rotate_ccw.title=Rotar no sentido contrario ás agullas do reloxo\npage_rotate_ccw.label=Rotar no sentido contrario ás agullas do reloxo\npage_rotate_ccw_label=Rotar no sentido contrario ás agullas do reloxo\n\n\n# Document properties dialog box\ndocument_properties.title=Propiedades do documento…\ndocument_properties_label=Propiedades do documento…\ndocument_properties_file_name=Nome do ficheiro:\ndocument_properties_file_size=Tamaño do ficheiro:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Asunto: \ndocument_properties_keywords=Palabras clave:\ndocument_properties_creation_date=Data de creación:\ndocument_properties_modification_date=Data de modificación:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creado por:\ndocument_properties_producer=Xenerador do PDF:\ndocument_properties_version=Versión de PDF:\ndocument_properties_page_count=Número de páxinas:\ndocument_properties_close=Pechar\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Amosar/agochar a barra lateral\ntoggle_sidebar_label=Amosar/agochar a barra lateral\nattachments.title=Amosar anexos\nattachments_label=Anexos\nthumbs.title=Amosar miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Atopar no documento\nfindbar_label=Atopar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Páxina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura da páxina {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Atopar a anterior aparición da frase\nfind_previous_label=Anterior\nfind_next.title=Atopar a seguinte aparición da frase\nfind_next_label=Seguinte\nfind_highlight=Realzar todo\nfind_match_case_label=Diferenciar maiúsculas de minúsculas\nfind_reached_top=Chegouse ao inicio do documento, continuar desde o final\nfind_reached_bottom=Chegouse ao final do documento, continuar desde o inicio\nfind_not_found=Non se atopou a frase\n\n# Error panel labels\nerror_more_info=Máis información\nerror_less_info=Menos información\nerror_close=Pechar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (Identificador da compilación: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensaxe: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ficheiro: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Liña: {{line}}\nrendering_error=Produciuse un erro ao representar a páxina.\n\n# Predefined zoom values\npage_scale_width=Largura da páxina\npage_scale_fit=Axuste de páxina\npage_scale_auto=Zoom automático\npage_scale_actual=Tamaño actual\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Erro\nloading_error=Produciuse un erro ao cargar o PDF.\ninvalid_file_error=Ficheiro PDF danado ou incorrecto.\nmissing_file_error=Falta o ficheiro PDF.\nunexpected_response_error=Resposta inesperada do servidor.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotación {{type}}]\npassword_label=Escriba o contrasinal para abrir este ficheiro PDF.\npassword_invalid=Contrasinal incorrecto. Tente de novo.\npassword_ok=Aceptar\npassword_cancel=Cancelar\n\nprinting_not_supported=Aviso: A impresión non é compatíbel de todo con este navegador.\nprinting_not_ready=Aviso: O PDF non se cargou completamente para imprimirse.\nweb_fonts_disabled=Desactiváronse as fontes web:  foi imposíbel usar as fontes incrustadas no PDF.\n"
  },
  {
    "path": "pages/include/pdf/locale/gu-IN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=પહેલાનુ પાનું\nprevious_label=પહેલાનુ\nnext.title=આગળનુ પાનું\nnext_label=આગળનું\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=મોટુ કરો\nzoom_out_label=મોટુ કરો\nzoom_in.title=નાનું કરો\nzoom_in_label=નાનું કરો\nzoom.title=નાનું મોટુ કરો\npresentation_mode.title=રજૂઆત સ્થિતિમાં જાવ\npresentation_mode_label=રજૂઆત સ્થિતિ\nopen_file.title=ફાઇલ ખોલો\nopen_file_label=ખોલો\nprint.title=છાપો\nprint_label=છારો\ndownload.title=ડાઉનલોડ\ndownload_label=ડાઉનલોડ\nbookmark.title=વર્તમાન દૃશ્ય (નવી વિન્ડોમાં નકલ કરો અથવા ખોલો)\nbookmark_label=વર્તમાન દૃશ્ય\n\n# Secondary toolbar and context menu\ntools.title=સાધનો\ntools_label=સાધનો\nfirst_page.label=પહેલાં પાનામાં જાવ\nfirst_page_label=પ્રથમ પાનાં પર જાવ\nlast_page.label=છેલ્લા પાનામાં જાવ\nlast_page_label=છેલ્લા પાનાં પર જાવ\npage_rotate_cw.label=ઘડિયાળનાં કાંટાની જેમ ફેરવો\npage_rotate_cw_label=ઘડિયાળનાં કાંટા તરફ ફેરવો\npage_rotate_ccw.label=ઘડિયાળનાં કાંટાની ઉલટી દિશામાં ફેરવો\npage_rotate_ccw_label=ઘડિયાળનાં કાંટાની વિરુદ્દ ફેરવો\n\n\n# Document properties dialog box\ndocument_properties.title=દસ્તાવેજ ગુણધર્મો…\ndocument_properties_label=દસ્તાવેજ ગુણધર્મો…\ndocument_properties_file_name=ફાઇલ નામ:\ndocument_properties_file_size=ફાઇલ માપ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} બાઇટ)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} બાઇટ)\ndocument_properties_title=શીર્ષક:\ndocument_properties_author=લેખક:\ndocument_properties_subject=વિષય:\ndocument_properties_keywords=કિવર્ડ:\ndocument_properties_creation_date=નિર્માણ તારીખ:\ndocument_properties_modification_date=ફેરફાર તારીખ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=નિર્માતા:\ndocument_properties_producer=PDF નિર્માતા:\ndocument_properties_version=PDF આવૃત્તિ:\ndocument_properties_page_count=પાનાં ગણતરી:\ndocument_properties_close=બંધ કરો\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ટૉગલ બાજુપટ્ટી\ntoggle_sidebar_label=ટૉગલ બાજુપટ્ટી\ndocument_outline_label=દસ્તાવેજ રૂપરેખા\nattachments.title=જોડાણોને બતાવો\nattachments_label=જોડાણો\nthumbs.title=થંબનેલ્સ બતાવો\nthumbs_label=થંબનેલ્સ\nfindbar.title=દસ્તાવેજમાં શોધો\nfindbar_label=શોધો\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=પાનું {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=પાનાં {{page}} નું થંબનેલ્સ\n\n# Find panel button title and messages\nfind_previous.title=શબ્દસમૂહની પાછલી ઘટનાને શોધો\nfind_previous_label=પહેલાંનુ\nfind_next.title=શબ્દસમૂહની આગળની ઘટનાને શોધો\nfind_next_label=આગળનું\nfind_highlight=બધુ પ્રકાશિત કરો\nfind_match_case_label=કેસ બંધબેસાડો\nfind_reached_top=દસ્તાવેજનાં ટોચે પહોંચી ગયા, તળિયેથી ચાલુ કરેલ હતુ\nfind_reached_bottom=દસ્તાવેજનાં અંતે પહોંચી ગયા, ઉપરથી ચાલુ કરેલ હતુ\nfind_not_found=શબ્દસમૂહ મળ્યુ નથી\n\n# Error panel labels\nerror_more_info=વધારે જાણકારી\nerror_less_info=ઓછી જાણકારી\nerror_close=બંધ કરો\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=સંદેશો: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=સ્ટેક: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ફાઇલ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=વાક્ય: {{line}}\nrendering_error=ભૂલ ઉદ્ભવી જ્યારે પાનાંનુ રેન્ડ કરી રહ્યા હોય.\n\n# Predefined zoom values\npage_scale_width=પાનાની પહોળાઇ\npage_scale_fit=પાનું બંધબેસતુ\npage_scale_auto=આપમેળે નાનુંમોટુ કરો\npage_scale_actual=ચોક્કસ માપ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=ભૂલ\nloading_error=ભૂલ ઉદ્ભવી જ્યારે PDF ને લાવી રહ્યા હોય.\ninvalid_file_error=અયોગ્ય અથવા ભાંગેલ PDF ફાઇલ.\nmissing_file_error=ગુમ થયેલ PDF ફાઇલ.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=આ PDF ફાઇલને ખોલવા પાસવર્ડને દાખલ કરો.\npassword_invalid=અયોગ્ય પાસવર્ડ. મહેરબાની કરીને ફરી પ્રયત્ન કરો.\npassword_ok=બરાબર\n\nprinting_not_supported=ચેતવણી: છાપવાનું આ બ્રાઉઝર દ્દારા સંપૂર્ણપણે આધારભૂત નથી.\nprinting_not_ready=Warning: PDF એ છાપવા માટે સંપૂર્ણપણે લાવેલ છે.\nweb_fonts_disabled=વેબ ફોન્ટ નિષ્ક્રિય થયેલ છે: ઍમ્બેડ થયેલ PDF ફોન્ટને વાપરવાનું અસમર્થ.\ndocument_colors_not_allowed=PDF દસ્તાવેજો તેનાં પોતાના રંગોને વાપરવા પરવાનગી આપતા નથી: 'તેનાં પોતાનાં રંગોને પસંદ કરવા માટે પાનાંને પરવાનગી આપો' બ્રાઉઝરમાં નિષ્ક્રિય થયેલ છે.\n"
  },
  {
    "path": "pages/include/pdf/locale/he/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=דף קודם\nprevious_label=קודם\nnext.title=דף הבא\nnext_label=הבא\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=דף\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=מתוך {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} מתוך {{pagesCount}})\n\nzoom_out.title=התרחקות\nzoom_out_label=התרחקות\nzoom_in.title=התקרבות\nzoom_in_label=התקרבות\nzoom.title=מרחק מתצוגה\npresentation_mode.title=מעבר למצב מצגת\npresentation_mode_label=מצב מצגת\nopen_file.title=פתיחת קובץ\nopen_file_label=פתיחה\nprint.title=הדפסה\nprint_label=הדפסה\ndownload.title=הורדה\ndownload_label=הורדה\nbookmark.title=תצוגה נוכחית (העתקה או פתיחה בחלון חדש)\nbookmark_label=תצוגה נוכחית\n\n# Secondary toolbar and context menu\ntools.title=כלים\ntools_label=כלים\nfirst_page.title=מעבר לעמוד הראשון\nfirst_page.label=מעבר לעמוד הראשון\nfirst_page_label=מעבר לעמוד הראשון\nlast_page.title=מעבר לעמוד האחרון\nlast_page.label=מעבר לעמוד האחרון\nlast_page_label=מעבר לעמוד האחרון\npage_rotate_cw.title=הטיה עם כיוון השעון\npage_rotate_cw.label=הטיה עם כיוון השעון\npage_rotate_cw_label=הטיה עם כיוון השעון\npage_rotate_ccw.title=הטיה כנגד כיוון השעון\npage_rotate_ccw.label=הטיה כנגד כיוון השעון\npage_rotate_ccw_label=הטיה כנגד כיוון השעון\n\ncursor_text_select_tool.title=הפעלת כלי בחירת טקסט\ncursor_text_select_tool_label=כלי בחירת טקסט\ncursor_hand_tool.title=הפעלת כלי היד\ncursor_hand_tool_label=כלי יד\n\n# Document properties dialog box\ndocument_properties.title=מאפייני מסמך…\ndocument_properties_label=מאפייני מסמך…\ndocument_properties_file_name=שם קובץ:\ndocument_properties_file_size=גודל הקובץ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} ק״ב ({{size_b}} בתים)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} מ״ב ({{size_b}} בתים)\ndocument_properties_title=כותרת:\ndocument_properties_author=מחבר:\ndocument_properties_subject=נושא:\ndocument_properties_keywords=מילות מפתח:\ndocument_properties_creation_date=תאריך יצירה:\ndocument_properties_modification_date=תאריך שינוי:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=יוצר:\ndocument_properties_producer=יצרן PDF:\ndocument_properties_version=גרסת PDF:\ndocument_properties_page_count=מספר דפים:\ndocument_properties_close=סגירה\n\nprint_progress_message=מסמך בהכנה להדפסה…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=ביטול\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=הצגה/הסתרה של סרגל הצד\ntoggle_sidebar_notification.title=החלפת תצוגת סרגל צד (מסמך שמכיל מתאר/צרופות)\ntoggle_sidebar_label=הצגה/הסתרה של סרגל הצד\ndocument_outline.title=הצגת מתאר מסמך (לחיצה כפולה כדי להרחיב או לצמצם את כל הפריטים)\ndocument_outline_label=מתאר מסמך\nattachments.title=הצגת צרופות\nattachments_label=צרופות\nthumbs.title=הצגת תצוגה מקדימה\nthumbs_label=תצוגה מקדימה\nfindbar.title=חיפוש במסמך\nfindbar_label=חיפוש\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=עמוד {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=תצוגה מקדימה של עמוד {{page}}\n\n# Find panel button title and messages\nfind_input.title=חיפוש\nfind_input.placeholder=חיפוש במסמך…\nfind_previous.title=חיפוש מופע קודם של הביטוי\nfind_previous_label=קודם\nfind_next.title=חיפוש המופע הבא של הביטוי\nfind_next_label=הבא\nfind_highlight=הדגשת הכול\nfind_match_case_label=התאמת אותיות\nfind_reached_top=הגיע לראש הדף, ממשיך מלמטה\nfind_reached_bottom=הגיע לסוף הדף, ממשיך מלמעלה\nfind_not_found=ביטוי לא נמצא\n\n# Error panel labels\nerror_more_info=מידע נוסף\nerror_less_info=פחות מידע\nerror_close=סגירה\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js גרסה {{version}} (בנייה: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=הודעה: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=תוכן מחסנית: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=קובץ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=שורה: {{line}}\nrendering_error=אירעה שגיאה בעת עיבוד הדף.\n\n# Predefined zoom values\npage_scale_width=רוחב העמוד\npage_scale_fit=התאמה לעמוד\npage_scale_auto=מרחק מתצוגה אוטומטי\npage_scale_actual=גודל אמתי\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=שגיאה\nloading_error=אירעה שגיאה בעת טעינת ה־PDF.\ninvalid_file_error=קובץ PDF פגום או לא תקין.\nmissing_file_error=קובץ PDF חסר.\nunexpected_response_error=תגובת שרת לא צפויה.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[הערת {{type}}]\npassword_label=נא להכניס את הססמה לפתיחת קובץ PDF זה.\npassword_invalid=ססמה שגויה. נא לנסות שנית.\npassword_ok=אישור\npassword_cancel=ביטול\n\nprinting_not_supported=אזהרה: הדפסה אינה נתמכת במלואה בדפדפן זה.\nprinting_not_ready=אזהרה: ה־PDF לא ניתן לחלוטין עד מצב שמאפשר הדפסה.\nweb_fonts_disabled=גופני רשת מנוטרלים: לא ניתן להשתמש בגופני PDF מוטבעים.\ndocument_colors_not_allowed=מסמכי PDF אינם מורשים להשתמש בצבעים משלהם: האפשרות „אפשר לעמודים לבחור צבעים משלהם” אינה פעילה בדפדפן.\n"
  },
  {
    "path": "pages/include/pdf/locale/hi-IN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=पिछला पृष्ठ\nprevious_label=पिछला\nnext.title=अगला पृष्ठ\nnext_label=आगे\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=पृष्ठ:\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} का\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=\\u0020छोटा करें\nzoom_out_label=\\u0020छोटा करें\nzoom_in.title=बड़ा करें\nzoom_in_label=बड़ा करें\nzoom.title=बड़ा-छोटा करें\npresentation_mode.title=प्रस्तुति अवस्था में जाएँ\npresentation_mode_label=\\u0020प्रस्तुति अवस्था\nopen_file.title=फ़ाइल खोलें\nopen_file_label=\\u0020खोलें\nprint.title=छापें\nprint_label=\\u0020छापें\ndownload.title=डाउनलोड\ndownload_label=डाउनलोड\nbookmark.title=मौजूदा दृश्य (नए विंडो में नक़ल लें या खोलें)\nbookmark_label=\\u0020मौजूदा दृश्य\n\n# Secondary toolbar and context menu\ntools.title=औज़ार\ntools_label=औज़ार\nfirst_page.title=प्रथम पृष्ठ पर जाएँ\nfirst_page.label=\\u0020प्रथम पृष्ठ पर जाएँ\nfirst_page_label=प्रथम पृष्ठ पर जाएँ\nlast_page.title=अंतिम पृष्ठ पर जाएँ\nlast_page.label=\\u0020अंतिम पृष्ठ पर जाएँ\nlast_page_label=\\u0020अंतिम पृष्ठ पर जाएँ\npage_rotate_cw.title=घड़ी की दिशा में घुमाएँ\npage_rotate_cw.label=घड़ी की दिशा में घुमाएँ\npage_rotate_cw_label=घड़ी की दिशा में घुमाएँ\npage_rotate_ccw.title=घड़ी की दिशा से उल्टा घुमाएँ\npage_rotate_ccw.label=घड़ी की दिशा से उल्टा घुमाएँ\npage_rotate_ccw_label=\\u0020घड़ी की दिशा से उल्टा घुमाएँ\n\n\n# Document properties dialog box\ndocument_properties.title=दस्तावेज़ विशेषता...\ndocument_properties_label=दस्तावेज़ विशेषता...\ndocument_properties_file_name=फ़ाइल नाम:\ndocument_properties_file_size=फाइल आकारः\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=शीर्षक:\ndocument_properties_author=लेखकः\ndocument_properties_subject=विषय:\ndocument_properties_keywords=कुंजी-शब्द:\ndocument_properties_creation_date=निर्माण दिनांक:\ndocument_properties_modification_date=संशोधन दिनांक:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=निर्माता:\ndocument_properties_producer=PDF उत्पादक:\ndocument_properties_version=PDF संस्करण:\ndocument_properties_page_count=पृष्ठ गिनती:\ndocument_properties_close=बंद करें\n\nprint_progress_message=छपाई के लिए दस्तावेज़ को तैयार किया जा रहा है...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=रद्द करें\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=\\u0020स्लाइडर टॉगल करें\ntoggle_sidebar_label=स्लाइडर टॉगल करें\ndocument_outline.title=दस्तावेज़ की रूपरेखा दिखाइए (सारी वस्तुओं को फलने अथवा समेटने के लिए दो बार क्लिक करें)\ndocument_outline_label=दस्तावेज़ आउटलाइन\nattachments.title=संलग्नक दिखायें\nattachments_label=संलग्नक\nthumbs.title=लघुछवियाँ दिखाएँ\nthumbs_label=लघु छवि\nfindbar.title=\\u0020दस्तावेज़ में ढूँढ़ें\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=पृष्ठ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=पृष्ठ {{page}} की लघु-छवि\n\n# Find panel button title and messages\nfind_previous.title=वाक्यांश की पिछली उपस्थिति ढूँढ़ें\nfind_previous_label=पिछला\nfind_next.title=वाक्यांश की अगली उपस्थिति ढूँढ़ें\nfind_next_label=आगे\nfind_highlight=\\u0020सभी आलोकित करें\nfind_match_case_label=मिलान स्थिति\nfind_reached_top=पृष्ठ के ऊपर पहुंच गया, नीचे से जारी रखें\nfind_reached_bottom=पृष्ठ के नीचे में जा पहुँचा, ऊपर से जारी\nfind_not_found=वाक्यांश नहीं मिला\n\n# Error panel labels\nerror_more_info=अधिक सूचना\nerror_less_info=कम सूचना\nerror_close=बंद करें\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=\\u0020संदेश: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=स्टैक: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=फ़ाइल: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=पंक्ति: {{line}}\nrendering_error=पृष्ठ रेंडरिंग के दौरान त्रुटि आई.\n\n# Predefined zoom values\npage_scale_width=\\u0020पृष्ठ चौड़ाई\npage_scale_fit=पृष्ठ फिट\npage_scale_auto=स्वचालित जूम\npage_scale_actual=वास्तविक आकार\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=त्रुटि\nloading_error=PDF लोड करते समय एक त्रुटि हुई.\ninvalid_file_error=अमान्य या भ्रष्ट PDF फ़ाइल.\nmissing_file_error=\\u0020अनुपस्थित PDF फ़ाइल.\nunexpected_response_error=अप्रत्याशित सर्वर प्रतिक्रिया.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=\\u0020[{{type}} Annotation]\npassword_label=इस PDF फ़ाइल को खोलने के लिए कृपया कूटशब्द भरें.\npassword_invalid=अवैध कूटशब्द, कृपया फिर कोशिश करें.\npassword_ok=OK\npassword_cancel=रद्द करें\n\nprinting_not_supported=चेतावनी: इस ब्राउज़र पर छपाई पूरी तरह से समर्थित नहीं है.\nprinting_not_ready=चेतावनी: PDF छपाई के लिए पूरी तरह से लोड नहीं है.\nweb_fonts_disabled=वेब फॉन्ट्स निष्क्रिय हैं: अंतःस्थापित PDF फॉन्टस के उपयोग में असमर्थ.\ndocument_colors_not_allowed=PDF दस्तावेज़ उनके अपने रंग को उपयोग करने के लिए अनुमति प्राप्त नहीं है: \"पृष्ठों को उनके अपने रंग को चुनने के लिए स्वीकृति दें\" कि वह उस ब्राउज़र में निष्क्रिय है.\n"
  },
  {
    "path": "pages/include/pdf/locale/hr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Prethodna stranica\nprevious_label=Prethodna\nnext.title=Sljedeća stranica\nnext_label=Sljedeća\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Stranica\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=od {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} od {{pagesCount}})\n\nzoom_out.title=Uvećaj\nzoom_out_label=Smanji\nzoom_in.title=Uvećaj\nzoom_in_label=Smanji\nzoom.title=Uvećanje\npresentation_mode.title=Prebaci u prezentacijski način rada\npresentation_mode_label=Prezentacijski način rada\nopen_file.title=Otvori datoteku\nopen_file_label=Otvori\nprint.title=Ispis\nprint_label=Ispis\ndownload.title=Preuzmi\ndownload_label=Preuzmi\nbookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru)\nbookmark_label=Trenutni prikaz\n\n# Secondary toolbar and context menu\ntools.title=Alati\ntools_label=Alati\nfirst_page.title=Idi na prvu stranicu\nfirst_page.label=Idi na prvu stranicu\nfirst_page_label=Idi na prvu stranicu\nlast_page.title=Idi na posljednju stranicu\nlast_page.label=Idi na posljednju stranicu\nlast_page_label=Idi na posljednju stranicu\npage_rotate_cw.title=Rotiraj u smjeru kazaljke na satu\npage_rotate_cw.label=Rotiraj u smjeru kazaljke na satu\npage_rotate_cw_label=Rotiraj u smjeru kazaljke na satu\npage_rotate_ccw.title=Rotiraj obrnutno od smjera kazaljke na satu\npage_rotate_ccw.label=Rotiraj obrnutno od smjera kazaljke na satu\npage_rotate_ccw_label=Rotiraj obrnutno od smjera kazaljke na satu\n\ncursor_text_select_tool.title=Omogući alat za označavanje teksta\ncursor_text_select_tool_label=Alat za označavanje teksta\ncursor_hand_tool.title=Omogući ručni alat\ncursor_hand_tool_label=Ručni alat\n\n# Document properties dialog box\ndocument_properties.title=Svojstva dokumenta...\ndocument_properties_label=Svojstva dokumenta...\ndocument_properties_file_name=Naziv datoteke:\ndocument_properties_file_size=Veličina datoteke:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajtova)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajtova)\ndocument_properties_title=Naslov:\ndocument_properties_author=Autor:\ndocument_properties_subject=Predmet:\ndocument_properties_keywords=Ključne riječi:\ndocument_properties_creation_date=Datum stvaranja:\ndocument_properties_modification_date=Datum promjene:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Stvaratelj:\ndocument_properties_producer=PDF stvaratelj:\ndocument_properties_version=PDF inačica:\ndocument_properties_page_count=Broj stranica:\ndocument_properties_close=Zatvori\n\nprint_progress_message=Pripremanje dokumenta za ispis…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Odustani\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Prikaži/sakrij bočnu traku\ntoggle_sidebar_notification.title=Prikazivanje i sklanjanje bočne trake (dokument sadrži konturu/privitke)\ntoggle_sidebar_label=Prikaži/sakrij bočnu traku\ndocument_outline.title=Prikaži obris dokumenta (dvostruki klik za proširivanje/skupljanje svih stavki)\ndocument_outline_label=Obris dokumenta\nattachments.title=Prikaži privitke\nattachments_label=Privitci\nthumbs.title=Prikaži sličice\nthumbs_label=Sličice\nfindbar.title=Traži u dokumentu\nfindbar_label=Traži\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Stranica {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Sličica stranice {{page}}\n\n# Find panel button title and messages\nfind_input.title=Traži\nfind_input.placeholder=Traži u dokumentu…\nfind_previous.title=Pronađi prethodno javljanje ovog izraza\nfind_previous_label=Prethodno\nfind_next.title=Pronađi iduće javljanje ovog izraza\nfind_next_label=Sljedeće\nfind_highlight=Istankni sve\nfind_match_case_label=Slučaj podudaranja\nfind_reached_top=Dosegnut vrh dokumenta, nastavak od dna\nfind_reached_bottom=Dosegnut vrh dokumenta, nastavak od vrha\nfind_not_found=Izraz nije pronađen\n\n# Error panel labels\nerror_more_info=Više informacija\nerror_less_info=Manje informacija\nerror_close=Zatvori\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Poruka: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stog: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Datoteka: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Redak: {{line}}\nrendering_error=Došlo je do greške prilikom iscrtavanja stranice.\n\n# Predefined zoom values\npage_scale_width=Širina stranice\npage_scale_fit=Pristajanje stranici\npage_scale_auto=Automatsko uvećanje\npage_scale_actual=Prava veličina\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Greška\nloading_error=Došlo je do greške pri učitavanju PDF-a.\ninvalid_file_error=Kriva ili oštećena PDF datoteka.\nmissing_file_error=Nedostaje PDF datoteka.\nunexpected_response_error=Neočekivani odgovor poslužitelja.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Bilješka]\npassword_label=Upišite lozinku da biste otvorili ovu PDF datoteku.\npassword_invalid=Neispravna lozinka. Pokušajte ponovo.\npassword_ok=U redu\npassword_cancel=Odustani\n\nprinting_not_supported=Upozorenje: Ispisivanje nije potpuno podržano u ovom pregledniku.\nprinting_not_ready=Upozorenje: PDF nije u potpunosti učitan za ispis.\nweb_fonts_disabled=Web fontovi su onemogućeni: nije moguće koristiti umetnute PDF fontove.\ndocument_colors_not_allowed=PDF dokumenti nemaju dopuštene koristiti vlastite boje: opcija 'Dopusti stranicama da koriste vlastite boje' je deaktivirana.\n"
  },
  {
    "path": "pages/include/pdf/locale/hu/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Előző oldal\nprevious_label=Előző\nnext.title=Következő oldal\nnext_label=Tovább\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Oldal\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=összesen: {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=Kicsinyítés\nzoom_out_label=Kicsinyítés\nzoom_in.title=Nagyítás\nzoom_in_label=Nagyítás\nzoom.title=Nagyítás\npresentation_mode.title=Váltás bemutató módba\npresentation_mode_label=Bemutató mód\nopen_file.title=Fájl megnyitása\nopen_file_label=Megnyitás\nprint.title=Nyomtatás\nprint_label=Nyomtatás\ndownload.title=Letöltés\ndownload_label=Letöltés\nbookmark.title=Jelenlegi nézet (másolás vagy megnyitás új ablakban)\nbookmark_label=Aktuális nézet\n\n# Secondary toolbar and context menu\ntools.title=Eszközök\ntools_label=Eszközök\nfirst_page.title=Ugrás az első oldalra\nfirst_page.label=Ugrás az első oldalra\nfirst_page_label=Ugrás az első oldalra\nlast_page.title=Ugrás az utolsó oldalra\nlast_page.label=Ugrás az utolsó oldalra\nlast_page_label=Ugrás az utolsó oldalra\npage_rotate_cw.title=Forgatás az óramutató járásával egyezően\npage_rotate_cw.label=Forgatás az óramutató járásával egyezően\npage_rotate_cw_label=Forgatás az óramutató járásával egyezően\npage_rotate_ccw.title=Forgatás az óramutató járásával ellentétesen\npage_rotate_ccw.label=Forgatás az óramutató járásával ellentétesen\npage_rotate_ccw_label=Forgatás az óramutató járásával ellentétesen\n\ncursor_text_select_tool.title=Szövegkijelölő eszköz bekapcsolása\ncursor_text_select_tool_label=Szövegkijelölő eszköz\ncursor_hand_tool.title=Kéz eszköz bekapcsolása\ncursor_hand_tool_label=Kéz eszköz\n\n# Document properties dialog box\ndocument_properties.title=Dokumentum tulajdonságai…\ndocument_properties_label=Dokumentum tulajdonságai…\ndocument_properties_file_name=Fájlnév:\ndocument_properties_file_size=Fájlméret:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bájt)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bájt)\ndocument_properties_title=Cím:\ndocument_properties_author=Szerző:\ndocument_properties_subject=Tárgy:\ndocument_properties_keywords=Kulcsszavak:\ndocument_properties_creation_date=Létrehozás dátuma:\ndocument_properties_modification_date=Módosítás dátuma:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Létrehozta:\ndocument_properties_producer=PDF előállító:\ndocument_properties_version=PDF verzió:\ndocument_properties_page_count=Oldalszám:\ndocument_properties_close=Bezárás\n\nprint_progress_message=Dokumentum előkészítése nyomtatáshoz…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Mégse\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Oldalsáv be/ki\ntoggle_sidebar_notification.title=Oldalsáv be/ki (a dokumentum vázlatot/mellékleteket tartalmaz)\ntoggle_sidebar_label=Oldalsáv be/ki\ndocument_outline.title=Dokumentum megjelenítése online (dupla kattintás minden elem kinyitásához/összecsukásához)\ndocument_outline_label=Dokumentumvázlat\nattachments.title=Mellékletek megjelenítése\nattachments_label=Van melléklet\nthumbs.title=Bélyegképek megjelenítése\nthumbs_label=Bélyegképek\nfindbar.title=Keresés a dokumentumban\nfindbar_label=Keresés\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}}. oldal\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}. oldal bélyegképe\n\n# Find panel button title and messages\nfind_input.title=Keresés\nfind_input.placeholder=Keresés a dokumentumban…\nfind_previous.title=A kifejezés előző előfordulásának keresése\nfind_previous_label=Előző\nfind_next.title=A kifejezés következő előfordulásának keresése\nfind_next_label=Tovább\nfind_highlight=Összes kiemelése\nfind_match_case_label=Kis- és nagybetűk megkülönböztetése\nfind_reached_top=A dokumentum eleje elérve, folytatás a végétől\nfind_reached_bottom=A dokumentum vége elérve, folytatás az elejétől\nfind_not_found=A kifejezés nem található\n\n# Error panel labels\nerror_more_info=További tudnivalók\nerror_less_info=Kevesebb információ\nerror_close=Bezárás\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Üzenet: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Nyomkövetés: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fájl: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Sor: {{line}}\nrendering_error=Hiba történt az oldal feldolgozása közben.\n\n# Predefined zoom values\npage_scale_width=Oldalszélesség\npage_scale_fit=Teljes oldal\npage_scale_auto=Automatikus nagyítás\npage_scale_actual=Valódi méret\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Hiba\nloading_error=Hiba történt a PDF betöltésekor.\ninvalid_file_error=Érvénytelen vagy sérült PDF fájl.\nmissing_file_error=Hiányzó PDF fájl.\nunexpected_response_error=Váratlan kiszolgálóválasz.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} megjegyzés]\npassword_label=Adja meg a jelszót a PDF fájl megnyitásához.\npassword_invalid=Helytelen jelszó. Próbálja újra.\npassword_ok=OK\npassword_cancel=Mégse\n\nprinting_not_supported=Figyelmeztetés: Ez a böngésző nem teljesen támogatja a nyomtatást.\nprinting_not_ready=Figyelmeztetés: A PDF nincs teljesen betöltve a nyomtatáshoz.\nweb_fonts_disabled=Webes betűkészletek letiltva: nem használhatók a beágyazott PDF betűkészletek.\ndocument_colors_not_allowed=A PDF dokumentumok nem használhatják saját színeiket: „Az oldalak a saját maguk által kiválasztott színeket használhatják” beállítás ki van kapcsolva a böngészőben.\n"
  },
  {
    "path": "pages/include/pdf/locale/hy-AM/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Նախորդ էջը\nprevious_label=Նախորդը\nnext.title=Հաջորդ էջը\nnext_label=Հաջորդը\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Էջ.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}}-ից\\u0020\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}}-ը {{pagesCount}})-ից\n\nzoom_out.title=Փոքրացնել\nzoom_out_label=Փոքրացնել\nzoom_in.title=Խոշորացնել\nzoom_in_label=Խոշորացնել\nzoom.title=Մասշտաբը\\u0020\npresentation_mode.title=Անցնել Ներկայացման եղանակին\npresentation_mode_label=Ներկայացման եղանակ\nopen_file.title=Բացել Ֆայլ\nopen_file_label=Բացել\nprint.title=Տպել\nprint_label=Տպել\ndownload.title=Բեռնել\ndownload_label=Բեռնել\nbookmark.title=Ընթացիկ տեսքով (պատճենել կամ բացել նոր պատուհանում)\nbookmark_label=Ընթացիկ տեսքը\n\n# Secondary toolbar and context menu\ntools.title=Գործիքներ\ntools_label=Գործիքներ\nfirst_page.title=Անցնել առաջին էջին\nfirst_page.label=Անցնել առաջին էջին\nfirst_page_label=Անցնել առաջին էջին\nlast_page.title=Անցնել վերջին էջին\nlast_page.label=Անցնել վերջին էջին\nlast_page_label=Անցնել վերջին էջին\npage_rotate_cw.title=Պտտել ըստ ժամացույցի սլաքի\npage_rotate_cw.label=Պտտել ըստ ժամացույցի սլաքի\npage_rotate_cw_label=Պտտել ըստ ժամացույցի սլաքի\npage_rotate_ccw.title=Պտտել հակառակ ժամացույցի սլաքի\npage_rotate_ccw.label=Պտտել հակառակ ժամացույցի սլաքի\npage_rotate_ccw_label=Պտտել հակառակ ժամացույցի սլաքի\n\n\n# Document properties dialog box\ndocument_properties.title=Փաստաթղթի հատկությունները...\ndocument_properties_label=Փաստաթղթի հատկությունները...\ndocument_properties_file_name=Ֆայլի անունը.\ndocument_properties_file_size=Ֆայլի չափը.\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} ԿԲ ({{size_b}} բայթ)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} ՄԲ ({{size_b}} բայթ)\ndocument_properties_title=Վերնագիր.\ndocument_properties_author=Հեղինակ․\ndocument_properties_subject=Վերնագիր.\ndocument_properties_keywords=Հիմնաբառ.\ndocument_properties_creation_date=Ստեղծելու ամսաթիվը.\ndocument_properties_modification_date=Փոփոխելու ամսաթիվը.\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Ստեղծող.\ndocument_properties_producer=PDF-ի հեղինակը.\ndocument_properties_version=PDF-ի տարբերակը.\ndocument_properties_page_count=Էջերի քանակը.\ndocument_properties_close=Փակել\n\nprint_progress_message=Նախապատրաստում է փաստաթուղթը տպելուն...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Չեղարկել\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Բացել/Փակել Կողային վահանակը\ntoggle_sidebar_notification.title=Փոխանջատել Կողային գոտին (փաստաթուղթը պարունակում է ուրվագիծ/կցորդ)\ntoggle_sidebar_label=Բացել/Փակել Կողային վահանակը\ndocument_outline.title=Ցուցադրել փաստաթղթի ուրվագիծը (կրկնակի սեղմեք՝ միույթները ընդարձակելու/կոծկելու համար)\ndocument_outline_label=Փաստաթղթի բովանդակությունը\nattachments.title=Ցուցադրել կցորդները\nattachments_label=Կցորդներ\nthumbs.title=Ցուցադրել Մանրապատկերը\nthumbs_label=Մանրապատկերը\nfindbar.title=Գտնել փաստաթղթում\nfindbar_label=Որոնում\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Էջը {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Էջի մանրապատկերը {{page}}\n\n# Find panel button title and messages\nfind_input.title=Որոնում\nfind_input.placeholder=Գտնել փաստաթղթում...\nfind_previous.title=Գտնել անրահայտության նախորդ հանդիպումը\nfind_previous_label=Նախորդը\nfind_next.title=Գտիր արտահայտության հաջորդ հանդիպումը\nfind_next_label=Հաջորդը\nfind_highlight=Գունանշել բոլորը\nfind_match_case_label=Մեծ(փոքր)ատառ հաշվի առնել\nfind_reached_top=Հասել եք փաստաթղթի վերևին, կշարունակվի ներքևից\nfind_reached_bottom=Հասել եք փաստաթղթի վերջին, կշարունակվի վերևից\nfind_not_found=Արտահայտությունը չգտնվեց\n\n# Error panel labels\nerror_more_info=Ավելի շատ տեղեկություն\nerror_less_info=Քիչ տեղեկություն\nerror_close=Փակել\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (կառուցումը. {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Գրությունը. {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Շեղջ. {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ֆայլ. {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Տողը. {{line}}\nrendering_error=Սխալ՝ էջը ստեղծելիս:\n\n# Predefined zoom values\npage_scale_width=Էջի լայնքը\npage_scale_fit=Ձգել էջը\npage_scale_auto=Ինքնաշխատ\npage_scale_actual=Իրական չափը\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Սխալ\nloading_error=Սխալ՝ PDF ֆայլը բացելիս։\ninvalid_file_error=Սխալ կամ բնասված PDF ֆայլ:\nmissing_file_error=PDF ֆայլը բացակայում է:\nunexpected_response_error=Սպասարկիչի անսպասելի պատասխան:\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Ծանոթություն]\npassword_label=Մուտքագրեք PDF-ի գաղտնաբառը:\npassword_invalid=Գաղտնաբառը սխալ է: Կրկին փորձեք:\npassword_ok=Լավ\npassword_cancel=Չեղարկել\n\nprinting_not_supported=Զգուշացում. Տպելը ամբողջությամբ չի աջակցվում դիտարկիչի կողմից։\nprinting_not_ready=Զգուշացում. PDF-ը ամբողջությամբ չի բեռնավորվել տպելու համար:\nweb_fonts_disabled=Վեբ-տառատեսակները անջատված են. հնարավոր չէ օգտագործել ներկառուցված PDF տառատեսակները:\ndocument_colors_not_allowed=PDF փաստաթղթերին թույլատրված չէ օգտագործել իրենց սեփական գույները: “Թույլատրել էջերին ընտրել իրենց սեփական գույները“ ընտրանքը անջատված է դիտարկիչում:\n"
  },
  {
    "path": "pages/include/pdf/locale/id/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Laman Sebelumnya\nprevious_label=Sebelumnya\nnext.title=Laman Selanjutnya\nnext_label=Selanjutnya\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Halaman\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=dari {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} dari {{pagesCount}})\n\nzoom_out.title=Perkecil\nzoom_out_label=Perkecil\nzoom_in.title=Perbesar\nzoom_in_label=Perbesar\nzoom.title=Perbesaran\npresentation_mode.title=Ganti ke Mode Presentasi\npresentation_mode_label=Mode Presentasi\nopen_file.title=Buka Berkas\nopen_file_label=Buka\nprint.title=Cetak\nprint_label=Cetak\ndownload.title=Unduh\ndownload_label=Unduh\nbookmark.title=Tampilan Sekarang (salin atau buka di jendela baru)\nbookmark_label=Tampilan Sekarang\n\n# Secondary toolbar and context menu\ntools.title=Alat\ntools_label=Alat\nfirst_page.title=Buka Halaman Pertama\nfirst_page.label=Ke Halaman Pertama\nfirst_page_label=Buka Halaman Pertama\nlast_page.title=Buka Halaman Terakhir\nlast_page.label=Ke Halaman Terakhir\nlast_page_label=Buka Halaman Terakhir\npage_rotate_cw.title=Putar Searah Jarum Jam\npage_rotate_cw.label=Putar Searah Jarum Jam\npage_rotate_cw_label=Putar Searah Jarum Jam\npage_rotate_ccw.title=Putar Berlawanan Arah Jarum Jam\npage_rotate_ccw.label=Putar Berlawanan Arah Jarum Jam\npage_rotate_ccw_label=Putar Berlawanan Arah Jarum Jam\n\ncursor_text_select_tool.title=Aktifkan Alat Seleksi Teks\ncursor_text_select_tool_label=Alat Seleksi Teks\ncursor_hand_tool.title=Aktifkan Alat Tangan\ncursor_hand_tool_label=Alat Tangan\n\n# Document properties dialog box\ndocument_properties.title=Properti Dokumen…\ndocument_properties_label=Properti Dokumen…\ndocument_properties_file_name=Nama berkas:\ndocument_properties_file_size=Ukuran berkas:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} byte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title=Judul:\ndocument_properties_author=Penyusun:\ndocument_properties_subject=Subjek:\ndocument_properties_keywords=Kata Kunci:\ndocument_properties_creation_date=Tanggal Dibuat:\ndocument_properties_modification_date=Tanggal Dimodifikasi:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Pembuat:\ndocument_properties_producer=Pemroduksi PDF:\ndocument_properties_version=Versi PDF:\ndocument_properties_page_count=Jumlah Halaman:\ndocument_properties_close=Tutup\n\nprint_progress_message=Menyiapkan dokumen untuk pencetakan…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Batalkan\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Aktif/Nonaktifkan Bilah Samping\ntoggle_sidebar_notification.title=Aktif/Nonaktifkan Bilah Samping (dokumen berisi kerangka/lampiran)\ntoggle_sidebar_label=Aktif/Nonaktifkan Bilah Samping\ndocument_outline.title=Tampilkan Kerangka Dokumen (klik ganda untuk membentangkan/menciutkan semua item)\ndocument_outline_label=Kerangka Dokumen\nattachments.title=Tampilkan Lampiran\nattachments_label=Lampiran\nthumbs.title=Tampilkan Miniatur\nthumbs_label=Miniatur\nfindbar.title=Temukan di Dokumen\nfindbar_label=Temukan\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Laman {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatur Laman {{page}}\n\n# Find panel button title and messages\nfind_input.title=Temukan\nfind_input.placeholder=Temukan di dokumen…\nfind_previous.title=Temukan kata sebelumnya\nfind_previous_label=Sebelumnya\nfind_next.title=Temukan lebih lanjut\nfind_next_label=Selanjutnya\nfind_highlight=Sorot semuanya\nfind_match_case_label=Cocokkan BESAR/kecil\nfind_reached_top=Sampai di awal dokumen, dilanjutkan dari bawah\nfind_reached_bottom=Sampai di akhir dokumen, dilanjutkan dari atas\nfind_not_found=Frasa tidak ditemukan\n\n# Error panel labels\nerror_more_info=Lebih Banyak Informasi\nerror_less_info=Lebih Sedikit Informasi\nerror_close=Tutup\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Pesan: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Berkas: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Baris: {{line}}\nrendering_error=Galat terjadi saat merender laman.\n\n# Predefined zoom values\npage_scale_width=Lebar Laman\npage_scale_fit=Muat Laman\npage_scale_auto=Perbesaran Otomatis\npage_scale_actual=Ukuran Asli\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Galat\nloading_error=Galat terjadi saat memuat PDF.\ninvalid_file_error=Berkas PDF tidak valid atau rusak.\nmissing_file_error=Berkas PDF tidak ada.\nunexpected_response_error=Balasan server yang tidak diharapkan.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotasi {{type}}]\npassword_label=Masukkan sandi untuk membuka berkas PDF ini.\npassword_invalid=Sandi tidak valid. Silakan coba lagi.\npassword_ok=Oke\npassword_cancel=Batal\n\nprinting_not_supported=Peringatan: Pencetakan tidak didukung secara lengkap pada peramban ini.\nprinting_not_ready=Peringatan: Berkas PDF masih belum dimuat secara lengkap untuk dapat dicetak.\nweb_fonts_disabled=Font web dinonaktifkan: tidak dapat menggunakan font PDF yang tersemat.\ndocument_colors_not_allowed=Dokumen PDF tidak diizinkan untuk menggunakan warnanya sendiri karena setelan 'Izinkan laman memilih warna sendiri' dinonaktifkan pada pengaturan.\n"
  },
  {
    "path": "pages/include/pdf/locale/is/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Fyrri síða\nprevious_label=Fyrri\nnext.title=Næsta síða\nnext_label=Næsti\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Síða\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=af {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} af {{pagesCount}})\n\nzoom_out.title=Minnka\nzoom_out_label=Minnka\nzoom_in.title=Stækka\nzoom_in_label=Stækka\nzoom.title=Aðdráttur\npresentation_mode.title=Skipta yfir á kynningarham\npresentation_mode_label=Kynningarhamur\nopen_file.title=Opna skrá\nopen_file_label=Opna\nprint.title=Prenta\nprint_label=Prenta\ndownload.title=Hala niður\ndownload_label=Hala niður\nbookmark.title=Núverandi sýn (afritaðu eða opnaðu í nýjum glugga)\nbookmark_label=Núverandi sýn\n\n# Secondary toolbar and context menu\ntools.title=Verkfæri\ntools_label=Verkfæri\nfirst_page.title=Fara á fyrstu síðu\nfirst_page.label=Fara á fyrstu síðu\nfirst_page_label=Fara á fyrstu síðu\nlast_page.title=Fara á síðustu síðu\nlast_page.label=Fara á síðustu síðu\nlast_page_label=Fara á síðustu síðu\npage_rotate_cw.title=Snúa réttsælis\npage_rotate_cw.label=Snúa réttsælis\npage_rotate_cw_label=Snúa réttsælis\npage_rotate_ccw.title=Snúa rangsælis\npage_rotate_ccw.label=Snúa rangsælis\npage_rotate_ccw_label=Snúa rangsælis\n\ncursor_text_select_tool.title=Virkja textavalsáhald\ncursor_text_select_tool_label=Textavalsáhald\ncursor_hand_tool.title=Virkja handarverkfæri\ncursor_hand_tool_label=Handarverkfæri\n\n# Document properties dialog box\ndocument_properties.title=Eiginleikar skjals…\ndocument_properties_label=Eiginleikar skjals…\ndocument_properties_file_name=Skráarnafn:\ndocument_properties_file_size=Skrárstærð:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titill:\ndocument_properties_author=Hönnuður:\ndocument_properties_subject=Efni:\ndocument_properties_keywords=Stikkorð:\ndocument_properties_creation_date=Búið til:\ndocument_properties_modification_date=Dags breytingar:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Höfundur:\ndocument_properties_producer=PDF framleiðandi:\ndocument_properties_version=PDF útgáfa:\ndocument_properties_page_count=Blaðsíðufjöldi:\ndocument_properties_close=Loka\n\nprint_progress_message=Undirbý skjal fyrir prentun…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Hætta við\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Víxla hliðslá\ntoggle_sidebar_notification.title=Víxla hliðarslá (skjal inniheldur yfirlit/viðhengi)\ntoggle_sidebar_label=Víxla hliðslá\ndocument_outline.title=Sýna yfirlit skjals (tvísmelltu til að opna/loka öllum hlutum)\ndocument_outline_label=Efnisskipan skjals\nattachments.title=Sýna viðhengi\nattachments_label=Viðhengi\nthumbs.title=Sýna smámyndir\nthumbs_label=Smámyndir\nfindbar.title=Leita í skjali\nfindbar_label=Leita\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Síða {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Smámynd af síðu {{page}}\n\n# Find panel button title and messages\nfind_input.title=Leita\nfind_input.placeholder=Leita í skjali…\nfind_previous.title=Leita að fyrra tilfelli þessara orða\nfind_previous_label=Fyrri\nfind_next.title=Leita að næsta tilfelli þessara orða\nfind_next_label=Næsti\nfind_highlight=Lita allt\nfind_match_case_label=Passa við stafstöðu\nfind_reached_top=Náði efst í skjal, held áfram neðst\nfind_reached_bottom=Náði enda skjals, held áfram efst\nfind_not_found=Fann ekki orðið\n\n# Error panel labels\nerror_more_info=Meiri upplýsingar\nerror_less_info=Minni upplýsingar\nerror_close=Loka\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Skilaboð: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stafli: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Skrá: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Lína: {{line}}\nrendering_error=Upp kom villa við að birta síðuna.\n\n# Predefined zoom values\npage_scale_width=Síðubreidd\npage_scale_fit=Passa á síðu\npage_scale_auto=Sjálfvirkur aðdráttur\npage_scale_actual=Raunstærð\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Villa\nloading_error=Villa kom upp við að hlaða inn PDF.\ninvalid_file_error=Ógild eða skemmd PDF skrá.\nmissing_file_error=Vantar PDF skrá.\nunexpected_response_error=Óvænt svar frá netþjóni.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Skýring]\npassword_label=Sláðu inn lykilorð til að opna þessa PDF skrá.\npassword_invalid=Ógilt lykilorð. Reyndu aftur.\npassword_ok=Í lagi\npassword_cancel=Hætta við\n\nprinting_not_supported=Aðvörun: Prentun er ekki með fyllilegan stuðning á þessum vafra.\nprinting_not_ready=Aðvörun: Ekki er búið að hlaða inn allri PDF skránni fyrir prentun.\nweb_fonts_disabled=Vef leturgerðir eru óvirkar: get ekki notað innbyggðar PDF leturgerðir.\ndocument_colors_not_allowed=PDF skjöl hafa ekki leyfi til að nota sína eigin liti: “Leyfa síðum að velja eigin liti” er óvirkt í vafranum.\n"
  },
  {
    "path": "pages/include/pdf/locale/it/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nprevious.title = Pagina precedente\nprevious_label = Precedente\nnext.title = Pagina successiva\nnext_label = Successiva\npage.title = Pagina\nof_pages = di {{pagesCount}}\npage_of_pages = ({{pageNumber}} di {{pagesCount}})\nzoom_out.title = Riduci zoom\nzoom_out_label = Riduci zoom\nzoom_in.title = Aumenta zoom\nzoom_in_label = Aumenta zoom\nzoom.title = Zoom\npresentation_mode.title = Passa alla modalità presentazione\npresentation_mode_label = Modalità presentazione\nopen_file.title = Apri file\nopen_file_label = Apri\nprint.title = Stampa\nprint_label = Stampa\ndownload.title = Scarica questo documento\ndownload_label = Download\nbookmark.title = Visualizzazione corrente (copia o apri in una nuova finestra)\nbookmark_label = Visualizzazione corrente\ntools.title = Strumenti\ntools_label = Strumenti\nfirst_page.title = Vai alla prima pagina\nfirst_page.label = Vai alla prima pagina\nfirst_page_label = Vai alla prima pagina\nlast_page.title = Vai all’ultima pagina\nlast_page.label = Vai all’ultima pagina\nlast_page_label = Vai all’ultima pagina\npage_rotate_cw.title = Ruota in senso orario\npage_rotate_cw.label = Ruota in senso orario\npage_rotate_cw_label = Ruota in senso orario\npage_rotate_ccw.title = Ruota in senso antiorario\npage_rotate_ccw.label = Ruota in senso antiorario\npage_rotate_ccw_label = Ruota in senso antiorario\ncursor_text_select_tool.title = Attiva strumento di selezione testo\ncursor_text_select_tool_label = Strumento di selezione testo\ncursor_hand_tool.title = Attiva strumento mano\ncursor_hand_tool_label = Strumento mano\ndocument_properties.title = Proprietà del documento…\ndocument_properties_label = Proprietà del documento…\ndocument_properties_file_name = Nome file:\ndocument_properties_file_size = Dimensione file:\ndocument_properties_kb = {{size_kb}} kB ({{size_b}} byte)\ndocument_properties_mb = {{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title = Titolo:\ndocument_properties_author = Autore:\ndocument_properties_subject = Oggetto:\ndocument_properties_keywords = Parole chiave:\ndocument_properties_creation_date = Data creazione:\ndocument_properties_modification_date = Data modifica:\ndocument_properties_date_string = {{date}}, {{time}}\ndocument_properties_creator = Autore originale:\ndocument_properties_producer = Produttore PDF:\ndocument_properties_version = Versione PDF:\ndocument_properties_page_count = Conteggio pagine:\ndocument_properties_close = Chiudi\nprint_progress_message = Preparazione documento per la stampa…\nprint_progress_percent = {{progress}}%\nprint_progress_close = Annulla\ntoggle_sidebar.title = Attiva/disattiva barra laterale\ntoggle_sidebar_notification.title = Attiva/disattiva barra laterale (il documento contiene struttura/allegati)\ntoggle_sidebar_label = Attiva/disattiva barra laterale\ndocument_outline.title = Visualizza la struttura del documento (doppio clic per visualizzare/nascondere tutti gli elementi)\ndocument_outline_label = Struttura documento\nattachments.title = Visualizza allegati\nattachments_label = Allegati\nthumbs.title = Mostra le miniature\nthumbs_label = Miniature\nfindbar.title = Trova nel documento\nfindbar_label = Trova\nthumb_page_title = Pagina {{page}}\nthumb_page_canvas = Miniatura della pagina {{page}}\nfind_input.title = Trova\nfind_input.placeholder = Trova nel documento…\nfind_previous.title = Trova l’occorrenza precedente del testo da cercare\nfind_previous_label = Precedente\nfind_next.title = Trova l’occorrenza successiva del testo da cercare\nfind_next_label = Successivo\nfind_highlight = Evidenzia\nfind_match_case_label = Maiuscole/minuscole\nfind_reached_top = Raggiunto l’inizio della pagina, continua dalla fine\nfind_reached_bottom = Raggiunta la fine della pagina, continua dall’inizio\nfind_not_found = Testo non trovato\nerror_more_info = Ulteriori informazioni\nerror_less_info = Nascondi dettagli\nerror_close = Chiudi\nerror_version_info = PDF.js v{{version}} (build: {{build}})\nerror_message = Messaggio: {{message}}\nerror_stack = Stack: {{stack}}\nerror_file = File: {{file}}\nerror_line = Riga: {{line}}\nrendering_error = Si è verificato un errore durante il rendering della pagina.\npage_scale_width = Larghezza pagina\npage_scale_fit = Adatta a una pagina\npage_scale_auto = Zoom automatico\npage_scale_actual = Dimensioni effettive\npage_scale_percent = {{scale}}%\nloading_error_indicator = Errore\nloading_error = Si è verificato un errore durante il caricamento del PDF.\ninvalid_file_error = File PDF non valido o danneggiato.\nmissing_file_error = File PDF non disponibile.\nunexpected_response_error = Risposta imprevista del server\ntext_annotation_type.alt = [Annotazione: {{type}}]\npassword_label = Inserire la password per aprire questo file PDF.\npassword_invalid = Password non corretta. Riprovare.\npassword_ok = OK\npassword_cancel = Annulla\nprinting_not_supported = Attenzione: la stampa non è completamente supportata da questo browser.\nprinting_not_ready = Attenzione: il PDF non è ancora stato caricato completamente per la stampa.\nweb_fonts_disabled = I web font risultano disattivati: impossibile utilizzare i caratteri inclusi nel PDF.\ndocument_colors_not_allowed = Non è possibile visualizzare i colori originali definiti nel file PDF: l’opzione del browser “Consenti alle pagine di scegliere i propri colori invece di quelli impostati” è disattivata.\n"
  },
  {
    "path": "pages/include/pdf/locale/ja/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=前のページへ戻ります\nprevious_label=前へ\nnext.title=次のページへ進みます\nnext_label=次へ\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=ページ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=表示を縮小します\nzoom_out_label=縮小\nzoom_in.title=表示を拡大します\nzoom_in_label=拡大\nzoom.title=拡大/縮小\npresentation_mode.title=プレゼンテーションモードに切り替えます\npresentation_mode_label=プレゼンテーションモード\nopen_file.title=ファイルを開きます\nopen_file_label=開く\nprint.title=印刷します\nprint_label=印刷\ndownload.title=ダウンロードします\ndownload_label=ダウンロード\nbookmark.title=現在のビューの URL です (コピーまたは新しいウィンドウに開く)\nbookmark_label=現在のビュー\n\n# Secondary toolbar and context menu\ntools.title=ツール\ntools_label=ツール\nfirst_page.title=最初のページへ移動します\nfirst_page.label=最初のページへ移動\nfirst_page_label=最初のページへ移動\nlast_page.title=最後のページへ移動します\nlast_page.label=最後のページへ移動\nlast_page_label=最後のページへ移動\npage_rotate_cw.title=ページを右へ回転します\npage_rotate_cw.label=右回転\npage_rotate_cw_label=右回転\npage_rotate_ccw.title=ページを左へ回転します\npage_rotate_ccw.label=左回転\npage_rotate_ccw_label=左回転\n\ncursor_text_select_tool.title=テキスト選択ツールを有効にする\ncursor_text_select_tool_label=テキスト選択ツール\ncursor_hand_tool.title=手のひらツールを有効にする\ncursor_hand_tool_label=手のひらツール\n\n# Document properties dialog box\ndocument_properties.title=文書のプロパティ...\ndocument_properties_label=文書のプロパティ...\ndocument_properties_file_name=ファイル名:\ndocument_properties_file_size=ファイルサイズ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=タイトル:\ndocument_properties_author=作成者:\ndocument_properties_subject=件名:\ndocument_properties_keywords=キーワード:\ndocument_properties_creation_date=作成日:\ndocument_properties_modification_date=更新日:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=アプリケーション:\ndocument_properties_producer=PDF 作成:\ndocument_properties_version=PDF のバージョン:\ndocument_properties_page_count=ページ数:\ndocument_properties_close=閉じる\n\nprint_progress_message=文書の印刷を準備しています...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=キャンセル\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=サイドバー表示を切り替えます\ntoggle_sidebar_notification.title=サイドバー表示を切り替えます (文書に含まれるアウトライン / 添付)\ntoggle_sidebar_label=サイドバーの切り替え\ndocument_outline.title=文書の目次を表示します (ダブルクリックで項目を開閉します)\ndocument_outline_label=文書の目次\nattachments.title=添付ファイルを表示します\nattachments_label=添付ファイル\nthumbs.title=縮小版を表示します\nthumbs_label=縮小版\nfindbar.title=文書内を検索します\nfindbar_label=検索\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} ページ\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=ページの縮小版 {{page}}\n\n# Find panel button title and messages\nfind_input.title=検索\nfind_input.placeholder=文書内を検索...\nfind_previous.title=現在より前の位置で指定文字列が現れる部分を検索します\nfind_previous_label=前へ\nfind_next.title=現在より後の位置で指定文字列が現れる部分を検索します\nfind_next_label=次へ\nfind_highlight=すべて強調表示\nfind_match_case_label=大文字/小文字を区別\nfind_reached_top=文書先頭に到達したので末尾から続けて検索します\nfind_reached_bottom=文書末尾に到達したので先頭から続けて検索します\nfind_not_found=見つかりませんでした\n\n# Error panel labels\nerror_more_info=詳細情報\nerror_less_info=詳細情報を隠す\nerror_close=閉じる\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (ビルド: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=メッセージ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=スタック: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ファイル: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=行: {{line}}\nrendering_error=ページのレンダリング中にエラーが発生しました。\n\n# Predefined zoom values\npage_scale_width=幅に合わせる\npage_scale_fit=ページのサイズに合わせる\npage_scale_auto=自動ズーム\npage_scale_actual=実際のサイズ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=エラー\nloading_error=PDF の読み込み中にエラーが発生しました。\ninvalid_file_error=無効または破損した PDF ファイル。\nmissing_file_error=PDF ファイルが見つかりません。\nunexpected_response_error=サーバーから予期せぬ応答がありました。\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} 注釈]\npassword_label=この PDF ファイルを開くためのパスワードを入力してください。\npassword_invalid=無効なパスワードです。もう一度やり直してください。\npassword_ok=OK\npassword_cancel=キャンセル\n\nprinting_not_supported=警告: このブラウザーでは印刷が完全にサポートされていません。\nprinting_not_ready=警告: PDF を印刷するための読み込みが終了していません。\nweb_fonts_disabled=ウェブフォントが無効になっています: 埋め込まれた PDF のフォントを使用できません。\ndocument_colors_not_allowed=PDF 文書は、ウェブページが指定した配色を使用することができません: 'ウェブページが指定した配色' はブラウザーで無効になっています。\n"
  },
  {
    "path": "pages/include/pdf/locale/ka/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=წინა გვერდი\nprevious_label=წინა\nnext.title=შემდეგი გვერდი\nnext_label=შემდეგი\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=გვერდი\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}}-დან\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} {{pagesCount}}-დან)\n\nzoom_out.title=დაშორება\nzoom_out_label=დაშორება\nzoom_in.title=მიახლოება\nzoom_in_label=მიახლოება\nzoom.title=ზომის ცვლილება\npresentation_mode.title=პრეზენტაციის რეჟიმზე გადართვა\npresentation_mode_label=პრეზენტაციის რეჟიმი\nopen_file.title=ფაილის გახსნა\nopen_file_label=გახსნა\nprint.title=დაბეჭდვა\nprint_label=დაბეჭდვა\ndownload.title=ჩამოტვირთვა\ndownload_label=ჩამოტვირთვა\nbookmark.title=მიმდინარე ხედი (დაკოპირება ან გახსნა ახალ ფანჯარაში)\nbookmark_label=მიმდინარე ხედი\n\n# Secondary toolbar and context menu\ntools.title=ხელსაწყოები\ntools_label=ხელსაწყოები\nfirst_page.title=პირველ გვერდზე გადასვლა\nfirst_page.label=პირველ გვერდზე გადასვლა\nfirst_page_label=პირველ გვერდზე გადასვლა\nlast_page.title=ბოლო გვერდზე გადასვლა\nlast_page.label=ბოლო გვერდზე გადასვლა\nlast_page_label=ბოლო გვერდზე გადასვლა\npage_rotate_cw.title=ისრის მიმართულებით შებრუნება\npage_rotate_cw.label=ისრის მიმართულებით შებრუნება\npage_rotate_cw_label=ისრის მიმართულებით შებრუნება\npage_rotate_ccw.title=ისრის საპირისპიროდ შებრუნება\npage_rotate_ccw.label=ისრის საპირისპიროდ შებრუნება\npage_rotate_ccw_label=ისრის საპირისპიროდ შებრუნება\n\ncursor_text_select_tool.title=მოსანიშნი კურსორის ჩართვა\ncursor_text_select_tool_label=მოსანიშნი კურსორი\ncursor_hand_tool.title=გადასაადგილებელი კურსორის ჩართვა\ncursor_hand_tool_label=გადასაადგილებელი კურსორი\n\n# Document properties dialog box\ndocument_properties.title=დოკუმენტის თვისებები…\ndocument_properties_label=დოკუმენტის თვისებები…\ndocument_properties_file_name=ფაილის სახელი:\ndocument_properties_file_size=ფაილის ზომა:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} კბ ({{size_b}} ბაიტი)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} მბ ({{size_b}} ბაიტი)\ndocument_properties_title=სათაური:\ndocument_properties_author=ავტორი:\ndocument_properties_subject=თემა:\ndocument_properties_keywords=საკვანძო სიტყვები:\ndocument_properties_creation_date=შექმნის თარიღი:\ndocument_properties_modification_date=სახეცვალების თარიღი:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=შემქმნელი:\ndocument_properties_producer=PDF მწარმოებელი:\ndocument_properties_version=PDF ვერსია:\ndocument_properties_page_count=გვერდების რაოდენობა:\ndocument_properties_close=დახურვა\n\nprint_progress_message=დოკუმენტი მზადდება ამოსაბეჭდად…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=გაუქმება\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=გვერდითა ზოლის გამოჩენა\ntoggle_sidebar_notification.title=გვერდითა ზოლის ჩართვა/გამორთვა (დოკუმენტი შეიცავს მოხაზულობა/დანართს)\ntoggle_sidebar_label=გვერდითა ზოლის გამოჩენა\ndocument_outline.title=დოკუმენტის მოხაზულობის ჩვენება (ორჯერ დაწკაპებით ყველა ელემენტის გაშლა/აკეცვა)\ndocument_outline_label=დოკუმენტის მოხაზულობა\nattachments.title=დანართების ჩვენება\nattachments_label=დანართები\nthumbs.title=ესკიზების ჩვენება\nthumbs_label=ესკიზები\nfindbar.title=ძიება დოკუმენტში\nfindbar_label=ძიება\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=გვერდი {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=გვერდის ესკიზი {{page}}\n\n# Find panel button title and messages\nfind_input.title=ძიება\nfind_input.placeholder=ძიება დოკუმენტში…\nfind_previous.title=ფრაზის წინა კონტექსტის პოვნა\nfind_previous_label=წინა\nfind_next.title=ფრაზის შემდეგი კონტექსტის პოვნა\nfind_next_label=შემდეგი\nfind_highlight=ყველას მონიშვნა\nfind_match_case_label=მთავრულის გათვალისწინება\nfind_reached_top=მიღწეულია დოკუმენტის ზედა წერტილამდე, გრძელდება ქვემოდან\nfind_reached_bottom=მიღწეულია დოკუმენტის ბოლო წერტილამდე, გრძელდება ზემოდან\nfind_not_found=კონტექსტი ვერ მოიძებნა\n\n# Error panel labels\nerror_more_info=დამატებითი ინფორმაცია\nerror_less_info=ნაკლები ინფორმაცია\nerror_close=დახურვა\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=შეტყობინება: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=სტეკი: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ფაილი: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ხაზი: {{line}}\nrendering_error=გვერდის რენდერისას დაფიქსირდა შეცდომა.\n\n# Predefined zoom values\npage_scale_width=გვერდის სიგანე\npage_scale_fit=გვერდის მორგება\npage_scale_auto=ზომის ავტომატური ცვლილება\npage_scale_actual=აქტუალური ზომა\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=შეცდომა\nloading_error=PDF-ის ჩატვირთვისას დაფიქსირდა შეცდომა.\ninvalid_file_error=არამართებული ან დაზიანებული PDF ფაილი.\nmissing_file_error=ნაკლული PDF ფაილი.\nunexpected_response_error=სერვერის მოულოდნელი პასუხი.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} ანოტაცია]\npassword_label=შეიყვანეთ პაროლი, რათა გახსნათ ეს PDF ფაილი.\npassword_invalid=არასწორი პაროლი. გთხოვთ, სცადეთ ხელახლა.\npassword_ok=კარგი\npassword_cancel=გაუქმება\n\nprinting_not_supported=გაფრთხილება: ამ ბრაუზერის მიერ დაბეჭდვა ბოლომდე მხარდაჭერილი არაა.\nprinting_not_ready=გაფრთხილება: PDF ამობეჭდვისთვის ბოლომდე ჩატვირთული არაა.\nweb_fonts_disabled=ვებშრიფტები გამორთულია: ჩაშენებული PDF შრიფტების გამოყენება ვერ ხერხდება.\ndocument_colors_not_allowed=PDF დოკუმენტებს არ აქვთ საკუთარი ფერების გამოყენების უფლება: ბრაუზერში გამორთულია \"გვერდებისთვის საკუთარი ფერების გამოყენების უფლება\".\n"
  },
  {
    "path": "pages/include/pdf/locale/kk/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Алдыңғы парақ\nprevious_label=Алдыңғысы\nnext.title=Келесі парақ\nnext_label=Келесі\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Парақ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} ішінен\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=(парақ {{pageNumber}}, {{pagesCount}} ішінен)\n\nzoom_out.title=Кішірейту\nzoom_out_label=Кішірейту\nzoom_in.title=Үлкейту\nzoom_in_label=Үлкейту\nzoom.title=Масштаб\npresentation_mode.title=Презентация режиміне ауысу\npresentation_mode_label=Презентация режимі\nopen_file.title=Файлды ашу\nopen_file_label=Ашу\nprint.title=Баспаға шығару\nprint_label=Баспаға шығару\ndownload.title=Жүктеп алу\ndownload_label=Жүктеп алу\nbookmark.title=Ағымдағы көрініс (көшіру не жаңа терезеде ашу)\nbookmark_label=Ағымдағы көрініс\n\n# Secondary toolbar and context menu\ntools.title=Саймандар\ntools_label=Саймандар\nfirst_page.title=Алғашқы параққа өту\nfirst_page.label=Алғашқы параққа өту\nfirst_page_label=Алғашқы параққа өту\nlast_page.title=Соңғы параққа өту\nlast_page.label=Соңғы параққа өту\nlast_page_label=Соңғы параққа өту\npage_rotate_cw.title=Сағат тілі бағытымен айналдыру\npage_rotate_cw.label=Сағат тілі бағытымен бұру\npage_rotate_cw_label=Сағат тілі бағытымен бұру\npage_rotate_ccw.title=Сағат тілі бағытына қарсы бұру\npage_rotate_ccw.label=Сағат тілі бағытына қарсы бұру\npage_rotate_ccw_label=Сағат тілі бағытына қарсы бұру\n\ncursor_text_select_tool.title=Мәтінді таңдау сайманын іске қосу\ncursor_text_select_tool_label=Мәтінді таңдау сайманы\ncursor_hand_tool.title=Қол сайманын іске қосу\ncursor_hand_tool_label=Қол сайманы\n\n# Document properties dialog box\ndocument_properties.title=Құжат қасиеттері…\ndocument_properties_label=Құжат қасиеттері…\ndocument_properties_file_name=Файл аты:\ndocument_properties_file_size=Файл өлшемі:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} байт)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} байт)\ndocument_properties_title=Тақырыбы:\ndocument_properties_author=Авторы:\ndocument_properties_subject=Тақырыбы:\ndocument_properties_keywords=Кілт сөздер:\ndocument_properties_creation_date=Жасалған күні:\ndocument_properties_modification_date=Түзету күні:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Жасаған:\ndocument_properties_producer=PDF өндірген:\ndocument_properties_version=PDF нұсқасы:\ndocument_properties_page_count=Беттер саны:\ndocument_properties_close=Жабу\n\nprint_progress_message=Құжатты баспаға шығару үшін дайындау…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Бас тарту\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Бүйір панелін көрсету/жасыру\ntoggle_sidebar_notification.title=Бүйір панелін көрсету/жасыру (құжатта құрылымы/салынымдар бар)\ntoggle_sidebar_label=Бүйір панелін көрсету/жасыру\ndocument_outline.title=Құжат құрылымын көрсету (барлық нәрселерді жазық қылу/жинау үшін қос шерту керек)\ndocument_outline_label=Құжат құрамасы\nattachments.title=Салынымдарды көрсету\nattachments_label=Салынымдар\nthumbs.title=Кіші көріністерді көрсету\nthumbs_label=Кіші көріністер\nfindbar.title=Құжаттан табу\nfindbar_label=Табу\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} парағы\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} парағы үшін кіші көрінісі\n\n# Find panel button title and messages\nfind_input.title=Табу\nfind_input.placeholder=Құжаттан табу…\nfind_previous.title=Осы сөздердің мәтіннен алдыңғы кездесуін табу\nfind_previous_label=Алдыңғысы\nfind_next.title=Осы сөздердің мәтіннен келесі кездесуін табу\nfind_next_label=Келесі\nfind_highlight=Барлығын түспен ерекшелеу\nfind_match_case_label=Регистрді ескеру\nfind_reached_top=Құжаттың басына жеттік, соңынан бастап жалғастырамыз\nfind_reached_bottom=Құжаттың соңына жеттік, басынан бастап жалғастырамыз\nfind_not_found=Сөз(дер) табылмады\n\n# Error panel labels\nerror_more_info=Көбірек ақпарат\nerror_less_info=Азырақ ақпарат\nerror_close=Жабу\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (жинақ: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Хабарлама: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стек: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Жол: {{line}}\nrendering_error=Парақты өңдеу кезінде қате кетті.\n\n# Predefined zoom values\npage_scale_width=Парақ ені\npage_scale_fit=Парақты сыйдыру\npage_scale_auto=Автомасштабтау\npage_scale_actual=Нақты өлшемі\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Қате\nloading_error=PDF жүктеу кезінде қате кетті.\ninvalid_file_error=Зақымдалған немесе қате PDF файл.\nmissing_file_error=PDF файлы жоқ.\nunexpected_response_error=Сервердің күтпеген жауабы.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} аңдатпасы]\npassword_label=Бұл PDF файлын ашу үшін парольді енгізіңіз.\npassword_invalid=Пароль дұрыс емес. Қайталап көріңіз.\npassword_ok=ОК\npassword_cancel=Бас тарту\n\nprinting_not_supported=Ескерту: Баспаға шығаруды бұл браузер толығымен қолдамайды.\nprinting_not_ready=Ескерту: Баспаға шығару үшін, бұл PDF толығымен жүктеліп алынбады.\nweb_fonts_disabled=Веб қаріптері сөндірілген: құрамына енгізілген PDF қаріптерін қолдану мүмкін емес.\ndocument_colors_not_allowed=PDF құжаттарына өздік түстерді қолдану рұқсат етілмеген: бұл браузерде 'Веб-сайттарға өздерінің түстерін қолдануға рұқсат беру' мүмкіндігі сөндірулі тұр.\n"
  },
  {
    "path": "pages/include/pdf/locale/km/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=ទំព័រ​មុន\nprevious_label=មុន\nnext.title=ទំព័រ​បន្ទាប់\nnext_label=បន្ទាប់\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=ទំព័រ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=នៃ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} នៃ {{pagesCount}})\n\nzoom_out.title=​បង្រួម\nzoom_out_label=​បង្រួម\nzoom_in.title=​ពង្រីក\nzoom_in_label=​ពង្រីក\nzoom.title=ពង្រីក\npresentation_mode.title=ប្ដូរ​ទៅ​របៀប​បទ​បង្ហាញ\npresentation_mode_label=របៀប​បទ​បង្ហាញ\nopen_file.title=បើក​ឯកសារ\nopen_file_label=បើក\nprint.title=បោះពុម្ព\nprint_label=បោះពុម្ព\ndownload.title=ទាញ​យក\ndownload_label=ទាញ​យក\nbookmark.title=ទិដ្ឋភាព​បច្ចុប្បន្ន (ចម្លង ឬ​បើក​នៅ​ក្នុង​បង្អួច​ថ្មី)\nbookmark_label=ទិដ្ឋភាព​បច្ចុប្បន្ន\n\n# Secondary toolbar and context menu\ntools.title=ឧបករណ៍\ntools_label=ឧបករណ៍\nfirst_page.title=ទៅកាន់​ទំព័រ​ដំបូង​\nfirst_page.label=ទៅកាន់​ទំព័រ​ដំបូង​\nfirst_page_label=ទៅកាន់​ទំព័រ​ដំបូង​\nlast_page.title=ទៅកាន់​ទំព័រ​ចុងក្រោយ​\nlast_page.label=ទៅកាន់​ទំព័រ​ចុងក្រោយ​\nlast_page_label=ទៅកាន់​ទំព័រ​ចុងក្រោយ\npage_rotate_cw.title=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា\npage_rotate_cw.label=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា\npage_rotate_cw_label=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា\npage_rotate_ccw.title=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​\npage_rotate_ccw.label=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​\npage_rotate_ccw_label=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​\n\ncursor_text_select_tool.title=បើក​ឧបករណ៍​ជ្រើស​អត្ថបទ\ncursor_text_select_tool_label=ឧបករណ៍​ជ្រើស​អត្ថបទ\ncursor_hand_tool.title=បើក​ឧបករណ៍​ដៃ\ncursor_hand_tool_label=ឧបករណ៍​ដៃ\n\n# Document properties dialog box\ndocument_properties.title=លក្ខណ​សម្បត្តិ​ឯកសារ…\ndocument_properties_label=លក្ខណ​សម្បត្តិ​ឯកសារ…\ndocument_properties_file_name=ឈ្មោះ​ឯកសារ៖\ndocument_properties_file_size=ទំហំ​ឯកសារ៖\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} បៃ)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} បៃ)\ndocument_properties_title=ចំណងជើង៖\ndocument_properties_author=អ្នក​និពន្ធ៖\ndocument_properties_subject=ប្រធានបទ៖\ndocument_properties_keywords=ពាក្យ​គន្លឹះ៖\ndocument_properties_creation_date=កាលបរិច្ឆេទ​បង្កើត៖\ndocument_properties_modification_date=កាលបរិច្ឆេទ​កែប្រែ៖\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=អ្នក​បង្កើត៖\ndocument_properties_producer=កម្មវិធី​បង្កើត PDF ៖\ndocument_properties_version=កំណែ PDF ៖\ndocument_properties_page_count=ចំនួន​ទំព័រ៖\ndocument_properties_close=បិទ\n\nprint_progress_message=កំពុង​រៀបចំ​ឯកសារ​សម្រាប់​បោះពុម្ព…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=បោះបង់\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=បិទ/បើក​គ្រាប់​រំកិល\ntoggle_sidebar_notification.title=បិទ/បើក​របារ​ចំហៀង (ឯកសារ​មាន​មាតិកា​នៅ​ក្រៅ/attachments)\ntoggle_sidebar_label=បិទ/បើក​គ្រាប់​រំកិល\ndocument_outline.title=បង្ហាញ​គ្រោង​ឯកសារ (ចុច​ទ្វេ​ដង​ដើម្បី​ពង្រីក/បង្រួម​ធាតុ​ទាំងអស់)\ndocument_outline_label=គ្រោង​ឯកសារ\nattachments.title=បង្ហាញ​ឯកសារ​ភ្ជាប់\nattachments_label=ឯកសារ​ភ្ជាប់\nthumbs.title=បង្ហាញ​រូបភាព​តូចៗ\nthumbs_label=រួបភាព​តូចៗ\nfindbar.title=រក​នៅ​ក្នុង​ឯកសារ\nfindbar_label=រក\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=ទំព័រ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=រូបភាព​តូច​របស់​ទំព័រ {{page}}\n\n# Find panel button title and messages\nfind_input.title=រក\nfind_input.placeholder=រក​នៅ​ក្នុង​ឯកសារ...\nfind_previous.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​មុន\nfind_previous_label=មុន\nfind_next.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​បន្ទាប់\nfind_next_label=បន្ទាប់\nfind_highlight=បន្លិច​ទាំងអស់\nfind_match_case_label=ករណី​ដំណូច\nfind_reached_top=បាន​បន្ត​ពី​ខាង​ក្រោម ទៅ​ដល់​ខាង​​លើ​នៃ​ឯកសារ\nfind_reached_bottom=បាន​បន្ត​ពី​ខាងលើ ទៅដល់​ចុង​​នៃ​ឯកសារ\nfind_not_found=រក​មិន​ឃើញ​ពាក្យ ឬ​ឃ្លា\n\n# Error panel labels\nerror_more_info=ព័ត៌មាន​បន្ថែម\nerror_less_info=ព័ត៌មាន​តិចតួច\nerror_close=បិទ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=សារ ៖ {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ជង់ ៖ {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ឯកសារ ៖ {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ជួរ ៖ {{line}}\nrendering_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​បង្ហាញ​ទំព័រ ។\n\n# Predefined zoom values\npage_scale_width=ទទឹង​ទំព័រ\npage_scale_fit=សម​ទំព័រ\npage_scale_auto=ពង្រីក​ស្វ័យប្រវត្តិ\npage_scale_actual=ទំហំ​ជាក់ស្ដែង\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=កំហុស\nloading_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​កំពុង​ផ្ទុក PDF ។\ninvalid_file_error=ឯកសារ PDF ខូច ឬ​មិន​ត្រឹមត្រូវ ។\nmissing_file_error=បាត់​ឯកសារ PDF\nunexpected_response_error=ការ​ឆ្លើយ​តម​ម៉ាស៊ីន​មេ​ដែល​មិន​បាន​រំពឹង។\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} ចំណារ​ពន្យល់]\npassword_label=បញ្ចូល​ពាក្យសម្ងាត់​ដើម្បី​បើក​ឯកសារ PDF នេះ។\npassword_invalid=ពាក្យសម្ងាត់​មិន​ត្រឹមត្រូវ។ សូម​ព្យាយាម​ម្ដងទៀត។\npassword_ok=យល់​ព្រម\npassword_cancel=បោះបង់\n\nprinting_not_supported=ការ​ព្រមាន ៖ កា​រ​បោះពុម្ព​មិន​ត្រូវ​បាន​គាំទ្រ​ពេញលេញ​ដោយ​កម្មវិធី​រុករក​នេះ​ទេ ។\nprinting_not_ready=ព្រមាន៖ PDF មិន​ត្រូវ​បាន​ផ្ទុក​ទាំងស្រុង​ដើម្បី​បោះពុម្ព​ទេ។\nweb_fonts_disabled=បាន​បិទ​ពុម្ពអក្សរ​បណ្ដាញ ៖ មិន​អាច​ប្រើ​ពុម្ពអក្សរ PDF ដែល​បាន​បង្កប់​បាន​ទេ ។\ndocument_colors_not_allowed=ឯកសារ PDF មិន​ត្រូវ​បាន​អនុញ្ញាត​ឲ្យ​ប្រើ​ពណ៌​ផ្ទាល់​របស់​វា​ទេ៖ 'អនុញ្ញាត​​ឲ្យ​ទំព័រ​ជ្រើស​ពណ៌​ផ្ទាល់​ខ្លួន' ត្រូវ​បាន​ធ្វើ​ឲ្យ​អសកម្ម​ក្នុង​​កម្មវិធី​រុករក។\n"
  },
  {
    "path": "pages/include/pdf/locale/kn/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=ಹಿಂದಿನ ಪುಟ\nprevious_label=ಹಿಂದಿನ\nnext.title=ಮುಂದಿನ ಪುಟ\nnext_label=ಮುಂದಿನ\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} ರಲ್ಲಿ\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=ಕಿರಿದಾಗಿಸು\nzoom_out_label=ಕಿರಿದಾಗಿಸಿ\nzoom_in.title=ಹಿರಿದಾಗಿಸು\nzoom_in_label=ಹಿರಿದಾಗಿಸಿ\nzoom.title=ಗಾತ್ರಬದಲಿಸು\npresentation_mode.title=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮಕ್ಕೆ ಬದಲಾಯಿಸು\npresentation_mode_label=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮ\nopen_file.title=ಕಡತವನ್ನು ತೆರೆ\nopen_file_label=ತೆರೆಯಿರಿ\nprint.title=ಮುದ್ರಿಸು\nprint_label=ಮುದ್ರಿಸಿ\ndownload.title=ಇಳಿಸು\ndownload_label=ಇಳಿಸಿಕೊಳ್ಳಿ\nbookmark.title=ಪ್ರಸಕ್ತ ನೋಟ (ಪ್ರತಿ ಮಾಡು ಅಥವ ಹೊಸ ಕಿಟಕಿಯಲ್ಲಿ ತೆರೆ)\nbookmark_label=ಪ್ರಸಕ್ತ ನೋಟ\n\n# Secondary toolbar and context menu\ntools.title=ಉಪಕರಣಗಳು\ntools_label=ಉಪಕರಣಗಳು\nfirst_page.title=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು\nfirst_page.label=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು\nfirst_page_label=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು\nlast_page.title=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು\nlast_page.label=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು\nlast_page_label=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು\npage_rotate_cw.title=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\npage_rotate_cw.label=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\npage_rotate_cw_label=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\npage_rotate_ccw.title=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\npage_rotate_ccw.label=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\npage_rotate_ccw_label=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು\n\n\n# Document properties dialog box\ndocument_properties.title=ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು...\ndocument_properties_label=ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು...\ndocument_properties_file_name=ಕಡತದ ಹೆಸರು:\ndocument_properties_file_size=ಕಡತದ ಗಾತ್ರ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} ಬೈಟ್‍ಗಳು)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} ಬೈಟ್‍ಗಳು)\ndocument_properties_title=ಶೀರ್ಷಿಕೆ:\ndocument_properties_author=ಕರ್ತೃ:\ndocument_properties_subject=ವಿಷಯ:\ndocument_properties_keywords=ಮುಖ್ಯಪದಗಳು:\ndocument_properties_creation_date=ರಚಿಸಿದ ದಿನಾಂಕ:\ndocument_properties_modification_date=ಮಾರ್ಪಡಿಸಲಾದ ದಿನಾಂಕ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=ರಚಿಸಿದವರು:\ndocument_properties_producer=PDF ಉತ್ಪಾದಕ:\ndocument_properties_version=PDF ಆವೃತ್ತಿ:\ndocument_properties_page_count=ಪುಟದ ಎಣಿಕೆ:\ndocument_properties_close=ಮುಚ್ಚು\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು\ntoggle_sidebar_label=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು\ndocument_outline_label=ದಸ್ತಾವೇಜಿನ ಹೊರರೇಖೆ\nattachments.title=ಲಗತ್ತುಗಳನ್ನು ತೋರಿಸು\nattachments_label=ಲಗತ್ತುಗಳು\nthumbs.title=ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು\nthumbs_label=ಚಿಕ್ಕಚಿತ್ರಗಳು\nfindbar.title=ದಸ್ತಾವೇಜಿನಲ್ಲಿ ಹುಡುಕು\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=ಪುಟ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=ಪುಟವನ್ನು ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು {{page}}\n\n# Find panel button title and messages\nfind_previous.title=ವಾಕ್ಯದ ಹಿಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು\nfind_previous_label=ಹಿಂದಿನ\nfind_next.title=ವಾಕ್ಯದ ಮುಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು\nfind_next_label=ಮುಂದಿನ\nfind_highlight=ಎಲ್ಲವನ್ನು ಹೈಲೈಟ್ ಮಾಡು\nfind_match_case_label=ಕೇಸನ್ನು ಹೊಂದಿಸು\nfind_reached_top=ದಸ್ತಾವೇಜಿನ ಮೇಲ್ಭಾಗವನ್ನು ತಲುಪಿದೆ, ಕೆಳಗಿನಿಂದ ಆರಂಭಿಸು\nfind_reached_bottom=ದಸ್ತಾವೇಜಿನ ಕೊನೆಯನ್ನು ತಲುಪಿದೆ, ಮೇಲಿನಿಂದ ಆರಂಭಿಸು\nfind_not_found=ವಾಕ್ಯವು ಕಂಡು ಬಂದಿಲ್ಲ\n\n# Error panel labels\nerror_more_info=ಹೆಚ್ಚಿನ ಮಾಹಿತಿ\nerror_less_info=ಕಡಿಮೆ ಮಾಹಿತಿ\nerror_close=ಮುಚ್ಚು\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=ಸಂದೇಶ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ರಾಶಿ: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ಕಡತ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ಸಾಲು: {{line}}\nrendering_error=ಪುಟವನ್ನು ನಿರೂಪಿಸುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ.\n\n# Predefined zoom values\npage_scale_width=ಪುಟದ ಅಗಲ\npage_scale_fit=ಪುಟದ ಸರಿಹೊಂದಿಕೆ\npage_scale_auto=ಸ್ವಯಂಚಾಲಿತ ಗಾತ್ರಬದಲಾವಣೆ\npage_scale_actual=ನಿಜವಾದ ಗಾತ್ರ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=ದೋಷ\nloading_error=PDF ಅನ್ನು ಲೋಡ್ ಮಾಡುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ.\ninvalid_file_error=ಅಮಾನ್ಯವಾದ ಅಥವ ಹಾಳಾದ PDF ಕಡತ.\nmissing_file_error=PDF ಕಡತ ಇಲ್ಲ.\nunexpected_response_error=ಅನಿರೀಕ್ಷಿತವಾದ ಪೂರೈಕೆಗಣಕದ ಪ್ರತಿಕ್ರಿಯೆ.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} ಟಿಪ್ಪಣಿ]\npassword_label=PDF ಅನ್ನು ತೆರೆಯಲು ಗುಪ್ತಪದವನ್ನು ನಮೂದಿಸಿ.\npassword_invalid=ಅಮಾನ್ಯವಾದ ಗುಪ್ತಪದ, ದಯವಿಟ್ಟು ಇನ್ನೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.\npassword_ok=OK\n\nprinting_not_supported=ಎಚ್ಚರಿಕೆ: ಈ ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ ಮುದ್ರಣಕ್ಕೆ ಸಂಪೂರ್ಣ ಬೆಂಬಲವಿಲ್ಲ.\nprinting_not_ready=ಎಚ್ಚರಿಕೆ: PDF ಕಡತವು ಮುದ್ರಿಸಲು ಸಂಪೂರ್ಣವಾಗಿ ಲೋಡ್ ಆಗಿಲ್ಲ.\nweb_fonts_disabled=ಜಾಲ ಅಕ್ಷರಶೈಲಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ: ಅಡಕಗೊಳಿಸಿದ PDF ಅಕ್ಷರಶೈಲಿಗಳನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ.\ndocument_colors_not_allowed=PDF ದಸ್ತಾವೇಜುಗಳು ತಮ್ಮದೆ ಆದ ಬಣ್ಣಗಳನ್ನು ಬಳಸಲು ಅನುಮತಿ ಇರುವುದಿಲ್ಲ: 'ಪುಟಗಳು ತಮ್ಮದೆ ಆದ ಬಣ್ಣವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಅನುಮತಿಸು' ಅನ್ನು ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿರುತ್ತದೆ.\n"
  },
  {
    "path": "pages/include/pdf/locale/ko/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=이전 페이지\nprevious_label=이전\nnext.title=다음 페이지\nnext_label=다음\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=페이지\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=전체 {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pagesCount}} 중 {{pageNumber}})\n\nzoom_out.title=축소\nzoom_out_label=축소\nzoom_in.title=확대\nzoom_in_label=확대\nzoom.title=크기\npresentation_mode.title=발표 모드로 전환\npresentation_mode_label=발표 모드\nopen_file.title=파일 열기\nopen_file_label=열기\nprint.title=인쇄\nprint_label=인쇄\ndownload.title=다운로드\ndownload_label=다운로드\nbookmark.title=지금 보이는 그대로 (복사하거나 새 창에 열기)\nbookmark_label=지금 보이는 그대로\n\n# Secondary toolbar and context menu\ntools.title=도구\ntools_label=도구\nfirst_page.title=첫 페이지로 이동\nfirst_page.label=첫 페이지로 이동\nfirst_page_label=첫 페이지로 이동\nlast_page.title=마지막 페이지로 이동\nlast_page.label=마지막 페이지로 이동\nlast_page_label=마지막 페이지로 이동\npage_rotate_cw.title=시계방향으로 회전\npage_rotate_cw.label=시계방향으로 회전\npage_rotate_cw_label=시계방향으로 회전\npage_rotate_ccw.title=시계 반대방향으로 회전\npage_rotate_ccw.label=시계 반대방향으로 회전\npage_rotate_ccw_label=시계 반대방향으로 회전\n\ncursor_text_select_tool.title=텍스트 선택 도구 활성화\ncursor_text_select_tool_label=텍스트 선택 도구\ncursor_hand_tool.title=손 도구 활성화\ncursor_hand_tool_label=손 도구\n\n# Document properties dialog box\ndocument_properties.title=문서 속성…\ndocument_properties_label=문서 속성…\ndocument_properties_file_name=파일 이름:\ndocument_properties_file_size=파일 사이즈:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}}바이트)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}}바이트)\ndocument_properties_title=제목:\ndocument_properties_author=저자:\ndocument_properties_subject=주제:\ndocument_properties_keywords=키워드:\ndocument_properties_creation_date=생성일:\ndocument_properties_modification_date=수정일:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=생성자:\ndocument_properties_producer=PDF 생성기:\ndocument_properties_version=PDF 버전:\ndocument_properties_page_count=총 페이지:\ndocument_properties_close=닫기\n\nprint_progress_message=문서 출력 준비중…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=취소\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=탐색창 열고 닫기\ntoggle_sidebar_notification.title=탐색창 열고 닫기 (문서에 아웃라인이나 첨부파일이 들어있음)\ntoggle_sidebar_label=탐색창 열고 닫기\ndocument_outline.title=문서 아웃라인 보기(더블 클릭해서 모든 항목 열고 닫기)\ndocument_outline_label=문서 아웃라인\nattachments.title=첨부파일 보기\nattachments_label=첨부파일\nthumbs.title=미리보기\nthumbs_label=미리보기\nfindbar.title=검색\nfindbar_label=검색\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}}쪽\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}쪽 미리보기\n\n# Find panel button title and messages\nfind_input.title=찾기\nfind_input.placeholder=문서에서 찾기…\nfind_previous.title=지정 문자열에 일치하는 1개 부분을 검색\nfind_previous_label=이전\nfind_next.title=지정 문자열에 일치하는 다음 부분을 검색\nfind_next_label=다음\nfind_highlight=모두 강조 표시\nfind_match_case_label=대문자/소문자 구별\nfind_reached_top=문서 처음까지 검색하고 끝으로 돌아와 검색했습니다.\nfind_reached_bottom=문서 끝까지 검색하고 앞으로 돌아와 검색했습니다.\nfind_not_found=검색 결과 없음\n\n# Error panel labels\nerror_more_info=정보 더 보기\nerror_less_info=정보 간단히 보기\nerror_close=닫기\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (빌드: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=메시지: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=스택: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=파일: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=줄 번호: {{line}}\nrendering_error=페이지를 렌더링하다 오류가 났습니다.\n\n# Predefined zoom values\npage_scale_width=페이지 너비에 맞춤\npage_scale_fit=페이지에 맞춤\npage_scale_auto=알아서 맞춤\npage_scale_actual=실제 크기에 맞춤\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=오류\nloading_error=PDF를 읽는 중 오류가 생겼습니다.\ninvalid_file_error=유효하지 않거나 파손된 PDF 파일\nmissing_file_error=PDF 파일이 없습니다.\nunexpected_response_error=알 수 없는 서버 응답입니다.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} 주석]\npassword_label=이 PDF 파일을 열 수 있는 암호를 입력하십시오.\npassword_invalid=잘못된 암호입니다. 다시 시도해 주십시오.\npassword_ok=확인\npassword_cancel=취소\n\nprinting_not_supported=경고: 이 브라우저는 인쇄를 완전히 지원하지 않습니다.\nprinting_not_ready=경고: 이 PDF를 인쇄를 할 수 있을 정도로 읽어들이지 못했습니다.\nweb_fonts_disabled=웹 폰트가 꺼져있음: 내장된 PDF 글꼴을 쓸 수 없습니다.\ndocument_colors_not_allowed=PDF 문서의 색상을 쓰지 못하게 되어 있음: '웹 페이지 자체 색상 사용 허용'이 브라우저에서 꺼져 있습니다.\n"
  },
  {
    "path": "pages/include/pdf/locale/ku/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Rûpela berê\nprevious_label=Paşve\nnext.title=Rûpela pêş\nnext_label=Pêş\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Dûr bike\nzoom_out_label=Dûr bike\nzoom_in.title=Nêzîk bike\nzoom_in_label=Nêzîk bike\nzoom.title=Nêzîk Bike\npresentation_mode.title=Derbasî mûda pêşkêşkariyê bibe\npresentation_mode_label=Moda Pêşkêşkariyê\nopen_file.title=Pelî veke\nopen_file_label=Veke\nprint.title=Çap bike\nprint_label=Çap bike\ndownload.title=Jêbar bike\ndownload_label=Jêbar bike\nbookmark.title=Xuyakirina niha (kopî yan jî di pencereyeke nû de veke)\nbookmark_label=Xuyakirina niha\n\n# Secondary toolbar and context menu\ntools.title=Amûr\ntools_label=Amûr\nfirst_page.title=Here rûpela yekemîn\nfirst_page.label=Here rûpela yekemîn\nfirst_page_label=Here rûpela yekemîn\nlast_page.title=Here rûpela dawîn\nlast_page.label=Here rûpela dawîn\nlast_page_label=Here rûpela dawîn\npage_rotate_cw.title=Bi aliyê saetê ve bizivirîne\npage_rotate_cw.label=Bi aliyê saetê ve bizivirîne\npage_rotate_cw_label=Bi aliyê saetê ve bizivirîne\npage_rotate_ccw.title=Berevajî aliyê saetê ve bizivirîne\npage_rotate_ccw.label=Berevajî aliyê saetê ve bizivirîne\npage_rotate_ccw_label=Berevajî aliyê saetê ve bizivirîne\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Sernav:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Darikê kêlekê veke/bigire\ntoggle_sidebar_label=Darikê kêlekê veke/bigire\ndocument_outline_label=Şemaya belgeyê\nthumbs.title=Wênekokan nîşan bide\nthumbs_label=Wênekok\nfindbar.title=Di belgeyê de bibîne\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Rûpel {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Wênekoka rûpelê {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Peyva berê bibîne\nfind_previous_label=Paşve\nfind_next.title=Peyya pêş bibîne\nfind_next_label=Pêşve\nfind_highlight=Tevî beloq bike\nfind_match_case_label=Ji bo tîpên hûrdek-girdek bihîstyar\nfind_reached_top=Gihîşt serê rûpelê, ji dawiya rûpelê bidomîne\nfind_reached_bottom=Gihîşt dawiya rûpelê, ji serê rûpelê bidomîne\nfind_not_found=Peyv nehat dîtin\n\n# Error panel labels\nerror_more_info=Zêdetir agahî\nerror_less_info=Zêdetir agahî\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js versiyon {{version}} (avanî: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Peyam: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Komik: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Pel: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rêzik: {{line}}\nrendering_error=Di vehûrandina rûpelê de çewtî çêbû.\n\n# Predefined zoom values\npage_scale_width=Firehiya rûpelê\npage_scale_fit=Di rûpelê de bicî bike\npage_scale_auto=Xweber nêzîk bike\npage_scale_actual=Mezinahiya rastîn\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Xeletî\nloading_error=Dema ku PDF dihat barkirin çewtiyek çêbû.\ninvalid_file_error=Pelê PDFê nederbasdar yan jî xirabe ye.\nmissing_file_error=Pelê PDFê kêm e.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Nîşaneya {{type}}ê]\npassword_label=Ji bo PDFê vekî şîfreyê binivîse.\npassword_invalid=Şîfre çewt e. Tika ye dîsa biceribîne.\npassword_ok=Temam\n\nprinting_not_supported=Hişyarî: Çapkirin ji hêla vê gerokê ve bi temamî nayê destekirin.\nprinting_not_ready=Hişyarî: PDF bi temamî nehat barkirin û ji bo çapê ne amade ye.\nweb_fonts_disabled=Fontên Webê neçalak in: Fontên PDFê yên veşartî nayên bikaranîn.\ndocument_colors_not_allowed=Destûr tune ye ku belgeyên PDFê rengên xwe bi kar bînin: Di gerokê de 'destûrê bide rûpelan ku rengên xwe bi kar bînin' nehatiye çalakirin.\n"
  },
  {
    "path": "pages/include/pdf/locale/lg/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Omuko  Ogubadewo\nnext.title=Omuko Oguddako\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=ku {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Zimbulukusa\nzoom_out_label=Zimbulukusa\nzoom_in.title=Funza Munda\nzoom_in_label=Funza Munda\nzoom.title=Gezzamu\nopen_file.title=Bikula Fayiro\nopen_file_label=Ggulawo\nprint.title=Fulumya\nprint_label=Fulumya\ndownload.title=Tikula\ndownload_label=Tikula\nbookmark.title=Endabika eriwo (koppa oba gulawo mu diriisa epya)\nbookmark_label=Endabika Eriwo\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ndocument_outline_label=Ensalo ze Ekiwandiko\nthumbs.title=Laga Ekifanyi Mubufunze\nthumbs_label=Ekifanyi Mubufunze\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Omuko {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Ekifananyi kyo Omuko Mubufunze {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Zuula awayise mukweddamu mumiteddera\nfind_next.title=Zuula ekidako mukweddamu mumiteddera\nfind_highlight=Londa byonna\nfind_not_found=Emiteddera tezuuliddwa\n\n# Error panel labels\nerror_more_info=Ebisingawo\nerror_less_info=Mubumpimpi\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Obubaaka: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Ebipangiddwa: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fayiro {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Layini: {{line}}\nrendering_error=Wabadewo ensobi muku tekawo omuko.\n\n# Predefined zoom values\npage_scale_width=Obugazi bwo Omuko\npage_scale_fit=Okutuka kwo Omuko\npage_scale_auto=Okwefunza no Kwegeza\npage_scale_actual=Obunene Obutufu\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Ensobi\nloading_error=Wabadewo ensobi mukutika PDF.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Enyonyola]\npassword_ok=OK\n\nprinting_not_supported=Okulaabula: Okulumya empapula tekuwagirwa enonyeso enno.\n"
  },
  {
    "path": "pages/include/pdf/locale/lij/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pagina primma\nprevious_label=Precedente\nnext.title=Pagina dòppo\nnext_label=Pròscima\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pagina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Diminoisci zoom\nzoom_out_label=Diminoisci zoom\nzoom_in.title=Aomenta zoom\nzoom_in_label=Aomenta zoom\nzoom.title=Zoom\npresentation_mode.title=Vanni into mòddo de prezentaçion\npresentation_mode_label=Mòddo de prezentaçion\nopen_file.title=Arvi file\nopen_file_label=Arvi\nprint.title=Stanpa\nprint_label=Stanpa\ndownload.title=Descaregamento\ndownload_label=Descaregamento\nbookmark.title=Vixon corente (còpia ò arvi inte 'n neuvo barcon)\nbookmark_label=Vixon corente\n\n# Secondary toolbar and context menu\ntools.title=Strumenti\ntools_label=Strumenti\nfirst_page.title=Vanni a-a primma pagina\nfirst_page.label=Vanni a-a primma pagina\nfirst_page_label=Vanni a-a primma pagina\nlast_page.title=Vanni a l'urtima pagina\nlast_page.label=Vanni a l'urtima pagina\nlast_page_label=Vanni a l'urtima pagina\npage_rotate_cw.title=Gia into verso oraio\npage_rotate_cw.label=Gia in senso do releuio\npage_rotate_cw_label=Gia into verso oraio\npage_rotate_ccw.title=Gia into verso antioraio\npage_rotate_ccw.label=Gia in senso do releuio a-a reversa\npage_rotate_ccw_label=Gia into verso antioraio\n\n\n# Document properties dialog box\ndocument_properties.title=Propietæ do documento…\ndocument_properties_label=Propietæ do documento…\ndocument_properties_file_name=Nomme file:\ndocument_properties_file_size=Dimenscion file:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kB ({{size_b}} byte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_kb}} MB ({{size_b}} byte)\ndocument_properties_title=Titolo:\ndocument_properties_author=Aoto:\ndocument_properties_subject=Ogetto:\ndocument_properties_keywords=Paròlle ciave:\ndocument_properties_creation_date=Dæta creaçion:\ndocument_properties_modification_date=Dæta cangiamento:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Aotô originale:\ndocument_properties_producer=Produtô PDF:\ndocument_properties_version=Verscion PDF:\ndocument_properties_page_count=Contezzo pagine:\ndocument_properties_close=Særa\n\nprint_progress_message=Praparo o documento pe-a stanpa…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Anulla\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Ativa/dizativa bara de scianco\ntoggle_sidebar_notification.title=Cangia bara de löo (o documento o contegne di alegæ)\ntoggle_sidebar_label=Ativa/dizativa bara de scianco\ndocument_outline.title=Fanni vedde o contorno do documento (scicca doggio pe espande/ridue tutti i elementi)\ndocument_outline_label=Contorno do documento\nattachments.title=Fanni vedde alegæ\nattachments_label=Alegæ\nthumbs.title=Mostra miniatue\nthumbs_label=Miniatue\nfindbar.title=Treuva into documento\nfindbar_label=Treuva\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatua da pagina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Treuva\nfind_input.placeholder=Treuva into documento…\nfind_previous.title=Treuva a ripetiçion precedente do testo da çercâ\nfind_previous_label=Precedente\nfind_next.title=Treuva a ripetiçion dòppo do testo da çercâ\nfind_next_label=Segoente\nfind_highlight=Evidençia\nfind_match_case_label=Maioscole/minoscole\nfind_reached_top=Razonto a fin da pagina, continoa da l'iniçio\nfind_reached_bottom=Razonto l'iniçio da pagina, continoa da-a fin\nfind_not_found=Testo no trovou\n\n# Error panel labels\nerror_more_info=Ciù informaçioin\nerror_less_info=Meno informaçioin\nerror_close=Særa\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesaggio: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linia: {{line}}\nrendering_error=Gh'é stæto 'n'erô itno rendering da pagina.\n\n# Predefined zoom values\npage_scale_width=Larghessa pagina\npage_scale_fit=Adatta a una pagina\npage_scale_auto=Zoom aotomatico\npage_scale_actual=Dimenscioin efetive\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Erô\nloading_error=S'é verificou 'n'erô itno caregamento do PDF.\ninvalid_file_error=O file PDF o l'é no valido ò aroinou.\nmissing_file_error=O file PDF o no gh'é.\nunexpected_response_error=Risposta inprevista do-u server\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotaçion: {{type}}]\npassword_label=Dimme a paròlla segreta pe arvî sto file PDF.\npassword_invalid=Paròlla segreta sbalia. Preuva torna.\npassword_ok=Va ben\npassword_cancel=Anulla\n\nprinting_not_supported=Atençion: a stanpa a no l'é conpletamente soportâ da sto navegatô.\nprinting_not_ready=Atençion: o PDF o no l'é ancon caregou conpletamente pe-a stanpa.\nweb_fonts_disabled=I font do web en dizativæ: inposcibile adeuviâ i carateri do PDF.\ndocument_colors_not_allowed=No l'é poscibile adeuviâ i pròpi coî pe-i documenti PDF: l'opçion do navegatô  “Permetti a-e pagine de çerne i pròpi coî in cangio de quelli inpostæ” a l'é dizativâ.\n"
  },
  {
    "path": "pages/include/pdf/locale/locale.properties",
    "content": "[ach]\n@import url(ach/viewer.properties)\n\n[af]\n@import url(af/viewer.properties)\n\n[ak]\n@import url(ak/viewer.properties)\n\n[an]\n@import url(an/viewer.properties)\n\n[ar]\n@import url(ar/viewer.properties)\n\n[as]\n@import url(as/viewer.properties)\n\n[ast]\n@import url(ast/viewer.properties)\n\n[az]\n@import url(az/viewer.properties)\n\n[be]\n@import url(be/viewer.properties)\n\n[bg]\n@import url(bg/viewer.properties)\n\n[bn-BD]\n@import url(bn-BD/viewer.properties)\n\n[bn-IN]\n@import url(bn-IN/viewer.properties)\n\n[br]\n@import url(br/viewer.properties)\n\n[bs]\n@import url(bs/viewer.properties)\n\n[ca]\n@import url(ca/viewer.properties)\n\n[cs]\n@import url(cs/viewer.properties)\n\n[csb]\n@import url(csb/viewer.properties)\n\n[cy]\n@import url(cy/viewer.properties)\n\n[da]\n@import url(da/viewer.properties)\n\n[de]\n@import url(de/viewer.properties)\n\n[el]\n@import url(el/viewer.properties)\n\n[en-GB]\n@import url(en-GB/viewer.properties)\n\n[en-US]\n@import url(en-US/viewer.properties)\n\n[en-ZA]\n@import url(en-ZA/viewer.properties)\n\n[eo]\n@import url(eo/viewer.properties)\n\n[es-AR]\n@import url(es-AR/viewer.properties)\n\n[es-CL]\n@import url(es-CL/viewer.properties)\n\n[es-ES]\n@import url(es-ES/viewer.properties)\n\n[es-MX]\n@import url(es-MX/viewer.properties)\n\n[et]\n@import url(et/viewer.properties)\n\n[eu]\n@import url(eu/viewer.properties)\n\n[fa]\n@import url(fa/viewer.properties)\n\n[ff]\n@import url(ff/viewer.properties)\n\n[fi]\n@import url(fi/viewer.properties)\n\n[fr]\n@import url(fr/viewer.properties)\n\n[fy-NL]\n@import url(fy-NL/viewer.properties)\n\n[ga-IE]\n@import url(ga-IE/viewer.properties)\n\n[gd]\n@import url(gd/viewer.properties)\n\n[gl]\n@import url(gl/viewer.properties)\n\n[gu-IN]\n@import url(gu-IN/viewer.properties)\n\n[he]\n@import url(he/viewer.properties)\n\n[hi-IN]\n@import url(hi-IN/viewer.properties)\n\n[hr]\n@import url(hr/viewer.properties)\n\n[hu]\n@import url(hu/viewer.properties)\n\n[hy-AM]\n@import url(hy-AM/viewer.properties)\n\n[id]\n@import url(id/viewer.properties)\n\n[is]\n@import url(is/viewer.properties)\n\n[it]\n@import url(it/viewer.properties)\n\n[ja]\n@import url(ja/viewer.properties)\n\n[ka]\n@import url(ka/viewer.properties)\n\n[kk]\n@import url(kk/viewer.properties)\n\n[km]\n@import url(km/viewer.properties)\n\n[kn]\n@import url(kn/viewer.properties)\n\n[ko]\n@import url(ko/viewer.properties)\n\n[ku]\n@import url(ku/viewer.properties)\n\n[lg]\n@import url(lg/viewer.properties)\n\n[lij]\n@import url(lij/viewer.properties)\n\n[lt]\n@import url(lt/viewer.properties)\n\n[lv]\n@import url(lv/viewer.properties)\n\n[mai]\n@import url(mai/viewer.properties)\n\n[mk]\n@import url(mk/viewer.properties)\n\n[ml]\n@import url(ml/viewer.properties)\n\n[mn]\n@import url(mn/viewer.properties)\n\n[mr]\n@import url(mr/viewer.properties)\n\n[ms]\n@import url(ms/viewer.properties)\n\n[my]\n@import url(my/viewer.properties)\n\n[nb-NO]\n@import url(nb-NO/viewer.properties)\n\n[nl]\n@import url(nl/viewer.properties)\n\n[nn-NO]\n@import url(nn-NO/viewer.properties)\n\n[nso]\n@import url(nso/viewer.properties)\n\n[oc]\n@import url(oc/viewer.properties)\n\n[or]\n@import url(or/viewer.properties)\n\n[pa-IN]\n@import url(pa-IN/viewer.properties)\n\n[pl]\n@import url(pl/viewer.properties)\n\n[pt-BR]\n@import url(pt-BR/viewer.properties)\n\n[pt-PT]\n@import url(pt-PT/viewer.properties)\n\n[rm]\n@import url(rm/viewer.properties)\n\n[ro]\n@import url(ro/viewer.properties)\n\n[ru]\n@import url(ru/viewer.properties)\n\n[rw]\n@import url(rw/viewer.properties)\n\n[sah]\n@import url(sah/viewer.properties)\n\n[si]\n@import url(si/viewer.properties)\n\n[sk]\n@import url(sk/viewer.properties)\n\n[sl]\n@import url(sl/viewer.properties)\n\n[son]\n@import url(son/viewer.properties)\n\n[sq]\n@import url(sq/viewer.properties)\n\n[sr]\n@import url(sr/viewer.properties)\n\n[sv-SE]\n@import url(sv-SE/viewer.properties)\n\n[sw]\n@import url(sw/viewer.properties)\n\n[ta]\n@import url(ta/viewer.properties)\n\n[ta-LK]\n@import url(ta-LK/viewer.properties)\n\n[te]\n@import url(te/viewer.properties)\n\n[th]\n@import url(th/viewer.properties)\n\n[tl]\n@import url(tl/viewer.properties)\n\n[tn]\n@import url(tn/viewer.properties)\n\n[tr]\n@import url(tr/viewer.properties)\n\n[uk]\n@import url(uk/viewer.properties)\n\n[ur]\n@import url(ur/viewer.properties)\n\n[vi]\n@import url(vi/viewer.properties)\n\n[wo]\n@import url(wo/viewer.properties)\n\n[xh]\n@import url(xh/viewer.properties)\n\n[zh-CN]\n@import url(zh-CN/viewer.properties)\n\n[zh-TW]\n@import url(zh-TW/viewer.properties)\n\n[zu]\n@import url(zu/viewer.properties)\n\n"
  },
  {
    "path": "pages/include/pdf/locale/lt/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Ankstesnis puslapis\nprevious_label=Ankstesnis\nnext.title=Kitas puslapis\nnext_label=Kitas\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Puslapis\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=iš {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} iš {{pagesCount}})\n\nzoom_out.title=Sumažinti\nzoom_out_label=Sumažinti\nzoom_in.title=Padidinti\nzoom_in_label=Padidinti\nzoom.title=Mastelis\npresentation_mode.title=Pereiti į pateikties veikseną\npresentation_mode_label=Pateikties veiksena\nopen_file.title=Atverti failą\nopen_file_label=Atverti\nprint.title=Spausdinti\nprint_label=Spausdinti\ndownload.title=Parsiųsti\ndownload_label=Parsiųsti\nbookmark.title=Esamojo rodinio saitas (kopijavimui ar atvėrimui kitame lange)\nbookmark_label=Esamasis rodinys\n\n# Secondary toolbar and context menu\ntools.title=Priemonės\ntools_label=Priemonės\nfirst_page.title=Eiti į pirmą puslapį\nfirst_page.label=Eiti į pirmą puslapį\nfirst_page_label=Eiti į pirmą puslapį\nlast_page.title=Eiti į paskutinį puslapį\nlast_page.label=Eiti į paskutinį puslapį\nlast_page_label=Eiti į paskutinį puslapį\npage_rotate_cw.title=Pasukti pagal laikrodžio rodyklę\npage_rotate_cw.label=Pasukti pagal laikrodžio rodyklę\npage_rotate_cw_label=Pasukti pagal laikrodžio rodyklę\npage_rotate_ccw.title=Pasukti prieš laikrodžio rodyklę\npage_rotate_ccw.label=Pasukti prieš laikrodžio rodyklę\npage_rotate_ccw_label=Pasukti prieš laikrodžio rodyklę\n\ncursor_text_select_tool.title=Įjungti teksto žymėjimo įrankį\ncursor_text_select_tool_label=Teksto žymėjimo įrankis\ncursor_hand_tool.title=Įjungti vilkimo įrankį\ncursor_hand_tool_label=Vilkimo įrankis\n\n# Document properties dialog box\ndocument_properties.title=Dokumento savybės…\ndocument_properties_label=Dokumento savybės…\ndocument_properties_file_name=Failo vardas:\ndocument_properties_file_size=Failo dydis:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} B)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} B)\ndocument_properties_title=Antraštė:\ndocument_properties_author=Autorius:\ndocument_properties_subject=Tema:\ndocument_properties_keywords=Reikšminiai žodžiai:\ndocument_properties_creation_date=Sukūrimo data:\ndocument_properties_modification_date=Modifikavimo data:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Kūrėjas:\ndocument_properties_producer=PDF generatorius:\ndocument_properties_version=PDF versija:\ndocument_properties_page_count=Puslapių skaičius:\ndocument_properties_close=Užverti\n\nprint_progress_message=Dokumentas ruošiamas spausdinimui…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Atsisakyti\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Rodyti / slėpti šoninį polangį\ntoggle_sidebar_notification.title=Parankinė (dokumentas turi struktūrą / priedų)\ntoggle_sidebar_label=Šoninis polangis\ndocument_outline.title=Rodyti dokumento struktūrą (spustelėkite dukart norėdami išplėsti/suskleisti visus elementus)\ndocument_outline_label=Dokumento struktūra\nattachments.title=Rodyti priedus\nattachments_label=Priedai\nthumbs.title=Rodyti puslapių miniatiūras\nthumbs_label=Miniatiūros\nfindbar.title=Ieškoti dokumente\nfindbar_label=Rasti\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} puslapis\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} puslapio miniatiūra\n\n# Find panel button title and messages\nfind_input.title=Rasti\nfind_input.placeholder=Rasti dokumente…\nfind_previous.title=Ieškoti ankstesnio frazės egzemplioriaus\nfind_previous_label=Ankstesnis\nfind_next.title=Ieškoti tolesnio frazės egzemplioriaus\nfind_next_label=Tolesnis\nfind_highlight=Viską paryškinti\nfind_match_case_label=Skirti didžiąsias ir mažąsias raides\nfind_reached_top=Pasiekus dokumento pradžią, paieška pratęsta nuo pabaigos\nfind_reached_bottom=Pasiekus dokumento pabaigą, paieška pratęsta nuo pradžios\nfind_not_found=Ieškoma frazė nerasta\n\n# Error panel labels\nerror_more_info=Išsamiau\nerror_less_info=Glausčiau\nerror_close=Užverti\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v. {{version}} (darinys: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Pranešimas: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Dėklas: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Failas: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Eilutė: {{line}}\nrendering_error=Atvaizduojant puslapį įvyko klaida.\n\n# Predefined zoom values\npage_scale_width=Priderinti prie lapo pločio\npage_scale_fit=Pritaikyti prie lapo dydžio\npage_scale_auto=Automatinis mastelis\npage_scale_actual=Tikras dydis\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Klaida\nloading_error=Įkeliant PDF failą įvyko klaida.\ninvalid_file_error=Tai nėra PDF failas arba jis yra sugadintas.\nmissing_file_error=PDF failas nerastas.\nunexpected_response_error=Netikėtas serverio atsakas.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[„{{type}}“ tipo anotacija]\npassword_label=Įveskite slaptažodį šiam PDF failui atverti.\npassword_invalid=Slaptažodis neteisingas. Bandykite dar kartą.\npassword_ok=Gerai\npassword_cancel=Atsisakyti\n\nprinting_not_supported=Dėmesio! Spausdinimas šioje naršyklėje nėra pilnai realizuotas.\nprinting_not_ready=Dėmesio! PDF failas dar nėra pilnai įkeltas spausdinimui.\nweb_fonts_disabled=Saityno šriftai išjungti – PDF faile esančių šriftų naudoti negalima.\ndocument_colors_not_allowed=PDF dokumentams neleidžiama nurodyti savo spalvų, nes išjungta naršyklės nuostata „Leisti tinklalapiams nurodyti spalvas“.\n"
  },
  {
    "path": "pages/include/pdf/locale/lv/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Iepriekšējā lapa\nprevious_label=Iepriekšējā\nnext.title=Nākamā lapa\nnext_label=Nākamā\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Lapa\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=no {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} no {{pagesCount}})\n\nzoom_out.title=Attālināt\\u0020\nzoom_out_label=Attālināt\nzoom_in.title=Pietuvināt\nzoom_in_label=Pietuvināt\nzoom.title=Palielinājums\npresentation_mode.title=Pārslēgties uz Prezentācijas režīmu\npresentation_mode_label=Prezentācijas režīms\nopen_file.title=Atvērt failu\nopen_file_label=Atvērt\nprint.title=Drukāšana\nprint_label=Drukāt\ndownload.title=Lejupielāde\ndownload_label=Lejupielādēt\nbookmark.title=Pašreizējais skats (kopēt vai atvērt jaunā logā)\nbookmark_label=Pašreizējais skats\n\n# Secondary toolbar and context menu\ntools.title=Rīki\ntools_label=Rīki\nfirst_page.title=Iet uz pirmo lapu\nfirst_page.label=Iet uz pirmo lapu\nfirst_page_label=Iet uz pirmo lapu\nlast_page.title=Iet uz pēdējo lapu\nlast_page.label=Iet uz pēdējo lapu\nlast_page_label=Iet uz pēdējo lapu\npage_rotate_cw.title=Pagriezt pa pulksteni\npage_rotate_cw.label=Pagriezt pa pulksteni\npage_rotate_cw_label=Pagriezt pa pulksteni\npage_rotate_ccw.title=Pagriezt pret pulksteni\npage_rotate_ccw.label=Pagriezt pret pulksteni\npage_rotate_ccw_label=Pagriezt pret pulksteni\n\n\n# Document properties dialog box\ndocument_properties.title=Dokumenta iestatījumi…\ndocument_properties_label=Dokumenta iestatījumi…\ndocument_properties_file_name=Faila nosaukums:\ndocument_properties_file_size=Faila izmērs:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} biti)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} biti)\ndocument_properties_title=Nosaukums:\ndocument_properties_author=Autors:\ndocument_properties_subject=Tēma:\ndocument_properties_keywords=Atslēgas vārdi:\ndocument_properties_creation_date=Izveides datums:\ndocument_properties_modification_date=LAbošanas datums:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Radītājs:\ndocument_properties_producer=PDF producents:\ndocument_properties_version=PDF versija:\ndocument_properties_page_count=Lapu skaits:\ndocument_properties_close=Aizvērt\n\nprint_progress_message=Gatavo dokumentu drukāšanai...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Atcelt\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Pārslēgt sānu joslu\ntoggle_sidebar_notification.title=Pārslēgt sānu joslu (dokumenta saturu un pielikumus)\ntoggle_sidebar_label=Pārslēgt sānu joslu\ndocument_outline.title=Rādīt dokumenta struktūru (veiciet dubultklikšķi lai izvērstu/sakļautu visus vienumus)\ndocument_outline_label=Dokumenta saturs\nattachments.title=Rādīt pielikumus\nattachments_label=Pielikumi\nthumbs.title=Parādīt sīktēlus\nthumbs_label=Sīktēli\nfindbar.title=Meklēt dokumentā\nfindbar_label=Meklēt\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Lapa {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Lapas {{page}} sīktēls\n\n# Find panel button title and messages\nfind_input.title=Meklēt\nfind_input.placeholder=Meklēt dokumentā…\nfind_previous.title=Atrast iepriekšējo\nfind_previous_label=Iepriekšējā\nfind_next.title=Atrast nākamo\nfind_next_label=Nākamā\nfind_highlight=Iekrāsot visas\nfind_match_case_label=Lielo, mazo burtu jutīgs\nfind_reached_top=Sasniegts dokumenta sākums, turpinām no beigām\nfind_reached_bottom=Sasniegtas dokumenta beigas, turpinām no sākuma\nfind_not_found=Frāze nav atrasta\n\n# Error panel labels\nerror_more_info=Vairāk informācijas\nerror_less_info=MAzāk informācijas\nerror_close=Close\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Ziņojums: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Steks: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=File: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rindiņa: {{line}}\nrendering_error=Attēlojot lapu radās kļūda\n\n# Predefined zoom values\npage_scale_width=Lapas platumā\npage_scale_fit=Ietilpinot lapu\npage_scale_auto=Automātiskais izmērs\npage_scale_actual=Patiesais izmērs\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Kļūda\nloading_error=Ielādējot PDF notika kļūda.\ninvalid_file_error=Nederīgs vai bojāts PDF fails.\nmissing_file_error=PDF fails nav atrasts.\nunexpected_response_error=Negaidīa servera atbilde.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} anotācija]\npassword_label=Ievadiet paroli, lai atvērtu PDF failu.\npassword_invalid=Nepareiza parole, mēģiniet vēlreiz.\npassword_ok=Labi\npassword_cancel=Atcelt\n\nprinting_not_supported=Uzmanību: Drukāšana no šī pārlūka darbojas tikai daļēji.\nprinting_not_ready=Uzmanību: PDF nav pilnībā ielādēts drukāšanai.\nweb_fonts_disabled=Tīmekļa fonti nav aktivizēti: Nevar iegult PDF fontus.\ndocument_colors_not_allowed=PDF dokumentiem nav atļauts izmantot pašiem savas krāsas: „Atļaut lapām izvēlēties pašām savas krāsas“ ir deaktivēts pārlūkā.\n"
  },
  {
    "path": "pages/include/pdf/locale/mai/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=पछिला पृष्ठ\nprevious_label=पछिला\nnext.title=अगिला पृष्ठ\nnext_label=आगाँ\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=छोट करू\nzoom_out_label=छोट करू\nzoom_in.title=पैघ करू\nzoom_in_label=जूम इन\nzoom.title=छोट-पैघ करू\\u0020\npresentation_mode.title=प्रस्तुति अवस्थामे जाउ\npresentation_mode_label=प्रस्तुति अवस्था\nopen_file.title=फाइल खोलू\nopen_file_label=खोलू\nprint.title=छापू\nprint_label=छापू\ndownload.title=डाउनलोड\ndownload_label=डाउनलोड\nbookmark.title=मोजुदा दृश्य (नव विंडोमे नकल लिअ अथवा खोलू)\nbookmark_label=वर्तमान दृश्य\n\n# Secondary toolbar and context menu\ntools.title=अओजार\ntools_label=अओजार\nfirst_page.title=प्रथम पृष्ठ पर जाउ\nfirst_page.label=प्रथम पृष्ठ पर जाउ\nfirst_page_label=प्रथम पृष्ठ पर जाउ\nlast_page.title=अंतिम पृष्ठ पर जाउ\nlast_page.label=अंतिम पृष्ठ पर जाउ\nlast_page_label=अंतिम पृष्ठ पर जाउ\npage_rotate_cw.title=घड़ीक दिशा मे घुमाउ\npage_rotate_cw.label=घड़ीक दिशा मे घुमाउ\npage_rotate_cw_label=घड़ीक दिशा मे घुमाउ\npage_rotate_ccw.title=घड़ीक दिशा सँ उनटा घुमाउ\npage_rotate_ccw.label=घड़ीक दिशा सँ उनटा घुमाउ\npage_rotate_ccw_label=घड़ीक दिशा सँ उनटा घुमाउ\n\n\n# Document properties dialog box\ndocument_properties.title=दस्तावेज़ विशेषता...\ndocument_properties_label=दस्तावेज़ विशेषता...\ndocument_properties_file_name=फाइल नाम:\ndocument_properties_file_size=फ़ाइल आकार:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} बाइट)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} बाइट)\ndocument_properties_title=शीर्षक:\ndocument_properties_author=लेखकः\ndocument_properties_subject=विषय\ndocument_properties_keywords=बीजशब्द\ndocument_properties_creation_date=निर्माण तिथि:\ndocument_properties_modification_date=संशोधन दिनांक:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=सृजक:\ndocument_properties_producer=PDF उत्पादक:\ndocument_properties_version=PDF संस्करण:\ndocument_properties_page_count=पृष्ठ गिनती:\ndocument_properties_close=बन्न करू\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=स्लाइडर टागल\ntoggle_sidebar_label=स्लाइडर टागल\ndocument_outline_label=दस्तावेज खाका\nattachments.title=संलग्नक देखाबू\nattachments_label=संलग्नक\nthumbs.title=लघु-छवि देखाउ\nthumbs_label=लघु छवि\nfindbar.title=दस्तावेजमे ढूँढू\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=पृष्ठ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=पृष्ठ {{page}} का लघु-चित्र\n\n# Find panel button title and messages\nfind_previous.title=खोजक पछिला उपस्थिति ताकू\nfind_previous_label=पछिला\nfind_next.title=खोजक अगिला उपस्थिति ताकू\nfind_next_label=आगाँ\nfind_highlight=सभटा आलोकित करू\nfind_match_case_label=मिलान स्थिति\nfind_reached_top=पृष्ठक शीर्ष जाए पहुँचल, तल सँ जारी\nfind_reached_bottom=पृष्ठक तल मे जाए पहुँचल, शीर्ष सँ जारी\nfind_not_found=वाकींश नहि भेटल\n\n# Error panel labels\nerror_more_info=बेसी  सूचना\nerror_less_info=कम सूचना\nerror_close=बन्न करू\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=संदेश: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=स्टैक: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=फ़ाइल: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=पंक्ति: {{line}}\nrendering_error=पृष्ठ रेंडरिंगक समय त्रुटि आएल.\n\n# Predefined zoom values\npage_scale_width=पृष्ठ चओड़ाइ\npage_scale_fit=पृष्ठ फिट\npage_scale_auto=स्वचालित जूम\npage_scale_actual=सही आकार\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=त्रुटि\nloading_error=पीडीएफ लोड करैत समय एकटा त्रुटि भेल.\ninvalid_file_error=अमान्य अथवा भ्रष्ट PDF फाइल.\nmissing_file_error=अनुपस्थित PDF फाइल.\nunexpected_response_error=सर्वर सँ अप्रत्याशित प्रतिक्रिया.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=एहि पीडीएफ फ़ाइल केँ खोलबाक लेल कृपया कूटशब्द भरू.\npassword_invalid=अवैध कूटशब्द, कृपया फिनु कोशिश करू.\npassword_ok=बेस\n\nprinting_not_supported=चेतावनी: ई ब्राउजर पर छपाइ पूर्ण तरह सँ समर्थित नहि अछि.\nprinting_not_ready=चेतावनी: पीडीएफ छपाइक लेल पूर्ण तरह सँ लोड नहि अछि.\nweb_fonts_disabled=वेब फॉन्ट्स निष्क्रिय अछि: अंतःस्थापित PDF फान्टसक उपयोगमे असमर्थ.\ndocument_colors_not_allowed=PDF दस्तावेज़ हुकर अपन रंग केँ उपयोग करबाक लेल अनुमति प्राप्त नहि अछि: 'पृष्ठ केँ हुकर अपन रंग केँ चुनबाक लेल स्वीकृति दिअ जे ओ ओहि ब्राउज़र मे निष्क्रिय अछि.\n"
  },
  {
    "path": "pages/include/pdf/locale/mk/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Претходна страница\nprevious_label=Претходна\nnext.title=Следна страница\nnext_label=Следна\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Намалување\nzoom_out_label=Намали\nzoom_in.title=Зголемување\nzoom_in_label=Зголеми\nzoom.title=Променување на големина\npresentation_mode.title=Премини во презентациски режим\npresentation_mode_label=Презентациски режим\nopen_file.title=Отворање датотека\nopen_file_label=Отвори\nprint.title=Печатење\nprint_label=Печати\ndownload.title=Преземање\ndownload_label=Преземи\nbookmark.title=Овој преглед (копирај или отвори во нов прозорец)\nbookmark_label=Овој преглед\n\n# Secondary toolbar and context menu\ntools.title=Алатки\nfirst_page.label=Оди до првата страница\nlast_page.label=Оди до последната страница\npage_rotate_cw.label=Ротирај по стрелките на часовникот\npage_rotate_ccw.label=Ротирај спротивно од стрелките на часовникот\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Вклучи странична лента\ntoggle_sidebar_label=Вклучи странична лента\nthumbs.title=Прикажување на икони\nthumbs_label=Икони\nfindbar.title=Најди во документот\nfindbar_label=Најди\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Страница {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Икона од страница {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Најди ја предходната појава на фразата\nfind_previous_label=Претходно\nfind_next.title=Најди ја следната појава на фразата\nfind_next_label=Следно\nfind_highlight=Означи сѐ\nfind_match_case_label=Токму така\nfind_reached_top=Барањето стигна до почетокот на документот и почнува од крајот\nfind_reached_bottom=Барањето стигна до крајот на документот и почнува од почеток\nfind_not_found=Фразата не е пронајдена\n\n# Error panel labels\nerror_more_info=Повеќе информации\nerror_less_info=Помалку информации\nerror_close=Затвори\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Порака: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Датотека: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Линија: {{line}}\nrendering_error=Настана грешка при прикажувањето на страницата.\n\n# Predefined zoom values\npage_scale_width=Ширина на страница\npage_scale_fit=Цела страница\npage_scale_auto=Автоматска големина\npage_scale_actual=Вистинска големина\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Грешка\nloading_error=Настана грешка при вчитувањето на PDF-от.\ninvalid_file_error=Невалидна или корумпирана PDF датотека.\nmissing_file_error=Недостасува PDF документ.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\n\nprinting_not_supported=Предупредување: Печатењето не е целосно поддржано во овој прелистувач.\nprinting_not_ready=Предупредување: PDF документот не е целосно вчитан за печатење.\nweb_fonts_disabled=Интернет фонтовите се оневозможени: не може да се користат вградените PDF фонтови.\ndocument_colors_not_allowed=PDF-документите немаат дозвола да користат сопствени бои: Поставката „Дозволи страниците сами да ги избираат своите бои“ е деактивирана од прелистувачот.\n"
  },
  {
    "path": "pages/include/pdf/locale/ml/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=മുമ്പുള്ള താള്‍\nprevious_label=മുമ്പു്\nnext.title=അടുത്ത താള്‍\nnext_label=അടുത്തതു്\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=ചെറുതാക്കുക\nzoom_out_label=ചെറുതാക്കുക\nzoom_in.title=വലുതാക്കുക\nzoom_in_label=വലുതാക്കുക\nzoom.title=വ്യാപ്തി മാറ്റുക\npresentation_mode.title=പ്രസന്റേഷന്‍ രീതിയിലേക്കു് മാറ്റുക\npresentation_mode_label=പ്രസന്റേഷന്‍ രീതി\nopen_file.title=ഫയല്‍ തുറക്കുക\nopen_file_label=തുറക്കുക\nprint.title=പ്രിന്റ് ചെയ്യുക\nprint_label=പ്രിന്റ് ചെയ്യുക\ndownload.title=ഡൌണ്‍ലോഡ് ചെയ്യുക\ndownload_label=ഡൌണ്‍ലോഡ് ചെയ്യുക\nbookmark.title=നിലവിലുള്ള കാഴ്ച (പുതിയ ജാലകത്തില്‍ പകര്‍ത്തുക അല്ലെങ്കില്‍ തുറക്കുക)\nbookmark_label=നിലവിലുള്ള കാഴ്ച\n\n# Secondary toolbar and context menu\ntools.title=ഉപകരണങ്ങള്‍\ntools_label=ഉപകരണങ്ങള്‍\nfirst_page.title=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക\nfirst_page.label=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക\nfirst_page_label=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക\nlast_page.title=അവസാന താളിലേയ്ക്കു് പോകുക\nlast_page.label=അവസാന താളിലേയ്ക്കു് പോകുക\nlast_page_label=അവസാന താളിലേയ്ക്കു് പോകുക\npage_rotate_cw.title=ഘടികാരദിശയില്‍ കറക്കുക\npage_rotate_cw.label=ഘടികാരദിശയില്‍ കറക്കുക\npage_rotate_cw_label=ഘടികാരദിശയില്‍ കറക്കുക\npage_rotate_ccw.title=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക\npage_rotate_ccw.label=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക\npage_rotate_ccw_label=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക\n\n\n# Document properties dialog box\ndocument_properties.title=രേഖയുടെ വിശേഷതകള്‍...\ndocument_properties_label=രേഖയുടെ വിശേഷതകള്‍...\ndocument_properties_file_name=ഫയലിന്റെ പേര്‌:\ndocument_properties_file_size=ഫയലിന്റെ വലിപ്പം:‌‌\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} കെബി ({{size_b}} ബൈറ്റുകള്‍)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} എംബി ({{size_b}} ബൈറ്റുകള്‍)\ndocument_properties_title=തലക്കെട്ട്‌\\u0020\ndocument_properties_author=രചയിതാവ്:\ndocument_properties_subject=വിഷയം:\ndocument_properties_keywords=കീവേര്‍ഡുകള്‍:\ndocument_properties_creation_date=പൂര്‍ത്തിയാകുന്ന തീയതി:\ndocument_properties_modification_date=മാറ്റം വരുത്തിയ തീയതി:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=സൃഷ്ടികര്‍ത്താവ്:\ndocument_properties_producer=പിഡിഎഫ് പ്രൊഡ്യൂസര്‍:\ndocument_properties_version=പിഡിഎഫ് പതിപ്പ്:\ndocument_properties_page_count=താളിന്റെ എണ്ണം:\ndocument_properties_close=അടയ്ക്കുക\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=സൈഡ് ബാറിലേക്കു് മാറ്റുക\ntoggle_sidebar_label=സൈഡ് ബാറിലേക്കു് മാറ്റുക\ndocument_outline_label=രേഖയുടെ ഔട്ട്ലൈന്‍\nattachments.title=അറ്റാച്മെന്റുകള്‍ കാണിയ്ക്കുക\nattachments_label=അറ്റാച്മെന്റുകള്‍\nthumbs.title=തംബ്നെയിലുകള്‍ കാണിയ്ക്കുക\nthumbs_label=തംബ്നെയിലുകള്‍\nfindbar.title=രേഖയില്‍ കണ്ടുപിടിയ്ക്കുക\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=താള്‍ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} താളിനുള്ള തംബ്നെയില്‍\n\n# Find panel button title and messages\nfind_previous.title=വാചകം ഇതിനു മുന്‍പ്‌ ആവര്‍ത്തിച്ചത്‌ കണ്ടെത്തുക\\u0020\nfind_previous_label=മുമ്പു്\nfind_next.title=വാചകം വീണ്ടും ആവര്‍ത്തിക്കുന്നത്‌ കണ്ടെത്തുക\\u0020\nfind_next_label=അടുത്തതു്\nfind_highlight=എല്ലാം എടുത്തുകാണിയ്ക്കുക\nfind_match_case_label=അക്ഷരങ്ങള്‍ ഒത്തുനോക്കുക\nfind_reached_top=രേഖയുടെ മുകളില്‍ എത്തിയിരിക്കുന്നു, താഴെ നിന്നും തുടരുന്നു\nfind_reached_bottom=രേഖയുടെ അവസാനം വരെ എത്തിയിരിക്കുന്നു, മുകളില്‍ നിന്നും തുടരുന്നു\\u0020\nfind_not_found=വാചകം കണ്ടെത്താനായില്ല\\u0020\n\n# Error panel labels\nerror_more_info=കൂടുതല്‍ വിവരം\nerror_less_info=കുറച്ച് വിവരം\nerror_close=അടയ്ക്കുക\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=സന്ദേശം: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=സ്റ്റാക്ക്: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ഫയല്‍: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=വരി: {{line}}\nrendering_error=താള്‍ റെണ്ടര്‍ ചെയ്യുമ്പോള്‍‌ പിശകുണ്ടായിരിയ്ക്കുന്നു.\n\n# Predefined zoom values\npage_scale_width=താളിന്റെ വീതി\npage_scale_fit=താള്‍ പാകത്തിനാക്കുക\npage_scale_auto=സ്വയമായി വലുതാക്കുക\npage_scale_actual=യഥാര്‍ത്ഥ വ്യാപ്തി\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=പിശക്\nloading_error=പിഡിഎഫ് ലഭ്യമാക്കുമ്പോള്‍ പിശക് ഉണ്ടായിരിയ്ക്കുന്നു.\ninvalid_file_error=തെറ്റായ അല്ലെങ്കില്‍ തകരാറുള്ള പിഡിഎഫ് ഫയല്‍.\nmissing_file_error=പിഡിഎഫ് ഫയല്‍ ലഭ്യമല്ല.\nunexpected_response_error=പ്രതീക്ഷിക്കാത്ത സെര്‍വര്‍ മറുപടി.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=ഈ പിഡിഎഫ് ഫയല്‍ തുറക്കുന്നതിനു് രഹസ്യവാക്ക് നല്‍കുക.\npassword_invalid=തെറ്റായ രഹസ്യവാക്ക്, ദയവായി വീണ്ടും ശ്രമിയ്ക്കുക.\npassword_ok=ശരി\n\nprinting_not_supported=മുന്നറിയിപ്പു്: ഈ ബ്രൌസര്‍ പൂര്‍ണ്ണമായി പ്രിന്റിങ് പിന്തുണയ്ക്കുന്നില്ല.\nprinting_not_ready=മുന്നറിയിപ്പു്: പ്രിന്റ് ചെയ്യുന്നതിനു് പിഡിഎഫ് പൂര്‍ണ്ണമായി ലഭ്യമല്ല.\nweb_fonts_disabled=വെബിനുള്ള അക്ഷരസഞ്ചയങ്ങള്‍ പ്രവര്‍ത്തന രഹിതം: എംബഡ്ഡ് ചെയ്ത പിഡിഎഫ് അക്ഷരസഞ്ചയങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ സാധ്യമല്ല.\ndocument_colors_not_allowed=സ്വന്തം നിറങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ പിഡിഎഫ് രേഖകള്‍ക്കു് അനുവാദമില്ല:  'സ്വന്തം നിറങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ താളുകളെ അനുവദിയ്ക്കുക' എന്നതു് ബ്രൌസറില്‍ നിര്‍ജീവമാണു്.\n"
  },
  {
    "path": "pages/include/pdf/locale/mn/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom.title=Тэлэлт\nopen_file.title=Файл нээ\nopen_file_label=Нээ\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\ndocument_properties_file_name=Файлын нэр:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Гарчиг:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\n\n# Find panel button title and messages\nfind_previous.title=Хайлтын өмнөх олдцыг харуулна\nfind_next.title=Хайлтын дараагийн олдцыг харуулна\nfind_not_found=Олдсонгүй\n\n# Error panel labels\nerror_more_info=Нэмэлт мэдээлэл\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\n\n# Predefined zoom values\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Алдаа\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_ok=OK\n\n"
  },
  {
    "path": "pages/include/pdf/locale/mr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=मागील पृष्ठ\nprevious_label=मागील\nnext.title=पुढील पृष्ठ\nnext_label=पुढील\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=पृष्ठ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pageCount}}पैकी\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pagesCount}} पैकी {{pageNumber}})\n\nzoom_out.title=छोटे करा\nzoom_out_label=छोटे करा\nzoom_in.title=मोठे करा\nzoom_in_label=मोठे करा\nzoom.title=लहान किंवा मोठे करा\npresentation_mode.title=प्रस्तुतिकरण मोडचा वापर करा\npresentation_mode_label=प्रस्तुतिकरण मोड\nopen_file.title=फाइल उघडा\nopen_file_label=उघडा\nprint.title=छपाई करा\nprint_label=छपाई करा\ndownload.title=डाउनलोड करा\ndownload_label=डाउनलोड करा\nbookmark.title=सध्याचे अवलोकन (नवीन पटलात प्रत बनवा किंवा उघडा)\nbookmark_label=सध्याचे अवलोकन\n\n# Secondary toolbar and context menu\ntools.title=साधने\ntools_label=साधने\nfirst_page.title=पहिल्या पृष्ठावर जा\nfirst_page.label=पहिल्या पृष्ठावर जा\nfirst_page_label=पहिल्या पृष्ठावर जा\nlast_page.title=शेवटच्या पृष्ठावर जा\nlast_page.label=शेवटच्या पृष्ठावर जा\nlast_page_label=शेवटच्या पृष्ठावर जा\npage_rotate_cw.title=घड्याळाच्या काट्याच्या दिशेने फिरवा\npage_rotate_cw.label=घड्याळाच्या काट्याच्या दिशेने फिरवा\npage_rotate_cw_label=घड्याळाच्या काट्याच्या दिशेने फिरवा\npage_rotate_ccw.title=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा\npage_rotate_ccw.label=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा\npage_rotate_ccw_label=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा\n\ncursor_text_select_tool.title=मजकूर निवड साधन कार्यान्वयीत करा\ncursor_text_select_tool_label=मजकूर निवड साधन\ncursor_hand_tool.title=हात साधन कार्यान्वित करा\ncursor_hand_tool_label=हस्त साधन\n\n# Document properties dialog box\ndocument_properties.title=दस्तऐवज गुणधर्म…\ndocument_properties_label=दस्तऐवज गुणधर्म…\ndocument_properties_file_name=फाइलचे नाव:\ndocument_properties_file_size=फाइल आकार:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} बाइट्स)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} बाइट्स)\ndocument_properties_title=शिर्षक:\ndocument_properties_author=लेखक:\ndocument_properties_subject=विषय:\ndocument_properties_keywords=मुख्यशब्द:\ndocument_properties_creation_date=निर्माण दिनांक:\ndocument_properties_modification_date=दुरूस्ती दिनांक:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=निर्माता:\ndocument_properties_producer=PDF निर्माता:\ndocument_properties_version=PDF आवृत्ती:\ndocument_properties_page_count=पृष्ठ संख्या:\ndocument_properties_close=बंद करा\n\nprint_progress_message=छपाई करीता पृष्ठ तयार करीत आहे…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=रद्द करा\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=बाजूचीपट्टी टॉगल करा\ntoggle_sidebar_notification.title=बाजूची पट्टी टॉगल करा (दस्तऐवजामध्ये रुपरेषा/जोडण्या आहेत)\ntoggle_sidebar_label=बाजूचीपट्टी टॉगल करा\ndocument_outline.title=दस्तऐवज बाह्यरेखा दर्शवा (विस्तृत करण्यासाठी दोनवेळा क्लिक करा /सर्व घटक दाखवा)\ndocument_outline_label=दस्तऐवज रूपरेषा\nattachments.title=जोडपत्र दाखवा\nattachments_label=जोडपत्र\nthumbs.title=थंबनेल्स् दाखवा\nthumbs_label=थंबनेल्स्\nfindbar.title=दस्तऐवजात शोधा\nfindbar_label=शोधा\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=पृष्ठ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=पृष्ठाचे थंबनेल {{page}}\n\n# Find panel button title and messages\nfind_input.title=शोधा\nfind_input.placeholder=दस्तऐवजात शोधा…\nfind_previous.title=वाकप्रयोगची मागील घटना शोधा\nfind_previous_label=मागील\nfind_next.title=वाकप्रयोगची पुढील घटना शोधा\nfind_next_label=पुढील\nfind_highlight=सर्व ठळक करा\nfind_match_case_label=आकार जुळवा\nfind_reached_top=दस्तऐवजाच्या शीर्षकास पोहचले, तळपासून पुढे\nfind_reached_bottom=दस्तऐवजाच्या तळाला पोहचले, शीर्षकापासून पुढे\nfind_not_found=वाकप्रयोग आढळले नाही\n\n# Error panel labels\nerror_more_info=आणखी माहिती\nerror_less_info=कमी माहिती\nerror_close=बंद करा\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=संदेश: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=स्टॅक: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=फाइल: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=रेष: {{line}}\nrendering_error=पृष्ठ दाखवतेवेळी त्रुटी आढळली.\n\n# Predefined zoom values\npage_scale_width=पृष्ठाची रूंदी\npage_scale_fit=पृष्ठ बसवा\npage_scale_auto=स्वयं लाहन किंवा मोठे करणे\npage_scale_actual=प्रत्यक्ष आकार\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=त्रुटी\nloading_error=PDF लोड करतेवेळी त्रुटी आढळली.\ninvalid_file_error=अवैध किंवा दोषीत PDF फाइल.\nmissing_file_error=न आढळणारी PDF फाइल.\nunexpected_response_error=अनपेक्षित सर्व्हर प्रतिसाद.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} टिपण्णी]\npassword_label=ही PDF फाइल उघडण्याकरिता पासवर्ड द्या.\npassword_invalid=अवैध पासवर्ड. कृपया पुन्हा प्रयत्न करा.\npassword_ok=ठीक आहे\npassword_cancel=रद्द करा\n\nprinting_not_supported=सावधानता: या ब्राउझरतर्फे छपाइ पूर्णपणे समर्थीत नाही.\nprinting_not_ready=सावधानता: छपाईकरिता PDF पूर्णतया लोड झाले नाही.\nweb_fonts_disabled=वेब टंक असमर्थीत आहेत: एम्बेडेड PDF टंक वापर अशक्य.\ndocument_colors_not_allowed=PDF दस्तऐवजांना त्यांचे रंग वापरण्यास अनुमती नाही: ब्राउझरमध्ये ' पृष्ठांना त्यांचे रंग निवडण्यास अनुमती द्या' बंद केले आहे.\n"
  },
  {
    "path": "pages/include/pdf/locale/ms/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Halaman Sebelum\nprevious_label=Terdahulu\nnext.title=Halaman Seterusnya\nnext_label=Berikut\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Halaman\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=daripada {{pageCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} daripada {{pagesCount}})\n\nzoom_out.title=Zum Keluar\nzoom_out_label=Zum Keluar\nzoom_in.title=Zum Masuk\nzoom_in_label=Zum Masuk\nzoom.title=Zum\npresentation_mode.title=Tukar ke Mod Persembahan\npresentation_mode_label=Mod Persembahan\nopen_file.title=Buka Fail\nopen_file_label=Buka\nprint.title=Cetak\nprint_label=Cetak\ndownload.title=Muat turun\ndownload_label=Muat turun\nbookmark.title=Paparan semasa (salin atau buka dalam tetingkap baru)\nbookmark_label=Paparan Semasa\n\n# Secondary toolbar and context menu\ntools.title=Alatan\ntools_label=Alatan\nfirst_page.title=Pergi ke Halaman Pertama\nfirst_page.label=Pergi ke Halaman Pertama\nfirst_page_label=Pergi ke Halaman Pertama\nlast_page.title=Pergi ke Halaman Terakhir\nlast_page.label=Pergi ke Halaman Terakhir\nlast_page_label=Pergi ke Halaman Terakhir\npage_rotate_cw.title=Berputar ikut arah Jam\npage_rotate_cw.label=Berputar ikut arah Jam\npage_rotate_cw_label=Berputar ikut arah Jam\npage_rotate_ccw.title=Pusing berlawan arah jam\npage_rotate_ccw.label=Pusing berlawan arah jam\npage_rotate_ccw_label=Pusing berlawan arah jam\n\ncursor_text_select_tool.title=Dayakan Alatan Pilihan Teks\ncursor_text_select_tool_label=Alatan Pilihan Teks\ncursor_hand_tool.title=Dayakan Alatan Tangan\ncursor_hand_tool_label=Alatan Tangan\n\n# Document properties dialog box\ndocument_properties.title=Sifat Dokumen…\ndocument_properties_label=Sifat Dokumen…\ndocument_properties_file_name=Nama fail:\ndocument_properties_file_size=Saiz fail:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bait)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bait)\ndocument_properties_title=Tajuk:\ndocument_properties_author=Pengarang:\ndocument_properties_subject=Subjek:\ndocument_properties_keywords=Kata kunci:\ndocument_properties_creation_date=Masa Dicipta:\ndocument_properties_modification_date=Tarikh Ubahsuai:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Pencipta:\ndocument_properties_producer=Pengeluar PDF:\ndocument_properties_version=Versi PDF:\ndocument_properties_page_count=Kiraan Laman:\ndocument_properties_close=Tutup\n\nprint_progress_message=Menyediakan dokumen untuk dicetak…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Batal\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Togol Bar Sisi\ntoggle_sidebar_notification.title=Togol Sidebar (dokumen mengandungi rangka/attachments)\ntoggle_sidebar_label=Togol Bar Sisi\ndocument_outline.title=Papar Rangka Dokumen (klik-dua-kali untuk kembangkan/kolaps semua item)\ndocument_outline_label=Rangka Dokumen\nattachments.title=Papar Lampiran\nattachments_label=Lampiran\nthumbs.title=Papar Thumbnails\nthumbs_label=Imej kecil\nfindbar.title=Cari didalam Dokumen\nfindbar_label=Cari\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Halaman {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Halaman Imej kecil {{page}}\n\n# Find panel button title and messages\nfind_input.title=Cari\nfind_input.placeholder=Cari dalam dokumen…\nfind_previous.title=Cari teks frasa berkenaan yang terdahulu\nfind_previous_label=Sebelumnya\nfind_next.title=Cari teks frasa berkenaan yang berikut\nfind_next_label=Berikut\nfind_highlight=Serlahkan semua\nfind_match_case_label=Kes Sepadan\nfind_reached_top=Mencapai teratas daripada dokumen, sambungan daripada bawah\nfind_reached_bottom=Mencapai terakhir daripada dokumen, sambungan daripada atas\nfind_not_found=Frasa tidak ditemui\n\n# Error panel labels\nerror_more_info=Maklumat lanjut\nerror_less_info=Kurang Informasi\nerror_close=Tutup\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesej: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Timbun: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fail: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Garis: {{line}}\nrendering_error=Ralat berlaku ketika memberikan halaman.\n\n# Predefined zoom values\npage_scale_width=Lebar Halaman\npage_scale_fit=Muat Halaman\npage_scale_auto=Zoom Automatik\npage_scale_actual=Saiz Sebenar\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Ralat\nloading_error=Masalah berlaku semasa menuatkan sebuah PDF.\ninvalid_file_error=Tidak sah atau fail PDF rosak.\nmissing_file_error=Fail PDF Hilang.\nunexpected_response_error=Respon pelayan yang tidak dijangka.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Anotasi]\npassword_label=Masukan kata kunci untuk membuka fail PDF ini.\npassword_invalid=Kata laluan salah. Cuba lagi.\npassword_ok=OK\npassword_cancel=Batal\n\nprinting_not_supported=Amaran: Cetakan ini tidak sepenuhnya disokong oleh pelayar ini.\nprinting_not_ready=Amaran: PDF tidak sepenuhnya dimuatkan untuk dicetak.\nweb_fonts_disabled=Fon web dinyahdayakan: tidak dapat menggunakan fon terbenam PDF.\ndocument_colors_not_allowed=Dokumen PDF tidak dibenarkan untuk menggunakan warna sendiri: “Izinkan halaman untuk memilih warna sendiri” telah dinyahaktifkan dalam pelayar.\n"
  },
  {
    "path": "pages/include/pdf/locale/my/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=အရင် စာမျက်နှာ\nprevious_label=အရင်နေရာ\nnext.title=ရှေ့ စာမျက်နှာ\nnext_label=နောက်တခု\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=စာမျက်နှာ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} ၏\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pagesCount}} ၏ {{pageNumber}})\n\nzoom_out.title=ချုံ့ပါ\nzoom_out_label=ချုံ့ပါ\nzoom_in.title=ချဲ့ပါ\nzoom_in_label=ချဲ့ပါ\nzoom.title=ချုံ့/ချဲ့ပါ\npresentation_mode.title=ဆွေးနွေးတင်ပြစနစ်သို့ ကူးပြောင်းပါ\npresentation_mode_label=ဆွေးနွေးတင်ပြစနစ်\nopen_file.title=ဖိုင်အားဖွင့်ပါ။\nopen_file_label=ဖွင့်ပါ\nprint.title=ပုံနှိုပ်ပါ\nprint_label=ပုံနှိုပ်ပါ\ndownload.title=ကူးဆွဲ\ndownload_label=ကူးဆွဲ\nbookmark.title=လက်ရှိ မြင်ကွင်း (ဝင်းဒိုးအသစ်မှာ ကူးပါ သို့မဟုတ် ဖွင့်ပါ)\nbookmark_label=လက်ရှိ မြင်ကွင်း\n\n# Secondary toolbar and context menu\ntools.title=ကိရိယာများ\ntools_label=ကိရိယာများ\nfirst_page.title=ပထမ စာမျက်နှာသို့\nfirst_page.label=ပထမ စာမျက်နှာသို့\nfirst_page_label=ပထမ စာမျက်နှာသို့\nlast_page.title=နောက်ဆုံး စာမျက်နှာသို့\nlast_page.label=နောက်ဆုံး စာမျက်နှာသို့\nlast_page_label=နောက်ဆုံး စာမျက်နှာသို့\npage_rotate_cw.title=နာရီလက်တံ အတိုင်း\npage_rotate_cw.label=နာရီလက်တံ အတိုင်း\npage_rotate_cw_label=နာရီလက်တံ အတိုင်း\npage_rotate_ccw.title=နာရီလက်တံ ပြောင်းပြန်\npage_rotate_ccw.label=နာရီလက်တံ ပြောင်းပြန်\npage_rotate_ccw_label=နာရီလက်တံ ပြောင်းပြန်\n\n\n# Document properties dialog box\ndocument_properties.title=မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ\ndocument_properties_label=မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ\ndocument_properties_file_name=ဖိုင် :\ndocument_properties_file_size=ဖိုင်ဆိုဒ် :\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} ကီလိုဘိုတ် ({size_kb}}ဘိုတ်)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=ခေါင်းစဉ်‌ -\ndocument_properties_author=ရေးသားသူ:\ndocument_properties_subject=အကြောင်းအရာ:\\u0020\ndocument_properties_keywords=သော့ချက် စာလုံး:\ndocument_properties_creation_date=ထုတ်လုပ်ရက်စွဲ:\ndocument_properties_modification_date=ပြင်ဆင်ရက်စွဲ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=ဖန်တီးသူ:\ndocument_properties_producer=PDF ထုတ်လုပ်သူ:\ndocument_properties_version=PDF ဗားရှင်း:\ndocument_properties_page_count=စာမျက်နှာအရေအတွက်:\ndocument_properties_close=ပိတ်\n\nprint_progress_message=Preparing document for printing…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=ပယ်​ဖျက်ပါ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ဘေးတန်းဖွင့်ပိတ်\ntoggle_sidebar_notification.title=ဘေးဘားတန်းကို အဖွင့်/အပိတ် လုပ်ရန် (စာတမ်းတွင် outline/attachments ပါဝင်နိုင်သည်)\ntoggle_sidebar_label=ဖွင့်ပိတ် ဆလိုက်ဒါ\ndocument_outline.title=စာတမ်းအကျဉ်းချုပ်ကို ပြပါ (စာရင်းအားလုံးကို ချုံ့/ချဲ့ရန် ကလစ်နှစ်ချက်နှိပ်ပါ)\ndocument_outline_label=စာတမ်းအကျဉ်းချုပ်\nattachments.title=တွဲချက်များ ပြပါ\nattachments_label=တွဲထားချက်များ\nthumbs.title=ပုံရိပ်ငယ်များကို ပြပါ\nthumbs_label=ပုံရိပ်ငယ်များ\nfindbar.title=Find in Document\nfindbar_label=ရှာဖွေပါ\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=စာမျက်နှာ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=စာမျက်နှာရဲ့ ပုံရိပ်ငယ် {{page}}\n\n# Find panel button title and messages\nfind_input.title=ရှာဖွေပါ\nfind_input.placeholder=စာတမ်းထဲတွင် ရှာဖွေရန်…\nfind_previous.title=စကားစုရဲ့ အရင် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ\nfind_previous_label=နောက်သို့\nfind_next.title=စကားစုရဲ့ နောက်ထပ် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ\nfind_next_label=ရှေ့သို့\nfind_highlight=အားလုံးကို မျဉ်းသားပါ\nfind_match_case_label=စာလုံး တိုက်ဆိုင်ပါ\nfind_reached_top=စာမျက်နှာထိပ် ရောက်နေပြီ၊ အဆုံးကနေ ပြန်စပါ\nfind_reached_bottom=စာမျက်နှာအဆုံး ရောက်နေပြီ၊ ထိပ်ကနေ ပြန်စပါ\nfind_not_found=စကားစု မတွေ့ရဘူး\n\n# Error panel labels\nerror_more_info=နောက်ထပ်အချက်အလက်များ\nerror_less_info=အနည်းငယ်မျှသော သတင်းအချက်အလက်\nerror_close=ပိတ်\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=မက်ဆေ့ - {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=အထပ် - {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ဖိုင် {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=လိုင်း - {{line}}\nrendering_error=စာမျက်နှာကို ပုံဖော်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။\n\n# Predefined zoom values\npage_scale_width=စာမျက်နှာ အကျယ်\npage_scale_fit=စာမျက်နှာ ကွက်တိ\npage_scale_auto=အလိုအလျောက် ချုံ့ချဲ့\npage_scale_actual=အမှန်တကယ်ရှိတဲ့ အရွယ်\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=အမှား\nloading_error=PDF ဖိုင် ကိုဆွဲတင်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။\ninvalid_file_error=မရသော သို့ ပျက်နေသော PDF ဖိုင်\nmissing_file_error=PDF ပျောက်ဆုံး\nunexpected_response_error=မမျှော်လင့်ထားသော ဆာဗာမှ ပြန်ကြားချက်\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} အဓိပ္ပာယ်ဖွင့်ဆိုချက်]\npassword_label=PDF အားဖွင့်ရန် ပတ်စ်ဝတ်အားထည့်ပါ\npassword_invalid=စာဝှက် မှားသည်။ ထပ်ကြိုးစားကြည့်ပါ။\npassword_ok=OK\npassword_cancel=ပယ်​ဖျက်ပါ\n\nprinting_not_supported=သတိပေးချက်၊ပရင့်ထုတ်ခြင်းကိုဤဘယောက်ဆာသည် ပြည့်ဝစွာထောက်ပံ့မထားပါ ။\nprinting_not_ready=သတိပေးချက်: ယခု PDF ဖိုင်သည် ပုံနှိပ်ရန် မပြည့်စုံပါ\nweb_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.\ndocument_colors_not_allowed=PDF ဖိုင်အား ၎င်းဤ ကိုယ်ပိုင်အရောင်များကို အသုံးပြုခွင့်မပေးထားပါ ။ 'စာမျက်နှာအားလုံးအားအရောင်ရွေးချယ်ခွင့်' အား ယခု ဘယောက်ဆာတွင် ပိတ်ထားခြင်းကြောင့်ဖြစ် သှ်\n"
  },
  {
    "path": "pages/include/pdf/locale/nb-NO/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Forrige side\nprevious_label=Forrige\nnext.title=Neste side\nnext_label=Neste\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Side\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=av {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} av {{pagesCount}})\n\nzoom_out.title=Zoom ut\nzoom_out_label=Zoom ut\nzoom_in.title=Zoom inn\nzoom_in_label=Zoom inn\nzoom.title=Zoom\npresentation_mode.title=Bytt til presentasjonsmodus\npresentation_mode_label=Presentasjonsmodus\nopen_file.title=Åpne fil\nopen_file_label=Åpne\nprint.title=Skriv ut\nprint_label=Skriv ut\ndownload.title=Last ned\ndownload_label=Last ned\nbookmark.title=Nåværende visning (kopier eller åpne i et nytt vindu)\nbookmark_label=Nåværende visning\n\n# Secondary toolbar and context menu\ntools.title=Verktøy\ntools_label=Verktøy\nfirst_page.title=Gå til første side\nfirst_page.label=Gå til første side\nfirst_page_label=Gå til første side\nlast_page.title=Gå til siste side\nlast_page.label=Gå til siste side\nlast_page_label=Gå til siste side\npage_rotate_cw.title=Roter med klokken\npage_rotate_cw.label=Roter med klokken\npage_rotate_cw_label=Roter med klokken\npage_rotate_ccw.title=Roter mot klokken\npage_rotate_ccw.label=Roter mot klokken\npage_rotate_ccw_label=Roter mot klokken\n\ncursor_text_select_tool.title=Aktiver tekstmarkeringsverktøy\ncursor_text_select_tool_label=Tekstmarkeringsverktøy\ncursor_hand_tool.title=Aktiver handverktøy\ncursor_hand_tool_label=Handverktøy\n\n# Document properties dialog box\ndocument_properties.title=Dokumentegenskaper …\ndocument_properties_label=Dokumentegenskaper …\ndocument_properties_file_name=Filnavn:\ndocument_properties_file_size=Filstørrelse:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Dokumentegenskaper …\ndocument_properties_author=Forfatter:\ndocument_properties_subject=Emne:\ndocument_properties_keywords=Nøkkelord:\ndocument_properties_creation_date=Opprettet dato:\ndocument_properties_modification_date=Endret dato:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Opprettet av:\ndocument_properties_producer=PDF-verktøy:\ndocument_properties_version=PDF-versjon:\ndocument_properties_page_count=Sideantall:\ndocument_properties_close=Lukk\n\nprint_progress_message=Forbereder dokument for utskrift …\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Avbryt\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Slå av/på sidestolpe\ntoggle_sidebar_notification.title=Vis/gjem sidestolpe (dokumentet inneholder oversikt/vedlegg)\ntoggle_sidebar_label=Slå av/på sidestolpe\ndocument_outline.title=Vis dokumentdisposisjonen (dobbeltklikk for å utvide/skjule alle elementer)\ndocument_outline_label=Dokumentdisposisjon\nattachments.title=Vis vedlegg\nattachments_label=Vedlegg\nthumbs.title=Vis miniatyrbilde\nthumbs_label=Miniatyrbilde\nfindbar.title=Finn i dokumentet\nfindbar_label=Finn\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Side {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatyrbilde av side {{page}}\n\n# Find panel button title and messages\nfind_input.title=Søk\nfind_input.placeholder=Søk i dokument…\nfind_previous.title=Finn forrige forekomst av frasen\nfind_previous_label=Forrige\nfind_next.title=Finn neste forekomst av frasen\nfind_next_label=Neste\nfind_highlight=Uthev alle\nfind_match_case_label=Skill store/små bokstaver\nfind_reached_top=Nådde toppen av dokumentet, fortsetter fra bunnen\nfind_reached_bottom=Nådde bunnen av dokumentet, fortsetter fra toppen\nfind_not_found=Fant ikke teksten\n\n# Error panel labels\nerror_more_info=Mer info\nerror_less_info=Mindre info\nerror_close=Lukk\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (bygg: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Melding: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stakk: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linje: {{line}}\nrendering_error=En feil oppstod ved opptegning av siden.\n\n# Predefined zoom values\npage_scale_width=Sidebredde\npage_scale_fit=Tilpass til siden\npage_scale_auto=Automatisk zoom\npage_scale_actual=Virkelig størrelse\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}} %\n\n# Loading indicator messages\nloading_error_indicator=Feil\nloading_error=En feil oppstod ved lasting av PDF.\ninvalid_file_error=Ugyldig eller skadet PDF-fil.\nmissing_file_error=Manglende PDF-fil.\nunexpected_response_error=Uventet serverrespons.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} annotasjon]\npassword_label=Skriv inn passordet for å åpne denne PDF-filen.\npassword_invalid=Ugyldig passord. Prøv igjen.\npassword_ok=OK\npassword_cancel=Avbryt\n\nprinting_not_supported=Advarsel: Utskrift er ikke fullstendig støttet av denne nettleseren.\nprinting_not_ready=Advarsel: PDF er ikke fullstendig innlastet for utskrift.\nweb_fonts_disabled=Web-fonter er avslått: Kan ikke bruke innbundne PDF-fonter.\ndocument_colors_not_allowed=PDF-dokumenter tillates ikke å bruke deres egne farger: \"Tillat sider å velge egne farger\" er deaktivert i nettleseren.\n"
  },
  {
    "path": "pages/include/pdf/locale/nl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Vorige pagina\nprevious_label=Vorige\nnext.title=Volgende pagina\nnext_label=Volgende\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pagina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=van {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} van {{pagesCount}})\n\nzoom_out.title=Uitzoomen\nzoom_out_label=Uitzoomen\nzoom_in.title=Inzoomen\nzoom_in_label=Inzoomen\nzoom.title=Zoomen\npresentation_mode.title=Wisselen naar presentatiemodus\npresentation_mode_label=Presentatiemodus\nopen_file.title=Bestand openen\nopen_file_label=Openen\nprint.title=Afdrukken\nprint_label=Afdrukken\ndownload.title=Downloaden\ndownload_label=Downloaden\nbookmark.title=Huidige weergave (kopiëren of openen in nieuw venster)\nbookmark_label=Huidige weergave\n\n# Secondary toolbar and context menu\ntools.title=Hulpmiddelen\ntools_label=Hulpmiddelen\nfirst_page.title=Naar eerste pagina gaan\nfirst_page.label=Naar eerste pagina gaan\nfirst_page_label=Naar eerste pagina gaan\nlast_page.title=Naar laatste pagina gaan\nlast_page.label=Naar laatste pagina gaan\nlast_page_label=Naar laatste pagina gaan\npage_rotate_cw.title=Rechtsom draaien\npage_rotate_cw.label=Rechtsom draaien\npage_rotate_cw_label=Rechtsom draaien\npage_rotate_ccw.title=Linksom draaien\npage_rotate_ccw.label=Linksom draaien\npage_rotate_ccw_label=Linksom draaien\n\ncursor_text_select_tool.title=Tekstselectiehulpmiddel inschakelen\ncursor_text_select_tool_label=Tekstselectiehulpmiddel\ncursor_hand_tool.title=Handhulpmiddel inschakelen\ncursor_hand_tool_label=Handhulpmiddel\n\n# Document properties dialog box\ndocument_properties.title=Documenteigenschappen…\ndocument_properties_label=Documenteigenschappen…\ndocument_properties_file_name=Bestandsnaam:\ndocument_properties_file_size=Bestandsgrootte:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Auteur:\ndocument_properties_subject=Onderwerp:\ndocument_properties_keywords=Trefwoorden:\ndocument_properties_creation_date=Aanmaakdatum:\ndocument_properties_modification_date=Wijzigingsdatum:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Auteur:\ndocument_properties_producer=PDF-producent:\ndocument_properties_version=PDF-versie:\ndocument_properties_page_count=Aantal pagina’s:\ndocument_properties_close=Sluiten\n\nprint_progress_message=Document voorbereiden voor afdrukken…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Annuleren\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Zijbalk in-/uitschakelen\ntoggle_sidebar_notification.title=Zijbalk in-/uitschakelen (document bevat overzicht/bijlagen)\ntoggle_sidebar_label=Zijbalk in-/uitschakelen\ndocument_outline.title=Documentoverzicht tonen (dubbelklik om alle items uit/samen te vouwen)\ndocument_outline_label=Documentoverzicht\nattachments.title=Bijlagen tonen\nattachments_label=Bijlagen\nthumbs.title=Miniaturen tonen\nthumbs_label=Miniaturen\nfindbar.title=Zoeken in document\nfindbar_label=Zoeken\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatuur van pagina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Zoeken\nfind_input.placeholder=Zoeken in document…\nfind_previous.title=De vorige overeenkomst van de tekst zoeken\nfind_previous_label=Vorige\nfind_next.title=De volgende overeenkomst van de tekst zoeken\nfind_next_label=Volgende\nfind_highlight=Alles markeren\nfind_match_case_label=Hoofdlettergevoelig\nfind_reached_top=Bovenkant van document bereikt, doorgegaan vanaf onderkant\nfind_reached_bottom=Onderkant van document bereikt, doorgegaan vanaf bovenkant\nfind_not_found=Tekst niet gevonden\n\n# Error panel labels\nerror_more_info=Meer informatie\nerror_less_info=Minder informatie\nerror_close=Sluiten\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Bericht: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Bestand: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Regel: {{line}}\nrendering_error=Er is een fout opgetreden bij het weergeven van de pagina.\n\n# Predefined zoom values\npage_scale_width=Paginabreedte\npage_scale_fit=Hele pagina\npage_scale_auto=Automatisch zoomen\npage_scale_actual=Werkelijke grootte\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Fout\nloading_error=Er is een fout opgetreden bij het laden van de PDF.\ninvalid_file_error=Ongeldig of beschadigd PDF-bestand.\nmissing_file_error=PDF-bestand ontbreekt. \nunexpected_response_error=Onverwacht serverantwoord.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-aantekening]\npassword_label=Voer het wachtwoord in om dit PDF-bestand te openen.\npassword_invalid=Ongeldig wachtwoord. Probeer het opnieuw.\npassword_ok=OK\npassword_cancel=Annuleren\n\nprinting_not_supported=Waarschuwing: afdrukken wordt niet volledig ondersteund door deze browser.\nprinting_not_ready=Waarschuwing: de PDF is niet volledig geladen voor afdrukken.\nweb_fonts_disabled=Weblettertypen zijn uitgeschakeld: gebruik van ingebedde PDF-lettertypen is niet mogelijk.\ndocument_colors_not_allowed=PDF-documenten mogen hun eigen kleuren niet gebruiken: ‘Pagina’s toestaan om hun eigen kleuren te kiezen’ is uitgeschakeld in de browser.\n"
  },
  {
    "path": "pages/include/pdf/locale/nn-NO/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Føregåande side\nprevious_label=Føregåande\nnext.title=Neste side\nnext_label=Neste\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Side\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=av {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} av {{pagesCount}})\n\nzoom_out.title=Zoom ut\nzoom_out_label=Zoom ut\nzoom_in.title=Zoom inn\nzoom_in_label=Zoom inn\nzoom.title=Zoom\npresentation_mode.title=Byt til presentasjonsmodus\npresentation_mode_label=Presentasjonsmodus\nopen_file.title=Opne fil\nopen_file_label=Opne\nprint.title=Skriv ut\nprint_label=Skriv ut\ndownload.title=Last ned\ndownload_label=Last ned\nbookmark.title=Gjeldande vising (kopier eller opne i nytt vindauge)\nbookmark_label=Gjeldande vising\n\n# Secondary toolbar and context menu\ntools.title=Verktøy\ntools_label=Verktøy\nfirst_page.title=Gå til første side\nfirst_page.label=Gå til første side\nfirst_page_label=Gå til første side\nlast_page.title=Gå til siste side\nlast_page.label=Gå til siste side\nlast_page_label=Gå til siste side\npage_rotate_cw.title=Roter med klokka\npage_rotate_cw.label=Roter med klokka\npage_rotate_cw_label=Roter med klokka\npage_rotate_ccw.title=Roter mot klokka\npage_rotate_ccw.label=Roter mot klokka\npage_rotate_ccw_label=Roter mot klokka\n\ncursor_text_select_tool.title=Aktiver tekstmarkeringsverktøy\ncursor_text_select_tool_label=Tekstmarkeringsverktøy\ncursor_hand_tool.title=Aktiver handverktøy\ncursor_hand_tool_label=Handverktøy\n\n# Document properties dialog box\ndocument_properties.title=Dokumenteigenskapar…\ndocument_properties_label=Dokumenteigenskapar…\ndocument_properties_file_name=Filnamn:\ndocument_properties_file_size=Filstorleik:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Tittel:\ndocument_properties_author=Forfattar:\ndocument_properties_subject=Emne:\ndocument_properties_keywords=Stikkord:\ndocument_properties_creation_date=Dato oppretta:\ndocument_properties_modification_date=Dato endra:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Oppretta av:\ndocument_properties_producer=PDF-verktøy:\ndocument_properties_version=PDF-versjon:\ndocument_properties_page_count=Sidetal:\ndocument_properties_close=Lukk\n\nprint_progress_message=Førebur dokumentet for utskrift…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Avbryt\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Slå av/på sidestolpe\ntoggle_sidebar_notification.title=Vis/gøym sidestolpen (dokumentet inneheld oversikt/vedlegg)\ntoggle_sidebar_label=Slå av/på sidestolpe\ndocument_outline.title=Vis dokumentdisposisjonen (dobbelklikk for å utvide/gøyme alle elementa)\ndocument_outline_label=Dokumentdisposisjon\nattachments.title=Vis vedlegg\nattachments_label=Vedlegg\nthumbs.title=Vis miniatyrbilde\nthumbs_label=Miniatyrbilde\nfindbar.title=Finn i dokumentet\nfindbar_label=Finn\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Side {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatyrbilde av side {{page}}\n\n# Find panel button title and messages\nfind_input.title=Søk\nfind_input.placeholder=Søk i dokument…\nfind_previous.title=Finn førre førekomst av frasen\nfind_previous_label=Førre\nfind_next.title=Finn neste førekomst av frasen\nfind_next_label=Neste\nfind_highlight=Uthev alle\nfind_match_case_label=Skil store/små bokstavar\nfind_reached_top=Nådde toppen av dokumentet, fortset frå botnen\nfind_reached_bottom=Nådde botnen av dokumentet, fortset frå toppen\nfind_not_found=Fann ikkje teksten\n\n# Error panel labels\nerror_more_info=Meir info\nerror_less_info=Mindre info\nerror_close=Lukk\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (bygg: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Melding: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stakk: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linje: {{line}}\nrendering_error=Ein feil oppstod under vising av sida.\n\n# Predefined zoom values\npage_scale_width=Sidebreidde\npage_scale_fit=Tilpass til sida\npage_scale_auto=Automatisk skalering\npage_scale_actual=Verkeleg storleik\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Feil\nloading_error=Ein feil oppstod ved lasting av PDF.\ninvalid_file_error=Ugyldig eller korrupt PDF-fil.\nmissing_file_error=Manglande PDF-fil.\nunexpected_response_error=Uventa tenarrespons.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} annotasjon]\npassword_label=Skriv inn passordet for å opne denne PDF-fila.\npassword_invalid=Ugyldig passord. Prøv igjen.\npassword_ok=OK\npassword_cancel=Avbryt\n\nprinting_not_supported=Åtvaring: Utskrift er ikkje fullstendig støtta av denne nettlesaren.\nprinting_not_ready=Åtvaring: PDF ikkje fullstendig innlasta for utskrift.\nweb_fonts_disabled=Web-skrifter er slått av: Kan ikkje bruke innbundne PDF-skrifter.\ndocument_colors_not_allowed=PDF-dokument kan ikkje bruke eigne fargar: «Tillat sider å velje eigne fargar» er deaktivert i nettlesaren.\n"
  },
  {
    "path": "pages/include/pdf/locale/nso/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Letlakala le fetilego\nprevious_label=Fetilego\nnext.title=Letlakala le latelago\nnext_label=Latelago\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Bušetša ka gare\nzoom_out_label=Bušetša ka gare\nzoom_in.title=Godišetša ka ntle\nzoom_in_label=Godišetša ka ntle\nzoom.title=Godiša\npresentation_mode.title=Fetogela go mokgwa wa tlhagišo\npresentation_mode_label=Mokgwa wa tlhagišo\nopen_file.title=Bula faele\nopen_file_label=Bula\nprint.title=Gatiša\nprint_label=Gatiša\ndownload.title=Laolla\ndownload_label=Laolla\nbookmark.title=Pono ya bjale (kopiša le go bula lefasetereng le leswa)\nbookmark_label=Tebelelo ya gona bjale\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\ndocument_properties_file_name=Leina la faele:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Thaetlele:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Šielanya para ya ka thoko\ntoggle_sidebar_label=Šielanya para ya ka thoko\ndocument_outline_label=Kakaretšo ya tokumente\nthumbs.title=Laetša dikhutšofatšo\nthumbs_label=Dikhutšofatšo\nfindbar.title=Hwetša go tokumente\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Letlakala {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Khutšofatšo ya letlakala {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Hwetša tiragalo e fetilego ya sekafoko\nfind_previous_label=Fetilego\nfind_next.title=Hwetša tiragalo e latelago ya sekafoko\nfind_next_label=Latelago\nfind_highlight=Bonagatša tšohle\nfind_match_case_label=Swantšha kheisi\nfind_reached_top=Fihlile godimo ga tokumente, go tšwetšwe pele go tloga tlase\nfind_reached_bottom=Fihlile mafelelong a tokumente, go tšwetšwe pele go tloga godimo\nfind_not_found=Sekafoko ga sa hwetšwa\n\n# Error panel labels\nerror_more_info=Tshedimošo e oketšegilego\nerror_less_info=Tshedimošo ya tlasana\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Molaetša: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Mokgobo: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Faele: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Mothaladi: {{line}}\nrendering_error=Go diregile phošo ge go be go gafelwa letlakala.\n\n# Predefined zoom values\npage_scale_width=Bophara bja letlakala\npage_scale_fit=Go lekana ga letlakala\npage_scale_auto=Kgodišo ya maitirišo\npage_scale_actual=Bogolo bja kgonthe\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Phošo\nloading_error=Go diregile phošo ge go hlahlelwa PDF.\ninvalid_file_error=Faele ye e sa šomego goba e senyegilego ya PDF.\nmissing_file_error=Faele yeo e sego gona ya PDF.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Tlhaloso]\npassword_ok=LOKILE\n\nprinting_not_supported=Temošo: Go gatiša ga go thekgwe ke praosara ye ka botlalo.\nprinting_not_ready=Temošo: PDF ga ya hlahlelwa ka botlalo bakeng sa go gatišwa.\nweb_fonts_disabled=Difonte tša wepe di šitišitšwe: ga e kgone go diriša difonte tša PDF tše khutišitšwego.\n"
  },
  {
    "path": "pages/include/pdf/locale/oc/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pagina precedenta\nprevious_label=Precedent\nnext.title=Pagina seguenta\nnext_label=Seguent\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pagina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=sus {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Zoom arrièr\nzoom_out_label=Zoom arrièr\nzoom_in.title=Zoom avant\nzoom_in_label=Zoom avant\nzoom.title=Zoom\npresentation_mode.title=Bascular en mòde presentacion\npresentation_mode_label=Mòde Presentacion\nopen_file.title=Dobrir lo fichièr\nopen_file_label=Dobrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Telecargar\ndownload_label=Telecargar\nbookmark.title=Afichatge corrent (copiar o dobrir dins una fenèstra novèla)\nbookmark_label=Afichatge actual\n\n# Secondary toolbar and context menu\ntools.title=Aisinas\ntools_label=Aisinas\nfirst_page.title=Anar a la primièra pagina\nfirst_page.label=Anar a la primièra pagina\nfirst_page_label=Anar a la primièra pagina\nlast_page.title=Anar a la darrièra pagina\nlast_page.label=Anar a la darrièra pagina\nlast_page_label=Anar a la darrièra pagina\npage_rotate_cw.title=Rotacion orària\npage_rotate_cw.label=Rotacion orària\npage_rotate_cw_label=Rotacion orària\npage_rotate_ccw.title=Rotacion antiorària\npage_rotate_ccw.label=Rotacion antiorària\npage_rotate_ccw_label=Rotacion antiorària\n\nhand_tool_enable.title=Activar l'aisina man\nhand_tool_enable_label=Activar l'aisina man\nhand_tool_disable.title=Desactivar l'aisina man\nhand_tool_disable_label=Desactivar l'aisina man\n\n# Document properties dialog box\ndocument_properties.title=Proprietats del document...\ndocument_properties_label=Proprietats del document...\ndocument_properties_file_name=Nom del fichièr :\ndocument_properties_file_size=Talha del fichièr :\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} Ko ({{size_b}} octets)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} Mo ({{size_b}} octets)\ndocument_properties_title=Títol :\ndocument_properties_author=Autor :\ndocument_properties_subject=Subjècte :\ndocument_properties_keywords=Mots claus :\ndocument_properties_creation_date=Data de creacion :\ndocument_properties_modification_date=Data de modificacion :\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Creator :\ndocument_properties_producer=Aisina de conversion PDF :\ndocument_properties_version=Version PDF :\ndocument_properties_page_count=Nombre de paginas :\ndocument_properties_close=Tampar\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_close=Anullar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Afichar/amagar lo panèl lateral\ntoggle_sidebar_label=Afichar/amagar lo panèl lateral\ndocument_outline_label=Marcapaginas del document\nattachments.title=Visualizar las pèças juntas\nattachments_label=Pèças juntas\nthumbs.title=Afichar las vinhetas\nthumbs_label=Vinhetas\nfindbar.title=Trobar dins lo document\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Vinheta de la pagina {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Tròba l'ocurréncia precedenta de la frasa\nfind_previous_label=Precedent\nfind_next.title=Tròba l'ocurréncia venenta de la frasa\nfind_next_label=Seguent\nfind_highlight=Suslinhar tot\nfind_match_case_label=Respectar la cassa\nfind_reached_top=Naut de la pagina atench, perseguida dempuèi lo bas\nfind_reached_bottom=Bas de la pagina atench, perseguida al començament\nfind_not_found=Frasa pas trobada\n\n# Error panel labels\nerror_more_info=Mai de detalhs\nerror_less_info=Mens d'informacions\nerror_close=Tampar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (identificant de compilacion : {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Messatge : {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pila : {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fichièr : {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linha : {{line}}\nrendering_error=Una error s'es produita pendent l'afichatge de la pagina.\n\n# Predefined zoom values\npage_scale_width=Largor plena\npage_scale_fit=Pagina entièra\npage_scale_auto=Zoom automatic\npage_scale_actual=Talha vertadièra\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Error\nloading_error=Una error s'es produita pendent lo cargament del fichièr PDF.\ninvalid_file_error=Fichièr PDF invalid o corromput.\nmissing_file_error=Fichièr PDF mancant.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotacion {{type}}]\npassword_label=Picatz lo senhal per dobrir aqueste fichièr PDF.\npassword_invalid=Senhal incorrècte. Tornatz ensajar.\npassword_ok=D'acòrdi\npassword_cancel=Anullar\n\nprinting_not_supported=Atencion : l'impression es pas completament gerit per aqueste navigador.\nprinting_not_ready=Atencion : lo PDF es pas entièrament cargat per lo poder imprimir.\nweb_fonts_disabled=Las poliças web son desactivadas : impossible d'utilizar las poliças integradas al PDF.\ndocument_colors_not_allowed=Los documents PDF pòdon pas utilizar lors pròprias colors : « Autorizar las paginas web d'utilizar lors pròprias colors » es desactivat dins lo navigador.\n"
  },
  {
    "path": "pages/include/pdf/locale/or/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=ପୂର୍ବ ପୃଷ୍ଠା\nprevious_label=ପୂର୍ବ\nnext.title=ପର ପୃଷ୍ଠା\nnext_label=ପର\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=ଛୋଟ କରନ୍ତୁ\nzoom_out_label=ଛୋଟ କରନ୍ତୁ\nzoom_in.title=ବଡ଼ କରନ୍ତୁ\nzoom_in_label=ବଡ଼ କରନ୍ତୁ\nzoom.title=ଛୋଟ ବଡ଼ କରନ୍ତୁ\npresentation_mode.title=ଉପସ୍ଥାପନ ଧାରାକୁ ବଦଳାନ୍ତୁ\npresentation_mode_label=ଉପସ୍ଥାପନ ଧାରା\nopen_file.title=ଫାଇଲ ଖୋଲନ୍ତୁ\nopen_file_label=ଖୋଲନ୍ତୁ\nprint.title=ମୁଦ୍ରଣ\nprint_label=ମୁଦ୍ରଣ\ndownload.title=ଆହରଣ\ndownload_label=ଆହରଣ\nbookmark.title=ପ୍ରଚଳିତ ଦୃଶ୍ୟ (ନକଲ କରନ୍ତୁ କିମ୍ବା ଏକ ନୂତନ ୱିଣ୍ଡୋରେ ଖୋଲନ୍ତୁ)\nbookmark_label=ପ୍ରଚଳିତ ଦୃଶ୍ୟ\n\n# Secondary toolbar and context menu\ntools.title=ସାଧନଗୁଡ଼ିକ\ntools_label=ସାଧନଗୁଡ଼ିକ\nfirst_page.title=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\nfirst_page.label=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\nfirst_page_label=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\nlast_page.title=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\nlast_page.label=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\nlast_page_label=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ\npage_rotate_cw.title=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\npage_rotate_cw.label=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\npage_rotate_cw_label=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\npage_rotate_ccw.title=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\npage_rotate_ccw.label=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\npage_rotate_ccw_label=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ\n\n\n# Document properties dialog box\ndocument_properties.title=ଦଲିଲ ଗୁଣଧର୍ମ…\ndocument_properties_label=ଦଲିଲ ଗୁଣଧର୍ମ…\ndocument_properties_file_name=ଫାଇଲ ନାମ:\ndocument_properties_file_size=ଫାଇଲ ଆକାର:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=ଶୀର୍ଷକ:\ndocument_properties_author=ଲେଖକ:\ndocument_properties_subject=ବିଷୟ:\ndocument_properties_keywords=ସୂଚକ ଶବ୍ଦ:\ndocument_properties_creation_date=ନିର୍ମାଣ ତାରିଖ:\ndocument_properties_modification_date=ପରିବର୍ତ୍ତନ ତାରିଖ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=ନିର୍ମାତା:\ndocument_properties_producer=PDF ପ୍ରଯୋଜକ:\ndocument_properties_version=PDF ସଂସ୍କରଣ:\ndocument_properties_page_count=ପୃଷ୍ଠା ଗଣନା:\ndocument_properties_close=ବନ୍ଦ କରନ୍ତୁ\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ପାର୍ଶ୍ୱପଟିକୁ ଆଗପଛ କରନ୍ତୁ\ntoggle_sidebar_label=ପାର୍ଶ୍ୱପଟିକୁ ଆଗପଛ କରନ୍ତୁ\ndocument_outline_label=ଦଲିଲ ସାରାଂଶ\nattachments.title=ସଂଲଗ୍ନକଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ\nattachments_label=ସଲଗ୍ନକଗୁଡିକ\nthumbs.title=ସଂକ୍ଷିପ୍ତ ବିବରଣୀ ଦର୍ଶାନ୍ତୁ\nthumbs_label=ସଂକ୍ଷିପ୍ତ ବିବରଣୀ\nfindbar.title=ଦଲିଲରେ ଖୋଜନ୍ତୁ\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=ପୃଷ୍ଠା {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=ପୃଷ୍ଠାର ସଂକ୍ଷିପ୍ତ ବିବରଣୀ {{page}}\n\n# Find panel button title and messages\nfind_previous.title=ଏହି ବାକ୍ୟାଂଶର ପୂର୍ବ ଉପସ୍ଥିତିକୁ ଖୋଜନ୍ତୁ\nfind_previous_label=ପୂର୍ବବର୍ତ୍ତୀ\nfind_next.title=ଏହି ବାକ୍ୟାଂଶର ପରବର୍ତ୍ତୀ ଉପସ୍ଥିତିକୁ ଖୋଜନ୍ତୁ\nfind_next_label=ପରବର୍ତ୍ତୀ\\u0020\nfind_highlight=ସମସ୍ତଙ୍କୁ ଆଲୋକିତ କରନ୍ତୁ\nfind_match_case_label=ଅକ୍ଷର ମେଳାନ୍ତୁ\nfind_reached_top=ତଳୁ ଉପରକୁ ଗତି କରି ଦଲିଲର ଉପର ଭାଗରେ ପହଞ୍ଚି ଯାଇଛି\nfind_reached_bottom=ଉପରୁ ତଳକୁ ଗତି କରି ଦଲିଲର ଶେଷ ଭାଗରେ ପହଞ୍ଚି ଯାଇଛି\nfind_not_found=ବାକ୍ୟାଂଶ ମିଳିଲା ନାହିଁ\n\n# Error panel labels\nerror_more_info=ଅଧିକ ସୂଚନା\nerror_less_info=ସ୍ୱଳ୍ପ ସୂଚନା\nerror_close=ବନ୍ଦ କରନ୍ତୁ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=ସନ୍ଦେଶ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ଷ୍ଟାକ: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ଫାଇଲ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ଧାଡ଼ି: {{line}}\nrendering_error=ପୃଷ୍ଠା ଚିତ୍ରଣ କରିବା ସମୟରେ ତ୍ରୁଟି ଘଟିଲା।\n\n# Predefined zoom values\npage_scale_width=ପୃଷ୍ଠା ଓସାର\npage_scale_fit=ପୃଷ୍ଠା ମେଳନ\npage_scale_auto=ସ୍ୱୟଂଚାଳିତ ଭାବରେ ଛୋଟବଡ଼ କରିବା\npage_scale_actual=ପ୍ରକୃତ ଆକାର\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=ତ୍ରୁଟି\nloading_error=PDF ଧାରଣ କରିବା ସମୟରେ ଏକ ତ୍ରୁଟି ଘଟିଲା।\ninvalid_file_error=ଅବୈଧ କିମ୍ବା ତ୍ରୁଟିଯୁକ୍ତ PDF ଫାଇଲ।\nmissing_file_error=ହଜିଯାଇଥିବା PDF ଫାଇଲ।\nunexpected_response_error=ଅପ୍ରତ୍ୟାଶିତ ସର୍ଭର ଉତ୍ତର।\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Annotation]\npassword_label=ଏହି PDF ଫାଇଲକୁ ଖୋଲିବା ପାଇଁ ପ୍ରବେଶ ସଂକେତ ଭରଣ କରନ୍ତୁ।\npassword_invalid=ଭୁଲ ପ୍ରବେଶ ସଂକେତ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।\npassword_ok=ଠିକ ଅଛି\n\nprinting_not_supported=ଚେତାବନୀ: ଏହି ବ୍ରାଉଜର ଦ୍ୱାରା ମୁଦ୍ରଣ କ୍ରିୟା ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ସହାୟତା ପ୍ରାପ୍ତ ନୁହଁ।\nprinting_not_ready=ଚେତାବନୀ: PDF ଟି ମୁଦ୍ରଣ ପାଇଁ ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ଧାରଣ ହୋଇ ନାହିଁ।\nweb_fonts_disabled=ୱେବ ଅକ୍ଷରରୂପଗୁଡ଼ିକୁ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି: ସନ୍ନିହିତ PDF ଅକ୍ଷରରୂପଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବାରେ ଅସମର୍ଥ।\ndocument_colors_not_allowed=PDF ଦଲିଲଗୁଡ଼ିକ ସେମାନଙ୍କର ନିଜର ରଙ୍ଗ ବ୍ୟବହାର କରିବା ପାଇଁ ଅନୁମତି ପ୍ରାପ୍ତ ନୁହଁ: 'ସେମାନଙ୍କର ନିଜ ରଙ୍ଗ ବାଛିବା ପାଇଁ ପୃଷ୍ଠାଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ' କୁ ବ୍ରାଉଜରରେ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି।\n"
  },
  {
    "path": "pages/include/pdf/locale/pa-IN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=ਸਫ਼ਾ ਪਿੱਛੇ\nprevious_label=ਪਿੱਛੇ\nnext.title=ਸਫ਼ਾ ਅੱਗੇ\nnext_label=ਅੱਗੇ\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Page\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=of {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} of {{pagesCount}})\n\nzoom_out.title=ਜ਼ੂਮ ਆਉਟ\nzoom_out_label=ਜ਼ੂਮ ਆਉਟ\nzoom_in.title=ਜ਼ੂਮ ਇਨ\nzoom_in_label=ਜ਼ੂਮ ਇਨ\nzoom.title=ਜ਼ੂਨ\npresentation_mode.title=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ ਵਿੱਚ ਜਾਓ\npresentation_mode_label=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ\nopen_file.title=ਫਾਈਲ ਨੂੰ ਖੋਲ੍ਹੋ\nopen_file_label=ਖੋਲ੍ਹੋ\nprint.title=ਪਰਿੰਟ\nprint_label=ਪਰਿੰਟ\ndownload.title=ਡਾਊਨਲੋਡ\ndownload_label=ਡਾਊਨਲੋਡ\nbookmark.title=ਮੌਜੂਦਾ ਝਲਕ (ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਕਾਪੀ ਕਰੋ ਜਾਂ ਖੋਲ੍ਹੋ)\nbookmark_label=ਮੌਜੂਦਾ ਝਲਕ\n\n# Secondary toolbar and context menu\ntools.title=ਟੂਲ\ntools_label=ਟੂਲ\nfirst_page.title=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nfirst_page.label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nfirst_page_label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nlast_page.title=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nlast_page.label=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\nlast_page_label=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ\npage_rotate_cw.title=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ\npage_rotate_cw.label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਉ\npage_rotate_cw_label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ\npage_rotate_ccw.title=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ\npage_rotate_ccw.label=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਉ\npage_rotate_ccw_label=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ\n\n\n# Document properties dialog box\ndocument_properties.title=…ਦਸਤਾਵੇਜ਼ ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ\ndocument_properties_label=…ਦਸਤਾਵੇਜ਼ ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ\ndocument_properties_file_name=ਫਾਈਲ ਦਾ ਨਾਂ:\ndocument_properties_file_size=ਫਾਈਲ ਦਾ ਆਕਾਰ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} ਬਾਈਟ)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} ਬਾਈਟ)\ndocument_properties_title=ਟਾਈਟਲ:\ndocument_properties_author=ਲੇਖਕ:\ndocument_properties_subject=ਵਿਸ਼ਾ:\ndocument_properties_keywords=ਸ਼ਬਦ:\ndocument_properties_creation_date=ਬਣਾਉਣ ਦੀ ਮਿਤੀ:\ndocument_properties_modification_date=ਸੋਧ ਦੀ ਮਿਤੀ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=ਨਿਰਮਾਤਾ:\ndocument_properties_producer=PDF ਪ੍ਰੋਡਿਊਸਰ:\ndocument_properties_version=PDF ਵਰਜਨ:\ndocument_properties_page_count=ਸਫ਼ੇ ਦੀ ਗਿਣਤੀ:\ndocument_properties_close=ਬੰਦ ਕਰੋ\n\nprint_progress_message=Preparing document for printing…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancel\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=ਬਾਹੀ ਬਦਲੋ\ntoggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)\ntoggle_sidebar_label=ਬਾਹੀ ਬਦਲੋ\ndocument_outline.title=Show Document Outline (double-click to expand/collapse all items)\ndocument_outline_label=Document Outline\nattachments.title=ਅਟੈਚਮੈਂਟ ਨੂੰ ਵੇਖਾਓ\nattachments_label=ਅਟੈਚਮੈਂਟ\nthumbs.title=ਥੰਮਨੇਲ ਨੂੰ ਵੇਖਾਓ\nthumbs_label=ਥੰਮਨੇਲ\nfindbar.title=ਦਸਤਾਵੇਜ਼ ਵਿੱਚ ਲੱਭੋ\nfindbar_label=ਲੱਭੋ\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=ਸਫ਼ਾ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}} ਸਫ਼ੇ ਦਾ ਥੰਮਨੇਲ\n\n# Find panel button title and messages\nfind_previous.title=ਵਾਕ ਦੀ ਪਿਛਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ\nfind_previous_label=ਪਿੱਛੇ\nfind_next.title=ਵਾਕ ਦੀ ਅਗਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ\nfind_next_label=ਅੱਗੇ\nfind_highlight=ਸਭ ਉਭਾਰੋ\nfind_match_case_label=ਅੱਖਰ ਆਕਾਰ ਨੂੰ ਮਿਲਾਉ\nfind_reached_top=ਦਸਤਾਵੇਜ਼ ਦੇ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਥੱਲੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ\nfind_reached_bottom=ਦਸਤਾਵੇਜ਼ ਦੇ ਅੰਤ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਉੱਤੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ\nfind_not_found=ਵਾਕ ਨਹੀਂ ਲੱਭਿਆ\n\n# Error panel labels\nerror_more_info=ਹੋਰ ਜਾਣਕਾਰੀ\nerror_less_info=ਘੱਟ ਜਾਣਕਾਰੀ\nerror_close=ਬੰਦ ਕਰੋ\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (ਬਿਲਡ: {{build}}\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=ਸੁਨੇਹਾ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ਸਟੈਕ: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ਫਾਈਲ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=ਲਾਈਨ: {{line}}\nrendering_error=ਸਫ਼ਾ ਰੈਡਰ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ।\n\n# Predefined zoom values\npage_scale_width=ਸਫ਼ੇ ਦੀ ਚੌੜਾਈ\npage_scale_fit=ਸਫ਼ਾ ਫਿੱਟ\npage_scale_auto=ਆਟੋਮੈਟਿਕ ਜ਼ੂਮ ਕਰੋ\npage_scale_actual=ਆਟੋਮੈਟਿਕ ਆਕਾਰ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=ਗਲਤੀ\nloading_error=PDF ਲੋਡ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ।\ninvalid_file_error=ਗਲਤ ਜਾਂ ਨਿਕਾਰਾ PDF ਫਾਈਲ ਹੈ।\nmissing_file_error=ਨਾ-ਮੌਜੂਦ PDF ਫਾਈਲ।\nunexpected_response_error=ਅਣਜਾਣ ਸਰਵਰ ਜਵਾਬ।\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}  ਵਿਆਖਿਆ]\npassword_label=ਇਹ PDF ਫਾਈਲ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ ਪਾਸਵਰਡ ਦਿਉ।\npassword_invalid=ਗਲਤ ਪਾਸਵਰਡ। ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ।\npassword_ok=ਠੀਕ ਹੈ\npassword_cancel=ਰੱਦ ਕਰੋ\n\nprinting_not_supported=ਸਾਵਧਾਨ: ਇਹ ਬਰਾਊਜ਼ਰ ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਸਹਾਇਕ ਨਹੀਂ ਹੈ।\nprinting_not_ready=ਸਾਵਧਾਨ: PDF ਨੂੰ ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਲੋਡ ਨਹੀਂ ਹੈ।\nweb_fonts_disabled=ਵੈਬ ਫੋਂਟ ਬੰਦ ਹਨ: ਇੰਬੈਡ PDF ਫੋਂਟ ਨੂੰ ਵਰਤਣ ਲਈ ਅਸਮਰੱਥ ਹੈ।\ndocument_colors_not_allowed=PDF ਦਸਤਾਵੇਜ਼ਾਂ ਨੂੰ ਆਪਣੇ ਰੰਗ ਵਰਤਣ ਦੀ ਇਜ਼ਾਜ਼ਤ ਨਹੀਂ ਹੈ।: ਬਰਾਊਜ਼ਰ ਵਿੱਚ “ਸਫ਼ਿਆਂ ਨੂੰ ਆਪਣੇ ਰੰਗ ਚੁਣਨ ਦੀ ਇਜ਼ਾਜ਼ਤ ਦਿਓ” ਨਾ-ਸਰਗਰਮ ਹੈ।\n"
  },
  {
    "path": "pages/include/pdf/locale/pl/viewer.properties",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nprevious.title=Poprzednia strona\nprevious_label=Poprzednia\nnext.title=Następna strona\nnext_label=Następna\n\npage.title==Strona:\nof_pages=z {{pagesCount}}\npage_of_pages=({{pageNumber}} z {{pagesCount}})\n\nzoom_out.title=Pomniejszenie\nzoom_out_label=Pomniejsz\nzoom_in.title=Powiększenie\nzoom_in_label=Powiększ\nzoom.title=Skala\npresentation_mode.title=Przełącz na tryb prezentacji\npresentation_mode_label=Tryb prezentacji\nopen_file.title=Otwieranie pliku\nopen_file_label=Otwórz\nprint.title=Drukowanie\nprint_label=Drukuj\ndownload.title=Pobieranie\ndownload_label=Pobierz\nbookmark.title=Bieżąca pozycja (skopiuj lub otwórz jako odnośnik w nowym oknie)\nbookmark_label=Bieżąca pozycja\n\ntools.title=Narzędzia\ntools_label=Narzędzia\nfirst_page.title=Przechodzenie do pierwszej strony\nfirst_page.label=Przejdź do pierwszej strony\nfirst_page_label=Przejdź do pierwszej strony\nlast_page.title=Przechodzenie do ostatniej strony\nlast_page.label=Przejdź do ostatniej strony\nlast_page_label=Przejdź do ostatniej strony\npage_rotate_cw.title=Obracanie zgodnie z ruchem wskazówek zegara\npage_rotate_cw.label=Obróć zgodnie z ruchem wskazówek zegara\npage_rotate_cw_label=Obróć zgodnie z ruchem wskazówek zegara\npage_rotate_ccw.title=Obracanie przeciwnie do ruchu wskazówek zegara\npage_rotate_ccw.label=Obróć przeciwnie do ruchu wskazówek zegara\npage_rotate_ccw_label=Obróć przeciwnie do ruchu wskazówek zegara\n\ncursor_text_select_tool.title=Włącza narzędzie zaznaczania tekstu\ncursor_text_select_tool_label=Narzędzie zaznaczania tekstu\ncursor_hand_tool.title=Włącza narzędzie rączka\ncursor_hand_tool_label=Narzędzie rączka\n\ndocument_properties.title=Właściwości dokumentu…\ndocument_properties_label=Właściwości dokumentu…\ndocument_properties_file_name=Nazwa pliku:\ndocument_properties_file_size=Rozmiar pliku:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} b)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} b)\ndocument_properties_title=Tytuł:\ndocument_properties_author=Autor:\ndocument_properties_subject=Temat:\ndocument_properties_keywords=Słowa kluczowe:\ndocument_properties_creation_date=Data utworzenia:\ndocument_properties_modification_date=Data modyfikacji:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Utworzony przez:\ndocument_properties_producer=PDF wyprodukowany przez:\ndocument_properties_version=Wersja PDF:\ndocument_properties_page_count=Liczba stron:\ndocument_properties_close=Zamknij\n\nprint_progress_message=Przygotowywanie dokumentu do druku…\nprint_progress_percent={{progress}}%\nprint_progress_close=Anuluj\n\ntoggle_sidebar.title=Przełączanie panelu bocznego\ntoggle_sidebar_notification.title=Przełączanie panelu bocznego (dokument zawiera konspekt/załączniki)\ntoggle_sidebar_label=Przełącz panel boczny\ndocument_outline.title=Wyświetlanie zarysu dokumentu (podwójne kliknięcie rozwija lub zwija wszystkie pozycje)\ndocument_outline_label=Zarys dokumentu\nattachments.title=Wyświetlanie załączników\nattachments_label=Załączniki\nthumbs.title=Wyświetlanie miniaturek\nthumbs_label=Miniaturki\nfindbar.title=Znajdź w dokumencie\nfindbar_label=Znajdź\n\nthumb_page_title=Strona {{page}}\nthumb_page_canvas=Miniaturka strony {{page}}\n\nfind_input.title=Wyszukiwanie\nfind_input.placeholder=Szukaj w dokumencie…\nfind_previous.title=Znajdź poprzednie wystąpienie tekstu\nfind_previous_label=Poprzednie\nfind_next.title=Znajdź następne wystąpienie tekstu\nfind_next_label=Następne\nfind_highlight=Podświetl wszystkie\nfind_match_case_label=Rozróżniaj wielkość znaków\nfind_reached_top=Osiągnięto początek dokumentu, kontynuacja od końca\nfind_reached_bottom=Osiągnięto koniec dokumentu, kontynuacja od początku\nfind_not_found=Tekst nieznaleziony\n\nerror_more_info=Więcej informacji\nerror_less_info=Mniej informacji\nerror_close=Zamknij\nerror_version_info=PDF.js v{{version}} (kompilacja: {{build}})\nerror_message=Wiadomość: {{message}}\nerror_stack=Stos: {{stack}}\nerror_file=Plik: {{file}}\nerror_line=Wiersz: {{line}}\nrendering_error=Podczas renderowania strony wystąpił błąd.\n\npage_scale_width=Szerokość strony\npage_scale_fit=Dopasowanie strony\npage_scale_auto=Skala automatyczna\npage_scale_actual=Rozmiar rzeczywisty\npage_scale_percent={{scale}}%\n\nloading_error_indicator=Błąd\nloading_error=Podczas wczytywania dokumentu PDF wystąpił błąd.\ninvalid_file_error=Nieprawidłowy lub uszkodzony plik PDF.\nmissing_file_error=Brak pliku PDF.\nunexpected_response_error=Nieoczekiwana odpowiedź serwera.\n\ntext_annotation_type.alt=[Adnotacja: {{type}}]\npassword_label=Wprowadź hasło, aby otworzyć ten dokument PDF.\npassword_invalid=Nieprawidłowe hasło. Proszę spróbować ponownie.\npassword_ok=OK\npassword_cancel=Anuluj\n\nprinting_not_supported=Ostrzeżenie: Drukowanie nie jest w pełni obsługiwane przez przeglądarkę.\nprinting_not_ready=Ostrzeżenie: Dokument PDF nie jest całkowicie wczytany, więc nie można go wydrukować.\nweb_fonts_disabled=Czcionki sieciowe są wyłączone: nie można użyć osadzonych czcionek PDF.\ndocument_colors_not_allowed=Dokumenty PDF nie mogą używać własnych kolorów: Opcja „Pozwalaj stronom stosować inne kolory” w przeglądarce jest nieaktywna.\n"
  },
  {
    "path": "pages/include/pdf/locale/pt-BR/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Próxima página\nnext_label=Próxima\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Página\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Reduzir\nzoom_out_label=Reduzir\nzoom_in.title=Ampliar\nzoom_in_label=Ampliar\nzoom.title=Zoom\npresentation_mode.title=Alternar para o modo de apresentação\npresentation_mode_label=Modo de apresentação\nopen_file.title=Abrir arquivo\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Download\ndownload_label=Download\nbookmark.title=Visualização atual (copiar ou abrir em uma nova janela)\nbookmark_label=Visualização atual\n\n# Secondary toolbar and context menu\ntools.title=Ferramentas\ntools_label=Ferramentas\nfirst_page.title=Ir para a primeira página\nfirst_page.label=Ir para a primeira página\nfirst_page_label=Ir para a primeira página\nlast_page.title=Ir para a última página\nlast_page.label=Ir para a última página\nlast_page_label=Ir para a última página\npage_rotate_cw.title=Girar no sentido horário\npage_rotate_cw.label=Girar no sentido horário\npage_rotate_cw_label=Girar no sentido horário\npage_rotate_ccw.title=Girar no sentido anti-horário\npage_rotate_ccw.label=Girar no sentido anti-horário\npage_rotate_ccw_label=Girar no sentido anti-horário\n\ncursor_text_select_tool.title=Habilitar a ferramenta de seleção de texto\ncursor_text_select_tool_label=Ferramenta de seleção de texto\ncursor_hand_tool.title=Habilitar ferramenta de mão\ncursor_hand_tool_label=Ferramenta de mão\n\n# Document properties dialog box\ndocument_properties.title=Propriedades do documento…\ndocument_properties_label=Propriedades do documento…\ndocument_properties_file_name=Nome do arquivo:\ndocument_properties_file_size=Tamanho do arquivo:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Assunto:\ndocument_properties_keywords=Palavras-chave:\ndocument_properties_creation_date=Data da criação:\ndocument_properties_modification_date=Data da modificação:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Criação:\ndocument_properties_producer=Criador do PDF:\ndocument_properties_version=Versão do PDF:\ndocument_properties_page_count=Número de páginas:\ndocument_properties_close=Fechar\n\nprint_progress_message=Preparando documento para impressão…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}} %\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Alternar painel\ntoggle_sidebar_notification.title=Alternar o painel (documento contém marcadores e anexos)\ntoggle_sidebar_label=Alternar painel\ndocument_outline.title=Mostrar a estrutura do documento (duplo-clique para expandir/recolher todos os ítens)\ndocument_outline_label=Estrutura do documento\nattachments.title=Mostrar anexos\nattachments_label=Anexos\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Localizar no documento\nfindbar_label=Localizar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura da página {{page}}\n\n# Find panel button title and messages\nfind_input.title=Localizar\nfind_input.placeholder=Localizar no documento…\nfind_previous.title=Localizar a ocorrência anterior da frase\nfind_previous_label=Anterior\nfind_next.title=Localizar a próxima ocorrência da frase\nfind_next_label=Próxima\nfind_highlight=Realçar tudo\nfind_match_case_label=Diferenciar maiúsculas/minúsculas\nfind_reached_top=Início do documento alcançado, continuando do fim\nfind_reached_bottom=Fim do documento alcançado, continuando do início\nfind_not_found=Frase não encontrada\n\n# Error panel labels\nerror_more_info=Mais informações\nerror_less_info=Menos informações\nerror_close=Fechar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (compilação: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensagem: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Pilha: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Arquivo: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linha: {{line}}\nrendering_error=Ocorreu um erro ao renderizar a página.\n\n# Predefined zoom values\npage_scale_width=Largura da página\npage_scale_fit=Ajustar à janela\npage_scale_auto=Zoom automático\npage_scale_actual=Tamanho real\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Erro\nloading_error=Ocorreu um erro ao carregar o PDF.\ninvalid_file_error=Arquivo PDF corrompido ou inválido.\nmissing_file_error=Arquivo PDF ausente.\nunexpected_response_error=Resposta inesperada do servidor.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotação {{type}}]\npassword_label=Forneça a senha para abrir este arquivo PDF.\npassword_invalid=Senha inválida. Por favor, tentar de novo.\npassword_ok=OK\npassword_cancel=Cancelar\n\nprinting_not_supported=Aviso: a impressão não é totalmente suportada neste navegador.\nprinting_not_ready=Aviso: o PDF não está totalmente carregado para impressão.\nweb_fonts_disabled=As fontes web estão desabilitadas: não foi possível usar fontes incorporadas do PDF.\ndocument_colors_not_allowed=Os documentos em PDF não estão autorizados a usar suas próprias cores: “Permitir que as páginas escolham suas próprias cores” está desabilitado no navegador.\n"
  },
  {
    "path": "pages/include/pdf/locale/pt-PT/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Página anterior\nprevious_label=Anterior\nnext.title=Página seguinte\nnext_label=Seguinte\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Página\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=de {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} de {{pagesCount}})\n\nzoom_out.title=Reduzir\nzoom_out_label=Reduzir\nzoom_in.title=Ampliar\nzoom_in_label=Ampliar\nzoom.title=Zoom\npresentation_mode.title=Trocar para o modo de apresentação\npresentation_mode_label=Modo de apresentação\nopen_file.title=Abrir ficheiro\nopen_file_label=Abrir\nprint.title=Imprimir\nprint_label=Imprimir\ndownload.title=Descarregar\ndownload_label=Descarregar\nbookmark.title=Visão atual (copiar ou abrir em nova janela)\nbookmark_label=Visão atual\n\n# Secondary toolbar and context menu\ntools.title=Ferramentas\ntools_label=Ferramentas\nfirst_page.title=Ir para a primeira página\nfirst_page.label=Ir para a primeira página\nfirst_page_label=Ir para a primeira página\nlast_page.title=Ir para a última página\nlast_page.label=Ir para a última página\nlast_page_label=Ir para a última página\npage_rotate_cw.title=Rodar à direita\npage_rotate_cw.label=Rodar à direita\npage_rotate_cw_label=Rodar à direita\npage_rotate_ccw.title=Rodar à esquerda\npage_rotate_ccw.label=Rodar à esquerda\npage_rotate_ccw_label=Rodar à esquerda\n\ncursor_text_select_tool.title=Ativar ferramenta de seleção de texto\ncursor_text_select_tool_label=Ferramenta de seleção de texto\ncursor_hand_tool.title=Ativar ferramenta de mão\ncursor_hand_tool_label=Ferramenta de mão\n\n# Document properties dialog box\ndocument_properties.title=Propriedades do documento…\ndocument_properties_label=Propriedades do documento…\ndocument_properties_file_name=Nome do ficheiro:\ndocument_properties_file_size=Tamanho do ficheiro:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Título:\ndocument_properties_author=Autor:\ndocument_properties_subject=Assunto:\ndocument_properties_keywords=Palavras-chave:\ndocument_properties_creation_date=Data de criação:\ndocument_properties_modification_date=Data de modificação:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Criador:\ndocument_properties_producer=Produtor de PDF:\ndocument_properties_version=Versão do PDF:\ndocument_properties_page_count=N.º de páginas:\ndocument_properties_close=Fechar\n\nprint_progress_message=A preparar o documento para impressão…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Cancelar\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Alternar barra lateral\ntoggle_sidebar_notification.title=Alternar barra lateral (documento contém contorno/anexos)\ntoggle_sidebar_label=Alternar barra lateral\ndocument_outline.title=Mostrar esquema do documento (duplo clique para expandir/colapsar todos os itens)\ndocument_outline_label=Estrutura do documento\nattachments.title=Mostrar anexos\nattachments_label=Anexos\nthumbs.title=Mostrar miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Localizar no documento\nfindbar_label=Localizar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Página {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura da página {{page}}\n\n# Find panel button title and messages\nfind_input.title=Localizar\nfind_input.placeholder=Localizar no documento…\nfind_previous.title=Localizar ocorrência anterior da frase\nfind_previous_label=Anterior\nfind_next.title=Localizar ocorrência seguinte da frase\nfind_next_label=Seguinte\nfind_highlight=Destacar tudo\nfind_match_case_label=Correspondência\nfind_reached_top=Topo do documento atingido, a continuar a partir do fundo\nfind_reached_bottom=Fim do documento atingido, a continuar a partir do topo\nfind_not_found=Frase não encontrada\n\n# Error panel labels\nerror_more_info=Mais informação\nerror_less_info=Menos informação\nerror_close=Fechar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (compilação: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensagem: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ficheiro: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linha: {{line}}\nrendering_error=Ocorreu um erro ao processar a página.\n\n# Predefined zoom values\npage_scale_width=Ajustar à largura\npage_scale_fit=Ajustar à página\npage_scale_auto=Zoom automático\npage_scale_actual=Tamanho real\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Erro\nloading_error=Ocorreu um erro ao carregar o PDF.\ninvalid_file_error=Ficheiro PDF inválido ou danificado.\nmissing_file_error=Ficheiro PDF inexistente.\nunexpected_response_error=Resposta inesperada do servidor.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotação {{type}}]\npassword_label=Digite a palavra-passe para abrir este ficheiro PDF.\npassword_invalid=Palavra-passe inválida. Por favor, tente novamente.\npassword_ok=OK\npassword_cancel=Cancelar\n\nprinting_not_supported=Aviso: a impressão não é totalmente suportada por este navegador.\nprinting_not_ready=Aviso: o PDF ainda não está totalmente carregado.\nweb_fonts_disabled=Os tipos de letra web estão desativados: não é possível utilizar os tipos de letra PDF incorporados.\ndocument_colors_not_allowed=Os documentos PDF não permitem a utilização das suas próprias cores: “Permitir às páginas escolher as suas próprias cores” está desativado no navegador.\n"
  },
  {
    "path": "pages/include/pdf/locale/rm/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pagina precedenta\nprevious_label=Enavos\nnext.title=Proxima pagina\nnext_label=Enavant\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pagina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=da {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} da {{pagesCount}})\n\nzoom_out.title=Empitschnir\nzoom_out_label=Empitschnir\nzoom_in.title=Engrondir\nzoom_in_label=Engrondir\nzoom.title=Zoom\npresentation_mode.title=Midar en il modus da preschentaziun\npresentation_mode_label=Modus da preschentaziun\nopen_file.title=Avrir datoteca\nopen_file_label=Avrir\nprint.title=Stampar\nprint_label=Stampar\ndownload.title=Telechargiar\ndownload_label=Telechargiar\nbookmark.title=Vista actuala (copiar u avrir en ina nova fanestra)\nbookmark_label=Vista actuala\n\n# Secondary toolbar and context menu\ntools.title=Utensils\ntools_label=Utensils\nfirst_page.title=Siglir a l'emprima pagina\nfirst_page.label=Siglir a l'emprima pagina\nfirst_page_label=Siglir a l'emprima pagina\nlast_page.title=Siglir a la davosa pagina\nlast_page.label=Siglir a la davosa pagina\nlast_page_label=Siglir a la davosa pagina\npage_rotate_cw.title=Rotar en direcziun da l'ura\npage_rotate_cw.label=Rotar en direcziun da l'ura\npage_rotate_cw_label=Rotar en direcziun da l'ura\npage_rotate_ccw.title=Rotar en direcziun cuntraria a l'ura\npage_rotate_ccw.label=Rotar en direcziun cuntraria a l'ura\npage_rotate_ccw_label=Rotar en direcziun cuntraria a l'ura\n\ncursor_text_select_tool.title=Activar l'utensil per selecziunar text\ncursor_text_select_tool_label=Utensil per selecziunar text\ncursor_hand_tool.title=Activar l'utensil da maun\ncursor_hand_tool_label=Utensil da maun\n\n# Document properties dialog box\ndocument_properties.title=Caracteristicas dal document…\ndocument_properties_label=Caracteristicas dal document…\ndocument_properties_file_name=Num da la datoteca:\ndocument_properties_file_size=Grondezza da la datoteca:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=Titel:\ndocument_properties_author=Autur:\ndocument_properties_subject=Tema:\ndocument_properties_keywords=Chavazzins:\ndocument_properties_creation_date=Data da creaziun:\ndocument_properties_modification_date=Data da modificaziun:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}} {{time}}\ndocument_properties_creator=Creà da:\ndocument_properties_producer=Creà il PDF cun:\ndocument_properties_version=Versiun da PDF:\ndocument_properties_page_count=Dumber da paginas:\ndocument_properties_close=Serrar\n\nprint_progress_message=Preparar il document per stampar…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Interrumper\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Activar/deactivar la trav laterala\ntoggle_sidebar_notification.title=Activar/deactivar la trav laterala (structura dal document/agiuntas)\ntoggle_sidebar_label=Activar/deactivar la trav laterala\ndocument_outline.title=Mussar la structura dal document (cliccar duas giadas per extender/cumprimer tut ils elements)\ndocument_outline_label=Structura dal document\nattachments.title=Mussar agiuntas\nattachments_label=Agiuntas\nthumbs.title=Mussar las miniaturas\nthumbs_label=Miniaturas\nfindbar.title=Tschertgar en il document\nfindbar_label=Tschertgar\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura da la pagina {{page}}\n\n# Find panel button title and messages\nfind_input.title=Tschertgar\nfind_input.placeholder=Tschertgar en il document…\nfind_previous.title=Tschertgar la posiziun precedenta da l'expressiun\nfind_previous_label=Enavos\nfind_next.title=Tschertgar la proxima posiziun da l'expressiun\nfind_next_label=Enavant\nfind_highlight=Relevar tuts\nfind_match_case_label=Resguardar maiusclas/minusclas\nfind_reached_top=Il cumenzament dal document è cuntanschì, la tschertga cuntinuescha a la fin dal document\nfind_reached_bottom=La fin dal document è cuntanschì, la tschertga cuntinuescha al cumenzament dal document\nfind_not_found=Impussibel da chattar l'expressiun\n\n# Error panel labels\nerror_more_info=Dapli infurmaziuns\nerror_less_info=Damain infurmaziuns\nerror_close=Serrar\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Messadi: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Datoteca: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Lingia: {{line}}\nrendering_error=Ina errur è cumparida cun visualisar questa pagina.\n\n# Predefined zoom values\npage_scale_width=Ladezza da la pagina\npage_scale_fit=Entira pagina\npage_scale_auto=Zoom automatic\npage_scale_actual=Grondezza actuala\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Errur\nloading_error=Ina errur è cumparida cun chargiar il PDF.\ninvalid_file_error=Datoteca PDF nunvalida u donnegiada.\nmissing_file_error=Datoteca PDF manconta.\nunexpected_response_error=Resposta nunspetgada dal server.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Annotaziun da {{type}}]\npassword_label=Endatescha il pled-clav per avrir questa datoteca da PDF.\npassword_invalid=Pled-clav nunvalid. Emprova anc ina giada.\npassword_ok=OK\npassword_cancel=Interrumper\n\nprinting_not_supported=Attenziun: Il stampar na funcziunescha anc betg dal tut en quest navigatur.\nprinting_not_ready=Attenziun: Il PDF n'è betg chargià cumplettamain per stampar.\nweb_fonts_disabled=Scrittiras dal web èn deactivadas: impussibel dad utilisar las scrittiras integradas en il PDF.\ndocument_colors_not_allowed=Documents da PDF na dastgan betg duvrar las atgnas colurs: 'Permetter a paginas da tscherner lur atgna colur' è deactivà en il navigatur.\n"
  },
  {
    "path": "pages/include/pdf/locale/ro/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Pagina precedentă\nprevious_label=Înapoi\nnext.title=Pagina următoare\nnext_label=Înainte\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Pagina\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=din {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} din {{pagesCount}})\n\nzoom_out.title=Micșorează\nzoom_out_label=Micșorează\nzoom_in.title=Mărește\nzoom_in_label=Mărește\nzoom.title=Zoom\npresentation_mode.title=Schimbă la modul de prezentare\npresentation_mode_label=Mod de prezentare\nopen_file.title=Deschide un fișier\nopen_file_label=Deschide\nprint.title=Tipărește\nprint_label=Tipărește\ndownload.title=Descarcă\ndownload_label=Descarcă\nbookmark.title=Vizualizare actuală (copiați sau deschideți într-o fereastră nouă)\nbookmark_label=Vizualizare actuală\n\n# Secondary toolbar and context menu\ntools.title=Unelte\ntools_label=Unelte\nfirst_page.title=Mergi la prima pagină\nfirst_page.label=Mergi la prima pagină\nfirst_page_label=Mergi la prima pagină\nlast_page.title=Mergi la ultima pagină\nlast_page.label=Mergi la ultima pagină\nlast_page_label=Mergi la ultima pagină\npage_rotate_cw.title=Rotește în sensul acelor de ceasornic\npage_rotate_cw.label=Rotește în sensul acelor de ceasornic\npage_rotate_cw_label=Rotește în sensul acelor de ceasornic\npage_rotate_ccw.title=Rotește în sens invers al acelor de ceasornic\npage_rotate_ccw.label=Rotește în sens invers al acelor de ceasornic\npage_rotate_ccw_label=Rotește în sens invers al acelor de ceasornic\n\n\n# Document properties dialog box\ndocument_properties.title=Proprietățile documentului…\ndocument_properties_label=Proprietățile documentului…\ndocument_properties_file_name=Numele fișierului:\ndocument_properties_file_size=Dimensiunea fișierului:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} byți)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byți)\ndocument_properties_title=Titlu:\ndocument_properties_author=Autor:\ndocument_properties_subject=Subiect:\ndocument_properties_keywords=Cuvinte cheie:\ndocument_properties_creation_date=Data creării:\ndocument_properties_modification_date=Data modificării:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Autor:\ndocument_properties_producer=Producător PDF:\ndocument_properties_version=Versiune PDF:\ndocument_properties_page_count=Număr de pagini:\ndocument_properties_close=Închide\n\nprint_progress_message=Se pregătește documentul pentru imprimare…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Renunță\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Comută bara laterală\ntoggle_sidebar_notification.title=Comută bara laterală (documentul conține schițe/atașamente)\ntoggle_sidebar_label=Comută bara laterală\ndocument_outline.title=Arată schița documentului (dublu-clic pentru a expanda/colapsa toate elementele\ndocument_outline_label=Schiță document\nattachments.title=Afișează atașamentele\nattachments_label=Atașamente\nthumbs.title=Arată miniaturi\nthumbs_label=Miniaturi\nfindbar.title=Găsește în document\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pagina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatura paginii {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Găsește instanța anterioară în frază\nfind_previous_label=Anterior\nfind_next.title=Găsește instanța următoare în frază\nfind_next_label=Următor\nfind_highlight=Evidențiază aparițiile\nfind_match_case_label=Potrivește literele mari și mici\nfind_reached_top=Am ajuns la începutul documentului, continuă de la sfârșit\nfind_reached_bottom=Am ajuns la sfârșitul documentului, continuă de la început\nfind_not_found=Nu s-a găsit textul\n\n# Error panel labels\nerror_more_info=Mai multe informații\nerror_less_info=Mai puține informații\nerror_close=Închide\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (varianta: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesaj: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stivă: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fișier: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linie: {{line}}\nrendering_error=A intervenit o eroare la afișarea paginii.\n\n# Predefined zoom values\npage_scale_width=Lățime pagină\npage_scale_fit=Potrivire la pagină\npage_scale_auto=Zoom automat\npage_scale_actual=Dimensiune reală\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Eroare\nloading_error=A intervenit o eroare la încărcarea fișierului PDF.\ninvalid_file_error=Fișier PDF invalid sau deteriorat.\nmissing_file_error=Fișier PDF lipsă.\nunexpected_response_error=Răspuns neașteptat de la server.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Adnotare]\npassword_label=Introduceți parola pentru a deschide acest fișier PDF.\npassword_invalid=Parolă greșită. Vă rugăm să încercați din nou.\npassword_ok=Ok\npassword_cancel=Renunță\n\nprinting_not_supported=Avertisment: Tipărirea nu este suportată în totalitate de acest browser.\nprinting_not_ready=Avertisment: Fișierul PDF nu este încărcat complet pentru tipărire.\nweb_fonts_disabled=Fonturile web sunt dezactivate: nu pot utiliza fonturile PDF încorporate.\ndocument_colors_not_allowed=Documentele PDF nu sunt autorizate să folosească propriile culori: 'Permite paginilor să aleagă propriile culori' este dezactivată în browser.\n"
  },
  {
    "path": "pages/include/pdf/locale/ru/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Предыдущая страница\nprevious_label=Предыдущая\nnext.title=Следующая страница\nnext_label=Следующая\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Страница\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=из {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} из {{pagesCount}})\n\nzoom_out.title=Уменьшить\nzoom_out_label=Уменьшить\nzoom_in.title=Увеличить\nzoom_in_label=Увеличить\nzoom.title=Масштаб\npresentation_mode.title=Перейти в режим презентации\npresentation_mode_label=Режим презентации\nopen_file.title=Открыть файл\nopen_file_label=Открыть\nprint.title=Печать\nprint_label=Печать\ndownload.title=Загрузить\ndownload_label=Загрузить\nbookmark.title=Ссылка на текущий вид (скопировать или открыть в новом окне)\nbookmark_label=Текущий вид\n\n# Secondary toolbar and context menu\ntools.title=Инструменты\ntools_label=Инструменты\nfirst_page.title=Перейти на первую страницу\nfirst_page.label=Перейти на первую страницу\nfirst_page_label=Перейти на первую страницу\nlast_page.title=Перейти на последнюю страницу\nlast_page.label=Перейти на последнюю страницу\nlast_page_label=Перейти на последнюю страницу\npage_rotate_cw.title=Повернуть по часовой стрелке\npage_rotate_cw.label=Повернуть по часовой стрелке\npage_rotate_cw_label=Повернуть по часовой стрелке\npage_rotate_ccw.title=Повернуть против часовой стрелки\npage_rotate_ccw.label=Повернуть против часовой стрелки\npage_rotate_ccw_label=Повернуть против часовой стрелки\n\ncursor_text_select_tool.title=Включить Инструмент «Выделение текста»\ncursor_text_select_tool_label=Инструмент «Выделение текста»\ncursor_hand_tool.title=Включить Инструмент «Рука»\ncursor_hand_tool_label=Инструмент «Рука»\n\n# Document properties dialog box\ndocument_properties.title=Свойства документа…\ndocument_properties_label=Свойства документа…\ndocument_properties_file_name=Имя файла:\ndocument_properties_file_size=Размер файла:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} байт)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} байт)\ndocument_properties_title=Заголовок:\ndocument_properties_author=Автор:\ndocument_properties_subject=Тема:\ndocument_properties_keywords=Ключевые слова:\ndocument_properties_creation_date=Дата создания:\ndocument_properties_modification_date=Дата изменения:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Приложение:\ndocument_properties_producer=Производитель PDF:\ndocument_properties_version=Версия PDF:\ndocument_properties_page_count=Число страниц:\ndocument_properties_close=Закрыть\n\nprint_progress_message=Подготовка документа к печати…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Отмена\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Показать/скрыть боковую панель\ntoggle_sidebar_notification.title=Показать/скрыть боковую панель (документ имеет содержание/вложения)\ntoggle_sidebar_label=Показать/скрыть боковую панель\ndocument_outline.title=Показать содержание документа (двойной щелчок, чтобы развернуть/свернуть все элементы)\ndocument_outline_label=Содержание документа\nattachments.title=Показать вложения\nattachments_label=Вложения\nthumbs.title=Показать миниатюры\nthumbs_label=Миниатюры\nfindbar.title=Найти в документе\nfindbar_label=Найти\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Страница {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Миниатюра страницы {{page}}\n\n# Find panel button title and messages\nfind_input.title=Найти\nfind_input.placeholder=Найти в документе…\nfind_previous.title=Найти предыдущее вхождение фразы в текст\nfind_previous_label=Назад\nfind_next.title=Найти следующее вхождение фразы в текст\nfind_next_label=Далее\nfind_highlight=Подсветить все\nfind_match_case_label=С учётом регистра\nfind_reached_top=Достигнут верх документа, продолжено снизу\nfind_reached_bottom=Достигнут конец документа, продолжено сверху\nfind_not_found=Фраза не найдена\n\n# Error panel labels\nerror_more_info=Детали\nerror_less_info=Скрыть детали\nerror_close=Закрыть\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (сборка: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Сообщение: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стeк: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Строка: {{line}}\nrendering_error=При создании страницы произошла ошибка.\n\n# Predefined zoom values\npage_scale_width=По ширине страницы\npage_scale_fit=По размеру страницы\npage_scale_auto=Автоматически\npage_scale_actual=Реальный размер\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Ошибка\nloading_error=При загрузке PDF произошла ошибка.\ninvalid_file_error=Некорректный или повреждённый PDF-файл.\nmissing_file_error=PDF-файл отсутствует.\nunexpected_response_error=Неожиданный ответ сервера.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Аннотация {{type}}]\npassword_label=Введите пароль, чтобы открыть этот PDF-файл.\npassword_invalid=Неверный пароль. Пожалуйста, попробуйте снова.\npassword_ok=OK\npassword_cancel=Отмена\n\nprinting_not_supported=Предупреждение: В этом браузере не полностью поддерживается печать.\nprinting_not_ready=Предупреждение: PDF не полностью загружен для печати.\nweb_fonts_disabled=Веб-шрифты отключены: невозможно использовать встроенные PDF-шрифты.\ndocument_colors_not_allowed=PDF-документам не разрешено использовать свои цвета: в браузере отключён параметр «Разрешить веб-сайтам использовать свои цвета».\n"
  },
  {
    "path": "pages/include/pdf/locale/rw/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom.title=Ihindurangano\nopen_file.title=Gufungura Dosiye\nopen_file_label=Gufungura\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Umutwe:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\n\n# Find panel button title and messages\nfind_previous.title=Gushaka aho uyu murongo ugaruka mbere y'aha\nfind_next.title=Gushaka aho uyu murongo wongera kugaruka\nfind_not_found=Umurongo ntubonetse\n\n# Error panel labels\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\n\n# Predefined zoom values\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Ikosa\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_invalid=Ijambo ry'ibanga ridahari. Wakongera ukagerageza\npassword_ok=YEGO\n\n"
  },
  {
    "path": "pages/include/pdf/locale/sah/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Инники сирэй\nprevious_label=Иннинээҕи\nnext.title=Аныгыскы сирэй\nnext_label=Аныгыскы\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Куччат\nzoom_out_label=Куччат\nzoom_in.title=Улаатыннар\nzoom_in_label=Улаатыннар\nzoom.title=Улаатыннар\npresentation_mode.title=Көрдөрөр эрэсиимҥэ\npresentation_mode_label=Көрдөрөр эрэсиим\nopen_file.title=Билэни арый\nopen_file_label=Ас\nprint.title=Бэчээт\nprint_label=Бэчээт\ndownload.title=Хачайдааһын\ndownload_label=Хачайдааһын\nbookmark.title=Билиҥҥи көстүүтэ (хатылаа эбэтэр саҥа түннүккэ арый)\nbookmark_label=Билиҥҥи көстүүтэ\n\n# Secondary toolbar and context menu\ntools.title=Тэриллэр\ntools_label=Тэриллэр\nfirst_page.title=Бастакы сирэйгэ көс\nfirst_page.label=Бастакы сирэйгэ көс\nfirst_page_label=Бастакы сирэйгэ көс\nlast_page.title=Тиһэх сирэйгэ көс\nlast_page.label=Тиһэх сирэйгэ көс\nlast_page_label=Тиһэх сирэйгэ көс\npage_rotate_cw.title=Чаһы хоту эргит\npage_rotate_cw.label=Чаһы хоту эргит\npage_rotate_cw_label=Чаһы хоту эргит\npage_rotate_ccw.title=Чаһы утары эргит\npage_rotate_ccw.label=Чаһы утары эргит\npage_rotate_ccw_label=Чаһы утары эргит\n\n\n# Document properties dialog box\ndocument_properties.title=Докумуон туруоруулара...\ndocument_properties_label=Докумуон туруоруулара...\\u0020\ndocument_properties_file_name=Билэ аата:\ndocument_properties_file_size=Билэ кээмэйэ:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} баайт)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} баайт)\ndocument_properties_title=Баһа:\ndocument_properties_author=Ааптар:\ndocument_properties_subject=Тиэмэ:\ndocument_properties_keywords=Күлүүс тыл:\ndocument_properties_creation_date=Оҥоһуллубут кэмэ:\ndocument_properties_modification_date=Уларытыллыбыт кэмэ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_producer=PDF оҥорооччу:\ndocument_properties_version=PDF барыла:\ndocument_properties_page_count=Сирэй ахсаана:\ndocument_properties_close=Сап\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Ойоҕос хапталы арый/сап\ntoggle_sidebar_label=Ойоҕос хапталы арый/сап\ndocument_outline_label=Дөкүмүөн иһинээҕитэ\nattachments.title=Кыбытыктары көрдөр\nattachments_label=Кыбытык\nthumbs.title=Ойуучааннары көрдөр\nthumbs_label=Ойуучааннар\nfindbar.title=Дөкүмүөнтэн бул\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Сирэй {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Сирэй ойуучаана {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Этии тиэкискэ бу иннинээҕи киириитин бул\nfind_previous_label=Иннинээҕи\nfind_next.title=Этии тиэкискэ бу кэннинээҕи киириитин бул\nfind_next_label=Аныгыскы\nfind_highlight=Барытын сырдатан көрдөр\nfind_match_case_label=Буукуба улаханын-кыратын араар\nfind_reached_top=Сирэй үрдүгэр тиийдиҥ, салгыыта аллара\nfind_reached_bottom=Сирэй бүттэ, үөһэ салҕанна\nfind_not_found=Этии көстүбэтэ\n\n# Error panel labels\nerror_more_info=Сиһилии\nerror_less_info=Сиһилиитин кистээ\nerror_close=Сап\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (хомуйуута: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Этии: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стeк: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Билэ: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Устуруока: {{line}}\nrendering_error=Сирэйи айарга алҕас таҕыста.\n\n# Predefined zoom values\npage_scale_width=Сирэй кэтитинэн\npage_scale_fit=Сирэй кээмэйинэн\npage_scale_auto=Аптамаатынан\npage_scale_actual=Дьиҥнээх кээмэйэ\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Алҕас\nloading_error=PDF-билэни хачайдыырга алҕас таҕыста.\ninvalid_file_error=Туох эрэ алҕастаах эбэтэр алдьаммыт PDF-билэ.\nmissing_file_error=PDF-билэ суох.\nunexpected_response_error=Сиэрбэр хоруйдаабат.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} туһунан]\npassword_label=Бу PDF-билэни арыйарга көмүскэл тылы киллэриэхтээхин.\npassword_invalid=Киирии тыл алҕастаах. Бука диэн, хатылаан көр.\npassword_ok=СӨП\n\nprinting_not_supported=Сэрэтии: Бу браузер бэчээттиири толору өйөөбөт.\nprinting_not_ready=Сэрэтии: PDF бэчээттииргэ толору хачайдана илик.\nweb_fonts_disabled=Ситим-бичиктэр араарыллыахтара: PDF бичиктэрэ кыайан көстүбэттэр.\ndocument_colors_not_allowed=PDF-дөкүмүөүннэргэ бэйэлэрин өҥнөрүн туттар көҥүллэммэтэ: \"Ситим-сирдэр бэйэлэрин өҥнөрүн тутталларын көҥүллүүргэ\" диэн браузерга арахса сылдьар эбит.\n"
  },
  {
    "path": "pages/include/pdf/locale/si/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=මීට පෙර පිටුව\nprevious_label=පෙර\nnext.title=මීළඟ පිටුව\nnext_label=මීළඟ\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=පිටුව\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=කුඩා කරන්න\nzoom_out_label=කුඩා කරන්න\nzoom_in.title=විශාල කරන්න\nzoom_in_label=විශාල කරන්න\nzoom.title=විශාලණය\npresentation_mode.title=ඉදිරිපත්කිරීම් ප්‍රකාරය වෙත මාරුවන්න\npresentation_mode_label=ඉදිරිපත්කිරීම් ප්‍රකාරය\nopen_file.title=ගොනුව විවෘත කරන්න\nopen_file_label=විවෘත කරන්න\nprint.title=මුද්‍රණය\nprint_label=මුද්‍රණය\ndownload.title=බාගන්න\ndownload_label=බාගන්න\nbookmark.title=දැනට ඇති දසුන (පිටපත් කරන්න හෝ නව කවුළුවක විවෘත කරන්න)\nbookmark_label=දැනට ඇති දසුන\n\n# Secondary toolbar and context menu\ntools.title=මෙවලම්\ntools_label=මෙවලම්\nfirst_page.title=මුල් පිටුවට යන්න\nfirst_page.label=මුල් පිටුවට යන්න\nfirst_page_label=මුල් පිටුවට යන්න\nlast_page.title=අවසන් පිටුවට යන්න\nlast_page.label=අවසන් පිටුවට යන්න\nlast_page_label=අවසන් පිටුවට යන්න\npage_rotate_cw.title=දක්ශිණාවර්තව භ්‍රමණය\npage_rotate_cw.label=දක්ශිණාවර්තව භ්‍රමණය\npage_rotate_cw_label=දක්ශිණාවර්තව භ්‍රමණය\npage_rotate_ccw.title=වාමාවර්තව භ්‍රමණය\npage_rotate_ccw.label=වාමාවර්තව භ්‍රමණය\npage_rotate_ccw_label=වාමාවර්තව භ්‍රමණය\n\n\n# Document properties dialog box\ndocument_properties.title=ලේඛන වත්කම්...\ndocument_properties_label=ලේඛන වත්කම්...\ndocument_properties_file_name=ගොනු නම:\ndocument_properties_file_size=ගොනු ප්‍රමාණය:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} බයිට)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} බයිට)\ndocument_properties_title=සිරස්තලය:\ndocument_properties_author=කතෲ\ndocument_properties_subject=මාතෘකාව:\ndocument_properties_keywords=යතුරු වදන්:\ndocument_properties_creation_date=නිර්මිත දිනය:\ndocument_properties_modification_date=වෙනස්කල දිනය:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=නිර්මාපක:\ndocument_properties_producer=PDF නිශ්පාදක:\ndocument_properties_version=PDF නිකුතුව:\ndocument_properties_page_count=පිටු ගණන:\ndocument_properties_close=වසන්න\n\nprint_progress_message=ලේඛනය මුද්‍රණය සඳහා සූදානම් කරමින්…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_close=අවලංගු කරන්න\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=පැති තීරුවට මාරුවන්න\ntoggle_sidebar_label=පැති තීරුවට මාරුවන්න\nattachments.title=ඇමිණුම් පෙන්වන්න\nattachments_label=ඇමිණුම්\nthumbs.title=සිඟිති රූ පෙන්වන්න\nthumbs_label=සිඟිති රූ\nfindbar.title=ලේඛනය තුළ සොයන්න\nfindbar_label=සොයන්න\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=පිටුව {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=පිටුවෙ සිඟිත රූව {{page}}\n\n# Find panel button title and messages\nfind_previous.title=මේ වාක්‍ය ඛණ්ඩය මීට පෙර යෙදුණු ස්ථානය සොයන්න\nfind_previous_label=පෙර:\nfind_next.title=මේ වාක්‍ය ඛණ්ඩය මීළඟට යෙදෙන ස්ථානය සොයන්න\nfind_next_label=මීළඟ\nfind_highlight=සියල්ල උද්දීපනය\nfind_match_case_label=අකුරු ගළපන්න\nfind_reached_top=පිටුවේ ඉහළ කෙළවරට ලගාවිය, පහළ සිට ඉදිරියට යමින්\nfind_reached_bottom=පිටුවේ පහළ කෙළවරට ලගාවිය, ඉහළ සිට ඉදිරියට යමින්\nfind_not_found=ඔබ සෙව් වචන හමු නොවීය\n\n# Error panel labels\nerror_more_info=බොහෝ තොරතුරු\nerror_less_info=අවම තොරතුරු\nerror_close=වසන්න\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (නිකුතුව: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=පණිවිඩය: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ගොනුව: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=පේළිය: {{line}}\nrendering_error=පිටුව රෙන්ඩර් විමේදි ගැටලුවක් හට ගැනුණි.\n\n# Predefined zoom values\npage_scale_width=පිටුවේ පළල\npage_scale_fit=පිටුවට සුදුසු ලෙස\npage_scale_auto=ස්වයංක්‍රීය විශාලණය\npage_scale_actual=නියමිත ප්‍රමාණය\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=දෝෂය\nloading_error=PDF පූරණය විමේදි දෝෂයක් හට ගැනුණි.\ninvalid_file_error=දූශිත හෝ සාවද්‍ය PDF ගොනුව.\nmissing_file_error=නැතිවූ PDF ගොනුව.\nunexpected_response_error=බලාපොරොත්තු නොවූ සේවාදායක ප්‍රතිචාරය.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} විස්තරය]\npassword_label=මෙම PDF ගොනුව විවෘත කිරීමට මුරපදය ඇතුළත් කරන්න.\npassword_invalid=වැරදි මුරපදයක්. කරුණාකර නැවත උත්සහ කරන්න.\npassword_ok=හරි\npassword_cancel=එපා\n\nprinting_not_supported=අවවාදයයි: මෙම ගවේශකය මුද්‍රණය සඳහා සම්පූර්ණයෙන් සහය නොදක්වයි.\nprinting_not_ready=අවවාදයයි: මුද්‍රණය සඳහා PDF සම්පූර්ණයෙන් පූර්ණය වී නොමැත.\nweb_fonts_disabled=ජාල අකුරු අක්‍රීයයි: තිළැලි PDF අකුරු භාවිත කළ නොහැක.\n"
  },
  {
    "path": "pages/include/pdf/locale/sk/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Predchádzajúca strana\nprevious_label=Predchádzajúca\nnext.title=Nasledujúca strana\nnext_label=Nasledujúca\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Strana\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=z {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} z {{pagesCount}})\n\nzoom_out.title=Vzdialiť\nzoom_out_label=Vzdialiť\nzoom_in.title=Priblížiť\nzoom_in_label=Priblížiť\nzoom.title=Lupa\npresentation_mode.title=Prepnúť na režim Prezentácia\npresentation_mode_label=Režim Prezentácia\nopen_file.title=Otvoriť súbor\nopen_file_label=Otvoriť\nprint.title=Tlačiť\nprint_label=Tlačiť\ndownload.title=Prevziať\ndownload_label=Prevziať\nbookmark.title=Aktuálne zobrazenie (kopírovať alebo otvoriť v novom okne)\nbookmark_label=Aktuálne zobrazenie\n\n# Secondary toolbar and context menu\ntools.title=Nástroje\ntools_label=Nástroje\nfirst_page.title=Prejsť na prvú stranu\nfirst_page.label=Prejsť na prvú stranu\nfirst_page_label=Prejsť na prvú stranu\nlast_page.title=Prejsť na poslednú stranu\nlast_page.label=Prejsť na poslednú stranu\nlast_page_label=Prejsť na poslednú stranu\npage_rotate_cw.title=Otočiť v smere hodinových ručičiek\npage_rotate_cw.label=Otočiť v smere hodinových ručičiek\npage_rotate_cw_label=Otočiť v smere hodinových ručičiek\npage_rotate_ccw.title=Otočiť proti smeru hodinových ručičiek\npage_rotate_ccw.label=Otočiť proti smeru hodinových ručičiek\npage_rotate_ccw_label=Otočiť proti smeru hodinových ručičiek\n\ncursor_text_select_tool.title=Povoliť výber textu\ncursor_text_select_tool_label=Výber textu\ncursor_hand_tool.title=Povoliť nástroj ruka\ncursor_hand_tool_label=Nástroj ruka\n\n# Document properties dialog box\ndocument_properties.title=Vlastnosti dokumentu…\ndocument_properties_label=Vlastnosti dokumentu…\ndocument_properties_file_name=Názov súboru:\ndocument_properties_file_size=Veľkosť súboru:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kB ({{size_b}} bajtov)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajtov)\ndocument_properties_title=Názov:\ndocument_properties_author=Autor:\ndocument_properties_subject=Predmet:\ndocument_properties_keywords=Kľúčové slová:\ndocument_properties_creation_date=Dátum vytvorenia:\ndocument_properties_modification_date=Dátum úpravy:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Vytvoril:\ndocument_properties_producer=Tvorca PDF:\ndocument_properties_version=Verzia PDF:\ndocument_properties_page_count=Počet strán:\ndocument_properties_close=Zavrieť\n\nprint_progress_message=Príprava dokumentu na tlač…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Zrušiť\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Prepnúť bočný panel\ntoggle_sidebar_notification.title=Prepnúť bočný panel (dokument obsahuje osnovu/prílohy)\ntoggle_sidebar_label=Prepnúť bočný panel\ndocument_outline.title=Zobraziť prehľad dokumentu (dvojitým kliknutím rozbalíte/zbalíte všetky položky)\ndocument_outline_label=Prehľad dokumentu\nattachments.title=Zobraziť prílohy\nattachments_label=Prílohy\nthumbs.title=Zobraziť miniatúry\nthumbs_label=Miniatúry\nfindbar.title=Hľadať v dokumente\nfindbar_label=Hľadať\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Strana {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatúra strany {{page}}\n\n# Find panel button title and messages\nfind_input.title=Hľadať\nfind_input.placeholder=Hľadať v dokumente…\nfind_previous.title=Vyhľadať predchádzajúci výskyt reťazca\nfind_previous_label=Predchádzajúce\nfind_next.title=Vyhľadať ďalší výskyt reťazca\nfind_next_label=Ďalšie\nfind_highlight=Zvýrazniť všetky\nfind_match_case_label=Rozlišovať malé/veľké písmená\nfind_reached_top=Bol dosiahnutý začiatok stránky, pokračuje sa od konca\nfind_reached_bottom=Bol dosiahnutý koniec stránky, pokračuje sa od začiatku\nfind_not_found=Výraz nebol nájdený\n\n# Error panel labels\nerror_more_info=Viac informácií\nerror_less_info=Menej informácií\nerror_close=Zavrieť\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (zostavenie: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Správa: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Zásobník: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Súbor: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Riadok: {{line}}\nrendering_error=Pri vykresľovaní stránky sa vyskytla chyba.\n\n# Predefined zoom values\npage_scale_width=Na šírku strany\npage_scale_fit=Na veľkosť strany\npage_scale_auto=Automatická veľkosť\npage_scale_actual=Skutočná veľkosť\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Chyba\nloading_error=Počas načítavania dokumentu PDF sa vyskytla chyba.\ninvalid_file_error=Neplatný alebo poškodený súbor PDF.\nmissing_file_error=Chýbajúci súbor PDF.\nunexpected_response_error=Neočakávaná odpoveď zo servera.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Anotácia typu {{type}}]\npassword_label=Ak chcete otvoriť tento súbor PDF, zadajte jeho heslo.\npassword_invalid=Heslo nie je platné. Skúste to znova.\npassword_ok=OK\npassword_cancel=Zrušiť\n\nprinting_not_supported=Upozornenie: tlač nie je v tomto prehliadači plne podporovaná.\nprinting_not_ready=Upozornenie: súbor PDF nie je plne načítaný pre tlač.\nweb_fonts_disabled=Webové písma sú vypnuté: nie je možné použiť písma vložené do súboru PDF.\ndocument_colors_not_allowed=Dokumenty PDF nemajú povolené používať vlastné farby, pretože voľba \"Povoliť stránkam používať vlastné farby\" je v nastaveniach prehliadača vypnutá.\n"
  },
  {
    "path": "pages/include/pdf/locale/sl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Prejšnja stran\nprevious_label=Nazaj\nnext.title=Naslednja stran\nnext_label=Naprej\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Stran\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=od {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} od {{pagesCount}})\n\nzoom_out.title=Pomanjšaj\nzoom_out_label=Pomanjšaj\nzoom_in.title=Povečaj\nzoom_in_label=Povečaj\nzoom.title=Povečava\npresentation_mode.title=Preklopi v način predstavitve\npresentation_mode_label=Način predstavitve\nopen_file.title=Odpri datoteko\nopen_file_label=Odpri\nprint.title=Natisni\nprint_label=Natisni\ndownload.title=Prenesi\ndownload_label=Prenesi\nbookmark.title=Trenutni pogled (kopiraj ali odpri v novem oknu)\nbookmark_label=Trenutni pogled\n\n# Secondary toolbar and context menu\ntools.title=Orodja\ntools_label=Orodja\nfirst_page.title=Pojdi na prvo stran\nfirst_page.label=Pojdi na prvo stran\nfirst_page_label=Pojdi na prvo stran\nlast_page.title=Pojdi na zadnjo stran\nlast_page.label=Pojdi na zadnjo stran\nlast_page_label=Pojdi na zadnjo stran\npage_rotate_cw.title=Zavrti v smeri urninega kazalca\npage_rotate_cw.label=Zavrti v smeri urninega kazalca\npage_rotate_cw_label=Zavrti v smeri urninega kazalca\npage_rotate_ccw.title=Zavrti v nasprotni smeri urninega kazalca\npage_rotate_ccw.label=Zavrti v nasprotni smeri urninega kazalca\npage_rotate_ccw_label=Zavrti v nasprotni smeri urninega kazalca\n\ncursor_text_select_tool.title=Omogoči orodje za izbor besedila\ncursor_text_select_tool_label=Orodje za izbor besedila\ncursor_hand_tool.title=Omogoči roko\ncursor_hand_tool_label=Roka\n\n# Document properties dialog box\ndocument_properties.title=Lastnosti dokumenta …\ndocument_properties_label=Lastnosti dokumenta …\ndocument_properties_file_name=Ime datoteke:\ndocument_properties_file_size=Velikost datoteke:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajtov)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajtov)\ndocument_properties_title=Ime:\ndocument_properties_author=Avtor:\ndocument_properties_subject=Tema:\ndocument_properties_keywords=Ključne besede:\ndocument_properties_creation_date=Datum nastanka:\ndocument_properties_modification_date=Datum spremembe:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Ustvaril:\ndocument_properties_producer=Izdelovalec PDF:\ndocument_properties_version=Različica PDF:\ndocument_properties_page_count=Število strani:\ndocument_properties_close=Zapri\n\nprint_progress_message=Priprava dokumenta na tiskanje …\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}} %\nprint_progress_close=Prekliči\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Preklopi stransko vrstico\ntoggle_sidebar_notification.title=Preklopi stransko vrstico (dokument vsebuje oris/priponke)\ntoggle_sidebar_label=Preklopi stransko vrstico\ndocument_outline.title=Prikaži oris dokumenta (dvokliknite za razširitev/strnitev vseh predmetov)\ndocument_outline_label=Oris dokumenta\nattachments.title=Prikaži priponke\nattachments_label=Priponke\nthumbs.title=Prikaži sličice\nthumbs_label=Sličice\nfindbar.title=Iskanje po dokumentu\nfindbar_label=Najdi\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Stran {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Sličica strani {{page}}\n\n# Find panel button title and messages\nfind_input.title=Najdi\nfind_input.placeholder=Najdi v dokumentu …\nfind_previous.title=Najdi prejšnjo ponovitev iskanega\nfind_previous_label=Najdi nazaj\nfind_next.title=Najdi naslednjo ponovitev iskanega\nfind_next_label=Najdi naprej\nfind_highlight=Označi vse\nfind_match_case_label=Razlikuj velike/male črke\nfind_reached_top=Dosežen začetek dokumenta iz smeri konca\nfind_reached_bottom=Doseženo konec dokumenta iz smeri začetka\nfind_not_found=Iskanega ni mogoče najti\n\n# Error panel labels\nerror_more_info=Več informacij\nerror_less_info=Manj informacij\nerror_close=Zapri\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js r{{version}} (graditev: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Sporočilo: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Sklad: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Datoteka: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Vrstica: {{line}}\nrendering_error=Med pripravljanjem strani je prišlo do napake!\n\n# Predefined zoom values\npage_scale_width=Širina strani\npage_scale_fit=Prilagodi stran\npage_scale_auto=Samodejno\npage_scale_actual=Dejanska velikost\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}} %\n\n# Loading indicator messages\nloading_error_indicator=Napaka\nloading_error=Med nalaganjem datoteke PDF je prišlo do napake.\ninvalid_file_error=Neveljavna ali pokvarjena datoteka PDF.\nmissing_file_error=Ni datoteke PDF.\nunexpected_response_error=Nepričakovan odgovor strežnika.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Opomba vrste {{type}}]\npassword_label=Vnesite geslo za odpiranje te datoteke PDF.\npassword_invalid=Neveljavno geslo. Poskusite znova.\npassword_ok=V redu\npassword_cancel=Prekliči\n\nprinting_not_supported=Opozorilo: ta brskalnik ne podpira vseh možnosti tiskanja.\nprinting_not_ready=Opozorilo: PDF ni v celoti naložen za tiskanje.\nweb_fonts_disabled=Spletne pisave so onemogočene: vgradnih pisav za PDF ni mogoče uporabiti.\ndocument_colors_not_allowed=Dokumenti PDF ne smejo uporabljati svojih lastnih barv: možnost 'Dovoli stranem uporabo lastnih barv' je v brskalniku onemogočena.\n"
  },
  {
    "path": "pages/include/pdf/locale/son/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Moo bisante\nprevious_label=Bisante\nnext.title=Jinehere moo\nnext_label=Jine\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Moo\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} ra\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} ka hun {{pagesCount}}) ra\n\nzoom_out.title=Nakasandi\nzoom_out_label=Nakasandi\nzoom_in.title=Bebbeerandi\nzoom_in_label=Bebbeerandi\nzoom.title=Bebbeerandi\npresentation_mode.title=Bere cebeyan alhaali\npresentation_mode_label=Cebeyan alhaali\nopen_file.title=Tuku feeri\nopen_file_label=Feeri\nprint.title=Kar\nprint_label=Kar\ndownload.title=Zumandi\ndownload_label=Zumandi\nbookmark.title=Sohõ gunarro (bere wala feeri zanfun taaga ra)\nbookmark_label=Sohõ gunaroo\n\n# Secondary toolbar and context menu\ntools.title=Goyjinawey\ntools_label=Goyjinawey\nfirst_page.title=Koy moo jinaa ga\nfirst_page.label=Koy moo jinaa ga\nfirst_page_label=Koy moo jinaa ga\nlast_page.title=Koy moo koraa ga\nlast_page.label=Koy moo koraa ga\nlast_page_label=Koy moo koraa ga\npage_rotate_cw.title=Kuubi kanbe guma here\npage_rotate_cw.label=Kuubi kanbe guma here\npage_rotate_cw_label=Kuubi kanbe guma here\npage_rotate_ccw.title=Kuubi kanbe wowa here\npage_rotate_ccw.label=Kuubi kanbe wowa here\npage_rotate_ccw_label=Kuubi kanbe wowa here\n\n\n# Document properties dialog box\ndocument_properties.title=Takadda mayrawey…\ndocument_properties_label=Takadda mayrawey…\ndocument_properties_file_name=Tuku maa:\ndocument_properties_file_size=Tuku adadu:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb=KB {{size_kb}} (cebsu-ize {{size_b}})\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb=MB {{size_mb}} (cebsu-ize {{size_b}})\ndocument_properties_title=Tiiramaa:\ndocument_properties_author=Hantumkaw:\ndocument_properties_subject=Dalil:\ndocument_properties_keywords=Kufalkalimawey:\ndocument_properties_creation_date=Teeyan han:\ndocument_properties_modification_date=Barmayan han:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Teekaw:\ndocument_properties_producer=PDF berandikaw:\ndocument_properties_version=PDF dumi:\ndocument_properties_page_count=Moo hinna:\ndocument_properties_close=Daabu\n\nprint_progress_message=Goo ma takaddaa soolu k'a kar se…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Naŋ\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Kanjari ceraw zuu\ntoggle_sidebar_notification.title=Kanjari ceraw-zuu (takaddaa goo nda filla-boŋ/hangandiyaŋ)\ntoggle_sidebar_label=Kanjari ceraw zuu\ndocument_outline.title=Takaddaa korfur alhaaloo cebe (naagu cee hinka ka haya-izey kul hayandi/kankamandi)\ndocument_outline_label=Takadda filla-boŋ\nattachments.title=Hangarey cebe\nattachments_label=Hangarey\nthumbs.title=Kabeboy biyey cebe\nthumbs_label=Kabeboy biyey\nfindbar.title=Ceeci takaddaa ra\nfindbar_label=Ceeci\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title={{page}} moo\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Kabeboy bii {{page}} moo še\n\n# Find panel button title and messages\nfind_input.title=Ceeci\nfind_input.placeholder=Ceeci takaddaa ra…\nfind_previous.title=Kalimaɲaŋoo bangayri bisantaa ceeci\nfind_previous_label=Bisante\nfind_next.title=Kalimaɲaŋoo hiino bangayroo ceeci\nfind_next_label=Jine\nfind_highlight=Ikul šilbay\nfind_match_case_label=Harfu-beeriyan hawgay\nfind_reached_top=A too moŋoo boŋoo, koy jine ka šinitin nda cewoo\nfind_reached_bottom=A too moɲoo cewoo, koy jine šintioo ga\nfind_not_found=Kalimaɲaa mana duwandi\n\n# Error panel labels\nerror_more_info=Alhabar tontoni\nerror_less_info=Alhabar tontoni\nerror_close=Daabu\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Alhabar: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Dekeri: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Tuku: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Žeeri: {{line}}\nrendering_error=Firka bangay kaŋ moɲoo goo ma willandi.\n\n# Predefined zoom values\npage_scale_width=Mooo hayyan\npage_scale_fit=Moo sawayan\npage_scale_auto=Boŋše azzaati barmayyan\npage_scale_actual=Adadu cimi\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Firka\nloading_error=Firka bangay kaŋ PDF goo ma zumandi.\ninvalid_file_error=PDF tuku laala wala laybante.\nmissing_file_error=PDF tuku kumante.\nunexpected_response_error=Manti feršikaw tuuruyan maatante.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt={{type}} maasa-caw]\npassword_label=Šennikufal dam ka PDF tukoo woo feeri.\npassword_invalid=Šennikufal laalo. Ceeci koyne taare.\npassword_ok=Ayyo\npassword_cancel=Naŋ\n\nprinting_not_supported=Yaamar: Karyan ši tee ka timme nda ceecikaa woo.\nprinting_not_ready=Yaamar: PDF ši zunbu ka timme karyan še.\nweb_fonts_disabled=Interneti šigirawey kay: ši hin ka goy nda PDF šigira hurantey.\ndocument_colors_not_allowed=PDF takaddawey ši duu fondo ka ngey boŋ noonawey zaa: “Naŋ moɲey ma ngey boŋ noonawey suuba” ši dira ceecikaa ga.\n"
  },
  {
    "path": "pages/include/pdf/locale/sq/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Faqja e Mëparshme\nprevious_label=E mëparshmja\nnext.title=Faqja Pasuese\nnext_label=Pasuesja\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Faqe\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=nga {{pagesCount}} gjithsej\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} nga {{pagesCount}})\n\nzoom_out.title=Zmadhim\nzoom_out_label=Zmadhoji\nzoom_in.title=Zvogëlim\nzoom_in_label=Zvogëloji\nzoom.title=Zoom\npresentation_mode.title=Kalo te Mënyra Paraqitje\npresentation_mode_label=Mënyra Paraqitje\nopen_file.title=Hapni Kartelë\nopen_file_label=Hape\nprint.title=Shtypje\nprint_label=Shtype\ndownload.title=Shkarkim\ndownload_label=Shkarkoje\nbookmark.title=Pamja e tanishme (kopjojeni ose hapeni në dritare të re)\nbookmark_label=Pamja e Tanishme\n\n# Secondary toolbar and context menu\ntools.title=Mjete\ntools_label=Mjete\nfirst_page.title=Kaloni te Faqja e Parë\nfirst_page.label=Kalo te Faqja e Parë\nfirst_page_label=Kalo te Faqja e Parë\nlast_page.title=Kaloni te Faqja e Fundit\nlast_page.label=Kalo te Faqja e Fundit\nlast_page_label=Kalo te Faqja e Fundit\npage_rotate_cw.title=Rrotullojeni Në Kahun Orar\npage_rotate_cw.label=Rrotulloje Në Kahun Orar\npage_rotate_cw_label=Rrotulloje Në Kahun Orar\npage_rotate_ccw.title=Rrotullojeni Në Kahun Kundërorar\npage_rotate_ccw.label=Rrotulloje Në Kahun Kundërorar\npage_rotate_ccw_label=Rrotulloje Në Kahun Kundërorar\n\n\n# Document properties dialog box\ndocument_properties.title=Veti Dokumenti…\ndocument_properties_label=Veti Dokumenti…\ndocument_properties_file_name=Emër kartele:\ndocument_properties_file_size=Madhësi kartele:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bajte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bajte)\ndocument_properties_title=Titull:\ndocument_properties_author=Autor:\ndocument_properties_subject=Subjekt:\ndocument_properties_keywords=Fjalëkyçe:\ndocument_properties_creation_date=Datë Krijimi:\ndocument_properties_modification_date=Datë Ndryshimi:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Krijues:\ndocument_properties_producer=Prodhues PDF-je:\ndocument_properties_version=Version PDF-je:\ndocument_properties_page_count=Numër Faqesh:\ndocument_properties_close=Mbylle\n\nprint_progress_message=Po përgatitet dokumenti për shtypje…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Anuloje\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Shfaqni/Fshihni Anështyllën\ntoggle_sidebar_notification.title=Shfaqni Anështyllën (dokumenti përmban përvijim/bashkëngjitje)\ntoggle_sidebar_label=Shfaq/Fshih Anështyllën\ndocument_outline.title=Shfaqni Përvijim Dokumenti (dyklikoni që të shfaqen/fshihen krejt elementët)\ndocument_outline_label=Përvijim Dokumenti\nattachments.title=Shfaqni Bashkëngjitje\nattachments_label=Bashkëngjitje\nthumbs.title=Shfaqni Miniatura\nthumbs_label=Miniatura\nfindbar.title=Gjeni në Dokument\nfindbar_label=Gjej\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Faqja {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniaturë e Faqes {{page}}\n\n# Find panel button title and messages\nfind_input.title=Gjeje\nfind_input.placeholder=Gjeni në dokument…\nfind_previous.title=Gjeni hasjen e mëparshme të togfjalëshit\nfind_previous_label=E mëparshmja\nfind_next.title=Gjeni hasjen pasuese të togfjalëshit\nfind_next_label=Pasuesja\nfind_highlight=Theksoji të tëra\nfind_match_case_label=Siç është shkruar\nfind_reached_top=U mbërrit në krye të dokumentit, vazhduar prej fundit\nfind_reached_bottom=U mbërrit në fund të dokumentit, vazhduar prej kreut\nfind_not_found=Togfjalësh që s’gjendet\n\n# Error panel labels\nerror_more_info=Më Tepër të Dhëna\nerror_less_info=Më Pak të Dhëna\nerror_close=Mbylle\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mesazh: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Kartelë: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rresht: {{line}}\nrendering_error=Ndodhi një gabim gjatë riprodhimit të faqes.\n\n# Predefined zoom values\npage_scale_width=Gjerësi Faqeje\npage_scale_fit=Sa Nxë Faqja\npage_scale_auto=Zoom i Vetvetishëm\npage_scale_actual=Madhësia Faktike\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Gabim\nloading_error=Ndodhi një gabim gjatë ngarkimit të PDF-së.\ninvalid_file_error=Kartelë PDF e pavlefshme ose e dëmtuar.\nmissing_file_error=Kartelë PDF që mungon.\nunexpected_response_error=Përgjigje shërbyesi e papritur.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Nënvizim {{type}}]\npassword_label=Jepni fjalëkalimin që të hapet kjo kartelë PDF.\npassword_invalid=Fjalëkalim i pavlefshëm. Ju lutemi, riprovoni.\npassword_ok=OK\npassword_cancel=Anuloje\n\nprinting_not_supported=Kujdes: Shtypja s’mbulohet plotësisht nga ky shfletues.\nprinting_not_ready=Kujdes: PDF-ja s’është ngarkuar plotësisht që ta shtypni.\nweb_fonts_disabled=Shkronjat Web janë të çaktivizuara: s’arrihet të përdoren shkronja të trupëzuara në PDF.\ndocument_colors_not_allowed=Dokumenteve PDF s’u lejohet të përdorin ngjyrat e tyre: 'Lejoji faqet t’i zgjedhin vetë ngjyrat' është e çaktivizuar te shfletuesi.\n"
  },
  {
    "path": "pages/include/pdf/locale/sr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Претходна страница\nprevious_label=Претходна\nnext.title=Следећа страница\nnext_label=Следећа\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Страница\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=од {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} од {{pagesCount}})\n\nzoom_out.title=Умањи\nzoom_out_label=Умањи\nzoom_in.title=Увеличај\nzoom_in_label=Увеличај\nzoom.title=Увеличавање\npresentation_mode.title=Промени на приказ у режиму презентације\npresentation_mode_label=Режим презентације\nopen_file.title=Отвори датотеку\nopen_file_label=Отвори\nprint.title=Штампај\nprint_label=Штампај\ndownload.title=Преузми\ndownload_label=Преузми\nbookmark.title=Тренутни приказ (копирај или отвори нови прозор)\nbookmark_label=Тренутни приказ\n\n# Secondary toolbar and context menu\ntools.title=Алатке\ntools_label=Алатке\nfirst_page.title=Иди на прву страницу\nfirst_page.label=Иди на прву страницу\nfirst_page_label=Иди на прву страницу\nlast_page.title=Иди на последњу страницу\nlast_page.label=Иди на последњу страницу\nlast_page_label=Иди на последњу страницу\npage_rotate_cw.title=Ротирај у смеру казаљке на сату\npage_rotate_cw.label=Ротирај у смеру казаљке на сату\npage_rotate_cw_label=Ротирај у смеру казаљке на сату\npage_rotate_ccw.title=Ротирај у смеру супротном од казаљке на сату\npage_rotate_ccw.label=Ротирај у смеру супротном од казаљке на сату\npage_rotate_ccw_label=Ротирај у смеру супротном од казаљке на сату\n\ncursor_text_select_tool.title=Омогући алат за селектовање текста\ncursor_text_select_tool_label=Алат за селектовање текста\ncursor_hand_tool.title=Омогући алат за померање\ncursor_hand_tool_label=Алат за померање\n\n# Document properties dialog box\ndocument_properties.title=Параметри документа…\ndocument_properties_label=Параметри документа…\ndocument_properties_file_name=Име датотеке:\ndocument_properties_file_size=Величина датотеке:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} B)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} B)\ndocument_properties_title=Наслов:\ndocument_properties_author=Аутор:\ndocument_properties_subject=Тема:\ndocument_properties_keywords=Кључне речи:\ndocument_properties_creation_date=Датум креирања:\ndocument_properties_modification_date=Датум модификације:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Стваралац:\ndocument_properties_producer=PDF произвођач:\ndocument_properties_version=PDF верзија:\ndocument_properties_page_count=Број страница:\ndocument_properties_close=Затвори\n\nprint_progress_message=Припремам документ за штампање…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Откажи\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Прикажи додатну палету\ntoggle_sidebar_notification.title=Прикажи додатну траку (докуменат садржи оквире/прилоге)\ntoggle_sidebar_label=Прикажи додатну палету\ndocument_outline.title=Прикажи контуру документа (дупли клик за проширење/скупљање елемената)\ndocument_outline_label=Контура документа\nattachments.title=Прикажи прилоге\nattachments_label=Прилози\nthumbs.title=Прикажи сличице\nthumbs_label=Сличице\nfindbar.title=Пронађи у документу\nfindbar_label=Пронађи\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Страница {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Сличица од странице {{page}}\n\n# Find panel button title and messages\nfind_input.title=Пронађи\nfind_input.placeholder=Пронађи у документу…\nfind_previous.title=Пронађи претходну појаву фразе\nfind_previous_label=Претходна\nfind_next.title=Пронађи следећу појаву фразе\nfind_next_label=Следећа\nfind_highlight=Истакнути све\nfind_match_case_label=Подударања\nfind_reached_top=Достигнут врх документа, наставио са дна\nfind_reached_bottom=Достигнуто дно документа, наставио са врха\nfind_not_found=Фраза није пронађена\n\n# Error panel labels\nerror_more_info=Више информација\nerror_less_info=Мање информација\nerror_close=Затвори\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Порука: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стек: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Датотека: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Линија: {{line}}\nrendering_error=Дошло је до грешке приликом рендеровања ове странице.\n\n# Predefined zoom values\npage_scale_width=Ширина странице\npage_scale_fit=Прилагоди страницу\npage_scale_auto=Аутоматско увеличавање\npage_scale_actual=Стварна величина\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Грешка\nloading_error=Дошло је до грешке приликом учитавања PDF-а.\ninvalid_file_error=PDF датотека је оштећена или је неисправна.\nmissing_file_error=PDF датотека није пронађена.\nunexpected_response_error=Неочекиван одговор од сервера.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} коментар]\npassword_label=Унесите лозинку да бисте отворили овај PDF докуменат.\npassword_invalid=Неисправна лозинка. Покушајте поново.\npassword_ok=У реду\npassword_cancel=Откажи\n\nprinting_not_supported=Упозорење: Штампање није у потпуности подржано у овом прегледачу.\nprinting_not_ready=Упозорење: PDF није у потпуности учитан за штампу.\nweb_fonts_disabled=Веб фонтови су онемогућени: не могу користити уграђене PDF фонтове.\ndocument_colors_not_allowed=PDF документи не могу да користе сопствене боје: “Дозволи страницама да изаберу своје боје” је деактивирано у прегледачу.\n"
  },
  {
    "path": "pages/include/pdf/locale/sv-SE/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Föregående sida\nprevious_label=Föregående\nnext.title=Nästa sida\nnext_label=Nästa\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Sida\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=av {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} av {{pagesCount}})\n\nzoom_out.title=Zooma ut\nzoom_out_label=Zooma ut\nzoom_in.title=Zooma in\nzoom_in_label=Zooma in\nzoom.title=Zoom\npresentation_mode.title=Byt till presentationsläge\npresentation_mode_label=Presentationsläge\nopen_file.title=Öppna fil\nopen_file_label=Öppna\nprint.title=Skriv ut\nprint_label=Skriv ut\ndownload.title=Hämta\ndownload_label=Hämta\nbookmark.title=Aktuell vy (kopiera eller öppna i nytt fönster)\nbookmark_label=Aktuell vy\n\n# Secondary toolbar and context menu\ntools.title=Verktyg\ntools_label=Verktyg\nfirst_page.title=Gå till första sidan\nfirst_page.label=Gå till första sidan\nfirst_page_label=Gå till första sidan\nlast_page.title=Gå till sista sidan\nlast_page.label=Gå till sista sidan\nlast_page_label=Gå till sista sidan\npage_rotate_cw.title=Rotera medurs\npage_rotate_cw.label=Rotera medurs\npage_rotate_cw_label=Rotera medurs\npage_rotate_ccw.title=Rotera moturs\npage_rotate_ccw.label=Rotera moturs\npage_rotate_ccw_label=Rotera moturs\n\ncursor_text_select_tool.title=Aktivera textmarkeringsverktyg\ncursor_text_select_tool_label=Textmarkeringsverktyg\ncursor_hand_tool.title=Aktivera handverktyg\ncursor_hand_tool_label=Handverktyg\n\n# Document properties dialog box\ndocument_properties.title=Dokumentegenskaper…\ndocument_properties_label=Dokumentegenskaper…\ndocument_properties_file_name=Filnamn:\ndocument_properties_file_size=Filstorlek:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} kB ({{size_b}} byte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title=Titel:\ndocument_properties_author=Författare:\ndocument_properties_subject=Ämne:\ndocument_properties_keywords=Nyckelord:\ndocument_properties_creation_date=Skapades:\ndocument_properties_modification_date=Ändrades:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Skapare:\ndocument_properties_producer=PDF-producent:\ndocument_properties_version=PDF-version:\ndocument_properties_page_count=Sidantal:\ndocument_properties_close=Stäng\n\nprint_progress_message=Förbereder sidor för utskrift…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Avbryt\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Visa/dölj sidofält\ntoggle_sidebar_notification.title=Visa/dölj sidofält (dokument innehåller översikt/bilagor)\ntoggle_sidebar_label=Visa/dölj sidofält\ndocument_outline.title=Visa dokumentdisposition (dubbelklicka för att expandera/komprimera alla objekt)\ndocument_outline_label=Dokumentöversikt\nattachments.title=Visa Bilagor\nattachments_label=Bilagor\nthumbs.title=Visa miniatyrer\nthumbs_label=Miniatyrer\nfindbar.title=Sök i dokument\nfindbar_label=Sök\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Sida {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Miniatyr av sida {{page}}\n\n# Find panel button title and messages\nfind_input.title=Sök\nfind_input.placeholder=Sök i dokument…\nfind_previous.title=Hitta föregående förekomst av frasen\nfind_previous_label=Föregående\nfind_next.title=Hitta nästa förekomst av frasen\nfind_next_label=Nästa\nfind_highlight=Markera alla\nfind_match_case_label=Matcha versal/gemen\nfind_reached_top=Nådde början av dokumentet, började från slutet\nfind_reached_bottom=Nådde slutet på dokumentet, började från början\nfind_not_found=Frasen hittades inte\n\n# Error panel labels\nerror_more_info=Mer information\nerror_less_info=Mindre information\nerror_close=Stäng\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Meddelande: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Fil: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rad: {{line}}\nrendering_error=Ett fel uppstod vid visning av sidan.\n\n# Predefined zoom values\npage_scale_width=Sidbredd\npage_scale_fit=Anpassa sida\npage_scale_auto=Automatisk zoom\npage_scale_actual=Verklig storlek\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Fel\nloading_error=Ett fel uppstod vid laddning av PDF-filen.\ninvalid_file_error=Ogiltig eller korrupt PDF-fil.\nmissing_file_error=Saknad PDF-fil.\nunexpected_response_error=Oväntat svar från servern.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-annotering]\npassword_label=Skriv in lösenordet för att öppna PDF-filen.\npassword_invalid=Ogiltigt lösenord. Försök igen.\npassword_ok=OK\npassword_cancel=Avbryt\n\nprinting_not_supported=Varning: Utskrifter stöds inte helt av den här webbläsaren.\nprinting_not_ready=Varning: PDF:en är inte klar för utskrift.\nweb_fonts_disabled=Webbtypsnitt är inaktiverade: kan inte använda inbäddade PDF-typsnitt.\ndocument_colors_not_allowed=PDF-dokument tillåts inte använda egna färger: “Låt sidor använda egna färger” är inaktiverat i webbläsaren.\n"
  },
  {
    "path": "pages/include/pdf/locale/sw/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Ukurasa Uliotangulia\nprevious_label=Iliyotangulia\nnext.title=Ukurasa Ufuatao\nnext_label=Ifuatayo\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Kuza Nje\nzoom_out_label=Kuza Nje\nzoom_in.title=Kuza Ndani\nzoom_in_label=Kuza Ndani\nzoom.title=Kuza\npresentation_mode.title=Badili kwa Hali ya Uwasilishaji\npresentation_mode_label=Hali ya Uwasilishaji\nopen_file.title=Fungua Faili\nopen_file_label=Fungua\nprint.title=Chapisha\nprint_label=Chapisha\ndownload.title=Pakua\ndownload_label=Pakua\nbookmark.title=Mwonekano wa sasa (nakili au ufungue katika dirisha mpya)\nbookmark_label=Mwonekano wa Sasa\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Kichwa:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Kibiano cha Upau wa Kando\ntoggle_sidebar_label=Kibiano cha Upau wa Kando\ndocument_outline_label=Ufupisho wa Waraka\nthumbs.title=Onyesha Kijipicha\nthumbs_label=Vijipicha\nfindbar.title=Pata katika Waraka\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Ukurasa {{ukurasa}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Kijipicha cha ukurasa {{ukurasa}}\n\n# Find panel button title and messages\nfind_previous.title=Tafuta tukio kabla ya msemo huu\nfind_previous_label=Iliyotangulia\nfind_next.title=Tafuta tukio linalofuata la msemo\nfind_next_label=Ifuatayo\nfind_highlight=Angazia yote\nfind_match_case_label=Linganisha herufi\nfind_reached_top=Imefika juu ya waraka, imeendelea kutoka chini\nfind_reached_bottom=Imefika mwisho wa waraka, imeendelea kutoka juu\nfind_not_found=Msemo hukupatikana\n\n# Error panel labels\nerror_more_info=Maelezo Zaidi\nerror_less_info=Maelezo Kidogo\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (jenga: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Ujumbe: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Panganya: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Faili: {{faili}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Laini: {{laini}}\nrendering_error=Hitilafu lilitokea wajati wa kutoa ukurasa\n\n# Predefined zoom values\npage_scale_width=Upana wa Ukurasa\npage_scale_fit=Usawa wa Ukurasa\npage_scale_auto=Ukuzaji wa Kiotomatiki\npage_scale_actual=Ukubwa Halisi\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Hitilafu\nloading_error=Hitilafu lilitokea wakati wa kupakia PDF.\ninvalid_file_error=Faili ya PDF isiyohalali au potofu.\nmissing_file_error=Faili ya PDF isiyopo.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Ufafanuzi]\npassword_ok=SAWA\n\nprinting_not_supported=Onyo: Uchapishaji hauauniwi kabisa kwa kivinjari hiki.\nweb_fonts_disabled=Fonti za tovuti zimelemazwa: haziwezi kutumia fonti za PDF zilizopachikwa.\n"
  },
  {
    "path": "pages/include/pdf/locale/ta/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=முந்தைய பக்கம்\nprevious_label=முந்தையது\nnext.title=அடுத்த பக்கம்\nnext_label=அடுத்து\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=பக்கம்\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} இல்\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages={{pagesCount}}) இல் ({{pageNumber}}\n\nzoom_out.title=சிறிதாக்கு\nzoom_out_label=சிறிதாக்கு\nzoom_in.title=பெரிதாக்கு\nzoom_in_label=பெரிதாக்கு\nzoom.title=பெரிதாக்கு\npresentation_mode.title=விளக்ககாட்சி பயன்முறைக்கு மாறு\npresentation_mode_label=விளக்ககாட்சி பயன்முறை\nopen_file.title=கோப்பினை திற\nopen_file_label=திற\nprint.title=அச்சிடு\nprint_label=அச்சிடு\ndownload.title=பதிவிறக்கு\ndownload_label=பதிவிறக்கு\nbookmark.title=தற்போதைய காட்சி (புதிய சாளரத்திற்கு நகலெடு அல்லது புதிய சாளரத்தில் திற)\nbookmark_label=தற்போதைய காட்சி\n\n# Secondary toolbar and context menu\ntools.title=கருவிகள்\ntools_label=கருவிகள்\nfirst_page.title=முதல் பக்கத்திற்கு செல்லவும்\nfirst_page.label=முதல் பக்கத்திற்கு செல்லவும்\nfirst_page_label=முதல் பக்கத்திற்கு செல்லவும்\nlast_page.title=கடைசி பக்கத்திற்கு செல்லவும்\nlast_page.label=கடைசி பக்கத்திற்கு செல்லவும்\nlast_page_label=கடைசி பக்கத்திற்கு செல்லவும்\npage_rotate_cw.title=வலஞ்சுழியாக சுழற்று\npage_rotate_cw.label=வலஞ்சுழியாக சுழற்று\npage_rotate_cw_label=வலஞ்சுழியாக சுழற்று\npage_rotate_ccw.title=இடஞ்சுழியாக சுழற்று\npage_rotate_ccw.label=இடஞ்சுழியாக சுழற்று\npage_rotate_ccw_label=இடஞ்சுழியாக சுழற்று\n\ncursor_text_select_tool.title=உரைத் தெரிவு கருவியைச் செயல்படுத்து\ncursor_text_select_tool_label=உரைத் தெரிவு கருவி\ncursor_hand_tool.title=கைக் கருவிக்ச் செயற்படுத்து\ncursor_hand_tool_label=கைக்குருவி\n\n# Document properties dialog box\ndocument_properties.title=ஆவண பண்புகள்...\ndocument_properties_label=ஆவண பண்புகள்...\ndocument_properties_file_name=கோப்பு பெயர்:\ndocument_properties_file_size=கோப்பின் அளவு:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} கிபை ({{size_b}} பைட்டுகள்)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} மெபை ({{size_b}} பைட்டுகள்)\ndocument_properties_title=தலைப்பு:\ndocument_properties_author=எழுதியவர்\ndocument_properties_subject=பொருள்:\ndocument_properties_keywords=முக்கிய வார்த்தைகள்:\ndocument_properties_creation_date=படைத்த தேதி :\ndocument_properties_modification_date=திருத்திய தேதி:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=உருவாக்குபவர்:\ndocument_properties_producer=பிடிஎஃப் தயாரிப்பாளர்:\ndocument_properties_version=PDF பதிப்பு:\ndocument_properties_page_count=பக்க எண்ணிக்கை:\ndocument_properties_close=மூடுக\n\nprint_progress_message=அச்சிடுவதற்கான ஆவணம் தயாராகிறது...\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=ரத்து\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=பக்கப் பட்டியை நிலைமாற்று\ntoggle_sidebar_notification.title=பக்கப்பட்டையை நிலைமாற்று (வெளிக்கோடு/இணைப்புகளை ஆவணம் கொண்டுள்ளது)\ntoggle_sidebar_label=பக்கப் பட்டியை நிலைமாற்று\ndocument_outline.title=ஆவண அடக்கத்தைக் காட்டு (இருமுறைச் சொடுக்கி அனைத்து உறுப்பிடிகளையும் விரி/சேர்)\ndocument_outline_label=ஆவண வெளிவரை\nattachments.title=இணைப்புகளை காண்பி\nattachments_label=இணைப்புகள்\nthumbs.title=சிறுபடங்களைக் காண்பி\nthumbs_label=சிறுபடங்கள்\nfindbar.title=ஆவணத்தில் கண்டறி\nfindbar_label=தேடு\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=பக்கம் {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=பக்கத்தின் சிறுபடம் {{page}}\n\n# Find panel button title and messages\nfind_input.title=கண்டுபிடி\nfind_input.placeholder=ஆவணத்தில் கண்டறி…\nfind_previous.title=இந்த சொற்றொடரின் முந்தைய நிகழ்வை தேடு\nfind_previous_label=முந்தையது\nfind_next.title=இந்த சொற்றொடரின் அடுத்த நிகழ்வை தேடு\nfind_next_label=அடுத்து\nfind_highlight=அனைத்தையும் தனிப்படுத்து\nfind_match_case_label=பேரெழுத்தாக்கத்தை உணர்\nfind_reached_top=ஆவணத்தின் மேல் பகுதியை அடைந்தது, அடிப்பக்கத்திலிருந்து தொடர்ந்தது\nfind_reached_bottom=ஆவணத்தின் முடிவை அடைந்தது, மேலிருந்து தொடர்ந்தது\nfind_not_found=சொற்றொடர் காணவில்லை\n\n# Error panel labels\nerror_more_info=கூடுதல் தகவல்\nerror_less_info=குறைந்த தகவல்\nerror_close=மூடுக\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=செய்தி: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=ஸ்டேக்: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=கோப்பு: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=வரி: {{line}}\nrendering_error=இந்தப் பக்கத்தை காட்சிப்படுத்தும் போது ஒரு பிழை ஏற்பட்டது.\n\n# Predefined zoom values\npage_scale_width=பக்க அகலம்\npage_scale_fit=பக்கப் பொருத்தம்\npage_scale_auto=தானியக்க பெரிதாக்கல்\npage_scale_actual=உண்மையான அளவு\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=பிழை\nloading_error=PDF ஐ ஏற்றும் போது ஒரு பிழை ஏற்பட்டது.\ninvalid_file_error=செல்லுபடியாகாத அல்லது சிதைந்த PDF கோப்பு.\nmissing_file_error=PDF கோப்பு காணவில்லை.\nunexpected_response_error=சேவகன் பதில் எதிர்பாரதது.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} விளக்கம்]\npassword_label=இந்த PDF கோப்பை திறக்க கடவுச்சொல்லை உள்ளிடவும்.\npassword_invalid=செல்லுபடியாகாத கடவுச்சொல், தயை செய்து மீண்டும் முயற்சி செய்க.\npassword_ok=சரி\npassword_cancel=ரத்து\n\nprinting_not_supported=எச்சரிக்கை: இந்த உலாவி அச்சிடுதலை முழுமையாக ஆதரிக்கவில்லை.\nprinting_not_ready=எச்சரிக்கை: PDF அச்சிட முழுவதுமாக ஏற்றப்படவில்லை.\nweb_fonts_disabled=வலை எழுத்துருக்கள் முடக்கப்பட்டுள்ளன: உட்பொதிக்கப்பட்ட PDF எழுத்துருக்களைப் பயன்படுத்த முடியவில்லை.\ndocument_colors_not_allowed=PDF ஆவணங்களுக்குச் சொந்த நிறங்களைப் பயன்படுத்த அனுமதியில்லை: உலாவியில் \"பக்கங்கள் தங்கள் சொந்த நிறங்களைத் தேர்வு செய்துகொள்ள அனுமதி\" என்னும் விருப்பம் முடக்கப்பட்டுள்ளது.\n"
  },
  {
    "path": "pages/include/pdf/locale/ta-LK/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom.title=அளவு\nopen_file.title=கோப்பினைத் திறக்க\nopen_file_label=திறக்க\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\n\n# Find panel button title and messages\nfind_previous.title=இந்த சொற்றொடரின் முன்னைய நிகழ்வை தேடு\nfind_next.title=இந்த சொற்றொடரின் அடுத்த நிகழ்வைத் தேடு\n\n# Error panel labels\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\n\n# Predefined zoom values\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_ok=ஆம்\n\n"
  },
  {
    "path": "pages/include/pdf/locale/te/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=మునుపటి పేజీ\nprevious_label=క్రితం\nnext.title=తరువాత పేజీ\nnext_label=తరువాత\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=పేజీ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=మొత్తం {{pageCount}} లో\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=(మొత్తం {{pagesCount}} లో {{pageNumber}}వది)\n\nzoom_out.title=జూమ్ తగ్గించు\nzoom_out_label=జూమ్ తగ్గించు\nzoom_in.title=జూమ్ చేయి\nzoom_in_label=జూమ్ చేయి\nzoom.title=జూమ్\npresentation_mode.title=ప్రదర్శనా రీతికి మారు\npresentation_mode_label=ప్రదర్శనా రీతి\nopen_file.title=ఫైల్ తెరువు\nopen_file_label=తెరువు\nprint.title=ముద్రించు\nprint_label=ముద్రించు\ndownload.title=దింపుకోళ్ళు\ndownload_label=దింపుకోళ్ళు\nbookmark.title=ప్రస్తుత దర్శనం (కాపీ చేయి లేదా కొత్త విండోలో తెరువు)\nbookmark_label=ప్రస్తుత దర్శనం\n\n# Secondary toolbar and context menu\ntools.title=పనిముట్లు\ntools_label=పనిముట్లు\nfirst_page.title=మొదటి పేజీకి వెళ్ళు\nfirst_page.label=మొదటి పేజీకి వెళ్ళు\nfirst_page_label=మొదటి పేజీకి వెళ్ళు\nlast_page.title=చివరి పేజీకి వెళ్ళు\nlast_page.label=చివరి పేజీకి వెళ్ళు\nlast_page_label=చివరి పేజీకి వెళ్ళు\npage_rotate_cw.title=సవ్యదిశలో తిప్పు\npage_rotate_cw.label=సవ్యదిశలో తిప్పు\npage_rotate_cw_label=సవ్యదిశలో తిప్పు\npage_rotate_ccw.title=అపసవ్యదిశలో తిప్పు\npage_rotate_ccw.label=అపసవ్యదిశలో తిప్పు\npage_rotate_ccw_label=అపసవ్యదిశలో తిప్పు\n\ncursor_text_select_tool.title=టెక్స్ట్ ఎంపిక సాధనాన్ని ప్రారంభించండి\ncursor_text_select_tool_label=టెక్స్ట్ ఎంపిక సాధనం\ncursor_hand_tool.title=చేతి సాధనం చేతనించు\ncursor_hand_tool_label=చేతి సాధనం\n\n# Document properties dialog box\ndocument_properties.title=పత్రము లక్షణాలు...\ndocument_properties_label=పత్రము లక్షణాలు...\ndocument_properties_file_name=దస్త్రం పేరు:\ndocument_properties_file_size=దస్త్రం పరిమాణం:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=శీర్షిక:\ndocument_properties_author=మూలకర్త:\ndocument_properties_subject=విషయం:\ndocument_properties_keywords=కీ పదాలు:\ndocument_properties_creation_date=సృష్టించిన తేదీ:\ndocument_properties_modification_date=సవరించిన తేదీ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=సృష్టికర్త:\ndocument_properties_producer=PDF ఉత్పాదకి:\ndocument_properties_version=PDF వర్షన్:\ndocument_properties_page_count=పేజీల సంఖ్య:\ndocument_properties_close=మూసివేయి\n\nprint_progress_message=ముద్రించడానికి పత్రము సిద్ధమవుతున్నది…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=రద్దుచేయి\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=పక్కపట్టీ మార్చు\ntoggle_sidebar_label=పక్కపట్టీ మార్చు\ndocument_outline.title=పత్రము రూపము చూపించు (డబుల్ క్లిక్ చేసి అన్ని అంశాలను విస్తరించు/కూల్చు)\ndocument_outline_label=పత్రము అవుట్‌లైన్\nattachments.title=అనుబంధాలు చూపు\nattachments_label=అనుబంధాలు\nthumbs.title=థంబ్‌నైల్స్ చూపు\nthumbs_label=థంబ్‌నైల్స్\nfindbar.title=పత్రములో కనుగొనుము\nfindbar_label=కనుగొను\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=పేజీ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=పేజీ {{page}} యొక్క థంబ్‌నైల్\n\n# Find panel button title and messages\nfind_input.title=కనుగొను\nfind_input.placeholder=పత్రములో కనుగొను…\nfind_previous.title=పదం యొక్క ముందు సంభవాన్ని కనుగొను\nfind_previous_label=మునుపటి\nfind_next.title=పదం యొక్క తర్వాతి సంభవాన్ని కనుగొను\nfind_next_label=తరువాత\nfind_highlight=అన్నిటిని ఉద్దీపనం చేయుము\nfind_match_case_label=అక్షరముల తేడాతో పోల్చు\nfind_reached_top=పేజీ పైకి చేరుకున్నది, క్రింది నుండి కొనసాగించండి\nfind_reached_bottom=పేజీ చివరకు చేరుకున్నది, పైనుండి కొనసాగించండి\nfind_not_found=పదం కనబడలేదు\n\n# Error panel labels\nerror_more_info=మరింత సమాచారం\nerror_less_info=తక్కువ సమాచారం\nerror_close=మూసివేయి\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=సందేశం: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=స్టాక్: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ఫైలు: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=వరుస: {{line}}\nrendering_error=పేజీను రెండర్ చేయుటలో ఒక దోషం ఎదురైంది.\n\n# Predefined zoom values\npage_scale_width=పేజీ వెడల్పు\npage_scale_fit=పేజీ అమర్పు\npage_scale_auto=స్వయంచాలక జూమ్\npage_scale_actual=యథార్ధ పరిమాణం\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=దోషం\nloading_error=PDF లోడవుచున్నప్పుడు ఒక దోషం ఎదురైంది.\ninvalid_file_error=చెల్లని లేదా పాడైన PDF ఫైలు.\nmissing_file_error=దొరకని PDF ఫైలు.\nunexpected_response_error=అనుకోని సర్వర్ స్పందన.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} టీకా]\npassword_label=ఈ PDF ఫైల్ తెరుచుటకు సంకేతపదం ప్రవేశపెట్టుము.\npassword_invalid=సంకేతపదం చెల్లదు. దయచేసి మళ్ళీ ప్రయత్నించండి.\npassword_ok=సరే\npassword_cancel=రద్దుచేయి\n\nprinting_not_supported=హెచ్చరిక: ఈ విహారిణి చేత ముద్రణ పూర్తిగా తోడ్పాటు లేదు.\nprinting_not_ready=హెచ్చరిక: ముద్రణ కొరకు ఈ PDF పూర్తిగా లోడవలేదు.\nweb_fonts_disabled=వెబ్ ఫాంట్లు అచేతనించబడెను: ఎంబెడెడ్ PDF ఫాంట్లు ఉపయోగించలేక పోయింది.\ndocument_colors_not_allowed=PDF పత్రాలు వాటి స్వంత రంగులను ఉపయోగించుకొనుటకు అనుమతించబడవు: విహరణి నందు “పేజీలను వాటి స్వంత రంగులను ఎంచుకొనుటకు అనుమతించు” అచేతనం చేయబడివుంది.\n"
  },
  {
    "path": "pages/include/pdf/locale/th/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=หน้าก่อนหน้า\nprevious_label=ก่อนหน้า\nnext.title=หน้าถัดไป\nnext_label=ถัดไป\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=หน้า\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=จาก {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} จาก {{pagesCount}})\n\nzoom_out.title=ซูมออก\nzoom_out_label=ซูมออก\nzoom_in.title=ซูมเข้า\nzoom_in_label=ซูมเข้า\nzoom.title=ซูม\npresentation_mode.title=สลับเป็นโหมดการนำเสนอ\npresentation_mode_label=โหมดการนำเสนอ\nopen_file.title=เปิดไฟล์\nopen_file_label=เปิด\nprint.title=พิมพ์\nprint_label=พิมพ์\ndownload.title=ดาวน์โหลด\ndownload_label=ดาวน์โหลด\nbookmark.title=มุมมองปัจจุบัน (คัดลอกหรือเปิดในหน้าต่างใหม่)\nbookmark_label=มุมมองปัจจุบัน\n\n# Secondary toolbar and context menu\ntools.title=เครื่องมือ\ntools_label=เครื่องมือ\nfirst_page.title=ไปยังหน้าแรก\nfirst_page.label=ไปยังหน้าแรก\nfirst_page_label=ไปยังหน้าแรก\nlast_page.title=ไปยังหน้าสุดท้าย\nlast_page.label=ไปยังหน้าสุดท้าย\nlast_page_label=ไปยังหน้าสุดท้าย\npage_rotate_cw.title=หมุนตามเข็มนาฬิกา\npage_rotate_cw.label=หมุนตามเข็มนาฬิกา\npage_rotate_cw_label=หมุนตามเข็มนาฬิกา\npage_rotate_ccw.title=หมุนทวนเข็มนาฬิกา\npage_rotate_ccw.label=หมุนทวนเข็มนาฬิกา\npage_rotate_ccw_label=หมุนทวนเข็มนาฬิกา\n\n\n# Document properties dialog box\ndocument_properties.title=คุณสมบัติเอกสาร…\ndocument_properties_label=คุณสมบัติเอกสาร…\ndocument_properties_file_name=ชื่อไฟล์:\ndocument_properties_file_size=ขนาดไฟล์:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} กิโลไบต์ ({{size_b}} ไบต์)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} เมกะไบต์ ({{size_b}} ไบต์)\ndocument_properties_title=ชื่อ:\ndocument_properties_author=ผู้สร้าง:\ndocument_properties_subject=ชื่อเรื่อง:\ndocument_properties_keywords=คำสำคัญ:\ndocument_properties_creation_date=วันที่สร้าง:\ndocument_properties_modification_date=วันที่แก้ไข:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=ผู้สร้าง:\ndocument_properties_producer=ผู้ผลิต PDF:\ndocument_properties_version=รุ่น PDF:\ndocument_properties_page_count=จำนวนหน้า:\ndocument_properties_close=ปิด\n\nprint_progress_message=กำลังเตรียมเอกสารสำหรับการพิมพ์…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=ยกเลิก\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=เปิด/ปิดแถบข้าง\ntoggle_sidebar_notification.title=เปิด/ปิดแถบข้าง (เอกสารมีเค้าร่าง/ไฟล์แนบ)\ntoggle_sidebar_label=เปิด/ปิดแถบข้าง\ndocument_outline.title=แสดงเค้าร่างเอกสาร (คลิกสองครั้งเพื่อขยาย/ยุบรายการทั้งหมด)\ndocument_outline_label=เค้าร่างเอกสาร\nattachments.title=แสดงไฟล์แนบ\nattachments_label=ไฟล์แนบ\nthumbs.title=แสดงภาพขนาดย่อ\nthumbs_label=ภาพขนาดย่อ\nfindbar.title=ค้นหาในเอกสาร\nfindbar_label=ค้นหา\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=หน้า {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=ภาพขนาดย่อของหน้า {{page}}\n\n# Find panel button title and messages\nfind_input.title=ค้นหา\nfind_input.placeholder=ค้นหาในเอกสาร…\nfind_previous.title=หาตำแหน่งก่อนหน้าของวลี\nfind_previous_label=ก่อนหน้า\nfind_next.title=หาตำแหน่งถัดไปของวลี\nfind_next_label=ถัดไป\nfind_highlight=เน้นสีทั้งหมด\nfind_match_case_label=ตัวพิมพ์ใหญ่เล็กตรงกัน\nfind_reached_top=ค้นหาถึงจุดเริ่มต้นของหน้า เริ่มค้นต่อจากด้านล่าง\nfind_reached_bottom=ค้นหาถึงจุดสิ้นสุดหน้า เริ่มค้นต่อจากด้านบน\nfind_not_found=ไม่พบวลี\n\n# Error panel labels\nerror_more_info=ข้อมูลเพิ่มเติม\nerror_less_info=ข้อมูลน้อยลง\nerror_close=ปิด\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=ข้อความ: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=สแต็ก: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=ไฟล์: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=บรรทัด: {{line}}\nrendering_error=เกิดข้อผิดพลาดขณะกำลังเรนเดอร์หน้า\n\n# Predefined zoom values\npage_scale_width=ความกว้างหน้า\npage_scale_fit=พอดีหน้า\npage_scale_auto=ซูมอัตโนมัติ\npage_scale_actual=ขนาดจริง\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=ข้อผิดพลาด\nloading_error=เกิดข้อผิดพลาดขณะกำลังโหลด PDF\ninvalid_file_error=ไฟล์ PDF ไม่ถูกต้องหรือเสียหาย\nmissing_file_error=ไฟล์ PDF ขาดหาย\nunexpected_response_error=การตอบสนองของเซิร์ฟเวอร์ที่ไม่คาดคิด\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[คำอธิบายประกอบ {{type}}]\npassword_label=ป้อนรหัสผ่านเพื่อเปิดไฟล์ PDF นี้\npassword_invalid=รหัสผ่านไม่ถูกต้อง โปรดลองอีกครั้ง\npassword_ok=ตกลง\npassword_cancel=ยกเลิก\n\nprinting_not_supported=คำเตือน: เบราว์เซอร์นี้ไม่ได้สนับสนุนการพิมพ์อย่างเต็มที่\nprinting_not_ready=คำเตือน: PDF ไม่ได้รับการโหลดอย่างเต็มที่สำหรับการพิมพ์\nweb_fonts_disabled=แบบอักษรเว็บถูกปิดใช้งาน: ไม่สามารถใช้แบบอักษร PDF ฝังตัว\ndocument_colors_not_allowed=เอกสาร PDF ไม่ได้รับอนุญาตให้ใช้สีของตัวเอง: \"อนุญาตให้หน้าเอกสารสามารถเลือกสีของตัวเอง\" ถูกปิดใช้งานในเบราว์เซอร์\n"
  },
  {
    "path": "pages/include/pdf/locale/tl/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Naunang Pahina\nnext.title=Sunod na Pahina\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nopen_file.title=Magbukas ng file\nopen_file_label=Buksan\nbookmark.title=Kasalukuyang tingin (kopyahin o buksan sa bagong window)\nbookmark_label=Kasalukuyang tingin\n\n# Secondary toolbar and context menu\ntools.title=Mga Tool\ntools_label=Mga Tool\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Pamagat:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_close=Kanselahin\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\nthumbs.title=Ipakita ang mga Thumbnails\nfindbar_label=Hanapin\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Pahina {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Thumbnail ng Pahina {{page}}\n\n# Find panel button title and messages\nfind_highlight=I-highlight lahat\n\n# Error panel labels\nerror_more_info=Maraming Inpormasyon\nerror_less_info=Maikling Inpormasyon\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Mensahe: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Linya: {{line}}\nrendering_error=May naganap na pagkakamali habang pagsasalin sa pahina.\n\n# Predefined zoom values\npage_scale_width=Haba ng Pahina\npage_scale_fit=ang pahina ay angkop\npage_scale_auto=awtomatikong pag-imbulog\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error=May maling nangyari habang kinakarga ang PDF.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_ok=OK\npassword_cancel=Kanselahin\n\n"
  },
  {
    "path": "pages/include/pdf/locale/tn/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom.title=Zuma/gogela\nopen_file.title=Bula Faele\nopen_file_label=Bula\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\ndocument_properties_file_name=Leina la faele:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Leina:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\n\n# Find panel button title and messages\nfind_previous.title=Batla tiragalo e e fetileng ya setlhopha sa mafoko\nfind_next.title=Batla tiragalo e e latelang ya setlhopha sa mafoko\nfind_not_found=Setlhopha sa mafoko ga se a bonwa\n\n# Error panel labels\nerror_more_info=Tshedimosetso e Nngwe\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\n\n# Predefined zoom values\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Phoso\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\npassword_ok=Siame\n\nweb_fonts_disabled=Mefutatlhaka ya Webo ga e dire: ga e kgone go dirisa mofutatlhaka wa PDF o tsentsweng.\n"
  },
  {
    "path": "pages/include/pdf/locale/tr/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Önceki sayfa\nprevious_label=Önceki\nnext.title=Sonraki sayfa\nnext_label=Sonraki\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Sayfa\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=Uzaklaştır\nzoom_out_label=Uzaklaştır\nzoom_in.title=Yaklaştır\nzoom_in_label=Yaklaştır\nzoom.title=Yakınlaştırma\npresentation_mode.title=Sunum moduna geç\npresentation_mode_label=Sunum Modu\nopen_file.title=Dosya aç\nopen_file_label=Aç\nprint.title=Yazdır\nprint_label=Yazdır\ndownload.title=İndir\ndownload_label=İndir\nbookmark.title=Geçerli görünüm (kopyala veya yeni pencerede aç)\nbookmark_label=Geçerli görünüm\n\n# Secondary toolbar and context menu\ntools.title=Araçlar\ntools_label=Araçlar\nfirst_page.title=İlk sayfaya git\nfirst_page.label=İlk sayfaya git\nfirst_page_label=İlk sayfaya git\nlast_page.title=Son sayfaya git\nlast_page.label=Son sayfaya git\nlast_page_label=Son sayfaya git\npage_rotate_cw.title=Saat yönünde döndür\npage_rotate_cw.label=Saat yönünde döndür\npage_rotate_cw_label=Saat yönünde döndür\npage_rotate_ccw.title=Saat yönünün tersine döndür\npage_rotate_ccw.label=Saat yönünün tersine döndür\npage_rotate_ccw_label=Saat yönünün tersine döndür\n\ncursor_text_select_tool.title=Metin seçme aracını etkinleştir\ncursor_text_select_tool_label=Metin seçme aracı\ncursor_hand_tool.title=El aracını etkinleştir\ncursor_hand_tool_label=El aracı\n\n# Document properties dialog box\ndocument_properties.title=Belge özellikleri…\ndocument_properties_label=Belge özellikleri…\ndocument_properties_file_name=Dosya adı:\ndocument_properties_file_size=Dosya boyutu:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bayt)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bayt)\ndocument_properties_title=Başlık:\ndocument_properties_author=Yazar:\ndocument_properties_subject=Konu:\ndocument_properties_keywords=Anahtar kelimeler:\ndocument_properties_creation_date=Oluturma tarihi:\ndocument_properties_modification_date=Değiştirme tarihi:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}} {{time}}\ndocument_properties_creator=Oluşturan:\ndocument_properties_producer=PDF üreticisi:\ndocument_properties_version=PDF sürümü:\ndocument_properties_page_count=Sayfa sayısı:\ndocument_properties_close=Kapat\n\nprint_progress_message=Belge yazdırılmaya hazırlanıyor…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent=%{{progress}}\nprint_progress_close=İptal\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Kenar çubuğunu aç/kapat\ntoggle_sidebar_notification.title=Kenar çubuğunu aç/kapay (Belge anahat/ekler içeriyor)\ntoggle_sidebar_label=Kenar çubuğunu aç/kapat\ndocument_outline.title=Belge şemasını göster (Tüm öğeleri genişletmek/daraltmak için çift tıklayın)\ndocument_outline_label=Belge şeması\nattachments.title=Ekleri göster\nattachments_label=Ekler\nthumbs.title=Küçük resimleri göster\nthumbs_label=Küçük resimler\nfindbar.title=Belgede bul\nfindbar_label=Bul\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Sayfa {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas={{page}}. sayfanın küçük hâli\n\n# Find panel button title and messages\nfind_input.title=Bul\nfind_input.placeholder=Belgede bul…\nfind_previous.title=Önceki eşleşmeyi bul\nfind_previous_label=Önceki\nfind_next.title=Sonraki eşleşmeyi bul\nfind_next_label=Sonraki\nfind_highlight=Tümünü vurgula\nfind_match_case_label=Büyük-küçük harfe duyarlı\nfind_reached_top=Belgenin başına ulaşıldı, sonundan devam edildi\nfind_reached_bottom=Belgenin sonuna ulaşıldı, başından devam edildi\nfind_not_found=Eşleşme bulunamadı\n\n# Error panel labels\nerror_more_info=Daha fazla bilgi al\nerror_less_info=Daha az bilgi\nerror_close=Kapat\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js sürüm {{version}} (yapı: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=İleti: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Yığın: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Dosya: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Satır: {{line}}\nrendering_error=Sayfa yorumlanırken bir hata oluştu.\n\n# Predefined zoom values\npage_scale_width=Sayfa genişliği\npage_scale_fit=Sayfayı sığdır\npage_scale_auto=Otomatik yakınlaştır\npage_scale_actual=Gerçek boyut\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent=%{{scale}}\n\n# Loading indicator messages\nloading_error_indicator=Hata\nloading_error=PDF yüklenirken bir hata oluştu.\ninvalid_file_error=Geçersiz veya bozulmuş PDF dosyası.\nmissing_file_error=PDF dosyası eksik.\nunexpected_response_error=Beklenmeyen sunucu yanıtı.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} işareti]\npassword_label=Bu PDF dosyasını açmak için parolasını yazın.\npassword_invalid=Geçersiz parola. Lütfen tekrar deneyin.\npassword_ok=Tamam\npassword_cancel=İptal\n\nprinting_not_supported=Uyarı: Yazdırma bu tarayıcı tarafından tam olarak desteklenmemektedir.\nprinting_not_ready=Uyarı: PDF tamamen yüklenmedi ve yazdırmaya hazır değil.\nweb_fonts_disabled=Web fontları devre dışı: Gömülü PDF fontları kullanılamıyor.\ndocument_colors_not_allowed=PDF belgelerinin kendi renklerini kullanması için izin verilmiyor: “Sayfalara kendi renklerini seçmesi için izin ver” tarayıcıda etkinleştirilmemiş.\n"
  },
  {
    "path": "pages/include/pdf/locale/uk/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Попередня сторінка\nprevious_label=Попередня\nnext.title=Наступна сторінка\nnext_label=Наступна\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Сторінка\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=із {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} із {{pagesCount}})\n\nzoom_out.title=Зменшити\nzoom_out_label=Зменшити\nzoom_in.title=Збільшити\nzoom_in_label=Збільшити\nzoom.title=Масштаб\npresentation_mode.title=Перейти в режим презентації\npresentation_mode_label=Режим презентації\nopen_file.title=Відкрити файл\nopen_file_label=Відкрити\nprint.title=Друк\nprint_label=Друк\ndownload.title=Завантажити\ndownload_label=Завантажити\nbookmark.title=Поточний вигляд (копіювати чи відкрити в новому вікні)\nbookmark_label=Поточний вигляд\n\n# Secondary toolbar and context menu\ntools.title=Інструменти\ntools_label=Інструменти\nfirst_page.title=На першу сторінку\nfirst_page.label=На першу сторінку\nfirst_page_label=На першу сторінку\nlast_page.title=На останню сторінку\nlast_page.label=На останню сторінку\nlast_page_label=На останню сторінку\npage_rotate_cw.title=Повернути за годинниковою стрілкою\npage_rotate_cw.label=Повернути за годинниковою стрілкою\npage_rotate_cw_label=Повернути за годинниковою стрілкою\npage_rotate_ccw.title=Повернути проти годинникової стрілки\npage_rotate_ccw.label=Повернути проти годинникової стрілки\npage_rotate_ccw_label=Повернути проти годинникової стрілки\n\ncursor_text_select_tool.title=Увімкнути інструмент вибору тексту\ncursor_text_select_tool_label=Інструмент вибору тексту\ncursor_hand_tool.title=Увімкнути інструмент «Рука»\ncursor_hand_tool_label=Інструмент «Рука»\n\n# Document properties dialog box\ndocument_properties.title=Властивості документа…\ndocument_properties_label=Властивості документа…\ndocument_properties_file_name=Назва файла:\ndocument_properties_file_size=Розмір файла:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} КБ ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} МБ ({{size_b}} bytes)\ndocument_properties_title=Заголовок:\ndocument_properties_author=Автор:\ndocument_properties_subject=Тема:\ndocument_properties_keywords=Ключові слова:\ndocument_properties_creation_date=Дата створення:\ndocument_properties_modification_date=Дата зміни:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Створено:\ndocument_properties_producer=Виробник PDF:\ndocument_properties_version=Версія PDF:\ndocument_properties_page_count=Кількість сторінок:\ndocument_properties_close=Закрити\n\nprint_progress_message=Підготовка документу до друку…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Скасувати\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Бічна панель\ntoggle_sidebar_notification.title=Перемкнути бічну панель (документ має вміст/вкладення)\ntoggle_sidebar_label=Перемкнути бічну панель\ndocument_outline.title=Показати схему документу (подвійний клік для розгортання/згортання елементів)\ndocument_outline_label=Схема документа\nattachments.title=Показати прикріплення\nattachments_label=Прикріплення\nthumbs.title=Показувати ескізи\nthumbs_label=Ескізи\nfindbar.title=Знайти в документі\nfindbar_label=Пошук\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Сторінка {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Ескіз сторінки {{page}}\n\n# Find panel button title and messages\nfind_input.title=Знайти\nfind_input.placeholder=Знайти в документі…\nfind_previous.title=Знайти попереднє входження фрази\nfind_previous_label=Попереднє\nfind_next.title=Знайти наступне входження фрази\nfind_next_label=Наступне\nfind_highlight=Підсвітити все\nfind_match_case_label=З урахуванням регістру\nfind_reached_top=Досягнуто початку документу, продовжено з кінця\nfind_reached_bottom=Досягнуто кінця документу, продовжено з початку\nfind_not_found=Фразу не знайдено\n\n# Error panel labels\nerror_more_info=Більше інформації\nerror_less_info=Менше інформації\nerror_close=Закрити\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Повідомлення: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Стек: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Файл: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Рядок: {{line}}\nrendering_error=Під час виведення сторінки сталася помилка.\n\n# Predefined zoom values\npage_scale_width=За шириною\npage_scale_fit=Умістити\npage_scale_auto=Авто-масштаб\npage_scale_actual=Дійсний розмір\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Помилка\nloading_error=Під час завантаження PDF сталася помилка.\ninvalid_file_error=Недійсний або пошкоджений PDF-файл.\nmissing_file_error=Відсутній PDF-файл.\nunexpected_response_error=Неочікувана відповідь сервера.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}}-аннотація]\npassword_label=Введіть пароль для відкриття цього PDF-файла.\npassword_invalid=Невірний пароль. Спробуйте ще.\npassword_ok=Гаразд\npassword_cancel=Скасувати\n\nprinting_not_supported=Попередження: Цей браузер не повністю підтримує друк.\nprinting_not_ready=Попередження: PDF не повністю завантажений для друку.\nweb_fonts_disabled=Веб-шрифти вимкнено: неможливо використати вбудовані у PDF шрифти.\ndocument_colors_not_allowed=PDF-документам не дозволено використовувати власні кольори: в браузері вимкнено параметр «Дозволити сторінкам використовувати власні кольори».\n"
  },
  {
    "path": "pages/include/pdf/locale/ur/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=پچھلا صفحہ\nprevious_label=پچھلا\nnext.title=اگلا صفحہ\nnext_label=آگے\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=صفحہ\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages={{pagesCount}} کا\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} کا {{pagesCount}})\n\nzoom_out.title=باہر زوم کریں\nzoom_out_label=باہر زوم کریں\nzoom_in.title=اندر زوم کریں\nzoom_in_label=اندر زوم کریں\nzoom.title=زوم\npresentation_mode.title=پیشکش موڈ میں چلے جائیں\npresentation_mode_label=پیشکش موڈ\nopen_file.title=مسل کھولیں\nopen_file_label=کھولیں\nprint.title=چھاپیں\nprint_label=چھاپیں\ndownload.title=ڈاؤن لوڈ\ndownload_label=ڈاؤن لوڈ\nbookmark.title=حالیہ نظارہ (نۓ دریچہ میں نقل کریں یا کھولیں)\nbookmark_label=حالیہ نظارہ\n\n# Secondary toolbar and context menu\ntools.title=آلات\ntools_label=آلات\nfirst_page.title=پہلے صفحہ پر جائیں\nfirst_page.label=پہلے صفحہ پر جائیں\nfirst_page_label=پہلے صفحہ پر جائیں\nlast_page.title=آخری صفحہ پر جائیں\nlast_page.label=آخری صفحہ پر جائیں\nlast_page_label=آخری صفحہ پر جائیں\npage_rotate_cw.title=گھڑی وار گھمائیں\npage_rotate_cw.label=گھڑی وار گھمائیں\npage_rotate_cw_label=گھڑی وار گھمائیں\npage_rotate_ccw.title=ضد گھڑی وار گھمائیں\npage_rotate_ccw.label=ضد گھڑی وار گھمائیں\npage_rotate_ccw_label=ضد گھڑی وار گھمائیں\n\n\n# Document properties dialog box\ndocument_properties.title=دستاویز خواص…\ndocument_properties_label=دستاویز خواص…\\u0020\ndocument_properties_file_name=نام مسل:\ndocument_properties_file_size=مسل سائز:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} bytes)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} bytes)\ndocument_properties_title=عنوان:\ndocument_properties_author=تخلیق کار:\ndocument_properties_subject=موضوع:\ndocument_properties_keywords=کلیدی الفاظ:\ndocument_properties_creation_date=تخلیق کی تاریخ:\ndocument_properties_modification_date=ترمیم کی تاریخ:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}، {{time}}\ndocument_properties_creator=تخلیق کار:\ndocument_properties_producer=PDF پیدا کار:\ndocument_properties_version=PDF ورژن:\ndocument_properties_page_count=صفحہ شمار:\ndocument_properties_close=بند کریں\n\nprint_progress_message=چھاپنے کرنے کے لیے دستاویز تیار کیے جا رھے ھیں\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent=*{{progress}}%*\nprint_progress_close=منسوخ کریں\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=سلائیڈ ٹوگل کریں\ntoggle_sidebar_label=سلائیڈ ٹوگل کریں\ndocument_outline.title=دستاویز کی سرخیاں دکھایں (تمام اشیاء وسیع / غائب کرنے کے لیے ڈبل کلک کریں)\ndocument_outline_label=دستاویز آؤٹ لائن\nattachments.title=منسلکات دکھائیں\nattachments_label=منسلکات\nthumbs.title=تھمبنیل دکھائیں\nthumbs_label=مجمل\nfindbar.title=دستاویز میں ڈھونڈیں\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=صفحہ {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=صفحے کا مجمل {{page}}\n\n# Find panel button title and messages\nfind_previous.title=فقرے کا پچھلا وقوع ڈھونڈیں\nfind_previous_label=پچھلا\nfind_next.title=فقرے کا اگلہ وقوع ڈھونڈیں\nfind_next_label=آگے\nfind_highlight=تمام نمایاں کریں\nfind_match_case_label=حروف مشابہ کریں\nfind_reached_top=صفحہ کے شروع پر پہنچ گیا، نیچے سے جاری کیا\nfind_reached_bottom=صفحہ کے اختتام پر پہنچ گیا، اوپر سے جاری کیا\nfind_not_found=فقرا نہیں ملا\n\n# Error panel labels\nerror_more_info=مزید معلومات\nerror_less_info=کم معلومات\nerror_close=بند کریں\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=پیغام: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=سٹیک: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=مسل: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=لائن: {{line}}\nrendering_error=صفحہ بناتے ہوئے نقص آ گیا۔\n\n# Predefined zoom values\npage_scale_width=صفحہ چوڑائی\npage_scale_fit=صفحہ فٹنگ\npage_scale_auto=خودکار زوم\npage_scale_actual=اصل سائز\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=نقص\nloading_error=PDF لوڈ کرتے وقت نقص آ گیا۔\ninvalid_file_error=ناجائز یا خراب PDF مسل\nmissing_file_error=PDF مسل غائب ہے۔\nunexpected_response_error=غیرمتوقع پیش کار جواب\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} نوٹ]\npassword_label=PDF مسل کھولنے کے لیے پاس ورڈ داخل کریں.\npassword_invalid=ناجائز پاس ورڈ. براےؑ کرم دوبارہ کوشش کریں.\npassword_ok=سہی\npassword_cancel=منسوخ کریں\n\nprinting_not_supported=تنبیہ:چھاپنا اس براؤزر پر پوری طرح معاونت شدہ نہیں ہے۔\nprinting_not_ready=تنبیہ: PDF چھپائی کے لیے پوری طرح لوڈ نہیں ہوئی۔\nweb_fonts_disabled=ویب فانٹ نا اہل ہیں: شامل PDF فانٹ استعمال کرنے میں ناکام۔\ndocument_colors_not_allowed=PDF دستاویزات کو اپنے رنگ استعمال کرنے کی اجازت نہیں: 'صفحات کو اپنے رنگ چنیں' کی اِجازت براؤزر میں بے عمل ہے۔\n"
  },
  {
    "path": "pages/include/pdf/locale/vi/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Trang Trước\nprevious_label=Trước\nnext.title=Trang Sau\nnext_label=Tiếp\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=trên {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} trên {{pagesCount}})\n\nzoom_out.title=Thu nhỏ\nzoom_out_label=Thu nhỏ\nzoom_in.title=Phóng to\nzoom_in_label=Phóng to\nzoom.title=Chỉnh kích thước\npresentation_mode.title=Chuyển sang chế độ trình chiếu\npresentation_mode_label=Chế độ trình chiếu\nopen_file.title=Mở tập tin\nopen_file_label=Mở tập tin\nprint.title=In\nprint_label=In\ndownload.title=Tải xuống\ndownload_label=Tải xuống\nbookmark.title=Góc nhìn hiện tại (copy hoặc mở trong cửa sổ mới)\nbookmark_label=Chế độ xem hiện tại\n\n# Secondary toolbar and context menu\ntools.title=Công cụ\ntools_label=Công cụ\nfirst_page.title=Về trang đầu\nfirst_page.label=Về trang đầu\nfirst_page_label=Về trang đầu\nlast_page.title=Đến trang cuối\nlast_page.label=Đến trang cuối\nlast_page_label=Đến trang cuối\npage_rotate_cw.title=Xoay theo chiều kim đồng hồ\npage_rotate_cw.label=Xoay theo chiều kim đồng hồ\npage_rotate_cw_label=Xoay theo chiều kim đồng hồ\npage_rotate_ccw.title=Xoay ngược chiều kim đồng hồ\npage_rotate_ccw.label=Xoay ngược chiều kim đồng hồ\npage_rotate_ccw_label=Xoay ngược chiều kim đồng hồ\n\n\n# Document properties dialog box\ndocument_properties.title=Thuộc tính của tài liệu…\ndocument_properties_label=Thuộc tính của tài liệu…\ndocument_properties_file_name=Tên tập tin:\ndocument_properties_file_size=Kích thước:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} byte)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} byte)\ndocument_properties_title=Tiêu đề:\ndocument_properties_author=Tác giả:\ndocument_properties_subject=Chủ đề:\ndocument_properties_keywords=Từ khóa:\ndocument_properties_creation_date=Ngày tạo:\ndocument_properties_modification_date=Ngày sửa đổi:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Người tạo:\ndocument_properties_producer=Phần mềm tạo PDF:\ndocument_properties_version=Phiên bản PDF:\ndocument_properties_page_count=Tổng số trang:\ndocument_properties_close=Ðóng\n\nprint_progress_message=Chuẩn bị trang để in…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Bật/Tắt thanh lề\ntoggle_sidebar_label=Bật/Tắt thanh lề\ndocument_outline_label=Bản phác tài liệu\nattachments.title=Hiện nội dung đính kèm\nattachments_label=Nội dung đính kèm\nthumbs.title=Hiển thị ảnh thu nhỏ\nthumbs_label=Ảnh thu nhỏ\nfindbar.title=Tìm trong tài liệu\nfindbar_label=Tìm\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Trang {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Ảnh thu nhỏ của trang {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Tìm cụm từ ở phần trước\nfind_previous_label=Trước\nfind_next.title=Tìm cụm từ ở phần sau\nfind_next_label=Tiếp\nfind_highlight=Tô sáng tất cả\nfind_match_case_label=Phân biệt hoa, thường\nfind_reached_top=Đã đến phần đầu tài liệu, quay trở lại từ cuối\nfind_reached_bottom=Đã đến phần cuối của tài liệu, quay trở lại từ đầu\nfind_not_found=Không tìm thấy cụm từ này\n\n# Error panel labels\nerror_more_info=Thông tin thêm\nerror_less_info=Hiển thị ít thông tin hơn\nerror_close=Đóng\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Thông điệp: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Stack: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Tập tin: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Dòng: {{line}}\nrendering_error=Lỗi khi hiển thị trang.\n\n# Predefined zoom values\npage_scale_width=Vừa chiều rộng\npage_scale_fit=Vừa chiều cao\npage_scale_auto=Tự động chọn kích thước\npage_scale_actual=Kích thước thực\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Lỗi\nloading_error=Lỗi khi tải tài liệu PDF.\ninvalid_file_error=Tập tin PDF hỏng hoặc không hợp lệ.\nmissing_file_error=Thiếu tập tin PDF.\nunexpected_response_error=Máy chủ có phản hồi lạ.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Chú thích]\npassword_label=Nhập mật khẩu để mở tập tin PDF này.\npassword_invalid=Mật khẩu không đúng. Vui lòng thử lại.\npassword_ok=OK\n\nprinting_not_supported=Cảnh báo: In ấn không được hỗ trợ đầy đủ ở trình duyệt này.\nprinting_not_ready=Cảnh báo: PDF chưa được tải hết để in.\nweb_fonts_disabled=Phông chữ Web bị vô hiệu hóa: không thể sử dụng các phông chữ PDF được nhúng.\ndocument_colors_not_allowed=Tài liệu PDF không được cho phép dùng màu riêng: 'Cho phép trang chọn màu riêng' đã bị tắt trên trình duyệt.\n"
  },
  {
    "path": "pages/include/pdf/locale/wo/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Xët wi jiitu\nprevious_label=Bi jiitu\nnext.title=Xët wi ci topp\nnext_label=Bi ci topp\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Wàññi\nzoom_out_label=Wàññi\nzoom_in.title=Yaatal\nzoom_in_label=Yaatal\nzoom.title=Yambalaŋ\npresentation_mode.title=Wañarñil ci anamu wone\npresentation_mode_label=Anamu Wone\nopen_file.title=Ubbi benn dencukaay\nopen_file_label=Ubbi\nprint.title=Móol\nprint_label=Móol\ndownload.title=Yeb yi\ndownload_label=Yeb yi\nbookmark.title=Wone bi taxaw (duppi walla ubbi palanteer bu bees)\nbookmark_label=Wone bi feeñ\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Bopp:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\nthumbs.title=Wone nataal yu ndaw yi\nthumbs_label=Nataal yu ndaw yi\nfindbar.title=Gis ci biir jukki bi\nfindbar_label=Wut\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Xët {{xët}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Wiñet bu xët{{xët}}\n\n# Find panel button title and messages\nfind_previous.title=Seet beneen kaddu bu ni mel te jiitu\nfind_previous_label=Bi jiitu\nfind_next.title=Seet beneen kaddu bu ni mel\nfind_next_label=Bi ci topp\nfind_highlight=Melaxal lépp\nfind_match_case_label=Sàmm jëmmalin wi\nfind_reached_top=Jot nañu ndorteel xët wi, kontine dale ko ci suuf\nfind_reached_bottom=Jot nañu jeexitalu xët wi, kontine ci ndorte\nfind_not_found=Gisiñu kaddu gi\n\n# Error panel labels\nerror_more_info=Xibaar yu gën bari\nerror_less_info=Xibaar yu gën bari\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Bataaxal: {{bataaxal}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Juug: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Dencukaay: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Rëdd : {{line}}\nrendering_error=Am njumte bu am bi xët bi di wonewu.\n\n# Predefined zoom values\npage_scale_width=Yaatuwaay bu mët\npage_scale_fit=Xët lëmm\npage_scale_auto=Yambalaŋ ci saa si\npage_scale_actual=Dayo bi am\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Njumte\nloading_error=Am na njumte ci yebum dencukaay PDF bi.\ninvalid_file_error=Dencukaay PDF bi baaxul walla mu sankar.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Karmat {{type}}]\npassword_ok=OK\npassword_cancel=Neenal\n\nprinting_not_supported=Artu: Joowkat bii nanguwul lool mool.\n"
  },
  {
    "path": "pages/include/pdf/locale/xh/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Iphepha langaphambili\nprevious_label=Okwangaphambili\nnext.title=Iphepha elilandelayo\nnext_label=Okulandelayo\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=Iphepha\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=kwali- {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} kwali {{pagesCount}})\n\nzoom_out.title=Bhekelisela Kudana\nzoom_out_label=Bhekelisela Kudana\nzoom_in.title=Sondeza Kufuphi\nzoom_in_label=Sondeza Kufuphi\nzoom.title=Yandisa / Nciphisa\npresentation_mode.title=Tshintshela kwimo yonikezelo\npresentation_mode_label=Imo yonikezelo\nopen_file.title=Vula Ifayile\nopen_file_label=Vula\nprint.title=Printa\nprint_label=Printa\ndownload.title=Khuphela\ndownload_label=Khuphela\nbookmark.title=Imbonakalo ekhoyo (kopa okanye vula kwifestile entsha)\nbookmark_label=Imbonakalo ekhoyo\n\n# Secondary toolbar and context menu\ntools.title=Izixhobo zemiyalelo\ntools_label=Izixhobo zemiyalelo\nfirst_page.title=Yiya kwiphepha lokuqala\nfirst_page.label=Yiya kwiphepha lokuqala\nfirst_page_label=Yiya kwiphepha lokuqala\nlast_page.title=Yiya kwiphepha lokugqibela\nlast_page.label=Yiya kwiphepha lokugqibela\nlast_page_label=Yiya kwiphepha lokugqibela\npage_rotate_cw.title=Jikelisa ngasekunene\npage_rotate_cw.label=Jikelisa ngasekunene\npage_rotate_cw_label=Jikelisa ngasekunene\npage_rotate_ccw.title=Jikelisa ngasekhohlo\npage_rotate_ccw.label=Jikelisa ngasekhohlo\npage_rotate_ccw_label=Jikelisa ngasekhohlo\n\ncursor_text_select_tool.title=Vumela iSixhobo sokuKhetha iTeksti\ncursor_text_select_tool_label=ISixhobo sokuKhetha iTeksti\ncursor_hand_tool.title=Yenza iSixhobo seSandla siSebenze\ncursor_hand_tool_label=ISixhobo seSandla\n\n# Document properties dialog box\ndocument_properties.title=Iipropati zoxwebhu…\ndocument_properties_label=Iipropati zoxwebhu…\ndocument_properties_file_name=Igama lefayile:\ndocument_properties_file_size=Isayizi yefayile:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB (iibhayiti{{size_b}})\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB (iibhayithi{{size_b}})\ndocument_properties_title=Umxholo:\ndocument_properties_author=Umbhali:\ndocument_properties_subject=Umbandela:\ndocument_properties_keywords=Amagama aphambili:\ndocument_properties_creation_date=Umhla wokwenziwa kwayo:\ndocument_properties_modification_date=Umhla wokulungiswa kwayo:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=Umntu oyenzileyo:\ndocument_properties_producer=Umvelisi we-PDF:\ndocument_properties_version=Uhlelo lwe-PDF:\ndocument_properties_page_count=Inani lamaphepha:\ndocument_properties_close=Vala\n\nprint_progress_message=Ilungisa uxwebhu ukuze iprinte…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=Rhoxisa\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=Togola ngebha eseCaleni\ntoggle_sidebar_notification.title=ISidebar yeQhosha (uxwebhu lunolwandlalo/iziqhotyoshelwa)\ntoggle_sidebar_label=Togola ngebha eseCaleni\ndocument_outline.title=Bonisa uLwandlalo loXwebhu (cofa kabini ukuze wandise/diliza zonke izinto)\ndocument_outline_label=Isishwankathelo soxwebhu\nattachments.title=Bonisa iziqhotyoshelwa\nattachments_label=Iziqhoboshelo\nthumbs.title=Bonisa ukrobiso kumfanekiso\nthumbs_label=Ukrobiso kumfanekiso\nfindbar.title=Fumana kuXwebhu\nfindbar_label=Fumana\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Iphepha {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Ukrobiso kumfanekiso wephepha {{page}}\n\n# Find panel button title and messages\nfind_input.title=Fumana\nfind_input.placeholder=Fumana kuXwebhu…\nfind_previous.title=Fumanisa isenzeko sangaphambili sebinzana lamagama\nfind_previous_label=Okwangaphambili\nfind_next.title=Fumanisa isenzeko esilandelayo sebinzana lamagama\nfind_next_label=Okulandelayo\nfind_highlight=Qaqambisa konke\nfind_match_case_label=Tshatisa ngobukhulu bukanobumba\nfind_reached_top=Ufike ngaphezulu ephepheni, kusukwa ngezantsi\nfind_reached_bottom=Ufike ekupheleni kwephepha, kusukwa ngaphezulu\nfind_not_found=Ibinzana alifunyenwanga\n\n# Error panel labels\nerror_more_info=Inkcazelo Engakumbi\nerror_less_info=Inkcazelo Encinane\nerror_close=Vala\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=I-PDF.js v{{version}} (yakha: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Umyalezo: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Imfumba: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ifayile: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Umgca: {{line}}\nrendering_error=Imposiso yenzekile xa bekunikezelwa iphepha.\n\n# Predefined zoom values\npage_scale_width=Ububanzi bephepha\npage_scale_fit=Ukulinganiswa kwephepha\npage_scale_auto=Ukwandisa/Ukunciphisa Ngokwayo\npage_scale_actual=Ubungakanani bokwenene\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=Imposiso\nloading_error=Imposiso yenzekile xa kulayishwa i-PDF.\ninvalid_file_error=Ifayile ye-PDF engeyiyo okanye eyonakalisiweyo.\nmissing_file_error=Ifayile ye-PDF edukileyo.\nunexpected_response_error=Impendulo yeseva engalindelekanga.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} Ubhalo-nqaku]\npassword_label=Faka ipasiwedi ukuze uvule le fayile yePDF.\npassword_invalid=Ipasiwedi ayisebenzi. Nceda uzame kwakhona.\npassword_ok=KULUNGILE\npassword_cancel=Rhoxisa\n\nprinting_not_supported=Isilumkiso: Ukuprinta akuxhaswa ngokupheleleyo yile bhrawuza.\nprinting_not_ready=Isilumkiso: IPDF ayihlohlwanga ngokupheleleyo ukwenzela ukuprinta.\nweb_fonts_disabled=Iifonti zewebhu ziqhwalelisiwe: ayikwazi ukusebenzisa iifonti ze-PDF ezincanyathelisiweyo.\ndocument_colors_not_allowed=Amaxwebhu ePDF akavumelekanga ukuba asebenzise imibala yawo: 'Ukuvumela amaphepha ukuba asebenzise eyawo imibala' kuvaliwe ukuba kungasebenzi kwibhrawuza.\n"
  },
  {
    "path": "pages/include/pdf/locale/zh-CN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=上一页\nprevious_label=上一页\nnext.title=下一页\nnext_label=下一页\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=页面\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=/ {{pagesCount}}\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=({{pageNumber}} / {{pagesCount}})\n\nzoom_out.title=缩小\nzoom_out_label=缩小\nzoom_in.title=放大\nzoom_in_label=放大\nzoom.title=缩放\npresentation_mode.title=切换到演示模式\npresentation_mode_label=演示模式\nopen_file.title=打开文件\nopen_file_label=打开\nprint.title=打印\nprint_label=打印\ndownload.title=下载\ndownload_label=下载\nbookmark.title=当前在看的内容（复制或在新窗口中打开）\nbookmark_label=当前在看\n\n# Secondary toolbar and context menu\ntools.title=工具\ntools_label=工具\nfirst_page.title=转到第一页\nfirst_page.label=转到第一页\nfirst_page_label=转到第一页\nlast_page.title=转到最后一页\nlast_page.label=转到最后一页\nlast_page_label=转到最后一页\npage_rotate_cw.title=顺时针旋转\npage_rotate_cw.label=顺时针旋转\npage_rotate_cw_label=顺时针旋转\npage_rotate_ccw.title=逆时针旋转\npage_rotate_ccw.label=逆时针旋转\npage_rotate_ccw_label=逆时针旋转\n\ncursor_text_select_tool.title=启用文本选择工具\ncursor_text_select_tool_label=文本选择工具\ncursor_hand_tool.title=启用手形工具\ncursor_hand_tool_label=手形工具\n\n# Document properties dialog box\ndocument_properties.title=文档属性…\ndocument_properties_label=文档属性…\ndocument_properties_file_name=文件名:\ndocument_properties_file_size=文件大小:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB ({{size_b}} 字节)\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB ({{size_b}} 字节)\ndocument_properties_title=标题:\ndocument_properties_author=作者:\ndocument_properties_subject=主题:\ndocument_properties_keywords=关键词:\ndocument_properties_creation_date=创建日期:\ndocument_properties_modification_date=修改日期:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=创建者:\ndocument_properties_producer=PDF 制作者:\ndocument_properties_version=PDF 版本:\ndocument_properties_page_count=页数:\ndocument_properties_close=关闭\n\nprint_progress_message=正在准备打印文档…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=取消\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=切换侧栏\ntoggle_sidebar_notification.title=切换侧栏（文档所含的大纲/附件）\ntoggle_sidebar_label=切换侧栏\ndocument_outline.title=显示文档大纲（双击展开/折叠所有项）\ndocument_outline_label=文档大纲\nattachments.title=显示附件\nattachments_label=附件\nthumbs.title=显示缩略图\nthumbs_label=缩略图\nfindbar.title=在文档中查找\nfindbar_label=查找\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=页码 {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=页面 {{page}} 的缩略图\n\n# Find panel button title and messages\nfind_input.title=查找\nfind_input.placeholder=在文档中查找…\nfind_previous.title=查找词语上一次出现的位置\nfind_previous_label=上一页\nfind_next.title=查找词语后一次出现的位置\nfind_next_label=下一页\nfind_highlight=全部高亮显示\nfind_match_case_label=区分大小写\nfind_reached_top=到达文档开头，从末尾继续\nfind_reached_bottom=到达文档末尾，从开头继续\nfind_not_found=找不到指定词语\n\n# Error panel labels\nerror_more_info=更多信息\nerror_less_info=更少信息\nerror_close=关闭\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=信息：{{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=堆栈：{{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=文件：{{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=行号：{{line}}\nrendering_error=渲染页面时发生错误。\n\n# Predefined zoom values\npage_scale_width=适合页宽\npage_scale_fit=适合页面\npage_scale_auto=自动缩放\npage_scale_actual=实际大小\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=错误\nloading_error=载入PDF时发生错误。\ninvalid_file_error=无效或损坏的PDF文件。\nmissing_file_error=缺少PDF文件。\nunexpected_response_error=意外的服务器响应。\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} 注解]\npassword_label=输入密码以打开此 PDF 文件。\npassword_invalid=密码无效。请重试。\npassword_ok=确定\npassword_cancel=取消\n\nprinting_not_supported=警告：此浏览器尚未完整支持打印功能。\nprinting_not_ready=警告：该 PDF 未完全载入以供打印。\nweb_fonts_disabled=Web 字体已被禁用：无法使用嵌入的PDF字体。\ndocument_colors_not_allowed=不允许 PDF 文档使用自己的颜色：浏览器中“允许页面选择自己的颜色”的选项已停用。\n"
  },
  {
    "path": "pages/include/pdf/locale/zh-TW/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=上一頁\nprevious_label=上一頁\nnext.title=下一頁\nnext_label=下一頁\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\npage.title=第\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\nof_pages=頁，共 {{pagesCount}} 頁\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\npage_of_pages=（第 {{pageNumber}} 頁，共 {{pagesCount}} 頁）\n\nzoom_out.title=縮小\nzoom_out_label=縮小\nzoom_in.title=放大\nzoom_in_label=放大\nzoom.title=縮放\npresentation_mode.title=切換至簡報模式\npresentation_mode_label=簡報模式\nopen_file.title=開啟檔案\nopen_file_label=開啟\nprint.title=列印\nprint_label=列印\ndownload.title=下載\ndownload_label=下載\nbookmark.title=目前檢視的內容（複製或開啟於新視窗）\nbookmark_label=目前檢視\n\n# Secondary toolbar and context menu\ntools.title=工具\ntools_label=工具\nfirst_page.title=跳到第一頁\nfirst_page.label=跳到第一頁\nfirst_page_label=跳到第一頁\nlast_page.title=跳到最後一頁\nlast_page.label=跳到最後一頁\nlast_page_label=跳到最後一頁\npage_rotate_cw.title=順時針旋轉\npage_rotate_cw.label=順時針旋轉\npage_rotate_cw_label=順時針旋轉\npage_rotate_ccw.title=逆時針旋轉\npage_rotate_ccw.label=逆時針旋轉\npage_rotate_ccw_label=逆時針旋轉\n\ncursor_text_select_tool.title=開啟文字選擇工具\ncursor_text_select_tool_label=文字選擇工具\ncursor_hand_tool.title=開啟頁面移動工具\ncursor_hand_tool_label=頁面移動工具\n\n# Document properties dialog box\ndocument_properties.title=文件內容…\ndocument_properties_label=文件內容…\ndocument_properties_file_name=檔案名稱:\ndocument_properties_file_size=檔案大小:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\ndocument_properties_kb={{size_kb}} KB（{{size_b}} 位元組）\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_mb={{size_mb}} MB（{{size_b}} 位元組）\ndocument_properties_title=標題:\ndocument_properties_author=作者:\ndocument_properties_subject=主旨:\ndocument_properties_keywords=關鍵字:\ndocument_properties_creation_date=建立日期:\ndocument_properties_modification_date=修改日期:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=建立者:\ndocument_properties_producer=PDF 產生器:\ndocument_properties_version=PDF 版本:\ndocument_properties_page_count=頁數:\ndocument_properties_close=關閉\n\nprint_progress_message=正在準備列印文件…\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\nprint_progress_percent={{progress}}%\nprint_progress_close=取消\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=切換側邊欄\ntoggle_sidebar_notification.title=切換側邊攔（文件包含大綱或附件）\ntoggle_sidebar_label=切換側邊欄\ndocument_outline.title=顯示文件大綱（雙擊展開/摺疊所有項目）\ndocument_outline_label=文件大綱\nattachments.title=顯示附件\nattachments_label=附件\nthumbs.title=顯示縮圖\nthumbs_label=縮圖\nfindbar.title=在文件中尋找\nfindbar_label=尋找\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=頁 {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=頁 {{page}} 的縮圖\n\n# Find panel button title and messages\nfind_input.title=搜尋\nfind_input.placeholder=在文件中搜尋…\nfind_previous.title=尋找文字前次出現的位置\nfind_previous_label=上一個\nfind_next.title=尋找文字下次出現的位置\nfind_next_label=下一個\nfind_highlight=全部強調標示\nfind_match_case_label=區分大小寫\nfind_reached_top=已搜尋至文件頂端，自底端繼續搜尋\nfind_reached_bottom=已搜尋至文件底端，自頂端繼續搜尋\nfind_not_found=找不到指定文字\n\n# Error panel labels\nerror_more_info=更多資訊\nerror_less_info=更少資訊\nerror_close=關閉\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=訊息: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=堆疊: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=檔案: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=行: {{line}}\nrendering_error=描繪頁面時發生錯誤。\n\n# Predefined zoom values\npage_scale_width=頁面寬度\npage_scale_fit=縮放至頁面大小\npage_scale_auto=自動縮放\npage_scale_actual=實際大小\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=錯誤\nloading_error=載入 PDF 時發生錯誤。\ninvalid_file_error=無效或毀損的 PDF 檔案。\nmissing_file_error=找不到 PDF 檔案。\nunexpected_response_error=伺服器回應未預期的內容。\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} 註解]\npassword_label=請輸入用來開啟此 PDF 檔案的密碼。\npassword_invalid=密碼不正確，請再試一次。\npassword_ok=確定\npassword_cancel=取消\n\nprinting_not_supported=警告: 此瀏覽器未完整支援列印功能。\nprinting_not_ready=警告: 此 PDF 未完成下載以供列印。\nweb_fonts_disabled=已停用網路字型 (Web fonts): 無法使用 PDF 內嵌字型。\ndocument_colors_not_allowed=瀏覽器的「優先使用網頁指定的色彩」未被勾選，PDF 文件無法使用自己的色彩。\n"
  },
  {
    "path": "pages/include/pdf/locale/zu/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=Ikhasi eledlule\nprevious_label=Okudlule\nnext.title=Ikhasi elilandelayo\nnext_label=Okulandelayo\n\n# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.\n# LOCALIZATION NOTE (of_pages): \"{{pagesCount}}\" will be replaced by a number\n# representing the total number of pages in the document.\n# LOCALIZATION NOTE (page_of_pages): \"{{pageNumber}}\" and \"{{pagesCount}}\"\n# will be replaced by a number representing the currently visible page,\n# respectively a number representing the total number of pages in the document.\n\nzoom_out.title=Hlehlisela emuva\nzoom_out_label=Hlehlisela emuva\nzoom_in.title=Sondeza eduze\nzoom_in_label=Sondeza eduze\nzoom.title=Lwiza\npresentation_mode.title=Guqulela kwindlela yesethulo\npresentation_mode_label=Indlelo yesethulo\nopen_file.title=Vula ifayela\nopen_file_label=Vula\nprint.title=Phrinta\nprint_label=Phrinta\ndownload.title=Landa\ndownload_label=Landa\nbookmark.title=Ukubuka kwamanje (kopisha noma vula kwifasitela elisha)\nbookmark_label=Ukubuka kwamanje\n\n# Secondary toolbar and context menu\n\n\n# Document properties dialog box\ndocument_properties_file_name=Igama lefayela:\n# LOCALIZATION NOTE (document_properties_kb): \"{{size_kb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in kilobytes, respectively in bytes.\n# LOCALIZATION NOTE (document_properties_mb): \"{{size_mb}}\" and \"{{size_b}}\"\n# will be replaced by the PDF file size in megabytes, respectively in bytes.\ndocument_properties_title=Isihloko:\n# LOCALIZATION NOTE (document_properties_date_string): \"{{date}}\" and \"{{time}}\"\n# will be replaced by the creation/modification date, and time, of the PDF file.\n\n# LOCALIZATION NOTE (print_progress_percent): \"{{progress}}\" will be replaced by\n# a numerical per cent value.\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=I-toggle yebha yaseceleni\ntoggle_sidebar_label=i-toggle yebha yaseceleni\ndocument_outline_label=Umugqa waseceleni wedokhumenti\nthumbs.title=Bonisa izithombe ezincane\nthumbs_label=Izithonjana\nfindbar.title=Thola kwidokhumenti\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=Ikhasi {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=Isithonjana sekhasi {{page}}\n\n# Find panel button title and messages\nfind_previous.title=Thola indawo eyandulelayo okuvela kuyo lomshwana\nfind_previous_label=Okudlulile\nfind_next.title=Thola enye indawo okuvela kuyo lomshwana\nfind_next_label=Okulandelayo\nfind_highlight=Gqamisa konke\nfind_match_case_label=Fanisa ikheyisi\nfind_reached_top=Finyelele phezulu kwidokhumenti, qhubeka kusukaphansi\nfind_reached_bottom=Ifinyelele ekupheleni kwedokhumenti, qhubeka kusukaphezulu\nfind_not_found=Umshwana awutholakali\n\n# Error panel labels\nerror_more_info=Ukwaziswa Okwengeziwe\nerror_less_info=Ukwazi okuncane\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=Umlayezo: {{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=Isitaki: {{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=Ifayela: {{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=Umugqa: {{line}}\nrendering_error=Iphutha lenzekile uma kunikwa ikhasi.\n\n# Predefined zoom values\npage_scale_width=Ububanzi bekhasi\npage_scale_fit=Ukulingana kwekhasi\npage_scale_auto=Ukulwiza okuzenzekalelayo\npage_scale_actual=Usayizi Wangempela\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\n\n# Loading indicator messages\nloading_error_indicator=Iphutha\nloading_error=Kwenzeke iphutha uma kulayishwa i-PDF.\ninvalid_file_error=Ifayela le-PDF elingavumelekile noma elonakele.\nmissing_file_error=Ifayela le-PDF elilahlekile.\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[Amazwibela e-{{type}}]\npassword_ok=Kulungile\n\nprinting_not_supported=Isixwayiso: Ukuphrinta akuxhasiwe yilesisiphequluli ngokugcwele.\nprinting_not_ready=Isixwayiso: I-PDF ayikalayishwa ngokuphelele yiPhrinta.\nweb_fonts_disabled=Amafonti e-webhu akutshaziwe: ayikwazi ukusebenzisa amafonti abekiwe e-PDF.\\u0020\ndocument_colors_not_allowed=Amadokhumenti we-PDF awavumelekile ukusebenzisa imibalo yayo: 'Vumela amakhasi ukukhetha imibala yayo' ayisebenzi kusiphequluli.\n"
  },
  {
    "path": "pages/include/pdf/pdf.js",
    "content": "/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"pdfjs-dist/build/pdf\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"pdfjs-dist/build/pdf\"] = factory();\n\telse\n\t\troot[\"pdfjs-dist/build/pdf\"] = root.pdfjsDistBuildPdf = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __w_pdfjs_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__w_pdfjs_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__w_pdfjs_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__w_pdfjs_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__w_pdfjs_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__w_pdfjs_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__w_pdfjs_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__w_pdfjs_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__w_pdfjs_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__w_pdfjs_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __w_pdfjs_require__(__w_pdfjs_require__.s = 15);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.unreachable = exports.warn = exports.utf8StringToString = exports.stringToUTF8String = exports.stringToPDFString = exports.stringToBytes = exports.string32 = exports.shadow = exports.setVerbosityLevel = exports.ReadableStream = exports.removeNullCharacters = exports.readUint32 = exports.readUint16 = exports.readInt8 = exports.log2 = exports.loadJpegStream = exports.isEvalSupported = exports.isLittleEndian = exports.createValidAbsoluteUrl = exports.isSameOrigin = exports.isNodeJS = exports.isSpace = exports.isString = exports.isNum = exports.isInt = exports.isEmptyObj = exports.isBool = exports.isArrayBuffer = exports.isArray = exports.info = exports.globalScope = exports.getVerbosityLevel = exports.getLookupTableFactory = exports.deprecated = exports.createObjectURL = exports.createPromiseCapability = exports.createBlob = exports.bytesToString = exports.assert = exports.arraysToBytes = exports.arrayByteLength = exports.FormatError = exports.XRefParseException = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.StatTimer = exports.PasswordResponses = exports.PasswordException = exports.PageViewport = exports.NotImplementedException = exports.NativeImageDecoding = exports.MissingPDFException = exports.MissingDataException = exports.MessageHandler = exports.InvalidPDFException = exports.AbortException = exports.CMapCompressionType = exports.ImageKind = exports.FontType = exports.AnnotationType = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.UNSUPPORTED_FEATURES = exports.VERBOSITY_LEVELS = exports.OPS = exports.IDENTITY_MATRIX = exports.FONT_IDENTITY_MATRIX = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n__w_pdfjs_require__(16);\n\nvar _streams_polyfill = __w_pdfjs_require__(17);\n\nvar globalScope = typeof window !== 'undefined' && window.Math === Math ? window : typeof global !== 'undefined' && global.Math === Math ? global : typeof self !== 'undefined' && self.Math === Math ? self : undefined;\nvar FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\nvar NativeImageDecoding = {\n  NONE: 'none',\n  DECODE: 'decode',\n  DISPLAY: 'display'\n};\nvar TextRenderingMode = {\n  FILL: 0,\n  STROKE: 1,\n  FILL_STROKE: 2,\n  INVISIBLE: 3,\n  FILL_ADD_TO_PATH: 4,\n  STROKE_ADD_TO_PATH: 5,\n  FILL_STROKE_ADD_TO_PATH: 6,\n  ADD_TO_PATH: 7,\n  FILL_STROKE_MASK: 3,\n  ADD_TO_PATH_FLAG: 4\n};\nvar ImageKind = {\n  GRAYSCALE_1BPP: 1,\n  RGB_24BPP: 2,\n  RGBA_32BPP: 3\n};\nvar AnnotationType = {\n  TEXT: 1,\n  LINK: 2,\n  FREETEXT: 3,\n  LINE: 4,\n  SQUARE: 5,\n  CIRCLE: 6,\n  POLYGON: 7,\n  POLYLINE: 8,\n  HIGHLIGHT: 9,\n  UNDERLINE: 10,\n  SQUIGGLY: 11,\n  STRIKEOUT: 12,\n  STAMP: 13,\n  CARET: 14,\n  INK: 15,\n  POPUP: 16,\n  FILEATTACHMENT: 17,\n  SOUND: 18,\n  MOVIE: 19,\n  WIDGET: 20,\n  SCREEN: 21,\n  PRINTERMARK: 22,\n  TRAPNET: 23,\n  WATERMARK: 24,\n  THREED: 25,\n  REDACT: 26\n};\nvar AnnotationFlag = {\n  INVISIBLE: 0x01,\n  HIDDEN: 0x02,\n  PRINT: 0x04,\n  NOZOOM: 0x08,\n  NOROTATE: 0x10,\n  NOVIEW: 0x20,\n  READONLY: 0x40,\n  LOCKED: 0x80,\n  TOGGLENOVIEW: 0x100,\n  LOCKEDCONTENTS: 0x200\n};\nvar AnnotationFieldFlag = {\n  READONLY: 0x0000001,\n  REQUIRED: 0x0000002,\n  NOEXPORT: 0x0000004,\n  MULTILINE: 0x0001000,\n  PASSWORD: 0x0002000,\n  NOTOGGLETOOFF: 0x0004000,\n  RADIO: 0x0008000,\n  PUSHBUTTON: 0x0010000,\n  COMBO: 0x0020000,\n  EDIT: 0x0040000,\n  SORT: 0x0080000,\n  FILESELECT: 0x0100000,\n  MULTISELECT: 0x0200000,\n  DONOTSPELLCHECK: 0x0400000,\n  DONOTSCROLL: 0x0800000,\n  COMB: 0x1000000,\n  RICHTEXT: 0x2000000,\n  RADIOSINUNISON: 0x2000000,\n  COMMITONSELCHANGE: 0x4000000\n};\nvar AnnotationBorderStyleType = {\n  SOLID: 1,\n  DASHED: 2,\n  BEVELED: 3,\n  INSET: 4,\n  UNDERLINE: 5\n};\nvar StreamType = {\n  UNKNOWN: 0,\n  FLATE: 1,\n  LZW: 2,\n  DCT: 3,\n  JPX: 4,\n  JBIG: 5,\n  A85: 6,\n  AHX: 7,\n  CCF: 8,\n  RL: 9\n};\nvar FontType = {\n  UNKNOWN: 0,\n  TYPE1: 1,\n  TYPE1C: 2,\n  CIDFONTTYPE0: 3,\n  CIDFONTTYPE0C: 4,\n  TRUETYPE: 5,\n  CIDFONTTYPE2: 6,\n  TYPE3: 7,\n  OPENTYPE: 8,\n  TYPE0: 9,\n  MMTYPE1: 10\n};\nvar VERBOSITY_LEVELS = {\n  errors: 0,\n  warnings: 1,\n  infos: 5\n};\nvar CMapCompressionType = {\n  NONE: 0,\n  BINARY: 1,\n  STREAM: 2\n};\nvar OPS = {\n  dependency: 1,\n  setLineWidth: 2,\n  setLineCap: 3,\n  setLineJoin: 4,\n  setMiterLimit: 5,\n  setDash: 6,\n  setRenderingIntent: 7,\n  setFlatness: 8,\n  setGState: 9,\n  save: 10,\n  restore: 11,\n  transform: 12,\n  moveTo: 13,\n  lineTo: 14,\n  curveTo: 15,\n  curveTo2: 16,\n  curveTo3: 17,\n  closePath: 18,\n  rectangle: 19,\n  stroke: 20,\n  closeStroke: 21,\n  fill: 22,\n  eoFill: 23,\n  fillStroke: 24,\n  eoFillStroke: 25,\n  closeFillStroke: 26,\n  closeEOFillStroke: 27,\n  endPath: 28,\n  clip: 29,\n  eoClip: 30,\n  beginText: 31,\n  endText: 32,\n  setCharSpacing: 33,\n  setWordSpacing: 34,\n  setHScale: 35,\n  setLeading: 36,\n  setFont: 37,\n  setTextRenderingMode: 38,\n  setTextRise: 39,\n  moveText: 40,\n  setLeadingMoveText: 41,\n  setTextMatrix: 42,\n  nextLine: 43,\n  showText: 44,\n  showSpacedText: 45,\n  nextLineShowText: 46,\n  nextLineSetSpacingShowText: 47,\n  setCharWidth: 48,\n  setCharWidthAndBounds: 49,\n  setStrokeColorSpace: 50,\n  setFillColorSpace: 51,\n  setStrokeColor: 52,\n  setStrokeColorN: 53,\n  setFillColor: 54,\n  setFillColorN: 55,\n  setStrokeGray: 56,\n  setFillGray: 57,\n  setStrokeRGBColor: 58,\n  setFillRGBColor: 59,\n  setStrokeCMYKColor: 60,\n  setFillCMYKColor: 61,\n  shadingFill: 62,\n  beginInlineImage: 63,\n  beginImageData: 64,\n  endInlineImage: 65,\n  paintXObject: 66,\n  markPoint: 67,\n  markPointProps: 68,\n  beginMarkedContent: 69,\n  beginMarkedContentProps: 70,\n  endMarkedContent: 71,\n  beginCompat: 72,\n  endCompat: 73,\n  paintFormXObjectBegin: 74,\n  paintFormXObjectEnd: 75,\n  beginGroup: 76,\n  endGroup: 77,\n  beginAnnotations: 78,\n  endAnnotations: 79,\n  beginAnnotation: 80,\n  endAnnotation: 81,\n  paintJpegXObject: 82,\n  paintImageMaskXObject: 83,\n  paintImageMaskXObjectGroup: 84,\n  paintImageXObject: 85,\n  paintInlineImageXObject: 86,\n  paintInlineImageXObjectGroup: 87,\n  paintImageXObjectRepeat: 88,\n  paintImageMaskXObjectRepeat: 89,\n  paintSolidColorImageMask: 90,\n  constructPath: 91\n};\nvar verbosity = VERBOSITY_LEVELS.warnings;\nfunction setVerbosityLevel(level) {\n  verbosity = level;\n}\nfunction getVerbosityLevel() {\n  return verbosity;\n}\nfunction info(msg) {\n  if (verbosity >= VERBOSITY_LEVELS.infos) {\n    console.log('Info: ' + msg);\n  }\n}\nfunction warn(msg) {\n  if (verbosity >= VERBOSITY_LEVELS.warnings) {\n    console.log('Warning: ' + msg);\n  }\n}\nfunction deprecated(details) {\n  console.log('Deprecated API usage: ' + details);\n}\nfunction unreachable(msg) {\n  throw new Error(msg);\n}\nfunction assert(cond, msg) {\n  if (!cond) {\n    unreachable(msg);\n  }\n}\nvar UNSUPPORTED_FEATURES = {\n  unknown: 'unknown',\n  forms: 'forms',\n  javaScript: 'javaScript',\n  smask: 'smask',\n  shadingPattern: 'shadingPattern',\n  font: 'font'\n};\nfunction isSameOrigin(baseUrl, otherUrl) {\n  try {\n    var base = new URL(baseUrl);\n    if (!base.origin || base.origin === 'null') {\n      return false;\n    }\n  } catch (e) {\n    return false;\n  }\n  var other = new URL(otherUrl, base);\n  return base.origin === other.origin;\n}\nfunction isValidProtocol(url) {\n  if (!url) {\n    return false;\n  }\n  switch (url.protocol) {\n    case 'http:':\n    case 'https:':\n    case 'ftp:':\n    case 'mailto:':\n    case 'tel:':\n      return true;\n    default:\n      return false;\n  }\n}\nfunction createValidAbsoluteUrl(url, baseUrl) {\n  if (!url) {\n    return null;\n  }\n  try {\n    var absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url);\n    if (isValidProtocol(absoluteUrl)) {\n      return absoluteUrl;\n    }\n  } catch (ex) {}\n  return null;\n}\nfunction shadow(obj, prop, value) {\n  Object.defineProperty(obj, prop, {\n    value: value,\n    enumerable: true,\n    configurable: true,\n    writable: false\n  });\n  return value;\n}\nfunction getLookupTableFactory(initializer) {\n  var lookup;\n  return function () {\n    if (initializer) {\n      lookup = Object.create(null);\n      initializer(lookup);\n      initializer = null;\n    }\n    return lookup;\n  };\n}\nvar PasswordResponses = {\n  NEED_PASSWORD: 1,\n  INCORRECT_PASSWORD: 2\n};\nvar PasswordException = function PasswordExceptionClosure() {\n  function PasswordException(msg, code) {\n    this.name = 'PasswordException';\n    this.message = msg;\n    this.code = code;\n  }\n  PasswordException.prototype = new Error();\n  PasswordException.constructor = PasswordException;\n  return PasswordException;\n}();\nvar UnknownErrorException = function UnknownErrorExceptionClosure() {\n  function UnknownErrorException(msg, details) {\n    this.name = 'UnknownErrorException';\n    this.message = msg;\n    this.details = details;\n  }\n  UnknownErrorException.prototype = new Error();\n  UnknownErrorException.constructor = UnknownErrorException;\n  return UnknownErrorException;\n}();\nvar InvalidPDFException = function InvalidPDFExceptionClosure() {\n  function InvalidPDFException(msg) {\n    this.name = 'InvalidPDFException';\n    this.message = msg;\n  }\n  InvalidPDFException.prototype = new Error();\n  InvalidPDFException.constructor = InvalidPDFException;\n  return InvalidPDFException;\n}();\nvar MissingPDFException = function MissingPDFExceptionClosure() {\n  function MissingPDFException(msg) {\n    this.name = 'MissingPDFException';\n    this.message = msg;\n  }\n  MissingPDFException.prototype = new Error();\n  MissingPDFException.constructor = MissingPDFException;\n  return MissingPDFException;\n}();\nvar UnexpectedResponseException = function UnexpectedResponseExceptionClosure() {\n  function UnexpectedResponseException(msg, status) {\n    this.name = 'UnexpectedResponseException';\n    this.message = msg;\n    this.status = status;\n  }\n  UnexpectedResponseException.prototype = new Error();\n  UnexpectedResponseException.constructor = UnexpectedResponseException;\n  return UnexpectedResponseException;\n}();\nvar NotImplementedException = function NotImplementedExceptionClosure() {\n  function NotImplementedException(msg) {\n    this.message = msg;\n  }\n  NotImplementedException.prototype = new Error();\n  NotImplementedException.prototype.name = 'NotImplementedException';\n  NotImplementedException.constructor = NotImplementedException;\n  return NotImplementedException;\n}();\nvar MissingDataException = function MissingDataExceptionClosure() {\n  function MissingDataException(begin, end) {\n    this.begin = begin;\n    this.end = end;\n    this.message = 'Missing data [' + begin + ', ' + end + ')';\n  }\n  MissingDataException.prototype = new Error();\n  MissingDataException.prototype.name = 'MissingDataException';\n  MissingDataException.constructor = MissingDataException;\n  return MissingDataException;\n}();\nvar XRefParseException = function XRefParseExceptionClosure() {\n  function XRefParseException(msg) {\n    this.message = msg;\n  }\n  XRefParseException.prototype = new Error();\n  XRefParseException.prototype.name = 'XRefParseException';\n  XRefParseException.constructor = XRefParseException;\n  return XRefParseException;\n}();\nvar FormatError = function FormatErrorClosure() {\n  function FormatError(msg) {\n    this.message = msg;\n  }\n  FormatError.prototype = new Error();\n  FormatError.prototype.name = 'FormatError';\n  FormatError.constructor = FormatError;\n  return FormatError;\n}();\nvar AbortException = function AbortExceptionClosure() {\n  function AbortException(msg) {\n    this.name = 'AbortException';\n    this.message = msg;\n  }\n  AbortException.prototype = new Error();\n  AbortException.constructor = AbortException;\n  return AbortException;\n}();\nvar NullCharactersRegExp = /\\x00/g;\nfunction removeNullCharacters(str) {\n  if (typeof str !== 'string') {\n    warn('The argument for removeNullCharacters must be a string.');\n    return str;\n  }\n  return str.replace(NullCharactersRegExp, '');\n}\nfunction bytesToString(bytes) {\n  assert(bytes !== null && (typeof bytes === 'undefined' ? 'undefined' : _typeof(bytes)) === 'object' && bytes.length !== undefined, 'Invalid argument for bytesToString');\n  var length = bytes.length;\n  var MAX_ARGUMENT_COUNT = 8192;\n  if (length < MAX_ARGUMENT_COUNT) {\n    return String.fromCharCode.apply(null, bytes);\n  }\n  var strBuf = [];\n  for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n    var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n    var chunk = bytes.subarray(i, chunkEnd);\n    strBuf.push(String.fromCharCode.apply(null, chunk));\n  }\n  return strBuf.join('');\n}\nfunction stringToBytes(str) {\n  assert(typeof str === 'string', 'Invalid argument for stringToBytes');\n  var length = str.length;\n  var bytes = new Uint8Array(length);\n  for (var i = 0; i < length; ++i) {\n    bytes[i] = str.charCodeAt(i) & 0xFF;\n  }\n  return bytes;\n}\nfunction arrayByteLength(arr) {\n  if (arr.length !== undefined) {\n    return arr.length;\n  }\n  assert(arr.byteLength !== undefined);\n  return arr.byteLength;\n}\nfunction arraysToBytes(arr) {\n  if (arr.length === 1 && arr[0] instanceof Uint8Array) {\n    return arr[0];\n  }\n  var resultLength = 0;\n  var i,\n      ii = arr.length;\n  var item, itemLength;\n  for (i = 0; i < ii; i++) {\n    item = arr[i];\n    itemLength = arrayByteLength(item);\n    resultLength += itemLength;\n  }\n  var pos = 0;\n  var data = new Uint8Array(resultLength);\n  for (i = 0; i < ii; i++) {\n    item = arr[i];\n    if (!(item instanceof Uint8Array)) {\n      if (typeof item === 'string') {\n        item = stringToBytes(item);\n      } else {\n        item = new Uint8Array(item);\n      }\n    }\n    itemLength = item.byteLength;\n    data.set(item, pos);\n    pos += itemLength;\n  }\n  return data;\n}\nfunction string32(value) {\n  return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);\n}\nfunction log2(x) {\n  var n = 1,\n      i = 0;\n  while (x > n) {\n    n <<= 1;\n    i++;\n  }\n  return i;\n}\nfunction readInt8(data, start) {\n  return data[start] << 24 >> 24;\n}\nfunction readUint16(data, offset) {\n  return data[offset] << 8 | data[offset + 1];\n}\nfunction readUint32(data, offset) {\n  return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0;\n}\nfunction isLittleEndian() {\n  var buffer8 = new Uint8Array(4);\n  buffer8[0] = 1;\n  var view32 = new Uint32Array(buffer8.buffer, 0, 1);\n  return view32[0] === 1;\n}\nfunction isEvalSupported() {\n  try {\n    new Function('');\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\nvar IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];\nvar Util = function UtilClosure() {\n  function Util() {}\n  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];\n  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {\n    rgbBuf[1] = r;\n    rgbBuf[3] = g;\n    rgbBuf[5] = b;\n    return rgbBuf.join('');\n  };\n  Util.transform = function Util_transform(m1, m2) {\n    return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]];\n  };\n  Util.applyTransform = function Util_applyTransform(p, m) {\n    var xt = p[0] * m[0] + p[1] * m[2] + m[4];\n    var yt = p[0] * m[1] + p[1] * m[3] + m[5];\n    return [xt, yt];\n  };\n  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n    return [xt, yt];\n  };\n  Util.getAxialAlignedBoundingBox = function Util_getAxialAlignedBoundingBox(r, m) {\n    var p1 = Util.applyTransform(r, m);\n    var p2 = Util.applyTransform(r.slice(2, 4), m);\n    var p3 = Util.applyTransform([r[0], r[3]], m);\n    var p4 = Util.applyTransform([r[2], r[1]], m);\n    return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])];\n  };\n  Util.inverseTransform = function Util_inverseTransform(m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];\n  };\n  Util.apply3dTransform = function Util_apply3dTransform(m, v) {\n    return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]];\n  };\n  Util.singularValueDecompose2dScale = function Util_singularValueDecompose2dScale(m) {\n    var transpose = [m[0], m[2], m[1], m[3]];\n    var a = m[0] * transpose[0] + m[1] * transpose[2];\n    var b = m[0] * transpose[1] + m[1] * transpose[3];\n    var c = m[2] * transpose[0] + m[3] * transpose[2];\n    var d = m[2] * transpose[1] + m[3] * transpose[3];\n    var first = (a + d) / 2;\n    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;\n    var sx = first + second || 1;\n    var sy = first - second || 1;\n    return [Math.sqrt(sx), Math.sqrt(sy)];\n  };\n  Util.normalizeRect = function Util_normalizeRect(rect) {\n    var r = rect.slice(0);\n    if (rect[0] > rect[2]) {\n      r[0] = rect[2];\n      r[2] = rect[0];\n    }\n    if (rect[1] > rect[3]) {\n      r[1] = rect[3];\n      r[3] = rect[1];\n    }\n    return r;\n  };\n  Util.intersect = function Util_intersect(rect1, rect2) {\n    function compare(a, b) {\n      return a - b;\n    }\n    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),\n        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),\n        result = [];\n    rect1 = Util.normalizeRect(rect1);\n    rect2 = Util.normalizeRect(rect2);\n    if (orderedX[0] === rect1[0] && orderedX[1] === rect2[0] || orderedX[0] === rect2[0] && orderedX[1] === rect1[0]) {\n      result[0] = orderedX[1];\n      result[2] = orderedX[2];\n    } else {\n      return false;\n    }\n    if (orderedY[0] === rect1[1] && orderedY[1] === rect2[1] || orderedY[0] === rect2[1] && orderedY[1] === rect1[1]) {\n      result[1] = orderedY[1];\n      result[3] = orderedY[2];\n    } else {\n      return false;\n    }\n    return result;\n  };\n  Util.sign = function Util_sign(num) {\n    return num < 0 ? -1 : 1;\n  };\n  var ROMAN_NUMBER_MAP = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'];\n  Util.toRoman = function Util_toRoman(number, lowerCase) {\n    assert(isInt(number) && number > 0, 'The number should be a positive integer.');\n    var pos,\n        romanBuf = [];\n    while (number >= 1000) {\n      number -= 1000;\n      romanBuf.push('M');\n    }\n    pos = number / 100 | 0;\n    number %= 100;\n    romanBuf.push(ROMAN_NUMBER_MAP[pos]);\n    pos = number / 10 | 0;\n    number %= 10;\n    romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]);\n    romanBuf.push(ROMAN_NUMBER_MAP[20 + number]);\n    var romanStr = romanBuf.join('');\n    return lowerCase ? romanStr.toLowerCase() : romanStr;\n  };\n  Util.appendToArray = function Util_appendToArray(arr1, arr2) {\n    Array.prototype.push.apply(arr1, arr2);\n  };\n  Util.prependToArray = function Util_prependToArray(arr1, arr2) {\n    Array.prototype.unshift.apply(arr1, arr2);\n  };\n  Util.extendObj = function extendObj(obj1, obj2) {\n    for (var key in obj2) {\n      obj1[key] = obj2[key];\n    }\n  };\n  Util.getInheritableProperty = function Util_getInheritableProperty(dict, name, getArray) {\n    while (dict && !dict.has(name)) {\n      dict = dict.get('Parent');\n    }\n    if (!dict) {\n      return null;\n    }\n    return getArray ? dict.getArray(name) : dict.get(name);\n  };\n  Util.inherit = function Util_inherit(sub, base, prototype) {\n    sub.prototype = Object.create(base.prototype);\n    sub.prototype.constructor = sub;\n    for (var prop in prototype) {\n      sub.prototype[prop] = prototype[prop];\n    }\n  };\n  Util.loadScript = function Util_loadScript(src, callback) {\n    var script = document.createElement('script');\n    var loaded = false;\n    script.setAttribute('src', src);\n    if (callback) {\n      script.onload = function () {\n        if (!loaded) {\n          callback();\n        }\n        loaded = true;\n      };\n    }\n    document.getElementsByTagName('head')[0].appendChild(script);\n  };\n  return Util;\n}();\nvar PageViewport = function PageViewportClosure() {\n  function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) {\n    this.viewBox = viewBox;\n    this.scale = scale;\n    this.rotation = rotation;\n    this.offsetX = offsetX;\n    this.offsetY = offsetY;\n    var centerX = (viewBox[2] + viewBox[0]) / 2;\n    var centerY = (viewBox[3] + viewBox[1]) / 2;\n    var rotateA, rotateB, rotateC, rotateD;\n    rotation = rotation % 360;\n    rotation = rotation < 0 ? rotation + 360 : rotation;\n    switch (rotation) {\n      case 180:\n        rotateA = -1;\n        rotateB = 0;\n        rotateC = 0;\n        rotateD = 1;\n        break;\n      case 90:\n        rotateA = 0;\n        rotateB = 1;\n        rotateC = 1;\n        rotateD = 0;\n        break;\n      case 270:\n        rotateA = 0;\n        rotateB = -1;\n        rotateC = -1;\n        rotateD = 0;\n        break;\n      default:\n        rotateA = 1;\n        rotateB = 0;\n        rotateC = 0;\n        rotateD = -1;\n        break;\n    }\n    if (dontFlip) {\n      rotateC = -rotateC;\n      rotateD = -rotateD;\n    }\n    var offsetCanvasX, offsetCanvasY;\n    var width, height;\n    if (rotateA === 0) {\n      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;\n      width = Math.abs(viewBox[3] - viewBox[1]) * scale;\n      height = Math.abs(viewBox[2] - viewBox[0]) * scale;\n    } else {\n      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;\n      width = Math.abs(viewBox[2] - viewBox[0]) * scale;\n      height = Math.abs(viewBox[3] - viewBox[1]) * scale;\n    }\n    this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY];\n    this.width = width;\n    this.height = height;\n    this.fontScale = scale;\n  }\n  PageViewport.prototype = {\n    clone: function PageViewPort_clone(args) {\n      args = args || {};\n      var scale = 'scale' in args ? args.scale : this.scale;\n      var rotation = 'rotation' in args ? args.rotation : this.rotation;\n      return new PageViewport(this.viewBox.slice(), scale, rotation, this.offsetX, this.offsetY, args.dontFlip);\n    },\n    convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {\n      return Util.applyTransform([x, y], this.transform);\n    },\n    convertToViewportRectangle: function PageViewport_convertToViewportRectangle(rect) {\n      var tl = Util.applyTransform([rect[0], rect[1]], this.transform);\n      var br = Util.applyTransform([rect[2], rect[3]], this.transform);\n      return [tl[0], tl[1], br[0], br[1]];\n    },\n    convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {\n      return Util.applyInverseTransform([x, y], this.transform);\n    }\n  };\n  return PageViewport;\n}();\nvar PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC];\nfunction stringToPDFString(str) {\n  var i,\n      n = str.length,\n      strBuf = [];\n  if (str[0] === '\\xFE' && str[1] === '\\xFF') {\n    for (i = 2; i < n; i += 2) {\n      strBuf.push(String.fromCharCode(str.charCodeAt(i) << 8 | str.charCodeAt(i + 1)));\n    }\n  } else {\n    for (i = 0; i < n; ++i) {\n      var code = PDFStringTranslateTable[str.charCodeAt(i)];\n      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));\n    }\n  }\n  return strBuf.join('');\n}\nfunction stringToUTF8String(str) {\n  return decodeURIComponent(escape(str));\n}\nfunction utf8StringToString(str) {\n  return unescape(encodeURIComponent(str));\n}\nfunction isEmptyObj(obj) {\n  for (var key in obj) {\n    return false;\n  }\n  return true;\n}\nfunction isBool(v) {\n  return typeof v === 'boolean';\n}\nfunction isInt(v) {\n  return typeof v === 'number' && (v | 0) === v;\n}\nfunction isNum(v) {\n  return typeof v === 'number';\n}\nfunction isString(v) {\n  return typeof v === 'string';\n}\nfunction isArray(v) {\n  return v instanceof Array;\n}\nfunction isArrayBuffer(v) {\n  return (typeof v === 'undefined' ? 'undefined' : _typeof(v)) === 'object' && v !== null && v.byteLength !== undefined;\n}\nfunction isSpace(ch) {\n  return ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A;\n}\nfunction isNodeJS() {\n  return (typeof process === 'undefined' ? 'undefined' : _typeof(process)) === 'object' && process + '' === '[object process]';\n}\nfunction createPromiseCapability() {\n  var capability = {};\n  capability.promise = new Promise(function (resolve, reject) {\n    capability.resolve = resolve;\n    capability.reject = reject;\n  });\n  return capability;\n}\nvar StatTimer = function StatTimerClosure() {\n  function rpad(str, pad, length) {\n    while (str.length < length) {\n      str += pad;\n    }\n    return str;\n  }\n  function StatTimer() {\n    this.started = Object.create(null);\n    this.times = [];\n    this.enabled = true;\n  }\n  StatTimer.prototype = {\n    time: function StatTimer_time(name) {\n      if (!this.enabled) {\n        return;\n      }\n      if (name in this.started) {\n        warn('Timer is already running for ' + name);\n      }\n      this.started[name] = Date.now();\n    },\n    timeEnd: function StatTimer_timeEnd(name) {\n      if (!this.enabled) {\n        return;\n      }\n      if (!(name in this.started)) {\n        warn('Timer has not been started for ' + name);\n      }\n      this.times.push({\n        'name': name,\n        'start': this.started[name],\n        'end': Date.now()\n      });\n      delete this.started[name];\n    },\n    toString: function StatTimer_toString() {\n      var i, ii;\n      var times = this.times;\n      var out = '';\n      var longest = 0;\n      for (i = 0, ii = times.length; i < ii; ++i) {\n        var name = times[i]['name'];\n        if (name.length > longest) {\n          longest = name.length;\n        }\n      }\n      for (i = 0, ii = times.length; i < ii; ++i) {\n        var span = times[i];\n        var duration = span.end - span.start;\n        out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\\n';\n      }\n      return out;\n    }\n  };\n  return StatTimer;\n}();\nvar createBlob = function createBlob(data, contentType) {\n  if (typeof Blob !== 'undefined') {\n    return new Blob([data], { type: contentType });\n  }\n  throw new Error('The \"Blob\" constructor is not supported.');\n};\nvar createObjectURL = function createObjectURLClosure() {\n  var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n  return function createObjectURL(data, contentType) {\n    var forceDataSchema = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    if (!forceDataSchema && URL.createObjectURL) {\n      var blob = createBlob(data, contentType);\n      return URL.createObjectURL(blob);\n    }\n    var buffer = 'data:' + contentType + ';base64,';\n    for (var i = 0, ii = data.length; i < ii; i += 3) {\n      var b1 = data[i] & 0xFF;\n      var b2 = data[i + 1] & 0xFF;\n      var b3 = data[i + 2] & 0xFF;\n      var d1 = b1 >> 2,\n          d2 = (b1 & 3) << 4 | b2 >> 4;\n      var d3 = i + 1 < ii ? (b2 & 0xF) << 2 | b3 >> 6 : 64;\n      var d4 = i + 2 < ii ? b3 & 0x3F : 64;\n      buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];\n    }\n    return buffer;\n  };\n}();\nfunction resolveCall(fn, args) {\n  var thisArg = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n  if (!fn) {\n    return Promise.resolve(undefined);\n  }\n  return new Promise(function (resolve, reject) {\n    resolve(fn.apply(thisArg, args));\n  });\n}\nfunction wrapReason(reason) {\n  if ((typeof reason === 'undefined' ? 'undefined' : _typeof(reason)) !== 'object') {\n    return reason;\n  }\n  switch (reason.name) {\n    case 'AbortException':\n      return new AbortException(reason.message);\n    case 'MissingPDFException':\n      return new MissingPDFException(reason.message);\n    case 'UnexpectedResponseException':\n      return new UnexpectedResponseException(reason.message, reason.status);\n    default:\n      return new UnknownErrorException(reason.message, reason.details);\n  }\n}\nfunction resolveOrReject(capability, success, reason) {\n  if (success) {\n    capability.resolve();\n  } else {\n    capability.reject(reason);\n  }\n}\nfunction finalize(promise) {\n  return Promise.resolve(promise).catch(function () {});\n}\nfunction MessageHandler(sourceName, targetName, comObj) {\n  var _this = this;\n\n  this.sourceName = sourceName;\n  this.targetName = targetName;\n  this.comObj = comObj;\n  this.callbackId = 1;\n  this.streamId = 1;\n  this.postMessageTransfers = true;\n  this.streamSinks = Object.create(null);\n  this.streamControllers = Object.create(null);\n  var callbacksCapabilities = this.callbacksCapabilities = Object.create(null);\n  var ah = this.actionHandler = Object.create(null);\n  this._onComObjOnMessage = function (event) {\n    var data = event.data;\n    if (data.targetName !== _this.sourceName) {\n      return;\n    }\n    if (data.stream) {\n      _this._processStreamMessage(data);\n    } else if (data.isReply) {\n      var callbackId = data.callbackId;\n      if (data.callbackId in callbacksCapabilities) {\n        var callback = callbacksCapabilities[callbackId];\n        delete callbacksCapabilities[callbackId];\n        if ('error' in data) {\n          callback.reject(wrapReason(data.error));\n        } else {\n          callback.resolve(data.data);\n        }\n      } else {\n        throw new Error('Cannot resolve callback ' + callbackId);\n      }\n    } else if (data.action in ah) {\n      var action = ah[data.action];\n      if (data.callbackId) {\n        var _sourceName = _this.sourceName;\n        var _targetName = data.sourceName;\n        Promise.resolve().then(function () {\n          return action[0].call(action[1], data.data);\n        }).then(function (result) {\n          comObj.postMessage({\n            sourceName: _sourceName,\n            targetName: _targetName,\n            isReply: true,\n            callbackId: data.callbackId,\n            data: result\n          });\n        }, function (reason) {\n          if (reason instanceof Error) {\n            reason = reason + '';\n          }\n          comObj.postMessage({\n            sourceName: _sourceName,\n            targetName: _targetName,\n            isReply: true,\n            callbackId: data.callbackId,\n            error: reason\n          });\n        });\n      } else if (data.streamId) {\n        _this._createStreamSink(data);\n      } else {\n        action[0].call(action[1], data.data);\n      }\n    } else {\n      throw new Error('Unknown action from worker: ' + data.action);\n    }\n  };\n  comObj.addEventListener('message', this._onComObjOnMessage);\n}\nMessageHandler.prototype = {\n  on: function on(actionName, handler, scope) {\n    var ah = this.actionHandler;\n    if (ah[actionName]) {\n      throw new Error('There is already an actionName called \"' + actionName + '\"');\n    }\n    ah[actionName] = [handler, scope];\n  },\n  send: function send(actionName, data, transfers) {\n    var message = {\n      sourceName: this.sourceName,\n      targetName: this.targetName,\n      action: actionName,\n      data: data\n    };\n    this.postMessage(message, transfers);\n  },\n  sendWithPromise: function sendWithPromise(actionName, data, transfers) {\n    var callbackId = this.callbackId++;\n    var message = {\n      sourceName: this.sourceName,\n      targetName: this.targetName,\n      action: actionName,\n      data: data,\n      callbackId: callbackId\n    };\n    var capability = createPromiseCapability();\n    this.callbacksCapabilities[callbackId] = capability;\n    try {\n      this.postMessage(message, transfers);\n    } catch (e) {\n      capability.reject(e);\n    }\n    return capability.promise;\n  },\n  sendWithStream: function sendWithStream(actionName, data, queueingStrategy, transfers) {\n    var _this2 = this;\n\n    var streamId = this.streamId++;\n    var sourceName = this.sourceName;\n    var targetName = this.targetName;\n    return new _streams_polyfill.ReadableStream({\n      start: function start(controller) {\n        var startCapability = createPromiseCapability();\n        _this2.streamControllers[streamId] = {\n          controller: controller,\n          startCall: startCapability,\n          isClosed: false\n        };\n        _this2.postMessage({\n          sourceName: sourceName,\n          targetName: targetName,\n          action: actionName,\n          streamId: streamId,\n          data: data,\n          desiredSize: controller.desiredSize\n        });\n        return startCapability.promise;\n      },\n      pull: function pull(controller) {\n        var pullCapability = createPromiseCapability();\n        _this2.streamControllers[streamId].pullCall = pullCapability;\n        _this2.postMessage({\n          sourceName: sourceName,\n          targetName: targetName,\n          stream: 'pull',\n          streamId: streamId,\n          desiredSize: controller.desiredSize\n        });\n        return pullCapability.promise;\n      },\n      cancel: function cancel(reason) {\n        var cancelCapability = createPromiseCapability();\n        _this2.streamControllers[streamId].cancelCall = cancelCapability;\n        _this2.streamControllers[streamId].isClosed = true;\n        _this2.postMessage({\n          sourceName: sourceName,\n          targetName: targetName,\n          stream: 'cancel',\n          reason: reason,\n          streamId: streamId\n        });\n        return cancelCapability.promise;\n      }\n    }, queueingStrategy);\n  },\n  _createStreamSink: function _createStreamSink(data) {\n    var _this3 = this;\n\n    var self = this;\n    var action = this.actionHandler[data.action];\n    var streamId = data.streamId;\n    var desiredSize = data.desiredSize;\n    var sourceName = this.sourceName;\n    var targetName = data.sourceName;\n    var capability = createPromiseCapability();\n    var sendStreamRequest = function sendStreamRequest(_ref) {\n      var stream = _ref.stream,\n          chunk = _ref.chunk,\n          transfers = _ref.transfers,\n          success = _ref.success,\n          reason = _ref.reason;\n\n      _this3.postMessage({\n        sourceName: sourceName,\n        targetName: targetName,\n        stream: stream,\n        streamId: streamId,\n        chunk: chunk,\n        success: success,\n        reason: reason\n      }, transfers);\n    };\n    var streamSink = {\n      enqueue: function enqueue(chunk) {\n        var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n        var transfers = arguments[2];\n\n        if (this.isCancelled) {\n          return;\n        }\n        var lastDesiredSize = this.desiredSize;\n        this.desiredSize -= size;\n        if (lastDesiredSize > 0 && this.desiredSize <= 0) {\n          this.sinkCapability = createPromiseCapability();\n          this.ready = this.sinkCapability.promise;\n        }\n        sendStreamRequest({\n          stream: 'enqueue',\n          chunk: chunk,\n          transfers: transfers\n        });\n      },\n      close: function close() {\n        if (this.isCancelled) {\n          return;\n        }\n        sendStreamRequest({ stream: 'close' });\n        delete self.streamSinks[streamId];\n      },\n      error: function error(reason) {\n        if (this.isCancelled) {\n          return;\n        }\n        this.isCancelled = true;\n        sendStreamRequest({\n          stream: 'error',\n          reason: reason\n        });\n      },\n\n      sinkCapability: capability,\n      onPull: null,\n      onCancel: null,\n      isCancelled: false,\n      desiredSize: desiredSize,\n      ready: null\n    };\n    streamSink.sinkCapability.resolve();\n    streamSink.ready = streamSink.sinkCapability.promise;\n    this.streamSinks[streamId] = streamSink;\n    resolveCall(action[0], [data.data, streamSink], action[1]).then(function () {\n      sendStreamRequest({\n        stream: 'start_complete',\n        success: true\n      });\n    }, function (reason) {\n      sendStreamRequest({\n        stream: 'start_complete',\n        success: false,\n        reason: reason\n      });\n    });\n  },\n  _processStreamMessage: function _processStreamMessage(data) {\n    var _this4 = this;\n\n    var sourceName = this.sourceName;\n    var targetName = data.sourceName;\n    var streamId = data.streamId;\n    var sendStreamResponse = function sendStreamResponse(_ref2) {\n      var stream = _ref2.stream,\n          success = _ref2.success,\n          reason = _ref2.reason;\n\n      _this4.comObj.postMessage({\n        sourceName: sourceName,\n        targetName: targetName,\n        stream: stream,\n        success: success,\n        streamId: streamId,\n        reason: reason\n      });\n    };\n    var deleteStreamController = function deleteStreamController() {\n      Promise.all([_this4.streamControllers[data.streamId].startCall, _this4.streamControllers[data.streamId].pullCall, _this4.streamControllers[data.streamId].cancelCall].map(function (capability) {\n        return capability && finalize(capability.promise);\n      })).then(function () {\n        delete _this4.streamControllers[data.streamId];\n      });\n    };\n    switch (data.stream) {\n      case 'start_complete':\n        resolveOrReject(this.streamControllers[data.streamId].startCall, data.success, wrapReason(data.reason));\n        break;\n      case 'pull_complete':\n        resolveOrReject(this.streamControllers[data.streamId].pullCall, data.success, wrapReason(data.reason));\n        break;\n      case 'pull':\n        if (!this.streamSinks[data.streamId]) {\n          sendStreamResponse({\n            stream: 'pull_complete',\n            success: true\n          });\n          break;\n        }\n        if (this.streamSinks[data.streamId].desiredSize <= 0 && data.desiredSize > 0) {\n          this.streamSinks[data.streamId].sinkCapability.resolve();\n        }\n        this.streamSinks[data.streamId].desiredSize = data.desiredSize;\n        resolveCall(this.streamSinks[data.streamId].onPull).then(function () {\n          sendStreamResponse({\n            stream: 'pull_complete',\n            success: true\n          });\n        }, function (reason) {\n          sendStreamResponse({\n            stream: 'pull_complete',\n            success: false,\n            reason: reason\n          });\n        });\n        break;\n      case 'enqueue':\n        assert(this.streamControllers[data.streamId], 'enqueue should have stream controller');\n        if (!this.streamControllers[data.streamId].isClosed) {\n          this.streamControllers[data.streamId].controller.enqueue(data.chunk);\n        }\n        break;\n      case 'close':\n        assert(this.streamControllers[data.streamId], 'close should have stream controller');\n        if (this.streamControllers[data.streamId].isClosed) {\n          break;\n        }\n        this.streamControllers[data.streamId].isClosed = true;\n        this.streamControllers[data.streamId].controller.close();\n        deleteStreamController();\n        break;\n      case 'error':\n        assert(this.streamControllers[data.streamId], 'error should have stream controller');\n        this.streamControllers[data.streamId].controller.error(wrapReason(data.reason));\n        deleteStreamController();\n        break;\n      case 'cancel_complete':\n        resolveOrReject(this.streamControllers[data.streamId].cancelCall, data.success, wrapReason(data.reason));\n        deleteStreamController();\n        break;\n      case 'cancel':\n        if (!this.streamSinks[data.streamId]) {\n          break;\n        }\n        resolveCall(this.streamSinks[data.streamId].onCancel, [wrapReason(data.reason)]).then(function () {\n          sendStreamResponse({\n            stream: 'cancel_complete',\n            success: true\n          });\n        }, function (reason) {\n          sendStreamResponse({\n            stream: 'cancel_complete',\n            success: false,\n            reason: reason\n          });\n        });\n        this.streamSinks[data.streamId].sinkCapability.reject(wrapReason(data.reason));\n        this.streamSinks[data.streamId].isCancelled = true;\n        delete this.streamSinks[data.streamId];\n        break;\n      default:\n        throw new Error('Unexpected stream case');\n    }\n  },\n  postMessage: function postMessage(message, transfers) {\n    if (transfers && this.postMessageTransfers) {\n      this.comObj.postMessage(message, transfers);\n    } else {\n      this.comObj.postMessage(message);\n    }\n  },\n  destroy: function destroy() {\n    this.comObj.removeEventListener('message', this._onComObjOnMessage);\n  }\n};\nfunction loadJpegStream(id, imageUrl, objs) {\n  var img = new Image();\n  img.onload = function loadJpegStream_onloadClosure() {\n    objs.resolve(id, img);\n  };\n  img.onerror = function loadJpegStream_onerrorClosure() {\n    objs.resolve(id, null);\n    warn('Error during JPEG image loading');\n  };\n  img.src = imageUrl;\n}\nexports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX;\nexports.IDENTITY_MATRIX = IDENTITY_MATRIX;\nexports.OPS = OPS;\nexports.VERBOSITY_LEVELS = VERBOSITY_LEVELS;\nexports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES;\nexports.AnnotationBorderStyleType = AnnotationBorderStyleType;\nexports.AnnotationFieldFlag = AnnotationFieldFlag;\nexports.AnnotationFlag = AnnotationFlag;\nexports.AnnotationType = AnnotationType;\nexports.FontType = FontType;\nexports.ImageKind = ImageKind;\nexports.CMapCompressionType = CMapCompressionType;\nexports.AbortException = AbortException;\nexports.InvalidPDFException = InvalidPDFException;\nexports.MessageHandler = MessageHandler;\nexports.MissingDataException = MissingDataException;\nexports.MissingPDFException = MissingPDFException;\nexports.NativeImageDecoding = NativeImageDecoding;\nexports.NotImplementedException = NotImplementedException;\nexports.PageViewport = PageViewport;\nexports.PasswordException = PasswordException;\nexports.PasswordResponses = PasswordResponses;\nexports.StatTimer = StatTimer;\nexports.StreamType = StreamType;\nexports.TextRenderingMode = TextRenderingMode;\nexports.UnexpectedResponseException = UnexpectedResponseException;\nexports.UnknownErrorException = UnknownErrorException;\nexports.Util = Util;\nexports.XRefParseException = XRefParseException;\nexports.FormatError = FormatError;\nexports.arrayByteLength = arrayByteLength;\nexports.arraysToBytes = arraysToBytes;\nexports.assert = assert;\nexports.bytesToString = bytesToString;\nexports.createBlob = createBlob;\nexports.createPromiseCapability = createPromiseCapability;\nexports.createObjectURL = createObjectURL;\nexports.deprecated = deprecated;\nexports.getLookupTableFactory = getLookupTableFactory;\nexports.getVerbosityLevel = getVerbosityLevel;\nexports.globalScope = globalScope;\nexports.info = info;\nexports.isArray = isArray;\nexports.isArrayBuffer = isArrayBuffer;\nexports.isBool = isBool;\nexports.isEmptyObj = isEmptyObj;\nexports.isInt = isInt;\nexports.isNum = isNum;\nexports.isString = isString;\nexports.isSpace = isSpace;\nexports.isNodeJS = isNodeJS;\nexports.isSameOrigin = isSameOrigin;\nexports.createValidAbsoluteUrl = createValidAbsoluteUrl;\nexports.isLittleEndian = isLittleEndian;\nexports.isEvalSupported = isEvalSupported;\nexports.loadJpegStream = loadJpegStream;\nexports.log2 = log2;\nexports.readInt8 = readInt8;\nexports.readUint16 = readUint16;\nexports.readUint32 = readUint32;\nexports.removeNullCharacters = removeNullCharacters;\nexports.ReadableStream = _streams_polyfill.ReadableStream;\nexports.setVerbosityLevel = setVerbosityLevel;\nexports.shadow = shadow;\nexports.string32 = string32;\nexports.stringToBytes = stringToBytes;\nexports.stringToPDFString = stringToPDFString;\nexports.stringToUTF8String = stringToUTF8String;\nexports.utf8StringToString = utf8StringToString;\nexports.warn = warn;\nexports.unreachable = unreachable;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.DOMCMapReaderFactory = exports.DOMCanvasFactory = exports.DEFAULT_LINK_REL = exports.getDefaultSetting = exports.LinkTarget = exports.getFilenameFromUrl = exports.isValidUrl = exports.isExternalLinkTargetSet = exports.addLinkAttributes = exports.RenderingCancelledException = exports.CustomStyle = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _util = __w_pdfjs_require__(0);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DEFAULT_LINK_REL = 'noopener noreferrer nofollow';\n\nvar DOMCanvasFactory = function () {\n  function DOMCanvasFactory() {\n    _classCallCheck(this, DOMCanvasFactory);\n  }\n\n  _createClass(DOMCanvasFactory, [{\n    key: 'create',\n    value: function create(width, height) {\n      if (width <= 0 || height <= 0) {\n        throw new Error('invalid canvas size');\n      }\n      var canvas = document.createElement('canvas');\n      var context = canvas.getContext('2d');\n      canvas.width = width;\n      canvas.height = height;\n      return {\n        canvas: canvas,\n        context: context\n      };\n    }\n  }, {\n    key: 'reset',\n    value: function reset(canvasAndContext, width, height) {\n      if (!canvasAndContext.canvas) {\n        throw new Error('canvas is not specified');\n      }\n      if (width <= 0 || height <= 0) {\n        throw new Error('invalid canvas size');\n      }\n      canvasAndContext.canvas.width = width;\n      canvasAndContext.canvas.height = height;\n    }\n  }, {\n    key: 'destroy',\n    value: function destroy(canvasAndContext) {\n      if (!canvasAndContext.canvas) {\n        throw new Error('canvas is not specified');\n      }\n      canvasAndContext.canvas.width = 0;\n      canvasAndContext.canvas.height = 0;\n      canvasAndContext.canvas = null;\n      canvasAndContext.context = null;\n    }\n  }]);\n\n  return DOMCanvasFactory;\n}();\n\nvar DOMCMapReaderFactory = function () {\n  function DOMCMapReaderFactory(_ref) {\n    var _ref$baseUrl = _ref.baseUrl,\n        baseUrl = _ref$baseUrl === undefined ? null : _ref$baseUrl,\n        _ref$isCompressed = _ref.isCompressed,\n        isCompressed = _ref$isCompressed === undefined ? false : _ref$isCompressed;\n\n    _classCallCheck(this, DOMCMapReaderFactory);\n\n    this.baseUrl = baseUrl;\n    this.isCompressed = isCompressed;\n  }\n\n  _createClass(DOMCMapReaderFactory, [{\n    key: 'fetch',\n    value: function fetch(_ref2) {\n      var _this = this;\n\n      var name = _ref2.name;\n\n      if (!name) {\n        return Promise.reject(new Error('CMap name must be specified.'));\n      }\n      return new Promise(function (resolve, reject) {\n        var url = _this.baseUrl + name + (_this.isCompressed ? '.bcmap' : '');\n        var request = new XMLHttpRequest();\n        request.open('GET', url, true);\n        if (_this.isCompressed) {\n          request.responseType = 'arraybuffer';\n        }\n        request.onreadystatechange = function () {\n          if (request.readyState !== XMLHttpRequest.DONE) {\n            return;\n          }\n          if (request.status === 200 || request.status === 0) {\n            var data = void 0;\n            if (_this.isCompressed && request.response) {\n              data = new Uint8Array(request.response);\n            } else if (!_this.isCompressed && request.responseText) {\n              data = (0, _util.stringToBytes)(request.responseText);\n            }\n            if (data) {\n              resolve({\n                cMapData: data,\n                compressionType: _this.isCompressed ? _util.CMapCompressionType.BINARY : _util.CMapCompressionType.NONE\n              });\n              return;\n            }\n          }\n          reject(new Error('Unable to load ' + (_this.isCompressed ? 'binary ' : '') + 'CMap at: ' + url));\n        };\n        request.send(null);\n      });\n    }\n  }]);\n\n  return DOMCMapReaderFactory;\n}();\n\nvar CustomStyle = function CustomStyleClosure() {\n  var prefixes = ['ms', 'Moz', 'Webkit', 'O'];\n  var _cache = Object.create(null);\n  function CustomStyle() {}\n  CustomStyle.getProp = function get(propName, element) {\n    if (arguments.length === 1 && typeof _cache[propName] === 'string') {\n      return _cache[propName];\n    }\n    element = element || document.documentElement;\n    var style = element.style,\n        prefixed,\n        uPropName;\n    if (typeof style[propName] === 'string') {\n      return _cache[propName] = propName;\n    }\n    uPropName = propName.charAt(0).toUpperCase() + propName.slice(1);\n    for (var i = 0, l = prefixes.length; i < l; i++) {\n      prefixed = prefixes[i] + uPropName;\n      if (typeof style[prefixed] === 'string') {\n        return _cache[propName] = prefixed;\n      }\n    }\n    return _cache[propName] = 'undefined';\n  };\n  CustomStyle.setProp = function set(propName, element, str) {\n    var prop = this.getProp(propName);\n    if (prop !== 'undefined') {\n      element.style[prop] = str;\n    }\n  };\n  return CustomStyle;\n}();\nvar RenderingCancelledException = function RenderingCancelledException() {\n  function RenderingCancelledException(msg, type) {\n    this.message = msg;\n    this.type = type;\n  }\n  RenderingCancelledException.prototype = new Error();\n  RenderingCancelledException.prototype.name = 'RenderingCancelledException';\n  RenderingCancelledException.constructor = RenderingCancelledException;\n  return RenderingCancelledException;\n}();\nvar LinkTarget = {\n  NONE: 0,\n  SELF: 1,\n  BLANK: 2,\n  PARENT: 3,\n  TOP: 4\n};\nvar LinkTargetStringMap = ['', '_self', '_blank', '_parent', '_top'];\nfunction addLinkAttributes(link, params) {\n  var url = params && params.url;\n  link.href = link.title = url ? (0, _util.removeNullCharacters)(url) : '';\n  if (url) {\n    var target = params.target;\n    if (typeof target === 'undefined') {\n      target = getDefaultSetting('externalLinkTarget');\n    }\n    link.target = LinkTargetStringMap[target];\n    var rel = params.rel;\n    if (typeof rel === 'undefined') {\n      rel = getDefaultSetting('externalLinkRel');\n    }\n    link.rel = rel;\n  }\n}\nfunction getFilenameFromUrl(url) {\n  var anchor = url.indexOf('#');\n  var query = url.indexOf('?');\n  var end = Math.min(anchor > 0 ? anchor : url.length, query > 0 ? query : url.length);\n  return url.substring(url.lastIndexOf('/', end) + 1, end);\n}\nfunction getDefaultSetting(id) {\n  var globalSettings = _util.globalScope.PDFJS;\n  switch (id) {\n    case 'pdfBug':\n      return globalSettings ? globalSettings.pdfBug : false;\n    case 'disableAutoFetch':\n      return globalSettings ? globalSettings.disableAutoFetch : false;\n    case 'disableStream':\n      return globalSettings ? globalSettings.disableStream : false;\n    case 'disableRange':\n      return globalSettings ? globalSettings.disableRange : false;\n    case 'disableFontFace':\n      return globalSettings ? globalSettings.disableFontFace : false;\n    case 'disableCreateObjectURL':\n      return globalSettings ? globalSettings.disableCreateObjectURL : false;\n    case 'disableWebGL':\n      return globalSettings ? globalSettings.disableWebGL : true;\n    case 'cMapUrl':\n      return globalSettings ? globalSettings.cMapUrl : null;\n    case 'cMapPacked':\n      return globalSettings ? globalSettings.cMapPacked : false;\n    case 'postMessageTransfers':\n      return globalSettings ? globalSettings.postMessageTransfers : true;\n    case 'workerPort':\n      return globalSettings ? globalSettings.workerPort : null;\n    case 'workerSrc':\n      return globalSettings ? globalSettings.workerSrc : null;\n    case 'disableWorker':\n      return globalSettings ? globalSettings.disableWorker : false;\n    case 'maxImageSize':\n      return globalSettings ? globalSettings.maxImageSize : -1;\n    case 'imageResourcesPath':\n      return globalSettings ? globalSettings.imageResourcesPath : '';\n    case 'isEvalSupported':\n      return globalSettings ? globalSettings.isEvalSupported : true;\n    case 'externalLinkTarget':\n      if (!globalSettings) {\n        return LinkTarget.NONE;\n      }\n      switch (globalSettings.externalLinkTarget) {\n        case LinkTarget.NONE:\n        case LinkTarget.SELF:\n        case LinkTarget.BLANK:\n        case LinkTarget.PARENT:\n        case LinkTarget.TOP:\n          return globalSettings.externalLinkTarget;\n      }\n      (0, _util.warn)('PDFJS.externalLinkTarget is invalid: ' + globalSettings.externalLinkTarget);\n      globalSettings.externalLinkTarget = LinkTarget.NONE;\n      return LinkTarget.NONE;\n    case 'externalLinkRel':\n      return globalSettings ? globalSettings.externalLinkRel : DEFAULT_LINK_REL;\n    case 'enableStats':\n      return !!(globalSettings && globalSettings.enableStats);\n    case 'pdfjsNext':\n      return !!(globalSettings && globalSettings.pdfjsNext);\n    default:\n      throw new Error('Unknown default setting: ' + id);\n  }\n}\nfunction isExternalLinkTargetSet() {\n  var externalLinkTarget = getDefaultSetting('externalLinkTarget');\n  switch (externalLinkTarget) {\n    case LinkTarget.NONE:\n      return false;\n    case LinkTarget.SELF:\n    case LinkTarget.BLANK:\n    case LinkTarget.PARENT:\n    case LinkTarget.TOP:\n      return true;\n  }\n}\nfunction isValidUrl(url, allowRelative) {\n  (0, _util.deprecated)('isValidUrl(), please use createValidAbsoluteUrl() instead.');\n  var baseUrl = allowRelative ? 'http://example.com' : null;\n  return (0, _util.createValidAbsoluteUrl)(url, baseUrl) !== null;\n}\nexports.CustomStyle = CustomStyle;\nexports.RenderingCancelledException = RenderingCancelledException;\nexports.addLinkAttributes = addLinkAttributes;\nexports.isExternalLinkTargetSet = isExternalLinkTargetSet;\nexports.isValidUrl = isValidUrl;\nexports.getFilenameFromUrl = getFilenameFromUrl;\nexports.LinkTarget = LinkTarget;\nexports.getDefaultSetting = getDefaultSetting;\nexports.DEFAULT_LINK_REL = DEFAULT_LINK_REL;\nexports.DOMCanvasFactory = DOMCanvasFactory;\nexports.DOMCMapReaderFactory = DOMCMapReaderFactory;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.build = exports.version = exports._UnsupportedManager = exports.setPDFNetworkStreamClass = exports.PDFPageProxy = exports.PDFDocumentProxy = exports.PDFWorker = exports.PDFDataRangeTransport = exports.LoopbackPort = exports.getDocument = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _dom_utils = __w_pdfjs_require__(1);\n\nvar _font_loader = __w_pdfjs_require__(12);\n\nvar _canvas = __w_pdfjs_require__(11);\n\nvar _metadata = __w_pdfjs_require__(6);\n\nvar _transport_stream = __w_pdfjs_require__(14);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DEFAULT_RANGE_CHUNK_SIZE = 65536;\nvar isWorkerDisabled = false;\nvar workerSrc;\nvar isPostMessageTransfersDisabled = false;\nvar pdfjsFilePath = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : null;\nvar fakeWorkerFilesLoader = null;\nvar useRequireEnsure = false;\n{\n  if (typeof window === 'undefined') {\n    isWorkerDisabled = true;\n    if (typeof require.ensure === 'undefined') {\n      require.ensure = require('node-ensure');\n    }\n    useRequireEnsure = true;\n  } else if (typeof require !== 'undefined' && typeof require.ensure === 'function') {\n    useRequireEnsure = true;\n  }\n  if (typeof requirejs !== 'undefined' && requirejs.toUrl) {\n    workerSrc = requirejs.toUrl('pdfjs-dist/build/pdf.worker.js');\n  }\n  var dynamicLoaderSupported = typeof requirejs !== 'undefined' && requirejs.load;\n  fakeWorkerFilesLoader = useRequireEnsure ? function (callback) {\n    require.ensure([], function () {\n      var worker;\n      worker = require('./pdf.worker.js');\n      callback(worker.WorkerMessageHandler);\n    });\n  } : dynamicLoaderSupported ? function (callback) {\n    requirejs(['pdfjs-dist/build/pdf.worker'], function (worker) {\n      callback(worker.WorkerMessageHandler);\n    });\n  } : null;\n}\nvar PDFNetworkStream;\nfunction setPDFNetworkStreamClass(cls) {\n  PDFNetworkStream = cls;\n}\nfunction getDocument(src, pdfDataRangeTransport, passwordCallback, progressCallback) {\n  var task = new PDFDocumentLoadingTask();\n  if (arguments.length > 1) {\n    (0, _util.deprecated)('getDocument is called with pdfDataRangeTransport, ' + 'passwordCallback or progressCallback argument');\n  }\n  if (pdfDataRangeTransport) {\n    if (!(pdfDataRangeTransport instanceof PDFDataRangeTransport)) {\n      pdfDataRangeTransport = Object.create(pdfDataRangeTransport);\n      pdfDataRangeTransport.length = src.length;\n      pdfDataRangeTransport.initialData = src.initialData;\n      if (!pdfDataRangeTransport.abort) {\n        pdfDataRangeTransport.abort = function () {};\n      }\n    }\n    src = Object.create(src);\n    src.range = pdfDataRangeTransport;\n  }\n  task.onPassword = passwordCallback || null;\n  task.onProgress = progressCallback || null;\n  var source;\n  if (typeof src === 'string') {\n    source = { url: src };\n  } else if ((0, _util.isArrayBuffer)(src)) {\n    source = { data: src };\n  } else if (src instanceof PDFDataRangeTransport) {\n    source = { range: src };\n  } else {\n    if ((typeof src === 'undefined' ? 'undefined' : _typeof(src)) !== 'object') {\n      throw new Error('Invalid parameter in getDocument, ' + 'need either Uint8Array, string or a parameter object');\n    }\n    if (!src.url && !src.data && !src.range) {\n      throw new Error('Invalid parameter object: need either .data, .range or .url');\n    }\n    source = src;\n  }\n  var params = {};\n  var rangeTransport = null;\n  var worker = null;\n  var CMapReaderFactory = _dom_utils.DOMCMapReaderFactory;\n  for (var key in source) {\n    if (key === 'url' && typeof window !== 'undefined') {\n      params[key] = new URL(source[key], window.location).href;\n      continue;\n    } else if (key === 'range') {\n      rangeTransport = source[key];\n      continue;\n    } else if (key === 'worker') {\n      worker = source[key];\n      continue;\n    } else if (key === 'data' && !(source[key] instanceof Uint8Array)) {\n      var pdfBytes = source[key];\n      if (typeof pdfBytes === 'string') {\n        params[key] = (0, _util.stringToBytes)(pdfBytes);\n      } else if ((typeof pdfBytes === 'undefined' ? 'undefined' : _typeof(pdfBytes)) === 'object' && pdfBytes !== null && !isNaN(pdfBytes.length)) {\n        params[key] = new Uint8Array(pdfBytes);\n      } else if ((0, _util.isArrayBuffer)(pdfBytes)) {\n        params[key] = new Uint8Array(pdfBytes);\n      } else {\n        throw new Error('Invalid PDF binary data: either typed array, ' + 'string or array-like object is expected in the ' + 'data property.');\n      }\n      continue;\n    } else if (key === 'CMapReaderFactory') {\n      CMapReaderFactory = source[key];\n      continue;\n    }\n    params[key] = source[key];\n  }\n  params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE;\n  params.ignoreErrors = params.stopAtErrors !== true;\n  if (params.disableNativeImageDecoder !== undefined) {\n    (0, _util.deprecated)('parameter disableNativeImageDecoder, ' + 'use nativeImageDecoderSupport instead');\n  }\n  params.nativeImageDecoderSupport = params.nativeImageDecoderSupport || (params.disableNativeImageDecoder === true ? _util.NativeImageDecoding.NONE : _util.NativeImageDecoding.DECODE);\n  if (params.nativeImageDecoderSupport !== _util.NativeImageDecoding.DECODE && params.nativeImageDecoderSupport !== _util.NativeImageDecoding.NONE && params.nativeImageDecoderSupport !== _util.NativeImageDecoding.DISPLAY) {\n    (0, _util.warn)('Invalid parameter nativeImageDecoderSupport: ' + 'need a state of enum {NativeImageDecoding}');\n    params.nativeImageDecoderSupport = _util.NativeImageDecoding.DECODE;\n  }\n  if (!worker) {\n    var workerPort = (0, _dom_utils.getDefaultSetting)('workerPort');\n    worker = workerPort ? PDFWorker.fromPort(workerPort) : new PDFWorker();\n    task._worker = worker;\n  }\n  var docId = task.docId;\n  worker.promise.then(function () {\n    if (task.destroyed) {\n      throw new Error('Loading aborted');\n    }\n    return _fetchDocument(worker, params, rangeTransport, docId).then(function (workerId) {\n      if (task.destroyed) {\n        throw new Error('Loading aborted');\n      }\n      var networkStream = void 0;\n      if (rangeTransport) {\n        networkStream = new _transport_stream.PDFDataTransportStream(params, rangeTransport);\n      } else if (!params.data) {\n        networkStream = new PDFNetworkStream({\n          source: params,\n          disableRange: (0, _dom_utils.getDefaultSetting)('disableRange')\n        });\n      }\n      var messageHandler = new _util.MessageHandler(docId, workerId, worker.port);\n      messageHandler.postMessageTransfers = worker.postMessageTransfers;\n      var transport = new WorkerTransport(messageHandler, task, networkStream, CMapReaderFactory);\n      task._transport = transport;\n      messageHandler.send('Ready', null);\n    });\n  }).catch(task._capability.reject);\n  return task;\n}\nfunction _fetchDocument(worker, source, pdfDataRangeTransport, docId) {\n  if (worker.destroyed) {\n    return Promise.reject(new Error('Worker was destroyed'));\n  }\n  source.disableAutoFetch = (0, _dom_utils.getDefaultSetting)('disableAutoFetch');\n  source.disableStream = (0, _dom_utils.getDefaultSetting)('disableStream');\n  source.chunkedViewerLoading = !!pdfDataRangeTransport;\n  if (pdfDataRangeTransport) {\n    source.length = pdfDataRangeTransport.length;\n    source.initialData = pdfDataRangeTransport.initialData;\n  }\n  return worker.messageHandler.sendWithPromise('GetDocRequest', {\n    docId: docId,\n    source: {\n      data: source.data,\n      url: source.url,\n      password: source.password,\n      disableAutoFetch: source.disableAutoFetch,\n      rangeChunkSize: source.rangeChunkSize,\n      length: source.length\n    },\n    maxImageSize: (0, _dom_utils.getDefaultSetting)('maxImageSize'),\n    disableFontFace: (0, _dom_utils.getDefaultSetting)('disableFontFace'),\n    disableCreateObjectURL: (0, _dom_utils.getDefaultSetting)('disableCreateObjectURL'),\n    postMessageTransfers: (0, _dom_utils.getDefaultSetting)('postMessageTransfers') && !isPostMessageTransfersDisabled,\n    docBaseUrl: source.docBaseUrl,\n    nativeImageDecoderSupport: source.nativeImageDecoderSupport,\n    ignoreErrors: source.ignoreErrors\n  }).then(function (workerId) {\n    if (worker.destroyed) {\n      throw new Error('Worker was destroyed');\n    }\n    return workerId;\n  });\n}\nvar PDFDocumentLoadingTask = function PDFDocumentLoadingTaskClosure() {\n  var nextDocumentId = 0;\n  function PDFDocumentLoadingTask() {\n    this._capability = (0, _util.createPromiseCapability)();\n    this._transport = null;\n    this._worker = null;\n    this.docId = 'd' + nextDocumentId++;\n    this.destroyed = false;\n    this.onPassword = null;\n    this.onProgress = null;\n    this.onUnsupportedFeature = null;\n  }\n  PDFDocumentLoadingTask.prototype = {\n    get promise() {\n      return this._capability.promise;\n    },\n    destroy: function destroy() {\n      var _this = this;\n\n      this.destroyed = true;\n      var transportDestroyed = !this._transport ? Promise.resolve() : this._transport.destroy();\n      return transportDestroyed.then(function () {\n        _this._transport = null;\n        if (_this._worker) {\n          _this._worker.destroy();\n          _this._worker = null;\n        }\n      });\n    },\n\n    then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) {\n      return this.promise.then.apply(this.promise, arguments);\n    }\n  };\n  return PDFDocumentLoadingTask;\n}();\nvar PDFDataRangeTransport = function pdfDataRangeTransportClosure() {\n  function PDFDataRangeTransport(length, initialData) {\n    this.length = length;\n    this.initialData = initialData;\n    this._rangeListeners = [];\n    this._progressListeners = [];\n    this._progressiveReadListeners = [];\n    this._readyCapability = (0, _util.createPromiseCapability)();\n  }\n  PDFDataRangeTransport.prototype = {\n    addRangeListener: function PDFDataRangeTransport_addRangeListener(listener) {\n      this._rangeListeners.push(listener);\n    },\n    addProgressListener: function PDFDataRangeTransport_addProgressListener(listener) {\n      this._progressListeners.push(listener);\n    },\n    addProgressiveReadListener: function PDFDataRangeTransport_addProgressiveReadListener(listener) {\n      this._progressiveReadListeners.push(listener);\n    },\n    onDataRange: function PDFDataRangeTransport_onDataRange(begin, chunk) {\n      var listeners = this._rangeListeners;\n      for (var i = 0, n = listeners.length; i < n; ++i) {\n        listeners[i](begin, chunk);\n      }\n    },\n    onDataProgress: function PDFDataRangeTransport_onDataProgress(loaded) {\n      var _this2 = this;\n\n      this._readyCapability.promise.then(function () {\n        var listeners = _this2._progressListeners;\n        for (var i = 0, n = listeners.length; i < n; ++i) {\n          listeners[i](loaded);\n        }\n      });\n    },\n    onDataProgressiveRead: function PDFDataRangeTransport_onDataProgress(chunk) {\n      var _this3 = this;\n\n      this._readyCapability.promise.then(function () {\n        var listeners = _this3._progressiveReadListeners;\n        for (var i = 0, n = listeners.length; i < n; ++i) {\n          listeners[i](chunk);\n        }\n      });\n    },\n    transportReady: function PDFDataRangeTransport_transportReady() {\n      this._readyCapability.resolve();\n    },\n    requestDataRange: function PDFDataRangeTransport_requestDataRange(begin, end) {\n      throw new Error('Abstract method PDFDataRangeTransport.requestDataRange');\n    },\n    abort: function PDFDataRangeTransport_abort() {}\n  };\n  return PDFDataRangeTransport;\n}();\nvar PDFDocumentProxy = function PDFDocumentProxyClosure() {\n  function PDFDocumentProxy(pdfInfo, transport, loadingTask) {\n    this.pdfInfo = pdfInfo;\n    this.transport = transport;\n    this.loadingTask = loadingTask;\n  }\n  PDFDocumentProxy.prototype = {\n    get numPages() {\n      return this.pdfInfo.numPages;\n    },\n    get fingerprint() {\n      return this.pdfInfo.fingerprint;\n    },\n    getPage: function PDFDocumentProxy_getPage(pageNumber) {\n      return this.transport.getPage(pageNumber);\n    },\n    getPageIndex: function PDFDocumentProxy_getPageIndex(ref) {\n      return this.transport.getPageIndex(ref);\n    },\n    getDestinations: function PDFDocumentProxy_getDestinations() {\n      return this.transport.getDestinations();\n    },\n    getDestination: function PDFDocumentProxy_getDestination(id) {\n      return this.transport.getDestination(id);\n    },\n    getPageLabels: function PDFDocumentProxy_getPageLabels() {\n      return this.transport.getPageLabels();\n    },\n    getPageMode: function getPageMode() {\n      return this.transport.getPageMode();\n    },\n\n    getAttachments: function PDFDocumentProxy_getAttachments() {\n      return this.transport.getAttachments();\n    },\n    getJavaScript: function PDFDocumentProxy_getJavaScript() {\n      return this.transport.getJavaScript();\n    },\n    getOutline: function PDFDocumentProxy_getOutline() {\n      return this.transport.getOutline();\n    },\n    getMetadata: function PDFDocumentProxy_getMetadata() {\n      return this.transport.getMetadata();\n    },\n    getData: function PDFDocumentProxy_getData() {\n      return this.transport.getData();\n    },\n    getDownloadInfo: function PDFDocumentProxy_getDownloadInfo() {\n      return this.transport.downloadInfoCapability.promise;\n    },\n    getStats: function PDFDocumentProxy_getStats() {\n      return this.transport.getStats();\n    },\n    cleanup: function PDFDocumentProxy_cleanup() {\n      this.transport.startCleanup();\n    },\n    destroy: function PDFDocumentProxy_destroy() {\n      return this.loadingTask.destroy();\n    }\n  };\n  return PDFDocumentProxy;\n}();\nvar PDFPageProxy = function PDFPageProxyClosure() {\n  function PDFPageProxy(pageIndex, pageInfo, transport) {\n    this.pageIndex = pageIndex;\n    this.pageInfo = pageInfo;\n    this.transport = transport;\n    this.stats = new _util.StatTimer();\n    this.stats.enabled = (0, _dom_utils.getDefaultSetting)('enableStats');\n    this.commonObjs = transport.commonObjs;\n    this.objs = new PDFObjects();\n    this.cleanupAfterRender = false;\n    this.pendingCleanup = false;\n    this.intentStates = Object.create(null);\n    this.destroyed = false;\n  }\n  PDFPageProxy.prototype = {\n    get pageNumber() {\n      return this.pageIndex + 1;\n    },\n    get rotate() {\n      return this.pageInfo.rotate;\n    },\n    get ref() {\n      return this.pageInfo.ref;\n    },\n    get userUnit() {\n      return this.pageInfo.userUnit;\n    },\n    get view() {\n      return this.pageInfo.view;\n    },\n    getViewport: function PDFPageProxy_getViewport(scale, rotate) {\n      if (arguments.length < 2) {\n        rotate = this.rotate;\n      }\n      return new _util.PageViewport(this.view, scale, rotate, 0, 0);\n    },\n    getAnnotations: function PDFPageProxy_getAnnotations(params) {\n      var intent = params && params.intent || null;\n      if (!this.annotationsPromise || this.annotationsIntent !== intent) {\n        this.annotationsPromise = this.transport.getAnnotations(this.pageIndex, intent);\n        this.annotationsIntent = intent;\n      }\n      return this.annotationsPromise;\n    },\n    render: function PDFPageProxy_render(params) {\n      var _this4 = this;\n\n      var stats = this.stats;\n      stats.time('Overall');\n      this.pendingCleanup = false;\n      var renderingIntent = params.intent === 'print' ? 'print' : 'display';\n      var canvasFactory = params.canvasFactory || new _dom_utils.DOMCanvasFactory();\n      if (!this.intentStates[renderingIntent]) {\n        this.intentStates[renderingIntent] = Object.create(null);\n      }\n      var intentState = this.intentStates[renderingIntent];\n      if (!intentState.displayReadyCapability) {\n        intentState.receivingOperatorList = true;\n        intentState.displayReadyCapability = (0, _util.createPromiseCapability)();\n        intentState.operatorList = {\n          fnArray: [],\n          argsArray: [],\n          lastChunk: false\n        };\n        this.stats.time('Page Request');\n        this.transport.messageHandler.send('RenderPageRequest', {\n          pageIndex: this.pageNumber - 1,\n          intent: renderingIntent,\n          renderInteractiveForms: params.renderInteractiveForms === true\n        });\n      }\n      var complete = function complete(error) {\n        var i = intentState.renderTasks.indexOf(internalRenderTask);\n        if (i >= 0) {\n          intentState.renderTasks.splice(i, 1);\n        }\n        if (_this4.cleanupAfterRender) {\n          _this4.pendingCleanup = true;\n        }\n        _this4._tryCleanup();\n        if (error) {\n          internalRenderTask.capability.reject(error);\n        } else {\n          internalRenderTask.capability.resolve();\n        }\n        stats.timeEnd('Rendering');\n        stats.timeEnd('Overall');\n      };\n      var internalRenderTask = new InternalRenderTask(complete, params, this.objs, this.commonObjs, intentState.operatorList, this.pageNumber, canvasFactory);\n      internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print';\n      if (!intentState.renderTasks) {\n        intentState.renderTasks = [];\n      }\n      intentState.renderTasks.push(internalRenderTask);\n      var renderTask = internalRenderTask.task;\n      if (params.continueCallback) {\n        (0, _util.deprecated)('render is used with continueCallback parameter');\n        renderTask.onContinue = params.continueCallback;\n      }\n      intentState.displayReadyCapability.promise.then(function (transparency) {\n        if (_this4.pendingCleanup) {\n          complete();\n          return;\n        }\n        stats.time('Rendering');\n        internalRenderTask.initializeGraphics(transparency);\n        internalRenderTask.operatorListChanged();\n      }).catch(complete);\n      return renderTask;\n    },\n    getOperatorList: function PDFPageProxy_getOperatorList() {\n      function operatorListChanged() {\n        if (intentState.operatorList.lastChunk) {\n          intentState.opListReadCapability.resolve(intentState.operatorList);\n          var i = intentState.renderTasks.indexOf(opListTask);\n          if (i >= 0) {\n            intentState.renderTasks.splice(i, 1);\n          }\n        }\n      }\n      var renderingIntent = 'oplist';\n      if (!this.intentStates[renderingIntent]) {\n        this.intentStates[renderingIntent] = Object.create(null);\n      }\n      var intentState = this.intentStates[renderingIntent];\n      var opListTask;\n      if (!intentState.opListReadCapability) {\n        opListTask = {};\n        opListTask.operatorListChanged = operatorListChanged;\n        intentState.receivingOperatorList = true;\n        intentState.opListReadCapability = (0, _util.createPromiseCapability)();\n        intentState.renderTasks = [];\n        intentState.renderTasks.push(opListTask);\n        intentState.operatorList = {\n          fnArray: [],\n          argsArray: [],\n          lastChunk: false\n        };\n        this.transport.messageHandler.send('RenderPageRequest', {\n          pageIndex: this.pageIndex,\n          intent: renderingIntent\n        });\n      }\n      return intentState.opListReadCapability.promise;\n    },\n    streamTextContent: function streamTextContent() {\n      var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      var TEXT_CONTENT_CHUNK_SIZE = 100;\n      return this.transport.messageHandler.sendWithStream('GetTextContent', {\n        pageIndex: this.pageNumber - 1,\n        normalizeWhitespace: params.normalizeWhitespace === true,\n        combineTextItems: params.disableCombineTextItems !== true\n      }, {\n        highWaterMark: TEXT_CONTENT_CHUNK_SIZE,\n        size: function size(textContent) {\n          return textContent.items.length;\n        }\n      });\n    },\n\n    getTextContent: function PDFPageProxy_getTextContent(params) {\n      params = params || {};\n      var readableStream = this.streamTextContent(params);\n      return new Promise(function (resolve, reject) {\n        function pump() {\n          reader.read().then(function (_ref) {\n            var value = _ref.value,\n                done = _ref.done;\n\n            if (done) {\n              resolve(textContent);\n              return;\n            }\n            _util.Util.extendObj(textContent.styles, value.styles);\n            _util.Util.appendToArray(textContent.items, value.items);\n            pump();\n          }, reject);\n        }\n        var reader = readableStream.getReader();\n        var textContent = {\n          items: [],\n          styles: Object.create(null)\n        };\n        pump();\n      });\n    },\n    _destroy: function PDFPageProxy_destroy() {\n      this.destroyed = true;\n      this.transport.pageCache[this.pageIndex] = null;\n      var waitOn = [];\n      Object.keys(this.intentStates).forEach(function (intent) {\n        if (intent === 'oplist') {\n          return;\n        }\n        var intentState = this.intentStates[intent];\n        intentState.renderTasks.forEach(function (renderTask) {\n          var renderCompleted = renderTask.capability.promise.catch(function () {});\n          waitOn.push(renderCompleted);\n          renderTask.cancel();\n        });\n      }, this);\n      this.objs.clear();\n      this.annotationsPromise = null;\n      this.pendingCleanup = false;\n      return Promise.all(waitOn);\n    },\n    destroy: function destroy() {\n      (0, _util.deprecated)('page destroy method, use cleanup() instead');\n      this.cleanup();\n    },\n\n    cleanup: function PDFPageProxy_cleanup() {\n      this.pendingCleanup = true;\n      this._tryCleanup();\n    },\n    _tryCleanup: function PDFPageProxy_tryCleanup() {\n      if (!this.pendingCleanup || Object.keys(this.intentStates).some(function (intent) {\n        var intentState = this.intentStates[intent];\n        return intentState.renderTasks.length !== 0 || intentState.receivingOperatorList;\n      }, this)) {\n        return;\n      }\n      Object.keys(this.intentStates).forEach(function (intent) {\n        delete this.intentStates[intent];\n      }, this);\n      this.objs.clear();\n      this.annotationsPromise = null;\n      this.pendingCleanup = false;\n    },\n    _startRenderPage: function PDFPageProxy_startRenderPage(transparency, intent) {\n      var intentState = this.intentStates[intent];\n      if (intentState.displayReadyCapability) {\n        intentState.displayReadyCapability.resolve(transparency);\n      }\n    },\n    _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk, intent) {\n      var intentState = this.intentStates[intent];\n      var i, ii;\n      for (i = 0, ii = operatorListChunk.length; i < ii; i++) {\n        intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);\n        intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]);\n      }\n      intentState.operatorList.lastChunk = operatorListChunk.lastChunk;\n      for (i = 0; i < intentState.renderTasks.length; i++) {\n        intentState.renderTasks[i].operatorListChanged();\n      }\n      if (operatorListChunk.lastChunk) {\n        intentState.receivingOperatorList = false;\n        this._tryCleanup();\n      }\n    }\n  };\n  return PDFPageProxy;\n}();\n\nvar LoopbackPort = function () {\n  function LoopbackPort(defer) {\n    _classCallCheck(this, LoopbackPort);\n\n    this._listeners = [];\n    this._defer = defer;\n    this._deferred = Promise.resolve(undefined);\n  }\n\n  _createClass(LoopbackPort, [{\n    key: 'postMessage',\n    value: function postMessage(obj, transfers) {\n      var _this5 = this;\n\n      function cloneValue(value) {\n        if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) !== 'object' || value === null) {\n          return value;\n        }\n        if (cloned.has(value)) {\n          return cloned.get(value);\n        }\n        var result;\n        var buffer;\n        if ((buffer = value.buffer) && (0, _util.isArrayBuffer)(buffer)) {\n          var transferable = transfers && transfers.indexOf(buffer) >= 0;\n          if (value === buffer) {\n            result = value;\n          } else if (transferable) {\n            result = new value.constructor(buffer, value.byteOffset, value.byteLength);\n          } else {\n            result = new value.constructor(value);\n          }\n          cloned.set(value, result);\n          return result;\n        }\n        result = (0, _util.isArray)(value) ? [] : {};\n        cloned.set(value, result);\n        for (var i in value) {\n          var desc,\n              p = value;\n          while (!(desc = Object.getOwnPropertyDescriptor(p, i))) {\n            p = Object.getPrototypeOf(p);\n          }\n          if (typeof desc.value === 'undefined' || typeof desc.value === 'function') {\n            continue;\n          }\n          result[i] = cloneValue(desc.value);\n        }\n        return result;\n      }\n      if (!this._defer) {\n        this._listeners.forEach(function (listener) {\n          listener.call(this, { data: obj });\n        }, this);\n        return;\n      }\n      var cloned = new WeakMap();\n      var e = { data: cloneValue(obj) };\n      this._deferred.then(function () {\n        _this5._listeners.forEach(function (listener) {\n          listener.call(this, e);\n        }, _this5);\n      });\n    }\n  }, {\n    key: 'addEventListener',\n    value: function addEventListener(name, listener) {\n      this._listeners.push(listener);\n    }\n  }, {\n    key: 'removeEventListener',\n    value: function removeEventListener(name, listener) {\n      var i = this._listeners.indexOf(listener);\n      this._listeners.splice(i, 1);\n    }\n  }, {\n    key: 'terminate',\n    value: function terminate() {\n      this._listeners = [];\n    }\n  }]);\n\n  return LoopbackPort;\n}();\n\nvar PDFWorker = function PDFWorkerClosure() {\n  var nextFakeWorkerId = 0;\n  function getWorkerSrc() {\n    if (typeof workerSrc !== 'undefined') {\n      return workerSrc;\n    }\n    if ((0, _dom_utils.getDefaultSetting)('workerSrc')) {\n      return (0, _dom_utils.getDefaultSetting)('workerSrc');\n    }\n    if (pdfjsFilePath) {\n      return pdfjsFilePath.replace(/(\\.(?:min\\.)?js)(\\?.*)?$/i, '.worker$1$2');\n    }\n    throw new Error('No PDFJS.workerSrc specified');\n  }\n  var fakeWorkerFilesLoadedCapability = void 0;\n  function setupFakeWorkerGlobal() {\n    var WorkerMessageHandler;\n    if (fakeWorkerFilesLoadedCapability) {\n      return fakeWorkerFilesLoadedCapability.promise;\n    }\n    fakeWorkerFilesLoadedCapability = (0, _util.createPromiseCapability)();\n    var loader = fakeWorkerFilesLoader || function (callback) {\n      _util.Util.loadScript(getWorkerSrc(), function () {\n        callback(window.pdfjsDistBuildPdfWorker.WorkerMessageHandler);\n      });\n    };\n    loader(fakeWorkerFilesLoadedCapability.resolve);\n    return fakeWorkerFilesLoadedCapability.promise;\n  }\n  function createCDNWrapper(url) {\n    var wrapper = 'importScripts(\\'' + url + '\\');';\n    return URL.createObjectURL(new Blob([wrapper]));\n  }\n  var pdfWorkerPorts = new WeakMap();\n  function PDFWorker(name, port) {\n    if (port && pdfWorkerPorts.has(port)) {\n      throw new Error('Cannot use more than one PDFWorker per port');\n    }\n    this.name = name;\n    this.destroyed = false;\n    this.postMessageTransfers = true;\n    this._readyCapability = (0, _util.createPromiseCapability)();\n    this._port = null;\n    this._webWorker = null;\n    this._messageHandler = null;\n    if (port) {\n      pdfWorkerPorts.set(port, this);\n      this._initializeFromPort(port);\n      return;\n    }\n    this._initialize();\n  }\n  PDFWorker.prototype = {\n    get promise() {\n      return this._readyCapability.promise;\n    },\n    get port() {\n      return this._port;\n    },\n    get messageHandler() {\n      return this._messageHandler;\n    },\n    _initializeFromPort: function PDFWorker_initializeFromPort(port) {\n      this._port = port;\n      this._messageHandler = new _util.MessageHandler('main', 'worker', port);\n      this._messageHandler.on('ready', function () {});\n      this._readyCapability.resolve();\n    },\n    _initialize: function PDFWorker_initialize() {\n      var _this6 = this;\n\n      if (!isWorkerDisabled && !(0, _dom_utils.getDefaultSetting)('disableWorker') && typeof Worker !== 'undefined') {\n        var workerSrc = getWorkerSrc();\n        try {\n          if (!(0, _util.isSameOrigin)(window.location.href, workerSrc)) {\n            workerSrc = createCDNWrapper(new URL(workerSrc, window.location).href);\n          }\n          var worker = new Worker(workerSrc);\n          var messageHandler = new _util.MessageHandler('main', 'worker', worker);\n          var terminateEarly = function terminateEarly() {\n            worker.removeEventListener('error', onWorkerError);\n            messageHandler.destroy();\n            worker.terminate();\n            if (_this6.destroyed) {\n              _this6._readyCapability.reject(new Error('Worker was destroyed'));\n            } else {\n              _this6._setupFakeWorker();\n            }\n          };\n          var onWorkerError = function onWorkerError() {\n            if (!_this6._webWorker) {\n              terminateEarly();\n            }\n          };\n          worker.addEventListener('error', onWorkerError);\n          messageHandler.on('test', function (data) {\n            worker.removeEventListener('error', onWorkerError);\n            if (_this6.destroyed) {\n              terminateEarly();\n              return;\n            }\n            var supportTypedArray = data && data.supportTypedArray;\n            if (supportTypedArray) {\n              _this6._messageHandler = messageHandler;\n              _this6._port = worker;\n              _this6._webWorker = worker;\n              if (!data.supportTransfers) {\n                _this6.postMessageTransfers = false;\n                isPostMessageTransfersDisabled = true;\n              }\n              _this6._readyCapability.resolve();\n              messageHandler.send('configure', { verbosity: (0, _util.getVerbosityLevel)() });\n            } else {\n              _this6._setupFakeWorker();\n              messageHandler.destroy();\n              worker.terminate();\n            }\n          });\n          messageHandler.on('console_log', function (data) {\n            console.log.apply(console, data);\n          });\n          messageHandler.on('console_error', function (data) {\n            console.error.apply(console, data);\n          });\n          messageHandler.on('ready', function (data) {\n            worker.removeEventListener('error', onWorkerError);\n            if (_this6.destroyed) {\n              terminateEarly();\n              return;\n            }\n            try {\n              sendTest();\n            } catch (e) {\n              _this6._setupFakeWorker();\n            }\n          });\n          var sendTest = function sendTest() {\n            var postMessageTransfers = (0, _dom_utils.getDefaultSetting)('postMessageTransfers') && !isPostMessageTransfersDisabled;\n            var testObj = new Uint8Array([postMessageTransfers ? 255 : 0]);\n            try {\n              messageHandler.send('test', testObj, [testObj.buffer]);\n            } catch (ex) {\n              (0, _util.info)('Cannot use postMessage transfers');\n              testObj[0] = 0;\n              messageHandler.send('test', testObj);\n            }\n          };\n          sendTest();\n          return;\n        } catch (e) {\n          (0, _util.info)('The worker has been disabled.');\n        }\n      }\n      this._setupFakeWorker();\n    },\n    _setupFakeWorker: function PDFWorker_setupFakeWorker() {\n      var _this7 = this;\n\n      if (!isWorkerDisabled && !(0, _dom_utils.getDefaultSetting)('disableWorker')) {\n        (0, _util.warn)('Setting up fake worker.');\n        isWorkerDisabled = true;\n      }\n      setupFakeWorkerGlobal().then(function (WorkerMessageHandler) {\n        if (_this7.destroyed) {\n          _this7._readyCapability.reject(new Error('Worker was destroyed'));\n          return;\n        }\n        var isTypedArraysPresent = Uint8Array !== Float32Array;\n        var port = new LoopbackPort(isTypedArraysPresent);\n        _this7._port = port;\n        var id = 'fake' + nextFakeWorkerId++;\n        var workerHandler = new _util.MessageHandler(id + '_worker', id, port);\n        WorkerMessageHandler.setup(workerHandler, port);\n        var messageHandler = new _util.MessageHandler(id, id + '_worker', port);\n        _this7._messageHandler = messageHandler;\n        _this7._readyCapability.resolve();\n      });\n    },\n    destroy: function PDFWorker_destroy() {\n      this.destroyed = true;\n      if (this._webWorker) {\n        this._webWorker.terminate();\n        this._webWorker = null;\n      }\n      pdfWorkerPorts.delete(this._port);\n      this._port = null;\n      if (this._messageHandler) {\n        this._messageHandler.destroy();\n        this._messageHandler = null;\n      }\n    }\n  };\n  PDFWorker.fromPort = function (port) {\n    if (pdfWorkerPorts.has(port)) {\n      return pdfWorkerPorts.get(port);\n    }\n    return new PDFWorker(null, port);\n  };\n  return PDFWorker;\n}();\nvar WorkerTransport = function WorkerTransportClosure() {\n  function WorkerTransport(messageHandler, loadingTask, networkStream, CMapReaderFactory) {\n    this.messageHandler = messageHandler;\n    this.loadingTask = loadingTask;\n    this.commonObjs = new PDFObjects();\n    this.fontLoader = new _font_loader.FontLoader(loadingTask.docId);\n    this.CMapReaderFactory = new CMapReaderFactory({\n      baseUrl: (0, _dom_utils.getDefaultSetting)('cMapUrl'),\n      isCompressed: (0, _dom_utils.getDefaultSetting)('cMapPacked')\n    });\n    this.destroyed = false;\n    this.destroyCapability = null;\n    this._passwordCapability = null;\n    this._networkStream = networkStream;\n    this._fullReader = null;\n    this._lastProgress = null;\n    this.pageCache = [];\n    this.pagePromises = [];\n    this.downloadInfoCapability = (0, _util.createPromiseCapability)();\n    this.setupMessageHandler();\n  }\n  WorkerTransport.prototype = {\n    destroy: function WorkerTransport_destroy() {\n      var _this8 = this;\n\n      if (this.destroyCapability) {\n        return this.destroyCapability.promise;\n      }\n      this.destroyed = true;\n      this.destroyCapability = (0, _util.createPromiseCapability)();\n      if (this._passwordCapability) {\n        this._passwordCapability.reject(new Error('Worker was destroyed during onPassword callback'));\n      }\n      var waitOn = [];\n      this.pageCache.forEach(function (page) {\n        if (page) {\n          waitOn.push(page._destroy());\n        }\n      });\n      this.pageCache = [];\n      this.pagePromises = [];\n      var terminated = this.messageHandler.sendWithPromise('Terminate', null);\n      waitOn.push(terminated);\n      Promise.all(waitOn).then(function () {\n        _this8.fontLoader.clear();\n        if (_this8._networkStream) {\n          _this8._networkStream.cancelAllRequests();\n        }\n        if (_this8.messageHandler) {\n          _this8.messageHandler.destroy();\n          _this8.messageHandler = null;\n        }\n        _this8.destroyCapability.resolve();\n      }, this.destroyCapability.reject);\n      return this.destroyCapability.promise;\n    },\n    setupMessageHandler: function WorkerTransport_setupMessageHandler() {\n      var messageHandler = this.messageHandler;\n      var loadingTask = this.loadingTask;\n      messageHandler.on('GetReader', function (data, sink) {\n        var _this9 = this;\n\n        (0, _util.assert)(this._networkStream);\n        this._fullReader = this._networkStream.getFullReader();\n        this._fullReader.onProgress = function (evt) {\n          _this9._lastProgress = {\n            loaded: evt.loaded,\n            total: evt.total\n          };\n        };\n        sink.onPull = function () {\n          _this9._fullReader.read().then(function (_ref2) {\n            var value = _ref2.value,\n                done = _ref2.done;\n\n            if (done) {\n              sink.close();\n              return;\n            }\n            (0, _util.assert)((0, _util.isArrayBuffer)(value));\n            sink.enqueue(new Uint8Array(value), 1, [value]);\n          }).catch(function (reason) {\n            sink.error(reason);\n          });\n        };\n        sink.onCancel = function (reason) {\n          _this9._fullReader.cancel(reason);\n        };\n      }, this);\n      messageHandler.on('ReaderHeadersReady', function (data) {\n        var _this10 = this;\n\n        var headersCapability = (0, _util.createPromiseCapability)();\n        var fullReader = this._fullReader;\n        fullReader.headersReady.then(function () {\n          if (!fullReader.isStreamingSupported || !fullReader.isRangeSupported) {\n            if (_this10._lastProgress) {\n              var _loadingTask = _this10.loadingTask;\n              if (_loadingTask.onProgress) {\n                _loadingTask.onProgress(_this10._lastProgress);\n              }\n            }\n            fullReader.onProgress = function (evt) {\n              var loadingTask = _this10.loadingTask;\n              if (loadingTask.onProgress) {\n                loadingTask.onProgress({\n                  loaded: evt.loaded,\n                  total: evt.total\n                });\n              }\n            };\n          }\n          headersCapability.resolve({\n            isStreamingSupported: fullReader.isStreamingSupported,\n            isRangeSupported: fullReader.isRangeSupported,\n            contentLength: fullReader.contentLength\n          });\n        }, headersCapability.reject);\n        return headersCapability.promise;\n      }, this);\n      messageHandler.on('GetRangeReader', function (data, sink) {\n        (0, _util.assert)(this._networkStream);\n        var _rangeReader = this._networkStream.getRangeReader(data.begin, data.end);\n        sink.onPull = function () {\n          _rangeReader.read().then(function (_ref3) {\n            var value = _ref3.value,\n                done = _ref3.done;\n\n            if (done) {\n              sink.close();\n              return;\n            }\n            (0, _util.assert)((0, _util.isArrayBuffer)(value));\n            sink.enqueue(new Uint8Array(value), 1, [value]);\n          }).catch(function (reason) {\n            sink.error(reason);\n          });\n        };\n        sink.onCancel = function (reason) {\n          _rangeReader.cancel(reason);\n        };\n      }, this);\n      messageHandler.on('GetDoc', function transportDoc(data) {\n        var pdfInfo = data.pdfInfo;\n        this.numPages = data.pdfInfo.numPages;\n        var loadingTask = this.loadingTask;\n        var pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask);\n        this.pdfDocument = pdfDocument;\n        loadingTask._capability.resolve(pdfDocument);\n      }, this);\n      messageHandler.on('PasswordRequest', function transportPasswordRequest(exception) {\n        var _this11 = this;\n\n        this._passwordCapability = (0, _util.createPromiseCapability)();\n        if (loadingTask.onPassword) {\n          var updatePassword = function updatePassword(password) {\n            _this11._passwordCapability.resolve({ password: password });\n          };\n          loadingTask.onPassword(updatePassword, exception.code);\n        } else {\n          this._passwordCapability.reject(new _util.PasswordException(exception.message, exception.code));\n        }\n        return this._passwordCapability.promise;\n      }, this);\n      messageHandler.on('PasswordException', function transportPasswordException(exception) {\n        loadingTask._capability.reject(new _util.PasswordException(exception.message, exception.code));\n      }, this);\n      messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) {\n        this.loadingTask._capability.reject(new _util.InvalidPDFException(exception.message));\n      }, this);\n      messageHandler.on('MissingPDF', function transportMissingPDF(exception) {\n        this.loadingTask._capability.reject(new _util.MissingPDFException(exception.message));\n      }, this);\n      messageHandler.on('UnexpectedResponse', function transportUnexpectedResponse(exception) {\n        this.loadingTask._capability.reject(new _util.UnexpectedResponseException(exception.message, exception.status));\n      }, this);\n      messageHandler.on('UnknownError', function transportUnknownError(exception) {\n        this.loadingTask._capability.reject(new _util.UnknownErrorException(exception.message, exception.details));\n      }, this);\n      messageHandler.on('DataLoaded', function transportPage(data) {\n        this.downloadInfoCapability.resolve(data);\n      }, this);\n      messageHandler.on('PDFManagerReady', function transportPage(data) {}, this);\n      messageHandler.on('StartRenderPage', function transportRender(data) {\n        if (this.destroyed) {\n          return;\n        }\n        var page = this.pageCache[data.pageIndex];\n        page.stats.timeEnd('Page Request');\n        page._startRenderPage(data.transparency, data.intent);\n      }, this);\n      messageHandler.on('RenderPageChunk', function transportRender(data) {\n        if (this.destroyed) {\n          return;\n        }\n        var page = this.pageCache[data.pageIndex];\n        page._renderPageChunk(data.operatorList, data.intent);\n      }, this);\n      messageHandler.on('commonobj', function transportObj(data) {\n        var _this12 = this;\n\n        if (this.destroyed) {\n          return;\n        }\n        var id = data[0];\n        var type = data[1];\n        if (this.commonObjs.hasData(id)) {\n          return;\n        }\n        switch (type) {\n          case 'Font':\n            var exportedData = data[2];\n            if ('error' in exportedData) {\n              var exportedError = exportedData.error;\n              (0, _util.warn)('Error during font loading: ' + exportedError);\n              this.commonObjs.resolve(id, exportedError);\n              break;\n            }\n            var fontRegistry = null;\n            if ((0, _dom_utils.getDefaultSetting)('pdfBug') && _util.globalScope.FontInspector && _util.globalScope['FontInspector'].enabled) {\n              fontRegistry = {\n                registerFont: function registerFont(font, url) {\n                  _util.globalScope['FontInspector'].fontAdded(font, url);\n                }\n              };\n            }\n            var font = new _font_loader.FontFaceObject(exportedData, {\n              isEvalSuported: (0, _dom_utils.getDefaultSetting)('isEvalSupported'),\n              disableFontFace: (0, _dom_utils.getDefaultSetting)('disableFontFace'),\n              fontRegistry: fontRegistry\n            });\n            var fontReady = function fontReady(fontObjs) {\n              _this12.commonObjs.resolve(id, font);\n            };\n            this.fontLoader.bind([font], fontReady);\n            break;\n          case 'FontPath':\n            this.commonObjs.resolve(id, data[2]);\n            break;\n          default:\n            throw new Error('Got unknown common object type ' + type);\n        }\n      }, this);\n      messageHandler.on('obj', function transportObj(data) {\n        if (this.destroyed) {\n          return;\n        }\n        var id = data[0];\n        var pageIndex = data[1];\n        var type = data[2];\n        var pageProxy = this.pageCache[pageIndex];\n        var imageData;\n        if (pageProxy.objs.hasData(id)) {\n          return;\n        }\n        switch (type) {\n          case 'JpegStream':\n            imageData = data[3];\n            (0, _util.loadJpegStream)(id, imageData, pageProxy.objs);\n            break;\n          case 'Image':\n            imageData = data[3];\n            pageProxy.objs.resolve(id, imageData);\n            var MAX_IMAGE_SIZE_TO_STORE = 8000000;\n            if (imageData && 'data' in imageData && imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {\n              pageProxy.cleanupAfterRender = true;\n            }\n            break;\n          default:\n            throw new Error('Got unknown object type ' + type);\n        }\n      }, this);\n      messageHandler.on('DocProgress', function transportDocProgress(data) {\n        if (this.destroyed) {\n          return;\n        }\n        var loadingTask = this.loadingTask;\n        if (loadingTask.onProgress) {\n          loadingTask.onProgress({\n            loaded: data.loaded,\n            total: data.total\n          });\n        }\n      }, this);\n      messageHandler.on('PageError', function transportError(data) {\n        if (this.destroyed) {\n          return;\n        }\n        var page = this.pageCache[data.pageNum - 1];\n        var intentState = page.intentStates[data.intent];\n        if (intentState.displayReadyCapability) {\n          intentState.displayReadyCapability.reject(data.error);\n        } else {\n          throw new Error(data.error);\n        }\n        if (intentState.operatorList) {\n          intentState.operatorList.lastChunk = true;\n          for (var i = 0; i < intentState.renderTasks.length; i++) {\n            intentState.renderTasks[i].operatorListChanged();\n          }\n        }\n      }, this);\n      messageHandler.on('UnsupportedFeature', function transportUnsupportedFeature(data) {\n        if (this.destroyed) {\n          return;\n        }\n        var featureId = data.featureId;\n        var loadingTask = this.loadingTask;\n        if (loadingTask.onUnsupportedFeature) {\n          loadingTask.onUnsupportedFeature(featureId);\n        }\n        _UnsupportedManager.notify(featureId);\n      }, this);\n      messageHandler.on('JpegDecode', function (data) {\n        if (this.destroyed) {\n          return Promise.reject(new Error('Worker was destroyed'));\n        }\n        if (typeof document === 'undefined') {\n          return Promise.reject(new Error('\"document\" is not defined.'));\n        }\n        var imageUrl = data[0];\n        var components = data[1];\n        if (components !== 3 && components !== 1) {\n          return Promise.reject(new Error('Only 3 components or 1 component can be returned'));\n        }\n        return new Promise(function (resolve, reject) {\n          var img = new Image();\n          img.onload = function () {\n            var width = img.width;\n            var height = img.height;\n            var size = width * height;\n            var rgbaLength = size * 4;\n            var buf = new Uint8Array(size * components);\n            var tmpCanvas = document.createElement('canvas');\n            tmpCanvas.width = width;\n            tmpCanvas.height = height;\n            var tmpCtx = tmpCanvas.getContext('2d');\n            tmpCtx.drawImage(img, 0, 0);\n            var data = tmpCtx.getImageData(0, 0, width, height).data;\n            var i, j;\n            if (components === 3) {\n              for (i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {\n                buf[j] = data[i];\n                buf[j + 1] = data[i + 1];\n                buf[j + 2] = data[i + 2];\n              }\n            } else if (components === 1) {\n              for (i = 0, j = 0; i < rgbaLength; i += 4, j++) {\n                buf[j] = data[i];\n              }\n            }\n            resolve({\n              data: buf,\n              width: width,\n              height: height\n            });\n          };\n          img.onerror = function () {\n            reject(new Error('JpegDecode failed to load image'));\n          };\n          img.src = imageUrl;\n        });\n      }, this);\n      messageHandler.on('FetchBuiltInCMap', function (data) {\n        if (this.destroyed) {\n          return Promise.reject(new Error('Worker was destroyed'));\n        }\n        return this.CMapReaderFactory.fetch({ name: data.name });\n      }, this);\n    },\n    getData: function WorkerTransport_getData() {\n      return this.messageHandler.sendWithPromise('GetData', null);\n    },\n    getPage: function WorkerTransport_getPage(pageNumber, capability) {\n      var _this13 = this;\n\n      if (!(0, _util.isInt)(pageNumber) || pageNumber <= 0 || pageNumber > this.numPages) {\n        return Promise.reject(new Error('Invalid page request'));\n      }\n      var pageIndex = pageNumber - 1;\n      if (pageIndex in this.pagePromises) {\n        return this.pagePromises[pageIndex];\n      }\n      var promise = this.messageHandler.sendWithPromise('GetPage', { pageIndex: pageIndex }).then(function (pageInfo) {\n        if (_this13.destroyed) {\n          throw new Error('Transport destroyed');\n        }\n        var page = new PDFPageProxy(pageIndex, pageInfo, _this13);\n        _this13.pageCache[pageIndex] = page;\n        return page;\n      });\n      this.pagePromises[pageIndex] = promise;\n      return promise;\n    },\n    getPageIndex: function WorkerTransport_getPageIndexByRef(ref) {\n      return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref }).catch(function (reason) {\n        return Promise.reject(new Error(reason));\n      });\n    },\n    getAnnotations: function WorkerTransport_getAnnotations(pageIndex, intent) {\n      return this.messageHandler.sendWithPromise('GetAnnotations', {\n        pageIndex: pageIndex,\n        intent: intent\n      });\n    },\n    getDestinations: function WorkerTransport_getDestinations() {\n      return this.messageHandler.sendWithPromise('GetDestinations', null);\n    },\n    getDestination: function WorkerTransport_getDestination(id) {\n      return this.messageHandler.sendWithPromise('GetDestination', { id: id });\n    },\n    getPageLabels: function WorkerTransport_getPageLabels() {\n      return this.messageHandler.sendWithPromise('GetPageLabels', null);\n    },\n    getPageMode: function getPageMode() {\n      return this.messageHandler.sendWithPromise('GetPageMode', null);\n    },\n\n    getAttachments: function WorkerTransport_getAttachments() {\n      return this.messageHandler.sendWithPromise('GetAttachments', null);\n    },\n    getJavaScript: function WorkerTransport_getJavaScript() {\n      return this.messageHandler.sendWithPromise('GetJavaScript', null);\n    },\n    getOutline: function WorkerTransport_getOutline() {\n      return this.messageHandler.sendWithPromise('GetOutline', null);\n    },\n    getMetadata: function WorkerTransport_getMetadata() {\n      return this.messageHandler.sendWithPromise('GetMetadata', null).then(function transportMetadata(results) {\n        return {\n          info: results[0],\n          metadata: results[1] ? new _metadata.Metadata(results[1]) : null\n        };\n      });\n    },\n    getStats: function WorkerTransport_getStats() {\n      return this.messageHandler.sendWithPromise('GetStats', null);\n    },\n    startCleanup: function WorkerTransport_startCleanup() {\n      var _this14 = this;\n\n      this.messageHandler.sendWithPromise('Cleanup', null).then(function () {\n        for (var i = 0, ii = _this14.pageCache.length; i < ii; i++) {\n          var page = _this14.pageCache[i];\n          if (page) {\n            page.cleanup();\n          }\n        }\n        _this14.commonObjs.clear();\n        _this14.fontLoader.clear();\n      });\n    }\n  };\n  return WorkerTransport;\n}();\nvar PDFObjects = function PDFObjectsClosure() {\n  function PDFObjects() {\n    this.objs = Object.create(null);\n  }\n  PDFObjects.prototype = {\n    ensureObj: function PDFObjects_ensureObj(objId) {\n      if (this.objs[objId]) {\n        return this.objs[objId];\n      }\n      var obj = {\n        capability: (0, _util.createPromiseCapability)(),\n        data: null,\n        resolved: false\n      };\n      this.objs[objId] = obj;\n      return obj;\n    },\n    get: function PDFObjects_get(objId, callback) {\n      if (callback) {\n        this.ensureObj(objId).capability.promise.then(callback);\n        return null;\n      }\n      var obj = this.objs[objId];\n      if (!obj || !obj.resolved) {\n        throw new Error('Requesting object that isn\\'t resolved yet ' + objId);\n      }\n      return obj.data;\n    },\n    resolve: function PDFObjects_resolve(objId, data) {\n      var obj = this.ensureObj(objId);\n      obj.resolved = true;\n      obj.data = data;\n      obj.capability.resolve(data);\n    },\n    isResolved: function PDFObjects_isResolved(objId) {\n      var objs = this.objs;\n      if (!objs[objId]) {\n        return false;\n      }\n      return objs[objId].resolved;\n    },\n    hasData: function PDFObjects_hasData(objId) {\n      return this.isResolved(objId);\n    },\n    getData: function PDFObjects_getData(objId) {\n      var objs = this.objs;\n      if (!objs[objId] || !objs[objId].resolved) {\n        return null;\n      }\n      return objs[objId].data;\n    },\n    clear: function PDFObjects_clear() {\n      this.objs = Object.create(null);\n    }\n  };\n  return PDFObjects;\n}();\nvar RenderTask = function RenderTaskClosure() {\n  function RenderTask(internalRenderTask) {\n    this._internalRenderTask = internalRenderTask;\n    this.onContinue = null;\n  }\n  RenderTask.prototype = {\n    get promise() {\n      return this._internalRenderTask.capability.promise;\n    },\n    cancel: function RenderTask_cancel() {\n      this._internalRenderTask.cancel();\n    },\n    then: function RenderTask_then(onFulfilled, onRejected) {\n      return this.promise.then.apply(this.promise, arguments);\n    }\n  };\n  return RenderTask;\n}();\nvar InternalRenderTask = function InternalRenderTaskClosure() {\n  var canvasInRendering = new WeakMap();\n  function InternalRenderTask(callback, params, objs, commonObjs, operatorList, pageNumber, canvasFactory) {\n    this.callback = callback;\n    this.params = params;\n    this.objs = objs;\n    this.commonObjs = commonObjs;\n    this.operatorListIdx = null;\n    this.operatorList = operatorList;\n    this.pageNumber = pageNumber;\n    this.canvasFactory = canvasFactory;\n    this.running = false;\n    this.graphicsReadyCallback = null;\n    this.graphicsReady = false;\n    this.useRequestAnimationFrame = false;\n    this.cancelled = false;\n    this.capability = (0, _util.createPromiseCapability)();\n    this.task = new RenderTask(this);\n    this._continueBound = this._continue.bind(this);\n    this._scheduleNextBound = this._scheduleNext.bind(this);\n    this._nextBound = this._next.bind(this);\n    this._canvas = params.canvasContext.canvas;\n  }\n  InternalRenderTask.prototype = {\n    initializeGraphics: function InternalRenderTask_initializeGraphics(transparency) {\n      if (this._canvas) {\n        if (canvasInRendering.has(this._canvas)) {\n          throw new Error('Cannot use the same canvas during multiple render() operations. ' + 'Use different canvas or ensure previous operations were ' + 'cancelled or completed.');\n        }\n        canvasInRendering.set(this._canvas, this);\n      }\n      if (this.cancelled) {\n        return;\n      }\n      if ((0, _dom_utils.getDefaultSetting)('pdfBug') && _util.globalScope.StepperManager && _util.globalScope.StepperManager.enabled) {\n        this.stepper = _util.globalScope.StepperManager.create(this.pageNumber - 1);\n        this.stepper.init(this.operatorList);\n        this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();\n      }\n      var params = this.params;\n      this.gfx = new _canvas.CanvasGraphics(params.canvasContext, this.commonObjs, this.objs, this.canvasFactory, params.imageLayer);\n      this.gfx.beginDrawing({\n        transform: params.transform,\n        viewport: params.viewport,\n        transparency: transparency,\n        background: params.background\n      });\n      this.operatorListIdx = 0;\n      this.graphicsReady = true;\n      if (this.graphicsReadyCallback) {\n        this.graphicsReadyCallback();\n      }\n    },\n    cancel: function InternalRenderTask_cancel() {\n      this.running = false;\n      this.cancelled = true;\n      if (this._canvas) {\n        canvasInRendering.delete(this._canvas);\n      }\n      if ((0, _dom_utils.getDefaultSetting)('pdfjsNext')) {\n        this.callback(new _dom_utils.RenderingCancelledException('Rendering cancelled, page ' + this.pageNumber, 'canvas'));\n      } else {\n        this.callback('cancelled');\n      }\n    },\n    operatorListChanged: function InternalRenderTask_operatorListChanged() {\n      if (!this.graphicsReady) {\n        if (!this.graphicsReadyCallback) {\n          this.graphicsReadyCallback = this._continueBound;\n        }\n        return;\n      }\n      if (this.stepper) {\n        this.stepper.updateOperatorList(this.operatorList);\n      }\n      if (this.running) {\n        return;\n      }\n      this._continue();\n    },\n    _continue: function InternalRenderTask__continue() {\n      this.running = true;\n      if (this.cancelled) {\n        return;\n      }\n      if (this.task.onContinue) {\n        this.task.onContinue(this._scheduleNextBound);\n      } else {\n        this._scheduleNext();\n      }\n    },\n    _scheduleNext: function InternalRenderTask__scheduleNext() {\n      if (this.useRequestAnimationFrame && typeof window !== 'undefined') {\n        window.requestAnimationFrame(this._nextBound);\n      } else {\n        Promise.resolve(undefined).then(this._nextBound);\n      }\n    },\n    _next: function InternalRenderTask__next() {\n      if (this.cancelled) {\n        return;\n      }\n      this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper);\n      if (this.operatorListIdx === this.operatorList.argsArray.length) {\n        this.running = false;\n        if (this.operatorList.lastChunk) {\n          this.gfx.endDrawing();\n          if (this._canvas) {\n            canvasInRendering.delete(this._canvas);\n          }\n          this.callback();\n        }\n      }\n    }\n  };\n  return InternalRenderTask;\n}();\nvar _UnsupportedManager = function UnsupportedManagerClosure() {\n  var listeners = [];\n  return {\n    listen: function listen(cb) {\n      (0, _util.deprecated)('Global UnsupportedManager.listen is used: ' + ' use PDFDocumentLoadingTask.onUnsupportedFeature instead');\n      listeners.push(cb);\n    },\n    notify: function notify(featureId) {\n      for (var i = 0, ii = listeners.length; i < ii; i++) {\n        listeners[i](featureId);\n      }\n    }\n  };\n}();\nvar version, build;\n{\n  exports.version = version = '1.9.426';\n  exports.build = build = '2558a58d';\n}\nexports.getDocument = getDocument;\nexports.LoopbackPort = LoopbackPort;\nexports.PDFDataRangeTransport = PDFDataRangeTransport;\nexports.PDFWorker = PDFWorker;\nexports.PDFDocumentProxy = PDFDocumentProxy;\nexports.PDFPageProxy = PDFPageProxy;\nexports.setPDFNetworkStreamClass = setPDFNetworkStreamClass;\nexports._UnsupportedManager = _UnsupportedManager;\nexports.version = version;\nexports.build = build;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.AnnotationLayer = undefined;\n\nvar _dom_utils = __w_pdfjs_require__(1);\n\nvar _util = __w_pdfjs_require__(0);\n\nfunction AnnotationElementFactory() {}\nAnnotationElementFactory.prototype = {\n  create: function AnnotationElementFactory_create(parameters) {\n    var subtype = parameters.data.annotationType;\n    switch (subtype) {\n      case _util.AnnotationType.LINK:\n        return new LinkAnnotationElement(parameters);\n      case _util.AnnotationType.TEXT:\n        return new TextAnnotationElement(parameters);\n      case _util.AnnotationType.WIDGET:\n        var fieldType = parameters.data.fieldType;\n        switch (fieldType) {\n          case 'Tx':\n            return new TextWidgetAnnotationElement(parameters);\n          case 'Btn':\n            if (parameters.data.radioButton) {\n              return new RadioButtonWidgetAnnotationElement(parameters);\n            } else if (parameters.data.checkBox) {\n              return new CheckboxWidgetAnnotationElement(parameters);\n            }\n            (0, _util.warn)('Unimplemented button widget annotation: pushbutton');\n            break;\n          case 'Ch':\n            return new ChoiceWidgetAnnotationElement(parameters);\n        }\n        return new WidgetAnnotationElement(parameters);\n      case _util.AnnotationType.POPUP:\n        return new PopupAnnotationElement(parameters);\n      case _util.AnnotationType.LINE:\n        return new LineAnnotationElement(parameters);\n      case _util.AnnotationType.HIGHLIGHT:\n        return new HighlightAnnotationElement(parameters);\n      case _util.AnnotationType.UNDERLINE:\n        return new UnderlineAnnotationElement(parameters);\n      case _util.AnnotationType.SQUIGGLY:\n        return new SquigglyAnnotationElement(parameters);\n      case _util.AnnotationType.STRIKEOUT:\n        return new StrikeOutAnnotationElement(parameters);\n      case _util.AnnotationType.FILEATTACHMENT:\n        return new FileAttachmentAnnotationElement(parameters);\n      default:\n        return new AnnotationElement(parameters);\n    }\n  }\n};\nvar AnnotationElement = function AnnotationElementClosure() {\n  function AnnotationElement(parameters, isRenderable, ignoreBorder) {\n    this.isRenderable = isRenderable || false;\n    this.data = parameters.data;\n    this.layer = parameters.layer;\n    this.page = parameters.page;\n    this.viewport = parameters.viewport;\n    this.linkService = parameters.linkService;\n    this.downloadManager = parameters.downloadManager;\n    this.imageResourcesPath = parameters.imageResourcesPath;\n    this.renderInteractiveForms = parameters.renderInteractiveForms;\n    if (isRenderable) {\n      this.container = this._createContainer(ignoreBorder);\n    }\n  }\n  AnnotationElement.prototype = {\n    _createContainer: function AnnotationElement_createContainer(ignoreBorder) {\n      var data = this.data,\n          page = this.page,\n          viewport = this.viewport;\n      var container = document.createElement('section');\n      var width = data.rect[2] - data.rect[0];\n      var height = data.rect[3] - data.rect[1];\n      container.setAttribute('data-annotation-id', data.id);\n      var rect = _util.Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]);\n      _dom_utils.CustomStyle.setProp('transform', container, 'matrix(' + viewport.transform.join(',') + ')');\n      _dom_utils.CustomStyle.setProp('transformOrigin', container, -rect[0] + 'px ' + -rect[1] + 'px');\n      if (!ignoreBorder && data.borderStyle.width > 0) {\n        container.style.borderWidth = data.borderStyle.width + 'px';\n        if (data.borderStyle.style !== _util.AnnotationBorderStyleType.UNDERLINE) {\n          width = width - 2 * data.borderStyle.width;\n          height = height - 2 * data.borderStyle.width;\n        }\n        var horizontalRadius = data.borderStyle.horizontalCornerRadius;\n        var verticalRadius = data.borderStyle.verticalCornerRadius;\n        if (horizontalRadius > 0 || verticalRadius > 0) {\n          var radius = horizontalRadius + 'px / ' + verticalRadius + 'px';\n          _dom_utils.CustomStyle.setProp('borderRadius', container, radius);\n        }\n        switch (data.borderStyle.style) {\n          case _util.AnnotationBorderStyleType.SOLID:\n            container.style.borderStyle = 'solid';\n            break;\n          case _util.AnnotationBorderStyleType.DASHED:\n            container.style.borderStyle = 'dashed';\n            break;\n          case _util.AnnotationBorderStyleType.BEVELED:\n            (0, _util.warn)('Unimplemented border style: beveled');\n            break;\n          case _util.AnnotationBorderStyleType.INSET:\n            (0, _util.warn)('Unimplemented border style: inset');\n            break;\n          case _util.AnnotationBorderStyleType.UNDERLINE:\n            container.style.borderBottomStyle = 'solid';\n            break;\n          default:\n            break;\n        }\n        if (data.color) {\n          container.style.borderColor = _util.Util.makeCssRgb(data.color[0] | 0, data.color[1] | 0, data.color[2] | 0);\n        } else {\n          container.style.borderWidth = 0;\n        }\n      }\n      container.style.left = rect[0] + 'px';\n      container.style.top = rect[1] + 'px';\n      container.style.width = width + 'px';\n      container.style.height = height + 'px';\n      return container;\n    },\n    _createPopup: function AnnotationElement_createPopup(container, trigger, data) {\n      if (!trigger) {\n        trigger = document.createElement('div');\n        trigger.style.height = container.style.height;\n        trigger.style.width = container.style.width;\n        container.appendChild(trigger);\n      }\n      var popupElement = new PopupElement({\n        container: container,\n        trigger: trigger,\n        color: data.color,\n        title: data.title,\n        contents: data.contents,\n        hideWrapper: true\n      });\n      var popup = popupElement.render();\n      popup.style.left = container.style.width;\n      container.appendChild(popup);\n    },\n    render: function AnnotationElement_render() {\n      throw new Error('Abstract method AnnotationElement.render called');\n    }\n  };\n  return AnnotationElement;\n}();\nvar LinkAnnotationElement = function LinkAnnotationElementClosure() {\n  function LinkAnnotationElement(parameters) {\n    AnnotationElement.call(this, parameters, true);\n  }\n  _util.Util.inherit(LinkAnnotationElement, AnnotationElement, {\n    render: function LinkAnnotationElement_render() {\n      this.container.className = 'linkAnnotation';\n      var link = document.createElement('a');\n      (0, _dom_utils.addLinkAttributes)(link, {\n        url: this.data.url,\n        target: this.data.newWindow ? _dom_utils.LinkTarget.BLANK : undefined\n      });\n      if (!this.data.url) {\n        if (this.data.action) {\n          this._bindNamedAction(link, this.data.action);\n        } else {\n          this._bindLink(link, this.data.dest);\n        }\n      }\n      this.container.appendChild(link);\n      return this.container;\n    },\n    _bindLink: function _bindLink(link, destination) {\n      var _this = this;\n\n      link.href = this.linkService.getDestinationHash(destination);\n      link.onclick = function () {\n        if (destination) {\n          _this.linkService.navigateTo(destination);\n        }\n        return false;\n      };\n      if (destination) {\n        link.className = 'internalLink';\n      }\n    },\n    _bindNamedAction: function _bindNamedAction(link, action) {\n      var _this2 = this;\n\n      link.href = this.linkService.getAnchorUrl('');\n      link.onclick = function () {\n        _this2.linkService.executeNamedAction(action);\n        return false;\n      };\n      link.className = 'internalLink';\n    }\n  });\n  return LinkAnnotationElement;\n}();\nvar TextAnnotationElement = function TextAnnotationElementClosure() {\n  function TextAnnotationElement(parameters) {\n    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    AnnotationElement.call(this, parameters, isRenderable);\n  }\n  _util.Util.inherit(TextAnnotationElement, AnnotationElement, {\n    render: function TextAnnotationElement_render() {\n      this.container.className = 'textAnnotation';\n      var image = document.createElement('img');\n      image.style.height = this.container.style.height;\n      image.style.width = this.container.style.width;\n      image.src = this.imageResourcesPath + 'annotation-' + this.data.name.toLowerCase() + '.svg';\n      image.alt = '[{{type}} Annotation]';\n      image.dataset.l10nId = 'text_annotation_type';\n      image.dataset.l10nArgs = JSON.stringify({ type: this.data.name });\n      if (!this.data.hasPopup) {\n        this._createPopup(this.container, image, this.data);\n      }\n      this.container.appendChild(image);\n      return this.container;\n    }\n  });\n  return TextAnnotationElement;\n}();\nvar WidgetAnnotationElement = function WidgetAnnotationElementClosure() {\n  function WidgetAnnotationElement(parameters, isRenderable) {\n    AnnotationElement.call(this, parameters, isRenderable);\n  }\n  _util.Util.inherit(WidgetAnnotationElement, AnnotationElement, {\n    render: function WidgetAnnotationElement_render() {\n      return this.container;\n    }\n  });\n  return WidgetAnnotationElement;\n}();\nvar TextWidgetAnnotationElement = function TextWidgetAnnotationElementClosure() {\n  var TEXT_ALIGNMENT = ['left', 'center', 'right'];\n  function TextWidgetAnnotationElement(parameters) {\n    var isRenderable = parameters.renderInteractiveForms || !parameters.data.hasAppearance && !!parameters.data.fieldValue;\n    WidgetAnnotationElement.call(this, parameters, isRenderable);\n  }\n  _util.Util.inherit(TextWidgetAnnotationElement, WidgetAnnotationElement, {\n    render: function TextWidgetAnnotationElement_render() {\n      this.container.className = 'textWidgetAnnotation';\n      var element = null;\n      if (this.renderInteractiveForms) {\n        if (this.data.multiLine) {\n          element = document.createElement('textarea');\n          element.textContent = this.data.fieldValue;\n        } else {\n          element = document.createElement('input');\n          element.type = 'text';\n          element.setAttribute('value', this.data.fieldValue);\n        }\n        element.disabled = this.data.readOnly;\n        if (this.data.maxLen !== null) {\n          element.maxLength = this.data.maxLen;\n        }\n        if (this.data.comb) {\n          var fieldWidth = this.data.rect[2] - this.data.rect[0];\n          var combWidth = fieldWidth / this.data.maxLen;\n          element.classList.add('comb');\n          element.style.letterSpacing = 'calc(' + combWidth + 'px - 1ch)';\n        }\n      } else {\n        element = document.createElement('div');\n        element.textContent = this.data.fieldValue;\n        element.style.verticalAlign = 'middle';\n        element.style.display = 'table-cell';\n        var font = null;\n        if (this.data.fontRefName) {\n          font = this.page.commonObjs.getData(this.data.fontRefName);\n        }\n        this._setTextStyle(element, font);\n      }\n      if (this.data.textAlignment !== null) {\n        element.style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment];\n      }\n      this.container.appendChild(element);\n      return this.container;\n    },\n    _setTextStyle: function TextWidgetAnnotationElement_setTextStyle(element, font) {\n      var style = element.style;\n      style.fontSize = this.data.fontSize + 'px';\n      style.direction = this.data.fontDirection < 0 ? 'rtl' : 'ltr';\n      if (!font) {\n        return;\n      }\n      style.fontWeight = font.black ? font.bold ? '900' : 'bold' : font.bold ? 'bold' : 'normal';\n      style.fontStyle = font.italic ? 'italic' : 'normal';\n      var fontFamily = font.loadedName ? '\"' + font.loadedName + '\", ' : '';\n      var fallbackName = font.fallbackName || 'Helvetica, sans-serif';\n      style.fontFamily = fontFamily + fallbackName;\n    }\n  });\n  return TextWidgetAnnotationElement;\n}();\nvar CheckboxWidgetAnnotationElement = function CheckboxWidgetAnnotationElementClosure() {\n  function CheckboxWidgetAnnotationElement(parameters) {\n    WidgetAnnotationElement.call(this, parameters, parameters.renderInteractiveForms);\n  }\n  _util.Util.inherit(CheckboxWidgetAnnotationElement, WidgetAnnotationElement, {\n    render: function CheckboxWidgetAnnotationElement_render() {\n      this.container.className = 'buttonWidgetAnnotation checkBox';\n      var element = document.createElement('input');\n      element.disabled = this.data.readOnly;\n      element.type = 'checkbox';\n      if (this.data.fieldValue && this.data.fieldValue !== 'Off') {\n        element.setAttribute('checked', true);\n      }\n      this.container.appendChild(element);\n      return this.container;\n    }\n  });\n  return CheckboxWidgetAnnotationElement;\n}();\nvar RadioButtonWidgetAnnotationElement = function RadioButtonWidgetAnnotationElementClosure() {\n  function RadioButtonWidgetAnnotationElement(parameters) {\n    WidgetAnnotationElement.call(this, parameters, parameters.renderInteractiveForms);\n  }\n  _util.Util.inherit(RadioButtonWidgetAnnotationElement, WidgetAnnotationElement, {\n    render: function RadioButtonWidgetAnnotationElement_render() {\n      this.container.className = 'buttonWidgetAnnotation radioButton';\n      var element = document.createElement('input');\n      element.disabled = this.data.readOnly;\n      element.type = 'radio';\n      element.name = this.data.fieldName;\n      if (this.data.fieldValue === this.data.buttonValue) {\n        element.setAttribute('checked', true);\n      }\n      this.container.appendChild(element);\n      return this.container;\n    }\n  });\n  return RadioButtonWidgetAnnotationElement;\n}();\nvar ChoiceWidgetAnnotationElement = function ChoiceWidgetAnnotationElementClosure() {\n  function ChoiceWidgetAnnotationElement(parameters) {\n    WidgetAnnotationElement.call(this, parameters, parameters.renderInteractiveForms);\n  }\n  _util.Util.inherit(ChoiceWidgetAnnotationElement, WidgetAnnotationElement, {\n    render: function ChoiceWidgetAnnotationElement_render() {\n      this.container.className = 'choiceWidgetAnnotation';\n      var selectElement = document.createElement('select');\n      selectElement.disabled = this.data.readOnly;\n      if (!this.data.combo) {\n        selectElement.size = this.data.options.length;\n        if (this.data.multiSelect) {\n          selectElement.multiple = true;\n        }\n      }\n      for (var i = 0, ii = this.data.options.length; i < ii; i++) {\n        var option = this.data.options[i];\n        var optionElement = document.createElement('option');\n        optionElement.textContent = option.displayValue;\n        optionElement.value = option.exportValue;\n        if (this.data.fieldValue.indexOf(option.displayValue) >= 0) {\n          optionElement.setAttribute('selected', true);\n        }\n        selectElement.appendChild(optionElement);\n      }\n      this.container.appendChild(selectElement);\n      return this.container;\n    }\n  });\n  return ChoiceWidgetAnnotationElement;\n}();\nvar PopupAnnotationElement = function PopupAnnotationElementClosure() {\n  var IGNORE_TYPES = ['Line'];\n  function PopupAnnotationElement(parameters) {\n    var isRenderable = !!(parameters.data.title || parameters.data.contents);\n    AnnotationElement.call(this, parameters, isRenderable);\n  }\n  _util.Util.inherit(PopupAnnotationElement, AnnotationElement, {\n    render: function PopupAnnotationElement_render() {\n      this.container.className = 'popupAnnotation';\n      if (IGNORE_TYPES.indexOf(this.data.parentType) >= 0) {\n        return this.container;\n      }\n      var selector = '[data-annotation-id=\"' + this.data.parentId + '\"]';\n      var parentElement = this.layer.querySelector(selector);\n      if (!parentElement) {\n        return this.container;\n      }\n      var popup = new PopupElement({\n        container: this.container,\n        trigger: parentElement,\n        color: this.data.color,\n        title: this.data.title,\n        contents: this.data.contents\n      });\n      var parentLeft = parseFloat(parentElement.style.left);\n      var parentWidth = parseFloat(parentElement.style.width);\n      _dom_utils.CustomStyle.setProp('transformOrigin', this.container, -(parentLeft + parentWidth) + 'px -' + parentElement.style.top);\n      this.container.style.left = parentLeft + parentWidth + 'px';\n      this.container.appendChild(popup.render());\n      return this.container;\n    }\n  });\n  return PopupAnnotationElement;\n}();\nvar PopupElement = function PopupElementClosure() {\n  var BACKGROUND_ENLIGHT = 0.7;\n  function PopupElement(parameters) {\n    this.container = parameters.container;\n    this.trigger = parameters.trigger;\n    this.color = parameters.color;\n    this.title = parameters.title;\n    this.contents = parameters.contents;\n    this.hideWrapper = parameters.hideWrapper || false;\n    this.pinned = false;\n  }\n  PopupElement.prototype = {\n    render: function PopupElement_render() {\n      var wrapper = document.createElement('div');\n      wrapper.className = 'popupWrapper';\n      this.hideElement = this.hideWrapper ? wrapper : this.container;\n      this.hideElement.setAttribute('hidden', true);\n      var popup = document.createElement('div');\n      popup.className = 'popup';\n      var color = this.color;\n      if (color) {\n        var r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0];\n        var g = BACKGROUND_ENLIGHT * (255 - color[1]) + color[1];\n        var b = BACKGROUND_ENLIGHT * (255 - color[2]) + color[2];\n        popup.style.backgroundColor = _util.Util.makeCssRgb(r | 0, g | 0, b | 0);\n      }\n      var contents = this._formatContents(this.contents);\n      var title = document.createElement('h1');\n      title.textContent = this.title;\n      this.trigger.addEventListener('click', this._toggle.bind(this));\n      this.trigger.addEventListener('mouseover', this._show.bind(this, false));\n      this.trigger.addEventListener('mouseout', this._hide.bind(this, false));\n      popup.addEventListener('click', this._hide.bind(this, true));\n      popup.appendChild(title);\n      popup.appendChild(contents);\n      wrapper.appendChild(popup);\n      return wrapper;\n    },\n    _formatContents: function PopupElement_formatContents(contents) {\n      var p = document.createElement('p');\n      var lines = contents.split(/(?:\\r\\n?|\\n)/);\n      for (var i = 0, ii = lines.length; i < ii; ++i) {\n        var line = lines[i];\n        p.appendChild(document.createTextNode(line));\n        if (i < ii - 1) {\n          p.appendChild(document.createElement('br'));\n        }\n      }\n      return p;\n    },\n    _toggle: function PopupElement_toggle() {\n      if (this.pinned) {\n        this._hide(true);\n      } else {\n        this._show(true);\n      }\n    },\n    _show: function PopupElement_show(pin) {\n      if (pin) {\n        this.pinned = true;\n      }\n      if (this.hideElement.hasAttribute('hidden')) {\n        this.hideElement.removeAttribute('hidden');\n        this.container.style.zIndex += 1;\n      }\n    },\n    _hide: function PopupElement_hide(unpin) {\n      if (unpin) {\n        this.pinned = false;\n      }\n      if (!this.hideElement.hasAttribute('hidden') && !this.pinned) {\n        this.hideElement.setAttribute('hidden', true);\n        this.container.style.zIndex -= 1;\n      }\n    }\n  };\n  return PopupElement;\n}();\nvar LineAnnotationElement = function LineAnnotationElementClosure() {\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  function LineAnnotationElement(parameters) {\n    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    AnnotationElement.call(this, parameters, isRenderable, true);\n  }\n  _util.Util.inherit(LineAnnotationElement, AnnotationElement, {\n    render: function LineAnnotationElement_render() {\n      this.container.className = 'lineAnnotation';\n      var data = this.data;\n      var width = data.rect[2] - data.rect[0];\n      var height = data.rect[3] - data.rect[1];\n      var svg = document.createElementNS(SVG_NS, 'svg:svg');\n      svg.setAttributeNS(null, 'version', '1.1');\n      svg.setAttributeNS(null, 'width', width + 'px');\n      svg.setAttributeNS(null, 'height', height + 'px');\n      svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\n      svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);\n      var line = document.createElementNS(SVG_NS, 'svg:line');\n      line.setAttributeNS(null, 'x1', data.rect[2] - data.lineCoordinates[0]);\n      line.setAttributeNS(null, 'y1', data.rect[3] - data.lineCoordinates[1]);\n      line.setAttributeNS(null, 'x2', data.rect[2] - data.lineCoordinates[2]);\n      line.setAttributeNS(null, 'y2', data.rect[3] - data.lineCoordinates[3]);\n      line.setAttributeNS(null, 'stroke-width', data.borderStyle.width);\n      line.setAttributeNS(null, 'stroke', 'transparent');\n      svg.appendChild(line);\n      this.container.append(svg);\n      this._createPopup(this.container, line, this.data);\n      return this.container;\n    }\n  });\n  return LineAnnotationElement;\n}();\nvar HighlightAnnotationElement = function HighlightAnnotationElementClosure() {\n  function HighlightAnnotationElement(parameters) {\n    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    AnnotationElement.call(this, parameters, isRenderable, true);\n  }\n  _util.Util.inherit(HighlightAnnotationElement, AnnotationElement, {\n    render: function HighlightAnnotationElement_render() {\n      this.container.className = 'highlightAnnotation';\n      if (!this.data.hasPopup) {\n        this._createPopup(this.container, null, this.data);\n      }\n      return this.container;\n    }\n  });\n  return HighlightAnnotationElement;\n}();\nvar UnderlineAnnotationElement = function UnderlineAnnotationElementClosure() {\n  function UnderlineAnnotationElement(parameters) {\n    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    AnnotationElement.call(this, parameters, isRenderable, true);\n  }\n  _util.Util.inherit(UnderlineAnnotationElement, AnnotationElement, {\n    render: function UnderlineAnnotationElement_render() {\n      this.container.className = 'underlineAnnotation';\n      if (!this.data.hasPopup) {\n        this._createPopup(this.container, null, this.data);\n      }\n      return this.container;\n    }\n  });\n  return UnderlineAnnotationElement;\n}();\nvar SquigglyAnnotationElement = function SquigglyAnnotationElementClosure() {\n  function SquigglyAnnotationElement(parameters) {\n    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    AnnotationElement.call(this, parameters, isRenderable, true);\n  }\n  _util.Util.inherit(SquigglyAnnotationElement, AnnotationElement, {\n    render: function SquigglyAnnotationElement_render() {\n      this.container.className = 'squigglyAnnotation';\n      if (!this.data.hasPopup) {\n        this._createPopup(this.container, null, this.data);\n      }\n      return this.container;\n    }\n  });\n  return SquigglyAnnotationElement;\n}();\nvar StrikeOutAnnotationElement = function StrikeOutAnnotationElementClosure() {\n  function StrikeOutAnnotationElement(parameters) {\n    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);\n    AnnotationElement.call(this, parameters, isRenderable, true);\n  }\n  _util.Util.inherit(StrikeOutAnnotationElement, AnnotationElement, {\n    render: function StrikeOutAnnotationElement_render() {\n      this.container.className = 'strikeoutAnnotation';\n      if (!this.data.hasPopup) {\n        this._createPopup(this.container, null, this.data);\n      }\n      return this.container;\n    }\n  });\n  return StrikeOutAnnotationElement;\n}();\nvar FileAttachmentAnnotationElement = function FileAttachmentAnnotationElementClosure() {\n  function FileAttachmentAnnotationElement(parameters) {\n    AnnotationElement.call(this, parameters, true);\n    var file = this.data.file;\n    this.filename = (0, _dom_utils.getFilenameFromUrl)(file.filename);\n    this.content = file.content;\n    this.linkService.onFileAttachmentAnnotation({\n      id: (0, _util.stringToPDFString)(file.filename),\n      filename: file.filename,\n      content: file.content\n    });\n  }\n  _util.Util.inherit(FileAttachmentAnnotationElement, AnnotationElement, {\n    render: function FileAttachmentAnnotationElement_render() {\n      this.container.className = 'fileAttachmentAnnotation';\n      var trigger = document.createElement('div');\n      trigger.style.height = this.container.style.height;\n      trigger.style.width = this.container.style.width;\n      trigger.addEventListener('dblclick', this._download.bind(this));\n      if (!this.data.hasPopup && (this.data.title || this.data.contents)) {\n        this._createPopup(this.container, trigger, this.data);\n      }\n      this.container.appendChild(trigger);\n      return this.container;\n    },\n    _download: function FileAttachmentAnnotationElement_download() {\n      if (!this.downloadManager) {\n        (0, _util.warn)('Download cannot be started due to unavailable download manager');\n        return;\n      }\n      this.downloadManager.downloadData(this.content, this.filename, '');\n    }\n  });\n  return FileAttachmentAnnotationElement;\n}();\nvar AnnotationLayer = function AnnotationLayerClosure() {\n  return {\n    render: function AnnotationLayer_render(parameters) {\n      var annotationElementFactory = new AnnotationElementFactory();\n      for (var i = 0, ii = parameters.annotations.length; i < ii; i++) {\n        var data = parameters.annotations[i];\n        if (!data) {\n          continue;\n        }\n        var element = annotationElementFactory.create({\n          data: data,\n          layer: parameters.div,\n          page: parameters.page,\n          viewport: parameters.viewport,\n          linkService: parameters.linkService,\n          downloadManager: parameters.downloadManager,\n          imageResourcesPath: parameters.imageResourcesPath || (0, _dom_utils.getDefaultSetting)('imageResourcesPath'),\n          renderInteractiveForms: parameters.renderInteractiveForms || false\n        });\n        if (element.isRenderable) {\n          parameters.div.appendChild(element.render());\n        }\n      }\n    },\n    update: function AnnotationLayer_update(parameters) {\n      for (var i = 0, ii = parameters.annotations.length; i < ii; i++) {\n        var data = parameters.annotations[i];\n        var element = parameters.div.querySelector('[data-annotation-id=\"' + data.id + '\"]');\n        if (element) {\n          _dom_utils.CustomStyle.setProp('transform', element, 'matrix(' + parameters.viewport.transform.join(',') + ')');\n        }\n      }\n      parameters.div.removeAttribute('hidden');\n    }\n  };\n}();\nexports.AnnotationLayer = AnnotationLayer;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.SVGGraphics = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar SVGGraphics = function SVGGraphics() {\n  throw new Error('Not implemented: SVGGraphics');\n};\n{\n  var SVG_DEFAULTS = {\n    fontStyle: 'normal',\n    fontWeight: 'normal',\n    fillColor: '#000000'\n  };\n  var convertImgDataToPng = function convertImgDataToPngClosure() {\n    var PNG_HEADER = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);\n    var CHUNK_WRAPPER_SIZE = 12;\n    var crcTable = new Int32Array(256);\n    for (var i = 0; i < 256; i++) {\n      var c = i;\n      for (var h = 0; h < 8; h++) {\n        if (c & 1) {\n          c = 0xedB88320 ^ c >> 1 & 0x7fffffff;\n        } else {\n          c = c >> 1 & 0x7fffffff;\n        }\n      }\n      crcTable[i] = c;\n    }\n    function crc32(data, start, end) {\n      var crc = -1;\n      for (var i = start; i < end; i++) {\n        var a = (crc ^ data[i]) & 0xff;\n        var b = crcTable[a];\n        crc = crc >>> 8 ^ b;\n      }\n      return crc ^ -1;\n    }\n    function writePngChunk(type, body, data, offset) {\n      var p = offset;\n      var len = body.length;\n      data[p] = len >> 24 & 0xff;\n      data[p + 1] = len >> 16 & 0xff;\n      data[p + 2] = len >> 8 & 0xff;\n      data[p + 3] = len & 0xff;\n      p += 4;\n      data[p] = type.charCodeAt(0) & 0xff;\n      data[p + 1] = type.charCodeAt(1) & 0xff;\n      data[p + 2] = type.charCodeAt(2) & 0xff;\n      data[p + 3] = type.charCodeAt(3) & 0xff;\n      p += 4;\n      data.set(body, p);\n      p += body.length;\n      var crc = crc32(data, offset + 4, p);\n      data[p] = crc >> 24 & 0xff;\n      data[p + 1] = crc >> 16 & 0xff;\n      data[p + 2] = crc >> 8 & 0xff;\n      data[p + 3] = crc & 0xff;\n    }\n    function adler32(data, start, end) {\n      var a = 1;\n      var b = 0;\n      for (var i = start; i < end; ++i) {\n        a = (a + (data[i] & 0xff)) % 65521;\n        b = (b + a) % 65521;\n      }\n      return b << 16 | a;\n    }\n    function deflateSync(literals) {\n      if (!(0, _util.isNodeJS)()) {\n        return deflateSyncUncompressed(literals);\n      }\n      try {\n        var input;\n        if (parseInt(process.versions.node) >= 8) {\n          input = literals;\n        } else {\n          input = new Buffer(literals);\n        }\n        var output = require('zlib').deflateSync(input, { level: 9 });\n        return output instanceof Uint8Array ? output : new Uint8Array(output);\n      } catch (e) {\n        (0, _util.warn)('Not compressing PNG because zlib.deflateSync is unavailable: ' + e);\n      }\n      return deflateSyncUncompressed(literals);\n    }\n    function deflateSyncUncompressed(literals) {\n      var len = literals.length;\n      var maxBlockLength = 0xFFFF;\n      var deflateBlocks = Math.ceil(len / maxBlockLength);\n      var idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4);\n      var pi = 0;\n      idat[pi++] = 0x78;\n      idat[pi++] = 0x9c;\n      var pos = 0;\n      while (len > maxBlockLength) {\n        idat[pi++] = 0x00;\n        idat[pi++] = 0xff;\n        idat[pi++] = 0xff;\n        idat[pi++] = 0x00;\n        idat[pi++] = 0x00;\n        idat.set(literals.subarray(pos, pos + maxBlockLength), pi);\n        pi += maxBlockLength;\n        pos += maxBlockLength;\n        len -= maxBlockLength;\n      }\n      idat[pi++] = 0x01;\n      idat[pi++] = len & 0xff;\n      idat[pi++] = len >> 8 & 0xff;\n      idat[pi++] = ~len & 0xffff & 0xff;\n      idat[pi++] = (~len & 0xffff) >> 8 & 0xff;\n      idat.set(literals.subarray(pos), pi);\n      pi += literals.length - pos;\n      var adler = adler32(literals, 0, literals.length);\n      idat[pi++] = adler >> 24 & 0xff;\n      idat[pi++] = adler >> 16 & 0xff;\n      idat[pi++] = adler >> 8 & 0xff;\n      idat[pi++] = adler & 0xff;\n      return idat;\n    }\n    function encode(imgData, kind, forceDataSchema) {\n      var width = imgData.width;\n      var height = imgData.height;\n      var bitDepth, colorType, lineSize;\n      var bytes = imgData.data;\n      switch (kind) {\n        case _util.ImageKind.GRAYSCALE_1BPP:\n          colorType = 0;\n          bitDepth = 1;\n          lineSize = width + 7 >> 3;\n          break;\n        case _util.ImageKind.RGB_24BPP:\n          colorType = 2;\n          bitDepth = 8;\n          lineSize = width * 3;\n          break;\n        case _util.ImageKind.RGBA_32BPP:\n          colorType = 6;\n          bitDepth = 8;\n          lineSize = width * 4;\n          break;\n        default:\n          throw new Error('invalid format');\n      }\n      var literals = new Uint8Array((1 + lineSize) * height);\n      var offsetLiterals = 0,\n          offsetBytes = 0;\n      var y, i;\n      for (y = 0; y < height; ++y) {\n        literals[offsetLiterals++] = 0;\n        literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize), offsetLiterals);\n        offsetBytes += lineSize;\n        offsetLiterals += lineSize;\n      }\n      if (kind === _util.ImageKind.GRAYSCALE_1BPP) {\n        offsetLiterals = 0;\n        for (y = 0; y < height; y++) {\n          offsetLiterals++;\n          for (i = 0; i < lineSize; i++) {\n            literals[offsetLiterals++] ^= 0xFF;\n          }\n        }\n      }\n      var ihdr = new Uint8Array([width >> 24 & 0xff, width >> 16 & 0xff, width >> 8 & 0xff, width & 0xff, height >> 24 & 0xff, height >> 16 & 0xff, height >> 8 & 0xff, height & 0xff, bitDepth, colorType, 0x00, 0x00, 0x00]);\n      var idat = deflateSync(literals);\n      var pngLength = PNG_HEADER.length + CHUNK_WRAPPER_SIZE * 3 + ihdr.length + idat.length;\n      var data = new Uint8Array(pngLength);\n      var offset = 0;\n      data.set(PNG_HEADER, offset);\n      offset += PNG_HEADER.length;\n      writePngChunk('IHDR', ihdr, data, offset);\n      offset += CHUNK_WRAPPER_SIZE + ihdr.length;\n      writePngChunk('IDATA', idat, data, offset);\n      offset += CHUNK_WRAPPER_SIZE + idat.length;\n      writePngChunk('IEND', new Uint8Array(0), data, offset);\n      return (0, _util.createObjectURL)(data, 'image/png', forceDataSchema);\n    }\n    return function convertImgDataToPng(imgData, forceDataSchema) {\n      var kind = imgData.kind === undefined ? _util.ImageKind.GRAYSCALE_1BPP : imgData.kind;\n      return encode(imgData, kind, forceDataSchema);\n    };\n  }();\n  var SVGExtraState = function SVGExtraStateClosure() {\n    function SVGExtraState() {\n      this.fontSizeScale = 1;\n      this.fontWeight = SVG_DEFAULTS.fontWeight;\n      this.fontSize = 0;\n      this.textMatrix = _util.IDENTITY_MATRIX;\n      this.fontMatrix = _util.FONT_IDENTITY_MATRIX;\n      this.leading = 0;\n      this.x = 0;\n      this.y = 0;\n      this.lineX = 0;\n      this.lineY = 0;\n      this.charSpacing = 0;\n      this.wordSpacing = 0;\n      this.textHScale = 1;\n      this.textRise = 0;\n      this.fillColor = SVG_DEFAULTS.fillColor;\n      this.strokeColor = '#000000';\n      this.fillAlpha = 1;\n      this.strokeAlpha = 1;\n      this.lineWidth = 1;\n      this.lineJoin = '';\n      this.lineCap = '';\n      this.miterLimit = 0;\n      this.dashArray = [];\n      this.dashPhase = 0;\n      this.dependencies = [];\n      this.activeClipUrl = null;\n      this.clipGroup = null;\n      this.maskId = '';\n    }\n    SVGExtraState.prototype = {\n      clone: function SVGExtraState_clone() {\n        return Object.create(this);\n      },\n      setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) {\n        this.x = x;\n        this.y = y;\n      }\n    };\n    return SVGExtraState;\n  }();\n  exports.SVGGraphics = SVGGraphics = function SVGGraphicsClosure() {\n    function opListToTree(opList) {\n      var opTree = [];\n      var tmp = [];\n      var opListLen = opList.length;\n      for (var x = 0; x < opListLen; x++) {\n        if (opList[x].fn === 'save') {\n          opTree.push({\n            'fnId': 92,\n            'fn': 'group',\n            'items': []\n          });\n          tmp.push(opTree);\n          opTree = opTree[opTree.length - 1].items;\n          continue;\n        }\n        if (opList[x].fn === 'restore') {\n          opTree = tmp.pop();\n        } else {\n          opTree.push(opList[x]);\n        }\n      }\n      return opTree;\n    }\n    function pf(value) {\n      if (value === (value | 0)) {\n        return value.toString();\n      }\n      var s = value.toFixed(10);\n      var i = s.length - 1;\n      if (s[i] !== '0') {\n        return s;\n      }\n      do {\n        i--;\n      } while (s[i] === '0');\n      return s.substr(0, s[i] === '.' ? i : i + 1);\n    }\n    function pm(m) {\n      if (m[4] === 0 && m[5] === 0) {\n        if (m[1] === 0 && m[2] === 0) {\n          if (m[0] === 1 && m[3] === 1) {\n            return '';\n          }\n          return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')';\n        }\n        if (m[0] === m[3] && m[1] === -m[2]) {\n          var a = Math.acos(m[0]) * 180 / Math.PI;\n          return 'rotate(' + pf(a) + ')';\n        }\n      } else {\n        if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) {\n          return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')';\n        }\n      }\n      return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' + pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')';\n    }\n    function SVGGraphics(commonObjs, objs, forceDataSchema) {\n      this.current = new SVGExtraState();\n      this.transformMatrix = _util.IDENTITY_MATRIX;\n      this.transformStack = [];\n      this.extraStack = [];\n      this.commonObjs = commonObjs;\n      this.objs = objs;\n      this.pendingClip = null;\n      this.pendingEOFill = false;\n      this.embedFonts = false;\n      this.embeddedFonts = Object.create(null);\n      this.cssStyle = null;\n      this.forceDataSchema = !!forceDataSchema;\n    }\n    var NS = 'http://www.w3.org/2000/svg';\n    var XML_NS = 'http://www.w3.org/XML/1998/namespace';\n    var XLINK_NS = 'http://www.w3.org/1999/xlink';\n    var LINE_CAP_STYLES = ['butt', 'round', 'square'];\n    var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];\n    var clipCount = 0;\n    var maskCount = 0;\n    SVGGraphics.prototype = {\n      save: function SVGGraphics_save() {\n        this.transformStack.push(this.transformMatrix);\n        var old = this.current;\n        this.extraStack.push(old);\n        this.current = old.clone();\n      },\n      restore: function SVGGraphics_restore() {\n        this.transformMatrix = this.transformStack.pop();\n        this.current = this.extraStack.pop();\n        this.pendingClip = null;\n        this.tgrp = null;\n      },\n      group: function SVGGraphics_group(items) {\n        this.save();\n        this.executeOpTree(items);\n        this.restore();\n      },\n      loadDependencies: function SVGGraphics_loadDependencies(operatorList) {\n        var _this = this;\n\n        var fnArray = operatorList.fnArray;\n        var fnArrayLen = fnArray.length;\n        var argsArray = operatorList.argsArray;\n        for (var i = 0; i < fnArrayLen; i++) {\n          if (_util.OPS.dependency === fnArray[i]) {\n            var deps = argsArray[i];\n            for (var n = 0, nn = deps.length; n < nn; n++) {\n              var obj = deps[n];\n              var common = obj.substring(0, 2) === 'g_';\n              var promise;\n              if (common) {\n                promise = new Promise(function (resolve) {\n                  _this.commonObjs.get(obj, resolve);\n                });\n              } else {\n                promise = new Promise(function (resolve) {\n                  _this.objs.get(obj, resolve);\n                });\n              }\n              this.current.dependencies.push(promise);\n            }\n          }\n        }\n        return Promise.all(this.current.dependencies);\n      },\n      transform: function SVGGraphics_transform(a, b, c, d, e, f) {\n        var transformMatrix = [a, b, c, d, e, f];\n        this.transformMatrix = _util.Util.transform(this.transformMatrix, transformMatrix);\n        this.tgrp = null;\n      },\n      getSVG: function SVGGraphics_getSVG(operatorList, viewport) {\n        var _this2 = this;\n\n        this.viewport = viewport;\n        var svgElement = this._initialize(viewport);\n        return this.loadDependencies(operatorList).then(function () {\n          _this2.transformMatrix = _util.IDENTITY_MATRIX;\n          var opTree = _this2.convertOpList(operatorList);\n          _this2.executeOpTree(opTree);\n          return svgElement;\n        });\n      },\n      convertOpList: function SVGGraphics_convertOpList(operatorList) {\n        var argsArray = operatorList.argsArray;\n        var fnArray = operatorList.fnArray;\n        var fnArrayLen = fnArray.length;\n        var REVOPS = [];\n        var opList = [];\n        for (var op in _util.OPS) {\n          REVOPS[_util.OPS[op]] = op;\n        }\n        for (var x = 0; x < fnArrayLen; x++) {\n          var fnId = fnArray[x];\n          opList.push({\n            'fnId': fnId,\n            'fn': REVOPS[fnId],\n            'args': argsArray[x]\n          });\n        }\n        return opListToTree(opList);\n      },\n      executeOpTree: function SVGGraphics_executeOpTree(opTree) {\n        var opTreeLen = opTree.length;\n        for (var x = 0; x < opTreeLen; x++) {\n          var fn = opTree[x].fn;\n          var fnId = opTree[x].fnId;\n          var args = opTree[x].args;\n          switch (fnId | 0) {\n            case _util.OPS.beginText:\n              this.beginText();\n              break;\n            case _util.OPS.setLeading:\n              this.setLeading(args);\n              break;\n            case _util.OPS.setLeadingMoveText:\n              this.setLeadingMoveText(args[0], args[1]);\n              break;\n            case _util.OPS.setFont:\n              this.setFont(args);\n              break;\n            case _util.OPS.showText:\n              this.showText(args[0]);\n              break;\n            case _util.OPS.showSpacedText:\n              this.showText(args[0]);\n              break;\n            case _util.OPS.endText:\n              this.endText();\n              break;\n            case _util.OPS.moveText:\n              this.moveText(args[0], args[1]);\n              break;\n            case _util.OPS.setCharSpacing:\n              this.setCharSpacing(args[0]);\n              break;\n            case _util.OPS.setWordSpacing:\n              this.setWordSpacing(args[0]);\n              break;\n            case _util.OPS.setHScale:\n              this.setHScale(args[0]);\n              break;\n            case _util.OPS.setTextMatrix:\n              this.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);\n              break;\n            case _util.OPS.setLineWidth:\n              this.setLineWidth(args[0]);\n              break;\n            case _util.OPS.setLineJoin:\n              this.setLineJoin(args[0]);\n              break;\n            case _util.OPS.setLineCap:\n              this.setLineCap(args[0]);\n              break;\n            case _util.OPS.setMiterLimit:\n              this.setMiterLimit(args[0]);\n              break;\n            case _util.OPS.setFillRGBColor:\n              this.setFillRGBColor(args[0], args[1], args[2]);\n              break;\n            case _util.OPS.setStrokeRGBColor:\n              this.setStrokeRGBColor(args[0], args[1], args[2]);\n              break;\n            case _util.OPS.setDash:\n              this.setDash(args[0], args[1]);\n              break;\n            case _util.OPS.setGState:\n              this.setGState(args[0]);\n              break;\n            case _util.OPS.fill:\n              this.fill();\n              break;\n            case _util.OPS.eoFill:\n              this.eoFill();\n              break;\n            case _util.OPS.stroke:\n              this.stroke();\n              break;\n            case _util.OPS.fillStroke:\n              this.fillStroke();\n              break;\n            case _util.OPS.eoFillStroke:\n              this.eoFillStroke();\n              break;\n            case _util.OPS.clip:\n              this.clip('nonzero');\n              break;\n            case _util.OPS.eoClip:\n              this.clip('evenodd');\n              break;\n            case _util.OPS.paintSolidColorImageMask:\n              this.paintSolidColorImageMask();\n              break;\n            case _util.OPS.paintJpegXObject:\n              this.paintJpegXObject(args[0], args[1], args[2]);\n              break;\n            case _util.OPS.paintImageXObject:\n              this.paintImageXObject(args[0]);\n              break;\n            case _util.OPS.paintInlineImageXObject:\n              this.paintInlineImageXObject(args[0]);\n              break;\n            case _util.OPS.paintImageMaskXObject:\n              this.paintImageMaskXObject(args[0]);\n              break;\n            case _util.OPS.paintFormXObjectBegin:\n              this.paintFormXObjectBegin(args[0], args[1]);\n              break;\n            case _util.OPS.paintFormXObjectEnd:\n              this.paintFormXObjectEnd();\n              break;\n            case _util.OPS.closePath:\n              this.closePath();\n              break;\n            case _util.OPS.closeStroke:\n              this.closeStroke();\n              break;\n            case _util.OPS.closeFillStroke:\n              this.closeFillStroke();\n              break;\n            case _util.OPS.nextLine:\n              this.nextLine();\n              break;\n            case _util.OPS.transform:\n              this.transform(args[0], args[1], args[2], args[3], args[4], args[5]);\n              break;\n            case _util.OPS.constructPath:\n              this.constructPath(args[0], args[1]);\n              break;\n            case _util.OPS.endPath:\n              this.endPath();\n              break;\n            case 92:\n              this.group(opTree[x].items);\n              break;\n            default:\n              (0, _util.warn)('Unimplemented operator ' + fn);\n              break;\n          }\n        }\n      },\n      setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) {\n        this.current.wordSpacing = wordSpacing;\n      },\n      setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) {\n        this.current.charSpacing = charSpacing;\n      },\n      nextLine: function SVGGraphics_nextLine() {\n        this.moveText(0, this.current.leading);\n      },\n      setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) {\n        var current = this.current;\n        this.current.textMatrix = this.current.lineMatrix = [a, b, c, d, e, f];\n        this.current.x = this.current.lineX = 0;\n        this.current.y = this.current.lineY = 0;\n        current.xcoords = [];\n        current.tspan = document.createElementNS(NS, 'svg:tspan');\n        current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);\n        current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px');\n        current.tspan.setAttributeNS(null, 'y', pf(-current.y));\n        current.txtElement = document.createElementNS(NS, 'svg:text');\n        current.txtElement.appendChild(current.tspan);\n      },\n      beginText: function SVGGraphics_beginText() {\n        this.current.x = this.current.lineX = 0;\n        this.current.y = this.current.lineY = 0;\n        this.current.textMatrix = _util.IDENTITY_MATRIX;\n        this.current.lineMatrix = _util.IDENTITY_MATRIX;\n        this.current.tspan = document.createElementNS(NS, 'svg:tspan');\n        this.current.txtElement = document.createElementNS(NS, 'svg:text');\n        this.current.txtgrp = document.createElementNS(NS, 'svg:g');\n        this.current.xcoords = [];\n      },\n      moveText: function SVGGraphics_moveText(x, y) {\n        var current = this.current;\n        this.current.x = this.current.lineX += x;\n        this.current.y = this.current.lineY += y;\n        current.xcoords = [];\n        current.tspan = document.createElementNS(NS, 'svg:tspan');\n        current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);\n        current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px');\n        current.tspan.setAttributeNS(null, 'y', pf(-current.y));\n      },\n      showText: function SVGGraphics_showText(glyphs) {\n        var current = this.current;\n        var font = current.font;\n        var fontSize = current.fontSize;\n        if (fontSize === 0) {\n          return;\n        }\n        var charSpacing = current.charSpacing;\n        var wordSpacing = current.wordSpacing;\n        var fontDirection = current.fontDirection;\n        var textHScale = current.textHScale * fontDirection;\n        var glyphsLength = glyphs.length;\n        var vertical = font.vertical;\n        var widthAdvanceScale = fontSize * current.fontMatrix[0];\n        var x = 0,\n            i;\n        for (i = 0; i < glyphsLength; ++i) {\n          var glyph = glyphs[i];\n          if (glyph === null) {\n            x += fontDirection * wordSpacing;\n            continue;\n          } else if ((0, _util.isNum)(glyph)) {\n            x += -glyph * fontSize * 0.001;\n            continue;\n          }\n          current.xcoords.push(current.x + x * textHScale);\n          var width = glyph.width;\n          var character = glyph.fontChar;\n          var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n          var charWidth = width * widthAdvanceScale + spacing * fontDirection;\n          x += charWidth;\n          current.tspan.textContent += character;\n        }\n        if (vertical) {\n          current.y -= x * textHScale;\n        } else {\n          current.x += x * textHScale;\n        }\n        current.tspan.setAttributeNS(null, 'x', current.xcoords.map(pf).join(' '));\n        current.tspan.setAttributeNS(null, 'y', pf(-current.y));\n        current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);\n        current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px');\n        if (current.fontStyle !== SVG_DEFAULTS.fontStyle) {\n          current.tspan.setAttributeNS(null, 'font-style', current.fontStyle);\n        }\n        if (current.fontWeight !== SVG_DEFAULTS.fontWeight) {\n          current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight);\n        }\n        if (current.fillColor !== SVG_DEFAULTS.fillColor) {\n          current.tspan.setAttributeNS(null, 'fill', current.fillColor);\n        }\n        current.txtElement.setAttributeNS(null, 'transform', pm(current.textMatrix) + ' scale(1, -1)');\n        current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve');\n        current.txtElement.appendChild(current.tspan);\n        current.txtgrp.appendChild(current.txtElement);\n        this._ensureTransformGroup().appendChild(current.txtElement);\n      },\n      setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) {\n        this.setLeading(-y);\n        this.moveText(x, y);\n      },\n      addFontStyle: function SVGGraphics_addFontStyle(fontObj) {\n        if (!this.cssStyle) {\n          this.cssStyle = document.createElementNS(NS, 'svg:style');\n          this.cssStyle.setAttributeNS(null, 'type', 'text/css');\n          this.defs.appendChild(this.cssStyle);\n        }\n        var url = (0, _util.createObjectURL)(fontObj.data, fontObj.mimetype, this.forceDataSchema);\n        this.cssStyle.textContent += '@font-face { font-family: \"' + fontObj.loadedName + '\";' + ' src: url(' + url + '); }\\n';\n      },\n      setFont: function SVGGraphics_setFont(details) {\n        var current = this.current;\n        var fontObj = this.commonObjs.get(details[0]);\n        var size = details[1];\n        this.current.font = fontObj;\n        if (this.embedFonts && fontObj.data && !this.embeddedFonts[fontObj.loadedName]) {\n          this.addFontStyle(fontObj);\n          this.embeddedFonts[fontObj.loadedName] = fontObj;\n        }\n        current.fontMatrix = fontObj.fontMatrix ? fontObj.fontMatrix : _util.FONT_IDENTITY_MATRIX;\n        var bold = fontObj.black ? fontObj.bold ? 'bolder' : 'bold' : fontObj.bold ? 'bold' : 'normal';\n        var italic = fontObj.italic ? 'italic' : 'normal';\n        if (size < 0) {\n          size = -size;\n          current.fontDirection = -1;\n        } else {\n          current.fontDirection = 1;\n        }\n        current.fontSize = size;\n        current.fontFamily = fontObj.loadedName;\n        current.fontWeight = bold;\n        current.fontStyle = italic;\n        current.tspan = document.createElementNS(NS, 'svg:tspan');\n        current.tspan.setAttributeNS(null, 'y', pf(-current.y));\n        current.xcoords = [];\n      },\n      endText: function SVGGraphics_endText() {},\n      setLineWidth: function SVGGraphics_setLineWidth(width) {\n        this.current.lineWidth = width;\n      },\n      setLineCap: function SVGGraphics_setLineCap(style) {\n        this.current.lineCap = LINE_CAP_STYLES[style];\n      },\n      setLineJoin: function SVGGraphics_setLineJoin(style) {\n        this.current.lineJoin = LINE_JOIN_STYLES[style];\n      },\n      setMiterLimit: function SVGGraphics_setMiterLimit(limit) {\n        this.current.miterLimit = limit;\n      },\n      setStrokeAlpha: function SVGGraphics_setStrokeAlpha(strokeAlpha) {\n        this.current.strokeAlpha = strokeAlpha;\n      },\n      setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) {\n        var color = _util.Util.makeCssRgb(r, g, b);\n        this.current.strokeColor = color;\n      },\n      setFillAlpha: function SVGGraphics_setFillAlpha(fillAlpha) {\n        this.current.fillAlpha = fillAlpha;\n      },\n      setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) {\n        var color = _util.Util.makeCssRgb(r, g, b);\n        this.current.fillColor = color;\n        this.current.tspan = document.createElementNS(NS, 'svg:tspan');\n        this.current.xcoords = [];\n      },\n      setDash: function SVGGraphics_setDash(dashArray, dashPhase) {\n        this.current.dashArray = dashArray;\n        this.current.dashPhase = dashPhase;\n      },\n      constructPath: function SVGGraphics_constructPath(ops, args) {\n        var current = this.current;\n        var x = current.x,\n            y = current.y;\n        current.path = document.createElementNS(NS, 'svg:path');\n        var d = [];\n        var opLength = ops.length;\n        for (var i = 0, j = 0; i < opLength; i++) {\n          switch (ops[i] | 0) {\n            case _util.OPS.rectangle:\n              x = args[j++];\n              y = args[j++];\n              var width = args[j++];\n              var height = args[j++];\n              var xw = x + width;\n              var yh = y + height;\n              d.push('M', pf(x), pf(y), 'L', pf(xw), pf(y), 'L', pf(xw), pf(yh), 'L', pf(x), pf(yh), 'Z');\n              break;\n            case _util.OPS.moveTo:\n              x = args[j++];\n              y = args[j++];\n              d.push('M', pf(x), pf(y));\n              break;\n            case _util.OPS.lineTo:\n              x = args[j++];\n              y = args[j++];\n              d.push('L', pf(x), pf(y));\n              break;\n            case _util.OPS.curveTo:\n              x = args[j + 4];\n              y = args[j + 5];\n              d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3]), pf(x), pf(y));\n              j += 6;\n              break;\n            case _util.OPS.curveTo2:\n              x = args[j + 2];\n              y = args[j + 3];\n              d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3]));\n              j += 4;\n              break;\n            case _util.OPS.curveTo3:\n              x = args[j + 2];\n              y = args[j + 3];\n              d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y), pf(x), pf(y));\n              j += 4;\n              break;\n            case _util.OPS.closePath:\n              d.push('Z');\n              break;\n          }\n        }\n        current.path.setAttributeNS(null, 'd', d.join(' '));\n        current.path.setAttributeNS(null, 'fill', 'none');\n        this._ensureTransformGroup().appendChild(current.path);\n        current.element = current.path;\n        current.setCurrentPoint(x, y);\n      },\n      endPath: function SVGGraphics_endPath() {\n        if (!this.pendingClip) {\n          return;\n        }\n        var current = this.current;\n        var clipId = 'clippath' + clipCount;\n        clipCount++;\n        var clipPath = document.createElementNS(NS, 'svg:clipPath');\n        clipPath.setAttributeNS(null, 'id', clipId);\n        clipPath.setAttributeNS(null, 'transform', pm(this.transformMatrix));\n        var clipElement = current.element.cloneNode();\n        if (this.pendingClip === 'evenodd') {\n          clipElement.setAttributeNS(null, 'clip-rule', 'evenodd');\n        } else {\n          clipElement.setAttributeNS(null, 'clip-rule', 'nonzero');\n        }\n        this.pendingClip = null;\n        clipPath.appendChild(clipElement);\n        this.defs.appendChild(clipPath);\n        if (current.activeClipUrl) {\n          current.clipGroup = null;\n          this.extraStack.forEach(function (prev) {\n            prev.clipGroup = null;\n          });\n        }\n        current.activeClipUrl = 'url(#' + clipId + ')';\n        this.tgrp = null;\n      },\n      clip: function SVGGraphics_clip(type) {\n        this.pendingClip = type;\n      },\n      closePath: function SVGGraphics_closePath() {\n        var current = this.current;\n        var d = current.path.getAttributeNS(null, 'd');\n        d += 'Z';\n        current.path.setAttributeNS(null, 'd', d);\n      },\n      setLeading: function SVGGraphics_setLeading(leading) {\n        this.current.leading = -leading;\n      },\n      setTextRise: function SVGGraphics_setTextRise(textRise) {\n        this.current.textRise = textRise;\n      },\n      setHScale: function SVGGraphics_setHScale(scale) {\n        this.current.textHScale = scale / 100;\n      },\n      setGState: function SVGGraphics_setGState(states) {\n        for (var i = 0, ii = states.length; i < ii; i++) {\n          var state = states[i];\n          var key = state[0];\n          var value = state[1];\n          switch (key) {\n            case 'LW':\n              this.setLineWidth(value);\n              break;\n            case 'LC':\n              this.setLineCap(value);\n              break;\n            case 'LJ':\n              this.setLineJoin(value);\n              break;\n            case 'ML':\n              this.setMiterLimit(value);\n              break;\n            case 'D':\n              this.setDash(value[0], value[1]);\n              break;\n            case 'Font':\n              this.setFont(value);\n              break;\n            case 'CA':\n              this.setStrokeAlpha(value);\n              break;\n            case 'ca':\n              this.setFillAlpha(value);\n              break;\n            default:\n              (0, _util.warn)('Unimplemented graphic state ' + key);\n              break;\n          }\n        }\n      },\n      fill: function SVGGraphics_fill() {\n        var current = this.current;\n        current.element.setAttributeNS(null, 'fill', current.fillColor);\n        current.element.setAttributeNS(null, 'fill-opacity', current.fillAlpha);\n      },\n      stroke: function SVGGraphics_stroke() {\n        var current = this.current;\n        current.element.setAttributeNS(null, 'stroke', current.strokeColor);\n        current.element.setAttributeNS(null, 'stroke-opacity', current.strokeAlpha);\n        current.element.setAttributeNS(null, 'stroke-miterlimit', pf(current.miterLimit));\n        current.element.setAttributeNS(null, 'stroke-linecap', current.lineCap);\n        current.element.setAttributeNS(null, 'stroke-linejoin', current.lineJoin);\n        current.element.setAttributeNS(null, 'stroke-width', pf(current.lineWidth) + 'px');\n        current.element.setAttributeNS(null, 'stroke-dasharray', current.dashArray.map(pf).join(' '));\n        current.element.setAttributeNS(null, 'stroke-dashoffset', pf(current.dashPhase) + 'px');\n        current.element.setAttributeNS(null, 'fill', 'none');\n      },\n      eoFill: function SVGGraphics_eoFill() {\n        this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd');\n        this.fill();\n      },\n      fillStroke: function SVGGraphics_fillStroke() {\n        this.stroke();\n        this.fill();\n      },\n      eoFillStroke: function SVGGraphics_eoFillStroke() {\n        this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd');\n        this.fillStroke();\n      },\n      closeStroke: function SVGGraphics_closeStroke() {\n        this.closePath();\n        this.stroke();\n      },\n      closeFillStroke: function SVGGraphics_closeFillStroke() {\n        this.closePath();\n        this.fillStroke();\n      },\n      paintSolidColorImageMask: function SVGGraphics_paintSolidColorImageMask() {\n        var current = this.current;\n        var rect = document.createElementNS(NS, 'svg:rect');\n        rect.setAttributeNS(null, 'x', '0');\n        rect.setAttributeNS(null, 'y', '0');\n        rect.setAttributeNS(null, 'width', '1px');\n        rect.setAttributeNS(null, 'height', '1px');\n        rect.setAttributeNS(null, 'fill', current.fillColor);\n        this._ensureTransformGroup().appendChild(rect);\n      },\n      paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) {\n        var imgObj = this.objs.get(objId);\n        var imgEl = document.createElementNS(NS, 'svg:image');\n        imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src);\n        imgEl.setAttributeNS(null, 'width', pf(w));\n        imgEl.setAttributeNS(null, 'height', pf(h));\n        imgEl.setAttributeNS(null, 'x', '0');\n        imgEl.setAttributeNS(null, 'y', pf(-h));\n        imgEl.setAttributeNS(null, 'transform', 'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')');\n        this._ensureTransformGroup().appendChild(imgEl);\n      },\n      paintImageXObject: function SVGGraphics_paintImageXObject(objId) {\n        var imgData = this.objs.get(objId);\n        if (!imgData) {\n          (0, _util.warn)('Dependent image isn\\'t ready yet');\n          return;\n        }\n        this.paintInlineImageXObject(imgData);\n      },\n      paintInlineImageXObject: function SVGGraphics_paintInlineImageXObject(imgData, mask) {\n        var width = imgData.width;\n        var height = imgData.height;\n        var imgSrc = convertImgDataToPng(imgData, this.forceDataSchema);\n        var cliprect = document.createElementNS(NS, 'svg:rect');\n        cliprect.setAttributeNS(null, 'x', '0');\n        cliprect.setAttributeNS(null, 'y', '0');\n        cliprect.setAttributeNS(null, 'width', pf(width));\n        cliprect.setAttributeNS(null, 'height', pf(height));\n        this.current.element = cliprect;\n        this.clip('nonzero');\n        var imgEl = document.createElementNS(NS, 'svg:image');\n        imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc);\n        imgEl.setAttributeNS(null, 'x', '0');\n        imgEl.setAttributeNS(null, 'y', pf(-height));\n        imgEl.setAttributeNS(null, 'width', pf(width) + 'px');\n        imgEl.setAttributeNS(null, 'height', pf(height) + 'px');\n        imgEl.setAttributeNS(null, 'transform', 'scale(' + pf(1 / width) + ' ' + pf(-1 / height) + ')');\n        if (mask) {\n          mask.appendChild(imgEl);\n        } else {\n          this._ensureTransformGroup().appendChild(imgEl);\n        }\n      },\n      paintImageMaskXObject: function SVGGraphics_paintImageMaskXObject(imgData) {\n        var current = this.current;\n        var width = imgData.width;\n        var height = imgData.height;\n        var fillColor = current.fillColor;\n        current.maskId = 'mask' + maskCount++;\n        var mask = document.createElementNS(NS, 'svg:mask');\n        mask.setAttributeNS(null, 'id', current.maskId);\n        var rect = document.createElementNS(NS, 'svg:rect');\n        rect.setAttributeNS(null, 'x', '0');\n        rect.setAttributeNS(null, 'y', '0');\n        rect.setAttributeNS(null, 'width', pf(width));\n        rect.setAttributeNS(null, 'height', pf(height));\n        rect.setAttributeNS(null, 'fill', fillColor);\n        rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId + ')');\n        this.defs.appendChild(mask);\n        this._ensureTransformGroup().appendChild(rect);\n        this.paintInlineImageXObject(imgData, mask);\n      },\n      paintFormXObjectBegin: function SVGGraphics_paintFormXObjectBegin(matrix, bbox) {\n        if ((0, _util.isArray)(matrix) && matrix.length === 6) {\n          this.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);\n        }\n        if ((0, _util.isArray)(bbox) && bbox.length === 4) {\n          var width = bbox[2] - bbox[0];\n          var height = bbox[3] - bbox[1];\n          var cliprect = document.createElementNS(NS, 'svg:rect');\n          cliprect.setAttributeNS(null, 'x', bbox[0]);\n          cliprect.setAttributeNS(null, 'y', bbox[1]);\n          cliprect.setAttributeNS(null, 'width', pf(width));\n          cliprect.setAttributeNS(null, 'height', pf(height));\n          this.current.element = cliprect;\n          this.clip('nonzero');\n          this.endPath();\n        }\n      },\n      paintFormXObjectEnd: function SVGGraphics_paintFormXObjectEnd() {},\n      _initialize: function SVGGraphics_initialize(viewport) {\n        var svg = document.createElementNS(NS, 'svg:svg');\n        svg.setAttributeNS(null, 'version', '1.1');\n        svg.setAttributeNS(null, 'width', viewport.width + 'px');\n        svg.setAttributeNS(null, 'height', viewport.height + 'px');\n        svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\n        svg.setAttributeNS(null, 'viewBox', '0 0 ' + viewport.width + ' ' + viewport.height);\n        var definitions = document.createElementNS(NS, 'svg:defs');\n        svg.appendChild(definitions);\n        this.defs = definitions;\n        var rootGroup = document.createElementNS(NS, 'svg:g');\n        rootGroup.setAttributeNS(null, 'transform', pm(viewport.transform));\n        svg.appendChild(rootGroup);\n        this.svg = rootGroup;\n        return svg;\n      },\n      _ensureClipGroup: function SVGGraphics_ensureClipGroup() {\n        if (!this.current.clipGroup) {\n          var clipGroup = document.createElementNS(NS, 'svg:g');\n          clipGroup.setAttributeNS(null, 'clip-path', this.current.activeClipUrl);\n          this.svg.appendChild(clipGroup);\n          this.current.clipGroup = clipGroup;\n        }\n        return this.current.clipGroup;\n      },\n      _ensureTransformGroup: function SVGGraphics_ensureTransformGroup() {\n        if (!this.tgrp) {\n          this.tgrp = document.createElementNS(NS, 'svg:g');\n          this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));\n          if (this.current.activeClipUrl) {\n            this._ensureClipGroup().appendChild(this.tgrp);\n          } else {\n            this.svg.appendChild(this.tgrp);\n          }\n        }\n        return this.tgrp;\n      }\n    };\n    return SVGGraphics;\n  }();\n}\nexports.SVGGraphics = SVGGraphics;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.renderTextLayer = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _dom_utils = __w_pdfjs_require__(1);\n\nvar renderTextLayer = function renderTextLayerClosure() {\n  var MAX_TEXT_DIVS_TO_RENDER = 100000;\n  var NonWhitespaceRegexp = /\\S/;\n  function isAllWhitespace(str) {\n    return !NonWhitespaceRegexp.test(str);\n  }\n  var styleBuf = ['left: ', 0, 'px; top: ', 0, 'px; font-size: ', 0, 'px; font-family: ', '', ';'];\n  function appendText(task, geom, styles) {\n    var textDiv = document.createElement('div');\n    var textDivProperties = {\n      style: null,\n      angle: 0,\n      canvasWidth: 0,\n      isWhitespace: false,\n      originalTransform: null,\n      paddingBottom: 0,\n      paddingLeft: 0,\n      paddingRight: 0,\n      paddingTop: 0,\n      scale: 1\n    };\n    task._textDivs.push(textDiv);\n    if (isAllWhitespace(geom.str)) {\n      textDivProperties.isWhitespace = true;\n      task._textDivProperties.set(textDiv, textDivProperties);\n      return;\n    }\n    var tx = _util.Util.transform(task._viewport.transform, geom.transform);\n    var angle = Math.atan2(tx[1], tx[0]);\n    var style = styles[geom.fontName];\n    if (style.vertical) {\n      angle += Math.PI / 2;\n    }\n    var fontHeight = Math.sqrt(tx[2] * tx[2] + tx[3] * tx[3]);\n    var fontAscent = fontHeight;\n    if (style.ascent) {\n      fontAscent = style.ascent * fontAscent;\n    } else if (style.descent) {\n      fontAscent = (1 + style.descent) * fontAscent;\n    }\n    var left;\n    var top;\n    if (angle === 0) {\n      left = tx[4];\n      top = tx[5] - fontAscent;\n    } else {\n      left = tx[4] + fontAscent * Math.sin(angle);\n      top = tx[5] - fontAscent * Math.cos(angle);\n    }\n    styleBuf[1] = left;\n    styleBuf[3] = top;\n    styleBuf[5] = fontHeight;\n    styleBuf[7] = style.fontFamily;\n    textDivProperties.style = styleBuf.join('');\n    textDiv.setAttribute('style', textDivProperties.style);\n    textDiv.textContent = geom.str;\n    if ((0, _dom_utils.getDefaultSetting)('pdfBug')) {\n      textDiv.dataset.fontName = geom.fontName;\n    }\n    if (angle !== 0) {\n      textDivProperties.angle = angle * (180 / Math.PI);\n    }\n    if (geom.str.length > 1) {\n      if (style.vertical) {\n        textDivProperties.canvasWidth = geom.height * task._viewport.scale;\n      } else {\n        textDivProperties.canvasWidth = geom.width * task._viewport.scale;\n      }\n    }\n    task._textDivProperties.set(textDiv, textDivProperties);\n    if (task._textContentStream) {\n      task._layoutText(textDiv);\n    }\n    if (task._enhanceTextSelection) {\n      var angleCos = 1,\n          angleSin = 0;\n      if (angle !== 0) {\n        angleCos = Math.cos(angle);\n        angleSin = Math.sin(angle);\n      }\n      var divWidth = (style.vertical ? geom.height : geom.width) * task._viewport.scale;\n      var divHeight = fontHeight;\n      var m, b;\n      if (angle !== 0) {\n        m = [angleCos, angleSin, -angleSin, angleCos, left, top];\n        b = _util.Util.getAxialAlignedBoundingBox([0, 0, divWidth, divHeight], m);\n      } else {\n        b = [left, top, left + divWidth, top + divHeight];\n      }\n      task._bounds.push({\n        left: b[0],\n        top: b[1],\n        right: b[2],\n        bottom: b[3],\n        div: textDiv,\n        size: [divWidth, divHeight],\n        m: m\n      });\n    }\n  }\n  function render(task) {\n    if (task._canceled) {\n      return;\n    }\n    var textDivs = task._textDivs;\n    var capability = task._capability;\n    var textDivsLength = textDivs.length;\n    if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) {\n      task._renderingDone = true;\n      capability.resolve();\n      return;\n    }\n    if (!task._textContentStream) {\n      for (var i = 0; i < textDivsLength; i++) {\n        task._layoutText(textDivs[i]);\n      }\n    }\n    task._renderingDone = true;\n    capability.resolve();\n  }\n  function expand(task) {\n    var bounds = task._bounds;\n    var viewport = task._viewport;\n    var expanded = expandBounds(viewport.width, viewport.height, bounds);\n    for (var i = 0; i < expanded.length; i++) {\n      var div = bounds[i].div;\n      var divProperties = task._textDivProperties.get(div);\n      if (divProperties.angle === 0) {\n        divProperties.paddingLeft = bounds[i].left - expanded[i].left;\n        divProperties.paddingTop = bounds[i].top - expanded[i].top;\n        divProperties.paddingRight = expanded[i].right - bounds[i].right;\n        divProperties.paddingBottom = expanded[i].bottom - bounds[i].bottom;\n        task._textDivProperties.set(div, divProperties);\n        continue;\n      }\n      var e = expanded[i],\n          b = bounds[i];\n      var m = b.m,\n          c = m[0],\n          s = m[1];\n      var points = [[0, 0], [0, b.size[1]], [b.size[0], 0], b.size];\n      var ts = new Float64Array(64);\n      points.forEach(function (p, i) {\n        var t = _util.Util.applyTransform(p, m);\n        ts[i + 0] = c && (e.left - t[0]) / c;\n        ts[i + 4] = s && (e.top - t[1]) / s;\n        ts[i + 8] = c && (e.right - t[0]) / c;\n        ts[i + 12] = s && (e.bottom - t[1]) / s;\n        ts[i + 16] = s && (e.left - t[0]) / -s;\n        ts[i + 20] = c && (e.top - t[1]) / c;\n        ts[i + 24] = s && (e.right - t[0]) / -s;\n        ts[i + 28] = c && (e.bottom - t[1]) / c;\n        ts[i + 32] = c && (e.left - t[0]) / -c;\n        ts[i + 36] = s && (e.top - t[1]) / -s;\n        ts[i + 40] = c && (e.right - t[0]) / -c;\n        ts[i + 44] = s && (e.bottom - t[1]) / -s;\n        ts[i + 48] = s && (e.left - t[0]) / s;\n        ts[i + 52] = c && (e.top - t[1]) / -c;\n        ts[i + 56] = s && (e.right - t[0]) / s;\n        ts[i + 60] = c && (e.bottom - t[1]) / -c;\n      });\n      var findPositiveMin = function findPositiveMin(ts, offset, count) {\n        var result = 0;\n        for (var i = 0; i < count; i++) {\n          var t = ts[offset++];\n          if (t > 0) {\n            result = result ? Math.min(t, result) : t;\n          }\n        }\n        return result;\n      };\n      var boxScale = 1 + Math.min(Math.abs(c), Math.abs(s));\n      divProperties.paddingLeft = findPositiveMin(ts, 32, 16) / boxScale;\n      divProperties.paddingTop = findPositiveMin(ts, 48, 16) / boxScale;\n      divProperties.paddingRight = findPositiveMin(ts, 0, 16) / boxScale;\n      divProperties.paddingBottom = findPositiveMin(ts, 16, 16) / boxScale;\n      task._textDivProperties.set(div, divProperties);\n    }\n  }\n  function expandBounds(width, height, boxes) {\n    var bounds = boxes.map(function (box, i) {\n      return {\n        x1: box.left,\n        y1: box.top,\n        x2: box.right,\n        y2: box.bottom,\n        index: i,\n        x1New: undefined,\n        x2New: undefined\n      };\n    });\n    expandBoundsLTR(width, bounds);\n    var expanded = new Array(boxes.length);\n    bounds.forEach(function (b) {\n      var i = b.index;\n      expanded[i] = {\n        left: b.x1New,\n        top: 0,\n        right: b.x2New,\n        bottom: 0\n      };\n    });\n    boxes.map(function (box, i) {\n      var e = expanded[i],\n          b = bounds[i];\n      b.x1 = box.top;\n      b.y1 = width - e.right;\n      b.x2 = box.bottom;\n      b.y2 = width - e.left;\n      b.index = i;\n      b.x1New = undefined;\n      b.x2New = undefined;\n    });\n    expandBoundsLTR(height, bounds);\n    bounds.forEach(function (b) {\n      var i = b.index;\n      expanded[i].top = b.x1New;\n      expanded[i].bottom = b.x2New;\n    });\n    return expanded;\n  }\n  function expandBoundsLTR(width, bounds) {\n    bounds.sort(function (a, b) {\n      return a.x1 - b.x1 || a.index - b.index;\n    });\n    var fakeBoundary = {\n      x1: -Infinity,\n      y1: -Infinity,\n      x2: 0,\n      y2: Infinity,\n      index: -1,\n      x1New: 0,\n      x2New: 0\n    };\n    var horizon = [{\n      start: -Infinity,\n      end: Infinity,\n      boundary: fakeBoundary\n    }];\n    bounds.forEach(function (boundary) {\n      var i = 0;\n      while (i < horizon.length && horizon[i].end <= boundary.y1) {\n        i++;\n      }\n      var j = horizon.length - 1;\n      while (j >= 0 && horizon[j].start >= boundary.y2) {\n        j--;\n      }\n      var horizonPart, affectedBoundary;\n      var q,\n          k,\n          maxXNew = -Infinity;\n      for (q = i; q <= j; q++) {\n        horizonPart = horizon[q];\n        affectedBoundary = horizonPart.boundary;\n        var xNew;\n        if (affectedBoundary.x2 > boundary.x1) {\n          xNew = affectedBoundary.index > boundary.index ? affectedBoundary.x1New : boundary.x1;\n        } else if (affectedBoundary.x2New === undefined) {\n          xNew = (affectedBoundary.x2 + boundary.x1) / 2;\n        } else {\n          xNew = affectedBoundary.x2New;\n        }\n        if (xNew > maxXNew) {\n          maxXNew = xNew;\n        }\n      }\n      boundary.x1New = maxXNew;\n      for (q = i; q <= j; q++) {\n        horizonPart = horizon[q];\n        affectedBoundary = horizonPart.boundary;\n        if (affectedBoundary.x2New === undefined) {\n          if (affectedBoundary.x2 > boundary.x1) {\n            if (affectedBoundary.index > boundary.index) {\n              affectedBoundary.x2New = affectedBoundary.x2;\n            }\n          } else {\n            affectedBoundary.x2New = maxXNew;\n          }\n        } else if (affectedBoundary.x2New > maxXNew) {\n          affectedBoundary.x2New = Math.max(maxXNew, affectedBoundary.x2);\n        }\n      }\n      var changedHorizon = [],\n          lastBoundary = null;\n      for (q = i; q <= j; q++) {\n        horizonPart = horizon[q];\n        affectedBoundary = horizonPart.boundary;\n        var useBoundary = affectedBoundary.x2 > boundary.x2 ? affectedBoundary : boundary;\n        if (lastBoundary === useBoundary) {\n          changedHorizon[changedHorizon.length - 1].end = horizonPart.end;\n        } else {\n          changedHorizon.push({\n            start: horizonPart.start,\n            end: horizonPart.end,\n            boundary: useBoundary\n          });\n          lastBoundary = useBoundary;\n        }\n      }\n      if (horizon[i].start < boundary.y1) {\n        changedHorizon[0].start = boundary.y1;\n        changedHorizon.unshift({\n          start: horizon[i].start,\n          end: boundary.y1,\n          boundary: horizon[i].boundary\n        });\n      }\n      if (boundary.y2 < horizon[j].end) {\n        changedHorizon[changedHorizon.length - 1].end = boundary.y2;\n        changedHorizon.push({\n          start: boundary.y2,\n          end: horizon[j].end,\n          boundary: horizon[j].boundary\n        });\n      }\n      for (q = i; q <= j; q++) {\n        horizonPart = horizon[q];\n        affectedBoundary = horizonPart.boundary;\n        if (affectedBoundary.x2New !== undefined) {\n          continue;\n        }\n        var used = false;\n        for (k = i - 1; !used && k >= 0 && horizon[k].start >= affectedBoundary.y1; k--) {\n          used = horizon[k].boundary === affectedBoundary;\n        }\n        for (k = j + 1; !used && k < horizon.length && horizon[k].end <= affectedBoundary.y2; k++) {\n          used = horizon[k].boundary === affectedBoundary;\n        }\n        for (k = 0; !used && k < changedHorizon.length; k++) {\n          used = changedHorizon[k].boundary === affectedBoundary;\n        }\n        if (!used) {\n          affectedBoundary.x2New = maxXNew;\n        }\n      }\n      Array.prototype.splice.apply(horizon, [i, j - i + 1].concat(changedHorizon));\n    });\n    horizon.forEach(function (horizonPart) {\n      var affectedBoundary = horizonPart.boundary;\n      if (affectedBoundary.x2New === undefined) {\n        affectedBoundary.x2New = Math.max(width, affectedBoundary.x2);\n      }\n    });\n  }\n  function TextLayerRenderTask(_ref) {\n    var textContent = _ref.textContent,\n        textContentStream = _ref.textContentStream,\n        container = _ref.container,\n        viewport = _ref.viewport,\n        textDivs = _ref.textDivs,\n        textContentItemsStr = _ref.textContentItemsStr,\n        enhanceTextSelection = _ref.enhanceTextSelection;\n\n    this._textContent = textContent;\n    this._textContentStream = textContentStream;\n    this._container = container;\n    this._viewport = viewport;\n    this._textDivs = textDivs || [];\n    this._textContentItemsStr = textContentItemsStr || [];\n    this._enhanceTextSelection = !!enhanceTextSelection;\n    this._reader = null;\n    this._layoutTextLastFontSize = null;\n    this._layoutTextLastFontFamily = null;\n    this._layoutTextCtx = null;\n    this._textDivProperties = new WeakMap();\n    this._renderingDone = false;\n    this._canceled = false;\n    this._capability = (0, _util.createPromiseCapability)();\n    this._renderTimer = null;\n    this._bounds = [];\n  }\n  TextLayerRenderTask.prototype = {\n    get promise() {\n      return this._capability.promise;\n    },\n    cancel: function TextLayer_cancel() {\n      if (this._reader) {\n        this._reader.cancel(new _util.AbortException('text layer task cancelled'));\n        this._reader = null;\n      }\n      this._canceled = true;\n      if (this._renderTimer !== null) {\n        clearTimeout(this._renderTimer);\n        this._renderTimer = null;\n      }\n      this._capability.reject('canceled');\n    },\n    _processItems: function _processItems(items, styleCache) {\n      for (var i = 0, len = items.length; i < len; i++) {\n        this._textContentItemsStr.push(items[i].str);\n        appendText(this, items[i], styleCache);\n      }\n    },\n    _layoutText: function _layoutText(textDiv) {\n      var textLayerFrag = this._container;\n      var textDivProperties = this._textDivProperties.get(textDiv);\n      if (textDivProperties.isWhitespace) {\n        return;\n      }\n      var fontSize = textDiv.style.fontSize;\n      var fontFamily = textDiv.style.fontFamily;\n      if (fontSize !== this._layoutTextLastFontSize || fontFamily !== this._layoutTextLastFontFamily) {\n        this._layoutTextCtx.font = fontSize + ' ' + fontFamily;\n        this._lastFontSize = fontSize;\n        this._lastFontFamily = fontFamily;\n      }\n      var width = this._layoutTextCtx.measureText(textDiv.textContent).width;\n      var transform = '';\n      if (textDivProperties.canvasWidth !== 0 && width > 0) {\n        textDivProperties.scale = textDivProperties.canvasWidth / width;\n        transform = 'scaleX(' + textDivProperties.scale + ')';\n      }\n      if (textDivProperties.angle !== 0) {\n        transform = 'rotate(' + textDivProperties.angle + 'deg) ' + transform;\n      }\n      if (transform !== '') {\n        textDivProperties.originalTransform = transform;\n        _dom_utils.CustomStyle.setProp('transform', textDiv, transform);\n      }\n      this._textDivProperties.set(textDiv, textDivProperties);\n      textLayerFrag.appendChild(textDiv);\n    },\n\n    _render: function TextLayer_render(timeout) {\n      var _this = this;\n\n      var capability = (0, _util.createPromiseCapability)();\n      var styleCache = Object.create(null);\n      var canvas = document.createElement('canvas');\n      canvas.mozOpaque = true;\n      this._layoutTextCtx = canvas.getContext('2d', { alpha: false });\n      if (this._textContent) {\n        var textItems = this._textContent.items;\n        var textStyles = this._textContent.styles;\n        this._processItems(textItems, textStyles);\n        capability.resolve();\n      } else if (this._textContentStream) {\n        var pump = function pump() {\n          _this._reader.read().then(function (_ref2) {\n            var value = _ref2.value,\n                done = _ref2.done;\n\n            if (done) {\n              capability.resolve();\n              return;\n            }\n            _util.Util.extendObj(styleCache, value.styles);\n            _this._processItems(value.items, styleCache);\n            pump();\n          }, capability.reject);\n        };\n        this._reader = this._textContentStream.getReader();\n        pump();\n      } else {\n        throw new Error('Neither \"textContent\" nor \"textContentStream\"' + ' parameters specified.');\n      }\n      capability.promise.then(function () {\n        styleCache = null;\n        if (!timeout) {\n          render(_this);\n        } else {\n          _this._renderTimer = setTimeout(function () {\n            render(_this);\n            _this._renderTimer = null;\n          }, timeout);\n        }\n      }, this._capability.reject);\n    },\n    expandTextDivs: function TextLayer_expandTextDivs(expandDivs) {\n      if (!this._enhanceTextSelection || !this._renderingDone) {\n        return;\n      }\n      if (this._bounds !== null) {\n        expand(this);\n        this._bounds = null;\n      }\n      for (var i = 0, ii = this._textDivs.length; i < ii; i++) {\n        var div = this._textDivs[i];\n        var divProperties = this._textDivProperties.get(div);\n        if (divProperties.isWhitespace) {\n          continue;\n        }\n        if (expandDivs) {\n          var transform = '',\n              padding = '';\n          if (divProperties.scale !== 1) {\n            transform = 'scaleX(' + divProperties.scale + ')';\n          }\n          if (divProperties.angle !== 0) {\n            transform = 'rotate(' + divProperties.angle + 'deg) ' + transform;\n          }\n          if (divProperties.paddingLeft !== 0) {\n            padding += ' padding-left: ' + divProperties.paddingLeft / divProperties.scale + 'px;';\n            transform += ' translateX(' + -divProperties.paddingLeft / divProperties.scale + 'px)';\n          }\n          if (divProperties.paddingTop !== 0) {\n            padding += ' padding-top: ' + divProperties.paddingTop + 'px;';\n            transform += ' translateY(' + -divProperties.paddingTop + 'px)';\n          }\n          if (divProperties.paddingRight !== 0) {\n            padding += ' padding-right: ' + divProperties.paddingRight / divProperties.scale + 'px;';\n          }\n          if (divProperties.paddingBottom !== 0) {\n            padding += ' padding-bottom: ' + divProperties.paddingBottom + 'px;';\n          }\n          if (padding !== '') {\n            div.setAttribute('style', divProperties.style + padding);\n          }\n          if (transform !== '') {\n            _dom_utils.CustomStyle.setProp('transform', div, transform);\n          }\n        } else {\n          div.style.padding = 0;\n          _dom_utils.CustomStyle.setProp('transform', div, divProperties.originalTransform || '');\n        }\n      }\n    }\n  };\n  function renderTextLayer(renderParameters) {\n    var task = new TextLayerRenderTask({\n      textContent: renderParameters.textContent,\n      textContentStream: renderParameters.textContentStream,\n      container: renderParameters.container,\n      viewport: renderParameters.viewport,\n      textDivs: renderParameters.textDivs,\n      textContentItemsStr: renderParameters.textContentItemsStr,\n      enhanceTextSelection: renderParameters.enhanceTextSelection\n    });\n    task._render(renderParameters.timeout);\n    return task;\n  }\n  return renderTextLayer;\n}();\nexports.renderTextLayer = renderTextLayer;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nfunction fixMetadata(meta) {\n  return meta.replace(/>\\\\376\\\\377([^<]+)/g, function (all, codes) {\n    var bytes = codes.replace(/\\\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) {\n      return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);\n    });\n    var chars = '';\n    for (var i = 0; i < bytes.length; i += 2) {\n      var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);\n      chars += code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38 ? String.fromCharCode(code) : '&#x' + (0x10000 + code).toString(16).substring(1) + ';';\n    }\n    return '>' + chars;\n  });\n}\nfunction Metadata(meta) {\n  if (typeof meta === 'string') {\n    meta = fixMetadata(meta);\n    var parser = new DOMParser();\n    meta = parser.parseFromString(meta, 'application/xml');\n  } else if (!(meta instanceof Document)) {\n    throw new Error('Metadata: Invalid metadata object');\n  }\n  this.metaDocument = meta;\n  this.metadata = Object.create(null);\n  this.parse();\n}\nMetadata.prototype = {\n  parse: function Metadata_parse() {\n    var doc = this.metaDocument;\n    var rdf = doc.documentElement;\n    if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') {\n      rdf = rdf.firstChild;\n      while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf') {\n        rdf = rdf.nextSibling;\n      }\n    }\n    var nodeName = rdf ? rdf.nodeName.toLowerCase() : null;\n    if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes()) {\n      return;\n    }\n    var children = rdf.childNodes,\n        desc,\n        entry,\n        name,\n        i,\n        ii,\n        length,\n        iLength;\n    for (i = 0, length = children.length; i < length; i++) {\n      desc = children[i];\n      if (desc.nodeName.toLowerCase() !== 'rdf:description') {\n        continue;\n      }\n      for (ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) {\n        if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text') {\n          entry = desc.childNodes[ii];\n          name = entry.nodeName.toLowerCase();\n          this.metadata[name] = entry.textContent.trim();\n        }\n      }\n    }\n  },\n  get: function Metadata_get(name) {\n    return this.metadata[name] || null;\n  },\n  has: function Metadata_has(name) {\n    return typeof this.metadata[name] !== 'undefined';\n  }\n};\nexports.Metadata = Metadata;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.WebGLUtils = undefined;\n\nvar _dom_utils = __w_pdfjs_require__(1);\n\nvar _util = __w_pdfjs_require__(0);\n\nvar WebGLUtils = function WebGLUtilsClosure() {\n  function loadShader(gl, code, shaderType) {\n    var shader = gl.createShader(shaderType);\n    gl.shaderSource(shader, code);\n    gl.compileShader(shader);\n    var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n    if (!compiled) {\n      var errorMsg = gl.getShaderInfoLog(shader);\n      throw new Error('Error during shader compilation: ' + errorMsg);\n    }\n    return shader;\n  }\n  function createVertexShader(gl, code) {\n    return loadShader(gl, code, gl.VERTEX_SHADER);\n  }\n  function createFragmentShader(gl, code) {\n    return loadShader(gl, code, gl.FRAGMENT_SHADER);\n  }\n  function createProgram(gl, shaders) {\n    var program = gl.createProgram();\n    for (var i = 0, ii = shaders.length; i < ii; ++i) {\n      gl.attachShader(program, shaders[i]);\n    }\n    gl.linkProgram(program);\n    var linked = gl.getProgramParameter(program, gl.LINK_STATUS);\n    if (!linked) {\n      var errorMsg = gl.getProgramInfoLog(program);\n      throw new Error('Error during program linking: ' + errorMsg);\n    }\n    return program;\n  }\n  function createTexture(gl, image, textureId) {\n    gl.activeTexture(textureId);\n    var texture = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n    return texture;\n  }\n  var currentGL, currentCanvas;\n  function generateGL() {\n    if (currentGL) {\n      return;\n    }\n    currentCanvas = document.createElement('canvas');\n    currentGL = currentCanvas.getContext('webgl', { premultipliedalpha: false });\n  }\n  var smaskVertexShaderCode = '\\\n  attribute vec2 a_position;                                    \\\n  attribute vec2 a_texCoord;                                    \\\n                                                                \\\n  uniform vec2 u_resolution;                                    \\\n                                                                \\\n  varying vec2 v_texCoord;                                      \\\n                                                                \\\n  void main() {                                                 \\\n    vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0;   \\\n    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \\\n                                                                \\\n    v_texCoord = a_texCoord;                                    \\\n  }                                                             ';\n  var smaskFragmentShaderCode = '\\\n  precision mediump float;                                      \\\n                                                                \\\n  uniform vec4 u_backdrop;                                      \\\n  uniform int u_subtype;                                        \\\n  uniform sampler2D u_image;                                    \\\n  uniform sampler2D u_mask;                                     \\\n                                                                \\\n  varying vec2 v_texCoord;                                      \\\n                                                                \\\n  void main() {                                                 \\\n    vec4 imageColor = texture2D(u_image, v_texCoord);           \\\n    vec4 maskColor = texture2D(u_mask, v_texCoord);             \\\n    if (u_backdrop.a > 0.0) {                                   \\\n      maskColor.rgb = maskColor.rgb * maskColor.a +             \\\n                      u_backdrop.rgb * (1.0 - maskColor.a);     \\\n    }                                                           \\\n    float lum;                                                  \\\n    if (u_subtype == 0) {                                       \\\n      lum = maskColor.a;                                        \\\n    } else {                                                    \\\n      lum = maskColor.r * 0.3 + maskColor.g * 0.59 +            \\\n            maskColor.b * 0.11;                                 \\\n    }                                                           \\\n    imageColor.a *= lum;                                        \\\n    imageColor.rgb *= imageColor.a;                             \\\n    gl_FragColor = imageColor;                                  \\\n  }                                                             ';\n  var smaskCache = null;\n  function initSmaskGL() {\n    var canvas, gl;\n    generateGL();\n    canvas = currentCanvas;\n    currentCanvas = null;\n    gl = currentGL;\n    currentGL = null;\n    var vertexShader = createVertexShader(gl, smaskVertexShaderCode);\n    var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode);\n    var program = createProgram(gl, [vertexShader, fragmentShader]);\n    gl.useProgram(program);\n    var cache = {};\n    cache.gl = gl;\n    cache.canvas = canvas;\n    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');\n    cache.positionLocation = gl.getAttribLocation(program, 'a_position');\n    cache.backdropLocation = gl.getUniformLocation(program, 'u_backdrop');\n    cache.subtypeLocation = gl.getUniformLocation(program, 'u_subtype');\n    var texCoordLocation = gl.getAttribLocation(program, 'a_texCoord');\n    var texLayerLocation = gl.getUniformLocation(program, 'u_image');\n    var texMaskLocation = gl.getUniformLocation(program, 'u_mask');\n    var texCoordBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0]), gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(texCoordLocation);\n    gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);\n    gl.uniform1i(texLayerLocation, 0);\n    gl.uniform1i(texMaskLocation, 1);\n    smaskCache = cache;\n  }\n  function composeSMask(layer, mask, properties) {\n    var width = layer.width,\n        height = layer.height;\n    if (!smaskCache) {\n      initSmaskGL();\n    }\n    var cache = smaskCache,\n        canvas = cache.canvas,\n        gl = cache.gl;\n    canvas.width = width;\n    canvas.height = height;\n    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n    gl.uniform2f(cache.resolutionLocation, width, height);\n    if (properties.backdrop) {\n      gl.uniform4f(cache.resolutionLocation, properties.backdrop[0], properties.backdrop[1], properties.backdrop[2], 1);\n    } else {\n      gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0);\n    }\n    gl.uniform1i(cache.subtypeLocation, properties.subtype === 'Luminosity' ? 1 : 0);\n    var texture = createTexture(gl, layer, gl.TEXTURE0);\n    var maskTexture = createTexture(gl, mask, gl.TEXTURE1);\n    var buffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0, width, 0, 0, height, 0, height, width, 0, width, height]), gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(cache.positionLocation);\n    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);\n    gl.clearColor(0, 0, 0, 0);\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n    gl.clear(gl.COLOR_BUFFER_BIT);\n    gl.drawArrays(gl.TRIANGLES, 0, 6);\n    gl.flush();\n    gl.deleteTexture(texture);\n    gl.deleteTexture(maskTexture);\n    gl.deleteBuffer(buffer);\n    return canvas;\n  }\n  var figuresVertexShaderCode = '\\\n  attribute vec2 a_position;                                    \\\n  attribute vec3 a_color;                                       \\\n                                                                \\\n  uniform vec2 u_resolution;                                    \\\n  uniform vec2 u_scale;                                         \\\n  uniform vec2 u_offset;                                        \\\n                                                                \\\n  varying vec4 v_color;                                         \\\n                                                                \\\n  void main() {                                                 \\\n    vec2 position = (a_position + u_offset) * u_scale;          \\\n    vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0;     \\\n    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \\\n                                                                \\\n    v_color = vec4(a_color / 255.0, 1.0);                       \\\n  }                                                             ';\n  var figuresFragmentShaderCode = '\\\n  precision mediump float;                                      \\\n                                                                \\\n  varying vec4 v_color;                                         \\\n                                                                \\\n  void main() {                                                 \\\n    gl_FragColor = v_color;                                     \\\n  }                                                             ';\n  var figuresCache = null;\n  function initFiguresGL() {\n    var canvas, gl;\n    generateGL();\n    canvas = currentCanvas;\n    currentCanvas = null;\n    gl = currentGL;\n    currentGL = null;\n    var vertexShader = createVertexShader(gl, figuresVertexShaderCode);\n    var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode);\n    var program = createProgram(gl, [vertexShader, fragmentShader]);\n    gl.useProgram(program);\n    var cache = {};\n    cache.gl = gl;\n    cache.canvas = canvas;\n    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');\n    cache.scaleLocation = gl.getUniformLocation(program, 'u_scale');\n    cache.offsetLocation = gl.getUniformLocation(program, 'u_offset');\n    cache.positionLocation = gl.getAttribLocation(program, 'a_position');\n    cache.colorLocation = gl.getAttribLocation(program, 'a_color');\n    figuresCache = cache;\n  }\n  function drawFigures(width, height, backgroundColor, figures, context) {\n    if (!figuresCache) {\n      initFiguresGL();\n    }\n    var cache = figuresCache,\n        canvas = cache.canvas,\n        gl = cache.gl;\n    canvas.width = width;\n    canvas.height = height;\n    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n    gl.uniform2f(cache.resolutionLocation, width, height);\n    var count = 0;\n    var i, ii, rows;\n    for (i = 0, ii = figures.length; i < ii; i++) {\n      switch (figures[i].type) {\n        case 'lattice':\n          rows = figures[i].coords.length / figures[i].verticesPerRow | 0;\n          count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6;\n          break;\n        case 'triangles':\n          count += figures[i].coords.length;\n          break;\n      }\n    }\n    var coords = new Float32Array(count * 2);\n    var colors = new Uint8Array(count * 3);\n    var coordsMap = context.coords,\n        colorsMap = context.colors;\n    var pIndex = 0,\n        cIndex = 0;\n    for (i = 0, ii = figures.length; i < ii; i++) {\n      var figure = figures[i],\n          ps = figure.coords,\n          cs = figure.colors;\n      switch (figure.type) {\n        case 'lattice':\n          var cols = figure.verticesPerRow;\n          rows = ps.length / cols | 0;\n          for (var row = 1; row < rows; row++) {\n            var offset = row * cols + 1;\n            for (var col = 1; col < cols; col++, offset++) {\n              coords[pIndex] = coordsMap[ps[offset - cols - 1]];\n              coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1];\n              coords[pIndex + 2] = coordsMap[ps[offset - cols]];\n              coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1];\n              coords[pIndex + 4] = coordsMap[ps[offset - 1]];\n              coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1];\n              colors[cIndex] = colorsMap[cs[offset - cols - 1]];\n              colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1];\n              colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2];\n              colors[cIndex + 3] = colorsMap[cs[offset - cols]];\n              colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1];\n              colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2];\n              colors[cIndex + 6] = colorsMap[cs[offset - 1]];\n              colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1];\n              colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2];\n              coords[pIndex + 6] = coords[pIndex + 2];\n              coords[pIndex + 7] = coords[pIndex + 3];\n              coords[pIndex + 8] = coords[pIndex + 4];\n              coords[pIndex + 9] = coords[pIndex + 5];\n              coords[pIndex + 10] = coordsMap[ps[offset]];\n              coords[pIndex + 11] = coordsMap[ps[offset] + 1];\n              colors[cIndex + 9] = colors[cIndex + 3];\n              colors[cIndex + 10] = colors[cIndex + 4];\n              colors[cIndex + 11] = colors[cIndex + 5];\n              colors[cIndex + 12] = colors[cIndex + 6];\n              colors[cIndex + 13] = colors[cIndex + 7];\n              colors[cIndex + 14] = colors[cIndex + 8];\n              colors[cIndex + 15] = colorsMap[cs[offset]];\n              colors[cIndex + 16] = colorsMap[cs[offset] + 1];\n              colors[cIndex + 17] = colorsMap[cs[offset] + 2];\n              pIndex += 12;\n              cIndex += 18;\n            }\n          }\n          break;\n        case 'triangles':\n          for (var j = 0, jj = ps.length; j < jj; j++) {\n            coords[pIndex] = coordsMap[ps[j]];\n            coords[pIndex + 1] = coordsMap[ps[j] + 1];\n            colors[cIndex] = colorsMap[cs[j]];\n            colors[cIndex + 1] = colorsMap[cs[j] + 1];\n            colors[cIndex + 2] = colorsMap[cs[j] + 2];\n            pIndex += 2;\n            cIndex += 3;\n          }\n          break;\n      }\n    }\n    if (backgroundColor) {\n      gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255, backgroundColor[2] / 255, 1.0);\n    } else {\n      gl.clearColor(0, 0, 0, 0);\n    }\n    gl.clear(gl.COLOR_BUFFER_BIT);\n    var coordsBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(cache.positionLocation);\n    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);\n    var colorsBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(cache.colorLocation);\n    gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false, 0, 0);\n    gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY);\n    gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY);\n    gl.drawArrays(gl.TRIANGLES, 0, count);\n    gl.flush();\n    gl.deleteBuffer(coordsBuffer);\n    gl.deleteBuffer(colorsBuffer);\n    return canvas;\n  }\n  function cleanup() {\n    if (smaskCache && smaskCache.canvas) {\n      smaskCache.canvas.width = 0;\n      smaskCache.canvas.height = 0;\n    }\n    if (figuresCache && figuresCache.canvas) {\n      figuresCache.canvas.width = 0;\n      figuresCache.canvas.height = 0;\n    }\n    smaskCache = null;\n    figuresCache = null;\n  }\n  return {\n    get isEnabled() {\n      if ((0, _dom_utils.getDefaultSetting)('disableWebGL')) {\n        return false;\n      }\n      var enabled = false;\n      try {\n        generateGL();\n        enabled = !!currentGL;\n      } catch (e) {}\n      return (0, _util.shadow)(this, 'isEnabled', enabled);\n    },\n    composeSMask: composeSMask,\n    drawFigures: drawFigures,\n    clear: cleanup\n  };\n}();\nexports.WebGLUtils = WebGLUtils;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PDFJS = exports.isWorker = exports.globalScope = undefined;\n\nvar _api = __w_pdfjs_require__(2);\n\nvar _dom_utils = __w_pdfjs_require__(1);\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _annotation_layer = __w_pdfjs_require__(3);\n\nvar _metadata = __w_pdfjs_require__(6);\n\nvar _text_layer = __w_pdfjs_require__(5);\n\nvar _svg = __w_pdfjs_require__(4);\n\nvar isWorker = typeof window === 'undefined';\nif (!_util.globalScope.PDFJS) {\n  _util.globalScope.PDFJS = {};\n}\nvar PDFJS = _util.globalScope.PDFJS;\n{\n  PDFJS.version = '1.9.426';\n  PDFJS.build = '2558a58d';\n}\nPDFJS.pdfBug = false;\nif (PDFJS.verbosity !== undefined) {\n  (0, _util.setVerbosityLevel)(PDFJS.verbosity);\n}\ndelete PDFJS.verbosity;\nObject.defineProperty(PDFJS, 'verbosity', {\n  get: function get() {\n    return (0, _util.getVerbosityLevel)();\n  },\n  set: function set(level) {\n    (0, _util.setVerbosityLevel)(level);\n  },\n\n  enumerable: true,\n  configurable: true\n});\nPDFJS.VERBOSITY_LEVELS = _util.VERBOSITY_LEVELS;\nPDFJS.OPS = _util.OPS;\nPDFJS.UNSUPPORTED_FEATURES = _util.UNSUPPORTED_FEATURES;\nPDFJS.isValidUrl = _dom_utils.isValidUrl;\nPDFJS.shadow = _util.shadow;\nPDFJS.createBlob = _util.createBlob;\nPDFJS.createObjectURL = function PDFJS_createObjectURL(data, contentType) {\n  return (0, _util.createObjectURL)(data, contentType, PDFJS.disableCreateObjectURL);\n};\nObject.defineProperty(PDFJS, 'isLittleEndian', {\n  configurable: true,\n  get: function PDFJS_isLittleEndian() {\n    return (0, _util.shadow)(PDFJS, 'isLittleEndian', (0, _util.isLittleEndian)());\n  }\n});\nPDFJS.removeNullCharacters = _util.removeNullCharacters;\nPDFJS.PasswordResponses = _util.PasswordResponses;\nPDFJS.PasswordException = _util.PasswordException;\nPDFJS.UnknownErrorException = _util.UnknownErrorException;\nPDFJS.InvalidPDFException = _util.InvalidPDFException;\nPDFJS.MissingPDFException = _util.MissingPDFException;\nPDFJS.UnexpectedResponseException = _util.UnexpectedResponseException;\nPDFJS.Util = _util.Util;\nPDFJS.PageViewport = _util.PageViewport;\nPDFJS.createPromiseCapability = _util.createPromiseCapability;\nPDFJS.maxImageSize = PDFJS.maxImageSize === undefined ? -1 : PDFJS.maxImageSize;\nPDFJS.cMapUrl = PDFJS.cMapUrl === undefined ? null : PDFJS.cMapUrl;\nPDFJS.cMapPacked = PDFJS.cMapPacked === undefined ? false : PDFJS.cMapPacked;\nPDFJS.disableFontFace = PDFJS.disableFontFace === undefined ? false : PDFJS.disableFontFace;\nPDFJS.imageResourcesPath = PDFJS.imageResourcesPath === undefined ? '' : PDFJS.imageResourcesPath;\nPDFJS.disableWorker = PDFJS.disableWorker === undefined ? false : PDFJS.disableWorker;\nPDFJS.workerSrc = PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc;\nPDFJS.workerPort = PDFJS.workerPort === undefined ? null : PDFJS.workerPort;\nPDFJS.disableRange = PDFJS.disableRange === undefined ? false : PDFJS.disableRange;\nPDFJS.disableStream = PDFJS.disableStream === undefined ? false : PDFJS.disableStream;\nPDFJS.disableAutoFetch = PDFJS.disableAutoFetch === undefined ? false : PDFJS.disableAutoFetch;\nPDFJS.pdfBug = PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug;\nPDFJS.postMessageTransfers = PDFJS.postMessageTransfers === undefined ? true : PDFJS.postMessageTransfers;\nPDFJS.disableCreateObjectURL = PDFJS.disableCreateObjectURL === undefined ? false : PDFJS.disableCreateObjectURL;\nPDFJS.disableWebGL = PDFJS.disableWebGL === undefined ? true : PDFJS.disableWebGL;\nPDFJS.externalLinkTarget = PDFJS.externalLinkTarget === undefined ? _dom_utils.LinkTarget.NONE : PDFJS.externalLinkTarget;\nPDFJS.externalLinkRel = PDFJS.externalLinkRel === undefined ? _dom_utils.DEFAULT_LINK_REL : PDFJS.externalLinkRel;\nPDFJS.isEvalSupported = PDFJS.isEvalSupported === undefined ? true : PDFJS.isEvalSupported;\nPDFJS.pdfjsNext = PDFJS.pdfjsNext === undefined ? false : PDFJS.pdfjsNext;\n{\n  var savedOpenExternalLinksInNewWindow = PDFJS.openExternalLinksInNewWindow;\n  delete PDFJS.openExternalLinksInNewWindow;\n  Object.defineProperty(PDFJS, 'openExternalLinksInNewWindow', {\n    get: function get() {\n      return PDFJS.externalLinkTarget === _dom_utils.LinkTarget.BLANK;\n    },\n    set: function set(value) {\n      if (value) {\n        (0, _util.deprecated)('PDFJS.openExternalLinksInNewWindow, please use ' + '\"PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK\" instead.');\n      }\n      if (PDFJS.externalLinkTarget !== _dom_utils.LinkTarget.NONE) {\n        (0, _util.warn)('PDFJS.externalLinkTarget is already initialized');\n        return;\n      }\n      PDFJS.externalLinkTarget = value ? _dom_utils.LinkTarget.BLANK : _dom_utils.LinkTarget.NONE;\n    },\n\n    enumerable: true,\n    configurable: true\n  });\n  if (savedOpenExternalLinksInNewWindow) {\n    PDFJS.openExternalLinksInNewWindow = savedOpenExternalLinksInNewWindow;\n  }\n}\nPDFJS.getDocument = _api.getDocument;\nPDFJS.LoopbackPort = _api.LoopbackPort;\nPDFJS.PDFDataRangeTransport = _api.PDFDataRangeTransport;\nPDFJS.PDFWorker = _api.PDFWorker;\nPDFJS.hasCanvasTypedArrays = true;\nPDFJS.CustomStyle = _dom_utils.CustomStyle;\nPDFJS.LinkTarget = _dom_utils.LinkTarget;\nPDFJS.addLinkAttributes = _dom_utils.addLinkAttributes;\nPDFJS.getFilenameFromUrl = _dom_utils.getFilenameFromUrl;\nPDFJS.isExternalLinkTargetSet = _dom_utils.isExternalLinkTargetSet;\nPDFJS.AnnotationLayer = _annotation_layer.AnnotationLayer;\nPDFJS.renderTextLayer = _text_layer.renderTextLayer;\nPDFJS.Metadata = _metadata.Metadata;\nPDFJS.SVGGraphics = _svg.SVGGraphics;\nPDFJS.UnsupportedManager = _api._UnsupportedManager;\nexports.globalScope = _util.globalScope;\nexports.isWorker = isWorker;\nexports.PDFJS = PDFJS;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.NetworkManager = exports.PDFNetworkStream = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _api = __w_pdfjs_require__(2);\n\n;\nvar OK_RESPONSE = 200;\nvar PARTIAL_CONTENT_RESPONSE = 206;\nfunction NetworkManager(url, args) {\n  this.url = url;\n  args = args || {};\n  this.isHttp = /^https?:/i.test(url);\n  this.httpHeaders = this.isHttp && args.httpHeaders || {};\n  this.withCredentials = args.withCredentials || false;\n  this.getXhr = args.getXhr || function NetworkManager_getXhr() {\n    return new XMLHttpRequest();\n  };\n  this.currXhrId = 0;\n  this.pendingRequests = Object.create(null);\n  this.loadedRequests = Object.create(null);\n}\nfunction getArrayBuffer(xhr) {\n  var data = xhr.response;\n  if (typeof data !== 'string') {\n    return data;\n  }\n  var length = data.length;\n  var array = new Uint8Array(length);\n  for (var i = 0; i < length; i++) {\n    array[i] = data.charCodeAt(i) & 0xFF;\n  }\n  return array.buffer;\n}\nvar supportsMozChunked = function supportsMozChunkedClosure() {\n  try {\n    var x = new XMLHttpRequest();\n    x.open('GET', _util.globalScope.location.href);\n    x.responseType = 'moz-chunked-arraybuffer';\n    return x.responseType === 'moz-chunked-arraybuffer';\n  } catch (e) {\n    return false;\n  }\n}();\nNetworkManager.prototype = {\n  requestRange: function NetworkManager_requestRange(begin, end, listeners) {\n    var args = {\n      begin: begin,\n      end: end\n    };\n    for (var prop in listeners) {\n      args[prop] = listeners[prop];\n    }\n    return this.request(args);\n  },\n  requestFull: function NetworkManager_requestFull(listeners) {\n    return this.request(listeners);\n  },\n  request: function NetworkManager_request(args) {\n    var xhr = this.getXhr();\n    var xhrId = this.currXhrId++;\n    var pendingRequest = this.pendingRequests[xhrId] = { xhr: xhr };\n    xhr.open('GET', this.url);\n    xhr.withCredentials = this.withCredentials;\n    for (var property in this.httpHeaders) {\n      var value = this.httpHeaders[property];\n      if (typeof value === 'undefined') {\n        continue;\n      }\n      xhr.setRequestHeader(property, value);\n    }\n    if (this.isHttp && 'begin' in args && 'end' in args) {\n      var rangeStr = args.begin + '-' + (args.end - 1);\n      xhr.setRequestHeader('Range', 'bytes=' + rangeStr);\n      pendingRequest.expectedStatus = 206;\n    } else {\n      pendingRequest.expectedStatus = 200;\n    }\n    var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData;\n    if (useMozChunkedLoading) {\n      xhr.responseType = 'moz-chunked-arraybuffer';\n      pendingRequest.onProgressiveData = args.onProgressiveData;\n      pendingRequest.mozChunked = true;\n    } else {\n      xhr.responseType = 'arraybuffer';\n    }\n    if (args.onError) {\n      xhr.onerror = function (evt) {\n        args.onError(xhr.status);\n      };\n    }\n    xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);\n    xhr.onprogress = this.onProgress.bind(this, xhrId);\n    pendingRequest.onHeadersReceived = args.onHeadersReceived;\n    pendingRequest.onDone = args.onDone;\n    pendingRequest.onError = args.onError;\n    pendingRequest.onProgress = args.onProgress;\n    xhr.send(null);\n    return xhrId;\n  },\n  onProgress: function NetworkManager_onProgress(xhrId, evt) {\n    var pendingRequest = this.pendingRequests[xhrId];\n    if (!pendingRequest) {\n      return;\n    }\n    if (pendingRequest.mozChunked) {\n      var chunk = getArrayBuffer(pendingRequest.xhr);\n      pendingRequest.onProgressiveData(chunk);\n    }\n    var onProgress = pendingRequest.onProgress;\n    if (onProgress) {\n      onProgress(evt);\n    }\n  },\n  onStateChange: function NetworkManager_onStateChange(xhrId, evt) {\n    var pendingRequest = this.pendingRequests[xhrId];\n    if (!pendingRequest) {\n      return;\n    }\n    var xhr = pendingRequest.xhr;\n    if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {\n      pendingRequest.onHeadersReceived();\n      delete pendingRequest.onHeadersReceived;\n    }\n    if (xhr.readyState !== 4) {\n      return;\n    }\n    if (!(xhrId in this.pendingRequests)) {\n      return;\n    }\n    delete this.pendingRequests[xhrId];\n    if (xhr.status === 0 && this.isHttp) {\n      if (pendingRequest.onError) {\n        pendingRequest.onError(xhr.status);\n      }\n      return;\n    }\n    var xhrStatus = xhr.status || OK_RESPONSE;\n    var ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;\n    if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) {\n      if (pendingRequest.onError) {\n        pendingRequest.onError(xhr.status);\n      }\n      return;\n    }\n    this.loadedRequests[xhrId] = true;\n    var chunk = getArrayBuffer(xhr);\n    if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {\n      var rangeHeader = xhr.getResponseHeader('Content-Range');\n      var matches = /bytes (\\d+)-(\\d+)\\/(\\d+)/.exec(rangeHeader);\n      var begin = parseInt(matches[1], 10);\n      pendingRequest.onDone({\n        begin: begin,\n        chunk: chunk\n      });\n    } else if (pendingRequest.onProgressiveData) {\n      pendingRequest.onDone(null);\n    } else if (chunk) {\n      pendingRequest.onDone({\n        begin: 0,\n        chunk: chunk\n      });\n    } else if (pendingRequest.onError) {\n      pendingRequest.onError(xhr.status);\n    }\n  },\n  hasPendingRequests: function NetworkManager_hasPendingRequests() {\n    for (var xhrId in this.pendingRequests) {\n      return true;\n    }\n    return false;\n  },\n  getRequestXhr: function NetworkManager_getXhr(xhrId) {\n    return this.pendingRequests[xhrId].xhr;\n  },\n  isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) {\n    return !!this.pendingRequests[xhrId].onProgressiveData;\n  },\n  isPendingRequest: function NetworkManager_isPendingRequest(xhrId) {\n    return xhrId in this.pendingRequests;\n  },\n  isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) {\n    return xhrId in this.loadedRequests;\n  },\n  abortAllRequests: function NetworkManager_abortAllRequests() {\n    for (var xhrId in this.pendingRequests) {\n      this.abortRequest(xhrId | 0);\n    }\n  },\n  abortRequest: function NetworkManager_abortRequest(xhrId) {\n    var xhr = this.pendingRequests[xhrId].xhr;\n    delete this.pendingRequests[xhrId];\n    xhr.abort();\n  }\n};\nfunction PDFNetworkStream(options) {\n  this._options = options;\n  var source = options.source;\n  this._manager = new NetworkManager(source.url, {\n    httpHeaders: source.httpHeaders,\n    withCredentials: source.withCredentials\n  });\n  this._rangeChunkSize = source.rangeChunkSize;\n  this._fullRequestReader = null;\n  this._rangeRequestReaders = [];\n}\nPDFNetworkStream.prototype = {\n  _onRangeRequestReaderClosed: function PDFNetworkStream_onRangeRequestReaderClosed(reader) {\n    var i = this._rangeRequestReaders.indexOf(reader);\n    if (i >= 0) {\n      this._rangeRequestReaders.splice(i, 1);\n    }\n  },\n  getFullReader: function PDFNetworkStream_getFullReader() {\n    (0, _util.assert)(!this._fullRequestReader);\n    this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._options);\n    return this._fullRequestReader;\n  },\n  getRangeReader: function PDFNetworkStream_getRangeReader(begin, end) {\n    var reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end);\n    reader.onClosed = this._onRangeRequestReaderClosed.bind(this);\n    this._rangeRequestReaders.push(reader);\n    return reader;\n  },\n  cancelAllRequests: function PDFNetworkStream_cancelAllRequests(reason) {\n    if (this._fullRequestReader) {\n      this._fullRequestReader.cancel(reason);\n    }\n    var readers = this._rangeRequestReaders.slice(0);\n    readers.forEach(function (reader) {\n      reader.cancel(reason);\n    });\n  }\n};\nfunction PDFNetworkStreamFullRequestReader(manager, options) {\n  this._manager = manager;\n  var source = options.source;\n  var args = {\n    onHeadersReceived: this._onHeadersReceived.bind(this),\n    onProgressiveData: source.disableStream ? null : this._onProgressiveData.bind(this),\n    onDone: this._onDone.bind(this),\n    onError: this._onError.bind(this),\n    onProgress: this._onProgress.bind(this)\n  };\n  this._url = source.url;\n  this._fullRequestId = manager.requestFull(args);\n  this._headersReceivedCapability = (0, _util.createPromiseCapability)();\n  this._disableRange = options.disableRange || false;\n  this._contentLength = source.length;\n  this._rangeChunkSize = source.rangeChunkSize;\n  if (!this._rangeChunkSize && !this._disableRange) {\n    this._disableRange = true;\n  }\n  this._isStreamingSupported = false;\n  this._isRangeSupported = false;\n  this._cachedChunks = [];\n  this._requests = [];\n  this._done = false;\n  this._storedError = undefined;\n  this.onProgress = null;\n}\nPDFNetworkStreamFullRequestReader.prototype = {\n  _validateRangeRequestCapabilities: function PDFNetworkStreamFullRequestReader_validateRangeRequestCapabilities() {\n    if (this._disableRange) {\n      return false;\n    }\n    var networkManager = this._manager;\n    if (!networkManager.isHttp) {\n      return false;\n    }\n    var fullRequestXhrId = this._fullRequestId;\n    var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId);\n    if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') {\n      return false;\n    }\n    var contentEncoding = fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity';\n    if (contentEncoding !== 'identity') {\n      return false;\n    }\n    var length = fullRequestXhr.getResponseHeader('Content-Length');\n    length = parseInt(length, 10);\n    if (!(0, _util.isInt)(length)) {\n      return false;\n    }\n    this._contentLength = length;\n    if (length <= 2 * this._rangeChunkSize) {\n      return false;\n    }\n    return true;\n  },\n  _onHeadersReceived: function PDFNetworkStreamFullRequestReader_onHeadersReceived() {\n    if (this._validateRangeRequestCapabilities()) {\n      this._isRangeSupported = true;\n    }\n    var networkManager = this._manager;\n    var fullRequestXhrId = this._fullRequestId;\n    if (networkManager.isStreamingRequest(fullRequestXhrId)) {\n      this._isStreamingSupported = true;\n    } else if (this._isRangeSupported) {\n      networkManager.abortRequest(fullRequestXhrId);\n    }\n    this._headersReceivedCapability.resolve();\n  },\n  _onProgressiveData: function PDFNetworkStreamFullRequestReader_onProgressiveData(chunk) {\n    if (this._requests.length > 0) {\n      var requestCapability = this._requests.shift();\n      requestCapability.resolve({\n        value: chunk,\n        done: false\n      });\n    } else {\n      this._cachedChunks.push(chunk);\n    }\n  },\n  _onDone: function PDFNetworkStreamFullRequestReader_onDone(args) {\n    if (args) {\n      this._onProgressiveData(args.chunk);\n    }\n    this._done = true;\n    if (this._cachedChunks.length > 0) {\n      return;\n    }\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({\n        value: undefined,\n        done: true\n      });\n    });\n    this._requests = [];\n  },\n  _onError: function PDFNetworkStreamFullRequestReader_onError(status) {\n    var url = this._url;\n    var exception;\n    if (status === 404 || status === 0 && /^file:/.test(url)) {\n      exception = new _util.MissingPDFException('Missing PDF \"' + url + '\".');\n    } else {\n      exception = new _util.UnexpectedResponseException('Unexpected server response (' + status + ') while retrieving PDF \"' + url + '\".', status);\n    }\n    this._storedError = exception;\n    this._headersReceivedCapability.reject(exception);\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.reject(exception);\n    });\n    this._requests = [];\n    this._cachedChunks = [];\n  },\n  _onProgress: function PDFNetworkStreamFullRequestReader_onProgress(data) {\n    if (this.onProgress) {\n      this.onProgress({\n        loaded: data.loaded,\n        total: data.lengthComputable ? data.total : this._contentLength\n      });\n    }\n  },\n  get isRangeSupported() {\n    return this._isRangeSupported;\n  },\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  },\n  get contentLength() {\n    return this._contentLength;\n  },\n  get headersReady() {\n    return this._headersReceivedCapability.promise;\n  },\n  read: function PDFNetworkStreamFullRequestReader_read() {\n    if (this._storedError) {\n      return Promise.reject(this._storedError);\n    }\n    if (this._cachedChunks.length > 0) {\n      var chunk = this._cachedChunks.shift();\n      return Promise.resolve({\n        value: chunk,\n        done: false\n      });\n    }\n    if (this._done) {\n      return Promise.resolve({\n        value: undefined,\n        done: true\n      });\n    }\n    var requestCapability = (0, _util.createPromiseCapability)();\n    this._requests.push(requestCapability);\n    return requestCapability.promise;\n  },\n  cancel: function PDFNetworkStreamFullRequestReader_cancel(reason) {\n    this._done = true;\n    this._headersReceivedCapability.reject(reason);\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({\n        value: undefined,\n        done: true\n      });\n    });\n    this._requests = [];\n    if (this._manager.isPendingRequest(this._fullRequestId)) {\n      this._manager.abortRequest(this._fullRequestId);\n    }\n    this._fullRequestReader = null;\n  }\n};\nfunction PDFNetworkStreamRangeRequestReader(manager, begin, end) {\n  this._manager = manager;\n  var args = {\n    onDone: this._onDone.bind(this),\n    onProgress: this._onProgress.bind(this)\n  };\n  this._requestId = manager.requestRange(begin, end, args);\n  this._requests = [];\n  this._queuedChunk = null;\n  this._done = false;\n  this.onProgress = null;\n  this.onClosed = null;\n}\nPDFNetworkStreamRangeRequestReader.prototype = {\n  _close: function PDFNetworkStreamRangeRequestReader_close() {\n    if (this.onClosed) {\n      this.onClosed(this);\n    }\n  },\n  _onDone: function PDFNetworkStreamRangeRequestReader_onDone(data) {\n    var chunk = data.chunk;\n    if (this._requests.length > 0) {\n      var requestCapability = this._requests.shift();\n      requestCapability.resolve({\n        value: chunk,\n        done: false\n      });\n    } else {\n      this._queuedChunk = chunk;\n    }\n    this._done = true;\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({\n        value: undefined,\n        done: true\n      });\n    });\n    this._requests = [];\n    this._close();\n  },\n  _onProgress: function PDFNetworkStreamRangeRequestReader_onProgress(evt) {\n    if (!this.isStreamingSupported && this.onProgress) {\n      this.onProgress({ loaded: evt.loaded });\n    }\n  },\n  get isStreamingSupported() {\n    return false;\n  },\n  read: function PDFNetworkStreamRangeRequestReader_read() {\n    if (this._queuedChunk !== null) {\n      var chunk = this._queuedChunk;\n      this._queuedChunk = null;\n      return Promise.resolve({\n        value: chunk,\n        done: false\n      });\n    }\n    if (this._done) {\n      return Promise.resolve({\n        value: undefined,\n        done: true\n      });\n    }\n    var requestCapability = (0, _util.createPromiseCapability)();\n    this._requests.push(requestCapability);\n    return requestCapability.promise;\n  },\n  cancel: function PDFNetworkStreamRangeRequestReader_cancel(reason) {\n    this._done = true;\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({\n        value: undefined,\n        done: true\n      });\n    });\n    this._requests = [];\n    if (this._manager.isPendingRequest(this._requestId)) {\n      this._manager.abortRequest(this._requestId);\n    }\n    this._close();\n  }\n};\n(0, _api.setPDFNetworkStreamClass)(PDFNetworkStream);\nexports.PDFNetworkStream = PDFNetworkStream;\nexports.NetworkManager = NetworkManager;\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _typeof2 = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n(function (e, a) {\n  for (var i in a) {\n    e[i] = a[i];\n  }\n})(exports, function (modules) {\n  var installedModules = {};\n  function __w_pdfjs_require__(moduleId) {\n    if (installedModules[moduleId]) return installedModules[moduleId].exports;\n    var module = installedModules[moduleId] = {\n      i: moduleId,\n      l: false,\n      exports: {}\n    };\n    modules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);\n    module.l = true;\n    return module.exports;\n  }\n  __w_pdfjs_require__.m = modules;\n  __w_pdfjs_require__.c = installedModules;\n  __w_pdfjs_require__.i = function (value) {\n    return value;\n  };\n  __w_pdfjs_require__.d = function (exports, name, getter) {\n    if (!__w_pdfjs_require__.o(exports, name)) {\n      Object.defineProperty(exports, name, {\n        configurable: false,\n        enumerable: true,\n        get: getter\n      });\n    }\n  };\n  __w_pdfjs_require__.n = function (module) {\n    var getter = module && module.__esModule ? function getDefault() {\n      return module['default'];\n    } : function getModuleExports() {\n      return module;\n    };\n    __w_pdfjs_require__.d(getter, 'a', getter);\n    return getter;\n  };\n  __w_pdfjs_require__.o = function (object, property) {\n    return Object.prototype.hasOwnProperty.call(object, property);\n  };\n  __w_pdfjs_require__.p = \"\";\n  return __w_pdfjs_require__(__w_pdfjs_require__.s = 7);\n}([function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _typeof = typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\" ? function (obj) {\n    return typeof obj === 'undefined' ? 'undefined' : _typeof2(obj);\n  } : function (obj) {\n    return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj === 'undefined' ? 'undefined' : _typeof2(obj);\n  };\n  var _require = __w_pdfjs_require__(1),\n      assert = _require.assert;\n  function IsPropertyKey(argument) {\n    return typeof argument === 'string' || (typeof argument === 'undefined' ? 'undefined' : _typeof(argument)) === 'symbol';\n  }\n  exports.typeIsObject = function (x) {\n    return (typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'object' && x !== null || typeof x === 'function';\n  };\n  exports.createDataProperty = function (o, p, v) {\n    assert(exports.typeIsObject(o));\n    Object.defineProperty(o, p, {\n      value: v,\n      writable: true,\n      enumerable: true,\n      configurable: true\n    });\n  };\n  exports.createArrayFromList = function (elements) {\n    return elements.slice();\n  };\n  exports.ArrayBufferCopy = function (dest, destOffset, src, srcOffset, n) {\n    new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset);\n  };\n  exports.CreateIterResultObject = function (value, done) {\n    assert(typeof done === 'boolean');\n    var obj = {};\n    Object.defineProperty(obj, 'value', {\n      value: value,\n      enumerable: true,\n      writable: true,\n      configurable: true\n    });\n    Object.defineProperty(obj, 'done', {\n      value: done,\n      enumerable: true,\n      writable: true,\n      configurable: true\n    });\n    return obj;\n  };\n  exports.IsFiniteNonNegativeNumber = function (v) {\n    if (Number.isNaN(v)) {\n      return false;\n    }\n    if (v === Infinity) {\n      return false;\n    }\n    if (v < 0) {\n      return false;\n    }\n    return true;\n  };\n  function Call(F, V, args) {\n    if (typeof F !== 'function') {\n      throw new TypeError('Argument is not a function');\n    }\n    return Function.prototype.apply.call(F, V, args);\n  }\n  exports.InvokeOrNoop = function (O, P, args) {\n    assert(O !== undefined);\n    assert(IsPropertyKey(P));\n    assert(Array.isArray(args));\n    var method = O[P];\n    if (method === undefined) {\n      return undefined;\n    }\n    return Call(method, O, args);\n  };\n  exports.PromiseInvokeOrNoop = function (O, P, args) {\n    assert(O !== undefined);\n    assert(IsPropertyKey(P));\n    assert(Array.isArray(args));\n    try {\n      return Promise.resolve(exports.InvokeOrNoop(O, P, args));\n    } catch (returnValueE) {\n      return Promise.reject(returnValueE);\n    }\n  };\n  exports.PromiseInvokeOrPerformFallback = function (O, P, args, F, argsF) {\n    assert(O !== undefined);\n    assert(IsPropertyKey(P));\n    assert(Array.isArray(args));\n    assert(Array.isArray(argsF));\n    var method = void 0;\n    try {\n      method = O[P];\n    } catch (methodE) {\n      return Promise.reject(methodE);\n    }\n    if (method === undefined) {\n      return F.apply(null, argsF);\n    }\n    try {\n      return Promise.resolve(Call(method, O, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n  exports.TransferArrayBuffer = function (O) {\n    return O.slice();\n  };\n  exports.ValidateAndNormalizeHighWaterMark = function (highWaterMark) {\n    highWaterMark = Number(highWaterMark);\n    if (Number.isNaN(highWaterMark) || highWaterMark < 0) {\n      throw new RangeError('highWaterMark property of a queuing strategy must be non-negative and non-NaN');\n    }\n    return highWaterMark;\n  };\n  exports.ValidateAndNormalizeQueuingStrategy = function (size, highWaterMark) {\n    if (size !== undefined && typeof size !== 'function') {\n      throw new TypeError('size property of a queuing strategy must be a function');\n    }\n    highWaterMark = exports.ValidateAndNormalizeHighWaterMark(highWaterMark);\n    return {\n      size: size,\n      highWaterMark: highWaterMark\n    };\n  };\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  function rethrowAssertionErrorRejection(e) {\n    if (e && e.constructor === AssertionError) {\n      setTimeout(function () {\n        throw e;\n      }, 0);\n    }\n  }\n  function AssertionError(message) {\n    this.name = 'AssertionError';\n    this.message = message || '';\n    this.stack = new Error().stack;\n  }\n  AssertionError.prototype = Object.create(Error.prototype);\n  AssertionError.prototype.constructor = AssertionError;\n  function assert(value, message) {\n    if (!value) {\n      throw new AssertionError(message);\n    }\n  }\n  module.exports = {\n    rethrowAssertionErrorRejection: rethrowAssertionErrorRejection,\n    AssertionError: AssertionError,\n    assert: assert\n  };\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n  var _require = __w_pdfjs_require__(0),\n      InvokeOrNoop = _require.InvokeOrNoop,\n      PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,\n      ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,\n      typeIsObject = _require.typeIsObject;\n  var _require2 = __w_pdfjs_require__(1),\n      assert = _require2.assert,\n      rethrowAssertionErrorRejection = _require2.rethrowAssertionErrorRejection;\n  var _require3 = __w_pdfjs_require__(3),\n      DequeueValue = _require3.DequeueValue,\n      EnqueueValueWithSize = _require3.EnqueueValueWithSize,\n      PeekQueueValue = _require3.PeekQueueValue,\n      ResetQueue = _require3.ResetQueue;\n  var WritableStream = function () {\n    function WritableStream() {\n      var underlyingSink = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          size = _ref.size,\n          _ref$highWaterMark = _ref.highWaterMark,\n          highWaterMark = _ref$highWaterMark === undefined ? 1 : _ref$highWaterMark;\n      _classCallCheck(this, WritableStream);\n      this._state = 'writable';\n      this._storedError = undefined;\n      this._writer = undefined;\n      this._writableStreamController = undefined;\n      this._writeRequests = [];\n      this._inFlightWriteRequest = undefined;\n      this._closeRequest = undefined;\n      this._inFlightCloseRequest = undefined;\n      this._pendingAbortRequest = undefined;\n      this._backpressure = false;\n      var type = underlyingSink.type;\n      if (type !== undefined) {\n        throw new RangeError('Invalid type is specified');\n      }\n      this._writableStreamController = new WritableStreamDefaultController(this, underlyingSink, size, highWaterMark);\n      this._writableStreamController.__startSteps();\n    }\n    _createClass(WritableStream, [{\n      key: 'abort',\n      value: function abort(reason) {\n        if (IsWritableStream(this) === false) {\n          return Promise.reject(streamBrandCheckException('abort'));\n        }\n        if (IsWritableStreamLocked(this) === true) {\n          return Promise.reject(new TypeError('Cannot abort a stream that already has a writer'));\n        }\n        return WritableStreamAbort(this, reason);\n      }\n    }, {\n      key: 'getWriter',\n      value: function getWriter() {\n        if (IsWritableStream(this) === false) {\n          throw streamBrandCheckException('getWriter');\n        }\n        return AcquireWritableStreamDefaultWriter(this);\n      }\n    }, {\n      key: 'locked',\n      get: function get() {\n        if (IsWritableStream(this) === false) {\n          throw streamBrandCheckException('locked');\n        }\n        return IsWritableStreamLocked(this);\n      }\n    }]);\n    return WritableStream;\n  }();\n  module.exports = {\n    AcquireWritableStreamDefaultWriter: AcquireWritableStreamDefaultWriter,\n    IsWritableStream: IsWritableStream,\n    IsWritableStreamLocked: IsWritableStreamLocked,\n    WritableStream: WritableStream,\n    WritableStreamAbort: WritableStreamAbort,\n    WritableStreamDefaultControllerError: WritableStreamDefaultControllerError,\n    WritableStreamDefaultWriterCloseWithErrorPropagation: WritableStreamDefaultWriterCloseWithErrorPropagation,\n    WritableStreamDefaultWriterRelease: WritableStreamDefaultWriterRelease,\n    WritableStreamDefaultWriterWrite: WritableStreamDefaultWriterWrite,\n    WritableStreamCloseQueuedOrInFlight: WritableStreamCloseQueuedOrInFlight\n  };\n  function AcquireWritableStreamDefaultWriter(stream) {\n    return new WritableStreamDefaultWriter(stream);\n  }\n  function IsWritableStream(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) {\n      return false;\n    }\n    return true;\n  }\n  function IsWritableStreamLocked(stream) {\n    assert(IsWritableStream(stream) === true, 'IsWritableStreamLocked should only be used on known writable streams');\n    if (stream._writer === undefined) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamAbort(stream, reason) {\n    var state = stream._state;\n    if (state === 'closed') {\n      return Promise.resolve(undefined);\n    }\n    if (state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    var error = new TypeError('Requested to abort');\n    if (stream._pendingAbortRequest !== undefined) {\n      return Promise.reject(error);\n    }\n    assert(state === 'writable' || state === 'erroring', 'state must be writable or erroring');\n    var wasAlreadyErroring = false;\n    if (state === 'erroring') {\n      wasAlreadyErroring = true;\n      reason = undefined;\n    }\n    var promise = new Promise(function (resolve, reject) {\n      stream._pendingAbortRequest = {\n        _resolve: resolve,\n        _reject: reject,\n        _reason: reason,\n        _wasAlreadyErroring: wasAlreadyErroring\n      };\n    });\n    if (wasAlreadyErroring === false) {\n      WritableStreamStartErroring(stream, error);\n    }\n    return promise;\n  }\n  function WritableStreamAddWriteRequest(stream) {\n    assert(IsWritableStreamLocked(stream) === true);\n    assert(stream._state === 'writable');\n    var promise = new Promise(function (resolve, reject) {\n      var writeRequest = {\n        _resolve: resolve,\n        _reject: reject\n      };\n      stream._writeRequests.push(writeRequest);\n    });\n    return promise;\n  }\n  function WritableStreamDealWithRejection(stream, error) {\n    var state = stream._state;\n    if (state === 'writable') {\n      WritableStreamStartErroring(stream, error);\n      return;\n    }\n    assert(state === 'erroring');\n    WritableStreamFinishErroring(stream);\n  }\n  function WritableStreamStartErroring(stream, reason) {\n    assert(stream._storedError === undefined, 'stream._storedError === undefined');\n    assert(stream._state === 'writable', 'state must be writable');\n    var controller = stream._writableStreamController;\n    assert(controller !== undefined, 'controller must not be undefined');\n    stream._state = 'erroring';\n    stream._storedError = reason;\n    var writer = stream._writer;\n    if (writer !== undefined) {\n      WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason);\n    }\n    if (WritableStreamHasOperationMarkedInFlight(stream) === false && controller._started === true) {\n      WritableStreamFinishErroring(stream);\n    }\n  }\n  function WritableStreamFinishErroring(stream) {\n    assert(stream._state === 'erroring', 'stream._state === erroring');\n    assert(WritableStreamHasOperationMarkedInFlight(stream) === false, 'WritableStreamHasOperationMarkedInFlight(stream) === false');\n    stream._state = 'errored';\n    stream._writableStreamController.__errorSteps();\n    var storedError = stream._storedError;\n    for (var i = 0; i < stream._writeRequests.length; i++) {\n      var writeRequest = stream._writeRequests[i];\n      writeRequest._reject(storedError);\n    }\n    stream._writeRequests = [];\n    if (stream._pendingAbortRequest === undefined) {\n      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n      return;\n    }\n    var abortRequest = stream._pendingAbortRequest;\n    stream._pendingAbortRequest = undefined;\n    if (abortRequest._wasAlreadyErroring === true) {\n      abortRequest._reject(storedError);\n      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n      return;\n    }\n    var promise = stream._writableStreamController.__abortSteps(abortRequest._reason);\n    promise.then(function () {\n      abortRequest._resolve();\n      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n    }, function (reason) {\n      abortRequest._reject(reason);\n      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n    });\n  }\n  function WritableStreamFinishInFlightWrite(stream) {\n    assert(stream._inFlightWriteRequest !== undefined);\n    stream._inFlightWriteRequest._resolve(undefined);\n    stream._inFlightWriteRequest = undefined;\n  }\n  function WritableStreamFinishInFlightWriteWithError(stream, error) {\n    assert(stream._inFlightWriteRequest !== undefined);\n    stream._inFlightWriteRequest._reject(error);\n    stream._inFlightWriteRequest = undefined;\n    assert(stream._state === 'writable' || stream._state === 'erroring');\n    WritableStreamDealWithRejection(stream, error);\n  }\n  function WritableStreamFinishInFlightClose(stream) {\n    assert(stream._inFlightCloseRequest !== undefined);\n    stream._inFlightCloseRequest._resolve(undefined);\n    stream._inFlightCloseRequest = undefined;\n    var state = stream._state;\n    assert(state === 'writable' || state === 'erroring');\n    if (state === 'erroring') {\n      stream._storedError = undefined;\n      if (stream._pendingAbortRequest !== undefined) {\n        stream._pendingAbortRequest._resolve();\n        stream._pendingAbortRequest = undefined;\n      }\n    }\n    stream._state = 'closed';\n    var writer = stream._writer;\n    if (writer !== undefined) {\n      defaultWriterClosedPromiseResolve(writer);\n    }\n    assert(stream._pendingAbortRequest === undefined, 'stream._pendingAbortRequest === undefined');\n    assert(stream._storedError === undefined, 'stream._storedError === undefined');\n  }\n  function WritableStreamFinishInFlightCloseWithError(stream, error) {\n    assert(stream._inFlightCloseRequest !== undefined);\n    stream._inFlightCloseRequest._reject(error);\n    stream._inFlightCloseRequest = undefined;\n    assert(stream._state === 'writable' || stream._state === 'erroring');\n    if (stream._pendingAbortRequest !== undefined) {\n      stream._pendingAbortRequest._reject(error);\n      stream._pendingAbortRequest = undefined;\n    }\n    WritableStreamDealWithRejection(stream, error);\n  }\n  function WritableStreamCloseQueuedOrInFlight(stream) {\n    if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamHasOperationMarkedInFlight(stream) {\n    if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamMarkCloseRequestInFlight(stream) {\n    assert(stream._inFlightCloseRequest === undefined);\n    assert(stream._closeRequest !== undefined);\n    stream._inFlightCloseRequest = stream._closeRequest;\n    stream._closeRequest = undefined;\n  }\n  function WritableStreamMarkFirstWriteRequestInFlight(stream) {\n    assert(stream._inFlightWriteRequest === undefined, 'there must be no pending write request');\n    assert(stream._writeRequests.length !== 0, 'writeRequests must not be empty');\n    stream._inFlightWriteRequest = stream._writeRequests.shift();\n  }\n  function WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) {\n    assert(stream._state === 'errored', '_stream_.[[state]] is `\"errored\"`');\n    if (stream._closeRequest !== undefined) {\n      assert(stream._inFlightCloseRequest === undefined);\n      stream._closeRequest._reject(stream._storedError);\n      stream._closeRequest = undefined;\n    }\n    var writer = stream._writer;\n    if (writer !== undefined) {\n      defaultWriterClosedPromiseReject(writer, stream._storedError);\n      writer._closedPromise.catch(function () {});\n    }\n  }\n  function WritableStreamUpdateBackpressure(stream, backpressure) {\n    assert(stream._state === 'writable');\n    assert(WritableStreamCloseQueuedOrInFlight(stream) === false);\n    var writer = stream._writer;\n    if (writer !== undefined && backpressure !== stream._backpressure) {\n      if (backpressure === true) {\n        defaultWriterReadyPromiseReset(writer);\n      } else {\n        assert(backpressure === false);\n        defaultWriterReadyPromiseResolve(writer);\n      }\n    }\n    stream._backpressure = backpressure;\n  }\n  var WritableStreamDefaultWriter = function () {\n    function WritableStreamDefaultWriter(stream) {\n      _classCallCheck(this, WritableStreamDefaultWriter);\n      if (IsWritableStream(stream) === false) {\n        throw new TypeError('WritableStreamDefaultWriter can only be constructed with a WritableStream instance');\n      }\n      if (IsWritableStreamLocked(stream) === true) {\n        throw new TypeError('This stream has already been locked for exclusive writing by another writer');\n      }\n      this._ownerWritableStream = stream;\n      stream._writer = this;\n      var state = stream._state;\n      if (state === 'writable') {\n        if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._backpressure === true) {\n          defaultWriterReadyPromiseInitialize(this);\n        } else {\n          defaultWriterReadyPromiseInitializeAsResolved(this);\n        }\n        defaultWriterClosedPromiseInitialize(this);\n      } else if (state === 'erroring') {\n        defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError);\n        this._readyPromise.catch(function () {});\n        defaultWriterClosedPromiseInitialize(this);\n      } else if (state === 'closed') {\n        defaultWriterReadyPromiseInitializeAsResolved(this);\n        defaultWriterClosedPromiseInitializeAsResolved(this);\n      } else {\n        assert(state === 'errored', 'state must be errored');\n        var storedError = stream._storedError;\n        defaultWriterReadyPromiseInitializeAsRejected(this, storedError);\n        this._readyPromise.catch(function () {});\n        defaultWriterClosedPromiseInitializeAsRejected(this, storedError);\n        this._closedPromise.catch(function () {});\n      }\n    }\n    _createClass(WritableStreamDefaultWriter, [{\n      key: 'abort',\n      value: function abort(reason) {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('abort'));\n        }\n        if (this._ownerWritableStream === undefined) {\n          return Promise.reject(defaultWriterLockException('abort'));\n        }\n        return WritableStreamDefaultWriterAbort(this, reason);\n      }\n    }, {\n      key: 'close',\n      value: function close() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('close'));\n        }\n        var stream = this._ownerWritableStream;\n        if (stream === undefined) {\n          return Promise.reject(defaultWriterLockException('close'));\n        }\n        if (WritableStreamCloseQueuedOrInFlight(stream) === true) {\n          return Promise.reject(new TypeError('cannot close an already-closing stream'));\n        }\n        return WritableStreamDefaultWriterClose(this);\n      }\n    }, {\n      key: 'releaseLock',\n      value: function releaseLock() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          throw defaultWriterBrandCheckException('releaseLock');\n        }\n        var stream = this._ownerWritableStream;\n        if (stream === undefined) {\n          return;\n        }\n        assert(stream._writer !== undefined);\n        WritableStreamDefaultWriterRelease(this);\n      }\n    }, {\n      key: 'write',\n      value: function write(chunk) {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('write'));\n        }\n        if (this._ownerWritableStream === undefined) {\n          return Promise.reject(defaultWriterLockException('write to'));\n        }\n        return WritableStreamDefaultWriterWrite(this, chunk);\n      }\n    }, {\n      key: 'closed',\n      get: function get() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('closed'));\n        }\n        return this._closedPromise;\n      }\n    }, {\n      key: 'desiredSize',\n      get: function get() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          throw defaultWriterBrandCheckException('desiredSize');\n        }\n        if (this._ownerWritableStream === undefined) {\n          throw defaultWriterLockException('desiredSize');\n        }\n        return WritableStreamDefaultWriterGetDesiredSize(this);\n      }\n    }, {\n      key: 'ready',\n      get: function get() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('ready'));\n        }\n        return this._readyPromise;\n      }\n    }]);\n    return WritableStreamDefaultWriter;\n  }();\n  function IsWritableStreamDefaultWriter(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamDefaultWriterAbort(writer, reason) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    return WritableStreamAbort(stream, reason);\n  }\n  function WritableStreamDefaultWriterClose(writer) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    var state = stream._state;\n    if (state === 'closed' || state === 'errored') {\n      return Promise.reject(new TypeError('The stream (in ' + state + ' state) is not in the writable state and cannot be closed'));\n    }\n    assert(state === 'writable' || state === 'erroring');\n    assert(WritableStreamCloseQueuedOrInFlight(stream) === false);\n    var promise = new Promise(function (resolve, reject) {\n      var closeRequest = {\n        _resolve: resolve,\n        _reject: reject\n      };\n      stream._closeRequest = closeRequest;\n    });\n    if (stream._backpressure === true && state === 'writable') {\n      defaultWriterReadyPromiseResolve(writer);\n    }\n    WritableStreamDefaultControllerClose(stream._writableStreamController);\n    return promise;\n  }\n  function WritableStreamDefaultWriterCloseWithErrorPropagation(writer) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    var state = stream._state;\n    if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {\n      return Promise.resolve();\n    }\n    if (state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    assert(state === 'writable' || state === 'erroring');\n    return WritableStreamDefaultWriterClose(writer);\n  }\n  function WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) {\n    if (writer._closedPromiseState === 'pending') {\n      defaultWriterClosedPromiseReject(writer, error);\n    } else {\n      defaultWriterClosedPromiseResetToRejected(writer, error);\n    }\n    writer._closedPromise.catch(function () {});\n  }\n  function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) {\n    if (writer._readyPromiseState === 'pending') {\n      defaultWriterReadyPromiseReject(writer, error);\n    } else {\n      defaultWriterReadyPromiseResetToRejected(writer, error);\n    }\n    writer._readyPromise.catch(function () {});\n  }\n  function WritableStreamDefaultWriterGetDesiredSize(writer) {\n    var stream = writer._ownerWritableStream;\n    var state = stream._state;\n    if (state === 'errored' || state === 'erroring') {\n      return null;\n    }\n    if (state === 'closed') {\n      return 0;\n    }\n    return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController);\n  }\n  function WritableStreamDefaultWriterRelease(writer) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    assert(stream._writer === writer);\n    var releasedError = new TypeError('Writer was released and can no longer be used to monitor the stream\\'s closedness');\n    WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError);\n    WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError);\n    stream._writer = undefined;\n    writer._ownerWritableStream = undefined;\n  }\n  function WritableStreamDefaultWriterWrite(writer, chunk) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    var controller = stream._writableStreamController;\n    var chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk);\n    if (stream !== writer._ownerWritableStream) {\n      return Promise.reject(defaultWriterLockException('write to'));\n    }\n    var state = stream._state;\n    if (state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {\n      return Promise.reject(new TypeError('The stream is closing or closed and cannot be written to'));\n    }\n    if (state === 'erroring') {\n      return Promise.reject(stream._storedError);\n    }\n    assert(state === 'writable');\n    var promise = WritableStreamAddWriteRequest(stream);\n    WritableStreamDefaultControllerWrite(controller, chunk, chunkSize);\n    return promise;\n  }\n  var WritableStreamDefaultController = function () {\n    function WritableStreamDefaultController(stream, underlyingSink, size, highWaterMark) {\n      _classCallCheck(this, WritableStreamDefaultController);\n      if (IsWritableStream(stream) === false) {\n        throw new TypeError('WritableStreamDefaultController can only be constructed with a WritableStream instance');\n      }\n      if (stream._writableStreamController !== undefined) {\n        throw new TypeError('WritableStreamDefaultController instances can only be created by the WritableStream constructor');\n      }\n      this._controlledWritableStream = stream;\n      this._underlyingSink = underlyingSink;\n      this._queue = undefined;\n      this._queueTotalSize = undefined;\n      ResetQueue(this);\n      this._started = false;\n      var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);\n      this._strategySize = normalizedStrategy.size;\n      this._strategyHWM = normalizedStrategy.highWaterMark;\n      var backpressure = WritableStreamDefaultControllerGetBackpressure(this);\n      WritableStreamUpdateBackpressure(stream, backpressure);\n    }\n    _createClass(WritableStreamDefaultController, [{\n      key: 'error',\n      value: function error(e) {\n        if (IsWritableStreamDefaultController(this) === false) {\n          throw new TypeError('WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController');\n        }\n        var state = this._controlledWritableStream._state;\n        if (state !== 'writable') {\n          return;\n        }\n        WritableStreamDefaultControllerError(this, e);\n      }\n    }, {\n      key: '__abortSteps',\n      value: function __abortSteps(reason) {\n        return PromiseInvokeOrNoop(this._underlyingSink, 'abort', [reason]);\n      }\n    }, {\n      key: '__errorSteps',\n      value: function __errorSteps() {\n        ResetQueue(this);\n      }\n    }, {\n      key: '__startSteps',\n      value: function __startSteps() {\n        var _this = this;\n        var startResult = InvokeOrNoop(this._underlyingSink, 'start', [this]);\n        var stream = this._controlledWritableStream;\n        Promise.resolve(startResult).then(function () {\n          assert(stream._state === 'writable' || stream._state === 'erroring');\n          _this._started = true;\n          WritableStreamDefaultControllerAdvanceQueueIfNeeded(_this);\n        }, function (r) {\n          assert(stream._state === 'writable' || stream._state === 'erroring');\n          _this._started = true;\n          WritableStreamDealWithRejection(stream, r);\n        }).catch(rethrowAssertionErrorRejection);\n      }\n    }]);\n    return WritableStreamDefaultController;\n  }();\n  function WritableStreamDefaultControllerClose(controller) {\n    EnqueueValueWithSize(controller, 'close', 0);\n    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n  }\n  function WritableStreamDefaultControllerGetChunkSize(controller, chunk) {\n    var strategySize = controller._strategySize;\n    if (strategySize === undefined) {\n      return 1;\n    }\n    try {\n      return strategySize(chunk);\n    } catch (chunkSizeE) {\n      WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);\n      return 1;\n    }\n  }\n  function WritableStreamDefaultControllerGetDesiredSize(controller) {\n    return controller._strategyHWM - controller._queueTotalSize;\n  }\n  function WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) {\n    var writeRecord = { chunk: chunk };\n    try {\n      EnqueueValueWithSize(controller, writeRecord, chunkSize);\n    } catch (enqueueE) {\n      WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);\n      return;\n    }\n    var stream = controller._controlledWritableStream;\n    if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._state === 'writable') {\n      var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);\n      WritableStreamUpdateBackpressure(stream, backpressure);\n    }\n    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n  }\n  function IsWritableStreamDefaultController(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSink')) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) {\n    var stream = controller._controlledWritableStream;\n    if (controller._started === false) {\n      return;\n    }\n    if (stream._inFlightWriteRequest !== undefined) {\n      return;\n    }\n    var state = stream._state;\n    if (state === 'closed' || state === 'errored') {\n      return;\n    }\n    if (state === 'erroring') {\n      WritableStreamFinishErroring(stream);\n      return;\n    }\n    if (controller._queue.length === 0) {\n      return;\n    }\n    var writeRecord = PeekQueueValue(controller);\n    if (writeRecord === 'close') {\n      WritableStreamDefaultControllerProcessClose(controller);\n    } else {\n      WritableStreamDefaultControllerProcessWrite(controller, writeRecord.chunk);\n    }\n  }\n  function WritableStreamDefaultControllerErrorIfNeeded(controller, error) {\n    if (controller._controlledWritableStream._state === 'writable') {\n      WritableStreamDefaultControllerError(controller, error);\n    }\n  }\n  function WritableStreamDefaultControllerProcessClose(controller) {\n    var stream = controller._controlledWritableStream;\n    WritableStreamMarkCloseRequestInFlight(stream);\n    DequeueValue(controller);\n    assert(controller._queue.length === 0, 'queue must be empty once the final write record is dequeued');\n    var sinkClosePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'close', []);\n    sinkClosePromise.then(function () {\n      WritableStreamFinishInFlightClose(stream);\n    }, function (reason) {\n      WritableStreamFinishInFlightCloseWithError(stream, reason);\n    }).catch(rethrowAssertionErrorRejection);\n  }\n  function WritableStreamDefaultControllerProcessWrite(controller, chunk) {\n    var stream = controller._controlledWritableStream;\n    WritableStreamMarkFirstWriteRequestInFlight(stream);\n    var sinkWritePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'write', [chunk, controller]);\n    sinkWritePromise.then(function () {\n      WritableStreamFinishInFlightWrite(stream);\n      var state = stream._state;\n      assert(state === 'writable' || state === 'erroring');\n      DequeueValue(controller);\n      if (WritableStreamCloseQueuedOrInFlight(stream) === false && state === 'writable') {\n        var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);\n        WritableStreamUpdateBackpressure(stream, backpressure);\n      }\n      WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n    }, function (reason) {\n      WritableStreamFinishInFlightWriteWithError(stream, reason);\n    }).catch(rethrowAssertionErrorRejection);\n  }\n  function WritableStreamDefaultControllerGetBackpressure(controller) {\n    var desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller);\n    return desiredSize <= 0;\n  }\n  function WritableStreamDefaultControllerError(controller, error) {\n    var stream = controller._controlledWritableStream;\n    assert(stream._state === 'writable');\n    WritableStreamStartErroring(stream, error);\n  }\n  function streamBrandCheckException(name) {\n    return new TypeError('WritableStream.prototype.' + name + ' can only be used on a WritableStream');\n  }\n  function defaultWriterBrandCheckException(name) {\n    return new TypeError('WritableStreamDefaultWriter.prototype.' + name + ' can only be used on a WritableStreamDefaultWriter');\n  }\n  function defaultWriterLockException(name) {\n    return new TypeError('Cannot ' + name + ' a stream using a released writer');\n  }\n  function defaultWriterClosedPromiseInitialize(writer) {\n    writer._closedPromise = new Promise(function (resolve, reject) {\n      writer._closedPromise_resolve = resolve;\n      writer._closedPromise_reject = reject;\n      writer._closedPromiseState = 'pending';\n    });\n  }\n  function defaultWriterClosedPromiseInitializeAsRejected(writer, reason) {\n    writer._closedPromise = Promise.reject(reason);\n    writer._closedPromise_resolve = undefined;\n    writer._closedPromise_reject = undefined;\n    writer._closedPromiseState = 'rejected';\n  }\n  function defaultWriterClosedPromiseInitializeAsResolved(writer) {\n    writer._closedPromise = Promise.resolve(undefined);\n    writer._closedPromise_resolve = undefined;\n    writer._closedPromise_reject = undefined;\n    writer._closedPromiseState = 'resolved';\n  }\n  function defaultWriterClosedPromiseReject(writer, reason) {\n    assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');\n    assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');\n    assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');\n    writer._closedPromise_reject(reason);\n    writer._closedPromise_resolve = undefined;\n    writer._closedPromise_reject = undefined;\n    writer._closedPromiseState = 'rejected';\n  }\n  function defaultWriterClosedPromiseResetToRejected(writer, reason) {\n    assert(writer._closedPromise_resolve === undefined, 'writer._closedPromise_resolve === undefined');\n    assert(writer._closedPromise_reject === undefined, 'writer._closedPromise_reject === undefined');\n    assert(writer._closedPromiseState !== 'pending', 'writer._closedPromiseState is not pending');\n    writer._closedPromise = Promise.reject(reason);\n    writer._closedPromiseState = 'rejected';\n  }\n  function defaultWriterClosedPromiseResolve(writer) {\n    assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');\n    assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');\n    assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');\n    writer._closedPromise_resolve(undefined);\n    writer._closedPromise_resolve = undefined;\n    writer._closedPromise_reject = undefined;\n    writer._closedPromiseState = 'resolved';\n  }\n  function defaultWriterReadyPromiseInitialize(writer) {\n    writer._readyPromise = new Promise(function (resolve, reject) {\n      writer._readyPromise_resolve = resolve;\n      writer._readyPromise_reject = reject;\n    });\n    writer._readyPromiseState = 'pending';\n  }\n  function defaultWriterReadyPromiseInitializeAsRejected(writer, reason) {\n    writer._readyPromise = Promise.reject(reason);\n    writer._readyPromise_resolve = undefined;\n    writer._readyPromise_reject = undefined;\n    writer._readyPromiseState = 'rejected';\n  }\n  function defaultWriterReadyPromiseInitializeAsResolved(writer) {\n    writer._readyPromise = Promise.resolve(undefined);\n    writer._readyPromise_resolve = undefined;\n    writer._readyPromise_reject = undefined;\n    writer._readyPromiseState = 'fulfilled';\n  }\n  function defaultWriterReadyPromiseReject(writer, reason) {\n    assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');\n    assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');\n    writer._readyPromise_reject(reason);\n    writer._readyPromise_resolve = undefined;\n    writer._readyPromise_reject = undefined;\n    writer._readyPromiseState = 'rejected';\n  }\n  function defaultWriterReadyPromiseReset(writer) {\n    assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');\n    assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');\n    writer._readyPromise = new Promise(function (resolve, reject) {\n      writer._readyPromise_resolve = resolve;\n      writer._readyPromise_reject = reject;\n    });\n    writer._readyPromiseState = 'pending';\n  }\n  function defaultWriterReadyPromiseResetToRejected(writer, reason) {\n    assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');\n    assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');\n    writer._readyPromise = Promise.reject(reason);\n    writer._readyPromiseState = 'rejected';\n  }\n  function defaultWriterReadyPromiseResolve(writer) {\n    assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');\n    assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');\n    writer._readyPromise_resolve(undefined);\n    writer._readyPromise_resolve = undefined;\n    writer._readyPromise_reject = undefined;\n    writer._readyPromiseState = 'fulfilled';\n  }\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _require = __w_pdfjs_require__(0),\n      IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber;\n  var _require2 = __w_pdfjs_require__(1),\n      assert = _require2.assert;\n  exports.DequeueValue = function (container) {\n    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: DequeueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n    assert(container._queue.length > 0, 'Spec-level failure: should never dequeue from an empty queue.');\n    var pair = container._queue.shift();\n    container._queueTotalSize -= pair.size;\n    if (container._queueTotalSize < 0) {\n      container._queueTotalSize = 0;\n    }\n    return pair.value;\n  };\n  exports.EnqueueValueWithSize = function (container, value, size) {\n    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: EnqueueValueWithSize should only be used on containers with [[queue]] and ' + '[[queueTotalSize]].');\n    size = Number(size);\n    if (!IsFiniteNonNegativeNumber(size)) {\n      throw new RangeError('Size must be a finite, non-NaN, non-negative number.');\n    }\n    container._queue.push({\n      value: value,\n      size: size\n    });\n    container._queueTotalSize += size;\n  };\n  exports.PeekQueueValue = function (container) {\n    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: PeekQueueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n    assert(container._queue.length > 0, 'Spec-level failure: should never peek at an empty queue.');\n    var pair = container._queue[0];\n    return pair.value;\n  };\n  exports.ResetQueue = function (container) {\n    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: ResetQueue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n    container._queue = [];\n    container._queueTotalSize = 0;\n  };\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n  var _require = __w_pdfjs_require__(0),\n      ArrayBufferCopy = _require.ArrayBufferCopy,\n      CreateIterResultObject = _require.CreateIterResultObject,\n      IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber,\n      InvokeOrNoop = _require.InvokeOrNoop,\n      PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,\n      TransferArrayBuffer = _require.TransferArrayBuffer,\n      ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,\n      ValidateAndNormalizeHighWaterMark = _require.ValidateAndNormalizeHighWaterMark;\n  var _require2 = __w_pdfjs_require__(0),\n      createArrayFromList = _require2.createArrayFromList,\n      createDataProperty = _require2.createDataProperty,\n      typeIsObject = _require2.typeIsObject;\n  var _require3 = __w_pdfjs_require__(1),\n      assert = _require3.assert,\n      rethrowAssertionErrorRejection = _require3.rethrowAssertionErrorRejection;\n  var _require4 = __w_pdfjs_require__(3),\n      DequeueValue = _require4.DequeueValue,\n      EnqueueValueWithSize = _require4.EnqueueValueWithSize,\n      ResetQueue = _require4.ResetQueue;\n  var _require5 = __w_pdfjs_require__(2),\n      AcquireWritableStreamDefaultWriter = _require5.AcquireWritableStreamDefaultWriter,\n      IsWritableStream = _require5.IsWritableStream,\n      IsWritableStreamLocked = _require5.IsWritableStreamLocked,\n      WritableStreamAbort = _require5.WritableStreamAbort,\n      WritableStreamDefaultWriterCloseWithErrorPropagation = _require5.WritableStreamDefaultWriterCloseWithErrorPropagation,\n      WritableStreamDefaultWriterRelease = _require5.WritableStreamDefaultWriterRelease,\n      WritableStreamDefaultWriterWrite = _require5.WritableStreamDefaultWriterWrite,\n      WritableStreamCloseQueuedOrInFlight = _require5.WritableStreamCloseQueuedOrInFlight;\n  var ReadableStream = function () {\n    function ReadableStream() {\n      var underlyingSource = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          size = _ref.size,\n          highWaterMark = _ref.highWaterMark;\n      _classCallCheck(this, ReadableStream);\n      this._state = 'readable';\n      this._reader = undefined;\n      this._storedError = undefined;\n      this._disturbed = false;\n      this._readableStreamController = undefined;\n      var type = underlyingSource.type;\n      var typeString = String(type);\n      if (typeString === 'bytes') {\n        if (highWaterMark === undefined) {\n          highWaterMark = 0;\n        }\n        this._readableStreamController = new ReadableByteStreamController(this, underlyingSource, highWaterMark);\n      } else if (type === undefined) {\n        if (highWaterMark === undefined) {\n          highWaterMark = 1;\n        }\n        this._readableStreamController = new ReadableStreamDefaultController(this, underlyingSource, size, highWaterMark);\n      } else {\n        throw new RangeError('Invalid type is specified');\n      }\n    }\n    _createClass(ReadableStream, [{\n      key: 'cancel',\n      value: function cancel(reason) {\n        if (IsReadableStream(this) === false) {\n          return Promise.reject(streamBrandCheckException('cancel'));\n        }\n        if (IsReadableStreamLocked(this) === true) {\n          return Promise.reject(new TypeError('Cannot cancel a stream that already has a reader'));\n        }\n        return ReadableStreamCancel(this, reason);\n      }\n    }, {\n      key: 'getReader',\n      value: function getReader() {\n        var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n            mode = _ref2.mode;\n        if (IsReadableStream(this) === false) {\n          throw streamBrandCheckException('getReader');\n        }\n        if (mode === undefined) {\n          return AcquireReadableStreamDefaultReader(this);\n        }\n        mode = String(mode);\n        if (mode === 'byob') {\n          return AcquireReadableStreamBYOBReader(this);\n        }\n        throw new RangeError('Invalid mode is specified');\n      }\n    }, {\n      key: 'pipeThrough',\n      value: function pipeThrough(_ref3, options) {\n        var writable = _ref3.writable,\n            readable = _ref3.readable;\n        var promise = this.pipeTo(writable, options);\n        ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise);\n        return readable;\n      }\n    }, {\n      key: 'pipeTo',\n      value: function pipeTo(dest) {\n        var _this = this;\n        var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n            preventClose = _ref4.preventClose,\n            preventAbort = _ref4.preventAbort,\n            preventCancel = _ref4.preventCancel;\n        if (IsReadableStream(this) === false) {\n          return Promise.reject(streamBrandCheckException('pipeTo'));\n        }\n        if (IsWritableStream(dest) === false) {\n          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo\\'s first argument must be a WritableStream'));\n        }\n        preventClose = Boolean(preventClose);\n        preventAbort = Boolean(preventAbort);\n        preventCancel = Boolean(preventCancel);\n        if (IsReadableStreamLocked(this) === true) {\n          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream'));\n        }\n        if (IsWritableStreamLocked(dest) === true) {\n          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream'));\n        }\n        var reader = AcquireReadableStreamDefaultReader(this);\n        var writer = AcquireWritableStreamDefaultWriter(dest);\n        var shuttingDown = false;\n        var currentWrite = Promise.resolve();\n        return new Promise(function (resolve, reject) {\n          function pipeLoop() {\n            currentWrite = Promise.resolve();\n            if (shuttingDown === true) {\n              return Promise.resolve();\n            }\n            return writer._readyPromise.then(function () {\n              return ReadableStreamDefaultReaderRead(reader).then(function (_ref5) {\n                var value = _ref5.value,\n                    done = _ref5.done;\n                if (done === true) {\n                  return;\n                }\n                currentWrite = WritableStreamDefaultWriterWrite(writer, value).catch(function () {});\n              });\n            }).then(pipeLoop);\n          }\n          isOrBecomesErrored(_this, reader._closedPromise, function (storedError) {\n            if (preventAbort === false) {\n              shutdownWithAction(function () {\n                return WritableStreamAbort(dest, storedError);\n              }, true, storedError);\n            } else {\n              shutdown(true, storedError);\n            }\n          });\n          isOrBecomesErrored(dest, writer._closedPromise, function (storedError) {\n            if (preventCancel === false) {\n              shutdownWithAction(function () {\n                return ReadableStreamCancel(_this, storedError);\n              }, true, storedError);\n            } else {\n              shutdown(true, storedError);\n            }\n          });\n          isOrBecomesClosed(_this, reader._closedPromise, function () {\n            if (preventClose === false) {\n              shutdownWithAction(function () {\n                return WritableStreamDefaultWriterCloseWithErrorPropagation(writer);\n              });\n            } else {\n              shutdown();\n            }\n          });\n          if (WritableStreamCloseQueuedOrInFlight(dest) === true || dest._state === 'closed') {\n            var destClosed = new TypeError('the destination writable stream closed before all data could be piped to it');\n            if (preventCancel === false) {\n              shutdownWithAction(function () {\n                return ReadableStreamCancel(_this, destClosed);\n              }, true, destClosed);\n            } else {\n              shutdown(true, destClosed);\n            }\n          }\n          pipeLoop().catch(function (err) {\n            currentWrite = Promise.resolve();\n            rethrowAssertionErrorRejection(err);\n          });\n          function waitForWritesToFinish() {\n            var oldCurrentWrite = currentWrite;\n            return currentWrite.then(function () {\n              return oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined;\n            });\n          }\n          function isOrBecomesErrored(stream, promise, action) {\n            if (stream._state === 'errored') {\n              action(stream._storedError);\n            } else {\n              promise.catch(action).catch(rethrowAssertionErrorRejection);\n            }\n          }\n          function isOrBecomesClosed(stream, promise, action) {\n            if (stream._state === 'closed') {\n              action();\n            } else {\n              promise.then(action).catch(rethrowAssertionErrorRejection);\n            }\n          }\n          function shutdownWithAction(action, originalIsError, originalError) {\n            if (shuttingDown === true) {\n              return;\n            }\n            shuttingDown = true;\n            if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {\n              waitForWritesToFinish().then(doTheRest);\n            } else {\n              doTheRest();\n            }\n            function doTheRest() {\n              action().then(function () {\n                return finalize(originalIsError, originalError);\n              }, function (newError) {\n                return finalize(true, newError);\n              }).catch(rethrowAssertionErrorRejection);\n            }\n          }\n          function shutdown(isError, error) {\n            if (shuttingDown === true) {\n              return;\n            }\n            shuttingDown = true;\n            if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {\n              waitForWritesToFinish().then(function () {\n                return finalize(isError, error);\n              }).catch(rethrowAssertionErrorRejection);\n            } else {\n              finalize(isError, error);\n            }\n          }\n          function finalize(isError, error) {\n            WritableStreamDefaultWriterRelease(writer);\n            ReadableStreamReaderGenericRelease(reader);\n            if (isError) {\n              reject(error);\n            } else {\n              resolve(undefined);\n            }\n          }\n        });\n      }\n    }, {\n      key: 'tee',\n      value: function tee() {\n        if (IsReadableStream(this) === false) {\n          throw streamBrandCheckException('tee');\n        }\n        var branches = ReadableStreamTee(this, false);\n        return createArrayFromList(branches);\n      }\n    }, {\n      key: 'locked',\n      get: function get() {\n        if (IsReadableStream(this) === false) {\n          throw streamBrandCheckException('locked');\n        }\n        return IsReadableStreamLocked(this);\n      }\n    }]);\n    return ReadableStream;\n  }();\n  module.exports = {\n    ReadableStream: ReadableStream,\n    IsReadableStreamDisturbed: IsReadableStreamDisturbed,\n    ReadableStreamDefaultControllerClose: ReadableStreamDefaultControllerClose,\n    ReadableStreamDefaultControllerEnqueue: ReadableStreamDefaultControllerEnqueue,\n    ReadableStreamDefaultControllerError: ReadableStreamDefaultControllerError,\n    ReadableStreamDefaultControllerGetDesiredSize: ReadableStreamDefaultControllerGetDesiredSize\n  };\n  function AcquireReadableStreamBYOBReader(stream) {\n    return new ReadableStreamBYOBReader(stream);\n  }\n  function AcquireReadableStreamDefaultReader(stream) {\n    return new ReadableStreamDefaultReader(stream);\n  }\n  function IsReadableStream(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) {\n      return false;\n    }\n    return true;\n  }\n  function IsReadableStreamDisturbed(stream) {\n    assert(IsReadableStream(stream) === true, 'IsReadableStreamDisturbed should only be used on known readable streams');\n    return stream._disturbed;\n  }\n  function IsReadableStreamLocked(stream) {\n    assert(IsReadableStream(stream) === true, 'IsReadableStreamLocked should only be used on known readable streams');\n    if (stream._reader === undefined) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableStreamTee(stream, cloneForBranch2) {\n    assert(IsReadableStream(stream) === true);\n    assert(typeof cloneForBranch2 === 'boolean');\n    var reader = AcquireReadableStreamDefaultReader(stream);\n    var teeState = {\n      closedOrErrored: false,\n      canceled1: false,\n      canceled2: false,\n      reason1: undefined,\n      reason2: undefined\n    };\n    teeState.promise = new Promise(function (resolve) {\n      teeState._resolve = resolve;\n    });\n    var pull = create_ReadableStreamTeePullFunction();\n    pull._reader = reader;\n    pull._teeState = teeState;\n    pull._cloneForBranch2 = cloneForBranch2;\n    var cancel1 = create_ReadableStreamTeeBranch1CancelFunction();\n    cancel1._stream = stream;\n    cancel1._teeState = teeState;\n    var cancel2 = create_ReadableStreamTeeBranch2CancelFunction();\n    cancel2._stream = stream;\n    cancel2._teeState = teeState;\n    var underlyingSource1 = Object.create(Object.prototype);\n    createDataProperty(underlyingSource1, 'pull', pull);\n    createDataProperty(underlyingSource1, 'cancel', cancel1);\n    var branch1Stream = new ReadableStream(underlyingSource1);\n    var underlyingSource2 = Object.create(Object.prototype);\n    createDataProperty(underlyingSource2, 'pull', pull);\n    createDataProperty(underlyingSource2, 'cancel', cancel2);\n    var branch2Stream = new ReadableStream(underlyingSource2);\n    pull._branch1 = branch1Stream._readableStreamController;\n    pull._branch2 = branch2Stream._readableStreamController;\n    reader._closedPromise.catch(function (r) {\n      if (teeState.closedOrErrored === true) {\n        return;\n      }\n      ReadableStreamDefaultControllerError(pull._branch1, r);\n      ReadableStreamDefaultControllerError(pull._branch2, r);\n      teeState.closedOrErrored = true;\n    });\n    return [branch1Stream, branch2Stream];\n  }\n  function create_ReadableStreamTeePullFunction() {\n    function f() {\n      var reader = f._reader,\n          branch1 = f._branch1,\n          branch2 = f._branch2,\n          teeState = f._teeState;\n      return ReadableStreamDefaultReaderRead(reader).then(function (result) {\n        assert(typeIsObject(result));\n        var value = result.value;\n        var done = result.done;\n        assert(typeof done === 'boolean');\n        if (done === true && teeState.closedOrErrored === false) {\n          if (teeState.canceled1 === false) {\n            ReadableStreamDefaultControllerClose(branch1);\n          }\n          if (teeState.canceled2 === false) {\n            ReadableStreamDefaultControllerClose(branch2);\n          }\n          teeState.closedOrErrored = true;\n        }\n        if (teeState.closedOrErrored === true) {\n          return;\n        }\n        var value1 = value;\n        var value2 = value;\n        if (teeState.canceled1 === false) {\n          ReadableStreamDefaultControllerEnqueue(branch1, value1);\n        }\n        if (teeState.canceled2 === false) {\n          ReadableStreamDefaultControllerEnqueue(branch2, value2);\n        }\n      });\n    }\n    return f;\n  }\n  function create_ReadableStreamTeeBranch1CancelFunction() {\n    function f(reason) {\n      var stream = f._stream,\n          teeState = f._teeState;\n      teeState.canceled1 = true;\n      teeState.reason1 = reason;\n      if (teeState.canceled2 === true) {\n        var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);\n        var cancelResult = ReadableStreamCancel(stream, compositeReason);\n        teeState._resolve(cancelResult);\n      }\n      return teeState.promise;\n    }\n    return f;\n  }\n  function create_ReadableStreamTeeBranch2CancelFunction() {\n    function f(reason) {\n      var stream = f._stream,\n          teeState = f._teeState;\n      teeState.canceled2 = true;\n      teeState.reason2 = reason;\n      if (teeState.canceled1 === true) {\n        var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);\n        var cancelResult = ReadableStreamCancel(stream, compositeReason);\n        teeState._resolve(cancelResult);\n      }\n      return teeState.promise;\n    }\n    return f;\n  }\n  function ReadableStreamAddReadIntoRequest(stream) {\n    assert(IsReadableStreamBYOBReader(stream._reader) === true);\n    assert(stream._state === 'readable' || stream._state === 'closed');\n    var promise = new Promise(function (resolve, reject) {\n      var readIntoRequest = {\n        _resolve: resolve,\n        _reject: reject\n      };\n      stream._reader._readIntoRequests.push(readIntoRequest);\n    });\n    return promise;\n  }\n  function ReadableStreamAddReadRequest(stream) {\n    assert(IsReadableStreamDefaultReader(stream._reader) === true);\n    assert(stream._state === 'readable');\n    var promise = new Promise(function (resolve, reject) {\n      var readRequest = {\n        _resolve: resolve,\n        _reject: reject\n      };\n      stream._reader._readRequests.push(readRequest);\n    });\n    return promise;\n  }\n  function ReadableStreamCancel(stream, reason) {\n    stream._disturbed = true;\n    if (stream._state === 'closed') {\n      return Promise.resolve(undefined);\n    }\n    if (stream._state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    ReadableStreamClose(stream);\n    var sourceCancelPromise = stream._readableStreamController.__cancelSteps(reason);\n    return sourceCancelPromise.then(function () {\n      return undefined;\n    });\n  }\n  function ReadableStreamClose(stream) {\n    assert(stream._state === 'readable');\n    stream._state = 'closed';\n    var reader = stream._reader;\n    if (reader === undefined) {\n      return undefined;\n    }\n    if (IsReadableStreamDefaultReader(reader) === true) {\n      for (var i = 0; i < reader._readRequests.length; i++) {\n        var _resolve = reader._readRequests[i]._resolve;\n        _resolve(CreateIterResultObject(undefined, true));\n      }\n      reader._readRequests = [];\n    }\n    defaultReaderClosedPromiseResolve(reader);\n    return undefined;\n  }\n  function ReadableStreamError(stream, e) {\n    assert(IsReadableStream(stream) === true, 'stream must be ReadableStream');\n    assert(stream._state === 'readable', 'state must be readable');\n    stream._state = 'errored';\n    stream._storedError = e;\n    var reader = stream._reader;\n    if (reader === undefined) {\n      return undefined;\n    }\n    if (IsReadableStreamDefaultReader(reader) === true) {\n      for (var i = 0; i < reader._readRequests.length; i++) {\n        var readRequest = reader._readRequests[i];\n        readRequest._reject(e);\n      }\n      reader._readRequests = [];\n    } else {\n      assert(IsReadableStreamBYOBReader(reader), 'reader must be ReadableStreamBYOBReader');\n      for (var _i = 0; _i < reader._readIntoRequests.length; _i++) {\n        var readIntoRequest = reader._readIntoRequests[_i];\n        readIntoRequest._reject(e);\n      }\n      reader._readIntoRequests = [];\n    }\n    defaultReaderClosedPromiseReject(reader, e);\n    reader._closedPromise.catch(function () {});\n  }\n  function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) {\n    var reader = stream._reader;\n    assert(reader._readIntoRequests.length > 0);\n    var readIntoRequest = reader._readIntoRequests.shift();\n    readIntoRequest._resolve(CreateIterResultObject(chunk, done));\n  }\n  function ReadableStreamFulfillReadRequest(stream, chunk, done) {\n    var reader = stream._reader;\n    assert(reader._readRequests.length > 0);\n    var readRequest = reader._readRequests.shift();\n    readRequest._resolve(CreateIterResultObject(chunk, done));\n  }\n  function ReadableStreamGetNumReadIntoRequests(stream) {\n    return stream._reader._readIntoRequests.length;\n  }\n  function ReadableStreamGetNumReadRequests(stream) {\n    return stream._reader._readRequests.length;\n  }\n  function ReadableStreamHasBYOBReader(stream) {\n    var reader = stream._reader;\n    if (reader === undefined) {\n      return false;\n    }\n    if (IsReadableStreamBYOBReader(reader) === false) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableStreamHasDefaultReader(stream) {\n    var reader = stream._reader;\n    if (reader === undefined) {\n      return false;\n    }\n    if (IsReadableStreamDefaultReader(reader) === false) {\n      return false;\n    }\n    return true;\n  }\n  var ReadableStreamDefaultReader = function () {\n    function ReadableStreamDefaultReader(stream) {\n      _classCallCheck(this, ReadableStreamDefaultReader);\n      if (IsReadableStream(stream) === false) {\n        throw new TypeError('ReadableStreamDefaultReader can only be constructed with a ReadableStream instance');\n      }\n      if (IsReadableStreamLocked(stream) === true) {\n        throw new TypeError('This stream has already been locked for exclusive reading by another reader');\n      }\n      ReadableStreamReaderGenericInitialize(this, stream);\n      this._readRequests = [];\n    }\n    _createClass(ReadableStreamDefaultReader, [{\n      key: 'cancel',\n      value: function cancel(reason) {\n        if (IsReadableStreamDefaultReader(this) === false) {\n          return Promise.reject(defaultReaderBrandCheckException('cancel'));\n        }\n        if (this._ownerReadableStream === undefined) {\n          return Promise.reject(readerLockException('cancel'));\n        }\n        return ReadableStreamReaderGenericCancel(this, reason);\n      }\n    }, {\n      key: 'read',\n      value: function read() {\n        if (IsReadableStreamDefaultReader(this) === false) {\n          return Promise.reject(defaultReaderBrandCheckException('read'));\n        }\n        if (this._ownerReadableStream === undefined) {\n          return Promise.reject(readerLockException('read from'));\n        }\n        return ReadableStreamDefaultReaderRead(this);\n      }\n    }, {\n      key: 'releaseLock',\n      value: function releaseLock() {\n        if (IsReadableStreamDefaultReader(this) === false) {\n          throw defaultReaderBrandCheckException('releaseLock');\n        }\n        if (this._ownerReadableStream === undefined) {\n          return;\n        }\n        if (this._readRequests.length > 0) {\n          throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');\n        }\n        ReadableStreamReaderGenericRelease(this);\n      }\n    }, {\n      key: 'closed',\n      get: function get() {\n        if (IsReadableStreamDefaultReader(this) === false) {\n          return Promise.reject(defaultReaderBrandCheckException('closed'));\n        }\n        return this._closedPromise;\n      }\n    }]);\n    return ReadableStreamDefaultReader;\n  }();\n  var ReadableStreamBYOBReader = function () {\n    function ReadableStreamBYOBReader(stream) {\n      _classCallCheck(this, ReadableStreamBYOBReader);\n      if (!IsReadableStream(stream)) {\n        throw new TypeError('ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a ' + 'byte source');\n      }\n      if (IsReadableByteStreamController(stream._readableStreamController) === false) {\n        throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' + 'source');\n      }\n      if (IsReadableStreamLocked(stream)) {\n        throw new TypeError('This stream has already been locked for exclusive reading by another reader');\n      }\n      ReadableStreamReaderGenericInitialize(this, stream);\n      this._readIntoRequests = [];\n    }\n    _createClass(ReadableStreamBYOBReader, [{\n      key: 'cancel',\n      value: function cancel(reason) {\n        if (!IsReadableStreamBYOBReader(this)) {\n          return Promise.reject(byobReaderBrandCheckException('cancel'));\n        }\n        if (this._ownerReadableStream === undefined) {\n          return Promise.reject(readerLockException('cancel'));\n        }\n        return ReadableStreamReaderGenericCancel(this, reason);\n      }\n    }, {\n      key: 'read',\n      value: function read(view) {\n        if (!IsReadableStreamBYOBReader(this)) {\n          return Promise.reject(byobReaderBrandCheckException('read'));\n        }\n        if (this._ownerReadableStream === undefined) {\n          return Promise.reject(readerLockException('read from'));\n        }\n        if (!ArrayBuffer.isView(view)) {\n          return Promise.reject(new TypeError('view must be an array buffer view'));\n        }\n        if (view.byteLength === 0) {\n          return Promise.reject(new TypeError('view must have non-zero byteLength'));\n        }\n        return ReadableStreamBYOBReaderRead(this, view);\n      }\n    }, {\n      key: 'releaseLock',\n      value: function releaseLock() {\n        if (!IsReadableStreamBYOBReader(this)) {\n          throw byobReaderBrandCheckException('releaseLock');\n        }\n        if (this._ownerReadableStream === undefined) {\n          return;\n        }\n        if (this._readIntoRequests.length > 0) {\n          throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');\n        }\n        ReadableStreamReaderGenericRelease(this);\n      }\n    }, {\n      key: 'closed',\n      get: function get() {\n        if (!IsReadableStreamBYOBReader(this)) {\n          return Promise.reject(byobReaderBrandCheckException('closed'));\n        }\n        return this._closedPromise;\n      }\n    }]);\n    return ReadableStreamBYOBReader;\n  }();\n  function IsReadableStreamBYOBReader(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) {\n      return false;\n    }\n    return true;\n  }\n  function IsReadableStreamDefaultReader(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableStreamReaderGenericInitialize(reader, stream) {\n    reader._ownerReadableStream = stream;\n    stream._reader = reader;\n    if (stream._state === 'readable') {\n      defaultReaderClosedPromiseInitialize(reader);\n    } else if (stream._state === 'closed') {\n      defaultReaderClosedPromiseInitializeAsResolved(reader);\n    } else {\n      assert(stream._state === 'errored', 'state must be errored');\n      defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError);\n      reader._closedPromise.catch(function () {});\n    }\n  }\n  function ReadableStreamReaderGenericCancel(reader, reason) {\n    var stream = reader._ownerReadableStream;\n    assert(stream !== undefined);\n    return ReadableStreamCancel(stream, reason);\n  }\n  function ReadableStreamReaderGenericRelease(reader) {\n    assert(reader._ownerReadableStream !== undefined);\n    assert(reader._ownerReadableStream._reader === reader);\n    if (reader._ownerReadableStream._state === 'readable') {\n      defaultReaderClosedPromiseReject(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\\'s closedness'));\n    } else {\n      defaultReaderClosedPromiseResetToRejected(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\\'s closedness'));\n    }\n    reader._closedPromise.catch(function () {});\n    reader._ownerReadableStream._reader = undefined;\n    reader._ownerReadableStream = undefined;\n  }\n  function ReadableStreamBYOBReaderRead(reader, view) {\n    var stream = reader._ownerReadableStream;\n    assert(stream !== undefined);\n    stream._disturbed = true;\n    if (stream._state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    return ReadableByteStreamControllerPullInto(stream._readableStreamController, view);\n  }\n  function ReadableStreamDefaultReaderRead(reader) {\n    var stream = reader._ownerReadableStream;\n    assert(stream !== undefined);\n    stream._disturbed = true;\n    if (stream._state === 'closed') {\n      return Promise.resolve(CreateIterResultObject(undefined, true));\n    }\n    if (stream._state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    assert(stream._state === 'readable');\n    return stream._readableStreamController.__pullSteps();\n  }\n  var ReadableStreamDefaultController = function () {\n    function ReadableStreamDefaultController(stream, underlyingSource, size, highWaterMark) {\n      _classCallCheck(this, ReadableStreamDefaultController);\n      if (IsReadableStream(stream) === false) {\n        throw new TypeError('ReadableStreamDefaultController can only be constructed with a ReadableStream instance');\n      }\n      if (stream._readableStreamController !== undefined) {\n        throw new TypeError('ReadableStreamDefaultController instances can only be created by the ReadableStream constructor');\n      }\n      this._controlledReadableStream = stream;\n      this._underlyingSource = underlyingSource;\n      this._queue = undefined;\n      this._queueTotalSize = undefined;\n      ResetQueue(this);\n      this._started = false;\n      this._closeRequested = false;\n      this._pullAgain = false;\n      this._pulling = false;\n      var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);\n      this._strategySize = normalizedStrategy.size;\n      this._strategyHWM = normalizedStrategy.highWaterMark;\n      var controller = this;\n      var startResult = InvokeOrNoop(underlyingSource, 'start', [this]);\n      Promise.resolve(startResult).then(function () {\n        controller._started = true;\n        assert(controller._pulling === false);\n        assert(controller._pullAgain === false);\n        ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n      }, function (r) {\n        ReadableStreamDefaultControllerErrorIfNeeded(controller, r);\n      }).catch(rethrowAssertionErrorRejection);\n    }\n    _createClass(ReadableStreamDefaultController, [{\n      key: 'close',\n      value: function close() {\n        if (IsReadableStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('close');\n        }\n        if (this._closeRequested === true) {\n          throw new TypeError('The stream has already been closed; do not close it again!');\n        }\n        var state = this._controlledReadableStream._state;\n        if (state !== 'readable') {\n          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');\n        }\n        ReadableStreamDefaultControllerClose(this);\n      }\n    }, {\n      key: 'enqueue',\n      value: function enqueue(chunk) {\n        if (IsReadableStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('enqueue');\n        }\n        if (this._closeRequested === true) {\n          throw new TypeError('stream is closed or draining');\n        }\n        var state = this._controlledReadableStream._state;\n        if (state !== 'readable') {\n          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');\n        }\n        return ReadableStreamDefaultControllerEnqueue(this, chunk);\n      }\n    }, {\n      key: 'error',\n      value: function error(e) {\n        if (IsReadableStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('error');\n        }\n        var stream = this._controlledReadableStream;\n        if (stream._state !== 'readable') {\n          throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');\n        }\n        ReadableStreamDefaultControllerError(this, e);\n      }\n    }, {\n      key: '__cancelSteps',\n      value: function __cancelSteps(reason) {\n        ResetQueue(this);\n        return PromiseInvokeOrNoop(this._underlyingSource, 'cancel', [reason]);\n      }\n    }, {\n      key: '__pullSteps',\n      value: function __pullSteps() {\n        var stream = this._controlledReadableStream;\n        if (this._queue.length > 0) {\n          var chunk = DequeueValue(this);\n          if (this._closeRequested === true && this._queue.length === 0) {\n            ReadableStreamClose(stream);\n          } else {\n            ReadableStreamDefaultControllerCallPullIfNeeded(this);\n          }\n          return Promise.resolve(CreateIterResultObject(chunk, false));\n        }\n        var pendingPromise = ReadableStreamAddReadRequest(stream);\n        ReadableStreamDefaultControllerCallPullIfNeeded(this);\n        return pendingPromise;\n      }\n    }, {\n      key: 'desiredSize',\n      get: function get() {\n        if (IsReadableStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('desiredSize');\n        }\n        return ReadableStreamDefaultControllerGetDesiredSize(this);\n      }\n    }]);\n    return ReadableStreamDefaultController;\n  }();\n  function IsReadableStreamDefaultController(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSource')) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableStreamDefaultControllerCallPullIfNeeded(controller) {\n    var shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller);\n    if (shouldPull === false) {\n      return undefined;\n    }\n    if (controller._pulling === true) {\n      controller._pullAgain = true;\n      return undefined;\n    }\n    assert(controller._pullAgain === false);\n    controller._pulling = true;\n    var pullPromise = PromiseInvokeOrNoop(controller._underlyingSource, 'pull', [controller]);\n    pullPromise.then(function () {\n      controller._pulling = false;\n      if (controller._pullAgain === true) {\n        controller._pullAgain = false;\n        return ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n      }\n      return undefined;\n    }, function (e) {\n      ReadableStreamDefaultControllerErrorIfNeeded(controller, e);\n    }).catch(rethrowAssertionErrorRejection);\n    return undefined;\n  }\n  function ReadableStreamDefaultControllerShouldCallPull(controller) {\n    var stream = controller._controlledReadableStream;\n    if (stream._state === 'closed' || stream._state === 'errored') {\n      return false;\n    }\n    if (controller._closeRequested === true) {\n      return false;\n    }\n    if (controller._started === false) {\n      return false;\n    }\n    if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n      return true;\n    }\n    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);\n    if (desiredSize > 0) {\n      return true;\n    }\n    return false;\n  }\n  function ReadableStreamDefaultControllerClose(controller) {\n    var stream = controller._controlledReadableStream;\n    assert(controller._closeRequested === false);\n    assert(stream._state === 'readable');\n    controller._closeRequested = true;\n    if (controller._queue.length === 0) {\n      ReadableStreamClose(stream);\n    }\n  }\n  function ReadableStreamDefaultControllerEnqueue(controller, chunk) {\n    var stream = controller._controlledReadableStream;\n    assert(controller._closeRequested === false);\n    assert(stream._state === 'readable');\n    if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n      ReadableStreamFulfillReadRequest(stream, chunk, false);\n    } else {\n      var chunkSize = 1;\n      if (controller._strategySize !== undefined) {\n        var strategySize = controller._strategySize;\n        try {\n          chunkSize = strategySize(chunk);\n        } catch (chunkSizeE) {\n          ReadableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);\n          throw chunkSizeE;\n        }\n      }\n      try {\n        EnqueueValueWithSize(controller, chunk, chunkSize);\n      } catch (enqueueE) {\n        ReadableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);\n        throw enqueueE;\n      }\n    }\n    ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n    return undefined;\n  }\n  function ReadableStreamDefaultControllerError(controller, e) {\n    var stream = controller._controlledReadableStream;\n    assert(stream._state === 'readable');\n    ResetQueue(controller);\n    ReadableStreamError(stream, e);\n  }\n  function ReadableStreamDefaultControllerErrorIfNeeded(controller, e) {\n    if (controller._controlledReadableStream._state === 'readable') {\n      ReadableStreamDefaultControllerError(controller, e);\n    }\n  }\n  function ReadableStreamDefaultControllerGetDesiredSize(controller) {\n    var stream = controller._controlledReadableStream;\n    var state = stream._state;\n    if (state === 'errored') {\n      return null;\n    }\n    if (state === 'closed') {\n      return 0;\n    }\n    return controller._strategyHWM - controller._queueTotalSize;\n  }\n  var ReadableStreamBYOBRequest = function () {\n    function ReadableStreamBYOBRequest(controller, view) {\n      _classCallCheck(this, ReadableStreamBYOBRequest);\n      this._associatedReadableByteStreamController = controller;\n      this._view = view;\n    }\n    _createClass(ReadableStreamBYOBRequest, [{\n      key: 'respond',\n      value: function respond(bytesWritten) {\n        if (IsReadableStreamBYOBRequest(this) === false) {\n          throw byobRequestBrandCheckException('respond');\n        }\n        if (this._associatedReadableByteStreamController === undefined) {\n          throw new TypeError('This BYOB request has been invalidated');\n        }\n        ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten);\n      }\n    }, {\n      key: 'respondWithNewView',\n      value: function respondWithNewView(view) {\n        if (IsReadableStreamBYOBRequest(this) === false) {\n          throw byobRequestBrandCheckException('respond');\n        }\n        if (this._associatedReadableByteStreamController === undefined) {\n          throw new TypeError('This BYOB request has been invalidated');\n        }\n        if (!ArrayBuffer.isView(view)) {\n          throw new TypeError('You can only respond with array buffer views');\n        }\n        ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view);\n      }\n    }, {\n      key: 'view',\n      get: function get() {\n        return this._view;\n      }\n    }]);\n    return ReadableStreamBYOBRequest;\n  }();\n  var ReadableByteStreamController = function () {\n    function ReadableByteStreamController(stream, underlyingByteSource, highWaterMark) {\n      _classCallCheck(this, ReadableByteStreamController);\n      if (IsReadableStream(stream) === false) {\n        throw new TypeError('ReadableByteStreamController can only be constructed with a ReadableStream instance given ' + 'a byte source');\n      }\n      if (stream._readableStreamController !== undefined) {\n        throw new TypeError('ReadableByteStreamController instances can only be created by the ReadableStream constructor given a byte ' + 'source');\n      }\n      this._controlledReadableStream = stream;\n      this._underlyingByteSource = underlyingByteSource;\n      this._pullAgain = false;\n      this._pulling = false;\n      ReadableByteStreamControllerClearPendingPullIntos(this);\n      this._queue = this._queueTotalSize = undefined;\n      ResetQueue(this);\n      this._closeRequested = false;\n      this._started = false;\n      this._strategyHWM = ValidateAndNormalizeHighWaterMark(highWaterMark);\n      var autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize;\n      if (autoAllocateChunkSize !== undefined) {\n        if (Number.isInteger(autoAllocateChunkSize) === false || autoAllocateChunkSize <= 0) {\n          throw new RangeError('autoAllocateChunkSize must be a positive integer');\n        }\n      }\n      this._autoAllocateChunkSize = autoAllocateChunkSize;\n      this._pendingPullIntos = [];\n      var controller = this;\n      var startResult = InvokeOrNoop(underlyingByteSource, 'start', [this]);\n      Promise.resolve(startResult).then(function () {\n        controller._started = true;\n        assert(controller._pulling === false);\n        assert(controller._pullAgain === false);\n        ReadableByteStreamControllerCallPullIfNeeded(controller);\n      }, function (r) {\n        if (stream._state === 'readable') {\n          ReadableByteStreamControllerError(controller, r);\n        }\n      }).catch(rethrowAssertionErrorRejection);\n    }\n    _createClass(ReadableByteStreamController, [{\n      key: 'close',\n      value: function close() {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('close');\n        }\n        if (this._closeRequested === true) {\n          throw new TypeError('The stream has already been closed; do not close it again!');\n        }\n        var state = this._controlledReadableStream._state;\n        if (state !== 'readable') {\n          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');\n        }\n        ReadableByteStreamControllerClose(this);\n      }\n    }, {\n      key: 'enqueue',\n      value: function enqueue(chunk) {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('enqueue');\n        }\n        if (this._closeRequested === true) {\n          throw new TypeError('stream is closed or draining');\n        }\n        var state = this._controlledReadableStream._state;\n        if (state !== 'readable') {\n          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');\n        }\n        if (!ArrayBuffer.isView(chunk)) {\n          throw new TypeError('You can only enqueue array buffer views when using a ReadableByteStreamController');\n        }\n        ReadableByteStreamControllerEnqueue(this, chunk);\n      }\n    }, {\n      key: 'error',\n      value: function error(e) {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('error');\n        }\n        var stream = this._controlledReadableStream;\n        if (stream._state !== 'readable') {\n          throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');\n        }\n        ReadableByteStreamControllerError(this, e);\n      }\n    }, {\n      key: '__cancelSteps',\n      value: function __cancelSteps(reason) {\n        if (this._pendingPullIntos.length > 0) {\n          var firstDescriptor = this._pendingPullIntos[0];\n          firstDescriptor.bytesFilled = 0;\n        }\n        ResetQueue(this);\n        return PromiseInvokeOrNoop(this._underlyingByteSource, 'cancel', [reason]);\n      }\n    }, {\n      key: '__pullSteps',\n      value: function __pullSteps() {\n        var stream = this._controlledReadableStream;\n        assert(ReadableStreamHasDefaultReader(stream) === true);\n        if (this._queueTotalSize > 0) {\n          assert(ReadableStreamGetNumReadRequests(stream) === 0);\n          var entry = this._queue.shift();\n          this._queueTotalSize -= entry.byteLength;\n          ReadableByteStreamControllerHandleQueueDrain(this);\n          var view = void 0;\n          try {\n            view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength);\n          } catch (viewE) {\n            return Promise.reject(viewE);\n          }\n          return Promise.resolve(CreateIterResultObject(view, false));\n        }\n        var autoAllocateChunkSize = this._autoAllocateChunkSize;\n        if (autoAllocateChunkSize !== undefined) {\n          var buffer = void 0;\n          try {\n            buffer = new ArrayBuffer(autoAllocateChunkSize);\n          } catch (bufferE) {\n            return Promise.reject(bufferE);\n          }\n          var pullIntoDescriptor = {\n            buffer: buffer,\n            byteOffset: 0,\n            byteLength: autoAllocateChunkSize,\n            bytesFilled: 0,\n            elementSize: 1,\n            ctor: Uint8Array,\n            readerType: 'default'\n          };\n          this._pendingPullIntos.push(pullIntoDescriptor);\n        }\n        var promise = ReadableStreamAddReadRequest(stream);\n        ReadableByteStreamControllerCallPullIfNeeded(this);\n        return promise;\n      }\n    }, {\n      key: 'byobRequest',\n      get: function get() {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('byobRequest');\n        }\n        if (this._byobRequest === undefined && this._pendingPullIntos.length > 0) {\n          var firstDescriptor = this._pendingPullIntos[0];\n          var view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled);\n          this._byobRequest = new ReadableStreamBYOBRequest(this, view);\n        }\n        return this._byobRequest;\n      }\n    }, {\n      key: 'desiredSize',\n      get: function get() {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('desiredSize');\n        }\n        return ReadableByteStreamControllerGetDesiredSize(this);\n      }\n    }]);\n    return ReadableByteStreamController;\n  }();\n  function IsReadableByteStreamController(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingByteSource')) {\n      return false;\n    }\n    return true;\n  }\n  function IsReadableStreamBYOBRequest(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableByteStreamControllerCallPullIfNeeded(controller) {\n    var shouldPull = ReadableByteStreamControllerShouldCallPull(controller);\n    if (shouldPull === false) {\n      return undefined;\n    }\n    if (controller._pulling === true) {\n      controller._pullAgain = true;\n      return undefined;\n    }\n    assert(controller._pullAgain === false);\n    controller._pulling = true;\n    var pullPromise = PromiseInvokeOrNoop(controller._underlyingByteSource, 'pull', [controller]);\n    pullPromise.then(function () {\n      controller._pulling = false;\n      if (controller._pullAgain === true) {\n        controller._pullAgain = false;\n        ReadableByteStreamControllerCallPullIfNeeded(controller);\n      }\n    }, function (e) {\n      if (controller._controlledReadableStream._state === 'readable') {\n        ReadableByteStreamControllerError(controller, e);\n      }\n    }).catch(rethrowAssertionErrorRejection);\n    return undefined;\n  }\n  function ReadableByteStreamControllerClearPendingPullIntos(controller) {\n    ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n    controller._pendingPullIntos = [];\n  }\n  function ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) {\n    assert(stream._state !== 'errored', 'state must not be errored');\n    var done = false;\n    if (stream._state === 'closed') {\n      assert(pullIntoDescriptor.bytesFilled === 0);\n      done = true;\n    }\n    var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);\n    if (pullIntoDescriptor.readerType === 'default') {\n      ReadableStreamFulfillReadRequest(stream, filledView, done);\n    } else {\n      assert(pullIntoDescriptor.readerType === 'byob');\n      ReadableStreamFulfillReadIntoRequest(stream, filledView, done);\n    }\n  }\n  function ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) {\n    var bytesFilled = pullIntoDescriptor.bytesFilled;\n    var elementSize = pullIntoDescriptor.elementSize;\n    assert(bytesFilled <= pullIntoDescriptor.byteLength);\n    assert(bytesFilled % elementSize === 0);\n    return new pullIntoDescriptor.ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize);\n  }\n  function ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) {\n    controller._queue.push({\n      buffer: buffer,\n      byteOffset: byteOffset,\n      byteLength: byteLength\n    });\n    controller._queueTotalSize += byteLength;\n  }\n  function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) {\n    var elementSize = pullIntoDescriptor.elementSize;\n    var currentAlignedBytes = pullIntoDescriptor.bytesFilled - pullIntoDescriptor.bytesFilled % elementSize;\n    var maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled);\n    var maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy;\n    var maxAlignedBytes = maxBytesFilled - maxBytesFilled % elementSize;\n    var totalBytesToCopyRemaining = maxBytesToCopy;\n    var ready = false;\n    if (maxAlignedBytes > currentAlignedBytes) {\n      totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled;\n      ready = true;\n    }\n    var queue = controller._queue;\n    while (totalBytesToCopyRemaining > 0) {\n      var headOfQueue = queue[0];\n      var bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength);\n      var destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;\n      ArrayBufferCopy(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy);\n      if (headOfQueue.byteLength === bytesToCopy) {\n        queue.shift();\n      } else {\n        headOfQueue.byteOffset += bytesToCopy;\n        headOfQueue.byteLength -= bytesToCopy;\n      }\n      controller._queueTotalSize -= bytesToCopy;\n      ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor);\n      totalBytesToCopyRemaining -= bytesToCopy;\n    }\n    if (ready === false) {\n      assert(controller._queueTotalSize === 0, 'queue must be empty');\n      assert(pullIntoDescriptor.bytesFilled > 0);\n      assert(pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize);\n    }\n    return ready;\n  }\n  function ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) {\n    assert(controller._pendingPullIntos.length === 0 || controller._pendingPullIntos[0] === pullIntoDescriptor);\n    ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n    pullIntoDescriptor.bytesFilled += size;\n  }\n  function ReadableByteStreamControllerHandleQueueDrain(controller) {\n    assert(controller._controlledReadableStream._state === 'readable');\n    if (controller._queueTotalSize === 0 && controller._closeRequested === true) {\n      ReadableStreamClose(controller._controlledReadableStream);\n    } else {\n      ReadableByteStreamControllerCallPullIfNeeded(controller);\n    }\n  }\n  function ReadableByteStreamControllerInvalidateBYOBRequest(controller) {\n    if (controller._byobRequest === undefined) {\n      return;\n    }\n    controller._byobRequest._associatedReadableByteStreamController = undefined;\n    controller._byobRequest._view = undefined;\n    controller._byobRequest = undefined;\n  }\n  function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) {\n    assert(controller._closeRequested === false);\n    while (controller._pendingPullIntos.length > 0) {\n      if (controller._queueTotalSize === 0) {\n        return;\n      }\n      var pullIntoDescriptor = controller._pendingPullIntos[0];\n      if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {\n        ReadableByteStreamControllerShiftPendingPullInto(controller);\n        ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);\n      }\n    }\n  }\n  function ReadableByteStreamControllerPullInto(controller, view) {\n    var stream = controller._controlledReadableStream;\n    var elementSize = 1;\n    if (view.constructor !== DataView) {\n      elementSize = view.constructor.BYTES_PER_ELEMENT;\n    }\n    var ctor = view.constructor;\n    var pullIntoDescriptor = {\n      buffer: view.buffer,\n      byteOffset: view.byteOffset,\n      byteLength: view.byteLength,\n      bytesFilled: 0,\n      elementSize: elementSize,\n      ctor: ctor,\n      readerType: 'byob'\n    };\n    if (controller._pendingPullIntos.length > 0) {\n      pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n      controller._pendingPullIntos.push(pullIntoDescriptor);\n      return ReadableStreamAddReadIntoRequest(stream);\n    }\n    if (stream._state === 'closed') {\n      var emptyView = new view.constructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0);\n      return Promise.resolve(CreateIterResultObject(emptyView, true));\n    }\n    if (controller._queueTotalSize > 0) {\n      if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {\n        var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);\n        ReadableByteStreamControllerHandleQueueDrain(controller);\n        return Promise.resolve(CreateIterResultObject(filledView, false));\n      }\n      if (controller._closeRequested === true) {\n        var e = new TypeError('Insufficient bytes to fill elements in the given buffer');\n        ReadableByteStreamControllerError(controller, e);\n        return Promise.reject(e);\n      }\n    }\n    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n    controller._pendingPullIntos.push(pullIntoDescriptor);\n    var promise = ReadableStreamAddReadIntoRequest(stream);\n    ReadableByteStreamControllerCallPullIfNeeded(controller);\n    return promise;\n  }\n  function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) {\n    firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer);\n    assert(firstDescriptor.bytesFilled === 0, 'bytesFilled must be 0');\n    var stream = controller._controlledReadableStream;\n    if (ReadableStreamHasBYOBReader(stream) === true) {\n      while (ReadableStreamGetNumReadIntoRequests(stream) > 0) {\n        var pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller);\n        ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor);\n      }\n    }\n  }\n  function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) {\n    if (pullIntoDescriptor.bytesFilled + bytesWritten > pullIntoDescriptor.byteLength) {\n      throw new RangeError('bytesWritten out of range');\n    }\n    ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor);\n    if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize) {\n      return;\n    }\n    ReadableByteStreamControllerShiftPendingPullInto(controller);\n    var remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize;\n    if (remainderSize > 0) {\n      var end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;\n      var remainder = pullIntoDescriptor.buffer.slice(end - remainderSize, end);\n      ReadableByteStreamControllerEnqueueChunkToQueue(controller, remainder, 0, remainder.byteLength);\n    }\n    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n    pullIntoDescriptor.bytesFilled -= remainderSize;\n    ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);\n    ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);\n  }\n  function ReadableByteStreamControllerRespondInternal(controller, bytesWritten) {\n    var firstDescriptor = controller._pendingPullIntos[0];\n    var stream = controller._controlledReadableStream;\n    if (stream._state === 'closed') {\n      if (bytesWritten !== 0) {\n        throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream');\n      }\n      ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor);\n    } else {\n      assert(stream._state === 'readable');\n      ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor);\n    }\n  }\n  function ReadableByteStreamControllerShiftPendingPullInto(controller) {\n    var descriptor = controller._pendingPullIntos.shift();\n    ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n    return descriptor;\n  }\n  function ReadableByteStreamControllerShouldCallPull(controller) {\n    var stream = controller._controlledReadableStream;\n    if (stream._state !== 'readable') {\n      return false;\n    }\n    if (controller._closeRequested === true) {\n      return false;\n    }\n    if (controller._started === false) {\n      return false;\n    }\n    if (ReadableStreamHasDefaultReader(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n      return true;\n    }\n    if (ReadableStreamHasBYOBReader(stream) === true && ReadableStreamGetNumReadIntoRequests(stream) > 0) {\n      return true;\n    }\n    if (ReadableByteStreamControllerGetDesiredSize(controller) > 0) {\n      return true;\n    }\n    return false;\n  }\n  function ReadableByteStreamControllerClose(controller) {\n    var stream = controller._controlledReadableStream;\n    assert(controller._closeRequested === false);\n    assert(stream._state === 'readable');\n    if (controller._queueTotalSize > 0) {\n      controller._closeRequested = true;\n      return;\n    }\n    if (controller._pendingPullIntos.length > 0) {\n      var firstPendingPullInto = controller._pendingPullIntos[0];\n      if (firstPendingPullInto.bytesFilled > 0) {\n        var e = new TypeError('Insufficient bytes to fill elements in the given buffer');\n        ReadableByteStreamControllerError(controller, e);\n        throw e;\n      }\n    }\n    ReadableStreamClose(stream);\n  }\n  function ReadableByteStreamControllerEnqueue(controller, chunk) {\n    var stream = controller._controlledReadableStream;\n    assert(controller._closeRequested === false);\n    assert(stream._state === 'readable');\n    var buffer = chunk.buffer;\n    var byteOffset = chunk.byteOffset;\n    var byteLength = chunk.byteLength;\n    var transferredBuffer = TransferArrayBuffer(buffer);\n    if (ReadableStreamHasDefaultReader(stream) === true) {\n      if (ReadableStreamGetNumReadRequests(stream) === 0) {\n        ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n      } else {\n        assert(controller._queue.length === 0);\n        var transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength);\n        ReadableStreamFulfillReadRequest(stream, transferredView, false);\n      }\n    } else if (ReadableStreamHasBYOBReader(stream) === true) {\n      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n      ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);\n    } else {\n      assert(IsReadableStreamLocked(stream) === false, 'stream must not be locked');\n      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n    }\n  }\n  function ReadableByteStreamControllerError(controller, e) {\n    var stream = controller._controlledReadableStream;\n    assert(stream._state === 'readable');\n    ReadableByteStreamControllerClearPendingPullIntos(controller);\n    ResetQueue(controller);\n    ReadableStreamError(stream, e);\n  }\n  function ReadableByteStreamControllerGetDesiredSize(controller) {\n    var stream = controller._controlledReadableStream;\n    var state = stream._state;\n    if (state === 'errored') {\n      return null;\n    }\n    if (state === 'closed') {\n      return 0;\n    }\n    return controller._strategyHWM - controller._queueTotalSize;\n  }\n  function ReadableByteStreamControllerRespond(controller, bytesWritten) {\n    bytesWritten = Number(bytesWritten);\n    if (IsFiniteNonNegativeNumber(bytesWritten) === false) {\n      throw new RangeError('bytesWritten must be a finite');\n    }\n    assert(controller._pendingPullIntos.length > 0);\n    ReadableByteStreamControllerRespondInternal(controller, bytesWritten);\n  }\n  function ReadableByteStreamControllerRespondWithNewView(controller, view) {\n    assert(controller._pendingPullIntos.length > 0);\n    var firstDescriptor = controller._pendingPullIntos[0];\n    if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) {\n      throw new RangeError('The region specified by view does not match byobRequest');\n    }\n    if (firstDescriptor.byteLength !== view.byteLength) {\n      throw new RangeError('The buffer of view has different capacity than byobRequest');\n    }\n    firstDescriptor.buffer = view.buffer;\n    ReadableByteStreamControllerRespondInternal(controller, view.byteLength);\n  }\n  function streamBrandCheckException(name) {\n    return new TypeError('ReadableStream.prototype.' + name + ' can only be used on a ReadableStream');\n  }\n  function readerLockException(name) {\n    return new TypeError('Cannot ' + name + ' a stream using a released reader');\n  }\n  function defaultReaderBrandCheckException(name) {\n    return new TypeError('ReadableStreamDefaultReader.prototype.' + name + ' can only be used on a ReadableStreamDefaultReader');\n  }\n  function defaultReaderClosedPromiseInitialize(reader) {\n    reader._closedPromise = new Promise(function (resolve, reject) {\n      reader._closedPromise_resolve = resolve;\n      reader._closedPromise_reject = reject;\n    });\n  }\n  function defaultReaderClosedPromiseInitializeAsRejected(reader, reason) {\n    reader._closedPromise = Promise.reject(reason);\n    reader._closedPromise_resolve = undefined;\n    reader._closedPromise_reject = undefined;\n  }\n  function defaultReaderClosedPromiseInitializeAsResolved(reader) {\n    reader._closedPromise = Promise.resolve(undefined);\n    reader._closedPromise_resolve = undefined;\n    reader._closedPromise_reject = undefined;\n  }\n  function defaultReaderClosedPromiseReject(reader, reason) {\n    assert(reader._closedPromise_resolve !== undefined);\n    assert(reader._closedPromise_reject !== undefined);\n    reader._closedPromise_reject(reason);\n    reader._closedPromise_resolve = undefined;\n    reader._closedPromise_reject = undefined;\n  }\n  function defaultReaderClosedPromiseResetToRejected(reader, reason) {\n    assert(reader._closedPromise_resolve === undefined);\n    assert(reader._closedPromise_reject === undefined);\n    reader._closedPromise = Promise.reject(reason);\n  }\n  function defaultReaderClosedPromiseResolve(reader) {\n    assert(reader._closedPromise_resolve !== undefined);\n    assert(reader._closedPromise_reject !== undefined);\n    reader._closedPromise_resolve(undefined);\n    reader._closedPromise_resolve = undefined;\n    reader._closedPromise_reject = undefined;\n  }\n  function byobReaderBrandCheckException(name) {\n    return new TypeError('ReadableStreamBYOBReader.prototype.' + name + ' can only be used on a ReadableStreamBYOBReader');\n  }\n  function defaultControllerBrandCheckException(name) {\n    return new TypeError('ReadableStreamDefaultController.prototype.' + name + ' can only be used on a ReadableStreamDefaultController');\n  }\n  function byobRequestBrandCheckException(name) {\n    return new TypeError('ReadableStreamBYOBRequest.prototype.' + name + ' can only be used on a ReadableStreamBYOBRequest');\n  }\n  function byteStreamControllerBrandCheckException(name) {\n    return new TypeError('ReadableByteStreamController.prototype.' + name + ' can only be used on a ReadableByteStreamController');\n  }\n  function ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise) {\n    try {\n      Promise.prototype.then.call(promise, undefined, function () {});\n    } catch (e) {}\n  }\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var transformStream = __w_pdfjs_require__(6);\n  var readableStream = __w_pdfjs_require__(4);\n  var writableStream = __w_pdfjs_require__(2);\n  exports.TransformStream = transformStream.TransformStream;\n  exports.ReadableStream = readableStream.ReadableStream;\n  exports.IsReadableStreamDisturbed = readableStream.IsReadableStreamDisturbed;\n  exports.ReadableStreamDefaultControllerClose = readableStream.ReadableStreamDefaultControllerClose;\n  exports.ReadableStreamDefaultControllerEnqueue = readableStream.ReadableStreamDefaultControllerEnqueue;\n  exports.ReadableStreamDefaultControllerError = readableStream.ReadableStreamDefaultControllerError;\n  exports.ReadableStreamDefaultControllerGetDesiredSize = readableStream.ReadableStreamDefaultControllerGetDesiredSize;\n  exports.AcquireWritableStreamDefaultWriter = writableStream.AcquireWritableStreamDefaultWriter;\n  exports.IsWritableStream = writableStream.IsWritableStream;\n  exports.IsWritableStreamLocked = writableStream.IsWritableStreamLocked;\n  exports.WritableStream = writableStream.WritableStream;\n  exports.WritableStreamAbort = writableStream.WritableStreamAbort;\n  exports.WritableStreamDefaultControllerError = writableStream.WritableStreamDefaultControllerError;\n  exports.WritableStreamDefaultWriterCloseWithErrorPropagation = writableStream.WritableStreamDefaultWriterCloseWithErrorPropagation;\n  exports.WritableStreamDefaultWriterRelease = writableStream.WritableStreamDefaultWriterRelease;\n  exports.WritableStreamDefaultWriterWrite = writableStream.WritableStreamDefaultWriterWrite;\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n  var _require = __w_pdfjs_require__(1),\n      assert = _require.assert;\n  var _require2 = __w_pdfjs_require__(0),\n      InvokeOrNoop = _require2.InvokeOrNoop,\n      PromiseInvokeOrPerformFallback = _require2.PromiseInvokeOrPerformFallback,\n      PromiseInvokeOrNoop = _require2.PromiseInvokeOrNoop,\n      typeIsObject = _require2.typeIsObject;\n  var _require3 = __w_pdfjs_require__(4),\n      ReadableStream = _require3.ReadableStream,\n      ReadableStreamDefaultControllerClose = _require3.ReadableStreamDefaultControllerClose,\n      ReadableStreamDefaultControllerEnqueue = _require3.ReadableStreamDefaultControllerEnqueue,\n      ReadableStreamDefaultControllerError = _require3.ReadableStreamDefaultControllerError,\n      ReadableStreamDefaultControllerGetDesiredSize = _require3.ReadableStreamDefaultControllerGetDesiredSize;\n  var _require4 = __w_pdfjs_require__(2),\n      WritableStream = _require4.WritableStream,\n      WritableStreamDefaultControllerError = _require4.WritableStreamDefaultControllerError;\n  function TransformStreamCloseReadable(transformStream) {\n    if (transformStream._errored === true) {\n      throw new TypeError('TransformStream is already errored');\n    }\n    if (transformStream._readableClosed === true) {\n      throw new TypeError('Readable side is already closed');\n    }\n    TransformStreamCloseReadableInternal(transformStream);\n  }\n  function TransformStreamEnqueueToReadable(transformStream, chunk) {\n    if (transformStream._errored === true) {\n      throw new TypeError('TransformStream is already errored');\n    }\n    if (transformStream._readableClosed === true) {\n      throw new TypeError('Readable side is already closed');\n    }\n    var controller = transformStream._readableController;\n    try {\n      ReadableStreamDefaultControllerEnqueue(controller, chunk);\n    } catch (e) {\n      transformStream._readableClosed = true;\n      TransformStreamErrorIfNeeded(transformStream, e);\n      throw transformStream._storedError;\n    }\n    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);\n    var maybeBackpressure = desiredSize <= 0;\n    if (maybeBackpressure === true && transformStream._backpressure === false) {\n      TransformStreamSetBackpressure(transformStream, true);\n    }\n  }\n  function TransformStreamError(transformStream, e) {\n    if (transformStream._errored === true) {\n      throw new TypeError('TransformStream is already errored');\n    }\n    TransformStreamErrorInternal(transformStream, e);\n  }\n  function TransformStreamCloseReadableInternal(transformStream) {\n    assert(transformStream._errored === false);\n    assert(transformStream._readableClosed === false);\n    try {\n      ReadableStreamDefaultControllerClose(transformStream._readableController);\n    } catch (e) {\n      assert(false);\n    }\n    transformStream._readableClosed = true;\n  }\n  function TransformStreamErrorIfNeeded(transformStream, e) {\n    if (transformStream._errored === false) {\n      TransformStreamErrorInternal(transformStream, e);\n    }\n  }\n  function TransformStreamErrorInternal(transformStream, e) {\n    assert(transformStream._errored === false);\n    transformStream._errored = true;\n    transformStream._storedError = e;\n    if (transformStream._writableDone === false) {\n      WritableStreamDefaultControllerError(transformStream._writableController, e);\n    }\n    if (transformStream._readableClosed === false) {\n      ReadableStreamDefaultControllerError(transformStream._readableController, e);\n    }\n  }\n  function TransformStreamReadableReadyPromise(transformStream) {\n    assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n    if (transformStream._backpressure === false) {\n      return Promise.resolve();\n    }\n    assert(transformStream._backpressure === true, '_backpressure should have been initialized');\n    return transformStream._backpressureChangePromise;\n  }\n  function TransformStreamSetBackpressure(transformStream, backpressure) {\n    assert(transformStream._backpressure !== backpressure, 'TransformStreamSetBackpressure() should be called only when backpressure is changed');\n    if (transformStream._backpressureChangePromise !== undefined) {\n      transformStream._backpressureChangePromise_resolve(backpressure);\n    }\n    transformStream._backpressureChangePromise = new Promise(function (resolve) {\n      transformStream._backpressureChangePromise_resolve = resolve;\n    });\n    transformStream._backpressureChangePromise.then(function (resolution) {\n      assert(resolution !== backpressure, '_backpressureChangePromise should be fulfilled only when backpressure is changed');\n    });\n    transformStream._backpressure = backpressure;\n  }\n  function TransformStreamDefaultTransform(chunk, transformStreamController) {\n    var transformStream = transformStreamController._controlledTransformStream;\n    TransformStreamEnqueueToReadable(transformStream, chunk);\n    return Promise.resolve();\n  }\n  function TransformStreamTransform(transformStream, chunk) {\n    assert(transformStream._errored === false);\n    assert(transformStream._transforming === false);\n    assert(transformStream._backpressure === false);\n    transformStream._transforming = true;\n    var transformer = transformStream._transformer;\n    var controller = transformStream._transformStreamController;\n    var transformPromise = PromiseInvokeOrPerformFallback(transformer, 'transform', [chunk, controller], TransformStreamDefaultTransform, [chunk, controller]);\n    return transformPromise.then(function () {\n      transformStream._transforming = false;\n      return TransformStreamReadableReadyPromise(transformStream);\n    }, function (e) {\n      TransformStreamErrorIfNeeded(transformStream, e);\n      return Promise.reject(e);\n    });\n  }\n  function IsTransformStreamDefaultController(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) {\n      return false;\n    }\n    return true;\n  }\n  function IsTransformStream(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) {\n      return false;\n    }\n    return true;\n  }\n  var TransformStreamSink = function () {\n    function TransformStreamSink(transformStream, startPromise) {\n      _classCallCheck(this, TransformStreamSink);\n      this._transformStream = transformStream;\n      this._startPromise = startPromise;\n    }\n    _createClass(TransformStreamSink, [{\n      key: 'start',\n      value: function start(c) {\n        var transformStream = this._transformStream;\n        transformStream._writableController = c;\n        return this._startPromise.then(function () {\n          return TransformStreamReadableReadyPromise(transformStream);\n        });\n      }\n    }, {\n      key: 'write',\n      value: function write(chunk) {\n        var transformStream = this._transformStream;\n        return TransformStreamTransform(transformStream, chunk);\n      }\n    }, {\n      key: 'abort',\n      value: function abort() {\n        var transformStream = this._transformStream;\n        transformStream._writableDone = true;\n        TransformStreamErrorInternal(transformStream, new TypeError('Writable side aborted'));\n      }\n    }, {\n      key: 'close',\n      value: function close() {\n        var transformStream = this._transformStream;\n        assert(transformStream._transforming === false);\n        transformStream._writableDone = true;\n        var flushPromise = PromiseInvokeOrNoop(transformStream._transformer, 'flush', [transformStream._transformStreamController]);\n        return flushPromise.then(function () {\n          if (transformStream._errored === true) {\n            return Promise.reject(transformStream._storedError);\n          }\n          if (transformStream._readableClosed === false) {\n            TransformStreamCloseReadableInternal(transformStream);\n          }\n          return Promise.resolve();\n        }).catch(function (r) {\n          TransformStreamErrorIfNeeded(transformStream, r);\n          return Promise.reject(transformStream._storedError);\n        });\n      }\n    }]);\n    return TransformStreamSink;\n  }();\n  var TransformStreamSource = function () {\n    function TransformStreamSource(transformStream, startPromise) {\n      _classCallCheck(this, TransformStreamSource);\n      this._transformStream = transformStream;\n      this._startPromise = startPromise;\n    }\n    _createClass(TransformStreamSource, [{\n      key: 'start',\n      value: function start(c) {\n        var transformStream = this._transformStream;\n        transformStream._readableController = c;\n        return this._startPromise.then(function () {\n          assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n          if (transformStream._backpressure === true) {\n            return Promise.resolve();\n          }\n          assert(transformStream._backpressure === false, '_backpressure should have been initialized');\n          return transformStream._backpressureChangePromise;\n        });\n      }\n    }, {\n      key: 'pull',\n      value: function pull() {\n        var transformStream = this._transformStream;\n        assert(transformStream._backpressure === true, 'pull() should be never called while _backpressure is false');\n        assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n        TransformStreamSetBackpressure(transformStream, false);\n        return transformStream._backpressureChangePromise;\n      }\n    }, {\n      key: 'cancel',\n      value: function cancel() {\n        var transformStream = this._transformStream;\n        transformStream._readableClosed = true;\n        TransformStreamErrorInternal(transformStream, new TypeError('Readable side canceled'));\n      }\n    }]);\n    return TransformStreamSource;\n  }();\n  var TransformStreamDefaultController = function () {\n    function TransformStreamDefaultController(transformStream) {\n      _classCallCheck(this, TransformStreamDefaultController);\n      if (IsTransformStream(transformStream) === false) {\n        throw new TypeError('TransformStreamDefaultController can only be ' + 'constructed with a TransformStream instance');\n      }\n      if (transformStream._transformStreamController !== undefined) {\n        throw new TypeError('TransformStreamDefaultController instances can ' + 'only be created by the TransformStream constructor');\n      }\n      this._controlledTransformStream = transformStream;\n    }\n    _createClass(TransformStreamDefaultController, [{\n      key: 'enqueue',\n      value: function enqueue(chunk) {\n        if (IsTransformStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('enqueue');\n        }\n        TransformStreamEnqueueToReadable(this._controlledTransformStream, chunk);\n      }\n    }, {\n      key: 'close',\n      value: function close() {\n        if (IsTransformStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('close');\n        }\n        TransformStreamCloseReadable(this._controlledTransformStream);\n      }\n    }, {\n      key: 'error',\n      value: function error(reason) {\n        if (IsTransformStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('error');\n        }\n        TransformStreamError(this._controlledTransformStream, reason);\n      }\n    }, {\n      key: 'desiredSize',\n      get: function get() {\n        if (IsTransformStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('desiredSize');\n        }\n        var transformStream = this._controlledTransformStream;\n        var readableController = transformStream._readableController;\n        return ReadableStreamDefaultControllerGetDesiredSize(readableController);\n      }\n    }]);\n    return TransformStreamDefaultController;\n  }();\n  var TransformStream = function () {\n    function TransformStream() {\n      var transformer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      _classCallCheck(this, TransformStream);\n      this._transformer = transformer;\n      var readableStrategy = transformer.readableStrategy,\n          writableStrategy = transformer.writableStrategy;\n      this._transforming = false;\n      this._errored = false;\n      this._storedError = undefined;\n      this._writableController = undefined;\n      this._readableController = undefined;\n      this._transformStreamController = undefined;\n      this._writableDone = false;\n      this._readableClosed = false;\n      this._backpressure = undefined;\n      this._backpressureChangePromise = undefined;\n      this._backpressureChangePromise_resolve = undefined;\n      this._transformStreamController = new TransformStreamDefaultController(this);\n      var startPromise_resolve = void 0;\n      var startPromise = new Promise(function (resolve) {\n        startPromise_resolve = resolve;\n      });\n      var source = new TransformStreamSource(this, startPromise);\n      this._readable = new ReadableStream(source, readableStrategy);\n      var sink = new TransformStreamSink(this, startPromise);\n      this._writable = new WritableStream(sink, writableStrategy);\n      assert(this._writableController !== undefined);\n      assert(this._readableController !== undefined);\n      var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(this._readableController);\n      TransformStreamSetBackpressure(this, desiredSize <= 0);\n      var transformStream = this;\n      var startResult = InvokeOrNoop(transformer, 'start', [transformStream._transformStreamController]);\n      startPromise_resolve(startResult);\n      startPromise.catch(function (e) {\n        if (transformStream._errored === false) {\n          transformStream._errored = true;\n          transformStream._storedError = e;\n        }\n      });\n    }\n    _createClass(TransformStream, [{\n      key: 'readable',\n      get: function get() {\n        if (IsTransformStream(this) === false) {\n          throw streamBrandCheckException('readable');\n        }\n        return this._readable;\n      }\n    }, {\n      key: 'writable',\n      get: function get() {\n        if (IsTransformStream(this) === false) {\n          throw streamBrandCheckException('writable');\n        }\n        return this._writable;\n      }\n    }]);\n    return TransformStream;\n  }();\n  module.exports = { TransformStream: TransformStream };\n  function defaultControllerBrandCheckException(name) {\n    return new TypeError('TransformStreamDefaultController.prototype.' + name + ' can only be used on a TransformStreamDefaultController');\n  }\n  function streamBrandCheckException(name) {\n    return new TypeError('TransformStream.prototype.' + name + ' can only be used on a TransformStream');\n  }\n}, function (module, exports, __w_pdfjs_require__) {\n  module.exports = __w_pdfjs_require__(5);\n}]));\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.CanvasGraphics = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _pattern_helper = __w_pdfjs_require__(13);\n\nvar _webgl = __w_pdfjs_require__(7);\n\nvar MIN_FONT_SIZE = 16;\nvar MAX_FONT_SIZE = 100;\nvar MAX_GROUP_SIZE = 4096;\nvar MIN_WIDTH_FACTOR = 0.65;\nvar COMPILE_TYPE3_GLYPHS = true;\nvar MAX_SIZE_TO_COMPILE = 1000;\nvar FULL_CHUNK_HEIGHT = 16;\nvar IsLittleEndianCached = {\n  get value() {\n    return (0, _util.shadow)(IsLittleEndianCached, 'value', (0, _util.isLittleEndian)());\n  }\n};\nfunction addContextCurrentTransform(ctx) {\n  if (!ctx.mozCurrentTransform) {\n    ctx._originalSave = ctx.save;\n    ctx._originalRestore = ctx.restore;\n    ctx._originalRotate = ctx.rotate;\n    ctx._originalScale = ctx.scale;\n    ctx._originalTranslate = ctx.translate;\n    ctx._originalTransform = ctx.transform;\n    ctx._originalSetTransform = ctx.setTransform;\n    ctx._transformMatrix = ctx._transformMatrix || [1, 0, 0, 1, 0, 0];\n    ctx._transformStack = [];\n    Object.defineProperty(ctx, 'mozCurrentTransform', {\n      get: function getCurrentTransform() {\n        return this._transformMatrix;\n      }\n    });\n    Object.defineProperty(ctx, 'mozCurrentTransformInverse', {\n      get: function getCurrentTransformInverse() {\n        var m = this._transformMatrix;\n        var a = m[0],\n            b = m[1],\n            c = m[2],\n            d = m[3],\n            e = m[4],\n            f = m[5];\n        var ad_bc = a * d - b * c;\n        var bc_ad = b * c - a * d;\n        return [d / ad_bc, b / bc_ad, c / bc_ad, a / ad_bc, (d * e - c * f) / bc_ad, (b * e - a * f) / ad_bc];\n      }\n    });\n    ctx.save = function ctxSave() {\n      var old = this._transformMatrix;\n      this._transformStack.push(old);\n      this._transformMatrix = old.slice(0, 6);\n      this._originalSave();\n    };\n    ctx.restore = function ctxRestore() {\n      var prev = this._transformStack.pop();\n      if (prev) {\n        this._transformMatrix = prev;\n        this._originalRestore();\n      }\n    };\n    ctx.translate = function ctxTranslate(x, y) {\n      var m = this._transformMatrix;\n      m[4] = m[0] * x + m[2] * y + m[4];\n      m[5] = m[1] * x + m[3] * y + m[5];\n      this._originalTranslate(x, y);\n    };\n    ctx.scale = function ctxScale(x, y) {\n      var m = this._transformMatrix;\n      m[0] = m[0] * x;\n      m[1] = m[1] * x;\n      m[2] = m[2] * y;\n      m[3] = m[3] * y;\n      this._originalScale(x, y);\n    };\n    ctx.transform = function ctxTransform(a, b, c, d, e, f) {\n      var m = this._transformMatrix;\n      this._transformMatrix = [m[0] * a + m[2] * b, m[1] * a + m[3] * b, m[0] * c + m[2] * d, m[1] * c + m[3] * d, m[0] * e + m[2] * f + m[4], m[1] * e + m[3] * f + m[5]];\n      ctx._originalTransform(a, b, c, d, e, f);\n    };\n    ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {\n      this._transformMatrix = [a, b, c, d, e, f];\n      ctx._originalSetTransform(a, b, c, d, e, f);\n    };\n    ctx.rotate = function ctxRotate(angle) {\n      var cosValue = Math.cos(angle);\n      var sinValue = Math.sin(angle);\n      var m = this._transformMatrix;\n      this._transformMatrix = [m[0] * cosValue + m[2] * sinValue, m[1] * cosValue + m[3] * sinValue, m[0] * -sinValue + m[2] * cosValue, m[1] * -sinValue + m[3] * cosValue, m[4], m[5]];\n      this._originalRotate(angle);\n    };\n  }\n}\nvar CachedCanvases = function CachedCanvasesClosure() {\n  function CachedCanvases(canvasFactory) {\n    this.canvasFactory = canvasFactory;\n    this.cache = Object.create(null);\n  }\n  CachedCanvases.prototype = {\n    getCanvas: function CachedCanvases_getCanvas(id, width, height, trackTransform) {\n      var canvasEntry;\n      if (this.cache[id] !== undefined) {\n        canvasEntry = this.cache[id];\n        this.canvasFactory.reset(canvasEntry, width, height);\n        canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0);\n      } else {\n        canvasEntry = this.canvasFactory.create(width, height);\n        this.cache[id] = canvasEntry;\n      }\n      if (trackTransform) {\n        addContextCurrentTransform(canvasEntry.context);\n      }\n      return canvasEntry;\n    },\n    clear: function clear() {\n      for (var id in this.cache) {\n        var canvasEntry = this.cache[id];\n        this.canvasFactory.destroy(canvasEntry);\n        delete this.cache[id];\n      }\n    }\n  };\n  return CachedCanvases;\n}();\nfunction compileType3Glyph(imgData) {\n  var POINT_TO_PROCESS_LIMIT = 1000;\n  var width = imgData.width,\n      height = imgData.height;\n  var i,\n      j,\n      j0,\n      width1 = width + 1;\n  var points = new Uint8Array(width1 * (height + 1));\n  var POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);\n  var lineSize = width + 7 & ~7,\n      data0 = imgData.data;\n  var data = new Uint8Array(lineSize * height),\n      pos = 0,\n      ii;\n  for (i = 0, ii = data0.length; i < ii; i++) {\n    var mask = 128,\n        elem = data0[i];\n    while (mask > 0) {\n      data[pos++] = elem & mask ? 0 : 255;\n      mask >>= 1;\n    }\n  }\n  var count = 0;\n  pos = 0;\n  if (data[pos] !== 0) {\n    points[0] = 1;\n    ++count;\n  }\n  for (j = 1; j < width; j++) {\n    if (data[pos] !== data[pos + 1]) {\n      points[j] = data[pos] ? 2 : 1;\n      ++count;\n    }\n    pos++;\n  }\n  if (data[pos] !== 0) {\n    points[j] = 2;\n    ++count;\n  }\n  for (i = 1; i < height; i++) {\n    pos = i * lineSize;\n    j0 = i * width1;\n    if (data[pos - lineSize] !== data[pos]) {\n      points[j0] = data[pos] ? 1 : 8;\n      ++count;\n    }\n    var sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);\n    for (j = 1; j < width; j++) {\n      sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0);\n      if (POINT_TYPES[sum]) {\n        points[j0 + j] = POINT_TYPES[sum];\n        ++count;\n      }\n      pos++;\n    }\n    if (data[pos - lineSize] !== data[pos]) {\n      points[j0 + j] = data[pos] ? 2 : 4;\n      ++count;\n    }\n    if (count > POINT_TO_PROCESS_LIMIT) {\n      return null;\n    }\n  }\n  pos = lineSize * (height - 1);\n  j0 = i * width1;\n  if (data[pos] !== 0) {\n    points[j0] = 8;\n    ++count;\n  }\n  for (j = 1; j < width; j++) {\n    if (data[pos] !== data[pos + 1]) {\n      points[j0 + j] = data[pos] ? 4 : 8;\n      ++count;\n    }\n    pos++;\n  }\n  if (data[pos] !== 0) {\n    points[j0 + j] = 4;\n    ++count;\n  }\n  if (count > POINT_TO_PROCESS_LIMIT) {\n    return null;\n  }\n  var steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);\n  var outlines = [];\n  for (i = 0; count && i <= height; i++) {\n    var p = i * width1;\n    var end = p + width;\n    while (p < end && !points[p]) {\n      p++;\n    }\n    if (p === end) {\n      continue;\n    }\n    var coords = [p % width1, i];\n    var type = points[p],\n        p0 = p,\n        pp;\n    do {\n      var step = steps[type];\n      do {\n        p += step;\n      } while (!points[p]);\n      pp = points[p];\n      if (pp !== 5 && pp !== 10) {\n        type = pp;\n        points[p] = 0;\n      } else {\n        type = pp & 0x33 * type >> 4;\n        points[p] &= type >> 2 | type << 2;\n      }\n      coords.push(p % width1);\n      coords.push(p / width1 | 0);\n      --count;\n    } while (p0 !== p);\n    outlines.push(coords);\n    --i;\n  }\n  var drawOutline = function drawOutline(c) {\n    c.save();\n    c.scale(1 / width, -1 / height);\n    c.translate(0, -height);\n    c.beginPath();\n    for (var i = 0, ii = outlines.length; i < ii; i++) {\n      var o = outlines[i];\n      c.moveTo(o[0], o[1]);\n      for (var j = 2, jj = o.length; j < jj; j += 2) {\n        c.lineTo(o[j], o[j + 1]);\n      }\n    }\n    c.fill();\n    c.beginPath();\n    c.restore();\n  };\n  return drawOutline;\n}\nvar CanvasExtraState = function CanvasExtraStateClosure() {\n  function CanvasExtraState() {\n    this.alphaIsShape = false;\n    this.fontSize = 0;\n    this.fontSizeScale = 1;\n    this.textMatrix = _util.IDENTITY_MATRIX;\n    this.textMatrixScale = 1;\n    this.fontMatrix = _util.FONT_IDENTITY_MATRIX;\n    this.leading = 0;\n    this.x = 0;\n    this.y = 0;\n    this.lineX = 0;\n    this.lineY = 0;\n    this.charSpacing = 0;\n    this.wordSpacing = 0;\n    this.textHScale = 1;\n    this.textRenderingMode = _util.TextRenderingMode.FILL;\n    this.textRise = 0;\n    this.fillColor = '#000000';\n    this.strokeColor = '#000000';\n    this.patternFill = false;\n    this.fillAlpha = 1;\n    this.strokeAlpha = 1;\n    this.lineWidth = 1;\n    this.activeSMask = null;\n    this.resumeSMaskCtx = null;\n  }\n  CanvasExtraState.prototype = {\n    clone: function CanvasExtraState_clone() {\n      return Object.create(this);\n    },\n    setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {\n      this.x = x;\n      this.y = y;\n    }\n  };\n  return CanvasExtraState;\n}();\nvar CanvasGraphics = function CanvasGraphicsClosure() {\n  var EXECUTION_TIME = 15;\n  var EXECUTION_STEPS = 10;\n  function CanvasGraphics(canvasCtx, commonObjs, objs, canvasFactory, imageLayer) {\n    this.ctx = canvasCtx;\n    this.current = new CanvasExtraState();\n    this.stateStack = [];\n    this.pendingClip = null;\n    this.pendingEOFill = false;\n    this.res = null;\n    this.xobjs = null;\n    this.commonObjs = commonObjs;\n    this.objs = objs;\n    this.canvasFactory = canvasFactory;\n    this.imageLayer = imageLayer;\n    this.groupStack = [];\n    this.processingType3 = null;\n    this.baseTransform = null;\n    this.baseTransformStack = [];\n    this.groupLevel = 0;\n    this.smaskStack = [];\n    this.smaskCounter = 0;\n    this.tempSMask = null;\n    this.cachedCanvases = new CachedCanvases(this.canvasFactory);\n    if (canvasCtx) {\n      addContextCurrentTransform(canvasCtx);\n    }\n    this.cachedGetSinglePixelWidth = null;\n  }\n  function putBinaryImageData(ctx, imgData) {\n    if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) {\n      ctx.putImageData(imgData, 0, 0);\n      return;\n    }\n    var height = imgData.height,\n        width = imgData.width;\n    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n    var srcPos = 0,\n        destPos;\n    var src = imgData.data;\n    var dest = chunkImgData.data;\n    var i, j, thisChunkHeight, elemsInThisChunk;\n    if (imgData.kind === _util.ImageKind.GRAYSCALE_1BPP) {\n      var srcLength = src.byteLength;\n      var dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2);\n      var dest32DataLength = dest32.length;\n      var fullSrcDiff = width + 7 >> 3;\n      var white = 0xFFFFFFFF;\n      var black = IsLittleEndianCached.value ? 0xFF000000 : 0x000000FF;\n      for (i = 0; i < totalChunks; i++) {\n        thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n        destPos = 0;\n        for (j = 0; j < thisChunkHeight; j++) {\n          var srcDiff = srcLength - srcPos;\n          var k = 0;\n          var kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7;\n          var kEndUnrolled = kEnd & ~7;\n          var mask = 0;\n          var srcByte = 0;\n          for (; k < kEndUnrolled; k += 8) {\n            srcByte = src[srcPos++];\n            dest32[destPos++] = srcByte & 128 ? white : black;\n            dest32[destPos++] = srcByte & 64 ? white : black;\n            dest32[destPos++] = srcByte & 32 ? white : black;\n            dest32[destPos++] = srcByte & 16 ? white : black;\n            dest32[destPos++] = srcByte & 8 ? white : black;\n            dest32[destPos++] = srcByte & 4 ? white : black;\n            dest32[destPos++] = srcByte & 2 ? white : black;\n            dest32[destPos++] = srcByte & 1 ? white : black;\n          }\n          for (; k < kEnd; k++) {\n            if (mask === 0) {\n              srcByte = src[srcPos++];\n              mask = 128;\n            }\n            dest32[destPos++] = srcByte & mask ? white : black;\n            mask >>= 1;\n          }\n        }\n        while (destPos < dest32DataLength) {\n          dest32[destPos++] = 0;\n        }\n        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n      }\n    } else if (imgData.kind === _util.ImageKind.RGBA_32BPP) {\n      j = 0;\n      elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;\n      for (i = 0; i < fullChunks; i++) {\n        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n        srcPos += elemsInThisChunk;\n        ctx.putImageData(chunkImgData, 0, j);\n        j += FULL_CHUNK_HEIGHT;\n      }\n      if (i < totalChunks) {\n        elemsInThisChunk = width * partialChunkHeight * 4;\n        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n        ctx.putImageData(chunkImgData, 0, j);\n      }\n    } else if (imgData.kind === _util.ImageKind.RGB_24BPP) {\n      thisChunkHeight = FULL_CHUNK_HEIGHT;\n      elemsInThisChunk = width * thisChunkHeight;\n      for (i = 0; i < totalChunks; i++) {\n        if (i >= fullChunks) {\n          thisChunkHeight = partialChunkHeight;\n          elemsInThisChunk = width * thisChunkHeight;\n        }\n        destPos = 0;\n        for (j = elemsInThisChunk; j--;) {\n          dest[destPos++] = src[srcPos++];\n          dest[destPos++] = src[srcPos++];\n          dest[destPos++] = src[srcPos++];\n          dest[destPos++] = 255;\n        }\n        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n      }\n    } else {\n      throw new Error('bad image kind: ' + imgData.kind);\n    }\n  }\n  function putBinaryImageMask(ctx, imgData) {\n    var height = imgData.height,\n        width = imgData.width;\n    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n    var srcPos = 0;\n    var src = imgData.data;\n    var dest = chunkImgData.data;\n    for (var i = 0; i < totalChunks; i++) {\n      var thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n      var destPos = 3;\n      for (var j = 0; j < thisChunkHeight; j++) {\n        var mask = 0;\n        for (var k = 0; k < width; k++) {\n          if (!mask) {\n            var elem = src[srcPos++];\n            mask = 128;\n          }\n          dest[destPos] = elem & mask ? 0 : 255;\n          destPos += 4;\n          mask >>= 1;\n        }\n      }\n      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n    }\n  }\n  function copyCtxState(sourceCtx, destCtx) {\n    var properties = ['strokeStyle', 'fillStyle', 'fillRule', 'globalAlpha', 'lineWidth', 'lineCap', 'lineJoin', 'miterLimit', 'globalCompositeOperation', 'font'];\n    for (var i = 0, ii = properties.length; i < ii; i++) {\n      var property = properties[i];\n      if (sourceCtx[property] !== undefined) {\n        destCtx[property] = sourceCtx[property];\n      }\n    }\n    if (sourceCtx.setLineDash !== undefined) {\n      destCtx.setLineDash(sourceCtx.getLineDash());\n      destCtx.lineDashOffset = sourceCtx.lineDashOffset;\n    }\n  }\n  function resetCtxToDefault(ctx) {\n    ctx.strokeStyle = '#000000';\n    ctx.fillStyle = '#000000';\n    ctx.fillRule = 'nonzero';\n    ctx.globalAlpha = 1;\n    ctx.lineWidth = 1;\n    ctx.lineCap = 'butt';\n    ctx.lineJoin = 'miter';\n    ctx.miterLimit = 10;\n    ctx.globalCompositeOperation = 'source-over';\n    ctx.font = '10px sans-serif';\n    if (ctx.setLineDash !== undefined) {\n      ctx.setLineDash([]);\n      ctx.lineDashOffset = 0;\n    }\n  }\n  function composeSMaskBackdrop(bytes, r0, g0, b0) {\n    var length = bytes.length;\n    for (var i = 3; i < length; i += 4) {\n      var alpha = bytes[i];\n      if (alpha === 0) {\n        bytes[i - 3] = r0;\n        bytes[i - 2] = g0;\n        bytes[i - 1] = b0;\n      } else if (alpha < 255) {\n        var alpha_ = 255 - alpha;\n        bytes[i - 3] = bytes[i - 3] * alpha + r0 * alpha_ >> 8;\n        bytes[i - 2] = bytes[i - 2] * alpha + g0 * alpha_ >> 8;\n        bytes[i - 1] = bytes[i - 1] * alpha + b0 * alpha_ >> 8;\n      }\n    }\n  }\n  function composeSMaskAlpha(maskData, layerData, transferMap) {\n    var length = maskData.length;\n    var scale = 1 / 255;\n    for (var i = 3; i < length; i += 4) {\n      var alpha = transferMap ? transferMap[maskData[i]] : maskData[i];\n      layerData[i] = layerData[i] * alpha * scale | 0;\n    }\n  }\n  function composeSMaskLuminosity(maskData, layerData, transferMap) {\n    var length = maskData.length;\n    for (var i = 3; i < length; i += 4) {\n      var y = maskData[i - 3] * 77 + maskData[i - 2] * 152 + maskData[i - 1] * 28;\n      layerData[i] = transferMap ? layerData[i] * transferMap[y >> 8] >> 8 : layerData[i] * y >> 16;\n    }\n  }\n  function genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap) {\n    var hasBackdrop = !!backdrop;\n    var r0 = hasBackdrop ? backdrop[0] : 0;\n    var g0 = hasBackdrop ? backdrop[1] : 0;\n    var b0 = hasBackdrop ? backdrop[2] : 0;\n    var composeFn;\n    if (subtype === 'Luminosity') {\n      composeFn = composeSMaskLuminosity;\n    } else {\n      composeFn = composeSMaskAlpha;\n    }\n    var PIXELS_TO_PROCESS = 1048576;\n    var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width));\n    for (var row = 0; row < height; row += chunkSize) {\n      var chunkHeight = Math.min(chunkSize, height - row);\n      var maskData = maskCtx.getImageData(0, row, width, chunkHeight);\n      var layerData = layerCtx.getImageData(0, row, width, chunkHeight);\n      if (hasBackdrop) {\n        composeSMaskBackdrop(maskData.data, r0, g0, b0);\n      }\n      composeFn(maskData.data, layerData.data, transferMap);\n      maskCtx.putImageData(layerData, 0, row);\n    }\n  }\n  function composeSMask(ctx, smask, layerCtx) {\n    var mask = smask.canvas;\n    var maskCtx = smask.context;\n    ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY, smask.offsetX, smask.offsetY);\n    var backdrop = smask.backdrop || null;\n    if (!smask.transferMap && _webgl.WebGLUtils.isEnabled) {\n      var composed = _webgl.WebGLUtils.composeSMask(layerCtx.canvas, mask, {\n        subtype: smask.subtype,\n        backdrop: backdrop\n      });\n      ctx.setTransform(1, 0, 0, 1, 0, 0);\n      ctx.drawImage(composed, smask.offsetX, smask.offsetY);\n      return;\n    }\n    genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height, smask.subtype, backdrop, smask.transferMap);\n    ctx.drawImage(mask, 0, 0);\n  }\n  var LINE_CAP_STYLES = ['butt', 'round', 'square'];\n  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];\n  var NORMAL_CLIP = {};\n  var EO_CLIP = {};\n  CanvasGraphics.prototype = {\n    beginDrawing: function beginDrawing(_ref) {\n      var transform = _ref.transform,\n          viewport = _ref.viewport,\n          transparency = _ref.transparency,\n          _ref$background = _ref.background,\n          background = _ref$background === undefined ? null : _ref$background;\n\n      var width = this.ctx.canvas.width;\n      var height = this.ctx.canvas.height;\n      this.ctx.save();\n      this.ctx.fillStyle = background || 'rgb(255, 255, 255)';\n      this.ctx.fillRect(0, 0, width, height);\n      this.ctx.restore();\n      if (transparency) {\n        var transparentCanvas = this.cachedCanvases.getCanvas('transparent', width, height, true);\n        this.compositeCtx = this.ctx;\n        this.transparentCanvas = transparentCanvas.canvas;\n        this.ctx = transparentCanvas.context;\n        this.ctx.save();\n        this.ctx.transform.apply(this.ctx, this.compositeCtx.mozCurrentTransform);\n      }\n      this.ctx.save();\n      resetCtxToDefault(this.ctx);\n      if (transform) {\n        this.ctx.transform.apply(this.ctx, transform);\n      }\n      this.ctx.transform.apply(this.ctx, viewport.transform);\n      this.baseTransform = this.ctx.mozCurrentTransform.slice();\n      if (this.imageLayer) {\n        this.imageLayer.beginLayout();\n      }\n    },\n\n    executeOperatorList: function CanvasGraphics_executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper) {\n      var argsArray = operatorList.argsArray;\n      var fnArray = operatorList.fnArray;\n      var i = executionStartIdx || 0;\n      var argsArrayLen = argsArray.length;\n      if (argsArrayLen === i) {\n        return i;\n      }\n      var chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === 'function';\n      var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;\n      var steps = 0;\n      var commonObjs = this.commonObjs;\n      var objs = this.objs;\n      var fnId;\n      while (true) {\n        if (stepper !== undefined && i === stepper.nextBreakPoint) {\n          stepper.breakIt(i, continueCallback);\n          return i;\n        }\n        fnId = fnArray[i];\n        if (fnId !== _util.OPS.dependency) {\n          this[fnId].apply(this, argsArray[i]);\n        } else {\n          var deps = argsArray[i];\n          for (var n = 0, nn = deps.length; n < nn; n++) {\n            var depObjId = deps[n];\n            var common = depObjId[0] === 'g' && depObjId[1] === '_';\n            var objsPool = common ? commonObjs : objs;\n            if (!objsPool.isResolved(depObjId)) {\n              objsPool.get(depObjId, continueCallback);\n              return i;\n            }\n          }\n        }\n        i++;\n        if (i === argsArrayLen) {\n          return i;\n        }\n        if (chunkOperations && ++steps > EXECUTION_STEPS) {\n          if (Date.now() > endTime) {\n            continueCallback();\n            return i;\n          }\n          steps = 0;\n        }\n      }\n    },\n    endDrawing: function CanvasGraphics_endDrawing() {\n      if (this.current.activeSMask !== null) {\n        this.endSMaskGroup();\n      }\n      this.ctx.restore();\n      if (this.transparentCanvas) {\n        this.ctx = this.compositeCtx;\n        this.ctx.save();\n        this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n        this.ctx.drawImage(this.transparentCanvas, 0, 0);\n        this.ctx.restore();\n        this.transparentCanvas = null;\n      }\n      this.cachedCanvases.clear();\n      _webgl.WebGLUtils.clear();\n      if (this.imageLayer) {\n        this.imageLayer.endLayout();\n      }\n    },\n    setLineWidth: function CanvasGraphics_setLineWidth(width) {\n      this.current.lineWidth = width;\n      this.ctx.lineWidth = width;\n    },\n    setLineCap: function CanvasGraphics_setLineCap(style) {\n      this.ctx.lineCap = LINE_CAP_STYLES[style];\n    },\n    setLineJoin: function CanvasGraphics_setLineJoin(style) {\n      this.ctx.lineJoin = LINE_JOIN_STYLES[style];\n    },\n    setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {\n      this.ctx.miterLimit = limit;\n    },\n    setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {\n      var ctx = this.ctx;\n      if (ctx.setLineDash !== undefined) {\n        ctx.setLineDash(dashArray);\n        ctx.lineDashOffset = dashPhase;\n      }\n    },\n    setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {},\n    setFlatness: function CanvasGraphics_setFlatness(flatness) {},\n    setGState: function CanvasGraphics_setGState(states) {\n      for (var i = 0, ii = states.length; i < ii; i++) {\n        var state = states[i];\n        var key = state[0];\n        var value = state[1];\n        switch (key) {\n          case 'LW':\n            this.setLineWidth(value);\n            break;\n          case 'LC':\n            this.setLineCap(value);\n            break;\n          case 'LJ':\n            this.setLineJoin(value);\n            break;\n          case 'ML':\n            this.setMiterLimit(value);\n            break;\n          case 'D':\n            this.setDash(value[0], value[1]);\n            break;\n          case 'RI':\n            this.setRenderingIntent(value);\n            break;\n          case 'FL':\n            this.setFlatness(value);\n            break;\n          case 'Font':\n            this.setFont(value[0], value[1]);\n            break;\n          case 'CA':\n            this.current.strokeAlpha = state[1];\n            break;\n          case 'ca':\n            this.current.fillAlpha = state[1];\n            this.ctx.globalAlpha = state[1];\n            break;\n          case 'BM':\n            this.ctx.globalCompositeOperation = value;\n            break;\n          case 'SMask':\n            if (this.current.activeSMask) {\n              if (this.stateStack.length > 0 && this.stateStack[this.stateStack.length - 1].activeSMask === this.current.activeSMask) {\n                this.suspendSMaskGroup();\n              } else {\n                this.endSMaskGroup();\n              }\n            }\n            this.current.activeSMask = value ? this.tempSMask : null;\n            if (this.current.activeSMask) {\n              this.beginSMaskGroup();\n            }\n            this.tempSMask = null;\n            break;\n        }\n      }\n    },\n    beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() {\n      var activeSMask = this.current.activeSMask;\n      var drawnWidth = activeSMask.canvas.width;\n      var drawnHeight = activeSMask.canvas.height;\n      var cacheId = 'smaskGroupAt' + this.groupLevel;\n      var scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true);\n      var currentCtx = this.ctx;\n      var currentTransform = currentCtx.mozCurrentTransform;\n      this.ctx.save();\n      var groupCtx = scratchCanvas.context;\n      groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY);\n      groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY);\n      groupCtx.transform.apply(groupCtx, currentTransform);\n      activeSMask.startTransformInverse = groupCtx.mozCurrentTransformInverse;\n      copyCtxState(currentCtx, groupCtx);\n      this.ctx = groupCtx;\n      this.setGState([['BM', 'source-over'], ['ca', 1], ['CA', 1]]);\n      this.groupStack.push(currentCtx);\n      this.groupLevel++;\n    },\n    suspendSMaskGroup: function CanvasGraphics_endSMaskGroup() {\n      var groupCtx = this.ctx;\n      this.groupLevel--;\n      this.ctx = this.groupStack.pop();\n      composeSMask(this.ctx, this.current.activeSMask, groupCtx);\n      this.ctx.restore();\n      this.ctx.save();\n      copyCtxState(groupCtx, this.ctx);\n      this.current.resumeSMaskCtx = groupCtx;\n      var deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform);\n      this.ctx.transform.apply(this.ctx, deltaTransform);\n      groupCtx.save();\n      groupCtx.setTransform(1, 0, 0, 1, 0, 0);\n      groupCtx.clearRect(0, 0, groupCtx.canvas.width, groupCtx.canvas.height);\n      groupCtx.restore();\n    },\n    resumeSMaskGroup: function CanvasGraphics_endSMaskGroup() {\n      var groupCtx = this.current.resumeSMaskCtx;\n      var currentCtx = this.ctx;\n      this.ctx = groupCtx;\n      this.groupStack.push(currentCtx);\n      this.groupLevel++;\n    },\n    endSMaskGroup: function CanvasGraphics_endSMaskGroup() {\n      var groupCtx = this.ctx;\n      this.groupLevel--;\n      this.ctx = this.groupStack.pop();\n      composeSMask(this.ctx, this.current.activeSMask, groupCtx);\n      this.ctx.restore();\n      copyCtxState(groupCtx, this.ctx);\n      var deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform);\n      this.ctx.transform.apply(this.ctx, deltaTransform);\n    },\n    save: function CanvasGraphics_save() {\n      this.ctx.save();\n      var old = this.current;\n      this.stateStack.push(old);\n      this.current = old.clone();\n      this.current.resumeSMaskCtx = null;\n    },\n    restore: function CanvasGraphics_restore() {\n      if (this.current.resumeSMaskCtx) {\n        this.resumeSMaskGroup();\n      }\n      if (this.current.activeSMask !== null && (this.stateStack.length === 0 || this.stateStack[this.stateStack.length - 1].activeSMask !== this.current.activeSMask)) {\n        this.endSMaskGroup();\n      }\n      if (this.stateStack.length !== 0) {\n        this.current = this.stateStack.pop();\n        this.ctx.restore();\n        this.pendingClip = null;\n        this.cachedGetSinglePixelWidth = null;\n      }\n    },\n    transform: function CanvasGraphics_transform(a, b, c, d, e, f) {\n      this.ctx.transform(a, b, c, d, e, f);\n      this.cachedGetSinglePixelWidth = null;\n    },\n    constructPath: function CanvasGraphics_constructPath(ops, args) {\n      var ctx = this.ctx;\n      var current = this.current;\n      var x = current.x,\n          y = current.y;\n      for (var i = 0, j = 0, ii = ops.length; i < ii; i++) {\n        switch (ops[i] | 0) {\n          case _util.OPS.rectangle:\n            x = args[j++];\n            y = args[j++];\n            var width = args[j++];\n            var height = args[j++];\n            if (width === 0) {\n              width = this.getSinglePixelWidth();\n            }\n            if (height === 0) {\n              height = this.getSinglePixelWidth();\n            }\n            var xw = x + width;\n            var yh = y + height;\n            this.ctx.moveTo(x, y);\n            this.ctx.lineTo(xw, y);\n            this.ctx.lineTo(xw, yh);\n            this.ctx.lineTo(x, yh);\n            this.ctx.lineTo(x, y);\n            this.ctx.closePath();\n            break;\n          case _util.OPS.moveTo:\n            x = args[j++];\n            y = args[j++];\n            ctx.moveTo(x, y);\n            break;\n          case _util.OPS.lineTo:\n            x = args[j++];\n            y = args[j++];\n            ctx.lineTo(x, y);\n            break;\n          case _util.OPS.curveTo:\n            x = args[j + 4];\n            y = args[j + 5];\n            ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], x, y);\n            j += 6;\n            break;\n          case _util.OPS.curveTo2:\n            ctx.bezierCurveTo(x, y, args[j], args[j + 1], args[j + 2], args[j + 3]);\n            x = args[j + 2];\n            y = args[j + 3];\n            j += 4;\n            break;\n          case _util.OPS.curveTo3:\n            x = args[j + 2];\n            y = args[j + 3];\n            ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y);\n            j += 4;\n            break;\n          case _util.OPS.closePath:\n            ctx.closePath();\n            break;\n        }\n      }\n      current.setCurrentPoint(x, y);\n    },\n    closePath: function CanvasGraphics_closePath() {\n      this.ctx.closePath();\n    },\n    stroke: function CanvasGraphics_stroke(consumePath) {\n      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;\n      var ctx = this.ctx;\n      var strokeColor = this.current.strokeColor;\n      ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, this.current.lineWidth);\n      ctx.globalAlpha = this.current.strokeAlpha;\n      if (strokeColor && strokeColor.hasOwnProperty('type') && strokeColor.type === 'Pattern') {\n        ctx.save();\n        ctx.strokeStyle = strokeColor.getPattern(ctx, this);\n        ctx.stroke();\n        ctx.restore();\n      } else {\n        ctx.stroke();\n      }\n      if (consumePath) {\n        this.consumePath();\n      }\n      ctx.globalAlpha = this.current.fillAlpha;\n    },\n    closeStroke: function CanvasGraphics_closeStroke() {\n      this.closePath();\n      this.stroke();\n    },\n    fill: function CanvasGraphics_fill(consumePath) {\n      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;\n      var ctx = this.ctx;\n      var fillColor = this.current.fillColor;\n      var isPatternFill = this.current.patternFill;\n      var needRestore = false;\n      if (isPatternFill) {\n        ctx.save();\n        if (this.baseTransform) {\n          ctx.setTransform.apply(ctx, this.baseTransform);\n        }\n        ctx.fillStyle = fillColor.getPattern(ctx, this);\n        needRestore = true;\n      }\n      if (this.pendingEOFill) {\n        ctx.fill('evenodd');\n        this.pendingEOFill = false;\n      } else {\n        ctx.fill();\n      }\n      if (needRestore) {\n        ctx.restore();\n      }\n      if (consumePath) {\n        this.consumePath();\n      }\n    },\n    eoFill: function CanvasGraphics_eoFill() {\n      this.pendingEOFill = true;\n      this.fill();\n    },\n    fillStroke: function CanvasGraphics_fillStroke() {\n      this.fill(false);\n      this.stroke(false);\n      this.consumePath();\n    },\n    eoFillStroke: function CanvasGraphics_eoFillStroke() {\n      this.pendingEOFill = true;\n      this.fillStroke();\n    },\n    closeFillStroke: function CanvasGraphics_closeFillStroke() {\n      this.closePath();\n      this.fillStroke();\n    },\n    closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {\n      this.pendingEOFill = true;\n      this.closePath();\n      this.fillStroke();\n    },\n    endPath: function CanvasGraphics_endPath() {\n      this.consumePath();\n    },\n    clip: function CanvasGraphics_clip() {\n      this.pendingClip = NORMAL_CLIP;\n    },\n    eoClip: function CanvasGraphics_eoClip() {\n      this.pendingClip = EO_CLIP;\n    },\n    beginText: function CanvasGraphics_beginText() {\n      this.current.textMatrix = _util.IDENTITY_MATRIX;\n      this.current.textMatrixScale = 1;\n      this.current.x = this.current.lineX = 0;\n      this.current.y = this.current.lineY = 0;\n    },\n    endText: function CanvasGraphics_endText() {\n      var paths = this.pendingTextPaths;\n      var ctx = this.ctx;\n      if (paths === undefined) {\n        ctx.beginPath();\n        return;\n      }\n      ctx.save();\n      ctx.beginPath();\n      for (var i = 0; i < paths.length; i++) {\n        var path = paths[i];\n        ctx.setTransform.apply(ctx, path.transform);\n        ctx.translate(path.x, path.y);\n        path.addToPath(ctx, path.fontSize);\n      }\n      ctx.restore();\n      ctx.clip();\n      ctx.beginPath();\n      delete this.pendingTextPaths;\n    },\n    setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {\n      this.current.charSpacing = spacing;\n    },\n    setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {\n      this.current.wordSpacing = spacing;\n    },\n    setHScale: function CanvasGraphics_setHScale(scale) {\n      this.current.textHScale = scale / 100;\n    },\n    setLeading: function CanvasGraphics_setLeading(leading) {\n      this.current.leading = -leading;\n    },\n    setFont: function CanvasGraphics_setFont(fontRefName, size) {\n      var fontObj = this.commonObjs.get(fontRefName);\n      var current = this.current;\n      if (!fontObj) {\n        throw new Error('Can\\'t find font for ' + fontRefName);\n      }\n      current.fontMatrix = fontObj.fontMatrix ? fontObj.fontMatrix : _util.FONT_IDENTITY_MATRIX;\n      if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) {\n        (0, _util.warn)('Invalid font matrix for font ' + fontRefName);\n      }\n      if (size < 0) {\n        size = -size;\n        current.fontDirection = -1;\n      } else {\n        current.fontDirection = 1;\n      }\n      this.current.font = fontObj;\n      this.current.fontSize = size;\n      if (fontObj.isType3Font) {\n        return;\n      }\n      var name = fontObj.loadedName || 'sans-serif';\n      var bold = fontObj.black ? '900' : fontObj.bold ? 'bold' : 'normal';\n      var italic = fontObj.italic ? 'italic' : 'normal';\n      var typeface = '\"' + name + '\", ' + fontObj.fallbackName;\n      var browserFontSize = size < MIN_FONT_SIZE ? MIN_FONT_SIZE : size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size;\n      this.current.fontSizeScale = size / browserFontSize;\n      var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;\n      this.ctx.font = rule;\n    },\n    setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {\n      this.current.textRenderingMode = mode;\n    },\n    setTextRise: function CanvasGraphics_setTextRise(rise) {\n      this.current.textRise = rise;\n    },\n    moveText: function CanvasGraphics_moveText(x, y) {\n      this.current.x = this.current.lineX += x;\n      this.current.y = this.current.lineY += y;\n    },\n    setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {\n      this.setLeading(-y);\n      this.moveText(x, y);\n    },\n    setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {\n      this.current.textMatrix = [a, b, c, d, e, f];\n      this.current.textMatrixScale = Math.sqrt(a * a + b * b);\n      this.current.x = this.current.lineX = 0;\n      this.current.y = this.current.lineY = 0;\n    },\n    nextLine: function CanvasGraphics_nextLine() {\n      this.moveText(0, this.current.leading);\n    },\n    paintChar: function CanvasGraphics_paintChar(character, x, y) {\n      var ctx = this.ctx;\n      var current = this.current;\n      var font = current.font;\n      var textRenderingMode = current.textRenderingMode;\n      var fontSize = current.fontSize / current.fontSizeScale;\n      var fillStrokeMode = textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK;\n      var isAddToPathSet = !!(textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG);\n      var addToPath;\n      if (font.disableFontFace || isAddToPathSet) {\n        addToPath = font.getPathGenerator(this.commonObjs, character);\n      }\n      if (font.disableFontFace) {\n        ctx.save();\n        ctx.translate(x, y);\n        ctx.beginPath();\n        addToPath(ctx, fontSize);\n        if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {\n          ctx.fill();\n        }\n        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {\n          ctx.stroke();\n        }\n        ctx.restore();\n      } else {\n        if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {\n          ctx.fillText(character, x, y);\n        }\n        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {\n          ctx.strokeText(character, x, y);\n        }\n      }\n      if (isAddToPathSet) {\n        var paths = this.pendingTextPaths || (this.pendingTextPaths = []);\n        paths.push({\n          transform: ctx.mozCurrentTransform,\n          x: x,\n          y: y,\n          fontSize: fontSize,\n          addToPath: addToPath\n        });\n      }\n    },\n    get isFontSubpixelAAEnabled() {\n      var ctx = this.canvasFactory.create(10, 10).context;\n      ctx.scale(1.5, 1);\n      ctx.fillText('I', 0, 10);\n      var data = ctx.getImageData(0, 0, 10, 10).data;\n      var enabled = false;\n      for (var i = 3; i < data.length; i += 4) {\n        if (data[i] > 0 && data[i] < 255) {\n          enabled = true;\n          break;\n        }\n      }\n      return (0, _util.shadow)(this, 'isFontSubpixelAAEnabled', enabled);\n    },\n    showText: function CanvasGraphics_showText(glyphs) {\n      var current = this.current;\n      var font = current.font;\n      if (font.isType3Font) {\n        return this.showType3Text(glyphs);\n      }\n      var fontSize = current.fontSize;\n      if (fontSize === 0) {\n        return;\n      }\n      var ctx = this.ctx;\n      var fontSizeScale = current.fontSizeScale;\n      var charSpacing = current.charSpacing;\n      var wordSpacing = current.wordSpacing;\n      var fontDirection = current.fontDirection;\n      var textHScale = current.textHScale * fontDirection;\n      var glyphsLength = glyphs.length;\n      var vertical = font.vertical;\n      var spacingDir = vertical ? 1 : -1;\n      var defaultVMetrics = font.defaultVMetrics;\n      var widthAdvanceScale = fontSize * current.fontMatrix[0];\n      var simpleFillText = current.textRenderingMode === _util.TextRenderingMode.FILL && !font.disableFontFace;\n      ctx.save();\n      ctx.transform.apply(ctx, current.textMatrix);\n      ctx.translate(current.x, current.y + current.textRise);\n      if (current.patternFill) {\n        ctx.fillStyle = current.fillColor.getPattern(ctx, this);\n      }\n      if (fontDirection > 0) {\n        ctx.scale(textHScale, -1);\n      } else {\n        ctx.scale(textHScale, 1);\n      }\n      var lineWidth = current.lineWidth;\n      var scale = current.textMatrixScale;\n      if (scale === 0 || lineWidth === 0) {\n        var fillStrokeMode = current.textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK;\n        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {\n          this.cachedGetSinglePixelWidth = null;\n          lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR;\n        }\n      } else {\n        lineWidth /= scale;\n      }\n      if (fontSizeScale !== 1.0) {\n        ctx.scale(fontSizeScale, fontSizeScale);\n        lineWidth /= fontSizeScale;\n      }\n      ctx.lineWidth = lineWidth;\n      var x = 0,\n          i;\n      for (i = 0; i < glyphsLength; ++i) {\n        var glyph = glyphs[i];\n        if ((0, _util.isNum)(glyph)) {\n          x += spacingDir * glyph * fontSize / 1000;\n          continue;\n        }\n        var restoreNeeded = false;\n        var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n        var character = glyph.fontChar;\n        var accent = glyph.accent;\n        var scaledX, scaledY, scaledAccentX, scaledAccentY;\n        var width = glyph.width;\n        if (vertical) {\n          var vmetric, vx, vy;\n          vmetric = glyph.vmetric || defaultVMetrics;\n          vx = glyph.vmetric ? vmetric[1] : width * 0.5;\n          vx = -vx * widthAdvanceScale;\n          vy = vmetric[2] * widthAdvanceScale;\n          width = vmetric ? -vmetric[0] : width;\n          scaledX = vx / fontSizeScale;\n          scaledY = (x + vy) / fontSizeScale;\n        } else {\n          scaledX = x / fontSizeScale;\n          scaledY = 0;\n        }\n        if (font.remeasure && width > 0) {\n          var measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale;\n          if (width < measuredWidth && this.isFontSubpixelAAEnabled) {\n            var characterScaleX = width / measuredWidth;\n            restoreNeeded = true;\n            ctx.save();\n            ctx.scale(characterScaleX, 1);\n            scaledX /= characterScaleX;\n          } else if (width !== measuredWidth) {\n            scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale;\n          }\n        }\n        if (glyph.isInFont || font.missingFile) {\n          if (simpleFillText && !accent) {\n            ctx.fillText(character, scaledX, scaledY);\n          } else {\n            this.paintChar(character, scaledX, scaledY);\n            if (accent) {\n              scaledAccentX = scaledX + accent.offset.x / fontSizeScale;\n              scaledAccentY = scaledY - accent.offset.y / fontSizeScale;\n              this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);\n            }\n          }\n        }\n        var charWidth = width * widthAdvanceScale + spacing * fontDirection;\n        x += charWidth;\n        if (restoreNeeded) {\n          ctx.restore();\n        }\n      }\n      if (vertical) {\n        current.y -= x * textHScale;\n      } else {\n        current.x += x * textHScale;\n      }\n      ctx.restore();\n    },\n    showType3Text: function CanvasGraphics_showType3Text(glyphs) {\n      var ctx = this.ctx;\n      var current = this.current;\n      var font = current.font;\n      var fontSize = current.fontSize;\n      var fontDirection = current.fontDirection;\n      var spacingDir = font.vertical ? 1 : -1;\n      var charSpacing = current.charSpacing;\n      var wordSpacing = current.wordSpacing;\n      var textHScale = current.textHScale * fontDirection;\n      var fontMatrix = current.fontMatrix || _util.FONT_IDENTITY_MATRIX;\n      var glyphsLength = glyphs.length;\n      var isTextInvisible = current.textRenderingMode === _util.TextRenderingMode.INVISIBLE;\n      var i, glyph, width, spacingLength;\n      if (isTextInvisible || fontSize === 0) {\n        return;\n      }\n      this.cachedGetSinglePixelWidth = null;\n      ctx.save();\n      ctx.transform.apply(ctx, current.textMatrix);\n      ctx.translate(current.x, current.y);\n      ctx.scale(textHScale, fontDirection);\n      for (i = 0; i < glyphsLength; ++i) {\n        glyph = glyphs[i];\n        if ((0, _util.isNum)(glyph)) {\n          spacingLength = spacingDir * glyph * fontSize / 1000;\n          this.ctx.translate(spacingLength, 0);\n          current.x += spacingLength * textHScale;\n          continue;\n        }\n        var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n        var operatorList = font.charProcOperatorList[glyph.operatorListId];\n        if (!operatorList) {\n          (0, _util.warn)('Type3 character \"' + glyph.operatorListId + '\" is not available.');\n          continue;\n        }\n        this.processingType3 = glyph;\n        this.save();\n        ctx.scale(fontSize, fontSize);\n        ctx.transform.apply(ctx, fontMatrix);\n        this.executeOperatorList(operatorList);\n        this.restore();\n        var transformed = _util.Util.applyTransform([glyph.width, 0], fontMatrix);\n        width = transformed[0] * fontSize + spacing;\n        ctx.translate(width, 0);\n        current.x += width * textHScale;\n      }\n      ctx.restore();\n      this.processingType3 = null;\n    },\n    setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {},\n    setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) {\n      this.ctx.rect(llx, lly, urx - llx, ury - lly);\n      this.clip();\n      this.endPath();\n    },\n    getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) {\n      var _this = this;\n\n      var pattern;\n      if (IR[0] === 'TilingPattern') {\n        var color = IR[1];\n        var baseTransform = this.baseTransform || this.ctx.mozCurrentTransform.slice();\n        var canvasGraphicsFactory = {\n          createCanvasGraphics: function createCanvasGraphics(ctx) {\n            return new CanvasGraphics(ctx, _this.commonObjs, _this.objs, _this.canvasFactory);\n          }\n        };\n        pattern = new _pattern_helper.TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, baseTransform);\n      } else {\n        pattern = (0, _pattern_helper.getShadingPatternFromIR)(IR);\n      }\n      return pattern;\n    },\n    setStrokeColorN: function CanvasGraphics_setStrokeColorN() {\n      this.current.strokeColor = this.getColorN_Pattern(arguments);\n    },\n    setFillColorN: function CanvasGraphics_setFillColorN() {\n      this.current.fillColor = this.getColorN_Pattern(arguments);\n      this.current.patternFill = true;\n    },\n    setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {\n      var color = _util.Util.makeCssRgb(r, g, b);\n      this.ctx.strokeStyle = color;\n      this.current.strokeColor = color;\n    },\n    setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {\n      var color = _util.Util.makeCssRgb(r, g, b);\n      this.ctx.fillStyle = color;\n      this.current.fillColor = color;\n      this.current.patternFill = false;\n    },\n    shadingFill: function CanvasGraphics_shadingFill(patternIR) {\n      var ctx = this.ctx;\n      this.save();\n      var pattern = (0, _pattern_helper.getShadingPatternFromIR)(patternIR);\n      ctx.fillStyle = pattern.getPattern(ctx, this, true);\n      var inv = ctx.mozCurrentTransformInverse;\n      if (inv) {\n        var canvas = ctx.canvas;\n        var width = canvas.width;\n        var height = canvas.height;\n        var bl = _util.Util.applyTransform([0, 0], inv);\n        var br = _util.Util.applyTransform([0, height], inv);\n        var ul = _util.Util.applyTransform([width, 0], inv);\n        var ur = _util.Util.applyTransform([width, height], inv);\n        var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);\n        var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);\n        var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);\n        var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);\n        this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);\n      } else {\n        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);\n      }\n      this.restore();\n    },\n    beginInlineImage: function CanvasGraphics_beginInlineImage() {\n      throw new Error('Should not call beginInlineImage');\n    },\n    beginImageData: function CanvasGraphics_beginImageData() {\n      throw new Error('Should not call beginImageData');\n    },\n    paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix, bbox) {\n      this.save();\n      this.baseTransformStack.push(this.baseTransform);\n      if ((0, _util.isArray)(matrix) && matrix.length === 6) {\n        this.transform.apply(this, matrix);\n      }\n      this.baseTransform = this.ctx.mozCurrentTransform;\n      if ((0, _util.isArray)(bbox) && bbox.length === 4) {\n        var width = bbox[2] - bbox[0];\n        var height = bbox[3] - bbox[1];\n        this.ctx.rect(bbox[0], bbox[1], width, height);\n        this.clip();\n        this.endPath();\n      }\n    },\n    paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {\n      this.restore();\n      this.baseTransform = this.baseTransformStack.pop();\n    },\n    beginGroup: function CanvasGraphics_beginGroup(group) {\n      this.save();\n      var currentCtx = this.ctx;\n      if (!group.isolated) {\n        (0, _util.info)('TODO: Support non-isolated groups.');\n      }\n      if (group.knockout) {\n        (0, _util.warn)('Knockout groups not supported.');\n      }\n      var currentTransform = currentCtx.mozCurrentTransform;\n      if (group.matrix) {\n        currentCtx.transform.apply(currentCtx, group.matrix);\n      }\n      if (!group.bbox) {\n        throw new Error('Bounding box is required.');\n      }\n      var bounds = _util.Util.getAxialAlignedBoundingBox(group.bbox, currentCtx.mozCurrentTransform);\n      var canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height];\n      bounds = _util.Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];\n      var offsetX = Math.floor(bounds[0]);\n      var offsetY = Math.floor(bounds[1]);\n      var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);\n      var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);\n      var scaleX = 1,\n          scaleY = 1;\n      if (drawnWidth > MAX_GROUP_SIZE) {\n        scaleX = drawnWidth / MAX_GROUP_SIZE;\n        drawnWidth = MAX_GROUP_SIZE;\n      }\n      if (drawnHeight > MAX_GROUP_SIZE) {\n        scaleY = drawnHeight / MAX_GROUP_SIZE;\n        drawnHeight = MAX_GROUP_SIZE;\n      }\n      var cacheId = 'groupAt' + this.groupLevel;\n      if (group.smask) {\n        cacheId += '_smask_' + this.smaskCounter++ % 2;\n      }\n      var scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true);\n      var groupCtx = scratchCanvas.context;\n      groupCtx.scale(1 / scaleX, 1 / scaleY);\n      groupCtx.translate(-offsetX, -offsetY);\n      groupCtx.transform.apply(groupCtx, currentTransform);\n      if (group.smask) {\n        this.smaskStack.push({\n          canvas: scratchCanvas.canvas,\n          context: groupCtx,\n          offsetX: offsetX,\n          offsetY: offsetY,\n          scaleX: scaleX,\n          scaleY: scaleY,\n          subtype: group.smask.subtype,\n          backdrop: group.smask.backdrop,\n          transferMap: group.smask.transferMap || null,\n          startTransformInverse: null\n        });\n      } else {\n        currentCtx.setTransform(1, 0, 0, 1, 0, 0);\n        currentCtx.translate(offsetX, offsetY);\n        currentCtx.scale(scaleX, scaleY);\n      }\n      copyCtxState(currentCtx, groupCtx);\n      this.ctx = groupCtx;\n      this.setGState([['BM', 'source-over'], ['ca', 1], ['CA', 1]]);\n      this.groupStack.push(currentCtx);\n      this.groupLevel++;\n      this.current.activeSMask = null;\n    },\n    endGroup: function CanvasGraphics_endGroup(group) {\n      this.groupLevel--;\n      var groupCtx = this.ctx;\n      this.ctx = this.groupStack.pop();\n      if (this.ctx.imageSmoothingEnabled !== undefined) {\n        this.ctx.imageSmoothingEnabled = false;\n      } else {\n        this.ctx.mozImageSmoothingEnabled = false;\n      }\n      if (group.smask) {\n        this.tempSMask = this.smaskStack.pop();\n      } else {\n        this.ctx.drawImage(groupCtx.canvas, 0, 0);\n      }\n      this.restore();\n    },\n    beginAnnotations: function CanvasGraphics_beginAnnotations() {\n      this.save();\n      if (this.baseTransform) {\n        this.ctx.setTransform.apply(this.ctx, this.baseTransform);\n      }\n    },\n    endAnnotations: function CanvasGraphics_endAnnotations() {\n      this.restore();\n    },\n    beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform, matrix) {\n      this.save();\n      resetCtxToDefault(this.ctx);\n      this.current = new CanvasExtraState();\n      if ((0, _util.isArray)(rect) && rect.length === 4) {\n        var width = rect[2] - rect[0];\n        var height = rect[3] - rect[1];\n        this.ctx.rect(rect[0], rect[1], width, height);\n        this.clip();\n        this.endPath();\n      }\n      this.transform.apply(this, transform);\n      this.transform.apply(this, matrix);\n    },\n    endAnnotation: function CanvasGraphics_endAnnotation() {\n      this.restore();\n    },\n    paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {\n      var domImage = this.objs.get(objId);\n      if (!domImage) {\n        (0, _util.warn)('Dependent image isn\\'t ready yet');\n        return;\n      }\n      this.save();\n      var ctx = this.ctx;\n      ctx.scale(1 / w, -1 / h);\n      ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height, 0, -h, w, h);\n      if (this.imageLayer) {\n        var currentTransform = ctx.mozCurrentTransformInverse;\n        var position = this.getCanvasPosition(0, 0);\n        this.imageLayer.appendImage({\n          objId: objId,\n          left: position[0],\n          top: position[1],\n          width: w / currentTransform[0],\n          height: h / currentTransform[3]\n        });\n      }\n      this.restore();\n    },\n    paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(img) {\n      var ctx = this.ctx;\n      var width = img.width,\n          height = img.height;\n      var fillColor = this.current.fillColor;\n      var isPatternFill = this.current.patternFill;\n      var glyph = this.processingType3;\n      if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) {\n        if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) {\n          glyph.compiled = compileType3Glyph({\n            data: img.data,\n            width: width,\n            height: height\n          });\n        } else {\n          glyph.compiled = null;\n        }\n      }\n      if (glyph && glyph.compiled) {\n        glyph.compiled(ctx);\n        return;\n      }\n      var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', width, height);\n      var maskCtx = maskCanvas.context;\n      maskCtx.save();\n      putBinaryImageMask(maskCtx, img);\n      maskCtx.globalCompositeOperation = 'source-in';\n      maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor;\n      maskCtx.fillRect(0, 0, width, height);\n      maskCtx.restore();\n      this.paintInlineImageXObject(maskCanvas.canvas);\n    },\n    paintImageMaskXObjectRepeat: function CanvasGraphics_paintImageMaskXObjectRepeat(imgData, scaleX, scaleY, positions) {\n      var width = imgData.width;\n      var height = imgData.height;\n      var fillColor = this.current.fillColor;\n      var isPatternFill = this.current.patternFill;\n      var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', width, height);\n      var maskCtx = maskCanvas.context;\n      maskCtx.save();\n      putBinaryImageMask(maskCtx, imgData);\n      maskCtx.globalCompositeOperation = 'source-in';\n      maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor;\n      maskCtx.fillRect(0, 0, width, height);\n      maskCtx.restore();\n      var ctx = this.ctx;\n      for (var i = 0, ii = positions.length; i < ii; i += 2) {\n        ctx.save();\n        ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]);\n        ctx.scale(1, -1);\n        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1);\n        ctx.restore();\n      }\n    },\n    paintImageMaskXObjectGroup: function CanvasGraphics_paintImageMaskXObjectGroup(images) {\n      var ctx = this.ctx;\n      var fillColor = this.current.fillColor;\n      var isPatternFill = this.current.patternFill;\n      for (var i = 0, ii = images.length; i < ii; i++) {\n        var image = images[i];\n        var width = image.width,\n            height = image.height;\n        var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', width, height);\n        var maskCtx = maskCanvas.context;\n        maskCtx.save();\n        putBinaryImageMask(maskCtx, image);\n        maskCtx.globalCompositeOperation = 'source-in';\n        maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor;\n        maskCtx.fillRect(0, 0, width, height);\n        maskCtx.restore();\n        ctx.save();\n        ctx.transform.apply(ctx, image.transform);\n        ctx.scale(1, -1);\n        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1);\n        ctx.restore();\n      }\n    },\n    paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {\n      var imgData = this.objs.get(objId);\n      if (!imgData) {\n        (0, _util.warn)('Dependent image isn\\'t ready yet');\n        return;\n      }\n      this.paintInlineImageXObject(imgData);\n    },\n    paintImageXObjectRepeat: function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY, positions) {\n      var imgData = this.objs.get(objId);\n      if (!imgData) {\n        (0, _util.warn)('Dependent image isn\\'t ready yet');\n        return;\n      }\n      var width = imgData.width;\n      var height = imgData.height;\n      var map = [];\n      for (var i = 0, ii = positions.length; i < ii; i += 2) {\n        map.push({\n          transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]],\n          x: 0,\n          y: 0,\n          w: width,\n          h: height\n        });\n      }\n      this.paintInlineImageXObjectGroup(imgData, map);\n    },\n    paintInlineImageXObject: function CanvasGraphics_paintInlineImageXObject(imgData) {\n      var width = imgData.width;\n      var height = imgData.height;\n      var ctx = this.ctx;\n      this.save();\n      ctx.scale(1 / width, -1 / height);\n      var currentTransform = ctx.mozCurrentTransformInverse;\n      var a = currentTransform[0],\n          b = currentTransform[1];\n      var widthScale = Math.max(Math.sqrt(a * a + b * b), 1);\n      var c = currentTransform[2],\n          d = currentTransform[3];\n      var heightScale = Math.max(Math.sqrt(c * c + d * d), 1);\n      var imgToPaint, tmpCanvas;\n      if (imgData instanceof HTMLElement || !imgData.data) {\n        imgToPaint = imgData;\n      } else {\n        tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', width, height);\n        var tmpCtx = tmpCanvas.context;\n        putBinaryImageData(tmpCtx, imgData);\n        imgToPaint = tmpCanvas.canvas;\n      }\n      var paintWidth = width,\n          paintHeight = height;\n      var tmpCanvasId = 'prescale1';\n      while (widthScale > 2 && paintWidth > 1 || heightScale > 2 && paintHeight > 1) {\n        var newWidth = paintWidth,\n            newHeight = paintHeight;\n        if (widthScale > 2 && paintWidth > 1) {\n          newWidth = Math.ceil(paintWidth / 2);\n          widthScale /= paintWidth / newWidth;\n        }\n        if (heightScale > 2 && paintHeight > 1) {\n          newHeight = Math.ceil(paintHeight / 2);\n          heightScale /= paintHeight / newHeight;\n        }\n        tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight);\n        tmpCtx = tmpCanvas.context;\n        tmpCtx.clearRect(0, 0, newWidth, newHeight);\n        tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight);\n        imgToPaint = tmpCanvas.canvas;\n        paintWidth = newWidth;\n        paintHeight = newHeight;\n        tmpCanvasId = tmpCanvasId === 'prescale1' ? 'prescale2' : 'prescale1';\n      }\n      ctx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, 0, -height, width, height);\n      if (this.imageLayer) {\n        var position = this.getCanvasPosition(0, -height);\n        this.imageLayer.appendImage({\n          imgData: imgData,\n          left: position[0],\n          top: position[1],\n          width: width / currentTransform[0],\n          height: height / currentTransform[3]\n        });\n      }\n      this.restore();\n    },\n    paintInlineImageXObjectGroup: function CanvasGraphics_paintInlineImageXObjectGroup(imgData, map) {\n      var ctx = this.ctx;\n      var w = imgData.width;\n      var h = imgData.height;\n      var tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', w, h);\n      var tmpCtx = tmpCanvas.context;\n      putBinaryImageData(tmpCtx, imgData);\n      for (var i = 0, ii = map.length; i < ii; i++) {\n        var entry = map[i];\n        ctx.save();\n        ctx.transform.apply(ctx, entry.transform);\n        ctx.scale(1, -1);\n        ctx.drawImage(tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1);\n        if (this.imageLayer) {\n          var position = this.getCanvasPosition(entry.x, entry.y);\n          this.imageLayer.appendImage({\n            imgData: imgData,\n            left: position[0],\n            top: position[1],\n            width: w,\n            height: h\n          });\n        }\n        ctx.restore();\n      }\n    },\n    paintSolidColorImageMask: function CanvasGraphics_paintSolidColorImageMask() {\n      this.ctx.fillRect(0, 0, 1, 1);\n    },\n    paintXObject: function CanvasGraphics_paintXObject() {\n      (0, _util.warn)('Unsupported \\'paintXObject\\' command.');\n    },\n    markPoint: function CanvasGraphics_markPoint(tag) {},\n    markPointProps: function CanvasGraphics_markPointProps(tag, properties) {},\n    beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {},\n    beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(tag, properties) {},\n    endMarkedContent: function CanvasGraphics_endMarkedContent() {},\n    beginCompat: function CanvasGraphics_beginCompat() {},\n    endCompat: function CanvasGraphics_endCompat() {},\n    consumePath: function CanvasGraphics_consumePath() {\n      var ctx = this.ctx;\n      if (this.pendingClip) {\n        if (this.pendingClip === EO_CLIP) {\n          ctx.clip('evenodd');\n        } else {\n          ctx.clip();\n        }\n        this.pendingClip = null;\n      }\n      ctx.beginPath();\n    },\n    getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {\n      if (this.cachedGetSinglePixelWidth === null) {\n        this.ctx.save();\n        var inverse = this.ctx.mozCurrentTransformInverse;\n        this.ctx.restore();\n        this.cachedGetSinglePixelWidth = Math.sqrt(Math.max(inverse[0] * inverse[0] + inverse[1] * inverse[1], inverse[2] * inverse[2] + inverse[3] * inverse[3]));\n      }\n      return this.cachedGetSinglePixelWidth;\n    },\n    getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) {\n      var transform = this.ctx.mozCurrentTransform;\n      return [transform[0] * x + transform[2] * y + transform[4], transform[1] * x + transform[3] * y + transform[5]];\n    }\n  };\n  for (var op in _util.OPS) {\n    CanvasGraphics.prototype[_util.OPS[op]] = CanvasGraphics.prototype[op];\n  }\n  return CanvasGraphics;\n}();\nexports.CanvasGraphics = CanvasGraphics;\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.FontLoader = exports.FontFaceObject = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nfunction FontLoader(docId) {\n  this.docId = docId;\n  this.styleElement = null;\n  this.nativeFontFaces = [];\n  this.loadTestFontId = 0;\n  this.loadingContext = {\n    requests: [],\n    nextRequestId: 0\n  };\n}\nFontLoader.prototype = {\n  insertRule: function fontLoaderInsertRule(rule) {\n    var styleElement = this.styleElement;\n    if (!styleElement) {\n      styleElement = this.styleElement = document.createElement('style');\n      styleElement.id = 'PDFJS_FONT_STYLE_TAG_' + this.docId;\n      document.documentElement.getElementsByTagName('head')[0].appendChild(styleElement);\n    }\n    var styleSheet = styleElement.sheet;\n    styleSheet.insertRule(rule, styleSheet.cssRules.length);\n  },\n  clear: function fontLoaderClear() {\n    if (this.styleElement) {\n      this.styleElement.remove();\n      this.styleElement = null;\n    }\n    this.nativeFontFaces.forEach(function (nativeFontFace) {\n      document.fonts.delete(nativeFontFace);\n    });\n    this.nativeFontFaces.length = 0;\n  }\n};\n{\n  var getLoadTestFont = function getLoadTestFont() {\n    return atob('T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQ' + 'AABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwA' + 'AAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbm' + 'FtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAA' + 'AADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6A' + 'ABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAA' + 'MQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAA' + 'AAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAA' + 'AAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQ' + 'AAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMA' + 'AQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAA' + 'EAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAA' + 'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAA' + 'AAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgc' + 'A/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF' + 'hYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQA' + 'AAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAg' + 'ABAAAAAAAAAAAD6AAAAAAAAA==');\n  };\n  Object.defineProperty(FontLoader.prototype, 'loadTestFont', {\n    get: function get() {\n      return (0, _util.shadow)(this, 'loadTestFont', getLoadTestFont());\n    },\n\n    configurable: true\n  });\n  FontLoader.prototype.addNativeFontFace = function fontLoader_addNativeFontFace(nativeFontFace) {\n    this.nativeFontFaces.push(nativeFontFace);\n    document.fonts.add(nativeFontFace);\n  };\n  FontLoader.prototype.bind = function fontLoaderBind(fonts, callback) {\n    var rules = [];\n    var fontsToLoad = [];\n    var fontLoadPromises = [];\n    var getNativeFontPromise = function getNativeFontPromise(nativeFontFace) {\n      return nativeFontFace.loaded.catch(function (e) {\n        (0, _util.warn)('Failed to load font \"' + nativeFontFace.family + '\": ' + e);\n      });\n    };\n    var isFontLoadingAPISupported = FontLoader.isFontLoadingAPISupported && !FontLoader.isSyncFontLoadingSupported;\n    for (var i = 0, ii = fonts.length; i < ii; i++) {\n      var font = fonts[i];\n      if (font.attached || font.loading === false) {\n        continue;\n      }\n      font.attached = true;\n      if (isFontLoadingAPISupported) {\n        var nativeFontFace = font.createNativeFontFace();\n        if (nativeFontFace) {\n          this.addNativeFontFace(nativeFontFace);\n          fontLoadPromises.push(getNativeFontPromise(nativeFontFace));\n        }\n      } else {\n        var rule = font.createFontFaceRule();\n        if (rule) {\n          this.insertRule(rule);\n          rules.push(rule);\n          fontsToLoad.push(font);\n        }\n      }\n    }\n    var request = this.queueLoadingCallback(callback);\n    if (isFontLoadingAPISupported) {\n      Promise.all(fontLoadPromises).then(function () {\n        request.complete();\n      });\n    } else if (rules.length > 0 && !FontLoader.isSyncFontLoadingSupported) {\n      this.prepareFontLoadEvent(rules, fontsToLoad, request);\n    } else {\n      request.complete();\n    }\n  };\n  FontLoader.prototype.queueLoadingCallback = function FontLoader_queueLoadingCallback(callback) {\n    function LoadLoader_completeRequest() {\n      (0, _util.assert)(!request.end, 'completeRequest() cannot be called twice');\n      request.end = Date.now();\n      while (context.requests.length > 0 && context.requests[0].end) {\n        var otherRequest = context.requests.shift();\n        setTimeout(otherRequest.callback, 0);\n      }\n    }\n    var context = this.loadingContext;\n    var requestId = 'pdfjs-font-loading-' + context.nextRequestId++;\n    var request = {\n      id: requestId,\n      complete: LoadLoader_completeRequest,\n      callback: callback,\n      started: Date.now()\n    };\n    context.requests.push(request);\n    return request;\n  };\n  FontLoader.prototype.prepareFontLoadEvent = function fontLoaderPrepareFontLoadEvent(rules, fonts, request) {\n    function int32(data, offset) {\n      return data.charCodeAt(offset) << 24 | data.charCodeAt(offset + 1) << 16 | data.charCodeAt(offset + 2) << 8 | data.charCodeAt(offset + 3) & 0xff;\n    }\n    function spliceString(s, offset, remove, insert) {\n      var chunk1 = s.substr(0, offset);\n      var chunk2 = s.substr(offset + remove);\n      return chunk1 + insert + chunk2;\n    }\n    var i, ii;\n    var canvas = document.createElement('canvas');\n    canvas.width = 1;\n    canvas.height = 1;\n    var ctx = canvas.getContext('2d');\n    var called = 0;\n    function isFontReady(name, callback) {\n      called++;\n      if (called > 30) {\n        (0, _util.warn)('Load test font never loaded.');\n        callback();\n        return;\n      }\n      ctx.font = '30px ' + name;\n      ctx.fillText('.', 0, 20);\n      var imageData = ctx.getImageData(0, 0, 1, 1);\n      if (imageData.data[3] > 0) {\n        callback();\n        return;\n      }\n      setTimeout(isFontReady.bind(null, name, callback));\n    }\n    var loadTestFontId = 'lt' + Date.now() + this.loadTestFontId++;\n    var data = this.loadTestFont;\n    var COMMENT_OFFSET = 976;\n    data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId);\n    var CFF_CHECKSUM_OFFSET = 16;\n    var XXXX_VALUE = 0x58585858;\n    var checksum = int32(data, CFF_CHECKSUM_OFFSET);\n    for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {\n      checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0;\n    }\n    if (i < loadTestFontId.length) {\n      checksum = checksum - XXXX_VALUE + int32(loadTestFontId + 'XXX', i) | 0;\n    }\n    data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, (0, _util.string32)(checksum));\n    var url = 'url(data:font/opentype;base64,' + btoa(data) + ');';\n    var rule = '@font-face { font-family:\"' + loadTestFontId + '\";src:' + url + '}';\n    this.insertRule(rule);\n    var names = [];\n    for (i = 0, ii = fonts.length; i < ii; i++) {\n      names.push(fonts[i].loadedName);\n    }\n    names.push(loadTestFontId);\n    var div = document.createElement('div');\n    div.setAttribute('style', 'visibility: hidden;' + 'width: 10px; height: 10px;' + 'position: absolute; top: 0px; left: 0px;');\n    for (i = 0, ii = names.length; i < ii; ++i) {\n      var span = document.createElement('span');\n      span.textContent = 'Hi';\n      span.style.fontFamily = names[i];\n      div.appendChild(span);\n    }\n    document.body.appendChild(div);\n    isFontReady(loadTestFontId, function () {\n      document.body.removeChild(div);\n      request.complete();\n    });\n  };\n}\n{\n  FontLoader.isFontLoadingAPISupported = typeof document !== 'undefined' && !!document.fonts;\n}\n{\n  var isSyncFontLoadingSupported = function isSyncFontLoadingSupported() {\n    if (typeof navigator === 'undefined') {\n      return true;\n    }\n    var supported = false;\n    var m = /Mozilla\\/5.0.*?rv:(\\d+).*? Gecko/.exec(navigator.userAgent);\n    if (m && m[1] >= 14) {\n      supported = true;\n    }\n    return supported;\n  };\n  Object.defineProperty(FontLoader, 'isSyncFontLoadingSupported', {\n    get: function get() {\n      return (0, _util.shadow)(FontLoader, 'isSyncFontLoadingSupported', isSyncFontLoadingSupported());\n    },\n\n    enumerable: true,\n    configurable: true\n  });\n}\nvar IsEvalSupportedCached = {\n  get value() {\n    return (0, _util.shadow)(this, 'value', (0, _util.isEvalSupported)());\n  }\n};\nvar FontFaceObject = function FontFaceObjectClosure() {\n  function FontFaceObject(translatedData, options) {\n    this.compiledGlyphs = Object.create(null);\n    for (var i in translatedData) {\n      this[i] = translatedData[i];\n    }\n    this.options = options;\n  }\n  FontFaceObject.prototype = {\n    createNativeFontFace: function FontFaceObject_createNativeFontFace() {\n      if (!this.data) {\n        return null;\n      }\n      if (this.options.disableFontFace) {\n        this.disableFontFace = true;\n        return null;\n      }\n      var nativeFontFace = new FontFace(this.loadedName, this.data, {});\n      if (this.options.fontRegistry) {\n        this.options.fontRegistry.registerFont(this);\n      }\n      return nativeFontFace;\n    },\n    createFontFaceRule: function FontFaceObject_createFontFaceRule() {\n      if (!this.data) {\n        return null;\n      }\n      if (this.options.disableFontFace) {\n        this.disableFontFace = true;\n        return null;\n      }\n      var data = (0, _util.bytesToString)(new Uint8Array(this.data));\n      var fontName = this.loadedName;\n      var url = 'url(data:' + this.mimetype + ';base64,' + btoa(data) + ');';\n      var rule = '@font-face { font-family:\"' + fontName + '\";src:' + url + '}';\n      if (this.options.fontRegistry) {\n        this.options.fontRegistry.registerFont(this, url);\n      }\n      return rule;\n    },\n    getPathGenerator: function FontFaceObject_getPathGenerator(objs, character) {\n      if (!(character in this.compiledGlyphs)) {\n        var cmds = objs.get(this.loadedName + '_path_' + character);\n        var current, i, len;\n        if (this.options.isEvalSupported && IsEvalSupportedCached.value) {\n          var args,\n              js = '';\n          for (i = 0, len = cmds.length; i < len; i++) {\n            current = cmds[i];\n            if (current.args !== undefined) {\n              args = current.args.join(',');\n            } else {\n              args = '';\n            }\n            js += 'c.' + current.cmd + '(' + args + ');\\n';\n          }\n          this.compiledGlyphs[character] = new Function('c', 'size', js);\n        } else {\n          this.compiledGlyphs[character] = function (c, size) {\n            for (i = 0, len = cmds.length; i < len; i++) {\n              current = cmds[i];\n              if (current.cmd === 'scale') {\n                current.args = [size, -size];\n              }\n              c[current.cmd].apply(c, current.args);\n            }\n          };\n        }\n      }\n      return this.compiledGlyphs[character];\n    }\n  };\n  return FontFaceObject;\n}();\nexports.FontFaceObject = FontFaceObject;\nexports.FontLoader = FontLoader;\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.TilingPattern = exports.getShadingPatternFromIR = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _webgl = __w_pdfjs_require__(7);\n\nvar ShadingIRs = {};\nShadingIRs.RadialAxial = {\n  fromIR: function RadialAxial_fromIR(raw) {\n    var type = raw[1];\n    var colorStops = raw[2];\n    var p0 = raw[3];\n    var p1 = raw[4];\n    var r0 = raw[5];\n    var r1 = raw[6];\n    return {\n      type: 'Pattern',\n      getPattern: function RadialAxial_getPattern(ctx) {\n        var grad;\n        if (type === 'axial') {\n          grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);\n        } else if (type === 'radial') {\n          grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);\n        }\n        for (var i = 0, ii = colorStops.length; i < ii; ++i) {\n          var c = colorStops[i];\n          grad.addColorStop(c[0], c[1]);\n        }\n        return grad;\n      }\n    };\n  }\n};\nvar createMeshCanvas = function createMeshCanvasClosure() {\n  function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {\n    var coords = context.coords,\n        colors = context.colors;\n    var bytes = data.data,\n        rowSize = data.width * 4;\n    var tmp;\n    if (coords[p1 + 1] > coords[p2 + 1]) {\n      tmp = p1;\n      p1 = p2;\n      p2 = tmp;\n      tmp = c1;\n      c1 = c2;\n      c2 = tmp;\n    }\n    if (coords[p2 + 1] > coords[p3 + 1]) {\n      tmp = p2;\n      p2 = p3;\n      p3 = tmp;\n      tmp = c2;\n      c2 = c3;\n      c3 = tmp;\n    }\n    if (coords[p1 + 1] > coords[p2 + 1]) {\n      tmp = p1;\n      p1 = p2;\n      p2 = tmp;\n      tmp = c1;\n      c1 = c2;\n      c2 = tmp;\n    }\n    var x1 = (coords[p1] + context.offsetX) * context.scaleX;\n    var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;\n    var x2 = (coords[p2] + context.offsetX) * context.scaleX;\n    var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;\n    var x3 = (coords[p3] + context.offsetX) * context.scaleX;\n    var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;\n    if (y1 >= y3) {\n      return;\n    }\n    var c1r = colors[c1],\n        c1g = colors[c1 + 1],\n        c1b = colors[c1 + 2];\n    var c2r = colors[c2],\n        c2g = colors[c2 + 1],\n        c2b = colors[c2 + 2];\n    var c3r = colors[c3],\n        c3g = colors[c3 + 1],\n        c3b = colors[c3 + 2];\n    var minY = Math.round(y1),\n        maxY = Math.round(y3);\n    var xa, car, cag, cab;\n    var xb, cbr, cbg, cbb;\n    var k;\n    for (var y = minY; y <= maxY; y++) {\n      if (y < y2) {\n        k = y < y1 ? 0 : y1 === y2 ? 1 : (y1 - y) / (y1 - y2);\n        xa = x1 - (x1 - x2) * k;\n        car = c1r - (c1r - c2r) * k;\n        cag = c1g - (c1g - c2g) * k;\n        cab = c1b - (c1b - c2b) * k;\n      } else {\n        k = y > y3 ? 1 : y2 === y3 ? 0 : (y2 - y) / (y2 - y3);\n        xa = x2 - (x2 - x3) * k;\n        car = c2r - (c2r - c3r) * k;\n        cag = c2g - (c2g - c3g) * k;\n        cab = c2b - (c2b - c3b) * k;\n      }\n      k = y < y1 ? 0 : y > y3 ? 1 : (y1 - y) / (y1 - y3);\n      xb = x1 - (x1 - x3) * k;\n      cbr = c1r - (c1r - c3r) * k;\n      cbg = c1g - (c1g - c3g) * k;\n      cbb = c1b - (c1b - c3b) * k;\n      var x1_ = Math.round(Math.min(xa, xb));\n      var x2_ = Math.round(Math.max(xa, xb));\n      var j = rowSize * y + x1_ * 4;\n      for (var x = x1_; x <= x2_; x++) {\n        k = (xa - x) / (xa - xb);\n        k = k < 0 ? 0 : k > 1 ? 1 : k;\n        bytes[j++] = car - (car - cbr) * k | 0;\n        bytes[j++] = cag - (cag - cbg) * k | 0;\n        bytes[j++] = cab - (cab - cbb) * k | 0;\n        bytes[j++] = 255;\n      }\n    }\n  }\n  function drawFigure(data, figure, context) {\n    var ps = figure.coords;\n    var cs = figure.colors;\n    var i, ii;\n    switch (figure.type) {\n      case 'lattice':\n        var verticesPerRow = figure.verticesPerRow;\n        var rows = Math.floor(ps.length / verticesPerRow) - 1;\n        var cols = verticesPerRow - 1;\n        for (i = 0; i < rows; i++) {\n          var q = i * verticesPerRow;\n          for (var j = 0; j < cols; j++, q++) {\n            drawTriangle(data, context, ps[q], ps[q + 1], ps[q + verticesPerRow], cs[q], cs[q + 1], cs[q + verticesPerRow]);\n            drawTriangle(data, context, ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]);\n          }\n        }\n        break;\n      case 'triangles':\n        for (i = 0, ii = ps.length; i < ii; i += 3) {\n          drawTriangle(data, context, ps[i], ps[i + 1], ps[i + 2], cs[i], cs[i + 1], cs[i + 2]);\n        }\n        break;\n      default:\n        throw new Error('illegal figure');\n    }\n  }\n  function createMeshCanvas(bounds, combinesScale, coords, colors, figures, backgroundColor, cachedCanvases) {\n    var EXPECTED_SCALE = 1.1;\n    var MAX_PATTERN_SIZE = 3000;\n    var BORDER_SIZE = 2;\n    var offsetX = Math.floor(bounds[0]);\n    var offsetY = Math.floor(bounds[1]);\n    var boundsWidth = Math.ceil(bounds[2]) - offsetX;\n    var boundsHeight = Math.ceil(bounds[3]) - offsetY;\n    var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE);\n    var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE);\n    var scaleX = boundsWidth / width;\n    var scaleY = boundsHeight / height;\n    var context = {\n      coords: coords,\n      colors: colors,\n      offsetX: -offsetX,\n      offsetY: -offsetY,\n      scaleX: 1 / scaleX,\n      scaleY: 1 / scaleY\n    };\n    var paddedWidth = width + BORDER_SIZE * 2;\n    var paddedHeight = height + BORDER_SIZE * 2;\n    var canvas, tmpCanvas, i, ii;\n    if (_webgl.WebGLUtils.isEnabled) {\n      canvas = _webgl.WebGLUtils.drawFigures(width, height, backgroundColor, figures, context);\n      tmpCanvas = cachedCanvases.getCanvas('mesh', paddedWidth, paddedHeight, false);\n      tmpCanvas.context.drawImage(canvas, BORDER_SIZE, BORDER_SIZE);\n      canvas = tmpCanvas.canvas;\n    } else {\n      tmpCanvas = cachedCanvases.getCanvas('mesh', paddedWidth, paddedHeight, false);\n      var tmpCtx = tmpCanvas.context;\n      var data = tmpCtx.createImageData(width, height);\n      if (backgroundColor) {\n        var bytes = data.data;\n        for (i = 0, ii = bytes.length; i < ii; i += 4) {\n          bytes[i] = backgroundColor[0];\n          bytes[i + 1] = backgroundColor[1];\n          bytes[i + 2] = backgroundColor[2];\n          bytes[i + 3] = 255;\n        }\n      }\n      for (i = 0; i < figures.length; i++) {\n        drawFigure(data, figures[i], context);\n      }\n      tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE);\n      canvas = tmpCanvas.canvas;\n    }\n    return {\n      canvas: canvas,\n      offsetX: offsetX - BORDER_SIZE * scaleX,\n      offsetY: offsetY - BORDER_SIZE * scaleY,\n      scaleX: scaleX,\n      scaleY: scaleY\n    };\n  }\n  return createMeshCanvas;\n}();\nShadingIRs.Mesh = {\n  fromIR: function Mesh_fromIR(raw) {\n    var coords = raw[2];\n    var colors = raw[3];\n    var figures = raw[4];\n    var bounds = raw[5];\n    var matrix = raw[6];\n    var background = raw[8];\n    return {\n      type: 'Pattern',\n      getPattern: function Mesh_getPattern(ctx, owner, shadingFill) {\n        var scale;\n        if (shadingFill) {\n          scale = _util.Util.singularValueDecompose2dScale(ctx.mozCurrentTransform);\n        } else {\n          scale = _util.Util.singularValueDecompose2dScale(owner.baseTransform);\n          if (matrix) {\n            var matrixScale = _util.Util.singularValueDecompose2dScale(matrix);\n            scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]];\n          }\n        }\n        var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords, colors, figures, shadingFill ? null : background, owner.cachedCanvases);\n        if (!shadingFill) {\n          ctx.setTransform.apply(ctx, owner.baseTransform);\n          if (matrix) {\n            ctx.transform.apply(ctx, matrix);\n          }\n        }\n        ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY);\n        ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY);\n        return ctx.createPattern(temporaryPatternCanvas.canvas, 'no-repeat');\n      }\n    };\n  }\n};\nShadingIRs.Dummy = {\n  fromIR: function Dummy_fromIR() {\n    return {\n      type: 'Pattern',\n      getPattern: function Dummy_fromIR_getPattern() {\n        return 'hotpink';\n      }\n    };\n  }\n};\nfunction getShadingPatternFromIR(raw) {\n  var shadingIR = ShadingIRs[raw[0]];\n  if (!shadingIR) {\n    throw new Error('Unknown IR type: ' + raw[0]);\n  }\n  return shadingIR.fromIR(raw);\n}\nvar TilingPattern = function TilingPatternClosure() {\n  var PaintType = {\n    COLORED: 1,\n    UNCOLORED: 2\n  };\n  var MAX_PATTERN_SIZE = 3000;\n  function TilingPattern(IR, color, ctx, canvasGraphicsFactory, baseTransform) {\n    this.operatorList = IR[2];\n    this.matrix = IR[3] || [1, 0, 0, 1, 0, 0];\n    this.bbox = IR[4];\n    this.xstep = IR[5];\n    this.ystep = IR[6];\n    this.paintType = IR[7];\n    this.tilingType = IR[8];\n    this.color = color;\n    this.canvasGraphicsFactory = canvasGraphicsFactory;\n    this.baseTransform = baseTransform;\n    this.type = 'Pattern';\n    this.ctx = ctx;\n  }\n  TilingPattern.prototype = {\n    createPatternCanvas: function TilinPattern_createPatternCanvas(owner) {\n      var operatorList = this.operatorList;\n      var bbox = this.bbox;\n      var xstep = this.xstep;\n      var ystep = this.ystep;\n      var paintType = this.paintType;\n      var tilingType = this.tilingType;\n      var color = this.color;\n      var canvasGraphicsFactory = this.canvasGraphicsFactory;\n      (0, _util.info)('TilingType: ' + tilingType);\n      var x0 = bbox[0],\n          y0 = bbox[1],\n          x1 = bbox[2],\n          y1 = bbox[3];\n      var topLeft = [x0, y0];\n      var botRight = [x0 + xstep, y0 + ystep];\n      var width = botRight[0] - topLeft[0];\n      var height = botRight[1] - topLeft[1];\n      var matrixScale = _util.Util.singularValueDecompose2dScale(this.matrix);\n      var curMatrixScale = _util.Util.singularValueDecompose2dScale(this.baseTransform);\n      var combinedScale = [matrixScale[0] * curMatrixScale[0], matrixScale[1] * curMatrixScale[1]];\n      width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])), MAX_PATTERN_SIZE);\n      height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])), MAX_PATTERN_SIZE);\n      var tmpCanvas = owner.cachedCanvases.getCanvas('pattern', width, height, true);\n      var tmpCtx = tmpCanvas.context;\n      var graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx);\n      graphics.groupLevel = owner.groupLevel;\n      this.setFillAndStrokeStyleToContext(tmpCtx, paintType, color);\n      this.setScale(width, height, xstep, ystep);\n      this.transformToScale(graphics);\n      var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];\n      graphics.transform.apply(graphics, tmpTranslate);\n      this.clipBbox(graphics, bbox, x0, y0, x1, y1);\n      graphics.executeOperatorList(operatorList);\n      return tmpCanvas.canvas;\n    },\n    setScale: function TilingPattern_setScale(width, height, xstep, ystep) {\n      this.scale = [width / xstep, height / ystep];\n    },\n    transformToScale: function TilingPattern_transformToScale(graphics) {\n      var scale = this.scale;\n      var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];\n      graphics.transform.apply(graphics, tmpScale);\n    },\n    scaleToContext: function TilingPattern_scaleToContext() {\n      var scale = this.scale;\n      this.ctx.scale(1 / scale[0], 1 / scale[1]);\n    },\n    clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) {\n      if ((0, _util.isArray)(bbox) && bbox.length === 4) {\n        var bboxWidth = x1 - x0;\n        var bboxHeight = y1 - y0;\n        graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);\n        graphics.clip();\n        graphics.endPath();\n      }\n    },\n    setFillAndStrokeStyleToContext: function setFillAndStrokeStyleToContext(context, paintType, color) {\n      switch (paintType) {\n        case PaintType.COLORED:\n          var ctx = this.ctx;\n          context.fillStyle = ctx.fillStyle;\n          context.strokeStyle = ctx.strokeStyle;\n          break;\n        case PaintType.UNCOLORED:\n          var cssColor = _util.Util.makeCssRgb(color[0], color[1], color[2]);\n          context.fillStyle = cssColor;\n          context.strokeStyle = cssColor;\n          break;\n        default:\n          throw new _util.FormatError('Unsupported paint type: ' + paintType);\n      }\n    },\n    getPattern: function TilingPattern_getPattern(ctx, owner) {\n      var temporaryPatternCanvas = this.createPatternCanvas(owner);\n      ctx = this.ctx;\n      ctx.setTransform.apply(ctx, this.baseTransform);\n      ctx.transform.apply(ctx, this.matrix);\n      this.scaleToContext();\n      return ctx.createPattern(temporaryPatternCanvas, 'repeat');\n    }\n  };\n  return TilingPattern;\n}();\nexports.getShadingPatternFromIR = getShadingPatternFromIR;\nexports.TilingPattern = TilingPattern;\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PDFDataTransportStream = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar PDFDataTransportStream = function PDFDataTransportStreamClosure() {\n  function PDFDataTransportStream(params, pdfDataRangeTransport) {\n    var _this = this;\n\n    (0, _util.assert)(pdfDataRangeTransport);\n    this._queuedChunks = [];\n    var initialData = params.initialData;\n    if (initialData && initialData.length > 0) {\n      var buffer = new Uint8Array(initialData).buffer;\n      this._queuedChunks.push(buffer);\n    }\n    this._pdfDataRangeTransport = pdfDataRangeTransport;\n    this._isRangeSupported = !params.disableRange;\n    this._isStreamingSupported = !params.disableStream;\n    this._contentLength = params.length;\n    this._fullRequestReader = null;\n    this._rangeReaders = [];\n    this._pdfDataRangeTransport.addRangeListener(function (begin, chunk) {\n      _this._onReceiveData({\n        begin: begin,\n        chunk: chunk\n      });\n    });\n    this._pdfDataRangeTransport.addProgressListener(function (loaded) {\n      _this._onProgress({ loaded: loaded });\n    });\n    this._pdfDataRangeTransport.addProgressiveReadListener(function (chunk) {\n      _this._onReceiveData({ chunk: chunk });\n    });\n    this._pdfDataRangeTransport.transportReady();\n  }\n  PDFDataTransportStream.prototype = {\n    _onReceiveData: function PDFDataTransportStream_onReceiveData(args) {\n      var buffer = new Uint8Array(args.chunk).buffer;\n      if (args.begin === undefined) {\n        if (this._fullRequestReader) {\n          this._fullRequestReader._enqueue(buffer);\n        } else {\n          this._queuedChunks.push(buffer);\n        }\n      } else {\n        var found = this._rangeReaders.some(function (rangeReader) {\n          if (rangeReader._begin !== args.begin) {\n            return false;\n          }\n          rangeReader._enqueue(buffer);\n          return true;\n        });\n        (0, _util.assert)(found);\n      }\n    },\n    _onProgress: function PDFDataTransportStream_onDataProgress(evt) {\n      if (this._rangeReaders.length > 0) {\n        var firstReader = this._rangeReaders[0];\n        if (firstReader.onProgress) {\n          firstReader.onProgress({ loaded: evt.loaded });\n        }\n      }\n    },\n    _removeRangeReader: function PDFDataTransportStream_removeRangeReader(reader) {\n      var i = this._rangeReaders.indexOf(reader);\n      if (i >= 0) {\n        this._rangeReaders.splice(i, 1);\n      }\n    },\n    getFullReader: function PDFDataTransportStream_getFullReader() {\n      (0, _util.assert)(!this._fullRequestReader);\n      var queuedChunks = this._queuedChunks;\n      this._queuedChunks = null;\n      return new PDFDataTransportStreamReader(this, queuedChunks);\n    },\n    getRangeReader: function PDFDataTransportStream_getRangeReader(begin, end) {\n      var reader = new PDFDataTransportStreamRangeReader(this, begin, end);\n      this._pdfDataRangeTransport.requestDataRange(begin, end);\n      this._rangeReaders.push(reader);\n      return reader;\n    },\n    cancelAllRequests: function PDFDataTransportStream_cancelAllRequests(reason) {\n      if (this._fullRequestReader) {\n        this._fullRequestReader.cancel(reason);\n      }\n      var readers = this._rangeReaders.slice(0);\n      readers.forEach(function (rangeReader) {\n        rangeReader.cancel(reason);\n      });\n      this._pdfDataRangeTransport.abort();\n    }\n  };\n  function PDFDataTransportStreamReader(stream, queuedChunks) {\n    this._stream = stream;\n    this._done = false;\n    this._queuedChunks = queuedChunks || [];\n    this._requests = [];\n    this._headersReady = Promise.resolve();\n    stream._fullRequestReader = this;\n    this.onProgress = null;\n  }\n  PDFDataTransportStreamReader.prototype = {\n    _enqueue: function PDFDataTransportStreamReader_enqueue(chunk) {\n      if (this._done) {\n        return;\n      }\n      if (this._requests.length > 0) {\n        var requestCapability = this._requests.shift();\n        requestCapability.resolve({\n          value: chunk,\n          done: false\n        });\n        return;\n      }\n      this._queuedChunks.push(chunk);\n    },\n    get headersReady() {\n      return this._headersReady;\n    },\n    get isRangeSupported() {\n      return this._stream._isRangeSupported;\n    },\n    get isStreamingSupported() {\n      return this._stream._isStreamingSupported;\n    },\n    get contentLength() {\n      return this._stream._contentLength;\n    },\n    read: function PDFDataTransportStreamReader_read() {\n      if (this._queuedChunks.length > 0) {\n        var chunk = this._queuedChunks.shift();\n        return Promise.resolve({\n          value: chunk,\n          done: false\n        });\n      }\n      if (this._done) {\n        return Promise.resolve({\n          value: undefined,\n          done: true\n        });\n      }\n      var requestCapability = (0, _util.createPromiseCapability)();\n      this._requests.push(requestCapability);\n      return requestCapability.promise;\n    },\n    cancel: function PDFDataTransportStreamReader_cancel(reason) {\n      this._done = true;\n      this._requests.forEach(function (requestCapability) {\n        requestCapability.resolve({\n          value: undefined,\n          done: true\n        });\n      });\n      this._requests = [];\n    }\n  };\n  function PDFDataTransportStreamRangeReader(stream, begin, end) {\n    this._stream = stream;\n    this._begin = begin;\n    this._end = end;\n    this._queuedChunk = null;\n    this._requests = [];\n    this._done = false;\n    this.onProgress = null;\n  }\n  PDFDataTransportStreamRangeReader.prototype = {\n    _enqueue: function PDFDataTransportStreamRangeReader_enqueue(chunk) {\n      if (this._done) {\n        return;\n      }\n      if (this._requests.length === 0) {\n        this._queuedChunk = chunk;\n      } else {\n        var requestsCapability = this._requests.shift();\n        requestsCapability.resolve({\n          value: chunk,\n          done: false\n        });\n        this._requests.forEach(function (requestCapability) {\n          requestCapability.resolve({\n            value: undefined,\n            done: true\n          });\n        });\n        this._requests = [];\n      }\n      this._done = true;\n      this._stream._removeRangeReader(this);\n    },\n    get isStreamingSupported() {\n      return false;\n    },\n    read: function PDFDataTransportStreamRangeReader_read() {\n      if (this._queuedChunk) {\n        var chunk = this._queuedChunk;\n        this._queuedChunk = null;\n        return Promise.resolve({\n          value: chunk,\n          done: false\n        });\n      }\n      if (this._done) {\n        return Promise.resolve({\n          value: undefined,\n          done: true\n        });\n      }\n      var requestCapability = (0, _util.createPromiseCapability)();\n      this._requests.push(requestCapability);\n      return requestCapability.promise;\n    },\n    cancel: function PDFDataTransportStreamRangeReader_cancel(reason) {\n      this._done = true;\n      this._requests.forEach(function (requestCapability) {\n        requestCapability.resolve({\n          value: undefined,\n          done: true\n        });\n      });\n      this._requests = [];\n      this._stream._removeRangeReader(this);\n    }\n  };\n  return PDFDataTransportStream;\n}();\nexports.PDFDataTransportStream = PDFDataTransportStream;\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar pdfjsVersion = '1.9.426';\nvar pdfjsBuild = '2558a58d';\nvar pdfjsSharedUtil = __w_pdfjs_require__(0);\nvar pdfjsDisplayGlobal = __w_pdfjs_require__(8);\nvar pdfjsDisplayAPI = __w_pdfjs_require__(2);\nvar pdfjsDisplayTextLayer = __w_pdfjs_require__(5);\nvar pdfjsDisplayAnnotationLayer = __w_pdfjs_require__(3);\nvar pdfjsDisplayDOMUtils = __w_pdfjs_require__(1);\nvar pdfjsDisplaySVG = __w_pdfjs_require__(4);\n{\n  __w_pdfjs_require__(9);\n}\nexports.PDFJS = pdfjsDisplayGlobal.PDFJS;\nexports.build = pdfjsDisplayAPI.build;\nexports.version = pdfjsDisplayAPI.version;\nexports.getDocument = pdfjsDisplayAPI.getDocument;\nexports.LoopbackPort = pdfjsDisplayAPI.LoopbackPort;\nexports.PDFDataRangeTransport = pdfjsDisplayAPI.PDFDataRangeTransport;\nexports.PDFWorker = pdfjsDisplayAPI.PDFWorker;\nexports.renderTextLayer = pdfjsDisplayTextLayer.renderTextLayer;\nexports.AnnotationLayer = pdfjsDisplayAnnotationLayer.AnnotationLayer;\nexports.CustomStyle = pdfjsDisplayDOMUtils.CustomStyle;\nexports.createPromiseCapability = pdfjsSharedUtil.createPromiseCapability;\nexports.PasswordResponses = pdfjsSharedUtil.PasswordResponses;\nexports.InvalidPDFException = pdfjsSharedUtil.InvalidPDFException;\nexports.MissingPDFException = pdfjsSharedUtil.MissingPDFException;\nexports.SVGGraphics = pdfjsDisplaySVG.SVGGraphics;\nexports.NativeImageDecoding = pdfjsSharedUtil.NativeImageDecoding;\nexports.UnexpectedResponseException = pdfjsSharedUtil.UnexpectedResponseException;\nexports.OPS = pdfjsSharedUtil.OPS;\nexports.UNSUPPORTED_FEATURES = pdfjsSharedUtil.UNSUPPORTED_FEATURES;\nexports.isValidUrl = pdfjsDisplayDOMUtils.isValidUrl;\nexports.createValidAbsoluteUrl = pdfjsSharedUtil.createValidAbsoluteUrl;\nexports.createObjectURL = pdfjsSharedUtil.createObjectURL;\nexports.removeNullCharacters = pdfjsSharedUtil.removeNullCharacters;\nexports.shadow = pdfjsSharedUtil.shadow;\nexports.createBlob = pdfjsSharedUtil.createBlob;\nexports.RenderingCancelledException = pdfjsDisplayDOMUtils.RenderingCancelledException;\nexports.getFilenameFromUrl = pdfjsDisplayDOMUtils.getFilenameFromUrl;\nexports.addLinkAttributes = pdfjsDisplayDOMUtils.addLinkAttributes;\nexports.StatTimer = pdfjsSharedUtil.StatTimer;\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nif (typeof PDFJS === 'undefined' || !PDFJS.compatibilityChecked) {\n  var globalScope = typeof window !== 'undefined' && window.Math === Math ? window : typeof global !== 'undefined' && global.Math === Math ? global : typeof self !== 'undefined' && self.Math === Math ? self :  false ? undefined : {};\n  var userAgent = typeof navigator !== 'undefined' && navigator.userAgent || '';\n  var isAndroid = /Android/.test(userAgent);\n  var isAndroidPre3 = /Android\\s[0-2][^\\d]/.test(userAgent);\n  var isAndroidPre5 = /Android\\s[0-4][^\\d]/.test(userAgent);\n  var isChrome = userAgent.indexOf('Chrom') >= 0;\n  var isChromeWithRangeBug = /Chrome\\/(39|40)\\./.test(userAgent);\n  var isIOSChrome = userAgent.indexOf('CriOS') >= 0;\n  var isIE = userAgent.indexOf('Trident') >= 0;\n  var isIOS = /\\b(iPad|iPhone|iPod)(?=;)/.test(userAgent);\n  var isOpera = userAgent.indexOf('Opera') >= 0;\n  var isSafari = /Safari\\//.test(userAgent) && !/(Chrome\\/|Android\\s)/.test(userAgent);\n  var hasDOM = (typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && (typeof document === 'undefined' ? 'undefined' : _typeof(document)) === 'object';\n  if (typeof PDFJS === 'undefined') {\n    globalScope.PDFJS = {};\n  }\n  PDFJS.compatibilityChecked = true;\n  (function checkTypedArrayCompatibility() {\n    if (typeof Uint8Array !== 'undefined') {\n      if (typeof Uint8Array.prototype.subarray === 'undefined') {\n        Uint8Array.prototype.subarray = function subarray(start, end) {\n          return new Uint8Array(this.slice(start, end));\n        };\n        Float32Array.prototype.subarray = function subarray(start, end) {\n          return new Float32Array(this.slice(start, end));\n        };\n      }\n      if (typeof Float64Array === 'undefined') {\n        globalScope.Float64Array = Float32Array;\n      }\n      return;\n    }\n    function subarray(start, end) {\n      return new TypedArray(this.slice(start, end));\n    }\n    function setArrayOffset(array, offset) {\n      if (arguments.length < 2) {\n        offset = 0;\n      }\n      for (var i = 0, n = array.length; i < n; ++i, ++offset) {\n        this[offset] = array[i] & 0xFF;\n      }\n    }\n    function Uint32ArrayView(buffer, length) {\n      this.buffer = buffer;\n      this.byteLength = buffer.length;\n      this.length = length;\n      ensureUint32ArrayViewProps(this.length);\n    }\n    Uint32ArrayView.prototype = Object.create(null);\n    var uint32ArrayViewSetters = 0;\n    function createUint32ArrayProp(index) {\n      return {\n        get: function get() {\n          var buffer = this.buffer,\n              offset = index << 2;\n          return (buffer[offset] | buffer[offset + 1] << 8 | buffer[offset + 2] << 16 | buffer[offset + 3] << 24) >>> 0;\n        },\n        set: function set(value) {\n          var buffer = this.buffer,\n              offset = index << 2;\n          buffer[offset] = value & 255;\n          buffer[offset + 1] = value >> 8 & 255;\n          buffer[offset + 2] = value >> 16 & 255;\n          buffer[offset + 3] = value >>> 24 & 255;\n        }\n      };\n    }\n    function ensureUint32ArrayViewProps(length) {\n      while (uint32ArrayViewSetters < length) {\n        Object.defineProperty(Uint32ArrayView.prototype, uint32ArrayViewSetters, createUint32ArrayProp(uint32ArrayViewSetters));\n        uint32ArrayViewSetters++;\n      }\n    }\n    function TypedArray(arg1) {\n      var result, i, n;\n      if (typeof arg1 === 'number') {\n        result = [];\n        for (i = 0; i < arg1; ++i) {\n          result[i] = 0;\n        }\n      } else if ('slice' in arg1) {\n        result = arg1.slice(0);\n      } else {\n        result = [];\n        for (i = 0, n = arg1.length; i < n; ++i) {\n          result[i] = arg1[i];\n        }\n      }\n      result.subarray = subarray;\n      result.buffer = result;\n      result.byteLength = result.length;\n      result.set = setArrayOffset;\n      if ((typeof arg1 === 'undefined' ? 'undefined' : _typeof(arg1)) === 'object' && arg1.buffer) {\n        result.buffer = arg1.buffer;\n      }\n      return result;\n    }\n    globalScope.Uint8Array = TypedArray;\n    globalScope.Int8Array = TypedArray;\n    globalScope.Int32Array = TypedArray;\n    globalScope.Uint16Array = TypedArray;\n    globalScope.Float32Array = TypedArray;\n    globalScope.Float64Array = TypedArray;\n    globalScope.Uint32Array = function () {\n      if (arguments.length === 3) {\n        if (arguments[1] !== 0) {\n          throw new Error('offset !== 0 is not supported');\n        }\n        return new Uint32ArrayView(arguments[0], arguments[2]);\n      }\n      return TypedArray.apply(this, arguments);\n    };\n  })();\n  (function canvasPixelArrayBuffer() {\n    if (!hasDOM || !window.CanvasPixelArray) {\n      return;\n    }\n    var cpaProto = window.CanvasPixelArray.prototype;\n    if ('buffer' in cpaProto) {\n      return;\n    }\n    Object.defineProperty(cpaProto, 'buffer', {\n      get: function get() {\n        return this;\n      },\n\n      enumerable: false,\n      configurable: true\n    });\n    Object.defineProperty(cpaProto, 'byteLength', {\n      get: function get() {\n        return this.length;\n      },\n\n      enumerable: false,\n      configurable: true\n    });\n  })();\n  (function normalizeURLObject() {\n    if (!globalScope.URL) {\n      globalScope.URL = globalScope.webkitURL;\n    }\n  })();\n  (function checkObjectDefinePropertyCompatibility() {\n    if (typeof Object.defineProperty !== 'undefined') {\n      var definePropertyPossible = true;\n      try {\n        if (hasDOM) {\n          Object.defineProperty(new Image(), 'id', { value: 'test' });\n        }\n        var Test = function Test() {};\n        Test.prototype = {\n          get id() {}\n        };\n        Object.defineProperty(new Test(), 'id', {\n          value: '',\n          configurable: true,\n          enumerable: true,\n          writable: false\n        });\n      } catch (e) {\n        definePropertyPossible = false;\n      }\n      if (definePropertyPossible) {\n        return;\n      }\n    }\n    Object.defineProperty = function objectDefineProperty(obj, name, def) {\n      delete obj[name];\n      if ('get' in def) {\n        obj.__defineGetter__(name, def['get']);\n      }\n      if ('set' in def) {\n        obj.__defineSetter__(name, def['set']);\n      }\n      if ('value' in def) {\n        obj.__defineSetter__(name, function objectDefinePropertySetter(value) {\n          this.__defineGetter__(name, function objectDefinePropertyGetter() {\n            return value;\n          });\n          return value;\n        });\n        obj[name] = def.value;\n      }\n    };\n  })();\n  (function checkXMLHttpRequestResponseCompatibility() {\n    if (typeof XMLHttpRequest === 'undefined') {\n      return;\n    }\n    var xhrPrototype = XMLHttpRequest.prototype;\n    var xhr = new XMLHttpRequest();\n    if (!('overrideMimeType' in xhr)) {\n      Object.defineProperty(xhrPrototype, 'overrideMimeType', {\n        value: function xmlHttpRequestOverrideMimeType(mimeType) {}\n      });\n    }\n    if ('responseType' in xhr) {\n      return;\n    }\n    Object.defineProperty(xhrPrototype, 'responseType', {\n      get: function xmlHttpRequestGetResponseType() {\n        return this._responseType || 'text';\n      },\n      set: function xmlHttpRequestSetResponseType(value) {\n        if (value === 'text' || value === 'arraybuffer') {\n          this._responseType = value;\n          if (value === 'arraybuffer' && typeof this.overrideMimeType === 'function') {\n            this.overrideMimeType('text/plain; charset=x-user-defined');\n          }\n        }\n      }\n    });\n    if (typeof VBArray !== 'undefined') {\n      Object.defineProperty(xhrPrototype, 'response', {\n        get: function xmlHttpRequestResponseGet() {\n          if (this.responseType === 'arraybuffer') {\n            return new Uint8Array(new VBArray(this.responseBody).toArray());\n          }\n          return this.responseText;\n        }\n      });\n      return;\n    }\n    Object.defineProperty(xhrPrototype, 'response', {\n      get: function xmlHttpRequestResponseGet() {\n        if (this.responseType !== 'arraybuffer') {\n          return this.responseText;\n        }\n        var text = this.responseText;\n        var i,\n            n = text.length;\n        var result = new Uint8Array(n);\n        for (i = 0; i < n; ++i) {\n          result[i] = text.charCodeAt(i) & 0xFF;\n        }\n        return result.buffer;\n      }\n    });\n  })();\n  (function checkWindowBtoaCompatibility() {\n    if ('btoa' in globalScope) {\n      return;\n    }\n    var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n    globalScope.btoa = function (chars) {\n      var buffer = '';\n      var i, n;\n      for (i = 0, n = chars.length; i < n; i += 3) {\n        var b1 = chars.charCodeAt(i) & 0xFF;\n        var b2 = chars.charCodeAt(i + 1) & 0xFF;\n        var b3 = chars.charCodeAt(i + 2) & 0xFF;\n        var d1 = b1 >> 2,\n            d2 = (b1 & 3) << 4 | b2 >> 4;\n        var d3 = i + 1 < n ? (b2 & 0xF) << 2 | b3 >> 6 : 64;\n        var d4 = i + 2 < n ? b3 & 0x3F : 64;\n        buffer += digits.charAt(d1) + digits.charAt(d2) + digits.charAt(d3) + digits.charAt(d4);\n      }\n      return buffer;\n    };\n  })();\n  (function checkWindowAtobCompatibility() {\n    if ('atob' in globalScope) {\n      return;\n    }\n    var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n    globalScope.atob = function (input) {\n      input = input.replace(/=+$/, '');\n      if (input.length % 4 === 1) {\n        throw new Error('bad atob input');\n      }\n      for (var bc = 0, bs, buffer, idx = 0, output = ''; buffer = input.charAt(idx++); ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) {\n        buffer = digits.indexOf(buffer);\n      }\n      return output;\n    };\n  })();\n  (function checkFunctionPrototypeBindCompatibility() {\n    if (typeof Function.prototype.bind !== 'undefined') {\n      return;\n    }\n    Function.prototype.bind = function functionPrototypeBind(obj) {\n      var fn = this,\n          headArgs = Array.prototype.slice.call(arguments, 1);\n      var bound = function functionPrototypeBindBound() {\n        var args = headArgs.concat(Array.prototype.slice.call(arguments));\n        return fn.apply(obj, args);\n      };\n      return bound;\n    };\n  })();\n  (function checkDatasetProperty() {\n    if (!hasDOM) {\n      return;\n    }\n    var div = document.createElement('div');\n    if ('dataset' in div) {\n      return;\n    }\n    Object.defineProperty(HTMLElement.prototype, 'dataset', {\n      get: function get() {\n        if (this._dataset) {\n          return this._dataset;\n        }\n        var dataset = {};\n        for (var j = 0, jj = this.attributes.length; j < jj; j++) {\n          var attribute = this.attributes[j];\n          if (attribute.name.substring(0, 5) !== 'data-') {\n            continue;\n          }\n          var key = attribute.name.substring(5).replace(/\\-([a-z])/g, function (all, ch) {\n            return ch.toUpperCase();\n          });\n          dataset[key] = attribute.value;\n        }\n        Object.defineProperty(this, '_dataset', {\n          value: dataset,\n          writable: false,\n          enumerable: false\n        });\n        return dataset;\n      },\n\n      enumerable: true\n    });\n  })();\n  (function checkClassListProperty() {\n    function changeList(element, itemName, add, remove) {\n      var s = element.className || '';\n      var list = s.split(/\\s+/g);\n      if (list[0] === '') {\n        list.shift();\n      }\n      var index = list.indexOf(itemName);\n      if (index < 0 && add) {\n        list.push(itemName);\n      }\n      if (index >= 0 && remove) {\n        list.splice(index, 1);\n      }\n      element.className = list.join(' ');\n      return index >= 0;\n    }\n    if (!hasDOM) {\n      return;\n    }\n    var div = document.createElement('div');\n    if ('classList' in div) {\n      return;\n    }\n    var classListPrototype = {\n      add: function add(name) {\n        changeList(this.element, name, true, false);\n      },\n      contains: function contains(name) {\n        return changeList(this.element, name, false, false);\n      },\n      remove: function remove(name) {\n        changeList(this.element, name, false, true);\n      },\n      toggle: function toggle(name) {\n        changeList(this.element, name, true, true);\n      }\n    };\n    Object.defineProperty(HTMLElement.prototype, 'classList', {\n      get: function get() {\n        if (this._classList) {\n          return this._classList;\n        }\n        var classList = Object.create(classListPrototype, {\n          element: {\n            value: this,\n            writable: false,\n            enumerable: true\n          }\n        });\n        Object.defineProperty(this, '_classList', {\n          value: classList,\n          writable: false,\n          enumerable: false\n        });\n        return classList;\n      },\n\n      enumerable: true\n    });\n  })();\n  (function checkWorkerConsoleCompatibility() {\n    if (typeof importScripts === 'undefined' || 'console' in globalScope) {\n      return;\n    }\n    var consoleTimer = {};\n    var workerConsole = {\n      log: function log() {\n        var args = Array.prototype.slice.call(arguments);\n        globalScope.postMessage({\n          targetName: 'main',\n          action: 'console_log',\n          data: args\n        });\n      },\n      error: function error() {\n        var args = Array.prototype.slice.call(arguments);\n        globalScope.postMessage({\n          targetName: 'main',\n          action: 'console_error',\n          data: args\n        });\n      },\n      time: function time(name) {\n        consoleTimer[name] = Date.now();\n      },\n      timeEnd: function timeEnd(name) {\n        var time = consoleTimer[name];\n        if (!time) {\n          throw new Error('Unknown timer name ' + name);\n        }\n        this.log('Timer:', name, Date.now() - time);\n      }\n    };\n    globalScope.console = workerConsole;\n  })();\n  (function checkConsoleCompatibility() {\n    if (!hasDOM) {\n      return;\n    }\n    if (!('console' in window)) {\n      window.console = {\n        log: function log() {},\n        error: function error() {},\n        warn: function warn() {}\n      };\n      return;\n    }\n    if (!('bind' in console.log)) {\n      console.log = function (fn) {\n        return function (msg) {\n          return fn(msg);\n        };\n      }(console.log);\n      console.error = function (fn) {\n        return function (msg) {\n          return fn(msg);\n        };\n      }(console.error);\n      console.warn = function (fn) {\n        return function (msg) {\n          return fn(msg);\n        };\n      }(console.warn);\n      return;\n    }\n  })();\n  (function checkOnClickCompatibility() {\n    function ignoreIfTargetDisabled(event) {\n      if (isDisabled(event.target)) {\n        event.stopPropagation();\n      }\n    }\n    function isDisabled(node) {\n      return node.disabled || node.parentNode && isDisabled(node.parentNode);\n    }\n    if (isOpera) {\n      document.addEventListener('click', ignoreIfTargetDisabled, true);\n    }\n  })();\n  (function checkOnBlobSupport() {\n    if (isIE || isIOSChrome) {\n      PDFJS.disableCreateObjectURL = true;\n    }\n  })();\n  (function checkNavigatorLanguage() {\n    if (typeof navigator === 'undefined') {\n      return;\n    }\n    if ('language' in navigator) {\n      return;\n    }\n    PDFJS.locale = navigator.userLanguage || 'en-US';\n  })();\n  (function checkRangeRequests() {\n    if (isSafari || isAndroidPre3 || isChromeWithRangeBug || isIOS) {\n      PDFJS.disableRange = true;\n      PDFJS.disableStream = true;\n    }\n  })();\n  (function checkHistoryManipulation() {\n    if (!hasDOM) {\n      return;\n    }\n    if (!history.pushState || isAndroidPre3) {\n      PDFJS.disableHistory = true;\n    }\n  })();\n  (function checkSetPresenceInImageData() {\n    if (!hasDOM) {\n      return;\n    }\n    if (window.CanvasPixelArray) {\n      if (typeof window.CanvasPixelArray.prototype.set !== 'function') {\n        window.CanvasPixelArray.prototype.set = function (arr) {\n          for (var i = 0, ii = this.length; i < ii; i++) {\n            this[i] = arr[i];\n          }\n        };\n      }\n    } else {\n      var polyfill = false,\n          versionMatch;\n      if (isChrome) {\n        versionMatch = userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\n        polyfill = versionMatch && parseInt(versionMatch[2]) < 21;\n      } else if (isAndroid) {\n        polyfill = isAndroidPre5;\n      } else if (isSafari) {\n        versionMatch = userAgent.match(/Version\\/([0-9]+)\\.([0-9]+)\\.([0-9]+) Safari\\//);\n        polyfill = versionMatch && parseInt(versionMatch[1]) < 6;\n      }\n      if (polyfill) {\n        var contextPrototype = window.CanvasRenderingContext2D.prototype;\n        var createImageData = contextPrototype.createImageData;\n        contextPrototype.createImageData = function (w, h) {\n          var imageData = createImageData.call(this, w, h);\n          imageData.data.set = function (arr) {\n            for (var i = 0, ii = this.length; i < ii; i++) {\n              this[i] = arr[i];\n            }\n          };\n          return imageData;\n        };\n        contextPrototype = null;\n      }\n    }\n  })();\n  (function checkRequestAnimationFrame() {\n    function installFakeAnimationFrameFunctions() {\n      window.requestAnimationFrame = function (callback) {\n        return window.setTimeout(callback, 20);\n      };\n      window.cancelAnimationFrame = function (timeoutID) {\n        window.clearTimeout(timeoutID);\n      };\n    }\n    if (!hasDOM) {\n      return;\n    }\n    if (isIOS) {\n      installFakeAnimationFrameFunctions();\n      return;\n    }\n    if ('requestAnimationFrame' in window) {\n      return;\n    }\n    window.requestAnimationFrame = window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame;\n    if (window.requestAnimationFrame) {\n      return;\n    }\n    installFakeAnimationFrameFunctions();\n  })();\n  (function checkCanvasSizeLimitation() {\n    if (isIOS || isAndroid) {\n      PDFJS.maxCanvasPixels = 5242880;\n    }\n  })();\n  (function checkFullscreenSupport() {\n    if (!hasDOM) {\n      return;\n    }\n    if (isIE && window.parent !== window) {\n      PDFJS.disableFullscreen = true;\n    }\n  })();\n  (function checkCurrentScript() {\n    if (!hasDOM) {\n      return;\n    }\n    if ('currentScript' in document) {\n      return;\n    }\n    Object.defineProperty(document, 'currentScript', {\n      get: function get() {\n        var scripts = document.getElementsByTagName('script');\n        return scripts[scripts.length - 1];\n      },\n\n      enumerable: true,\n      configurable: true\n    });\n  })();\n  (function checkInputTypeNumberAssign() {\n    if (!hasDOM) {\n      return;\n    }\n    var el = document.createElement('input');\n    try {\n      el.type = 'number';\n    } catch (ex) {\n      var inputProto = el.constructor.prototype;\n      var typeProperty = Object.getOwnPropertyDescriptor(inputProto, 'type');\n      Object.defineProperty(inputProto, 'type', {\n        get: function get() {\n          return typeProperty.get.call(this);\n        },\n        set: function set(value) {\n          typeProperty.set.call(this, value === 'number' ? 'text' : value);\n        },\n\n        enumerable: true,\n        configurable: true\n      });\n    }\n  })();\n  (function checkDocumentReadyState() {\n    if (!hasDOM) {\n      return;\n    }\n    if (!document.attachEvent) {\n      return;\n    }\n    var documentProto = document.constructor.prototype;\n    var readyStateProto = Object.getOwnPropertyDescriptor(documentProto, 'readyState');\n    Object.defineProperty(documentProto, 'readyState', {\n      get: function get() {\n        var value = readyStateProto.get.call(this);\n        return value === 'interactive' ? 'loading' : value;\n      },\n      set: function set(value) {\n        readyStateProto.set.call(this, value);\n      },\n\n      enumerable: true,\n      configurable: true\n    });\n  })();\n  (function checkChildNodeRemove() {\n    if (!hasDOM) {\n      return;\n    }\n    if (typeof Element.prototype.remove !== 'undefined') {\n      return;\n    }\n    Element.prototype.remove = function () {\n      if (this.parentNode) {\n        this.parentNode.removeChild(this);\n      }\n    };\n  })();\n  (function checkNumberIsNaN() {\n    if (Number.isNaN) {\n      return;\n    }\n    Number.isNaN = function (value) {\n      return typeof value === 'number' && isNaN(value);\n    };\n  })();\n  (function checkNumberIsInteger() {\n    if (Number.isInteger) {\n      return;\n    }\n    Number.isInteger = function (value) {\n      return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;\n    };\n  })();\n  (function checkPromise() {\n    if (globalScope.Promise) {\n      if (typeof globalScope.Promise.all !== 'function') {\n        globalScope.Promise.all = function (iterable) {\n          var count = 0,\n              results = [],\n              resolve,\n              reject;\n          var promise = new globalScope.Promise(function (resolve_, reject_) {\n            resolve = resolve_;\n            reject = reject_;\n          });\n          iterable.forEach(function (p, i) {\n            count++;\n            p.then(function (result) {\n              results[i] = result;\n              count--;\n              if (count === 0) {\n                resolve(results);\n              }\n            }, reject);\n          });\n          if (count === 0) {\n            resolve(results);\n          }\n          return promise;\n        };\n      }\n      if (typeof globalScope.Promise.resolve !== 'function') {\n        globalScope.Promise.resolve = function (value) {\n          return new globalScope.Promise(function (resolve) {\n            resolve(value);\n          });\n        };\n      }\n      if (typeof globalScope.Promise.reject !== 'function') {\n        globalScope.Promise.reject = function (reason) {\n          return new globalScope.Promise(function (resolve, reject) {\n            reject(reason);\n          });\n        };\n      }\n      if (typeof globalScope.Promise.prototype.catch !== 'function') {\n        globalScope.Promise.prototype.catch = function (onReject) {\n          return globalScope.Promise.prototype.then(undefined, onReject);\n        };\n      }\n      return;\n    }\n    var STATUS_PENDING = 0;\n    var STATUS_RESOLVED = 1;\n    var STATUS_REJECTED = 2;\n    var REJECTION_TIMEOUT = 500;\n    var HandlerManager = {\n      handlers: [],\n      running: false,\n      unhandledRejections: [],\n      pendingRejectionCheck: false,\n      scheduleHandlers: function scheduleHandlers(promise) {\n        if (promise._status === STATUS_PENDING) {\n          return;\n        }\n        this.handlers = this.handlers.concat(promise._handlers);\n        promise._handlers = [];\n        if (this.running) {\n          return;\n        }\n        this.running = true;\n        setTimeout(this.runHandlers.bind(this), 0);\n      },\n      runHandlers: function runHandlers() {\n        var RUN_TIMEOUT = 1;\n        var timeoutAt = Date.now() + RUN_TIMEOUT;\n        while (this.handlers.length > 0) {\n          var handler = this.handlers.shift();\n          var nextStatus = handler.thisPromise._status;\n          var nextValue = handler.thisPromise._value;\n          try {\n            if (nextStatus === STATUS_RESOLVED) {\n              if (typeof handler.onResolve === 'function') {\n                nextValue = handler.onResolve(nextValue);\n              }\n            } else if (typeof handler.onReject === 'function') {\n              nextValue = handler.onReject(nextValue);\n              nextStatus = STATUS_RESOLVED;\n              if (handler.thisPromise._unhandledRejection) {\n                this.removeUnhandeledRejection(handler.thisPromise);\n              }\n            }\n          } catch (ex) {\n            nextStatus = STATUS_REJECTED;\n            nextValue = ex;\n          }\n          handler.nextPromise._updateStatus(nextStatus, nextValue);\n          if (Date.now() >= timeoutAt) {\n            break;\n          }\n        }\n        if (this.handlers.length > 0) {\n          setTimeout(this.runHandlers.bind(this), 0);\n          return;\n        }\n        this.running = false;\n      },\n      addUnhandledRejection: function addUnhandledRejection(promise) {\n        this.unhandledRejections.push({\n          promise: promise,\n          time: Date.now()\n        });\n        this.scheduleRejectionCheck();\n      },\n      removeUnhandeledRejection: function removeUnhandeledRejection(promise) {\n        promise._unhandledRejection = false;\n        for (var i = 0; i < this.unhandledRejections.length; i++) {\n          if (this.unhandledRejections[i].promise === promise) {\n            this.unhandledRejections.splice(i);\n            i--;\n          }\n        }\n      },\n      scheduleRejectionCheck: function scheduleRejectionCheck() {\n        var _this = this;\n\n        if (this.pendingRejectionCheck) {\n          return;\n        }\n        this.pendingRejectionCheck = true;\n        setTimeout(function () {\n          _this.pendingRejectionCheck = false;\n          var now = Date.now();\n          for (var i = 0; i < _this.unhandledRejections.length; i++) {\n            if (now - _this.unhandledRejections[i].time > REJECTION_TIMEOUT) {\n              var unhandled = _this.unhandledRejections[i].promise._value;\n              var msg = 'Unhandled rejection: ' + unhandled;\n              if (unhandled.stack) {\n                msg += '\\n' + unhandled.stack;\n              }\n              try {\n                throw new Error(msg);\n              } catch (_) {\n                console.warn(msg);\n              }\n              _this.unhandledRejections.splice(i);\n              i--;\n            }\n          }\n          if (_this.unhandledRejections.length) {\n            _this.scheduleRejectionCheck();\n          }\n        }, REJECTION_TIMEOUT);\n      }\n    };\n    var Promise = function Promise(resolver) {\n      this._status = STATUS_PENDING;\n      this._handlers = [];\n      try {\n        resolver.call(this, this._resolve.bind(this), this._reject.bind(this));\n      } catch (e) {\n        this._reject(e);\n      }\n    };\n    Promise.all = function Promise_all(promises) {\n      var resolveAll, rejectAll;\n      var deferred = new Promise(function (resolve, reject) {\n        resolveAll = resolve;\n        rejectAll = reject;\n      });\n      var unresolved = promises.length;\n      var results = [];\n      if (unresolved === 0) {\n        resolveAll(results);\n        return deferred;\n      }\n      function reject(reason) {\n        if (deferred._status === STATUS_REJECTED) {\n          return;\n        }\n        results = [];\n        rejectAll(reason);\n      }\n      for (var i = 0, ii = promises.length; i < ii; ++i) {\n        var promise = promises[i];\n        var resolve = function (i) {\n          return function (value) {\n            if (deferred._status === STATUS_REJECTED) {\n              return;\n            }\n            results[i] = value;\n            unresolved--;\n            if (unresolved === 0) {\n              resolveAll(results);\n            }\n          };\n        }(i);\n        if (Promise.isPromise(promise)) {\n          promise.then(resolve, reject);\n        } else {\n          resolve(promise);\n        }\n      }\n      return deferred;\n    };\n    Promise.isPromise = function Promise_isPromise(value) {\n      return value && typeof value.then === 'function';\n    };\n    Promise.resolve = function Promise_resolve(value) {\n      return new Promise(function (resolve) {\n        resolve(value);\n      });\n    };\n    Promise.reject = function Promise_reject(reason) {\n      return new Promise(function (resolve, reject) {\n        reject(reason);\n      });\n    };\n    Promise.prototype = {\n      _status: null,\n      _value: null,\n      _handlers: null,\n      _unhandledRejection: null,\n      _updateStatus: function Promise__updateStatus(status, value) {\n        if (this._status === STATUS_RESOLVED || this._status === STATUS_REJECTED) {\n          return;\n        }\n        if (status === STATUS_RESOLVED && Promise.isPromise(value)) {\n          value.then(this._updateStatus.bind(this, STATUS_RESOLVED), this._updateStatus.bind(this, STATUS_REJECTED));\n          return;\n        }\n        this._status = status;\n        this._value = value;\n        if (status === STATUS_REJECTED && this._handlers.length === 0) {\n          this._unhandledRejection = true;\n          HandlerManager.addUnhandledRejection(this);\n        }\n        HandlerManager.scheduleHandlers(this);\n      },\n      _resolve: function Promise_resolve(value) {\n        this._updateStatus(STATUS_RESOLVED, value);\n      },\n      _reject: function Promise_reject(reason) {\n        this._updateStatus(STATUS_REJECTED, reason);\n      },\n      then: function Promise_then(onResolve, onReject) {\n        var nextPromise = new Promise(function (resolve, reject) {\n          this.resolve = resolve;\n          this.reject = reject;\n        });\n        this._handlers.push({\n          thisPromise: this,\n          onResolve: onResolve,\n          onReject: onReject,\n          nextPromise: nextPromise\n        });\n        HandlerManager.scheduleHandlers(this);\n        return nextPromise;\n      },\n      catch: function Promise_catch(onReject) {\n        return this.then(undefined, onReject);\n      }\n    };\n    globalScope.Promise = Promise;\n  })();\n  (function checkWeakMap() {\n    if (globalScope.WeakMap) {\n      return;\n    }\n    var id = 0;\n    function WeakMap() {\n      this.id = '$weakmap' + id++;\n    }\n    WeakMap.prototype = {\n      has: function has(obj) {\n        if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object' && typeof obj !== 'function' || obj === null) {\n          return false;\n        }\n        return !!Object.getOwnPropertyDescriptor(obj, this.id);\n      },\n      get: function get(obj) {\n        return this.has(obj) ? obj[this.id] : undefined;\n      },\n      set: function set(obj, value) {\n        Object.defineProperty(obj, this.id, {\n          value: value,\n          enumerable: false,\n          configurable: true\n        });\n      },\n      delete: function _delete(obj) {\n        delete obj[this.id];\n      }\n    };\n    globalScope.WeakMap = WeakMap;\n  })();\n  (function checkURLConstructor() {\n    var hasWorkingUrl = false;\n    try {\n      if (typeof URL === 'function' && _typeof(URL.prototype) === 'object' && 'origin' in URL.prototype) {\n        var u = new URL('b', 'http://a');\n        u.pathname = 'c%20d';\n        hasWorkingUrl = u.href === 'http://a/c%20d';\n      }\n    } catch (e) {}\n    if (hasWorkingUrl) {\n      return;\n    }\n    var relative = Object.create(null);\n    relative['ftp'] = 21;\n    relative['file'] = 0;\n    relative['gopher'] = 70;\n    relative['http'] = 80;\n    relative['https'] = 443;\n    relative['ws'] = 80;\n    relative['wss'] = 443;\n    var relativePathDotMapping = Object.create(null);\n    relativePathDotMapping['%2e'] = '.';\n    relativePathDotMapping['.%2e'] = '..';\n    relativePathDotMapping['%2e.'] = '..';\n    relativePathDotMapping['%2e%2e'] = '..';\n    function isRelativeScheme(scheme) {\n      return relative[scheme] !== undefined;\n    }\n    function invalid() {\n      clear.call(this);\n      this._isInvalid = true;\n    }\n    function IDNAToASCII(h) {\n      if (h === '') {\n        invalid.call(this);\n      }\n      return h.toLowerCase();\n    }\n    function percentEscape(c) {\n      var unicode = c.charCodeAt(0);\n      if (unicode > 0x20 && unicode < 0x7F && [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) === -1) {\n        return c;\n      }\n      return encodeURIComponent(c);\n    }\n    function percentEscapeQuery(c) {\n      var unicode = c.charCodeAt(0);\n      if (unicode > 0x20 && unicode < 0x7F && [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) === -1) {\n        return c;\n      }\n      return encodeURIComponent(c);\n    }\n    var EOF,\n        ALPHA = /[a-zA-Z]/,\n        ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n    function parse(input, stateOverride, base) {\n      function err(message) {\n        errors.push(message);\n      }\n      var state = stateOverride || 'scheme start',\n          cursor = 0,\n          buffer = '',\n          seenAt = false,\n          seenBracket = false,\n          errors = [];\n      loop: while ((input[cursor - 1] !== EOF || cursor === 0) && !this._isInvalid) {\n        var c = input[cursor];\n        switch (state) {\n          case 'scheme start':\n            if (c && ALPHA.test(c)) {\n              buffer += c.toLowerCase();\n              state = 'scheme';\n            } else if (!stateOverride) {\n              buffer = '';\n              state = 'no scheme';\n              continue;\n            } else {\n              err('Invalid scheme.');\n              break loop;\n            }\n            break;\n          case 'scheme':\n            if (c && ALPHANUMERIC.test(c)) {\n              buffer += c.toLowerCase();\n            } else if (c === ':') {\n              this._scheme = buffer;\n              buffer = '';\n              if (stateOverride) {\n                break loop;\n              }\n              if (isRelativeScheme(this._scheme)) {\n                this._isRelative = true;\n              }\n              if (this._scheme === 'file') {\n                state = 'relative';\n              } else if (this._isRelative && base && base._scheme === this._scheme) {\n                state = 'relative or authority';\n              } else if (this._isRelative) {\n                state = 'authority first slash';\n              } else {\n                state = 'scheme data';\n              }\n            } else if (!stateOverride) {\n              buffer = '';\n              cursor = 0;\n              state = 'no scheme';\n              continue;\n            } else if (c === EOF) {\n              break loop;\n            } else {\n              err('Code point not allowed in scheme: ' + c);\n              break loop;\n            }\n            break;\n          case 'scheme data':\n            if (c === '?') {\n              this._query = '?';\n              state = 'query';\n            } else if (c === '#') {\n              this._fragment = '#';\n              state = 'fragment';\n            } else {\n              if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n                this._schemeData += percentEscape(c);\n              }\n            }\n            break;\n          case 'no scheme':\n            if (!base || !isRelativeScheme(base._scheme)) {\n              err('Missing scheme.');\n              invalid.call(this);\n            } else {\n              state = 'relative';\n              continue;\n            }\n            break;\n          case 'relative or authority':\n            if (c === '/' && input[cursor + 1] === '/') {\n              state = 'authority ignore slashes';\n            } else {\n              err('Expected /, got: ' + c);\n              state = 'relative';\n              continue;\n            }\n            break;\n          case 'relative':\n            this._isRelative = true;\n            if (this._scheme !== 'file') {\n              this._scheme = base._scheme;\n            }\n            if (c === EOF) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._query = base._query;\n              this._username = base._username;\n              this._password = base._password;\n              break loop;\n            } else if (c === '/' || c === '\\\\') {\n              if (c === '\\\\') {\n                err('\\\\ is an invalid code point.');\n              }\n              state = 'relative slash';\n            } else if (c === '?') {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._query = '?';\n              this._username = base._username;\n              this._password = base._password;\n              state = 'query';\n            } else if (c === '#') {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._query = base._query;\n              this._fragment = '#';\n              this._username = base._username;\n              this._password = base._password;\n              state = 'fragment';\n            } else {\n              var nextC = input[cursor + 1];\n              var nextNextC = input[cursor + 2];\n              if (this._scheme !== 'file' || !ALPHA.test(c) || nextC !== ':' && nextC !== '|' || nextNextC !== EOF && nextNextC !== '/' && nextNextC !== '\\\\' && nextNextC !== '?' && nextNextC !== '#') {\n                this._host = base._host;\n                this._port = base._port;\n                this._username = base._username;\n                this._password = base._password;\n                this._path = base._path.slice();\n                this._path.pop();\n              }\n              state = 'relative path';\n              continue;\n            }\n            break;\n          case 'relative slash':\n            if (c === '/' || c === '\\\\') {\n              if (c === '\\\\') {\n                err('\\\\ is an invalid code point.');\n              }\n              if (this._scheme === 'file') {\n                state = 'file host';\n              } else {\n                state = 'authority ignore slashes';\n              }\n            } else {\n              if (this._scheme !== 'file') {\n                this._host = base._host;\n                this._port = base._port;\n                this._username = base._username;\n                this._password = base._password;\n              }\n              state = 'relative path';\n              continue;\n            }\n            break;\n          case 'authority first slash':\n            if (c === '/') {\n              state = 'authority second slash';\n            } else {\n              err('Expected \\'/\\', got: ' + c);\n              state = 'authority ignore slashes';\n              continue;\n            }\n            break;\n          case 'authority second slash':\n            state = 'authority ignore slashes';\n            if (c !== '/') {\n              err('Expected \\'/\\', got: ' + c);\n              continue;\n            }\n            break;\n          case 'authority ignore slashes':\n            if (c !== '/' && c !== '\\\\') {\n              state = 'authority';\n              continue;\n            } else {\n              err('Expected authority, got: ' + c);\n            }\n            break;\n          case 'authority':\n            if (c === '@') {\n              if (seenAt) {\n                err('@ already seen.');\n                buffer += '%40';\n              }\n              seenAt = true;\n              for (var i = 0; i < buffer.length; i++) {\n                var cp = buffer[i];\n                if (cp === '\\t' || cp === '\\n' || cp === '\\r') {\n                  err('Invalid whitespace in authority.');\n                  continue;\n                }\n                if (cp === ':' && this._password === null) {\n                  this._password = '';\n                  continue;\n                }\n                var tempC = percentEscape(cp);\n                if (this._password !== null) {\n                  this._password += tempC;\n                } else {\n                  this._username += tempC;\n                }\n              }\n              buffer = '';\n            } else if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#') {\n              cursor -= buffer.length;\n              buffer = '';\n              state = 'host';\n              continue;\n            } else {\n              buffer += c;\n            }\n            break;\n          case 'file host':\n            if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#') {\n              if (buffer.length === 2 && ALPHA.test(buffer[0]) && (buffer[1] === ':' || buffer[1] === '|')) {\n                state = 'relative path';\n              } else if (buffer.length === 0) {\n                state = 'relative path start';\n              } else {\n                this._host = IDNAToASCII.call(this, buffer);\n                buffer = '';\n                state = 'relative path start';\n              }\n              continue;\n            } else if (c === '\\t' || c === '\\n' || c === '\\r') {\n              err('Invalid whitespace in file host.');\n            } else {\n              buffer += c;\n            }\n            break;\n          case 'host':\n          case 'hostname':\n            if (c === ':' && !seenBracket) {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'port';\n              if (stateOverride === 'hostname') {\n                break loop;\n              }\n            } else if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#') {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n              if (stateOverride) {\n                break loop;\n              }\n              continue;\n            } else if (c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              if (c === '[') {\n                seenBracket = true;\n              } else if (c === ']') {\n                seenBracket = false;\n              }\n              buffer += c;\n            } else {\n              err('Invalid code point in host/hostname: ' + c);\n            }\n            break;\n          case 'port':\n            if (/[0-9]/.test(c)) {\n              buffer += c;\n            } else if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#' || stateOverride) {\n              if (buffer !== '') {\n                var temp = parseInt(buffer, 10);\n                if (temp !== relative[this._scheme]) {\n                  this._port = temp + '';\n                }\n                buffer = '';\n              }\n              if (stateOverride) {\n                break loop;\n              }\n              state = 'relative path start';\n              continue;\n            } else if (c === '\\t' || c === '\\n' || c === '\\r') {\n              err('Invalid code point in port: ' + c);\n            } else {\n              invalid.call(this);\n            }\n            break;\n          case 'relative path start':\n            if (c === '\\\\') {\n              err('\\'\\\\\\' not allowed in path.');\n            }\n            state = 'relative path';\n            if (c !== '/' && c !== '\\\\') {\n              continue;\n            }\n            break;\n          case 'relative path':\n            if (c === EOF || c === '/' || c === '\\\\' || !stateOverride && (c === '?' || c === '#')) {\n              if (c === '\\\\') {\n                err('\\\\ not allowed in relative path.');\n              }\n              var tmp;\n              if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n                buffer = tmp;\n              }\n              if (buffer === '..') {\n                this._path.pop();\n                if (c !== '/' && c !== '\\\\') {\n                  this._path.push('');\n                }\n              } else if (buffer === '.' && c !== '/' && c !== '\\\\') {\n                this._path.push('');\n              } else if (buffer !== '.') {\n                if (this._scheme === 'file' && this._path.length === 0 && buffer.length === 2 && ALPHA.test(buffer[0]) && buffer[1] === '|') {\n                  buffer = buffer[0] + ':';\n                }\n                this._path.push(buffer);\n              }\n              buffer = '';\n              if (c === '?') {\n                this._query = '?';\n                state = 'query';\n              } else if (c === '#') {\n                this._fragment = '#';\n                state = 'fragment';\n              }\n            } else if (c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              buffer += percentEscape(c);\n            }\n            break;\n          case 'query':\n            if (!stateOverride && c === '#') {\n              this._fragment = '#';\n              state = 'fragment';\n            } else if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              this._query += percentEscapeQuery(c);\n            }\n            break;\n          case 'fragment':\n            if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              this._fragment += c;\n            }\n            break;\n        }\n        cursor++;\n      }\n    }\n    function clear() {\n      this._scheme = '';\n      this._schemeData = '';\n      this._username = '';\n      this._password = null;\n      this._host = '';\n      this._port = '';\n      this._path = [];\n      this._query = '';\n      this._fragment = '';\n      this._isInvalid = false;\n      this._isRelative = false;\n    }\n    function JURL(url, base) {\n      if (base !== undefined && !(base instanceof JURL)) {\n        base = new JURL(String(base));\n      }\n      this._url = url;\n      clear.call(this);\n      var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n      parse.call(this, input, null, base);\n    }\n    JURL.prototype = {\n      toString: function toString() {\n        return this.href;\n      },\n\n      get href() {\n        if (this._isInvalid) {\n          return this._url;\n        }\n        var authority = '';\n        if (this._username !== '' || this._password !== null) {\n          authority = this._username + (this._password !== null ? ':' + this._password : '') + '@';\n        }\n        return this.protocol + (this._isRelative ? '//' + authority + this.host : '') + this.pathname + this._query + this._fragment;\n      },\n      set href(value) {\n        clear.call(this);\n        parse.call(this, value);\n      },\n      get protocol() {\n        return this._scheme + ':';\n      },\n      set protocol(value) {\n        if (this._isInvalid) {\n          return;\n        }\n        parse.call(this, value + ':', 'scheme start');\n      },\n      get host() {\n        return this._isInvalid ? '' : this._port ? this._host + ':' + this._port : this._host;\n      },\n      set host(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        parse.call(this, value, 'host');\n      },\n      get hostname() {\n        return this._host;\n      },\n      set hostname(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        parse.call(this, value, 'hostname');\n      },\n      get port() {\n        return this._port;\n      },\n      set port(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        parse.call(this, value, 'port');\n      },\n      get pathname() {\n        return this._isInvalid ? '' : this._isRelative ? '/' + this._path.join('/') : this._schemeData;\n      },\n      set pathname(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        this._path = [];\n        parse.call(this, value, 'relative path start');\n      },\n      get search() {\n        return this._isInvalid || !this._query || this._query === '?' ? '' : this._query;\n      },\n      set search(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        this._query = '?';\n        if (value[0] === '?') {\n          value = value.slice(1);\n        }\n        parse.call(this, value, 'query');\n      },\n      get hash() {\n        return this._isInvalid || !this._fragment || this._fragment === '#' ? '' : this._fragment;\n      },\n      set hash(value) {\n        if (this._isInvalid) {\n          return;\n        }\n        this._fragment = '#';\n        if (value[0] === '#') {\n          value = value.slice(1);\n        }\n        parse.call(this, value, 'fragment');\n      },\n      get origin() {\n        var host;\n        if (this._isInvalid || !this._scheme) {\n          return '';\n        }\n        switch (this._scheme) {\n          case 'data':\n          case 'file':\n          case 'javascript':\n          case 'mailto':\n            return 'null';\n          case 'blob':\n            try {\n              return new JURL(this._schemeData).origin || 'null';\n            } catch (_) {}\n            return 'null';\n        }\n        host = this.host;\n        if (!host) {\n          return '';\n        }\n        return this._scheme + '://' + host;\n      }\n    };\n    var OriginalURL = globalScope.URL;\n    if (OriginalURL) {\n      JURL.createObjectURL = function (blob) {\n        return OriginalURL.createObjectURL.apply(OriginalURL, arguments);\n      };\n      JURL.revokeObjectURL = function (url) {\n        OriginalURL.revokeObjectURL(url);\n      };\n    }\n    globalScope.URL = JURL;\n  })();\n}\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar isReadableStreamSupported = false;\nif (typeof ReadableStream !== 'undefined') {\n  try {\n    new ReadableStream({\n      start: function start(controller) {\n        controller.close();\n      }\n    });\n    isReadableStreamSupported = true;\n  } catch (e) {}\n}\nif (isReadableStreamSupported) {\n  exports.ReadableStream = ReadableStream;\n} else {\n  exports.ReadableStream = __w_pdfjs_require__(10).ReadableStream;\n}\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=pdf.js.map"
  },
  {
    "path": "pages/include/pdf/pdf.viewer.css",
    "content": "/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n.textLayer {\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  overflow: hidden;\n  opacity: 0.2;\n  line-height: 1;\n}\n\n.textLayer > div {\n  color: transparent;\n  position: absolute;\n  white-space: pre;\n  cursor: text;\n  -webkit-transform-origin: 0% 0%;\n  -moz-transform-origin: 0% 0%;\n  -o-transform-origin: 0% 0%;\n  -ms-transform-origin: 0% 0%;\n  transform-origin: 0% 0%;\n}\n\n.textLayer .highlight {\n  margin: -1px;\n  padding: 1px;\n\n  background-color: rgb(180, 0, 170);\n  border-radius: 4px;\n}\n\n.textLayer .highlight.begin {\n  border-radius: 4px 0px 0px 4px;\n}\n\n.textLayer .highlight.end {\n  border-radius: 0px 4px 4px 0px;\n}\n\n.textLayer .highlight.middle {\n  border-radius: 0px;\n}\n\n.textLayer .highlight.selected {\n  background-color: rgb(0, 100, 0);\n}\n\n.textLayer ::selection {\n  background: rgb(0, 0, 255);\n}\n.textLayer ::-moz-selection {\n  background: rgb(0, 0, 255);\n}\n\n.textLayer .endOfContent {\n  display: block;\n  position: absolute;\n  left: 0px;\n  top: 100%;\n  right: 0px;\n  bottom: 0px;\n  z-index: -1;\n  cursor: default;\n  -webkit-user-select: none;\n  -ms-user-select: none;\n  -moz-user-select: none;\n}\n\n.textLayer .endOfContent.active {\n  top: 0px;\n}\n\n.annotationLayer section {\n  position: absolute;\n}\n\n.annotationLayer .linkAnnotation > a {\n  position: absolute;\n  font-size: 1em;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.annotationLayer .linkAnnotation > a /* -ms-a */ {\n  background: url(\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\")\n    0 0 repeat;\n}\n\n.annotationLayer .linkAnnotation > a:hover {\n  opacity: 0.2;\n  background: #ff0;\n  box-shadow: 0px 2px 10px #ff0;\n}\n\n.annotationLayer .textAnnotation img {\n  position: absolute;\n  cursor: pointer;\n}\n\n.annotationLayer .textWidgetAnnotation input,\n.annotationLayer .textWidgetAnnotation textarea,\n.annotationLayer .choiceWidgetAnnotation select,\n.annotationLayer .buttonWidgetAnnotation.checkBox input,\n.annotationLayer .buttonWidgetAnnotation.radioButton input {\n  background-color: rgba(0, 54, 255, 0.13);\n  border: 1px solid transparent;\n  box-sizing: border-box;\n  font-size: 9px;\n  height: 100%;\n  padding: 0 3px;\n  vertical-align: top;\n  width: 100%;\n}\n\n.annotationLayer .textWidgetAnnotation textarea {\n  font: message-box;\n  font-size: 9px;\n  resize: none;\n}\n\n.annotationLayer .textWidgetAnnotation input[disabled],\n.annotationLayer .textWidgetAnnotation textarea[disabled],\n.annotationLayer .choiceWidgetAnnotation select[disabled],\n.annotationLayer .buttonWidgetAnnotation.checkBox input[disabled],\n.annotationLayer .buttonWidgetAnnotation.radioButton input[disabled] {\n  background: none;\n  border: 1px solid transparent;\n  cursor: not-allowed;\n}\n\n.annotationLayer .textWidgetAnnotation input:hover,\n.annotationLayer .textWidgetAnnotation textarea:hover,\n.annotationLayer .choiceWidgetAnnotation select:hover,\n.annotationLayer .buttonWidgetAnnotation.checkBox input:hover,\n.annotationLayer .buttonWidgetAnnotation.radioButton input:hover {\n  border: 1px solid #000;\n}\n\n.annotationLayer .textWidgetAnnotation input:focus,\n.annotationLayer .textWidgetAnnotation textarea:focus,\n.annotationLayer .choiceWidgetAnnotation select:focus {\n  background: none;\n  border: 1px solid transparent;\n}\n\n.annotationLayer .textWidgetAnnotation input.comb {\n  font-family: monospace;\n  padding-left: 2px;\n  padding-right: 0;\n}\n\n.annotationLayer .textWidgetAnnotation input.comb:focus {\n  /*\n   * Letter spacing is placed on the right side of each character. Hence, the\n   * letter spacing of the last character may be placed outside the visible\n   * area, causing horizontal scrolling. We avoid this by extending the width\n   * when the element has focus and revert this when it loses focus.\n   */\n  width: 115%;\n}\n\n.annotationLayer .buttonWidgetAnnotation.checkBox input,\n.annotationLayer .buttonWidgetAnnotation.radioButton input {\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  -ms-appearance: none;\n  appearance: none;\n}\n\n.annotationLayer .popupWrapper {\n  position: absolute;\n  width: 20em;\n}\n\n.annotationLayer .popup {\n  position: absolute;\n  z-index: 200;\n  max-width: 20em;\n  background-color: #ffff99;\n  box-shadow: 0px 2px 5px #333;\n  border-radius: 2px;\n  padding: 0.6em;\n  margin-left: 5px;\n  cursor: pointer;\n  word-wrap: break-word;\n}\n\n.annotationLayer .popup h1 {\n  font-size: 1em;\n  border-bottom: 1px solid #000000;\n  padding-bottom: 0.2em;\n}\n\n.annotationLayer .popup p {\n  padding-top: 0.2em;\n}\n\n.annotationLayer .highlightAnnotation,\n.annotationLayer .underlineAnnotation,\n.annotationLayer .squigglyAnnotation,\n.annotationLayer .strikeoutAnnotation,\n.annotationLayer .lineAnnotation svg line,\n.annotationLayer .fileAttachmentAnnotation {\n  cursor: pointer;\n}\n\n.pdfViewer .canvasWrapper {\n  overflow: hidden;\n}\n\n.pdfViewer .page {\n  direction: ltr;\n  width: 816px;\n  height: 1056px;\n  margin: 1px auto -8px auto;\n  position: relative;\n  overflow: visible;\n  border: 9px solid transparent;\n  background-clip: content-box;\n  border-image: url(images/shadow.png) 9 9 repeat;\n  background-color: white;\n}\n\n.pdfViewer.removePageBorders .page {\n  margin: 0px auto 10px auto;\n  border: none;\n}\n\n.pdfViewer.singlePageView {\n  display: inline-block;\n}\n\n.pdfViewer.singlePageView .page {\n  margin: 0;\n  border: none;\n}\n\n.pdfViewer .page canvas {\n  margin: 0;\n  display: block;\n}\n\n.pdfViewer .page canvas[hidden] {\n  display: none;\n}\n\n.pdfViewer .page .loadingIcon {\n  position: absolute;\n  display: block;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  background: url(\"images/loading-icon.gif\") center no-repeat;\n}\n\n.pdfPresentationMode:-webkit-full-screen .pdfViewer .page {\n  margin-bottom: 100%;\n  border: 0;\n}\n\n.pdfPresentationMode:-moz-full-screen .pdfViewer .page {\n  margin-bottom: 100%;\n  border: 0;\n}\n\n.pdfPresentationMode:-ms-fullscreen .pdfViewer .page {\n  margin-bottom: 100% !important;\n  border: 0;\n}\n\n.pdfPresentationMode:fullscreen .pdfViewer .page {\n  margin-bottom: 100%;\n  border: 0;\n}\n\n#mainPdfWarrper >* {\n  padding: 0;\n  margin: 0;\n}\n\n#mainPdfWarrper {\n  height: 100%;\n  width: 100%;\n  /* Font size is needed to make the activity bar the correct size. */\n  font-size: 10px;\n}\n\n#mainPdfWarrper {\n  height: 100%;\n  width: 100%;\n  background-color: #404040;\n  background-image: url(images/texture.png);\n}\n\n#mainPdfWarrper,\ninput,\nbutton,\nselect {\n  font: message-box;\n  outline: none;\n}\n\n.hidden {\n  display: none !important;\n}\n[hidden] {\n  display: none !important;\n}\n\n#viewerContainer.pdfPresentationMode:-webkit-full-screen {\n  top: 0px;\n  border-top: 2px solid transparent;\n  background-color: #000;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  cursor: none;\n  -webkit-user-select: none;\n}\n\n#viewerContainer.pdfPresentationMode:-moz-full-screen {\n  top: 0px;\n  border-top: 2px solid transparent;\n  background-color: #000;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  cursor: none;\n  -moz-user-select: none;\n}\n\n#viewerContainer.pdfPresentationMode:-ms-fullscreen {\n  top: 0px !important;\n  border-top: 2px solid transparent;\n  width: 100%;\n  height: 100%;\n  overflow: hidden !important;\n  cursor: none;\n  -ms-user-select: none;\n}\n\n#viewerContainer.pdfPresentationMode:-ms-fullscreen::-ms-backdrop {\n  background-color: #000;\n}\n\n#viewerContainer.pdfPresentationMode:fullscreen {\n  top: 0px;\n  border-top: 2px solid transparent;\n  background-color: #000;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  cursor: none;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n}\n\n.pdfPresentationMode:-webkit-full-screen a:not(.internalLink) {\n  display: none;\n}\n\n.pdfPresentationMode:-moz-full-screen a:not(.internalLink) {\n  display: none;\n}\n\n.pdfPresentationMode:-ms-fullscreen a:not(.internalLink) {\n  display: none !important;\n}\n\n.pdfPresentationMode:fullscreen a:not(.internalLink) {\n  display: none;\n}\n\n.pdfPresentationMode:-webkit-full-screen .textLayer > div {\n  cursor: none;\n}\n\n.pdfPresentationMode:-moz-full-screen .textLayer > div {\n  cursor: none;\n}\n\n.pdfPresentationMode:-ms-fullscreen .textLayer > div {\n  cursor: none;\n}\n\n.pdfPresentationMode:fullscreen .textLayer > div {\n  cursor: none;\n}\n\n.pdfPresentationMode.pdfPresentationModeControls > *,\n.pdfPresentationMode.pdfPresentationModeControls .textLayer > div {\n  cursor: default;\n}\n\n#outerContainer {\n  width: 100%;\n  height: 100%;\n  position: relative;\n}\n\n#sidebarContainer {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  width: 200px;\n  visibility: hidden;\n  -webkit-transition-duration: 200ms;\n  -webkit-transition-timing-function: ease;\n  transition-duration: 200ms;\n  transition-timing-function: ease;\n}\n#mainPdfWarrper[dir=\"ltr\"] #sidebarContainer {\n  -webkit-transition-property: left;\n  transition-property: left;\n  left: -200px;\n}\n#mainPdfWarrper[dir=\"rtl\"] #sidebarContainer {\n  -webkit-transition-property: right;\n  transition-property: right;\n  right: -200px;\n}\n\n#outerContainer.sidebarMoving > #sidebarContainer,\n#outerContainer.sidebarOpen > #sidebarContainer {\n  visibility: visible;\n}\n#mainPdfWarrper[dir=\"ltr\"] #outerContainer.sidebarOpen > #sidebarContainer {\n  left: 0px;\n}\n#mainPdfWarrper[dir=\"rtl\"] #outerContainer.sidebarOpen > #sidebarContainer {\n  right: 0px;\n}\n\n#mainContainer {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  min-width: 320px;\n  -webkit-transition-duration: 200ms;\n  -webkit-transition-timing-function: ease;\n  transition-duration: 200ms;\n  transition-timing-function: ease;\n}\n#mainPdfWarrper[dir=\"ltr\"] #outerContainer.sidebarOpen > #mainContainer {\n  -webkit-transition-property: left;\n  transition-property: left;\n  left: 200px;\n}\n#mainPdfWarrper[dir=\"rtl\"] #outerContainer.sidebarOpen > #mainContainer {\n  -webkit-transition-property: right;\n  transition-property: right;\n  right: 200px;\n}\n\n#sidebarContent {\n  top: 32px;\n  bottom: 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  position: absolute;\n  width: 200px;\n  background-color: hsla(0, 0%, 0%, 0.1);\n}\n#mainPdfWarrper[dir=\"ltr\"] #sidebarContent {\n  left: 0;\n  box-shadow: inset -1px 0 0 hsla(0, 0%, 0%, 0.25);\n}\n#mainPdfWarrper[dir=\"rtl\"] #sidebarContent {\n  right: 0;\n  box-shadow: inset 1px 0 0 hsla(0, 0%, 0%, 0.25);\n}\n\n#viewerContainer {\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  position: absolute;\n  top: 32px;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  outline: none;\n}\n#mainPdfWarrper[dir=\"ltr\"] #viewerContainer {\n  box-shadow: inset 1px 0 0 hsla(0, 0%, 100%, 0.05);\n}\n#mainPdfWarrper[dir=\"rtl\"] #viewerContainer {\n  box-shadow: inset -1px 0 0 hsla(0, 0%, 100%, 0.05);\n}\n\n.toolbar {\n  position: relative;\n  left: 0;\n  right: 0;\n  z-index: 9999;\n  cursor: default;\n}\n\n#toolbarContainer {\n  width: 100%;\n}\n\n#toolbarSidebar {\n  width: 200px;\n  height: 32px;\n  background-color: #424242; /* fallback */\n  background-image: url(images/texture.png),\n    linear-gradient(hsla(0, 0%, 30%, 0.99), hsla(0, 0%, 25%, 0.95));\n}\n#mainPdfWarrper[dir=\"ltr\"] #toolbarSidebar {\n  box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25),\n    inset 0 -1px 0 hsla(0, 0%, 100%, 0.05), 0 1px 0 hsla(0, 0%, 0%, 0.15),\n    0 0 1px hsla(0, 0%, 0%, 0.1);\n}\n#mainPdfWarrper[dir=\"rtl\"] #toolbarSidebar {\n  box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25),\n    inset 0 1px 0 hsla(0, 0%, 100%, 0.05), 0 1px 0 hsla(0, 0%, 0%, 0.15),\n    0 0 1px hsla(0, 0%, 0%, 0.1);\n}\n\n#toolbarContainer,\n.findbar,\n.secondaryToolbar {\n  position: relative;\n  height: 32px;\n  background-color: #474747; /* fallback */\n  background-image: url(images/texture.png),\n    linear-gradient(hsla(0, 0%, 32%, 0.99), hsla(0, 0%, 27%, 0.95));\n}\n#mainPdfWarrper[dir=\"ltr\"] #toolbarContainer,\n.findbar,\n.secondaryToolbar {\n  box-shadow: inset 1px 0 0 hsla(0, 0%, 100%, 0.08),\n    inset 0 1px 1px hsla(0, 0%, 0%, 0.15),\n    inset 0 -1px 0 hsla(0, 0%, 100%, 0.05), 0 1px 0 hsla(0, 0%, 0%, 0.15),\n    0 1px 1px hsla(0, 0%, 0%, 0.1);\n}\n#mainPdfWarrper[dir=\"rtl\"] #toolbarContainer,\n.findbar,\n.secondaryToolbar {\n  box-shadow: inset -1px 0 0 hsla(0, 0%, 100%, 0.08),\n    inset 0 1px 1px hsla(0, 0%, 0%, 0.15),\n    inset 0 -1px 0 hsla(0, 0%, 100%, 0.05), 0 1px 0 hsla(0, 0%, 0%, 0.15),\n    0 1px 1px hsla(0, 0%, 0%, 0.1);\n}\n\n#toolbarViewer {\n  height: 32px;\n}\n\n#loadingBar {\n  position: relative;\n  width: 100%;\n  height: 4px;\n  background-color: #333;\n  border-bottom: 1px solid #333;\n}\n\n#loadingBar .progress {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 0%;\n  height: 100%;\n  background-color: #ddd;\n  overflow: hidden;\n  -webkit-transition: width 200ms;\n  transition: width 200ms;\n}\n\n@-webkit-keyframes progressIndeterminate {\n  0% {\n    left: -142px;\n  }\n  100% {\n    left: 0;\n  }\n}\n\n@keyframes progressIndeterminate {\n  0% {\n    left: -142px;\n  }\n  100% {\n    left: 0;\n  }\n}\n\n#loadingBar .progress.indeterminate {\n  background-color: #999;\n  -webkit-transition: none;\n  transition: none;\n}\n\n#loadingBar .progress.indeterminate .glimmer {\n  position: absolute;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: calc(100% + 150px);\n\n  background: repeating-linear-gradient(\n    135deg,\n    #bbb 0,\n    #999 5px,\n    #999 45px,\n    #ddd 55px,\n    #ddd 95px,\n    #bbb 100px\n  );\n\n  -webkit-animation: progressIndeterminate 950ms linear infinite;\n  animation: progressIndeterminate 950ms linear infinite;\n}\n\n.findbar,\n.secondaryToolbar {\n  top: 32px;\n  position: absolute;\n  z-index: 10000;\n  height: auto;\n  min-width: 16px;\n  padding: 0px 6px 0px 6px;\n  margin: 4px 2px 4px 2px;\n  color: hsl(0, 0%, 85%);\n  font-size: 12px;\n  line-height: 14px;\n  text-align: left;\n  cursor: default;\n}\n\n.findbar {\n  min-width: 300px;\n}\n.findbar > div {\n  height: 32px;\n}\n.findbar.wrapContainers > div {\n  clear: both;\n}\n.findbar.wrapContainers > div#findbarMessageContainer {\n  height: auto;\n}\n#mainPdfWarrper[dir=\"ltr\"] .findbar {\n  left: 68px;\n}\n#mainPdfWarrper[dir=\"rtl\"] .findbar {\n  right: 68px;\n}\n\n.findbar label {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n}\n\n#findInput {\n  width: 200px;\n}\n#findInput::-webkit-input-placeholder {\n  font-style: italic;\n}\n#findInput::-moz-placeholder {\n  font-style: italic;\n}\n#findInput:-ms-input-placeholder {\n  font-style: italic;\n}\n#findInput::placeholder {\n  font-style: italic;\n}\n#findInput[data-status=\"pending\"] {\n  background-image: url(images/loading-small.png);\n  background-repeat: no-repeat;\n  background-position: right;\n}\n#mainPdfWarrper[dir=\"rtl\"] #findInput[data-status=\"pending\"] {\n  background-position: left;\n}\n\n.secondaryToolbar {\n  padding: 6px;\n  height: auto;\n  z-index: 30000;\n}\n#mainPdfWarrper[dir=\"ltr\"] .secondaryToolbar {\n  right: 4px;\n}\n#mainPdfWarrper[dir=\"rtl\"] .secondaryToolbar {\n  left: 4px;\n}\n\n#secondaryToolbarButtonContainer {\n  max-width: 200px;\n  max-height: 400px;\n  overflow-y: auto;\n  -webkit-overflow-scrolling: touch;\n  margin-bottom: -4px;\n}\n\n.doorHanger,\n.doorHangerRight {\n  border: 1px solid hsla(0, 0%, 0%, 0.5);\n  border-radius: 2px;\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n.doorHanger:after,\n.doorHanger:before,\n.doorHangerRight:after,\n.doorHangerRight:before {\n  bottom: 100%;\n  border: solid transparent;\n  content: \" \";\n  height: 0;\n  width: 0;\n  position: absolute;\n  pointer-events: none;\n}\n.doorHanger:after,\n.doorHangerRight:after {\n  border-bottom-color: hsla(0, 0%, 32%, 0.99);\n  border-width: 8px;\n}\n.doorHanger:before,\n.doorHangerRight:before {\n  border-bottom-color: hsla(0, 0%, 0%, 0.5);\n  border-width: 9px;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .doorHanger:after,\n#mainPdfWarrper[dir=\"rtl\"] .doorHangerRight:after {\n  left: 13px;\n  margin-left: -8px;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .doorHanger:before,\n#mainPdfWarrper[dir=\"rtl\"] .doorHangerRight:before {\n  left: 13px;\n  margin-left: -9px;\n}\n\n#mainPdfWarrper[dir=\"rtl\"] .doorHanger:after,\n#mainPdfWarrper[dir=\"ltr\"] .doorHangerRight:after {\n  right: 13px;\n  margin-right: -8px;\n}\n\n#mainPdfWarrper[dir=\"rtl\"] .doorHanger:before,\n#mainPdfWarrper[dir=\"ltr\"] .doorHangerRight:before {\n  right: 13px;\n  margin-right: -9px;\n}\n\n#findResultsCount {\n  background-color: hsl(0, 0%, 85%);\n  color: hsl(0, 0%, 32%);\n  text-align: center;\n  padding: 3px 4px;\n}\n\n#findMsg {\n  font-style: italic;\n  color: #a6b7d0;\n}\n#findMsg:empty {\n  display: none;\n}\n\n#findInput.notFound {\n  background-color: rgb(255, 102, 102);\n}\n\n#toolbarViewerMiddle {\n  position: absolute;\n  left: 50%;\n  transform: translateX(-50%);\n}\n\n#mainPdfWarrper[dir=\"ltr\"] #toolbarViewerLeft,\n#mainPdfWarrper[dir=\"rtl\"] #toolbarViewerRight {\n  float: left;\n}\n#mainPdfWarrper[dir=\"ltr\"] #toolbarViewerRight,\n#mainPdfWarrper[dir=\"rtl\"] #toolbarViewerLeft {\n  float: right;\n}\n#mainPdfWarrper[dir=\"ltr\"] #toolbarViewerLeft > *,\n#mainPdfWarrper[dir=\"ltr\"] #toolbarViewerMiddle > *,\n#mainPdfWarrper[dir=\"ltr\"] #toolbarViewerRight > *,\n#mainPdfWarrper[dir=\"ltr\"] .findbar * {\n  position: relative;\n  float: left;\n}\n#mainPdfWarrper[dir=\"rtl\"] #toolbarViewerLeft > *,\n#mainPdfWarrper[dir=\"rtl\"] #toolbarViewerMiddle > *,\n#mainPdfWarrper[dir=\"rtl\"] #toolbarViewerRight > *,\n#mainPdfWarrper[dir=\"rtl\"] .findbar * {\n  position: relative;\n  float: right;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .splitToolbarButton {\n  margin: 3px 2px 4px 0;\n  display: inline-block;\n}\n#mainPdfWarrper[dir=\"rtl\"] .splitToolbarButton {\n  margin: 3px 0 4px 2px;\n  display: inline-block;\n}\n#mainPdfWarrper[dir=\"ltr\"] .splitToolbarButton > .toolbarButton {\n  border-radius: 0;\n  float: left;\n}\n#mainPdfWarrper[dir=\"rtl\"] .splitToolbarButton > .toolbarButton {\n  border-radius: 0;\n  float: right;\n}\n\n.toolbarButton,\n.secondaryToolbarButton,\n.overlayButton {\n  border: 0 none;\n  background: none;\n  width: 32px;\n  height: 25px;\n}\n\n.toolbarButton > span {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  overflow: hidden;\n}\n\n.toolbarButton[disabled],\n.secondaryToolbarButton[disabled],\n.overlayButton[disabled] {\n  opacity: 0.5;\n}\n\n.splitToolbarButton.toggled .toolbarButton {\n  margin: 0;\n}\n\n.splitToolbarButton:hover > .toolbarButton,\n.splitToolbarButton:focus > .toolbarButton,\n.splitToolbarButton.toggled > .toolbarButton,\n.toolbarButton.textButton {\n  background-color: hsla(0, 0%, 0%, 0.12);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  background-clip: padding-box;\n  border: 1px solid hsla(0, 0%, 0%, 0.35);\n  border-color: hsla(0, 0%, 0%, 0.32) hsla(0, 0%, 0%, 0.38)\n    hsla(0, 0%, 0%, 0.42);\n  box-shadow: 0 1px 0 hsla(0, 0%, 100%, 0.05) inset,\n    0 0 1px hsla(0, 0%, 100%, 0.15) inset, 0 1px 0 hsla(0, 0%, 100%, 0.05);\n  -webkit-transition-property: background-color, border-color, box-shadow;\n  -webkit-transition-duration: 150ms;\n  -webkit-transition-timing-function: ease;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 150ms;\n  transition-timing-function: ease;\n}\n.splitToolbarButton > .toolbarButton:hover,\n.splitToolbarButton > .toolbarButton:focus,\n.dropdownToolbarButton:hover,\n.overlayButton:hover,\n.overlayButton:focus,\n.toolbarButton.textButton:hover,\n.toolbarButton.textButton:focus {\n  background-color: hsla(0, 0%, 0%, 0.2);\n  box-shadow: 0 1px 0 hsla(0, 0%, 100%, 0.05) inset,\n    0 0 1px hsla(0, 0%, 100%, 0.15) inset, 0 0 1px hsla(0, 0%, 0%, 0.05);\n  z-index: 199;\n}\n.splitToolbarButton > .toolbarButton {\n  position: relative;\n}\n#mainPdfWarrper[dir=\"ltr\"] .splitToolbarButton > .toolbarButton:first-child,\n#mainPdfWarrper[dir=\"rtl\"] .splitToolbarButton > .toolbarButton:last-child {\n  position: relative;\n  margin: 0;\n  margin-right: -1px;\n  border-top-left-radius: 2px;\n  border-bottom-left-radius: 2px;\n  border-right-color: transparent;\n}\n#mainPdfWarrper[dir=\"ltr\"] .splitToolbarButton > .toolbarButton:last-child,\n#mainPdfWarrper[dir=\"rtl\"] .splitToolbarButton > .toolbarButton:first-child {\n  position: relative;\n  margin: 0;\n  margin-left: -1px;\n  border-top-right-radius: 2px;\n  border-bottom-right-radius: 2px;\n  border-left-color: transparent;\n}\n.splitToolbarButtonSeparator {\n  padding: 8px 0;\n  width: 1px;\n  background-color: hsla(0, 0%, 0%, 0.5);\n  z-index: 99;\n  box-shadow: 0 0 0 1px hsla(0, 0%, 100%, 0.08);\n  display: inline-block;\n  margin: 5px 0;\n}\n#mainPdfWarrper[dir=\"ltr\"] .splitToolbarButtonSeparator {\n  float: left;\n}\n#mainPdfWarrper[dir=\"rtl\"] .splitToolbarButtonSeparator {\n  float: right;\n}\n.splitToolbarButton:hover > .splitToolbarButtonSeparator,\n.splitToolbarButton.toggled > .splitToolbarButtonSeparator {\n  padding: 12px 0;\n  margin: 1px 0;\n  box-shadow: 0 0 0 1px hsla(0, 0%, 100%, 0.03);\n  -webkit-transition-property: padding;\n  -webkit-transition-duration: 10ms;\n  -webkit-transition-timing-function: ease;\n  transition-property: padding;\n  transition-duration: 10ms;\n  transition-timing-function: ease;\n}\n\n.toolbarButton,\n.dropdownToolbarButton,\n.secondaryToolbarButton,\n.overlayButton {\n  min-width: 16px;\n  padding: 2px 6px 0;\n  border: 1px solid transparent;\n  border-radius: 2px;\n  color: hsla(0, 0%, 100%, 0.8);\n  font-size: 12px;\n  line-height: 14px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  /* Opera does not support user-select, use <... unselectable=\"on\"> instead */\n  cursor: default;\n  -webkit-transition-property: background-color, border-color, box-shadow;\n  -webkit-transition-duration: 150ms;\n  -webkit-transition-timing-function: ease;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 150ms;\n  transition-timing-function: ease;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton,\n#mainPdfWarrper[dir=\"ltr\"] .overlayButton,\n#mainPdfWarrper[dir=\"ltr\"] .dropdownToolbarButton {\n  margin: 3px 2px 4px 0;\n}\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton,\n#mainPdfWarrper[dir=\"rtl\"] .overlayButton,\n#mainPdfWarrper[dir=\"rtl\"] .dropdownToolbarButton {\n  margin: 3px 0 4px 2px;\n}\n\n.toolbarButton:hover,\n.toolbarButton:focus,\n.dropdownToolbarButton,\n.overlayButton,\n.secondaryToolbarButton:hover,\n.secondaryToolbarButton:focus {\n  background-color: hsla(0, 0%, 0%, 0.12);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  background-clip: padding-box;\n  border: 1px solid hsla(0, 0%, 0%, 0.35);\n  border-color: hsla(0, 0%, 0%, 0.32) hsla(0, 0%, 0%, 0.38)\n    hsla(0, 0%, 0%, 0.42);\n  box-shadow: 0 1px 0 hsla(0, 0%, 100%, 0.05) inset,\n    0 0 1px hsla(0, 0%, 100%, 0.15) inset, 0 1px 0 hsla(0, 0%, 100%, 0.05);\n}\n\n.toolbarButton:hover:active,\n.overlayButton:hover:active,\n.dropdownToolbarButton:hover:active,\n.secondaryToolbarButton:hover:active {\n  background-color: hsla(0, 0%, 0%, 0.2);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  border-color: hsla(0, 0%, 0%, 0.35) hsla(0, 0%, 0%, 0.4) hsla(0, 0%, 0%, 0.45);\n  box-shadow: 0 1px 1px hsla(0, 0%, 0%, 0.1) inset,\n    0 0 1px hsla(0, 0%, 0%, 0.2) inset, 0 1px 0 hsla(0, 0%, 100%, 0.05);\n  -webkit-transition-property: background-color, border-color, box-shadow;\n  -webkit-transition-duration: 10ms;\n  -webkit-transition-timing-function: linear;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 10ms;\n  transition-timing-function: linear;\n}\n\n.toolbarButton.toggled,\n.splitToolbarButton.toggled > .toolbarButton.toggled,\n.secondaryToolbarButton.toggled {\n  background-color: hsla(0, 0%, 0%, 0.3);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  border-color: hsla(0, 0%, 0%, 0.4) hsla(0, 0%, 0%, 0.45) hsla(0, 0%, 0%, 0.5);\n  box-shadow: 0 1px 1px hsla(0, 0%, 0%, 0.1) inset,\n    0 0 1px hsla(0, 0%, 0%, 0.2) inset, 0 1px 0 hsla(0, 0%, 100%, 0.05);\n  -webkit-transition-property: background-color, border-color, box-shadow;\n  -webkit-transition-duration: 10ms;\n  -webkit-transition-timing-function: linear;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 10ms;\n  transition-timing-function: linear;\n}\n\n.toolbarButton.toggled:hover:active,\n.splitToolbarButton.toggled > .toolbarButton.toggled:hover:active,\n.secondaryToolbarButton.toggled:hover:active {\n  background-color: hsla(0, 0%, 0%, 0.4);\n  border-color: hsla(0, 0%, 0%, 0.4) hsla(0, 0%, 0%, 0.5) hsla(0, 0%, 0%, 0.55);\n  box-shadow: 0 1px 1px hsla(0, 0%, 0%, 0.2) inset,\n    0 0 1px hsla(0, 0%, 0%, 0.3) inset, 0 1px 0 hsla(0, 0%, 100%, 0.05);\n}\n\n.dropdownToolbarButton {\n  width: 120px;\n  max-width: 120px;\n  padding: 0;\n  overflow: hidden;\n  background: url(images/toolbarButton-menuArrows.png) no-repeat;\n}\n#mainPdfWarrper[dir=\"ltr\"] .dropdownToolbarButton {\n  background-position: 95%;\n}\n#mainPdfWarrper[dir=\"rtl\"] .dropdownToolbarButton {\n  background-position: 5%;\n}\n\n.dropdownToolbarButton > select {\n  min-width: 140px;\n  font-size: 12px;\n  color: hsl(0, 0%, 95%);\n  margin: 0;\n  padding: 3px 2px 2px;\n  border: none;\n  background: rgba(\n    0,\n    0,\n    0,\n    0\n  ); /* Opera does not support 'transparent' <select> background */\n}\n\n.dropdownToolbarButton > select > option {\n  background: hsl(0, 0%, 24%);\n}\n\n#customScaleOption {\n  display: none;\n}\n\n#pageWidthOption {\n  border-bottom: 1px rgba(255, 255, 255, 0.5) solid;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .splitToolbarButton:first-child,\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton:first-child,\n#mainPdfWarrper[dir=\"rtl\"] .splitToolbarButton:last-child,\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton:last-child {\n  margin-left: 4px;\n}\n#mainPdfWarrper[dir=\"ltr\"] .splitToolbarButton:last-child,\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton:last-child,\n#mainPdfWarrper[dir=\"rtl\"] .splitToolbarButton:first-child,\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton:first-child {\n  margin-right: 4px;\n}\n\n.toolbarButtonSpacer {\n  width: 30px;\n  display: inline-block;\n  height: 1px;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] #findPrevious {\n  margin-left: 3px;\n}\n#mainPdfWarrper[dir=\"ltr\"] #findNext {\n  margin-right: 3px;\n}\n\n#mainPdfWarrper[dir=\"rtl\"] #findPrevious {\n  margin-right: 3px;\n}\n#mainPdfWarrper[dir=\"rtl\"] #findNext {\n  margin-left: 3px;\n}\n\n.toolbarButton::before,\n.secondaryToolbarButton::before {\n  /* All matching images have a size of 16x16\n   * All relevant containers have a size of 32x25 */\n  position: absolute;\n  display: inline-block;\n  top: 4px;\n  left: 7px;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .secondaryToolbarButton::before {\n  left: 4px;\n}\n#mainPdfWarrper[dir=\"rtl\"] .secondaryToolbarButton::before {\n  right: 4px;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton#sidebarToggle::before {\n  content: url(images/toolbarButton-sidebarToggle.png);\n}\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton#sidebarToggle::before {\n  content: url(images/toolbarButton-sidebarToggle-rtl.png);\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton#secondaryToolbarToggle::before {\n  content: url(images/toolbarButton-secondaryToolbarToggle.png);\n}\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton#secondaryToolbarToggle::before {\n  content: url(images/toolbarButton-secondaryToolbarToggle-rtl.png);\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton.findPrevious::before {\n  content: url(images/findbarButton-previous.png);\n}\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton.findPrevious::before {\n  content: url(images/findbarButton-previous-rtl.png);\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton.findNext::before {\n  content: url(images/findbarButton-next.png);\n}\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton.findNext::before {\n  content: url(images/findbarButton-next-rtl.png);\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton.pageUp::before {\n  content: url(images/toolbarButton-pageUp.png);\n}\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton.pageUp::before {\n  content: url(images/toolbarButton-pageUp-rtl.png);\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton.pageDown::before {\n  content: url(images/toolbarButton-pageDown.png);\n}\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton.pageDown::before {\n  content: url(images/toolbarButton-pageDown-rtl.png);\n}\n\n.toolbarButton.zoomOut::before {\n  content: url(images/toolbarButton-zoomOut.png);\n}\n\n.toolbarButton.zoomIn::before {\n  content: url(images/toolbarButton-zoomIn.png);\n}\n\n.toolbarButton.presentationMode::before,\n.secondaryToolbarButton.presentationMode::before {\n  content: url(images/toolbarButton-presentationMode.png);\n}\n\n.toolbarButton.print::before,\n.secondaryToolbarButton.print::before {\n  content: url(images/toolbarButton-print.png);\n}\n\n.toolbarButton.openFile::before,\n.secondaryToolbarButton.openFile::before {\n  content: url(images/toolbarButton-openFile.png);\n}\n\n.toolbarButton.download::before,\n.secondaryToolbarButton.download::before {\n  content: url(images/toolbarButton-download.png);\n}\n\n.toolbarButton.bookmark,\n.secondaryToolbarButton.bookmark {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  outline: none;\n  padding-top: 4px;\n  text-decoration: none;\n}\n.secondaryToolbarButton.bookmark {\n  padding-top: 5px;\n}\n\n.bookmark[href=\"#\"] {\n  opacity: 0.5;\n  pointer-events: none;\n}\n\n.toolbarButton.bookmark::before,\n.secondaryToolbarButton.bookmark::before {\n  content: url(images/toolbarButton-bookmark.png);\n}\n\n#viewThumbnail.toolbarButton::before {\n  content: url(images/toolbarButton-viewThumbnail.png);\n}\n\n#mainPdfWarrper[dir=\"ltr\"] #viewOutline.toolbarButton::before {\n  content: url(images/toolbarButton-viewOutline.png);\n}\n#mainPdfWarrper[dir=\"rtl\"] #viewOutline.toolbarButton::before {\n  content: url(images/toolbarButton-viewOutline-rtl.png);\n}\n\n#viewAttachments.toolbarButton::before {\n  content: url(images/toolbarButton-viewAttachments.png);\n}\n\n#viewFind.toolbarButton::before {\n  content: url(images/toolbarButton-search.png);\n}\n\n.toolbarButton.pdfSidebarNotification::after {\n  position: absolute;\n  display: inline-block;\n  top: 1px;\n  /* Create a filled circle, with a diameter of 9 pixels, using only CSS: */\n  content: \"\";\n  background-color: #70db55;\n  height: 9px;\n  width: 9px;\n  border-radius: 50%;\n}\n#mainPdfWarrper[dir=\"ltr\"] .toolbarButton.pdfSidebarNotification::after {\n  left: 17px;\n}\n#mainPdfWarrper[dir=\"rtl\"] .toolbarButton.pdfSidebarNotification::after {\n  right: 17px;\n}\n\n.secondaryToolbarButton {\n  position: relative;\n  margin: 0 0 4px 0;\n  padding: 3px 0 1px 0;\n  height: auto;\n  min-height: 25px;\n  width: auto;\n  min-width: 100%;\n  white-space: normal;\n}\n#mainPdfWarrper[dir=\"ltr\"] .secondaryToolbarButton {\n  padding-left: 24px;\n  text-align: left;\n}\n#mainPdfWarrper[dir=\"rtl\"] .secondaryToolbarButton {\n  padding-right: 24px;\n  text-align: right;\n}\n#mainPdfWarrper[dir=\"ltr\"] .secondaryToolbarButton.bookmark {\n  padding-left: 27px;\n}\n#mainPdfWarrper[dir=\"rtl\"] .secondaryToolbarButton.bookmark {\n  padding-right: 27px;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .secondaryToolbarButton > span {\n  padding-right: 4px;\n}\n#mainPdfWarrper[dir=\"rtl\"] .secondaryToolbarButton > span {\n  padding-left: 4px;\n}\n\n.secondaryToolbarButton.firstPage::before {\n  content: url(images/secondaryToolbarButton-firstPage.png);\n}\n\n.secondaryToolbarButton.lastPage::before {\n  content: url(images/secondaryToolbarButton-lastPage.png);\n}\n\n.secondaryToolbarButton.rotateCcw::before {\n  content: url(images/secondaryToolbarButton-rotateCcw.png);\n}\n\n.secondaryToolbarButton.rotateCw::before {\n  content: url(images/secondaryToolbarButton-rotateCw.png);\n}\n\n.secondaryToolbarButton.selectTool::before {\n  content: url(images/secondaryToolbarButton-selectTool.png);\n}\n\n.secondaryToolbarButton.handTool::before {\n  content: url(images/secondaryToolbarButton-handTool.png);\n}\n\n.secondaryToolbarButton.documentProperties::before {\n  content: url(images/secondaryToolbarButton-documentProperties.png);\n}\n\n.verticalToolbarSeparator {\n  display: block;\n  padding: 8px 0;\n  margin: 8px 4px;\n  width: 1px;\n  background-color: hsla(0, 0%, 0%, 0.5);\n  box-shadow: 0 0 0 1px hsla(0, 0%, 100%, 0.08);\n}\n#mainPdfWarrper[dir=\"ltr\"] .verticalToolbarSeparator {\n  margin-left: 2px;\n}\n#mainPdfWarrper[dir=\"rtl\"] .verticalToolbarSeparator {\n  margin-right: 2px;\n}\n\n.horizontalToolbarSeparator {\n  display: block;\n  margin: 0 0 4px 0;\n  height: 1px;\n  width: 100%;\n  background-color: hsla(0, 0%, 0%, 0.5);\n  box-shadow: 0 0 0 1px hsla(0, 0%, 100%, 0.08);\n}\n\n.toolbarField {\n  padding: 3px 6px;\n  margin: 4px 0 4px 0;\n  border: 1px solid transparent;\n  border-radius: 2px;\n  background-color: hsla(0, 0%, 100%, 0.09);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  background-clip: padding-box;\n  border: 1px solid hsla(0, 0%, 0%, 0.35);\n  border-color: hsla(0, 0%, 0%, 0.32) hsla(0, 0%, 0%, 0.38)\n    hsla(0, 0%, 0%, 0.42);\n  box-shadow: 0 1px 0 hsla(0, 0%, 0%, 0.05) inset,\n    0 1px 0 hsla(0, 0%, 100%, 0.05);\n  color: hsl(0, 0%, 95%);\n  font-size: 12px;\n  line-height: 14px;\n  outline-style: none;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 150ms;\n  transition-timing-function: ease;\n}\n\n.toolbarField[type=\"checkbox\"] {\n  display: inline-block;\n  margin: 8px 0px;\n}\n\n.toolbarField.pageNumber {\n  -moz-appearance: textfield; /* hides the spinner in moz */\n  min-width: 16px;\n  text-align: right;\n  width: 40px;\n}\n\n.toolbarField.pageNumber.visiblePageIsLoading {\n  background-image: url(images/loading-small.png);\n  background-repeat: no-repeat;\n  background-position: 1px;\n}\n\n.toolbarField.pageNumber::-webkit-inner-spin-button,\n.toolbarField.pageNumber::-webkit-outer-spin-button {\n  -webkit-appearance: none;\n  margin: 0;\n}\n\n.toolbarField:hover {\n  background-color: hsla(0, 0%, 100%, 0.11);\n  border-color: hsla(0, 0%, 0%, 0.4) hsla(0, 0%, 0%, 0.43) hsla(0, 0%, 0%, 0.45);\n}\n\n.toolbarField:focus {\n  background-color: hsla(0, 0%, 100%, 0.15);\n  border-color: hsla(204, 100%, 65%, 0.8) hsla(204, 100%, 65%, 0.85)\n    hsla(204, 100%, 65%, 0.9);\n}\n\n.toolbarLabel {\n  min-width: 16px;\n  padding: 3px 6px 3px 2px;\n  margin: 4px 2px 4px 0;\n  border: 1px solid transparent;\n  border-radius: 2px;\n  color: hsl(0, 0%, 85%);\n  font-size: 12px;\n  line-height: 14px;\n  text-align: left;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  cursor: default;\n}\n\n#thumbnailView {\n  position: absolute;\n  width: 120px;\n  top: 0;\n  bottom: 0;\n  padding: 10px 40px 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n.thumbnail {\n  float: left;\n  margin-bottom: 5px;\n}\n\n#thumbnailView > a:last-of-type > .thumbnail {\n  margin-bottom: 10px;\n}\n\n#thumbnailView > a:last-of-type > .thumbnail:not([data-loaded]) {\n  margin-bottom: 9px;\n}\n\n.thumbnail:not([data-loaded]) {\n  border: 1px dashed rgba(255, 255, 255, 0.5);\n  margin: -1px -1px 4px -1px;\n}\n\n.thumbnailImage {\n  border: 1px solid transparent;\n  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);\n  opacity: 0.8;\n  z-index: 99;\n  background-color: white;\n  background-clip: content-box;\n}\n\n.thumbnailSelectionRing {\n  border-radius: 2px;\n  padding: 7px;\n}\n\na:focus > .thumbnail > .thumbnailSelectionRing > .thumbnailImage,\n.thumbnail:hover > .thumbnailSelectionRing > .thumbnailImage {\n  opacity: 0.9;\n}\n\na:focus > .thumbnail > .thumbnailSelectionRing,\n.thumbnail:hover > .thumbnailSelectionRing {\n  background-color: hsla(0, 0%, 100%, 0.15);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  background-clip: padding-box;\n  box-shadow: 0 1px 0 hsla(0, 0%, 100%, 0.05) inset,\n    0 0 1px hsla(0, 0%, 100%, 0.2) inset, 0 0 1px hsla(0, 0%, 0%, 0.2);\n  color: hsla(0, 0%, 100%, 0.9);\n}\n\n.thumbnail.selected > .thumbnailSelectionRing > .thumbnailImage {\n  box-shadow: 0 0 0 1px hsla(0, 0%, 0%, 0.5);\n  opacity: 1;\n}\n\n.thumbnail.selected > .thumbnailSelectionRing {\n  background-color: hsla(0, 0%, 100%, 0.3);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  background-clip: padding-box;\n  box-shadow: 0 1px 0 hsla(0, 0%, 100%, 0.05) inset,\n    0 0 1px hsla(0, 0%, 100%, 0.1) inset, 0 0 1px hsla(0, 0%, 0%, 0.2);\n  color: hsla(0, 0%, 100%, 1);\n}\n\n#outlineView,\n#attachmentsView {\n  position: absolute;\n  width: 192px;\n  top: 0;\n  bottom: 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n}\n\n#outlineView {\n  padding: 4px 4px 0;\n}\n#attachmentsView {\n  padding: 3px 4px 0;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .outlineWithDeepNesting > .outlineItem,\n#mainPdfWarrper[dir=\"ltr\"] .outlineItem > .outlineItems {\n  margin-left: 20px;\n}\n\n#mainPdfWarrper[dir=\"rtl\"] .outlineWithDeepNesting > .outlineItem,\n#mainPdfWarrper[dir=\"rtl\"] .outlineItem > .outlineItems {\n  margin-right: 20px;\n}\n\n.outlineItem > a,\n.attachmentsItem > button {\n  text-decoration: none;\n  display: inline-block;\n  min-width: 95%;\n  min-width: calc(\n    100% - 4px\n  ); /* Subtract the right padding (left, in RTL mode)\n                                  of the container. */\n  height: auto;\n  margin-bottom: 1px;\n  border-radius: 2px;\n  color: hsla(0, 0%, 100%, 0.8);\n  font-size: 13px;\n  line-height: 15px;\n  -moz-user-select: none;\n  white-space: normal;\n}\n\n.attachmentsItem > button {\n  border: 0 none;\n  background: none;\n  cursor: pointer;\n  width: 100%;\n}\n\n#mainPdfWarrper[dir=\"ltr\"] .outlineItem > a {\n  padding: 2px 0 5px 4px;\n}\n#mainPdfWarrper[dir=\"ltr\"] .attachmentsItem > button {\n  padding: 2px 0 3px 7px;\n  text-align: left;\n}\n\n#mainPdfWarrper[dir=\"rtl\"] .outlineItem > a {\n  padding: 2px 4px 5px 0;\n}\n#mainPdfWarrper[dir=\"rtl\"] .attachmentsItem > button {\n  padding: 2px 7px 3px 0;\n  text-align: right;\n}\n\n.outlineItemToggler {\n  position: relative;\n  height: 0;\n  width: 0;\n  color: hsla(0, 0%, 100%, 0.5);\n}\n.outlineItemToggler::before {\n  content: url(images/treeitem-expanded.png);\n  display: inline-block;\n  position: absolute;\n}\n#mainPdfWarrper[dir=\"ltr\"] .outlineItemToggler.outlineItemsHidden::before {\n  content: url(images/treeitem-collapsed.png);\n}\n#mainPdfWarrper[dir=\"rtl\"] .outlineItemToggler.outlineItemsHidden::before {\n  content: url(images/treeitem-collapsed-rtl.png);\n}\n.outlineItemToggler.outlineItemsHidden ~ .outlineItems {\n  display: none;\n}\n#mainPdfWarrper[dir=\"ltr\"] .outlineItemToggler {\n  float: left;\n}\n#mainPdfWarrper[dir=\"rtl\"] .outlineItemToggler {\n  float: right;\n}\n#mainPdfWarrper[dir=\"ltr\"] .outlineItemToggler::before {\n  right: 4px;\n}\n#mainPdfWarrper[dir=\"rtl\"] .outlineItemToggler::before {\n  left: 4px;\n}\n\n.outlineItemToggler:hover,\n.outlineItemToggler:hover + a,\n.outlineItemToggler:hover ~ .outlineItems,\n.outlineItem > a:hover,\n.attachmentsItem > button:hover {\n  background-color: hsla(0, 0%, 100%, 0.02);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  background-clip: padding-box;\n  box-shadow: 0 1px 0 hsla(0, 0%, 100%, 0.05) inset,\n    0 0 1px hsla(0, 0%, 100%, 0.2) inset, 0 0 1px hsla(0, 0%, 0%, 0.2);\n  border-radius: 2px;\n  color: hsla(0, 0%, 100%, 0.9);\n}\n\n.outlineItem.selected {\n  background-color: hsla(0, 0%, 100%, 0.08);\n  background-image: linear-gradient(\n    hsla(0, 0%, 100%, 0.05),\n    hsla(0, 0%, 100%, 0)\n  );\n  background-clip: padding-box;\n  box-shadow: 0 1px 0 hsla(0, 0%, 100%, 0.05) inset,\n    0 0 1px hsla(0, 0%, 100%, 0.1) inset, 0 0 1px hsla(0, 0%, 0%, 0.2);\n  color: hsla(0, 0%, 100%, 1);\n}\n\n.noResults {\n  font-size: 12px;\n  color: hsla(0, 0%, 100%, 0.8);\n  font-style: italic;\n  cursor: default;\n}\n\n/* TODO: file FF bug to support ::-moz-selection:window-inactive\n   so we can override the opaque grey background when the window is inactive;\n   see https://bugzilla.mozilla.org/show_bug.cgi?id=706209 */\n::selection {\n  background: rgba(0, 0, 255, 0.3);\n}\n::-moz-selection {\n  background: rgba(0, 0, 255, 0.3);\n}\n\n#errorWrapper {\n  background: none repeat scroll 0 0 #ff5555;\n  color: white;\n  left: 0;\n  position: absolute;\n  right: 0;\n  z-index: 1000;\n  padding: 3px;\n  font-size: 0.8em;\n}\n.loadingInProgress #errorWrapper {\n  top: 37px;\n}\n\n#errorMessageLeft {\n  float: left;\n}\n\n#errorMessageRight {\n  float: right;\n}\n\n#errorMoreInfo {\n  background-color: #ffffff;\n  color: black;\n  padding: 3px;\n  margin: 3px;\n  width: 98%;\n}\n\n.overlayButton {\n  width: auto;\n  margin: 3px 4px 2px 4px !important;\n  padding: 2px 6px 3px 6px;\n}\n\n#overlayContainer {\n  display: table;\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  background-color: hsla(0, 0%, 0%, 0.2);\n  z-index: 40000;\n}\n#overlayContainer > * {\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n#overlayContainer > .container {\n  display: table-cell;\n  vertical-align: middle;\n  text-align: center;\n}\n\n#overlayContainer > .container > .dialog {\n  display: inline-block;\n  padding: 15px;\n  border-spacing: 4px;\n  color: hsl(0, 0%, 85%);\n  font-size: 12px;\n  line-height: 14px;\n  background-color: #474747; /* fallback */\n  background-image: url(images/texture.png),\n    linear-gradient(hsla(0, 0%, 32%, 0.99), hsla(0, 0%, 27%, 0.95));\n  box-shadow: inset 1px 0 0 hsla(0, 0%, 100%, 0.08),\n    inset 0 1px 1px hsla(0, 0%, 0%, 0.15),\n    inset 0 -1px 0 hsla(0, 0%, 100%, 0.05), 0 1px 0 hsla(0, 0%, 0%, 0.15),\n    0 1px 1px hsla(0, 0%, 0%, 0.1);\n  border: 1px solid hsla(0, 0%, 0%, 0.5);\n  border-radius: 4px;\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n\n.dialog > .row {\n  display: table-row;\n}\n\n.dialog > .row > * {\n  display: table-cell;\n}\n\n.dialog .toolbarField {\n  margin: 5px 0;\n}\n\n.dialog .separator {\n  display: block;\n  margin: 4px 0 4px 0;\n  height: 1px;\n  width: 100%;\n  background-color: hsla(0, 0%, 0%, 0.5);\n  box-shadow: 0 0 0 1px hsla(0, 0%, 100%, 0.08);\n}\n\n.dialog .buttonRow {\n  text-align: center;\n  vertical-align: middle;\n}\n\n.dialog :link {\n  color: white;\n}\n\n#passwordOverlay > .dialog {\n  text-align: center;\n}\n#passwordOverlay .toolbarField {\n  width: 200px;\n}\n\n#documentPropertiesOverlay > .dialog {\n  text-align: left;\n}\n#documentPropertiesOverlay .row > * {\n  min-width: 100px;\n}\n#mainPdfWarrper[dir=\"ltr\"] #documentPropertiesOverlay .row > * {\n  text-align: left;\n}\n#mainPdfWarrper[dir=\"rtl\"] #documentPropertiesOverlay .row > * {\n  text-align: right;\n}\n#documentPropertiesOverlay .row > span {\n  width: 125px;\n  word-wrap: break-word;\n}\n#documentPropertiesOverlay .row > p {\n  max-width: 225px;\n  word-wrap: break-word;\n}\n#documentPropertiesOverlay .buttonRow {\n  margin-top: 10px;\n}\n\n.clearBoth {\n  clear: both;\n}\n\n.fileInput {\n  background: white;\n  color: black;\n  margin-top: 5px;\n  visibility: hidden;\n  position: fixed;\n  right: 0;\n  top: 0;\n}\n\n#PDFBug {\n  background: none repeat scroll 0 0 white;\n  border: 1px solid #666666;\n  position: fixed;\n  top: 32px;\n  right: 0;\n  bottom: 0;\n  font-size: 10px;\n  padding: 0;\n  width: 300px;\n}\n#PDFBug .controls {\n  background: #eeeeee;\n  border-bottom: 1px solid #666666;\n  padding: 3px;\n}\n#PDFBug .panels {\n  bottom: 0;\n  left: 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  position: absolute;\n  right: 0;\n  top: 27px;\n}\n#PDFBug button.active {\n  font-weight: bold;\n}\n.debuggerShowText {\n  background: none repeat scroll 0 0 yellow;\n  color: blue;\n}\n.debuggerHideText:hover {\n  background: none repeat scroll 0 0 yellow;\n}\n#PDFBug .stats {\n  font-family: courier;\n  font-size: 10px;\n  white-space: pre;\n}\n#PDFBug .stats .title {\n  font-weight: bold;\n}\n#PDFBug table {\n  font-size: 10px;\n}\n\n#viewer.textLayer-visible .textLayer {\n  opacity: 1;\n}\n\n#viewer.textLayer-visible .canvasWrapper {\n  background-color: rgb(128, 255, 128);\n}\n\n#viewer.textLayer-visible .canvasWrapper canvas {\n  mix-blend-mode: screen;\n}\n\n#viewer.textLayer-visible .textLayer > div {\n  background-color: rgba(255, 255, 0, 0.1);\n  color: black;\n  border: solid 1px rgba(255, 0, 0, 0.5);\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n\n#viewer.textLayer-hover .textLayer > div:hover {\n  background-color: white;\n  color: black;\n}\n\n#viewer.textLayer-shadow .textLayer > div {\n  background-color: rgba(255, 255, 255, 0.6);\n  color: black;\n}\n\n.grab-to-pan-grab {\n  cursor: url(\"images/grab.cur\"), move !important;\n  cursor: -webkit-grab !important;\n  cursor: -moz-grab !important;\n  cursor: grab !important;\n}\n.grab-to-pan-grab\n  *:not(input):not(textarea):not(button):not(select):not(:link) {\n  cursor: inherit !important;\n}\n.grab-to-pan-grab:active,\n.grab-to-pan-grabbing {\n  cursor: url(\"images/grabbing.cur\"), move !important;\n  cursor: -webkit-grabbing !important;\n  cursor: -moz-grabbing !important;\n  cursor: grabbing !important;\n\n  position: fixed;\n  background: transparent;\n  display: block;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  overflow: hidden;\n  z-index: 50000; /* should be higher than anything else in PDF.js! */\n}\n\n@page {\n  margin: 0;\n}\n\n#printContainer {\n  display: none;\n}\n\n@media screen and (min-resolution: 2dppx) {\n  /* Rules for Retina screens */\n  .toolbarButton::before {\n    -webkit-transform: scale(0.5);\n    transform: scale(0.5);\n    top: -5px;\n  }\n\n  .secondaryToolbarButton::before {\n    -webkit-transform: scale(0.5);\n    transform: scale(0.5);\n    top: -4px;\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] .toolbarButton::before,\n  #mainPdfWarrper[dir=\"rtl\"] .toolbarButton::before {\n    left: -1px;\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] .secondaryToolbarButton::before {\n    left: -2px;\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .secondaryToolbarButton::before {\n    left: 186px;\n  }\n\n  .toolbarField.pageNumber.visiblePageIsLoading,\n  #findInput[data-status=\"pending\"] {\n    background-image: url(images/loading-small@2x.png);\n    background-size: 16px 17px;\n  }\n\n  .dropdownToolbarButton {\n    background: url(images/toolbarButton-menuArrows@2x.png) no-repeat;\n    background-size: 7px 16px;\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] .toolbarButton#sidebarToggle::before {\n    content: url(images/toolbarButton-sidebarToggle@2x.png);\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .toolbarButton#sidebarToggle::before {\n    content: url(images/toolbarButton-sidebarToggle-rtl@2x.png);\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] .toolbarButton#secondaryToolbarToggle::before {\n    content: url(images/toolbarButton-secondaryToolbarToggle@2x.png);\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .toolbarButton#secondaryToolbarToggle::before {\n    content: url(images/toolbarButton-secondaryToolbarToggle-rtl@2x.png);\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] .toolbarButton.findPrevious::before {\n    content: url(images/findbarButton-previous@2x.png);\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .toolbarButton.findPrevious::before {\n    content: url(images/findbarButton-previous-rtl@2x.png);\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] .toolbarButton.findNext::before {\n    content: url(images/findbarButton-next@2x.png);\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .toolbarButton.findNext::before {\n    content: url(images/findbarButton-next-rtl@2x.png);\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] .toolbarButton.pageUp::before {\n    content: url(images/toolbarButton-pageUp@2x.png);\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .toolbarButton.pageUp::before {\n    content: url(images/toolbarButton-pageUp-rtl@2x.png);\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] .toolbarButton.pageDown::before {\n    content: url(images/toolbarButton-pageDown@2x.png);\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .toolbarButton.pageDown::before {\n    content: url(images/toolbarButton-pageDown-rtl@2x.png);\n  }\n\n  .toolbarButton.zoomIn::before {\n    content: url(images/toolbarButton-zoomIn@2x.png);\n  }\n\n  .toolbarButton.zoomOut::before {\n    content: url(images/toolbarButton-zoomOut@2x.png);\n  }\n\n  .toolbarButton.presentationMode::before,\n  .secondaryToolbarButton.presentationMode::before {\n    content: url(images/toolbarButton-presentationMode@2x.png);\n  }\n\n  .toolbarButton.print::before,\n  .secondaryToolbarButton.print::before {\n    content: url(images/toolbarButton-print@2x.png);\n  }\n\n  .toolbarButton.openFile::before,\n  .secondaryToolbarButton.openFile::before {\n    content: url(images/toolbarButton-openFile@2x.png);\n  }\n\n  .toolbarButton.download::before,\n  .secondaryToolbarButton.download::before {\n    content: url(images/toolbarButton-download@2x.png);\n  }\n\n  .toolbarButton.bookmark::before,\n  .secondaryToolbarButton.bookmark::before {\n    content: url(images/toolbarButton-bookmark@2x.png);\n  }\n\n  #viewThumbnail.toolbarButton::before {\n    content: url(images/toolbarButton-viewThumbnail@2x.png);\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] #viewOutline.toolbarButton::before {\n    content: url(images/toolbarButton-viewOutline@2x.png);\n  }\n  #mainPdfWarrper[dir=\"rtl\"] #viewOutline.toolbarButton::before {\n    content: url(images/toolbarButton-viewOutline-rtl@2x.png);\n  }\n\n  #viewAttachments.toolbarButton::before {\n    content: url(images/toolbarButton-viewAttachments@2x.png);\n  }\n\n  #viewFind.toolbarButton::before {\n    content: url(images/toolbarButton-search@2x.png);\n  }\n\n  .secondaryToolbarButton.firstPage::before {\n    content: url(images/secondaryToolbarButton-firstPage@2x.png);\n  }\n\n  .secondaryToolbarButton.lastPage::before {\n    content: url(images/secondaryToolbarButton-lastPage@2x.png);\n  }\n\n  .secondaryToolbarButton.rotateCcw::before {\n    content: url(images/secondaryToolbarButton-rotateCcw@2x.png);\n  }\n\n  .secondaryToolbarButton.rotateCw::before {\n    content: url(images/secondaryToolbarButton-rotateCw@2x.png);\n  }\n\n  .secondaryToolbarButton.selectTool::before {\n    content: url(images/secondaryToolbarButton-selectTool@2x.png);\n  }\n\n  .secondaryToolbarButton.handTool::before {\n    content: url(images/secondaryToolbarButton-handTool@2x.png);\n  }\n\n  .secondaryToolbarButton.documentProperties::before {\n    content: url(images/secondaryToolbarButton-documentProperties@2x.png);\n  }\n\n  .outlineItemToggler::before {\n    -webkit-transform: scale(0.5);\n    transform: scale(0.5);\n    top: -1px;\n    content: url(images/treeitem-expanded@2x.png);\n  }\n  #mainPdfWarrper[dir=\"ltr\"] .outlineItemToggler.outlineItemsHidden::before {\n    content: url(images/treeitem-collapsed@2x.png);\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .outlineItemToggler.outlineItemsHidden::before {\n    content: url(images/treeitem-collapsed-rtl@2x.png);\n  }\n  #mainPdfWarrper[dir=\"ltr\"] .outlineItemToggler::before {\n    right: 0;\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .outlineItemToggler::before {\n    left: 0;\n  }\n}\n\n@media print {\n  /* General rules for printing. */\n  #mainPdfWarrper {\n    background: transparent none;\n  }\n\n  /* Rules for browsers that don't support mozPrintCallback. */\n  #sidebarContainer,\n  #secondaryToolbar,\n  .toolbar,\n  #loadingBox,\n  #errorWrapper,\n  .textLayer {\n    display: none;\n  }\n  #viewerContainer {\n    overflow: visible;\n  }\n\n  #mainContainer,\n  #viewerContainer,\n  .page,\n  .page canvas {\n    position: static;\n    padding: 0;\n    margin: 0;\n  }\n\n  .page {\n    float: left;\n    display: none;\n    border: none;\n    box-shadow: none;\n    background-clip: content-box;\n    background-color: white;\n  }\n\n  .page[data-loaded] {\n    display: block;\n  }\n\n  .fileInput {\n    display: none;\n  }\n\n  /* Rules for browsers that support PDF.js printing */\n  #mainPdfWarrper[data-pdfjsprinting] #outerContainer {\n    display: none;\n  }\n  #mainPdfWarrper[data-pdfjsprinting] #printContainer {\n    display: block;\n  }\n  #printContainer {\n    height: 100%;\n  }\n  /* wrapper around (scaled) print canvas elements */\n  #printContainer > div {\n    position: relative;\n    top: 0;\n    left: 0;\n    width: 1px;\n    height: 1px;\n    overflow: visible;\n    page-break-after: always;\n    page-break-inside: avoid;\n  }\n  #printContainer canvas,\n  #printContainer img {\n    display: block;\n  }\n}\n\n.visibleLargeView,\n.visibleMediumView,\n.visibleSmallView {\n  display: none;\n}\n\n@media all and (max-width: 1040px) {\n  #outerContainer.sidebarMoving #toolbarViewerMiddle,\n  #outerContainer.sidebarOpen #toolbarViewerMiddle {\n    display: table;\n    margin: auto;\n    left: auto;\n    position: inherit;\n    transform: none;\n  }\n}\n\n@media all and (max-width: 980px) {\n  .sidebarMoving .hiddenLargeView,\n  .sidebarOpen .hiddenLargeView {\n    display: none;\n  }\n  .sidebarMoving .visibleLargeView,\n  .sidebarOpen .visibleLargeView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 900px) {\n  #toolbarViewerMiddle {\n    display: table;\n    margin: auto;\n    left: auto;\n    position: inherit;\n    transform: none;\n  }\n  .sidebarMoving .hiddenMediumView,\n  .sidebarOpen .hiddenMediumView {\n    display: none;\n  }\n  .sidebarMoving .visibleMediumView,\n  .sidebarOpen .visibleMediumView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 840px) {\n  #sidebarContainer {\n    top: 32px;\n    z-index: 100;\n  }\n  .loadingInProgress #sidebarContainer {\n    top: 37px;\n  }\n  #sidebarContent {\n    top: 32px;\n    background-color: hsla(0, 0%, 0%, 0.7);\n  }\n\n  #mainPdfWarrper[dir=\"ltr\"] #outerContainer.sidebarOpen > #mainContainer {\n    left: 0px;\n  }\n  #mainPdfWarrper[dir=\"rtl\"] #outerContainer.sidebarOpen > #mainContainer {\n    right: 0px;\n  }\n\n  #outerContainer .hiddenLargeView,\n  #outerContainer .hiddenMediumView {\n    display: inherit;\n  }\n  #outerContainer .visibleLargeView,\n  #outerContainer .visibleMediumView {\n    display: none;\n  }\n}\n\n@media all and (max-width: 770px) {\n  #outerContainer .hiddenLargeView {\n    display: none;\n  }\n  #outerContainer .visibleLargeView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 700px) {\n  #outerContainer .hiddenMediumView {\n    display: none;\n  }\n  #outerContainer .visibleMediumView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 640px) {\n  .hiddenSmallView,\n  .hiddenSmallView * {\n    display: none;\n  }\n  .visibleSmallView {\n    display: inherit;\n  }\n  .toolbarButtonSpacer {\n    width: 0;\n  }\n  #mainPdfWarrper[dir=\"ltr\"] .findbar {\n    left: 38px;\n  }\n  #mainPdfWarrper[dir=\"rtl\"] .findbar {\n    right: 38px;\n  }\n}\n\n@media all and (max-width: 535px) {\n  #scaleSelectContainer {\n    display: none;\n  }\n}\n"
  },
  {
    "path": "pages/include/pdf/pdf.worker.js",
    "content": "/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"pdfjs-dist/build/pdf.worker\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"pdfjs-dist/build/pdf.worker\"] = factory();\n\telse\n\t\troot[\"pdfjs-dist/build/pdf.worker\"] = root.pdfjsDistBuildPdfWorker = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __w_pdfjs_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__w_pdfjs_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__w_pdfjs_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__w_pdfjs_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__w_pdfjs_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__w_pdfjs_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__w_pdfjs_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__w_pdfjs_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__w_pdfjs_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__w_pdfjs_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __w_pdfjs_require__(__w_pdfjs_require__.s = 35);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.unreachable = exports.warn = exports.utf8StringToString = exports.stringToUTF8String = exports.stringToPDFString = exports.stringToBytes = exports.string32 = exports.shadow = exports.setVerbosityLevel = exports.ReadableStream = exports.removeNullCharacters = exports.readUint32 = exports.readUint16 = exports.readInt8 = exports.log2 = exports.loadJpegStream = exports.isEvalSupported = exports.isLittleEndian = exports.createValidAbsoluteUrl = exports.isSameOrigin = exports.isNodeJS = exports.isSpace = exports.isString = exports.isNum = exports.isInt = exports.isEmptyObj = exports.isBool = exports.isArrayBuffer = exports.isArray = exports.info = exports.globalScope = exports.getVerbosityLevel = exports.getLookupTableFactory = exports.deprecated = exports.createObjectURL = exports.createPromiseCapability = exports.createBlob = exports.bytesToString = exports.assert = exports.arraysToBytes = exports.arrayByteLength = exports.FormatError = exports.XRefParseException = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.StatTimer = exports.PasswordResponses = exports.PasswordException = exports.PageViewport = exports.NotImplementedException = exports.NativeImageDecoding = exports.MissingPDFException = exports.MissingDataException = exports.MessageHandler = exports.InvalidPDFException = exports.AbortException = exports.CMapCompressionType = exports.ImageKind = exports.FontType = exports.AnnotationType = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.UNSUPPORTED_FEATURES = exports.VERBOSITY_LEVELS = exports.OPS = exports.IDENTITY_MATRIX = exports.FONT_IDENTITY_MATRIX = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n__w_pdfjs_require__(36);\n\nvar _streams_polyfill = __w_pdfjs_require__(37);\n\nvar globalScope = typeof window !== 'undefined' && window.Math === Math ? window : typeof global !== 'undefined' && global.Math === Math ? global : typeof self !== 'undefined' && self.Math === Math ? self : undefined;\nvar FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\nvar NativeImageDecoding = {\n  NONE: 'none',\n  DECODE: 'decode',\n  DISPLAY: 'display'\n};\nvar TextRenderingMode = {\n  FILL: 0,\n  STROKE: 1,\n  FILL_STROKE: 2,\n  INVISIBLE: 3,\n  FILL_ADD_TO_PATH: 4,\n  STROKE_ADD_TO_PATH: 5,\n  FILL_STROKE_ADD_TO_PATH: 6,\n  ADD_TO_PATH: 7,\n  FILL_STROKE_MASK: 3,\n  ADD_TO_PATH_FLAG: 4\n};\nvar ImageKind = {\n  GRAYSCALE_1BPP: 1,\n  RGB_24BPP: 2,\n  RGBA_32BPP: 3\n};\nvar AnnotationType = {\n  TEXT: 1,\n  LINK: 2,\n  FREETEXT: 3,\n  LINE: 4,\n  SQUARE: 5,\n  CIRCLE: 6,\n  POLYGON: 7,\n  POLYLINE: 8,\n  HIGHLIGHT: 9,\n  UNDERLINE: 10,\n  SQUIGGLY: 11,\n  STRIKEOUT: 12,\n  STAMP: 13,\n  CARET: 14,\n  INK: 15,\n  POPUP: 16,\n  FILEATTACHMENT: 17,\n  SOUND: 18,\n  MOVIE: 19,\n  WIDGET: 20,\n  SCREEN: 21,\n  PRINTERMARK: 22,\n  TRAPNET: 23,\n  WATERMARK: 24,\n  THREED: 25,\n  REDACT: 26\n};\nvar AnnotationFlag = {\n  INVISIBLE: 0x01,\n  HIDDEN: 0x02,\n  PRINT: 0x04,\n  NOZOOM: 0x08,\n  NOROTATE: 0x10,\n  NOVIEW: 0x20,\n  READONLY: 0x40,\n  LOCKED: 0x80,\n  TOGGLENOVIEW: 0x100,\n  LOCKEDCONTENTS: 0x200\n};\nvar AnnotationFieldFlag = {\n  READONLY: 0x0000001,\n  REQUIRED: 0x0000002,\n  NOEXPORT: 0x0000004,\n  MULTILINE: 0x0001000,\n  PASSWORD: 0x0002000,\n  NOTOGGLETOOFF: 0x0004000,\n  RADIO: 0x0008000,\n  PUSHBUTTON: 0x0010000,\n  COMBO: 0x0020000,\n  EDIT: 0x0040000,\n  SORT: 0x0080000,\n  FILESELECT: 0x0100000,\n  MULTISELECT: 0x0200000,\n  DONOTSPELLCHECK: 0x0400000,\n  DONOTSCROLL: 0x0800000,\n  COMB: 0x1000000,\n  RICHTEXT: 0x2000000,\n  RADIOSINUNISON: 0x2000000,\n  COMMITONSELCHANGE: 0x4000000\n};\nvar AnnotationBorderStyleType = {\n  SOLID: 1,\n  DASHED: 2,\n  BEVELED: 3,\n  INSET: 4,\n  UNDERLINE: 5\n};\nvar StreamType = {\n  UNKNOWN: 0,\n  FLATE: 1,\n  LZW: 2,\n  DCT: 3,\n  JPX: 4,\n  JBIG: 5,\n  A85: 6,\n  AHX: 7,\n  CCF: 8,\n  RL: 9\n};\nvar FontType = {\n  UNKNOWN: 0,\n  TYPE1: 1,\n  TYPE1C: 2,\n  CIDFONTTYPE0: 3,\n  CIDFONTTYPE0C: 4,\n  TRUETYPE: 5,\n  CIDFONTTYPE2: 6,\n  TYPE3: 7,\n  OPENTYPE: 8,\n  TYPE0: 9,\n  MMTYPE1: 10\n};\nvar VERBOSITY_LEVELS = {\n  errors: 0,\n  warnings: 1,\n  infos: 5\n};\nvar CMapCompressionType = {\n  NONE: 0,\n  BINARY: 1,\n  STREAM: 2\n};\nvar OPS = {\n  dependency: 1,\n  setLineWidth: 2,\n  setLineCap: 3,\n  setLineJoin: 4,\n  setMiterLimit: 5,\n  setDash: 6,\n  setRenderingIntent: 7,\n  setFlatness: 8,\n  setGState: 9,\n  save: 10,\n  restore: 11,\n  transform: 12,\n  moveTo: 13,\n  lineTo: 14,\n  curveTo: 15,\n  curveTo2: 16,\n  curveTo3: 17,\n  closePath: 18,\n  rectangle: 19,\n  stroke: 20,\n  closeStroke: 21,\n  fill: 22,\n  eoFill: 23,\n  fillStroke: 24,\n  eoFillStroke: 25,\n  closeFillStroke: 26,\n  closeEOFillStroke: 27,\n  endPath: 28,\n  clip: 29,\n  eoClip: 30,\n  beginText: 31,\n  endText: 32,\n  setCharSpacing: 33,\n  setWordSpacing: 34,\n  setHScale: 35,\n  setLeading: 36,\n  setFont: 37,\n  setTextRenderingMode: 38,\n  setTextRise: 39,\n  moveText: 40,\n  setLeadingMoveText: 41,\n  setTextMatrix: 42,\n  nextLine: 43,\n  showText: 44,\n  showSpacedText: 45,\n  nextLineShowText: 46,\n  nextLineSetSpacingShowText: 47,\n  setCharWidth: 48,\n  setCharWidthAndBounds: 49,\n  setStrokeColorSpace: 50,\n  setFillColorSpace: 51,\n  setStrokeColor: 52,\n  setStrokeColorN: 53,\n  setFillColor: 54,\n  setFillColorN: 55,\n  setStrokeGray: 56,\n  setFillGray: 57,\n  setStrokeRGBColor: 58,\n  setFillRGBColor: 59,\n  setStrokeCMYKColor: 60,\n  setFillCMYKColor: 61,\n  shadingFill: 62,\n  beginInlineImage: 63,\n  beginImageData: 64,\n  endInlineImage: 65,\n  paintXObject: 66,\n  markPoint: 67,\n  markPointProps: 68,\n  beginMarkedContent: 69,\n  beginMarkedContentProps: 70,\n  endMarkedContent: 71,\n  beginCompat: 72,\n  endCompat: 73,\n  paintFormXObjectBegin: 74,\n  paintFormXObjectEnd: 75,\n  beginGroup: 76,\n  endGroup: 77,\n  beginAnnotations: 78,\n  endAnnotations: 79,\n  beginAnnotation: 80,\n  endAnnotation: 81,\n  paintJpegXObject: 82,\n  paintImageMaskXObject: 83,\n  paintImageMaskXObjectGroup: 84,\n  paintImageXObject: 85,\n  paintInlineImageXObject: 86,\n  paintInlineImageXObjectGroup: 87,\n  paintImageXObjectRepeat: 88,\n  paintImageMaskXObjectRepeat: 89,\n  paintSolidColorImageMask: 90,\n  constructPath: 91\n};\nvar verbosity = VERBOSITY_LEVELS.warnings;\nfunction setVerbosityLevel(level) {\n  verbosity = level;\n}\nfunction getVerbosityLevel() {\n  return verbosity;\n}\nfunction info(msg) {\n  if (verbosity >= VERBOSITY_LEVELS.infos) {\n    console.log('Info: ' + msg);\n  }\n}\nfunction warn(msg) {\n  if (verbosity >= VERBOSITY_LEVELS.warnings) {\n    console.log('Warning: ' + msg);\n  }\n}\nfunction deprecated(details) {\n  console.log('Deprecated API usage: ' + details);\n}\nfunction unreachable(msg) {\n  throw new Error(msg);\n}\nfunction assert(cond, msg) {\n  if (!cond) {\n    unreachable(msg);\n  }\n}\nvar UNSUPPORTED_FEATURES = {\n  unknown: 'unknown',\n  forms: 'forms',\n  javaScript: 'javaScript',\n  smask: 'smask',\n  shadingPattern: 'shadingPattern',\n  font: 'font'\n};\nfunction isSameOrigin(baseUrl, otherUrl) {\n  try {\n    var base = new URL(baseUrl);\n    if (!base.origin || base.origin === 'null') {\n      return false;\n    }\n  } catch (e) {\n    return false;\n  }\n  var other = new URL(otherUrl, base);\n  return base.origin === other.origin;\n}\nfunction isValidProtocol(url) {\n  if (!url) {\n    return false;\n  }\n  switch (url.protocol) {\n    case 'http:':\n    case 'https:':\n    case 'ftp:':\n    case 'mailto:':\n    case 'tel:':\n      return true;\n    default:\n      return false;\n  }\n}\nfunction createValidAbsoluteUrl(url, baseUrl) {\n  if (!url) {\n    return null;\n  }\n  try {\n    var absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url);\n    if (isValidProtocol(absoluteUrl)) {\n      return absoluteUrl;\n    }\n  } catch (ex) {}\n  return null;\n}\nfunction shadow(obj, prop, value) {\n  Object.defineProperty(obj, prop, {\n    value: value,\n    enumerable: true,\n    configurable: true,\n    writable: false\n  });\n  return value;\n}\nfunction getLookupTableFactory(initializer) {\n  var lookup;\n  return function () {\n    if (initializer) {\n      lookup = Object.create(null);\n      initializer(lookup);\n      initializer = null;\n    }\n    return lookup;\n  };\n}\nvar PasswordResponses = {\n  NEED_PASSWORD: 1,\n  INCORRECT_PASSWORD: 2\n};\nvar PasswordException = function PasswordExceptionClosure() {\n  function PasswordException(msg, code) {\n    this.name = 'PasswordException';\n    this.message = msg;\n    this.code = code;\n  }\n  PasswordException.prototype = new Error();\n  PasswordException.constructor = PasswordException;\n  return PasswordException;\n}();\nvar UnknownErrorException = function UnknownErrorExceptionClosure() {\n  function UnknownErrorException(msg, details) {\n    this.name = 'UnknownErrorException';\n    this.message = msg;\n    this.details = details;\n  }\n  UnknownErrorException.prototype = new Error();\n  UnknownErrorException.constructor = UnknownErrorException;\n  return UnknownErrorException;\n}();\nvar InvalidPDFException = function InvalidPDFExceptionClosure() {\n  function InvalidPDFException(msg) {\n    this.name = 'InvalidPDFException';\n    this.message = msg;\n  }\n  InvalidPDFException.prototype = new Error();\n  InvalidPDFException.constructor = InvalidPDFException;\n  return InvalidPDFException;\n}();\nvar MissingPDFException = function MissingPDFExceptionClosure() {\n  function MissingPDFException(msg) {\n    this.name = 'MissingPDFException';\n    this.message = msg;\n  }\n  MissingPDFException.prototype = new Error();\n  MissingPDFException.constructor = MissingPDFException;\n  return MissingPDFException;\n}();\nvar UnexpectedResponseException = function UnexpectedResponseExceptionClosure() {\n  function UnexpectedResponseException(msg, status) {\n    this.name = 'UnexpectedResponseException';\n    this.message = msg;\n    this.status = status;\n  }\n  UnexpectedResponseException.prototype = new Error();\n  UnexpectedResponseException.constructor = UnexpectedResponseException;\n  return UnexpectedResponseException;\n}();\nvar NotImplementedException = function NotImplementedExceptionClosure() {\n  function NotImplementedException(msg) {\n    this.message = msg;\n  }\n  NotImplementedException.prototype = new Error();\n  NotImplementedException.prototype.name = 'NotImplementedException';\n  NotImplementedException.constructor = NotImplementedException;\n  return NotImplementedException;\n}();\nvar MissingDataException = function MissingDataExceptionClosure() {\n  function MissingDataException(begin, end) {\n    this.begin = begin;\n    this.end = end;\n    this.message = 'Missing data [' + begin + ', ' + end + ')';\n  }\n  MissingDataException.prototype = new Error();\n  MissingDataException.prototype.name = 'MissingDataException';\n  MissingDataException.constructor = MissingDataException;\n  return MissingDataException;\n}();\nvar XRefParseException = function XRefParseExceptionClosure() {\n  function XRefParseException(msg) {\n    this.message = msg;\n  }\n  XRefParseException.prototype = new Error();\n  XRefParseException.prototype.name = 'XRefParseException';\n  XRefParseException.constructor = XRefParseException;\n  return XRefParseException;\n}();\nvar FormatError = function FormatErrorClosure() {\n  function FormatError(msg) {\n    this.message = msg;\n  }\n  FormatError.prototype = new Error();\n  FormatError.prototype.name = 'FormatError';\n  FormatError.constructor = FormatError;\n  return FormatError;\n}();\nvar AbortException = function AbortExceptionClosure() {\n  function AbortException(msg) {\n    this.name = 'AbortException';\n    this.message = msg;\n  }\n  AbortException.prototype = new Error();\n  AbortException.constructor = AbortException;\n  return AbortException;\n}();\nvar NullCharactersRegExp = /\\x00/g;\nfunction removeNullCharacters(str) {\n  if (typeof str !== 'string') {\n    warn('The argument for removeNullCharacters must be a string.');\n    return str;\n  }\n  return str.replace(NullCharactersRegExp, '');\n}\nfunction bytesToString(bytes) {\n  assert(bytes !== null && (typeof bytes === 'undefined' ? 'undefined' : _typeof(bytes)) === 'object' && bytes.length !== undefined, 'Invalid argument for bytesToString');\n  var length = bytes.length;\n  var MAX_ARGUMENT_COUNT = 8192;\n  if (length < MAX_ARGUMENT_COUNT) {\n    return String.fromCharCode.apply(null, bytes);\n  }\n  var strBuf = [];\n  for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n    var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n    var chunk = bytes.subarray(i, chunkEnd);\n    strBuf.push(String.fromCharCode.apply(null, chunk));\n  }\n  return strBuf.join('');\n}\nfunction stringToBytes(str) {\n  assert(typeof str === 'string', 'Invalid argument for stringToBytes');\n  var length = str.length;\n  var bytes = new Uint8Array(length);\n  for (var i = 0; i < length; ++i) {\n    bytes[i] = str.charCodeAt(i) & 0xFF;\n  }\n  return bytes;\n}\nfunction arrayByteLength(arr) {\n  if (arr.length !== undefined) {\n    return arr.length;\n  }\n  assert(arr.byteLength !== undefined);\n  return arr.byteLength;\n}\nfunction arraysToBytes(arr) {\n  if (arr.length === 1 && arr[0] instanceof Uint8Array) {\n    return arr[0];\n  }\n  var resultLength = 0;\n  var i,\n      ii = arr.length;\n  var item, itemLength;\n  for (i = 0; i < ii; i++) {\n    item = arr[i];\n    itemLength = arrayByteLength(item);\n    resultLength += itemLength;\n  }\n  var pos = 0;\n  var data = new Uint8Array(resultLength);\n  for (i = 0; i < ii; i++) {\n    item = arr[i];\n    if (!(item instanceof Uint8Array)) {\n      if (typeof item === 'string') {\n        item = stringToBytes(item);\n      } else {\n        item = new Uint8Array(item);\n      }\n    }\n    itemLength = item.byteLength;\n    data.set(item, pos);\n    pos += itemLength;\n  }\n  return data;\n}\nfunction string32(value) {\n  return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);\n}\nfunction log2(x) {\n  var n = 1,\n      i = 0;\n  while (x > n) {\n    n <<= 1;\n    i++;\n  }\n  return i;\n}\nfunction readInt8(data, start) {\n  return data[start] << 24 >> 24;\n}\nfunction readUint16(data, offset) {\n  return data[offset] << 8 | data[offset + 1];\n}\nfunction readUint32(data, offset) {\n  return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0;\n}\nfunction isLittleEndian() {\n  var buffer8 = new Uint8Array(4);\n  buffer8[0] = 1;\n  var view32 = new Uint32Array(buffer8.buffer, 0, 1);\n  return view32[0] === 1;\n}\nfunction isEvalSupported() {\n  try {\n    new Function('');\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\nvar IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];\nvar Util = function UtilClosure() {\n  function Util() {}\n  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];\n  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {\n    rgbBuf[1] = r;\n    rgbBuf[3] = g;\n    rgbBuf[5] = b;\n    return rgbBuf.join('');\n  };\n  Util.transform = function Util_transform(m1, m2) {\n    return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]];\n  };\n  Util.applyTransform = function Util_applyTransform(p, m) {\n    var xt = p[0] * m[0] + p[1] * m[2] + m[4];\n    var yt = p[0] * m[1] + p[1] * m[3] + m[5];\n    return [xt, yt];\n  };\n  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n    return [xt, yt];\n  };\n  Util.getAxialAlignedBoundingBox = function Util_getAxialAlignedBoundingBox(r, m) {\n    var p1 = Util.applyTransform(r, m);\n    var p2 = Util.applyTransform(r.slice(2, 4), m);\n    var p3 = Util.applyTransform([r[0], r[3]], m);\n    var p4 = Util.applyTransform([r[2], r[1]], m);\n    return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])];\n  };\n  Util.inverseTransform = function Util_inverseTransform(m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];\n  };\n  Util.apply3dTransform = function Util_apply3dTransform(m, v) {\n    return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]];\n  };\n  Util.singularValueDecompose2dScale = function Util_singularValueDecompose2dScale(m) {\n    var transpose = [m[0], m[2], m[1], m[3]];\n    var a = m[0] * transpose[0] + m[1] * transpose[2];\n    var b = m[0] * transpose[1] + m[1] * transpose[3];\n    var c = m[2] * transpose[0] + m[3] * transpose[2];\n    var d = m[2] * transpose[1] + m[3] * transpose[3];\n    var first = (a + d) / 2;\n    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;\n    var sx = first + second || 1;\n    var sy = first - second || 1;\n    return [Math.sqrt(sx), Math.sqrt(sy)];\n  };\n  Util.normalizeRect = function Util_normalizeRect(rect) {\n    var r = rect.slice(0);\n    if (rect[0] > rect[2]) {\n      r[0] = rect[2];\n      r[2] = rect[0];\n    }\n    if (rect[1] > rect[3]) {\n      r[1] = rect[3];\n      r[3] = rect[1];\n    }\n    return r;\n  };\n  Util.intersect = function Util_intersect(rect1, rect2) {\n    function compare(a, b) {\n      return a - b;\n    }\n    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),\n        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),\n        result = [];\n    rect1 = Util.normalizeRect(rect1);\n    rect2 = Util.normalizeRect(rect2);\n    if (orderedX[0] === rect1[0] && orderedX[1] === rect2[0] || orderedX[0] === rect2[0] && orderedX[1] === rect1[0]) {\n      result[0] = orderedX[1];\n      result[2] = orderedX[2];\n    } else {\n      return false;\n    }\n    if (orderedY[0] === rect1[1] && orderedY[1] === rect2[1] || orderedY[0] === rect2[1] && orderedY[1] === rect1[1]) {\n      result[1] = orderedY[1];\n      result[3] = orderedY[2];\n    } else {\n      return false;\n    }\n    return result;\n  };\n  Util.sign = function Util_sign(num) {\n    return num < 0 ? -1 : 1;\n  };\n  var ROMAN_NUMBER_MAP = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'];\n  Util.toRoman = function Util_toRoman(number, lowerCase) {\n    assert(isInt(number) && number > 0, 'The number should be a positive integer.');\n    var pos,\n        romanBuf = [];\n    while (number >= 1000) {\n      number -= 1000;\n      romanBuf.push('M');\n    }\n    pos = number / 100 | 0;\n    number %= 100;\n    romanBuf.push(ROMAN_NUMBER_MAP[pos]);\n    pos = number / 10 | 0;\n    number %= 10;\n    romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]);\n    romanBuf.push(ROMAN_NUMBER_MAP[20 + number]);\n    var romanStr = romanBuf.join('');\n    return lowerCase ? romanStr.toLowerCase() : romanStr;\n  };\n  Util.appendToArray = function Util_appendToArray(arr1, arr2) {\n    Array.prototype.push.apply(arr1, arr2);\n  };\n  Util.prependToArray = function Util_prependToArray(arr1, arr2) {\n    Array.prototype.unshift.apply(arr1, arr2);\n  };\n  Util.extendObj = function extendObj(obj1, obj2) {\n    for (var key in obj2) {\n      obj1[key] = obj2[key];\n    }\n  };\n  Util.getInheritableProperty = function Util_getInheritableProperty(dict, name, getArray) {\n    while (dict && !dict.has(name)) {\n      dict = dict.get('Parent');\n    }\n    if (!dict) {\n      return null;\n    }\n    return getArray ? dict.getArray(name) : dict.get(name);\n  };\n  Util.inherit = function Util_inherit(sub, base, prototype) {\n    sub.prototype = Object.create(base.prototype);\n    sub.prototype.constructor = sub;\n    for (var prop in prototype) {\n      sub.prototype[prop] = prototype[prop];\n    }\n  };\n  Util.loadScript = function Util_loadScript(src, callback) {\n    var script = document.createElement('script');\n    var loaded = false;\n    script.setAttribute('src', src);\n    if (callback) {\n      script.onload = function () {\n        if (!loaded) {\n          callback();\n        }\n        loaded = true;\n      };\n    }\n    document.getElementsByTagName('head')[0].appendChild(script);\n  };\n  return Util;\n}();\nvar PageViewport = function PageViewportClosure() {\n  function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) {\n    this.viewBox = viewBox;\n    this.scale = scale;\n    this.rotation = rotation;\n    this.offsetX = offsetX;\n    this.offsetY = offsetY;\n    var centerX = (viewBox[2] + viewBox[0]) / 2;\n    var centerY = (viewBox[3] + viewBox[1]) / 2;\n    var rotateA, rotateB, rotateC, rotateD;\n    rotation = rotation % 360;\n    rotation = rotation < 0 ? rotation + 360 : rotation;\n    switch (rotation) {\n      case 180:\n        rotateA = -1;\n        rotateB = 0;\n        rotateC = 0;\n        rotateD = 1;\n        break;\n      case 90:\n        rotateA = 0;\n        rotateB = 1;\n        rotateC = 1;\n        rotateD = 0;\n        break;\n      case 270:\n        rotateA = 0;\n        rotateB = -1;\n        rotateC = -1;\n        rotateD = 0;\n        break;\n      default:\n        rotateA = 1;\n        rotateB = 0;\n        rotateC = 0;\n        rotateD = -1;\n        break;\n    }\n    if (dontFlip) {\n      rotateC = -rotateC;\n      rotateD = -rotateD;\n    }\n    var offsetCanvasX, offsetCanvasY;\n    var width, height;\n    if (rotateA === 0) {\n      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;\n      width = Math.abs(viewBox[3] - viewBox[1]) * scale;\n      height = Math.abs(viewBox[2] - viewBox[0]) * scale;\n    } else {\n      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;\n      width = Math.abs(viewBox[2] - viewBox[0]) * scale;\n      height = Math.abs(viewBox[3] - viewBox[1]) * scale;\n    }\n    this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY];\n    this.width = width;\n    this.height = height;\n    this.fontScale = scale;\n  }\n  PageViewport.prototype = {\n    clone: function PageViewPort_clone(args) {\n      args = args || {};\n      var scale = 'scale' in args ? args.scale : this.scale;\n      var rotation = 'rotation' in args ? args.rotation : this.rotation;\n      return new PageViewport(this.viewBox.slice(), scale, rotation, this.offsetX, this.offsetY, args.dontFlip);\n    },\n    convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {\n      return Util.applyTransform([x, y], this.transform);\n    },\n    convertToViewportRectangle: function PageViewport_convertToViewportRectangle(rect) {\n      var tl = Util.applyTransform([rect[0], rect[1]], this.transform);\n      var br = Util.applyTransform([rect[2], rect[3]], this.transform);\n      return [tl[0], tl[1], br[0], br[1]];\n    },\n    convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {\n      return Util.applyInverseTransform([x, y], this.transform);\n    }\n  };\n  return PageViewport;\n}();\nvar PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC];\nfunction stringToPDFString(str) {\n  var i,\n      n = str.length,\n      strBuf = [];\n  if (str[0] === '\\xFE' && str[1] === '\\xFF') {\n    for (i = 2; i < n; i += 2) {\n      strBuf.push(String.fromCharCode(str.charCodeAt(i) << 8 | str.charCodeAt(i + 1)));\n    }\n  } else {\n    for (i = 0; i < n; ++i) {\n      var code = PDFStringTranslateTable[str.charCodeAt(i)];\n      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));\n    }\n  }\n  return strBuf.join('');\n}\nfunction stringToUTF8String(str) {\n  return decodeURIComponent(escape(str));\n}\nfunction utf8StringToString(str) {\n  return unescape(encodeURIComponent(str));\n}\nfunction isEmptyObj(obj) {\n  for (var key in obj) {\n    return false;\n  }\n  return true;\n}\nfunction isBool(v) {\n  return typeof v === 'boolean';\n}\nfunction isInt(v) {\n  return typeof v === 'number' && (v | 0) === v;\n}\nfunction isNum(v) {\n  return typeof v === 'number';\n}\nfunction isString(v) {\n  return typeof v === 'string';\n}\nfunction isArray(v) {\n  return v instanceof Array;\n}\nfunction isArrayBuffer(v) {\n  return (typeof v === 'undefined' ? 'undefined' : _typeof(v)) === 'object' && v !== null && v.byteLength !== undefined;\n}\nfunction isSpace(ch) {\n  return ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A;\n}\nfunction isNodeJS() {\n  return (typeof process === 'undefined' ? 'undefined' : _typeof(process)) === 'object' && process + '' === '[object process]';\n}\nfunction createPromiseCapability() {\n  var capability = {};\n  capability.promise = new Promise(function (resolve, reject) {\n    capability.resolve = resolve;\n    capability.reject = reject;\n  });\n  return capability;\n}\nvar StatTimer = function StatTimerClosure() {\n  function rpad(str, pad, length) {\n    while (str.length < length) {\n      str += pad;\n    }\n    return str;\n  }\n  function StatTimer() {\n    this.started = Object.create(null);\n    this.times = [];\n    this.enabled = true;\n  }\n  StatTimer.prototype = {\n    time: function StatTimer_time(name) {\n      if (!this.enabled) {\n        return;\n      }\n      if (name in this.started) {\n        warn('Timer is already running for ' + name);\n      }\n      this.started[name] = Date.now();\n    },\n    timeEnd: function StatTimer_timeEnd(name) {\n      if (!this.enabled) {\n        return;\n      }\n      if (!(name in this.started)) {\n        warn('Timer has not been started for ' + name);\n      }\n      this.times.push({\n        'name': name,\n        'start': this.started[name],\n        'end': Date.now()\n      });\n      delete this.started[name];\n    },\n    toString: function StatTimer_toString() {\n      var i, ii;\n      var times = this.times;\n      var out = '';\n      var longest = 0;\n      for (i = 0, ii = times.length; i < ii; ++i) {\n        var name = times[i]['name'];\n        if (name.length > longest) {\n          longest = name.length;\n        }\n      }\n      for (i = 0, ii = times.length; i < ii; ++i) {\n        var span = times[i];\n        var duration = span.end - span.start;\n        out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\\n';\n      }\n      return out;\n    }\n  };\n  return StatTimer;\n}();\nvar createBlob = function createBlob(data, contentType) {\n  if (typeof Blob !== 'undefined') {\n    return new Blob([data], { type: contentType });\n  }\n  throw new Error('The \"Blob\" constructor is not supported.');\n};\nvar createObjectURL = function createObjectURLClosure() {\n  var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n  return function createObjectURL(data, contentType) {\n    var forceDataSchema = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    if (!forceDataSchema && URL.createObjectURL) {\n      var blob = createBlob(data, contentType);\n      return URL.createObjectURL(blob);\n    }\n    var buffer = 'data:' + contentType + ';base64,';\n    for (var i = 0, ii = data.length; i < ii; i += 3) {\n      var b1 = data[i] & 0xFF;\n      var b2 = data[i + 1] & 0xFF;\n      var b3 = data[i + 2] & 0xFF;\n      var d1 = b1 >> 2,\n          d2 = (b1 & 3) << 4 | b2 >> 4;\n      var d3 = i + 1 < ii ? (b2 & 0xF) << 2 | b3 >> 6 : 64;\n      var d4 = i + 2 < ii ? b3 & 0x3F : 64;\n      buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];\n    }\n    return buffer;\n  };\n}();\nfunction resolveCall(fn, args) {\n  var thisArg = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n  if (!fn) {\n    return Promise.resolve(undefined);\n  }\n  return new Promise(function (resolve, reject) {\n    resolve(fn.apply(thisArg, args));\n  });\n}\nfunction wrapReason(reason) {\n  if ((typeof reason === 'undefined' ? 'undefined' : _typeof(reason)) !== 'object') {\n    return reason;\n  }\n  switch (reason.name) {\n    case 'AbortException':\n      return new AbortException(reason.message);\n    case 'MissingPDFException':\n      return new MissingPDFException(reason.message);\n    case 'UnexpectedResponseException':\n      return new UnexpectedResponseException(reason.message, reason.status);\n    default:\n      return new UnknownErrorException(reason.message, reason.details);\n  }\n}\nfunction resolveOrReject(capability, success, reason) {\n  if (success) {\n    capability.resolve();\n  } else {\n    capability.reject(reason);\n  }\n}\nfunction finalize(promise) {\n  return Promise.resolve(promise).catch(function () {});\n}\nfunction MessageHandler(sourceName, targetName, comObj) {\n  var _this = this;\n\n  this.sourceName = sourceName;\n  this.targetName = targetName;\n  this.comObj = comObj;\n  this.callbackId = 1;\n  this.streamId = 1;\n  this.postMessageTransfers = true;\n  this.streamSinks = Object.create(null);\n  this.streamControllers = Object.create(null);\n  var callbacksCapabilities = this.callbacksCapabilities = Object.create(null);\n  var ah = this.actionHandler = Object.create(null);\n  this._onComObjOnMessage = function (event) {\n    var data = event.data;\n    if (data.targetName !== _this.sourceName) {\n      return;\n    }\n    if (data.stream) {\n      _this._processStreamMessage(data);\n    } else if (data.isReply) {\n      var callbackId = data.callbackId;\n      if (data.callbackId in callbacksCapabilities) {\n        var callback = callbacksCapabilities[callbackId];\n        delete callbacksCapabilities[callbackId];\n        if ('error' in data) {\n          callback.reject(wrapReason(data.error));\n        } else {\n          callback.resolve(data.data);\n        }\n      } else {\n        throw new Error('Cannot resolve callback ' + callbackId);\n      }\n    } else if (data.action in ah) {\n      var action = ah[data.action];\n      if (data.callbackId) {\n        var _sourceName = _this.sourceName;\n        var _targetName = data.sourceName;\n        Promise.resolve().then(function () {\n          return action[0].call(action[1], data.data);\n        }).then(function (result) {\n          comObj.postMessage({\n            sourceName: _sourceName,\n            targetName: _targetName,\n            isReply: true,\n            callbackId: data.callbackId,\n            data: result\n          });\n        }, function (reason) {\n          if (reason instanceof Error) {\n            reason = reason + '';\n          }\n          comObj.postMessage({\n            sourceName: _sourceName,\n            targetName: _targetName,\n            isReply: true,\n            callbackId: data.callbackId,\n            error: reason\n          });\n        });\n      } else if (data.streamId) {\n        _this._createStreamSink(data);\n      } else {\n        action[0].call(action[1], data.data);\n      }\n    } else {\n      throw new Error('Unknown action from worker: ' + data.action);\n    }\n  };\n  comObj.addEventListener('message', this._onComObjOnMessage);\n}\nMessageHandler.prototype = {\n  on: function on(actionName, handler, scope) {\n    var ah = this.actionHandler;\n    if (ah[actionName]) {\n      throw new Error('There is already an actionName called \"' + actionName + '\"');\n    }\n    ah[actionName] = [handler, scope];\n  },\n  send: function send(actionName, data, transfers) {\n    var message = {\n      sourceName: this.sourceName,\n      targetName: this.targetName,\n      action: actionName,\n      data: data\n    };\n    this.postMessage(message, transfers);\n  },\n  sendWithPromise: function sendWithPromise(actionName, data, transfers) {\n    var callbackId = this.callbackId++;\n    var message = {\n      sourceName: this.sourceName,\n      targetName: this.targetName,\n      action: actionName,\n      data: data,\n      callbackId: callbackId\n    };\n    var capability = createPromiseCapability();\n    this.callbacksCapabilities[callbackId] = capability;\n    try {\n      this.postMessage(message, transfers);\n    } catch (e) {\n      capability.reject(e);\n    }\n    return capability.promise;\n  },\n  sendWithStream: function sendWithStream(actionName, data, queueingStrategy, transfers) {\n    var _this2 = this;\n\n    var streamId = this.streamId++;\n    var sourceName = this.sourceName;\n    var targetName = this.targetName;\n    return new _streams_polyfill.ReadableStream({\n      start: function start(controller) {\n        var startCapability = createPromiseCapability();\n        _this2.streamControllers[streamId] = {\n          controller: controller,\n          startCall: startCapability,\n          isClosed: false\n        };\n        _this2.postMessage({\n          sourceName: sourceName,\n          targetName: targetName,\n          action: actionName,\n          streamId: streamId,\n          data: data,\n          desiredSize: controller.desiredSize\n        });\n        return startCapability.promise;\n      },\n      pull: function pull(controller) {\n        var pullCapability = createPromiseCapability();\n        _this2.streamControllers[streamId].pullCall = pullCapability;\n        _this2.postMessage({\n          sourceName: sourceName,\n          targetName: targetName,\n          stream: 'pull',\n          streamId: streamId,\n          desiredSize: controller.desiredSize\n        });\n        return pullCapability.promise;\n      },\n      cancel: function cancel(reason) {\n        var cancelCapability = createPromiseCapability();\n        _this2.streamControllers[streamId].cancelCall = cancelCapability;\n        _this2.streamControllers[streamId].isClosed = true;\n        _this2.postMessage({\n          sourceName: sourceName,\n          targetName: targetName,\n          stream: 'cancel',\n          reason: reason,\n          streamId: streamId\n        });\n        return cancelCapability.promise;\n      }\n    }, queueingStrategy);\n  },\n  _createStreamSink: function _createStreamSink(data) {\n    var _this3 = this;\n\n    var self = this;\n    var action = this.actionHandler[data.action];\n    var streamId = data.streamId;\n    var desiredSize = data.desiredSize;\n    var sourceName = this.sourceName;\n    var targetName = data.sourceName;\n    var capability = createPromiseCapability();\n    var sendStreamRequest = function sendStreamRequest(_ref) {\n      var stream = _ref.stream,\n          chunk = _ref.chunk,\n          transfers = _ref.transfers,\n          success = _ref.success,\n          reason = _ref.reason;\n\n      _this3.postMessage({\n        sourceName: sourceName,\n        targetName: targetName,\n        stream: stream,\n        streamId: streamId,\n        chunk: chunk,\n        success: success,\n        reason: reason\n      }, transfers);\n    };\n    var streamSink = {\n      enqueue: function enqueue(chunk) {\n        var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n        var transfers = arguments[2];\n\n        if (this.isCancelled) {\n          return;\n        }\n        var lastDesiredSize = this.desiredSize;\n        this.desiredSize -= size;\n        if (lastDesiredSize > 0 && this.desiredSize <= 0) {\n          this.sinkCapability = createPromiseCapability();\n          this.ready = this.sinkCapability.promise;\n        }\n        sendStreamRequest({\n          stream: 'enqueue',\n          chunk: chunk,\n          transfers: transfers\n        });\n      },\n      close: function close() {\n        if (this.isCancelled) {\n          return;\n        }\n        sendStreamRequest({ stream: 'close' });\n        delete self.streamSinks[streamId];\n      },\n      error: function error(reason) {\n        if (this.isCancelled) {\n          return;\n        }\n        this.isCancelled = true;\n        sendStreamRequest({\n          stream: 'error',\n          reason: reason\n        });\n      },\n\n      sinkCapability: capability,\n      onPull: null,\n      onCancel: null,\n      isCancelled: false,\n      desiredSize: desiredSize,\n      ready: null\n    };\n    streamSink.sinkCapability.resolve();\n    streamSink.ready = streamSink.sinkCapability.promise;\n    this.streamSinks[streamId] = streamSink;\n    resolveCall(action[0], [data.data, streamSink], action[1]).then(function () {\n      sendStreamRequest({\n        stream: 'start_complete',\n        success: true\n      });\n    }, function (reason) {\n      sendStreamRequest({\n        stream: 'start_complete',\n        success: false,\n        reason: reason\n      });\n    });\n  },\n  _processStreamMessage: function _processStreamMessage(data) {\n    var _this4 = this;\n\n    var sourceName = this.sourceName;\n    var targetName = data.sourceName;\n    var streamId = data.streamId;\n    var sendStreamResponse = function sendStreamResponse(_ref2) {\n      var stream = _ref2.stream,\n          success = _ref2.success,\n          reason = _ref2.reason;\n\n      _this4.comObj.postMessage({\n        sourceName: sourceName,\n        targetName: targetName,\n        stream: stream,\n        success: success,\n        streamId: streamId,\n        reason: reason\n      });\n    };\n    var deleteStreamController = function deleteStreamController() {\n      Promise.all([_this4.streamControllers[data.streamId].startCall, _this4.streamControllers[data.streamId].pullCall, _this4.streamControllers[data.streamId].cancelCall].map(function (capability) {\n        return capability && finalize(capability.promise);\n      })).then(function () {\n        delete _this4.streamControllers[data.streamId];\n      });\n    };\n    switch (data.stream) {\n      case 'start_complete':\n        resolveOrReject(this.streamControllers[data.streamId].startCall, data.success, wrapReason(data.reason));\n        break;\n      case 'pull_complete':\n        resolveOrReject(this.streamControllers[data.streamId].pullCall, data.success, wrapReason(data.reason));\n        break;\n      case 'pull':\n        if (!this.streamSinks[data.streamId]) {\n          sendStreamResponse({\n            stream: 'pull_complete',\n            success: true\n          });\n          break;\n        }\n        if (this.streamSinks[data.streamId].desiredSize <= 0 && data.desiredSize > 0) {\n          this.streamSinks[data.streamId].sinkCapability.resolve();\n        }\n        this.streamSinks[data.streamId].desiredSize = data.desiredSize;\n        resolveCall(this.streamSinks[data.streamId].onPull).then(function () {\n          sendStreamResponse({\n            stream: 'pull_complete',\n            success: true\n          });\n        }, function (reason) {\n          sendStreamResponse({\n            stream: 'pull_complete',\n            success: false,\n            reason: reason\n          });\n        });\n        break;\n      case 'enqueue':\n        assert(this.streamControllers[data.streamId], 'enqueue should have stream controller');\n        if (!this.streamControllers[data.streamId].isClosed) {\n          this.streamControllers[data.streamId].controller.enqueue(data.chunk);\n        }\n        break;\n      case 'close':\n        assert(this.streamControllers[data.streamId], 'close should have stream controller');\n        if (this.streamControllers[data.streamId].isClosed) {\n          break;\n        }\n        this.streamControllers[data.streamId].isClosed = true;\n        this.streamControllers[data.streamId].controller.close();\n        deleteStreamController();\n        break;\n      case 'error':\n        assert(this.streamControllers[data.streamId], 'error should have stream controller');\n        this.streamControllers[data.streamId].controller.error(wrapReason(data.reason));\n        deleteStreamController();\n        break;\n      case 'cancel_complete':\n        resolveOrReject(this.streamControllers[data.streamId].cancelCall, data.success, wrapReason(data.reason));\n        deleteStreamController();\n        break;\n      case 'cancel':\n        if (!this.streamSinks[data.streamId]) {\n          break;\n        }\n        resolveCall(this.streamSinks[data.streamId].onCancel, [wrapReason(data.reason)]).then(function () {\n          sendStreamResponse({\n            stream: 'cancel_complete',\n            success: true\n          });\n        }, function (reason) {\n          sendStreamResponse({\n            stream: 'cancel_complete',\n            success: false,\n            reason: reason\n          });\n        });\n        this.streamSinks[data.streamId].sinkCapability.reject(wrapReason(data.reason));\n        this.streamSinks[data.streamId].isCancelled = true;\n        delete this.streamSinks[data.streamId];\n        break;\n      default:\n        throw new Error('Unexpected stream case');\n    }\n  },\n  postMessage: function postMessage(message, transfers) {\n    if (transfers && this.postMessageTransfers) {\n      this.comObj.postMessage(message, transfers);\n    } else {\n      this.comObj.postMessage(message);\n    }\n  },\n  destroy: function destroy() {\n    this.comObj.removeEventListener('message', this._onComObjOnMessage);\n  }\n};\nfunction loadJpegStream(id, imageUrl, objs) {\n  var img = new Image();\n  img.onload = function loadJpegStream_onloadClosure() {\n    objs.resolve(id, img);\n  };\n  img.onerror = function loadJpegStream_onerrorClosure() {\n    objs.resolve(id, null);\n    warn('Error during JPEG image loading');\n  };\n  img.src = imageUrl;\n}\nexports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX;\nexports.IDENTITY_MATRIX = IDENTITY_MATRIX;\nexports.OPS = OPS;\nexports.VERBOSITY_LEVELS = VERBOSITY_LEVELS;\nexports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES;\nexports.AnnotationBorderStyleType = AnnotationBorderStyleType;\nexports.AnnotationFieldFlag = AnnotationFieldFlag;\nexports.AnnotationFlag = AnnotationFlag;\nexports.AnnotationType = AnnotationType;\nexports.FontType = FontType;\nexports.ImageKind = ImageKind;\nexports.CMapCompressionType = CMapCompressionType;\nexports.AbortException = AbortException;\nexports.InvalidPDFException = InvalidPDFException;\nexports.MessageHandler = MessageHandler;\nexports.MissingDataException = MissingDataException;\nexports.MissingPDFException = MissingPDFException;\nexports.NativeImageDecoding = NativeImageDecoding;\nexports.NotImplementedException = NotImplementedException;\nexports.PageViewport = PageViewport;\nexports.PasswordException = PasswordException;\nexports.PasswordResponses = PasswordResponses;\nexports.StatTimer = StatTimer;\nexports.StreamType = StreamType;\nexports.TextRenderingMode = TextRenderingMode;\nexports.UnexpectedResponseException = UnexpectedResponseException;\nexports.UnknownErrorException = UnknownErrorException;\nexports.Util = Util;\nexports.XRefParseException = XRefParseException;\nexports.FormatError = FormatError;\nexports.arrayByteLength = arrayByteLength;\nexports.arraysToBytes = arraysToBytes;\nexports.assert = assert;\nexports.bytesToString = bytesToString;\nexports.createBlob = createBlob;\nexports.createPromiseCapability = createPromiseCapability;\nexports.createObjectURL = createObjectURL;\nexports.deprecated = deprecated;\nexports.getLookupTableFactory = getLookupTableFactory;\nexports.getVerbosityLevel = getVerbosityLevel;\nexports.globalScope = globalScope;\nexports.info = info;\nexports.isArray = isArray;\nexports.isArrayBuffer = isArrayBuffer;\nexports.isBool = isBool;\nexports.isEmptyObj = isEmptyObj;\nexports.isInt = isInt;\nexports.isNum = isNum;\nexports.isString = isString;\nexports.isSpace = isSpace;\nexports.isNodeJS = isNodeJS;\nexports.isSameOrigin = isSameOrigin;\nexports.createValidAbsoluteUrl = createValidAbsoluteUrl;\nexports.isLittleEndian = isLittleEndian;\nexports.isEvalSupported = isEvalSupported;\nexports.loadJpegStream = loadJpegStream;\nexports.log2 = log2;\nexports.readInt8 = readInt8;\nexports.readUint16 = readUint16;\nexports.readUint32 = readUint32;\nexports.removeNullCharacters = removeNullCharacters;\nexports.ReadableStream = _streams_polyfill.ReadableStream;\nexports.setVerbosityLevel = setVerbosityLevel;\nexports.shadow = shadow;\nexports.string32 = string32;\nexports.stringToBytes = stringToBytes;\nexports.stringToPDFString = stringToPDFString;\nexports.stringToUTF8String = stringToUTF8String;\nexports.utf8StringToString = utf8StringToString;\nexports.warn = warn;\nexports.unreachable = unreachable;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isStream = exports.isRefsEqual = exports.isRef = exports.isName = exports.isDict = exports.isCmd = exports.isEOF = exports.RefSetCache = exports.RefSet = exports.Ref = exports.Name = exports.Dict = exports.Cmd = exports.EOF = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _util = __w_pdfjs_require__(0);\n\nvar EOF = {};\nvar Name = function NameClosure() {\n  function Name(name) {\n    this.name = name;\n  }\n  Name.prototype = {};\n  var nameCache = Object.create(null);\n  Name.get = function Name_get(name) {\n    var nameValue = nameCache[name];\n    return nameValue ? nameValue : nameCache[name] = new Name(name);\n  };\n  return Name;\n}();\nvar Cmd = function CmdClosure() {\n  function Cmd(cmd) {\n    this.cmd = cmd;\n  }\n  Cmd.prototype = {};\n  var cmdCache = Object.create(null);\n  Cmd.get = function Cmd_get(cmd) {\n    var cmdValue = cmdCache[cmd];\n    return cmdValue ? cmdValue : cmdCache[cmd] = new Cmd(cmd);\n  };\n  return Cmd;\n}();\nvar Dict = function DictClosure() {\n  var nonSerializable = function nonSerializableClosure() {\n    return nonSerializable;\n  };\n  function Dict(xref) {\n    this._map = Object.create(null);\n    this.xref = xref;\n    this.objId = null;\n    this.suppressEncryption = false;\n    this.__nonSerializable__ = nonSerializable;\n  }\n  Dict.prototype = {\n    assignXref: function Dict_assignXref(newXref) {\n      this.xref = newXref;\n    },\n    get: function Dict_get(key1, key2, key3) {\n      var value;\n      var xref = this.xref,\n          suppressEncryption = this.suppressEncryption;\n      if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') {\n        return xref ? xref.fetchIfRef(value, suppressEncryption) : value;\n      }\n      if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') {\n        return xref ? xref.fetchIfRef(value, suppressEncryption) : value;\n      }\n      value = this._map[key3] || null;\n      return xref ? xref.fetchIfRef(value, suppressEncryption) : value;\n    },\n    getAsync: function Dict_getAsync(key1, key2, key3) {\n      var value;\n      var xref = this.xref,\n          suppressEncryption = this.suppressEncryption;\n      if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') {\n        if (xref) {\n          return xref.fetchIfRefAsync(value, suppressEncryption);\n        }\n        return Promise.resolve(value);\n      }\n      if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') {\n        if (xref) {\n          return xref.fetchIfRefAsync(value, suppressEncryption);\n        }\n        return Promise.resolve(value);\n      }\n      value = this._map[key3] || null;\n      if (xref) {\n        return xref.fetchIfRefAsync(value, suppressEncryption);\n      }\n      return Promise.resolve(value);\n    },\n    getArray: function Dict_getArray(key1, key2, key3) {\n      var value = this.get(key1, key2, key3);\n      var xref = this.xref,\n          suppressEncryption = this.suppressEncryption;\n      if (!(0, _util.isArray)(value) || !xref) {\n        return value;\n      }\n      value = value.slice();\n      for (var i = 0, ii = value.length; i < ii; i++) {\n        if (!isRef(value[i])) {\n          continue;\n        }\n        value[i] = xref.fetch(value[i], suppressEncryption);\n      }\n      return value;\n    },\n    getRaw: function Dict_getRaw(key) {\n      return this._map[key];\n    },\n    getKeys: function Dict_getKeys() {\n      return Object.keys(this._map);\n    },\n    set: function Dict_set(key, value) {\n      this._map[key] = value;\n    },\n    has: function Dict_has(key) {\n      return key in this._map;\n    },\n    forEach: function Dict_forEach(callback) {\n      for (var key in this._map) {\n        callback(key, this.get(key));\n      }\n    }\n  };\n  Dict.empty = new Dict(null);\n  Dict.merge = function (xref, dictArray) {\n    var mergedDict = new Dict(xref);\n    for (var i = 0, ii = dictArray.length; i < ii; i++) {\n      var dict = dictArray[i];\n      if (!isDict(dict)) {\n        continue;\n      }\n      for (var keyName in dict._map) {\n        if (mergedDict._map[keyName] !== undefined) {\n          continue;\n        }\n        mergedDict._map[keyName] = dict._map[keyName];\n      }\n    }\n    return mergedDict;\n  };\n  return Dict;\n}();\nvar Ref = function RefClosure() {\n  function Ref(num, gen) {\n    this.num = num;\n    this.gen = gen;\n  }\n  Ref.prototype = {\n    toString: function Ref_toString() {\n      var str = this.num + 'R';\n      if (this.gen !== 0) {\n        str += this.gen;\n      }\n      return str;\n    }\n  };\n  return Ref;\n}();\nvar RefSet = function RefSetClosure() {\n  function RefSet() {\n    this.dict = Object.create(null);\n  }\n  RefSet.prototype = {\n    has: function RefSet_has(ref) {\n      return ref.toString() in this.dict;\n    },\n    put: function RefSet_put(ref) {\n      this.dict[ref.toString()] = true;\n    },\n    remove: function RefSet_remove(ref) {\n      delete this.dict[ref.toString()];\n    }\n  };\n  return RefSet;\n}();\nvar RefSetCache = function RefSetCacheClosure() {\n  function RefSetCache() {\n    this.dict = Object.create(null);\n  }\n  RefSetCache.prototype = {\n    get: function RefSetCache_get(ref) {\n      return this.dict[ref.toString()];\n    },\n    has: function RefSetCache_has(ref) {\n      return ref.toString() in this.dict;\n    },\n    put: function RefSetCache_put(ref, obj) {\n      this.dict[ref.toString()] = obj;\n    },\n    putAlias: function RefSetCache_putAlias(ref, aliasRef) {\n      this.dict[ref.toString()] = this.get(aliasRef);\n    },\n    forEach: function RefSetCache_forEach(fn, thisArg) {\n      for (var i in this.dict) {\n        fn.call(thisArg, this.dict[i]);\n      }\n    },\n    clear: function RefSetCache_clear() {\n      this.dict = Object.create(null);\n    }\n  };\n  return RefSetCache;\n}();\nfunction isEOF(v) {\n  return v === EOF;\n}\nfunction isName(v, name) {\n  return v instanceof Name && (name === undefined || v.name === name);\n}\nfunction isCmd(v, cmd) {\n  return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);\n}\nfunction isDict(v, type) {\n  return v instanceof Dict && (type === undefined || isName(v.get('Type'), type));\n}\nfunction isRef(v) {\n  return v instanceof Ref;\n}\nfunction isRefsEqual(v1, v2) {\n  return v1.num === v2.num && v1.gen === v2.gen;\n}\nfunction isStream(v) {\n  return (typeof v === 'undefined' ? 'undefined' : _typeof(v)) === 'object' && v !== null && v.getBytes !== undefined;\n}\nexports.EOF = EOF;\nexports.Cmd = Cmd;\nexports.Dict = Dict;\nexports.Name = Name;\nexports.Ref = Ref;\nexports.RefSet = RefSet;\nexports.RefSetCache = RefSetCache;\nexports.isEOF = isEOF;\nexports.isCmd = isCmd;\nexports.isDict = isDict;\nexports.isName = isName;\nexports.isRef = isRef;\nexports.isRefsEqual = isRefsEqual;\nexports.isStream = isStream;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.LZWStream = exports.StringStream = exports.StreamsSequenceStream = exports.Stream = exports.RunLengthStream = exports.PredictorStream = exports.NullStream = exports.JpxStream = exports.JpegStream = exports.Jbig2Stream = exports.FlateStream = exports.DecodeStream = exports.DecryptStream = exports.CCITTFaxStream = exports.AsciiHexStream = exports.Ascii85Stream = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _jbig = __w_pdfjs_require__(27);\n\nvar _jpg = __w_pdfjs_require__(28);\n\nvar _jpx = __w_pdfjs_require__(14);\n\nvar Stream = function StreamClosure() {\n  function Stream(arrayBuffer, start, length, dict) {\n    this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer);\n    this.start = start || 0;\n    this.pos = this.start;\n    this.end = start + length || this.bytes.length;\n    this.dict = dict;\n  }\n  Stream.prototype = {\n    get length() {\n      return this.end - this.start;\n    },\n    get isEmpty() {\n      return this.length === 0;\n    },\n    getByte: function Stream_getByte() {\n      if (this.pos >= this.end) {\n        return -1;\n      }\n      return this.bytes[this.pos++];\n    },\n    getUint16: function Stream_getUint16() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      if (b0 === -1 || b1 === -1) {\n        return -1;\n      }\n      return (b0 << 8) + b1;\n    },\n    getInt32: function Stream_getInt32() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      var b2 = this.getByte();\n      var b3 = this.getByte();\n      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n    },\n    getBytes: function Stream_getBytes(length) {\n      var bytes = this.bytes;\n      var pos = this.pos;\n      var strEnd = this.end;\n      if (!length) {\n        return bytes.subarray(pos, strEnd);\n      }\n      var end = pos + length;\n      if (end > strEnd) {\n        end = strEnd;\n      }\n      this.pos = end;\n      return bytes.subarray(pos, end);\n    },\n    peekByte: function Stream_peekByte() {\n      var peekedByte = this.getByte();\n      this.pos--;\n      return peekedByte;\n    },\n    peekBytes: function Stream_peekBytes(length) {\n      var bytes = this.getBytes(length);\n      this.pos -= bytes.length;\n      return bytes;\n    },\n    skip: function Stream_skip(n) {\n      if (!n) {\n        n = 1;\n      }\n      this.pos += n;\n    },\n    reset: function Stream_reset() {\n      this.pos = this.start;\n    },\n    moveStart: function Stream_moveStart() {\n      this.start = this.pos;\n    },\n    makeSubStream: function Stream_makeSubStream(start, length, dict) {\n      return new Stream(this.bytes.buffer, start, length, dict);\n    }\n  };\n  return Stream;\n}();\nvar StringStream = function StringStreamClosure() {\n  function StringStream(str) {\n    var length = str.length;\n    var bytes = new Uint8Array(length);\n    for (var n = 0; n < length; ++n) {\n      bytes[n] = str.charCodeAt(n);\n    }\n    Stream.call(this, bytes);\n  }\n  StringStream.prototype = Stream.prototype;\n  return StringStream;\n}();\nvar DecodeStream = function DecodeStreamClosure() {\n  var emptyBuffer = new Uint8Array(0);\n  function DecodeStream(maybeMinBufferLength) {\n    this.pos = 0;\n    this.bufferLength = 0;\n    this.eof = false;\n    this.buffer = emptyBuffer;\n    this.minBufferLength = 512;\n    if (maybeMinBufferLength) {\n      while (this.minBufferLength < maybeMinBufferLength) {\n        this.minBufferLength *= 2;\n      }\n    }\n  }\n  DecodeStream.prototype = {\n    get isEmpty() {\n      while (!this.eof && this.bufferLength === 0) {\n        this.readBlock();\n      }\n      return this.bufferLength === 0;\n    },\n    ensureBuffer: function DecodeStream_ensureBuffer(requested) {\n      var buffer = this.buffer;\n      if (requested <= buffer.byteLength) {\n        return buffer;\n      }\n      var size = this.minBufferLength;\n      while (size < requested) {\n        size *= 2;\n      }\n      var buffer2 = new Uint8Array(size);\n      buffer2.set(buffer);\n      return this.buffer = buffer2;\n    },\n    getByte: function DecodeStream_getByte() {\n      var pos = this.pos;\n      while (this.bufferLength <= pos) {\n        if (this.eof) {\n          return -1;\n        }\n        this.readBlock();\n      }\n      return this.buffer[this.pos++];\n    },\n    getUint16: function DecodeStream_getUint16() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      if (b0 === -1 || b1 === -1) {\n        return -1;\n      }\n      return (b0 << 8) + b1;\n    },\n    getInt32: function DecodeStream_getInt32() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      var b2 = this.getByte();\n      var b3 = this.getByte();\n      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n    },\n    getBytes: function DecodeStream_getBytes(length) {\n      var end,\n          pos = this.pos;\n      if (length) {\n        this.ensureBuffer(pos + length);\n        end = pos + length;\n        while (!this.eof && this.bufferLength < end) {\n          this.readBlock();\n        }\n        var bufEnd = this.bufferLength;\n        if (end > bufEnd) {\n          end = bufEnd;\n        }\n      } else {\n        while (!this.eof) {\n          this.readBlock();\n        }\n        end = this.bufferLength;\n      }\n      this.pos = end;\n      return this.buffer.subarray(pos, end);\n    },\n    peekByte: function DecodeStream_peekByte() {\n      var peekedByte = this.getByte();\n      this.pos--;\n      return peekedByte;\n    },\n    peekBytes: function DecodeStream_peekBytes(length) {\n      var bytes = this.getBytes(length);\n      this.pos -= bytes.length;\n      return bytes;\n    },\n    makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {\n      var end = start + length;\n      while (this.bufferLength <= end && !this.eof) {\n        this.readBlock();\n      }\n      return new Stream(this.buffer, start, length, dict);\n    },\n    skip: function DecodeStream_skip(n) {\n      if (!n) {\n        n = 1;\n      }\n      this.pos += n;\n    },\n    reset: function DecodeStream_reset() {\n      this.pos = 0;\n    },\n    getBaseStreams: function DecodeStream_getBaseStreams() {\n      if (this.str && this.str.getBaseStreams) {\n        return this.str.getBaseStreams();\n      }\n      return [];\n    }\n  };\n  return DecodeStream;\n}();\nvar StreamsSequenceStream = function StreamsSequenceStreamClosure() {\n  function StreamsSequenceStream(streams) {\n    this.streams = streams;\n    DecodeStream.call(this, null);\n  }\n  StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);\n  StreamsSequenceStream.prototype.readBlock = function streamSequenceStreamReadBlock() {\n    var streams = this.streams;\n    if (streams.length === 0) {\n      this.eof = true;\n      return;\n    }\n    var stream = streams.shift();\n    var chunk = stream.getBytes();\n    var bufferLength = this.bufferLength;\n    var newLength = bufferLength + chunk.length;\n    var buffer = this.ensureBuffer(newLength);\n    buffer.set(chunk, bufferLength);\n    this.bufferLength = newLength;\n  };\n  StreamsSequenceStream.prototype.getBaseStreams = function StreamsSequenceStream_getBaseStreams() {\n    var baseStreams = [];\n    for (var i = 0, ii = this.streams.length; i < ii; i++) {\n      var stream = this.streams[i];\n      if (stream.getBaseStreams) {\n        _util.Util.appendToArray(baseStreams, stream.getBaseStreams());\n      }\n    }\n    return baseStreams;\n  };\n  return StreamsSequenceStream;\n}();\nvar FlateStream = function FlateStreamClosure() {\n  var codeLenCodeMap = new Int32Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n  var lengthDecode = new Int32Array([0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102]);\n  var distDecode = new Int32Array([0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001]);\n  var fixedLitCodeTab = [new Int32Array([0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff]), 9];\n  var fixedDistCodeTab = [new Int32Array([0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000]), 5];\n  function FlateStream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n    var cmf = str.getByte();\n    var flg = str.getByte();\n    if (cmf === -1 || flg === -1) {\n      throw new _util.FormatError('Invalid header in flate stream: ' + cmf + ', ' + flg);\n    }\n    if ((cmf & 0x0f) !== 0x08) {\n      throw new _util.FormatError('Unknown compression method in flate stream: ' + cmf + ', ' + flg);\n    }\n    if (((cmf << 8) + flg) % 31 !== 0) {\n      throw new _util.FormatError('Bad FCHECK in flate stream: ' + cmf + ', ' + flg);\n    }\n    if (flg & 0x20) {\n      throw new _util.FormatError('FDICT bit set in flate stream: ' + cmf + ', ' + flg);\n    }\n    this.codeSize = 0;\n    this.codeBuf = 0;\n    DecodeStream.call(this, maybeLength);\n  }\n  FlateStream.prototype = Object.create(DecodeStream.prototype);\n  FlateStream.prototype.getBits = function FlateStream_getBits(bits) {\n    var str = this.str;\n    var codeSize = this.codeSize;\n    var codeBuf = this.codeBuf;\n    var b;\n    while (codeSize < bits) {\n      if ((b = str.getByte()) === -1) {\n        throw new _util.FormatError('Bad encoding in flate stream');\n      }\n      codeBuf |= b << codeSize;\n      codeSize += 8;\n    }\n    b = codeBuf & (1 << bits) - 1;\n    this.codeBuf = codeBuf >> bits;\n    this.codeSize = codeSize -= bits;\n    return b;\n  };\n  FlateStream.prototype.getCode = function FlateStream_getCode(table) {\n    var str = this.str;\n    var codes = table[0];\n    var maxLen = table[1];\n    var codeSize = this.codeSize;\n    var codeBuf = this.codeBuf;\n    var b;\n    while (codeSize < maxLen) {\n      if ((b = str.getByte()) === -1) {\n        break;\n      }\n      codeBuf |= b << codeSize;\n      codeSize += 8;\n    }\n    var code = codes[codeBuf & (1 << maxLen) - 1];\n    var codeLen = code >> 16;\n    var codeVal = code & 0xffff;\n    if (codeLen < 1 || codeSize < codeLen) {\n      throw new _util.FormatError('Bad encoding in flate stream');\n    }\n    this.codeBuf = codeBuf >> codeLen;\n    this.codeSize = codeSize - codeLen;\n    return codeVal;\n  };\n  FlateStream.prototype.generateHuffmanTable = function flateStreamGenerateHuffmanTable(lengths) {\n    var n = lengths.length;\n    var maxLen = 0;\n    var i;\n    for (i = 0; i < n; ++i) {\n      if (lengths[i] > maxLen) {\n        maxLen = lengths[i];\n      }\n    }\n    var size = 1 << maxLen;\n    var codes = new Int32Array(size);\n    for (var len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) {\n      for (var val = 0; val < n; ++val) {\n        if (lengths[val] === len) {\n          var code2 = 0;\n          var t = code;\n          for (i = 0; i < len; ++i) {\n            code2 = code2 << 1 | t & 1;\n            t >>= 1;\n          }\n          for (i = code2; i < size; i += skip) {\n            codes[i] = len << 16 | val;\n          }\n          ++code;\n        }\n      }\n    }\n    return [codes, maxLen];\n  };\n  FlateStream.prototype.readBlock = function FlateStream_readBlock() {\n    var buffer, len;\n    var str = this.str;\n    var hdr = this.getBits(3);\n    if (hdr & 1) {\n      this.eof = true;\n    }\n    hdr >>= 1;\n    if (hdr === 0) {\n      var b;\n      if ((b = str.getByte()) === -1) {\n        throw new _util.FormatError('Bad block header in flate stream');\n      }\n      var blockLen = b;\n      if ((b = str.getByte()) === -1) {\n        throw new _util.FormatError('Bad block header in flate stream');\n      }\n      blockLen |= b << 8;\n      if ((b = str.getByte()) === -1) {\n        throw new _util.FormatError('Bad block header in flate stream');\n      }\n      var check = b;\n      if ((b = str.getByte()) === -1) {\n        throw new _util.FormatError('Bad block header in flate stream');\n      }\n      check |= b << 8;\n      if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) {\n        throw new _util.FormatError('Bad uncompressed block length in flate stream');\n      }\n      this.codeBuf = 0;\n      this.codeSize = 0;\n      var bufferLength = this.bufferLength;\n      buffer = this.ensureBuffer(bufferLength + blockLen);\n      var end = bufferLength + blockLen;\n      this.bufferLength = end;\n      if (blockLen === 0) {\n        if (str.peekByte() === -1) {\n          this.eof = true;\n        }\n      } else {\n        for (var n = bufferLength; n < end; ++n) {\n          if ((b = str.getByte()) === -1) {\n            this.eof = true;\n            break;\n          }\n          buffer[n] = b;\n        }\n      }\n      return;\n    }\n    var litCodeTable;\n    var distCodeTable;\n    if (hdr === 1) {\n      litCodeTable = fixedLitCodeTab;\n      distCodeTable = fixedDistCodeTab;\n    } else if (hdr === 2) {\n      var numLitCodes = this.getBits(5) + 257;\n      var numDistCodes = this.getBits(5) + 1;\n      var numCodeLenCodes = this.getBits(4) + 4;\n      var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);\n      var i;\n      for (i = 0; i < numCodeLenCodes; ++i) {\n        codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);\n      }\n      var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);\n      len = 0;\n      i = 0;\n      var codes = numLitCodes + numDistCodes;\n      var codeLengths = new Uint8Array(codes);\n      var bitsLength, bitsOffset, what;\n      while (i < codes) {\n        var code = this.getCode(codeLenCodeTab);\n        if (code === 16) {\n          bitsLength = 2;\n          bitsOffset = 3;\n          what = len;\n        } else if (code === 17) {\n          bitsLength = 3;\n          bitsOffset = 3;\n          what = len = 0;\n        } else if (code === 18) {\n          bitsLength = 7;\n          bitsOffset = 11;\n          what = len = 0;\n        } else {\n          codeLengths[i++] = len = code;\n          continue;\n        }\n        var repeatLength = this.getBits(bitsLength) + bitsOffset;\n        while (repeatLength-- > 0) {\n          codeLengths[i++] = what;\n        }\n      }\n      litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));\n      distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));\n    } else {\n      throw new _util.FormatError('Unknown block type in flate stream');\n    }\n    buffer = this.buffer;\n    var limit = buffer ? buffer.length : 0;\n    var pos = this.bufferLength;\n    while (true) {\n      var code1 = this.getCode(litCodeTable);\n      if (code1 < 256) {\n        if (pos + 1 >= limit) {\n          buffer = this.ensureBuffer(pos + 1);\n          limit = buffer.length;\n        }\n        buffer[pos++] = code1;\n        continue;\n      }\n      if (code1 === 256) {\n        this.bufferLength = pos;\n        return;\n      }\n      code1 -= 257;\n      code1 = lengthDecode[code1];\n      var code2 = code1 >> 16;\n      if (code2 > 0) {\n        code2 = this.getBits(code2);\n      }\n      len = (code1 & 0xffff) + code2;\n      code1 = this.getCode(distCodeTable);\n      code1 = distDecode[code1];\n      code2 = code1 >> 16;\n      if (code2 > 0) {\n        code2 = this.getBits(code2);\n      }\n      var dist = (code1 & 0xffff) + code2;\n      if (pos + len >= limit) {\n        buffer = this.ensureBuffer(pos + len);\n        limit = buffer.length;\n      }\n      for (var k = 0; k < len; ++k, ++pos) {\n        buffer[pos] = buffer[pos - dist];\n      }\n    }\n  };\n  return FlateStream;\n}();\nvar PredictorStream = function PredictorStreamClosure() {\n  function PredictorStream(str, maybeLength, params) {\n    if (!(0, _primitives.isDict)(params)) {\n      return str;\n    }\n    var predictor = this.predictor = params.get('Predictor') || 1;\n    if (predictor <= 1) {\n      return str;\n    }\n    if (predictor !== 2 && (predictor < 10 || predictor > 15)) {\n      throw new _util.FormatError('Unsupported predictor: ' + predictor);\n    }\n    if (predictor === 2) {\n      this.readBlock = this.readBlockTiff;\n    } else {\n      this.readBlock = this.readBlockPng;\n    }\n    this.str = str;\n    this.dict = str.dict;\n    var colors = this.colors = params.get('Colors') || 1;\n    var bits = this.bits = params.get('BitsPerComponent') || 8;\n    var columns = this.columns = params.get('Columns') || 1;\n    this.pixBytes = colors * bits + 7 >> 3;\n    this.rowBytes = columns * colors * bits + 7 >> 3;\n    DecodeStream.call(this, maybeLength);\n    return this;\n  }\n  PredictorStream.prototype = Object.create(DecodeStream.prototype);\n  PredictorStream.prototype.readBlockTiff = function predictorStreamReadBlockTiff() {\n    var rowBytes = this.rowBytes;\n    var bufferLength = this.bufferLength;\n    var buffer = this.ensureBuffer(bufferLength + rowBytes);\n    var bits = this.bits;\n    var colors = this.colors;\n    var rawBytes = this.str.getBytes(rowBytes);\n    this.eof = !rawBytes.length;\n    if (this.eof) {\n      return;\n    }\n    var inbuf = 0,\n        outbuf = 0;\n    var inbits = 0,\n        outbits = 0;\n    var pos = bufferLength;\n    var i;\n    if (bits === 1 && colors === 1) {\n      for (i = 0; i < rowBytes; ++i) {\n        var c = rawBytes[i] ^ inbuf;\n        c ^= c >> 1;\n        c ^= c >> 2;\n        c ^= c >> 4;\n        inbuf = (c & 1) << 7;\n        buffer[pos++] = c;\n      }\n    } else if (bits === 8) {\n      for (i = 0; i < colors; ++i) {\n        buffer[pos++] = rawBytes[i];\n      }\n      for (; i < rowBytes; ++i) {\n        buffer[pos] = buffer[pos - colors] + rawBytes[i];\n        pos++;\n      }\n    } else {\n      var compArray = new Uint8Array(colors + 1);\n      var bitMask = (1 << bits) - 1;\n      var j = 0,\n          k = bufferLength;\n      var columns = this.columns;\n      for (i = 0; i < columns; ++i) {\n        for (var kk = 0; kk < colors; ++kk) {\n          if (inbits < bits) {\n            inbuf = inbuf << 8 | rawBytes[j++] & 0xFF;\n            inbits += 8;\n          }\n          compArray[kk] = compArray[kk] + (inbuf >> inbits - bits) & bitMask;\n          inbits -= bits;\n          outbuf = outbuf << bits | compArray[kk];\n          outbits += bits;\n          if (outbits >= 8) {\n            buffer[k++] = outbuf >> outbits - 8 & 0xFF;\n            outbits -= 8;\n          }\n        }\n      }\n      if (outbits > 0) {\n        buffer[k++] = (outbuf << 8 - outbits) + (inbuf & (1 << 8 - outbits) - 1);\n      }\n    }\n    this.bufferLength += rowBytes;\n  };\n  PredictorStream.prototype.readBlockPng = function predictorStreamReadBlockPng() {\n    var rowBytes = this.rowBytes;\n    var pixBytes = this.pixBytes;\n    var predictor = this.str.getByte();\n    var rawBytes = this.str.getBytes(rowBytes);\n    this.eof = !rawBytes.length;\n    if (this.eof) {\n      return;\n    }\n    var bufferLength = this.bufferLength;\n    var buffer = this.ensureBuffer(bufferLength + rowBytes);\n    var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);\n    if (prevRow.length === 0) {\n      prevRow = new Uint8Array(rowBytes);\n    }\n    var i,\n        j = bufferLength,\n        up,\n        c;\n    switch (predictor) {\n      case 0:\n        for (i = 0; i < rowBytes; ++i) {\n          buffer[j++] = rawBytes[i];\n        }\n        break;\n      case 1:\n        for (i = 0; i < pixBytes; ++i) {\n          buffer[j++] = rawBytes[i];\n        }\n        for (; i < rowBytes; ++i) {\n          buffer[j] = buffer[j - pixBytes] + rawBytes[i] & 0xFF;\n          j++;\n        }\n        break;\n      case 2:\n        for (i = 0; i < rowBytes; ++i) {\n          buffer[j++] = prevRow[i] + rawBytes[i] & 0xFF;\n        }\n        break;\n      case 3:\n        for (i = 0; i < pixBytes; ++i) {\n          buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];\n        }\n        for (; i < rowBytes; ++i) {\n          buffer[j] = (prevRow[i] + buffer[j - pixBytes] >> 1) + rawBytes[i] & 0xFF;\n          j++;\n        }\n        break;\n      case 4:\n        for (i = 0; i < pixBytes; ++i) {\n          up = prevRow[i];\n          c = rawBytes[i];\n          buffer[j++] = up + c;\n        }\n        for (; i < rowBytes; ++i) {\n          up = prevRow[i];\n          var upLeft = prevRow[i - pixBytes];\n          var left = buffer[j - pixBytes];\n          var p = left + up - upLeft;\n          var pa = p - left;\n          if (pa < 0) {\n            pa = -pa;\n          }\n          var pb = p - up;\n          if (pb < 0) {\n            pb = -pb;\n          }\n          var pc = p - upLeft;\n          if (pc < 0) {\n            pc = -pc;\n          }\n          c = rawBytes[i];\n          if (pa <= pb && pa <= pc) {\n            buffer[j++] = left + c;\n          } else if (pb <= pc) {\n            buffer[j++] = up + c;\n          } else {\n            buffer[j++] = upLeft + c;\n          }\n        }\n        break;\n      default:\n        throw new _util.FormatError('Unsupported predictor: ' + predictor);\n    }\n    this.bufferLength += rowBytes;\n  };\n  return PredictorStream;\n}();\nvar JpegStream = function JpegStreamClosure() {\n  function JpegStream(stream, maybeLength, dict, params) {\n    var ch;\n    while ((ch = stream.getByte()) !== -1) {\n      if (ch === 0xFF) {\n        stream.skip(-1);\n        break;\n      }\n    }\n    this.stream = stream;\n    this.maybeLength = maybeLength;\n    this.dict = dict;\n    this.params = params;\n    DecodeStream.call(this, maybeLength);\n  }\n  JpegStream.prototype = Object.create(DecodeStream.prototype);\n  Object.defineProperty(JpegStream.prototype, 'bytes', {\n    get: function JpegStream_bytes() {\n      return (0, _util.shadow)(this, 'bytes', this.stream.getBytes(this.maybeLength));\n    },\n    configurable: true\n  });\n  JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) {\n    if (this.bufferLength) {\n      return;\n    }\n    var jpegImage = new _jpg.JpegImage();\n    var decodeArr = this.dict.getArray('Decode', 'D');\n    if (this.forceRGB && (0, _util.isArray)(decodeArr)) {\n      var bitsPerComponent = this.dict.get('BitsPerComponent') || 8;\n      var decodeArrLength = decodeArr.length;\n      var transform = new Int32Array(decodeArrLength);\n      var transformNeeded = false;\n      var maxValue = (1 << bitsPerComponent) - 1;\n      for (var i = 0; i < decodeArrLength; i += 2) {\n        transform[i] = (decodeArr[i + 1] - decodeArr[i]) * 256 | 0;\n        transform[i + 1] = decodeArr[i] * maxValue | 0;\n        if (transform[i] !== 256 || transform[i + 1] !== 0) {\n          transformNeeded = true;\n        }\n      }\n      if (transformNeeded) {\n        jpegImage.decodeTransform = transform;\n      }\n    }\n    if ((0, _primitives.isDict)(this.params)) {\n      var colorTransform = this.params.get('ColorTransform');\n      if ((0, _util.isInt)(colorTransform)) {\n        jpegImage.colorTransform = colorTransform;\n      }\n    }\n    jpegImage.parse(this.bytes);\n    var data = jpegImage.getData(this.drawWidth, this.drawHeight, this.forceRGB);\n    this.buffer = data;\n    this.bufferLength = data.length;\n    this.eof = true;\n  };\n  JpegStream.prototype.getBytes = function JpegStream_getBytes(length) {\n    this.ensureBuffer();\n    return this.buffer;\n  };\n  JpegStream.prototype.getIR = function JpegStream_getIR(forceDataSchema) {\n    return (0, _util.createObjectURL)(this.bytes, 'image/jpeg', forceDataSchema);\n  };\n  return JpegStream;\n}();\nvar JpxStream = function JpxStreamClosure() {\n  function JpxStream(stream, maybeLength, dict, params) {\n    this.stream = stream;\n    this.maybeLength = maybeLength;\n    this.dict = dict;\n    this.params = params;\n    DecodeStream.call(this, maybeLength);\n  }\n  JpxStream.prototype = Object.create(DecodeStream.prototype);\n  Object.defineProperty(JpxStream.prototype, 'bytes', {\n    get: function JpxStream_bytes() {\n      return (0, _util.shadow)(this, 'bytes', this.stream.getBytes(this.maybeLength));\n    },\n    configurable: true\n  });\n  JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) {\n    if (this.bufferLength) {\n      return;\n    }\n    var jpxImage = new _jpx.JpxImage();\n    jpxImage.parse(this.bytes);\n    var width = jpxImage.width;\n    var height = jpxImage.height;\n    var componentsCount = jpxImage.componentsCount;\n    var tileCount = jpxImage.tiles.length;\n    if (tileCount === 1) {\n      this.buffer = jpxImage.tiles[0].items;\n    } else {\n      var data = new Uint8Array(width * height * componentsCount);\n      for (var k = 0; k < tileCount; k++) {\n        var tileComponents = jpxImage.tiles[k];\n        var tileWidth = tileComponents.width;\n        var tileHeight = tileComponents.height;\n        var tileLeft = tileComponents.left;\n        var tileTop = tileComponents.top;\n        var src = tileComponents.items;\n        var srcPosition = 0;\n        var dataPosition = (width * tileTop + tileLeft) * componentsCount;\n        var imgRowSize = width * componentsCount;\n        var tileRowSize = tileWidth * componentsCount;\n        for (var j = 0; j < tileHeight; j++) {\n          var rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize);\n          data.set(rowBytes, dataPosition);\n          srcPosition += tileRowSize;\n          dataPosition += imgRowSize;\n        }\n      }\n      this.buffer = data;\n    }\n    this.bufferLength = this.buffer.length;\n    this.eof = true;\n  };\n  return JpxStream;\n}();\nvar Jbig2Stream = function Jbig2StreamClosure() {\n  function Jbig2Stream(stream, maybeLength, dict, params) {\n    this.stream = stream;\n    this.maybeLength = maybeLength;\n    this.dict = dict;\n    this.params = params;\n    DecodeStream.call(this, maybeLength);\n  }\n  Jbig2Stream.prototype = Object.create(DecodeStream.prototype);\n  Object.defineProperty(Jbig2Stream.prototype, 'bytes', {\n    get: function Jbig2Stream_bytes() {\n      return (0, _util.shadow)(this, 'bytes', this.stream.getBytes(this.maybeLength));\n    },\n    configurable: true\n  });\n  Jbig2Stream.prototype.ensureBuffer = function Jbig2Stream_ensureBuffer(req) {\n    if (this.bufferLength) {\n      return;\n    }\n    var jbig2Image = new _jbig.Jbig2Image();\n    var chunks = [];\n    if ((0, _primitives.isDict)(this.params)) {\n      var globalsStream = this.params.get('JBIG2Globals');\n      if ((0, _primitives.isStream)(globalsStream)) {\n        var globals = globalsStream.getBytes();\n        chunks.push({\n          data: globals,\n          start: 0,\n          end: globals.length\n        });\n      }\n    }\n    chunks.push({\n      data: this.bytes,\n      start: 0,\n      end: this.bytes.length\n    });\n    var data = jbig2Image.parseChunks(chunks);\n    var dataLength = data.length;\n    for (var i = 0; i < dataLength; i++) {\n      data[i] ^= 0xFF;\n    }\n    this.buffer = data;\n    this.bufferLength = dataLength;\n    this.eof = true;\n  };\n  return Jbig2Stream;\n}();\nvar DecryptStream = function DecryptStreamClosure() {\n  function DecryptStream(str, maybeLength, decrypt) {\n    this.str = str;\n    this.dict = str.dict;\n    this.decrypt = decrypt;\n    this.nextChunk = null;\n    this.initialized = false;\n    DecodeStream.call(this, maybeLength);\n  }\n  var chunkSize = 512;\n  DecryptStream.prototype = Object.create(DecodeStream.prototype);\n  DecryptStream.prototype.readBlock = function DecryptStream_readBlock() {\n    var chunk;\n    if (this.initialized) {\n      chunk = this.nextChunk;\n    } else {\n      chunk = this.str.getBytes(chunkSize);\n      this.initialized = true;\n    }\n    if (!chunk || chunk.length === 0) {\n      this.eof = true;\n      return;\n    }\n    this.nextChunk = this.str.getBytes(chunkSize);\n    var hasMoreData = this.nextChunk && this.nextChunk.length > 0;\n    var decrypt = this.decrypt;\n    chunk = decrypt(chunk, !hasMoreData);\n    var bufferLength = this.bufferLength;\n    var i,\n        n = chunk.length;\n    var buffer = this.ensureBuffer(bufferLength + n);\n    for (i = 0; i < n; i++) {\n      buffer[bufferLength++] = chunk[i];\n    }\n    this.bufferLength = bufferLength;\n  };\n  return DecryptStream;\n}();\nvar Ascii85Stream = function Ascii85StreamClosure() {\n  function Ascii85Stream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n    this.input = new Uint8Array(5);\n    if (maybeLength) {\n      maybeLength = 0.8 * maybeLength;\n    }\n    DecodeStream.call(this, maybeLength);\n  }\n  Ascii85Stream.prototype = Object.create(DecodeStream.prototype);\n  Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() {\n    var TILDA_CHAR = 0x7E;\n    var Z_LOWER_CHAR = 0x7A;\n    var EOF = -1;\n    var str = this.str;\n    var c = str.getByte();\n    while ((0, _util.isSpace)(c)) {\n      c = str.getByte();\n    }\n    if (c === EOF || c === TILDA_CHAR) {\n      this.eof = true;\n      return;\n    }\n    var bufferLength = this.bufferLength,\n        buffer;\n    var i;\n    if (c === Z_LOWER_CHAR) {\n      buffer = this.ensureBuffer(bufferLength + 4);\n      for (i = 0; i < 4; ++i) {\n        buffer[bufferLength + i] = 0;\n      }\n      this.bufferLength += 4;\n    } else {\n      var input = this.input;\n      input[0] = c;\n      for (i = 1; i < 5; ++i) {\n        c = str.getByte();\n        while ((0, _util.isSpace)(c)) {\n          c = str.getByte();\n        }\n        input[i] = c;\n        if (c === EOF || c === TILDA_CHAR) {\n          break;\n        }\n      }\n      buffer = this.ensureBuffer(bufferLength + i - 1);\n      this.bufferLength += i - 1;\n      if (i < 5) {\n        for (; i < 5; ++i) {\n          input[i] = 0x21 + 84;\n        }\n        this.eof = true;\n      }\n      var t = 0;\n      for (i = 0; i < 5; ++i) {\n        t = t * 85 + (input[i] - 0x21);\n      }\n      for (i = 3; i >= 0; --i) {\n        buffer[bufferLength + i] = t & 0xFF;\n        t >>= 8;\n      }\n    }\n  };\n  return Ascii85Stream;\n}();\nvar AsciiHexStream = function AsciiHexStreamClosure() {\n  function AsciiHexStream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n    this.firstDigit = -1;\n    if (maybeLength) {\n      maybeLength = 0.5 * maybeLength;\n    }\n    DecodeStream.call(this, maybeLength);\n  }\n  AsciiHexStream.prototype = Object.create(DecodeStream.prototype);\n  AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() {\n    var UPSTREAM_BLOCK_SIZE = 8000;\n    var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE);\n    if (!bytes.length) {\n      this.eof = true;\n      return;\n    }\n    var maxDecodeLength = bytes.length + 1 >> 1;\n    var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength);\n    var bufferLength = this.bufferLength;\n    var firstDigit = this.firstDigit;\n    for (var i = 0, ii = bytes.length; i < ii; i++) {\n      var ch = bytes[i],\n          digit;\n      if (ch >= 0x30 && ch <= 0x39) {\n        digit = ch & 0x0F;\n      } else if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {\n        digit = (ch & 0x0F) + 9;\n      } else if (ch === 0x3E) {\n        this.eof = true;\n        break;\n      } else {\n        continue;\n      }\n      if (firstDigit < 0) {\n        firstDigit = digit;\n      } else {\n        buffer[bufferLength++] = firstDigit << 4 | digit;\n        firstDigit = -1;\n      }\n    }\n    if (firstDigit >= 0 && this.eof) {\n      buffer[bufferLength++] = firstDigit << 4;\n      firstDigit = -1;\n    }\n    this.firstDigit = firstDigit;\n    this.bufferLength = bufferLength;\n  };\n  return AsciiHexStream;\n}();\nvar RunLengthStream = function RunLengthStreamClosure() {\n  function RunLengthStream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n    DecodeStream.call(this, maybeLength);\n  }\n  RunLengthStream.prototype = Object.create(DecodeStream.prototype);\n  RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() {\n    var repeatHeader = this.str.getBytes(2);\n    if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) {\n      this.eof = true;\n      return;\n    }\n    var buffer;\n    var bufferLength = this.bufferLength;\n    var n = repeatHeader[0];\n    if (n < 128) {\n      buffer = this.ensureBuffer(bufferLength + n + 1);\n      buffer[bufferLength++] = repeatHeader[1];\n      if (n > 0) {\n        var source = this.str.getBytes(n);\n        buffer.set(source, bufferLength);\n        bufferLength += n;\n      }\n    } else {\n      n = 257 - n;\n      var b = repeatHeader[1];\n      buffer = this.ensureBuffer(bufferLength + n + 1);\n      for (var i = 0; i < n; i++) {\n        buffer[bufferLength++] = b;\n      }\n    }\n    this.bufferLength = bufferLength;\n  };\n  return RunLengthStream;\n}();\nvar CCITTFaxStream = function CCITTFaxStreamClosure() {\n  var ccittEOL = -2;\n  var ccittEOF = -1;\n  var twoDimPass = 0;\n  var twoDimHoriz = 1;\n  var twoDimVert0 = 2;\n  var twoDimVertR1 = 3;\n  var twoDimVertL1 = 4;\n  var twoDimVertR2 = 5;\n  var twoDimVertL2 = 6;\n  var twoDimVertR3 = 7;\n  var twoDimVertL3 = 8;\n  var twoDimTable = [[-1, -1], [-1, -1], [7, twoDimVertL3], [7, twoDimVertR3], [6, twoDimVertL2], [6, twoDimVertL2], [6, twoDimVertR2], [6, twoDimVertR2], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0]];\n  var whiteTable1 = [[-1, -1], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [12, 1984], [12, 2048], [12, 2112], [12, 2176], [12, 2240], [12, 2304], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [12, 2368], [12, 2432], [12, 2496], [12, 2560]];\n  var whiteTable2 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [8, 29], [8, 29], [8, 30], [8, 30], [8, 45], [8, 45], [8, 46], [8, 46], [7, 22], [7, 22], [7, 22], [7, 22], [7, 23], [7, 23], [7, 23], [7, 23], [8, 47], [8, 47], [8, 48], [8, 48], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [7, 20], [7, 20], [7, 20], [7, 20], [8, 33], [8, 33], [8, 34], [8, 34], [8, 35], [8, 35], [8, 36], [8, 36], [8, 37], [8, 37], [8, 38], [8, 38], [7, 19], [7, 19], [7, 19], [7, 19], [8, 31], [8, 31], [8, 32], [8, 32], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [8, 53], [8, 53], [8, 54], [8, 54], [7, 26], [7, 26], [7, 26], [7, 26], [8, 39], [8, 39], [8, 40], [8, 40], [8, 41], [8, 41], [8, 42], [8, 42], [8, 43], [8, 43], [8, 44], [8, 44], [7, 21], [7, 21], [7, 21], [7, 21], [7, 28], [7, 28], [7, 28], [7, 28], [8, 61], [8, 61], [8, 62], [8, 62], [8, 63], [8, 63], [8, 0], [8, 0], [8, 320], [8, 320], [8, 384], [8, 384], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [7, 27], [7, 27], [7, 27], [7, 27], [8, 59], [8, 59], [8, 60], [8, 60], [9, 1472], [9, 1536], [9, 1600], [9, 1728], [7, 18], [7, 18], [7, 18], [7, 18], [7, 24], [7, 24], [7, 24], [7, 24], [8, 49], [8, 49], [8, 50], [8, 50], [8, 51], [8, 51], [8, 52], [8, 52], [7, 25], [7, 25], [7, 25], [7, 25], [8, 55], [8, 55], [8, 56], [8, 56], [8, 57], [8, 57], [8, 58], [8, 58], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [8, 448], [8, 448], [8, 512], [8, 512], [9, 704], [9, 768], [8, 640], [8, 640], [8, 576], [8, 576], [9, 832], [9, 896], [9, 960], [9, 1024], [9, 1088], [9, 1152], [9, 1216], [9, 1280], [9, 1344], [9, 1408], [7, 256], [7, 256], [7, 256], [7, 256], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7]];\n  var blackTable1 = [[-1, -1], [-1, -1], [12, ccittEOL], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [11, 1792], [11, 1792], [12, 1984], [12, 1984], [12, 2048], [12, 2048], [12, 2112], [12, 2112], [12, 2176], [12, 2176], [12, 2240], [12, 2240], [12, 2304], [12, 2304], [11, 1856], [11, 1856], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [11, 1920], [11, 1920], [12, 2368], [12, 2368], [12, 2432], [12, 2432], [12, 2496], [12, 2496], [12, 2560], [12, 2560], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [12, 52], [12, 52], [13, 640], [13, 704], [13, 768], [13, 832], [12, 55], [12, 55], [12, 56], [12, 56], [13, 1280], [13, 1344], [13, 1408], [13, 1472], [12, 59], [12, 59], [12, 60], [12, 60], [13, 1536], [13, 1600], [11, 24], [11, 24], [11, 24], [11, 24], [11, 25], [11, 25], [11, 25], [11, 25], [13, 1664], [13, 1728], [12, 320], [12, 320], [12, 384], [12, 384], [12, 448], [12, 448], [13, 512], [13, 576], [12, 53], [12, 53], [12, 54], [12, 54], [13, 896], [13, 960], [13, 1024], [13, 1088], [13, 1152], [13, 1216], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64]];\n  var blackTable2 = [[8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [11, 23], [11, 23], [12, 50], [12, 51], [12, 44], [12, 45], [12, 46], [12, 47], [12, 57], [12, 58], [12, 61], [12, 256], [10, 16], [10, 16], [10, 16], [10, 16], [10, 17], [10, 17], [10, 17], [10, 17], [12, 48], [12, 49], [12, 62], [12, 63], [12, 30], [12, 31], [12, 32], [12, 33], [12, 40], [12, 41], [11, 22], [11, 22], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [12, 128], [12, 192], [12, 26], [12, 27], [12, 28], [12, 29], [11, 19], [11, 19], [11, 20], [11, 20], [12, 34], [12, 35], [12, 36], [12, 37], [12, 38], [12, 39], [11, 21], [11, 21], [12, 42], [12, 43], [10, 0], [10, 0], [10, 0], [10, 0], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12]];\n  var blackTable3 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [6, 9], [6, 8], [5, 7], [5, 7], [4, 6], [4, 6], [4, 6], [4, 6], [4, 5], [4, 5], [4, 5], [4, 5], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2]];\n  function CCITTFaxStream(str, maybeLength, params) {\n    this.str = str;\n    this.dict = str.dict;\n    params = params || _primitives.Dict.empty;\n    this.encoding = params.get('K') || 0;\n    this.eoline = params.get('EndOfLine') || false;\n    this.byteAlign = params.get('EncodedByteAlign') || false;\n    this.columns = params.get('Columns') || 1728;\n    this.rows = params.get('Rows') || 0;\n    var eoblock = params.get('EndOfBlock');\n    if (eoblock === null || eoblock === undefined) {\n      eoblock = true;\n    }\n    this.eoblock = eoblock;\n    this.black = params.get('BlackIs1') || false;\n    this.codingLine = new Uint32Array(this.columns + 1);\n    this.refLine = new Uint32Array(this.columns + 2);\n    this.codingLine[0] = this.columns;\n    this.codingPos = 0;\n    this.row = 0;\n    this.nextLine2D = this.encoding < 0;\n    this.inputBits = 0;\n    this.inputBuf = 0;\n    this.outputBits = 0;\n    var code1;\n    while ((code1 = this.lookBits(12)) === 0) {\n      this.eatBits(1);\n    }\n    if (code1 === 1) {\n      this.eatBits(12);\n    }\n    if (this.encoding > 0) {\n      this.nextLine2D = !this.lookBits(1);\n      this.eatBits(1);\n    }\n    DecodeStream.call(this, maybeLength);\n  }\n  CCITTFaxStream.prototype = Object.create(DecodeStream.prototype);\n  CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() {\n    while (!this.eof) {\n      var c = this.lookChar();\n      this.ensureBuffer(this.bufferLength + 1);\n      this.buffer[this.bufferLength++] = c;\n    }\n  };\n  CCITTFaxStream.prototype.addPixels = function ccittFaxStreamAddPixels(a1, blackPixels) {\n    var codingLine = this.codingLine;\n    var codingPos = this.codingPos;\n    if (a1 > codingLine[codingPos]) {\n      if (a1 > this.columns) {\n        (0, _util.info)('row is wrong length');\n        this.err = true;\n        a1 = this.columns;\n      }\n      if (codingPos & 1 ^ blackPixels) {\n        ++codingPos;\n      }\n      codingLine[codingPos] = a1;\n    }\n    this.codingPos = codingPos;\n  };\n  CCITTFaxStream.prototype.addPixelsNeg = function ccittFaxStreamAddPixelsNeg(a1, blackPixels) {\n    var codingLine = this.codingLine;\n    var codingPos = this.codingPos;\n    if (a1 > codingLine[codingPos]) {\n      if (a1 > this.columns) {\n        (0, _util.info)('row is wrong length');\n        this.err = true;\n        a1 = this.columns;\n      }\n      if (codingPos & 1 ^ blackPixels) {\n        ++codingPos;\n      }\n      codingLine[codingPos] = a1;\n    } else if (a1 < codingLine[codingPos]) {\n      if (a1 < 0) {\n        (0, _util.info)('invalid code');\n        this.err = true;\n        a1 = 0;\n      }\n      while (codingPos > 0 && a1 < codingLine[codingPos - 1]) {\n        --codingPos;\n      }\n      codingLine[codingPos] = a1;\n    }\n    this.codingPos = codingPos;\n  };\n  CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() {\n    var refLine = this.refLine;\n    var codingLine = this.codingLine;\n    var columns = this.columns;\n    var refPos, blackPixels, bits, i;\n    if (this.outputBits === 0) {\n      if (this.eof) {\n        return null;\n      }\n      this.err = false;\n      var code1, code2, code3;\n      if (this.nextLine2D) {\n        for (i = 0; codingLine[i] < columns; ++i) {\n          refLine[i] = codingLine[i];\n        }\n        refLine[i++] = columns;\n        refLine[i] = columns;\n        codingLine[0] = 0;\n        this.codingPos = 0;\n        refPos = 0;\n        blackPixels = 0;\n        while (codingLine[this.codingPos] < columns) {\n          code1 = this.getTwoDimCode();\n          switch (code1) {\n            case twoDimPass:\n              this.addPixels(refLine[refPos + 1], blackPixels);\n              if (refLine[refPos + 1] < columns) {\n                refPos += 2;\n              }\n              break;\n            case twoDimHoriz:\n              code1 = code2 = 0;\n              if (blackPixels) {\n                do {\n                  code1 += code3 = this.getBlackCode();\n                } while (code3 >= 64);\n                do {\n                  code2 += code3 = this.getWhiteCode();\n                } while (code3 >= 64);\n              } else {\n                do {\n                  code1 += code3 = this.getWhiteCode();\n                } while (code3 >= 64);\n                do {\n                  code2 += code3 = this.getBlackCode();\n                } while (code3 >= 64);\n              }\n              this.addPixels(codingLine[this.codingPos] + code1, blackPixels);\n              if (codingLine[this.codingPos] < columns) {\n                this.addPixels(codingLine[this.codingPos] + code2, blackPixels ^ 1);\n              }\n              while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                refPos += 2;\n              }\n              break;\n            case twoDimVertR3:\n              this.addPixels(refLine[refPos] + 3, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                ++refPos;\n                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVertR2:\n              this.addPixels(refLine[refPos] + 2, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                ++refPos;\n                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVertR1:\n              this.addPixels(refLine[refPos] + 1, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                ++refPos;\n                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVert0:\n              this.addPixels(refLine[refPos], blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                ++refPos;\n                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVertL3:\n              this.addPixelsNeg(refLine[refPos] - 3, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                if (refPos > 0) {\n                  --refPos;\n                } else {\n                  ++refPos;\n                }\n                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVertL2:\n              this.addPixelsNeg(refLine[refPos] - 2, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                if (refPos > 0) {\n                  --refPos;\n                } else {\n                  ++refPos;\n                }\n                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVertL1:\n              this.addPixelsNeg(refLine[refPos] - 1, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                if (refPos > 0) {\n                  --refPos;\n                } else {\n                  ++refPos;\n                }\n                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case ccittEOF:\n              this.addPixels(columns, 0);\n              this.eof = true;\n              break;\n            default:\n              (0, _util.info)('bad 2d code');\n              this.addPixels(columns, 0);\n              this.err = true;\n          }\n        }\n      } else {\n        codingLine[0] = 0;\n        this.codingPos = 0;\n        blackPixels = 0;\n        while (codingLine[this.codingPos] < columns) {\n          code1 = 0;\n          if (blackPixels) {\n            do {\n              code1 += code3 = this.getBlackCode();\n            } while (code3 >= 64);\n          } else {\n            do {\n              code1 += code3 = this.getWhiteCode();\n            } while (code3 >= 64);\n          }\n          this.addPixels(codingLine[this.codingPos] + code1, blackPixels);\n          blackPixels ^= 1;\n        }\n      }\n      var gotEOL = false;\n      if (this.byteAlign) {\n        this.inputBits &= ~7;\n      }\n      if (!this.eoblock && this.row === this.rows - 1) {\n        this.eof = true;\n      } else {\n        code1 = this.lookBits(12);\n        if (this.eoline) {\n          while (code1 !== ccittEOF && code1 !== 1) {\n            this.eatBits(1);\n            code1 = this.lookBits(12);\n          }\n        } else {\n          while (code1 === 0) {\n            this.eatBits(1);\n            code1 = this.lookBits(12);\n          }\n        }\n        if (code1 === 1) {\n          this.eatBits(12);\n          gotEOL = true;\n        } else if (code1 === ccittEOF) {\n          this.eof = true;\n        }\n      }\n      if (!this.eof && this.encoding > 0) {\n        this.nextLine2D = !this.lookBits(1);\n        this.eatBits(1);\n      }\n      if (this.eoblock && gotEOL && this.byteAlign) {\n        code1 = this.lookBits(12);\n        if (code1 === 1) {\n          this.eatBits(12);\n          if (this.encoding > 0) {\n            this.lookBits(1);\n            this.eatBits(1);\n          }\n          if (this.encoding >= 0) {\n            for (i = 0; i < 4; ++i) {\n              code1 = this.lookBits(12);\n              if (code1 !== 1) {\n                (0, _util.info)('bad rtc code: ' + code1);\n              }\n              this.eatBits(12);\n              if (this.encoding > 0) {\n                this.lookBits(1);\n                this.eatBits(1);\n              }\n            }\n          }\n          this.eof = true;\n        }\n      } else if (this.err && this.eoline) {\n        while (true) {\n          code1 = this.lookBits(13);\n          if (code1 === ccittEOF) {\n            this.eof = true;\n            return null;\n          }\n          if (code1 >> 1 === 1) {\n            break;\n          }\n          this.eatBits(1);\n        }\n        this.eatBits(12);\n        if (this.encoding > 0) {\n          this.eatBits(1);\n          this.nextLine2D = !(code1 & 1);\n        }\n      }\n      if (codingLine[0] > 0) {\n        this.outputBits = codingLine[this.codingPos = 0];\n      } else {\n        this.outputBits = codingLine[this.codingPos = 1];\n      }\n      this.row++;\n    }\n    var c;\n    if (this.outputBits >= 8) {\n      c = this.codingPos & 1 ? 0 : 0xFF;\n      this.outputBits -= 8;\n      if (this.outputBits === 0 && codingLine[this.codingPos] < columns) {\n        this.codingPos++;\n        this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1];\n      }\n    } else {\n      bits = 8;\n      c = 0;\n      do {\n        if (this.outputBits > bits) {\n          c <<= bits;\n          if (!(this.codingPos & 1)) {\n            c |= 0xFF >> 8 - bits;\n          }\n          this.outputBits -= bits;\n          bits = 0;\n        } else {\n          c <<= this.outputBits;\n          if (!(this.codingPos & 1)) {\n            c |= 0xFF >> 8 - this.outputBits;\n          }\n          bits -= this.outputBits;\n          this.outputBits = 0;\n          if (codingLine[this.codingPos] < columns) {\n            this.codingPos++;\n            this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1];\n          } else if (bits > 0) {\n            c <<= bits;\n            bits = 0;\n          }\n        }\n      } while (bits);\n    }\n    if (this.black) {\n      c ^= 0xFF;\n    }\n    return c;\n  };\n  CCITTFaxStream.prototype.findTableCode = function ccittFaxStreamFindTableCode(start, end, table, limit) {\n    var limitValue = limit || 0;\n    for (var i = start; i <= end; ++i) {\n      var code = this.lookBits(i);\n      if (code === ccittEOF) {\n        return [true, 1, false];\n      }\n      if (i < end) {\n        code <<= end - i;\n      }\n      if (!limitValue || code >= limitValue) {\n        var p = table[code - limitValue];\n        if (p[0] === i) {\n          this.eatBits(i);\n          return [true, p[1], true];\n        }\n      }\n    }\n    return [false, 0, false];\n  };\n  CCITTFaxStream.prototype.getTwoDimCode = function ccittFaxStreamGetTwoDimCode() {\n    var code = 0;\n    var p;\n    if (this.eoblock) {\n      code = this.lookBits(7);\n      p = twoDimTable[code];\n      if (p && p[0] > 0) {\n        this.eatBits(p[0]);\n        return p[1];\n      }\n    } else {\n      var result = this.findTableCode(1, 7, twoDimTable);\n      if (result[0] && result[2]) {\n        return result[1];\n      }\n    }\n    (0, _util.info)('Bad two dim code');\n    return ccittEOF;\n  };\n  CCITTFaxStream.prototype.getWhiteCode = function ccittFaxStreamGetWhiteCode() {\n    var code = 0;\n    var p;\n    if (this.eoblock) {\n      code = this.lookBits(12);\n      if (code === ccittEOF) {\n        return 1;\n      }\n      if (code >> 5 === 0) {\n        p = whiteTable1[code];\n      } else {\n        p = whiteTable2[code >> 3];\n      }\n      if (p[0] > 0) {\n        this.eatBits(p[0]);\n        return p[1];\n      }\n    } else {\n      var result = this.findTableCode(1, 9, whiteTable2);\n      if (result[0]) {\n        return result[1];\n      }\n      result = this.findTableCode(11, 12, whiteTable1);\n      if (result[0]) {\n        return result[1];\n      }\n    }\n    (0, _util.info)('bad white code');\n    this.eatBits(1);\n    return 1;\n  };\n  CCITTFaxStream.prototype.getBlackCode = function ccittFaxStreamGetBlackCode() {\n    var code, p;\n    if (this.eoblock) {\n      code = this.lookBits(13);\n      if (code === ccittEOF) {\n        return 1;\n      }\n      if (code >> 7 === 0) {\n        p = blackTable1[code];\n      } else if (code >> 9 === 0 && code >> 7 !== 0) {\n        p = blackTable2[(code >> 1) - 64];\n      } else {\n        p = blackTable3[code >> 7];\n      }\n      if (p[0] > 0) {\n        this.eatBits(p[0]);\n        return p[1];\n      }\n    } else {\n      var result = this.findTableCode(2, 6, blackTable3);\n      if (result[0]) {\n        return result[1];\n      }\n      result = this.findTableCode(7, 12, blackTable2, 64);\n      if (result[0]) {\n        return result[1];\n      }\n      result = this.findTableCode(10, 13, blackTable1);\n      if (result[0]) {\n        return result[1];\n      }\n    }\n    (0, _util.info)('bad black code');\n    this.eatBits(1);\n    return 1;\n  };\n  CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) {\n    var c;\n    while (this.inputBits < n) {\n      if ((c = this.str.getByte()) === -1) {\n        if (this.inputBits === 0) {\n          return ccittEOF;\n        }\n        return this.inputBuf << n - this.inputBits & 0xFFFF >> 16 - n;\n      }\n      this.inputBuf = this.inputBuf << 8 | c;\n      this.inputBits += 8;\n    }\n    return this.inputBuf >> this.inputBits - n & 0xFFFF >> 16 - n;\n  };\n  CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) {\n    if ((this.inputBits -= n) < 0) {\n      this.inputBits = 0;\n    }\n  };\n  return CCITTFaxStream;\n}();\nvar LZWStream = function LZWStreamClosure() {\n  function LZWStream(str, maybeLength, earlyChange) {\n    this.str = str;\n    this.dict = str.dict;\n    this.cachedData = 0;\n    this.bitsCached = 0;\n    var maxLzwDictionarySize = 4096;\n    var lzwState = {\n      earlyChange: earlyChange,\n      codeLength: 9,\n      nextCode: 258,\n      dictionaryValues: new Uint8Array(maxLzwDictionarySize),\n      dictionaryLengths: new Uint16Array(maxLzwDictionarySize),\n      dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),\n      currentSequence: new Uint8Array(maxLzwDictionarySize),\n      currentSequenceLength: 0\n    };\n    for (var i = 0; i < 256; ++i) {\n      lzwState.dictionaryValues[i] = i;\n      lzwState.dictionaryLengths[i] = 1;\n    }\n    this.lzwState = lzwState;\n    DecodeStream.call(this, maybeLength);\n  }\n  LZWStream.prototype = Object.create(DecodeStream.prototype);\n  LZWStream.prototype.readBits = function LZWStream_readBits(n) {\n    var bitsCached = this.bitsCached;\n    var cachedData = this.cachedData;\n    while (bitsCached < n) {\n      var c = this.str.getByte();\n      if (c === -1) {\n        this.eof = true;\n        return null;\n      }\n      cachedData = cachedData << 8 | c;\n      bitsCached += 8;\n    }\n    this.bitsCached = bitsCached -= n;\n    this.cachedData = cachedData;\n    this.lastCode = null;\n    return cachedData >>> bitsCached & (1 << n) - 1;\n  };\n  LZWStream.prototype.readBlock = function LZWStream_readBlock() {\n    var blockSize = 512;\n    var estimatedDecodedSize = blockSize * 2,\n        decodedSizeDelta = blockSize;\n    var i, j, q;\n    var lzwState = this.lzwState;\n    if (!lzwState) {\n      return;\n    }\n    var earlyChange = lzwState.earlyChange;\n    var nextCode = lzwState.nextCode;\n    var dictionaryValues = lzwState.dictionaryValues;\n    var dictionaryLengths = lzwState.dictionaryLengths;\n    var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;\n    var codeLength = lzwState.codeLength;\n    var prevCode = lzwState.prevCode;\n    var currentSequence = lzwState.currentSequence;\n    var currentSequenceLength = lzwState.currentSequenceLength;\n    var decodedLength = 0;\n    var currentBufferLength = this.bufferLength;\n    var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);\n    for (i = 0; i < blockSize; i++) {\n      var code = this.readBits(codeLength);\n      var hasPrev = currentSequenceLength > 0;\n      if (code < 256) {\n        currentSequence[0] = code;\n        currentSequenceLength = 1;\n      } else if (code >= 258) {\n        if (code < nextCode) {\n          currentSequenceLength = dictionaryLengths[code];\n          for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {\n            currentSequence[j] = dictionaryValues[q];\n            q = dictionaryPrevCodes[q];\n          }\n        } else {\n          currentSequence[currentSequenceLength++] = currentSequence[0];\n        }\n      } else if (code === 256) {\n        codeLength = 9;\n        nextCode = 258;\n        currentSequenceLength = 0;\n        continue;\n      } else {\n        this.eof = true;\n        delete this.lzwState;\n        break;\n      }\n      if (hasPrev) {\n        dictionaryPrevCodes[nextCode] = prevCode;\n        dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;\n        dictionaryValues[nextCode] = currentSequence[0];\n        nextCode++;\n        codeLength = nextCode + earlyChange & nextCode + earlyChange - 1 ? codeLength : Math.min(Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1, 12) | 0;\n      }\n      prevCode = code;\n      decodedLength += currentSequenceLength;\n      if (estimatedDecodedSize < decodedLength) {\n        do {\n          estimatedDecodedSize += decodedSizeDelta;\n        } while (estimatedDecodedSize < decodedLength);\n        buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);\n      }\n      for (j = 0; j < currentSequenceLength; j++) {\n        buffer[currentBufferLength++] = currentSequence[j];\n      }\n    }\n    lzwState.nextCode = nextCode;\n    lzwState.codeLength = codeLength;\n    lzwState.prevCode = prevCode;\n    lzwState.currentSequenceLength = currentSequenceLength;\n    this.bufferLength = currentBufferLength;\n  };\n  return LZWStream;\n}();\nvar NullStream = function NullStreamClosure() {\n  function NullStream() {\n    Stream.call(this, new Uint8Array(0));\n  }\n  NullStream.prototype = Stream.prototype;\n  return NullStream;\n}();\nexports.Ascii85Stream = Ascii85Stream;\nexports.AsciiHexStream = AsciiHexStream;\nexports.CCITTFaxStream = CCITTFaxStream;\nexports.DecryptStream = DecryptStream;\nexports.DecodeStream = DecodeStream;\nexports.FlateStream = FlateStream;\nexports.Jbig2Stream = Jbig2Stream;\nexports.JpegStream = JpegStream;\nexports.JpxStream = JpxStream;\nexports.NullStream = NullStream;\nexports.PredictorStream = PredictorStream;\nexports.RunLengthStream = RunLengthStream;\nexports.Stream = Stream;\nexports.StreamsSequenceStream = StreamsSequenceStream;\nexports.StringStream = StringStream;\nexports.LZWStream = LZWStream;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ColorSpace = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _function = __w_pdfjs_require__(7);\n\nvar ColorSpace = function ColorSpaceClosure() {\n  function resizeRgbImage(src, bpc, w1, h1, w2, h2, alpha01, dest) {\n    var COMPONENTS = 3;\n    alpha01 = alpha01 !== 1 ? 0 : alpha01;\n    var xRatio = w1 / w2;\n    var yRatio = h1 / h2;\n    var i,\n        j,\n        py,\n        newIndex = 0,\n        oldIndex;\n    var xScaled = new Uint16Array(w2);\n    var w1Scanline = w1 * COMPONENTS;\n    for (i = 0; i < w2; i++) {\n      xScaled[i] = Math.floor(i * xRatio) * COMPONENTS;\n    }\n    for (i = 0; i < h2; i++) {\n      py = Math.floor(i * yRatio) * w1Scanline;\n      for (j = 0; j < w2; j++) {\n        oldIndex = py + xScaled[j];\n        dest[newIndex++] = src[oldIndex++];\n        dest[newIndex++] = src[oldIndex++];\n        dest[newIndex++] = src[oldIndex++];\n        newIndex += alpha01;\n      }\n    }\n  }\n  function ColorSpace() {\n    throw new Error('should not call ColorSpace constructor');\n  }\n  ColorSpace.prototype = {\n    getRgb: function ColorSpace_getRgb(src, srcOffset) {\n      var rgb = new Uint8Array(3);\n      this.getRgbItem(src, srcOffset, rgb, 0);\n      return rgb;\n    },\n    getRgbItem: function ColorSpace_getRgbItem(src, srcOffset, dest, destOffset) {\n      throw new Error('Should not call ColorSpace.getRgbItem');\n    },\n    getRgbBuffer: function ColorSpace_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      throw new Error('Should not call ColorSpace.getRgbBuffer');\n    },\n    getOutputLength: function ColorSpace_getOutputLength(inputLength, alpha01) {\n      throw new Error('Should not call ColorSpace.getOutputLength');\n    },\n    isPassthrough: function ColorSpace_isPassthrough(bits) {\n      return false;\n    },\n    fillRgb: function ColorSpace_fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) {\n      var count = originalWidth * originalHeight;\n      var rgbBuf = null;\n      var numComponentColors = 1 << bpc;\n      var needsResizing = originalHeight !== height || originalWidth !== width;\n      var i, ii;\n      if (this.isPassthrough(bpc)) {\n        rgbBuf = comps;\n      } else if (this.numComps === 1 && count > numComponentColors && this.name !== 'DeviceGray' && this.name !== 'DeviceRGB') {\n        var allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : new Uint16Array(numComponentColors);\n        var key;\n        for (i = 0; i < numComponentColors; i++) {\n          allColors[i] = i;\n        }\n        var colorMap = new Uint8Array(numComponentColors * 3);\n        this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, 0);\n        var destPos, rgbPos;\n        if (!needsResizing) {\n          destPos = 0;\n          for (i = 0; i < count; ++i) {\n            key = comps[i] * 3;\n            dest[destPos++] = colorMap[key];\n            dest[destPos++] = colorMap[key + 1];\n            dest[destPos++] = colorMap[key + 2];\n            destPos += alpha01;\n          }\n        } else {\n          rgbBuf = new Uint8Array(count * 3);\n          rgbPos = 0;\n          for (i = 0; i < count; ++i) {\n            key = comps[i] * 3;\n            rgbBuf[rgbPos++] = colorMap[key];\n            rgbBuf[rgbPos++] = colorMap[key + 1];\n            rgbBuf[rgbPos++] = colorMap[key + 2];\n          }\n        }\n      } else {\n        if (!needsResizing) {\n          this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, alpha01);\n        } else {\n          rgbBuf = new Uint8Array(count * 3);\n          this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, 0);\n        }\n      }\n      if (rgbBuf) {\n        if (needsResizing) {\n          resizeRgbImage(rgbBuf, bpc, originalWidth, originalHeight, width, height, alpha01, dest);\n        } else {\n          rgbPos = 0;\n          destPos = 0;\n          for (i = 0, ii = width * actualHeight; i < ii; i++) {\n            dest[destPos++] = rgbBuf[rgbPos++];\n            dest[destPos++] = rgbBuf[rgbPos++];\n            dest[destPos++] = rgbBuf[rgbPos++];\n            destPos += alpha01;\n          }\n        }\n      }\n    },\n    usesZeroToOneRange: true\n  };\n  ColorSpace.parse = function ColorSpace_parse(cs, xref, res) {\n    var IR = ColorSpace.parseToIR(cs, xref, res);\n    if (IR instanceof AlternateCS) {\n      return IR;\n    }\n    return ColorSpace.fromIR(IR);\n  };\n  ColorSpace.fromIR = function ColorSpace_fromIR(IR) {\n    var name = (0, _util.isArray)(IR) ? IR[0] : IR;\n    var whitePoint, blackPoint, gamma;\n    switch (name) {\n      case 'DeviceGrayCS':\n        return this.singletons.gray;\n      case 'DeviceRgbCS':\n        return this.singletons.rgb;\n      case 'DeviceCmykCS':\n        return this.singletons.cmyk;\n      case 'CalGrayCS':\n        whitePoint = IR[1];\n        blackPoint = IR[2];\n        gamma = IR[3];\n        return new CalGrayCS(whitePoint, blackPoint, gamma);\n      case 'CalRGBCS':\n        whitePoint = IR[1];\n        blackPoint = IR[2];\n        gamma = IR[3];\n        var matrix = IR[4];\n        return new CalRGBCS(whitePoint, blackPoint, gamma, matrix);\n      case 'PatternCS':\n        var basePatternCS = IR[1];\n        if (basePatternCS) {\n          basePatternCS = ColorSpace.fromIR(basePatternCS);\n        }\n        return new PatternCS(basePatternCS);\n      case 'IndexedCS':\n        var baseIndexedCS = IR[1];\n        var hiVal = IR[2];\n        var lookup = IR[3];\n        return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);\n      case 'AlternateCS':\n        var numComps = IR[1];\n        var alt = IR[2];\n        var tintFnIR = IR[3];\n        return new AlternateCS(numComps, ColorSpace.fromIR(alt), _function.PDFFunction.fromIR(tintFnIR));\n      case 'LabCS':\n        whitePoint = IR[1];\n        blackPoint = IR[2];\n        var range = IR[3];\n        return new LabCS(whitePoint, blackPoint, range);\n      default:\n        throw new _util.FormatError('Unknown colorspace name: ' + name);\n    }\n  };\n  ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) {\n    if ((0, _primitives.isName)(cs)) {\n      var colorSpaces = res.get('ColorSpace');\n      if ((0, _primitives.isDict)(colorSpaces)) {\n        var refcs = colorSpaces.get(cs.name);\n        if (refcs) {\n          cs = refcs;\n        }\n      }\n    }\n    cs = xref.fetchIfRef(cs);\n    if ((0, _primitives.isName)(cs)) {\n      switch (cs.name) {\n        case 'DeviceGray':\n        case 'G':\n          return 'DeviceGrayCS';\n        case 'DeviceRGB':\n        case 'RGB':\n          return 'DeviceRgbCS';\n        case 'DeviceCMYK':\n        case 'CMYK':\n          return 'DeviceCmykCS';\n        case 'Pattern':\n          return ['PatternCS', null];\n        default:\n          throw new _util.FormatError('unrecognized colorspace ' + cs.name);\n      }\n    }\n    if ((0, _util.isArray)(cs)) {\n      var mode = xref.fetchIfRef(cs[0]).name;\n      var numComps, params, alt, whitePoint, blackPoint, gamma;\n      switch (mode) {\n        case 'DeviceGray':\n        case 'G':\n          return 'DeviceGrayCS';\n        case 'DeviceRGB':\n        case 'RGB':\n          return 'DeviceRgbCS';\n        case 'DeviceCMYK':\n        case 'CMYK':\n          return 'DeviceCmykCS';\n        case 'CalGray':\n          params = xref.fetchIfRef(cs[1]);\n          whitePoint = params.getArray('WhitePoint');\n          blackPoint = params.getArray('BlackPoint');\n          gamma = params.get('Gamma');\n          return ['CalGrayCS', whitePoint, blackPoint, gamma];\n        case 'CalRGB':\n          params = xref.fetchIfRef(cs[1]);\n          whitePoint = params.getArray('WhitePoint');\n          blackPoint = params.getArray('BlackPoint');\n          gamma = params.getArray('Gamma');\n          var matrix = params.getArray('Matrix');\n          return ['CalRGBCS', whitePoint, blackPoint, gamma, matrix];\n        case 'ICCBased':\n          var stream = xref.fetchIfRef(cs[1]);\n          var dict = stream.dict;\n          numComps = dict.get('N');\n          alt = dict.get('Alternate');\n          if (alt) {\n            var altIR = ColorSpace.parseToIR(alt, xref, res);\n            var altCS = ColorSpace.fromIR(altIR);\n            if (altCS.numComps === numComps) {\n              return altIR;\n            }\n            (0, _util.warn)('ICCBased color space: Ignoring incorrect /Alternate entry.');\n          }\n          if (numComps === 1) {\n            return 'DeviceGrayCS';\n          } else if (numComps === 3) {\n            return 'DeviceRgbCS';\n          } else if (numComps === 4) {\n            return 'DeviceCmykCS';\n          }\n          break;\n        case 'Pattern':\n          var basePatternCS = cs[1] || null;\n          if (basePatternCS) {\n            basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);\n          }\n          return ['PatternCS', basePatternCS];\n        case 'Indexed':\n        case 'I':\n          var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res);\n          var hiVal = xref.fetchIfRef(cs[2]) + 1;\n          var lookup = xref.fetchIfRef(cs[3]);\n          if ((0, _primitives.isStream)(lookup)) {\n            lookup = lookup.getBytes();\n          }\n          return ['IndexedCS', baseIndexedCS, hiVal, lookup];\n        case 'Separation':\n        case 'DeviceN':\n          var name = xref.fetchIfRef(cs[1]);\n          numComps = (0, _util.isArray)(name) ? name.length : 1;\n          alt = ColorSpace.parseToIR(cs[2], xref, res);\n          var tintFnIR = _function.PDFFunction.getIR(xref, xref.fetchIfRef(cs[3]));\n          return ['AlternateCS', numComps, alt, tintFnIR];\n        case 'Lab':\n          params = xref.fetchIfRef(cs[1]);\n          whitePoint = params.getArray('WhitePoint');\n          blackPoint = params.getArray('BlackPoint');\n          var range = params.getArray('Range');\n          return ['LabCS', whitePoint, blackPoint, range];\n        default:\n          throw new _util.FormatError('unimplemented color space object \"' + mode + '\"');\n      }\n    }\n    throw new _util.FormatError('unrecognized color space object: \"' + cs + '\"');\n  };\n  ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) {\n    if (!(0, _util.isArray)(decode)) {\n      return true;\n    }\n    if (n * 2 !== decode.length) {\n      (0, _util.warn)('The decode map is not the correct length');\n      return true;\n    }\n    for (var i = 0, ii = decode.length; i < ii; i += 2) {\n      if (decode[i] !== 0 || decode[i + 1] !== 1) {\n        return false;\n      }\n    }\n    return true;\n  };\n  ColorSpace.singletons = {\n    get gray() {\n      return (0, _util.shadow)(this, 'gray', new DeviceGrayCS());\n    },\n    get rgb() {\n      return (0, _util.shadow)(this, 'rgb', new DeviceRgbCS());\n    },\n    get cmyk() {\n      return (0, _util.shadow)(this, 'cmyk', new DeviceCmykCS());\n    }\n  };\n  return ColorSpace;\n}();\nvar AlternateCS = function AlternateCSClosure() {\n  function AlternateCS(numComps, base, tintFn) {\n    this.name = 'Alternate';\n    this.numComps = numComps;\n    this.defaultColor = new Float32Array(numComps);\n    for (var i = 0; i < numComps; ++i) {\n      this.defaultColor[i] = 1;\n    }\n    this.base = base;\n    this.tintFn = tintFn;\n    this.tmpBuf = new Float32Array(base.numComps);\n  }\n  AlternateCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function AlternateCS_getRgbItem(src, srcOffset, dest, destOffset) {\n      var tmpBuf = this.tmpBuf;\n      this.tintFn(src, srcOffset, tmpBuf, 0);\n      this.base.getRgbItem(tmpBuf, 0, dest, destOffset);\n    },\n    getRgbBuffer: function AlternateCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      var tintFn = this.tintFn;\n      var base = this.base;\n      var scale = 1 / ((1 << bits) - 1);\n      var baseNumComps = base.numComps;\n      var usesZeroToOneRange = base.usesZeroToOneRange;\n      var isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && alpha01 === 0;\n      var pos = isPassthrough ? destOffset : 0;\n      var baseBuf = isPassthrough ? dest : new Uint8Array(baseNumComps * count);\n      var numComps = this.numComps;\n      var scaled = new Float32Array(numComps);\n      var tinted = new Float32Array(baseNumComps);\n      var i, j;\n      for (i = 0; i < count; i++) {\n        for (j = 0; j < numComps; j++) {\n          scaled[j] = src[srcOffset++] * scale;\n        }\n        tintFn(scaled, 0, tinted, 0);\n        if (usesZeroToOneRange) {\n          for (j = 0; j < baseNumComps; j++) {\n            baseBuf[pos++] = tinted[j] * 255;\n          }\n        } else {\n          base.getRgbItem(tinted, 0, baseBuf, pos);\n          pos += baseNumComps;\n        }\n      }\n      if (!isPassthrough) {\n        base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01);\n      }\n    },\n    getOutputLength: function AlternateCS_getOutputLength(inputLength, alpha01) {\n      return this.base.getOutputLength(inputLength * this.base.numComps / this.numComps, alpha01);\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n  return AlternateCS;\n}();\nvar PatternCS = function PatternCSClosure() {\n  function PatternCS(baseCS) {\n    this.name = 'Pattern';\n    this.base = baseCS;\n  }\n  PatternCS.prototype = {};\n  return PatternCS;\n}();\nvar IndexedCS = function IndexedCSClosure() {\n  function IndexedCS(base, highVal, lookup) {\n    this.name = 'Indexed';\n    this.numComps = 1;\n    this.defaultColor = new Uint8Array(this.numComps);\n    this.base = base;\n    this.highVal = highVal;\n    var baseNumComps = base.numComps;\n    var length = baseNumComps * highVal;\n    if ((0, _primitives.isStream)(lookup)) {\n      this.lookup = new Uint8Array(length);\n      var bytes = lookup.getBytes(length);\n      this.lookup.set(bytes);\n    } else if ((0, _util.isString)(lookup)) {\n      this.lookup = new Uint8Array(length);\n      for (var i = 0; i < length; ++i) {\n        this.lookup[i] = lookup.charCodeAt(i);\n      }\n    } else if (lookup instanceof Uint8Array || lookup instanceof Array) {\n      this.lookup = lookup;\n    } else {\n      throw new _util.FormatError('Unrecognized lookup table: ' + lookup);\n    }\n  }\n  IndexedCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function IndexedCS_getRgbItem(src, srcOffset, dest, destOffset) {\n      var numComps = this.base.numComps;\n      var start = src[srcOffset] * numComps;\n      this.base.getRgbBuffer(this.lookup, start, 1, dest, destOffset, 8, 0);\n    },\n    getRgbBuffer: function IndexedCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      var base = this.base;\n      var numComps = base.numComps;\n      var outputDelta = base.getOutputLength(numComps, alpha01);\n      var lookup = this.lookup;\n      for (var i = 0; i < count; ++i) {\n        var lookupPos = src[srcOffset++] * numComps;\n        base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);\n        destOffset += outputDelta;\n      }\n    },\n    getOutputLength: function IndexedCS_getOutputLength(inputLength, alpha01) {\n      return this.base.getOutputLength(inputLength * this.base.numComps, alpha01);\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) {\n      return true;\n    },\n    usesZeroToOneRange: true\n  };\n  return IndexedCS;\n}();\nvar DeviceGrayCS = function DeviceGrayCSClosure() {\n  function DeviceGrayCS() {\n    this.name = 'DeviceGray';\n    this.numComps = 1;\n    this.defaultColor = new Float32Array(this.numComps);\n  }\n  DeviceGrayCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function DeviceGrayCS_getRgbItem(src, srcOffset, dest, destOffset) {\n      var c = src[srcOffset] * 255 | 0;\n      c = c < 0 ? 0 : c > 255 ? 255 : c;\n      dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c;\n    },\n    getRgbBuffer: function DeviceGrayCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      var scale = 255 / ((1 << bits) - 1);\n      var j = srcOffset,\n          q = destOffset;\n      for (var i = 0; i < count; ++i) {\n        var c = scale * src[j++] | 0;\n        dest[q++] = c;\n        dest[q++] = c;\n        dest[q++] = c;\n        q += alpha01;\n      }\n    },\n    getOutputLength: function DeviceGrayCS_getOutputLength(inputLength, alpha01) {\n      return inputLength * (3 + alpha01);\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n  return DeviceGrayCS;\n}();\nvar DeviceRgbCS = function DeviceRgbCSClosure() {\n  function DeviceRgbCS() {\n    this.name = 'DeviceRGB';\n    this.numComps = 3;\n    this.defaultColor = new Float32Array(this.numComps);\n  }\n  DeviceRgbCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function DeviceRgbCS_getRgbItem(src, srcOffset, dest, destOffset) {\n      var r = src[srcOffset] * 255 | 0;\n      var g = src[srcOffset + 1] * 255 | 0;\n      var b = src[srcOffset + 2] * 255 | 0;\n      dest[destOffset] = r < 0 ? 0 : r > 255 ? 255 : r;\n      dest[destOffset + 1] = g < 0 ? 0 : g > 255 ? 255 : g;\n      dest[destOffset + 2] = b < 0 ? 0 : b > 255 ? 255 : b;\n    },\n    getRgbBuffer: function DeviceRgbCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      if (bits === 8 && alpha01 === 0) {\n        dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset);\n        return;\n      }\n      var scale = 255 / ((1 << bits) - 1);\n      var j = srcOffset,\n          q = destOffset;\n      for (var i = 0; i < count; ++i) {\n        dest[q++] = scale * src[j++] | 0;\n        dest[q++] = scale * src[j++] | 0;\n        dest[q++] = scale * src[j++] | 0;\n        q += alpha01;\n      }\n    },\n    getOutputLength: function DeviceRgbCS_getOutputLength(inputLength, alpha01) {\n      return inputLength * (3 + alpha01) / 3 | 0;\n    },\n    isPassthrough: function DeviceRgbCS_isPassthrough(bits) {\n      return bits === 8;\n    },\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n  return DeviceRgbCS;\n}();\nvar DeviceCmykCS = function DeviceCmykCSClosure() {\n  function convertToRgb(src, srcOffset, srcScale, dest, destOffset) {\n    var c = src[srcOffset + 0] * srcScale;\n    var m = src[srcOffset + 1] * srcScale;\n    var y = src[srcOffset + 2] * srcScale;\n    var k = src[srcOffset + 3] * srcScale;\n    var r = c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k + -285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y + -17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) + k * (-21.86122147463605 * k - 189.48180835922747) + 255 | 0;\n    var g = c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k + -79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + k * (-20.737325471181034 * k - 187.80453709719578) + 255 | 0;\n    var b = c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k + -14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k + -193.58209356861505) + k * (-22.33816807309886 * k - 180.12613974708367) + 255 | 0;\n    dest[destOffset] = r > 255 ? 255 : r < 0 ? 0 : r;\n    dest[destOffset + 1] = g > 255 ? 255 : g < 0 ? 0 : g;\n    dest[destOffset + 2] = b > 255 ? 255 : b < 0 ? 0 : b;\n  }\n  function DeviceCmykCS() {\n    this.name = 'DeviceCMYK';\n    this.numComps = 4;\n    this.defaultColor = new Float32Array(this.numComps);\n    this.defaultColor[3] = 1;\n  }\n  DeviceCmykCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function DeviceCmykCS_getRgbItem(src, srcOffset, dest, destOffset) {\n      convertToRgb(src, srcOffset, 1, dest, destOffset);\n    },\n    getRgbBuffer: function DeviceCmykCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      var scale = 1 / ((1 << bits) - 1);\n      for (var i = 0; i < count; i++) {\n        convertToRgb(src, srcOffset, scale, dest, destOffset);\n        srcOffset += 4;\n        destOffset += 3 + alpha01;\n      }\n    },\n    getOutputLength: function DeviceCmykCS_getOutputLength(inputLength, alpha01) {\n      return inputLength / 4 * (3 + alpha01) | 0;\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n  return DeviceCmykCS;\n}();\nvar CalGrayCS = function CalGrayCSClosure() {\n  function CalGrayCS(whitePoint, blackPoint, gamma) {\n    this.name = 'CalGray';\n    this.numComps = 1;\n    this.defaultColor = new Float32Array(this.numComps);\n    if (!whitePoint) {\n      throw new _util.FormatError('WhitePoint missing - required for color space CalGray');\n    }\n    blackPoint = blackPoint || [0, 0, 0];\n    gamma = gamma || 1;\n    this.XW = whitePoint[0];\n    this.YW = whitePoint[1];\n    this.ZW = whitePoint[2];\n    this.XB = blackPoint[0];\n    this.YB = blackPoint[1];\n    this.ZB = blackPoint[2];\n    this.G = gamma;\n    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {\n      throw new _util.FormatError('Invalid WhitePoint components for ' + this.name + ', no fallback available');\n    }\n    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {\n      (0, _util.info)('Invalid BlackPoint for ' + this.name + ', falling back to default');\n      this.XB = this.YB = this.ZB = 0;\n    }\n    if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) {\n      (0, _util.warn)(this.name + ', BlackPoint: XB: ' + this.XB + ', YB: ' + this.YB + ', ZB: ' + this.ZB + ', only default values are supported.');\n    }\n    if (this.G < 1) {\n      (0, _util.info)('Invalid Gamma: ' + this.G + ' for ' + this.name + ', falling back to default');\n      this.G = 1;\n    }\n  }\n  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {\n    var A = src[srcOffset] * scale;\n    var AG = Math.pow(A, cs.G);\n    var L = cs.YW * AG;\n    var val = Math.max(295.8 * Math.pow(L, 0.333333333333333333) - 40.8, 0) | 0;\n    dest[destOffset] = val;\n    dest[destOffset + 1] = val;\n    dest[destOffset + 2] = val;\n  }\n  CalGrayCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset, dest, destOffset) {\n      convertToRgb(this, src, srcOffset, dest, destOffset, 1);\n    },\n    getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      var scale = 1 / ((1 << bits) - 1);\n      for (var i = 0; i < count; ++i) {\n        convertToRgb(this, src, srcOffset, dest, destOffset, scale);\n        srcOffset += 1;\n        destOffset += 3 + alpha01;\n      }\n    },\n    getOutputLength: function CalGrayCS_getOutputLength(inputLength, alpha01) {\n      return inputLength * (3 + alpha01);\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function CalGrayCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n  return CalGrayCS;\n}();\nvar CalRGBCS = function CalRGBCSClosure() {\n  var BRADFORD_SCALE_MATRIX = new Float32Array([0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, -0.0685, 1.0296]);\n  var BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([0.9869929, -0.1470543, 0.1599627, 0.4323053, 0.5183603, 0.0492912, -0.0085287, 0.0400428, 0.9684867]);\n  var SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([3.2404542, -1.5371385, -0.4985314, -0.9692660, 1.8760108, 0.0415560, 0.0556434, -0.2040259, 1.0572252]);\n  var FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]);\n  var tempNormalizeMatrix = new Float32Array(3);\n  var tempConvertMatrix1 = new Float32Array(3);\n  var tempConvertMatrix2 = new Float32Array(3);\n  var DECODE_L_CONSTANT = Math.pow((8 + 16) / 116, 3) / 8.0;\n  function CalRGBCS(whitePoint, blackPoint, gamma, matrix) {\n    this.name = 'CalRGB';\n    this.numComps = 3;\n    this.defaultColor = new Float32Array(this.numComps);\n    if (!whitePoint) {\n      throw new _util.FormatError('WhitePoint missing - required for color space CalRGB');\n    }\n    blackPoint = blackPoint || new Float32Array(3);\n    gamma = gamma || new Float32Array([1, 1, 1]);\n    matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);\n    var XW = whitePoint[0];\n    var YW = whitePoint[1];\n    var ZW = whitePoint[2];\n    this.whitePoint = whitePoint;\n    var XB = blackPoint[0];\n    var YB = blackPoint[1];\n    var ZB = blackPoint[2];\n    this.blackPoint = blackPoint;\n    this.GR = gamma[0];\n    this.GG = gamma[1];\n    this.GB = gamma[2];\n    this.MXA = matrix[0];\n    this.MYA = matrix[1];\n    this.MZA = matrix[2];\n    this.MXB = matrix[3];\n    this.MYB = matrix[4];\n    this.MZB = matrix[5];\n    this.MXC = matrix[6];\n    this.MYC = matrix[7];\n    this.MZC = matrix[8];\n    if (XW < 0 || ZW < 0 || YW !== 1) {\n      throw new _util.FormatError('Invalid WhitePoint components for ' + this.name + ', no fallback available');\n    }\n    if (XB < 0 || YB < 0 || ZB < 0) {\n      (0, _util.info)('Invalid BlackPoint for ' + this.name + ' [' + XB + ', ' + YB + ', ' + ZB + '], falling back to default');\n      this.blackPoint = new Float32Array(3);\n    }\n    if (this.GR < 0 || this.GG < 0 || this.GB < 0) {\n      (0, _util.info)('Invalid Gamma [' + this.GR + ', ' + this.GG + ', ' + this.GB + '] for ' + this.name + ', falling back to default');\n      this.GR = this.GG = this.GB = 1;\n    }\n    if (this.MXA < 0 || this.MYA < 0 || this.MZA < 0 || this.MXB < 0 || this.MYB < 0 || this.MZB < 0 || this.MXC < 0 || this.MYC < 0 || this.MZC < 0) {\n      (0, _util.info)('Invalid Matrix for ' + this.name + ' [' + this.MXA + ', ' + this.MYA + ', ' + this.MZA + this.MXB + ', ' + this.MYB + ', ' + this.MZB + this.MXC + ', ' + this.MYC + ', ' + this.MZC + '], falling back to default');\n      this.MXA = this.MYB = this.MZC = 1;\n      this.MXB = this.MYA = this.MZA = this.MXC = this.MYC = this.MZB = 0;\n    }\n  }\n  function matrixProduct(a, b, result) {\n    result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n    result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2];\n    result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2];\n  }\n  function convertToFlat(sourceWhitePoint, LMS, result) {\n    result[0] = LMS[0] * 1 / sourceWhitePoint[0];\n    result[1] = LMS[1] * 1 / sourceWhitePoint[1];\n    result[2] = LMS[2] * 1 / sourceWhitePoint[2];\n  }\n  function convertToD65(sourceWhitePoint, LMS, result) {\n    var D65X = 0.95047;\n    var D65Y = 1;\n    var D65Z = 1.08883;\n    result[0] = LMS[0] * D65X / sourceWhitePoint[0];\n    result[1] = LMS[1] * D65Y / sourceWhitePoint[1];\n    result[2] = LMS[2] * D65Z / sourceWhitePoint[2];\n  }\n  function sRGBTransferFunction(color) {\n    if (color <= 0.0031308) {\n      return adjustToRange(0, 1, 12.92 * color);\n    }\n    return adjustToRange(0, 1, (1 + 0.055) * Math.pow(color, 1 / 2.4) - 0.055);\n  }\n  function adjustToRange(min, max, value) {\n    return Math.max(min, Math.min(max, value));\n  }\n  function decodeL(L) {\n    if (L < 0) {\n      return -decodeL(-L);\n    }\n    if (L > 8.0) {\n      return Math.pow((L + 16) / 116, 3);\n    }\n    return L * DECODE_L_CONSTANT;\n  }\n  function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) {\n    if (sourceBlackPoint[0] === 0 && sourceBlackPoint[1] === 0 && sourceBlackPoint[2] === 0) {\n      result[0] = XYZ_Flat[0];\n      result[1] = XYZ_Flat[1];\n      result[2] = XYZ_Flat[2];\n      return;\n    }\n    var zeroDecodeL = decodeL(0);\n    var X_DST = zeroDecodeL;\n    var X_SRC = decodeL(sourceBlackPoint[0]);\n    var Y_DST = zeroDecodeL;\n    var Y_SRC = decodeL(sourceBlackPoint[1]);\n    var Z_DST = zeroDecodeL;\n    var Z_SRC = decodeL(sourceBlackPoint[2]);\n    var X_Scale = (1 - X_DST) / (1 - X_SRC);\n    var X_Offset = 1 - X_Scale;\n    var Y_Scale = (1 - Y_DST) / (1 - Y_SRC);\n    var Y_Offset = 1 - Y_Scale;\n    var Z_Scale = (1 - Z_DST) / (1 - Z_SRC);\n    var Z_Offset = 1 - Z_Scale;\n    result[0] = XYZ_Flat[0] * X_Scale + X_Offset;\n    result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset;\n    result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset;\n  }\n  function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) {\n    if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) {\n      result[0] = XYZ_In[0];\n      result[1] = XYZ_In[1];\n      result[2] = XYZ_In[2];\n      return;\n    }\n    var LMS = result;\n    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);\n    var LMS_Flat = tempNormalizeMatrix;\n    convertToFlat(sourceWhitePoint, LMS, LMS_Flat);\n    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result);\n  }\n  function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) {\n    var LMS = result;\n    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);\n    var LMS_D65 = tempNormalizeMatrix;\n    convertToD65(sourceWhitePoint, LMS, LMS_D65);\n    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result);\n  }\n  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {\n    var A = adjustToRange(0, 1, src[srcOffset] * scale);\n    var B = adjustToRange(0, 1, src[srcOffset + 1] * scale);\n    var C = adjustToRange(0, 1, src[srcOffset + 2] * scale);\n    var AGR = Math.pow(A, cs.GR);\n    var BGG = Math.pow(B, cs.GG);\n    var CGB = Math.pow(C, cs.GB);\n    var X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB;\n    var Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB;\n    var Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB;\n    var XYZ = tempConvertMatrix1;\n    XYZ[0] = X;\n    XYZ[1] = Y;\n    XYZ[2] = Z;\n    var XYZ_Flat = tempConvertMatrix2;\n    normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat);\n    var XYZ_Black = tempConvertMatrix1;\n    compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black);\n    var XYZ_D65 = tempConvertMatrix2;\n    normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65);\n    var SRGB = tempConvertMatrix1;\n    matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB);\n    var sR = sRGBTransferFunction(SRGB[0]);\n    var sG = sRGBTransferFunction(SRGB[1]);\n    var sB = sRGBTransferFunction(SRGB[2]);\n    dest[destOffset] = Math.round(sR * 255);\n    dest[destOffset + 1] = Math.round(sG * 255);\n    dest[destOffset + 2] = Math.round(sB * 255);\n  }\n  CalRGBCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function CalRGBCS_getRgbItem(src, srcOffset, dest, destOffset) {\n      convertToRgb(this, src, srcOffset, dest, destOffset, 1);\n    },\n    getRgbBuffer: function CalRGBCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      var scale = 1 / ((1 << bits) - 1);\n      for (var i = 0; i < count; ++i) {\n        convertToRgb(this, src, srcOffset, dest, destOffset, scale);\n        srcOffset += 3;\n        destOffset += 3 + alpha01;\n      }\n    },\n    getOutputLength: function CalRGBCS_getOutputLength(inputLength, alpha01) {\n      return inputLength * (3 + alpha01) / 3 | 0;\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function CalRGBCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n  return CalRGBCS;\n}();\nvar LabCS = function LabCSClosure() {\n  function LabCS(whitePoint, blackPoint, range) {\n    this.name = 'Lab';\n    this.numComps = 3;\n    this.defaultColor = new Float32Array(this.numComps);\n    if (!whitePoint) {\n      throw new _util.FormatError('WhitePoint missing - required for color space Lab');\n    }\n    blackPoint = blackPoint || [0, 0, 0];\n    range = range || [-100, 100, -100, 100];\n    this.XW = whitePoint[0];\n    this.YW = whitePoint[1];\n    this.ZW = whitePoint[2];\n    this.amin = range[0];\n    this.amax = range[1];\n    this.bmin = range[2];\n    this.bmax = range[3];\n    this.XB = blackPoint[0];\n    this.YB = blackPoint[1];\n    this.ZB = blackPoint[2];\n    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {\n      throw new _util.FormatError('Invalid WhitePoint components, no fallback available');\n    }\n    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {\n      (0, _util.info)('Invalid BlackPoint, falling back to default');\n      this.XB = this.YB = this.ZB = 0;\n    }\n    if (this.amin > this.amax || this.bmin > this.bmax) {\n      (0, _util.info)('Invalid Range, falling back to defaults');\n      this.amin = -100;\n      this.amax = 100;\n      this.bmin = -100;\n      this.bmax = 100;\n    }\n  }\n  function fn_g(x) {\n    var result;\n    if (x >= 6 / 29) {\n      result = x * x * x;\n    } else {\n      result = 108 / 841 * (x - 4 / 29);\n    }\n    return result;\n  }\n  function decode(value, high1, low2, high2) {\n    return low2 + value * (high2 - low2) / high1;\n  }\n  function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) {\n    var Ls = src[srcOffset];\n    var as = src[srcOffset + 1];\n    var bs = src[srcOffset + 2];\n    if (maxVal !== false) {\n      Ls = decode(Ls, maxVal, 0, 100);\n      as = decode(as, maxVal, cs.amin, cs.amax);\n      bs = decode(bs, maxVal, cs.bmin, cs.bmax);\n    }\n    as = as > cs.amax ? cs.amax : as < cs.amin ? cs.amin : as;\n    bs = bs > cs.bmax ? cs.bmax : bs < cs.bmin ? cs.bmin : bs;\n    var M = (Ls + 16) / 116;\n    var L = M + as / 500;\n    var N = M - bs / 200;\n    var X = cs.XW * fn_g(L);\n    var Y = cs.YW * fn_g(M);\n    var Z = cs.ZW * fn_g(N);\n    var r, g, b;\n    if (cs.ZW < 1) {\n      r = X * 3.1339 + Y * -1.6170 + Z * -0.4906;\n      g = X * -0.9785 + Y * 1.9160 + Z * 0.0333;\n      b = X * 0.0720 + Y * -0.2290 + Z * 1.4057;\n    } else {\n      r = X * 3.2406 + Y * -1.5372 + Z * -0.4986;\n      g = X * -0.9689 + Y * 1.8758 + Z * 0.0415;\n      b = X * 0.0557 + Y * -0.2040 + Z * 1.0570;\n    }\n    dest[destOffset] = r <= 0 ? 0 : r >= 1 ? 255 : Math.sqrt(r) * 255 | 0;\n    dest[destOffset + 1] = g <= 0 ? 0 : g >= 1 ? 255 : Math.sqrt(g) * 255 | 0;\n    dest[destOffset + 2] = b <= 0 ? 0 : b >= 1 ? 255 : Math.sqrt(b) * 255 | 0;\n  }\n  LabCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function LabCS_getRgbItem(src, srcOffset, dest, destOffset) {\n      convertToRgb(this, src, srcOffset, false, dest, destOffset);\n    },\n    getRgbBuffer: function LabCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      var maxVal = (1 << bits) - 1;\n      for (var i = 0; i < count; i++) {\n        convertToRgb(this, src, srcOffset, maxVal, dest, destOffset);\n        srcOffset += 3;\n        destOffset += 3 + alpha01;\n      }\n    },\n    getOutputLength: function LabCS_getOutputLength(inputLength, alpha01) {\n      return inputLength * (3 + alpha01) / 3 | 0;\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) {\n      return true;\n    },\n    usesZeroToOneRange: false\n  };\n  return LabCS;\n}();\nexports.ColorSpace = ColorSpace;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar ExpertEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', '', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior', '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '', 'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall'];\nvar MacExpertEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '', 'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter', 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '', 'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall', 'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall', 'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall', 'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '', 'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior', 'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior', 'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior', 'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '', 'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior', 'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall', 'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '', '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '', 'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior', 'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior', '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall', 'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior', 'periodsuperior', 'Dotaccentsmall', 'Ringsmall'];\nvar MacRomanEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', 'space', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron'];\nvar StandardEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl', 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla', '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '', '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae', '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'];\nvar WinAnsiEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron', 'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft', 'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash', 'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet', 'zcaron', 'Ydieresis', 'space', 'exclamdown', 'cent', 'sterling', 'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered', 'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute', 'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters', 'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis', 'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve', 'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn', 'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis', 'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis', 'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve', 'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash', 'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn', 'ydieresis'];\nvar SymbolSetEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent', 'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus', 'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi', 'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa', 'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau', 'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft', 'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex', 'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota', 'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho', 'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta', 'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal', 'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade', 'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree', 'plusminus', 'second', 'greaterequal', 'multiply', 'proportional', 'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence', 'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn', 'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply', 'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset', 'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element', 'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif', 'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot', 'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup', 'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans', 'copyrightsans', 'trademarksans', 'summation', 'parenlefttp', 'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex', 'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex', '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt', 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp', 'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid', 'bracerightbt'];\nvar ZapfDingbatsEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117', 'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19', 'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7', 'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36', 'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46', 'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56', 'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66', 'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75', 'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97', 'a98', 'a99', 'a100', '', 'a89', 'a90', 'a93', 'a94', 'a91', 'a92', 'a205', 'a85', 'a206', 'a86', 'a87', 'a88', 'a95', 'a96', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'a101', 'a102', 'a103', 'a104', 'a106', 'a107', 'a108', 'a112', 'a111', 'a110', 'a109', 'a120', 'a121', 'a122', 'a123', 'a124', 'a125', 'a126', 'a127', 'a128', 'a129', 'a130', 'a131', 'a132', 'a133', 'a134', 'a135', 'a136', 'a137', 'a138', 'a139', 'a140', 'a141', 'a142', 'a143', 'a144', 'a145', 'a146', 'a147', 'a148', 'a149', 'a150', 'a151', 'a152', 'a153', 'a154', 'a155', 'a156', 'a157', 'a158', 'a159', 'a160', 'a161', 'a163', 'a164', 'a196', 'a165', 'a192', 'a166', 'a167', 'a168', 'a169', 'a170', 'a171', 'a172', 'a173', 'a162', 'a174', 'a175', 'a176', 'a177', 'a178', 'a179', 'a193', 'a180', 'a199', 'a181', 'a200', 'a182', '', 'a201', 'a183', 'a184', 'a197', 'a185', 'a194', 'a198', 'a186', 'a195', 'a187', 'a188', 'a189', 'a190', 'a191'];\nfunction getEncoding(encodingName) {\n  switch (encodingName) {\n    case 'WinAnsiEncoding':\n      return WinAnsiEncoding;\n    case 'StandardEncoding':\n      return StandardEncoding;\n    case 'MacRomanEncoding':\n      return MacRomanEncoding;\n    case 'SymbolSetEncoding':\n      return SymbolSetEncoding;\n    case 'ZapfDingbatsEncoding':\n      return ZapfDingbatsEncoding;\n    case 'ExpertEncoding':\n      return ExpertEncoding;\n    case 'MacExpertEncoding':\n      return MacExpertEncoding;\n    default:\n      return null;\n  }\n}\nexports.WinAnsiEncoding = WinAnsiEncoding;\nexports.StandardEncoding = StandardEncoding;\nexports.MacRomanEncoding = MacRomanEncoding;\nexports.SymbolSetEncoding = SymbolSetEncoding;\nexports.ZapfDingbatsEncoding = ZapfDingbatsEncoding;\nexports.ExpertEncoding = ExpertEncoding;\nexports.getEncoding = getEncoding;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Parser = exports.Linearization = exports.Lexer = undefined;\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar MAX_LENGTH_TO_CACHE = 1000;\nvar Parser = function ParserClosure() {\n  function Parser(lexer, allowStreams, xref, recoveryMode) {\n    this.lexer = lexer;\n    this.allowStreams = allowStreams;\n    this.xref = xref;\n    this.recoveryMode = recoveryMode || false;\n    this.imageCache = Object.create(null);\n    this.refill();\n  }\n  Parser.prototype = {\n    refill: function Parser_refill() {\n      this.buf1 = this.lexer.getObj();\n      this.buf2 = this.lexer.getObj();\n    },\n    shift: function Parser_shift() {\n      if ((0, _primitives.isCmd)(this.buf2, 'ID')) {\n        this.buf1 = this.buf2;\n        this.buf2 = null;\n      } else {\n        this.buf1 = this.buf2;\n        this.buf2 = this.lexer.getObj();\n      }\n    },\n    tryShift: function Parser_tryShift() {\n      try {\n        this.shift();\n        return true;\n      } catch (e) {\n        if (e instanceof _util.MissingDataException) {\n          throw e;\n        }\n        return false;\n      }\n    },\n    getObj: function Parser_getObj(cipherTransform) {\n      var buf1 = this.buf1;\n      this.shift();\n      if (buf1 instanceof _primitives.Cmd) {\n        switch (buf1.cmd) {\n          case 'BI':\n            return this.makeInlineImage(cipherTransform);\n          case '[':\n            var array = [];\n            while (!(0, _primitives.isCmd)(this.buf1, ']') && !(0, _primitives.isEOF)(this.buf1)) {\n              array.push(this.getObj(cipherTransform));\n            }\n            if ((0, _primitives.isEOF)(this.buf1)) {\n              if (!this.recoveryMode) {\n                throw new _util.FormatError('End of file inside array');\n              }\n              return array;\n            }\n            this.shift();\n            return array;\n          case '<<':\n            var dict = new _primitives.Dict(this.xref);\n            while (!(0, _primitives.isCmd)(this.buf1, '>>') && !(0, _primitives.isEOF)(this.buf1)) {\n              if (!(0, _primitives.isName)(this.buf1)) {\n                (0, _util.info)('Malformed dictionary: key must be a name object');\n                this.shift();\n                continue;\n              }\n              var key = this.buf1.name;\n              this.shift();\n              if ((0, _primitives.isEOF)(this.buf1)) {\n                break;\n              }\n              dict.set(key, this.getObj(cipherTransform));\n            }\n            if ((0, _primitives.isEOF)(this.buf1)) {\n              if (!this.recoveryMode) {\n                throw new _util.FormatError('End of file inside dictionary');\n              }\n              return dict;\n            }\n            if ((0, _primitives.isCmd)(this.buf2, 'stream')) {\n              return this.allowStreams ? this.makeStream(dict, cipherTransform) : dict;\n            }\n            this.shift();\n            return dict;\n          default:\n            return buf1;\n        }\n      }\n      if ((0, _util.isInt)(buf1)) {\n        var num = buf1;\n        if ((0, _util.isInt)(this.buf1) && (0, _primitives.isCmd)(this.buf2, 'R')) {\n          var ref = new _primitives.Ref(num, this.buf1);\n          this.shift();\n          this.shift();\n          return ref;\n        }\n        return num;\n      }\n      if ((0, _util.isString)(buf1)) {\n        var str = buf1;\n        if (cipherTransform) {\n          str = cipherTransform.decryptString(str);\n        }\n        return str;\n      }\n      return buf1;\n    },\n    findDefaultInlineStreamEnd: function Parser_findDefaultInlineStreamEnd(stream) {\n      var E = 0x45,\n          I = 0x49,\n          SPACE = 0x20,\n          LF = 0xA,\n          CR = 0xD;\n      var startPos = stream.pos,\n          state = 0,\n          ch,\n          i,\n          n,\n          followingBytes;\n      while ((ch = stream.getByte()) !== -1) {\n        if (state === 0) {\n          state = ch === E ? 1 : 0;\n        } else if (state === 1) {\n          state = ch === I ? 2 : 0;\n        } else {\n          (0, _util.assert)(state === 2);\n          if (ch === SPACE || ch === LF || ch === CR) {\n            n = 5;\n            followingBytes = stream.peekBytes(n);\n            for (i = 0; i < n; i++) {\n              ch = followingBytes[i];\n              if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7F)) {\n                state = 0;\n                break;\n              }\n            }\n            if (state === 2) {\n              break;\n            }\n          } else {\n            state = 0;\n          }\n        }\n      }\n      return stream.pos - 4 - startPos;\n    },\n    findDCTDecodeInlineStreamEnd: function Parser_findDCTDecodeInlineStreamEnd(stream) {\n      var startPos = stream.pos,\n          foundEOI = false,\n          b,\n          markerLength,\n          length;\n      while ((b = stream.getByte()) !== -1) {\n        if (b !== 0xFF) {\n          continue;\n        }\n        switch (stream.getByte()) {\n          case 0x00:\n            break;\n          case 0xFF:\n            stream.skip(-1);\n            break;\n          case 0xD9:\n            foundEOI = true;\n            break;\n          case 0xC0:\n          case 0xC1:\n          case 0xC2:\n          case 0xC3:\n          case 0xC5:\n          case 0xC6:\n          case 0xC7:\n          case 0xC9:\n          case 0xCA:\n          case 0xCB:\n          case 0xCD:\n          case 0xCE:\n          case 0xCF:\n          case 0xC4:\n          case 0xCC:\n          case 0xDA:\n          case 0xDB:\n          case 0xDC:\n          case 0xDD:\n          case 0xDE:\n          case 0xDF:\n          case 0xE0:\n          case 0xE1:\n          case 0xE2:\n          case 0xE3:\n          case 0xE4:\n          case 0xE5:\n          case 0xE6:\n          case 0xE7:\n          case 0xE8:\n          case 0xE9:\n          case 0xEA:\n          case 0xEB:\n          case 0xEC:\n          case 0xED:\n          case 0xEE:\n          case 0xEF:\n          case 0xFE:\n            markerLength = stream.getUint16();\n            if (markerLength > 2) {\n              stream.skip(markerLength - 2);\n            } else {\n              stream.skip(-2);\n            }\n            break;\n        }\n        if (foundEOI) {\n          break;\n        }\n      }\n      length = stream.pos - startPos;\n      if (b === -1) {\n        (0, _util.warn)('Inline DCTDecode image stream: ' + 'EOI marker not found, searching for /EI/ instead.');\n        stream.skip(-length);\n        return this.findDefaultInlineStreamEnd(stream);\n      }\n      this.inlineStreamSkipEI(stream);\n      return length;\n    },\n    findASCII85DecodeInlineStreamEnd: function Parser_findASCII85DecodeInlineStreamEnd(stream) {\n      var TILDE = 0x7E,\n          GT = 0x3E;\n      var startPos = stream.pos,\n          ch,\n          length;\n      while ((ch = stream.getByte()) !== -1) {\n        if (ch === TILDE && stream.peekByte() === GT) {\n          stream.skip();\n          break;\n        }\n      }\n      length = stream.pos - startPos;\n      if (ch === -1) {\n        (0, _util.warn)('Inline ASCII85Decode image stream: ' + 'EOD marker not found, searching for /EI/ instead.');\n        stream.skip(-length);\n        return this.findDefaultInlineStreamEnd(stream);\n      }\n      this.inlineStreamSkipEI(stream);\n      return length;\n    },\n    findASCIIHexDecodeInlineStreamEnd: function Parser_findASCIIHexDecodeInlineStreamEnd(stream) {\n      var GT = 0x3E;\n      var startPos = stream.pos,\n          ch,\n          length;\n      while ((ch = stream.getByte()) !== -1) {\n        if (ch === GT) {\n          break;\n        }\n      }\n      length = stream.pos - startPos;\n      if (ch === -1) {\n        (0, _util.warn)('Inline ASCIIHexDecode image stream: ' + 'EOD marker not found, searching for /EI/ instead.');\n        stream.skip(-length);\n        return this.findDefaultInlineStreamEnd(stream);\n      }\n      this.inlineStreamSkipEI(stream);\n      return length;\n    },\n    inlineStreamSkipEI: function Parser_inlineStreamSkipEI(stream) {\n      var E = 0x45,\n          I = 0x49;\n      var state = 0,\n          ch;\n      while ((ch = stream.getByte()) !== -1) {\n        if (state === 0) {\n          state = ch === E ? 1 : 0;\n        } else if (state === 1) {\n          state = ch === I ? 2 : 0;\n        } else if (state === 2) {\n          break;\n        }\n      }\n    },\n    makeInlineImage: function Parser_makeInlineImage(cipherTransform) {\n      var lexer = this.lexer;\n      var stream = lexer.stream;\n      var dict = new _primitives.Dict(this.xref);\n      while (!(0, _primitives.isCmd)(this.buf1, 'ID') && !(0, _primitives.isEOF)(this.buf1)) {\n        if (!(0, _primitives.isName)(this.buf1)) {\n          throw new _util.FormatError('Dictionary key must be a name object');\n        }\n        var key = this.buf1.name;\n        this.shift();\n        if ((0, _primitives.isEOF)(this.buf1)) {\n          break;\n        }\n        dict.set(key, this.getObj(cipherTransform));\n      }\n      var filter = dict.get('Filter', 'F'),\n          filterName;\n      if ((0, _primitives.isName)(filter)) {\n        filterName = filter.name;\n      } else if ((0, _util.isArray)(filter)) {\n        var filterZero = this.xref.fetchIfRef(filter[0]);\n        if ((0, _primitives.isName)(filterZero)) {\n          filterName = filterZero.name;\n        }\n      }\n      var startPos = stream.pos,\n          length,\n          i,\n          ii;\n      if (filterName === 'DCTDecode' || filterName === 'DCT') {\n        length = this.findDCTDecodeInlineStreamEnd(stream);\n      } else if (filterName === 'ASCII85Decode' || filterName === 'A85') {\n        length = this.findASCII85DecodeInlineStreamEnd(stream);\n      } else if (filterName === 'ASCIIHexDecode' || filterName === 'AHx') {\n        length = this.findASCIIHexDecodeInlineStreamEnd(stream);\n      } else {\n        length = this.findDefaultInlineStreamEnd(stream);\n      }\n      var imageStream = stream.makeSubStream(startPos, length, dict);\n      var adler32;\n      if (length < MAX_LENGTH_TO_CACHE) {\n        var imageBytes = imageStream.getBytes();\n        imageStream.reset();\n        var a = 1;\n        var b = 0;\n        for (i = 0, ii = imageBytes.length; i < ii; ++i) {\n          a += imageBytes[i] & 0xff;\n          b += a;\n        }\n        adler32 = b % 65521 << 16 | a % 65521;\n        if (this.imageCache.adler32 === adler32) {\n          this.buf2 = _primitives.Cmd.get('EI');\n          this.shift();\n          this.imageCache[adler32].reset();\n          return this.imageCache[adler32];\n        }\n      }\n      if (cipherTransform) {\n        imageStream = cipherTransform.createStream(imageStream, length);\n      }\n      imageStream = this.filter(imageStream, dict, length);\n      imageStream.dict = dict;\n      if (adler32 !== undefined) {\n        imageStream.cacheKey = 'inline_' + length + '_' + adler32;\n        this.imageCache[adler32] = imageStream;\n      }\n      this.buf2 = _primitives.Cmd.get('EI');\n      this.shift();\n      return imageStream;\n    },\n    makeStream: function Parser_makeStream(dict, cipherTransform) {\n      var lexer = this.lexer;\n      var stream = lexer.stream;\n      lexer.skipToNextLine();\n      var pos = stream.pos - 1;\n      var length = dict.get('Length');\n      if (!(0, _util.isInt)(length)) {\n        (0, _util.info)('Bad ' + length + ' attribute in stream');\n        length = 0;\n      }\n      stream.pos = pos + length;\n      lexer.nextChar();\n      if (this.tryShift() && (0, _primitives.isCmd)(this.buf2, 'endstream')) {\n        this.shift();\n      } else {\n        stream.pos = pos;\n        var SCAN_BLOCK_SIZE = 2048;\n        var ENDSTREAM_SIGNATURE_LENGTH = 9;\n        var ENDSTREAM_SIGNATURE = [0x65, 0x6E, 0x64, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6D];\n        var skipped = 0,\n            found = false,\n            i,\n            j;\n        while (stream.pos < stream.end) {\n          var scanBytes = stream.peekBytes(SCAN_BLOCK_SIZE);\n          var scanLength = scanBytes.length - ENDSTREAM_SIGNATURE_LENGTH;\n          if (scanLength <= 0) {\n            break;\n          }\n          found = false;\n          i = 0;\n          while (i < scanLength) {\n            j = 0;\n            while (j < ENDSTREAM_SIGNATURE_LENGTH && scanBytes[i + j] === ENDSTREAM_SIGNATURE[j]) {\n              j++;\n            }\n            if (j >= ENDSTREAM_SIGNATURE_LENGTH) {\n              found = true;\n              break;\n            }\n            i++;\n          }\n          if (found) {\n            skipped += i;\n            stream.pos += i;\n            break;\n          }\n          skipped += scanLength;\n          stream.pos += scanLength;\n        }\n        if (!found) {\n          throw new _util.FormatError('Missing endstream');\n        }\n        length = skipped;\n        lexer.nextChar();\n        this.shift();\n        this.shift();\n      }\n      this.shift();\n      stream = stream.makeSubStream(pos, length, dict);\n      if (cipherTransform) {\n        stream = cipherTransform.createStream(stream, length);\n      }\n      stream = this.filter(stream, dict, length);\n      stream.dict = dict;\n      return stream;\n    },\n    filter: function Parser_filter(stream, dict, length) {\n      var filter = dict.get('Filter', 'F');\n      var params = dict.get('DecodeParms', 'DP');\n      if ((0, _primitives.isName)(filter)) {\n        if ((0, _util.isArray)(params)) {\n          params = this.xref.fetchIfRef(params[0]);\n        }\n        return this.makeFilter(stream, filter.name, length, params);\n      }\n      var maybeLength = length;\n      if ((0, _util.isArray)(filter)) {\n        var filterArray = filter;\n        var paramsArray = params;\n        for (var i = 0, ii = filterArray.length; i < ii; ++i) {\n          filter = this.xref.fetchIfRef(filterArray[i]);\n          if (!(0, _primitives.isName)(filter)) {\n            throw new _util.FormatError('Bad filter name: ' + filter);\n          }\n          params = null;\n          if ((0, _util.isArray)(paramsArray) && i in paramsArray) {\n            params = this.xref.fetchIfRef(paramsArray[i]);\n          }\n          stream = this.makeFilter(stream, filter.name, maybeLength, params);\n          maybeLength = null;\n        }\n      }\n      return stream;\n    },\n    makeFilter: function Parser_makeFilter(stream, name, maybeLength, params) {\n      if (maybeLength === 0) {\n        (0, _util.warn)('Empty \"' + name + '\" stream.');\n        return new _stream.NullStream(stream);\n      }\n      try {\n        var xrefStreamStats = this.xref.stats.streamTypes;\n        if (name === 'FlateDecode' || name === 'Fl') {\n          xrefStreamStats[_util.StreamType.FLATE] = true;\n          if (params) {\n            return new _stream.PredictorStream(new _stream.FlateStream(stream, maybeLength), maybeLength, params);\n          }\n          return new _stream.FlateStream(stream, maybeLength);\n        }\n        if (name === 'LZWDecode' || name === 'LZW') {\n          xrefStreamStats[_util.StreamType.LZW] = true;\n          var earlyChange = 1;\n          if (params) {\n            if (params.has('EarlyChange')) {\n              earlyChange = params.get('EarlyChange');\n            }\n            return new _stream.PredictorStream(new _stream.LZWStream(stream, maybeLength, earlyChange), maybeLength, params);\n          }\n          return new _stream.LZWStream(stream, maybeLength, earlyChange);\n        }\n        if (name === 'DCTDecode' || name === 'DCT') {\n          xrefStreamStats[_util.StreamType.DCT] = true;\n          return new _stream.JpegStream(stream, maybeLength, stream.dict, params);\n        }\n        if (name === 'JPXDecode' || name === 'JPX') {\n          xrefStreamStats[_util.StreamType.JPX] = true;\n          return new _stream.JpxStream(stream, maybeLength, stream.dict, params);\n        }\n        if (name === 'ASCII85Decode' || name === 'A85') {\n          xrefStreamStats[_util.StreamType.A85] = true;\n          return new _stream.Ascii85Stream(stream, maybeLength);\n        }\n        if (name === 'ASCIIHexDecode' || name === 'AHx') {\n          xrefStreamStats[_util.StreamType.AHX] = true;\n          return new _stream.AsciiHexStream(stream, maybeLength);\n        }\n        if (name === 'CCITTFaxDecode' || name === 'CCF') {\n          xrefStreamStats[_util.StreamType.CCF] = true;\n          return new _stream.CCITTFaxStream(stream, maybeLength, params);\n        }\n        if (name === 'RunLengthDecode' || name === 'RL') {\n          xrefStreamStats[_util.StreamType.RL] = true;\n          return new _stream.RunLengthStream(stream, maybeLength);\n        }\n        if (name === 'JBIG2Decode') {\n          xrefStreamStats[_util.StreamType.JBIG] = true;\n          return new _stream.Jbig2Stream(stream, maybeLength, stream.dict, params);\n        }\n        (0, _util.warn)('filter \"' + name + '\" not supported yet');\n        return stream;\n      } catch (ex) {\n        if (ex instanceof _util.MissingDataException) {\n          throw ex;\n        }\n        (0, _util.warn)('Invalid stream: \\\"' + ex + '\\\"');\n        return new _stream.NullStream(stream);\n      }\n    }\n  };\n  return Parser;\n}();\nvar Lexer = function LexerClosure() {\n  function Lexer(stream, knownCommands) {\n    this.stream = stream;\n    this.nextChar();\n    this.strBuf = [];\n    this.knownCommands = knownCommands;\n  }\n  var specialChars = [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n  function toHexDigit(ch) {\n    if (ch >= 0x30 && ch <= 0x39) {\n      return ch & 0x0F;\n    }\n    if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {\n      return (ch & 0x0F) + 9;\n    }\n    return -1;\n  }\n  Lexer.prototype = {\n    nextChar: function Lexer_nextChar() {\n      return this.currentChar = this.stream.getByte();\n    },\n    peekChar: function Lexer_peekChar() {\n      return this.stream.peekByte();\n    },\n    getNumber: function Lexer_getNumber() {\n      var ch = this.currentChar;\n      var eNotation = false;\n      var divideBy = 0;\n      var sign = 1;\n      if (ch === 0x2D) {\n        sign = -1;\n        ch = this.nextChar();\n        if (ch === 0x2D) {\n          ch = this.nextChar();\n        }\n      } else if (ch === 0x2B) {\n        ch = this.nextChar();\n      }\n      if (ch === 0x2E) {\n        divideBy = 10;\n        ch = this.nextChar();\n      }\n      if (ch === 0x0A || ch === 0x0D) {\n        do {\n          ch = this.nextChar();\n        } while (ch === 0x0A || ch === 0x0D);\n      }\n      if (ch < 0x30 || ch > 0x39) {\n        throw new _util.FormatError('Invalid number: ' + String.fromCharCode(ch) + ' (charCode ' + ch + ')');\n      }\n      var baseValue = ch - 0x30;\n      var powerValue = 0;\n      var powerValueSign = 1;\n      while ((ch = this.nextChar()) >= 0) {\n        if (0x30 <= ch && ch <= 0x39) {\n          var currentDigit = ch - 0x30;\n          if (eNotation) {\n            powerValue = powerValue * 10 + currentDigit;\n          } else {\n            if (divideBy !== 0) {\n              divideBy *= 10;\n            }\n            baseValue = baseValue * 10 + currentDigit;\n          }\n        } else if (ch === 0x2E) {\n          if (divideBy === 0) {\n            divideBy = 1;\n          } else {\n            break;\n          }\n        } else if (ch === 0x2D) {\n          (0, _util.warn)('Badly formatted number');\n        } else if (ch === 0x45 || ch === 0x65) {\n          ch = this.peekChar();\n          if (ch === 0x2B || ch === 0x2D) {\n            powerValueSign = ch === 0x2D ? -1 : 1;\n            this.nextChar();\n          } else if (ch < 0x30 || ch > 0x39) {\n            break;\n          }\n          eNotation = true;\n        } else {\n          break;\n        }\n      }\n      if (divideBy !== 0) {\n        baseValue /= divideBy;\n      }\n      if (eNotation) {\n        baseValue *= Math.pow(10, powerValueSign * powerValue);\n      }\n      return sign * baseValue;\n    },\n    getString: function Lexer_getString() {\n      var numParen = 1;\n      var done = false;\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      var ch = this.nextChar();\n      while (true) {\n        var charBuffered = false;\n        switch (ch | 0) {\n          case -1:\n            (0, _util.warn)('Unterminated string');\n            done = true;\n            break;\n          case 0x28:\n            ++numParen;\n            strBuf.push('(');\n            break;\n          case 0x29:\n            if (--numParen === 0) {\n              this.nextChar();\n              done = true;\n            } else {\n              strBuf.push(')');\n            }\n            break;\n          case 0x5C:\n            ch = this.nextChar();\n            switch (ch) {\n              case -1:\n                (0, _util.warn)('Unterminated string');\n                done = true;\n                break;\n              case 0x6E:\n                strBuf.push('\\n');\n                break;\n              case 0x72:\n                strBuf.push('\\r');\n                break;\n              case 0x74:\n                strBuf.push('\\t');\n                break;\n              case 0x62:\n                strBuf.push('\\b');\n                break;\n              case 0x66:\n                strBuf.push('\\f');\n                break;\n              case 0x5C:\n              case 0x28:\n              case 0x29:\n                strBuf.push(String.fromCharCode(ch));\n                break;\n              case 0x30:\n              case 0x31:\n              case 0x32:\n              case 0x33:\n              case 0x34:\n              case 0x35:\n              case 0x36:\n              case 0x37:\n                var x = ch & 0x0F;\n                ch = this.nextChar();\n                charBuffered = true;\n                if (ch >= 0x30 && ch <= 0x37) {\n                  x = (x << 3) + (ch & 0x0F);\n                  ch = this.nextChar();\n                  if (ch >= 0x30 && ch <= 0x37) {\n                    charBuffered = false;\n                    x = (x << 3) + (ch & 0x0F);\n                  }\n                }\n                strBuf.push(String.fromCharCode(x));\n                break;\n              case 0x0D:\n                if (this.peekChar() === 0x0A) {\n                  this.nextChar();\n                }\n                break;\n              case 0x0A:\n                break;\n              default:\n                strBuf.push(String.fromCharCode(ch));\n                break;\n            }\n            break;\n          default:\n            strBuf.push(String.fromCharCode(ch));\n            break;\n        }\n        if (done) {\n          break;\n        }\n        if (!charBuffered) {\n          ch = this.nextChar();\n        }\n      }\n      return strBuf.join('');\n    },\n    getName: function Lexer_getName() {\n      var ch, previousCh;\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {\n        if (ch === 0x23) {\n          ch = this.nextChar();\n          if (specialChars[ch]) {\n            (0, _util.warn)('Lexer_getName: ' + 'NUMBER SIGN (#) should be followed by a hexadecimal number.');\n            strBuf.push('#');\n            break;\n          }\n          var x = toHexDigit(ch);\n          if (x !== -1) {\n            previousCh = ch;\n            ch = this.nextChar();\n            var x2 = toHexDigit(ch);\n            if (x2 === -1) {\n              (0, _util.warn)('Lexer_getName: Illegal digit (' + String.fromCharCode(ch) + ') in hexadecimal number.');\n              strBuf.push('#', String.fromCharCode(previousCh));\n              if (specialChars[ch]) {\n                break;\n              }\n              strBuf.push(String.fromCharCode(ch));\n              continue;\n            }\n            strBuf.push(String.fromCharCode(x << 4 | x2));\n          } else {\n            strBuf.push('#', String.fromCharCode(ch));\n          }\n        } else {\n          strBuf.push(String.fromCharCode(ch));\n        }\n      }\n      if (strBuf.length > 127) {\n        (0, _util.warn)('name token is longer than allowed by the spec: ' + strBuf.length);\n      }\n      return _primitives.Name.get(strBuf.join(''));\n    },\n    getHexString: function Lexer_getHexString() {\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      var ch = this.currentChar;\n      var isFirstHex = true;\n      var firstDigit;\n      var secondDigit;\n      while (true) {\n        if (ch < 0) {\n          (0, _util.warn)('Unterminated hex string');\n          break;\n        } else if (ch === 0x3E) {\n          this.nextChar();\n          break;\n        } else if (specialChars[ch] === 1) {\n          ch = this.nextChar();\n          continue;\n        } else {\n          if (isFirstHex) {\n            firstDigit = toHexDigit(ch);\n            if (firstDigit === -1) {\n              (0, _util.warn)('Ignoring invalid character \"' + ch + '\" in hex string');\n              ch = this.nextChar();\n              continue;\n            }\n          } else {\n            secondDigit = toHexDigit(ch);\n            if (secondDigit === -1) {\n              (0, _util.warn)('Ignoring invalid character \"' + ch + '\" in hex string');\n              ch = this.nextChar();\n              continue;\n            }\n            strBuf.push(String.fromCharCode(firstDigit << 4 | secondDigit));\n          }\n          isFirstHex = !isFirstHex;\n          ch = this.nextChar();\n        }\n      }\n      return strBuf.join('');\n    },\n    getObj: function Lexer_getObj() {\n      var comment = false;\n      var ch = this.currentChar;\n      while (true) {\n        if (ch < 0) {\n          return _primitives.EOF;\n        }\n        if (comment) {\n          if (ch === 0x0A || ch === 0x0D) {\n            comment = false;\n          }\n        } else if (ch === 0x25) {\n          comment = true;\n        } else if (specialChars[ch] !== 1) {\n          break;\n        }\n        ch = this.nextChar();\n      }\n      switch (ch | 0) {\n        case 0x30:\n        case 0x31:\n        case 0x32:\n        case 0x33:\n        case 0x34:\n        case 0x35:\n        case 0x36:\n        case 0x37:\n        case 0x38:\n        case 0x39:\n        case 0x2B:\n        case 0x2D:\n        case 0x2E:\n          return this.getNumber();\n        case 0x28:\n          return this.getString();\n        case 0x2F:\n          return this.getName();\n        case 0x5B:\n          this.nextChar();\n          return _primitives.Cmd.get('[');\n        case 0x5D:\n          this.nextChar();\n          return _primitives.Cmd.get(']');\n        case 0x3C:\n          ch = this.nextChar();\n          if (ch === 0x3C) {\n            this.nextChar();\n            return _primitives.Cmd.get('<<');\n          }\n          return this.getHexString();\n        case 0x3E:\n          ch = this.nextChar();\n          if (ch === 0x3E) {\n            this.nextChar();\n            return _primitives.Cmd.get('>>');\n          }\n          return _primitives.Cmd.get('>');\n        case 0x7B:\n          this.nextChar();\n          return _primitives.Cmd.get('{');\n        case 0x7D:\n          this.nextChar();\n          return _primitives.Cmd.get('}');\n        case 0x29:\n          this.nextChar();\n          throw new _util.FormatError('Illegal character: ' + ch);\n      }\n      var str = String.fromCharCode(ch);\n      var knownCommands = this.knownCommands;\n      var knownCommandFound = knownCommands && knownCommands[str] !== undefined;\n      while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {\n        var possibleCommand = str + String.fromCharCode(ch);\n        if (knownCommandFound && knownCommands[possibleCommand] === undefined) {\n          break;\n        }\n        if (str.length === 128) {\n          throw new _util.FormatError('Command token too long: ' + str.length);\n        }\n        str = possibleCommand;\n        knownCommandFound = knownCommands && knownCommands[str] !== undefined;\n      }\n      if (str === 'true') {\n        return true;\n      }\n      if (str === 'false') {\n        return false;\n      }\n      if (str === 'null') {\n        return null;\n      }\n      return _primitives.Cmd.get(str);\n    },\n    skipToNextLine: function Lexer_skipToNextLine() {\n      var ch = this.currentChar;\n      while (ch >= 0) {\n        if (ch === 0x0D) {\n          ch = this.nextChar();\n          if (ch === 0x0A) {\n            this.nextChar();\n          }\n          break;\n        } else if (ch === 0x0A) {\n          this.nextChar();\n          break;\n        }\n        ch = this.nextChar();\n      }\n    }\n  };\n  return Lexer;\n}();\nvar Linearization = {\n  create: function LinearizationCreate(stream) {\n    function getInt(name, allowZeroValue) {\n      var obj = linDict.get(name);\n      if ((0, _util.isInt)(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) {\n        return obj;\n      }\n      throw new Error('The \"' + name + '\" parameter in the linearization ' + 'dictionary is invalid.');\n    }\n    function getHints() {\n      var hints = linDict.get('H'),\n          hintsLength,\n          item;\n      if ((0, _util.isArray)(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) {\n        for (var index = 0; index < hintsLength; index++) {\n          if (!((0, _util.isInt)(item = hints[index]) && item > 0)) {\n            throw new Error('Hint (' + index + ') in the linearization dictionary is invalid.');\n          }\n        }\n        return hints;\n      }\n      throw new Error('Hint array in the linearization dictionary is invalid.');\n    }\n    var parser = new Parser(new Lexer(stream), false, null);\n    var obj1 = parser.getObj();\n    var obj2 = parser.getObj();\n    var obj3 = parser.getObj();\n    var linDict = parser.getObj();\n    var obj, length;\n    if (!((0, _util.isInt)(obj1) && (0, _util.isInt)(obj2) && (0, _primitives.isCmd)(obj3, 'obj') && (0, _primitives.isDict)(linDict) && (0, _util.isNum)(obj = linDict.get('Linearized')) && obj > 0)) {\n      return null;\n    } else if ((length = getInt('L')) !== stream.length) {\n      throw new Error('The \"L\" parameter in the linearization dictionary ' + 'does not equal the stream length.');\n    }\n    return {\n      length: length,\n      hints: getHints(),\n      objectNumberFirst: getInt('O'),\n      endFirst: getInt('E'),\n      numPages: getInt('N'),\n      mainXRefEntriesOffset: getInt('T'),\n      pageFirst: linDict.has('P') ? getInt('P', true) : 0\n    };\n  }\n};\nexports.Lexer = Lexer;\nexports.Linearization = Linearization;\nexports.Parser = Parser;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\nvar getLookupTableFactory = __w_pdfjs_require__(0).getLookupTableFactory;\nvar getGlyphsUnicode = getLookupTableFactory(function (t) {\n t['A'] = 0x0041;\n t['AE'] = 0x00C6;\n t['AEacute'] = 0x01FC;\n t['AEmacron'] = 0x01E2;\n t['AEsmall'] = 0xF7E6;\n t['Aacute'] = 0x00C1;\n t['Aacutesmall'] = 0xF7E1;\n t['Abreve'] = 0x0102;\n t['Abreveacute'] = 0x1EAE;\n t['Abrevecyrillic'] = 0x04D0;\n t['Abrevedotbelow'] = 0x1EB6;\n t['Abrevegrave'] = 0x1EB0;\n t['Abrevehookabove'] = 0x1EB2;\n t['Abrevetilde'] = 0x1EB4;\n t['Acaron'] = 0x01CD;\n t['Acircle'] = 0x24B6;\n t['Acircumflex'] = 0x00C2;\n t['Acircumflexacute'] = 0x1EA4;\n t['Acircumflexdotbelow'] = 0x1EAC;\n t['Acircumflexgrave'] = 0x1EA6;\n t['Acircumflexhookabove'] = 0x1EA8;\n t['Acircumflexsmall'] = 0xF7E2;\n t['Acircumflextilde'] = 0x1EAA;\n t['Acute'] = 0xF6C9;\n t['Acutesmall'] = 0xF7B4;\n t['Acyrillic'] = 0x0410;\n t['Adblgrave'] = 0x0200;\n t['Adieresis'] = 0x00C4;\n t['Adieresiscyrillic'] = 0x04D2;\n t['Adieresismacron'] = 0x01DE;\n t['Adieresissmall'] = 0xF7E4;\n t['Adotbelow'] = 0x1EA0;\n t['Adotmacron'] = 0x01E0;\n t['Agrave'] = 0x00C0;\n t['Agravesmall'] = 0xF7E0;\n t['Ahookabove'] = 0x1EA2;\n t['Aiecyrillic'] = 0x04D4;\n t['Ainvertedbreve'] = 0x0202;\n t['Alpha'] = 0x0391;\n t['Alphatonos'] = 0x0386;\n t['Amacron'] = 0x0100;\n t['Amonospace'] = 0xFF21;\n t['Aogonek'] = 0x0104;\n t['Aring'] = 0x00C5;\n t['Aringacute'] = 0x01FA;\n t['Aringbelow'] = 0x1E00;\n t['Aringsmall'] = 0xF7E5;\n t['Asmall'] = 0xF761;\n t['Atilde'] = 0x00C3;\n t['Atildesmall'] = 0xF7E3;\n t['Aybarmenian'] = 0x0531;\n t['B'] = 0x0042;\n t['Bcircle'] = 0x24B7;\n t['Bdotaccent'] = 0x1E02;\n t['Bdotbelow'] = 0x1E04;\n t['Becyrillic'] = 0x0411;\n t['Benarmenian'] = 0x0532;\n t['Beta'] = 0x0392;\n t['Bhook'] = 0x0181;\n t['Blinebelow'] = 0x1E06;\n t['Bmonospace'] = 0xFF22;\n t['Brevesmall'] = 0xF6F4;\n t['Bsmall'] = 0xF762;\n t['Btopbar'] = 0x0182;\n t['C'] = 0x0043;\n t['Caarmenian'] = 0x053E;\n t['Cacute'] = 0x0106;\n t['Caron'] = 0xF6CA;\n t['Caronsmall'] = 0xF6F5;\n t['Ccaron'] = 0x010C;\n t['Ccedilla'] = 0x00C7;\n t['Ccedillaacute'] = 0x1E08;\n t['Ccedillasmall'] = 0xF7E7;\n t['Ccircle'] = 0x24B8;\n t['Ccircumflex'] = 0x0108;\n t['Cdot'] = 0x010A;\n t['Cdotaccent'] = 0x010A;\n t['Cedillasmall'] = 0xF7B8;\n t['Chaarmenian'] = 0x0549;\n t['Cheabkhasiancyrillic'] = 0x04BC;\n t['Checyrillic'] = 0x0427;\n t['Chedescenderabkhasiancyrillic'] = 0x04BE;\n t['Chedescendercyrillic'] = 0x04B6;\n t['Chedieresiscyrillic'] = 0x04F4;\n t['Cheharmenian'] = 0x0543;\n t['Chekhakassiancyrillic'] = 0x04CB;\n t['Cheverticalstrokecyrillic'] = 0x04B8;\n t['Chi'] = 0x03A7;\n t['Chook'] = 0x0187;\n t['Circumflexsmall'] = 0xF6F6;\n t['Cmonospace'] = 0xFF23;\n t['Coarmenian'] = 0x0551;\n t['Csmall'] = 0xF763;\n t['D'] = 0x0044;\n t['DZ'] = 0x01F1;\n t['DZcaron'] = 0x01C4;\n t['Daarmenian'] = 0x0534;\n t['Dafrican'] = 0x0189;\n t['Dcaron'] = 0x010E;\n t['Dcedilla'] = 0x1E10;\n t['Dcircle'] = 0x24B9;\n t['Dcircumflexbelow'] = 0x1E12;\n t['Dcroat'] = 0x0110;\n t['Ddotaccent'] = 0x1E0A;\n t['Ddotbelow'] = 0x1E0C;\n t['Decyrillic'] = 0x0414;\n t['Deicoptic'] = 0x03EE;\n t['Delta'] = 0x2206;\n t['Deltagreek'] = 0x0394;\n t['Dhook'] = 0x018A;\n t['Dieresis'] = 0xF6CB;\n t['DieresisAcute'] = 0xF6CC;\n t['DieresisGrave'] = 0xF6CD;\n t['Dieresissmall'] = 0xF7A8;\n t['Digammagreek'] = 0x03DC;\n t['Djecyrillic'] = 0x0402;\n t['Dlinebelow'] = 0x1E0E;\n t['Dmonospace'] = 0xFF24;\n t['Dotaccentsmall'] = 0xF6F7;\n t['Dslash'] = 0x0110;\n t['Dsmall'] = 0xF764;\n t['Dtopbar'] = 0x018B;\n t['Dz'] = 0x01F2;\n t['Dzcaron'] = 0x01C5;\n t['Dzeabkhasiancyrillic'] = 0x04E0;\n t['Dzecyrillic'] = 0x0405;\n t['Dzhecyrillic'] = 0x040F;\n t['E'] = 0x0045;\n t['Eacute'] = 0x00C9;\n t['Eacutesmall'] = 0xF7E9;\n t['Ebreve'] = 0x0114;\n t['Ecaron'] = 0x011A;\n t['Ecedillabreve'] = 0x1E1C;\n t['Echarmenian'] = 0x0535;\n t['Ecircle'] = 0x24BA;\n t['Ecircumflex'] = 0x00CA;\n t['Ecircumflexacute'] = 0x1EBE;\n t['Ecircumflexbelow'] = 0x1E18;\n t['Ecircumflexdotbelow'] = 0x1EC6;\n t['Ecircumflexgrave'] = 0x1EC0;\n t['Ecircumflexhookabove'] = 0x1EC2;\n t['Ecircumflexsmall'] = 0xF7EA;\n t['Ecircumflextilde'] = 0x1EC4;\n t['Ecyrillic'] = 0x0404;\n t['Edblgrave'] = 0x0204;\n t['Edieresis'] = 0x00CB;\n t['Edieresissmall'] = 0xF7EB;\n t['Edot'] = 0x0116;\n t['Edotaccent'] = 0x0116;\n t['Edotbelow'] = 0x1EB8;\n t['Efcyrillic'] = 0x0424;\n t['Egrave'] = 0x00C8;\n t['Egravesmall'] = 0xF7E8;\n t['Eharmenian'] = 0x0537;\n t['Ehookabove'] = 0x1EBA;\n t['Eightroman'] = 0x2167;\n t['Einvertedbreve'] = 0x0206;\n t['Eiotifiedcyrillic'] = 0x0464;\n t['Elcyrillic'] = 0x041B;\n t['Elevenroman'] = 0x216A;\n t['Emacron'] = 0x0112;\n t['Emacronacute'] = 0x1E16;\n t['Emacrongrave'] = 0x1E14;\n t['Emcyrillic'] = 0x041C;\n t['Emonospace'] = 0xFF25;\n t['Encyrillic'] = 0x041D;\n t['Endescendercyrillic'] = 0x04A2;\n t['Eng'] = 0x014A;\n t['Enghecyrillic'] = 0x04A4;\n t['Enhookcyrillic'] = 0x04C7;\n t['Eogonek'] = 0x0118;\n t['Eopen'] = 0x0190;\n t['Epsilon'] = 0x0395;\n t['Epsilontonos'] = 0x0388;\n t['Ercyrillic'] = 0x0420;\n t['Ereversed'] = 0x018E;\n t['Ereversedcyrillic'] = 0x042D;\n t['Escyrillic'] = 0x0421;\n t['Esdescendercyrillic'] = 0x04AA;\n t['Esh'] = 0x01A9;\n t['Esmall'] = 0xF765;\n t['Eta'] = 0x0397;\n t['Etarmenian'] = 0x0538;\n t['Etatonos'] = 0x0389;\n t['Eth'] = 0x00D0;\n t['Ethsmall'] = 0xF7F0;\n t['Etilde'] = 0x1EBC;\n t['Etildebelow'] = 0x1E1A;\n t['Euro'] = 0x20AC;\n t['Ezh'] = 0x01B7;\n t['Ezhcaron'] = 0x01EE;\n t['Ezhreversed'] = 0x01B8;\n t['F'] = 0x0046;\n t['Fcircle'] = 0x24BB;\n t['Fdotaccent'] = 0x1E1E;\n t['Feharmenian'] = 0x0556;\n t['Feicoptic'] = 0x03E4;\n t['Fhook'] = 0x0191;\n t['Fitacyrillic'] = 0x0472;\n t['Fiveroman'] = 0x2164;\n t['Fmonospace'] = 0xFF26;\n t['Fourroman'] = 0x2163;\n t['Fsmall'] = 0xF766;\n t['G'] = 0x0047;\n t['GBsquare'] = 0x3387;\n t['Gacute'] = 0x01F4;\n t['Gamma'] = 0x0393;\n t['Gammaafrican'] = 0x0194;\n t['Gangiacoptic'] = 0x03EA;\n t['Gbreve'] = 0x011E;\n t['Gcaron'] = 0x01E6;\n t['Gcedilla'] = 0x0122;\n t['Gcircle'] = 0x24BC;\n t['Gcircumflex'] = 0x011C;\n t['Gcommaaccent'] = 0x0122;\n t['Gdot'] = 0x0120;\n t['Gdotaccent'] = 0x0120;\n t['Gecyrillic'] = 0x0413;\n t['Ghadarmenian'] = 0x0542;\n t['Ghemiddlehookcyrillic'] = 0x0494;\n t['Ghestrokecyrillic'] = 0x0492;\n t['Gheupturncyrillic'] = 0x0490;\n t['Ghook'] = 0x0193;\n t['Gimarmenian'] = 0x0533;\n t['Gjecyrillic'] = 0x0403;\n t['Gmacron'] = 0x1E20;\n t['Gmonospace'] = 0xFF27;\n t['Grave'] = 0xF6CE;\n t['Gravesmall'] = 0xF760;\n t['Gsmall'] = 0xF767;\n t['Gsmallhook'] = 0x029B;\n t['Gstroke'] = 0x01E4;\n t['H'] = 0x0048;\n t['H18533'] = 0x25CF;\n t['H18543'] = 0x25AA;\n t['H18551'] = 0x25AB;\n t['H22073'] = 0x25A1;\n t['HPsquare'] = 0x33CB;\n t['Haabkhasiancyrillic'] = 0x04A8;\n t['Hadescendercyrillic'] = 0x04B2;\n t['Hardsigncyrillic'] = 0x042A;\n t['Hbar'] = 0x0126;\n t['Hbrevebelow'] = 0x1E2A;\n t['Hcedilla'] = 0x1E28;\n t['Hcircle'] = 0x24BD;\n t['Hcircumflex'] = 0x0124;\n t['Hdieresis'] = 0x1E26;\n t['Hdotaccent'] = 0x1E22;\n t['Hdotbelow'] = 0x1E24;\n t['Hmonospace'] = 0xFF28;\n t['Hoarmenian'] = 0x0540;\n t['Horicoptic'] = 0x03E8;\n t['Hsmall'] = 0xF768;\n t['Hungarumlaut'] = 0xF6CF;\n t['Hungarumlautsmall'] = 0xF6F8;\n t['Hzsquare'] = 0x3390;\n t['I'] = 0x0049;\n t['IAcyrillic'] = 0x042F;\n t['IJ'] = 0x0132;\n t['IUcyrillic'] = 0x042E;\n t['Iacute'] = 0x00CD;\n t['Iacutesmall'] = 0xF7ED;\n t['Ibreve'] = 0x012C;\n t['Icaron'] = 0x01CF;\n t['Icircle'] = 0x24BE;\n t['Icircumflex'] = 0x00CE;\n t['Icircumflexsmall'] = 0xF7EE;\n t['Icyrillic'] = 0x0406;\n t['Idblgrave'] = 0x0208;\n t['Idieresis'] = 0x00CF;\n t['Idieresisacute'] = 0x1E2E;\n t['Idieresiscyrillic'] = 0x04E4;\n t['Idieresissmall'] = 0xF7EF;\n t['Idot'] = 0x0130;\n t['Idotaccent'] = 0x0130;\n t['Idotbelow'] = 0x1ECA;\n t['Iebrevecyrillic'] = 0x04D6;\n t['Iecyrillic'] = 0x0415;\n t['Ifraktur'] = 0x2111;\n t['Igrave'] = 0x00CC;\n t['Igravesmall'] = 0xF7EC;\n t['Ihookabove'] = 0x1EC8;\n t['Iicyrillic'] = 0x0418;\n t['Iinvertedbreve'] = 0x020A;\n t['Iishortcyrillic'] = 0x0419;\n t['Imacron'] = 0x012A;\n t['Imacroncyrillic'] = 0x04E2;\n t['Imonospace'] = 0xFF29;\n t['Iniarmenian'] = 0x053B;\n t['Iocyrillic'] = 0x0401;\n t['Iogonek'] = 0x012E;\n t['Iota'] = 0x0399;\n t['Iotaafrican'] = 0x0196;\n t['Iotadieresis'] = 0x03AA;\n t['Iotatonos'] = 0x038A;\n t['Ismall'] = 0xF769;\n t['Istroke'] = 0x0197;\n t['Itilde'] = 0x0128;\n t['Itildebelow'] = 0x1E2C;\n t['Izhitsacyrillic'] = 0x0474;\n t['Izhitsadblgravecyrillic'] = 0x0476;\n t['J'] = 0x004A;\n t['Jaarmenian'] = 0x0541;\n t['Jcircle'] = 0x24BF;\n t['Jcircumflex'] = 0x0134;\n t['Jecyrillic'] = 0x0408;\n t['Jheharmenian'] = 0x054B;\n t['Jmonospace'] = 0xFF2A;\n t['Jsmall'] = 0xF76A;\n t['K'] = 0x004B;\n t['KBsquare'] = 0x3385;\n t['KKsquare'] = 0x33CD;\n t['Kabashkircyrillic'] = 0x04A0;\n t['Kacute'] = 0x1E30;\n t['Kacyrillic'] = 0x041A;\n t['Kadescendercyrillic'] = 0x049A;\n t['Kahookcyrillic'] = 0x04C3;\n t['Kappa'] = 0x039A;\n t['Kastrokecyrillic'] = 0x049E;\n t['Kaverticalstrokecyrillic'] = 0x049C;\n t['Kcaron'] = 0x01E8;\n t['Kcedilla'] = 0x0136;\n t['Kcircle'] = 0x24C0;\n t['Kcommaaccent'] = 0x0136;\n t['Kdotbelow'] = 0x1E32;\n t['Keharmenian'] = 0x0554;\n t['Kenarmenian'] = 0x053F;\n t['Khacyrillic'] = 0x0425;\n t['Kheicoptic'] = 0x03E6;\n t['Khook'] = 0x0198;\n t['Kjecyrillic'] = 0x040C;\n t['Klinebelow'] = 0x1E34;\n t['Kmonospace'] = 0xFF2B;\n t['Koppacyrillic'] = 0x0480;\n t['Koppagreek'] = 0x03DE;\n t['Ksicyrillic'] = 0x046E;\n t['Ksmall'] = 0xF76B;\n t['L'] = 0x004C;\n t['LJ'] = 0x01C7;\n t['LL'] = 0xF6BF;\n t['Lacute'] = 0x0139;\n t['Lambda'] = 0x039B;\n t['Lcaron'] = 0x013D;\n t['Lcedilla'] = 0x013B;\n t['Lcircle'] = 0x24C1;\n t['Lcircumflexbelow'] = 0x1E3C;\n t['Lcommaaccent'] = 0x013B;\n t['Ldot'] = 0x013F;\n t['Ldotaccent'] = 0x013F;\n t['Ldotbelow'] = 0x1E36;\n t['Ldotbelowmacron'] = 0x1E38;\n t['Liwnarmenian'] = 0x053C;\n t['Lj'] = 0x01C8;\n t['Ljecyrillic'] = 0x0409;\n t['Llinebelow'] = 0x1E3A;\n t['Lmonospace'] = 0xFF2C;\n t['Lslash'] = 0x0141;\n t['Lslashsmall'] = 0xF6F9;\n t['Lsmall'] = 0xF76C;\n t['M'] = 0x004D;\n t['MBsquare'] = 0x3386;\n t['Macron'] = 0xF6D0;\n t['Macronsmall'] = 0xF7AF;\n t['Macute'] = 0x1E3E;\n t['Mcircle'] = 0x24C2;\n t['Mdotaccent'] = 0x1E40;\n t['Mdotbelow'] = 0x1E42;\n t['Menarmenian'] = 0x0544;\n t['Mmonospace'] = 0xFF2D;\n t['Msmall'] = 0xF76D;\n t['Mturned'] = 0x019C;\n t['Mu'] = 0x039C;\n t['N'] = 0x004E;\n t['NJ'] = 0x01CA;\n t['Nacute'] = 0x0143;\n t['Ncaron'] = 0x0147;\n t['Ncedilla'] = 0x0145;\n t['Ncircle'] = 0x24C3;\n t['Ncircumflexbelow'] = 0x1E4A;\n t['Ncommaaccent'] = 0x0145;\n t['Ndotaccent'] = 0x1E44;\n t['Ndotbelow'] = 0x1E46;\n t['Nhookleft'] = 0x019D;\n t['Nineroman'] = 0x2168;\n t['Nj'] = 0x01CB;\n t['Njecyrillic'] = 0x040A;\n t['Nlinebelow'] = 0x1E48;\n t['Nmonospace'] = 0xFF2E;\n t['Nowarmenian'] = 0x0546;\n t['Nsmall'] = 0xF76E;\n t['Ntilde'] = 0x00D1;\n t['Ntildesmall'] = 0xF7F1;\n t['Nu'] = 0x039D;\n t['O'] = 0x004F;\n t['OE'] = 0x0152;\n t['OEsmall'] = 0xF6FA;\n t['Oacute'] = 0x00D3;\n t['Oacutesmall'] = 0xF7F3;\n t['Obarredcyrillic'] = 0x04E8;\n t['Obarreddieresiscyrillic'] = 0x04EA;\n t['Obreve'] = 0x014E;\n t['Ocaron'] = 0x01D1;\n t['Ocenteredtilde'] = 0x019F;\n t['Ocircle'] = 0x24C4;\n t['Ocircumflex'] = 0x00D4;\n t['Ocircumflexacute'] = 0x1ED0;\n t['Ocircumflexdotbelow'] = 0x1ED8;\n t['Ocircumflexgrave'] = 0x1ED2;\n t['Ocircumflexhookabove'] = 0x1ED4;\n t['Ocircumflexsmall'] = 0xF7F4;\n t['Ocircumflextilde'] = 0x1ED6;\n t['Ocyrillic'] = 0x041E;\n t['Odblacute'] = 0x0150;\n t['Odblgrave'] = 0x020C;\n t['Odieresis'] = 0x00D6;\n t['Odieresiscyrillic'] = 0x04E6;\n t['Odieresissmall'] = 0xF7F6;\n t['Odotbelow'] = 0x1ECC;\n t['Ogoneksmall'] = 0xF6FB;\n t['Ograve'] = 0x00D2;\n t['Ogravesmall'] = 0xF7F2;\n t['Oharmenian'] = 0x0555;\n t['Ohm'] = 0x2126;\n t['Ohookabove'] = 0x1ECE;\n t['Ohorn'] = 0x01A0;\n t['Ohornacute'] = 0x1EDA;\n t['Ohorndotbelow'] = 0x1EE2;\n t['Ohorngrave'] = 0x1EDC;\n t['Ohornhookabove'] = 0x1EDE;\n t['Ohorntilde'] = 0x1EE0;\n t['Ohungarumlaut'] = 0x0150;\n t['Oi'] = 0x01A2;\n t['Oinvertedbreve'] = 0x020E;\n t['Omacron'] = 0x014C;\n t['Omacronacute'] = 0x1E52;\n t['Omacrongrave'] = 0x1E50;\n t['Omega'] = 0x2126;\n t['Omegacyrillic'] = 0x0460;\n t['Omegagreek'] = 0x03A9;\n t['Omegaroundcyrillic'] = 0x047A;\n t['Omegatitlocyrillic'] = 0x047C;\n t['Omegatonos'] = 0x038F;\n t['Omicron'] = 0x039F;\n t['Omicrontonos'] = 0x038C;\n t['Omonospace'] = 0xFF2F;\n t['Oneroman'] = 0x2160;\n t['Oogonek'] = 0x01EA;\n t['Oogonekmacron'] = 0x01EC;\n t['Oopen'] = 0x0186;\n t['Oslash'] = 0x00D8;\n t['Oslashacute'] = 0x01FE;\n t['Oslashsmall'] = 0xF7F8;\n t['Osmall'] = 0xF76F;\n t['Ostrokeacute'] = 0x01FE;\n t['Otcyrillic'] = 0x047E;\n t['Otilde'] = 0x00D5;\n t['Otildeacute'] = 0x1E4C;\n t['Otildedieresis'] = 0x1E4E;\n t['Otildesmall'] = 0xF7F5;\n t['P'] = 0x0050;\n t['Pacute'] = 0x1E54;\n t['Pcircle'] = 0x24C5;\n t['Pdotaccent'] = 0x1E56;\n t['Pecyrillic'] = 0x041F;\n t['Peharmenian'] = 0x054A;\n t['Pemiddlehookcyrillic'] = 0x04A6;\n t['Phi'] = 0x03A6;\n t['Phook'] = 0x01A4;\n t['Pi'] = 0x03A0;\n t['Piwrarmenian'] = 0x0553;\n t['Pmonospace'] = 0xFF30;\n t['Psi'] = 0x03A8;\n t['Psicyrillic'] = 0x0470;\n t['Psmall'] = 0xF770;\n t['Q'] = 0x0051;\n t['Qcircle'] = 0x24C6;\n t['Qmonospace'] = 0xFF31;\n t['Qsmall'] = 0xF771;\n t['R'] = 0x0052;\n t['Raarmenian'] = 0x054C;\n t['Racute'] = 0x0154;\n t['Rcaron'] = 0x0158;\n t['Rcedilla'] = 0x0156;\n t['Rcircle'] = 0x24C7;\n t['Rcommaaccent'] = 0x0156;\n t['Rdblgrave'] = 0x0210;\n t['Rdotaccent'] = 0x1E58;\n t['Rdotbelow'] = 0x1E5A;\n t['Rdotbelowmacron'] = 0x1E5C;\n t['Reharmenian'] = 0x0550;\n t['Rfraktur'] = 0x211C;\n t['Rho'] = 0x03A1;\n t['Ringsmall'] = 0xF6FC;\n t['Rinvertedbreve'] = 0x0212;\n t['Rlinebelow'] = 0x1E5E;\n t['Rmonospace'] = 0xFF32;\n t['Rsmall'] = 0xF772;\n t['Rsmallinverted'] = 0x0281;\n t['Rsmallinvertedsuperior'] = 0x02B6;\n t['S'] = 0x0053;\n t['SF010000'] = 0x250C;\n t['SF020000'] = 0x2514;\n t['SF030000'] = 0x2510;\n t['SF040000'] = 0x2518;\n t['SF050000'] = 0x253C;\n t['SF060000'] = 0x252C;\n t['SF070000'] = 0x2534;\n t['SF080000'] = 0x251C;\n t['SF090000'] = 0x2524;\n t['SF100000'] = 0x2500;\n t['SF110000'] = 0x2502;\n t['SF190000'] = 0x2561;\n t['SF200000'] = 0x2562;\n t['SF210000'] = 0x2556;\n t['SF220000'] = 0x2555;\n t['SF230000'] = 0x2563;\n t['SF240000'] = 0x2551;\n t['SF250000'] = 0x2557;\n t['SF260000'] = 0x255D;\n t['SF270000'] = 0x255C;\n t['SF280000'] = 0x255B;\n t['SF360000'] = 0x255E;\n t['SF370000'] = 0x255F;\n t['SF380000'] = 0x255A;\n t['SF390000'] = 0x2554;\n t['SF400000'] = 0x2569;\n t['SF410000'] = 0x2566;\n t['SF420000'] = 0x2560;\n t['SF430000'] = 0x2550;\n t['SF440000'] = 0x256C;\n t['SF450000'] = 0x2567;\n t['SF460000'] = 0x2568;\n t['SF470000'] = 0x2564;\n t['SF480000'] = 0x2565;\n t['SF490000'] = 0x2559;\n t['SF500000'] = 0x2558;\n t['SF510000'] = 0x2552;\n t['SF520000'] = 0x2553;\n t['SF530000'] = 0x256B;\n t['SF540000'] = 0x256A;\n t['Sacute'] = 0x015A;\n t['Sacutedotaccent'] = 0x1E64;\n t['Sampigreek'] = 0x03E0;\n t['Scaron'] = 0x0160;\n t['Scarondotaccent'] = 0x1E66;\n t['Scaronsmall'] = 0xF6FD;\n t['Scedilla'] = 0x015E;\n t['Schwa'] = 0x018F;\n t['Schwacyrillic'] = 0x04D8;\n t['Schwadieresiscyrillic'] = 0x04DA;\n t['Scircle'] = 0x24C8;\n t['Scircumflex'] = 0x015C;\n t['Scommaaccent'] = 0x0218;\n t['Sdotaccent'] = 0x1E60;\n t['Sdotbelow'] = 0x1E62;\n t['Sdotbelowdotaccent'] = 0x1E68;\n t['Seharmenian'] = 0x054D;\n t['Sevenroman'] = 0x2166;\n t['Shaarmenian'] = 0x0547;\n t['Shacyrillic'] = 0x0428;\n t['Shchacyrillic'] = 0x0429;\n t['Sheicoptic'] = 0x03E2;\n t['Shhacyrillic'] = 0x04BA;\n t['Shimacoptic'] = 0x03EC;\n t['Sigma'] = 0x03A3;\n t['Sixroman'] = 0x2165;\n t['Smonospace'] = 0xFF33;\n t['Softsigncyrillic'] = 0x042C;\n t['Ssmall'] = 0xF773;\n t['Stigmagreek'] = 0x03DA;\n t['T'] = 0x0054;\n t['Tau'] = 0x03A4;\n t['Tbar'] = 0x0166;\n t['Tcaron'] = 0x0164;\n t['Tcedilla'] = 0x0162;\n t['Tcircle'] = 0x24C9;\n t['Tcircumflexbelow'] = 0x1E70;\n t['Tcommaaccent'] = 0x0162;\n t['Tdotaccent'] = 0x1E6A;\n t['Tdotbelow'] = 0x1E6C;\n t['Tecyrillic'] = 0x0422;\n t['Tedescendercyrillic'] = 0x04AC;\n t['Tenroman'] = 0x2169;\n t['Tetsecyrillic'] = 0x04B4;\n t['Theta'] = 0x0398;\n t['Thook'] = 0x01AC;\n t['Thorn'] = 0x00DE;\n t['Thornsmall'] = 0xF7FE;\n t['Threeroman'] = 0x2162;\n t['Tildesmall'] = 0xF6FE;\n t['Tiwnarmenian'] = 0x054F;\n t['Tlinebelow'] = 0x1E6E;\n t['Tmonospace'] = 0xFF34;\n t['Toarmenian'] = 0x0539;\n t['Tonefive'] = 0x01BC;\n t['Tonesix'] = 0x0184;\n t['Tonetwo'] = 0x01A7;\n t['Tretroflexhook'] = 0x01AE;\n t['Tsecyrillic'] = 0x0426;\n t['Tshecyrillic'] = 0x040B;\n t['Tsmall'] = 0xF774;\n t['Twelveroman'] = 0x216B;\n t['Tworoman'] = 0x2161;\n t['U'] = 0x0055;\n t['Uacute'] = 0x00DA;\n t['Uacutesmall'] = 0xF7FA;\n t['Ubreve'] = 0x016C;\n t['Ucaron'] = 0x01D3;\n t['Ucircle'] = 0x24CA;\n t['Ucircumflex'] = 0x00DB;\n t['Ucircumflexbelow'] = 0x1E76;\n t['Ucircumflexsmall'] = 0xF7FB;\n t['Ucyrillic'] = 0x0423;\n t['Udblacute'] = 0x0170;\n t['Udblgrave'] = 0x0214;\n t['Udieresis'] = 0x00DC;\n t['Udieresisacute'] = 0x01D7;\n t['Udieresisbelow'] = 0x1E72;\n t['Udieresiscaron'] = 0x01D9;\n t['Udieresiscyrillic'] = 0x04F0;\n t['Udieresisgrave'] = 0x01DB;\n t['Udieresismacron'] = 0x01D5;\n t['Udieresissmall'] = 0xF7FC;\n t['Udotbelow'] = 0x1EE4;\n t['Ugrave'] = 0x00D9;\n t['Ugravesmall'] = 0xF7F9;\n t['Uhookabove'] = 0x1EE6;\n t['Uhorn'] = 0x01AF;\n t['Uhornacute'] = 0x1EE8;\n t['Uhorndotbelow'] = 0x1EF0;\n t['Uhorngrave'] = 0x1EEA;\n t['Uhornhookabove'] = 0x1EEC;\n t['Uhorntilde'] = 0x1EEE;\n t['Uhungarumlaut'] = 0x0170;\n t['Uhungarumlautcyrillic'] = 0x04F2;\n t['Uinvertedbreve'] = 0x0216;\n t['Ukcyrillic'] = 0x0478;\n t['Umacron'] = 0x016A;\n t['Umacroncyrillic'] = 0x04EE;\n t['Umacrondieresis'] = 0x1E7A;\n t['Umonospace'] = 0xFF35;\n t['Uogonek'] = 0x0172;\n t['Upsilon'] = 0x03A5;\n t['Upsilon1'] = 0x03D2;\n t['Upsilonacutehooksymbolgreek'] = 0x03D3;\n t['Upsilonafrican'] = 0x01B1;\n t['Upsilondieresis'] = 0x03AB;\n t['Upsilondieresishooksymbolgreek'] = 0x03D4;\n t['Upsilonhooksymbol'] = 0x03D2;\n t['Upsilontonos'] = 0x038E;\n t['Uring'] = 0x016E;\n t['Ushortcyrillic'] = 0x040E;\n t['Usmall'] = 0xF775;\n t['Ustraightcyrillic'] = 0x04AE;\n t['Ustraightstrokecyrillic'] = 0x04B0;\n t['Utilde'] = 0x0168;\n t['Utildeacute'] = 0x1E78;\n t['Utildebelow'] = 0x1E74;\n t['V'] = 0x0056;\n t['Vcircle'] = 0x24CB;\n t['Vdotbelow'] = 0x1E7E;\n t['Vecyrillic'] = 0x0412;\n t['Vewarmenian'] = 0x054E;\n t['Vhook'] = 0x01B2;\n t['Vmonospace'] = 0xFF36;\n t['Voarmenian'] = 0x0548;\n t['Vsmall'] = 0xF776;\n t['Vtilde'] = 0x1E7C;\n t['W'] = 0x0057;\n t['Wacute'] = 0x1E82;\n t['Wcircle'] = 0x24CC;\n t['Wcircumflex'] = 0x0174;\n t['Wdieresis'] = 0x1E84;\n t['Wdotaccent'] = 0x1E86;\n t['Wdotbelow'] = 0x1E88;\n t['Wgrave'] = 0x1E80;\n t['Wmonospace'] = 0xFF37;\n t['Wsmall'] = 0xF777;\n t['X'] = 0x0058;\n t['Xcircle'] = 0x24CD;\n t['Xdieresis'] = 0x1E8C;\n t['Xdotaccent'] = 0x1E8A;\n t['Xeharmenian'] = 0x053D;\n t['Xi'] = 0x039E;\n t['Xmonospace'] = 0xFF38;\n t['Xsmall'] = 0xF778;\n t['Y'] = 0x0059;\n t['Yacute'] = 0x00DD;\n t['Yacutesmall'] = 0xF7FD;\n t['Yatcyrillic'] = 0x0462;\n t['Ycircle'] = 0x24CE;\n t['Ycircumflex'] = 0x0176;\n t['Ydieresis'] = 0x0178;\n t['Ydieresissmall'] = 0xF7FF;\n t['Ydotaccent'] = 0x1E8E;\n t['Ydotbelow'] = 0x1EF4;\n t['Yericyrillic'] = 0x042B;\n t['Yerudieresiscyrillic'] = 0x04F8;\n t['Ygrave'] = 0x1EF2;\n t['Yhook'] = 0x01B3;\n t['Yhookabove'] = 0x1EF6;\n t['Yiarmenian'] = 0x0545;\n t['Yicyrillic'] = 0x0407;\n t['Yiwnarmenian'] = 0x0552;\n t['Ymonospace'] = 0xFF39;\n t['Ysmall'] = 0xF779;\n t['Ytilde'] = 0x1EF8;\n t['Yusbigcyrillic'] = 0x046A;\n t['Yusbigiotifiedcyrillic'] = 0x046C;\n t['Yuslittlecyrillic'] = 0x0466;\n t['Yuslittleiotifiedcyrillic'] = 0x0468;\n t['Z'] = 0x005A;\n t['Zaarmenian'] = 0x0536;\n t['Zacute'] = 0x0179;\n t['Zcaron'] = 0x017D;\n t['Zcaronsmall'] = 0xF6FF;\n t['Zcircle'] = 0x24CF;\n t['Zcircumflex'] = 0x1E90;\n t['Zdot'] = 0x017B;\n t['Zdotaccent'] = 0x017B;\n t['Zdotbelow'] = 0x1E92;\n t['Zecyrillic'] = 0x0417;\n t['Zedescendercyrillic'] = 0x0498;\n t['Zedieresiscyrillic'] = 0x04DE;\n t['Zeta'] = 0x0396;\n t['Zhearmenian'] = 0x053A;\n t['Zhebrevecyrillic'] = 0x04C1;\n t['Zhecyrillic'] = 0x0416;\n t['Zhedescendercyrillic'] = 0x0496;\n t['Zhedieresiscyrillic'] = 0x04DC;\n t['Zlinebelow'] = 0x1E94;\n t['Zmonospace'] = 0xFF3A;\n t['Zsmall'] = 0xF77A;\n t['Zstroke'] = 0x01B5;\n t['a'] = 0x0061;\n t['aabengali'] = 0x0986;\n t['aacute'] = 0x00E1;\n t['aadeva'] = 0x0906;\n t['aagujarati'] = 0x0A86;\n t['aagurmukhi'] = 0x0A06;\n t['aamatragurmukhi'] = 0x0A3E;\n t['aarusquare'] = 0x3303;\n t['aavowelsignbengali'] = 0x09BE;\n t['aavowelsigndeva'] = 0x093E;\n t['aavowelsigngujarati'] = 0x0ABE;\n t['abbreviationmarkarmenian'] = 0x055F;\n t['abbreviationsigndeva'] = 0x0970;\n t['abengali'] = 0x0985;\n t['abopomofo'] = 0x311A;\n t['abreve'] = 0x0103;\n t['abreveacute'] = 0x1EAF;\n t['abrevecyrillic'] = 0x04D1;\n t['abrevedotbelow'] = 0x1EB7;\n t['abrevegrave'] = 0x1EB1;\n t['abrevehookabove'] = 0x1EB3;\n t['abrevetilde'] = 0x1EB5;\n t['acaron'] = 0x01CE;\n t['acircle'] = 0x24D0;\n t['acircumflex'] = 0x00E2;\n t['acircumflexacute'] = 0x1EA5;\n t['acircumflexdotbelow'] = 0x1EAD;\n t['acircumflexgrave'] = 0x1EA7;\n t['acircumflexhookabove'] = 0x1EA9;\n t['acircumflextilde'] = 0x1EAB;\n t['acute'] = 0x00B4;\n t['acutebelowcmb'] = 0x0317;\n t['acutecmb'] = 0x0301;\n t['acutecomb'] = 0x0301;\n t['acutedeva'] = 0x0954;\n t['acutelowmod'] = 0x02CF;\n t['acutetonecmb'] = 0x0341;\n t['acyrillic'] = 0x0430;\n t['adblgrave'] = 0x0201;\n t['addakgurmukhi'] = 0x0A71;\n t['adeva'] = 0x0905;\n t['adieresis'] = 0x00E4;\n t['adieresiscyrillic'] = 0x04D3;\n t['adieresismacron'] = 0x01DF;\n t['adotbelow'] = 0x1EA1;\n t['adotmacron'] = 0x01E1;\n t['ae'] = 0x00E6;\n t['aeacute'] = 0x01FD;\n t['aekorean'] = 0x3150;\n t['aemacron'] = 0x01E3;\n t['afii00208'] = 0x2015;\n t['afii08941'] = 0x20A4;\n t['afii10017'] = 0x0410;\n t['afii10018'] = 0x0411;\n t['afii10019'] = 0x0412;\n t['afii10020'] = 0x0413;\n t['afii10021'] = 0x0414;\n t['afii10022'] = 0x0415;\n t['afii10023'] = 0x0401;\n t['afii10024'] = 0x0416;\n t['afii10025'] = 0x0417;\n t['afii10026'] = 0x0418;\n t['afii10027'] = 0x0419;\n t['afii10028'] = 0x041A;\n t['afii10029'] = 0x041B;\n t['afii10030'] = 0x041C;\n t['afii10031'] = 0x041D;\n t['afii10032'] = 0x041E;\n t['afii10033'] = 0x041F;\n t['afii10034'] = 0x0420;\n t['afii10035'] = 0x0421;\n t['afii10036'] = 0x0422;\n t['afii10037'] = 0x0423;\n t['afii10038'] = 0x0424;\n t['afii10039'] = 0x0425;\n t['afii10040'] = 0x0426;\n t['afii10041'] = 0x0427;\n t['afii10042'] = 0x0428;\n t['afii10043'] = 0x0429;\n t['afii10044'] = 0x042A;\n t['afii10045'] = 0x042B;\n t['afii10046'] = 0x042C;\n t['afii10047'] = 0x042D;\n t['afii10048'] = 0x042E;\n t['afii10049'] = 0x042F;\n t['afii10050'] = 0x0490;\n t['afii10051'] = 0x0402;\n t['afii10052'] = 0x0403;\n t['afii10053'] = 0x0404;\n t['afii10054'] = 0x0405;\n t['afii10055'] = 0x0406;\n t['afii10056'] = 0x0407;\n t['afii10057'] = 0x0408;\n t['afii10058'] = 0x0409;\n t['afii10059'] = 0x040A;\n t['afii10060'] = 0x040B;\n t['afii10061'] = 0x040C;\n t['afii10062'] = 0x040E;\n t['afii10063'] = 0xF6C4;\n t['afii10064'] = 0xF6C5;\n t['afii10065'] = 0x0430;\n t['afii10066'] = 0x0431;\n t['afii10067'] = 0x0432;\n t['afii10068'] = 0x0433;\n t['afii10069'] = 0x0434;\n t['afii10070'] = 0x0435;\n t['afii10071'] = 0x0451;\n t['afii10072'] = 0x0436;\n t['afii10073'] = 0x0437;\n t['afii10074'] = 0x0438;\n t['afii10075'] = 0x0439;\n t['afii10076'] = 0x043A;\n t['afii10077'] = 0x043B;\n t['afii10078'] = 0x043C;\n t['afii10079'] = 0x043D;\n t['afii10080'] = 0x043E;\n t['afii10081'] = 0x043F;\n t['afii10082'] = 0x0440;\n t['afii10083'] = 0x0441;\n t['afii10084'] = 0x0442;\n t['afii10085'] = 0x0443;\n t['afii10086'] = 0x0444;\n t['afii10087'] = 0x0445;\n t['afii10088'] = 0x0446;\n t['afii10089'] = 0x0447;\n t['afii10090'] = 0x0448;\n t['afii10091'] = 0x0449;\n t['afii10092'] = 0x044A;\n t['afii10093'] = 0x044B;\n t['afii10094'] = 0x044C;\n t['afii10095'] = 0x044D;\n t['afii10096'] = 0x044E;\n t['afii10097'] = 0x044F;\n t['afii10098'] = 0x0491;\n t['afii10099'] = 0x0452;\n t['afii10100'] = 0x0453;\n t['afii10101'] = 0x0454;\n t['afii10102'] = 0x0455;\n t['afii10103'] = 0x0456;\n t['afii10104'] = 0x0457;\n t['afii10105'] = 0x0458;\n t['afii10106'] = 0x0459;\n t['afii10107'] = 0x045A;\n t['afii10108'] = 0x045B;\n t['afii10109'] = 0x045C;\n t['afii10110'] = 0x045E;\n t['afii10145'] = 0x040F;\n t['afii10146'] = 0x0462;\n t['afii10147'] = 0x0472;\n t['afii10148'] = 0x0474;\n t['afii10192'] = 0xF6C6;\n t['afii10193'] = 0x045F;\n t['afii10194'] = 0x0463;\n t['afii10195'] = 0x0473;\n t['afii10196'] = 0x0475;\n t['afii10831'] = 0xF6C7;\n t['afii10832'] = 0xF6C8;\n t['afii10846'] = 0x04D9;\n t['afii299'] = 0x200E;\n t['afii300'] = 0x200F;\n t['afii301'] = 0x200D;\n t['afii57381'] = 0x066A;\n t['afii57388'] = 0x060C;\n t['afii57392'] = 0x0660;\n t['afii57393'] = 0x0661;\n t['afii57394'] = 0x0662;\n t['afii57395'] = 0x0663;\n t['afii57396'] = 0x0664;\n t['afii57397'] = 0x0665;\n t['afii57398'] = 0x0666;\n t['afii57399'] = 0x0667;\n t['afii57400'] = 0x0668;\n t['afii57401'] = 0x0669;\n t['afii57403'] = 0x061B;\n t['afii57407'] = 0x061F;\n t['afii57409'] = 0x0621;\n t['afii57410'] = 0x0622;\n t['afii57411'] = 0x0623;\n t['afii57412'] = 0x0624;\n t['afii57413'] = 0x0625;\n t['afii57414'] = 0x0626;\n t['afii57415'] = 0x0627;\n t['afii57416'] = 0x0628;\n t['afii57417'] = 0x0629;\n t['afii57418'] = 0x062A;\n t['afii57419'] = 0x062B;\n t['afii57420'] = 0x062C;\n t['afii57421'] = 0x062D;\n t['afii57422'] = 0x062E;\n t['afii57423'] = 0x062F;\n t['afii57424'] = 0x0630;\n t['afii57425'] = 0x0631;\n t['afii57426'] = 0x0632;\n t['afii57427'] = 0x0633;\n t['afii57428'] = 0x0634;\n t['afii57429'] = 0x0635;\n t['afii57430'] = 0x0636;\n t['afii57431'] = 0x0637;\n t['afii57432'] = 0x0638;\n t['afii57433'] = 0x0639;\n t['afii57434'] = 0x063A;\n t['afii57440'] = 0x0640;\n t['afii57441'] = 0x0641;\n t['afii57442'] = 0x0642;\n t['afii57443'] = 0x0643;\n t['afii57444'] = 0x0644;\n t['afii57445'] = 0x0645;\n t['afii57446'] = 0x0646;\n t['afii57448'] = 0x0648;\n t['afii57449'] = 0x0649;\n t['afii57450'] = 0x064A;\n t['afii57451'] = 0x064B;\n t['afii57452'] = 0x064C;\n t['afii57453'] = 0x064D;\n t['afii57454'] = 0x064E;\n t['afii57455'] = 0x064F;\n t['afii57456'] = 0x0650;\n t['afii57457'] = 0x0651;\n t['afii57458'] = 0x0652;\n t['afii57470'] = 0x0647;\n t['afii57505'] = 0x06A4;\n t['afii57506'] = 0x067E;\n t['afii57507'] = 0x0686;\n t['afii57508'] = 0x0698;\n t['afii57509'] = 0x06AF;\n t['afii57511'] = 0x0679;\n t['afii57512'] = 0x0688;\n t['afii57513'] = 0x0691;\n t['afii57514'] = 0x06BA;\n t['afii57519'] = 0x06D2;\n t['afii57534'] = 0x06D5;\n t['afii57636'] = 0x20AA;\n t['afii57645'] = 0x05BE;\n t['afii57658'] = 0x05C3;\n t['afii57664'] = 0x05D0;\n t['afii57665'] = 0x05D1;\n t['afii57666'] = 0x05D2;\n t['afii57667'] = 0x05D3;\n t['afii57668'] = 0x05D4;\n t['afii57669'] = 0x05D5;\n t['afii57670'] = 0x05D6;\n t['afii57671'] = 0x05D7;\n t['afii57672'] = 0x05D8;\n t['afii57673'] = 0x05D9;\n t['afii57674'] = 0x05DA;\n t['afii57675'] = 0x05DB;\n t['afii57676'] = 0x05DC;\n t['afii57677'] = 0x05DD;\n t['afii57678'] = 0x05DE;\n t['afii57679'] = 0x05DF;\n t['afii57680'] = 0x05E0;\n t['afii57681'] = 0x05E1;\n t['afii57682'] = 0x05E2;\n t['afii57683'] = 0x05E3;\n t['afii57684'] = 0x05E4;\n t['afii57685'] = 0x05E5;\n t['afii57686'] = 0x05E6;\n t['afii57687'] = 0x05E7;\n t['afii57688'] = 0x05E8;\n t['afii57689'] = 0x05E9;\n t['afii57690'] = 0x05EA;\n t['afii57694'] = 0xFB2A;\n t['afii57695'] = 0xFB2B;\n t['afii57700'] = 0xFB4B;\n t['afii57705'] = 0xFB1F;\n t['afii57716'] = 0x05F0;\n t['afii57717'] = 0x05F1;\n t['afii57718'] = 0x05F2;\n t['afii57723'] = 0xFB35;\n t['afii57793'] = 0x05B4;\n t['afii57794'] = 0x05B5;\n t['afii57795'] = 0x05B6;\n t['afii57796'] = 0x05BB;\n t['afii57797'] = 0x05B8;\n t['afii57798'] = 0x05B7;\n t['afii57799'] = 0x05B0;\n t['afii57800'] = 0x05B2;\n t['afii57801'] = 0x05B1;\n t['afii57802'] = 0x05B3;\n t['afii57803'] = 0x05C2;\n t['afii57804'] = 0x05C1;\n t['afii57806'] = 0x05B9;\n t['afii57807'] = 0x05BC;\n t['afii57839'] = 0x05BD;\n t['afii57841'] = 0x05BF;\n t['afii57842'] = 0x05C0;\n t['afii57929'] = 0x02BC;\n t['afii61248'] = 0x2105;\n t['afii61289'] = 0x2113;\n t['afii61352'] = 0x2116;\n t['afii61573'] = 0x202C;\n t['afii61574'] = 0x202D;\n t['afii61575'] = 0x202E;\n t['afii61664'] = 0x200C;\n t['afii63167'] = 0x066D;\n t['afii64937'] = 0x02BD;\n t['agrave'] = 0x00E0;\n t['agujarati'] = 0x0A85;\n t['agurmukhi'] = 0x0A05;\n t['ahiragana'] = 0x3042;\n t['ahookabove'] = 0x1EA3;\n t['aibengali'] = 0x0990;\n t['aibopomofo'] = 0x311E;\n t['aideva'] = 0x0910;\n t['aiecyrillic'] = 0x04D5;\n t['aigujarati'] = 0x0A90;\n t['aigurmukhi'] = 0x0A10;\n t['aimatragurmukhi'] = 0x0A48;\n t['ainarabic'] = 0x0639;\n t['ainfinalarabic'] = 0xFECA;\n t['aininitialarabic'] = 0xFECB;\n t['ainmedialarabic'] = 0xFECC;\n t['ainvertedbreve'] = 0x0203;\n t['aivowelsignbengali'] = 0x09C8;\n t['aivowelsigndeva'] = 0x0948;\n t['aivowelsigngujarati'] = 0x0AC8;\n t['akatakana'] = 0x30A2;\n t['akatakanahalfwidth'] = 0xFF71;\n t['akorean'] = 0x314F;\n t['alef'] = 0x05D0;\n t['alefarabic'] = 0x0627;\n t['alefdageshhebrew'] = 0xFB30;\n t['aleffinalarabic'] = 0xFE8E;\n t['alefhamzaabovearabic'] = 0x0623;\n t['alefhamzaabovefinalarabic'] = 0xFE84;\n t['alefhamzabelowarabic'] = 0x0625;\n t['alefhamzabelowfinalarabic'] = 0xFE88;\n t['alefhebrew'] = 0x05D0;\n t['aleflamedhebrew'] = 0xFB4F;\n t['alefmaddaabovearabic'] = 0x0622;\n t['alefmaddaabovefinalarabic'] = 0xFE82;\n t['alefmaksuraarabic'] = 0x0649;\n t['alefmaksurafinalarabic'] = 0xFEF0;\n t['alefmaksurainitialarabic'] = 0xFEF3;\n t['alefmaksuramedialarabic'] = 0xFEF4;\n t['alefpatahhebrew'] = 0xFB2E;\n t['alefqamatshebrew'] = 0xFB2F;\n t['aleph'] = 0x2135;\n t['allequal'] = 0x224C;\n t['alpha'] = 0x03B1;\n t['alphatonos'] = 0x03AC;\n t['amacron'] = 0x0101;\n t['amonospace'] = 0xFF41;\n t['ampersand'] = 0x0026;\n t['ampersandmonospace'] = 0xFF06;\n t['ampersandsmall'] = 0xF726;\n t['amsquare'] = 0x33C2;\n t['anbopomofo'] = 0x3122;\n t['angbopomofo'] = 0x3124;\n t['angbracketleft'] = 0x3008;\n t['angbracketright'] = 0x3009;\n t['angkhankhuthai'] = 0x0E5A;\n t['angle'] = 0x2220;\n t['anglebracketleft'] = 0x3008;\n t['anglebracketleftvertical'] = 0xFE3F;\n t['anglebracketright'] = 0x3009;\n t['anglebracketrightvertical'] = 0xFE40;\n t['angleleft'] = 0x2329;\n t['angleright'] = 0x232A;\n t['angstrom'] = 0x212B;\n t['anoteleia'] = 0x0387;\n t['anudattadeva'] = 0x0952;\n t['anusvarabengali'] = 0x0982;\n t['anusvaradeva'] = 0x0902;\n t['anusvaragujarati'] = 0x0A82;\n t['aogonek'] = 0x0105;\n t['apaatosquare'] = 0x3300;\n t['aparen'] = 0x249C;\n t['apostrophearmenian'] = 0x055A;\n t['apostrophemod'] = 0x02BC;\n t['apple'] = 0xF8FF;\n t['approaches'] = 0x2250;\n t['approxequal'] = 0x2248;\n t['approxequalorimage'] = 0x2252;\n t['approximatelyequal'] = 0x2245;\n t['araeaekorean'] = 0x318E;\n t['araeakorean'] = 0x318D;\n t['arc'] = 0x2312;\n t['arighthalfring'] = 0x1E9A;\n t['aring'] = 0x00E5;\n t['aringacute'] = 0x01FB;\n t['aringbelow'] = 0x1E01;\n t['arrowboth'] = 0x2194;\n t['arrowdashdown'] = 0x21E3;\n t['arrowdashleft'] = 0x21E0;\n t['arrowdashright'] = 0x21E2;\n t['arrowdashup'] = 0x21E1;\n t['arrowdblboth'] = 0x21D4;\n t['arrowdbldown'] = 0x21D3;\n t['arrowdblleft'] = 0x21D0;\n t['arrowdblright'] = 0x21D2;\n t['arrowdblup'] = 0x21D1;\n t['arrowdown'] = 0x2193;\n t['arrowdownleft'] = 0x2199;\n t['arrowdownright'] = 0x2198;\n t['arrowdownwhite'] = 0x21E9;\n t['arrowheaddownmod'] = 0x02C5;\n t['arrowheadleftmod'] = 0x02C2;\n t['arrowheadrightmod'] = 0x02C3;\n t['arrowheadupmod'] = 0x02C4;\n t['arrowhorizex'] = 0xF8E7;\n t['arrowleft'] = 0x2190;\n t['arrowleftdbl'] = 0x21D0;\n t['arrowleftdblstroke'] = 0x21CD;\n t['arrowleftoverright'] = 0x21C6;\n t['arrowleftwhite'] = 0x21E6;\n t['arrowright'] = 0x2192;\n t['arrowrightdblstroke'] = 0x21CF;\n t['arrowrightheavy'] = 0x279E;\n t['arrowrightoverleft'] = 0x21C4;\n t['arrowrightwhite'] = 0x21E8;\n t['arrowtableft'] = 0x21E4;\n t['arrowtabright'] = 0x21E5;\n t['arrowup'] = 0x2191;\n t['arrowupdn'] = 0x2195;\n t['arrowupdnbse'] = 0x21A8;\n t['arrowupdownbase'] = 0x21A8;\n t['arrowupleft'] = 0x2196;\n t['arrowupleftofdown'] = 0x21C5;\n t['arrowupright'] = 0x2197;\n t['arrowupwhite'] = 0x21E7;\n t['arrowvertex'] = 0xF8E6;\n t['asciicircum'] = 0x005E;\n t['asciicircummonospace'] = 0xFF3E;\n t['asciitilde'] = 0x007E;\n t['asciitildemonospace'] = 0xFF5E;\n t['ascript'] = 0x0251;\n t['ascriptturned'] = 0x0252;\n t['asmallhiragana'] = 0x3041;\n t['asmallkatakana'] = 0x30A1;\n t['asmallkatakanahalfwidth'] = 0xFF67;\n t['asterisk'] = 0x002A;\n t['asteriskaltonearabic'] = 0x066D;\n t['asteriskarabic'] = 0x066D;\n t['asteriskmath'] = 0x2217;\n t['asteriskmonospace'] = 0xFF0A;\n t['asterisksmall'] = 0xFE61;\n t['asterism'] = 0x2042;\n t['asuperior'] = 0xF6E9;\n t['asymptoticallyequal'] = 0x2243;\n t['at'] = 0x0040;\n t['atilde'] = 0x00E3;\n t['atmonospace'] = 0xFF20;\n t['atsmall'] = 0xFE6B;\n t['aturned'] = 0x0250;\n t['aubengali'] = 0x0994;\n t['aubopomofo'] = 0x3120;\n t['audeva'] = 0x0914;\n t['augujarati'] = 0x0A94;\n t['augurmukhi'] = 0x0A14;\n t['aulengthmarkbengali'] = 0x09D7;\n t['aumatragurmukhi'] = 0x0A4C;\n t['auvowelsignbengali'] = 0x09CC;\n t['auvowelsigndeva'] = 0x094C;\n t['auvowelsigngujarati'] = 0x0ACC;\n t['avagrahadeva'] = 0x093D;\n t['aybarmenian'] = 0x0561;\n t['ayin'] = 0x05E2;\n t['ayinaltonehebrew'] = 0xFB20;\n t['ayinhebrew'] = 0x05E2;\n t['b'] = 0x0062;\n t['babengali'] = 0x09AC;\n t['backslash'] = 0x005C;\n t['backslashmonospace'] = 0xFF3C;\n t['badeva'] = 0x092C;\n t['bagujarati'] = 0x0AAC;\n t['bagurmukhi'] = 0x0A2C;\n t['bahiragana'] = 0x3070;\n t['bahtthai'] = 0x0E3F;\n t['bakatakana'] = 0x30D0;\n t['bar'] = 0x007C;\n t['barmonospace'] = 0xFF5C;\n t['bbopomofo'] = 0x3105;\n t['bcircle'] = 0x24D1;\n t['bdotaccent'] = 0x1E03;\n t['bdotbelow'] = 0x1E05;\n t['beamedsixteenthnotes'] = 0x266C;\n t['because'] = 0x2235;\n t['becyrillic'] = 0x0431;\n t['beharabic'] = 0x0628;\n t['behfinalarabic'] = 0xFE90;\n t['behinitialarabic'] = 0xFE91;\n t['behiragana'] = 0x3079;\n t['behmedialarabic'] = 0xFE92;\n t['behmeeminitialarabic'] = 0xFC9F;\n t['behmeemisolatedarabic'] = 0xFC08;\n t['behnoonfinalarabic'] = 0xFC6D;\n t['bekatakana'] = 0x30D9;\n t['benarmenian'] = 0x0562;\n t['bet'] = 0x05D1;\n t['beta'] = 0x03B2;\n t['betasymbolgreek'] = 0x03D0;\n t['betdagesh'] = 0xFB31;\n t['betdageshhebrew'] = 0xFB31;\n t['bethebrew'] = 0x05D1;\n t['betrafehebrew'] = 0xFB4C;\n t['bhabengali'] = 0x09AD;\n t['bhadeva'] = 0x092D;\n t['bhagujarati'] = 0x0AAD;\n t['bhagurmukhi'] = 0x0A2D;\n t['bhook'] = 0x0253;\n t['bihiragana'] = 0x3073;\n t['bikatakana'] = 0x30D3;\n t['bilabialclick'] = 0x0298;\n t['bindigurmukhi'] = 0x0A02;\n t['birusquare'] = 0x3331;\n t['blackcircle'] = 0x25CF;\n t['blackdiamond'] = 0x25C6;\n t['blackdownpointingtriangle'] = 0x25BC;\n t['blackleftpointingpointer'] = 0x25C4;\n t['blackleftpointingtriangle'] = 0x25C0;\n t['blacklenticularbracketleft'] = 0x3010;\n t['blacklenticularbracketleftvertical'] = 0xFE3B;\n t['blacklenticularbracketright'] = 0x3011;\n t['blacklenticularbracketrightvertical'] = 0xFE3C;\n t['blacklowerlefttriangle'] = 0x25E3;\n t['blacklowerrighttriangle'] = 0x25E2;\n t['blackrectangle'] = 0x25AC;\n t['blackrightpointingpointer'] = 0x25BA;\n t['blackrightpointingtriangle'] = 0x25B6;\n t['blacksmallsquare'] = 0x25AA;\n t['blacksmilingface'] = 0x263B;\n t['blacksquare'] = 0x25A0;\n t['blackstar'] = 0x2605;\n t['blackupperlefttriangle'] = 0x25E4;\n t['blackupperrighttriangle'] = 0x25E5;\n t['blackuppointingsmalltriangle'] = 0x25B4;\n t['blackuppointingtriangle'] = 0x25B2;\n t['blank'] = 0x2423;\n t['blinebelow'] = 0x1E07;\n t['block'] = 0x2588;\n t['bmonospace'] = 0xFF42;\n t['bobaimaithai'] = 0x0E1A;\n t['bohiragana'] = 0x307C;\n t['bokatakana'] = 0x30DC;\n t['bparen'] = 0x249D;\n t['bqsquare'] = 0x33C3;\n t['braceex'] = 0xF8F4;\n t['braceleft'] = 0x007B;\n t['braceleftbt'] = 0xF8F3;\n t['braceleftmid'] = 0xF8F2;\n t['braceleftmonospace'] = 0xFF5B;\n t['braceleftsmall'] = 0xFE5B;\n t['bracelefttp'] = 0xF8F1;\n t['braceleftvertical'] = 0xFE37;\n t['braceright'] = 0x007D;\n t['bracerightbt'] = 0xF8FE;\n t['bracerightmid'] = 0xF8FD;\n t['bracerightmonospace'] = 0xFF5D;\n t['bracerightsmall'] = 0xFE5C;\n t['bracerighttp'] = 0xF8FC;\n t['bracerightvertical'] = 0xFE38;\n t['bracketleft'] = 0x005B;\n t['bracketleftbt'] = 0xF8F0;\n t['bracketleftex'] = 0xF8EF;\n t['bracketleftmonospace'] = 0xFF3B;\n t['bracketlefttp'] = 0xF8EE;\n t['bracketright'] = 0x005D;\n t['bracketrightbt'] = 0xF8FB;\n t['bracketrightex'] = 0xF8FA;\n t['bracketrightmonospace'] = 0xFF3D;\n t['bracketrighttp'] = 0xF8F9;\n t['breve'] = 0x02D8;\n t['brevebelowcmb'] = 0x032E;\n t['brevecmb'] = 0x0306;\n t['breveinvertedbelowcmb'] = 0x032F;\n t['breveinvertedcmb'] = 0x0311;\n t['breveinverteddoublecmb'] = 0x0361;\n t['bridgebelowcmb'] = 0x032A;\n t['bridgeinvertedbelowcmb'] = 0x033A;\n t['brokenbar'] = 0x00A6;\n t['bstroke'] = 0x0180;\n t['bsuperior'] = 0xF6EA;\n t['btopbar'] = 0x0183;\n t['buhiragana'] = 0x3076;\n t['bukatakana'] = 0x30D6;\n t['bullet'] = 0x2022;\n t['bulletinverse'] = 0x25D8;\n t['bulletoperator'] = 0x2219;\n t['bullseye'] = 0x25CE;\n t['c'] = 0x0063;\n t['caarmenian'] = 0x056E;\n t['cabengali'] = 0x099A;\n t['cacute'] = 0x0107;\n t['cadeva'] = 0x091A;\n t['cagujarati'] = 0x0A9A;\n t['cagurmukhi'] = 0x0A1A;\n t['calsquare'] = 0x3388;\n t['candrabindubengali'] = 0x0981;\n t['candrabinducmb'] = 0x0310;\n t['candrabindudeva'] = 0x0901;\n t['candrabindugujarati'] = 0x0A81;\n t['capslock'] = 0x21EA;\n t['careof'] = 0x2105;\n t['caron'] = 0x02C7;\n t['caronbelowcmb'] = 0x032C;\n t['caroncmb'] = 0x030C;\n t['carriagereturn'] = 0x21B5;\n t['cbopomofo'] = 0x3118;\n t['ccaron'] = 0x010D;\n t['ccedilla'] = 0x00E7;\n t['ccedillaacute'] = 0x1E09;\n t['ccircle'] = 0x24D2;\n t['ccircumflex'] = 0x0109;\n t['ccurl'] = 0x0255;\n t['cdot'] = 0x010B;\n t['cdotaccent'] = 0x010B;\n t['cdsquare'] = 0x33C5;\n t['cedilla'] = 0x00B8;\n t['cedillacmb'] = 0x0327;\n t['cent'] = 0x00A2;\n t['centigrade'] = 0x2103;\n t['centinferior'] = 0xF6DF;\n t['centmonospace'] = 0xFFE0;\n t['centoldstyle'] = 0xF7A2;\n t['centsuperior'] = 0xF6E0;\n t['chaarmenian'] = 0x0579;\n t['chabengali'] = 0x099B;\n t['chadeva'] = 0x091B;\n t['chagujarati'] = 0x0A9B;\n t['chagurmukhi'] = 0x0A1B;\n t['chbopomofo'] = 0x3114;\n t['cheabkhasiancyrillic'] = 0x04BD;\n t['checkmark'] = 0x2713;\n t['checyrillic'] = 0x0447;\n t['chedescenderabkhasiancyrillic'] = 0x04BF;\n t['chedescendercyrillic'] = 0x04B7;\n t['chedieresiscyrillic'] = 0x04F5;\n t['cheharmenian'] = 0x0573;\n t['chekhakassiancyrillic'] = 0x04CC;\n t['cheverticalstrokecyrillic'] = 0x04B9;\n t['chi'] = 0x03C7;\n t['chieuchacirclekorean'] = 0x3277;\n t['chieuchaparenkorean'] = 0x3217;\n t['chieuchcirclekorean'] = 0x3269;\n t['chieuchkorean'] = 0x314A;\n t['chieuchparenkorean'] = 0x3209;\n t['chochangthai'] = 0x0E0A;\n t['chochanthai'] = 0x0E08;\n t['chochingthai'] = 0x0E09;\n t['chochoethai'] = 0x0E0C;\n t['chook'] = 0x0188;\n t['cieucacirclekorean'] = 0x3276;\n t['cieucaparenkorean'] = 0x3216;\n t['cieuccirclekorean'] = 0x3268;\n t['cieuckorean'] = 0x3148;\n t['cieucparenkorean'] = 0x3208;\n t['cieucuparenkorean'] = 0x321C;\n t['circle'] = 0x25CB;\n t['circlecopyrt'] = 0x00A9;\n t['circlemultiply'] = 0x2297;\n t['circleot'] = 0x2299;\n t['circleplus'] = 0x2295;\n t['circlepostalmark'] = 0x3036;\n t['circlewithlefthalfblack'] = 0x25D0;\n t['circlewithrighthalfblack'] = 0x25D1;\n t['circumflex'] = 0x02C6;\n t['circumflexbelowcmb'] = 0x032D;\n t['circumflexcmb'] = 0x0302;\n t['clear'] = 0x2327;\n t['clickalveolar'] = 0x01C2;\n t['clickdental'] = 0x01C0;\n t['clicklateral'] = 0x01C1;\n t['clickretroflex'] = 0x01C3;\n t['club'] = 0x2663;\n t['clubsuitblack'] = 0x2663;\n t['clubsuitwhite'] = 0x2667;\n t['cmcubedsquare'] = 0x33A4;\n t['cmonospace'] = 0xFF43;\n t['cmsquaredsquare'] = 0x33A0;\n t['coarmenian'] = 0x0581;\n t['colon'] = 0x003A;\n t['colonmonetary'] = 0x20A1;\n t['colonmonospace'] = 0xFF1A;\n t['colonsign'] = 0x20A1;\n t['colonsmall'] = 0xFE55;\n t['colontriangularhalfmod'] = 0x02D1;\n t['colontriangularmod'] = 0x02D0;\n t['comma'] = 0x002C;\n t['commaabovecmb'] = 0x0313;\n t['commaaboverightcmb'] = 0x0315;\n t['commaaccent'] = 0xF6C3;\n t['commaarabic'] = 0x060C;\n t['commaarmenian'] = 0x055D;\n t['commainferior'] = 0xF6E1;\n t['commamonospace'] = 0xFF0C;\n t['commareversedabovecmb'] = 0x0314;\n t['commareversedmod'] = 0x02BD;\n t['commasmall'] = 0xFE50;\n t['commasuperior'] = 0xF6E2;\n t['commaturnedabovecmb'] = 0x0312;\n t['commaturnedmod'] = 0x02BB;\n t['compass'] = 0x263C;\n t['congruent'] = 0x2245;\n t['contourintegral'] = 0x222E;\n t['control'] = 0x2303;\n t['controlACK'] = 0x0006;\n t['controlBEL'] = 0x0007;\n t['controlBS'] = 0x0008;\n t['controlCAN'] = 0x0018;\n t['controlCR'] = 0x000D;\n t['controlDC1'] = 0x0011;\n t['controlDC2'] = 0x0012;\n t['controlDC3'] = 0x0013;\n t['controlDC4'] = 0x0014;\n t['controlDEL'] = 0x007F;\n t['controlDLE'] = 0x0010;\n t['controlEM'] = 0x0019;\n t['controlENQ'] = 0x0005;\n t['controlEOT'] = 0x0004;\n t['controlESC'] = 0x001B;\n t['controlETB'] = 0x0017;\n t['controlETX'] = 0x0003;\n t['controlFF'] = 0x000C;\n t['controlFS'] = 0x001C;\n t['controlGS'] = 0x001D;\n t['controlHT'] = 0x0009;\n t['controlLF'] = 0x000A;\n t['controlNAK'] = 0x0015;\n t['controlNULL'] = 0x0000;\n t['controlRS'] = 0x001E;\n t['controlSI'] = 0x000F;\n t['controlSO'] = 0x000E;\n t['controlSOT'] = 0x0002;\n t['controlSTX'] = 0x0001;\n t['controlSUB'] = 0x001A;\n t['controlSYN'] = 0x0016;\n t['controlUS'] = 0x001F;\n t['controlVT'] = 0x000B;\n t['copyright'] = 0x00A9;\n t['copyrightsans'] = 0xF8E9;\n t['copyrightserif'] = 0xF6D9;\n t['cornerbracketleft'] = 0x300C;\n t['cornerbracketlefthalfwidth'] = 0xFF62;\n t['cornerbracketleftvertical'] = 0xFE41;\n t['cornerbracketright'] = 0x300D;\n t['cornerbracketrighthalfwidth'] = 0xFF63;\n t['cornerbracketrightvertical'] = 0xFE42;\n t['corporationsquare'] = 0x337F;\n t['cosquare'] = 0x33C7;\n t['coverkgsquare'] = 0x33C6;\n t['cparen'] = 0x249E;\n t['cruzeiro'] = 0x20A2;\n t['cstretched'] = 0x0297;\n t['curlyand'] = 0x22CF;\n t['curlyor'] = 0x22CE;\n t['currency'] = 0x00A4;\n t['cyrBreve'] = 0xF6D1;\n t['cyrFlex'] = 0xF6D2;\n t['cyrbreve'] = 0xF6D4;\n t['cyrflex'] = 0xF6D5;\n t['d'] = 0x0064;\n t['daarmenian'] = 0x0564;\n t['dabengali'] = 0x09A6;\n t['dadarabic'] = 0x0636;\n t['dadeva'] = 0x0926;\n t['dadfinalarabic'] = 0xFEBE;\n t['dadinitialarabic'] = 0xFEBF;\n t['dadmedialarabic'] = 0xFEC0;\n t['dagesh'] = 0x05BC;\n t['dageshhebrew'] = 0x05BC;\n t['dagger'] = 0x2020;\n t['daggerdbl'] = 0x2021;\n t['dagujarati'] = 0x0AA6;\n t['dagurmukhi'] = 0x0A26;\n t['dahiragana'] = 0x3060;\n t['dakatakana'] = 0x30C0;\n t['dalarabic'] = 0x062F;\n t['dalet'] = 0x05D3;\n t['daletdagesh'] = 0xFB33;\n t['daletdageshhebrew'] = 0xFB33;\n t['dalethebrew'] = 0x05D3;\n t['dalfinalarabic'] = 0xFEAA;\n t['dammaarabic'] = 0x064F;\n t['dammalowarabic'] = 0x064F;\n t['dammatanaltonearabic'] = 0x064C;\n t['dammatanarabic'] = 0x064C;\n t['danda'] = 0x0964;\n t['dargahebrew'] = 0x05A7;\n t['dargalefthebrew'] = 0x05A7;\n t['dasiapneumatacyrilliccmb'] = 0x0485;\n t['dblGrave'] = 0xF6D3;\n t['dblanglebracketleft'] = 0x300A;\n t['dblanglebracketleftvertical'] = 0xFE3D;\n t['dblanglebracketright'] = 0x300B;\n t['dblanglebracketrightvertical'] = 0xFE3E;\n t['dblarchinvertedbelowcmb'] = 0x032B;\n t['dblarrowleft'] = 0x21D4;\n t['dblarrowright'] = 0x21D2;\n t['dbldanda'] = 0x0965;\n t['dblgrave'] = 0xF6D6;\n t['dblgravecmb'] = 0x030F;\n t['dblintegral'] = 0x222C;\n t['dbllowline'] = 0x2017;\n t['dbllowlinecmb'] = 0x0333;\n t['dbloverlinecmb'] = 0x033F;\n t['dblprimemod'] = 0x02BA;\n t['dblverticalbar'] = 0x2016;\n t['dblverticallineabovecmb'] = 0x030E;\n t['dbopomofo'] = 0x3109;\n t['dbsquare'] = 0x33C8;\n t['dcaron'] = 0x010F;\n t['dcedilla'] = 0x1E11;\n t['dcircle'] = 0x24D3;\n t['dcircumflexbelow'] = 0x1E13;\n t['dcroat'] = 0x0111;\n t['ddabengali'] = 0x09A1;\n t['ddadeva'] = 0x0921;\n t['ddagujarati'] = 0x0AA1;\n t['ddagurmukhi'] = 0x0A21;\n t['ddalarabic'] = 0x0688;\n t['ddalfinalarabic'] = 0xFB89;\n t['dddhadeva'] = 0x095C;\n t['ddhabengali'] = 0x09A2;\n t['ddhadeva'] = 0x0922;\n t['ddhagujarati'] = 0x0AA2;\n t['ddhagurmukhi'] = 0x0A22;\n t['ddotaccent'] = 0x1E0B;\n t['ddotbelow'] = 0x1E0D;\n t['decimalseparatorarabic'] = 0x066B;\n t['decimalseparatorpersian'] = 0x066B;\n t['decyrillic'] = 0x0434;\n t['degree'] = 0x00B0;\n t['dehihebrew'] = 0x05AD;\n t['dehiragana'] = 0x3067;\n t['deicoptic'] = 0x03EF;\n t['dekatakana'] = 0x30C7;\n t['deleteleft'] = 0x232B;\n t['deleteright'] = 0x2326;\n t['delta'] = 0x03B4;\n t['deltaturned'] = 0x018D;\n t['denominatorminusonenumeratorbengali'] = 0x09F8;\n t['dezh'] = 0x02A4;\n t['dhabengali'] = 0x09A7;\n t['dhadeva'] = 0x0927;\n t['dhagujarati'] = 0x0AA7;\n t['dhagurmukhi'] = 0x0A27;\n t['dhook'] = 0x0257;\n t['dialytikatonos'] = 0x0385;\n t['dialytikatonoscmb'] = 0x0344;\n t['diamond'] = 0x2666;\n t['diamondsuitwhite'] = 0x2662;\n t['dieresis'] = 0x00A8;\n t['dieresisacute'] = 0xF6D7;\n t['dieresisbelowcmb'] = 0x0324;\n t['dieresiscmb'] = 0x0308;\n t['dieresisgrave'] = 0xF6D8;\n t['dieresistonos'] = 0x0385;\n t['dihiragana'] = 0x3062;\n t['dikatakana'] = 0x30C2;\n t['dittomark'] = 0x3003;\n t['divide'] = 0x00F7;\n t['divides'] = 0x2223;\n t['divisionslash'] = 0x2215;\n t['djecyrillic'] = 0x0452;\n t['dkshade'] = 0x2593;\n t['dlinebelow'] = 0x1E0F;\n t['dlsquare'] = 0x3397;\n t['dmacron'] = 0x0111;\n t['dmonospace'] = 0xFF44;\n t['dnblock'] = 0x2584;\n t['dochadathai'] = 0x0E0E;\n t['dodekthai'] = 0x0E14;\n t['dohiragana'] = 0x3069;\n t['dokatakana'] = 0x30C9;\n t['dollar'] = 0x0024;\n t['dollarinferior'] = 0xF6E3;\n t['dollarmonospace'] = 0xFF04;\n t['dollaroldstyle'] = 0xF724;\n t['dollarsmall'] = 0xFE69;\n t['dollarsuperior'] = 0xF6E4;\n t['dong'] = 0x20AB;\n t['dorusquare'] = 0x3326;\n t['dotaccent'] = 0x02D9;\n t['dotaccentcmb'] = 0x0307;\n t['dotbelowcmb'] = 0x0323;\n t['dotbelowcomb'] = 0x0323;\n t['dotkatakana'] = 0x30FB;\n t['dotlessi'] = 0x0131;\n t['dotlessj'] = 0xF6BE;\n t['dotlessjstrokehook'] = 0x0284;\n t['dotmath'] = 0x22C5;\n t['dottedcircle'] = 0x25CC;\n t['doubleyodpatah'] = 0xFB1F;\n t['doubleyodpatahhebrew'] = 0xFB1F;\n t['downtackbelowcmb'] = 0x031E;\n t['downtackmod'] = 0x02D5;\n t['dparen'] = 0x249F;\n t['dsuperior'] = 0xF6EB;\n t['dtail'] = 0x0256;\n t['dtopbar'] = 0x018C;\n t['duhiragana'] = 0x3065;\n t['dukatakana'] = 0x30C5;\n t['dz'] = 0x01F3;\n t['dzaltone'] = 0x02A3;\n t['dzcaron'] = 0x01C6;\n t['dzcurl'] = 0x02A5;\n t['dzeabkhasiancyrillic'] = 0x04E1;\n t['dzecyrillic'] = 0x0455;\n t['dzhecyrillic'] = 0x045F;\n t['e'] = 0x0065;\n t['eacute'] = 0x00E9;\n t['earth'] = 0x2641;\n t['ebengali'] = 0x098F;\n t['ebopomofo'] = 0x311C;\n t['ebreve'] = 0x0115;\n t['ecandradeva'] = 0x090D;\n t['ecandragujarati'] = 0x0A8D;\n t['ecandravowelsigndeva'] = 0x0945;\n t['ecandravowelsigngujarati'] = 0x0AC5;\n t['ecaron'] = 0x011B;\n t['ecedillabreve'] = 0x1E1D;\n t['echarmenian'] = 0x0565;\n t['echyiwnarmenian'] = 0x0587;\n t['ecircle'] = 0x24D4;\n t['ecircumflex'] = 0x00EA;\n t['ecircumflexacute'] = 0x1EBF;\n t['ecircumflexbelow'] = 0x1E19;\n t['ecircumflexdotbelow'] = 0x1EC7;\n t['ecircumflexgrave'] = 0x1EC1;\n t['ecircumflexhookabove'] = 0x1EC3;\n t['ecircumflextilde'] = 0x1EC5;\n t['ecyrillic'] = 0x0454;\n t['edblgrave'] = 0x0205;\n t['edeva'] = 0x090F;\n t['edieresis'] = 0x00EB;\n t['edot'] = 0x0117;\n t['edotaccent'] = 0x0117;\n t['edotbelow'] = 0x1EB9;\n t['eegurmukhi'] = 0x0A0F;\n t['eematragurmukhi'] = 0x0A47;\n t['efcyrillic'] = 0x0444;\n t['egrave'] = 0x00E8;\n t['egujarati'] = 0x0A8F;\n t['eharmenian'] = 0x0567;\n t['ehbopomofo'] = 0x311D;\n t['ehiragana'] = 0x3048;\n t['ehookabove'] = 0x1EBB;\n t['eibopomofo'] = 0x311F;\n t['eight'] = 0x0038;\n t['eightarabic'] = 0x0668;\n t['eightbengali'] = 0x09EE;\n t['eightcircle'] = 0x2467;\n t['eightcircleinversesansserif'] = 0x2791;\n t['eightdeva'] = 0x096E;\n t['eighteencircle'] = 0x2471;\n t['eighteenparen'] = 0x2485;\n t['eighteenperiod'] = 0x2499;\n t['eightgujarati'] = 0x0AEE;\n t['eightgurmukhi'] = 0x0A6E;\n t['eighthackarabic'] = 0x0668;\n t['eighthangzhou'] = 0x3028;\n t['eighthnotebeamed'] = 0x266B;\n t['eightideographicparen'] = 0x3227;\n t['eightinferior'] = 0x2088;\n t['eightmonospace'] = 0xFF18;\n t['eightoldstyle'] = 0xF738;\n t['eightparen'] = 0x247B;\n t['eightperiod'] = 0x248F;\n t['eightpersian'] = 0x06F8;\n t['eightroman'] = 0x2177;\n t['eightsuperior'] = 0x2078;\n t['eightthai'] = 0x0E58;\n t['einvertedbreve'] = 0x0207;\n t['eiotifiedcyrillic'] = 0x0465;\n t['ekatakana'] = 0x30A8;\n t['ekatakanahalfwidth'] = 0xFF74;\n t['ekonkargurmukhi'] = 0x0A74;\n t['ekorean'] = 0x3154;\n t['elcyrillic'] = 0x043B;\n t['element'] = 0x2208;\n t['elevencircle'] = 0x246A;\n t['elevenparen'] = 0x247E;\n t['elevenperiod'] = 0x2492;\n t['elevenroman'] = 0x217A;\n t['ellipsis'] = 0x2026;\n t['ellipsisvertical'] = 0x22EE;\n t['emacron'] = 0x0113;\n t['emacronacute'] = 0x1E17;\n t['emacrongrave'] = 0x1E15;\n t['emcyrillic'] = 0x043C;\n t['emdash'] = 0x2014;\n t['emdashvertical'] = 0xFE31;\n t['emonospace'] = 0xFF45;\n t['emphasismarkarmenian'] = 0x055B;\n t['emptyset'] = 0x2205;\n t['enbopomofo'] = 0x3123;\n t['encyrillic'] = 0x043D;\n t['endash'] = 0x2013;\n t['endashvertical'] = 0xFE32;\n t['endescendercyrillic'] = 0x04A3;\n t['eng'] = 0x014B;\n t['engbopomofo'] = 0x3125;\n t['enghecyrillic'] = 0x04A5;\n t['enhookcyrillic'] = 0x04C8;\n t['enspace'] = 0x2002;\n t['eogonek'] = 0x0119;\n t['eokorean'] = 0x3153;\n t['eopen'] = 0x025B;\n t['eopenclosed'] = 0x029A;\n t['eopenreversed'] = 0x025C;\n t['eopenreversedclosed'] = 0x025E;\n t['eopenreversedhook'] = 0x025D;\n t['eparen'] = 0x24A0;\n t['epsilon'] = 0x03B5;\n t['epsilontonos'] = 0x03AD;\n t['equal'] = 0x003D;\n t['equalmonospace'] = 0xFF1D;\n t['equalsmall'] = 0xFE66;\n t['equalsuperior'] = 0x207C;\n t['equivalence'] = 0x2261;\n t['erbopomofo'] = 0x3126;\n t['ercyrillic'] = 0x0440;\n t['ereversed'] = 0x0258;\n t['ereversedcyrillic'] = 0x044D;\n t['escyrillic'] = 0x0441;\n t['esdescendercyrillic'] = 0x04AB;\n t['esh'] = 0x0283;\n t['eshcurl'] = 0x0286;\n t['eshortdeva'] = 0x090E;\n t['eshortvowelsigndeva'] = 0x0946;\n t['eshreversedloop'] = 0x01AA;\n t['eshsquatreversed'] = 0x0285;\n t['esmallhiragana'] = 0x3047;\n t['esmallkatakana'] = 0x30A7;\n t['esmallkatakanahalfwidth'] = 0xFF6A;\n t['estimated'] = 0x212E;\n t['esuperior'] = 0xF6EC;\n t['eta'] = 0x03B7;\n t['etarmenian'] = 0x0568;\n t['etatonos'] = 0x03AE;\n t['eth'] = 0x00F0;\n t['etilde'] = 0x1EBD;\n t['etildebelow'] = 0x1E1B;\n t['etnahtafoukhhebrew'] = 0x0591;\n t['etnahtafoukhlefthebrew'] = 0x0591;\n t['etnahtahebrew'] = 0x0591;\n t['etnahtalefthebrew'] = 0x0591;\n t['eturned'] = 0x01DD;\n t['eukorean'] = 0x3161;\n t['euro'] = 0x20AC;\n t['evowelsignbengali'] = 0x09C7;\n t['evowelsigndeva'] = 0x0947;\n t['evowelsigngujarati'] = 0x0AC7;\n t['exclam'] = 0x0021;\n t['exclamarmenian'] = 0x055C;\n t['exclamdbl'] = 0x203C;\n t['exclamdown'] = 0x00A1;\n t['exclamdownsmall'] = 0xF7A1;\n t['exclammonospace'] = 0xFF01;\n t['exclamsmall'] = 0xF721;\n t['existential'] = 0x2203;\n t['ezh'] = 0x0292;\n t['ezhcaron'] = 0x01EF;\n t['ezhcurl'] = 0x0293;\n t['ezhreversed'] = 0x01B9;\n t['ezhtail'] = 0x01BA;\n t['f'] = 0x0066;\n t['fadeva'] = 0x095E;\n t['fagurmukhi'] = 0x0A5E;\n t['fahrenheit'] = 0x2109;\n t['fathaarabic'] = 0x064E;\n t['fathalowarabic'] = 0x064E;\n t['fathatanarabic'] = 0x064B;\n t['fbopomofo'] = 0x3108;\n t['fcircle'] = 0x24D5;\n t['fdotaccent'] = 0x1E1F;\n t['feharabic'] = 0x0641;\n t['feharmenian'] = 0x0586;\n t['fehfinalarabic'] = 0xFED2;\n t['fehinitialarabic'] = 0xFED3;\n t['fehmedialarabic'] = 0xFED4;\n t['feicoptic'] = 0x03E5;\n t['female'] = 0x2640;\n t['ff'] = 0xFB00;\n t['ffi'] = 0xFB03;\n t['ffl'] = 0xFB04;\n t['fi'] = 0xFB01;\n t['fifteencircle'] = 0x246E;\n t['fifteenparen'] = 0x2482;\n t['fifteenperiod'] = 0x2496;\n t['figuredash'] = 0x2012;\n t['filledbox'] = 0x25A0;\n t['filledrect'] = 0x25AC;\n t['finalkaf'] = 0x05DA;\n t['finalkafdagesh'] = 0xFB3A;\n t['finalkafdageshhebrew'] = 0xFB3A;\n t['finalkafhebrew'] = 0x05DA;\n t['finalmem'] = 0x05DD;\n t['finalmemhebrew'] = 0x05DD;\n t['finalnun'] = 0x05DF;\n t['finalnunhebrew'] = 0x05DF;\n t['finalpe'] = 0x05E3;\n t['finalpehebrew'] = 0x05E3;\n t['finaltsadi'] = 0x05E5;\n t['finaltsadihebrew'] = 0x05E5;\n t['firsttonechinese'] = 0x02C9;\n t['fisheye'] = 0x25C9;\n t['fitacyrillic'] = 0x0473;\n t['five'] = 0x0035;\n t['fivearabic'] = 0x0665;\n t['fivebengali'] = 0x09EB;\n t['fivecircle'] = 0x2464;\n t['fivecircleinversesansserif'] = 0x278E;\n t['fivedeva'] = 0x096B;\n t['fiveeighths'] = 0x215D;\n t['fivegujarati'] = 0x0AEB;\n t['fivegurmukhi'] = 0x0A6B;\n t['fivehackarabic'] = 0x0665;\n t['fivehangzhou'] = 0x3025;\n t['fiveideographicparen'] = 0x3224;\n t['fiveinferior'] = 0x2085;\n t['fivemonospace'] = 0xFF15;\n t['fiveoldstyle'] = 0xF735;\n t['fiveparen'] = 0x2478;\n t['fiveperiod'] = 0x248C;\n t['fivepersian'] = 0x06F5;\n t['fiveroman'] = 0x2174;\n t['fivesuperior'] = 0x2075;\n t['fivethai'] = 0x0E55;\n t['fl'] = 0xFB02;\n t['florin'] = 0x0192;\n t['fmonospace'] = 0xFF46;\n t['fmsquare'] = 0x3399;\n t['fofanthai'] = 0x0E1F;\n t['fofathai'] = 0x0E1D;\n t['fongmanthai'] = 0x0E4F;\n t['forall'] = 0x2200;\n t['four'] = 0x0034;\n t['fourarabic'] = 0x0664;\n t['fourbengali'] = 0x09EA;\n t['fourcircle'] = 0x2463;\n t['fourcircleinversesansserif'] = 0x278D;\n t['fourdeva'] = 0x096A;\n t['fourgujarati'] = 0x0AEA;\n t['fourgurmukhi'] = 0x0A6A;\n t['fourhackarabic'] = 0x0664;\n t['fourhangzhou'] = 0x3024;\n t['fourideographicparen'] = 0x3223;\n t['fourinferior'] = 0x2084;\n t['fourmonospace'] = 0xFF14;\n t['fournumeratorbengali'] = 0x09F7;\n t['fouroldstyle'] = 0xF734;\n t['fourparen'] = 0x2477;\n t['fourperiod'] = 0x248B;\n t['fourpersian'] = 0x06F4;\n t['fourroman'] = 0x2173;\n t['foursuperior'] = 0x2074;\n t['fourteencircle'] = 0x246D;\n t['fourteenparen'] = 0x2481;\n t['fourteenperiod'] = 0x2495;\n t['fourthai'] = 0x0E54;\n t['fourthtonechinese'] = 0x02CB;\n t['fparen'] = 0x24A1;\n t['fraction'] = 0x2044;\n t['franc'] = 0x20A3;\n t['g'] = 0x0067;\n t['gabengali'] = 0x0997;\n t['gacute'] = 0x01F5;\n t['gadeva'] = 0x0917;\n t['gafarabic'] = 0x06AF;\n t['gaffinalarabic'] = 0xFB93;\n t['gafinitialarabic'] = 0xFB94;\n t['gafmedialarabic'] = 0xFB95;\n t['gagujarati'] = 0x0A97;\n t['gagurmukhi'] = 0x0A17;\n t['gahiragana'] = 0x304C;\n t['gakatakana'] = 0x30AC;\n t['gamma'] = 0x03B3;\n t['gammalatinsmall'] = 0x0263;\n t['gammasuperior'] = 0x02E0;\n t['gangiacoptic'] = 0x03EB;\n t['gbopomofo'] = 0x310D;\n t['gbreve'] = 0x011F;\n t['gcaron'] = 0x01E7;\n t['gcedilla'] = 0x0123;\n t['gcircle'] = 0x24D6;\n t['gcircumflex'] = 0x011D;\n t['gcommaaccent'] = 0x0123;\n t['gdot'] = 0x0121;\n t['gdotaccent'] = 0x0121;\n t['gecyrillic'] = 0x0433;\n t['gehiragana'] = 0x3052;\n t['gekatakana'] = 0x30B2;\n t['geometricallyequal'] = 0x2251;\n t['gereshaccenthebrew'] = 0x059C;\n t['gereshhebrew'] = 0x05F3;\n t['gereshmuqdamhebrew'] = 0x059D;\n t['germandbls'] = 0x00DF;\n t['gershayimaccenthebrew'] = 0x059E;\n t['gershayimhebrew'] = 0x05F4;\n t['getamark'] = 0x3013;\n t['ghabengali'] = 0x0998;\n t['ghadarmenian'] = 0x0572;\n t['ghadeva'] = 0x0918;\n t['ghagujarati'] = 0x0A98;\n t['ghagurmukhi'] = 0x0A18;\n t['ghainarabic'] = 0x063A;\n t['ghainfinalarabic'] = 0xFECE;\n t['ghaininitialarabic'] = 0xFECF;\n t['ghainmedialarabic'] = 0xFED0;\n t['ghemiddlehookcyrillic'] = 0x0495;\n t['ghestrokecyrillic'] = 0x0493;\n t['gheupturncyrillic'] = 0x0491;\n t['ghhadeva'] = 0x095A;\n t['ghhagurmukhi'] = 0x0A5A;\n t['ghook'] = 0x0260;\n t['ghzsquare'] = 0x3393;\n t['gihiragana'] = 0x304E;\n t['gikatakana'] = 0x30AE;\n t['gimarmenian'] = 0x0563;\n t['gimel'] = 0x05D2;\n t['gimeldagesh'] = 0xFB32;\n t['gimeldageshhebrew'] = 0xFB32;\n t['gimelhebrew'] = 0x05D2;\n t['gjecyrillic'] = 0x0453;\n t['glottalinvertedstroke'] = 0x01BE;\n t['glottalstop'] = 0x0294;\n t['glottalstopinverted'] = 0x0296;\n t['glottalstopmod'] = 0x02C0;\n t['glottalstopreversed'] = 0x0295;\n t['glottalstopreversedmod'] = 0x02C1;\n t['glottalstopreversedsuperior'] = 0x02E4;\n t['glottalstopstroke'] = 0x02A1;\n t['glottalstopstrokereversed'] = 0x02A2;\n t['gmacron'] = 0x1E21;\n t['gmonospace'] = 0xFF47;\n t['gohiragana'] = 0x3054;\n t['gokatakana'] = 0x30B4;\n t['gparen'] = 0x24A2;\n t['gpasquare'] = 0x33AC;\n t['gradient'] = 0x2207;\n t['grave'] = 0x0060;\n t['gravebelowcmb'] = 0x0316;\n t['gravecmb'] = 0x0300;\n t['gravecomb'] = 0x0300;\n t['gravedeva'] = 0x0953;\n t['gravelowmod'] = 0x02CE;\n t['gravemonospace'] = 0xFF40;\n t['gravetonecmb'] = 0x0340;\n t['greater'] = 0x003E;\n t['greaterequal'] = 0x2265;\n t['greaterequalorless'] = 0x22DB;\n t['greatermonospace'] = 0xFF1E;\n t['greaterorequivalent'] = 0x2273;\n t['greaterorless'] = 0x2277;\n t['greateroverequal'] = 0x2267;\n t['greatersmall'] = 0xFE65;\n t['gscript'] = 0x0261;\n t['gstroke'] = 0x01E5;\n t['guhiragana'] = 0x3050;\n t['guillemotleft'] = 0x00AB;\n t['guillemotright'] = 0x00BB;\n t['guilsinglleft'] = 0x2039;\n t['guilsinglright'] = 0x203A;\n t['gukatakana'] = 0x30B0;\n t['guramusquare'] = 0x3318;\n t['gysquare'] = 0x33C9;\n t['h'] = 0x0068;\n t['haabkhasiancyrillic'] = 0x04A9;\n t['haaltonearabic'] = 0x06C1;\n t['habengali'] = 0x09B9;\n t['hadescendercyrillic'] = 0x04B3;\n t['hadeva'] = 0x0939;\n t['hagujarati'] = 0x0AB9;\n t['hagurmukhi'] = 0x0A39;\n t['haharabic'] = 0x062D;\n t['hahfinalarabic'] = 0xFEA2;\n t['hahinitialarabic'] = 0xFEA3;\n t['hahiragana'] = 0x306F;\n t['hahmedialarabic'] = 0xFEA4;\n t['haitusquare'] = 0x332A;\n t['hakatakana'] = 0x30CF;\n t['hakatakanahalfwidth'] = 0xFF8A;\n t['halantgurmukhi'] = 0x0A4D;\n t['hamzaarabic'] = 0x0621;\n t['hamzalowarabic'] = 0x0621;\n t['hangulfiller'] = 0x3164;\n t['hardsigncyrillic'] = 0x044A;\n t['harpoonleftbarbup'] = 0x21BC;\n t['harpoonrightbarbup'] = 0x21C0;\n t['hasquare'] = 0x33CA;\n t['hatafpatah'] = 0x05B2;\n t['hatafpatah16'] = 0x05B2;\n t['hatafpatah23'] = 0x05B2;\n t['hatafpatah2f'] = 0x05B2;\n t['hatafpatahhebrew'] = 0x05B2;\n t['hatafpatahnarrowhebrew'] = 0x05B2;\n t['hatafpatahquarterhebrew'] = 0x05B2;\n t['hatafpatahwidehebrew'] = 0x05B2;\n t['hatafqamats'] = 0x05B3;\n t['hatafqamats1b'] = 0x05B3;\n t['hatafqamats28'] = 0x05B3;\n t['hatafqamats34'] = 0x05B3;\n t['hatafqamatshebrew'] = 0x05B3;\n t['hatafqamatsnarrowhebrew'] = 0x05B3;\n t['hatafqamatsquarterhebrew'] = 0x05B3;\n t['hatafqamatswidehebrew'] = 0x05B3;\n t['hatafsegol'] = 0x05B1;\n t['hatafsegol17'] = 0x05B1;\n t['hatafsegol24'] = 0x05B1;\n t['hatafsegol30'] = 0x05B1;\n t['hatafsegolhebrew'] = 0x05B1;\n t['hatafsegolnarrowhebrew'] = 0x05B1;\n t['hatafsegolquarterhebrew'] = 0x05B1;\n t['hatafsegolwidehebrew'] = 0x05B1;\n t['hbar'] = 0x0127;\n t['hbopomofo'] = 0x310F;\n t['hbrevebelow'] = 0x1E2B;\n t['hcedilla'] = 0x1E29;\n t['hcircle'] = 0x24D7;\n t['hcircumflex'] = 0x0125;\n t['hdieresis'] = 0x1E27;\n t['hdotaccent'] = 0x1E23;\n t['hdotbelow'] = 0x1E25;\n t['he'] = 0x05D4;\n t['heart'] = 0x2665;\n t['heartsuitblack'] = 0x2665;\n t['heartsuitwhite'] = 0x2661;\n t['hedagesh'] = 0xFB34;\n t['hedageshhebrew'] = 0xFB34;\n t['hehaltonearabic'] = 0x06C1;\n t['heharabic'] = 0x0647;\n t['hehebrew'] = 0x05D4;\n t['hehfinalaltonearabic'] = 0xFBA7;\n t['hehfinalalttwoarabic'] = 0xFEEA;\n t['hehfinalarabic'] = 0xFEEA;\n t['hehhamzaabovefinalarabic'] = 0xFBA5;\n t['hehhamzaaboveisolatedarabic'] = 0xFBA4;\n t['hehinitialaltonearabic'] = 0xFBA8;\n t['hehinitialarabic'] = 0xFEEB;\n t['hehiragana'] = 0x3078;\n t['hehmedialaltonearabic'] = 0xFBA9;\n t['hehmedialarabic'] = 0xFEEC;\n t['heiseierasquare'] = 0x337B;\n t['hekatakana'] = 0x30D8;\n t['hekatakanahalfwidth'] = 0xFF8D;\n t['hekutaarusquare'] = 0x3336;\n t['henghook'] = 0x0267;\n t['herutusquare'] = 0x3339;\n t['het'] = 0x05D7;\n t['hethebrew'] = 0x05D7;\n t['hhook'] = 0x0266;\n t['hhooksuperior'] = 0x02B1;\n t['hieuhacirclekorean'] = 0x327B;\n t['hieuhaparenkorean'] = 0x321B;\n t['hieuhcirclekorean'] = 0x326D;\n t['hieuhkorean'] = 0x314E;\n t['hieuhparenkorean'] = 0x320D;\n t['hihiragana'] = 0x3072;\n t['hikatakana'] = 0x30D2;\n t['hikatakanahalfwidth'] = 0xFF8B;\n t['hiriq'] = 0x05B4;\n t['hiriq14'] = 0x05B4;\n t['hiriq21'] = 0x05B4;\n t['hiriq2d'] = 0x05B4;\n t['hiriqhebrew'] = 0x05B4;\n t['hiriqnarrowhebrew'] = 0x05B4;\n t['hiriqquarterhebrew'] = 0x05B4;\n t['hiriqwidehebrew'] = 0x05B4;\n t['hlinebelow'] = 0x1E96;\n t['hmonospace'] = 0xFF48;\n t['hoarmenian'] = 0x0570;\n t['hohipthai'] = 0x0E2B;\n t['hohiragana'] = 0x307B;\n t['hokatakana'] = 0x30DB;\n t['hokatakanahalfwidth'] = 0xFF8E;\n t['holam'] = 0x05B9;\n t['holam19'] = 0x05B9;\n t['holam26'] = 0x05B9;\n t['holam32'] = 0x05B9;\n t['holamhebrew'] = 0x05B9;\n t['holamnarrowhebrew'] = 0x05B9;\n t['holamquarterhebrew'] = 0x05B9;\n t['holamwidehebrew'] = 0x05B9;\n t['honokhukthai'] = 0x0E2E;\n t['hookabovecomb'] = 0x0309;\n t['hookcmb'] = 0x0309;\n t['hookpalatalizedbelowcmb'] = 0x0321;\n t['hookretroflexbelowcmb'] = 0x0322;\n t['hoonsquare'] = 0x3342;\n t['horicoptic'] = 0x03E9;\n t['horizontalbar'] = 0x2015;\n t['horncmb'] = 0x031B;\n t['hotsprings'] = 0x2668;\n t['house'] = 0x2302;\n t['hparen'] = 0x24A3;\n t['hsuperior'] = 0x02B0;\n t['hturned'] = 0x0265;\n t['huhiragana'] = 0x3075;\n t['huiitosquare'] = 0x3333;\n t['hukatakana'] = 0x30D5;\n t['hukatakanahalfwidth'] = 0xFF8C;\n t['hungarumlaut'] = 0x02DD;\n t['hungarumlautcmb'] = 0x030B;\n t['hv'] = 0x0195;\n t['hyphen'] = 0x002D;\n t['hypheninferior'] = 0xF6E5;\n t['hyphenmonospace'] = 0xFF0D;\n t['hyphensmall'] = 0xFE63;\n t['hyphensuperior'] = 0xF6E6;\n t['hyphentwo'] = 0x2010;\n t['i'] = 0x0069;\n t['iacute'] = 0x00ED;\n t['iacyrillic'] = 0x044F;\n t['ibengali'] = 0x0987;\n t['ibopomofo'] = 0x3127;\n t['ibreve'] = 0x012D;\n t['icaron'] = 0x01D0;\n t['icircle'] = 0x24D8;\n t['icircumflex'] = 0x00EE;\n t['icyrillic'] = 0x0456;\n t['idblgrave'] = 0x0209;\n t['ideographearthcircle'] = 0x328F;\n t['ideographfirecircle'] = 0x328B;\n t['ideographicallianceparen'] = 0x323F;\n t['ideographiccallparen'] = 0x323A;\n t['ideographiccentrecircle'] = 0x32A5;\n t['ideographicclose'] = 0x3006;\n t['ideographiccomma'] = 0x3001;\n t['ideographiccommaleft'] = 0xFF64;\n t['ideographiccongratulationparen'] = 0x3237;\n t['ideographiccorrectcircle'] = 0x32A3;\n t['ideographicearthparen'] = 0x322F;\n t['ideographicenterpriseparen'] = 0x323D;\n t['ideographicexcellentcircle'] = 0x329D;\n t['ideographicfestivalparen'] = 0x3240;\n t['ideographicfinancialcircle'] = 0x3296;\n t['ideographicfinancialparen'] = 0x3236;\n t['ideographicfireparen'] = 0x322B;\n t['ideographichaveparen'] = 0x3232;\n t['ideographichighcircle'] = 0x32A4;\n t['ideographiciterationmark'] = 0x3005;\n t['ideographiclaborcircle'] = 0x3298;\n t['ideographiclaborparen'] = 0x3238;\n t['ideographicleftcircle'] = 0x32A7;\n t['ideographiclowcircle'] = 0x32A6;\n t['ideographicmedicinecircle'] = 0x32A9;\n t['ideographicmetalparen'] = 0x322E;\n t['ideographicmoonparen'] = 0x322A;\n t['ideographicnameparen'] = 0x3234;\n t['ideographicperiod'] = 0x3002;\n t['ideographicprintcircle'] = 0x329E;\n t['ideographicreachparen'] = 0x3243;\n t['ideographicrepresentparen'] = 0x3239;\n t['ideographicresourceparen'] = 0x323E;\n t['ideographicrightcircle'] = 0x32A8;\n t['ideographicsecretcircle'] = 0x3299;\n t['ideographicselfparen'] = 0x3242;\n t['ideographicsocietyparen'] = 0x3233;\n t['ideographicspace'] = 0x3000;\n t['ideographicspecialparen'] = 0x3235;\n t['ideographicstockparen'] = 0x3231;\n t['ideographicstudyparen'] = 0x323B;\n t['ideographicsunparen'] = 0x3230;\n t['ideographicsuperviseparen'] = 0x323C;\n t['ideographicwaterparen'] = 0x322C;\n t['ideographicwoodparen'] = 0x322D;\n t['ideographiczero'] = 0x3007;\n t['ideographmetalcircle'] = 0x328E;\n t['ideographmooncircle'] = 0x328A;\n t['ideographnamecircle'] = 0x3294;\n t['ideographsuncircle'] = 0x3290;\n t['ideographwatercircle'] = 0x328C;\n t['ideographwoodcircle'] = 0x328D;\n t['ideva'] = 0x0907;\n t['idieresis'] = 0x00EF;\n t['idieresisacute'] = 0x1E2F;\n t['idieresiscyrillic'] = 0x04E5;\n t['idotbelow'] = 0x1ECB;\n t['iebrevecyrillic'] = 0x04D7;\n t['iecyrillic'] = 0x0435;\n t['ieungacirclekorean'] = 0x3275;\n t['ieungaparenkorean'] = 0x3215;\n t['ieungcirclekorean'] = 0x3267;\n t['ieungkorean'] = 0x3147;\n t['ieungparenkorean'] = 0x3207;\n t['igrave'] = 0x00EC;\n t['igujarati'] = 0x0A87;\n t['igurmukhi'] = 0x0A07;\n t['ihiragana'] = 0x3044;\n t['ihookabove'] = 0x1EC9;\n t['iibengali'] = 0x0988;\n t['iicyrillic'] = 0x0438;\n t['iideva'] = 0x0908;\n t['iigujarati'] = 0x0A88;\n t['iigurmukhi'] = 0x0A08;\n t['iimatragurmukhi'] = 0x0A40;\n t['iinvertedbreve'] = 0x020B;\n t['iishortcyrillic'] = 0x0439;\n t['iivowelsignbengali'] = 0x09C0;\n t['iivowelsigndeva'] = 0x0940;\n t['iivowelsigngujarati'] = 0x0AC0;\n t['ij'] = 0x0133;\n t['ikatakana'] = 0x30A4;\n t['ikatakanahalfwidth'] = 0xFF72;\n t['ikorean'] = 0x3163;\n t['ilde'] = 0x02DC;\n t['iluyhebrew'] = 0x05AC;\n t['imacron'] = 0x012B;\n t['imacroncyrillic'] = 0x04E3;\n t['imageorapproximatelyequal'] = 0x2253;\n t['imatragurmukhi'] = 0x0A3F;\n t['imonospace'] = 0xFF49;\n t['increment'] = 0x2206;\n t['infinity'] = 0x221E;\n t['iniarmenian'] = 0x056B;\n t['integral'] = 0x222B;\n t['integralbottom'] = 0x2321;\n t['integralbt'] = 0x2321;\n t['integralex'] = 0xF8F5;\n t['integraltop'] = 0x2320;\n t['integraltp'] = 0x2320;\n t['intersection'] = 0x2229;\n t['intisquare'] = 0x3305;\n t['invbullet'] = 0x25D8;\n t['invcircle'] = 0x25D9;\n t['invsmileface'] = 0x263B;\n t['iocyrillic'] = 0x0451;\n t['iogonek'] = 0x012F;\n t['iota'] = 0x03B9;\n t['iotadieresis'] = 0x03CA;\n t['iotadieresistonos'] = 0x0390;\n t['iotalatin'] = 0x0269;\n t['iotatonos'] = 0x03AF;\n t['iparen'] = 0x24A4;\n t['irigurmukhi'] = 0x0A72;\n t['ismallhiragana'] = 0x3043;\n t['ismallkatakana'] = 0x30A3;\n t['ismallkatakanahalfwidth'] = 0xFF68;\n t['issharbengali'] = 0x09FA;\n t['istroke'] = 0x0268;\n t['isuperior'] = 0xF6ED;\n t['iterationhiragana'] = 0x309D;\n t['iterationkatakana'] = 0x30FD;\n t['itilde'] = 0x0129;\n t['itildebelow'] = 0x1E2D;\n t['iubopomofo'] = 0x3129;\n t['iucyrillic'] = 0x044E;\n t['ivowelsignbengali'] = 0x09BF;\n t['ivowelsigndeva'] = 0x093F;\n t['ivowelsigngujarati'] = 0x0ABF;\n t['izhitsacyrillic'] = 0x0475;\n t['izhitsadblgravecyrillic'] = 0x0477;\n t['j'] = 0x006A;\n t['jaarmenian'] = 0x0571;\n t['jabengali'] = 0x099C;\n t['jadeva'] = 0x091C;\n t['jagujarati'] = 0x0A9C;\n t['jagurmukhi'] = 0x0A1C;\n t['jbopomofo'] = 0x3110;\n t['jcaron'] = 0x01F0;\n t['jcircle'] = 0x24D9;\n t['jcircumflex'] = 0x0135;\n t['jcrossedtail'] = 0x029D;\n t['jdotlessstroke'] = 0x025F;\n t['jecyrillic'] = 0x0458;\n t['jeemarabic'] = 0x062C;\n t['jeemfinalarabic'] = 0xFE9E;\n t['jeeminitialarabic'] = 0xFE9F;\n t['jeemmedialarabic'] = 0xFEA0;\n t['jeharabic'] = 0x0698;\n t['jehfinalarabic'] = 0xFB8B;\n t['jhabengali'] = 0x099D;\n t['jhadeva'] = 0x091D;\n t['jhagujarati'] = 0x0A9D;\n t['jhagurmukhi'] = 0x0A1D;\n t['jheharmenian'] = 0x057B;\n t['jis'] = 0x3004;\n t['jmonospace'] = 0xFF4A;\n t['jparen'] = 0x24A5;\n t['jsuperior'] = 0x02B2;\n t['k'] = 0x006B;\n t['kabashkircyrillic'] = 0x04A1;\n t['kabengali'] = 0x0995;\n t['kacute'] = 0x1E31;\n t['kacyrillic'] = 0x043A;\n t['kadescendercyrillic'] = 0x049B;\n t['kadeva'] = 0x0915;\n t['kaf'] = 0x05DB;\n t['kafarabic'] = 0x0643;\n t['kafdagesh'] = 0xFB3B;\n t['kafdageshhebrew'] = 0xFB3B;\n t['kaffinalarabic'] = 0xFEDA;\n t['kafhebrew'] = 0x05DB;\n t['kafinitialarabic'] = 0xFEDB;\n t['kafmedialarabic'] = 0xFEDC;\n t['kafrafehebrew'] = 0xFB4D;\n t['kagujarati'] = 0x0A95;\n t['kagurmukhi'] = 0x0A15;\n t['kahiragana'] = 0x304B;\n t['kahookcyrillic'] = 0x04C4;\n t['kakatakana'] = 0x30AB;\n t['kakatakanahalfwidth'] = 0xFF76;\n t['kappa'] = 0x03BA;\n t['kappasymbolgreek'] = 0x03F0;\n t['kapyeounmieumkorean'] = 0x3171;\n t['kapyeounphieuphkorean'] = 0x3184;\n t['kapyeounpieupkorean'] = 0x3178;\n t['kapyeounssangpieupkorean'] = 0x3179;\n t['karoriisquare'] = 0x330D;\n t['kashidaautoarabic'] = 0x0640;\n t['kashidaautonosidebearingarabic'] = 0x0640;\n t['kasmallkatakana'] = 0x30F5;\n t['kasquare'] = 0x3384;\n t['kasraarabic'] = 0x0650;\n t['kasratanarabic'] = 0x064D;\n t['kastrokecyrillic'] = 0x049F;\n t['katahiraprolongmarkhalfwidth'] = 0xFF70;\n t['kaverticalstrokecyrillic'] = 0x049D;\n t['kbopomofo'] = 0x310E;\n t['kcalsquare'] = 0x3389;\n t['kcaron'] = 0x01E9;\n t['kcedilla'] = 0x0137;\n t['kcircle'] = 0x24DA;\n t['kcommaaccent'] = 0x0137;\n t['kdotbelow'] = 0x1E33;\n t['keharmenian'] = 0x0584;\n t['kehiragana'] = 0x3051;\n t['kekatakana'] = 0x30B1;\n t['kekatakanahalfwidth'] = 0xFF79;\n t['kenarmenian'] = 0x056F;\n t['kesmallkatakana'] = 0x30F6;\n t['kgreenlandic'] = 0x0138;\n t['khabengali'] = 0x0996;\n t['khacyrillic'] = 0x0445;\n t['khadeva'] = 0x0916;\n t['khagujarati'] = 0x0A96;\n t['khagurmukhi'] = 0x0A16;\n t['khaharabic'] = 0x062E;\n t['khahfinalarabic'] = 0xFEA6;\n t['khahinitialarabic'] = 0xFEA7;\n t['khahmedialarabic'] = 0xFEA8;\n t['kheicoptic'] = 0x03E7;\n t['khhadeva'] = 0x0959;\n t['khhagurmukhi'] = 0x0A59;\n t['khieukhacirclekorean'] = 0x3278;\n t['khieukhaparenkorean'] = 0x3218;\n t['khieukhcirclekorean'] = 0x326A;\n t['khieukhkorean'] = 0x314B;\n t['khieukhparenkorean'] = 0x320A;\n t['khokhaithai'] = 0x0E02;\n t['khokhonthai'] = 0x0E05;\n t['khokhuatthai'] = 0x0E03;\n t['khokhwaithai'] = 0x0E04;\n t['khomutthai'] = 0x0E5B;\n t['khook'] = 0x0199;\n t['khorakhangthai'] = 0x0E06;\n t['khzsquare'] = 0x3391;\n t['kihiragana'] = 0x304D;\n t['kikatakana'] = 0x30AD;\n t['kikatakanahalfwidth'] = 0xFF77;\n t['kiroguramusquare'] = 0x3315;\n t['kiromeetorusquare'] = 0x3316;\n t['kirosquare'] = 0x3314;\n t['kiyeokacirclekorean'] = 0x326E;\n t['kiyeokaparenkorean'] = 0x320E;\n t['kiyeokcirclekorean'] = 0x3260;\n t['kiyeokkorean'] = 0x3131;\n t['kiyeokparenkorean'] = 0x3200;\n t['kiyeoksioskorean'] = 0x3133;\n t['kjecyrillic'] = 0x045C;\n t['klinebelow'] = 0x1E35;\n t['klsquare'] = 0x3398;\n t['kmcubedsquare'] = 0x33A6;\n t['kmonospace'] = 0xFF4B;\n t['kmsquaredsquare'] = 0x33A2;\n t['kohiragana'] = 0x3053;\n t['kohmsquare'] = 0x33C0;\n t['kokaithai'] = 0x0E01;\n t['kokatakana'] = 0x30B3;\n t['kokatakanahalfwidth'] = 0xFF7A;\n t['kooposquare'] = 0x331E;\n t['koppacyrillic'] = 0x0481;\n t['koreanstandardsymbol'] = 0x327F;\n t['koroniscmb'] = 0x0343;\n t['kparen'] = 0x24A6;\n t['kpasquare'] = 0x33AA;\n t['ksicyrillic'] = 0x046F;\n t['ktsquare'] = 0x33CF;\n t['kturned'] = 0x029E;\n t['kuhiragana'] = 0x304F;\n t['kukatakana'] = 0x30AF;\n t['kukatakanahalfwidth'] = 0xFF78;\n t['kvsquare'] = 0x33B8;\n t['kwsquare'] = 0x33BE;\n t['l'] = 0x006C;\n t['labengali'] = 0x09B2;\n t['lacute'] = 0x013A;\n t['ladeva'] = 0x0932;\n t['lagujarati'] = 0x0AB2;\n t['lagurmukhi'] = 0x0A32;\n t['lakkhangyaothai'] = 0x0E45;\n t['lamaleffinalarabic'] = 0xFEFC;\n t['lamalefhamzaabovefinalarabic'] = 0xFEF8;\n t['lamalefhamzaaboveisolatedarabic'] = 0xFEF7;\n t['lamalefhamzabelowfinalarabic'] = 0xFEFA;\n t['lamalefhamzabelowisolatedarabic'] = 0xFEF9;\n t['lamalefisolatedarabic'] = 0xFEFB;\n t['lamalefmaddaabovefinalarabic'] = 0xFEF6;\n t['lamalefmaddaaboveisolatedarabic'] = 0xFEF5;\n t['lamarabic'] = 0x0644;\n t['lambda'] = 0x03BB;\n t['lambdastroke'] = 0x019B;\n t['lamed'] = 0x05DC;\n t['lameddagesh'] = 0xFB3C;\n t['lameddageshhebrew'] = 0xFB3C;\n t['lamedhebrew'] = 0x05DC;\n t['lamfinalarabic'] = 0xFEDE;\n t['lamhahinitialarabic'] = 0xFCCA;\n t['laminitialarabic'] = 0xFEDF;\n t['lamjeeminitialarabic'] = 0xFCC9;\n t['lamkhahinitialarabic'] = 0xFCCB;\n t['lamlamhehisolatedarabic'] = 0xFDF2;\n t['lammedialarabic'] = 0xFEE0;\n t['lammeemhahinitialarabic'] = 0xFD88;\n t['lammeeminitialarabic'] = 0xFCCC;\n t['largecircle'] = 0x25EF;\n t['lbar'] = 0x019A;\n t['lbelt'] = 0x026C;\n t['lbopomofo'] = 0x310C;\n t['lcaron'] = 0x013E;\n t['lcedilla'] = 0x013C;\n t['lcircle'] = 0x24DB;\n t['lcircumflexbelow'] = 0x1E3D;\n t['lcommaaccent'] = 0x013C;\n t['ldot'] = 0x0140;\n t['ldotaccent'] = 0x0140;\n t['ldotbelow'] = 0x1E37;\n t['ldotbelowmacron'] = 0x1E39;\n t['leftangleabovecmb'] = 0x031A;\n t['lefttackbelowcmb'] = 0x0318;\n t['less'] = 0x003C;\n t['lessequal'] = 0x2264;\n t['lessequalorgreater'] = 0x22DA;\n t['lessmonospace'] = 0xFF1C;\n t['lessorequivalent'] = 0x2272;\n t['lessorgreater'] = 0x2276;\n t['lessoverequal'] = 0x2266;\n t['lesssmall'] = 0xFE64;\n t['lezh'] = 0x026E;\n t['lfblock'] = 0x258C;\n t['lhookretroflex'] = 0x026D;\n t['lira'] = 0x20A4;\n t['liwnarmenian'] = 0x056C;\n t['lj'] = 0x01C9;\n t['ljecyrillic'] = 0x0459;\n t['ll'] = 0xF6C0;\n t['lladeva'] = 0x0933;\n t['llagujarati'] = 0x0AB3;\n t['llinebelow'] = 0x1E3B;\n t['llladeva'] = 0x0934;\n t['llvocalicbengali'] = 0x09E1;\n t['llvocalicdeva'] = 0x0961;\n t['llvocalicvowelsignbengali'] = 0x09E3;\n t['llvocalicvowelsigndeva'] = 0x0963;\n t['lmiddletilde'] = 0x026B;\n t['lmonospace'] = 0xFF4C;\n t['lmsquare'] = 0x33D0;\n t['lochulathai'] = 0x0E2C;\n t['logicaland'] = 0x2227;\n t['logicalnot'] = 0x00AC;\n t['logicalnotreversed'] = 0x2310;\n t['logicalor'] = 0x2228;\n t['lolingthai'] = 0x0E25;\n t['longs'] = 0x017F;\n t['lowlinecenterline'] = 0xFE4E;\n t['lowlinecmb'] = 0x0332;\n t['lowlinedashed'] = 0xFE4D;\n t['lozenge'] = 0x25CA;\n t['lparen'] = 0x24A7;\n t['lslash'] = 0x0142;\n t['lsquare'] = 0x2113;\n t['lsuperior'] = 0xF6EE;\n t['ltshade'] = 0x2591;\n t['luthai'] = 0x0E26;\n t['lvocalicbengali'] = 0x098C;\n t['lvocalicdeva'] = 0x090C;\n t['lvocalicvowelsignbengali'] = 0x09E2;\n t['lvocalicvowelsigndeva'] = 0x0962;\n t['lxsquare'] = 0x33D3;\n t['m'] = 0x006D;\n t['mabengali'] = 0x09AE;\n t['macron'] = 0x00AF;\n t['macronbelowcmb'] = 0x0331;\n t['macroncmb'] = 0x0304;\n t['macronlowmod'] = 0x02CD;\n t['macronmonospace'] = 0xFFE3;\n t['macute'] = 0x1E3F;\n t['madeva'] = 0x092E;\n t['magujarati'] = 0x0AAE;\n t['magurmukhi'] = 0x0A2E;\n t['mahapakhhebrew'] = 0x05A4;\n t['mahapakhlefthebrew'] = 0x05A4;\n t['mahiragana'] = 0x307E;\n t['maichattawalowleftthai'] = 0xF895;\n t['maichattawalowrightthai'] = 0xF894;\n t['maichattawathai'] = 0x0E4B;\n t['maichattawaupperleftthai'] = 0xF893;\n t['maieklowleftthai'] = 0xF88C;\n t['maieklowrightthai'] = 0xF88B;\n t['maiekthai'] = 0x0E48;\n t['maiekupperleftthai'] = 0xF88A;\n t['maihanakatleftthai'] = 0xF884;\n t['maihanakatthai'] = 0x0E31;\n t['maitaikhuleftthai'] = 0xF889;\n t['maitaikhuthai'] = 0x0E47;\n t['maitholowleftthai'] = 0xF88F;\n t['maitholowrightthai'] = 0xF88E;\n t['maithothai'] = 0x0E49;\n t['maithoupperleftthai'] = 0xF88D;\n t['maitrilowleftthai'] = 0xF892;\n t['maitrilowrightthai'] = 0xF891;\n t['maitrithai'] = 0x0E4A;\n t['maitriupperleftthai'] = 0xF890;\n t['maiyamokthai'] = 0x0E46;\n t['makatakana'] = 0x30DE;\n t['makatakanahalfwidth'] = 0xFF8F;\n t['male'] = 0x2642;\n t['mansyonsquare'] = 0x3347;\n t['maqafhebrew'] = 0x05BE;\n t['mars'] = 0x2642;\n t['masoracirclehebrew'] = 0x05AF;\n t['masquare'] = 0x3383;\n t['mbopomofo'] = 0x3107;\n t['mbsquare'] = 0x33D4;\n t['mcircle'] = 0x24DC;\n t['mcubedsquare'] = 0x33A5;\n t['mdotaccent'] = 0x1E41;\n t['mdotbelow'] = 0x1E43;\n t['meemarabic'] = 0x0645;\n t['meemfinalarabic'] = 0xFEE2;\n t['meeminitialarabic'] = 0xFEE3;\n t['meemmedialarabic'] = 0xFEE4;\n t['meemmeeminitialarabic'] = 0xFCD1;\n t['meemmeemisolatedarabic'] = 0xFC48;\n t['meetorusquare'] = 0x334D;\n t['mehiragana'] = 0x3081;\n t['meizierasquare'] = 0x337E;\n t['mekatakana'] = 0x30E1;\n t['mekatakanahalfwidth'] = 0xFF92;\n t['mem'] = 0x05DE;\n t['memdagesh'] = 0xFB3E;\n t['memdageshhebrew'] = 0xFB3E;\n t['memhebrew'] = 0x05DE;\n t['menarmenian'] = 0x0574;\n t['merkhahebrew'] = 0x05A5;\n t['merkhakefulahebrew'] = 0x05A6;\n t['merkhakefulalefthebrew'] = 0x05A6;\n t['merkhalefthebrew'] = 0x05A5;\n t['mhook'] = 0x0271;\n t['mhzsquare'] = 0x3392;\n t['middledotkatakanahalfwidth'] = 0xFF65;\n t['middot'] = 0x00B7;\n t['mieumacirclekorean'] = 0x3272;\n t['mieumaparenkorean'] = 0x3212;\n t['mieumcirclekorean'] = 0x3264;\n t['mieumkorean'] = 0x3141;\n t['mieumpansioskorean'] = 0x3170;\n t['mieumparenkorean'] = 0x3204;\n t['mieumpieupkorean'] = 0x316E;\n t['mieumsioskorean'] = 0x316F;\n t['mihiragana'] = 0x307F;\n t['mikatakana'] = 0x30DF;\n t['mikatakanahalfwidth'] = 0xFF90;\n t['minus'] = 0x2212;\n t['minusbelowcmb'] = 0x0320;\n t['minuscircle'] = 0x2296;\n t['minusmod'] = 0x02D7;\n t['minusplus'] = 0x2213;\n t['minute'] = 0x2032;\n t['miribaarusquare'] = 0x334A;\n t['mirisquare'] = 0x3349;\n t['mlonglegturned'] = 0x0270;\n t['mlsquare'] = 0x3396;\n t['mmcubedsquare'] = 0x33A3;\n t['mmonospace'] = 0xFF4D;\n t['mmsquaredsquare'] = 0x339F;\n t['mohiragana'] = 0x3082;\n t['mohmsquare'] = 0x33C1;\n t['mokatakana'] = 0x30E2;\n t['mokatakanahalfwidth'] = 0xFF93;\n t['molsquare'] = 0x33D6;\n t['momathai'] = 0x0E21;\n t['moverssquare'] = 0x33A7;\n t['moverssquaredsquare'] = 0x33A8;\n t['mparen'] = 0x24A8;\n t['mpasquare'] = 0x33AB;\n t['mssquare'] = 0x33B3;\n t['msuperior'] = 0xF6EF;\n t['mturned'] = 0x026F;\n t['mu'] = 0x00B5;\n t['mu1'] = 0x00B5;\n t['muasquare'] = 0x3382;\n t['muchgreater'] = 0x226B;\n t['muchless'] = 0x226A;\n t['mufsquare'] = 0x338C;\n t['mugreek'] = 0x03BC;\n t['mugsquare'] = 0x338D;\n t['muhiragana'] = 0x3080;\n t['mukatakana'] = 0x30E0;\n t['mukatakanahalfwidth'] = 0xFF91;\n t['mulsquare'] = 0x3395;\n t['multiply'] = 0x00D7;\n t['mumsquare'] = 0x339B;\n t['munahhebrew'] = 0x05A3;\n t['munahlefthebrew'] = 0x05A3;\n t['musicalnote'] = 0x266A;\n t['musicalnotedbl'] = 0x266B;\n t['musicflatsign'] = 0x266D;\n t['musicsharpsign'] = 0x266F;\n t['mussquare'] = 0x33B2;\n t['muvsquare'] = 0x33B6;\n t['muwsquare'] = 0x33BC;\n t['mvmegasquare'] = 0x33B9;\n t['mvsquare'] = 0x33B7;\n t['mwmegasquare'] = 0x33BF;\n t['mwsquare'] = 0x33BD;\n t['n'] = 0x006E;\n t['nabengali'] = 0x09A8;\n t['nabla'] = 0x2207;\n t['nacute'] = 0x0144;\n t['nadeva'] = 0x0928;\n t['nagujarati'] = 0x0AA8;\n t['nagurmukhi'] = 0x0A28;\n t['nahiragana'] = 0x306A;\n t['nakatakana'] = 0x30CA;\n t['nakatakanahalfwidth'] = 0xFF85;\n t['napostrophe'] = 0x0149;\n t['nasquare'] = 0x3381;\n t['nbopomofo'] = 0x310B;\n t['nbspace'] = 0x00A0;\n t['ncaron'] = 0x0148;\n t['ncedilla'] = 0x0146;\n t['ncircle'] = 0x24DD;\n t['ncircumflexbelow'] = 0x1E4B;\n t['ncommaaccent'] = 0x0146;\n t['ndotaccent'] = 0x1E45;\n t['ndotbelow'] = 0x1E47;\n t['nehiragana'] = 0x306D;\n t['nekatakana'] = 0x30CD;\n t['nekatakanahalfwidth'] = 0xFF88;\n t['newsheqelsign'] = 0x20AA;\n t['nfsquare'] = 0x338B;\n t['ngabengali'] = 0x0999;\n t['ngadeva'] = 0x0919;\n t['ngagujarati'] = 0x0A99;\n t['ngagurmukhi'] = 0x0A19;\n t['ngonguthai'] = 0x0E07;\n t['nhiragana'] = 0x3093;\n t['nhookleft'] = 0x0272;\n t['nhookretroflex'] = 0x0273;\n t['nieunacirclekorean'] = 0x326F;\n t['nieunaparenkorean'] = 0x320F;\n t['nieuncieuckorean'] = 0x3135;\n t['nieuncirclekorean'] = 0x3261;\n t['nieunhieuhkorean'] = 0x3136;\n t['nieunkorean'] = 0x3134;\n t['nieunpansioskorean'] = 0x3168;\n t['nieunparenkorean'] = 0x3201;\n t['nieunsioskorean'] = 0x3167;\n t['nieuntikeutkorean'] = 0x3166;\n t['nihiragana'] = 0x306B;\n t['nikatakana'] = 0x30CB;\n t['nikatakanahalfwidth'] = 0xFF86;\n t['nikhahitleftthai'] = 0xF899;\n t['nikhahitthai'] = 0x0E4D;\n t['nine'] = 0x0039;\n t['ninearabic'] = 0x0669;\n t['ninebengali'] = 0x09EF;\n t['ninecircle'] = 0x2468;\n t['ninecircleinversesansserif'] = 0x2792;\n t['ninedeva'] = 0x096F;\n t['ninegujarati'] = 0x0AEF;\n t['ninegurmukhi'] = 0x0A6F;\n t['ninehackarabic'] = 0x0669;\n t['ninehangzhou'] = 0x3029;\n t['nineideographicparen'] = 0x3228;\n t['nineinferior'] = 0x2089;\n t['ninemonospace'] = 0xFF19;\n t['nineoldstyle'] = 0xF739;\n t['nineparen'] = 0x247C;\n t['nineperiod'] = 0x2490;\n t['ninepersian'] = 0x06F9;\n t['nineroman'] = 0x2178;\n t['ninesuperior'] = 0x2079;\n t['nineteencircle'] = 0x2472;\n t['nineteenparen'] = 0x2486;\n t['nineteenperiod'] = 0x249A;\n t['ninethai'] = 0x0E59;\n t['nj'] = 0x01CC;\n t['njecyrillic'] = 0x045A;\n t['nkatakana'] = 0x30F3;\n t['nkatakanahalfwidth'] = 0xFF9D;\n t['nlegrightlong'] = 0x019E;\n t['nlinebelow'] = 0x1E49;\n t['nmonospace'] = 0xFF4E;\n t['nmsquare'] = 0x339A;\n t['nnabengali'] = 0x09A3;\n t['nnadeva'] = 0x0923;\n t['nnagujarati'] = 0x0AA3;\n t['nnagurmukhi'] = 0x0A23;\n t['nnnadeva'] = 0x0929;\n t['nohiragana'] = 0x306E;\n t['nokatakana'] = 0x30CE;\n t['nokatakanahalfwidth'] = 0xFF89;\n t['nonbreakingspace'] = 0x00A0;\n t['nonenthai'] = 0x0E13;\n t['nonuthai'] = 0x0E19;\n t['noonarabic'] = 0x0646;\n t['noonfinalarabic'] = 0xFEE6;\n t['noonghunnaarabic'] = 0x06BA;\n t['noonghunnafinalarabic'] = 0xFB9F;\n t['nooninitialarabic'] = 0xFEE7;\n t['noonjeeminitialarabic'] = 0xFCD2;\n t['noonjeemisolatedarabic'] = 0xFC4B;\n t['noonmedialarabic'] = 0xFEE8;\n t['noonmeeminitialarabic'] = 0xFCD5;\n t['noonmeemisolatedarabic'] = 0xFC4E;\n t['noonnoonfinalarabic'] = 0xFC8D;\n t['notcontains'] = 0x220C;\n t['notelement'] = 0x2209;\n t['notelementof'] = 0x2209;\n t['notequal'] = 0x2260;\n t['notgreater'] = 0x226F;\n t['notgreaternorequal'] = 0x2271;\n t['notgreaternorless'] = 0x2279;\n t['notidentical'] = 0x2262;\n t['notless'] = 0x226E;\n t['notlessnorequal'] = 0x2270;\n t['notparallel'] = 0x2226;\n t['notprecedes'] = 0x2280;\n t['notsubset'] = 0x2284;\n t['notsucceeds'] = 0x2281;\n t['notsuperset'] = 0x2285;\n t['nowarmenian'] = 0x0576;\n t['nparen'] = 0x24A9;\n t['nssquare'] = 0x33B1;\n t['nsuperior'] = 0x207F;\n t['ntilde'] = 0x00F1;\n t['nu'] = 0x03BD;\n t['nuhiragana'] = 0x306C;\n t['nukatakana'] = 0x30CC;\n t['nukatakanahalfwidth'] = 0xFF87;\n t['nuktabengali'] = 0x09BC;\n t['nuktadeva'] = 0x093C;\n t['nuktagujarati'] = 0x0ABC;\n t['nuktagurmukhi'] = 0x0A3C;\n t['numbersign'] = 0x0023;\n t['numbersignmonospace'] = 0xFF03;\n t['numbersignsmall'] = 0xFE5F;\n t['numeralsigngreek'] = 0x0374;\n t['numeralsignlowergreek'] = 0x0375;\n t['numero'] = 0x2116;\n t['nun'] = 0x05E0;\n t['nundagesh'] = 0xFB40;\n t['nundageshhebrew'] = 0xFB40;\n t['nunhebrew'] = 0x05E0;\n t['nvsquare'] = 0x33B5;\n t['nwsquare'] = 0x33BB;\n t['nyabengali'] = 0x099E;\n t['nyadeva'] = 0x091E;\n t['nyagujarati'] = 0x0A9E;\n t['nyagurmukhi'] = 0x0A1E;\n t['o'] = 0x006F;\n t['oacute'] = 0x00F3;\n t['oangthai'] = 0x0E2D;\n t['obarred'] = 0x0275;\n t['obarredcyrillic'] = 0x04E9;\n t['obarreddieresiscyrillic'] = 0x04EB;\n t['obengali'] = 0x0993;\n t['obopomofo'] = 0x311B;\n t['obreve'] = 0x014F;\n t['ocandradeva'] = 0x0911;\n t['ocandragujarati'] = 0x0A91;\n t['ocandravowelsigndeva'] = 0x0949;\n t['ocandravowelsigngujarati'] = 0x0AC9;\n t['ocaron'] = 0x01D2;\n t['ocircle'] = 0x24DE;\n t['ocircumflex'] = 0x00F4;\n t['ocircumflexacute'] = 0x1ED1;\n t['ocircumflexdotbelow'] = 0x1ED9;\n t['ocircumflexgrave'] = 0x1ED3;\n t['ocircumflexhookabove'] = 0x1ED5;\n t['ocircumflextilde'] = 0x1ED7;\n t['ocyrillic'] = 0x043E;\n t['odblacute'] = 0x0151;\n t['odblgrave'] = 0x020D;\n t['odeva'] = 0x0913;\n t['odieresis'] = 0x00F6;\n t['odieresiscyrillic'] = 0x04E7;\n t['odotbelow'] = 0x1ECD;\n t['oe'] = 0x0153;\n t['oekorean'] = 0x315A;\n t['ogonek'] = 0x02DB;\n t['ogonekcmb'] = 0x0328;\n t['ograve'] = 0x00F2;\n t['ogujarati'] = 0x0A93;\n t['oharmenian'] = 0x0585;\n t['ohiragana'] = 0x304A;\n t['ohookabove'] = 0x1ECF;\n t['ohorn'] = 0x01A1;\n t['ohornacute'] = 0x1EDB;\n t['ohorndotbelow'] = 0x1EE3;\n t['ohorngrave'] = 0x1EDD;\n t['ohornhookabove'] = 0x1EDF;\n t['ohorntilde'] = 0x1EE1;\n t['ohungarumlaut'] = 0x0151;\n t['oi'] = 0x01A3;\n t['oinvertedbreve'] = 0x020F;\n t['okatakana'] = 0x30AA;\n t['okatakanahalfwidth'] = 0xFF75;\n t['okorean'] = 0x3157;\n t['olehebrew'] = 0x05AB;\n t['omacron'] = 0x014D;\n t['omacronacute'] = 0x1E53;\n t['omacrongrave'] = 0x1E51;\n t['omdeva'] = 0x0950;\n t['omega'] = 0x03C9;\n t['omega1'] = 0x03D6;\n t['omegacyrillic'] = 0x0461;\n t['omegalatinclosed'] = 0x0277;\n t['omegaroundcyrillic'] = 0x047B;\n t['omegatitlocyrillic'] = 0x047D;\n t['omegatonos'] = 0x03CE;\n t['omgujarati'] = 0x0AD0;\n t['omicron'] = 0x03BF;\n t['omicrontonos'] = 0x03CC;\n t['omonospace'] = 0xFF4F;\n t['one'] = 0x0031;\n t['onearabic'] = 0x0661;\n t['onebengali'] = 0x09E7;\n t['onecircle'] = 0x2460;\n t['onecircleinversesansserif'] = 0x278A;\n t['onedeva'] = 0x0967;\n t['onedotenleader'] = 0x2024;\n t['oneeighth'] = 0x215B;\n t['onefitted'] = 0xF6DC;\n t['onegujarati'] = 0x0AE7;\n t['onegurmukhi'] = 0x0A67;\n t['onehackarabic'] = 0x0661;\n t['onehalf'] = 0x00BD;\n t['onehangzhou'] = 0x3021;\n t['oneideographicparen'] = 0x3220;\n t['oneinferior'] = 0x2081;\n t['onemonospace'] = 0xFF11;\n t['onenumeratorbengali'] = 0x09F4;\n t['oneoldstyle'] = 0xF731;\n t['oneparen'] = 0x2474;\n t['oneperiod'] = 0x2488;\n t['onepersian'] = 0x06F1;\n t['onequarter'] = 0x00BC;\n t['oneroman'] = 0x2170;\n t['onesuperior'] = 0x00B9;\n t['onethai'] = 0x0E51;\n t['onethird'] = 0x2153;\n t['oogonek'] = 0x01EB;\n t['oogonekmacron'] = 0x01ED;\n t['oogurmukhi'] = 0x0A13;\n t['oomatragurmukhi'] = 0x0A4B;\n t['oopen'] = 0x0254;\n t['oparen'] = 0x24AA;\n t['openbullet'] = 0x25E6;\n t['option'] = 0x2325;\n t['ordfeminine'] = 0x00AA;\n t['ordmasculine'] = 0x00BA;\n t['orthogonal'] = 0x221F;\n t['oshortdeva'] = 0x0912;\n t['oshortvowelsigndeva'] = 0x094A;\n t['oslash'] = 0x00F8;\n t['oslashacute'] = 0x01FF;\n t['osmallhiragana'] = 0x3049;\n t['osmallkatakana'] = 0x30A9;\n t['osmallkatakanahalfwidth'] = 0xFF6B;\n t['ostrokeacute'] = 0x01FF;\n t['osuperior'] = 0xF6F0;\n t['otcyrillic'] = 0x047F;\n t['otilde'] = 0x00F5;\n t['otildeacute'] = 0x1E4D;\n t['otildedieresis'] = 0x1E4F;\n t['oubopomofo'] = 0x3121;\n t['overline'] = 0x203E;\n t['overlinecenterline'] = 0xFE4A;\n t['overlinecmb'] = 0x0305;\n t['overlinedashed'] = 0xFE49;\n t['overlinedblwavy'] = 0xFE4C;\n t['overlinewavy'] = 0xFE4B;\n t['overscore'] = 0x00AF;\n t['ovowelsignbengali'] = 0x09CB;\n t['ovowelsigndeva'] = 0x094B;\n t['ovowelsigngujarati'] = 0x0ACB;\n t['p'] = 0x0070;\n t['paampssquare'] = 0x3380;\n t['paasentosquare'] = 0x332B;\n t['pabengali'] = 0x09AA;\n t['pacute'] = 0x1E55;\n t['padeva'] = 0x092A;\n t['pagedown'] = 0x21DF;\n t['pageup'] = 0x21DE;\n t['pagujarati'] = 0x0AAA;\n t['pagurmukhi'] = 0x0A2A;\n t['pahiragana'] = 0x3071;\n t['paiyannoithai'] = 0x0E2F;\n t['pakatakana'] = 0x30D1;\n t['palatalizationcyrilliccmb'] = 0x0484;\n t['palochkacyrillic'] = 0x04C0;\n t['pansioskorean'] = 0x317F;\n t['paragraph'] = 0x00B6;\n t['parallel'] = 0x2225;\n t['parenleft'] = 0x0028;\n t['parenleftaltonearabic'] = 0xFD3E;\n t['parenleftbt'] = 0xF8ED;\n t['parenleftex'] = 0xF8EC;\n t['parenleftinferior'] = 0x208D;\n t['parenleftmonospace'] = 0xFF08;\n t['parenleftsmall'] = 0xFE59;\n t['parenleftsuperior'] = 0x207D;\n t['parenlefttp'] = 0xF8EB;\n t['parenleftvertical'] = 0xFE35;\n t['parenright'] = 0x0029;\n t['parenrightaltonearabic'] = 0xFD3F;\n t['parenrightbt'] = 0xF8F8;\n t['parenrightex'] = 0xF8F7;\n t['parenrightinferior'] = 0x208E;\n t['parenrightmonospace'] = 0xFF09;\n t['parenrightsmall'] = 0xFE5A;\n t['parenrightsuperior'] = 0x207E;\n t['parenrighttp'] = 0xF8F6;\n t['parenrightvertical'] = 0xFE36;\n t['partialdiff'] = 0x2202;\n t['paseqhebrew'] = 0x05C0;\n t['pashtahebrew'] = 0x0599;\n t['pasquare'] = 0x33A9;\n t['patah'] = 0x05B7;\n t['patah11'] = 0x05B7;\n t['patah1d'] = 0x05B7;\n t['patah2a'] = 0x05B7;\n t['patahhebrew'] = 0x05B7;\n t['patahnarrowhebrew'] = 0x05B7;\n t['patahquarterhebrew'] = 0x05B7;\n t['patahwidehebrew'] = 0x05B7;\n t['pazerhebrew'] = 0x05A1;\n t['pbopomofo'] = 0x3106;\n t['pcircle'] = 0x24DF;\n t['pdotaccent'] = 0x1E57;\n t['pe'] = 0x05E4;\n t['pecyrillic'] = 0x043F;\n t['pedagesh'] = 0xFB44;\n t['pedageshhebrew'] = 0xFB44;\n t['peezisquare'] = 0x333B;\n t['pefinaldageshhebrew'] = 0xFB43;\n t['peharabic'] = 0x067E;\n t['peharmenian'] = 0x057A;\n t['pehebrew'] = 0x05E4;\n t['pehfinalarabic'] = 0xFB57;\n t['pehinitialarabic'] = 0xFB58;\n t['pehiragana'] = 0x307A;\n t['pehmedialarabic'] = 0xFB59;\n t['pekatakana'] = 0x30DA;\n t['pemiddlehookcyrillic'] = 0x04A7;\n t['perafehebrew'] = 0xFB4E;\n t['percent'] = 0x0025;\n t['percentarabic'] = 0x066A;\n t['percentmonospace'] = 0xFF05;\n t['percentsmall'] = 0xFE6A;\n t['period'] = 0x002E;\n t['periodarmenian'] = 0x0589;\n t['periodcentered'] = 0x00B7;\n t['periodhalfwidth'] = 0xFF61;\n t['periodinferior'] = 0xF6E7;\n t['periodmonospace'] = 0xFF0E;\n t['periodsmall'] = 0xFE52;\n t['periodsuperior'] = 0xF6E8;\n t['perispomenigreekcmb'] = 0x0342;\n t['perpendicular'] = 0x22A5;\n t['perthousand'] = 0x2030;\n t['peseta'] = 0x20A7;\n t['pfsquare'] = 0x338A;\n t['phabengali'] = 0x09AB;\n t['phadeva'] = 0x092B;\n t['phagujarati'] = 0x0AAB;\n t['phagurmukhi'] = 0x0A2B;\n t['phi'] = 0x03C6;\n t['phi1'] = 0x03D5;\n t['phieuphacirclekorean'] = 0x327A;\n t['phieuphaparenkorean'] = 0x321A;\n t['phieuphcirclekorean'] = 0x326C;\n t['phieuphkorean'] = 0x314D;\n t['phieuphparenkorean'] = 0x320C;\n t['philatin'] = 0x0278;\n t['phinthuthai'] = 0x0E3A;\n t['phisymbolgreek'] = 0x03D5;\n t['phook'] = 0x01A5;\n t['phophanthai'] = 0x0E1E;\n t['phophungthai'] = 0x0E1C;\n t['phosamphaothai'] = 0x0E20;\n t['pi'] = 0x03C0;\n t['pieupacirclekorean'] = 0x3273;\n t['pieupaparenkorean'] = 0x3213;\n t['pieupcieuckorean'] = 0x3176;\n t['pieupcirclekorean'] = 0x3265;\n t['pieupkiyeokkorean'] = 0x3172;\n t['pieupkorean'] = 0x3142;\n t['pieupparenkorean'] = 0x3205;\n t['pieupsioskiyeokkorean'] = 0x3174;\n t['pieupsioskorean'] = 0x3144;\n t['pieupsiostikeutkorean'] = 0x3175;\n t['pieupthieuthkorean'] = 0x3177;\n t['pieuptikeutkorean'] = 0x3173;\n t['pihiragana'] = 0x3074;\n t['pikatakana'] = 0x30D4;\n t['pisymbolgreek'] = 0x03D6;\n t['piwrarmenian'] = 0x0583;\n t['plus'] = 0x002B;\n t['plusbelowcmb'] = 0x031F;\n t['pluscircle'] = 0x2295;\n t['plusminus'] = 0x00B1;\n t['plusmod'] = 0x02D6;\n t['plusmonospace'] = 0xFF0B;\n t['plussmall'] = 0xFE62;\n t['plussuperior'] = 0x207A;\n t['pmonospace'] = 0xFF50;\n t['pmsquare'] = 0x33D8;\n t['pohiragana'] = 0x307D;\n t['pointingindexdownwhite'] = 0x261F;\n t['pointingindexleftwhite'] = 0x261C;\n t['pointingindexrightwhite'] = 0x261E;\n t['pointingindexupwhite'] = 0x261D;\n t['pokatakana'] = 0x30DD;\n t['poplathai'] = 0x0E1B;\n t['postalmark'] = 0x3012;\n t['postalmarkface'] = 0x3020;\n t['pparen'] = 0x24AB;\n t['precedes'] = 0x227A;\n t['prescription'] = 0x211E;\n t['primemod'] = 0x02B9;\n t['primereversed'] = 0x2035;\n t['product'] = 0x220F;\n t['projective'] = 0x2305;\n t['prolongedkana'] = 0x30FC;\n t['propellor'] = 0x2318;\n t['propersubset'] = 0x2282;\n t['propersuperset'] = 0x2283;\n t['proportion'] = 0x2237;\n t['proportional'] = 0x221D;\n t['psi'] = 0x03C8;\n t['psicyrillic'] = 0x0471;\n t['psilipneumatacyrilliccmb'] = 0x0486;\n t['pssquare'] = 0x33B0;\n t['puhiragana'] = 0x3077;\n t['pukatakana'] = 0x30D7;\n t['pvsquare'] = 0x33B4;\n t['pwsquare'] = 0x33BA;\n t['q'] = 0x0071;\n t['qadeva'] = 0x0958;\n t['qadmahebrew'] = 0x05A8;\n t['qafarabic'] = 0x0642;\n t['qaffinalarabic'] = 0xFED6;\n t['qafinitialarabic'] = 0xFED7;\n t['qafmedialarabic'] = 0xFED8;\n t['qamats'] = 0x05B8;\n t['qamats10'] = 0x05B8;\n t['qamats1a'] = 0x05B8;\n t['qamats1c'] = 0x05B8;\n t['qamats27'] = 0x05B8;\n t['qamats29'] = 0x05B8;\n t['qamats33'] = 0x05B8;\n t['qamatsde'] = 0x05B8;\n t['qamatshebrew'] = 0x05B8;\n t['qamatsnarrowhebrew'] = 0x05B8;\n t['qamatsqatanhebrew'] = 0x05B8;\n t['qamatsqatannarrowhebrew'] = 0x05B8;\n t['qamatsqatanquarterhebrew'] = 0x05B8;\n t['qamatsqatanwidehebrew'] = 0x05B8;\n t['qamatsquarterhebrew'] = 0x05B8;\n t['qamatswidehebrew'] = 0x05B8;\n t['qarneyparahebrew'] = 0x059F;\n t['qbopomofo'] = 0x3111;\n t['qcircle'] = 0x24E0;\n t['qhook'] = 0x02A0;\n t['qmonospace'] = 0xFF51;\n t['qof'] = 0x05E7;\n t['qofdagesh'] = 0xFB47;\n t['qofdageshhebrew'] = 0xFB47;\n t['qofhebrew'] = 0x05E7;\n t['qparen'] = 0x24AC;\n t['quarternote'] = 0x2669;\n t['qubuts'] = 0x05BB;\n t['qubuts18'] = 0x05BB;\n t['qubuts25'] = 0x05BB;\n t['qubuts31'] = 0x05BB;\n t['qubutshebrew'] = 0x05BB;\n t['qubutsnarrowhebrew'] = 0x05BB;\n t['qubutsquarterhebrew'] = 0x05BB;\n t['qubutswidehebrew'] = 0x05BB;\n t['question'] = 0x003F;\n t['questionarabic'] = 0x061F;\n t['questionarmenian'] = 0x055E;\n t['questiondown'] = 0x00BF;\n t['questiondownsmall'] = 0xF7BF;\n t['questiongreek'] = 0x037E;\n t['questionmonospace'] = 0xFF1F;\n t['questionsmall'] = 0xF73F;\n t['quotedbl'] = 0x0022;\n t['quotedblbase'] = 0x201E;\n t['quotedblleft'] = 0x201C;\n t['quotedblmonospace'] = 0xFF02;\n t['quotedblprime'] = 0x301E;\n t['quotedblprimereversed'] = 0x301D;\n t['quotedblright'] = 0x201D;\n t['quoteleft'] = 0x2018;\n t['quoteleftreversed'] = 0x201B;\n t['quotereversed'] = 0x201B;\n t['quoteright'] = 0x2019;\n t['quoterightn'] = 0x0149;\n t['quotesinglbase'] = 0x201A;\n t['quotesingle'] = 0x0027;\n t['quotesinglemonospace'] = 0xFF07;\n t['r'] = 0x0072;\n t['raarmenian'] = 0x057C;\n t['rabengali'] = 0x09B0;\n t['racute'] = 0x0155;\n t['radeva'] = 0x0930;\n t['radical'] = 0x221A;\n t['radicalex'] = 0xF8E5;\n t['radoverssquare'] = 0x33AE;\n t['radoverssquaredsquare'] = 0x33AF;\n t['radsquare'] = 0x33AD;\n t['rafe'] = 0x05BF;\n t['rafehebrew'] = 0x05BF;\n t['ragujarati'] = 0x0AB0;\n t['ragurmukhi'] = 0x0A30;\n t['rahiragana'] = 0x3089;\n t['rakatakana'] = 0x30E9;\n t['rakatakanahalfwidth'] = 0xFF97;\n t['ralowerdiagonalbengali'] = 0x09F1;\n t['ramiddlediagonalbengali'] = 0x09F0;\n t['ramshorn'] = 0x0264;\n t['ratio'] = 0x2236;\n t['rbopomofo'] = 0x3116;\n t['rcaron'] = 0x0159;\n t['rcedilla'] = 0x0157;\n t['rcircle'] = 0x24E1;\n t['rcommaaccent'] = 0x0157;\n t['rdblgrave'] = 0x0211;\n t['rdotaccent'] = 0x1E59;\n t['rdotbelow'] = 0x1E5B;\n t['rdotbelowmacron'] = 0x1E5D;\n t['referencemark'] = 0x203B;\n t['reflexsubset'] = 0x2286;\n t['reflexsuperset'] = 0x2287;\n t['registered'] = 0x00AE;\n t['registersans'] = 0xF8E8;\n t['registerserif'] = 0xF6DA;\n t['reharabic'] = 0x0631;\n t['reharmenian'] = 0x0580;\n t['rehfinalarabic'] = 0xFEAE;\n t['rehiragana'] = 0x308C;\n t['rekatakana'] = 0x30EC;\n t['rekatakanahalfwidth'] = 0xFF9A;\n t['resh'] = 0x05E8;\n t['reshdageshhebrew'] = 0xFB48;\n t['reshhebrew'] = 0x05E8;\n t['reversedtilde'] = 0x223D;\n t['reviahebrew'] = 0x0597;\n t['reviamugrashhebrew'] = 0x0597;\n t['revlogicalnot'] = 0x2310;\n t['rfishhook'] = 0x027E;\n t['rfishhookreversed'] = 0x027F;\n t['rhabengali'] = 0x09DD;\n t['rhadeva'] = 0x095D;\n t['rho'] = 0x03C1;\n t['rhook'] = 0x027D;\n t['rhookturned'] = 0x027B;\n t['rhookturnedsuperior'] = 0x02B5;\n t['rhosymbolgreek'] = 0x03F1;\n t['rhotichookmod'] = 0x02DE;\n t['rieulacirclekorean'] = 0x3271;\n t['rieulaparenkorean'] = 0x3211;\n t['rieulcirclekorean'] = 0x3263;\n t['rieulhieuhkorean'] = 0x3140;\n t['rieulkiyeokkorean'] = 0x313A;\n t['rieulkiyeoksioskorean'] = 0x3169;\n t['rieulkorean'] = 0x3139;\n t['rieulmieumkorean'] = 0x313B;\n t['rieulpansioskorean'] = 0x316C;\n t['rieulparenkorean'] = 0x3203;\n t['rieulphieuphkorean'] = 0x313F;\n t['rieulpieupkorean'] = 0x313C;\n t['rieulpieupsioskorean'] = 0x316B;\n t['rieulsioskorean'] = 0x313D;\n t['rieulthieuthkorean'] = 0x313E;\n t['rieultikeutkorean'] = 0x316A;\n t['rieulyeorinhieuhkorean'] = 0x316D;\n t['rightangle'] = 0x221F;\n t['righttackbelowcmb'] = 0x0319;\n t['righttriangle'] = 0x22BF;\n t['rihiragana'] = 0x308A;\n t['rikatakana'] = 0x30EA;\n t['rikatakanahalfwidth'] = 0xFF98;\n t['ring'] = 0x02DA;\n t['ringbelowcmb'] = 0x0325;\n t['ringcmb'] = 0x030A;\n t['ringhalfleft'] = 0x02BF;\n t['ringhalfleftarmenian'] = 0x0559;\n t['ringhalfleftbelowcmb'] = 0x031C;\n t['ringhalfleftcentered'] = 0x02D3;\n t['ringhalfright'] = 0x02BE;\n t['ringhalfrightbelowcmb'] = 0x0339;\n t['ringhalfrightcentered'] = 0x02D2;\n t['rinvertedbreve'] = 0x0213;\n t['rittorusquare'] = 0x3351;\n t['rlinebelow'] = 0x1E5F;\n t['rlongleg'] = 0x027C;\n t['rlonglegturned'] = 0x027A;\n t['rmonospace'] = 0xFF52;\n t['rohiragana'] = 0x308D;\n t['rokatakana'] = 0x30ED;\n t['rokatakanahalfwidth'] = 0xFF9B;\n t['roruathai'] = 0x0E23;\n t['rparen'] = 0x24AD;\n t['rrabengali'] = 0x09DC;\n t['rradeva'] = 0x0931;\n t['rragurmukhi'] = 0x0A5C;\n t['rreharabic'] = 0x0691;\n t['rrehfinalarabic'] = 0xFB8D;\n t['rrvocalicbengali'] = 0x09E0;\n t['rrvocalicdeva'] = 0x0960;\n t['rrvocalicgujarati'] = 0x0AE0;\n t['rrvocalicvowelsignbengali'] = 0x09C4;\n t['rrvocalicvowelsigndeva'] = 0x0944;\n t['rrvocalicvowelsigngujarati'] = 0x0AC4;\n t['rsuperior'] = 0xF6F1;\n t['rtblock'] = 0x2590;\n t['rturned'] = 0x0279;\n t['rturnedsuperior'] = 0x02B4;\n t['ruhiragana'] = 0x308B;\n t['rukatakana'] = 0x30EB;\n t['rukatakanahalfwidth'] = 0xFF99;\n t['rupeemarkbengali'] = 0x09F2;\n t['rupeesignbengali'] = 0x09F3;\n t['rupiah'] = 0xF6DD;\n t['ruthai'] = 0x0E24;\n t['rvocalicbengali'] = 0x098B;\n t['rvocalicdeva'] = 0x090B;\n t['rvocalicgujarati'] = 0x0A8B;\n t['rvocalicvowelsignbengali'] = 0x09C3;\n t['rvocalicvowelsigndeva'] = 0x0943;\n t['rvocalicvowelsigngujarati'] = 0x0AC3;\n t['s'] = 0x0073;\n t['sabengali'] = 0x09B8;\n t['sacute'] = 0x015B;\n t['sacutedotaccent'] = 0x1E65;\n t['sadarabic'] = 0x0635;\n t['sadeva'] = 0x0938;\n t['sadfinalarabic'] = 0xFEBA;\n t['sadinitialarabic'] = 0xFEBB;\n t['sadmedialarabic'] = 0xFEBC;\n t['sagujarati'] = 0x0AB8;\n t['sagurmukhi'] = 0x0A38;\n t['sahiragana'] = 0x3055;\n t['sakatakana'] = 0x30B5;\n t['sakatakanahalfwidth'] = 0xFF7B;\n t['sallallahoualayhewasallamarabic'] = 0xFDFA;\n t['samekh'] = 0x05E1;\n t['samekhdagesh'] = 0xFB41;\n t['samekhdageshhebrew'] = 0xFB41;\n t['samekhhebrew'] = 0x05E1;\n t['saraaathai'] = 0x0E32;\n t['saraaethai'] = 0x0E41;\n t['saraaimaimalaithai'] = 0x0E44;\n t['saraaimaimuanthai'] = 0x0E43;\n t['saraamthai'] = 0x0E33;\n t['saraathai'] = 0x0E30;\n t['saraethai'] = 0x0E40;\n t['saraiileftthai'] = 0xF886;\n t['saraiithai'] = 0x0E35;\n t['saraileftthai'] = 0xF885;\n t['saraithai'] = 0x0E34;\n t['saraothai'] = 0x0E42;\n t['saraueeleftthai'] = 0xF888;\n t['saraueethai'] = 0x0E37;\n t['saraueleftthai'] = 0xF887;\n t['sarauethai'] = 0x0E36;\n t['sarauthai'] = 0x0E38;\n t['sarauuthai'] = 0x0E39;\n t['sbopomofo'] = 0x3119;\n t['scaron'] = 0x0161;\n t['scarondotaccent'] = 0x1E67;\n t['scedilla'] = 0x015F;\n t['schwa'] = 0x0259;\n t['schwacyrillic'] = 0x04D9;\n t['schwadieresiscyrillic'] = 0x04DB;\n t['schwahook'] = 0x025A;\n t['scircle'] = 0x24E2;\n t['scircumflex'] = 0x015D;\n t['scommaaccent'] = 0x0219;\n t['sdotaccent'] = 0x1E61;\n t['sdotbelow'] = 0x1E63;\n t['sdotbelowdotaccent'] = 0x1E69;\n t['seagullbelowcmb'] = 0x033C;\n t['second'] = 0x2033;\n t['secondtonechinese'] = 0x02CA;\n t['section'] = 0x00A7;\n t['seenarabic'] = 0x0633;\n t['seenfinalarabic'] = 0xFEB2;\n t['seeninitialarabic'] = 0xFEB3;\n t['seenmedialarabic'] = 0xFEB4;\n t['segol'] = 0x05B6;\n t['segol13'] = 0x05B6;\n t['segol1f'] = 0x05B6;\n t['segol2c'] = 0x05B6;\n t['segolhebrew'] = 0x05B6;\n t['segolnarrowhebrew'] = 0x05B6;\n t['segolquarterhebrew'] = 0x05B6;\n t['segoltahebrew'] = 0x0592;\n t['segolwidehebrew'] = 0x05B6;\n t['seharmenian'] = 0x057D;\n t['sehiragana'] = 0x305B;\n t['sekatakana'] = 0x30BB;\n t['sekatakanahalfwidth'] = 0xFF7E;\n t['semicolon'] = 0x003B;\n t['semicolonarabic'] = 0x061B;\n t['semicolonmonospace'] = 0xFF1B;\n t['semicolonsmall'] = 0xFE54;\n t['semivoicedmarkkana'] = 0x309C;\n t['semivoicedmarkkanahalfwidth'] = 0xFF9F;\n t['sentisquare'] = 0x3322;\n t['sentosquare'] = 0x3323;\n t['seven'] = 0x0037;\n t['sevenarabic'] = 0x0667;\n t['sevenbengali'] = 0x09ED;\n t['sevencircle'] = 0x2466;\n t['sevencircleinversesansserif'] = 0x2790;\n t['sevendeva'] = 0x096D;\n t['seveneighths'] = 0x215E;\n t['sevengujarati'] = 0x0AED;\n t['sevengurmukhi'] = 0x0A6D;\n t['sevenhackarabic'] = 0x0667;\n t['sevenhangzhou'] = 0x3027;\n t['sevenideographicparen'] = 0x3226;\n t['seveninferior'] = 0x2087;\n t['sevenmonospace'] = 0xFF17;\n t['sevenoldstyle'] = 0xF737;\n t['sevenparen'] = 0x247A;\n t['sevenperiod'] = 0x248E;\n t['sevenpersian'] = 0x06F7;\n t['sevenroman'] = 0x2176;\n t['sevensuperior'] = 0x2077;\n t['seventeencircle'] = 0x2470;\n t['seventeenparen'] = 0x2484;\n t['seventeenperiod'] = 0x2498;\n t['seventhai'] = 0x0E57;\n t['sfthyphen'] = 0x00AD;\n t['shaarmenian'] = 0x0577;\n t['shabengali'] = 0x09B6;\n t['shacyrillic'] = 0x0448;\n t['shaddaarabic'] = 0x0651;\n t['shaddadammaarabic'] = 0xFC61;\n t['shaddadammatanarabic'] = 0xFC5E;\n t['shaddafathaarabic'] = 0xFC60;\n t['shaddakasraarabic'] = 0xFC62;\n t['shaddakasratanarabic'] = 0xFC5F;\n t['shade'] = 0x2592;\n t['shadedark'] = 0x2593;\n t['shadelight'] = 0x2591;\n t['shademedium'] = 0x2592;\n t['shadeva'] = 0x0936;\n t['shagujarati'] = 0x0AB6;\n t['shagurmukhi'] = 0x0A36;\n t['shalshelethebrew'] = 0x0593;\n t['shbopomofo'] = 0x3115;\n t['shchacyrillic'] = 0x0449;\n t['sheenarabic'] = 0x0634;\n t['sheenfinalarabic'] = 0xFEB6;\n t['sheeninitialarabic'] = 0xFEB7;\n t['sheenmedialarabic'] = 0xFEB8;\n t['sheicoptic'] = 0x03E3;\n t['sheqel'] = 0x20AA;\n t['sheqelhebrew'] = 0x20AA;\n t['sheva'] = 0x05B0;\n t['sheva115'] = 0x05B0;\n t['sheva15'] = 0x05B0;\n t['sheva22'] = 0x05B0;\n t['sheva2e'] = 0x05B0;\n t['shevahebrew'] = 0x05B0;\n t['shevanarrowhebrew'] = 0x05B0;\n t['shevaquarterhebrew'] = 0x05B0;\n t['shevawidehebrew'] = 0x05B0;\n t['shhacyrillic'] = 0x04BB;\n t['shimacoptic'] = 0x03ED;\n t['shin'] = 0x05E9;\n t['shindagesh'] = 0xFB49;\n t['shindageshhebrew'] = 0xFB49;\n t['shindageshshindot'] = 0xFB2C;\n t['shindageshshindothebrew'] = 0xFB2C;\n t['shindageshsindot'] = 0xFB2D;\n t['shindageshsindothebrew'] = 0xFB2D;\n t['shindothebrew'] = 0x05C1;\n t['shinhebrew'] = 0x05E9;\n t['shinshindot'] = 0xFB2A;\n t['shinshindothebrew'] = 0xFB2A;\n t['shinsindot'] = 0xFB2B;\n t['shinsindothebrew'] = 0xFB2B;\n t['shook'] = 0x0282;\n t['sigma'] = 0x03C3;\n t['sigma1'] = 0x03C2;\n t['sigmafinal'] = 0x03C2;\n t['sigmalunatesymbolgreek'] = 0x03F2;\n t['sihiragana'] = 0x3057;\n t['sikatakana'] = 0x30B7;\n t['sikatakanahalfwidth'] = 0xFF7C;\n t['siluqhebrew'] = 0x05BD;\n t['siluqlefthebrew'] = 0x05BD;\n t['similar'] = 0x223C;\n t['sindothebrew'] = 0x05C2;\n t['siosacirclekorean'] = 0x3274;\n t['siosaparenkorean'] = 0x3214;\n t['sioscieuckorean'] = 0x317E;\n t['sioscirclekorean'] = 0x3266;\n t['sioskiyeokkorean'] = 0x317A;\n t['sioskorean'] = 0x3145;\n t['siosnieunkorean'] = 0x317B;\n t['siosparenkorean'] = 0x3206;\n t['siospieupkorean'] = 0x317D;\n t['siostikeutkorean'] = 0x317C;\n t['six'] = 0x0036;\n t['sixarabic'] = 0x0666;\n t['sixbengali'] = 0x09EC;\n t['sixcircle'] = 0x2465;\n t['sixcircleinversesansserif'] = 0x278F;\n t['sixdeva'] = 0x096C;\n t['sixgujarati'] = 0x0AEC;\n t['sixgurmukhi'] = 0x0A6C;\n t['sixhackarabic'] = 0x0666;\n t['sixhangzhou'] = 0x3026;\n t['sixideographicparen'] = 0x3225;\n t['sixinferior'] = 0x2086;\n t['sixmonospace'] = 0xFF16;\n t['sixoldstyle'] = 0xF736;\n t['sixparen'] = 0x2479;\n t['sixperiod'] = 0x248D;\n t['sixpersian'] = 0x06F6;\n t['sixroman'] = 0x2175;\n t['sixsuperior'] = 0x2076;\n t['sixteencircle'] = 0x246F;\n t['sixteencurrencydenominatorbengali'] = 0x09F9;\n t['sixteenparen'] = 0x2483;\n t['sixteenperiod'] = 0x2497;\n t['sixthai'] = 0x0E56;\n t['slash'] = 0x002F;\n t['slashmonospace'] = 0xFF0F;\n t['slong'] = 0x017F;\n t['slongdotaccent'] = 0x1E9B;\n t['smileface'] = 0x263A;\n t['smonospace'] = 0xFF53;\n t['sofpasuqhebrew'] = 0x05C3;\n t['softhyphen'] = 0x00AD;\n t['softsigncyrillic'] = 0x044C;\n t['sohiragana'] = 0x305D;\n t['sokatakana'] = 0x30BD;\n t['sokatakanahalfwidth'] = 0xFF7F;\n t['soliduslongoverlaycmb'] = 0x0338;\n t['solidusshortoverlaycmb'] = 0x0337;\n t['sorusithai'] = 0x0E29;\n t['sosalathai'] = 0x0E28;\n t['sosothai'] = 0x0E0B;\n t['sosuathai'] = 0x0E2A;\n t['space'] = 0x0020;\n t['spacehackarabic'] = 0x0020;\n t['spade'] = 0x2660;\n t['spadesuitblack'] = 0x2660;\n t['spadesuitwhite'] = 0x2664;\n t['sparen'] = 0x24AE;\n t['squarebelowcmb'] = 0x033B;\n t['squarecc'] = 0x33C4;\n t['squarecm'] = 0x339D;\n t['squarediagonalcrosshatchfill'] = 0x25A9;\n t['squarehorizontalfill'] = 0x25A4;\n t['squarekg'] = 0x338F;\n t['squarekm'] = 0x339E;\n t['squarekmcapital'] = 0x33CE;\n t['squareln'] = 0x33D1;\n t['squarelog'] = 0x33D2;\n t['squaremg'] = 0x338E;\n t['squaremil'] = 0x33D5;\n t['squaremm'] = 0x339C;\n t['squaremsquared'] = 0x33A1;\n t['squareorthogonalcrosshatchfill'] = 0x25A6;\n t['squareupperlefttolowerrightfill'] = 0x25A7;\n t['squareupperrighttolowerleftfill'] = 0x25A8;\n t['squareverticalfill'] = 0x25A5;\n t['squarewhitewithsmallblack'] = 0x25A3;\n t['srsquare'] = 0x33DB;\n t['ssabengali'] = 0x09B7;\n t['ssadeva'] = 0x0937;\n t['ssagujarati'] = 0x0AB7;\n t['ssangcieuckorean'] = 0x3149;\n t['ssanghieuhkorean'] = 0x3185;\n t['ssangieungkorean'] = 0x3180;\n t['ssangkiyeokkorean'] = 0x3132;\n t['ssangnieunkorean'] = 0x3165;\n t['ssangpieupkorean'] = 0x3143;\n t['ssangsioskorean'] = 0x3146;\n t['ssangtikeutkorean'] = 0x3138;\n t['ssuperior'] = 0xF6F2;\n t['sterling'] = 0x00A3;\n t['sterlingmonospace'] = 0xFFE1;\n t['strokelongoverlaycmb'] = 0x0336;\n t['strokeshortoverlaycmb'] = 0x0335;\n t['subset'] = 0x2282;\n t['subsetnotequal'] = 0x228A;\n t['subsetorequal'] = 0x2286;\n t['succeeds'] = 0x227B;\n t['suchthat'] = 0x220B;\n t['suhiragana'] = 0x3059;\n t['sukatakana'] = 0x30B9;\n t['sukatakanahalfwidth'] = 0xFF7D;\n t['sukunarabic'] = 0x0652;\n t['summation'] = 0x2211;\n t['sun'] = 0x263C;\n t['superset'] = 0x2283;\n t['supersetnotequal'] = 0x228B;\n t['supersetorequal'] = 0x2287;\n t['svsquare'] = 0x33DC;\n t['syouwaerasquare'] = 0x337C;\n t['t'] = 0x0074;\n t['tabengali'] = 0x09A4;\n t['tackdown'] = 0x22A4;\n t['tackleft'] = 0x22A3;\n t['tadeva'] = 0x0924;\n t['tagujarati'] = 0x0AA4;\n t['tagurmukhi'] = 0x0A24;\n t['taharabic'] = 0x0637;\n t['tahfinalarabic'] = 0xFEC2;\n t['tahinitialarabic'] = 0xFEC3;\n t['tahiragana'] = 0x305F;\n t['tahmedialarabic'] = 0xFEC4;\n t['taisyouerasquare'] = 0x337D;\n t['takatakana'] = 0x30BF;\n t['takatakanahalfwidth'] = 0xFF80;\n t['tatweelarabic'] = 0x0640;\n t['tau'] = 0x03C4;\n t['tav'] = 0x05EA;\n t['tavdages'] = 0xFB4A;\n t['tavdagesh'] = 0xFB4A;\n t['tavdageshhebrew'] = 0xFB4A;\n t['tavhebrew'] = 0x05EA;\n t['tbar'] = 0x0167;\n t['tbopomofo'] = 0x310A;\n t['tcaron'] = 0x0165;\n t['tccurl'] = 0x02A8;\n t['tcedilla'] = 0x0163;\n t['tcheharabic'] = 0x0686;\n t['tchehfinalarabic'] = 0xFB7B;\n t['tchehinitialarabic'] = 0xFB7C;\n t['tchehmedialarabic'] = 0xFB7D;\n t['tcircle'] = 0x24E3;\n t['tcircumflexbelow'] = 0x1E71;\n t['tcommaaccent'] = 0x0163;\n t['tdieresis'] = 0x1E97;\n t['tdotaccent'] = 0x1E6B;\n t['tdotbelow'] = 0x1E6D;\n t['tecyrillic'] = 0x0442;\n t['tedescendercyrillic'] = 0x04AD;\n t['teharabic'] = 0x062A;\n t['tehfinalarabic'] = 0xFE96;\n t['tehhahinitialarabic'] = 0xFCA2;\n t['tehhahisolatedarabic'] = 0xFC0C;\n t['tehinitialarabic'] = 0xFE97;\n t['tehiragana'] = 0x3066;\n t['tehjeeminitialarabic'] = 0xFCA1;\n t['tehjeemisolatedarabic'] = 0xFC0B;\n t['tehmarbutaarabic'] = 0x0629;\n t['tehmarbutafinalarabic'] = 0xFE94;\n t['tehmedialarabic'] = 0xFE98;\n t['tehmeeminitialarabic'] = 0xFCA4;\n t['tehmeemisolatedarabic'] = 0xFC0E;\n t['tehnoonfinalarabic'] = 0xFC73;\n t['tekatakana'] = 0x30C6;\n t['tekatakanahalfwidth'] = 0xFF83;\n t['telephone'] = 0x2121;\n t['telephoneblack'] = 0x260E;\n t['telishagedolahebrew'] = 0x05A0;\n t['telishaqetanahebrew'] = 0x05A9;\n t['tencircle'] = 0x2469;\n t['tenideographicparen'] = 0x3229;\n t['tenparen'] = 0x247D;\n t['tenperiod'] = 0x2491;\n t['tenroman'] = 0x2179;\n t['tesh'] = 0x02A7;\n t['tet'] = 0x05D8;\n t['tetdagesh'] = 0xFB38;\n t['tetdageshhebrew'] = 0xFB38;\n t['tethebrew'] = 0x05D8;\n t['tetsecyrillic'] = 0x04B5;\n t['tevirhebrew'] = 0x059B;\n t['tevirlefthebrew'] = 0x059B;\n t['thabengali'] = 0x09A5;\n t['thadeva'] = 0x0925;\n t['thagujarati'] = 0x0AA5;\n t['thagurmukhi'] = 0x0A25;\n t['thalarabic'] = 0x0630;\n t['thalfinalarabic'] = 0xFEAC;\n t['thanthakhatlowleftthai'] = 0xF898;\n t['thanthakhatlowrightthai'] = 0xF897;\n t['thanthakhatthai'] = 0x0E4C;\n t['thanthakhatupperleftthai'] = 0xF896;\n t['theharabic'] = 0x062B;\n t['thehfinalarabic'] = 0xFE9A;\n t['thehinitialarabic'] = 0xFE9B;\n t['thehmedialarabic'] = 0xFE9C;\n t['thereexists'] = 0x2203;\n t['therefore'] = 0x2234;\n t['theta'] = 0x03B8;\n t['theta1'] = 0x03D1;\n t['thetasymbolgreek'] = 0x03D1;\n t['thieuthacirclekorean'] = 0x3279;\n t['thieuthaparenkorean'] = 0x3219;\n t['thieuthcirclekorean'] = 0x326B;\n t['thieuthkorean'] = 0x314C;\n t['thieuthparenkorean'] = 0x320B;\n t['thirteencircle'] = 0x246C;\n t['thirteenparen'] = 0x2480;\n t['thirteenperiod'] = 0x2494;\n t['thonangmonthothai'] = 0x0E11;\n t['thook'] = 0x01AD;\n t['thophuthaothai'] = 0x0E12;\n t['thorn'] = 0x00FE;\n t['thothahanthai'] = 0x0E17;\n t['thothanthai'] = 0x0E10;\n t['thothongthai'] = 0x0E18;\n t['thothungthai'] = 0x0E16;\n t['thousandcyrillic'] = 0x0482;\n t['thousandsseparatorarabic'] = 0x066C;\n t['thousandsseparatorpersian'] = 0x066C;\n t['three'] = 0x0033;\n t['threearabic'] = 0x0663;\n t['threebengali'] = 0x09E9;\n t['threecircle'] = 0x2462;\n t['threecircleinversesansserif'] = 0x278C;\n t['threedeva'] = 0x0969;\n t['threeeighths'] = 0x215C;\n t['threegujarati'] = 0x0AE9;\n t['threegurmukhi'] = 0x0A69;\n t['threehackarabic'] = 0x0663;\n t['threehangzhou'] = 0x3023;\n t['threeideographicparen'] = 0x3222;\n t['threeinferior'] = 0x2083;\n t['threemonospace'] = 0xFF13;\n t['threenumeratorbengali'] = 0x09F6;\n t['threeoldstyle'] = 0xF733;\n t['threeparen'] = 0x2476;\n t['threeperiod'] = 0x248A;\n t['threepersian'] = 0x06F3;\n t['threequarters'] = 0x00BE;\n t['threequartersemdash'] = 0xF6DE;\n t['threeroman'] = 0x2172;\n t['threesuperior'] = 0x00B3;\n t['threethai'] = 0x0E53;\n t['thzsquare'] = 0x3394;\n t['tihiragana'] = 0x3061;\n t['tikatakana'] = 0x30C1;\n t['tikatakanahalfwidth'] = 0xFF81;\n t['tikeutacirclekorean'] = 0x3270;\n t['tikeutaparenkorean'] = 0x3210;\n t['tikeutcirclekorean'] = 0x3262;\n t['tikeutkorean'] = 0x3137;\n t['tikeutparenkorean'] = 0x3202;\n t['tilde'] = 0x02DC;\n t['tildebelowcmb'] = 0x0330;\n t['tildecmb'] = 0x0303;\n t['tildecomb'] = 0x0303;\n t['tildedoublecmb'] = 0x0360;\n t['tildeoperator'] = 0x223C;\n t['tildeoverlaycmb'] = 0x0334;\n t['tildeverticalcmb'] = 0x033E;\n t['timescircle'] = 0x2297;\n t['tipehahebrew'] = 0x0596;\n t['tipehalefthebrew'] = 0x0596;\n t['tippigurmukhi'] = 0x0A70;\n t['titlocyrilliccmb'] = 0x0483;\n t['tiwnarmenian'] = 0x057F;\n t['tlinebelow'] = 0x1E6F;\n t['tmonospace'] = 0xFF54;\n t['toarmenian'] = 0x0569;\n t['tohiragana'] = 0x3068;\n t['tokatakana'] = 0x30C8;\n t['tokatakanahalfwidth'] = 0xFF84;\n t['tonebarextrahighmod'] = 0x02E5;\n t['tonebarextralowmod'] = 0x02E9;\n t['tonebarhighmod'] = 0x02E6;\n t['tonebarlowmod'] = 0x02E8;\n t['tonebarmidmod'] = 0x02E7;\n t['tonefive'] = 0x01BD;\n t['tonesix'] = 0x0185;\n t['tonetwo'] = 0x01A8;\n t['tonos'] = 0x0384;\n t['tonsquare'] = 0x3327;\n t['topatakthai'] = 0x0E0F;\n t['tortoiseshellbracketleft'] = 0x3014;\n t['tortoiseshellbracketleftsmall'] = 0xFE5D;\n t['tortoiseshellbracketleftvertical'] = 0xFE39;\n t['tortoiseshellbracketright'] = 0x3015;\n t['tortoiseshellbracketrightsmall'] = 0xFE5E;\n t['tortoiseshellbracketrightvertical'] = 0xFE3A;\n t['totaothai'] = 0x0E15;\n t['tpalatalhook'] = 0x01AB;\n t['tparen'] = 0x24AF;\n t['trademark'] = 0x2122;\n t['trademarksans'] = 0xF8EA;\n t['trademarkserif'] = 0xF6DB;\n t['tretroflexhook'] = 0x0288;\n t['triagdn'] = 0x25BC;\n t['triaglf'] = 0x25C4;\n t['triagrt'] = 0x25BA;\n t['triagup'] = 0x25B2;\n t['ts'] = 0x02A6;\n t['tsadi'] = 0x05E6;\n t['tsadidagesh'] = 0xFB46;\n t['tsadidageshhebrew'] = 0xFB46;\n t['tsadihebrew'] = 0x05E6;\n t['tsecyrillic'] = 0x0446;\n t['tsere'] = 0x05B5;\n t['tsere12'] = 0x05B5;\n t['tsere1e'] = 0x05B5;\n t['tsere2b'] = 0x05B5;\n t['tserehebrew'] = 0x05B5;\n t['tserenarrowhebrew'] = 0x05B5;\n t['tserequarterhebrew'] = 0x05B5;\n t['tserewidehebrew'] = 0x05B5;\n t['tshecyrillic'] = 0x045B;\n t['tsuperior'] = 0xF6F3;\n t['ttabengali'] = 0x099F;\n t['ttadeva'] = 0x091F;\n t['ttagujarati'] = 0x0A9F;\n t['ttagurmukhi'] = 0x0A1F;\n t['tteharabic'] = 0x0679;\n t['ttehfinalarabic'] = 0xFB67;\n t['ttehinitialarabic'] = 0xFB68;\n t['ttehmedialarabic'] = 0xFB69;\n t['tthabengali'] = 0x09A0;\n t['tthadeva'] = 0x0920;\n t['tthagujarati'] = 0x0AA0;\n t['tthagurmukhi'] = 0x0A20;\n t['tturned'] = 0x0287;\n t['tuhiragana'] = 0x3064;\n t['tukatakana'] = 0x30C4;\n t['tukatakanahalfwidth'] = 0xFF82;\n t['tusmallhiragana'] = 0x3063;\n t['tusmallkatakana'] = 0x30C3;\n t['tusmallkatakanahalfwidth'] = 0xFF6F;\n t['twelvecircle'] = 0x246B;\n t['twelveparen'] = 0x247F;\n t['twelveperiod'] = 0x2493;\n t['twelveroman'] = 0x217B;\n t['twentycircle'] = 0x2473;\n t['twentyhangzhou'] = 0x5344;\n t['twentyparen'] = 0x2487;\n t['twentyperiod'] = 0x249B;\n t['two'] = 0x0032;\n t['twoarabic'] = 0x0662;\n t['twobengali'] = 0x09E8;\n t['twocircle'] = 0x2461;\n t['twocircleinversesansserif'] = 0x278B;\n t['twodeva'] = 0x0968;\n t['twodotenleader'] = 0x2025;\n t['twodotleader'] = 0x2025;\n t['twodotleadervertical'] = 0xFE30;\n t['twogujarati'] = 0x0AE8;\n t['twogurmukhi'] = 0x0A68;\n t['twohackarabic'] = 0x0662;\n t['twohangzhou'] = 0x3022;\n t['twoideographicparen'] = 0x3221;\n t['twoinferior'] = 0x2082;\n t['twomonospace'] = 0xFF12;\n t['twonumeratorbengali'] = 0x09F5;\n t['twooldstyle'] = 0xF732;\n t['twoparen'] = 0x2475;\n t['twoperiod'] = 0x2489;\n t['twopersian'] = 0x06F2;\n t['tworoman'] = 0x2171;\n t['twostroke'] = 0x01BB;\n t['twosuperior'] = 0x00B2;\n t['twothai'] = 0x0E52;\n t['twothirds'] = 0x2154;\n t['u'] = 0x0075;\n t['uacute'] = 0x00FA;\n t['ubar'] = 0x0289;\n t['ubengali'] = 0x0989;\n t['ubopomofo'] = 0x3128;\n t['ubreve'] = 0x016D;\n t['ucaron'] = 0x01D4;\n t['ucircle'] = 0x24E4;\n t['ucircumflex'] = 0x00FB;\n t['ucircumflexbelow'] = 0x1E77;\n t['ucyrillic'] = 0x0443;\n t['udattadeva'] = 0x0951;\n t['udblacute'] = 0x0171;\n t['udblgrave'] = 0x0215;\n t['udeva'] = 0x0909;\n t['udieresis'] = 0x00FC;\n t['udieresisacute'] = 0x01D8;\n t['udieresisbelow'] = 0x1E73;\n t['udieresiscaron'] = 0x01DA;\n t['udieresiscyrillic'] = 0x04F1;\n t['udieresisgrave'] = 0x01DC;\n t['udieresismacron'] = 0x01D6;\n t['udotbelow'] = 0x1EE5;\n t['ugrave'] = 0x00F9;\n t['ugujarati'] = 0x0A89;\n t['ugurmukhi'] = 0x0A09;\n t['uhiragana'] = 0x3046;\n t['uhookabove'] = 0x1EE7;\n t['uhorn'] = 0x01B0;\n t['uhornacute'] = 0x1EE9;\n t['uhorndotbelow'] = 0x1EF1;\n t['uhorngrave'] = 0x1EEB;\n t['uhornhookabove'] = 0x1EED;\n t['uhorntilde'] = 0x1EEF;\n t['uhungarumlaut'] = 0x0171;\n t['uhungarumlautcyrillic'] = 0x04F3;\n t['uinvertedbreve'] = 0x0217;\n t['ukatakana'] = 0x30A6;\n t['ukatakanahalfwidth'] = 0xFF73;\n t['ukcyrillic'] = 0x0479;\n t['ukorean'] = 0x315C;\n t['umacron'] = 0x016B;\n t['umacroncyrillic'] = 0x04EF;\n t['umacrondieresis'] = 0x1E7B;\n t['umatragurmukhi'] = 0x0A41;\n t['umonospace'] = 0xFF55;\n t['underscore'] = 0x005F;\n t['underscoredbl'] = 0x2017;\n t['underscoremonospace'] = 0xFF3F;\n t['underscorevertical'] = 0xFE33;\n t['underscorewavy'] = 0xFE4F;\n t['union'] = 0x222A;\n t['universal'] = 0x2200;\n t['uogonek'] = 0x0173;\n t['uparen'] = 0x24B0;\n t['upblock'] = 0x2580;\n t['upperdothebrew'] = 0x05C4;\n t['upsilon'] = 0x03C5;\n t['upsilondieresis'] = 0x03CB;\n t['upsilondieresistonos'] = 0x03B0;\n t['upsilonlatin'] = 0x028A;\n t['upsilontonos'] = 0x03CD;\n t['uptackbelowcmb'] = 0x031D;\n t['uptackmod'] = 0x02D4;\n t['uragurmukhi'] = 0x0A73;\n t['uring'] = 0x016F;\n t['ushortcyrillic'] = 0x045E;\n t['usmallhiragana'] = 0x3045;\n t['usmallkatakana'] = 0x30A5;\n t['usmallkatakanahalfwidth'] = 0xFF69;\n t['ustraightcyrillic'] = 0x04AF;\n t['ustraightstrokecyrillic'] = 0x04B1;\n t['utilde'] = 0x0169;\n t['utildeacute'] = 0x1E79;\n t['utildebelow'] = 0x1E75;\n t['uubengali'] = 0x098A;\n t['uudeva'] = 0x090A;\n t['uugujarati'] = 0x0A8A;\n t['uugurmukhi'] = 0x0A0A;\n t['uumatragurmukhi'] = 0x0A42;\n t['uuvowelsignbengali'] = 0x09C2;\n t['uuvowelsigndeva'] = 0x0942;\n t['uuvowelsigngujarati'] = 0x0AC2;\n t['uvowelsignbengali'] = 0x09C1;\n t['uvowelsigndeva'] = 0x0941;\n t['uvowelsigngujarati'] = 0x0AC1;\n t['v'] = 0x0076;\n t['vadeva'] = 0x0935;\n t['vagujarati'] = 0x0AB5;\n t['vagurmukhi'] = 0x0A35;\n t['vakatakana'] = 0x30F7;\n t['vav'] = 0x05D5;\n t['vavdagesh'] = 0xFB35;\n t['vavdagesh65'] = 0xFB35;\n t['vavdageshhebrew'] = 0xFB35;\n t['vavhebrew'] = 0x05D5;\n t['vavholam'] = 0xFB4B;\n t['vavholamhebrew'] = 0xFB4B;\n t['vavvavhebrew'] = 0x05F0;\n t['vavyodhebrew'] = 0x05F1;\n t['vcircle'] = 0x24E5;\n t['vdotbelow'] = 0x1E7F;\n t['vecyrillic'] = 0x0432;\n t['veharabic'] = 0x06A4;\n t['vehfinalarabic'] = 0xFB6B;\n t['vehinitialarabic'] = 0xFB6C;\n t['vehmedialarabic'] = 0xFB6D;\n t['vekatakana'] = 0x30F9;\n t['venus'] = 0x2640;\n t['verticalbar'] = 0x007C;\n t['verticallineabovecmb'] = 0x030D;\n t['verticallinebelowcmb'] = 0x0329;\n t['verticallinelowmod'] = 0x02CC;\n t['verticallinemod'] = 0x02C8;\n t['vewarmenian'] = 0x057E;\n t['vhook'] = 0x028B;\n t['vikatakana'] = 0x30F8;\n t['viramabengali'] = 0x09CD;\n t['viramadeva'] = 0x094D;\n t['viramagujarati'] = 0x0ACD;\n t['visargabengali'] = 0x0983;\n t['visargadeva'] = 0x0903;\n t['visargagujarati'] = 0x0A83;\n t['vmonospace'] = 0xFF56;\n t['voarmenian'] = 0x0578;\n t['voicediterationhiragana'] = 0x309E;\n t['voicediterationkatakana'] = 0x30FE;\n t['voicedmarkkana'] = 0x309B;\n t['voicedmarkkanahalfwidth'] = 0xFF9E;\n t['vokatakana'] = 0x30FA;\n t['vparen'] = 0x24B1;\n t['vtilde'] = 0x1E7D;\n t['vturned'] = 0x028C;\n t['vuhiragana'] = 0x3094;\n t['vukatakana'] = 0x30F4;\n t['w'] = 0x0077;\n t['wacute'] = 0x1E83;\n t['waekorean'] = 0x3159;\n t['wahiragana'] = 0x308F;\n t['wakatakana'] = 0x30EF;\n t['wakatakanahalfwidth'] = 0xFF9C;\n t['wakorean'] = 0x3158;\n t['wasmallhiragana'] = 0x308E;\n t['wasmallkatakana'] = 0x30EE;\n t['wattosquare'] = 0x3357;\n t['wavedash'] = 0x301C;\n t['wavyunderscorevertical'] = 0xFE34;\n t['wawarabic'] = 0x0648;\n t['wawfinalarabic'] = 0xFEEE;\n t['wawhamzaabovearabic'] = 0x0624;\n t['wawhamzaabovefinalarabic'] = 0xFE86;\n t['wbsquare'] = 0x33DD;\n t['wcircle'] = 0x24E6;\n t['wcircumflex'] = 0x0175;\n t['wdieresis'] = 0x1E85;\n t['wdotaccent'] = 0x1E87;\n t['wdotbelow'] = 0x1E89;\n t['wehiragana'] = 0x3091;\n t['weierstrass'] = 0x2118;\n t['wekatakana'] = 0x30F1;\n t['wekorean'] = 0x315E;\n t['weokorean'] = 0x315D;\n t['wgrave'] = 0x1E81;\n t['whitebullet'] = 0x25E6;\n t['whitecircle'] = 0x25CB;\n t['whitecircleinverse'] = 0x25D9;\n t['whitecornerbracketleft'] = 0x300E;\n t['whitecornerbracketleftvertical'] = 0xFE43;\n t['whitecornerbracketright'] = 0x300F;\n t['whitecornerbracketrightvertical'] = 0xFE44;\n t['whitediamond'] = 0x25C7;\n t['whitediamondcontainingblacksmalldiamond'] = 0x25C8;\n t['whitedownpointingsmalltriangle'] = 0x25BF;\n t['whitedownpointingtriangle'] = 0x25BD;\n t['whiteleftpointingsmalltriangle'] = 0x25C3;\n t['whiteleftpointingtriangle'] = 0x25C1;\n t['whitelenticularbracketleft'] = 0x3016;\n t['whitelenticularbracketright'] = 0x3017;\n t['whiterightpointingsmalltriangle'] = 0x25B9;\n t['whiterightpointingtriangle'] = 0x25B7;\n t['whitesmallsquare'] = 0x25AB;\n t['whitesmilingface'] = 0x263A;\n t['whitesquare'] = 0x25A1;\n t['whitestar'] = 0x2606;\n t['whitetelephone'] = 0x260F;\n t['whitetortoiseshellbracketleft'] = 0x3018;\n t['whitetortoiseshellbracketright'] = 0x3019;\n t['whiteuppointingsmalltriangle'] = 0x25B5;\n t['whiteuppointingtriangle'] = 0x25B3;\n t['wihiragana'] = 0x3090;\n t['wikatakana'] = 0x30F0;\n t['wikorean'] = 0x315F;\n t['wmonospace'] = 0xFF57;\n t['wohiragana'] = 0x3092;\n t['wokatakana'] = 0x30F2;\n t['wokatakanahalfwidth'] = 0xFF66;\n t['won'] = 0x20A9;\n t['wonmonospace'] = 0xFFE6;\n t['wowaenthai'] = 0x0E27;\n t['wparen'] = 0x24B2;\n t['wring'] = 0x1E98;\n t['wsuperior'] = 0x02B7;\n t['wturned'] = 0x028D;\n t['wynn'] = 0x01BF;\n t['x'] = 0x0078;\n t['xabovecmb'] = 0x033D;\n t['xbopomofo'] = 0x3112;\n t['xcircle'] = 0x24E7;\n t['xdieresis'] = 0x1E8D;\n t['xdotaccent'] = 0x1E8B;\n t['xeharmenian'] = 0x056D;\n t['xi'] = 0x03BE;\n t['xmonospace'] = 0xFF58;\n t['xparen'] = 0x24B3;\n t['xsuperior'] = 0x02E3;\n t['y'] = 0x0079;\n t['yaadosquare'] = 0x334E;\n t['yabengali'] = 0x09AF;\n t['yacute'] = 0x00FD;\n t['yadeva'] = 0x092F;\n t['yaekorean'] = 0x3152;\n t['yagujarati'] = 0x0AAF;\n t['yagurmukhi'] = 0x0A2F;\n t['yahiragana'] = 0x3084;\n t['yakatakana'] = 0x30E4;\n t['yakatakanahalfwidth'] = 0xFF94;\n t['yakorean'] = 0x3151;\n t['yamakkanthai'] = 0x0E4E;\n t['yasmallhiragana'] = 0x3083;\n t['yasmallkatakana'] = 0x30E3;\n t['yasmallkatakanahalfwidth'] = 0xFF6C;\n t['yatcyrillic'] = 0x0463;\n t['ycircle'] = 0x24E8;\n t['ycircumflex'] = 0x0177;\n t['ydieresis'] = 0x00FF;\n t['ydotaccent'] = 0x1E8F;\n t['ydotbelow'] = 0x1EF5;\n t['yeharabic'] = 0x064A;\n t['yehbarreearabic'] = 0x06D2;\n t['yehbarreefinalarabic'] = 0xFBAF;\n t['yehfinalarabic'] = 0xFEF2;\n t['yehhamzaabovearabic'] = 0x0626;\n t['yehhamzaabovefinalarabic'] = 0xFE8A;\n t['yehhamzaaboveinitialarabic'] = 0xFE8B;\n t['yehhamzaabovemedialarabic'] = 0xFE8C;\n t['yehinitialarabic'] = 0xFEF3;\n t['yehmedialarabic'] = 0xFEF4;\n t['yehmeeminitialarabic'] = 0xFCDD;\n t['yehmeemisolatedarabic'] = 0xFC58;\n t['yehnoonfinalarabic'] = 0xFC94;\n t['yehthreedotsbelowarabic'] = 0x06D1;\n t['yekorean'] = 0x3156;\n t['yen'] = 0x00A5;\n t['yenmonospace'] = 0xFFE5;\n t['yeokorean'] = 0x3155;\n t['yeorinhieuhkorean'] = 0x3186;\n t['yerahbenyomohebrew'] = 0x05AA;\n t['yerahbenyomolefthebrew'] = 0x05AA;\n t['yericyrillic'] = 0x044B;\n t['yerudieresiscyrillic'] = 0x04F9;\n t['yesieungkorean'] = 0x3181;\n t['yesieungpansioskorean'] = 0x3183;\n t['yesieungsioskorean'] = 0x3182;\n t['yetivhebrew'] = 0x059A;\n t['ygrave'] = 0x1EF3;\n t['yhook'] = 0x01B4;\n t['yhookabove'] = 0x1EF7;\n t['yiarmenian'] = 0x0575;\n t['yicyrillic'] = 0x0457;\n t['yikorean'] = 0x3162;\n t['yinyang'] = 0x262F;\n t['yiwnarmenian'] = 0x0582;\n t['ymonospace'] = 0xFF59;\n t['yod'] = 0x05D9;\n t['yoddagesh'] = 0xFB39;\n t['yoddageshhebrew'] = 0xFB39;\n t['yodhebrew'] = 0x05D9;\n t['yodyodhebrew'] = 0x05F2;\n t['yodyodpatahhebrew'] = 0xFB1F;\n t['yohiragana'] = 0x3088;\n t['yoikorean'] = 0x3189;\n t['yokatakana'] = 0x30E8;\n t['yokatakanahalfwidth'] = 0xFF96;\n t['yokorean'] = 0x315B;\n t['yosmallhiragana'] = 0x3087;\n t['yosmallkatakana'] = 0x30E7;\n t['yosmallkatakanahalfwidth'] = 0xFF6E;\n t['yotgreek'] = 0x03F3;\n t['yoyaekorean'] = 0x3188;\n t['yoyakorean'] = 0x3187;\n t['yoyakthai'] = 0x0E22;\n t['yoyingthai'] = 0x0E0D;\n t['yparen'] = 0x24B4;\n t['ypogegrammeni'] = 0x037A;\n t['ypogegrammenigreekcmb'] = 0x0345;\n t['yr'] = 0x01A6;\n t['yring'] = 0x1E99;\n t['ysuperior'] = 0x02B8;\n t['ytilde'] = 0x1EF9;\n t['yturned'] = 0x028E;\n t['yuhiragana'] = 0x3086;\n t['yuikorean'] = 0x318C;\n t['yukatakana'] = 0x30E6;\n t['yukatakanahalfwidth'] = 0xFF95;\n t['yukorean'] = 0x3160;\n t['yusbigcyrillic'] = 0x046B;\n t['yusbigiotifiedcyrillic'] = 0x046D;\n t['yuslittlecyrillic'] = 0x0467;\n t['yuslittleiotifiedcyrillic'] = 0x0469;\n t['yusmallhiragana'] = 0x3085;\n t['yusmallkatakana'] = 0x30E5;\n t['yusmallkatakanahalfwidth'] = 0xFF6D;\n t['yuyekorean'] = 0x318B;\n t['yuyeokorean'] = 0x318A;\n t['yyabengali'] = 0x09DF;\n t['yyadeva'] = 0x095F;\n t['z'] = 0x007A;\n t['zaarmenian'] = 0x0566;\n t['zacute'] = 0x017A;\n t['zadeva'] = 0x095B;\n t['zagurmukhi'] = 0x0A5B;\n t['zaharabic'] = 0x0638;\n t['zahfinalarabic'] = 0xFEC6;\n t['zahinitialarabic'] = 0xFEC7;\n t['zahiragana'] = 0x3056;\n t['zahmedialarabic'] = 0xFEC8;\n t['zainarabic'] = 0x0632;\n t['zainfinalarabic'] = 0xFEB0;\n t['zakatakana'] = 0x30B6;\n t['zaqefgadolhebrew'] = 0x0595;\n t['zaqefqatanhebrew'] = 0x0594;\n t['zarqahebrew'] = 0x0598;\n t['zayin'] = 0x05D6;\n t['zayindagesh'] = 0xFB36;\n t['zayindageshhebrew'] = 0xFB36;\n t['zayinhebrew'] = 0x05D6;\n t['zbopomofo'] = 0x3117;\n t['zcaron'] = 0x017E;\n t['zcircle'] = 0x24E9;\n t['zcircumflex'] = 0x1E91;\n t['zcurl'] = 0x0291;\n t['zdot'] = 0x017C;\n t['zdotaccent'] = 0x017C;\n t['zdotbelow'] = 0x1E93;\n t['zecyrillic'] = 0x0437;\n t['zedescendercyrillic'] = 0x0499;\n t['zedieresiscyrillic'] = 0x04DF;\n t['zehiragana'] = 0x305C;\n t['zekatakana'] = 0x30BC;\n t['zero'] = 0x0030;\n t['zeroarabic'] = 0x0660;\n t['zerobengali'] = 0x09E6;\n t['zerodeva'] = 0x0966;\n t['zerogujarati'] = 0x0AE6;\n t['zerogurmukhi'] = 0x0A66;\n t['zerohackarabic'] = 0x0660;\n t['zeroinferior'] = 0x2080;\n t['zeromonospace'] = 0xFF10;\n t['zerooldstyle'] = 0xF730;\n t['zeropersian'] = 0x06F0;\n t['zerosuperior'] = 0x2070;\n t['zerothai'] = 0x0E50;\n t['zerowidthjoiner'] = 0xFEFF;\n t['zerowidthnonjoiner'] = 0x200C;\n t['zerowidthspace'] = 0x200B;\n t['zeta'] = 0x03B6;\n t['zhbopomofo'] = 0x3113;\n t['zhearmenian'] = 0x056A;\n t['zhebrevecyrillic'] = 0x04C2;\n t['zhecyrillic'] = 0x0436;\n t['zhedescendercyrillic'] = 0x0497;\n t['zhedieresiscyrillic'] = 0x04DD;\n t['zihiragana'] = 0x3058;\n t['zikatakana'] = 0x30B8;\n t['zinorhebrew'] = 0x05AE;\n t['zlinebelow'] = 0x1E95;\n t['zmonospace'] = 0xFF5A;\n t['zohiragana'] = 0x305E;\n t['zokatakana'] = 0x30BE;\n t['zparen'] = 0x24B5;\n t['zretroflexhook'] = 0x0290;\n t['zstroke'] = 0x01B6;\n t['zuhiragana'] = 0x305A;\n t['zukatakana'] = 0x30BA;\n t['.notdef'] = 0x0000;\n t['angbracketleftbig'] = 0x2329;\n t['angbracketleftBig'] = 0x2329;\n t['angbracketleftbigg'] = 0x2329;\n t['angbracketleftBigg'] = 0x2329;\n t['angbracketrightBig'] = 0x232A;\n t['angbracketrightbig'] = 0x232A;\n t['angbracketrightBigg'] = 0x232A;\n t['angbracketrightbigg'] = 0x232A;\n t['arrowhookleft'] = 0x21AA;\n t['arrowhookright'] = 0x21A9;\n t['arrowlefttophalf'] = 0x21BC;\n t['arrowleftbothalf'] = 0x21BD;\n t['arrownortheast'] = 0x2197;\n t['arrownorthwest'] = 0x2196;\n t['arrowrighttophalf'] = 0x21C0;\n t['arrowrightbothalf'] = 0x21C1;\n t['arrowsoutheast'] = 0x2198;\n t['arrowsouthwest'] = 0x2199;\n t['backslashbig'] = 0x2216;\n t['backslashBig'] = 0x2216;\n t['backslashBigg'] = 0x2216;\n t['backslashbigg'] = 0x2216;\n t['bardbl'] = 0x2016;\n t['bracehtipdownleft'] = 0xFE37;\n t['bracehtipdownright'] = 0xFE37;\n t['bracehtipupleft'] = 0xFE38;\n t['bracehtipupright'] = 0xFE38;\n t['braceleftBig'] = 0x007B;\n t['braceleftbig'] = 0x007B;\n t['braceleftbigg'] = 0x007B;\n t['braceleftBigg'] = 0x007B;\n t['bracerightBig'] = 0x007D;\n t['bracerightbig'] = 0x007D;\n t['bracerightbigg'] = 0x007D;\n t['bracerightBigg'] = 0x007D;\n t['bracketleftbig'] = 0x005B;\n t['bracketleftBig'] = 0x005B;\n t['bracketleftbigg'] = 0x005B;\n t['bracketleftBigg'] = 0x005B;\n t['bracketrightBig'] = 0x005D;\n t['bracketrightbig'] = 0x005D;\n t['bracketrightbigg'] = 0x005D;\n t['bracketrightBigg'] = 0x005D;\n t['ceilingleftbig'] = 0x2308;\n t['ceilingleftBig'] = 0x2308;\n t['ceilingleftBigg'] = 0x2308;\n t['ceilingleftbigg'] = 0x2308;\n t['ceilingrightbig'] = 0x2309;\n t['ceilingrightBig'] = 0x2309;\n t['ceilingrightbigg'] = 0x2309;\n t['ceilingrightBigg'] = 0x2309;\n t['circledotdisplay'] = 0x2299;\n t['circledottext'] = 0x2299;\n t['circlemultiplydisplay'] = 0x2297;\n t['circlemultiplytext'] = 0x2297;\n t['circleplusdisplay'] = 0x2295;\n t['circleplustext'] = 0x2295;\n t['contintegraldisplay'] = 0x222E;\n t['contintegraltext'] = 0x222E;\n t['coproductdisplay'] = 0x2210;\n t['coproducttext'] = 0x2210;\n t['floorleftBig'] = 0x230A;\n t['floorleftbig'] = 0x230A;\n t['floorleftbigg'] = 0x230A;\n t['floorleftBigg'] = 0x230A;\n t['floorrightbig'] = 0x230B;\n t['floorrightBig'] = 0x230B;\n t['floorrightBigg'] = 0x230B;\n t['floorrightbigg'] = 0x230B;\n t['hatwide'] = 0x0302;\n t['hatwider'] = 0x0302;\n t['hatwidest'] = 0x0302;\n t['intercal'] = 0x1D40;\n t['integraldisplay'] = 0x222B;\n t['integraltext'] = 0x222B;\n t['intersectiondisplay'] = 0x22C2;\n t['intersectiontext'] = 0x22C2;\n t['logicalanddisplay'] = 0x2227;\n t['logicalandtext'] = 0x2227;\n t['logicalordisplay'] = 0x2228;\n t['logicalortext'] = 0x2228;\n t['parenleftBig'] = 0x0028;\n t['parenleftbig'] = 0x0028;\n t['parenleftBigg'] = 0x0028;\n t['parenleftbigg'] = 0x0028;\n t['parenrightBig'] = 0x0029;\n t['parenrightbig'] = 0x0029;\n t['parenrightBigg'] = 0x0029;\n t['parenrightbigg'] = 0x0029;\n t['prime'] = 0x2032;\n t['productdisplay'] = 0x220F;\n t['producttext'] = 0x220F;\n t['radicalbig'] = 0x221A;\n t['radicalBig'] = 0x221A;\n t['radicalBigg'] = 0x221A;\n t['radicalbigg'] = 0x221A;\n t['radicalbt'] = 0x221A;\n t['radicaltp'] = 0x221A;\n t['radicalvertex'] = 0x221A;\n t['slashbig'] = 0x002F;\n t['slashBig'] = 0x002F;\n t['slashBigg'] = 0x002F;\n t['slashbigg'] = 0x002F;\n t['summationdisplay'] = 0x2211;\n t['summationtext'] = 0x2211;\n t['tildewide'] = 0x02DC;\n t['tildewider'] = 0x02DC;\n t['tildewidest'] = 0x02DC;\n t['uniondisplay'] = 0x22C3;\n t['unionmultidisplay'] = 0x228E;\n t['unionmultitext'] = 0x228E;\n t['unionsqdisplay'] = 0x2294;\n t['unionsqtext'] = 0x2294;\n t['uniontext'] = 0x22C3;\n t['vextenddouble'] = 0x2225;\n t['vextendsingle'] = 0x2223;\n});\nvar getDingbatsGlyphsUnicode = getLookupTableFactory(function (t) {\n t['space'] = 0x0020;\n t['a1'] = 0x2701;\n t['a2'] = 0x2702;\n t['a202'] = 0x2703;\n t['a3'] = 0x2704;\n t['a4'] = 0x260E;\n t['a5'] = 0x2706;\n t['a119'] = 0x2707;\n t['a118'] = 0x2708;\n t['a117'] = 0x2709;\n t['a11'] = 0x261B;\n t['a12'] = 0x261E;\n t['a13'] = 0x270C;\n t['a14'] = 0x270D;\n t['a15'] = 0x270E;\n t['a16'] = 0x270F;\n t['a105'] = 0x2710;\n t['a17'] = 0x2711;\n t['a18'] = 0x2712;\n t['a19'] = 0x2713;\n t['a20'] = 0x2714;\n t['a21'] = 0x2715;\n t['a22'] = 0x2716;\n t['a23'] = 0x2717;\n t['a24'] = 0x2718;\n t['a25'] = 0x2719;\n t['a26'] = 0x271A;\n t['a27'] = 0x271B;\n t['a28'] = 0x271C;\n t['a6'] = 0x271D;\n t['a7'] = 0x271E;\n t['a8'] = 0x271F;\n t['a9'] = 0x2720;\n t['a10'] = 0x2721;\n t['a29'] = 0x2722;\n t['a30'] = 0x2723;\n t['a31'] = 0x2724;\n t['a32'] = 0x2725;\n t['a33'] = 0x2726;\n t['a34'] = 0x2727;\n t['a35'] = 0x2605;\n t['a36'] = 0x2729;\n t['a37'] = 0x272A;\n t['a38'] = 0x272B;\n t['a39'] = 0x272C;\n t['a40'] = 0x272D;\n t['a41'] = 0x272E;\n t['a42'] = 0x272F;\n t['a43'] = 0x2730;\n t['a44'] = 0x2731;\n t['a45'] = 0x2732;\n t['a46'] = 0x2733;\n t['a47'] = 0x2734;\n t['a48'] = 0x2735;\n t['a49'] = 0x2736;\n t['a50'] = 0x2737;\n t['a51'] = 0x2738;\n t['a52'] = 0x2739;\n t['a53'] = 0x273A;\n t['a54'] = 0x273B;\n t['a55'] = 0x273C;\n t['a56'] = 0x273D;\n t['a57'] = 0x273E;\n t['a58'] = 0x273F;\n t['a59'] = 0x2740;\n t['a60'] = 0x2741;\n t['a61'] = 0x2742;\n t['a62'] = 0x2743;\n t['a63'] = 0x2744;\n t['a64'] = 0x2745;\n t['a65'] = 0x2746;\n t['a66'] = 0x2747;\n t['a67'] = 0x2748;\n t['a68'] = 0x2749;\n t['a69'] = 0x274A;\n t['a70'] = 0x274B;\n t['a71'] = 0x25CF;\n t['a72'] = 0x274D;\n t['a73'] = 0x25A0;\n t['a74'] = 0x274F;\n t['a203'] = 0x2750;\n t['a75'] = 0x2751;\n t['a204'] = 0x2752;\n t['a76'] = 0x25B2;\n t['a77'] = 0x25BC;\n t['a78'] = 0x25C6;\n t['a79'] = 0x2756;\n t['a81'] = 0x25D7;\n t['a82'] = 0x2758;\n t['a83'] = 0x2759;\n t['a84'] = 0x275A;\n t['a97'] = 0x275B;\n t['a98'] = 0x275C;\n t['a99'] = 0x275D;\n t['a100'] = 0x275E;\n t['a101'] = 0x2761;\n t['a102'] = 0x2762;\n t['a103'] = 0x2763;\n t['a104'] = 0x2764;\n t['a106'] = 0x2765;\n t['a107'] = 0x2766;\n t['a108'] = 0x2767;\n t['a112'] = 0x2663;\n t['a111'] = 0x2666;\n t['a110'] = 0x2665;\n t['a109'] = 0x2660;\n t['a120'] = 0x2460;\n t['a121'] = 0x2461;\n t['a122'] = 0x2462;\n t['a123'] = 0x2463;\n t['a124'] = 0x2464;\n t['a125'] = 0x2465;\n t['a126'] = 0x2466;\n t['a127'] = 0x2467;\n t['a128'] = 0x2468;\n t['a129'] = 0x2469;\n t['a130'] = 0x2776;\n t['a131'] = 0x2777;\n t['a132'] = 0x2778;\n t['a133'] = 0x2779;\n t['a134'] = 0x277A;\n t['a135'] = 0x277B;\n t['a136'] = 0x277C;\n t['a137'] = 0x277D;\n t['a138'] = 0x277E;\n t['a139'] = 0x277F;\n t['a140'] = 0x2780;\n t['a141'] = 0x2781;\n t['a142'] = 0x2782;\n t['a143'] = 0x2783;\n t['a144'] = 0x2784;\n t['a145'] = 0x2785;\n t['a146'] = 0x2786;\n t['a147'] = 0x2787;\n t['a148'] = 0x2788;\n t['a149'] = 0x2789;\n t['a150'] = 0x278A;\n t['a151'] = 0x278B;\n t['a152'] = 0x278C;\n t['a153'] = 0x278D;\n t['a154'] = 0x278E;\n t['a155'] = 0x278F;\n t['a156'] = 0x2790;\n t['a157'] = 0x2791;\n t['a158'] = 0x2792;\n t['a159'] = 0x2793;\n t['a160'] = 0x2794;\n t['a161'] = 0x2192;\n t['a163'] = 0x2194;\n t['a164'] = 0x2195;\n t['a196'] = 0x2798;\n t['a165'] = 0x2799;\n t['a192'] = 0x279A;\n t['a166'] = 0x279B;\n t['a167'] = 0x279C;\n t['a168'] = 0x279D;\n t['a169'] = 0x279E;\n t['a170'] = 0x279F;\n t['a171'] = 0x27A0;\n t['a172'] = 0x27A1;\n t['a173'] = 0x27A2;\n t['a162'] = 0x27A3;\n t['a174'] = 0x27A4;\n t['a175'] = 0x27A5;\n t['a176'] = 0x27A6;\n t['a177'] = 0x27A7;\n t['a178'] = 0x27A8;\n t['a179'] = 0x27A9;\n t['a193'] = 0x27AA;\n t['a180'] = 0x27AB;\n t['a199'] = 0x27AC;\n t['a181'] = 0x27AD;\n t['a200'] = 0x27AE;\n t['a182'] = 0x27AF;\n t['a201'] = 0x27B1;\n t['a183'] = 0x27B2;\n t['a184'] = 0x27B3;\n t['a197'] = 0x27B4;\n t['a185'] = 0x27B5;\n t['a194'] = 0x27B6;\n t['a198'] = 0x27B7;\n t['a186'] = 0x27B8;\n t['a195'] = 0x27B9;\n t['a187'] = 0x27BA;\n t['a188'] = 0x27BB;\n t['a189'] = 0x27BC;\n t['a190'] = 0x27BD;\n t['a191'] = 0x27BE;\n t['a89'] = 0x2768;\n t['a90'] = 0x2769;\n t['a93'] = 0x276A;\n t['a94'] = 0x276B;\n t['a91'] = 0x276C;\n t['a92'] = 0x276D;\n t['a205'] = 0x276E;\n t['a85'] = 0x276F;\n t['a206'] = 0x2770;\n t['a86'] = 0x2771;\n t['a87'] = 0x2772;\n t['a88'] = 0x2773;\n t['a95'] = 0x2774;\n t['a96'] = 0x2775;\n t['.notdef'] = 0x0000;\n});\nexports.getGlyphsUnicode = getGlyphsUnicode;\nexports.getDingbatsGlyphsUnicode = getDingbatsGlyphsUnicode;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PostScriptCompiler = exports.PostScriptEvaluator = exports.PDFFunction = exports.isPDFFunction = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _ps_parser = __w_pdfjs_require__(33);\n\nvar PDFFunction = function PDFFunctionClosure() {\n  var CONSTRUCT_SAMPLED = 0;\n  var CONSTRUCT_INTERPOLATED = 2;\n  var CONSTRUCT_STICHED = 3;\n  var CONSTRUCT_POSTSCRIPT = 4;\n  return {\n    getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps, str) {\n      var i, ii;\n      var length = 1;\n      for (i = 0, ii = size.length; i < ii; i++) {\n        length *= size[i];\n      }\n      length *= outputSize;\n      var array = new Array(length);\n      var codeSize = 0;\n      var codeBuf = 0;\n      var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);\n      var strBytes = str.getBytes((length * bps + 7) / 8);\n      var strIdx = 0;\n      for (i = 0; i < length; i++) {\n        while (codeSize < bps) {\n          codeBuf <<= 8;\n          codeBuf |= strBytes[strIdx++];\n          codeSize += 8;\n        }\n        codeSize -= bps;\n        array[i] = (codeBuf >> codeSize) * sampleMul;\n        codeBuf &= (1 << codeSize) - 1;\n      }\n      return array;\n    },\n    getIR: function PDFFunction_getIR(xref, fn) {\n      var dict = fn.dict;\n      if (!dict) {\n        dict = fn;\n      }\n      var types = [this.constructSampled, null, this.constructInterpolated, this.constructStiched, this.constructPostScript];\n      var typeNum = dict.get('FunctionType');\n      var typeFn = types[typeNum];\n      if (!typeFn) {\n        throw new _util.FormatError('Unknown type of function');\n      }\n      return typeFn.call(this, fn, dict, xref);\n    },\n    fromIR: function PDFFunction_fromIR(IR) {\n      var type = IR[0];\n      switch (type) {\n        case CONSTRUCT_SAMPLED:\n          return this.constructSampledFromIR(IR);\n        case CONSTRUCT_INTERPOLATED:\n          return this.constructInterpolatedFromIR(IR);\n        case CONSTRUCT_STICHED:\n          return this.constructStichedFromIR(IR);\n        default:\n          return this.constructPostScriptFromIR(IR);\n      }\n    },\n    parse: function PDFFunction_parse(xref, fn) {\n      var IR = this.getIR(xref, fn);\n      return this.fromIR(IR);\n    },\n    parseArray: function PDFFunction_parseArray(xref, fnObj) {\n      if (!(0, _util.isArray)(fnObj)) {\n        return this.parse(xref, fnObj);\n      }\n      var fnArray = [];\n      for (var j = 0, jj = fnObj.length; j < jj; j++) {\n        var obj = xref.fetchIfRef(fnObj[j]);\n        fnArray.push(PDFFunction.parse(xref, obj));\n      }\n      return function (src, srcOffset, dest, destOffset) {\n        for (var i = 0, ii = fnArray.length; i < ii; i++) {\n          fnArray[i](src, srcOffset, dest, destOffset + i);\n        }\n      };\n    },\n    constructSampled: function PDFFunction_constructSampled(str, dict) {\n      function toMultiArray(arr) {\n        var inputLength = arr.length;\n        var out = [];\n        var index = 0;\n        for (var i = 0; i < inputLength; i += 2) {\n          out[index] = [arr[i], arr[i + 1]];\n          ++index;\n        }\n        return out;\n      }\n      var domain = dict.getArray('Domain');\n      var range = dict.getArray('Range');\n      if (!domain || !range) {\n        throw new _util.FormatError('No domain or range');\n      }\n      var inputSize = domain.length / 2;\n      var outputSize = range.length / 2;\n      domain = toMultiArray(domain);\n      range = toMultiArray(range);\n      var size = dict.get('Size');\n      var bps = dict.get('BitsPerSample');\n      var order = dict.get('Order') || 1;\n      if (order !== 1) {\n        (0, _util.info)('No support for cubic spline interpolation: ' + order);\n      }\n      var encode = dict.getArray('Encode');\n      if (!encode) {\n        encode = [];\n        for (var i = 0; i < inputSize; ++i) {\n          encode.push(0);\n          encode.push(size[i] - 1);\n        }\n      }\n      encode = toMultiArray(encode);\n      var decode = dict.getArray('Decode');\n      if (!decode) {\n        decode = range;\n      } else {\n        decode = toMultiArray(decode);\n      }\n      var samples = this.getSampleArray(size, outputSize, bps, str);\n      return [CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size, outputSize, Math.pow(2, bps) - 1, range];\n    },\n    constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) {\n      function interpolate(x, xmin, xmax, ymin, ymax) {\n        return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin));\n      }\n      return function constructSampledFromIRResult(src, srcOffset, dest, destOffset) {\n        var m = IR[1];\n        var domain = IR[2];\n        var encode = IR[3];\n        var decode = IR[4];\n        var samples = IR[5];\n        var size = IR[6];\n        var n = IR[7];\n        var range = IR[9];\n        var cubeVertices = 1 << m;\n        var cubeN = new Float64Array(cubeVertices);\n        var cubeVertex = new Uint32Array(cubeVertices);\n        var i, j;\n        for (j = 0; j < cubeVertices; j++) {\n          cubeN[j] = 1;\n        }\n        var k = n,\n            pos = 1;\n        for (i = 0; i < m; ++i) {\n          var domain_2i = domain[i][0];\n          var domain_2i_1 = domain[i][1];\n          var xi = Math.min(Math.max(src[srcOffset + i], domain_2i), domain_2i_1);\n          var e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]);\n          var size_i = size[i];\n          e = Math.min(Math.max(e, 0), size_i - 1);\n          var e0 = e < size_i - 1 ? Math.floor(e) : e - 1;\n          var n0 = e0 + 1 - e;\n          var n1 = e - e0;\n          var offset0 = e0 * k;\n          var offset1 = offset0 + k;\n          for (j = 0; j < cubeVertices; j++) {\n            if (j & pos) {\n              cubeN[j] *= n1;\n              cubeVertex[j] += offset1;\n            } else {\n              cubeN[j] *= n0;\n              cubeVertex[j] += offset0;\n            }\n          }\n          k *= size_i;\n          pos <<= 1;\n        }\n        for (j = 0; j < n; ++j) {\n          var rj = 0;\n          for (i = 0; i < cubeVertices; i++) {\n            rj += samples[cubeVertex[i] + j] * cubeN[i];\n          }\n          rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);\n          dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);\n        }\n      };\n    },\n    constructInterpolated: function PDFFunction_constructInterpolated(str, dict) {\n      var c0 = dict.getArray('C0') || [0];\n      var c1 = dict.getArray('C1') || [1];\n      var n = dict.get('N');\n      if (!(0, _util.isArray)(c0) || !(0, _util.isArray)(c1)) {\n        throw new _util.FormatError('Illegal dictionary for interpolated function');\n      }\n      var length = c0.length;\n      var diff = [];\n      for (var i = 0; i < length; ++i) {\n        diff.push(c1[i] - c0[i]);\n      }\n      return [CONSTRUCT_INTERPOLATED, c0, diff, n];\n    },\n    constructInterpolatedFromIR: function PDFFunction_constructInterpolatedFromIR(IR) {\n      var c0 = IR[1];\n      var diff = IR[2];\n      var n = IR[3];\n      var length = diff.length;\n      return function constructInterpolatedFromIRResult(src, srcOffset, dest, destOffset) {\n        var x = n === 1 ? src[srcOffset] : Math.pow(src[srcOffset], n);\n        for (var j = 0; j < length; ++j) {\n          dest[destOffset + j] = c0[j] + x * diff[j];\n        }\n      };\n    },\n    constructStiched: function PDFFunction_constructStiched(fn, dict, xref) {\n      var domain = dict.getArray('Domain');\n      if (!domain) {\n        throw new _util.FormatError('No domain');\n      }\n      var inputSize = domain.length / 2;\n      if (inputSize !== 1) {\n        throw new _util.FormatError('Bad domain for stiched function');\n      }\n      var fnRefs = dict.get('Functions');\n      var fns = [];\n      for (var i = 0, ii = fnRefs.length; i < ii; ++i) {\n        fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i])));\n      }\n      var bounds = dict.getArray('Bounds');\n      var encode = dict.getArray('Encode');\n      return [CONSTRUCT_STICHED, domain, bounds, encode, fns];\n    },\n    constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) {\n      var domain = IR[1];\n      var bounds = IR[2];\n      var encode = IR[3];\n      var fnsIR = IR[4];\n      var fns = [];\n      var tmpBuf = new Float32Array(1);\n      for (var i = 0, ii = fnsIR.length; i < ii; i++) {\n        fns.push(PDFFunction.fromIR(fnsIR[i]));\n      }\n      return function constructStichedFromIRResult(src, srcOffset, dest, destOffset) {\n        var clip = function constructStichedFromIRClip(v, min, max) {\n          if (v > max) {\n            v = max;\n          } else if (v < min) {\n            v = min;\n          }\n          return v;\n        };\n        var v = clip(src[srcOffset], domain[0], domain[1]);\n        for (var i = 0, ii = bounds.length; i < ii; ++i) {\n          if (v < bounds[i]) {\n            break;\n          }\n        }\n        var dmin = domain[0];\n        if (i > 0) {\n          dmin = bounds[i - 1];\n        }\n        var dmax = domain[1];\n        if (i < bounds.length) {\n          dmax = bounds[i];\n        }\n        var rmin = encode[2 * i];\n        var rmax = encode[2 * i + 1];\n        tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);\n        fns[i](tmpBuf, 0, dest, destOffset);\n      };\n    },\n    constructPostScript: function PDFFunction_constructPostScript(fn, dict, xref) {\n      var domain = dict.getArray('Domain');\n      var range = dict.getArray('Range');\n      if (!domain) {\n        throw new _util.FormatError('No domain.');\n      }\n      if (!range) {\n        throw new _util.FormatError('No range.');\n      }\n      var lexer = new _ps_parser.PostScriptLexer(fn);\n      var parser = new _ps_parser.PostScriptParser(lexer);\n      var code = parser.parse();\n      return [CONSTRUCT_POSTSCRIPT, domain, range, code];\n    },\n    constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR(IR) {\n      var domain = IR[1];\n      var range = IR[2];\n      var code = IR[3];\n      var compiled = new PostScriptCompiler().compile(code, domain, range);\n      if (compiled) {\n        return new Function('src', 'srcOffset', 'dest', 'destOffset', compiled);\n      }\n      (0, _util.info)('Unable to compile PS function');\n      var numOutputs = range.length >> 1;\n      var numInputs = domain.length >> 1;\n      var evaluator = new PostScriptEvaluator(code);\n      var cache = Object.create(null);\n      var MAX_CACHE_SIZE = 2048 * 4;\n      var cache_available = MAX_CACHE_SIZE;\n      var tmpBuf = new Float32Array(numInputs);\n      return function constructPostScriptFromIRResult(src, srcOffset, dest, destOffset) {\n        var i, value;\n        var key = '';\n        var input = tmpBuf;\n        for (i = 0; i < numInputs; i++) {\n          value = src[srcOffset + i];\n          input[i] = value;\n          key += value + '_';\n        }\n        var cachedValue = cache[key];\n        if (cachedValue !== undefined) {\n          dest.set(cachedValue, destOffset);\n          return;\n        }\n        var output = new Float32Array(numOutputs);\n        var stack = evaluator.execute(input);\n        var stackIndex = stack.length - numOutputs;\n        for (i = 0; i < numOutputs; i++) {\n          value = stack[stackIndex + i];\n          var bound = range[i * 2];\n          if (value < bound) {\n            value = bound;\n          } else {\n            bound = range[i * 2 + 1];\n            if (value > bound) {\n              value = bound;\n            }\n          }\n          output[i] = value;\n        }\n        if (cache_available > 0) {\n          cache_available--;\n          cache[key] = output;\n        }\n        dest.set(output, destOffset);\n      };\n    }\n  };\n}();\nfunction isPDFFunction(v) {\n  var fnDict;\n  if ((typeof v === 'undefined' ? 'undefined' : _typeof(v)) !== 'object') {\n    return false;\n  } else if ((0, _primitives.isDict)(v)) {\n    fnDict = v;\n  } else if ((0, _primitives.isStream)(v)) {\n    fnDict = v.dict;\n  } else {\n    return false;\n  }\n  return fnDict.has('FunctionType');\n}\nvar PostScriptStack = function PostScriptStackClosure() {\n  var MAX_STACK_SIZE = 100;\n  function PostScriptStack(initialStack) {\n    this.stack = !initialStack ? [] : Array.prototype.slice.call(initialStack, 0);\n  }\n  PostScriptStack.prototype = {\n    push: function PostScriptStack_push(value) {\n      if (this.stack.length >= MAX_STACK_SIZE) {\n        throw new Error('PostScript function stack overflow.');\n      }\n      this.stack.push(value);\n    },\n    pop: function PostScriptStack_pop() {\n      if (this.stack.length <= 0) {\n        throw new Error('PostScript function stack underflow.');\n      }\n      return this.stack.pop();\n    },\n    copy: function PostScriptStack_copy(n) {\n      if (this.stack.length + n >= MAX_STACK_SIZE) {\n        throw new Error('PostScript function stack overflow.');\n      }\n      var stack = this.stack;\n      for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) {\n        stack.push(stack[i]);\n      }\n    },\n    index: function PostScriptStack_index(n) {\n      this.push(this.stack[this.stack.length - n - 1]);\n    },\n    roll: function PostScriptStack_roll(n, p) {\n      var stack = this.stack;\n      var l = stack.length - n;\n      var r = stack.length - 1,\n          c = l + (p - Math.floor(p / n) * n),\n          i,\n          j,\n          t;\n      for (i = l, j = r; i < j; i++, j--) {\n        t = stack[i];\n        stack[i] = stack[j];\n        stack[j] = t;\n      }\n      for (i = l, j = c - 1; i < j; i++, j--) {\n        t = stack[i];\n        stack[i] = stack[j];\n        stack[j] = t;\n      }\n      for (i = c, j = r; i < j; i++, j--) {\n        t = stack[i];\n        stack[i] = stack[j];\n        stack[j] = t;\n      }\n    }\n  };\n  return PostScriptStack;\n}();\nvar PostScriptEvaluator = function PostScriptEvaluatorClosure() {\n  function PostScriptEvaluator(operators) {\n    this.operators = operators;\n  }\n  PostScriptEvaluator.prototype = {\n    execute: function PostScriptEvaluator_execute(initialStack) {\n      var stack = new PostScriptStack(initialStack);\n      var counter = 0;\n      var operators = this.operators;\n      var length = operators.length;\n      var operator, a, b;\n      while (counter < length) {\n        operator = operators[counter++];\n        if (typeof operator === 'number') {\n          stack.push(operator);\n          continue;\n        }\n        switch (operator) {\n          case 'jz':\n            b = stack.pop();\n            a = stack.pop();\n            if (!a) {\n              counter = b;\n            }\n            break;\n          case 'j':\n            a = stack.pop();\n            counter = a;\n            break;\n          case 'abs':\n            a = stack.pop();\n            stack.push(Math.abs(a));\n            break;\n          case 'add':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a + b);\n            break;\n          case 'and':\n            b = stack.pop();\n            a = stack.pop();\n            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {\n              stack.push(a && b);\n            } else {\n              stack.push(a & b);\n            }\n            break;\n          case 'atan':\n            a = stack.pop();\n            stack.push(Math.atan(a));\n            break;\n          case 'bitshift':\n            b = stack.pop();\n            a = stack.pop();\n            if (a > 0) {\n              stack.push(a << b);\n            } else {\n              stack.push(a >> b);\n            }\n            break;\n          case 'ceiling':\n            a = stack.pop();\n            stack.push(Math.ceil(a));\n            break;\n          case 'copy':\n            a = stack.pop();\n            stack.copy(a);\n            break;\n          case 'cos':\n            a = stack.pop();\n            stack.push(Math.cos(a));\n            break;\n          case 'cvi':\n            a = stack.pop() | 0;\n            stack.push(a);\n            break;\n          case 'cvr':\n            break;\n          case 'div':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a / b);\n            break;\n          case 'dup':\n            stack.copy(1);\n            break;\n          case 'eq':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a === b);\n            break;\n          case 'exch':\n            stack.roll(2, 1);\n            break;\n          case 'exp':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(Math.pow(a, b));\n            break;\n          case 'false':\n            stack.push(false);\n            break;\n          case 'floor':\n            a = stack.pop();\n            stack.push(Math.floor(a));\n            break;\n          case 'ge':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a >= b);\n            break;\n          case 'gt':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a > b);\n            break;\n          case 'idiv':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a / b | 0);\n            break;\n          case 'index':\n            a = stack.pop();\n            stack.index(a);\n            break;\n          case 'le':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a <= b);\n            break;\n          case 'ln':\n            a = stack.pop();\n            stack.push(Math.log(a));\n            break;\n          case 'log':\n            a = stack.pop();\n            stack.push(Math.log(a) / Math.LN10);\n            break;\n          case 'lt':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a < b);\n            break;\n          case 'mod':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a % b);\n            break;\n          case 'mul':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a * b);\n            break;\n          case 'ne':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a !== b);\n            break;\n          case 'neg':\n            a = stack.pop();\n            stack.push(-a);\n            break;\n          case 'not':\n            a = stack.pop();\n            if ((0, _util.isBool)(a)) {\n              stack.push(!a);\n            } else {\n              stack.push(~a);\n            }\n            break;\n          case 'or':\n            b = stack.pop();\n            a = stack.pop();\n            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {\n              stack.push(a || b);\n            } else {\n              stack.push(a | b);\n            }\n            break;\n          case 'pop':\n            stack.pop();\n            break;\n          case 'roll':\n            b = stack.pop();\n            a = stack.pop();\n            stack.roll(a, b);\n            break;\n          case 'round':\n            a = stack.pop();\n            stack.push(Math.round(a));\n            break;\n          case 'sin':\n            a = stack.pop();\n            stack.push(Math.sin(a));\n            break;\n          case 'sqrt':\n            a = stack.pop();\n            stack.push(Math.sqrt(a));\n            break;\n          case 'sub':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a - b);\n            break;\n          case 'true':\n            stack.push(true);\n            break;\n          case 'truncate':\n            a = stack.pop();\n            a = a < 0 ? Math.ceil(a) : Math.floor(a);\n            stack.push(a);\n            break;\n          case 'xor':\n            b = stack.pop();\n            a = stack.pop();\n            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {\n              stack.push(a !== b);\n            } else {\n              stack.push(a ^ b);\n            }\n            break;\n          default:\n            throw new _util.FormatError('Unknown operator ' + operator);\n        }\n      }\n      return stack.stack;\n    }\n  };\n  return PostScriptEvaluator;\n}();\nvar PostScriptCompiler = function PostScriptCompilerClosure() {\n  function AstNode(type) {\n    this.type = type;\n  }\n  AstNode.prototype.visit = function (visitor) {\n    throw new Error('abstract method');\n  };\n  function AstArgument(index, min, max) {\n    AstNode.call(this, 'args');\n    this.index = index;\n    this.min = min;\n    this.max = max;\n  }\n  AstArgument.prototype = Object.create(AstNode.prototype);\n  AstArgument.prototype.visit = function (visitor) {\n    visitor.visitArgument(this);\n  };\n  function AstLiteral(number) {\n    AstNode.call(this, 'literal');\n    this.number = number;\n    this.min = number;\n    this.max = number;\n  }\n  AstLiteral.prototype = Object.create(AstNode.prototype);\n  AstLiteral.prototype.visit = function (visitor) {\n    visitor.visitLiteral(this);\n  };\n  function AstBinaryOperation(op, arg1, arg2, min, max) {\n    AstNode.call(this, 'binary');\n    this.op = op;\n    this.arg1 = arg1;\n    this.arg2 = arg2;\n    this.min = min;\n    this.max = max;\n  }\n  AstBinaryOperation.prototype = Object.create(AstNode.prototype);\n  AstBinaryOperation.prototype.visit = function (visitor) {\n    visitor.visitBinaryOperation(this);\n  };\n  function AstMin(arg, max) {\n    AstNode.call(this, 'max');\n    this.arg = arg;\n    this.min = arg.min;\n    this.max = max;\n  }\n  AstMin.prototype = Object.create(AstNode.prototype);\n  AstMin.prototype.visit = function (visitor) {\n    visitor.visitMin(this);\n  };\n  function AstVariable(index, min, max) {\n    AstNode.call(this, 'var');\n    this.index = index;\n    this.min = min;\n    this.max = max;\n  }\n  AstVariable.prototype = Object.create(AstNode.prototype);\n  AstVariable.prototype.visit = function (visitor) {\n    visitor.visitVariable(this);\n  };\n  function AstVariableDefinition(variable, arg) {\n    AstNode.call(this, 'definition');\n    this.variable = variable;\n    this.arg = arg;\n  }\n  AstVariableDefinition.prototype = Object.create(AstNode.prototype);\n  AstVariableDefinition.prototype.visit = function (visitor) {\n    visitor.visitVariableDefinition(this);\n  };\n  function ExpressionBuilderVisitor() {\n    this.parts = [];\n  }\n  ExpressionBuilderVisitor.prototype = {\n    visitArgument: function visitArgument(arg) {\n      this.parts.push('Math.max(', arg.min, ', Math.min(', arg.max, ', src[srcOffset + ', arg.index, ']))');\n    },\n    visitVariable: function visitVariable(variable) {\n      this.parts.push('v', variable.index);\n    },\n    visitLiteral: function visitLiteral(literal) {\n      this.parts.push(literal.number);\n    },\n    visitBinaryOperation: function visitBinaryOperation(operation) {\n      this.parts.push('(');\n      operation.arg1.visit(this);\n      this.parts.push(' ', operation.op, ' ');\n      operation.arg2.visit(this);\n      this.parts.push(')');\n    },\n    visitVariableDefinition: function visitVariableDefinition(definition) {\n      this.parts.push('var ');\n      definition.variable.visit(this);\n      this.parts.push(' = ');\n      definition.arg.visit(this);\n      this.parts.push(';');\n    },\n    visitMin: function visitMin(max) {\n      this.parts.push('Math.min(');\n      max.arg.visit(this);\n      this.parts.push(', ', max.max, ')');\n    },\n    toString: function toString() {\n      return this.parts.join('');\n    }\n  };\n  function buildAddOperation(num1, num2) {\n    if (num2.type === 'literal' && num2.number === 0) {\n      return num1;\n    }\n    if (num1.type === 'literal' && num1.number === 0) {\n      return num2;\n    }\n    if (num2.type === 'literal' && num1.type === 'literal') {\n      return new AstLiteral(num1.number + num2.number);\n    }\n    return new AstBinaryOperation('+', num1, num2, num1.min + num2.min, num1.max + num2.max);\n  }\n  function buildMulOperation(num1, num2) {\n    if (num2.type === 'literal') {\n      if (num2.number === 0) {\n        return new AstLiteral(0);\n      } else if (num2.number === 1) {\n        return num1;\n      } else if (num1.type === 'literal') {\n        return new AstLiteral(num1.number * num2.number);\n      }\n    }\n    if (num1.type === 'literal') {\n      if (num1.number === 0) {\n        return new AstLiteral(0);\n      } else if (num1.number === 1) {\n        return num2;\n      }\n    }\n    var min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);\n    var max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);\n    return new AstBinaryOperation('*', num1, num2, min, max);\n  }\n  function buildSubOperation(num1, num2) {\n    if (num2.type === 'literal') {\n      if (num2.number === 0) {\n        return num1;\n      } else if (num1.type === 'literal') {\n        return new AstLiteral(num1.number - num2.number);\n      }\n    }\n    if (num2.type === 'binary' && num2.op === '-' && num1.type === 'literal' && num1.number === 1 && num2.arg1.type === 'literal' && num2.arg1.number === 1) {\n      return num2.arg2;\n    }\n    return new AstBinaryOperation('-', num1, num2, num1.min - num2.max, num1.max - num2.min);\n  }\n  function buildMinOperation(num1, max) {\n    if (num1.min >= max) {\n      return new AstLiteral(max);\n    } else if (num1.max <= max) {\n      return num1;\n    }\n    return new AstMin(num1, max);\n  }\n  function PostScriptCompiler() {}\n  PostScriptCompiler.prototype = {\n    compile: function PostScriptCompiler_compile(code, domain, range) {\n      var stack = [];\n      var i, ii;\n      var instructions = [];\n      var inputSize = domain.length >> 1,\n          outputSize = range.length >> 1;\n      var lastRegister = 0;\n      var n, j;\n      var num1, num2, ast1, ast2, tmpVar, item;\n      for (i = 0; i < inputSize; i++) {\n        stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1]));\n      }\n      for (i = 0, ii = code.length; i < ii; i++) {\n        item = code[i];\n        if (typeof item === 'number') {\n          stack.push(new AstLiteral(item));\n          continue;\n        }\n        switch (item) {\n          case 'add':\n            if (stack.length < 2) {\n              return null;\n            }\n            num2 = stack.pop();\n            num1 = stack.pop();\n            stack.push(buildAddOperation(num1, num2));\n            break;\n          case 'cvr':\n            if (stack.length < 1) {\n              return null;\n            }\n            break;\n          case 'mul':\n            if (stack.length < 2) {\n              return null;\n            }\n            num2 = stack.pop();\n            num1 = stack.pop();\n            stack.push(buildMulOperation(num1, num2));\n            break;\n          case 'sub':\n            if (stack.length < 2) {\n              return null;\n            }\n            num2 = stack.pop();\n            num1 = stack.pop();\n            stack.push(buildSubOperation(num1, num2));\n            break;\n          case 'exch':\n            if (stack.length < 2) {\n              return null;\n            }\n            ast1 = stack.pop();\n            ast2 = stack.pop();\n            stack.push(ast1, ast2);\n            break;\n          case 'pop':\n            if (stack.length < 1) {\n              return null;\n            }\n            stack.pop();\n            break;\n          case 'index':\n            if (stack.length < 1) {\n              return null;\n            }\n            num1 = stack.pop();\n            if (num1.type !== 'literal') {\n              return null;\n            }\n            n = num1.number;\n            if (n < 0 || (n | 0) !== n || stack.length < n) {\n              return null;\n            }\n            ast1 = stack[stack.length - n - 1];\n            if (ast1.type === 'literal' || ast1.type === 'var') {\n              stack.push(ast1);\n              break;\n            }\n            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);\n            stack[stack.length - n - 1] = tmpVar;\n            stack.push(tmpVar);\n            instructions.push(new AstVariableDefinition(tmpVar, ast1));\n            break;\n          case 'dup':\n            if (stack.length < 1) {\n              return null;\n            }\n            if (typeof code[i + 1] === 'number' && code[i + 2] === 'gt' && code[i + 3] === i + 7 && code[i + 4] === 'jz' && code[i + 5] === 'pop' && code[i + 6] === code[i + 1]) {\n              num1 = stack.pop();\n              stack.push(buildMinOperation(num1, code[i + 1]));\n              i += 6;\n              break;\n            }\n            ast1 = stack[stack.length - 1];\n            if (ast1.type === 'literal' || ast1.type === 'var') {\n              stack.push(ast1);\n              break;\n            }\n            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);\n            stack[stack.length - 1] = tmpVar;\n            stack.push(tmpVar);\n            instructions.push(new AstVariableDefinition(tmpVar, ast1));\n            break;\n          case 'roll':\n            if (stack.length < 2) {\n              return null;\n            }\n            num2 = stack.pop();\n            num1 = stack.pop();\n            if (num2.type !== 'literal' || num1.type !== 'literal') {\n              return null;\n            }\n            j = num2.number;\n            n = num1.number;\n            if (n <= 0 || (n | 0) !== n || (j | 0) !== j || stack.length < n) {\n              return null;\n            }\n            j = (j % n + n) % n;\n            if (j === 0) {\n              break;\n            }\n            Array.prototype.push.apply(stack, stack.splice(stack.length - n, n - j));\n            break;\n          default:\n            return null;\n        }\n      }\n      if (stack.length !== outputSize) {\n        return null;\n      }\n      var result = [];\n      instructions.forEach(function (instruction) {\n        var statementBuilder = new ExpressionBuilderVisitor();\n        instruction.visit(statementBuilder);\n        result.push(statementBuilder.toString());\n      });\n      stack.forEach(function (expr, i) {\n        var statementBuilder = new ExpressionBuilderVisitor();\n        expr.visit(statementBuilder);\n        var min = range[i * 2],\n            max = range[i * 2 + 1];\n        var out = [statementBuilder.toString()];\n        if (min > expr.min) {\n          out.unshift('Math.max(', min, ', ');\n          out.push(')');\n        }\n        if (max < expr.max) {\n          out.unshift('Math.min(', max, ', ');\n          out.push(')');\n        }\n        out.unshift('dest[destOffset + ', i, '] = ');\n        out.push(';');\n        result.push(out.join(''));\n      });\n      return result.join('\\n');\n    }\n  };\n  return PostScriptCompiler;\n}();\nexports.isPDFFunction = isPDFFunction;\nexports.PDFFunction = PDFFunction;\nexports.PostScriptEvaluator = PostScriptEvaluator;\nexports.PostScriptCompiler = PostScriptCompiler;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\nvar getLookupTableFactory = __w_pdfjs_require__(0).getLookupTableFactory;\nvar getSpecialPUASymbols = getLookupTableFactory(function (t) {\n t[63721] = 0x00A9;\n t[63193] = 0x00A9;\n t[63720] = 0x00AE;\n t[63194] = 0x00AE;\n t[63722] = 0x2122;\n t[63195] = 0x2122;\n t[63729] = 0x23A7;\n t[63730] = 0x23A8;\n t[63731] = 0x23A9;\n t[63740] = 0x23AB;\n t[63741] = 0x23AC;\n t[63742] = 0x23AD;\n t[63726] = 0x23A1;\n t[63727] = 0x23A2;\n t[63728] = 0x23A3;\n t[63737] = 0x23A4;\n t[63738] = 0x23A5;\n t[63739] = 0x23A6;\n t[63723] = 0x239B;\n t[63724] = 0x239C;\n t[63725] = 0x239D;\n t[63734] = 0x239E;\n t[63735] = 0x239F;\n t[63736] = 0x23A0;\n});\nfunction mapSpecialUnicodeValues(code) {\n if (code >= 0xFFF0 && code <= 0xFFFF) {\n  return 0;\n } else if (code >= 0xF600 && code <= 0xF8FF) {\n  return getSpecialPUASymbols()[code] || code;\n }\n return code;\n}\nfunction getUnicodeForGlyph(name, glyphsUnicodeMap) {\n var unicode = glyphsUnicodeMap[name];\n if (unicode !== undefined) {\n  return unicode;\n }\n if (!name) {\n  return -1;\n }\n if (name[0] === 'u') {\n  var nameLen = name.length, hexStr;\n  if (nameLen === 7 && name[1] === 'n' && name[2] === 'i') {\n   hexStr = name.substr(3);\n  } else if (nameLen >= 5 && nameLen <= 7) {\n   hexStr = name.substr(1);\n  } else {\n   return -1;\n  }\n  if (hexStr === hexStr.toUpperCase()) {\n   unicode = parseInt(hexStr, 16);\n   if (unicode >= 0) {\n    return unicode;\n   }\n  }\n }\n return -1;\n}\nvar UnicodeRanges = [\n {\n  'begin': 0x0000,\n  'end': 0x007F\n },\n {\n  'begin': 0x0080,\n  'end': 0x00FF\n },\n {\n  'begin': 0x0100,\n  'end': 0x017F\n },\n {\n  'begin': 0x0180,\n  'end': 0x024F\n },\n {\n  'begin': 0x0250,\n  'end': 0x02AF\n },\n {\n  'begin': 0x02B0,\n  'end': 0x02FF\n },\n {\n  'begin': 0x0300,\n  'end': 0x036F\n },\n {\n  'begin': 0x0370,\n  'end': 0x03FF\n },\n {\n  'begin': 0x2C80,\n  'end': 0x2CFF\n },\n {\n  'begin': 0x0400,\n  'end': 0x04FF\n },\n {\n  'begin': 0x0530,\n  'end': 0x058F\n },\n {\n  'begin': 0x0590,\n  'end': 0x05FF\n },\n {\n  'begin': 0xA500,\n  'end': 0xA63F\n },\n {\n  'begin': 0x0600,\n  'end': 0x06FF\n },\n {\n  'begin': 0x07C0,\n  'end': 0x07FF\n },\n {\n  'begin': 0x0900,\n  'end': 0x097F\n },\n {\n  'begin': 0x0980,\n  'end': 0x09FF\n },\n {\n  'begin': 0x0A00,\n  'end': 0x0A7F\n },\n {\n  'begin': 0x0A80,\n  'end': 0x0AFF\n },\n {\n  'begin': 0x0B00,\n  'end': 0x0B7F\n },\n {\n  'begin': 0x0B80,\n  'end': 0x0BFF\n },\n {\n  'begin': 0x0C00,\n  'end': 0x0C7F\n },\n {\n  'begin': 0x0C80,\n  'end': 0x0CFF\n },\n {\n  'begin': 0x0D00,\n  'end': 0x0D7F\n },\n {\n  'begin': 0x0E00,\n  'end': 0x0E7F\n },\n {\n  'begin': 0x0E80,\n  'end': 0x0EFF\n },\n {\n  'begin': 0x10A0,\n  'end': 0x10FF\n },\n {\n  'begin': 0x1B00,\n  'end': 0x1B7F\n },\n {\n  'begin': 0x1100,\n  'end': 0x11FF\n },\n {\n  'begin': 0x1E00,\n  'end': 0x1EFF\n },\n {\n  'begin': 0x1F00,\n  'end': 0x1FFF\n },\n {\n  'begin': 0x2000,\n  'end': 0x206F\n },\n {\n  'begin': 0x2070,\n  'end': 0x209F\n },\n {\n  'begin': 0x20A0,\n  'end': 0x20CF\n },\n {\n  'begin': 0x20D0,\n  'end': 0x20FF\n },\n {\n  'begin': 0x2100,\n  'end': 0x214F\n },\n {\n  'begin': 0x2150,\n  'end': 0x218F\n },\n {\n  'begin': 0x2190,\n  'end': 0x21FF\n },\n {\n  'begin': 0x2200,\n  'end': 0x22FF\n },\n {\n  'begin': 0x2300,\n  'end': 0x23FF\n },\n {\n  'begin': 0x2400,\n  'end': 0x243F\n },\n {\n  'begin': 0x2440,\n  'end': 0x245F\n },\n {\n  'begin': 0x2460,\n  'end': 0x24FF\n },\n {\n  'begin': 0x2500,\n  'end': 0x257F\n },\n {\n  'begin': 0x2580,\n  'end': 0x259F\n },\n {\n  'begin': 0x25A0,\n  'end': 0x25FF\n },\n {\n  'begin': 0x2600,\n  'end': 0x26FF\n },\n {\n  'begin': 0x2700,\n  'end': 0x27BF\n },\n {\n  'begin': 0x3000,\n  'end': 0x303F\n },\n {\n  'begin': 0x3040,\n  'end': 0x309F\n },\n {\n  'begin': 0x30A0,\n  'end': 0x30FF\n },\n {\n  'begin': 0x3100,\n  'end': 0x312F\n },\n {\n  'begin': 0x3130,\n  'end': 0x318F\n },\n {\n  'begin': 0xA840,\n  'end': 0xA87F\n },\n {\n  'begin': 0x3200,\n  'end': 0x32FF\n },\n {\n  'begin': 0x3300,\n  'end': 0x33FF\n },\n {\n  'begin': 0xAC00,\n  'end': 0xD7AF\n },\n {\n  'begin': 0xD800,\n  'end': 0xDFFF\n },\n {\n  'begin': 0x10900,\n  'end': 0x1091F\n },\n {\n  'begin': 0x4E00,\n  'end': 0x9FFF\n },\n {\n  'begin': 0xE000,\n  'end': 0xF8FF\n },\n {\n  'begin': 0x31C0,\n  'end': 0x31EF\n },\n {\n  'begin': 0xFB00,\n  'end': 0xFB4F\n },\n {\n  'begin': 0xFB50,\n  'end': 0xFDFF\n },\n {\n  'begin': 0xFE20,\n  'end': 0xFE2F\n },\n {\n  'begin': 0xFE10,\n  'end': 0xFE1F\n },\n {\n  'begin': 0xFE50,\n  'end': 0xFE6F\n },\n {\n  'begin': 0xFE70,\n  'end': 0xFEFF\n },\n {\n  'begin': 0xFF00,\n  'end': 0xFFEF\n },\n {\n  'begin': 0xFFF0,\n  'end': 0xFFFF\n },\n {\n  'begin': 0x0F00,\n  'end': 0x0FFF\n },\n {\n  'begin': 0x0700,\n  'end': 0x074F\n },\n {\n  'begin': 0x0780,\n  'end': 0x07BF\n },\n {\n  'begin': 0x0D80,\n  'end': 0x0DFF\n },\n {\n  'begin': 0x1000,\n  'end': 0x109F\n },\n {\n  'begin': 0x1200,\n  'end': 0x137F\n },\n {\n  'begin': 0x13A0,\n  'end': 0x13FF\n },\n {\n  'begin': 0x1400,\n  'end': 0x167F\n },\n {\n  'begin': 0x1680,\n  'end': 0x169F\n },\n {\n  'begin': 0x16A0,\n  'end': 0x16FF\n },\n {\n  'begin': 0x1780,\n  'end': 0x17FF\n },\n {\n  'begin': 0x1800,\n  'end': 0x18AF\n },\n {\n  'begin': 0x2800,\n  'end': 0x28FF\n },\n {\n  'begin': 0xA000,\n  'end': 0xA48F\n },\n {\n  'begin': 0x1700,\n  'end': 0x171F\n },\n {\n  'begin': 0x10300,\n  'end': 0x1032F\n },\n {\n  'begin': 0x10330,\n  'end': 0x1034F\n },\n {\n  'begin': 0x10400,\n  'end': 0x1044F\n },\n {\n  'begin': 0x1D000,\n  'end': 0x1D0FF\n },\n {\n  'begin': 0x1D400,\n  'end': 0x1D7FF\n },\n {\n  'begin': 0xFF000,\n  'end': 0xFFFFD\n },\n {\n  'begin': 0xFE00,\n  'end': 0xFE0F\n },\n {\n  'begin': 0xE0000,\n  'end': 0xE007F\n },\n {\n  'begin': 0x1900,\n  'end': 0x194F\n },\n {\n  'begin': 0x1950,\n  'end': 0x197F\n },\n {\n  'begin': 0x1980,\n  'end': 0x19DF\n },\n {\n  'begin': 0x1A00,\n  'end': 0x1A1F\n },\n {\n  'begin': 0x2C00,\n  'end': 0x2C5F\n },\n {\n  'begin': 0x2D30,\n  'end': 0x2D7F\n },\n {\n  'begin': 0x4DC0,\n  'end': 0x4DFF\n },\n {\n  'begin': 0xA800,\n  'end': 0xA82F\n },\n {\n  'begin': 0x10000,\n  'end': 0x1007F\n },\n {\n  'begin': 0x10140,\n  'end': 0x1018F\n },\n {\n  'begin': 0x10380,\n  'end': 0x1039F\n },\n {\n  'begin': 0x103A0,\n  'end': 0x103DF\n },\n {\n  'begin': 0x10450,\n  'end': 0x1047F\n },\n {\n  'begin': 0x10480,\n  'end': 0x104AF\n },\n {\n  'begin': 0x10800,\n  'end': 0x1083F\n },\n {\n  'begin': 0x10A00,\n  'end': 0x10A5F\n },\n {\n  'begin': 0x1D300,\n  'end': 0x1D35F\n },\n {\n  'begin': 0x12000,\n  'end': 0x123FF\n },\n {\n  'begin': 0x1D360,\n  'end': 0x1D37F\n },\n {\n  'begin': 0x1B80,\n  'end': 0x1BBF\n },\n {\n  'begin': 0x1C00,\n  'end': 0x1C4F\n },\n {\n  'begin': 0x1C50,\n  'end': 0x1C7F\n },\n {\n  'begin': 0xA880,\n  'end': 0xA8DF\n },\n {\n  'begin': 0xA900,\n  'end': 0xA92F\n },\n {\n  'begin': 0xA930,\n  'end': 0xA95F\n },\n {\n  'begin': 0xAA00,\n  'end': 0xAA5F\n },\n {\n  'begin': 0x10190,\n  'end': 0x101CF\n },\n {\n  'begin': 0x101D0,\n  'end': 0x101FF\n },\n {\n  'begin': 0x102A0,\n  'end': 0x102DF\n },\n {\n  'begin': 0x1F030,\n  'end': 0x1F09F\n }\n];\nfunction getUnicodeRangeFor(value) {\n for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {\n  var range = UnicodeRanges[i];\n  if (value >= range.begin && value < range.end) {\n   return i;\n  }\n }\n return -1;\n}\nfunction isRTLRangeFor(value) {\n var range = UnicodeRanges[13];\n if (value >= range.begin && value < range.end) {\n  return true;\n }\n range = UnicodeRanges[11];\n if (value >= range.begin && value < range.end) {\n  return true;\n }\n return false;\n}\nvar getNormalizedUnicodes = getLookupTableFactory(function (t) {\n t['\\u00A8'] = '\\u0020\\u0308';\n t['\\u00AF'] = '\\u0020\\u0304';\n t['\\u00B4'] = '\\u0020\\u0301';\n t['\\u00B5'] = '\\u03BC';\n t['\\u00B8'] = '\\u0020\\u0327';\n t['\\u0132'] = '\\u0049\\u004A';\n t['\\u0133'] = '\\u0069\\u006A';\n t['\\u013F'] = '\\u004C\\u00B7';\n t['\\u0140'] = '\\u006C\\u00B7';\n t['\\u0149'] = '\\u02BC\\u006E';\n t['\\u017F'] = '\\u0073';\n t['\\u01C4'] = '\\u0044\\u017D';\n t['\\u01C5'] = '\\u0044\\u017E';\n t['\\u01C6'] = '\\u0064\\u017E';\n t['\\u01C7'] = '\\u004C\\u004A';\n t['\\u01C8'] = '\\u004C\\u006A';\n t['\\u01C9'] = '\\u006C\\u006A';\n t['\\u01CA'] = '\\u004E\\u004A';\n t['\\u01CB'] = '\\u004E\\u006A';\n t['\\u01CC'] = '\\u006E\\u006A';\n t['\\u01F1'] = '\\u0044\\u005A';\n t['\\u01F2'] = '\\u0044\\u007A';\n t['\\u01F3'] = '\\u0064\\u007A';\n t['\\u02D8'] = '\\u0020\\u0306';\n t['\\u02D9'] = '\\u0020\\u0307';\n t['\\u02DA'] = '\\u0020\\u030A';\n t['\\u02DB'] = '\\u0020\\u0328';\n t['\\u02DC'] = '\\u0020\\u0303';\n t['\\u02DD'] = '\\u0020\\u030B';\n t['\\u037A'] = '\\u0020\\u0345';\n t['\\u0384'] = '\\u0020\\u0301';\n t['\\u03D0'] = '\\u03B2';\n t['\\u03D1'] = '\\u03B8';\n t['\\u03D2'] = '\\u03A5';\n t['\\u03D5'] = '\\u03C6';\n t['\\u03D6'] = '\\u03C0';\n t['\\u03F0'] = '\\u03BA';\n t['\\u03F1'] = '\\u03C1';\n t['\\u03F2'] = '\\u03C2';\n t['\\u03F4'] = '\\u0398';\n t['\\u03F5'] = '\\u03B5';\n t['\\u03F9'] = '\\u03A3';\n t['\\u0587'] = '\\u0565\\u0582';\n t['\\u0675'] = '\\u0627\\u0674';\n t['\\u0676'] = '\\u0648\\u0674';\n t['\\u0677'] = '\\u06C7\\u0674';\n t['\\u0678'] = '\\u064A\\u0674';\n t['\\u0E33'] = '\\u0E4D\\u0E32';\n t['\\u0EB3'] = '\\u0ECD\\u0EB2';\n t['\\u0EDC'] = '\\u0EAB\\u0E99';\n t['\\u0EDD'] = '\\u0EAB\\u0EA1';\n t['\\u0F77'] = '\\u0FB2\\u0F81';\n t['\\u0F79'] = '\\u0FB3\\u0F81';\n t['\\u1E9A'] = '\\u0061\\u02BE';\n t['\\u1FBD'] = '\\u0020\\u0313';\n t['\\u1FBF'] = '\\u0020\\u0313';\n t['\\u1FC0'] = '\\u0020\\u0342';\n t['\\u1FFE'] = '\\u0020\\u0314';\n t['\\u2002'] = '\\u0020';\n t['\\u2003'] = '\\u0020';\n t['\\u2004'] = '\\u0020';\n t['\\u2005'] = '\\u0020';\n t['\\u2006'] = '\\u0020';\n t['\\u2008'] = '\\u0020';\n t['\\u2009'] = '\\u0020';\n t['\\u200A'] = '\\u0020';\n t['\\u2017'] = '\\u0020\\u0333';\n t['\\u2024'] = '\\u002E';\n t['\\u2025'] = '\\u002E\\u002E';\n t['\\u2026'] = '\\u002E\\u002E\\u002E';\n t['\\u2033'] = '\\u2032\\u2032';\n t['\\u2034'] = '\\u2032\\u2032\\u2032';\n t['\\u2036'] = '\\u2035\\u2035';\n t['\\u2037'] = '\\u2035\\u2035\\u2035';\n t['\\u203C'] = '\\u0021\\u0021';\n t['\\u203E'] = '\\u0020\\u0305';\n t['\\u2047'] = '\\u003F\\u003F';\n t['\\u2048'] = '\\u003F\\u0021';\n t['\\u2049'] = '\\u0021\\u003F';\n t['\\u2057'] = '\\u2032\\u2032\\u2032\\u2032';\n t['\\u205F'] = '\\u0020';\n t['\\u20A8'] = '\\u0052\\u0073';\n t['\\u2100'] = '\\u0061\\u002F\\u0063';\n t['\\u2101'] = '\\u0061\\u002F\\u0073';\n t['\\u2103'] = '\\u00B0\\u0043';\n t['\\u2105'] = '\\u0063\\u002F\\u006F';\n t['\\u2106'] = '\\u0063\\u002F\\u0075';\n t['\\u2107'] = '\\u0190';\n t['\\u2109'] = '\\u00B0\\u0046';\n t['\\u2116'] = '\\u004E\\u006F';\n t['\\u2121'] = '\\u0054\\u0045\\u004C';\n t['\\u2135'] = '\\u05D0';\n t['\\u2136'] = '\\u05D1';\n t['\\u2137'] = '\\u05D2';\n t['\\u2138'] = '\\u05D3';\n t['\\u213B'] = '\\u0046\\u0041\\u0058';\n t['\\u2160'] = '\\u0049';\n t['\\u2161'] = '\\u0049\\u0049';\n t['\\u2162'] = '\\u0049\\u0049\\u0049';\n t['\\u2163'] = '\\u0049\\u0056';\n t['\\u2164'] = '\\u0056';\n t['\\u2165'] = '\\u0056\\u0049';\n t['\\u2166'] = '\\u0056\\u0049\\u0049';\n t['\\u2167'] = '\\u0056\\u0049\\u0049\\u0049';\n t['\\u2168'] = '\\u0049\\u0058';\n t['\\u2169'] = '\\u0058';\n t['\\u216A'] = '\\u0058\\u0049';\n t['\\u216B'] = '\\u0058\\u0049\\u0049';\n t['\\u216C'] = '\\u004C';\n t['\\u216D'] = '\\u0043';\n t['\\u216E'] = '\\u0044';\n t['\\u216F'] = '\\u004D';\n t['\\u2170'] = '\\u0069';\n t['\\u2171'] = '\\u0069\\u0069';\n t['\\u2172'] = '\\u0069\\u0069\\u0069';\n t['\\u2173'] = '\\u0069\\u0076';\n t['\\u2174'] = '\\u0076';\n t['\\u2175'] = '\\u0076\\u0069';\n t['\\u2176'] = '\\u0076\\u0069\\u0069';\n t['\\u2177'] = '\\u0076\\u0069\\u0069\\u0069';\n t['\\u2178'] = '\\u0069\\u0078';\n t['\\u2179'] = '\\u0078';\n t['\\u217A'] = '\\u0078\\u0069';\n t['\\u217B'] = '\\u0078\\u0069\\u0069';\n t['\\u217C'] = '\\u006C';\n t['\\u217D'] = '\\u0063';\n t['\\u217E'] = '\\u0064';\n t['\\u217F'] = '\\u006D';\n t['\\u222C'] = '\\u222B\\u222B';\n t['\\u222D'] = '\\u222B\\u222B\\u222B';\n t['\\u222F'] = '\\u222E\\u222E';\n t['\\u2230'] = '\\u222E\\u222E\\u222E';\n t['\\u2474'] = '\\u0028\\u0031\\u0029';\n t['\\u2475'] = '\\u0028\\u0032\\u0029';\n t['\\u2476'] = '\\u0028\\u0033\\u0029';\n t['\\u2477'] = '\\u0028\\u0034\\u0029';\n t['\\u2478'] = '\\u0028\\u0035\\u0029';\n t['\\u2479'] = '\\u0028\\u0036\\u0029';\n t['\\u247A'] = '\\u0028\\u0037\\u0029';\n t['\\u247B'] = '\\u0028\\u0038\\u0029';\n t['\\u247C'] = '\\u0028\\u0039\\u0029';\n t['\\u247D'] = '\\u0028\\u0031\\u0030\\u0029';\n t['\\u247E'] = '\\u0028\\u0031\\u0031\\u0029';\n t['\\u247F'] = '\\u0028\\u0031\\u0032\\u0029';\n t['\\u2480'] = '\\u0028\\u0031\\u0033\\u0029';\n t['\\u2481'] = '\\u0028\\u0031\\u0034\\u0029';\n t['\\u2482'] = '\\u0028\\u0031\\u0035\\u0029';\n t['\\u2483'] = '\\u0028\\u0031\\u0036\\u0029';\n t['\\u2484'] = '\\u0028\\u0031\\u0037\\u0029';\n t['\\u2485'] = '\\u0028\\u0031\\u0038\\u0029';\n t['\\u2486'] = '\\u0028\\u0031\\u0039\\u0029';\n t['\\u2487'] = '\\u0028\\u0032\\u0030\\u0029';\n t['\\u2488'] = '\\u0031\\u002E';\n t['\\u2489'] = '\\u0032\\u002E';\n t['\\u248A'] = '\\u0033\\u002E';\n t['\\u248B'] = '\\u0034\\u002E';\n t['\\u248C'] = '\\u0035\\u002E';\n t['\\u248D'] = '\\u0036\\u002E';\n t['\\u248E'] = '\\u0037\\u002E';\n t['\\u248F'] = '\\u0038\\u002E';\n t['\\u2490'] = '\\u0039\\u002E';\n t['\\u2491'] = '\\u0031\\u0030\\u002E';\n t['\\u2492'] = '\\u0031\\u0031\\u002E';\n t['\\u2493'] = '\\u0031\\u0032\\u002E';\n t['\\u2494'] = '\\u0031\\u0033\\u002E';\n t['\\u2495'] = '\\u0031\\u0034\\u002E';\n t['\\u2496'] = '\\u0031\\u0035\\u002E';\n t['\\u2497'] = '\\u0031\\u0036\\u002E';\n t['\\u2498'] = '\\u0031\\u0037\\u002E';\n t['\\u2499'] = '\\u0031\\u0038\\u002E';\n t['\\u249A'] = '\\u0031\\u0039\\u002E';\n t['\\u249B'] = '\\u0032\\u0030\\u002E';\n t['\\u249C'] = '\\u0028\\u0061\\u0029';\n t['\\u249D'] = '\\u0028\\u0062\\u0029';\n t['\\u249E'] = '\\u0028\\u0063\\u0029';\n t['\\u249F'] = '\\u0028\\u0064\\u0029';\n t['\\u24A0'] = '\\u0028\\u0065\\u0029';\n t['\\u24A1'] = '\\u0028\\u0066\\u0029';\n t['\\u24A2'] = '\\u0028\\u0067\\u0029';\n t['\\u24A3'] = '\\u0028\\u0068\\u0029';\n t['\\u24A4'] = '\\u0028\\u0069\\u0029';\n t['\\u24A5'] = '\\u0028\\u006A\\u0029';\n t['\\u24A6'] = '\\u0028\\u006B\\u0029';\n t['\\u24A7'] = '\\u0028\\u006C\\u0029';\n t['\\u24A8'] = '\\u0028\\u006D\\u0029';\n t['\\u24A9'] = '\\u0028\\u006E\\u0029';\n t['\\u24AA'] = '\\u0028\\u006F\\u0029';\n t['\\u24AB'] = '\\u0028\\u0070\\u0029';\n t['\\u24AC'] = '\\u0028\\u0071\\u0029';\n t['\\u24AD'] = '\\u0028\\u0072\\u0029';\n t['\\u24AE'] = '\\u0028\\u0073\\u0029';\n t['\\u24AF'] = '\\u0028\\u0074\\u0029';\n t['\\u24B0'] = '\\u0028\\u0075\\u0029';\n t['\\u24B1'] = '\\u0028\\u0076\\u0029';\n t['\\u24B2'] = '\\u0028\\u0077\\u0029';\n t['\\u24B3'] = '\\u0028\\u0078\\u0029';\n t['\\u24B4'] = '\\u0028\\u0079\\u0029';\n t['\\u24B5'] = '\\u0028\\u007A\\u0029';\n t['\\u2A0C'] = '\\u222B\\u222B\\u222B\\u222B';\n t['\\u2A74'] = '\\u003A\\u003A\\u003D';\n t['\\u2A75'] = '\\u003D\\u003D';\n t['\\u2A76'] = '\\u003D\\u003D\\u003D';\n t['\\u2E9F'] = '\\u6BCD';\n t['\\u2EF3'] = '\\u9F9F';\n t['\\u2F00'] = '\\u4E00';\n t['\\u2F01'] = '\\u4E28';\n t['\\u2F02'] = '\\u4E36';\n t['\\u2F03'] = '\\u4E3F';\n t['\\u2F04'] = '\\u4E59';\n t['\\u2F05'] = '\\u4E85';\n t['\\u2F06'] = '\\u4E8C';\n t['\\u2F07'] = '\\u4EA0';\n t['\\u2F08'] = '\\u4EBA';\n t['\\u2F09'] = '\\u513F';\n t['\\u2F0A'] = '\\u5165';\n t['\\u2F0B'] = '\\u516B';\n t['\\u2F0C'] = '\\u5182';\n t['\\u2F0D'] = '\\u5196';\n t['\\u2F0E'] = '\\u51AB';\n t['\\u2F0F'] = '\\u51E0';\n t['\\u2F10'] = '\\u51F5';\n t['\\u2F11'] = '\\u5200';\n t['\\u2F12'] = '\\u529B';\n t['\\u2F13'] = '\\u52F9';\n t['\\u2F14'] = '\\u5315';\n t['\\u2F15'] = '\\u531A';\n t['\\u2F16'] = '\\u5338';\n t['\\u2F17'] = '\\u5341';\n t['\\u2F18'] = '\\u535C';\n t['\\u2F19'] = '\\u5369';\n t['\\u2F1A'] = '\\u5382';\n t['\\u2F1B'] = '\\u53B6';\n t['\\u2F1C'] = '\\u53C8';\n t['\\u2F1D'] = '\\u53E3';\n t['\\u2F1E'] = '\\u56D7';\n t['\\u2F1F'] = '\\u571F';\n t['\\u2F20'] = '\\u58EB';\n t['\\u2F21'] = '\\u5902';\n t['\\u2F22'] = '\\u590A';\n t['\\u2F23'] = '\\u5915';\n t['\\u2F24'] = '\\u5927';\n t['\\u2F25'] = '\\u5973';\n t['\\u2F26'] = '\\u5B50';\n t['\\u2F27'] = '\\u5B80';\n t['\\u2F28'] = '\\u5BF8';\n t['\\u2F29'] = '\\u5C0F';\n t['\\u2F2A'] = '\\u5C22';\n t['\\u2F2B'] = '\\u5C38';\n t['\\u2F2C'] = '\\u5C6E';\n t['\\u2F2D'] = '\\u5C71';\n t['\\u2F2E'] = '\\u5DDB';\n t['\\u2F2F'] = '\\u5DE5';\n t['\\u2F30'] = '\\u5DF1';\n t['\\u2F31'] = '\\u5DFE';\n t['\\u2F32'] = '\\u5E72';\n t['\\u2F33'] = '\\u5E7A';\n t['\\u2F34'] = '\\u5E7F';\n t['\\u2F35'] = '\\u5EF4';\n t['\\u2F36'] = '\\u5EFE';\n t['\\u2F37'] = '\\u5F0B';\n t['\\u2F38'] = '\\u5F13';\n t['\\u2F39'] = '\\u5F50';\n t['\\u2F3A'] = '\\u5F61';\n t['\\u2F3B'] = '\\u5F73';\n t['\\u2F3C'] = '\\u5FC3';\n t['\\u2F3D'] = '\\u6208';\n t['\\u2F3E'] = '\\u6236';\n t['\\u2F3F'] = '\\u624B';\n t['\\u2F40'] = '\\u652F';\n t['\\u2F41'] = '\\u6534';\n t['\\u2F42'] = '\\u6587';\n t['\\u2F43'] = '\\u6597';\n t['\\u2F44'] = '\\u65A4';\n t['\\u2F45'] = '\\u65B9';\n t['\\u2F46'] = '\\u65E0';\n t['\\u2F47'] = '\\u65E5';\n t['\\u2F48'] = '\\u66F0';\n t['\\u2F49'] = '\\u6708';\n t['\\u2F4A'] = '\\u6728';\n t['\\u2F4B'] = '\\u6B20';\n t['\\u2F4C'] = '\\u6B62';\n t['\\u2F4D'] = '\\u6B79';\n t['\\u2F4E'] = '\\u6BB3';\n t['\\u2F4F'] = '\\u6BCB';\n t['\\u2F50'] = '\\u6BD4';\n t['\\u2F51'] = '\\u6BDB';\n t['\\u2F52'] = '\\u6C0F';\n t['\\u2F53'] = '\\u6C14';\n t['\\u2F54'] = '\\u6C34';\n t['\\u2F55'] = '\\u706B';\n t['\\u2F56'] = '\\u722A';\n t['\\u2F57'] = '\\u7236';\n t['\\u2F58'] = '\\u723B';\n t['\\u2F59'] = '\\u723F';\n t['\\u2F5A'] = '\\u7247';\n t['\\u2F5B'] = '\\u7259';\n t['\\u2F5C'] = '\\u725B';\n t['\\u2F5D'] = '\\u72AC';\n t['\\u2F5E'] = '\\u7384';\n t['\\u2F5F'] = '\\u7389';\n t['\\u2F60'] = '\\u74DC';\n t['\\u2F61'] = '\\u74E6';\n t['\\u2F62'] = '\\u7518';\n t['\\u2F63'] = '\\u751F';\n t['\\u2F64'] = '\\u7528';\n t['\\u2F65'] = '\\u7530';\n t['\\u2F66'] = '\\u758B';\n t['\\u2F67'] = '\\u7592';\n t['\\u2F68'] = '\\u7676';\n t['\\u2F69'] = '\\u767D';\n t['\\u2F6A'] = '\\u76AE';\n t['\\u2F6B'] = '\\u76BF';\n t['\\u2F6C'] = '\\u76EE';\n t['\\u2F6D'] = '\\u77DB';\n t['\\u2F6E'] = '\\u77E2';\n t['\\u2F6F'] = '\\u77F3';\n t['\\u2F70'] = '\\u793A';\n t['\\u2F71'] = '\\u79B8';\n t['\\u2F72'] = '\\u79BE';\n t['\\u2F73'] = '\\u7A74';\n t['\\u2F74'] = '\\u7ACB';\n t['\\u2F75'] = '\\u7AF9';\n t['\\u2F76'] = '\\u7C73';\n t['\\u2F77'] = '\\u7CF8';\n t['\\u2F78'] = '\\u7F36';\n t['\\u2F79'] = '\\u7F51';\n t['\\u2F7A'] = '\\u7F8A';\n t['\\u2F7B'] = '\\u7FBD';\n t['\\u2F7C'] = '\\u8001';\n t['\\u2F7D'] = '\\u800C';\n t['\\u2F7E'] = '\\u8012';\n t['\\u2F7F'] = '\\u8033';\n t['\\u2F80'] = '\\u807F';\n t['\\u2F81'] = '\\u8089';\n t['\\u2F82'] = '\\u81E3';\n t['\\u2F83'] = '\\u81EA';\n t['\\u2F84'] = '\\u81F3';\n t['\\u2F85'] = '\\u81FC';\n t['\\u2F86'] = '\\u820C';\n t['\\u2F87'] = '\\u821B';\n t['\\u2F88'] = '\\u821F';\n t['\\u2F89'] = '\\u826E';\n t['\\u2F8A'] = '\\u8272';\n t['\\u2F8B'] = '\\u8278';\n t['\\u2F8C'] = '\\u864D';\n t['\\u2F8D'] = '\\u866B';\n t['\\u2F8E'] = '\\u8840';\n t['\\u2F8F'] = '\\u884C';\n t['\\u2F90'] = '\\u8863';\n t['\\u2F91'] = '\\u897E';\n t['\\u2F92'] = '\\u898B';\n t['\\u2F93'] = '\\u89D2';\n t['\\u2F94'] = '\\u8A00';\n t['\\u2F95'] = '\\u8C37';\n t['\\u2F96'] = '\\u8C46';\n t['\\u2F97'] = '\\u8C55';\n t['\\u2F98'] = '\\u8C78';\n t['\\u2F99'] = '\\u8C9D';\n t['\\u2F9A'] = '\\u8D64';\n t['\\u2F9B'] = '\\u8D70';\n t['\\u2F9C'] = '\\u8DB3';\n t['\\u2F9D'] = '\\u8EAB';\n t['\\u2F9E'] = '\\u8ECA';\n t['\\u2F9F'] = '\\u8F9B';\n t['\\u2FA0'] = '\\u8FB0';\n t['\\u2FA1'] = '\\u8FB5';\n t['\\u2FA2'] = '\\u9091';\n t['\\u2FA3'] = '\\u9149';\n t['\\u2FA4'] = '\\u91C6';\n t['\\u2FA5'] = '\\u91CC';\n t['\\u2FA6'] = '\\u91D1';\n t['\\u2FA7'] = '\\u9577';\n t['\\u2FA8'] = '\\u9580';\n t['\\u2FA9'] = '\\u961C';\n t['\\u2FAA'] = '\\u96B6';\n t['\\u2FAB'] = '\\u96B9';\n t['\\u2FAC'] = '\\u96E8';\n t['\\u2FAD'] = '\\u9751';\n t['\\u2FAE'] = '\\u975E';\n t['\\u2FAF'] = '\\u9762';\n t['\\u2FB0'] = '\\u9769';\n t['\\u2FB1'] = '\\u97CB';\n t['\\u2FB2'] = '\\u97ED';\n t['\\u2FB3'] = '\\u97F3';\n t['\\u2FB4'] = '\\u9801';\n t['\\u2FB5'] = '\\u98A8';\n t['\\u2FB6'] = '\\u98DB';\n t['\\u2FB7'] = '\\u98DF';\n t['\\u2FB8'] = '\\u9996';\n t['\\u2FB9'] = '\\u9999';\n t['\\u2FBA'] = '\\u99AC';\n t['\\u2FBB'] = '\\u9AA8';\n t['\\u2FBC'] = '\\u9AD8';\n t['\\u2FBD'] = '\\u9ADF';\n t['\\u2FBE'] = '\\u9B25';\n t['\\u2FBF'] = '\\u9B2F';\n t['\\u2FC0'] = '\\u9B32';\n t['\\u2FC1'] = '\\u9B3C';\n t['\\u2FC2'] = '\\u9B5A';\n t['\\u2FC3'] = '\\u9CE5';\n t['\\u2FC4'] = '\\u9E75';\n t['\\u2FC5'] = '\\u9E7F';\n t['\\u2FC6'] = '\\u9EA5';\n t['\\u2FC7'] = '\\u9EBB';\n t['\\u2FC8'] = '\\u9EC3';\n t['\\u2FC9'] = '\\u9ECD';\n t['\\u2FCA'] = '\\u9ED1';\n t['\\u2FCB'] = '\\u9EF9';\n t['\\u2FCC'] = '\\u9EFD';\n t['\\u2FCD'] = '\\u9F0E';\n t['\\u2FCE'] = '\\u9F13';\n t['\\u2FCF'] = '\\u9F20';\n t['\\u2FD0'] = '\\u9F3B';\n t['\\u2FD1'] = '\\u9F4A';\n t['\\u2FD2'] = '\\u9F52';\n t['\\u2FD3'] = '\\u9F8D';\n t['\\u2FD4'] = '\\u9F9C';\n t['\\u2FD5'] = '\\u9FA0';\n t['\\u3036'] = '\\u3012';\n t['\\u3038'] = '\\u5341';\n t['\\u3039'] = '\\u5344';\n t['\\u303A'] = '\\u5345';\n t['\\u309B'] = '\\u0020\\u3099';\n t['\\u309C'] = '\\u0020\\u309A';\n t['\\u3131'] = '\\u1100';\n t['\\u3132'] = '\\u1101';\n t['\\u3133'] = '\\u11AA';\n t['\\u3134'] = '\\u1102';\n t['\\u3135'] = '\\u11AC';\n t['\\u3136'] = '\\u11AD';\n t['\\u3137'] = '\\u1103';\n t['\\u3138'] = '\\u1104';\n t['\\u3139'] = '\\u1105';\n t['\\u313A'] = '\\u11B0';\n t['\\u313B'] = '\\u11B1';\n t['\\u313C'] = '\\u11B2';\n t['\\u313D'] = '\\u11B3';\n t['\\u313E'] = '\\u11B4';\n t['\\u313F'] = '\\u11B5';\n t['\\u3140'] = '\\u111A';\n t['\\u3141'] = '\\u1106';\n t['\\u3142'] = '\\u1107';\n t['\\u3143'] = '\\u1108';\n t['\\u3144'] = '\\u1121';\n t['\\u3145'] = '\\u1109';\n t['\\u3146'] = '\\u110A';\n t['\\u3147'] = '\\u110B';\n t['\\u3148'] = '\\u110C';\n t['\\u3149'] = '\\u110D';\n t['\\u314A'] = '\\u110E';\n t['\\u314B'] = '\\u110F';\n t['\\u314C'] = '\\u1110';\n t['\\u314D'] = '\\u1111';\n t['\\u314E'] = '\\u1112';\n t['\\u314F'] = '\\u1161';\n t['\\u3150'] = '\\u1162';\n t['\\u3151'] = '\\u1163';\n t['\\u3152'] = '\\u1164';\n t['\\u3153'] = '\\u1165';\n t['\\u3154'] = '\\u1166';\n t['\\u3155'] = '\\u1167';\n t['\\u3156'] = '\\u1168';\n t['\\u3157'] = '\\u1169';\n t['\\u3158'] = '\\u116A';\n t['\\u3159'] = '\\u116B';\n t['\\u315A'] = '\\u116C';\n t['\\u315B'] = '\\u116D';\n t['\\u315C'] = '\\u116E';\n t['\\u315D'] = '\\u116F';\n t['\\u315E'] = '\\u1170';\n t['\\u315F'] = '\\u1171';\n t['\\u3160'] = '\\u1172';\n t['\\u3161'] = '\\u1173';\n t['\\u3162'] = '\\u1174';\n t['\\u3163'] = '\\u1175';\n t['\\u3164'] = '\\u1160';\n t['\\u3165'] = '\\u1114';\n t['\\u3166'] = '\\u1115';\n t['\\u3167'] = '\\u11C7';\n t['\\u3168'] = '\\u11C8';\n t['\\u3169'] = '\\u11CC';\n t['\\u316A'] = '\\u11CE';\n t['\\u316B'] = '\\u11D3';\n t['\\u316C'] = '\\u11D7';\n t['\\u316D'] = '\\u11D9';\n t['\\u316E'] = '\\u111C';\n t['\\u316F'] = '\\u11DD';\n t['\\u3170'] = '\\u11DF';\n t['\\u3171'] = '\\u111D';\n t['\\u3172'] = '\\u111E';\n t['\\u3173'] = '\\u1120';\n t['\\u3174'] = '\\u1122';\n t['\\u3175'] = '\\u1123';\n t['\\u3176'] = '\\u1127';\n t['\\u3177'] = '\\u1129';\n t['\\u3178'] = '\\u112B';\n t['\\u3179'] = '\\u112C';\n t['\\u317A'] = '\\u112D';\n t['\\u317B'] = '\\u112E';\n t['\\u317C'] = '\\u112F';\n t['\\u317D'] = '\\u1132';\n t['\\u317E'] = '\\u1136';\n t['\\u317F'] = '\\u1140';\n t['\\u3180'] = '\\u1147';\n t['\\u3181'] = '\\u114C';\n t['\\u3182'] = '\\u11F1';\n t['\\u3183'] = '\\u11F2';\n t['\\u3184'] = '\\u1157';\n t['\\u3185'] = '\\u1158';\n t['\\u3186'] = '\\u1159';\n t['\\u3187'] = '\\u1184';\n t['\\u3188'] = '\\u1185';\n t['\\u3189'] = '\\u1188';\n t['\\u318A'] = '\\u1191';\n t['\\u318B'] = '\\u1192';\n t['\\u318C'] = '\\u1194';\n t['\\u318D'] = '\\u119E';\n t['\\u318E'] = '\\u11A1';\n t['\\u3200'] = '\\u0028\\u1100\\u0029';\n t['\\u3201'] = '\\u0028\\u1102\\u0029';\n t['\\u3202'] = '\\u0028\\u1103\\u0029';\n t['\\u3203'] = '\\u0028\\u1105\\u0029';\n t['\\u3204'] = '\\u0028\\u1106\\u0029';\n t['\\u3205'] = '\\u0028\\u1107\\u0029';\n t['\\u3206'] = '\\u0028\\u1109\\u0029';\n t['\\u3207'] = '\\u0028\\u110B\\u0029';\n t['\\u3208'] = '\\u0028\\u110C\\u0029';\n t['\\u3209'] = '\\u0028\\u110E\\u0029';\n t['\\u320A'] = '\\u0028\\u110F\\u0029';\n t['\\u320B'] = '\\u0028\\u1110\\u0029';\n t['\\u320C'] = '\\u0028\\u1111\\u0029';\n t['\\u320D'] = '\\u0028\\u1112\\u0029';\n t['\\u320E'] = '\\u0028\\u1100\\u1161\\u0029';\n t['\\u320F'] = '\\u0028\\u1102\\u1161\\u0029';\n t['\\u3210'] = '\\u0028\\u1103\\u1161\\u0029';\n t['\\u3211'] = '\\u0028\\u1105\\u1161\\u0029';\n t['\\u3212'] = '\\u0028\\u1106\\u1161\\u0029';\n t['\\u3213'] = '\\u0028\\u1107\\u1161\\u0029';\n t['\\u3214'] = '\\u0028\\u1109\\u1161\\u0029';\n t['\\u3215'] = '\\u0028\\u110B\\u1161\\u0029';\n t['\\u3216'] = '\\u0028\\u110C\\u1161\\u0029';\n t['\\u3217'] = '\\u0028\\u110E\\u1161\\u0029';\n t['\\u3218'] = '\\u0028\\u110F\\u1161\\u0029';\n t['\\u3219'] = '\\u0028\\u1110\\u1161\\u0029';\n t['\\u321A'] = '\\u0028\\u1111\\u1161\\u0029';\n t['\\u321B'] = '\\u0028\\u1112\\u1161\\u0029';\n t['\\u321C'] = '\\u0028\\u110C\\u116E\\u0029';\n t['\\u321D'] = '\\u0028\\u110B\\u1169\\u110C\\u1165\\u11AB\\u0029';\n t['\\u321E'] = '\\u0028\\u110B\\u1169\\u1112\\u116E\\u0029';\n t['\\u3220'] = '\\u0028\\u4E00\\u0029';\n t['\\u3221'] = '\\u0028\\u4E8C\\u0029';\n t['\\u3222'] = '\\u0028\\u4E09\\u0029';\n t['\\u3223'] = '\\u0028\\u56DB\\u0029';\n t['\\u3224'] = '\\u0028\\u4E94\\u0029';\n t['\\u3225'] = '\\u0028\\u516D\\u0029';\n t['\\u3226'] = '\\u0028\\u4E03\\u0029';\n t['\\u3227'] = '\\u0028\\u516B\\u0029';\n t['\\u3228'] = '\\u0028\\u4E5D\\u0029';\n t['\\u3229'] = '\\u0028\\u5341\\u0029';\n t['\\u322A'] = '\\u0028\\u6708\\u0029';\n t['\\u322B'] = '\\u0028\\u706B\\u0029';\n t['\\u322C'] = '\\u0028\\u6C34\\u0029';\n t['\\u322D'] = '\\u0028\\u6728\\u0029';\n t['\\u322E'] = '\\u0028\\u91D1\\u0029';\n t['\\u322F'] = '\\u0028\\u571F\\u0029';\n t['\\u3230'] = '\\u0028\\u65E5\\u0029';\n t['\\u3231'] = '\\u0028\\u682A\\u0029';\n t['\\u3232'] = '\\u0028\\u6709\\u0029';\n t['\\u3233'] = '\\u0028\\u793E\\u0029';\n t['\\u3234'] = '\\u0028\\u540D\\u0029';\n t['\\u3235'] = '\\u0028\\u7279\\u0029';\n t['\\u3236'] = '\\u0028\\u8CA1\\u0029';\n t['\\u3237'] = '\\u0028\\u795D\\u0029';\n t['\\u3238'] = '\\u0028\\u52B4\\u0029';\n t['\\u3239'] = '\\u0028\\u4EE3\\u0029';\n t['\\u323A'] = '\\u0028\\u547C\\u0029';\n t['\\u323B'] = '\\u0028\\u5B66\\u0029';\n t['\\u323C'] = '\\u0028\\u76E3\\u0029';\n t['\\u323D'] = '\\u0028\\u4F01\\u0029';\n t['\\u323E'] = '\\u0028\\u8CC7\\u0029';\n t['\\u323F'] = '\\u0028\\u5354\\u0029';\n t['\\u3240'] = '\\u0028\\u796D\\u0029';\n t['\\u3241'] = '\\u0028\\u4F11\\u0029';\n t['\\u3242'] = '\\u0028\\u81EA\\u0029';\n t['\\u3243'] = '\\u0028\\u81F3\\u0029';\n t['\\u32C0'] = '\\u0031\\u6708';\n t['\\u32C1'] = '\\u0032\\u6708';\n t['\\u32C2'] = '\\u0033\\u6708';\n t['\\u32C3'] = '\\u0034\\u6708';\n t['\\u32C4'] = '\\u0035\\u6708';\n t['\\u32C5'] = '\\u0036\\u6708';\n t['\\u32C6'] = '\\u0037\\u6708';\n t['\\u32C7'] = '\\u0038\\u6708';\n t['\\u32C8'] = '\\u0039\\u6708';\n t['\\u32C9'] = '\\u0031\\u0030\\u6708';\n t['\\u32CA'] = '\\u0031\\u0031\\u6708';\n t['\\u32CB'] = '\\u0031\\u0032\\u6708';\n t['\\u3358'] = '\\u0030\\u70B9';\n t['\\u3359'] = '\\u0031\\u70B9';\n t['\\u335A'] = '\\u0032\\u70B9';\n t['\\u335B'] = '\\u0033\\u70B9';\n t['\\u335C'] = '\\u0034\\u70B9';\n t['\\u335D'] = '\\u0035\\u70B9';\n t['\\u335E'] = '\\u0036\\u70B9';\n t['\\u335F'] = '\\u0037\\u70B9';\n t['\\u3360'] = '\\u0038\\u70B9';\n t['\\u3361'] = '\\u0039\\u70B9';\n t['\\u3362'] = '\\u0031\\u0030\\u70B9';\n t['\\u3363'] = '\\u0031\\u0031\\u70B9';\n t['\\u3364'] = '\\u0031\\u0032\\u70B9';\n t['\\u3365'] = '\\u0031\\u0033\\u70B9';\n t['\\u3366'] = '\\u0031\\u0034\\u70B9';\n t['\\u3367'] = '\\u0031\\u0035\\u70B9';\n t['\\u3368'] = '\\u0031\\u0036\\u70B9';\n t['\\u3369'] = '\\u0031\\u0037\\u70B9';\n t['\\u336A'] = '\\u0031\\u0038\\u70B9';\n t['\\u336B'] = '\\u0031\\u0039\\u70B9';\n t['\\u336C'] = '\\u0032\\u0030\\u70B9';\n t['\\u336D'] = '\\u0032\\u0031\\u70B9';\n t['\\u336E'] = '\\u0032\\u0032\\u70B9';\n t['\\u336F'] = '\\u0032\\u0033\\u70B9';\n t['\\u3370'] = '\\u0032\\u0034\\u70B9';\n t['\\u33E0'] = '\\u0031\\u65E5';\n t['\\u33E1'] = '\\u0032\\u65E5';\n t['\\u33E2'] = '\\u0033\\u65E5';\n t['\\u33E3'] = '\\u0034\\u65E5';\n t['\\u33E4'] = '\\u0035\\u65E5';\n t['\\u33E5'] = '\\u0036\\u65E5';\n t['\\u33E6'] = '\\u0037\\u65E5';\n t['\\u33E7'] = '\\u0038\\u65E5';\n t['\\u33E8'] = '\\u0039\\u65E5';\n t['\\u33E9'] = '\\u0031\\u0030\\u65E5';\n t['\\u33EA'] = '\\u0031\\u0031\\u65E5';\n t['\\u33EB'] = '\\u0031\\u0032\\u65E5';\n t['\\u33EC'] = '\\u0031\\u0033\\u65E5';\n t['\\u33ED'] = '\\u0031\\u0034\\u65E5';\n t['\\u33EE'] = '\\u0031\\u0035\\u65E5';\n t['\\u33EF'] = '\\u0031\\u0036\\u65E5';\n t['\\u33F0'] = '\\u0031\\u0037\\u65E5';\n t['\\u33F1'] = '\\u0031\\u0038\\u65E5';\n t['\\u33F2'] = '\\u0031\\u0039\\u65E5';\n t['\\u33F3'] = '\\u0032\\u0030\\u65E5';\n t['\\u33F4'] = '\\u0032\\u0031\\u65E5';\n t['\\u33F5'] = '\\u0032\\u0032\\u65E5';\n t['\\u33F6'] = '\\u0032\\u0033\\u65E5';\n t['\\u33F7'] = '\\u0032\\u0034\\u65E5';\n t['\\u33F8'] = '\\u0032\\u0035\\u65E5';\n t['\\u33F9'] = '\\u0032\\u0036\\u65E5';\n t['\\u33FA'] = '\\u0032\\u0037\\u65E5';\n t['\\u33FB'] = '\\u0032\\u0038\\u65E5';\n t['\\u33FC'] = '\\u0032\\u0039\\u65E5';\n t['\\u33FD'] = '\\u0033\\u0030\\u65E5';\n t['\\u33FE'] = '\\u0033\\u0031\\u65E5';\n t['\\uFB00'] = '\\u0066\\u0066';\n t['\\uFB01'] = '\\u0066\\u0069';\n t['\\uFB02'] = '\\u0066\\u006C';\n t['\\uFB03'] = '\\u0066\\u0066\\u0069';\n t['\\uFB04'] = '\\u0066\\u0066\\u006C';\n t['\\uFB05'] = '\\u017F\\u0074';\n t['\\uFB06'] = '\\u0073\\u0074';\n t['\\uFB13'] = '\\u0574\\u0576';\n t['\\uFB14'] = '\\u0574\\u0565';\n t['\\uFB15'] = '\\u0574\\u056B';\n t['\\uFB16'] = '\\u057E\\u0576';\n t['\\uFB17'] = '\\u0574\\u056D';\n t['\\uFB4F'] = '\\u05D0\\u05DC';\n t['\\uFB50'] = '\\u0671';\n t['\\uFB51'] = '\\u0671';\n t['\\uFB52'] = '\\u067B';\n t['\\uFB53'] = '\\u067B';\n t['\\uFB54'] = '\\u067B';\n t['\\uFB55'] = '\\u067B';\n t['\\uFB56'] = '\\u067E';\n t['\\uFB57'] = '\\u067E';\n t['\\uFB58'] = '\\u067E';\n t['\\uFB59'] = '\\u067E';\n t['\\uFB5A'] = '\\u0680';\n t['\\uFB5B'] = '\\u0680';\n t['\\uFB5C'] = '\\u0680';\n t['\\uFB5D'] = '\\u0680';\n t['\\uFB5E'] = '\\u067A';\n t['\\uFB5F'] = '\\u067A';\n t['\\uFB60'] = '\\u067A';\n t['\\uFB61'] = '\\u067A';\n t['\\uFB62'] = '\\u067F';\n t['\\uFB63'] = '\\u067F';\n t['\\uFB64'] = '\\u067F';\n t['\\uFB65'] = '\\u067F';\n t['\\uFB66'] = '\\u0679';\n t['\\uFB67'] = '\\u0679';\n t['\\uFB68'] = '\\u0679';\n t['\\uFB69'] = '\\u0679';\n t['\\uFB6A'] = '\\u06A4';\n t['\\uFB6B'] = '\\u06A4';\n t['\\uFB6C'] = '\\u06A4';\n t['\\uFB6D'] = '\\u06A4';\n t['\\uFB6E'] = '\\u06A6';\n t['\\uFB6F'] = '\\u06A6';\n t['\\uFB70'] = '\\u06A6';\n t['\\uFB71'] = '\\u06A6';\n t['\\uFB72'] = '\\u0684';\n t['\\uFB73'] = '\\u0684';\n t['\\uFB74'] = '\\u0684';\n t['\\uFB75'] = '\\u0684';\n t['\\uFB76'] = '\\u0683';\n t['\\uFB77'] = '\\u0683';\n t['\\uFB78'] = '\\u0683';\n t['\\uFB79'] = '\\u0683';\n t['\\uFB7A'] = '\\u0686';\n t['\\uFB7B'] = '\\u0686';\n t['\\uFB7C'] = '\\u0686';\n t['\\uFB7D'] = '\\u0686';\n t['\\uFB7E'] = '\\u0687';\n t['\\uFB7F'] = '\\u0687';\n t['\\uFB80'] = '\\u0687';\n t['\\uFB81'] = '\\u0687';\n t['\\uFB82'] = '\\u068D';\n t['\\uFB83'] = '\\u068D';\n t['\\uFB84'] = '\\u068C';\n t['\\uFB85'] = '\\u068C';\n t['\\uFB86'] = '\\u068E';\n t['\\uFB87'] = '\\u068E';\n t['\\uFB88'] = '\\u0688';\n t['\\uFB89'] = '\\u0688';\n t['\\uFB8A'] = '\\u0698';\n t['\\uFB8B'] = '\\u0698';\n t['\\uFB8C'] = '\\u0691';\n t['\\uFB8D'] = '\\u0691';\n t['\\uFB8E'] = '\\u06A9';\n t['\\uFB8F'] = '\\u06A9';\n t['\\uFB90'] = '\\u06A9';\n t['\\uFB91'] = '\\u06A9';\n t['\\uFB92'] = '\\u06AF';\n t['\\uFB93'] = '\\u06AF';\n t['\\uFB94'] = '\\u06AF';\n t['\\uFB95'] = '\\u06AF';\n t['\\uFB96'] = '\\u06B3';\n t['\\uFB97'] = '\\u06B3';\n t['\\uFB98'] = '\\u06B3';\n t['\\uFB99'] = '\\u06B3';\n t['\\uFB9A'] = '\\u06B1';\n t['\\uFB9B'] = '\\u06B1';\n t['\\uFB9C'] = '\\u06B1';\n t['\\uFB9D'] = '\\u06B1';\n t['\\uFB9E'] = '\\u06BA';\n t['\\uFB9F'] = '\\u06BA';\n t['\\uFBA0'] = '\\u06BB';\n t['\\uFBA1'] = '\\u06BB';\n t['\\uFBA2'] = '\\u06BB';\n t['\\uFBA3'] = '\\u06BB';\n t['\\uFBA4'] = '\\u06C0';\n t['\\uFBA5'] = '\\u06C0';\n t['\\uFBA6'] = '\\u06C1';\n t['\\uFBA7'] = '\\u06C1';\n t['\\uFBA8'] = '\\u06C1';\n t['\\uFBA9'] = '\\u06C1';\n t['\\uFBAA'] = '\\u06BE';\n t['\\uFBAB'] = '\\u06BE';\n t['\\uFBAC'] = '\\u06BE';\n t['\\uFBAD'] = '\\u06BE';\n t['\\uFBAE'] = '\\u06D2';\n t['\\uFBAF'] = '\\u06D2';\n t['\\uFBB0'] = '\\u06D3';\n t['\\uFBB1'] = '\\u06D3';\n t['\\uFBD3'] = '\\u06AD';\n t['\\uFBD4'] = '\\u06AD';\n t['\\uFBD5'] = '\\u06AD';\n t['\\uFBD6'] = '\\u06AD';\n t['\\uFBD7'] = '\\u06C7';\n t['\\uFBD8'] = '\\u06C7';\n t['\\uFBD9'] = '\\u06C6';\n t['\\uFBDA'] = '\\u06C6';\n t['\\uFBDB'] = '\\u06C8';\n t['\\uFBDC'] = '\\u06C8';\n t['\\uFBDD'] = '\\u0677';\n t['\\uFBDE'] = '\\u06CB';\n t['\\uFBDF'] = '\\u06CB';\n t['\\uFBE0'] = '\\u06C5';\n t['\\uFBE1'] = '\\u06C5';\n t['\\uFBE2'] = '\\u06C9';\n t['\\uFBE3'] = '\\u06C9';\n t['\\uFBE4'] = '\\u06D0';\n t['\\uFBE5'] = '\\u06D0';\n t['\\uFBE6'] = '\\u06D0';\n t['\\uFBE7'] = '\\u06D0';\n t['\\uFBE8'] = '\\u0649';\n t['\\uFBE9'] = '\\u0649';\n t['\\uFBEA'] = '\\u0626\\u0627';\n t['\\uFBEB'] = '\\u0626\\u0627';\n t['\\uFBEC'] = '\\u0626\\u06D5';\n t['\\uFBED'] = '\\u0626\\u06D5';\n t['\\uFBEE'] = '\\u0626\\u0648';\n t['\\uFBEF'] = '\\u0626\\u0648';\n t['\\uFBF0'] = '\\u0626\\u06C7';\n t['\\uFBF1'] = '\\u0626\\u06C7';\n t['\\uFBF2'] = '\\u0626\\u06C6';\n t['\\uFBF3'] = '\\u0626\\u06C6';\n t['\\uFBF4'] = '\\u0626\\u06C8';\n t['\\uFBF5'] = '\\u0626\\u06C8';\n t['\\uFBF6'] = '\\u0626\\u06D0';\n t['\\uFBF7'] = '\\u0626\\u06D0';\n t['\\uFBF8'] = '\\u0626\\u06D0';\n t['\\uFBF9'] = '\\u0626\\u0649';\n t['\\uFBFA'] = '\\u0626\\u0649';\n t['\\uFBFB'] = '\\u0626\\u0649';\n t['\\uFBFC'] = '\\u06CC';\n t['\\uFBFD'] = '\\u06CC';\n t['\\uFBFE'] = '\\u06CC';\n t['\\uFBFF'] = '\\u06CC';\n t['\\uFC00'] = '\\u0626\\u062C';\n t['\\uFC01'] = '\\u0626\\u062D';\n t['\\uFC02'] = '\\u0626\\u0645';\n t['\\uFC03'] = '\\u0626\\u0649';\n t['\\uFC04'] = '\\u0626\\u064A';\n t['\\uFC05'] = '\\u0628\\u062C';\n t['\\uFC06'] = '\\u0628\\u062D';\n t['\\uFC07'] = '\\u0628\\u062E';\n t['\\uFC08'] = '\\u0628\\u0645';\n t['\\uFC09'] = '\\u0628\\u0649';\n t['\\uFC0A'] = '\\u0628\\u064A';\n t['\\uFC0B'] = '\\u062A\\u062C';\n t['\\uFC0C'] = '\\u062A\\u062D';\n t['\\uFC0D'] = '\\u062A\\u062E';\n t['\\uFC0E'] = '\\u062A\\u0645';\n t['\\uFC0F'] = '\\u062A\\u0649';\n t['\\uFC10'] = '\\u062A\\u064A';\n t['\\uFC11'] = '\\u062B\\u062C';\n t['\\uFC12'] = '\\u062B\\u0645';\n t['\\uFC13'] = '\\u062B\\u0649';\n t['\\uFC14'] = '\\u062B\\u064A';\n t['\\uFC15'] = '\\u062C\\u062D';\n t['\\uFC16'] = '\\u062C\\u0645';\n t['\\uFC17'] = '\\u062D\\u062C';\n t['\\uFC18'] = '\\u062D\\u0645';\n t['\\uFC19'] = '\\u062E\\u062C';\n t['\\uFC1A'] = '\\u062E\\u062D';\n t['\\uFC1B'] = '\\u062E\\u0645';\n t['\\uFC1C'] = '\\u0633\\u062C';\n t['\\uFC1D'] = '\\u0633\\u062D';\n t['\\uFC1E'] = '\\u0633\\u062E';\n t['\\uFC1F'] = '\\u0633\\u0645';\n t['\\uFC20'] = '\\u0635\\u062D';\n t['\\uFC21'] = '\\u0635\\u0645';\n t['\\uFC22'] = '\\u0636\\u062C';\n t['\\uFC23'] = '\\u0636\\u062D';\n t['\\uFC24'] = '\\u0636\\u062E';\n t['\\uFC25'] = '\\u0636\\u0645';\n t['\\uFC26'] = '\\u0637\\u062D';\n t['\\uFC27'] = '\\u0637\\u0645';\n t['\\uFC28'] = '\\u0638\\u0645';\n t['\\uFC29'] = '\\u0639\\u062C';\n t['\\uFC2A'] = '\\u0639\\u0645';\n t['\\uFC2B'] = '\\u063A\\u062C';\n t['\\uFC2C'] = '\\u063A\\u0645';\n t['\\uFC2D'] = '\\u0641\\u062C';\n t['\\uFC2E'] = '\\u0641\\u062D';\n t['\\uFC2F'] = '\\u0641\\u062E';\n t['\\uFC30'] = '\\u0641\\u0645';\n t['\\uFC31'] = '\\u0641\\u0649';\n t['\\uFC32'] = '\\u0641\\u064A';\n t['\\uFC33'] = '\\u0642\\u062D';\n t['\\uFC34'] = '\\u0642\\u0645';\n t['\\uFC35'] = '\\u0642\\u0649';\n t['\\uFC36'] = '\\u0642\\u064A';\n t['\\uFC37'] = '\\u0643\\u0627';\n t['\\uFC38'] = '\\u0643\\u062C';\n t['\\uFC39'] = '\\u0643\\u062D';\n t['\\uFC3A'] = '\\u0643\\u062E';\n t['\\uFC3B'] = '\\u0643\\u0644';\n t['\\uFC3C'] = '\\u0643\\u0645';\n t['\\uFC3D'] = '\\u0643\\u0649';\n t['\\uFC3E'] = '\\u0643\\u064A';\n t['\\uFC3F'] = '\\u0644\\u062C';\n t['\\uFC40'] = '\\u0644\\u062D';\n t['\\uFC41'] = '\\u0644\\u062E';\n t['\\uFC42'] = '\\u0644\\u0645';\n t['\\uFC43'] = '\\u0644\\u0649';\n t['\\uFC44'] = '\\u0644\\u064A';\n t['\\uFC45'] = '\\u0645\\u062C';\n t['\\uFC46'] = '\\u0645\\u062D';\n t['\\uFC47'] = '\\u0645\\u062E';\n t['\\uFC48'] = '\\u0645\\u0645';\n t['\\uFC49'] = '\\u0645\\u0649';\n t['\\uFC4A'] = '\\u0645\\u064A';\n t['\\uFC4B'] = '\\u0646\\u062C';\n t['\\uFC4C'] = '\\u0646\\u062D';\n t['\\uFC4D'] = '\\u0646\\u062E';\n t['\\uFC4E'] = '\\u0646\\u0645';\n t['\\uFC4F'] = '\\u0646\\u0649';\n t['\\uFC50'] = '\\u0646\\u064A';\n t['\\uFC51'] = '\\u0647\\u062C';\n t['\\uFC52'] = '\\u0647\\u0645';\n t['\\uFC53'] = '\\u0647\\u0649';\n t['\\uFC54'] = '\\u0647\\u064A';\n t['\\uFC55'] = '\\u064A\\u062C';\n t['\\uFC56'] = '\\u064A\\u062D';\n t['\\uFC57'] = '\\u064A\\u062E';\n t['\\uFC58'] = '\\u064A\\u0645';\n t['\\uFC59'] = '\\u064A\\u0649';\n t['\\uFC5A'] = '\\u064A\\u064A';\n t['\\uFC5B'] = '\\u0630\\u0670';\n t['\\uFC5C'] = '\\u0631\\u0670';\n t['\\uFC5D'] = '\\u0649\\u0670';\n t['\\uFC5E'] = '\\u0020\\u064C\\u0651';\n t['\\uFC5F'] = '\\u0020\\u064D\\u0651';\n t['\\uFC60'] = '\\u0020\\u064E\\u0651';\n t['\\uFC61'] = '\\u0020\\u064F\\u0651';\n t['\\uFC62'] = '\\u0020\\u0650\\u0651';\n t['\\uFC63'] = '\\u0020\\u0651\\u0670';\n t['\\uFC64'] = '\\u0626\\u0631';\n t['\\uFC65'] = '\\u0626\\u0632';\n t['\\uFC66'] = '\\u0626\\u0645';\n t['\\uFC67'] = '\\u0626\\u0646';\n t['\\uFC68'] = '\\u0626\\u0649';\n t['\\uFC69'] = '\\u0626\\u064A';\n t['\\uFC6A'] = '\\u0628\\u0631';\n t['\\uFC6B'] = '\\u0628\\u0632';\n t['\\uFC6C'] = '\\u0628\\u0645';\n t['\\uFC6D'] = '\\u0628\\u0646';\n t['\\uFC6E'] = '\\u0628\\u0649';\n t['\\uFC6F'] = '\\u0628\\u064A';\n t['\\uFC70'] = '\\u062A\\u0631';\n t['\\uFC71'] = '\\u062A\\u0632';\n t['\\uFC72'] = '\\u062A\\u0645';\n t['\\uFC73'] = '\\u062A\\u0646';\n t['\\uFC74'] = '\\u062A\\u0649';\n t['\\uFC75'] = '\\u062A\\u064A';\n t['\\uFC76'] = '\\u062B\\u0631';\n t['\\uFC77'] = '\\u062B\\u0632';\n t['\\uFC78'] = '\\u062B\\u0645';\n t['\\uFC79'] = '\\u062B\\u0646';\n t['\\uFC7A'] = '\\u062B\\u0649';\n t['\\uFC7B'] = '\\u062B\\u064A';\n t['\\uFC7C'] = '\\u0641\\u0649';\n t['\\uFC7D'] = '\\u0641\\u064A';\n t['\\uFC7E'] = '\\u0642\\u0649';\n t['\\uFC7F'] = '\\u0642\\u064A';\n t['\\uFC80'] = '\\u0643\\u0627';\n t['\\uFC81'] = '\\u0643\\u0644';\n t['\\uFC82'] = '\\u0643\\u0645';\n t['\\uFC83'] = '\\u0643\\u0649';\n t['\\uFC84'] = '\\u0643\\u064A';\n t['\\uFC85'] = '\\u0644\\u0645';\n t['\\uFC86'] = '\\u0644\\u0649';\n t['\\uFC87'] = '\\u0644\\u064A';\n t['\\uFC88'] = '\\u0645\\u0627';\n t['\\uFC89'] = '\\u0645\\u0645';\n t['\\uFC8A'] = '\\u0646\\u0631';\n t['\\uFC8B'] = '\\u0646\\u0632';\n t['\\uFC8C'] = '\\u0646\\u0645';\n t['\\uFC8D'] = '\\u0646\\u0646';\n t['\\uFC8E'] = '\\u0646\\u0649';\n t['\\uFC8F'] = '\\u0646\\u064A';\n t['\\uFC90'] = '\\u0649\\u0670';\n t['\\uFC91'] = '\\u064A\\u0631';\n t['\\uFC92'] = '\\u064A\\u0632';\n t['\\uFC93'] = '\\u064A\\u0645';\n t['\\uFC94'] = '\\u064A\\u0646';\n t['\\uFC95'] = '\\u064A\\u0649';\n t['\\uFC96'] = '\\u064A\\u064A';\n t['\\uFC97'] = '\\u0626\\u062C';\n t['\\uFC98'] = '\\u0626\\u062D';\n t['\\uFC99'] = '\\u0626\\u062E';\n t['\\uFC9A'] = '\\u0626\\u0645';\n t['\\uFC9B'] = '\\u0626\\u0647';\n t['\\uFC9C'] = '\\u0628\\u062C';\n t['\\uFC9D'] = '\\u0628\\u062D';\n t['\\uFC9E'] = '\\u0628\\u062E';\n t['\\uFC9F'] = '\\u0628\\u0645';\n t['\\uFCA0'] = '\\u0628\\u0647';\n t['\\uFCA1'] = '\\u062A\\u062C';\n t['\\uFCA2'] = '\\u062A\\u062D';\n t['\\uFCA3'] = '\\u062A\\u062E';\n t['\\uFCA4'] = '\\u062A\\u0645';\n t['\\uFCA5'] = '\\u062A\\u0647';\n t['\\uFCA6'] = '\\u062B\\u0645';\n t['\\uFCA7'] = '\\u062C\\u062D';\n t['\\uFCA8'] = '\\u062C\\u0645';\n t['\\uFCA9'] = '\\u062D\\u062C';\n t['\\uFCAA'] = '\\u062D\\u0645';\n t['\\uFCAB'] = '\\u062E\\u062C';\n t['\\uFCAC'] = '\\u062E\\u0645';\n t['\\uFCAD'] = '\\u0633\\u062C';\n t['\\uFCAE'] = '\\u0633\\u062D';\n t['\\uFCAF'] = '\\u0633\\u062E';\n t['\\uFCB0'] = '\\u0633\\u0645';\n t['\\uFCB1'] = '\\u0635\\u062D';\n t['\\uFCB2'] = '\\u0635\\u062E';\n t['\\uFCB3'] = '\\u0635\\u0645';\n t['\\uFCB4'] = '\\u0636\\u062C';\n t['\\uFCB5'] = '\\u0636\\u062D';\n t['\\uFCB6'] = '\\u0636\\u062E';\n t['\\uFCB7'] = '\\u0636\\u0645';\n t['\\uFCB8'] = '\\u0637\\u062D';\n t['\\uFCB9'] = '\\u0638\\u0645';\n t['\\uFCBA'] = '\\u0639\\u062C';\n t['\\uFCBB'] = '\\u0639\\u0645';\n t['\\uFCBC'] = '\\u063A\\u062C';\n t['\\uFCBD'] = '\\u063A\\u0645';\n t['\\uFCBE'] = '\\u0641\\u062C';\n t['\\uFCBF'] = '\\u0641\\u062D';\n t['\\uFCC0'] = '\\u0641\\u062E';\n t['\\uFCC1'] = '\\u0641\\u0645';\n t['\\uFCC2'] = '\\u0642\\u062D';\n t['\\uFCC3'] = '\\u0642\\u0645';\n t['\\uFCC4'] = '\\u0643\\u062C';\n t['\\uFCC5'] = '\\u0643\\u062D';\n t['\\uFCC6'] = '\\u0643\\u062E';\n t['\\uFCC7'] = '\\u0643\\u0644';\n t['\\uFCC8'] = '\\u0643\\u0645';\n t['\\uFCC9'] = '\\u0644\\u062C';\n t['\\uFCCA'] = '\\u0644\\u062D';\n t['\\uFCCB'] = '\\u0644\\u062E';\n t['\\uFCCC'] = '\\u0644\\u0645';\n t['\\uFCCD'] = '\\u0644\\u0647';\n t['\\uFCCE'] = '\\u0645\\u062C';\n t['\\uFCCF'] = '\\u0645\\u062D';\n t['\\uFCD0'] = '\\u0645\\u062E';\n t['\\uFCD1'] = '\\u0645\\u0645';\n t['\\uFCD2'] = '\\u0646\\u062C';\n t['\\uFCD3'] = '\\u0646\\u062D';\n t['\\uFCD4'] = '\\u0646\\u062E';\n t['\\uFCD5'] = '\\u0646\\u0645';\n t['\\uFCD6'] = '\\u0646\\u0647';\n t['\\uFCD7'] = '\\u0647\\u062C';\n t['\\uFCD8'] = '\\u0647\\u0645';\n t['\\uFCD9'] = '\\u0647\\u0670';\n t['\\uFCDA'] = '\\u064A\\u062C';\n t['\\uFCDB'] = '\\u064A\\u062D';\n t['\\uFCDC'] = '\\u064A\\u062E';\n t['\\uFCDD'] = '\\u064A\\u0645';\n t['\\uFCDE'] = '\\u064A\\u0647';\n t['\\uFCDF'] = '\\u0626\\u0645';\n t['\\uFCE0'] = '\\u0626\\u0647';\n t['\\uFCE1'] = '\\u0628\\u0645';\n t['\\uFCE2'] = '\\u0628\\u0647';\n t['\\uFCE3'] = '\\u062A\\u0645';\n t['\\uFCE4'] = '\\u062A\\u0647';\n t['\\uFCE5'] = '\\u062B\\u0645';\n t['\\uFCE6'] = '\\u062B\\u0647';\n t['\\uFCE7'] = '\\u0633\\u0645';\n t['\\uFCE8'] = '\\u0633\\u0647';\n t['\\uFCE9'] = '\\u0634\\u0645';\n t['\\uFCEA'] = '\\u0634\\u0647';\n t['\\uFCEB'] = '\\u0643\\u0644';\n t['\\uFCEC'] = '\\u0643\\u0645';\n t['\\uFCED'] = '\\u0644\\u0645';\n t['\\uFCEE'] = '\\u0646\\u0645';\n t['\\uFCEF'] = '\\u0646\\u0647';\n t['\\uFCF0'] = '\\u064A\\u0645';\n t['\\uFCF1'] = '\\u064A\\u0647';\n t['\\uFCF2'] = '\\u0640\\u064E\\u0651';\n t['\\uFCF3'] = '\\u0640\\u064F\\u0651';\n t['\\uFCF4'] = '\\u0640\\u0650\\u0651';\n t['\\uFCF5'] = '\\u0637\\u0649';\n t['\\uFCF6'] = '\\u0637\\u064A';\n t['\\uFCF7'] = '\\u0639\\u0649';\n t['\\uFCF8'] = '\\u0639\\u064A';\n t['\\uFCF9'] = '\\u063A\\u0649';\n t['\\uFCFA'] = '\\u063A\\u064A';\n t['\\uFCFB'] = '\\u0633\\u0649';\n t['\\uFCFC'] = '\\u0633\\u064A';\n t['\\uFCFD'] = '\\u0634\\u0649';\n t['\\uFCFE'] = '\\u0634\\u064A';\n t['\\uFCFF'] = '\\u062D\\u0649';\n t['\\uFD00'] = '\\u062D\\u064A';\n t['\\uFD01'] = '\\u062C\\u0649';\n t['\\uFD02'] = '\\u062C\\u064A';\n t['\\uFD03'] = '\\u062E\\u0649';\n t['\\uFD04'] = '\\u062E\\u064A';\n t['\\uFD05'] = '\\u0635\\u0649';\n t['\\uFD06'] = '\\u0635\\u064A';\n t['\\uFD07'] = '\\u0636\\u0649';\n t['\\uFD08'] = '\\u0636\\u064A';\n t['\\uFD09'] = '\\u0634\\u062C';\n t['\\uFD0A'] = '\\u0634\\u062D';\n t['\\uFD0B'] = '\\u0634\\u062E';\n t['\\uFD0C'] = '\\u0634\\u0645';\n t['\\uFD0D'] = '\\u0634\\u0631';\n t['\\uFD0E'] = '\\u0633\\u0631';\n t['\\uFD0F'] = '\\u0635\\u0631';\n t['\\uFD10'] = '\\u0636\\u0631';\n t['\\uFD11'] = '\\u0637\\u0649';\n t['\\uFD12'] = '\\u0637\\u064A';\n t['\\uFD13'] = '\\u0639\\u0649';\n t['\\uFD14'] = '\\u0639\\u064A';\n t['\\uFD15'] = '\\u063A\\u0649';\n t['\\uFD16'] = '\\u063A\\u064A';\n t['\\uFD17'] = '\\u0633\\u0649';\n t['\\uFD18'] = '\\u0633\\u064A';\n t['\\uFD19'] = '\\u0634\\u0649';\n t['\\uFD1A'] = '\\u0634\\u064A';\n t['\\uFD1B'] = '\\u062D\\u0649';\n t['\\uFD1C'] = '\\u062D\\u064A';\n t['\\uFD1D'] = '\\u062C\\u0649';\n t['\\uFD1E'] = '\\u062C\\u064A';\n t['\\uFD1F'] = '\\u062E\\u0649';\n t['\\uFD20'] = '\\u062E\\u064A';\n t['\\uFD21'] = '\\u0635\\u0649';\n t['\\uFD22'] = '\\u0635\\u064A';\n t['\\uFD23'] = '\\u0636\\u0649';\n t['\\uFD24'] = '\\u0636\\u064A';\n t['\\uFD25'] = '\\u0634\\u062C';\n t['\\uFD26'] = '\\u0634\\u062D';\n t['\\uFD27'] = '\\u0634\\u062E';\n t['\\uFD28'] = '\\u0634\\u0645';\n t['\\uFD29'] = '\\u0634\\u0631';\n t['\\uFD2A'] = '\\u0633\\u0631';\n t['\\uFD2B'] = '\\u0635\\u0631';\n t['\\uFD2C'] = '\\u0636\\u0631';\n t['\\uFD2D'] = '\\u0634\\u062C';\n t['\\uFD2E'] = '\\u0634\\u062D';\n t['\\uFD2F'] = '\\u0634\\u062E';\n t['\\uFD30'] = '\\u0634\\u0645';\n t['\\uFD31'] = '\\u0633\\u0647';\n t['\\uFD32'] = '\\u0634\\u0647';\n t['\\uFD33'] = '\\u0637\\u0645';\n t['\\uFD34'] = '\\u0633\\u062C';\n t['\\uFD35'] = '\\u0633\\u062D';\n t['\\uFD36'] = '\\u0633\\u062E';\n t['\\uFD37'] = '\\u0634\\u062C';\n t['\\uFD38'] = '\\u0634\\u062D';\n t['\\uFD39'] = '\\u0634\\u062E';\n t['\\uFD3A'] = '\\u0637\\u0645';\n t['\\uFD3B'] = '\\u0638\\u0645';\n t['\\uFD3C'] = '\\u0627\\u064B';\n t['\\uFD3D'] = '\\u0627\\u064B';\n t['\\uFD50'] = '\\u062A\\u062C\\u0645';\n t['\\uFD51'] = '\\u062A\\u062D\\u062C';\n t['\\uFD52'] = '\\u062A\\u062D\\u062C';\n t['\\uFD53'] = '\\u062A\\u062D\\u0645';\n t['\\uFD54'] = '\\u062A\\u062E\\u0645';\n t['\\uFD55'] = '\\u062A\\u0645\\u062C';\n t['\\uFD56'] = '\\u062A\\u0645\\u062D';\n t['\\uFD57'] = '\\u062A\\u0645\\u062E';\n t['\\uFD58'] = '\\u062C\\u0645\\u062D';\n t['\\uFD59'] = '\\u062C\\u0645\\u062D';\n t['\\uFD5A'] = '\\u062D\\u0645\\u064A';\n t['\\uFD5B'] = '\\u062D\\u0645\\u0649';\n t['\\uFD5C'] = '\\u0633\\u062D\\u062C';\n t['\\uFD5D'] = '\\u0633\\u062C\\u062D';\n t['\\uFD5E'] = '\\u0633\\u062C\\u0649';\n t['\\uFD5F'] = '\\u0633\\u0645\\u062D';\n t['\\uFD60'] = '\\u0633\\u0645\\u062D';\n t['\\uFD61'] = '\\u0633\\u0645\\u062C';\n t['\\uFD62'] = '\\u0633\\u0645\\u0645';\n t['\\uFD63'] = '\\u0633\\u0645\\u0645';\n t['\\uFD64'] = '\\u0635\\u062D\\u062D';\n t['\\uFD65'] = '\\u0635\\u062D\\u062D';\n t['\\uFD66'] = '\\u0635\\u0645\\u0645';\n t['\\uFD67'] = '\\u0634\\u062D\\u0645';\n t['\\uFD68'] = '\\u0634\\u062D\\u0645';\n t['\\uFD69'] = '\\u0634\\u062C\\u064A';\n t['\\uFD6A'] = '\\u0634\\u0645\\u062E';\n t['\\uFD6B'] = '\\u0634\\u0645\\u062E';\n t['\\uFD6C'] = '\\u0634\\u0645\\u0645';\n t['\\uFD6D'] = '\\u0634\\u0645\\u0645';\n t['\\uFD6E'] = '\\u0636\\u062D\\u0649';\n t['\\uFD6F'] = '\\u0636\\u062E\\u0645';\n t['\\uFD70'] = '\\u0636\\u062E\\u0645';\n t['\\uFD71'] = '\\u0637\\u0645\\u062D';\n t['\\uFD72'] = '\\u0637\\u0645\\u062D';\n t['\\uFD73'] = '\\u0637\\u0645\\u0645';\n t['\\uFD74'] = '\\u0637\\u0645\\u064A';\n t['\\uFD75'] = '\\u0639\\u062C\\u0645';\n t['\\uFD76'] = '\\u0639\\u0645\\u0645';\n t['\\uFD77'] = '\\u0639\\u0645\\u0645';\n t['\\uFD78'] = '\\u0639\\u0645\\u0649';\n t['\\uFD79'] = '\\u063A\\u0645\\u0645';\n t['\\uFD7A'] = '\\u063A\\u0645\\u064A';\n t['\\uFD7B'] = '\\u063A\\u0645\\u0649';\n t['\\uFD7C'] = '\\u0641\\u062E\\u0645';\n t['\\uFD7D'] = '\\u0641\\u062E\\u0645';\n t['\\uFD7E'] = '\\u0642\\u0645\\u062D';\n t['\\uFD7F'] = '\\u0642\\u0645\\u0645';\n t['\\uFD80'] = '\\u0644\\u062D\\u0645';\n t['\\uFD81'] = '\\u0644\\u062D\\u064A';\n t['\\uFD82'] = '\\u0644\\u062D\\u0649';\n t['\\uFD83'] = '\\u0644\\u062C\\u062C';\n t['\\uFD84'] = '\\u0644\\u062C\\u062C';\n t['\\uFD85'] = '\\u0644\\u062E\\u0645';\n t['\\uFD86'] = '\\u0644\\u062E\\u0645';\n t['\\uFD87'] = '\\u0644\\u0645\\u062D';\n t['\\uFD88'] = '\\u0644\\u0645\\u062D';\n t['\\uFD89'] = '\\u0645\\u062D\\u062C';\n t['\\uFD8A'] = '\\u0645\\u062D\\u0645';\n t['\\uFD8B'] = '\\u0645\\u062D\\u064A';\n t['\\uFD8C'] = '\\u0645\\u062C\\u062D';\n t['\\uFD8D'] = '\\u0645\\u062C\\u0645';\n t['\\uFD8E'] = '\\u0645\\u062E\\u062C';\n t['\\uFD8F'] = '\\u0645\\u062E\\u0645';\n t['\\uFD92'] = '\\u0645\\u062C\\u062E';\n t['\\uFD93'] = '\\u0647\\u0645\\u062C';\n t['\\uFD94'] = '\\u0647\\u0645\\u0645';\n t['\\uFD95'] = '\\u0646\\u062D\\u0645';\n t['\\uFD96'] = '\\u0646\\u062D\\u0649';\n t['\\uFD97'] = '\\u0646\\u062C\\u0645';\n t['\\uFD98'] = '\\u0646\\u062C\\u0645';\n t['\\uFD99'] = '\\u0646\\u062C\\u0649';\n t['\\uFD9A'] = '\\u0646\\u0645\\u064A';\n t['\\uFD9B'] = '\\u0646\\u0645\\u0649';\n t['\\uFD9C'] = '\\u064A\\u0645\\u0645';\n t['\\uFD9D'] = '\\u064A\\u0645\\u0645';\n t['\\uFD9E'] = '\\u0628\\u062E\\u064A';\n t['\\uFD9F'] = '\\u062A\\u062C\\u064A';\n t['\\uFDA0'] = '\\u062A\\u062C\\u0649';\n t['\\uFDA1'] = '\\u062A\\u062E\\u064A';\n t['\\uFDA2'] = '\\u062A\\u062E\\u0649';\n t['\\uFDA3'] = '\\u062A\\u0645\\u064A';\n t['\\uFDA4'] = '\\u062A\\u0645\\u0649';\n t['\\uFDA5'] = '\\u062C\\u0645\\u064A';\n t['\\uFDA6'] = '\\u062C\\u062D\\u0649';\n t['\\uFDA7'] = '\\u062C\\u0645\\u0649';\n t['\\uFDA8'] = '\\u0633\\u062E\\u0649';\n t['\\uFDA9'] = '\\u0635\\u062D\\u064A';\n t['\\uFDAA'] = '\\u0634\\u062D\\u064A';\n t['\\uFDAB'] = '\\u0636\\u062D\\u064A';\n t['\\uFDAC'] = '\\u0644\\u062C\\u064A';\n t['\\uFDAD'] = '\\u0644\\u0645\\u064A';\n t['\\uFDAE'] = '\\u064A\\u062D\\u064A';\n t['\\uFDAF'] = '\\u064A\\u062C\\u064A';\n t['\\uFDB0'] = '\\u064A\\u0645\\u064A';\n t['\\uFDB1'] = '\\u0645\\u0645\\u064A';\n t['\\uFDB2'] = '\\u0642\\u0645\\u064A';\n t['\\uFDB3'] = '\\u0646\\u062D\\u064A';\n t['\\uFDB4'] = '\\u0642\\u0645\\u062D';\n t['\\uFDB5'] = '\\u0644\\u062D\\u0645';\n t['\\uFDB6'] = '\\u0639\\u0645\\u064A';\n t['\\uFDB7'] = '\\u0643\\u0645\\u064A';\n t['\\uFDB8'] = '\\u0646\\u062C\\u062D';\n t['\\uFDB9'] = '\\u0645\\u062E\\u064A';\n t['\\uFDBA'] = '\\u0644\\u062C\\u0645';\n t['\\uFDBB'] = '\\u0643\\u0645\\u0645';\n t['\\uFDBC'] = '\\u0644\\u062C\\u0645';\n t['\\uFDBD'] = '\\u0646\\u062C\\u062D';\n t['\\uFDBE'] = '\\u062C\\u062D\\u064A';\n t['\\uFDBF'] = '\\u062D\\u062C\\u064A';\n t['\\uFDC0'] = '\\u0645\\u062C\\u064A';\n t['\\uFDC1'] = '\\u0641\\u0645\\u064A';\n t['\\uFDC2'] = '\\u0628\\u062D\\u064A';\n t['\\uFDC3'] = '\\u0643\\u0645\\u0645';\n t['\\uFDC4'] = '\\u0639\\u062C\\u0645';\n t['\\uFDC5'] = '\\u0635\\u0645\\u0645';\n t['\\uFDC6'] = '\\u0633\\u062E\\u064A';\n t['\\uFDC7'] = '\\u0646\\u062C\\u064A';\n t['\\uFE49'] = '\\u203E';\n t['\\uFE4A'] = '\\u203E';\n t['\\uFE4B'] = '\\u203E';\n t['\\uFE4C'] = '\\u203E';\n t['\\uFE4D'] = '\\u005F';\n t['\\uFE4E'] = '\\u005F';\n t['\\uFE4F'] = '\\u005F';\n t['\\uFE80'] = '\\u0621';\n t['\\uFE81'] = '\\u0622';\n t['\\uFE82'] = '\\u0622';\n t['\\uFE83'] = '\\u0623';\n t['\\uFE84'] = '\\u0623';\n t['\\uFE85'] = '\\u0624';\n t['\\uFE86'] = '\\u0624';\n t['\\uFE87'] = '\\u0625';\n t['\\uFE88'] = '\\u0625';\n t['\\uFE89'] = '\\u0626';\n t['\\uFE8A'] = '\\u0626';\n t['\\uFE8B'] = '\\u0626';\n t['\\uFE8C'] = '\\u0626';\n t['\\uFE8D'] = '\\u0627';\n t['\\uFE8E'] = '\\u0627';\n t['\\uFE8F'] = '\\u0628';\n t['\\uFE90'] = '\\u0628';\n t['\\uFE91'] = '\\u0628';\n t['\\uFE92'] = '\\u0628';\n t['\\uFE93'] = '\\u0629';\n t['\\uFE94'] = '\\u0629';\n t['\\uFE95'] = '\\u062A';\n t['\\uFE96'] = '\\u062A';\n t['\\uFE97'] = '\\u062A';\n t['\\uFE98'] = '\\u062A';\n t['\\uFE99'] = '\\u062B';\n t['\\uFE9A'] = '\\u062B';\n t['\\uFE9B'] = '\\u062B';\n t['\\uFE9C'] = '\\u062B';\n t['\\uFE9D'] = '\\u062C';\n t['\\uFE9E'] = '\\u062C';\n t['\\uFE9F'] = '\\u062C';\n t['\\uFEA0'] = '\\u062C';\n t['\\uFEA1'] = '\\u062D';\n t['\\uFEA2'] = '\\u062D';\n t['\\uFEA3'] = '\\u062D';\n t['\\uFEA4'] = '\\u062D';\n t['\\uFEA5'] = '\\u062E';\n t['\\uFEA6'] = '\\u062E';\n t['\\uFEA7'] = '\\u062E';\n t['\\uFEA8'] = '\\u062E';\n t['\\uFEA9'] = '\\u062F';\n t['\\uFEAA'] = '\\u062F';\n t['\\uFEAB'] = '\\u0630';\n t['\\uFEAC'] = '\\u0630';\n t['\\uFEAD'] = '\\u0631';\n t['\\uFEAE'] = '\\u0631';\n t['\\uFEAF'] = '\\u0632';\n t['\\uFEB0'] = '\\u0632';\n t['\\uFEB1'] = '\\u0633';\n t['\\uFEB2'] = '\\u0633';\n t['\\uFEB3'] = '\\u0633';\n t['\\uFEB4'] = '\\u0633';\n t['\\uFEB5'] = '\\u0634';\n t['\\uFEB6'] = '\\u0634';\n t['\\uFEB7'] = '\\u0634';\n t['\\uFEB8'] = '\\u0634';\n t['\\uFEB9'] = '\\u0635';\n t['\\uFEBA'] = '\\u0635';\n t['\\uFEBB'] = '\\u0635';\n t['\\uFEBC'] = '\\u0635';\n t['\\uFEBD'] = '\\u0636';\n t['\\uFEBE'] = '\\u0636';\n t['\\uFEBF'] = '\\u0636';\n t['\\uFEC0'] = '\\u0636';\n t['\\uFEC1'] = '\\u0637';\n t['\\uFEC2'] = '\\u0637';\n t['\\uFEC3'] = '\\u0637';\n t['\\uFEC4'] = '\\u0637';\n t['\\uFEC5'] = '\\u0638';\n t['\\uFEC6'] = '\\u0638';\n t['\\uFEC7'] = '\\u0638';\n t['\\uFEC8'] = '\\u0638';\n t['\\uFEC9'] = '\\u0639';\n t['\\uFECA'] = '\\u0639';\n t['\\uFECB'] = '\\u0639';\n t['\\uFECC'] = '\\u0639';\n t['\\uFECD'] = '\\u063A';\n t['\\uFECE'] = '\\u063A';\n t['\\uFECF'] = '\\u063A';\n t['\\uFED0'] = '\\u063A';\n t['\\uFED1'] = '\\u0641';\n t['\\uFED2'] = '\\u0641';\n t['\\uFED3'] = '\\u0641';\n t['\\uFED4'] = '\\u0641';\n t['\\uFED5'] = '\\u0642';\n t['\\uFED6'] = '\\u0642';\n t['\\uFED7'] = '\\u0642';\n t['\\uFED8'] = '\\u0642';\n t['\\uFED9'] = '\\u0643';\n t['\\uFEDA'] = '\\u0643';\n t['\\uFEDB'] = '\\u0643';\n t['\\uFEDC'] = '\\u0643';\n t['\\uFEDD'] = '\\u0644';\n t['\\uFEDE'] = '\\u0644';\n t['\\uFEDF'] = '\\u0644';\n t['\\uFEE0'] = '\\u0644';\n t['\\uFEE1'] = '\\u0645';\n t['\\uFEE2'] = '\\u0645';\n t['\\uFEE3'] = '\\u0645';\n t['\\uFEE4'] = '\\u0645';\n t['\\uFEE5'] = '\\u0646';\n t['\\uFEE6'] = '\\u0646';\n t['\\uFEE7'] = '\\u0646';\n t['\\uFEE8'] = '\\u0646';\n t['\\uFEE9'] = '\\u0647';\n t['\\uFEEA'] = '\\u0647';\n t['\\uFEEB'] = '\\u0647';\n t['\\uFEEC'] = '\\u0647';\n t['\\uFEED'] = '\\u0648';\n t['\\uFEEE'] = '\\u0648';\n t['\\uFEEF'] = '\\u0649';\n t['\\uFEF0'] = '\\u0649';\n t['\\uFEF1'] = '\\u064A';\n t['\\uFEF2'] = '\\u064A';\n t['\\uFEF3'] = '\\u064A';\n t['\\uFEF4'] = '\\u064A';\n t['\\uFEF5'] = '\\u0644\\u0622';\n t['\\uFEF6'] = '\\u0644\\u0622';\n t['\\uFEF7'] = '\\u0644\\u0623';\n t['\\uFEF8'] = '\\u0644\\u0623';\n t['\\uFEF9'] = '\\u0644\\u0625';\n t['\\uFEFA'] = '\\u0644\\u0625';\n t['\\uFEFB'] = '\\u0644\\u0627';\n t['\\uFEFC'] = '\\u0644\\u0627';\n});\nfunction reverseIfRtl(chars) {\n var charsLength = chars.length;\n if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) {\n  return chars;\n }\n var s = '';\n for (var ii = charsLength - 1; ii >= 0; ii--) {\n  s += chars[ii];\n }\n return s;\n}\nexports.mapSpecialUnicodeValues = mapSpecialUnicodeValues;\nexports.reverseIfRtl = reverseIfRtl;\nexports.getUnicodeRangeFor = getUnicodeRangeFor;\nexports.getNormalizedUnicodes = getNormalizedUnicodes;\nexports.getUnicodeForGlyph = getUnicodeForGlyph;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar ArithmeticDecoder = function ArithmeticDecoderClosure() {\n  var QeTable = [{\n    qe: 0x5601,\n    nmps: 1,\n    nlps: 1,\n    switchFlag: 1\n  }, {\n    qe: 0x3401,\n    nmps: 2,\n    nlps: 6,\n    switchFlag: 0\n  }, {\n    qe: 0x1801,\n    nmps: 3,\n    nlps: 9,\n    switchFlag: 0\n  }, {\n    qe: 0x0AC1,\n    nmps: 4,\n    nlps: 12,\n    switchFlag: 0\n  }, {\n    qe: 0x0521,\n    nmps: 5,\n    nlps: 29,\n    switchFlag: 0\n  }, {\n    qe: 0x0221,\n    nmps: 38,\n    nlps: 33,\n    switchFlag: 0\n  }, {\n    qe: 0x5601,\n    nmps: 7,\n    nlps: 6,\n    switchFlag: 1\n  }, {\n    qe: 0x5401,\n    nmps: 8,\n    nlps: 14,\n    switchFlag: 0\n  }, {\n    qe: 0x4801,\n    nmps: 9,\n    nlps: 14,\n    switchFlag: 0\n  }, {\n    qe: 0x3801,\n    nmps: 10,\n    nlps: 14,\n    switchFlag: 0\n  }, {\n    qe: 0x3001,\n    nmps: 11,\n    nlps: 17,\n    switchFlag: 0\n  }, {\n    qe: 0x2401,\n    nmps: 12,\n    nlps: 18,\n    switchFlag: 0\n  }, {\n    qe: 0x1C01,\n    nmps: 13,\n    nlps: 20,\n    switchFlag: 0\n  }, {\n    qe: 0x1601,\n    nmps: 29,\n    nlps: 21,\n    switchFlag: 0\n  }, {\n    qe: 0x5601,\n    nmps: 15,\n    nlps: 14,\n    switchFlag: 1\n  }, {\n    qe: 0x5401,\n    nmps: 16,\n    nlps: 14,\n    switchFlag: 0\n  }, {\n    qe: 0x5101,\n    nmps: 17,\n    nlps: 15,\n    switchFlag: 0\n  }, {\n    qe: 0x4801,\n    nmps: 18,\n    nlps: 16,\n    switchFlag: 0\n  }, {\n    qe: 0x3801,\n    nmps: 19,\n    nlps: 17,\n    switchFlag: 0\n  }, {\n    qe: 0x3401,\n    nmps: 20,\n    nlps: 18,\n    switchFlag: 0\n  }, {\n    qe: 0x3001,\n    nmps: 21,\n    nlps: 19,\n    switchFlag: 0\n  }, {\n    qe: 0x2801,\n    nmps: 22,\n    nlps: 19,\n    switchFlag: 0\n  }, {\n    qe: 0x2401,\n    nmps: 23,\n    nlps: 20,\n    switchFlag: 0\n  }, {\n    qe: 0x2201,\n    nmps: 24,\n    nlps: 21,\n    switchFlag: 0\n  }, {\n    qe: 0x1C01,\n    nmps: 25,\n    nlps: 22,\n    switchFlag: 0\n  }, {\n    qe: 0x1801,\n    nmps: 26,\n    nlps: 23,\n    switchFlag: 0\n  }, {\n    qe: 0x1601,\n    nmps: 27,\n    nlps: 24,\n    switchFlag: 0\n  }, {\n    qe: 0x1401,\n    nmps: 28,\n    nlps: 25,\n    switchFlag: 0\n  }, {\n    qe: 0x1201,\n    nmps: 29,\n    nlps: 26,\n    switchFlag: 0\n  }, {\n    qe: 0x1101,\n    nmps: 30,\n    nlps: 27,\n    switchFlag: 0\n  }, {\n    qe: 0x0AC1,\n    nmps: 31,\n    nlps: 28,\n    switchFlag: 0\n  }, {\n    qe: 0x09C1,\n    nmps: 32,\n    nlps: 29,\n    switchFlag: 0\n  }, {\n    qe: 0x08A1,\n    nmps: 33,\n    nlps: 30,\n    switchFlag: 0\n  }, {\n    qe: 0x0521,\n    nmps: 34,\n    nlps: 31,\n    switchFlag: 0\n  }, {\n    qe: 0x0441,\n    nmps: 35,\n    nlps: 32,\n    switchFlag: 0\n  }, {\n    qe: 0x02A1,\n    nmps: 36,\n    nlps: 33,\n    switchFlag: 0\n  }, {\n    qe: 0x0221,\n    nmps: 37,\n    nlps: 34,\n    switchFlag: 0\n  }, {\n    qe: 0x0141,\n    nmps: 38,\n    nlps: 35,\n    switchFlag: 0\n  }, {\n    qe: 0x0111,\n    nmps: 39,\n    nlps: 36,\n    switchFlag: 0\n  }, {\n    qe: 0x0085,\n    nmps: 40,\n    nlps: 37,\n    switchFlag: 0\n  }, {\n    qe: 0x0049,\n    nmps: 41,\n    nlps: 38,\n    switchFlag: 0\n  }, {\n    qe: 0x0025,\n    nmps: 42,\n    nlps: 39,\n    switchFlag: 0\n  }, {\n    qe: 0x0015,\n    nmps: 43,\n    nlps: 40,\n    switchFlag: 0\n  }, {\n    qe: 0x0009,\n    nmps: 44,\n    nlps: 41,\n    switchFlag: 0\n  }, {\n    qe: 0x0005,\n    nmps: 45,\n    nlps: 42,\n    switchFlag: 0\n  }, {\n    qe: 0x0001,\n    nmps: 45,\n    nlps: 43,\n    switchFlag: 0\n  }, {\n    qe: 0x5601,\n    nmps: 46,\n    nlps: 46,\n    switchFlag: 0\n  }];\n  function ArithmeticDecoder(data, start, end) {\n    this.data = data;\n    this.bp = start;\n    this.dataEnd = end;\n    this.chigh = data[start];\n    this.clow = 0;\n    this.byteIn();\n    this.chigh = this.chigh << 7 & 0xFFFF | this.clow >> 9 & 0x7F;\n    this.clow = this.clow << 7 & 0xFFFF;\n    this.ct -= 7;\n    this.a = 0x8000;\n  }\n  ArithmeticDecoder.prototype = {\n    byteIn: function ArithmeticDecoder_byteIn() {\n      var data = this.data;\n      var bp = this.bp;\n      if (data[bp] === 0xFF) {\n        var b1 = data[bp + 1];\n        if (b1 > 0x8F) {\n          this.clow += 0xFF00;\n          this.ct = 8;\n        } else {\n          bp++;\n          this.clow += data[bp] << 9;\n          this.ct = 7;\n          this.bp = bp;\n        }\n      } else {\n        bp++;\n        this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xFF00;\n        this.ct = 8;\n        this.bp = bp;\n      }\n      if (this.clow > 0xFFFF) {\n        this.chigh += this.clow >> 16;\n        this.clow &= 0xFFFF;\n      }\n    },\n    readBit: function ArithmeticDecoder_readBit(contexts, pos) {\n      var cx_index = contexts[pos] >> 1,\n          cx_mps = contexts[pos] & 1;\n      var qeTableIcx = QeTable[cx_index];\n      var qeIcx = qeTableIcx.qe;\n      var d;\n      var a = this.a - qeIcx;\n      if (this.chigh < qeIcx) {\n        if (a < qeIcx) {\n          a = qeIcx;\n          d = cx_mps;\n          cx_index = qeTableIcx.nmps;\n        } else {\n          a = qeIcx;\n          d = 1 ^ cx_mps;\n          if (qeTableIcx.switchFlag === 1) {\n            cx_mps = d;\n          }\n          cx_index = qeTableIcx.nlps;\n        }\n      } else {\n        this.chigh -= qeIcx;\n        if ((a & 0x8000) !== 0) {\n          this.a = a;\n          return cx_mps;\n        }\n        if (a < qeIcx) {\n          d = 1 ^ cx_mps;\n          if (qeTableIcx.switchFlag === 1) {\n            cx_mps = d;\n          }\n          cx_index = qeTableIcx.nlps;\n        } else {\n          d = cx_mps;\n          cx_index = qeTableIcx.nmps;\n        }\n      }\n      do {\n        if (this.ct === 0) {\n          this.byteIn();\n        }\n        a <<= 1;\n        this.chigh = this.chigh << 1 & 0xFFFF | this.clow >> 15 & 1;\n        this.clow = this.clow << 1 & 0xFFFF;\n        this.ct--;\n      } while ((a & 0x8000) === 0);\n      this.a = a;\n      contexts[pos] = cx_index << 1 | cx_mps;\n      return d;\n    }\n  };\n  return ArithmeticDecoder;\n}();\nexports.ArithmeticDecoder = ArithmeticDecoder;\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.CFFCompiler = exports.CFFPrivateDict = exports.CFFTopDict = exports.CFFCharset = exports.CFFIndex = exports.CFFStrings = exports.CFFHeader = exports.CFF = exports.CFFParser = exports.CFFStandardStrings = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _charsets = __w_pdfjs_require__(21);\n\nvar _encodings = __w_pdfjs_require__(4);\n\nvar MAX_SUBR_NESTING = 10;\nvar CFFStandardStrings = ['.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003', 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'];\nvar CFFParser = function CFFParserClosure() {\n  var CharstringValidationData = [null, {\n    id: 'hstem',\n    min: 2,\n    stackClearing: true,\n    stem: true\n  }, null, {\n    id: 'vstem',\n    min: 2,\n    stackClearing: true,\n    stem: true\n  }, {\n    id: 'vmoveto',\n    min: 1,\n    stackClearing: true\n  }, {\n    id: 'rlineto',\n    min: 2,\n    resetStack: true\n  }, {\n    id: 'hlineto',\n    min: 1,\n    resetStack: true\n  }, {\n    id: 'vlineto',\n    min: 1,\n    resetStack: true\n  }, {\n    id: 'rrcurveto',\n    min: 6,\n    resetStack: true\n  }, null, {\n    id: 'callsubr',\n    min: 1,\n    undefStack: true\n  }, {\n    id: 'return',\n    min: 0,\n    undefStack: true\n  }, null, null, {\n    id: 'endchar',\n    min: 0,\n    stackClearing: true\n  }, null, null, null, {\n    id: 'hstemhm',\n    min: 2,\n    stackClearing: true,\n    stem: true\n  }, {\n    id: 'hintmask',\n    min: 0,\n    stackClearing: true\n  }, {\n    id: 'cntrmask',\n    min: 0,\n    stackClearing: true\n  }, {\n    id: 'rmoveto',\n    min: 2,\n    stackClearing: true\n  }, {\n    id: 'hmoveto',\n    min: 1,\n    stackClearing: true\n  }, {\n    id: 'vstemhm',\n    min: 2,\n    stackClearing: true,\n    stem: true\n  }, {\n    id: 'rcurveline',\n    min: 8,\n    resetStack: true\n  }, {\n    id: 'rlinecurve',\n    min: 8,\n    resetStack: true\n  }, {\n    id: 'vvcurveto',\n    min: 4,\n    resetStack: true\n  }, {\n    id: 'hhcurveto',\n    min: 4,\n    resetStack: true\n  }, null, {\n    id: 'callgsubr',\n    min: 1,\n    undefStack: true\n  }, {\n    id: 'vhcurveto',\n    min: 4,\n    resetStack: true\n  }, {\n    id: 'hvcurveto',\n    min: 4,\n    resetStack: true\n  }];\n  var CharstringValidationData12 = [null, null, null, {\n    id: 'and',\n    min: 2,\n    stackDelta: -1\n  }, {\n    id: 'or',\n    min: 2,\n    stackDelta: -1\n  }, {\n    id: 'not',\n    min: 1,\n    stackDelta: 0\n  }, null, null, null, {\n    id: 'abs',\n    min: 1,\n    stackDelta: 0\n  }, {\n    id: 'add',\n    min: 2,\n    stackDelta: -1,\n    stackFn: function stack_div(stack, index) {\n      stack[index - 2] = stack[index - 2] + stack[index - 1];\n    }\n  }, {\n    id: 'sub',\n    min: 2,\n    stackDelta: -1,\n    stackFn: function stack_div(stack, index) {\n      stack[index - 2] = stack[index - 2] - stack[index - 1];\n    }\n  }, {\n    id: 'div',\n    min: 2,\n    stackDelta: -1,\n    stackFn: function stack_div(stack, index) {\n      stack[index - 2] = stack[index - 2] / stack[index - 1];\n    }\n  }, null, {\n    id: 'neg',\n    min: 1,\n    stackDelta: 0,\n    stackFn: function stack_div(stack, index) {\n      stack[index - 1] = -stack[index - 1];\n    }\n  }, {\n    id: 'eq',\n    min: 2,\n    stackDelta: -1\n  }, null, null, {\n    id: 'drop',\n    min: 1,\n    stackDelta: -1\n  }, null, {\n    id: 'put',\n    min: 2,\n    stackDelta: -2\n  }, {\n    id: 'get',\n    min: 1,\n    stackDelta: 0\n  }, {\n    id: 'ifelse',\n    min: 4,\n    stackDelta: -3\n  }, {\n    id: 'random',\n    min: 0,\n    stackDelta: 1\n  }, {\n    id: 'mul',\n    min: 2,\n    stackDelta: -1,\n    stackFn: function stack_div(stack, index) {\n      stack[index - 2] = stack[index - 2] * stack[index - 1];\n    }\n  }, null, {\n    id: 'sqrt',\n    min: 1,\n    stackDelta: 0\n  }, {\n    id: 'dup',\n    min: 1,\n    stackDelta: 1\n  }, {\n    id: 'exch',\n    min: 2,\n    stackDelta: 0\n  }, {\n    id: 'index',\n    min: 2,\n    stackDelta: 0\n  }, {\n    id: 'roll',\n    min: 3,\n    stackDelta: -2\n  }, null, null, null, {\n    id: 'hflex',\n    min: 7,\n    resetStack: true\n  }, {\n    id: 'flex',\n    min: 13,\n    resetStack: true\n  }, {\n    id: 'hflex1',\n    min: 9,\n    resetStack: true\n  }, {\n    id: 'flex1',\n    min: 11,\n    resetStack: true\n  }];\n  function CFFParser(file, properties, seacAnalysisEnabled) {\n    this.bytes = file.getBytes();\n    this.properties = properties;\n    this.seacAnalysisEnabled = !!seacAnalysisEnabled;\n  }\n  CFFParser.prototype = {\n    parse: function CFFParser_parse() {\n      var properties = this.properties;\n      var cff = new CFF();\n      this.cff = cff;\n      var header = this.parseHeader();\n      var nameIndex = this.parseIndex(header.endPos);\n      var topDictIndex = this.parseIndex(nameIndex.endPos);\n      var stringIndex = this.parseIndex(topDictIndex.endPos);\n      var globalSubrIndex = this.parseIndex(stringIndex.endPos);\n      var topDictParsed = this.parseDict(topDictIndex.obj.get(0));\n      var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);\n      cff.header = header.obj;\n      cff.names = this.parseNameIndex(nameIndex.obj);\n      cff.strings = this.parseStringIndex(stringIndex.obj);\n      cff.topDict = topDict;\n      cff.globalSubrIndex = globalSubrIndex.obj;\n      this.parsePrivateDict(cff.topDict);\n      cff.isCIDFont = topDict.hasName('ROS');\n      var charStringOffset = topDict.getByName('CharStrings');\n      var charStringIndex = this.parseIndex(charStringOffset).obj;\n      var fontMatrix = topDict.getByName('FontMatrix');\n      if (fontMatrix) {\n        properties.fontMatrix = fontMatrix;\n      }\n      var fontBBox = topDict.getByName('FontBBox');\n      if (fontBBox) {\n        properties.ascent = Math.max(fontBBox[3], fontBBox[1]);\n        properties.descent = Math.min(fontBBox[1], fontBBox[3]);\n        properties.ascentScaled = true;\n      }\n      var charset, encoding;\n      if (cff.isCIDFont) {\n        var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj;\n        for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) {\n          var dictRaw = fdArrayIndex.get(i);\n          var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings);\n          this.parsePrivateDict(fontDict);\n          cff.fdArray.push(fontDict);\n        }\n        encoding = null;\n        charset = this.parseCharsets(topDict.getByName('charset'), charStringIndex.count, cff.strings, true);\n        cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'), charStringIndex.count);\n      } else {\n        charset = this.parseCharsets(topDict.getByName('charset'), charStringIndex.count, cff.strings, false);\n        encoding = this.parseEncoding(topDict.getByName('Encoding'), properties, cff.strings, charset.charset);\n      }\n      cff.charset = charset;\n      cff.encoding = encoding;\n      var charStringsAndSeacs = this.parseCharStrings({\n        charStrings: charStringIndex,\n        localSubrIndex: topDict.privateDict.subrsIndex,\n        globalSubrIndex: globalSubrIndex.obj,\n        fdSelect: cff.fdSelect,\n        fdArray: cff.fdArray,\n        privateDict: topDict.privateDict\n      });\n      cff.charStrings = charStringsAndSeacs.charStrings;\n      cff.seacs = charStringsAndSeacs.seacs;\n      cff.widths = charStringsAndSeacs.widths;\n      return cff;\n    },\n    parseHeader: function CFFParser_parseHeader() {\n      var bytes = this.bytes;\n      var bytesLength = bytes.length;\n      var offset = 0;\n      while (offset < bytesLength && bytes[offset] !== 1) {\n        ++offset;\n      }\n      if (offset >= bytesLength) {\n        throw new _util.FormatError('Invalid CFF header');\n      }\n      if (offset !== 0) {\n        (0, _util.info)('cff data is shifted');\n        bytes = bytes.subarray(offset);\n        this.bytes = bytes;\n      }\n      var major = bytes[0];\n      var minor = bytes[1];\n      var hdrSize = bytes[2];\n      var offSize = bytes[3];\n      var header = new CFFHeader(major, minor, hdrSize, offSize);\n      return {\n        obj: header,\n        endPos: hdrSize\n      };\n    },\n    parseDict: function CFFParser_parseDict(dict) {\n      var pos = 0;\n      function parseOperand() {\n        var value = dict[pos++];\n        if (value === 30) {\n          return parseFloatOperand();\n        } else if (value === 28) {\n          value = dict[pos++];\n          value = (value << 24 | dict[pos++] << 16) >> 16;\n          return value;\n        } else if (value === 29) {\n          value = dict[pos++];\n          value = value << 8 | dict[pos++];\n          value = value << 8 | dict[pos++];\n          value = value << 8 | dict[pos++];\n          return value;\n        } else if (value >= 32 && value <= 246) {\n          return value - 139;\n        } else if (value >= 247 && value <= 250) {\n          return (value - 247) * 256 + dict[pos++] + 108;\n        } else if (value >= 251 && value <= 254) {\n          return -((value - 251) * 256) - dict[pos++] - 108;\n        }\n        (0, _util.warn)('CFFParser_parseDict: \"' + value + '\" is a reserved command.');\n        return NaN;\n      }\n      function parseFloatOperand() {\n        var str = '';\n        var eof = 15;\n        var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'E', 'E-', null, '-'];\n        var length = dict.length;\n        while (pos < length) {\n          var b = dict[pos++];\n          var b1 = b >> 4;\n          var b2 = b & 15;\n          if (b1 === eof) {\n            break;\n          }\n          str += lookup[b1];\n          if (b2 === eof) {\n            break;\n          }\n          str += lookup[b2];\n        }\n        return parseFloat(str);\n      }\n      var operands = [];\n      var entries = [];\n      pos = 0;\n      var end = dict.length;\n      while (pos < end) {\n        var b = dict[pos];\n        if (b <= 21) {\n          if (b === 12) {\n            b = b << 8 | dict[++pos];\n          }\n          entries.push([b, operands]);\n          operands = [];\n          ++pos;\n        } else {\n          operands.push(parseOperand());\n        }\n      }\n      return entries;\n    },\n    parseIndex: function CFFParser_parseIndex(pos) {\n      var cffIndex = new CFFIndex();\n      var bytes = this.bytes;\n      var count = bytes[pos++] << 8 | bytes[pos++];\n      var offsets = [];\n      var end = pos;\n      var i, ii;\n      if (count !== 0) {\n        var offsetSize = bytes[pos++];\n        var startPos = pos + (count + 1) * offsetSize - 1;\n        for (i = 0, ii = count + 1; i < ii; ++i) {\n          var offset = 0;\n          for (var j = 0; j < offsetSize; ++j) {\n            offset <<= 8;\n            offset += bytes[pos++];\n          }\n          offsets.push(startPos + offset);\n        }\n        end = offsets[count];\n      }\n      for (i = 0, ii = offsets.length - 1; i < ii; ++i) {\n        var offsetStart = offsets[i];\n        var offsetEnd = offsets[i + 1];\n        cffIndex.add(bytes.subarray(offsetStart, offsetEnd));\n      }\n      return {\n        obj: cffIndex,\n        endPos: end\n      };\n    },\n    parseNameIndex: function CFFParser_parseNameIndex(index) {\n      var names = [];\n      for (var i = 0, ii = index.count; i < ii; ++i) {\n        var name = index.get(i);\n        var length = Math.min(name.length, 127);\n        var data = [];\n        for (var j = 0; j < length; ++j) {\n          var c = name[j];\n          if (j === 0 && c === 0) {\n            data[j] = c;\n            continue;\n          }\n          if (c < 33 || c > 126 || c === 91 || c === 93 || c === 40 || c === 41 || c === 123 || c === 125 || c === 60 || c === 62 || c === 47 || c === 37 || c === 35) {\n            data[j] = 95;\n            continue;\n          }\n          data[j] = c;\n        }\n        names.push((0, _util.bytesToString)(data));\n      }\n      return names;\n    },\n    parseStringIndex: function CFFParser_parseStringIndex(index) {\n      var strings = new CFFStrings();\n      for (var i = 0, ii = index.count; i < ii; ++i) {\n        var data = index.get(i);\n        strings.add((0, _util.bytesToString)(data));\n      }\n      return strings;\n    },\n    createDict: function CFFParser_createDict(Type, dict, strings) {\n      var cffDict = new Type(strings);\n      for (var i = 0, ii = dict.length; i < ii; ++i) {\n        var pair = dict[i];\n        var key = pair[0];\n        var value = pair[1];\n        cffDict.setByKey(key, value);\n      }\n      return cffDict;\n    },\n    parseCharString: function CFFParser_parseCharString(state, data, localSubrIndex, globalSubrIndex) {\n      if (!data || state.callDepth > MAX_SUBR_NESTING) {\n        return false;\n      }\n      var stackSize = state.stackSize;\n      var stack = state.stack;\n      var length = data.length;\n      for (var j = 0; j < length;) {\n        var value = data[j++];\n        var validationCommand = null;\n        if (value === 12) {\n          var q = data[j++];\n          if (q === 0) {\n            data[j - 2] = 139;\n            data[j - 1] = 22;\n            stackSize = 0;\n          } else {\n            validationCommand = CharstringValidationData12[q];\n          }\n        } else if (value === 28) {\n          stack[stackSize] = (data[j] << 24 | data[j + 1] << 16) >> 16;\n          j += 2;\n          stackSize++;\n        } else if (value === 14) {\n          if (stackSize >= 4) {\n            stackSize -= 4;\n            if (this.seacAnalysisEnabled) {\n              state.seac = stack.slice(stackSize, stackSize + 4);\n              return false;\n            }\n          }\n          validationCommand = CharstringValidationData[value];\n        } else if (value >= 32 && value <= 246) {\n          stack[stackSize] = value - 139;\n          stackSize++;\n        } else if (value >= 247 && value <= 254) {\n          stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - data[j] - 108;\n          j++;\n          stackSize++;\n        } else if (value === 255) {\n          stack[stackSize] = (data[j] << 24 | data[j + 1] << 16 | data[j + 2] << 8 | data[j + 3]) / 65536;\n          j += 4;\n          stackSize++;\n        } else if (value === 19 || value === 20) {\n          state.hints += stackSize >> 1;\n          j += state.hints + 7 >> 3;\n          stackSize %= 2;\n          validationCommand = CharstringValidationData[value];\n        } else if (value === 10 || value === 29) {\n          var subrsIndex;\n          if (value === 10) {\n            subrsIndex = localSubrIndex;\n          } else {\n            subrsIndex = globalSubrIndex;\n          }\n          if (!subrsIndex) {\n            validationCommand = CharstringValidationData[value];\n            (0, _util.warn)('Missing subrsIndex for ' + validationCommand.id);\n            return false;\n          }\n          var bias = 32768;\n          if (subrsIndex.count < 1240) {\n            bias = 107;\n          } else if (subrsIndex.count < 33900) {\n            bias = 1131;\n          }\n          var subrNumber = stack[--stackSize] + bias;\n          if (subrNumber < 0 || subrNumber >= subrsIndex.count || isNaN(subrNumber)) {\n            validationCommand = CharstringValidationData[value];\n            (0, _util.warn)('Out of bounds subrIndex for ' + validationCommand.id);\n            return false;\n          }\n          state.stackSize = stackSize;\n          state.callDepth++;\n          var valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, globalSubrIndex);\n          if (!valid) {\n            return false;\n          }\n          state.callDepth--;\n          stackSize = state.stackSize;\n          continue;\n        } else if (value === 11) {\n          state.stackSize = stackSize;\n          return true;\n        } else {\n          validationCommand = CharstringValidationData[value];\n        }\n        if (validationCommand) {\n          if (validationCommand.stem) {\n            state.hints += stackSize >> 1;\n          }\n          if ('min' in validationCommand) {\n            if (!state.undefStack && stackSize < validationCommand.min) {\n              (0, _util.warn)('Not enough parameters for ' + validationCommand.id + '; actual: ' + stackSize + ', expected: ' + validationCommand.min);\n              return false;\n            }\n          }\n          if (state.firstStackClearing && validationCommand.stackClearing) {\n            state.firstStackClearing = false;\n            stackSize -= validationCommand.min;\n            if (stackSize >= 2 && validationCommand.stem) {\n              stackSize %= 2;\n            } else if (stackSize > 1) {\n              (0, _util.warn)('Found too many parameters for stack-clearing command');\n            }\n            if (stackSize > 0 && stack[stackSize - 1] >= 0) {\n              state.width = stack[stackSize - 1];\n            }\n          }\n          if ('stackDelta' in validationCommand) {\n            if ('stackFn' in validationCommand) {\n              validationCommand.stackFn(stack, stackSize);\n            }\n            stackSize += validationCommand.stackDelta;\n          } else if (validationCommand.stackClearing) {\n            stackSize = 0;\n          } else if (validationCommand.resetStack) {\n            stackSize = 0;\n            state.undefStack = false;\n          } else if (validationCommand.undefStack) {\n            stackSize = 0;\n            state.undefStack = true;\n            state.firstStackClearing = false;\n          }\n        }\n      }\n      state.stackSize = stackSize;\n      return true;\n    },\n    parseCharStrings: function parseCharStrings(_ref) {\n      var charStrings = _ref.charStrings,\n          localSubrIndex = _ref.localSubrIndex,\n          globalSubrIndex = _ref.globalSubrIndex,\n          fdSelect = _ref.fdSelect,\n          fdArray = _ref.fdArray,\n          privateDict = _ref.privateDict;\n\n      var seacs = [];\n      var widths = [];\n      var count = charStrings.count;\n      for (var i = 0; i < count; i++) {\n        var charstring = charStrings.get(i);\n        var state = {\n          callDepth: 0,\n          stackSize: 0,\n          stack: [],\n          undefStack: true,\n          hints: 0,\n          firstStackClearing: true,\n          seac: null,\n          width: null\n        };\n        var valid = true;\n        var localSubrToUse = null;\n        var privateDictToUse = privateDict;\n        if (fdSelect && fdArray.length) {\n          var fdIndex = fdSelect.getFDIndex(i);\n          if (fdIndex === -1) {\n            (0, _util.warn)('Glyph index is not in fd select.');\n            valid = false;\n          }\n          if (fdIndex >= fdArray.length) {\n            (0, _util.warn)('Invalid fd index for glyph index.');\n            valid = false;\n          }\n          if (valid) {\n            privateDictToUse = fdArray[fdIndex].privateDict;\n            localSubrToUse = privateDictToUse.subrsIndex;\n          }\n        } else if (localSubrIndex) {\n          localSubrToUse = localSubrIndex;\n        }\n        if (valid) {\n          valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex);\n        }\n        if (state.width !== null) {\n          var nominalWidth = privateDictToUse.getByName('nominalWidthX');\n          widths[i] = nominalWidth + state.width;\n        } else {\n          var defaultWidth = privateDictToUse.getByName('defaultWidthX');\n          widths[i] = defaultWidth;\n        }\n        if (state.seac !== null) {\n          seacs[i] = state.seac;\n        }\n        if (!valid) {\n          charStrings.set(i, new Uint8Array([14]));\n        }\n      }\n      return {\n        charStrings: charStrings,\n        seacs: seacs,\n        widths: widths\n      };\n    },\n\n    emptyPrivateDictionary: function CFFParser_emptyPrivateDictionary(parentDict) {\n      var privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings);\n      parentDict.setByKey(18, [0, 0]);\n      parentDict.privateDict = privateDict;\n    },\n    parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {\n      if (!parentDict.hasName('Private')) {\n        this.emptyPrivateDictionary(parentDict);\n        return;\n      }\n      var privateOffset = parentDict.getByName('Private');\n      if (!(0, _util.isArray)(privateOffset) || privateOffset.length !== 2) {\n        parentDict.removeByName('Private');\n        return;\n      }\n      var size = privateOffset[0];\n      var offset = privateOffset[1];\n      if (size === 0 || offset >= this.bytes.length) {\n        this.emptyPrivateDictionary(parentDict);\n        return;\n      }\n      var privateDictEnd = offset + size;\n      var dictData = this.bytes.subarray(offset, privateDictEnd);\n      var dict = this.parseDict(dictData);\n      var privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings);\n      parentDict.privateDict = privateDict;\n      if (!privateDict.getByName('Subrs')) {\n        return;\n      }\n      var subrsOffset = privateDict.getByName('Subrs');\n      var relativeOffset = offset + subrsOffset;\n      if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {\n        this.emptyPrivateDictionary(parentDict);\n        return;\n      }\n      var subrsIndex = this.parseIndex(relativeOffset);\n      privateDict.subrsIndex = subrsIndex.obj;\n    },\n    parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) {\n      if (pos === 0) {\n        return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, _charsets.ISOAdobeCharset);\n      } else if (pos === 1) {\n        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, _charsets.ExpertCharset);\n      } else if (pos === 2) {\n        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, _charsets.ExpertSubsetCharset);\n      }\n      var bytes = this.bytes;\n      var start = pos;\n      var format = bytes[pos++];\n      var charset = ['.notdef'];\n      var id, count, i;\n      length -= 1;\n      switch (format) {\n        case 0:\n          for (i = 0; i < length; i++) {\n            id = bytes[pos++] << 8 | bytes[pos++];\n            charset.push(cid ? id : strings.get(id));\n          }\n          break;\n        case 1:\n          while (charset.length <= length) {\n            id = bytes[pos++] << 8 | bytes[pos++];\n            count = bytes[pos++];\n            for (i = 0; i <= count; i++) {\n              charset.push(cid ? id++ : strings.get(id++));\n            }\n          }\n          break;\n        case 2:\n          while (charset.length <= length) {\n            id = bytes[pos++] << 8 | bytes[pos++];\n            count = bytes[pos++] << 8 | bytes[pos++];\n            for (i = 0; i <= count; i++) {\n              charset.push(cid ? id++ : strings.get(id++));\n            }\n          }\n          break;\n        default:\n          throw new _util.FormatError('Unknown charset format');\n      }\n      var end = pos;\n      var raw = bytes.subarray(start, end);\n      return new CFFCharset(false, format, charset, raw);\n    },\n    parseEncoding: function CFFParser_parseEncoding(pos, properties, strings, charset) {\n      var encoding = Object.create(null);\n      var bytes = this.bytes;\n      var predefined = false;\n      var format, i, ii;\n      var raw = null;\n      function readSupplement() {\n        var supplementsCount = bytes[pos++];\n        for (i = 0; i < supplementsCount; i++) {\n          var code = bytes[pos++];\n          var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);\n          encoding[code] = charset.indexOf(strings.get(sid));\n        }\n      }\n      if (pos === 0 || pos === 1) {\n        predefined = true;\n        format = pos;\n        var baseEncoding = pos ? _encodings.ExpertEncoding : _encodings.StandardEncoding;\n        for (i = 0, ii = charset.length; i < ii; i++) {\n          var index = baseEncoding.indexOf(charset[i]);\n          if (index !== -1) {\n            encoding[index] = i;\n          }\n        }\n      } else {\n        var dataStart = pos;\n        format = bytes[pos++];\n        switch (format & 0x7f) {\n          case 0:\n            var glyphsCount = bytes[pos++];\n            for (i = 1; i <= glyphsCount; i++) {\n              encoding[bytes[pos++]] = i;\n            }\n            break;\n          case 1:\n            var rangesCount = bytes[pos++];\n            var gid = 1;\n            for (i = 0; i < rangesCount; i++) {\n              var start = bytes[pos++];\n              var left = bytes[pos++];\n              for (var j = start; j <= start + left; j++) {\n                encoding[j] = gid++;\n              }\n            }\n            break;\n          default:\n            throw new _util.FormatError('Unknown encoding format: ' + format + ' in CFF');\n        }\n        var dataEnd = pos;\n        if (format & 0x80) {\n          bytes[dataStart] &= 0x7f;\n          readSupplement();\n        }\n        raw = bytes.subarray(dataStart, dataEnd);\n      }\n      format = format & 0x7f;\n      return new CFFEncoding(predefined, format, encoding, raw);\n    },\n    parseFDSelect: function CFFParser_parseFDSelect(pos, length) {\n      var start = pos;\n      var bytes = this.bytes;\n      var format = bytes[pos++];\n      var fdSelect = [],\n          rawBytes;\n      var i,\n          invalidFirstGID = false;\n      switch (format) {\n        case 0:\n          for (i = 0; i < length; ++i) {\n            var id = bytes[pos++];\n            fdSelect.push(id);\n          }\n          rawBytes = bytes.subarray(start, pos);\n          break;\n        case 3:\n          var rangesCount = bytes[pos++] << 8 | bytes[pos++];\n          for (i = 0; i < rangesCount; ++i) {\n            var first = bytes[pos++] << 8 | bytes[pos++];\n            if (i === 0 && first !== 0) {\n              (0, _util.warn)('parseFDSelect: The first range must have a first GID of 0' + ' -- trying to recover.');\n              invalidFirstGID = true;\n              first = 0;\n            }\n            var fdIndex = bytes[pos++];\n            var next = bytes[pos] << 8 | bytes[pos + 1];\n            for (var j = first; j < next; ++j) {\n              fdSelect.push(fdIndex);\n            }\n          }\n          pos += 2;\n          rawBytes = bytes.subarray(start, pos);\n          if (invalidFirstGID) {\n            rawBytes[3] = rawBytes[4] = 0;\n          }\n          break;\n        default:\n          throw new _util.FormatError('parseFDSelect: Unknown format \"' + format + '\".');\n      }\n      if (fdSelect.length !== length) {\n        throw new _util.FormatError('parseFDSelect: Invalid font data.');\n      }\n      return new CFFFDSelect(fdSelect, rawBytes);\n    }\n  };\n  return CFFParser;\n}();\nvar CFF = function CFFClosure() {\n  function CFF() {\n    this.header = null;\n    this.names = [];\n    this.topDict = null;\n    this.strings = new CFFStrings();\n    this.globalSubrIndex = null;\n    this.encoding = null;\n    this.charset = null;\n    this.charStrings = null;\n    this.fdArray = [];\n    this.fdSelect = null;\n    this.isCIDFont = false;\n  }\n  return CFF;\n}();\nvar CFFHeader = function CFFHeaderClosure() {\n  function CFFHeader(major, minor, hdrSize, offSize) {\n    this.major = major;\n    this.minor = minor;\n    this.hdrSize = hdrSize;\n    this.offSize = offSize;\n  }\n  return CFFHeader;\n}();\nvar CFFStrings = function CFFStringsClosure() {\n  function CFFStrings() {\n    this.strings = [];\n  }\n  CFFStrings.prototype = {\n    get: function CFFStrings_get(index) {\n      if (index >= 0 && index <= 390) {\n        return CFFStandardStrings[index];\n      }\n      if (index - 391 <= this.strings.length) {\n        return this.strings[index - 391];\n      }\n      return CFFStandardStrings[0];\n    },\n    add: function CFFStrings_add(value) {\n      this.strings.push(value);\n    },\n    get count() {\n      return this.strings.length;\n    }\n  };\n  return CFFStrings;\n}();\nvar CFFIndex = function CFFIndexClosure() {\n  function CFFIndex() {\n    this.objects = [];\n    this.length = 0;\n  }\n  CFFIndex.prototype = {\n    add: function CFFIndex_add(data) {\n      this.length += data.length;\n      this.objects.push(data);\n    },\n    set: function CFFIndex_set(index, data) {\n      this.length += data.length - this.objects[index].length;\n      this.objects[index] = data;\n    },\n    get: function CFFIndex_get(index) {\n      return this.objects[index];\n    },\n    get count() {\n      return this.objects.length;\n    }\n  };\n  return CFFIndex;\n}();\nvar CFFDict = function CFFDictClosure() {\n  function CFFDict(tables, strings) {\n    this.keyToNameMap = tables.keyToNameMap;\n    this.nameToKeyMap = tables.nameToKeyMap;\n    this.defaults = tables.defaults;\n    this.types = tables.types;\n    this.opcodes = tables.opcodes;\n    this.order = tables.order;\n    this.strings = strings;\n    this.values = Object.create(null);\n  }\n  CFFDict.prototype = {\n    setByKey: function CFFDict_setByKey(key, value) {\n      if (!(key in this.keyToNameMap)) {\n        return false;\n      }\n      var valueLength = value.length;\n      if (valueLength === 0) {\n        return true;\n      }\n      for (var i = 0; i < valueLength; i++) {\n        if (isNaN(value[i])) {\n          (0, _util.warn)('Invalid CFFDict value: \"' + value + '\" for key \"' + key + '\".');\n          return true;\n        }\n      }\n      var type = this.types[key];\n      if (type === 'num' || type === 'sid' || type === 'offset') {\n        value = value[0];\n      }\n      this.values[key] = value;\n      return true;\n    },\n    setByName: function CFFDict_setByName(name, value) {\n      if (!(name in this.nameToKeyMap)) {\n        throw new _util.FormatError('Invalid dictionary name \"' + name + '\"');\n      }\n      this.values[this.nameToKeyMap[name]] = value;\n    },\n    hasName: function CFFDict_hasName(name) {\n      return this.nameToKeyMap[name] in this.values;\n    },\n    getByName: function CFFDict_getByName(name) {\n      if (!(name in this.nameToKeyMap)) {\n        throw new _util.FormatError('Invalid dictionary name ' + name + '\"');\n      }\n      var key = this.nameToKeyMap[name];\n      if (!(key in this.values)) {\n        return this.defaults[key];\n      }\n      return this.values[key];\n    },\n    removeByName: function CFFDict_removeByName(name) {\n      delete this.values[this.nameToKeyMap[name]];\n    }\n  };\n  CFFDict.createTables = function CFFDict_createTables(layout) {\n    var tables = {\n      keyToNameMap: {},\n      nameToKeyMap: {},\n      defaults: {},\n      types: {},\n      opcodes: {},\n      order: []\n    };\n    for (var i = 0, ii = layout.length; i < ii; ++i) {\n      var entry = layout[i];\n      var key = (0, _util.isArray)(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];\n      tables.keyToNameMap[key] = entry[1];\n      tables.nameToKeyMap[entry[1]] = key;\n      tables.types[key] = entry[2];\n      tables.defaults[key] = entry[3];\n      tables.opcodes[key] = (0, _util.isArray)(entry[0]) ? entry[0] : [entry[0]];\n      tables.order.push(key);\n    }\n    return tables;\n  };\n  return CFFDict;\n}();\nvar CFFTopDict = function CFFTopDictClosure() {\n  var layout = [[[12, 30], 'ROS', ['sid', 'sid', 'num'], null], [[12, 20], 'SyntheticBase', 'num', null], [0, 'version', 'sid', null], [1, 'Notice', 'sid', null], [[12, 0], 'Copyright', 'sid', null], [2, 'FullName', 'sid', null], [3, 'FamilyName', 'sid', null], [4, 'Weight', 'sid', null], [[12, 1], 'isFixedPitch', 'num', 0], [[12, 2], 'ItalicAngle', 'num', 0], [[12, 3], 'UnderlinePosition', 'num', -100], [[12, 4], 'UnderlineThickness', 'num', 50], [[12, 5], 'PaintType', 'num', 0], [[12, 6], 'CharstringType', 'num', 2], [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'], [0.001, 0, 0, 0.001, 0, 0]], [13, 'UniqueID', 'num', null], [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]], [[12, 8], 'StrokeWidth', 'num', 0], [14, 'XUID', 'array', null], [15, 'charset', 'offset', 0], [16, 'Encoding', 'offset', 0], [17, 'CharStrings', 'offset', 0], [18, 'Private', ['offset', 'offset'], null], [[12, 21], 'PostScript', 'sid', null], [[12, 22], 'BaseFontName', 'sid', null], [[12, 23], 'BaseFontBlend', 'delta', null], [[12, 31], 'CIDFontVersion', 'num', 0], [[12, 32], 'CIDFontRevision', 'num', 0], [[12, 33], 'CIDFontType', 'num', 0], [[12, 34], 'CIDCount', 'num', 8720], [[12, 35], 'UIDBase', 'num', null], [[12, 37], 'FDSelect', 'offset', null], [[12, 36], 'FDArray', 'offset', null], [[12, 38], 'FontName', 'sid', null]];\n  var tables = null;\n  function CFFTopDict(strings) {\n    if (tables === null) {\n      tables = CFFDict.createTables(layout);\n    }\n    CFFDict.call(this, tables, strings);\n    this.privateDict = null;\n  }\n  CFFTopDict.prototype = Object.create(CFFDict.prototype);\n  return CFFTopDict;\n}();\nvar CFFPrivateDict = function CFFPrivateDictClosure() {\n  var layout = [[6, 'BlueValues', 'delta', null], [7, 'OtherBlues', 'delta', null], [8, 'FamilyBlues', 'delta', null], [9, 'FamilyOtherBlues', 'delta', null], [[12, 9], 'BlueScale', 'num', 0.039625], [[12, 10], 'BlueShift', 'num', 7], [[12, 11], 'BlueFuzz', 'num', 1], [10, 'StdHW', 'num', null], [11, 'StdVW', 'num', null], [[12, 12], 'StemSnapH', 'delta', null], [[12, 13], 'StemSnapV', 'delta', null], [[12, 14], 'ForceBold', 'num', 0], [[12, 17], 'LanguageGroup', 'num', 0], [[12, 18], 'ExpansionFactor', 'num', 0.06], [[12, 19], 'initialRandomSeed', 'num', 0], [20, 'defaultWidthX', 'num', 0], [21, 'nominalWidthX', 'num', 0], [19, 'Subrs', 'offset', null]];\n  var tables = null;\n  function CFFPrivateDict(strings) {\n    if (tables === null) {\n      tables = CFFDict.createTables(layout);\n    }\n    CFFDict.call(this, tables, strings);\n    this.subrsIndex = null;\n  }\n  CFFPrivateDict.prototype = Object.create(CFFDict.prototype);\n  return CFFPrivateDict;\n}();\nvar CFFCharsetPredefinedTypes = {\n  ISO_ADOBE: 0,\n  EXPERT: 1,\n  EXPERT_SUBSET: 2\n};\nvar CFFCharset = function CFFCharsetClosure() {\n  function CFFCharset(predefined, format, charset, raw) {\n    this.predefined = predefined;\n    this.format = format;\n    this.charset = charset;\n    this.raw = raw;\n  }\n  return CFFCharset;\n}();\nvar CFFEncoding = function CFFEncodingClosure() {\n  function CFFEncoding(predefined, format, encoding, raw) {\n    this.predefined = predefined;\n    this.format = format;\n    this.encoding = encoding;\n    this.raw = raw;\n  }\n  return CFFEncoding;\n}();\nvar CFFFDSelect = function CFFFDSelectClosure() {\n  function CFFFDSelect(fdSelect, raw) {\n    this.fdSelect = fdSelect;\n    this.raw = raw;\n  }\n  CFFFDSelect.prototype = {\n    getFDIndex: function CFFFDSelect_get(glyphIndex) {\n      if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) {\n        return -1;\n      }\n      return this.fdSelect[glyphIndex];\n    }\n  };\n  return CFFFDSelect;\n}();\nvar CFFOffsetTracker = function CFFOffsetTrackerClosure() {\n  function CFFOffsetTracker() {\n    this.offsets = Object.create(null);\n  }\n  CFFOffsetTracker.prototype = {\n    isTracking: function CFFOffsetTracker_isTracking(key) {\n      return key in this.offsets;\n    },\n    track: function CFFOffsetTracker_track(key, location) {\n      if (key in this.offsets) {\n        throw new _util.FormatError('Already tracking location of ' + key);\n      }\n      this.offsets[key] = location;\n    },\n    offset: function CFFOffsetTracker_offset(value) {\n      for (var key in this.offsets) {\n        this.offsets[key] += value;\n      }\n    },\n    setEntryLocation: function CFFOffsetTracker_setEntryLocation(key, values, output) {\n      if (!(key in this.offsets)) {\n        throw new _util.FormatError('Not tracking location of ' + key);\n      }\n      var data = output.data;\n      var dataOffset = this.offsets[key];\n      var size = 5;\n      for (var i = 0, ii = values.length; i < ii; ++i) {\n        var offset0 = i * size + dataOffset;\n        var offset1 = offset0 + 1;\n        var offset2 = offset0 + 2;\n        var offset3 = offset0 + 3;\n        var offset4 = offset0 + 4;\n        if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) {\n          throw new _util.FormatError('writing to an offset that is not empty');\n        }\n        var value = values[i];\n        data[offset0] = 0x1d;\n        data[offset1] = value >> 24 & 0xFF;\n        data[offset2] = value >> 16 & 0xFF;\n        data[offset3] = value >> 8 & 0xFF;\n        data[offset4] = value & 0xFF;\n      }\n    }\n  };\n  return CFFOffsetTracker;\n}();\nvar CFFCompiler = function CFFCompilerClosure() {\n  function CFFCompiler(cff) {\n    this.cff = cff;\n  }\n  CFFCompiler.prototype = {\n    compile: function CFFCompiler_compile() {\n      var cff = this.cff;\n      var output = {\n        data: [],\n        length: 0,\n        add: function CFFCompiler_add(data) {\n          this.data = this.data.concat(data);\n          this.length = this.data.length;\n        }\n      };\n      var header = this.compileHeader(cff.header);\n      output.add(header);\n      var nameIndex = this.compileNameIndex(cff.names);\n      output.add(nameIndex);\n      if (cff.isCIDFont) {\n        if (cff.topDict.hasName('FontMatrix')) {\n          var base = cff.topDict.getByName('FontMatrix');\n          cff.topDict.removeByName('FontMatrix');\n          for (var i = 0, ii = cff.fdArray.length; i < ii; i++) {\n            var subDict = cff.fdArray[i];\n            var matrix = base.slice(0);\n            if (subDict.hasName('FontMatrix')) {\n              matrix = _util.Util.transform(matrix, subDict.getByName('FontMatrix'));\n            }\n            subDict.setByName('FontMatrix', matrix);\n          }\n        }\n      }\n      var compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont);\n      output.add(compiled.output);\n      var topDictTracker = compiled.trackers[0];\n      var stringIndex = this.compileStringIndex(cff.strings.strings);\n      output.add(stringIndex);\n      var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);\n      output.add(globalSubrIndex);\n      if (cff.encoding && cff.topDict.hasName('Encoding')) {\n        if (cff.encoding.predefined) {\n          topDictTracker.setEntryLocation('Encoding', [cff.encoding.format], output);\n        } else {\n          var encoding = this.compileEncoding(cff.encoding);\n          topDictTracker.setEntryLocation('Encoding', [output.length], output);\n          output.add(encoding);\n        }\n      }\n      if (cff.charset && cff.topDict.hasName('charset')) {\n        if (cff.charset.predefined) {\n          topDictTracker.setEntryLocation('charset', [cff.charset.format], output);\n        } else {\n          var charset = this.compileCharset(cff.charset);\n          topDictTracker.setEntryLocation('charset', [output.length], output);\n          output.add(charset);\n        }\n      }\n      var charStrings = this.compileCharStrings(cff.charStrings);\n      topDictTracker.setEntryLocation('CharStrings', [output.length], output);\n      output.add(charStrings);\n      if (cff.isCIDFont) {\n        topDictTracker.setEntryLocation('FDSelect', [output.length], output);\n        var fdSelect = this.compileFDSelect(cff.fdSelect.raw);\n        output.add(fdSelect);\n        compiled = this.compileTopDicts(cff.fdArray, output.length, true);\n        topDictTracker.setEntryLocation('FDArray', [output.length], output);\n        output.add(compiled.output);\n        var fontDictTrackers = compiled.trackers;\n        this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);\n      }\n      this.compilePrivateDicts([cff.topDict], [topDictTracker], output);\n      output.add([0]);\n      return output.data;\n    },\n    encodeNumber: function CFFCompiler_encodeNumber(value) {\n      if (parseFloat(value) === parseInt(value, 10) && !isNaN(value)) {\n        return this.encodeInteger(value);\n      }\n      return this.encodeFloat(value);\n    },\n    encodeFloat: function CFFCompiler_encodeFloat(num) {\n      var value = num.toString();\n      var m = /\\.(\\d*?)(?:9{5,20}|0{5,20})\\d{0,2}(?:e(.+)|$)/.exec(value);\n      if (m) {\n        var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length));\n        value = (Math.round(num * epsilon) / epsilon).toString();\n      }\n      var nibbles = '';\n      var i, ii;\n      for (i = 0, ii = value.length; i < ii; ++i) {\n        var a = value[i];\n        if (a === 'e') {\n          nibbles += value[++i] === '-' ? 'c' : 'b';\n        } else if (a === '.') {\n          nibbles += 'a';\n        } else if (a === '-') {\n          nibbles += 'e';\n        } else {\n          nibbles += a;\n        }\n      }\n      nibbles += nibbles.length & 1 ? 'f' : 'ff';\n      var out = [30];\n      for (i = 0, ii = nibbles.length; i < ii; i += 2) {\n        out.push(parseInt(nibbles.substr(i, 2), 16));\n      }\n      return out;\n    },\n    encodeInteger: function CFFCompiler_encodeInteger(value) {\n      var code;\n      if (value >= -107 && value <= 107) {\n        code = [value + 139];\n      } else if (value >= 108 && value <= 1131) {\n        value = value - 108;\n        code = [(value >> 8) + 247, value & 0xFF];\n      } else if (value >= -1131 && value <= -108) {\n        value = -value - 108;\n        code = [(value >> 8) + 251, value & 0xFF];\n      } else if (value >= -32768 && value <= 32767) {\n        code = [0x1c, value >> 8 & 0xFF, value & 0xFF];\n      } else {\n        code = [0x1d, value >> 24 & 0xFF, value >> 16 & 0xFF, value >> 8 & 0xFF, value & 0xFF];\n      }\n      return code;\n    },\n    compileHeader: function CFFCompiler_compileHeader(header) {\n      return [header.major, header.minor, header.hdrSize, header.offSize];\n    },\n    compileNameIndex: function CFFCompiler_compileNameIndex(names) {\n      var nameIndex = new CFFIndex();\n      for (var i = 0, ii = names.length; i < ii; ++i) {\n        nameIndex.add((0, _util.stringToBytes)(names[i]));\n      }\n      return this.compileIndex(nameIndex);\n    },\n    compileTopDicts: function CFFCompiler_compileTopDicts(dicts, length, removeCidKeys) {\n      var fontDictTrackers = [];\n      var fdArrayIndex = new CFFIndex();\n      for (var i = 0, ii = dicts.length; i < ii; ++i) {\n        var fontDict = dicts[i];\n        if (removeCidKeys) {\n          fontDict.removeByName('CIDFontVersion');\n          fontDict.removeByName('CIDFontRevision');\n          fontDict.removeByName('CIDFontType');\n          fontDict.removeByName('CIDCount');\n          fontDict.removeByName('UIDBase');\n        }\n        var fontDictTracker = new CFFOffsetTracker();\n        var fontDictData = this.compileDict(fontDict, fontDictTracker);\n        fontDictTrackers.push(fontDictTracker);\n        fdArrayIndex.add(fontDictData);\n        fontDictTracker.offset(length);\n      }\n      fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);\n      return {\n        trackers: fontDictTrackers,\n        output: fdArrayIndex\n      };\n    },\n    compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts, trackers, output) {\n      for (var i = 0, ii = dicts.length; i < ii; ++i) {\n        var fontDict = dicts[i];\n        var privateDict = fontDict.privateDict;\n        if (!privateDict || !fontDict.hasName('Private')) {\n          throw new _util.FormatError('There must be a private dictionary.');\n        }\n        var privateDictTracker = new CFFOffsetTracker();\n        var privateDictData = this.compileDict(privateDict, privateDictTracker);\n        var outputLength = output.length;\n        privateDictTracker.offset(outputLength);\n        if (!privateDictData.length) {\n          outputLength = 0;\n        }\n        trackers[i].setEntryLocation('Private', [privateDictData.length, outputLength], output);\n        output.add(privateDictData);\n        if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {\n          var subrs = this.compileIndex(privateDict.subrsIndex);\n          privateDictTracker.setEntryLocation('Subrs', [privateDictData.length], output);\n          output.add(subrs);\n        }\n      }\n    },\n    compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {\n      var out = [];\n      var order = dict.order;\n      for (var i = 0; i < order.length; ++i) {\n        var key = order[i];\n        if (!(key in dict.values)) {\n          continue;\n        }\n        var values = dict.values[key];\n        var types = dict.types[key];\n        if (!(0, _util.isArray)(types)) {\n          types = [types];\n        }\n        if (!(0, _util.isArray)(values)) {\n          values = [values];\n        }\n        if (values.length === 0) {\n          continue;\n        }\n        for (var j = 0, jj = types.length; j < jj; ++j) {\n          var type = types[j];\n          var value = values[j];\n          switch (type) {\n            case 'num':\n            case 'sid':\n              out = out.concat(this.encodeNumber(value));\n              break;\n            case 'offset':\n              var name = dict.keyToNameMap[key];\n              if (!offsetTracker.isTracking(name)) {\n                offsetTracker.track(name, out.length);\n              }\n              out = out.concat([0x1d, 0, 0, 0, 0]);\n              break;\n            case 'array':\n            case 'delta':\n              out = out.concat(this.encodeNumber(value));\n              for (var k = 1, kk = values.length; k < kk; ++k) {\n                out = out.concat(this.encodeNumber(values[k]));\n              }\n              break;\n            default:\n              throw new _util.FormatError('Unknown data type of ' + type);\n          }\n        }\n        out = out.concat(dict.opcodes[key]);\n      }\n      return out;\n    },\n    compileStringIndex: function CFFCompiler_compileStringIndex(strings) {\n      var stringIndex = new CFFIndex();\n      for (var i = 0, ii = strings.length; i < ii; ++i) {\n        stringIndex.add((0, _util.stringToBytes)(strings[i]));\n      }\n      return this.compileIndex(stringIndex);\n    },\n    compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {\n      var globalSubrIndex = this.cff.globalSubrIndex;\n      this.out.writeByteArray(this.compileIndex(globalSubrIndex));\n    },\n    compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {\n      return this.compileIndex(charStrings);\n    },\n    compileCharset: function CFFCompiler_compileCharset(charset) {\n      return this.compileTypedArray(charset.raw);\n    },\n    compileEncoding: function CFFCompiler_compileEncoding(encoding) {\n      return this.compileTypedArray(encoding.raw);\n    },\n    compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {\n      return this.compileTypedArray(fdSelect);\n    },\n    compileTypedArray: function CFFCompiler_compileTypedArray(data) {\n      var out = [];\n      for (var i = 0, ii = data.length; i < ii; ++i) {\n        out[i] = data[i];\n      }\n      return out;\n    },\n    compileIndex: function CFFCompiler_compileIndex(index, trackers) {\n      trackers = trackers || [];\n      var objects = index.objects;\n      var count = objects.length;\n      if (count === 0) {\n        return [0, 0, 0];\n      }\n      var data = [count >> 8 & 0xFF, count & 0xff];\n      var lastOffset = 1,\n          i;\n      for (i = 0; i < count; ++i) {\n        lastOffset += objects[i].length;\n      }\n      var offsetSize;\n      if (lastOffset < 0x100) {\n        offsetSize = 1;\n      } else if (lastOffset < 0x10000) {\n        offsetSize = 2;\n      } else if (lastOffset < 0x1000000) {\n        offsetSize = 3;\n      } else {\n        offsetSize = 4;\n      }\n      data.push(offsetSize);\n      var relativeOffset = 1;\n      for (i = 0; i < count + 1; i++) {\n        if (offsetSize === 1) {\n          data.push(relativeOffset & 0xFF);\n        } else if (offsetSize === 2) {\n          data.push(relativeOffset >> 8 & 0xFF, relativeOffset & 0xFF);\n        } else if (offsetSize === 3) {\n          data.push(relativeOffset >> 16 & 0xFF, relativeOffset >> 8 & 0xFF, relativeOffset & 0xFF);\n        } else {\n          data.push(relativeOffset >>> 24 & 0xFF, relativeOffset >> 16 & 0xFF, relativeOffset >> 8 & 0xFF, relativeOffset & 0xFF);\n        }\n        if (objects[i]) {\n          relativeOffset += objects[i].length;\n        }\n      }\n      for (i = 0; i < count; i++) {\n        if (trackers[i]) {\n          trackers[i].offset(data.length);\n        }\n        for (var j = 0, jj = objects[i].length; j < jj; j++) {\n          data.push(objects[i][j]);\n        }\n      }\n      return data;\n    }\n  };\n  return CFFCompiler;\n}();\nexports.CFFStandardStrings = CFFStandardStrings;\nexports.CFFParser = CFFParser;\nexports.CFF = CFF;\nexports.CFFHeader = CFFHeader;\nexports.CFFStrings = CFFStrings;\nexports.CFFIndex = CFFIndex;\nexports.CFFCharset = CFFCharset;\nexports.CFFTopDict = CFFTopDict;\nexports.CFFPrivateDict = CFFPrivateDict;\nexports.CFFCompiler = CFFCompiler;\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ChunkedStreamManager = exports.ChunkedStream = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar ChunkedStream = function ChunkedStreamClosure() {\n  function ChunkedStream(length, chunkSize, manager) {\n    this.bytes = new Uint8Array(length);\n    this.start = 0;\n    this.pos = 0;\n    this.end = length;\n    this.chunkSize = chunkSize;\n    this.loadedChunks = [];\n    this.numChunksLoaded = 0;\n    this.numChunks = Math.ceil(length / chunkSize);\n    this.manager = manager;\n    this.progressiveDataLength = 0;\n    this.lastSuccessfulEnsureByteChunk = -1;\n  }\n  ChunkedStream.prototype = {\n    getMissingChunks: function ChunkedStream_getMissingChunks() {\n      var chunks = [];\n      for (var chunk = 0, n = this.numChunks; chunk < n; ++chunk) {\n        if (!this.loadedChunks[chunk]) {\n          chunks.push(chunk);\n        }\n      }\n      return chunks;\n    },\n    getBaseStreams: function ChunkedStream_getBaseStreams() {\n      return [this];\n    },\n    allChunksLoaded: function ChunkedStream_allChunksLoaded() {\n      return this.numChunksLoaded === this.numChunks;\n    },\n    onReceiveData: function ChunkedStream_onReceiveData(begin, chunk) {\n      var end = begin + chunk.byteLength;\n      if (begin % this.chunkSize !== 0) {\n        throw new Error('Bad begin offset: ' + begin);\n      }\n      var length = this.bytes.length;\n      if (end % this.chunkSize !== 0 && end !== length) {\n        throw new Error('Bad end offset: ' + end);\n      }\n      this.bytes.set(new Uint8Array(chunk), begin);\n      var chunkSize = this.chunkSize;\n      var beginChunk = Math.floor(begin / chunkSize);\n      var endChunk = Math.floor((end - 1) / chunkSize) + 1;\n      var curChunk;\n      for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) {\n        if (!this.loadedChunks[curChunk]) {\n          this.loadedChunks[curChunk] = true;\n          ++this.numChunksLoaded;\n        }\n      }\n    },\n    onReceiveProgressiveData: function ChunkedStream_onReceiveProgressiveData(data) {\n      var position = this.progressiveDataLength;\n      var beginChunk = Math.floor(position / this.chunkSize);\n      this.bytes.set(new Uint8Array(data), position);\n      position += data.byteLength;\n      this.progressiveDataLength = position;\n      var endChunk = position >= this.end ? this.numChunks : Math.floor(position / this.chunkSize);\n      var curChunk;\n      for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) {\n        if (!this.loadedChunks[curChunk]) {\n          this.loadedChunks[curChunk] = true;\n          ++this.numChunksLoaded;\n        }\n      }\n    },\n    ensureByte: function ChunkedStream_ensureByte(pos) {\n      var chunk = Math.floor(pos / this.chunkSize);\n      if (chunk === this.lastSuccessfulEnsureByteChunk) {\n        return;\n      }\n      if (!this.loadedChunks[chunk]) {\n        throw new _util.MissingDataException(pos, pos + 1);\n      }\n      this.lastSuccessfulEnsureByteChunk = chunk;\n    },\n    ensureRange: function ChunkedStream_ensureRange(begin, end) {\n      if (begin >= end) {\n        return;\n      }\n      if (end <= this.progressiveDataLength) {\n        return;\n      }\n      var chunkSize = this.chunkSize;\n      var beginChunk = Math.floor(begin / chunkSize);\n      var endChunk = Math.floor((end - 1) / chunkSize) + 1;\n      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {\n        if (!this.loadedChunks[chunk]) {\n          throw new _util.MissingDataException(begin, end);\n        }\n      }\n    },\n    nextEmptyChunk: function ChunkedStream_nextEmptyChunk(beginChunk) {\n      var chunk,\n          numChunks = this.numChunks;\n      for (var i = 0; i < numChunks; ++i) {\n        chunk = (beginChunk + i) % numChunks;\n        if (!this.loadedChunks[chunk]) {\n          return chunk;\n        }\n      }\n      return null;\n    },\n    hasChunk: function ChunkedStream_hasChunk(chunk) {\n      return !!this.loadedChunks[chunk];\n    },\n    get length() {\n      return this.end - this.start;\n    },\n    get isEmpty() {\n      return this.length === 0;\n    },\n    getByte: function ChunkedStream_getByte() {\n      var pos = this.pos;\n      if (pos >= this.end) {\n        return -1;\n      }\n      this.ensureByte(pos);\n      return this.bytes[this.pos++];\n    },\n    getUint16: function ChunkedStream_getUint16() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      if (b0 === -1 || b1 === -1) {\n        return -1;\n      }\n      return (b0 << 8) + b1;\n    },\n    getInt32: function ChunkedStream_getInt32() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      var b2 = this.getByte();\n      var b3 = this.getByte();\n      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n    },\n    getBytes: function ChunkedStream_getBytes(length) {\n      var bytes = this.bytes;\n      var pos = this.pos;\n      var strEnd = this.end;\n      if (!length) {\n        this.ensureRange(pos, strEnd);\n        return bytes.subarray(pos, strEnd);\n      }\n      var end = pos + length;\n      if (end > strEnd) {\n        end = strEnd;\n      }\n      this.ensureRange(pos, end);\n      this.pos = end;\n      return bytes.subarray(pos, end);\n    },\n    peekByte: function ChunkedStream_peekByte() {\n      var peekedByte = this.getByte();\n      this.pos--;\n      return peekedByte;\n    },\n    peekBytes: function ChunkedStream_peekBytes(length) {\n      var bytes = this.getBytes(length);\n      this.pos -= bytes.length;\n      return bytes;\n    },\n    getByteRange: function ChunkedStream_getBytes(begin, end) {\n      this.ensureRange(begin, end);\n      return this.bytes.subarray(begin, end);\n    },\n    skip: function ChunkedStream_skip(n) {\n      if (!n) {\n        n = 1;\n      }\n      this.pos += n;\n    },\n    reset: function ChunkedStream_reset() {\n      this.pos = this.start;\n    },\n    moveStart: function ChunkedStream_moveStart() {\n      this.start = this.pos;\n    },\n    makeSubStream: function ChunkedStream_makeSubStream(start, length, dict) {\n      this.ensureRange(start, start + length);\n      function ChunkedStreamSubstream() {}\n      ChunkedStreamSubstream.prototype = Object.create(this);\n      ChunkedStreamSubstream.prototype.getMissingChunks = function () {\n        var chunkSize = this.chunkSize;\n        var beginChunk = Math.floor(this.start / chunkSize);\n        var endChunk = Math.floor((this.end - 1) / chunkSize) + 1;\n        var missingChunks = [];\n        for (var chunk = beginChunk; chunk < endChunk; ++chunk) {\n          if (!this.loadedChunks[chunk]) {\n            missingChunks.push(chunk);\n          }\n        }\n        return missingChunks;\n      };\n      var subStream = new ChunkedStreamSubstream();\n      subStream.pos = subStream.start = start;\n      subStream.end = start + length || this.end;\n      subStream.dict = dict;\n      return subStream;\n    }\n  };\n  return ChunkedStream;\n}();\nvar ChunkedStreamManager = function ChunkedStreamManagerClosure() {\n  function ChunkedStreamManager(pdfNetworkStream, args) {\n    var chunkSize = args.rangeChunkSize;\n    var length = args.length;\n    this.stream = new ChunkedStream(length, chunkSize, this);\n    this.length = length;\n    this.chunkSize = chunkSize;\n    this.pdfNetworkStream = pdfNetworkStream;\n    this.url = args.url;\n    this.disableAutoFetch = args.disableAutoFetch;\n    this.msgHandler = args.msgHandler;\n    this.currRequestId = 0;\n    this.chunksNeededByRequest = Object.create(null);\n    this.requestsByChunk = Object.create(null);\n    this.promisesByRequest = Object.create(null);\n    this.progressiveDataLength = 0;\n    this.aborted = false;\n    this._loadedStreamCapability = (0, _util.createPromiseCapability)();\n  }\n  ChunkedStreamManager.prototype = {\n    onLoadedStream: function ChunkedStreamManager_getLoadedStream() {\n      return this._loadedStreamCapability.promise;\n    },\n    sendRequest: function ChunkedStreamManager_sendRequest(begin, end) {\n      var _this = this;\n\n      var rangeReader = this.pdfNetworkStream.getRangeReader(begin, end);\n      if (!rangeReader.isStreamingSupported) {\n        rangeReader.onProgress = this.onProgress.bind(this);\n      }\n      var chunks = [],\n          loaded = 0;\n      var manager = this;\n      var promise = new Promise(function (resolve, reject) {\n        var readChunk = function readChunk(chunk) {\n          try {\n            if (!chunk.done) {\n              var data = chunk.value;\n              chunks.push(data);\n              loaded += (0, _util.arrayByteLength)(data);\n              if (rangeReader.isStreamingSupported) {\n                manager.onProgress({ loaded: loaded });\n              }\n              rangeReader.read().then(readChunk, reject);\n              return;\n            }\n            var chunkData = (0, _util.arraysToBytes)(chunks);\n            chunks = null;\n            resolve(chunkData);\n          } catch (e) {\n            reject(e);\n          }\n        };\n        rangeReader.read().then(readChunk, reject);\n      });\n      promise.then(function (data) {\n        if (_this.aborted) {\n          return;\n        }\n        _this.onReceiveData({\n          chunk: data,\n          begin: begin\n        });\n      });\n    },\n    requestAllChunks: function ChunkedStreamManager_requestAllChunks() {\n      var missingChunks = this.stream.getMissingChunks();\n      this._requestChunks(missingChunks);\n      return this._loadedStreamCapability.promise;\n    },\n    _requestChunks: function ChunkedStreamManager_requestChunks(chunks) {\n      var requestId = this.currRequestId++;\n      var i, ii;\n      var chunksNeeded = Object.create(null);\n      this.chunksNeededByRequest[requestId] = chunksNeeded;\n      for (i = 0, ii = chunks.length; i < ii; i++) {\n        if (!this.stream.hasChunk(chunks[i])) {\n          chunksNeeded[chunks[i]] = true;\n        }\n      }\n      if ((0, _util.isEmptyObj)(chunksNeeded)) {\n        return Promise.resolve();\n      }\n      var capability = (0, _util.createPromiseCapability)();\n      this.promisesByRequest[requestId] = capability;\n      var chunksToRequest = [];\n      for (var chunk in chunksNeeded) {\n        chunk = chunk | 0;\n        if (!(chunk in this.requestsByChunk)) {\n          this.requestsByChunk[chunk] = [];\n          chunksToRequest.push(chunk);\n        }\n        this.requestsByChunk[chunk].push(requestId);\n      }\n      if (!chunksToRequest.length) {\n        return capability.promise;\n      }\n      var groupedChunksToRequest = this.groupChunks(chunksToRequest);\n      for (i = 0; i < groupedChunksToRequest.length; ++i) {\n        var groupedChunk = groupedChunksToRequest[i];\n        var begin = groupedChunk.beginChunk * this.chunkSize;\n        var end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length);\n        this.sendRequest(begin, end);\n      }\n      return capability.promise;\n    },\n    getStream: function ChunkedStreamManager_getStream() {\n      return this.stream;\n    },\n    requestRange: function ChunkedStreamManager_requestRange(begin, end) {\n      end = Math.min(end, this.length);\n      var beginChunk = this.getBeginChunk(begin);\n      var endChunk = this.getEndChunk(end);\n      var chunks = [];\n      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {\n        chunks.push(chunk);\n      }\n      return this._requestChunks(chunks);\n    },\n    requestRanges: function ChunkedStreamManager_requestRanges(ranges) {\n      ranges = ranges || [];\n      var chunksToRequest = [];\n      for (var i = 0; i < ranges.length; i++) {\n        var beginChunk = this.getBeginChunk(ranges[i].begin);\n        var endChunk = this.getEndChunk(ranges[i].end);\n        for (var chunk = beginChunk; chunk < endChunk; ++chunk) {\n          if (chunksToRequest.indexOf(chunk) < 0) {\n            chunksToRequest.push(chunk);\n          }\n        }\n      }\n      chunksToRequest.sort(function (a, b) {\n        return a - b;\n      });\n      return this._requestChunks(chunksToRequest);\n    },\n    groupChunks: function ChunkedStreamManager_groupChunks(chunks) {\n      var groupedChunks = [];\n      var beginChunk = -1;\n      var prevChunk = -1;\n      for (var i = 0; i < chunks.length; ++i) {\n        var chunk = chunks[i];\n        if (beginChunk < 0) {\n          beginChunk = chunk;\n        }\n        if (prevChunk >= 0 && prevChunk + 1 !== chunk) {\n          groupedChunks.push({\n            beginChunk: beginChunk,\n            endChunk: prevChunk + 1\n          });\n          beginChunk = chunk;\n        }\n        if (i + 1 === chunks.length) {\n          groupedChunks.push({\n            beginChunk: beginChunk,\n            endChunk: chunk + 1\n          });\n        }\n        prevChunk = chunk;\n      }\n      return groupedChunks;\n    },\n    onProgress: function ChunkedStreamManager_onProgress(args) {\n      var bytesLoaded = this.stream.numChunksLoaded * this.chunkSize + args.loaded;\n      this.msgHandler.send('DocProgress', {\n        loaded: bytesLoaded,\n        total: this.length\n      });\n    },\n    onReceiveData: function ChunkedStreamManager_onReceiveData(args) {\n      var chunk = args.chunk;\n      var isProgressive = args.begin === undefined;\n      var begin = isProgressive ? this.progressiveDataLength : args.begin;\n      var end = begin + chunk.byteLength;\n      var beginChunk = Math.floor(begin / this.chunkSize);\n      var endChunk = end < this.length ? Math.floor(end / this.chunkSize) : Math.ceil(end / this.chunkSize);\n      if (isProgressive) {\n        this.stream.onReceiveProgressiveData(chunk);\n        this.progressiveDataLength = end;\n      } else {\n        this.stream.onReceiveData(begin, chunk);\n      }\n      if (this.stream.allChunksLoaded()) {\n        this._loadedStreamCapability.resolve(this.stream);\n      }\n      var loadedRequests = [];\n      var i, requestId;\n      for (chunk = beginChunk; chunk < endChunk; ++chunk) {\n        var requestIds = this.requestsByChunk[chunk] || [];\n        delete this.requestsByChunk[chunk];\n        for (i = 0; i < requestIds.length; ++i) {\n          requestId = requestIds[i];\n          var chunksNeeded = this.chunksNeededByRequest[requestId];\n          if (chunk in chunksNeeded) {\n            delete chunksNeeded[chunk];\n          }\n          if (!(0, _util.isEmptyObj)(chunksNeeded)) {\n            continue;\n          }\n          loadedRequests.push(requestId);\n        }\n      }\n      if (!this.disableAutoFetch && (0, _util.isEmptyObj)(this.requestsByChunk)) {\n        var nextEmptyChunk;\n        if (this.stream.numChunksLoaded === 1) {\n          var lastChunk = this.stream.numChunks - 1;\n          if (!this.stream.hasChunk(lastChunk)) {\n            nextEmptyChunk = lastChunk;\n          }\n        } else {\n          nextEmptyChunk = this.stream.nextEmptyChunk(endChunk);\n        }\n        if ((0, _util.isInt)(nextEmptyChunk)) {\n          this._requestChunks([nextEmptyChunk]);\n        }\n      }\n      for (i = 0; i < loadedRequests.length; ++i) {\n        requestId = loadedRequests[i];\n        var capability = this.promisesByRequest[requestId];\n        delete this.promisesByRequest[requestId];\n        capability.resolve();\n      }\n      this.msgHandler.send('DocProgress', {\n        loaded: this.stream.numChunksLoaded * this.chunkSize,\n        total: this.length\n      });\n    },\n    onError: function ChunkedStreamManager_onError(err) {\n      this._loadedStreamCapability.reject(err);\n    },\n    getBeginChunk: function ChunkedStreamManager_getBeginChunk(begin) {\n      var chunk = Math.floor(begin / this.chunkSize);\n      return chunk;\n    },\n    getEndChunk: function ChunkedStreamManager_getEndChunk(end) {\n      var chunk = Math.floor((end - 1) / this.chunkSize) + 1;\n      return chunk;\n    },\n    abort: function ChunkedStreamManager_abort() {\n      this.aborted = true;\n      if (this.pdfNetworkStream) {\n        this.pdfNetworkStream.cancelAllRequests('abort');\n      }\n      for (var requestId in this.promisesByRequest) {\n        var capability = this.promisesByRequest[requestId];\n        capability.reject(new Error('Request was aborted'));\n      }\n    }\n  };\n  return ChunkedStreamManager;\n}();\nexports.ChunkedStream = ChunkedStream;\nexports.ChunkedStreamManager = ChunkedStreamManager;\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.calculateSHA512 = exports.calculateSHA384 = exports.calculateSHA256 = exports.calculateMD5 = exports.PDF20 = exports.PDF17 = exports.CipherTransformFactory = exports.ARCFourCipher = exports.AES256Cipher = exports.AES128Cipher = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar ARCFourCipher = function ARCFourCipherClosure() {\n  function ARCFourCipher(key) {\n    this.a = 0;\n    this.b = 0;\n    var s = new Uint8Array(256);\n    var i,\n        j = 0,\n        tmp,\n        keyLength = key.length;\n    for (i = 0; i < 256; ++i) {\n      s[i] = i;\n    }\n    for (i = 0; i < 256; ++i) {\n      tmp = s[i];\n      j = j + tmp + key[i % keyLength] & 0xFF;\n      s[i] = s[j];\n      s[j] = tmp;\n    }\n    this.s = s;\n  }\n  ARCFourCipher.prototype = {\n    encryptBlock: function ARCFourCipher_encryptBlock(data) {\n      var i,\n          n = data.length,\n          tmp,\n          tmp2;\n      var a = this.a,\n          b = this.b,\n          s = this.s;\n      var output = new Uint8Array(n);\n      for (i = 0; i < n; ++i) {\n        a = a + 1 & 0xFF;\n        tmp = s[a];\n        b = b + tmp & 0xFF;\n        tmp2 = s[b];\n        s[a] = tmp2;\n        s[b] = tmp;\n        output[i] = data[i] ^ s[tmp + tmp2 & 0xFF];\n      }\n      this.a = a;\n      this.b = b;\n      return output;\n    }\n  };\n  ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;\n  return ARCFourCipher;\n}();\nvar calculateMD5 = function calculateMD5Closure() {\n  var r = new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);\n  var k = new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, -145523070, -1120210379, 718787259, -343485551]);\n  function hash(data, offset, length) {\n    var h0 = 1732584193,\n        h1 = -271733879,\n        h2 = -1732584194,\n        h3 = 271733878;\n    var paddedLength = length + 72 & ~63;\n    var padded = new Uint8Array(paddedLength);\n    var i, j, n;\n    for (i = 0; i < length; ++i) {\n      padded[i] = data[offset++];\n    }\n    padded[i++] = 0x80;\n    n = paddedLength - 8;\n    while (i < n) {\n      padded[i++] = 0;\n    }\n    padded[i++] = length << 3 & 0xFF;\n    padded[i++] = length >> 5 & 0xFF;\n    padded[i++] = length >> 13 & 0xFF;\n    padded[i++] = length >> 21 & 0xFF;\n    padded[i++] = length >>> 29 & 0xFF;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    var w = new Int32Array(16);\n    for (i = 0; i < paddedLength;) {\n      for (j = 0; j < 16; ++j, i += 4) {\n        w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24;\n      }\n      var a = h0,\n          b = h1,\n          c = h2,\n          d = h3,\n          f,\n          g;\n      for (j = 0; j < 64; ++j) {\n        if (j < 16) {\n          f = b & c | ~b & d;\n          g = j;\n        } else if (j < 32) {\n          f = d & b | ~d & c;\n          g = 5 * j + 1 & 15;\n        } else if (j < 48) {\n          f = b ^ c ^ d;\n          g = 3 * j + 5 & 15;\n        } else {\n          f = c ^ (b | ~d);\n          g = 7 * j & 15;\n        }\n        var tmp = d,\n            rotateArg = a + f + k[j] + w[g] | 0,\n            rotate = r[j];\n        d = c;\n        c = b;\n        b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0;\n        a = tmp;\n      }\n      h0 = h0 + a | 0;\n      h1 = h1 + b | 0;\n      h2 = h2 + c | 0;\n      h3 = h3 + d | 0;\n    }\n    return new Uint8Array([h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >>> 24 & 0xFF, h1 & 0xFF, h1 >> 8 & 0xFF, h1 >> 16 & 0xFF, h1 >>> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >>> 24 & 0xFF, h3 & 0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >>> 24 & 0xFF]);\n  }\n  return hash;\n}();\nvar Word64 = function Word64Closure() {\n  function Word64(highInteger, lowInteger) {\n    this.high = highInteger | 0;\n    this.low = lowInteger | 0;\n  }\n  Word64.prototype = {\n    and: function Word64_and(word) {\n      this.high &= word.high;\n      this.low &= word.low;\n    },\n    xor: function Word64_xor(word) {\n      this.high ^= word.high;\n      this.low ^= word.low;\n    },\n    or: function Word64_or(word) {\n      this.high |= word.high;\n      this.low |= word.low;\n    },\n    shiftRight: function Word64_shiftRight(places) {\n      if (places >= 32) {\n        this.low = this.high >>> places - 32 | 0;\n        this.high = 0;\n      } else {\n        this.low = this.low >>> places | this.high << 32 - places;\n        this.high = this.high >>> places | 0;\n      }\n    },\n    shiftLeft: function Word64_shiftLeft(places) {\n      if (places >= 32) {\n        this.high = this.low << places - 32;\n        this.low = 0;\n      } else {\n        this.high = this.high << places | this.low >>> 32 - places;\n        this.low = this.low << places;\n      }\n    },\n    rotateRight: function Word64_rotateRight(places) {\n      var low, high;\n      if (places & 32) {\n        high = this.low;\n        low = this.high;\n      } else {\n        low = this.low;\n        high = this.high;\n      }\n      places &= 31;\n      this.low = low >>> places | high << 32 - places;\n      this.high = high >>> places | low << 32 - places;\n    },\n    not: function Word64_not() {\n      this.high = ~this.high;\n      this.low = ~this.low;\n    },\n    add: function Word64_add(word) {\n      var lowAdd = (this.low >>> 0) + (word.low >>> 0);\n      var highAdd = (this.high >>> 0) + (word.high >>> 0);\n      if (lowAdd > 0xFFFFFFFF) {\n        highAdd += 1;\n      }\n      this.low = lowAdd | 0;\n      this.high = highAdd | 0;\n    },\n    copyTo: function Word64_copyTo(bytes, offset) {\n      bytes[offset] = this.high >>> 24 & 0xFF;\n      bytes[offset + 1] = this.high >> 16 & 0xFF;\n      bytes[offset + 2] = this.high >> 8 & 0xFF;\n      bytes[offset + 3] = this.high & 0xFF;\n      bytes[offset + 4] = this.low >>> 24 & 0xFF;\n      bytes[offset + 5] = this.low >> 16 & 0xFF;\n      bytes[offset + 6] = this.low >> 8 & 0xFF;\n      bytes[offset + 7] = this.low & 0xFF;\n    },\n    assign: function Word64_assign(word) {\n      this.high = word.high;\n      this.low = word.low;\n    }\n  };\n  return Word64;\n}();\nvar calculateSHA256 = function calculateSHA256Closure() {\n  function rotr(x, n) {\n    return x >>> n | x << 32 - n;\n  }\n  function ch(x, y, z) {\n    return x & y ^ ~x & z;\n  }\n  function maj(x, y, z) {\n    return x & y ^ x & z ^ y & z;\n  }\n  function sigma(x) {\n    return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);\n  }\n  function sigmaPrime(x) {\n    return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);\n  }\n  function littleSigma(x) {\n    return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3;\n  }\n  function littleSigmaPrime(x) {\n    return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10;\n  }\n  var k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];\n  function hash(data, offset, length) {\n    var h0 = 0x6a09e667,\n        h1 = 0xbb67ae85,\n        h2 = 0x3c6ef372,\n        h3 = 0xa54ff53a,\n        h4 = 0x510e527f,\n        h5 = 0x9b05688c,\n        h6 = 0x1f83d9ab,\n        h7 = 0x5be0cd19;\n    var paddedLength = Math.ceil((length + 9) / 64) * 64;\n    var padded = new Uint8Array(paddedLength);\n    var i, j, n;\n    for (i = 0; i < length; ++i) {\n      padded[i] = data[offset++];\n    }\n    padded[i++] = 0x80;\n    n = paddedLength - 8;\n    while (i < n) {\n      padded[i++] = 0;\n    }\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = length >>> 29 & 0xFF;\n    padded[i++] = length >> 21 & 0xFF;\n    padded[i++] = length >> 13 & 0xFF;\n    padded[i++] = length >> 5 & 0xFF;\n    padded[i++] = length << 3 & 0xFF;\n    var w = new Uint32Array(64);\n    for (i = 0; i < paddedLength;) {\n      for (j = 0; j < 16; ++j) {\n        w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];\n        i += 4;\n      }\n      for (j = 16; j < 64; ++j) {\n        w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + littleSigma(w[j - 15]) + w[j - 16] | 0;\n      }\n      var a = h0,\n          b = h1,\n          c = h2,\n          d = h3,\n          e = h4,\n          f = h5,\n          g = h6,\n          h = h7,\n          t1,\n          t2;\n      for (j = 0; j < 64; ++j) {\n        t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j];\n        t2 = sigma(a) + maj(a, b, c);\n        h = g;\n        g = f;\n        f = e;\n        e = d + t1 | 0;\n        d = c;\n        c = b;\n        b = a;\n        a = t1 + t2 | 0;\n      }\n      h0 = h0 + a | 0;\n      h1 = h1 + b | 0;\n      h2 = h2 + c | 0;\n      h3 = h3 + d | 0;\n      h4 = h4 + e | 0;\n      h5 = h5 + f | 0;\n      h6 = h6 + g | 0;\n      h7 = h7 + h | 0;\n    }\n    return new Uint8Array([h0 >> 24 & 0xFF, h0 >> 16 & 0xFF, h0 >> 8 & 0xFF, h0 & 0xFF, h1 >> 24 & 0xFF, h1 >> 16 & 0xFF, h1 >> 8 & 0xFF, h1 & 0xFF, h2 >> 24 & 0xFF, h2 >> 16 & 0xFF, h2 >> 8 & 0xFF, h2 & 0xFF, h3 >> 24 & 0xFF, h3 >> 16 & 0xFF, h3 >> 8 & 0xFF, h3 & 0xFF, h4 >> 24 & 0xFF, h4 >> 16 & 0xFF, h4 >> 8 & 0xFF, h4 & 0xFF, h5 >> 24 & 0xFF, h5 >> 16 & 0xFF, h5 >> 8 & 0xFF, h5 & 0xFF, h6 >> 24 & 0xFF, h6 >> 16 & 0xFF, h6 >> 8 & 0xFF, h6 & 0xFF, h7 >> 24 & 0xFF, h7 >> 16 & 0xFF, h7 >> 8 & 0xFF, h7 & 0xFF]);\n  }\n  return hash;\n}();\nvar calculateSHA512 = function calculateSHA512Closure() {\n  function ch(result, x, y, z, tmp) {\n    result.assign(x);\n    result.and(y);\n    tmp.assign(x);\n    tmp.not();\n    tmp.and(z);\n    result.xor(tmp);\n  }\n  function maj(result, x, y, z, tmp) {\n    result.assign(x);\n    result.and(y);\n    tmp.assign(x);\n    tmp.and(z);\n    result.xor(tmp);\n    tmp.assign(y);\n    tmp.and(z);\n    result.xor(tmp);\n  }\n  function sigma(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(28);\n    tmp.assign(x);\n    tmp.rotateRight(34);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.rotateRight(39);\n    result.xor(tmp);\n  }\n  function sigmaPrime(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(14);\n    tmp.assign(x);\n    tmp.rotateRight(18);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.rotateRight(41);\n    result.xor(tmp);\n  }\n  function littleSigma(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(1);\n    tmp.assign(x);\n    tmp.rotateRight(8);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.shiftRight(7);\n    result.xor(tmp);\n  }\n  function littleSigmaPrime(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(19);\n    tmp.assign(x);\n    tmp.rotateRight(61);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.shiftRight(6);\n    result.xor(tmp);\n  }\n  var k = [new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)];\n  function hash(data, offset, length, mode384) {\n    mode384 = !!mode384;\n    var h0, h1, h2, h3, h4, h5, h6, h7;\n    if (!mode384) {\n      h0 = new Word64(0x6a09e667, 0xf3bcc908);\n      h1 = new Word64(0xbb67ae85, 0x84caa73b);\n      h2 = new Word64(0x3c6ef372, 0xfe94f82b);\n      h3 = new Word64(0xa54ff53a, 0x5f1d36f1);\n      h4 = new Word64(0x510e527f, 0xade682d1);\n      h5 = new Word64(0x9b05688c, 0x2b3e6c1f);\n      h6 = new Word64(0x1f83d9ab, 0xfb41bd6b);\n      h7 = new Word64(0x5be0cd19, 0x137e2179);\n    } else {\n      h0 = new Word64(0xcbbb9d5d, 0xc1059ed8);\n      h1 = new Word64(0x629a292a, 0x367cd507);\n      h2 = new Word64(0x9159015a, 0x3070dd17);\n      h3 = new Word64(0x152fecd8, 0xf70e5939);\n      h4 = new Word64(0x67332667, 0xffc00b31);\n      h5 = new Word64(0x8eb44a87, 0x68581511);\n      h6 = new Word64(0xdb0c2e0d, 0x64f98fa7);\n      h7 = new Word64(0x47b5481d, 0xbefa4fa4);\n    }\n    var paddedLength = Math.ceil((length + 17) / 128) * 128;\n    var padded = new Uint8Array(paddedLength);\n    var i, j, n;\n    for (i = 0; i < length; ++i) {\n      padded[i] = data[offset++];\n    }\n    padded[i++] = 0x80;\n    n = paddedLength - 16;\n    while (i < n) {\n      padded[i++] = 0;\n    }\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = length >>> 29 & 0xFF;\n    padded[i++] = length >> 21 & 0xFF;\n    padded[i++] = length >> 13 & 0xFF;\n    padded[i++] = length >> 5 & 0xFF;\n    padded[i++] = length << 3 & 0xFF;\n    var w = new Array(80);\n    for (i = 0; i < 80; i++) {\n      w[i] = new Word64(0, 0);\n    }\n    var a = new Word64(0, 0),\n        b = new Word64(0, 0),\n        c = new Word64(0, 0);\n    var d = new Word64(0, 0),\n        e = new Word64(0, 0),\n        f = new Word64(0, 0);\n    var g = new Word64(0, 0),\n        h = new Word64(0, 0);\n    var t1 = new Word64(0, 0),\n        t2 = new Word64(0, 0);\n    var tmp1 = new Word64(0, 0),\n        tmp2 = new Word64(0, 0),\n        tmp3;\n    for (i = 0; i < paddedLength;) {\n      for (j = 0; j < 16; ++j) {\n        w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];\n        w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7];\n        i += 8;\n      }\n      for (j = 16; j < 80; ++j) {\n        tmp3 = w[j];\n        littleSigmaPrime(tmp3, w[j - 2], tmp2);\n        tmp3.add(w[j - 7]);\n        littleSigma(tmp1, w[j - 15], tmp2);\n        tmp3.add(tmp1);\n        tmp3.add(w[j - 16]);\n      }\n      a.assign(h0);\n      b.assign(h1);\n      c.assign(h2);\n      d.assign(h3);\n      e.assign(h4);\n      f.assign(h5);\n      g.assign(h6);\n      h.assign(h7);\n      for (j = 0; j < 80; ++j) {\n        t1.assign(h);\n        sigmaPrime(tmp1, e, tmp2);\n        t1.add(tmp1);\n        ch(tmp1, e, f, g, tmp2);\n        t1.add(tmp1);\n        t1.add(k[j]);\n        t1.add(w[j]);\n        sigma(t2, a, tmp2);\n        maj(tmp1, a, b, c, tmp2);\n        t2.add(tmp1);\n        tmp3 = h;\n        h = g;\n        g = f;\n        f = e;\n        d.add(t1);\n        e = d;\n        d = c;\n        c = b;\n        b = a;\n        tmp3.assign(t1);\n        tmp3.add(t2);\n        a = tmp3;\n      }\n      h0.add(a);\n      h1.add(b);\n      h2.add(c);\n      h3.add(d);\n      h4.add(e);\n      h5.add(f);\n      h6.add(g);\n      h7.add(h);\n    }\n    var result;\n    if (!mode384) {\n      result = new Uint8Array(64);\n      h0.copyTo(result, 0);\n      h1.copyTo(result, 8);\n      h2.copyTo(result, 16);\n      h3.copyTo(result, 24);\n      h4.copyTo(result, 32);\n      h5.copyTo(result, 40);\n      h6.copyTo(result, 48);\n      h7.copyTo(result, 56);\n    } else {\n      result = new Uint8Array(48);\n      h0.copyTo(result, 0);\n      h1.copyTo(result, 8);\n      h2.copyTo(result, 16);\n      h3.copyTo(result, 24);\n      h4.copyTo(result, 32);\n      h5.copyTo(result, 40);\n    }\n    return result;\n  }\n  return hash;\n}();\nvar calculateSHA384 = function calculateSHA384Closure() {\n  function hash(data, offset, length) {\n    return calculateSHA512(data, offset, length, true);\n  }\n  return hash;\n}();\nvar NullCipher = function NullCipherClosure() {\n  function NullCipher() {}\n  NullCipher.prototype = {\n    decryptBlock: function NullCipher_decryptBlock(data) {\n      return data;\n    }\n  };\n  return NullCipher;\n}();\nvar AES128Cipher = function AES128CipherClosure() {\n  var rcon = new Uint8Array([0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]);\n  var s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]);\n  var inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]);\n  var mixCol = new Uint8Array(256);\n  for (var i = 0; i < 256; i++) {\n    if (i < 128) {\n      mixCol[i] = i << 1;\n    } else {\n      mixCol[i] = i << 1 ^ 0x1b;\n    }\n  }\n  var mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);\n  function expandKey128(cipherKey) {\n    var b = 176,\n        result = new Uint8Array(b);\n    result.set(cipherKey);\n    for (var j = 16, i = 1; j < b; ++i) {\n      var t1 = result[j - 3],\n          t2 = result[j - 2],\n          t3 = result[j - 1],\n          t4 = result[j - 4];\n      t1 = s[t1];\n      t2 = s[t2];\n      t3 = s[t3];\n      t4 = s[t4];\n      t1 = t1 ^ rcon[i];\n      for (var n = 0; n < 4; ++n) {\n        result[j] = t1 ^= result[j - 16];\n        j++;\n        result[j] = t2 ^= result[j - 16];\n        j++;\n        result[j] = t3 ^= result[j - 16];\n        j++;\n        result[j] = t4 ^= result[j - 16];\n        j++;\n      }\n    }\n    return result;\n  }\n  function decrypt128(input, key) {\n    var state = new Uint8Array(16);\n    state.set(input);\n    var i, j, k;\n    var t, u, v;\n    for (j = 0, k = 160; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n    for (i = 9; i >= 1; --i) {\n      t = state[13];\n      state[13] = state[9];\n      state[9] = state[5];\n      state[5] = state[1];\n      state[1] = t;\n      t = state[14];\n      u = state[10];\n      state[14] = state[6];\n      state[10] = state[2];\n      state[6] = t;\n      state[2] = u;\n      t = state[15];\n      u = state[11];\n      v = state[7];\n      state[15] = state[3];\n      state[11] = t;\n      state[7] = u;\n      state[3] = v;\n      for (j = 0; j < 16; ++j) {\n        state[j] = inv_s[state[j]];\n      }\n      for (j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n      for (j = 0; j < 16; j += 4) {\n        var s0 = mix[state[j]],\n            s1 = mix[state[j + 1]],\n            s2 = mix[state[j + 2]],\n            s3 = mix[state[j + 3]];\n        t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8;\n        state[j] = t >>> 24 & 0xFF;\n        state[j + 1] = t >> 16 & 0xFF;\n        state[j + 2] = t >> 8 & 0xFF;\n        state[j + 3] = t & 0xFF;\n      }\n    }\n    t = state[13];\n    state[13] = state[9];\n    state[9] = state[5];\n    state[5] = state[1];\n    state[1] = t;\n    t = state[14];\n    u = state[10];\n    state[14] = state[6];\n    state[10] = state[2];\n    state[6] = t;\n    state[2] = u;\n    t = state[15];\n    u = state[11];\n    v = state[7];\n    state[15] = state[3];\n    state[11] = t;\n    state[7] = u;\n    state[3] = v;\n    for (j = 0; j < 16; ++j) {\n      state[j] = inv_s[state[j]];\n      state[j] ^= key[j];\n    }\n    return state;\n  }\n  function encrypt128(input, key) {\n    var t, u, v, k;\n    var state = new Uint8Array(16);\n    state.set(input);\n    for (j = 0; j < 16; ++j) {\n      state[j] ^= key[j];\n    }\n    for (i = 1; i < 10; i++) {\n      for (j = 0; j < 16; ++j) {\n        state[j] = s[state[j]];\n      }\n      v = state[1];\n      state[1] = state[5];\n      state[5] = state[9];\n      state[9] = state[13];\n      state[13] = v;\n      v = state[2];\n      u = state[6];\n      state[2] = state[10];\n      state[6] = state[14];\n      state[10] = v;\n      state[14] = u;\n      v = state[3];\n      u = state[7];\n      t = state[11];\n      state[3] = state[15];\n      state[7] = v;\n      state[11] = u;\n      state[15] = t;\n      for (var j = 0; j < 16; j += 4) {\n        var s0 = state[j + 0],\n            s1 = state[j + 1];\n        var s2 = state[j + 2],\n            s3 = state[j + 3];\n        t = s0 ^ s1 ^ s2 ^ s3;\n        state[j + 0] ^= t ^ mixCol[s0 ^ s1];\n        state[j + 1] ^= t ^ mixCol[s1 ^ s2];\n        state[j + 2] ^= t ^ mixCol[s2 ^ s3];\n        state[j + 3] ^= t ^ mixCol[s3 ^ s0];\n      }\n      for (j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n    }\n    for (j = 0; j < 16; ++j) {\n      state[j] = s[state[j]];\n    }\n    v = state[1];\n    state[1] = state[5];\n    state[5] = state[9];\n    state[9] = state[13];\n    state[13] = v;\n    v = state[2];\n    u = state[6];\n    state[2] = state[10];\n    state[6] = state[14];\n    state[10] = v;\n    state[14] = u;\n    v = state[3];\n    u = state[7];\n    t = state[11];\n    state[3] = state[15];\n    state[7] = v;\n    state[11] = u;\n    state[15] = t;\n    for (j = 0, k = 160; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n    return state;\n  }\n  function AES128Cipher(key) {\n    this.key = expandKey128(key);\n    this.buffer = new Uint8Array(16);\n    this.bufferPosition = 0;\n  }\n  function decryptBlock2(data, finalize) {\n    var i,\n        j,\n        ii,\n        sourceLength = data.length,\n        buffer = this.buffer,\n        bufferLength = this.bufferPosition,\n        result = [],\n        iv = this.iv;\n    for (i = 0; i < sourceLength; ++i) {\n      buffer[bufferLength] = data[i];\n      ++bufferLength;\n      if (bufferLength < 16) {\n        continue;\n      }\n      var plain = decrypt128(buffer, this.key);\n      for (j = 0; j < 16; ++j) {\n        plain[j] ^= iv[j];\n      }\n      iv = buffer;\n      result.push(plain);\n      buffer = new Uint8Array(16);\n      bufferLength = 0;\n    }\n    this.buffer = buffer;\n    this.bufferLength = bufferLength;\n    this.iv = iv;\n    if (result.length === 0) {\n      return new Uint8Array([]);\n    }\n    var outputLength = 16 * result.length;\n    if (finalize) {\n      var lastBlock = result[result.length - 1];\n      var psLen = lastBlock[15];\n      if (psLen <= 16) {\n        for (i = 15, ii = 16 - psLen; i >= ii; --i) {\n          if (lastBlock[i] !== psLen) {\n            psLen = 0;\n            break;\n          }\n        }\n        outputLength -= psLen;\n        result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);\n      }\n    }\n    var output = new Uint8Array(outputLength);\n    for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n      output.set(result[i], j);\n    }\n    return output;\n  }\n  AES128Cipher.prototype = {\n    decryptBlock: function AES128Cipher_decryptBlock(data, finalize) {\n      var i,\n          sourceLength = data.length;\n      var buffer = this.buffer,\n          bufferLength = this.bufferPosition;\n      for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) {\n        buffer[bufferLength] = data[i];\n      }\n      if (bufferLength < 16) {\n        this.bufferLength = bufferLength;\n        return new Uint8Array([]);\n      }\n      this.iv = buffer;\n      this.buffer = new Uint8Array(16);\n      this.bufferLength = 0;\n      this.decryptBlock = decryptBlock2;\n      return this.decryptBlock(data.subarray(16), finalize);\n    },\n    encrypt: function AES128Cipher_encrypt(data, iv) {\n      var i,\n          j,\n          ii,\n          sourceLength = data.length,\n          buffer = this.buffer,\n          bufferLength = this.bufferPosition,\n          result = [];\n      if (!iv) {\n        iv = new Uint8Array(16);\n      }\n      for (i = 0; i < sourceLength; ++i) {\n        buffer[bufferLength] = data[i];\n        ++bufferLength;\n        if (bufferLength < 16) {\n          continue;\n        }\n        for (j = 0; j < 16; ++j) {\n          buffer[j] ^= iv[j];\n        }\n        var cipher = encrypt128(buffer, this.key);\n        iv = cipher;\n        result.push(cipher);\n        buffer = new Uint8Array(16);\n        bufferLength = 0;\n      }\n      this.buffer = buffer;\n      this.bufferLength = bufferLength;\n      this.iv = iv;\n      if (result.length === 0) {\n        return new Uint8Array([]);\n      }\n      var outputLength = 16 * result.length;\n      var output = new Uint8Array(outputLength);\n      for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n        output.set(result[i], j);\n      }\n      return output;\n    }\n  };\n  return AES128Cipher;\n}();\nvar AES256Cipher = function AES256CipherClosure() {\n  var s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]);\n  var inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]);\n  var mixCol = new Uint8Array(256);\n  for (var i = 0; i < 256; i++) {\n    if (i < 128) {\n      mixCol[i] = i << 1;\n    } else {\n      mixCol[i] = i << 1 ^ 0x1b;\n    }\n  }\n  var mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);\n  function expandKey256(cipherKey) {\n    var b = 240,\n        result = new Uint8Array(b);\n    var r = 1;\n    result.set(cipherKey);\n    for (var j = 32, i = 1; j < b; ++i) {\n      if (j % 32 === 16) {\n        t1 = s[t1];\n        t2 = s[t2];\n        t3 = s[t3];\n        t4 = s[t4];\n      } else if (j % 32 === 0) {\n        var t1 = result[j - 3],\n            t2 = result[j - 2],\n            t3 = result[j - 1],\n            t4 = result[j - 4];\n        t1 = s[t1];\n        t2 = s[t2];\n        t3 = s[t3];\n        t4 = s[t4];\n        t1 = t1 ^ r;\n        if ((r <<= 1) >= 256) {\n          r = (r ^ 0x1b) & 0xFF;\n        }\n      }\n      for (var n = 0; n < 4; ++n) {\n        result[j] = t1 ^= result[j - 32];\n        j++;\n        result[j] = t2 ^= result[j - 32];\n        j++;\n        result[j] = t3 ^= result[j - 32];\n        j++;\n        result[j] = t4 ^= result[j - 32];\n        j++;\n      }\n    }\n    return result;\n  }\n  function decrypt256(input, key) {\n    var state = new Uint8Array(16);\n    state.set(input);\n    var i, j, k;\n    var t, u, v;\n    for (j = 0, k = 224; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n    for (i = 13; i >= 1; --i) {\n      t = state[13];\n      state[13] = state[9];\n      state[9] = state[5];\n      state[5] = state[1];\n      state[1] = t;\n      t = state[14];\n      u = state[10];\n      state[14] = state[6];\n      state[10] = state[2];\n      state[6] = t;\n      state[2] = u;\n      t = state[15];\n      u = state[11];\n      v = state[7];\n      state[15] = state[3];\n      state[11] = t;\n      state[7] = u;\n      state[3] = v;\n      for (j = 0; j < 16; ++j) {\n        state[j] = inv_s[state[j]];\n      }\n      for (j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n      for (j = 0; j < 16; j += 4) {\n        var s0 = mix[state[j]],\n            s1 = mix[state[j + 1]],\n            s2 = mix[state[j + 2]],\n            s3 = mix[state[j + 3]];\n        t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8;\n        state[j] = t >>> 24 & 0xFF;\n        state[j + 1] = t >> 16 & 0xFF;\n        state[j + 2] = t >> 8 & 0xFF;\n        state[j + 3] = t & 0xFF;\n      }\n    }\n    t = state[13];\n    state[13] = state[9];\n    state[9] = state[5];\n    state[5] = state[1];\n    state[1] = t;\n    t = state[14];\n    u = state[10];\n    state[14] = state[6];\n    state[10] = state[2];\n    state[6] = t;\n    state[2] = u;\n    t = state[15];\n    u = state[11];\n    v = state[7];\n    state[15] = state[3];\n    state[11] = t;\n    state[7] = u;\n    state[3] = v;\n    for (j = 0; j < 16; ++j) {\n      state[j] = inv_s[state[j]];\n      state[j] ^= key[j];\n    }\n    return state;\n  }\n  function encrypt256(input, key) {\n    var t, u, v, k;\n    var state = new Uint8Array(16);\n    state.set(input);\n    for (j = 0; j < 16; ++j) {\n      state[j] ^= key[j];\n    }\n    for (i = 1; i < 14; i++) {\n      for (j = 0; j < 16; ++j) {\n        state[j] = s[state[j]];\n      }\n      v = state[1];\n      state[1] = state[5];\n      state[5] = state[9];\n      state[9] = state[13];\n      state[13] = v;\n      v = state[2];\n      u = state[6];\n      state[2] = state[10];\n      state[6] = state[14];\n      state[10] = v;\n      state[14] = u;\n      v = state[3];\n      u = state[7];\n      t = state[11];\n      state[3] = state[15];\n      state[7] = v;\n      state[11] = u;\n      state[15] = t;\n      for (var j = 0; j < 16; j += 4) {\n        var s0 = state[j + 0],\n            s1 = state[j + 1];\n        var s2 = state[j + 2],\n            s3 = state[j + 3];\n        t = s0 ^ s1 ^ s2 ^ s3;\n        state[j + 0] ^= t ^ mixCol[s0 ^ s1];\n        state[j + 1] ^= t ^ mixCol[s1 ^ s2];\n        state[j + 2] ^= t ^ mixCol[s2 ^ s3];\n        state[j + 3] ^= t ^ mixCol[s3 ^ s0];\n      }\n      for (j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n    }\n    for (j = 0; j < 16; ++j) {\n      state[j] = s[state[j]];\n    }\n    v = state[1];\n    state[1] = state[5];\n    state[5] = state[9];\n    state[9] = state[13];\n    state[13] = v;\n    v = state[2];\n    u = state[6];\n    state[2] = state[10];\n    state[6] = state[14];\n    state[10] = v;\n    state[14] = u;\n    v = state[3];\n    u = state[7];\n    t = state[11];\n    state[3] = state[15];\n    state[7] = v;\n    state[11] = u;\n    state[15] = t;\n    for (j = 0, k = 224; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n    return state;\n  }\n  function AES256Cipher(key) {\n    this.key = expandKey256(key);\n    this.buffer = new Uint8Array(16);\n    this.bufferPosition = 0;\n  }\n  function decryptBlock2(data, finalize) {\n    var i,\n        j,\n        ii,\n        sourceLength = data.length,\n        buffer = this.buffer,\n        bufferLength = this.bufferPosition,\n        result = [],\n        iv = this.iv;\n    for (i = 0; i < sourceLength; ++i) {\n      buffer[bufferLength] = data[i];\n      ++bufferLength;\n      if (bufferLength < 16) {\n        continue;\n      }\n      var plain = decrypt256(buffer, this.key);\n      for (j = 0; j < 16; ++j) {\n        plain[j] ^= iv[j];\n      }\n      iv = buffer;\n      result.push(plain);\n      buffer = new Uint8Array(16);\n      bufferLength = 0;\n    }\n    this.buffer = buffer;\n    this.bufferLength = bufferLength;\n    this.iv = iv;\n    if (result.length === 0) {\n      return new Uint8Array([]);\n    }\n    var outputLength = 16 * result.length;\n    if (finalize) {\n      var lastBlock = result[result.length - 1];\n      var psLen = lastBlock[15];\n      if (psLen <= 16) {\n        for (i = 15, ii = 16 - psLen; i >= ii; --i) {\n          if (lastBlock[i] !== psLen) {\n            psLen = 0;\n            break;\n          }\n        }\n        outputLength -= psLen;\n        result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);\n      }\n    }\n    var output = new Uint8Array(outputLength);\n    for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n      output.set(result[i], j);\n    }\n    return output;\n  }\n  AES256Cipher.prototype = {\n    decryptBlock: function AES256Cipher_decryptBlock(data, finalize, iv) {\n      var i,\n          sourceLength = data.length;\n      var buffer = this.buffer,\n          bufferLength = this.bufferPosition;\n      if (iv) {\n        this.iv = iv;\n      } else {\n        for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) {\n          buffer[bufferLength] = data[i];\n        }\n        if (bufferLength < 16) {\n          this.bufferLength = bufferLength;\n          return new Uint8Array([]);\n        }\n        this.iv = buffer;\n        data = data.subarray(16);\n      }\n      this.buffer = new Uint8Array(16);\n      this.bufferLength = 0;\n      this.decryptBlock = decryptBlock2;\n      return this.decryptBlock(data, finalize);\n    },\n    encrypt: function AES256Cipher_encrypt(data, iv) {\n      var i,\n          j,\n          ii,\n          sourceLength = data.length,\n          buffer = this.buffer,\n          bufferLength = this.bufferPosition,\n          result = [];\n      if (!iv) {\n        iv = new Uint8Array(16);\n      }\n      for (i = 0; i < sourceLength; ++i) {\n        buffer[bufferLength] = data[i];\n        ++bufferLength;\n        if (bufferLength < 16) {\n          continue;\n        }\n        for (j = 0; j < 16; ++j) {\n          buffer[j] ^= iv[j];\n        }\n        var cipher = encrypt256(buffer, this.key);\n        this.iv = cipher;\n        result.push(cipher);\n        buffer = new Uint8Array(16);\n        bufferLength = 0;\n      }\n      this.buffer = buffer;\n      this.bufferLength = bufferLength;\n      this.iv = iv;\n      if (result.length === 0) {\n        return new Uint8Array([]);\n      }\n      var outputLength = 16 * result.length;\n      var output = new Uint8Array(outputLength);\n      for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n        output.set(result[i], j);\n      }\n      return output;\n    }\n  };\n  return AES256Cipher;\n}();\nvar PDF17 = function PDF17Closure() {\n  function compareByteArrays(array1, array2) {\n    if (array1.length !== array2.length) {\n      return false;\n    }\n    for (var i = 0; i < array1.length; i++) {\n      if (array1[i] !== array2[i]) {\n        return false;\n      }\n    }\n    return true;\n  }\n  function PDF17() {}\n  PDF17.prototype = {\n    checkOwnerPassword: function PDF17_checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerValidationSalt, password.length);\n      hashData.set(userBytes, password.length + ownerValidationSalt.length);\n      var result = calculateSHA256(hashData, 0, hashData.length);\n      return compareByteArrays(result, ownerPassword);\n    },\n    checkUserPassword: function PDF17_checkUserPassword(password, userValidationSalt, userPassword) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userValidationSalt, password.length);\n      var result = calculateSHA256(hashData, 0, hashData.length);\n      return compareByteArrays(result, userPassword);\n    },\n    getOwnerKey: function PDF17_getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerKeySalt, password.length);\n      hashData.set(userBytes, password.length + ownerKeySalt.length);\n      var key = calculateSHA256(hashData, 0, hashData.length);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));\n    },\n    getUserKey: function PDF17_getUserKey(password, userKeySalt, userEncryption) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userKeySalt, password.length);\n      var key = calculateSHA256(hashData, 0, hashData.length);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));\n    }\n  };\n  return PDF17;\n}();\nvar PDF20 = function PDF20Closure() {\n  function concatArrays(array1, array2) {\n    var t = new Uint8Array(array1.length + array2.length);\n    t.set(array1, 0);\n    t.set(array2, array1.length);\n    return t;\n  }\n  function calculatePDF20Hash(password, input, userBytes) {\n    var k = calculateSHA256(input, 0, input.length).subarray(0, 32);\n    var e = [0];\n    var i = 0;\n    while (i < 64 || e[e.length - 1] > i - 32) {\n      var arrayLength = password.length + k.length + userBytes.length;\n      var k1 = new Uint8Array(arrayLength * 64);\n      var array = concatArrays(password, k);\n      array = concatArrays(array, userBytes);\n      for (var j = 0, pos = 0; j < 64; j++, pos += arrayLength) {\n        k1.set(array, pos);\n      }\n      var cipher = new AES128Cipher(k.subarray(0, 16));\n      e = cipher.encrypt(k1, k.subarray(16, 32));\n      var remainder = 0;\n      for (var z = 0; z < 16; z++) {\n        remainder *= 256 % 3;\n        remainder %= 3;\n        remainder += (e[z] >>> 0) % 3;\n        remainder %= 3;\n      }\n      if (remainder === 0) {\n        k = calculateSHA256(e, 0, e.length);\n      } else if (remainder === 1) {\n        k = calculateSHA384(e, 0, e.length);\n      } else if (remainder === 2) {\n        k = calculateSHA512(e, 0, e.length);\n      }\n      i++;\n    }\n    return k.subarray(0, 32);\n  }\n  function PDF20() {}\n  function compareByteArrays(array1, array2) {\n    if (array1.length !== array2.length) {\n      return false;\n    }\n    for (var i = 0; i < array1.length; i++) {\n      if (array1[i] !== array2[i]) {\n        return false;\n      }\n    }\n    return true;\n  }\n  PDF20.prototype = {\n    hash: function PDF20_hash(password, concatBytes, userBytes) {\n      return calculatePDF20Hash(password, concatBytes, userBytes);\n    },\n    checkOwnerPassword: function PDF20_checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerValidationSalt, password.length);\n      hashData.set(userBytes, password.length + ownerValidationSalt.length);\n      var result = calculatePDF20Hash(password, hashData, userBytes);\n      return compareByteArrays(result, ownerPassword);\n    },\n    checkUserPassword: function PDF20_checkUserPassword(password, userValidationSalt, userPassword) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userValidationSalt, password.length);\n      var result = calculatePDF20Hash(password, hashData, []);\n      return compareByteArrays(result, userPassword);\n    },\n    getOwnerKey: function PDF20_getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerKeySalt, password.length);\n      hashData.set(userBytes, password.length + ownerKeySalt.length);\n      var key = calculatePDF20Hash(password, hashData, userBytes);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));\n    },\n    getUserKey: function PDF20_getUserKey(password, userKeySalt, userEncryption) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userKeySalt, password.length);\n      var key = calculatePDF20Hash(password, hashData, []);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));\n    }\n  };\n  return PDF20;\n}();\nvar CipherTransform = function CipherTransformClosure() {\n  function CipherTransform(stringCipherConstructor, streamCipherConstructor) {\n    this.StringCipherConstructor = stringCipherConstructor;\n    this.StreamCipherConstructor = streamCipherConstructor;\n  }\n  CipherTransform.prototype = {\n    createStream: function CipherTransform_createStream(stream, length) {\n      var cipher = new this.StreamCipherConstructor();\n      return new _stream.DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) {\n        return cipher.decryptBlock(data, finalize);\n      });\n    },\n    decryptString: function CipherTransform_decryptString(s) {\n      var cipher = new this.StringCipherConstructor();\n      var data = (0, _util.stringToBytes)(s);\n      data = cipher.decryptBlock(data, true);\n      return (0, _util.bytesToString)(data);\n    }\n  };\n  return CipherTransform;\n}();\nvar CipherTransformFactory = function CipherTransformFactoryClosure() {\n  var defaultPasswordBytes = new Uint8Array([0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41, 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08, 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80, 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);\n  function createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) {\n    if (password) {\n      var passwordLength = Math.min(127, password.length);\n      password = password.subarray(0, passwordLength);\n    } else {\n      password = [];\n    }\n    var pdfAlgorithm;\n    if (revision === 6) {\n      pdfAlgorithm = new PDF20();\n    } else {\n      pdfAlgorithm = new PDF17();\n    }\n    if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) {\n      return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption);\n    } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, ownerPassword)) {\n      return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption);\n    }\n    return null;\n  }\n  function prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata) {\n    var hashDataSize = 40 + ownerPassword.length + fileId.length;\n    var hashData = new Uint8Array(hashDataSize),\n        i = 0,\n        j,\n        n;\n    if (password) {\n      n = Math.min(32, password.length);\n      for (; i < n; ++i) {\n        hashData[i] = password[i];\n      }\n    }\n    j = 0;\n    while (i < 32) {\n      hashData[i++] = defaultPasswordBytes[j++];\n    }\n    for (j = 0, n = ownerPassword.length; j < n; ++j) {\n      hashData[i++] = ownerPassword[j];\n    }\n    hashData[i++] = flags & 0xFF;\n    hashData[i++] = flags >> 8 & 0xFF;\n    hashData[i++] = flags >> 16 & 0xFF;\n    hashData[i++] = flags >>> 24 & 0xFF;\n    for (j = 0, n = fileId.length; j < n; ++j) {\n      hashData[i++] = fileId[j];\n    }\n    if (revision >= 4 && !encryptMetadata) {\n      hashData[i++] = 0xFF;\n      hashData[i++] = 0xFF;\n      hashData[i++] = 0xFF;\n      hashData[i++] = 0xFF;\n    }\n    var hash = calculateMD5(hashData, 0, i);\n    var keyLengthInBytes = keyLength >> 3;\n    if (revision >= 3) {\n      for (j = 0; j < 50; ++j) {\n        hash = calculateMD5(hash, 0, keyLengthInBytes);\n      }\n    }\n    var encryptionKey = hash.subarray(0, keyLengthInBytes);\n    var cipher, checkData;\n    if (revision >= 3) {\n      for (i = 0; i < 32; ++i) {\n        hashData[i] = defaultPasswordBytes[i];\n      }\n      for (j = 0, n = fileId.length; j < n; ++j) {\n        hashData[i++] = fileId[j];\n      }\n      cipher = new ARCFourCipher(encryptionKey);\n      checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));\n      n = encryptionKey.length;\n      var derivedKey = new Uint8Array(n),\n          k;\n      for (j = 1; j <= 19; ++j) {\n        for (k = 0; k < n; ++k) {\n          derivedKey[k] = encryptionKey[k] ^ j;\n        }\n        cipher = new ARCFourCipher(derivedKey);\n        checkData = cipher.encryptBlock(checkData);\n      }\n      for (j = 0, n = checkData.length; j < n; ++j) {\n        if (userPassword[j] !== checkData[j]) {\n          return null;\n        }\n      }\n    } else {\n      cipher = new ARCFourCipher(encryptionKey);\n      checkData = cipher.encryptBlock(defaultPasswordBytes);\n      for (j = 0, n = checkData.length; j < n; ++j) {\n        if (userPassword[j] !== checkData[j]) {\n          return null;\n        }\n      }\n    }\n    return encryptionKey;\n  }\n  function decodeUserPassword(password, ownerPassword, revision, keyLength) {\n    var hashData = new Uint8Array(32),\n        i = 0,\n        j,\n        n;\n    n = Math.min(32, password.length);\n    for (; i < n; ++i) {\n      hashData[i] = password[i];\n    }\n    j = 0;\n    while (i < 32) {\n      hashData[i++] = defaultPasswordBytes[j++];\n    }\n    var hash = calculateMD5(hashData, 0, i);\n    var keyLengthInBytes = keyLength >> 3;\n    if (revision >= 3) {\n      for (j = 0; j < 50; ++j) {\n        hash = calculateMD5(hash, 0, hash.length);\n      }\n    }\n    var cipher, userPassword;\n    if (revision >= 3) {\n      userPassword = ownerPassword;\n      var derivedKey = new Uint8Array(keyLengthInBytes),\n          k;\n      for (j = 19; j >= 0; j--) {\n        for (k = 0; k < keyLengthInBytes; ++k) {\n          derivedKey[k] = hash[k] ^ j;\n        }\n        cipher = new ARCFourCipher(derivedKey);\n        userPassword = cipher.encryptBlock(userPassword);\n      }\n    } else {\n      cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes));\n      userPassword = cipher.encryptBlock(ownerPassword);\n    }\n    return userPassword;\n  }\n  var identityName = _primitives.Name.get('Identity');\n  function CipherTransformFactory(dict, fileId, password) {\n    var filter = dict.get('Filter');\n    if (!(0, _primitives.isName)(filter, 'Standard')) {\n      throw new _util.FormatError('unknown encryption method');\n    }\n    this.dict = dict;\n    var algorithm = dict.get('V');\n    if (!(0, _util.isInt)(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5) {\n      throw new _util.FormatError('unsupported encryption algorithm');\n    }\n    this.algorithm = algorithm;\n    var keyLength = dict.get('Length');\n    if (!keyLength) {\n      if (algorithm <= 3) {\n        keyLength = 40;\n      } else {\n        var cfDict = dict.get('CF');\n        var streamCryptoName = dict.get('StmF');\n        if ((0, _primitives.isDict)(cfDict) && (0, _primitives.isName)(streamCryptoName)) {\n          cfDict.suppressEncryption = true;\n          var handlerDict = cfDict.get(streamCryptoName.name);\n          keyLength = handlerDict && handlerDict.get('Length') || 128;\n          if (keyLength < 40) {\n            keyLength <<= 3;\n          }\n        }\n      }\n    }\n    if (!(0, _util.isInt)(keyLength) || keyLength < 40 || keyLength % 8 !== 0) {\n      throw new _util.FormatError('invalid key length');\n    }\n    var ownerPassword = (0, _util.stringToBytes)(dict.get('O')).subarray(0, 32);\n    var userPassword = (0, _util.stringToBytes)(dict.get('U')).subarray(0, 32);\n    var flags = dict.get('P');\n    var revision = dict.get('R');\n    var encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get('EncryptMetadata') !== false;\n    this.encryptMetadata = encryptMetadata;\n    var fileIdBytes = (0, _util.stringToBytes)(fileId);\n    var passwordBytes;\n    if (password) {\n      if (revision === 6) {\n        try {\n          password = (0, _util.utf8StringToString)(password);\n        } catch (ex) {\n          (0, _util.warn)('CipherTransformFactory: ' + 'Unable to convert UTF8 encoded password.');\n        }\n      }\n      passwordBytes = (0, _util.stringToBytes)(password);\n    }\n    var encryptionKey;\n    if (algorithm !== 5) {\n      encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata);\n    } else {\n      var ownerValidationSalt = (0, _util.stringToBytes)(dict.get('O')).subarray(32, 40);\n      var ownerKeySalt = (0, _util.stringToBytes)(dict.get('O')).subarray(40, 48);\n      var uBytes = (0, _util.stringToBytes)(dict.get('U')).subarray(0, 48);\n      var userValidationSalt = (0, _util.stringToBytes)(dict.get('U')).subarray(32, 40);\n      var userKeySalt = (0, _util.stringToBytes)(dict.get('U')).subarray(40, 48);\n      var ownerEncryption = (0, _util.stringToBytes)(dict.get('OE'));\n      var userEncryption = (0, _util.stringToBytes)(dict.get('UE'));\n      var perms = (0, _util.stringToBytes)(dict.get('Perms'));\n      encryptionKey = createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms);\n    }\n    if (!encryptionKey && !password) {\n      throw new _util.PasswordException('No password given', _util.PasswordResponses.NEED_PASSWORD);\n    } else if (!encryptionKey && password) {\n      var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength);\n      encryptionKey = prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata);\n    }\n    if (!encryptionKey) {\n      throw new _util.PasswordException('Incorrect Password', _util.PasswordResponses.INCORRECT_PASSWORD);\n    }\n    this.encryptionKey = encryptionKey;\n    if (algorithm >= 4) {\n      var cf = dict.get('CF');\n      if ((0, _primitives.isDict)(cf)) {\n        cf.suppressEncryption = true;\n      }\n      this.cf = cf;\n      this.stmf = dict.get('StmF') || identityName;\n      this.strf = dict.get('StrF') || identityName;\n      this.eff = dict.get('EFF') || this.stmf;\n    }\n  }\n  function buildObjectKey(num, gen, encryptionKey, isAes) {\n    var key = new Uint8Array(encryptionKey.length + 9),\n        i,\n        n;\n    for (i = 0, n = encryptionKey.length; i < n; ++i) {\n      key[i] = encryptionKey[i];\n    }\n    key[i++] = num & 0xFF;\n    key[i++] = num >> 8 & 0xFF;\n    key[i++] = num >> 16 & 0xFF;\n    key[i++] = gen & 0xFF;\n    key[i++] = gen >> 8 & 0xFF;\n    if (isAes) {\n      key[i++] = 0x73;\n      key[i++] = 0x41;\n      key[i++] = 0x6C;\n      key[i++] = 0x54;\n    }\n    var hash = calculateMD5(key, 0, i);\n    return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));\n  }\n  function buildCipherConstructor(cf, name, num, gen, key) {\n    if (!(0, _primitives.isName)(name)) {\n      throw new _util.FormatError('Invalid crypt filter name.');\n    }\n    var cryptFilter = cf.get(name.name);\n    var cfm;\n    if (cryptFilter !== null && cryptFilter !== undefined) {\n      cfm = cryptFilter.get('CFM');\n    }\n    if (!cfm || cfm.name === 'None') {\n      return function cipherTransformFactoryBuildCipherConstructorNone() {\n        return new NullCipher();\n      };\n    }\n    if (cfm.name === 'V2') {\n      return function cipherTransformFactoryBuildCipherConstructorV2() {\n        return new ARCFourCipher(buildObjectKey(num, gen, key, false));\n      };\n    }\n    if (cfm.name === 'AESV2') {\n      return function cipherTransformFactoryBuildCipherConstructorAESV2() {\n        return new AES128Cipher(buildObjectKey(num, gen, key, true));\n      };\n    }\n    if (cfm.name === 'AESV3') {\n      return function cipherTransformFactoryBuildCipherConstructorAESV3() {\n        return new AES256Cipher(key);\n      };\n    }\n    throw new _util.FormatError('Unknown crypto method');\n  }\n  CipherTransformFactory.prototype = {\n    createCipherTransform: function CipherTransformFactory_createCipherTransform(num, gen) {\n      if (this.algorithm === 4 || this.algorithm === 5) {\n        return new CipherTransform(buildCipherConstructor(this.cf, this.stmf, num, gen, this.encryptionKey), buildCipherConstructor(this.cf, this.strf, num, gen, this.encryptionKey));\n      }\n      var key = buildObjectKey(num, gen, this.encryptionKey, false);\n      var cipherConstructor = function buildCipherCipherConstructor() {\n        return new ARCFourCipher(key);\n      };\n      return new CipherTransform(cipherConstructor, cipherConstructor);\n    }\n  };\n  return CipherTransformFactory;\n}();\nexports.AES128Cipher = AES128Cipher;\nexports.AES256Cipher = AES256Cipher;\nexports.ARCFourCipher = ARCFourCipher;\nexports.CipherTransformFactory = CipherTransformFactory;\nexports.PDF17 = PDF17;\nexports.PDF20 = PDF20;\nexports.calculateMD5 = calculateMD5;\nexports.calculateSHA256 = calculateSHA256;\nexports.calculateSHA384 = calculateSHA384;\nexports.calculateSHA512 = calculateSHA512;\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PartialEvaluator = exports.OperatorList = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _cmap = __w_pdfjs_require__(22);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _fonts = __w_pdfjs_require__(25);\n\nvar _encodings = __w_pdfjs_require__(4);\n\nvar _unicode = __w_pdfjs_require__(8);\n\nvar _standard_fonts = __w_pdfjs_require__(16);\n\nvar _pattern = __w_pdfjs_require__(31);\n\nvar _function = __w_pdfjs_require__(7);\n\nvar _parser = __w_pdfjs_require__(5);\n\nvar _bidi = __w_pdfjs_require__(20);\n\nvar _colorspace = __w_pdfjs_require__(3);\n\nvar _glyphlist = __w_pdfjs_require__(6);\n\nvar _metrics = __w_pdfjs_require__(29);\n\nvar _murmurhash = __w_pdfjs_require__(30);\n\nvar _image = __w_pdfjs_require__(26);\n\nvar PartialEvaluator = function PartialEvaluatorClosure() {\n  var DefaultPartialEvaluatorOptions = {\n    forceDataSchema: false,\n    maxImageSize: -1,\n    disableFontFace: false,\n    nativeImageDecoderSupport: _util.NativeImageDecoding.DECODE,\n    ignoreErrors: false\n  };\n  function NativeImageDecoder(xref, resources, handler, forceDataSchema) {\n    this.xref = xref;\n    this.resources = resources;\n    this.handler = handler;\n    this.forceDataSchema = forceDataSchema;\n  }\n  NativeImageDecoder.prototype = {\n    canDecode: function canDecode(image) {\n      return image instanceof _stream.JpegStream && NativeImageDecoder.isDecodable(image, this.xref, this.resources);\n    },\n    decode: function decode(image) {\n      var dict = image.dict;\n      var colorSpace = dict.get('ColorSpace', 'CS');\n      colorSpace = _colorspace.ColorSpace.parse(colorSpace, this.xref, this.resources);\n      var numComps = colorSpace.numComps;\n      var decodePromise = this.handler.sendWithPromise('JpegDecode', [image.getIR(this.forceDataSchema), numComps]);\n      return decodePromise.then(function (message) {\n        var data = message.data;\n        return new _stream.Stream(data, 0, data.length, image.dict);\n      });\n    }\n  };\n  NativeImageDecoder.isSupported = function NativeImageDecoder_isSupported(image, xref, res) {\n    var dict = image.dict;\n    if (dict.has('DecodeParms') || dict.has('DP')) {\n      return false;\n    }\n    var cs = _colorspace.ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res);\n    return (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') && cs.isDefaultDecode(dict.getArray('Decode', 'D'));\n  };\n  NativeImageDecoder.isDecodable = function NativeImageDecoder_isDecodable(image, xref, res) {\n    var dict = image.dict;\n    if (dict.has('DecodeParms') || dict.has('DP')) {\n      return false;\n    }\n    var cs = _colorspace.ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res);\n    return (cs.numComps === 1 || cs.numComps === 3) && cs.isDefaultDecode(dict.getArray('Decode', 'D'));\n  };\n  function PartialEvaluator(_ref) {\n    var _this = this;\n\n    var pdfManager = _ref.pdfManager,\n        xref = _ref.xref,\n        handler = _ref.handler,\n        pageIndex = _ref.pageIndex,\n        idFactory = _ref.idFactory,\n        fontCache = _ref.fontCache,\n        builtInCMapCache = _ref.builtInCMapCache,\n        _ref$options = _ref.options,\n        options = _ref$options === undefined ? null : _ref$options;\n\n    this.pdfManager = pdfManager;\n    this.xref = xref;\n    this.handler = handler;\n    this.pageIndex = pageIndex;\n    this.idFactory = idFactory;\n    this.fontCache = fontCache;\n    this.builtInCMapCache = builtInCMapCache;\n    this.options = options || DefaultPartialEvaluatorOptions;\n    this.fetchBuiltInCMap = function (name) {\n      var cachedCMap = _this.builtInCMapCache[name];\n      if (cachedCMap) {\n        return Promise.resolve(cachedCMap);\n      }\n      return _this.handler.sendWithPromise('FetchBuiltInCMap', { name: name }).then(function (data) {\n        if (data.compressionType !== _util.CMapCompressionType.NONE) {\n          _this.builtInCMapCache[name] = data;\n        }\n        return data;\n      });\n    };\n  }\n  var TIME_SLOT_DURATION_MS = 20;\n  var CHECK_TIME_EVERY = 100;\n  function TimeSlotManager() {\n    this.reset();\n  }\n  TimeSlotManager.prototype = {\n    check: function TimeSlotManager_check() {\n      if (++this.checked < CHECK_TIME_EVERY) {\n        return false;\n      }\n      this.checked = 0;\n      return this.endTime <= Date.now();\n    },\n    reset: function TimeSlotManager_reset() {\n      this.endTime = Date.now() + TIME_SLOT_DURATION_MS;\n      this.checked = 0;\n    }\n  };\n  function normalizeBlendMode(value) {\n    if (!(0, _primitives.isName)(value)) {\n      return 'source-over';\n    }\n    switch (value.name) {\n      case 'Normal':\n      case 'Compatible':\n        return 'source-over';\n      case 'Multiply':\n        return 'multiply';\n      case 'Screen':\n        return 'screen';\n      case 'Overlay':\n        return 'overlay';\n      case 'Darken':\n        return 'darken';\n      case 'Lighten':\n        return 'lighten';\n      case 'ColorDodge':\n        return 'color-dodge';\n      case 'ColorBurn':\n        return 'color-burn';\n      case 'HardLight':\n        return 'hard-light';\n      case 'SoftLight':\n        return 'soft-light';\n      case 'Difference':\n        return 'difference';\n      case 'Exclusion':\n        return 'exclusion';\n      case 'Hue':\n        return 'hue';\n      case 'Saturation':\n        return 'saturation';\n      case 'Color':\n        return 'color';\n      case 'Luminosity':\n        return 'luminosity';\n    }\n    (0, _util.warn)('Unsupported blend mode: ' + value.name);\n    return 'source-over';\n  }\n  var deferred = Promise.resolve();\n  var TILING_PATTERN = 1,\n      SHADING_PATTERN = 2;\n  PartialEvaluator.prototype = {\n    clone: function clone() {\n      var newOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DefaultPartialEvaluatorOptions;\n\n      var newEvaluator = Object.create(this);\n      newEvaluator.options = newOptions;\n      return newEvaluator;\n    },\n\n    hasBlendModes: function PartialEvaluator_hasBlendModes(resources) {\n      if (!(0, _primitives.isDict)(resources)) {\n        return false;\n      }\n      var processed = Object.create(null);\n      if (resources.objId) {\n        processed[resources.objId] = true;\n      }\n      var nodes = [resources],\n          xref = this.xref;\n      while (nodes.length) {\n        var key, i, ii;\n        var node = nodes.shift();\n        var graphicStates = node.get('ExtGState');\n        if ((0, _primitives.isDict)(graphicStates)) {\n          var graphicStatesKeys = graphicStates.getKeys();\n          for (i = 0, ii = graphicStatesKeys.length; i < ii; i++) {\n            key = graphicStatesKeys[i];\n            var graphicState = graphicStates.get(key);\n            var bm = graphicState.get('BM');\n            if ((0, _primitives.isName)(bm) && bm.name !== 'Normal') {\n              return true;\n            }\n          }\n        }\n        var xObjects = node.get('XObject');\n        if (!(0, _primitives.isDict)(xObjects)) {\n          continue;\n        }\n        var xObjectsKeys = xObjects.getKeys();\n        for (i = 0, ii = xObjectsKeys.length; i < ii; i++) {\n          key = xObjectsKeys[i];\n          var xObject = xObjects.getRaw(key);\n          if ((0, _primitives.isRef)(xObject)) {\n            if (processed[xObject.toString()]) {\n              continue;\n            }\n            xObject = xref.fetch(xObject);\n          }\n          if (!(0, _primitives.isStream)(xObject)) {\n            continue;\n          }\n          if (xObject.dict.objId) {\n            if (processed[xObject.dict.objId]) {\n              continue;\n            }\n            processed[xObject.dict.objId] = true;\n          }\n          var xResources = xObject.dict.get('Resources');\n          if ((0, _primitives.isDict)(xResources) && (!xResources.objId || !processed[xResources.objId])) {\n            nodes.push(xResources);\n            if (xResources.objId) {\n              processed[xResources.objId] = true;\n            }\n          }\n        }\n      }\n      return false;\n    },\n    buildFormXObject: function PartialEvaluator_buildFormXObject(resources, xobj, smask, operatorList, task, initialState) {\n      var dict = xobj.dict;\n      var matrix = dict.getArray('Matrix');\n      var bbox = dict.getArray('BBox');\n      var group = dict.get('Group');\n      if (group) {\n        var groupOptions = {\n          matrix: matrix,\n          bbox: bbox,\n          smask: smask,\n          isolated: false,\n          knockout: false\n        };\n        var groupSubtype = group.get('S');\n        var colorSpace;\n        if ((0, _primitives.isName)(groupSubtype, 'Transparency')) {\n          groupOptions.isolated = group.get('I') || false;\n          groupOptions.knockout = group.get('K') || false;\n          colorSpace = group.has('CS') ? _colorspace.ColorSpace.parse(group.get('CS'), this.xref, resources) : null;\n        }\n        if (smask && smask.backdrop) {\n          colorSpace = colorSpace || _colorspace.ColorSpace.singletons.rgb;\n          smask.backdrop = colorSpace.getRgb(smask.backdrop, 0);\n        }\n        operatorList.addOp(_util.OPS.beginGroup, [groupOptions]);\n      }\n      operatorList.addOp(_util.OPS.paintFormXObjectBegin, [matrix, bbox]);\n      return this.getOperatorList({\n        stream: xobj,\n        task: task,\n        resources: dict.get('Resources') || resources,\n        operatorList: operatorList,\n        initialState: initialState\n      }).then(function () {\n        operatorList.addOp(_util.OPS.paintFormXObjectEnd, []);\n        if (group) {\n          operatorList.addOp(_util.OPS.endGroup, [groupOptions]);\n        }\n      });\n    },\n    buildPaintImageXObject: function PartialEvaluator_buildPaintImageXObject(resources, image, inline, operatorList, cacheKey, imageCache) {\n      var _this2 = this;\n\n      var dict = image.dict;\n      var w = dict.get('Width', 'W');\n      var h = dict.get('Height', 'H');\n      if (!(w && (0, _util.isNum)(w)) || !(h && (0, _util.isNum)(h))) {\n        (0, _util.warn)('Image dimensions are missing, or not numbers.');\n        return;\n      }\n      var maxImageSize = this.options.maxImageSize;\n      if (maxImageSize !== -1 && w * h > maxImageSize) {\n        (0, _util.warn)('Image exceeded maximum allowed size and was removed.');\n        return;\n      }\n      var imageMask = dict.get('ImageMask', 'IM') || false;\n      var imgData, args;\n      if (imageMask) {\n        var width = dict.get('Width', 'W');\n        var height = dict.get('Height', 'H');\n        var bitStrideLength = width + 7 >> 3;\n        var imgArray = image.getBytes(bitStrideLength * height);\n        var decode = dict.getArray('Decode', 'D');\n        var inverseDecode = !!decode && decode[0] > 0;\n        imgData = _image.PDFImage.createMask(imgArray, width, height, image instanceof _stream.DecodeStream, inverseDecode);\n        imgData.cached = true;\n        args = [imgData];\n        operatorList.addOp(_util.OPS.paintImageMaskXObject, args);\n        if (cacheKey) {\n          imageCache[cacheKey] = {\n            fn: _util.OPS.paintImageMaskXObject,\n            args: args\n          };\n        }\n        return;\n      }\n      var softMask = dict.get('SMask', 'SM') || false;\n      var mask = dict.get('Mask') || false;\n      var SMALL_IMAGE_DIMENSIONS = 200;\n      if (inline && !softMask && !mask && !(image instanceof _stream.JpegStream) && w + h < SMALL_IMAGE_DIMENSIONS) {\n        var imageObj = new _image.PDFImage(this.xref, resources, image, inline, null, null);\n        imgData = imageObj.createImageData(true);\n        operatorList.addOp(_util.OPS.paintInlineImageXObject, [imgData]);\n        return;\n      }\n      var nativeImageDecoderSupport = this.options.nativeImageDecoderSupport;\n      var objId = 'img_' + this.idFactory.createObjId();\n      operatorList.addDependency(objId);\n      args = [objId, w, h];\n      if (nativeImageDecoderSupport !== _util.NativeImageDecoding.NONE && !softMask && !mask && image instanceof _stream.JpegStream && NativeImageDecoder.isSupported(image, this.xref, resources)) {\n        operatorList.addOp(_util.OPS.paintJpegXObject, args);\n        this.handler.send('obj', [objId, this.pageIndex, 'JpegStream', image.getIR(this.options.forceDataSchema)]);\n        if (cacheKey) {\n          imageCache[cacheKey] = {\n            fn: _util.OPS.paintJpegXObject,\n            args: args\n          };\n        }\n        return;\n      }\n      var nativeImageDecoder = null;\n      if (nativeImageDecoderSupport === _util.NativeImageDecoding.DECODE && (image instanceof _stream.JpegStream || mask instanceof _stream.JpegStream || softMask instanceof _stream.JpegStream)) {\n        nativeImageDecoder = new NativeImageDecoder(this.xref, resources, this.handler, this.options.forceDataSchema);\n      }\n      _image.PDFImage.buildImage(this.handler, this.xref, resources, image, inline, nativeImageDecoder).then(function (imageObj) {\n        var imgData = imageObj.createImageData(false);\n        _this2.handler.send('obj', [objId, _this2.pageIndex, 'Image', imgData], [imgData.data.buffer]);\n      }).catch(function (reason) {\n        (0, _util.warn)('Unable to decode image: ' + reason);\n        _this2.handler.send('obj', [objId, _this2.pageIndex, 'Image', null]);\n      });\n      operatorList.addOp(_util.OPS.paintImageXObject, args);\n      if (cacheKey) {\n        imageCache[cacheKey] = {\n          fn: _util.OPS.paintImageXObject,\n          args: args\n        };\n      }\n    },\n    handleSMask: function PartialEvaluator_handleSmask(smask, resources, operatorList, task, stateManager) {\n      var smaskContent = smask.get('G');\n      var smaskOptions = {\n        subtype: smask.get('S').name,\n        backdrop: smask.get('BC')\n      };\n      var transferObj = smask.get('TR');\n      if ((0, _function.isPDFFunction)(transferObj)) {\n        var transferFn = _function.PDFFunction.parse(this.xref, transferObj);\n        var transferMap = new Uint8Array(256);\n        var tmp = new Float32Array(1);\n        for (var i = 0; i < 256; i++) {\n          tmp[0] = i / 255;\n          transferFn(tmp, 0, tmp, 0);\n          transferMap[i] = tmp[0] * 255 | 0;\n        }\n        smaskOptions.transferMap = transferMap;\n      }\n      return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, stateManager.state.clone());\n    },\n    handleTilingType: function handleTilingType(fn, args, resources, pattern, patternDict, operatorList, task) {\n      var _this3 = this;\n\n      var tilingOpList = new OperatorList();\n      var resourcesArray = [patternDict.get('Resources'), resources];\n      var patternResources = _primitives.Dict.merge(this.xref, resourcesArray);\n      return this.getOperatorList({\n        stream: pattern,\n        task: task,\n        resources: patternResources,\n        operatorList: tilingOpList\n      }).then(function () {\n        return (0, _pattern.getTilingPatternIR)({\n          fnArray: tilingOpList.fnArray,\n          argsArray: tilingOpList.argsArray\n        }, patternDict, args);\n      }).then(function (tilingPatternIR) {\n        operatorList.addDependencies(tilingOpList.dependencies);\n        operatorList.addOp(fn, tilingPatternIR);\n      }, function (reason) {\n        if (_this3.options.ignoreErrors) {\n          _this3.handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.unknown });\n          (0, _util.warn)('handleTilingType - ignoring pattern: \"' + reason + '\".');\n          return;\n        }\n        throw reason;\n      });\n    },\n\n    handleSetFont: function PartialEvaluator_handleSetFont(resources, fontArgs, fontRef, operatorList, task, state) {\n      var _this4 = this;\n\n      var fontName;\n      if (fontArgs) {\n        fontArgs = fontArgs.slice();\n        fontName = fontArgs[0].name;\n      }\n      return this.loadFont(fontName, fontRef, resources).then(function (translated) {\n        if (!translated.font.isType3Font) {\n          return translated;\n        }\n        return translated.loadType3Data(_this4, resources, operatorList, task).then(function () {\n          return translated;\n        }).catch(function (reason) {\n          _this4.handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.font });\n          return new TranslatedFont('g_font_error', new _fonts.ErrorFont('Type3 font load error: ' + reason), translated.font);\n        });\n      }).then(function (translated) {\n        state.font = translated.font;\n        translated.send(_this4.handler);\n        return translated.loadedName;\n      });\n    },\n    handleText: function PartialEvaluator_handleText(chars, state) {\n      var _this5 = this;\n\n      var font = state.font;\n      var glyphs = font.charsToGlyphs(chars);\n      var isAddToPathSet = !!(state.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG);\n      if (font.data && (isAddToPathSet || this.options.disableFontFace)) {\n        var buildPath = function buildPath(fontChar) {\n          if (!font.renderer.hasBuiltPath(fontChar)) {\n            var path = font.renderer.getPathJs(fontChar);\n            _this5.handler.send('commonobj', [font.loadedName + '_path_' + fontChar, 'FontPath', path]);\n          }\n        };\n        for (var i = 0, ii = glyphs.length; i < ii; i++) {\n          var glyph = glyphs[i];\n          buildPath(glyph.fontChar);\n          var accent = glyph.accent;\n          if (accent && accent.fontChar) {\n            buildPath(accent.fontChar);\n          }\n        }\n      }\n      return glyphs;\n    },\n    setGState: function PartialEvaluator_setGState(resources, gState, operatorList, task, stateManager) {\n      var _this6 = this;\n\n      var gStateObj = [];\n      var gStateKeys = gState.getKeys();\n      var promise = Promise.resolve();\n\n      var _loop = function _loop() {\n        var key = gStateKeys[i];\n        var value = gState.get(key);\n        switch (key) {\n          case 'Type':\n            break;\n          case 'LW':\n          case 'LC':\n          case 'LJ':\n          case 'ML':\n          case 'D':\n          case 'RI':\n          case 'FL':\n          case 'CA':\n          case 'ca':\n            gStateObj.push([key, value]);\n            break;\n          case 'Font':\n            promise = promise.then(function () {\n              return _this6.handleSetFont(resources, null, value[0], operatorList, task, stateManager.state).then(function (loadedName) {\n                operatorList.addDependency(loadedName);\n                gStateObj.push([key, [loadedName, value[1]]]);\n              });\n            });\n            break;\n          case 'BM':\n            gStateObj.push([key, normalizeBlendMode(value)]);\n            break;\n          case 'SMask':\n            if ((0, _primitives.isName)(value, 'None')) {\n              gStateObj.push([key, false]);\n              break;\n            }\n            if ((0, _primitives.isDict)(value)) {\n              promise = promise.then(function () {\n                return _this6.handleSMask(value, resources, operatorList, task, stateManager);\n              });\n              gStateObj.push([key, true]);\n            } else {\n              (0, _util.warn)('Unsupported SMask type');\n            }\n            break;\n          case 'OP':\n          case 'op':\n          case 'OPM':\n          case 'BG':\n          case 'BG2':\n          case 'UCR':\n          case 'UCR2':\n          case 'TR':\n          case 'TR2':\n          case 'HT':\n          case 'SM':\n          case 'SA':\n          case 'AIS':\n          case 'TK':\n            (0, _util.info)('graphic state operator ' + key);\n            break;\n          default:\n            (0, _util.info)('Unknown graphic state operator ' + key);\n            break;\n        }\n      };\n\n      for (var i = 0, ii = gStateKeys.length; i < ii; i++) {\n        _loop();\n      }\n      return promise.then(function () {\n        if (gStateObj.length > 0) {\n          operatorList.addOp(_util.OPS.setGState, [gStateObj]);\n        }\n      });\n    },\n    loadFont: function PartialEvaluator_loadFont(fontName, font, resources) {\n      var _this7 = this;\n\n      function errorFont() {\n        return Promise.resolve(new TranslatedFont('g_font_error', new _fonts.ErrorFont('Font ' + fontName + ' is not available'), font));\n      }\n      var fontRef,\n          xref = this.xref;\n      if (font) {\n        if (!(0, _primitives.isRef)(font)) {\n          throw new Error('The \"font\" object should be a reference.');\n        }\n        fontRef = font;\n      } else {\n        var fontRes = resources.get('Font');\n        if (fontRes) {\n          fontRef = fontRes.getRaw(fontName);\n        } else {\n          (0, _util.warn)('fontRes not available');\n          return errorFont();\n        }\n      }\n      if (!fontRef) {\n        (0, _util.warn)('fontRef not available');\n        return errorFont();\n      }\n      if (this.fontCache.has(fontRef)) {\n        return this.fontCache.get(fontRef);\n      }\n      font = xref.fetchIfRef(fontRef);\n      if (!(0, _primitives.isDict)(font)) {\n        return errorFont();\n      }\n      if (font.translated) {\n        return font.translated;\n      }\n      var fontCapability = (0, _util.createPromiseCapability)();\n      var preEvaluatedFont = this.preEvaluateFont(font);\n      var descriptor = preEvaluatedFont.descriptor;\n      var fontRefIsRef = (0, _primitives.isRef)(fontRef),\n          fontID;\n      if (fontRefIsRef) {\n        fontID = fontRef.toString();\n      }\n      if ((0, _primitives.isDict)(descriptor)) {\n        if (!descriptor.fontAliases) {\n          descriptor.fontAliases = Object.create(null);\n        }\n        var fontAliases = descriptor.fontAliases;\n        var hash = preEvaluatedFont.hash;\n        if (fontAliases[hash]) {\n          var aliasFontRef = fontAliases[hash].aliasRef;\n          if (fontRefIsRef && aliasFontRef && this.fontCache.has(aliasFontRef)) {\n            this.fontCache.putAlias(fontRef, aliasFontRef);\n            return this.fontCache.get(fontRef);\n          }\n        } else {\n          fontAliases[hash] = { fontID: _fonts.Font.getFontID() };\n        }\n        if (fontRefIsRef) {\n          fontAliases[hash].aliasRef = fontRef;\n        }\n        fontID = fontAliases[hash].fontID;\n      }\n      if (fontRefIsRef) {\n        this.fontCache.put(fontRef, fontCapability.promise);\n      } else {\n        if (!fontID) {\n          fontID = this.idFactory.createObjId();\n        }\n        this.fontCache.put('id_' + fontID, fontCapability.promise);\n      }\n      (0, _util.assert)(fontID, 'The \"fontID\" must be defined.');\n      font.loadedName = 'g_' + this.pdfManager.docId + '_f' + fontID;\n      font.translated = fontCapability.promise;\n      var translatedPromise;\n      try {\n        translatedPromise = this.translateFont(preEvaluatedFont);\n      } catch (e) {\n        translatedPromise = Promise.reject(e);\n      }\n      translatedPromise.then(function (translatedFont) {\n        if (translatedFont.fontType !== undefined) {\n          var xrefFontStats = xref.stats.fontTypes;\n          xrefFontStats[translatedFont.fontType] = true;\n        }\n        fontCapability.resolve(new TranslatedFont(font.loadedName, translatedFont, font));\n      }).catch(function (reason) {\n        _this7.handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.font });\n        try {\n          var descriptor = preEvaluatedFont.descriptor;\n          var fontFile3 = descriptor && descriptor.get('FontFile3');\n          var subtype = fontFile3 && fontFile3.get('Subtype');\n          var fontType = (0, _fonts.getFontType)(preEvaluatedFont.type, subtype && subtype.name);\n          var xrefFontStats = xref.stats.fontTypes;\n          xrefFontStats[fontType] = true;\n        } catch (ex) {}\n        fontCapability.resolve(new TranslatedFont(font.loadedName, new _fonts.ErrorFont(reason instanceof Error ? reason.message : reason), font));\n      });\n      return fontCapability.promise;\n    },\n    buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) {\n      var lastIndex = operatorList.length - 1;\n      if (!args) {\n        args = [];\n      }\n      if (lastIndex < 0 || operatorList.fnArray[lastIndex] !== _util.OPS.constructPath) {\n        operatorList.addOp(_util.OPS.constructPath, [[fn], args]);\n      } else {\n        var opArgs = operatorList.argsArray[lastIndex];\n        opArgs[0].push(fn);\n        Array.prototype.push.apply(opArgs[1], args);\n      }\n    },\n    handleColorN: function PartialEvaluator_handleColorN(operatorList, fn, args, cs, patterns, resources, task) {\n      var patternName = args[args.length - 1];\n      var pattern;\n      if ((0, _primitives.isName)(patternName) && (pattern = patterns.get(patternName.name))) {\n        var dict = (0, _primitives.isStream)(pattern) ? pattern.dict : pattern;\n        var typeNum = dict.get('PatternType');\n        if (typeNum === TILING_PATTERN) {\n          var color = cs.base ? cs.base.getRgb(args, 0) : null;\n          return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task);\n        } else if (typeNum === SHADING_PATTERN) {\n          var shading = dict.get('Shading');\n          var matrix = dict.getArray('Matrix');\n          pattern = _pattern.Pattern.parseShading(shading, matrix, this.xref, resources, this.handler);\n          operatorList.addOp(fn, pattern.getIR());\n          return Promise.resolve();\n        }\n        return Promise.reject(new Error('Unknown PatternType: ' + typeNum));\n      }\n      operatorList.addOp(fn, args);\n      return Promise.resolve();\n    },\n    getOperatorList: function getOperatorList(_ref2) {\n      var _this8 = this;\n\n      var stream = _ref2.stream,\n          task = _ref2.task,\n          resources = _ref2.resources,\n          operatorList = _ref2.operatorList,\n          _ref2$initialState = _ref2.initialState,\n          initialState = _ref2$initialState === undefined ? null : _ref2$initialState;\n\n      resources = resources || _primitives.Dict.empty;\n      initialState = initialState || new EvalState();\n      if (!operatorList) {\n        throw new Error('getOperatorList: missing \"operatorList\" parameter');\n      }\n      var self = this;\n      var xref = this.xref;\n      var imageCache = Object.create(null);\n      var xobjs = resources.get('XObject') || _primitives.Dict.empty;\n      var patterns = resources.get('Pattern') || _primitives.Dict.empty;\n      var stateManager = new StateManager(initialState);\n      var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);\n      var timeSlotManager = new TimeSlotManager();\n      function closePendingRestoreOPS(argument) {\n        for (var i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) {\n          operatorList.addOp(_util.OPS.restore, []);\n        }\n      }\n      return new Promise(function promiseBody(resolve, reject) {\n        var next = function next(promise) {\n          promise.then(function () {\n            try {\n              promiseBody(resolve, reject);\n            } catch (ex) {\n              reject(ex);\n            }\n          }, reject);\n        };\n        task.ensureNotTerminated();\n        timeSlotManager.reset();\n        var stop,\n            operation = {},\n            i,\n            ii,\n            cs;\n        while (!(stop = timeSlotManager.check())) {\n          operation.args = null;\n          if (!preprocessor.read(operation)) {\n            break;\n          }\n          var args = operation.args;\n          var fn = operation.fn;\n          switch (fn | 0) {\n            case _util.OPS.paintXObject:\n              var name = args[0].name;\n              if (!name) {\n                (0, _util.warn)('XObject must be referred to by name.');\n                continue;\n              }\n              if (imageCache[name] !== undefined) {\n                operatorList.addOp(imageCache[name].fn, imageCache[name].args);\n                args = null;\n                continue;\n              }\n              var xobj = xobjs.get(name);\n              if (xobj) {\n                if (!(0, _primitives.isStream)(xobj)) {\n                  throw new _util.FormatError('XObject should be a stream');\n                }\n                var type = xobj.dict.get('Subtype');\n                if (!(0, _primitives.isName)(type)) {\n                  throw new _util.FormatError('XObject should have a Name subtype');\n                }\n                if (type.name === 'Form') {\n                  stateManager.save();\n                  next(self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone()).then(function () {\n                    stateManager.restore();\n                  }));\n                  return;\n                } else if (type.name === 'Image') {\n                  self.buildPaintImageXObject(resources, xobj, false, operatorList, name, imageCache);\n                  args = null;\n                  continue;\n                } else if (type.name === 'PS') {\n                  (0, _util.info)('Ignored XObject subtype PS');\n                  continue;\n                } else {\n                  throw new _util.FormatError('Unhandled XObject subtype ' + type.name);\n                }\n              }\n              break;\n            case _util.OPS.setFont:\n              var fontSize = args[1];\n              next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state).then(function (loadedName) {\n                operatorList.addDependency(loadedName);\n                operatorList.addOp(_util.OPS.setFont, [loadedName, fontSize]);\n              }));\n              return;\n            case _util.OPS.endInlineImage:\n              var cacheKey = args[0].cacheKey;\n              if (cacheKey) {\n                var cacheEntry = imageCache[cacheKey];\n                if (cacheEntry !== undefined) {\n                  operatorList.addOp(cacheEntry.fn, cacheEntry.args);\n                  args = null;\n                  continue;\n                }\n              }\n              self.buildPaintImageXObject(resources, args[0], true, operatorList, cacheKey, imageCache);\n              args = null;\n              continue;\n            case _util.OPS.showText:\n              args[0] = self.handleText(args[0], stateManager.state);\n              break;\n            case _util.OPS.showSpacedText:\n              var arr = args[0];\n              var combinedGlyphs = [];\n              var arrLength = arr.length;\n              var state = stateManager.state;\n              for (i = 0; i < arrLength; ++i) {\n                var arrItem = arr[i];\n                if ((0, _util.isString)(arrItem)) {\n                  Array.prototype.push.apply(combinedGlyphs, self.handleText(arrItem, state));\n                } else if ((0, _util.isNum)(arrItem)) {\n                  combinedGlyphs.push(arrItem);\n                }\n              }\n              args[0] = combinedGlyphs;\n              fn = _util.OPS.showText;\n              break;\n            case _util.OPS.nextLineShowText:\n              operatorList.addOp(_util.OPS.nextLine);\n              args[0] = self.handleText(args[0], stateManager.state);\n              fn = _util.OPS.showText;\n              break;\n            case _util.OPS.nextLineSetSpacingShowText:\n              operatorList.addOp(_util.OPS.nextLine);\n              operatorList.addOp(_util.OPS.setWordSpacing, [args.shift()]);\n              operatorList.addOp(_util.OPS.setCharSpacing, [args.shift()]);\n              args[0] = self.handleText(args[0], stateManager.state);\n              fn = _util.OPS.showText;\n              break;\n            case _util.OPS.setTextRenderingMode:\n              stateManager.state.textRenderingMode = args[0];\n              break;\n            case _util.OPS.setFillColorSpace:\n              stateManager.state.fillColorSpace = _colorspace.ColorSpace.parse(args[0], xref, resources);\n              continue;\n            case _util.OPS.setStrokeColorSpace:\n              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.parse(args[0], xref, resources);\n              continue;\n            case _util.OPS.setFillColor:\n              cs = stateManager.state.fillColorSpace;\n              args = cs.getRgb(args, 0);\n              fn = _util.OPS.setFillRGBColor;\n              break;\n            case _util.OPS.setStrokeColor:\n              cs = stateManager.state.strokeColorSpace;\n              args = cs.getRgb(args, 0);\n              fn = _util.OPS.setStrokeRGBColor;\n              break;\n            case _util.OPS.setFillGray:\n              stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.gray;\n              args = _colorspace.ColorSpace.singletons.gray.getRgb(args, 0);\n              fn = _util.OPS.setFillRGBColor;\n              break;\n            case _util.OPS.setStrokeGray:\n              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.gray;\n              args = _colorspace.ColorSpace.singletons.gray.getRgb(args, 0);\n              fn = _util.OPS.setStrokeRGBColor;\n              break;\n            case _util.OPS.setFillCMYKColor:\n              stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.cmyk;\n              args = _colorspace.ColorSpace.singletons.cmyk.getRgb(args, 0);\n              fn = _util.OPS.setFillRGBColor;\n              break;\n            case _util.OPS.setStrokeCMYKColor:\n              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.cmyk;\n              args = _colorspace.ColorSpace.singletons.cmyk.getRgb(args, 0);\n              fn = _util.OPS.setStrokeRGBColor;\n              break;\n            case _util.OPS.setFillRGBColor:\n              stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.rgb;\n              args = _colorspace.ColorSpace.singletons.rgb.getRgb(args, 0);\n              break;\n            case _util.OPS.setStrokeRGBColor:\n              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.rgb;\n              args = _colorspace.ColorSpace.singletons.rgb.getRgb(args, 0);\n              break;\n            case _util.OPS.setFillColorN:\n              cs = stateManager.state.fillColorSpace;\n              if (cs.name === 'Pattern') {\n                next(self.handleColorN(operatorList, _util.OPS.setFillColorN, args, cs, patterns, resources, task));\n                return;\n              }\n              args = cs.getRgb(args, 0);\n              fn = _util.OPS.setFillRGBColor;\n              break;\n            case _util.OPS.setStrokeColorN:\n              cs = stateManager.state.strokeColorSpace;\n              if (cs.name === 'Pattern') {\n                next(self.handleColorN(operatorList, _util.OPS.setStrokeColorN, args, cs, patterns, resources, task));\n                return;\n              }\n              args = cs.getRgb(args, 0);\n              fn = _util.OPS.setStrokeRGBColor;\n              break;\n            case _util.OPS.shadingFill:\n              var shadingRes = resources.get('Shading');\n              if (!shadingRes) {\n                throw new _util.FormatError('No shading resource found');\n              }\n              var shading = shadingRes.get(args[0].name);\n              if (!shading) {\n                throw new _util.FormatError('No shading object found');\n              }\n              var shadingFill = _pattern.Pattern.parseShading(shading, null, xref, resources, self.handler);\n              var patternIR = shadingFill.getIR();\n              args = [patternIR];\n              fn = _util.OPS.shadingFill;\n              break;\n            case _util.OPS.setGState:\n              var dictName = args[0];\n              var extGState = resources.get('ExtGState');\n              if (!(0, _primitives.isDict)(extGState) || !extGState.has(dictName.name)) {\n                break;\n              }\n              var gState = extGState.get(dictName.name);\n              next(self.setGState(resources, gState, operatorList, task, stateManager));\n              return;\n            case _util.OPS.moveTo:\n            case _util.OPS.lineTo:\n            case _util.OPS.curveTo:\n            case _util.OPS.curveTo2:\n            case _util.OPS.curveTo3:\n            case _util.OPS.closePath:\n              self.buildPath(operatorList, fn, args);\n              continue;\n            case _util.OPS.rectangle:\n              self.buildPath(operatorList, fn, args);\n              continue;\n            case _util.OPS.markPoint:\n            case _util.OPS.markPointProps:\n            case _util.OPS.beginMarkedContent:\n            case _util.OPS.beginMarkedContentProps:\n            case _util.OPS.endMarkedContent:\n            case _util.OPS.beginCompat:\n            case _util.OPS.endCompat:\n              continue;\n            default:\n              if (args !== null) {\n                for (i = 0, ii = args.length; i < ii; i++) {\n                  if (args[i] instanceof _primitives.Dict) {\n                    break;\n                  }\n                }\n                if (i < ii) {\n                  (0, _util.warn)('getOperatorList - ignoring operator: ' + fn);\n                  continue;\n                }\n              }\n          }\n          operatorList.addOp(fn, args);\n        }\n        if (stop) {\n          next(deferred);\n          return;\n        }\n        closePendingRestoreOPS();\n        resolve();\n      }).catch(function (reason) {\n        if (_this8.options.ignoreErrors) {\n          _this8.handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.unknown });\n          (0, _util.warn)('getOperatorList - ignoring errors during task: ' + task.name);\n          closePendingRestoreOPS();\n          return;\n        }\n        throw reason;\n      });\n    },\n    getTextContent: function getTextContent(_ref3) {\n      var _this9 = this;\n\n      var stream = _ref3.stream,\n          task = _ref3.task,\n          resources = _ref3.resources,\n          _ref3$stateManager = _ref3.stateManager,\n          stateManager = _ref3$stateManager === undefined ? null : _ref3$stateManager,\n          _ref3$normalizeWhites = _ref3.normalizeWhitespace,\n          normalizeWhitespace = _ref3$normalizeWhites === undefined ? false : _ref3$normalizeWhites,\n          _ref3$combineTextItem = _ref3.combineTextItems,\n          combineTextItems = _ref3$combineTextItem === undefined ? false : _ref3$combineTextItem,\n          sink = _ref3.sink,\n          _ref3$seenStyles = _ref3.seenStyles,\n          seenStyles = _ref3$seenStyles === undefined ? Object.create(null) : _ref3$seenStyles;\n\n      resources = resources || _primitives.Dict.empty;\n      stateManager = stateManager || new StateManager(new TextState());\n      var WhitespaceRegexp = /\\s/g;\n      var textContent = {\n        items: [],\n        styles: Object.create(null)\n      };\n      var textContentItem = {\n        initialized: false,\n        str: [],\n        width: 0,\n        height: 0,\n        vertical: false,\n        lastAdvanceWidth: 0,\n        lastAdvanceHeight: 0,\n        textAdvanceScale: 0,\n        spaceWidth: 0,\n        fakeSpaceMin: Infinity,\n        fakeMultiSpaceMin: Infinity,\n        fakeMultiSpaceMax: -0,\n        textRunBreakAllowed: false,\n        transform: null,\n        fontName: null\n      };\n      var SPACE_FACTOR = 0.3;\n      var MULTI_SPACE_FACTOR = 1.5;\n      var MULTI_SPACE_FACTOR_MAX = 4;\n      var self = this;\n      var xref = this.xref;\n      var xobjs = null;\n      var skipEmptyXObjs = Object.create(null);\n      var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);\n      var textState;\n      function ensureTextContentItem() {\n        if (textContentItem.initialized) {\n          return textContentItem;\n        }\n        var font = textState.font;\n        if (!(font.loadedName in seenStyles)) {\n          seenStyles[font.loadedName] = true;\n          textContent.styles[font.loadedName] = {\n            fontFamily: font.fallbackName,\n            ascent: font.ascent,\n            descent: font.descent,\n            vertical: font.vertical\n          };\n        }\n        textContentItem.fontName = font.loadedName;\n        var tsm = [textState.fontSize * textState.textHScale, 0, 0, textState.fontSize, 0, textState.textRise];\n        if (font.isType3Font && textState.fontMatrix !== _util.FONT_IDENTITY_MATRIX && textState.fontSize === 1) {\n          var glyphHeight = font.bbox[3] - font.bbox[1];\n          if (glyphHeight > 0) {\n            glyphHeight = glyphHeight * textState.fontMatrix[3];\n            tsm[3] *= glyphHeight;\n          }\n        }\n        var trm = _util.Util.transform(textState.ctm, _util.Util.transform(textState.textMatrix, tsm));\n        textContentItem.transform = trm;\n        if (!font.vertical) {\n          textContentItem.width = 0;\n          textContentItem.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]);\n          textContentItem.vertical = false;\n        } else {\n          textContentItem.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]);\n          textContentItem.height = 0;\n          textContentItem.vertical = true;\n        }\n        var a = textState.textLineMatrix[0];\n        var b = textState.textLineMatrix[1];\n        var scaleLineX = Math.sqrt(a * a + b * b);\n        a = textState.ctm[0];\n        b = textState.ctm[1];\n        var scaleCtmX = Math.sqrt(a * a + b * b);\n        textContentItem.textAdvanceScale = scaleCtmX * scaleLineX;\n        textContentItem.lastAdvanceWidth = 0;\n        textContentItem.lastAdvanceHeight = 0;\n        var spaceWidth = font.spaceWidth / 1000 * textState.fontSize;\n        if (spaceWidth) {\n          textContentItem.spaceWidth = spaceWidth;\n          textContentItem.fakeSpaceMin = spaceWidth * SPACE_FACTOR;\n          textContentItem.fakeMultiSpaceMin = spaceWidth * MULTI_SPACE_FACTOR;\n          textContentItem.fakeMultiSpaceMax = spaceWidth * MULTI_SPACE_FACTOR_MAX;\n          textContentItem.textRunBreakAllowed = !font.isMonospace;\n        } else {\n          textContentItem.spaceWidth = 0;\n          textContentItem.fakeSpaceMin = Infinity;\n          textContentItem.fakeMultiSpaceMin = Infinity;\n          textContentItem.fakeMultiSpaceMax = 0;\n          textContentItem.textRunBreakAllowed = false;\n        }\n        textContentItem.initialized = true;\n        return textContentItem;\n      }\n      function replaceWhitespace(str) {\n        var i = 0,\n            ii = str.length,\n            code;\n        while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7F) {\n          i++;\n        }\n        return i < ii ? str.replace(WhitespaceRegexp, ' ') : str;\n      }\n      function runBidiTransform(textChunk) {\n        var str = textChunk.str.join('');\n        var bidiResult = (0, _bidi.bidi)(str, -1, textChunk.vertical);\n        return {\n          str: normalizeWhitespace ? replaceWhitespace(bidiResult.str) : bidiResult.str,\n          dir: bidiResult.dir,\n          width: textChunk.width,\n          height: textChunk.height,\n          transform: textChunk.transform,\n          fontName: textChunk.fontName\n        };\n      }\n      function handleSetFont(fontName, fontRef) {\n        return self.loadFont(fontName, fontRef, resources).then(function (translated) {\n          textState.font = translated.font;\n          textState.fontMatrix = translated.font.fontMatrix || _util.FONT_IDENTITY_MATRIX;\n        });\n      }\n      function buildTextContentItem(chars) {\n        var font = textState.font;\n        var textChunk = ensureTextContentItem();\n        var width = 0;\n        var height = 0;\n        var glyphs = font.charsToGlyphs(chars);\n        for (var i = 0; i < glyphs.length; i++) {\n          var glyph = glyphs[i];\n          var glyphWidth = null;\n          if (font.vertical && glyph.vmetric) {\n            glyphWidth = glyph.vmetric[0];\n          } else {\n            glyphWidth = glyph.width;\n          }\n          var glyphUnicode = glyph.unicode;\n          var NormalizedUnicodes = (0, _unicode.getNormalizedUnicodes)();\n          if (NormalizedUnicodes[glyphUnicode] !== undefined) {\n            glyphUnicode = NormalizedUnicodes[glyphUnicode];\n          }\n          glyphUnicode = (0, _unicode.reverseIfRtl)(glyphUnicode);\n          var charSpacing = textState.charSpacing;\n          if (glyph.isSpace) {\n            var wordSpacing = textState.wordSpacing;\n            charSpacing += wordSpacing;\n            if (wordSpacing > 0) {\n              addFakeSpaces(wordSpacing, textChunk.str);\n            }\n          }\n          var tx = 0;\n          var ty = 0;\n          if (!font.vertical) {\n            var w0 = glyphWidth * textState.fontMatrix[0];\n            tx = (w0 * textState.fontSize + charSpacing) * textState.textHScale;\n            width += tx;\n          } else {\n            var w1 = glyphWidth * textState.fontMatrix[0];\n            ty = w1 * textState.fontSize + charSpacing;\n            height += ty;\n          }\n          textState.translateTextMatrix(tx, ty);\n          textChunk.str.push(glyphUnicode);\n        }\n        if (!font.vertical) {\n          textChunk.lastAdvanceWidth = width;\n          textChunk.width += width;\n        } else {\n          textChunk.lastAdvanceHeight = height;\n          textChunk.height += Math.abs(height);\n        }\n        return textChunk;\n      }\n      function addFakeSpaces(width, strBuf) {\n        if (width < textContentItem.fakeSpaceMin) {\n          return;\n        }\n        if (width < textContentItem.fakeMultiSpaceMin) {\n          strBuf.push(' ');\n          return;\n        }\n        var fakeSpaces = Math.round(width / textContentItem.spaceWidth);\n        while (fakeSpaces-- > 0) {\n          strBuf.push(' ');\n        }\n      }\n      function flushTextContentItem() {\n        if (!textContentItem.initialized) {\n          return;\n        }\n        textContentItem.width *= textContentItem.textAdvanceScale;\n        textContentItem.height *= textContentItem.textAdvanceScale;\n        textContent.items.push(runBidiTransform(textContentItem));\n        textContentItem.initialized = false;\n        textContentItem.str.length = 0;\n      }\n      function enqueueChunk() {\n        var length = textContent.items.length;\n        if (length > 0) {\n          sink.enqueue(textContent, length);\n          textContent.items = [];\n          textContent.styles = Object.create(null);\n        }\n      }\n      var timeSlotManager = new TimeSlotManager();\n      return new Promise(function promiseBody(resolve, reject) {\n        var next = function next(promise) {\n          enqueueChunk();\n          Promise.all([promise, sink.ready]).then(function () {\n            try {\n              promiseBody(resolve, reject);\n            } catch (ex) {\n              reject(ex);\n            }\n          }, reject);\n        };\n        task.ensureNotTerminated();\n        timeSlotManager.reset();\n        var stop,\n            operation = {},\n            args = [];\n        while (!(stop = timeSlotManager.check())) {\n          args.length = 0;\n          operation.args = args;\n          if (!preprocessor.read(operation)) {\n            break;\n          }\n          textState = stateManager.state;\n          var fn = operation.fn;\n          args = operation.args;\n          var advance, diff;\n          var fontNameArg, fontSizeArg;\n          var isSameTextLine;\n          var items;\n          var offset;\n          var j, jj;\n          var breakTextRun;\n          var name;\n          var xobj;\n          var type;\n          var currentState;\n          var xObjStateManager;\n          var matrix;\n          var dictName;\n          var extGState;\n          var gState;\n          var gStateFont;\n\n          var _ret2 = function () {\n            switch (fn | 0) {\n              case _util.OPS.setFont:\n                fontNameArg = args[0].name;\n                fontSizeArg = args[1];\n\n                if (textState.font && fontNameArg === textState.fontName && fontSizeArg === textState.fontSize) {\n                  break;\n                }\n                flushTextContentItem();\n                textState.fontName = fontNameArg;\n                textState.fontSize = fontSizeArg;\n                next(handleSetFont(fontNameArg, null));\n                return {\n                  v: void 0\n                };\n              case _util.OPS.setTextRise:\n                flushTextContentItem();\n                textState.textRise = args[0];\n                break;\n              case _util.OPS.setHScale:\n                flushTextContentItem();\n                textState.textHScale = args[0] / 100;\n                break;\n              case _util.OPS.setLeading:\n                flushTextContentItem();\n                textState.leading = args[0];\n                break;\n              case _util.OPS.moveText:\n                isSameTextLine = !textState.font ? false : (textState.font.vertical ? args[0] : args[1]) === 0;\n\n                advance = args[0] - args[1];\n                if (combineTextItems && isSameTextLine && textContentItem.initialized && advance > 0 && advance <= textContentItem.fakeMultiSpaceMax) {\n                  textState.translateTextLineMatrix(args[0], args[1]);\n                  textContentItem.width += args[0] - textContentItem.lastAdvanceWidth;\n                  textContentItem.height += args[1] - textContentItem.lastAdvanceHeight;\n                  diff = args[0] - textContentItem.lastAdvanceWidth - (args[1] - textContentItem.lastAdvanceHeight);\n                  addFakeSpaces(diff, textContentItem.str);\n                  break;\n                }\n                flushTextContentItem();\n                textState.translateTextLineMatrix(args[0], args[1]);\n                textState.textMatrix = textState.textLineMatrix.slice();\n                break;\n              case _util.OPS.setLeadingMoveText:\n                flushTextContentItem();\n                textState.leading = -args[1];\n                textState.translateTextLineMatrix(args[0], args[1]);\n                textState.textMatrix = textState.textLineMatrix.slice();\n                break;\n              case _util.OPS.nextLine:\n                flushTextContentItem();\n                textState.carriageReturn();\n                break;\n              case _util.OPS.setTextMatrix:\n                advance = textState.calcTextLineMatrixAdvance(args[0], args[1], args[2], args[3], args[4], args[5]);\n                if (combineTextItems && advance !== null && textContentItem.initialized && advance.value > 0 && advance.value <= textContentItem.fakeMultiSpaceMax) {\n                  textState.translateTextLineMatrix(advance.width, advance.height);\n                  textContentItem.width += advance.width - textContentItem.lastAdvanceWidth;\n                  textContentItem.height += advance.height - textContentItem.lastAdvanceHeight;\n                  diff = advance.width - textContentItem.lastAdvanceWidth - (advance.height - textContentItem.lastAdvanceHeight);\n                  addFakeSpaces(diff, textContentItem.str);\n                  break;\n                }\n                flushTextContentItem();\n                textState.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);\n                textState.setTextLineMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);\n                break;\n              case _util.OPS.setCharSpacing:\n                textState.charSpacing = args[0];\n                break;\n              case _util.OPS.setWordSpacing:\n                textState.wordSpacing = args[0];\n                break;\n              case _util.OPS.beginText:\n                flushTextContentItem();\n                textState.textMatrix = _util.IDENTITY_MATRIX.slice();\n                textState.textLineMatrix = _util.IDENTITY_MATRIX.slice();\n                break;\n              case _util.OPS.showSpacedText:\n                items = args[0];\n\n                for (j = 0, jj = items.length; j < jj; j++) {\n                  if (typeof items[j] === 'string') {\n                    buildTextContentItem(items[j]);\n                  } else if ((0, _util.isNum)(items[j])) {\n                    ensureTextContentItem();\n                    advance = items[j] * textState.fontSize / 1000;\n                    breakTextRun = false;\n\n                    if (textState.font.vertical) {\n                      offset = advance;\n                      textState.translateTextMatrix(0, offset);\n                      breakTextRun = textContentItem.textRunBreakAllowed && advance > textContentItem.fakeMultiSpaceMax;\n                      if (!breakTextRun) {\n                        textContentItem.height += offset;\n                      }\n                    } else {\n                      advance = -advance;\n                      offset = advance * textState.textHScale;\n                      textState.translateTextMatrix(offset, 0);\n                      breakTextRun = textContentItem.textRunBreakAllowed && advance > textContentItem.fakeMultiSpaceMax;\n                      if (!breakTextRun) {\n                        textContentItem.width += offset;\n                      }\n                    }\n                    if (breakTextRun) {\n                      flushTextContentItem();\n                    } else if (advance > 0) {\n                      addFakeSpaces(advance, textContentItem.str);\n                    }\n                  }\n                }\n                break;\n              case _util.OPS.showText:\n                buildTextContentItem(args[0]);\n                break;\n              case _util.OPS.nextLineShowText:\n                flushTextContentItem();\n                textState.carriageReturn();\n                buildTextContentItem(args[0]);\n                break;\n              case _util.OPS.nextLineSetSpacingShowText:\n                flushTextContentItem();\n                textState.wordSpacing = args[0];\n                textState.charSpacing = args[1];\n                textState.carriageReturn();\n                buildTextContentItem(args[2]);\n                break;\n              case _util.OPS.paintXObject:\n                flushTextContentItem();\n                if (!xobjs) {\n                  xobjs = resources.get('XObject') || _primitives.Dict.empty;\n                }\n                name = args[0].name;\n\n                if (name in skipEmptyXObjs) {\n                  break;\n                }\n                xobj = xobjs.get(name);\n\n                if (!xobj) {\n                  break;\n                }\n                if (!(0, _primitives.isStream)(xobj)) {\n                  throw new _util.FormatError('XObject should be a stream');\n                }\n                type = xobj.dict.get('Subtype');\n\n                if (!(0, _primitives.isName)(type)) {\n                  throw new _util.FormatError('XObject should have a Name subtype');\n                }\n                if (type.name !== 'Form') {\n                  skipEmptyXObjs[name] = true;\n                  break;\n                }\n                currentState = stateManager.state.clone();\n                xObjStateManager = new StateManager(currentState);\n                matrix = xobj.dict.getArray('Matrix');\n\n                if ((0, _util.isArray)(matrix) && matrix.length === 6) {\n                  xObjStateManager.transform(matrix);\n                }\n                enqueueChunk();\n                var sinkWrapper = {\n                  enqueueInvoked: false,\n                  enqueue: function enqueue(chunk, size) {\n                    this.enqueueInvoked = true;\n                    sink.enqueue(chunk, size);\n                  },\n\n                  get desiredSize() {\n                    return sink.desiredSize;\n                  },\n                  get ready() {\n                    return sink.ready;\n                  }\n                };\n                next(self.getTextContent({\n                  stream: xobj,\n                  task: task,\n                  resources: xobj.dict.get('Resources') || resources,\n                  stateManager: xObjStateManager,\n                  normalizeWhitespace: normalizeWhitespace,\n                  combineTextItems: combineTextItems,\n                  sink: sinkWrapper,\n                  seenStyles: seenStyles\n                }).then(function () {\n                  if (!sinkWrapper.enqueueInvoked) {\n                    skipEmptyXObjs[name] = true;\n                  }\n                }));\n                return {\n                  v: void 0\n                };\n              case _util.OPS.setGState:\n                flushTextContentItem();\n                dictName = args[0];\n                extGState = resources.get('ExtGState');\n\n                if (!(0, _primitives.isDict)(extGState) || !(0, _primitives.isName)(dictName)) {\n                  break;\n                }\n                gState = extGState.get(dictName.name);\n\n                if (!(0, _primitives.isDict)(gState)) {\n                  break;\n                }\n                gStateFont = gState.get('Font');\n\n                if (gStateFont) {\n                  textState.fontName = null;\n                  textState.fontSize = gStateFont[1];\n                  next(handleSetFont(null, gStateFont[0]));\n                  return {\n                    v: void 0\n                  };\n                }\n                break;\n            }\n          }();\n\n          if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === \"object\") return _ret2.v;\n          if (textContent.items.length >= sink.desiredSize) {\n            stop = true;\n            break;\n          }\n        }\n        if (stop) {\n          next(deferred);\n          return;\n        }\n        flushTextContentItem();\n        enqueueChunk();\n        resolve();\n      }).catch(function (reason) {\n        if (reason instanceof _util.AbortException) {\n          return;\n        }\n        if (_this9.options.ignoreErrors) {\n          (0, _util.warn)('getTextContent - ignoring errors during task: ' + task.name);\n          flushTextContentItem();\n          enqueueChunk();\n          return;\n        }\n        throw reason;\n      });\n    },\n\n    extractDataStructures: function PartialEvaluator_extractDataStructures(dict, baseDict, properties) {\n      var _this10 = this;\n\n      var xref = this.xref;\n      var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode');\n      var toUnicodePromise = toUnicode ? this.readToUnicode(toUnicode) : Promise.resolve(undefined);\n      if (properties.composite) {\n        var cidSystemInfo = dict.get('CIDSystemInfo');\n        if ((0, _primitives.isDict)(cidSystemInfo)) {\n          properties.cidSystemInfo = {\n            registry: cidSystemInfo.get('Registry'),\n            ordering: cidSystemInfo.get('Ordering'),\n            supplement: cidSystemInfo.get('Supplement')\n          };\n        }\n        var cidToGidMap = dict.get('CIDToGIDMap');\n        if ((0, _primitives.isStream)(cidToGidMap)) {\n          properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);\n        }\n      }\n      var differences = [];\n      var baseEncodingName = null;\n      var encoding;\n      if (dict.has('Encoding')) {\n        encoding = dict.get('Encoding');\n        if ((0, _primitives.isDict)(encoding)) {\n          baseEncodingName = encoding.get('BaseEncoding');\n          baseEncodingName = (0, _primitives.isName)(baseEncodingName) ? baseEncodingName.name : null;\n          if (encoding.has('Differences')) {\n            var diffEncoding = encoding.get('Differences');\n            var index = 0;\n            for (var j = 0, jj = diffEncoding.length; j < jj; j++) {\n              var data = xref.fetchIfRef(diffEncoding[j]);\n              if ((0, _util.isNum)(data)) {\n                index = data;\n              } else if ((0, _primitives.isName)(data)) {\n                differences[index++] = data.name;\n              } else {\n                throw new _util.FormatError('Invalid entry in \\'Differences\\' array: ' + data);\n              }\n            }\n          }\n        } else if ((0, _primitives.isName)(encoding)) {\n          baseEncodingName = encoding.name;\n        } else {\n          throw new _util.FormatError('Encoding is not a Name nor a Dict');\n        }\n        if (baseEncodingName !== 'MacRomanEncoding' && baseEncodingName !== 'MacExpertEncoding' && baseEncodingName !== 'WinAnsiEncoding') {\n          baseEncodingName = null;\n        }\n      }\n      if (baseEncodingName) {\n        properties.defaultEncoding = (0, _encodings.getEncoding)(baseEncodingName).slice();\n      } else {\n        var isSymbolicFont = !!(properties.flags & _fonts.FontFlags.Symbolic);\n        var isNonsymbolicFont = !!(properties.flags & _fonts.FontFlags.Nonsymbolic);\n        encoding = _encodings.StandardEncoding;\n        if (properties.type === 'TrueType' && !isNonsymbolicFont) {\n          encoding = _encodings.WinAnsiEncoding;\n        }\n        if (isSymbolicFont) {\n          encoding = _encodings.MacRomanEncoding;\n          if (!properties.file) {\n            if (/Symbol/i.test(properties.name)) {\n              encoding = _encodings.SymbolSetEncoding;\n            } else if (/Dingbats/i.test(properties.name)) {\n              encoding = _encodings.ZapfDingbatsEncoding;\n            }\n          }\n        }\n        properties.defaultEncoding = encoding;\n      }\n      properties.differences = differences;\n      properties.baseEncodingName = baseEncodingName;\n      properties.hasEncoding = !!baseEncodingName || differences.length > 0;\n      properties.dict = dict;\n      return toUnicodePromise.then(function (toUnicode) {\n        properties.toUnicode = toUnicode;\n        return _this10.buildToUnicode(properties);\n      }).then(function (toUnicode) {\n        properties.toUnicode = toUnicode;\n        return properties;\n      });\n    },\n    buildToUnicode: function PartialEvaluator_buildToUnicode(properties) {\n      properties.hasIncludedToUnicodeMap = !!properties.toUnicode && properties.toUnicode.length > 0;\n      if (properties.hasIncludedToUnicodeMap) {\n        return Promise.resolve(properties.toUnicode);\n      }\n      var toUnicode, charcode, glyphName;\n      if (!properties.composite) {\n        toUnicode = [];\n        var encoding = properties.defaultEncoding.slice();\n        var baseEncodingName = properties.baseEncodingName;\n        var differences = properties.differences;\n        for (charcode in differences) {\n          glyphName = differences[charcode];\n          if (glyphName === '.notdef') {\n            continue;\n          }\n          encoding[charcode] = glyphName;\n        }\n        var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n        for (charcode in encoding) {\n          glyphName = encoding[charcode];\n          if (glyphName === '') {\n            continue;\n          } else if (glyphsUnicodeMap[glyphName] === undefined) {\n            var code = 0;\n            switch (glyphName[0]) {\n              case 'G':\n                if (glyphName.length === 3) {\n                  code = parseInt(glyphName.substr(1), 16);\n                }\n                break;\n              case 'g':\n                if (glyphName.length === 5) {\n                  code = parseInt(glyphName.substr(1), 16);\n                }\n                break;\n              case 'C':\n              case 'c':\n                if (glyphName.length >= 3) {\n                  code = +glyphName.substr(1);\n                }\n                break;\n              default:\n                var unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);\n                if (unicode !== -1) {\n                  code = unicode;\n                }\n            }\n            if (code) {\n              if (baseEncodingName && code === +charcode) {\n                var baseEncoding = (0, _encodings.getEncoding)(baseEncodingName);\n                if (baseEncoding && (glyphName = baseEncoding[charcode])) {\n                  toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]);\n                  continue;\n                }\n              }\n              toUnicode[charcode] = String.fromCharCode(code);\n            }\n            continue;\n          }\n          toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]);\n        }\n        return Promise.resolve(new _fonts.ToUnicodeMap(toUnicode));\n      }\n      if (properties.composite && (properties.cMap.builtInCMap && !(properties.cMap instanceof _cmap.IdentityCMap) || properties.cidSystemInfo.registry === 'Adobe' && (properties.cidSystemInfo.ordering === 'GB1' || properties.cidSystemInfo.ordering === 'CNS1' || properties.cidSystemInfo.ordering === 'Japan1' || properties.cidSystemInfo.ordering === 'Korea1'))) {\n        var registry = properties.cidSystemInfo.registry;\n        var ordering = properties.cidSystemInfo.ordering;\n        var ucs2CMapName = _primitives.Name.get(registry + '-' + ordering + '-UCS2');\n        return _cmap.CMapFactory.create({\n          encoding: ucs2CMapName,\n          fetchBuiltInCMap: this.fetchBuiltInCMap,\n          useCMap: null\n        }).then(function (ucs2CMap) {\n          var cMap = properties.cMap;\n          toUnicode = [];\n          cMap.forEach(function (charcode, cid) {\n            if (cid > 0xffff) {\n              throw new _util.FormatError('Max size of CID is 65,535');\n            }\n            var ucs2 = ucs2CMap.lookup(cid);\n            if (ucs2) {\n              toUnicode[charcode] = String.fromCharCode((ucs2.charCodeAt(0) << 8) + ucs2.charCodeAt(1));\n            }\n          });\n          return new _fonts.ToUnicodeMap(toUnicode);\n        });\n      }\n      return Promise.resolve(new _fonts.IdentityToUnicodeMap(properties.firstChar, properties.lastChar));\n    },\n    readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) {\n      var cmapObj = toUnicode;\n      if ((0, _primitives.isName)(cmapObj)) {\n        return _cmap.CMapFactory.create({\n          encoding: cmapObj,\n          fetchBuiltInCMap: this.fetchBuiltInCMap,\n          useCMap: null\n        }).then(function (cmap) {\n          if (cmap instanceof _cmap.IdentityCMap) {\n            return new _fonts.IdentityToUnicodeMap(0, 0xFFFF);\n          }\n          return new _fonts.ToUnicodeMap(cmap.getMap());\n        });\n      } else if ((0, _primitives.isStream)(cmapObj)) {\n        return _cmap.CMapFactory.create({\n          encoding: cmapObj,\n          fetchBuiltInCMap: this.fetchBuiltInCMap,\n          useCMap: null\n        }).then(function (cmap) {\n          if (cmap instanceof _cmap.IdentityCMap) {\n            return new _fonts.IdentityToUnicodeMap(0, 0xFFFF);\n          }\n          var map = new Array(cmap.length);\n          cmap.forEach(function (charCode, token) {\n            var str = [];\n            for (var k = 0; k < token.length; k += 2) {\n              var w1 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);\n              if ((w1 & 0xF800) !== 0xD800) {\n                str.push(w1);\n                continue;\n              }\n              k += 2;\n              var w2 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);\n              str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000);\n            }\n            map[charCode] = String.fromCharCode.apply(String, str);\n          });\n          return new _fonts.ToUnicodeMap(map);\n        });\n      }\n      return Promise.resolve(null);\n    },\n    readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) {\n      var glyphsData = cidToGidStream.getBytes();\n      var result = [];\n      for (var j = 0, jj = glyphsData.length; j < jj; j++) {\n        var glyphID = glyphsData[j++] << 8 | glyphsData[j];\n        if (glyphID === 0) {\n          continue;\n        }\n        var code = j >> 1;\n        result[code] = glyphID;\n      }\n      return result;\n    },\n    extractWidths: function PartialEvaluator_extractWidths(dict, descriptor, properties) {\n      var xref = this.xref;\n      var glyphsWidths = [];\n      var defaultWidth = 0;\n      var glyphsVMetrics = [];\n      var defaultVMetrics;\n      var i, ii, j, jj, start, code, widths;\n      if (properties.composite) {\n        defaultWidth = dict.get('DW') || 1000;\n        widths = dict.get('W');\n        if (widths) {\n          for (i = 0, ii = widths.length; i < ii; i++) {\n            start = xref.fetchIfRef(widths[i++]);\n            code = xref.fetchIfRef(widths[i]);\n            if ((0, _util.isArray)(code)) {\n              for (j = 0, jj = code.length; j < jj; j++) {\n                glyphsWidths[start++] = xref.fetchIfRef(code[j]);\n              }\n            } else {\n              var width = xref.fetchIfRef(widths[++i]);\n              for (j = start; j <= code; j++) {\n                glyphsWidths[j] = width;\n              }\n            }\n          }\n        }\n        if (properties.vertical) {\n          var vmetrics = dict.getArray('DW2') || [880, -1000];\n          defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]];\n          vmetrics = dict.get('W2');\n          if (vmetrics) {\n            for (i = 0, ii = vmetrics.length; i < ii; i++) {\n              start = xref.fetchIfRef(vmetrics[i++]);\n              code = xref.fetchIfRef(vmetrics[i]);\n              if ((0, _util.isArray)(code)) {\n                for (j = 0, jj = code.length; j < jj; j++) {\n                  glyphsVMetrics[start++] = [xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j])];\n                }\n              } else {\n                var vmetric = [xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i])];\n                for (j = start; j <= code; j++) {\n                  glyphsVMetrics[j] = vmetric;\n                }\n              }\n            }\n          }\n        }\n      } else {\n        var firstChar = properties.firstChar;\n        widths = dict.get('Widths');\n        if (widths) {\n          j = firstChar;\n          for (i = 0, ii = widths.length; i < ii; i++) {\n            glyphsWidths[j++] = xref.fetchIfRef(widths[i]);\n          }\n          defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0;\n        } else {\n          var baseFontName = dict.get('BaseFont');\n          if ((0, _primitives.isName)(baseFontName)) {\n            var metrics = this.getBaseFontMetrics(baseFontName.name);\n            glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties);\n            defaultWidth = metrics.defaultWidth;\n          }\n        }\n      }\n      var isMonospace = true;\n      var firstWidth = defaultWidth;\n      for (var glyph in glyphsWidths) {\n        var glyphWidth = glyphsWidths[glyph];\n        if (!glyphWidth) {\n          continue;\n        }\n        if (!firstWidth) {\n          firstWidth = glyphWidth;\n          continue;\n        }\n        if (firstWidth !== glyphWidth) {\n          isMonospace = false;\n          break;\n        }\n      }\n      if (isMonospace) {\n        properties.flags |= _fonts.FontFlags.FixedPitch;\n      }\n      properties.defaultWidth = defaultWidth;\n      properties.widths = glyphsWidths;\n      properties.defaultVMetrics = defaultVMetrics;\n      properties.vmetrics = glyphsVMetrics;\n    },\n    isSerifFont: function PartialEvaluator_isSerifFont(baseFontName) {\n      var fontNameWoStyle = baseFontName.split('-')[0];\n      return fontNameWoStyle in (0, _standard_fonts.getSerifFonts)() || fontNameWoStyle.search(/serif/gi) !== -1;\n    },\n    getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) {\n      var defaultWidth = 0;\n      var widths = [];\n      var monospace = false;\n      var stdFontMap = (0, _standard_fonts.getStdFontMap)();\n      var lookupName = stdFontMap[name] || name;\n      var Metrics = (0, _metrics.getMetrics)();\n      if (!(lookupName in Metrics)) {\n        if (this.isSerifFont(name)) {\n          lookupName = 'Times-Roman';\n        } else {\n          lookupName = 'Helvetica';\n        }\n      }\n      var glyphWidths = Metrics[lookupName];\n      if ((0, _util.isNum)(glyphWidths)) {\n        defaultWidth = glyphWidths;\n        monospace = true;\n      } else {\n        widths = glyphWidths();\n      }\n      return {\n        defaultWidth: defaultWidth,\n        monospace: monospace,\n        widths: widths\n      };\n    },\n    buildCharCodeToWidth: function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName, properties) {\n      var widths = Object.create(null);\n      var differences = properties.differences;\n      var encoding = properties.defaultEncoding;\n      for (var charCode = 0; charCode < 256; charCode++) {\n        if (charCode in differences && widthsByGlyphName[differences[charCode]]) {\n          widths[charCode] = widthsByGlyphName[differences[charCode]];\n          continue;\n        }\n        if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) {\n          widths[charCode] = widthsByGlyphName[encoding[charCode]];\n          continue;\n        }\n      }\n      return widths;\n    },\n    preEvaluateFont: function PartialEvaluator_preEvaluateFont(dict) {\n      var baseDict = dict;\n      var type = dict.get('Subtype');\n      if (!(0, _primitives.isName)(type)) {\n        throw new _util.FormatError('invalid font Subtype');\n      }\n      var composite = false;\n      var uint8array;\n      if (type.name === 'Type0') {\n        var df = dict.get('DescendantFonts');\n        if (!df) {\n          throw new _util.FormatError('Descendant fonts are not specified');\n        }\n        dict = (0, _util.isArray)(df) ? this.xref.fetchIfRef(df[0]) : df;\n        type = dict.get('Subtype');\n        if (!(0, _primitives.isName)(type)) {\n          throw new _util.FormatError('invalid font Subtype');\n        }\n        composite = true;\n      }\n      var descriptor = dict.get('FontDescriptor');\n      if (descriptor) {\n        var hash = new _murmurhash.MurmurHash3_64();\n        var encoding = baseDict.getRaw('Encoding');\n        if ((0, _primitives.isName)(encoding)) {\n          hash.update(encoding.name);\n        } else if ((0, _primitives.isRef)(encoding)) {\n          hash.update(encoding.toString());\n        } else if ((0, _primitives.isDict)(encoding)) {\n          var keys = encoding.getKeys();\n          for (var i = 0, ii = keys.length; i < ii; i++) {\n            var entry = encoding.getRaw(keys[i]);\n            if ((0, _primitives.isName)(entry)) {\n              hash.update(entry.name);\n            } else if ((0, _primitives.isRef)(entry)) {\n              hash.update(entry.toString());\n            } else if ((0, _util.isArray)(entry)) {\n              var diffLength = entry.length,\n                  diffBuf = new Array(diffLength);\n              for (var j = 0; j < diffLength; j++) {\n                var diffEntry = entry[j];\n                if ((0, _primitives.isName)(diffEntry)) {\n                  diffBuf[j] = diffEntry.name;\n                } else if ((0, _util.isNum)(diffEntry) || (0, _primitives.isRef)(diffEntry)) {\n                  diffBuf[j] = diffEntry.toString();\n                }\n              }\n              hash.update(diffBuf.join());\n            }\n          }\n        }\n        var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode');\n        if ((0, _primitives.isStream)(toUnicode)) {\n          var stream = toUnicode.str || toUnicode;\n          uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new Uint8Array(stream.bytes.buffer, stream.start, stream.end - stream.start);\n          hash.update(uint8array);\n        } else if ((0, _primitives.isName)(toUnicode)) {\n          hash.update(toUnicode.name);\n        }\n        var widths = dict.get('Widths') || baseDict.get('Widths');\n        if (widths) {\n          uint8array = new Uint8Array(new Uint32Array(widths).buffer);\n          hash.update(uint8array);\n        }\n      }\n      return {\n        descriptor: descriptor,\n        dict: dict,\n        baseDict: baseDict,\n        composite: composite,\n        type: type.name,\n        hash: hash ? hash.hexdigest() : ''\n      };\n    },\n    translateFont: function PartialEvaluator_translateFont(preEvaluatedFont) {\n      var _this11 = this;\n\n      var baseDict = preEvaluatedFont.baseDict;\n      var dict = preEvaluatedFont.dict;\n      var composite = preEvaluatedFont.composite;\n      var descriptor = preEvaluatedFont.descriptor;\n      var type = preEvaluatedFont.type;\n      var maxCharIndex = composite ? 0xFFFF : 0xFF;\n      var properties;\n      if (!descriptor) {\n        if (type === 'Type3') {\n          descriptor = new _primitives.Dict(null);\n          descriptor.set('FontName', _primitives.Name.get(type));\n          descriptor.set('FontBBox', dict.getArray('FontBBox'));\n        } else {\n          var baseFontName = dict.get('BaseFont');\n          if (!(0, _primitives.isName)(baseFontName)) {\n            throw new _util.FormatError('Base font is not specified');\n          }\n          baseFontName = baseFontName.name.replace(/[,_]/g, '-');\n          var metrics = this.getBaseFontMetrics(baseFontName);\n          var fontNameWoStyle = baseFontName.split('-')[0];\n          var flags = (this.isSerifFont(fontNameWoStyle) ? _fonts.FontFlags.Serif : 0) | (metrics.monospace ? _fonts.FontFlags.FixedPitch : 0) | ((0, _standard_fonts.getSymbolsFonts)()[fontNameWoStyle] ? _fonts.FontFlags.Symbolic : _fonts.FontFlags.Nonsymbolic);\n          properties = {\n            type: type,\n            name: baseFontName,\n            widths: metrics.widths,\n            defaultWidth: metrics.defaultWidth,\n            flags: flags,\n            firstChar: 0,\n            lastChar: maxCharIndex\n          };\n          return this.extractDataStructures(dict, dict, properties).then(function (properties) {\n            properties.widths = _this11.buildCharCodeToWidth(metrics.widths, properties);\n            return new _fonts.Font(baseFontName, null, properties);\n          });\n        }\n      }\n      var firstChar = dict.get('FirstChar') || 0;\n      var lastChar = dict.get('LastChar') || maxCharIndex;\n      var fontName = descriptor.get('FontName');\n      var baseFont = dict.get('BaseFont');\n      if ((0, _util.isString)(fontName)) {\n        fontName = _primitives.Name.get(fontName);\n      }\n      if ((0, _util.isString)(baseFont)) {\n        baseFont = _primitives.Name.get(baseFont);\n      }\n      if (type !== 'Type3') {\n        var fontNameStr = fontName && fontName.name;\n        var baseFontStr = baseFont && baseFont.name;\n        if (fontNameStr !== baseFontStr) {\n          (0, _util.info)('The FontDescriptor\\'s FontName is \"' + fontNameStr + '\" but should be the same as the Font\\'s BaseFont \"' + baseFontStr + '\"');\n          if (fontNameStr && baseFontStr && baseFontStr.indexOf(fontNameStr) === 0) {\n            fontName = baseFont;\n          }\n        }\n      }\n      fontName = fontName || baseFont;\n      if (!(0, _primitives.isName)(fontName)) {\n        throw new _util.FormatError('invalid font name');\n      }\n      var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');\n      if (fontFile) {\n        if (fontFile.dict) {\n          var subtype = fontFile.dict.get('Subtype');\n          if (subtype) {\n            subtype = subtype.name;\n          }\n          var length1 = fontFile.dict.get('Length1');\n          var length2 = fontFile.dict.get('Length2');\n          var length3 = fontFile.dict.get('Length3');\n        }\n      }\n      properties = {\n        type: type,\n        name: fontName.name,\n        subtype: subtype,\n        file: fontFile,\n        length1: length1,\n        length2: length2,\n        length3: length3,\n        loadedName: baseDict.loadedName,\n        composite: composite,\n        wideChars: composite,\n        fixedPitch: false,\n        fontMatrix: dict.getArray('FontMatrix') || _util.FONT_IDENTITY_MATRIX,\n        firstChar: firstChar || 0,\n        lastChar: lastChar || maxCharIndex,\n        bbox: descriptor.getArray('FontBBox'),\n        ascent: descriptor.get('Ascent'),\n        descent: descriptor.get('Descent'),\n        xHeight: descriptor.get('XHeight'),\n        capHeight: descriptor.get('CapHeight'),\n        flags: descriptor.get('Flags'),\n        italicAngle: descriptor.get('ItalicAngle'),\n        isType3Font: false\n      };\n      var cMapPromise;\n      if (composite) {\n        var cidEncoding = baseDict.get('Encoding');\n        if ((0, _primitives.isName)(cidEncoding)) {\n          properties.cidEncoding = cidEncoding.name;\n        }\n        cMapPromise = _cmap.CMapFactory.create({\n          encoding: cidEncoding,\n          fetchBuiltInCMap: this.fetchBuiltInCMap,\n          useCMap: null\n        }).then(function (cMap) {\n          properties.cMap = cMap;\n          properties.vertical = properties.cMap.vertical;\n        });\n      } else {\n        cMapPromise = Promise.resolve(undefined);\n      }\n      return cMapPromise.then(function () {\n        return _this11.extractDataStructures(dict, baseDict, properties);\n      }).then(function (properties) {\n        _this11.extractWidths(dict, descriptor, properties);\n        if (type === 'Type3') {\n          properties.isType3Font = true;\n        }\n        return new _fonts.Font(fontName.name, fontFile, properties);\n      });\n    }\n  };\n  return PartialEvaluator;\n}();\nvar TranslatedFont = function TranslatedFontClosure() {\n  function TranslatedFont(loadedName, font, dict) {\n    this.loadedName = loadedName;\n    this.font = font;\n    this.dict = dict;\n    this.type3Loaded = null;\n    this.sent = false;\n  }\n  TranslatedFont.prototype = {\n    send: function send(handler) {\n      if (this.sent) {\n        return;\n      }\n      var fontData = this.font.exportData();\n      handler.send('commonobj', [this.loadedName, 'Font', fontData]);\n      this.sent = true;\n    },\n    loadType3Data: function loadType3Data(evaluator, resources, parentOperatorList, task) {\n      if (!this.font.isType3Font) {\n        throw new Error('Must be a Type3 font.');\n      }\n      if (this.type3Loaded) {\n        return this.type3Loaded;\n      }\n      var type3Options = Object.create(evaluator.options);\n      type3Options.ignoreErrors = false;\n      var type3Evaluator = evaluator.clone(type3Options);\n      var translatedFont = this.font;\n      var loadCharProcsPromise = Promise.resolve();\n      var charProcs = this.dict.get('CharProcs');\n      var fontResources = this.dict.get('Resources') || resources;\n      var charProcKeys = charProcs.getKeys();\n      var charProcOperatorList = Object.create(null);\n\n      var _loop2 = function _loop2() {\n        var key = charProcKeys[i];\n        loadCharProcsPromise = loadCharProcsPromise.then(function () {\n          var glyphStream = charProcs.get(key);\n          var operatorList = new OperatorList();\n          return type3Evaluator.getOperatorList({\n            stream: glyphStream,\n            task: task,\n            resources: fontResources,\n            operatorList: operatorList\n          }).then(function () {\n            charProcOperatorList[key] = operatorList.getIR();\n            parentOperatorList.addDependencies(operatorList.dependencies);\n          }).catch(function (reason) {\n            (0, _util.warn)('Type3 font resource \"' + key + '\" is not available.');\n            var operatorList = new OperatorList();\n            charProcOperatorList[key] = operatorList.getIR();\n          });\n        });\n      };\n\n      for (var i = 0, n = charProcKeys.length; i < n; ++i) {\n        _loop2();\n      }\n      this.type3Loaded = loadCharProcsPromise.then(function () {\n        translatedFont.charProcOperatorList = charProcOperatorList;\n      });\n      return this.type3Loaded;\n    }\n  };\n  return TranslatedFont;\n}();\nvar OperatorList = function OperatorListClosure() {\n  var CHUNK_SIZE = 1000;\n  var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5;\n  function getTransfers(queue) {\n    var transfers = [];\n    var fnArray = queue.fnArray,\n        argsArray = queue.argsArray;\n    for (var i = 0, ii = queue.length; i < ii; i++) {\n      switch (fnArray[i]) {\n        case _util.OPS.paintInlineImageXObject:\n        case _util.OPS.paintInlineImageXObjectGroup:\n        case _util.OPS.paintImageMaskXObject:\n          var arg = argsArray[i][0];\n          if (!arg.cached) {\n            transfers.push(arg.data.buffer);\n          }\n          break;\n      }\n    }\n    return transfers;\n  }\n  function OperatorList(intent, messageHandler, pageIndex) {\n    this.messageHandler = messageHandler;\n    this.fnArray = [];\n    this.argsArray = [];\n    this.dependencies = Object.create(null);\n    this._totalLength = 0;\n    this.pageIndex = pageIndex;\n    this.intent = intent;\n  }\n  OperatorList.prototype = {\n    get length() {\n      return this.argsArray.length;\n    },\n    get totalLength() {\n      return this._totalLength + this.length;\n    },\n    addOp: function addOp(fn, args) {\n      this.fnArray.push(fn);\n      this.argsArray.push(args);\n      if (this.messageHandler) {\n        if (this.fnArray.length >= CHUNK_SIZE) {\n          this.flush();\n        } else if (this.fnArray.length >= CHUNK_SIZE_ABOUT && (fn === _util.OPS.restore || fn === _util.OPS.endText)) {\n          this.flush();\n        }\n      }\n    },\n    addDependency: function addDependency(dependency) {\n      if (dependency in this.dependencies) {\n        return;\n      }\n      this.dependencies[dependency] = true;\n      this.addOp(_util.OPS.dependency, [dependency]);\n    },\n    addDependencies: function addDependencies(dependencies) {\n      for (var key in dependencies) {\n        this.addDependency(key);\n      }\n    },\n    addOpList: function addOpList(opList) {\n      _util.Util.extendObj(this.dependencies, opList.dependencies);\n      for (var i = 0, ii = opList.length; i < ii; i++) {\n        this.addOp(opList.fnArray[i], opList.argsArray[i]);\n      }\n    },\n    getIR: function getIR() {\n      return {\n        fnArray: this.fnArray,\n        argsArray: this.argsArray,\n        length: this.length\n      };\n    },\n    flush: function flush(lastChunk) {\n      if (this.intent !== 'oplist') {\n        new QueueOptimizer().optimize(this);\n      }\n      var transfers = getTransfers(this);\n      var length = this.length;\n      this._totalLength += length;\n      this.messageHandler.send('RenderPageChunk', {\n        operatorList: {\n          fnArray: this.fnArray,\n          argsArray: this.argsArray,\n          lastChunk: lastChunk,\n          length: length\n        },\n        pageIndex: this.pageIndex,\n        intent: this.intent\n      }, transfers);\n      this.dependencies = Object.create(null);\n      this.fnArray.length = 0;\n      this.argsArray.length = 0;\n    }\n  };\n  return OperatorList;\n}();\nvar StateManager = function StateManagerClosure() {\n  function StateManager(initialState) {\n    this.state = initialState;\n    this.stateStack = [];\n  }\n  StateManager.prototype = {\n    save: function save() {\n      var old = this.state;\n      this.stateStack.push(this.state);\n      this.state = old.clone();\n    },\n    restore: function restore() {\n      var prev = this.stateStack.pop();\n      if (prev) {\n        this.state = prev;\n      }\n    },\n    transform: function transform(args) {\n      this.state.ctm = _util.Util.transform(this.state.ctm, args);\n    }\n  };\n  return StateManager;\n}();\nvar TextState = function TextStateClosure() {\n  function TextState() {\n    this.ctm = new Float32Array(_util.IDENTITY_MATRIX);\n    this.fontName = null;\n    this.fontSize = 0;\n    this.font = null;\n    this.fontMatrix = _util.FONT_IDENTITY_MATRIX;\n    this.textMatrix = _util.IDENTITY_MATRIX.slice();\n    this.textLineMatrix = _util.IDENTITY_MATRIX.slice();\n    this.charSpacing = 0;\n    this.wordSpacing = 0;\n    this.leading = 0;\n    this.textHScale = 1;\n    this.textRise = 0;\n  }\n  TextState.prototype = {\n    setTextMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {\n      var m = this.textMatrix;\n      m[0] = a;\n      m[1] = b;\n      m[2] = c;\n      m[3] = d;\n      m[4] = e;\n      m[5] = f;\n    },\n    setTextLineMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {\n      var m = this.textLineMatrix;\n      m[0] = a;\n      m[1] = b;\n      m[2] = c;\n      m[3] = d;\n      m[4] = e;\n      m[5] = f;\n    },\n    translateTextMatrix: function TextState_translateTextMatrix(x, y) {\n      var m = this.textMatrix;\n      m[4] = m[0] * x + m[2] * y + m[4];\n      m[5] = m[1] * x + m[3] * y + m[5];\n    },\n    translateTextLineMatrix: function TextState_translateTextMatrix(x, y) {\n      var m = this.textLineMatrix;\n      m[4] = m[0] * x + m[2] * y + m[4];\n      m[5] = m[1] * x + m[3] * y + m[5];\n    },\n    calcTextLineMatrixAdvance: function TextState_calcTextLineMatrixAdvance(a, b, c, d, e, f) {\n      var font = this.font;\n      if (!font) {\n        return null;\n      }\n      var m = this.textLineMatrix;\n      if (!(a === m[0] && b === m[1] && c === m[2] && d === m[3])) {\n        return null;\n      }\n      var txDiff = e - m[4],\n          tyDiff = f - m[5];\n      if (font.vertical && txDiff !== 0 || !font.vertical && tyDiff !== 0) {\n        return null;\n      }\n      var tx,\n          ty,\n          denominator = a * d - b * c;\n      if (font.vertical) {\n        tx = -tyDiff * c / denominator;\n        ty = tyDiff * a / denominator;\n      } else {\n        tx = txDiff * d / denominator;\n        ty = -txDiff * b / denominator;\n      }\n      return {\n        width: tx,\n        height: ty,\n        value: font.vertical ? ty : tx\n      };\n    },\n    calcRenderMatrix: function TextState_calcRendeMatrix(ctm) {\n      var tsm = [this.fontSize * this.textHScale, 0, 0, this.fontSize, 0, this.textRise];\n      return _util.Util.transform(ctm, _util.Util.transform(this.textMatrix, tsm));\n    },\n    carriageReturn: function TextState_carriageReturn() {\n      this.translateTextLineMatrix(0, -this.leading);\n      this.textMatrix = this.textLineMatrix.slice();\n    },\n    clone: function TextState_clone() {\n      var clone = Object.create(this);\n      clone.textMatrix = this.textMatrix.slice();\n      clone.textLineMatrix = this.textLineMatrix.slice();\n      clone.fontMatrix = this.fontMatrix.slice();\n      return clone;\n    }\n  };\n  return TextState;\n}();\nvar EvalState = function EvalStateClosure() {\n  function EvalState() {\n    this.ctm = new Float32Array(_util.IDENTITY_MATRIX);\n    this.font = null;\n    this.textRenderingMode = _util.TextRenderingMode.FILL;\n    this.fillColorSpace = _colorspace.ColorSpace.singletons.gray;\n    this.strokeColorSpace = _colorspace.ColorSpace.singletons.gray;\n  }\n  EvalState.prototype = {\n    clone: function CanvasExtraState_clone() {\n      return Object.create(this);\n    }\n  };\n  return EvalState;\n}();\nvar EvaluatorPreprocessor = function EvaluatorPreprocessorClosure() {\n  var getOPMap = (0, _util.getLookupTableFactory)(function (t) {\n    t['w'] = {\n      id: _util.OPS.setLineWidth,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['J'] = {\n      id: _util.OPS.setLineCap,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['j'] = {\n      id: _util.OPS.setLineJoin,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['M'] = {\n      id: _util.OPS.setMiterLimit,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['d'] = {\n      id: _util.OPS.setDash,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['ri'] = {\n      id: _util.OPS.setRenderingIntent,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['i'] = {\n      id: _util.OPS.setFlatness,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['gs'] = {\n      id: _util.OPS.setGState,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['q'] = {\n      id: _util.OPS.save,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['Q'] = {\n      id: _util.OPS.restore,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['cm'] = {\n      id: _util.OPS.transform,\n      numArgs: 6,\n      variableArgs: false\n    };\n    t['m'] = {\n      id: _util.OPS.moveTo,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['l'] = {\n      id: _util.OPS.lineTo,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['c'] = {\n      id: _util.OPS.curveTo,\n      numArgs: 6,\n      variableArgs: false\n    };\n    t['v'] = {\n      id: _util.OPS.curveTo2,\n      numArgs: 4,\n      variableArgs: false\n    };\n    t['y'] = {\n      id: _util.OPS.curveTo3,\n      numArgs: 4,\n      variableArgs: false\n    };\n    t['h'] = {\n      id: _util.OPS.closePath,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['re'] = {\n      id: _util.OPS.rectangle,\n      numArgs: 4,\n      variableArgs: false\n    };\n    t['S'] = {\n      id: _util.OPS.stroke,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['s'] = {\n      id: _util.OPS.closeStroke,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['f'] = {\n      id: _util.OPS.fill,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['F'] = {\n      id: _util.OPS.fill,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['f*'] = {\n      id: _util.OPS.eoFill,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['B'] = {\n      id: _util.OPS.fillStroke,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['B*'] = {\n      id: _util.OPS.eoFillStroke,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['b'] = {\n      id: _util.OPS.closeFillStroke,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['b*'] = {\n      id: _util.OPS.closeEOFillStroke,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['n'] = {\n      id: _util.OPS.endPath,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['W'] = {\n      id: _util.OPS.clip,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['W*'] = {\n      id: _util.OPS.eoClip,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['BT'] = {\n      id: _util.OPS.beginText,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['ET'] = {\n      id: _util.OPS.endText,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['Tc'] = {\n      id: _util.OPS.setCharSpacing,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['Tw'] = {\n      id: _util.OPS.setWordSpacing,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['Tz'] = {\n      id: _util.OPS.setHScale,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['TL'] = {\n      id: _util.OPS.setLeading,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['Tf'] = {\n      id: _util.OPS.setFont,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['Tr'] = {\n      id: _util.OPS.setTextRenderingMode,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['Ts'] = {\n      id: _util.OPS.setTextRise,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['Td'] = {\n      id: _util.OPS.moveText,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['TD'] = {\n      id: _util.OPS.setLeadingMoveText,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['Tm'] = {\n      id: _util.OPS.setTextMatrix,\n      numArgs: 6,\n      variableArgs: false\n    };\n    t['T*'] = {\n      id: _util.OPS.nextLine,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['Tj'] = {\n      id: _util.OPS.showText,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['TJ'] = {\n      id: _util.OPS.showSpacedText,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['\\''] = {\n      id: _util.OPS.nextLineShowText,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['\"'] = {\n      id: _util.OPS.nextLineSetSpacingShowText,\n      numArgs: 3,\n      variableArgs: false\n    };\n    t['d0'] = {\n      id: _util.OPS.setCharWidth,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['d1'] = {\n      id: _util.OPS.setCharWidthAndBounds,\n      numArgs: 6,\n      variableArgs: false\n    };\n    t['CS'] = {\n      id: _util.OPS.setStrokeColorSpace,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['cs'] = {\n      id: _util.OPS.setFillColorSpace,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['SC'] = {\n      id: _util.OPS.setStrokeColor,\n      numArgs: 4,\n      variableArgs: true\n    };\n    t['SCN'] = {\n      id: _util.OPS.setStrokeColorN,\n      numArgs: 33,\n      variableArgs: true\n    };\n    t['sc'] = {\n      id: _util.OPS.setFillColor,\n      numArgs: 4,\n      variableArgs: true\n    };\n    t['scn'] = {\n      id: _util.OPS.setFillColorN,\n      numArgs: 33,\n      variableArgs: true\n    };\n    t['G'] = {\n      id: _util.OPS.setStrokeGray,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['g'] = {\n      id: _util.OPS.setFillGray,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['RG'] = {\n      id: _util.OPS.setStrokeRGBColor,\n      numArgs: 3,\n      variableArgs: false\n    };\n    t['rg'] = {\n      id: _util.OPS.setFillRGBColor,\n      numArgs: 3,\n      variableArgs: false\n    };\n    t['K'] = {\n      id: _util.OPS.setStrokeCMYKColor,\n      numArgs: 4,\n      variableArgs: false\n    };\n    t['k'] = {\n      id: _util.OPS.setFillCMYKColor,\n      numArgs: 4,\n      variableArgs: false\n    };\n    t['sh'] = {\n      id: _util.OPS.shadingFill,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['BI'] = {\n      id: _util.OPS.beginInlineImage,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['ID'] = {\n      id: _util.OPS.beginImageData,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['EI'] = {\n      id: _util.OPS.endInlineImage,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['Do'] = {\n      id: _util.OPS.paintXObject,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['MP'] = {\n      id: _util.OPS.markPoint,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['DP'] = {\n      id: _util.OPS.markPointProps,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['BMC'] = {\n      id: _util.OPS.beginMarkedContent,\n      numArgs: 1,\n      variableArgs: false\n    };\n    t['BDC'] = {\n      id: _util.OPS.beginMarkedContentProps,\n      numArgs: 2,\n      variableArgs: false\n    };\n    t['EMC'] = {\n      id: _util.OPS.endMarkedContent,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['BX'] = {\n      id: _util.OPS.beginCompat,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['EX'] = {\n      id: _util.OPS.endCompat,\n      numArgs: 0,\n      variableArgs: false\n    };\n    t['BM'] = null;\n    t['BD'] = null;\n    t['true'] = null;\n    t['fa'] = null;\n    t['fal'] = null;\n    t['fals'] = null;\n    t['false'] = null;\n    t['nu'] = null;\n    t['nul'] = null;\n    t['null'] = null;\n  });\n  function EvaluatorPreprocessor(stream, xref, stateManager) {\n    this.opMap = getOPMap();\n    this.parser = new _parser.Parser(new _parser.Lexer(stream, this.opMap), false, xref);\n    this.stateManager = stateManager;\n    this.nonProcessedArgs = [];\n  }\n  EvaluatorPreprocessor.prototype = {\n    get savedStatesDepth() {\n      return this.stateManager.stateStack.length;\n    },\n    read: function EvaluatorPreprocessor_read(operation) {\n      var args = operation.args;\n      while (true) {\n        var obj = this.parser.getObj();\n        if ((0, _primitives.isCmd)(obj)) {\n          var cmd = obj.cmd;\n          var opSpec = this.opMap[cmd];\n          if (!opSpec) {\n            (0, _util.warn)('Unknown command \"' + cmd + '\"');\n            continue;\n          }\n          var fn = opSpec.id;\n          var numArgs = opSpec.numArgs;\n          var argsLength = args !== null ? args.length : 0;\n          if (!opSpec.variableArgs) {\n            if (argsLength !== numArgs) {\n              var nonProcessedArgs = this.nonProcessedArgs;\n              while (argsLength > numArgs) {\n                nonProcessedArgs.push(args.shift());\n                argsLength--;\n              }\n              while (argsLength < numArgs && nonProcessedArgs.length !== 0) {\n                if (args === null) {\n                  args = [];\n                }\n                args.unshift(nonProcessedArgs.pop());\n                argsLength++;\n              }\n            }\n            if (argsLength < numArgs) {\n              (0, _util.warn)('Skipping command ' + fn + ': expected ' + numArgs + ' args, but received ' + argsLength + ' args.');\n              if (args !== null) {\n                args.length = 0;\n              }\n              continue;\n            }\n          } else if (argsLength > numArgs) {\n            (0, _util.info)('Command ' + fn + ': expected [0,' + numArgs + '] args, but received ' + argsLength + ' args.');\n          }\n          this.preprocessCommand(fn, args);\n          operation.fn = fn;\n          operation.args = args;\n          return true;\n        }\n        if ((0, _primitives.isEOF)(obj)) {\n          return false;\n        }\n        if (obj !== null) {\n          if (args === null) {\n            args = [];\n          }\n          args.push(obj);\n          if (args.length > 33) {\n            throw new _util.FormatError('Too many arguments');\n          }\n        }\n      }\n    },\n    preprocessCommand: function EvaluatorPreprocessor_preprocessCommand(fn, args) {\n      switch (fn | 0) {\n        case _util.OPS.save:\n          this.stateManager.save();\n          break;\n        case _util.OPS.restore:\n          this.stateManager.restore();\n          break;\n        case _util.OPS.transform:\n          this.stateManager.transform(args);\n          break;\n      }\n    }\n  };\n  return EvaluatorPreprocessor;\n}();\nvar QueueOptimizer = function QueueOptimizerClosure() {\n  function addState(parentState, pattern, fn) {\n    var state = parentState;\n    for (var i = 0, ii = pattern.length - 1; i < ii; i++) {\n      var item = pattern[i];\n      state = state[item] || (state[item] = []);\n    }\n    state[pattern[pattern.length - 1]] = fn;\n  }\n  function handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray) {\n    var iFirstPIMXO = iFirstSave + 2;\n    for (var i = 0; i < count; i++) {\n      var arg = argsArray[iFirstPIMXO + 4 * i];\n      var imageMask = arg.length === 1 && arg[0];\n      if (imageMask && imageMask.width === 1 && imageMask.height === 1 && (!imageMask.data.length || imageMask.data.length === 1 && imageMask.data[0] === 0)) {\n        fnArray[iFirstPIMXO + 4 * i] = _util.OPS.paintSolidColorImageMask;\n        continue;\n      }\n      break;\n    }\n    return count - i;\n  }\n  var InitialState = [];\n  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintInlineImageXObject, _util.OPS.restore], function foundInlineImageGroup(context) {\n    var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10;\n    var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200;\n    var MAX_WIDTH = 1000;\n    var IMAGE_PADDING = 1;\n    var fnArray = context.fnArray,\n        argsArray = context.argsArray;\n    var curr = context.iCurr;\n    var iFirstSave = curr - 3;\n    var iFirstTransform = curr - 2;\n    var iFirstPIIXO = curr - 1;\n    var i = iFirstSave + 4;\n    var ii = fnArray.length;\n    while (i + 3 < ii) {\n      if (fnArray[i] !== _util.OPS.save || fnArray[i + 1] !== _util.OPS.transform || fnArray[i + 2] !== _util.OPS.paintInlineImageXObject || fnArray[i + 3] !== _util.OPS.restore) {\n        break;\n      }\n      i += 4;\n    }\n    var count = Math.min((i - iFirstSave) / 4, MAX_IMAGES_IN_INLINE_IMAGES_BLOCK);\n    if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) {\n      return i;\n    }\n    var maxX = 0;\n    var map = [],\n        maxLineHeight = 0;\n    var currentX = IMAGE_PADDING,\n        currentY = IMAGE_PADDING;\n    var q;\n    for (q = 0; q < count; q++) {\n      var transform = argsArray[iFirstTransform + (q << 2)];\n      var img = argsArray[iFirstPIIXO + (q << 2)][0];\n      if (currentX + img.width > MAX_WIDTH) {\n        maxX = Math.max(maxX, currentX);\n        currentY += maxLineHeight + 2 * IMAGE_PADDING;\n        currentX = 0;\n        maxLineHeight = 0;\n      }\n      map.push({\n        transform: transform,\n        x: currentX,\n        y: currentY,\n        w: img.width,\n        h: img.height\n      });\n      currentX += img.width + 2 * IMAGE_PADDING;\n      maxLineHeight = Math.max(maxLineHeight, img.height);\n    }\n    var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING;\n    var imgHeight = currentY + maxLineHeight + IMAGE_PADDING;\n    var imgData = new Uint8Array(imgWidth * imgHeight * 4);\n    var imgRowSize = imgWidth << 2;\n    for (q = 0; q < count; q++) {\n      var data = argsArray[iFirstPIIXO + (q << 2)][0].data;\n      var rowSize = map[q].w << 2;\n      var dataOffset = 0;\n      var offset = map[q].x + map[q].y * imgWidth << 2;\n      imgData.set(data.subarray(0, rowSize), offset - imgRowSize);\n      for (var k = 0, kk = map[q].h; k < kk; k++) {\n        imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset);\n        dataOffset += rowSize;\n        offset += imgRowSize;\n      }\n      imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset);\n      while (offset >= 0) {\n        data[offset - 4] = data[offset];\n        data[offset - 3] = data[offset + 1];\n        data[offset - 2] = data[offset + 2];\n        data[offset - 1] = data[offset + 3];\n        data[offset + rowSize] = data[offset + rowSize - 4];\n        data[offset + rowSize + 1] = data[offset + rowSize - 3];\n        data[offset + rowSize + 2] = data[offset + rowSize - 2];\n        data[offset + rowSize + 3] = data[offset + rowSize - 1];\n        offset -= imgRowSize;\n      }\n    }\n    fnArray.splice(iFirstSave, count * 4, _util.OPS.paintInlineImageXObjectGroup);\n    argsArray.splice(iFirstSave, count * 4, [{\n      width: imgWidth,\n      height: imgHeight,\n      kind: _util.ImageKind.RGBA_32BPP,\n      data: imgData\n    }, map]);\n    return iFirstSave + 1;\n  });\n  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintImageMaskXObject, _util.OPS.restore], function foundImageMaskGroup(context) {\n    var MIN_IMAGES_IN_MASKS_BLOCK = 10;\n    var MAX_IMAGES_IN_MASKS_BLOCK = 100;\n    var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000;\n    var fnArray = context.fnArray,\n        argsArray = context.argsArray;\n    var curr = context.iCurr;\n    var iFirstSave = curr - 3;\n    var iFirstTransform = curr - 2;\n    var iFirstPIMXO = curr - 1;\n    var i = iFirstSave + 4;\n    var ii = fnArray.length;\n    while (i + 3 < ii) {\n      if (fnArray[i] !== _util.OPS.save || fnArray[i + 1] !== _util.OPS.transform || fnArray[i + 2] !== _util.OPS.paintImageMaskXObject || fnArray[i + 3] !== _util.OPS.restore) {\n        break;\n      }\n      i += 4;\n    }\n    var count = (i - iFirstSave) / 4;\n    count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray);\n    if (count < MIN_IMAGES_IN_MASKS_BLOCK) {\n      return i;\n    }\n    var q;\n    var isSameImage = false;\n    var iTransform, transformArgs;\n    var firstPIMXOArg0 = argsArray[iFirstPIMXO][0];\n    if (argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0) {\n      isSameImage = true;\n      var firstTransformArg0 = argsArray[iFirstTransform][0];\n      var firstTransformArg3 = argsArray[iFirstTransform][3];\n      iTransform = iFirstTransform + 4;\n      var iPIMXO = iFirstPIMXO + 4;\n      for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) {\n        transformArgs = argsArray[iTransform];\n        if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || transformArgs[1] !== 0 || transformArgs[2] !== 0 || transformArgs[3] !== firstTransformArg3) {\n          if (q < MIN_IMAGES_IN_MASKS_BLOCK) {\n            isSameImage = false;\n          } else {\n            count = q;\n          }\n          break;\n        }\n      }\n    }\n    if (isSameImage) {\n      count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK);\n      var positions = new Float32Array(count * 2);\n      iTransform = iFirstTransform;\n      for (q = 0; q < count; q++, iTransform += 4) {\n        transformArgs = argsArray[iTransform];\n        positions[q << 1] = transformArgs[4];\n        positions[(q << 1) + 1] = transformArgs[5];\n      }\n      fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageMaskXObjectRepeat);\n      argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg3, positions]);\n    } else {\n      count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);\n      var images = [];\n      for (q = 0; q < count; q++) {\n        transformArgs = argsArray[iFirstTransform + (q << 2)];\n        var maskParams = argsArray[iFirstPIMXO + (q << 2)][0];\n        images.push({\n          data: maskParams.data,\n          width: maskParams.width,\n          height: maskParams.height,\n          transform: transformArgs\n        });\n      }\n      fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageMaskXObjectGroup);\n      argsArray.splice(iFirstSave, count * 4, [images]);\n    }\n    return iFirstSave + 1;\n  });\n  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintImageXObject, _util.OPS.restore], function (context) {\n    var MIN_IMAGES_IN_BLOCK = 3;\n    var MAX_IMAGES_IN_BLOCK = 1000;\n    var fnArray = context.fnArray,\n        argsArray = context.argsArray;\n    var curr = context.iCurr;\n    var iFirstSave = curr - 3;\n    var iFirstTransform = curr - 2;\n    var iFirstPIXO = curr - 1;\n    var iFirstRestore = curr;\n    if (argsArray[iFirstTransform][1] !== 0 || argsArray[iFirstTransform][2] !== 0) {\n      return iFirstRestore + 1;\n    }\n    var firstPIXOArg0 = argsArray[iFirstPIXO][0];\n    var firstTransformArg0 = argsArray[iFirstTransform][0];\n    var firstTransformArg3 = argsArray[iFirstTransform][3];\n    var i = iFirstSave + 4;\n    var ii = fnArray.length;\n    while (i + 3 < ii) {\n      if (fnArray[i] !== _util.OPS.save || fnArray[i + 1] !== _util.OPS.transform || fnArray[i + 2] !== _util.OPS.paintImageXObject || fnArray[i + 3] !== _util.OPS.restore) {\n        break;\n      }\n      if (argsArray[i + 1][0] !== firstTransformArg0 || argsArray[i + 1][1] !== 0 || argsArray[i + 1][2] !== 0 || argsArray[i + 1][3] !== firstTransformArg3) {\n        break;\n      }\n      if (argsArray[i + 2][0] !== firstPIXOArg0) {\n        break;\n      }\n      i += 4;\n    }\n    var count = Math.min((i - iFirstSave) / 4, MAX_IMAGES_IN_BLOCK);\n    if (count < MIN_IMAGES_IN_BLOCK) {\n      return i;\n    }\n    var positions = new Float32Array(count * 2);\n    var iTransform = iFirstTransform;\n    for (var q = 0; q < count; q++, iTransform += 4) {\n      var transformArgs = argsArray[iTransform];\n      positions[q << 1] = transformArgs[4];\n      positions[(q << 1) + 1] = transformArgs[5];\n    }\n    var args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions];\n    fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageXObjectRepeat);\n    argsArray.splice(iFirstSave, count * 4, args);\n    return iFirstSave + 1;\n  });\n  addState(InitialState, [_util.OPS.beginText, _util.OPS.setFont, _util.OPS.setTextMatrix, _util.OPS.showText, _util.OPS.endText], function (context) {\n    var MIN_CHARS_IN_BLOCK = 3;\n    var MAX_CHARS_IN_BLOCK = 1000;\n    var fnArray = context.fnArray,\n        argsArray = context.argsArray;\n    var curr = context.iCurr;\n    var iFirstBeginText = curr - 4;\n    var iFirstSetFont = curr - 3;\n    var iFirstSetTextMatrix = curr - 2;\n    var iFirstShowText = curr - 1;\n    var iFirstEndText = curr;\n    var firstSetFontArg0 = argsArray[iFirstSetFont][0];\n    var firstSetFontArg1 = argsArray[iFirstSetFont][1];\n    var i = iFirstBeginText + 5;\n    var ii = fnArray.length;\n    while (i + 4 < ii) {\n      if (fnArray[i] !== _util.OPS.beginText || fnArray[i + 1] !== _util.OPS.setFont || fnArray[i + 2] !== _util.OPS.setTextMatrix || fnArray[i + 3] !== _util.OPS.showText || fnArray[i + 4] !== _util.OPS.endText) {\n        break;\n      }\n      if (argsArray[i + 1][0] !== firstSetFontArg0 || argsArray[i + 1][1] !== firstSetFontArg1) {\n        break;\n      }\n      i += 5;\n    }\n    var count = Math.min((i - iFirstBeginText) / 5, MAX_CHARS_IN_BLOCK);\n    if (count < MIN_CHARS_IN_BLOCK) {\n      return i;\n    }\n    var iFirst = iFirstBeginText;\n    if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) {\n      count++;\n      iFirst -= 5;\n    }\n    var iEndText = iFirst + 4;\n    for (var q = 1; q < count; q++) {\n      fnArray.splice(iEndText, 3);\n      argsArray.splice(iEndText, 3);\n      iEndText += 2;\n    }\n    return iEndText + 1;\n  });\n  function QueueOptimizer() {}\n  QueueOptimizer.prototype = {\n    optimize: function QueueOptimizer_optimize(queue) {\n      var fnArray = queue.fnArray,\n          argsArray = queue.argsArray;\n      var context = {\n        iCurr: 0,\n        fnArray: fnArray,\n        argsArray: argsArray\n      };\n      var state;\n      var i = 0,\n          ii = fnArray.length;\n      while (i < ii) {\n        state = (state || InitialState)[fnArray[i]];\n        if (typeof state === 'function') {\n          context.iCurr = i;\n          i = state(context);\n          state = undefined;\n          ii = context.fnArray.length;\n        } else {\n          i++;\n        }\n      }\n    }\n  };\n  return QueueOptimizer;\n}();\nexports.OperatorList = OperatorList;\nexports.PartialEvaluator = PartialEvaluator;\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.JpxImage = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _arithmetic_decoder = __w_pdfjs_require__(9);\n\nvar JpxError = function JpxErrorClosure() {\n  function JpxError(msg) {\n    this.message = 'JPX error: ' + msg;\n  }\n  JpxError.prototype = new Error();\n  JpxError.prototype.name = 'JpxError';\n  JpxError.constructor = JpxError;\n  return JpxError;\n}();\nvar JpxImage = function JpxImageClosure() {\n  var SubbandsGainLog2 = {\n    'LL': 0,\n    'LH': 1,\n    'HL': 1,\n    'HH': 2\n  };\n  function JpxImage() {\n    this.failOnCorruptedImage = false;\n  }\n  JpxImage.prototype = {\n    parse: function JpxImage_parse(data) {\n      var head = (0, _util.readUint16)(data, 0);\n      if (head === 0xFF4F) {\n        this.parseCodestream(data, 0, data.length);\n        return;\n      }\n      var position = 0,\n          length = data.length;\n      while (position < length) {\n        var headerSize = 8;\n        var lbox = (0, _util.readUint32)(data, position);\n        var tbox = (0, _util.readUint32)(data, position + 4);\n        position += headerSize;\n        if (lbox === 1) {\n          lbox = (0, _util.readUint32)(data, position) * 4294967296 + (0, _util.readUint32)(data, position + 4);\n          position += 8;\n          headerSize += 8;\n        }\n        if (lbox === 0) {\n          lbox = length - position + headerSize;\n        }\n        if (lbox < headerSize) {\n          throw new JpxError('Invalid box field size');\n        }\n        var dataLength = lbox - headerSize;\n        var jumpDataLength = true;\n        switch (tbox) {\n          case 0x6A703268:\n            jumpDataLength = false;\n            break;\n          case 0x636F6C72:\n            var method = data[position];\n            if (method === 1) {\n              var colorspace = (0, _util.readUint32)(data, position + 3);\n              switch (colorspace) {\n                case 16:\n                case 17:\n                case 18:\n                  break;\n                default:\n                  (0, _util.warn)('Unknown colorspace ' + colorspace);\n                  break;\n              }\n            } else if (method === 2) {\n              (0, _util.info)('ICC profile not supported');\n            }\n            break;\n          case 0x6A703263:\n            this.parseCodestream(data, position, position + dataLength);\n            break;\n          case 0x6A502020:\n            if ((0, _util.readUint32)(data, position) !== 0x0d0a870a) {\n              (0, _util.warn)('Invalid JP2 signature');\n            }\n            break;\n          case 0x6A501A1A:\n          case 0x66747970:\n          case 0x72726571:\n          case 0x72657320:\n          case 0x69686472:\n            break;\n          default:\n            var headerType = String.fromCharCode(tbox >> 24 & 0xFF, tbox >> 16 & 0xFF, tbox >> 8 & 0xFF, tbox & 0xFF);\n            (0, _util.warn)('Unsupported header type ' + tbox + ' (' + headerType + ')');\n            break;\n        }\n        if (jumpDataLength) {\n          position += dataLength;\n        }\n      }\n    },\n    parseImageProperties: function JpxImage_parseImageProperties(stream) {\n      var newByte = stream.getByte();\n      while (newByte >= 0) {\n        var oldByte = newByte;\n        newByte = stream.getByte();\n        var code = oldByte << 8 | newByte;\n        if (code === 0xFF51) {\n          stream.skip(4);\n          var Xsiz = stream.getInt32() >>> 0;\n          var Ysiz = stream.getInt32() >>> 0;\n          var XOsiz = stream.getInt32() >>> 0;\n          var YOsiz = stream.getInt32() >>> 0;\n          stream.skip(16);\n          var Csiz = stream.getUint16();\n          this.width = Xsiz - XOsiz;\n          this.height = Ysiz - YOsiz;\n          this.componentsCount = Csiz;\n          this.bitsPerComponent = 8;\n          return;\n        }\n      }\n      throw new JpxError('No size marker found in JPX stream');\n    },\n    parseCodestream: function JpxImage_parseCodestream(data, start, end) {\n      var context = {};\n      var doNotRecover = false;\n      try {\n        var position = start;\n        while (position + 1 < end) {\n          var code = (0, _util.readUint16)(data, position);\n          position += 2;\n          var length = 0,\n              j,\n              sqcd,\n              spqcds,\n              spqcdSize,\n              scalarExpounded,\n              tile;\n          switch (code) {\n            case 0xFF4F:\n              context.mainHeader = true;\n              break;\n            case 0xFFD9:\n              break;\n            case 0xFF51:\n              length = (0, _util.readUint16)(data, position);\n              var siz = {};\n              siz.Xsiz = (0, _util.readUint32)(data, position + 4);\n              siz.Ysiz = (0, _util.readUint32)(data, position + 8);\n              siz.XOsiz = (0, _util.readUint32)(data, position + 12);\n              siz.YOsiz = (0, _util.readUint32)(data, position + 16);\n              siz.XTsiz = (0, _util.readUint32)(data, position + 20);\n              siz.YTsiz = (0, _util.readUint32)(data, position + 24);\n              siz.XTOsiz = (0, _util.readUint32)(data, position + 28);\n              siz.YTOsiz = (0, _util.readUint32)(data, position + 32);\n              var componentsCount = (0, _util.readUint16)(data, position + 36);\n              siz.Csiz = componentsCount;\n              var components = [];\n              j = position + 38;\n              for (var i = 0; i < componentsCount; i++) {\n                var component = {\n                  precision: (data[j] & 0x7F) + 1,\n                  isSigned: !!(data[j] & 0x80),\n                  XRsiz: data[j + 1],\n                  YRsiz: data[j + 1]\n                };\n                calculateComponentDimensions(component, siz);\n                components.push(component);\n              }\n              context.SIZ = siz;\n              context.components = components;\n              calculateTileGrids(context, components);\n              context.QCC = [];\n              context.COC = [];\n              break;\n            case 0xFF5C:\n              length = (0, _util.readUint16)(data, position);\n              var qcd = {};\n              j = position + 2;\n              sqcd = data[j++];\n              switch (sqcd & 0x1F) {\n                case 0:\n                  spqcdSize = 8;\n                  scalarExpounded = true;\n                  break;\n                case 1:\n                  spqcdSize = 16;\n                  scalarExpounded = false;\n                  break;\n                case 2:\n                  spqcdSize = 16;\n                  scalarExpounded = true;\n                  break;\n                default:\n                  throw new Error('Invalid SQcd value ' + sqcd);\n              }\n              qcd.noQuantization = spqcdSize === 8;\n              qcd.scalarExpounded = scalarExpounded;\n              qcd.guardBits = sqcd >> 5;\n              spqcds = [];\n              while (j < length + position) {\n                var spqcd = {};\n                if (spqcdSize === 8) {\n                  spqcd.epsilon = data[j++] >> 3;\n                  spqcd.mu = 0;\n                } else {\n                  spqcd.epsilon = data[j] >> 3;\n                  spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1];\n                  j += 2;\n                }\n                spqcds.push(spqcd);\n              }\n              qcd.SPqcds = spqcds;\n              if (context.mainHeader) {\n                context.QCD = qcd;\n              } else {\n                context.currentTile.QCD = qcd;\n                context.currentTile.QCC = [];\n              }\n              break;\n            case 0xFF5D:\n              length = (0, _util.readUint16)(data, position);\n              var qcc = {};\n              j = position + 2;\n              var cqcc;\n              if (context.SIZ.Csiz < 257) {\n                cqcc = data[j++];\n              } else {\n                cqcc = (0, _util.readUint16)(data, j);\n                j += 2;\n              }\n              sqcd = data[j++];\n              switch (sqcd & 0x1F) {\n                case 0:\n                  spqcdSize = 8;\n                  scalarExpounded = true;\n                  break;\n                case 1:\n                  spqcdSize = 16;\n                  scalarExpounded = false;\n                  break;\n                case 2:\n                  spqcdSize = 16;\n                  scalarExpounded = true;\n                  break;\n                default:\n                  throw new Error('Invalid SQcd value ' + sqcd);\n              }\n              qcc.noQuantization = spqcdSize === 8;\n              qcc.scalarExpounded = scalarExpounded;\n              qcc.guardBits = sqcd >> 5;\n              spqcds = [];\n              while (j < length + position) {\n                spqcd = {};\n                if (spqcdSize === 8) {\n                  spqcd.epsilon = data[j++] >> 3;\n                  spqcd.mu = 0;\n                } else {\n                  spqcd.epsilon = data[j] >> 3;\n                  spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1];\n                  j += 2;\n                }\n                spqcds.push(spqcd);\n              }\n              qcc.SPqcds = spqcds;\n              if (context.mainHeader) {\n                context.QCC[cqcc] = qcc;\n              } else {\n                context.currentTile.QCC[cqcc] = qcc;\n              }\n              break;\n            case 0xFF52:\n              length = (0, _util.readUint16)(data, position);\n              var cod = {};\n              j = position + 2;\n              var scod = data[j++];\n              cod.entropyCoderWithCustomPrecincts = !!(scod & 1);\n              cod.sopMarkerUsed = !!(scod & 2);\n              cod.ephMarkerUsed = !!(scod & 4);\n              cod.progressionOrder = data[j++];\n              cod.layersCount = (0, _util.readUint16)(data, j);\n              j += 2;\n              cod.multipleComponentTransform = data[j++];\n              cod.decompositionLevelsCount = data[j++];\n              cod.xcb = (data[j++] & 0xF) + 2;\n              cod.ycb = (data[j++] & 0xF) + 2;\n              var blockStyle = data[j++];\n              cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);\n              cod.resetContextProbabilities = !!(blockStyle & 2);\n              cod.terminationOnEachCodingPass = !!(blockStyle & 4);\n              cod.verticalyStripe = !!(blockStyle & 8);\n              cod.predictableTermination = !!(blockStyle & 16);\n              cod.segmentationSymbolUsed = !!(blockStyle & 32);\n              cod.reversibleTransformation = data[j++];\n              if (cod.entropyCoderWithCustomPrecincts) {\n                var precinctsSizes = [];\n                while (j < length + position) {\n                  var precinctsSize = data[j++];\n                  precinctsSizes.push({\n                    PPx: precinctsSize & 0xF,\n                    PPy: precinctsSize >> 4\n                  });\n                }\n                cod.precinctsSizes = precinctsSizes;\n              }\n              var unsupported = [];\n              if (cod.selectiveArithmeticCodingBypass) {\n                unsupported.push('selectiveArithmeticCodingBypass');\n              }\n              if (cod.resetContextProbabilities) {\n                unsupported.push('resetContextProbabilities');\n              }\n              if (cod.terminationOnEachCodingPass) {\n                unsupported.push('terminationOnEachCodingPass');\n              }\n              if (cod.verticalyStripe) {\n                unsupported.push('verticalyStripe');\n              }\n              if (cod.predictableTermination) {\n                unsupported.push('predictableTermination');\n              }\n              if (unsupported.length > 0) {\n                doNotRecover = true;\n                throw new Error('Unsupported COD options (' + unsupported.join(', ') + ')');\n              }\n              if (context.mainHeader) {\n                context.COD = cod;\n              } else {\n                context.currentTile.COD = cod;\n                context.currentTile.COC = [];\n              }\n              break;\n            case 0xFF90:\n              length = (0, _util.readUint16)(data, position);\n              tile = {};\n              tile.index = (0, _util.readUint16)(data, position + 2);\n              tile.length = (0, _util.readUint32)(data, position + 4);\n              tile.dataEnd = tile.length + position - 2;\n              tile.partIndex = data[position + 8];\n              tile.partsCount = data[position + 9];\n              context.mainHeader = false;\n              if (tile.partIndex === 0) {\n                tile.COD = context.COD;\n                tile.COC = context.COC.slice(0);\n                tile.QCD = context.QCD;\n                tile.QCC = context.QCC.slice(0);\n              }\n              context.currentTile = tile;\n              break;\n            case 0xFF93:\n              tile = context.currentTile;\n              if (tile.partIndex === 0) {\n                initializeTile(context, tile.index);\n                buildPackets(context);\n              }\n              length = tile.dataEnd - position;\n              parseTilePackets(context, data, position, length);\n              break;\n            case 0xFF55:\n            case 0xFF57:\n            case 0xFF58:\n            case 0xFF64:\n              length = (0, _util.readUint16)(data, position);\n              break;\n            case 0xFF53:\n              throw new Error('Codestream code 0xFF53 (COC) is ' + 'not implemented');\n            default:\n              throw new Error('Unknown codestream code: ' + code.toString(16));\n          }\n          position += length;\n        }\n      } catch (e) {\n        if (doNotRecover || this.failOnCorruptedImage) {\n          throw new JpxError(e.message);\n        } else {\n          (0, _util.warn)('JPX: Trying to recover from: ' + e.message);\n        }\n      }\n      this.tiles = transformComponents(context);\n      this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;\n      this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;\n      this.componentsCount = context.SIZ.Csiz;\n    }\n  };\n  function calculateComponentDimensions(component, siz) {\n    component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);\n    component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);\n    component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);\n    component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);\n    component.width = component.x1 - component.x0;\n    component.height = component.y1 - component.y0;\n  }\n  function calculateTileGrids(context, components) {\n    var siz = context.SIZ;\n    var tile,\n        tiles = [];\n    var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);\n    var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);\n    for (var q = 0; q < numYtiles; q++) {\n      for (var p = 0; p < numXtiles; p++) {\n        tile = {};\n        tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);\n        tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);\n        tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);\n        tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);\n        tile.width = tile.tx1 - tile.tx0;\n        tile.height = tile.ty1 - tile.ty0;\n        tile.components = [];\n        tiles.push(tile);\n      }\n    }\n    context.tiles = tiles;\n    var componentsCount = siz.Csiz;\n    for (var i = 0, ii = componentsCount; i < ii; i++) {\n      var component = components[i];\n      for (var j = 0, jj = tiles.length; j < jj; j++) {\n        var tileComponent = {};\n        tile = tiles[j];\n        tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);\n        tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);\n        tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);\n        tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);\n        tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;\n        tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;\n        tile.components[i] = tileComponent;\n      }\n    }\n  }\n  function getBlocksDimensions(context, component, r) {\n    var codOrCoc = component.codingStyleParameters;\n    var result = {};\n    if (!codOrCoc.entropyCoderWithCustomPrecincts) {\n      result.PPx = 15;\n      result.PPy = 15;\n    } else {\n      result.PPx = codOrCoc.precinctsSizes[r].PPx;\n      result.PPy = codOrCoc.precinctsSizes[r].PPy;\n    }\n    result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : Math.min(codOrCoc.xcb, result.PPx);\n    result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : Math.min(codOrCoc.ycb, result.PPy);\n    return result;\n  }\n  function buildPrecincts(context, resolution, dimensions) {\n    var precinctWidth = 1 << dimensions.PPx;\n    var precinctHeight = 1 << dimensions.PPy;\n    var isZeroRes = resolution.resLevel === 0;\n    var precinctWidthInSubband = 1 << dimensions.PPx + (isZeroRes ? 0 : -1);\n    var precinctHeightInSubband = 1 << dimensions.PPy + (isZeroRes ? 0 : -1);\n    var numprecinctswide = resolution.trx1 > resolution.trx0 ? Math.ceil(resolution.trx1 / precinctWidth) - Math.floor(resolution.trx0 / precinctWidth) : 0;\n    var numprecinctshigh = resolution.try1 > resolution.try0 ? Math.ceil(resolution.try1 / precinctHeight) - Math.floor(resolution.try0 / precinctHeight) : 0;\n    var numprecincts = numprecinctswide * numprecinctshigh;\n    resolution.precinctParameters = {\n      precinctWidth: precinctWidth,\n      precinctHeight: precinctHeight,\n      numprecinctswide: numprecinctswide,\n      numprecinctshigh: numprecinctshigh,\n      numprecincts: numprecincts,\n      precinctWidthInSubband: precinctWidthInSubband,\n      precinctHeightInSubband: precinctHeightInSubband\n    };\n  }\n  function buildCodeblocks(context, subband, dimensions) {\n    var xcb_ = dimensions.xcb_;\n    var ycb_ = dimensions.ycb_;\n    var codeblockWidth = 1 << xcb_;\n    var codeblockHeight = 1 << ycb_;\n    var cbx0 = subband.tbx0 >> xcb_;\n    var cby0 = subband.tby0 >> ycb_;\n    var cbx1 = subband.tbx1 + codeblockWidth - 1 >> xcb_;\n    var cby1 = subband.tby1 + codeblockHeight - 1 >> ycb_;\n    var precinctParameters = subband.resolution.precinctParameters;\n    var codeblocks = [];\n    var precincts = [];\n    var i, j, codeblock, precinctNumber;\n    for (j = cby0; j < cby1; j++) {\n      for (i = cbx0; i < cbx1; i++) {\n        codeblock = {\n          cbx: i,\n          cby: j,\n          tbx0: codeblockWidth * i,\n          tby0: codeblockHeight * j,\n          tbx1: codeblockWidth * (i + 1),\n          tby1: codeblockHeight * (j + 1)\n        };\n        codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);\n        codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);\n        codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);\n        codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);\n        var pi = Math.floor((codeblock.tbx0_ - subband.tbx0) / precinctParameters.precinctWidthInSubband);\n        var pj = Math.floor((codeblock.tby0_ - subband.tby0) / precinctParameters.precinctHeightInSubband);\n        precinctNumber = pi + pj * precinctParameters.numprecinctswide;\n        codeblock.precinctNumber = precinctNumber;\n        codeblock.subbandType = subband.type;\n        codeblock.Lblock = 3;\n        if (codeblock.tbx1_ <= codeblock.tbx0_ || codeblock.tby1_ <= codeblock.tby0_) {\n          continue;\n        }\n        codeblocks.push(codeblock);\n        var precinct = precincts[precinctNumber];\n        if (precinct !== undefined) {\n          if (i < precinct.cbxMin) {\n            precinct.cbxMin = i;\n          } else if (i > precinct.cbxMax) {\n            precinct.cbxMax = i;\n          }\n          if (j < precinct.cbyMin) {\n            precinct.cbxMin = j;\n          } else if (j > precinct.cbyMax) {\n            precinct.cbyMax = j;\n          }\n        } else {\n          precincts[precinctNumber] = precinct = {\n            cbxMin: i,\n            cbyMin: j,\n            cbxMax: i,\n            cbyMax: j\n          };\n        }\n        codeblock.precinct = precinct;\n      }\n    }\n    subband.codeblockParameters = {\n      codeblockWidth: xcb_,\n      codeblockHeight: ycb_,\n      numcodeblockwide: cbx1 - cbx0 + 1,\n      numcodeblockhigh: cby1 - cby0 + 1\n    };\n    subband.codeblocks = codeblocks;\n    subband.precincts = precincts;\n  }\n  function createPacket(resolution, precinctNumber, layerNumber) {\n    var precinctCodeblocks = [];\n    var subbands = resolution.subbands;\n    for (var i = 0, ii = subbands.length; i < ii; i++) {\n      var subband = subbands[i];\n      var codeblocks = subband.codeblocks;\n      for (var j = 0, jj = codeblocks.length; j < jj; j++) {\n        var codeblock = codeblocks[j];\n        if (codeblock.precinctNumber !== precinctNumber) {\n          continue;\n        }\n        precinctCodeblocks.push(codeblock);\n      }\n    }\n    return {\n      layerNumber: layerNumber,\n      codeblocks: precinctCodeblocks\n    };\n  }\n  function LayerResolutionComponentPositionIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var maxDecompositionLevelsCount = 0;\n    for (var q = 0; q < componentsCount; q++) {\n      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount);\n    }\n    var l = 0,\n        r = 0,\n        i = 0,\n        k = 0;\n    this.nextPacket = function JpxImage_nextPacket() {\n      for (; l < layersCount; l++) {\n        for (; r <= maxDecompositionLevelsCount; r++) {\n          for (; i < componentsCount; i++) {\n            var component = tile.components[i];\n            if (r > component.codingStyleParameters.decompositionLevelsCount) {\n              continue;\n            }\n            var resolution = component.resolutions[r];\n            var numprecincts = resolution.precinctParameters.numprecincts;\n            for (; k < numprecincts;) {\n              var packet = createPacket(resolution, k, l);\n              k++;\n              return packet;\n            }\n            k = 0;\n          }\n          i = 0;\n        }\n        r = 0;\n      }\n      throw new JpxError('Out of packets');\n    };\n  }\n  function ResolutionLayerComponentPositionIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var maxDecompositionLevelsCount = 0;\n    for (var q = 0; q < componentsCount; q++) {\n      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount);\n    }\n    var r = 0,\n        l = 0,\n        i = 0,\n        k = 0;\n    this.nextPacket = function JpxImage_nextPacket() {\n      for (; r <= maxDecompositionLevelsCount; r++) {\n        for (; l < layersCount; l++) {\n          for (; i < componentsCount; i++) {\n            var component = tile.components[i];\n            if (r > component.codingStyleParameters.decompositionLevelsCount) {\n              continue;\n            }\n            var resolution = component.resolutions[r];\n            var numprecincts = resolution.precinctParameters.numprecincts;\n            for (; k < numprecincts;) {\n              var packet = createPacket(resolution, k, l);\n              k++;\n              return packet;\n            }\n            k = 0;\n          }\n          i = 0;\n        }\n        l = 0;\n      }\n      throw new JpxError('Out of packets');\n    };\n  }\n  function ResolutionPositionComponentLayerIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var l, r, c, p;\n    var maxDecompositionLevelsCount = 0;\n    for (c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, component.codingStyleParameters.decompositionLevelsCount);\n    }\n    var maxNumPrecinctsInLevel = new Int32Array(maxDecompositionLevelsCount + 1);\n    for (r = 0; r <= maxDecompositionLevelsCount; ++r) {\n      var maxNumPrecincts = 0;\n      for (c = 0; c < componentsCount; ++c) {\n        var resolutions = tile.components[c].resolutions;\n        if (r < resolutions.length) {\n          maxNumPrecincts = Math.max(maxNumPrecincts, resolutions[r].precinctParameters.numprecincts);\n        }\n      }\n      maxNumPrecinctsInLevel[r] = maxNumPrecincts;\n    }\n    l = 0;\n    r = 0;\n    c = 0;\n    p = 0;\n    this.nextPacket = function JpxImage_nextPacket() {\n      for (; r <= maxDecompositionLevelsCount; r++) {\n        for (; p < maxNumPrecinctsInLevel[r]; p++) {\n          for (; c < componentsCount; c++) {\n            var component = tile.components[c];\n            if (r > component.codingStyleParameters.decompositionLevelsCount) {\n              continue;\n            }\n            var resolution = component.resolutions[r];\n            var numprecincts = resolution.precinctParameters.numprecincts;\n            if (p >= numprecincts) {\n              continue;\n            }\n            for (; l < layersCount;) {\n              var packet = createPacket(resolution, p, l);\n              l++;\n              return packet;\n            }\n            l = 0;\n          }\n          c = 0;\n        }\n        p = 0;\n      }\n      throw new JpxError('Out of packets');\n    };\n  }\n  function PositionComponentResolutionLayerIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var precinctsSizes = getPrecinctSizesInImageScale(tile);\n    var precinctsIterationSizes = precinctsSizes;\n    var l = 0,\n        r = 0,\n        c = 0,\n        px = 0,\n        py = 0;\n    this.nextPacket = function JpxImage_nextPacket() {\n      for (; py < precinctsIterationSizes.maxNumHigh; py++) {\n        for (; px < precinctsIterationSizes.maxNumWide; px++) {\n          for (; c < componentsCount; c++) {\n            var component = tile.components[c];\n            var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;\n            for (; r <= decompositionLevelsCount; r++) {\n              var resolution = component.resolutions[r];\n              var sizeInImageScale = precinctsSizes.components[c].resolutions[r];\n              var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution);\n              if (k === null) {\n                continue;\n              }\n              for (; l < layersCount;) {\n                var packet = createPacket(resolution, k, l);\n                l++;\n                return packet;\n              }\n              l = 0;\n            }\n            r = 0;\n          }\n          c = 0;\n        }\n        px = 0;\n      }\n      throw new JpxError('Out of packets');\n    };\n  }\n  function ComponentPositionResolutionLayerIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var precinctsSizes = getPrecinctSizesInImageScale(tile);\n    var l = 0,\n        r = 0,\n        c = 0,\n        px = 0,\n        py = 0;\n    this.nextPacket = function JpxImage_nextPacket() {\n      for (; c < componentsCount; ++c) {\n        var component = tile.components[c];\n        var precinctsIterationSizes = precinctsSizes.components[c];\n        var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;\n        for (; py < precinctsIterationSizes.maxNumHigh; py++) {\n          for (; px < precinctsIterationSizes.maxNumWide; px++) {\n            for (; r <= decompositionLevelsCount; r++) {\n              var resolution = component.resolutions[r];\n              var sizeInImageScale = precinctsIterationSizes.resolutions[r];\n              var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution);\n              if (k === null) {\n                continue;\n              }\n              for (; l < layersCount;) {\n                var packet = createPacket(resolution, k, l);\n                l++;\n                return packet;\n              }\n              l = 0;\n            }\n            r = 0;\n          }\n          px = 0;\n        }\n        py = 0;\n      }\n      throw new JpxError('Out of packets');\n    };\n  }\n  function getPrecinctIndexIfExist(pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) {\n    var posX = pxIndex * precinctIterationSizes.minWidth;\n    var posY = pyIndex * precinctIterationSizes.minHeight;\n    if (posX % sizeInImageScale.width !== 0 || posY % sizeInImageScale.height !== 0) {\n      return null;\n    }\n    var startPrecinctRowIndex = posY / sizeInImageScale.width * resolution.precinctParameters.numprecinctswide;\n    return posX / sizeInImageScale.height + startPrecinctRowIndex;\n  }\n  function getPrecinctSizesInImageScale(tile) {\n    var componentsCount = tile.components.length;\n    var minWidth = Number.MAX_VALUE;\n    var minHeight = Number.MAX_VALUE;\n    var maxNumWide = 0;\n    var maxNumHigh = 0;\n    var sizePerComponent = new Array(componentsCount);\n    for (var c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;\n      var sizePerResolution = new Array(decompositionLevelsCount + 1);\n      var minWidthCurrentComponent = Number.MAX_VALUE;\n      var minHeightCurrentComponent = Number.MAX_VALUE;\n      var maxNumWideCurrentComponent = 0;\n      var maxNumHighCurrentComponent = 0;\n      var scale = 1;\n      for (var r = decompositionLevelsCount; r >= 0; --r) {\n        var resolution = component.resolutions[r];\n        var widthCurrentResolution = scale * resolution.precinctParameters.precinctWidth;\n        var heightCurrentResolution = scale * resolution.precinctParameters.precinctHeight;\n        minWidthCurrentComponent = Math.min(minWidthCurrentComponent, widthCurrentResolution);\n        minHeightCurrentComponent = Math.min(minHeightCurrentComponent, heightCurrentResolution);\n        maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent, resolution.precinctParameters.numprecinctswide);\n        maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent, resolution.precinctParameters.numprecinctshigh);\n        sizePerResolution[r] = {\n          width: widthCurrentResolution,\n          height: heightCurrentResolution\n        };\n        scale <<= 1;\n      }\n      minWidth = Math.min(minWidth, minWidthCurrentComponent);\n      minHeight = Math.min(minHeight, minHeightCurrentComponent);\n      maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent);\n      maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent);\n      sizePerComponent[c] = {\n        resolutions: sizePerResolution,\n        minWidth: minWidthCurrentComponent,\n        minHeight: minHeightCurrentComponent,\n        maxNumWide: maxNumWideCurrentComponent,\n        maxNumHigh: maxNumHighCurrentComponent\n      };\n    }\n    return {\n      components: sizePerComponent,\n      minWidth: minWidth,\n      minHeight: minHeight,\n      maxNumWide: maxNumWide,\n      maxNumHigh: maxNumHigh\n    };\n  }\n  function buildPackets(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var componentsCount = siz.Csiz;\n    for (var c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;\n      var resolutions = [];\n      var subbands = [];\n      for (var r = 0; r <= decompositionLevelsCount; r++) {\n        var blocksDimensions = getBlocksDimensions(context, component, r);\n        var resolution = {};\n        var scale = 1 << decompositionLevelsCount - r;\n        resolution.trx0 = Math.ceil(component.tcx0 / scale);\n        resolution.try0 = Math.ceil(component.tcy0 / scale);\n        resolution.trx1 = Math.ceil(component.tcx1 / scale);\n        resolution.try1 = Math.ceil(component.tcy1 / scale);\n        resolution.resLevel = r;\n        buildPrecincts(context, resolution, blocksDimensions);\n        resolutions.push(resolution);\n        var subband;\n        if (r === 0) {\n          subband = {};\n          subband.type = 'LL';\n          subband.tbx0 = Math.ceil(component.tcx0 / scale);\n          subband.tby0 = Math.ceil(component.tcy0 / scale);\n          subband.tbx1 = Math.ceil(component.tcx1 / scale);\n          subband.tby1 = Math.ceil(component.tcy1 / scale);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolution.subbands = [subband];\n        } else {\n          var bscale = 1 << decompositionLevelsCount - r + 1;\n          var resolutionSubbands = [];\n          subband = {};\n          subband.type = 'HL';\n          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);\n          subband.tby0 = Math.ceil(component.tcy0 / bscale);\n          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);\n          subband.tby1 = Math.ceil(component.tcy1 / bscale);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolutionSubbands.push(subband);\n          subband = {};\n          subband.type = 'LH';\n          subband.tbx0 = Math.ceil(component.tcx0 / bscale);\n          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);\n          subband.tbx1 = Math.ceil(component.tcx1 / bscale);\n          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolutionSubbands.push(subband);\n          subband = {};\n          subband.type = 'HH';\n          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);\n          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);\n          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);\n          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolutionSubbands.push(subband);\n          resolution.subbands = resolutionSubbands;\n        }\n      }\n      component.resolutions = resolutions;\n      component.subbands = subbands;\n    }\n    var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;\n    switch (progressionOrder) {\n      case 0:\n        tile.packetsIterator = new LayerResolutionComponentPositionIterator(context);\n        break;\n      case 1:\n        tile.packetsIterator = new ResolutionLayerComponentPositionIterator(context);\n        break;\n      case 2:\n        tile.packetsIterator = new ResolutionPositionComponentLayerIterator(context);\n        break;\n      case 3:\n        tile.packetsIterator = new PositionComponentResolutionLayerIterator(context);\n        break;\n      case 4:\n        tile.packetsIterator = new ComponentPositionResolutionLayerIterator(context);\n        break;\n      default:\n        throw new JpxError('Unsupported progression order ' + progressionOrder);\n    }\n  }\n  function parseTilePackets(context, data, offset, dataLength) {\n    var position = 0;\n    var buffer,\n        bufferSize = 0,\n        skipNextBit = false;\n    function readBits(count) {\n      while (bufferSize < count) {\n        var b = data[offset + position];\n        position++;\n        if (skipNextBit) {\n          buffer = buffer << 7 | b;\n          bufferSize += 7;\n          skipNextBit = false;\n        } else {\n          buffer = buffer << 8 | b;\n          bufferSize += 8;\n        }\n        if (b === 0xFF) {\n          skipNextBit = true;\n        }\n      }\n      bufferSize -= count;\n      return buffer >>> bufferSize & (1 << count) - 1;\n    }\n    function skipMarkerIfEqual(value) {\n      if (data[offset + position - 1] === 0xFF && data[offset + position] === value) {\n        skipBytes(1);\n        return true;\n      } else if (data[offset + position] === 0xFF && data[offset + position + 1] === value) {\n        skipBytes(2);\n        return true;\n      }\n      return false;\n    }\n    function skipBytes(count) {\n      position += count;\n    }\n    function alignToByte() {\n      bufferSize = 0;\n      if (skipNextBit) {\n        position++;\n        skipNextBit = false;\n      }\n    }\n    function readCodingpasses() {\n      if (readBits(1) === 0) {\n        return 1;\n      }\n      if (readBits(1) === 0) {\n        return 2;\n      }\n      var value = readBits(2);\n      if (value < 3) {\n        return value + 3;\n      }\n      value = readBits(5);\n      if (value < 31) {\n        return value + 6;\n      }\n      value = readBits(7);\n      return value + 37;\n    }\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var sopMarkerUsed = context.COD.sopMarkerUsed;\n    var ephMarkerUsed = context.COD.ephMarkerUsed;\n    var packetsIterator = tile.packetsIterator;\n    while (position < dataLength) {\n      alignToByte();\n      if (sopMarkerUsed && skipMarkerIfEqual(0x91)) {\n        skipBytes(4);\n      }\n      var packet = packetsIterator.nextPacket();\n      if (!readBits(1)) {\n        continue;\n      }\n      var layerNumber = packet.layerNumber;\n      var queue = [],\n          codeblock;\n      for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {\n        codeblock = packet.codeblocks[i];\n        var precinct = codeblock.precinct;\n        var codeblockColumn = codeblock.cbx - precinct.cbxMin;\n        var codeblockRow = codeblock.cby - precinct.cbyMin;\n        var codeblockIncluded = false;\n        var firstTimeInclusion = false;\n        var valueReady;\n        if (codeblock['included'] !== undefined) {\n          codeblockIncluded = !!readBits(1);\n        } else {\n          precinct = codeblock.precinct;\n          var inclusionTree, zeroBitPlanesTree;\n          if (precinct['inclusionTree'] !== undefined) {\n            inclusionTree = precinct.inclusionTree;\n          } else {\n            var width = precinct.cbxMax - precinct.cbxMin + 1;\n            var height = precinct.cbyMax - precinct.cbyMin + 1;\n            inclusionTree = new InclusionTree(width, height, layerNumber);\n            zeroBitPlanesTree = new TagTree(width, height);\n            precinct.inclusionTree = inclusionTree;\n            precinct.zeroBitPlanesTree = zeroBitPlanesTree;\n          }\n          if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {\n            while (true) {\n              if (readBits(1)) {\n                valueReady = !inclusionTree.nextLevel();\n                if (valueReady) {\n                  codeblock.included = true;\n                  codeblockIncluded = firstTimeInclusion = true;\n                  break;\n                }\n              } else {\n                inclusionTree.incrementValue(layerNumber);\n                break;\n              }\n            }\n          }\n        }\n        if (!codeblockIncluded) {\n          continue;\n        }\n        if (firstTimeInclusion) {\n          zeroBitPlanesTree = precinct.zeroBitPlanesTree;\n          zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);\n          while (true) {\n            if (readBits(1)) {\n              valueReady = !zeroBitPlanesTree.nextLevel();\n              if (valueReady) {\n                break;\n              }\n            } else {\n              zeroBitPlanesTree.incrementValue();\n            }\n          }\n          codeblock.zeroBitPlanes = zeroBitPlanesTree.value;\n        }\n        var codingpasses = readCodingpasses();\n        while (readBits(1)) {\n          codeblock.Lblock++;\n        }\n        var codingpassesLog2 = (0, _util.log2)(codingpasses);\n        var bits = (codingpasses < 1 << codingpassesLog2 ? codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock;\n        var codedDataLength = readBits(bits);\n        queue.push({\n          codeblock: codeblock,\n          codingpasses: codingpasses,\n          dataLength: codedDataLength\n        });\n      }\n      alignToByte();\n      if (ephMarkerUsed) {\n        skipMarkerIfEqual(0x92);\n      }\n      while (queue.length > 0) {\n        var packetItem = queue.shift();\n        codeblock = packetItem.codeblock;\n        if (codeblock['data'] === undefined) {\n          codeblock.data = [];\n        }\n        codeblock.data.push({\n          data: data,\n          start: offset + position,\n          end: offset + position + packetItem.dataLength,\n          codingpasses: packetItem.codingpasses\n        });\n        position += packetItem.dataLength;\n      }\n    }\n    return position;\n  }\n  function copyCoefficients(coefficients, levelWidth, levelHeight, subband, delta, mb, reversible, segmentationSymbolUsed) {\n    var x0 = subband.tbx0;\n    var y0 = subband.tby0;\n    var width = subband.tbx1 - subband.tbx0;\n    var codeblocks = subband.codeblocks;\n    var right = subband.type.charAt(0) === 'H' ? 1 : 0;\n    var bottom = subband.type.charAt(1) === 'H' ? levelWidth : 0;\n    for (var i = 0, ii = codeblocks.length; i < ii; ++i) {\n      var codeblock = codeblocks[i];\n      var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;\n      var blockHeight = codeblock.tby1_ - codeblock.tby0_;\n      if (blockWidth === 0 || blockHeight === 0) {\n        continue;\n      }\n      if (codeblock['data'] === undefined) {\n        continue;\n      }\n      var bitModel, currentCodingpassType;\n      bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, codeblock.zeroBitPlanes, mb);\n      currentCodingpassType = 2;\n      var data = codeblock.data,\n          totalLength = 0,\n          codingpasses = 0;\n      var j, jj, dataItem;\n      for (j = 0, jj = data.length; j < jj; j++) {\n        dataItem = data[j];\n        totalLength += dataItem.end - dataItem.start;\n        codingpasses += dataItem.codingpasses;\n      }\n      var encodedData = new Uint8Array(totalLength);\n      var position = 0;\n      for (j = 0, jj = data.length; j < jj; j++) {\n        dataItem = data[j];\n        var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);\n        encodedData.set(chunk, position);\n        position += chunk.length;\n      }\n      var decoder = new _arithmetic_decoder.ArithmeticDecoder(encodedData, 0, totalLength);\n      bitModel.setDecoder(decoder);\n      for (j = 0; j < codingpasses; j++) {\n        switch (currentCodingpassType) {\n          case 0:\n            bitModel.runSignificancePropagationPass();\n            break;\n          case 1:\n            bitModel.runMagnitudeRefinementPass();\n            break;\n          case 2:\n            bitModel.runCleanupPass();\n            if (segmentationSymbolUsed) {\n              bitModel.checkSegmentationSymbol();\n            }\n            break;\n        }\n        currentCodingpassType = (currentCodingpassType + 1) % 3;\n      }\n      var offset = codeblock.tbx0_ - x0 + (codeblock.tby0_ - y0) * width;\n      var sign = bitModel.coefficentsSign;\n      var magnitude = bitModel.coefficentsMagnitude;\n      var bitsDecoded = bitModel.bitsDecoded;\n      var magnitudeCorrection = reversible ? 0 : 0.5;\n      var k, n, nb;\n      position = 0;\n      var interleave = subband.type !== 'LL';\n      for (j = 0; j < blockHeight; j++) {\n        var row = offset / width | 0;\n        var levelOffset = 2 * row * (levelWidth - width) + right + bottom;\n        for (k = 0; k < blockWidth; k++) {\n          n = magnitude[position];\n          if (n !== 0) {\n            n = (n + magnitudeCorrection) * delta;\n            if (sign[position] !== 0) {\n              n = -n;\n            }\n            nb = bitsDecoded[position];\n            var pos = interleave ? levelOffset + (offset << 1) : offset;\n            if (reversible && nb >= mb) {\n              coefficients[pos] = n;\n            } else {\n              coefficients[pos] = n * (1 << mb - nb);\n            }\n          }\n          offset++;\n          position++;\n        }\n        offset += width - blockWidth;\n      }\n    }\n  }\n  function transformTile(context, tile, c) {\n    var component = tile.components[c];\n    var codingStyleParameters = component.codingStyleParameters;\n    var quantizationParameters = component.quantizationParameters;\n    var decompositionLevelsCount = codingStyleParameters.decompositionLevelsCount;\n    var spqcds = quantizationParameters.SPqcds;\n    var scalarExpounded = quantizationParameters.scalarExpounded;\n    var guardBits = quantizationParameters.guardBits;\n    var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed;\n    var precision = context.components[c].precision;\n    var reversible = codingStyleParameters.reversibleTransformation;\n    var transform = reversible ? new ReversibleTransform() : new IrreversibleTransform();\n    var subbandCoefficients = [];\n    var b = 0;\n    for (var i = 0; i <= decompositionLevelsCount; i++) {\n      var resolution = component.resolutions[i];\n      var width = resolution.trx1 - resolution.trx0;\n      var height = resolution.try1 - resolution.try0;\n      var coefficients = new Float32Array(width * height);\n      for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {\n        var mu, epsilon;\n        if (!scalarExpounded) {\n          mu = spqcds[0].mu;\n          epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);\n        } else {\n          mu = spqcds[b].mu;\n          epsilon = spqcds[b].epsilon;\n          b++;\n        }\n        var subband = resolution.subbands[j];\n        var gainLog2 = SubbandsGainLog2[subband.type];\n        var delta = reversible ? 1 : Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048);\n        var mb = guardBits + epsilon - 1;\n        copyCoefficients(coefficients, width, height, subband, delta, mb, reversible, segmentationSymbolUsed);\n      }\n      subbandCoefficients.push({\n        width: width,\n        height: height,\n        items: coefficients\n      });\n    }\n    var result = transform.calculate(subbandCoefficients, component.tcx0, component.tcy0);\n    return {\n      left: component.tcx0,\n      top: component.tcy0,\n      width: result.width,\n      height: result.height,\n      items: result.items\n    };\n  }\n  function transformComponents(context) {\n    var siz = context.SIZ;\n    var components = context.components;\n    var componentsCount = siz.Csiz;\n    var resultImages = [];\n    for (var i = 0, ii = context.tiles.length; i < ii; i++) {\n      var tile = context.tiles[i];\n      var transformedTiles = [];\n      var c;\n      for (c = 0; c < componentsCount; c++) {\n        transformedTiles[c] = transformTile(context, tile, c);\n      }\n      var tile0 = transformedTiles[0];\n      var out = new Uint8Array(tile0.items.length * componentsCount);\n      var result = {\n        left: tile0.left,\n        top: tile0.top,\n        width: tile0.width,\n        height: tile0.height,\n        items: out\n      };\n      var shift, offset, max, min, maxK;\n      var pos = 0,\n          j,\n          jj,\n          y0,\n          y1,\n          y2,\n          r,\n          g,\n          b,\n          k,\n          val;\n      if (tile.codingStyleDefaultParameters.multipleComponentTransform) {\n        var fourComponents = componentsCount === 4;\n        var y0items = transformedTiles[0].items;\n        var y1items = transformedTiles[1].items;\n        var y2items = transformedTiles[2].items;\n        var y3items = fourComponents ? transformedTiles[3].items : null;\n        shift = components[0].precision - 8;\n        offset = (128 << shift) + 0.5;\n        max = 255 * (1 << shift);\n        maxK = max * 0.5;\n        min = -maxK;\n        var component0 = tile.components[0];\n        var alpha01 = componentsCount - 3;\n        jj = y0items.length;\n        if (!component0.codingStyleParameters.reversibleTransformation) {\n          for (j = 0; j < jj; j++, pos += alpha01) {\n            y0 = y0items[j] + offset;\n            y1 = y1items[j];\n            y2 = y2items[j];\n            r = y0 + 1.402 * y2;\n            g = y0 - 0.34413 * y1 - 0.71414 * y2;\n            b = y0 + 1.772 * y1;\n            out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift;\n            out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift;\n            out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift;\n          }\n        } else {\n          for (j = 0; j < jj; j++, pos += alpha01) {\n            y0 = y0items[j] + offset;\n            y1 = y1items[j];\n            y2 = y2items[j];\n            g = y0 - (y2 + y1 >> 2);\n            r = g + y2;\n            b = g + y1;\n            out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift;\n            out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift;\n            out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift;\n          }\n        }\n        if (fourComponents) {\n          for (j = 0, pos = 3; j < jj; j++, pos += 4) {\n            k = y3items[j];\n            out[pos] = k <= min ? 0 : k >= maxK ? 255 : k + offset >> shift;\n          }\n        }\n      } else {\n        for (c = 0; c < componentsCount; c++) {\n          var items = transformedTiles[c].items;\n          shift = components[c].precision - 8;\n          offset = (128 << shift) + 0.5;\n          max = 127.5 * (1 << shift);\n          min = -max;\n          for (pos = c, j = 0, jj = items.length; j < jj; j++) {\n            val = items[j];\n            out[pos] = val <= min ? 0 : val >= max ? 255 : val + offset >> shift;\n            pos += componentsCount;\n          }\n        }\n      }\n      resultImages.push(result);\n    }\n    return resultImages;\n  }\n  function initializeTile(context, tileIndex) {\n    var siz = context.SIZ;\n    var componentsCount = siz.Csiz;\n    var tile = context.tiles[tileIndex];\n    for (var c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      var qcdOrQcc = context.currentTile.QCC[c] !== undefined ? context.currentTile.QCC[c] : context.currentTile.QCD;\n      component.quantizationParameters = qcdOrQcc;\n      var codOrCoc = context.currentTile.COC[c] !== undefined ? context.currentTile.COC[c] : context.currentTile.COD;\n      component.codingStyleParameters = codOrCoc;\n    }\n    tile.codingStyleDefaultParameters = context.currentTile.COD;\n  }\n  var TagTree = function TagTreeClosure() {\n    function TagTree(width, height) {\n      var levelsLength = (0, _util.log2)(Math.max(width, height)) + 1;\n      this.levels = [];\n      for (var i = 0; i < levelsLength; i++) {\n        var level = {\n          width: width,\n          height: height,\n          items: []\n        };\n        this.levels.push(level);\n        width = Math.ceil(width / 2);\n        height = Math.ceil(height / 2);\n      }\n    }\n    TagTree.prototype = {\n      reset: function TagTree_reset(i, j) {\n        var currentLevel = 0,\n            value = 0,\n            level;\n        while (currentLevel < this.levels.length) {\n          level = this.levels[currentLevel];\n          var index = i + j * level.width;\n          if (level.items[index] !== undefined) {\n            value = level.items[index];\n            break;\n          }\n          level.index = index;\n          i >>= 1;\n          j >>= 1;\n          currentLevel++;\n        }\n        currentLevel--;\n        level = this.levels[currentLevel];\n        level.items[level.index] = value;\n        this.currentLevel = currentLevel;\n        delete this.value;\n      },\n      incrementValue: function TagTree_incrementValue() {\n        var level = this.levels[this.currentLevel];\n        level.items[level.index]++;\n      },\n      nextLevel: function TagTree_nextLevel() {\n        var currentLevel = this.currentLevel;\n        var level = this.levels[currentLevel];\n        var value = level.items[level.index];\n        currentLevel--;\n        if (currentLevel < 0) {\n          this.value = value;\n          return false;\n        }\n        this.currentLevel = currentLevel;\n        level = this.levels[currentLevel];\n        level.items[level.index] = value;\n        return true;\n      }\n    };\n    return TagTree;\n  }();\n  var InclusionTree = function InclusionTreeClosure() {\n    function InclusionTree(width, height, defaultValue) {\n      var levelsLength = (0, _util.log2)(Math.max(width, height)) + 1;\n      this.levels = [];\n      for (var i = 0; i < levelsLength; i++) {\n        var items = new Uint8Array(width * height);\n        for (var j = 0, jj = items.length; j < jj; j++) {\n          items[j] = defaultValue;\n        }\n        var level = {\n          width: width,\n          height: height,\n          items: items\n        };\n        this.levels.push(level);\n        width = Math.ceil(width / 2);\n        height = Math.ceil(height / 2);\n      }\n    }\n    InclusionTree.prototype = {\n      reset: function InclusionTree_reset(i, j, stopValue) {\n        var currentLevel = 0;\n        while (currentLevel < this.levels.length) {\n          var level = this.levels[currentLevel];\n          var index = i + j * level.width;\n          level.index = index;\n          var value = level.items[index];\n          if (value === 0xFF) {\n            break;\n          }\n          if (value > stopValue) {\n            this.currentLevel = currentLevel;\n            this.propagateValues();\n            return false;\n          }\n          i >>= 1;\n          j >>= 1;\n          currentLevel++;\n        }\n        this.currentLevel = currentLevel - 1;\n        return true;\n      },\n      incrementValue: function InclusionTree_incrementValue(stopValue) {\n        var level = this.levels[this.currentLevel];\n        level.items[level.index] = stopValue + 1;\n        this.propagateValues();\n      },\n      propagateValues: function InclusionTree_propagateValues() {\n        var levelIndex = this.currentLevel;\n        var level = this.levels[levelIndex];\n        var currentValue = level.items[level.index];\n        while (--levelIndex >= 0) {\n          level = this.levels[levelIndex];\n          level.items[level.index] = currentValue;\n        }\n      },\n      nextLevel: function InclusionTree_nextLevel() {\n        var currentLevel = this.currentLevel;\n        var level = this.levels[currentLevel];\n        var value = level.items[level.index];\n        level.items[level.index] = 0xFF;\n        currentLevel--;\n        if (currentLevel < 0) {\n          return false;\n        }\n        this.currentLevel = currentLevel;\n        level = this.levels[currentLevel];\n        level.items[level.index] = value;\n        return true;\n      }\n    };\n    return InclusionTree;\n  }();\n  var BitModel = function BitModelClosure() {\n    var UNIFORM_CONTEXT = 17;\n    var RUNLENGTH_CONTEXT = 18;\n    var LLAndLHContextsLabel = new Uint8Array([0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8]);\n    var HLContextLabel = new Uint8Array([0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8]);\n    var HHContextLabel = new Uint8Array([0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5, 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8]);\n    function BitModel(width, height, subband, zeroBitPlanes, mb) {\n      this.width = width;\n      this.height = height;\n      this.contextLabelTable = subband === 'HH' ? HHContextLabel : subband === 'HL' ? HLContextLabel : LLAndLHContextsLabel;\n      var coefficientCount = width * height;\n      this.neighborsSignificance = new Uint8Array(coefficientCount);\n      this.coefficentsSign = new Uint8Array(coefficientCount);\n      this.coefficentsMagnitude = mb > 14 ? new Uint32Array(coefficientCount) : mb > 6 ? new Uint16Array(coefficientCount) : new Uint8Array(coefficientCount);\n      this.processingFlags = new Uint8Array(coefficientCount);\n      var bitsDecoded = new Uint8Array(coefficientCount);\n      if (zeroBitPlanes !== 0) {\n        for (var i = 0; i < coefficientCount; i++) {\n          bitsDecoded[i] = zeroBitPlanes;\n        }\n      }\n      this.bitsDecoded = bitsDecoded;\n      this.reset();\n    }\n    BitModel.prototype = {\n      setDecoder: function BitModel_setDecoder(decoder) {\n        this.decoder = decoder;\n      },\n      reset: function BitModel_reset() {\n        this.contexts = new Int8Array(19);\n        this.contexts[0] = 4 << 1 | 0;\n        this.contexts[UNIFORM_CONTEXT] = 46 << 1 | 0;\n        this.contexts[RUNLENGTH_CONTEXT] = 3 << 1 | 0;\n      },\n      setNeighborsSignificance: function BitModel_setNeighborsSignificance(row, column, index) {\n        var neighborsSignificance = this.neighborsSignificance;\n        var width = this.width,\n            height = this.height;\n        var left = column > 0;\n        var right = column + 1 < width;\n        var i;\n        if (row > 0) {\n          i = index - width;\n          if (left) {\n            neighborsSignificance[i - 1] += 0x10;\n          }\n          if (right) {\n            neighborsSignificance[i + 1] += 0x10;\n          }\n          neighborsSignificance[i] += 0x04;\n        }\n        if (row + 1 < height) {\n          i = index + width;\n          if (left) {\n            neighborsSignificance[i - 1] += 0x10;\n          }\n          if (right) {\n            neighborsSignificance[i + 1] += 0x10;\n          }\n          neighborsSignificance[i] += 0x04;\n        }\n        if (left) {\n          neighborsSignificance[index - 1] += 0x01;\n        }\n        if (right) {\n          neighborsSignificance[index + 1] += 0x01;\n        }\n        neighborsSignificance[index] |= 0x80;\n      },\n      runSignificancePropagationPass: function BitModel_runSignificancePropagationPass() {\n        var decoder = this.decoder;\n        var width = this.width,\n            height = this.height;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var coefficentsSign = this.coefficentsSign;\n        var neighborsSignificance = this.neighborsSignificance;\n        var processingFlags = this.processingFlags;\n        var contexts = this.contexts;\n        var labels = this.contextLabelTable;\n        var bitsDecoded = this.bitsDecoded;\n        var processedInverseMask = ~1;\n        var processedMask = 1;\n        var firstMagnitudeBitMask = 2;\n        for (var i0 = 0; i0 < height; i0 += 4) {\n          for (var j = 0; j < width; j++) {\n            var index = i0 * width + j;\n            for (var i1 = 0; i1 < 4; i1++, index += width) {\n              var i = i0 + i1;\n              if (i >= height) {\n                break;\n              }\n              processingFlags[index] &= processedInverseMask;\n              if (coefficentsMagnitude[index] || !neighborsSignificance[index]) {\n                continue;\n              }\n              var contextLabel = labels[neighborsSignificance[index]];\n              var decision = decoder.readBit(contexts, contextLabel);\n              if (decision) {\n                var sign = this.decodeSignBit(i, j, index);\n                coefficentsSign[index] = sign;\n                coefficentsMagnitude[index] = 1;\n                this.setNeighborsSignificance(i, j, index);\n                processingFlags[index] |= firstMagnitudeBitMask;\n              }\n              bitsDecoded[index]++;\n              processingFlags[index] |= processedMask;\n            }\n          }\n        }\n      },\n      decodeSignBit: function BitModel_decodeSignBit(row, column, index) {\n        var width = this.width,\n            height = this.height;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var coefficentsSign = this.coefficentsSign;\n        var contribution, sign0, sign1, significance1;\n        var contextLabel, decoded;\n        significance1 = column > 0 && coefficentsMagnitude[index - 1] !== 0;\n        if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) {\n          sign1 = coefficentsSign[index + 1];\n          if (significance1) {\n            sign0 = coefficentsSign[index - 1];\n            contribution = 1 - sign1 - sign0;\n          } else {\n            contribution = 1 - sign1 - sign1;\n          }\n        } else if (significance1) {\n          sign0 = coefficentsSign[index - 1];\n          contribution = 1 - sign0 - sign0;\n        } else {\n          contribution = 0;\n        }\n        var horizontalContribution = 3 * contribution;\n        significance1 = row > 0 && coefficentsMagnitude[index - width] !== 0;\n        if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) {\n          sign1 = coefficentsSign[index + width];\n          if (significance1) {\n            sign0 = coefficentsSign[index - width];\n            contribution = 1 - sign1 - sign0 + horizontalContribution;\n          } else {\n            contribution = 1 - sign1 - sign1 + horizontalContribution;\n          }\n        } else if (significance1) {\n          sign0 = coefficentsSign[index - width];\n          contribution = 1 - sign0 - sign0 + horizontalContribution;\n        } else {\n          contribution = horizontalContribution;\n        }\n        if (contribution >= 0) {\n          contextLabel = 9 + contribution;\n          decoded = this.decoder.readBit(this.contexts, contextLabel);\n        } else {\n          contextLabel = 9 - contribution;\n          decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1;\n        }\n        return decoded;\n      },\n      runMagnitudeRefinementPass: function BitModel_runMagnitudeRefinementPass() {\n        var decoder = this.decoder;\n        var width = this.width,\n            height = this.height;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var neighborsSignificance = this.neighborsSignificance;\n        var contexts = this.contexts;\n        var bitsDecoded = this.bitsDecoded;\n        var processingFlags = this.processingFlags;\n        var processedMask = 1;\n        var firstMagnitudeBitMask = 2;\n        var length = width * height;\n        var width4 = width * 4;\n        for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) {\n          indexNext = Math.min(length, index0 + width4);\n          for (var j = 0; j < width; j++) {\n            for (var index = index0 + j; index < indexNext; index += width) {\n              if (!coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) {\n                continue;\n              }\n              var contextLabel = 16;\n              if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) {\n                processingFlags[index] ^= firstMagnitudeBitMask;\n                var significance = neighborsSignificance[index] & 127;\n                contextLabel = significance === 0 ? 15 : 14;\n              }\n              var bit = decoder.readBit(contexts, contextLabel);\n              coefficentsMagnitude[index] = coefficentsMagnitude[index] << 1 | bit;\n              bitsDecoded[index]++;\n              processingFlags[index] |= processedMask;\n            }\n          }\n        }\n      },\n      runCleanupPass: function BitModel_runCleanupPass() {\n        var decoder = this.decoder;\n        var width = this.width,\n            height = this.height;\n        var neighborsSignificance = this.neighborsSignificance;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var coefficentsSign = this.coefficentsSign;\n        var contexts = this.contexts;\n        var labels = this.contextLabelTable;\n        var bitsDecoded = this.bitsDecoded;\n        var processingFlags = this.processingFlags;\n        var processedMask = 1;\n        var firstMagnitudeBitMask = 2;\n        var oneRowDown = width;\n        var twoRowsDown = width * 2;\n        var threeRowsDown = width * 3;\n        var iNext;\n        for (var i0 = 0; i0 < height; i0 = iNext) {\n          iNext = Math.min(i0 + 4, height);\n          var indexBase = i0 * width;\n          var checkAllEmpty = i0 + 3 < height;\n          for (var j = 0; j < width; j++) {\n            var index0 = indexBase + j;\n            var allEmpty = checkAllEmpty && processingFlags[index0] === 0 && processingFlags[index0 + oneRowDown] === 0 && processingFlags[index0 + twoRowsDown] === 0 && processingFlags[index0 + threeRowsDown] === 0 && neighborsSignificance[index0] === 0 && neighborsSignificance[index0 + oneRowDown] === 0 && neighborsSignificance[index0 + twoRowsDown] === 0 && neighborsSignificance[index0 + threeRowsDown] === 0;\n            var i1 = 0,\n                index = index0;\n            var i = i0,\n                sign;\n            if (allEmpty) {\n              var hasSignificantCoefficent = decoder.readBit(contexts, RUNLENGTH_CONTEXT);\n              if (!hasSignificantCoefficent) {\n                bitsDecoded[index0]++;\n                bitsDecoded[index0 + oneRowDown]++;\n                bitsDecoded[index0 + twoRowsDown]++;\n                bitsDecoded[index0 + threeRowsDown]++;\n                continue;\n              }\n              i1 = decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT);\n              if (i1 !== 0) {\n                i = i0 + i1;\n                index += i1 * width;\n              }\n              sign = this.decodeSignBit(i, j, index);\n              coefficentsSign[index] = sign;\n              coefficentsMagnitude[index] = 1;\n              this.setNeighborsSignificance(i, j, index);\n              processingFlags[index] |= firstMagnitudeBitMask;\n              index = index0;\n              for (var i2 = i0; i2 <= i; i2++, index += width) {\n                bitsDecoded[index]++;\n              }\n              i1++;\n            }\n            for (i = i0 + i1; i < iNext; i++, index += width) {\n              if (coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) {\n                continue;\n              }\n              var contextLabel = labels[neighborsSignificance[index]];\n              var decision = decoder.readBit(contexts, contextLabel);\n              if (decision === 1) {\n                sign = this.decodeSignBit(i, j, index);\n                coefficentsSign[index] = sign;\n                coefficentsMagnitude[index] = 1;\n                this.setNeighborsSignificance(i, j, index);\n                processingFlags[index] |= firstMagnitudeBitMask;\n              }\n              bitsDecoded[index]++;\n            }\n          }\n        }\n      },\n      checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() {\n        var decoder = this.decoder;\n        var contexts = this.contexts;\n        var symbol = decoder.readBit(contexts, UNIFORM_CONTEXT) << 3 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 2 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT);\n        if (symbol !== 0xA) {\n          throw new JpxError('Invalid segmentation symbol');\n        }\n      }\n    };\n    return BitModel;\n  }();\n  var Transform = function TransformClosure() {\n    function Transform() {}\n    Transform.prototype.calculate = function transformCalculate(subbands, u0, v0) {\n      var ll = subbands[0];\n      for (var i = 1, ii = subbands.length; i < ii; i++) {\n        ll = this.iterate(ll, subbands[i], u0, v0);\n      }\n      return ll;\n    };\n    Transform.prototype.extend = function extend(buffer, offset, size) {\n      var i1 = offset - 1,\n          j1 = offset + 1;\n      var i2 = offset + size - 2,\n          j2 = offset + size;\n      buffer[i1--] = buffer[j1++];\n      buffer[j2++] = buffer[i2--];\n      buffer[i1--] = buffer[j1++];\n      buffer[j2++] = buffer[i2--];\n      buffer[i1--] = buffer[j1++];\n      buffer[j2++] = buffer[i2--];\n      buffer[i1] = buffer[j1];\n      buffer[j2] = buffer[i2];\n    };\n    Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh, u0, v0) {\n      var llWidth = ll.width,\n          llHeight = ll.height,\n          llItems = ll.items;\n      var width = hl_lh_hh.width;\n      var height = hl_lh_hh.height;\n      var items = hl_lh_hh.items;\n      var i, j, k, l, u, v;\n      for (k = 0, i = 0; i < llHeight; i++) {\n        l = i * 2 * width;\n        for (j = 0; j < llWidth; j++, k++, l += 2) {\n          items[l] = llItems[k];\n        }\n      }\n      llItems = ll.items = null;\n      var bufferPadding = 4;\n      var rowBuffer = new Float32Array(width + 2 * bufferPadding);\n      if (width === 1) {\n        if ((u0 & 1) !== 0) {\n          for (v = 0, k = 0; v < height; v++, k += width) {\n            items[k] *= 0.5;\n          }\n        }\n      } else {\n        for (v = 0, k = 0; v < height; v++, k += width) {\n          rowBuffer.set(items.subarray(k, k + width), bufferPadding);\n          this.extend(rowBuffer, bufferPadding, width);\n          this.filter(rowBuffer, bufferPadding, width);\n          items.set(rowBuffer.subarray(bufferPadding, bufferPadding + width), k);\n        }\n      }\n      var numBuffers = 16;\n      var colBuffers = [];\n      for (i = 0; i < numBuffers; i++) {\n        colBuffers.push(new Float32Array(height + 2 * bufferPadding));\n      }\n      var b,\n          currentBuffer = 0;\n      ll = bufferPadding + height;\n      if (height === 1) {\n        if ((v0 & 1) !== 0) {\n          for (u = 0; u < width; u++) {\n            items[u] *= 0.5;\n          }\n        }\n      } else {\n        for (u = 0; u < width; u++) {\n          if (currentBuffer === 0) {\n            numBuffers = Math.min(width - u, numBuffers);\n            for (k = u, l = bufferPadding; l < ll; k += width, l++) {\n              for (b = 0; b < numBuffers; b++) {\n                colBuffers[b][l] = items[k + b];\n              }\n            }\n            currentBuffer = numBuffers;\n          }\n          currentBuffer--;\n          var buffer = colBuffers[currentBuffer];\n          this.extend(buffer, bufferPadding, height);\n          this.filter(buffer, bufferPadding, height);\n          if (currentBuffer === 0) {\n            k = u - numBuffers + 1;\n            for (l = bufferPadding; l < ll; k += width, l++) {\n              for (b = 0; b < numBuffers; b++) {\n                items[k + b] = colBuffers[b][l];\n              }\n            }\n          }\n        }\n      }\n      return {\n        width: width,\n        height: height,\n        items: items\n      };\n    };\n    return Transform;\n  }();\n  var IrreversibleTransform = function IrreversibleTransformClosure() {\n    function IrreversibleTransform() {\n      Transform.call(this);\n    }\n    IrreversibleTransform.prototype = Object.create(Transform.prototype);\n    IrreversibleTransform.prototype.filter = function irreversibleTransformFilter(x, offset, length) {\n      var len = length >> 1;\n      offset = offset | 0;\n      var j, n, current, next;\n      var alpha = -1.586134342059924;\n      var beta = -0.052980118572961;\n      var gamma = 0.882911075530934;\n      var delta = 0.443506852043971;\n      var K = 1.230174104914001;\n      var K_ = 1 / K;\n      j = offset - 3;\n      for (n = len + 4; n--; j += 2) {\n        x[j] *= K_;\n      }\n      j = offset - 2;\n      current = delta * x[j - 1];\n      for (n = len + 3; n--; j += 2) {\n        next = delta * x[j + 1];\n        x[j] = K * x[j] - current - next;\n        if (n--) {\n          j += 2;\n          current = delta * x[j + 1];\n          x[j] = K * x[j] - current - next;\n        } else {\n          break;\n        }\n      }\n      j = offset - 1;\n      current = gamma * x[j - 1];\n      for (n = len + 2; n--; j += 2) {\n        next = gamma * x[j + 1];\n        x[j] -= current + next;\n        if (n--) {\n          j += 2;\n          current = gamma * x[j + 1];\n          x[j] -= current + next;\n        } else {\n          break;\n        }\n      }\n      j = offset;\n      current = beta * x[j - 1];\n      for (n = len + 1; n--; j += 2) {\n        next = beta * x[j + 1];\n        x[j] -= current + next;\n        if (n--) {\n          j += 2;\n          current = beta * x[j + 1];\n          x[j] -= current + next;\n        } else {\n          break;\n        }\n      }\n      if (len !== 0) {\n        j = offset + 1;\n        current = alpha * x[j - 1];\n        for (n = len; n--; j += 2) {\n          next = alpha * x[j + 1];\n          x[j] -= current + next;\n          if (n--) {\n            j += 2;\n            current = alpha * x[j + 1];\n            x[j] -= current + next;\n          } else {\n            break;\n          }\n        }\n      }\n    };\n    return IrreversibleTransform;\n  }();\n  var ReversibleTransform = function ReversibleTransformClosure() {\n    function ReversibleTransform() {\n      Transform.call(this);\n    }\n    ReversibleTransform.prototype = Object.create(Transform.prototype);\n    ReversibleTransform.prototype.filter = function reversibleTransformFilter(x, offset, length) {\n      var len = length >> 1;\n      offset = offset | 0;\n      var j, n;\n      for (j = offset, n = len + 1; n--; j += 2) {\n        x[j] -= x[j - 1] + x[j + 1] + 2 >> 2;\n      }\n      for (j = offset + 1, n = len; n--; j += 2) {\n        x[j] += x[j - 1] + x[j + 1] >> 1;\n      }\n    };\n    return ReversibleTransform;\n  }();\n  return JpxImage;\n}();\nexports.JpxImage = JpxImage;\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.FileSpec = exports.XRef = exports.ObjectLoader = exports.Catalog = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _parser = __w_pdfjs_require__(5);\n\nvar _chunked_stream = __w_pdfjs_require__(11);\n\nvar _crypto = __w_pdfjs_require__(12);\n\nvar _colorspace = __w_pdfjs_require__(3);\n\nvar Catalog = function CatalogClosure() {\n  function Catalog(pdfManager, xref, pageFactory) {\n    this.pdfManager = pdfManager;\n    this.xref = xref;\n    this.catDict = xref.getCatalogObj();\n    if (!(0, _primitives.isDict)(this.catDict)) {\n      throw new _util.FormatError('catalog object is not a dictionary');\n    }\n    this.fontCache = new _primitives.RefSetCache();\n    this.builtInCMapCache = Object.create(null);\n    this.pageKidsCountCache = new _primitives.RefSetCache();\n    this.pageFactory = pageFactory;\n    this.pagePromises = [];\n  }\n  Catalog.prototype = {\n    get metadata() {\n      var streamRef = this.catDict.getRaw('Metadata');\n      if (!(0, _primitives.isRef)(streamRef)) {\n        return (0, _util.shadow)(this, 'metadata', null);\n      }\n      var encryptMetadata = !this.xref.encrypt ? false : this.xref.encrypt.encryptMetadata;\n      var stream = this.xref.fetch(streamRef, !encryptMetadata);\n      var metadata;\n      if (stream && (0, _primitives.isDict)(stream.dict)) {\n        var type = stream.dict.get('Type');\n        var subtype = stream.dict.get('Subtype');\n        if ((0, _primitives.isName)(type, 'Metadata') && (0, _primitives.isName)(subtype, 'XML')) {\n          try {\n            metadata = (0, _util.stringToUTF8String)((0, _util.bytesToString)(stream.getBytes()));\n          } catch (e) {\n            if (e instanceof _util.MissingDataException) {\n              throw e;\n            }\n            (0, _util.info)('Skipping invalid metadata.');\n          }\n        }\n      }\n      return (0, _util.shadow)(this, 'metadata', metadata);\n    },\n    get toplevelPagesDict() {\n      var pagesObj = this.catDict.get('Pages');\n      if (!(0, _primitives.isDict)(pagesObj)) {\n        throw new _util.FormatError('invalid top-level pages dictionary');\n      }\n      return (0, _util.shadow)(this, 'toplevelPagesDict', pagesObj);\n    },\n    get documentOutline() {\n      var obj = null;\n      try {\n        obj = this.readDocumentOutline();\n      } catch (ex) {\n        if (ex instanceof _util.MissingDataException) {\n          throw ex;\n        }\n        (0, _util.warn)('Unable to read document outline');\n      }\n      return (0, _util.shadow)(this, 'documentOutline', obj);\n    },\n    readDocumentOutline: function Catalog_readDocumentOutline() {\n      var obj = this.catDict.get('Outlines');\n      if (!(0, _primitives.isDict)(obj)) {\n        return null;\n      }\n      obj = obj.getRaw('First');\n      if (!(0, _primitives.isRef)(obj)) {\n        return null;\n      }\n      var root = { items: [] };\n      var queue = [{\n        obj: obj,\n        parent: root\n      }];\n      var processed = new _primitives.RefSet();\n      processed.put(obj);\n      var xref = this.xref,\n          blackColor = new Uint8Array(3);\n      while (queue.length > 0) {\n        var i = queue.shift();\n        var outlineDict = xref.fetchIfRef(i.obj);\n        if (outlineDict === null) {\n          continue;\n        }\n        if (!outlineDict.has('Title')) {\n          throw new _util.FormatError('Invalid outline item');\n        }\n        var data = {\n          url: null,\n          dest: null\n        };\n        Catalog.parseDestDictionary({\n          destDict: outlineDict,\n          resultObj: data,\n          docBaseUrl: this.pdfManager.docBaseUrl\n        });\n        var title = outlineDict.get('Title');\n        var flags = outlineDict.get('F') || 0;\n        var color = outlineDict.getArray('C'),\n            rgbColor = blackColor;\n        if ((0, _util.isArray)(color) && color.length === 3 && (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) {\n          rgbColor = _colorspace.ColorSpace.singletons.rgb.getRgb(color, 0);\n        }\n        var outlineItem = {\n          dest: data.dest,\n          url: data.url,\n          unsafeUrl: data.unsafeUrl,\n          newWindow: data.newWindow,\n          title: (0, _util.stringToPDFString)(title),\n          color: rgbColor,\n          count: outlineDict.get('Count'),\n          bold: !!(flags & 2),\n          italic: !!(flags & 1),\n          items: []\n        };\n        i.parent.items.push(outlineItem);\n        obj = outlineDict.getRaw('First');\n        if ((0, _primitives.isRef)(obj) && !processed.has(obj)) {\n          queue.push({\n            obj: obj,\n            parent: outlineItem\n          });\n          processed.put(obj);\n        }\n        obj = outlineDict.getRaw('Next');\n        if ((0, _primitives.isRef)(obj) && !processed.has(obj)) {\n          queue.push({\n            obj: obj,\n            parent: i.parent\n          });\n          processed.put(obj);\n        }\n      }\n      return root.items.length > 0 ? root.items : null;\n    },\n    get numPages() {\n      var obj = this.toplevelPagesDict.get('Count');\n      if (!(0, _util.isInt)(obj)) {\n        throw new _util.FormatError('page count in top level pages object is not an integer');\n      }\n      return (0, _util.shadow)(this, 'numPages', obj);\n    },\n    get destinations() {\n      function fetchDestination(dest) {\n        return (0, _primitives.isDict)(dest) ? dest.get('D') : dest;\n      }\n      var xref = this.xref;\n      var dests = {},\n          nameTreeRef,\n          nameDictionaryRef;\n      var obj = this.catDict.get('Names');\n      if (obj && obj.has('Dests')) {\n        nameTreeRef = obj.getRaw('Dests');\n      } else if (this.catDict.has('Dests')) {\n        nameDictionaryRef = this.catDict.get('Dests');\n      }\n      if (nameDictionaryRef) {\n        obj = nameDictionaryRef;\n        obj.forEach(function catalogForEach(key, value) {\n          if (!value) {\n            return;\n          }\n          dests[key] = fetchDestination(value);\n        });\n      }\n      if (nameTreeRef) {\n        var nameTree = new NameTree(nameTreeRef, xref);\n        var names = nameTree.getAll();\n        for (var name in names) {\n          dests[name] = fetchDestination(names[name]);\n        }\n      }\n      return (0, _util.shadow)(this, 'destinations', dests);\n    },\n    getDestination: function Catalog_getDestination(destinationId) {\n      function fetchDestination(dest) {\n        return (0, _primitives.isDict)(dest) ? dest.get('D') : dest;\n      }\n      var xref = this.xref;\n      var dest = null,\n          nameTreeRef,\n          nameDictionaryRef;\n      var obj = this.catDict.get('Names');\n      if (obj && obj.has('Dests')) {\n        nameTreeRef = obj.getRaw('Dests');\n      } else if (this.catDict.has('Dests')) {\n        nameDictionaryRef = this.catDict.get('Dests');\n      }\n      if (nameDictionaryRef) {\n        var value = nameDictionaryRef.get(destinationId);\n        if (value) {\n          dest = fetchDestination(value);\n        }\n      }\n      if (nameTreeRef) {\n        var nameTree = new NameTree(nameTreeRef, xref);\n        dest = fetchDestination(nameTree.get(destinationId));\n      }\n      return dest;\n    },\n    get pageLabels() {\n      var obj = null;\n      try {\n        obj = this.readPageLabels();\n      } catch (ex) {\n        if (ex instanceof _util.MissingDataException) {\n          throw ex;\n        }\n        (0, _util.warn)('Unable to read page labels.');\n      }\n      return (0, _util.shadow)(this, 'pageLabels', obj);\n    },\n    readPageLabels: function Catalog_readPageLabels() {\n      var obj = this.catDict.getRaw('PageLabels');\n      if (!obj) {\n        return null;\n      }\n      var pageLabels = new Array(this.numPages);\n      var style = null;\n      var prefix = '';\n      var numberTree = new NumberTree(obj, this.xref);\n      var nums = numberTree.getAll();\n      var currentLabel = '',\n          currentIndex = 1;\n      for (var i = 0, ii = this.numPages; i < ii; i++) {\n        if (i in nums) {\n          var labelDict = nums[i];\n          if (!(0, _primitives.isDict)(labelDict)) {\n            throw new _util.FormatError('The PageLabel is not a dictionary.');\n          }\n          var type = labelDict.get('Type');\n          if (type && !(0, _primitives.isName)(type, 'PageLabel')) {\n            throw new _util.FormatError('Invalid type in PageLabel dictionary.');\n          }\n          var s = labelDict.get('S');\n          if (s && !(0, _primitives.isName)(s)) {\n            throw new _util.FormatError('Invalid style in PageLabel dictionary.');\n          }\n          style = s ? s.name : null;\n          var p = labelDict.get('P');\n          if (p && !(0, _util.isString)(p)) {\n            throw new _util.FormatError('Invalid prefix in PageLabel dictionary.');\n          }\n          prefix = p ? (0, _util.stringToPDFString)(p) : '';\n          var st = labelDict.get('St');\n          if (st && !((0, _util.isInt)(st) && st >= 1)) {\n            throw new _util.FormatError('Invalid start in PageLabel dictionary.');\n          }\n          currentIndex = st || 1;\n        }\n        switch (style) {\n          case 'D':\n            currentLabel = currentIndex;\n            break;\n          case 'R':\n          case 'r':\n            currentLabel = _util.Util.toRoman(currentIndex, style === 'r');\n            break;\n          case 'A':\n          case 'a':\n            var LIMIT = 26;\n            var A_UPPER_CASE = 0x41,\n                A_LOWER_CASE = 0x61;\n            var baseCharCode = style === 'a' ? A_LOWER_CASE : A_UPPER_CASE;\n            var letterIndex = currentIndex - 1;\n            var character = String.fromCharCode(baseCharCode + letterIndex % LIMIT);\n            var charBuf = [];\n            for (var j = 0, jj = letterIndex / LIMIT | 0; j <= jj; j++) {\n              charBuf.push(character);\n            }\n            currentLabel = charBuf.join('');\n            break;\n          default:\n            if (style) {\n              throw new _util.FormatError('Invalid style \"' + style + '\" in PageLabel dictionary.');\n            }\n        }\n        pageLabels[i] = prefix + currentLabel;\n        currentLabel = '';\n        currentIndex++;\n      }\n      return pageLabels;\n    },\n    get pageMode() {\n      var obj = this.catDict.get('PageMode');\n      var pageMode = 'UseNone';\n      if ((0, _primitives.isName)(obj)) {\n        switch (obj.name) {\n          case 'UseNone':\n          case 'UseOutlines':\n          case 'UseThumbs':\n          case 'FullScreen':\n          case 'UseOC':\n          case 'UseAttachments':\n            pageMode = obj.name;\n        }\n      }\n      return (0, _util.shadow)(this, 'pageMode', pageMode);\n    },\n    get attachments() {\n      var xref = this.xref;\n      var attachments = null,\n          nameTreeRef;\n      var obj = this.catDict.get('Names');\n      if (obj) {\n        nameTreeRef = obj.getRaw('EmbeddedFiles');\n      }\n      if (nameTreeRef) {\n        var nameTree = new NameTree(nameTreeRef, xref);\n        var names = nameTree.getAll();\n        for (var name in names) {\n          var fs = new FileSpec(names[name], xref);\n          if (!attachments) {\n            attachments = Object.create(null);\n          }\n          attachments[(0, _util.stringToPDFString)(name)] = fs.serializable;\n        }\n      }\n      return (0, _util.shadow)(this, 'attachments', attachments);\n    },\n    get javaScript() {\n      var xref = this.xref;\n      var obj = this.catDict.get('Names');\n      var javaScript = [];\n      function appendIfJavaScriptDict(jsDict) {\n        var type = jsDict.get('S');\n        if (!(0, _primitives.isName)(type, 'JavaScript')) {\n          return;\n        }\n        var js = jsDict.get('JS');\n        if ((0, _primitives.isStream)(js)) {\n          js = (0, _util.bytesToString)(js.getBytes());\n        } else if (!(0, _util.isString)(js)) {\n          return;\n        }\n        javaScript.push((0, _util.stringToPDFString)(js));\n      }\n      if (obj && obj.has('JavaScript')) {\n        var nameTree = new NameTree(obj.getRaw('JavaScript'), xref);\n        var names = nameTree.getAll();\n        for (var name in names) {\n          var jsDict = names[name];\n          if ((0, _primitives.isDict)(jsDict)) {\n            appendIfJavaScriptDict(jsDict);\n          }\n        }\n      }\n      var openactionDict = this.catDict.get('OpenAction');\n      if ((0, _primitives.isDict)(openactionDict, 'Action')) {\n        var actionType = openactionDict.get('S');\n        if ((0, _primitives.isName)(actionType, 'Named')) {\n          var action = openactionDict.get('N');\n          if ((0, _primitives.isName)(action, 'Print')) {\n            javaScript.push('print({});');\n          }\n        } else {\n          appendIfJavaScriptDict(openactionDict);\n        }\n      }\n      return (0, _util.shadow)(this, 'javaScript', javaScript);\n    },\n    cleanup: function Catalog_cleanup() {\n      var _this = this;\n\n      this.pageKidsCountCache.clear();\n      var promises = [];\n      this.fontCache.forEach(function (promise) {\n        promises.push(promise);\n      });\n      return Promise.all(promises).then(function (translatedFonts) {\n        for (var i = 0, ii = translatedFonts.length; i < ii; i++) {\n          var font = translatedFonts[i].dict;\n          delete font.translated;\n        }\n        _this.fontCache.clear();\n        _this.builtInCMapCache = Object.create(null);\n      });\n    },\n    getPage: function Catalog_getPage(pageIndex) {\n      var _this2 = this;\n\n      if (!(pageIndex in this.pagePromises)) {\n        this.pagePromises[pageIndex] = this.getPageDict(pageIndex).then(function (_ref) {\n          var _ref2 = _slicedToArray(_ref, 2),\n              dict = _ref2[0],\n              ref = _ref2[1];\n\n          return _this2.pageFactory.createPage(pageIndex, dict, ref, _this2.fontCache, _this2.builtInCMapCache);\n        });\n      }\n      return this.pagePromises[pageIndex];\n    },\n    getPageDict: function Catalog_getPageDict(pageIndex) {\n      var capability = (0, _util.createPromiseCapability)();\n      var nodesToVisit = [this.catDict.getRaw('Pages')];\n      var count,\n          currentPageIndex = 0;\n      var xref = this.xref,\n          pageKidsCountCache = this.pageKidsCountCache;\n      function next() {\n        while (nodesToVisit.length) {\n          var currentNode = nodesToVisit.pop();\n          if ((0, _primitives.isRef)(currentNode)) {\n            count = pageKidsCountCache.get(currentNode);\n            if (count > 0 && currentPageIndex + count < pageIndex) {\n              currentPageIndex += count;\n              continue;\n            }\n            xref.fetchAsync(currentNode).then(function (obj) {\n              if ((0, _primitives.isDict)(obj, 'Page') || (0, _primitives.isDict)(obj) && !obj.has('Kids')) {\n                if (pageIndex === currentPageIndex) {\n                  if (currentNode && !pageKidsCountCache.has(currentNode)) {\n                    pageKidsCountCache.put(currentNode, 1);\n                  }\n                  capability.resolve([obj, currentNode]);\n                } else {\n                  currentPageIndex++;\n                  next();\n                }\n                return;\n              }\n              nodesToVisit.push(obj);\n              next();\n            }, capability.reject);\n            return;\n          }\n          if (!(0, _primitives.isDict)(currentNode)) {\n            capability.reject(new _util.FormatError('page dictionary kid reference points to wrong type of object'));\n            return;\n          }\n          count = currentNode.get('Count');\n          var objId = currentNode.objId;\n          if (objId && !pageKidsCountCache.has(objId)) {\n            pageKidsCountCache.put(objId, count);\n          }\n          if (currentPageIndex + count <= pageIndex) {\n            currentPageIndex += count;\n            continue;\n          }\n          var kids = currentNode.get('Kids');\n          if (!(0, _util.isArray)(kids)) {\n            capability.reject(new _util.FormatError('page dictionary kids object is not an array'));\n            return;\n          }\n          for (var last = kids.length - 1; last >= 0; last--) {\n            nodesToVisit.push(kids[last]);\n          }\n        }\n        capability.reject(new Error('Page index ' + pageIndex + ' not found.'));\n      }\n      next();\n      return capability.promise;\n    },\n    getPageIndex: function Catalog_getPageIndex(pageRef) {\n      var xref = this.xref;\n      function pagesBeforeRef(kidRef) {\n        var total = 0;\n        var parentRef;\n        return xref.fetchAsync(kidRef).then(function (node) {\n          if ((0, _primitives.isRefsEqual)(kidRef, pageRef) && !(0, _primitives.isDict)(node, 'Page') && !((0, _primitives.isDict)(node) && !node.has('Type') && node.has('Contents'))) {\n            throw new _util.FormatError('The reference does not point to a /Page Dict.');\n          }\n          if (!node) {\n            return null;\n          }\n          if (!(0, _primitives.isDict)(node)) {\n            throw new _util.FormatError('node must be a Dict.');\n          }\n          parentRef = node.getRaw('Parent');\n          return node.getAsync('Parent');\n        }).then(function (parent) {\n          if (!parent) {\n            return null;\n          }\n          if (!(0, _primitives.isDict)(parent)) {\n            throw new _util.FormatError('parent must be a Dict.');\n          }\n          return parent.getAsync('Kids');\n        }).then(function (kids) {\n          if (!kids) {\n            return null;\n          }\n          var kidPromises = [];\n          var found = false;\n          for (var i = 0; i < kids.length; i++) {\n            var kid = kids[i];\n            if (!(0, _primitives.isRef)(kid)) {\n              throw new _util.FormatError('kid must be a Ref.');\n            }\n            if (kid.num === kidRef.num) {\n              found = true;\n              break;\n            }\n            kidPromises.push(xref.fetchAsync(kid).then(function (kid) {\n              if (kid.has('Count')) {\n                var count = kid.get('Count');\n                total += count;\n              } else {\n                total++;\n              }\n            }));\n          }\n          if (!found) {\n            throw new _util.FormatError('kid ref not found in parents kids');\n          }\n          return Promise.all(kidPromises).then(function () {\n            return [total, parentRef];\n          });\n        });\n      }\n      var total = 0;\n      function next(ref) {\n        return pagesBeforeRef(ref).then(function (args) {\n          if (!args) {\n            return total;\n          }\n          var count = args[0];\n          var parentRef = args[1];\n          total += count;\n          return next(parentRef);\n        });\n      }\n      return next(pageRef);\n    }\n  };\n  Catalog.parseDestDictionary = function Catalog_parseDestDictionary(params) {\n    function addDefaultProtocolToUrl(url) {\n      if (url.indexOf('www.') === 0) {\n        return 'http://' + url;\n      }\n      return url;\n    }\n    function tryConvertUrlEncoding(url) {\n      try {\n        return (0, _util.stringToUTF8String)(url);\n      } catch (e) {\n        return url;\n      }\n    }\n    var destDict = params.destDict;\n    if (!(0, _primitives.isDict)(destDict)) {\n      (0, _util.warn)('Catalog_parseDestDictionary: \"destDict\" must be a dictionary.');\n      return;\n    }\n    var resultObj = params.resultObj;\n    if ((typeof resultObj === 'undefined' ? 'undefined' : _typeof(resultObj)) !== 'object') {\n      (0, _util.warn)('Catalog_parseDestDictionary: \"resultObj\" must be an object.');\n      return;\n    }\n    var docBaseUrl = params.docBaseUrl || null;\n    var action = destDict.get('A'),\n        url,\n        dest;\n    if ((0, _primitives.isDict)(action)) {\n      var linkType = action.get('S').name;\n      switch (linkType) {\n        case 'URI':\n          url = action.get('URI');\n          if ((0, _primitives.isName)(url)) {\n            url = '/' + url.name;\n          } else if ((0, _util.isString)(url)) {\n            url = addDefaultProtocolToUrl(url);\n          }\n          break;\n        case 'GoTo':\n          dest = action.get('D');\n          break;\n        case 'Launch':\n        case 'GoToR':\n          var urlDict = action.get('F');\n          if ((0, _primitives.isDict)(urlDict)) {\n            url = urlDict.get('F') || null;\n          } else if ((0, _util.isString)(urlDict)) {\n            url = urlDict;\n          }\n          var remoteDest = action.get('D');\n          if (remoteDest) {\n            if ((0, _primitives.isName)(remoteDest)) {\n              remoteDest = remoteDest.name;\n            }\n            if ((0, _util.isString)(url)) {\n              var baseUrl = url.split('#')[0];\n              if ((0, _util.isString)(remoteDest)) {\n                url = baseUrl + '#' + remoteDest;\n              } else if ((0, _util.isArray)(remoteDest)) {\n                url = baseUrl + '#' + JSON.stringify(remoteDest);\n              }\n            }\n          }\n          var newWindow = action.get('NewWindow');\n          if ((0, _util.isBool)(newWindow)) {\n            resultObj.newWindow = newWindow;\n          }\n          break;\n        case 'Named':\n          var namedAction = action.get('N');\n          if ((0, _primitives.isName)(namedAction)) {\n            resultObj.action = namedAction.name;\n          }\n          break;\n        case 'JavaScript':\n          var jsAction = action.get('JS'),\n              js;\n          if ((0, _primitives.isStream)(jsAction)) {\n            js = (0, _util.bytesToString)(jsAction.getBytes());\n          } else if ((0, _util.isString)(jsAction)) {\n            js = jsAction;\n          }\n          if (js) {\n            var URL_OPEN_METHODS = ['app.launchURL', 'window.open'];\n            var regex = new RegExp('^\\\\s*(' + URL_OPEN_METHODS.join('|').split('.').join('\\\\.') + ')\\\\((?:\\'|\\\")([^\\'\\\"]*)(?:\\'|\\\")(?:,\\\\s*(\\\\w+)\\\\)|\\\\))', 'i');\n            var jsUrl = regex.exec((0, _util.stringToPDFString)(js));\n            if (jsUrl && jsUrl[2]) {\n              url = jsUrl[2];\n              if (jsUrl[3] === 'true' && jsUrl[1] === 'app.launchURL') {\n                resultObj.newWindow = true;\n              }\n              break;\n            }\n          }\n        default:\n          (0, _util.warn)('Catalog_parseDestDictionary: Unrecognized link type \"' + linkType + '\".');\n          break;\n      }\n    } else if (destDict.has('Dest')) {\n      dest = destDict.get('Dest');\n    }\n    if ((0, _util.isString)(url)) {\n      url = tryConvertUrlEncoding(url);\n      var absoluteUrl = (0, _util.createValidAbsoluteUrl)(url, docBaseUrl);\n      if (absoluteUrl) {\n        resultObj.url = absoluteUrl.href;\n      }\n      resultObj.unsafeUrl = url;\n    }\n    if (dest) {\n      if ((0, _primitives.isName)(dest)) {\n        dest = dest.name;\n      }\n      if ((0, _util.isString)(dest) || (0, _util.isArray)(dest)) {\n        resultObj.dest = dest;\n      }\n    }\n  };\n  return Catalog;\n}();\nvar XRef = function XRefClosure() {\n  function XRef(stream, pdfManager) {\n    this.stream = stream;\n    this.pdfManager = pdfManager;\n    this.entries = [];\n    this.xrefstms = Object.create(null);\n    this.cache = [];\n    this.stats = {\n      streamTypes: [],\n      fontTypes: []\n    };\n  }\n  XRef.prototype = {\n    setStartXRef: function XRef_setStartXRef(startXRef) {\n      this.startXRefQueue = [startXRef];\n    },\n    parse: function XRef_parse(recoveryMode) {\n      var trailerDict;\n      if (!recoveryMode) {\n        trailerDict = this.readXRef();\n      } else {\n        (0, _util.warn)('Indexing all PDF objects');\n        trailerDict = this.indexObjects();\n      }\n      trailerDict.assignXref(this);\n      this.trailer = trailerDict;\n      var encrypt = trailerDict.get('Encrypt');\n      if ((0, _primitives.isDict)(encrypt)) {\n        var ids = trailerDict.get('ID');\n        var fileId = ids && ids.length ? ids[0] : '';\n        encrypt.suppressEncryption = true;\n        this.encrypt = new _crypto.CipherTransformFactory(encrypt, fileId, this.pdfManager.password);\n      }\n      if (!(this.root = trailerDict.get('Root'))) {\n        throw new _util.FormatError('Invalid root reference');\n      }\n    },\n    processXRefTable: function XRef_processXRefTable(parser) {\n      if (!('tableState' in this)) {\n        this.tableState = {\n          entryNum: 0,\n          streamPos: parser.lexer.stream.pos,\n          parserBuf1: parser.buf1,\n          parserBuf2: parser.buf2\n        };\n      }\n      var obj = this.readXRefTable(parser);\n      if (!(0, _primitives.isCmd)(obj, 'trailer')) {\n        throw new _util.FormatError('Invalid XRef table: could not find trailer dictionary');\n      }\n      var dict = parser.getObj();\n      if (!(0, _primitives.isDict)(dict) && dict.dict) {\n        dict = dict.dict;\n      }\n      if (!(0, _primitives.isDict)(dict)) {\n        throw new _util.FormatError('Invalid XRef table: could not parse trailer dictionary');\n      }\n      delete this.tableState;\n      return dict;\n    },\n    readXRefTable: function XRef_readXRefTable(parser) {\n      var stream = parser.lexer.stream;\n      var tableState = this.tableState;\n      stream.pos = tableState.streamPos;\n      parser.buf1 = tableState.parserBuf1;\n      parser.buf2 = tableState.parserBuf2;\n      var obj;\n      while (true) {\n        if (!('firstEntryNum' in tableState) || !('entryCount' in tableState)) {\n          if ((0, _primitives.isCmd)(obj = parser.getObj(), 'trailer')) {\n            break;\n          }\n          tableState.firstEntryNum = obj;\n          tableState.entryCount = parser.getObj();\n        }\n        var first = tableState.firstEntryNum;\n        var count = tableState.entryCount;\n        if (!(0, _util.isInt)(first) || !(0, _util.isInt)(count)) {\n          throw new _util.FormatError('Invalid XRef table: wrong types in subsection header');\n        }\n        for (var i = tableState.entryNum; i < count; i++) {\n          tableState.streamPos = stream.pos;\n          tableState.entryNum = i;\n          tableState.parserBuf1 = parser.buf1;\n          tableState.parserBuf2 = parser.buf2;\n          var entry = {};\n          entry.offset = parser.getObj();\n          entry.gen = parser.getObj();\n          var type = parser.getObj();\n          if ((0, _primitives.isCmd)(type, 'f')) {\n            entry.free = true;\n          } else if ((0, _primitives.isCmd)(type, 'n')) {\n            entry.uncompressed = true;\n          }\n          if (!(0, _util.isInt)(entry.offset) || !(0, _util.isInt)(entry.gen) || !(entry.free || entry.uncompressed)) {\n            throw new _util.FormatError('Invalid entry in XRef subsection: ' + first + ', ' + count);\n          }\n          if (i === 0 && entry.free && first === 1) {\n            first = 0;\n          }\n          if (!this.entries[i + first]) {\n            this.entries[i + first] = entry;\n          }\n        }\n        tableState.entryNum = 0;\n        tableState.streamPos = stream.pos;\n        tableState.parserBuf1 = parser.buf1;\n        tableState.parserBuf2 = parser.buf2;\n        delete tableState.firstEntryNum;\n        delete tableState.entryCount;\n      }\n      if (this.entries[0] && !this.entries[0].free) {\n        throw new _util.FormatError('Invalid XRef table: unexpected first object');\n      }\n      return obj;\n    },\n    processXRefStream: function XRef_processXRefStream(stream) {\n      if (!('streamState' in this)) {\n        var streamParameters = stream.dict;\n        var byteWidths = streamParameters.get('W');\n        var range = streamParameters.get('Index');\n        if (!range) {\n          range = [0, streamParameters.get('Size')];\n        }\n        this.streamState = {\n          entryRanges: range,\n          byteWidths: byteWidths,\n          entryNum: 0,\n          streamPos: stream.pos\n        };\n      }\n      this.readXRefStream(stream);\n      delete this.streamState;\n      return stream.dict;\n    },\n    readXRefStream: function XRef_readXRefStream(stream) {\n      var i, j;\n      var streamState = this.streamState;\n      stream.pos = streamState.streamPos;\n      var byteWidths = streamState.byteWidths;\n      var typeFieldWidth = byteWidths[0];\n      var offsetFieldWidth = byteWidths[1];\n      var generationFieldWidth = byteWidths[2];\n      var entryRanges = streamState.entryRanges;\n      while (entryRanges.length > 0) {\n        var first = entryRanges[0];\n        var n = entryRanges[1];\n        if (!(0, _util.isInt)(first) || !(0, _util.isInt)(n)) {\n          throw new _util.FormatError('Invalid XRef range fields: ' + first + ', ' + n);\n        }\n        if (!(0, _util.isInt)(typeFieldWidth) || !(0, _util.isInt)(offsetFieldWidth) || !(0, _util.isInt)(generationFieldWidth)) {\n          throw new _util.FormatError('Invalid XRef entry fields length: ' + first + ', ' + n);\n        }\n        for (i = streamState.entryNum; i < n; ++i) {\n          streamState.entryNum = i;\n          streamState.streamPos = stream.pos;\n          var type = 0,\n              offset = 0,\n              generation = 0;\n          for (j = 0; j < typeFieldWidth; ++j) {\n            type = type << 8 | stream.getByte();\n          }\n          if (typeFieldWidth === 0) {\n            type = 1;\n          }\n          for (j = 0; j < offsetFieldWidth; ++j) {\n            offset = offset << 8 | stream.getByte();\n          }\n          for (j = 0; j < generationFieldWidth; ++j) {\n            generation = generation << 8 | stream.getByte();\n          }\n          var entry = {};\n          entry.offset = offset;\n          entry.gen = generation;\n          switch (type) {\n            case 0:\n              entry.free = true;\n              break;\n            case 1:\n              entry.uncompressed = true;\n              break;\n            case 2:\n              break;\n            default:\n              throw new _util.FormatError('Invalid XRef entry type: ' + type);\n          }\n          if (!this.entries[first + i]) {\n            this.entries[first + i] = entry;\n          }\n        }\n        streamState.entryNum = 0;\n        streamState.streamPos = stream.pos;\n        entryRanges.splice(0, 2);\n      }\n    },\n    indexObjects: function XRef_indexObjects() {\n      var TAB = 0x9,\n          LF = 0xA,\n          CR = 0xD,\n          SPACE = 0x20;\n      var PERCENT = 0x25,\n          LT = 0x3C;\n      function readToken(data, offset) {\n        var token = '',\n            ch = data[offset];\n        while (ch !== LF && ch !== CR && ch !== LT) {\n          if (++offset >= data.length) {\n            break;\n          }\n          token += String.fromCharCode(ch);\n          ch = data[offset];\n        }\n        return token;\n      }\n      function skipUntil(data, offset, what) {\n        var length = what.length,\n            dataLength = data.length;\n        var skipped = 0;\n        while (offset < dataLength) {\n          var i = 0;\n          while (i < length && data[offset + i] === what[i]) {\n            ++i;\n          }\n          if (i >= length) {\n            break;\n          }\n          offset++;\n          skipped++;\n        }\n        return skipped;\n      }\n      var objRegExp = /^(\\d+)\\s+(\\d+)\\s+obj\\b/;\n      var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);\n      var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 101, 102]);\n      var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]);\n      var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);\n      this.entries.length = 0;\n      var stream = this.stream;\n      stream.pos = 0;\n      var buffer = stream.getBytes();\n      var position = stream.start,\n          length = buffer.length;\n      var trailers = [],\n          xrefStms = [];\n      while (position < length) {\n        var ch = buffer[position];\n        if (ch === TAB || ch === LF || ch === CR || ch === SPACE) {\n          ++position;\n          continue;\n        }\n        if (ch === PERCENT) {\n          do {\n            ++position;\n            if (position >= length) {\n              break;\n            }\n            ch = buffer[position];\n          } while (ch !== LF && ch !== CR);\n          continue;\n        }\n        var token = readToken(buffer, position);\n        var m;\n        if (token.indexOf('xref') === 0 && (token.length === 4 || /\\s/.test(token[4]))) {\n          position += skipUntil(buffer, position, trailerBytes);\n          trailers.push(position);\n          position += skipUntil(buffer, position, startxrefBytes);\n        } else if (m = objRegExp.exec(token)) {\n          if (typeof this.entries[m[1]] === 'undefined') {\n            this.entries[m[1]] = {\n              offset: position - stream.start,\n              gen: m[2] | 0,\n              uncompressed: true\n            };\n          }\n          var contentLength = skipUntil(buffer, position, endobjBytes) + 7;\n          var content = buffer.subarray(position, position + contentLength);\n          var xrefTagOffset = skipUntil(content, 0, xrefBytes);\n          if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) {\n            xrefStms.push(position - stream.start);\n            this.xrefstms[position - stream.start] = 1;\n          }\n          position += contentLength;\n        } else if (token.indexOf('trailer') === 0 && (token.length === 7 || /\\s/.test(token[7]))) {\n          trailers.push(position);\n          position += skipUntil(buffer, position, startxrefBytes);\n        } else {\n          position += token.length + 1;\n        }\n      }\n      var i, ii;\n      for (i = 0, ii = xrefStms.length; i < ii; ++i) {\n        this.startXRefQueue.push(xrefStms[i]);\n        this.readXRef(true);\n      }\n      var dict;\n      for (i = 0, ii = trailers.length; i < ii; ++i) {\n        stream.pos = trailers[i];\n        var parser = new _parser.Parser(new _parser.Lexer(stream), true, this, true);\n        var obj = parser.getObj();\n        if (!(0, _primitives.isCmd)(obj, 'trailer')) {\n          continue;\n        }\n        dict = parser.getObj();\n        if (!(0, _primitives.isDict)(dict)) {\n          continue;\n        }\n        if (dict.has('ID')) {\n          return dict;\n        }\n      }\n      if (dict) {\n        return dict;\n      }\n      throw new _util.InvalidPDFException('Invalid PDF structure');\n    },\n    readXRef: function XRef_readXRef(recoveryMode) {\n      var stream = this.stream;\n      try {\n        while (this.startXRefQueue.length) {\n          var startXRef = this.startXRefQueue[0];\n          stream.pos = startXRef + stream.start;\n          var parser = new _parser.Parser(new _parser.Lexer(stream), true, this);\n          var obj = parser.getObj();\n          var dict;\n          if ((0, _primitives.isCmd)(obj, 'xref')) {\n            dict = this.processXRefTable(parser);\n            if (!this.topDict) {\n              this.topDict = dict;\n            }\n            obj = dict.get('XRefStm');\n            if ((0, _util.isInt)(obj)) {\n              var pos = obj;\n              if (!(pos in this.xrefstms)) {\n                this.xrefstms[pos] = 1;\n                this.startXRefQueue.push(pos);\n              }\n            }\n          } else if ((0, _util.isInt)(obj)) {\n            if (!(0, _util.isInt)(parser.getObj()) || !(0, _primitives.isCmd)(parser.getObj(), 'obj') || !(0, _primitives.isStream)(obj = parser.getObj())) {\n              throw new _util.FormatError('Invalid XRef stream');\n            }\n            dict = this.processXRefStream(obj);\n            if (!this.topDict) {\n              this.topDict = dict;\n            }\n            if (!dict) {\n              throw new _util.FormatError('Failed to read XRef stream');\n            }\n          } else {\n            throw new _util.FormatError('Invalid XRef stream header');\n          }\n          obj = dict.get('Prev');\n          if ((0, _util.isInt)(obj)) {\n            this.startXRefQueue.push(obj);\n          } else if ((0, _primitives.isRef)(obj)) {\n            this.startXRefQueue.push(obj.num);\n          }\n          this.startXRefQueue.shift();\n        }\n        return this.topDict;\n      } catch (e) {\n        if (e instanceof _util.MissingDataException) {\n          throw e;\n        }\n        (0, _util.info)('(while reading XRef): ' + e);\n      }\n      if (recoveryMode) {\n        return;\n      }\n      throw new _util.XRefParseException();\n    },\n    getEntry: function XRef_getEntry(i) {\n      var xrefEntry = this.entries[i];\n      if (xrefEntry && !xrefEntry.free && xrefEntry.offset) {\n        return xrefEntry;\n      }\n      return null;\n    },\n    fetchIfRef: function XRef_fetchIfRef(obj, suppressEncryption) {\n      if (!(0, _primitives.isRef)(obj)) {\n        return obj;\n      }\n      return this.fetch(obj, suppressEncryption);\n    },\n    fetch: function XRef_fetch(ref, suppressEncryption) {\n      if (!(0, _primitives.isRef)(ref)) {\n        throw new Error('ref object is not a reference');\n      }\n      var num = ref.num;\n      if (num in this.cache) {\n        var cacheEntry = this.cache[num];\n        if (cacheEntry instanceof _primitives.Dict && !cacheEntry.objId) {\n          cacheEntry.objId = ref.toString();\n        }\n        return cacheEntry;\n      }\n      var xrefEntry = this.getEntry(num);\n      if (xrefEntry === null) {\n        return this.cache[num] = null;\n      }\n      if (xrefEntry.uncompressed) {\n        xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption);\n      } else {\n        xrefEntry = this.fetchCompressed(xrefEntry, suppressEncryption);\n      }\n      if ((0, _primitives.isDict)(xrefEntry)) {\n        xrefEntry.objId = ref.toString();\n      } else if ((0, _primitives.isStream)(xrefEntry)) {\n        xrefEntry.dict.objId = ref.toString();\n      }\n      return xrefEntry;\n    },\n    fetchUncompressed: function XRef_fetchUncompressed(ref, xrefEntry, suppressEncryption) {\n      var gen = ref.gen;\n      var num = ref.num;\n      if (xrefEntry.gen !== gen) {\n        throw new _util.FormatError('inconsistent generation in XRef');\n      }\n      var stream = this.stream.makeSubStream(xrefEntry.offset + this.stream.start);\n      var parser = new _parser.Parser(new _parser.Lexer(stream), true, this);\n      var obj1 = parser.getObj();\n      var obj2 = parser.getObj();\n      var obj3 = parser.getObj();\n      if (!(0, _util.isInt)(obj1) || parseInt(obj1, 10) !== num || !(0, _util.isInt)(obj2) || parseInt(obj2, 10) !== gen || !(0, _primitives.isCmd)(obj3)) {\n        throw new _util.FormatError('bad XRef entry');\n      }\n      if (!(0, _primitives.isCmd)(obj3, 'obj')) {\n        if (obj3.cmd.indexOf('obj') === 0) {\n          num = parseInt(obj3.cmd.substring(3), 10);\n          if (!isNaN(num)) {\n            return num;\n          }\n        }\n        throw new _util.FormatError('bad XRef entry');\n      }\n      if (this.encrypt && !suppressEncryption) {\n        xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen));\n      } else {\n        xrefEntry = parser.getObj();\n      }\n      if (!(0, _primitives.isStream)(xrefEntry)) {\n        this.cache[num] = xrefEntry;\n      }\n      return xrefEntry;\n    },\n    fetchCompressed: function XRef_fetchCompressed(xrefEntry, suppressEncryption) {\n      var tableOffset = xrefEntry.offset;\n      var stream = this.fetch(new _primitives.Ref(tableOffset, 0));\n      if (!(0, _primitives.isStream)(stream)) {\n        throw new _util.FormatError('bad ObjStm stream');\n      }\n      var first = stream.dict.get('First');\n      var n = stream.dict.get('N');\n      if (!(0, _util.isInt)(first) || !(0, _util.isInt)(n)) {\n        throw new _util.FormatError('invalid first and n parameters for ObjStm stream');\n      }\n      var parser = new _parser.Parser(new _parser.Lexer(stream), false, this);\n      parser.allowStreams = true;\n      var i,\n          entries = [],\n          num,\n          nums = [];\n      for (i = 0; i < n; ++i) {\n        num = parser.getObj();\n        if (!(0, _util.isInt)(num)) {\n          throw new _util.FormatError('invalid object number in the ObjStm stream: ' + num);\n        }\n        nums.push(num);\n        var offset = parser.getObj();\n        if (!(0, _util.isInt)(offset)) {\n          throw new _util.FormatError('invalid object offset in the ObjStm stream: ' + offset);\n        }\n      }\n      for (i = 0; i < n; ++i) {\n        entries.push(parser.getObj());\n        if ((0, _primitives.isCmd)(parser.buf1, 'endobj')) {\n          parser.shift();\n        }\n        num = nums[i];\n        var entry = this.entries[num];\n        if (entry && entry.offset === tableOffset && entry.gen === i) {\n          this.cache[num] = entries[i];\n        }\n      }\n      xrefEntry = entries[xrefEntry.gen];\n      if (xrefEntry === undefined) {\n        throw new _util.FormatError('bad XRef entry for compressed object');\n      }\n      return xrefEntry;\n    },\n    fetchIfRefAsync: function XRef_fetchIfRefAsync(obj, suppressEncryption) {\n      if (!(0, _primitives.isRef)(obj)) {\n        return Promise.resolve(obj);\n      }\n      return this.fetchAsync(obj, suppressEncryption);\n    },\n    fetchAsync: function XRef_fetchAsync(ref, suppressEncryption) {\n      var streamManager = this.stream.manager;\n      var xref = this;\n      return new Promise(function tryFetch(resolve, reject) {\n        try {\n          resolve(xref.fetch(ref, suppressEncryption));\n        } catch (e) {\n          if (e instanceof _util.MissingDataException) {\n            streamManager.requestRange(e.begin, e.end).then(function () {\n              tryFetch(resolve, reject);\n            }, reject);\n            return;\n          }\n          reject(e);\n        }\n      });\n    },\n    getCatalogObj: function XRef_getCatalogObj() {\n      return this.root;\n    }\n  };\n  return XRef;\n}();\nvar NameOrNumberTree = function NameOrNumberTreeClosure() {\n  function NameOrNumberTree(root, xref) {\n    throw new Error('Cannot initialize NameOrNumberTree.');\n  }\n  NameOrNumberTree.prototype = {\n    getAll: function NameOrNumberTree_getAll() {\n      var dict = Object.create(null);\n      if (!this.root) {\n        return dict;\n      }\n      var xref = this.xref;\n      var processed = new _primitives.RefSet();\n      processed.put(this.root);\n      var queue = [this.root];\n      while (queue.length > 0) {\n        var i, n;\n        var obj = xref.fetchIfRef(queue.shift());\n        if (!(0, _primitives.isDict)(obj)) {\n          continue;\n        }\n        if (obj.has('Kids')) {\n          var kids = obj.get('Kids');\n          for (i = 0, n = kids.length; i < n; i++) {\n            var kid = kids[i];\n            if (processed.has(kid)) {\n              throw new _util.FormatError('Duplicate entry in \"' + this._type + '\" tree.');\n            }\n            queue.push(kid);\n            processed.put(kid);\n          }\n          continue;\n        }\n        var entries = obj.get(this._type);\n        if ((0, _util.isArray)(entries)) {\n          for (i = 0, n = entries.length; i < n; i += 2) {\n            dict[xref.fetchIfRef(entries[i])] = xref.fetchIfRef(entries[i + 1]);\n          }\n        }\n      }\n      return dict;\n    },\n    get: function NameOrNumberTree_get(key) {\n      if (!this.root) {\n        return null;\n      }\n      var xref = this.xref;\n      var kidsOrEntries = xref.fetchIfRef(this.root);\n      var loopCount = 0;\n      var MAX_LEVELS = 10;\n      var l, r, m;\n      while (kidsOrEntries.has('Kids')) {\n        if (++loopCount > MAX_LEVELS) {\n          (0, _util.warn)('Search depth limit reached for \"' + this._type + '\" tree.');\n          return null;\n        }\n        var kids = kidsOrEntries.get('Kids');\n        if (!(0, _util.isArray)(kids)) {\n          return null;\n        }\n        l = 0;\n        r = kids.length - 1;\n        while (l <= r) {\n          m = l + r >> 1;\n          var kid = xref.fetchIfRef(kids[m]);\n          var limits = kid.get('Limits');\n          if (key < xref.fetchIfRef(limits[0])) {\n            r = m - 1;\n          } else if (key > xref.fetchIfRef(limits[1])) {\n            l = m + 1;\n          } else {\n            kidsOrEntries = xref.fetchIfRef(kids[m]);\n            break;\n          }\n        }\n        if (l > r) {\n          return null;\n        }\n      }\n      var entries = kidsOrEntries.get(this._type);\n      if ((0, _util.isArray)(entries)) {\n        l = 0;\n        r = entries.length - 2;\n        while (l <= r) {\n          m = l + r & ~1;\n          var currentKey = xref.fetchIfRef(entries[m]);\n          if (key < currentKey) {\n            r = m - 2;\n          } else if (key > currentKey) {\n            l = m + 2;\n          } else {\n            return xref.fetchIfRef(entries[m + 1]);\n          }\n        }\n      }\n      return null;\n    }\n  };\n  return NameOrNumberTree;\n}();\nvar NameTree = function NameTreeClosure() {\n  function NameTree(root, xref) {\n    this.root = root;\n    this.xref = xref;\n    this._type = 'Names';\n  }\n  _util.Util.inherit(NameTree, NameOrNumberTree, {});\n  return NameTree;\n}();\nvar NumberTree = function NumberTreeClosure() {\n  function NumberTree(root, xref) {\n    this.root = root;\n    this.xref = xref;\n    this._type = 'Nums';\n  }\n  _util.Util.inherit(NumberTree, NameOrNumberTree, {});\n  return NumberTree;\n}();\nvar FileSpec = function FileSpecClosure() {\n  function FileSpec(root, xref) {\n    if (!root || !(0, _primitives.isDict)(root)) {\n      return;\n    }\n    this.xref = xref;\n    this.root = root;\n    if (root.has('FS')) {\n      this.fs = root.get('FS');\n    }\n    this.description = root.has('Desc') ? (0, _util.stringToPDFString)(root.get('Desc')) : '';\n    if (root.has('RF')) {\n      (0, _util.warn)('Related file specifications are not supported');\n    }\n    this.contentAvailable = true;\n    if (!root.has('EF')) {\n      this.contentAvailable = false;\n      (0, _util.warn)('Non-embedded file specifications are not supported');\n    }\n  }\n  function pickPlatformItem(dict) {\n    if (dict.has('UF')) {\n      return dict.get('UF');\n    } else if (dict.has('F')) {\n      return dict.get('F');\n    } else if (dict.has('Unix')) {\n      return dict.get('Unix');\n    } else if (dict.has('Mac')) {\n      return dict.get('Mac');\n    } else if (dict.has('DOS')) {\n      return dict.get('DOS');\n    }\n    return null;\n  }\n  FileSpec.prototype = {\n    get filename() {\n      if (!this._filename && this.root) {\n        var filename = pickPlatformItem(this.root) || 'unnamed';\n        this._filename = (0, _util.stringToPDFString)(filename).replace(/\\\\\\\\/g, '\\\\').replace(/\\\\\\//g, '/').replace(/\\\\/g, '/');\n      }\n      return this._filename;\n    },\n    get content() {\n      if (!this.contentAvailable) {\n        return null;\n      }\n      if (!this.contentRef && this.root) {\n        this.contentRef = pickPlatformItem(this.root.get('EF'));\n      }\n      var content = null;\n      if (this.contentRef) {\n        var xref = this.xref;\n        var fileObj = xref.fetchIfRef(this.contentRef);\n        if (fileObj && (0, _primitives.isStream)(fileObj)) {\n          content = fileObj.getBytes();\n        } else {\n          (0, _util.warn)('Embedded file specification points to non-existing/invalid ' + 'content');\n        }\n      } else {\n        (0, _util.warn)('Embedded file specification does not have a content');\n      }\n      return content;\n    },\n    get serializable() {\n      return {\n        filename: this.filename,\n        content: this.content\n      };\n    }\n  };\n  return FileSpec;\n}();\nvar ObjectLoader = function () {\n  function mayHaveChildren(value) {\n    return (0, _primitives.isRef)(value) || (0, _primitives.isDict)(value) || (0, _util.isArray)(value) || (0, _primitives.isStream)(value);\n  }\n  function addChildren(node, nodesToVisit) {\n    if ((0, _primitives.isDict)(node) || (0, _primitives.isStream)(node)) {\n      var dict = (0, _primitives.isDict)(node) ? node : node.dict;\n      var dictKeys = dict.getKeys();\n      for (var i = 0, ii = dictKeys.length; i < ii; i++) {\n        var rawValue = dict.getRaw(dictKeys[i]);\n        if (mayHaveChildren(rawValue)) {\n          nodesToVisit.push(rawValue);\n        }\n      }\n    } else if ((0, _util.isArray)(node)) {\n      for (var _i = 0, _ii = node.length; _i < _ii; _i++) {\n        var value = node[_i];\n        if (mayHaveChildren(value)) {\n          nodesToVisit.push(value);\n        }\n      }\n    }\n  }\n  function ObjectLoader(dict, keys, xref) {\n    this.dict = dict;\n    this.keys = keys;\n    this.xref = xref;\n    this.refSet = null;\n    this.capability = null;\n  }\n  ObjectLoader.prototype = {\n    load: function load() {\n      this.capability = (0, _util.createPromiseCapability)();\n      if (!(this.xref.stream instanceof _chunked_stream.ChunkedStream) || this.xref.stream.getMissingChunks().length === 0) {\n        this.capability.resolve();\n        return this.capability.promise;\n      }\n      var keys = this.keys,\n          dict = this.dict;\n\n      this.refSet = new _primitives.RefSet();\n      var nodesToVisit = [];\n      for (var i = 0, ii = keys.length; i < ii; i++) {\n        var rawValue = dict.getRaw(keys[i]);\n        if (rawValue !== undefined) {\n          nodesToVisit.push(rawValue);\n        }\n      }\n      this._walk(nodesToVisit);\n      return this.capability.promise;\n    },\n    _walk: function _walk(nodesToVisit) {\n      var _this3 = this;\n\n      var nodesToRevisit = [];\n      var pendingRequests = [];\n      while (nodesToVisit.length) {\n        var currentNode = nodesToVisit.pop();\n        if ((0, _primitives.isRef)(currentNode)) {\n          if (this.refSet.has(currentNode)) {\n            continue;\n          }\n          try {\n            this.refSet.put(currentNode);\n            currentNode = this.xref.fetch(currentNode);\n          } catch (ex) {\n            if (!(ex instanceof _util.MissingDataException)) {\n              throw ex;\n            }\n            nodesToRevisit.push(currentNode);\n            pendingRequests.push({\n              begin: ex.begin,\n              end: ex.end\n            });\n          }\n        }\n        if (currentNode && currentNode.getBaseStreams) {\n          var baseStreams = currentNode.getBaseStreams();\n          var foundMissingData = false;\n          for (var i = 0, ii = baseStreams.length; i < ii; i++) {\n            var stream = baseStreams[i];\n            if (stream.getMissingChunks && stream.getMissingChunks().length) {\n              foundMissingData = true;\n              pendingRequests.push({\n                begin: stream.start,\n                end: stream.end\n              });\n            }\n          }\n          if (foundMissingData) {\n            nodesToRevisit.push(currentNode);\n          }\n        }\n        addChildren(currentNode, nodesToVisit);\n      }\n      if (pendingRequests.length) {\n        this.xref.stream.manager.requestRanges(pendingRequests).then(function () {\n          for (var _i2 = 0, _ii2 = nodesToRevisit.length; _i2 < _ii2; _i2++) {\n            var node = nodesToRevisit[_i2];\n            if ((0, _primitives.isRef)(node)) {\n              _this3.refSet.remove(node);\n            }\n          }\n          _this3._walk(nodesToRevisit);\n        }, this.capability.reject);\n        return;\n      }\n      this.refSet = null;\n      this.capability.resolve();\n    }\n  };\n  return ObjectLoader;\n}();\nexports.Catalog = Catalog;\nexports.ObjectLoader = ObjectLoader;\nexports.XRef = XRef;\nexports.FileSpec = FileSpec;\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getSupplementalGlyphMapForArialBlack = exports.getGlyphMapForStandardFonts = exports.getSymbolsFonts = exports.getSerifFonts = exports.getNonStdFontMap = exports.getStdFontMap = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar getStdFontMap = (0, _util.getLookupTableFactory)(function (t) {\n  t['ArialNarrow'] = 'Helvetica';\n  t['ArialNarrow-Bold'] = 'Helvetica-Bold';\n  t['ArialNarrow-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['ArialNarrow-Italic'] = 'Helvetica-Oblique';\n  t['ArialBlack'] = 'Helvetica';\n  t['ArialBlack-Bold'] = 'Helvetica-Bold';\n  t['ArialBlack-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['ArialBlack-Italic'] = 'Helvetica-Oblique';\n  t['Arial-Black'] = 'Helvetica';\n  t['Arial-Black-Bold'] = 'Helvetica-Bold';\n  t['Arial-Black-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['Arial-Black-Italic'] = 'Helvetica-Oblique';\n  t['Arial'] = 'Helvetica';\n  t['Arial-Bold'] = 'Helvetica-Bold';\n  t['Arial-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['Arial-Italic'] = 'Helvetica-Oblique';\n  t['Arial-BoldItalicMT'] = 'Helvetica-BoldOblique';\n  t['Arial-BoldMT'] = 'Helvetica-Bold';\n  t['Arial-ItalicMT'] = 'Helvetica-Oblique';\n  t['ArialMT'] = 'Helvetica';\n  t['Courier-Bold'] = 'Courier-Bold';\n  t['Courier-BoldItalic'] = 'Courier-BoldOblique';\n  t['Courier-Italic'] = 'Courier-Oblique';\n  t['CourierNew'] = 'Courier';\n  t['CourierNew-Bold'] = 'Courier-Bold';\n  t['CourierNew-BoldItalic'] = 'Courier-BoldOblique';\n  t['CourierNew-Italic'] = 'Courier-Oblique';\n  t['CourierNewPS-BoldItalicMT'] = 'Courier-BoldOblique';\n  t['CourierNewPS-BoldMT'] = 'Courier-Bold';\n  t['CourierNewPS-ItalicMT'] = 'Courier-Oblique';\n  t['CourierNewPSMT'] = 'Courier';\n  t['Helvetica'] = 'Helvetica';\n  t['Helvetica-Bold'] = 'Helvetica-Bold';\n  t['Helvetica-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['Helvetica-BoldOblique'] = 'Helvetica-BoldOblique';\n  t['Helvetica-Italic'] = 'Helvetica-Oblique';\n  t['Helvetica-Oblique'] = 'Helvetica-Oblique';\n  t['SegoeUISymbol'] = 'Helvetica';\n  t['Symbol-Bold'] = 'Symbol';\n  t['Symbol-BoldItalic'] = 'Symbol';\n  t['Symbol-Italic'] = 'Symbol';\n  t['TimesNewRoman'] = 'Times-Roman';\n  t['TimesNewRoman-Bold'] = 'Times-Bold';\n  t['TimesNewRoman-BoldItalic'] = 'Times-BoldItalic';\n  t['TimesNewRoman-Italic'] = 'Times-Italic';\n  t['TimesNewRomanPS'] = 'Times-Roman';\n  t['TimesNewRomanPS-Bold'] = 'Times-Bold';\n  t['TimesNewRomanPS-BoldItalic'] = 'Times-BoldItalic';\n  t['TimesNewRomanPS-BoldItalicMT'] = 'Times-BoldItalic';\n  t['TimesNewRomanPS-BoldMT'] = 'Times-Bold';\n  t['TimesNewRomanPS-Italic'] = 'Times-Italic';\n  t['TimesNewRomanPS-ItalicMT'] = 'Times-Italic';\n  t['TimesNewRomanPSMT'] = 'Times-Roman';\n  t['TimesNewRomanPSMT-Bold'] = 'Times-Bold';\n  t['TimesNewRomanPSMT-BoldItalic'] = 'Times-BoldItalic';\n  t['TimesNewRomanPSMT-Italic'] = 'Times-Italic';\n});\nvar getNonStdFontMap = (0, _util.getLookupTableFactory)(function (t) {\n  t['CenturyGothic'] = 'Helvetica';\n  t['CenturyGothic-Bold'] = 'Helvetica-Bold';\n  t['CenturyGothic-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['CenturyGothic-Italic'] = 'Helvetica-Oblique';\n  t['ComicSansMS'] = 'Comic Sans MS';\n  t['ComicSansMS-Bold'] = 'Comic Sans MS-Bold';\n  t['ComicSansMS-BoldItalic'] = 'Comic Sans MS-BoldItalic';\n  t['ComicSansMS-Italic'] = 'Comic Sans MS-Italic';\n  t['LucidaConsole'] = 'Courier';\n  t['LucidaConsole-Bold'] = 'Courier-Bold';\n  t['LucidaConsole-BoldItalic'] = 'Courier-BoldOblique';\n  t['LucidaConsole-Italic'] = 'Courier-Oblique';\n  t['MS-Gothic'] = 'MS Gothic';\n  t['MS-Gothic-Bold'] = 'MS Gothic-Bold';\n  t['MS-Gothic-BoldItalic'] = 'MS Gothic-BoldItalic';\n  t['MS-Gothic-Italic'] = 'MS Gothic-Italic';\n  t['MS-Mincho'] = 'MS Mincho';\n  t['MS-Mincho-Bold'] = 'MS Mincho-Bold';\n  t['MS-Mincho-BoldItalic'] = 'MS Mincho-BoldItalic';\n  t['MS-Mincho-Italic'] = 'MS Mincho-Italic';\n  t['MS-PGothic'] = 'MS PGothic';\n  t['MS-PGothic-Bold'] = 'MS PGothic-Bold';\n  t['MS-PGothic-BoldItalic'] = 'MS PGothic-BoldItalic';\n  t['MS-PGothic-Italic'] = 'MS PGothic-Italic';\n  t['MS-PMincho'] = 'MS PMincho';\n  t['MS-PMincho-Bold'] = 'MS PMincho-Bold';\n  t['MS-PMincho-BoldItalic'] = 'MS PMincho-BoldItalic';\n  t['MS-PMincho-Italic'] = 'MS PMincho-Italic';\n  t['NuptialScript'] = 'Times-Italic';\n  t['Wingdings'] = 'ZapfDingbats';\n});\nvar getSerifFonts = (0, _util.getLookupTableFactory)(function (t) {\n  t['Adobe Jenson'] = true;\n  t['Adobe Text'] = true;\n  t['Albertus'] = true;\n  t['Aldus'] = true;\n  t['Alexandria'] = true;\n  t['Algerian'] = true;\n  t['American Typewriter'] = true;\n  t['Antiqua'] = true;\n  t['Apex'] = true;\n  t['Arno'] = true;\n  t['Aster'] = true;\n  t['Aurora'] = true;\n  t['Baskerville'] = true;\n  t['Bell'] = true;\n  t['Bembo'] = true;\n  t['Bembo Schoolbook'] = true;\n  t['Benguiat'] = true;\n  t['Berkeley Old Style'] = true;\n  t['Bernhard Modern'] = true;\n  t['Berthold City'] = true;\n  t['Bodoni'] = true;\n  t['Bauer Bodoni'] = true;\n  t['Book Antiqua'] = true;\n  t['Bookman'] = true;\n  t['Bordeaux Roman'] = true;\n  t['Californian FB'] = true;\n  t['Calisto'] = true;\n  t['Calvert'] = true;\n  t['Capitals'] = true;\n  t['Cambria'] = true;\n  t['Cartier'] = true;\n  t['Caslon'] = true;\n  t['Catull'] = true;\n  t['Centaur'] = true;\n  t['Century Old Style'] = true;\n  t['Century Schoolbook'] = true;\n  t['Chaparral'] = true;\n  t['Charis SIL'] = true;\n  t['Cheltenham'] = true;\n  t['Cholla Slab'] = true;\n  t['Clarendon'] = true;\n  t['Clearface'] = true;\n  t['Cochin'] = true;\n  t['Colonna'] = true;\n  t['Computer Modern'] = true;\n  t['Concrete Roman'] = true;\n  t['Constantia'] = true;\n  t['Cooper Black'] = true;\n  t['Corona'] = true;\n  t['Ecotype'] = true;\n  t['Egyptienne'] = true;\n  t['Elephant'] = true;\n  t['Excelsior'] = true;\n  t['Fairfield'] = true;\n  t['FF Scala'] = true;\n  t['Folkard'] = true;\n  t['Footlight'] = true;\n  t['FreeSerif'] = true;\n  t['Friz Quadrata'] = true;\n  t['Garamond'] = true;\n  t['Gentium'] = true;\n  t['Georgia'] = true;\n  t['Gloucester'] = true;\n  t['Goudy Old Style'] = true;\n  t['Goudy Schoolbook'] = true;\n  t['Goudy Pro Font'] = true;\n  t['Granjon'] = true;\n  t['Guardian Egyptian'] = true;\n  t['Heather'] = true;\n  t['Hercules'] = true;\n  t['High Tower Text'] = true;\n  t['Hiroshige'] = true;\n  t['Hoefler Text'] = true;\n  t['Humana Serif'] = true;\n  t['Imprint'] = true;\n  t['Ionic No. 5'] = true;\n  t['Janson'] = true;\n  t['Joanna'] = true;\n  t['Korinna'] = true;\n  t['Lexicon'] = true;\n  t['Liberation Serif'] = true;\n  t['Linux Libertine'] = true;\n  t['Literaturnaya'] = true;\n  t['Lucida'] = true;\n  t['Lucida Bright'] = true;\n  t['Melior'] = true;\n  t['Memphis'] = true;\n  t['Miller'] = true;\n  t['Minion'] = true;\n  t['Modern'] = true;\n  t['Mona Lisa'] = true;\n  t['Mrs Eaves'] = true;\n  t['MS Serif'] = true;\n  t['Museo Slab'] = true;\n  t['New York'] = true;\n  t['Nimbus Roman'] = true;\n  t['NPS Rawlinson Roadway'] = true;\n  t['NuptialScript'] = true;\n  t['Palatino'] = true;\n  t['Perpetua'] = true;\n  t['Plantin'] = true;\n  t['Plantin Schoolbook'] = true;\n  t['Playbill'] = true;\n  t['Poor Richard'] = true;\n  t['Rawlinson Roadway'] = true;\n  t['Renault'] = true;\n  t['Requiem'] = true;\n  t['Rockwell'] = true;\n  t['Roman'] = true;\n  t['Rotis Serif'] = true;\n  t['Sabon'] = true;\n  t['Scala'] = true;\n  t['Seagull'] = true;\n  t['Sistina'] = true;\n  t['Souvenir'] = true;\n  t['STIX'] = true;\n  t['Stone Informal'] = true;\n  t['Stone Serif'] = true;\n  t['Sylfaen'] = true;\n  t['Times'] = true;\n  t['Trajan'] = true;\n  t['Trinité'] = true;\n  t['Trump Mediaeval'] = true;\n  t['Utopia'] = true;\n  t['Vale Type'] = true;\n  t['Bitstream Vera'] = true;\n  t['Vera Serif'] = true;\n  t['Versailles'] = true;\n  t['Wanted'] = true;\n  t['Weiss'] = true;\n  t['Wide Latin'] = true;\n  t['Windsor'] = true;\n  t['XITS'] = true;\n});\nvar getSymbolsFonts = (0, _util.getLookupTableFactory)(function (t) {\n  t['Dingbats'] = true;\n  t['Symbol'] = true;\n  t['ZapfDingbats'] = true;\n});\nvar getGlyphMapForStandardFonts = (0, _util.getLookupTableFactory)(function (t) {\n  t[2] = 10;\n  t[3] = 32;\n  t[4] = 33;\n  t[5] = 34;\n  t[6] = 35;\n  t[7] = 36;\n  t[8] = 37;\n  t[9] = 38;\n  t[10] = 39;\n  t[11] = 40;\n  t[12] = 41;\n  t[13] = 42;\n  t[14] = 43;\n  t[15] = 44;\n  t[16] = 45;\n  t[17] = 46;\n  t[18] = 47;\n  t[19] = 48;\n  t[20] = 49;\n  t[21] = 50;\n  t[22] = 51;\n  t[23] = 52;\n  t[24] = 53;\n  t[25] = 54;\n  t[26] = 55;\n  t[27] = 56;\n  t[28] = 57;\n  t[29] = 58;\n  t[30] = 894;\n  t[31] = 60;\n  t[32] = 61;\n  t[33] = 62;\n  t[34] = 63;\n  t[35] = 64;\n  t[36] = 65;\n  t[37] = 66;\n  t[38] = 67;\n  t[39] = 68;\n  t[40] = 69;\n  t[41] = 70;\n  t[42] = 71;\n  t[43] = 72;\n  t[44] = 73;\n  t[45] = 74;\n  t[46] = 75;\n  t[47] = 76;\n  t[48] = 77;\n  t[49] = 78;\n  t[50] = 79;\n  t[51] = 80;\n  t[52] = 81;\n  t[53] = 82;\n  t[54] = 83;\n  t[55] = 84;\n  t[56] = 85;\n  t[57] = 86;\n  t[58] = 87;\n  t[59] = 88;\n  t[60] = 89;\n  t[61] = 90;\n  t[62] = 91;\n  t[63] = 92;\n  t[64] = 93;\n  t[65] = 94;\n  t[66] = 95;\n  t[67] = 96;\n  t[68] = 97;\n  t[69] = 98;\n  t[70] = 99;\n  t[71] = 100;\n  t[72] = 101;\n  t[73] = 102;\n  t[74] = 103;\n  t[75] = 104;\n  t[76] = 105;\n  t[77] = 106;\n  t[78] = 107;\n  t[79] = 108;\n  t[80] = 109;\n  t[81] = 110;\n  t[82] = 111;\n  t[83] = 112;\n  t[84] = 113;\n  t[85] = 114;\n  t[86] = 115;\n  t[87] = 116;\n  t[88] = 117;\n  t[89] = 118;\n  t[90] = 119;\n  t[91] = 120;\n  t[92] = 121;\n  t[93] = 122;\n  t[94] = 123;\n  t[95] = 124;\n  t[96] = 125;\n  t[97] = 126;\n  t[98] = 196;\n  t[99] = 197;\n  t[100] = 199;\n  t[101] = 201;\n  t[102] = 209;\n  t[103] = 214;\n  t[104] = 220;\n  t[105] = 225;\n  t[106] = 224;\n  t[107] = 226;\n  t[108] = 228;\n  t[109] = 227;\n  t[110] = 229;\n  t[111] = 231;\n  t[112] = 233;\n  t[113] = 232;\n  t[114] = 234;\n  t[115] = 235;\n  t[116] = 237;\n  t[117] = 236;\n  t[118] = 238;\n  t[119] = 239;\n  t[120] = 241;\n  t[121] = 243;\n  t[122] = 242;\n  t[123] = 244;\n  t[124] = 246;\n  t[125] = 245;\n  t[126] = 250;\n  t[127] = 249;\n  t[128] = 251;\n  t[129] = 252;\n  t[130] = 8224;\n  t[131] = 176;\n  t[132] = 162;\n  t[133] = 163;\n  t[134] = 167;\n  t[135] = 8226;\n  t[136] = 182;\n  t[137] = 223;\n  t[138] = 174;\n  t[139] = 169;\n  t[140] = 8482;\n  t[141] = 180;\n  t[142] = 168;\n  t[143] = 8800;\n  t[144] = 198;\n  t[145] = 216;\n  t[146] = 8734;\n  t[147] = 177;\n  t[148] = 8804;\n  t[149] = 8805;\n  t[150] = 165;\n  t[151] = 181;\n  t[152] = 8706;\n  t[153] = 8721;\n  t[154] = 8719;\n  t[156] = 8747;\n  t[157] = 170;\n  t[158] = 186;\n  t[159] = 8486;\n  t[160] = 230;\n  t[161] = 248;\n  t[162] = 191;\n  t[163] = 161;\n  t[164] = 172;\n  t[165] = 8730;\n  t[166] = 402;\n  t[167] = 8776;\n  t[168] = 8710;\n  t[169] = 171;\n  t[170] = 187;\n  t[171] = 8230;\n  t[210] = 218;\n  t[223] = 711;\n  t[224] = 321;\n  t[225] = 322;\n  t[227] = 353;\n  t[229] = 382;\n  t[234] = 253;\n  t[252] = 263;\n  t[253] = 268;\n  t[254] = 269;\n  t[258] = 258;\n  t[260] = 260;\n  t[261] = 261;\n  t[265] = 280;\n  t[266] = 281;\n  t[268] = 283;\n  t[269] = 313;\n  t[275] = 323;\n  t[276] = 324;\n  t[278] = 328;\n  t[284] = 345;\n  t[285] = 346;\n  t[286] = 347;\n  t[292] = 367;\n  t[295] = 377;\n  t[296] = 378;\n  t[298] = 380;\n  t[305] = 963;\n  t[306] = 964;\n  t[307] = 966;\n  t[308] = 8215;\n  t[309] = 8252;\n  t[310] = 8319;\n  t[311] = 8359;\n  t[312] = 8592;\n  t[313] = 8593;\n  t[337] = 9552;\n  t[493] = 1039;\n  t[494] = 1040;\n  t[705] = 1524;\n  t[706] = 8362;\n  t[710] = 64288;\n  t[711] = 64298;\n  t[759] = 1617;\n  t[761] = 1776;\n  t[763] = 1778;\n  t[775] = 1652;\n  t[777] = 1764;\n  t[778] = 1780;\n  t[779] = 1781;\n  t[780] = 1782;\n  t[782] = 771;\n  t[783] = 64726;\n  t[786] = 8363;\n  t[788] = 8532;\n  t[790] = 768;\n  t[791] = 769;\n  t[792] = 768;\n  t[795] = 803;\n  t[797] = 64336;\n  t[798] = 64337;\n  t[799] = 64342;\n  t[800] = 64343;\n  t[801] = 64344;\n  t[802] = 64345;\n  t[803] = 64362;\n  t[804] = 64363;\n  t[805] = 64364;\n  t[2424] = 7821;\n  t[2425] = 7822;\n  t[2426] = 7823;\n  t[2427] = 7824;\n  t[2428] = 7825;\n  t[2429] = 7826;\n  t[2430] = 7827;\n  t[2433] = 7682;\n  t[2678] = 8045;\n  t[2679] = 8046;\n  t[2830] = 1552;\n  t[2838] = 686;\n  t[2840] = 751;\n  t[2842] = 753;\n  t[2843] = 754;\n  t[2844] = 755;\n  t[2846] = 757;\n  t[2856] = 767;\n  t[2857] = 848;\n  t[2858] = 849;\n  t[2862] = 853;\n  t[2863] = 854;\n  t[2864] = 855;\n  t[2865] = 861;\n  t[2866] = 862;\n  t[2906] = 7460;\n  t[2908] = 7462;\n  t[2909] = 7463;\n  t[2910] = 7464;\n  t[2912] = 7466;\n  t[2913] = 7467;\n  t[2914] = 7468;\n  t[2916] = 7470;\n  t[2917] = 7471;\n  t[2918] = 7472;\n  t[2920] = 7474;\n  t[2921] = 7475;\n  t[2922] = 7476;\n  t[2924] = 7478;\n  t[2925] = 7479;\n  t[2926] = 7480;\n  t[2928] = 7482;\n  t[2929] = 7483;\n  t[2930] = 7484;\n  t[2932] = 7486;\n  t[2933] = 7487;\n  t[2934] = 7488;\n  t[2936] = 7490;\n  t[2937] = 7491;\n  t[2938] = 7492;\n  t[2940] = 7494;\n  t[2941] = 7495;\n  t[2942] = 7496;\n  t[2944] = 7498;\n  t[2946] = 7500;\n  t[2948] = 7502;\n  t[2950] = 7504;\n  t[2951] = 7505;\n  t[2952] = 7506;\n  t[2954] = 7508;\n  t[2955] = 7509;\n  t[2956] = 7510;\n  t[2958] = 7512;\n  t[2959] = 7513;\n  t[2960] = 7514;\n  t[2962] = 7516;\n  t[2963] = 7517;\n  t[2964] = 7518;\n  t[2966] = 7520;\n  t[2967] = 7521;\n  t[2968] = 7522;\n  t[2970] = 7524;\n  t[2971] = 7525;\n  t[2972] = 7526;\n  t[2974] = 7528;\n  t[2975] = 7529;\n  t[2976] = 7530;\n  t[2978] = 1537;\n  t[2979] = 1538;\n  t[2980] = 1539;\n  t[2982] = 1549;\n  t[2983] = 1551;\n  t[2984] = 1552;\n  t[2986] = 1554;\n  t[2987] = 1555;\n  t[2988] = 1556;\n  t[2990] = 1623;\n  t[2991] = 1624;\n  t[2995] = 1775;\n  t[2999] = 1791;\n  t[3002] = 64290;\n  t[3003] = 64291;\n  t[3004] = 64292;\n  t[3006] = 64294;\n  t[3007] = 64295;\n  t[3008] = 64296;\n  t[3011] = 1900;\n  t[3014] = 8223;\n  t[3015] = 8244;\n  t[3017] = 7532;\n  t[3018] = 7533;\n  t[3019] = 7534;\n  t[3075] = 7590;\n  t[3076] = 7591;\n  t[3079] = 7594;\n  t[3080] = 7595;\n  t[3083] = 7598;\n  t[3084] = 7599;\n  t[3087] = 7602;\n  t[3088] = 7603;\n  t[3091] = 7606;\n  t[3092] = 7607;\n  t[3095] = 7610;\n  t[3096] = 7611;\n  t[3099] = 7614;\n  t[3100] = 7615;\n  t[3103] = 7618;\n  t[3104] = 7619;\n  t[3107] = 8337;\n  t[3108] = 8338;\n  t[3116] = 1884;\n  t[3119] = 1885;\n  t[3120] = 1885;\n  t[3123] = 1886;\n  t[3124] = 1886;\n  t[3127] = 1887;\n  t[3128] = 1887;\n  t[3131] = 1888;\n  t[3132] = 1888;\n  t[3135] = 1889;\n  t[3136] = 1889;\n  t[3139] = 1890;\n  t[3140] = 1890;\n  t[3143] = 1891;\n  t[3144] = 1891;\n  t[3147] = 1892;\n  t[3148] = 1892;\n  t[3153] = 580;\n  t[3154] = 581;\n  t[3157] = 584;\n  t[3158] = 585;\n  t[3161] = 588;\n  t[3162] = 589;\n  t[3165] = 891;\n  t[3166] = 892;\n  t[3169] = 1274;\n  t[3170] = 1275;\n  t[3173] = 1278;\n  t[3174] = 1279;\n  t[3181] = 7622;\n  t[3182] = 7623;\n  t[3282] = 11799;\n  t[3316] = 578;\n  t[3379] = 42785;\n  t[3393] = 1159;\n  t[3416] = 8377;\n});\nvar getSupplementalGlyphMapForArialBlack = (0, _util.getLookupTableFactory)(function (t) {\n  t[227] = 322;\n  t[264] = 261;\n  t[291] = 346;\n});\nexports.getStdFontMap = getStdFontMap;\nexports.getNonStdFontMap = getNonStdFontMap;\nexports.getSerifFonts = getSerifFonts;\nexports.getSymbolsFonts = getSymbolsFonts;\nexports.getGlyphMapForStandardFonts = getGlyphMapForStandardFonts;\nexports.getSupplementalGlyphMapForArialBlack = getSupplementalGlyphMapForArialBlack;\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.WorkerMessageHandler = exports.WorkerTask = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _pdf_manager = __w_pdfjs_require__(32);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar WorkerTask = function WorkerTaskClosure() {\n  function WorkerTask(name) {\n    this.name = name;\n    this.terminated = false;\n    this._capability = (0, _util.createPromiseCapability)();\n  }\n  WorkerTask.prototype = {\n    get finished() {\n      return this._capability.promise;\n    },\n    finish: function finish() {\n      this._capability.resolve();\n    },\n    terminate: function terminate() {\n      this.terminated = true;\n    },\n    ensureNotTerminated: function ensureNotTerminated() {\n      if (this.terminated) {\n        throw new Error('Worker task was terminated');\n      }\n    }\n  };\n  return WorkerTask;\n}();\n;\nvar PDFWorkerStream = function PDFWorkerStreamClosure() {\n  function PDFWorkerStream(msgHandler) {\n    this._msgHandler = msgHandler;\n    this._contentLength = null;\n    this._fullRequestReader = null;\n    this._rangeRequestReaders = [];\n  }\n  PDFWorkerStream.prototype = {\n    getFullReader: function getFullReader() {\n      (0, _util.assert)(!this._fullRequestReader);\n      this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler);\n      return this._fullRequestReader;\n    },\n    getRangeReader: function getRangeReader(begin, end) {\n      var reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler);\n      this._rangeRequestReaders.push(reader);\n      return reader;\n    },\n    cancelAllRequests: function cancelAllRequests(reason) {\n      if (this._fullRequestReader) {\n        this._fullRequestReader.cancel(reason);\n      }\n      var readers = this._rangeRequestReaders.slice(0);\n      readers.forEach(function (reader) {\n        reader.cancel(reason);\n      });\n    }\n  };\n  function PDFWorkerStreamReader(msgHandler) {\n    var _this = this;\n\n    this._msgHandler = msgHandler;\n    this._contentLength = null;\n    this._isRangeSupported = false;\n    this._isStreamingSupported = false;\n    var readableStream = this._msgHandler.sendWithStream('GetReader');\n    this._reader = readableStream.getReader();\n    this._headersReady = this._msgHandler.sendWithPromise('ReaderHeadersReady').then(function (data) {\n      _this._isStreamingSupported = data.isStreamingSupported;\n      _this._isRangeSupported = data.isRangeSupported;\n      _this._contentLength = data.contentLength;\n    });\n  }\n  PDFWorkerStreamReader.prototype = {\n    get headersReady() {\n      return this._headersReady;\n    },\n    get contentLength() {\n      return this._contentLength;\n    },\n    get isStreamingSupported() {\n      return this._isStreamingSupported;\n    },\n    get isRangeSupported() {\n      return this._isRangeSupported;\n    },\n    read: function read() {\n      return this._reader.read().then(function (_ref) {\n        var value = _ref.value,\n            done = _ref.done;\n\n        if (done) {\n          return {\n            value: undefined,\n            done: true\n          };\n        }\n        return {\n          value: value.buffer,\n          done: false\n        };\n      });\n    },\n    cancel: function cancel(reason) {\n      this._reader.cancel(reason);\n    }\n  };\n  function PDFWorkerStreamRangeReader(begin, end, msgHandler) {\n    this._msgHandler = msgHandler;\n    this.onProgress = null;\n    var readableStream = this._msgHandler.sendWithStream('GetRangeReader', {\n      begin: begin,\n      end: end\n    });\n    this._reader = readableStream.getReader();\n  }\n  PDFWorkerStreamRangeReader.prototype = {\n    get isStreamingSupported() {\n      return false;\n    },\n    read: function read() {\n      return this._reader.read().then(function (_ref2) {\n        var value = _ref2.value,\n            done = _ref2.done;\n\n        if (done) {\n          return {\n            value: undefined,\n            done: true\n          };\n        }\n        return {\n          value: value.buffer,\n          done: false\n        };\n      });\n    },\n    cancel: function cancel(reason) {\n      this._reader.cancel(reason);\n    }\n  };\n  return PDFWorkerStream;\n}();\nvar WorkerMessageHandler = {\n  setup: function setup(handler, port) {\n    var testMessageProcessed = false;\n    handler.on('test', function wphSetupTest(data) {\n      if (testMessageProcessed) {\n        return;\n      }\n      testMessageProcessed = true;\n      if (!(data instanceof Uint8Array)) {\n        handler.send('test', 'main', false);\n        return;\n      }\n      var supportTransfers = data[0] === 255;\n      handler.postMessageTransfers = supportTransfers;\n      var xhr = new XMLHttpRequest();\n      var responseExists = 'response' in xhr;\n      try {\n        xhr.responseType;\n      } catch (e) {\n        responseExists = false;\n      }\n      if (!responseExists) {\n        handler.send('test', false);\n        return;\n      }\n      handler.send('test', {\n        supportTypedArray: true,\n        supportTransfers: supportTransfers\n      });\n    });\n    handler.on('configure', function wphConfigure(data) {\n      (0, _util.setVerbosityLevel)(data.verbosity);\n    });\n    handler.on('GetDocRequest', function wphSetupDoc(data) {\n      return WorkerMessageHandler.createDocumentHandler(data, port);\n    });\n  },\n  createDocumentHandler: function createDocumentHandler(docParams, port) {\n    var pdfManager;\n    var terminated = false;\n    var cancelXHRs = null;\n    var WorkerTasks = [];\n    var docId = docParams.docId;\n    var docBaseUrl = docParams.docBaseUrl;\n    var workerHandlerName = docParams.docId + '_worker';\n    var handler = new _util.MessageHandler(workerHandlerName, docId, port);\n    handler.postMessageTransfers = docParams.postMessageTransfers;\n    function ensureNotTerminated() {\n      if (terminated) {\n        throw new Error('Worker was terminated');\n      }\n    }\n    function startWorkerTask(task) {\n      WorkerTasks.push(task);\n    }\n    function finishWorkerTask(task) {\n      task.finish();\n      var i = WorkerTasks.indexOf(task);\n      WorkerTasks.splice(i, 1);\n    }\n    function loadDocument(recoveryMode) {\n      var loadDocumentCapability = (0, _util.createPromiseCapability)();\n      var parseSuccess = function parseSuccess() {\n        var numPagesPromise = pdfManager.ensureDoc('numPages');\n        var fingerprintPromise = pdfManager.ensureDoc('fingerprint');\n        var encryptedPromise = pdfManager.ensureXRef('encrypt');\n        Promise.all([numPagesPromise, fingerprintPromise, encryptedPromise]).then(function onDocReady(results) {\n          var doc = {\n            numPages: results[0],\n            fingerprint: results[1],\n            encrypted: !!results[2]\n          };\n          loadDocumentCapability.resolve(doc);\n        }, parseFailure);\n      };\n      var parseFailure = function parseFailure(e) {\n        loadDocumentCapability.reject(e);\n      };\n      pdfManager.ensureDoc('checkHeader', []).then(function () {\n        pdfManager.ensureDoc('parseStartXRef', []).then(function () {\n          pdfManager.ensureDoc('parse', [recoveryMode]).then(parseSuccess, parseFailure);\n        }, parseFailure);\n      }, parseFailure);\n      return loadDocumentCapability.promise;\n    }\n    function getPdfManager(data, evaluatorOptions) {\n      var pdfManagerCapability = (0, _util.createPromiseCapability)();\n      var pdfManager;\n      var source = data.source;\n      if (source.data) {\n        try {\n          pdfManager = new _pdf_manager.LocalPdfManager(docId, source.data, source.password, evaluatorOptions, docBaseUrl);\n          pdfManagerCapability.resolve(pdfManager);\n        } catch (ex) {\n          pdfManagerCapability.reject(ex);\n        }\n        return pdfManagerCapability.promise;\n      }\n      var pdfStream,\n          cachedChunks = [];\n      try {\n        pdfStream = new PDFWorkerStream(handler);\n      } catch (ex) {\n        pdfManagerCapability.reject(ex);\n        return pdfManagerCapability.promise;\n      }\n      var fullRequest = pdfStream.getFullReader();\n      fullRequest.headersReady.then(function () {\n        if (!fullRequest.isRangeSupported) {\n          return;\n        }\n        var disableAutoFetch = source.disableAutoFetch || fullRequest.isStreamingSupported;\n        pdfManager = new _pdf_manager.NetworkPdfManager(docId, pdfStream, {\n          msgHandler: handler,\n          url: source.url,\n          password: source.password,\n          length: fullRequest.contentLength,\n          disableAutoFetch: disableAutoFetch,\n          rangeChunkSize: source.rangeChunkSize\n        }, evaluatorOptions, docBaseUrl);\n        for (var i = 0; i < cachedChunks.length; i++) {\n          pdfManager.sendProgressiveData(cachedChunks[i]);\n        }\n        cachedChunks = [];\n        pdfManagerCapability.resolve(pdfManager);\n        cancelXHRs = null;\n      }).catch(function (reason) {\n        pdfManagerCapability.reject(reason);\n        cancelXHRs = null;\n      });\n      var loaded = 0;\n      var flushChunks = function flushChunks() {\n        var pdfFile = (0, _util.arraysToBytes)(cachedChunks);\n        if (source.length && pdfFile.length !== source.length) {\n          (0, _util.warn)('reported HTTP length is different from actual');\n        }\n        try {\n          pdfManager = new _pdf_manager.LocalPdfManager(docId, pdfFile, source.password, evaluatorOptions, docBaseUrl);\n          pdfManagerCapability.resolve(pdfManager);\n        } catch (ex) {\n          pdfManagerCapability.reject(ex);\n        }\n        cachedChunks = [];\n      };\n      var readPromise = new Promise(function (resolve, reject) {\n        var readChunk = function readChunk(chunk) {\n          try {\n            ensureNotTerminated();\n            if (chunk.done) {\n              if (!pdfManager) {\n                flushChunks();\n              }\n              cancelXHRs = null;\n              return;\n            }\n            var data = chunk.value;\n            loaded += (0, _util.arrayByteLength)(data);\n            if (!fullRequest.isStreamingSupported) {\n              handler.send('DocProgress', {\n                loaded: loaded,\n                total: Math.max(loaded, fullRequest.contentLength || 0)\n              });\n            }\n            if (pdfManager) {\n              pdfManager.sendProgressiveData(data);\n            } else {\n              cachedChunks.push(data);\n            }\n            fullRequest.read().then(readChunk, reject);\n          } catch (e) {\n            reject(e);\n          }\n        };\n        fullRequest.read().then(readChunk, reject);\n      });\n      readPromise.catch(function (e) {\n        pdfManagerCapability.reject(e);\n        cancelXHRs = null;\n      });\n      cancelXHRs = function cancelXHRs() {\n        pdfStream.cancelAllRequests('abort');\n      };\n      return pdfManagerCapability.promise;\n    }\n    function setupDoc(data) {\n      function onSuccess(doc) {\n        ensureNotTerminated();\n        handler.send('GetDoc', { pdfInfo: doc });\n      }\n      function onFailure(e) {\n        ensureNotTerminated();\n        if (e instanceof _util.PasswordException) {\n          var task = new WorkerTask('PasswordException: response ' + e.code);\n          startWorkerTask(task);\n          handler.sendWithPromise('PasswordRequest', e).then(function (data) {\n            finishWorkerTask(task);\n            pdfManager.updatePassword(data.password);\n            pdfManagerReady();\n          }).catch(function (ex) {\n            finishWorkerTask(task);\n            handler.send('PasswordException', ex);\n          }.bind(null, e));\n        } else if (e instanceof _util.InvalidPDFException) {\n          handler.send('InvalidPDF', e);\n        } else if (e instanceof _util.MissingPDFException) {\n          handler.send('MissingPDF', e);\n        } else if (e instanceof _util.UnexpectedResponseException) {\n          handler.send('UnexpectedResponse', e);\n        } else {\n          handler.send('UnknownError', new _util.UnknownErrorException(e.message, e.toString()));\n        }\n      }\n      function pdfManagerReady() {\n        ensureNotTerminated();\n        loadDocument(false).then(onSuccess, function loadFailure(ex) {\n          ensureNotTerminated();\n          if (!(ex instanceof _util.XRefParseException)) {\n            onFailure(ex);\n            return;\n          }\n          pdfManager.requestLoadedStream();\n          pdfManager.onLoadedStream().then(function () {\n            ensureNotTerminated();\n            loadDocument(true).then(onSuccess, onFailure);\n          });\n        }, onFailure);\n      }\n      ensureNotTerminated();\n      var evaluatorOptions = {\n        forceDataSchema: data.disableCreateObjectURL,\n        maxImageSize: data.maxImageSize === undefined ? -1 : data.maxImageSize,\n        disableFontFace: data.disableFontFace,\n        nativeImageDecoderSupport: data.nativeImageDecoderSupport,\n        ignoreErrors: data.ignoreErrors\n      };\n      getPdfManager(data, evaluatorOptions).then(function (newPdfManager) {\n        if (terminated) {\n          newPdfManager.terminate();\n          throw new Error('Worker was terminated');\n        }\n        pdfManager = newPdfManager;\n        handler.send('PDFManagerReady', null);\n        pdfManager.onLoadedStream().then(function (stream) {\n          handler.send('DataLoaded', { length: stream.bytes.byteLength });\n        });\n      }).then(pdfManagerReady, onFailure);\n    }\n    handler.on('GetPage', function wphSetupGetPage(data) {\n      return pdfManager.getPage(data.pageIndex).then(function (page) {\n        var rotatePromise = pdfManager.ensure(page, 'rotate');\n        var refPromise = pdfManager.ensure(page, 'ref');\n        var userUnitPromise = pdfManager.ensure(page, 'userUnit');\n        var viewPromise = pdfManager.ensure(page, 'view');\n        return Promise.all([rotatePromise, refPromise, userUnitPromise, viewPromise]).then(function (results) {\n          return {\n            rotate: results[0],\n            ref: results[1],\n            userUnit: results[2],\n            view: results[3]\n          };\n        });\n      });\n    });\n    handler.on('GetPageIndex', function wphSetupGetPageIndex(data) {\n      var ref = new _primitives.Ref(data.ref.num, data.ref.gen);\n      var catalog = pdfManager.pdfDocument.catalog;\n      return catalog.getPageIndex(ref);\n    });\n    handler.on('GetDestinations', function wphSetupGetDestinations(data) {\n      return pdfManager.ensureCatalog('destinations');\n    });\n    handler.on('GetDestination', function wphSetupGetDestination(data) {\n      return pdfManager.ensureCatalog('getDestination', [data.id]);\n    });\n    handler.on('GetPageLabels', function wphSetupGetPageLabels(data) {\n      return pdfManager.ensureCatalog('pageLabels');\n    });\n    handler.on('GetPageMode', function wphSetupGetPageMode(data) {\n      return pdfManager.ensureCatalog('pageMode');\n    });\n    handler.on('GetAttachments', function wphSetupGetAttachments(data) {\n      return pdfManager.ensureCatalog('attachments');\n    });\n    handler.on('GetJavaScript', function wphSetupGetJavaScript(data) {\n      return pdfManager.ensureCatalog('javaScript');\n    });\n    handler.on('GetOutline', function wphSetupGetOutline(data) {\n      return pdfManager.ensureCatalog('documentOutline');\n    });\n    handler.on('GetMetadata', function wphSetupGetMetadata(data) {\n      return Promise.all([pdfManager.ensureDoc('documentInfo'), pdfManager.ensureCatalog('metadata')]);\n    });\n    handler.on('GetData', function wphSetupGetData(data) {\n      pdfManager.requestLoadedStream();\n      return pdfManager.onLoadedStream().then(function (stream) {\n        return stream.bytes;\n      });\n    });\n    handler.on('GetStats', function wphSetupGetStats(data) {\n      return pdfManager.pdfDocument.xref.stats;\n    });\n    handler.on('GetAnnotations', function wphSetupGetAnnotations(data) {\n      return pdfManager.getPage(data.pageIndex).then(function (page) {\n        return pdfManager.ensure(page, 'getAnnotationsData', [data.intent]);\n      });\n    });\n    handler.on('RenderPageRequest', function wphSetupRenderPage(data) {\n      var pageIndex = data.pageIndex;\n      pdfManager.getPage(pageIndex).then(function (page) {\n        var task = new WorkerTask('RenderPageRequest: page ' + pageIndex);\n        startWorkerTask(task);\n        var pageNum = pageIndex + 1;\n        var start = Date.now();\n        page.getOperatorList({\n          handler: handler,\n          task: task,\n          intent: data.intent,\n          renderInteractiveForms: data.renderInteractiveForms\n        }).then(function (operatorList) {\n          finishWorkerTask(task);\n          (0, _util.info)('page=' + pageNum + ' - getOperatorList: time=' + (Date.now() - start) + 'ms, len=' + operatorList.totalLength);\n        }, function (e) {\n          finishWorkerTask(task);\n          if (task.terminated) {\n            return;\n          }\n          handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.unknown });\n          var minimumStackMessage = 'worker.js: while trying to getPage() and getOperatorList()';\n          var wrappedException;\n          if (typeof e === 'string') {\n            wrappedException = {\n              message: e,\n              stack: minimumStackMessage\n            };\n          } else if ((typeof e === 'undefined' ? 'undefined' : _typeof(e)) === 'object') {\n            wrappedException = {\n              message: e.message || e.toString(),\n              stack: e.stack || minimumStackMessage\n            };\n          } else {\n            wrappedException = {\n              message: 'Unknown exception type: ' + (typeof e === 'undefined' ? 'undefined' : _typeof(e)),\n              stack: minimumStackMessage\n            };\n          }\n          handler.send('PageError', {\n            pageNum: pageNum,\n            error: wrappedException,\n            intent: data.intent\n          });\n        });\n      });\n    }, this);\n    handler.on('GetTextContent', function wphExtractText(data, sink) {\n      var pageIndex = data.pageIndex;\n      sink.onPull = function (desiredSize) {};\n      sink.onCancel = function (reason) {};\n      pdfManager.getPage(pageIndex).then(function (page) {\n        var task = new WorkerTask('GetTextContent: page ' + pageIndex);\n        startWorkerTask(task);\n        var pageNum = pageIndex + 1;\n        var start = Date.now();\n        page.extractTextContent({\n          handler: handler,\n          task: task,\n          sink: sink,\n          normalizeWhitespace: data.normalizeWhitespace,\n          combineTextItems: data.combineTextItems\n        }).then(function () {\n          finishWorkerTask(task);\n          (0, _util.info)('text indexing: page=' + pageNum + ' - time=' + (Date.now() - start) + 'ms');\n          sink.close();\n        }, function (reason) {\n          finishWorkerTask(task);\n          if (task.terminated) {\n            return;\n          }\n          sink.error(reason);\n          throw reason;\n        });\n      });\n    });\n    handler.on('Cleanup', function wphCleanup(data) {\n      return pdfManager.cleanup();\n    });\n    handler.on('Terminate', function wphTerminate(data) {\n      terminated = true;\n      if (pdfManager) {\n        pdfManager.terminate();\n        pdfManager = null;\n      }\n      if (cancelXHRs) {\n        cancelXHRs();\n      }\n      var waitOn = [];\n      WorkerTasks.forEach(function (task) {\n        waitOn.push(task.finished);\n        task.terminate();\n      });\n      return Promise.all(waitOn).then(function () {\n        handler.destroy();\n        handler = null;\n      });\n    });\n    handler.on('Ready', function wphReady(data) {\n      setupDoc(docParams);\n      docParams = null;\n    });\n    return workerHandlerName;\n  },\n  initializeFromPort: function initializeFromPort(port) {\n    var handler = new _util.MessageHandler('worker', 'main', port);\n    WorkerMessageHandler.setup(handler, port);\n    handler.send('ready', null);\n  }\n};\nfunction isMessagePort(maybePort) {\n  return typeof maybePort.postMessage === 'function' && 'onmessage' in maybePort;\n}\nif (typeof window === 'undefined' && !(0, _util.isNodeJS)() && typeof self !== 'undefined' && isMessagePort(self)) {\n  WorkerMessageHandler.initializeFromPort(self);\n}\nexports.WorkerTask = WorkerTask;\nexports.WorkerMessageHandler = WorkerMessageHandler;\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _typeof2 = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n(function (e, a) {\n  for (var i in a) {\n    e[i] = a[i];\n  }\n})(exports, function (modules) {\n  var installedModules = {};\n  function __w_pdfjs_require__(moduleId) {\n    if (installedModules[moduleId]) return installedModules[moduleId].exports;\n    var module = installedModules[moduleId] = {\n      i: moduleId,\n      l: false,\n      exports: {}\n    };\n    modules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);\n    module.l = true;\n    return module.exports;\n  }\n  __w_pdfjs_require__.m = modules;\n  __w_pdfjs_require__.c = installedModules;\n  __w_pdfjs_require__.i = function (value) {\n    return value;\n  };\n  __w_pdfjs_require__.d = function (exports, name, getter) {\n    if (!__w_pdfjs_require__.o(exports, name)) {\n      Object.defineProperty(exports, name, {\n        configurable: false,\n        enumerable: true,\n        get: getter\n      });\n    }\n  };\n  __w_pdfjs_require__.n = function (module) {\n    var getter = module && module.__esModule ? function getDefault() {\n      return module['default'];\n    } : function getModuleExports() {\n      return module;\n    };\n    __w_pdfjs_require__.d(getter, 'a', getter);\n    return getter;\n  };\n  __w_pdfjs_require__.o = function (object, property) {\n    return Object.prototype.hasOwnProperty.call(object, property);\n  };\n  __w_pdfjs_require__.p = \"\";\n  return __w_pdfjs_require__(__w_pdfjs_require__.s = 7);\n}([function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _typeof = typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\" ? function (obj) {\n    return typeof obj === 'undefined' ? 'undefined' : _typeof2(obj);\n  } : function (obj) {\n    return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj === 'undefined' ? 'undefined' : _typeof2(obj);\n  };\n  var _require = __w_pdfjs_require__(1),\n      assert = _require.assert;\n  function IsPropertyKey(argument) {\n    return typeof argument === 'string' || (typeof argument === 'undefined' ? 'undefined' : _typeof(argument)) === 'symbol';\n  }\n  exports.typeIsObject = function (x) {\n    return (typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'object' && x !== null || typeof x === 'function';\n  };\n  exports.createDataProperty = function (o, p, v) {\n    assert(exports.typeIsObject(o));\n    Object.defineProperty(o, p, {\n      value: v,\n      writable: true,\n      enumerable: true,\n      configurable: true\n    });\n  };\n  exports.createArrayFromList = function (elements) {\n    return elements.slice();\n  };\n  exports.ArrayBufferCopy = function (dest, destOffset, src, srcOffset, n) {\n    new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset);\n  };\n  exports.CreateIterResultObject = function (value, done) {\n    assert(typeof done === 'boolean');\n    var obj = {};\n    Object.defineProperty(obj, 'value', {\n      value: value,\n      enumerable: true,\n      writable: true,\n      configurable: true\n    });\n    Object.defineProperty(obj, 'done', {\n      value: done,\n      enumerable: true,\n      writable: true,\n      configurable: true\n    });\n    return obj;\n  };\n  exports.IsFiniteNonNegativeNumber = function (v) {\n    if (Number.isNaN(v)) {\n      return false;\n    }\n    if (v === Infinity) {\n      return false;\n    }\n    if (v < 0) {\n      return false;\n    }\n    return true;\n  };\n  function Call(F, V, args) {\n    if (typeof F !== 'function') {\n      throw new TypeError('Argument is not a function');\n    }\n    return Function.prototype.apply.call(F, V, args);\n  }\n  exports.InvokeOrNoop = function (O, P, args) {\n    assert(O !== undefined);\n    assert(IsPropertyKey(P));\n    assert(Array.isArray(args));\n    var method = O[P];\n    if (method === undefined) {\n      return undefined;\n    }\n    return Call(method, O, args);\n  };\n  exports.PromiseInvokeOrNoop = function (O, P, args) {\n    assert(O !== undefined);\n    assert(IsPropertyKey(P));\n    assert(Array.isArray(args));\n    try {\n      return Promise.resolve(exports.InvokeOrNoop(O, P, args));\n    } catch (returnValueE) {\n      return Promise.reject(returnValueE);\n    }\n  };\n  exports.PromiseInvokeOrPerformFallback = function (O, P, args, F, argsF) {\n    assert(O !== undefined);\n    assert(IsPropertyKey(P));\n    assert(Array.isArray(args));\n    assert(Array.isArray(argsF));\n    var method = void 0;\n    try {\n      method = O[P];\n    } catch (methodE) {\n      return Promise.reject(methodE);\n    }\n    if (method === undefined) {\n      return F.apply(null, argsF);\n    }\n    try {\n      return Promise.resolve(Call(method, O, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n  exports.TransferArrayBuffer = function (O) {\n    return O.slice();\n  };\n  exports.ValidateAndNormalizeHighWaterMark = function (highWaterMark) {\n    highWaterMark = Number(highWaterMark);\n    if (Number.isNaN(highWaterMark) || highWaterMark < 0) {\n      throw new RangeError('highWaterMark property of a queuing strategy must be non-negative and non-NaN');\n    }\n    return highWaterMark;\n  };\n  exports.ValidateAndNormalizeQueuingStrategy = function (size, highWaterMark) {\n    if (size !== undefined && typeof size !== 'function') {\n      throw new TypeError('size property of a queuing strategy must be a function');\n    }\n    highWaterMark = exports.ValidateAndNormalizeHighWaterMark(highWaterMark);\n    return {\n      size: size,\n      highWaterMark: highWaterMark\n    };\n  };\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  function rethrowAssertionErrorRejection(e) {\n    if (e && e.constructor === AssertionError) {\n      setTimeout(function () {\n        throw e;\n      }, 0);\n    }\n  }\n  function AssertionError(message) {\n    this.name = 'AssertionError';\n    this.message = message || '';\n    this.stack = new Error().stack;\n  }\n  AssertionError.prototype = Object.create(Error.prototype);\n  AssertionError.prototype.constructor = AssertionError;\n  function assert(value, message) {\n    if (!value) {\n      throw new AssertionError(message);\n    }\n  }\n  module.exports = {\n    rethrowAssertionErrorRejection: rethrowAssertionErrorRejection,\n    AssertionError: AssertionError,\n    assert: assert\n  };\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n  var _require = __w_pdfjs_require__(0),\n      InvokeOrNoop = _require.InvokeOrNoop,\n      PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,\n      ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,\n      typeIsObject = _require.typeIsObject;\n  var _require2 = __w_pdfjs_require__(1),\n      assert = _require2.assert,\n      rethrowAssertionErrorRejection = _require2.rethrowAssertionErrorRejection;\n  var _require3 = __w_pdfjs_require__(3),\n      DequeueValue = _require3.DequeueValue,\n      EnqueueValueWithSize = _require3.EnqueueValueWithSize,\n      PeekQueueValue = _require3.PeekQueueValue,\n      ResetQueue = _require3.ResetQueue;\n  var WritableStream = function () {\n    function WritableStream() {\n      var underlyingSink = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          size = _ref.size,\n          _ref$highWaterMark = _ref.highWaterMark,\n          highWaterMark = _ref$highWaterMark === undefined ? 1 : _ref$highWaterMark;\n      _classCallCheck(this, WritableStream);\n      this._state = 'writable';\n      this._storedError = undefined;\n      this._writer = undefined;\n      this._writableStreamController = undefined;\n      this._writeRequests = [];\n      this._inFlightWriteRequest = undefined;\n      this._closeRequest = undefined;\n      this._inFlightCloseRequest = undefined;\n      this._pendingAbortRequest = undefined;\n      this._backpressure = false;\n      var type = underlyingSink.type;\n      if (type !== undefined) {\n        throw new RangeError('Invalid type is specified');\n      }\n      this._writableStreamController = new WritableStreamDefaultController(this, underlyingSink, size, highWaterMark);\n      this._writableStreamController.__startSteps();\n    }\n    _createClass(WritableStream, [{\n      key: 'abort',\n      value: function abort(reason) {\n        if (IsWritableStream(this) === false) {\n          return Promise.reject(streamBrandCheckException('abort'));\n        }\n        if (IsWritableStreamLocked(this) === true) {\n          return Promise.reject(new TypeError('Cannot abort a stream that already has a writer'));\n        }\n        return WritableStreamAbort(this, reason);\n      }\n    }, {\n      key: 'getWriter',\n      value: function getWriter() {\n        if (IsWritableStream(this) === false) {\n          throw streamBrandCheckException('getWriter');\n        }\n        return AcquireWritableStreamDefaultWriter(this);\n      }\n    }, {\n      key: 'locked',\n      get: function get() {\n        if (IsWritableStream(this) === false) {\n          throw streamBrandCheckException('locked');\n        }\n        return IsWritableStreamLocked(this);\n      }\n    }]);\n    return WritableStream;\n  }();\n  module.exports = {\n    AcquireWritableStreamDefaultWriter: AcquireWritableStreamDefaultWriter,\n    IsWritableStream: IsWritableStream,\n    IsWritableStreamLocked: IsWritableStreamLocked,\n    WritableStream: WritableStream,\n    WritableStreamAbort: WritableStreamAbort,\n    WritableStreamDefaultControllerError: WritableStreamDefaultControllerError,\n    WritableStreamDefaultWriterCloseWithErrorPropagation: WritableStreamDefaultWriterCloseWithErrorPropagation,\n    WritableStreamDefaultWriterRelease: WritableStreamDefaultWriterRelease,\n    WritableStreamDefaultWriterWrite: WritableStreamDefaultWriterWrite,\n    WritableStreamCloseQueuedOrInFlight: WritableStreamCloseQueuedOrInFlight\n  };\n  function AcquireWritableStreamDefaultWriter(stream) {\n    return new WritableStreamDefaultWriter(stream);\n  }\n  function IsWritableStream(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) {\n      return false;\n    }\n    return true;\n  }\n  function IsWritableStreamLocked(stream) {\n    assert(IsWritableStream(stream) === true, 'IsWritableStreamLocked should only be used on known writable streams');\n    if (stream._writer === undefined) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamAbort(stream, reason) {\n    var state = stream._state;\n    if (state === 'closed') {\n      return Promise.resolve(undefined);\n    }\n    if (state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    var error = new TypeError('Requested to abort');\n    if (stream._pendingAbortRequest !== undefined) {\n      return Promise.reject(error);\n    }\n    assert(state === 'writable' || state === 'erroring', 'state must be writable or erroring');\n    var wasAlreadyErroring = false;\n    if (state === 'erroring') {\n      wasAlreadyErroring = true;\n      reason = undefined;\n    }\n    var promise = new Promise(function (resolve, reject) {\n      stream._pendingAbortRequest = {\n        _resolve: resolve,\n        _reject: reject,\n        _reason: reason,\n        _wasAlreadyErroring: wasAlreadyErroring\n      };\n    });\n    if (wasAlreadyErroring === false) {\n      WritableStreamStartErroring(stream, error);\n    }\n    return promise;\n  }\n  function WritableStreamAddWriteRequest(stream) {\n    assert(IsWritableStreamLocked(stream) === true);\n    assert(stream._state === 'writable');\n    var promise = new Promise(function (resolve, reject) {\n      var writeRequest = {\n        _resolve: resolve,\n        _reject: reject\n      };\n      stream._writeRequests.push(writeRequest);\n    });\n    return promise;\n  }\n  function WritableStreamDealWithRejection(stream, error) {\n    var state = stream._state;\n    if (state === 'writable') {\n      WritableStreamStartErroring(stream, error);\n      return;\n    }\n    assert(state === 'erroring');\n    WritableStreamFinishErroring(stream);\n  }\n  function WritableStreamStartErroring(stream, reason) {\n    assert(stream._storedError === undefined, 'stream._storedError === undefined');\n    assert(stream._state === 'writable', 'state must be writable');\n    var controller = stream._writableStreamController;\n    assert(controller !== undefined, 'controller must not be undefined');\n    stream._state = 'erroring';\n    stream._storedError = reason;\n    var writer = stream._writer;\n    if (writer !== undefined) {\n      WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason);\n    }\n    if (WritableStreamHasOperationMarkedInFlight(stream) === false && controller._started === true) {\n      WritableStreamFinishErroring(stream);\n    }\n  }\n  function WritableStreamFinishErroring(stream) {\n    assert(stream._state === 'erroring', 'stream._state === erroring');\n    assert(WritableStreamHasOperationMarkedInFlight(stream) === false, 'WritableStreamHasOperationMarkedInFlight(stream) === false');\n    stream._state = 'errored';\n    stream._writableStreamController.__errorSteps();\n    var storedError = stream._storedError;\n    for (var i = 0; i < stream._writeRequests.length; i++) {\n      var writeRequest = stream._writeRequests[i];\n      writeRequest._reject(storedError);\n    }\n    stream._writeRequests = [];\n    if (stream._pendingAbortRequest === undefined) {\n      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n      return;\n    }\n    var abortRequest = stream._pendingAbortRequest;\n    stream._pendingAbortRequest = undefined;\n    if (abortRequest._wasAlreadyErroring === true) {\n      abortRequest._reject(storedError);\n      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n      return;\n    }\n    var promise = stream._writableStreamController.__abortSteps(abortRequest._reason);\n    promise.then(function () {\n      abortRequest._resolve();\n      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n    }, function (reason) {\n      abortRequest._reject(reason);\n      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n    });\n  }\n  function WritableStreamFinishInFlightWrite(stream) {\n    assert(stream._inFlightWriteRequest !== undefined);\n    stream._inFlightWriteRequest._resolve(undefined);\n    stream._inFlightWriteRequest = undefined;\n  }\n  function WritableStreamFinishInFlightWriteWithError(stream, error) {\n    assert(stream._inFlightWriteRequest !== undefined);\n    stream._inFlightWriteRequest._reject(error);\n    stream._inFlightWriteRequest = undefined;\n    assert(stream._state === 'writable' || stream._state === 'erroring');\n    WritableStreamDealWithRejection(stream, error);\n  }\n  function WritableStreamFinishInFlightClose(stream) {\n    assert(stream._inFlightCloseRequest !== undefined);\n    stream._inFlightCloseRequest._resolve(undefined);\n    stream._inFlightCloseRequest = undefined;\n    var state = stream._state;\n    assert(state === 'writable' || state === 'erroring');\n    if (state === 'erroring') {\n      stream._storedError = undefined;\n      if (stream._pendingAbortRequest !== undefined) {\n        stream._pendingAbortRequest._resolve();\n        stream._pendingAbortRequest = undefined;\n      }\n    }\n    stream._state = 'closed';\n    var writer = stream._writer;\n    if (writer !== undefined) {\n      defaultWriterClosedPromiseResolve(writer);\n    }\n    assert(stream._pendingAbortRequest === undefined, 'stream._pendingAbortRequest === undefined');\n    assert(stream._storedError === undefined, 'stream._storedError === undefined');\n  }\n  function WritableStreamFinishInFlightCloseWithError(stream, error) {\n    assert(stream._inFlightCloseRequest !== undefined);\n    stream._inFlightCloseRequest._reject(error);\n    stream._inFlightCloseRequest = undefined;\n    assert(stream._state === 'writable' || stream._state === 'erroring');\n    if (stream._pendingAbortRequest !== undefined) {\n      stream._pendingAbortRequest._reject(error);\n      stream._pendingAbortRequest = undefined;\n    }\n    WritableStreamDealWithRejection(stream, error);\n  }\n  function WritableStreamCloseQueuedOrInFlight(stream) {\n    if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamHasOperationMarkedInFlight(stream) {\n    if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamMarkCloseRequestInFlight(stream) {\n    assert(stream._inFlightCloseRequest === undefined);\n    assert(stream._closeRequest !== undefined);\n    stream._inFlightCloseRequest = stream._closeRequest;\n    stream._closeRequest = undefined;\n  }\n  function WritableStreamMarkFirstWriteRequestInFlight(stream) {\n    assert(stream._inFlightWriteRequest === undefined, 'there must be no pending write request');\n    assert(stream._writeRequests.length !== 0, 'writeRequests must not be empty');\n    stream._inFlightWriteRequest = stream._writeRequests.shift();\n  }\n  function WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) {\n    assert(stream._state === 'errored', '_stream_.[[state]] is `\"errored\"`');\n    if (stream._closeRequest !== undefined) {\n      assert(stream._inFlightCloseRequest === undefined);\n      stream._closeRequest._reject(stream._storedError);\n      stream._closeRequest = undefined;\n    }\n    var writer = stream._writer;\n    if (writer !== undefined) {\n      defaultWriterClosedPromiseReject(writer, stream._storedError);\n      writer._closedPromise.catch(function () {});\n    }\n  }\n  function WritableStreamUpdateBackpressure(stream, backpressure) {\n    assert(stream._state === 'writable');\n    assert(WritableStreamCloseQueuedOrInFlight(stream) === false);\n    var writer = stream._writer;\n    if (writer !== undefined && backpressure !== stream._backpressure) {\n      if (backpressure === true) {\n        defaultWriterReadyPromiseReset(writer);\n      } else {\n        assert(backpressure === false);\n        defaultWriterReadyPromiseResolve(writer);\n      }\n    }\n    stream._backpressure = backpressure;\n  }\n  var WritableStreamDefaultWriter = function () {\n    function WritableStreamDefaultWriter(stream) {\n      _classCallCheck(this, WritableStreamDefaultWriter);\n      if (IsWritableStream(stream) === false) {\n        throw new TypeError('WritableStreamDefaultWriter can only be constructed with a WritableStream instance');\n      }\n      if (IsWritableStreamLocked(stream) === true) {\n        throw new TypeError('This stream has already been locked for exclusive writing by another writer');\n      }\n      this._ownerWritableStream = stream;\n      stream._writer = this;\n      var state = stream._state;\n      if (state === 'writable') {\n        if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._backpressure === true) {\n          defaultWriterReadyPromiseInitialize(this);\n        } else {\n          defaultWriterReadyPromiseInitializeAsResolved(this);\n        }\n        defaultWriterClosedPromiseInitialize(this);\n      } else if (state === 'erroring') {\n        defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError);\n        this._readyPromise.catch(function () {});\n        defaultWriterClosedPromiseInitialize(this);\n      } else if (state === 'closed') {\n        defaultWriterReadyPromiseInitializeAsResolved(this);\n        defaultWriterClosedPromiseInitializeAsResolved(this);\n      } else {\n        assert(state === 'errored', 'state must be errored');\n        var storedError = stream._storedError;\n        defaultWriterReadyPromiseInitializeAsRejected(this, storedError);\n        this._readyPromise.catch(function () {});\n        defaultWriterClosedPromiseInitializeAsRejected(this, storedError);\n        this._closedPromise.catch(function () {});\n      }\n    }\n    _createClass(WritableStreamDefaultWriter, [{\n      key: 'abort',\n      value: function abort(reason) {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('abort'));\n        }\n        if (this._ownerWritableStream === undefined) {\n          return Promise.reject(defaultWriterLockException('abort'));\n        }\n        return WritableStreamDefaultWriterAbort(this, reason);\n      }\n    }, {\n      key: 'close',\n      value: function close() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('close'));\n        }\n        var stream = this._ownerWritableStream;\n        if (stream === undefined) {\n          return Promise.reject(defaultWriterLockException('close'));\n        }\n        if (WritableStreamCloseQueuedOrInFlight(stream) === true) {\n          return Promise.reject(new TypeError('cannot close an already-closing stream'));\n        }\n        return WritableStreamDefaultWriterClose(this);\n      }\n    }, {\n      key: 'releaseLock',\n      value: function releaseLock() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          throw defaultWriterBrandCheckException('releaseLock');\n        }\n        var stream = this._ownerWritableStream;\n        if (stream === undefined) {\n          return;\n        }\n        assert(stream._writer !== undefined);\n        WritableStreamDefaultWriterRelease(this);\n      }\n    }, {\n      key: 'write',\n      value: function write(chunk) {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('write'));\n        }\n        if (this._ownerWritableStream === undefined) {\n          return Promise.reject(defaultWriterLockException('write to'));\n        }\n        return WritableStreamDefaultWriterWrite(this, chunk);\n      }\n    }, {\n      key: 'closed',\n      get: function get() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('closed'));\n        }\n        return this._closedPromise;\n      }\n    }, {\n      key: 'desiredSize',\n      get: function get() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          throw defaultWriterBrandCheckException('desiredSize');\n        }\n        if (this._ownerWritableStream === undefined) {\n          throw defaultWriterLockException('desiredSize');\n        }\n        return WritableStreamDefaultWriterGetDesiredSize(this);\n      }\n    }, {\n      key: 'ready',\n      get: function get() {\n        if (IsWritableStreamDefaultWriter(this) === false) {\n          return Promise.reject(defaultWriterBrandCheckException('ready'));\n        }\n        return this._readyPromise;\n      }\n    }]);\n    return WritableStreamDefaultWriter;\n  }();\n  function IsWritableStreamDefaultWriter(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamDefaultWriterAbort(writer, reason) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    return WritableStreamAbort(stream, reason);\n  }\n  function WritableStreamDefaultWriterClose(writer) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    var state = stream._state;\n    if (state === 'closed' || state === 'errored') {\n      return Promise.reject(new TypeError('The stream (in ' + state + ' state) is not in the writable state and cannot be closed'));\n    }\n    assert(state === 'writable' || state === 'erroring');\n    assert(WritableStreamCloseQueuedOrInFlight(stream) === false);\n    var promise = new Promise(function (resolve, reject) {\n      var closeRequest = {\n        _resolve: resolve,\n        _reject: reject\n      };\n      stream._closeRequest = closeRequest;\n    });\n    if (stream._backpressure === true && state === 'writable') {\n      defaultWriterReadyPromiseResolve(writer);\n    }\n    WritableStreamDefaultControllerClose(stream._writableStreamController);\n    return promise;\n  }\n  function WritableStreamDefaultWriterCloseWithErrorPropagation(writer) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    var state = stream._state;\n    if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {\n      return Promise.resolve();\n    }\n    if (state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    assert(state === 'writable' || state === 'erroring');\n    return WritableStreamDefaultWriterClose(writer);\n  }\n  function WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) {\n    if (writer._closedPromiseState === 'pending') {\n      defaultWriterClosedPromiseReject(writer, error);\n    } else {\n      defaultWriterClosedPromiseResetToRejected(writer, error);\n    }\n    writer._closedPromise.catch(function () {});\n  }\n  function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) {\n    if (writer._readyPromiseState === 'pending') {\n      defaultWriterReadyPromiseReject(writer, error);\n    } else {\n      defaultWriterReadyPromiseResetToRejected(writer, error);\n    }\n    writer._readyPromise.catch(function () {});\n  }\n  function WritableStreamDefaultWriterGetDesiredSize(writer) {\n    var stream = writer._ownerWritableStream;\n    var state = stream._state;\n    if (state === 'errored' || state === 'erroring') {\n      return null;\n    }\n    if (state === 'closed') {\n      return 0;\n    }\n    return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController);\n  }\n  function WritableStreamDefaultWriterRelease(writer) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    assert(stream._writer === writer);\n    var releasedError = new TypeError('Writer was released and can no longer be used to monitor the stream\\'s closedness');\n    WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError);\n    WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError);\n    stream._writer = undefined;\n    writer._ownerWritableStream = undefined;\n  }\n  function WritableStreamDefaultWriterWrite(writer, chunk) {\n    var stream = writer._ownerWritableStream;\n    assert(stream !== undefined);\n    var controller = stream._writableStreamController;\n    var chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk);\n    if (stream !== writer._ownerWritableStream) {\n      return Promise.reject(defaultWriterLockException('write to'));\n    }\n    var state = stream._state;\n    if (state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {\n      return Promise.reject(new TypeError('The stream is closing or closed and cannot be written to'));\n    }\n    if (state === 'erroring') {\n      return Promise.reject(stream._storedError);\n    }\n    assert(state === 'writable');\n    var promise = WritableStreamAddWriteRequest(stream);\n    WritableStreamDefaultControllerWrite(controller, chunk, chunkSize);\n    return promise;\n  }\n  var WritableStreamDefaultController = function () {\n    function WritableStreamDefaultController(stream, underlyingSink, size, highWaterMark) {\n      _classCallCheck(this, WritableStreamDefaultController);\n      if (IsWritableStream(stream) === false) {\n        throw new TypeError('WritableStreamDefaultController can only be constructed with a WritableStream instance');\n      }\n      if (stream._writableStreamController !== undefined) {\n        throw new TypeError('WritableStreamDefaultController instances can only be created by the WritableStream constructor');\n      }\n      this._controlledWritableStream = stream;\n      this._underlyingSink = underlyingSink;\n      this._queue = undefined;\n      this._queueTotalSize = undefined;\n      ResetQueue(this);\n      this._started = false;\n      var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);\n      this._strategySize = normalizedStrategy.size;\n      this._strategyHWM = normalizedStrategy.highWaterMark;\n      var backpressure = WritableStreamDefaultControllerGetBackpressure(this);\n      WritableStreamUpdateBackpressure(stream, backpressure);\n    }\n    _createClass(WritableStreamDefaultController, [{\n      key: 'error',\n      value: function error(e) {\n        if (IsWritableStreamDefaultController(this) === false) {\n          throw new TypeError('WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController');\n        }\n        var state = this._controlledWritableStream._state;\n        if (state !== 'writable') {\n          return;\n        }\n        WritableStreamDefaultControllerError(this, e);\n      }\n    }, {\n      key: '__abortSteps',\n      value: function __abortSteps(reason) {\n        return PromiseInvokeOrNoop(this._underlyingSink, 'abort', [reason]);\n      }\n    }, {\n      key: '__errorSteps',\n      value: function __errorSteps() {\n        ResetQueue(this);\n      }\n    }, {\n      key: '__startSteps',\n      value: function __startSteps() {\n        var _this = this;\n        var startResult = InvokeOrNoop(this._underlyingSink, 'start', [this]);\n        var stream = this._controlledWritableStream;\n        Promise.resolve(startResult).then(function () {\n          assert(stream._state === 'writable' || stream._state === 'erroring');\n          _this._started = true;\n          WritableStreamDefaultControllerAdvanceQueueIfNeeded(_this);\n        }, function (r) {\n          assert(stream._state === 'writable' || stream._state === 'erroring');\n          _this._started = true;\n          WritableStreamDealWithRejection(stream, r);\n        }).catch(rethrowAssertionErrorRejection);\n      }\n    }]);\n    return WritableStreamDefaultController;\n  }();\n  function WritableStreamDefaultControllerClose(controller) {\n    EnqueueValueWithSize(controller, 'close', 0);\n    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n  }\n  function WritableStreamDefaultControllerGetChunkSize(controller, chunk) {\n    var strategySize = controller._strategySize;\n    if (strategySize === undefined) {\n      return 1;\n    }\n    try {\n      return strategySize(chunk);\n    } catch (chunkSizeE) {\n      WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);\n      return 1;\n    }\n  }\n  function WritableStreamDefaultControllerGetDesiredSize(controller) {\n    return controller._strategyHWM - controller._queueTotalSize;\n  }\n  function WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) {\n    var writeRecord = { chunk: chunk };\n    try {\n      EnqueueValueWithSize(controller, writeRecord, chunkSize);\n    } catch (enqueueE) {\n      WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);\n      return;\n    }\n    var stream = controller._controlledWritableStream;\n    if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._state === 'writable') {\n      var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);\n      WritableStreamUpdateBackpressure(stream, backpressure);\n    }\n    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n  }\n  function IsWritableStreamDefaultController(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSink')) {\n      return false;\n    }\n    return true;\n  }\n  function WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) {\n    var stream = controller._controlledWritableStream;\n    if (controller._started === false) {\n      return;\n    }\n    if (stream._inFlightWriteRequest !== undefined) {\n      return;\n    }\n    var state = stream._state;\n    if (state === 'closed' || state === 'errored') {\n      return;\n    }\n    if (state === 'erroring') {\n      WritableStreamFinishErroring(stream);\n      return;\n    }\n    if (controller._queue.length === 0) {\n      return;\n    }\n    var writeRecord = PeekQueueValue(controller);\n    if (writeRecord === 'close') {\n      WritableStreamDefaultControllerProcessClose(controller);\n    } else {\n      WritableStreamDefaultControllerProcessWrite(controller, writeRecord.chunk);\n    }\n  }\n  function WritableStreamDefaultControllerErrorIfNeeded(controller, error) {\n    if (controller._controlledWritableStream._state === 'writable') {\n      WritableStreamDefaultControllerError(controller, error);\n    }\n  }\n  function WritableStreamDefaultControllerProcessClose(controller) {\n    var stream = controller._controlledWritableStream;\n    WritableStreamMarkCloseRequestInFlight(stream);\n    DequeueValue(controller);\n    assert(controller._queue.length === 0, 'queue must be empty once the final write record is dequeued');\n    var sinkClosePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'close', []);\n    sinkClosePromise.then(function () {\n      WritableStreamFinishInFlightClose(stream);\n    }, function (reason) {\n      WritableStreamFinishInFlightCloseWithError(stream, reason);\n    }).catch(rethrowAssertionErrorRejection);\n  }\n  function WritableStreamDefaultControllerProcessWrite(controller, chunk) {\n    var stream = controller._controlledWritableStream;\n    WritableStreamMarkFirstWriteRequestInFlight(stream);\n    var sinkWritePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'write', [chunk, controller]);\n    sinkWritePromise.then(function () {\n      WritableStreamFinishInFlightWrite(stream);\n      var state = stream._state;\n      assert(state === 'writable' || state === 'erroring');\n      DequeueValue(controller);\n      if (WritableStreamCloseQueuedOrInFlight(stream) === false && state === 'writable') {\n        var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);\n        WritableStreamUpdateBackpressure(stream, backpressure);\n      }\n      WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n    }, function (reason) {\n      WritableStreamFinishInFlightWriteWithError(stream, reason);\n    }).catch(rethrowAssertionErrorRejection);\n  }\n  function WritableStreamDefaultControllerGetBackpressure(controller) {\n    var desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller);\n    return desiredSize <= 0;\n  }\n  function WritableStreamDefaultControllerError(controller, error) {\n    var stream = controller._controlledWritableStream;\n    assert(stream._state === 'writable');\n    WritableStreamStartErroring(stream, error);\n  }\n  function streamBrandCheckException(name) {\n    return new TypeError('WritableStream.prototype.' + name + ' can only be used on a WritableStream');\n  }\n  function defaultWriterBrandCheckException(name) {\n    return new TypeError('WritableStreamDefaultWriter.prototype.' + name + ' can only be used on a WritableStreamDefaultWriter');\n  }\n  function defaultWriterLockException(name) {\n    return new TypeError('Cannot ' + name + ' a stream using a released writer');\n  }\n  function defaultWriterClosedPromiseInitialize(writer) {\n    writer._closedPromise = new Promise(function (resolve, reject) {\n      writer._closedPromise_resolve = resolve;\n      writer._closedPromise_reject = reject;\n      writer._closedPromiseState = 'pending';\n    });\n  }\n  function defaultWriterClosedPromiseInitializeAsRejected(writer, reason) {\n    writer._closedPromise = Promise.reject(reason);\n    writer._closedPromise_resolve = undefined;\n    writer._closedPromise_reject = undefined;\n    writer._closedPromiseState = 'rejected';\n  }\n  function defaultWriterClosedPromiseInitializeAsResolved(writer) {\n    writer._closedPromise = Promise.resolve(undefined);\n    writer._closedPromise_resolve = undefined;\n    writer._closedPromise_reject = undefined;\n    writer._closedPromiseState = 'resolved';\n  }\n  function defaultWriterClosedPromiseReject(writer, reason) {\n    assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');\n    assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');\n    assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');\n    writer._closedPromise_reject(reason);\n    writer._closedPromise_resolve = undefined;\n    writer._closedPromise_reject = undefined;\n    writer._closedPromiseState = 'rejected';\n  }\n  function defaultWriterClosedPromiseResetToRejected(writer, reason) {\n    assert(writer._closedPromise_resolve === undefined, 'writer._closedPromise_resolve === undefined');\n    assert(writer._closedPromise_reject === undefined, 'writer._closedPromise_reject === undefined');\n    assert(writer._closedPromiseState !== 'pending', 'writer._closedPromiseState is not pending');\n    writer._closedPromise = Promise.reject(reason);\n    writer._closedPromiseState = 'rejected';\n  }\n  function defaultWriterClosedPromiseResolve(writer) {\n    assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');\n    assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');\n    assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');\n    writer._closedPromise_resolve(undefined);\n    writer._closedPromise_resolve = undefined;\n    writer._closedPromise_reject = undefined;\n    writer._closedPromiseState = 'resolved';\n  }\n  function defaultWriterReadyPromiseInitialize(writer) {\n    writer._readyPromise = new Promise(function (resolve, reject) {\n      writer._readyPromise_resolve = resolve;\n      writer._readyPromise_reject = reject;\n    });\n    writer._readyPromiseState = 'pending';\n  }\n  function defaultWriterReadyPromiseInitializeAsRejected(writer, reason) {\n    writer._readyPromise = Promise.reject(reason);\n    writer._readyPromise_resolve = undefined;\n    writer._readyPromise_reject = undefined;\n    writer._readyPromiseState = 'rejected';\n  }\n  function defaultWriterReadyPromiseInitializeAsResolved(writer) {\n    writer._readyPromise = Promise.resolve(undefined);\n    writer._readyPromise_resolve = undefined;\n    writer._readyPromise_reject = undefined;\n    writer._readyPromiseState = 'fulfilled';\n  }\n  function defaultWriterReadyPromiseReject(writer, reason) {\n    assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');\n    assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');\n    writer._readyPromise_reject(reason);\n    writer._readyPromise_resolve = undefined;\n    writer._readyPromise_reject = undefined;\n    writer._readyPromiseState = 'rejected';\n  }\n  function defaultWriterReadyPromiseReset(writer) {\n    assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');\n    assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');\n    writer._readyPromise = new Promise(function (resolve, reject) {\n      writer._readyPromise_resolve = resolve;\n      writer._readyPromise_reject = reject;\n    });\n    writer._readyPromiseState = 'pending';\n  }\n  function defaultWriterReadyPromiseResetToRejected(writer, reason) {\n    assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');\n    assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');\n    writer._readyPromise = Promise.reject(reason);\n    writer._readyPromiseState = 'rejected';\n  }\n  function defaultWriterReadyPromiseResolve(writer) {\n    assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');\n    assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');\n    writer._readyPromise_resolve(undefined);\n    writer._readyPromise_resolve = undefined;\n    writer._readyPromise_reject = undefined;\n    writer._readyPromiseState = 'fulfilled';\n  }\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _require = __w_pdfjs_require__(0),\n      IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber;\n  var _require2 = __w_pdfjs_require__(1),\n      assert = _require2.assert;\n  exports.DequeueValue = function (container) {\n    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: DequeueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n    assert(container._queue.length > 0, 'Spec-level failure: should never dequeue from an empty queue.');\n    var pair = container._queue.shift();\n    container._queueTotalSize -= pair.size;\n    if (container._queueTotalSize < 0) {\n      container._queueTotalSize = 0;\n    }\n    return pair.value;\n  };\n  exports.EnqueueValueWithSize = function (container, value, size) {\n    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: EnqueueValueWithSize should only be used on containers with [[queue]] and ' + '[[queueTotalSize]].');\n    size = Number(size);\n    if (!IsFiniteNonNegativeNumber(size)) {\n      throw new RangeError('Size must be a finite, non-NaN, non-negative number.');\n    }\n    container._queue.push({\n      value: value,\n      size: size\n    });\n    container._queueTotalSize += size;\n  };\n  exports.PeekQueueValue = function (container) {\n    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: PeekQueueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n    assert(container._queue.length > 0, 'Spec-level failure: should never peek at an empty queue.');\n    var pair = container._queue[0];\n    return pair.value;\n  };\n  exports.ResetQueue = function (container) {\n    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: ResetQueue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n    container._queue = [];\n    container._queueTotalSize = 0;\n  };\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n  var _require = __w_pdfjs_require__(0),\n      ArrayBufferCopy = _require.ArrayBufferCopy,\n      CreateIterResultObject = _require.CreateIterResultObject,\n      IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber,\n      InvokeOrNoop = _require.InvokeOrNoop,\n      PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,\n      TransferArrayBuffer = _require.TransferArrayBuffer,\n      ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,\n      ValidateAndNormalizeHighWaterMark = _require.ValidateAndNormalizeHighWaterMark;\n  var _require2 = __w_pdfjs_require__(0),\n      createArrayFromList = _require2.createArrayFromList,\n      createDataProperty = _require2.createDataProperty,\n      typeIsObject = _require2.typeIsObject;\n  var _require3 = __w_pdfjs_require__(1),\n      assert = _require3.assert,\n      rethrowAssertionErrorRejection = _require3.rethrowAssertionErrorRejection;\n  var _require4 = __w_pdfjs_require__(3),\n      DequeueValue = _require4.DequeueValue,\n      EnqueueValueWithSize = _require4.EnqueueValueWithSize,\n      ResetQueue = _require4.ResetQueue;\n  var _require5 = __w_pdfjs_require__(2),\n      AcquireWritableStreamDefaultWriter = _require5.AcquireWritableStreamDefaultWriter,\n      IsWritableStream = _require5.IsWritableStream,\n      IsWritableStreamLocked = _require5.IsWritableStreamLocked,\n      WritableStreamAbort = _require5.WritableStreamAbort,\n      WritableStreamDefaultWriterCloseWithErrorPropagation = _require5.WritableStreamDefaultWriterCloseWithErrorPropagation,\n      WritableStreamDefaultWriterRelease = _require5.WritableStreamDefaultWriterRelease,\n      WritableStreamDefaultWriterWrite = _require5.WritableStreamDefaultWriterWrite,\n      WritableStreamCloseQueuedOrInFlight = _require5.WritableStreamCloseQueuedOrInFlight;\n  var ReadableStream = function () {\n    function ReadableStream() {\n      var underlyingSource = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          size = _ref.size,\n          highWaterMark = _ref.highWaterMark;\n      _classCallCheck(this, ReadableStream);\n      this._state = 'readable';\n      this._reader = undefined;\n      this._storedError = undefined;\n      this._disturbed = false;\n      this._readableStreamController = undefined;\n      var type = underlyingSource.type;\n      var typeString = String(type);\n      if (typeString === 'bytes') {\n        if (highWaterMark === undefined) {\n          highWaterMark = 0;\n        }\n        this._readableStreamController = new ReadableByteStreamController(this, underlyingSource, highWaterMark);\n      } else if (type === undefined) {\n        if (highWaterMark === undefined) {\n          highWaterMark = 1;\n        }\n        this._readableStreamController = new ReadableStreamDefaultController(this, underlyingSource, size, highWaterMark);\n      } else {\n        throw new RangeError('Invalid type is specified');\n      }\n    }\n    _createClass(ReadableStream, [{\n      key: 'cancel',\n      value: function cancel(reason) {\n        if (IsReadableStream(this) === false) {\n          return Promise.reject(streamBrandCheckException('cancel'));\n        }\n        if (IsReadableStreamLocked(this) === true) {\n          return Promise.reject(new TypeError('Cannot cancel a stream that already has a reader'));\n        }\n        return ReadableStreamCancel(this, reason);\n      }\n    }, {\n      key: 'getReader',\n      value: function getReader() {\n        var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n            mode = _ref2.mode;\n        if (IsReadableStream(this) === false) {\n          throw streamBrandCheckException('getReader');\n        }\n        if (mode === undefined) {\n          return AcquireReadableStreamDefaultReader(this);\n        }\n        mode = String(mode);\n        if (mode === 'byob') {\n          return AcquireReadableStreamBYOBReader(this);\n        }\n        throw new RangeError('Invalid mode is specified');\n      }\n    }, {\n      key: 'pipeThrough',\n      value: function pipeThrough(_ref3, options) {\n        var writable = _ref3.writable,\n            readable = _ref3.readable;\n        var promise = this.pipeTo(writable, options);\n        ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise);\n        return readable;\n      }\n    }, {\n      key: 'pipeTo',\n      value: function pipeTo(dest) {\n        var _this = this;\n        var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n            preventClose = _ref4.preventClose,\n            preventAbort = _ref4.preventAbort,\n            preventCancel = _ref4.preventCancel;\n        if (IsReadableStream(this) === false) {\n          return Promise.reject(streamBrandCheckException('pipeTo'));\n        }\n        if (IsWritableStream(dest) === false) {\n          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo\\'s first argument must be a WritableStream'));\n        }\n        preventClose = Boolean(preventClose);\n        preventAbort = Boolean(preventAbort);\n        preventCancel = Boolean(preventCancel);\n        if (IsReadableStreamLocked(this) === true) {\n          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream'));\n        }\n        if (IsWritableStreamLocked(dest) === true) {\n          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream'));\n        }\n        var reader = AcquireReadableStreamDefaultReader(this);\n        var writer = AcquireWritableStreamDefaultWriter(dest);\n        var shuttingDown = false;\n        var currentWrite = Promise.resolve();\n        return new Promise(function (resolve, reject) {\n          function pipeLoop() {\n            currentWrite = Promise.resolve();\n            if (shuttingDown === true) {\n              return Promise.resolve();\n            }\n            return writer._readyPromise.then(function () {\n              return ReadableStreamDefaultReaderRead(reader).then(function (_ref5) {\n                var value = _ref5.value,\n                    done = _ref5.done;\n                if (done === true) {\n                  return;\n                }\n                currentWrite = WritableStreamDefaultWriterWrite(writer, value).catch(function () {});\n              });\n            }).then(pipeLoop);\n          }\n          isOrBecomesErrored(_this, reader._closedPromise, function (storedError) {\n            if (preventAbort === false) {\n              shutdownWithAction(function () {\n                return WritableStreamAbort(dest, storedError);\n              }, true, storedError);\n            } else {\n              shutdown(true, storedError);\n            }\n          });\n          isOrBecomesErrored(dest, writer._closedPromise, function (storedError) {\n            if (preventCancel === false) {\n              shutdownWithAction(function () {\n                return ReadableStreamCancel(_this, storedError);\n              }, true, storedError);\n            } else {\n              shutdown(true, storedError);\n            }\n          });\n          isOrBecomesClosed(_this, reader._closedPromise, function () {\n            if (preventClose === false) {\n              shutdownWithAction(function () {\n                return WritableStreamDefaultWriterCloseWithErrorPropagation(writer);\n              });\n            } else {\n              shutdown();\n            }\n          });\n          if (WritableStreamCloseQueuedOrInFlight(dest) === true || dest._state === 'closed') {\n            var destClosed = new TypeError('the destination writable stream closed before all data could be piped to it');\n            if (preventCancel === false) {\n              shutdownWithAction(function () {\n                return ReadableStreamCancel(_this, destClosed);\n              }, true, destClosed);\n            } else {\n              shutdown(true, destClosed);\n            }\n          }\n          pipeLoop().catch(function (err) {\n            currentWrite = Promise.resolve();\n            rethrowAssertionErrorRejection(err);\n          });\n          function waitForWritesToFinish() {\n            var oldCurrentWrite = currentWrite;\n            return currentWrite.then(function () {\n              return oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined;\n            });\n          }\n          function isOrBecomesErrored(stream, promise, action) {\n            if (stream._state === 'errored') {\n              action(stream._storedError);\n            } else {\n              promise.catch(action).catch(rethrowAssertionErrorRejection);\n            }\n          }\n          function isOrBecomesClosed(stream, promise, action) {\n            if (stream._state === 'closed') {\n              action();\n            } else {\n              promise.then(action).catch(rethrowAssertionErrorRejection);\n            }\n          }\n          function shutdownWithAction(action, originalIsError, originalError) {\n            if (shuttingDown === true) {\n              return;\n            }\n            shuttingDown = true;\n            if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {\n              waitForWritesToFinish().then(doTheRest);\n            } else {\n              doTheRest();\n            }\n            function doTheRest() {\n              action().then(function () {\n                return finalize(originalIsError, originalError);\n              }, function (newError) {\n                return finalize(true, newError);\n              }).catch(rethrowAssertionErrorRejection);\n            }\n          }\n          function shutdown(isError, error) {\n            if (shuttingDown === true) {\n              return;\n            }\n            shuttingDown = true;\n            if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {\n              waitForWritesToFinish().then(function () {\n                return finalize(isError, error);\n              }).catch(rethrowAssertionErrorRejection);\n            } else {\n              finalize(isError, error);\n            }\n          }\n          function finalize(isError, error) {\n            WritableStreamDefaultWriterRelease(writer);\n            ReadableStreamReaderGenericRelease(reader);\n            if (isError) {\n              reject(error);\n            } else {\n              resolve(undefined);\n            }\n          }\n        });\n      }\n    }, {\n      key: 'tee',\n      value: function tee() {\n        if (IsReadableStream(this) === false) {\n          throw streamBrandCheckException('tee');\n        }\n        var branches = ReadableStreamTee(this, false);\n        return createArrayFromList(branches);\n      }\n    }, {\n      key: 'locked',\n      get: function get() {\n        if (IsReadableStream(this) === false) {\n          throw streamBrandCheckException('locked');\n        }\n        return IsReadableStreamLocked(this);\n      }\n    }]);\n    return ReadableStream;\n  }();\n  module.exports = {\n    ReadableStream: ReadableStream,\n    IsReadableStreamDisturbed: IsReadableStreamDisturbed,\n    ReadableStreamDefaultControllerClose: ReadableStreamDefaultControllerClose,\n    ReadableStreamDefaultControllerEnqueue: ReadableStreamDefaultControllerEnqueue,\n    ReadableStreamDefaultControllerError: ReadableStreamDefaultControllerError,\n    ReadableStreamDefaultControllerGetDesiredSize: ReadableStreamDefaultControllerGetDesiredSize\n  };\n  function AcquireReadableStreamBYOBReader(stream) {\n    return new ReadableStreamBYOBReader(stream);\n  }\n  function AcquireReadableStreamDefaultReader(stream) {\n    return new ReadableStreamDefaultReader(stream);\n  }\n  function IsReadableStream(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) {\n      return false;\n    }\n    return true;\n  }\n  function IsReadableStreamDisturbed(stream) {\n    assert(IsReadableStream(stream) === true, 'IsReadableStreamDisturbed should only be used on known readable streams');\n    return stream._disturbed;\n  }\n  function IsReadableStreamLocked(stream) {\n    assert(IsReadableStream(stream) === true, 'IsReadableStreamLocked should only be used on known readable streams');\n    if (stream._reader === undefined) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableStreamTee(stream, cloneForBranch2) {\n    assert(IsReadableStream(stream) === true);\n    assert(typeof cloneForBranch2 === 'boolean');\n    var reader = AcquireReadableStreamDefaultReader(stream);\n    var teeState = {\n      closedOrErrored: false,\n      canceled1: false,\n      canceled2: false,\n      reason1: undefined,\n      reason2: undefined\n    };\n    teeState.promise = new Promise(function (resolve) {\n      teeState._resolve = resolve;\n    });\n    var pull = create_ReadableStreamTeePullFunction();\n    pull._reader = reader;\n    pull._teeState = teeState;\n    pull._cloneForBranch2 = cloneForBranch2;\n    var cancel1 = create_ReadableStreamTeeBranch1CancelFunction();\n    cancel1._stream = stream;\n    cancel1._teeState = teeState;\n    var cancel2 = create_ReadableStreamTeeBranch2CancelFunction();\n    cancel2._stream = stream;\n    cancel2._teeState = teeState;\n    var underlyingSource1 = Object.create(Object.prototype);\n    createDataProperty(underlyingSource1, 'pull', pull);\n    createDataProperty(underlyingSource1, 'cancel', cancel1);\n    var branch1Stream = new ReadableStream(underlyingSource1);\n    var underlyingSource2 = Object.create(Object.prototype);\n    createDataProperty(underlyingSource2, 'pull', pull);\n    createDataProperty(underlyingSource2, 'cancel', cancel2);\n    var branch2Stream = new ReadableStream(underlyingSource2);\n    pull._branch1 = branch1Stream._readableStreamController;\n    pull._branch2 = branch2Stream._readableStreamController;\n    reader._closedPromise.catch(function (r) {\n      if (teeState.closedOrErrored === true) {\n        return;\n      }\n      ReadableStreamDefaultControllerError(pull._branch1, r);\n      ReadableStreamDefaultControllerError(pull._branch2, r);\n      teeState.closedOrErrored = true;\n    });\n    return [branch1Stream, branch2Stream];\n  }\n  function create_ReadableStreamTeePullFunction() {\n    function f() {\n      var reader = f._reader,\n          branch1 = f._branch1,\n          branch2 = f._branch2,\n          teeState = f._teeState;\n      return ReadableStreamDefaultReaderRead(reader).then(function (result) {\n        assert(typeIsObject(result));\n        var value = result.value;\n        var done = result.done;\n        assert(typeof done === 'boolean');\n        if (done === true && teeState.closedOrErrored === false) {\n          if (teeState.canceled1 === false) {\n            ReadableStreamDefaultControllerClose(branch1);\n          }\n          if (teeState.canceled2 === false) {\n            ReadableStreamDefaultControllerClose(branch2);\n          }\n          teeState.closedOrErrored = true;\n        }\n        if (teeState.closedOrErrored === true) {\n          return;\n        }\n        var value1 = value;\n        var value2 = value;\n        if (teeState.canceled1 === false) {\n          ReadableStreamDefaultControllerEnqueue(branch1, value1);\n        }\n        if (teeState.canceled2 === false) {\n          ReadableStreamDefaultControllerEnqueue(branch2, value2);\n        }\n      });\n    }\n    return f;\n  }\n  function create_ReadableStreamTeeBranch1CancelFunction() {\n    function f(reason) {\n      var stream = f._stream,\n          teeState = f._teeState;\n      teeState.canceled1 = true;\n      teeState.reason1 = reason;\n      if (teeState.canceled2 === true) {\n        var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);\n        var cancelResult = ReadableStreamCancel(stream, compositeReason);\n        teeState._resolve(cancelResult);\n      }\n      return teeState.promise;\n    }\n    return f;\n  }\n  function create_ReadableStreamTeeBranch2CancelFunction() {\n    function f(reason) {\n      var stream = f._stream,\n          teeState = f._teeState;\n      teeState.canceled2 = true;\n      teeState.reason2 = reason;\n      if (teeState.canceled1 === true) {\n        var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);\n        var cancelResult = ReadableStreamCancel(stream, compositeReason);\n        teeState._resolve(cancelResult);\n      }\n      return teeState.promise;\n    }\n    return f;\n  }\n  function ReadableStreamAddReadIntoRequest(stream) {\n    assert(IsReadableStreamBYOBReader(stream._reader) === true);\n    assert(stream._state === 'readable' || stream._state === 'closed');\n    var promise = new Promise(function (resolve, reject) {\n      var readIntoRequest = {\n        _resolve: resolve,\n        _reject: reject\n      };\n      stream._reader._readIntoRequests.push(readIntoRequest);\n    });\n    return promise;\n  }\n  function ReadableStreamAddReadRequest(stream) {\n    assert(IsReadableStreamDefaultReader(stream._reader) === true);\n    assert(stream._state === 'readable');\n    var promise = new Promise(function (resolve, reject) {\n      var readRequest = {\n        _resolve: resolve,\n        _reject: reject\n      };\n      stream._reader._readRequests.push(readRequest);\n    });\n    return promise;\n  }\n  function ReadableStreamCancel(stream, reason) {\n    stream._disturbed = true;\n    if (stream._state === 'closed') {\n      return Promise.resolve(undefined);\n    }\n    if (stream._state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    ReadableStreamClose(stream);\n    var sourceCancelPromise = stream._readableStreamController.__cancelSteps(reason);\n    return sourceCancelPromise.then(function () {\n      return undefined;\n    });\n  }\n  function ReadableStreamClose(stream) {\n    assert(stream._state === 'readable');\n    stream._state = 'closed';\n    var reader = stream._reader;\n    if (reader === undefined) {\n      return undefined;\n    }\n    if (IsReadableStreamDefaultReader(reader) === true) {\n      for (var i = 0; i < reader._readRequests.length; i++) {\n        var _resolve = reader._readRequests[i]._resolve;\n        _resolve(CreateIterResultObject(undefined, true));\n      }\n      reader._readRequests = [];\n    }\n    defaultReaderClosedPromiseResolve(reader);\n    return undefined;\n  }\n  function ReadableStreamError(stream, e) {\n    assert(IsReadableStream(stream) === true, 'stream must be ReadableStream');\n    assert(stream._state === 'readable', 'state must be readable');\n    stream._state = 'errored';\n    stream._storedError = e;\n    var reader = stream._reader;\n    if (reader === undefined) {\n      return undefined;\n    }\n    if (IsReadableStreamDefaultReader(reader) === true) {\n      for (var i = 0; i < reader._readRequests.length; i++) {\n        var readRequest = reader._readRequests[i];\n        readRequest._reject(e);\n      }\n      reader._readRequests = [];\n    } else {\n      assert(IsReadableStreamBYOBReader(reader), 'reader must be ReadableStreamBYOBReader');\n      for (var _i = 0; _i < reader._readIntoRequests.length; _i++) {\n        var readIntoRequest = reader._readIntoRequests[_i];\n        readIntoRequest._reject(e);\n      }\n      reader._readIntoRequests = [];\n    }\n    defaultReaderClosedPromiseReject(reader, e);\n    reader._closedPromise.catch(function () {});\n  }\n  function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) {\n    var reader = stream._reader;\n    assert(reader._readIntoRequests.length > 0);\n    var readIntoRequest = reader._readIntoRequests.shift();\n    readIntoRequest._resolve(CreateIterResultObject(chunk, done));\n  }\n  function ReadableStreamFulfillReadRequest(stream, chunk, done) {\n    var reader = stream._reader;\n    assert(reader._readRequests.length > 0);\n    var readRequest = reader._readRequests.shift();\n    readRequest._resolve(CreateIterResultObject(chunk, done));\n  }\n  function ReadableStreamGetNumReadIntoRequests(stream) {\n    return stream._reader._readIntoRequests.length;\n  }\n  function ReadableStreamGetNumReadRequests(stream) {\n    return stream._reader._readRequests.length;\n  }\n  function ReadableStreamHasBYOBReader(stream) {\n    var reader = stream._reader;\n    if (reader === undefined) {\n      return false;\n    }\n    if (IsReadableStreamBYOBReader(reader) === false) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableStreamHasDefaultReader(stream) {\n    var reader = stream._reader;\n    if (reader === undefined) {\n      return false;\n    }\n    if (IsReadableStreamDefaultReader(reader) === false) {\n      return false;\n    }\n    return true;\n  }\n  var ReadableStreamDefaultReader = function () {\n    function ReadableStreamDefaultReader(stream) {\n      _classCallCheck(this, ReadableStreamDefaultReader);\n      if (IsReadableStream(stream) === false) {\n        throw new TypeError('ReadableStreamDefaultReader can only be constructed with a ReadableStream instance');\n      }\n      if (IsReadableStreamLocked(stream) === true) {\n        throw new TypeError('This stream has already been locked for exclusive reading by another reader');\n      }\n      ReadableStreamReaderGenericInitialize(this, stream);\n      this._readRequests = [];\n    }\n    _createClass(ReadableStreamDefaultReader, [{\n      key: 'cancel',\n      value: function cancel(reason) {\n        if (IsReadableStreamDefaultReader(this) === false) {\n          return Promise.reject(defaultReaderBrandCheckException('cancel'));\n        }\n        if (this._ownerReadableStream === undefined) {\n          return Promise.reject(readerLockException('cancel'));\n        }\n        return ReadableStreamReaderGenericCancel(this, reason);\n      }\n    }, {\n      key: 'read',\n      value: function read() {\n        if (IsReadableStreamDefaultReader(this) === false) {\n          return Promise.reject(defaultReaderBrandCheckException('read'));\n        }\n        if (this._ownerReadableStream === undefined) {\n          return Promise.reject(readerLockException('read from'));\n        }\n        return ReadableStreamDefaultReaderRead(this);\n      }\n    }, {\n      key: 'releaseLock',\n      value: function releaseLock() {\n        if (IsReadableStreamDefaultReader(this) === false) {\n          throw defaultReaderBrandCheckException('releaseLock');\n        }\n        if (this._ownerReadableStream === undefined) {\n          return;\n        }\n        if (this._readRequests.length > 0) {\n          throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');\n        }\n        ReadableStreamReaderGenericRelease(this);\n      }\n    }, {\n      key: 'closed',\n      get: function get() {\n        if (IsReadableStreamDefaultReader(this) === false) {\n          return Promise.reject(defaultReaderBrandCheckException('closed'));\n        }\n        return this._closedPromise;\n      }\n    }]);\n    return ReadableStreamDefaultReader;\n  }();\n  var ReadableStreamBYOBReader = function () {\n    function ReadableStreamBYOBReader(stream) {\n      _classCallCheck(this, ReadableStreamBYOBReader);\n      if (!IsReadableStream(stream)) {\n        throw new TypeError('ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a ' + 'byte source');\n      }\n      if (IsReadableByteStreamController(stream._readableStreamController) === false) {\n        throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' + 'source');\n      }\n      if (IsReadableStreamLocked(stream)) {\n        throw new TypeError('This stream has already been locked for exclusive reading by another reader');\n      }\n      ReadableStreamReaderGenericInitialize(this, stream);\n      this._readIntoRequests = [];\n    }\n    _createClass(ReadableStreamBYOBReader, [{\n      key: 'cancel',\n      value: function cancel(reason) {\n        if (!IsReadableStreamBYOBReader(this)) {\n          return Promise.reject(byobReaderBrandCheckException('cancel'));\n        }\n        if (this._ownerReadableStream === undefined) {\n          return Promise.reject(readerLockException('cancel'));\n        }\n        return ReadableStreamReaderGenericCancel(this, reason);\n      }\n    }, {\n      key: 'read',\n      value: function read(view) {\n        if (!IsReadableStreamBYOBReader(this)) {\n          return Promise.reject(byobReaderBrandCheckException('read'));\n        }\n        if (this._ownerReadableStream === undefined) {\n          return Promise.reject(readerLockException('read from'));\n        }\n        if (!ArrayBuffer.isView(view)) {\n          return Promise.reject(new TypeError('view must be an array buffer view'));\n        }\n        if (view.byteLength === 0) {\n          return Promise.reject(new TypeError('view must have non-zero byteLength'));\n        }\n        return ReadableStreamBYOBReaderRead(this, view);\n      }\n    }, {\n      key: 'releaseLock',\n      value: function releaseLock() {\n        if (!IsReadableStreamBYOBReader(this)) {\n          throw byobReaderBrandCheckException('releaseLock');\n        }\n        if (this._ownerReadableStream === undefined) {\n          return;\n        }\n        if (this._readIntoRequests.length > 0) {\n          throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');\n        }\n        ReadableStreamReaderGenericRelease(this);\n      }\n    }, {\n      key: 'closed',\n      get: function get() {\n        if (!IsReadableStreamBYOBReader(this)) {\n          return Promise.reject(byobReaderBrandCheckException('closed'));\n        }\n        return this._closedPromise;\n      }\n    }]);\n    return ReadableStreamBYOBReader;\n  }();\n  function IsReadableStreamBYOBReader(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) {\n      return false;\n    }\n    return true;\n  }\n  function IsReadableStreamDefaultReader(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableStreamReaderGenericInitialize(reader, stream) {\n    reader._ownerReadableStream = stream;\n    stream._reader = reader;\n    if (stream._state === 'readable') {\n      defaultReaderClosedPromiseInitialize(reader);\n    } else if (stream._state === 'closed') {\n      defaultReaderClosedPromiseInitializeAsResolved(reader);\n    } else {\n      assert(stream._state === 'errored', 'state must be errored');\n      defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError);\n      reader._closedPromise.catch(function () {});\n    }\n  }\n  function ReadableStreamReaderGenericCancel(reader, reason) {\n    var stream = reader._ownerReadableStream;\n    assert(stream !== undefined);\n    return ReadableStreamCancel(stream, reason);\n  }\n  function ReadableStreamReaderGenericRelease(reader) {\n    assert(reader._ownerReadableStream !== undefined);\n    assert(reader._ownerReadableStream._reader === reader);\n    if (reader._ownerReadableStream._state === 'readable') {\n      defaultReaderClosedPromiseReject(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\\'s closedness'));\n    } else {\n      defaultReaderClosedPromiseResetToRejected(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\\'s closedness'));\n    }\n    reader._closedPromise.catch(function () {});\n    reader._ownerReadableStream._reader = undefined;\n    reader._ownerReadableStream = undefined;\n  }\n  function ReadableStreamBYOBReaderRead(reader, view) {\n    var stream = reader._ownerReadableStream;\n    assert(stream !== undefined);\n    stream._disturbed = true;\n    if (stream._state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    return ReadableByteStreamControllerPullInto(stream._readableStreamController, view);\n  }\n  function ReadableStreamDefaultReaderRead(reader) {\n    var stream = reader._ownerReadableStream;\n    assert(stream !== undefined);\n    stream._disturbed = true;\n    if (stream._state === 'closed') {\n      return Promise.resolve(CreateIterResultObject(undefined, true));\n    }\n    if (stream._state === 'errored') {\n      return Promise.reject(stream._storedError);\n    }\n    assert(stream._state === 'readable');\n    return stream._readableStreamController.__pullSteps();\n  }\n  var ReadableStreamDefaultController = function () {\n    function ReadableStreamDefaultController(stream, underlyingSource, size, highWaterMark) {\n      _classCallCheck(this, ReadableStreamDefaultController);\n      if (IsReadableStream(stream) === false) {\n        throw new TypeError('ReadableStreamDefaultController can only be constructed with a ReadableStream instance');\n      }\n      if (stream._readableStreamController !== undefined) {\n        throw new TypeError('ReadableStreamDefaultController instances can only be created by the ReadableStream constructor');\n      }\n      this._controlledReadableStream = stream;\n      this._underlyingSource = underlyingSource;\n      this._queue = undefined;\n      this._queueTotalSize = undefined;\n      ResetQueue(this);\n      this._started = false;\n      this._closeRequested = false;\n      this._pullAgain = false;\n      this._pulling = false;\n      var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);\n      this._strategySize = normalizedStrategy.size;\n      this._strategyHWM = normalizedStrategy.highWaterMark;\n      var controller = this;\n      var startResult = InvokeOrNoop(underlyingSource, 'start', [this]);\n      Promise.resolve(startResult).then(function () {\n        controller._started = true;\n        assert(controller._pulling === false);\n        assert(controller._pullAgain === false);\n        ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n      }, function (r) {\n        ReadableStreamDefaultControllerErrorIfNeeded(controller, r);\n      }).catch(rethrowAssertionErrorRejection);\n    }\n    _createClass(ReadableStreamDefaultController, [{\n      key: 'close',\n      value: function close() {\n        if (IsReadableStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('close');\n        }\n        if (this._closeRequested === true) {\n          throw new TypeError('The stream has already been closed; do not close it again!');\n        }\n        var state = this._controlledReadableStream._state;\n        if (state !== 'readable') {\n          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');\n        }\n        ReadableStreamDefaultControllerClose(this);\n      }\n    }, {\n      key: 'enqueue',\n      value: function enqueue(chunk) {\n        if (IsReadableStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('enqueue');\n        }\n        if (this._closeRequested === true) {\n          throw new TypeError('stream is closed or draining');\n        }\n        var state = this._controlledReadableStream._state;\n        if (state !== 'readable') {\n          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');\n        }\n        return ReadableStreamDefaultControllerEnqueue(this, chunk);\n      }\n    }, {\n      key: 'error',\n      value: function error(e) {\n        if (IsReadableStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('error');\n        }\n        var stream = this._controlledReadableStream;\n        if (stream._state !== 'readable') {\n          throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');\n        }\n        ReadableStreamDefaultControllerError(this, e);\n      }\n    }, {\n      key: '__cancelSteps',\n      value: function __cancelSteps(reason) {\n        ResetQueue(this);\n        return PromiseInvokeOrNoop(this._underlyingSource, 'cancel', [reason]);\n      }\n    }, {\n      key: '__pullSteps',\n      value: function __pullSteps() {\n        var stream = this._controlledReadableStream;\n        if (this._queue.length > 0) {\n          var chunk = DequeueValue(this);\n          if (this._closeRequested === true && this._queue.length === 0) {\n            ReadableStreamClose(stream);\n          } else {\n            ReadableStreamDefaultControllerCallPullIfNeeded(this);\n          }\n          return Promise.resolve(CreateIterResultObject(chunk, false));\n        }\n        var pendingPromise = ReadableStreamAddReadRequest(stream);\n        ReadableStreamDefaultControllerCallPullIfNeeded(this);\n        return pendingPromise;\n      }\n    }, {\n      key: 'desiredSize',\n      get: function get() {\n        if (IsReadableStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('desiredSize');\n        }\n        return ReadableStreamDefaultControllerGetDesiredSize(this);\n      }\n    }]);\n    return ReadableStreamDefaultController;\n  }();\n  function IsReadableStreamDefaultController(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSource')) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableStreamDefaultControllerCallPullIfNeeded(controller) {\n    var shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller);\n    if (shouldPull === false) {\n      return undefined;\n    }\n    if (controller._pulling === true) {\n      controller._pullAgain = true;\n      return undefined;\n    }\n    assert(controller._pullAgain === false);\n    controller._pulling = true;\n    var pullPromise = PromiseInvokeOrNoop(controller._underlyingSource, 'pull', [controller]);\n    pullPromise.then(function () {\n      controller._pulling = false;\n      if (controller._pullAgain === true) {\n        controller._pullAgain = false;\n        return ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n      }\n      return undefined;\n    }, function (e) {\n      ReadableStreamDefaultControllerErrorIfNeeded(controller, e);\n    }).catch(rethrowAssertionErrorRejection);\n    return undefined;\n  }\n  function ReadableStreamDefaultControllerShouldCallPull(controller) {\n    var stream = controller._controlledReadableStream;\n    if (stream._state === 'closed' || stream._state === 'errored') {\n      return false;\n    }\n    if (controller._closeRequested === true) {\n      return false;\n    }\n    if (controller._started === false) {\n      return false;\n    }\n    if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n      return true;\n    }\n    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);\n    if (desiredSize > 0) {\n      return true;\n    }\n    return false;\n  }\n  function ReadableStreamDefaultControllerClose(controller) {\n    var stream = controller._controlledReadableStream;\n    assert(controller._closeRequested === false);\n    assert(stream._state === 'readable');\n    controller._closeRequested = true;\n    if (controller._queue.length === 0) {\n      ReadableStreamClose(stream);\n    }\n  }\n  function ReadableStreamDefaultControllerEnqueue(controller, chunk) {\n    var stream = controller._controlledReadableStream;\n    assert(controller._closeRequested === false);\n    assert(stream._state === 'readable');\n    if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n      ReadableStreamFulfillReadRequest(stream, chunk, false);\n    } else {\n      var chunkSize = 1;\n      if (controller._strategySize !== undefined) {\n        var strategySize = controller._strategySize;\n        try {\n          chunkSize = strategySize(chunk);\n        } catch (chunkSizeE) {\n          ReadableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);\n          throw chunkSizeE;\n        }\n      }\n      try {\n        EnqueueValueWithSize(controller, chunk, chunkSize);\n      } catch (enqueueE) {\n        ReadableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);\n        throw enqueueE;\n      }\n    }\n    ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n    return undefined;\n  }\n  function ReadableStreamDefaultControllerError(controller, e) {\n    var stream = controller._controlledReadableStream;\n    assert(stream._state === 'readable');\n    ResetQueue(controller);\n    ReadableStreamError(stream, e);\n  }\n  function ReadableStreamDefaultControllerErrorIfNeeded(controller, e) {\n    if (controller._controlledReadableStream._state === 'readable') {\n      ReadableStreamDefaultControllerError(controller, e);\n    }\n  }\n  function ReadableStreamDefaultControllerGetDesiredSize(controller) {\n    var stream = controller._controlledReadableStream;\n    var state = stream._state;\n    if (state === 'errored') {\n      return null;\n    }\n    if (state === 'closed') {\n      return 0;\n    }\n    return controller._strategyHWM - controller._queueTotalSize;\n  }\n  var ReadableStreamBYOBRequest = function () {\n    function ReadableStreamBYOBRequest(controller, view) {\n      _classCallCheck(this, ReadableStreamBYOBRequest);\n      this._associatedReadableByteStreamController = controller;\n      this._view = view;\n    }\n    _createClass(ReadableStreamBYOBRequest, [{\n      key: 'respond',\n      value: function respond(bytesWritten) {\n        if (IsReadableStreamBYOBRequest(this) === false) {\n          throw byobRequestBrandCheckException('respond');\n        }\n        if (this._associatedReadableByteStreamController === undefined) {\n          throw new TypeError('This BYOB request has been invalidated');\n        }\n        ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten);\n      }\n    }, {\n      key: 'respondWithNewView',\n      value: function respondWithNewView(view) {\n        if (IsReadableStreamBYOBRequest(this) === false) {\n          throw byobRequestBrandCheckException('respond');\n        }\n        if (this._associatedReadableByteStreamController === undefined) {\n          throw new TypeError('This BYOB request has been invalidated');\n        }\n        if (!ArrayBuffer.isView(view)) {\n          throw new TypeError('You can only respond with array buffer views');\n        }\n        ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view);\n      }\n    }, {\n      key: 'view',\n      get: function get() {\n        return this._view;\n      }\n    }]);\n    return ReadableStreamBYOBRequest;\n  }();\n  var ReadableByteStreamController = function () {\n    function ReadableByteStreamController(stream, underlyingByteSource, highWaterMark) {\n      _classCallCheck(this, ReadableByteStreamController);\n      if (IsReadableStream(stream) === false) {\n        throw new TypeError('ReadableByteStreamController can only be constructed with a ReadableStream instance given ' + 'a byte source');\n      }\n      if (stream._readableStreamController !== undefined) {\n        throw new TypeError('ReadableByteStreamController instances can only be created by the ReadableStream constructor given a byte ' + 'source');\n      }\n      this._controlledReadableStream = stream;\n      this._underlyingByteSource = underlyingByteSource;\n      this._pullAgain = false;\n      this._pulling = false;\n      ReadableByteStreamControllerClearPendingPullIntos(this);\n      this._queue = this._queueTotalSize = undefined;\n      ResetQueue(this);\n      this._closeRequested = false;\n      this._started = false;\n      this._strategyHWM = ValidateAndNormalizeHighWaterMark(highWaterMark);\n      var autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize;\n      if (autoAllocateChunkSize !== undefined) {\n        if (Number.isInteger(autoAllocateChunkSize) === false || autoAllocateChunkSize <= 0) {\n          throw new RangeError('autoAllocateChunkSize must be a positive integer');\n        }\n      }\n      this._autoAllocateChunkSize = autoAllocateChunkSize;\n      this._pendingPullIntos = [];\n      var controller = this;\n      var startResult = InvokeOrNoop(underlyingByteSource, 'start', [this]);\n      Promise.resolve(startResult).then(function () {\n        controller._started = true;\n        assert(controller._pulling === false);\n        assert(controller._pullAgain === false);\n        ReadableByteStreamControllerCallPullIfNeeded(controller);\n      }, function (r) {\n        if (stream._state === 'readable') {\n          ReadableByteStreamControllerError(controller, r);\n        }\n      }).catch(rethrowAssertionErrorRejection);\n    }\n    _createClass(ReadableByteStreamController, [{\n      key: 'close',\n      value: function close() {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('close');\n        }\n        if (this._closeRequested === true) {\n          throw new TypeError('The stream has already been closed; do not close it again!');\n        }\n        var state = this._controlledReadableStream._state;\n        if (state !== 'readable') {\n          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');\n        }\n        ReadableByteStreamControllerClose(this);\n      }\n    }, {\n      key: 'enqueue',\n      value: function enqueue(chunk) {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('enqueue');\n        }\n        if (this._closeRequested === true) {\n          throw new TypeError('stream is closed or draining');\n        }\n        var state = this._controlledReadableStream._state;\n        if (state !== 'readable') {\n          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');\n        }\n        if (!ArrayBuffer.isView(chunk)) {\n          throw new TypeError('You can only enqueue array buffer views when using a ReadableByteStreamController');\n        }\n        ReadableByteStreamControllerEnqueue(this, chunk);\n      }\n    }, {\n      key: 'error',\n      value: function error(e) {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('error');\n        }\n        var stream = this._controlledReadableStream;\n        if (stream._state !== 'readable') {\n          throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');\n        }\n        ReadableByteStreamControllerError(this, e);\n      }\n    }, {\n      key: '__cancelSteps',\n      value: function __cancelSteps(reason) {\n        if (this._pendingPullIntos.length > 0) {\n          var firstDescriptor = this._pendingPullIntos[0];\n          firstDescriptor.bytesFilled = 0;\n        }\n        ResetQueue(this);\n        return PromiseInvokeOrNoop(this._underlyingByteSource, 'cancel', [reason]);\n      }\n    }, {\n      key: '__pullSteps',\n      value: function __pullSteps() {\n        var stream = this._controlledReadableStream;\n        assert(ReadableStreamHasDefaultReader(stream) === true);\n        if (this._queueTotalSize > 0) {\n          assert(ReadableStreamGetNumReadRequests(stream) === 0);\n          var entry = this._queue.shift();\n          this._queueTotalSize -= entry.byteLength;\n          ReadableByteStreamControllerHandleQueueDrain(this);\n          var view = void 0;\n          try {\n            view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength);\n          } catch (viewE) {\n            return Promise.reject(viewE);\n          }\n          return Promise.resolve(CreateIterResultObject(view, false));\n        }\n        var autoAllocateChunkSize = this._autoAllocateChunkSize;\n        if (autoAllocateChunkSize !== undefined) {\n          var buffer = void 0;\n          try {\n            buffer = new ArrayBuffer(autoAllocateChunkSize);\n          } catch (bufferE) {\n            return Promise.reject(bufferE);\n          }\n          var pullIntoDescriptor = {\n            buffer: buffer,\n            byteOffset: 0,\n            byteLength: autoAllocateChunkSize,\n            bytesFilled: 0,\n            elementSize: 1,\n            ctor: Uint8Array,\n            readerType: 'default'\n          };\n          this._pendingPullIntos.push(pullIntoDescriptor);\n        }\n        var promise = ReadableStreamAddReadRequest(stream);\n        ReadableByteStreamControllerCallPullIfNeeded(this);\n        return promise;\n      }\n    }, {\n      key: 'byobRequest',\n      get: function get() {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('byobRequest');\n        }\n        if (this._byobRequest === undefined && this._pendingPullIntos.length > 0) {\n          var firstDescriptor = this._pendingPullIntos[0];\n          var view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled);\n          this._byobRequest = new ReadableStreamBYOBRequest(this, view);\n        }\n        return this._byobRequest;\n      }\n    }, {\n      key: 'desiredSize',\n      get: function get() {\n        if (IsReadableByteStreamController(this) === false) {\n          throw byteStreamControllerBrandCheckException('desiredSize');\n        }\n        return ReadableByteStreamControllerGetDesiredSize(this);\n      }\n    }]);\n    return ReadableByteStreamController;\n  }();\n  function IsReadableByteStreamController(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingByteSource')) {\n      return false;\n    }\n    return true;\n  }\n  function IsReadableStreamBYOBRequest(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) {\n      return false;\n    }\n    return true;\n  }\n  function ReadableByteStreamControllerCallPullIfNeeded(controller) {\n    var shouldPull = ReadableByteStreamControllerShouldCallPull(controller);\n    if (shouldPull === false) {\n      return undefined;\n    }\n    if (controller._pulling === true) {\n      controller._pullAgain = true;\n      return undefined;\n    }\n    assert(controller._pullAgain === false);\n    controller._pulling = true;\n    var pullPromise = PromiseInvokeOrNoop(controller._underlyingByteSource, 'pull', [controller]);\n    pullPromise.then(function () {\n      controller._pulling = false;\n      if (controller._pullAgain === true) {\n        controller._pullAgain = false;\n        ReadableByteStreamControllerCallPullIfNeeded(controller);\n      }\n    }, function (e) {\n      if (controller._controlledReadableStream._state === 'readable') {\n        ReadableByteStreamControllerError(controller, e);\n      }\n    }).catch(rethrowAssertionErrorRejection);\n    return undefined;\n  }\n  function ReadableByteStreamControllerClearPendingPullIntos(controller) {\n    ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n    controller._pendingPullIntos = [];\n  }\n  function ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) {\n    assert(stream._state !== 'errored', 'state must not be errored');\n    var done = false;\n    if (stream._state === 'closed') {\n      assert(pullIntoDescriptor.bytesFilled === 0);\n      done = true;\n    }\n    var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);\n    if (pullIntoDescriptor.readerType === 'default') {\n      ReadableStreamFulfillReadRequest(stream, filledView, done);\n    } else {\n      assert(pullIntoDescriptor.readerType === 'byob');\n      ReadableStreamFulfillReadIntoRequest(stream, filledView, done);\n    }\n  }\n  function ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) {\n    var bytesFilled = pullIntoDescriptor.bytesFilled;\n    var elementSize = pullIntoDescriptor.elementSize;\n    assert(bytesFilled <= pullIntoDescriptor.byteLength);\n    assert(bytesFilled % elementSize === 0);\n    return new pullIntoDescriptor.ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize);\n  }\n  function ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) {\n    controller._queue.push({\n      buffer: buffer,\n      byteOffset: byteOffset,\n      byteLength: byteLength\n    });\n    controller._queueTotalSize += byteLength;\n  }\n  function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) {\n    var elementSize = pullIntoDescriptor.elementSize;\n    var currentAlignedBytes = pullIntoDescriptor.bytesFilled - pullIntoDescriptor.bytesFilled % elementSize;\n    var maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled);\n    var maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy;\n    var maxAlignedBytes = maxBytesFilled - maxBytesFilled % elementSize;\n    var totalBytesToCopyRemaining = maxBytesToCopy;\n    var ready = false;\n    if (maxAlignedBytes > currentAlignedBytes) {\n      totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled;\n      ready = true;\n    }\n    var queue = controller._queue;\n    while (totalBytesToCopyRemaining > 0) {\n      var headOfQueue = queue[0];\n      var bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength);\n      var destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;\n      ArrayBufferCopy(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy);\n      if (headOfQueue.byteLength === bytesToCopy) {\n        queue.shift();\n      } else {\n        headOfQueue.byteOffset += bytesToCopy;\n        headOfQueue.byteLength -= bytesToCopy;\n      }\n      controller._queueTotalSize -= bytesToCopy;\n      ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor);\n      totalBytesToCopyRemaining -= bytesToCopy;\n    }\n    if (ready === false) {\n      assert(controller._queueTotalSize === 0, 'queue must be empty');\n      assert(pullIntoDescriptor.bytesFilled > 0);\n      assert(pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize);\n    }\n    return ready;\n  }\n  function ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) {\n    assert(controller._pendingPullIntos.length === 0 || controller._pendingPullIntos[0] === pullIntoDescriptor);\n    ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n    pullIntoDescriptor.bytesFilled += size;\n  }\n  function ReadableByteStreamControllerHandleQueueDrain(controller) {\n    assert(controller._controlledReadableStream._state === 'readable');\n    if (controller._queueTotalSize === 0 && controller._closeRequested === true) {\n      ReadableStreamClose(controller._controlledReadableStream);\n    } else {\n      ReadableByteStreamControllerCallPullIfNeeded(controller);\n    }\n  }\n  function ReadableByteStreamControllerInvalidateBYOBRequest(controller) {\n    if (controller._byobRequest === undefined) {\n      return;\n    }\n    controller._byobRequest._associatedReadableByteStreamController = undefined;\n    controller._byobRequest._view = undefined;\n    controller._byobRequest = undefined;\n  }\n  function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) {\n    assert(controller._closeRequested === false);\n    while (controller._pendingPullIntos.length > 0) {\n      if (controller._queueTotalSize === 0) {\n        return;\n      }\n      var pullIntoDescriptor = controller._pendingPullIntos[0];\n      if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {\n        ReadableByteStreamControllerShiftPendingPullInto(controller);\n        ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);\n      }\n    }\n  }\n  function ReadableByteStreamControllerPullInto(controller, view) {\n    var stream = controller._controlledReadableStream;\n    var elementSize = 1;\n    if (view.constructor !== DataView) {\n      elementSize = view.constructor.BYTES_PER_ELEMENT;\n    }\n    var ctor = view.constructor;\n    var pullIntoDescriptor = {\n      buffer: view.buffer,\n      byteOffset: view.byteOffset,\n      byteLength: view.byteLength,\n      bytesFilled: 0,\n      elementSize: elementSize,\n      ctor: ctor,\n      readerType: 'byob'\n    };\n    if (controller._pendingPullIntos.length > 0) {\n      pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n      controller._pendingPullIntos.push(pullIntoDescriptor);\n      return ReadableStreamAddReadIntoRequest(stream);\n    }\n    if (stream._state === 'closed') {\n      var emptyView = new view.constructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0);\n      return Promise.resolve(CreateIterResultObject(emptyView, true));\n    }\n    if (controller._queueTotalSize > 0) {\n      if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {\n        var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);\n        ReadableByteStreamControllerHandleQueueDrain(controller);\n        return Promise.resolve(CreateIterResultObject(filledView, false));\n      }\n      if (controller._closeRequested === true) {\n        var e = new TypeError('Insufficient bytes to fill elements in the given buffer');\n        ReadableByteStreamControllerError(controller, e);\n        return Promise.reject(e);\n      }\n    }\n    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n    controller._pendingPullIntos.push(pullIntoDescriptor);\n    var promise = ReadableStreamAddReadIntoRequest(stream);\n    ReadableByteStreamControllerCallPullIfNeeded(controller);\n    return promise;\n  }\n  function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) {\n    firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer);\n    assert(firstDescriptor.bytesFilled === 0, 'bytesFilled must be 0');\n    var stream = controller._controlledReadableStream;\n    if (ReadableStreamHasBYOBReader(stream) === true) {\n      while (ReadableStreamGetNumReadIntoRequests(stream) > 0) {\n        var pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller);\n        ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor);\n      }\n    }\n  }\n  function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) {\n    if (pullIntoDescriptor.bytesFilled + bytesWritten > pullIntoDescriptor.byteLength) {\n      throw new RangeError('bytesWritten out of range');\n    }\n    ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor);\n    if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize) {\n      return;\n    }\n    ReadableByteStreamControllerShiftPendingPullInto(controller);\n    var remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize;\n    if (remainderSize > 0) {\n      var end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;\n      var remainder = pullIntoDescriptor.buffer.slice(end - remainderSize, end);\n      ReadableByteStreamControllerEnqueueChunkToQueue(controller, remainder, 0, remainder.byteLength);\n    }\n    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n    pullIntoDescriptor.bytesFilled -= remainderSize;\n    ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);\n    ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);\n  }\n  function ReadableByteStreamControllerRespondInternal(controller, bytesWritten) {\n    var firstDescriptor = controller._pendingPullIntos[0];\n    var stream = controller._controlledReadableStream;\n    if (stream._state === 'closed') {\n      if (bytesWritten !== 0) {\n        throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream');\n      }\n      ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor);\n    } else {\n      assert(stream._state === 'readable');\n      ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor);\n    }\n  }\n  function ReadableByteStreamControllerShiftPendingPullInto(controller) {\n    var descriptor = controller._pendingPullIntos.shift();\n    ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n    return descriptor;\n  }\n  function ReadableByteStreamControllerShouldCallPull(controller) {\n    var stream = controller._controlledReadableStream;\n    if (stream._state !== 'readable') {\n      return false;\n    }\n    if (controller._closeRequested === true) {\n      return false;\n    }\n    if (controller._started === false) {\n      return false;\n    }\n    if (ReadableStreamHasDefaultReader(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n      return true;\n    }\n    if (ReadableStreamHasBYOBReader(stream) === true && ReadableStreamGetNumReadIntoRequests(stream) > 0) {\n      return true;\n    }\n    if (ReadableByteStreamControllerGetDesiredSize(controller) > 0) {\n      return true;\n    }\n    return false;\n  }\n  function ReadableByteStreamControllerClose(controller) {\n    var stream = controller._controlledReadableStream;\n    assert(controller._closeRequested === false);\n    assert(stream._state === 'readable');\n    if (controller._queueTotalSize > 0) {\n      controller._closeRequested = true;\n      return;\n    }\n    if (controller._pendingPullIntos.length > 0) {\n      var firstPendingPullInto = controller._pendingPullIntos[0];\n      if (firstPendingPullInto.bytesFilled > 0) {\n        var e = new TypeError('Insufficient bytes to fill elements in the given buffer');\n        ReadableByteStreamControllerError(controller, e);\n        throw e;\n      }\n    }\n    ReadableStreamClose(stream);\n  }\n  function ReadableByteStreamControllerEnqueue(controller, chunk) {\n    var stream = controller._controlledReadableStream;\n    assert(controller._closeRequested === false);\n    assert(stream._state === 'readable');\n    var buffer = chunk.buffer;\n    var byteOffset = chunk.byteOffset;\n    var byteLength = chunk.byteLength;\n    var transferredBuffer = TransferArrayBuffer(buffer);\n    if (ReadableStreamHasDefaultReader(stream) === true) {\n      if (ReadableStreamGetNumReadRequests(stream) === 0) {\n        ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n      } else {\n        assert(controller._queue.length === 0);\n        var transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength);\n        ReadableStreamFulfillReadRequest(stream, transferredView, false);\n      }\n    } else if (ReadableStreamHasBYOBReader(stream) === true) {\n      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n      ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);\n    } else {\n      assert(IsReadableStreamLocked(stream) === false, 'stream must not be locked');\n      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n    }\n  }\n  function ReadableByteStreamControllerError(controller, e) {\n    var stream = controller._controlledReadableStream;\n    assert(stream._state === 'readable');\n    ReadableByteStreamControllerClearPendingPullIntos(controller);\n    ResetQueue(controller);\n    ReadableStreamError(stream, e);\n  }\n  function ReadableByteStreamControllerGetDesiredSize(controller) {\n    var stream = controller._controlledReadableStream;\n    var state = stream._state;\n    if (state === 'errored') {\n      return null;\n    }\n    if (state === 'closed') {\n      return 0;\n    }\n    return controller._strategyHWM - controller._queueTotalSize;\n  }\n  function ReadableByteStreamControllerRespond(controller, bytesWritten) {\n    bytesWritten = Number(bytesWritten);\n    if (IsFiniteNonNegativeNumber(bytesWritten) === false) {\n      throw new RangeError('bytesWritten must be a finite');\n    }\n    assert(controller._pendingPullIntos.length > 0);\n    ReadableByteStreamControllerRespondInternal(controller, bytesWritten);\n  }\n  function ReadableByteStreamControllerRespondWithNewView(controller, view) {\n    assert(controller._pendingPullIntos.length > 0);\n    var firstDescriptor = controller._pendingPullIntos[0];\n    if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) {\n      throw new RangeError('The region specified by view does not match byobRequest');\n    }\n    if (firstDescriptor.byteLength !== view.byteLength) {\n      throw new RangeError('The buffer of view has different capacity than byobRequest');\n    }\n    firstDescriptor.buffer = view.buffer;\n    ReadableByteStreamControllerRespondInternal(controller, view.byteLength);\n  }\n  function streamBrandCheckException(name) {\n    return new TypeError('ReadableStream.prototype.' + name + ' can only be used on a ReadableStream');\n  }\n  function readerLockException(name) {\n    return new TypeError('Cannot ' + name + ' a stream using a released reader');\n  }\n  function defaultReaderBrandCheckException(name) {\n    return new TypeError('ReadableStreamDefaultReader.prototype.' + name + ' can only be used on a ReadableStreamDefaultReader');\n  }\n  function defaultReaderClosedPromiseInitialize(reader) {\n    reader._closedPromise = new Promise(function (resolve, reject) {\n      reader._closedPromise_resolve = resolve;\n      reader._closedPromise_reject = reject;\n    });\n  }\n  function defaultReaderClosedPromiseInitializeAsRejected(reader, reason) {\n    reader._closedPromise = Promise.reject(reason);\n    reader._closedPromise_resolve = undefined;\n    reader._closedPromise_reject = undefined;\n  }\n  function defaultReaderClosedPromiseInitializeAsResolved(reader) {\n    reader._closedPromise = Promise.resolve(undefined);\n    reader._closedPromise_resolve = undefined;\n    reader._closedPromise_reject = undefined;\n  }\n  function defaultReaderClosedPromiseReject(reader, reason) {\n    assert(reader._closedPromise_resolve !== undefined);\n    assert(reader._closedPromise_reject !== undefined);\n    reader._closedPromise_reject(reason);\n    reader._closedPromise_resolve = undefined;\n    reader._closedPromise_reject = undefined;\n  }\n  function defaultReaderClosedPromiseResetToRejected(reader, reason) {\n    assert(reader._closedPromise_resolve === undefined);\n    assert(reader._closedPromise_reject === undefined);\n    reader._closedPromise = Promise.reject(reason);\n  }\n  function defaultReaderClosedPromiseResolve(reader) {\n    assert(reader._closedPromise_resolve !== undefined);\n    assert(reader._closedPromise_reject !== undefined);\n    reader._closedPromise_resolve(undefined);\n    reader._closedPromise_resolve = undefined;\n    reader._closedPromise_reject = undefined;\n  }\n  function byobReaderBrandCheckException(name) {\n    return new TypeError('ReadableStreamBYOBReader.prototype.' + name + ' can only be used on a ReadableStreamBYOBReader');\n  }\n  function defaultControllerBrandCheckException(name) {\n    return new TypeError('ReadableStreamDefaultController.prototype.' + name + ' can only be used on a ReadableStreamDefaultController');\n  }\n  function byobRequestBrandCheckException(name) {\n    return new TypeError('ReadableStreamBYOBRequest.prototype.' + name + ' can only be used on a ReadableStreamBYOBRequest');\n  }\n  function byteStreamControllerBrandCheckException(name) {\n    return new TypeError('ReadableByteStreamController.prototype.' + name + ' can only be used on a ReadableByteStreamController');\n  }\n  function ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise) {\n    try {\n      Promise.prototype.then.call(promise, undefined, function () {});\n    } catch (e) {}\n  }\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var transformStream = __w_pdfjs_require__(6);\n  var readableStream = __w_pdfjs_require__(4);\n  var writableStream = __w_pdfjs_require__(2);\n  exports.TransformStream = transformStream.TransformStream;\n  exports.ReadableStream = readableStream.ReadableStream;\n  exports.IsReadableStreamDisturbed = readableStream.IsReadableStreamDisturbed;\n  exports.ReadableStreamDefaultControllerClose = readableStream.ReadableStreamDefaultControllerClose;\n  exports.ReadableStreamDefaultControllerEnqueue = readableStream.ReadableStreamDefaultControllerEnqueue;\n  exports.ReadableStreamDefaultControllerError = readableStream.ReadableStreamDefaultControllerError;\n  exports.ReadableStreamDefaultControllerGetDesiredSize = readableStream.ReadableStreamDefaultControllerGetDesiredSize;\n  exports.AcquireWritableStreamDefaultWriter = writableStream.AcquireWritableStreamDefaultWriter;\n  exports.IsWritableStream = writableStream.IsWritableStream;\n  exports.IsWritableStreamLocked = writableStream.IsWritableStreamLocked;\n  exports.WritableStream = writableStream.WritableStream;\n  exports.WritableStreamAbort = writableStream.WritableStreamAbort;\n  exports.WritableStreamDefaultControllerError = writableStream.WritableStreamDefaultControllerError;\n  exports.WritableStreamDefaultWriterCloseWithErrorPropagation = writableStream.WritableStreamDefaultWriterCloseWithErrorPropagation;\n  exports.WritableStreamDefaultWriterRelease = writableStream.WritableStreamDefaultWriterRelease;\n  exports.WritableStreamDefaultWriterWrite = writableStream.WritableStreamDefaultWriterWrite;\n}, function (module, exports, __w_pdfjs_require__) {\n  \"use strict\";\n\n  var _createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n  var _require = __w_pdfjs_require__(1),\n      assert = _require.assert;\n  var _require2 = __w_pdfjs_require__(0),\n      InvokeOrNoop = _require2.InvokeOrNoop,\n      PromiseInvokeOrPerformFallback = _require2.PromiseInvokeOrPerformFallback,\n      PromiseInvokeOrNoop = _require2.PromiseInvokeOrNoop,\n      typeIsObject = _require2.typeIsObject;\n  var _require3 = __w_pdfjs_require__(4),\n      ReadableStream = _require3.ReadableStream,\n      ReadableStreamDefaultControllerClose = _require3.ReadableStreamDefaultControllerClose,\n      ReadableStreamDefaultControllerEnqueue = _require3.ReadableStreamDefaultControllerEnqueue,\n      ReadableStreamDefaultControllerError = _require3.ReadableStreamDefaultControllerError,\n      ReadableStreamDefaultControllerGetDesiredSize = _require3.ReadableStreamDefaultControllerGetDesiredSize;\n  var _require4 = __w_pdfjs_require__(2),\n      WritableStream = _require4.WritableStream,\n      WritableStreamDefaultControllerError = _require4.WritableStreamDefaultControllerError;\n  function TransformStreamCloseReadable(transformStream) {\n    if (transformStream._errored === true) {\n      throw new TypeError('TransformStream is already errored');\n    }\n    if (transformStream._readableClosed === true) {\n      throw new TypeError('Readable side is already closed');\n    }\n    TransformStreamCloseReadableInternal(transformStream);\n  }\n  function TransformStreamEnqueueToReadable(transformStream, chunk) {\n    if (transformStream._errored === true) {\n      throw new TypeError('TransformStream is already errored');\n    }\n    if (transformStream._readableClosed === true) {\n      throw new TypeError('Readable side is already closed');\n    }\n    var controller = transformStream._readableController;\n    try {\n      ReadableStreamDefaultControllerEnqueue(controller, chunk);\n    } catch (e) {\n      transformStream._readableClosed = true;\n      TransformStreamErrorIfNeeded(transformStream, e);\n      throw transformStream._storedError;\n    }\n    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);\n    var maybeBackpressure = desiredSize <= 0;\n    if (maybeBackpressure === true && transformStream._backpressure === false) {\n      TransformStreamSetBackpressure(transformStream, true);\n    }\n  }\n  function TransformStreamError(transformStream, e) {\n    if (transformStream._errored === true) {\n      throw new TypeError('TransformStream is already errored');\n    }\n    TransformStreamErrorInternal(transformStream, e);\n  }\n  function TransformStreamCloseReadableInternal(transformStream) {\n    assert(transformStream._errored === false);\n    assert(transformStream._readableClosed === false);\n    try {\n      ReadableStreamDefaultControllerClose(transformStream._readableController);\n    } catch (e) {\n      assert(false);\n    }\n    transformStream._readableClosed = true;\n  }\n  function TransformStreamErrorIfNeeded(transformStream, e) {\n    if (transformStream._errored === false) {\n      TransformStreamErrorInternal(transformStream, e);\n    }\n  }\n  function TransformStreamErrorInternal(transformStream, e) {\n    assert(transformStream._errored === false);\n    transformStream._errored = true;\n    transformStream._storedError = e;\n    if (transformStream._writableDone === false) {\n      WritableStreamDefaultControllerError(transformStream._writableController, e);\n    }\n    if (transformStream._readableClosed === false) {\n      ReadableStreamDefaultControllerError(transformStream._readableController, e);\n    }\n  }\n  function TransformStreamReadableReadyPromise(transformStream) {\n    assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n    if (transformStream._backpressure === false) {\n      return Promise.resolve();\n    }\n    assert(transformStream._backpressure === true, '_backpressure should have been initialized');\n    return transformStream._backpressureChangePromise;\n  }\n  function TransformStreamSetBackpressure(transformStream, backpressure) {\n    assert(transformStream._backpressure !== backpressure, 'TransformStreamSetBackpressure() should be called only when backpressure is changed');\n    if (transformStream._backpressureChangePromise !== undefined) {\n      transformStream._backpressureChangePromise_resolve(backpressure);\n    }\n    transformStream._backpressureChangePromise = new Promise(function (resolve) {\n      transformStream._backpressureChangePromise_resolve = resolve;\n    });\n    transformStream._backpressureChangePromise.then(function (resolution) {\n      assert(resolution !== backpressure, '_backpressureChangePromise should be fulfilled only when backpressure is changed');\n    });\n    transformStream._backpressure = backpressure;\n  }\n  function TransformStreamDefaultTransform(chunk, transformStreamController) {\n    var transformStream = transformStreamController._controlledTransformStream;\n    TransformStreamEnqueueToReadable(transformStream, chunk);\n    return Promise.resolve();\n  }\n  function TransformStreamTransform(transformStream, chunk) {\n    assert(transformStream._errored === false);\n    assert(transformStream._transforming === false);\n    assert(transformStream._backpressure === false);\n    transformStream._transforming = true;\n    var transformer = transformStream._transformer;\n    var controller = transformStream._transformStreamController;\n    var transformPromise = PromiseInvokeOrPerformFallback(transformer, 'transform', [chunk, controller], TransformStreamDefaultTransform, [chunk, controller]);\n    return transformPromise.then(function () {\n      transformStream._transforming = false;\n      return TransformStreamReadableReadyPromise(transformStream);\n    }, function (e) {\n      TransformStreamErrorIfNeeded(transformStream, e);\n      return Promise.reject(e);\n    });\n  }\n  function IsTransformStreamDefaultController(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) {\n      return false;\n    }\n    return true;\n  }\n  function IsTransformStream(x) {\n    if (!typeIsObject(x)) {\n      return false;\n    }\n    if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) {\n      return false;\n    }\n    return true;\n  }\n  var TransformStreamSink = function () {\n    function TransformStreamSink(transformStream, startPromise) {\n      _classCallCheck(this, TransformStreamSink);\n      this._transformStream = transformStream;\n      this._startPromise = startPromise;\n    }\n    _createClass(TransformStreamSink, [{\n      key: 'start',\n      value: function start(c) {\n        var transformStream = this._transformStream;\n        transformStream._writableController = c;\n        return this._startPromise.then(function () {\n          return TransformStreamReadableReadyPromise(transformStream);\n        });\n      }\n    }, {\n      key: 'write',\n      value: function write(chunk) {\n        var transformStream = this._transformStream;\n        return TransformStreamTransform(transformStream, chunk);\n      }\n    }, {\n      key: 'abort',\n      value: function abort() {\n        var transformStream = this._transformStream;\n        transformStream._writableDone = true;\n        TransformStreamErrorInternal(transformStream, new TypeError('Writable side aborted'));\n      }\n    }, {\n      key: 'close',\n      value: function close() {\n        var transformStream = this._transformStream;\n        assert(transformStream._transforming === false);\n        transformStream._writableDone = true;\n        var flushPromise = PromiseInvokeOrNoop(transformStream._transformer, 'flush', [transformStream._transformStreamController]);\n        return flushPromise.then(function () {\n          if (transformStream._errored === true) {\n            return Promise.reject(transformStream._storedError);\n          }\n          if (transformStream._readableClosed === false) {\n            TransformStreamCloseReadableInternal(transformStream);\n          }\n          return Promise.resolve();\n        }).catch(function (r) {\n          TransformStreamErrorIfNeeded(transformStream, r);\n          return Promise.reject(transformStream._storedError);\n        });\n      }\n    }]);\n    return TransformStreamSink;\n  }();\n  var TransformStreamSource = function () {\n    function TransformStreamSource(transformStream, startPromise) {\n      _classCallCheck(this, TransformStreamSource);\n      this._transformStream = transformStream;\n      this._startPromise = startPromise;\n    }\n    _createClass(TransformStreamSource, [{\n      key: 'start',\n      value: function start(c) {\n        var transformStream = this._transformStream;\n        transformStream._readableController = c;\n        return this._startPromise.then(function () {\n          assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n          if (transformStream._backpressure === true) {\n            return Promise.resolve();\n          }\n          assert(transformStream._backpressure === false, '_backpressure should have been initialized');\n          return transformStream._backpressureChangePromise;\n        });\n      }\n    }, {\n      key: 'pull',\n      value: function pull() {\n        var transformStream = this._transformStream;\n        assert(transformStream._backpressure === true, 'pull() should be never called while _backpressure is false');\n        assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n        TransformStreamSetBackpressure(transformStream, false);\n        return transformStream._backpressureChangePromise;\n      }\n    }, {\n      key: 'cancel',\n      value: function cancel() {\n        var transformStream = this._transformStream;\n        transformStream._readableClosed = true;\n        TransformStreamErrorInternal(transformStream, new TypeError('Readable side canceled'));\n      }\n    }]);\n    return TransformStreamSource;\n  }();\n  var TransformStreamDefaultController = function () {\n    function TransformStreamDefaultController(transformStream) {\n      _classCallCheck(this, TransformStreamDefaultController);\n      if (IsTransformStream(transformStream) === false) {\n        throw new TypeError('TransformStreamDefaultController can only be ' + 'constructed with a TransformStream instance');\n      }\n      if (transformStream._transformStreamController !== undefined) {\n        throw new TypeError('TransformStreamDefaultController instances can ' + 'only be created by the TransformStream constructor');\n      }\n      this._controlledTransformStream = transformStream;\n    }\n    _createClass(TransformStreamDefaultController, [{\n      key: 'enqueue',\n      value: function enqueue(chunk) {\n        if (IsTransformStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('enqueue');\n        }\n        TransformStreamEnqueueToReadable(this._controlledTransformStream, chunk);\n      }\n    }, {\n      key: 'close',\n      value: function close() {\n        if (IsTransformStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('close');\n        }\n        TransformStreamCloseReadable(this._controlledTransformStream);\n      }\n    }, {\n      key: 'error',\n      value: function error(reason) {\n        if (IsTransformStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('error');\n        }\n        TransformStreamError(this._controlledTransformStream, reason);\n      }\n    }, {\n      key: 'desiredSize',\n      get: function get() {\n        if (IsTransformStreamDefaultController(this) === false) {\n          throw defaultControllerBrandCheckException('desiredSize');\n        }\n        var transformStream = this._controlledTransformStream;\n        var readableController = transformStream._readableController;\n        return ReadableStreamDefaultControllerGetDesiredSize(readableController);\n      }\n    }]);\n    return TransformStreamDefaultController;\n  }();\n  var TransformStream = function () {\n    function TransformStream() {\n      var transformer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      _classCallCheck(this, TransformStream);\n      this._transformer = transformer;\n      var readableStrategy = transformer.readableStrategy,\n          writableStrategy = transformer.writableStrategy;\n      this._transforming = false;\n      this._errored = false;\n      this._storedError = undefined;\n      this._writableController = undefined;\n      this._readableController = undefined;\n      this._transformStreamController = undefined;\n      this._writableDone = false;\n      this._readableClosed = false;\n      this._backpressure = undefined;\n      this._backpressureChangePromise = undefined;\n      this._backpressureChangePromise_resolve = undefined;\n      this._transformStreamController = new TransformStreamDefaultController(this);\n      var startPromise_resolve = void 0;\n      var startPromise = new Promise(function (resolve) {\n        startPromise_resolve = resolve;\n      });\n      var source = new TransformStreamSource(this, startPromise);\n      this._readable = new ReadableStream(source, readableStrategy);\n      var sink = new TransformStreamSink(this, startPromise);\n      this._writable = new WritableStream(sink, writableStrategy);\n      assert(this._writableController !== undefined);\n      assert(this._readableController !== undefined);\n      var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(this._readableController);\n      TransformStreamSetBackpressure(this, desiredSize <= 0);\n      var transformStream = this;\n      var startResult = InvokeOrNoop(transformer, 'start', [transformStream._transformStreamController]);\n      startPromise_resolve(startResult);\n      startPromise.catch(function (e) {\n        if (transformStream._errored === false) {\n          transformStream._errored = true;\n          transformStream._storedError = e;\n        }\n      });\n    }\n    _createClass(TransformStream, [{\n      key: 'readable',\n      get: function get() {\n        if (IsTransformStream(this) === false) {\n          throw streamBrandCheckException('readable');\n        }\n        return this._readable;\n      }\n    }, {\n      key: 'writable',\n      get: function get() {\n        if (IsTransformStream(this) === false) {\n          throw streamBrandCheckException('writable');\n        }\n        return this._writable;\n      }\n    }]);\n    return TransformStream;\n  }();\n  module.exports = { TransformStream: TransformStream };\n  function defaultControllerBrandCheckException(name) {\n    return new TypeError('TransformStreamDefaultController.prototype.' + name + ' can only be used on a TransformStreamDefaultController');\n  }\n  function streamBrandCheckException(name) {\n    return new TypeError('TransformStream.prototype.' + name + ' can only be used on a TransformStream');\n  }\n}, function (module, exports, __w_pdfjs_require__) {\n  module.exports = __w_pdfjs_require__(5);\n}]));\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.AnnotationFactory = exports.AnnotationBorderStyle = exports.Annotation = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _obj = __w_pdfjs_require__(15);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _colorspace = __w_pdfjs_require__(3);\n\nvar _evaluator = __w_pdfjs_require__(13);\n\nvar _stream = __w_pdfjs_require__(2);\n\nfunction AnnotationFactory() {}\nAnnotationFactory.prototype = {\n  create: function AnnotationFactory_create(xref, ref, pdfManager, idFactory) {\n    var dict = xref.fetchIfRef(ref);\n    if (!(0, _primitives.isDict)(dict)) {\n      return;\n    }\n    var id = (0, _primitives.isRef)(ref) ? ref.toString() : 'annot_' + idFactory.createObjId();\n    var subtype = dict.get('Subtype');\n    subtype = (0, _primitives.isName)(subtype) ? subtype.name : null;\n    var parameters = {\n      xref: xref,\n      dict: dict,\n      ref: (0, _primitives.isRef)(ref) ? ref : null,\n      subtype: subtype,\n      id: id,\n      pdfManager: pdfManager\n    };\n    switch (subtype) {\n      case 'Link':\n        return new LinkAnnotation(parameters);\n      case 'Text':\n        return new TextAnnotation(parameters);\n      case 'Widget':\n        var fieldType = _util.Util.getInheritableProperty(dict, 'FT');\n        fieldType = (0, _primitives.isName)(fieldType) ? fieldType.name : null;\n        switch (fieldType) {\n          case 'Tx':\n            return new TextWidgetAnnotation(parameters);\n          case 'Btn':\n            return new ButtonWidgetAnnotation(parameters);\n          case 'Ch':\n            return new ChoiceWidgetAnnotation(parameters);\n        }\n        (0, _util.warn)('Unimplemented widget field type \"' + fieldType + '\", ' + 'falling back to base field type.');\n        return new WidgetAnnotation(parameters);\n      case 'Popup':\n        return new PopupAnnotation(parameters);\n      case 'Line':\n        return new LineAnnotation(parameters);\n      case 'Highlight':\n        return new HighlightAnnotation(parameters);\n      case 'Underline':\n        return new UnderlineAnnotation(parameters);\n      case 'Squiggly':\n        return new SquigglyAnnotation(parameters);\n      case 'StrikeOut':\n        return new StrikeOutAnnotation(parameters);\n      case 'FileAttachment':\n        return new FileAttachmentAnnotation(parameters);\n      default:\n        if (!subtype) {\n          (0, _util.warn)('Annotation is missing the required /Subtype.');\n        } else {\n          (0, _util.warn)('Unimplemented annotation type \"' + subtype + '\", ' + 'falling back to base annotation.');\n        }\n        return new Annotation(parameters);\n    }\n  }\n};\nvar Annotation = function AnnotationClosure() {\n  function getTransformMatrix(rect, bbox, matrix) {\n    var bounds = _util.Util.getAxialAlignedBoundingBox(bbox, matrix);\n    var minX = bounds[0];\n    var minY = bounds[1];\n    var maxX = bounds[2];\n    var maxY = bounds[3];\n    if (minX === maxX || minY === maxY) {\n      return [1, 0, 0, 1, rect[0], rect[1]];\n    }\n    var xRatio = (rect[2] - rect[0]) / (maxX - minX);\n    var yRatio = (rect[3] - rect[1]) / (maxY - minY);\n    return [xRatio, 0, 0, yRatio, rect[0] - minX * xRatio, rect[1] - minY * yRatio];\n  }\n  function Annotation(params) {\n    var dict = params.dict;\n    this.setFlags(dict.get('F'));\n    this.setRectangle(dict.getArray('Rect'));\n    this.setColor(dict.getArray('C'));\n    this.setBorderStyle(dict);\n    this.setAppearance(dict);\n    this.data = {};\n    this.data.id = params.id;\n    this.data.subtype = params.subtype;\n    this.data.annotationFlags = this.flags;\n    this.data.rect = this.rectangle;\n    this.data.color = this.color;\n    this.data.borderStyle = this.borderStyle;\n    this.data.hasAppearance = !!this.appearance;\n  }\n  Annotation.prototype = {\n    _hasFlag: function Annotation_hasFlag(flags, flag) {\n      return !!(flags & flag);\n    },\n    _isViewable: function Annotation_isViewable(flags) {\n      return !this._hasFlag(flags, _util.AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, _util.AnnotationFlag.HIDDEN) && !this._hasFlag(flags, _util.AnnotationFlag.NOVIEW);\n    },\n    _isPrintable: function AnnotationFlag_isPrintable(flags) {\n      return this._hasFlag(flags, _util.AnnotationFlag.PRINT) && !this._hasFlag(flags, _util.AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, _util.AnnotationFlag.HIDDEN);\n    },\n    get viewable() {\n      if (this.flags === 0) {\n        return true;\n      }\n      return this._isViewable(this.flags);\n    },\n    get printable() {\n      if (this.flags === 0) {\n        return false;\n      }\n      return this._isPrintable(this.flags);\n    },\n    setFlags: function Annotation_setFlags(flags) {\n      this.flags = (0, _util.isInt)(flags) && flags > 0 ? flags : 0;\n    },\n    hasFlag: function Annotation_hasFlag(flag) {\n      return this._hasFlag(this.flags, flag);\n    },\n    setRectangle: function Annotation_setRectangle(rectangle) {\n      if ((0, _util.isArray)(rectangle) && rectangle.length === 4) {\n        this.rectangle = _util.Util.normalizeRect(rectangle);\n      } else {\n        this.rectangle = [0, 0, 0, 0];\n      }\n    },\n    setColor: function Annotation_setColor(color) {\n      var rgbColor = new Uint8Array(3);\n      if (!(0, _util.isArray)(color)) {\n        this.color = rgbColor;\n        return;\n      }\n      switch (color.length) {\n        case 0:\n          this.color = null;\n          break;\n        case 1:\n          _colorspace.ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0);\n          this.color = rgbColor;\n          break;\n        case 3:\n          _colorspace.ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0);\n          this.color = rgbColor;\n          break;\n        case 4:\n          _colorspace.ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0);\n          this.color = rgbColor;\n          break;\n        default:\n          this.color = rgbColor;\n          break;\n      }\n    },\n    setBorderStyle: function Annotation_setBorderStyle(borderStyle) {\n      this.borderStyle = new AnnotationBorderStyle();\n      if (!(0, _primitives.isDict)(borderStyle)) {\n        return;\n      }\n      if (borderStyle.has('BS')) {\n        var dict = borderStyle.get('BS');\n        var dictType = dict.get('Type');\n        if (!dictType || (0, _primitives.isName)(dictType, 'Border')) {\n          this.borderStyle.setWidth(dict.get('W'));\n          this.borderStyle.setStyle(dict.get('S'));\n          this.borderStyle.setDashArray(dict.getArray('D'));\n        }\n      } else if (borderStyle.has('Border')) {\n        var array = borderStyle.getArray('Border');\n        if ((0, _util.isArray)(array) && array.length >= 3) {\n          this.borderStyle.setHorizontalCornerRadius(array[0]);\n          this.borderStyle.setVerticalCornerRadius(array[1]);\n          this.borderStyle.setWidth(array[2]);\n          if (array.length === 4) {\n            this.borderStyle.setDashArray(array[3]);\n          }\n        }\n      } else {\n        this.borderStyle.setWidth(0);\n      }\n    },\n    setAppearance: function Annotation_setAppearance(dict) {\n      this.appearance = null;\n      var appearanceStates = dict.get('AP');\n      if (!(0, _primitives.isDict)(appearanceStates)) {\n        return;\n      }\n      var normalAppearanceState = appearanceStates.get('N');\n      if ((0, _primitives.isStream)(normalAppearanceState)) {\n        this.appearance = normalAppearanceState;\n        return;\n      }\n      if (!(0, _primitives.isDict)(normalAppearanceState)) {\n        return;\n      }\n      var as = dict.get('AS');\n      if (!(0, _primitives.isName)(as) || !normalAppearanceState.has(as.name)) {\n        return;\n      }\n      this.appearance = normalAppearanceState.get(as.name);\n    },\n    _preparePopup: function Annotation_preparePopup(dict) {\n      if (!dict.has('C')) {\n        this.data.color = null;\n      }\n      this.data.hasPopup = dict.has('Popup');\n      this.data.title = (0, _util.stringToPDFString)(dict.get('T') || '');\n      this.data.contents = (0, _util.stringToPDFString)(dict.get('Contents') || '');\n    },\n    loadResources: function Annotation_loadResources(keys) {\n      return this.appearance.dict.getAsync('Resources').then(function (resources) {\n        if (!resources) {\n          return;\n        }\n        var objectLoader = new _obj.ObjectLoader(resources, keys, resources.xref);\n        return objectLoader.load().then(function () {\n          return resources;\n        });\n      });\n    },\n    getOperatorList: function Annotation_getOperatorList(evaluator, task, renderForms) {\n      var _this = this;\n\n      if (!this.appearance) {\n        return Promise.resolve(new _evaluator.OperatorList());\n      }\n      var data = this.data;\n      var appearanceDict = this.appearance.dict;\n      var resourcesPromise = this.loadResources(['ExtGState', 'ColorSpace', 'Pattern', 'Shading', 'XObject', 'Font']);\n      var bbox = appearanceDict.getArray('BBox') || [0, 0, 1, 1];\n      var matrix = appearanceDict.getArray('Matrix') || [1, 0, 0, 1, 0, 0];\n      var transform = getTransformMatrix(data.rect, bbox, matrix);\n      return resourcesPromise.then(function (resources) {\n        var opList = new _evaluator.OperatorList();\n        opList.addOp(_util.OPS.beginAnnotation, [data.rect, transform, matrix]);\n        return evaluator.getOperatorList({\n          stream: _this.appearance,\n          task: task,\n          resources: resources,\n          operatorList: opList\n        }).then(function () {\n          opList.addOp(_util.OPS.endAnnotation, []);\n          _this.appearance.reset();\n          return opList;\n        });\n      });\n    }\n  };\n  return Annotation;\n}();\nvar AnnotationBorderStyle = function AnnotationBorderStyleClosure() {\n  function AnnotationBorderStyle() {\n    this.width = 1;\n    this.style = _util.AnnotationBorderStyleType.SOLID;\n    this.dashArray = [3];\n    this.horizontalCornerRadius = 0;\n    this.verticalCornerRadius = 0;\n  }\n  AnnotationBorderStyle.prototype = {\n    setWidth: function AnnotationBorderStyle_setWidth(width) {\n      if (width === (width | 0)) {\n        this.width = width;\n      }\n    },\n    setStyle: function AnnotationBorderStyle_setStyle(style) {\n      if (!style) {\n        return;\n      }\n      switch (style.name) {\n        case 'S':\n          this.style = _util.AnnotationBorderStyleType.SOLID;\n          break;\n        case 'D':\n          this.style = _util.AnnotationBorderStyleType.DASHED;\n          break;\n        case 'B':\n          this.style = _util.AnnotationBorderStyleType.BEVELED;\n          break;\n        case 'I':\n          this.style = _util.AnnotationBorderStyleType.INSET;\n          break;\n        case 'U':\n          this.style = _util.AnnotationBorderStyleType.UNDERLINE;\n          break;\n        default:\n          break;\n      }\n    },\n    setDashArray: function AnnotationBorderStyle_setDashArray(dashArray) {\n      if ((0, _util.isArray)(dashArray) && dashArray.length > 0) {\n        var isValid = true;\n        var allZeros = true;\n        for (var i = 0, len = dashArray.length; i < len; i++) {\n          var element = dashArray[i];\n          var validNumber = +element >= 0;\n          if (!validNumber) {\n            isValid = false;\n            break;\n          } else if (element > 0) {\n            allZeros = false;\n          }\n        }\n        if (isValid && !allZeros) {\n          this.dashArray = dashArray;\n        } else {\n          this.width = 0;\n        }\n      } else if (dashArray) {\n        this.width = 0;\n      }\n    },\n    setHorizontalCornerRadius: function AnnotationBorderStyle_setHorizontalCornerRadius(radius) {\n      if (radius === (radius | 0)) {\n        this.horizontalCornerRadius = radius;\n      }\n    },\n    setVerticalCornerRadius: function AnnotationBorderStyle_setVerticalCornerRadius(radius) {\n      if (radius === (radius | 0)) {\n        this.verticalCornerRadius = radius;\n      }\n    }\n  };\n  return AnnotationBorderStyle;\n}();\nvar WidgetAnnotation = function WidgetAnnotationClosure() {\n  function WidgetAnnotation(params) {\n    Annotation.call(this, params);\n    var dict = params.dict;\n    var data = this.data;\n    data.annotationType = _util.AnnotationType.WIDGET;\n    data.fieldName = this._constructFieldName(dict);\n    data.fieldValue = _util.Util.getInheritableProperty(dict, 'V', true);\n    data.alternativeText = (0, _util.stringToPDFString)(dict.get('TU') || '');\n    data.defaultAppearance = _util.Util.getInheritableProperty(dict, 'DA') || '';\n    var fieldType = _util.Util.getInheritableProperty(dict, 'FT');\n    data.fieldType = (0, _primitives.isName)(fieldType) ? fieldType.name : null;\n    this.fieldResources = _util.Util.getInheritableProperty(dict, 'DR') || _primitives.Dict.empty;\n    data.fieldFlags = _util.Util.getInheritableProperty(dict, 'Ff');\n    if (!(0, _util.isInt)(data.fieldFlags) || data.fieldFlags < 0) {\n      data.fieldFlags = 0;\n    }\n    data.readOnly = this.hasFieldFlag(_util.AnnotationFieldFlag.READONLY);\n    if (data.fieldType === 'Sig') {\n      this.setFlags(_util.AnnotationFlag.HIDDEN);\n    }\n  }\n  _util.Util.inherit(WidgetAnnotation, Annotation, {\n    _constructFieldName: function WidgetAnnotation_constructFieldName(dict) {\n      if (!dict.has('T') && !dict.has('Parent')) {\n        (0, _util.warn)('Unknown field name, falling back to empty field name.');\n        return '';\n      }\n      if (!dict.has('Parent')) {\n        return (0, _util.stringToPDFString)(dict.get('T'));\n      }\n      var fieldName = [];\n      if (dict.has('T')) {\n        fieldName.unshift((0, _util.stringToPDFString)(dict.get('T')));\n      }\n      var loopDict = dict;\n      while (loopDict.has('Parent')) {\n        loopDict = loopDict.get('Parent');\n        if (!(0, _primitives.isDict)(loopDict)) {\n          break;\n        }\n        if (loopDict.has('T')) {\n          fieldName.unshift((0, _util.stringToPDFString)(loopDict.get('T')));\n        }\n      }\n      return fieldName.join('.');\n    },\n    hasFieldFlag: function WidgetAnnotation_hasFieldFlag(flag) {\n      return !!(this.data.fieldFlags & flag);\n    }\n  });\n  return WidgetAnnotation;\n}();\nvar TextWidgetAnnotation = function TextWidgetAnnotationClosure() {\n  function TextWidgetAnnotation(params) {\n    WidgetAnnotation.call(this, params);\n    this.data.fieldValue = (0, _util.stringToPDFString)(this.data.fieldValue || '');\n    var alignment = _util.Util.getInheritableProperty(params.dict, 'Q');\n    if (!(0, _util.isInt)(alignment) || alignment < 0 || alignment > 2) {\n      alignment = null;\n    }\n    this.data.textAlignment = alignment;\n    var maximumLength = _util.Util.getInheritableProperty(params.dict, 'MaxLen');\n    if (!(0, _util.isInt)(maximumLength) || maximumLength < 0) {\n      maximumLength = null;\n    }\n    this.data.maxLen = maximumLength;\n    this.data.multiLine = this.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE);\n    this.data.comb = this.hasFieldFlag(_util.AnnotationFieldFlag.COMB) && !this.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE) && !this.hasFieldFlag(_util.AnnotationFieldFlag.PASSWORD) && !this.hasFieldFlag(_util.AnnotationFieldFlag.FILESELECT) && this.data.maxLen !== null;\n  }\n  _util.Util.inherit(TextWidgetAnnotation, WidgetAnnotation, {\n    getOperatorList: function TextWidgetAnnotation_getOperatorList(evaluator, task, renderForms) {\n      var operatorList = new _evaluator.OperatorList();\n      if (renderForms) {\n        return Promise.resolve(operatorList);\n      }\n      if (this.appearance) {\n        return Annotation.prototype.getOperatorList.call(this, evaluator, task, renderForms);\n      }\n      if (!this.data.defaultAppearance) {\n        return Promise.resolve(operatorList);\n      }\n      var stream = new _stream.Stream((0, _util.stringToBytes)(this.data.defaultAppearance));\n      return evaluator.getOperatorList({\n        stream: stream,\n        task: task,\n        resources: this.fieldResources,\n        operatorList: operatorList\n      }).then(function () {\n        return operatorList;\n      });\n    }\n  });\n  return TextWidgetAnnotation;\n}();\nvar ButtonWidgetAnnotation = function ButtonWidgetAnnotationClosure() {\n  function ButtonWidgetAnnotation(params) {\n    WidgetAnnotation.call(this, params);\n    this.data.checkBox = !this.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);\n    if (this.data.checkBox) {\n      if (!(0, _primitives.isName)(this.data.fieldValue)) {\n        return;\n      }\n      this.data.fieldValue = this.data.fieldValue.name;\n    }\n    this.data.radioButton = this.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);\n    if (this.data.radioButton) {\n      this.data.fieldValue = this.data.buttonValue = null;\n      var fieldParent = params.dict.get('Parent');\n      if ((0, _primitives.isDict)(fieldParent) && fieldParent.has('V')) {\n        var fieldParentValue = fieldParent.get('V');\n        if ((0, _primitives.isName)(fieldParentValue)) {\n          this.data.fieldValue = fieldParentValue.name;\n        }\n      }\n      var appearanceStates = params.dict.get('AP');\n      if (!(0, _primitives.isDict)(appearanceStates)) {\n        return;\n      }\n      var normalAppearanceState = appearanceStates.get('N');\n      if (!(0, _primitives.isDict)(normalAppearanceState)) {\n        return;\n      }\n      var keys = normalAppearanceState.getKeys();\n      for (var i = 0, ii = keys.length; i < ii; i++) {\n        if (keys[i] !== 'Off') {\n          this.data.buttonValue = keys[i];\n          break;\n        }\n      }\n    }\n  }\n  _util.Util.inherit(ButtonWidgetAnnotation, WidgetAnnotation, {\n    getOperatorList: function ButtonWidgetAnnotation_getOperatorList(evaluator, task, renderForms) {\n      var operatorList = new _evaluator.OperatorList();\n      if (renderForms) {\n        return Promise.resolve(operatorList);\n      }\n      if (this.appearance) {\n        return Annotation.prototype.getOperatorList.call(this, evaluator, task, renderForms);\n      }\n      return Promise.resolve(operatorList);\n    }\n  });\n  return ButtonWidgetAnnotation;\n}();\nvar ChoiceWidgetAnnotation = function ChoiceWidgetAnnotationClosure() {\n  function ChoiceWidgetAnnotation(params) {\n    WidgetAnnotation.call(this, params);\n    this.data.options = [];\n    var options = _util.Util.getInheritableProperty(params.dict, 'Opt');\n    if ((0, _util.isArray)(options)) {\n      var xref = params.xref;\n      for (var i = 0, ii = options.length; i < ii; i++) {\n        var option = xref.fetchIfRef(options[i]);\n        var isOptionArray = (0, _util.isArray)(option);\n        this.data.options[i] = {\n          exportValue: isOptionArray ? xref.fetchIfRef(option[0]) : option,\n          displayValue: isOptionArray ? xref.fetchIfRef(option[1]) : option\n        };\n      }\n    }\n    if (!(0, _util.isArray)(this.data.fieldValue)) {\n      this.data.fieldValue = [this.data.fieldValue];\n    }\n    this.data.combo = this.hasFieldFlag(_util.AnnotationFieldFlag.COMBO);\n    this.data.multiSelect = this.hasFieldFlag(_util.AnnotationFieldFlag.MULTISELECT);\n  }\n  _util.Util.inherit(ChoiceWidgetAnnotation, WidgetAnnotation, {\n    getOperatorList: function ChoiceWidgetAnnotation_getOperatorList(evaluator, task, renderForms) {\n      var operatorList = new _evaluator.OperatorList();\n      if (renderForms) {\n        return Promise.resolve(operatorList);\n      }\n      return Annotation.prototype.getOperatorList.call(this, evaluator, task, renderForms);\n    }\n  });\n  return ChoiceWidgetAnnotation;\n}();\nvar TextAnnotation = function TextAnnotationClosure() {\n  var DEFAULT_ICON_SIZE = 22;\n  function TextAnnotation(parameters) {\n    Annotation.call(this, parameters);\n    this.data.annotationType = _util.AnnotationType.TEXT;\n    if (this.data.hasAppearance) {\n      this.data.name = 'NoIcon';\n    } else {\n      this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE;\n      this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE;\n      this.data.name = parameters.dict.has('Name') ? parameters.dict.get('Name').name : 'Note';\n    }\n    this._preparePopup(parameters.dict);\n  }\n  _util.Util.inherit(TextAnnotation, Annotation, {});\n  return TextAnnotation;\n}();\nvar LinkAnnotation = function LinkAnnotationClosure() {\n  function LinkAnnotation(params) {\n    Annotation.call(this, params);\n    var data = this.data;\n    data.annotationType = _util.AnnotationType.LINK;\n    _obj.Catalog.parseDestDictionary({\n      destDict: params.dict,\n      resultObj: data,\n      docBaseUrl: params.pdfManager.docBaseUrl\n    });\n  }\n  _util.Util.inherit(LinkAnnotation, Annotation, {});\n  return LinkAnnotation;\n}();\nvar PopupAnnotation = function PopupAnnotationClosure() {\n  function PopupAnnotation(parameters) {\n    Annotation.call(this, parameters);\n    this.data.annotationType = _util.AnnotationType.POPUP;\n    var dict = parameters.dict;\n    var parentItem = dict.get('Parent');\n    if (!parentItem) {\n      (0, _util.warn)('Popup annotation has a missing or invalid parent annotation.');\n      return;\n    }\n    var parentSubtype = parentItem.get('Subtype');\n    this.data.parentType = (0, _primitives.isName)(parentSubtype) ? parentSubtype.name : null;\n    this.data.parentId = dict.getRaw('Parent').toString();\n    this.data.title = (0, _util.stringToPDFString)(parentItem.get('T') || '');\n    this.data.contents = (0, _util.stringToPDFString)(parentItem.get('Contents') || '');\n    if (!parentItem.has('C')) {\n      this.data.color = null;\n    } else {\n      this.setColor(parentItem.getArray('C'));\n      this.data.color = this.color;\n    }\n    if (!this.viewable) {\n      var parentFlags = parentItem.get('F');\n      if (this._isViewable(parentFlags)) {\n        this.setFlags(parentFlags);\n      }\n    }\n  }\n  _util.Util.inherit(PopupAnnotation, Annotation, {});\n  return PopupAnnotation;\n}();\nvar LineAnnotation = function LineAnnotationClosure() {\n  function LineAnnotation(parameters) {\n    Annotation.call(this, parameters);\n    this.data.annotationType = _util.AnnotationType.LINE;\n    var dict = parameters.dict;\n    this.data.lineCoordinates = _util.Util.normalizeRect(dict.getArray('L'));\n    this._preparePopup(dict);\n  }\n  _util.Util.inherit(LineAnnotation, Annotation, {});\n  return LineAnnotation;\n}();\nvar HighlightAnnotation = function HighlightAnnotationClosure() {\n  function HighlightAnnotation(parameters) {\n    Annotation.call(this, parameters);\n    this.data.annotationType = _util.AnnotationType.HIGHLIGHT;\n    this._preparePopup(parameters.dict);\n  }\n  _util.Util.inherit(HighlightAnnotation, Annotation, {});\n  return HighlightAnnotation;\n}();\nvar UnderlineAnnotation = function UnderlineAnnotationClosure() {\n  function UnderlineAnnotation(parameters) {\n    Annotation.call(this, parameters);\n    this.data.annotationType = _util.AnnotationType.UNDERLINE;\n    this._preparePopup(parameters.dict);\n  }\n  _util.Util.inherit(UnderlineAnnotation, Annotation, {});\n  return UnderlineAnnotation;\n}();\nvar SquigglyAnnotation = function SquigglyAnnotationClosure() {\n  function SquigglyAnnotation(parameters) {\n    Annotation.call(this, parameters);\n    this.data.annotationType = _util.AnnotationType.SQUIGGLY;\n    this._preparePopup(parameters.dict);\n  }\n  _util.Util.inherit(SquigglyAnnotation, Annotation, {});\n  return SquigglyAnnotation;\n}();\nvar StrikeOutAnnotation = function StrikeOutAnnotationClosure() {\n  function StrikeOutAnnotation(parameters) {\n    Annotation.call(this, parameters);\n    this.data.annotationType = _util.AnnotationType.STRIKEOUT;\n    this._preparePopup(parameters.dict);\n  }\n  _util.Util.inherit(StrikeOutAnnotation, Annotation, {});\n  return StrikeOutAnnotation;\n}();\nvar FileAttachmentAnnotation = function FileAttachmentAnnotationClosure() {\n  function FileAttachmentAnnotation(parameters) {\n    Annotation.call(this, parameters);\n    var file = new _obj.FileSpec(parameters.dict.get('FS'), parameters.xref);\n    this.data.annotationType = _util.AnnotationType.FILEATTACHMENT;\n    this.data.file = file.serializable;\n    this._preparePopup(parameters.dict);\n  }\n  _util.Util.inherit(FileAttachmentAnnotation, Annotation, {});\n  return FileAttachmentAnnotation;\n}();\nexports.Annotation = Annotation;\nexports.AnnotationBorderStyle = AnnotationBorderStyle;\nexports.AnnotationFactory = AnnotationFactory;\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.bidi = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar baseTypes = ['BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS', 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'ON', 'ES', 'CS', 'ES', 'CS', 'CS', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'CS', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'ON', 'BN', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON', 'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'];\nvar arabicTypes = ['AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'ON', 'ON', 'AL', 'ET', 'ET', 'AL', 'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', '', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AN', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'NSM', 'NSM', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL'];\nfunction isOdd(i) {\n  return (i & 1) !== 0;\n}\nfunction isEven(i) {\n  return (i & 1) === 0;\n}\nfunction findUnequal(arr, start, value) {\n  for (var j = start, jj = arr.length; j < jj; ++j) {\n    if (arr[j] !== value) {\n      return j;\n    }\n  }\n  return j;\n}\nfunction setValues(arr, start, end, value) {\n  for (var j = start; j < end; ++j) {\n    arr[j] = value;\n  }\n}\nfunction reverseValues(arr, start, end) {\n  for (var i = start, j = end - 1; i < j; ++i, --j) {\n    var temp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = temp;\n  }\n}\nfunction createBidiText(str, isLTR, vertical) {\n  return {\n    str: str,\n    dir: vertical ? 'ttb' : isLTR ? 'ltr' : 'rtl'\n  };\n}\nvar chars = [];\nvar types = [];\nfunction bidi(str, startLevel, vertical) {\n  var isLTR = true;\n  var strLength = str.length;\n  if (strLength === 0 || vertical) {\n    return createBidiText(str, isLTR, vertical);\n  }\n  chars.length = strLength;\n  types.length = strLength;\n  var numBidi = 0;\n  var i, ii;\n  for (i = 0; i < strLength; ++i) {\n    chars[i] = str.charAt(i);\n    var charCode = str.charCodeAt(i);\n    var charType = 'L';\n    if (charCode <= 0x00ff) {\n      charType = baseTypes[charCode];\n    } else if (0x0590 <= charCode && charCode <= 0x05f4) {\n      charType = 'R';\n    } else if (0x0600 <= charCode && charCode <= 0x06ff) {\n      charType = arabicTypes[charCode & 0xff];\n      if (!charType) {\n        (0, _util.warn)('Bidi: invalid Unicode character ' + charCode.toString(16));\n      }\n    } else if (0x0700 <= charCode && charCode <= 0x08AC) {\n      charType = 'AL';\n    }\n    if (charType === 'R' || charType === 'AL' || charType === 'AN') {\n      numBidi++;\n    }\n    types[i] = charType;\n  }\n  if (numBidi === 0) {\n    isLTR = true;\n    return createBidiText(str, isLTR);\n  }\n  if (startLevel === -1) {\n    if (numBidi / strLength < 0.3) {\n      isLTR = true;\n      startLevel = 0;\n    } else {\n      isLTR = false;\n      startLevel = 1;\n    }\n  }\n  var levels = [];\n  for (i = 0; i < strLength; ++i) {\n    levels[i] = startLevel;\n  }\n  var e = isOdd(startLevel) ? 'R' : 'L';\n  var sor = e;\n  var eor = sor;\n  var lastType = sor;\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === 'NSM') {\n      types[i] = lastType;\n    } else {\n      lastType = types[i];\n    }\n  }\n  lastType = sor;\n  var t;\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (t === 'EN') {\n      types[i] = lastType === 'AL' ? 'AN' : 'EN';\n    } else if (t === 'R' || t === 'L' || t === 'AL') {\n      lastType = t;\n    }\n  }\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (t === 'AL') {\n      types[i] = 'R';\n    }\n  }\n  for (i = 1; i < strLength - 1; ++i) {\n    if (types[i] === 'ES' && types[i - 1] === 'EN' && types[i + 1] === 'EN') {\n      types[i] = 'EN';\n    }\n    if (types[i] === 'CS' && (types[i - 1] === 'EN' || types[i - 1] === 'AN') && types[i + 1] === types[i - 1]) {\n      types[i] = types[i - 1];\n    }\n  }\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === 'EN') {\n      var j;\n      for (j = i - 1; j >= 0; --j) {\n        if (types[j] !== 'ET') {\n          break;\n        }\n        types[j] = 'EN';\n      }\n      for (j = i + 1; j < strLength; ++j) {\n        if (types[j] !== 'ET') {\n          break;\n        }\n        types[j] = 'EN';\n      }\n    }\n  }\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (t === 'WS' || t === 'ES' || t === 'ET' || t === 'CS') {\n      types[i] = 'ON';\n    }\n  }\n  lastType = sor;\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (t === 'EN') {\n      types[i] = lastType === 'L' ? 'L' : 'EN';\n    } else if (t === 'R' || t === 'L') {\n      lastType = t;\n    }\n  }\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === 'ON') {\n      var end = findUnequal(types, i + 1, 'ON');\n      var before = sor;\n      if (i > 0) {\n        before = types[i - 1];\n      }\n      var after = eor;\n      if (end + 1 < strLength) {\n        after = types[end + 1];\n      }\n      if (before !== 'L') {\n        before = 'R';\n      }\n      if (after !== 'L') {\n        after = 'R';\n      }\n      if (before === after) {\n        setValues(types, i, end, before);\n      }\n      i = end - 1;\n    }\n  }\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === 'ON') {\n      types[i] = e;\n    }\n  }\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (isEven(levels[i])) {\n      if (t === 'R') {\n        levels[i] += 1;\n      } else if (t === 'AN' || t === 'EN') {\n        levels[i] += 2;\n      }\n    } else {\n      if (t === 'L' || t === 'AN' || t === 'EN') {\n        levels[i] += 1;\n      }\n    }\n  }\n  var highestLevel = -1;\n  var lowestOddLevel = 99;\n  var level;\n  for (i = 0, ii = levels.length; i < ii; ++i) {\n    level = levels[i];\n    if (highestLevel < level) {\n      highestLevel = level;\n    }\n    if (lowestOddLevel > level && isOdd(level)) {\n      lowestOddLevel = level;\n    }\n  }\n  for (level = highestLevel; level >= lowestOddLevel; --level) {\n    var start = -1;\n    for (i = 0, ii = levels.length; i < ii; ++i) {\n      if (levels[i] < level) {\n        if (start >= 0) {\n          reverseValues(chars, start, i);\n          start = -1;\n        }\n      } else if (start < 0) {\n        start = i;\n      }\n    }\n    if (start >= 0) {\n      reverseValues(chars, start, levels.length);\n    }\n  }\n  for (i = 0, ii = chars.length; i < ii; ++i) {\n    var ch = chars[i];\n    if (ch === '<' || ch === '>') {\n      chars[i] = '';\n    }\n  }\n  return createBidiText(chars.join(''), isLTR);\n}\nexports.bidi = bidi;\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar ISOAdobeCharset = ['.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron'];\nvar ExpertCharset = ['.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall'];\nvar ExpertSubsetCharset = ['.notdef', 'space', 'dollaroldstyle', 'dollarsuperior', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted', 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter', 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior'];\nexports.ISOAdobeCharset = ISOAdobeCharset;\nexports.ExpertCharset = ExpertCharset;\nexports.ExpertSubsetCharset = ExpertSubsetCharset;\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.CMapFactory = exports.IdentityCMap = exports.CMap = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _parser = __w_pdfjs_require__(5);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar BUILT_IN_CMAPS = ['Adobe-GB1-UCS2', 'Adobe-CNS1-UCS2', 'Adobe-Japan1-UCS2', 'Adobe-Korea1-UCS2', '78-EUC-H', '78-EUC-V', '78-H', '78-RKSJ-H', '78-RKSJ-V', '78-V', '78ms-RKSJ-H', '78ms-RKSJ-V', '83pv-RKSJ-H', '90ms-RKSJ-H', '90ms-RKSJ-V', '90msp-RKSJ-H', '90msp-RKSJ-V', '90pv-RKSJ-H', '90pv-RKSJ-V', 'Add-H', 'Add-RKSJ-H', 'Add-RKSJ-V', 'Add-V', 'Adobe-CNS1-0', 'Adobe-CNS1-1', 'Adobe-CNS1-2', 'Adobe-CNS1-3', 'Adobe-CNS1-4', 'Adobe-CNS1-5', 'Adobe-CNS1-6', 'Adobe-GB1-0', 'Adobe-GB1-1', 'Adobe-GB1-2', 'Adobe-GB1-3', 'Adobe-GB1-4', 'Adobe-GB1-5', 'Adobe-Japan1-0', 'Adobe-Japan1-1', 'Adobe-Japan1-2', 'Adobe-Japan1-3', 'Adobe-Japan1-4', 'Adobe-Japan1-5', 'Adobe-Japan1-6', 'Adobe-Korea1-0', 'Adobe-Korea1-1', 'Adobe-Korea1-2', 'B5-H', 'B5-V', 'B5pc-H', 'B5pc-V', 'CNS-EUC-H', 'CNS-EUC-V', 'CNS1-H', 'CNS1-V', 'CNS2-H', 'CNS2-V', 'ETHK-B5-H', 'ETHK-B5-V', 'ETen-B5-H', 'ETen-B5-V', 'ETenms-B5-H', 'ETenms-B5-V', 'EUC-H', 'EUC-V', 'Ext-H', 'Ext-RKSJ-H', 'Ext-RKSJ-V', 'Ext-V', 'GB-EUC-H', 'GB-EUC-V', 'GB-H', 'GB-V', 'GBK-EUC-H', 'GBK-EUC-V', 'GBK2K-H', 'GBK2K-V', 'GBKp-EUC-H', 'GBKp-EUC-V', 'GBT-EUC-H', 'GBT-EUC-V', 'GBT-H', 'GBT-V', 'GBTpc-EUC-H', 'GBTpc-EUC-V', 'GBpc-EUC-H', 'GBpc-EUC-V', 'H', 'HKdla-B5-H', 'HKdla-B5-V', 'HKdlb-B5-H', 'HKdlb-B5-V', 'HKgccs-B5-H', 'HKgccs-B5-V', 'HKm314-B5-H', 'HKm314-B5-V', 'HKm471-B5-H', 'HKm471-B5-V', 'HKscs-B5-H', 'HKscs-B5-V', 'Hankaku', 'Hiragana', 'KSC-EUC-H', 'KSC-EUC-V', 'KSC-H', 'KSC-Johab-H', 'KSC-Johab-V', 'KSC-V', 'KSCms-UHC-H', 'KSCms-UHC-HW-H', 'KSCms-UHC-HW-V', 'KSCms-UHC-V', 'KSCpc-EUC-H', 'KSCpc-EUC-V', 'Katakana', 'NWP-H', 'NWP-V', 'RKSJ-H', 'RKSJ-V', 'Roman', 'UniCNS-UCS2-H', 'UniCNS-UCS2-V', 'UniCNS-UTF16-H', 'UniCNS-UTF16-V', 'UniCNS-UTF32-H', 'UniCNS-UTF32-V', 'UniCNS-UTF8-H', 'UniCNS-UTF8-V', 'UniGB-UCS2-H', 'UniGB-UCS2-V', 'UniGB-UTF16-H', 'UniGB-UTF16-V', 'UniGB-UTF32-H', 'UniGB-UTF32-V', 'UniGB-UTF8-H', 'UniGB-UTF8-V', 'UniJIS-UCS2-H', 'UniJIS-UCS2-HW-H', 'UniJIS-UCS2-HW-V', 'UniJIS-UCS2-V', 'UniJIS-UTF16-H', 'UniJIS-UTF16-V', 'UniJIS-UTF32-H', 'UniJIS-UTF32-V', 'UniJIS-UTF8-H', 'UniJIS-UTF8-V', 'UniJIS2004-UTF16-H', 'UniJIS2004-UTF16-V', 'UniJIS2004-UTF32-H', 'UniJIS2004-UTF32-V', 'UniJIS2004-UTF8-H', 'UniJIS2004-UTF8-V', 'UniJISPro-UCS2-HW-V', 'UniJISPro-UCS2-V', 'UniJISPro-UTF8-V', 'UniJISX0213-UTF32-H', 'UniJISX0213-UTF32-V', 'UniJISX02132004-UTF32-H', 'UniJISX02132004-UTF32-V', 'UniKS-UCS2-H', 'UniKS-UCS2-V', 'UniKS-UTF16-H', 'UniKS-UTF16-V', 'UniKS-UTF32-H', 'UniKS-UTF32-V', 'UniKS-UTF8-H', 'UniKS-UTF8-V', 'V', 'WP-Symbol'];\nvar CMap = function CMapClosure() {\n  function CMap(builtInCMap) {\n    this.codespaceRanges = [[], [], [], []];\n    this.numCodespaceRanges = 0;\n    this._map = [];\n    this.name = '';\n    this.vertical = false;\n    this.useCMap = null;\n    this.builtInCMap = builtInCMap;\n  }\n  CMap.prototype = {\n    addCodespaceRange: function addCodespaceRange(n, low, high) {\n      this.codespaceRanges[n - 1].push(low, high);\n      this.numCodespaceRanges++;\n    },\n    mapCidRange: function mapCidRange(low, high, dstLow) {\n      while (low <= high) {\n        this._map[low++] = dstLow++;\n      }\n    },\n    mapBfRange: function mapBfRange(low, high, dstLow) {\n      var lastByte = dstLow.length - 1;\n      while (low <= high) {\n        this._map[low++] = dstLow;\n        dstLow = dstLow.substr(0, lastByte) + String.fromCharCode(dstLow.charCodeAt(lastByte) + 1);\n      }\n    },\n    mapBfRangeToArray: function mapBfRangeToArray(low, high, array) {\n      var i = 0,\n          ii = array.length;\n      while (low <= high && i < ii) {\n        this._map[low] = array[i++];\n        ++low;\n      }\n    },\n    mapOne: function mapOne(src, dst) {\n      this._map[src] = dst;\n    },\n    lookup: function lookup(code) {\n      return this._map[code];\n    },\n    contains: function contains(code) {\n      return this._map[code] !== undefined;\n    },\n    forEach: function forEach(callback) {\n      var map = this._map;\n      var length = map.length;\n      if (length <= 0x10000) {\n        for (var i = 0; i < length; i++) {\n          if (map[i] !== undefined) {\n            callback(i, map[i]);\n          }\n        }\n      } else {\n        for (var _i in map) {\n          callback(_i, map[_i]);\n        }\n      }\n    },\n    charCodeOf: function charCodeOf(value) {\n      var map = this._map;\n      if (map.length <= 0x10000) {\n        return map.indexOf(value);\n      }\n      for (var charCode in map) {\n        if (map[charCode] === value) {\n          return charCode | 0;\n        }\n      }\n      return -1;\n    },\n    getMap: function getMap() {\n      return this._map;\n    },\n    readCharCode: function readCharCode(str, offset, out) {\n      var c = 0;\n      var codespaceRanges = this.codespaceRanges;\n      var codespaceRangesLen = this.codespaceRanges.length;\n      for (var n = 0; n < codespaceRangesLen; n++) {\n        c = (c << 8 | str.charCodeAt(offset + n)) >>> 0;\n        var codespaceRange = codespaceRanges[n];\n        for (var k = 0, kk = codespaceRange.length; k < kk;) {\n          var low = codespaceRange[k++];\n          var high = codespaceRange[k++];\n          if (c >= low && c <= high) {\n            out.charcode = c;\n            out.length = n + 1;\n            return;\n          }\n        }\n      }\n      out.charcode = 0;\n      out.length = 1;\n    },\n\n    get length() {\n      return this._map.length;\n    },\n    get isIdentityCMap() {\n      if (!(this.name === 'Identity-H' || this.name === 'Identity-V')) {\n        return false;\n      }\n      if (this._map.length !== 0x10000) {\n        return false;\n      }\n      for (var i = 0; i < 0x10000; i++) {\n        if (this._map[i] !== i) {\n          return false;\n        }\n      }\n      return true;\n    }\n  };\n  return CMap;\n}();\nvar IdentityCMap = function IdentityCMapClosure() {\n  function IdentityCMap(vertical, n) {\n    CMap.call(this);\n    this.vertical = vertical;\n    this.addCodespaceRange(n, 0, 0xffff);\n  }\n  _util.Util.inherit(IdentityCMap, CMap, {});\n  IdentityCMap.prototype = {\n    addCodespaceRange: CMap.prototype.addCodespaceRange,\n    mapCidRange: function mapCidRange(low, high, dstLow) {\n      throw new Error('should not call mapCidRange');\n    },\n    mapBfRange: function mapBfRange(low, high, dstLow) {\n      throw new Error('should not call mapBfRange');\n    },\n    mapBfRangeToArray: function mapBfRangeToArray(low, high, array) {\n      throw new Error('should not call mapBfRangeToArray');\n    },\n    mapOne: function mapOne(src, dst) {\n      throw new Error('should not call mapCidOne');\n    },\n    lookup: function lookup(code) {\n      return (0, _util.isInt)(code) && code <= 0xffff ? code : undefined;\n    },\n    contains: function contains(code) {\n      return (0, _util.isInt)(code) && code <= 0xffff;\n    },\n    forEach: function forEach(callback) {\n      for (var i = 0; i <= 0xffff; i++) {\n        callback(i, i);\n      }\n    },\n    charCodeOf: function charCodeOf(value) {\n      return (0, _util.isInt)(value) && value <= 0xffff ? value : -1;\n    },\n    getMap: function getMap() {\n      var map = new Array(0x10000);\n      for (var i = 0; i <= 0xffff; i++) {\n        map[i] = i;\n      }\n      return map;\n    },\n\n    readCharCode: CMap.prototype.readCharCode,\n    get length() {\n      return 0x10000;\n    },\n    get isIdentityCMap() {\n      throw new Error('should not access .isIdentityCMap');\n    }\n  };\n  return IdentityCMap;\n}();\nvar BinaryCMapReader = function BinaryCMapReaderClosure() {\n  function hexToInt(a, size) {\n    var n = 0;\n    for (var i = 0; i <= size; i++) {\n      n = n << 8 | a[i];\n    }\n    return n >>> 0;\n  }\n  function hexToStr(a, size) {\n    if (size === 1) {\n      return String.fromCharCode(a[0], a[1]);\n    }\n    if (size === 3) {\n      return String.fromCharCode(a[0], a[1], a[2], a[3]);\n    }\n    return String.fromCharCode.apply(null, a.subarray(0, size + 1));\n  }\n  function addHex(a, b, size) {\n    var c = 0;\n    for (var i = size; i >= 0; i--) {\n      c += a[i] + b[i];\n      a[i] = c & 255;\n      c >>= 8;\n    }\n  }\n  function incHex(a, size) {\n    var c = 1;\n    for (var i = size; i >= 0 && c > 0; i--) {\n      c += a[i];\n      a[i] = c & 255;\n      c >>= 8;\n    }\n  }\n  var MAX_NUM_SIZE = 16;\n  var MAX_ENCODED_NUM_SIZE = 19;\n  function BinaryCMapStream(data) {\n    this.buffer = data;\n    this.pos = 0;\n    this.end = data.length;\n    this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE);\n  }\n  BinaryCMapStream.prototype = {\n    readByte: function readByte() {\n      if (this.pos >= this.end) {\n        return -1;\n      }\n      return this.buffer[this.pos++];\n    },\n    readNumber: function readNumber() {\n      var n = 0;\n      var last;\n      do {\n        var b = this.readByte();\n        if (b < 0) {\n          throw new _util.FormatError('unexpected EOF in bcmap');\n        }\n        last = !(b & 0x80);\n        n = n << 7 | b & 0x7F;\n      } while (!last);\n      return n;\n    },\n    readSigned: function readSigned() {\n      var n = this.readNumber();\n      return n & 1 ? ~(n >>> 1) : n >>> 1;\n    },\n    readHex: function readHex(num, size) {\n      num.set(this.buffer.subarray(this.pos, this.pos + size + 1));\n      this.pos += size + 1;\n    },\n    readHexNumber: function readHexNumber(num, size) {\n      var last;\n      var stack = this.tmpBuf,\n          sp = 0;\n      do {\n        var b = this.readByte();\n        if (b < 0) {\n          throw new _util.FormatError('unexpected EOF in bcmap');\n        }\n        last = !(b & 0x80);\n        stack[sp++] = b & 0x7F;\n      } while (!last);\n      var i = size,\n          buffer = 0,\n          bufferSize = 0;\n      while (i >= 0) {\n        while (bufferSize < 8 && stack.length > 0) {\n          buffer = stack[--sp] << bufferSize | buffer;\n          bufferSize += 7;\n        }\n        num[i] = buffer & 255;\n        i--;\n        buffer >>= 8;\n        bufferSize -= 8;\n      }\n    },\n    readHexSigned: function readHexSigned(num, size) {\n      this.readHexNumber(num, size);\n      var sign = num[size] & 1 ? 255 : 0;\n      var c = 0;\n      for (var i = 0; i <= size; i++) {\n        c = (c & 1) << 8 | num[i];\n        num[i] = c >> 1 ^ sign;\n      }\n    },\n    readString: function readString() {\n      var len = this.readNumber();\n      var s = '';\n      for (var i = 0; i < len; i++) {\n        s += String.fromCharCode(this.readNumber());\n      }\n      return s;\n    }\n  };\n  function processBinaryCMap(data, cMap, extend) {\n    return new Promise(function (resolve, reject) {\n      var stream = new BinaryCMapStream(data);\n      var header = stream.readByte();\n      cMap.vertical = !!(header & 1);\n      var useCMap = null;\n      var start = new Uint8Array(MAX_NUM_SIZE);\n      var end = new Uint8Array(MAX_NUM_SIZE);\n      var char = new Uint8Array(MAX_NUM_SIZE);\n      var charCode = new Uint8Array(MAX_NUM_SIZE);\n      var tmp = new Uint8Array(MAX_NUM_SIZE);\n      var code;\n      var b;\n      while ((b = stream.readByte()) >= 0) {\n        var type = b >> 5;\n        if (type === 7) {\n          switch (b & 0x1F) {\n            case 0:\n              stream.readString();\n              break;\n            case 1:\n              useCMap = stream.readString();\n              break;\n          }\n          continue;\n        }\n        var sequence = !!(b & 0x10);\n        var dataSize = b & 15;\n        if (dataSize + 1 > MAX_NUM_SIZE) {\n          throw new Error('processBinaryCMap: Invalid dataSize.');\n        }\n        var ucs2DataSize = 1;\n        var subitemsCount = stream.readNumber();\n        var i;\n        switch (type) {\n          case 0:\n            stream.readHex(start, dataSize);\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(end, dataSize);\n              stream.readHexNumber(start, dataSize);\n              addHex(start, end, dataSize);\n              stream.readHexNumber(end, dataSize);\n              addHex(end, start, dataSize);\n              cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));\n            }\n            break;\n          case 1:\n            stream.readHex(start, dataSize);\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            code = stream.readNumber();\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(end, dataSize);\n              stream.readHexNumber(start, dataSize);\n              addHex(start, end, dataSize);\n              stream.readHexNumber(end, dataSize);\n              addHex(end, start, dataSize);\n              code = stream.readNumber();\n            }\n            break;\n          case 2:\n            stream.readHex(char, dataSize);\n            code = stream.readNumber();\n            cMap.mapOne(hexToInt(char, dataSize), code);\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(char, dataSize);\n              if (!sequence) {\n                stream.readHexNumber(tmp, dataSize);\n                addHex(char, tmp, dataSize);\n              }\n              code = stream.readSigned() + (code + 1);\n              cMap.mapOne(hexToInt(char, dataSize), code);\n            }\n            break;\n          case 3:\n            stream.readHex(start, dataSize);\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            code = stream.readNumber();\n            cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(end, dataSize);\n              if (!sequence) {\n                stream.readHexNumber(start, dataSize);\n                addHex(start, end, dataSize);\n              } else {\n                start.set(end);\n              }\n              stream.readHexNumber(end, dataSize);\n              addHex(end, start, dataSize);\n              code = stream.readNumber();\n              cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);\n            }\n            break;\n          case 4:\n            stream.readHex(char, ucs2DataSize);\n            stream.readHex(charCode, dataSize);\n            cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(char, ucs2DataSize);\n              if (!sequence) {\n                stream.readHexNumber(tmp, ucs2DataSize);\n                addHex(char, tmp, ucs2DataSize);\n              }\n              incHex(charCode, dataSize);\n              stream.readHexSigned(tmp, dataSize);\n              addHex(charCode, tmp, dataSize);\n              cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));\n            }\n            break;\n          case 5:\n            stream.readHex(start, ucs2DataSize);\n            stream.readHexNumber(end, ucs2DataSize);\n            addHex(end, start, ucs2DataSize);\n            stream.readHex(charCode, dataSize);\n            cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize));\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(end, ucs2DataSize);\n              if (!sequence) {\n                stream.readHexNumber(start, ucs2DataSize);\n                addHex(start, end, ucs2DataSize);\n              } else {\n                start.set(end);\n              }\n              stream.readHexNumber(end, ucs2DataSize);\n              addHex(end, start, ucs2DataSize);\n              stream.readHex(charCode, dataSize);\n              cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize));\n            }\n            break;\n          default:\n            reject(new Error('processBinaryCMap: Unknown type: ' + type));\n            return;\n        }\n      }\n      if (useCMap) {\n        resolve(extend(useCMap));\n        return;\n      }\n      resolve(cMap);\n    });\n  }\n  function BinaryCMapReader() {}\n  BinaryCMapReader.prototype = { process: processBinaryCMap };\n  return BinaryCMapReader;\n}();\nvar CMapFactory = function CMapFactoryClosure() {\n  function strToInt(str) {\n    var a = 0;\n    for (var i = 0; i < str.length; i++) {\n      a = a << 8 | str.charCodeAt(i);\n    }\n    return a >>> 0;\n  }\n  function expectString(obj) {\n    if (!(0, _util.isString)(obj)) {\n      throw new _util.FormatError('Malformed CMap: expected string.');\n    }\n  }\n  function expectInt(obj) {\n    if (!(0, _util.isInt)(obj)) {\n      throw new _util.FormatError('Malformed CMap: expected int.');\n    }\n  }\n  function parseBfChar(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if ((0, _primitives.isEOF)(obj)) {\n        break;\n      }\n      if ((0, _primitives.isCmd)(obj, 'endbfchar')) {\n        return;\n      }\n      expectString(obj);\n      var src = strToInt(obj);\n      obj = lexer.getObj();\n      expectString(obj);\n      var dst = obj;\n      cMap.mapOne(src, dst);\n    }\n  }\n  function parseBfRange(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if ((0, _primitives.isEOF)(obj)) {\n        break;\n      }\n      if ((0, _primitives.isCmd)(obj, 'endbfrange')) {\n        return;\n      }\n      expectString(obj);\n      var low = strToInt(obj);\n      obj = lexer.getObj();\n      expectString(obj);\n      var high = strToInt(obj);\n      obj = lexer.getObj();\n      if ((0, _util.isInt)(obj) || (0, _util.isString)(obj)) {\n        var dstLow = (0, _util.isInt)(obj) ? String.fromCharCode(obj) : obj;\n        cMap.mapBfRange(low, high, dstLow);\n      } else if ((0, _primitives.isCmd)(obj, '[')) {\n        obj = lexer.getObj();\n        var array = [];\n        while (!(0, _primitives.isCmd)(obj, ']') && !(0, _primitives.isEOF)(obj)) {\n          array.push(obj);\n          obj = lexer.getObj();\n        }\n        cMap.mapBfRangeToArray(low, high, array);\n      } else {\n        break;\n      }\n    }\n    throw new _util.FormatError('Invalid bf range.');\n  }\n  function parseCidChar(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if ((0, _primitives.isEOF)(obj)) {\n        break;\n      }\n      if ((0, _primitives.isCmd)(obj, 'endcidchar')) {\n        return;\n      }\n      expectString(obj);\n      var src = strToInt(obj);\n      obj = lexer.getObj();\n      expectInt(obj);\n      var dst = obj;\n      cMap.mapOne(src, dst);\n    }\n  }\n  function parseCidRange(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if ((0, _primitives.isEOF)(obj)) {\n        break;\n      }\n      if ((0, _primitives.isCmd)(obj, 'endcidrange')) {\n        return;\n      }\n      expectString(obj);\n      var low = strToInt(obj);\n      obj = lexer.getObj();\n      expectString(obj);\n      var high = strToInt(obj);\n      obj = lexer.getObj();\n      expectInt(obj);\n      var dstLow = obj;\n      cMap.mapCidRange(low, high, dstLow);\n    }\n  }\n  function parseCodespaceRange(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if ((0, _primitives.isEOF)(obj)) {\n        break;\n      }\n      if ((0, _primitives.isCmd)(obj, 'endcodespacerange')) {\n        return;\n      }\n      if (!(0, _util.isString)(obj)) {\n        break;\n      }\n      var low = strToInt(obj);\n      obj = lexer.getObj();\n      if (!(0, _util.isString)(obj)) {\n        break;\n      }\n      var high = strToInt(obj);\n      cMap.addCodespaceRange(obj.length, low, high);\n    }\n    throw new _util.FormatError('Invalid codespace range.');\n  }\n  function parseWMode(cMap, lexer) {\n    var obj = lexer.getObj();\n    if ((0, _util.isInt)(obj)) {\n      cMap.vertical = !!obj;\n    }\n  }\n  function parseCMapName(cMap, lexer) {\n    var obj = lexer.getObj();\n    if ((0, _primitives.isName)(obj) && (0, _util.isString)(obj.name)) {\n      cMap.name = obj.name;\n    }\n  }\n  function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) {\n    var previous;\n    var embededUseCMap;\n    objLoop: while (true) {\n      try {\n        var obj = lexer.getObj();\n        if ((0, _primitives.isEOF)(obj)) {\n          break;\n        } else if ((0, _primitives.isName)(obj)) {\n          if (obj.name === 'WMode') {\n            parseWMode(cMap, lexer);\n          } else if (obj.name === 'CMapName') {\n            parseCMapName(cMap, lexer);\n          }\n          previous = obj;\n        } else if ((0, _primitives.isCmd)(obj)) {\n          switch (obj.cmd) {\n            case 'endcmap':\n              break objLoop;\n            case 'usecmap':\n              if ((0, _primitives.isName)(previous)) {\n                embededUseCMap = previous.name;\n              }\n              break;\n            case 'begincodespacerange':\n              parseCodespaceRange(cMap, lexer);\n              break;\n            case 'beginbfchar':\n              parseBfChar(cMap, lexer);\n              break;\n            case 'begincidchar':\n              parseCidChar(cMap, lexer);\n              break;\n            case 'beginbfrange':\n              parseBfRange(cMap, lexer);\n              break;\n            case 'begincidrange':\n              parseCidRange(cMap, lexer);\n              break;\n          }\n        }\n      } catch (ex) {\n        if (ex instanceof _util.MissingDataException) {\n          throw ex;\n        }\n        (0, _util.warn)('Invalid cMap data: ' + ex);\n        continue;\n      }\n    }\n    if (!useCMap && embededUseCMap) {\n      useCMap = embededUseCMap;\n    }\n    if (useCMap) {\n      return extendCMap(cMap, fetchBuiltInCMap, useCMap);\n    }\n    return Promise.resolve(cMap);\n  }\n  function extendCMap(cMap, fetchBuiltInCMap, useCMap) {\n    return createBuiltInCMap(useCMap, fetchBuiltInCMap).then(function (newCMap) {\n      cMap.useCMap = newCMap;\n      if (cMap.numCodespaceRanges === 0) {\n        var useCodespaceRanges = cMap.useCMap.codespaceRanges;\n        for (var i = 0; i < useCodespaceRanges.length; i++) {\n          cMap.codespaceRanges[i] = useCodespaceRanges[i].slice();\n        }\n        cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges;\n      }\n      cMap.useCMap.forEach(function (key, value) {\n        if (!cMap.contains(key)) {\n          cMap.mapOne(key, cMap.useCMap.lookup(key));\n        }\n      });\n      return cMap;\n    });\n  }\n  function createBuiltInCMap(name, fetchBuiltInCMap) {\n    if (name === 'Identity-H') {\n      return Promise.resolve(new IdentityCMap(false, 2));\n    } else if (name === 'Identity-V') {\n      return Promise.resolve(new IdentityCMap(true, 2));\n    }\n    if (BUILT_IN_CMAPS.indexOf(name) === -1) {\n      return Promise.reject(new Error('Unknown CMap name: ' + name));\n    }\n    if (!fetchBuiltInCMap) {\n      return Promise.reject(new Error('Built-in CMap parameters are not provided.'));\n    }\n    return fetchBuiltInCMap(name).then(function (data) {\n      var cMapData = data.cMapData,\n          compressionType = data.compressionType;\n      var cMap = new CMap(true);\n      if (compressionType === _util.CMapCompressionType.BINARY) {\n        return new BinaryCMapReader().process(cMapData, cMap, function (useCMap) {\n          return extendCMap(cMap, fetchBuiltInCMap, useCMap);\n        });\n      }\n      if (compressionType === _util.CMapCompressionType.NONE) {\n        var lexer = new _parser.Lexer(new _stream.Stream(cMapData));\n        return parseCMap(cMap, lexer, fetchBuiltInCMap, null);\n      }\n      return Promise.reject(new Error('TODO: Only BINARY/NONE CMap compression is currently supported.'));\n    });\n  }\n  return {\n    create: function create(params) {\n      var encoding = params.encoding;\n      var fetchBuiltInCMap = params.fetchBuiltInCMap;\n      var useCMap = params.useCMap;\n      if ((0, _primitives.isName)(encoding)) {\n        return createBuiltInCMap(encoding.name, fetchBuiltInCMap);\n      } else if ((0, _primitives.isStream)(encoding)) {\n        var cMap = new CMap();\n        var lexer = new _parser.Lexer(encoding);\n        return parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap).then(function (parsedCMap) {\n          if (parsedCMap.isIdentityCMap) {\n            return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap);\n          }\n          return parsedCMap;\n        });\n      }\n      return Promise.reject(new Error('Encoding required.'));\n    }\n  };\n}();\nexports.CMap = CMap;\nexports.IdentityCMap = IdentityCMap;\nexports.CMapFactory = CMapFactory;\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PDFDocument = exports.Page = undefined;\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _obj = __w_pdfjs_require__(15);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar _evaluator = __w_pdfjs_require__(13);\n\nvar _annotation = __w_pdfjs_require__(19);\n\nvar _crypto = __w_pdfjs_require__(12);\n\nvar _parser = __w_pdfjs_require__(5);\n\nvar Page = function PageClosure() {\n  var DEFAULT_USER_UNIT = 1.0;\n  var LETTER_SIZE_MEDIABOX = [0, 0, 612, 792];\n  function isAnnotationRenderable(annotation, intent) {\n    return intent === 'display' && annotation.viewable || intent === 'print' && annotation.printable;\n  }\n  function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache, builtInCMapCache) {\n    this.pdfManager = pdfManager;\n    this.pageIndex = pageIndex;\n    this.pageDict = pageDict;\n    this.xref = xref;\n    this.ref = ref;\n    this.fontCache = fontCache;\n    this.builtInCMapCache = builtInCMapCache;\n    this.evaluatorOptions = pdfManager.evaluatorOptions;\n    this.resourcesPromise = null;\n    var uniquePrefix = 'p' + this.pageIndex + '_';\n    var idCounters = { obj: 0 };\n    this.idFactory = {\n      createObjId: function createObjId() {\n        return uniquePrefix + ++idCounters.obj;\n      }\n    };\n  }\n  Page.prototype = {\n    getPageProp: function Page_getPageProp(key) {\n      return this.pageDict.get(key);\n    },\n    getInheritedPageProp: function Page_getInheritedPageProp(key, getArray) {\n      var dict = this.pageDict,\n          valueArray = null,\n          loopCount = 0;\n      var MAX_LOOP_COUNT = 100;\n      getArray = getArray || false;\n      while (dict) {\n        var value = getArray ? dict.getArray(key) : dict.get(key);\n        if (value !== undefined) {\n          if (!valueArray) {\n            valueArray = [];\n          }\n          valueArray.push(value);\n        }\n        if (++loopCount > MAX_LOOP_COUNT) {\n          (0, _util.warn)('getInheritedPageProp: maximum loop count exceeded for ' + key);\n          return valueArray ? valueArray[0] : undefined;\n        }\n        dict = dict.get('Parent');\n      }\n      if (!valueArray) {\n        return undefined;\n      }\n      if (valueArray.length === 1 || !(0, _primitives.isDict)(valueArray[0])) {\n        return valueArray[0];\n      }\n      return _primitives.Dict.merge(this.xref, valueArray);\n    },\n    get content() {\n      return this.getPageProp('Contents');\n    },\n    get resources() {\n      return (0, _util.shadow)(this, 'resources', this.getInheritedPageProp('Resources') || _primitives.Dict.empty);\n    },\n    get mediaBox() {\n      var mediaBox = this.getInheritedPageProp('MediaBox', true);\n      if (!(0, _util.isArray)(mediaBox) || mediaBox.length !== 4) {\n        return (0, _util.shadow)(this, 'mediaBox', LETTER_SIZE_MEDIABOX);\n      }\n      return (0, _util.shadow)(this, 'mediaBox', mediaBox);\n    },\n    get cropBox() {\n      var cropBox = this.getInheritedPageProp('CropBox', true);\n      if (!(0, _util.isArray)(cropBox) || cropBox.length !== 4) {\n        return (0, _util.shadow)(this, 'cropBox', this.mediaBox);\n      }\n      return (0, _util.shadow)(this, 'cropBox', cropBox);\n    },\n    get userUnit() {\n      var obj = this.getPageProp('UserUnit');\n      if (!(0, _util.isNum)(obj) || obj <= 0) {\n        obj = DEFAULT_USER_UNIT;\n      }\n      return (0, _util.shadow)(this, 'userUnit', obj);\n    },\n    get view() {\n      var mediaBox = this.mediaBox,\n          cropBox = this.cropBox;\n      if (mediaBox === cropBox) {\n        return (0, _util.shadow)(this, 'view', mediaBox);\n      }\n      var intersection = _util.Util.intersect(cropBox, mediaBox);\n      return (0, _util.shadow)(this, 'view', intersection || mediaBox);\n    },\n    get rotate() {\n      var rotate = this.getInheritedPageProp('Rotate') || 0;\n      if (rotate % 90 !== 0) {\n        rotate = 0;\n      } else if (rotate >= 360) {\n        rotate = rotate % 360;\n      } else if (rotate < 0) {\n        rotate = (rotate % 360 + 360) % 360;\n      }\n      return (0, _util.shadow)(this, 'rotate', rotate);\n    },\n    getContentStream: function Page_getContentStream() {\n      var content = this.content;\n      var stream;\n      if ((0, _util.isArray)(content)) {\n        var xref = this.xref;\n        var i,\n            n = content.length;\n        var streams = [];\n        for (i = 0; i < n; ++i) {\n          streams.push(xref.fetchIfRef(content[i]));\n        }\n        stream = new _stream.StreamsSequenceStream(streams);\n      } else if ((0, _primitives.isStream)(content)) {\n        stream = content;\n      } else {\n        stream = new _stream.NullStream();\n      }\n      return stream;\n    },\n    loadResources: function Page_loadResources(keys) {\n      var _this = this;\n\n      if (!this.resourcesPromise) {\n        this.resourcesPromise = this.pdfManager.ensure(this, 'resources');\n      }\n      return this.resourcesPromise.then(function () {\n        var objectLoader = new _obj.ObjectLoader(_this.resources, keys, _this.xref);\n        return objectLoader.load();\n      });\n    },\n    getOperatorList: function getOperatorList(_ref) {\n      var _this2 = this;\n\n      var handler = _ref.handler,\n          task = _ref.task,\n          intent = _ref.intent,\n          renderInteractiveForms = _ref.renderInteractiveForms;\n\n      var contentStreamPromise = this.pdfManager.ensure(this, 'getContentStream');\n      var resourcesPromise = this.loadResources(['ExtGState', 'ColorSpace', 'Pattern', 'Shading', 'XObject', 'Font']);\n      var partialEvaluator = new _evaluator.PartialEvaluator({\n        pdfManager: this.pdfManager,\n        xref: this.xref,\n        handler: handler,\n        pageIndex: this.pageIndex,\n        idFactory: this.idFactory,\n        fontCache: this.fontCache,\n        builtInCMapCache: this.builtInCMapCache,\n        options: this.evaluatorOptions\n      });\n      var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);\n      var pageListPromise = dataPromises.then(function (_ref2) {\n        var _ref3 = _slicedToArray(_ref2, 1),\n            contentStream = _ref3[0];\n\n        var opList = new _evaluator.OperatorList(intent, handler, _this2.pageIndex);\n        handler.send('StartRenderPage', {\n          transparency: partialEvaluator.hasBlendModes(_this2.resources),\n          pageIndex: _this2.pageIndex,\n          intent: intent\n        });\n        return partialEvaluator.getOperatorList({\n          stream: contentStream,\n          task: task,\n          resources: _this2.resources,\n          operatorList: opList\n        }).then(function () {\n          return opList;\n        });\n      });\n      var annotationsPromise = this.pdfManager.ensure(this, 'annotations');\n      return Promise.all([pageListPromise, annotationsPromise]).then(function (_ref4) {\n        var _ref5 = _slicedToArray(_ref4, 2),\n            pageOpList = _ref5[0],\n            annotations = _ref5[1];\n\n        if (annotations.length === 0) {\n          pageOpList.flush(true);\n          return pageOpList;\n        }\n        var i,\n            ii,\n            opListPromises = [];\n        for (i = 0, ii = annotations.length; i < ii; i++) {\n          if (isAnnotationRenderable(annotations[i], intent)) {\n            opListPromises.push(annotations[i].getOperatorList(partialEvaluator, task, renderInteractiveForms));\n          }\n        }\n        return Promise.all(opListPromises).then(function (opLists) {\n          pageOpList.addOp(_util.OPS.beginAnnotations, []);\n          for (i = 0, ii = opLists.length; i < ii; i++) {\n            pageOpList.addOpList(opLists[i]);\n          }\n          pageOpList.addOp(_util.OPS.endAnnotations, []);\n          pageOpList.flush(true);\n          return pageOpList;\n        });\n      });\n    },\n    extractTextContent: function extractTextContent(_ref6) {\n      var _this3 = this;\n\n      var handler = _ref6.handler,\n          task = _ref6.task,\n          normalizeWhitespace = _ref6.normalizeWhitespace,\n          sink = _ref6.sink,\n          combineTextItems = _ref6.combineTextItems;\n\n      var contentStreamPromise = this.pdfManager.ensure(this, 'getContentStream');\n      var resourcesPromise = this.loadResources(['ExtGState', 'XObject', 'Font']);\n      var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);\n      return dataPromises.then(function (_ref7) {\n        var _ref8 = _slicedToArray(_ref7, 1),\n            contentStream = _ref8[0];\n\n        var partialEvaluator = new _evaluator.PartialEvaluator({\n          pdfManager: _this3.pdfManager,\n          xref: _this3.xref,\n          handler: handler,\n          pageIndex: _this3.pageIndex,\n          idFactory: _this3.idFactory,\n          fontCache: _this3.fontCache,\n          builtInCMapCache: _this3.builtInCMapCache,\n          options: _this3.evaluatorOptions\n        });\n        return partialEvaluator.getTextContent({\n          stream: contentStream,\n          task: task,\n          resources: _this3.resources,\n          normalizeWhitespace: normalizeWhitespace,\n          combineTextItems: combineTextItems,\n          sink: sink\n        });\n      });\n    },\n\n    getAnnotationsData: function Page_getAnnotationsData(intent) {\n      var annotations = this.annotations;\n      var annotationsData = [];\n      for (var i = 0, n = annotations.length; i < n; ++i) {\n        if (!intent || isAnnotationRenderable(annotations[i], intent)) {\n          annotationsData.push(annotations[i].data);\n        }\n      }\n      return annotationsData;\n    },\n    get annotations() {\n      var annotations = [];\n      var annotationRefs = this.getInheritedPageProp('Annots') || [];\n      var annotationFactory = new _annotation.AnnotationFactory();\n      for (var i = 0, n = annotationRefs.length; i < n; ++i) {\n        var annotationRef = annotationRefs[i];\n        var annotation = annotationFactory.create(this.xref, annotationRef, this.pdfManager, this.idFactory);\n        if (annotation) {\n          annotations.push(annotation);\n        }\n      }\n      return (0, _util.shadow)(this, 'annotations', annotations);\n    }\n  };\n  return Page;\n}();\nvar PDFDocument = function PDFDocumentClosure() {\n  var FINGERPRINT_FIRST_BYTES = 1024;\n  var EMPTY_FINGERPRINT = '\\x00\\x00\\x00\\x00\\x00\\x00\\x00' + '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00';\n  function PDFDocument(pdfManager, arg) {\n    var stream;\n    if ((0, _primitives.isStream)(arg)) {\n      stream = arg;\n    } else if ((0, _util.isArrayBuffer)(arg)) {\n      stream = new _stream.Stream(arg);\n    } else {\n      throw new Error('PDFDocument: Unknown argument type');\n    }\n    if (stream.length <= 0) {\n      throw new Error('PDFDocument: stream must have data');\n    }\n    this.pdfManager = pdfManager;\n    this.stream = stream;\n    this.xref = new _obj.XRef(stream, pdfManager);\n  }\n  function find(stream, needle, limit, backwards) {\n    var pos = stream.pos;\n    var end = stream.end;\n    var strBuf = [];\n    if (pos + limit > end) {\n      limit = end - pos;\n    }\n    for (var n = 0; n < limit; ++n) {\n      strBuf.push(String.fromCharCode(stream.getByte()));\n    }\n    var str = strBuf.join('');\n    stream.pos = pos;\n    var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);\n    if (index === -1) {\n      return false;\n    }\n    stream.pos += index;\n    return true;\n  }\n  var DocumentInfoValidators = {\n    get entries() {\n      return (0, _util.shadow)(this, 'entries', {\n        Title: _util.isString,\n        Author: _util.isString,\n        Subject: _util.isString,\n        Keywords: _util.isString,\n        Creator: _util.isString,\n        Producer: _util.isString,\n        CreationDate: _util.isString,\n        ModDate: _util.isString,\n        Trapped: _primitives.isName\n      });\n    }\n  };\n  PDFDocument.prototype = {\n    parse: function PDFDocument_parse(recoveryMode) {\n      this.setup(recoveryMode);\n      var version = this.catalog.catDict.get('Version');\n      if ((0, _primitives.isName)(version)) {\n        this.pdfFormatVersion = version.name;\n      }\n      try {\n        this.acroForm = this.catalog.catDict.get('AcroForm');\n        if (this.acroForm) {\n          this.xfa = this.acroForm.get('XFA');\n          var fields = this.acroForm.get('Fields');\n          if ((!fields || !(0, _util.isArray)(fields) || fields.length === 0) && !this.xfa) {\n            this.acroForm = null;\n          }\n        }\n      } catch (ex) {\n        if (ex instanceof _util.MissingDataException) {\n          throw ex;\n        }\n        (0, _util.info)('Something wrong with AcroForm entry');\n        this.acroForm = null;\n      }\n    },\n    get linearization() {\n      var linearization = null;\n      if (this.stream.length) {\n        try {\n          linearization = _parser.Linearization.create(this.stream);\n        } catch (err) {\n          if (err instanceof _util.MissingDataException) {\n            throw err;\n          }\n          (0, _util.info)(err);\n        }\n      }\n      return (0, _util.shadow)(this, 'linearization', linearization);\n    },\n    get startXRef() {\n      var stream = this.stream;\n      var startXRef = 0;\n      var linearization = this.linearization;\n      if (linearization) {\n        stream.reset();\n        if (find(stream, 'endobj', 1024)) {\n          startXRef = stream.pos + 6;\n        }\n      } else {\n        var step = 1024;\n        var found = false,\n            pos = stream.end;\n        while (!found && pos > 0) {\n          pos -= step - 'startxref'.length;\n          if (pos < 0) {\n            pos = 0;\n          }\n          stream.pos = pos;\n          found = find(stream, 'startxref', step, true);\n        }\n        if (found) {\n          stream.skip(9);\n          var ch;\n          do {\n            ch = stream.getByte();\n          } while ((0, _util.isSpace)(ch));\n          var str = '';\n          while (ch >= 0x20 && ch <= 0x39) {\n            str += String.fromCharCode(ch);\n            ch = stream.getByte();\n          }\n          startXRef = parseInt(str, 10);\n          if (isNaN(startXRef)) {\n            startXRef = 0;\n          }\n        }\n      }\n      return (0, _util.shadow)(this, 'startXRef', startXRef);\n    },\n    get mainXRefEntriesOffset() {\n      var mainXRefEntriesOffset = 0;\n      var linearization = this.linearization;\n      if (linearization) {\n        mainXRefEntriesOffset = linearization.mainXRefEntriesOffset;\n      }\n      return (0, _util.shadow)(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset);\n    },\n    checkHeader: function PDFDocument_checkHeader() {\n      var stream = this.stream;\n      stream.reset();\n      if (find(stream, '%PDF-', 1024)) {\n        stream.moveStart();\n        var MAX_VERSION_LENGTH = 12;\n        var version = '',\n            ch;\n        while ((ch = stream.getByte()) > 0x20) {\n          if (version.length >= MAX_VERSION_LENGTH) {\n            break;\n          }\n          version += String.fromCharCode(ch);\n        }\n        if (!this.pdfFormatVersion) {\n          this.pdfFormatVersion = version.substring(5);\n        }\n        return;\n      }\n    },\n    parseStartXRef: function PDFDocument_parseStartXRef() {\n      var startXRef = this.startXRef;\n      this.xref.setStartXRef(startXRef);\n    },\n    setup: function PDFDocument_setup(recoveryMode) {\n      var _this4 = this;\n\n      this.xref.parse(recoveryMode);\n      var pageFactory = {\n        createPage: function createPage(pageIndex, dict, ref, fontCache, builtInCMapCache) {\n          return new Page(_this4.pdfManager, _this4.xref, pageIndex, dict, ref, fontCache, builtInCMapCache);\n        }\n      };\n      this.catalog = new _obj.Catalog(this.pdfManager, this.xref, pageFactory);\n    },\n    get numPages() {\n      var linearization = this.linearization;\n      var num = linearization ? linearization.numPages : this.catalog.numPages;\n      return (0, _util.shadow)(this, 'numPages', num);\n    },\n    get documentInfo() {\n      var docInfo = {\n        PDFFormatVersion: this.pdfFormatVersion,\n        IsAcroFormPresent: !!this.acroForm,\n        IsXFAPresent: !!this.xfa\n      };\n      var infoDict;\n      try {\n        infoDict = this.xref.trailer.get('Info');\n      } catch (err) {\n        if (err instanceof _util.MissingDataException) {\n          throw err;\n        }\n        (0, _util.info)('The document information dictionary is invalid.');\n      }\n      if (infoDict) {\n        var validEntries = DocumentInfoValidators.entries;\n        for (var key in validEntries) {\n          if (infoDict.has(key)) {\n            var value = infoDict.get(key);\n            if (validEntries[key](value)) {\n              docInfo[key] = typeof value !== 'string' ? value : (0, _util.stringToPDFString)(value);\n            } else {\n              (0, _util.info)('Bad value in document info for \"' + key + '\"');\n            }\n          }\n        }\n      }\n      return (0, _util.shadow)(this, 'documentInfo', docInfo);\n    },\n    get fingerprint() {\n      var xref = this.xref,\n          hash,\n          fileID = '';\n      var idArray = xref.trailer.get('ID');\n      if (idArray && (0, _util.isArray)(idArray) && idArray[0] && (0, _util.isString)(idArray[0]) && idArray[0] !== EMPTY_FINGERPRINT) {\n        hash = (0, _util.stringToBytes)(idArray[0]);\n      } else {\n        if (this.stream.ensureRange) {\n          this.stream.ensureRange(0, Math.min(FINGERPRINT_FIRST_BYTES, this.stream.end));\n        }\n        hash = (0, _crypto.calculateMD5)(this.stream.bytes.subarray(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES);\n      }\n      for (var i = 0, n = hash.length; i < n; i++) {\n        var hex = hash[i].toString(16);\n        fileID += hex.length === 1 ? '0' + hex : hex;\n      }\n      return (0, _util.shadow)(this, 'fingerprint', fileID);\n    },\n    getPage: function PDFDocument_getPage(pageIndex) {\n      return this.catalog.getPage(pageIndex);\n    },\n    cleanup: function PDFDocument_cleanup() {\n      return this.catalog.cleanup();\n    }\n  };\n  return PDFDocument;\n}();\nexports.Page = Page;\nexports.PDFDocument = PDFDocument;\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.FontRendererFactory = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _cff_parser = __w_pdfjs_require__(10);\n\nvar _glyphlist = __w_pdfjs_require__(6);\n\nvar _encodings = __w_pdfjs_require__(4);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar FontRendererFactory = function FontRendererFactoryClosure() {\n  function getLong(data, offset) {\n    return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];\n  }\n  function getUshort(data, offset) {\n    return data[offset] << 8 | data[offset + 1];\n  }\n  function parseCmap(data, start, end) {\n    var offset = getUshort(data, start + 2) === 1 ? getLong(data, start + 8) : getLong(data, start + 16);\n    var format = getUshort(data, start + offset);\n    var ranges, p, i;\n    if (format === 4) {\n      getUshort(data, start + offset + 2);\n      var segCount = getUshort(data, start + offset + 6) >> 1;\n      p = start + offset + 14;\n      ranges = [];\n      for (i = 0; i < segCount; i++, p += 2) {\n        ranges[i] = { end: getUshort(data, p) };\n      }\n      p += 2;\n      for (i = 0; i < segCount; i++, p += 2) {\n        ranges[i].start = getUshort(data, p);\n      }\n      for (i = 0; i < segCount; i++, p += 2) {\n        ranges[i].idDelta = getUshort(data, p);\n      }\n      for (i = 0; i < segCount; i++, p += 2) {\n        var idOffset = getUshort(data, p);\n        if (idOffset === 0) {\n          continue;\n        }\n        ranges[i].ids = [];\n        for (var j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) {\n          ranges[i].ids[j] = getUshort(data, p + idOffset);\n          idOffset += 2;\n        }\n      }\n      return ranges;\n    } else if (format === 12) {\n      getLong(data, start + offset + 4);\n      var groups = getLong(data, start + offset + 12);\n      p = start + offset + 16;\n      ranges = [];\n      for (i = 0; i < groups; i++) {\n        ranges.push({\n          start: getLong(data, p),\n          end: getLong(data, p + 4),\n          idDelta: getLong(data, p + 8) - getLong(data, p)\n        });\n        p += 12;\n      }\n      return ranges;\n    }\n    throw new _util.FormatError('unsupported cmap: ' + format);\n  }\n  function parseCff(data, start, end, seacAnalysisEnabled) {\n    var properties = {};\n    var parser = new _cff_parser.CFFParser(new _stream.Stream(data, start, end - start), properties, seacAnalysisEnabled);\n    var cff = parser.parse();\n    return {\n      glyphs: cff.charStrings.objects,\n      subrs: cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex && cff.topDict.privateDict.subrsIndex.objects,\n      gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects\n    };\n  }\n  function parseGlyfTable(glyf, loca, isGlyphLocationsLong) {\n    var itemSize, itemDecode;\n    if (isGlyphLocationsLong) {\n      itemSize = 4;\n      itemDecode = function fontItemDecodeLong(data, offset) {\n        return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];\n      };\n    } else {\n      itemSize = 2;\n      itemDecode = function fontItemDecode(data, offset) {\n        return data[offset] << 9 | data[offset + 1] << 1;\n      };\n    }\n    var glyphs = [];\n    var startOffset = itemDecode(loca, 0);\n    for (var j = itemSize; j < loca.length; j += itemSize) {\n      var endOffset = itemDecode(loca, j);\n      glyphs.push(glyf.subarray(startOffset, endOffset));\n      startOffset = endOffset;\n    }\n    return glyphs;\n  }\n  function lookupCmap(ranges, unicode) {\n    var code = unicode.charCodeAt(0),\n        gid = 0;\n    var l = 0,\n        r = ranges.length - 1;\n    while (l < r) {\n      var c = l + r + 1 >> 1;\n      if (code < ranges[c].start) {\n        r = c - 1;\n      } else {\n        l = c;\n      }\n    }\n    if (ranges[l].start <= code && code <= ranges[l].end) {\n      gid = ranges[l].idDelta + (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code) & 0xFFFF;\n    }\n    return {\n      charCode: code,\n      glyphId: gid\n    };\n  }\n  function compileGlyf(code, cmds, font) {\n    function moveTo(x, y) {\n      cmds.push({\n        cmd: 'moveTo',\n        args: [x, y]\n      });\n    }\n    function lineTo(x, y) {\n      cmds.push({\n        cmd: 'lineTo',\n        args: [x, y]\n      });\n    }\n    function quadraticCurveTo(xa, ya, x, y) {\n      cmds.push({\n        cmd: 'quadraticCurveTo',\n        args: [xa, ya, x, y]\n      });\n    }\n    var i = 0;\n    var numberOfContours = (code[i] << 24 | code[i + 1] << 16) >> 16;\n    var flags;\n    var x = 0,\n        y = 0;\n    i += 10;\n    if (numberOfContours < 0) {\n      do {\n        flags = code[i] << 8 | code[i + 1];\n        var glyphIndex = code[i + 2] << 8 | code[i + 3];\n        i += 4;\n        var arg1, arg2;\n        if (flags & 0x01) {\n          arg1 = (code[i] << 24 | code[i + 1] << 16) >> 16;\n          arg2 = (code[i + 2] << 24 | code[i + 3] << 16) >> 16;\n          i += 4;\n        } else {\n          arg1 = code[i++];\n          arg2 = code[i++];\n        }\n        if (flags & 0x02) {\n          x = arg1;\n          y = arg2;\n        } else {\n          x = 0;\n          y = 0;\n        }\n        var scaleX = 1,\n            scaleY = 1,\n            scale01 = 0,\n            scale10 = 0;\n        if (flags & 0x08) {\n          scaleX = scaleY = (code[i] << 24 | code[i + 1] << 16) / 1073741824;\n          i += 2;\n        } else if (flags & 0x40) {\n          scaleX = (code[i] << 24 | code[i + 1] << 16) / 1073741824;\n          scaleY = (code[i + 2] << 24 | code[i + 3] << 16) / 1073741824;\n          i += 4;\n        } else if (flags & 0x80) {\n          scaleX = (code[i] << 24 | code[i + 1] << 16) / 1073741824;\n          scale01 = (code[i + 2] << 24 | code[i + 3] << 16) / 1073741824;\n          scale10 = (code[i + 4] << 24 | code[i + 5] << 16) / 1073741824;\n          scaleY = (code[i + 6] << 24 | code[i + 7] << 16) / 1073741824;\n          i += 8;\n        }\n        var subglyph = font.glyphs[glyphIndex];\n        if (subglyph) {\n          cmds.push({ cmd: 'save' });\n          cmds.push({\n            cmd: 'transform',\n            args: [scaleX, scale01, scale10, scaleY, x, y]\n          });\n          compileGlyf(subglyph, cmds, font);\n          cmds.push({ cmd: 'restore' });\n        }\n      } while (flags & 0x20);\n    } else {\n      var endPtsOfContours = [];\n      var j, jj;\n      for (j = 0; j < numberOfContours; j++) {\n        endPtsOfContours.push(code[i] << 8 | code[i + 1]);\n        i += 2;\n      }\n      var instructionLength = code[i] << 8 | code[i + 1];\n      i += 2 + instructionLength;\n      var numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1;\n      var points = [];\n      while (points.length < numberOfPoints) {\n        flags = code[i++];\n        var repeat = 1;\n        if (flags & 0x08) {\n          repeat += code[i++];\n        }\n        while (repeat-- > 0) {\n          points.push({ flags: flags });\n        }\n      }\n      for (j = 0; j < numberOfPoints; j++) {\n        switch (points[j].flags & 0x12) {\n          case 0x00:\n            x += (code[i] << 24 | code[i + 1] << 16) >> 16;\n            i += 2;\n            break;\n          case 0x02:\n            x -= code[i++];\n            break;\n          case 0x12:\n            x += code[i++];\n            break;\n        }\n        points[j].x = x;\n      }\n      for (j = 0; j < numberOfPoints; j++) {\n        switch (points[j].flags & 0x24) {\n          case 0x00:\n            y += (code[i] << 24 | code[i + 1] << 16) >> 16;\n            i += 2;\n            break;\n          case 0x04:\n            y -= code[i++];\n            break;\n          case 0x24:\n            y += code[i++];\n            break;\n        }\n        points[j].y = y;\n      }\n      var startPoint = 0;\n      for (i = 0; i < numberOfContours; i++) {\n        var endPoint = endPtsOfContours[i];\n        var contour = points.slice(startPoint, endPoint + 1);\n        if (contour[0].flags & 1) {\n          contour.push(contour[0]);\n        } else if (contour[contour.length - 1].flags & 1) {\n          contour.unshift(contour[contour.length - 1]);\n        } else {\n          var p = {\n            flags: 1,\n            x: (contour[0].x + contour[contour.length - 1].x) / 2,\n            y: (contour[0].y + contour[contour.length - 1].y) / 2\n          };\n          contour.unshift(p);\n          contour.push(p);\n        }\n        moveTo(contour[0].x, contour[0].y);\n        for (j = 1, jj = contour.length; j < jj; j++) {\n          if (contour[j].flags & 1) {\n            lineTo(contour[j].x, contour[j].y);\n          } else if (contour[j + 1].flags & 1) {\n            quadraticCurveTo(contour[j].x, contour[j].y, contour[j + 1].x, contour[j + 1].y);\n            j++;\n          } else {\n            quadraticCurveTo(contour[j].x, contour[j].y, (contour[j].x + contour[j + 1].x) / 2, (contour[j].y + contour[j + 1].y) / 2);\n          }\n        }\n        startPoint = endPoint + 1;\n      }\n    }\n  }\n  function compileCharString(code, cmds, font) {\n    var stack = [];\n    var x = 0,\n        y = 0;\n    var stems = 0;\n    function moveTo(x, y) {\n      cmds.push({\n        cmd: 'moveTo',\n        args: [x, y]\n      });\n    }\n    function lineTo(x, y) {\n      cmds.push({\n        cmd: 'lineTo',\n        args: [x, y]\n      });\n    }\n    function bezierCurveTo(x1, y1, x2, y2, x, y) {\n      cmds.push({\n        cmd: 'bezierCurveTo',\n        args: [x1, y1, x2, y2, x, y]\n      });\n    }\n    function parse(code) {\n      var i = 0;\n      while (i < code.length) {\n        var stackClean = false;\n        var v = code[i++];\n        var xa, xb, ya, yb, y1, y2, y3, n, subrCode;\n        switch (v) {\n          case 1:\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n          case 3:\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n          case 4:\n            y += stack.pop();\n            moveTo(x, y);\n            stackClean = true;\n            break;\n          case 5:\n            while (stack.length > 0) {\n              x += stack.shift();\n              y += stack.shift();\n              lineTo(x, y);\n            }\n            break;\n          case 6:\n            while (stack.length > 0) {\n              x += stack.shift();\n              lineTo(x, y);\n              if (stack.length === 0) {\n                break;\n              }\n              y += stack.shift();\n              lineTo(x, y);\n            }\n            break;\n          case 7:\n            while (stack.length > 0) {\n              y += stack.shift();\n              lineTo(x, y);\n              if (stack.length === 0) {\n                break;\n              }\n              x += stack.shift();\n              lineTo(x, y);\n            }\n            break;\n          case 8:\n            while (stack.length > 0) {\n              xa = x + stack.shift();\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          case 10:\n            n = stack.pop() + font.subrsBias;\n            subrCode = font.subrs[n];\n            if (subrCode) {\n              parse(subrCode);\n            }\n            break;\n          case 11:\n            return;\n          case 12:\n            v = code[i++];\n            switch (v) {\n              case 34:\n                xa = x + stack.shift();\n                xb = xa + stack.shift();\n                y1 = y + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y, xb, y1, x, y1);\n                xa = x + stack.shift();\n                xb = xa + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y1, xb, y, x, y);\n                break;\n              case 35:\n                xa = x + stack.shift();\n                ya = y + stack.shift();\n                xb = xa + stack.shift();\n                yb = ya + stack.shift();\n                x = xb + stack.shift();\n                y = yb + stack.shift();\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                xa = x + stack.shift();\n                ya = y + stack.shift();\n                xb = xa + stack.shift();\n                yb = ya + stack.shift();\n                x = xb + stack.shift();\n                y = yb + stack.shift();\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                stack.pop();\n                break;\n              case 36:\n                xa = x + stack.shift();\n                y1 = y + stack.shift();\n                xb = xa + stack.shift();\n                y2 = y1 + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y1, xb, y2, x, y2);\n                xa = x + stack.shift();\n                xb = xa + stack.shift();\n                y3 = y2 + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y2, xb, y3, x, y);\n                break;\n              case 37:\n                var x0 = x,\n                    y0 = y;\n                xa = x + stack.shift();\n                ya = y + stack.shift();\n                xb = xa + stack.shift();\n                yb = ya + stack.shift();\n                x = xb + stack.shift();\n                y = yb + stack.shift();\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                xa = x + stack.shift();\n                ya = y + stack.shift();\n                xb = xa + stack.shift();\n                yb = ya + stack.shift();\n                x = xb;\n                y = yb;\n                if (Math.abs(x - x0) > Math.abs(y - y0)) {\n                  x += stack.shift();\n                } else {\n                  y += stack.shift();\n                }\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                break;\n              default:\n                throw new _util.FormatError('unknown operator: 12 ' + v);\n            }\n            break;\n          case 14:\n            if (stack.length >= 4) {\n              var achar = stack.pop();\n              var bchar = stack.pop();\n              y = stack.pop();\n              x = stack.pop();\n              cmds.push({ cmd: 'save' });\n              cmds.push({\n                cmd: 'translate',\n                args: [x, y]\n              });\n              var cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[_encodings.StandardEncoding[achar]]));\n              compileCharString(font.glyphs[cmap.glyphId], cmds, font);\n              cmds.push({ cmd: 'restore' });\n              cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[_encodings.StandardEncoding[bchar]]));\n              compileCharString(font.glyphs[cmap.glyphId], cmds, font);\n            }\n            return;\n          case 18:\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n          case 19:\n            stems += stack.length >> 1;\n            i += stems + 7 >> 3;\n            stackClean = true;\n            break;\n          case 20:\n            stems += stack.length >> 1;\n            i += stems + 7 >> 3;\n            stackClean = true;\n            break;\n          case 21:\n            y += stack.pop();\n            x += stack.pop();\n            moveTo(x, y);\n            stackClean = true;\n            break;\n          case 22:\n            x += stack.pop();\n            moveTo(x, y);\n            stackClean = true;\n            break;\n          case 23:\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n          case 24:\n            while (stack.length > 2) {\n              xa = x + stack.shift();\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            x += stack.shift();\n            y += stack.shift();\n            lineTo(x, y);\n            break;\n          case 25:\n            while (stack.length > 6) {\n              x += stack.shift();\n              y += stack.shift();\n              lineTo(x, y);\n            }\n            xa = x + stack.shift();\n            ya = y + stack.shift();\n            xb = xa + stack.shift();\n            yb = ya + stack.shift();\n            x = xb + stack.shift();\n            y = yb + stack.shift();\n            bezierCurveTo(xa, ya, xb, yb, x, y);\n            break;\n          case 26:\n            if (stack.length % 2) {\n              x += stack.shift();\n            }\n            while (stack.length > 0) {\n              xa = x;\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb;\n              y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          case 27:\n            if (stack.length % 2) {\n              y += stack.shift();\n            }\n            while (stack.length > 0) {\n              xa = x + stack.shift();\n              ya = y;\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb;\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          case 28:\n            stack.push((code[i] << 24 | code[i + 1] << 16) >> 16);\n            i += 2;\n            break;\n          case 29:\n            n = stack.pop() + font.gsubrsBias;\n            subrCode = font.gsubrs[n];\n            if (subrCode) {\n              parse(subrCode);\n            }\n            break;\n          case 30:\n            while (stack.length > 0) {\n              xa = x;\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n              if (stack.length === 0) {\n                break;\n              }\n              xa = x + stack.shift();\n              ya = y;\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              y = yb + stack.shift();\n              x = xb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          case 31:\n            while (stack.length > 0) {\n              xa = x + stack.shift();\n              ya = y;\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              y = yb + stack.shift();\n              x = xb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n              if (stack.length === 0) {\n                break;\n              }\n              xa = x;\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          default:\n            if (v < 32) {\n              throw new _util.FormatError('unknown operator: ' + v);\n            }\n            if (v < 247) {\n              stack.push(v - 139);\n            } else if (v < 251) {\n              stack.push((v - 247) * 256 + code[i++] + 108);\n            } else if (v < 255) {\n              stack.push(-(v - 251) * 256 - code[i++] - 108);\n            } else {\n              stack.push((code[i] << 24 | code[i + 1] << 16 | code[i + 2] << 8 | code[i + 3]) / 65536);\n              i += 4;\n            }\n            break;\n        }\n        if (stackClean) {\n          stack.length = 0;\n        }\n      }\n    }\n    parse(code);\n  }\n  var noop = '';\n  function CompiledFont(fontMatrix) {\n    this.compiledGlyphs = Object.create(null);\n    this.compiledCharCodeToGlyphId = Object.create(null);\n    this.fontMatrix = fontMatrix;\n  }\n  CompiledFont.prototype = {\n    getPathJs: function getPathJs(unicode) {\n      var cmap = lookupCmap(this.cmap, unicode);\n      var fn = this.compiledGlyphs[cmap.glyphId];\n      if (!fn) {\n        fn = this.compileGlyph(this.glyphs[cmap.glyphId]);\n        this.compiledGlyphs[cmap.glyphId] = fn;\n      }\n      if (this.compiledCharCodeToGlyphId[cmap.charCode] === undefined) {\n        this.compiledCharCodeToGlyphId[cmap.charCode] = cmap.glyphId;\n      }\n      return fn;\n    },\n    compileGlyph: function compileGlyph(code) {\n      if (!code || code.length === 0 || code[0] === 14) {\n        return noop;\n      }\n      var cmds = [];\n      cmds.push({ cmd: 'save' });\n      cmds.push({\n        cmd: 'transform',\n        args: this.fontMatrix.slice()\n      });\n      cmds.push({\n        cmd: 'scale',\n        args: ['size', '-size']\n      });\n      this.compileGlyphImpl(code, cmds);\n      cmds.push({ cmd: 'restore' });\n      return cmds;\n    },\n    compileGlyphImpl: function compileGlyphImpl() {\n      throw new Error('Children classes should implement this.');\n    },\n    hasBuiltPath: function hasBuiltPath(unicode) {\n      var cmap = lookupCmap(this.cmap, unicode);\n      return this.compiledGlyphs[cmap.glyphId] !== undefined && this.compiledCharCodeToGlyphId[cmap.charCode] !== undefined;\n    }\n  };\n  function TrueTypeCompiled(glyphs, cmap, fontMatrix) {\n    fontMatrix = fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0];\n    CompiledFont.call(this, fontMatrix);\n    this.glyphs = glyphs;\n    this.cmap = cmap;\n  }\n  _util.Util.inherit(TrueTypeCompiled, CompiledFont, {\n    compileGlyphImpl: function compileGlyphImpl(code, cmds) {\n      compileGlyf(code, cmds, this);\n    }\n  });\n  function Type2Compiled(cffInfo, cmap, fontMatrix, glyphNameMap) {\n    fontMatrix = fontMatrix || [0.001, 0, 0, 0.001, 0, 0];\n    CompiledFont.call(this, fontMatrix);\n    this.glyphs = cffInfo.glyphs;\n    this.gsubrs = cffInfo.gsubrs || [];\n    this.subrs = cffInfo.subrs || [];\n    this.cmap = cmap;\n    this.glyphNameMap = glyphNameMap || (0, _glyphlist.getGlyphsUnicode)();\n    this.gsubrsBias = this.gsubrs.length < 1240 ? 107 : this.gsubrs.length < 33900 ? 1131 : 32768;\n    this.subrsBias = this.subrs.length < 1240 ? 107 : this.subrs.length < 33900 ? 1131 : 32768;\n  }\n  _util.Util.inherit(Type2Compiled, CompiledFont, {\n    compileGlyphImpl: function compileGlyphImpl(code, cmds) {\n      compileCharString(code, cmds, this);\n    }\n  });\n  return {\n    create: function FontRendererFactory_create(font, seacAnalysisEnabled) {\n      var data = new Uint8Array(font.data);\n      var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm;\n      var numTables = getUshort(data, 4);\n      for (var i = 0, p = 12; i < numTables; i++, p += 16) {\n        var tag = (0, _util.bytesToString)(data.subarray(p, p + 4));\n        var offset = getLong(data, p + 8);\n        var length = getLong(data, p + 12);\n        switch (tag) {\n          case 'cmap':\n            cmap = parseCmap(data, offset, offset + length);\n            break;\n          case 'glyf':\n            glyf = data.subarray(offset, offset + length);\n            break;\n          case 'loca':\n            loca = data.subarray(offset, offset + length);\n            break;\n          case 'head':\n            unitsPerEm = getUshort(data, offset + 18);\n            indexToLocFormat = getUshort(data, offset + 50);\n            break;\n          case 'CFF ':\n            cff = parseCff(data, offset, offset + length, seacAnalysisEnabled);\n            break;\n        }\n      }\n      if (glyf) {\n        var fontMatrix = !unitsPerEm ? font.fontMatrix : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0];\n        return new TrueTypeCompiled(parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix);\n      }\n      return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap);\n    }\n  };\n}();\nexports.FontRendererFactory = FontRendererFactory;\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getFontType = exports.ProblematicCharRanges = exports.IdentityToUnicodeMap = exports.ToUnicodeMap = exports.FontFlags = exports.Font = exports.ErrorFont = exports.PRIVATE_USE_OFFSET_END = exports.PRIVATE_USE_OFFSET_START = exports.SEAC_ANALYSIS_ENABLED = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _cff_parser = __w_pdfjs_require__(10);\n\nvar _glyphlist = __w_pdfjs_require__(6);\n\nvar _encodings = __w_pdfjs_require__(4);\n\nvar _standard_fonts = __w_pdfjs_require__(16);\n\nvar _unicode = __w_pdfjs_require__(8);\n\nvar _font_renderer = __w_pdfjs_require__(24);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar _type1_parser = __w_pdfjs_require__(34);\n\nvar PRIVATE_USE_OFFSET_START = 0xE000;\nvar PRIVATE_USE_OFFSET_END = 0xF8FF;\nvar SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = false;\nvar PDF_GLYPH_SPACE_UNITS = 1000;\nvar SEAC_ANALYSIS_ENABLED = false;\nvar FontFlags = {\n  FixedPitch: 1,\n  Serif: 2,\n  Symbolic: 4,\n  Script: 8,\n  Nonsymbolic: 32,\n  Italic: 64,\n  AllCap: 65536,\n  SmallCap: 131072,\n  ForceBold: 262144\n};\nvar MacStandardGlyphOrdering = ['.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar', 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply', 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter', 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla', 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];\nfunction adjustWidths(properties) {\n  if (!properties.fontMatrix) {\n    return;\n  }\n  if (properties.fontMatrix[0] === _util.FONT_IDENTITY_MATRIX[0]) {\n    return;\n  }\n  var scale = 0.001 / properties.fontMatrix[0];\n  var glyphsWidths = properties.widths;\n  for (var glyph in glyphsWidths) {\n    glyphsWidths[glyph] *= scale;\n  }\n  properties.defaultWidth *= scale;\n}\nfunction adjustToUnicode(properties, builtInEncoding) {\n  if (properties.hasIncludedToUnicodeMap) {\n    return;\n  }\n  if (properties.hasEncoding) {\n    return;\n  }\n  if (builtInEncoding === properties.defaultEncoding) {\n    return;\n  }\n  if (properties.toUnicode instanceof IdentityToUnicodeMap) {\n    return;\n  }\n  var toUnicode = [],\n      glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n  for (var charCode in builtInEncoding) {\n    var glyphName = builtInEncoding[charCode];\n    var unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);\n    if (unicode !== -1) {\n      toUnicode[charCode] = String.fromCharCode(unicode);\n    }\n  }\n  properties.toUnicode.amend(toUnicode);\n}\nfunction getFontType(type, subtype) {\n  switch (type) {\n    case 'Type1':\n      return subtype === 'Type1C' ? _util.FontType.TYPE1C : _util.FontType.TYPE1;\n    case 'CIDFontType0':\n      return subtype === 'CIDFontType0C' ? _util.FontType.CIDFONTTYPE0C : _util.FontType.CIDFONTTYPE0;\n    case 'OpenType':\n      return _util.FontType.OPENTYPE;\n    case 'TrueType':\n      return _util.FontType.TRUETYPE;\n    case 'CIDFontType2':\n      return _util.FontType.CIDFONTTYPE2;\n    case 'MMType1':\n      return _util.FontType.MMTYPE1;\n    case 'Type0':\n      return _util.FontType.TYPE0;\n    default:\n      return _util.FontType.UNKNOWN;\n  }\n}\nfunction recoverGlyphName(name, glyphsUnicodeMap) {\n  if (glyphsUnicodeMap[name] !== undefined) {\n    return name;\n  }\n  var unicode = (0, _unicode.getUnicodeForGlyph)(name, glyphsUnicodeMap);\n  if (unicode !== -1) {\n    for (var key in glyphsUnicodeMap) {\n      if (glyphsUnicodeMap[key] === unicode) {\n        return key;\n      }\n    }\n  }\n  (0, _util.info)('Unable to recover a standard glyph name for: ' + name);\n  return name;\n}\nvar Glyph = function GlyphClosure() {\n  function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) {\n    this.fontChar = fontChar;\n    this.unicode = unicode;\n    this.accent = accent;\n    this.width = width;\n    this.vmetric = vmetric;\n    this.operatorListId = operatorListId;\n    this.isSpace = isSpace;\n    this.isInFont = isInFont;\n  }\n  Glyph.prototype.matchesForCache = function (fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) {\n    return this.fontChar === fontChar && this.unicode === unicode && this.accent === accent && this.width === width && this.vmetric === vmetric && this.operatorListId === operatorListId && this.isSpace === isSpace && this.isInFont === isInFont;\n  };\n  return Glyph;\n}();\nvar ToUnicodeMap = function ToUnicodeMapClosure() {\n  function ToUnicodeMap(cmap) {\n    this._map = cmap;\n  }\n  ToUnicodeMap.prototype = {\n    get length() {\n      return this._map.length;\n    },\n    forEach: function forEach(callback) {\n      for (var charCode in this._map) {\n        callback(charCode, this._map[charCode].charCodeAt(0));\n      }\n    },\n    has: function has(i) {\n      return this._map[i] !== undefined;\n    },\n    get: function get(i) {\n      return this._map[i];\n    },\n    charCodeOf: function charCodeOf(value) {\n      var map = this._map;\n      if (map.length <= 0x10000) {\n        return map.indexOf(value);\n      }\n      for (var charCode in map) {\n        if (map[charCode] === value) {\n          return charCode | 0;\n        }\n      }\n      return -1;\n    },\n    amend: function amend(map) {\n      for (var charCode in map) {\n        this._map[charCode] = map[charCode];\n      }\n    }\n  };\n  return ToUnicodeMap;\n}();\nvar IdentityToUnicodeMap = function IdentityToUnicodeMapClosure() {\n  function IdentityToUnicodeMap(firstChar, lastChar) {\n    this.firstChar = firstChar;\n    this.lastChar = lastChar;\n  }\n  IdentityToUnicodeMap.prototype = {\n    get length() {\n      return this.lastChar + 1 - this.firstChar;\n    },\n    forEach: function forEach(callback) {\n      for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) {\n        callback(i, i);\n      }\n    },\n    has: function has(i) {\n      return this.firstChar <= i && i <= this.lastChar;\n    },\n    get: function get(i) {\n      if (this.firstChar <= i && i <= this.lastChar) {\n        return String.fromCharCode(i);\n      }\n      return undefined;\n    },\n    charCodeOf: function charCodeOf(v) {\n      return (0, _util.isInt)(v) && v >= this.firstChar && v <= this.lastChar ? v : -1;\n    },\n    amend: function amend(map) {\n      throw new Error('Should not call amend()');\n    }\n  };\n  return IdentityToUnicodeMap;\n}();\nvar OpenTypeFileBuilder = function OpenTypeFileBuilderClosure() {\n  function writeInt16(dest, offset, num) {\n    dest[offset] = num >> 8 & 0xFF;\n    dest[offset + 1] = num & 0xFF;\n  }\n  function writeInt32(dest, offset, num) {\n    dest[offset] = num >> 24 & 0xFF;\n    dest[offset + 1] = num >> 16 & 0xFF;\n    dest[offset + 2] = num >> 8 & 0xFF;\n    dest[offset + 3] = num & 0xFF;\n  }\n  function writeData(dest, offset, data) {\n    var i, ii;\n    if (data instanceof Uint8Array) {\n      dest.set(data, offset);\n    } else if (typeof data === 'string') {\n      for (i = 0, ii = data.length; i < ii; i++) {\n        dest[offset++] = data.charCodeAt(i) & 0xFF;\n      }\n    } else {\n      for (i = 0, ii = data.length; i < ii; i++) {\n        dest[offset++] = data[i] & 0xFF;\n      }\n    }\n  }\n  function OpenTypeFileBuilder(sfnt) {\n    this.sfnt = sfnt;\n    this.tables = Object.create(null);\n  }\n  OpenTypeFileBuilder.getSearchParams = function OpenTypeFileBuilder_getSearchParams(entriesCount, entrySize) {\n    var maxPower2 = 1,\n        log2 = 0;\n    while ((maxPower2 ^ entriesCount) > maxPower2) {\n      maxPower2 <<= 1;\n      log2++;\n    }\n    var searchRange = maxPower2 * entrySize;\n    return {\n      range: searchRange,\n      entry: log2,\n      rangeShift: entrySize * entriesCount - searchRange\n    };\n  };\n  var OTF_HEADER_SIZE = 12;\n  var OTF_TABLE_ENTRY_SIZE = 16;\n  OpenTypeFileBuilder.prototype = {\n    toArray: function OpenTypeFileBuilder_toArray() {\n      var sfnt = this.sfnt;\n      var tables = this.tables;\n      var tablesNames = Object.keys(tables);\n      tablesNames.sort();\n      var numTables = tablesNames.length;\n      var i, j, jj, table, tableName;\n      var offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE;\n      var tableOffsets = [offset];\n      for (i = 0; i < numTables; i++) {\n        table = tables[tablesNames[i]];\n        var paddedLength = (table.length + 3 & ~3) >>> 0;\n        offset += paddedLength;\n        tableOffsets.push(offset);\n      }\n      var file = new Uint8Array(offset);\n      for (i = 0; i < numTables; i++) {\n        table = tables[tablesNames[i]];\n        writeData(file, tableOffsets[i], table);\n      }\n      if (sfnt === 'true') {\n        sfnt = (0, _util.string32)(0x00010000);\n      }\n      file[0] = sfnt.charCodeAt(0) & 0xFF;\n      file[1] = sfnt.charCodeAt(1) & 0xFF;\n      file[2] = sfnt.charCodeAt(2) & 0xFF;\n      file[3] = sfnt.charCodeAt(3) & 0xFF;\n      writeInt16(file, 4, numTables);\n      var searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16);\n      writeInt16(file, 6, searchParams.range);\n      writeInt16(file, 8, searchParams.entry);\n      writeInt16(file, 10, searchParams.rangeShift);\n      offset = OTF_HEADER_SIZE;\n      for (i = 0; i < numTables; i++) {\n        tableName = tablesNames[i];\n        file[offset] = tableName.charCodeAt(0) & 0xFF;\n        file[offset + 1] = tableName.charCodeAt(1) & 0xFF;\n        file[offset + 2] = tableName.charCodeAt(2) & 0xFF;\n        file[offset + 3] = tableName.charCodeAt(3) & 0xFF;\n        var checksum = 0;\n        for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) {\n          var quad = (0, _util.readUint32)(file, j);\n          checksum = checksum + quad >>> 0;\n        }\n        writeInt32(file, offset + 4, checksum);\n        writeInt32(file, offset + 8, tableOffsets[i]);\n        writeInt32(file, offset + 12, tables[tableName].length);\n        offset += OTF_TABLE_ENTRY_SIZE;\n      }\n      return file;\n    },\n    addTable: function OpenTypeFileBuilder_addTable(tag, data) {\n      if (tag in this.tables) {\n        throw new Error('Table ' + tag + ' already exists');\n      }\n      this.tables[tag] = data;\n    }\n  };\n  return OpenTypeFileBuilder;\n}();\nvar ProblematicCharRanges = new Int32Array([0x0000, 0x0020, 0x007F, 0x00A1, 0x00AD, 0x00AE, 0x0600, 0x0780, 0x08A0, 0x10A0, 0x1780, 0x1800, 0x1C00, 0x1C50, 0x2000, 0x2010, 0x2011, 0x2012, 0x2028, 0x2030, 0x205F, 0x2070, 0x25CC, 0x25CD, 0x3000, 0x3001, 0x3164, 0x3165, 0xAA60, 0xAA80, 0xFFF0, 0x10000]);\nvar Font = function FontClosure() {\n  function Font(name, file, properties) {\n    var charCode;\n    this.name = name;\n    this.loadedName = properties.loadedName;\n    this.isType3Font = properties.isType3Font;\n    this.sizes = [];\n    this.missingFile = false;\n    this.glyphCache = Object.create(null);\n    this.isSerifFont = !!(properties.flags & FontFlags.Serif);\n    this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);\n    this.isMonospace = !!(properties.flags & FontFlags.FixedPitch);\n    var type = properties.type;\n    var subtype = properties.subtype;\n    this.type = type;\n    this.subtype = subtype;\n    this.fallbackName = this.isMonospace ? 'monospace' : this.isSerifFont ? 'serif' : 'sans-serif';\n    this.differences = properties.differences;\n    this.widths = properties.widths;\n    this.defaultWidth = properties.defaultWidth;\n    this.composite = properties.composite;\n    this.wideChars = properties.wideChars;\n    this.cMap = properties.cMap;\n    this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS;\n    this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS;\n    this.fontMatrix = properties.fontMatrix;\n    this.bbox = properties.bbox;\n    this.defaultEncoding = properties.defaultEncoding;\n    this.toUnicode = properties.toUnicode;\n    this.toFontChar = [];\n    if (properties.type === 'Type3') {\n      for (charCode = 0; charCode < 256; charCode++) {\n        this.toFontChar[charCode] = this.differences[charCode] || properties.defaultEncoding[charCode];\n      }\n      this.fontType = _util.FontType.TYPE3;\n      return;\n    }\n    this.cidEncoding = properties.cidEncoding;\n    this.vertical = properties.vertical;\n    if (this.vertical) {\n      this.vmetrics = properties.vmetrics;\n      this.defaultVMetrics = properties.defaultVMetrics;\n    }\n    if (!file || file.isEmpty) {\n      if (file) {\n        (0, _util.warn)('Font file is empty in \"' + name + '\" (' + this.loadedName + ')');\n      }\n      this.fallbackToSystemFont();\n      return;\n    }\n    if (subtype === 'Type1C') {\n      if (type !== 'Type1' && type !== 'MMType1') {\n        if (isTrueTypeFile(file)) {\n          subtype = 'TrueType';\n        } else {\n          type = 'Type1';\n        }\n      } else if (isOpenTypeFile(file)) {\n        subtype = 'OpenType';\n      }\n    }\n    if (subtype === 'CIDFontType0C' && type !== 'CIDFontType0') {\n      type = 'CIDFontType0';\n    }\n    if (type === 'CIDFontType0') {\n      if (isType1File(file)) {\n        subtype = 'CIDFontType0';\n      } else if (isOpenTypeFile(file)) {\n        subtype = 'OpenType';\n      } else {\n        subtype = 'CIDFontType0C';\n      }\n    }\n    if (subtype === 'OpenType' && type !== 'OpenType') {\n      type = 'OpenType';\n    }\n    try {\n      var data;\n      switch (type) {\n        case 'MMType1':\n          (0, _util.info)('MMType1 font (' + name + '), falling back to Type1.');\n        case 'Type1':\n        case 'CIDFontType0':\n          this.mimetype = 'font/opentype';\n          var cff = subtype === 'Type1C' || subtype === 'CIDFontType0C' ? new CFFFont(file, properties) : new Type1Font(name, file, properties);\n          adjustWidths(properties);\n          data = this.convert(name, cff, properties);\n          break;\n        case 'OpenType':\n        case 'TrueType':\n        case 'CIDFontType2':\n          this.mimetype = 'font/opentype';\n          data = this.checkAndRepair(name, file, properties);\n          if (this.isOpenType) {\n            adjustWidths(properties);\n            type = 'OpenType';\n          }\n          break;\n        default:\n          throw new _util.FormatError('Font ' + type + ' is not supported');\n      }\n    } catch (e) {\n      if (!(e instanceof _util.FormatError)) {\n        throw e;\n      }\n      (0, _util.warn)(e);\n      this.fallbackToSystemFont();\n      return;\n    }\n    this.data = data;\n    this.fontType = getFontType(type, subtype);\n    this.fontMatrix = properties.fontMatrix;\n    this.widths = properties.widths;\n    this.defaultWidth = properties.defaultWidth;\n    this.toUnicode = properties.toUnicode;\n    this.encoding = properties.baseEncoding;\n    this.seacMap = properties.seacMap;\n    this.loading = true;\n  }\n  Font.getFontID = function () {\n    var ID = 1;\n    return function Font_getFontID() {\n      return String(ID++);\n    };\n  }();\n  function int16(b0, b1) {\n    return (b0 << 8) + b1;\n  }\n  function signedInt16(b0, b1) {\n    var value = (b0 << 8) + b1;\n    return value & 1 << 15 ? value - 0x10000 : value;\n  }\n  function int32(b0, b1, b2, b3) {\n    return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n  }\n  function string16(value) {\n    return String.fromCharCode(value >> 8 & 0xff, value & 0xff);\n  }\n  function safeString16(value) {\n    value = value > 0x7FFF ? 0x7FFF : value < -0x8000 ? -0x8000 : value;\n    return String.fromCharCode(value >> 8 & 0xff, value & 0xff);\n  }\n  function isTrueTypeFile(file) {\n    var header = file.peekBytes(4);\n    return (0, _util.readUint32)(header, 0) === 0x00010000;\n  }\n  function isOpenTypeFile(file) {\n    var header = file.peekBytes(4);\n    return (0, _util.bytesToString)(header) === 'OTTO';\n  }\n  function isType1File(file) {\n    var header = file.peekBytes(2);\n    if (header[0] === 0x25 && header[1] === 0x21) {\n      return true;\n    }\n    if (header[0] === 0x80 && header[1] === 0x01) {\n      return true;\n    }\n    return false;\n  }\n  function buildToFontChar(encoding, glyphsUnicodeMap, differences) {\n    var toFontChar = [],\n        unicode;\n    for (var i = 0, ii = encoding.length; i < ii; i++) {\n      unicode = (0, _unicode.getUnicodeForGlyph)(encoding[i], glyphsUnicodeMap);\n      if (unicode !== -1) {\n        toFontChar[i] = unicode;\n      }\n    }\n    for (var charCode in differences) {\n      unicode = (0, _unicode.getUnicodeForGlyph)(differences[charCode], glyphsUnicodeMap);\n      if (unicode !== -1) {\n        toFontChar[+charCode] = unicode;\n      }\n    }\n    return toFontChar;\n  }\n  function isProblematicUnicodeLocation(code) {\n    var i = 0,\n        j = ProblematicCharRanges.length - 1;\n    while (i < j) {\n      var c = i + j + 1 >> 1;\n      if (code < ProblematicCharRanges[c]) {\n        j = c - 1;\n      } else {\n        i = c;\n      }\n    }\n    return !(i & 1);\n  }\n  function adjustMapping(charCodeToGlyphId, properties, missingGlyphs) {\n    var toUnicode = properties.toUnicode;\n    var isSymbolic = !!(properties.flags & FontFlags.Symbolic);\n    var isIdentityUnicode = properties.toUnicode instanceof IdentityToUnicodeMap;\n    var newMap = Object.create(null);\n    var toFontChar = [];\n    var usedFontCharCodes = [];\n    var nextAvailableFontCharCode = PRIVATE_USE_OFFSET_START;\n    for (var originalCharCode in charCodeToGlyphId) {\n      originalCharCode |= 0;\n      var glyphId = charCodeToGlyphId[originalCharCode];\n      if (missingGlyphs[glyphId]) {\n        continue;\n      }\n      var fontCharCode = originalCharCode;\n      var hasUnicodeValue = false;\n      if (!isIdentityUnicode && toUnicode.has(originalCharCode)) {\n        hasUnicodeValue = true;\n        var unicode = toUnicode.get(fontCharCode);\n        if (unicode.length === 1) {\n          fontCharCode = unicode.charCodeAt(0);\n        }\n      }\n      if (usedFontCharCodes[fontCharCode] !== undefined || isProblematicUnicodeLocation(fontCharCode) || isSymbolic && !hasUnicodeValue) {\n        do {\n          if (nextAvailableFontCharCode > PRIVATE_USE_OFFSET_END) {\n            (0, _util.warn)('Ran out of space in font private use area.');\n            break;\n          }\n          fontCharCode = nextAvailableFontCharCode++;\n          if (SKIP_PRIVATE_USE_RANGE_F000_TO_F01F && fontCharCode === 0xF000) {\n            fontCharCode = 0xF020;\n            nextAvailableFontCharCode = fontCharCode + 1;\n          }\n        } while (usedFontCharCodes[fontCharCode] !== undefined);\n      }\n      newMap[fontCharCode] = glyphId;\n      toFontChar[originalCharCode] = fontCharCode;\n      usedFontCharCodes[fontCharCode] = true;\n    }\n    return {\n      toFontChar: toFontChar,\n      charCodeToGlyphId: newMap,\n      nextAvailableFontCharCode: nextAvailableFontCharCode\n    };\n  }\n  function getRanges(glyphs, numGlyphs) {\n    var codes = [];\n    for (var charCode in glyphs) {\n      if (glyphs[charCode] >= numGlyphs) {\n        continue;\n      }\n      codes.push({\n        fontCharCode: charCode | 0,\n        glyphId: glyphs[charCode]\n      });\n    }\n    if (codes.length === 0) {\n      codes.push({\n        fontCharCode: 0,\n        glyphId: 0\n      });\n    }\n    codes.sort(function fontGetRangesSort(a, b) {\n      return a.fontCharCode - b.fontCharCode;\n    });\n    var ranges = [];\n    var length = codes.length;\n    for (var n = 0; n < length;) {\n      var start = codes[n].fontCharCode;\n      var codeIndices = [codes[n].glyphId];\n      ++n;\n      var end = start;\n      while (n < length && end + 1 === codes[n].fontCharCode) {\n        codeIndices.push(codes[n].glyphId);\n        ++end;\n        ++n;\n        if (end === 0xFFFF) {\n          break;\n        }\n      }\n      ranges.push([start, end, codeIndices]);\n    }\n    return ranges;\n  }\n  function createCmapTable(glyphs, numGlyphs) {\n    var ranges = getRanges(glyphs, numGlyphs);\n    var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1;\n    var cmap = '\\x00\\x00' + string16(numTables) + '\\x00\\x03' + '\\x00\\x01' + (0, _util.string32)(4 + numTables * 8);\n    var i, ii, j, jj;\n    for (i = ranges.length - 1; i >= 0; --i) {\n      if (ranges[i][0] <= 0xFFFF) {\n        break;\n      }\n    }\n    var bmpLength = i + 1;\n    if (ranges[i][0] < 0xFFFF && ranges[i][1] === 0xFFFF) {\n      ranges[i][1] = 0xFFFE;\n    }\n    var trailingRangesCount = ranges[i][1] < 0xFFFF ? 1 : 0;\n    var segCount = bmpLength + trailingRangesCount;\n    var searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2);\n    var startCount = '';\n    var endCount = '';\n    var idDeltas = '';\n    var idRangeOffsets = '';\n    var glyphsIds = '';\n    var bias = 0;\n    var range, start, end, codes;\n    for (i = 0, ii = bmpLength; i < ii; i++) {\n      range = ranges[i];\n      start = range[0];\n      end = range[1];\n      startCount += string16(start);\n      endCount += string16(end);\n      codes = range[2];\n      var contiguous = true;\n      for (j = 1, jj = codes.length; j < jj; ++j) {\n        if (codes[j] !== codes[j - 1] + 1) {\n          contiguous = false;\n          break;\n        }\n      }\n      if (!contiguous) {\n        var offset = (segCount - i) * 2 + bias * 2;\n        bias += end - start + 1;\n        idDeltas += string16(0);\n        idRangeOffsets += string16(offset);\n        for (j = 0, jj = codes.length; j < jj; ++j) {\n          glyphsIds += string16(codes[j]);\n        }\n      } else {\n        var startCode = codes[0];\n        idDeltas += string16(startCode - start & 0xFFFF);\n        idRangeOffsets += string16(0);\n      }\n    }\n    if (trailingRangesCount > 0) {\n      endCount += '\\xFF\\xFF';\n      startCount += '\\xFF\\xFF';\n      idDeltas += '\\x00\\x01';\n      idRangeOffsets += '\\x00\\x00';\n    }\n    var format314 = '\\x00\\x00' + string16(2 * segCount) + string16(searchParams.range) + string16(searchParams.entry) + string16(searchParams.rangeShift) + endCount + '\\x00\\x00' + startCount + idDeltas + idRangeOffsets + glyphsIds;\n    var format31012 = '';\n    var header31012 = '';\n    if (numTables > 1) {\n      cmap += '\\x00\\x03' + '\\x00\\x0A' + (0, _util.string32)(4 + numTables * 8 + 4 + format314.length);\n      format31012 = '';\n      for (i = 0, ii = ranges.length; i < ii; i++) {\n        range = ranges[i];\n        start = range[0];\n        codes = range[2];\n        var code = codes[0];\n        for (j = 1, jj = codes.length; j < jj; ++j) {\n          if (codes[j] !== codes[j - 1] + 1) {\n            end = range[0] + j - 1;\n            format31012 += (0, _util.string32)(start) + (0, _util.string32)(end) + (0, _util.string32)(code);\n            start = end + 1;\n            code = codes[j];\n          }\n        }\n        format31012 += (0, _util.string32)(start) + (0, _util.string32)(range[1]) + (0, _util.string32)(code);\n      }\n      header31012 = '\\x00\\x0C' + '\\x00\\x00' + (0, _util.string32)(format31012.length + 16) + '\\x00\\x00\\x00\\x00' + (0, _util.string32)(format31012.length / 12);\n    }\n    return cmap + '\\x00\\x04' + string16(format314.length + 4) + format314 + header31012 + format31012;\n  }\n  function validateOS2Table(os2) {\n    var stream = new _stream.Stream(os2.data);\n    var version = stream.getUint16();\n    stream.getBytes(60);\n    var selection = stream.getUint16();\n    if (version < 4 && selection & 0x0300) {\n      return false;\n    }\n    var firstChar = stream.getUint16();\n    var lastChar = stream.getUint16();\n    if (firstChar > lastChar) {\n      return false;\n    }\n    stream.getBytes(6);\n    var usWinAscent = stream.getUint16();\n    if (usWinAscent === 0) {\n      return false;\n    }\n    os2.data[8] = os2.data[9] = 0;\n    return true;\n  }\n  function createOS2Table(properties, charstrings, override) {\n    override = override || {\n      unitsPerEm: 0,\n      yMax: 0,\n      yMin: 0,\n      ascent: 0,\n      descent: 0\n    };\n    var ulUnicodeRange1 = 0;\n    var ulUnicodeRange2 = 0;\n    var ulUnicodeRange3 = 0;\n    var ulUnicodeRange4 = 0;\n    var firstCharIndex = null;\n    var lastCharIndex = 0;\n    if (charstrings) {\n      for (var code in charstrings) {\n        code |= 0;\n        if (firstCharIndex > code || !firstCharIndex) {\n          firstCharIndex = code;\n        }\n        if (lastCharIndex < code) {\n          lastCharIndex = code;\n        }\n        var position = (0, _unicode.getUnicodeRangeFor)(code);\n        if (position < 32) {\n          ulUnicodeRange1 |= 1 << position;\n        } else if (position < 64) {\n          ulUnicodeRange2 |= 1 << position - 32;\n        } else if (position < 96) {\n          ulUnicodeRange3 |= 1 << position - 64;\n        } else if (position < 123) {\n          ulUnicodeRange4 |= 1 << position - 96;\n        } else {\n          throw new _util.FormatError('Unicode ranges Bits > 123 are reserved for internal usage');\n        }\n      }\n    } else {\n      firstCharIndex = 0;\n      lastCharIndex = 255;\n    }\n    var bbox = properties.bbox || [0, 0, 0, 0];\n    var unitsPerEm = override.unitsPerEm || 1 / (properties.fontMatrix || _util.FONT_IDENTITY_MATRIX)[0];\n    var scale = properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS;\n    var typoAscent = override.ascent || Math.round(scale * (properties.ascent || bbox[3]));\n    var typoDescent = override.descent || Math.round(scale * (properties.descent || bbox[1]));\n    if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) {\n      typoDescent = -typoDescent;\n    }\n    var winAscent = override.yMax || typoAscent;\n    var winDescent = -override.yMin || -typoDescent;\n    return '\\x00\\x03' + '\\x02\\x24' + '\\x01\\xF4' + '\\x00\\x05' + '\\x00\\x00' + '\\x02\\x8A' + '\\x02\\xBB' + '\\x00\\x00' + '\\x00\\x8C' + '\\x02\\x8A' + '\\x02\\xBB' + '\\x00\\x00' + '\\x01\\xDF' + '\\x00\\x31' + '\\x01\\x02' + '\\x00\\x00' + '\\x00\\x00\\x06' + String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + '\\x00\\x00\\x00\\x00\\x00\\x00' + (0, _util.string32)(ulUnicodeRange1) + (0, _util.string32)(ulUnicodeRange2) + (0, _util.string32)(ulUnicodeRange3) + (0, _util.string32)(ulUnicodeRange4) + '\\x2A\\x32\\x31\\x2A' + string16(properties.italicAngle ? 1 : 0) + string16(firstCharIndex || properties.firstChar) + string16(lastCharIndex || properties.lastChar) + string16(typoAscent) + string16(typoDescent) + '\\x00\\x64' + string16(winAscent) + string16(winDescent) + '\\x00\\x00\\x00\\x00' + '\\x00\\x00\\x00\\x00' + string16(properties.xHeight) + string16(properties.capHeight) + string16(0) + string16(firstCharIndex || properties.firstChar) + '\\x00\\x03';\n  }\n  function createPostTable(properties) {\n    var angle = Math.floor(properties.italicAngle * Math.pow(2, 16));\n    return '\\x00\\x03\\x00\\x00' + (0, _util.string32)(angle) + '\\x00\\x00' + '\\x00\\x00' + (0, _util.string32)(properties.fixedPitch) + '\\x00\\x00\\x00\\x00' + '\\x00\\x00\\x00\\x00' + '\\x00\\x00\\x00\\x00' + '\\x00\\x00\\x00\\x00';\n  }\n  function createNameTable(name, proto) {\n    if (!proto) {\n      proto = [[], []];\n    }\n    var strings = [proto[0][0] || 'Original licence', proto[0][1] || name, proto[0][2] || 'Unknown', proto[0][3] || 'uniqueID', proto[0][4] || name, proto[0][5] || 'Version 0.11', proto[0][6] || '', proto[0][7] || 'Unknown', proto[0][8] || 'Unknown', proto[0][9] || 'Unknown'];\n    var stringsUnicode = [];\n    var i, ii, j, jj, str;\n    for (i = 0, ii = strings.length; i < ii; i++) {\n      str = proto[1][i] || strings[i];\n      var strBufUnicode = [];\n      for (j = 0, jj = str.length; j < jj; j++) {\n        strBufUnicode.push(string16(str.charCodeAt(j)));\n      }\n      stringsUnicode.push(strBufUnicode.join(''));\n    }\n    var names = [strings, stringsUnicode];\n    var platforms = ['\\x00\\x01', '\\x00\\x03'];\n    var encodings = ['\\x00\\x00', '\\x00\\x01'];\n    var languages = ['\\x00\\x00', '\\x04\\x09'];\n    var namesRecordCount = strings.length * platforms.length;\n    var nameTable = '\\x00\\x00' + string16(namesRecordCount) + string16(namesRecordCount * 12 + 6);\n    var strOffset = 0;\n    for (i = 0, ii = platforms.length; i < ii; i++) {\n      var strs = names[i];\n      for (j = 0, jj = strs.length; j < jj; j++) {\n        str = strs[j];\n        var nameRecord = platforms[i] + encodings[i] + languages[i] + string16(j) + string16(str.length) + string16(strOffset);\n        nameTable += nameRecord;\n        strOffset += str.length;\n      }\n    }\n    nameTable += strings.join('') + stringsUnicode.join('');\n    return nameTable;\n  }\n  Font.prototype = {\n    name: null,\n    font: null,\n    mimetype: null,\n    encoding: null,\n    get renderer() {\n      var renderer = _font_renderer.FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED);\n      return (0, _util.shadow)(this, 'renderer', renderer);\n    },\n    exportData: function Font_exportData() {\n      var data = {};\n      for (var i in this) {\n        if (this.hasOwnProperty(i)) {\n          data[i] = this[i];\n        }\n      }\n      return data;\n    },\n    fallbackToSystemFont: function Font_fallbackToSystemFont() {\n      var _this = this;\n\n      this.missingFile = true;\n      var charCode, unicode;\n      var name = this.name;\n      var type = this.type;\n      var subtype = this.subtype;\n      var fontName = name.replace(/[,_]/g, '-');\n      var stdFontMap = (0, _standard_fonts.getStdFontMap)(),\n          nonStdFontMap = (0, _standard_fonts.getNonStdFontMap)();\n      var isStandardFont = !!stdFontMap[fontName] || !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]);\n      fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;\n      this.bold = fontName.search(/bold/gi) !== -1;\n      this.italic = fontName.search(/oblique/gi) !== -1 || fontName.search(/italic/gi) !== -1;\n      this.black = name.search(/Black/g) !== -1;\n      this.remeasure = Object.keys(this.widths).length > 0;\n      if (isStandardFont && type === 'CIDFontType2' && this.cidEncoding.indexOf('Identity-') === 0) {\n        var GlyphMapForStandardFonts = (0, _standard_fonts.getGlyphMapForStandardFonts)();\n        var map = [];\n        for (charCode in GlyphMapForStandardFonts) {\n          map[+charCode] = GlyphMapForStandardFonts[charCode];\n        }\n        if (/Arial-?Black/i.test(name)) {\n          var SupplementalGlyphMapForArialBlack = (0, _standard_fonts.getSupplementalGlyphMapForArialBlack)();\n          for (charCode in SupplementalGlyphMapForArialBlack) {\n            map[+charCode] = SupplementalGlyphMapForArialBlack[charCode];\n          }\n        }\n        var isIdentityUnicode = this.toUnicode instanceof IdentityToUnicodeMap;\n        if (!isIdentityUnicode) {\n          this.toUnicode.forEach(function (charCode, unicodeCharCode) {\n            map[+charCode] = unicodeCharCode;\n          });\n        }\n        this.toFontChar = map;\n        this.toUnicode = new ToUnicodeMap(map);\n      } else if (/Symbol/i.test(fontName)) {\n        this.toFontChar = buildToFontChar(_encodings.SymbolSetEncoding, (0, _glyphlist.getGlyphsUnicode)(), this.differences);\n      } else if (/Dingbats/i.test(fontName)) {\n        if (/Wingdings/i.test(name)) {\n          (0, _util.warn)('Non-embedded Wingdings font, falling back to ZapfDingbats.');\n        }\n        this.toFontChar = buildToFontChar(_encodings.ZapfDingbatsEncoding, (0, _glyphlist.getDingbatsGlyphsUnicode)(), this.differences);\n      } else if (isStandardFont) {\n        this.toFontChar = buildToFontChar(this.defaultEncoding, (0, _glyphlist.getGlyphsUnicode)(), this.differences);\n      } else {\n        var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n        this.toUnicode.forEach(function (charCode, unicodeCharCode) {\n          if (!_this.composite) {\n            var glyphName = _this.differences[charCode] || _this.defaultEncoding[charCode];\n            unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);\n            if (unicode !== -1) {\n              unicodeCharCode = unicode;\n            }\n          }\n          _this.toFontChar[charCode] = unicodeCharCode;\n        });\n      }\n      this.loadedName = fontName.split('-')[0];\n      this.loading = false;\n      this.fontType = getFontType(type, subtype);\n    },\n    checkAndRepair: function Font_checkAndRepair(name, font, properties) {\n      function readTableEntry(file) {\n        var tag = (0, _util.bytesToString)(file.getBytes(4));\n        var checksum = file.getInt32() >>> 0;\n        var offset = file.getInt32() >>> 0;\n        var length = file.getInt32() >>> 0;\n        var previousPosition = file.pos;\n        file.pos = file.start ? file.start : 0;\n        file.skip(offset);\n        var data = file.getBytes(length);\n        file.pos = previousPosition;\n        if (tag === 'head') {\n          data[8] = data[9] = data[10] = data[11] = 0;\n          data[17] |= 0x20;\n        }\n        return {\n          tag: tag,\n          checksum: checksum,\n          length: length,\n          offset: offset,\n          data: data\n        };\n      }\n      function readOpenTypeHeader(ttf) {\n        return {\n          version: (0, _util.bytesToString)(ttf.getBytes(4)),\n          numTables: ttf.getUint16(),\n          searchRange: ttf.getUint16(),\n          entrySelector: ttf.getUint16(),\n          rangeShift: ttf.getUint16()\n        };\n      }\n      function readCmapTable(cmap, font, isSymbolicFont, hasEncoding) {\n        if (!cmap) {\n          (0, _util.warn)('No cmap table available.');\n          return {\n            platformId: -1,\n            encodingId: -1,\n            mappings: [],\n            hasShortCmap: false\n          };\n        }\n        var segment;\n        var start = (font.start ? font.start : 0) + cmap.offset;\n        font.pos = start;\n        font.getUint16();\n        var numTables = font.getUint16();\n        var potentialTable;\n        var canBreak = false;\n        for (var i = 0; i < numTables; i++) {\n          var platformId = font.getUint16();\n          var encodingId = font.getUint16();\n          var offset = font.getInt32() >>> 0;\n          var useTable = false;\n          if (potentialTable && potentialTable.platformId === platformId && potentialTable.encodingId === encodingId) {\n            continue;\n          }\n          if (platformId === 0 && encodingId === 0) {\n            useTable = true;\n          } else if (platformId === 1 && encodingId === 0) {\n            useTable = true;\n          } else if (platformId === 3 && encodingId === 1 && (hasEncoding || !potentialTable)) {\n            useTable = true;\n            if (!isSymbolicFont) {\n              canBreak = true;\n            }\n          } else if (isSymbolicFont && platformId === 3 && encodingId === 0) {\n            useTable = true;\n            canBreak = true;\n          }\n          if (useTable) {\n            potentialTable = {\n              platformId: platformId,\n              encodingId: encodingId,\n              offset: offset\n            };\n          }\n          if (canBreak) {\n            break;\n          }\n        }\n        if (potentialTable) {\n          font.pos = start + potentialTable.offset;\n        }\n        if (!potentialTable || font.peekByte() === -1) {\n          (0, _util.warn)('Could not find a preferred cmap table.');\n          return {\n            platformId: -1,\n            encodingId: -1,\n            mappings: [],\n            hasShortCmap: false\n          };\n        }\n        var format = font.getUint16();\n        font.getUint16();\n        font.getUint16();\n        var hasShortCmap = false;\n        var mappings = [];\n        var j, glyphId;\n        if (format === 0) {\n          for (j = 0; j < 256; j++) {\n            var index = font.getByte();\n            if (!index) {\n              continue;\n            }\n            mappings.push({\n              charCode: j,\n              glyphId: index\n            });\n          }\n          hasShortCmap = true;\n        } else if (format === 4) {\n          var segCount = font.getUint16() >> 1;\n          font.getBytes(6);\n          var segIndex,\n              segments = [];\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segments.push({ end: font.getUint16() });\n          }\n          font.getUint16();\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segments[segIndex].start = font.getUint16();\n          }\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segments[segIndex].delta = font.getUint16();\n          }\n          var offsetsCount = 0;\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segment = segments[segIndex];\n            var rangeOffset = font.getUint16();\n            if (!rangeOffset) {\n              segment.offsetIndex = -1;\n              continue;\n            }\n            var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);\n            segment.offsetIndex = offsetIndex;\n            offsetsCount = Math.max(offsetsCount, offsetIndex + segment.end - segment.start + 1);\n          }\n          var offsets = [];\n          for (j = 0; j < offsetsCount; j++) {\n            offsets.push(font.getUint16());\n          }\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segment = segments[segIndex];\n            start = segment.start;\n            var end = segment.end;\n            var delta = segment.delta;\n            offsetIndex = segment.offsetIndex;\n            for (j = start; j <= end; j++) {\n              if (j === 0xFFFF) {\n                continue;\n              }\n              glyphId = offsetIndex < 0 ? j : offsets[offsetIndex + j - start];\n              glyphId = glyphId + delta & 0xFFFF;\n              mappings.push({\n                charCode: j,\n                glyphId: glyphId\n              });\n            }\n          }\n        } else if (format === 6) {\n          var firstCode = font.getUint16();\n          var entryCount = font.getUint16();\n          for (j = 0; j < entryCount; j++) {\n            glyphId = font.getUint16();\n            var charCode = firstCode + j;\n            mappings.push({\n              charCode: charCode,\n              glyphId: glyphId\n            });\n          }\n        } else {\n          (0, _util.warn)('cmap table has unsupported format: ' + format);\n          return {\n            platformId: -1,\n            encodingId: -1,\n            mappings: [],\n            hasShortCmap: false\n          };\n        }\n        mappings.sort(function (a, b) {\n          return a.charCode - b.charCode;\n        });\n        for (i = 1; i < mappings.length; i++) {\n          if (mappings[i - 1].charCode === mappings[i].charCode) {\n            mappings.splice(i, 1);\n            i--;\n          }\n        }\n        return {\n          platformId: potentialTable.platformId,\n          encodingId: potentialTable.encodingId,\n          mappings: mappings,\n          hasShortCmap: hasShortCmap\n        };\n      }\n      function sanitizeMetrics(font, header, metrics, numGlyphs) {\n        if (!header) {\n          if (metrics) {\n            metrics.data = null;\n          }\n          return;\n        }\n        font.pos = (font.start ? font.start : 0) + header.offset;\n        font.pos += header.length - 2;\n        var numOfMetrics = font.getUint16();\n        if (numOfMetrics > numGlyphs) {\n          (0, _util.info)('The numOfMetrics (' + numOfMetrics + ') should not be ' + 'greater than the numGlyphs (' + numGlyphs + ')');\n          numOfMetrics = numGlyphs;\n          header.data[34] = (numOfMetrics & 0xff00) >> 8;\n          header.data[35] = numOfMetrics & 0x00ff;\n        }\n        var numOfSidebearings = numGlyphs - numOfMetrics;\n        var numMissing = numOfSidebearings - (metrics.length - numOfMetrics * 4 >> 1);\n        if (numMissing > 0) {\n          var entries = new Uint8Array(metrics.length + numMissing * 2);\n          entries.set(metrics.data);\n          metrics.data = entries;\n        }\n      }\n      function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, hintsValid) {\n        if (sourceEnd - sourceStart <= 12) {\n          return 0;\n        }\n        var glyf = source.subarray(sourceStart, sourceEnd);\n        var contoursCount = glyf[0] << 8 | glyf[1];\n        if (contoursCount & 0x8000) {\n          dest.set(glyf, destStart);\n          return glyf.length;\n        }\n        var i,\n            j = 10,\n            flagsCount = 0;\n        for (i = 0; i < contoursCount; i++) {\n          var endPoint = glyf[j] << 8 | glyf[j + 1];\n          flagsCount = endPoint + 1;\n          j += 2;\n        }\n        var instructionsStart = j;\n        var instructionsLength = glyf[j] << 8 | glyf[j + 1];\n        j += 2 + instructionsLength;\n        var instructionsEnd = j;\n        var coordinatesLength = 0;\n        for (i = 0; i < flagsCount; i++) {\n          var flag = glyf[j++];\n          if (flag & 0xC0) {\n            glyf[j - 1] = flag & 0x3F;\n          }\n          var xyLength = (flag & 2 ? 1 : flag & 16 ? 0 : 2) + (flag & 4 ? 1 : flag & 32 ? 0 : 2);\n          coordinatesLength += xyLength;\n          if (flag & 8) {\n            var repeat = glyf[j++];\n            i += repeat;\n            coordinatesLength += repeat * xyLength;\n          }\n        }\n        if (coordinatesLength === 0) {\n          return 0;\n        }\n        var glyphDataLength = j + coordinatesLength;\n        if (glyphDataLength > glyf.length) {\n          return 0;\n        }\n        if (!hintsValid && instructionsLength > 0) {\n          dest.set(glyf.subarray(0, instructionsStart), destStart);\n          dest.set([0, 0], destStart + instructionsStart);\n          dest.set(glyf.subarray(instructionsEnd, glyphDataLength), destStart + instructionsStart + 2);\n          glyphDataLength -= instructionsLength;\n          if (glyf.length - glyphDataLength > 3) {\n            glyphDataLength = glyphDataLength + 3 & ~3;\n          }\n          return glyphDataLength;\n        }\n        if (glyf.length - glyphDataLength > 3) {\n          glyphDataLength = glyphDataLength + 3 & ~3;\n          dest.set(glyf.subarray(0, glyphDataLength), destStart);\n          return glyphDataLength;\n        }\n        dest.set(glyf, destStart);\n        return glyf.length;\n      }\n      function sanitizeHead(head, numGlyphs, locaLength) {\n        var data = head.data;\n        var version = int32(data[0], data[1], data[2], data[3]);\n        if (version >> 16 !== 1) {\n          (0, _util.info)('Attempting to fix invalid version in head table: ' + version);\n          data[0] = 0;\n          data[1] = 1;\n          data[2] = 0;\n          data[3] = 0;\n        }\n        var indexToLocFormat = int16(data[50], data[51]);\n        if (indexToLocFormat < 0 || indexToLocFormat > 1) {\n          (0, _util.info)('Attempting to fix invalid indexToLocFormat in head table: ' + indexToLocFormat);\n          var numGlyphsPlusOne = numGlyphs + 1;\n          if (locaLength === numGlyphsPlusOne << 1) {\n            data[50] = 0;\n            data[51] = 0;\n          } else if (locaLength === numGlyphsPlusOne << 2) {\n            data[50] = 0;\n            data[51] = 1;\n          } else {\n            throw new _util.FormatError('Could not fix indexToLocFormat: ' + indexToLocFormat);\n          }\n        }\n      }\n      function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry) {\n        var itemSize, itemDecode, itemEncode;\n        if (isGlyphLocationsLong) {\n          itemSize = 4;\n          itemDecode = function fontItemDecodeLong(data, offset) {\n            return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];\n          };\n          itemEncode = function fontItemEncodeLong(data, offset, value) {\n            data[offset] = value >>> 24 & 0xFF;\n            data[offset + 1] = value >> 16 & 0xFF;\n            data[offset + 2] = value >> 8 & 0xFF;\n            data[offset + 3] = value & 0xFF;\n          };\n        } else {\n          itemSize = 2;\n          itemDecode = function fontItemDecode(data, offset) {\n            return data[offset] << 9 | data[offset + 1] << 1;\n          };\n          itemEncode = function fontItemEncode(data, offset, value) {\n            data[offset] = value >> 9 & 0xFF;\n            data[offset + 1] = value >> 1 & 0xFF;\n          };\n        }\n        var locaData = loca.data;\n        var locaDataSize = itemSize * (1 + numGlyphs);\n        if (locaData.length !== locaDataSize) {\n          locaData = new Uint8Array(locaDataSize);\n          locaData.set(loca.data.subarray(0, locaDataSize));\n          loca.data = locaData;\n        }\n        var oldGlyfData = glyf.data;\n        var oldGlyfDataLength = oldGlyfData.length;\n        var newGlyfData = new Uint8Array(oldGlyfDataLength);\n        var startOffset = itemDecode(locaData, 0);\n        var writeOffset = 0;\n        var missingGlyphData = Object.create(null);\n        itemEncode(locaData, 0, writeOffset);\n        var i, j;\n        var locaCount = dupFirstEntry ? numGlyphs - 1 : numGlyphs;\n        for (i = 0, j = itemSize; i < locaCount; i++, j += itemSize) {\n          var endOffset = itemDecode(locaData, j);\n          if (endOffset > oldGlyfDataLength && (oldGlyfDataLength + 3 & ~3) === endOffset) {\n            endOffset = oldGlyfDataLength;\n          }\n          if (endOffset > oldGlyfDataLength) {\n            startOffset = endOffset;\n          }\n          var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset, newGlyfData, writeOffset, hintsValid);\n          if (newLength === 0) {\n            missingGlyphData[i] = true;\n          }\n          writeOffset += newLength;\n          itemEncode(locaData, j, writeOffset);\n          startOffset = endOffset;\n        }\n        if (writeOffset === 0) {\n          var simpleGlyph = new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);\n          for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {\n            itemEncode(locaData, j, simpleGlyph.length);\n          }\n          glyf.data = simpleGlyph;\n          return missingGlyphData;\n        }\n        if (dupFirstEntry) {\n          var firstEntryLength = itemDecode(locaData, itemSize);\n          if (newGlyfData.length > firstEntryLength + writeOffset) {\n            glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset);\n          } else {\n            glyf.data = new Uint8Array(firstEntryLength + writeOffset);\n            glyf.data.set(newGlyfData.subarray(0, writeOffset));\n          }\n          glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset);\n          itemEncode(loca.data, locaData.length - itemSize, writeOffset + firstEntryLength);\n        } else {\n          glyf.data = newGlyfData.subarray(0, writeOffset);\n        }\n        return missingGlyphData;\n      }\n      function readPostScriptTable(post, properties, maxpNumGlyphs) {\n        var start = (font.start ? font.start : 0) + post.offset;\n        font.pos = start;\n        var length = post.length,\n            end = start + length;\n        var version = font.getInt32();\n        font.getBytes(28);\n        var glyphNames;\n        var valid = true;\n        var i;\n        switch (version) {\n          case 0x00010000:\n            glyphNames = MacStandardGlyphOrdering;\n            break;\n          case 0x00020000:\n            var numGlyphs = font.getUint16();\n            if (numGlyphs !== maxpNumGlyphs) {\n              valid = false;\n              break;\n            }\n            var glyphNameIndexes = [];\n            for (i = 0; i < numGlyphs; ++i) {\n              var index = font.getUint16();\n              if (index >= 32768) {\n                valid = false;\n                break;\n              }\n              glyphNameIndexes.push(index);\n            }\n            if (!valid) {\n              break;\n            }\n            var customNames = [];\n            var strBuf = [];\n            while (font.pos < end) {\n              var stringLength = font.getByte();\n              strBuf.length = stringLength;\n              for (i = 0; i < stringLength; ++i) {\n                strBuf[i] = String.fromCharCode(font.getByte());\n              }\n              customNames.push(strBuf.join(''));\n            }\n            glyphNames = [];\n            for (i = 0; i < numGlyphs; ++i) {\n              var j = glyphNameIndexes[i];\n              if (j < 258) {\n                glyphNames.push(MacStandardGlyphOrdering[j]);\n                continue;\n              }\n              glyphNames.push(customNames[j - 258]);\n            }\n            break;\n          case 0x00030000:\n            break;\n          default:\n            (0, _util.warn)('Unknown/unsupported post table version ' + version);\n            valid = false;\n            if (properties.defaultEncoding) {\n              glyphNames = properties.defaultEncoding;\n            }\n            break;\n        }\n        properties.glyphNames = glyphNames;\n        return valid;\n      }\n      function readNameTable(nameTable) {\n        var start = (font.start ? font.start : 0) + nameTable.offset;\n        font.pos = start;\n        var names = [[], []];\n        var length = nameTable.length,\n            end = start + length;\n        var format = font.getUint16();\n        var FORMAT_0_HEADER_LENGTH = 6;\n        if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) {\n          return names;\n        }\n        var numRecords = font.getUint16();\n        var stringsStart = font.getUint16();\n        var records = [];\n        var NAME_RECORD_LENGTH = 12;\n        var i, ii;\n        for (i = 0; i < numRecords && font.pos + NAME_RECORD_LENGTH <= end; i++) {\n          var r = {\n            platform: font.getUint16(),\n            encoding: font.getUint16(),\n            language: font.getUint16(),\n            name: font.getUint16(),\n            length: font.getUint16(),\n            offset: font.getUint16()\n          };\n          if (r.platform === 1 && r.encoding === 0 && r.language === 0 || r.platform === 3 && r.encoding === 1 && r.language === 0x409) {\n            records.push(r);\n          }\n        }\n        for (i = 0, ii = records.length; i < ii; i++) {\n          var record = records[i];\n          if (record.length <= 0) {\n            continue;\n          }\n          var pos = start + stringsStart + record.offset;\n          if (pos + record.length > end) {\n            continue;\n          }\n          font.pos = pos;\n          var nameIndex = record.name;\n          if (record.encoding) {\n            var str = '';\n            for (var j = 0, jj = record.length; j < jj; j += 2) {\n              str += String.fromCharCode(font.getUint16());\n            }\n            names[1][nameIndex] = str;\n          } else {\n            names[0][nameIndex] = (0, _util.bytesToString)(font.getBytes(record.length));\n          }\n        }\n        return names;\n      }\n      var TTOpsStackDeltas = [0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, 0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2];\n      function sanitizeTTProgram(table, ttContext) {\n        var data = table.data;\n        var i = 0,\n            j,\n            n,\n            b,\n            funcId,\n            pc,\n            lastEndf = 0,\n            lastDeff = 0;\n        var stack = [];\n        var callstack = [];\n        var functionsCalled = [];\n        var tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions;\n        var inFDEF = false,\n            ifLevel = 0,\n            inELSE = 0;\n        for (var ii = data.length; i < ii;) {\n          var op = data[i++];\n          if (op === 0x40) {\n            n = data[i++];\n            if (inFDEF || inELSE) {\n              i += n;\n            } else {\n              for (j = 0; j < n; j++) {\n                stack.push(data[i++]);\n              }\n            }\n          } else if (op === 0x41) {\n            n = data[i++];\n            if (inFDEF || inELSE) {\n              i += n * 2;\n            } else {\n              for (j = 0; j < n; j++) {\n                b = data[i++];\n                stack.push(b << 8 | data[i++]);\n              }\n            }\n          } else if ((op & 0xF8) === 0xB0) {\n            n = op - 0xB0 + 1;\n            if (inFDEF || inELSE) {\n              i += n;\n            } else {\n              for (j = 0; j < n; j++) {\n                stack.push(data[i++]);\n              }\n            }\n          } else if ((op & 0xF8) === 0xB8) {\n            n = op - 0xB8 + 1;\n            if (inFDEF || inELSE) {\n              i += n * 2;\n            } else {\n              for (j = 0; j < n; j++) {\n                b = data[i++];\n                stack.push(b << 8 | data[i++]);\n              }\n            }\n          } else if (op === 0x2B && !tooComplexToFollowFunctions) {\n            if (!inFDEF && !inELSE) {\n              funcId = stack[stack.length - 1];\n              ttContext.functionsUsed[funcId] = true;\n              if (funcId in ttContext.functionsStackDeltas) {\n                stack.length += ttContext.functionsStackDeltas[funcId];\n              } else if (funcId in ttContext.functionsDefined && functionsCalled.indexOf(funcId) < 0) {\n                callstack.push({\n                  data: data,\n                  i: i,\n                  stackTop: stack.length - 1\n                });\n                functionsCalled.push(funcId);\n                pc = ttContext.functionsDefined[funcId];\n                if (!pc) {\n                  (0, _util.warn)('TT: CALL non-existent function');\n                  ttContext.hintsValid = false;\n                  return;\n                }\n                data = pc.data;\n                i = pc.i;\n              }\n            }\n          } else if (op === 0x2C && !tooComplexToFollowFunctions) {\n            if (inFDEF || inELSE) {\n              (0, _util.warn)('TT: nested FDEFs not allowed');\n              tooComplexToFollowFunctions = true;\n            }\n            inFDEF = true;\n            lastDeff = i;\n            funcId = stack.pop();\n            ttContext.functionsDefined[funcId] = {\n              data: data,\n              i: i\n            };\n          } else if (op === 0x2D) {\n            if (inFDEF) {\n              inFDEF = false;\n              lastEndf = i;\n            } else {\n              pc = callstack.pop();\n              if (!pc) {\n                (0, _util.warn)('TT: ENDF bad stack');\n                ttContext.hintsValid = false;\n                return;\n              }\n              funcId = functionsCalled.pop();\n              data = pc.data;\n              i = pc.i;\n              ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop;\n            }\n          } else if (op === 0x89) {\n            if (inFDEF || inELSE) {\n              (0, _util.warn)('TT: nested IDEFs not allowed');\n              tooComplexToFollowFunctions = true;\n            }\n            inFDEF = true;\n            lastDeff = i;\n          } else if (op === 0x58) {\n            ++ifLevel;\n          } else if (op === 0x1B) {\n            inELSE = ifLevel;\n          } else if (op === 0x59) {\n            if (inELSE === ifLevel) {\n              inELSE = 0;\n            }\n            --ifLevel;\n          } else if (op === 0x1C) {\n            if (!inFDEF && !inELSE) {\n              var offset = stack[stack.length - 1];\n              if (offset > 0) {\n                i += offset - 1;\n              }\n            }\n          }\n          if (!inFDEF && !inELSE) {\n            var stackDelta = op <= 0x8E ? TTOpsStackDeltas[op] : op >= 0xC0 && op <= 0xDF ? -1 : op >= 0xE0 ? -2 : 0;\n            if (op >= 0x71 && op <= 0x75) {\n              n = stack.pop();\n              if (!isNaN(n)) {\n                stackDelta = -n * 2;\n              }\n            }\n            while (stackDelta < 0 && stack.length > 0) {\n              stack.pop();\n              stackDelta++;\n            }\n            while (stackDelta > 0) {\n              stack.push(NaN);\n              stackDelta--;\n            }\n          }\n        }\n        ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions;\n        var content = [data];\n        if (i > data.length) {\n          content.push(new Uint8Array(i - data.length));\n        }\n        if (lastDeff > lastEndf) {\n          (0, _util.warn)('TT: complementing a missing function tail');\n          content.push(new Uint8Array([0x22, 0x2D]));\n        }\n        foldTTTable(table, content);\n      }\n      function checkInvalidFunctions(ttContext, maxFunctionDefs) {\n        if (ttContext.tooComplexToFollowFunctions) {\n          return;\n        }\n        if (ttContext.functionsDefined.length > maxFunctionDefs) {\n          (0, _util.warn)('TT: more functions defined than expected');\n          ttContext.hintsValid = false;\n          return;\n        }\n        for (var j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) {\n          if (j > maxFunctionDefs) {\n            (0, _util.warn)('TT: invalid function id: ' + j);\n            ttContext.hintsValid = false;\n            return;\n          }\n          if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) {\n            (0, _util.warn)('TT: undefined function: ' + j);\n            ttContext.hintsValid = false;\n            return;\n          }\n        }\n      }\n      function foldTTTable(table, content) {\n        if (content.length > 1) {\n          var newLength = 0;\n          var j, jj;\n          for (j = 0, jj = content.length; j < jj; j++) {\n            newLength += content[j].length;\n          }\n          newLength = newLength + 3 & ~3;\n          var result = new Uint8Array(newLength);\n          var pos = 0;\n          for (j = 0, jj = content.length; j < jj; j++) {\n            result.set(content[j], pos);\n            pos += content[j].length;\n          }\n          table.data = result;\n          table.length = newLength;\n        }\n      }\n      function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) {\n        var ttContext = {\n          functionsDefined: [],\n          functionsUsed: [],\n          functionsStackDeltas: [],\n          tooComplexToFollowFunctions: false,\n          hintsValid: true\n        };\n        if (fpgm) {\n          sanitizeTTProgram(fpgm, ttContext);\n        }\n        if (prep) {\n          sanitizeTTProgram(prep, ttContext);\n        }\n        if (fpgm) {\n          checkInvalidFunctions(ttContext, maxFunctionDefs);\n        }\n        if (cvt && cvt.length & 1) {\n          var cvtData = new Uint8Array(cvt.length + 1);\n          cvtData.set(cvt.data);\n          cvt.data = cvtData;\n        }\n        return ttContext.hintsValid;\n      }\n      font = new _stream.Stream(new Uint8Array(font.getBytes()));\n      var VALID_TABLES = ['OS/2', 'cmap', 'head', 'hhea', 'hmtx', 'maxp', 'name', 'post', 'loca', 'glyf', 'fpgm', 'prep', 'cvt ', 'CFF '];\n      var header = readOpenTypeHeader(font);\n      var numTables = header.numTables;\n      var cff, cffFile;\n      var tables = Object.create(null);\n      tables['OS/2'] = null;\n      tables['cmap'] = null;\n      tables['head'] = null;\n      tables['hhea'] = null;\n      tables['hmtx'] = null;\n      tables['maxp'] = null;\n      tables['name'] = null;\n      tables['post'] = null;\n      var table;\n      for (var i = 0; i < numTables; i++) {\n        table = readTableEntry(font);\n        if (VALID_TABLES.indexOf(table.tag) < 0) {\n          continue;\n        }\n        if (table.length === 0) {\n          continue;\n        }\n        tables[table.tag] = table;\n      }\n      var isTrueType = !tables['CFF '];\n      if (!isTrueType) {\n        if (header.version === 'OTTO' && !(properties.composite && properties.cidToGidMap) || !tables['head'] || !tables['hhea'] || !tables['maxp'] || !tables['post']) {\n          cffFile = new _stream.Stream(tables['CFF '].data);\n          cff = new CFFFont(cffFile, properties);\n          adjustWidths(properties);\n          return this.convert(name, cff, properties);\n        }\n        delete tables['glyf'];\n        delete tables['loca'];\n        delete tables['fpgm'];\n        delete tables['prep'];\n        delete tables['cvt '];\n        this.isOpenType = true;\n      } else {\n        if (!tables['loca']) {\n          throw new _util.FormatError('Required \"loca\" table is not found');\n        }\n        if (!tables['glyf']) {\n          (0, _util.warn)('Required \"glyf\" table is not found -- trying to recover.');\n          tables['glyf'] = {\n            tag: 'glyf',\n            data: new Uint8Array(0)\n          };\n        }\n        this.isOpenType = false;\n      }\n      if (!tables['maxp']) {\n        throw new _util.FormatError('Required \"maxp\" table is not found');\n      }\n      font.pos = (font.start || 0) + tables['maxp'].offset;\n      var version = font.getInt32();\n      var numGlyphs = font.getUint16();\n      var maxFunctionDefs = 0;\n      if (version >= 0x00010000 && tables['maxp'].length >= 22) {\n        font.pos += 8;\n        var maxZones = font.getUint16();\n        if (maxZones > 2) {\n          tables['maxp'].data[14] = 0;\n          tables['maxp'].data[15] = 2;\n        }\n        font.pos += 4;\n        maxFunctionDefs = font.getUint16();\n      }\n      var dupFirstEntry = false;\n      if (properties.type === 'CIDFontType2' && properties.toUnicode && properties.toUnicode.get(0) > '\\0') {\n        dupFirstEntry = true;\n        numGlyphs++;\n        tables['maxp'].data[4] = numGlyphs >> 8;\n        tables['maxp'].data[5] = numGlyphs & 255;\n      }\n      var hintsValid = sanitizeTTPrograms(tables['fpgm'], tables['prep'], tables['cvt '], maxFunctionDefs);\n      if (!hintsValid) {\n        delete tables['fpgm'];\n        delete tables['prep'];\n        delete tables['cvt '];\n      }\n      sanitizeMetrics(font, tables['hhea'], tables['hmtx'], numGlyphs);\n      if (!tables['head']) {\n        throw new _util.FormatError('Required \"head\" table is not found');\n      }\n      sanitizeHead(tables['head'], numGlyphs, isTrueType ? tables['loca'].length : 0);\n      var missingGlyphs = Object.create(null);\n      if (isTrueType) {\n        var isGlyphLocationsLong = int16(tables['head'].data[50], tables['head'].data[51]);\n        missingGlyphs = sanitizeGlyphLocations(tables['loca'], tables['glyf'], numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry);\n      }\n      if (!tables['hhea']) {\n        throw new _util.FormatError('Required \"hhea\" table is not found');\n      }\n      if (tables['hhea'].data[10] === 0 && tables['hhea'].data[11] === 0) {\n        tables['hhea'].data[10] = 0xFF;\n        tables['hhea'].data[11] = 0xFF;\n      }\n      var metricsOverride = {\n        unitsPerEm: int16(tables['head'].data[18], tables['head'].data[19]),\n        yMax: int16(tables['head'].data[42], tables['head'].data[43]),\n        yMin: signedInt16(tables['head'].data[38], tables['head'].data[39]),\n        ascent: int16(tables['hhea'].data[4], tables['hhea'].data[5]),\n        descent: signedInt16(tables['hhea'].data[6], tables['hhea'].data[7])\n      };\n      this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm;\n      this.descent = metricsOverride.descent / metricsOverride.unitsPerEm;\n      if (tables['post']) {\n        var valid = readPostScriptTable(tables['post'], properties, numGlyphs);\n        if (!valid) {\n          tables['post'] = null;\n        }\n      }\n      var charCodeToGlyphId = [],\n          charCode;\n      function hasGlyph(glyphId) {\n        return !missingGlyphs[glyphId];\n      }\n      if (properties.composite) {\n        var cidToGidMap = properties.cidToGidMap || [];\n        var isCidToGidMapEmpty = cidToGidMap.length === 0;\n        properties.cMap.forEach(function (charCode, cid) {\n          if (cid > 0xffff) {\n            throw new _util.FormatError('Max size of CID is 65,535');\n          }\n          var glyphId = -1;\n          if (isCidToGidMapEmpty) {\n            glyphId = cid;\n          } else if (cidToGidMap[cid] !== undefined) {\n            glyphId = cidToGidMap[cid];\n          }\n          if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId)) {\n            charCodeToGlyphId[charCode] = glyphId;\n          }\n        });\n        if (dupFirstEntry && (isCidToGidMapEmpty || !charCodeToGlyphId[0])) {\n          charCodeToGlyphId[0] = numGlyphs - 1;\n        }\n      } else {\n        var cmapTable = readCmapTable(tables['cmap'], font, this.isSymbolicFont, properties.hasEncoding);\n        var cmapPlatformId = cmapTable.platformId;\n        var cmapEncodingId = cmapTable.encodingId;\n        var cmapMappings = cmapTable.mappings;\n        var cmapMappingsLength = cmapMappings.length;\n        if (properties.hasEncoding && (cmapPlatformId === 3 && cmapEncodingId === 1 || cmapPlatformId === 1 && cmapEncodingId === 0) || cmapPlatformId === -1 && cmapEncodingId === -1 && !!(0, _encodings.getEncoding)(properties.baseEncodingName)) {\n          var baseEncoding = [];\n          if (properties.baseEncodingName === 'MacRomanEncoding' || properties.baseEncodingName === 'WinAnsiEncoding') {\n            baseEncoding = (0, _encodings.getEncoding)(properties.baseEncodingName);\n          }\n          var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n          for (charCode = 0; charCode < 256; charCode++) {\n            var glyphName, standardGlyphName;\n            if (this.differences && charCode in this.differences) {\n              glyphName = this.differences[charCode];\n            } else if (charCode in baseEncoding && baseEncoding[charCode] !== '') {\n              glyphName = baseEncoding[charCode];\n            } else {\n              glyphName = _encodings.StandardEncoding[charCode];\n            }\n            if (!glyphName) {\n              continue;\n            }\n            standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);\n            var unicodeOrCharCode;\n            if (cmapPlatformId === 3 && cmapEncodingId === 1) {\n              unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName];\n            } else if (cmapPlatformId === 1 && cmapEncodingId === 0) {\n              unicodeOrCharCode = _encodings.MacRomanEncoding.indexOf(standardGlyphName);\n            }\n            var found = false;\n            for (i = 0; i < cmapMappingsLength; ++i) {\n              if (cmapMappings[i].charCode !== unicodeOrCharCode) {\n                continue;\n              }\n              charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;\n              found = true;\n              break;\n            }\n            if (!found && properties.glyphNames) {\n              var glyphId = properties.glyphNames.indexOf(glyphName);\n              if (glyphId === -1 && standardGlyphName !== glyphName) {\n                glyphId = properties.glyphNames.indexOf(standardGlyphName);\n              }\n              if (glyphId > 0 && hasGlyph(glyphId)) {\n                charCodeToGlyphId[charCode] = glyphId;\n                found = true;\n              }\n            }\n          }\n        } else if (cmapPlatformId === 0 && cmapEncodingId === 0) {\n          for (i = 0; i < cmapMappingsLength; ++i) {\n            charCodeToGlyphId[cmapMappings[i].charCode] = cmapMappings[i].glyphId;\n          }\n        } else {\n          for (i = 0; i < cmapMappingsLength; ++i) {\n            charCode = cmapMappings[i].charCode;\n            if (cmapPlatformId === 3 && charCode >= 0xF000 && charCode <= 0xF0FF) {\n              charCode &= 0xFF;\n            }\n            charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;\n          }\n        }\n      }\n      if (charCodeToGlyphId.length === 0) {\n        charCodeToGlyphId[0] = 0;\n      }\n      var newMapping = adjustMapping(charCodeToGlyphId, properties, missingGlyphs);\n      this.toFontChar = newMapping.toFontChar;\n      tables['cmap'] = {\n        tag: 'cmap',\n        data: createCmapTable(newMapping.charCodeToGlyphId, numGlyphs)\n      };\n      if (!tables['OS/2'] || !validateOS2Table(tables['OS/2'])) {\n        tables['OS/2'] = {\n          tag: 'OS/2',\n          data: createOS2Table(properties, newMapping.charCodeToGlyphId, metricsOverride)\n        };\n      }\n      if (!tables['post']) {\n        tables['post'] = {\n          tag: 'post',\n          data: createPostTable(properties)\n        };\n      }\n      if (!isTrueType) {\n        try {\n          cffFile = new _stream.Stream(tables['CFF '].data);\n          var parser = new _cff_parser.CFFParser(cffFile, properties, SEAC_ANALYSIS_ENABLED);\n          cff = parser.parse();\n          var compiler = new _cff_parser.CFFCompiler(cff);\n          tables['CFF '].data = compiler.compile();\n        } catch (e) {\n          (0, _util.warn)('Failed to compile font ' + properties.loadedName);\n        }\n      }\n      if (!tables['name']) {\n        tables['name'] = {\n          tag: 'name',\n          data: createNameTable(this.name)\n        };\n      } else {\n        var namePrototype = readNameTable(tables['name']);\n        tables['name'].data = createNameTable(name, namePrototype);\n      }\n      var builder = new OpenTypeFileBuilder(header.version);\n      for (var tableTag in tables) {\n        builder.addTable(tableTag, tables[tableTag].data);\n      }\n      return builder.toArray();\n    },\n    convert: function Font_convert(fontName, font, properties) {\n      properties.fixedPitch = false;\n      if (properties.builtInEncoding) {\n        adjustToUnicode(properties, properties.builtInEncoding);\n      }\n      var mapping = font.getGlyphMapping(properties);\n      var newMapping = adjustMapping(mapping, properties, Object.create(null));\n      this.toFontChar = newMapping.toFontChar;\n      var numGlyphs = font.numGlyphs;\n      function getCharCodes(charCodeToGlyphId, glyphId) {\n        var charCodes = null;\n        for (var charCode in charCodeToGlyphId) {\n          if (glyphId === charCodeToGlyphId[charCode]) {\n            if (!charCodes) {\n              charCodes = [];\n            }\n            charCodes.push(charCode | 0);\n          }\n        }\n        return charCodes;\n      }\n      function createCharCode(charCodeToGlyphId, glyphId) {\n        for (var charCode in charCodeToGlyphId) {\n          if (glyphId === charCodeToGlyphId[charCode]) {\n            return charCode | 0;\n          }\n        }\n        newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = glyphId;\n        return newMapping.nextAvailableFontCharCode++;\n      }\n      var seacs = font.seacs;\n      if (SEAC_ANALYSIS_ENABLED && seacs && seacs.length) {\n        var matrix = properties.fontMatrix || _util.FONT_IDENTITY_MATRIX;\n        var charset = font.getCharset();\n        var seacMap = Object.create(null);\n        for (var glyphId in seacs) {\n          glyphId |= 0;\n          var seac = seacs[glyphId];\n          var baseGlyphName = _encodings.StandardEncoding[seac[2]];\n          var accentGlyphName = _encodings.StandardEncoding[seac[3]];\n          var baseGlyphId = charset.indexOf(baseGlyphName);\n          var accentGlyphId = charset.indexOf(accentGlyphName);\n          if (baseGlyphId < 0 || accentGlyphId < 0) {\n            continue;\n          }\n          var accentOffset = {\n            x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4],\n            y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5]\n          };\n          var charCodes = getCharCodes(mapping, glyphId);\n          if (!charCodes) {\n            continue;\n          }\n          for (var i = 0, ii = charCodes.length; i < ii; i++) {\n            var charCode = charCodes[i];\n            var charCodeToGlyphId = newMapping.charCodeToGlyphId;\n            var baseFontCharCode = createCharCode(charCodeToGlyphId, baseGlyphId);\n            var accentFontCharCode = createCharCode(charCodeToGlyphId, accentGlyphId);\n            seacMap[charCode] = {\n              baseFontCharCode: baseFontCharCode,\n              accentFontCharCode: accentFontCharCode,\n              accentOffset: accentOffset\n            };\n          }\n        }\n        properties.seacMap = seacMap;\n      }\n      var unitsPerEm = 1 / (properties.fontMatrix || _util.FONT_IDENTITY_MATRIX)[0];\n      var builder = new OpenTypeFileBuilder('\\x4F\\x54\\x54\\x4F');\n      builder.addTable('CFF ', font.data);\n      builder.addTable('OS/2', createOS2Table(properties, newMapping.charCodeToGlyphId));\n      builder.addTable('cmap', createCmapTable(newMapping.charCodeToGlyphId, numGlyphs));\n      builder.addTable('head', '\\x00\\x01\\x00\\x00' + '\\x00\\x00\\x10\\x00' + '\\x00\\x00\\x00\\x00' + '\\x5F\\x0F\\x3C\\xF5' + '\\x00\\x00' + safeString16(unitsPerEm) + '\\x00\\x00\\x00\\x00\\x9e\\x0b\\x7e\\x27' + '\\x00\\x00\\x00\\x00\\x9e\\x0b\\x7e\\x27' + '\\x00\\x00' + safeString16(properties.descent) + '\\x0F\\xFF' + safeString16(properties.ascent) + string16(properties.italicAngle ? 2 : 0) + '\\x00\\x11' + '\\x00\\x00' + '\\x00\\x00' + '\\x00\\x00');\n      builder.addTable('hhea', '\\x00\\x01\\x00\\x00' + safeString16(properties.ascent) + safeString16(properties.descent) + '\\x00\\x00' + '\\xFF\\xFF' + '\\x00\\x00' + '\\x00\\x00' + '\\x00\\x00' + safeString16(properties.capHeight) + safeString16(Math.tan(properties.italicAngle) * properties.xHeight) + '\\x00\\x00' + '\\x00\\x00' + '\\x00\\x00' + '\\x00\\x00' + '\\x00\\x00' + '\\x00\\x00' + string16(numGlyphs));\n      builder.addTable('hmtx', function fontFieldsHmtx() {\n        var charstrings = font.charstrings;\n        var cffWidths = font.cff ? font.cff.widths : null;\n        var hmtx = '\\x00\\x00\\x00\\x00';\n        for (var i = 1, ii = numGlyphs; i < ii; i++) {\n          var width = 0;\n          if (charstrings) {\n            var charstring = charstrings[i - 1];\n            width = 'width' in charstring ? charstring.width : 0;\n          } else if (cffWidths) {\n            width = Math.ceil(cffWidths[i] || 0);\n          }\n          hmtx += string16(width) + string16(0);\n        }\n        return hmtx;\n      }());\n      builder.addTable('maxp', '\\x00\\x00\\x50\\x00' + string16(numGlyphs));\n      builder.addTable('name', createNameTable(fontName));\n      builder.addTable('post', createPostTable(properties));\n      return builder.toArray();\n    },\n    get spaceWidth() {\n      if ('_shadowWidth' in this) {\n        return this._shadowWidth;\n      }\n      var possibleSpaceReplacements = ['space', 'minus', 'one', 'i', 'I'];\n      var width;\n      for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {\n        var glyphName = possibleSpaceReplacements[i];\n        if (glyphName in this.widths) {\n          width = this.widths[glyphName];\n          break;\n        }\n        var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n        var glyphUnicode = glyphsUnicodeMap[glyphName];\n        var charcode = 0;\n        if (this.composite) {\n          if (this.cMap.contains(glyphUnicode)) {\n            charcode = this.cMap.lookup(glyphUnicode);\n          }\n        }\n        if (!charcode && this.toUnicode) {\n          charcode = this.toUnicode.charCodeOf(glyphUnicode);\n        }\n        if (charcode <= 0) {\n          charcode = glyphUnicode;\n        }\n        width = this.widths[charcode];\n        if (width) {\n          break;\n        }\n      }\n      width = width || this.defaultWidth;\n      this._shadowWidth = width;\n      return width;\n    },\n    charToGlyph: function Font_charToGlyph(charcode, isSpace) {\n      var fontCharCode, width, operatorListId;\n      var widthCode = charcode;\n      if (this.cMap && this.cMap.contains(charcode)) {\n        widthCode = this.cMap.lookup(charcode);\n      }\n      width = this.widths[widthCode];\n      width = (0, _util.isNum)(width) ? width : this.defaultWidth;\n      var vmetric = this.vmetrics && this.vmetrics[widthCode];\n      var unicode = this.toUnicode.get(charcode) || charcode;\n      if (typeof unicode === 'number') {\n        unicode = String.fromCharCode(unicode);\n      }\n      var isInFont = charcode in this.toFontChar;\n      fontCharCode = this.toFontChar[charcode] || charcode;\n      if (this.missingFile) {\n        fontCharCode = (0, _unicode.mapSpecialUnicodeValues)(fontCharCode);\n      }\n      if (this.isType3Font) {\n        operatorListId = fontCharCode;\n      }\n      var accent = null;\n      if (this.seacMap && this.seacMap[charcode]) {\n        isInFont = true;\n        var seac = this.seacMap[charcode];\n        fontCharCode = seac.baseFontCharCode;\n        accent = {\n          fontChar: String.fromCharCode(seac.accentFontCharCode),\n          offset: seac.accentOffset\n        };\n      }\n      var fontChar = String.fromCharCode(fontCharCode);\n      var glyph = this.glyphCache[charcode];\n      if (!glyph || !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont)) {\n        glyph = new Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont);\n        this.glyphCache[charcode] = glyph;\n      }\n      return glyph;\n    },\n    charsToGlyphs: function Font_charsToGlyphs(chars) {\n      var charsCache = this.charsCache;\n      var glyphs, glyph, charcode;\n      if (charsCache) {\n        glyphs = charsCache[chars];\n        if (glyphs) {\n          return glyphs;\n        }\n      }\n      if (!charsCache) {\n        charsCache = this.charsCache = Object.create(null);\n      }\n      glyphs = [];\n      var charsCacheKey = chars;\n      var i = 0,\n          ii;\n      if (this.cMap) {\n        var c = Object.create(null);\n        while (i < chars.length) {\n          this.cMap.readCharCode(chars, i, c);\n          charcode = c.charcode;\n          var length = c.length;\n          i += length;\n          var isSpace = length === 1 && chars.charCodeAt(i - 1) === 0x20;\n          glyph = this.charToGlyph(charcode, isSpace);\n          glyphs.push(glyph);\n        }\n      } else {\n        for (i = 0, ii = chars.length; i < ii; ++i) {\n          charcode = chars.charCodeAt(i);\n          glyph = this.charToGlyph(charcode, charcode === 0x20);\n          glyphs.push(glyph);\n        }\n      }\n      return charsCache[charsCacheKey] = glyphs;\n    }\n  };\n  return Font;\n}();\nvar ErrorFont = function ErrorFontClosure() {\n  function ErrorFont(error) {\n    this.error = error;\n    this.loadedName = 'g_font_error';\n    this.loading = false;\n  }\n  ErrorFont.prototype = {\n    charsToGlyphs: function ErrorFont_charsToGlyphs() {\n      return [];\n    },\n    exportData: function ErrorFont_exportData() {\n      return { error: this.error };\n    }\n  };\n  return ErrorFont;\n}();\nfunction type1FontGlyphMapping(properties, builtInEncoding, glyphNames) {\n  var charCodeToGlyphId = Object.create(null);\n  var glyphId, charCode, baseEncoding;\n  var isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);\n  if (properties.baseEncodingName) {\n    baseEncoding = (0, _encodings.getEncoding)(properties.baseEncodingName);\n    for (charCode = 0; charCode < baseEncoding.length; charCode++) {\n      glyphId = glyphNames.indexOf(baseEncoding[charCode]);\n      if (glyphId >= 0) {\n        charCodeToGlyphId[charCode] = glyphId;\n      } else {\n        charCodeToGlyphId[charCode] = 0;\n      }\n    }\n  } else if (isSymbolicFont) {\n    for (charCode in builtInEncoding) {\n      charCodeToGlyphId[charCode] = builtInEncoding[charCode];\n    }\n  } else {\n    baseEncoding = _encodings.StandardEncoding;\n    for (charCode = 0; charCode < baseEncoding.length; charCode++) {\n      glyphId = glyphNames.indexOf(baseEncoding[charCode]);\n      if (glyphId >= 0) {\n        charCodeToGlyphId[charCode] = glyphId;\n      } else {\n        charCodeToGlyphId[charCode] = 0;\n      }\n    }\n  }\n  var differences = properties.differences,\n      glyphsUnicodeMap;\n  if (differences) {\n    for (charCode in differences) {\n      var glyphName = differences[charCode];\n      glyphId = glyphNames.indexOf(glyphName);\n      if (glyphId === -1) {\n        if (!glyphsUnicodeMap) {\n          glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();\n        }\n        var standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);\n        if (standardGlyphName !== glyphName) {\n          glyphId = glyphNames.indexOf(standardGlyphName);\n        }\n      }\n      if (glyphId >= 0) {\n        charCodeToGlyphId[charCode] = glyphId;\n      } else {\n        charCodeToGlyphId[charCode] = 0;\n      }\n    }\n  }\n  return charCodeToGlyphId;\n}\nvar Type1Font = function Type1FontClosure() {\n  function findBlock(streamBytes, signature, startIndex) {\n    var streamBytesLength = streamBytes.length;\n    var signatureLength = signature.length;\n    var scanLength = streamBytesLength - signatureLength;\n    var i = startIndex,\n        j,\n        found = false;\n    while (i < scanLength) {\n      j = 0;\n      while (j < signatureLength && streamBytes[i + j] === signature[j]) {\n        j++;\n      }\n      if (j >= signatureLength) {\n        i += j;\n        while (i < streamBytesLength && (0, _util.isSpace)(streamBytes[i])) {\n          i++;\n        }\n        found = true;\n        break;\n      }\n      i++;\n    }\n    return {\n      found: found,\n      length: i\n    };\n  }\n  function getHeaderBlock(stream, suggestedLength) {\n    var EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63];\n    var streamStartPos = stream.pos;\n    var headerBytes, headerBytesLength, block;\n    try {\n      headerBytes = stream.getBytes(suggestedLength);\n      headerBytesLength = headerBytes.length;\n    } catch (ex) {\n      if (ex instanceof _util.MissingDataException) {\n        throw ex;\n      }\n    }\n    if (headerBytesLength === suggestedLength) {\n      block = findBlock(headerBytes, EEXEC_SIGNATURE, suggestedLength - 2 * EEXEC_SIGNATURE.length);\n      if (block.found && block.length === suggestedLength) {\n        return {\n          stream: new _stream.Stream(headerBytes),\n          length: suggestedLength\n        };\n      }\n    }\n    (0, _util.warn)('Invalid \"Length1\" property in Type1 font -- trying to recover.');\n    stream.pos = streamStartPos;\n    var SCAN_BLOCK_LENGTH = 2048;\n    var actualLength;\n    while (true) {\n      var scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);\n      block = findBlock(scanBytes, EEXEC_SIGNATURE, 0);\n      if (block.length === 0) {\n        break;\n      }\n      stream.pos += block.length;\n      if (block.found) {\n        actualLength = stream.pos - streamStartPos;\n        break;\n      }\n    }\n    stream.pos = streamStartPos;\n    if (actualLength) {\n      return {\n        stream: new _stream.Stream(stream.getBytes(actualLength)),\n        length: actualLength\n      };\n    }\n    (0, _util.warn)('Unable to recover \"Length1\" property in Type1 font -- using as is.');\n    return {\n      stream: new _stream.Stream(stream.getBytes(suggestedLength)),\n      length: suggestedLength\n    };\n  }\n  function getEexecBlock(stream, suggestedLength) {\n    var eexecBytes = stream.getBytes();\n    return {\n      stream: new _stream.Stream(eexecBytes),\n      length: eexecBytes.length\n    };\n  }\n  function Type1Font(name, file, properties) {\n    var PFB_HEADER_SIZE = 6;\n    var headerBlockLength = properties.length1;\n    var eexecBlockLength = properties.length2;\n    var pfbHeader = file.peekBytes(PFB_HEADER_SIZE);\n    var pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01;\n    if (pfbHeaderPresent) {\n      file.skip(PFB_HEADER_SIZE);\n      headerBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];\n    }\n    var headerBlock = getHeaderBlock(file, headerBlockLength);\n    headerBlockLength = headerBlock.length;\n    var headerBlockParser = new _type1_parser.Type1Parser(headerBlock.stream, false, SEAC_ANALYSIS_ENABLED);\n    headerBlockParser.extractFontHeader(properties);\n    if (pfbHeaderPresent) {\n      pfbHeader = file.getBytes(PFB_HEADER_SIZE);\n      eexecBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];\n    }\n    var eexecBlock = getEexecBlock(file, eexecBlockLength);\n    eexecBlockLength = eexecBlock.length;\n    var eexecBlockParser = new _type1_parser.Type1Parser(eexecBlock.stream, true, SEAC_ANALYSIS_ENABLED);\n    var data = eexecBlockParser.extractFontProgram();\n    for (var info in data.properties) {\n      properties[info] = data.properties[info];\n    }\n    var charstrings = data.charstrings;\n    var type2Charstrings = this.getType2Charstrings(charstrings);\n    var subrs = this.getType2Subrs(data.subrs);\n    this.charstrings = charstrings;\n    this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties);\n    this.seacs = this.getSeacs(data.charstrings);\n  }\n  Type1Font.prototype = {\n    get numGlyphs() {\n      return this.charstrings.length + 1;\n    },\n    getCharset: function Type1Font_getCharset() {\n      var charset = ['.notdef'];\n      var charstrings = this.charstrings;\n      for (var glyphId = 0; glyphId < charstrings.length; glyphId++) {\n        charset.push(charstrings[glyphId].glyphName);\n      }\n      return charset;\n    },\n    getGlyphMapping: function Type1Font_getGlyphMapping(properties) {\n      var charstrings = this.charstrings;\n      var glyphNames = ['.notdef'],\n          glyphId;\n      for (glyphId = 0; glyphId < charstrings.length; glyphId++) {\n        glyphNames.push(charstrings[glyphId].glyphName);\n      }\n      var encoding = properties.builtInEncoding;\n      if (encoding) {\n        var builtInEncoding = Object.create(null);\n        for (var charCode in encoding) {\n          glyphId = glyphNames.indexOf(encoding[charCode]);\n          if (glyphId >= 0) {\n            builtInEncoding[charCode] = glyphId;\n          }\n        }\n      }\n      return type1FontGlyphMapping(properties, builtInEncoding, glyphNames);\n    },\n    getSeacs: function Type1Font_getSeacs(charstrings) {\n      var i, ii;\n      var seacMap = [];\n      for (i = 0, ii = charstrings.length; i < ii; i++) {\n        var charstring = charstrings[i];\n        if (charstring.seac) {\n          seacMap[i + 1] = charstring.seac;\n        }\n      }\n      return seacMap;\n    },\n    getType2Charstrings: function Type1Font_getType2Charstrings(type1Charstrings) {\n      var type2Charstrings = [];\n      for (var i = 0, ii = type1Charstrings.length; i < ii; i++) {\n        type2Charstrings.push(type1Charstrings[i].charstring);\n      }\n      return type2Charstrings;\n    },\n    getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {\n      var bias = 0;\n      var count = type1Subrs.length;\n      if (count < 1133) {\n        bias = 107;\n      } else if (count < 33769) {\n        bias = 1131;\n      } else {\n        bias = 32768;\n      }\n      var type2Subrs = [];\n      var i;\n      for (i = 0; i < bias; i++) {\n        type2Subrs.push([0x0B]);\n      }\n      for (i = 0; i < count; i++) {\n        type2Subrs.push(type1Subrs[i]);\n      }\n      return type2Subrs;\n    },\n    wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) {\n      var cff = new _cff_parser.CFF();\n      cff.header = new _cff_parser.CFFHeader(1, 0, 4, 4);\n      cff.names = [name];\n      var topDict = new _cff_parser.CFFTopDict();\n      topDict.setByName('version', 391);\n      topDict.setByName('Notice', 392);\n      topDict.setByName('FullName', 393);\n      topDict.setByName('FamilyName', 394);\n      topDict.setByName('Weight', 395);\n      topDict.setByName('Encoding', null);\n      topDict.setByName('FontMatrix', properties.fontMatrix);\n      topDict.setByName('FontBBox', properties.bbox);\n      topDict.setByName('charset', null);\n      topDict.setByName('CharStrings', null);\n      topDict.setByName('Private', null);\n      cff.topDict = topDict;\n      var strings = new _cff_parser.CFFStrings();\n      strings.add('Version 0.11');\n      strings.add('See original notice');\n      strings.add(name);\n      strings.add(name);\n      strings.add('Medium');\n      cff.strings = strings;\n      cff.globalSubrIndex = new _cff_parser.CFFIndex();\n      var count = glyphs.length;\n      var charsetArray = [0];\n      var i, ii;\n      for (i = 0; i < count; i++) {\n        var index = _cff_parser.CFFStandardStrings.indexOf(charstrings[i].glyphName);\n        if (index === -1) {\n          index = 0;\n        }\n        charsetArray.push(index >> 8 & 0xff, index & 0xff);\n      }\n      cff.charset = new _cff_parser.CFFCharset(false, 0, [], charsetArray);\n      var charStringsIndex = new _cff_parser.CFFIndex();\n      charStringsIndex.add([0x8B, 0x0E]);\n      for (i = 0; i < count; i++) {\n        var glyph = glyphs[i];\n        if (glyph.length === 0) {\n          charStringsIndex.add([0x8B, 0x0E]);\n          continue;\n        }\n        charStringsIndex.add(glyph);\n      }\n      cff.charStrings = charStringsIndex;\n      var privateDict = new _cff_parser.CFFPrivateDict();\n      privateDict.setByName('Subrs', null);\n      var fields = ['BlueValues', 'OtherBlues', 'FamilyBlues', 'FamilyOtherBlues', 'StemSnapH', 'StemSnapV', 'BlueShift', 'BlueFuzz', 'BlueScale', 'LanguageGroup', 'ExpansionFactor', 'ForceBold', 'StdHW', 'StdVW'];\n      for (i = 0, ii = fields.length; i < ii; i++) {\n        var field = fields[i];\n        if (!(field in properties.privateData)) {\n          continue;\n        }\n        var value = properties.privateData[field];\n        if ((0, _util.isArray)(value)) {\n          for (var j = value.length - 1; j > 0; j--) {\n            value[j] -= value[j - 1];\n          }\n        }\n        privateDict.setByName(field, value);\n      }\n      cff.topDict.privateDict = privateDict;\n      var subrIndex = new _cff_parser.CFFIndex();\n      for (i = 0, ii = subrs.length; i < ii; i++) {\n        subrIndex.add(subrs[i]);\n      }\n      privateDict.subrsIndex = subrIndex;\n      var compiler = new _cff_parser.CFFCompiler(cff);\n      return compiler.compile();\n    }\n  };\n  return Type1Font;\n}();\nvar CFFFont = function CFFFontClosure() {\n  function CFFFont(file, properties) {\n    this.properties = properties;\n    var parser = new _cff_parser.CFFParser(file, properties, SEAC_ANALYSIS_ENABLED);\n    this.cff = parser.parse();\n    var compiler = new _cff_parser.CFFCompiler(this.cff);\n    this.seacs = this.cff.seacs;\n    try {\n      this.data = compiler.compile();\n    } catch (e) {\n      (0, _util.warn)('Failed to compile font ' + properties.loadedName);\n      this.data = file;\n    }\n  }\n  CFFFont.prototype = {\n    get numGlyphs() {\n      return this.cff.charStrings.count;\n    },\n    getCharset: function CFFFont_getCharset() {\n      return this.cff.charset.charset;\n    },\n    getGlyphMapping: function CFFFont_getGlyphMapping() {\n      var cff = this.cff;\n      var properties = this.properties;\n      var charsets = cff.charset.charset;\n      var charCodeToGlyphId;\n      var glyphId;\n      if (properties.composite) {\n        charCodeToGlyphId = Object.create(null);\n        if (cff.isCIDFont) {\n          for (glyphId = 0; glyphId < charsets.length; glyphId++) {\n            var cid = charsets[glyphId];\n            var charCode = properties.cMap.charCodeOf(cid);\n            charCodeToGlyphId[charCode] = glyphId;\n          }\n        } else {\n          for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) {\n            charCodeToGlyphId[glyphId] = glyphId;\n          }\n        }\n        return charCodeToGlyphId;\n      }\n      var encoding = cff.encoding ? cff.encoding.encoding : null;\n      charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets);\n      return charCodeToGlyphId;\n    }\n  };\n  return CFFFont;\n}();\n(function checkSeacSupport() {\n  if (typeof navigator !== 'undefined' && /Windows/.test(navigator.userAgent)) {\n    exports.SEAC_ANALYSIS_ENABLED = SEAC_ANALYSIS_ENABLED = true;\n  }\n})();\n(function checkChromeWindows() {\n  if (typeof navigator !== 'undefined' && /Windows.*Chrome/.test(navigator.userAgent)) {\n    SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = true;\n  }\n})();\nexports.SEAC_ANALYSIS_ENABLED = SEAC_ANALYSIS_ENABLED;\nexports.PRIVATE_USE_OFFSET_START = PRIVATE_USE_OFFSET_START;\nexports.PRIVATE_USE_OFFSET_END = PRIVATE_USE_OFFSET_END;\nexports.ErrorFont = ErrorFont;\nexports.Font = Font;\nexports.FontFlags = FontFlags;\nexports.ToUnicodeMap = ToUnicodeMap;\nexports.IdentityToUnicodeMap = IdentityToUnicodeMap;\nexports.ProblematicCharRanges = ProblematicCharRanges;\nexports.getFontType = getFontType;\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PDFImage = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _colorspace = __w_pdfjs_require__(3);\n\nvar _jpx = __w_pdfjs_require__(14);\n\nvar PDFImage = function PDFImageClosure() {\n  function handleImageData(image, nativeDecoder) {\n    if (nativeDecoder && nativeDecoder.canDecode(image)) {\n      return nativeDecoder.decode(image);\n    }\n    return Promise.resolve(image);\n  }\n  function decodeAndClamp(value, addend, coefficient, max) {\n    value = addend + value * coefficient;\n    return value < 0 ? 0 : value > max ? max : value;\n  }\n  function resizeImageMask(src, bpc, w1, h1, w2, h2) {\n    var length = w2 * h2;\n    var dest = bpc <= 8 ? new Uint8Array(length) : bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);\n    var xRatio = w1 / w2;\n    var yRatio = h1 / h2;\n    var i,\n        j,\n        py,\n        newIndex = 0,\n        oldIndex;\n    var xScaled = new Uint16Array(w2);\n    var w1Scanline = w1;\n    for (i = 0; i < w2; i++) {\n      xScaled[i] = Math.floor(i * xRatio);\n    }\n    for (i = 0; i < h2; i++) {\n      py = Math.floor(i * yRatio) * w1Scanline;\n      for (j = 0; j < w2; j++) {\n        oldIndex = py + xScaled[j];\n        dest[newIndex++] = src[oldIndex];\n      }\n    }\n    return dest;\n  }\n  function PDFImage(xref, res, image, inline, smask, mask, isMask) {\n    this.image = image;\n    var dict = image.dict;\n    if (dict.has('Filter')) {\n      var filter = dict.get('Filter').name;\n      if (filter === 'JPXDecode') {\n        var jpxImage = new _jpx.JpxImage();\n        jpxImage.parseImageProperties(image.stream);\n        image.stream.reset();\n        image.bitsPerComponent = jpxImage.bitsPerComponent;\n        image.numComps = jpxImage.componentsCount;\n      } else if (filter === 'JBIG2Decode') {\n        image.bitsPerComponent = 1;\n        image.numComps = 1;\n      }\n    }\n    this.width = dict.get('Width', 'W');\n    this.height = dict.get('Height', 'H');\n    if (this.width < 1 || this.height < 1) {\n      throw new _util.FormatError('Invalid image width: ' + this.width + ' or ' + ('height: ' + this.height));\n    }\n    this.interpolate = dict.get('Interpolate', 'I') || false;\n    this.imageMask = dict.get('ImageMask', 'IM') || false;\n    this.matte = dict.get('Matte') || false;\n    var bitsPerComponent = image.bitsPerComponent;\n    if (!bitsPerComponent) {\n      bitsPerComponent = dict.get('BitsPerComponent', 'BPC');\n      if (!bitsPerComponent) {\n        if (this.imageMask) {\n          bitsPerComponent = 1;\n        } else {\n          throw new _util.FormatError('Bits per component missing in image: ' + this.imageMask);\n        }\n      }\n    }\n    this.bpc = bitsPerComponent;\n    if (!this.imageMask) {\n      var colorSpace = dict.get('ColorSpace', 'CS');\n      if (!colorSpace) {\n        (0, _util.info)('JPX images (which do not require color spaces)');\n        switch (image.numComps) {\n          case 1:\n            colorSpace = _primitives.Name.get('DeviceGray');\n            break;\n          case 3:\n            colorSpace = _primitives.Name.get('DeviceRGB');\n            break;\n          case 4:\n            colorSpace = _primitives.Name.get('DeviceCMYK');\n            break;\n          default:\n            throw new Error('JPX images with ' + this.numComps + ' ' + 'color components not supported.');\n        }\n      }\n      this.colorSpace = _colorspace.ColorSpace.parse(colorSpace, xref, res);\n      this.numComps = this.colorSpace.numComps;\n    }\n    this.decode = dict.getArray('Decode', 'D');\n    this.needsDecode = false;\n    if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode) || isMask && !_colorspace.ColorSpace.isDefaultDecode(this.decode, 1))) {\n      this.needsDecode = true;\n      var max = (1 << bitsPerComponent) - 1;\n      this.decodeCoefficients = [];\n      this.decodeAddends = [];\n      for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {\n        var dmin = this.decode[i];\n        var dmax = this.decode[i + 1];\n        this.decodeCoefficients[j] = dmax - dmin;\n        this.decodeAddends[j] = max * dmin;\n      }\n    }\n    if (smask) {\n      this.smask = new PDFImage(xref, res, smask, false);\n    } else if (mask) {\n      if ((0, _primitives.isStream)(mask)) {\n        var maskDict = mask.dict,\n            imageMask = maskDict.get('ImageMask', 'IM');\n        if (!imageMask) {\n          (0, _util.warn)('Ignoring /Mask in image without /ImageMask.');\n        } else {\n          this.mask = new PDFImage(xref, res, mask, false, null, null, true);\n        }\n      } else {\n        this.mask = mask;\n      }\n    }\n  }\n  PDFImage.buildImage = function PDFImage_buildImage(handler, xref, res, image, inline, nativeDecoder) {\n    var imagePromise = handleImageData(image, nativeDecoder);\n    var smaskPromise;\n    var maskPromise;\n    var smask = image.dict.get('SMask');\n    var mask = image.dict.get('Mask');\n    if (smask) {\n      smaskPromise = handleImageData(smask, nativeDecoder);\n      maskPromise = Promise.resolve(null);\n    } else {\n      smaskPromise = Promise.resolve(null);\n      if (mask) {\n        if ((0, _primitives.isStream)(mask)) {\n          maskPromise = handleImageData(mask, nativeDecoder);\n        } else if ((0, _util.isArray)(mask)) {\n          maskPromise = Promise.resolve(mask);\n        } else {\n          (0, _util.warn)('Unsupported mask format.');\n          maskPromise = Promise.resolve(null);\n        }\n      } else {\n        maskPromise = Promise.resolve(null);\n      }\n    }\n    return Promise.all([imagePromise, smaskPromise, maskPromise]).then(function (results) {\n      var imageData = results[0];\n      var smaskData = results[1];\n      var maskData = results[2];\n      return new PDFImage(xref, res, imageData, inline, smaskData, maskData);\n    });\n  };\n  PDFImage.createMask = function PDFImage_createMask(imgArray, width, height, imageIsFromDecodeStream, inverseDecode) {\n    var computedLength = (width + 7 >> 3) * height;\n    var actualLength = imgArray.byteLength;\n    var haveFullData = computedLength === actualLength;\n    var data, i;\n    if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) {\n      data = imgArray;\n    } else if (!inverseDecode) {\n      data = new Uint8Array(actualLength);\n      data.set(imgArray);\n    } else {\n      data = new Uint8Array(computedLength);\n      data.set(imgArray);\n      for (i = actualLength; i < computedLength; i++) {\n        data[i] = 0xff;\n      }\n    }\n    if (inverseDecode) {\n      for (i = 0; i < actualLength; i++) {\n        data[i] = ~data[i];\n      }\n    }\n    return {\n      data: data,\n      width: width,\n      height: height\n    };\n  };\n  PDFImage.prototype = {\n    get drawWidth() {\n      return Math.max(this.width, this.smask && this.smask.width || 0, this.mask && this.mask.width || 0);\n    },\n    get drawHeight() {\n      return Math.max(this.height, this.smask && this.smask.height || 0, this.mask && this.mask.height || 0);\n    },\n    decodeBuffer: function PDFImage_decodeBuffer(buffer) {\n      var bpc = this.bpc;\n      var numComps = this.numComps;\n      var decodeAddends = this.decodeAddends;\n      var decodeCoefficients = this.decodeCoefficients;\n      var max = (1 << bpc) - 1;\n      var i, ii;\n      if (bpc === 1) {\n        for (i = 0, ii = buffer.length; i < ii; i++) {\n          buffer[i] = +!buffer[i];\n        }\n        return;\n      }\n      var index = 0;\n      for (i = 0, ii = this.width * this.height; i < ii; i++) {\n        for (var j = 0; j < numComps; j++) {\n          buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max);\n          index++;\n        }\n      }\n    },\n    getComponents: function PDFImage_getComponents(buffer) {\n      var bpc = this.bpc;\n      if (bpc === 8) {\n        return buffer;\n      }\n      var width = this.width;\n      var height = this.height;\n      var numComps = this.numComps;\n      var length = width * height * numComps;\n      var bufferPos = 0;\n      var output = bpc <= 8 ? new Uint8Array(length) : bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);\n      var rowComps = width * numComps;\n      var max = (1 << bpc) - 1;\n      var i = 0,\n          ii,\n          buf;\n      if (bpc === 1) {\n        var mask, loop1End, loop2End;\n        for (var j = 0; j < height; j++) {\n          loop1End = i + (rowComps & ~7);\n          loop2End = i + rowComps;\n          while (i < loop1End) {\n            buf = buffer[bufferPos++];\n            output[i] = buf >> 7 & 1;\n            output[i + 1] = buf >> 6 & 1;\n            output[i + 2] = buf >> 5 & 1;\n            output[i + 3] = buf >> 4 & 1;\n            output[i + 4] = buf >> 3 & 1;\n            output[i + 5] = buf >> 2 & 1;\n            output[i + 6] = buf >> 1 & 1;\n            output[i + 7] = buf & 1;\n            i += 8;\n          }\n          if (i < loop2End) {\n            buf = buffer[bufferPos++];\n            mask = 128;\n            while (i < loop2End) {\n              output[i++] = +!!(buf & mask);\n              mask >>= 1;\n            }\n          }\n        }\n      } else {\n        var bits = 0;\n        buf = 0;\n        for (i = 0, ii = length; i < ii; ++i) {\n          if (i % rowComps === 0) {\n            buf = 0;\n            bits = 0;\n          }\n          while (bits < bpc) {\n            buf = buf << 8 | buffer[bufferPos++];\n            bits += 8;\n          }\n          var remainingBits = bits - bpc;\n          var value = buf >> remainingBits;\n          output[i] = value < 0 ? 0 : value > max ? max : value;\n          buf = buf & (1 << remainingBits) - 1;\n          bits = remainingBits;\n        }\n      }\n      return output;\n    },\n    fillOpacity: function PDFImage_fillOpacity(rgbaBuf, width, height, actualHeight, image) {\n      var smask = this.smask;\n      var mask = this.mask;\n      var alphaBuf, sw, sh, i, ii, j;\n      if (smask) {\n        sw = smask.width;\n        sh = smask.height;\n        alphaBuf = new Uint8Array(sw * sh);\n        smask.fillGrayBuffer(alphaBuf);\n        if (sw !== width || sh !== height) {\n          alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height);\n        }\n      } else if (mask) {\n        if (mask instanceof PDFImage) {\n          sw = mask.width;\n          sh = mask.height;\n          alphaBuf = new Uint8Array(sw * sh);\n          mask.numComps = 1;\n          mask.fillGrayBuffer(alphaBuf);\n          for (i = 0, ii = sw * sh; i < ii; ++i) {\n            alphaBuf[i] = 255 - alphaBuf[i];\n          }\n          if (sw !== width || sh !== height) {\n            alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height);\n          }\n        } else if ((0, _util.isArray)(mask)) {\n          alphaBuf = new Uint8Array(width * height);\n          var numComps = this.numComps;\n          for (i = 0, ii = width * height; i < ii; ++i) {\n            var opacity = 0;\n            var imageOffset = i * numComps;\n            for (j = 0; j < numComps; ++j) {\n              var color = image[imageOffset + j];\n              var maskOffset = j * 2;\n              if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {\n                opacity = 255;\n                break;\n              }\n            }\n            alphaBuf[i] = opacity;\n          }\n        } else {\n          throw new _util.FormatError('Unknown mask format.');\n        }\n      }\n      if (alphaBuf) {\n        for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {\n          rgbaBuf[j] = alphaBuf[i];\n        }\n      } else {\n        for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {\n          rgbaBuf[j] = 255;\n        }\n      }\n    },\n    undoPreblend: function PDFImage_undoPreblend(buffer, width, height) {\n      var matte = this.smask && this.smask.matte;\n      if (!matte) {\n        return;\n      }\n      var matteRgb = this.colorSpace.getRgb(matte, 0);\n      var matteR = matteRgb[0];\n      var matteG = matteRgb[1];\n      var matteB = matteRgb[2];\n      var length = width * height * 4;\n      var r, g, b;\n      for (var i = 0; i < length; i += 4) {\n        var alpha = buffer[i + 3];\n        if (alpha === 0) {\n          buffer[i] = 255;\n          buffer[i + 1] = 255;\n          buffer[i + 2] = 255;\n          continue;\n        }\n        var k = 255 / alpha;\n        r = (buffer[i] - matteR) * k + matteR;\n        g = (buffer[i + 1] - matteG) * k + matteG;\n        b = (buffer[i + 2] - matteB) * k + matteB;\n        buffer[i] = r <= 0 ? 0 : r >= 255 ? 255 : r | 0;\n        buffer[i + 1] = g <= 0 ? 0 : g >= 255 ? 255 : g | 0;\n        buffer[i + 2] = b <= 0 ? 0 : b >= 255 ? 255 : b | 0;\n      }\n    },\n    createImageData: function PDFImage_createImageData(forceRGBA) {\n      var drawWidth = this.drawWidth;\n      var drawHeight = this.drawHeight;\n      var imgData = {\n        width: drawWidth,\n        height: drawHeight\n      };\n      var numComps = this.numComps;\n      var originalWidth = this.width;\n      var originalHeight = this.height;\n      var bpc = this.bpc;\n      var rowBytes = originalWidth * numComps * bpc + 7 >> 3;\n      var imgArray;\n      if (!forceRGBA) {\n        var kind;\n        if (this.colorSpace.name === 'DeviceGray' && bpc === 1) {\n          kind = _util.ImageKind.GRAYSCALE_1BPP;\n        } else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8 && !this.needsDecode) {\n          kind = _util.ImageKind.RGB_24BPP;\n        }\n        if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) {\n          imgData.kind = kind;\n          imgArray = this.getImageBytes(originalHeight * rowBytes);\n          if (this.image instanceof _stream.DecodeStream) {\n            imgData.data = imgArray;\n          } else {\n            var newArray = new Uint8Array(imgArray.length);\n            newArray.set(imgArray);\n            imgData.data = newArray;\n          }\n          if (this.needsDecode) {\n            (0, _util.assert)(kind === _util.ImageKind.GRAYSCALE_1BPP);\n            var buffer = imgData.data;\n            for (var i = 0, ii = buffer.length; i < ii; i++) {\n              buffer[i] ^= 0xff;\n            }\n          }\n          return imgData;\n        }\n        if (this.image instanceof _stream.JpegStream && !this.smask && !this.mask && (this.colorSpace.name === 'DeviceGray' || this.colorSpace.name === 'DeviceRGB' || this.colorSpace.name === 'DeviceCMYK')) {\n          imgData.kind = _util.ImageKind.RGB_24BPP;\n          imgData.data = this.getImageBytes(originalHeight * rowBytes, drawWidth, drawHeight, true);\n          return imgData;\n        }\n      }\n      imgArray = this.getImageBytes(originalHeight * rowBytes);\n      var actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight;\n      var comps = this.getComponents(imgArray);\n      var alpha01, maybeUndoPreblend;\n      if (!forceRGBA && !this.smask && !this.mask) {\n        imgData.kind = _util.ImageKind.RGB_24BPP;\n        imgData.data = new Uint8Array(drawWidth * drawHeight * 3);\n        alpha01 = 0;\n        maybeUndoPreblend = false;\n      } else {\n        imgData.kind = _util.ImageKind.RGBA_32BPP;\n        imgData.data = new Uint8Array(drawWidth * drawHeight * 4);\n        alpha01 = 1;\n        maybeUndoPreblend = true;\n        this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, comps);\n      }\n      if (this.needsDecode) {\n        this.decodeBuffer(comps);\n      }\n      this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01);\n      if (maybeUndoPreblend) {\n        this.undoPreblend(imgData.data, drawWidth, actualHeight);\n      }\n      return imgData;\n    },\n    fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) {\n      var numComps = this.numComps;\n      if (numComps !== 1) {\n        throw new _util.FormatError('Reading gray scale from a color image: ' + numComps);\n      }\n      var width = this.width;\n      var height = this.height;\n      var bpc = this.bpc;\n      var rowBytes = width * numComps * bpc + 7 >> 3;\n      var imgArray = this.getImageBytes(height * rowBytes);\n      var comps = this.getComponents(imgArray);\n      var i, length;\n      if (bpc === 1) {\n        length = width * height;\n        if (this.needsDecode) {\n          for (i = 0; i < length; ++i) {\n            buffer[i] = comps[i] - 1 & 255;\n          }\n        } else {\n          for (i = 0; i < length; ++i) {\n            buffer[i] = -comps[i] & 255;\n          }\n        }\n        return;\n      }\n      if (this.needsDecode) {\n        this.decodeBuffer(comps);\n      }\n      length = width * height;\n      var scale = 255 / ((1 << bpc) - 1);\n      for (i = 0; i < length; ++i) {\n        buffer[i] = scale * comps[i] | 0;\n      }\n    },\n    getImageBytes: function PDFImage_getImageBytes(length, drawWidth, drawHeight, forceRGB) {\n      this.image.reset();\n      this.image.drawWidth = drawWidth || this.width;\n      this.image.drawHeight = drawHeight || this.height;\n      this.image.forceRGB = !!forceRGB;\n      return this.image.getBytes(length);\n    }\n  };\n  return PDFImage;\n}();\nexports.PDFImage = PDFImage;\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Jbig2Image = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _arithmetic_decoder = __w_pdfjs_require__(9);\n\nvar Jbig2Error = function Jbig2ErrorClosure() {\n  function Jbig2Error(msg) {\n    this.message = 'JBIG2 error: ' + msg;\n  }\n  Jbig2Error.prototype = new Error();\n  Jbig2Error.prototype.name = 'Jbig2Error';\n  Jbig2Error.constructor = Jbig2Error;\n  return Jbig2Error;\n}();\nvar Jbig2Image = function Jbig2ImageClosure() {\n  function ContextCache() {}\n  ContextCache.prototype = {\n    getContexts: function getContexts(id) {\n      if (id in this) {\n        return this[id];\n      }\n      return this[id] = new Int8Array(1 << 16);\n    }\n  };\n  function DecodingContext(data, start, end) {\n    this.data = data;\n    this.start = start;\n    this.end = end;\n  }\n  DecodingContext.prototype = {\n    get decoder() {\n      var decoder = new _arithmetic_decoder.ArithmeticDecoder(this.data, this.start, this.end);\n      return (0, _util.shadow)(this, 'decoder', decoder);\n    },\n    get contextCache() {\n      var cache = new ContextCache();\n      return (0, _util.shadow)(this, 'contextCache', cache);\n    }\n  };\n  function decodeInteger(contextCache, procedure, decoder) {\n    var contexts = contextCache.getContexts(procedure);\n    var prev = 1;\n    function readBits(length) {\n      var v = 0;\n      for (var i = 0; i < length; i++) {\n        var bit = decoder.readBit(contexts, prev);\n        prev = prev < 256 ? prev << 1 | bit : (prev << 1 | bit) & 511 | 256;\n        v = v << 1 | bit;\n      }\n      return v >>> 0;\n    }\n    var sign = readBits(1);\n    var value = readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(32) + 4436 : readBits(12) + 340 : readBits(8) + 84 : readBits(6) + 20 : readBits(4) + 4 : readBits(2);\n    return sign === 0 ? value : value > 0 ? -value : null;\n  }\n  function decodeIAID(contextCache, decoder, codeLength) {\n    var contexts = contextCache.getContexts('IAID');\n    var prev = 1;\n    for (var i = 0; i < codeLength; i++) {\n      var bit = decoder.readBit(contexts, prev);\n      prev = prev << 1 | bit;\n    }\n    if (codeLength < 31) {\n      return prev & (1 << codeLength) - 1;\n    }\n    return prev & 0x7FFFFFFF;\n  }\n  var SegmentTypes = ['SymbolDictionary', null, null, null, 'IntermediateTextRegion', null, 'ImmediateTextRegion', 'ImmediateLosslessTextRegion', null, null, null, null, null, null, null, null, 'patternDictionary', null, null, null, 'IntermediateHalftoneRegion', null, 'ImmediateHalftoneRegion', 'ImmediateLosslessHalftoneRegion', null, null, null, null, null, null, null, null, null, null, null, null, 'IntermediateGenericRegion', null, 'ImmediateGenericRegion', 'ImmediateLosslessGenericRegion', 'IntermediateGenericRefinementRegion', null, 'ImmediateGenericRefinementRegion', 'ImmediateLosslessGenericRefinementRegion', null, null, null, null, 'PageInformation', 'EndOfPage', 'EndOfStripe', 'EndOfFile', 'Profiles', 'Tables', null, null, null, null, null, null, null, null, 'Extension'];\n  var CodingTemplates = [[{\n    x: -1,\n    y: -2\n  }, {\n    x: 0,\n    y: -2\n  }, {\n    x: 1,\n    y: -2\n  }, {\n    x: -2,\n    y: -1\n  }, {\n    x: -1,\n    y: -1\n  }, {\n    x: 0,\n    y: -1\n  }, {\n    x: 1,\n    y: -1\n  }, {\n    x: 2,\n    y: -1\n  }, {\n    x: -4,\n    y: 0\n  }, {\n    x: -3,\n    y: 0\n  }, {\n    x: -2,\n    y: 0\n  }, {\n    x: -1,\n    y: 0\n  }], [{\n    x: -1,\n    y: -2\n  }, {\n    x: 0,\n    y: -2\n  }, {\n    x: 1,\n    y: -2\n  }, {\n    x: 2,\n    y: -2\n  }, {\n    x: -2,\n    y: -1\n  }, {\n    x: -1,\n    y: -1\n  }, {\n    x: 0,\n    y: -1\n  }, {\n    x: 1,\n    y: -1\n  }, {\n    x: 2,\n    y: -1\n  }, {\n    x: -3,\n    y: 0\n  }, {\n    x: -2,\n    y: 0\n  }, {\n    x: -1,\n    y: 0\n  }], [{\n    x: -1,\n    y: -2\n  }, {\n    x: 0,\n    y: -2\n  }, {\n    x: 1,\n    y: -2\n  }, {\n    x: -2,\n    y: -1\n  }, {\n    x: -1,\n    y: -1\n  }, {\n    x: 0,\n    y: -1\n  }, {\n    x: 1,\n    y: -1\n  }, {\n    x: -2,\n    y: 0\n  }, {\n    x: -1,\n    y: 0\n  }], [{\n    x: -3,\n    y: -1\n  }, {\n    x: -2,\n    y: -1\n  }, {\n    x: -1,\n    y: -1\n  }, {\n    x: 0,\n    y: -1\n  }, {\n    x: 1,\n    y: -1\n  }, {\n    x: -4,\n    y: 0\n  }, {\n    x: -3,\n    y: 0\n  }, {\n    x: -2,\n    y: 0\n  }, {\n    x: -1,\n    y: 0\n  }]];\n  var RefinementTemplates = [{\n    coding: [{\n      x: 0,\n      y: -1\n    }, {\n      x: 1,\n      y: -1\n    }, {\n      x: -1,\n      y: 0\n    }],\n    reference: [{\n      x: 0,\n      y: -1\n    }, {\n      x: 1,\n      y: -1\n    }, {\n      x: -1,\n      y: 0\n    }, {\n      x: 0,\n      y: 0\n    }, {\n      x: 1,\n      y: 0\n    }, {\n      x: -1,\n      y: 1\n    }, {\n      x: 0,\n      y: 1\n    }, {\n      x: 1,\n      y: 1\n    }]\n  }, {\n    coding: [{\n      x: -1,\n      y: -1\n    }, {\n      x: 0,\n      y: -1\n    }, {\n      x: 1,\n      y: -1\n    }, {\n      x: -1,\n      y: 0\n    }],\n    reference: [{\n      x: 0,\n      y: -1\n    }, {\n      x: -1,\n      y: 0\n    }, {\n      x: 0,\n      y: 0\n    }, {\n      x: 1,\n      y: 0\n    }, {\n      x: 0,\n      y: 1\n    }, {\n      x: 1,\n      y: 1\n    }]\n  }];\n  var ReusedContexts = [0x9B25, 0x0795, 0x00E5, 0x0195];\n  var RefinementReusedContexts = [0x0020, 0x0008];\n  function decodeBitmapTemplate0(width, height, decodingContext) {\n    var decoder = decodingContext.decoder;\n    var contexts = decodingContext.contextCache.getContexts('GB');\n    var contextLabel,\n        i,\n        j,\n        pixel,\n        row,\n        row1,\n        row2,\n        bitmap = [];\n    var OLD_PIXEL_MASK = 0x7BF7;\n    for (i = 0; i < height; i++) {\n      row = bitmap[i] = new Uint8Array(width);\n      row1 = i < 1 ? row : bitmap[i - 1];\n      row2 = i < 2 ? row : bitmap[i - 2];\n      contextLabel = row2[0] << 13 | row2[1] << 12 | row2[2] << 11 | row1[0] << 7 | row1[1] << 6 | row1[2] << 5 | row1[3] << 4;\n      for (j = 0; j < width; j++) {\n        row[j] = pixel = decoder.readBit(contexts, contextLabel);\n        contextLabel = (contextLabel & OLD_PIXEL_MASK) << 1 | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel;\n      }\n    }\n    return bitmap;\n  }\n  function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) {\n    if (mmr) {\n      throw new Jbig2Error('MMR encoding is not supported');\n    }\n    if (templateIndex === 0 && !skip && !prediction && at.length === 4 && at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) {\n      return decodeBitmapTemplate0(width, height, decodingContext);\n    }\n    var useskip = !!skip;\n    var template = CodingTemplates[templateIndex].concat(at);\n    template.sort(function (a, b) {\n      return a.y - b.y || a.x - b.x;\n    });\n    var templateLength = template.length;\n    var templateX = new Int8Array(templateLength);\n    var templateY = new Int8Array(templateLength);\n    var changingTemplateEntries = [];\n    var reuseMask = 0,\n        minX = 0,\n        maxX = 0,\n        minY = 0;\n    var c, k;\n    for (k = 0; k < templateLength; k++) {\n      templateX[k] = template[k].x;\n      templateY[k] = template[k].y;\n      minX = Math.min(minX, template[k].x);\n      maxX = Math.max(maxX, template[k].x);\n      minY = Math.min(minY, template[k].y);\n      if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 1].x - 1) {\n        reuseMask |= 1 << templateLength - 1 - k;\n      } else {\n        changingTemplateEntries.push(k);\n      }\n    }\n    var changingEntriesLength = changingTemplateEntries.length;\n    var changingTemplateX = new Int8Array(changingEntriesLength);\n    var changingTemplateY = new Int8Array(changingEntriesLength);\n    var changingTemplateBit = new Uint16Array(changingEntriesLength);\n    for (c = 0; c < changingEntriesLength; c++) {\n      k = changingTemplateEntries[c];\n      changingTemplateX[c] = template[k].x;\n      changingTemplateY[c] = template[k].y;\n      changingTemplateBit[c] = 1 << templateLength - 1 - k;\n    }\n    var sbb_left = -minX;\n    var sbb_top = -minY;\n    var sbb_right = width - maxX;\n    var pseudoPixelContext = ReusedContexts[templateIndex];\n    var row = new Uint8Array(width);\n    var bitmap = [];\n    var decoder = decodingContext.decoder;\n    var contexts = decodingContext.contextCache.getContexts('GB');\n    var ltp = 0,\n        j,\n        i0,\n        j0,\n        contextLabel = 0,\n        bit,\n        shift;\n    for (var i = 0; i < height; i++) {\n      if (prediction) {\n        var sltp = decoder.readBit(contexts, pseudoPixelContext);\n        ltp ^= sltp;\n        if (ltp) {\n          bitmap.push(row);\n          continue;\n        }\n      }\n      row = new Uint8Array(row);\n      bitmap.push(row);\n      for (j = 0; j < width; j++) {\n        if (useskip && skip[i][j]) {\n          row[j] = 0;\n          continue;\n        }\n        if (j >= sbb_left && j < sbb_right && i >= sbb_top) {\n          contextLabel = contextLabel << 1 & reuseMask;\n          for (k = 0; k < changingEntriesLength; k++) {\n            i0 = i + changingTemplateY[k];\n            j0 = j + changingTemplateX[k];\n            bit = bitmap[i0][j0];\n            if (bit) {\n              bit = changingTemplateBit[k];\n              contextLabel |= bit;\n            }\n          }\n        } else {\n          contextLabel = 0;\n          shift = templateLength - 1;\n          for (k = 0; k < templateLength; k++, shift--) {\n            j0 = j + templateX[k];\n            if (j0 >= 0 && j0 < width) {\n              i0 = i + templateY[k];\n              if (i0 >= 0) {\n                bit = bitmap[i0][j0];\n                if (bit) {\n                  contextLabel |= bit << shift;\n                }\n              }\n            }\n          }\n        }\n        var pixel = decoder.readBit(contexts, contextLabel);\n        row[j] = pixel;\n      }\n    }\n    return bitmap;\n  }\n  function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, decodingContext) {\n    var codingTemplate = RefinementTemplates[templateIndex].coding;\n    if (templateIndex === 0) {\n      codingTemplate = codingTemplate.concat([at[0]]);\n    }\n    var codingTemplateLength = codingTemplate.length;\n    var codingTemplateX = new Int32Array(codingTemplateLength);\n    var codingTemplateY = new Int32Array(codingTemplateLength);\n    var k;\n    for (k = 0; k < codingTemplateLength; k++) {\n      codingTemplateX[k] = codingTemplate[k].x;\n      codingTemplateY[k] = codingTemplate[k].y;\n    }\n    var referenceTemplate = RefinementTemplates[templateIndex].reference;\n    if (templateIndex === 0) {\n      referenceTemplate = referenceTemplate.concat([at[1]]);\n    }\n    var referenceTemplateLength = referenceTemplate.length;\n    var referenceTemplateX = new Int32Array(referenceTemplateLength);\n    var referenceTemplateY = new Int32Array(referenceTemplateLength);\n    for (k = 0; k < referenceTemplateLength; k++) {\n      referenceTemplateX[k] = referenceTemplate[k].x;\n      referenceTemplateY[k] = referenceTemplate[k].y;\n    }\n    var referenceWidth = referenceBitmap[0].length;\n    var referenceHeight = referenceBitmap.length;\n    var pseudoPixelContext = RefinementReusedContexts[templateIndex];\n    var bitmap = [];\n    var decoder = decodingContext.decoder;\n    var contexts = decodingContext.contextCache.getContexts('GR');\n    var ltp = 0;\n    for (var i = 0; i < height; i++) {\n      if (prediction) {\n        var sltp = decoder.readBit(contexts, pseudoPixelContext);\n        ltp ^= sltp;\n        if (ltp) {\n          throw new Jbig2Error('prediction is not supported');\n        }\n      }\n      var row = new Uint8Array(width);\n      bitmap.push(row);\n      for (var j = 0; j < width; j++) {\n        var i0, j0;\n        var contextLabel = 0;\n        for (k = 0; k < codingTemplateLength; k++) {\n          i0 = i + codingTemplateY[k];\n          j0 = j + codingTemplateX[k];\n          if (i0 < 0 || j0 < 0 || j0 >= width) {\n            contextLabel <<= 1;\n          } else {\n            contextLabel = contextLabel << 1 | bitmap[i0][j0];\n          }\n        }\n        for (k = 0; k < referenceTemplateLength; k++) {\n          i0 = i + referenceTemplateY[k] - offsetY;\n          j0 = j + referenceTemplateX[k] - offsetX;\n          if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) {\n            contextLabel <<= 1;\n          } else {\n            contextLabel = contextLabel << 1 | referenceBitmap[i0][j0];\n          }\n        }\n        var pixel = decoder.readBit(contexts, contextLabel);\n        row[j] = pixel;\n      }\n    }\n    return bitmap;\n  }\n  function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext) {\n    if (huffman) {\n      throw new Jbig2Error('huffman is not supported');\n    }\n    var newSymbols = [];\n    var currentHeight = 0;\n    var symbolCodeLength = (0, _util.log2)(symbols.length + numberOfNewSymbols);\n    var decoder = decodingContext.decoder;\n    var contextCache = decodingContext.contextCache;\n    while (newSymbols.length < numberOfNewSymbols) {\n      var deltaHeight = decodeInteger(contextCache, 'IADH', decoder);\n      currentHeight += deltaHeight;\n      var currentWidth = 0;\n      while (true) {\n        var deltaWidth = decodeInteger(contextCache, 'IADW', decoder);\n        if (deltaWidth === null) {\n          break;\n        }\n        currentWidth += deltaWidth;\n        var bitmap;\n        if (refinement) {\n          var numberOfInstances = decodeInteger(contextCache, 'IAAI', decoder);\n          if (numberOfInstances > 1) {\n            bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, numberOfInstances, 1, symbols.concat(newSymbols), symbolCodeLength, 0, 0, 1, 0, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext);\n          } else {\n            var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);\n            var rdx = decodeInteger(contextCache, 'IARDX', decoder);\n            var rdy = decodeInteger(contextCache, 'IARDY', decoder);\n            var symbol = symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - symbols.length];\n            bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, decodingContext);\n          }\n        } else {\n          bitmap = decodeBitmap(false, currentWidth, currentHeight, templateIndex, false, null, at, decodingContext);\n        }\n        newSymbols.push(bitmap);\n      }\n    }\n    var exportedSymbols = [];\n    var flags = [],\n        currentFlag = false;\n    var totalSymbolsLength = symbols.length + numberOfNewSymbols;\n    while (flags.length < totalSymbolsLength) {\n      var runLength = decodeInteger(contextCache, 'IAEX', decoder);\n      while (runLength--) {\n        flags.push(currentFlag);\n      }\n      currentFlag = !currentFlag;\n    }\n    for (var i = 0, ii = symbols.length; i < ii; i++) {\n      if (flags[i]) {\n        exportedSymbols.push(symbols[i]);\n      }\n    }\n    for (var j = 0; j < numberOfNewSymbols; i++, j++) {\n      if (flags[i]) {\n        exportedSymbols.push(newSymbols[j]);\n      }\n    }\n    return exportedSymbols;\n  }\n  function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext) {\n    if (huffman) {\n      throw new Jbig2Error('huffman is not supported');\n    }\n    var bitmap = [];\n    var i, row;\n    for (i = 0; i < height; i++) {\n      row = new Uint8Array(width);\n      if (defaultPixelValue) {\n        for (var j = 0; j < width; j++) {\n          row[j] = defaultPixelValue;\n        }\n      }\n      bitmap.push(row);\n    }\n    var decoder = decodingContext.decoder;\n    var contextCache = decodingContext.contextCache;\n    var stripT = -decodeInteger(contextCache, 'IADT', decoder);\n    var firstS = 0;\n    i = 0;\n    while (i < numberOfSymbolInstances) {\n      var deltaT = decodeInteger(contextCache, 'IADT', decoder);\n      stripT += deltaT;\n      var deltaFirstS = decodeInteger(contextCache, 'IAFS', decoder);\n      firstS += deltaFirstS;\n      var currentS = firstS;\n      do {\n        var currentT = stripSize === 1 ? 0 : decodeInteger(contextCache, 'IAIT', decoder);\n        var t = stripSize * stripT + currentT;\n        var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);\n        var applyRefinement = refinement && decodeInteger(contextCache, 'IARI', decoder);\n        var symbolBitmap = inputSymbols[symbolId];\n        var symbolWidth = symbolBitmap[0].length;\n        var symbolHeight = symbolBitmap.length;\n        if (applyRefinement) {\n          var rdw = decodeInteger(contextCache, 'IARDW', decoder);\n          var rdh = decodeInteger(contextCache, 'IARDH', decoder);\n          var rdx = decodeInteger(contextCache, 'IARDX', decoder);\n          var rdy = decodeInteger(contextCache, 'IARDY', decoder);\n          symbolWidth += rdw;\n          symbolHeight += rdh;\n          symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext);\n        }\n        var offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight);\n        var offsetS = currentS - (referenceCorner & 2 ? symbolWidth : 0);\n        var s2, t2, symbolRow;\n        if (transposed) {\n          for (s2 = 0; s2 < symbolHeight; s2++) {\n            row = bitmap[offsetS + s2];\n            if (!row) {\n              continue;\n            }\n            symbolRow = symbolBitmap[s2];\n            var maxWidth = Math.min(width - offsetT, symbolWidth);\n            switch (combinationOperator) {\n              case 0:\n                for (t2 = 0; t2 < maxWidth; t2++) {\n                  row[offsetT + t2] |= symbolRow[t2];\n                }\n                break;\n              case 2:\n                for (t2 = 0; t2 < maxWidth; t2++) {\n                  row[offsetT + t2] ^= symbolRow[t2];\n                }\n                break;\n              default:\n                throw new Jbig2Error('operator ' + combinationOperator + ' is not supported');\n            }\n          }\n          currentS += symbolHeight - 1;\n        } else {\n          for (t2 = 0; t2 < symbolHeight; t2++) {\n            row = bitmap[offsetT + t2];\n            if (!row) {\n              continue;\n            }\n            symbolRow = symbolBitmap[t2];\n            switch (combinationOperator) {\n              case 0:\n                for (s2 = 0; s2 < symbolWidth; s2++) {\n                  row[offsetS + s2] |= symbolRow[s2];\n                }\n                break;\n              case 2:\n                for (s2 = 0; s2 < symbolWidth; s2++) {\n                  row[offsetS + s2] ^= symbolRow[s2];\n                }\n                break;\n              default:\n                throw new Jbig2Error('operator ' + combinationOperator + ' is not supported');\n            }\n          }\n          currentS += symbolWidth - 1;\n        }\n        i++;\n        var deltaS = decodeInteger(contextCache, 'IADS', decoder);\n        if (deltaS === null) {\n          break;\n        }\n        currentS += deltaS + dsOffset;\n      } while (true);\n    }\n    return bitmap;\n  }\n  function readSegmentHeader(data, start) {\n    var segmentHeader = {};\n    segmentHeader.number = (0, _util.readUint32)(data, start);\n    var flags = data[start + 4];\n    var segmentType = flags & 0x3F;\n    if (!SegmentTypes[segmentType]) {\n      throw new Jbig2Error('invalid segment type: ' + segmentType);\n    }\n    segmentHeader.type = segmentType;\n    segmentHeader.typeName = SegmentTypes[segmentType];\n    segmentHeader.deferredNonRetain = !!(flags & 0x80);\n    var pageAssociationFieldSize = !!(flags & 0x40);\n    var referredFlags = data[start + 5];\n    var referredToCount = referredFlags >> 5 & 7;\n    var retainBits = [referredFlags & 31];\n    var position = start + 6;\n    if (referredFlags === 7) {\n      referredToCount = (0, _util.readUint32)(data, position - 1) & 0x1FFFFFFF;\n      position += 3;\n      var bytes = referredToCount + 7 >> 3;\n      retainBits[0] = data[position++];\n      while (--bytes > 0) {\n        retainBits.push(data[position++]);\n      }\n    } else if (referredFlags === 5 || referredFlags === 6) {\n      throw new Jbig2Error('invalid referred-to flags');\n    }\n    segmentHeader.retainBits = retainBits;\n    var referredToSegmentNumberSize = segmentHeader.number <= 256 ? 1 : segmentHeader.number <= 65536 ? 2 : 4;\n    var referredTo = [];\n    var i, ii;\n    for (i = 0; i < referredToCount; i++) {\n      var number = referredToSegmentNumberSize === 1 ? data[position] : referredToSegmentNumberSize === 2 ? (0, _util.readUint16)(data, position) : (0, _util.readUint32)(data, position);\n      referredTo.push(number);\n      position += referredToSegmentNumberSize;\n    }\n    segmentHeader.referredTo = referredTo;\n    if (!pageAssociationFieldSize) {\n      segmentHeader.pageAssociation = data[position++];\n    } else {\n      segmentHeader.pageAssociation = (0, _util.readUint32)(data, position);\n      position += 4;\n    }\n    segmentHeader.length = (0, _util.readUint32)(data, position);\n    position += 4;\n    if (segmentHeader.length === 0xFFFFFFFF) {\n      if (segmentType === 38) {\n        var genericRegionInfo = readRegionSegmentInformation(data, position);\n        var genericRegionSegmentFlags = data[position + RegionSegmentInformationFieldLength];\n        var genericRegionMmr = !!(genericRegionSegmentFlags & 1);\n        var searchPatternLength = 6;\n        var searchPattern = new Uint8Array(searchPatternLength);\n        if (!genericRegionMmr) {\n          searchPattern[0] = 0xFF;\n          searchPattern[1] = 0xAC;\n        }\n        searchPattern[2] = genericRegionInfo.height >>> 24 & 0xFF;\n        searchPattern[3] = genericRegionInfo.height >> 16 & 0xFF;\n        searchPattern[4] = genericRegionInfo.height >> 8 & 0xFF;\n        searchPattern[5] = genericRegionInfo.height & 0xFF;\n        for (i = position, ii = data.length; i < ii; i++) {\n          var j = 0;\n          while (j < searchPatternLength && searchPattern[j] === data[i + j]) {\n            j++;\n          }\n          if (j === searchPatternLength) {\n            segmentHeader.length = i + searchPatternLength;\n            break;\n          }\n        }\n        if (segmentHeader.length === 0xFFFFFFFF) {\n          throw new Jbig2Error('segment end was not found');\n        }\n      } else {\n        throw new Jbig2Error('invalid unknown segment length');\n      }\n    }\n    segmentHeader.headerEnd = position;\n    return segmentHeader;\n  }\n  function readSegments(header, data, start, end) {\n    var segments = [];\n    var position = start;\n    while (position < end) {\n      var segmentHeader = readSegmentHeader(data, position);\n      position = segmentHeader.headerEnd;\n      var segment = {\n        header: segmentHeader,\n        data: data\n      };\n      if (!header.randomAccess) {\n        segment.start = position;\n        position += segmentHeader.length;\n        segment.end = position;\n      }\n      segments.push(segment);\n      if (segmentHeader.type === 51) {\n        break;\n      }\n    }\n    if (header.randomAccess) {\n      for (var i = 0, ii = segments.length; i < ii; i++) {\n        segments[i].start = position;\n        position += segments[i].header.length;\n        segments[i].end = position;\n      }\n    }\n    return segments;\n  }\n  function readRegionSegmentInformation(data, start) {\n    return {\n      width: (0, _util.readUint32)(data, start),\n      height: (0, _util.readUint32)(data, start + 4),\n      x: (0, _util.readUint32)(data, start + 8),\n      y: (0, _util.readUint32)(data, start + 12),\n      combinationOperator: data[start + 16] & 7\n    };\n  }\n  var RegionSegmentInformationFieldLength = 17;\n  function processSegment(segment, visitor) {\n    var header = segment.header;\n    var data = segment.data,\n        position = segment.start,\n        end = segment.end;\n    var args, at, i, atLength;\n    switch (header.type) {\n      case 0:\n        var dictionary = {};\n        var dictionaryFlags = (0, _util.readUint16)(data, position);\n        dictionary.huffman = !!(dictionaryFlags & 1);\n        dictionary.refinement = !!(dictionaryFlags & 2);\n        dictionary.huffmanDHSelector = dictionaryFlags >> 2 & 3;\n        dictionary.huffmanDWSelector = dictionaryFlags >> 4 & 3;\n        dictionary.bitmapSizeSelector = dictionaryFlags >> 6 & 1;\n        dictionary.aggregationInstancesSelector = dictionaryFlags >> 7 & 1;\n        dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256);\n        dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512);\n        dictionary.template = dictionaryFlags >> 10 & 3;\n        dictionary.refinementTemplate = dictionaryFlags >> 12 & 1;\n        position += 2;\n        if (!dictionary.huffman) {\n          atLength = dictionary.template === 0 ? 4 : 1;\n          at = [];\n          for (i = 0; i < atLength; i++) {\n            at.push({\n              x: (0, _util.readInt8)(data, position),\n              y: (0, _util.readInt8)(data, position + 1)\n            });\n            position += 2;\n          }\n          dictionary.at = at;\n        }\n        if (dictionary.refinement && !dictionary.refinementTemplate) {\n          at = [];\n          for (i = 0; i < 2; i++) {\n            at.push({\n              x: (0, _util.readInt8)(data, position),\n              y: (0, _util.readInt8)(data, position + 1)\n            });\n            position += 2;\n          }\n          dictionary.refinementAt = at;\n        }\n        dictionary.numberOfExportedSymbols = (0, _util.readUint32)(data, position);\n        position += 4;\n        dictionary.numberOfNewSymbols = (0, _util.readUint32)(data, position);\n        position += 4;\n        args = [dictionary, header.number, header.referredTo, data, position, end];\n        break;\n      case 6:\n      case 7:\n        var textRegion = {};\n        textRegion.info = readRegionSegmentInformation(data, position);\n        position += RegionSegmentInformationFieldLength;\n        var textRegionSegmentFlags = (0, _util.readUint16)(data, position);\n        position += 2;\n        textRegion.huffman = !!(textRegionSegmentFlags & 1);\n        textRegion.refinement = !!(textRegionSegmentFlags & 2);\n        textRegion.stripSize = 1 << (textRegionSegmentFlags >> 2 & 3);\n        textRegion.referenceCorner = textRegionSegmentFlags >> 4 & 3;\n        textRegion.transposed = !!(textRegionSegmentFlags & 64);\n        textRegion.combinationOperator = textRegionSegmentFlags >> 7 & 3;\n        textRegion.defaultPixelValue = textRegionSegmentFlags >> 9 & 1;\n        textRegion.dsOffset = textRegionSegmentFlags << 17 >> 27;\n        textRegion.refinementTemplate = textRegionSegmentFlags >> 15 & 1;\n        if (textRegion.huffman) {\n          var textRegionHuffmanFlags = (0, _util.readUint16)(data, position);\n          position += 2;\n          textRegion.huffmanFS = textRegionHuffmanFlags & 3;\n          textRegion.huffmanDS = textRegionHuffmanFlags >> 2 & 3;\n          textRegion.huffmanDT = textRegionHuffmanFlags >> 4 & 3;\n          textRegion.huffmanRefinementDW = textRegionHuffmanFlags >> 6 & 3;\n          textRegion.huffmanRefinementDH = textRegionHuffmanFlags >> 8 & 3;\n          textRegion.huffmanRefinementDX = textRegionHuffmanFlags >> 10 & 3;\n          textRegion.huffmanRefinementDY = textRegionHuffmanFlags >> 12 & 3;\n          textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 14);\n        }\n        if (textRegion.refinement && !textRegion.refinementTemplate) {\n          at = [];\n          for (i = 0; i < 2; i++) {\n            at.push({\n              x: (0, _util.readInt8)(data, position),\n              y: (0, _util.readInt8)(data, position + 1)\n            });\n            position += 2;\n          }\n          textRegion.refinementAt = at;\n        }\n        textRegion.numberOfSymbolInstances = (0, _util.readUint32)(data, position);\n        position += 4;\n        if (textRegion.huffman) {\n          throw new Jbig2Error('huffman is not supported');\n        }\n        args = [textRegion, header.referredTo, data, position, end];\n        break;\n      case 38:\n      case 39:\n        var genericRegion = {};\n        genericRegion.info = readRegionSegmentInformation(data, position);\n        position += RegionSegmentInformationFieldLength;\n        var genericRegionSegmentFlags = data[position++];\n        genericRegion.mmr = !!(genericRegionSegmentFlags & 1);\n        genericRegion.template = genericRegionSegmentFlags >> 1 & 3;\n        genericRegion.prediction = !!(genericRegionSegmentFlags & 8);\n        if (!genericRegion.mmr) {\n          atLength = genericRegion.template === 0 ? 4 : 1;\n          at = [];\n          for (i = 0; i < atLength; i++) {\n            at.push({\n              x: (0, _util.readInt8)(data, position),\n              y: (0, _util.readInt8)(data, position + 1)\n            });\n            position += 2;\n          }\n          genericRegion.at = at;\n        }\n        args = [genericRegion, data, position, end];\n        break;\n      case 48:\n        var pageInfo = {\n          width: (0, _util.readUint32)(data, position),\n          height: (0, _util.readUint32)(data, position + 4),\n          resolutionX: (0, _util.readUint32)(data, position + 8),\n          resolutionY: (0, _util.readUint32)(data, position + 12)\n        };\n        if (pageInfo.height === 0xFFFFFFFF) {\n          delete pageInfo.height;\n        }\n        var pageSegmentFlags = data[position + 16];\n        (0, _util.readUint16)(data, position + 17);\n        pageInfo.lossless = !!(pageSegmentFlags & 1);\n        pageInfo.refinement = !!(pageSegmentFlags & 2);\n        pageInfo.defaultPixelValue = pageSegmentFlags >> 2 & 1;\n        pageInfo.combinationOperator = pageSegmentFlags >> 3 & 3;\n        pageInfo.requiresBuffer = !!(pageSegmentFlags & 32);\n        pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64);\n        args = [pageInfo];\n        break;\n      case 49:\n        break;\n      case 50:\n        break;\n      case 51:\n        break;\n      case 62:\n        break;\n      default:\n        throw new Jbig2Error('segment type ' + header.typeName + '(' + header.type + ')' + ' is not implemented');\n    }\n    var callbackName = 'on' + header.typeName;\n    if (callbackName in visitor) {\n      visitor[callbackName].apply(visitor, args);\n    }\n  }\n  function processSegments(segments, visitor) {\n    for (var i = 0, ii = segments.length; i < ii; i++) {\n      processSegment(segments[i], visitor);\n    }\n  }\n  function parseJbig2(data, start, end) {\n    var position = start;\n    if (data[position] !== 0x97 || data[position + 1] !== 0x4A || data[position + 2] !== 0x42 || data[position + 3] !== 0x32 || data[position + 4] !== 0x0D || data[position + 5] !== 0x0A || data[position + 6] !== 0x1A || data[position + 7] !== 0x0A) {\n      throw new Jbig2Error('invalid header');\n    }\n    var header = {};\n    position += 8;\n    var flags = data[position++];\n    header.randomAccess = !(flags & 1);\n    if (!(flags & 2)) {\n      header.numberOfPages = (0, _util.readUint32)(data, position);\n      position += 4;\n    }\n    readSegments(header, data, position, end);\n    throw new Error('Not implemented');\n  }\n  function parseJbig2Chunks(chunks) {\n    var visitor = new SimpleSegmentVisitor();\n    for (var i = 0, ii = chunks.length; i < ii; i++) {\n      var chunk = chunks[i];\n      var segments = readSegments({}, chunk.data, chunk.start, chunk.end);\n      processSegments(segments, visitor);\n    }\n    return visitor.buffer;\n  }\n  function SimpleSegmentVisitor() {}\n  SimpleSegmentVisitor.prototype = {\n    onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) {\n      this.currentPageInfo = info;\n      var rowSize = info.width + 7 >> 3;\n      var buffer = new Uint8Array(rowSize * info.height);\n      if (info.defaultPixelValue) {\n        for (var i = 0, ii = buffer.length; i < ii; i++) {\n          buffer[i] = 0xFF;\n        }\n      }\n      this.buffer = buffer;\n    },\n    drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) {\n      var pageInfo = this.currentPageInfo;\n      var width = regionInfo.width,\n          height = regionInfo.height;\n      var rowSize = pageInfo.width + 7 >> 3;\n      var combinationOperator = pageInfo.combinationOperatorOverride ? regionInfo.combinationOperator : pageInfo.combinationOperator;\n      var buffer = this.buffer;\n      var mask0 = 128 >> (regionInfo.x & 7);\n      var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3);\n      var i, j, mask, offset;\n      switch (combinationOperator) {\n        case 0:\n          for (i = 0; i < height; i++) {\n            mask = mask0;\n            offset = offset0;\n            for (j = 0; j < width; j++) {\n              if (bitmap[i][j]) {\n                buffer[offset] |= mask;\n              }\n              mask >>= 1;\n              if (!mask) {\n                mask = 128;\n                offset++;\n              }\n            }\n            offset0 += rowSize;\n          }\n          break;\n        case 2:\n          for (i = 0; i < height; i++) {\n            mask = mask0;\n            offset = offset0;\n            for (j = 0; j < width; j++) {\n              if (bitmap[i][j]) {\n                buffer[offset] ^= mask;\n              }\n              mask >>= 1;\n              if (!mask) {\n                mask = 128;\n                offset++;\n              }\n            }\n            offset0 += rowSize;\n          }\n          break;\n        default:\n          throw new Jbig2Error('operator ' + combinationOperator + ' is not supported');\n      }\n    },\n    onImmediateGenericRegion: function SimpleSegmentVisitor_onImmediateGenericRegion(region, data, start, end) {\n      var regionInfo = region.info;\n      var decodingContext = new DecodingContext(data, start, end);\n      var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, region.template, region.prediction, null, region.at, decodingContext);\n      this.drawBitmap(regionInfo, bitmap);\n    },\n    onImmediateLosslessGenericRegion: function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() {\n      this.onImmediateGenericRegion.apply(this, arguments);\n    },\n    onSymbolDictionary: function SimpleSegmentVisitor_onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) {\n      var huffmanTables;\n      if (dictionary.huffman) {\n        throw new Jbig2Error('huffman is not supported');\n      }\n      var symbols = this.symbols;\n      if (!symbols) {\n        this.symbols = symbols = {};\n      }\n      var inputSymbols = [];\n      for (var i = 0, ii = referredSegments.length; i < ii; i++) {\n        inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]);\n      }\n      var decodingContext = new DecodingContext(data, start, end);\n      symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext);\n    },\n    onImmediateTextRegion: function SimpleSegmentVisitor_onImmediateTextRegion(region, referredSegments, data, start, end) {\n      var regionInfo = region.info;\n      var huffmanTables;\n      var symbols = this.symbols;\n      var inputSymbols = [];\n      for (var i = 0, ii = referredSegments.length; i < ii; i++) {\n        inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]);\n      }\n      var symbolCodeLength = (0, _util.log2)(inputSymbols.length);\n      var decodingContext = new DecodingContext(data, start, end);\n      var bitmap = decodeTextRegion(region.huffman, region.refinement, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.numberOfSymbolInstances, region.stripSize, inputSymbols, symbolCodeLength, region.transposed, region.dsOffset, region.referenceCorner, region.combinationOperator, huffmanTables, region.refinementTemplate, region.refinementAt, decodingContext);\n      this.drawBitmap(regionInfo, bitmap);\n    },\n    onImmediateLosslessTextRegion: function SimpleSegmentVisitor_onImmediateLosslessTextRegion() {\n      this.onImmediateTextRegion.apply(this, arguments);\n    }\n  };\n  function Jbig2Image() {}\n  Jbig2Image.prototype = {\n    parseChunks: function Jbig2Image_parseChunks(chunks) {\n      return parseJbig2Chunks(chunks);\n    }\n  };\n  return Jbig2Image;\n}();\nexports.Jbig2Image = Jbig2Image;\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.JpegImage = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _util = __w_pdfjs_require__(0);\n\nvar JpegError = function JpegErrorClosure() {\n  function JpegError(msg) {\n    this.message = 'JPEG error: ' + msg;\n  }\n  JpegError.prototype = new Error();\n  JpegError.prototype.name = 'JpegError';\n  JpegError.constructor = JpegError;\n  return JpegError;\n}();\nvar JpegImage = function JpegImageClosure() {\n  var dctZigZag = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]);\n  var dctCos1 = 4017;\n  var dctSin1 = 799;\n  var dctCos3 = 3406;\n  var dctSin3 = 2276;\n  var dctCos6 = 1567;\n  var dctSin6 = 3784;\n  var dctSqrt2 = 5793;\n  var dctSqrt1d2 = 2896;\n  function JpegImage() {\n    this.decodeTransform = null;\n    this.colorTransform = -1;\n  }\n  function buildHuffmanTable(codeLengths, values) {\n    var k = 0,\n        code = [],\n        i,\n        j,\n        length = 16;\n    while (length > 0 && !codeLengths[length - 1]) {\n      length--;\n    }\n    code.push({\n      children: [],\n      index: 0\n    });\n    var p = code[0],\n        q;\n    for (i = 0; i < length; i++) {\n      for (j = 0; j < codeLengths[i]; j++) {\n        p = code.pop();\n        p.children[p.index] = values[k];\n        while (p.index > 0) {\n          p = code.pop();\n        }\n        p.index++;\n        code.push(p);\n        while (code.length <= i) {\n          code.push(q = {\n            children: [],\n            index: 0\n          });\n          p.children[p.index] = q.children;\n          p = q;\n        }\n        k++;\n      }\n      if (i + 1 < length) {\n        code.push(q = {\n          children: [],\n          index: 0\n        });\n        p.children[p.index] = q.children;\n        p = q;\n      }\n    }\n    return code[0].children;\n  }\n  function getBlockBufferOffset(component, row, col) {\n    return 64 * ((component.blocksPerLine + 1) * row + col);\n  }\n  function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) {\n    var mcusPerLine = frame.mcusPerLine;\n    var progressive = frame.progressive;\n    var startOffset = offset,\n        bitsData = 0,\n        bitsCount = 0;\n    function readBit() {\n      if (bitsCount > 0) {\n        bitsCount--;\n        return bitsData >> bitsCount & 1;\n      }\n      bitsData = data[offset++];\n      if (bitsData === 0xFF) {\n        var nextByte = data[offset++];\n        if (nextByte) {\n          throw new JpegError('unexpected marker ' + (bitsData << 8 | nextByte).toString(16));\n        }\n      }\n      bitsCount = 7;\n      return bitsData >>> 7;\n    }\n    function decodeHuffman(tree) {\n      var node = tree;\n      while (true) {\n        node = node[readBit()];\n        if (typeof node === 'number') {\n          return node;\n        }\n        if ((typeof node === 'undefined' ? 'undefined' : _typeof(node)) !== 'object') {\n          throw new JpegError('invalid huffman sequence');\n        }\n      }\n    }\n    function receive(length) {\n      var n = 0;\n      while (length > 0) {\n        n = n << 1 | readBit();\n        length--;\n      }\n      return n;\n    }\n    function receiveAndExtend(length) {\n      if (length === 1) {\n        return readBit() === 1 ? 1 : -1;\n      }\n      var n = receive(length);\n      if (n >= 1 << length - 1) {\n        return n;\n      }\n      return n + (-1 << length) + 1;\n    }\n    function decodeBaseline(component, offset) {\n      var t = decodeHuffman(component.huffmanTableDC);\n      var diff = t === 0 ? 0 : receiveAndExtend(t);\n      component.blockData[offset] = component.pred += diff;\n      var k = 1;\n      while (k < 64) {\n        var rs = decodeHuffman(component.huffmanTableAC);\n        var s = rs & 15,\n            r = rs >> 4;\n        if (s === 0) {\n          if (r < 15) {\n            break;\n          }\n          k += 16;\n          continue;\n        }\n        k += r;\n        var z = dctZigZag[k];\n        component.blockData[offset + z] = receiveAndExtend(s);\n        k++;\n      }\n    }\n    function decodeDCFirst(component, offset) {\n      var t = decodeHuffman(component.huffmanTableDC);\n      var diff = t === 0 ? 0 : receiveAndExtend(t) << successive;\n      component.blockData[offset] = component.pred += diff;\n    }\n    function decodeDCSuccessive(component, offset) {\n      component.blockData[offset] |= readBit() << successive;\n    }\n    var eobrun = 0;\n    function decodeACFirst(component, offset) {\n      if (eobrun > 0) {\n        eobrun--;\n        return;\n      }\n      var k = spectralStart,\n          e = spectralEnd;\n      while (k <= e) {\n        var rs = decodeHuffman(component.huffmanTableAC);\n        var s = rs & 15,\n            r = rs >> 4;\n        if (s === 0) {\n          if (r < 15) {\n            eobrun = receive(r) + (1 << r) - 1;\n            break;\n          }\n          k += 16;\n          continue;\n        }\n        k += r;\n        var z = dctZigZag[k];\n        component.blockData[offset + z] = receiveAndExtend(s) * (1 << successive);\n        k++;\n      }\n    }\n    var successiveACState = 0,\n        successiveACNextValue;\n    function decodeACSuccessive(component, offset) {\n      var k = spectralStart;\n      var e = spectralEnd;\n      var r = 0;\n      var s;\n      var rs;\n      while (k <= e) {\n        var z = dctZigZag[k];\n        switch (successiveACState) {\n          case 0:\n            rs = decodeHuffman(component.huffmanTableAC);\n            s = rs & 15;\n            r = rs >> 4;\n            if (s === 0) {\n              if (r < 15) {\n                eobrun = receive(r) + (1 << r);\n                successiveACState = 4;\n              } else {\n                r = 16;\n                successiveACState = 1;\n              }\n            } else {\n              if (s !== 1) {\n                throw new JpegError('invalid ACn encoding');\n              }\n              successiveACNextValue = receiveAndExtend(s);\n              successiveACState = r ? 2 : 3;\n            }\n            continue;\n          case 1:\n          case 2:\n            if (component.blockData[offset + z]) {\n              component.blockData[offset + z] += readBit() << successive;\n            } else {\n              r--;\n              if (r === 0) {\n                successiveACState = successiveACState === 2 ? 3 : 0;\n              }\n            }\n            break;\n          case 3:\n            if (component.blockData[offset + z]) {\n              component.blockData[offset + z] += readBit() << successive;\n            } else {\n              component.blockData[offset + z] = successiveACNextValue << successive;\n              successiveACState = 0;\n            }\n            break;\n          case 4:\n            if (component.blockData[offset + z]) {\n              component.blockData[offset + z] += readBit() << successive;\n            }\n            break;\n        }\n        k++;\n      }\n      if (successiveACState === 4) {\n        eobrun--;\n        if (eobrun === 0) {\n          successiveACState = 0;\n        }\n      }\n    }\n    function decodeMcu(component, decode, mcu, row, col) {\n      var mcuRow = mcu / mcusPerLine | 0;\n      var mcuCol = mcu % mcusPerLine;\n      var blockRow = mcuRow * component.v + row;\n      var blockCol = mcuCol * component.h + col;\n      var offset = getBlockBufferOffset(component, blockRow, blockCol);\n      decode(component, offset);\n    }\n    function decodeBlock(component, decode, mcu) {\n      var blockRow = mcu / component.blocksPerLine | 0;\n      var blockCol = mcu % component.blocksPerLine;\n      var offset = getBlockBufferOffset(component, blockRow, blockCol);\n      decode(component, offset);\n    }\n    var componentsLength = components.length;\n    var component, i, j, k, n;\n    var decodeFn;\n    if (progressive) {\n      if (spectralStart === 0) {\n        decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;\n      } else {\n        decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;\n      }\n    } else {\n      decodeFn = decodeBaseline;\n    }\n    var mcu = 0,\n        fileMarker;\n    var mcuExpected;\n    if (componentsLength === 1) {\n      mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;\n    } else {\n      mcuExpected = mcusPerLine * frame.mcusPerColumn;\n    }\n    var h, v;\n    while (mcu < mcuExpected) {\n      var mcuToRead = resetInterval ? Math.min(mcuExpected - mcu, resetInterval) : mcuExpected;\n      for (i = 0; i < componentsLength; i++) {\n        components[i].pred = 0;\n      }\n      eobrun = 0;\n      if (componentsLength === 1) {\n        component = components[0];\n        for (n = 0; n < mcuToRead; n++) {\n          decodeBlock(component, decodeFn, mcu);\n          mcu++;\n        }\n      } else {\n        for (n = 0; n < mcuToRead; n++) {\n          for (i = 0; i < componentsLength; i++) {\n            component = components[i];\n            h = component.h;\n            v = component.v;\n            for (j = 0; j < v; j++) {\n              for (k = 0; k < h; k++) {\n                decodeMcu(component, decodeFn, mcu, j, k);\n              }\n            }\n          }\n          mcu++;\n        }\n      }\n      bitsCount = 0;\n      fileMarker = findNextFileMarker(data, offset);\n      if (fileMarker && fileMarker.invalid) {\n        (0, _util.warn)('decodeScan - unexpected MCU data, next marker is: ' + fileMarker.invalid);\n        offset = fileMarker.offset;\n      }\n      var marker = fileMarker && fileMarker.marker;\n      if (!marker || marker <= 0xFF00) {\n        throw new JpegError('marker was not found');\n      }\n      if (marker >= 0xFFD0 && marker <= 0xFFD7) {\n        offset += 2;\n      } else {\n        break;\n      }\n    }\n    fileMarker = findNextFileMarker(data, offset);\n    if (fileMarker && fileMarker.invalid) {\n      (0, _util.warn)('decodeScan - unexpected Scan data, next marker is: ' + fileMarker.invalid);\n      offset = fileMarker.offset;\n    }\n    return offset - startOffset;\n  }\n  function quantizeAndInverse(component, blockBufferOffset, p) {\n    var qt = component.quantizationTable,\n        blockData = component.blockData;\n    var v0, v1, v2, v3, v4, v5, v6, v7;\n    var p0, p1, p2, p3, p4, p5, p6, p7;\n    var t;\n    if (!qt) {\n      throw new JpegError('missing required Quantization Table.');\n    }\n    for (var row = 0; row < 64; row += 8) {\n      p0 = blockData[blockBufferOffset + row];\n      p1 = blockData[blockBufferOffset + row + 1];\n      p2 = blockData[blockBufferOffset + row + 2];\n      p3 = blockData[blockBufferOffset + row + 3];\n      p4 = blockData[blockBufferOffset + row + 4];\n      p5 = blockData[blockBufferOffset + row + 5];\n      p6 = blockData[blockBufferOffset + row + 6];\n      p7 = blockData[blockBufferOffset + row + 7];\n      p0 *= qt[row];\n      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {\n        t = dctSqrt2 * p0 + 512 >> 10;\n        p[row] = t;\n        p[row + 1] = t;\n        p[row + 2] = t;\n        p[row + 3] = t;\n        p[row + 4] = t;\n        p[row + 5] = t;\n        p[row + 6] = t;\n        p[row + 7] = t;\n        continue;\n      }\n      p1 *= qt[row + 1];\n      p2 *= qt[row + 2];\n      p3 *= qt[row + 3];\n      p4 *= qt[row + 4];\n      p5 *= qt[row + 5];\n      p6 *= qt[row + 6];\n      p7 *= qt[row + 7];\n      v0 = dctSqrt2 * p0 + 128 >> 8;\n      v1 = dctSqrt2 * p4 + 128 >> 8;\n      v2 = p2;\n      v3 = p6;\n      v4 = dctSqrt1d2 * (p1 - p7) + 128 >> 8;\n      v7 = dctSqrt1d2 * (p1 + p7) + 128 >> 8;\n      v5 = p3 << 4;\n      v6 = p5 << 4;\n      v0 = v0 + v1 + 1 >> 1;\n      v1 = v0 - v1;\n      t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8;\n      v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8;\n      v3 = t;\n      v4 = v4 + v6 + 1 >> 1;\n      v6 = v4 - v6;\n      v7 = v7 + v5 + 1 >> 1;\n      v5 = v7 - v5;\n      v0 = v0 + v3 + 1 >> 1;\n      v3 = v0 - v3;\n      v1 = v1 + v2 + 1 >> 1;\n      v2 = v1 - v2;\n      t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;\n      v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;\n      v7 = t;\n      t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;\n      v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;\n      v6 = t;\n      p[row] = v0 + v7;\n      p[row + 7] = v0 - v7;\n      p[row + 1] = v1 + v6;\n      p[row + 6] = v1 - v6;\n      p[row + 2] = v2 + v5;\n      p[row + 5] = v2 - v5;\n      p[row + 3] = v3 + v4;\n      p[row + 4] = v3 - v4;\n    }\n    for (var col = 0; col < 8; ++col) {\n      p0 = p[col];\n      p1 = p[col + 8];\n      p2 = p[col + 16];\n      p3 = p[col + 24];\n      p4 = p[col + 32];\n      p5 = p[col + 40];\n      p6 = p[col + 48];\n      p7 = p[col + 56];\n      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {\n        t = dctSqrt2 * p0 + 8192 >> 14;\n        t = t < -2040 ? 0 : t >= 2024 ? 255 : t + 2056 >> 4;\n        blockData[blockBufferOffset + col] = t;\n        blockData[blockBufferOffset + col + 8] = t;\n        blockData[blockBufferOffset + col + 16] = t;\n        blockData[blockBufferOffset + col + 24] = t;\n        blockData[blockBufferOffset + col + 32] = t;\n        blockData[blockBufferOffset + col + 40] = t;\n        blockData[blockBufferOffset + col + 48] = t;\n        blockData[blockBufferOffset + col + 56] = t;\n        continue;\n      }\n      v0 = dctSqrt2 * p0 + 2048 >> 12;\n      v1 = dctSqrt2 * p4 + 2048 >> 12;\n      v2 = p2;\n      v3 = p6;\n      v4 = dctSqrt1d2 * (p1 - p7) + 2048 >> 12;\n      v7 = dctSqrt1d2 * (p1 + p7) + 2048 >> 12;\n      v5 = p3;\n      v6 = p5;\n      v0 = (v0 + v1 + 1 >> 1) + 4112;\n      v1 = v0 - v1;\n      t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12;\n      v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12;\n      v3 = t;\n      v4 = v4 + v6 + 1 >> 1;\n      v6 = v4 - v6;\n      v7 = v7 + v5 + 1 >> 1;\n      v5 = v7 - v5;\n      v0 = v0 + v3 + 1 >> 1;\n      v3 = v0 - v3;\n      v1 = v1 + v2 + 1 >> 1;\n      v2 = v1 - v2;\n      t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;\n      v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;\n      v7 = t;\n      t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;\n      v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;\n      v6 = t;\n      p0 = v0 + v7;\n      p7 = v0 - v7;\n      p1 = v1 + v6;\n      p6 = v1 - v6;\n      p2 = v2 + v5;\n      p5 = v2 - v5;\n      p3 = v3 + v4;\n      p4 = v3 - v4;\n      p0 = p0 < 16 ? 0 : p0 >= 4080 ? 255 : p0 >> 4;\n      p1 = p1 < 16 ? 0 : p1 >= 4080 ? 255 : p1 >> 4;\n      p2 = p2 < 16 ? 0 : p2 >= 4080 ? 255 : p2 >> 4;\n      p3 = p3 < 16 ? 0 : p3 >= 4080 ? 255 : p3 >> 4;\n      p4 = p4 < 16 ? 0 : p4 >= 4080 ? 255 : p4 >> 4;\n      p5 = p5 < 16 ? 0 : p5 >= 4080 ? 255 : p5 >> 4;\n      p6 = p6 < 16 ? 0 : p6 >= 4080 ? 255 : p6 >> 4;\n      p7 = p7 < 16 ? 0 : p7 >= 4080 ? 255 : p7 >> 4;\n      blockData[blockBufferOffset + col] = p0;\n      blockData[blockBufferOffset + col + 8] = p1;\n      blockData[blockBufferOffset + col + 16] = p2;\n      blockData[blockBufferOffset + col + 24] = p3;\n      blockData[blockBufferOffset + col + 32] = p4;\n      blockData[blockBufferOffset + col + 40] = p5;\n      blockData[blockBufferOffset + col + 48] = p6;\n      blockData[blockBufferOffset + col + 56] = p7;\n    }\n  }\n  function buildComponentData(frame, component) {\n    var blocksPerLine = component.blocksPerLine;\n    var blocksPerColumn = component.blocksPerColumn;\n    var computationBuffer = new Int16Array(64);\n    for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {\n      for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {\n        var offset = getBlockBufferOffset(component, blockRow, blockCol);\n        quantizeAndInverse(component, offset, computationBuffer);\n      }\n    }\n    return component.blockData;\n  }\n  function clamp0to255(a) {\n    return a <= 0 ? 0 : a >= 255 ? 255 : a;\n  }\n  function findNextFileMarker(data, currentPos, startPos) {\n    function peekUint16(pos) {\n      return data[pos] << 8 | data[pos + 1];\n    }\n    var maxPos = data.length - 1;\n    var newPos = startPos < currentPos ? startPos : currentPos;\n    if (currentPos >= maxPos) {\n      return null;\n    }\n    var currentMarker = peekUint16(currentPos);\n    if (currentMarker >= 0xFFC0 && currentMarker <= 0xFFFE) {\n      return {\n        invalid: null,\n        marker: currentMarker,\n        offset: currentPos\n      };\n    }\n    var newMarker = peekUint16(newPos);\n    while (!(newMarker >= 0xFFC0 && newMarker <= 0xFFFE)) {\n      if (++newPos >= maxPos) {\n        return null;\n      }\n      newMarker = peekUint16(newPos);\n    }\n    return {\n      invalid: currentMarker.toString(16),\n      marker: newMarker,\n      offset: newPos\n    };\n  }\n  JpegImage.prototype = {\n    parse: function parse(data) {\n      function readUint16() {\n        var value = data[offset] << 8 | data[offset + 1];\n        offset += 2;\n        return value;\n      }\n      function readDataBlock() {\n        var length = readUint16();\n        var endOffset = offset + length - 2;\n        var fileMarker = findNextFileMarker(data, endOffset, offset);\n        if (fileMarker && fileMarker.invalid) {\n          (0, _util.warn)('readDataBlock - incorrect length, next marker is: ' + fileMarker.invalid);\n          endOffset = fileMarker.offset;\n        }\n        var array = data.subarray(offset, endOffset);\n        offset += array.length;\n        return array;\n      }\n      function prepareComponents(frame) {\n        var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);\n        var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);\n        for (var i = 0; i < frame.components.length; i++) {\n          component = frame.components[i];\n          var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH);\n          var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV);\n          var blocksPerLineForMcu = mcusPerLine * component.h;\n          var blocksPerColumnForMcu = mcusPerColumn * component.v;\n          var blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1);\n          component.blockData = new Int16Array(blocksBufferSize);\n          component.blocksPerLine = blocksPerLine;\n          component.blocksPerColumn = blocksPerColumn;\n        }\n        frame.mcusPerLine = mcusPerLine;\n        frame.mcusPerColumn = mcusPerColumn;\n      }\n      var offset = 0;\n      var jfif = null;\n      var adobe = null;\n      var frame, resetInterval;\n      var quantizationTables = [];\n      var huffmanTablesAC = [],\n          huffmanTablesDC = [];\n      var fileMarker = readUint16();\n      if (fileMarker !== 0xFFD8) {\n        throw new JpegError('SOI not found');\n      }\n      fileMarker = readUint16();\n      while (fileMarker !== 0xFFD9) {\n        var i, j, l;\n        switch (fileMarker) {\n          case 0xFFE0:\n          case 0xFFE1:\n          case 0xFFE2:\n          case 0xFFE3:\n          case 0xFFE4:\n          case 0xFFE5:\n          case 0xFFE6:\n          case 0xFFE7:\n          case 0xFFE8:\n          case 0xFFE9:\n          case 0xFFEA:\n          case 0xFFEB:\n          case 0xFFEC:\n          case 0xFFED:\n          case 0xFFEE:\n          case 0xFFEF:\n          case 0xFFFE:\n            var appData = readDataBlock();\n            if (fileMarker === 0xFFE0) {\n              if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) {\n                jfif = {\n                  version: {\n                    major: appData[5],\n                    minor: appData[6]\n                  },\n                  densityUnits: appData[7],\n                  xDensity: appData[8] << 8 | appData[9],\n                  yDensity: appData[10] << 8 | appData[11],\n                  thumbWidth: appData[12],\n                  thumbHeight: appData[13],\n                  thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])\n                };\n              }\n            }\n            if (fileMarker === 0xFFEE) {\n              if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F && appData[3] === 0x62 && appData[4] === 0x65) {\n                adobe = {\n                  version: appData[5] << 8 | appData[6],\n                  flags0: appData[7] << 8 | appData[8],\n                  flags1: appData[9] << 8 | appData[10],\n                  transformCode: appData[11]\n                };\n              }\n            }\n            break;\n          case 0xFFDB:\n            var quantizationTablesLength = readUint16();\n            var quantizationTablesEnd = quantizationTablesLength + offset - 2;\n            var z;\n            while (offset < quantizationTablesEnd) {\n              var quantizationTableSpec = data[offset++];\n              var tableData = new Uint16Array(64);\n              if (quantizationTableSpec >> 4 === 0) {\n                for (j = 0; j < 64; j++) {\n                  z = dctZigZag[j];\n                  tableData[z] = data[offset++];\n                }\n              } else if (quantizationTableSpec >> 4 === 1) {\n                for (j = 0; j < 64; j++) {\n                  z = dctZigZag[j];\n                  tableData[z] = readUint16();\n                }\n              } else {\n                throw new JpegError('DQT - invalid table spec');\n              }\n              quantizationTables[quantizationTableSpec & 15] = tableData;\n            }\n            break;\n          case 0xFFC0:\n          case 0xFFC1:\n          case 0xFFC2:\n            if (frame) {\n              throw new JpegError('Only single frame JPEGs supported');\n            }\n            readUint16();\n            frame = {};\n            frame.extended = fileMarker === 0xFFC1;\n            frame.progressive = fileMarker === 0xFFC2;\n            frame.precision = data[offset++];\n            frame.scanLines = readUint16();\n            frame.samplesPerLine = readUint16();\n            frame.components = [];\n            frame.componentIds = {};\n            var componentsCount = data[offset++],\n                componentId;\n            var maxH = 0,\n                maxV = 0;\n            for (i = 0; i < componentsCount; i++) {\n              componentId = data[offset];\n              var h = data[offset + 1] >> 4;\n              var v = data[offset + 1] & 15;\n              if (maxH < h) {\n                maxH = h;\n              }\n              if (maxV < v) {\n                maxV = v;\n              }\n              var qId = data[offset + 2];\n              l = frame.components.push({\n                h: h,\n                v: v,\n                quantizationId: qId,\n                quantizationTable: null\n              });\n              frame.componentIds[componentId] = l - 1;\n              offset += 3;\n            }\n            frame.maxH = maxH;\n            frame.maxV = maxV;\n            prepareComponents(frame);\n            break;\n          case 0xFFC4:\n            var huffmanLength = readUint16();\n            for (i = 2; i < huffmanLength;) {\n              var huffmanTableSpec = data[offset++];\n              var codeLengths = new Uint8Array(16);\n              var codeLengthSum = 0;\n              for (j = 0; j < 16; j++, offset++) {\n                codeLengthSum += codeLengths[j] = data[offset];\n              }\n              var huffmanValues = new Uint8Array(codeLengthSum);\n              for (j = 0; j < codeLengthSum; j++, offset++) {\n                huffmanValues[j] = data[offset];\n              }\n              i += 17 + codeLengthSum;\n              (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues);\n            }\n            break;\n          case 0xFFDD:\n            readUint16();\n            resetInterval = readUint16();\n            break;\n          case 0xFFDA:\n            readUint16();\n            var selectorsCount = data[offset++];\n            var components = [],\n                component;\n            for (i = 0; i < selectorsCount; i++) {\n              var componentIndex = frame.componentIds[data[offset++]];\n              component = frame.components[componentIndex];\n              var tableSpec = data[offset++];\n              component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];\n              component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];\n              components.push(component);\n            }\n            var spectralStart = data[offset++];\n            var spectralEnd = data[offset++];\n            var successiveApproximation = data[offset++];\n            var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15);\n            offset += processed;\n            break;\n          case 0xFFFF:\n            if (data[offset] !== 0xFF) {\n              offset--;\n            }\n            break;\n          default:\n            if (data[offset - 3] === 0xFF && data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {\n              offset -= 3;\n              break;\n            }\n            throw new JpegError('unknown marker ' + fileMarker.toString(16));\n        }\n        fileMarker = readUint16();\n      }\n      this.width = frame.samplesPerLine;\n      this.height = frame.scanLines;\n      this.jfif = jfif;\n      this.adobe = adobe;\n      this.components = [];\n      for (i = 0; i < frame.components.length; i++) {\n        component = frame.components[i];\n        var quantizationTable = quantizationTables[component.quantizationId];\n        if (quantizationTable) {\n          component.quantizationTable = quantizationTable;\n        }\n        this.components.push({\n          output: buildComponentData(frame, component),\n          scaleX: component.h / frame.maxH,\n          scaleY: component.v / frame.maxV,\n          blocksPerLine: component.blocksPerLine,\n          blocksPerColumn: component.blocksPerColumn\n        });\n      }\n      this.numComponents = this.components.length;\n    },\n    _getLinearizedBlockData: function getLinearizedBlockData(width, height) {\n      var scaleX = this.width / width,\n          scaleY = this.height / height;\n      var component, componentScaleX, componentScaleY, blocksPerScanline;\n      var x, y, i, j, k;\n      var index;\n      var offset = 0;\n      var output;\n      var numComponents = this.components.length;\n      var dataLength = width * height * numComponents;\n      var data = new Uint8Array(dataLength);\n      var xScaleBlockOffset = new Uint32Array(width);\n      var mask3LSB = 0xfffffff8;\n      for (i = 0; i < numComponents; i++) {\n        component = this.components[i];\n        componentScaleX = component.scaleX * scaleX;\n        componentScaleY = component.scaleY * scaleY;\n        offset = i;\n        output = component.output;\n        blocksPerScanline = component.blocksPerLine + 1 << 3;\n        for (x = 0; x < width; x++) {\n          j = 0 | x * componentScaleX;\n          xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7;\n        }\n        for (y = 0; y < height; y++) {\n          j = 0 | y * componentScaleY;\n          index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3;\n          for (x = 0; x < width; x++) {\n            data[offset] = output[index + xScaleBlockOffset[x]];\n            offset += numComponents;\n          }\n        }\n      }\n      var transform = this.decodeTransform;\n      if (transform) {\n        for (i = 0; i < dataLength;) {\n          for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) {\n            data[i] = (data[i] * transform[k] >> 8) + transform[k + 1];\n          }\n        }\n      }\n      return data;\n    },\n    _isColorConversionNeeded: function _isColorConversionNeeded() {\n      if (this.adobe) {\n        return !!this.adobe.transformCode;\n      }\n      if (this.numComponents === 3) {\n        if (this.colorTransform === 0) {\n          return false;\n        }\n        return true;\n      }\n      if (this.colorTransform === 1) {\n        return true;\n      }\n      return false;\n    },\n\n    _convertYccToRgb: function convertYccToRgb(data) {\n      var Y, Cb, Cr;\n      for (var i = 0, length = data.length; i < length; i += 3) {\n        Y = data[i];\n        Cb = data[i + 1];\n        Cr = data[i + 2];\n        data[i] = clamp0to255(Y - 179.456 + 1.402 * Cr);\n        data[i + 1] = clamp0to255(Y + 135.459 - 0.344 * Cb - 0.714 * Cr);\n        data[i + 2] = clamp0to255(Y - 226.816 + 1.772 * Cb);\n      }\n      return data;\n    },\n    _convertYcckToRgb: function convertYcckToRgb(data) {\n      var Y, Cb, Cr, k;\n      var offset = 0;\n      for (var i = 0, length = data.length; i < length; i += 4) {\n        Y = data[i];\n        Cb = data[i + 1];\n        Cr = data[i + 2];\n        k = data[i + 3];\n        var r = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776);\n        var g = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665);\n        var b = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407);\n        data[offset++] = clamp0to255(r);\n        data[offset++] = clamp0to255(g);\n        data[offset++] = clamp0to255(b);\n      }\n      return data;\n    },\n    _convertYcckToCmyk: function convertYcckToCmyk(data) {\n      var Y, Cb, Cr;\n      for (var i = 0, length = data.length; i < length; i += 4) {\n        Y = data[i];\n        Cb = data[i + 1];\n        Cr = data[i + 2];\n        data[i] = clamp0to255(434.456 - Y - 1.402 * Cr);\n        data[i + 1] = clamp0to255(119.541 - Y + 0.344 * Cb + 0.714 * Cr);\n        data[i + 2] = clamp0to255(481.816 - Y - 1.772 * Cb);\n      }\n      return data;\n    },\n    _convertCmykToRgb: function convertCmykToRgb(data) {\n      var c, m, y, k;\n      var offset = 0;\n      var min = -255 * 255 * 255;\n      var scale = 1 / 255 / 255;\n      for (var i = 0, length = data.length; i < length; i += 4) {\n        c = data[i];\n        m = data[i + 1];\n        y = data[i + 2];\n        k = data[i + 3];\n        var r = c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k - 72734.4411664936) + m * (1.7149763477362134 * m - 5.6096736904047315 * y - 17.873870861415444 * k - 1401.7366389350734) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 4465.541406466231) - k * (21.86122147463605 * k + 48317.86113160301);\n        var g = c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k - 20220.756542821975) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 48691.05921601825) + y * (4.444339102852739 * y + 9.8632861493405 * k - 6341.191035517494) - k * (20.737325471181034 * k + 47890.15695978492);\n        var b = c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k - 3616.812083916688) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 28620.90484698408) + y * (0.03296041114873217 * y + 115.60384449646641 * k - 49363.43385999684) - k * (22.33816807309886 * k + 45932.16563550634);\n        data[offset++] = r >= 0 ? 255 : r <= min ? 0 : 255 + r * scale | 0;\n        data[offset++] = g >= 0 ? 255 : g <= min ? 0 : 255 + g * scale | 0;\n        data[offset++] = b >= 0 ? 255 : b <= min ? 0 : 255 + b * scale | 0;\n      }\n      return data;\n    },\n    getData: function getData(width, height, forceRGBoutput) {\n      if (this.numComponents > 4) {\n        throw new JpegError('Unsupported color mode');\n      }\n      var data = this._getLinearizedBlockData(width, height);\n      if (this.numComponents === 1 && forceRGBoutput) {\n        var dataLength = data.length;\n        var rgbData = new Uint8Array(dataLength * 3);\n        var offset = 0;\n        for (var i = 0; i < dataLength; i++) {\n          var grayColor = data[i];\n          rgbData[offset++] = grayColor;\n          rgbData[offset++] = grayColor;\n          rgbData[offset++] = grayColor;\n        }\n        return rgbData;\n      } else if (this.numComponents === 3 && this._isColorConversionNeeded()) {\n        return this._convertYccToRgb(data);\n      } else if (this.numComponents === 4) {\n        if (this._isColorConversionNeeded()) {\n          if (forceRGBoutput) {\n            return this._convertYcckToRgb(data);\n          }\n          return this._convertYcckToCmyk(data);\n        } else if (forceRGBoutput) {\n          return this._convertCmykToRgb(data);\n        }\n      }\n      return data;\n    }\n  };\n  return JpegImage;\n}();\nexports.JpegImage = JpegImage;\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getMetrics = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar getMetrics = (0, _util.getLookupTableFactory)(function (t) {\n  t['Courier'] = 600;\n  t['Courier-Bold'] = 600;\n  t['Courier-BoldOblique'] = 600;\n  t['Courier-Oblique'] = 600;\n  t['Helvetica'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 278;\n    t['exclam'] = 278;\n    t['quotedbl'] = 355;\n    t['numbersign'] = 556;\n    t['dollar'] = 556;\n    t['percent'] = 889;\n    t['ampersand'] = 667;\n    t['quoteright'] = 222;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 389;\n    t['plus'] = 584;\n    t['comma'] = 278;\n    t['hyphen'] = 333;\n    t['period'] = 278;\n    t['slash'] = 278;\n    t['zero'] = 556;\n    t['one'] = 556;\n    t['two'] = 556;\n    t['three'] = 556;\n    t['four'] = 556;\n    t['five'] = 556;\n    t['six'] = 556;\n    t['seven'] = 556;\n    t['eight'] = 556;\n    t['nine'] = 556;\n    t['colon'] = 278;\n    t['semicolon'] = 278;\n    t['less'] = 584;\n    t['equal'] = 584;\n    t['greater'] = 584;\n    t['question'] = 556;\n    t['at'] = 1015;\n    t['A'] = 667;\n    t['B'] = 667;\n    t['C'] = 722;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 611;\n    t['G'] = 778;\n    t['H'] = 722;\n    t['I'] = 278;\n    t['J'] = 500;\n    t['K'] = 667;\n    t['L'] = 556;\n    t['M'] = 833;\n    t['N'] = 722;\n    t['O'] = 778;\n    t['P'] = 667;\n    t['Q'] = 778;\n    t['R'] = 722;\n    t['S'] = 667;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 667;\n    t['W'] = 944;\n    t['X'] = 667;\n    t['Y'] = 667;\n    t['Z'] = 611;\n    t['bracketleft'] = 278;\n    t['backslash'] = 278;\n    t['bracketright'] = 278;\n    t['asciicircum'] = 469;\n    t['underscore'] = 556;\n    t['quoteleft'] = 222;\n    t['a'] = 556;\n    t['b'] = 556;\n    t['c'] = 500;\n    t['d'] = 556;\n    t['e'] = 556;\n    t['f'] = 278;\n    t['g'] = 556;\n    t['h'] = 556;\n    t['i'] = 222;\n    t['j'] = 222;\n    t['k'] = 500;\n    t['l'] = 222;\n    t['m'] = 833;\n    t['n'] = 556;\n    t['o'] = 556;\n    t['p'] = 556;\n    t['q'] = 556;\n    t['r'] = 333;\n    t['s'] = 500;\n    t['t'] = 278;\n    t['u'] = 556;\n    t['v'] = 500;\n    t['w'] = 722;\n    t['x'] = 500;\n    t['y'] = 500;\n    t['z'] = 500;\n    t['braceleft'] = 334;\n    t['bar'] = 260;\n    t['braceright'] = 334;\n    t['asciitilde'] = 584;\n    t['exclamdown'] = 333;\n    t['cent'] = 556;\n    t['sterling'] = 556;\n    t['fraction'] = 167;\n    t['yen'] = 556;\n    t['florin'] = 556;\n    t['section'] = 556;\n    t['currency'] = 556;\n    t['quotesingle'] = 191;\n    t['quotedblleft'] = 333;\n    t['guillemotleft'] = 556;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 500;\n    t['fl'] = 500;\n    t['endash'] = 556;\n    t['dagger'] = 556;\n    t['daggerdbl'] = 556;\n    t['periodcentered'] = 278;\n    t['paragraph'] = 537;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 222;\n    t['quotedblbase'] = 333;\n    t['quotedblright'] = 333;\n    t['guillemotright'] = 556;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 611;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 1000;\n    t['ordfeminine'] = 370;\n    t['Lslash'] = 556;\n    t['Oslash'] = 778;\n    t['OE'] = 1000;\n    t['ordmasculine'] = 365;\n    t['ae'] = 889;\n    t['dotlessi'] = 278;\n    t['lslash'] = 222;\n    t['oslash'] = 611;\n    t['oe'] = 944;\n    t['germandbls'] = 611;\n    t['Idieresis'] = 278;\n    t['eacute'] = 556;\n    t['abreve'] = 556;\n    t['uhungarumlaut'] = 556;\n    t['ecaron'] = 556;\n    t['Ydieresis'] = 667;\n    t['divide'] = 584;\n    t['Yacute'] = 667;\n    t['Acircumflex'] = 667;\n    t['aacute'] = 556;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 500;\n    t['scommaaccent'] = 500;\n    t['ecircumflex'] = 556;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 556;\n    t['Uacute'] = 722;\n    t['uogonek'] = 556;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 737;\n    t['Emacron'] = 667;\n    t['ccaron'] = 500;\n    t['aring'] = 556;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 222;\n    t['agrave'] = 556;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 722;\n    t['atilde'] = 556;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 500;\n    t['scedilla'] = 500;\n    t['iacute'] = 278;\n    t['lozenge'] = 471;\n    t['Rcaron'] = 722;\n    t['Gcommaaccent'] = 778;\n    t['ucircumflex'] = 556;\n    t['acircumflex'] = 556;\n    t['Amacron'] = 667;\n    t['rcaron'] = 333;\n    t['ccedilla'] = 500;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 667;\n    t['Omacron'] = 778;\n    t['Racute'] = 722;\n    t['Sacute'] = 667;\n    t['dcaron'] = 643;\n    t['Umacron'] = 722;\n    t['uring'] = 556;\n    t['threesuperior'] = 333;\n    t['Ograve'] = 778;\n    t['Agrave'] = 667;\n    t['Abreve'] = 667;\n    t['multiply'] = 584;\n    t['uacute'] = 556;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 476;\n    t['ydieresis'] = 500;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 556;\n    t['edieresis'] = 556;\n    t['cacute'] = 500;\n    t['nacute'] = 556;\n    t['umacron'] = 556;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 278;\n    t['plusminus'] = 584;\n    t['brokenbar'] = 260;\n    t['registered'] = 737;\n    t['Gbreve'] = 778;\n    t['Idotaccent'] = 278;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 333;\n    t['omacron'] = 556;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 722;\n    t['lcommaaccent'] = 222;\n    t['tcaron'] = 317;\n    t['eogonek'] = 556;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 667;\n    t['Adieresis'] = 667;\n    t['egrave'] = 556;\n    t['zacute'] = 500;\n    t['iogonek'] = 222;\n    t['Oacute'] = 778;\n    t['oacute'] = 556;\n    t['amacron'] = 556;\n    t['sacute'] = 500;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 778;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 556;\n    t['twosuperior'] = 333;\n    t['Odieresis'] = 778;\n    t['mu'] = 556;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 556;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 556;\n    t['threequarters'] = 834;\n    t['Scedilla'] = 667;\n    t['lcaron'] = 299;\n    t['Kcommaaccent'] = 667;\n    t['Lacute'] = 556;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 556;\n    t['Igrave'] = 278;\n    t['Imacron'] = 278;\n    t['Lcaron'] = 556;\n    t['onehalf'] = 834;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 556;\n    t['ntilde'] = 556;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 556;\n    t['gbreve'] = 556;\n    t['onequarter'] = 834;\n    t['Scaron'] = 667;\n    t['Scommaaccent'] = 667;\n    t['Ohungarumlaut'] = 778;\n    t['degree'] = 400;\n    t['ograve'] = 556;\n    t['Ccaron'] = 722;\n    t['ugrave'] = 556;\n    t['radical'] = 453;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 333;\n    t['Ntilde'] = 722;\n    t['otilde'] = 556;\n    t['Rcommaaccent'] = 722;\n    t['Lcommaaccent'] = 556;\n    t['Atilde'] = 667;\n    t['Aogonek'] = 667;\n    t['Aring'] = 667;\n    t['Otilde'] = 778;\n    t['zdotaccent'] = 500;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 278;\n    t['kcommaaccent'] = 500;\n    t['minus'] = 584;\n    t['Icircumflex'] = 278;\n    t['ncaron'] = 556;\n    t['tcommaaccent'] = 278;\n    t['logicalnot'] = 584;\n    t['odieresis'] = 556;\n    t['udieresis'] = 556;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 556;\n    t['eth'] = 556;\n    t['zcaron'] = 500;\n    t['ncommaaccent'] = 556;\n    t['onesuperior'] = 333;\n    t['imacron'] = 278;\n    t['Euro'] = 556;\n  });\n  t['Helvetica-Bold'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 278;\n    t['exclam'] = 333;\n    t['quotedbl'] = 474;\n    t['numbersign'] = 556;\n    t['dollar'] = 556;\n    t['percent'] = 889;\n    t['ampersand'] = 722;\n    t['quoteright'] = 278;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 389;\n    t['plus'] = 584;\n    t['comma'] = 278;\n    t['hyphen'] = 333;\n    t['period'] = 278;\n    t['slash'] = 278;\n    t['zero'] = 556;\n    t['one'] = 556;\n    t['two'] = 556;\n    t['three'] = 556;\n    t['four'] = 556;\n    t['five'] = 556;\n    t['six'] = 556;\n    t['seven'] = 556;\n    t['eight'] = 556;\n    t['nine'] = 556;\n    t['colon'] = 333;\n    t['semicolon'] = 333;\n    t['less'] = 584;\n    t['equal'] = 584;\n    t['greater'] = 584;\n    t['question'] = 611;\n    t['at'] = 975;\n    t['A'] = 722;\n    t['B'] = 722;\n    t['C'] = 722;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 611;\n    t['G'] = 778;\n    t['H'] = 722;\n    t['I'] = 278;\n    t['J'] = 556;\n    t['K'] = 722;\n    t['L'] = 611;\n    t['M'] = 833;\n    t['N'] = 722;\n    t['O'] = 778;\n    t['P'] = 667;\n    t['Q'] = 778;\n    t['R'] = 722;\n    t['S'] = 667;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 667;\n    t['W'] = 944;\n    t['X'] = 667;\n    t['Y'] = 667;\n    t['Z'] = 611;\n    t['bracketleft'] = 333;\n    t['backslash'] = 278;\n    t['bracketright'] = 333;\n    t['asciicircum'] = 584;\n    t['underscore'] = 556;\n    t['quoteleft'] = 278;\n    t['a'] = 556;\n    t['b'] = 611;\n    t['c'] = 556;\n    t['d'] = 611;\n    t['e'] = 556;\n    t['f'] = 333;\n    t['g'] = 611;\n    t['h'] = 611;\n    t['i'] = 278;\n    t['j'] = 278;\n    t['k'] = 556;\n    t['l'] = 278;\n    t['m'] = 889;\n    t['n'] = 611;\n    t['o'] = 611;\n    t['p'] = 611;\n    t['q'] = 611;\n    t['r'] = 389;\n    t['s'] = 556;\n    t['t'] = 333;\n    t['u'] = 611;\n    t['v'] = 556;\n    t['w'] = 778;\n    t['x'] = 556;\n    t['y'] = 556;\n    t['z'] = 500;\n    t['braceleft'] = 389;\n    t['bar'] = 280;\n    t['braceright'] = 389;\n    t['asciitilde'] = 584;\n    t['exclamdown'] = 333;\n    t['cent'] = 556;\n    t['sterling'] = 556;\n    t['fraction'] = 167;\n    t['yen'] = 556;\n    t['florin'] = 556;\n    t['section'] = 556;\n    t['currency'] = 556;\n    t['quotesingle'] = 238;\n    t['quotedblleft'] = 500;\n    t['guillemotleft'] = 556;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 611;\n    t['fl'] = 611;\n    t['endash'] = 556;\n    t['dagger'] = 556;\n    t['daggerdbl'] = 556;\n    t['periodcentered'] = 278;\n    t['paragraph'] = 556;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 278;\n    t['quotedblbase'] = 500;\n    t['quotedblright'] = 500;\n    t['guillemotright'] = 556;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 611;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 1000;\n    t['ordfeminine'] = 370;\n    t['Lslash'] = 611;\n    t['Oslash'] = 778;\n    t['OE'] = 1000;\n    t['ordmasculine'] = 365;\n    t['ae'] = 889;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 611;\n    t['oe'] = 944;\n    t['germandbls'] = 611;\n    t['Idieresis'] = 278;\n    t['eacute'] = 556;\n    t['abreve'] = 556;\n    t['uhungarumlaut'] = 611;\n    t['ecaron'] = 556;\n    t['Ydieresis'] = 667;\n    t['divide'] = 584;\n    t['Yacute'] = 667;\n    t['Acircumflex'] = 722;\n    t['aacute'] = 556;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 556;\n    t['scommaaccent'] = 556;\n    t['ecircumflex'] = 556;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 556;\n    t['Uacute'] = 722;\n    t['uogonek'] = 611;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 737;\n    t['Emacron'] = 667;\n    t['ccaron'] = 556;\n    t['aring'] = 556;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 278;\n    t['agrave'] = 556;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 722;\n    t['atilde'] = 556;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 556;\n    t['scedilla'] = 556;\n    t['iacute'] = 278;\n    t['lozenge'] = 494;\n    t['Rcaron'] = 722;\n    t['Gcommaaccent'] = 778;\n    t['ucircumflex'] = 611;\n    t['acircumflex'] = 556;\n    t['Amacron'] = 722;\n    t['rcaron'] = 389;\n    t['ccedilla'] = 556;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 667;\n    t['Omacron'] = 778;\n    t['Racute'] = 722;\n    t['Sacute'] = 667;\n    t['dcaron'] = 743;\n    t['Umacron'] = 722;\n    t['uring'] = 611;\n    t['threesuperior'] = 333;\n    t['Ograve'] = 778;\n    t['Agrave'] = 722;\n    t['Abreve'] = 722;\n    t['multiply'] = 584;\n    t['uacute'] = 611;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 494;\n    t['ydieresis'] = 556;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 556;\n    t['edieresis'] = 556;\n    t['cacute'] = 556;\n    t['nacute'] = 611;\n    t['umacron'] = 611;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 278;\n    t['plusminus'] = 584;\n    t['brokenbar'] = 280;\n    t['registered'] = 737;\n    t['Gbreve'] = 778;\n    t['Idotaccent'] = 278;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 389;\n    t['omacron'] = 611;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 722;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 389;\n    t['eogonek'] = 556;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 722;\n    t['Adieresis'] = 722;\n    t['egrave'] = 556;\n    t['zacute'] = 500;\n    t['iogonek'] = 278;\n    t['Oacute'] = 778;\n    t['oacute'] = 611;\n    t['amacron'] = 556;\n    t['sacute'] = 556;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 778;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 611;\n    t['twosuperior'] = 333;\n    t['Odieresis'] = 778;\n    t['mu'] = 611;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 611;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 611;\n    t['threequarters'] = 834;\n    t['Scedilla'] = 667;\n    t['lcaron'] = 400;\n    t['Kcommaaccent'] = 722;\n    t['Lacute'] = 611;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 556;\n    t['Igrave'] = 278;\n    t['Imacron'] = 278;\n    t['Lcaron'] = 611;\n    t['onehalf'] = 834;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 611;\n    t['ntilde'] = 611;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 556;\n    t['gbreve'] = 611;\n    t['onequarter'] = 834;\n    t['Scaron'] = 667;\n    t['Scommaaccent'] = 667;\n    t['Ohungarumlaut'] = 778;\n    t['degree'] = 400;\n    t['ograve'] = 611;\n    t['Ccaron'] = 722;\n    t['ugrave'] = 611;\n    t['radical'] = 549;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 389;\n    t['Ntilde'] = 722;\n    t['otilde'] = 611;\n    t['Rcommaaccent'] = 722;\n    t['Lcommaaccent'] = 611;\n    t['Atilde'] = 722;\n    t['Aogonek'] = 722;\n    t['Aring'] = 722;\n    t['Otilde'] = 778;\n    t['zdotaccent'] = 500;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 278;\n    t['kcommaaccent'] = 556;\n    t['minus'] = 584;\n    t['Icircumflex'] = 278;\n    t['ncaron'] = 611;\n    t['tcommaaccent'] = 333;\n    t['logicalnot'] = 584;\n    t['odieresis'] = 611;\n    t['udieresis'] = 611;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 611;\n    t['eth'] = 611;\n    t['zcaron'] = 500;\n    t['ncommaaccent'] = 611;\n    t['onesuperior'] = 333;\n    t['imacron'] = 278;\n    t['Euro'] = 556;\n  });\n  t['Helvetica-BoldOblique'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 278;\n    t['exclam'] = 333;\n    t['quotedbl'] = 474;\n    t['numbersign'] = 556;\n    t['dollar'] = 556;\n    t['percent'] = 889;\n    t['ampersand'] = 722;\n    t['quoteright'] = 278;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 389;\n    t['plus'] = 584;\n    t['comma'] = 278;\n    t['hyphen'] = 333;\n    t['period'] = 278;\n    t['slash'] = 278;\n    t['zero'] = 556;\n    t['one'] = 556;\n    t['two'] = 556;\n    t['three'] = 556;\n    t['four'] = 556;\n    t['five'] = 556;\n    t['six'] = 556;\n    t['seven'] = 556;\n    t['eight'] = 556;\n    t['nine'] = 556;\n    t['colon'] = 333;\n    t['semicolon'] = 333;\n    t['less'] = 584;\n    t['equal'] = 584;\n    t['greater'] = 584;\n    t['question'] = 611;\n    t['at'] = 975;\n    t['A'] = 722;\n    t['B'] = 722;\n    t['C'] = 722;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 611;\n    t['G'] = 778;\n    t['H'] = 722;\n    t['I'] = 278;\n    t['J'] = 556;\n    t['K'] = 722;\n    t['L'] = 611;\n    t['M'] = 833;\n    t['N'] = 722;\n    t['O'] = 778;\n    t['P'] = 667;\n    t['Q'] = 778;\n    t['R'] = 722;\n    t['S'] = 667;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 667;\n    t['W'] = 944;\n    t['X'] = 667;\n    t['Y'] = 667;\n    t['Z'] = 611;\n    t['bracketleft'] = 333;\n    t['backslash'] = 278;\n    t['bracketright'] = 333;\n    t['asciicircum'] = 584;\n    t['underscore'] = 556;\n    t['quoteleft'] = 278;\n    t['a'] = 556;\n    t['b'] = 611;\n    t['c'] = 556;\n    t['d'] = 611;\n    t['e'] = 556;\n    t['f'] = 333;\n    t['g'] = 611;\n    t['h'] = 611;\n    t['i'] = 278;\n    t['j'] = 278;\n    t['k'] = 556;\n    t['l'] = 278;\n    t['m'] = 889;\n    t['n'] = 611;\n    t['o'] = 611;\n    t['p'] = 611;\n    t['q'] = 611;\n    t['r'] = 389;\n    t['s'] = 556;\n    t['t'] = 333;\n    t['u'] = 611;\n    t['v'] = 556;\n    t['w'] = 778;\n    t['x'] = 556;\n    t['y'] = 556;\n    t['z'] = 500;\n    t['braceleft'] = 389;\n    t['bar'] = 280;\n    t['braceright'] = 389;\n    t['asciitilde'] = 584;\n    t['exclamdown'] = 333;\n    t['cent'] = 556;\n    t['sterling'] = 556;\n    t['fraction'] = 167;\n    t['yen'] = 556;\n    t['florin'] = 556;\n    t['section'] = 556;\n    t['currency'] = 556;\n    t['quotesingle'] = 238;\n    t['quotedblleft'] = 500;\n    t['guillemotleft'] = 556;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 611;\n    t['fl'] = 611;\n    t['endash'] = 556;\n    t['dagger'] = 556;\n    t['daggerdbl'] = 556;\n    t['periodcentered'] = 278;\n    t['paragraph'] = 556;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 278;\n    t['quotedblbase'] = 500;\n    t['quotedblright'] = 500;\n    t['guillemotright'] = 556;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 611;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 1000;\n    t['ordfeminine'] = 370;\n    t['Lslash'] = 611;\n    t['Oslash'] = 778;\n    t['OE'] = 1000;\n    t['ordmasculine'] = 365;\n    t['ae'] = 889;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 611;\n    t['oe'] = 944;\n    t['germandbls'] = 611;\n    t['Idieresis'] = 278;\n    t['eacute'] = 556;\n    t['abreve'] = 556;\n    t['uhungarumlaut'] = 611;\n    t['ecaron'] = 556;\n    t['Ydieresis'] = 667;\n    t['divide'] = 584;\n    t['Yacute'] = 667;\n    t['Acircumflex'] = 722;\n    t['aacute'] = 556;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 556;\n    t['scommaaccent'] = 556;\n    t['ecircumflex'] = 556;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 556;\n    t['Uacute'] = 722;\n    t['uogonek'] = 611;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 737;\n    t['Emacron'] = 667;\n    t['ccaron'] = 556;\n    t['aring'] = 556;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 278;\n    t['agrave'] = 556;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 722;\n    t['atilde'] = 556;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 556;\n    t['scedilla'] = 556;\n    t['iacute'] = 278;\n    t['lozenge'] = 494;\n    t['Rcaron'] = 722;\n    t['Gcommaaccent'] = 778;\n    t['ucircumflex'] = 611;\n    t['acircumflex'] = 556;\n    t['Amacron'] = 722;\n    t['rcaron'] = 389;\n    t['ccedilla'] = 556;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 667;\n    t['Omacron'] = 778;\n    t['Racute'] = 722;\n    t['Sacute'] = 667;\n    t['dcaron'] = 743;\n    t['Umacron'] = 722;\n    t['uring'] = 611;\n    t['threesuperior'] = 333;\n    t['Ograve'] = 778;\n    t['Agrave'] = 722;\n    t['Abreve'] = 722;\n    t['multiply'] = 584;\n    t['uacute'] = 611;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 494;\n    t['ydieresis'] = 556;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 556;\n    t['edieresis'] = 556;\n    t['cacute'] = 556;\n    t['nacute'] = 611;\n    t['umacron'] = 611;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 278;\n    t['plusminus'] = 584;\n    t['brokenbar'] = 280;\n    t['registered'] = 737;\n    t['Gbreve'] = 778;\n    t['Idotaccent'] = 278;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 389;\n    t['omacron'] = 611;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 722;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 389;\n    t['eogonek'] = 556;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 722;\n    t['Adieresis'] = 722;\n    t['egrave'] = 556;\n    t['zacute'] = 500;\n    t['iogonek'] = 278;\n    t['Oacute'] = 778;\n    t['oacute'] = 611;\n    t['amacron'] = 556;\n    t['sacute'] = 556;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 778;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 611;\n    t['twosuperior'] = 333;\n    t['Odieresis'] = 778;\n    t['mu'] = 611;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 611;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 611;\n    t['threequarters'] = 834;\n    t['Scedilla'] = 667;\n    t['lcaron'] = 400;\n    t['Kcommaaccent'] = 722;\n    t['Lacute'] = 611;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 556;\n    t['Igrave'] = 278;\n    t['Imacron'] = 278;\n    t['Lcaron'] = 611;\n    t['onehalf'] = 834;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 611;\n    t['ntilde'] = 611;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 556;\n    t['gbreve'] = 611;\n    t['onequarter'] = 834;\n    t['Scaron'] = 667;\n    t['Scommaaccent'] = 667;\n    t['Ohungarumlaut'] = 778;\n    t['degree'] = 400;\n    t['ograve'] = 611;\n    t['Ccaron'] = 722;\n    t['ugrave'] = 611;\n    t['radical'] = 549;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 389;\n    t['Ntilde'] = 722;\n    t['otilde'] = 611;\n    t['Rcommaaccent'] = 722;\n    t['Lcommaaccent'] = 611;\n    t['Atilde'] = 722;\n    t['Aogonek'] = 722;\n    t['Aring'] = 722;\n    t['Otilde'] = 778;\n    t['zdotaccent'] = 500;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 278;\n    t['kcommaaccent'] = 556;\n    t['minus'] = 584;\n    t['Icircumflex'] = 278;\n    t['ncaron'] = 611;\n    t['tcommaaccent'] = 333;\n    t['logicalnot'] = 584;\n    t['odieresis'] = 611;\n    t['udieresis'] = 611;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 611;\n    t['eth'] = 611;\n    t['zcaron'] = 500;\n    t['ncommaaccent'] = 611;\n    t['onesuperior'] = 333;\n    t['imacron'] = 278;\n    t['Euro'] = 556;\n  });\n  t['Helvetica-Oblique'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 278;\n    t['exclam'] = 278;\n    t['quotedbl'] = 355;\n    t['numbersign'] = 556;\n    t['dollar'] = 556;\n    t['percent'] = 889;\n    t['ampersand'] = 667;\n    t['quoteright'] = 222;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 389;\n    t['plus'] = 584;\n    t['comma'] = 278;\n    t['hyphen'] = 333;\n    t['period'] = 278;\n    t['slash'] = 278;\n    t['zero'] = 556;\n    t['one'] = 556;\n    t['two'] = 556;\n    t['three'] = 556;\n    t['four'] = 556;\n    t['five'] = 556;\n    t['six'] = 556;\n    t['seven'] = 556;\n    t['eight'] = 556;\n    t['nine'] = 556;\n    t['colon'] = 278;\n    t['semicolon'] = 278;\n    t['less'] = 584;\n    t['equal'] = 584;\n    t['greater'] = 584;\n    t['question'] = 556;\n    t['at'] = 1015;\n    t['A'] = 667;\n    t['B'] = 667;\n    t['C'] = 722;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 611;\n    t['G'] = 778;\n    t['H'] = 722;\n    t['I'] = 278;\n    t['J'] = 500;\n    t['K'] = 667;\n    t['L'] = 556;\n    t['M'] = 833;\n    t['N'] = 722;\n    t['O'] = 778;\n    t['P'] = 667;\n    t['Q'] = 778;\n    t['R'] = 722;\n    t['S'] = 667;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 667;\n    t['W'] = 944;\n    t['X'] = 667;\n    t['Y'] = 667;\n    t['Z'] = 611;\n    t['bracketleft'] = 278;\n    t['backslash'] = 278;\n    t['bracketright'] = 278;\n    t['asciicircum'] = 469;\n    t['underscore'] = 556;\n    t['quoteleft'] = 222;\n    t['a'] = 556;\n    t['b'] = 556;\n    t['c'] = 500;\n    t['d'] = 556;\n    t['e'] = 556;\n    t['f'] = 278;\n    t['g'] = 556;\n    t['h'] = 556;\n    t['i'] = 222;\n    t['j'] = 222;\n    t['k'] = 500;\n    t['l'] = 222;\n    t['m'] = 833;\n    t['n'] = 556;\n    t['o'] = 556;\n    t['p'] = 556;\n    t['q'] = 556;\n    t['r'] = 333;\n    t['s'] = 500;\n    t['t'] = 278;\n    t['u'] = 556;\n    t['v'] = 500;\n    t['w'] = 722;\n    t['x'] = 500;\n    t['y'] = 500;\n    t['z'] = 500;\n    t['braceleft'] = 334;\n    t['bar'] = 260;\n    t['braceright'] = 334;\n    t['asciitilde'] = 584;\n    t['exclamdown'] = 333;\n    t['cent'] = 556;\n    t['sterling'] = 556;\n    t['fraction'] = 167;\n    t['yen'] = 556;\n    t['florin'] = 556;\n    t['section'] = 556;\n    t['currency'] = 556;\n    t['quotesingle'] = 191;\n    t['quotedblleft'] = 333;\n    t['guillemotleft'] = 556;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 500;\n    t['fl'] = 500;\n    t['endash'] = 556;\n    t['dagger'] = 556;\n    t['daggerdbl'] = 556;\n    t['periodcentered'] = 278;\n    t['paragraph'] = 537;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 222;\n    t['quotedblbase'] = 333;\n    t['quotedblright'] = 333;\n    t['guillemotright'] = 556;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 611;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 1000;\n    t['ordfeminine'] = 370;\n    t['Lslash'] = 556;\n    t['Oslash'] = 778;\n    t['OE'] = 1000;\n    t['ordmasculine'] = 365;\n    t['ae'] = 889;\n    t['dotlessi'] = 278;\n    t['lslash'] = 222;\n    t['oslash'] = 611;\n    t['oe'] = 944;\n    t['germandbls'] = 611;\n    t['Idieresis'] = 278;\n    t['eacute'] = 556;\n    t['abreve'] = 556;\n    t['uhungarumlaut'] = 556;\n    t['ecaron'] = 556;\n    t['Ydieresis'] = 667;\n    t['divide'] = 584;\n    t['Yacute'] = 667;\n    t['Acircumflex'] = 667;\n    t['aacute'] = 556;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 500;\n    t['scommaaccent'] = 500;\n    t['ecircumflex'] = 556;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 556;\n    t['Uacute'] = 722;\n    t['uogonek'] = 556;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 737;\n    t['Emacron'] = 667;\n    t['ccaron'] = 500;\n    t['aring'] = 556;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 222;\n    t['agrave'] = 556;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 722;\n    t['atilde'] = 556;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 500;\n    t['scedilla'] = 500;\n    t['iacute'] = 278;\n    t['lozenge'] = 471;\n    t['Rcaron'] = 722;\n    t['Gcommaaccent'] = 778;\n    t['ucircumflex'] = 556;\n    t['acircumflex'] = 556;\n    t['Amacron'] = 667;\n    t['rcaron'] = 333;\n    t['ccedilla'] = 500;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 667;\n    t['Omacron'] = 778;\n    t['Racute'] = 722;\n    t['Sacute'] = 667;\n    t['dcaron'] = 643;\n    t['Umacron'] = 722;\n    t['uring'] = 556;\n    t['threesuperior'] = 333;\n    t['Ograve'] = 778;\n    t['Agrave'] = 667;\n    t['Abreve'] = 667;\n    t['multiply'] = 584;\n    t['uacute'] = 556;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 476;\n    t['ydieresis'] = 500;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 556;\n    t['edieresis'] = 556;\n    t['cacute'] = 500;\n    t['nacute'] = 556;\n    t['umacron'] = 556;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 278;\n    t['plusminus'] = 584;\n    t['brokenbar'] = 260;\n    t['registered'] = 737;\n    t['Gbreve'] = 778;\n    t['Idotaccent'] = 278;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 333;\n    t['omacron'] = 556;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 722;\n    t['lcommaaccent'] = 222;\n    t['tcaron'] = 317;\n    t['eogonek'] = 556;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 667;\n    t['Adieresis'] = 667;\n    t['egrave'] = 556;\n    t['zacute'] = 500;\n    t['iogonek'] = 222;\n    t['Oacute'] = 778;\n    t['oacute'] = 556;\n    t['amacron'] = 556;\n    t['sacute'] = 500;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 778;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 556;\n    t['twosuperior'] = 333;\n    t['Odieresis'] = 778;\n    t['mu'] = 556;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 556;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 556;\n    t['threequarters'] = 834;\n    t['Scedilla'] = 667;\n    t['lcaron'] = 299;\n    t['Kcommaaccent'] = 667;\n    t['Lacute'] = 556;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 556;\n    t['Igrave'] = 278;\n    t['Imacron'] = 278;\n    t['Lcaron'] = 556;\n    t['onehalf'] = 834;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 556;\n    t['ntilde'] = 556;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 556;\n    t['gbreve'] = 556;\n    t['onequarter'] = 834;\n    t['Scaron'] = 667;\n    t['Scommaaccent'] = 667;\n    t['Ohungarumlaut'] = 778;\n    t['degree'] = 400;\n    t['ograve'] = 556;\n    t['Ccaron'] = 722;\n    t['ugrave'] = 556;\n    t['radical'] = 453;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 333;\n    t['Ntilde'] = 722;\n    t['otilde'] = 556;\n    t['Rcommaaccent'] = 722;\n    t['Lcommaaccent'] = 556;\n    t['Atilde'] = 667;\n    t['Aogonek'] = 667;\n    t['Aring'] = 667;\n    t['Otilde'] = 778;\n    t['zdotaccent'] = 500;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 278;\n    t['kcommaaccent'] = 500;\n    t['minus'] = 584;\n    t['Icircumflex'] = 278;\n    t['ncaron'] = 556;\n    t['tcommaaccent'] = 278;\n    t['logicalnot'] = 584;\n    t['odieresis'] = 556;\n    t['udieresis'] = 556;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 556;\n    t['eth'] = 556;\n    t['zcaron'] = 500;\n    t['ncommaaccent'] = 556;\n    t['onesuperior'] = 333;\n    t['imacron'] = 278;\n    t['Euro'] = 556;\n  });\n  t['Symbol'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 250;\n    t['exclam'] = 333;\n    t['universal'] = 713;\n    t['numbersign'] = 500;\n    t['existential'] = 549;\n    t['percent'] = 833;\n    t['ampersand'] = 778;\n    t['suchthat'] = 439;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asteriskmath'] = 500;\n    t['plus'] = 549;\n    t['comma'] = 250;\n    t['minus'] = 549;\n    t['period'] = 250;\n    t['slash'] = 278;\n    t['zero'] = 500;\n    t['one'] = 500;\n    t['two'] = 500;\n    t['three'] = 500;\n    t['four'] = 500;\n    t['five'] = 500;\n    t['six'] = 500;\n    t['seven'] = 500;\n    t['eight'] = 500;\n    t['nine'] = 500;\n    t['colon'] = 278;\n    t['semicolon'] = 278;\n    t['less'] = 549;\n    t['equal'] = 549;\n    t['greater'] = 549;\n    t['question'] = 444;\n    t['congruent'] = 549;\n    t['Alpha'] = 722;\n    t['Beta'] = 667;\n    t['Chi'] = 722;\n    t['Delta'] = 612;\n    t['Epsilon'] = 611;\n    t['Phi'] = 763;\n    t['Gamma'] = 603;\n    t['Eta'] = 722;\n    t['Iota'] = 333;\n    t['theta1'] = 631;\n    t['Kappa'] = 722;\n    t['Lambda'] = 686;\n    t['Mu'] = 889;\n    t['Nu'] = 722;\n    t['Omicron'] = 722;\n    t['Pi'] = 768;\n    t['Theta'] = 741;\n    t['Rho'] = 556;\n    t['Sigma'] = 592;\n    t['Tau'] = 611;\n    t['Upsilon'] = 690;\n    t['sigma1'] = 439;\n    t['Omega'] = 768;\n    t['Xi'] = 645;\n    t['Psi'] = 795;\n    t['Zeta'] = 611;\n    t['bracketleft'] = 333;\n    t['therefore'] = 863;\n    t['bracketright'] = 333;\n    t['perpendicular'] = 658;\n    t['underscore'] = 500;\n    t['radicalex'] = 500;\n    t['alpha'] = 631;\n    t['beta'] = 549;\n    t['chi'] = 549;\n    t['delta'] = 494;\n    t['epsilon'] = 439;\n    t['phi'] = 521;\n    t['gamma'] = 411;\n    t['eta'] = 603;\n    t['iota'] = 329;\n    t['phi1'] = 603;\n    t['kappa'] = 549;\n    t['lambda'] = 549;\n    t['mu'] = 576;\n    t['nu'] = 521;\n    t['omicron'] = 549;\n    t['pi'] = 549;\n    t['theta'] = 521;\n    t['rho'] = 549;\n    t['sigma'] = 603;\n    t['tau'] = 439;\n    t['upsilon'] = 576;\n    t['omega1'] = 713;\n    t['omega'] = 686;\n    t['xi'] = 493;\n    t['psi'] = 686;\n    t['zeta'] = 494;\n    t['braceleft'] = 480;\n    t['bar'] = 200;\n    t['braceright'] = 480;\n    t['similar'] = 549;\n    t['Euro'] = 750;\n    t['Upsilon1'] = 620;\n    t['minute'] = 247;\n    t['lessequal'] = 549;\n    t['fraction'] = 167;\n    t['infinity'] = 713;\n    t['florin'] = 500;\n    t['club'] = 753;\n    t['diamond'] = 753;\n    t['heart'] = 753;\n    t['spade'] = 753;\n    t['arrowboth'] = 1042;\n    t['arrowleft'] = 987;\n    t['arrowup'] = 603;\n    t['arrowright'] = 987;\n    t['arrowdown'] = 603;\n    t['degree'] = 400;\n    t['plusminus'] = 549;\n    t['second'] = 411;\n    t['greaterequal'] = 549;\n    t['multiply'] = 549;\n    t['proportional'] = 713;\n    t['partialdiff'] = 494;\n    t['bullet'] = 460;\n    t['divide'] = 549;\n    t['notequal'] = 549;\n    t['equivalence'] = 549;\n    t['approxequal'] = 549;\n    t['ellipsis'] = 1000;\n    t['arrowvertex'] = 603;\n    t['arrowhorizex'] = 1000;\n    t['carriagereturn'] = 658;\n    t['aleph'] = 823;\n    t['Ifraktur'] = 686;\n    t['Rfraktur'] = 795;\n    t['weierstrass'] = 987;\n    t['circlemultiply'] = 768;\n    t['circleplus'] = 768;\n    t['emptyset'] = 823;\n    t['intersection'] = 768;\n    t['union'] = 768;\n    t['propersuperset'] = 713;\n    t['reflexsuperset'] = 713;\n    t['notsubset'] = 713;\n    t['propersubset'] = 713;\n    t['reflexsubset'] = 713;\n    t['element'] = 713;\n    t['notelement'] = 713;\n    t['angle'] = 768;\n    t['gradient'] = 713;\n    t['registerserif'] = 790;\n    t['copyrightserif'] = 790;\n    t['trademarkserif'] = 890;\n    t['product'] = 823;\n    t['radical'] = 549;\n    t['dotmath'] = 250;\n    t['logicalnot'] = 713;\n    t['logicaland'] = 603;\n    t['logicalor'] = 603;\n    t['arrowdblboth'] = 1042;\n    t['arrowdblleft'] = 987;\n    t['arrowdblup'] = 603;\n    t['arrowdblright'] = 987;\n    t['arrowdbldown'] = 603;\n    t['lozenge'] = 494;\n    t['angleleft'] = 329;\n    t['registersans'] = 790;\n    t['copyrightsans'] = 790;\n    t['trademarksans'] = 786;\n    t['summation'] = 713;\n    t['parenlefttp'] = 384;\n    t['parenleftex'] = 384;\n    t['parenleftbt'] = 384;\n    t['bracketlefttp'] = 384;\n    t['bracketleftex'] = 384;\n    t['bracketleftbt'] = 384;\n    t['bracelefttp'] = 494;\n    t['braceleftmid'] = 494;\n    t['braceleftbt'] = 494;\n    t['braceex'] = 494;\n    t['angleright'] = 329;\n    t['integral'] = 274;\n    t['integraltp'] = 686;\n    t['integralex'] = 686;\n    t['integralbt'] = 686;\n    t['parenrighttp'] = 384;\n    t['parenrightex'] = 384;\n    t['parenrightbt'] = 384;\n    t['bracketrighttp'] = 384;\n    t['bracketrightex'] = 384;\n    t['bracketrightbt'] = 384;\n    t['bracerighttp'] = 494;\n    t['bracerightmid'] = 494;\n    t['bracerightbt'] = 494;\n    t['apple'] = 790;\n  });\n  t['Times-Roman'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 250;\n    t['exclam'] = 333;\n    t['quotedbl'] = 408;\n    t['numbersign'] = 500;\n    t['dollar'] = 500;\n    t['percent'] = 833;\n    t['ampersand'] = 778;\n    t['quoteright'] = 333;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 500;\n    t['plus'] = 564;\n    t['comma'] = 250;\n    t['hyphen'] = 333;\n    t['period'] = 250;\n    t['slash'] = 278;\n    t['zero'] = 500;\n    t['one'] = 500;\n    t['two'] = 500;\n    t['three'] = 500;\n    t['four'] = 500;\n    t['five'] = 500;\n    t['six'] = 500;\n    t['seven'] = 500;\n    t['eight'] = 500;\n    t['nine'] = 500;\n    t['colon'] = 278;\n    t['semicolon'] = 278;\n    t['less'] = 564;\n    t['equal'] = 564;\n    t['greater'] = 564;\n    t['question'] = 444;\n    t['at'] = 921;\n    t['A'] = 722;\n    t['B'] = 667;\n    t['C'] = 667;\n    t['D'] = 722;\n    t['E'] = 611;\n    t['F'] = 556;\n    t['G'] = 722;\n    t['H'] = 722;\n    t['I'] = 333;\n    t['J'] = 389;\n    t['K'] = 722;\n    t['L'] = 611;\n    t['M'] = 889;\n    t['N'] = 722;\n    t['O'] = 722;\n    t['P'] = 556;\n    t['Q'] = 722;\n    t['R'] = 667;\n    t['S'] = 556;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 722;\n    t['W'] = 944;\n    t['X'] = 722;\n    t['Y'] = 722;\n    t['Z'] = 611;\n    t['bracketleft'] = 333;\n    t['backslash'] = 278;\n    t['bracketright'] = 333;\n    t['asciicircum'] = 469;\n    t['underscore'] = 500;\n    t['quoteleft'] = 333;\n    t['a'] = 444;\n    t['b'] = 500;\n    t['c'] = 444;\n    t['d'] = 500;\n    t['e'] = 444;\n    t['f'] = 333;\n    t['g'] = 500;\n    t['h'] = 500;\n    t['i'] = 278;\n    t['j'] = 278;\n    t['k'] = 500;\n    t['l'] = 278;\n    t['m'] = 778;\n    t['n'] = 500;\n    t['o'] = 500;\n    t['p'] = 500;\n    t['q'] = 500;\n    t['r'] = 333;\n    t['s'] = 389;\n    t['t'] = 278;\n    t['u'] = 500;\n    t['v'] = 500;\n    t['w'] = 722;\n    t['x'] = 500;\n    t['y'] = 500;\n    t['z'] = 444;\n    t['braceleft'] = 480;\n    t['bar'] = 200;\n    t['braceright'] = 480;\n    t['asciitilde'] = 541;\n    t['exclamdown'] = 333;\n    t['cent'] = 500;\n    t['sterling'] = 500;\n    t['fraction'] = 167;\n    t['yen'] = 500;\n    t['florin'] = 500;\n    t['section'] = 500;\n    t['currency'] = 500;\n    t['quotesingle'] = 180;\n    t['quotedblleft'] = 444;\n    t['guillemotleft'] = 500;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 556;\n    t['fl'] = 556;\n    t['endash'] = 500;\n    t['dagger'] = 500;\n    t['daggerdbl'] = 500;\n    t['periodcentered'] = 250;\n    t['paragraph'] = 453;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 333;\n    t['quotedblbase'] = 444;\n    t['quotedblright'] = 444;\n    t['guillemotright'] = 500;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 444;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 889;\n    t['ordfeminine'] = 276;\n    t['Lslash'] = 611;\n    t['Oslash'] = 722;\n    t['OE'] = 889;\n    t['ordmasculine'] = 310;\n    t['ae'] = 667;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 500;\n    t['oe'] = 722;\n    t['germandbls'] = 500;\n    t['Idieresis'] = 333;\n    t['eacute'] = 444;\n    t['abreve'] = 444;\n    t['uhungarumlaut'] = 500;\n    t['ecaron'] = 444;\n    t['Ydieresis'] = 722;\n    t['divide'] = 564;\n    t['Yacute'] = 722;\n    t['Acircumflex'] = 722;\n    t['aacute'] = 444;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 500;\n    t['scommaaccent'] = 389;\n    t['ecircumflex'] = 444;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 444;\n    t['Uacute'] = 722;\n    t['uogonek'] = 500;\n    t['Edieresis'] = 611;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 760;\n    t['Emacron'] = 611;\n    t['ccaron'] = 444;\n    t['aring'] = 444;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 278;\n    t['agrave'] = 444;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 667;\n    t['atilde'] = 444;\n    t['Edotaccent'] = 611;\n    t['scaron'] = 389;\n    t['scedilla'] = 389;\n    t['iacute'] = 278;\n    t['lozenge'] = 471;\n    t['Rcaron'] = 667;\n    t['Gcommaaccent'] = 722;\n    t['ucircumflex'] = 500;\n    t['acircumflex'] = 444;\n    t['Amacron'] = 722;\n    t['rcaron'] = 333;\n    t['ccedilla'] = 444;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 556;\n    t['Omacron'] = 722;\n    t['Racute'] = 667;\n    t['Sacute'] = 556;\n    t['dcaron'] = 588;\n    t['Umacron'] = 722;\n    t['uring'] = 500;\n    t['threesuperior'] = 300;\n    t['Ograve'] = 722;\n    t['Agrave'] = 722;\n    t['Abreve'] = 722;\n    t['multiply'] = 564;\n    t['uacute'] = 500;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 476;\n    t['ydieresis'] = 500;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 611;\n    t['adieresis'] = 444;\n    t['edieresis'] = 444;\n    t['cacute'] = 444;\n    t['nacute'] = 500;\n    t['umacron'] = 500;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 333;\n    t['plusminus'] = 564;\n    t['brokenbar'] = 200;\n    t['registered'] = 760;\n    t['Gbreve'] = 722;\n    t['Idotaccent'] = 333;\n    t['summation'] = 600;\n    t['Egrave'] = 611;\n    t['racute'] = 333;\n    t['omacron'] = 500;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 667;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 326;\n    t['eogonek'] = 444;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 722;\n    t['Adieresis'] = 722;\n    t['egrave'] = 444;\n    t['zacute'] = 444;\n    t['iogonek'] = 278;\n    t['Oacute'] = 722;\n    t['oacute'] = 500;\n    t['amacron'] = 444;\n    t['sacute'] = 389;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 722;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 500;\n    t['twosuperior'] = 300;\n    t['Odieresis'] = 722;\n    t['mu'] = 500;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 500;\n    t['Eogonek'] = 611;\n    t['dcroat'] = 500;\n    t['threequarters'] = 750;\n    t['Scedilla'] = 556;\n    t['lcaron'] = 344;\n    t['Kcommaaccent'] = 722;\n    t['Lacute'] = 611;\n    t['trademark'] = 980;\n    t['edotaccent'] = 444;\n    t['Igrave'] = 333;\n    t['Imacron'] = 333;\n    t['Lcaron'] = 611;\n    t['onehalf'] = 750;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 500;\n    t['ntilde'] = 500;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 611;\n    t['emacron'] = 444;\n    t['gbreve'] = 500;\n    t['onequarter'] = 750;\n    t['Scaron'] = 556;\n    t['Scommaaccent'] = 556;\n    t['Ohungarumlaut'] = 722;\n    t['degree'] = 400;\n    t['ograve'] = 500;\n    t['Ccaron'] = 667;\n    t['ugrave'] = 500;\n    t['radical'] = 453;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 333;\n    t['Ntilde'] = 722;\n    t['otilde'] = 500;\n    t['Rcommaaccent'] = 667;\n    t['Lcommaaccent'] = 611;\n    t['Atilde'] = 722;\n    t['Aogonek'] = 722;\n    t['Aring'] = 722;\n    t['Otilde'] = 722;\n    t['zdotaccent'] = 444;\n    t['Ecaron'] = 611;\n    t['Iogonek'] = 333;\n    t['kcommaaccent'] = 500;\n    t['minus'] = 564;\n    t['Icircumflex'] = 333;\n    t['ncaron'] = 500;\n    t['tcommaaccent'] = 278;\n    t['logicalnot'] = 564;\n    t['odieresis'] = 500;\n    t['udieresis'] = 500;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 500;\n    t['eth'] = 500;\n    t['zcaron'] = 444;\n    t['ncommaaccent'] = 500;\n    t['onesuperior'] = 300;\n    t['imacron'] = 278;\n    t['Euro'] = 500;\n  });\n  t['Times-Bold'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 250;\n    t['exclam'] = 333;\n    t['quotedbl'] = 555;\n    t['numbersign'] = 500;\n    t['dollar'] = 500;\n    t['percent'] = 1000;\n    t['ampersand'] = 833;\n    t['quoteright'] = 333;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 500;\n    t['plus'] = 570;\n    t['comma'] = 250;\n    t['hyphen'] = 333;\n    t['period'] = 250;\n    t['slash'] = 278;\n    t['zero'] = 500;\n    t['one'] = 500;\n    t['two'] = 500;\n    t['three'] = 500;\n    t['four'] = 500;\n    t['five'] = 500;\n    t['six'] = 500;\n    t['seven'] = 500;\n    t['eight'] = 500;\n    t['nine'] = 500;\n    t['colon'] = 333;\n    t['semicolon'] = 333;\n    t['less'] = 570;\n    t['equal'] = 570;\n    t['greater'] = 570;\n    t['question'] = 500;\n    t['at'] = 930;\n    t['A'] = 722;\n    t['B'] = 667;\n    t['C'] = 722;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 611;\n    t['G'] = 778;\n    t['H'] = 778;\n    t['I'] = 389;\n    t['J'] = 500;\n    t['K'] = 778;\n    t['L'] = 667;\n    t['M'] = 944;\n    t['N'] = 722;\n    t['O'] = 778;\n    t['P'] = 611;\n    t['Q'] = 778;\n    t['R'] = 722;\n    t['S'] = 556;\n    t['T'] = 667;\n    t['U'] = 722;\n    t['V'] = 722;\n    t['W'] = 1000;\n    t['X'] = 722;\n    t['Y'] = 722;\n    t['Z'] = 667;\n    t['bracketleft'] = 333;\n    t['backslash'] = 278;\n    t['bracketright'] = 333;\n    t['asciicircum'] = 581;\n    t['underscore'] = 500;\n    t['quoteleft'] = 333;\n    t['a'] = 500;\n    t['b'] = 556;\n    t['c'] = 444;\n    t['d'] = 556;\n    t['e'] = 444;\n    t['f'] = 333;\n    t['g'] = 500;\n    t['h'] = 556;\n    t['i'] = 278;\n    t['j'] = 333;\n    t['k'] = 556;\n    t['l'] = 278;\n    t['m'] = 833;\n    t['n'] = 556;\n    t['o'] = 500;\n    t['p'] = 556;\n    t['q'] = 556;\n    t['r'] = 444;\n    t['s'] = 389;\n    t['t'] = 333;\n    t['u'] = 556;\n    t['v'] = 500;\n    t['w'] = 722;\n    t['x'] = 500;\n    t['y'] = 500;\n    t['z'] = 444;\n    t['braceleft'] = 394;\n    t['bar'] = 220;\n    t['braceright'] = 394;\n    t['asciitilde'] = 520;\n    t['exclamdown'] = 333;\n    t['cent'] = 500;\n    t['sterling'] = 500;\n    t['fraction'] = 167;\n    t['yen'] = 500;\n    t['florin'] = 500;\n    t['section'] = 500;\n    t['currency'] = 500;\n    t['quotesingle'] = 278;\n    t['quotedblleft'] = 500;\n    t['guillemotleft'] = 500;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 556;\n    t['fl'] = 556;\n    t['endash'] = 500;\n    t['dagger'] = 500;\n    t['daggerdbl'] = 500;\n    t['periodcentered'] = 250;\n    t['paragraph'] = 540;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 333;\n    t['quotedblbase'] = 500;\n    t['quotedblright'] = 500;\n    t['guillemotright'] = 500;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 500;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 1000;\n    t['ordfeminine'] = 300;\n    t['Lslash'] = 667;\n    t['Oslash'] = 778;\n    t['OE'] = 1000;\n    t['ordmasculine'] = 330;\n    t['ae'] = 722;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 500;\n    t['oe'] = 722;\n    t['germandbls'] = 556;\n    t['Idieresis'] = 389;\n    t['eacute'] = 444;\n    t['abreve'] = 500;\n    t['uhungarumlaut'] = 556;\n    t['ecaron'] = 444;\n    t['Ydieresis'] = 722;\n    t['divide'] = 570;\n    t['Yacute'] = 722;\n    t['Acircumflex'] = 722;\n    t['aacute'] = 500;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 500;\n    t['scommaaccent'] = 389;\n    t['ecircumflex'] = 444;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 500;\n    t['Uacute'] = 722;\n    t['uogonek'] = 556;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 747;\n    t['Emacron'] = 667;\n    t['ccaron'] = 444;\n    t['aring'] = 500;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 278;\n    t['agrave'] = 500;\n    t['Tcommaaccent'] = 667;\n    t['Cacute'] = 722;\n    t['atilde'] = 500;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 389;\n    t['scedilla'] = 389;\n    t['iacute'] = 278;\n    t['lozenge'] = 494;\n    t['Rcaron'] = 722;\n    t['Gcommaaccent'] = 778;\n    t['ucircumflex'] = 556;\n    t['acircumflex'] = 500;\n    t['Amacron'] = 722;\n    t['rcaron'] = 444;\n    t['ccedilla'] = 444;\n    t['Zdotaccent'] = 667;\n    t['Thorn'] = 611;\n    t['Omacron'] = 778;\n    t['Racute'] = 722;\n    t['Sacute'] = 556;\n    t['dcaron'] = 672;\n    t['Umacron'] = 722;\n    t['uring'] = 556;\n    t['threesuperior'] = 300;\n    t['Ograve'] = 778;\n    t['Agrave'] = 722;\n    t['Abreve'] = 722;\n    t['multiply'] = 570;\n    t['uacute'] = 556;\n    t['Tcaron'] = 667;\n    t['partialdiff'] = 494;\n    t['ydieresis'] = 500;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 500;\n    t['edieresis'] = 444;\n    t['cacute'] = 444;\n    t['nacute'] = 556;\n    t['umacron'] = 556;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 389;\n    t['plusminus'] = 570;\n    t['brokenbar'] = 220;\n    t['registered'] = 747;\n    t['Gbreve'] = 778;\n    t['Idotaccent'] = 389;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 444;\n    t['omacron'] = 500;\n    t['Zacute'] = 667;\n    t['Zcaron'] = 667;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 722;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 416;\n    t['eogonek'] = 444;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 722;\n    t['Adieresis'] = 722;\n    t['egrave'] = 444;\n    t['zacute'] = 444;\n    t['iogonek'] = 278;\n    t['Oacute'] = 778;\n    t['oacute'] = 500;\n    t['amacron'] = 500;\n    t['sacute'] = 389;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 778;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 556;\n    t['twosuperior'] = 300;\n    t['Odieresis'] = 778;\n    t['mu'] = 556;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 500;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 556;\n    t['threequarters'] = 750;\n    t['Scedilla'] = 556;\n    t['lcaron'] = 394;\n    t['Kcommaaccent'] = 778;\n    t['Lacute'] = 667;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 444;\n    t['Igrave'] = 389;\n    t['Imacron'] = 389;\n    t['Lcaron'] = 667;\n    t['onehalf'] = 750;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 500;\n    t['ntilde'] = 556;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 444;\n    t['gbreve'] = 500;\n    t['onequarter'] = 750;\n    t['Scaron'] = 556;\n    t['Scommaaccent'] = 556;\n    t['Ohungarumlaut'] = 778;\n    t['degree'] = 400;\n    t['ograve'] = 500;\n    t['Ccaron'] = 722;\n    t['ugrave'] = 556;\n    t['radical'] = 549;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 444;\n    t['Ntilde'] = 722;\n    t['otilde'] = 500;\n    t['Rcommaaccent'] = 722;\n    t['Lcommaaccent'] = 667;\n    t['Atilde'] = 722;\n    t['Aogonek'] = 722;\n    t['Aring'] = 722;\n    t['Otilde'] = 778;\n    t['zdotaccent'] = 444;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 389;\n    t['kcommaaccent'] = 556;\n    t['minus'] = 570;\n    t['Icircumflex'] = 389;\n    t['ncaron'] = 556;\n    t['tcommaaccent'] = 333;\n    t['logicalnot'] = 570;\n    t['odieresis'] = 500;\n    t['udieresis'] = 556;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 500;\n    t['eth'] = 500;\n    t['zcaron'] = 444;\n    t['ncommaaccent'] = 556;\n    t['onesuperior'] = 300;\n    t['imacron'] = 278;\n    t['Euro'] = 500;\n  });\n  t['Times-BoldItalic'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 250;\n    t['exclam'] = 389;\n    t['quotedbl'] = 555;\n    t['numbersign'] = 500;\n    t['dollar'] = 500;\n    t['percent'] = 833;\n    t['ampersand'] = 778;\n    t['quoteright'] = 333;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 500;\n    t['plus'] = 570;\n    t['comma'] = 250;\n    t['hyphen'] = 333;\n    t['period'] = 250;\n    t['slash'] = 278;\n    t['zero'] = 500;\n    t['one'] = 500;\n    t['two'] = 500;\n    t['three'] = 500;\n    t['four'] = 500;\n    t['five'] = 500;\n    t['six'] = 500;\n    t['seven'] = 500;\n    t['eight'] = 500;\n    t['nine'] = 500;\n    t['colon'] = 333;\n    t['semicolon'] = 333;\n    t['less'] = 570;\n    t['equal'] = 570;\n    t['greater'] = 570;\n    t['question'] = 500;\n    t['at'] = 832;\n    t['A'] = 667;\n    t['B'] = 667;\n    t['C'] = 667;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 667;\n    t['G'] = 722;\n    t['H'] = 778;\n    t['I'] = 389;\n    t['J'] = 500;\n    t['K'] = 667;\n    t['L'] = 611;\n    t['M'] = 889;\n    t['N'] = 722;\n    t['O'] = 722;\n    t['P'] = 611;\n    t['Q'] = 722;\n    t['R'] = 667;\n    t['S'] = 556;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 667;\n    t['W'] = 889;\n    t['X'] = 667;\n    t['Y'] = 611;\n    t['Z'] = 611;\n    t['bracketleft'] = 333;\n    t['backslash'] = 278;\n    t['bracketright'] = 333;\n    t['asciicircum'] = 570;\n    t['underscore'] = 500;\n    t['quoteleft'] = 333;\n    t['a'] = 500;\n    t['b'] = 500;\n    t['c'] = 444;\n    t['d'] = 500;\n    t['e'] = 444;\n    t['f'] = 333;\n    t['g'] = 500;\n    t['h'] = 556;\n    t['i'] = 278;\n    t['j'] = 278;\n    t['k'] = 500;\n    t['l'] = 278;\n    t['m'] = 778;\n    t['n'] = 556;\n    t['o'] = 500;\n    t['p'] = 500;\n    t['q'] = 500;\n    t['r'] = 389;\n    t['s'] = 389;\n    t['t'] = 278;\n    t['u'] = 556;\n    t['v'] = 444;\n    t['w'] = 667;\n    t['x'] = 500;\n    t['y'] = 444;\n    t['z'] = 389;\n    t['braceleft'] = 348;\n    t['bar'] = 220;\n    t['braceright'] = 348;\n    t['asciitilde'] = 570;\n    t['exclamdown'] = 389;\n    t['cent'] = 500;\n    t['sterling'] = 500;\n    t['fraction'] = 167;\n    t['yen'] = 500;\n    t['florin'] = 500;\n    t['section'] = 500;\n    t['currency'] = 500;\n    t['quotesingle'] = 278;\n    t['quotedblleft'] = 500;\n    t['guillemotleft'] = 500;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 556;\n    t['fl'] = 556;\n    t['endash'] = 500;\n    t['dagger'] = 500;\n    t['daggerdbl'] = 500;\n    t['periodcentered'] = 250;\n    t['paragraph'] = 500;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 333;\n    t['quotedblbase'] = 500;\n    t['quotedblright'] = 500;\n    t['guillemotright'] = 500;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 500;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 944;\n    t['ordfeminine'] = 266;\n    t['Lslash'] = 611;\n    t['Oslash'] = 722;\n    t['OE'] = 944;\n    t['ordmasculine'] = 300;\n    t['ae'] = 722;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 500;\n    t['oe'] = 722;\n    t['germandbls'] = 500;\n    t['Idieresis'] = 389;\n    t['eacute'] = 444;\n    t['abreve'] = 500;\n    t['uhungarumlaut'] = 556;\n    t['ecaron'] = 444;\n    t['Ydieresis'] = 611;\n    t['divide'] = 570;\n    t['Yacute'] = 611;\n    t['Acircumflex'] = 667;\n    t['aacute'] = 500;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 444;\n    t['scommaaccent'] = 389;\n    t['ecircumflex'] = 444;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 500;\n    t['Uacute'] = 722;\n    t['uogonek'] = 556;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 747;\n    t['Emacron'] = 667;\n    t['ccaron'] = 444;\n    t['aring'] = 500;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 278;\n    t['agrave'] = 500;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 667;\n    t['atilde'] = 500;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 389;\n    t['scedilla'] = 389;\n    t['iacute'] = 278;\n    t['lozenge'] = 494;\n    t['Rcaron'] = 667;\n    t['Gcommaaccent'] = 722;\n    t['ucircumflex'] = 556;\n    t['acircumflex'] = 500;\n    t['Amacron'] = 667;\n    t['rcaron'] = 389;\n    t['ccedilla'] = 444;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 611;\n    t['Omacron'] = 722;\n    t['Racute'] = 667;\n    t['Sacute'] = 556;\n    t['dcaron'] = 608;\n    t['Umacron'] = 722;\n    t['uring'] = 556;\n    t['threesuperior'] = 300;\n    t['Ograve'] = 722;\n    t['Agrave'] = 667;\n    t['Abreve'] = 667;\n    t['multiply'] = 570;\n    t['uacute'] = 556;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 494;\n    t['ydieresis'] = 444;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 500;\n    t['edieresis'] = 444;\n    t['cacute'] = 444;\n    t['nacute'] = 556;\n    t['umacron'] = 556;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 389;\n    t['plusminus'] = 570;\n    t['brokenbar'] = 220;\n    t['registered'] = 747;\n    t['Gbreve'] = 722;\n    t['Idotaccent'] = 389;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 389;\n    t['omacron'] = 500;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 667;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 366;\n    t['eogonek'] = 444;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 667;\n    t['Adieresis'] = 667;\n    t['egrave'] = 444;\n    t['zacute'] = 389;\n    t['iogonek'] = 278;\n    t['Oacute'] = 722;\n    t['oacute'] = 500;\n    t['amacron'] = 500;\n    t['sacute'] = 389;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 722;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 500;\n    t['twosuperior'] = 300;\n    t['Odieresis'] = 722;\n    t['mu'] = 576;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 500;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 500;\n    t['threequarters'] = 750;\n    t['Scedilla'] = 556;\n    t['lcaron'] = 382;\n    t['Kcommaaccent'] = 667;\n    t['Lacute'] = 611;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 444;\n    t['Igrave'] = 389;\n    t['Imacron'] = 389;\n    t['Lcaron'] = 611;\n    t['onehalf'] = 750;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 500;\n    t['ntilde'] = 556;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 444;\n    t['gbreve'] = 500;\n    t['onequarter'] = 750;\n    t['Scaron'] = 556;\n    t['Scommaaccent'] = 556;\n    t['Ohungarumlaut'] = 722;\n    t['degree'] = 400;\n    t['ograve'] = 500;\n    t['Ccaron'] = 667;\n    t['ugrave'] = 556;\n    t['radical'] = 549;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 389;\n    t['Ntilde'] = 722;\n    t['otilde'] = 500;\n    t['Rcommaaccent'] = 667;\n    t['Lcommaaccent'] = 611;\n    t['Atilde'] = 667;\n    t['Aogonek'] = 667;\n    t['Aring'] = 667;\n    t['Otilde'] = 722;\n    t['zdotaccent'] = 389;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 389;\n    t['kcommaaccent'] = 500;\n    t['minus'] = 606;\n    t['Icircumflex'] = 389;\n    t['ncaron'] = 556;\n    t['tcommaaccent'] = 278;\n    t['logicalnot'] = 606;\n    t['odieresis'] = 500;\n    t['udieresis'] = 556;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 500;\n    t['eth'] = 500;\n    t['zcaron'] = 389;\n    t['ncommaaccent'] = 556;\n    t['onesuperior'] = 300;\n    t['imacron'] = 278;\n    t['Euro'] = 500;\n  });\n  t['Times-Italic'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 250;\n    t['exclam'] = 333;\n    t['quotedbl'] = 420;\n    t['numbersign'] = 500;\n    t['dollar'] = 500;\n    t['percent'] = 833;\n    t['ampersand'] = 778;\n    t['quoteright'] = 333;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 500;\n    t['plus'] = 675;\n    t['comma'] = 250;\n    t['hyphen'] = 333;\n    t['period'] = 250;\n    t['slash'] = 278;\n    t['zero'] = 500;\n    t['one'] = 500;\n    t['two'] = 500;\n    t['three'] = 500;\n    t['four'] = 500;\n    t['five'] = 500;\n    t['six'] = 500;\n    t['seven'] = 500;\n    t['eight'] = 500;\n    t['nine'] = 500;\n    t['colon'] = 333;\n    t['semicolon'] = 333;\n    t['less'] = 675;\n    t['equal'] = 675;\n    t['greater'] = 675;\n    t['question'] = 500;\n    t['at'] = 920;\n    t['A'] = 611;\n    t['B'] = 611;\n    t['C'] = 667;\n    t['D'] = 722;\n    t['E'] = 611;\n    t['F'] = 611;\n    t['G'] = 722;\n    t['H'] = 722;\n    t['I'] = 333;\n    t['J'] = 444;\n    t['K'] = 667;\n    t['L'] = 556;\n    t['M'] = 833;\n    t['N'] = 667;\n    t['O'] = 722;\n    t['P'] = 611;\n    t['Q'] = 722;\n    t['R'] = 611;\n    t['S'] = 500;\n    t['T'] = 556;\n    t['U'] = 722;\n    t['V'] = 611;\n    t['W'] = 833;\n    t['X'] = 611;\n    t['Y'] = 556;\n    t['Z'] = 556;\n    t['bracketleft'] = 389;\n    t['backslash'] = 278;\n    t['bracketright'] = 389;\n    t['asciicircum'] = 422;\n    t['underscore'] = 500;\n    t['quoteleft'] = 333;\n    t['a'] = 500;\n    t['b'] = 500;\n    t['c'] = 444;\n    t['d'] = 500;\n    t['e'] = 444;\n    t['f'] = 278;\n    t['g'] = 500;\n    t['h'] = 500;\n    t['i'] = 278;\n    t['j'] = 278;\n    t['k'] = 444;\n    t['l'] = 278;\n    t['m'] = 722;\n    t['n'] = 500;\n    t['o'] = 500;\n    t['p'] = 500;\n    t['q'] = 500;\n    t['r'] = 389;\n    t['s'] = 389;\n    t['t'] = 278;\n    t['u'] = 500;\n    t['v'] = 444;\n    t['w'] = 667;\n    t['x'] = 444;\n    t['y'] = 444;\n    t['z'] = 389;\n    t['braceleft'] = 400;\n    t['bar'] = 275;\n    t['braceright'] = 400;\n    t['asciitilde'] = 541;\n    t['exclamdown'] = 389;\n    t['cent'] = 500;\n    t['sterling'] = 500;\n    t['fraction'] = 167;\n    t['yen'] = 500;\n    t['florin'] = 500;\n    t['section'] = 500;\n    t['currency'] = 500;\n    t['quotesingle'] = 214;\n    t['quotedblleft'] = 556;\n    t['guillemotleft'] = 500;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 500;\n    t['fl'] = 500;\n    t['endash'] = 500;\n    t['dagger'] = 500;\n    t['daggerdbl'] = 500;\n    t['periodcentered'] = 250;\n    t['paragraph'] = 523;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 333;\n    t['quotedblbase'] = 556;\n    t['quotedblright'] = 556;\n    t['guillemotright'] = 500;\n    t['ellipsis'] = 889;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 500;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 889;\n    t['AE'] = 889;\n    t['ordfeminine'] = 276;\n    t['Lslash'] = 556;\n    t['Oslash'] = 722;\n    t['OE'] = 944;\n    t['ordmasculine'] = 310;\n    t['ae'] = 667;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 500;\n    t['oe'] = 667;\n    t['germandbls'] = 500;\n    t['Idieresis'] = 333;\n    t['eacute'] = 444;\n    t['abreve'] = 500;\n    t['uhungarumlaut'] = 500;\n    t['ecaron'] = 444;\n    t['Ydieresis'] = 556;\n    t['divide'] = 675;\n    t['Yacute'] = 556;\n    t['Acircumflex'] = 611;\n    t['aacute'] = 500;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 444;\n    t['scommaaccent'] = 389;\n    t['ecircumflex'] = 444;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 500;\n    t['Uacute'] = 722;\n    t['uogonek'] = 500;\n    t['Edieresis'] = 611;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 760;\n    t['Emacron'] = 611;\n    t['ccaron'] = 444;\n    t['aring'] = 500;\n    t['Ncommaaccent'] = 667;\n    t['lacute'] = 278;\n    t['agrave'] = 500;\n    t['Tcommaaccent'] = 556;\n    t['Cacute'] = 667;\n    t['atilde'] = 500;\n    t['Edotaccent'] = 611;\n    t['scaron'] = 389;\n    t['scedilla'] = 389;\n    t['iacute'] = 278;\n    t['lozenge'] = 471;\n    t['Rcaron'] = 611;\n    t['Gcommaaccent'] = 722;\n    t['ucircumflex'] = 500;\n    t['acircumflex'] = 500;\n    t['Amacron'] = 611;\n    t['rcaron'] = 389;\n    t['ccedilla'] = 444;\n    t['Zdotaccent'] = 556;\n    t['Thorn'] = 611;\n    t['Omacron'] = 722;\n    t['Racute'] = 611;\n    t['Sacute'] = 500;\n    t['dcaron'] = 544;\n    t['Umacron'] = 722;\n    t['uring'] = 500;\n    t['threesuperior'] = 300;\n    t['Ograve'] = 722;\n    t['Agrave'] = 611;\n    t['Abreve'] = 611;\n    t['multiply'] = 675;\n    t['uacute'] = 500;\n    t['Tcaron'] = 556;\n    t['partialdiff'] = 476;\n    t['ydieresis'] = 444;\n    t['Nacute'] = 667;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 611;\n    t['adieresis'] = 500;\n    t['edieresis'] = 444;\n    t['cacute'] = 444;\n    t['nacute'] = 500;\n    t['umacron'] = 500;\n    t['Ncaron'] = 667;\n    t['Iacute'] = 333;\n    t['plusminus'] = 675;\n    t['brokenbar'] = 275;\n    t['registered'] = 760;\n    t['Gbreve'] = 722;\n    t['Idotaccent'] = 333;\n    t['summation'] = 600;\n    t['Egrave'] = 611;\n    t['racute'] = 389;\n    t['omacron'] = 500;\n    t['Zacute'] = 556;\n    t['Zcaron'] = 556;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 667;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 300;\n    t['eogonek'] = 444;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 611;\n    t['Adieresis'] = 611;\n    t['egrave'] = 444;\n    t['zacute'] = 389;\n    t['iogonek'] = 278;\n    t['Oacute'] = 722;\n    t['oacute'] = 500;\n    t['amacron'] = 500;\n    t['sacute'] = 389;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 722;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 500;\n    t['twosuperior'] = 300;\n    t['Odieresis'] = 722;\n    t['mu'] = 500;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 500;\n    t['Eogonek'] = 611;\n    t['dcroat'] = 500;\n    t['threequarters'] = 750;\n    t['Scedilla'] = 500;\n    t['lcaron'] = 300;\n    t['Kcommaaccent'] = 667;\n    t['Lacute'] = 556;\n    t['trademark'] = 980;\n    t['edotaccent'] = 444;\n    t['Igrave'] = 333;\n    t['Imacron'] = 333;\n    t['Lcaron'] = 611;\n    t['onehalf'] = 750;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 500;\n    t['ntilde'] = 500;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 611;\n    t['emacron'] = 444;\n    t['gbreve'] = 500;\n    t['onequarter'] = 750;\n    t['Scaron'] = 500;\n    t['Scommaaccent'] = 500;\n    t['Ohungarumlaut'] = 722;\n    t['degree'] = 400;\n    t['ograve'] = 500;\n    t['Ccaron'] = 667;\n    t['ugrave'] = 500;\n    t['radical'] = 453;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 389;\n    t['Ntilde'] = 667;\n    t['otilde'] = 500;\n    t['Rcommaaccent'] = 611;\n    t['Lcommaaccent'] = 556;\n    t['Atilde'] = 611;\n    t['Aogonek'] = 611;\n    t['Aring'] = 611;\n    t['Otilde'] = 722;\n    t['zdotaccent'] = 389;\n    t['Ecaron'] = 611;\n    t['Iogonek'] = 333;\n    t['kcommaaccent'] = 444;\n    t['minus'] = 675;\n    t['Icircumflex'] = 333;\n    t['ncaron'] = 500;\n    t['tcommaaccent'] = 278;\n    t['logicalnot'] = 675;\n    t['odieresis'] = 500;\n    t['udieresis'] = 500;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 500;\n    t['eth'] = 500;\n    t['zcaron'] = 389;\n    t['ncommaaccent'] = 500;\n    t['onesuperior'] = 300;\n    t['imacron'] = 278;\n    t['Euro'] = 500;\n  });\n  t['ZapfDingbats'] = (0, _util.getLookupTableFactory)(function (t) {\n    t['space'] = 278;\n    t['a1'] = 974;\n    t['a2'] = 961;\n    t['a202'] = 974;\n    t['a3'] = 980;\n    t['a4'] = 719;\n    t['a5'] = 789;\n    t['a119'] = 790;\n    t['a118'] = 791;\n    t['a117'] = 690;\n    t['a11'] = 960;\n    t['a12'] = 939;\n    t['a13'] = 549;\n    t['a14'] = 855;\n    t['a15'] = 911;\n    t['a16'] = 933;\n    t['a105'] = 911;\n    t['a17'] = 945;\n    t['a18'] = 974;\n    t['a19'] = 755;\n    t['a20'] = 846;\n    t['a21'] = 762;\n    t['a22'] = 761;\n    t['a23'] = 571;\n    t['a24'] = 677;\n    t['a25'] = 763;\n    t['a26'] = 760;\n    t['a27'] = 759;\n    t['a28'] = 754;\n    t['a6'] = 494;\n    t['a7'] = 552;\n    t['a8'] = 537;\n    t['a9'] = 577;\n    t['a10'] = 692;\n    t['a29'] = 786;\n    t['a30'] = 788;\n    t['a31'] = 788;\n    t['a32'] = 790;\n    t['a33'] = 793;\n    t['a34'] = 794;\n    t['a35'] = 816;\n    t['a36'] = 823;\n    t['a37'] = 789;\n    t['a38'] = 841;\n    t['a39'] = 823;\n    t['a40'] = 833;\n    t['a41'] = 816;\n    t['a42'] = 831;\n    t['a43'] = 923;\n    t['a44'] = 744;\n    t['a45'] = 723;\n    t['a46'] = 749;\n    t['a47'] = 790;\n    t['a48'] = 792;\n    t['a49'] = 695;\n    t['a50'] = 776;\n    t['a51'] = 768;\n    t['a52'] = 792;\n    t['a53'] = 759;\n    t['a54'] = 707;\n    t['a55'] = 708;\n    t['a56'] = 682;\n    t['a57'] = 701;\n    t['a58'] = 826;\n    t['a59'] = 815;\n    t['a60'] = 789;\n    t['a61'] = 789;\n    t['a62'] = 707;\n    t['a63'] = 687;\n    t['a64'] = 696;\n    t['a65'] = 689;\n    t['a66'] = 786;\n    t['a67'] = 787;\n    t['a68'] = 713;\n    t['a69'] = 791;\n    t['a70'] = 785;\n    t['a71'] = 791;\n    t['a72'] = 873;\n    t['a73'] = 761;\n    t['a74'] = 762;\n    t['a203'] = 762;\n    t['a75'] = 759;\n    t['a204'] = 759;\n    t['a76'] = 892;\n    t['a77'] = 892;\n    t['a78'] = 788;\n    t['a79'] = 784;\n    t['a81'] = 438;\n    t['a82'] = 138;\n    t['a83'] = 277;\n    t['a84'] = 415;\n    t['a97'] = 392;\n    t['a98'] = 392;\n    t['a99'] = 668;\n    t['a100'] = 668;\n    t['a89'] = 390;\n    t['a90'] = 390;\n    t['a93'] = 317;\n    t['a94'] = 317;\n    t['a91'] = 276;\n    t['a92'] = 276;\n    t['a205'] = 509;\n    t['a85'] = 509;\n    t['a206'] = 410;\n    t['a86'] = 410;\n    t['a87'] = 234;\n    t['a88'] = 234;\n    t['a95'] = 334;\n    t['a96'] = 334;\n    t['a101'] = 732;\n    t['a102'] = 544;\n    t['a103'] = 544;\n    t['a104'] = 910;\n    t['a106'] = 667;\n    t['a107'] = 760;\n    t['a108'] = 760;\n    t['a112'] = 776;\n    t['a111'] = 595;\n    t['a110'] = 694;\n    t['a109'] = 626;\n    t['a120'] = 788;\n    t['a121'] = 788;\n    t['a122'] = 788;\n    t['a123'] = 788;\n    t['a124'] = 788;\n    t['a125'] = 788;\n    t['a126'] = 788;\n    t['a127'] = 788;\n    t['a128'] = 788;\n    t['a129'] = 788;\n    t['a130'] = 788;\n    t['a131'] = 788;\n    t['a132'] = 788;\n    t['a133'] = 788;\n    t['a134'] = 788;\n    t['a135'] = 788;\n    t['a136'] = 788;\n    t['a137'] = 788;\n    t['a138'] = 788;\n    t['a139'] = 788;\n    t['a140'] = 788;\n    t['a141'] = 788;\n    t['a142'] = 788;\n    t['a143'] = 788;\n    t['a144'] = 788;\n    t['a145'] = 788;\n    t['a146'] = 788;\n    t['a147'] = 788;\n    t['a148'] = 788;\n    t['a149'] = 788;\n    t['a150'] = 788;\n    t['a151'] = 788;\n    t['a152'] = 788;\n    t['a153'] = 788;\n    t['a154'] = 788;\n    t['a155'] = 788;\n    t['a156'] = 788;\n    t['a157'] = 788;\n    t['a158'] = 788;\n    t['a159'] = 788;\n    t['a160'] = 894;\n    t['a161'] = 838;\n    t['a163'] = 1016;\n    t['a164'] = 458;\n    t['a196'] = 748;\n    t['a165'] = 924;\n    t['a192'] = 748;\n    t['a166'] = 918;\n    t['a167'] = 927;\n    t['a168'] = 928;\n    t['a169'] = 928;\n    t['a170'] = 834;\n    t['a171'] = 873;\n    t['a172'] = 828;\n    t['a173'] = 924;\n    t['a162'] = 924;\n    t['a174'] = 917;\n    t['a175'] = 930;\n    t['a176'] = 931;\n    t['a177'] = 463;\n    t['a178'] = 883;\n    t['a179'] = 836;\n    t['a193'] = 836;\n    t['a180'] = 867;\n    t['a199'] = 867;\n    t['a181'] = 696;\n    t['a200'] = 696;\n    t['a182'] = 874;\n    t['a201'] = 874;\n    t['a183'] = 760;\n    t['a184'] = 946;\n    t['a197'] = 771;\n    t['a185'] = 865;\n    t['a194'] = 771;\n    t['a198'] = 888;\n    t['a186'] = 967;\n    t['a195'] = 888;\n    t['a187'] = 831;\n    t['a188'] = 873;\n    t['a189'] = 927;\n    t['a190'] = 970;\n    t['a191'] = 918;\n  });\n});\nexports.getMetrics = getMetrics;\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar MurmurHash3_64 = function MurmurHash3_64Closure(seed) {\n  var MASK_HIGH = 0xffff0000;\n  var MASK_LOW = 0xffff;\n  function MurmurHash3_64(seed) {\n    var SEED = 0xc3d2e1f0;\n    this.h1 = seed ? seed & 0xffffffff : SEED;\n    this.h2 = seed ? seed & 0xffffffff : SEED;\n  }\n  MurmurHash3_64.prototype = {\n    update: function MurmurHash3_64_update(input) {\n      var i;\n      if (typeof input === 'string') {\n        var data = new Uint8Array(input.length * 2);\n        var length = 0;\n        for (i = 0; i < input.length; i++) {\n          var code = input.charCodeAt(i);\n          if (code <= 0xff) {\n            data[length++] = code;\n          } else {\n            data[length++] = code >>> 8;\n            data[length++] = code & 0xff;\n          }\n        }\n      } else if ((typeof input === 'undefined' ? 'undefined' : _typeof(input)) === 'object' && 'byteLength' in input) {\n        data = input;\n        length = data.byteLength;\n      } else {\n        throw new Error('Wrong data format in MurmurHash3_64_update. ' + 'Input must be a string or array.');\n      }\n      var blockCounts = length >> 2;\n      var tailLength = length - blockCounts * 4;\n      var dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);\n      var k1 = 0;\n      var k2 = 0;\n      var h1 = this.h1;\n      var h2 = this.h2;\n      var C1 = 0xcc9e2d51;\n      var C2 = 0x1b873593;\n      var C1_LOW = C1 & MASK_LOW;\n      var C2_LOW = C2 & MASK_LOW;\n      for (i = 0; i < blockCounts; i++) {\n        if (i & 1) {\n          k1 = dataUint32[i];\n          k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;\n          k1 = k1 << 15 | k1 >>> 17;\n          k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;\n          h1 ^= k1;\n          h1 = h1 << 13 | h1 >>> 19;\n          h1 = h1 * 5 + 0xe6546b64;\n        } else {\n          k2 = dataUint32[i];\n          k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW;\n          k2 = k2 << 15 | k2 >>> 17;\n          k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW;\n          h2 ^= k2;\n          h2 = h2 << 13 | h2 >>> 19;\n          h2 = h2 * 5 + 0xe6546b64;\n        }\n      }\n      k1 = 0;\n      switch (tailLength) {\n        case 3:\n          k1 ^= data[blockCounts * 4 + 2] << 16;\n        case 2:\n          k1 ^= data[blockCounts * 4 + 1] << 8;\n        case 1:\n          k1 ^= data[blockCounts * 4];\n          k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;\n          k1 = k1 << 15 | k1 >>> 17;\n          k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;\n          if (blockCounts & 1) {\n            h1 ^= k1;\n          } else {\n            h2 ^= k1;\n          }\n      }\n      this.h1 = h1;\n      this.h2 = h2;\n      return this;\n    },\n    hexdigest: function MurmurHash3_64_hexdigest() {\n      var h1 = this.h1;\n      var h2 = this.h2;\n      h1 ^= h2 >>> 1;\n      h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW;\n      h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16;\n      h1 ^= h2 >>> 1;\n      h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW;\n      h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16;\n      h1 ^= h2 >>> 1;\n      for (var i = 0, arr = [h1, h2], str = ''; i < arr.length; i++) {\n        var hex = (arr[i] >>> 0).toString(16);\n        while (hex.length < 8) {\n          hex = '0' + hex;\n        }\n        str += hex;\n      }\n      return str;\n    }\n  };\n  return MurmurHash3_64;\n}();\nexports.MurmurHash3_64 = MurmurHash3_64;\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getTilingPatternIR = exports.Pattern = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _colorspace = __w_pdfjs_require__(3);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar _function = __w_pdfjs_require__(7);\n\nvar ShadingType = {\n  FUNCTION_BASED: 1,\n  AXIAL: 2,\n  RADIAL: 3,\n  FREE_FORM_MESH: 4,\n  LATTICE_FORM_MESH: 5,\n  COONS_PATCH_MESH: 6,\n  TENSOR_PATCH_MESH: 7\n};\nvar Pattern = function PatternClosure() {\n  function Pattern() {\n    throw new Error('should not call Pattern constructor');\n  }\n  Pattern.prototype = {\n    getPattern: function Pattern_getPattern(ctx) {\n      throw new Error('Should not call Pattern.getStyle: ' + ctx);\n    }\n  };\n  Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref, res, handler) {\n    var dict = (0, _primitives.isStream)(shading) ? shading.dict : shading;\n    var type = dict.get('ShadingType');\n    try {\n      switch (type) {\n        case ShadingType.AXIAL:\n        case ShadingType.RADIAL:\n          return new Shadings.RadialAxial(dict, matrix, xref, res);\n        case ShadingType.FREE_FORM_MESH:\n        case ShadingType.LATTICE_FORM_MESH:\n        case ShadingType.COONS_PATCH_MESH:\n        case ShadingType.TENSOR_PATCH_MESH:\n          return new Shadings.Mesh(shading, matrix, xref, res);\n        default:\n          throw new _util.FormatError('Unsupported ShadingType: ' + type);\n      }\n    } catch (ex) {\n      if (ex instanceof _util.MissingDataException) {\n        throw ex;\n      }\n      handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.shadingPattern });\n      (0, _util.warn)(ex);\n      return new Shadings.Dummy();\n    }\n  };\n  return Pattern;\n}();\nvar Shadings = {};\nShadings.SMALL_NUMBER = 1e-6;\nShadings.RadialAxial = function RadialAxialClosure() {\n  function RadialAxial(dict, matrix, xref, res) {\n    this.matrix = matrix;\n    this.coordsArr = dict.getArray('Coords');\n    this.shadingType = dict.get('ShadingType');\n    this.type = 'Pattern';\n    var cs = dict.get('ColorSpace', 'CS');\n    cs = _colorspace.ColorSpace.parse(cs, xref, res);\n    this.cs = cs;\n    var t0 = 0.0,\n        t1 = 1.0;\n    if (dict.has('Domain')) {\n      var domainArr = dict.getArray('Domain');\n      t0 = domainArr[0];\n      t1 = domainArr[1];\n    }\n    var extendStart = false,\n        extendEnd = false;\n    if (dict.has('Extend')) {\n      var extendArr = dict.getArray('Extend');\n      extendStart = extendArr[0];\n      extendEnd = extendArr[1];\n    }\n    if (this.shadingType === ShadingType.RADIAL && (!extendStart || !extendEnd)) {\n      var x1 = this.coordsArr[0];\n      var y1 = this.coordsArr[1];\n      var r1 = this.coordsArr[2];\n      var x2 = this.coordsArr[3];\n      var y2 = this.coordsArr[4];\n      var r2 = this.coordsArr[5];\n      var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));\n      if (r1 <= r2 + distance && r2 <= r1 + distance) {\n        (0, _util.warn)('Unsupported radial gradient.');\n      }\n    }\n    this.extendStart = extendStart;\n    this.extendEnd = extendEnd;\n    var fnObj = dict.get('Function');\n    var fn = _function.PDFFunction.parseArray(xref, fnObj);\n    var diff = t1 - t0;\n    var step = diff / 10;\n    var colorStops = this.colorStops = [];\n    if (t0 >= t1 || step <= 0) {\n      (0, _util.info)('Bad shading domain.');\n      return;\n    }\n    var color = new Float32Array(cs.numComps),\n        ratio = new Float32Array(1);\n    var rgbColor;\n    for (var i = t0; i <= t1; i += step) {\n      ratio[0] = i;\n      fn(ratio, 0, color, 0);\n      rgbColor = cs.getRgb(color, 0);\n      var cssColor = _util.Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);\n      colorStops.push([(i - t0) / diff, cssColor]);\n    }\n    var background = 'transparent';\n    if (dict.has('Background')) {\n      rgbColor = cs.getRgb(dict.get('Background'), 0);\n      background = _util.Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);\n    }\n    if (!extendStart) {\n      colorStops.unshift([0, background]);\n      colorStops[1][0] += Shadings.SMALL_NUMBER;\n    }\n    if (!extendEnd) {\n      colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER;\n      colorStops.push([1, background]);\n    }\n    this.colorStops = colorStops;\n  }\n  RadialAxial.prototype = {\n    getIR: function RadialAxial_getIR() {\n      var coordsArr = this.coordsArr;\n      var shadingType = this.shadingType;\n      var type, p0, p1, r0, r1;\n      if (shadingType === ShadingType.AXIAL) {\n        p0 = [coordsArr[0], coordsArr[1]];\n        p1 = [coordsArr[2], coordsArr[3]];\n        r0 = null;\n        r1 = null;\n        type = 'axial';\n      } else if (shadingType === ShadingType.RADIAL) {\n        p0 = [coordsArr[0], coordsArr[1]];\n        p1 = [coordsArr[3], coordsArr[4]];\n        r0 = coordsArr[2];\n        r1 = coordsArr[5];\n        type = 'radial';\n      } else {\n        (0, _util.unreachable)('getPattern type unknown: ' + shadingType);\n      }\n      var matrix = this.matrix;\n      if (matrix) {\n        p0 = _util.Util.applyTransform(p0, matrix);\n        p1 = _util.Util.applyTransform(p1, matrix);\n        if (shadingType === ShadingType.RADIAL) {\n          var scale = _util.Util.singularValueDecompose2dScale(matrix);\n          r0 *= scale[0];\n          r1 *= scale[1];\n        }\n      }\n      return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];\n    }\n  };\n  return RadialAxial;\n}();\nShadings.Mesh = function MeshClosure() {\n  function MeshStreamReader(stream, context) {\n    this.stream = stream;\n    this.context = context;\n    this.buffer = 0;\n    this.bufferLength = 0;\n    var numComps = context.numComps;\n    this.tmpCompsBuf = new Float32Array(numComps);\n    var csNumComps = context.colorSpace.numComps;\n    this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf;\n  }\n  MeshStreamReader.prototype = {\n    get hasData() {\n      if (this.stream.end) {\n        return this.stream.pos < this.stream.end;\n      }\n      if (this.bufferLength > 0) {\n        return true;\n      }\n      var nextByte = this.stream.getByte();\n      if (nextByte < 0) {\n        return false;\n      }\n      this.buffer = nextByte;\n      this.bufferLength = 8;\n      return true;\n    },\n    readBits: function MeshStreamReader_readBits(n) {\n      var buffer = this.buffer;\n      var bufferLength = this.bufferLength;\n      if (n === 32) {\n        if (bufferLength === 0) {\n          return (this.stream.getByte() << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte()) >>> 0;\n        }\n        buffer = buffer << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte();\n        var nextByte = this.stream.getByte();\n        this.buffer = nextByte & (1 << bufferLength) - 1;\n        return (buffer << 8 - bufferLength | (nextByte & 0xFF) >> bufferLength) >>> 0;\n      }\n      if (n === 8 && bufferLength === 0) {\n        return this.stream.getByte();\n      }\n      while (bufferLength < n) {\n        buffer = buffer << 8 | this.stream.getByte();\n        bufferLength += 8;\n      }\n      bufferLength -= n;\n      this.bufferLength = bufferLength;\n      this.buffer = buffer & (1 << bufferLength) - 1;\n      return buffer >> bufferLength;\n    },\n    align: function MeshStreamReader_align() {\n      this.buffer = 0;\n      this.bufferLength = 0;\n    },\n    readFlag: function MeshStreamReader_readFlag() {\n      return this.readBits(this.context.bitsPerFlag);\n    },\n    readCoordinate: function MeshStreamReader_readCoordinate() {\n      var bitsPerCoordinate = this.context.bitsPerCoordinate;\n      var xi = this.readBits(bitsPerCoordinate);\n      var yi = this.readBits(bitsPerCoordinate);\n      var decode = this.context.decode;\n      var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10;\n      return [xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + decode[2]];\n    },\n    readComponents: function MeshStreamReader_readComponents() {\n      var numComps = this.context.numComps;\n      var bitsPerComponent = this.context.bitsPerComponent;\n      var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10;\n      var decode = this.context.decode;\n      var components = this.tmpCompsBuf;\n      for (var i = 0, j = 4; i < numComps; i++, j += 2) {\n        var ci = this.readBits(bitsPerComponent);\n        components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j];\n      }\n      var color = this.tmpCsCompsBuf;\n      if (this.context.colorFn) {\n        this.context.colorFn(components, 0, color, 0);\n      }\n      return this.context.colorSpace.getRgb(color, 0);\n    }\n  };\n  function decodeType4Shading(mesh, reader) {\n    var coords = mesh.coords;\n    var colors = mesh.colors;\n    var operators = [];\n    var ps = [];\n    var verticesLeft = 0;\n    while (reader.hasData) {\n      var f = reader.readFlag();\n      var coord = reader.readCoordinate();\n      var color = reader.readComponents();\n      if (verticesLeft === 0) {\n        if (!(0 <= f && f <= 2)) {\n          throw new _util.FormatError('Unknown type4 flag');\n        }\n        switch (f) {\n          case 0:\n            verticesLeft = 3;\n            break;\n          case 1:\n            ps.push(ps[ps.length - 2], ps[ps.length - 1]);\n            verticesLeft = 1;\n            break;\n          case 2:\n            ps.push(ps[ps.length - 3], ps[ps.length - 1]);\n            verticesLeft = 1;\n            break;\n        }\n        operators.push(f);\n      }\n      ps.push(coords.length);\n      coords.push(coord);\n      colors.push(color);\n      verticesLeft--;\n      reader.align();\n    }\n    mesh.figures.push({\n      type: 'triangles',\n      coords: new Int32Array(ps),\n      colors: new Int32Array(ps)\n    });\n  }\n  function decodeType5Shading(mesh, reader, verticesPerRow) {\n    var coords = mesh.coords;\n    var colors = mesh.colors;\n    var ps = [];\n    while (reader.hasData) {\n      var coord = reader.readCoordinate();\n      var color = reader.readComponents();\n      ps.push(coords.length);\n      coords.push(coord);\n      colors.push(color);\n    }\n    mesh.figures.push({\n      type: 'lattice',\n      coords: new Int32Array(ps),\n      colors: new Int32Array(ps),\n      verticesPerRow: verticesPerRow\n    });\n  }\n  var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3;\n  var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20;\n  var TRIANGLE_DENSITY = 20;\n  var getB = function getBClosure() {\n    function buildB(count) {\n      var lut = [];\n      for (var i = 0; i <= count; i++) {\n        var t = i / count,\n            t_ = 1 - t;\n        lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_, 3 * t * t * t_, t * t * t]));\n      }\n      return lut;\n    }\n    var cache = [];\n    return function getB(count) {\n      if (!cache[count]) {\n        cache[count] = buildB(count);\n      }\n      return cache[count];\n    };\n  }();\n  function buildFigureFromPatch(mesh, index) {\n    var figure = mesh.figures[index];\n    (0, _util.assert)(figure.type === 'patch', 'Unexpected patch mesh figure');\n    var coords = mesh.coords,\n        colors = mesh.colors;\n    var pi = figure.coords;\n    var ci = figure.colors;\n    var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);\n    var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);\n    var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);\n    var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);\n    var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY / (mesh.bounds[2] - mesh.bounds[0]));\n    splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy));\n    var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY / (mesh.bounds[3] - mesh.bounds[1]));\n    splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy));\n    var verticesPerRow = splitXBy + 1;\n    var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow);\n    var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow);\n    var k = 0;\n    var cl = new Uint8Array(3),\n        cr = new Uint8Array(3);\n    var c0 = colors[ci[0]],\n        c1 = colors[ci[1]],\n        c2 = colors[ci[2]],\n        c3 = colors[ci[3]];\n    var bRow = getB(splitYBy),\n        bCol = getB(splitXBy);\n    for (var row = 0; row <= splitYBy; row++) {\n      cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0;\n      cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0;\n      cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0;\n      cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0;\n      cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0;\n      cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0;\n      for (var col = 0; col <= splitXBy; col++, k++) {\n        if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) {\n          continue;\n        }\n        var x = 0,\n            y = 0;\n        var q = 0;\n        for (var i = 0; i <= 3; i++) {\n          for (var j = 0; j <= 3; j++, q++) {\n            var m = bRow[row][i] * bCol[col][j];\n            x += coords[pi[q]][0] * m;\n            y += coords[pi[q]][1] * m;\n          }\n        }\n        figureCoords[k] = coords.length;\n        coords.push([x, y]);\n        figureColors[k] = colors.length;\n        var newColor = new Uint8Array(3);\n        newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0;\n        newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0;\n        newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0;\n        colors.push(newColor);\n      }\n    }\n    figureCoords[0] = pi[0];\n    figureColors[0] = ci[0];\n    figureCoords[splitXBy] = pi[3];\n    figureColors[splitXBy] = ci[1];\n    figureCoords[verticesPerRow * splitYBy] = pi[12];\n    figureColors[verticesPerRow * splitYBy] = ci[2];\n    figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15];\n    figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3];\n    mesh.figures[index] = {\n      type: 'lattice',\n      coords: figureCoords,\n      colors: figureColors,\n      verticesPerRow: verticesPerRow\n    };\n  }\n  function decodeType6Shading(mesh, reader) {\n    var coords = mesh.coords;\n    var colors = mesh.colors;\n    var ps = new Int32Array(16);\n    var cs = new Int32Array(4);\n    while (reader.hasData) {\n      var f = reader.readFlag();\n      if (!(0 <= f && f <= 3)) {\n        throw new _util.FormatError('Unknown type6 flag');\n      }\n      var i, ii;\n      var pi = coords.length;\n      for (i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) {\n        coords.push(reader.readCoordinate());\n      }\n      var ci = colors.length;\n      for (i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {\n        colors.push(reader.readComponents());\n      }\n      var tmp1, tmp2, tmp3, tmp4;\n      switch (f) {\n        case 0:\n          ps[12] = pi + 3;\n          ps[13] = pi + 4;\n          ps[14] = pi + 5;\n          ps[15] = pi + 6;\n          ps[8] = pi + 2;\n          ps[11] = pi + 7;\n          ps[4] = pi + 1;\n          ps[7] = pi + 8;\n          ps[0] = pi;\n          ps[1] = pi + 11;\n          ps[2] = pi + 10;\n          ps[3] = pi + 9;\n          cs[2] = ci + 1;\n          cs[3] = ci + 2;\n          cs[0] = ci;\n          cs[1] = ci + 3;\n          break;\n        case 1:\n          tmp1 = ps[12];\n          tmp2 = ps[13];\n          tmp3 = ps[14];\n          tmp4 = ps[15];\n          ps[12] = tmp4;\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = tmp3;\n          ps[11] = pi + 3;\n          ps[4] = tmp2;\n          ps[7] = pi + 4;\n          ps[0] = tmp1;\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          tmp1 = cs[2];\n          tmp2 = cs[3];\n          cs[2] = tmp2;\n          cs[3] = ci;\n          cs[0] = tmp1;\n          cs[1] = ci + 1;\n          break;\n        case 2:\n          tmp1 = ps[15];\n          tmp2 = ps[11];\n          ps[12] = ps[3];\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = ps[7];\n          ps[11] = pi + 3;\n          ps[4] = tmp2;\n          ps[7] = pi + 4;\n          ps[0] = tmp1;\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          tmp1 = cs[3];\n          cs[2] = cs[1];\n          cs[3] = ci;\n          cs[0] = tmp1;\n          cs[1] = ci + 1;\n          break;\n        case 3:\n          ps[12] = ps[0];\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = ps[1];\n          ps[11] = pi + 3;\n          ps[4] = ps[2];\n          ps[7] = pi + 4;\n          ps[0] = ps[3];\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          cs[2] = cs[0];\n          cs[3] = ci;\n          cs[0] = cs[1];\n          cs[1] = ci + 1;\n          break;\n      }\n      ps[5] = coords.length;\n      coords.push([(-4 * coords[ps[0]][0] - coords[ps[15]][0] + 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, (-4 * coords[ps[0]][1] - coords[ps[15]][1] + 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9]);\n      ps[6] = coords.length;\n      coords.push([(-4 * coords[ps[3]][0] - coords[ps[12]][0] + 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, (-4 * coords[ps[3]][1] - coords[ps[12]][1] + 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9]);\n      ps[9] = coords.length;\n      coords.push([(-4 * coords[ps[12]][0] - coords[ps[3]][0] + 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, (-4 * coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9]);\n      ps[10] = coords.length;\n      coords.push([(-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, (-4 * coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9]);\n      mesh.figures.push({\n        type: 'patch',\n        coords: new Int32Array(ps),\n        colors: new Int32Array(cs)\n      });\n    }\n  }\n  function decodeType7Shading(mesh, reader) {\n    var coords = mesh.coords;\n    var colors = mesh.colors;\n    var ps = new Int32Array(16);\n    var cs = new Int32Array(4);\n    while (reader.hasData) {\n      var f = reader.readFlag();\n      if (!(0 <= f && f <= 3)) {\n        throw new _util.FormatError('Unknown type7 flag');\n      }\n      var i, ii;\n      var pi = coords.length;\n      for (i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) {\n        coords.push(reader.readCoordinate());\n      }\n      var ci = colors.length;\n      for (i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {\n        colors.push(reader.readComponents());\n      }\n      var tmp1, tmp2, tmp3, tmp4;\n      switch (f) {\n        case 0:\n          ps[12] = pi + 3;\n          ps[13] = pi + 4;\n          ps[14] = pi + 5;\n          ps[15] = pi + 6;\n          ps[8] = pi + 2;\n          ps[9] = pi + 13;\n          ps[10] = pi + 14;\n          ps[11] = pi + 7;\n          ps[4] = pi + 1;\n          ps[5] = pi + 12;\n          ps[6] = pi + 15;\n          ps[7] = pi + 8;\n          ps[0] = pi;\n          ps[1] = pi + 11;\n          ps[2] = pi + 10;\n          ps[3] = pi + 9;\n          cs[2] = ci + 1;\n          cs[3] = ci + 2;\n          cs[0] = ci;\n          cs[1] = ci + 3;\n          break;\n        case 1:\n          tmp1 = ps[12];\n          tmp2 = ps[13];\n          tmp3 = ps[14];\n          tmp4 = ps[15];\n          ps[12] = tmp4;\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = tmp3;\n          ps[9] = pi + 9;\n          ps[10] = pi + 10;\n          ps[11] = pi + 3;\n          ps[4] = tmp2;\n          ps[5] = pi + 8;\n          ps[6] = pi + 11;\n          ps[7] = pi + 4;\n          ps[0] = tmp1;\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          tmp1 = cs[2];\n          tmp2 = cs[3];\n          cs[2] = tmp2;\n          cs[3] = ci;\n          cs[0] = tmp1;\n          cs[1] = ci + 1;\n          break;\n        case 2:\n          tmp1 = ps[15];\n          tmp2 = ps[11];\n          ps[12] = ps[3];\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = ps[7];\n          ps[9] = pi + 9;\n          ps[10] = pi + 10;\n          ps[11] = pi + 3;\n          ps[4] = tmp2;\n          ps[5] = pi + 8;\n          ps[6] = pi + 11;\n          ps[7] = pi + 4;\n          ps[0] = tmp1;\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          tmp1 = cs[3];\n          cs[2] = cs[1];\n          cs[3] = ci;\n          cs[0] = tmp1;\n          cs[1] = ci + 1;\n          break;\n        case 3:\n          ps[12] = ps[0];\n          ps[13] = pi + 0;\n          ps[14] = pi + 1;\n          ps[15] = pi + 2;\n          ps[8] = ps[1];\n          ps[9] = pi + 9;\n          ps[10] = pi + 10;\n          ps[11] = pi + 3;\n          ps[4] = ps[2];\n          ps[5] = pi + 8;\n          ps[6] = pi + 11;\n          ps[7] = pi + 4;\n          ps[0] = ps[3];\n          ps[1] = pi + 7;\n          ps[2] = pi + 6;\n          ps[3] = pi + 5;\n          cs[2] = cs[0];\n          cs[3] = ci;\n          cs[0] = cs[1];\n          cs[1] = ci + 1;\n          break;\n      }\n      mesh.figures.push({\n        type: 'patch',\n        coords: new Int32Array(ps),\n        colors: new Int32Array(cs)\n      });\n    }\n  }\n  function updateBounds(mesh) {\n    var minX = mesh.coords[0][0],\n        minY = mesh.coords[0][1],\n        maxX = minX,\n        maxY = minY;\n    for (var i = 1, ii = mesh.coords.length; i < ii; i++) {\n      var x = mesh.coords[i][0],\n          y = mesh.coords[i][1];\n      minX = minX > x ? x : minX;\n      minY = minY > y ? y : minY;\n      maxX = maxX < x ? x : maxX;\n      maxY = maxY < y ? y : maxY;\n    }\n    mesh.bounds = [minX, minY, maxX, maxY];\n  }\n  function packData(mesh) {\n    var i, ii, j, jj;\n    var coords = mesh.coords;\n    var coordsPacked = new Float32Array(coords.length * 2);\n    for (i = 0, j = 0, ii = coords.length; i < ii; i++) {\n      var xy = coords[i];\n      coordsPacked[j++] = xy[0];\n      coordsPacked[j++] = xy[1];\n    }\n    mesh.coords = coordsPacked;\n    var colors = mesh.colors;\n    var colorsPacked = new Uint8Array(colors.length * 3);\n    for (i = 0, j = 0, ii = colors.length; i < ii; i++) {\n      var c = colors[i];\n      colorsPacked[j++] = c[0];\n      colorsPacked[j++] = c[1];\n      colorsPacked[j++] = c[2];\n    }\n    mesh.colors = colorsPacked;\n    var figures = mesh.figures;\n    for (i = 0, ii = figures.length; i < ii; i++) {\n      var figure = figures[i],\n          ps = figure.coords,\n          cs = figure.colors;\n      for (j = 0, jj = ps.length; j < jj; j++) {\n        ps[j] *= 2;\n        cs[j] *= 3;\n      }\n    }\n  }\n  function Mesh(stream, matrix, xref, res) {\n    if (!(0, _primitives.isStream)(stream)) {\n      throw new _util.FormatError('Mesh data is not a stream');\n    }\n    var dict = stream.dict;\n    this.matrix = matrix;\n    this.shadingType = dict.get('ShadingType');\n    this.type = 'Pattern';\n    this.bbox = dict.getArray('BBox');\n    var cs = dict.get('ColorSpace', 'CS');\n    cs = _colorspace.ColorSpace.parse(cs, xref, res);\n    this.cs = cs;\n    this.background = dict.has('Background') ? cs.getRgb(dict.get('Background'), 0) : null;\n    var fnObj = dict.get('Function');\n    var fn = fnObj ? _function.PDFFunction.parseArray(xref, fnObj) : null;\n    this.coords = [];\n    this.colors = [];\n    this.figures = [];\n    var decodeContext = {\n      bitsPerCoordinate: dict.get('BitsPerCoordinate'),\n      bitsPerComponent: dict.get('BitsPerComponent'),\n      bitsPerFlag: dict.get('BitsPerFlag'),\n      decode: dict.getArray('Decode'),\n      colorFn: fn,\n      colorSpace: cs,\n      numComps: fn ? 1 : cs.numComps\n    };\n    var reader = new MeshStreamReader(stream, decodeContext);\n    var patchMesh = false;\n    switch (this.shadingType) {\n      case ShadingType.FREE_FORM_MESH:\n        decodeType4Shading(this, reader);\n        break;\n      case ShadingType.LATTICE_FORM_MESH:\n        var verticesPerRow = dict.get('VerticesPerRow') | 0;\n        if (verticesPerRow < 2) {\n          throw new _util.FormatError('Invalid VerticesPerRow');\n        }\n        decodeType5Shading(this, reader, verticesPerRow);\n        break;\n      case ShadingType.COONS_PATCH_MESH:\n        decodeType6Shading(this, reader);\n        patchMesh = true;\n        break;\n      case ShadingType.TENSOR_PATCH_MESH:\n        decodeType7Shading(this, reader);\n        patchMesh = true;\n        break;\n      default:\n        (0, _util.unreachable)('Unsupported mesh type.');\n        break;\n    }\n    if (patchMesh) {\n      updateBounds(this);\n      for (var i = 0, ii = this.figures.length; i < ii; i++) {\n        buildFigureFromPatch(this, i);\n      }\n    }\n    updateBounds(this);\n    packData(this);\n  }\n  Mesh.prototype = {\n    getIR: function Mesh_getIR() {\n      return ['Mesh', this.shadingType, this.coords, this.colors, this.figures, this.bounds, this.matrix, this.bbox, this.background];\n    }\n  };\n  return Mesh;\n}();\nShadings.Dummy = function DummyClosure() {\n  function Dummy() {\n    this.type = 'Pattern';\n  }\n  Dummy.prototype = {\n    getIR: function Dummy_getIR() {\n      return ['Dummy'];\n    }\n  };\n  return Dummy;\n}();\nfunction getTilingPatternIR(operatorList, dict, args) {\n  var matrix = dict.getArray('Matrix');\n  var bbox = _util.Util.normalizeRect(dict.getArray('BBox'));\n  var xstep = dict.get('XStep');\n  var ystep = dict.get('YStep');\n  var paintType = dict.get('PaintType');\n  var tilingType = dict.get('TilingType');\n  if (bbox[2] - bbox[0] === 0 || bbox[3] - bbox[1] === 0) {\n    throw new _util.FormatError('Invalid getTilingPatternIR /BBox array: [' + bbox + '].');\n  }\n  return ['TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType];\n}\nexports.Pattern = Pattern;\nexports.getTilingPatternIR = getTilingPatternIR;\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.NetworkPdfManager = exports.LocalPdfManager = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _chunked_stream = __w_pdfjs_require__(11);\n\nvar _document = __w_pdfjs_require__(23);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar BasePdfManager = function BasePdfManagerClosure() {\n  function BasePdfManager() {\n    throw new Error('Cannot initialize BaseManagerManager');\n  }\n  BasePdfManager.prototype = {\n    get docId() {\n      return this._docId;\n    },\n    get password() {\n      return this._password;\n    },\n    get docBaseUrl() {\n      var docBaseUrl = null;\n      if (this._docBaseUrl) {\n        var absoluteUrl = (0, _util.createValidAbsoluteUrl)(this._docBaseUrl);\n        if (absoluteUrl) {\n          docBaseUrl = absoluteUrl.href;\n        } else {\n          (0, _util.warn)('Invalid absolute docBaseUrl: \"' + this._docBaseUrl + '\".');\n        }\n      }\n      return (0, _util.shadow)(this, 'docBaseUrl', docBaseUrl);\n    },\n    onLoadedStream: function BasePdfManager_onLoadedStream() {\n      throw new _util.NotImplementedException();\n    },\n    ensureDoc: function BasePdfManager_ensureDoc(prop, args) {\n      return this.ensure(this.pdfDocument, prop, args);\n    },\n    ensureXRef: function BasePdfManager_ensureXRef(prop, args) {\n      return this.ensure(this.pdfDocument.xref, prop, args);\n    },\n    ensureCatalog: function BasePdfManager_ensureCatalog(prop, args) {\n      return this.ensure(this.pdfDocument.catalog, prop, args);\n    },\n    getPage: function BasePdfManager_getPage(pageIndex) {\n      return this.pdfDocument.getPage(pageIndex);\n    },\n    cleanup: function BasePdfManager_cleanup() {\n      return this.pdfDocument.cleanup();\n    },\n    ensure: function BasePdfManager_ensure(obj, prop, args) {\n      return new _util.NotImplementedException();\n    },\n    requestRange: function BasePdfManager_requestRange(begin, end) {\n      return new _util.NotImplementedException();\n    },\n    requestLoadedStream: function BasePdfManager_requestLoadedStream() {\n      return new _util.NotImplementedException();\n    },\n    sendProgressiveData: function BasePdfManager_sendProgressiveData(chunk) {\n      return new _util.NotImplementedException();\n    },\n    updatePassword: function BasePdfManager_updatePassword(password) {\n      this._password = password;\n    },\n    terminate: function BasePdfManager_terminate() {\n      return new _util.NotImplementedException();\n    }\n  };\n  return BasePdfManager;\n}();\nvar LocalPdfManager = function LocalPdfManagerClosure() {\n  function LocalPdfManager(docId, data, password, evaluatorOptions, docBaseUrl) {\n    this._docId = docId;\n    this._password = password;\n    this._docBaseUrl = docBaseUrl;\n    this.evaluatorOptions = evaluatorOptions;\n    var stream = new _stream.Stream(data);\n    this.pdfDocument = new _document.PDFDocument(this, stream);\n    this._loadedStreamCapability = (0, _util.createPromiseCapability)();\n    this._loadedStreamCapability.resolve(stream);\n  }\n  _util.Util.inherit(LocalPdfManager, BasePdfManager, {\n    ensure: function LocalPdfManager_ensure(obj, prop, args) {\n      return new Promise(function (resolve, reject) {\n        try {\n          var value = obj[prop];\n          var result;\n          if (typeof value === 'function') {\n            result = value.apply(obj, args);\n          } else {\n            result = value;\n          }\n          resolve(result);\n        } catch (e) {\n          reject(e);\n        }\n      });\n    },\n    requestRange: function LocalPdfManager_requestRange(begin, end) {\n      return Promise.resolve();\n    },\n    requestLoadedStream: function LocalPdfManager_requestLoadedStream() {},\n    onLoadedStream: function LocalPdfManager_onLoadedStream() {\n      return this._loadedStreamCapability.promise;\n    },\n    terminate: function LocalPdfManager_terminate() {}\n  });\n  return LocalPdfManager;\n}();\nvar NetworkPdfManager = function NetworkPdfManagerClosure() {\n  function NetworkPdfManager(docId, pdfNetworkStream, args, evaluatorOptions, docBaseUrl) {\n    this._docId = docId;\n    this._password = args.password;\n    this._docBaseUrl = docBaseUrl;\n    this.msgHandler = args.msgHandler;\n    this.evaluatorOptions = evaluatorOptions;\n    var params = {\n      msgHandler: args.msgHandler,\n      url: args.url,\n      length: args.length,\n      disableAutoFetch: args.disableAutoFetch,\n      rangeChunkSize: args.rangeChunkSize\n    };\n    this.streamManager = new _chunked_stream.ChunkedStreamManager(pdfNetworkStream, params);\n    this.pdfDocument = new _document.PDFDocument(this, this.streamManager.getStream());\n  }\n  _util.Util.inherit(NetworkPdfManager, BasePdfManager, {\n    ensure: function NetworkPdfManager_ensure(obj, prop, args) {\n      var pdfManager = this;\n      return new Promise(function (resolve, reject) {\n        function ensureHelper() {\n          try {\n            var result;\n            var value = obj[prop];\n            if (typeof value === 'function') {\n              result = value.apply(obj, args);\n            } else {\n              result = value;\n            }\n            resolve(result);\n          } catch (e) {\n            if (!(e instanceof _util.MissingDataException)) {\n              reject(e);\n              return;\n            }\n            pdfManager.streamManager.requestRange(e.begin, e.end).then(ensureHelper, reject);\n          }\n        }\n        ensureHelper();\n      });\n    },\n    requestRange: function NetworkPdfManager_requestRange(begin, end) {\n      return this.streamManager.requestRange(begin, end);\n    },\n    requestLoadedStream: function NetworkPdfManager_requestLoadedStream() {\n      this.streamManager.requestAllChunks();\n    },\n    sendProgressiveData: function NetworkPdfManager_sendProgressiveData(chunk) {\n      this.streamManager.onReceiveData({ chunk: chunk });\n    },\n    onLoadedStream: function NetworkPdfManager_onLoadedStream() {\n      return this.streamManager.onLoadedStream();\n    },\n    terminate: function NetworkPdfManager_terminate() {\n      this.streamManager.abort();\n    }\n  });\n  return NetworkPdfManager;\n}();\nexports.LocalPdfManager = LocalPdfManager;\nexports.NetworkPdfManager = NetworkPdfManager;\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PostScriptParser = exports.PostScriptLexer = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _primitives = __w_pdfjs_require__(1);\n\nvar PostScriptParser = function PostScriptParserClosure() {\n  function PostScriptParser(lexer) {\n    this.lexer = lexer;\n    this.operators = [];\n    this.token = null;\n    this.prev = null;\n  }\n  PostScriptParser.prototype = {\n    nextToken: function PostScriptParser_nextToken() {\n      this.prev = this.token;\n      this.token = this.lexer.getToken();\n    },\n    accept: function PostScriptParser_accept(type) {\n      if (this.token.type === type) {\n        this.nextToken();\n        return true;\n      }\n      return false;\n    },\n    expect: function PostScriptParser_expect(type) {\n      if (this.accept(type)) {\n        return true;\n      }\n      throw new _util.FormatError('Unexpected symbol: found ' + this.token.type + ' expected ' + type + '.');\n    },\n    parse: function PostScriptParser_parse() {\n      this.nextToken();\n      this.expect(PostScriptTokenTypes.LBRACE);\n      this.parseBlock();\n      this.expect(PostScriptTokenTypes.RBRACE);\n      return this.operators;\n    },\n    parseBlock: function PostScriptParser_parseBlock() {\n      while (true) {\n        if (this.accept(PostScriptTokenTypes.NUMBER)) {\n          this.operators.push(this.prev.value);\n        } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {\n          this.operators.push(this.prev.value);\n        } else if (this.accept(PostScriptTokenTypes.LBRACE)) {\n          this.parseCondition();\n        } else {\n          return;\n        }\n      }\n    },\n    parseCondition: function PostScriptParser_parseCondition() {\n      var conditionLocation = this.operators.length;\n      this.operators.push(null, null);\n      this.parseBlock();\n      this.expect(PostScriptTokenTypes.RBRACE);\n      if (this.accept(PostScriptTokenTypes.IF)) {\n        this.operators[conditionLocation] = this.operators.length;\n        this.operators[conditionLocation + 1] = 'jz';\n      } else if (this.accept(PostScriptTokenTypes.LBRACE)) {\n        var jumpLocation = this.operators.length;\n        this.operators.push(null, null);\n        var endOfTrue = this.operators.length;\n        this.parseBlock();\n        this.expect(PostScriptTokenTypes.RBRACE);\n        this.expect(PostScriptTokenTypes.IFELSE);\n        this.operators[jumpLocation] = this.operators.length;\n        this.operators[jumpLocation + 1] = 'j';\n        this.operators[conditionLocation] = endOfTrue;\n        this.operators[conditionLocation + 1] = 'jz';\n      } else {\n        throw new _util.FormatError('PS Function: error parsing conditional.');\n      }\n    }\n  };\n  return PostScriptParser;\n}();\nvar PostScriptTokenTypes = {\n  LBRACE: 0,\n  RBRACE: 1,\n  NUMBER: 2,\n  OPERATOR: 3,\n  IF: 4,\n  IFELSE: 5\n};\nvar PostScriptToken = function PostScriptTokenClosure() {\n  function PostScriptToken(type, value) {\n    this.type = type;\n    this.value = value;\n  }\n  var opCache = Object.create(null);\n  PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {\n    var opValue = opCache[op];\n    if (opValue) {\n      return opValue;\n    }\n    return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);\n  };\n  PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE, '{');\n  PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE, '}');\n  PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');\n  PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE, 'IFELSE');\n  return PostScriptToken;\n}();\nvar PostScriptLexer = function PostScriptLexerClosure() {\n  function PostScriptLexer(stream) {\n    this.stream = stream;\n    this.nextChar();\n    this.strBuf = [];\n  }\n  PostScriptLexer.prototype = {\n    nextChar: function PostScriptLexer_nextChar() {\n      return this.currentChar = this.stream.getByte();\n    },\n    getToken: function PostScriptLexer_getToken() {\n      var comment = false;\n      var ch = this.currentChar;\n      while (true) {\n        if (ch < 0) {\n          return _primitives.EOF;\n        }\n        if (comment) {\n          if (ch === 0x0A || ch === 0x0D) {\n            comment = false;\n          }\n        } else if (ch === 0x25) {\n          comment = true;\n        } else if (!(0, _util.isSpace)(ch)) {\n          break;\n        }\n        ch = this.nextChar();\n      }\n      switch (ch | 0) {\n        case 0x30:\n        case 0x31:\n        case 0x32:\n        case 0x33:\n        case 0x34:\n        case 0x35:\n        case 0x36:\n        case 0x37:\n        case 0x38:\n        case 0x39:\n        case 0x2B:\n        case 0x2D:\n        case 0x2E:\n          return new PostScriptToken(PostScriptTokenTypes.NUMBER, this.getNumber());\n        case 0x7B:\n          this.nextChar();\n          return PostScriptToken.LBRACE;\n        case 0x7D:\n          this.nextChar();\n          return PostScriptToken.RBRACE;\n      }\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      strBuf[0] = String.fromCharCode(ch);\n      while ((ch = this.nextChar()) >= 0 && (ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A)) {\n        strBuf.push(String.fromCharCode(ch));\n      }\n      var str = strBuf.join('');\n      switch (str.toLowerCase()) {\n        case 'if':\n          return PostScriptToken.IF;\n        case 'ifelse':\n          return PostScriptToken.IFELSE;\n        default:\n          return PostScriptToken.getOperator(str);\n      }\n    },\n    getNumber: function PostScriptLexer_getNumber() {\n      var ch = this.currentChar;\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      strBuf[0] = String.fromCharCode(ch);\n      while ((ch = this.nextChar()) >= 0) {\n        if (ch >= 0x30 && ch <= 0x39 || ch === 0x2D || ch === 0x2E) {\n          strBuf.push(String.fromCharCode(ch));\n        } else {\n          break;\n        }\n      }\n      var value = parseFloat(strBuf.join(''));\n      if (isNaN(value)) {\n        throw new _util.FormatError('Invalid floating point number: ' + value);\n      }\n      return value;\n    }\n  };\n  return PostScriptLexer;\n}();\nexports.PostScriptLexer = PostScriptLexer;\nexports.PostScriptParser = PostScriptParser;\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Type1Parser = undefined;\n\nvar _util = __w_pdfjs_require__(0);\n\nvar _encodings = __w_pdfjs_require__(4);\n\nvar _stream = __w_pdfjs_require__(2);\n\nvar HINTING_ENABLED = false;\nvar Type1CharString = function Type1CharStringClosure() {\n  var COMMAND_MAP = {\n    'hstem': [1],\n    'vstem': [3],\n    'vmoveto': [4],\n    'rlineto': [5],\n    'hlineto': [6],\n    'vlineto': [7],\n    'rrcurveto': [8],\n    'callsubr': [10],\n    'flex': [12, 35],\n    'drop': [12, 18],\n    'endchar': [14],\n    'rmoveto': [21],\n    'hmoveto': [22],\n    'vhcurveto': [30],\n    'hvcurveto': [31]\n  };\n  function Type1CharString() {\n    this.width = 0;\n    this.lsb = 0;\n    this.flexing = false;\n    this.output = [];\n    this.stack = [];\n  }\n  Type1CharString.prototype = {\n    convert: function Type1CharString_convert(encoded, subrs, seacAnalysisEnabled) {\n      var count = encoded.length;\n      var error = false;\n      var wx, sbx, subrNumber;\n      for (var i = 0; i < count; i++) {\n        var value = encoded[i];\n        if (value < 32) {\n          if (value === 12) {\n            value = (value << 8) + encoded[++i];\n          }\n          switch (value) {\n            case 1:\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n              error = this.executeCommand(2, COMMAND_MAP.hstem);\n              break;\n            case 3:\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n              error = this.executeCommand(2, COMMAND_MAP.vstem);\n              break;\n            case 4:\n              if (this.flexing) {\n                if (this.stack.length < 1) {\n                  error = true;\n                  break;\n                }\n                var dy = this.stack.pop();\n                this.stack.push(0, dy);\n                break;\n              }\n              error = this.executeCommand(1, COMMAND_MAP.vmoveto);\n              break;\n            case 5:\n              error = this.executeCommand(2, COMMAND_MAP.rlineto);\n              break;\n            case 6:\n              error = this.executeCommand(1, COMMAND_MAP.hlineto);\n              break;\n            case 7:\n              error = this.executeCommand(1, COMMAND_MAP.vlineto);\n              break;\n            case 8:\n              error = this.executeCommand(6, COMMAND_MAP.rrcurveto);\n              break;\n            case 9:\n              this.stack = [];\n              break;\n            case 10:\n              if (this.stack.length < 1) {\n                error = true;\n                break;\n              }\n              subrNumber = this.stack.pop();\n              error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled);\n              break;\n            case 11:\n              return error;\n            case 13:\n              if (this.stack.length < 2) {\n                error = true;\n                break;\n              }\n              wx = this.stack.pop();\n              sbx = this.stack.pop();\n              this.lsb = sbx;\n              this.width = wx;\n              this.stack.push(wx, sbx);\n              error = this.executeCommand(2, COMMAND_MAP.hmoveto);\n              break;\n            case 14:\n              this.output.push(COMMAND_MAP.endchar[0]);\n              break;\n            case 21:\n              if (this.flexing) {\n                break;\n              }\n              error = this.executeCommand(2, COMMAND_MAP.rmoveto);\n              break;\n            case 22:\n              if (this.flexing) {\n                this.stack.push(0);\n                break;\n              }\n              error = this.executeCommand(1, COMMAND_MAP.hmoveto);\n              break;\n            case 30:\n              error = this.executeCommand(4, COMMAND_MAP.vhcurveto);\n              break;\n            case 31:\n              error = this.executeCommand(4, COMMAND_MAP.hvcurveto);\n              break;\n            case (12 << 8) + 0:\n              this.stack = [];\n              break;\n            case (12 << 8) + 1:\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n              error = this.executeCommand(2, COMMAND_MAP.vstem);\n              break;\n            case (12 << 8) + 2:\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n              error = this.executeCommand(2, COMMAND_MAP.hstem);\n              break;\n            case (12 << 8) + 6:\n              if (seacAnalysisEnabled) {\n                this.seac = this.stack.splice(-4, 4);\n                error = this.executeCommand(0, COMMAND_MAP.endchar);\n              } else {\n                error = this.executeCommand(4, COMMAND_MAP.endchar);\n              }\n              break;\n            case (12 << 8) + 7:\n              if (this.stack.length < 4) {\n                error = true;\n                break;\n              }\n              this.stack.pop();\n              wx = this.stack.pop();\n              var sby = this.stack.pop();\n              sbx = this.stack.pop();\n              this.lsb = sbx;\n              this.width = wx;\n              this.stack.push(wx, sbx, sby);\n              error = this.executeCommand(3, COMMAND_MAP.rmoveto);\n              break;\n            case (12 << 8) + 12:\n              if (this.stack.length < 2) {\n                error = true;\n                break;\n              }\n              var num2 = this.stack.pop();\n              var num1 = this.stack.pop();\n              this.stack.push(num1 / num2);\n              break;\n            case (12 << 8) + 16:\n              if (this.stack.length < 2) {\n                error = true;\n                break;\n              }\n              subrNumber = this.stack.pop();\n              var numArgs = this.stack.pop();\n              if (subrNumber === 0 && numArgs === 3) {\n                var flexArgs = this.stack.splice(this.stack.length - 17, 17);\n                this.stack.push(flexArgs[2] + flexArgs[0], flexArgs[3] + flexArgs[1], flexArgs[4], flexArgs[5], flexArgs[6], flexArgs[7], flexArgs[8], flexArgs[9], flexArgs[10], flexArgs[11], flexArgs[12], flexArgs[13], flexArgs[14]);\n                error = this.executeCommand(13, COMMAND_MAP.flex, true);\n                this.flexing = false;\n                this.stack.push(flexArgs[15], flexArgs[16]);\n              } else if (subrNumber === 1 && numArgs === 0) {\n                this.flexing = true;\n              }\n              break;\n            case (12 << 8) + 17:\n              break;\n            case (12 << 8) + 33:\n              this.stack = [];\n              break;\n            default:\n              (0, _util.warn)('Unknown type 1 charstring command of \"' + value + '\"');\n              break;\n          }\n          if (error) {\n            break;\n          }\n          continue;\n        } else if (value <= 246) {\n          value = value - 139;\n        } else if (value <= 250) {\n          value = (value - 247) * 256 + encoded[++i] + 108;\n        } else if (value <= 254) {\n          value = -((value - 251) * 256) - encoded[++i] - 108;\n        } else {\n          value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0;\n        }\n        this.stack.push(value);\n      }\n      return error;\n    },\n    executeCommand: function executeCommand(howManyArgs, command, keepStack) {\n      var stackLength = this.stack.length;\n      if (howManyArgs > stackLength) {\n        return true;\n      }\n      var start = stackLength - howManyArgs;\n      for (var i = start; i < stackLength; i++) {\n        var value = this.stack[i];\n        if (value === (value | 0)) {\n          this.output.push(28, value >> 8 & 0xff, value & 0xff);\n        } else {\n          value = 65536 * value | 0;\n          this.output.push(255, value >> 24 & 0xFF, value >> 16 & 0xFF, value >> 8 & 0xFF, value & 0xFF);\n        }\n      }\n      this.output.push.apply(this.output, command);\n      if (keepStack) {\n        this.stack.splice(start, howManyArgs);\n      } else {\n        this.stack.length = 0;\n      }\n      return false;\n    }\n  };\n  return Type1CharString;\n}();\nvar Type1Parser = function Type1ParserClosure() {\n  var EEXEC_ENCRYPT_KEY = 55665;\n  var CHAR_STRS_ENCRYPT_KEY = 4330;\n  function isHexDigit(code) {\n    return code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102;\n  }\n  function decrypt(data, key, discardNumber) {\n    if (discardNumber >= data.length) {\n      return new Uint8Array(0);\n    }\n    var r = key | 0,\n        c1 = 52845,\n        c2 = 22719,\n        i,\n        j;\n    for (i = 0; i < discardNumber; i++) {\n      r = (data[i] + r) * c1 + c2 & (1 << 16) - 1;\n    }\n    var count = data.length - discardNumber;\n    var decrypted = new Uint8Array(count);\n    for (i = discardNumber, j = 0; j < count; i++, j++) {\n      var value = data[i];\n      decrypted[j] = value ^ r >> 8;\n      r = (value + r) * c1 + c2 & (1 << 16) - 1;\n    }\n    return decrypted;\n  }\n  function decryptAscii(data, key, discardNumber) {\n    var r = key | 0,\n        c1 = 52845,\n        c2 = 22719;\n    var count = data.length,\n        maybeLength = count >>> 1;\n    var decrypted = new Uint8Array(maybeLength);\n    var i, j;\n    for (i = 0, j = 0; i < count; i++) {\n      var digit1 = data[i];\n      if (!isHexDigit(digit1)) {\n        continue;\n      }\n      i++;\n      var digit2;\n      while (i < count && !isHexDigit(digit2 = data[i])) {\n        i++;\n      }\n      if (i < count) {\n        var value = parseInt(String.fromCharCode(digit1, digit2), 16);\n        decrypted[j++] = value ^ r >> 8;\n        r = (value + r) * c1 + c2 & (1 << 16) - 1;\n      }\n    }\n    return Array.prototype.slice.call(decrypted, discardNumber, j);\n  }\n  function isSpecial(c) {\n    return c === 0x2F || c === 0x5B || c === 0x5D || c === 0x7B || c === 0x7D || c === 0x28 || c === 0x29;\n  }\n  function Type1Parser(stream, encrypted, seacAnalysisEnabled) {\n    if (encrypted) {\n      var data = stream.getBytes();\n      var isBinary = !(isHexDigit(data[0]) && isHexDigit(data[1]) && isHexDigit(data[2]) && isHexDigit(data[3]));\n      stream = new _stream.Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : decryptAscii(data, EEXEC_ENCRYPT_KEY, 4));\n    }\n    this.seacAnalysisEnabled = !!seacAnalysisEnabled;\n    this.stream = stream;\n    this.nextChar();\n  }\n  Type1Parser.prototype = {\n    readNumberArray: function Type1Parser_readNumberArray() {\n      this.getToken();\n      var array = [];\n      while (true) {\n        var token = this.getToken();\n        if (token === null || token === ']' || token === '}') {\n          break;\n        }\n        array.push(parseFloat(token || 0));\n      }\n      return array;\n    },\n    readNumber: function Type1Parser_readNumber() {\n      var token = this.getToken();\n      return parseFloat(token || 0);\n    },\n    readInt: function Type1Parser_readInt() {\n      var token = this.getToken();\n      return parseInt(token || 0, 10) | 0;\n    },\n    readBoolean: function Type1Parser_readBoolean() {\n      var token = this.getToken();\n      return token === 'true' ? 1 : 0;\n    },\n    nextChar: function Type1_nextChar() {\n      return this.currentChar = this.stream.getByte();\n    },\n    getToken: function Type1Parser_getToken() {\n      var comment = false;\n      var ch = this.currentChar;\n      while (true) {\n        if (ch === -1) {\n          return null;\n        }\n        if (comment) {\n          if (ch === 0x0A || ch === 0x0D) {\n            comment = false;\n          }\n        } else if (ch === 0x25) {\n          comment = true;\n        } else if (!(0, _util.isSpace)(ch)) {\n          break;\n        }\n        ch = this.nextChar();\n      }\n      if (isSpecial(ch)) {\n        this.nextChar();\n        return String.fromCharCode(ch);\n      }\n      var token = '';\n      do {\n        token += String.fromCharCode(ch);\n        ch = this.nextChar();\n      } while (ch >= 0 && !(0, _util.isSpace)(ch) && !isSpecial(ch));\n      return token;\n    },\n    extractFontProgram: function Type1Parser_extractFontProgram() {\n      var stream = this.stream;\n      var subrs = [],\n          charstrings = [];\n      var privateData = Object.create(null);\n      privateData['lenIV'] = 4;\n      var program = {\n        subrs: [],\n        charstrings: [],\n        properties: { 'privateData': privateData }\n      };\n      var token, length, data, lenIV, encoded;\n      while ((token = this.getToken()) !== null) {\n        if (token !== '/') {\n          continue;\n        }\n        token = this.getToken();\n        switch (token) {\n          case 'CharStrings':\n            this.getToken();\n            this.getToken();\n            this.getToken();\n            this.getToken();\n            while (true) {\n              token = this.getToken();\n              if (token === null || token === 'end') {\n                break;\n              }\n              if (token !== '/') {\n                continue;\n              }\n              var glyph = this.getToken();\n              length = this.readInt();\n              this.getToken();\n              data = stream.makeSubStream(stream.pos, length);\n              lenIV = program.properties.privateData['lenIV'];\n              encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV);\n              stream.skip(length);\n              this.nextChar();\n              token = this.getToken();\n              if (token === 'noaccess') {\n                this.getToken();\n              }\n              charstrings.push({\n                glyph: glyph,\n                encoded: encoded\n              });\n            }\n            break;\n          case 'Subrs':\n            this.readInt();\n            this.getToken();\n            while ((token = this.getToken()) === 'dup') {\n              var index = this.readInt();\n              length = this.readInt();\n              this.getToken();\n              data = stream.makeSubStream(stream.pos, length);\n              lenIV = program.properties.privateData['lenIV'];\n              encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV);\n              stream.skip(length);\n              this.nextChar();\n              token = this.getToken();\n              if (token === 'noaccess') {\n                this.getToken();\n              }\n              subrs[index] = encoded;\n            }\n            break;\n          case 'BlueValues':\n          case 'OtherBlues':\n          case 'FamilyBlues':\n          case 'FamilyOtherBlues':\n            var blueArray = this.readNumberArray();\n            if (blueArray.length > 0 && blueArray.length % 2 === 0 && HINTING_ENABLED) {\n              program.properties.privateData[token] = blueArray;\n            }\n            break;\n          case 'StemSnapH':\n          case 'StemSnapV':\n            program.properties.privateData[token] = this.readNumberArray();\n            break;\n          case 'StdHW':\n          case 'StdVW':\n            program.properties.privateData[token] = this.readNumberArray()[0];\n            break;\n          case 'BlueShift':\n          case 'lenIV':\n          case 'BlueFuzz':\n          case 'BlueScale':\n          case 'LanguageGroup':\n          case 'ExpansionFactor':\n            program.properties.privateData[token] = this.readNumber();\n            break;\n          case 'ForceBold':\n            program.properties.privateData[token] = this.readBoolean();\n            break;\n        }\n      }\n      for (var i = 0; i < charstrings.length; i++) {\n        glyph = charstrings[i].glyph;\n        encoded = charstrings[i].encoded;\n        var charString = new Type1CharString();\n        var error = charString.convert(encoded, subrs, this.seacAnalysisEnabled);\n        var output = charString.output;\n        if (error) {\n          output = [14];\n        }\n        program.charstrings.push({\n          glyphName: glyph,\n          charstring: output,\n          width: charString.width,\n          lsb: charString.lsb,\n          seac: charString.seac\n        });\n      }\n      return program;\n    },\n    extractFontHeader: function Type1Parser_extractFontHeader(properties) {\n      var token;\n      while ((token = this.getToken()) !== null) {\n        if (token !== '/') {\n          continue;\n        }\n        token = this.getToken();\n        switch (token) {\n          case 'FontMatrix':\n            var matrix = this.readNumberArray();\n            properties.fontMatrix = matrix;\n            break;\n          case 'Encoding':\n            var encodingArg = this.getToken();\n            var encoding;\n            if (!/^\\d+$/.test(encodingArg)) {\n              encoding = (0, _encodings.getEncoding)(encodingArg);\n            } else {\n              encoding = [];\n              var size = parseInt(encodingArg, 10) | 0;\n              this.getToken();\n              for (var j = 0; j < size; j++) {\n                token = this.getToken();\n                while (token !== 'dup' && token !== 'def') {\n                  token = this.getToken();\n                  if (token === null) {\n                    return;\n                  }\n                }\n                if (token === 'def') {\n                  break;\n                }\n                var index = this.readInt();\n                this.getToken();\n                var glyph = this.getToken();\n                encoding[index] = glyph;\n                this.getToken();\n              }\n            }\n            properties.builtInEncoding = encoding;\n            break;\n          case 'FontBBox':\n            var fontBBox = this.readNumberArray();\n            properties.ascent = Math.max(fontBBox[3], fontBBox[1]);\n            properties.descent = Math.min(fontBBox[1], fontBBox[3]);\n            properties.ascentScaled = true;\n            break;\n        }\n      }\n    }\n  };\n  return Type1Parser;\n}();\nexports.Type1Parser = Type1Parser;\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar pdfjsVersion = '1.9.426';\nvar pdfjsBuild = '2558a58d';\nvar pdfjsCoreWorker = __w_pdfjs_require__(17);\nexports.WorkerMessageHandler = pdfjsCoreWorker.WorkerMessageHandler;\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nif (typeof PDFJS === 'undefined' || !PDFJS.compatibilityChecked) {\n  var globalScope = typeof window !== 'undefined' && window.Math === Math ? window : typeof global !== 'undefined' && global.Math === Math ? global : typeof self !== 'undefined' && self.Math === Math ? self :  false ? undefined : {};\n  var userAgent = typeof navigator !== 'undefined' && navigator.userAgent || '';\n  var isAndroid = /Android/.test(userAgent);\n  var isAndroidPre3 = /Android\\s[0-2][^\\d]/.test(userAgent);\n  var isAndroidPre5 = /Android\\s[0-4][^\\d]/.test(userAgent);\n  var isChrome = userAgent.indexOf('Chrom') >= 0;\n  var isChromeWithRangeBug = /Chrome\\/(39|40)\\./.test(userAgent);\n  var isIOSChrome = userAgent.indexOf('CriOS') >= 0;\n  var isIE = userAgent.indexOf('Trident') >= 0;\n  var isIOS = /\\b(iPad|iPhone|iPod)(?=;)/.test(userAgent);\n  var isOpera = userAgent.indexOf('Opera') >= 0;\n  var isSafari = /Safari\\//.test(userAgent) && !/(Chrome\\/|Android\\s)/.test(userAgent);\n  var hasDOM = (typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && (typeof document === 'undefined' ? 'undefined' : _typeof(document)) === 'object';\n  if (typeof PDFJS === 'undefined') {\n    globalScope.PDFJS = {};\n  }\n  PDFJS.compatibilityChecked = true;\n  (function checkTypedArrayCompatibility() {\n    if (typeof Uint8Array !== 'undefined') {\n      if (typeof Uint8Array.prototype.subarray === 'undefined') {\n        Uint8Array.prototype.subarray = function subarray(start, end) {\n          return new Uint8Array(this.slice(start, end));\n        };\n        Float32Array.prototype.subarray = function subarray(start, end) {\n          return new Float32Array(this.slice(start, end));\n        };\n      }\n      if (typeof Float64Array === 'undefined') {\n        globalScope.Float64Array = Float32Array;\n      }\n      return;\n    }\n    function subarray(start, end) {\n      return new TypedArray(this.slice(start, end));\n    }\n    function setArrayOffset(array, offset) {\n      if (arguments.length < 2) {\n        offset = 0;\n      }\n      for (var i = 0, n = array.length; i < n; ++i, ++offset) {\n        this[offset] = array[i] & 0xFF;\n      }\n    }\n    function Uint32ArrayView(buffer, length) {\n      this.buffer = buffer;\n      this.byteLength = buffer.length;\n      this.length = length;\n      ensureUint32ArrayViewProps(this.length);\n    }\n    Uint32ArrayView.prototype = Object.create(null);\n    var uint32ArrayViewSetters = 0;\n    function createUint32ArrayProp(index) {\n      return {\n        get: function get() {\n          var buffer = this.buffer,\n              offset = index << 2;\n          return (buffer[offset] | buffer[offset + 1] << 8 | buffer[offset + 2] << 16 | buffer[offset + 3] << 24) >>> 0;\n        },\n        set: function set(value) {\n          var buffer = this.buffer,\n              offset = index << 2;\n          buffer[offset] = value & 255;\n          buffer[offset + 1] = value >> 8 & 255;\n          buffer[offset + 2] = value >> 16 & 255;\n          buffer[offset + 3] = value >>> 24 & 255;\n        }\n      };\n    }\n    function ensureUint32ArrayViewProps(length) {\n      while (uint32ArrayViewSetters < length) {\n        Object.defineProperty(Uint32ArrayView.prototype, uint32ArrayViewSetters, createUint32ArrayProp(uint32ArrayViewSetters));\n        uint32ArrayViewSetters++;\n      }\n    }\n    function TypedArray(arg1) {\n      var result, i, n;\n      if (typeof arg1 === 'number') {\n        result = [];\n        for (i = 0; i < arg1; ++i) {\n          result[i] = 0;\n        }\n      } else if ('slice' in arg1) {\n        result = arg1.slice(0);\n      } else {\n        result = [];\n        for (i = 0, n = arg1.length; i < n; ++i) {\n          result[i] = arg1[i];\n        }\n      }\n      result.subarray = subarray;\n      result.buffer = result;\n      result.byteLength = result.length;\n      result.set = setArrayOffset;\n      if ((typeof arg1 === 'undefined' ? 'undefined' : _typeof(arg1)) === 'object' && arg1.buffer) {\n        result.buffer = arg1.buffer;\n      }\n      return result;\n    }\n    globalScope.Uint8Array = TypedArray;\n    globalScope.Int8Array = TypedArray;\n    globalScope.Int32Array = TypedArray;\n    globalScope.Uint16Array = TypedArray;\n    globalScope.Float32Array = TypedArray;\n    globalScope.Float64Array = TypedArray;\n    globalScope.Uint32Array = function () {\n      if (arguments.length === 3) {\n        if (arguments[1] !== 0) {\n          throw new Error('offset !== 0 is not supported');\n        }\n        return new Uint32ArrayView(arguments[0], arguments[2]);\n      }\n      return TypedArray.apply(this, arguments);\n    };\n  })();\n  (function canvasPixelArrayBuffer() {\n    if (!hasDOM || !window.CanvasPixelArray) {\n      return;\n    }\n    var cpaProto = window.CanvasPixelArray.prototype;\n    if ('buffer' in cpaProto) {\n      return;\n    }\n    Object.defineProperty(cpaProto, 'buffer', {\n      get: function get() {\n        return this;\n      },\n\n      enumerable: false,\n      configurable: true\n    });\n    Object.defineProperty(cpaProto, 'byteLength', {\n      get: function get() {\n        return this.length;\n      },\n\n      enumerable: false,\n      configurable: true\n    });\n  })();\n  (function normalizeURLObject() {\n    if (!globalScope.URL) {\n      globalScope.URL = globalScope.webkitURL;\n    }\n  })();\n  (function checkObjectDefinePropertyCompatibility() {\n    if (typeof Object.defineProperty !== 'undefined') {\n      var definePropertyPossible = true;\n      try {\n        if (hasDOM) {\n          Object.defineProperty(new Image(), 'id', { value: 'test' });\n        }\n        var Test = function Test() {};\n        Test.prototype = {\n          get id() {}\n        };\n        Object.defineProperty(new Test(), 'id', {\n          value: '',\n          configurable: true,\n          enumerable: true,\n          writable: false\n        });\n      } catch (e) {\n        definePropertyPossible = false;\n      }\n      if (definePropertyPossible) {\n        return;\n      }\n    }\n    Object.defineProperty = function objectDefineProperty(obj, name, def) {\n      delete obj[name];\n      if ('get' in def) {\n        obj.__defineGetter__(name, def['get']);\n      }\n      if ('set' in def) {\n        obj.__defineSetter__(name, def['set']);\n      }\n      if ('value' in def) {\n        obj.__defineSetter__(name, function objectDefinePropertySetter(value) {\n          this.__defineGetter__(name, function objectDefinePropertyGetter() {\n            return value;\n          });\n          return value;\n        });\n        obj[name] = def.value;\n      }\n    };\n  })();\n  (function checkXMLHttpRequestResponseCompatibility() {\n    if (typeof XMLHttpRequest === 'undefined') {\n      return;\n    }\n    var xhrPrototype = XMLHttpRequest.prototype;\n    var xhr = new XMLHttpRequest();\n    if (!('overrideMimeType' in xhr)) {\n      Object.defineProperty(xhrPrototype, 'overrideMimeType', {\n        value: function xmlHttpRequestOverrideMimeType(mimeType) {}\n      });\n    }\n    if ('responseType' in xhr) {\n      return;\n    }\n    Object.defineProperty(xhrPrototype, 'responseType', {\n      get: function xmlHttpRequestGetResponseType() {\n        return this._responseType || 'text';\n      },\n      set: function xmlHttpRequestSetResponseType(value) {\n        if (value === 'text' || value === 'arraybuffer') {\n          this._responseType = value;\n          if (value === 'arraybuffer' && typeof this.overrideMimeType === 'function') {\n            this.overrideMimeType('text/plain; charset=x-user-defined');\n          }\n        }\n      }\n    });\n    if (typeof VBArray !== 'undefined') {\n      Object.defineProperty(xhrPrototype, 'response', {\n        get: function xmlHttpRequestResponseGet() {\n          if (this.responseType === 'arraybuffer') {\n            return new Uint8Array(new VBArray(this.responseBody).toArray());\n          }\n          return this.responseText;\n        }\n      });\n      return;\n    }\n    Object.defineProperty(xhrPrototype, 'response', {\n      get: function xmlHttpRequestResponseGet() {\n        if (this.responseType !== 'arraybuffer') {\n          return this.responseText;\n        }\n        var text = this.responseText;\n        var i,\n            n = text.length;\n        var result = new Uint8Array(n);\n        for (i = 0; i < n; ++i) {\n          result[i] = text.charCodeAt(i) & 0xFF;\n        }\n        return result.buffer;\n      }\n    });\n  })();\n  (function checkWindowBtoaCompatibility() {\n    if ('btoa' in globalScope) {\n      return;\n    }\n    var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n    globalScope.btoa = function (chars) {\n      var buffer = '';\n      var i, n;\n      for (i = 0, n = chars.length; i < n; i += 3) {\n        var b1 = chars.charCodeAt(i) & 0xFF;\n        var b2 = chars.charCodeAt(i + 1) & 0xFF;\n        var b3 = chars.charCodeAt(i + 2) & 0xFF;\n        var d1 = b1 >> 2,\n            d2 = (b1 & 3) << 4 | b2 >> 4;\n        var d3 = i + 1 < n ? (b2 & 0xF) << 2 | b3 >> 6 : 64;\n        var d4 = i + 2 < n ? b3 & 0x3F : 64;\n        buffer += digits.charAt(d1) + digits.charAt(d2) + digits.charAt(d3) + digits.charAt(d4);\n      }\n      return buffer;\n    };\n  })();\n  (function checkWindowAtobCompatibility() {\n    if ('atob' in globalScope) {\n      return;\n    }\n    var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n    globalScope.atob = function (input) {\n      input = input.replace(/=+$/, '');\n      if (input.length % 4 === 1) {\n        throw new Error('bad atob input');\n      }\n      for (var bc = 0, bs, buffer, idx = 0, output = ''; buffer = input.charAt(idx++); ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) {\n        buffer = digits.indexOf(buffer);\n      }\n      return output;\n    };\n  })();\n  (function checkFunctionPrototypeBindCompatibility() {\n    if (typeof Function.prototype.bind !== 'undefined') {\n      return;\n    }\n    Function.prototype.bind = function functionPrototypeBind(obj) {\n      var fn = this,\n          headArgs = Array.prototype.slice.call(arguments, 1);\n      var bound = function functionPrototypeBindBound() {\n        var args = headArgs.concat(Array.prototype.slice.call(arguments));\n        return fn.apply(obj, args);\n      };\n      return bound;\n    };\n  })();\n  (function checkDatasetProperty() {\n    if (!hasDOM) {\n      return;\n    }\n    var div = document.createElement('div');\n    if ('dataset' in div) {\n      return;\n    }\n    Object.defineProperty(HTMLElement.prototype, 'dataset', {\n      get: function get() {\n        if (this._dataset) {\n          return this._dataset;\n        }\n        var dataset = {};\n        for (var j = 0, jj = this.attributes.length; j < jj; j++) {\n          var attribute = this.attributes[j];\n          if (attribute.name.substring(0, 5) !== 'data-') {\n            continue;\n          }\n          var key = attribute.name.substring(5).replace(/\\-([a-z])/g, function (all, ch) {\n            return ch.toUpperCase();\n          });\n          dataset[key] = attribute.value;\n        }\n        Object.defineProperty(this, '_dataset', {\n          value: dataset,\n          writable: false,\n          enumerable: false\n        });\n        return dataset;\n      },\n\n      enumerable: true\n    });\n  })();\n  (function checkClassListProperty() {\n    function changeList(element, itemName, add, remove) {\n      var s = element.className || '';\n      var list = s.split(/\\s+/g);\n      if (list[0] === '') {\n        list.shift();\n      }\n      var index = list.indexOf(itemName);\n      if (index < 0 && add) {\n        list.push(itemName);\n      }\n      if (index >= 0 && remove) {\n        list.splice(index, 1);\n      }\n      element.className = list.join(' ');\n      return index >= 0;\n    }\n    if (!hasDOM) {\n      return;\n    }\n    var div = document.createElement('div');\n    if ('classList' in div) {\n      return;\n    }\n    var classListPrototype = {\n      add: function add(name) {\n        changeList(this.element, name, true, false);\n      },\n      contains: function contains(name) {\n        return changeList(this.element, name, false, false);\n      },\n      remove: function remove(name) {\n        changeList(this.element, name, false, true);\n      },\n      toggle: function toggle(name) {\n        changeList(this.element, name, true, true);\n      }\n    };\n    Object.defineProperty(HTMLElement.prototype, 'classList', {\n      get: function get() {\n        if (this._classList) {\n          return this._classList;\n        }\n        var classList = Object.create(classListPrototype, {\n          element: {\n            value: this,\n            writable: false,\n            enumerable: true\n          }\n        });\n        Object.defineProperty(this, '_classList', {\n          value: classList,\n          writable: false,\n          enumerable: false\n        });\n        return classList;\n      },\n\n      enumerable: true\n    });\n  })();\n  (function checkWorkerConsoleCompatibility() {\n    if (typeof importScripts === 'undefined' || 'console' in globalScope) {\n      return;\n    }\n    var consoleTimer = {};\n    var workerConsole = {\n      log: function log() {\n        var args = Array.prototype.slice.call(arguments);\n        globalScope.postMessage({\n          targetName: 'main',\n          action: 'console_log',\n          data: args\n        });\n      },\n      error: function error() {\n        var args = Array.prototype.slice.call(arguments);\n        globalScope.postMessage({\n          targetName: 'main',\n          action: 'console_error',\n          data: args\n        });\n      },\n      time: function time(name) {\n        consoleTimer[name] = Date.now();\n      },\n      timeEnd: function timeEnd(name) {\n        var time = consoleTimer[name];\n        if (!time) {\n          throw new Error('Unknown timer name ' + name);\n        }\n        this.log('Timer:', name, Date.now() - time);\n      }\n    };\n    globalScope.console = workerConsole;\n  })();\n  (function checkConsoleCompatibility() {\n    if (!hasDOM) {\n      return;\n    }\n    if (!('console' in window)) {\n      window.console = {\n        log: function log() {},\n        error: function error() {},\n        warn: function warn() {}\n      };\n      return;\n    }\n    if (!('bind' in console.log)) {\n      console.log = function (fn) {\n        return function (msg) {\n          return fn(msg);\n        };\n      }(console.log);\n      console.error = function (fn) {\n        return function (msg) {\n          return fn(msg);\n        };\n      }(console.error);\n      console.warn = function (fn) {\n        return function (msg) {\n          return fn(msg);\n        };\n      }(console.warn);\n      return;\n    }\n  })();\n  (function checkOnClickCompatibility() {\n    function ignoreIfTargetDisabled(event) {\n      if (isDisabled(event.target)) {\n        event.stopPropagation();\n      }\n    }\n    function isDisabled(node) {\n      return node.disabled || node.parentNode && isDisabled(node.parentNode);\n    }\n    if (isOpera) {\n      document.addEventListener('click', ignoreIfTargetDisabled, true);\n    }\n  })();\n  (function checkOnBlobSupport() {\n    if (isIE || isIOSChrome) {\n      PDFJS.disableCreateObjectURL = true;\n    }\n  })();\n  (function checkNavigatorLanguage() {\n    if (typeof navigator === 'undefined') {\n      return;\n    }\n    if ('language' in navigator) {\n      return;\n    }\n    PDFJS.locale = navigator.userLanguage || 'en-US';\n  })();\n  (function checkRangeRequests() {\n    if (isSafari || isAndroidPre3 || isChromeWithRangeBug || isIOS) {\n      PDFJS.disableRange = true;\n      PDFJS.disableStream = true;\n    }\n  })();\n  (function checkHistoryManipulation() {\n    if (!hasDOM) {\n      return;\n    }\n    if (!history.pushState || isAndroidPre3) {\n      PDFJS.disableHistory = true;\n    }\n  })();\n  (function checkSetPresenceInImageData() {\n    if (!hasDOM) {\n      return;\n    }\n    if (window.CanvasPixelArray) {\n      if (typeof window.CanvasPixelArray.prototype.set !== 'function') {\n        window.CanvasPixelArray.prototype.set = function (arr) {\n          for (var i = 0, ii = this.length; i < ii; i++) {\n            this[i] = arr[i];\n          }\n        };\n      }\n    } else {\n      var polyfill = false,\n          versionMatch;\n      if (isChrome) {\n        versionMatch = userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\n        polyfill = versionMatch && parseInt(versionMatch[2]) < 21;\n      } else if (isAndroid) {\n        polyfill = isAndroidPre5;\n      } else if (isSafari) {\n        versionMatch = userAgent.match(/Version\\/([0-9]+)\\.([0-9]+)\\.([0-9]+) Safari\\//);\n        polyfill = versionMatch && parseInt(versionMatch[1]) < 6;\n      }\n      if (polyfill) {\n        var contextPrototype = window.CanvasRenderingContext2D.prototype;\n        var createImageData = contextPrototype.createImageData;\n        contextPrototype.createImageData = function (w, h) {\n          var imageData = createImageData.call(this, w, h);\n          imageData.data.set = function (arr) {\n            for (var i = 0, ii = this.length; i < ii; i++) {\n              this[i] = arr[i];\n            }\n          };\n          return imageData;\n        };\n        contextPrototype = null;\n      }\n    }\n  })();\n  (function checkRequestAnimationFrame() {\n    function installFakeAnimationFrameFunctions() {\n      window.requestAnimationFrame = function (callback) {\n        return window.setTimeout(callback, 20);\n      };\n      window.cancelAnimationFrame = function (timeoutID) {\n        window.clearTimeout(timeoutID);\n      };\n    }\n    if (!hasDOM) {\n      return;\n    }\n    if (isIOS) {\n      installFakeAnimationFrameFunctions();\n      return;\n    }\n    if ('requestAnimationFrame' in window) {\n      return;\n    }\n    window.requestAnimationFrame = window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame;\n    if (window.requestAnimationFrame) {\n      return;\n    }\n    installFakeAnimationFrameFunctions();\n  })();\n  (function checkCanvasSizeLimitation() {\n    if (isIOS || isAndroid) {\n      PDFJS.maxCanvasPixels = 5242880;\n    }\n  })();\n  (function checkFullscreenSupport() {\n    if (!hasDOM) {\n      return;\n    }\n    if (isIE && window.parent !== window) {\n      PDFJS.disableFullscreen = true;\n    }\n  })();\n  (function checkCurrentScript() {\n    if (!hasDOM) {\n      return;\n    }\n    if ('currentScript' in document) {\n      return;\n    }\n    Object.defineProperty(document, 'currentScript', {\n      get: function get() {\n        var scripts = document.getElementsByTagName('script');\n        return scripts[scripts.length - 1];\n      },\n\n      enumerable: true,\n      configurable: true\n    });\n  })();\n  (function checkInputTypeNumberAssign() {\n    if (!hasDOM) {\n      return;\n    }\n    var el = document.createElement('input');\n    try {\n      el.type = 'number';\n    } catch (ex) {\n      var inputProto = el.constructor.prototype;\n      var typeProperty = Object.getOwnPropertyDescriptor(inputProto, 'type');\n      Object.defineProperty(inputProto, 'type', {\n        get: function get() {\n          return typeProperty.get.call(this);\n        },\n        set: function set(value) {\n          typeProperty.set.call(this, value === 'number' ? 'text' : value);\n        },\n\n        enumerable: true,\n        configurable: true\n      });\n    }\n  })();\n  (function checkDocumentReadyState() {\n    if (!hasDOM) {\n      return;\n    }\n    if (!document.attachEvent) {\n      return;\n    }\n    var documentProto = document.constructor.prototype;\n    var readyStateProto = Object.getOwnPropertyDescriptor(documentProto, 'readyState');\n    Object.defineProperty(documentProto, 'readyState', {\n      get: function get() {\n        var value = readyStateProto.get.call(this);\n        return value === 'interactive' ? 'loading' : value;\n      },\n      set: function set(value) {\n        readyStateProto.set.call(this, value);\n      },\n\n      enumerable: true,\n      configurable: true\n    });\n  })();\n  (function checkChildNodeRemove() {\n    if (!hasDOM) {\n      return;\n    }\n    if (typeof Element.prototype.remove !== 'undefined') {\n      return;\n    }\n    Element.prototype.remove = function () {\n      if (this.parentNode) {\n        this.parentNode.removeChild(this);\n      }\n    };\n  })();\n  (function checkNumberIsNaN() {\n    if (Number.isNaN) {\n      return;\n    }\n    Number.isNaN = function (value) {\n      return typeof value === 'number' && isNaN(value);\n    };\n  })();\n  (function checkNumberIsInteger() {\n    if (Number.isInteger) {\n      return;\n    }\n    Number.isInteger = function (value) {\n      return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;\n    };\n  })();\n  (function checkPromise() {\n    if (globalScope.Promise) {\n      if (typeof globalScope.Promise.all !== 'function') {\n        globalScope.Promise.all = function (iterable) {\n          var count = 0,\n              results = [],\n              resolve,\n              reject;\n          var promise = new globalScope.Promise(function (resolve_, reject_) {\n            resolve = resolve_;\n            reject = reject_;\n          });\n          iterable.forEach(function (p, i) {\n            count++;\n            p.then(function (result) {\n              results[i] = result;\n              count--;\n              if (count === 0) {\n                resolve(results);\n              }\n            }, reject);\n          });\n          if (count === 0) {\n            resolve(results);\n          }\n          return promise;\n        };\n      }\n      if (typeof globalScope.Promise.resolve !== 'function') {\n        globalScope.Promise.resolve = function (value) {\n          return new globalScope.Promise(function (resolve) {\n            resolve(value);\n          });\n        };\n      }\n      if (typeof globalScope.Promise.reject !== 'function') {\n        globalScope.Promise.reject = function (reason) {\n          return new globalScope.Promise(function (resolve, reject) {\n            reject(reason);\n          });\n        };\n      }\n      if (typeof globalScope.Promise.prototype.catch !== 'function') {\n        globalScope.Promise.prototype.catch = function (onReject) {\n          return globalScope.Promise.prototype.then(undefined, onReject);\n        };\n      }\n      return;\n    }\n    var STATUS_PENDING = 0;\n    var STATUS_RESOLVED = 1;\n    var STATUS_REJECTED = 2;\n    var REJECTION_TIMEOUT = 500;\n    var HandlerManager = {\n      handlers: [],\n      running: false,\n      unhandledRejections: [],\n      pendingRejectionCheck: false,\n      scheduleHandlers: function scheduleHandlers(promise) {\n        if (promise._status === STATUS_PENDING) {\n          return;\n        }\n        this.handlers = this.handlers.concat(promise._handlers);\n        promise._handlers = [];\n        if (this.running) {\n          return;\n        }\n        this.running = true;\n        setTimeout(this.runHandlers.bind(this), 0);\n      },\n      runHandlers: function runHandlers() {\n        var RUN_TIMEOUT = 1;\n        var timeoutAt = Date.now() + RUN_TIMEOUT;\n        while (this.handlers.length > 0) {\n          var handler = this.handlers.shift();\n          var nextStatus = handler.thisPromise._status;\n          var nextValue = handler.thisPromise._value;\n          try {\n            if (nextStatus === STATUS_RESOLVED) {\n              if (typeof handler.onResolve === 'function') {\n                nextValue = handler.onResolve(nextValue);\n              }\n            } else if (typeof handler.onReject === 'function') {\n              nextValue = handler.onReject(nextValue);\n              nextStatus = STATUS_RESOLVED;\n              if (handler.thisPromise._unhandledRejection) {\n                this.removeUnhandeledRejection(handler.thisPromise);\n              }\n            }\n          } catch (ex) {\n            nextStatus = STATUS_REJECTED;\n            nextValue = ex;\n          }\n          handler.nextPromise._updateStatus(nextStatus, nextValue);\n          if (Date.now() >= timeoutAt) {\n            break;\n          }\n        }\n        if (this.handlers.length > 0) {\n          setTimeout(this.runHandlers.bind(this), 0);\n          return;\n        }\n        this.running = false;\n      },\n      addUnhandledRejection: function addUnhandledRejection(promise) {\n        this.unhandledRejections.push({\n          promise: promise,\n          time: Date.now()\n        });\n        this.scheduleRejectionCheck();\n      },\n      removeUnhandeledRejection: function removeUnhandeledRejection(promise) {\n        promise._unhandledRejection = false;\n        for (var i = 0; i < this.unhandledRejections.length; i++) {\n          if (this.unhandledRejections[i].promise === promise) {\n            this.unhandledRejections.splice(i);\n            i--;\n          }\n        }\n      },\n      scheduleRejectionCheck: function scheduleRejectionCheck() {\n        var _this = this;\n\n        if (this.pendingRejectionCheck) {\n          return;\n        }\n        this.pendingRejectionCheck = true;\n        setTimeout(function () {\n          _this.pendingRejectionCheck = false;\n          var now = Date.now();\n          for (var i = 0; i < _this.unhandledRejections.length; i++) {\n            if (now - _this.unhandledRejections[i].time > REJECTION_TIMEOUT) {\n              var unhandled = _this.unhandledRejections[i].promise._value;\n              var msg = 'Unhandled rejection: ' + unhandled;\n              if (unhandled.stack) {\n                msg += '\\n' + unhandled.stack;\n              }\n              try {\n                throw new Error(msg);\n              } catch (_) {\n                console.warn(msg);\n              }\n              _this.unhandledRejections.splice(i);\n              i--;\n            }\n          }\n          if (_this.unhandledRejections.length) {\n            _this.scheduleRejectionCheck();\n          }\n        }, REJECTION_TIMEOUT);\n      }\n    };\n    var Promise = function Promise(resolver) {\n      this._status = STATUS_PENDING;\n      this._handlers = [];\n      try {\n        resolver.call(this, this._resolve.bind(this), this._reject.bind(this));\n      } catch (e) {\n        this._reject(e);\n      }\n    };\n    Promise.all = function Promise_all(promises) {\n      var resolveAll, rejectAll;\n      var deferred = new Promise(function (resolve, reject) {\n        resolveAll = resolve;\n        rejectAll = reject;\n      });\n      var unresolved = promises.length;\n      var results = [];\n      if (unresolved === 0) {\n        resolveAll(results);\n        return deferred;\n      }\n      function reject(reason) {\n        if (deferred._status === STATUS_REJECTED) {\n          return;\n        }\n        results = [];\n        rejectAll(reason);\n      }\n      for (var i = 0, ii = promises.length; i < ii; ++i) {\n        var promise = promises[i];\n        var resolve = function (i) {\n          return function (value) {\n            if (deferred._status === STATUS_REJECTED) {\n              return;\n            }\n            results[i] = value;\n            unresolved--;\n            if (unresolved === 0) {\n              resolveAll(results);\n            }\n          };\n        }(i);\n        if (Promise.isPromise(promise)) {\n          promise.then(resolve, reject);\n        } else {\n          resolve(promise);\n        }\n      }\n      return deferred;\n    };\n    Promise.isPromise = function Promise_isPromise(value) {\n      return value && typeof value.then === 'function';\n    };\n    Promise.resolve = function Promise_resolve(value) {\n      return new Promise(function (resolve) {\n        resolve(value);\n      });\n    };\n    Promise.reject = function Promise_reject(reason) {\n      return new Promise(function (resolve, reject) {\n        reject(reason);\n      });\n    };\n    Promise.prototype = {\n      _status: null,\n      _value: null,\n      _handlers: null,\n      _unhandledRejection: null,\n      _updateStatus: function Promise__updateStatus(status, value) {\n        if (this._status === STATUS_RESOLVED || this._status === STATUS_REJECTED) {\n          return;\n        }\n        if (status === STATUS_RESOLVED && Promise.isPromise(value)) {\n          value.then(this._updateStatus.bind(this, STATUS_RESOLVED), this._updateStatus.bind(this, STATUS_REJECTED));\n          return;\n        }\n        this._status = status;\n        this._value = value;\n        if (status === STATUS_REJECTED && this._handlers.length === 0) {\n          this._unhandledRejection = true;\n          HandlerManager.addUnhandledRejection(this);\n        }\n        HandlerManager.scheduleHandlers(this);\n      },\n      _resolve: function Promise_resolve(value) {\n        this._updateStatus(STATUS_RESOLVED, value);\n      },\n      _reject: function Promise_reject(reason) {\n        this._updateStatus(STATUS_REJECTED, reason);\n      },\n      then: function Promise_then(onResolve, onReject) {\n        var nextPromise = new Promise(function (resolve, reject) {\n          this.resolve = resolve;\n          this.reject = reject;\n        });\n        this._handlers.push({\n          thisPromise: this,\n          onResolve: onResolve,\n          onReject: onReject,\n          nextPromise: nextPromise\n        });\n        HandlerManager.scheduleHandlers(this);\n        return nextPromise;\n      },\n      catch: function Promise_catch(onReject) {\n        return this.then(undefined, onReject);\n      }\n    };\n    globalScope.Promise = Promise;\n  })();\n  (function checkWeakMap() {\n    if (globalScope.WeakMap) {\n      return;\n    }\n    var id = 0;\n    function WeakMap() {\n      this.id = '$weakmap' + id++;\n    }\n    WeakMap.prototype = {\n      has: function has(obj) {\n        if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object' && typeof obj !== 'function' || obj === null) {\n          return false;\n        }\n        return !!Object.getOwnPropertyDescriptor(obj, this.id);\n      },\n      get: function get(obj) {\n        return this.has(obj) ? obj[this.id] : undefined;\n      },\n      set: function set(obj, value) {\n        Object.defineProperty(obj, this.id, {\n          value: value,\n          enumerable: false,\n          configurable: true\n        });\n      },\n      delete: function _delete(obj) {\n        delete obj[this.id];\n      }\n    };\n    globalScope.WeakMap = WeakMap;\n  })();\n  (function checkURLConstructor() {\n    var hasWorkingUrl = false;\n    try {\n      if (typeof URL === 'function' && _typeof(URL.prototype) === 'object' && 'origin' in URL.prototype) {\n        var u = new URL('b', 'http://a');\n        u.pathname = 'c%20d';\n        hasWorkingUrl = u.href === 'http://a/c%20d';\n      }\n    } catch (e) {}\n    if (hasWorkingUrl) {\n      return;\n    }\n    var relative = Object.create(null);\n    relative['ftp'] = 21;\n    relative['file'] = 0;\n    relative['gopher'] = 70;\n    relative['http'] = 80;\n    relative['https'] = 443;\n    relative['ws'] = 80;\n    relative['wss'] = 443;\n    var relativePathDotMapping = Object.create(null);\n    relativePathDotMapping['%2e'] = '.';\n    relativePathDotMapping['.%2e'] = '..';\n    relativePathDotMapping['%2e.'] = '..';\n    relativePathDotMapping['%2e%2e'] = '..';\n    function isRelativeScheme(scheme) {\n      return relative[scheme] !== undefined;\n    }\n    function invalid() {\n      clear.call(this);\n      this._isInvalid = true;\n    }\n    function IDNAToASCII(h) {\n      if (h === '') {\n        invalid.call(this);\n      }\n      return h.toLowerCase();\n    }\n    function percentEscape(c) {\n      var unicode = c.charCodeAt(0);\n      if (unicode > 0x20 && unicode < 0x7F && [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) === -1) {\n        return c;\n      }\n      return encodeURIComponent(c);\n    }\n    function percentEscapeQuery(c) {\n      var unicode = c.charCodeAt(0);\n      if (unicode > 0x20 && unicode < 0x7F && [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) === -1) {\n        return c;\n      }\n      return encodeURIComponent(c);\n    }\n    var EOF,\n        ALPHA = /[a-zA-Z]/,\n        ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n    function parse(input, stateOverride, base) {\n      function err(message) {\n        errors.push(message);\n      }\n      var state = stateOverride || 'scheme start',\n          cursor = 0,\n          buffer = '',\n          seenAt = false,\n          seenBracket = false,\n          errors = [];\n      loop: while ((input[cursor - 1] !== EOF || cursor === 0) && !this._isInvalid) {\n        var c = input[cursor];\n        switch (state) {\n          case 'scheme start':\n            if (c && ALPHA.test(c)) {\n              buffer += c.toLowerCase();\n              state = 'scheme';\n            } else if (!stateOverride) {\n              buffer = '';\n              state = 'no scheme';\n              continue;\n            } else {\n              err('Invalid scheme.');\n              break loop;\n            }\n            break;\n          case 'scheme':\n            if (c && ALPHANUMERIC.test(c)) {\n              buffer += c.toLowerCase();\n            } else if (c === ':') {\n              this._scheme = buffer;\n              buffer = '';\n              if (stateOverride) {\n                break loop;\n              }\n              if (isRelativeScheme(this._scheme)) {\n                this._isRelative = true;\n              }\n              if (this._scheme === 'file') {\n                state = 'relative';\n              } else if (this._isRelative && base && base._scheme === this._scheme) {\n                state = 'relative or authority';\n              } else if (this._isRelative) {\n                state = 'authority first slash';\n              } else {\n                state = 'scheme data';\n              }\n            } else if (!stateOverride) {\n              buffer = '';\n              cursor = 0;\n              state = 'no scheme';\n              continue;\n            } else if (c === EOF) {\n              break loop;\n            } else {\n              err('Code point not allowed in scheme: ' + c);\n              break loop;\n            }\n            break;\n          case 'scheme data':\n            if (c === '?') {\n              this._query = '?';\n              state = 'query';\n            } else if (c === '#') {\n              this._fragment = '#';\n              state = 'fragment';\n            } else {\n              if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n                this._schemeData += percentEscape(c);\n              }\n            }\n            break;\n          case 'no scheme':\n            if (!base || !isRelativeScheme(base._scheme)) {\n              err('Missing scheme.');\n              invalid.call(this);\n            } else {\n              state = 'relative';\n              continue;\n            }\n            break;\n          case 'relative or authority':\n            if (c === '/' && input[cursor + 1] === '/') {\n              state = 'authority ignore slashes';\n            } else {\n              err('Expected /, got: ' + c);\n              state = 'relative';\n              continue;\n            }\n            break;\n          case 'relative':\n            this._isRelative = true;\n            if (this._scheme !== 'file') {\n              this._scheme = base._scheme;\n            }\n            if (c === EOF) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._query = base._query;\n              this._username = base._username;\n              this._password = base._password;\n              break loop;\n            } else if (c === '/' || c === '\\\\') {\n              if (c === '\\\\') {\n                err('\\\\ is an invalid code point.');\n              }\n              state = 'relative slash';\n            } else if (c === '?') {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._query = '?';\n              this._username = base._username;\n              this._password = base._password;\n              state = 'query';\n            } else if (c === '#') {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._query = base._query;\n              this._fragment = '#';\n              this._username = base._username;\n              this._password = base._password;\n              state = 'fragment';\n            } else {\n              var nextC = input[cursor + 1];\n              var nextNextC = input[cursor + 2];\n              if (this._scheme !== 'file' || !ALPHA.test(c) || nextC !== ':' && nextC !== '|' || nextNextC !== EOF && nextNextC !== '/' && nextNextC !== '\\\\' && nextNextC !== '?' && nextNextC !== '#') {\n                this._host = base._host;\n                this._port = base._port;\n                this._username = base._username;\n                this._password = base._password;\n                this._path = base._path.slice();\n                this._path.pop();\n              }\n              state = 'relative path';\n              continue;\n            }\n            break;\n          case 'relative slash':\n            if (c === '/' || c === '\\\\') {\n              if (c === '\\\\') {\n                err('\\\\ is an invalid code point.');\n              }\n              if (this._scheme === 'file') {\n                state = 'file host';\n              } else {\n                state = 'authority ignore slashes';\n              }\n            } else {\n              if (this._scheme !== 'file') {\n                this._host = base._host;\n                this._port = base._port;\n                this._username = base._username;\n                this._password = base._password;\n              }\n              state = 'relative path';\n              continue;\n            }\n            break;\n          case 'authority first slash':\n            if (c === '/') {\n              state = 'authority second slash';\n            } else {\n              err('Expected \\'/\\', got: ' + c);\n              state = 'authority ignore slashes';\n              continue;\n            }\n            break;\n          case 'authority second slash':\n            state = 'authority ignore slashes';\n            if (c !== '/') {\n              err('Expected \\'/\\', got: ' + c);\n              continue;\n            }\n            break;\n          case 'authority ignore slashes':\n            if (c !== '/' && c !== '\\\\') {\n              state = 'authority';\n              continue;\n            } else {\n              err('Expected authority, got: ' + c);\n            }\n            break;\n          case 'authority':\n            if (c === '@') {\n              if (seenAt) {\n                err('@ already seen.');\n                buffer += '%40';\n              }\n              seenAt = true;\n              for (var i = 0; i < buffer.length; i++) {\n                var cp = buffer[i];\n                if (cp === '\\t' || cp === '\\n' || cp === '\\r') {\n                  err('Invalid whitespace in authority.');\n                  continue;\n                }\n                if (cp === ':' && this._password === null) {\n                  this._password = '';\n                  continue;\n                }\n                var tempC = percentEscape(cp);\n                if (this._password !== null) {\n                  this._password += tempC;\n                } else {\n                  this._username += tempC;\n                }\n              }\n              buffer = '';\n            } else if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#') {\n              cursor -= buffer.length;\n              buffer = '';\n              state = 'host';\n              continue;\n            } else {\n              buffer += c;\n            }\n            break;\n          case 'file host':\n            if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#') {\n              if (buffer.length === 2 && ALPHA.test(buffer[0]) && (buffer[1] === ':' || buffer[1] === '|')) {\n                state = 'relative path';\n              } else if (buffer.length === 0) {\n                state = 'relative path start';\n              } else {\n                this._host = IDNAToASCII.call(this, buffer);\n                buffer = '';\n                state = 'relative path start';\n              }\n              continue;\n            } else if (c === '\\t' || c === '\\n' || c === '\\r') {\n              err('Invalid whitespace in file host.');\n            } else {\n              buffer += c;\n            }\n            break;\n          case 'host':\n          case 'hostname':\n            if (c === ':' && !seenBracket) {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'port';\n              if (stateOverride === 'hostname') {\n                break loop;\n              }\n            } else if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#') {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n              if (stateOverride) {\n                break loop;\n              }\n              continue;\n            } else if (c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              if (c === '[') {\n                seenBracket = true;\n              } else if (c === ']') {\n                seenBracket = false;\n              }\n              buffer += c;\n            } else {\n              err('Invalid code point in host/hostname: ' + c);\n            }\n            break;\n          case 'port':\n            if (/[0-9]/.test(c)) {\n              buffer += c;\n            } else if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#' || stateOverride) {\n              if (buffer !== '') {\n                var temp = parseInt(buffer, 10);\n                if (temp !== relative[this._scheme]) {\n                  this._port = temp + '';\n                }\n                buffer = '';\n              }\n              if (stateOverride) {\n                break loop;\n              }\n              state = 'relative path start';\n              continue;\n            } else if (c === '\\t' || c === '\\n' || c === '\\r') {\n              err('Invalid code point in port: ' + c);\n            } else {\n              invalid.call(this);\n            }\n            break;\n          case 'relative path start':\n            if (c === '\\\\') {\n              err('\\'\\\\\\' not allowed in path.');\n            }\n            state = 'relative path';\n            if (c !== '/' && c !== '\\\\') {\n              continue;\n            }\n            break;\n          case 'relative path':\n            if (c === EOF || c === '/' || c === '\\\\' || !stateOverride && (c === '?' || c === '#')) {\n              if (c === '\\\\') {\n                err('\\\\ not allowed in relative path.');\n              }\n              var tmp;\n              if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n                buffer = tmp;\n              }\n              if (buffer === '..') {\n                this._path.pop();\n                if (c !== '/' && c !== '\\\\') {\n                  this._path.push('');\n                }\n              } else if (buffer === '.' && c !== '/' && c !== '\\\\') {\n                this._path.push('');\n              } else if (buffer !== '.') {\n                if (this._scheme === 'file' && this._path.length === 0 && buffer.length === 2 && ALPHA.test(buffer[0]) && buffer[1] === '|') {\n                  buffer = buffer[0] + ':';\n                }\n                this._path.push(buffer);\n              }\n              buffer = '';\n              if (c === '?') {\n                this._query = '?';\n                state = 'query';\n              } else if (c === '#') {\n                this._fragment = '#';\n                state = 'fragment';\n              }\n            } else if (c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              buffer += percentEscape(c);\n            }\n            break;\n          case 'query':\n            if (!stateOverride && c === '#') {\n              this._fragment = '#';\n              state = 'fragment';\n            } else if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              this._query += percentEscapeQuery(c);\n            }\n            break;\n          case 'fragment':\n            if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              this._fragment += c;\n            }\n            break;\n        }\n        cursor++;\n      }\n    }\n    function clear() {\n      this._scheme = '';\n      this._schemeData = '';\n      this._username = '';\n      this._password = null;\n      this._host = '';\n      this._port = '';\n      this._path = [];\n      this._query = '';\n      this._fragment = '';\n      this._isInvalid = false;\n      this._isRelative = false;\n    }\n    function JURL(url, base) {\n      if (base !== undefined && !(base instanceof JURL)) {\n        base = new JURL(String(base));\n      }\n      this._url = url;\n      clear.call(this);\n      var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n      parse.call(this, input, null, base);\n    }\n    JURL.prototype = {\n      toString: function toString() {\n        return this.href;\n      },\n\n      get href() {\n        if (this._isInvalid) {\n          return this._url;\n        }\n        var authority = '';\n        if (this._username !== '' || this._password !== null) {\n          authority = this._username + (this._password !== null ? ':' + this._password : '') + '@';\n        }\n        return this.protocol + (this._isRelative ? '//' + authority + this.host : '') + this.pathname + this._query + this._fragment;\n      },\n      set href(value) {\n        clear.call(this);\n        parse.call(this, value);\n      },\n      get protocol() {\n        return this._scheme + ':';\n      },\n      set protocol(value) {\n        if (this._isInvalid) {\n          return;\n        }\n        parse.call(this, value + ':', 'scheme start');\n      },\n      get host() {\n        return this._isInvalid ? '' : this._port ? this._host + ':' + this._port : this._host;\n      },\n      set host(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        parse.call(this, value, 'host');\n      },\n      get hostname() {\n        return this._host;\n      },\n      set hostname(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        parse.call(this, value, 'hostname');\n      },\n      get port() {\n        return this._port;\n      },\n      set port(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        parse.call(this, value, 'port');\n      },\n      get pathname() {\n        return this._isInvalid ? '' : this._isRelative ? '/' + this._path.join('/') : this._schemeData;\n      },\n      set pathname(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        this._path = [];\n        parse.call(this, value, 'relative path start');\n      },\n      get search() {\n        return this._isInvalid || !this._query || this._query === '?' ? '' : this._query;\n      },\n      set search(value) {\n        if (this._isInvalid || !this._isRelative) {\n          return;\n        }\n        this._query = '?';\n        if (value[0] === '?') {\n          value = value.slice(1);\n        }\n        parse.call(this, value, 'query');\n      },\n      get hash() {\n        return this._isInvalid || !this._fragment || this._fragment === '#' ? '' : this._fragment;\n      },\n      set hash(value) {\n        if (this._isInvalid) {\n          return;\n        }\n        this._fragment = '#';\n        if (value[0] === '#') {\n          value = value.slice(1);\n        }\n        parse.call(this, value, 'fragment');\n      },\n      get origin() {\n        var host;\n        if (this._isInvalid || !this._scheme) {\n          return '';\n        }\n        switch (this._scheme) {\n          case 'data':\n          case 'file':\n          case 'javascript':\n          case 'mailto':\n            return 'null';\n          case 'blob':\n            try {\n              return new JURL(this._schemeData).origin || 'null';\n            } catch (_) {}\n            return 'null';\n        }\n        host = this.host;\n        if (!host) {\n          return '';\n        }\n        return this._scheme + '://' + host;\n      }\n    };\n    var OriginalURL = globalScope.URL;\n    if (OriginalURL) {\n      JURL.createObjectURL = function (blob) {\n        return OriginalURL.createObjectURL.apply(OriginalURL, arguments);\n      };\n      JURL.revokeObjectURL = function (url) {\n        OriginalURL.revokeObjectURL(url);\n      };\n    }\n    globalScope.URL = JURL;\n  })();\n}\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar isReadableStreamSupported = false;\nif (typeof ReadableStream !== 'undefined') {\n  try {\n    new ReadableStream({\n      start: function start(controller) {\n        controller.close();\n      }\n    });\n    isReadableStreamSupported = true;\n  } catch (e) {}\n}\nif (isReadableStreamSupported) {\n  exports.ReadableStream = ReadableStream;\n} else {\n  exports.ReadableStream = __w_pdfjs_require__(18).ReadableStream;\n}\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=pdf.worker.js.map"
  },
  {
    "path": "pages/include/revealjs/reveal.css",
    "content": "/*!\n* reveal.js 4.0.2\n* https://revealjs.com\n* MIT licensed\n*\n* Copyright (C) 2020 Hakim El Hattab, https://hakim.se\n*/\n.reveal .r-stretch,.reveal .stretch{max-width:none;max-height:none}.reveal pre.r-stretch code,.reveal pre.stretch code{height:100%;max-height:100%;box-sizing:border-box}.reveal .r-fit-text{display:inline-block;white-space:nowrap}.reveal .r-stack{display:grid}.reveal .r-stack>*{grid-area:1/1;margin:auto}.reveal .r-hstack,.reveal .r-vstack{display:flex}.reveal .r-hstack img,.reveal .r-hstack video,.reveal .r-vstack img,.reveal .r-vstack video{min-width:0;min-height:0;-o-object-fit:contain;object-fit:contain}.reveal .r-vstack{flex-direction:column;align-items:center;justify-content:center}.reveal .r-hstack{flex-direction:row;align-items:center;justify-content:center}.reveal .items-stretch{align-items:stretch}.reveal .items-start{align-items:flex-start}.reveal .items-center{align-items:center}.reveal .items-end{align-items:flex-end}.reveal .justify-between{justify-content:space-between}.reveal .justify-around{justify-content:space-around}.reveal .justify-start{justify-content:flex-start}.reveal .justify-center{justify-content:center}.reveal .justify-end{justify-content:flex-end}html.reveal-full-page{width:100%;height:100%;height:100vh;height:calc(var(--vh,1vh) * 100);overflow:hidden}.reveal-viewport{height:100%;overflow:hidden;position:relative;line-height:1;margin:0;background-color:#fff;color:#000}.reveal .slides section .fragment{opacity:0;visibility:hidden;transition:all .2s ease;will-change:opacity}.reveal .slides section .fragment.visible{opacity:1;visibility:inherit}.reveal .slides section .fragment.disabled{transition:none}.reveal .slides section .fragment.grow{opacity:1;visibility:inherit}.reveal .slides section .fragment.grow.visible{transform:scale(1.3)}.reveal .slides section .fragment.shrink{opacity:1;visibility:inherit}.reveal .slides section .fragment.shrink.visible{transform:scale(.7)}.reveal .slides section .fragment.zoom-in{transform:scale(.1)}.reveal .slides section .fragment.zoom-in.visible{transform:none}.reveal .slides section .fragment.fade-out{opacity:1;visibility:inherit}.reveal .slides section .fragment.fade-out.visible{opacity:0;visibility:hidden}.reveal .slides section .fragment.semi-fade-out{opacity:1;visibility:inherit}.reveal .slides section .fragment.semi-fade-out.visible{opacity:.5;visibility:inherit}.reveal .slides section .fragment.strike{opacity:1;visibility:inherit}.reveal .slides section .fragment.strike.visible{text-decoration:line-through}.reveal .slides section .fragment.fade-up{transform:translate(0,40px)}.reveal .slides section .fragment.fade-up.visible{transform:translate(0,0)}.reveal .slides section .fragment.fade-down{transform:translate(0,-40px)}.reveal .slides section .fragment.fade-down.visible{transform:translate(0,0)}.reveal .slides section .fragment.fade-right{transform:translate(-40px,0)}.reveal .slides section .fragment.fade-right.visible{transform:translate(0,0)}.reveal .slides section .fragment.fade-left{transform:translate(40px,0)}.reveal .slides section .fragment.fade-left.visible{transform:translate(0,0)}.reveal .slides section .fragment.current-visible,.reveal .slides section .fragment.fade-in-then-out{opacity:0;visibility:hidden}.reveal .slides section .fragment.current-visible.current-fragment,.reveal .slides section .fragment.fade-in-then-out.current-fragment{opacity:1;visibility:inherit}.reveal .slides section .fragment.fade-in-then-semi-out{opacity:0;visibility:hidden}.reveal .slides section .fragment.fade-in-then-semi-out.visible{opacity:.5;visibility:inherit}.reveal .slides section .fragment.fade-in-then-semi-out.current-fragment{opacity:1;visibility:inherit}.reveal .slides section .fragment.highlight-blue,.reveal .slides section .fragment.highlight-current-blue,.reveal .slides section .fragment.highlight-current-green,.reveal .slides section .fragment.highlight-current-red,.reveal .slides section .fragment.highlight-green,.reveal .slides section .fragment.highlight-red{opacity:1;visibility:inherit}.reveal .slides section .fragment.highlight-red.visible{color:#ff2c2d}.reveal .slides section .fragment.highlight-green.visible{color:#17ff2e}.reveal .slides section .fragment.highlight-blue.visible{color:#1b91ff}.reveal .slides section .fragment.highlight-current-red.current-fragment{color:#ff2c2d}.reveal .slides section .fragment.highlight-current-green.current-fragment{color:#17ff2e}.reveal .slides section .fragment.highlight-current-blue.current-fragment{color:#1b91ff}.reveal:after{content:'';font-style:italic}.reveal iframe{z-index:1}.reveal a{position:relative}@keyframes bounce-right{0%,10%,25%,40%,50%{transform:translateX(0)}20%{transform:translateX(10px)}30%{transform:translateX(-5px)}}@keyframes bounce-left{0%,10%,25%,40%,50%{transform:translateX(0)}20%{transform:translateX(-10px)}30%{transform:translateX(5px)}}@keyframes bounce-down{0%,10%,25%,40%,50%{transform:translateY(0)}20%{transform:translateY(10px)}30%{transform:translateY(-5px)}}.reveal .controls{display:none;position:absolute;top:auto;bottom:12px;right:12px;left:auto;z-index:11;color:#000;pointer-events:none;font-size:10px}.reveal .controls button{position:absolute;padding:0;background-color:transparent;border:0;outline:0;cursor:pointer;color:currentColor;transform:scale(.9999);transition:color .2s ease,opacity .2s ease,transform .2s ease;z-index:2;pointer-events:auto;font-size:inherit;visibility:hidden;opacity:0;-webkit-appearance:none;-webkit-tap-highlight-color:transparent}.reveal .controls .controls-arrow:after,.reveal .controls .controls-arrow:before{content:'';position:absolute;top:0;left:0;width:2.6em;height:.5em;border-radius:.25em;background-color:currentColor;transition:all .15s ease,background-color .8s ease;transform-origin:.2em 50%;will-change:transform}.reveal .controls .controls-arrow{position:relative;width:3.6em;height:3.6em}.reveal .controls .controls-arrow:before{transform:translateX(.5em) translateY(1.55em) rotate(45deg)}.reveal .controls .controls-arrow:after{transform:translateX(.5em) translateY(1.55em) rotate(-45deg)}.reveal .controls .controls-arrow:hover:before{transform:translateX(.5em) translateY(1.55em) rotate(40deg)}.reveal .controls .controls-arrow:hover:after{transform:translateX(.5em) translateY(1.55em) rotate(-40deg)}.reveal .controls .controls-arrow:active:before{transform:translateX(.5em) translateY(1.55em) rotate(36deg)}.reveal .controls .controls-arrow:active:after{transform:translateX(.5em) translateY(1.55em) rotate(-36deg)}.reveal .controls .navigate-left{right:6.4em;bottom:3.2em;transform:translateX(-10px)}.reveal .controls .navigate-left.highlight{animation:bounce-left 2s 50 both ease-out}.reveal .controls .navigate-right{right:0;bottom:3.2em;transform:translateX(10px)}.reveal .controls .navigate-right .controls-arrow{transform:rotate(180deg)}.reveal .controls .navigate-right.highlight{animation:bounce-right 2s 50 both ease-out}.reveal .controls .navigate-up{right:3.2em;bottom:6.4em;transform:translateY(-10px)}.reveal .controls .navigate-up .controls-arrow{transform:rotate(90deg)}.reveal .controls .navigate-down{right:3.2em;bottom:-1.4em;padding-bottom:1.4em;transform:translateY(10px)}.reveal .controls .navigate-down .controls-arrow{transform:rotate(-90deg)}.reveal .controls .navigate-down.highlight{animation:bounce-down 2s 50 both ease-out}.reveal .controls[data-controls-back-arrows=faded] .navigate-up.enabled{opacity:.3}.reveal .controls[data-controls-back-arrows=faded] .navigate-up.enabled:hover{opacity:1}.reveal .controls[data-controls-back-arrows=hidden] .navigate-up.enabled{opacity:0;visibility:hidden}.reveal .controls .enabled{visibility:visible;opacity:.9;cursor:pointer;transform:none}.reveal .controls .enabled.fragmented{opacity:.5}.reveal .controls .enabled.fragmented:hover,.reveal .controls .enabled:hover{opacity:1}.reveal:not(.rtl) .controls[data-controls-back-arrows=faded] .navigate-left.enabled{opacity:.3}.reveal:not(.rtl) .controls[data-controls-back-arrows=faded] .navigate-left.enabled:hover{opacity:1}.reveal:not(.rtl) .controls[data-controls-back-arrows=hidden] .navigate-left.enabled{opacity:0;visibility:hidden}.reveal.rtl .controls[data-controls-back-arrows=faded] .navigate-right.enabled{opacity:.3}.reveal.rtl .controls[data-controls-back-arrows=faded] .navigate-right.enabled:hover{opacity:1}.reveal.rtl .controls[data-controls-back-arrows=hidden] .navigate-right.enabled{opacity:0;visibility:hidden}.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-down,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-up{display:none}.reveal:not(.has-vertical-slides) .controls .navigate-left,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-left{bottom:1.4em;right:5.5em}.reveal:not(.has-vertical-slides) .controls .navigate-right,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-right{bottom:1.4em;right:.5em}.reveal:not(.has-horizontal-slides) .controls .navigate-up{right:1.4em;bottom:5em}.reveal:not(.has-horizontal-slides) .controls .navigate-down{right:1.4em;bottom:.5em}.reveal.has-dark-background .controls{color:#fff}.reveal.has-light-background .controls{color:#000}.reveal.no-hover .controls .controls-arrow:active:before,.reveal.no-hover .controls .controls-arrow:hover:before{transform:translateX(.5em) translateY(1.55em) rotate(45deg)}.reveal.no-hover .controls .controls-arrow:active:after,.reveal.no-hover .controls .controls-arrow:hover:after{transform:translateX(.5em) translateY(1.55em) rotate(-45deg)}@media screen and (min-width:500px){.reveal .controls[data-controls-layout=edges]{top:0;right:0;bottom:0;left:0}.reveal .controls[data-controls-layout=edges] .navigate-down,.reveal .controls[data-controls-layout=edges] .navigate-left,.reveal .controls[data-controls-layout=edges] .navigate-right,.reveal .controls[data-controls-layout=edges] .navigate-up{bottom:auto;right:auto}.reveal .controls[data-controls-layout=edges] .navigate-left{top:50%;left:.8em;margin-top:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-right{top:50%;right:.8em;margin-top:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-up{top:.8em;left:50%;margin-left:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-down{bottom:-.3em;left:50%;margin-left:-1.8em}}.reveal .progress{position:absolute;display:none;height:3px;width:100%;bottom:0;left:0;z-index:10;background-color:rgba(0,0,0,.2);color:#fff}.reveal .progress:after{content:'';display:block;position:absolute;height:10px;width:100%;top:-10px}.reveal .progress span{display:block;height:100%;width:100%;background-color:currentColor;transition:transform .8s cubic-bezier(.26,.86,.44,.985);transform-origin:0 0;transform:scaleX(0)}.reveal .slide-number{position:absolute;display:block;right:8px;bottom:8px;z-index:31;font-family:Helvetica,sans-serif;font-size:12px;line-height:1;color:#fff;background-color:rgba(0,0,0,.4);padding:5px}.reveal .slide-number a{color:currentColor}.reveal .slide-number-delimiter{margin:0 3px}.reveal{position:relative;width:100%;height:100%;overflow:hidden;touch-action:pinch-zoom}.reveal.embedded{touch-action:pan-y}.reveal .slides{position:absolute;width:100%;height:100%;top:0;right:0;bottom:0;left:0;margin:auto;pointer-events:none;overflow:visible;z-index:1;text-align:center;perspective:600px;perspective-origin:50% 40%}.reveal .slides>section{perspective:600px}.reveal .slides>section,.reveal .slides>section>section{display:none;position:absolute;width:100%;pointer-events:auto;z-index:10;transform-style:flat;transition:transform-origin .8s cubic-bezier(.26,.86,.44,.985),transform .8s cubic-bezier(.26,.86,.44,.985),visibility .8s cubic-bezier(.26,.86,.44,.985),opacity .8s cubic-bezier(.26,.86,.44,.985)}.reveal[data-transition-speed=fast] .slides section{transition-duration:.4s}.reveal[data-transition-speed=slow] .slides section{transition-duration:1.2s}.reveal .slides section[data-transition-speed=fast]{transition-duration:.4s}.reveal .slides section[data-transition-speed=slow]{transition-duration:1.2s}.reveal .slides>section.stack{padding-top:0;padding-bottom:0;pointer-events:none;height:100%}.reveal .slides>section.present,.reveal .slides>section>section.present{display:block;z-index:11;opacity:1}.reveal .slides>section:empty,.reveal .slides>section>section:empty,.reveal .slides>section>section[data-background-interactive],.reveal .slides>section[data-background-interactive]{pointer-events:none}.reveal.center,.reveal.center .slides,.reveal.center .slides section{min-height:0!important}.reveal .slides>section:not(.present),.reveal .slides>section>section:not(.present){pointer-events:none}.reveal.overview .slides>section,.reveal.overview .slides>section>section{pointer-events:auto}.reveal .slides>section.future,.reveal .slides>section.past,.reveal .slides>section>section.future,.reveal .slides>section>section.past{opacity:0}.reveal.slide section{-webkit-backface-visibility:hidden;backface-visibility:hidden}.reveal .slides>section[data-transition=slide].past,.reveal .slides>section[data-transition~=slide-out].past,.reveal.slide .slides>section:not([data-transition]).past{transform:translate(-150%,0)}.reveal .slides>section[data-transition=slide].future,.reveal .slides>section[data-transition~=slide-in].future,.reveal.slide .slides>section:not([data-transition]).future{transform:translate(150%,0)}.reveal .slides>section>section[data-transition=slide].past,.reveal .slides>section>section[data-transition~=slide-out].past,.reveal.slide .slides>section>section:not([data-transition]).past{transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=slide].future,.reveal .slides>section>section[data-transition~=slide-in].future,.reveal.slide .slides>section>section:not([data-transition]).future{transform:translate(0,150%)}.reveal.linear section{-webkit-backface-visibility:hidden;backface-visibility:hidden}.reveal .slides>section[data-transition=linear].past,.reveal .slides>section[data-transition~=linear-out].past,.reveal.linear .slides>section:not([data-transition]).past{transform:translate(-150%,0)}.reveal .slides>section[data-transition=linear].future,.reveal .slides>section[data-transition~=linear-in].future,.reveal.linear .slides>section:not([data-transition]).future{transform:translate(150%,0)}.reveal .slides>section>section[data-transition=linear].past,.reveal .slides>section>section[data-transition~=linear-out].past,.reveal.linear .slides>section>section:not([data-transition]).past{transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=linear].future,.reveal .slides>section>section[data-transition~=linear-in].future,.reveal.linear .slides>section>section:not([data-transition]).future{transform:translate(0,150%)}.reveal .slides section[data-transition=default].stack,.reveal.default .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=default].past,.reveal .slides>section[data-transition~=default-out].past,.reveal.default .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=default].future,.reveal .slides>section[data-transition~=default-in].future,.reveal.default .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=default].past,.reveal .slides>section>section[data-transition~=default-out].past,.reveal.default .slides>section>section:not([data-transition]).past{transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=default].future,.reveal .slides>section>section[data-transition~=default-in].future,.reveal.default .slides>section>section:not([data-transition]).future{transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides section[data-transition=convex].stack,.reveal.convex .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=convex].past,.reveal .slides>section[data-transition~=convex-out].past,.reveal.convex .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=convex].future,.reveal .slides>section[data-transition~=convex-in].future,.reveal.convex .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=convex].past,.reveal .slides>section>section[data-transition~=convex-out].past,.reveal.convex .slides>section>section:not([data-transition]).past{transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=convex].future,.reveal .slides>section>section[data-transition~=convex-in].future,.reveal.convex .slides>section>section:not([data-transition]).future{transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides section[data-transition=concave].stack,.reveal.concave .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=concave].past,.reveal .slides>section[data-transition~=concave-out].past,.reveal.concave .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=concave].future,.reveal .slides>section[data-transition~=concave-in].future,.reveal.concave .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=concave].past,.reveal .slides>section>section[data-transition~=concave-out].past,.reveal.concave .slides>section>section:not([data-transition]).past{transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0)}.reveal .slides>section>section[data-transition=concave].future,.reveal .slides>section>section[data-transition~=concave-in].future,.reveal.concave .slides>section>section:not([data-transition]).future{transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0)}.reveal .slides section[data-transition=zoom],.reveal.zoom .slides section:not([data-transition]){transition-timing-function:ease}.reveal .slides>section[data-transition=zoom].past,.reveal .slides>section[data-transition~=zoom-out].past,.reveal.zoom .slides>section:not([data-transition]).past{visibility:hidden;transform:scale(16)}.reveal .slides>section[data-transition=zoom].future,.reveal .slides>section[data-transition~=zoom-in].future,.reveal.zoom .slides>section:not([data-transition]).future{visibility:hidden;transform:scale(.2)}.reveal .slides>section>section[data-transition=zoom].past,.reveal .slides>section>section[data-transition~=zoom-out].past,.reveal.zoom .slides>section>section:not([data-transition]).past{transform:scale(16)}.reveal .slides>section>section[data-transition=zoom].future,.reveal .slides>section>section[data-transition~=zoom-in].future,.reveal.zoom .slides>section>section:not([data-transition]).future{transform:scale(.2)}.reveal.cube .slides{perspective:1300px}.reveal.cube .slides section{padding:30px;min-height:700px;-webkit-backface-visibility:hidden;backface-visibility:hidden;box-sizing:border-box;transform-style:preserve-3d}.reveal.center.cube .slides section{min-height:0}.reveal.cube .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);border-radius:4px;transform:translateZ(-20px)}.reveal.cube .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0 0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);transform:translateZ(-90px) rotateX(65deg)}.reveal.cube .slides>section.stack{padding:0;background:0 0}.reveal.cube .slides>section.past{transform-origin:100% 0;transform:translate3d(-100%,0,0) rotateY(-90deg)}.reveal.cube .slides>section.future{transform-origin:0 0;transform:translate3d(100%,0,0) rotateY(90deg)}.reveal.cube .slides>section>section.past{transform-origin:0 100%;transform:translate3d(0,-100%,0) rotateX(90deg)}.reveal.cube .slides>section>section.future{transform-origin:0 0;transform:translate3d(0,100%,0) rotateX(-90deg)}.reveal.page .slides{perspective-origin:0 50%;perspective:3000px}.reveal.page .slides section{padding:30px;min-height:700px;box-sizing:border-box;transform-style:preserve-3d}.reveal.page .slides section.past{z-index:12}.reveal.page .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);transform:translateZ(-20px)}.reveal.page .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0 0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX(65deg)}.reveal.page .slides>section.stack{padding:0;background:0 0}.reveal.page .slides>section.past{transform-origin:0 0;transform:translate3d(-40%,0,0) rotateY(-80deg)}.reveal.page .slides>section.future{transform-origin:100% 0;transform:translate3d(0,0,0)}.reveal.page .slides>section>section.past{transform-origin:0 0;transform:translate3d(0,-40%,0) rotateX(80deg)}.reveal.page .slides>section>section.future{transform-origin:0 100%;transform:translate3d(0,0,0)}.reveal .slides section[data-transition=fade],.reveal.fade .slides section:not([data-transition]),.reveal.fade .slides>section>section:not([data-transition]){transform:none;transition:opacity .5s}.reveal.fade.overview .slides section,.reveal.fade.overview .slides>section>section{transition:none}.reveal .slides section[data-transition=none],.reveal.none .slides section:not([data-transition]){transform:none;transition:none}.reveal .pause-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:#000;visibility:hidden;opacity:0;z-index:100;transition:all 1s ease}.reveal .pause-overlay .resume-button{position:absolute;bottom:20px;right:20px;color:#ccc;border-radius:2px;padding:6px 14px;border:2px solid #ccc;font-size:16px;background:0 0;cursor:pointer}.reveal .pause-overlay .resume-button:hover{color:#fff;border-color:#fff}.reveal.paused .pause-overlay{visibility:visible;opacity:1}.reveal .no-transition,.reveal .no-transition *,.reveal .slides.disable-slide-transitions section{transition:none!important}.reveal .slides.disable-slide-transitions section{transform:none!important}.reveal .backgrounds{position:absolute;width:100%;height:100%;top:0;left:0;perspective:600px}.reveal .slide-background{display:none;position:absolute;width:100%;height:100%;opacity:0;visibility:hidden;overflow:hidden;background-color:rgba(0,0,0,0);transition:all .8s cubic-bezier(.26,.86,.44,.985)}.reveal .slide-background-content{position:absolute;width:100%;height:100%;background-position:50% 50%;background-repeat:no-repeat;background-size:cover}.reveal .slide-background.stack{display:block}.reveal .slide-background.present{opacity:1;visibility:visible;z-index:2}.print-pdf .reveal .slide-background{opacity:1!important;visibility:visible!important}.reveal .slide-background video{position:absolute;width:100%;height:100%;max-width:none;max-height:none;top:0;left:0;-o-object-fit:cover;object-fit:cover}.reveal .slide-background[data-background-size=contain] video{-o-object-fit:contain;object-fit:contain}.reveal>.backgrounds .slide-background[data-background-transition=none],.reveal[data-background-transition=none]>.backgrounds .slide-background{transition:none}.reveal>.backgrounds .slide-background[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background{opacity:1;-webkit-backface-visibility:hidden;backface-visibility:hidden}.reveal>.backgrounds .slide-background.past[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background.past{transform:translate(-100%,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background.future{transform:translate(100%,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past{transform:translate(0,-100%)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future{transform:translate(0,100%)}.reveal>.backgrounds .slide-background.past[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background.past{opacity:0;transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background.future{opacity:0;transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past{opacity:0;transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future{opacity:0;transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0)}.reveal>.backgrounds .slide-background.past[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background.past{opacity:0;transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background.future{opacity:0;transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past{opacity:0;transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future{opacity:0;transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0)}.reveal>.backgrounds .slide-background[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background{transition-timing-function:ease}.reveal>.backgrounds .slide-background.past[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past{opacity:0;visibility:hidden;transform:scale(16)}.reveal>.backgrounds .slide-background.future[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future{opacity:0;visibility:hidden;transform:scale(.2)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past{opacity:0;visibility:hidden;transform:scale(16)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future{opacity:0;visibility:hidden;transform:scale(.2)}.reveal[data-transition-speed=fast]>.backgrounds .slide-background{transition-duration:.4s}.reveal[data-transition-speed=slow]>.backgrounds .slide-background{transition-duration:1.2s}.reveal [data-auto-animate-target^=unmatched]{will-change:opacity}.reveal section[data-auto-animate]:not(.stack):not([data-auto-animate=running]) [data-auto-animate-target^=unmatched]{opacity:0}.reveal.overview{perspective-origin:50% 50%;perspective:700px}.reveal.overview .slides{-moz-transform-style:preserve-3d}.reveal.overview .slides section{height:100%;top:0!important;opacity:1!important;overflow:hidden;visibility:visible!important;cursor:pointer;box-sizing:border-box}.reveal.overview .slides section.present,.reveal.overview .slides section:hover{outline:10px solid rgba(150,150,150,.4);outline-offset:10px}.reveal.overview .slides section .fragment{opacity:1;transition:none}.reveal.overview .slides section:after,.reveal.overview .slides section:before{display:none!important}.reveal.overview .slides>section.stack{padding:0;top:0!important;background:0 0;outline:0;overflow:visible}.reveal.overview .backgrounds{perspective:inherit;-moz-transform-style:preserve-3d}.reveal.overview .backgrounds .slide-background{opacity:1;visibility:visible;outline:10px solid rgba(150,150,150,.1);outline-offset:10px}.reveal.overview .backgrounds .slide-background.stack{overflow:visible}.reveal.overview .slides section,.reveal.overview-deactivating .slides section{transition:none}.reveal.overview .backgrounds .slide-background,.reveal.overview-deactivating .backgrounds .slide-background{transition:none}.reveal.rtl .slides,.reveal.rtl .slides h1,.reveal.rtl .slides h2,.reveal.rtl .slides h3,.reveal.rtl .slides h4,.reveal.rtl .slides h5,.reveal.rtl .slides h6{direction:rtl;font-family:sans-serif}.reveal.rtl code,.reveal.rtl pre{direction:ltr}.reveal.rtl ol,.reveal.rtl ul{text-align:right}.reveal.rtl .progress span{transform-origin:100% 0}.reveal.has-parallax-background .backgrounds{transition:all .8s ease}.reveal.has-parallax-background[data-transition-speed=fast] .backgrounds{transition-duration:.4s}.reveal.has-parallax-background[data-transition-speed=slow] .backgrounds{transition-duration:1.2s}.reveal>.overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1000;background:rgba(0,0,0,.9);transition:all .3s ease}.reveal>.overlay .spinner{position:absolute;display:block;top:50%;left:50%;width:32px;height:32px;margin:-16px 0 0 -16px;z-index:10;background-image:url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D);visibility:visible;opacity:.6;transition:all .3s ease}.reveal>.overlay header{position:absolute;left:0;top:0;width:100%;padding:5px;z-index:2;box-sizing:border-box}.reveal>.overlay header a{display:inline-block;width:40px;height:40px;line-height:36px;padding:0 10px;float:right;opacity:.6;box-sizing:border-box}.reveal>.overlay header a:hover{opacity:1}.reveal>.overlay header a .icon{display:inline-block;width:20px;height:20px;background-position:50% 50%;background-size:100%;background-repeat:no-repeat}.reveal>.overlay header a.close .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC)}.reveal>.overlay header a.external .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==)}.reveal>.overlay .viewport{position:absolute;display:flex;top:50px;right:0;bottom:0;left:0}.reveal>.overlay.overlay-preview .viewport iframe{width:100%;height:100%;max-width:100%;max-height:100%;border:0;opacity:0;visibility:hidden;transition:all .3s ease}.reveal>.overlay.overlay-preview.loaded .viewport iframe{opacity:1;visibility:visible}.reveal>.overlay.overlay-preview.loaded .viewport-inner{position:absolute;z-index:-1;left:0;top:45%;width:100%;text-align:center;letter-spacing:normal}.reveal>.overlay.overlay-preview .x-frame-error{opacity:0;transition:opacity .3s ease .3s}.reveal>.overlay.overlay-preview.loaded .x-frame-error{opacity:1}.reveal>.overlay.overlay-preview.loaded .spinner{opacity:0;visibility:hidden;transform:scale(.2)}.reveal>.overlay.overlay-help .viewport{overflow:auto;color:#fff}.reveal>.overlay.overlay-help .viewport .viewport-inner{width:600px;margin:auto;padding:20px 20px 80px 20px;text-align:center;letter-spacing:normal}.reveal>.overlay.overlay-help .viewport .viewport-inner .title{font-size:20px}.reveal>.overlay.overlay-help .viewport .viewport-inner table{border:1px solid #fff;border-collapse:collapse;font-size:16px}.reveal>.overlay.overlay-help .viewport .viewport-inner table td,.reveal>.overlay.overlay-help .viewport .viewport-inner table th{width:200px;padding:14px;border:1px solid #fff;vertical-align:middle}.reveal>.overlay.overlay-help .viewport .viewport-inner table th{padding-top:20px;padding-bottom:20px}.reveal .playback{position:absolute;left:15px;bottom:20px;z-index:30;cursor:pointer;transition:all .4s ease;-webkit-tap-highlight-color:transparent}.reveal.overview .playback{opacity:0;visibility:hidden}.reveal .hljs{min-height:100%}.reveal .hljs table{margin:initial}.reveal .hljs-ln-code,.reveal .hljs-ln-numbers{padding:0;border:0}.reveal .hljs-ln-numbers{opacity:.6;padding-right:.75em;text-align:right;vertical-align:top}.reveal .hljs.has-highlights tr:not(.highlight-line){opacity:.4}.reveal .hljs:not(:first-child).fragment{position:absolute;top:0;left:0;width:100%;box-sizing:border-box}.reveal pre[data-auto-animate-target]{overflow:hidden}.reveal pre[data-auto-animate-target] code{height:100%}.reveal .roll{display:inline-block;line-height:1.2;overflow:hidden;vertical-align:top;perspective:400px;perspective-origin:50% 50%}.reveal .roll:hover{background:0 0;text-shadow:none}.reveal .roll span{display:block;position:relative;padding:0 2px;pointer-events:none;transition:all .4s ease;transform-origin:50% 0;transform-style:preserve-3d;-webkit-backface-visibility:hidden;backface-visibility:hidden}.reveal .roll:hover span{background:rgba(0,0,0,.5);transform:translate3d(0,0,-45px) rotateX(90deg)}.reveal .roll span:after{content:attr(data-title);display:block;position:absolute;left:0;top:0;padding:0 2px;-webkit-backface-visibility:hidden;backface-visibility:hidden;transform-origin:50% 0;transform:translate3d(0,110%,0) rotateX(-90deg)}.reveal aside.notes{display:none}.reveal .speaker-notes{display:none;position:absolute;width:33.33333%;height:100%;top:0;left:100%;padding:14px 18px 14px 18px;z-index:1;font-size:18px;line-height:1.4;border:1px solid rgba(0,0,0,.05);color:#222;background-color:#f5f5f5;overflow:auto;box-sizing:border-box;text-align:left;font-family:Helvetica,sans-serif;-webkit-overflow-scrolling:touch}.reveal .speaker-notes .notes-placeholder{color:#ccc;font-style:italic}.reveal .speaker-notes:focus{outline:0}.reveal .speaker-notes:before{content:'Speaker notes';display:block;margin-bottom:10px;opacity:.5}.reveal.show-notes{max-width:75%;overflow:visible}.reveal.show-notes .speaker-notes{display:block}@media screen and (min-width:1600px){.reveal .speaker-notes{font-size:20px}}@media screen and (max-width:1024px){.reveal.show-notes{border-left:0;max-width:none;max-height:70%;max-height:70vh;overflow:visible}.reveal.show-notes .speaker-notes{top:100%;left:0;width:100%;height:42.85714%;height:30vh;border:0}}@media screen and (max-width:600px){.reveal.show-notes{max-height:60%;max-height:60vh}.reveal.show-notes .speaker-notes{top:100%;height:66.66667%;height:40vh}.reveal .speaker-notes{font-size:14px}}.zoomed .reveal *,.zoomed .reveal :after,.zoomed .reveal :before{-webkit-backface-visibility:visible!important;backface-visibility:visible!important}.zoomed .reveal .controls,.zoomed .reveal .progress{opacity:0}.zoomed .reveal .roll span{background:0 0}.zoomed .reveal .roll span:after{visibility:hidden}html.print-pdf *{-webkit-print-color-adjust:exact}html.print-pdf{width:100%;height:100%;overflow:visible}html.print-pdf body{margin:0 auto!important;border:0;padding:0;float:none!important;overflow:visible}html.print-pdf .nestedarrow,html.print-pdf .reveal .controls,html.print-pdf .reveal .playback,html.print-pdf .reveal .progress,html.print-pdf .reveal.overview,html.print-pdf .state-background{display:none!important}html.print-pdf .reveal pre code{overflow:hidden!important;font-family:Courier,'Courier New',monospace!important}html.print-pdf .reveal{width:auto!important;height:auto!important;overflow:hidden!important}html.print-pdf .reveal .slides{position:static;width:100%!important;height:auto!important;zoom:1!important;pointer-events:initial;left:auto;top:auto;margin:0!important;padding:0!important;overflow:visible;display:block;perspective:none;perspective-origin:50% 50%}html.print-pdf .reveal .slides .pdf-page{position:relative;overflow:hidden;z-index:1;page-break-after:always}html.print-pdf .reveal .slides section{visibility:visible!important;display:block!important;position:absolute!important;margin:0!important;padding:0!important;box-sizing:border-box!important;min-height:1px;opacity:1!important;transform-style:flat!important;transform:none!important}html.print-pdf .reveal section.stack{position:relative!important;margin:0!important;padding:0!important;page-break-after:avoid!important;height:auto!important;min-height:auto!important}html.print-pdf .reveal img{box-shadow:none}html.print-pdf .reveal .backgrounds{display:none}html.print-pdf .reveal .slide-background{display:block!important;position:absolute;top:0;left:0;width:100%;height:100%;z-index:auto!important}html.print-pdf .reveal.show-notes{max-width:none;max-height:none}html.print-pdf .reveal .speaker-notes-pdf{display:block;width:100%;height:auto;max-height:none;top:auto;right:auto;bottom:auto;left:auto;z-index:100}html.print-pdf .reveal .speaker-notes-pdf[data-layout=separate-page]{position:relative;color:inherit;background-color:transparent;padding:20px;page-break-after:always;border:0}html.print-pdf .reveal .slide-number-pdf{display:block;position:absolute;font-size:14px}html.print-pdf .aria-status{display:none}@media print{html:not(.print-pdf){background:#fff;width:auto;height:auto;overflow:visible}html:not(.print-pdf) body{background:#fff;font-size:20pt;width:auto;height:auto;border:0;margin:0 5%;padding:0;overflow:visible;float:none!important}html:not(.print-pdf) .controls,html:not(.print-pdf) .fork-reveal,html:not(.print-pdf) .nestedarrow,html:not(.print-pdf) .reveal .backgrounds,html:not(.print-pdf) .reveal .progress,html:not(.print-pdf) .reveal .slide-number,html:not(.print-pdf) .share-reveal,html:not(.print-pdf) .state-background{display:none!important}html:not(.print-pdf) body,html:not(.print-pdf) li,html:not(.print-pdf) p,html:not(.print-pdf) td{font-size:20pt!important;color:#000}html:not(.print-pdf) h1,html:not(.print-pdf) h2,html:not(.print-pdf) h3,html:not(.print-pdf) h4,html:not(.print-pdf) h5,html:not(.print-pdf) h6{color:#000!important;height:auto;line-height:normal;text-align:left;letter-spacing:normal}html:not(.print-pdf) h1{font-size:28pt!important}html:not(.print-pdf) h2{font-size:24pt!important}html:not(.print-pdf) h3{font-size:22pt!important}html:not(.print-pdf) h4{font-size:22pt!important;font-variant:small-caps}html:not(.print-pdf) h5{font-size:21pt!important}html:not(.print-pdf) h6{font-size:20pt!important;font-style:italic}html:not(.print-pdf) a:link,html:not(.print-pdf) a:visited{color:#000!important;font-weight:700;text-decoration:underline}html:not(.print-pdf) div,html:not(.print-pdf) ol,html:not(.print-pdf) p,html:not(.print-pdf) ul{visibility:visible;position:static;width:auto;height:auto;display:block;overflow:visible;margin:0;text-align:left!important}html:not(.print-pdf) .reveal pre,html:not(.print-pdf) .reveal table{margin-left:0;margin-right:0}html:not(.print-pdf) .reveal pre code{padding:20px}html:not(.print-pdf) .reveal blockquote{margin:20px 0}html:not(.print-pdf) .reveal .slides{position:static!important;width:auto!important;height:auto!important;left:0!important;top:0!important;margin-left:0!important;margin-top:0!important;padding:0!important;zoom:1!important;transform:none!important;overflow:visible!important;display:block!important;text-align:left!important;perspective:none;perspective-origin:50% 50%}html:not(.print-pdf) .reveal .slides section{visibility:visible!important;position:static!important;width:auto!important;height:auto!important;display:block!important;overflow:visible!important;left:0!important;top:0!important;margin-left:0!important;margin-top:0!important;padding:60px 20px!important;z-index:auto!important;opacity:1!important;page-break-after:always!important;transform-style:flat!important;transform:none!important;transition:none!important}html:not(.print-pdf) .reveal .slides section.stack{padding:0!important}html:not(.print-pdf) .reveal section:last-of-type{page-break-after:avoid!important}html:not(.print-pdf) .reveal section .fragment{opacity:1!important;visibility:visible!important;transform:none!important}html:not(.print-pdf) .reveal section img{display:block;margin:15px 0;background:#fff;border:1px solid #666;box-shadow:none}html:not(.print-pdf) .reveal section small{font-size:.8em}html:not(.print-pdf) .reveal .hljs{max-height:100%;white-space:pre-wrap;word-wrap:break-word;word-break:break-word;font-size:15pt}html:not(.print-pdf) .reveal .hljs .hljs-ln-numbers{white-space:nowrap}html:not(.print-pdf) .reveal .hljs td{font-size:inherit!important;color:inherit!important}}"
  },
  {
    "path": "pages/include/revealjs/reveal.js",
    "content": "/*!\n* reveal.js 4.0.2\n* https://revealjs.com\n* MIT licensed\n*\n* Copyright (C) 2020 Hakim El Hattab, https://hakim.se\n*/\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).Reveal=t()}(this,(function(){\"use strict\";var e=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:{};function t(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,\"default\")?e.default:e}function n(e,t,n){return e(n={path:t,exports:{},require:function(e,t){return function(){throw new Error(\"Dynamic requires are not currently supported by @rollup/plugin-commonjs\")}(null==t&&n.path)}},n.exports),n.exports}var i=function(e){return e&&e.Math==Math&&e},r=i(\"object\"==typeof globalThis&&globalThis)||i(\"object\"==typeof window&&window)||i(\"object\"==typeof self&&self)||i(\"object\"==typeof e&&e)||Function(\"return this\")(),a=function(e){try{return!!e()}catch(e){return!0}},o=!a((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),s={}.propertyIsEnumerable,l=Object.getOwnPropertyDescriptor,u={f:l&&!s.call({1:2},1)?function(e){var t=l(this,e);return!!t&&t.enumerable}:s},c=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},d={}.toString,h=function(e){return d.call(e).slice(8,-1)},f=\"\".split,v=a((function(){return!Object(\"z\").propertyIsEnumerable(0)}))?function(e){return\"String\"==h(e)?f.call(e,\"\"):Object(e)}:Object,g=function(e){if(null==e)throw TypeError(\"Can't call method on \"+e);return e},p=function(e){return v(g(e))},m=function(e){return\"object\"==typeof e?null!==e:\"function\"==typeof e},y=function(e,t){if(!m(e))return e;var n,i;if(t&&\"function\"==typeof(n=e.toString)&&!m(i=n.call(e)))return i;if(\"function\"==typeof(n=e.valueOf)&&!m(i=n.call(e)))return i;if(!t&&\"function\"==typeof(n=e.toString)&&!m(i=n.call(e)))return i;throw TypeError(\"Can't convert object to primitive value\")},b={}.hasOwnProperty,w=function(e,t){return b.call(e,t)},S=r.document,E=m(S)&&m(S.createElement),k=function(e){return E?S.createElement(e):{}},A=!o&&!a((function(){return 7!=Object.defineProperty(k(\"div\"),\"a\",{get:function(){return 7}}).a})),R=Object.getOwnPropertyDescriptor,x={f:o?R:function(e,t){if(e=p(e),t=y(t,!0),A)try{return R(e,t)}catch(e){}if(w(e,t))return c(!u.f.call(e,t),e[t])}},L=function(e){if(!m(e))throw TypeError(String(e)+\" is not an object\");return e},C=Object.defineProperty,P={f:o?C:function(e,t,n){if(L(e),t=y(t,!0),L(n),A)try{return C(e,t,n)}catch(e){}if(\"get\"in n||\"set\"in n)throw TypeError(\"Accessors not supported\");return\"value\"in n&&(e[t]=n.value),e}},N=o?function(e,t,n){return P.f(e,t,c(1,n))}:function(e,t,n){return e[t]=n,e},M=function(e,t){try{N(r,e,t)}catch(n){r[e]=t}return t},I=\"__core-js_shared__\",O=r[I]||M(I,{}),T=Function.toString;\"function\"!=typeof O.inspectSource&&(O.inspectSource=function(e){return T.call(e)});var D,j,z,H=O.inspectSource,F=r.WeakMap,U=\"function\"==typeof F&&/native code/.test(H(F)),B=n((function(e){(e.exports=function(e,t){return O[e]||(O[e]=void 0!==t?t:{})})(\"versions\",[]).push({version:\"3.6.5\",mode:\"global\",copyright:\"© 2020 Denis Pushkarev (zloirock.ru)\"})})),q=0,W=Math.random(),_=function(e){return\"Symbol(\"+String(void 0===e?\"\":e)+\")_\"+(++q+W).toString(36)},V=B(\"keys\"),K=function(e){return V[e]||(V[e]=_(e))},$={},X=r.WeakMap;if(U){var Y=new X,G=Y.get,J=Y.has,Q=Y.set;D=function(e,t){return Q.call(Y,e,t),t},j=function(e){return G.call(Y,e)||{}},z=function(e){return J.call(Y,e)}}else{var Z=K(\"state\");$[Z]=!0,D=function(e,t){return N(e,Z,t),t},j=function(e){return w(e,Z)?e[Z]:{}},z=function(e){return w(e,Z)}}var ee,te,ne={set:D,get:j,has:z,enforce:function(e){return z(e)?j(e):D(e,{})},getterFor:function(e){return function(t){var n;if(!m(t)||(n=j(t)).type!==e)throw TypeError(\"Incompatible receiver, \"+e+\" required\");return n}}},ie=n((function(e){var t=ne.get,n=ne.enforce,i=String(String).split(\"String\");(e.exports=function(e,t,a,o){var s=!!o&&!!o.unsafe,l=!!o&&!!o.enumerable,u=!!o&&!!o.noTargetGet;\"function\"==typeof a&&(\"string\"!=typeof t||w(a,\"name\")||N(a,\"name\",t),n(a).source=i.join(\"string\"==typeof t?t:\"\")),e!==r?(s?!u&&e[t]&&(l=!0):delete e[t],l?e[t]=a:N(e,t,a)):l?e[t]=a:M(t,a)})(Function.prototype,\"toString\",(function(){return\"function\"==typeof this&&t(this).source||H(this)}))})),re=r,ae=function(e){return\"function\"==typeof e?e:void 0},oe=function(e,t){return arguments.length<2?ae(re[e])||ae(r[e]):re[e]&&re[e][t]||r[e]&&r[e][t]},se=Math.ceil,le=Math.floor,ue=function(e){return isNaN(e=+e)?0:(e>0?le:se)(e)},ce=Math.min,de=function(e){return e>0?ce(ue(e),9007199254740991):0},he=Math.max,fe=Math.min,ve=function(e,t){var n=ue(e);return n<0?he(n+t,0):fe(n,t)},ge=function(e){return function(t,n,i){var r,a=p(t),o=de(a.length),s=ve(i,o);if(e&&n!=n){for(;o>s;)if((r=a[s++])!=r)return!0}else for(;o>s;s++)if((e||s in a)&&a[s]===n)return e||s||0;return!e&&-1}},pe={includes:ge(!0),indexOf:ge(!1)},me=pe.indexOf,ye=function(e,t){var n,i=p(e),r=0,a=[];for(n in i)!w($,n)&&w(i,n)&&a.push(n);for(;t.length>r;)w(i,n=t[r++])&&(~me(a,n)||a.push(n));return a},be=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"],we=be.concat(\"length\",\"prototype\"),Se={f:Object.getOwnPropertyNames||function(e){return ye(e,we)}},Ee={f:Object.getOwnPropertySymbols},ke=oe(\"Reflect\",\"ownKeys\")||function(e){var t=Se.f(L(e)),n=Ee.f;return n?t.concat(n(e)):t},Ae=function(e,t){for(var n=ke(t),i=P.f,r=x.f,a=0;a<n.length;a++){var o=n[a];w(e,o)||i(e,o,r(t,o))}},Re=/#|\\.prototype\\./,xe=function(e,t){var n=Ce[Le(e)];return n==Ne||n!=Pe&&(\"function\"==typeof t?a(t):!!t)},Le=xe.normalize=function(e){return String(e).replace(Re,\".\").toLowerCase()},Ce=xe.data={},Pe=xe.NATIVE=\"N\",Ne=xe.POLYFILL=\"P\",Me=xe,Ie=x.f,Oe=function(e,t){var n,i,a,o,s,l=e.target,u=e.global,c=e.stat;if(n=u?r:c?r[l]||M(l,{}):(r[l]||{}).prototype)for(i in t){if(o=t[i],a=e.noTargetGet?(s=Ie(n,i))&&s.value:n[i],!Me(u?i:l+(c?\".\":\"#\")+i,e.forced)&&void 0!==a){if(typeof o==typeof a)continue;Ae(o,a)}(e.sham||a&&a.sham)&&N(o,\"sham\",!0),ie(n,i,o,e)}},Te=Array.isArray||function(e){return\"Array\"==h(e)},De=function(e){return Object(g(e))},je=function(e,t,n){var i=y(t);i in e?P.f(e,i,c(0,n)):e[i]=n},ze=!!Object.getOwnPropertySymbols&&!a((function(){return!String(Symbol())})),He=ze&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator,Fe=B(\"wks\"),Ue=r.Symbol,Be=He?Ue:Ue&&Ue.withoutSetter||_,qe=function(e){return w(Fe,e)||(ze&&w(Ue,e)?Fe[e]=Ue[e]:Fe[e]=Be(\"Symbol.\"+e)),Fe[e]},We=qe(\"species\"),_e=function(e,t){var n;return Te(e)&&(\"function\"!=typeof(n=e.constructor)||n!==Array&&!Te(n.prototype)?m(n)&&null===(n=n[We])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)},Ve=oe(\"navigator\",\"userAgent\")||\"\",Ke=r.process,$e=Ke&&Ke.versions,Xe=$e&&$e.v8;Xe?te=(ee=Xe.split(\".\"))[0]+ee[1]:Ve&&(!(ee=Ve.match(/Edge\\/(\\d+)/))||ee[1]>=74)&&(ee=Ve.match(/Chrome\\/(\\d+)/))&&(te=ee[1]);var Ye=te&&+te,Ge=qe(\"species\"),Je=function(e){return Ye>=51||!a((function(){var t=[];return(t.constructor={})[Ge]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},Qe=qe(\"isConcatSpreadable\"),Ze=9007199254740991,et=\"Maximum allowed index exceeded\",tt=Ye>=51||!a((function(){var e=[];return e[Qe]=!1,e.concat()[0]!==e})),nt=Je(\"concat\"),it=function(e){if(!m(e))return!1;var t=e[Qe];return void 0!==t?!!t:Te(e)};Oe({target:\"Array\",proto:!0,forced:!tt||!nt},{concat:function(e){var t,n,i,r,a,o=De(this),s=_e(o,0),l=0;for(t=-1,i=arguments.length;t<i;t++)if(it(a=-1===t?o:arguments[t])){if(l+(r=de(a.length))>Ze)throw TypeError(et);for(n=0;n<r;n++,l++)n in a&&je(s,l,a[n])}else{if(l>=Ze)throw TypeError(et);je(s,l++,a)}return s.length=l,s}});var rt=function(e){if(\"function\"!=typeof e)throw TypeError(String(e)+\" is not a function\");return e},at=function(e,t,n){if(rt(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}},ot=[].push,st=function(e){var t=1==e,n=2==e,i=3==e,r=4==e,a=6==e,o=5==e||a;return function(s,l,u,c){for(var d,h,f=De(s),g=v(f),p=at(l,u,3),m=de(g.length),y=0,b=c||_e,w=t?b(s,m):n?b(s,0):void 0;m>y;y++)if((o||y in g)&&(h=p(d=g[y],y,f),e))if(t)w[y]=h;else if(h)switch(e){case 3:return!0;case 5:return d;case 6:return y;case 2:ot.call(w,d)}else if(r)return!1;return a?-1:i||r?r:w}},lt={forEach:st(0),map:st(1),filter:st(2),some:st(3),every:st(4),find:st(5),findIndex:st(6)},ut=function(e,t){var n=[][e];return!!n&&a((function(){n.call(null,t||function(){throw 1},1)}))},ct=Object.defineProperty,dt={},ht=function(e){throw e},ft=function(e,t){if(w(dt,e))return dt[e];t||(t={});var n=[][e],i=!!w(t,\"ACCESSORS\")&&t.ACCESSORS,r=w(t,0)?t[0]:ht,s=w(t,1)?t[1]:void 0;return dt[e]=!!n&&!a((function(){if(i&&!o)return!0;var e={length:-1};i?ct(e,1,{enumerable:!0,get:ht}):e[1]=1,n.call(e,r,s)}))},vt=lt.forEach,gt=ut(\"forEach\"),pt=ft(\"forEach\"),mt=gt&&pt?[].forEach:function(e){return vt(this,e,arguments.length>1?arguments[1]:void 0)};Oe({target:\"Array\",proto:!0,forced:[].forEach!=mt},{forEach:mt});var yt=lt.map,bt=Je(\"map\"),wt=ft(\"map\");Oe({target:\"Array\",proto:!0,forced:!bt||!wt},{map:function(e){return yt(this,e,arguments.length>1?arguments[1]:void 0)}});var St=Object.keys||function(e){return ye(e,be)},Et=Object.assign,kt=Object.defineProperty,At=!Et||a((function(){if(o&&1!==Et({b:1},Et(kt({},\"a\",{enumerable:!0,get:function(){kt(this,\"b\",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),i=\"abcdefghijklmnopqrst\";return e[n]=7,i.split(\"\").forEach((function(e){t[e]=e})),7!=Et({},e)[n]||St(Et({},t)).join(\"\")!=i}))?function(e,t){for(var n=De(e),i=arguments.length,r=1,a=Ee.f,s=u.f;i>r;)for(var l,c=v(arguments[r++]),d=a?St(c).concat(a(c)):St(c),h=d.length,f=0;h>f;)l=d[f++],o&&!s.call(c,l)||(n[l]=c[l]);return n}:Et;Oe({target:\"Object\",stat:!0,forced:Object.assign!==At},{assign:At});var Rt,xt=o?Object.defineProperties:function(e,t){L(e);for(var n,i=St(t),r=i.length,a=0;r>a;)P.f(e,n=i[a++],t[n]);return e},Lt=oe(\"document\",\"documentElement\"),Ct=K(\"IE_PROTO\"),Pt=function(){},Nt=function(e){return\"<script>\"+e+\"</\"+\"script>\"},Mt=function(){try{Rt=document.domain&&new ActiveXObject(\"htmlfile\")}catch(e){}var e,t;Mt=Rt?function(e){e.write(Nt(\"\")),e.close();var t=e.parentWindow.Object;return e=null,t}(Rt):((t=k(\"iframe\")).style.display=\"none\",Lt.appendChild(t),t.src=String(\"javascript:\"),(e=t.contentWindow.document).open(),e.write(Nt(\"document.F=Object\")),e.close(),e.F);for(var n=be.length;n--;)delete Mt.prototype[be[n]];return Mt()};$[Ct]=!0;var It=Object.create||function(e,t){var n;return null!==e?(Pt.prototype=L(e),n=new Pt,Pt.prototype=null,n[Ct]=e):n=Mt(),void 0===t?n:xt(n,t)},Ot=Se.f,Tt={}.toString,Dt=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],jt={f:function(e){return Dt&&\"[object Window]\"==Tt.call(e)?function(e){try{return Ot(e)}catch(e){return Dt.slice()}}(e):Ot(p(e))}},zt={f:qe},Ht=P.f,Ft=P.f,Ut=qe(\"toStringTag\"),Bt=function(e,t,n){e&&!w(e=n?e:e.prototype,Ut)&&Ft(e,Ut,{configurable:!0,value:t})},qt=lt.forEach,Wt=K(\"hidden\"),_t=\"Symbol\",Vt=qe(\"toPrimitive\"),Kt=ne.set,$t=ne.getterFor(_t),Xt=Object.prototype,Yt=r.Symbol,Gt=oe(\"JSON\",\"stringify\"),Jt=x.f,Qt=P.f,Zt=jt.f,en=u.f,tn=B(\"symbols\"),nn=B(\"op-symbols\"),rn=B(\"string-to-symbol-registry\"),an=B(\"symbol-to-string-registry\"),on=B(\"wks\"),sn=r.QObject,ln=!sn||!sn.prototype||!sn.prototype.findChild,un=o&&a((function(){return 7!=It(Qt({},\"a\",{get:function(){return Qt(this,\"a\",{value:7}).a}})).a}))?function(e,t,n){var i=Jt(Xt,t);i&&delete Xt[t],Qt(e,t,n),i&&e!==Xt&&Qt(Xt,t,i)}:Qt,cn=function(e,t){var n=tn[e]=It(Yt.prototype);return Kt(n,{type:_t,tag:e,description:t}),o||(n.description=t),n},dn=He?function(e){return\"symbol\"==typeof e}:function(e){return Object(e)instanceof Yt},hn=function(e,t,n){e===Xt&&hn(nn,t,n),L(e);var i=y(t,!0);return L(n),w(tn,i)?(n.enumerable?(w(e,Wt)&&e[Wt][i]&&(e[Wt][i]=!1),n=It(n,{enumerable:c(0,!1)})):(w(e,Wt)||Qt(e,Wt,c(1,{})),e[Wt][i]=!0),un(e,i,n)):Qt(e,i,n)},fn=function(e,t){L(e);var n=p(t),i=St(n).concat(mn(n));return qt(i,(function(t){o&&!vn.call(n,t)||hn(e,t,n[t])})),e},vn=function(e){var t=y(e,!0),n=en.call(this,t);return!(this===Xt&&w(tn,t)&&!w(nn,t))&&(!(n||!w(this,t)||!w(tn,t)||w(this,Wt)&&this[Wt][t])||n)},gn=function(e,t){var n=p(e),i=y(t,!0);if(n!==Xt||!w(tn,i)||w(nn,i)){var r=Jt(n,i);return!r||!w(tn,i)||w(n,Wt)&&n[Wt][i]||(r.enumerable=!0),r}},pn=function(e){var t=Zt(p(e)),n=[];return qt(t,(function(e){w(tn,e)||w($,e)||n.push(e)})),n},mn=function(e){var t=e===Xt,n=Zt(t?nn:p(e)),i=[];return qt(n,(function(e){!w(tn,e)||t&&!w(Xt,e)||i.push(tn[e])})),i};if(ze||(ie((Yt=function(){if(this instanceof Yt)throw TypeError(\"Symbol is not a constructor\");var e=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,t=_(e),n=function(e){this===Xt&&n.call(nn,e),w(this,Wt)&&w(this[Wt],t)&&(this[Wt][t]=!1),un(this,t,c(1,e))};return o&&ln&&un(Xt,t,{configurable:!0,set:n}),cn(t,e)}).prototype,\"toString\",(function(){return $t(this).tag})),ie(Yt,\"withoutSetter\",(function(e){return cn(_(e),e)})),u.f=vn,P.f=hn,x.f=gn,Se.f=jt.f=pn,Ee.f=mn,zt.f=function(e){return cn(qe(e),e)},o&&(Qt(Yt.prototype,\"description\",{configurable:!0,get:function(){return $t(this).description}}),ie(Xt,\"propertyIsEnumerable\",vn,{unsafe:!0}))),Oe({global:!0,wrap:!0,forced:!ze,sham:!ze},{Symbol:Yt}),qt(St(on),(function(e){!function(e){var t=re.Symbol||(re.Symbol={});w(t,e)||Ht(t,e,{value:zt.f(e)})}(e)})),Oe({target:_t,stat:!0,forced:!ze},{for:function(e){var t=String(e);if(w(rn,t))return rn[t];var n=Yt(t);return rn[t]=n,an[n]=t,n},keyFor:function(e){if(!dn(e))throw TypeError(e+\" is not a symbol\");if(w(an,e))return an[e]},useSetter:function(){ln=!0},useSimple:function(){ln=!1}}),Oe({target:\"Object\",stat:!0,forced:!ze,sham:!o},{create:function(e,t){return void 0===t?It(e):fn(It(e),t)},defineProperty:hn,defineProperties:fn,getOwnPropertyDescriptor:gn}),Oe({target:\"Object\",stat:!0,forced:!ze},{getOwnPropertyNames:pn,getOwnPropertySymbols:mn}),Oe({target:\"Object\",stat:!0,forced:a((function(){Ee.f(1)}))},{getOwnPropertySymbols:function(e){return Ee.f(De(e))}}),Gt){var yn=!ze||a((function(){var e=Yt();return\"[null]\"!=Gt([e])||\"{}\"!=Gt({a:e})||\"{}\"!=Gt(Object(e))}));Oe({target:\"JSON\",stat:!0,forced:yn},{stringify:function(e,t,n){for(var i,r=[e],a=1;arguments.length>a;)r.push(arguments[a++]);if(i=t,(m(t)||void 0!==e)&&!dn(e))return Te(t)||(t=function(e,t){if(\"function\"==typeof i&&(t=i.call(this,e,t)),!dn(t))return t}),r[1]=t,Gt.apply(null,r)}})}Yt.prototype[Vt]||N(Yt.prototype,Vt,Yt.prototype.valueOf),Bt(Yt,_t),$[Wt]=!0;var bn=P.f,wn=r.Symbol;if(o&&\"function\"==typeof wn&&(!(\"description\"in wn.prototype)||void 0!==wn().description)){var Sn={},En=function(){var e=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),t=this instanceof En?new wn(e):void 0===e?wn():wn(e);return\"\"===e&&(Sn[t]=!0),t};Ae(En,wn);var kn=En.prototype=wn.prototype;kn.constructor=En;var An=kn.toString,Rn=\"Symbol(test)\"==String(wn(\"test\")),xn=/^Symbol\\((.*)\\)[^)]+$/;bn(kn,\"description\",{configurable:!0,get:function(){var e=m(this)?this.valueOf():this,t=An.call(e);if(w(Sn,e))return\"\";var n=Rn?t.slice(7,-1):t.replace(xn,\"$1\");return\"\"===n?void 0:n}}),Oe({global:!0,forced:!0},{Symbol:En})}var Ln=function(e,t,n,i){try{return i?t(L(n)[0],n[1]):t(n)}catch(t){var r=e.return;throw void 0!==r&&L(r.call(e)),t}},Cn={},Pn=qe(\"iterator\"),Nn=Array.prototype,Mn=function(e){return void 0!==e&&(Cn.Array===e||Nn[Pn]===e)},In={};In[qe(\"toStringTag\")]=\"z\";var On=\"[object z]\"===String(In),Tn=qe(\"toStringTag\"),Dn=\"Arguments\"==h(function(){return arguments}()),jn=On?h:function(e){var t,n,i;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),Tn))?n:Dn?h(t):\"Object\"==(i=h(t))&&\"function\"==typeof t.callee?\"Arguments\":i},zn=qe(\"iterator\"),Hn=function(e){if(null!=e)return e[zn]||e[\"@@iterator\"]||Cn[jn(e)]},Fn=qe(\"iterator\"),Un=!1;try{var Bn=0,qn={next:function(){return{done:!!Bn++}},return:function(){Un=!0}};qn[Fn]=function(){return this},Array.from(qn,(function(){throw 2}))}catch(e){}var Wn=function(e,t){if(!t&&!Un)return!1;var n=!1;try{var i={};i[Fn]=function(){return{next:function(){return{done:n=!0}}}},e(i)}catch(e){}return n},_n=!Wn((function(e){Array.from(e)}));Oe({target:\"Array\",stat:!0,forced:_n},{from:function(e){var t,n,i,r,a,o,s=De(e),l=\"function\"==typeof this?this:Array,u=arguments.length,c=u>1?arguments[1]:void 0,d=void 0!==c,h=Hn(s),f=0;if(d&&(c=at(c,u>2?arguments[2]:void 0,2)),null==h||l==Array&&Mn(h))for(n=new l(t=de(s.length));t>f;f++)o=d?c(s[f],f):s[f],je(n,f,o);else for(a=(r=h.call(s)).next,n=new l;!(i=a.call(r)).done;f++)o=d?Ln(r,c,[i.value,f],!0):i.value,je(n,f,o);return n.length=f,n}});var Vn=pe.indexOf,Kn=[].indexOf,$n=!!Kn&&1/[1].indexOf(1,-0)<0,Xn=ut(\"indexOf\"),Yn=ft(\"indexOf\",{ACCESSORS:!0,1:0});Oe({target:\"Array\",proto:!0,forced:$n||!Xn||!Yn},{indexOf:function(e){return $n?Kn.apply(this,arguments)||0:Vn(this,e,arguments.length>1?arguments[1]:void 0)}});var Gn=Je(\"splice\"),Jn=ft(\"splice\",{ACCESSORS:!0,0:0,1:2}),Qn=Math.max,Zn=Math.min,ei=9007199254740991,ti=\"Maximum allowed length exceeded\";Oe({target:\"Array\",proto:!0,forced:!Gn||!Jn},{splice:function(e,t){var n,i,r,a,o,s,l=De(this),u=de(l.length),c=ve(e,u),d=arguments.length;if(0===d?n=i=0:1===d?(n=0,i=u-c):(n=d-2,i=Zn(Qn(ue(t),0),u-c)),u+n-i>ei)throw TypeError(ti);for(r=_e(l,i),a=0;a<i;a++)(o=c+a)in l&&je(r,a,l[o]);if(r.length=i,n<i){for(a=c;a<u-i;a++)s=a+n,(o=a+i)in l?l[s]=l[o]:delete l[s];for(a=u;a>u-i+n;a--)delete l[a-1]}else if(n>i)for(a=u-i;a>c;a--)s=a+n-1,(o=a+i-1)in l?l[s]=l[o]:delete l[s];for(a=0;a<n;a++)l[a+c]=arguments[a+2];return l.length=u-i+n,r}});var ni=P.f,ii=Function.prototype,ri=ii.toString,ai=/^\\s*function ([^ (]*)/,oi=\"name\";o&&!(oi in ii)&&ni(ii,oi,{configurable:!0,get:function(){try{return ri.call(this).match(ai)[1]}catch(e){return\"\"}}});var si=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,\"__proto__\").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,i){return L(n),function(e){if(!m(e)&&null!==e)throw TypeError(\"Can't set \"+String(e)+\" as a prototype\")}(i),t?e.call(n,i):n.__proto__=i,n}}():void 0),li=function(e,t,n){var i,r;return si&&\"function\"==typeof(i=t.constructor)&&i!==n&&m(r=i.prototype)&&r!==n.prototype&&si(e,r),e},ui=\"\\t\\n\\v\\f\\r                　\\u2028\\u2029\\ufeff\",ci=\"[\"+ui+\"]\",di=RegExp(\"^\"+ci+ci+\"*\"),hi=RegExp(ci+ci+\"*$\"),fi=function(e){return function(t){var n=String(g(t));return 1&e&&(n=n.replace(di,\"\")),2&e&&(n=n.replace(hi,\"\")),n}},vi={start:fi(1),end:fi(2),trim:fi(3)},gi=Se.f,pi=x.f,mi=P.f,yi=vi.trim,bi=\"Number\",wi=r.Number,Si=wi.prototype,Ei=h(It(Si))==bi,ki=function(e){var t,n,i,r,a,o,s,l,u=y(e,!1);if(\"string\"==typeof u&&u.length>2)if(43===(t=(u=yi(u)).charCodeAt(0))||45===t){if(88===(n=u.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(u.charCodeAt(1)){case 66:case 98:i=2,r=49;break;case 79:case 111:i=8,r=55;break;default:return+u}for(o=(a=u.slice(2)).length,s=0;s<o;s++)if((l=a.charCodeAt(s))<48||l>r)return NaN;return parseInt(a,i)}return+u};if(Me(bi,!wi(\" 0o1\")||!wi(\"0b1\")||wi(\"+0x1\"))){for(var Ai,Ri=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof Ri&&(Ei?a((function(){Si.valueOf.call(n)})):h(n)!=bi)?li(new wi(ki(t)),n,Ri):ki(t)},xi=o?gi(wi):\"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger\".split(\",\"),Li=0;xi.length>Li;Li++)w(wi,Ai=xi[Li])&&!w(Ri,Ai)&&mi(Ri,Ai,pi(wi,Ai));Ri.prototype=Si,Si.constructor=Ri,ie(r,bi,Ri)}var Ci=On?{}.toString:function(){return\"[object \"+jn(this)+\"]\"};On||ie(Object.prototype,\"toString\",Ci,{unsafe:!0});var Pi,Ni,Mi,Ii=r.Promise,Oi=qe(\"species\"),Ti=n((function(e){var t=function(e,t){this.stopped=e,this.result=t};(e.exports=function(e,n,i,r,a){var o,s,l,u,c,d,h,f=at(n,i,r?2:1);if(a)o=e;else{if(\"function\"!=typeof(s=Hn(e)))throw TypeError(\"Target is not iterable\");if(Mn(s)){for(l=0,u=de(e.length);u>l;l++)if((c=r?f(L(h=e[l])[0],h[1]):f(e[l]))&&c instanceof t)return c;return new t(!1)}o=s.call(e)}for(d=o.next;!(h=d.call(o)).done;)if(\"object\"==typeof(c=Ln(o,f,h.value,r))&&c&&c instanceof t)return c;return new t(!1)}).stop=function(e){return new t(!0,e)}})),Di=qe(\"species\"),ji=function(e,t){var n,i=L(e).constructor;return void 0===i||null==(n=L(i)[Di])?t:rt(n)},zi=/(iphone|ipod|ipad).*applewebkit/i.test(Ve),Hi=r.location,Fi=r.setImmediate,Ui=r.clearImmediate,Bi=r.process,qi=r.MessageChannel,Wi=r.Dispatch,_i=0,Vi={},Ki=\"onreadystatechange\",$i=function(e){if(Vi.hasOwnProperty(e)){var t=Vi[e];delete Vi[e],t()}},Xi=function(e){return function(){$i(e)}},Yi=function(e){$i(e.data)},Gi=function(e){r.postMessage(e+\"\",Hi.protocol+\"//\"+Hi.host)};Fi&&Ui||(Fi=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return Vi[++_i]=function(){(\"function\"==typeof e?e:Function(e)).apply(void 0,t)},Pi(_i),_i},Ui=function(e){delete Vi[e]},\"process\"==h(Bi)?Pi=function(e){Bi.nextTick(Xi(e))}:Wi&&Wi.now?Pi=function(e){Wi.now(Xi(e))}:qi&&!zi?(Mi=(Ni=new qi).port2,Ni.port1.onmessage=Yi,Pi=at(Mi.postMessage,Mi,1)):!r.addEventListener||\"function\"!=typeof postMessage||r.importScripts||a(Gi)||\"file:\"===Hi.protocol?Pi=Ki in k(\"script\")?function(e){Lt.appendChild(k(\"script\")).onreadystatechange=function(){Lt.removeChild(this),$i(e)}}:function(e){setTimeout(Xi(e),0)}:(Pi=Gi,r.addEventListener(\"message\",Yi,!1)));var Ji,Qi,Zi,er,tr,nr,ir,rr,ar={set:Fi,clear:Ui},or=x.f,sr=ar.set,lr=r.MutationObserver||r.WebKitMutationObserver,ur=r.process,cr=r.Promise,dr=\"process\"==h(ur),hr=or(r,\"queueMicrotask\"),fr=hr&&hr.value;fr||(Ji=function(){var e,t;for(dr&&(e=ur.domain)&&e.exit();Qi;){t=Qi.fn,Qi=Qi.next;try{t()}catch(e){throw Qi?er():Zi=void 0,e}}Zi=void 0,e&&e.enter()},dr?er=function(){ur.nextTick(Ji)}:lr&&!zi?(tr=!0,nr=document.createTextNode(\"\"),new lr(Ji).observe(nr,{characterData:!0}),er=function(){nr.data=tr=!tr}):cr&&cr.resolve?(ir=cr.resolve(void 0),rr=ir.then,er=function(){rr.call(ir,Ji)}):er=function(){sr.call(r,Ji)});var vr,gr,pr,mr,yr=fr||function(e){var t={fn:e,next:void 0};Zi&&(Zi.next=t),Qi||(Qi=t,er()),Zi=t},br=function(e){var t,n;this.promise=new e((function(e,i){if(void 0!==t||void 0!==n)throw TypeError(\"Bad Promise constructor\");t=e,n=i})),this.resolve=rt(t),this.reject=rt(n)},wr={f:function(e){return new br(e)}},Sr=function(e,t){if(L(e),m(t)&&t.constructor===e)return t;var n=wr.f(e);return(0,n.resolve)(t),n.promise},Er=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}},kr=ar.set,Ar=qe(\"species\"),Rr=\"Promise\",xr=ne.get,Lr=ne.set,Cr=ne.getterFor(Rr),Pr=Ii,Nr=r.TypeError,Mr=r.document,Ir=r.process,Or=oe(\"fetch\"),Tr=wr.f,Dr=Tr,jr=\"process\"==h(Ir),zr=!!(Mr&&Mr.createEvent&&r.dispatchEvent),Hr=\"unhandledrejection\",Fr=Me(Rr,(function(){if(!(H(Pr)!==String(Pr))){if(66===Ye)return!0;if(!jr&&\"function\"!=typeof PromiseRejectionEvent)return!0}if(Ye>=51&&/native code/.test(Pr))return!1;var e=Pr.resolve(1),t=function(e){e((function(){}),(function(){}))};return(e.constructor={})[Ar]=t,!(e.then((function(){}))instanceof t)})),Ur=Fr||!Wn((function(e){Pr.all(e).catch((function(){}))})),Br=function(e){var t;return!(!m(e)||\"function\"!=typeof(t=e.then))&&t},qr=function(e,t,n){if(!t.notified){t.notified=!0;var i=t.reactions;yr((function(){for(var r=t.value,a=1==t.state,o=0;i.length>o;){var s,l,u,c=i[o++],d=a?c.ok:c.fail,h=c.resolve,f=c.reject,v=c.domain;try{d?(a||(2===t.rejection&&Kr(e,t),t.rejection=1),!0===d?s=r:(v&&v.enter(),s=d(r),v&&(v.exit(),u=!0)),s===c.promise?f(Nr(\"Promise-chain cycle\")):(l=Br(s))?l.call(s,h,f):h(s)):f(r)}catch(e){v&&!u&&v.exit(),f(e)}}t.reactions=[],t.notified=!1,n&&!t.rejection&&_r(e,t)}))}},Wr=function(e,t,n){var i,a;zr?((i=Mr.createEvent(\"Event\")).promise=t,i.reason=n,i.initEvent(e,!1,!0),r.dispatchEvent(i)):i={promise:t,reason:n},(a=r[\"on\"+e])?a(i):e===Hr&&function(e,t){var n=r.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}(\"Unhandled promise rejection\",n)},_r=function(e,t){kr.call(r,(function(){var n,i=t.value;if(Vr(t)&&(n=Er((function(){jr?Ir.emit(\"unhandledRejection\",i,e):Wr(Hr,e,i)})),t.rejection=jr||Vr(t)?2:1,n.error))throw n.value}))},Vr=function(e){return 1!==e.rejection&&!e.parent},Kr=function(e,t){kr.call(r,(function(){jr?Ir.emit(\"rejectionHandled\",e):Wr(\"rejectionhandled\",e,t.value)}))},$r=function(e,t,n,i){return function(r){e(t,n,r,i)}},Xr=function(e,t,n,i){t.done||(t.done=!0,i&&(t=i),t.value=n,t.state=2,qr(e,t,!0))},Yr=function(e,t,n,i){if(!t.done){t.done=!0,i&&(t=i);try{if(e===n)throw Nr(\"Promise can't be resolved itself\");var r=Br(n);r?yr((function(){var i={done:!1};try{r.call(n,$r(Yr,e,i,t),$r(Xr,e,i,t))}catch(n){Xr(e,i,n,t)}})):(t.value=n,t.state=1,qr(e,t,!1))}catch(n){Xr(e,{done:!1},n,t)}}};Fr&&(Pr=function(e){!function(e,t,n){if(!(e instanceof t))throw TypeError(\"Incorrect \"+(n?n+\" \":\"\")+\"invocation\")}(this,Pr,Rr),rt(e),vr.call(this);var t=xr(this);try{e($r(Yr,this,t),$r(Xr,this,t))}catch(e){Xr(this,t,e)}},(vr=function(e){Lr(this,{type:Rr,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=function(e,t,n){for(var i in t)ie(e,i,t[i],n);return e}(Pr.prototype,{then:function(e,t){var n=Cr(this),i=Tr(ji(this,Pr));return i.ok=\"function\"!=typeof e||e,i.fail=\"function\"==typeof t&&t,i.domain=jr?Ir.domain:void 0,n.parent=!0,n.reactions.push(i),0!=n.state&&qr(this,n,!1),i.promise},catch:function(e){return this.then(void 0,e)}}),gr=function(){var e=new vr,t=xr(e);this.promise=e,this.resolve=$r(Yr,e,t),this.reject=$r(Xr,e,t)},wr.f=Tr=function(e){return e===Pr||e===pr?new gr(e):Dr(e)},\"function\"==typeof Ii&&(mr=Ii.prototype.then,ie(Ii.prototype,\"then\",(function(e,t){var n=this;return new Pr((function(e,t){mr.call(n,e,t)})).then(e,t)}),{unsafe:!0}),\"function\"==typeof Or&&Oe({global:!0,enumerable:!0,forced:!0},{fetch:function(e){return Sr(Pr,Or.apply(r,arguments))}}))),Oe({global:!0,wrap:!0,forced:Fr},{Promise:Pr}),Bt(Pr,Rr,!1),function(e){var t=oe(e),n=P.f;o&&t&&!t[Oi]&&n(t,Oi,{configurable:!0,get:function(){return this}})}(Rr),pr=oe(Rr),Oe({target:Rr,stat:!0,forced:Fr},{reject:function(e){var t=Tr(this);return t.reject.call(void 0,e),t.promise}}),Oe({target:Rr,stat:!0,forced:Fr},{resolve:function(e){return Sr(this,e)}}),Oe({target:Rr,stat:!0,forced:Ur},{all:function(e){var t=this,n=Tr(t),i=n.resolve,r=n.reject,a=Er((function(){var n=rt(t.resolve),a=[],o=0,s=1;Ti(e,(function(e){var l=o++,u=!1;a.push(void 0),s++,n.call(t,e).then((function(e){u||(u=!0,a[l]=e,--s||i(a))}),r)})),--s||i(a)}));return a.error&&r(a.value),n.promise},race:function(e){var t=this,n=Tr(t),i=n.reject,r=Er((function(){var r=rt(t.resolve);Ti(e,(function(e){r.call(t,e).then(n.resolve,i)}))}));return r.error&&i(r.value),n.promise}});var Gr=function(){var e=L(this),t=\"\";return e.global&&(t+=\"g\"),e.ignoreCase&&(t+=\"i\"),e.multiline&&(t+=\"m\"),e.dotAll&&(t+=\"s\"),e.unicode&&(t+=\"u\"),e.sticky&&(t+=\"y\"),t};function Jr(e,t){return RegExp(e,t)}var Qr,Zr,ea={UNSUPPORTED_Y:a((function(){var e=Jr(\"a\",\"y\");return e.lastIndex=2,null!=e.exec(\"abcd\")})),BROKEN_CARET:a((function(){var e=Jr(\"^r\",\"gy\");return e.lastIndex=2,null!=e.exec(\"str\")}))},ta=RegExp.prototype.exec,na=String.prototype.replace,ia=ta,ra=(Qr=/a/,Zr=/b*/g,ta.call(Qr,\"a\"),ta.call(Zr,\"a\"),0!==Qr.lastIndex||0!==Zr.lastIndex),aa=ea.UNSUPPORTED_Y||ea.BROKEN_CARET,oa=void 0!==/()??/.exec(\"\")[1];(ra||oa||aa)&&(ia=function(e){var t,n,i,r,a=this,o=aa&&a.sticky,s=Gr.call(a),l=a.source,u=0,c=e;return o&&(-1===(s=s.replace(\"y\",\"\")).indexOf(\"g\")&&(s+=\"g\"),c=String(e).slice(a.lastIndex),a.lastIndex>0&&(!a.multiline||a.multiline&&\"\\n\"!==e[a.lastIndex-1])&&(l=\"(?: \"+l+\")\",c=\" \"+c,u++),n=new RegExp(\"^(?:\"+l+\")\",s)),oa&&(n=new RegExp(\"^\"+l+\"$(?!\\\\s)\",s)),ra&&(t=a.lastIndex),i=ta.call(o?n:a,c),o?i?(i.input=i.input.slice(u),i[0]=i[0].slice(u),i.index=a.lastIndex,a.lastIndex+=i[0].length):a.lastIndex=0:ra&&i&&(a.lastIndex=a.global?i.index+i[0].length:t),oa&&i&&i.length>1&&na.call(i[0],n,(function(){for(r=1;r<arguments.length-2;r++)void 0===arguments[r]&&(i[r]=void 0)})),i});var sa=ia;Oe({target:\"RegExp\",proto:!0,forced:/./.exec!==sa},{exec:sa});var la,ua,ca,da=function(e){return function(t,n){var i,r,a=String(g(t)),o=ue(n),s=a.length;return o<0||o>=s?e?\"\":void 0:(i=a.charCodeAt(o))<55296||i>56319||o+1===s||(r=a.charCodeAt(o+1))<56320||r>57343?e?a.charAt(o):i:e?a.slice(o,o+2):r-56320+(i-55296<<10)+65536}},ha={codeAt:da(!1),charAt:da(!0)},fa=!a((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})),va=K(\"IE_PROTO\"),ga=Object.prototype,pa=fa?Object.getPrototypeOf:function(e){return e=De(e),w(e,va)?e[va]:\"function\"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?ga:null},ma=qe(\"iterator\"),ya=!1;[].keys&&(\"next\"in(ca=[].keys())?(ua=pa(pa(ca)))!==Object.prototype&&(la=ua):ya=!0),null==la&&(la={}),w(la,ma)||N(la,ma,(function(){return this}));var ba={IteratorPrototype:la,BUGGY_SAFARI_ITERATORS:ya},wa=ba.IteratorPrototype,Sa=function(){return this},Ea=ba.IteratorPrototype,ka=ba.BUGGY_SAFARI_ITERATORS,Aa=qe(\"iterator\"),Ra=\"keys\",xa=\"values\",La=\"entries\",Ca=function(){return this},Pa=ha.charAt,Na=\"String Iterator\",Ma=ne.set,Ia=ne.getterFor(Na);!function(e,t,n,i,r,a,o){!function(e,t,n){var i=t+\" Iterator\";e.prototype=It(wa,{next:c(1,n)}),Bt(e,i,!1),Cn[i]=Sa}(n,t,i);var s,l,u,d=function(e){if(e===r&&p)return p;if(!ka&&e in v)return v[e];switch(e){case Ra:case xa:case La:return function(){return new n(this,e)}}return function(){return new n(this)}},h=t+\" Iterator\",f=!1,v=e.prototype,g=v[Aa]||v[\"@@iterator\"]||r&&v[r],p=!ka&&g||d(r),m=\"Array\"==t&&v.entries||g;if(m&&(s=pa(m.call(new e)),Ea!==Object.prototype&&s.next&&(pa(s)!==Ea&&(si?si(s,Ea):\"function\"!=typeof s[Aa]&&N(s,Aa,Ca)),Bt(s,h,!0))),r==xa&&g&&g.name!==xa&&(f=!0,p=function(){return g.call(this)}),v[Aa]!==p&&N(v,Aa,p),Cn[t]=p,r)if(l={values:d(xa),keys:a?p:d(Ra),entries:d(La)},o)for(u in l)(ka||f||!(u in v))&&ie(v,u,l[u]);else Oe({target:t,proto:!0,forced:ka||f},l)}(String,\"String\",(function(e){Ma(this,{type:Na,string:String(e),index:0})}),(function(){var e,t=Ia(this),n=t.string,i=t.index;return i>=n.length?{value:void 0,done:!0}:(e=Pa(n,i),t.index+=e.length,{value:e,done:!1})}));var Oa=qe(\"species\"),Ta=!a((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:\"7\"},e},\"7\"!==\"\".replace(e,\"$<a>\")})),Da=\"$0\"===\"a\".replace(/./,\"$0\"),ja=qe(\"replace\"),za=!!/./[ja]&&\"\"===/./[ja](\"a\",\"$0\"),Ha=!a((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n=\"ab\".split(e);return 2!==n.length||\"a\"!==n[0]||\"b\"!==n[1]})),Fa=function(e,t,n,i){var r=qe(e),o=!a((function(){var t={};return t[r]=function(){return 7},7!=\"\"[e](t)})),s=o&&!a((function(){var t=!1,n=/a/;return\"split\"===e&&((n={}).constructor={},n.constructor[Oa]=function(){return n},n.flags=\"\",n[r]=/./[r]),n.exec=function(){return t=!0,null},n[r](\"\"),!t}));if(!o||!s||\"replace\"===e&&(!Ta||!Da||za)||\"split\"===e&&!Ha){var l=/./[r],u=n(r,\"\"[e],(function(e,t,n,i,r){return t.exec===sa?o&&!r?{done:!0,value:l.call(t,n,i)}:{done:!0,value:e.call(n,t,i)}:{done:!1}}),{REPLACE_KEEPS_$0:Da,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:za}),c=u[0],d=u[1];ie(String.prototype,e,c),ie(RegExp.prototype,r,2==t?function(e,t){return d.call(e,this,t)}:function(e){return d.call(e,this)})}i&&N(RegExp.prototype[r],\"sham\",!0)},Ua=ha.charAt,Ba=function(e,t,n){return t+(n?Ua(e,t).length:1)},qa=function(e,t){var n=e.exec;if(\"function\"==typeof n){var i=n.call(e,t);if(\"object\"!=typeof i)throw TypeError(\"RegExp exec method returned something other than an Object or null\");return i}if(\"RegExp\"!==h(e))throw TypeError(\"RegExp#exec called on incompatible receiver\");return sa.call(e,t)};Fa(\"match\",1,(function(e,t,n){return[function(t){var n=g(this),i=null==t?void 0:t[e];return void 0!==i?i.call(t,n):new RegExp(t)[e](String(n))},function(e){var i=n(t,e,this);if(i.done)return i.value;var r=L(e),a=String(this);if(!r.global)return qa(r,a);var o=r.unicode;r.lastIndex=0;for(var s,l=[],u=0;null!==(s=qa(r,a));){var c=String(s[0]);l[u]=c,\"\"===c&&(r.lastIndex=Ba(a,de(r.lastIndex),o)),u++}return 0===u?null:l}]}));var Wa=qe(\"match\"),_a=[].push,Va=Math.min,Ka=4294967295,$a=!a((function(){return!RegExp(Ka,\"y\")}));Fa(\"split\",2,(function(e,t,n){var i;return i=\"c\"==\"abbc\".split(/(b)*/)[1]||4!=\"test\".split(/(?:)/,-1).length||2!=\"ab\".split(/(?:ab)*/).length||4!=\".\".split(/(.?)(.?)/).length||\".\".split(/()()/).length>1||\"\".split(/.?/).length?function(e,n){var i,r,a=String(g(this)),o=void 0===n?Ka:n>>>0;if(0===o)return[];if(void 0===e)return[a];if(!m(i=e)||!(void 0!==(r=i[Wa])?r:\"RegExp\"==h(i)))return t.call(a,e,o);for(var s,l,u,c=[],d=(e.ignoreCase?\"i\":\"\")+(e.multiline?\"m\":\"\")+(e.unicode?\"u\":\"\")+(e.sticky?\"y\":\"\"),f=0,v=new RegExp(e.source,d+\"g\");(s=sa.call(v,a))&&!((l=v.lastIndex)>f&&(c.push(a.slice(f,s.index)),s.length>1&&s.index<a.length&&_a.apply(c,s.slice(1)),u=s[0].length,f=l,c.length>=o));)v.lastIndex===s.index&&v.lastIndex++;return f===a.length?!u&&v.test(\"\")||c.push(\"\"):c.push(a.slice(f)),c.length>o?c.slice(0,o):c}:\"0\".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var r=g(this),a=null==t?void 0:t[e];return void 0!==a?a.call(t,r,n):i.call(String(r),t,n)},function(e,r){var a=n(i,e,this,r,i!==t);if(a.done)return a.value;var o=L(e),s=String(this),l=ji(o,RegExp),u=o.unicode,c=(o.ignoreCase?\"i\":\"\")+(o.multiline?\"m\":\"\")+(o.unicode?\"u\":\"\")+($a?\"y\":\"g\"),d=new l($a?o:\"^(?:\"+o.source+\")\",c),h=void 0===r?Ka:r>>>0;if(0===h)return[];if(0===s.length)return null===qa(d,s)?[s]:[];for(var f=0,v=0,g=[];v<s.length;){d.lastIndex=$a?v:0;var p,m=qa(d,$a?s:s.slice(v));if(null===m||(p=Va(de(d.lastIndex+($a?0:v)),s.length))===f)v=Ba(s,v,u);else{if(g.push(s.slice(f,v)),g.length===h)return g;for(var y=1;y<=m.length-1;y++)if(g.push(m[y]),g.length===h)return g;v=f=p}}return g.push(s.slice(f)),g}]}),!$a);var Xa,Ya=vi.trim;Oe({target:\"String\",proto:!0,forced:(Xa=\"trim\",a((function(){return!!ui[Xa]()||\"​᠎\"!=\"​᠎\"[Xa]()||ui[Xa].name!==Xa})))},{trim:function(){return Ya(this)}});for(var Ga in{CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}){var Ja=r[Ga],Qa=Ja&&Ja.prototype;if(Qa&&Qa.forEach!==mt)try{N(Qa,\"forEach\",mt)}catch(e){Qa.forEach=mt}}function Za(e){return(Za=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function eo(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function to(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function no(e,t,n){return t&&to(e.prototype,t),n&&to(e,n),e}function io(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ro(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function ao(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ro(Object(n),!0).forEach((function(t){io(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ro(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function oo(e){return function(e){if(Array.isArray(e))return so(e)}(e)||function(e){if(\"undefined\"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(!e)return;if(\"string\"==typeof e)return so(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);\"Object\"===n&&e.constructor&&(n=e.constructor.name);if(\"Map\"===n||\"Set\"===n)return Array.from(e);if(\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return so(e,t)}(e)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}function so(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n<t;n++)i[n]=e[n];return i}var lo=\".slides section\",uo=\".slides>section\",co=\".slides>section.present>section\",ho=/registerPlugin|registerKeyboardShortcut|addKeyBinding|addEventListener/,fo=/fade-(down|up|right|left|out|in-then-out|in-then-semi-out)|semi-fade-out|current-visible|shrink|grow/,vo=Math.max,go=Math.min,po=Math.floor,mo=/\\$([$&'`]|\\d\\d?|<[^>]*>)/g,yo=/\\$([$&'`]|\\d\\d?)/g;Fa(\"replace\",2,(function(e,t,n,i){var r=i.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,a=i.REPLACE_KEEPS_$0,o=r?\"$\":\"$0\";return[function(n,i){var r=g(this),a=null==n?void 0:n[e];return void 0!==a?a.call(n,r,i):t.call(String(r),n,i)},function(e,i){if(!r&&a||\"string\"==typeof i&&-1===i.indexOf(o)){var l=n(t,e,this,i);if(l.done)return l.value}var u=L(e),c=String(this),d=\"function\"==typeof i;d||(i=String(i));var h=u.global;if(h){var f=u.unicode;u.lastIndex=0}for(var v=[];;){var g=qa(u,c);if(null===g)break;if(v.push(g),!h)break;\"\"===String(g[0])&&(u.lastIndex=Ba(c,de(u.lastIndex),f))}for(var p,m=\"\",y=0,b=0;b<v.length;b++){g=v[b];for(var w=String(g[0]),S=vo(go(ue(g.index),c.length),0),E=[],k=1;k<g.length;k++)E.push(void 0===(p=g[k])?p:String(p));var A=g.groups;if(d){var R=[w].concat(E,S,c);void 0!==A&&R.push(A);var x=String(i.apply(void 0,R))}else x=s(w,c,S,E,A,i);S>=y&&(m+=c.slice(y,S)+x,y=S+w.length)}return m+c.slice(y)}];function s(e,n,i,r,a,o){var s=i+e.length,l=r.length,u=yo;return void 0!==a&&(a=De(a),u=mo),t.call(o,u,(function(t,o){var u;switch(o.charAt(0)){case\"$\":return\"$\";case\"&\":return e;case\"`\":return n.slice(0,i);case\"'\":return n.slice(s);case\"<\":u=a[o.slice(1,-1)];break;default:var c=+o;if(0===c)return t;if(c>l){var d=po(c/10);return 0===d?t:d<=l?void 0===r[d-1]?o.charAt(1):r[d-1]+o.charAt(1):t}u=r[c-1]}return void 0===u?\"\":u}))}}));var bo=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};Fa(\"search\",1,(function(e,t,n){return[function(t){var n=g(this),i=null==t?void 0:t[e];return void 0!==i?i.call(t,n):new RegExp(t)[e](String(n))},function(e){var i=n(t,e,this);if(i.done)return i.value;var r=L(e),a=String(this),o=r.lastIndex;bo(o,0)||(r.lastIndex=0);var s=qa(r,a);return bo(r.lastIndex,o)||(r.lastIndex=o),null===s?-1:s.index}]}));var wo=function(e,t){for(var n in t)e[n]=t[n];return e},So=function(e,t){return Array.from(e.querySelectorAll(t))},Eo=function(e,t,n){n?e.classList.add(t):e.classList.remove(t)},ko=function(e){if(\"string\"==typeof e){if(\"null\"===e)return null;if(\"true\"===e)return!0;if(\"false\"===e)return!1;if(e.match(/^-?[\\d\\.]+$/))return parseFloat(e)}return e},Ao=function(e,t){e.style.transform=t},Ro=function(e,t){var n=e.matches||e.matchesSelector||e.msMatchesSelector;return!(!n||!n.call(e,t))},xo=function(e,t){if(\"function\"==typeof e.closest)return e.closest(t);for(;e;){if(Ro(e,t))return e;e=e.parentNode}return null},Lo=function(e,t,n){for(var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\",r=e.querySelectorAll(\".\"+n),a=0;a<r.length;a++){var o=r[a];if(o.parentNode===e)return o}var s=document.createElement(t);return s.className=n,s.innerHTML=i,e.appendChild(s),s},Co=function(e){var t=document.createElement(\"style\");return t.type=\"text/css\",e&&e.length>0&&(t.styleSheet?t.styleSheet.cssText=e:t.appendChild(document.createTextNode(e))),document.head.appendChild(t),t},Po=function(){var e={};for(var t in location.search.replace(/[A-Z0-9]+?=([\\w\\.%-]*)/gi,(function(t){e[t.split(\"=\").shift()]=t.split(\"=\").pop()})),e){var n=e[t];e[t]=ko(unescape(n))}return void 0!==e.dependencies&&delete e.dependencies,e},No=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(e){var n,i=e.style.height;return e.style.height=\"0px\",e.parentNode.style.height=\"auto\",n=t-e.parentNode.offsetHeight,e.style.height=i+\"px\",e.parentNode.style.removeProperty(\"height\"),n}return t},Mo=navigator.userAgent,Io=document.createElement(\"div\"),Oo=/(iphone|ipod|ipad|android)/gi.test(Mo)||\"MacIntel\"===navigator.platform&&navigator.maxTouchPoints>1,To=/chrome/i.test(Mo)&&!/edge/i.test(Mo),Do=/android/gi.test(Mo),jo=\"zoom\"in Io.style&&!Oo&&(To||/Version\\/[\\d\\.]+.*Safari/.test(Mo)),zo=t(n((function(e,t){Object.defineProperty(t,\"__esModule\",{value:!0});var n=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i])}return e};t.default=function(e){if(e){var t=function(e){return[].slice.call(e)},i=0,r=1,a=2,o=3,s=[],l=null,u=\"requestAnimationFrame\"in e?function(){e.cancelAnimationFrame(l),l=e.requestAnimationFrame((function(){return d(s.filter((function(e){return e.dirty&&e.active})))}))}:function(){},c=function(e){return function(){s.forEach((function(t){return t.dirty=e})),u()}},d=function(e){e.filter((function(e){return!e.styleComputed})).forEach((function(e){e.styleComputed=g(e)})),e.filter(p).forEach(m);var t=e.filter(v);t.forEach(f),t.forEach((function(e){m(e),h(e)})),t.forEach(y)},h=function(e){return e.dirty=i},f=function(e){e.availableWidth=e.element.parentNode.clientWidth,e.currentWidth=e.element.scrollWidth,e.previousFontSize=e.currentFontSize,e.currentFontSize=Math.min(Math.max(e.minSize,e.availableWidth/e.currentWidth*e.previousFontSize),e.maxSize),e.whiteSpace=e.multiLine&&e.currentFontSize===e.minSize?\"normal\":\"nowrap\"},v=function(e){return e.dirty!==a||e.dirty===a&&e.element.parentNode.clientWidth!==e.availableWidth},g=function(t){var n=e.getComputedStyle(t.element,null);t.currentFontSize=parseInt(n.getPropertyValue(\"font-size\"),10),t.display=n.getPropertyValue(\"display\"),t.whiteSpace=n.getPropertyValue(\"white-space\")},p=function(e){var t=!1;return!e.preStyleTestCompleted&&(/inline-/.test(e.display)||(t=!0,e.display=\"inline-block\"),\"nowrap\"!==e.whiteSpace&&(t=!0,e.whiteSpace=\"nowrap\"),e.preStyleTestCompleted=!0,t)},m=function(e){e.originalStyle||(e.originalStyle=e.element.getAttribute(\"style\")||\"\"),e.element.style.cssText=e.originalStyle+\";white-space:\"+e.whiteSpace+\";display:\"+e.display+\";font-size:\"+e.currentFontSize+\"px\"},y=function(e){e.element.dispatchEvent(new CustomEvent(\"fit\",{detail:{oldValue:e.previousFontSize,newValue:e.currentFontSize,scaleFactor:e.currentFontSize/e.previousFontSize}}))},b=function(e,t){return function(){e.dirty=t,e.active&&u()}},w=function(e){return function(){s=s.filter((function(t){return t.element!==e.element})),e.observeMutations&&e.observer.disconnect(),e.element.style.cssText=e.originalStyle}},S=function(e){return function(){e.active||(e.active=!0,u())}},E=function(e){return function(){return e.active=!1}},k=function(e){e.observeMutations&&(e.observer=new MutationObserver(b(e,r)),e.observer.observe(e.element,e.observeMutations))},A={minSize:16,maxSize:512,multiLine:!0,observeMutations:\"MutationObserver\"in e&&{subtree:!0,childList:!0,characterData:!0}},R=null,x=function(){e.clearTimeout(R),R=e.setTimeout(c(a),P.observeWindowDelay)},L=[\"resize\",\"orientationchange\"];return Object.defineProperty(P,\"observeWindow\",{set:function(t){var n=(t?\"add\":\"remove\")+\"EventListener\";L.forEach((function(t){e[n](t,x)}))}}),P.observeWindow=!0,P.observeWindowDelay=100,P.fitAll=c(o),P}function C(e,t){var i=n({},A,t),r=e.map((function(e){var t=n({},i,{element:e,active:!0});return function(e){k(e),e.newbie=!0,e.dirty=!0,s.push(e)}(t),{element:e,fit:b(t,o),unfreeze:S(t),freeze:E(t),unsubscribe:w(t)}}));return u(),r}function P(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return\"string\"==typeof e?C(t(document.querySelectorAll(e)),n):C([e],n)[0]}}(\"undefined\"==typeof window?null:window)}))),Ho=function(){function e(t){eo(this,e),this.Reveal=t,this.startEmbeddedIframe=this.startEmbeddedIframe.bind(this)}return no(e,[{key:\"shouldPreload\",value:function(e){var t=this.Reveal.getConfig().preloadIframes;return\"boolean\"!=typeof t&&(t=e.hasAttribute(\"data-preload\")),t}},{key:\"load\",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};e.style.display=this.Reveal.getConfig().display,So(e,\"img[data-src], video[data-src], audio[data-src], iframe[data-src]\").forEach((function(e){(\"IFRAME\"!==e.tagName||t.shouldPreload(e))&&(e.setAttribute(\"src\",e.getAttribute(\"data-src\")),e.setAttribute(\"data-lazy-loaded\",\"\"),e.removeAttribute(\"data-src\"))})),So(e,\"video, audio\").forEach((function(e){var t=0;So(e,\"source[data-src]\").forEach((function(e){e.setAttribute(\"src\",e.getAttribute(\"data-src\")),e.removeAttribute(\"data-src\"),e.setAttribute(\"data-lazy-loaded\",\"\"),t+=1})),Oo&&\"VIDEO\"===e.tagName&&e.setAttribute(\"playsinline\",\"\"),t>0&&e.load()}));var i=e.slideBackgroundElement;if(i){i.style.display=\"block\";var r=e.slideBackgroundContentElement,a=e.getAttribute(\"data-background-iframe\");if(!1===i.hasAttribute(\"data-loaded\")){i.setAttribute(\"data-loaded\",\"true\");var o=e.getAttribute(\"data-background-image\"),s=e.getAttribute(\"data-background-video\"),l=e.hasAttribute(\"data-background-video-loop\"),u=e.hasAttribute(\"data-background-video-muted\");if(o)r.style.backgroundImage=\"url(\"+encodeURI(o)+\")\";else if(s&&!this.Reveal.isSpeakerNotes()){var c=document.createElement(\"video\");l&&c.setAttribute(\"loop\",\"\"),u&&(c.muted=!0),Oo&&(c.muted=!0,c.setAttribute(\"playsinline\",\"\")),s.split(\",\").forEach((function(e){c.innerHTML+='<source src=\"'+e+'\">'})),r.appendChild(c)}else if(a&&!0!==n.excludeIframes){var d=document.createElement(\"iframe\");d.setAttribute(\"allowfullscreen\",\"\"),d.setAttribute(\"mozallowfullscreen\",\"\"),d.setAttribute(\"webkitallowfullscreen\",\"\"),d.setAttribute(\"allow\",\"autoplay\"),d.setAttribute(\"data-src\",a),d.style.width=\"100%\",d.style.height=\"100%\",d.style.maxHeight=\"100%\",d.style.maxWidth=\"100%\",r.appendChild(d)}}var h=r.querySelector(\"iframe[data-src]\");h&&this.shouldPreload(i)&&!/autoplay=(1|true|yes)/gi.test(a)&&h.getAttribute(\"src\")!==a&&h.setAttribute(\"src\",a)}Array.from(e.querySelectorAll(\".r-fit-text:not([data-fitted])\")).forEach((function(e){e.dataset.fitted=\"\",zo(e,{minSize:24,maxSize:.8*t.Reveal.getConfig().height,observeMutations:!1,observeWindow:!1})}))}},{key:\"unload\",value:function(e){e.style.display=\"none\";var t=this.Reveal.getSlideBackground(e);t&&(t.style.display=\"none\",So(t,\"iframe[src]\").forEach((function(e){e.removeAttribute(\"src\")}))),So(e,\"video[data-lazy-loaded][src], audio[data-lazy-loaded][src], iframe[data-lazy-loaded][src]\").forEach((function(e){e.setAttribute(\"data-src\",e.getAttribute(\"src\")),e.removeAttribute(\"src\")})),So(e,\"video[data-lazy-loaded] source[src], audio source[src]\").forEach((function(e){e.setAttribute(\"data-src\",e.getAttribute(\"src\")),e.removeAttribute(\"src\")}))}},{key:\"formatEmbeddedContent\",value:function(){var e=this,t=function(t,n,i){So(e.Reveal.getSlidesElement(),\"iframe[\"+t+'*=\"'+n+'\"]').forEach((function(e){var n=e.getAttribute(t);n&&-1===n.indexOf(i)&&e.setAttribute(t,n+(/\\?/.test(n)?\"&\":\"?\")+i)}))};t(\"src\",\"youtube.com/embed/\",\"enablejsapi=1\"),t(\"data-src\",\"youtube.com/embed/\",\"enablejsapi=1\"),t(\"src\",\"player.vimeo.com/\",\"api=1\"),t(\"data-src\",\"player.vimeo.com/\",\"api=1\")}},{key:\"startEmbeddedContent\",value:function(e){var t=this;e&&!this.Reveal.isSpeakerNotes()&&(So(e,'img[src$=\".gif\"]').forEach((function(e){e.setAttribute(\"src\",e.getAttribute(\"src\"))})),So(e,\"video, audio\").forEach((function(e){if(!xo(e,\".fragment\")||xo(e,\".fragment.visible\")){var n=t.Reveal.getConfig().autoPlayMedia;if(\"boolean\"!=typeof n&&(n=e.hasAttribute(\"data-autoplay\")||!!xo(e,\".slide-background\")),n&&\"function\"==typeof e.play)if(e.readyState>1)t.startEmbeddedMedia({target:e});else if(Oo){var i=e.play();i&&\"function\"==typeof i.catch&&!1===e.controls&&i.catch((function(){e.controls=!0,e.addEventListener(\"play\",(function(){e.controls=!1}))}))}else e.removeEventListener(\"loadeddata\",t.startEmbeddedMedia),e.addEventListener(\"loadeddata\",t.startEmbeddedMedia)}})),So(e,\"iframe[src]\").forEach((function(e){xo(e,\".fragment\")&&!xo(e,\".fragment.visible\")||t.startEmbeddedIframe({target:e})})),So(e,\"iframe[data-src]\").forEach((function(e){xo(e,\".fragment\")&&!xo(e,\".fragment.visible\")||e.getAttribute(\"src\")!==e.getAttribute(\"data-src\")&&(e.removeEventListener(\"load\",t.startEmbeddedIframe),e.addEventListener(\"load\",t.startEmbeddedIframe),e.setAttribute(\"src\",e.getAttribute(\"data-src\")))})))}},{key:\"startEmbeddedMedia\",value:function(e){var t=!!xo(e.target,\"html\"),n=!!xo(e.target,\".present\");t&&n&&(e.target.currentTime=0,e.target.play()),e.target.removeEventListener(\"loadeddata\",this.startEmbeddedMedia)}},{key:\"startEmbeddedIframe\",value:function(e){var t=e.target;if(t&&t.contentWindow){var n=!!xo(e.target,\"html\"),i=!!xo(e.target,\".present\");if(n&&i){var r=this.Reveal.getConfig().autoPlayMedia;\"boolean\"!=typeof r&&(r=t.hasAttribute(\"data-autoplay\")||!!xo(t,\".slide-background\")),/youtube\\.com\\/embed\\//.test(t.getAttribute(\"src\"))&&r?t.contentWindow.postMessage('{\"event\":\"command\",\"func\":\"playVideo\",\"args\":\"\"}',\"*\"):/player\\.vimeo\\.com\\//.test(t.getAttribute(\"src\"))&&r?t.contentWindow.postMessage('{\"method\":\"play\"}',\"*\"):t.contentWindow.postMessage(\"slide:start\",\"*\")}}}},{key:\"stopEmbeddedContent\",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};n=wo({unloadIframes:!0},n),e&&e.parentNode&&(So(e,\"video, audio\").forEach((function(e){e.hasAttribute(\"data-ignore\")||\"function\"!=typeof e.pause||(e.setAttribute(\"data-paused-by-reveal\",\"\"),e.pause())})),So(e,\"iframe\").forEach((function(e){e.contentWindow&&e.contentWindow.postMessage(\"slide:stop\",\"*\"),e.removeEventListener(\"load\",t.startEmbeddedIframe)})),So(e,'iframe[src*=\"youtube.com/embed/\"]').forEach((function(e){!e.hasAttribute(\"data-ignore\")&&e.contentWindow&&\"function\"==typeof e.contentWindow.postMessage&&e.contentWindow.postMessage('{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}',\"*\")})),So(e,'iframe[src*=\"player.vimeo.com/\"]').forEach((function(e){!e.hasAttribute(\"data-ignore\")&&e.contentWindow&&\"function\"==typeof e.contentWindow.postMessage&&e.contentWindow.postMessage('{\"method\":\"pause\"}',\"*\")})),!0===n.unloadIframes&&So(e,\"iframe[data-src]\").forEach((function(e){e.setAttribute(\"src\",\"about:blank\"),e.removeAttribute(\"src\")})))}}]),e}(),Fo=function(){function e(t){eo(this,e),this.Reveal=t}return no(e,[{key:\"render\",value:function(){this.element=document.createElement(\"div\"),this.element.className=\"slide-number\",this.Reveal.getRevealElement().appendChild(this.element)}},{key:\"configure\",value:function(e,t){var n=\"none\";e.slideNumber&&!this.Reveal.isPrintingPDF()&&(\"all\"===e.showSlideNumber||\"speaker\"===e.showSlideNumber&&this.Reveal.isSpeakerNotes())&&(n=\"block\"),this.element.style.display=n}},{key:\"update\",value:function(){this.Reveal.getConfig().slideNumber&&this.element&&(this.element.innerHTML=this.getSlideNumber())}},{key:\"getSlideNumber\",value:function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.Reveal.getCurrentSlide(),n=this.Reveal.getConfig(),i=\"h.v\";if(\"function\"==typeof n.slideNumber)e=n.slideNumber(t);else{\"string\"==typeof n.slideNumber&&(i=n.slideNumber),/c/.test(i)||1!==this.Reveal.getHorizontalSlides().length||(i=\"c\");var r=t&&\"uncounted\"===t.dataset.visibility?0:1;switch(e=[],i){case\"c\":e.push(this.Reveal.getSlidePastCount(t)+r);break;case\"c/t\":e.push(this.Reveal.getSlidePastCount(t)+r,\"/\",this.Reveal.getTotalSlides());break;default:var a=this.Reveal.getIndices(t);e.push(a.h+r);var o=\"h/v\"===i?\"/\":\".\";this.Reveal.isVerticalSlide(t)&&e.push(o,a.v+1)}}var s=\"#\"+this.Reveal.location.getHash(t);return this.formatNumber(e[0],e[1],e[2],s)}},{key:\"formatNumber\",value:function(e,t,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"#\"+this.Reveal.location.getHash();return\"number\"!=typeof n||isNaN(n)?'<a href=\"'.concat(i,'\">\\n\\t\\t\\t\\t\\t<span class=\"slide-number-a\">').concat(e,\"</span>\\n\\t\\t\\t\\t\\t</a>\"):'<a href=\"'.concat(i,'\">\\n\\t\\t\\t\\t\\t<span class=\"slide-number-a\">').concat(e,'</span>\\n\\t\\t\\t\\t\\t<span class=\"slide-number-delimiter\">').concat(t,'</span>\\n\\t\\t\\t\\t\\t<span class=\"slide-number-b\">').concat(n,\"</span>\\n\\t\\t\\t\\t\\t</a>\")}}]),e}(),Uo=function(e){var t=e.match(/^#([0-9a-f]{3})$/i);if(t&&t[1])return t=t[1],{r:17*parseInt(t.charAt(0),16),g:17*parseInt(t.charAt(1),16),b:17*parseInt(t.charAt(2),16)};var n=e.match(/^#([0-9a-f]{6})$/i);if(n&&n[1])return n=n[1],{r:parseInt(n.substr(0,2),16),g:parseInt(n.substr(2,2),16),b:parseInt(n.substr(4,2),16)};var i=e.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/i);if(i)return{r:parseInt(i[1],10),g:parseInt(i[2],10),b:parseInt(i[3],10)};var r=e.match(/^rgba\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\,\\s*([\\d]+|[\\d]*.[\\d]+)\\s*\\)$/i);return r?{r:parseInt(r[1],10),g:parseInt(r[2],10),b:parseInt(r[3],10),a:parseFloat(r[4])}:null},Bo=function(){function e(t){eo(this,e),this.Reveal=t}return no(e,[{key:\"render\",value:function(){this.element=document.createElement(\"div\"),this.element.className=\"backgrounds\",this.Reveal.getRevealElement().appendChild(this.element)}},{key:\"create\",value:function(){var e=this;this.Reveal.isPrintingPDF();this.element.innerHTML=\"\",this.element.classList.add(\"no-transition\"),this.Reveal.getHorizontalSlides().forEach((function(t){var n=e.createBackground(t,e.element);So(t,\"section\").forEach((function(t){e.createBackground(t,n),n.classList.add(\"stack\")}))})),this.Reveal.getConfig().parallaxBackgroundImage?(this.element.style.backgroundImage='url(\"'+this.Reveal.getConfig().parallaxBackgroundImage+'\")',this.element.style.backgroundSize=this.Reveal.getConfig().parallaxBackgroundSize,this.element.style.backgroundRepeat=this.Reveal.getConfig().parallaxBackgroundRepeat,this.element.style.backgroundPosition=this.Reveal.getConfig().parallaxBackgroundPosition,setTimeout((function(){e.Reveal.getRevealElement().classList.add(\"has-parallax-background\")}),1)):(this.element.style.backgroundImage=\"\",this.Reveal.getRevealElement().classList.remove(\"has-parallax-background\"))}},{key:\"createBackground\",value:function(e,t){var n=document.createElement(\"div\");n.className=\"slide-background \"+e.className.replace(/present|past|future/,\"\");var i=document.createElement(\"div\");return i.className=\"slide-background-content\",n.appendChild(i),t.appendChild(n),e.slideBackgroundElement=n,e.slideBackgroundContentElement=i,this.sync(e),n}},{key:\"sync\",value:function(e){var t=e.slideBackgroundElement,n=e.slideBackgroundContentElement;e.classList.remove(\"has-dark-background\"),e.classList.remove(\"has-light-background\"),t.removeAttribute(\"data-loaded\"),t.removeAttribute(\"data-background-hash\"),t.removeAttribute(\"data-background-size\"),t.removeAttribute(\"data-background-transition\"),t.style.backgroundColor=\"\",n.style.backgroundSize=\"\",n.style.backgroundRepeat=\"\",n.style.backgroundPosition=\"\",n.style.backgroundImage=\"\",n.style.opacity=\"\",n.innerHTML=\"\";var i={background:e.getAttribute(\"data-background\"),backgroundSize:e.getAttribute(\"data-background-size\"),backgroundImage:e.getAttribute(\"data-background-image\"),backgroundVideo:e.getAttribute(\"data-background-video\"),backgroundIframe:e.getAttribute(\"data-background-iframe\"),backgroundColor:e.getAttribute(\"data-background-color\"),backgroundRepeat:e.getAttribute(\"data-background-repeat\"),backgroundPosition:e.getAttribute(\"data-background-position\"),backgroundTransition:e.getAttribute(\"data-background-transition\"),backgroundOpacity:e.getAttribute(\"data-background-opacity\")};i.background&&(/^(http|file|\\/\\/)/gi.test(i.background)||/\\.(svg|png|jpg|jpeg|gif|bmp)([?#\\s]|$)/gi.test(i.background)?e.setAttribute(\"data-background-image\",i.background):t.style.background=i.background),(i.background||i.backgroundColor||i.backgroundImage||i.backgroundVideo||i.backgroundIframe)&&t.setAttribute(\"data-background-hash\",i.background+i.backgroundSize+i.backgroundImage+i.backgroundVideo+i.backgroundIframe+i.backgroundColor+i.backgroundRepeat+i.backgroundPosition+i.backgroundTransition+i.backgroundOpacity),i.backgroundSize&&t.setAttribute(\"data-background-size\",i.backgroundSize),i.backgroundColor&&(t.style.backgroundColor=i.backgroundColor),i.backgroundTransition&&t.setAttribute(\"data-background-transition\",i.backgroundTransition),e.hasAttribute(\"data-preload\")&&t.setAttribute(\"data-preload\",\"\"),i.backgroundSize&&(n.style.backgroundSize=i.backgroundSize),i.backgroundRepeat&&(n.style.backgroundRepeat=i.backgroundRepeat),i.backgroundPosition&&(n.style.backgroundPosition=i.backgroundPosition),i.backgroundOpacity&&(n.style.opacity=i.backgroundOpacity);var r,a=i.backgroundColor;if(!a){var o=window.getComputedStyle(t);o&&o.backgroundColor&&(a=o.backgroundColor)}if(a){var s=Uo(a);s&&0!==s.a&&(\"string\"==typeof(r=a)&&(r=Uo(r)),(r?(299*r.r+587*r.g+114*r.b)/1e3:null)<128?e.classList.add(\"has-dark-background\"):e.classList.add(\"has-light-background\"))}}},{key:\"update\",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=this.Reveal.getCurrentSlide(),i=this.Reveal.getIndices(),r=null,a=this.Reveal.getConfig().rtl?\"future\":\"past\",o=this.Reveal.getConfig().rtl?\"past\":\"future\";if(Array.from(this.element.childNodes).forEach((function(e,n){e.classList.remove(\"past\",\"present\",\"future\"),n<i.h?e.classList.add(a):n>i.h?e.classList.add(o):(e.classList.add(\"present\"),r=e),(t||n===i.h)&&So(e,\".slide-background\").forEach((function(e,t){e.classList.remove(\"past\",\"present\",\"future\"),t<i.v?e.classList.add(\"past\"):t>i.v?e.classList.add(\"future\"):(e.classList.add(\"present\"),n===i.h&&(r=e))}))})),this.previousBackground&&this.Reveal.slideContent.stopEmbeddedContent(this.previousBackground,{unloadIframes:!this.Reveal.slideContent.shouldPreload(this.previousBackground)}),r){this.Reveal.slideContent.startEmbeddedContent(r);var s=r.querySelector(\".slide-background-content\");if(s){var l=s.style.backgroundImage||\"\";/\\.gif/i.test(l)&&(s.style.backgroundImage=\"\",window.getComputedStyle(s).opacity,s.style.backgroundImage=l)}var u=this.previousBackground?this.previousBackground.getAttribute(\"data-background-hash\"):null,c=r.getAttribute(\"data-background-hash\");c&&c===u&&r!==this.previousBackground&&this.element.classList.add(\"no-transition\"),this.previousBackground=r}n&&[\"has-light-background\",\"has-dark-background\"].forEach((function(t){n.classList.contains(t)?e.Reveal.getRevealElement().classList.add(t):e.Reveal.getRevealElement().classList.remove(t)}),this),setTimeout((function(){e.element.classList.remove(\"no-transition\")}),1)}},{key:\"updateParallax\",value:function(){var e=this.Reveal.getIndices();if(this.Reveal.getConfig().parallaxBackgroundImage){var t,n,i=this.Reveal.getHorizontalSlides(),r=this.Reveal.getVerticalSlides(),a=this.element.style.backgroundSize.split(\" \");1===a.length?t=n=parseInt(a[0],10):(t=parseInt(a[0],10),n=parseInt(a[1],10));var o,s=this.element.offsetWidth,l=i.length;o=(\"number\"==typeof this.Reveal.getConfig().parallaxBackgroundHorizontal?this.Reveal.getConfig().parallaxBackgroundHorizontal:l>1?(t-s)/(l-1):0)*e.h*-1;var u,c,d=this.element.offsetHeight,h=r.length;u=\"number\"==typeof this.Reveal.getConfig().parallaxBackgroundVertical?this.Reveal.getConfig().parallaxBackgroundVertical:(n-d)/(h-1),c=h>0?u*e.v:0,this.element.style.backgroundPosition=o+\"px \"+-c+\"px\"}}}]),e}(),qo=lt.filter,Wo=Je(\"filter\"),_o=ft(\"filter\");Oe({target:\"Array\",proto:!0,forced:!Wo||!_o},{filter:function(e){return qo(this,e,arguments.length>1?arguments[1]:void 0)}});var Vo=[].join,Ko=v!=Object,$o=ut(\"join\",\",\");Oe({target:\"Array\",proto:!0,forced:Ko||!$o},{join:function(e){return Vo.call(p(this),void 0===e?\",\":e)}});var Xo=function(e){return function(t,n,i,r){rt(n);var a=De(t),o=v(a),s=de(a.length),l=e?s-1:0,u=e?-1:1;if(i<2)for(;;){if(l in o){r=o[l],l+=u;break}if(l+=u,e?l<0:s<=l)throw TypeError(\"Reduce of empty array with no initial value\")}for(;e?l>=0:s>l;l+=u)l in o&&(r=n(r,o[l],l,a));return r}},Yo={left:Xo(!1),right:Xo(!0)}.left,Go=ut(\"reduce\"),Jo=ft(\"reduce\",{1:0});Oe({target:\"Array\",proto:!0,forced:!Go||!Jo},{reduce:function(e){return Yo(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}});var Qo=Je(\"slice\"),Zo=ft(\"slice\",{ACCESSORS:!0,0:0,1:2}),es=qe(\"species\"),ts=[].slice,ns=Math.max;Oe({target:\"Array\",proto:!0,forced:!Qo||!Zo},{slice:function(e,t){var n,i,r,a=p(this),o=de(a.length),s=ve(e,o),l=ve(void 0===t?o:t,o);if(Te(a)&&(\"function\"!=typeof(n=a.constructor)||n!==Array&&!Te(n.prototype)?m(n)&&null===(n=n[es])&&(n=void 0):n=void 0,n===Array||void 0===n))return ts.call(a,s,l);for(i=new(void 0===n?Array:n)(ns(l-s,0)),r=0;s<l;s++,r++)s in a&&je(i,r,a[s]);return i.length=r,i}});var is=a((function(){St(1)}));Oe({target:\"Object\",stat:!0,forced:is},{keys:function(e){return St(De(e))}});var rs=0,as=function(){function e(t){eo(this,e),this.Reveal=t}return no(e,[{key:\"run\",value:function(e,t){var n=this;if(this.reset(),e.hasAttribute(\"data-auto-animate\")&&t.hasAttribute(\"data-auto-animate\")){this.autoAnimateStyleSheet=this.autoAnimateStyleSheet||Co();var i=this.getAutoAnimateOptions(t);e.dataset.autoAnimate=\"pending\",t.dataset.autoAnimate=\"pending\";var r=this.Reveal.getSlides();i.slideDirection=r.indexOf(t)>r.indexOf(e)?\"forward\":\"backward\";var a=this.getAutoAnimatableElements(e,t).map((function(e){return n.autoAnimateElements(e.from,e.to,e.options||{},i,rs++)}));if(\"false\"!==t.dataset.autoAnimateUnmatched&&!0===this.Reveal.getConfig().autoAnimateUnmatched){var o=.8*i.duration,s=.2*i.duration;this.getUnmatchedAutoAnimateElements(t).forEach((function(e){var t=n.getAutoAnimateOptions(e,i),r=\"unmatched\";t.duration===i.duration&&t.delay===i.delay||(r=\"unmatched-\"+rs++,a.push('[data-auto-animate=\"running\"] [data-auto-animate-target=\"'.concat(r,'\"] { transition: opacity ').concat(t.duration,\"s ease \").concat(t.delay,\"s; }\"))),e.dataset.autoAnimateTarget=r}),this),a.push('[data-auto-animate=\"running\"] [data-auto-animate-target=\"unmatched\"] { transition: opacity '.concat(o,\"s ease \").concat(s,\"s; }\"))}this.autoAnimateStyleSheet.innerHTML=a.join(\"\"),requestAnimationFrame((function(){n.autoAnimateStyleSheet&&(getComputedStyle(n.autoAnimateStyleSheet).fontWeight,t.dataset.autoAnimate=\"running\")})),this.Reveal.dispatchEvent({type:\"autoanimate\",data:{fromSlide:e,toSlide:t,sheet:this.autoAnimateStyleSheet}})}}},{key:\"reset\",value:function(){So(this.Reveal.getRevealElement(),'[data-auto-animate]:not([data-auto-animate=\"\"])').forEach((function(e){e.dataset.autoAnimate=\"\"})),So(this.Reveal.getRevealElement(),\"[data-auto-animate-target]\").forEach((function(e){delete e.dataset.autoAnimateTarget})),this.autoAnimateStyleSheet&&this.autoAnimateStyleSheet.parentNode&&(this.autoAnimateStyleSheet.parentNode.removeChild(this.autoAnimateStyleSheet),this.autoAnimateStyleSheet=null)}},{key:\"autoAnimateElements\",value:function(e,t,n,i,r){e.dataset.autoAnimateTarget=\"\",t.dataset.autoAnimateTarget=r;var a=this.getAutoAnimateOptions(t,i);void 0!==n.delay&&(a.delay=n.delay),void 0!==n.duration&&(a.duration=n.duration),void 0!==n.easing&&(a.easing=n.easing);var o=this.getAutoAnimatableProperties(\"from\",e,n),s=this.getAutoAnimatableProperties(\"to\",t,n);t.classList.contains(\"fragment\")&&(delete s.styles.opacity,e.classList.contains(\"fragment\")&&(e.className.match(fo)||[\"\"])[0]===(t.className.match(fo)||[\"\"])[0]&&\"forward\"===i.slideDirection&&t.classList.add(\"visible\",\"disabled\"));if(!1!==n.translate||!1!==n.scale){var l=this.Reveal.getScale(),u={x:(o.x-s.x)/l,y:(o.y-s.y)/l,scaleX:o.width/s.width,scaleY:o.height/s.height};u.x=Math.round(1e3*u.x)/1e3,u.y=Math.round(1e3*u.y)/1e3,u.scaleX=Math.round(1e3*u.scaleX)/1e3,u.scaleX=Math.round(1e3*u.scaleX)/1e3;var c=!1!==n.translate&&(0!==u.x||0!==u.y),d=!1!==n.scale&&(0!==u.scaleX||0!==u.scaleY);if(c||d){var h=[];c&&h.push(\"translate(\".concat(u.x,\"px, \").concat(u.y,\"px)\")),d&&h.push(\"scale(\".concat(u.scaleX,\", \").concat(u.scaleY,\")\")),o.styles.transform=h.join(\" \"),o.styles[\"transform-origin\"]=\"top left\",s.styles.transform=\"none\"}}for(var f in s.styles){var v=s.styles[f],g=o.styles[f];v===g?delete s.styles[f]:(!0===v.explicitValue&&(s.styles[f]=v.value),!0===g.explicitValue&&(o.styles[f]=g.value))}var p=\"\",m=Object.keys(s.styles);m.length>0&&(o.styles.transition=\"none\",s.styles.transition=\"all \".concat(a.duration,\"s \").concat(a.easing,\" \").concat(a.delay,\"s\"),s.styles[\"transition-property\"]=m.join(\", \"),s.styles[\"will-change\"]=m.join(\", \"),p='[data-auto-animate-target=\"'+r+'\"] {'+Object.keys(o.styles).map((function(e){return e+\": \"+o.styles[e]+\" !important;\"})).join(\"\")+'}[data-auto-animate=\"running\"] [data-auto-animate-target=\"'+r+'\"] {'+Object.keys(s.styles).map((function(e){return e+\": \"+s.styles[e]+\" !important;\"})).join(\"\")+\"}\");return p}},{key:\"getAutoAnimateOptions\",value:function(e,t){var n={easing:this.Reveal.getConfig().autoAnimateEasing,duration:this.Reveal.getConfig().autoAnimateDuration,delay:0};if(n=wo(n,t),e.parentNode){var i=xo(e.parentNode,\"[data-auto-animate-target]\");i&&(n=this.getAutoAnimateOptions(i,n))}return e.dataset.autoAnimateEasing&&(n.easing=e.dataset.autoAnimateEasing),e.dataset.autoAnimateDuration&&(n.duration=parseFloat(e.dataset.autoAnimateDuration)),e.dataset.autoAnimateDelay&&(n.delay=parseFloat(e.dataset.autoAnimateDelay)),n}},{key:\"getAutoAnimatableProperties\",value:function(e,t,n){var i=this.Reveal.getConfig(),r={styles:[]};if(!1!==n.translate||!1!==n.scale){var a;if(\"function\"==typeof n.measure)a=n.measure(t);else if(i.center)a=t.getBoundingClientRect();else{var o=this.Reveal.getScale();a={x:t.offsetLeft*o,y:t.offsetTop*o,width:t.offsetWidth*o,height:t.offsetHeight*o}}r.x=a.x,r.y=a.y,r.width=a.width,r.height=a.height}var s=getComputedStyle(t);return(n.styles||i.autoAnimateStyles).forEach((function(t){var n;\"string\"==typeof t&&(t={property:t}),\"\"!==(n=void 0!==t.from&&\"from\"===e?{value:t.from,explicitValue:!0}:void 0!==t.to&&\"to\"===e?{value:t.to,explicitValue:!0}:s[t.property])&&(r.styles[t.property]=n)})),r}},{key:\"getAutoAnimatableElements\",value:function(e,t){var n=(\"function\"==typeof this.Reveal.getConfig().autoAnimateMatcher?this.Reveal.getConfig().autoAnimateMatcher:this.getAutoAnimatePairs).call(this,e,t),i=[];return n.filter((function(e,t){if(-1===i.indexOf(e.to))return i.push(e.to),!0}))}},{key:\"getAutoAnimatePairs\",value:function(e,t){var n=this,i=[],r=\"h1, h2, h3, h4, h5, h6, p, li\";return this.findAutoAnimateMatches(i,e,t,\"[data-id]\",(function(e){return e.nodeName+\":::\"+e.getAttribute(\"data-id\")})),this.findAutoAnimateMatches(i,e,t,r,(function(e){return e.nodeName+\":::\"+e.innerText})),this.findAutoAnimateMatches(i,e,t,\"img, video, iframe\",(function(e){return e.nodeName+\":::\"+(e.getAttribute(\"src\")||e.getAttribute(\"data-src\"))})),this.findAutoAnimateMatches(i,e,t,\"pre\",(function(e){return e.nodeName+\":::\"+e.innerText})),i.forEach((function(e){Ro(e.from,r)?e.options={scale:!1}:Ro(e.from,\"pre\")&&(e.options={scale:!1,styles:[\"width\",\"height\"]},n.findAutoAnimateMatches(i,e.from,e.to,\".hljs .hljs-ln-code\",(function(e){return e.textContent}),{scale:!1,styles:[],measure:n.getLocalBoundingBox.bind(n)}),n.findAutoAnimateMatches(i,e.from,e.to,\".hljs .hljs-ln-line[data-line-number]\",(function(e){return e.getAttribute(\"data-line-number\")}),{scale:!1,styles:[\"width\"],measure:n.getLocalBoundingBox.bind(n)}))}),this),i}},{key:\"getLocalBoundingBox\",value:function(e){var t=this.Reveal.getScale();return{x:Math.round(e.offsetLeft*t*100)/100,y:Math.round(e.offsetTop*t*100)/100,width:Math.round(e.offsetWidth*t*100)/100,height:Math.round(e.offsetHeight*t*100)/100}}},{key:\"findAutoAnimateMatches\",value:function(e,t,n,i,r,a){var o={},s={};[].slice.call(t.querySelectorAll(i)).forEach((function(e,t){var n=r(e);\"string\"==typeof n&&n.length&&(o[n]=o[n]||[],o[n].push(e))})),[].slice.call(n.querySelectorAll(i)).forEach((function(t,n){var i,l=r(t);if(s[l]=s[l]||[],s[l].push(t),o[l]){var u=s[l].length-1,c=o[l].length-1;o[l][u]?(i=o[l][u],o[l][u]=null):o[l][c]&&(i=o[l][c],o[l][c]=null)}i&&e.push({from:i,to:t,options:a})}))}},{key:\"getUnmatchedAutoAnimateElements\",value:function(e){var t=this;return[].slice.call(e.children).reduce((function(e,n){var i=n.querySelector(\"[data-auto-animate-target]\");return n.hasAttribute(\"data-auto-animate-target\")||i||e.push(n),n.querySelector(\"[data-auto-animate-target]\")&&(e=e.concat(t.getUnmatchedAutoAnimateElements(n))),e}),[])}}]),e}(),os=function(){function e(t){eo(this,e),this.Reveal=t}return no(e,[{key:\"configure\",value:function(e,t){!1===e.fragments?this.disable():!1===t.fragments&&this.enable()}},{key:\"disable\",value:function(){So(this.Reveal.getSlidesElement(),\".fragment\").forEach((function(e){e.classList.add(\"visible\"),e.classList.remove(\"current-fragment\")}))}},{key:\"enable\",value:function(){So(this.Reveal.getSlidesElement(),\".fragment\").forEach((function(e){e.classList.remove(\"visible\"),e.classList.remove(\"current-fragment\")}))}},{key:\"availableRoutes\",value:function(){var e=this.Reveal.getCurrentSlide();if(e&&this.Reveal.getConfig().fragments){var t=e.querySelectorAll(\".fragment:not(.disabled)\"),n=e.querySelectorAll(\".fragment:not(.disabled):not(.visible)\");return{prev:t.length-n.length>0,next:!!n.length}}return{prev:!1,next:!1}}},{key:\"sort\",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e=Array.from(e);var n=[],i=[],r=[];e.forEach((function(e){if(e.hasAttribute(\"data-fragment-index\")){var t=parseInt(e.getAttribute(\"data-fragment-index\"),10);n[t]||(n[t]=[]),n[t].push(e)}else i.push([e])})),n=n.concat(i);var a=0;return n.forEach((function(e){e.forEach((function(e){r.push(e),e.setAttribute(\"data-fragment-index\",a)})),a++})),!0===t?n:r}},{key:\"sortAll\",value:function(){var e=this;this.Reveal.getHorizontalSlides().forEach((function(t){var n=So(t,\"section\");n.forEach((function(t,n){e.sort(t.querySelectorAll(\".fragment\"))}),e),0===n.length&&e.sort(t.querySelectorAll(\".fragment\"))}))}},{key:\"update\",value:function(e,t){var n=this,i={shown:[],hidden:[]},r=this.Reveal.getCurrentSlide();if(r&&this.Reveal.getConfig().fragments&&(t=t||this.sort(r.querySelectorAll(\".fragment\"))).length){var a=0;if(\"number\"!=typeof e){var o=this.sort(r.querySelectorAll(\".fragment.visible\")).pop();o&&(e=parseInt(o.getAttribute(\"data-fragment-index\")||0,10))}Array.from(t).forEach((function(t,r){if(t.hasAttribute(\"data-fragment-index\")&&(r=parseInt(t.getAttribute(\"data-fragment-index\"),10)),a=Math.max(a,r),r<=e){var o=t.classList.contains(\"visible\");t.classList.add(\"visible\"),t.classList.remove(\"current-fragment\"),r===e&&(n.Reveal.announceStatus(n.Reveal.getStatusText(t)),t.classList.add(\"current-fragment\"),n.Reveal.slideContent.startEmbeddedContent(t)),o||(i.shown.push(t),n.Reveal.dispatchEvent({target:t,type:\"visible\",bubbles:!1}))}else{var s=t.classList.contains(\"visible\");t.classList.remove(\"visible\"),t.classList.remove(\"current-fragment\"),s&&(i.hidden.push(t),n.Reveal.dispatchEvent({target:t,type:\"hidden\",bubbles:!1}))}})),e=\"number\"==typeof e?e:-1,e=Math.max(Math.min(e,a),-1),r.setAttribute(\"data-fragment\",e)}return i}},{key:\"sync\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.Reveal.getCurrentSlide();return this.sort(e.querySelectorAll(\".fragment\"))}},{key:\"goto\",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=this.Reveal.getCurrentSlide();if(n&&this.Reveal.getConfig().fragments){var i=this.sort(n.querySelectorAll(\".fragment:not(.disabled)\"));if(i.length){if(\"number\"!=typeof e){var r=this.sort(n.querySelectorAll(\".fragment:not(.disabled).visible\")).pop();e=r?parseInt(r.getAttribute(\"data-fragment-index\")||0,10):-1}e+=t;var a=this.update(e,i);return a.hidden.length&&this.Reveal.dispatchEvent({type:\"fragmenthidden\",data:{fragment:a.hidden[0],fragments:a.hidden}}),a.shown.length&&this.Reveal.dispatchEvent({type:\"fragmentshown\",data:{fragment:a.shown[0],fragments:a.shown}}),this.Reveal.controls.update(),this.Reveal.progress.update(),this.Reveal.getConfig().fragmentInURL&&this.Reveal.location.writeURL(),!(!a.shown.length&&!a.hidden.length)}}return!1}},{key:\"next\",value:function(){return this.goto(null,1)}},{key:\"prev\",value:function(){return this.goto(null,-1)}}]),e}(),ss=function(){function e(t){eo(this,e),this.Reveal=t,this.active=!1,this.onSlideClicked=this.onSlideClicked.bind(this)}return no(e,[{key:\"activate\",value:function(){var e=this;if(this.Reveal.getConfig().overview&&!this.isActive()){this.active=!0,this.Reveal.getRevealElement().classList.add(\"overview\"),this.Reveal.cancelAutoSlide(),this.Reveal.getSlidesElement().appendChild(this.Reveal.getBackgroundsElement()),So(this.Reveal.getRevealElement(),lo).forEach((function(t){t.classList.contains(\"stack\")||t.addEventListener(\"click\",e.onSlideClicked,!0)}));var t=this.Reveal.getComputedSlideSize();this.overviewSlideWidth=t.width+70,this.overviewSlideHeight=t.height+70,this.Reveal.getConfig().rtl&&(this.overviewSlideWidth=-this.overviewSlideWidth),this.Reveal.updateSlidesVisibility(),this.layout(),this.update(),this.Reveal.layout();var n=this.Reveal.getIndices();this.Reveal.dispatchEvent({type:\"overviewshown\",data:{indexh:n.h,indexv:n.v,currentSlide:this.Reveal.getCurrentSlide()}})}}},{key:\"layout\",value:function(){var e=this;this.Reveal.getHorizontalSlides().forEach((function(t,n){t.setAttribute(\"data-index-h\",n),Ao(t,\"translate3d(\"+n*e.overviewSlideWidth+\"px, 0, 0)\"),t.classList.contains(\"stack\")&&So(t,\"section\").forEach((function(t,i){t.setAttribute(\"data-index-h\",n),t.setAttribute(\"data-index-v\",i),Ao(t,\"translate3d(0, \"+i*e.overviewSlideHeight+\"px, 0)\")}))})),Array.from(this.Reveal.getBackgroundsElement().childNodes).forEach((function(t,n){Ao(t,\"translate3d(\"+n*e.overviewSlideWidth+\"px, 0, 0)\"),So(t,\".slide-background\").forEach((function(t,n){Ao(t,\"translate3d(0, \"+n*e.overviewSlideHeight+\"px, 0)\")}))}))}},{key:\"update\",value:function(){var e=Math.min(window.innerWidth,window.innerHeight),t=Math.max(e/5,150)/e,n=this.Reveal.getIndices();this.Reveal.transformSlides({overview:[\"scale(\"+t+\")\",\"translateX(\"+-n.h*this.overviewSlideWidth+\"px)\",\"translateY(\"+-n.v*this.overviewSlideHeight+\"px)\"].join(\" \")})}},{key:\"deactivate\",value:function(){var e=this;if(this.Reveal.getConfig().overview){this.active=!1,this.Reveal.getRevealElement().classList.remove(\"overview\"),this.Reveal.getRevealElement().classList.add(\"overview-deactivating\"),setTimeout((function(){e.Reveal.getRevealElement().classList.remove(\"overview-deactivating\")}),1),this.Reveal.getRevealElement().appendChild(this.Reveal.getBackgroundsElement()),So(this.Reveal.getRevealElement(),lo).forEach((function(t){Ao(t,\"\"),t.removeEventListener(\"click\",e.onSlideClicked,!0)})),So(this.Reveal.getBackgroundsElement(),\".slide-background\").forEach((function(e){Ao(e,\"\")})),this.Reveal.transformSlides({overview:\"\"});var t=this.Reveal.getIndices();this.Reveal.slide(t.h,t.v),this.Reveal.layout(),this.Reveal.cueAutoSlide(),this.Reveal.dispatchEvent({type:\"overviewhidden\",data:{indexh:t.h,indexv:t.v,currentSlide:this.Reveal.getCurrentSlide()}})}}},{key:\"toggle\",value:function(e){\"boolean\"==typeof e?e?this.activate():this.deactivate():this.isActive()?this.deactivate():this.activate()}},{key:\"isActive\",value:function(){return this.active}},{key:\"onSlideClicked\",value:function(e){if(this.isActive()){e.preventDefault();for(var t=e.target;t&&!t.nodeName.match(/section/gi);)t=t.parentNode;if(t&&!t.classList.contains(\"disabled\")&&(this.deactivate(),t.nodeName.match(/section/gi))){var n=parseInt(t.getAttribute(\"data-index-h\"),10),i=parseInt(t.getAttribute(\"data-index-v\"),10);this.Reveal.slide(n,i)}}}}]),e}(),ls=function(){function e(t){eo(this,e),this.Reveal=t,this.shortcuts={},this.bindings={},this.onDocumentKeyDown=this.onDocumentKeyDown.bind(this),this.onDocumentKeyPress=this.onDocumentKeyPress.bind(this)}return no(e,[{key:\"configure\",value:function(e,t){\"linear\"===e.navigationMode?(this.shortcuts[\"&#8594;  ,  &#8595;  ,  SPACE  ,  N  ,  L  ,  J\"]=\"Next slide\",this.shortcuts[\"&#8592;  ,  &#8593;  ,  P  ,  H  ,  K\"]=\"Previous slide\"):(this.shortcuts[\"N  ,  SPACE\"]=\"Next slide\",this.shortcuts.P=\"Previous slide\",this.shortcuts[\"&#8592;  ,  H\"]=\"Navigate left\",this.shortcuts[\"&#8594;  ,  L\"]=\"Navigate right\",this.shortcuts[\"&#8593;  ,  K\"]=\"Navigate up\",this.shortcuts[\"&#8595;  ,  J\"]=\"Navigate down\"),this.shortcuts[\"Home  ,  Shift &#8592;\"]=\"First slide\",this.shortcuts[\"End  ,  Shift &#8594;\"]=\"Last slide\",this.shortcuts[\"B  ,  .\"]=\"Pause\",this.shortcuts.F=\"Fullscreen\",this.shortcuts[\"ESC, O\"]=\"Slide overview\"}},{key:\"bind\",value:function(){document.addEventListener(\"keydown\",this.onDocumentKeyDown,!1),document.addEventListener(\"keypress\",this.onDocumentKeyPress,!1)}},{key:\"unbind\",value:function(){document.removeEventListener(\"keydown\",this.onDocumentKeyDown,!1),document.removeEventListener(\"keypress\",this.onDocumentKeyPress,!1)}},{key:\"addKeyBinding\",value:function(e,t){\"object\"===Za(e)&&e.keyCode?this.bindings[e.keyCode]={callback:t,key:e.key,description:e.description}:this.bindings[e]={callback:t,key:null,description:null}}},{key:\"removeKeyBinding\",value:function(e){delete this.bindings[e]}},{key:\"triggerKey\",value:function(e){this.onDocumentKeyDown({keyCode:e})}},{key:\"registerKeyboardShortcut\",value:function(e,t){this.shortcuts[e]=t}},{key:\"getShortcuts\",value:function(){return this.shortcuts}},{key:\"getBindings\",value:function(){return this.bindings}},{key:\"onDocumentKeyPress\",value:function(e){e.shiftKey&&63===e.charCode&&this.Reveal.toggleHelp()}},{key:\"onDocumentKeyDown\",value:function(e){var t=this.Reveal.getConfig();if(\"function\"==typeof t.keyboardCondition&&!1===t.keyboardCondition(e))return!0;if(\"focused\"===t.keyboardCondition&&!this.Reveal.isFocused())return!0;var n=e.keyCode,i=!this.Reveal.isAutoSliding();this.Reveal.onUserInput(e);var r=document.activeElement&&!0===document.activeElement.isContentEditable,a=document.activeElement&&document.activeElement.tagName&&/input|textarea/i.test(document.activeElement.tagName),o=document.activeElement&&document.activeElement.className&&/speaker-notes/i.test(document.activeElement.className),s=e.shiftKey&&32===e.keyCode,l=e.shiftKey&&37===n,u=e.shiftKey&&39===n,c=!s&&!l&&!u&&(e.shiftKey||e.altKey||e.ctrlKey||e.metaKey);if(!(r||a||o||c)){var d,h=[66,86,190,191];if(\"object\"===Za(t.keyboard))for(d in t.keyboard)\"togglePause\"===t.keyboard[d]&&h.push(parseInt(d,10));if(this.Reveal.isPaused()&&-1===h.indexOf(n))return!1;var f,v,g=\"linear\"===t.navigationMode||!this.Reveal.hasHorizontalSlides()||!this.Reveal.hasVerticalSlides(),p=!1;if(\"object\"===Za(t.keyboard))for(d in t.keyboard)if(parseInt(d,10)===n){var m=t.keyboard[d];\"function\"==typeof m?m.apply(null,[e]):\"string\"==typeof m&&\"function\"==typeof this.Reveal[m]&&this.Reveal[m].call(),p=!0}if(!1===p)for(d in this.bindings)if(parseInt(d,10)===n){var y=this.bindings[d].callback;\"function\"==typeof y?y.apply(null,[e]):\"string\"==typeof y&&\"function\"==typeof this.Reveal[y]&&this.Reveal[y].call(),p=!0}!1===p&&(p=!0,80===n||33===n?this.Reveal.prev():78===n||34===n?this.Reveal.next():72===n||37===n?l?this.Reveal.slide(0):!this.Reveal.overview.isActive()&&g?this.Reveal.prev():this.Reveal.left():76===n||39===n?u?this.Reveal.slide(Number.MAX_VALUE):!this.Reveal.overview.isActive()&&g?this.Reveal.next():this.Reveal.right():75===n||38===n?!this.Reveal.overview.isActive()&&g?this.Reveal.prev():this.Reveal.up():74===n||40===n?!this.Reveal.overview.isActive()&&g?this.Reveal.next():this.Reveal.down():36===n?this.Reveal.slide(0):35===n?this.Reveal.slide(Number.MAX_VALUE):32===n?(this.Reveal.overview.isActive()&&this.Reveal.overview.deactivate(),e.shiftKey?this.Reveal.prev():this.Reveal.next()):58===n||59===n||66===n||86===n||190===n||191===n?this.Reveal.togglePause():70===n?(f=t.embedded?this.Reveal.getViewportElement():document.documentElement,(v=(f=f||document.documentElement).requestFullscreen||f.webkitRequestFullscreen||f.webkitRequestFullScreen||f.mozRequestFullScreen||f.msRequestFullscreen)&&v.apply(f)):65===n?t.autoSlideStoppable&&this.Reveal.toggleAutoSlide(i):p=!1),p?e.preventDefault&&e.preventDefault():27!==n&&79!==n||(!1===this.Reveal.closeOverlay()&&this.Reveal.overview.toggle(),e.preventDefault&&e.preventDefault()),this.Reveal.cueAutoSlide()}}}]),e}(),us=function(){function e(t){eo(this,e),this.Reveal=t,this.writeURLTimeout=0,this.onWindowHashChange=this.onWindowHashChange.bind(this)}return no(e,[{key:\"bind\",value:function(){window.addEventListener(\"hashchange\",this.onWindowHashChange,!1)}},{key:\"unbind\",value:function(){window.removeEventListener(\"hashchange\",this.onWindowHashChange,!1)}},{key:\"readURL\",value:function(){var e=this.Reveal.getConfig(),t=this.Reveal.getIndices(),n=this.Reveal.getCurrentSlide(),i=window.location.hash,r=i.slice(2).split(\"/\"),a=i.replace(/#\\/?/gi,\"\");if(!/^[0-9]*$/.test(r[0])&&a.length){var o,s;/\\/[-\\d]+$/g.test(a)&&(s=parseInt(a.split(\"/\").pop(),10),s=isNaN(s)?void 0:s,a=a.split(\"/\").shift());try{o=document.getElementById(decodeURIComponent(a))}catch(e){}var l=!!n&&n.getAttribute(\"id\")===a;if(o){if(!l||void 0!==s){var u=this.Reveal.getIndices(o);this.Reveal.slide(u.h,u.v,s)}}else this.Reveal.slide(t.h||0,t.v||0)}else{var c,d=e.hashOneBasedIndex?1:0,h=parseInt(r[0],10)-d||0,f=parseInt(r[1],10)-d||0;e.fragmentInURL&&(c=parseInt(r[2],10),isNaN(c)&&(c=void 0)),h===t.h&&f===t.v&&void 0===c||this.Reveal.slide(h,f,c)}}},{key:\"writeURL\",value:function(e){var t=this.Reveal.getConfig(),n=this.Reveal.getCurrentSlide();if(clearTimeout(this.writeURLTimeout),\"number\"==typeof e)this.writeURLTimeout=setTimeout(this.writeURL,e);else if(n){var i=this.getHash();t.history?window.location.hash=i:t.hash&&(\"/\"===i?window.history.replaceState(null,null,window.location.pathname+window.location.search):window.history.replaceState(null,null,\"#\"+i))}}},{key:\"getHash\",value:function(e){var t=\"/\",n=e||this.Reveal.getCurrentSlide(),i=n?n.getAttribute(\"id\"):null;i&&(i=encodeURIComponent(i));var r=this.Reveal.getIndices(e);if(this.Reveal.getConfig().fragmentInURL||(r.f=void 0),\"string\"==typeof i&&i.length)t=\"/\"+i,r.f>=0&&(t+=\"/\"+r.f);else{var a=this.Reveal.getConfig().hashOneBasedIndex?1:0;(r.h>0||r.v>0||r.f>=0)&&(t+=r.h+a),(r.v>0||r.f>=0)&&(t+=\"/\"+(r.v+a)),r.f>=0&&(t+=\"/\"+r.f)}return t}},{key:\"onWindowHashChange\",value:function(e){this.readURL()}}]),e}(),cs=function(){function e(t){eo(this,e),this.Reveal=t,this.onNavigateLeftClicked=this.onNavigateLeftClicked.bind(this),this.onNavigateRightClicked=this.onNavigateRightClicked.bind(this),this.onNavigateUpClicked=this.onNavigateUpClicked.bind(this),this.onNavigateDownClicked=this.onNavigateDownClicked.bind(this),this.onNavigatePrevClicked=this.onNavigatePrevClicked.bind(this),this.onNavigateNextClicked=this.onNavigateNextClicked.bind(this)}return no(e,[{key:\"render\",value:function(){var e=this.Reveal.getConfig().rtl,t=this.Reveal.getRevealElement();this.element=document.createElement(\"aside\"),this.element.className=\"controls\",this.element.innerHTML='<button class=\"navigate-left\" aria-label=\"'.concat(e?\"next slide\":\"previous slide\",'\"><div class=\"controls-arrow\"></div></button>\\n\\t\\t\\t<button class=\"navigate-right\" aria-label=\"').concat(e?\"previous slide\":\"next slide\",'\"><div class=\"controls-arrow\"></div></button>\\n\\t\\t\\t<button class=\"navigate-up\" aria-label=\"above slide\"><div class=\"controls-arrow\"></div></button>\\n\\t\\t\\t<button class=\"navigate-down\" aria-label=\"below slide\"><div class=\"controls-arrow\"></div></button>'),this.Reveal.getRevealElement().appendChild(this.element),this.controlsLeft=So(t,\".navigate-left\"),this.controlsRight=So(t,\".navigate-right\"),this.controlsUp=So(t,\".navigate-up\"),this.controlsDown=So(t,\".navigate-down\"),this.controlsPrev=So(t,\".navigate-prev\"),this.controlsNext=So(t,\".navigate-next\"),this.controlsRightArrow=this.element.querySelector(\".navigate-right\"),this.controlsLeftArrow=this.element.querySelector(\".navigate-left\"),this.controlsDownArrow=this.element.querySelector(\".navigate-down\")}},{key:\"configure\",value:function(e,t){this.element.style.display=e.controls?\"block\":\"none\",this.element.setAttribute(\"data-controls-layout\",e.controlsLayout),this.element.setAttribute(\"data-controls-back-arrows\",e.controlsBackArrows)}},{key:\"bind\",value:function(){var e=this,t=[\"touchstart\",\"click\"];Do&&(t=[\"touchstart\"]),t.forEach((function(t){e.controlsLeft.forEach((function(n){return n.addEventListener(t,e.onNavigateLeftClicked,!1)})),e.controlsRight.forEach((function(n){return n.addEventListener(t,e.onNavigateRightClicked,!1)})),e.controlsUp.forEach((function(n){return n.addEventListener(t,e.onNavigateUpClicked,!1)})),e.controlsDown.forEach((function(n){return n.addEventListener(t,e.onNavigateDownClicked,!1)})),e.controlsPrev.forEach((function(n){return n.addEventListener(t,e.onNavigatePrevClicked,!1)})),e.controlsNext.forEach((function(n){return n.addEventListener(t,e.onNavigateNextClicked,!1)}))}))}},{key:\"unbind\",value:function(){var e=this;[\"touchstart\",\"click\"].forEach((function(t){e.controlsLeft.forEach((function(n){return n.removeEventListener(t,e.onNavigateLeftClicked,!1)})),e.controlsRight.forEach((function(n){return n.removeEventListener(t,e.onNavigateRightClicked,!1)})),e.controlsUp.forEach((function(n){return n.removeEventListener(t,e.onNavigateUpClicked,!1)})),e.controlsDown.forEach((function(n){return n.removeEventListener(t,e.onNavigateDownClicked,!1)})),e.controlsPrev.forEach((function(n){return n.removeEventListener(t,e.onNavigatePrevClicked,!1)})),e.controlsNext.forEach((function(n){return n.removeEventListener(t,e.onNavigateNextClicked,!1)}))}))}},{key:\"update\",value:function(){var e=this.Reveal.availableRoutes();[].concat(oo(this.controlsLeft),oo(this.controlsRight),oo(this.controlsUp),oo(this.controlsDown),oo(this.controlsPrev),oo(this.controlsNext)).forEach((function(e){e.classList.remove(\"enabled\",\"fragmented\"),e.setAttribute(\"disabled\",\"disabled\")})),e.left&&this.controlsLeft.forEach((function(e){e.classList.add(\"enabled\"),e.removeAttribute(\"disabled\")})),e.right&&this.controlsRight.forEach((function(e){e.classList.add(\"enabled\"),e.removeAttribute(\"disabled\")})),e.up&&this.controlsUp.forEach((function(e){e.classList.add(\"enabled\"),e.removeAttribute(\"disabled\")})),e.down&&this.controlsDown.forEach((function(e){e.classList.add(\"enabled\"),e.removeAttribute(\"disabled\")})),(e.left||e.up)&&this.controlsPrev.forEach((function(e){e.classList.add(\"enabled\"),e.removeAttribute(\"disabled\")})),(e.right||e.down)&&this.controlsNext.forEach((function(e){e.classList.add(\"enabled\"),e.removeAttribute(\"disabled\")}));var t=this.Reveal.getCurrentSlide();if(t){var n=this.Reveal.fragments.availableRoutes();n.prev&&this.controlsPrev.forEach((function(e){e.classList.add(\"fragmented\",\"enabled\"),e.removeAttribute(\"disabled\")})),n.next&&this.controlsNext.forEach((function(e){e.classList.add(\"fragmented\",\"enabled\"),e.removeAttribute(\"disabled\")})),this.Reveal.isVerticalSlide(t)?(n.prev&&this.controlsUp.forEach((function(e){e.classList.add(\"fragmented\",\"enabled\"),e.removeAttribute(\"disabled\")})),n.next&&this.controlsDown.forEach((function(e){e.classList.add(\"fragmented\",\"enabled\"),e.removeAttribute(\"disabled\")}))):(n.prev&&this.controlsLeft.forEach((function(e){e.classList.add(\"fragmented\",\"enabled\"),e.removeAttribute(\"disabled\")})),n.next&&this.controlsRight.forEach((function(e){e.classList.add(\"fragmented\",\"enabled\"),e.removeAttribute(\"disabled\")})))}if(this.Reveal.getConfig().controlsTutorial){var i=this.Reveal.getIndices();!this.Reveal.hasNavigatedVertically()&&e.down?this.controlsDownArrow.classList.add(\"highlight\"):(this.controlsDownArrow.classList.remove(\"highlight\"),this.Reveal.getConfig().rtl?!this.Reveal.hasNavigatedHorizontally()&&e.left&&0===i.v?this.controlsLeftArrow.classList.add(\"highlight\"):this.controlsLeftArrow.classList.remove(\"highlight\"):!this.Reveal.hasNavigatedHorizontally()&&e.right&&0===i.v?this.controlsRightArrow.classList.add(\"highlight\"):this.controlsRightArrow.classList.remove(\"highlight\"))}}},{key:\"onNavigateLeftClicked\",value:function(e){e.preventDefault(),this.Reveal.onUserInput(),\"linear\"===this.Reveal.getConfig().navigationMode?this.Reveal.prev():this.Reveal.left()}},{key:\"onNavigateRightClicked\",value:function(e){e.preventDefault(),this.Reveal.onUserInput(),\"linear\"===this.Reveal.getConfig().navigationMode?this.Reveal.next():this.Reveal.right()}},{key:\"onNavigateUpClicked\",value:function(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.up()}},{key:\"onNavigateDownClicked\",value:function(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.down()}},{key:\"onNavigatePrevClicked\",value:function(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.prev()}},{key:\"onNavigateNextClicked\",value:function(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.next()}}]),e}(),ds=function(){function e(t){eo(this,e),this.Reveal=t,this.onProgressClicked=this.onProgressClicked.bind(this)}return no(e,[{key:\"render\",value:function(){this.element=document.createElement(\"div\"),this.element.className=\"progress\",this.Reveal.getRevealElement().appendChild(this.element),this.bar=document.createElement(\"span\"),this.element.appendChild(this.bar)}},{key:\"configure\",value:function(e,t){this.element.style.display=e.progress?\"block\":\"none\"}},{key:\"bind\",value:function(){this.Reveal.getConfig().progress&&this.element&&this.element.addEventListener(\"click\",this.onProgressClicked,!1)}},{key:\"unbind\",value:function(){this.Reveal.getConfig().progress&&this.element&&this.element.removeEventListener(\"click\",this.onProgressClicked,!1)}},{key:\"update\",value:function(){if(this.Reveal.getConfig().progress&&this.bar){var e=this.Reveal.getProgress();this.Reveal.getTotalSlides()<2&&(e=0),this.bar.style.transform=\"scaleX(\"+e+\")\"}}},{key:\"getMaxWidth\",value:function(){return this.Reveal.getRevealElement().offsetWidth}},{key:\"onProgressClicked\",value:function(e){this.Reveal.onUserInput(e),e.preventDefault();var t=this.Reveal.getHorizontalSlides().length,n=Math.floor(e.clientX/this.getMaxWidth()*t);this.Reveal.getConfig().rtl&&(n=t-n),this.Reveal.slide(n)}}]),e}(),hs=function(){function e(t){eo(this,e),this.Reveal=t,this.lastMouseWheelStep=0,this.cursorHidden=!1,this.cursorInactiveTimeout=0,this.onDocumentCursorActive=this.onDocumentCursorActive.bind(this),this.onDocumentMouseScroll=this.onDocumentMouseScroll.bind(this)}return no(e,[{key:\"configure\",value:function(e,t){e.mouseWheel?(document.addEventListener(\"DOMMouseScroll\",this.onDocumentMouseScroll,!1),document.addEventListener(\"mousewheel\",this.onDocumentMouseScroll,!1)):(document.removeEventListener(\"DOMMouseScroll\",this.onDocumentMouseScroll,!1),document.removeEventListener(\"mousewheel\",this.onDocumentMouseScroll,!1)),e.hideInactiveCursor?(document.addEventListener(\"mousemove\",this.onDocumentCursorActive,!1),document.addEventListener(\"mousedown\",this.onDocumentCursorActive,!1)):(this.showCursor(),document.removeEventListener(\"mousemove\",this.onDocumentCursorActive,!1),document.removeEventListener(\"mousedown\",this.onDocumentCursorActive,!1))}},{key:\"showCursor\",value:function(){this.cursorHidden&&(this.cursorHidden=!1,this.Reveal.getRevealElement().style.cursor=\"\")}},{key:\"hideCursor\",value:function(){!1===this.cursorHidden&&(this.cursorHidden=!0,this.Reveal.getRevealElement().style.cursor=\"none\")}},{key:\"onDocumentCursorActive\",value:function(e){this.showCursor(),clearTimeout(this.cursorInactiveTimeout),this.cursorInactiveTimeout=setTimeout(this.hideCursor.bind(this),this.Reveal.getConfig().hideCursorTime)}},{key:\"onDocumentMouseScroll\",value:function(e){if(Date.now()-this.lastMouseWheelStep>1e3){this.lastMouseWheelStep=Date.now();var t=e.detail||-e.wheelDelta;t>0?this.Reveal.next():t<0&&this.Reveal.prev()}}}]),e}(),fs=u.f,vs=function(e){return function(t){for(var n,i=p(t),r=St(i),a=r.length,s=0,l=[];a>s;)n=r[s++],o&&!fs.call(i,n)||l.push(e?[n,i[n]]:i[n]);return l}},gs={entries:vs(!0),values:vs(!1)}.values;Oe({target:\"Object\",stat:!0},{values:function(e){return gs(e)}});var ps=function(e,t){var n=document.createElement(\"script\");n.type=\"text/javascript\",n.async=!1,n.defer=!1,n.src=e,\"function\"==typeof t&&(n.onload=n.onreadystatechange=function(e){(\"load\"===e.type||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=n.onerror=null,t())},n.onerror=function(e){n.onload=n.onreadystatechange=n.onerror=null,t(new Error(\"Failed loading script: \"+n.src+\"\\n\"+e))});var i=document.querySelector(\"head\");i.insertBefore(n,i.lastChild)},ms=function(){function e(t){eo(this,e),this.Reveal=t,this.state=\"idle\",this.registeredPlugins={},this.asyncDependencies=[]}return no(e,[{key:\"load\",value:function(e,t){var n=this;return this.state=\"loading\",e.forEach(this.registerPlugin.bind(this)),new Promise((function(e){var i=[],r=0;if(t.forEach((function(e){e.condition&&!e.condition()||(e.async?n.asyncDependencies.push(e):i.push(e))})),i.length){r=i.length;var a=function(t){t&&\"function\"==typeof t.callback&&t.callback(),0==--r&&n.initPlugins().then(e)};i.forEach((function(e){\"string\"==typeof e.id?(n.registerPlugin(e),a(e)):\"string\"==typeof e.src?ps(e.src,(function(){return a(e)})):(console.warn(\"Unrecognized plugin format\",e),a())}))}else n.initPlugins().then(e)}))}},{key:\"initPlugins\",value:function(){var e=this;return new Promise((function(t){var n=Object.values(e.registeredPlugins),i=n.length;if(0===i)e.loadAsync().then(t);else{var r,a=function(){0==--i?e.loadAsync().then(t):r()},o=0;(r=function(){var t=n[o++];if(\"function\"==typeof t.init){var i=t.init(e.Reveal);i&&\"function\"==typeof i.then?i.then(a):a()}else a()})()}}))}},{key:\"loadAsync\",value:function(){return this.state=\"loaded\",this.asyncDependencies.length&&this.asyncDependencies.forEach((function(e){ps(e.src,e.callback)})),Promise.resolve()}},{key:\"registerPlugin\",value:function(e){2===arguments.length&&\"string\"==typeof arguments[0]?(e=arguments[1]).id=arguments[0]:\"function\"==typeof e&&(e=e());var t=e.id;\"string\"!=typeof t?console.warn(\"Unrecognized plugin format; can't find plugin.id\",e):void 0===this.registeredPlugins[t]?(this.registeredPlugins[t]=e,\"loaded\"===this.state&&\"function\"==typeof e.init&&e.init(this.Reveal)):console.warn('reveal.js: \"'+t+'\" plugin has already been registered')}},{key:\"hasPlugin\",value:function(e){return!!this.registeredPlugins[e]}},{key:\"getPlugin\",value:function(e){return this.registeredPlugins[e]}},{key:\"getRegisteredPlugins\",value:function(){return this.registeredPlugins}}]),e}(),ys=function(){function e(t){eo(this,e),this.Reveal=t}return no(e,[{key:\"setupPDF\",value:function(){var e=this.Reveal.getConfig(),t=this.Reveal.getComputedSlideSize(window.innerWidth,window.innerHeight),n=Math.floor(t.width*(1+e.margin)),i=Math.floor(t.height*(1+e.margin)),r=t.width,a=t.height;Co(\"@page{size:\"+n+\"px \"+i+\"px; margin: 0px;}\"),Co(\".reveal section>img, .reveal section>video, .reveal section>iframe{max-width: \"+r+\"px; max-height:\"+a+\"px}\"),document.documentElement.classList.add(\"print-pdf\"),document.body.style.width=n+\"px\",document.body.style.height=i+\"px\",this.Reveal.layoutSlideContents(r,a);var o=e.slideNumber&&/all|print/i.test(e.showSlideNumber);So(this.Reveal.getRevealElement(),lo).forEach((function(e){e.setAttribute(\"data-slide-number\",this.Reveal.slideNumber.getSlideNumber(e))}),this),So(this.Reveal.getRevealElement(),lo).forEach((function(t){if(!1===t.classList.contains(\"stack\")){var s=(n-r)/2,l=(i-a)/2,u=t.scrollHeight,c=Math.max(Math.ceil(u/i),1);(1===(c=Math.min(c,e.pdfMaxPagesPerSlide))&&e.center||t.classList.contains(\"center\"))&&(l=Math.max((i-u)/2,0));var d=document.createElement(\"div\");if(d.className=\"pdf-page\",d.style.height=(i+e.pdfPageHeightOffset)*c+\"px\",t.parentNode.insertBefore(d,t),d.appendChild(t),t.style.left=s+\"px\",t.style.top=l+\"px\",t.style.width=r+\"px\",t.slideBackgroundElement&&d.insertBefore(t.slideBackgroundElement,t),e.showNotes){var h=this.Reveal.getSlideNotes(t);if(h){var f=\"string\"==typeof e.showNotes?e.showNotes:\"inline\",v=document.createElement(\"div\");v.classList.add(\"speaker-notes\"),v.classList.add(\"speaker-notes-pdf\"),v.setAttribute(\"data-layout\",f),v.innerHTML=h,\"separate-page\"===f?d.parentNode.insertBefore(v,d.nextSibling):(v.style.left=\"8px\",v.style.bottom=\"8px\",v.style.width=n-16+\"px\",d.appendChild(v))}}if(o){var g=document.createElement(\"div\");g.classList.add(\"slide-number\"),g.classList.add(\"slide-number-pdf\"),g.innerHTML=t.getAttribute(\"data-slide-number\"),d.appendChild(g)}if(e.pdfSeparateFragments){var p,m,y=this.Reveal.fragments.sort(d.querySelectorAll(\".fragment\"),!0);y.forEach((function(e){p&&p.forEach((function(e){e.classList.remove(\"current-fragment\")})),e.forEach((function(e){e.classList.add(\"visible\",\"current-fragment\")}),this);var t=d.cloneNode(!0);d.parentNode.insertBefore(t,(m||d).nextSibling),p=e,m=t}),this),y.forEach((function(e){e.forEach((function(e){e.classList.remove(\"visible\",\"current-fragment\")}))}))}else So(d,\".fragment:not(.fade-out)\").forEach((function(e){e.classList.add(\"visible\")}))}}),this),this.Reveal.dispatchEvent({type:\"pdf-ready\"})}},{key:\"isPrintingPDF\",value:function(){return/print-pdf/gi.test(window.location.search)}}]),e}(),bs=function(){function e(t){eo(this,e),this.Reveal=t,this.touchStartX=0,this.touchStartY=0,this.touchStartCount=0,this.touchCaptured=!1,this.onPointerDown=this.onPointerDown.bind(this),this.onPointerMove=this.onPointerMove.bind(this),this.onPointerUp=this.onPointerUp.bind(this),this.onTouchStart=this.onTouchStart.bind(this),this.onTouchMove=this.onTouchMove.bind(this),this.onTouchEnd=this.onTouchEnd.bind(this)}return no(e,[{key:\"bind\",value:function(){var e=this.Reveal.getRevealElement();\"onpointerdown\"in window?(e.addEventListener(\"pointerdown\",this.onPointerDown,!1),e.addEventListener(\"pointermove\",this.onPointerMove,!1),e.addEventListener(\"pointerup\",this.onPointerUp,!1)):window.navigator.msPointerEnabled?(e.addEventListener(\"MSPointerDown\",this.onPointerDown,!1),e.addEventListener(\"MSPointerMove\",this.onPointerMove,!1),e.addEventListener(\"MSPointerUp\",this.onPointerUp,!1)):(e.addEventListener(\"touchstart\",this.onTouchStart,!1),e.addEventListener(\"touchmove\",this.onTouchMove,!1),e.addEventListener(\"touchend\",this.onTouchEnd,!1))}},{key:\"unbind\",value:function(){var e=this.Reveal.getRevealElement();e.removeEventListener(\"pointerdown\",this.onPointerDown,!1),e.removeEventListener(\"pointermove\",this.onPointerMove,!1),e.removeEventListener(\"pointerup\",this.onPointerUp,!1),e.removeEventListener(\"MSPointerDown\",this.onPointerDown,!1),e.removeEventListener(\"MSPointerMove\",this.onPointerMove,!1),e.removeEventListener(\"MSPointerUp\",this.onPointerUp,!1),e.removeEventListener(\"touchstart\",this.onTouchStart,!1),e.removeEventListener(\"touchmove\",this.onTouchMove,!1),e.removeEventListener(\"touchend\",this.onTouchEnd,!1)}},{key:\"isSwipePrevented\",value:function(e){for(;e&&\"function\"==typeof e.hasAttribute;){if(e.hasAttribute(\"data-prevent-swipe\"))return!0;e=e.parentNode}return!1}},{key:\"onTouchStart\",value:function(e){if(this.isSwipePrevented(e.target))return!0;this.touchStartX=e.touches[0].clientX,this.touchStartY=e.touches[0].clientY,this.touchStartCount=e.touches.length}},{key:\"onTouchMove\",value:function(e){if(this.isSwipePrevented(e.target))return!0;var t=this.Reveal.getConfig();if(this.touchCaptured)Do&&e.preventDefault();else{this.Reveal.onUserInput(e);var n=e.touches[0].clientX,i=e.touches[0].clientY;if(1===e.touches.length&&2!==this.touchStartCount){var r=this.Reveal.availableRoutes({includeFragments:!0}),a=n-this.touchStartX,o=i-this.touchStartY;a>40&&Math.abs(a)>Math.abs(o)?(this.touchCaptured=!0,\"linear\"===t.navigationMode?t.rtl?this.Reveal.next():this.Reveal.prev():this.Reveal.left()):a<-40&&Math.abs(a)>Math.abs(o)?(this.touchCaptured=!0,\"linear\"===t.navigationMode?t.rtl?this.Reveal.prev():this.Reveal.next():this.Reveal.right()):o>40&&r.up?(this.touchCaptured=!0,\"linear\"===t.navigationMode?this.Reveal.prev():this.Reveal.up()):o<-40&&r.down&&(this.touchCaptured=!0,\"linear\"===t.navigationMode?this.Reveal.next():this.Reveal.down()),t.embedded?(this.touchCaptured||this.Reveal.isVerticalSlide())&&e.preventDefault():e.preventDefault()}}}},{key:\"onTouchEnd\",value:function(e){this.touchCaptured=!1}},{key:\"onPointerDown\",value:function(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&\"touch\"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchStart(e))}},{key:\"onPointerMove\",value:function(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&\"touch\"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchMove(e))}},{key:\"onPointerUp\",value:function(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&\"touch\"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchEnd(e))}}]),e}(),ws=\"focus\",Ss=\"blur\",Es=function(){function e(t){eo(this,e),this.Reveal=t,this.onRevealPointerDown=this.onRevealPointerDown.bind(this),this.onDocumentPointerDown=this.onDocumentPointerDown.bind(this)}return no(e,[{key:\"configure\",value:function(e,t){e.embedded?this.blur():(this.focus(),this.unbind())}},{key:\"bind\",value:function(){this.Reveal.getConfig().embedded&&this.Reveal.getRevealElement().addEventListener(\"pointerdown\",this.onRevealPointerDown,!1)}},{key:\"unbind\",value:function(){this.Reveal.getRevealElement().removeEventListener(\"pointerdown\",this.onRevealPointerDown,!1),document.removeEventListener(\"pointerdown\",this.onDocumentPointerDown,!1)}},{key:\"focus\",value:function(){this.state!==ws&&(this.Reveal.getRevealElement().classList.add(\"focused\"),document.addEventListener(\"pointerdown\",this.onDocumentPointerDown,!1)),this.state=ws}},{key:\"blur\",value:function(){this.state!==Ss&&(this.Reveal.getRevealElement().classList.remove(\"focused\"),document.removeEventListener(\"pointerdown\",this.onDocumentPointerDown,!1)),this.state=Ss}},{key:\"isFocused\",value:function(){return this.state===ws}},{key:\"onRevealPointerDown\",value:function(e){this.focus()}},{key:\"onDocumentPointerDown\",value:function(e){var t=xo(e.target,\".reveal\");t&&t===this.Reveal.getRevealElement()||this.blur()}}]),e}(),ks=function(){function e(t){eo(this,e),this.Reveal=t}return no(e,[{key:\"render\",value:function(){this.element=document.createElement(\"div\"),this.element.className=\"speaker-notes\",this.element.setAttribute(\"data-prevent-swipe\",\"\"),this.element.setAttribute(\"tabindex\",\"0\"),this.Reveal.getRevealElement().appendChild(this.element)}},{key:\"configure\",value:function(e,t){e.showNotes&&this.element.setAttribute(\"data-layout\",\"string\"==typeof e.showNotes?e.showNotes:\"inline\")}},{key:\"update\",value:function(){this.Reveal.getConfig().showNotes&&this.element&&this.Reveal.getCurrentSlide()&&!this.Reveal.print.isPrintingPDF()&&(this.element.innerHTML=this.getSlideNotes()||'<span class=\"notes-placeholder\">No notes on this slide.</span>')}},{key:\"updateVisibility\",value:function(){this.Reveal.getConfig().showNotes&&this.hasNotes()&&!this.Reveal.print.isPrintingPDF()?this.Reveal.getRevealElement().classList.add(\"show-notes\"):this.Reveal.getRevealElement().classList.remove(\"show-notes\")}},{key:\"hasNotes\",value:function(){return this.Reveal.getSlidesElement().querySelectorAll(\"[data-notes], aside.notes\").length>0}},{key:\"isSpeakerNotesWindow\",value:function(){return!!window.location.search.match(/receiver/gi)}},{key:\"getSlideNotes\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.Reveal.getCurrentSlide();if(e.hasAttribute(\"data-notes\"))return e.getAttribute(\"data-notes\");var t=e.querySelector(\"aside.notes\");return t?t.innerHTML:null}}]),e}(),As=qe(\"unscopables\"),Rs=Array.prototype;null==Rs[As]&&P.f(Rs,As,{configurable:!0,value:It(null)});Oe({target:\"Array\",proto:!0},{fill:function(e){for(var t=De(this),n=de(t.length),i=arguments.length,r=ve(i>1?arguments[1]:void 0,n),a=i>2?arguments[2]:void 0,o=void 0===a?n:ve(a,n);o>r;)t[r++]=e;return t}}),function(e){Rs[As][e]=!0}(\"fill\");var xs=function(){function e(t,n){eo(this,e),this.diameter=100,this.diameter2=this.diameter/2,this.thickness=6,this.playing=!1,this.progress=0,this.progressOffset=1,this.container=t,this.progressCheck=n,this.canvas=document.createElement(\"canvas\"),this.canvas.className=\"playback\",this.canvas.width=this.diameter,this.canvas.height=this.diameter,this.canvas.style.width=this.diameter2+\"px\",this.canvas.style.height=this.diameter2+\"px\",this.context=this.canvas.getContext(\"2d\"),this.container.appendChild(this.canvas),this.render()}return no(e,[{key:\"setPlaying\",value:function(e){var t=this.playing;this.playing=e,!t&&this.playing?this.animate():this.render()}},{key:\"animate\",value:function(){var e=this.progress;this.progress=this.progressCheck(),e>.8&&this.progress<.2&&(this.progressOffset=this.progress),this.render(),this.playing&&requestAnimationFrame(this.animate.bind(this))}},{key:\"render\",value:function(){var e=this.playing?this.progress:0,t=this.diameter2-this.thickness,n=this.diameter2,i=this.diameter2,r=28;this.progressOffset+=.1*(1-this.progressOffset);var a=-Math.PI/2+e*(2*Math.PI),o=-Math.PI/2+this.progressOffset*(2*Math.PI);this.context.save(),this.context.clearRect(0,0,this.diameter,this.diameter),this.context.beginPath(),this.context.arc(n,i,t+4,0,2*Math.PI,!1),this.context.fillStyle=\"rgba( 0, 0, 0, 0.4 )\",this.context.fill(),this.context.beginPath(),this.context.arc(n,i,t,0,2*Math.PI,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle=\"rgba( 255, 255, 255, 0.2 )\",this.context.stroke(),this.playing&&(this.context.beginPath(),this.context.arc(n,i,t,o,a,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle=\"#fff\",this.context.stroke()),this.context.translate(n-14,i-14),this.playing?(this.context.fillStyle=\"#fff\",this.context.fillRect(0,0,10,r),this.context.fillRect(18,0,10,r)):(this.context.beginPath(),this.context.translate(4,0),this.context.moveTo(0,0),this.context.lineTo(24,14),this.context.lineTo(0,r),this.context.fillStyle=\"#fff\",this.context.fill()),this.context.restore()}},{key:\"on\",value:function(e,t){this.canvas.addEventListener(e,t,!1)}},{key:\"off\",value:function(e,t){this.canvas.removeEventListener(e,t,!1)}},{key:\"destroy\",value:function(){this.playing=!1,this.canvas.parentNode&&this.container.removeChild(this.canvas)}}]),e}(),Ls={width:960,height:700,margin:.04,minScale:.2,maxScale:2,controls:!0,controlsTutorial:!0,controlsLayout:\"bottom-right\",controlsBackArrows:\"faded\",progress:!0,slideNumber:!1,showSlideNumber:\"all\",hashOneBasedIndex:!1,hash:!1,respondToHashChanges:!0,history:!1,keyboard:!0,keyboardCondition:null,disableLayout:!1,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,navigationMode:\"default\",shuffle:!1,fragments:!0,fragmentInURL:!0,embedded:!1,help:!0,pause:!0,showNotes:!1,showHiddenSlides:!1,autoPlayMedia:null,preloadIframes:null,autoAnimate:!0,autoAnimateMatcher:null,autoAnimateEasing:\"ease\",autoAnimateDuration:1,autoAnimateUnmatched:!0,autoAnimateStyles:[\"opacity\",\"color\",\"background-color\",\"padding\",\"font-size\",\"line-height\",\"letter-spacing\",\"border-width\",\"border-color\",\"border-radius\",\"outline\",\"outline-offset\"],autoSlide:0,autoSlideStoppable:!0,autoSlideMethod:null,defaultTiming:null,mouseWheel:!1,previewLinks:!1,postMessage:!0,postMessageEvents:!1,focusBodyOnPageVisibilityChange:!0,transition:\"slide\",transitionSpeed:\"default\",backgroundTransition:\"fade\",parallaxBackgroundImage:\"\",parallaxBackgroundSize:\"\",parallaxBackgroundRepeat:\"\",parallaxBackgroundPosition:\"\",parallaxBackgroundHorizontal:null,parallaxBackgroundVertical:null,pdfMaxPagesPerSlide:Number.POSITIVE_INFINITY,pdfSeparateFragments:!0,pdfPageHeightOffset:-1,viewDistance:3,mobileViewDistance:2,display:\"block\",hideInactiveCursor:!0,hideCursorTime:5e3,dependencies:[],plugins:[]},Cs=\"4.1.0\";function Ps(e,t){arguments.length<2&&(t=arguments[0],e=document.querySelector(\".reveal\"));var n,i,r,a,o,s={},l={},u=!1,c={hasNavigatedHorizontally:!1,hasNavigatedVertically:!1},d=[],h=1,f={layout:\"\",overview:\"\"},v={},g=\"idle\",p=0,m=0,y=-1,b=!1,w=new Ho(s),S=new Fo(s),E=new as(s),k=new Bo(s),A=new os(s),R=new ss(s),x=new ls(s),L=new us(s),C=new cs(s),P=new ds(s),N=new hs(s),M=new ms(s),I=new ys(s),O=new Es(s),T=new bs(s),D=new ks(s);function j(n){return v.wrapper=e,v.slides=e.querySelector(\".slides\"),l=ao(ao(ao(ao(ao({},Ls),l),t),n),Po()),z(),window.addEventListener(\"load\",oe,!1),M.load(l.plugins,l.dependencies).then(H),new Promise((function(e){return s.on(\"ready\",e)}))}function z(){!0===l.embedded?v.viewport=xo(e,\".reveal-viewport\")||e:(v.viewport=document.body,document.documentElement.classList.add(\"reveal-full-page\")),v.viewport.classList.add(\"reveal-viewport\")}function H(){u=!0,F(),U(),V(),_(),Ae(),K(),L.readURL(),k.update(!0),setTimeout((function(){v.slides.classList.remove(\"no-transition\"),v.wrapper.classList.add(\"ready\"),Q({type:\"ready\",data:{indexh:n,indexv:i,currentSlide:a}})}),1),I.isPrintingPDF()&&(X(),\"complete\"===document.readyState?I.setupPDF():window.addEventListener(\"load\",(function(){I.setupPDF()})))}function F(){l.showHiddenSlides||So(v.wrapper,'section[data-visibility=\"hidden\"]').forEach((function(e){e.parentNode.removeChild(e)}))}function U(){v.slides.classList.add(\"no-transition\"),Oo?v.wrapper.classList.add(\"no-hover\"):v.wrapper.classList.remove(\"no-hover\"),k.render(),S.render(),C.render(),P.render(),D.render(),v.pauseOverlay=Lo(v.wrapper,\"div\",\"pause-overlay\",l.controls?'<button class=\"resume-button\">Resume presentation</button>':null),v.statusElement=B(),v.wrapper.setAttribute(\"role\",\"application\")}function B(){var e=v.wrapper.querySelector(\".aria-status\");return e||((e=document.createElement(\"div\")).style.position=\"absolute\",e.style.height=\"1px\",e.style.width=\"1px\",e.style.overflow=\"hidden\",e.style.clip=\"rect( 1px, 1px, 1px, 1px )\",e.classList.add(\"aria-status\"),e.setAttribute(\"aria-live\",\"polite\"),e.setAttribute(\"aria-atomic\",\"true\"),v.wrapper.appendChild(e)),e}function q(e){v.statusElement.textContent=e}function W(e){var t=\"\";if(3===e.nodeType)t+=e.textContent;else if(1===e.nodeType){var n=e.getAttribute(\"aria-hidden\"),i=\"none\"===window.getComputedStyle(e).display;\"true\"===n||i||Array.from(e.childNodes).forEach((function(e){t+=W(e)}))}return\"\"===(t=t.trim())?\"\":t+\" \"}function _(){setInterval((function(){0===v.wrapper.scrollTop&&0===v.wrapper.scrollLeft||(v.wrapper.scrollTop=0,v.wrapper.scrollLeft=0)}),1e3)}function V(){l.postMessage&&window.addEventListener(\"message\",(function(e){var t=e.data;if(\"string\"==typeof t&&\"{\"===t.charAt(0)&&\"}\"===t.charAt(t.length-1)&&(t=JSON.parse(t)).method&&\"function\"==typeof s[t.method])if(!1===ho.test(t.method)){var n=s[t.method].apply(s,t.args);Z(\"callback\",{method:t.method,result:n})}else console.warn('reveal.js: \"'+t.method+'\" is is blacklisted from the postMessage API')}),!1)}function K(e){var t=ao({},l);if(\"object\"===Za(e)&&wo(l,e),!1!==s.isReady()){var n=v.wrapper.querySelectorAll(lo).length;v.wrapper.classList.remove(t.transition),v.wrapper.classList.add(l.transition),v.wrapper.setAttribute(\"data-transition-speed\",l.transitionSpeed),v.wrapper.setAttribute(\"data-background-transition\",l.backgroundTransition),v.viewport.style.setProperty(\"--slide-width\",l.width+\"px\"),v.viewport.style.setProperty(\"--slide-height\",l.height+\"px\"),l.shuffle&&Re(),Eo(v.wrapper,\"embedded\",l.embedded),Eo(v.wrapper,\"rtl\",l.rtl),Eo(v.wrapper,\"center\",l.center),!1===l.pause&&pe(),l.previewLinks?(ee(),te(\"[data-preview-link=false]\")):(te(),ee(\"[data-preview-link]:not([data-preview-link=false])\")),E.reset(),o&&(o.destroy(),o=null),n>1&&l.autoSlide&&l.autoSlideStoppable&&((o=new xs(v.wrapper,(function(){return Math.min(Math.max((Date.now()-y)/p,0),1)}))).on(\"click\",at),b=!1),\"default\"!==l.navigationMode?v.wrapper.setAttribute(\"data-navigation-mode\",l.navigationMode):v.wrapper.removeAttribute(\"data-navigation-mode\"),D.configure(l,t),O.configure(l,t),N.configure(l,t),C.configure(l,t),P.configure(l,t),x.configure(l,t),A.configure(l,t),S.configure(l,t),Ee()}}function $(){window.addEventListener(\"resize\",nt,!1),l.touch&&T.bind(),l.keyboard&&x.bind(),l.progress&&P.bind(),l.respondToHashChanges&&L.bind(),C.bind(),O.bind(),v.slides.addEventListener(\"transitionend\",tt,!1),v.pauseOverlay.addEventListener(\"click\",pe,!1),l.focusBodyOnPageVisibilityChange&&document.addEventListener(\"visibilitychange\",it,!1)}function X(){T.unbind(),O.unbind(),x.unbind(),C.unbind(),P.unbind(),L.unbind(),window.removeEventListener(\"resize\",nt,!1),v.slides.removeEventListener(\"transitionend\",tt,!1),v.pauseOverlay.removeEventListener(\"click\",pe,!1)}function Y(t,n,i){e.addEventListener(t,n,i)}function G(t,n,i){e.removeEventListener(t,n,i)}function J(e){\"string\"==typeof e.layout&&(f.layout=e.layout),\"string\"==typeof e.overview&&(f.overview=e.overview),f.layout?Ao(v.slides,f.layout+\" \"+f.overview):Ao(v.slides,f.overview)}function Q(e){var t=e.target,n=void 0===t?v.wrapper:t,i=e.type,r=e.data,a=e.bubbles,o=void 0===a||a,s=document.createEvent(\"HTMLEvents\",1,2);s.initEvent(i,o,!0),wo(s,r),n.dispatchEvent(s),n===v.wrapper&&Z(i)}function Z(e,t){if(l.postMessageEvents&&window.parent!==window.self){var n={namespace:\"reveal\",eventName:e,state:qe()};wo(n,t),window.parent.postMessage(JSON.stringify(n),\"*\")}}function ee(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"a\";Array.from(v.wrapper.querySelectorAll(e)).forEach((function(e){/^(http|www)/gi.test(e.getAttribute(\"href\"))&&e.addEventListener(\"click\",rt,!1)}))}function te(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"a\";Array.from(v.wrapper.querySelectorAll(e)).forEach((function(e){/^(http|www)/gi.test(e.getAttribute(\"href\"))&&e.removeEventListener(\"click\",rt,!1)}))}function ne(e){ae(),v.overlay=document.createElement(\"div\"),v.overlay.classList.add(\"overlay\"),v.overlay.classList.add(\"overlay-preview\"),v.wrapper.appendChild(v.overlay),v.overlay.innerHTML='<header>\\n\\t\\t\\t\\t<a class=\"close\" href=\"#\"><span class=\"icon\"></span></a>\\n\\t\\t\\t\\t<a class=\"external\" href=\"'.concat(e,'\" target=\"_blank\"><span class=\"icon\"></span></a>\\n\\t\\t\\t</header>\\n\\t\\t\\t<div class=\"spinner\"></div>\\n\\t\\t\\t<div class=\"viewport\">\\n\\t\\t\\t\\t<iframe src=\"').concat(e,'\"></iframe>\\n\\t\\t\\t\\t<small class=\"viewport-inner\">\\n\\t\\t\\t\\t\\t<span class=\"x-frame-error\">Unable to load iframe. This is likely due to the site\\'s policy (x-frame-options).</span>\\n\\t\\t\\t\\t</small>\\n\\t\\t\\t</div>'),v.overlay.querySelector(\"iframe\").addEventListener(\"load\",(function(e){v.overlay.classList.add(\"loaded\")}),!1),v.overlay.querySelector(\".close\").addEventListener(\"click\",(function(e){ae(),e.preventDefault()}),!1),v.overlay.querySelector(\".external\").addEventListener(\"click\",(function(e){ae()}),!1)}function ie(e){\"boolean\"==typeof e?e?re():ae():v.overlay?ae():re()}function re(){if(l.help){ae(),v.overlay=document.createElement(\"div\"),v.overlay.classList.add(\"overlay\"),v.overlay.classList.add(\"overlay-help\"),v.wrapper.appendChild(v.overlay);var e='<p class=\"title\">Keyboard Shortcuts</p><br/>',t=x.getShortcuts(),n=x.getBindings();for(var i in e+=\"<table><th>KEY</th><th>ACTION</th>\",t)e+=\"<tr><td>\".concat(i,\"</td><td>\").concat(t[i],\"</td></tr>\");for(var r in n)n[r].key&&n[r].description&&(e+=\"<tr><td>\".concat(n[r].key,\"</td><td>\").concat(n[r].description,\"</td></tr>\"));e+=\"</table>\",v.overlay.innerHTML='\\n\\t\\t\\t\\t<header>\\n\\t\\t\\t\\t\\t<a class=\"close\" href=\"#\"><span class=\"icon\"></span></a>\\n\\t\\t\\t\\t</header>\\n\\t\\t\\t\\t<div class=\"viewport\">\\n\\t\\t\\t\\t\\t<div class=\"viewport-inner\">'.concat(e,\"</div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\"),v.overlay.querySelector(\".close\").addEventListener(\"click\",(function(e){ae(),e.preventDefault()}),!1)}}function ae(){return!!v.overlay&&(v.overlay.parentNode.removeChild(v.overlay),v.overlay=null,!0)}function oe(){if(v.wrapper&&!I.isPrintingPDF()){if(!l.disableLayout){Oo&&!l.embedded&&document.documentElement.style.setProperty(\"--vh\",.01*window.innerHeight+\"px\");var e=le(),t=h;se(l.width,l.height),v.slides.style.width=e.width+\"px\",v.slides.style.height=e.height+\"px\",h=Math.min(e.presentationWidth/e.width,e.presentationHeight/e.height),h=Math.max(h,l.minScale),1===(h=Math.min(h,l.maxScale))?(v.slides.style.zoom=\"\",v.slides.style.left=\"\",v.slides.style.top=\"\",v.slides.style.bottom=\"\",v.slides.style.right=\"\",J({layout:\"\"})):h>1&&jo&&window.devicePixelRatio<2?(v.slides.style.zoom=h,v.slides.style.left=\"\",v.slides.style.top=\"\",v.slides.style.bottom=\"\",v.slides.style.right=\"\",J({layout:\"\"})):(v.slides.style.zoom=\"\",v.slides.style.left=\"50%\",v.slides.style.top=\"50%\",v.slides.style.bottom=\"auto\",v.slides.style.right=\"auto\",J({layout:\"translate(-50%, -50%) scale(\"+h+\")\"}));for(var n=Array.from(v.wrapper.querySelectorAll(lo)),i=0,r=n.length;i<r;i++){var a=n[i];\"none\"!==a.style.display&&(l.center||a.classList.contains(\"center\")?a.classList.contains(\"stack\")?a.style.top=0:a.style.top=Math.max((e.height-a.scrollHeight)/2,0)+\"px\":a.style.top=\"\")}t!==h&&Q({type:\"resize\",data:{oldScale:t,scale:h,size:e}})}P.update(),k.updateParallax(),R.isActive()&&R.update()}}function se(e,t){So(v.slides,\"section > .stretch, section > .r-stretch\").forEach((function(n){var i=No(n,t);if(/(img|video)/gi.test(n.nodeName)){var r=n.naturalWidth||n.videoWidth,a=n.naturalHeight||n.videoHeight,o=Math.min(e/r,i/a);n.style.width=r*o+\"px\",n.style.height=a*o+\"px\"}else n.style.width=e+\"px\",n.style.height=i+\"px\"}))}function le(e,t){var n={width:l.width,height:l.height,presentationWidth:e||v.wrapper.offsetWidth,presentationHeight:t||v.wrapper.offsetHeight};return n.presentationWidth-=n.presentationWidth*l.margin,n.presentationHeight-=n.presentationHeight*l.margin,\"string\"==typeof n.width&&/%$/.test(n.width)&&(n.width=parseInt(n.width,10)/100*n.presentationWidth),\"string\"==typeof n.height&&/%$/.test(n.height)&&(n.height=parseInt(n.height,10)/100*n.presentationHeight),n}function ue(e,t){\"object\"===Za(e)&&\"function\"==typeof e.setAttribute&&e.setAttribute(\"data-previous-indexv\",t||0)}function ce(e){if(\"object\"===Za(e)&&\"function\"==typeof e.setAttribute&&e.classList.contains(\"stack\")){var t=e.hasAttribute(\"data-start-indexv\")?\"data-start-indexv\":\"data-previous-indexv\";return parseInt(e.getAttribute(t)||0,10)}return 0}function de(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:a;return e&&e.parentNode&&!!e.parentNode.nodeName.match(/section/i)}function he(){return!(!a||!de(a))&&!a.nextElementSibling}function fe(){return 0===n&&0===i}function ve(){return!!a&&(!a.nextElementSibling&&(!de(a)||!a.parentNode.nextElementSibling))}function ge(){if(l.pause){var e=v.wrapper.classList.contains(\"paused\");Ve(),v.wrapper.classList.add(\"paused\"),!1===e&&Q({type:\"paused\"})}}function pe(){var e=v.wrapper.classList.contains(\"paused\");v.wrapper.classList.remove(\"paused\"),_e(),e&&Q({type:\"resumed\"})}function me(e){\"boolean\"==typeof e?e?ge():pe():ye()?pe():ge()}function ye(){return v.wrapper.classList.contains(\"paused\")}function be(e){\"boolean\"==typeof e?e?$e():Ke():b?$e():Ke()}function we(){return!(!p||b)}function Se(e,t,o,s){r=a;var u=v.wrapper.querySelectorAll(uo);if(0!==u.length){void 0!==t||R.isActive()||(t=ce(u[e])),r&&r.parentNode&&r.parentNode.classList.contains(\"stack\")&&ue(r.parentNode,i);var c=d.concat();d.length=0;var h=n||0,f=i||0;n=xe(uo,void 0===e?n:e),i=xe(co,void 0===t?i:t);var p=n!==h||i!==f;p||(r=null);var m=u[n],y=m.querySelectorAll(\"section\");a=y[i]||m;var b=!1;p&&r&&a&&!R.isActive()&&(r.hasAttribute(\"data-auto-animate\")&&a.hasAttribute(\"data-auto-animate\")&&(b=!0,v.slides.classList.add(\"disable-slide-transitions\")),g=\"running\"),Le(),oe(),R.isActive()&&R.update(),void 0!==o&&A.goto(o),r&&r!==a&&(r.classList.remove(\"present\"),r.setAttribute(\"aria-hidden\",\"true\"),fe()&&setTimeout((function(){De().forEach((function(e){ue(e,0)}))}),0));e:for(var x=0,N=d.length;x<N;x++){for(var M=0;M<c.length;M++)if(c[M]===d[x]){c.splice(M,1);continue e}v.viewport.classList.add(d[x]),Q({type:d[x]})}for(;c.length;)v.viewport.classList.remove(c.pop());p&&Q({type:\"slidechanged\",data:{indexh:n,indexv:i,previousSlide:r,currentSlide:a,origin:s}}),!p&&r||(w.stopEmbeddedContent(r),w.startEmbeddedContent(a)),q(W(a)),P.update(),C.update(),D.update(),k.update(),k.updateParallax(),S.update(),A.update(),L.writeURL(),_e(),b&&(setTimeout((function(){v.slides.classList.remove(\"disable-slide-transitions\")}),0),l.autoAnimate&&E.run(r,a))}}function Ee(){X(),$(),oe(),p=l.autoSlide,_e(),k.create(),L.writeURL(),A.sortAll(),C.update(),P.update(),Le(),D.update(),D.updateVisibility(),k.update(!0),S.update(),w.formatEmbeddedContent(),!1===l.autoPlayMedia?w.stopEmbeddedContent(a,{unloadIframes:!1}):w.startEmbeddedContent(a),R.isActive()&&R.layout()}function ke(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:a;k.sync(e),A.sync(e),w.load(e),k.update(),D.update()}function Ae(){Oe().forEach((function(e){So(e,\"section\").forEach((function(e,t){t>0&&(e.classList.remove(\"present\"),e.classList.remove(\"past\"),e.classList.add(\"future\"),e.setAttribute(\"aria-hidden\",\"true\"))}))}))}function Re(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Oe();e.forEach((function(t,n){var i=e[Math.floor(Math.random()*e.length)];i.parentNode===t.parentNode&&t.parentNode.insertBefore(t,i);var r=t.querySelectorAll(\"section\");r.length&&Re(r)}))}function xe(e,t){var n=So(v.wrapper,e),i=n.length,r=I.isPrintingPDF();if(i){l.loop&&(t%=i)<0&&(t=i+t),t=Math.max(Math.min(t,i-1),0);for(var a=0;a<i;a++){var o=n[a],s=l.rtl&&!de(o);o.classList.remove(\"past\"),o.classList.remove(\"present\"),o.classList.remove(\"future\"),o.setAttribute(\"hidden\",\"\"),o.setAttribute(\"aria-hidden\",\"true\"),o.querySelector(\"section\")&&o.classList.add(\"stack\"),r?o.classList.add(\"present\"):a<t?(o.classList.add(s?\"future\":\"past\"),l.fragments&&So(o,\".fragment\").forEach((function(e){e.classList.add(\"visible\"),e.classList.remove(\"current-fragment\")}))):a>t&&(o.classList.add(s?\"past\":\"future\"),l.fragments&&So(o,\".fragment.visible\").forEach((function(e){e.classList.remove(\"visible\",\"current-fragment\")})))}var u=n[t],c=u.classList.contains(\"present\");u.classList.add(\"present\"),u.removeAttribute(\"hidden\"),u.removeAttribute(\"aria-hidden\"),c||Q({target:u,type:\"visible\",bubbles:!1});var h=u.getAttribute(\"data-state\");h&&(d=d.concat(h.split(\" \")))}else t=0;return t}function Le(){var e,t=Oe(),r=t.length;if(r&&void 0!==n){var a=R.isActive()?10:l.viewDistance;Oo&&(a=R.isActive()?6:l.mobileViewDistance),I.isPrintingPDF()&&(a=Number.MAX_VALUE);for(var o=0;o<r;o++){var s=t[o],u=So(s,\"section\"),c=u.length;if(e=Math.abs((n||0)-o)||0,l.loop&&(e=Math.abs(((n||0)-o)%(r-a))||0),e<a?w.load(s):w.unload(s),c)for(var d=ce(s),h=0;h<c;h++){var f=u[h];e+(o===(n||0)?Math.abs((i||0)-h):Math.abs(h-d))<a?w.load(f):w.unload(f)}}ze()?v.wrapper.classList.add(\"has-vertical-slides\"):v.wrapper.classList.remove(\"has-vertical-slides\"),je()?v.wrapper.classList.add(\"has-horizontal-slides\"):v.wrapper.classList.remove(\"has-horizontal-slides\")}}function Ce(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.includeFragments,r=void 0!==t&&t,a=v.wrapper.querySelectorAll(uo),o=v.wrapper.querySelectorAll(co),s={left:n>0,right:n<a.length-1,up:i>0,down:i<o.length-1};if(l.loop&&(a.length>1&&(s.left=!0,s.right=!0),o.length>1&&(s.up=!0,s.down=!0)),a.length>1&&\"linear\"===l.navigationMode&&(s.right=s.right||s.down,s.left=s.left||s.up),!0===r){var u=A.availableRoutes();s.left=s.left||u.prev,s.up=s.up||u.prev,s.down=s.down||u.next,s.right=s.right||u.next}if(l.rtl){var c=s.left;s.left=s.right,s.right=c}return s}function Pe(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:a,t=Oe(),n=0;e:for(var i=0;i<t.length;i++){for(var r=t[i],o=r.querySelectorAll(\"section\"),s=0;s<o.length;s++){if(o[s]===e)break e;\"uncounted\"!==o[s].dataset.visibility&&n++}if(r===e)break;!1===r.classList.contains(\"stack\")&&\"uncounted\"!==r.dataset.visibility&&n++}return n}function Ne(){var e=Fe(),t=Pe();if(a){var n=a.querySelectorAll(\".fragment\");if(n.length>0){t+=a.querySelectorAll(\".fragment.visible\").length/n.length*.9}}return Math.min(t/(e-1),1)}function Me(e){var t,r=n,o=i;if(e){var s=de(e),l=s?e.parentNode:e,u=Oe();r=Math.max(u.indexOf(l),0),o=void 0,s&&(o=Math.max(So(e.parentNode,\"section\").indexOf(e),0))}if(!e&&a&&a.querySelectorAll(\".fragment\").length>0){var c=a.querySelector(\".current-fragment\");t=c&&c.hasAttribute(\"data-fragment-index\")?parseInt(c.getAttribute(\"data-fragment-index\"),10):a.querySelectorAll(\".fragment.visible\").length-1}return{h:r,v:o,f:t}}function Ie(){return So(v.wrapper,'.slides section:not(.stack):not([data-visibility=\"uncounted\"])')}function Oe(){return So(v.wrapper,uo)}function Te(){return So(v.wrapper,\".slides>section>section\")}function De(){return So(v.wrapper,\".slides>section.stack\")}function je(){return Oe().length>1}function ze(){return Te().length>1}function He(){return Ie().map((function(e){for(var t={},n=0;n<e.attributes.length;n++){var i=e.attributes[n];t[i.name]=i.value}return t}))}function Fe(){return Ie().length}function Ue(e,t){var n=Oe()[e],i=n&&n.querySelectorAll(\"section\");return i&&i.length&&\"number\"==typeof t?i?i[t]:void 0:n}function Be(e,t){var n=\"number\"==typeof e?Ue(e,t):e;if(n)return n.slideBackgroundElement}function qe(){var e=Me();return{indexh:e.h,indexv:e.v,indexf:e.f,paused:ye(),overview:R.isActive()}}function We(e){if(\"object\"===Za(e)){Se(ko(e.indexh),ko(e.indexv),ko(e.indexf));var t=ko(e.paused),n=ko(e.overview);\"boolean\"==typeof t&&t!==ye()&&me(t),\"boolean\"==typeof n&&n!==R.isActive()&&R.toggle(n)}}function _e(){if(Ve(),a&&!1!==l.autoSlide){var e=a.querySelector(\".current-fragment\");e||(e=a.querySelector(\".fragment\"));var t=e?e.getAttribute(\"data-autoslide\"):null,n=a.parentNode?a.parentNode.getAttribute(\"data-autoslide\"):null,i=a.getAttribute(\"data-autoslide\");t?p=parseInt(t,10):i?p=parseInt(i,10):n?p=parseInt(n,10):(p=l.autoSlide,0===a.querySelectorAll(\".fragment\").length&&So(a,\"video, audio\").forEach((function(e){e.hasAttribute(\"data-autoplay\")&&p&&1e3*e.duration/e.playbackRate>p&&(p=1e3*e.duration/e.playbackRate+1e3)}))),!p||b||ye()||R.isActive()||ve()&&!A.availableRoutes().next&&!0!==l.loop||(m=setTimeout((function(){\"function\"==typeof l.autoSlideMethod?l.autoSlideMethod():Ze(),_e()}),p),y=Date.now()),o&&o.setPlaying(-1!==m)}}function Ve(){clearTimeout(m),m=-1}function Ke(){p&&!b&&(b=!0,Q({type:\"autoslidepaused\"}),clearTimeout(m),o&&o.setPlaying(!1))}function $e(){p&&b&&(b=!1,Q({type:\"autoslideresumed\"}),_e())}function Xe(){c.hasNavigatedHorizontally=!0,l.rtl?(R.isActive()||!1===A.next())&&Ce().left&&Se(n+1,\"grid\"===l.navigationMode?i:void 0):(R.isActive()||!1===A.prev())&&Ce().left&&Se(n-1,\"grid\"===l.navigationMode?i:void 0)}function Ye(){c.hasNavigatedHorizontally=!0,l.rtl?(R.isActive()||!1===A.prev())&&Ce().right&&Se(n-1,\"grid\"===l.navigationMode?i:void 0):(R.isActive()||!1===A.next())&&Ce().right&&Se(n+1,\"grid\"===l.navigationMode?i:void 0)}function Ge(){(R.isActive()||!1===A.prev())&&Ce().up&&Se(n,i-1)}function Je(){c.hasNavigatedVertically=!0,(R.isActive()||!1===A.next())&&Ce().down&&Se(n,i+1)}function Qe(){var e;if(!1===A.prev())if(Ce().up)Ge();else if(e=l.rtl?So(v.wrapper,\".slides>section.future\").pop():So(v.wrapper,\".slides>section.past\").pop()){var t=e.querySelectorAll(\"section\").length-1||void 0;Se(n-1,t)}}function Ze(){if(c.hasNavigatedHorizontally=!0,c.hasNavigatedVertically=!0,!1===A.next()){var e=Ce();e.down&&e.right&&l.loop&&he()&&(e.down=!1),e.down?Je():l.rtl?Xe():Ye()}}function et(e){l.autoSlideStoppable&&Ke()}function tt(e){\"running\"===g&&/section/gi.test(e.target.nodeName)&&(g=\"idle\",Q({type:\"slidetransitionend\",data:{indexh:n,indexv:i,previousSlide:r,currentSlide:a}}))}function nt(e){oe()}function it(e){!1===document.hidden&&document.activeElement!==document.body&&(\"function\"==typeof document.activeElement.blur&&document.activeElement.blur(),document.body.focus())}function rt(e){if(e.currentTarget&&e.currentTarget.hasAttribute(\"href\")){var t=e.currentTarget.getAttribute(\"href\");t&&(ne(t),e.preventDefault())}}function at(e){ve()&&!1===l.loop?(Se(0,0),$e()):b?$e():Ke()}var ot={VERSION:Cs,initialize:j,configure:K,sync:Ee,syncSlide:ke,syncFragments:A.sync.bind(A),slide:Se,left:Xe,right:Ye,up:Ge,down:Je,prev:Qe,next:Ze,navigateLeft:Xe,navigateRight:Ye,navigateUp:Ge,navigateDown:Je,navigatePrev:Qe,navigateNext:Ze,navigateFragment:A.goto.bind(A),prevFragment:A.prev.bind(A),nextFragment:A.next.bind(A),on:Y,off:G,addEventListener:Y,removeEventListener:G,layout:oe,shuffle:Re,availableRoutes:Ce,availableFragments:A.availableRoutes.bind(A),toggleHelp:ie,toggleOverview:R.toggle.bind(R),togglePause:me,toggleAutoSlide:be,isFirstSlide:fe,isLastSlide:ve,isLastVerticalSlide:he,isVerticalSlide:de,isPaused:ye,isAutoSliding:we,isSpeakerNotes:D.isSpeakerNotesWindow.bind(D),isOverview:R.isActive.bind(R),isFocused:O.isFocused.bind(O),isPrintingPDF:I.isPrintingPDF.bind(I),isReady:function(){return u},loadSlide:w.load.bind(w),unloadSlide:w.unload.bind(w),addEventListeners:$,removeEventListeners:X,dispatchEvent:Q,getState:qe,setState:We,getProgress:Ne,getIndices:Me,getSlidesAttributes:He,getSlidePastCount:Pe,getTotalSlides:Fe,getSlide:Ue,getPreviousSlide:function(){return r},getCurrentSlide:function(){return a},getSlideBackground:Be,getSlideNotes:D.getSlideNotes.bind(D),getSlides:Ie,getHorizontalSlides:Oe,getVerticalSlides:Te,hasHorizontalSlides:je,hasVerticalSlides:ze,hasNavigatedHorizontally:function(){return c.hasNavigatedHorizontally},hasNavigatedVertically:function(){return c.hasNavigatedVertically},addKeyBinding:x.addKeyBinding.bind(x),removeKeyBinding:x.removeKeyBinding.bind(x),triggerKey:x.triggerKey.bind(x),registerKeyboardShortcut:x.registerKeyboardShortcut.bind(x),getComputedSlideSize:le,getScale:function(){return h},getConfig:function(){return l},getQueryHash:Po,getRevealElement:function(){return e},getSlidesElement:function(){return v.slides},getViewportElement:function(){return v.viewport},getBackgroundsElement:function(){return k.element},registerPlugin:M.registerPlugin.bind(M),hasPlugin:M.hasPlugin.bind(M),getPlugin:M.getPlugin.bind(M),getPlugins:M.getRegisteredPlugins.bind(M)};return wo(s,ao(ao({},ot),{},{announceStatus:q,getStatusText:W,print:I,focus:O,progress:P,controls:C,location:L,overview:R,fragments:A,slideContent:w,slideNumber:S,onUserInput:et,closeOverlay:ae,updateSlidesVisibility:Le,layoutSlideContents:se,transformSlides:J,cueAutoSlide:_e,cancelAutoSlide:Ve})),ot}var Ns=Ps,Ms=[];return Ns.initialize=function(e){return Object.assign(Ns,new Ps(document.querySelector(\".reveal\"),e)),Ms.map((function(e){return e(Ns)})),Ns.initialize()},[\"configure\",\"on\",\"off\",\"addEventListener\",\"removeEventListener\",\"registerPlugin\"].forEach((function(e){Ns[e]=function(){for(var t=arguments.length,n=new Array(t),i=0;i<t;i++)n[i]=arguments[i];Ms.push((function(t){var i;return(i=t[e]).call.apply(i,[null].concat(n))}))}})),Ns.isReady=function(){return!1},Ns.VERSION=Cs,Ns}));\n//# sourceMappingURL=reveal.js.map\n"
  },
  {
    "path": "pages/include/verySimpleImageViewer/css/jquery.verySimpleImageViewer.css",
    "content": ".jqvsiv_toolbar {\r\n\tdisplay: inline-block;\r\n\tposition: absolute;\r\n\tright: 3px;\r\n\ttop: 3px;\r\n\tz-index: 5;\r\n}\r\n.jqvsiv_toolbarButton {\r\n\tmargin: 0 2px;\r\n\tcursor: pointer;\r\n}\r\n"
  },
  {
    "path": "pages/include/verySimpleImageViewer/js/jquery.verySimpleImageViewer.js",
    "content": "\r\n/**\r\n * jquery.verySimpleImageViewer.js\r\n * Ver. : 1.0.0 \r\n * last update: 28/04/2018\r\n * Author: meshesha , https://github.com/meshesha\r\n * LICENSE: MIT\r\n * url:https://meshesha.github.io/verySimpleImageViewer\r\n */\r\n\r\n(function ($) {\r\n    $.fn.verySimpleImageViewer = function( options ) {\r\n        var settings = $.extend(true,{},{\r\n            // These are the defaults.\r\n            imageSource: \"\",\r\n            frame: ['720px','480px',false],\r\n            maxZoom: '300%',\r\n            zoomFactor: '10%',\r\n            mouse: true,\r\n            keyboard: true,\r\n            toolbar: true,\r\n            rotateToolbar: true\r\n        }, options );\r\n\r\n        var imageSource = settings.imageSource;\r\n        var frame = settings.frame;\r\n        var maxZoom = settings.maxZoom;\r\n        var zoomFactor = settings.zoomFactor;\r\n        var isMouse = settings.mouse;\r\n        var isKeyboard = settings.keyboard;\r\n        var isToolbar = settings.toolbar;\r\n        var rotateToolbar = settings.rotateToolbar;\r\n\r\n        var self = this;\r\n        //var $result = $(this);\r\n        var parent = $(this)[0];\r\n        var image = null;\r\n        var rotateAngle = 0;\r\n        self.frameElement = null;\r\n        var orignalW,orignalH, zoomLevel = 0;\r\n        var lastMousePosition = null, speed = 5;\r\n        var mouseWheelObject = null;\r\n\r\n        console.log(settings)\r\n\r\n        /*Methods*/\r\n        self.getFrameDimension =  function() {\r\n            return [self.frameElement.clientWidth,self.frameElement.clientHeight];\r\n        }\t\t\t\t\r\n        self.setDimension = function(width,height) { //width and height of image\r\n            image.width=Math.round(width);\r\n            image.height=Math.round(height);\r\n        }\r\n        self.getDimension =  function() {\r\n            return [image.width,image.height];\r\n        }\r\n        self.setPosition = function(x,y) { //x and y coordinate of image\r\n            image.style.left=(Math.round(x)+'px');\r\n            image.style.top=(Math.round(y)+'px');\r\n        }\r\n        self.getPosition = function() {\r\n            return [retInt(image.style.left,'px'),retInt(image.style.top,'px')];\r\n        }\r\n        self.setMouseCursor = function() {\r\n            var dimension = self.getDimension();\r\n            var frameDimension =  self.getFrameDimension();\r\n            \r\n            var cursor='crosshair';\r\n            if(dimension[0]>frameDimension[0] && dimension[1]>frameDimension[1])\r\n                cursor='move';\r\n            else if(dimension[0]>frameDimension[0])\r\n                cursor='e-resize';\r\n            else if(dimension[1]>frameDimension[1])\r\n                cursor='n-resize';\r\n            \r\n            image.style.cursor=cursor;\r\n        }\r\n        self.maxZoomCheck = function(width,height) {\r\n            if(typeof width=='undefined' || typeof height=='undefined') {\r\n                var temp = self.getDimension();\r\n                width=temp[0], height=temp[1];\r\n            }\r\n            if(typeof maxZoom=='number') {\r\n                return ((width/orignalW)>maxZoom || (height/orignalH)>maxZoom);\r\n            }\r\n            else if(typeof maxZoom=='object') {\r\n                return (width>maxZoom[0] || height>maxZoom[1]);\r\n            }\r\n        }\r\n        self.fitToFrame = function(width, height) { //width and height of image\r\n            if(typeof width=='undefined' || typeof height=='undefined') {\r\n                width = orignalW, height = orignalH;\r\n            }\r\n            var frameDimension = self.getFrameDimension(), newWidth,newHeight;\r\n            \r\n            newWidth = frameDimension[0];\r\n            newHeight = Math.round((newWidth*height)/width);\r\n            if(newHeight>(frameDimension[1])) {\r\n                newHeight = frameDimension[1];\r\n                newWidth = Math.round((newHeight*width)/height); \r\n            }\r\n            return [newWidth,newHeight];\r\n        }\r\n        self.getZoomLevel = function() {\r\n            return zoomLevel;\r\n        }\r\n        self.zoomTo = function(newZoomLevel, x, y) {\r\n            var frameDimension = self.getFrameDimension();\r\n            //check if x and y coordinate is within the self.frameElement\r\n            if(newZoomLevel<0 || x<0 || y<0 || x>=frameDimension[0] || y>=frameDimension[1])\r\n                return false;\r\n            \r\n            var dimension = self.fitToFrame(orignalW,orignalH);\r\n            for(var i=newZoomLevel; i>0;i--)\r\n                dimension[0] *= zoomFactor, dimension[1] *= zoomFactor;\r\n            \r\n            //Calculate percentage increase/decrease and fix the image over given x,y coordinate\r\n            var curWidth=image.width, curHeight=image.height;\r\n            var position = self.getPosition();\r\n            \r\n            position[0]-=((x-position[0])*((dimension[0]/curWidth)-1)), position[1]-=((y-position[1])*((dimension[1]/curHeight)-1)); //Applying the above formula\r\n            \r\n            \r\n            //Center image\r\n            position = self.centerImage(dimension[0],dimension[1], position[0],position[1]);\r\n            \r\n            //Set dimension and position\r\n            if(!self.maxZoomCheck(dimension[0],dimension[1])) {\r\n                zoomLevel = newZoomLevel;\r\n                self.setDimension(dimension[0],dimension[1]);\r\n                self.setPosition(position[0],position[1]);\r\n                self.setMouseCursor();\r\n            }\r\n            else\r\n                return false;\r\n            return true;\r\n        }\r\n        self.centerImage = function(width,height, x,y) { //width and height of image and (x,y) is the (left,top) of the image\r\n            if(typeof width=='undefined' || typeof height=='undefined') {\r\n                var temp = self.getDimension();\r\n                width=temp[0], height=temp[1];\r\n            }\r\n            if(typeof x=='undefined' || typeof y=='undefined') {\r\n                var temp = self.getPosition();\r\n                x=temp[0], y=temp[1];\r\n            }\r\n                \r\n            var frameDimension = self.getFrameDimension();\r\n            \r\n            if(width<=frameDimension[0])\r\n                x = Math.round((frameDimension[0] - width)/2);\r\n            if(height<=frameDimension[1])\r\n                y = Math.round((frameDimension[1] - height)/2);\r\n\r\n            if(width>frameDimension[0]) {\r\n                if(x>0)\r\n                    x=0;\r\n                else\r\n                if((x+width)<frameDimension[0])\r\n                    x=frameDimension[0]-width;\r\n            }\r\n\r\n            if(height>frameDimension[1]) {\r\n                if(y>0)\r\n                    y=0;\r\n                else\r\n                if((y+height)<frameDimension[1])\r\n                    y=frameDimension[1]-height;\r\n            }\r\n\r\n            return [x,y];\r\n        }\r\n        self.rotate = function(direction,reset){\r\n            if(direction == \"1\"){\r\n                rotateAngle += 90;\r\n            }else{\r\n                rotateAngle -= 90;\r\n            }\r\n            //console.log(self.frameElement)\r\n            if(reset){\r\n                $(\".\" + self.frameElement.className +\" .jqvsiv_main_image_content\").css('transform','rotate(0deg)');\r\n            }else{\r\n                $(\".\" + self.frameElement.className +\" .jqvsiv_main_image_content\").css('transform','rotate(' + rotateAngle + 'deg)');\r\n\r\n                //need to reset mous position and direction - TODO\r\n                \r\n            }\r\n        }\r\n        self.reset = function() {\r\n            var dimension = self.fitToFrame(orignalW,orignalH);\r\n            var position = self.centerImage(dimension[0],dimension[1], 0,0);\r\n            self.setDimension(dimension[0],dimension[1]);\r\n            self.setPosition(position[0],position[1]);\r\n            zoomLevel = 0;\r\n            self.rotate(\"1\",true);\r\n        }\r\n        \r\n        /*Event handlers*/\r\n        self.onmousewheel = function(event,object,direction) {\r\n            self.frameElement.focus();\r\n            if (!event){ //For IE\r\n                event = window.event, event.returnValue = false;\r\n            }else if (event.preventDefault){\r\n                event.preventDefault();\r\n            }\r\n\r\n            if((zoomLevel+direction)>=0) {\r\n                var mousePos = getMouseXY(event);\r\n                var framePos = getObjectXY(self.frameElement);\r\n                self.zoomTo(zoomLevel+direction, mousePos[0]-framePos[0], mousePos[1]-framePos[1]);\r\n            }\r\n        }\r\n        self.onmousemove = function(event) {\r\n            if (!event){ //For IE\r\n                event = window.event, event.returnValue = false;\r\n            }else if (event.preventDefault){\r\n                event.preventDefault();\r\n            }\r\n            \r\n            var mousePosition = getMouseXY(event);\r\n            var position = self.getPosition();\r\n            position[0] += (mousePosition[0]-lastMousePosition[0]), position[1]+=(mousePosition[1]-lastMousePosition[1]);\r\n            lastMousePosition = mousePosition;\r\n            \r\n            position = self.centerImage(image.width,image.height, position[0],position[1]);\r\n            self.setPosition(position[0],position[1]);\r\n        }\r\n        self.onmouseup_or_out = function(event) {\r\n            if (!event){ //For IE\r\n                event = window.event, event.returnValue = false;\r\n            }else if (event.preventDefault){\r\n                event.preventDefault();\r\n            }\r\n            \r\n            image.onmousemove = image.onmouseup=image.onmouseout=null;\r\n            image.onmousedown = self.onmousedown;\r\n        }\r\n        self.onmousedown =  function(event) {\r\n            self.frameElement.focus();\r\n            if (!event){ //For IE\r\n                event = window.event, event.returnValue = false;\r\n            }else if (event.preventDefault){\r\n                event.preventDefault();\r\n            }\r\n\r\n            lastMousePosition = getMouseXY(event);\r\n            image.onmousemove = self.onmousemove;\r\n            image.onmouseup = image.onmouseout=self.onmouseup_or_out;\r\n        }\r\n        self.onkeypress = function(event) {\r\n            var keyCode;\r\n            if(window.event){ // IE\r\n                event = window.event, keyCode = event.keyCode, event.returnValue = false;\r\n            }else if(event.which){\r\n                keyCode = event.which, event.preventDefault();\r\n            }\r\n            keyCode = String.fromCharCode(keyCode);\r\n            \r\n            var position = self.getPosition();\r\n            var LEFT='a',UP='w',RIGHT='d',DOWN='s', CENTER_IMAGE='c', ZOOMIN='=', ZOOMOUT='-'; ///Keys a,w,d,s\r\n            if(keyCode == LEFT){\r\n                position[0]+=speed;\r\n            }else if(keyCode == UP){\r\n                position[1] += speed;\r\n            }else if(keyCode == RIGHT){\r\n                position[0] -= speed;\r\n            }else if(keyCode==DOWN){\r\n                position[1] -= speed;\r\n            }else if(keyCode == CENTER_IMAGE || keyCode == 'C'){\r\n                self.reset();\r\n            }else if(keyCode == ZOOMIN || keyCode == '+' || keyCode == 'x' || keyCode == 'X'){\r\n                self.zoomTo(zoomLevel+1, self.frameElement.clientWidth/2, self.frameElement.clientHeight/2);\r\n            }else if( (keyCode == ZOOMOUT || keyCode == 'z' || keyCode == 'Z') && zoomLevel > 0){\r\n                self.zoomTo(zoomLevel-1, self.frameElement.clientWidth/2, self.frameElement.clientHeight/2);\r\n            }\r\n            if(keyCode == LEFT || keyCode == UP || keyCode == RIGHT || keyCode == DOWN) {\r\n                position = self.centerImage(image.width,image.height, position[0],position[1]);\r\n                self.setPosition(position[0],position[1]);\r\n                speed += 2;\r\n            }\r\n        }\r\n        self.onkeyup = function(event) {\r\n            speed = 5;\r\n        }\r\n        /*Initializaion*/\r\n        self.setZoomProp = function(newZoomFactor,newMaxZoom) {\r\n            if(newZoomFactor == null){\r\n                zoomFactor = 10;\r\n            }\r\n            zoomFactor = 1 + retInt(newZoomFactor,'%')/100;\r\n            \r\n            if(typeof newMaxZoom == 'string'){\r\n                maxZoom = retInt(newMaxZoom,'%')/100;\r\n            }else if(typeof newMaxZoom == 'object' && newMaxZoom != null) {\r\n                maxZoom[0] = retInt(newMaxZoom[0],'px');\r\n                maxZoom[1] = retInt(newMaxZoom[1],'px');\r\n            }else{\r\n                maxZoom = '300%';\r\n            } \r\n        }\r\n\r\n        self.initImage = function() {\r\n            image.style.maxWidth=image.style.width=image.style.maxHeight=image.style.height=null;\r\n            orignalW=image.width;\r\n            orignalH=image.height;\r\n            \r\n            var dimension = self.fitToFrame(orignalW, orignalH);\r\n            self.setDimension(dimension[0],dimension[1]);\r\n            \r\n            if(frame[2] == true)\r\n                self.frameElement.style.width = (Math.round(dimension[0])+ 'px');\r\n            if(frame[3] == true)\r\n                self.frameElement.style.height = (Math.round(dimension[1]) + 'px');\r\n            \r\n            var pos = self.centerImage(dimension[0],dimension[1], 0,0);\r\n            self.setPosition(pos[0],pos[1]);\r\n            self.setMouseCursor();\r\n            \r\n            //Set mouse handlers\r\n            if(isMouse){\r\n                mouseWheelObject = new mouseWheel();\r\n                mouseWheelObject.init(image, self.onmousewheel);\r\n                image.onmousedown = self.onmousedown;\r\n            }\r\n            //Set keyboard handlers\r\n            if(isKeyboard){\r\n                self.frameElement.onkeypress = self.onkeypress;\r\n                self.frameElement.onkeyup = self.onkeyup;\r\n            }\r\n            //Set toolbar handlers\r\n            if(isToolbar){\r\n                self.loadToolbar(self);\r\n            }\r\n        }\r\n\r\n        /*Set a base*/\r\n        self.setZoomProp(zoomFactor,maxZoom);\r\n        //Create self.frameElement - One time initialization\r\n        self.frameElement = document.createElement('div');\r\n        self.frameElement.className = 'image_viewer_inner_container';\r\n        self.frameElement.style.width = frame[0];\r\n        self.frameElement.style.height = frame[1];\r\n        self.frameElement.style.border=\"0px solid #000\";\r\n        self.frameElement.style.margin=\"0px\";\r\n        self.frameElement.style.padding=\"0px\";\r\n        self.frameElement.style.overflow=\"hidden\";\r\n        self.frameElement.style.position=\"relative\";\r\n        self.frameElement.style.zIndex=2;\r\n        self.frameElement.tabIndex=1;\r\n                \r\n        if(image!=null) {\r\n            if (parent != null) {\r\n                image.parentNode.removeChild(image);\r\n                parent.appendChild(self.frameElement);\r\n            }else{\r\n                image.parentNode.replaceChild(self.frameElement,image);\r\n            }\r\n            \r\n            image.style.margin=image.style.padding=\"0\";\r\n            image.style.borderWidth=\"0px\";\r\n            image.style.position='absolute';\r\n            image.style.zIndex=3;\r\n            self.frameElement.appendChild(image);\r\n            \r\n            //if(imageSource!=null)\r\n            //\tself.preInitImage();\r\n            //else\r\n            //\tself.initImage();\r\n        }else {\t\t\r\n            if(parent!=null)\r\n                parent.appendChild(self.frameElement);\r\n            \r\n            var div_imge_container = document.createElement('div');\r\n            div_imge_container.className = 'jqvsiv_main_image_content';\r\n\r\n            image = document.createElement('img');\r\n            image.className = 'image_container';\r\n            image.style.position='absolute';\r\n            image.style.zIndex=3;\r\n\r\n            div_imge_container.appendChild(image);\r\n\r\n            self.frameElement.appendChild(div_imge_container);\r\n            \r\n            image.onload = self.initImage;\r\n            image.src = imageSource;\r\n        }\r\n        //Toolbar\r\n        self.loadToolbar = function(self) {\r\n            //var toolbarImages=\"./images/toolbar\";\r\n            var toolbar = document.createElement('div');\r\n            toolbar.className='jqvsiv_toolbar';\r\n            \r\n            var isEnterKey = function(event) {\r\n                var keyCode;\r\n                if(event.keyCode){ // IE\r\n                    keyCode = event.keyCode, event.returnValue = false;\r\n                }else if(event.which){\r\n                    keyCode = event.which, event.preventDefault();\r\n                }\r\n\r\n                return keyCode == 13;\r\n            }\r\n            \r\n            var zoomIn = document.createElement('img');\r\n            zoomIn.className='jqvsiv_toolbarButton';\r\n            zoomIn.title='Zoom in';\r\n            zoomIn.tabIndex=\"1\";\r\n            zoomIn.src = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABN0lEQVRIic3WMW6DMBQGYN+EqhGJJYZMvUMHpByAKceIKpYuGUqmLjFESIm6pQORgpSJwNYoYsiQsSfB9utSUBKZYgcs1dI/4s+8Z2NQf54MMUnzAUk5Jil0kd+58v48GSJM0ryriQXJUZcrF70J0rh6wCSF/wVYfgaWn+kBRusjUMaBMg72at89MN6eoBxOGIPpRXqBhxdfCmkFyCC1wGh9hPH2VOXt67sCprsDOGFcxV4maoDlZ0AZB9lRUAZ4ttEL9NxAWK7aEtmr/VUZprtDbYme3z9re/Jnk00vqh50wljYZFEukcZdVCIqwCUitU1NL1IGSkT6HNjLBArKoKDsquZNUfuazjbQcwPpydWBm8ZrAVSRu69MGcSYBLzVpd+EGO7ijNr+togQYxJww12cH18/nn4Aw1rF5Pti/U4AAAAASUVORK5CYII=\";//toolbarImages+'/in.png';\r\n            zoomIn.onclick = zoomIn.onkeypress = function(event) {\r\n                event=event?event:window.event;\r\n                if (event.type == 'keypress') \r\n                    if(!isEnterKey(event))\r\n                        return;\r\n                var frameDimension = self.getFrameDimension();\r\n                self.zoomTo(self.getZoomLevel()+1, frameDimension[0]/2,frameDimension[1]/2);\r\n            }\r\n            \r\n            var zoomOut = document.createElement('img');\r\n            zoomOut.className='jqvsiv_toolbarButton';\r\n            zoomOut.title='Zoom out';\r\n            zoomOut.tabIndex=\"1\";\r\n            zoomOut.src = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAA3klEQVRIiWNQm7FPX2PmgbPqMw/805h54D81MNSss2oz9ukzaMw8cJZaBmPBZxmo6XJsPmGgoev/a8w88H/UglELaGiB/+rT/xO3XCQK+68+TZoF2rMO/v/z999/YsHvP3//a/Rtoq0FyrWz/6v2biQ+iHwWHfgfPW8rUdhj8pr/CtWz/itUz8KwBG8kq/ZsgGskBSNbQjAVUWoJUcmUEkuIzgfkWkJSRiPHEpJzMqmWkFVUkGIJ2VUmMZbIV87+R1GlT8gS+do5VxkobbZgs0S+cvY/+do5V5WalpgCAJUZolx/yaTFAAAAAElFTkSuQmCC\";//toolbarImages+'/out.png';\r\n            zoomOut.onclick = zoomOut.onkeypress = function(event) {\r\n                event=event?event:window.event;\r\n                if (event.type == 'keypress') \r\n                    if(!isEnterKey(event))\r\n                        return;\r\n                \r\n                var frameDimension = self.getFrameDimension();\r\n                self.zoomTo(self.getZoomLevel()-1, frameDimension[0]/2,frameDimension[1]/2);\r\n            }\r\n            \r\n            var center = document.createElement('img');\r\n            center.className='jqvsiv_toolbarButton';\r\n            center.title='Center image';\r\n            center.tabIndex=\"1\";\r\n            center.src = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABmklEQVRIic3WvWrCUBQH8LyJomiCQwO+Q7u0bl0FX0MsqCA6CEIXa+LXJqhQQUEc2pBqEWkJlXQrzSA6VKEfLkUo5t+hNURNNNEUeuGMOb+bc8/hXsKd4WiK4QWS4WWK4WFF/OYS3BmOJiiGF6xKrBECYeXOtf6E+MPdg2J4/H+AzrURaPStBU4q9/AWOqBzbXSGr5jLMvzVrnVAU5rg4eUD3dEbAODmaQgynIcrVd8f8LA8prMvLNbt8whkOA97iIU9xK4hpoHTSwHqJQzG8ESLCrCKmAaSPUlJ/v45Q0OUcHheXQLUiGkgci0i3urBl67BcZZdS7yKbAU87E9Zkj0JEe4R1AUHZ6y0MbE6dIHjyh2a0mTpQOOtHpyxkilEF/AWOuiPp0sH6kvXYA+xphBdgM61lT5fHKi65kYRTWAxoYs+FwZjNERp7WMjiCYQaPQxl2VlQj3RIo40WtEIolsif7W7NKGbYhOysU1dqbrhdtRDts7BvoihK3NXxBbMyoYv/V0QR6IsEmaeLUYRWzArOxJlkUxfHXwDNFegvBR/iaAAAAAASUVORK5CYII=\";//toolbarImages+'/center.png';\r\n            center.onclick = center.onkeypress = function(event) {\r\n                event=event?event:window.event;\r\n                if (event.type == 'keypress') \r\n                    if(!isEnterKey(event))\r\n                        return;\r\n                self.reset();\r\n            }\r\n            //self.rotate = function(direction)\r\n            if(rotateToolbar){\r\n                var rotateRight = document.createElement('img');\r\n                rotateRight.className='jqvsiv_toolbarButton';\r\n                rotateRight.title='Center image';\r\n                rotateRight.tabIndex=\"1\";\r\n                rotateRight.src = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAB1ElEQVRIieXWwUvbYBjH8fwndRW7CoID3Wn3nYSdxIviQQa7bHdp62GIXvTiEBpTqUyZssKglk4UtJlawUmKshUtgtV6kMEs2m2lmpjvLrbM2TdrY3Yy8FwS+H3e503e943kCa60emVVeyirpldWcaKuszRPcKVV8sqq5lRwldIkJ0derRPpP44er6xyj4BXS2mKuoGcOuLR5KqzwJO3G6znTjEB48rk16XOSDLjDPBi4Quiq2k0ejegL75TCTvOFzCBC8Pg8PScrlCM2a1deiMb9oGD/E8A3iRSdIfjZL+f44+u4fYr9E4tVHCPRSdC4FlkC4CzYonGgEKDb+JGuf0KZ8USAB3jH4TTJQReLn0FYDN7ciu8XJvZEwCezyzS4JuoigiBnvltAHL5ghDI5QsAPB2LVO79jQiBFuUTPy50ALrD8VvhPeGPAJR0gwf+m8/+RCxf8nByH66//YFYkvbhadqGphmIJbkyTQB80bWq3ZURS6BZVpn6nBGug/daRjh9ZeTfKzmYoG9OZXnviOKlTkk3SOW+0anMW4aXq7a9KJigcfBdTYH2gDsg9W3XNpD6j8w6EFe/Yto79GtEXIFQWrL922KBuPoV0xUIpd2vZx7/Bh7Ty4bjzETnAAAAAElFTkSuQmCC\";\r\n                rotateRight.onclick = rotateRight.onkeypress = function(event) {\r\n                    event=event?event:window.event;\r\n                    if (event.type == 'keypress') \r\n                        if(!isEnterKey(event))\r\n                            return;\r\n                    \r\n                    //var frameDimension = self.getFrameDimension();\r\n                    self.rotate(\"1\");\r\n                }\r\n                var rotateLeft = document.createElement('img');\r\n                rotateLeft.className='jqvsiv_toolbarButton';\r\n                rotateLeft.title='Center image';\r\n                rotateLeft.tabIndex=\"1\";\r\n                rotateLeft.src = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACQklEQVRIie3W3U9SYRwH8POfcEDj0Mtcq7XVP9BVra2tyy5aba1/wQOI2dxq3rQSeQ4qIdiLthZtNcSXc0wj8zgQCSEqmHOYLwnMCBU559uFwxREXoK7nu13+/38nme/59lDMcaRJjXhvYxJkDREQC2KMQmSmvBexjjSRKkJ761VcH6pCe+latn5YTuh6hWeq/9AbYBbb+cwubi+ubG9s5PYykhDkVVcfzP7b8BxIuDSgAjiXQAABJZ+Sh3DIh7xHoRX4llJlmFyzy9UDVwZFAEAsY10+pkYRKO+G+fv9+NMex9UWjN63X7IMnB74H2gKuCO04/cevc5Aprl8NLzBR3DImiWg0prxtfVBJyBKBru2T9WDOgmwsup7Qx6Pvhx4UF/AUCzHCxuP+K/N0GzXFGkKHCKjKcbW3vDuTCa5fB0Oojp6A+cbbeBZjn0TQX2AJrl0NBmK0COnCLGOBpX6syLuYATrRY8nwnhKnFA3dKDWOIXnIEo9jeRj5QcU+axK3bTNpRSac17Icf03XgxE0JWknHx4eABYBf5e1wlgRuvxVhWkhBaXgc34YN1KoDIWhKZrAStY7IgPB8p66Jds7jmHL5v+L6WxFIyhaH5KC53vioavh8pC2CIICvb7J9KBR5WZb9FjGlcUhmsYt2AXWQsSxusnroBGiJAY+IzSoN1tmyAIYJcKcJ0jW0pW574S4UrWCJRDBF8Fe+CCGC6+LRCbwkeCTRzQepkp+t01d8W02hKqTv4nOQ6VzRzQdVd+7k/U9So5+j1RlYAAAAASUVORK5CYII=\";\r\n                rotateLeft.onclick = rotateLeft.onkeypress = function(event) {\r\n                    event=event?event:window.event;\r\n                    if (event.type == 'keypress') \r\n                        if(!isEnterKey(event))\r\n                            return;\r\n                    \r\n                    //var frameDimension = self.getFrameDimension();\r\n                    self.rotate(\"-1\");\r\n                }\r\n            }\r\n            toolbar.appendChild(zoomIn);\r\n            toolbar.appendChild(zoomOut);\r\n            if(rotateToolbar){\r\n                toolbar.appendChild(rotateRight);\r\n                toolbar.appendChild(rotateLeft);\r\n            }\r\n            toolbar.appendChild(center);\r\n            \r\n            self.frameElement.appendChild(toolbar);\r\n        }\r\n    }\r\n    function getObjectXY(object) {\r\n        var left,top;\r\n        objectCopy=object;\r\n        if (object.offsetParent) {\r\n            left=top=0;\r\n            do {\r\n                left += object.offsetLeft;\r\n                if(object.style.borderLeftWidth!='')\r\n                    left+=parseInt(object.style.borderLeftWidth);\r\n                else\r\n                    object.style.borderLeftWidth='0px';\r\n                top += object.offsetTop;\r\n                if(object.style.borderTopWidth!='')\r\n                    top+=parseInt(object.style.borderTopWidth);\r\n                else\r\n                    object.style.borderTopWidth='0px';\r\n            }\r\n            while (object = object.offsetParent);\r\n        }\r\n        return [left-parseInt(objectCopy.style.borderLeftWidth),top-parseInt(objectCopy.style.borderLeftWidth)];\r\n    }\r\n    \r\n    function retInt(str, suffix) {\r\n        if(typeof str=='number')\r\n            return str;\r\n        var result=str.indexOf(suffix);\r\n        return parseInt(str.substring(0,(result!=-1)?result:str.length))\r\n    }\r\n    \r\n    /*Mouse related functions*/\r\n    //Used to retrieve the mouse cursor position on screen (but event is needed as argument)\r\n    function getMouseXY(event) {\r\n        var posx = 0, posy = 0;\r\n        if (!event) event = window.event;\t//firefox\r\n        if (event.pageX || event.pageY) {\r\n            posx = event.pageX;\r\n            posy = event.pageY;\r\n        }\r\n        else if (event.clientX || event.clientY) {\t//IE\r\n            posx = event.clientX + document.body.scrollLeft\r\n                + document.documentElement.scrollLeft;\r\n            posy = event.clientY + document.body.scrollTop\r\n                + document.documentElement.scrollTop;\r\n        }\r\n        return [posx,posy];\r\n    }\r\n    \r\n    function mouseWheel() {\r\n        var self=this;\r\n        /*Event handlers*/\r\n        /*Mouse wheel functions*/\r\n    \r\n        //Default mouse wheel callback function\r\n        //Variable local to 'this'\r\n        var wheelCallback = function(event,object,delta){\r\n            /*Override this function and write your code there*/\r\n            /*\r\n                delta=-1 when mouse wheel is rolled backwards (towards yourself)\r\n                delta=1 when mouse wheel is rolled forward (away from one's self)\r\n                Note: Here is where you can call the getMouseXY function using the 'event' argument\r\n            */\r\n        }\r\n        //Mouse wheel event handler\r\n        self.wheelHandler = function (event){\r\n            var delta = 0;\r\n            if (!event) //For IE\r\n                event = window.event;\r\n            if (event.wheelDelta) \t//IE\r\n            {\r\n                delta = event.wheelDelta/120;\r\n                //if (window.opera) delta = -delta; //for Opera...hmm I read somewhere opera 9 need the delta sign inverted...tried in opera 10 and it doesnt require this!?\r\n            }\r\n            else if (event.detail) //firefox\r\n                delta = -event.detail/3;\r\n    \r\n            if (event.preventDefault)\r\n                event.preventDefault();\r\n            event.returnValue = false;\r\n            if (delta)\r\n                wheelCallback(event,this,delta);\t//callback function\r\n        }\r\n        //Mouse wheel initialization\r\n        self.init = function(object,callback) {\r\n            if (object.addEventListener) //For firefox\r\n                object.addEventListener('DOMMouseScroll', this.wheelHandler, false); //Mouse wheel initialization\r\n            //For IE\r\n            object.onmousewheel = this.wheelHandler; //Mouse wheel initialization\r\n            wheelCallback=callback;\r\n        }\r\n        this.setCallback = function(callback){\r\n            wheelCallback=callback;\r\n        }\r\n    }\r\n}(jQuery));\r\n"
  },
  {
    "path": "pages/index.html",
    "content": ""
  },
  {
    "path": "pages/lang.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>OfficeJs | Docs</title>\n    <meta charset=\"utf-8\" />\n    <link\n      href=\"../layout/styles/layout.css\"\n      rel=\"stylesheet\"\n      type=\"text/css\"\n      media=\"all\"\n    />\n    <link\n      rel=\"stylesheet\"\n      href=\"//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css\"\n    />\n    <script src=\"//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js\"></script>\n    <script>\n      hljs.initHighlightingOnLoad();\n    </script>\n    <style>\n      .p_heads_1 {\n        font-size: 18px;\n        color: rgb(4, 0, 255);\n      }\n      .p_heads_2 {\n        font-size: 16px;\n        color: rgb(63, 60, 253);\n      }\n      .p_heads_3 {\n        font-size: 14px;\n        color: rgb(98, 95, 255);\n      }\n    </style>\n  </head>\n  <body id=\"top\">\n    <div class=\"wrapper row1\">\n      <header id=\"header\" class=\"hoc clear\">\n        <div id=\"logo\" class=\"fl_left\">\n          <h1><a href=\"../index.html\">Office To Html - Docs</a></h1>\n        </div>\n        <nav id=\"mainav\" class=\"fl_right\">\n          <ul class=\"clear\">\n            <li><a href=\"../index.html\">Home</a></li>\n            <li class=\"active\"><a href=\"docs.html\">Docs</a></li>\n            <li><a href=\"demos.html\">Demos</a></li>\n            <li>\n              <a href=\"https://github.com/meshesha/officeToHtml\">GitHub</a>\n            </li>\n            <li><a href=\"https://github.com/meshesha\">About</a></li>\n          </ul>\n        </nav>\n      </header>\n    </div>\n    <div class=\"wrapper row3\">\n      <main class=\"hoc container clear\">\n        <!-- main body -->\n        <!-- ################################################################################################ -->\n        <!-- using html encode (https://codebeautify.org/html-encode-string) -->\n        <div class=\"content three_quarter\">\n          <div class=\"box bg-light clear\">\n            <h3 class=\"font-x2\" id=\"head-name\">PDF Viewer supported languages</h3>\n            <div id=\"description\">\n              <style type=\"text/css\">\n                /*the tables genereted by web-site: https://www.tablesgenerator.com/html_tables */\n                .tg {\n                  border-collapse: collapse;\n                  border-spacing: 0;\n                }\n                .tg td {\n                  font-family: Arial, sans-serif;\n                  font-size: 14px;\n                  padding: 10px 5px;\n                  border-style: solid;\n                  border-width: 1px;\n                  overflow: hidden;\n                  word-break: normal;\n                  border-color: black;\n                }\n                .tg th {\n                  font-family: Arial, sans-serif;\n                  font-size: 14px;\n                  font-weight: normal;\n                  padding: 10px 5px;\n                  border-style: solid;\n                  border-width: 1px;\n                  overflow: hidden;\n                  word-break: normal;\n                  border-color: black;\n                }\n                .tg .tg-jc4p {\n                  font-size: 16px;\n                  background-color: #00009b;\n                  color: #ffffff;\n                  vertical-align: top;\n                }\n                .tg .tg-yw4l {\n                  vertical-align: top;\n                }\n              </style>\n              <table class=\"tg\">\n                <tr>\n                  <th class=\"tg-jc4p\">#</th>\n                  <th class=\"tg-jc4p\">lang code</th>\n                  <th class=\"tg-jc4p\">lang name</th>\n                </tr>\n                <tr>\n                  <td class=\"tg-yw4l\">1</td>\n                  <td class=\"tg-yw4l\">ach</td>\n                  <td class=\"tg-yw4l\">Acoli</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">2</td>\n                   <td class=\"tg-yw4l\">af</td>\n                   <td class=\"tg-yw4l\">Afrikaans</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">3</td>\n                   <td class=\"tg-yw4l\">ak</td>\n                   <td class=\"tg-yw4l\">Afrikaans (South Africa)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">4</td>\n                   <td class=\"tg-yw4l\">an</td>\n                   <td class=\"tg-yw4l\">Afrikaans (South Africa)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">5</td>\n                   <td class=\"tg-yw4l\">ar</td>\n                   <td class=\"tg-yw4l\">Arabic</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">6</td>\n                   <td class=\"tg-yw4l\">as</td>\n                   <td class=\"tg-yw4l\">Arabic (Yemen)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">7</td>\n                   <td class=\"tg-yw4l\">ast</td>\n                   <td class=\"tg-yw4l\">Arabic (Yemen)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">8</td>\n                   <td class=\"tg-yw4l\">az</td>\n                   <td class=\"tg-yw4l\">Azeri (Latin)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">9</td>\n                   <td class=\"tg-yw4l\">be</td>\n                   <td class=\"tg-yw4l\">Belarusian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">10</td>\n                   <td class=\"tg-yw4l\">bg</td>\n                   <td class=\"tg-yw4l\">Bulgarian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">11</td>\n                   <td class=\"tg-yw4l\">bn-BD</td>\n                   <td class=\"tg-yw4l\">Bulgarian (Bulgaria)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">12</td>\n                   <td class=\"tg-yw4l\">bn-IN</td>\n                   <td class=\"tg-yw4l\">Bulgarian (Bulgaria)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">13</td>\n                   <td class=\"tg-yw4l\">br</td>\n                   <td class=\"tg-yw4l\">Bulgarian (Bulgaria)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">14</td>\n                   <td class=\"tg-yw4l\">bs</td>\n                   <td class=\"tg-yw4l\">Bulgarian (Bulgaria)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">15</td>\n                   <td class=\"tg-yw4l\">ca</td>\n                   <td class=\"tg-yw4l\">Catalan</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">16</td>\n                   <td class=\"tg-yw4l\">cs</td>\n                   <td class=\"tg-yw4l\">Czech</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">17</td>\n                   <td class=\"tg-yw4l\">csb</td>\n                   <td class=\"tg-yw4l\">Czech</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">18</td>\n                   <td class=\"tg-yw4l\">cy</td>\n                   <td class=\"tg-yw4l\">Welsh</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">19</td>\n                   <td class=\"tg-yw4l\">da</td>\n                   <td class=\"tg-yw4l\">Danish</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">20</td>\n                   <td class=\"tg-yw4l\">de</td>\n                   <td class=\"tg-yw4l\">German</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">21</td>\n                   <td class=\"tg-yw4l\">el</td>\n                   <td class=\"tg-yw4l\">Greek</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">22</td>\n                   <td class=\"tg-yw4l\">en-GB</td>\n                   <td class=\"tg-yw4l\">English (United Kingdom)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">23</td>\n                   <td class=\"tg-yw4l\">en-US</td>\n                   <td class=\"tg-yw4l\">English (United States)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">24</td>\n                   <td class=\"tg-yw4l\">en-ZA</td>\n                   <td class=\"tg-yw4l\">English (South Africa)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">25</td>\n                   <td class=\"tg-yw4l\">eo</td>\n                   <td class=\"tg-yw4l\">Esperanto</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">26</td>\n                   <td class=\"tg-yw4l\">es-AR</td>\n                   <td class=\"tg-yw4l\">Spanish (Argentina)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">27</td>\n                   <td class=\"tg-yw4l\">es-CL</td>\n                   <td class=\"tg-yw4l\">Spanish (Chile)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">28</td>\n                   <td class=\"tg-yw4l\">es-ES</td>\n                   <td class=\"tg-yw4l\">Spanish (Spain)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">29</td>\n                   <td class=\"tg-yw4l\">es-MX</td>\n                   <td class=\"tg-yw4l\">Spanish (Mexico)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">30</td>\n                   <td class=\"tg-yw4l\">et</td>\n                   <td class=\"tg-yw4l\">Estonian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">31</td>\n                   <td class=\"tg-yw4l\">eu</td>\n                   <td class=\"tg-yw4l\">Basque</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">32</td>\n                   <td class=\"tg-yw4l\">fa</td>\n                   <td class=\"tg-yw4l\">Farsi</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">33</td>\n                   <td class=\"tg-yw4l\">ff</td>\n                   <td class=\"tg-yw4l\">Farsi (Iran)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">34</td>\n                   <td class=\"tg-yw4l\">fi</td>\n                   <td class=\"tg-yw4l\">Finnish</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">35</td>\n                   <td class=\"tg-yw4l\">fr</td>\n                   <td class=\"tg-yw4l\">French</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">36</td>\n                   <td class=\"tg-yw4l\">fy-NL</td>\n                   <td class=\"tg-yw4l\">French (Principality of Monaco)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">37</td>\n                   <td class=\"tg-yw4l\">ga-IE</td>\n                   <td class=\"tg-yw4l\">French (Principality of Monaco)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">38</td>\n                   <td class=\"tg-yw4l\">gd</td>\n                   <td class=\"tg-yw4l\">French (Principality of Monaco)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">39</td>\n                   <td class=\"tg-yw4l\">gl</td>\n                   <td class=\"tg-yw4l\">Galician</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">40</td>\n                   <td class=\"tg-yw4l\">gu-IN</td>\n                   <td class=\"tg-yw4l\">Gujarati (India)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">41</td>\n                   <td class=\"tg-yw4l\">he</td>\n                   <td class=\"tg-yw4l\">Hebrew</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">42</td>\n                   <td class=\"tg-yw4l\">hi-IN</td>\n                   <td class=\"tg-yw4l\">Hindi (India)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">43</td>\n                   <td class=\"tg-yw4l\">hr</td>\n                   <td class=\"tg-yw4l\">Croatian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">44</td>\n                   <td class=\"tg-yw4l\">hu</td>\n                   <td class=\"tg-yw4l\">Hungarian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">45</td>\n                   <td class=\"tg-yw4l\">hy-AM</td>\n                   <td class=\"tg-yw4l\">Armenian (Armenia)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">46</td>\n                   <td class=\"tg-yw4l\">id</td>\n                   <td class=\"tg-yw4l\">Indonesian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">47</td>\n                   <td class=\"tg-yw4l\">is</td>\n                   <td class=\"tg-yw4l\">Icelandic</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">48</td>\n                   <td class=\"tg-yw4l\">it</td>\n                   <td class=\"tg-yw4l\">Italian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">49</td>\n                   <td class=\"tg-yw4l\">ja</td>\n                   <td class=\"tg-yw4l\">Japanese</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">50</td>\n                   <td class=\"tg-yw4l\">ka</td>\n                   <td class=\"tg-yw4l\">Georgian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">51</td>\n                   <td class=\"tg-yw4l\">kk</td>\n                   <td class=\"tg-yw4l\">Kazakh</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">52</td>\n                   <td class=\"tg-yw4l\">km</td>\n                   <td class=\"tg-yw4l\">Kazakh (Kazakhstan)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">53</td>\n                   <td class=\"tg-yw4l\">kn</td>\n                   <td class=\"tg-yw4l\">Kannada</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">54</td>\n                   <td class=\"tg-yw4l\">ko</td>\n                   <td class=\"tg-yw4l\">Korean</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">55</td>\n                   <td class=\"tg-yw4l\">ku</td>\n                   <td class=\"tg-yw4l\">Konkani (India)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">56</td>\n                   <td class=\"tg-yw4l\">lg</td>\n                   <td class=\"tg-yw4l\">Kyrgyz (Kyrgyzstan)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">57</td>\n                   <td class=\"tg-yw4l\">lij</td>\n                   <td class=\"tg-yw4l\">Kyrgyz (Kyrgyzstan)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">58</td>\n                   <td class=\"tg-yw4l\">lt</td>\n                   <td class=\"tg-yw4l\">Lithuanian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">59</td>\n                   <td class=\"tg-yw4l\">lv</td>\n                   <td class=\"tg-yw4l\">Latvian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">60</td>\n                   <td class=\"tg-yw4l\">mai</td>\n                   <td class=\"tg-yw4l\">Latvian (Latvia)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">61</td>\n                   <td class=\"tg-yw4l\">mk</td>\n                   <td class=\"tg-yw4l\">FYRO Macedonian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">62</td>\n                   <td class=\"tg-yw4l\">ml</td>\n                   <td class=\"tg-yw4l\">FYRO Macedonian (Former Yugoslav Republic of Macedonia)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">63</td>\n                   <td class=\"tg-yw4l\">mn</td>\n                   <td class=\"tg-yw4l\">Mongolian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">64</td>\n                   <td class=\"tg-yw4l\">mr</td>\n                   <td class=\"tg-yw4l\">Marathi</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">65</td>\n                   <td class=\"tg-yw4l\">ms</td>\n                   <td class=\"tg-yw4l\">Malay</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">66</td>\n                   <td class=\"tg-yw4l\">my</td>\n                   <td class=\"tg-yw4l\">Maltese (Malta)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">67</td>\n                   <td class=\"tg-yw4l\">nb-NO</td>\n                   <td class=\"tg-yw4l\">Norwegian (Bokm?l) (Norway)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">68</td>\n                   <td class=\"tg-yw4l\">nl</td>\n                   <td class=\"tg-yw4l\">Dutch</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">69</td>\n                   <td class=\"tg-yw4l\">nn-NO</td>\n                   <td class=\"tg-yw4l\">Norwegian (Nynorsk) (Norway)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">70</td>\n                   <td class=\"tg-yw4l\">nso</td>\n                   <td class=\"tg-yw4l\">Northern Sotho</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">71</td>\n                   <td class=\"tg-yw4l\">oc</td>\n                   <td class=\"tg-yw4l\">Northern Sotho (South Africa)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">72</td>\n                   <td class=\"tg-yw4l\">or</td>\n                   <td class=\"tg-yw4l\">Northern Sotho (South Africa)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">73</td>\n                   <td class=\"tg-yw4l\">pa-IN</td>\n                   <td class=\"tg-yw4l\">Punjabi (India)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">74</td>\n                   <td class=\"tg-yw4l\">pl</td>\n                   <td class=\"tg-yw4l\">Polish</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">75</td>\n                   <td class=\"tg-yw4l\">pt-BR</td>\n                   <td class=\"tg-yw4l\">Portuguese (Brazil)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">76</td>\n                   <td class=\"tg-yw4l\">pt-PT</td>\n                   <td class=\"tg-yw4l\">Portuguese (Portugal)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">77</td>\n                   <td class=\"tg-yw4l\">rm</td>\n                   <td class=\"tg-yw4l\">Quechua (Peru)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">78</td>\n                   <td class=\"tg-yw4l\">ro</td>\n                   <td class=\"tg-yw4l\">Romanian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">79</td>\n                   <td class=\"tg-yw4l\">ru</td>\n                   <td class=\"tg-yw4l\">Russian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">80</td>\n                   <td class=\"tg-yw4l\">rw</td>\n                   <td class=\"tg-yw4l\">Russian (Russia)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">81</td>\n                   <td class=\"tg-yw4l\">sah</td>\n                   <td class=\"tg-yw4l\">Sanskrit</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">82</td>\n                   <td class=\"tg-yw4l\">si</td>\n                   <td class=\"tg-yw4l\">Sami (Southern) (Sweden)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">83</td>\n                   <td class=\"tg-yw4l\">sk</td>\n                   <td class=\"tg-yw4l\">Slovak</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">84</td>\n                   <td class=\"tg-yw4l\">sl</td>\n                   <td class=\"tg-yw4l\">Slovenian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">85</td>\n                   <td class=\"tg-yw4l\">son</td>\n                   <td class=\"tg-yw4l\">Slovenian (Slovenia)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">86</td>\n                   <td class=\"tg-yw4l\">sq</td>\n                   <td class=\"tg-yw4l\">Albanian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">87</td>\n                   <td class=\"tg-yw4l\">sr</td>\n                   <td class=\"tg-yw4l\">Albanian (Albania)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">88</td>\n                   <td class=\"tg-yw4l\">sv-SE</td>\n                   <td class=\"tg-yw4l\">Swedish (Sweden)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">89</td>\n                   <td class=\"tg-yw4l\">sw</td>\n                   <td class=\"tg-yw4l\">Swahili</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">90</td>\n                   <td class=\"tg-yw4l\">ta</td>\n                   <td class=\"tg-yw4l\">Tamil</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">91</td>\n                   <td class=\"tg-yw4l\">ta-LK</td>\n                   <td class=\"tg-yw4l\">Tamil (India)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">92</td>\n                   <td class=\"tg-yw4l\">te</td>\n                   <td class=\"tg-yw4l\">Telugu</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">93</td>\n                   <td class=\"tg-yw4l\">th</td>\n                   <td class=\"tg-yw4l\">Thai</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">94</td>\n                   <td class=\"tg-yw4l\">tl</td>\n                   <td class=\"tg-yw4l\">Tagalog</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">95</td>\n                   <td class=\"tg-yw4l\">tn</td>\n                   <td class=\"tg-yw4l\">Tswana</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">96</td>\n                   <td class=\"tg-yw4l\">tr</td>\n                   <td class=\"tg-yw4l\">Turkish</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">97</td>\n                   <td class=\"tg-yw4l\">uk</td>\n                   <td class=\"tg-yw4l\">Ukrainian</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">98</td>\n                   <td class=\"tg-yw4l\">ur</td>\n                   <td class=\"tg-yw4l\">Urdu</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">99</td>\n                   <td class=\"tg-yw4l\">vi</td>\n                   <td class=\"tg-yw4l\">Vietnamese</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">100</td>\n                   <td class=\"tg-yw4l\">wo</td>\n                   <td class=\"tg-yw4l\">Vietnamese (Viet Nam)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">101</td>\n                   <td class=\"tg-yw4l\">xh</td>\n                   <td class=\"tg-yw4l\">Xhosa</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">102</td>\n                   <td class=\"tg-yw4l\">zh-CN</td>\n                   <td class=\"tg-yw4l\">Chinese (S)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">103</td>\n                   <td class=\"tg-yw4l\">zh-TW</td>\n                   <td class=\"tg-yw4l\">Chinese (T)</td>\n                </tr>\n                <tr>\n                   <td class=\"tg-yw4l\">104</td>\n                   <td class=\"tg-yw4l\">zu</td>\n                   <td class=\"tg-yw4l\">Zulu</td>\n                </tr>\n              </table>\n            </div>\n          </div>\n        </div>\n        <!-- / main body -->\n        <div class=\"clear\"></div>\n      </main>\n    </div>\n\n    <div class=\"wrapper row5\">\n      <div id=\"copyright\" class=\"hoc clear\">\n        <p class=\"fl_left\">\n          Copyright &copy; 2017 - All Rights Reserved -\n          <a href=\"https://github.com/meshesha/\">Tady Meshesha</a>\n        </p>\n        <p class=\"fl_right\">\n          Template by\n          <a\n            target=\"_blank\"\n            href=\"http://www.os-templates.com/\"\n            title=\"Free Website Templates\"\n            >OS Templates</a\n          >\n        </p>\n      </div>\n    </div>\n    <a id=\"backtotop\" href=\"#top\"><i class=\"fa fa-chevron-up\"></i></a>\n  </body>\n</html>\n"
  },
  {
    "path": "pages/layout/index.html",
    "content": ""
  },
  {
    "path": "pages/layout/scripts/index.html",
    "content": ""
  },
  {
    "path": "pages/layout/scripts/jquery.backtotop.js",
    "content": "/*\nTemplate Name: Epigosha\nAuthor: <a href=\"http://www.os-templates.com/\">OS Templates</a>\nAuthor URI: http://www.os-templates.com/\nLicence: Free to use under our free template licence terms\nLicence URI: http://www.os-templates.com/template-terms\nFile: Back to Top JS\n*/\n\njQuery(\"#backtotop\").click(function () {\n    jQuery(\"body,html\").animate({\n        scrollTop: 0\n    }, 600);\n});\njQuery(window).scroll(function () {\n    if (jQuery(window).scrollTop() > 150) {\n        jQuery(\"#backtotop\").addClass(\"visible\");\n    } else {\n        jQuery(\"#backtotop\").removeClass(\"visible\");\n    }\n});"
  },
  {
    "path": "pages/layout/scripts/jquery.mobilemenu.js",
    "content": "/*\nTemplate Name: Epigosha\nAuthor: <a href=\"http://www.os-templates.com/\">OS Templates</a>\nAuthor URI: http://www.os-templates.com/\nLicence: Free to use under our free template licence terms\nLicence URI: http://www.os-templates.com/template-terms\nFile: Mobile Menu JS\n\nThanks to:\n\"Convert a Menu to a Dropdown for Small Screens\" from Chris Collier - http://css-tricks.com/convert-menu-to-dropdown/\n\"Submenu's with a dash\" Daryn St. Pierre - http://jsfiddle.net/bloqhead/Kq43X/\n*/\n\n$('<form action=\"#\"><select /></form>').appendTo(\"#mainav\");$(\"<option />\",{selected:\"selected\",value:\"\",text:\"MENU\"}).appendTo(\"#mainav select\");$(\"#mainav a\").each(function(){var e=$(this);if($(e).parents(\"ul ul ul\").length>=1){$(\"<option />\",{value:e.attr(\"href\"),text:\"- - - \"+e.text()}).appendTo(\"#mainav select\")}else if($(e).parents(\"ul ul\").length>=1){$(\"<option />\",{value:e.attr(\"href\"),text:\"- - \"+e.text()}).appendTo(\"#mainav select\")}else if($(e).parents(\"ul\").length>=1){$(\"<option />\",{value:e.attr(\"href\"),text:\"\"+e.text()}).appendTo(\"#mainav select\")}else{$(\"<option />\",{value:e.attr(\"href\"),text:e.text()}).appendTo(\"#mainav select\")}});$(\"#mainav select\").change(function(){if($(this).find(\"option:selected\").val()!==\"#\"){window.location=$(this).find(\"option:selected\").val()}})"
  },
  {
    "path": "pages/layout/styles/fonts/index.html",
    "content": ""
  },
  {
    "path": "pages/layout/styles/framework.css",
    "content": "@charset \"utf-8\";\n/*\nTemplate Name: Epigosha\nAuthor: <a href=\"http://www.os-templates.com/\">OS Templates</a>\nAuthor URI: http://www.os-templates.com/\nLicence: Free to use under our free template licence terms\nLicence URI: http://www.os-templates.com/template-terms\nFile: Framework CSS\n*/\n\nhtml{overflow-y:scroll; overflow-x:hidden;} /* overflow-x:hidden; is required to prevent a horizontal scrollbar when using the split box elements */\nhtml, body{margin:0; padding:0; font-size:14px; line-height:1.6em;}\n\n*, *::before, *::after{box-sizing:border-box;}\n\n.bold{font-weight:bold;}\n.center{text-align:center;}\n.right{text-align:right;}\n.uppercase{text-transform:uppercase;}\n.capitalise{text-transform:capitalize;}\n.hidden{display:none;}\n.nospace{margin:0; padding:0; list-style:none;}\n.block{display:block;}\n.inline *{display:inline-block;}\n.inline *:last-child{margin-right:0;}\n.pushright li{margin-right:20px;}\n.pushright li:last-child{margin-right:0;}\n.borderedbox{border:1px solid;}\n.overlay{position:relative; z-index:1;}\n.overlay::after{display:block; position:absolute; top:0; left:0; width:100%; height:100%; content:\"\"; z-index:-1;}\n.bgded{background-position:top center; background-repeat:no-repeat; background-size:cover;}\n.circle{border-radius:50%; background-clip:padding-box;}\n\n.btn{display:inline-block; padding:15px 25px 17px; text-transform:uppercase; border:1px solid;}\n.btn.medium{padding:10px 20px 12px;}\n.btn.small{padding:8px 18px 10px; text-transform:none;}\n\n.split{background-position:top right; background-repeat:no-repeat; background-size:cover;}\n.split .box{display:block; position:relative; float:right; width:65%; padding:80px 0 80px 50px;}\n.split .box::after{display:block; position:absolute; top:0; right:-1000%; bottom:0; left:100%; content:\"\";}\n.split .box.left{float:left; padding-right:50px; padding-left:0;}\n.split .box.left::after{left:-1000%; right:100%;}\n\n.clear, .group{display:block;}\n.clear::before, .clear::after, .group::before, .group::after{display:table; content:\"\";}\n.clear, .clear::after, .group, .group::after{clear:both;}\n\na{outline:none; text-decoration:none;}\n\n.fl_left, .imgl{float:left;}\n.fl_right, .imgr{float:right;}\n\n.imgl{margin:0 15px 10px 0; clear:left;}\n.imgr{margin:0 0 10px 15px; clear:right;}\n\n\n/* Fonts\n--------------------------------------------------------------------------------------------------------------- */\nbody, input, textarea, select{font-family:Verdana, Geneva, sans-serif;}\nh1, h2, h3, h4, h5, h6, .heading{font-family:Georgia, \"Times New Roman\", Times, serif;}\n\n\n/* Forms\n--------------------------------------------------------------------------------------------------------------- */\nform, fieldset, legend{margin:0; padding:0; border:none;}\nlegend{display:none;}\nlabel, input, textarea, select, button{display:block; resize:none; outline:none; color:inherit; font-size:inherit; font-family:inherit; vertical-align:middle;}\nlabel{margin-bottom:5px;}\n:required, :invalid{outline:none; box-shadow:none;}\n\n\n/* Generalise\n--------------------------------------------------------------------------------------------------------------- */\nh1, h2, h3, h4, h5, h6, .heading{margin:0 0 20px 0; font-size:22px; line-height:normal; font-weight:normal; text-transform:capitalize; font-variant:small-caps;}\n\naddress{font-style:normal; font-weight:normal;}\nhr{display:block; width:100%; height:1px; border:solid; border-width:1px 0 0 0;}\n\n.font-xs{font-size:.8rem;}\n.font-x1{font-size:1.2rem;}\n.font-x2{font-size:1.8rem; line-height:normal;}\n.font-x3{font-size:2.8rem; line-height:normal;}\n\n.wrapper{display:block; width:100%; margin:0; padding:0; text-align:left; word-wrap:break-word;}\n/*\nThe \"hoc\" class is a generic class used to centre a containing element horizontally\nIt should be used in conjunction with a second class or ID\n*/\n.hoc{display:block; margin:0 auto;}\n\n\n/* HTML 5 Overrides\n--------------------------------------------------------------------------------------------------------------- */\naddress, article, aside, figcaption, figure, footer, header, main, nav, section{display:block; margin:0; padding:0;}\n\n\n/* Grid\n--------------------------------------------------------------------------------------------------------------- */\n.one_half, .one_third, .two_third, .one_quarter, .two_quarter, .three_quarter{display:inline-block; float:left; margin:0 0 0 3.06748466257669%; list-style:none;}\n\n.first{margin-left:0; clear:left;}\n\n.one_quarter{width:22.69938650306748%;}\n.one_third{width:31.28834355828221%;}\n.one_half, .two_quarter{width:48.46625766871166%;}\n.two_third{width:65.6441717791411%;}\n.three_quarter{width:74.23312883435584%;}\n\n\n/* Spacing\n--------------------------------------------------------------------------------------------------------------- */\n.btmspace-10{margin-bottom:10px;}\n.btmspace-15{margin-bottom:15px;}\n.btmspace-30{margin-bottom:30px;}\n.btmspace-50{margin-bottom:50px;}\n.btmspace-80{margin-bottom:80px;}\n\n.inspace-5{padding:5px;}\n.inspace-10{padding:10px;}\n.inspace-15{padding:15px;}\n.inspace-30{padding:30px;}\n.inspace-50{padding:50px;}\n.inspace-80{padding:80px;}"
  },
  {
    "path": "pages/layout/styles/index.html",
    "content": ""
  },
  {
    "path": "pages/layout/styles/layout.css",
    "content": "@charset \"utf-8\";\n/*\nTemplate Name: Epigosha\nAuthor: <a href=\"http://www.os-templates.com/\">OS Templates</a>\nAuthor URI: http://www.os-templates.com/\nLicence: Free to use under our free template licence terms\nLicence URI: http://www.os-templates.com/template-terms\nFile: Layout CSS\n*/\n\n@import url(\"fontawesome-4.5.0.min.css\");\n@import url(\"framework.css\");\n\n/* Rows\n--------------------------------------------------------------------------------------------------------------- */\n.row1{border-bottom:1px solid;}\n.row2, .row2 a{}\n.row3, .row3 a{}\n.row4, .row4 a{}\n.row5{border-top:1px solid;}\n\n\n/* Page Intro\n--------------------------------------------------------------------------------------------------------------- */\n#pageintro .box{padding-top:150px; padding-bottom:150px;}\n\n#pageintro article{}\n#pageintro article .heading{margin-bottom:30px; font-size:36px;}\n#pageintro article p{font-size:16px;}\n#pageintro article footer{margin-top:50px;}\n\n\n/* Header\n--------------------------------------------------------------------------------------------------------------- */\n#header{}\n\n#header #logo{margin:29px 0 0 0;}\n#header #logo h1{margin:0; padding:0; font-size:22px; line-height:1; text-transform:uppercase;}\n\n\n/* Content Area\n--------------------------------------------------------------------------------------------------------------- */\n.container{padding:80px 0;}\n\n/* Content */\n.container .content{}\n\n#stats{text-align:center;}\n#stats li *{margin:0; padding:0;}\n#stats li:last-child{margin-bottom:0;}/* Used in mobile devices when elements stack */\n#stats li i{margin-bottom:30px;}\n#stats li p:first-of-type{margin-bottom:30px; font-size:32px; font-weight:700;}\n#stats li p:last-of-type{text-transform:uppercase;}\n\n.latest{}\n.latest figure{display:inline-block; position:relative; max-width:100%; margin-bottom:30px;}\n.latest figure figcaption{display:block; position:absolute; top:10px; left:10px; width:60px; height:auto; padding:8px 0; border:1px solid; text-align:center;}\n.latest figure figcaption *{display:block; margin:0; padding:0;}\n.latest figure figcaption strong{margin-bottom:-5px;}\n.latest .heading, .latest p{margin:0; padding:0;}\n.latest .heading{margin-bottom:10px;}\n.latest p:last-of-type{margin:20px 0 0 0;}\n\n/* Comments */\n#comments ul{margin:0 0 40px 0; padding:0; list-style:none;}\n#comments li{margin:0 0 10px 0; padding:15px;}\n#comments .avatar{float:right; margin:0 0 10px 10px; padding:3px; border:1px solid;}\n#comments address{font-weight:bold;}\n#comments time{font-size:smaller;}\n#comments .comcont{display:block; margin:0; padding:0;}\n#comments .comcont p{margin:10px 5px 10px 0; padding:0;}\n\n#comments form{display:block; width:100%;}\n#comments input, #comments textarea{width:100%; padding:10px; border:1px solid;}\n#comments textarea{overflow:auto;}\n#comments div{margin-bottom:15px;}\n#comments input[type=\"submit\"], #comments input[type=\"reset\"]{display:inline-block; width:auto; min-width:150px; margin:0; padding:8px 5px; cursor:pointer;}\n\n/* Sidebar */\n.container .sidebar{}\n\n.sidebar .sdb_holder{margin-bottom:50px;}\n.sidebar .sdb_holder:last-child{margin-bottom:0;}\n\n\n/* Elements\n--------------------------------------------------------------------------------------------------------------- */\n#elements{}\n\n#elements article{display:block; position:relative; min-height:80px; margin:0 0 30px 0; padding:0 0 0 40px;}\n#elements article:last-child{margin:0;}\n#elements article *{margin:0;}\n#elements article i{display:block; position:absolute; top:0; left:0; font-size:24px;}\n#elements article .heading{margin-bottom:10px; font-size:1.2rem;}\n#elements article p{margin-bottom:10px;}\n\n\n/* CTA - Click To Action\n--------------------------------------------------------------------------------------------------------------- */\n#cta{text-align:center;}\n\n#cta *{margin:0;}\n#cta .heading{margin-bottom:50px;}\n\n\n/* Footer\n--------------------------------------------------------------------------------------------------------------- */\n#footer{padding:80px 0 50px;}\n\n#footer .title{margin:0 0 50px 0; padding:0; font-size:1.2rem;}\n\n#footer .linklist li{display:block; margin-bottom:15px; padding:0 0 15px 0; border-bottom:1px solid;}\n#footer .linklist li:last-child{margin:0; padding:0; border:none;}\n#footer .linklist li::before, #footer .linklist li::after{display:table; content:\"\";}\n#footer .linklist li, #footer .linklist li::after{clear:both;}\n\n#footer .contact{}\n#footer .contact.linklist li, #footer .contact.linklist li:last-child{position:relative; padding-left:40px;}\n#footer .contact li *{margin:0; padding:0; line-height:1.6;}\n#footer .contact li i{display:block; position:absolute; top:0; left:0; width:30px; font-size:16px; text-align:center;}\n\n\n/* Copyright\n--------------------------------------------------------------------------------------------------------------- */\n#copyright{padding:30px 0;}\n#copyright *{margin:0; padding:0;}\n\n\n/* Transition Fade\n--------------------------------------------------------------------------------------------------------------- \n*, *::before, *::after{transition:all .3s ease-in-out;}\n#mainav form *{transition:none !important;}\n*/\n\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n\n\n/* Navigation\n--------------------------------------------------------------------------------------------------------------- */\nnav ul, nav ol{margin:0; padding:0; list-style:none;}\n\n#mainav, #breadcrumb, .sidebar nav{line-height:normal;}\n#mainav .drop::after, #mainav li li .drop::after, #breadcrumb li a::after, .sidebar nav a::after{position:absolute; font-family:\"FontAwesome\"; font-size:10px; line-height:10px;}\n\n/* Top Navigation */\n#mainav{}\n#mainav ul.clear{}\n#mainav ul{text-transform:uppercase;}\n#mainav ul ul{z-index:9999; position:absolute; width:180px; text-transform:none;}\n#mainav ul ul ul{left:180px; top:0;}\n#mainav li{display:inline-block; position:relative; margin:0 15px 0 0; padding:0;}\n#mainav li:last-child{margin-right:0;}\n#mainav li li{width:100%; margin:0;}\n#mainav li a{display:block; padding:30px 0;}\n#mainav li li a{border:solid; border-width:0 0 1px 0;}\n#mainav .drop{padding-left:15px;}\n#mainav li li a, #mainav li li .drop{display:block; margin:0; padding:10px 15px;}\n#mainav .drop::after, #mainav li li .drop::after{content:\"\\f0d7\";}\n#mainav .drop::after{top:35px; left:5px;}\n#mainav li li .drop::after{top:15px; left:5px;}\n#mainav ul ul{visibility:hidden; opacity:0;}\n#mainav ul li:hover > ul{visibility:visible; opacity:1;}\n\n#mainav form{display:none; margin:0; padding:0;}\n#mainav form select, #mainav form select option{display:block; cursor:pointer; outline:none;}\n#mainav form select{width:100%; padding:5px; border:none;}\n#mainav form select option{margin:5px; padding:0; border:none;}\n\n/* Breadcrumb */\n#breadcrumb{padding:50px 0 20px;}\n#breadcrumb ul{margin:0; padding:0; list-style:none; font-variant:small-caps;}\n#breadcrumb li{display:inline-block; margin:0 6px 0 0; padding:0;}\n#breadcrumb li a{display:block; position:relative; margin:0; padding:0 12px 0 0; font-size:12px;}\n#breadcrumb li a::after{top:3px; right:0; content:\"\\f101\";}\n#breadcrumb li:last-child a{margin:0; padding:0;}\n#breadcrumb li:last-child a::after{display:none;}\n\n/* Sidebar Navigation */\n.sidebar nav{display:block; width:100%;}\n.sidebar nav li{margin:0 0 3px 0; padding:0;}\n.sidebar nav a{display:block; position:relative; margin:0; padding:5px 10px 5px 15px; text-decoration:none; border:solid; border-width:0 0 1px 0;}\n.sidebar nav a::after{top:9px; left:5px; content:\"\\f101\";}\n.sidebar nav ul ul a{padding-left:35px;}\n.sidebar nav ul ul a::after{left:25px;}\n.sidebar nav ul ul ul a{padding-left:55px;}\n.sidebar nav ul ul ul a::after{left:45px;}\n\n/* Pagination */\n.pagination{display:block; width:100%; text-align:center; clear:both;}\n.pagination li{display:inline-block; margin:0 2px 0 0;}\n.pagination li:last-child{margin-right:0;}\n.pagination a, .pagination strong{display:block; padding:8px 11px; border:1px solid; background-clip:padding-box; font-weight:normal;}\n\n/* Back to Top */\n#backtotop{z-index:999; display:inline-block; position:fixed; visibility:hidden; bottom:20px; right:20px; width:36px; height:36px; line-height:36px; font-size:16px; text-align:center; opacity:.2;}\n#backtotop i{display:block; width:100%; height:100%; line-height:inherit;}\n#backtotop.visible{visibility:visible; opacity:.5;}\n#backtotop:hover{opacity:1;}\n\n\n/* Tables\n--------------------------------------------------------------------------------------------------------------- */\ntable, th, td{border:1px solid; border-collapse:collapse; vertical-align:top;}\ntable, th{table-layout:auto;}\ntable{width:100%; margin-bottom:15px;}\nth, td{padding:5px 8px;}\ntd{border-width:0 1px;}\n\n\n/* Gallery\n--------------------------------------------------------------------------------------------------------------- */\n#gallery{display:block; width:100%; margin-bottom:50px;}\n#gallery figure figcaption{display:block; width:100%; clear:both;}\n#gallery li{margin-bottom:30px;}\n\n\n/* Font Awesome Social Icons\n--------------------------------------------------------------------------------------------------------------- */\n.faico{margin:0; padding:0; list-style:none;}\n.faico li{display:inline-block; margin:8px 5px 0 0; padding:0; line-height:normal;}\n.faico li:last-child{margin-right:0;}\n.faico a{display:inline-block; width:36px; height:36px; line-height:36px; font-size:18px; text-align:center;}\n\n.faico a{color:#050505; background-color:#0F84AA;}\n.faico a:hover{color:#FFFFFF;}\n\n.faicon-dribble:hover{background-color:#EA4C89;}\n.faicon-facebook:hover{background-color:#3B5998;}\n.faicon-google-plus:hover{background-color:#DB4A39;}\n.faicon-linkedin:hover{background-color:#0E76A8;}\n.faicon-twitter:hover{background-color:#00ACEE;}\n.faicon-vk:hover{background-color:#4E658E;}\n\n\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n\n\n/* Colours\n--------------------------------------------------------------------------------------------------------------- */\nbody{color:#FFFFFF; background-color:#232323;}\na{color:#0F84AA;}\na:active, a:focus{background:transparent;}/* IE10 + 11 Bugfix - prevents grey background */\nhr, .borderedbox{border-color:#D7D7D7;}\nlabel span{color:#FF0000; background-color:inherit;}\ninput:focus, textarea:focus, *:required:focus{border-color:#0F84AA;}\n.overlay{color:#FFFFFF; background-color:inherit;}\n.overlay::after{color:inherit; background-color:rgba(0,0,0,.55);}\n\n.btn, .btn.inverse:hover{color:#FFFFFF; background-color:#0F84AA; border-color:#0F84AA;}\n.btn:hover, .btn.inverse{color:inherit; background-color:transparent; border-color:inherit;}\n\n.split .box, .split .box::after{color:#9B9B9B; background-color:rgba(35,35,35,.8);/* #232323 */}\n.split .box.bg-light, .split .box.bg-light::after{color:#232323; background-color:rgba(250,250,250,.85);/* #FAFAFA */}\n.split .box.bg-coloured, .split .box.bg-coloured::after{color:#FFFFFF; background-color:rgba(15,132,170,.65);/* #0F84AA */}\n\n\n/* Rows */\n.row1{color:#232323; background-color:#FAFAFA; border-color:#EBEBEB;}\n.row2{color:#232323; background-color:#EBEBEB;}\n.row3{color:#232323; background-color:#FFFFFF;}\n.row4{color:#9B9B9B; background-color:#232323;}\n.row5, .row5 a{color:#9B9B9B; background-color:#232323;}\n.row5{border-color:#404040;}\n\n\n/* Header */\n#header #logo a{color:inherit;}\n\n\n/* Content Area */\n.latest figure figcaption{color:#FFFFFF; background-color:rgba(0,0,0,.2); border-color:#FFFFFF;}\n\n\n/* Footer */\n#footer .title{color:#FFFFFF;}\n#footer .linklist li{border-color:#404040;}\n\n\n/* Navigation */\n#mainav li a{color:inherit;}\n#mainav .active a, #mainav a:hover, #mainav li:hover > a{color:#0F84AA; background-color:inherit;}\n#mainav li li a, #mainav .active li a{color:#FFFFFF; background-color:rgba(0,0,0,.6); border-color:rgba(0,0,0,.6);}\n#mainav li li:hover > a, #mainav .active .active > a{color:#FFFFFF; background-color:#0F84AA;}\n#mainav form select{color:#232323; background-color:#EBEBEB;}\n\n#breadcrumb a{color:inherit; background-color:inherit;}\n#breadcrumb li:last-child a{color:#0F84AA;}\n\n.container .sidebar nav a{color:inherit; border-color:#D7D7D7;}\n.container .sidebar nav a:hover{color:#0F84AA;}\n.container .sidebar .active a, .container .sidebar a:hover, .container .sidebar li:hover > a{color:#0F84AA; background-color:inherit;}\n\n.pagination a, .pagination strong{border-color:#D7D7D7;}\n.pagination .current *{color:#FFFFFF; background-color:#0F84AA;}\n\n#backtotop{color:#FFFFFF; background-color:#0F84AA;}\n\n\n/* Tables + Comments */\ntable, th, td, #comments .avatar, #comments input, #comments textarea{border-color:#D7D7D7;}\n#comments input:focus, #comments textarea:focus, #comments *:required:focus{border-color:#0F84AA;}\nth{color:#FFFFFF; background-color:#373737;}\ntr, #comments li, #comments input[type=\"submit\"], #comments input[type=\"reset\"]{color:inherit; background-color:#FBFBFB;}\ntr:nth-child(even), #comments li:nth-child(even){color:inherit; background-color:#F7F7F7;}\ntable a, #comments a{background-color:inherit;}\n\n\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n/* ------------------------------------------------------------------------------------------------------------ */\n\n\n/* Media Queries\n--------------------------------------------------------------------------------------------------------------- */\n@-ms-viewport{width:device-width;}\n\n\n/* Max Wrapper Width - Laptop, Desktop etc.\n--------------------------------------------------------------------------------------------------------------- */\n@media screen and (min-width:978px){\n\t.hoc{max-width:978px;}\n}\n\n\n/* Mobile Devices\n--------------------------------------------------------------------------------------------------------------- */\n@media screen and (max-width:900px){\n\t.hoc{max-width:90%;}\n\n\t#header{padding:30px 0;}\n\t#header #logo{margin:7px 0 0 0;}\n\n\t#mainav{}\n\t#mainav ul{display:none;}\n\t#mainav form{display:block;}\n\n\t#breadcrumb{}\n\n\t.container{}\n\t#comments input[type=\"reset\"]{margin-top:10px;}\n\t.pagination li{display:inline-block; margin:0 5px 5px 0;}\n\n\t#footer{}\n\n\t#copyright{}\n\t#copyright p:first-of-type{margin-bottom:10px;}\n}\n\n\n@media screen and (max-width:750px){\n\t.imgl, .imgr{display:inline-block; float:none; margin:0 0 10px 0;}\n\t.fl_left, .fl_right{display:block; float:none;}\n\t.one_half, .one_third, .two_third, .one_quarter, .two_quarter, .three_quarter{display:block; float:none; width:auto; margin:0 0 30px 0; padding:0;}\n\n\t#header{text-align:center;}\n\t#header #logo{margin:0 0 15px 0;}\n}\n\n\n/* Other\n--------------------------------------------------------------------------------------------------------------- */\n@media screen and (max-width:650px){\n\t.scrollable{display:block; width:100%; margin:0 0 30px 0; padding:0 0 15px 0; overflow:auto; overflow-x:scroll;}\n\t.scrollable table{margin:0; padding:0; white-space:nowrap;}\n\n\t.inline li{display:block; margin-bottom:10px;}\n\t.pushright li{margin-right:0;}\n\n\t.hoc.split{max-width:none; width:100%;}\n\t.split .box, .split .box.left{float:none; width:100%; padding:5%;}\n\n\t.font-x2{font-size:1.4rem;}\n\t.font-x3{font-size:1.6rem;}\n\n\t#pageintro .box{padding:100px 5%;}\n}"
  },
  {
    "path": "sitemap.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<urlset\r\n      xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\r\n      xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n      xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9\r\n            http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd\">\r\n<!-- created with Free Online Sitemap Generator www.xml-sitemaps.com -->\r\n\r\n\n<url>\n  <loc>https://officetohtml.js.org/index.html</loc>\n  <lastmod>2019-02-03T17:54:31+00:00</lastmod>\n  <priority>1.00</priority>\n</url>\n<url>\n  <loc>https://officetohtml.js.org/pages/docs.html</loc>\n  <lastmod>2019-02-03T17:54:31+00:00</lastmod>\n  <priority>0.80</priority>\n</url>\n<url>\n  <loc>https://officetohtml.js.org/pages/demos.html</loc>\n  <lastmod>2019-02-03T17:54:31+00:00</lastmod>\n  <priority>0.80</priority>\n</url>\n<url>\n  <loc>https://officetohtml.js.org/pages/lang.html</loc>\n  <lastmod>2019-02-03T17:54:31+00:00</lastmod>\n  <priority>0.64</priority>\n</url>\r\n\r\n\r\n</urlset>"
  },
  {
    "path": "sitemaps/ror.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rss version=\"2.0\" xmlns:ror=\"http://rorweb.com/0.1/\" >\n<channel>\n  <title>ROR Sitemap for https://officetohtml.js.org/index.html</title>\n  <link>https://officetohtml.js.org/index.html</link>\n\n<item>\n     <link>https://officetohtml.js.org/index.html</link>\n     <title>OfficeToHtml</title>\n     <description>OfficeToHtml</description>\n     <ror:updatePeriod></ror:updatePeriod>\n     <ror:sortOrder>0</ror:sortOrder>\n     <ror:resourceOf>sitemap</ror:resourceOf>\n</item>\n<item>\n     <link>https://officetohtml.js.org/pages/docs.html</link>\n     <title>OfficeJs | Docs </title>\n     <description>OfficeJs | Docs </description>\n     <ror:updatePeriod></ror:updatePeriod>\n     <ror:sortOrder>1</ror:sortOrder>\n     <ror:resourceOf>sitemap</ror:resourceOf>\n</item>\n<item>\n     <link>https://officetohtml.js.org/pages/demos.html</link>\n     <title>OfficeJs | Demos </title>\n     <description>OfficeJs | Demos </description>\n     <ror:updatePeriod></ror:updatePeriod>\n     <ror:sortOrder>1</ror:sortOrder>\n     <ror:resourceOf>sitemap</ror:resourceOf>\n</item>\n<item>\n     <link>https://officetohtml.js.org/pages/lang.html</link>\n     <title>OfficeJs | Docs</title>\n     <description>OfficeJs | Docs</description>\n     <ror:updatePeriod></ror:updatePeriod>\n     <ror:sortOrder>2</ror:sortOrder>\n     <ror:resourceOf>sitemap</ror:resourceOf>\n</item>\n</channel>\n</rss>\n  "
  },
  {
    "path": "sitemaps/sitemap.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\n<head>\n\t<meta charset=\"utf-8\" />\n\t<title>officetohtml.js.org Site Map - Generated by www.xml-sitemaps.com</title>\n\t<meta content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0\" name=\"viewport\" />\n\t<style type=\"text/css\">\n\tbody {\n\t\tbackground-color: #fff;\n\t\tfont-family: \"Roboto\", \"Helvetica\", \"Arial\", sans-serif;\n\t\tmargin: 0;\n\t}\n\n\t#top {\n\n\t\tbackground-color: #b1d1e8;\n\t\tfont-size: 16px;\n\t\tpadding-bottom: 40px;\n\t}\n\n\tnav {\n\t\tfont-size: 24px;\n\n\t\tmargin: 0px 30px 0px;\n\t\tborder-bottom-left-radius: 6px;\n\t\tborder-bottom-right-radius: 6px;\n\t\tbackground-color: #f3f3f3;\n\t\tcolor: #666;\n\t\tbox-shadow: 0 10px 20px -12px rgba(0, 0, 0, 0.42), 0 3px 20px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2);\n\t\tpadding: 10px 0;\n\t\ttext-align: center;\n\t\tz-index: 1;\n\t}\n\n\th3 {\n\t\tmargin: auto;\n\t\tpadding: 10px;\n\t\tmax-width: 600px;\n\t\tcolor: #666;\n\t}\n\n\th3 span {\n\t\tfloat: right;\n\t}\n\n\th3 a {\n\t\tfont-weight: normal;\n\t\tdisplay: block;\n\t}\n\n\n\t#cont {\n\t\tposition: relative;\n\t\tborder-radius: 6px;\n\t\tbox-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2);\n\n\t\tbackground: #f3f3f3;\n\n\t\tmargin: -20px 30px 0px 30px;\n\t\tpadding: 20px;\n\t}\n\n\ta:link,\n\ta:visited {\n\t\tcolor: #0180AF;\n\t\ttext-decoration: underline;\n\t}\n\n\ta:hover {\n\t\tcolor: #666;\n\t}\n\n\n\t#footer {\n\t\tpadding: 10px;\n\t\ttext-align: center;\n\t}\n\n\tul {\n    \tmargin: 0px;\n\n    \tpadding: 0px;\n    \tlist-style: none;\n\t}\n\tli {\n\t\tmargin: 0px;\n\t}\n\tli ul {\n\t\tmargin-left: 20px;\n\t}\n\n\t.lhead {\n\t\tbackground: #ddd;\n\t\tpadding: 10px;\n    \tmargin: 10px 0px;\n\t}\n\n\t.lcount {\n\t\tpadding: 0px 10px;\n\t}\n\n\t.lpage {\n\t\tborder-bottom: #ddd 1px solid;\n\t\tpadding: 5px;\n\t}\n\t.last-page {\n\t\tborder: none;\n\t}\n\t</style>\n</head>\n\n<body>\n\t<div id=\"top\">\n\t\t<nav>officetohtml.js.org HTML Site Map</nav>\n\t\t<h3>\n<span>Last updated: 2019, February 3<br />\nTotal pages: 4</span>\n<a href=\"https://officetohtml.js.org\">officetohtml.js.org Homepage</a>\n</h3></div>\n\t<div id=\"cont\">\n\t\t<ul class=\"level-0\">\n\n            <li class=\"lhead\">/  <span class=\"lcount\">1 pages</span></li>\n            \n<li class=\"lpage last-page\"><a href=\"https://officetohtml.js.org/index.html\" title=\"OfficeToHtml\">OfficeToHtml</a></li><li><ul class=\"level-1\">\n\n            <li class=\"lhead\">pages/  <span class=\"lcount\">3 pages</span></li>\n            \n<li class=\"lpage\"><a href=\"https://officetohtml.js.org/pages/docs.html\" title=\"OfficeJs | Docs \">OfficeJs | Docs </a></li>\n<li class=\"lpage\"><a href=\"https://officetohtml.js.org/pages/demos.html\" title=\"OfficeJs | Demos \">OfficeJs | Demos </a></li>\n<li class=\"lpage last-page\"><a href=\"https://officetohtml.js.org/pages/lang.html\" title=\"OfficeJs | Docs\">OfficeJs | Docs</a></li>\n</ul></li>\n</ul>\n\t\t<!--\nPlease note:\nYou are not allowed to remove the copyright notice below.\nThank you!\nwww.xml-sitemaps.com\n-->\n\t</div>\n\t<div id=\"footer\">\n\t\tPage created with <a target=\"_blank\" href=\"https://www.xml-sitemaps.com\">Google XML sitemap and html sitemaps generator</a> | Copyright &copy; 2005-2018 XML-Sitemaps.com\n\t</div>\n</body>\n\n</html>"
  },
  {
    "path": "sitemaps/sitemap.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset\n      xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n      xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n      xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9\n            http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd\">\n<!-- created with Free Online Sitemap Generator www.xml-sitemaps.com -->\n\n\n<url>\n  <loc>https://officetohtml.js.org/index.html</loc>\n  <lastmod>2019-02-03T17:54:31+00:00</lastmod>\n  <priority>1.00</priority>\n</url>\n<url>\n  <loc>https://officetohtml.js.org/pages/docs.html</loc>\n  <lastmod>2019-02-03T17:54:31+00:00</lastmod>\n  <priority>0.80</priority>\n</url>\n<url>\n  <loc>https://officetohtml.js.org/pages/demos.html</loc>\n  <lastmod>2019-02-03T17:54:31+00:00</lastmod>\n  <priority>0.80</priority>\n</url>\n<url>\n  <loc>https://officetohtml.js.org/pages/lang.html</loc>\n  <lastmod>2019-02-03T17:54:31+00:00</lastmod>\n  <priority>0.64</priority>\n</url>\n\n\n</urlset>"
  },
  {
    "path": "sitemaps/urllist.txt",
    "content": "https://officetohtml.js.org/index.html\nhttps://officetohtml.js.org/pages/docs.html\nhttps://officetohtml.js.org/pages/demos.html\nhttps://officetohtml.js.org/pages/lang.html\n"
  }
]